commit 885d5e4e58f92de0013dfb4d9149fb00a0559f5d
Author: Weber Ko _O (q) <weber.ko@coretronic.com>
Date:   Wed Sep 28 17:52:06 2022 +0800

    Fixed HDMI color error

diff --git a/kernel/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/kernel/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
old mode 100644
new mode 100755
index 6735680d41..956223f972
--- a/kernel/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
+++ b/kernel/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
@@ -904,10 +904,17 @@ dw_hdmi_rockchip_select_output(struct drm_connector_state *conn_state,
 			else
 				*bus_format = MEDIA_BUS_FMT_RGB101010_1X30;
 		} else {
+			
 			if (*color_format != DRM_HDMI_OUTPUT_DEFAULT_RGB)
-				hdmi->output_bus_format = MEDIA_BUS_FMT_YUV8_1X24;
+			{
+				printk("set MEDIA_BUS_FMT_RGB888_1X24 1\n");
+				hdmi->output_bus_format = MEDIA_BUS_FMT_RGB888_1X24;
+			}
 			else
+			{
+				printk("set MEDIA_BUS_FMT_RGB888_1X24 2\n");
 				hdmi->output_bus_format = MEDIA_BUS_FMT_RGB888_1X24;
+			}
 
 			if (!hdmi->unsupported_yuv_input)
 				*bus_format = hdmi->output_bus_format;

commit 85f4c925ec48f3889c6bc0ce7f9cd15b9f9b210a
Author: Weber Ko _O (q) <weber.ko@coretronic.com>
Date:   Wed Aug 24 17:18:58 2022 +0800

    Fixed read Ethernet MAC Address error

diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
old mode 100644
new mode 100755
index 1e392acd8f..19e4039b21
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -36,8 +36,6 @@
 #include "stmmac_platform.h"
 #include "dwmac-rk-tool.h"
 
-#define MAX_ETH		2
-
 struct rk_priv_data;
 struct rk_gmac_ops {
 	void (*set_to_rgmii)(struct rk_priv_data *bsp_priv,
@@ -2071,42 +2069,36 @@ void rk_get_eth_addr(void *priv, unsigned char *addr)
 {
 	struct rk_priv_data *bsp_priv = priv;
 	struct device *dev = &bsp_priv->pdev->dev;
-	unsigned char ethaddr[ETH_ALEN * MAX_ETH] = {0};
 	int ret, id = bsp_priv->bus_id;
 
 	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);
+	if (id < 0) {
+		printk("%s: Invalid ethernet bus id %d\n", __func__, id);
 		return;
 	}
 
-	ret = rk_vendor_read(LAN_MAC_ID, ethaddr, ETH_ALEN * MAX_ETH);
-	if (ret <= 0 ||
-	    !is_valid_ether_addr(&ethaddr[id * ETH_ALEN])) {
-		dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)\n",
+	ret = rk_vendor_read(LAN_MAC_ID, addr, 6);
+	if (ret != 6 || is_zero_ether_addr(addr)){
+		printk("%s: rk_vendor_read eth mac address failed (%d)\n",
 			__func__, ret);
-		random_ether_addr(&ethaddr[id * ETH_ALEN]);
-		memcpy(addr, &ethaddr[id * ETH_ALEN], ETH_ALEN);
-		dev_err(dev, "%s: generate random eth mac address: %pM\n", __func__, addr);
+		random_ether_addr(addr);
+		printk("%s: generate random eth mac address: %pM\n", __func__, addr);
 
-		ret = rk_vendor_write(LAN_MAC_ID, ethaddr, ETH_ALEN * MAX_ETH);
+		ret = rk_vendor_write(LAN_MAC_ID, addr,6);
 		if (ret != 0)
-			dev_err(dev, "%s: rk_vendor_write eth mac address failed (%d)\n",
+			printk("%s: rk_vendor_write eth mac address failed (%d)\n",
 				__func__, ret);
 
-		ret = rk_vendor_read(LAN_MAC_ID, ethaddr, ETH_ALEN * MAX_ETH);
-		if (ret != ETH_ALEN * MAX_ETH)
-			dev_err(dev, "%s: id: %d rk_vendor_read eth mac address failed (%d)\n",
+		ret = rk_vendor_read(LAN_MAC_ID, addr,6);
+		if (ret != 6)
+			printk("%s: id: %d rk_vendor_read eth mac address failed (%d)\n",
 				__func__, id, ret);
-	} else {
-		memcpy(addr, &ethaddr[id * ETH_ALEN], ETH_ALEN);
-	}
-
+	} 
 out:
-	dev_err(dev, "%s: mac address: %pM\n", __func__, addr);
+	printk("%s: mac address: %pM\n", __func__, addr);
 }
 
 static int rk_gmac_probe(struct platform_device *pdev)
@@ -2115,21 +2107,27 @@ static int rk_gmac_probe(struct platform_device *pdev)
 	struct stmmac_resources stmmac_res;
 	const struct rk_gmac_ops *data;
 	int ret;
+	
+	printk("%s:%d\n", __func__,__LINE__);
 
 	data = of_device_get_match_data(&pdev->dev);
 	if (!data) {
 		dev_err(&pdev->dev, "no of match data provided\n");
 		return -EINVAL;
 	}
+	printk("%s:%d\n", __func__,__LINE__);
 
 	ret = stmmac_get_platform_resources(pdev, &stmmac_res);
 	if (ret)
 		return ret;
 
+	printk("%s:%d\n", __func__,__LINE__);
 	plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
 	if (IS_ERR(plat_dat))
 		return PTR_ERR(plat_dat);
 
+	printk("%s:%d\n", __func__,__LINE__);
+	
 	if (!of_device_is_compatible(pdev->dev.of_node, "snps,dwmac-4.20a"))
 		plat_dat->has_gmac = true;
 
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
old mode 100644
new mode 100755
index 7ff658739c..ba29807175
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -2156,16 +2156,17 @@ static int stmmac_get_hw_features(struct stmmac_priv *priv)
  */
 static void stmmac_check_ether_addr(struct stmmac_priv *priv)
 {
-	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,
-				priv->dev->dev_addr);
-		if (!is_valid_ether_addr(priv->dev->dev_addr))
-			eth_hw_addr_random(priv->dev);
-		dev_info(priv->device, "device MAC address %pM\n",
-			 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,
+			priv->dev->dev_addr);
+	}
+	if (!is_valid_ether_addr(priv->dev->dev_addr))
+	{
+		eth_hw_addr_random(priv->dev);
 	}
+
 }
 
 /**
@@ -2610,6 +2611,8 @@ static int stmmac_open(struct net_device *dev)
 	u32 chan;
 	int ret;
 
+	stmmac_check_ether_addr(priv);
+	
 	if (priv->hw->pcs != STMMAC_PCS_RGMII &&
 	    priv->hw->pcs != STMMAC_PCS_TBI &&
 	    priv->hw->pcs != STMMAC_PCS_RTBI) {
@@ -4345,8 +4348,7 @@ int stmmac_dvr_probe(struct device *device,
 	ret = stmmac_hw_init(priv);
 	if (ret)
 		goto error_hw_init;
-
-	stmmac_check_ether_addr(priv);
+	
 
 	/* Configure real RX and TX queues */
 	netif_set_real_num_rx_queues(ndev, priv->plat->rx_queues_to_use);

commit acc64ea89c28d5ca7266a2319cc26ad4e56530d4
Author: Weber Ko _O (q) <weber.ko@coretronic.com>
Date:   Fri Aug 19 16:53:05 2022 +0800

    Modified default DDR freq

diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3328-coretronic.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3328-coretronic.dtsi
index 2bf1420cb8..6feef70a47 100755
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3328-coretronic.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3328-coretronic.dtsi
@@ -182,10 +182,10 @@
 		SYS_STATUS_REBOOT       786000
 		SYS_STATUS_SUSPEND      786000
 		SYS_STATUS_VIDEO_1080P  786000
-		SYS_STATUS_VIDEO_4K     786000
-		SYS_STATUS_VIDEO_4K_10B 786000
-		SYS_STATUS_PERFORMANCE  786000
-		SYS_STATUS_BOOST        786000
+		SYS_STATUS_VIDEO_4K     933000
+		SYS_STATUS_VIDEO_4K_10B 933000
+		SYS_STATUS_PERFORMANCE  933000
+		SYS_STATUS_BOOST        933000
 	>;
 };
 
@@ -199,7 +199,7 @@
 	};
 
 	opp-933000000 {
-		status = "disabled";
+		status = "okay";
 	};
 
 	opp-1066000000 {

commit b990e87fa3cb882ea012ce092c3c79a257210055
Author: Weber Ko _O (q) <weber.ko@coretronic.com>
Date:   Wed Jun 15 17:25:25 2022 +0800

    Add U3 power off cmd

diff --git a/kernel/drivers/phy/rockchip/phy-rockchip-inno-usb3.c b/kernel/drivers/phy/rockchip/phy-rockchip-inno-usb3.c
old mode 100644
new mode 100755
index dec985df17..c54679b7f6
--- a/kernel/drivers/phy/rockchip/phy-rockchip-inno-usb3.c
+++ b/kernel/drivers/phy/rockchip/phy-rockchip-inno-usb3.c
@@ -279,7 +279,10 @@ static ssize_t rockchip_u3phy_usb2_only_write(struct file *file,
 		atomic_notifier_call_chain(&u3phy->usb_phy.notifier, 0, NULL);
 
 		rockchip_set_vbus_power(u3phy, true);
-	} else {
+	} else if (!strncmp(buf, "off", 3) ) {
+		printk("set u3 vbus power off\n");
+		rockchip_set_vbus_power(u3phy, false);
+	}else {
 		dev_info(u3phy->dev, "Same or illegal mode\n");
 	}
 

commit fa6165b61e5678cdbcbf62d7e0e7b1a9d2dc0d4b
Author: Weber Ko _O (q) <weber.ko@coretronic.com>
Date:   Wed Jun 15 11:50:13 2022 +0800

    Set default USB OTG Port to HOST

diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3328-coretronic.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3328-coretronic.dtsi
index c2b154b9d1..2bf1420cb8 100755
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3328-coretronic.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3328-coretronic.dtsi
@@ -635,6 +635,7 @@
 
 &usb20_otg {
 	status = "okay";
+	dr_mode = "host";
 };
 
 &usb_host0_ehci {
diff --git a/kernel/drivers/usb/gadget/function/f_fs.c b/kernel/drivers/usb/gadget/function/f_fs.c
index 6d1d1239fc..5eed54ad1e 100755
--- a/kernel/drivers/usb/gadget/function/f_fs.c
+++ b/kernel/drivers/usb/gadget/function/f_fs.c
@@ -351,7 +351,7 @@ static ssize_t ffs_ep0_write(struct file *file, const char __user *buf,
 
 		/* Handle data */
 		if (ffs->state == FFS_READ_DESCRIPTORS) {
-			pr_info("read descriptors\n");
+			//pr_info("read descriptors\n");
 			ret = __ffs_data_got_descs(ffs, data, len);
 			if (unlikely(ret < 0))
 				break;
@@ -359,7 +359,7 @@ static ssize_t ffs_ep0_write(struct file *file, const char __user *buf,
 			ffs->state = FFS_READ_STRINGS;
 			ret = len;
 		} else {
-			pr_info("read strings\n");
+			//pr_info("read strings\n");
 			ret = __ffs_data_got_strings(ffs, data, len);
 			if (unlikely(ret < 0))
 				break;

commit a8c55f49d04a800983b9e303627a7def6113e8ed
Author: Weber Ko _O (q) <weber.ko@coretronic.com>
Date:   Thu Jun 2 16:04:43 2022 +0800

    1.Fixed Miracast latency issue
    2.Set Serial port to UART1
    3.Fixed some focus issue
    4.Change default Wi-Fi hotspot to 5GHz

diff --git a/kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c b/kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c
old mode 100644
new mode 100755
index 4392f5708e..63f66cbfa8
--- a/kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c
+++ b/kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c
@@ -73,6 +73,7 @@ struct rkxx_remotectl_drvdata {
 	int wakeup;
 	int support_psci;
 	int pwm_pwrkey_capture;
+	int remote_ctrl_id;
 	unsigned long period;
 	unsigned long temp_period;
 	int pwm_freq_nstime;
@@ -92,10 +93,17 @@ static int remotectl_keybd_num_lookup(struct rkxx_remotectl_drvdata *ddata)
 
 	num = ddata->maxkeybdnum;
 	for (i = 0; i < num; i++) {
-		if (remotectl_button[i].usercode == (ddata->scandata&0xFFFF)) {
+		if(remotectl_button[i].usercode == ddata->scandata&0xFFFF ) 
+		{
 			ddata->keynum = i;
 			return 1;
 		}
+		if(ddata->scandata == ddata->remote_ctrl_id ) 
+		{
+			ddata->keynum = i;
+			return 1;
+		}
+
 	}
 	return 0;
 }
@@ -570,6 +578,31 @@ static inline void rk_pwm_wakeup(struct input_dev *input)
 	input_sync(input);
 }
 
+static ssize_t remote_id_show(struct device *dev,
+		struct device_attribute *attr, char *buf)
+{
+	struct platform_device *pdev = to_platform_device(dev);
+	struct rkxx_remotectl_drvdata *ddata = platform_get_drvdata(pdev);
+	return sprintf(buf, "%d\n", ddata->remote_ctrl_id);
+}
+
+static ssize_t remote_id_store(struct device *dev, struct device_attribute *attr, const char *buf,size_t count)
+{
+	int remote_id=0,remote_ctl_id=0;
+	sscanf(buf, "%d", &remote_id);	
+	struct platform_device *pdev = to_platform_device(dev);
+	struct rkxx_remotectl_drvdata *ddata = platform_get_drvdata(pdev);
+	if(remote_id>0)
+	{
+		remote_ctl_id=remote_id+0x0f;
+	}
+	ddata->remote_ctrl_id = (remote_ctl_id<<8);
+	return count;
+}
+
+DEVICE_ATTR(remotectl_id_mode,0664,remote_id_show,remote_id_store);
+
+
 static int rk_pwm_probe(struct platform_device *pdev)
 {
 	struct rkxx_remotectl_drvdata *ddata;
@@ -714,6 +747,12 @@ static int rk_pwm_probe(struct platform_device *pdev)
 		goto error_irq;
 	}
 
+	ret = device_create_file(&pdev->dev, &dev_attr_remotectl_id_mode);
+	if (ret) {
+		dev_err(&pdev->dev, "failed to create sysfs attributes\n");
+		goto error_irq;
+	}	
+
 	pwm_freq = clk_get_rate(clk) / 64;
 	ddata->pwm_freq_nstime = 1000000000 / pwm_freq;
 	rk_pwm_remotectl_hw_init(ddata->base, pwm_id);

commit 0db0559147fcd514583a281a98132262cd6f1f6f
Author: Weber Ko _O (q) <weber.ko@coretronic.com>
Date:   Fri May 27 16:01:40 2022 +0800

    Add support 1920x1200 resoultion

diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3328-android.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3328-android.dtsi
index 83b9577b77..3cd4a4dfbf 100755
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3328-android.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3328-android.dtsi
@@ -65,7 +65,7 @@
 	secure-memory-region = <&secure_memory>;
 	route {
 		route_hdmi: route-hdmi {
-			status = "okay";
+			status = "disabled";
 			logo,uboot = "logo.bmp";
 			logo,kernel = "logo_kernel.bmp";
 			logo,mode = "fullscreen";
@@ -73,7 +73,7 @@
 			connect = <&vop_out_hdmi>;
 		};
 		route_tve: route-tve {
-			status = "okay";
+			status = "disabled";
 			logo,uboot = "logo.bmp";
 			logo,kernel = "logo_kernel.bmp";
 			logo,mode = "fullscreen";
diff --git a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
old mode 100644
new mode 100755
index 1d9e97452e..350d853cde
--- a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -202,6 +202,11 @@ static const u16 csc_coeff_full_to_limited[3][4] = {
 };
 
 static const struct drm_display_mode dw_hdmi_default_modes[] = {
+	/* 127 - 1920x1200@60Hz*/	   
+	{ DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 154000, 1920, 1968,
+		   2000, 2080, 0, 1200, 1203, 1209, 1235, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC),
+	  .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },	  
 	/* 4 - 1280x720@60Hz 16:9 */
 	{ DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
 		   1430, 1650, 0, 720, 725, 730, 750, 0,
diff --git a/kernel/drivers/gpu/drm/drm_edid.c b/kernel/drivers/gpu/drm/drm_edid.c
old mode 100644
new mode 100755
index e64955533b..9df7650f24
--- a/kernel/drivers/gpu/drm/drm_edid.c
+++ b/kernel/drivers/gpu/drm/drm_edid.c
@@ -1383,16 +1383,16 @@ static const struct drm_display_mode edid_cea_modes_0[] = {
 		   6304, 6600, 0, 2160, 2168, 2178, 2250, 0,
 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
 	  .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-	/* 126 - 5120x2160@60Hz 64:27 */
-	{ DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 742500, 5120, 5284,
-		   5372, 5500, 0, 2160, 2168, 2178, 2250, 0,
-		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-	  .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
-	/* 127 - 5120x2160@100Hz 64:27 */
-	{ DRM_MODE("5120x2160", DRM_MODE_TYPE_DRIVER, 1485000, 5120, 6216,
-		   6304, 6600, 0, 2160, 2168, 2178, 2250, 0,
-		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
-	  .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
+	/* 126 - 1280x800p@60Hz*/
+	{ DRM_MODE("1280x800", DRM_MODE_TYPE_DRIVER, 83500, 1280, 1352,
+		   1480, 1680, 0, 800, 803, 809, 831, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC),
+	   .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },	 
+	/* 127 - 1920x1200@60Hz*/	   
+	{ DRM_MODE("1920x1200", DRM_MODE_TYPE_DRIVER, 154000, 1920, 1968,
+		   2000, 2080, 0, 1200, 1203, 1209, 1235, 0,
+		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC),
+	  .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },	   	  
 };
 
 /*
diff --git a/kernel/drivers/phy/rockchip/phy-rockchip-inno-hdmi-phy.c b/kernel/drivers/phy/rockchip/phy-rockchip-inno-hdmi-phy.c
old mode 100644
new mode 100755
index 4bbdc15d12..06c47e34e6
--- a/kernel/drivers/phy/rockchip/phy-rockchip-inno-hdmi-phy.c
+++ b/kernel/drivers/phy/rockchip/phy-rockchip-inno-hdmi-phy.c
@@ -266,6 +266,7 @@ static const struct pre_pll_config pre_pll_cfg_table[] = {
 	{148500000, 148500000, 1,  99, 1, 1, 1,  1, 2, 2,  2, 0, 0},
 	{148352000, 185440000, 4, 494, 0, 2, 2,  1, 3, 2,  2, 0, 0x816817},
 	{148500000, 185625000, 4, 495, 0, 2, 2,  1, 3, 2,  2, 0, 0},
+	{154000000, 154000000, 1, 128, 3, 0, 0,  1, 3, 2,  2, 0, 0x5592405},
 	{162000000, 162000000, 1, 108, 0, 2, 2,  1, 0, 0,  4, 0, 0},
 	{162000000, 202500000, 1, 135, 0, 2, 2,  1, 0, 0,  5, 0, 0},
 	{296703000, 296703000, 1,  98, 0, 1, 1,  1, 0, 2,  2, 0, 0xE6AE6B},
diff --git a/kernel/out/kernel b/kernel/out/kernel
index 47265a11eb..c657dfb5ea 100644
Binary files a/kernel/out/kernel and b/kernel/out/kernel differ
diff --git a/kernel/out/second b/kernel/out/second
index 75d6fefcaf..8f709daa45 100644
Binary files a/kernel/out/second and b/kernel/out/second differ
diff --git a/kernel/out/unpack.log b/kernel/out/unpack.log
index f16b80ca55..eea233e5f6 100644
--- a/kernel/out/unpack.log
+++ b/kernel/out/unpack.log
@@ -1,5 +1,5 @@
 boot_magic: ANDROID!
-kernel_size: 31748104
+kernel_size: 31750152
 kernel load address: 0x10008000
 ramdisk size: 837959
 ramdisk load address: 0x11000000

commit 3226b57a146ce9deaf763e3b2c9c3b2da64213ec
Author: Weber Ko _O (q) <weber.ko@coretronic.com>
Date:   Tue May 24 18:22:37 2022 +0800

    Fixed BT cant not work

diff --git a/kernel/drivers/bluetooth/rtk_btusb.c b/kernel/drivers/bluetooth/rtk_btusb.c
old mode 100644
new mode 100755
index 5db1884160..991b2829c9
--- a/kernel/drivers/bluetooth/rtk_btusb.c
+++ b/kernel/drivers/bluetooth/rtk_btusb.c
@@ -39,16 +39,16 @@
 
 #include "rtk_btusb.h"
 
-#define RTKBT_RELEASE_NAME "20180702_BT_ANDROID_8.1"
-#define VERSION "4.1.5"
+#define RTKBT_RELEASE_NAME "20201130_BT_ANDROID_11.0"
+#define VERSION "5.2.1"
 
 #define SUSPNED_DW_FW 0
 #define SET_WAKEUP_DEVICE 0
 
 
 static spinlock_t queue_lock;
-static spinlock_t dlfw_lock;
-static volatile uint16_t    dlfw_dis_state = 0;
+static spinlock_t running_flag_lock;
+static volatile uint16_t    driver_state = 0;
 
 #if SUSPNED_DW_FW
 static firmware_info *fw_info_4_suspend = NULL;
@@ -94,6 +94,9 @@ static patch_info fw_patch_table[] = {
 { 0x0BDA, 0xB761, 0x8761, 0, 0, "mp_rtl8761a_fw", "rtl8761au_fw", "rtl8761a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8761AUV only */
 { 0x0BDA, 0x8761, 0x8761, 0, 0, "mp_rtl8761a_fw", "rtl8761au8192ee_fw", "rtl8761a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8761AU + 8192EE for LI */
 { 0x0BDA, 0x8A60, 0x8761, 0, 0, "mp_rtl8761a_fw", "rtl8761au8812ae_fw", "rtl8761a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8761AU + 8812AE */
+{ 0x0BDA, 0x8771, 0x8761, 0, 0, "mp_rtl8761b_fw", "rtl8761b_fw", "rtl8761b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_4PLUS, MAX_PATCH_SIZE_40K}, /* RTL8761BU */
+{ 0x0BDA, 0xa725, 0x8761, 0, 0, "mp_rtl8725a_fw", "rtl8725a_fw", "rtl8725a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_4PLUS, MAX_PATCH_SIZE_40K}, /* RTL8725AU */
+{ 0x0BDA, 0xa72A, 0x8761, 0, 0, "mp_rtl8725a_fw", "rtl8725a_fw", "rtl8725a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_4PLUS, MAX_PATCH_SIZE_40K}, /* RTL8725AU BT only */
 
 { 0x0BDA, 0x8821, 0x8821, 0, 0, "mp_rtl8821a_fw", "rtl8821a_fw", "rtl8821a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8821AE */
 { 0x0BDA, 0x0821, 0x8821, 0, 0, "mp_rtl8821a_fw", "rtl8821a_fw", "rtl8821a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8821AE */
@@ -103,21 +106,37 @@ static patch_info fw_patch_table[] = {
 { 0x13D3, 0x3461, 0x8821, 0, 0, "mp_rtl8821a_fw", "rtl8821a_fw", "rtl8821a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8821AE */
 { 0x13D3, 0x3462, 0x8821, 0, 0, "mp_rtl8821a_fw", "rtl8821a_fw", "rtl8821a_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_1_2, MAX_PATCH_SIZE_24K}, /* RTL8821AE */
 
-{ 0x0BDA, 0xB822, 0x8822, 0, 0, "mp_rtl8822b_fw", "rtl8822b_fw", "rtl8822b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_24K}, /* RTL8822BE */
-{ 0x0BDA, 0xB82C, 0x8822, 0, 0, "mp_rtl8822b_fw", "rtl8822b_fw", "rtl8822b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_24K}, /* RTL8822BU */
-{ 0x0BDA, 0xB023, 0x8822, 0, 0, "mp_rtl8822b_fw", "rtl8822b_fw", "rtl8822b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_24K}, /* RTL8822BE */
+{ 0x0BDA, 0xB822, 0x8822, 0, 0, "mp_rtl8822b_fw", "rtl8822b_fw", "rtl8822b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_25K}, /* RTL8822BE */
+{ 0x0BDA, 0xB82C, 0x8822, 0, 0, "mp_rtl8822b_fw", "rtl8822b_fw", "rtl8822b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_25K}, /* RTL8822BU */
+{ 0x0BDA, 0xB81D, 0x8822, 0, 0, "mp_rtl8822b_fw", "rtl8822b_fw", "rtl8822b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_25K}, /* RTL8822BU BT only */
+{ 0x0BDA, 0xB82E, 0x8822, 0, 0, "mp_rtl8822b_fw", "rtl8822b_fw", "rtl8822b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_25K}, /* RTL8822BU-VN */
+{ 0x0BDA, 0xB023, 0x8822, 0, 0, "mp_rtl8822b_fw", "rtl8822b_fw", "rtl8822b_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_25K}, /* RTL8822BE */
 { 0x0BDA, 0xB703, 0x8703, 0, 0, "mp_rtl8723c_fw", "rtl8723c_fw", "rtl8723c_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_24K}, /* RTL8723CU */
 /* todo: RTL8703BU */
 
 { 0x0BDA, 0xD723, 0x8723, 0, 0, "mp_rtl8723d_fw", "rtl8723d_fw", "rtl8723d_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_40K}, /* RTL8723DU */
+{ 0x0BDA, 0xD72A, 0x8723, 0, 0, "mp_rtl8723d_fw", "rtl8723d_fw", "rtl8723d_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_40K}, /* RTL8723DU BT only */
 { 0x0BDA, 0xD720, 0x8723, 0, 0, "mp_rtl8723d_fw", "rtl8723d_fw", "rtl8723d_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_40K}, /* RTL8723DE */
+{ 0x0BDA, 0xB733, 0x8723, 0, 0, "mp_rtl8723f_fw", "rtl8723f_fw", "rtl8723f_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_40K}, /* RTL8723FU */
+{ 0x0BDA, 0xB73A, 0x8723, 0, 0, "mp_rtl8723f_fw", "rtl8723f_fw", "rtl8723f_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_40K}, /* RTL8723FU */
+{ 0x0BDA, 0xF72B, 0x8723, 0, 0, "mp_rtl8723f_fw", "rtl8723f_fw", "rtl8723f_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_40K}, /* RTL8723FU */
 { 0x0BDA, 0xB820, 0x8821, 0, 0, "mp_rtl8821c_fw", "rtl8821c_fw", "rtl8821c_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_40K}, /* RTL8821CU */
 { 0x0BDA, 0xC820, 0x8821, 0, 0, "mp_rtl8821c_fw", "rtl8821c_fw", "rtl8821c_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_40K}, /* RTL8821CU */
+{ 0x0BDA, 0xC82A, 0x8821, 0, 0, "mp_rtl8821c_fw", "rtl8821c_fw", "rtl8821c_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_40K}, /* RTL8821CU BT only */
 { 0x0BDA, 0xC821, 0x8821, 0, 0, "mp_rtl8821c_fw", "rtl8821c_fw", "rtl8821c_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_3PLUS, MAX_PATCH_SIZE_40K}, /* RTL8821CE */
 /* todo: RTL8703CU */
+{ 0x0BDA, 0xC82C, 0x8822, 0, 0, "mp_rtl8822c_fw", "rtl8822c_fw", "rtl8822c_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_4PLUS, MAX_PATCH_SIZE_40K}, /* RTL8822CU */
+{ 0x0BDA, 0xC82E, 0x8822, 0, 0, "mp_rtl8822c_fw", "rtl8822c_fw", "rtl8822c_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_4PLUS, MAX_PATCH_SIZE_40K}, /* RTL8822CU-VN */
+{ 0x0BDA, 0xC81D, 0x8822, 0, 0, "mp_rtl8822c_fw", "rtl8822c_fw", "rtl8822c_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_4PLUS, MAX_PATCH_SIZE_40K}, /* RTL8822CU BT only */
+{ 0x0BDA, 0xC82F, 0x8822, 0, 0, "mp_rtl8822c_fw", "rtl8822c_fw", "rtl8822c_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_4PLUS, MAX_PATCH_SIZE_40K}, /* RTL8822CE-VS */
+{ 0x0BDA, 0xC822, 0x8822, 0, 0, "mp_rtl8822c_fw", "rtl8822c_fw", "rtl8822c_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_4PLUS, MAX_PATCH_SIZE_40K}, /* RTL8822CE */
+{ 0x0BDA, 0xB00C, 0x8822, 0, 0, "mp_rtl8822c_fw", "rtl8822c_fw", "rtl8822c_config", NULL, 0 ,CONFIG_MAC_OFFSET_GEN_4PLUS, MAX_PATCH_SIZE_40K}, /* RTL8822CE */
+{ 0x0BDA, 0x885A, 0x8852, 0, 0, "mp_rtl8852au_fw", "rtl8852au_fw", "rtl8852au_config", NULL, 0,CONFIG_MAC_OFFSET_GEN_4PLUS, MAX_PATCH_SIZE_40K}, /*RTL8852AU */
+{ 0x0BDA, 0x8852, 0x8852, 0, 0, "mp_rtl8852ae_fw", "rtl8852ae_fw", "rtl8852ae_config", NULL, 0,CONFIG_MAC_OFFSET_GEN_4PLUS, MAX_PATCH_SIZE_40K}, /*RTL8852AE */
+{ 0x0BDA, 0xB852, 0x8852, 0, 0, "mp_rtl8852b_fw", "rtl8852b_fw", "rtl8852b_config", NULL, 0,CONFIG_MAC_OFFSET_GEN_4PLUS, MAX_PATCH_SIZE_40K}, /*RTL8852B */
 
 /* NOTE: must append patch entries above the null entry */
-{ 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, 0, 0 }
+{ 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, 0, 0, 0 }
 };
 
 struct btusb_data {
@@ -166,30 +185,51 @@ struct btusb_data {
     RTK_sco_card_t  *pSCOSnd;
 #endif
 };
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 1)
-static bool reset_on_close = 0;
-#endif
 
 int download_patch(firmware_info *fw_info, int cached);
 int reset_controller(firmware_info* fw_info);
 
-static inline int check_set_dlfw_state_value(uint16_t change_value)
+
+/********************************************************
+**    this function first check the value, if true then set value
+**
+*********************************************************/
+static inline bool check_set_driver_state_value(uint16_t check_value, uint16_t change_value)
 {
-    int state;
-    spin_lock(&dlfw_lock);
-    if(!dlfw_dis_state) {
-        dlfw_dis_state = change_value;
+    bool res;
+    spin_lock(&running_flag_lock);
+    if((driver_state & check_value) != check_value) {
+        res = false;
+    }
+    else {
+        driver_state |= change_value;
+        res = true;
     }
-    state = dlfw_dis_state;
-    spin_unlock(&dlfw_lock);
+    spin_unlock(&running_flag_lock);
+    return res;
+}
+
+static inline uint16_t get_driver_state_value(void)
+{
+    uint16_t state;
+    spin_lock(&running_flag_lock);
+    state = driver_state;
+    spin_unlock(&running_flag_lock);
     return state;
 }
 
-static inline void set_dlfw_state_value(uint16_t change_value)
+static inline void clear_driver_state(uint16_t clear_value)
+{
+    spin_lock(&running_flag_lock);
+    driver_state &= (~clear_value);
+    spin_unlock(&running_flag_lock);
+}
+
+static inline void set_driver_state_value(uint16_t change_value)
 {
-    spin_lock(&dlfw_lock);
-    dlfw_dis_state = change_value;
-    spin_unlock(&dlfw_lock);
+    spin_lock(&running_flag_lock);
+    driver_state |= change_value;
+    spin_unlock(&running_flag_lock);
 }
 
 #if SUSPNED_DW_FW
@@ -329,11 +369,9 @@ static void print_command(struct sk_buff *skb)
 #if CONFIG_BLUEDROID
 /* Global parameters for bt usb char driver */
 #define BT_CHAR_DEVICE_NAME "rtkbt_dev"
-struct mutex btchr_mutex;
 static struct sk_buff_head btchr_readq;
 static wait_queue_head_t btchr_read_wait;
-static wait_queue_head_t bt_dlfw_wait;
-static bool bt_char_dev_registered;
+static wait_queue_head_t bt_drv_state_wait;
 static dev_t bt_devid; /* bt char device number */
 static struct cdev bt_char_dev; /* bt character device structure */
 static struct class *bt_char_class; /* device class for usb char driver */
@@ -476,7 +514,8 @@ static int rtk_skb_queue_rear = 0;
 
 static void rtk_enqueue(struct sk_buff *skb)
 {
-    spin_lock(&queue_lock);
+    unsigned long flags;
+    spin_lock_irqsave(&queue_lock, flags);
     if (rtk_skb_queue_front == (rtk_skb_queue_rear + 1) % QUEUE_SIZE) {
         /*
          * If queue is full, current solution is to drop
@@ -490,7 +529,7 @@ static void rtk_enqueue(struct sk_buff *skb)
         rtk_skb_queue_rear %= QUEUE_SIZE;
 
     }
-    spin_unlock(&queue_lock);
+    spin_unlock_irqrestore(&queue_lock, flags);
 }
 
 static struct sk_buff *rtk_dequeue_try(unsigned int deq_len)
@@ -530,7 +569,8 @@ static inline int is_queue_empty(void)
 static void rtk_clear_queue(void)
 {
     struct sk_buff *skb;
-    spin_lock(&queue_lock);
+    unsigned long flags;
+    spin_lock_irqsave(&queue_lock, flags);
     while(!is_queue_empty()) {
         skb = rtk_skb_queue[rtk_skb_queue_front];
         rtk_skb_queue[rtk_skb_queue_front] = NULL;
@@ -540,7 +580,7 @@ static void rtk_clear_queue(void)
             kfree_skb(skb);
         }
     }
-    spin_unlock(&queue_lock);
+    spin_unlock_irqrestore(&queue_lock, flags);
 }
 
 /*
@@ -571,7 +611,7 @@ static int hci_dev_open(__u16 dev)
         return -ENODEV;
     }
 
-    if (test_bit(HCI_UNREGISTER, &hdev->dev_flags)) {
+    if (test_bit(HCI_UNREGISTER, &hdev->flags)) {
         ret = -ENODEV;
         goto done;
     }
@@ -580,14 +620,6 @@ static int hci_dev_open(__u16 dev)
         ret = -EALREADY;
         goto done;
     }
-/*
-    ret = hdev->open(hdev);
-    if(ret < 0){
-        RTKBT_ERR("%s:Failed in hdev->open(hdev):%d",__func__,ret);
-        goto done;
-    }
-    set_bit(HCI_UP, &hdev->flags);
-*/
 
 done:
     return ret;
@@ -602,6 +634,7 @@ static int hci_dev_do_close(struct hci_dev *hdev)
     hdev->close(hdev);
     /* Clear flags */
     hdev->flags = 0;
+    memset(&hdev->conn_hash, 0, sizeof(struct hci_conn_hash));
     return 0;
 }
 
@@ -653,7 +686,6 @@ static int hci_register_dev(struct hci_dev *hdev)
     sprintf(hdev->name, "hci%d", id);
     hdev->id = id;
     hdev->flags = 0;
-    hdev->dev_flags = 0;
     mutex_init(&hdev->lock);
 
     RTKBT_DBG("%s: id %d, name %s", __func__, hdev->id, hdev->name);
@@ -683,7 +715,7 @@ static void hci_unregister_dev(struct hci_dev *hdev)
     int i;
 
     RTKBT_DBG("%s: hdev %p name %s bus %d", __func__, hdev, hdev->name, hdev->bus);
-    set_bit(HCI_UNREGISTER, &hdev->dev_flags);
+    set_bit(HCI_UNREGISTER, &hdev->flags);
 
     write_lock(&hci_dev_lock);
     ghdev = NULL;
@@ -797,8 +829,36 @@ static int hci_recv_frame(struct sk_buff *skb)
 {
     struct hci_dev *hdev = (struct hci_dev *) skb->dev;
 
-    if (!hdev ||
-        (!test_bit(HCI_UP, &hdev->flags) && !test_bit(HCI_INIT, &hdev->flags))) {
+    if (!hdev || !test_bit(HCI_UP, &hdev->flags)) {
+        kfree_skb(skb);
+        return -ENXIO;
+    }
+
+    /* Incomming skb */
+    bt_cb(skb)->incoming = 1;
+
+    /* Time stamp */
+    __net_timestamp(skb);
+
+    if (atomic_read(&hdev->promisc)) {
+#ifdef CONFIG_SCO_OVER_HCI
+        if(bt_cb(skb)->pkt_type == HCI_SCODATA_PKT)
+            hci_send_to_alsa_ringbuffer(hdev, skb);
+#endif
+        /* Send copy to the sockets */
+        hci_send_to_stack(hdev, skb);
+    }
+
+    kfree_skb(skb);
+    return 0;
+}
+
+/* Receive frame from HCI drivers */
+static int hci_recv_sco_frame(struct sk_buff *skb)
+{
+    struct hci_dev *hdev = (struct hci_dev *) skb->dev;
+
+    if (!hdev || !test_bit(HCI_UP, &hdev->flags)) {
         kfree_skb(skb);
         return -ENXIO;
     }
@@ -865,6 +925,7 @@ static int hci_reassembly(struct hci_dev *hdev, int type, void *data,
 
         skb->dev = (void *) hdev;
         hdev->reassembly[index] = skb;
+
     }
 
     while (count) {
@@ -929,7 +990,11 @@ static int hci_reassembly(struct hci_dev *hdev, int type, void *data,
                 print_event(skb);
 
             bt_cb(skb)->pkt_type = type;
-            hci_recv_frame(skb);
+            if(type == HCI_SCODATA_PKT) {
+                hci_recv_sco_frame(skb);
+            }
+            else
+                hci_recv_frame(skb);
 
             hdev->reassembly[index] = NULL;
             return remain;
@@ -961,7 +1026,7 @@ static int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int cou
 void hci_hardware_error(void)
 {
     struct sk_buff *rtk_skb_copy = NULL;
-    int len = 3;
+    int len = 4;
     uint8_t hardware_err_pkt[4] = {HCI_EVENT_PKT, 0x10, 0x01, HCI_VENDOR_USB_DISC_HARDWARE_ERROR};
 
     rtk_skb_copy = alloc_skb(len, GFP_ATOMIC);
@@ -980,16 +1045,24 @@ static int btchr_open(struct inode *inode_p, struct file  *file_p)
 {
     struct btusb_data *data;
     struct hci_dev *hdev;
+    struct sk_buff *skb;
+    int i;
 
     RTKBT_INFO("%s: BT usb char device is opening", __func__);
-    /* Not open unless wanna tracing log */
-    /* trace_printk("%s: open....\n", __func__); */
+
+    if(!check_set_driver_state_value(DEVICE_PROBED, CHAR_OPENED)) {
+        RTKBT_ERR("%s: Device not probed", __func__);
+        return -ENODEV;
+    }
+
 
     hdev = hci_dev_get(0);
     if (!hdev) {
         RTKBT_ERR("%s: Failed to get hci dev[NULL]", __func__);
         return -ENODEV;
     }
+
+    set_bit(HCI_UP, &hdev->flags);
     data = GET_DRV_DATA(hdev);
 
     atomic_inc(&hdev->promisc);
@@ -1000,11 +1073,15 @@ static int btchr_open(struct inode *inode_p, struct file  *file_p)
      */
     file_p->private_data = data;
 
-    mutex_lock(&btchr_mutex);
     hci_dev_open(0);
-    mutex_unlock(&btchr_mutex);
-
     rtk_clear_queue();
+    for(i = 0; i < NUM_REASSEMBLY; i++) {
+        skb = hdev->reassembly[i];
+        if(skb) {
+            hdev->reassembly[i] = NULL;
+            kfree_skb(skb);
+        }
+    }
     return nonseekable_open(inode_p, file_p);
 }
 
@@ -1014,8 +1091,6 @@ static int btchr_close(struct inode  *inode_p, struct file   *file_p)
     struct hci_dev *hdev;
 
     RTKBT_INFO("%s: BT usb char device is closing", __func__);
-    /* Not open unless wanna tracing log */
-    /* trace_printk("%s: close....\n", __func__); */
 
     data = file_p->private_data;
     file_p->private_data = NULL;
@@ -1028,14 +1103,19 @@ static int btchr_close(struct inode  *inode_p, struct file   *file_p)
     bt_reset = 0;
 #endif
 
+
     hdev = hci_dev_get(0);
     if (hdev) {
         atomic_set(&hdev->promisc, 0);
-        mutex_lock(&btchr_mutex);
         hci_dev_close(0);
-        mutex_unlock(&btchr_mutex);
+        clear_bit(HCI_UP, &hdev->flags);
     }
 
+    clear_driver_state(CHAR_OPENED);
+    //if the state is not probed, the driver may be in the disconnecting state
+    //and waitting for signal to wake up
+    if((get_driver_state_value() & DEVICE_PROBED) == 0)
+        wake_up_interruptible(&bt_drv_state_wait);
     return 0;
 }
 
@@ -1064,7 +1144,7 @@ static ssize_t btchr_read(struct file *file_p,
 
         ret = wait_event_interruptible(btchr_read_wait, !is_queue_empty());
         if (ret < 0) {
-            RTKBT_ERR("%s: wait event is signaled %d", __func__, (int)ret);
+            RTKBT_ERR("%s: wait event is signaled %d", __func__, ret);
             break;
         }
 
@@ -1092,6 +1172,11 @@ static ssize_t btchr_write(struct file *file_p,
 
     RTKBT_DBG("%s: BT usb char device is writing", __func__);
 
+    if((get_driver_state_value() & DEVICE_PROBED) == 0) {
+        RTKBT_ERR("%s: Device not probed", __func__);
+        return POLLERR | POLLHUP;
+    }
+
     hdev = hci_dev_get(0);
     if (!hdev) {
         RTKBT_WARN("%s: Failed to get hci dev[Null]", __func__);
@@ -1141,8 +1226,9 @@ static unsigned int btchr_poll(struct file *file_p, poll_table *wait)
 
     RTKBT_DBG("%s: BT usb char device is polling", __func__);
 
-    if(!bt_char_dev_registered) {
-        RTKBT_ERR("%s: char device has not registered!", __func__);
+    if((get_driver_state_value() & DRIVER_ON) == 0 ||
+          (get_driver_state_value() & DEVICE_PROBED) == 0) {
+        RTKBT_ERR("%s: Device not probed", __func__);
         return POLLERR | POLLHUP;
     }
 
@@ -1172,31 +1258,28 @@ static unsigned int btchr_poll(struct file *file_p, poll_table *wait)
 
     return POLLOUT | POLLWRNORM;
 }
+
 static long btchr_ioctl(struct file *file_p, unsigned int cmd, unsigned long arg){
     int ret = 0;
     struct hci_dev *hdev;
     struct btusb_data *data;
     firmware_info *fw_info;
 
-    if(!bt_char_dev_registered) {
+    if((get_driver_state_value() & DRIVER_ON) == 0 ||
+          (get_driver_state_value() & DEVICE_PROBED) == 0) {
+        RTKBT_ERR("%s bt controller is disconnect!", __func__);
         return -ENODEV;
     }
 
-    if(check_set_dlfw_state_value(1) != 1) {
-        RTKBT_ERR("%s bt controller is disconnecting!", __func__);
-        return 0;
-    }
-
     hdev = hci_dev_get(0);
     if(!hdev) {
         RTKBT_ERR("%s device is NULL!", __func__);
-        set_dlfw_state_value(0);
         return 0;
     }
     data = GET_DRV_DATA(hdev);
     fw_info = data->fw_info;
 
-    RTKBT_INFO(" btchr_ioctl DOWN_FW_CFG with Cmd:%d",cmd);
+    RTKBT_INFO(" btchr_ioctl with Cmd:%d",cmd);
     switch (cmd) {
         case DOWN_FW_CFG:
             ret = usb_autopm_get_interface(data->intf);
@@ -1216,40 +1299,61 @@ static long btchr_ioctl(struct file *file_p, unsigned int cmd, unsigned long arg
                 RTKBT_ERR("%s:Failed in hdev->open(hdev):%d",__func__,ret);
                 goto failed;
             }
-            set_bit(HCI_UP, &hdev->flags);
-            set_dlfw_state_value(0);
-            wake_up_interruptible(&bt_dlfw_wait);
-            return 1;
+            ret = 1;
+            break;
+
+#ifdef CONFIG_SCO_OVER_HCI
+        case SET_ISO_CFG:
+            if(get_user(hdev->voice_setting, (__u16 __user*)arg)) {
+                ret = -EFAULT;
+            }
+            RTKBT_INFO(" voice settings = 0x%04x", hdev->voice_setting);
+            break;
+#endif
+
         case GET_USB_INFO:
             ret = hdev->open(hdev);
             if(ret < 0){
                 RTKBT_ERR("%s:Failed in hdev->open(hdev):%d",__func__,ret);
                 //goto done;
             }
-            set_bit(HCI_UP, &hdev->flags);
-            return usb_info;
+            put_user(usb_info, (__u32 __user*)arg);
+            ret = 1;
+            break;
         case RESET_CONTROLLER:
             reset_controller(fw_info);
-            return 1;
+            ret = 1;
+            break;
+
+        case DWFW_CMPLT:
+        {
+            uint16_t lmp_sub = 0;
+            if(get_user(lmp_sub, (__u16 __user*)arg)) {
+                ret = -EFAULT;
+            }
+            else if(lmp_sub != 0) {
+                fw_info->patch_entry->lmp_sub = lmp_sub;
+            }
+            RTKBT_INFO("%s lmp_sub = 0x%x, patch_entry->lmp_sub = 0x%x", __func__,
+                          lmp_sub, fw_info->patch_entry->lmp_sub);
+        }
+            break;
 
-#ifdef CONFIG_SCO_OVER_HCI
-        case SET_ISO_CFG:
-            hdev->voice_setting = *(__u16 *)arg;
-            RTKBT_INFO(" voice settings = 0x%04x", hdev->voice_setting);
-            return 1;
-#endif
         default:
             RTKBT_ERR("%s:Failed with wrong Cmd:%d",__func__,cmd);
             goto failed;
         }
-    failed:
-        set_dlfw_state_value(0);
-        wake_up_interruptible(&bt_dlfw_wait);
+failed:
         return ret;
 
 }
 
-
+#ifdef CONFIG_COMPAT
+static long compat_btchr_ioctl (struct file *filp, unsigned int cmd, unsigned long arg)
+{
+    return btchr_ioctl(filp, cmd, (unsigned long) compat_ptr(arg));
+}
+#endif
 
 static struct file_operations bt_chrdev_ops  = {
     open    :    btchr_open,
@@ -1258,6 +1362,9 @@ static struct file_operations bt_chrdev_ops  = {
     write    :    btchr_write,
     poll    :    btchr_poll,
     unlocked_ioctl   :   btchr_ioctl,
+#ifdef CONFIG_COMPAT
+    compat_ioctl :  compat_btchr_ioctl,
+#endif
 };
 
 static int btchr_init(void)
@@ -1266,16 +1373,9 @@ static int btchr_init(void)
     struct device *dev;
 
     RTKBT_INFO("Register usb char device interface for BT driver");
-    /*
-     * btchr mutex is used to sync between
-     * 1) downloading patch and opening bt char driver
-     * 2) the file operations of bt char driver
-     */
-    mutex_init(&btchr_mutex);
-
     skb_queue_head_init(&btchr_readq);
     init_waitqueue_head(&btchr_read_wait);
-    init_waitqueue_head(&bt_dlfw_wait);
+    init_waitqueue_head(&bt_drv_state_wait);
 
     bt_char_class = class_create(THIS_MODULE, BT_CHAR_DEVICE_NAME);
     if (IS_ERR(bt_char_class)) {
@@ -1390,13 +1490,6 @@ int set_bt_onoff(firmware_info *fw_info, uint8_t onoff)
         return ret_val;
     }
 
-    ret_val = rcv_hci_evt(fw_info);
-    if (ret_val < 0) {
-        RTKBT_ERR("%s: Failed to receive bt %s event, errno %d",
-                __func__, onoff != 0 ? "on" : "off", ret_val);
-        return ret_val;
-    }
-
     return ret_val;
 }
 
@@ -1428,6 +1521,7 @@ static patch_info *get_fw_table_entry(struct usb_device* udev)
 static patch_info *get_suspend_fw_table_entry(struct usb_device* udev)
 {
     patch_info *patch_entry = fw_patch_table;
+    patch_info *patch_entry_real = NULL;
     uint16_t vid = le16_to_cpu(udev->descriptor.idVendor);
     uint16_t pid = le16_to_cpu(udev->descriptor.idProduct);
     uint32_t entry_size = sizeof(fw_patch_table) / sizeof(fw_patch_table[0]);
@@ -1444,8 +1538,11 @@ static patch_info *get_suspend_fw_table_entry(struct usb_device* udev)
         RTKBT_ERR("%s: No fw table entry found", __func__);
         return NULL;
     }
-
-    return patch_entry;
+    patch_entry_real = kmalloc(sizeof(fw_patch_table[0]), GFP_KERNEL);
+    if(!patch_entry_real)
+        return NULL;
+    memcpy(patch_entry_real, patch_entry, sizeof(fw_patch_table[0]));
+    return patch_entry_real;
 }
 #endif
 
@@ -1518,11 +1615,13 @@ int reset_controller(firmware_info* fw_info)
  * 0: no need to download fw patch
  * <0: failed to check lmp version
  */
-int check_fw_version(firmware_info* fw_info)
+int check_fw_version(firmware_info* fw_info, bool resume_check)
 {
     struct hci_rp_read_local_version *read_ver_rsp;
     patch_info *patch_entry = NULL;
-    int ret_val = -1;
+    int ret_val = -1, i, ret_len = 0;
+    struct sk_buff *rtk_skb_copy = NULL;
+    unsigned char pkt_type = HCI_EVENT_PKT;
 
     fw_info->cmd_hdr->opcode = cpu_to_le16(HCI_OP_READ_LOCAL_VERSION);
     fw_info->cmd_hdr->plen = 0;
@@ -1535,11 +1634,40 @@ int check_fw_version(firmware_info* fw_info)
         return ret_val;
     }
 
-    ret_val = rcv_hci_evt(fw_info);
-    if (ret_val < 0) {
-        RTKBT_ERR("%s: Failed to receive hci event, errno %d",
+    while (1) {
+        for(i = 0; i < 5; i++) {
+        ret_val = usb_interrupt_msg(
+            fw_info->udev, fw_info->pipe_in,
+            (void *)(fw_info->rcv_pkt), PKT_LEN,
+            &ret_len, MSG_TO);
+            if (ret_val >= 0)
+                break;
+        }
+
+        if (ret_val < 0) {
+            RTKBT_ERR("%s: Failed to receive hci event, errno %d",
                 __func__, ret_val);
-        return ret_val;
+            return ret_val;
+        }
+
+        if ((CMD_CMP_EVT == fw_info->evt_hdr->evt) &&
+              (fw_info->cmd_hdr->opcode == fw_info->cmd_cmp->opcode)) {
+                break;
+        }
+        else if(resume_check) {
+            rtk_skb_copy = bt_skb_alloc((ret_len), GFP_ATOMIC);
+            if (!rtk_skb_copy) {
+              RTKBT_ERR("%s: Failed to allocate mem", __func__);
+              return 2;
+            }
+
+            memcpy(skb_put(rtk_skb_copy, ret_len), fw_info->rcv_pkt, ret_len);
+            memcpy(skb_push(rtk_skb_copy, 1), &pkt_type, 1);
+            rtk_enqueue(rtk_skb_copy);
+
+            rtk_skb_copy = NULL;
+            wake_up_interruptible(&btchr_read_wait);
+        }
     }
 
     patch_entry = fw_info->patch_entry;
@@ -1635,6 +1763,55 @@ int reset_channel(firmware_info* fw_info)
     return ret_val;
 }
 
+
+//sometimes the controller is in warm resume,and still send message to host
+//we should reset controller and clean the hardware buffer
+bool reset_and_clean_hw_buffer(firmware_info* fw_info)
+{
+    int ret_val, i;
+    int ret_len = 0;
+    bool event_recv = false;
+
+    if (!fw_info)
+        return -ENODEV;
+
+    fw_info->cmd_hdr->opcode = cpu_to_le16(HCI_VENDOR_RESET);
+    fw_info->cmd_hdr->plen = 0;
+    fw_info->pkt_len = CMD_HDR_LEN;
+
+    ret_val = send_hci_cmd(fw_info);
+    if (ret_val < 0) {
+        RTKBT_ERR("%s: Failed to send  hci cmd 0x%04x, errno %d",
+                __func__, fw_info->cmd_hdr->opcode, ret_val);
+        return ret_val;
+    }
+
+    //we need to clean the hardware buffer
+    while (1) {
+        ret_val = usb_interrupt_msg(
+            fw_info->udev, fw_info->pipe_in,
+            (void *)(fw_info->rcv_pkt), PKT_LEN,
+            &ret_len, (MSG_TO/2));
+
+        if(ret_val >= 0) {
+          if(event_recv) {
+            RTKBT_INFO("%s: clear hardware event", __func__);
+            continue;
+          }
+        }
+        else {
+          return event_recv;
+        }
+
+        if (CMD_CMP_EVT == fw_info->evt_hdr->evt) {
+            if (fw_info->cmd_hdr->opcode == fw_info->cmd_cmp->opcode) {
+              event_recv = true;
+            }
+        }
+    }
+    return ret_val;
+}
+
 int read_localversion(firmware_info* fw_info)
 {
     struct rtk_localversion_evt *ever_evt;
@@ -1751,7 +1928,7 @@ void rtk_update_altsettings(patch_info *patch_entry, const unsigned char* org_co
 
     if (config->data_len != org_config_len - sizeof(struct rtk_bt_vendor_config))
     {
-        RTKBT_ERR("rtk_update_altsettings: config len(%x) is not right(%x)", config->data_len, org_config_len-(int)sizeof(struct rtk_bt_vendor_config));
+        RTKBT_ERR("rtk_update_altsettings: config len(%x) is not right(%x)", config->data_len, org_config_len-sizeof(struct rtk_bt_vendor_config));
         return;
     }
 
@@ -1960,6 +2137,7 @@ int load_firmware(firmware_info *fw_info, uint8_t **buff)
                     if (!(buf = kzalloc(buf_len, GFP_KERNEL))) {
                         RTKBT_ERR("%s: Can't alloc memory for  fw&config", __func__);
                         buf_len = -1;
+                        kfree(p_epatch_entry);
                     } else {
                         memcpy(buf, &epatch_buf[p_epatch_entry->start_offset], p_epatch_entry->patch_length);
                         memcpy(&buf[p_epatch_entry->patch_length-4], &epatch_info->fw_version, 4);
@@ -1990,6 +2168,113 @@ fw_fail:
     return ret_val;
 }
 
+void load_firmware_info(firmware_info *fw_info)
+{
+    const struct firmware *fw, *cfg;
+    struct usb_device *udev;
+    patch_info *patch_entry;
+    char *fw_name;
+    int ret_val;
+
+    int buf_len = -1;
+    uint8_t *epatch_buf = NULL;
+
+    struct rtk_epatch *epatch_info = NULL;
+    struct rtk_extension_entry patch_lmp = {0};
+    uint16_t lmp_version;
+    RTKBT_DBG("%s: start", __func__);
+
+    udev = fw_info->udev;
+    patch_entry = fw_info->patch_entry;
+    lmp_version = patch_entry->lmp_sub_default;
+
+    if(DRV_MP_MODE == mp_drv_mode){
+        fw_name = patch_entry->mp_patch_name;
+    } else {
+        fw_name = patch_entry->patch_name;
+    }
+
+    RTKBT_INFO("%s: Default lmp version = 0x%04x, fw file name[%s]", __func__, lmp_version, fw_name);
+
+    ret_val = request_firmware(&fw, fw_name, &udev->dev);
+    if (ret_val < 0)
+        goto fw_fail;
+    else {
+        epatch_buf = vmalloc(fw->size);
+        RTKBT_INFO("%s: epatch_buf = vmalloc(fw->size, GFP_KERNEL)", __func__);
+        if (!epatch_buf) {
+            release_firmware(fw);
+            goto fw_fail;
+        }
+        memcpy(epatch_buf, fw->data, fw->size);
+        buf_len = fw->size;
+        release_firmware(fw);
+    }
+
+    ret_val = reset_and_clean_hw_buffer(fw_info);
+
+    if (lmp_version != ROM_LMP_8723a) {
+        RTKBT_DBG("%s: Not 8723a -> use new style patch", __func__);
+        ret_val = get_eversion(fw_info);
+        if (ret_val < 0) {
+            RTKBT_ERR("%s: Failed to get eversion, errno %d", __func__, ret_val);
+            goto fw_fail;
+        }
+        RTKBT_DBG("%s: Get eversion =%d", __func__, patch_entry->eversion);
+        if (memcmp(epatch_buf + buf_len - 4 , EXTENSION_SECTION_SIGNATURE, 4)) {
+            RTKBT_ERR("%s: Failed to check extension section signature", __func__);
+        } else {
+            uint8_t *temp;
+            temp = epatch_buf + buf_len - 5;
+            do {
+                if (*temp == 0x00) {
+                    patch_lmp.opcode = *temp;
+                    patch_lmp.length = *(temp-1);
+                    if ((patch_lmp.data = vmalloc(patch_lmp.length))) {
+                        int k;
+                        for (k = 0; k < patch_lmp.length; k++) {
+                            *(patch_lmp.data+k) = *(temp-2-k);
+                            RTKBT_DBG("data = 0x%x", *(patch_lmp.data+k));
+                        }
+                    }
+                    else
+                      goto fw_fail;
+                    RTKBT_DBG("%s: opcode = 0x%x, length = 0x%x, data = 0x%x", __func__,
+                            patch_lmp.opcode, patch_lmp.length, *(patch_lmp.data));
+                    break;
+                }
+                temp -= *(temp-1) + 2;
+            } while (*temp != 0xFF);
+
+            if (lmp_version != project_id[*(patch_lmp.data)]) {
+                RTKBT_ERR("%s: Default lmp_version 0x%04x, project_id[%d] 0x%04x "
+                        "-> not match", __func__, lmp_version, *(patch_lmp.data),project_id[*(patch_lmp.data)]);
+            } else {
+                RTKBT_INFO("%s: Default lmp_version 0x%04x, project_id[%d] 0x%04x "
+                        "-> match", __func__, lmp_version, *(patch_lmp.data), project_id[*(patch_lmp.data)]);
+                if (memcmp(epatch_buf, RTK_EPATCH_SIGNATURE, 8)) {
+                    RTKBT_ERR("%s: Check signature error", __func__);
+                } else {
+                    epatch_info = (struct rtk_epatch*)epatch_buf;
+                    patch_entry->lmp_sub = (uint16_t)epatch_info->fw_version;
+
+                    RTKBT_DBG("%s: lmp version 0x%04x, fw_version 0x%x, "
+                            "number_of_total_patch %d", __func__,
+                            patch_entry->lmp_sub, epatch_info->fw_version,
+                            epatch_info->number_of_total_patch);
+                }
+            }
+        }
+    }
+
+    RTKBT_DBG("%s: done", __func__);
+fw_fail:
+    if(epatch_buf)
+        vfree(epatch_buf);
+    if (patch_lmp.data)
+        vfree(patch_lmp.data);
+}
+
 #if SUSPNED_DW_FW
 static int load_suspend_firmware(firmware_info *fw_info, uint8_t **buff)
 {
@@ -2025,12 +2310,17 @@ static int load_suspend_firmware(firmware_info *fw_info, uint8_t **buff)
     if (ret_val < 0)
         config_len = 0;
     else {
-        config_file_buf = vmalloc(cfg->size);
-        RTKBT_INFO("%s: epatch_buf = vmalloc(cfg->size)", __func__);
-        if (!config_file_buf)
-            return -ENOMEM;
-        memcpy(config_file_buf, cfg->data, cfg->size);
-        config_len = cfg->size;
+        int i;
+        rtk_update_altsettings(patch_entry, cfg->data, cfg->size, &config_file_buf, &config_len);
+
+        RTKBT_INFO("Final Config len=%08x:\n", config_len);
+        for(i=0;i<=config_len;i+=0x10)
+        {
+            RTKBT_INFO("%08x: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", i, \
+                config_file_buf[i], config_file_buf[i+1], config_file_buf[i+2], config_file_buf[i+3], config_file_buf[i+4], config_file_buf[i+5], config_file_buf[i+6], config_file_buf[i+7], \
+                config_file_buf[i+8], config_file_buf[i+9], config_file_buf[i+10], config_file_buf[i+11], config_file_buf[i+12], config_file_buf[i+13], config_file_buf[i+14], config_file_buf[i+15]);
+        }
+
         release_firmware(cfg);
     }
 
@@ -2121,6 +2411,7 @@ static int load_suspend_firmware(firmware_info *fw_info, uint8_t **buff)
                 if (!(buf = kzalloc(buf_len, GFP_KERNEL))) {
                     RTKBT_ERR("%s: Can't alloc memory for  fw&config", __func__);
                     buf_len = -1;
+                    kfree(p_epatch_entry);
                 } else {
                     memcpy(buf, &epatch_buf[p_epatch_entry->start_offset], p_epatch_entry->patch_length);
                     memcpy(&buf[p_epatch_entry->patch_length-4], &epatch_info->fw_version, 4);
@@ -2136,12 +2427,6 @@ static int load_suspend_firmware(firmware_info *fw_info, uint8_t **buff)
         }
     }
 
-    if (config_file_buf){
-        vfree(config_file_buf);
-        config_file_buf = NULL;
-        RTKBT_INFO("%s: vfree(config_file_buf)", __func__);
-        }
-
     RTKBT_INFO("%s: fw%s exists, config file%s exists", __func__,
             (buf_len > 0) ? "" : " not", (config_len > 0) ? "":" not");
 
@@ -2153,11 +2438,6 @@ static int load_suspend_firmware(firmware_info *fw_info, uint8_t **buff)
     return buf_len;
 
 fw_fail:
-    if (config_file_buf){
-        vfree(config_file_buf);
-        config_file_buf = NULL;
-        }
-    RTKBT_INFO("%s: fw_fail vfree(config_file_buf)", __func__);
     return ret_val;
 }
 #endif
@@ -2362,7 +2642,7 @@ int download_patch(firmware_info *fw_info, int cached)
         goto free;
     }
 
-    ret_val = check_fw_version(fw_info);
+    ret_val = check_fw_version(fw_info, false);
 
     if (2 == ret_val) {
         RTKBT_ERR("%s: Cold reset bt chip only download", __func__);
@@ -2403,13 +2683,13 @@ static int download_suspend_patch(firmware_info *fw_info, int cached)
 
     /*check the length of fw to be download*/
     RTKBT_DBG("%s:Check RTK_PATCH_LENGTH fw_info->fw_len:%d", __func__,fw_info->fw_len);
-    if (fw_info->fw_len > RTK_PATCH_LENGTH_MAX || fw_info->fw_len == 0) {
-        RTKBT_ERR("%s: Total length of fw&config larger than allowed 24K or no fw len:%d", __func__, fw_info->fw_len);
+    if (fw_info->fw_len > fw_info->patch_entry->max_patch_size || fw_info->fw_len == 0) {
+        RTKBT_ERR("%s: Total length of fw&config(%08x) larger than max_patch_size 0x%08x", __func__, fw_info->fw_len, fw_info->patch_entry->max_patch_size);
         ret_val = -1;
         goto free;
     }
 
-    ret_val = check_fw_version(fw_info);
+    ret_val = check_fw_version(fw_info, false);
 
     if (2 == ret_val) {
         RTKBT_ERR("%s: Cold reset bt chip only download", __func__);
@@ -2614,8 +2894,9 @@ void firmware_info_destroy(struct usb_interface *intf)
 
     kfree(fw_info_4_suspend->rcv_pkt);
     kfree(fw_info_4_suspend->send_pkt);
+    kfree(fw_info_4_suspend->patch_entry);
     kfree(fw_info_4_suspend);
-	fw_info_4_suspend = NULL;
+    fw_info_4_suspend = NULL;
 #endif
 }
 
@@ -2887,7 +3168,7 @@ static void btusb_isoc_complete(struct urb *urb)
     RTKBT_DBG("%s: urb %p status %d count %d",
             __func__, urb, urb->status, urb->actual_length);
 
-    if (!test_bit(HCI_RUNNING, &hdev->flags))
+    if (!test_bit(HCI_RUNNING, &hdev->flags) || !test_bit(BTUSB_ISOC_RUNNING, &data->flags))
         return;
 
     if (urb->status == 0) {
@@ -2913,10 +3194,6 @@ static void btusb_isoc_complete(struct urb *urb)
         return;
     }
 
-
-    if (!test_bit(BTUSB_ISOC_RUNNING, &data->flags))
-        return;
-
     usb_anchor_urb(urb, &data->isoc_anchor);
     i = 0;
 retry:
@@ -3062,16 +3339,28 @@ done:
 static int btusb_open(struct hci_dev *hdev)
 {
     struct btusb_data *data = GET_DRV_DATA(hdev);
-    int err = 0;
+    int i, err = 0;
 
     RTKBT_INFO("%s: Start, PM usage count %d", __func__,
-            atomic_read(&(data->intf->pm_usage_cnt)));
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
+          atomic_read(&data->intf->pm_usage_cnt)
+#else
+          0
+#endif
+    );
 
     err = usb_autopm_get_interface(data->intf);
     if (err < 0)
         return err;
 
     data->intf->needs_remote_wakeup = 1;
+    for (i = 0; i < NUM_REASSEMBLY; i++) {
+        if (hdev->reassembly[i]) {
+            RTKBT_DBG("%s: free ressembly[%d]", __func__, i);
+            kfree_skb(hdev->reassembly[i]);
+            hdev->reassembly[i] = NULL;
+        }
+    }
 
     if (test_and_set_bit(HCI_RUNNING, &hdev->flags))
         goto done;
@@ -3095,16 +3384,28 @@ static int btusb_open(struct hci_dev *hdev)
 
 done:
     usb_autopm_put_interface(data->intf);
+
     RTKBT_INFO("%s: End, PM usage count %d", __func__,
-            atomic_read(&(data->intf->pm_usage_cnt)));
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
+          atomic_read(&data->intf->pm_usage_cnt)
+#else
+          0
+#endif
+     );
     return 0;
 
 failed:
     clear_bit(BTUSB_INTR_RUNNING, &data->flags);
     clear_bit(HCI_RUNNING, &hdev->flags);
     usb_autopm_put_interface(data->intf);
+
     RTKBT_ERR("%s: Failed, PM usage count %d", __func__,
-            atomic_read(&(data->intf->pm_usage_cnt)));
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
+          atomic_read(&data->intf->pm_usage_cnt)
+#else
+          0
+#endif
+        );
     return err;
 }
 
@@ -3119,21 +3420,13 @@ static void btusb_stop_traffic(struct btusb_data *data)
 static int btusb_close(struct hci_dev *hdev)
 {
     struct btusb_data *data = GET_DRV_DATA(hdev);
-    int i, err;
+    int err;
 
     RTKBT_INFO("%s: hci running %lu", __func__, hdev->flags & HCI_RUNNING);
 
     if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))
         return 0;
 
-    for (i = 0; i < NUM_REASSEMBLY; i++) {
-        if (hdev->reassembly[i]) {
-            RTKBT_DBG("%s: free ressembly[%d]", __func__, i);
-            kfree_skb(hdev->reassembly[i]);
-            hdev->reassembly[i] = NULL;
-        }
-    }
-
     cancel_work_sync(&data->work);
     cancel_work_sync(&data->waker);
 
@@ -3335,8 +3628,6 @@ static int btusb_send_frame(struct sk_buff *skb)
     if (!test_bit(HCI_RUNNING, &hdev->flags))
         return -EBUSY;
 
-
-
     switch (bt_cb(skb)->pkt_type) {
     case HCI_COMMAND_PKT:
         print_command(skb);
@@ -3532,6 +3823,7 @@ static void btusb_work(struct work_struct *work)
 {
     struct btusb_data *data = container_of(work, struct btusb_data, work);
     struct hci_dev *hdev = data->hdev;
+    struct sk_buff *skb;
 
     int err;
     int new_alts;
@@ -3574,6 +3866,11 @@ static void btusb_work(struct work_struct *work)
             mdelay(URB_CANCELING_DELAY_MS);
             usb_kill_anchored_urbs(&data->isoc_anchor);
 
+            if(hdev->reassembly[HCI_SCODATA_PKT - 1]) {
+                skb = hdev->reassembly[HCI_SCODATA_PKT - 1];
+                hdev->reassembly[HCI_SCODATA_PKT - 1] = NULL;
+                kfree_skb(skb);
+            }
             if (set_isoc_interface(hdev, new_alts) < 0)
                 return;
         }
@@ -3600,6 +3897,7 @@ static void btusb_work(struct work_struct *work)
         usb_kill_anchored_urbs(&data->isoc_anchor);
 
         set_isoc_interface(hdev, 0);
+
         if (test_and_clear_bit(BTUSB_DID_ISO_RESUME, &data->flags))
             usb_autopm_put_interface(data->isoc ? data->isoc : data->intf);
     }
@@ -3611,7 +3909,12 @@ static void btusb_waker(struct work_struct *work)
     int err;
 
     RTKBT_DBG("%s: PM usage count %d", __func__,
-            atomic_read(&data->intf->pm_usage_cnt));
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
+          atomic_read(&data->intf->pm_usage_cnt)
+#else
+          0
+#endif
+    );
 
     err = usb_autopm_get_interface(data->intf);
     if (err < 0)
@@ -4082,6 +4385,7 @@ static RTK_sco_card_t* btusb_snd_init(struct usb_interface *intf, const struct u
     err = snd_pcm_new(card, RTK_SCO_ID, 0, 1, 1, &pSCOSnd->pcm);
     if (err < 0) {
         RTKBT_ERR("%s: sco snd card new pcm fail", __func__);
+        snd_card_free(card);
         return NULL;
     }
     pSCOSnd->pcm->private_data = pSCOSnd;
@@ -4094,6 +4398,7 @@ static RTK_sco_card_t* btusb_snd_init(struct usb_interface *intf, const struct u
     err = snd_card_register(card);
     if (err < 0) {
         RTKBT_ERR("%s: sco snd card register card fail", __func__);
+        snd_card_free(card);
         return NULL;
     }
 
@@ -4102,6 +4407,17 @@ static RTK_sco_card_t* btusb_snd_init(struct usb_interface *intf, const struct u
     INIT_WORK(&pSCOSnd->send_sco_work, playback_work);
     return pSCOSnd;
 }
+
+static void btusb_snd_remove(RTK_sco_card_t  *pSCOSnd)
+{
+    if(!pSCOSnd) {
+        RTKBT_ERR("%s: sco private data is null", __func__);
+        return;
+    }
+    set_bit(DISCONNECTED, &pSCOSnd->states);
+    snd_card_disconnect(pSCOSnd->card);
+    snd_card_free_when_closed(pSCOSnd->card);
+}
 #endif
 
 static int btusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
@@ -4158,9 +4474,8 @@ static int btusb_probe(struct usb_interface *intf, const struct usb_device_id *i
     data->udev = udev;
     data->intf = intf;
 
-    dlfw_dis_state = 0;
     spin_lock_init(&queue_lock);
-    spin_lock_init(&dlfw_lock);
+    spin_lock_init(&running_flag_lock);
     spin_lock_init(&data->lock);
 
     INIT_WORK(&data->work, btusb_work);
@@ -4209,13 +4524,6 @@ static int btusb_probe(struct usb_interface *intf, const struct usb_device_id *i
     hdev->owner = THIS_MODULE;
 #endif
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 1)
-    if (!reset_on_close){
-        /* set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks); */
-        RTKBT_DBG("%s: Set HCI_QUIRK_RESET_ON_CLOSE", __func__);
-    }
-#endif
-
     /* Interface numbers are hardcoded in the specification */
     data->isoc = usb_ifnum_to_if(data->udev, 1);
     if (data->isoc) {
@@ -4270,7 +4578,10 @@ static int btusb_probe(struct usb_interface *intf, const struct usb_device_id *i
         bt_reset = 0; /* Clear and reset it anyway */
 #endif
 
+    load_firmware_info(fw_info);
+
 end:
+    set_driver_state_value(DEVICE_PROBED);
     return 0;
 }
 
@@ -4282,7 +4593,11 @@ static void btusb_disconnect(struct usb_interface *intf)
     if (intf->cur_altsetting->desc.bInterfaceNumber != 0)
         return;
 
-    wait_event_interruptible(bt_dlfw_wait, (check_set_dlfw_state_value(2) == 2));
+    clear_driver_state(DEVICE_PROBED);
+    if((get_driver_state_value() & CHAR_OPENED) == CHAR_OPENED)
+        wake_up_interruptible(&btchr_read_wait);
+
+    wait_event_interruptible(bt_drv_state_wait, ((get_driver_state_value() & CHAR_OPENED) == 0));
 
     RTKBT_INFO("%s: usb_interface %p, bInterfaceNumber %d",
             __func__, intf, intf->cur_altsetting->desc.bInterfaceNumber);
@@ -4299,13 +4614,7 @@ static void btusb_disconnect(struct usb_interface *intf)
 #ifdef CONFIG_SCO_OVER_HCI
     if (intf->cur_altsetting->desc.bInterfaceNumber == 0) {
         RTK_sco_card_t *pSCOSnd = data->pSCOSnd;
-        if(!pSCOSnd) {
-            RTKBT_ERR("%s: sco private data is null", __func__);
-            return;
-        }
-        set_bit(DISCONNECTED, &pSCOSnd->states);
-        snd_card_disconnect(pSCOSnd->card);
-        snd_card_free_when_closed(pSCOSnd->card);
+        btusb_snd_remove(pSCOSnd);
     }
 #endif
 
@@ -4347,7 +4656,7 @@ static void btusb_disconnect(struct usb_interface *intf)
     hci_free_dev(hdev);
     rtk_free(data);
     data = NULL;
-    set_dlfw_state_value(0);
+    set_driver_state_value(0);
 }
 
 #ifdef CONFIG_PM
@@ -4440,7 +4749,7 @@ static int btusb_resume(struct usb_interface *intf)
         return 0;
 
     /*check_fw_version to check the status of the BT Controller after USB Resume*/
-    err = check_fw_version(fw_info);
+    err = check_fw_version(fw_info, true);
     if (err !=0)
     {
         RTKBT_INFO("%s: BT Controller Power OFF And Return hci_hardware_error:%d", __func__, err);
@@ -4516,13 +4825,15 @@ static int __init btusb_init(void)
 
     RTKBT_INFO("RTKBT_RELEASE_NAME: %s",RTKBT_RELEASE_NAME);
     RTKBT_INFO("Realtek Bluetooth USB driver module init, version %s", VERSION);
+    driver_state = 0;
 #if CONFIG_BLUEDROID
     err = btchr_init();
     if (err < 0) {
         /* usb register will go on, even bt char register failed */
         RTKBT_ERR("Failed to register usb char device interfaces");
-    } else
-        bt_char_dev_registered = true;
+    }
+    else
+      set_driver_state_value(DRIVER_ON);
 #endif
     err = usb_register(&btusb_driver);
     if (err < 0)
@@ -4535,16 +4846,14 @@ static void __exit btusb_exit(void)
     struct hci_dev *hdev;
     RTKBT_INFO("Realtek Bluetooth USB driver module exit");
 #if CONFIG_BLUEDROID
+    clear_driver_state(DRIVER_ON);
     hdev = hci_dev_get(0);
-    if (bt_char_dev_registered) {
-        bt_char_dev_registered = false;
-        while(hdev && atomic_read(&hdev->promisc)) {
-            RTKBT_ERR("%s: rtkbt driver is being removed, but application is still running!", __func__);
-            RTKBT_ERR("%s: wait bt application to stop, or the driver can't be removed", __func__);
-            mdelay(100);
-        }
-        btchr_exit();
+    while(hdev && atomic_read(&hdev->promisc)) {
+        RTKBT_ERR("%s: rtkbt driver is being removed, but application is still running!", __func__);
+        RTKBT_ERR("%s: wait bt application to stop, or the driver can't be removed", __func__);
+        mdelay(100);
     }
+    btchr_exit();
 #endif
     usb_deregister(&btusb_driver);
 }
diff --git a/kernel/drivers/bluetooth/rtk_btusb.h b/kernel/drivers/bluetooth/rtk_btusb.h
old mode 100644
new mode 100755
index 7f6222ebba..176f2ba78d
--- a/kernel/drivers/bluetooth/rtk_btusb.h
+++ b/kernel/drivers/bluetooth/rtk_btusb.h
@@ -165,6 +165,7 @@ int mp_drv_mode = 0; /* 1 Mptool Fw; 0 Normal Fw */
 #define ROM_LMP_8723b               0x8723
 #define ROM_LMP_8821a               0X8821
 #define ROM_LMP_8761a               0X8761
+#define ROM_LMP_8761b               0X8761
 #define ROM_LMP_8703a               0x8723
 #define ROM_LMP_8763a               0x8763
 #define ROM_LMP_8703b               0x8703
@@ -172,6 +173,10 @@ int mp_drv_mode = 0; /* 1 Mptool Fw; 0 Normal Fw */
 #define ROM_LMP_8822b               0x8822
 #define ROM_LMP_8723d               0x8723
 #define ROM_LMP_8821c               0x8821
+#define ROM_LMP_8822c               0x8822
+#define ROM_LMP_8852a               0x8852
+#define ROM_LMP_8723f               0x8723
+#define ROM_LMP_8852b               0x8852
 
 /* signature: Realtek */
 const uint8_t RTK_EPATCH_SIGNATURE[8] = {0x52,0x65,0x61,0x6C,0x74,0x65,0x63,0x68};
@@ -190,7 +195,16 @@ uint16_t project_id[] = {
     ROM_LMP_8822b,
     ROM_LMP_8723d,
     ROM_LMP_8821c,
-    ROM_LMP_NONE
+    ROM_LMP_NONE,
+    ROM_LMP_NONE,
+    ROM_LMP_8822c,  //0x0d
+    ROM_LMP_8761b,
+    ROM_LMP_NONE,
+    ROM_LMP_NONE,   //0x10
+    ROM_LMP_NONE,
+    ROM_LMP_8852a,  //0x12
+    ROM_LMP_8723f,
+    ROM_LMP_8852b
 };
 struct rtk_eversion_evt {
     uint8_t status;
@@ -308,45 +322,16 @@ static inline struct sk_buff *bt_skb_alloc(unsigned int len, gfp_t how)
 #define HCI_BREDR    0x00
 #define HCI_AMP        0x01
 
-/* HCI device flags */
-enum {
-    HCI_UP,
-    HCI_INIT,
-    HCI_RUNNING,
-
-    HCI_PSCAN,
-    HCI_ISCAN,
-    HCI_AUTH,
-    HCI_ENCRYPT,
-    HCI_INQUIRY,
-
-    HCI_RAW,
+#define DRIVER_ON           1
+#define DEVICE_PROBED       2
+#define CHAR_OPENED         4
+#define CHAR_DLFW           8
 
-    HCI_RESET,
-};
-
-/*
- * BR/EDR and/or LE controller flags: the flags defined here should represent
- * states from the controller.
- */
+/* HCI device flags */
 enum {
-    HCI_SETUP,
-    HCI_AUTO_OFF,
-    HCI_MGMT,
-    HCI_PAIRABLE,
-    HCI_SERVICE_CACHE,
-    HCI_LINK_KEYS,
-    HCI_DEBUG_KEYS,
+    HCI_UP,           //if char device is opened set this flag, clear flag when close
+    HCI_RUNNING,      //if usb transport has opened set this flag, clear flag when close
     HCI_UNREGISTER,
-
-    HCI_LE_SCAN,
-    HCI_SSP_ENABLED,
-    HCI_HS_ENABLED,
-    HCI_LE_ENABLED,
-    HCI_CONNECTABLE,
-    HCI_DISCOVERABLE,
-    HCI_LINK_SECURITY,
-    HCI_PENDING_CLASS,
 };
 
 /* HCI data types */
@@ -470,8 +455,6 @@ struct hci_dev {
     struct device        *parent;
     struct device        dev;
 
-    unsigned long        dev_flags;
-
     int (*open)(struct hci_dev *hdev);
     int (*close)(struct hci_dev *hdev);
     int (*flush)(struct hci_dev *hdev);
@@ -591,6 +574,7 @@ static inline void hci_set_drvdata(struct hci_dev *hdev, void *data)
 
 #define CONFIG_MAC_OFFSET_GEN_1_2       (0x3C)      //MAC's OFFSET in config/efuse for realtek generation 1~2 bluetooth chip
 #define CONFIG_MAC_OFFSET_GEN_3PLUS     (0x44)      //MAC's OFFSET in config/efuse for rtk generation 3+ bluetooth chip
+#define CONFIG_MAC_OFFSET_GEN_4PLUS     (0x30)      //MAC's OFFSET in config/efuse for rtk generation 4+ bluetooth chip
 
 /*******************************
 **    Reasil patch code
@@ -608,6 +592,7 @@ static inline void hci_set_drvdata(struct hci_dev *hdev, void *data)
 #define EVT_HDR_LEN        sizeof(struct hci_event_hdr)
 #define CMD_CMP_LEN        sizeof(struct hci_ev_cmd_complete)
 #define MAX_PATCH_SIZE_24K (1024*24)
+#define MAX_PATCH_SIZE_25K (1024*25)
 #define MAX_PATCH_SIZE_40K (1024*40)
 
 enum rtk_endpoit {
@@ -659,14 +644,14 @@ typedef struct {
 } __attribute__((packed)) download_rp;
 
 
-
-//Define ioctl cmd the same as HCIDEVUP in the kernel
-#define DOWN_FW_CFG  _IOW('H', 201, int)
+#define DOWN_FW_CFG             _IOW('E', 176, int)
 #ifdef CONFIG_SCO_OVER_HCI
-#define SET_ISO_CFG  _IOW('H', 202, int)
+#define SET_ISO_CFG             _IOW('E', 177, int)
 #endif
-#define GET_USB_INFO            _IOW('H', 203, int)
-#define RESET_CONTROLLER        _IOW('H', 204, int)
+#define RESET_CONTROLLER        _IOW('E', 178, int)
+#define DWFW_CMPLT              _IOW('E', 179, int)
+
+#define GET_USB_INFO            _IOR('E', 180, int)
 
 /*  for altsettings*/
 #include <linux/fs.h>
diff --git a/kernel/scripts/gcc-wrapper.py b/kernel/scripts/gcc-wrapper.py
index 0cc6b423a8..270203e35c 100755
--- a/kernel/scripts/gcc-wrapper.py
+++ b/kernel/scripts/gcc-wrapper.py
@@ -101,7 +101,7 @@ def run_gcc():
         proc = subprocess.Popen(args, stderr=subprocess.PIPE, env=env)
         for line in proc.stderr:
             print (line.decode("utf-8"), end="")
-            interpret_warning(line.decode("utf-8"))
+            #interpret_warning(line.decode("utf-8"))
         if do_exit:
             sys.exit(1)
 

commit 938cbeba7fb61ed6e335f0f603a70605440ce7e4
Author: Weber Ko _O (q) <weber.ko@coretronic.com>
Date:   Fri May 20 18:23:10 2022 +0800

    1.Fixed bug about rk805 power init
    2.change to bt rtk usb driver (still not ready)

diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3328-coretronic.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3328-coretronic.dtsi
index 70f0ba14d8..c2b154b9d1 100755
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3328-coretronic.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3328-coretronic.dtsi
@@ -57,28 +57,6 @@
 		};
 	};
 
-	regulators {
-		compatible = "simple-bus";
-		#address-cells = <1>;
-		#size-cells = <0>;
-
-		vccio_1v8_reg: regulator@0 {
-			compatible = "regulator-fixed";
-			regulator-name = "vccio_1v8";
-			regulator-min-microvolt = <1800000>;
-			regulator-max-microvolt = <1800000>;
-			regulator-always-on;
-		};
-
-		vccio_3v3_reg: regulator@1 {
-			compatible = "regulator-fixed";
-			regulator-name = "vccio_3v3";
-			regulator-min-microvolt = <3300000>;
-			regulator-max-microvolt = <3300000>;
-			regulator-always-on;
-		};
-	};
-
 	rtc-fake {
 		compatible = "rtc-fake";
 		status = "okay";
@@ -99,7 +77,16 @@
 		compatible = "linux,spdif-dit";
 		#sound-dai-cells = <0>;
 	};
-
+	
+    vcc_sys5v0: vcc-sys5v0 {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc_sys5v0";
+	    regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		regulator-always-on;
+		regulator-boot-on;
+	};
+	
 	vcc_host_vbus: host-vbus-regulator {
 		compatible = "regulator-fixed";
 		gpio = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>;
@@ -137,35 +124,17 @@
 		regulator-name = "vcc_sd";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		vin-supply = <&vccio_3v3_reg>;
+		vin-supply = <&vcc_io>;
 	};
 
-	vdd_arm: vdd-center {
-		compatible = "pwm-regulator";
-		rockchip,pwm_id = <0>;
-		rockchip,pwm_voltage = <1250000>;
-		pwms = <&pwm0 0 5000 1>;
-		regulator-name = "vcc_arm";
-		regulator-min-microvolt = <950000>;
-		regulator-max-microvolt = <1400000>;
-		regulator-settling-time-up-us = <250>;
-		regulator-always-on;
-		regulator-boot-on;
-	};
-
-	vdd_logic: vdd-log {
-		compatible = "pwm-regulator";
-		rockchip,pwm_id = <1>;
-		rockchip,pwm_voltage = <1100000>;
-		pwms = <&pwm1 0 5000 1>;
-		regulator-name = "vcc_log";
-		regulator-min-microvolt = <900000>;
-		regulator-max-microvolt = <1300000>;
-		regulator-settling-time-up-us = <250>;
-		regulator-always-on;
-		regulator-boot-on;
+	xin32k: xin32k {
+		compatible = "fixed-clock";
+		clock-frequency = <32768>;
+		clock-output-names = "xin32k";
+		#clock-cells = <0>;
 	};
-
+	
+	
 	wireless-bluetooth {
 		compatible = "bluetooth-platdata";
 		uart_rts_gpios = <&gpio1 10 GPIO_ACTIVE_LOW>;
@@ -180,7 +149,7 @@
 	wireless-wlan {
 		compatible = "wlan-platdata";
 		rockchip,grf = <&grf>;
-		wifi_chip_type = "rtl8821cu";
+		wifi_chip_type = "rtl8822bs";
 		sdio_vref = <1800>;
 		WIFI,host_wake_irq = <&gpio1 19 GPIO_ACTIVE_HIGH>;
 		status = "okay";
@@ -213,10 +182,10 @@
 		SYS_STATUS_REBOOT       786000
 		SYS_STATUS_SUSPEND      786000
 		SYS_STATUS_VIDEO_1080P  786000
-		SYS_STATUS_VIDEO_4K     933000
-		SYS_STATUS_VIDEO_4K_10B 933000
-		SYS_STATUS_PERFORMANCE  933000
-		SYS_STATUS_BOOST        933000
+		SYS_STATUS_VIDEO_4K     786000
+		SYS_STATUS_VIDEO_4K_10B 786000
+		SYS_STATUS_PERFORMANCE  786000
+		SYS_STATUS_BOOST        786000
 	>;
 };
 
@@ -230,7 +199,7 @@
 	};
 
 	opp-933000000 {
-		status = "okay";
+		status = "disabled";
 	};
 
 	opp-1066000000 {
@@ -299,6 +268,138 @@
 	status = "okay";
 };
 
+&i2c1 {
+	status = "okay";
+
+	rk805: rk805@18 {
+		compatible = "rockchip,rk805";
+		status = "okay";
+		reg = <0x18>;
+		interrupt-parent = <&gpio2>;
+		interrupts = <6 IRQ_TYPE_LEVEL_LOW>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&pmic_int_l>;
+		wakeup-source;
+		gpio-controller;
+		#gpio-cells = <2>;
+		#clock-cells = <1>;
+		clock-output-names = "rk805-clkout1", "rk805-clkout2";
+        vcc1-supply = <&vcc_sys5v0>;
+        vcc2-supply = <&vcc_sys5v0>;
+        vcc3-supply = <&vcc_sys5v0>;
+        vcc4-supply = <&vcc_sys5v0>;
+        vcc5-supply = <&vcc_io>;
+        vcc6-supply = <&vcc_io>;
+		rtc {
+			status = "disabled";
+		};
+
+		pwrkey {
+			status = "disabled";
+		};
+
+		gpio {
+			status = "okay";
+		};
+
+        
+		regulators {
+			vdd_logic: DCDC_REG1 {
+				regulator-name = "vdd_logic";
+				regulator-init-microvolt = <1150000>;
+				regulator-min-microvolt = <712500>;
+				regulator-max-microvolt = <1450000>;
+				regulator-initial-mode = <0x1>;
+				regulator-ramp-delay = <12500>;
+				regulator-boot-on;
+				regulator-always-on;
+				regulator-state-mem {
+					regulator-mode = <0x2>;
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <1000000>;
+				};
+			};
+
+			vdd_arm: DCDC_REG2 {
+				regulator-name = "vdd_arm";
+				regulator-init-microvolt = <1225000>;
+				regulator-min-microvolt = <712500>;
+				regulator-max-microvolt = <1450000>;
+				regulator-initial-mode = <0x1>;
+				regulator-ramp-delay = <12500>;
+				regulator-boot-on;
+				regulator-always-on;
+				regulator-state-mem {
+					regulator-mode = <0x2>;
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <950000>;
+				};
+			};
+
+			vcc_ddr: DCDC_REG3 {
+				regulator-name = "vcc_ddr";
+				regulator-initial-mode = <0x1>;
+				regulator-boot-on;
+				regulator-always-on;
+				regulator-state-mem {
+					regulator-mode = <0x2>;
+					regulator-on-in-suspend;
+				};
+			};
+
+			vcc_io: DCDC_REG4 {
+				regulator-name = "vcc_io";
+				regulator-min-microvolt = <3300000>;
+				regulator-max-microvolt = <3300000>;
+				regulator-initial-mode = <0x1>;
+				regulator-boot-on;
+				regulator-always-on;
+				regulator-state-mem {
+					regulator-mode = <0x2>;
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <3300000>;
+				};
+			};
+
+			vdd_18: LDO_REG1 {
+				regulator-name = "vdd_18";
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <1800000>;
+				regulator-boot-on;
+				regulator-always-on;
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <1800000>;
+				};
+			};
+
+			vcc_18emmc: LDO_REG2 {
+				regulator-name = "vcc_18emmc";
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <1800000>;
+				regulator-boot-on;
+				regulator-always-on;
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <1800000>;
+				};
+			};
+
+			vdd_11: LDO_REG3 {
+				regulator-name = "vdd_11";
+				regulator-min-microvolt = <1100000>;
+				regulator-max-microvolt = <1100000>;
+				regulator-boot-on;
+				regulator-always-on;
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <1100000>;
+				};
+			};
+		};
+	};
+};
+
 &secure_memory {
 	/*
 	 * enable like this:
@@ -329,13 +430,13 @@
 &io_domains {
 	status = "okay";
 
-	vccio1-supply = <&vccio_3v3_reg>;
-	vccio2-supply = <&vccio_1v8_reg>;
-	vccio3-supply = <&vccio_3v3_reg>;
-	vccio4-supply = <&vccio_1v8_reg>;
-	vccio5-supply = <&vccio_3v3_reg>;
-	vccio6-supply = <&vccio_3v3_reg>;
-	pmuio-supply = <&vccio_3v3_reg>;
+	vccio1-supply = <&vcc_io>;
+	vccio2-supply = <&vcc_18emmc>;
+	vccio3-supply = <&vcc_io>;
+	vccio4-supply = <&vdd_18>;
+	vccio5-supply = <&vcc_io>;
+	vccio6-supply = <&vcc_io>;
+	pmuio-supply = <&vcc_io>;
 };
 
 &mpp_srv {
@@ -343,10 +444,17 @@
 };
 
 &pinctrl {
+
+	pmic {
+		pmic_int_l: pmic-int-l {
+		rockchip,pins =
+			<2 RK_PA6 RK_FUNC_GPIO &pcfg_pull_up>;	/* gpio2_a6 */
+		};
+	};
 	sdio-pwrseq {
 		wifi_enable_h: wifi-enable-h {
 		rockchip,pins =
-			<1 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none>;
+			<1 18 RK_FUNC_GPIO &pcfg_pull_none>;
 		};
 	};
 
@@ -365,23 +473,11 @@
 	wireless-bluetooth {
 		uart0_gpios: uart0-gpios {
 		rockchip,pins =
-			<1 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>;
+			<1 10 RK_FUNC_GPIO &pcfg_pull_none>;
 		};
 	};
 };
 
-&pwm0 {
-	status = "okay";
-	pinctrl-names = "active";
-	pinctrl-0 = <&pwm0_pin_pull_up>;
-};
-
-&pwm1 {
-	status = "okay";
-	pinctrl-names = "active";
-	pinctrl-0 = <&pwm1_pin_pull_up>;
-};
-
 &pwm3 {
 	status = "okay";
 	pinctrl-names = "default";
diff --git a/kernel/arch/arm64/configs/rockchip_defconfig b/kernel/arch/arm64/configs/rockchip_defconfig
index 42914f26c8..4d2cd311d3 100755
--- a/kernel/arch/arm64/configs/rockchip_defconfig
+++ b/kernel/arch/arm64/configs/rockchip_defconfig
@@ -255,6 +255,7 @@ CONFIG_BT_BNEP=y
 CONFIG_BT_BNEP_MC_FILTER=y
 CONFIG_BT_BNEP_PROTO_FILTER=y
 CONFIG_BT_HIDP=y
+CONFIG_BT_RTKBTUSB=y
 CONFIG_BT_HCIUART=y
 CONFIG_BT_HCIUART_H4=y
 CONFIG_RFKILL=y
diff --git a/kernel/drivers/bluetooth/Kconfig b/kernel/drivers/bluetooth/Kconfig
old mode 100644
new mode 100755
index 845b0314ce..b06a386153
--- a/kernel/drivers/bluetooth/Kconfig
+++ b/kernel/drivers/bluetooth/Kconfig
@@ -19,6 +19,13 @@ config BT_QCA
 	tristate
 	select FW_LOADER
 
+config BT_RTKBTUSB
+	tristate "RTK HCI USB driver"
+	depends on USB
+	help
+	  RTK Bluetooth HCI USB driver
+
+
 config BT_HCIBTUSB
 	tristate "HCI USB driver"
 	depends on USB
@@ -223,6 +230,8 @@ config BT_HCIUART_QCA
 
 	  Say Y here to compile support for QCA protocol.
 
+
+
 config BT_HCIUART_AG6XX
 	bool "Intel AG6XX protocol support"
 	depends on BT_HCIUART
diff --git a/kernel/drivers/bluetooth/Makefile b/kernel/drivers/bluetooth/Makefile
old mode 100644
new mode 100755
index b7e393cfc1..554ca6aa04
--- a/kernel/drivers/bluetooth/Makefile
+++ b/kernel/drivers/bluetooth/Makefile
@@ -13,6 +13,7 @@ obj-$(CONFIG_BT_HCIBT3C)	+= bt3c_cs.o
 obj-$(CONFIG_BT_HCIBLUECARD)	+= bluecard_cs.o
 
 obj-$(CONFIG_BT_HCIBTUSB)	+= btusb.o
+obj-$(CONFIG_BT_RTKBTUSB)	+= rtk_btusb.o
 obj-$(CONFIG_BT_HCIBTSDIO)	+= btsdio.o
 
 obj-$(CONFIG_BT_INTEL)		+= btintel.o
diff --git a/kernel/include/linux/usb.h b/kernel/include/linux/usb.h
old mode 100644
new mode 100755
index 75d7cc50b4..63d1912717
--- a/kernel/include/linux/usb.h
+++ b/kernel/include/linux/usb.h
@@ -257,6 +257,7 @@ struct usb_interface {
 
 	struct device dev;		/* interface specific device info */
 	struct device *usb_dev;
+	atomic_t pm_usage_cnt;		/* usage counter for autosuspend */
 	struct work_struct reset_ws;	/* for resets in atomic context */
 
 	ANDROID_KABI_RESERVE(1);
diff --git a/kernel/out/kernel b/kernel/out/kernel
index dd0078f29b..47265a11eb 100644
Binary files a/kernel/out/kernel and b/kernel/out/kernel differ
diff --git a/kernel/out/second b/kernel/out/second
index 60367e5787..75d6fefcaf 100644
Binary files a/kernel/out/second and b/kernel/out/second differ
diff --git a/kernel/out/unpack.log b/kernel/out/unpack.log
index 5dfe83138e..f16b80ca55 100644
--- a/kernel/out/unpack.log
+++ b/kernel/out/unpack.log
@@ -1,9 +1,9 @@
 boot_magic: ANDROID!
-kernel_size: 31744008
+kernel_size: 31748104
 kernel load address: 0x10008000
 ramdisk size: 837959
 ramdisk load address: 0x11000000
-second bootloader size: 112128
+second bootloader size: 4228608
 second bootloader load address: 0x10f00000
 kernel tags load address: 0x10000100
 page size: 2048

commit 8489f1ff13785dfb5dad9f2c059677335b1043f1
Author: Weber Ko _O (q) <weber.ko@coretronic.com>
Date:   Thu May 19 15:57:28 2022 +0800

    1.Correct DDR ,CPU , VPU settings
    2.Update new rtl8821c bt firmware & config
    3.Fixed audio volume to max
    4.Change default usb port to otg (host have problem need to fix)
    5.Change logo
    6.Set enableFadingMarquee to false

diff --git a/kernel/.gitignore b/kernel/.gitignore
index f2f21dd93b..3fe6a4af9d 100644
--- a/kernel/.gitignore
+++ b/kernel/.gitignore
@@ -136,3 +136,7 @@ all.config
 
 # Kdevelop4
 *.kdev4
+
+#out
+/out/
+
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3328-box-liantong.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3328-box-liantong.dtsi
old mode 100644
new mode 100755
index b512dd9150..365b5407e5
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3328-box-liantong.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3328-box-liantong.dtsi
@@ -392,98 +392,27 @@
 	remote_support_psci = <1>;
 
 	ir_key1 {
-		rockchip,usercode = <0x4040>;
+		rockchip,usercode = <0xeb80>;
 		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>;
+			<0xe2	KEY_BACK>,
+			<0xbf	KEY_UP>,
+			<0xbe	KEY_DOWN>,
+			<0xbd	KEY_LEFT>,
+			<0xbc	KEY_RIGHT>,
+			<0xec	KEY_ENTER>,
+			<0xb5 	KEY_HOME>,
+			<0xe4 	KEY_MENU>,
+			<0xb2	388>, //mouse
+			<0xb3	KEY_1>, //1
+			<0xd8	KEY_2>, //2
+			<0xba	KEY_3>, //3
+			<0xa5	KEY_4>, //4
+			<0xca	KEY_5>, //5
+			<0xfc	KEY_6>, //6
+			<0xfb	KEY_7>, //7
+			<0xc7	KEY_8>, //8
+			<0xf9	KEY_9>, //9
+			<0xcf	KEY_0>; //0			
 	};
 };
 
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3328-coretronic.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3328-coretronic.dtsi
index ce9fb81a4e..70f0ba14d8 100755
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3328-coretronic.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3328-coretronic.dtsi
@@ -57,6 +57,28 @@
 		};
 	};
 
+	regulators {
+		compatible = "simple-bus";
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		vccio_1v8_reg: regulator@0 {
+			compatible = "regulator-fixed";
+			regulator-name = "vccio_1v8";
+			regulator-min-microvolt = <1800000>;
+			regulator-max-microvolt = <1800000>;
+			regulator-always-on;
+		};
+
+		vccio_3v3_reg: regulator@1 {
+			compatible = "regulator-fixed";
+			regulator-name = "vccio_3v3";
+			regulator-min-microvolt = <3300000>;
+			regulator-max-microvolt = <3300000>;
+			regulator-always-on;
+		};
+	};
+
 	rtc-fake {
 		compatible = "rtc-fake";
 		status = "okay";
@@ -115,16 +137,35 @@
 		regulator-name = "vcc_sd";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		vin-supply = <&vcc_io>;
+		vin-supply = <&vccio_3v3_reg>;
 	};
 
-	xin32k: xin32k {
-		compatible = "fixed-clock";
-		clock-frequency = <32768>;
-		clock-output-names = "xin32k";
-		#clock-cells = <0>;
+	vdd_arm: vdd-center {
+		compatible = "pwm-regulator";
+		rockchip,pwm_id = <0>;
+		rockchip,pwm_voltage = <1250000>;
+		pwms = <&pwm0 0 5000 1>;
+		regulator-name = "vcc_arm";
+		regulator-min-microvolt = <950000>;
+		regulator-max-microvolt = <1400000>;
+		regulator-settling-time-up-us = <250>;
+		regulator-always-on;
+		regulator-boot-on;
+	};
+
+	vdd_logic: vdd-log {
+		compatible = "pwm-regulator";
+		rockchip,pwm_id = <1>;
+		rockchip,pwm_voltage = <1100000>;
+		pwms = <&pwm1 0 5000 1>;
+		regulator-name = "vcc_log";
+		regulator-min-microvolt = <900000>;
+		regulator-max-microvolt = <1300000>;
+		regulator-settling-time-up-us = <250>;
+		regulator-always-on;
+		regulator-boot-on;
 	};
-	
+
 	wireless-bluetooth {
 		compatible = "bluetooth-platdata";
 		uart_rts_gpios = <&gpio1 10 GPIO_ACTIVE_LOW>;
@@ -133,13 +174,13 @@
 		pinctrl-1 = <&uart0_gpios>;
 		BT,power_gpio = <&gpio1 24 GPIO_ACTIVE_HIGH>;
 		BT,wake_host_irq = <&gpio1 26 GPIO_ACTIVE_HIGH>;
-		status = "okay";
+		status = "disabled";
 	};
 
 	wireless-wlan {
 		compatible = "wlan-platdata";
 		rockchip,grf = <&grf>;
-		wifi_chip_type = "rtl8822bs";
+		wifi_chip_type = "rtl8821cu";
 		sdio_vref = <1800>;
 		WIFI,host_wake_irq = <&gpio1 19 GPIO_ACTIVE_HIGH>;
 		status = "okay";
@@ -258,143 +299,6 @@
 	status = "okay";
 };
 
-&i2c1 {
-	status = "okay";
-
-	rk805: rk805@18 {
-		compatible = "rockchip,rk805";
-		status = "okay";
-		reg = <0x18>;
-		interrupt-parent = <&gpio2>;
-		interrupts = <6 IRQ_TYPE_LEVEL_LOW>;
-		pinctrl-names = "default";
-		pinctrl-0 = <&pmic_int_l>;
-		wakeup-source;
-		gpio-controller;
-		#gpio-cells = <2>;
-		#clock-cells = <1>;
-		clock-output-names = "rk805-clkout1", "rk805-clkout2";
-
-		rtc {
-			status = "disabled";
-		};
-
-		pwrkey {
-			status = "disabled";
-		};
-
-		gpio {
-			status = "okay";
-		};
-
-		regulators {
-			compatible = "rk805-regulator";
-			status = "okay";
-			#address-cells = <1>;
-			#size-cells = <0>;
-
-			vdd_logic: RK805_DCDC1 {
-				regulator-compatible = "RK805_DCDC1";
-				regulator-name = "vdd_logic";
-				regulator-min-microvolt = <712500>;
-				regulator-max-microvolt = <1450000>;
-				regulator-initial-mode = <0x1>;
-				regulator-ramp-delay = <12500>;
-				regulator-boot-on;
-				regulator-always-on;
-				regulator-state-mem {
-					regulator-mode = <0x2>;
-					regulator-on-in-suspend;
-					regulator-suspend-microvolt = <1000000>;
-				};
-			};
-
-			vdd_arm: RK805_DCDC2 {
-				regulator-compatible = "RK805_DCDC2";
-				regulator-name = "vdd_arm";
-				regulator-init-microvolt = <1225000>;
-				regulator-min-microvolt = <712500>;
-				regulator-max-microvolt = <1450000>;
-				regulator-initial-mode = <0x1>;
-				regulator-ramp-delay = <12500>;
-				regulator-boot-on;
-				regulator-always-on;
-				regulator-state-mem {
-					regulator-mode = <0x2>;
-					regulator-on-in-suspend;
-					regulator-suspend-microvolt = <950000>;
-				};
-			};
-
-			vcc_ddr: RK805_DCDC3 {
-				regulator-compatible = "RK805_DCDC3";
-				regulator-name = "vcc_ddr";
-				regulator-initial-mode = <0x1>;
-				regulator-boot-on;
-				regulator-always-on;
-				regulator-state-mem {
-					regulator-mode = <0x2>;
-					regulator-on-in-suspend;
-				};
-			};
-
-			vcc_io: RK805_DCDC4 {
-				regulator-compatible = "RK805_DCDC4";
-				regulator-name = "vcc_io";
-				regulator-min-microvolt = <3300000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-initial-mode = <0x1>;
-				regulator-boot-on;
-				regulator-always-on;
-				regulator-state-mem {
-					regulator-mode = <0x2>;
-					regulator-on-in-suspend;
-					regulator-suspend-microvolt = <3300000>;
-				};
-			};
-
-			vdd_18: RK805_LDO1 {
-				regulator-compatible = "RK805_LDO1";
-				regulator-name = "vdd_18";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-boot-on;
-				regulator-always-on;
-				regulator-state-mem {
-					regulator-on-in-suspend;
-					regulator-suspend-microvolt = <1800000>;
-				};
-			};
-
-			vcc_18emmc: RK805_LDO2 {
-				regulator-compatible = "RK805_LDO2";
-				regulator-name = "vcc_18emmc";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-boot-on;
-				regulator-always-on;
-				regulator-state-mem {
-					regulator-on-in-suspend;
-					regulator-suspend-microvolt = <1800000>;
-				};
-			};
-
-			vdd_11: RK805_LDO3 {
-				regulator-compatible = "RK805_LDO3";
-				regulator-name = "vdd_11";
-				regulator-min-microvolt = <1100000>;
-				regulator-max-microvolt = <1100000>;
-				regulator-boot-on;
-				regulator-always-on;
-				regulator-state-mem {
-					regulator-on-in-suspend;
-					regulator-suspend-microvolt = <1100000>;
-				};
-			};
-		};
-	};
-};
-
 &secure_memory {
 	/*
 	 * enable like this:
@@ -425,13 +329,13 @@
 &io_domains {
 	status = "okay";
 
-	vccio1-supply = <&vcc_io>;
-	vccio2-supply = <&vcc_18emmc>;
-	vccio3-supply = <&vcc_io>;
-	vccio4-supply = <&vdd_18>;
-	vccio5-supply = <&vcc_io>;
-	vccio6-supply = <&vcc_io>;
-	pmuio-supply = <&vcc_io>;
+	vccio1-supply = <&vccio_3v3_reg>;
+	vccio2-supply = <&vccio_1v8_reg>;
+	vccio3-supply = <&vccio_3v3_reg>;
+	vccio4-supply = <&vccio_1v8_reg>;
+	vccio5-supply = <&vccio_3v3_reg>;
+	vccio6-supply = <&vccio_3v3_reg>;
+	pmuio-supply = <&vccio_3v3_reg>;
 };
 
 &mpp_srv {
@@ -439,17 +343,10 @@
 };
 
 &pinctrl {
-
-	pmic {
-		pmic_int_l: pmic-int-l {
-		rockchip,pins =
-			<2 RK_PA6 RK_FUNC_GPIO &pcfg_pull_up>;	/* gpio2_a6 */
-		};
-	};
 	sdio-pwrseq {
 		wifi_enable_h: wifi-enable-h {
 		rockchip,pins =
-			<1 18 RK_FUNC_GPIO &pcfg_pull_none>;
+			<1 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none>;
 		};
 	};
 
@@ -468,11 +365,23 @@
 	wireless-bluetooth {
 		uart0_gpios: uart0-gpios {
 		rockchip,pins =
-			<1 10 RK_FUNC_GPIO &pcfg_pull_none>;
+			<1 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>;
 		};
 	};
 };
 
+&pwm0 {
+	status = "okay";
+	pinctrl-names = "active";
+	pinctrl-0 = <&pwm0_pin_pull_up>;
+};
+
+&pwm1 {
+	status = "okay";
+	pinctrl-names = "active";
+	pinctrl-0 = <&pwm1_pin_pull_up>;
+};
+
 &pwm3 {
 	status = "okay";
 	pinctrl-names = "default";
@@ -630,7 +539,6 @@
 
 &usb20_otg {
 	status = "okay";
-	dr_mode = "host";
 };
 
 &usb_host0_ehci {
@@ -647,7 +555,6 @@
 
 &usbdrd_dwc3 {
 	status = "okay";
-	dr_mode = "host";
 };
 
 &vdpu {
diff --git a/kernel/drivers/usb/gadget/function/f_fs.c b/kernel/drivers/usb/gadget/function/f_fs.c
old mode 100644
new mode 100755
diff --git a/kernel/logo.bmp b/kernel/logo.bmp
old mode 100644
new mode 100755
index 750a0bb180..75194219b1
Binary files a/kernel/logo.bmp and b/kernel/logo.bmp differ
diff --git a/kernel/logo_kernel.bmp b/kernel/logo_kernel.bmp
old mode 100644
new mode 100755
index 1afef1ed15..75194219b1
Binary files a/kernel/logo_kernel.bmp and b/kernel/logo_kernel.bmp differ
diff --git a/kernel/out/kernel b/kernel/out/kernel
index d557126bd6..dd0078f29b 100644
Binary files a/kernel/out/kernel and b/kernel/out/kernel differ
diff --git a/kernel/out/second b/kernel/out/second
index 1a3364d935..60367e5787 100644
Binary files a/kernel/out/second and b/kernel/out/second differ
diff --git a/kernel/out/unpack.log b/kernel/out/unpack.log
index f22a3c4bcb..5dfe83138e 100644
--- a/kernel/out/unpack.log
+++ b/kernel/out/unpack.log
@@ -3,7 +3,7 @@ kernel_size: 31744008
 kernel load address: 0x10008000
 ramdisk size: 837959
 ramdisk load address: 0x11000000
-second bootloader size: 114176
+second bootloader size: 112128
 second bootloader load address: 0x10f00000
 kernel tags load address: 0x10000100
 page size: 2048


commit 7e5049f87ece38852a1518d8082dadad8d857f58
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Sat Dec 25 21:35:26 2021 +0800

    drm/rockchip: ebc_dev: release version v2.23
    
    fix epd_overlay_lut err when use .S files
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: Id5d398916938a0323e331982ece571fcbd890f2d

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index a2a1953c685c..5b679527191a 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -21,7 +21,7 @@ __initcall_ebc_init6s:
 	.p2align 3,,7
 	.type	get_auto_image, %function
 get_auto_image:
-.LFB2815:
+.LFB2814:
 	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
 	.loc 1 525 0
 	.cfi_startproc
@@ -523,13 +523,13 @@ get_auto_image:
 	.cfi_restore 30
 	ret
 	.cfi_endproc
-.LFE2815:
+.LFE2814:
 	.size	get_auto_image, .-get_auto_image
 	.align	2
 	.p2align 3,,7
 	.type	get_overlay_image, %function
 get_overlay_image:
-.LFB2816:
+.LFB2815:
 	.loc 1 690 0
 	.cfi_startproc
 .LVL32:
@@ -1112,13 +1112,13 @@ get_overlay_image:
 .LVL61:
 	b	.L71
 	.cfi_endproc
-.LFE2816:
+.LFE2815:
 	.size	get_overlay_image, .-get_overlay_image
 	.align	2
 	.p2align 3,,7
 	.type	waveform_open, %function
 waveform_open:
-.LFB2847:
+.LFB2846:
 	.loc 1 2619 0
 	.cfi_startproc
 .LVL62:
@@ -1130,13 +1130,13 @@ waveform_open:
 	.loc 1 2623 0
 	ret
 	.cfi_endproc
-.LFE2847:
+.LFE2846:
 	.size	waveform_open, .-waveform_open
 	.section	.exit.text,"ax",@progbits
 	.align	2
 	.type	ebc_exit, %function
 ebc_exit:
-.LFB2867:
+.LFB2866:
 	.loc 1 3190 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
@@ -1159,14 +1159,14 @@ ebc_exit:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2867:
+.LFE2866:
 	.size	ebc_exit, .-ebc_exit
 	.text
 	.align	2
 	.p2align 3,,7
 	.type	ebc_resume, %function
 ebc_resume:
-.LFB2865:
+.LFB2864:
 	.loc 1 3152 0
 	.cfi_startproc
 .LVL65:
@@ -1178,17 +1178,17 @@ ebc_resume:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-.LBB1011:
-.LBB1012:
+.LBB1009:
+.LBB1010:
 	.file 2 "./include/linux/device.h"
 	.loc 2 1181 0
 	ldr	x19, [x0, 184]
-.LBE1012:
-.LBE1011:
+.LBE1010:
+.LBE1009:
 	.loc 1 3156 0
 	ldr	x1, [x19, 16]
-.LBB1013:
-.LBB1014:
+.LBB1011:
+.LBB1012:
 	.file 3 "drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic.h"
 	.loc 3 45 0
 	mov	x0, x1
@@ -1196,8 +1196,8 @@ ebc_resume:
 	ldr	x1, [x1, 48]
 	blr	x1
 .LVL67:
-.LBE1014:
-.LBE1013:
+.LBE1012:
+.LBE1011:
 	.loc 1 3157 0
 	str	wzr, [x19, 804]
 	.loc 1 3158 0
@@ -1216,13 +1216,13 @@ ebc_resume:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2865:
+.LFE2864:
 	.size	ebc_resume, .-ebc_resume
 	.align	2
 	.p2align 3,,7
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
-.LFB2840:
+.LFB2839:
 	.loc 1 2272 0
 	.cfi_startproc
 .LVL69:
@@ -1241,25 +1241,25 @@ ebc_vdd_power_timeout:
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-.LBB1015:
-.LBB1016:
+.LBB1013:
+.LBB1014:
 	.file 4 "./include/linux/wakelock.h"
 	.loc 4 68 0
 	add	x0, x0, 416
-.LBE1016:
-.LBE1015:
+.LBE1014:
+.LBE1013:
 	.loc 1 2272 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	.loc 1 2276 0
 	str	wzr, [x0, 208]
-.LBB1018:
-.LBB1017:
+.LBB1016:
+.LBB1015:
 	.loc 4 68 0
 	bl	__pm_relax
 .LVL71:
-.LBE1017:
-.LBE1018:
+.LBE1015:
+.LBE1016:
 	.loc 1 2281 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -1267,13 +1267,13 @@ ebc_vdd_power_timeout:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2840:
+.LFE2839:
 	.size	ebc_vdd_power_timeout, .-ebc_vdd_power_timeout
 	.align	2
 	.p2align 3,,7
 	.type	ebc_remove, %function
 ebc_remove:
-.LFB2863:
+.LFB2862:
 	.loc 1 3128 0
 	.cfi_startproc
 .LVL72:
@@ -1302,13 +1302,13 @@ ebc_remove:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2863:
+.LFE2862:
 	.size	ebc_remove, .-ebc_remove
 	.align	2
 	.p2align 3,,7
 	.type	ebc_mmap, %function
 ebc_mmap:
-.LFB2844:
+.LFB2843:
 	.loc 1 2565 0
 	.cfi_startproc
 .LVL75:
@@ -1357,13 +1357,13 @@ ebc_mmap:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2844:
+.LFE2843:
 	.size	ebc_mmap, .-ebc_mmap
 	.align	2
 	.p2align 3,,7
 	.type	waveform_mmap, %function
 waveform_mmap:
-.LFB2846:
+.LFB2845:
 	.loc 1 2603 0
 	.cfi_startproc
 .LVL79:
@@ -1412,13 +1412,13 @@ waveform_mmap:
 	csel	w0, w0, w1, eq
 	ret
 	.cfi_endproc
-.LFE2846:
+.LFE2845:
 	.size	waveform_mmap, .-waveform_mmap
 	.align	2
 	.p2align 3,,7
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
-.LFB2843:
+.LFB2842:
 	.loc 1 2357 0
 	.cfi_startproc
 .LVL83:
@@ -1503,13 +1503,13 @@ ebc_io_ctl:
 	bl	ebc_phy_buf_base_get
 .LVL87:
 	sub	w0, w21, w0
+.LBB1017:
+.LBB1018:
 .LBB1019:
 .LBB1020:
 .LBB1021:
 .LBB1022:
 .LBB1023:
-.LBB1024:
-.LBB1025:
 	.file 5 "./arch/arm64/include/asm/current.h"
 	.loc 5 19 0
 #APP
@@ -1518,27 +1518,27 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL88:
 #NO_APP
-.LBE1025:
-.LBE1024:
+.LBE1023:
+.LBE1022:
 	.file 6 "./arch/arm64/include/asm/uaccess.h"
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1023:
-.LBE1022:
 .LBE1021:
 .LBE1020:
 .LBE1019:
+.LBE1018:
+.LBE1017:
 	.loc 1 2548 0
 	ldp	w1, w4, [x22, 84]
 	.loc 1 2547 0
 	str	w0, [x29, 120]
 	.loc 1 2549 0
 	stp	w4, w1, [x29, 128]
-.LBB1050:
-.LBB1047:
-.LBB1044:
-.LBB1034:
+.LBB1048:
+.LBB1045:
+.LBB1042:
 .LBB1032:
+.LBB1030:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL89:
@@ -1546,47 +1546,47 @@ ebc_io_ctl:
 	tbnz	x3, 21, .L244
 .LVL90:
 .L316:
+.LBB1024:
+.LBB1025:
 .LBB1026:
-.LBB1027:
-.LBB1028:
 	.file 7 "./include/asm-generic/bitops/non-atomic.h"
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL91:
-.LBE1028:
-.LBE1027:
 .LBE1026:
+.LBE1025:
+.LBE1024:
+.LBE1030:
 .LBE1032:
-.LBE1034:
-.LBE1044:
-.LBE1047:
-.LBE1050:
+.LBE1042:
+.LBE1045:
+.LBE1048:
 	.loc 1 2358 0
 	mov	x0, x20
 .LVL92:
-.LBB1051:
-.LBB1048:
-.LBB1045:
-.LBB1035:
+.LBB1049:
+.LBB1046:
+.LBB1043:
 .LBB1033:
+.LBB1031:
 	.loc 6 84 0
 	tbz	x2, 26, .L245
 .LVL93:
 .L244:
+.LBB1027:
+.LBB1028:
 .LBB1029:
-.LBB1030:
-.LBB1031:
 	.file 8 "./include/linux/bitops.h"
 	.loc 8 157 0
 	sbfx	x0, x20, 0, 56
 .LVL94:
-.LBE1031:
-.LBE1030:
+.LBE1029:
+.LBE1028:
 	.loc 6 86 0
 	and	x0, x0, x20
 .LVL95:
 .L245:
-.LBE1029:
+.LBE1027:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1599,16 +1599,16 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL96:
 #NO_APP
+.LBE1031:
 .LBE1033:
-.LBE1035:
 	.file 9 "./include/linux/uaccess.h"
 	.loc 9 132 0
 	mov	x22, 64
 	cbnz	x0, .L324
 .L246:
-.LBE1045:
-.LBE1048:
-.LBE1051:
+.LBE1043:
+.LBE1046:
+.LBE1049:
 	.loc 1 2551 0
 	mov	x0, x23
 .LVL97:
@@ -1703,13 +1703,13 @@ ebc_io_ctl:
 	mov	w0, 28673
 	cmp	w1, w0
 	bne	.L180
+.LBB1050:
+.LBB1051:
 .LBB1052:
 .LBB1053:
 .LBB1054:
 .LBB1055:
 .LBB1056:
-.LBB1057:
-.LBB1058:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1717,8 +1717,8 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL110:
 #NO_APP
-.LBE1058:
-.LBE1057:
+.LBE1056:
+.LBE1055:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
@@ -1728,19 +1728,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L327
 .LVL112:
 .L212:
+.LBB1057:
+.LBB1058:
 .LBB1059:
-.LBB1060:
-.LBB1061:
 	.loc 8 157 0
 	sbfx	x0, x20, 0, 56
 .LVL113:
-.LBE1061:
-.LBE1060:
+.LBE1059:
+.LBE1058:
 	.loc 6 86 0
 	and	x0, x0, x20
 .LVL114:
 .L213:
-.LBE1059:
+.LBE1057:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1753,23 +1753,23 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL115:
 #NO_APP
-.LBE1056:
-.LBE1055:
+.LBE1054:
+.LBE1053:
 	.loc 9 114 0
 	cbz	x0, .L203
+.LBB1065:
+.LBB1066:
 .LBB1067:
 .LBB1068:
 .LBB1069:
-.LBB1070:
-.LBB1071:
 	.loc 8 157 0
 	sbfx	x0, x20, 0, 56
 .LVL116:
-.LBE1071:
-.LBE1070:
 .LBE1069:
-.LBB1072:
-.LBB1073:
+.LBE1068:
+.LBE1067:
+.LBB1070:
+.LBB1071:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1777,13 +1777,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL117:
 #NO_APP
-.LBE1073:
-.LBE1072:
-.LBB1074:
+.LBE1071:
+.LBE1070:
+.LBB1072:
 	.loc 6 254 0
 	and	x0, x0, x20
 .LVL118:
-.LBE1074:
+.LBE1072:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1798,8 +1798,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1068:
-.LBE1067:
+.LBE1066:
+.LBE1065:
 	.loc 9 116 0
 	mov	x2, 64
 	add	x0, x29, 120
@@ -1808,9 +1808,9 @@ ebc_io_ctl:
 .LVL121:
 	.loc 9 118 0
 	cbnz	x0, .L203
-.LBE1054:
-.LBE1053:
 .LBE1052:
+.LBE1051:
+.LBE1050:
 	.loc 1 2427 0
 	bl	ebc_phy_buf_base_get
 .LVL122:
@@ -1860,15 +1860,15 @@ ebc_io_ctl:
 	.loc 1 2444 0 is_stmt 1
 	mov	w0, 1
 	str	w0, [x21, 204]
-.LBB1081:
-.LBB1082:
+.LBB1079:
+.LBB1080:
 	.loc 1 2445 0
 	mov	w1, 0
 	add	x0, x29, 80
 	bl	init_wait_entry
 .LVL126:
 	adrp	x0, .LANCHOR1
-.LBB1083:
+.LBB1081:
 	add	x0, x0, :lo12:.LANCHOR1
 	add	x20, x0, 328
 	b	.L223
@@ -1889,7 +1889,7 @@ ebc_io_ctl:
 .LVL129:
 	ldr	w1, [x21, 204]
 	cbnz	w1, .L330
-.LBE1083:
+.LBE1081:
 	.loc 1 2445 0 discriminator 4
 	add	x1, x29, 80
 	mov	x0, x20
@@ -1902,8 +1902,8 @@ ebc_io_ctl:
 .LVL131:
 	.p2align 3
 .L193:
-.LBE1082:
-.LBE1081:
+.LBE1080:
+.LBE1079:
 	.loc 1 2529 0 is_stmt 1
 	adrp	x0, .LC6
 	add	x0, x0, :lo12:.LC6
@@ -1929,13 +1929,13 @@ ebc_io_ctl:
 	mov	w0, 28679
 	cmp	w1, w0
 	bne	.L180
+.LBB1085:
+.LBB1086:
 .LBB1087:
 .LBB1088:
 .LBB1089:
 .LBB1090:
 .LBB1091:
-.LBB1092:
-.LBB1093:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1943,8 +1943,8 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL134:
 #NO_APP
-.LBE1093:
-.LBE1092:
+.LBE1091:
+.LBE1090:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
@@ -1954,19 +1954,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L331
 .LVL136:
 .L224:
+.LBB1092:
+.LBB1093:
 .LBB1094:
-.LBB1095:
-.LBB1096:
 	.loc 8 157 0
 	sbfx	x0, x20, 0, 56
 .LVL137:
-.LBE1096:
-.LBE1095:
+.LBE1094:
+.LBE1093:
 	.loc 6 86 0
 	and	x0, x0, x20
 .LVL138:
 .L225:
-.LBE1094:
+.LBE1092:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1979,23 +1979,23 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL139:
 #NO_APP
-.LBE1091:
-.LBE1090:
+.LBE1089:
+.LBE1088:
 	.loc 9 114 0
 	cbz	x0, .L203
+.LBB1100:
+.LBB1101:
 .LBB1102:
 .LBB1103:
 .LBB1104:
-.LBB1105:
-.LBB1106:
 	.loc 8 157 0
 	sbfx	x0, x20, 0, 56
 .LVL140:
-.LBE1106:
-.LBE1105:
 .LBE1104:
-.LBB1107:
-.LBB1108:
+.LBE1103:
+.LBE1102:
+.LBB1105:
+.LBB1106:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2003,13 +2003,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL141:
 #NO_APP
-.LBE1108:
-.LBE1107:
-.LBB1109:
+.LBE1106:
+.LBE1105:
+.LBB1107:
 	.loc 6 254 0
 	and	x0, x0, x20
 .LVL142:
-.LBE1109:
+.LBE1107:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -2024,8 +2024,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1103:
-.LBE1102:
+.LBE1101:
+.LBE1100:
 	.loc 9 116 0
 	mov	x2, 64
 	add	x0, x29, 120
@@ -2034,9 +2034,9 @@ ebc_io_ctl:
 .LVL145:
 	.loc 9 118 0
 	cbnz	x0, .L203
-.LBE1089:
-.LBE1088:
 .LBE1087:
+.LBE1086:
+.LBE1085:
 	.loc 1 2454 0
 	bl	ebc_osd_buf_clone
 .LVL146:
@@ -2078,22 +2078,22 @@ ebc_io_ctl:
 .LVL149:
 	.p2align 3
 .L324:
-.LBB1116:
-.LBB1049:
-.LBB1046:
+.LBB1114:
+.LBB1047:
+.LBB1044:
+.LBB1034:
+.LBB1035:
 .LBB1036:
 .LBB1037:
 .LBB1038:
-.LBB1039:
-.LBB1040:
 	.loc 8 157 0
 	sbfx	x1, x20, 0, 56
 .LVL150:
-.LBE1040:
-.LBE1039:
 .LBE1038:
-.LBB1041:
-.LBB1042:
+.LBE1037:
+.LBE1036:
+.LBB1039:
+.LBB1040:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2101,13 +2101,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL151:
 #NO_APP
-.LBE1042:
-.LBE1041:
-.LBB1043:
+.LBE1040:
+.LBE1039:
+.LBB1041:
 	.loc 6 254 0
 	and	x1, x1, x20
 .LVL152:
-.LBE1043:
+.LBE1041:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL153:
@@ -2123,8 +2123,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1037:
-.LBE1036:
+.LBE1035:
+.LBE1034:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 120
@@ -2136,9 +2136,9 @@ ebc_io_ctl:
 .LVL157:
 	.p2align 3
 .L191:
-.LBE1046:
-.LBE1049:
-.LBE1116:
+.LBE1044:
+.LBE1047:
+.LBE1114:
 	.loc 1 2385 0
 	bl	ebc_osd_buf_get
 .LVL158:
@@ -2150,13 +2150,13 @@ ebc_io_ctl:
 .LVL159:
 	.loc 1 2394 0
 	ldr	w1, [x21, 176]
+.LBB1115:
+.LBB1116:
 .LBB1117:
 .LBB1118:
 .LBB1119:
 .LBB1120:
 .LBB1121:
-.LBB1122:
-.LBB1123:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2164,15 +2164,15 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL160:
 #NO_APP
-.LBE1123:
-.LBE1122:
-	.loc 6 85 0
-	ldr	w3, [x2, 52]
 .LBE1121:
 .LBE1120:
+	.loc 6 85 0
+	ldr	w3, [x2, 52]
 .LBE1119:
 .LBE1118:
 .LBE1117:
+.LBE1116:
+.LBE1115:
 	.loc 1 2389 0
 	sub	w0, w22, w0
 	.loc 1 2393 0
@@ -2187,11 +2187,11 @@ ebc_io_ctl:
 	str	w0, [x29, 120]
 	.loc 1 2395 0
 	str	w1, [x29, 164]
-.LBB1150:
-.LBB1147:
-.LBB1144:
-.LBB1133:
-.LBB1130:
+.LBB1148:
+.LBB1145:
+.LBB1142:
+.LBB1131:
+.LBB1128:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL161:
@@ -2199,19 +2199,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L332
 .LVL162:
 .L197:
+.LBB1122:
+.LBB1123:
 .LBB1124:
-.LBB1125:
-.LBB1126:
 	.loc 8 157 0
 	sbfx	x0, x20, 0, 56
 .LVL163:
-.LBE1126:
-.LBE1125:
+.LBE1124:
+.LBE1123:
 	.loc 6 86 0
 	and	x0, x0, x20
 .LVL164:
 .L198:
-.LBE1124:
+.LBE1122:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2224,24 +2224,24 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL165:
 #NO_APP
-.LBE1130:
-.LBE1133:
+.LBE1128:
+.LBE1131:
 	.loc 9 132 0
 	mov	x22, 64
 	cbz	x0, .L176
+.LBB1132:
+.LBB1133:
 .LBB1134:
 .LBB1135:
 .LBB1136:
-.LBB1137:
-.LBB1138:
 	.loc 8 157 0
 	sbfx	x1, x20, 0, 56
 .LVL166:
-.LBE1138:
-.LBE1137:
 .LBE1136:
-.LBB1139:
-.LBB1140:
+.LBE1135:
+.LBE1134:
+.LBB1137:
+.LBB1138:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2249,13 +2249,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL167:
 #NO_APP
-.LBE1140:
-.LBE1139:
-.LBB1141:
+.LBE1138:
+.LBE1137:
+.LBB1139:
 	.loc 6 254 0
 	and	x1, x1, x20
 .LVL168:
-.LBE1141:
+.LBE1139:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL169:
@@ -2271,8 +2271,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1135:
-.LBE1134:
+.LBE1133:
+.LBE1132:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 120
@@ -2284,16 +2284,16 @@ ebc_io_ctl:
 .LVL173:
 	.p2align 3
 .L187:
-.LBE1144:
-.LBE1147:
-.LBE1150:
+.LBE1142:
+.LBE1145:
+.LBE1148:
+.LBB1149:
+.LBB1150:
 .LBB1151:
 .LBB1152:
 .LBB1153:
 .LBB1154:
 .LBB1155:
-.LBB1156:
-.LBB1157:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2301,22 +2301,22 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL174:
 #NO_APP
-.LBE1157:
-.LBE1156:
-	.loc 6 85 0
-	ldr	w2, [x0, 52]
 .LBE1155:
 .LBE1154:
+	.loc 6 85 0
+	ldr	w2, [x0, 52]
 .LBE1153:
 .LBE1152:
 .LBE1151:
+.LBE1150:
+.LBE1149:
 	.loc 1 2481 0
 	add	x22, x21, 248
-.LBB1186:
-.LBB1182:
-.LBB1178:
-.LBB1167:
-.LBB1164:
+.LBB1184:
+.LBB1180:
+.LBB1176:
+.LBB1165:
+.LBB1162:
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
 .LVL175:
@@ -2324,19 +2324,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L333
 .LVL176:
 .L227:
+.LBB1156:
+.LBB1157:
 .LBB1158:
-.LBB1159:
-.LBB1160:
 	.loc 8 157 0
 	sbfx	x0, x20, 0, 56
 .LVL177:
-.LBE1160:
-.LBE1159:
+.LBE1158:
+.LBE1157:
 	.loc 6 86 0
 	and	x0, x0, x20
 .LVL178:
 .L228:
-.LBE1158:
+.LBE1156:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2350,22 +2350,22 @@ ebc_io_ctl:
 .LVL179:
 #NO_APP
 	mov	x3, x0
-.LBE1164:
-.LBE1167:
+.LBE1162:
+.LBE1165:
 	.loc 9 114 0
 	cbz	x0, .L257
+.LBB1166:
+.LBB1167:
 .LBB1168:
 .LBB1169:
 .LBB1170:
-.LBB1171:
-.LBB1172:
 	.loc 8 157 0
 	sbfx	x0, x20, 0, 56
-.LBE1172:
-.LBE1171:
 .LBE1170:
-.LBB1173:
-.LBB1174:
+.LBE1169:
+.LBE1168:
+.LBB1171:
+.LBB1172:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2373,13 +2373,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL180:
 #NO_APP
-.LBE1174:
-.LBE1173:
-.LBB1175:
+.LBE1172:
+.LBE1171:
+.LBB1173:
 	.loc 6 254 0
 	and	x0, x0, x20
 .LVL181:
-.LBE1175:
+.LBE1173:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -2394,8 +2394,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1169:
-.LBE1168:
+.LBE1167:
+.LBE1166:
 	.loc 9 116 0
 	mov	x2, 4
 	mov	x0, x22
@@ -2404,9 +2404,9 @@ ebc_io_ctl:
 .LVL184:
 	.loc 9 118 0
 	cbnz	x0, .L334
-.LBE1178:
-.LBE1182:
-.LBE1186:
+.LBE1176:
+.LBE1180:
+.LBE1184:
 	.loc 1 2485 0
 	add	x21, x21, 184
 	ldr	w2, [x21, 64]
@@ -2483,13 +2483,13 @@ ebc_io_ctl:
 	bl	ebc_phy_buf_base_get
 .LVL195:
 	sub	w0, w21, w0
+.LBB1185:
+.LBB1186:
 .LBB1187:
 .LBB1188:
 .LBB1189:
 .LBB1190:
 .LBB1191:
-.LBB1192:
-.LBB1193:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2497,26 +2497,26 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL196:
 #NO_APP
-.LBE1193:
-.LBE1192:
-	.loc 6 85 0
-	ldr	w3, [x2, 52]
 .LBE1191:
 .LBE1190:
+	.loc 6 85 0
+	ldr	w3, [x2, 52]
 .LBE1189:
 .LBE1188:
 .LBE1187:
+.LBE1186:
+.LBE1185:
 	.loc 1 2510 0
 	ldp	w4, w1, [x22, 84]
 	.loc 1 2508 0
 	str	w0, [x29, 120]
 	.loc 1 2509 0
 	stp	w1, w4, [x29, 128]
-.LBB1198:
-.LBB1197:
 .LBB1196:
 .LBB1195:
 .LBB1194:
+.LBB1193:
+.LBB1192:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL197:
@@ -2526,21 +2526,21 @@ ebc_io_ctl:
 .LVL198:
 	.p2align 3
 .L183:
+.LBE1192:
+.LBE1193:
 .LBE1194:
 .LBE1195:
 .LBE1196:
-.LBE1197:
-.LBE1198:
 	.loc 1 2492 0
 	ldp	w1, w0, [x21, 116]
 .LVL199:
+.LBB1197:
+.LBB1198:
 .LBB1199:
 .LBB1200:
 .LBB1201:
 .LBB1202:
 .LBB1203:
-.LBB1204:
-.LBB1205:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2548,15 +2548,15 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL200:
 #NO_APP
-.LBE1205:
-.LBE1204:
-	.loc 6 85 0
-	ldr	w3, [x2, 52]
 .LBE1203:
 .LBE1202:
+	.loc 6 85 0
+	ldr	w3, [x2, 52]
 .LBE1201:
 .LBE1200:
 .LBE1199:
+.LBE1198:
+.LBE1197:
 	.loc 1 2489 0
 	ldp	w6, w5, [x21, 108]
 	.loc 1 2492 0
@@ -2571,11 +2571,11 @@ ebc_io_ctl:
 	str	w4, [x29, 136]
 	.loc 1 2493 0
 	str	w0, [x29, 164]
-.LBB1234:
-.LBB1230:
-.LBB1226:
-.LBB1215:
-.LBB1212:
+.LBB1232:
+.LBB1228:
+.LBB1224:
+.LBB1213:
+.LBB1210:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL201:
@@ -2583,19 +2583,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L335
 .LVL202:
 .L231:
+.LBB1204:
+.LBB1205:
 .LBB1206:
-.LBB1207:
-.LBB1208:
 	.loc 8 157 0
 	sbfx	x0, x20, 0, 56
 .LVL203:
-.LBE1208:
-.LBE1207:
+.LBE1206:
+.LBE1205:
 	.loc 6 86 0
 	and	x0, x0, x20
 .LVL204:
 .L232:
-.LBE1206:
+.LBE1204:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2608,14 +2608,14 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL205:
 #NO_APP
-.LBE1212:
-.LBE1215:
+.LBE1210:
+.LBE1213:
 	.loc 9 132 0
 	cbnz	x0, .L233
 .L234:
-.LBE1226:
-.LBE1230:
-.LBE1234:
+.LBE1224:
+.LBE1228:
+.LBE1232:
 	.loc 1 2496 0
 	ldr	x0, [x21, 288]
 .LVL206:
@@ -2649,13 +2649,13 @@ ebc_io_ctl:
 .LVL212:
 	.p2align 3
 .L185:
+.LBB1233:
+.LBB1234:
 .LBB1235:
 .LBB1236:
 .LBB1237:
 .LBB1238:
 .LBB1239:
-.LBB1240:
-.LBB1241:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2663,8 +2663,8 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL213:
 #NO_APP
-.LBE1241:
-.LBE1240:
+.LBE1239:
+.LBE1238:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
@@ -2674,19 +2674,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L336
 .LVL215:
 .L201:
+.LBB1240:
+.LBB1241:
 .LBB1242:
-.LBB1243:
-.LBB1244:
 	.loc 8 157 0
 	sbfx	x0, x20, 0, 56
 .LVL216:
-.LBE1244:
-.LBE1243:
+.LBE1242:
+.LBE1241:
 	.loc 6 86 0
 	and	x0, x0, x20
 .LVL217:
 .L202:
-.LBE1242:
+.LBE1240:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2699,22 +2699,22 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL218:
 #NO_APP
-.LBE1239:
-.LBE1238:
+.LBE1237:
+.LBE1236:
 	.loc 9 114 0
 	cbz	x0, .L203
+.LBB1248:
+.LBB1249:
 .LBB1250:
 .LBB1251:
 .LBB1252:
-.LBB1253:
-.LBB1254:
 	.loc 8 157 0
 	lsl	x22, x20, 8
-.LBE1254:
-.LBE1253:
 .LBE1252:
-.LBB1255:
-.LBB1256:
+.LBE1251:
+.LBE1250:
+.LBB1253:
+.LBB1254:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2722,13 +2722,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL219:
 #NO_APP
-.LBE1256:
-.LBE1255:
-.LBB1257:
+.LBE1254:
+.LBE1253:
+.LBB1255:
 	.loc 6 254 0
 	and	x2, x20, x22, asr 8
 .LVL220:
-.LBE1257:
+.LBE1255:
 	.loc 6 249 0
 	ldr	x0, [x0, 8]
 .LVL221:
@@ -2744,8 +2744,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1251:
-.LBE1250:
+.LBE1249:
+.LBE1248:
 	.loc 9 116 0
 	add	x24, x29, 120
 	mov	x2, 64
@@ -2758,9 +2758,9 @@ ebc_io_ctl:
 	.loc 9 118 0
 	cbnz	x0, .L204
 .L207:
-.LBE1237:
-.LBE1236:
 .LBE1235:
+.LBE1234:
+.LBE1233:
 	.loc 1 2404 0
 	add	x0, x24, 48
 	bl	ebc_empty_buf_get
@@ -2777,13 +2777,13 @@ ebc_io_ctl:
 	ldp	w3, w1, [x21, 108]
 	.loc 1 2411 0
 	stp	w1, w3, [x29, 128]
+.LBB1264:
+.LBB1265:
 .LBB1266:
 .LBB1267:
 .LBB1268:
 .LBB1269:
 .LBB1270:
-.LBB1271:
-.LBB1272:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2791,29 +2791,29 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL229:
 #NO_APP
-.LBE1272:
-.LBE1271:
 .LBE1270:
 .LBE1269:
 .LBE1268:
 .LBE1267:
 .LBE1266:
+.LBE1265:
+.LBE1264:
 	.loc 1 2413 0
 	ldr	w1, [x21, 176]
 	.loc 1 2408 0
 	sub	w0, w23, w0
-.LBB1298:
-.LBB1294:
-.LBB1290:
-.LBB1281:
-.LBB1277:
+.LBB1296:
+.LBB1292:
+.LBB1288:
+.LBB1279:
+.LBB1275:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1277:
-.LBE1281:
-.LBE1290:
-.LBE1294:
-.LBE1298:
+.LBE1275:
+.LBE1279:
+.LBE1288:
+.LBE1292:
+.LBE1296:
 	.loc 1 2413 0
 	str	w1, [x29, 136]
 	.loc 1 2414 0
@@ -2822,11 +2822,11 @@ ebc_io_ctl:
 	str	w0, [x29, 120]
 	.loc 1 2414 0
 	str	w1, [x29, 164]
-.LBB1299:
-.LBB1295:
-.LBB1291:
-.LBB1282:
-.LBB1278:
+.LBB1297:
+.LBB1293:
+.LBB1289:
+.LBB1280:
+.LBB1276:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL230:
@@ -2834,12 +2834,12 @@ ebc_io_ctl:
 	tbz	x3, 21, .L337
 .LVL231:
 .L208:
-.LBB1273:
+.LBB1271:
 	.loc 6 86 0
 	and	x0, x20, x22, asr 8
 .L209:
 .LVL232:
-.LBE1273:
+.LBE1271:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2852,15 +2852,15 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL233:
 #NO_APP
-.LBE1278:
-.LBE1282:
+.LBE1276:
+.LBE1280:
 	.loc 9 132 0
 	cbnz	x0, .L210
 .LVL234:
 .L211:
-.LBE1291:
-.LBE1295:
-.LBE1299:
+.LBE1289:
+.LBE1293:
+.LBE1297:
 	.loc 1 2418 0
 	mov	x0, x25
 .LVL235:
@@ -2875,269 +2875,269 @@ ebc_io_ctl:
 .LVL238:
 	.p2align 3
 .L331:
-.LBB1300:
-.LBB1114:
+.LBB1298:
 .LBB1112:
 .LBB1110:
-.LBB1100:
-.LBB1097:
+.LBB1108:
 .LBB1098:
-.LBB1099:
+.LBB1095:
+.LBB1096:
+.LBB1097:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1099:
-.LBE1098:
 .LBE1097:
-.LBE1100:
+.LBE1096:
+.LBE1095:
+.LBE1098:
+.LBE1108:
 .LBE1110:
 .LBE1112:
-.LBE1114:
-.LBE1300:
+.LBE1298:
 	.loc 1 2358 0
 	mov	x0, x20
 .LVL239:
-.LBB1301:
-.LBB1115:
+.LBB1299:
 .LBB1113:
 .LBB1111:
-.LBB1101:
+.LBB1109:
+.LBB1099:
 	.loc 6 84 0
 	tbz	x2, 26, .L225
 	b	.L224
 .LVL240:
 	.p2align 3
 .L336:
-.LBE1101:
+.LBE1099:
+.LBE1109:
 .LBE1111:
 .LBE1113:
-.LBE1115:
-.LBE1301:
-.LBB1302:
-.LBB1263:
-.LBB1260:
+.LBE1299:
+.LBB1300:
+.LBB1261:
 .LBB1258:
-.LBB1248:
-.LBB1245:
+.LBB1256:
 .LBB1246:
-.LBB1247:
+.LBB1243:
+.LBB1244:
+.LBB1245:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1247:
-.LBE1246:
 .LBE1245:
-.LBE1248:
+.LBE1244:
+.LBE1243:
+.LBE1246:
+.LBE1256:
 .LBE1258:
-.LBE1260:
-.LBE1263:
-.LBE1302:
+.LBE1261:
+.LBE1300:
 	.loc 1 2358 0
 	mov	x0, x20
 .LVL241:
-.LBB1303:
-.LBB1264:
-.LBB1261:
+.LBB1301:
+.LBB1262:
 .LBB1259:
-.LBB1249:
+.LBB1257:
+.LBB1247:
 	.loc 6 84 0
 	tbz	x2, 26, .L202
 	b	.L201
 .LVL242:
 	.p2align 3
 .L335:
-.LBE1249:
+.LBE1247:
+.LBE1257:
 .LBE1259:
-.LBE1261:
-.LBE1264:
-.LBE1303:
-.LBB1304:
-.LBB1231:
-.LBB1227:
-.LBB1216:
-.LBB1213:
-.LBB1209:
-.LBB1210:
+.LBE1262:
+.LBE1301:
+.LBB1302:
+.LBB1229:
+.LBB1225:
+.LBB1214:
 .LBB1211:
+.LBB1207:
+.LBB1208:
+.LBB1209:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL243:
-.LBE1211:
-.LBE1210:
 .LBE1209:
-.LBE1213:
-.LBE1216:
-.LBE1227:
-.LBE1231:
-.LBE1304:
+.LBE1208:
+.LBE1207:
+.LBE1211:
+.LBE1214:
+.LBE1225:
+.LBE1229:
+.LBE1302:
 	.loc 1 2358 0
 	mov	x0, x20
 .LVL244:
-.LBB1305:
-.LBB1232:
-.LBB1228:
-.LBB1217:
-.LBB1214:
+.LBB1303:
+.LBB1230:
+.LBB1226:
+.LBB1215:
+.LBB1212:
 	.loc 6 84 0
 	tbz	x2, 26, .L232
 	b	.L231
 .LVL245:
 	.p2align 3
 .L327:
-.LBE1214:
-.LBE1217:
-.LBE1228:
-.LBE1232:
-.LBE1305:
-.LBB1306:
-.LBB1079:
+.LBE1212:
+.LBE1215:
+.LBE1226:
+.LBE1230:
+.LBE1303:
+.LBB1304:
 .LBB1077:
 .LBB1075:
-.LBB1065:
-.LBB1062:
+.LBB1073:
 .LBB1063:
-.LBB1064:
+.LBB1060:
+.LBB1061:
+.LBB1062:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1064:
-.LBE1063:
 .LBE1062:
-.LBE1065:
+.LBE1061:
+.LBE1060:
+.LBE1063:
+.LBE1073:
 .LBE1075:
 .LBE1077:
-.LBE1079:
-.LBE1306:
+.LBE1304:
 	.loc 1 2358 0
 	mov	x0, x20
 .LVL246:
-.LBB1307:
-.LBB1080:
+.LBB1305:
 .LBB1078:
 .LBB1076:
-.LBB1066:
+.LBB1074:
+.LBB1064:
 	.loc 6 84 0
 	tbz	x2, 26, .L213
 	b	.L212
 .LVL247:
 	.p2align 3
 .L333:
-.LBE1066:
+.LBE1064:
+.LBE1074:
 .LBE1076:
 .LBE1078:
-.LBE1080:
-.LBE1307:
-.LBB1308:
-.LBB1183:
-.LBB1179:
-.LBB1176:
-.LBB1165:
-.LBB1161:
-.LBB1162:
+.LBE1305:
+.LBB1306:
+.LBB1181:
+.LBB1177:
+.LBB1174:
 .LBB1163:
+.LBB1159:
+.LBB1160:
+.LBB1161:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1163:
-.LBE1162:
 .LBE1161:
-.LBE1165:
-.LBE1176:
-.LBE1179:
-.LBE1183:
-.LBE1308:
+.LBE1160:
+.LBE1159:
+.LBE1163:
+.LBE1174:
+.LBE1177:
+.LBE1181:
+.LBE1306:
 	.loc 1 2358 0
 	mov	x0, x20
 .LVL248:
-.LBB1309:
-.LBB1184:
-.LBB1180:
-.LBB1177:
-.LBB1166:
+.LBB1307:
+.LBB1182:
+.LBB1178:
+.LBB1175:
+.LBB1164:
 	.loc 6 84 0
 	tbz	x2, 26, .L228
 	b	.L227
 .LVL249:
 	.p2align 3
 .L332:
-.LBE1166:
-.LBE1177:
-.LBE1180:
-.LBE1184:
-.LBE1309:
-.LBB1310:
-.LBB1148:
-.LBB1145:
-.LBB1142:
-.LBB1131:
-.LBB1127:
-.LBB1128:
+.LBE1164:
+.LBE1175:
+.LBE1178:
+.LBE1182:
+.LBE1307:
+.LBB1308:
+.LBB1146:
+.LBB1143:
+.LBB1140:
 .LBB1129:
+.LBB1125:
+.LBB1126:
+.LBB1127:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL250:
-.LBE1129:
-.LBE1128:
 .LBE1127:
-.LBE1131:
-.LBE1142:
-.LBE1145:
-.LBE1148:
-.LBE1310:
+.LBE1126:
+.LBE1125:
+.LBE1129:
+.LBE1140:
+.LBE1143:
+.LBE1146:
+.LBE1308:
 	.loc 1 2358 0
 	mov	x0, x20
 .LVL251:
-.LBB1311:
-.LBB1149:
-.LBB1146:
-.LBB1143:
-.LBB1132:
+.LBB1309:
+.LBB1147:
+.LBB1144:
+.LBB1141:
+.LBB1130:
 	.loc 6 84 0
 	tbz	x2, 26, .L198
 	b	.L197
 .LVL252:
 	.p2align 3
 .L337:
-.LBE1132:
-.LBE1143:
-.LBE1146:
-.LBE1149:
-.LBE1311:
-.LBB1312:
-.LBB1296:
-.LBB1292:
-.LBB1283:
-.LBB1279:
+.LBE1130:
+.LBE1141:
+.LBE1144:
+.LBE1147:
+.LBE1309:
+.LBB1310:
+.LBB1294:
+.LBB1290:
+.LBB1281:
+.LBB1277:
+.LBB1272:
+.LBB1273:
 .LBB1274:
-.LBB1275:
-.LBB1276:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL253:
-.LBE1276:
-.LBE1275:
 .LBE1274:
-.LBE1279:
-.LBE1283:
-.LBE1292:
-.LBE1296:
-.LBE1312:
+.LBE1273:
+.LBE1272:
+.LBE1277:
+.LBE1281:
+.LBE1290:
+.LBE1294:
+.LBE1310:
 	.loc 1 2358 0
 	mov	x0, x20
 .LVL254:
-.LBB1313:
-.LBB1297:
-.LBB1293:
-.LBB1284:
-.LBB1280:
+.LBB1311:
+.LBB1295:
+.LBB1291:
+.LBB1282:
+.LBB1278:
 	.loc 6 84 0
 	tbz	x2, 26, .L209
 	b	.L208
 .LVL255:
 	.p2align 3
 .L210:
-.LBE1280:
-.LBE1284:
+.LBE1278:
+.LBE1282:
+.LBB1283:
+.LBB1284:
 .LBB1285:
 .LBB1286:
-.LBB1287:
-.LBB1288:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -3145,13 +3145,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL256:
 #NO_APP
-.LBE1288:
-.LBE1287:
-.LBB1289:
+.LBE1286:
+.LBE1285:
+.LBB1287:
 	.loc 6 254 0
 	and	x22, x20, x22, asr 8
 .LVL257:
-.LBE1289:
+.LBE1287:
 	.loc 6 249 0
 	ldr	x1, [x0, 8]
 .LVL258:
@@ -3167,31 +3167,31 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1286:
-.LBE1285:
+.LBE1284:
+.LBE1283:
 	.loc 9 134 0
 	mov	x2, 64
 .LVL260:
 	mov	x1, x24
 	bl	__arch_copy_to_user
 .LVL261:
-.LBE1293:
-.LBE1297:
-.LBE1313:
+.LBE1291:
+.LBE1295:
+.LBE1311:
 	.loc 1 2417 0
 	cbnz	w0, .L211
-.LBB1314:
-.LBB1084:
+.LBB1312:
+.LBB1082:
 	mov	x22, 0
 .LVL262:
 	b	.L176
 .LVL263:
 .L204:
-.LBE1084:
-.LBE1314:
-.LBB1315:
-.LBB1265:
-.LBB1262:
+.LBE1082:
+.LBE1312:
+.LBB1313:
+.LBB1263:
+.LBB1260:
 	.loc 9 119 0
 	sub	x0, x24, x0
 .LVL264:
@@ -3200,9 +3200,9 @@ ebc_io_ctl:
 	add	x0, x0, 64
 	bl	memset
 .LVL265:
-.LBE1262:
-.LBE1265:
-.LBE1315:
+.LBE1260:
+.LBE1263:
+.LBE1313:
 	.loc 1 2401 0
 	cbz	w23, .L207
 .LVL266:
@@ -3214,36 +3214,36 @@ ebc_io_ctl:
 .LVL267:
 	.p2align 3
 .L233:
-.LBB1316:
-.LBB1233:
-.LBB1229:
+.LBB1314:
+.LBB1231:
+.LBB1227:
+.LBB1216:
+.LBB1217:
 .LBB1218:
 .LBB1219:
 .LBB1220:
-.LBB1221:
-.LBB1222:
 	.loc 8 157 0
 	sbfx	x1, x20, 0, 56
 .LVL268:
-.LBE1222:
-.LBE1221:
 .LBE1220:
-.LBB1223:
-.LBB1224:
-	.loc 5 19 0
-#APP
+.LBE1219:
+.LBE1218:
+.LBB1221:
+.LBB1222:
+	.loc 5 19 0
+#APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
 .LVL269:
 #NO_APP
-.LBE1224:
-.LBE1223:
-.LBB1225:
+.LBE1222:
+.LBE1221:
+.LBB1223:
 	.loc 6 254 0
 	and	x1, x1, x20
 .LVL270:
-.LBE1225:
+.LBE1223:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL271:
@@ -3259,28 +3259,28 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1219:
-.LBE1218:
+.LBE1217:
+.LBE1216:
 	.loc 9 134 0
 	mov	x2, 64
 	add	x1, x29, 120
 .LVL273:
 	bl	__arch_copy_to_user
 .LVL274:
-.LBE1229:
-.LBE1233:
-.LBE1316:
+.LBE1227:
+.LBE1231:
+.LBE1314:
 	.loc 1 2495 0
 	cbnz	x0, .L234
-.LBB1317:
-.LBB1085:
+.LBB1315:
+.LBB1083:
 	mov	x22, 0
 	b	.L176
 .LVL275:
 	.p2align 3
 .L328:
-.LBE1085:
-.LBE1317:
+.LBE1083:
+.LBE1315:
 	.loc 1 2440 0
 	mov	w2, 1
 	str	w2, [x21, 96]
@@ -3297,22 +3297,22 @@ ebc_io_ctl:
 	.loc 1 2443 0 discriminator 1
 	ldr	w0, [x21, 616]
 	cbz	w0, .L219
-.LBB1318:
-.LBB1086:
+.LBB1316:
+.LBB1084:
 	mov	x22, 0
 	b	.L176
 .LVL277:
 .L205:
-.LBE1086:
-.LBE1318:
+.LBE1084:
+.LBE1316:
 	.loc 1 2387 0
 	mov	x22, -1
 	b	.L176
 .LVL278:
 .L257:
-.LBB1319:
-.LBB1185:
-.LBB1181:
+.LBB1317:
+.LBB1183:
+.LBB1179:
 	.loc 9 112 0
 	mov	x0, 4
 .LVL279:
@@ -3325,9 +3325,9 @@ ebc_io_ctl:
 .LVL281:
 	bl	memset
 .LVL282:
-.LBE1181:
-.LBE1185:
-.LBE1319:
+.LBE1179:
+.LBE1183:
+.LBE1317:
 	.loc 1 2482 0
 	ldr	x0, [x21, 288]
 	adrp	x1, .LC4
@@ -3350,13 +3350,13 @@ ebc_io_ctl:
 .LVL286:
 	b	.L229
 	.cfi_endproc
-.LFE2843:
+.LFE2842:
 	.size	ebc_io_ctl, .-ebc_io_ctl
 	.align	2
 	.p2align 3,,7
 	.type	frame_done_callback, %function
 frame_done_callback:
-.LFB2833:
+.LFB2832:
 	.loc 1 1675 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -48]!
@@ -3536,13 +3536,13 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2833:
+.LFE2832:
 	.size	frame_done_callback, .-frame_done_callback
 	.align	2
 	.p2align 3,,7
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
-.LFB2841:
+.LFB2840:
 	.loc 1 2284 0
 	.cfi_startproc
 .LVL297:
@@ -3562,13 +3562,13 @@ ebc_frame_timeout:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2841:
+.LFE2840:
 	.size	ebc_frame_timeout, .-ebc_frame_timeout
 	.align	2
 	.p2align 3,,7
 	.type	ebc_lut_update, %function
 ebc_lut_update:
-.LFB2834:
+.LFB2833:
 	.loc 1 1714 0
 	.cfi_startproc
 .LVL299:
@@ -3584,7 +3584,7 @@ ebc_lut_update:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -48
 	.cfi_offset 22, -40
-	mov	x21, x0
+	mov	x22, x0
 	stp	x19, x20, [sp, 16]
 	.loc 1 1716 0
 	add	x0, x29, 80
@@ -3599,7 +3599,7 @@ ebc_lut_update:
 	add	x3, x19, :lo12:__stack_chk_guard
 	mov	w23, w1
 	.loc 1 1723 0
-	ldr	x2, [x21, 16]
+	ldr	x2, [x22, 16]
 	.loc 1 1714 0
 	ldr	x1, [x3]
 	str	x1, [x29, 72]
@@ -3608,8 +3608,8 @@ ebc_lut_update:
 	.loc 1 1716 0
 	str	w4, [x0, -12]!
 .LVL302:
-.LBB1320:
-.LBB1321:
+.LBB1318:
+.LBB1319:
 	.loc 3 50 0
 	mov	x1, x0
 	mov	x0, x2
@@ -3617,43 +3617,43 @@ ebc_lut_update:
 	blr	x2
 .LVL303:
 	mov	w20, w0
-.LBE1321:
-.LBE1320:
+.LBE1319:
+.LBE1318:
 	.loc 1 1724 0
 	cbnz	w0, .L349
 .LVL304:
 	.loc 1 1725 0
 	ldr	w2, [x29, 68]
 	.loc 1 1726 0
-	add	x22, x21, 184
+	add	x21, x22, 184
 	.loc 1 1725 0
-	tbnz	w2, #31, .L376
+	tbnz	w2, #31, .L386
 	.loc 1 1729 0
 	cmp	w2, 50
-	bgt	.L377
+	bgt	.L387
 .L351:
 	.loc 1 1737 0
-	ldr	x0, [x22, 104]
+	ldr	x0, [x21, 104]
 	adrp	x1, .LC14
 	add	x1, x1, :lo12:.LC14
 	bl	_dev_info
 .LVL305:
 	.loc 1 1740 0
-	ldr	x0, [x22, 224]
+	ldr	x0, [x21, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 23
-	bls	.L378
+	bls	.L388
+.L352:
 	.loc 1 1808 0
 	ldr	w2, [x29, 68]
-.L375:
 	mov	w3, w23
 	mov	w1, 7
-	add	x0, x21, 296
+	add	x0, x22, 296
 	bl	epd_lut_get
 .LVL306:
-	cbnz	w0, .L367
+	cbnz	w0, .L369
 	.p2align 2
-.L370:
+.L367:
 	.loc 1 1813 0
 	cbnz	w20, .L368
 .L348:
@@ -3663,7 +3663,7 @@ ebc_lut_update:
 	ldr	x2, [x29, 72]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L379
+	cbnz	x1, .L389
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 .LVL307:
@@ -3682,13 +3682,10 @@ ebc_lut_update:
 	ret
 .LVL309:
 	.p2align 3
-.L378:
+.L388:
 	.cfi_restore_state
 	.loc 1 1740 0
 	adrp	x1, .L354
-	.loc 1 1784 0
-	ldr	w2, [x29, 68]
-	.loc 1 1740 0
 	add	x1, x1, :lo12:.L354
 	ldrb	w0, [x1,w0,uxtw]
 	adr	x1, .Lrtx354
@@ -3701,12 +3698,12 @@ ebc_lut_update:
 .L354:
 	.byte	(.L353 - .Lrtx354) / 4
 	.byte	(.L355 - .Lrtx354) / 4
-	.byte	(.L375 - .Lrtx354) / 4
+	.byte	(.L352 - .Lrtx354) / 4
 	.byte	(.L357 - .Lrtx354) / 4
 	.byte	(.L358 - .Lrtx354) / 4
 	.byte	(.L359 - .Lrtx354) / 4
 	.byte	(.L360 - .Lrtx354) / 4
-	.byte	(.L375 - .Lrtx354) / 4
+	.byte	(.L352 - .Lrtx354) / 4
 	.byte	(.L357 - .Lrtx354) / 4
 	.byte	(.L358 - .Lrtx354) / 4
 	.byte	(.L359 - .Lrtx354) / 4
@@ -3717,211 +3714,247 @@ ebc_lut_update:
 	.byte	(.L363 - .Lrtx354) / 4
 	.byte	(.L362 - .Lrtx354) / 4
 	.byte	(.L364 - .Lrtx354) / 4
-	.byte	(.L375 - .Lrtx354) / 4
-	.byte	(.L375 - .Lrtx354) / 4
-	.byte	(.L375 - .Lrtx354) / 4
-	.byte	(.L375 - .Lrtx354) / 4
+	.byte	(.L352 - .Lrtx354) / 4
+	.byte	(.L352 - .Lrtx354) / 4
+	.byte	(.L352 - .Lrtx354) / 4
+	.byte	(.L352 - .Lrtx354) / 4
 	.byte	(.L365 - .Lrtx354) / 4
 	.byte	(.L366 - .Lrtx354) / 4
 	.text
+	.p2align 3
+.L364:
+	.loc 1 1742 0
+	ldr	w2, [x29, 68]
+	mov	w3, w23
+	mov	w1, 1
+	add	x0, x22, 296
+	bl	epd_lut_get
 .LVL310:
+	cbz	w0, .L367
+	.p2align 2
+.L369:
+	.loc 1 1761 0
+	mov	w20, -1
+.L368:
+	.loc 1 1814 0
+	ldr	x0, [x21, 104]
+	adrp	x1, .LC15
+	add	x1, x1, :lo12:.LC15
+	bl	_dev_err
+.LVL311:
+	.loc 1 1815 0
+	b	.L348
+.LVL312:
 	.p2align 3
 .L349:
 	.loc 1 1735 0
-	add	x22, x21, 184
+	add	x21, x22, 184
 	mov	w2, w0
 	adrp	x1, .LC13
 	add	x1, x1, :lo12:.LC13
-	ldr	x0, [x22, 104]
+	ldr	x0, [x21, 104]
 	bl	_dev_err
-.LVL311:
+.LVL313:
 	ldr	w2, [x29, 68]
 	b	.L351
 	.p2align 3
-.L377:
+.L387:
 	.loc 1 1730 0
-	ldr	x0, [x22, 104]
+	ldr	x0, [x21, 104]
 	adrp	x1, .LC12
 	add	x1, x1, :lo12:.LC12
 	bl	_dev_info
-.LVL312:
+.LVL314:
 	.loc 1 1731 0
 	mov	w2, 50
 	str	w2, [x29, 68]
-.LVL313:
+.LVL315:
 	b	.L351
 	.p2align 3
-.L364:
-	.loc 1 1742 0
+.L359:
+	.loc 1 1799 0
+	ldr	w2, [x29, 68]
 	mov	w3, w23
-	mov	w1, 1
-	add	x0, x21, 296
-	bl	epd_lut_get
-.LVL314:
-	cbz	w0, .L370
-	.p2align 2
-.L367:
-	.loc 1 1731 0
-	mov	w20, -1
-.L368:
-	.loc 1 1814 0
-	ldr	x0, [x22, 104]
-	adrp	x1, .LC15
-	add	x1, x1, :lo12:.LC15
-	bl	_dev_err
-.LVL315:
-	.loc 1 1815 0
-	b	.L348
-	.p2align 3
-.L365:
-	.loc 1 1776 0
-	mov	w3, 16
-	mov	w1, 4
-	add	x0, x21, 296
+	mov	w1, 10
+	add	x0, x22, 296
 	bl	epd_lut_get
 .LVL316:
-	cbnz	w0, .L367
-	b	.L370
+	cbnz	w0, .L369
+	b	.L367
 	.p2align 3
-.L358:
-	.loc 1 1794 0
+.L360:
+	.loc 1 1804 0
+	ldr	w2, [x29, 68]
 	mov	w3, w23
-	mov	w1, 9
-	add	x0, x21, 296
+	mov	w1, 11
+	add	x0, x22, 296
 	bl	epd_lut_get
 .LVL317:
-	cbnz	w0, .L367
-	b	.L370
+	cbnz	w0, .L369
+	b	.L367
 	.p2align 3
-.L359:
-	.loc 1 1799 0
+.L361:
+	.loc 1 1767 0
+	ldr	w2, [x29, 68]
 	mov	w3, w23
-	mov	w1, 10
-	add	x0, x21, 296
+	mov	w1, 6
+	add	x0, x22, 296
 	bl	epd_lut_get
 .LVL318:
-	cbnz	w0, .L367
-	b	.L370
+	cbnz	w0, .L369
+	b	.L367
 	.p2align 3
-.L360:
-	.loc 1 1804 0
+.L362:
+	.loc 1 1772 0
+	ldr	w2, [x29, 68]
 	mov	w3, w23
-	mov	w1, 11
-	add	x0, x21, 296
+	mov	w1, 4
+	add	x0, x22, 296
 	bl	epd_lut_get
 .LVL319:
-	cbnz	w0, .L367
-	b	.L370
+	cbnz	w0, .L369
+	b	.L367
 	.p2align 3
-.L353:
-	.loc 1 1755 0
-	mov	w3, 16
-	mov	w1, 7
-	add	x0, x21, 296
+.L363:
+	.loc 1 1780 0
+	ldr	w2, [x29, 68]
+	mov	w3, w23
+	mov	w1, 3
+	add	x0, x22, 296
 	bl	epd_lut_get
 .LVL320:
-	cbnz	w0, .L367
-	b	.L370
+	cbnz	w0, .L369
+	b	.L367
 	.p2align 3
-.L357:
-	.loc 1 1789 0
-	mov	w3, w23
-	mov	w1, 8
-	add	x0, x21, 296
+.L365:
+	.loc 1 1776 0
+	ldr	w2, [x29, 68]
+	mov	w3, 16
+	mov	w1, 4
+	add	x0, x22, 296
 	bl	epd_lut_get
 .LVL321:
-	cbnz	w0, .L367
-	b	.L370
+	cbnz	w0, .L369
+	b	.L367
 	.p2align 3
-.L363:
-	.loc 1 1780 0
-	mov	w3, w23
-	mov	w1, 3
-	add	x0, x21, 296
+.L353:
+	.loc 1 1755 0
+	ldr	w2, [x29, 68]
+	mov	w3, 16
+	mov	w1, 7
+	add	x0, x22, 296
 	bl	epd_lut_get
 .LVL322:
-	cbnz	w0, .L367
-	b	.L370
+	cbnz	w0, .L369
+	b	.L367
 	.p2align 3
 .L355:
+	.loc 1 1759 0
+	bl	epd_overlay_lut
+.LVL323:
+	mov	w23, w0
+.LVL324:
 	.loc 1 1760 0
+	ldr	w2, [x29, 68]
+	mov	w1, w0
 	mov	w3, 16
-	mov	w1, 5
-	add	x0, x21, 296
+	add	x0, x22, 296
 	bl	epd_lut_get
-.LVL323:
-	cbnz	w0, .L367
-	b	.L370
+.LVL325:
+	cbnz	w0, .L370
+	.loc 1 1762 0
+	cmp	w23, 5
+	beq	.L367
+.L372:
+	.loc 1 1763 0
+	ldr	w0, [x21, 112]
+	orr	w0, w0, w0, lsl 8
+	str	w0, [x21, 112]
+	b	.L367
+.LVL326:
 	.p2align 3
-.L366:
-	.loc 1 1784 0
-	mov	w3, 16
-	mov	w1, 3
-	add	x0, x21, 296
+.L357:
+	.loc 1 1789 0
+	ldr	w2, [x29, 68]
+	mov	w3, w23
+	mov	w1, 8
+	add	x0, x22, 296
 	bl	epd_lut_get
-.LVL324:
-	cbnz	w0, .L367
-	b	.L370
+.LVL327:
+	cbnz	w0, .L369
+	b	.L367
 	.p2align 3
-.L361:
-	.loc 1 1767 0
+.L358:
+	.loc 1 1794 0
+	ldr	w2, [x29, 68]
 	mov	w3, w23
-	mov	w1, 6
-	add	x0, x21, 296
+	mov	w1, 9
+	add	x0, x22, 296
 	bl	epd_lut_get
-.LVL325:
-	cbnz	w0, .L367
-	b	.L370
+.LVL328:
+	cbnz	w0, .L369
+	b	.L367
 	.p2align 3
-.L362:
-	.loc 1 1772 0
-	mov	w3, w23
-	mov	w1, 4
-	add	x0, x21, 296
+.L366:
+	.loc 1 1784 0
+	ldr	w2, [x29, 68]
+	mov	w3, 16
+	mov	w1, 3
+	add	x0, x22, 296
 	bl	epd_lut_get
-.LVL326:
-	cbnz	w0, .L367
-	b	.L370
+.LVL329:
+	cbnz	w0, .L369
+	b	.L367
 	.p2align 3
-.L376:
+.L386:
 	.loc 1 1726 0
-	ldr	x0, [x22, 104]
+	ldr	x0, [x21, 104]
 	adrp	x1, .LC11
 	add	x1, x1, :lo12:.LC11
 	bl	_dev_info
-.LVL327:
+.LVL330:
 	.loc 1 1727 0
 	str	wzr, [x29, 68]
 	mov	w2, 0
 	b	.L351
-.L379:
+.LVL331:
+	.p2align 3
+.L370:
+	.loc 1 1761 0
+	mov	w20, -1
+	.loc 1 1762 0
+	cmp	w23, 5
+	bne	.L372
+	b	.L369
+.LVL332:
+.L389:
 	.loc 1 1819 0
 	bl	__stack_chk_fail
-.LVL328:
+.LVL333:
 	.cfi_endproc
-.LFE2834:
+.LFE2833:
 	.size	ebc_lut_update, .-ebc_lut_update
 	.align	2
 	.p2align 3,,7
 	.type	ebc_buf_state_read, %function
 ebc_buf_state_read:
-.LFB2855:
+.LFB2854:
 	.loc 1 2730 0
 	.cfi_startproc
-.LVL329:
+.LVL334:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	.loc 1 2731 0
 	mov	x0, x2
-.LVL330:
+.LVL335:
 	.loc 1 2730 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	.loc 1 2731 0
 	bl	ebc_buf_state_show
-.LVL331:
+.LVL336:
 	.loc 1 2732 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
@@ -3930,16 +3963,16 @@ ebc_buf_state_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2855:
+.LFE2854:
 	.size	ebc_buf_state_read, .-ebc_buf_state_read
 	.align	2
 	.p2align 3,,7
 	.type	ebc_state_read, %function
 ebc_state_read:
-.LFB2854:
+.LFB2853:
 	.loc 1 2721 0
 	.cfi_startproc
-.LVL332:
+.LVL337:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -3948,20 +3981,20 @@ ebc_state_read:
 	adrp	x3, .LANCHOR0
 	.loc 1 2721 0
 	mov	x0, x2
-.LVL333:
+.LVL338:
 	.loc 1 2722 0
 	adrp	x1, .LC16
-.LVL334:
+.LVL339:
 	.loc 1 2721 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	.loc 1 2722 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL335:
+.LVL340:
 	add	x1, x1, :lo12:.LC16
 	ldr	w2, [x2, 624]
 	bl	sprintf
-.LVL336:
+.LVL341:
 	.loc 1 2723 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
@@ -3970,27 +4003,27 @@ ebc_state_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2854:
+.LFE2853:
 	.size	ebc_state_read, .-ebc_state_read
 	.align	2
 	.p2align 3,,7
 	.type	ebc_version_read, %function
 ebc_version_read:
-.LFB2853:
+.LFB2852:
 	.loc 1 2712 0
 	.cfi_startproc
-.LVL337:
+.LVL342:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mov	x0, x2
-.LVL338:
+.LVL343:
 	.loc 1 2713 0
 	adrp	x1, .LC18
-.LVL339:
+.LVL344:
 	adrp	x2, .LC17
-.LVL340:
+.LVL345:
 	.loc 1 2712 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -4000,7 +4033,7 @@ ebc_version_read:
 	.loc 1 2713 0
 	add	x1, x1, :lo12:.LC18
 	bl	sprintf
-.LVL341:
+.LVL346:
 	.loc 1 2714 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
@@ -4009,23 +4042,23 @@ ebc_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2853:
+.LFE2852:
 	.size	ebc_version_read, .-ebc_version_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
-.LFB2851:
+.LFB2850:
 	.loc 1 2676 0
 	.cfi_startproc
-.LVL342:
+.LVL347:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
 	.loc 1 2677 0
 	adrp	x0, .LANCHOR0
-.LVL343:
+.LVL348:
 	.loc 1 2676 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -4038,27 +4071,27 @@ pmic_vcom_read:
 	mov	x19, x2
 	.loc 1 2680 0
 	ldr	x1, [x0, 16]
-.LVL344:
-.LBB1322:
-.LBB1323:
+.LVL349:
+.LBB1320:
+.LBB1321:
 	.loc 3 55 0
 	mov	x0, x1
 	ldr	x1, [x1, 64]
 	blr	x1
-.LVL345:
-.LBE1323:
-.LBE1322:
+.LVL350:
+.LBE1321:
+.LBE1320:
 	.loc 1 2682 0
 	mov	w2, w0
 	adrp	x1, .LC16
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC16
 	bl	sprintf
-.LVL346:
+.LVL351:
 	.loc 1 2683 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL347:
+.LVL352:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -4066,35 +4099,35 @@ pmic_vcom_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2851:
+.LFE2850:
 	.size	pmic_vcom_read, .-pmic_vcom_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_temp_read, %function
 pmic_temp_read:
-.LFB2850:
+.LFB2849:
 	.loc 1 2662 0
 	.cfi_startproc
-.LVL348:
+.LVL353:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
 	.loc 1 2663 0
 	adrp	x0, .LANCHOR0
-.LVL349:
+.LVL354:
 	.loc 1 2662 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	.loc 1 2666 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-.LBB1324:
-.LBB1325:
+.LBB1322:
+.LBB1323:
 	.loc 3 50 0
 	add	x1, x29, 36
-.LVL350:
-.LBE1325:
-.LBE1324:
+.LVL355:
+.LBE1323:
+.LBE1322:
 	.loc 1 2662 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
@@ -4106,32 +4139,32 @@ pmic_temp_read:
 	ldr	x2, [x19]
 	str	x2, [x29, 40]
 	mov	x2,0
-.LVL351:
+.LVL356:
 	.loc 1 2666 0
 	ldr	x2, [x0, 16]
-.LBB1327:
-.LBB1326:
+.LBB1325:
+.LBB1324:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL352:
-.LBE1326:
-.LBE1327:
+.LVL357:
+.LBE1324:
+.LBE1325:
 	.loc 1 2668 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC16
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC16
 	bl	sprintf
-.LVL353:
+.LVL358:
 	.loc 1 2669 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L391
+	cbnz	x1, .L401
 	ldp	x19, x20, [sp, 16]
-.LVL354:
+.LVL359:
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -4141,22 +4174,22 @@ pmic_temp_read:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL355:
-.L391:
+.LVL360:
+.L401:
 	.cfi_restore_state
 	bl	__stack_chk_fail
-.LVL356:
+.LVL361:
 	.cfi_endproc
-.LFE2850:
+.LFE2849:
 	.size	pmic_temp_read, .-pmic_temp_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_name_read, %function
 pmic_name_read:
-.LFB2849:
+.LFB2848:
 	.loc 1 2651 0
 	.cfi_startproc
-.LVL357:
+.LVL362:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -4165,21 +4198,21 @@ pmic_name_read:
 	adrp	x3, .LANCHOR0
 	.loc 1 2651 0
 	mov	x0, x2
-.LVL358:
+.LVL363:
 	.loc 1 2654 0
 	adrp	x1, .LC18
-.LVL359:
+.LVL364:
 	.loc 1 2651 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	.loc 1 2654 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL360:
+.LVL365:
 	add	x1, x1, :lo12:.LC18
 	ldr	x2, [x2, 16]
 	add	x2, x2, 8
 	bl	sprintf
-.LVL361:
+.LVL366:
 	.loc 1 2655 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
@@ -4188,23 +4221,23 @@ pmic_name_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2849:
+.LFE2848:
 	.size	pmic_name_read, .-pmic_name_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
-.LFB2852:
+.LFB2851:
 	.loc 1 2688 0
 	.cfi_startproc
-.LVL362:
+.LVL367:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
 	.loc 1 2689 0
 	adrp	x0, .LANCHOR0
-.LVL363:
+.LVL368:
 	.loc 1 2688 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -4217,45 +4250,45 @@ pmic_vcom_write:
 	.cfi_offset 22, -24
 	.loc 1 2688 0
 	add	x1, x19, :lo12:__stack_chk_guard
-.LVL364:
+.LVL369:
 	mov	x21, x2
 	.loc 1 2689 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
-.LVL365:
+.LVL370:
 	.loc 1 2688 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
-.LVL366:
+.LVL371:
 	mov	x20, x3
 	.loc 1 2692 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
-.LVL367:
+.LVL372:
 	.loc 1 2693 0
-	cbnz	w0, .L401
-.LVL368:
+	cbnz	w0, .L411
+.LVL373:
 	.loc 1 2697 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
-.LVL369:
+.LVL374:
 	.loc 1 2698 0
-	cbnz	w0, .L402
-.L394:
+	cbnz	w0, .L412
+.L404:
 	.loc 1 2704 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
-.LVL370:
+.LVL375:
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L403
+	cbnz	x1, .L413
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL371:
+.LVL376:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -4266,9 +4299,9 @@ pmic_vcom_write:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL372:
+.LVL377:
 	.p2align 3
-.L401:
+.L411:
 	.cfi_restore_state
 	.loc 1 2694 0
 	ldr	x0, [x22]
@@ -4277,42 +4310,42 @@ pmic_vcom_write:
 	add	x1, x1, :lo12:.LC19
 	.loc 1 2695 0
 	mov	x20, -1
-.LVL373:
+.LVL378:
 	.loc 1 2694 0
 	bl	_dev_err
-.LVL374:
+.LVL379:
 	.loc 1 2695 0
-	b	.L394
-.LVL375:
+	b	.L404
+.LVL380:
 	.p2align 3
-.L402:
+.L412:
 	.loc 1 2699 0
 	ldr	x0, [x22]
 	adrp	x1, .LC20
 	.loc 1 2700 0
 	mov	x20, -1
-.LVL376:
+.LVL381:
 	.loc 1 2699 0
 	add	x1, x1, :lo12:.LC20
 	bl	_dev_err
-.LVL377:
+.LVL382:
 	.loc 1 2700 0
-	b	.L394
-.L403:
+	b	.L404
+.L413:
 	.loc 1 2704 0
 	bl	__stack_chk_fail
-.LVL378:
+.LVL383:
 	.cfi_endproc
-.LFE2852:
+.LFE2851:
 	.size	pmic_vcom_write, .-pmic_vcom_write
 	.align	2
 	.p2align 3,,7
 	.type	waveform_version_read, %function
 waveform_version_read:
-.LFB2848:
+.LFB2847:
 	.loc 1 2640 0
 	.cfi_startproc
-.LVL379:
+.LVL384:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -4325,18 +4358,18 @@ waveform_version_read:
 	mov	x19, x2
 	.loc 1 2641 0
 	bl	epd_lut_get_wf_version
-.LVL380:
+.LVL385:
 	.loc 1 2643 0
 	mov	x2, x0
 	adrp	x1, .LC18
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC18
 	bl	sprintf
-.LVL381:
+.LVL386:
 	.loc 1 2644 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL382:
+.LVL387:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -4344,13 +4377,13 @@ waveform_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2848:
+.LFE2847:
 	.size	waveform_version_read, .-waveform_version_read
 	.section	.init.text,"ax",@progbits
 	.align	2
 	.type	ebc_init, %function
 ebc_init:
-.LFB2866:
+.LFB2865:
 	.loc 1 3185 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
@@ -4366,7 +4399,7 @@ ebc_init:
 	.cfi_def_cfa_register 29
 	.loc 1 3186 0
 	bl	__platform_driver_register
-.LVL383:
+.LVL388:
 	.loc 1 3187 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -4374,17 +4407,17 @@ ebc_init:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2866:
+.LFE2865:
 	.size	ebc_init, .-ebc_init
 	.text
 	.align	2
 	.p2align 3,,7
 	.type	direct_mode_data_change, %function
 direct_mode_data_change:
-.LFB2822:
+.LFB2821:
 	.loc 1 1154 0
 	.cfi_startproc
-.LVL384:
+.LVL389:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
@@ -4401,13 +4434,13 @@ direct_mode_data_change:
 	ldr	x4, [x3, 224]
 	ldr	w4, [x4, 64]
 	cmp	w4, 32
-	beq	.L460
+	beq	.L470
 	.loc 1 1158 0
 	cmp	w4, 16
-	beq	.L461
-.L417:
-.LBB1354:
-.LBB1355:
+	beq	.L471
+.L427:
+.LBB1352:
+.LBB1353:
 	.loc 1 1084 0
 	adrp	x6, .LANCHOR0
 	.loc 1 1090 0
@@ -4417,62 +4450,62 @@ direct_mode_data_change:
 	ldr	x11, [x6, #:lo12:.LANCHOR0]
 	.loc 1 1091 0
 	ldr	x3, [x3, 128]
-.LVL385:
+.LVL390:
 	.loc 1 1090 0
 	sub	w5, w5, w4
-.LVL386:
+.LVL391:
 	.loc 1 1092 0
 	add	x11, x11, 24
 	.loc 1 1091 0
 	lsl	w5, w5, 16
-.LVL387:
+.LVL392:
 	add	x5, x3, x5, sxtw
-.LVL388:
+.LVL393:
 	.loc 1 1095 0
 	ldr	w14, [x11, 88]
 	.loc 1 1094 0
 	ldr	w3, [x11, 84]
 	.loc 1 1092 0
 	ldr	w15, [x11, 156]
-.LVL389:
+.LVL394:
 	.loc 1 1097 0
 	cmp	w14, 0
 	.loc 1 1094 0
 	lsr	w13, w3, 3
 	.loc 1 1097 0
-	ble	.L408
+	ble	.L418
 	sub	w12, w13, #1
 	mov	w10, 0
-.LVL390:
+.LVL395:
 	add	x12, x12, 1
 	lsl	x16, x12, 2
 	lsl	x12, x12, 3
 	.loc 1 1098 0
-	cbz	w15, .L434
-.LVL391:
+	cbz	w15, .L444
+.LVL396:
 	.p2align 2
-.L462:
+.L472:
 	.loc 1 1099 0
 	ldr	w7, [x11, 88]
-.LVL392:
+.LVL397:
 	sub	w7, w7, #1
 	sub	w7, w7, w10
 	mul	w7, w7, w3
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL393:
-.L435:
+.LVL398:
+.L445:
 	.loc 1 1103 0
-	cbz	w13, .L436
+	cbz	w13, .L446
 	add	x9, x1, x16
 	mov	x8, x2
 	.p2align 2
-.L437:
+.L447:
 	.loc 1 1104 0
 	ldr	w3, [x1], 4
 	.loc 1 1105 0
 	ldr	w4, [x8], 8
-.LVL394:
+.LVL399:
 	.loc 1 1110 0
 	and	w20, w3, 15
 	.loc 1 1103 0
@@ -4525,7 +4558,7 @@ direct_mode_data_change:
 	orr	w30, w19, w30, lsl 6
 	.loc 1 1141 0
 	lsr	w3, w3, 28
-.LVL395:
+.LVL400:
 	.loc 1 1122 0
 	orr	w4, w4, w30
 	.loc 1 1124 0
@@ -4569,29 +4602,29 @@ direct_mode_data_change:
 	.loc 1 1145 0
 	strb	w3, [x7, -1]
 	.loc 1 1103 0
-	bne	.L437
+	bne	.L447
 	add	x2, x2, x12
-.L436:
+.L446:
 	.loc 1 1097 0
 	add	w10, w10, 1
 	cmp	w14, w10
-	beq	.L408
+	beq	.L418
 	ldr	w3, [x11, 84]
 	.loc 1 1098 0
-	cbnz	w15, .L462
-.L434:
+	cbnz	w15, .L472
+.L444:
 	.loc 1 1101 0
 	mul	w7, w10, w3
-.LVL396:
+.LVL401:
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL397:
-	b	.L435
-.LVL398:
+.LVL402:
+	b	.L445
+.LVL403:
 	.p2align 3
-.L408:
-.LBE1355:
-.LBE1354:
+.L418:
+.LBE1353:
+.LBE1352:
 	.loc 1 1170 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
@@ -4605,20 +4638,20 @@ direct_mode_data_change:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL399:
-.L461:
+.LVL404:
+.L471:
 	.cfi_restore_state
 	.loc 1 1159 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
 	cmp	w4, 16
-	bne	.L417
+	bne	.L427
 	.loc 1 1160 0
 	ldr	w13, [x3, 88]
-.LVL400:
-	cbz	w13, .L418
-.LBB1356:
-.LBB1357:
+.LVL405:
+	cbz	w13, .L428
+.LBB1354:
+.LBB1355:
 	.loc 1 898 0
 	adrp	x6, .LANCHOR0
 	.loc 1 904 0
@@ -4628,62 +4661,62 @@ direct_mode_data_change:
 	ldr	x12, [x6, #:lo12:.LANCHOR0]
 	.loc 1 905 0
 	ldr	x3, [x3, 128]
-.LVL401:
+.LVL406:
 	.loc 1 904 0
 	sub	w5, w5, w4
-.LVL402:
+.LVL407:
 	.loc 1 906 0
 	add	x12, x12, 24
 	.loc 1 905 0
 	lsl	w5, w5, 16
-.LVL403:
+.LVL408:
 	add	x5, x3, x5, sxtw
-.LVL404:
+.LVL409:
 	.loc 1 909 0
 	ldr	w14, [x12, 88]
 	.loc 1 908 0
 	ldr	w3, [x12, 84]
 	.loc 1 906 0
 	ldr	w15, [x12, 156]
-.LVL405:
+.LVL410:
 	.loc 1 914 0
 	cmp	w14, 0
 	.loc 1 908 0
 	lsr	w13, w3, 4
-.LVL406:
+.LVL411:
 	.loc 1 914 0
-	ble	.L408
+	ble	.L418
 	sub	w11, w13, #1
 	mov	w16, 0
-.LVL407:
+.LVL412:
 	add	x11, x11, 1
 	lsl	x11, x11, 3
 	.loc 1 915 0
-	cbz	w15, .L419
-.LVL408:
-.L463:
+	cbz	w15, .L429
+.LVL413:
+.L473:
 	.loc 1 916 0
 	ldr	w6, [x12, 88]
-.LVL409:
+.LVL414:
 	sub	w6, w6, #1
 	sub	w6, w6, w16
 	mul	w6, w6, w3
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL410:
-.L420:
+.LVL415:
+.L430:
 	.loc 1 920 0
-	cbz	w13, .L421
+	cbz	w13, .L431
 	mov	x7, 0
 	.p2align 2
-.L422:
+.L432:
 	.loc 1 922 0
 	ldr	x4, [x2, x7]
-.LVL411:
+.LVL416:
 	add	x6, x6, 4
 	.loc 1 921 0
 	ldr	x3, [x1, x7]
-.LVL412:
+.LVL417:
 	add	x7, x7, 8
 	.loc 1 924 0
 	and	w9, w4, 65535
@@ -4691,8 +4724,8 @@ direct_mode_data_change:
 	cmp	x11, x7
 	.loc 1 924 0
 	and	w8, w3, 65535
-.LBB1358:
-.LBB1359:
+.LBB1356:
+.LBB1357:
 	.loc 1 133 0
 	ubfiz	w19, w9, 8, 8
 	.loc 1 134 0
@@ -4701,181 +4734,181 @@ direct_mode_data_change:
 	add	w19, w19, w8, uxtb
 	.loc 1 134 0
 	add	w9, w9, w8, lsr 8
-.LBE1359:
-.LBE1358:
+.LBE1357:
+.LBE1356:
 	.loc 1 925 0
 	lsr	w10, w4, 16
 	lsr	w8, w3, 16
-.LBB1363:
-.LBB1364:
+.LBB1361:
+.LBB1362:
 	.loc 1 133 0
 	ubfiz	w18, w10, 8, 8
-.LBE1364:
-.LBE1363:
-.LBB1370:
-.LBB1360:
+.LBE1362:
+.LBE1361:
+.LBB1368:
+.LBB1358:
 	ldrb	w19, [x5, w19, sxtw]
-.LBE1360:
-.LBE1370:
-.LBB1371:
-.LBB1365:
+.LBE1358:
+.LBE1368:
+.LBB1369:
+.LBB1363:
 	.loc 1 134 0
 	and	w10, w10, 65280
-.LBE1365:
-.LBE1371:
-.LBB1372:
-.LBB1361:
+.LBE1363:
+.LBE1369:
+.LBB1370:
+.LBB1359:
 	ldrb	w17, [x5, w9, sxtw]
-.LBE1361:
-.LBE1372:
-.LBB1373:
-.LBB1366:
+.LBE1359:
+.LBE1370:
+.LBB1371:
+.LBB1364:
 	.loc 1 133 0
 	add	w18, w18, w8, uxtb
 	.loc 1 134 0
 	add	w10, w10, w8, lsr 8
-.LBE1366:
-.LBE1373:
+.LBE1364:
+.LBE1371:
 	.loc 1 926 0
 	ubfx	x9, x4, 32, 16
 	ubfx	x8, x3, 32, 16
 	.loc 1 927 0
 	lsr	x4, x4, 48
-.LVL413:
-.LBB1374:
-.LBB1362:
+.LVL418:
+.LBB1372:
+.LBB1360:
 	.loc 1 133 0
 	orr	w17, w19, w17, lsl 4
-.LBE1362:
-.LBE1374:
+.LBE1360:
+.LBE1372:
 	.loc 1 924 0
 	strb	w17, [x6, -4]
-.LBB1375:
-.LBB1376:
+.LBB1373:
+.LBB1374:
 	.loc 1 133 0
 	ubfiz	w17, w9, 8, 8
 	.loc 1 134 0
 	and	w9, w9, 65280
-.LBE1376:
-.LBE1375:
-.LBB1382:
-.LBB1367:
+.LBE1374:
+.LBE1373:
+.LBB1380:
+.LBB1365:
 	ldrb	w10, [x5, w10, sxtw]
-.LBE1367:
-.LBE1382:
-.LBB1383:
-.LBB1377:
+.LBE1365:
+.LBE1380:
+.LBB1381:
+.LBB1375:
 	.loc 1 133 0
 	add	w17, w17, w8, uxtb
-.LBE1377:
-.LBE1383:
-.LBB1384:
-.LBB1368:
+.LBE1375:
+.LBE1381:
+.LBB1382:
+.LBB1366:
 	ldrb	w18, [x5, w18, sxtw]
-.LBE1368:
-.LBE1384:
-.LBB1385:
-.LBB1378:
+.LBE1366:
+.LBE1382:
+.LBB1383:
+.LBB1376:
 	.loc 1 134 0
 	add	w8, w9, w8, lsr 8
-.LBE1378:
-.LBE1385:
+.LBE1376:
+.LBE1383:
 	.loc 1 927 0
 	lsr	x3, x3, 48
-.LVL414:
-.LBB1386:
-.LBB1369:
+.LVL419:
+.LBB1384:
+.LBB1367:
 	.loc 1 133 0
 	orr	w9, w18, w10, lsl 4
-.LBE1369:
-.LBE1386:
+.LBE1367:
+.LBE1384:
 	.loc 1 925 0
 	strb	w9, [x6, -3]
-.LBB1387:
-.LBB1388:
+.LBB1385:
+.LBB1386:
 	.loc 1 133 0
 	ubfiz	w9, w4, 8, 8
 	.loc 1 134 0
 	and	w4, w4, 65280
-.LBE1388:
-.LBE1387:
-.LBB1392:
-.LBB1379:
+.LBE1386:
+.LBE1385:
+.LBB1390:
+.LBB1377:
 	ldrb	w10, [x5, w8, sxtw]
-.LBE1379:
-.LBE1392:
-.LBB1393:
-.LBB1389:
+.LBE1377:
+.LBE1390:
+.LBB1391:
+.LBB1387:
 	.loc 1 133 0
 	add	w8, w9, w3, uxtb
-.LBE1389:
-.LBE1393:
-.LBB1394:
-.LBB1380:
+.LBE1387:
+.LBE1391:
+.LBB1392:
+.LBB1378:
 	ldrb	w17, [x5, w17, sxtw]
-.LBE1380:
-.LBE1394:
-.LBB1395:
-.LBB1390:
+.LBE1378:
+.LBE1392:
+.LBB1393:
+.LBB1388:
 	.loc 1 134 0
 	add	w3, w4, w3, lsr 8
-.LBE1390:
-.LBE1395:
-.LBB1396:
-.LBB1381:
+.LBE1388:
+.LBE1393:
+.LBB1394:
+.LBB1379:
 	.loc 1 133 0
 	orr	w4, w17, w10, lsl 4
-.LBE1381:
-.LBE1396:
+.LBE1379:
+.LBE1394:
 	.loc 1 926 0
 	strb	w4, [x6, -2]
-.LBB1397:
-.LBB1391:
+.LBB1395:
+.LBB1389:
 	.loc 1 134 0
 	ldrb	w3, [x5, w3, sxtw]
 	.loc 1 133 0
 	ldrb	w4, [x5, w8, sxtw]
 	orr	w3, w4, w3, lsl 4
-.LBE1391:
-.LBE1397:
+.LBE1389:
+.LBE1395:
 	.loc 1 927 0
 	strb	w3, [x6, -1]
 	.loc 1 920 0
-	bne	.L422
+	bne	.L432
 	add	x1, x1, x11
-.LVL415:
+.LVL420:
 	add	x2, x2, x11
-.LVL416:
-.L421:
+.LVL421:
+.L431:
 	.loc 1 914 0
 	add	w16, w16, 1
 	cmp	w14, w16
-	beq	.L408
+	beq	.L418
 	ldr	w3, [x12, 84]
 	.loc 1 915 0
-	cbnz	w15, .L463
-.L419:
+	cbnz	w15, .L473
+.L429:
 	.loc 1 918 0
 	mul	w6, w16, w3
-.LVL417:
+.LVL422:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL418:
-	b	.L420
-.LVL419:
-.L460:
-.LBE1357:
-.LBE1356:
+.LVL423:
+	b	.L430
+.LVL424:
+.L470:
+.LBE1355:
+.LBE1354:
 	.loc 1 1156 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
 	cmp	w4, 32
-	beq	.L464
+	beq	.L474
 	.loc 1 1165 0
 	cmp	w4, 16
-	bne	.L417
-.LBB1398:
-.LBB1399:
+	bne	.L427
+.LBB1396:
+.LBB1397:
 	.loc 1 1014 0
 	adrp	x6, .LANCHOR0
 	.loc 1 1020 0
@@ -4885,63 +4918,63 @@ direct_mode_data_change:
 	ldr	x11, [x6, #:lo12:.LANCHOR0]
 	.loc 1 1021 0
 	ldr	x3, [x3, 128]
-.LVL420:
+.LVL425:
 	.loc 1 1020 0
 	sub	w5, w5, w4
-.LVL421:
+.LVL426:
 	.loc 1 1022 0
 	add	x11, x11, 24
 	.loc 1 1021 0
 	lsl	w5, w5, 16
-.LVL422:
+.LVL427:
 	add	x5, x3, x5, sxtw
-.LVL423:
+.LVL428:
 	.loc 1 1025 0
 	ldr	w14, [x11, 88]
 	.loc 1 1024 0
 	ldr	w3, [x11, 84]
 	.loc 1 1022 0
 	ldr	w15, [x11, 156]
-.LVL424:
+.LVL429:
 	.loc 1 1027 0
 	cmp	w14, 0
 	.loc 1 1024 0
 	lsr	w13, w3, 3
 	.loc 1 1027 0
-	ble	.L408
+	ble	.L418
 	sub	w12, w13, #1
 	mov	w10, 0
-.LVL425:
+.LVL430:
 	add	x12, x12, 1
 	lsl	x16, x12, 3
 	lsl	x12, x12, 2
 	.loc 1 1028 0
-	cbz	w15, .L429
-.LVL426:
-.L465:
+	cbz	w15, .L439
+.LVL431:
+.L475:
 	.loc 1 1029 0
 	ldr	w7, [x11, 88]
-.LVL427:
+.LVL432:
 	sub	w7, w7, #1
 	sub	w7, w7, w10
 	mul	w7, w7, w3
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL428:
-.L430:
+.LVL433:
+.L440:
 	.loc 1 1033 0
-	cbz	w13, .L431
+	cbz	w13, .L441
 	add	x9, x1, x16
 	mov	x8, x2
 	.p2align 2
-.L432:
+.L442:
 	.loc 1 1034 0
 	ldr	w6, [x1], 8
 	.loc 1 1035 0
 	ldr	w3, [x8], 4
 	.loc 1 1033 0
 	cmp	x1, x9
-.LVL429:
+.LVL434:
 	.loc 1 1039 0
 	and	w4, w3, 255
 	.loc 1 1042 0
@@ -5048,30 +5081,30 @@ direct_mode_data_change:
 	.loc 1 1075 0
 	strb	w3, [x7, -1]
 	.loc 1 1033 0
-	bne	.L432
+	bne	.L442
 	add	x2, x2, x12
-.L431:
+.L441:
 	.loc 1 1027 0
 	add	w10, w10, 1
 	cmp	w14, w10
-	beq	.L408
+	beq	.L418
 	ldr	w3, [x11, 84]
 	.loc 1 1028 0
-	cbnz	w15, .L465
-.L429:
+	cbnz	w15, .L475
+.L439:
 	.loc 1 1031 0
 	mul	w7, w10, w3
-.LVL430:
+.LVL435:
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL431:
-	b	.L430
-.LVL432:
-.L418:
-.LBE1399:
-.LBE1398:
-.LBB1400:
-.LBB1401:
+.LVL436:
+	b	.L440
+.LVL437:
+.L428:
+.LBE1397:
+.LBE1396:
+.LBB1398:
+.LBB1399:
 	.loc 1 938 0
 	adrp	x5, .LANCHOR0
 	.loc 1 944 0
@@ -5081,159 +5114,159 @@ direct_mode_data_change:
 	ldr	x15, [x5, #:lo12:.LANCHOR0]
 	.loc 1 945 0
 	ldr	x3, [x3, 128]
-.LVL433:
+.LVL438:
 	.loc 1 944 0
 	sub	w7, w7, w4
-.LVL434:
+.LVL439:
 	.loc 1 946 0
 	add	x15, x15, 24
 	.loc 1 945 0
 	lsl	w7, w7, 16
-.LVL435:
+.LVL440:
 	add	x7, x3, x7, sxtw
-.LVL436:
+.LVL441:
 	.loc 1 949 0
 	ldr	w16, [x15, 88]
 	.loc 1 948 0
 	ldr	w3, [x15, 84]
 	.loc 1 946 0
 	ldr	w17, [x15, 156]
-.LVL437:
+.LVL442:
 	.loc 1 954 0
 	cmp	w16, 0
 	.loc 1 948 0
 	lsr	w12, w3, 3
-.LVL438:
+.LVL443:
 	.loc 1 954 0
-	ble	.L408
+	ble	.L418
 	sub	w14, w12, #1
 	add	x14, x14, 1
 	lsl	x14, x14, 2
 	.loc 1 955 0
-	cbz	w17, .L424
-.LVL439:
-.L466:
+	cbz	w17, .L434
+.LVL444:
+.L476:
 	.loc 1 956 0
 	ldr	w10, [x15, 88]
-.LVL440:
+.LVL445:
 	sub	w10, w10, #1
 	sub	w10, w10, w13
 	mul	w10, w10, w3
 	lsr	w10, w10, 2
 	add	x10, x0, x10
-.LVL441:
-.L425:
+.LVL446:
+.L435:
 	.loc 1 960 0
-	cbz	w12, .L426
+	cbz	w12, .L436
 	mov	x5, 0
 	.p2align 2
-.L427:
+.L437:
 	.loc 1 962 0
 	ldr	w3, [x2, x5, lsl 2]
 	.loc 1 961 0
 	ldr	w4, [x1, x5, lsl 2]
 	add	x5, x5, 1
-.LVL442:
-.LBB1402:
-.LBB1403:
+.LVL447:
+.LBB1400:
+.LBB1401:
 	.loc 1 134 0
 	and	w9, w3, 65280
-.LBE1403:
-.LBE1402:
+.LBE1401:
+.LBE1400:
 	.loc 1 960 0
 	cmp	w12, w5
-.LVL443:
+.LVL448:
 	.loc 1 964 0
 	and	w6, w4, 65535
-.LBB1408:
-.LBB1404:
+.LBB1406:
+.LBB1402:
 	.loc 1 133 0
 	ubfiz	w8, w3, 8, 8
 	.loc 1 134 0
 	add	w9, w9, w6, lsr 8
 	.loc 1 133 0
 	add	w6, w8, w6, uxtb
-.LBE1404:
-.LBE1408:
+.LBE1402:
+.LBE1406:
 	.loc 1 965 0
 	lsr	w3, w3, 16
-.LVL444:
+.LVL449:
 	lsr	w4, w4, 16
-.LBB1409:
-.LBB1410:
+.LBB1407:
+.LBB1408:
 	.loc 1 133 0
 	ubfiz	w8, w3, 8, 8
 	.loc 1 134 0
 	and	w3, w3, 65280
-.LBE1410:
-.LBE1409:
-.LBB1414:
-.LBB1405:
+.LBE1408:
+.LBE1407:
+.LBB1412:
+.LBB1403:
 	.loc 1 133 0
 	ldrb	w11, [x7, w6, sxtw]
-.LBE1405:
-.LBE1414:
-.LBB1415:
-.LBB1411:
+.LBE1403:
+.LBE1412:
+.LBB1413:
+.LBB1409:
 	.loc 1 134 0
 	add	w3, w3, w4, lsr 8
-.LBE1411:
-.LBE1415:
-.LBB1416:
-.LBB1406:
+.LBE1409:
+.LBE1413:
+.LBB1414:
+.LBB1404:
 	ldrb	w9, [x7, w9, sxtw]
-.LBE1406:
-.LBE1416:
-.LBB1417:
-.LBB1412:
+.LBE1404:
+.LBE1414:
+.LBB1415:
+.LBB1410:
 	.loc 1 133 0
 	add	w6, w8, w4, uxtb
-.LBE1412:
-.LBE1417:
-.LBB1418:
-.LBB1407:
+.LBE1410:
+.LBE1415:
+.LBB1416:
+.LBB1405:
 	orr	w4, w11, w9, lsl 4
-.LBE1407:
-.LBE1418:
+.LBE1405:
+.LBE1416:
 	.loc 1 964 0
 	strb	w4, [x10], 2
-.LBB1419:
-.LBB1413:
+.LBB1417:
+.LBB1411:
 	.loc 1 134 0
 	ldrb	w3, [x7, w3, sxtw]
 	.loc 1 133 0
 	ldrb	w4, [x7, w6, sxtw]
 	orr	w3, w4, w3, lsl 4
-.LBE1413:
-.LBE1419:
+.LBE1411:
+.LBE1417:
 	.loc 1 965 0
 	strb	w3, [x10, -1]
 	.loc 1 960 0
-	bgt	.L427
+	bgt	.L437
 	add	x1, x1, x14
 	add	x2, x2, x14
-.L426:
+.L436:
 	.loc 1 954 0
 	add	w13, w13, 1
 	cmp	w16, w13
-	beq	.L408
+	beq	.L418
 	ldr	w3, [x15, 84]
 	.loc 1 955 0
-	cbnz	w17, .L466
-.L424:
+	cbnz	w17, .L476
+.L434:
 	.loc 1 958 0
 	mul	w10, w13, w3
-.LVL445:
+.LVL450:
 	lsr	w10, w10, 2
 	add	x10, x0, x10
-.LVL446:
-	b	.L425
-.LVL447:
-.L464:
-.LBE1401:
-.LBE1400:
-.LBB1420:
-.LBB1421:
+.LVL451:
+	b	.L435
+.LVL452:
+.L474:
+.LBE1399:
+.LBE1398:
+.LBB1418:
+.LBB1419:
 	.loc 1 975 0
 	adrp	x5, .LANCHOR0
 	.loc 1 981 0
@@ -5243,173 +5276,173 @@ direct_mode_data_change:
 	ldr	x15, [x5, #:lo12:.LANCHOR0]
 	.loc 1 982 0
 	ldr	x3, [x3, 128]
-.LVL448:
+.LVL453:
 	.loc 1 981 0
 	sub	w8, w8, w4
-.LVL449:
+.LVL454:
 	.loc 1 983 0
 	add	x15, x15, 24
 	.loc 1 982 0
 	lsl	w8, w8, 16
-.LVL450:
+.LVL455:
 	add	x8, x3, x8, sxtw
-.LVL451:
+.LVL456:
 	.loc 1 988 0
 	ldr	w16, [x15, 88]
 	.loc 1 987 0
 	ldr	w3, [x15, 84]
 	.loc 1 983 0
 	ldr	w17, [x15, 156]
-.LVL452:
+.LVL457:
 	.loc 1 993 0
 	cmp	w16, 0
 	.loc 1 987 0
 	lsr	w12, w3, 2
-.LVL453:
+.LVL458:
 	.loc 1 993 0
-	ble	.L408
+	ble	.L418
 	sub	w14, w12, #1
 	mov	w13, 0
-.LVL454:
+.LVL459:
 	add	x14, x14, 1
 	lsl	x14, x14, 2
 	.loc 1 994 0
-	cbz	w17, .L413
-.LVL455:
-.L467:
+	cbz	w17, .L423
+.LVL460:
+.L477:
 	.loc 1 995 0
 	ldr	w11, [x15, 88]
-.LVL456:
+.LVL461:
 	sub	w11, w11, #1
 	sub	w11, w11, w13
 	mul	w11, w11, w3
 	lsr	w11, w11, 2
 	add	x11, x0, x11
-.LVL457:
-.L414:
+.LVL462:
+.L424:
 	.loc 1 999 0
-	cbz	w12, .L415
+	cbz	w12, .L425
 	mov	x4, 0
 	.p2align 2
-.L416:
+.L426:
 	.loc 1 1001 0
 	ldr	w5, [x2, x4, lsl 2]
 	.loc 1 1000 0
 	ldr	w3, [x1, x4, lsl 2]
-.LVL458:
-.LBB1422:
-.LBB1423:
+.LVL463:
+.LBB1420:
+.LBB1421:
 	.loc 1 140 0
 	and	w9, w5, 65280
-.LBE1423:
-.LBE1422:
+.LBE1421:
+.LBE1420:
 	.loc 1 1004 0
 	lsr	w7, w5, 16
-.LVL459:
+.LVL464:
 	.loc 1 1003 0
 	and	w6, w3, 65535
-.LBB1428:
-.LBB1429:
+.LBB1426:
+.LBB1427:
 	.loc 1 139 0
 	ubfiz	w10, w7, 8, 8
-.LBE1429:
-.LBE1428:
+.LBE1427:
+.LBE1426:
 	.loc 1 1004 0
 	lsr	w3, w3, 16
-.LBB1434:
-.LBB1430:
+.LBB1432:
+.LBB1428:
 	.loc 1 140 0
 	and	w7, w7, 65280
 	.loc 1 139 0
 	add	w10, w10, w3, uxtb
-.LBE1430:
-.LBE1434:
-.LBB1435:
-.LBB1424:
+.LBE1428:
+.LBE1432:
+.LBB1433:
+.LBB1422:
 	ubfiz	w5, w5, 8, 8
-.LVL460:
-.LBE1424:
-.LBE1435:
-.LBB1436:
-.LBB1431:
+.LVL465:
+.LBE1422:
+.LBE1433:
+.LBB1434:
+.LBB1429:
 	.loc 1 140 0
 	add	w3, w7, w3, lsr 8
-.LBE1431:
-.LBE1436:
-.LBB1437:
-.LBB1425:
+.LBE1429:
+.LBE1434:
+.LBB1435:
+.LBB1423:
 	.loc 1 139 0
 	add	w5, w5, w6, uxtb
 	.loc 1 140 0
 	add	w7, w9, w6, lsr 8
-.LBE1425:
-.LBE1437:
-.LBB1438:
-.LBB1432:
+.LBE1423:
+.LBE1435:
+.LBB1436:
+.LBB1430:
 	.loc 1 139 0
 	ldrb	w9, [x8, w10, sxtw]
 	.loc 1 140 0
 	ldrb	w3, [x8, w3, sxtw]
-.LBE1432:
-.LBE1438:
-.LBB1439:
-.LBB1426:
+.LBE1430:
+.LBE1436:
+.LBB1437:
+.LBB1424:
 	ldrb	w6, [x8, w7, sxtw]
 	.loc 1 139 0
 	ldrb	w5, [x8, w5, sxtw]
-.LBE1426:
-.LBE1439:
-.LBB1440:
-.LBB1433:
+.LBE1424:
+.LBE1437:
+.LBB1438:
+.LBB1431:
 	orr	w3, w9, w3, lsl 2
-.LBE1433:
-.LBE1440:
+.LBE1431:
+.LBE1438:
 	.loc 1 1005 0
 	ubfiz	w3, w3, 4, 8
-.LBB1441:
-.LBB1427:
+.LBB1439:
+.LBB1425:
 	.loc 1 139 0
 	orr	w5, w5, w6, lsl 2
-.LBE1427:
-.LBE1441:
+.LBE1425:
+.LBE1439:
 	.loc 1 1005 0
 	orr	w3, w3, w5
 	strb	w3, [x11, x4]
 	add	x4, x4, 1
 	.loc 1 999 0
 	cmp	w12, w4
-	bgt	.L416
+	bgt	.L426
 	add	x1, x1, x14
 	add	x2, x2, x14
-.L415:
+.L425:
 	.loc 1 993 0
 	add	w13, w13, 1
 	cmp	w16, w13
-	beq	.L408
+	beq	.L418
 	ldr	w3, [x15, 84]
 	.loc 1 994 0
-	cbnz	w17, .L467
-.L413:
+	cbnz	w17, .L477
+.L423:
 	.loc 1 997 0
 	mul	w11, w13, w3
-.LVL461:
+.LVL466:
 	lsr	w11, w11, 2
 	add	x11, x0, x11
-.LVL462:
-	b	.L414
-.LBE1421:
-.LBE1420:
+.LVL467:
+	b	.L424
+.LBE1419:
+.LBE1418:
 	.cfi_endproc
-.LFE2822:
+.LFE2821:
 	.size	direct_mode_data_change, .-direct_mode_data_change
 	.align	2
 	.p2align 3,,7
 	.type	direct_mode_data_change_part, %function
 direct_mode_data_change_part:
-.LFB2828:
+.LFB2827:
 	.loc 1 1458 0
 	.cfi_startproc
-.LVL463:
+.LVL468:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
@@ -5434,13 +5467,13 @@ direct_mode_data_change_part:
 	ldr	x4, [x3, 224]
 	ldr	w4, [x4, 64]
 	cmp	w4, 32
-	beq	.L642
+	beq	.L652
 	.loc 1 1462 0
 	cmp	w4, 16
-	beq	.L643
-.L485:
-.LBB1468:
-.LBB1469:
+	beq	.L653
+.L495:
+.LBB1466:
+.LBB1467:
 	.loc 1 1381 0
 	adrp	x5, .LANCHOR0
 	.loc 1 1387 0
@@ -5450,57 +5483,57 @@ direct_mode_data_change_part:
 	ldr	x11, [x5, #:lo12:.LANCHOR0]
 	.loc 1 1388 0
 	ldr	x3, [x3, 128]
-.LVL464:
+.LVL469:
 	.loc 1 1387 0
 	sub	w6, w6, w4
-.LVL465:
+.LVL470:
 	.loc 1 1389 0
 	add	x11, x11, 24
 	.loc 1 1388 0
 	lsl	w6, w6, 16
-.LVL466:
+.LVL471:
 	add	x6, x3, x6, sxtw
-.LVL467:
+.LVL472:
 	.loc 1 1392 0
 	ldr	w14, [x11, 88]
 	.loc 1 1391 0
 	ldr	w3, [x11, 84]
 	.loc 1 1389 0
 	ldr	w15, [x11, 156]
-.LVL468:
+.LVL473:
 	.loc 1 1394 0
 	cmp	w14, 0
 	.loc 1 1391 0
 	lsr	w13, w3, 3
 	.loc 1 1394 0
-	ble	.L468
+	ble	.L478
 	sub	w12, w13, #1
 	mov	w10, 0
-.LVL469:
+.LVL474:
 	add	x12, x12, 1
 	lsl	x16, x12, 2
 	lsl	x12, x12, 3
 	.loc 1 1395 0
-	cbz	w15, .L544
-.LVL470:
+	cbz	w15, .L554
+.LVL475:
 	.p2align 2
-.L644:
+.L654:
 	.loc 1 1396 0
 	ldr	w7, [x11, 88]
-.LVL471:
+.LVL476:
 	sub	w7, w7, #1
 	sub	w7, w7, w10
 	mul	w7, w7, w3
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL472:
-.L545:
+.LVL477:
+.L555:
 	.loc 1 1400 0
-	cbz	w13, .L546
+	cbz	w13, .L556
 	add	x9, x1, x16
 	mov	x8, x2
 	.p2align 2
-.L557:
+.L567:
 	.loc 1 1402 0
 	ldr	w5, [x8]
 	.loc 1 1407 0
@@ -5509,43 +5542,43 @@ direct_mode_data_change_part:
 	ldr	w4, [x1], 4
 	.loc 1 1406 0
 	ubfx	x17, x5, 4, 4
-.LVL473:
+.LVL478:
 	.loc 1 1405 0
 	and	w18, w4, 15
 	.loc 1 1407 0
 	cmp	w18, w17
-	beq	.L547
+	beq	.L557
 	.loc 1 1408 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w3, [x6, w17, sxtw]
 	and	w3, w3, 3
-.L547:
+.L557:
 	.loc 1 1410 0
 	ubfx	x18, x4, 4, 4
 	.loc 1 1411 0
 	ubfx	x17, x5, 12, 4
 	.loc 1 1412 0
 	cmp	w18, w17
-	beq	.L548
+	beq	.L558
 	.loc 1 1413 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w17, [x6, w17, sxtw]
 	ubfiz	w17, w17, 2, 2
 	orr	w3, w3, w17
-.L548:
+.L558:
 	.loc 1 1415 0
 	ubfx	x18, x4, 8, 4
 	.loc 1 1416 0
 	ubfx	x17, x5, 20, 4
 	.loc 1 1417 0
 	cmp	w18, w17
-	beq	.L640
+	beq	.L650
 	.loc 1 1418 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w17, [x6, w17, sxtw]
 	ubfiz	w17, w17, 4, 2
 	orr	w3, w3, w17
-.L640:
+.L650:
 	.loc 1 1420 0
 	ubfx	x17, x4, 12, 4
 	.loc 1 1421 0
@@ -5554,13 +5587,13 @@ direct_mode_data_change_part:
 	and	w3, w3, 255
 	.loc 1 1422 0
 	cmp	w17, w5
-	beq	.L551
+	beq	.L561
 	.loc 1 1423 0
 	add	w5, w17, w5, lsl 8
 	ldrb	w5, [x6, w5, sxtw]
 	orr	w3, w3, w5, lsl 6
 	and	w3, w3, 255
-.L551:
+.L561:
 	add	x8, x8, 8
 	.loc 1 1425 0
 	strb	w3, [x7]
@@ -5574,91 +5607,91 @@ direct_mode_data_change_part:
 	ubfx	x17, x5, 4, 4
 	.loc 1 1432 0
 	cmp	w18, w17
-	beq	.L552
+	beq	.L562
 	.loc 1 1433 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w3, [x6, w17, sxtw]
 	and	w3, w3, 3
-.L552:
+.L562:
 	.loc 1 1435 0
 	ubfx	x18, x4, 20, 4
 	.loc 1 1436 0
 	ubfx	x17, x5, 12, 4
 	.loc 1 1437 0
 	cmp	w18, w17
-	beq	.L553
+	beq	.L563
 	.loc 1 1438 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w17, [x6, w17, sxtw]
 	ubfiz	w17, w17, 2, 2
 	orr	w3, w3, w17
-.L553:
+.L563:
 	.loc 1 1440 0
 	ubfx	x18, x4, 24, 4
 	.loc 1 1441 0
 	ubfx	x17, x5, 20, 4
 	.loc 1 1442 0
 	cmp	w18, w17
-	beq	.L641
+	beq	.L651
 	.loc 1 1443 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w17, [x6, w17, sxtw]
 	ubfiz	w17, w17, 4, 2
 	orr	w3, w3, w17
-.L641:
+.L651:
 	.loc 1 1445 0
 	lsr	w4, w4, 28
-.LVL474:
+.LVL479:
 	.loc 1 1446 0
 	lsr	w5, w5, 28
 	.loc 1 1443 0
 	and	w3, w3, 255
 	.loc 1 1447 0
 	cmp	w4, w5
-	beq	.L556
+	beq	.L566
 	.loc 1 1448 0
 	add	w4, w4, w5, lsl 8
 	ldrb	w4, [x6, w4, sxtw]
 	orr	w3, w3, w4, lsl 6
 	and	w3, w3, 255
-.L556:
+.L566:
 	add	x7, x7, 2
 	.loc 1 1450 0
 	strb	w3, [x7, -1]
 	.loc 1 1400 0
 	cmp	x1, x9
-	bne	.L557
+	bne	.L567
 	add	x2, x2, x12
-.L546:
+.L556:
 	.loc 1 1394 0
 	add	w10, w10, 1
 	cmp	w14, w10
-	beq	.L468
+	beq	.L478
 	ldr	w3, [x11, 84]
 	.loc 1 1395 0
-	cbnz	w15, .L644
-.L544:
+	cbnz	w15, .L654
+.L554:
 	.loc 1 1398 0
 	mul	w7, w10, w3
-.LVL475:
+.LVL480:
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL476:
-	b	.L545
-.LVL477:
+.LVL481:
+	b	.L555
+.LVL482:
 	.p2align 3
-.L468:
-.LBE1469:
-.LBE1468:
+.L478:
+.LBE1467:
+.LBE1466:
 	.loc 1 1474 0
 	ldp	x19, x20, [sp, 16]
-.LVL478:
+.LVL483:
 	ldp	x21, x22, [sp, 32]
-.LVL479:
+.LVL484:
 	ldp	x23, x24, [sp, 48]
-.LVL480:
+.LVL485:
 	ldp	x25, x26, [sp, 64]
-.LVL481:
+.LVL486:
 	ldr	x27, [sp, 80]
 	ldp	x29, x30, [sp], 96
 	.cfi_remember_state
@@ -5674,29 +5707,29 @@ direct_mode_data_change_part:
 	.cfi_restore 19
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
-.LVL482:
+.LVL487:
 	ret
-.LVL483:
-.L643:
+.LVL488:
+.L653:
 	.cfi_restore_state
 	.loc 1 1463 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
 	cmp	w4, 16
-	bne	.L485
+	bne	.L495
 	.loc 1 1464 0
 	ldr	w15, [x3, 88]
-.LBB1470:
-.LBB1471:
+.LBB1468:
+.LBB1469:
 	.loc 1 1218 0
 	adrp	x5, .LANCHOR0
-.LVL484:
-.LBE1471:
-.LBE1470:
+.LVL489:
+.LBE1469:
+.LBE1468:
 	.loc 1 1464 0
-	cbz	w15, .L486
-.LBB1484:
+	cbz	w15, .L496
 .LBB1482:
+.LBB1480:
 	.loc 1 1218 0
 	ldr	x12, [x5, #:lo12:.LANCHOR0]
 	.loc 1 1223 0
@@ -5706,84 +5739,84 @@ direct_mode_data_change_part:
 	add	x12, x12, 24
 	.loc 1 1224 0
 	ldr	x3, [x3, 128]
-.LVL485:
+.LVL490:
 	.loc 1 1223 0
 	sub	w9, w9, w4
-.LVL486:
+.LVL491:
 	.loc 1 1228 0
 	ldr	w13, [x12, 88]
 	.loc 1 1224 0
 	lsl	w9, w9, 16
-.LVL487:
+.LVL492:
 	.loc 1 1225 0
 	ldr	w14, [x12, 156]
 	.loc 1 1224 0
 	add	x9, x3, x9, sxtw
-.LVL488:
+.LVL493:
 	.loc 1 1227 0
 	ldr	w3, [x12, 84]
-.LVL489:
+.LVL494:
 	.loc 1 1233 0
 	cmp	w13, 0
 	.loc 1 1227 0
 	lsr	w11, w3, 4
-.LVL490:
+.LVL495:
 	.loc 1 1233 0
-	ble	.L468
+	ble	.L478
 	sub	w16, w11, #1
 	mov	w15, 0
-.LVL491:
+.LVL496:
 	add	x16, x16, 1
-.LBB1472:
-.LBB1473:
+.LBB1470:
+.LBB1471:
 	.loc 1 145 0
 	mov	w10, 3
 	lsl	x16, x16, 3
-.LBE1473:
-.LBE1472:
+.LBE1471:
+.LBE1470:
 	.loc 1 1234 0
-	cbz	w14, .L487
-.LVL492:
-.L645:
+	cbz	w14, .L497
+.LVL497:
+.L655:
 	.loc 1 1235 0
 	ldr	w5, [x12, 88]
-.LVL493:
+.LVL498:
 	sub	w5, w5, #1
 	sub	w5, w5, w15
 	mul	w5, w5, w3
 	lsr	w5, w5, 2
 	add	x5, x0, x5
-.LVL494:
-.L488:
+.LVL499:
+.L498:
 	.loc 1 1239 0
-	cbz	w11, .L489
+	cbz	w11, .L499
 	add	x5, x5, 4
-.LVL495:
+.LVL500:
 	mov	x8, 0
-.LVL496:
+.LVL501:
 	.p2align 2
-.L512:
+.L522:
 	.loc 1 1240 0
 	ldr	x3, [x1, x8, lsl 3]
 	.loc 1 1241 0
 	ldr	x4, [x2, x8, lsl 3]
 	.loc 1 1242 0
 	cmp	x3, x4
-	beq	.L490
+	beq	.L500
 	.loc 1 1243 0
 	and	w17, w4, 65535
 	and	w7, w3, 65535
-.LVL497:
-.LBB1475:
-.LBB1476:
+.LVL502:
+.LBB1473:
+.LBB1474:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
 	cmp	w17, w7
-	beq	.L491
+	beq	.L501
 	.loc 1 146 0
 	eor	w18, w17, w7
-.LVL498:
+.LVL503:
 	.loc 1 159 0
 	ubfiz	w30, w17, 8, 8
 	.loc 1 160 0
@@ -5821,25 +5854,25 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w6, w7, w6
 	and	w6, w6, 255
-.LVL499:
-.L491:
-.LBE1476:
-.LBE1475:
+.LVL504:
+.L501:
+.LBE1474:
+.LBE1473:
 	.loc 1 1243 0
 	strb	w6, [x5, -4]
 	.loc 1 1244 0
 	lsr	w17, w4, 16
 	lsr	w7, w3, 16
-.LBB1477:
-.LBB1478:
+.LBB1475:
+.LBB1476:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
 	cmp	w17, w7
-	beq	.L496
+	beq	.L506
 	.loc 1 146 0
 	eor	w18, w17, w7
-.LVL500:
+.LVL505:
 	.loc 1 159 0
 	ubfiz	w30, w17, 8, 8
 	.loc 1 160 0
@@ -5877,25 +5910,25 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w6, w7, w6
 	and	w6, w6, 255
-.LVL501:
-.L496:
-.LBE1478:
-.LBE1477:
+.LVL506:
+.L506:
+.LBE1476:
+.LBE1475:
 	.loc 1 1244 0
 	strb	w6, [x5, -3]
 	.loc 1 1245 0
 	ubfx	x17, x4, 32, 16
 	ubfx	x7, x3, 32, 16
-.LBB1479:
-.LBB1480:
+.LBB1477:
+.LBB1478:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
 	cmp	w17, w7
-	beq	.L501
+	beq	.L511
 	.loc 1 146 0
 	eor	w18, w17, w7
-.LVL502:
+.LVL507:
 	.loc 1 159 0
 	ubfiz	w30, w17, 8, 8
 	.loc 1 160 0
@@ -5933,27 +5966,27 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w6, w7, w6
 	and	w6, w6, 255
-.LVL503:
-.L501:
-.LBE1480:
-.LBE1479:
+.LVL508:
+.L511:
+.LBE1478:
+.LBE1477:
 	.loc 1 1245 0
 	strb	w6, [x5, -2]
 	.loc 1 1246 0
 	lsr	x4, x4, 48
-.LVL504:
+.LVL509:
 	lsr	x3, x3, 48
-.LVL505:
-.LBB1481:
-.LBB1474:
+.LVL510:
+.LBB1479:
+.LBB1472:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
 	cmp	w4, w3
-	beq	.L506
+	beq	.L516
 	.loc 1 146 0
 	eor	w7, w4, w3
-.LVL506:
+.LVL511:
 	.loc 1 159 0
 	ubfiz	w6, w4, 8, 8
 	.loc 1 160 0
@@ -5969,7 +6002,7 @@ direct_mode_data_change_part:
 	.loc 1 153 0
 	tst	w7, 240
 	orr	w18, w4, 12
-.LVL507:
+.LVL512:
 	.loc 1 159 0
 	ldrb	w17, [x9, w6, sxtw]
 	.loc 1 153 0
@@ -5992,54 +6025,54 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w4, w6, w4
 	and	w6, w4, 255
-.LVL508:
-.L506:
-.LBE1474:
-.LBE1481:
+.LVL513:
+.L516:
+.LBE1472:
+.LBE1479:
 	.loc 1 1246 0
 	strb	w6, [x5, -1]
-.LVL509:
-.L511:
+.LVL514:
+.L521:
 	add	x8, x8, 1
 	add	x5, x5, 4
 	.loc 1 1239 0
 	cmp	w11, w8
-	bgt	.L512
+	bgt	.L522
 	add	x1, x1, x16
-.LVL510:
+.LVL515:
 	add	x2, x2, x16
-.LVL511:
-.L489:
+.LVL516:
+.L499:
 	.loc 1 1233 0
 	add	w15, w15, 1
 	cmp	w13, w15
-	beq	.L468
+	beq	.L478
 	ldr	w3, [x12, 84]
-.LVL512:
+.LVL517:
 	.loc 1 1234 0
-	cbnz	w14, .L645
-.L487:
+	cbnz	w14, .L655
+.L497:
 	.loc 1 1237 0
 	mul	w5, w15, w3
-.LVL513:
+.LVL518:
 	lsr	w5, w5, 2
 	add	x5, x0, x5
-.LVL514:
-	b	.L488
-.LVL515:
-.L642:
+.LVL519:
+	b	.L498
+.LVL520:
+.L652:
+.LBE1480:
 .LBE1482:
-.LBE1484:
 	.loc 1 1460 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
 	cmp	w4, 32
-	beq	.L646
+	beq	.L656
 	.loc 1 1469 0
 	cmp	w4, 16
-	bne	.L485
-.LBB1485:
-.LBB1486:
+	bne	.L495
+.LBB1483:
+.LBB1484:
 	.loc 1 1303 0
 	adrp	x5, .LANCHOR0
 	.loc 1 1309 0
@@ -6049,63 +6082,63 @@ direct_mode_data_change_part:
 	ldr	x11, [x5, #:lo12:.LANCHOR0]
 	.loc 1 1310 0
 	ldr	x3, [x3, 128]
-.LVL516:
+.LVL521:
 	.loc 1 1309 0
 	sub	w6, w6, w4
-.LVL517:
+.LVL522:
 	.loc 1 1311 0
 	add	x11, x11, 24
 	.loc 1 1310 0
 	lsl	w6, w6, 16
-.LVL518:
+.LVL523:
 	add	x6, x3, x6, sxtw
-.LVL519:
+.LVL524:
 	.loc 1 1314 0
 	ldr	w14, [x11, 88]
 	.loc 1 1313 0
 	ldr	w3, [x11, 84]
 	.loc 1 1311 0
 	ldr	w15, [x11, 156]
-.LVL520:
+.LVL525:
 	.loc 1 1316 0
 	cmp	w14, 0
 	.loc 1 1313 0
 	lsr	w13, w3, 3
 	.loc 1 1316 0
-	ble	.L468
+	ble	.L478
 	sub	w12, w13, #1
 	mov	w10, 0
-.LVL521:
+.LVL526:
 	add	x12, x12, 1
 	lsl	x16, x12, 3
 	lsl	x12, x12, 2
 	.loc 1 1317 0
-	cbz	w15, .L531
-.LVL522:
-.L647:
+	cbz	w15, .L541
+.LVL527:
+.L657:
 	.loc 1 1318 0
 	ldr	w7, [x11, 88]
-.LVL523:
+.LVL528:
 	sub	w7, w7, #1
 	sub	w7, w7, w10
 	mul	w7, w7, w3
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL524:
-.L532:
+.LVL529:
+.L542:
 	.loc 1 1322 0
-	cbz	w13, .L533
+	cbz	w13, .L543
 	add	x9, x1, x16
 	mov	x8, x2
 	.p2align 2
-.L542:
+.L552:
 	.loc 1 1324 0
 	ldr	w3, [x8], 4
 	.loc 1 1325 0
 	mov	w17, 0
 	.loc 1 1323 0
 	ldr	w4, [x1]
-.LVL525:
+.LVL530:
 	.loc 1 1328 0
 	and	w5, w3, 255
 	ubfiz	w18, w5, 4, 4
@@ -6113,11 +6146,11 @@ direct_mode_data_change_part:
 	and	w30, w4, 248
 	.loc 1 1329 0
 	cmp	w30, w18
-	beq	.L534
+	beq	.L544
 	.loc 1 1330 0
 	add	w18, w30, w18, lsl 8
 	ldrb	w17, [x6, w18, sxtw]
-.L534:
+.L544:
 	.loc 1 1332 0
 	lsr	w18, w4, 8
 	.loc 1 1333 0
@@ -6126,13 +6159,13 @@ direct_mode_data_change_part:
 	and	w18, w18, 248
 	.loc 1 1334 0
 	cmp	w18, w5
-	beq	.L535
+	beq	.L545
 	.loc 1 1335 0
 	add	w5, w18, w5, lsl 8
 	ldrb	w5, [x6, w5, sxtw]
 	orr	w17, w17, w5, lsl 2
 	and	w17, w17, 255
-.L535:
+.L545:
 	.loc 1 1337 0
 	lsr	w18, w4, 16
 	.loc 1 1338 0
@@ -6143,13 +6176,13 @@ direct_mode_data_change_part:
 	and	w5, w5, 240
 	.loc 1 1339 0
 	cmp	w18, w5
-	beq	.L536
+	beq	.L546
 	.loc 1 1340 0
 	add	w5, w18, w5, lsl 8
 	ldrb	w5, [x6, w5, sxtw]
 	orr	w17, w17, w5, lsl 4
 	and	w17, w17, 255
-.L536:
+.L546:
 	.loc 1 1342 0
 	lsr	w4, w4, 24
 	.loc 1 1343 0
@@ -6160,13 +6193,13 @@ direct_mode_data_change_part:
 	and	w5, w5, 240
 	.loc 1 1344 0
 	cmp	w4, w5
-	beq	.L537
+	beq	.L547
 	.loc 1 1345 0
 	add	w4, w4, w5, lsl 8
 	ldrb	w4, [x6, w4, sxtw]
 	orr	w17, w17, w4, lsl 6
 	and	w17, w17, 255
-.L537:
+.L547:
 	add	x1, x1, 8
 	.loc 1 1347 0
 	strb	w17, [x7]
@@ -6182,11 +6215,11 @@ direct_mode_data_change_part:
 	and	w18, w4, 248
 	.loc 1 1354 0
 	cmp	w18, w5
-	beq	.L538
+	beq	.L548
 	.loc 1 1355 0
 	add	w5, w18, w5, lsl 8
 	ldrb	w17, [x6, w5, sxtw]
-.L538:
+.L548:
 	.loc 1 1357 0
 	lsr	w18, w4, 8
 	.loc 1 1358 0
@@ -6197,13 +6230,13 @@ direct_mode_data_change_part:
 	and	w5, w5, 240
 	.loc 1 1359 0
 	cmp	w18, w5
-	beq	.L539
+	beq	.L549
 	.loc 1 1360 0
 	add	w5, w18, w5, lsl 8
 	ldrb	w5, [x6, w5, sxtw]
 	orr	w17, w17, w5, lsl 2
 	and	w17, w17, 255
-.L539:
+.L549:
 	.loc 1 1362 0
 	lsr	w18, w4, 16
 	.loc 1 1363 0
@@ -6214,13 +6247,13 @@ direct_mode_data_change_part:
 	and	w5, w5, 240
 	.loc 1 1364 0
 	cmp	w18, w5
-	beq	.L540
+	beq	.L550
 	.loc 1 1365 0
 	add	w5, w18, w5, lsl 8
 	ldrb	w5, [x6, w5, sxtw]
 	orr	w17, w17, w5, lsl 4
 	and	w17, w17, 255
-.L540:
+.L550:
 	.loc 1 1367 0
 	lsr	w4, w4, 24
 	.loc 1 1368 0
@@ -6231,42 +6264,42 @@ direct_mode_data_change_part:
 	and	w3, w3, 240
 	.loc 1 1369 0
 	cmp	w4, w3
-	beq	.L541
+	beq	.L551
 	.loc 1 1370 0
 	add	w3, w4, w3, lsl 8
 	ldrb	w3, [x6, w3, sxtw]
 	orr	w17, w17, w3, lsl 6
 	and	w17, w17, 255
-.L541:
+.L551:
 	add	x7, x7, 2
 	.loc 1 1372 0
 	strb	w17, [x7, -1]
 	.loc 1 1322 0
 	cmp	x1, x9
-	bne	.L542
+	bne	.L552
 	add	x2, x2, x12
-.L533:
+.L543:
 	.loc 1 1316 0
 	add	w10, w10, 1
 	cmp	w14, w10
-	beq	.L468
+	beq	.L478
 	ldr	w3, [x11, 84]
 	.loc 1 1317 0
-	cbnz	w15, .L647
-.L531:
+	cbnz	w15, .L657
+.L541:
 	.loc 1 1320 0
 	mul	w7, w10, w3
-.LVL526:
+.LVL531:
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL527:
-	b	.L532
-.LVL528:
-.L486:
-.LBE1486:
-.LBE1485:
-.LBB1487:
-.LBB1488:
+.LVL532:
+	b	.L542
+.LVL533:
+.L496:
+.LBE1484:
+.LBE1483:
+.LBB1485:
+.LBB1486:
 	.loc 1 1177 0
 	ldr	x17, [x5, #:lo12:.LANCHOR0]
 	.loc 1 1182 0
@@ -6276,134 +6309,134 @@ direct_mode_data_change_part:
 	add	x17, x17, 24
 	.loc 1 1183 0
 	ldr	x3, [x3, 128]
-.LVL529:
+.LVL534:
 	.loc 1 1182 0
 	sub	w12, w12, w4
-.LVL530:
+.LVL535:
 	.loc 1 1187 0
 	ldr	w18, [x17, 88]
 	.loc 1 1183 0
 	lsl	w12, w12, 16
-.LVL531:
+.LVL536:
 	.loc 1 1184 0
 	ldr	w30, [x17, 156]
 	.loc 1 1183 0
 	add	x12, x3, x12, sxtw
-.LVL532:
+.LVL537:
 	.loc 1 1186 0
 	ldr	w3, [x17, 84]
-.LVL533:
+.LVL538:
 	.loc 1 1192 0
 	cmp	w18, 0
 	.loc 1 1186 0
 	lsr	w13, w3, 3
-.LVL534:
+.LVL539:
 	.loc 1 1192 0
-	ble	.L468
+	ble	.L478
 	sub	w16, w13, #1
-.LBB1489:
-.LBB1490:
+.LBB1487:
+.LBB1488:
 	.loc 1 145 0
 	mov	w14, 3
 	add	x16, x16, 1
 	lsl	x16, x16, 2
-.LBE1490:
-.LBE1489:
+.LBE1488:
+.LBE1487:
 	.loc 1 1193 0
-	cbz	w30, .L514
-.LVL535:
-.L648:
+	cbz	w30, .L524
+.LVL540:
+.L658:
 	.loc 1 1194 0
 	ldr	w11, [x17, 88]
-.LVL536:
+.LVL541:
 	sub	w11, w11, #1
 	sub	w11, w11, w15
 	mul	w11, w11, w3
 	lsr	w11, w11, 2
 	add	x11, x0, x11
-.LVL537:
-.L515:
+.LVL542:
+.L525:
 	.loc 1 1198 0
-	cbz	w13, .L516
+	cbz	w13, .L526
 	add	x11, x11, 2
-.LVL538:
+.LVL543:
 	mov	x9, 0
 	.p2align 2
-.L529:
+.L539:
 	.loc 1 1200 0
 	ldr	w5, [x2, x9, lsl 2]
-.LBB1496:
-.LBB1497:
+.LBB1494:
+.LBB1495:
 	.loc 1 149 0
 	mov	w4, 0
-.LBE1497:
-.LBE1496:
+.LBE1495:
+.LBE1494:
 	.loc 1 1199 0
 	ldr	w22, [x1, x9, lsl 2]
-.LBB1502:
-.LBB1491:
+.LBB1500:
+.LBB1489:
 	.loc 1 149 0
 	mov	w8, 0
-.LBE1491:
-.LBE1502:
+.LBE1489:
+.LBE1500:
 	.loc 1 1202 0
 	and	w25, w5, 65535
 	and	w7, w22, 65535
-.LBB1503:
-.LBB1498:
+.LBB1501:
+.LBB1496:
 	.loc 1 160 0
 	and	w3, w25, 65280
 	add	w6, w3, w7, lsr 8
-.LBE1498:
-.LBE1503:
+.LBE1496:
+.LBE1501:
 	.loc 1 1203 0
 	lsr	w3, w5, 16
-.LBB1504:
-.LBB1492:
+.LBB1502:
+.LBB1490:
 	.loc 1 159 0
 	ubfiz	w21, w3, 8, 8
-.LBE1492:
-.LBE1504:
+.LBE1490:
+.LBE1502:
 	.loc 1 1203 0
 	and	w3, w3, 65535
 	lsr	w10, w22, 16
-.LBB1505:
-.LBB1499:
+.LBB1503:
+.LBB1497:
 	.loc 1 159 0
 	ubfiz	w23, w5, 8, 8
-.LBE1499:
-.LBE1505:
-.LBB1506:
-.LBB1493:
+.LBE1497:
+.LBE1503:
+.LBB1504:
+.LBB1491:
 	.loc 1 160 0
 	and	w19, w3, 65280
-.LBE1493:
-.LBE1506:
-.LBB1507:
-.LBB1500:
+.LBE1491:
+.LBE1504:
+.LBB1505:
+.LBB1498:
 	.loc 1 146 0
 	eor	w24, w25, w7
 	.loc 1 159 0
 	add	w23, w23, w7, uxtb
-.LBE1500:
-.LBE1507:
-.LBB1508:
-.LBB1494:
+.LBE1498:
+.LBE1505:
+.LBB1506:
+.LBB1492:
 	add	w21, w21, w10, uxtb
 	.loc 1 146 0
 	eor	w20, w3, w10
 	.loc 1 160 0
 	add	w19, w19, w10, lsr 8
-.LBE1494:
-.LBE1508:
+.LBE1492:
+.LBE1506:
 	.loc 1 1201 0
 	cmp	w22, w5
-	beq	.L517
-.LBB1509:
-.LBB1501:
+	beq	.L527
+.LBB1507:
+.LBB1499:
 	.loc 1 148 0
 	cmp	w25, w7
-	beq	.L518
+	beq	.L528
 	.loc 1 145 0
 	tst	x24, 15
 	.loc 1 160 0
@@ -6432,16 +6465,16 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w4, w5, w4
 	and	w4, w4, 255
-.L518:
-.LBE1501:
-.LBE1509:
+.L528:
+.LBE1499:
+.LBE1507:
 	.loc 1 1202 0
 	strb	w4, [x11, -2]
-.LBB1510:
-.LBB1495:
+.LBB1508:
+.LBB1493:
 	.loc 1 148 0
 	cmp	w3, w10
-	beq	.L523
+	beq	.L533
 	.loc 1 145 0
 	tst	x20, 15
 	.loc 1 159 0
@@ -6470,62 +6503,62 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w3, w4, w3
 	and	w8, w3, 255
-.L523:
-.LBE1495:
-.LBE1510:
+.L533:
+.LBE1493:
+.LBE1508:
 	.loc 1 1203 0
 	strb	w8, [x11, -1]
-.L528:
+.L538:
 	add	x9, x9, 1
 	add	x11, x11, 2
 	.loc 1 1198 0
 	cmp	w13, w9
-	bgt	.L529
+	bgt	.L539
 	add	x1, x1, x16
 	add	x2, x2, x16
-.LVL539:
-.L516:
+.LVL544:
+.L526:
 	.loc 1 1192 0
 	add	w15, w15, 1
 	cmp	w18, w15
-	beq	.L468
+	beq	.L478
 	ldr	w3, [x17, 84]
 	.loc 1 1193 0
-	cbnz	w30, .L648
-.L514:
+	cbnz	w30, .L658
+.L524:
 	.loc 1 1196 0
 	mul	w11, w15, w3
-.LVL540:
+.LVL545:
 	lsr	w11, w11, 2
 	add	x11, x0, x11
-.LVL541:
-	b	.L515
-.LVL542:
+.LVL546:
+	b	.L525
+.LVL547:
 	.p2align 3
-.L490:
-.LBE1488:
-.LBE1487:
-.LBB1512:
-.LBB1483:
+.L500:
+.LBE1486:
+.LBE1485:
+.LBB1510:
+.LBB1481:
 	.loc 1 1249 0
 	str	wzr, [x5, -4]
-	b	.L511
-.LVL543:
+	b	.L521
+.LVL548:
 	.p2align 3
-.L517:
-.LBE1483:
-.LBE1512:
-.LBB1513:
+.L527:
+.LBE1481:
+.LBE1510:
 .LBB1511:
+.LBB1509:
 	.loc 1 1206 0
 	strh	wzr, [x11, -2]
-	b	.L528
-.LVL544:
-.L646:
+	b	.L538
+.LVL549:
+.L656:
+.LBE1509:
 .LBE1511:
-.LBE1513:
-.LBB1514:
-.LBB1515:
+.LBB1512:
+.LBB1513:
 	.loc 1 1261 0
 	adrp	x5, .LANCHOR0
 	.loc 1 1266 0
@@ -6535,68 +6568,68 @@ direct_mode_data_change_part:
 	ldr	x21, [x5, #:lo12:.LANCHOR0]
 	.loc 1 1267 0
 	ldr	x3, [x3, 128]
-.LVL545:
+.LVL550:
 	.loc 1 1266 0
 	sub	w15, w15, w4
-.LVL546:
+.LVL551:
 	.loc 1 1268 0
 	add	x21, x21, 24
 	.loc 1 1267 0
 	lsl	w15, w15, 16
-.LVL547:
+.LVL552:
 	add	x15, x3, x15, sxtw
-.LVL548:
+.LVL553:
 	.loc 1 1273 0
 	ldr	w22, [x21, 88]
 	.loc 1 1272 0
 	ldr	w3, [x21, 84]
 	.loc 1 1268 0
 	ldr	w23, [x21, 156]
-.LVL549:
+.LVL554:
 	.loc 1 1278 0
 	cmp	w22, 0
 	.loc 1 1272 0
 	lsr	w17, w3, 2
-.LVL550:
+.LVL555:
 	.loc 1 1278 0
-	ble	.L468
+	ble	.L478
 	sub	w20, w17, #1
 	mov	w19, 0
-.LVL551:
+.LVL556:
 	add	x20, x20, 1
-.LBB1516:
-.LBB1517:
+.LBB1514:
+.LBB1515:
 	.loc 1 167 0
 	mov	w18, 3
 	lsl	x20, x20, 2
-.LBE1517:
-.LBE1516:
+.LBE1515:
+.LBE1514:
 	.loc 1 1279 0
-	cbz	w23, .L473
-.LVL552:
-.L651:
+	cbz	w23, .L483
+.LVL557:
+.L661:
 	.loc 1 1280 0
 	ldr	w16, [x21, 88]
-.LVL553:
+.LVL558:
 	sub	w16, w16, #1
 	sub	w16, w16, w19
 	mul	w16, w16, w3
 	lsr	w16, w16, 2
 	add	x16, x0, x16
-.LVL554:
-.L474:
+.LVL559:
+.L484:
 	.loc 1 1284 0
-	cbz	w17, .L475
+	cbz	w17, .L485
 	mov	x11, 0
-	b	.L484
-.LVL555:
+	b	.L494
+.LVL560:
 	.p2align 3
-.L650:
-.LBB1523:
-.LBB1524:
+.L660:
+.LBB1521:
+.LBB1522:
 	.loc 1 170 0
 	cmp	w7, w5
-	beq	.L477
+	beq	.L487
 	.loc 1 177 0
 	ldrb	w4, [x15, w8, sxtw]
 	.loc 1 167 0
@@ -6607,20 +6640,20 @@ direct_mode_data_change_part:
 	orr	w12, w4, w12, lsl 2
 	.loc 1 167 0
 	csel	w4, w18, wzr, ne
-.LVL556:
+.LVL561:
 	.loc 1 175 0
 	orr	w5, w4, 12
 	tst	w30, 65280
 	csel	w4, w5, w4, ne
 	and	w12, w12, w4
-.L477:
-.LBE1524:
-.LBE1523:
-.LBB1528:
-.LBB1518:
+.L487:
+.LBE1522:
+.LBE1521:
+.LBB1526:
+.LBB1516:
 	.loc 1 170 0
 	cmp	w3, w13
-	beq	.L480
+	beq	.L490
 	.loc 1 167 0
 	cmp	w26, 0
 	.loc 1 178 0
@@ -6629,7 +6662,7 @@ direct_mode_data_change_part:
 	ldrb	w5, [x15, w14, sxtw]
 	.loc 1 167 0
 	csel	w4, w18, wzr, ne
-.LVL557:
+.LVL562:
 	.loc 1 175 0
 	orr	w6, w4, 12
 	tst	w25, 65280
@@ -6639,35 +6672,35 @@ direct_mode_data_change_part:
 	and	w3, w3, w4
 	lsl	w3, w3, 4
 	sxtb	w10, w3
-.LVL558:
-.L480:
-.LBE1518:
-.LBE1528:
+.LVL563:
+.L490:
+.LBE1516:
+.LBE1526:
 	.loc 1 1290 0
 	orr	w3, w12, w10
 	strb	w3, [x16, x11]
 	add	x11, x11, 1
 	.loc 1 1284 0
 	cmp	w17, w11
-	ble	.L649
-.L484:
+	ble	.L659
+.L494:
 	.loc 1 1286 0
 	ldr	w4, [x2, x11, lsl 2]
-.LVL559:
-.LBB1529:
-.LBB1525:
+.LVL564:
+.LBB1527:
+.LBB1523:
 	.loc 1 170 0
 	mov	w12, 0
-.LBE1525:
-.LBE1529:
+.LBE1523:
+.LBE1527:
 	.loc 1 1285 0
 	ldr	w6, [x1, x11, lsl 2]
-.LBB1530:
-.LBB1519:
+.LBB1528:
+.LBB1517:
 	.loc 1 170 0
 	mov	w10, 0
-.LBE1519:
-.LBE1530:
+.LBE1517:
+.LBE1528:
 	.loc 1 1288 0
 	and	w7, w4, 65535
 	.loc 1 1289 0
@@ -6676,94 +6709,94 @@ direct_mode_data_change_part:
 	and	w5, w6, 65535
 	.loc 1 1289 0
 	lsr	w13, w6, 16
-.LBB1531:
-.LBB1520:
+.LBB1529:
+.LBB1518:
 	.loc 1 177 0
 	ubfiz	w14, w3, 8, 8
-.LBE1520:
-.LBE1531:
+.LBE1518:
+.LBE1529:
 	.loc 1 1289 0
 	and	w3, w3, 65535
-.LBB1532:
-.LBB1526:
+.LBB1530:
+.LBB1524:
 	.loc 1 177 0
 	ubfiz	w8, w4, 8, 8
 	.loc 1 178 0
 	and	w9, w7, 65280
 	.loc 1 168 0
 	eor	w30, w7, w5
-.LBE1526:
-.LBE1532:
-.LBB1533:
-.LBB1521:
+.LBE1524:
+.LBE1530:
+.LBB1531:
+.LBB1519:
 	.loc 1 178 0
 	and	w24, w3, 65280
 	.loc 1 168 0
 	eor	w25, w3, w13
-.LBE1521:
-.LBE1533:
-.LBB1534:
-.LBB1527:
+.LBE1519:
+.LBE1531:
+.LBB1532:
+.LBB1525:
 	.loc 1 177 0
 	add	w8, w8, w5, uxtb
 	.loc 1 178 0
 	add	w9, w9, w5, lsr 8
 	.loc 1 172 0
 	and	w27, w30, 255
-.LBE1527:
-.LBE1534:
-.LBB1535:
-.LBB1522:
+.LBE1525:
+.LBE1532:
+.LBB1533:
+.LBB1520:
 	.loc 1 177 0
 	add	w14, w14, w13, uxtb
 	.loc 1 178 0
 	add	w24, w24, w13, lsr 8
 	.loc 1 172 0
 	and	w26, w25, 255
-.LBE1522:
-.LBE1535:
+.LBE1520:
+.LBE1533:
 	.loc 1 1287 0
 	cmp	w6, w4
-	bne	.L650
+	bne	.L660
 	.loc 1 1293 0
 	strb	wzr, [x16, x11]
 	add	x11, x11, 1
 	.loc 1 1284 0
 	cmp	w17, w11
-	bgt	.L484
-.LVL560:
-.L649:
+	bgt	.L494
+.LVL565:
+.L659:
 	add	x1, x1, x20
 	add	x2, x2, x20
-.L475:
+.L485:
 	.loc 1 1278 0
 	add	w19, w19, 1
 	cmp	w22, w19
-	beq	.L468
+	beq	.L478
 	ldr	w3, [x21, 84]
 	.loc 1 1279 0
-	cbnz	w23, .L651
-.L473:
+	cbnz	w23, .L661
+.L483:
 	.loc 1 1282 0
 	mul	w16, w19, w3
-.LVL561:
+.LVL566:
 	lsr	w16, w16, 2
 	add	x16, x0, x16
-.LVL562:
-	b	.L474
-.LBE1515:
-.LBE1514:
+.LVL567:
+	b	.L484
+.LBE1513:
+.LBE1512:
 	.cfi_endproc
-.LFE2828:
+.LFE2827:
 	.size	direct_mode_data_change_part, .-direct_mode_data_change_part
 	.align	2
 	.p2align 3,,7
 	.type	flip.isra.11, %function
 flip.isra.11:
-.LFB2879:
+.LFB2878:
 	.loc 1 1476 0
 	.cfi_startproc
-.LVL563:
+.LVL568:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -6782,52 +6815,52 @@ flip.isra.11:
 	ldr	w19, [x0, 72]
 	.loc 1 1480 0
 	ldr	x0, [x0]
-.LVL564:
+.LVL569:
+.LBB1534:
+.LBB1535:
 .LBB1536:
 .LBB1537:
-.LBB1538:
-.LBB1539:
 	.file 10 "./include/linux/dma-mapping.h"
 	.loc 10 266 0
-	cbz	x0, .L655
+	cbz	x0, .L665
 	ldr	x3, [x0, 648]
 	.loc 10 268 0
 	adrp	x4, dummy_dma_ops
 	add	x4, x4, :lo12:dummy_dma_ops
 	cmp	x3, 0
 	csel	x3, x4, x3, eq
-.L653:
-.LBE1539:
-.LBE1538:
+.L663:
+.LBE1537:
+.LBE1536:
 	.loc 10 434 0
 	ldr	x5, [x3, 88]
 	sxtw	x19, w19
-	cbz	x5, .L654
-.LBE1537:
-.LBE1536:
+	cbz	x5, .L664
+.LBE1535:
+.LBE1534:
 	.loc 1 1480 0
 	add	x4, x19, x19, lsl 1
-.LBB1545:
-.LBB1542:
+.LBB1543:
+.LBB1540:
 	.loc 10 435 0
 	mov	w3, 1
-.LBE1542:
-.LBE1545:
+.LBE1540:
+.LBE1543:
 	.loc 1 1480 0
 	add	x4, x20, x4, lsl 3
-.LBB1546:
-.LBB1543:
+.LBB1544:
+.LBB1541:
 	.loc 10 435 0
 	ldr	x1, [x4, 32]
 	blr	x5
-.LVL565:
-.L654:
-.LBE1543:
-.LBE1546:
+.LVL570:
+.L664:
+.LBE1541:
+.LBE1544:
 	.loc 1 1481 0
 	ldr	x5, [x20, 8]
-.LBB1547:
-.LBB1548:
+.LBB1545:
+.LBB1546:
 	.file 11 "drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.h"
 	.loc 11 57 0
 	mov	w4, 0
@@ -6835,50 +6868,50 @@ flip.isra.11:
 	mov	w2, 0
 	mov	x0, x5
 	mov	w1, 0
-.LBE1548:
-.LBE1547:
+.LBE1546:
+.LBE1545:
 	.loc 1 1482 0
 	add	x19, x19, x19, lsl 1
-.LBB1551:
 .LBB1549:
+.LBB1547:
 	.loc 11 57 0
 	ldr	x5, [x5, 64]
+.LBE1547:
 .LBE1549:
-.LBE1551:
 	.loc 1 1482 0
 	add	x19, x20, x19, lsl 3
-.LBB1552:
 .LBB1550:
+.LBB1548:
 	.loc 11 57 0
 	blr	x5
-.LVL566:
+.LVL571:
+.LBE1548:
 .LBE1550:
-.LBE1552:
 	.loc 1 1482 0
 	ldr	x1, [x20, 8]
-.LBB1553:
-.LBB1554:
+.LBB1551:
+.LBB1552:
 	.loc 11 62 0
 	mov	w2, 0
 	mov	x0, x1
 	ldr	x3, [x1, 72]
 	ldr	w1, [x19, 32]
 	blr	x3
-.LVL567:
-.LBE1554:
-.LBE1553:
+.LVL572:
+.LBE1552:
+.LBE1551:
 	.loc 1 1483 0
 	ldr	x2, [x20, 8]
-.LBB1555:
-.LBB1556:
+.LBB1553:
+.LBB1554:
 	.loc 11 77 0
 	mov	w1, 1
 	mov	x0, x2
 	ldr	x2, [x2, 96]
 	blr	x2
-.LVL568:
-.LBE1556:
-.LBE1555:
+.LVL573:
+.LBE1554:
+.LBE1553:
 	.loc 1 1484 0
 	ldr	w1, [x20, 72]
 	mov	w0, 1
@@ -6886,7 +6919,7 @@ flip.isra.11:
 	str	w0, [x20, 72]
 	.loc 1 1485 0
 	ldp	x19, x20, [sp, 16]
-.LVL569:
+.LVL574:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -6895,33 +6928,33 @@ flip.isra.11:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL570:
+.LVL575:
 	.p2align 3
-.L655:
+.L665:
 	.cfi_restore_state
-.LBB1557:
-.LBB1544:
-.LBB1541:
-.LBB1540:
+.LBB1555:
+.LBB1542:
+.LBB1539:
+.LBB1538:
 	.loc 10 268 0
 	adrp	x3, dummy_dma_ops
 	add	x3, x3, :lo12:dummy_dma_ops
-	b	.L653
-.LBE1540:
-.LBE1541:
-.LBE1544:
-.LBE1557:
+	b	.L663
+.LBE1538:
+.LBE1539:
+.LBE1542:
+.LBE1555:
 	.cfi_endproc
-.LFE2879:
+.LFE2878:
 	.size	flip.isra.11, .-flip.isra.11
 	.align	2
 	.p2align 3,,7
 	.type	ebc_frame_start, %function
 ebc_frame_start:
-.LFB2831:
+.LFB2830:
 	.loc 1 1494 0
 	.cfi_startproc
-.LVL571:
+.LVL576:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
@@ -6943,46 +6976,46 @@ ebc_frame_start:
 	.loc 1 1501 0
 	ldr	x1, [x19, 224]
 	ldr	w0, [x1, 40]
-.LVL572:
+.LVL577:
 	cmp	w0, 16
-	bgt	.L662
+	bgt	.L672
 	cmp	w0, 7
-	bge	.L663
-	cbz	w0, .L664
+	bge	.L673
+	cbz	w0, .L674
 	cmp	w0, 1
-	bne	.L661
+	bne	.L671
 	.loc 1 1503 0
 	ldr	x0, [x19, 184]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
 	ldr	x3, [x19, 168]
 	bl	get_overlay_image
-.LVL573:
+.LVL578:
 	.loc 1 1508 0
 	ldr	w0, [x19, 52]
-	cbz	w0, .L666
-.LBB1558:
-.LBB1559:
+	cbz	w0, .L676
+.LBB1556:
+.LBB1557:
 	.loc 1 1489 0
 	str	wzr, [x21, 72]
 	.loc 1 1490 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
-.LVL574:
-.LBE1559:
-.LBE1558:
+.LVL579:
+.LBE1557:
+.LBE1556:
 	.loc 1 1510 0
 	ldp	x1, x2, [x19, 144]
 	mov	x4, x19
 	ldr	x3, [x19, 168]
 	ldr	x0, [x19, 192]
 	bl	get_overlay_image
-.LVL575:
+.LVL580:
 	.loc 1 1578 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL576:
+.LVL581:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -6992,47 +7025,47 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL577:
+.LVL582:
 	.p2align 3
-.L662:
+.L672:
 	.cfi_restore_state
 	.loc 1 1501 0
 	sub	w0, w0, #22
 	cmp	w0, 1
-	bhi	.L661
-.L664:
+	bhi	.L671
+.L674:
 	.loc 1 1523 0
 	ldr	x0, [x19, 184]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
 	ldr	x3, [x19, 168]
 	bl	get_auto_image
-.LVL578:
+.LVL583:
 	.loc 1 1528 0
 	ldr	w0, [x19, 52]
-	cbz	w0, .L668
-.LBB1560:
-.LBB1561:
+	cbz	w0, .L678
+.LBB1558:
+.LBB1559:
 	.loc 1 1489 0
 	str	wzr, [x21, 72]
 	.loc 1 1490 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
-.LVL579:
-.LBE1561:
-.LBE1560:
+.LVL584:
+.LBE1559:
+.LBE1558:
 	.loc 1 1530 0
 	ldp	x1, x2, [x19, 144]
 	mov	x4, x19
 	ldr	x3, [x19, 168]
 	ldr	x0, [x19, 192]
 	bl	get_auto_image
-.LVL580:
+.LVL585:
 	.loc 1 1578 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL581:
+.LVL586:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -7042,9 +7075,9 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL582:
+.LVL587:
 	.p2align 3
-.L661:
+.L671:
 	.cfi_restore_state
 	.loc 1 1566 0
 	ldr	x2, [x19, 216]
@@ -7058,18 +7091,18 @@ ebc_frame_start:
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change
-.LVL583:
-.LBB1562:
-.LBB1563:
+.LVL588:
+.LBB1560:
+.LBB1561:
 	.loc 1 1489 0
 	str	wzr, [x21, 72]
 	.loc 1 1490 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
-.LVL584:
-.LBE1563:
-.LBE1562:
+.LVL589:
+.LBE1561:
+.LBE1560:
 	.loc 1 1569 0
 	ldr	w0, [x19, 56]
 	.loc 1 1570 0
@@ -7084,11 +7117,11 @@ ebc_frame_start:
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
-.LVL585:
+.LVL590:
 	.loc 1 1578 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL586:
+.LVL591:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 30
@@ -7098,9 +7131,9 @@ ebc_frame_start:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL587:
+.LVL592:
 	.p2align 3
-.L663:
+.L673:
 	.cfi_restore_state
 	.loc 1 1553 0
 	ldr	x2, [x19, 216]
@@ -7114,18 +7147,18 @@ ebc_frame_start:
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change_part
-.LVL588:
-.LBB1564:
-.LBB1565:
+.LVL593:
+.LBB1562:
+.LBB1563:
 	.loc 1 1489 0
 	str	wzr, [x21, 72]
 	.loc 1 1490 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
-.LVL589:
-.LBE1565:
-.LBE1564:
+.LVL594:
+.LBE1563:
+.LBE1562:
 	.loc 1 1556 0
 	ldr	w0, [x19, 56]
 	.loc 1 1557 0
@@ -7140,11 +7173,11 @@ ebc_frame_start:
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part
-.LVL590:
+.LVL595:
 	.loc 1 1578 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL591:
+.LVL596:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -7154,9 +7187,9 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL592:
+.LVL597:
 	.p2align 3
-.L668:
+.L678:
 	.cfi_restore_state
 	.loc 1 1536 0
 	ldr	x0, [x19, 104]
@@ -7165,12 +7198,12 @@ ebc_frame_start:
 	add	x2, x2, :lo12:.LANCHOR3
 	add	x1, x1, :lo12:.LC22
 	bl	_dev_info
-.LVL593:
+.LVL598:
 	.loc 1 1537 0
 	str	wzr, [x19, 44]
 	.loc 1 1578 0
 	ldp	x19, x20, [sp, 16]
-.LVL594:
+.LVL599:
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -7181,9 +7214,9 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL595:
+.LVL600:
 	.p2align 3
-.L666:
+.L676:
 	.cfi_restore_state
 	.loc 1 1516 0
 	ldr	x0, [x19, 104]
@@ -7192,12 +7225,12 @@ ebc_frame_start:
 	add	x2, x2, :lo12:.LANCHOR3
 	add	x1, x1, :lo12:.LC21
 	bl	_dev_info
-.LVL596:
+.LVL601:
 	.loc 1 1517 0
 	str	wzr, [x19, 44]
 	.loc 1 1578 0
 	ldp	x19, x20, [sp, 16]
-.LVL597:
+.LVL602:
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	.cfi_restore 20
@@ -7208,16 +7241,16 @@ ebc_frame_start:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2831:
+.LFE2830:
 	.size	ebc_frame_start, .-ebc_frame_start
 	.align	2
 	.p2align 3,,7
 	.type	ebc_power_set.part.13, %function
 ebc_power_set.part.13:
-.LFB2881:
+.LFB2880:
 	.loc 1 183 0
 	.cfi_startproc
-.LVL598:
+.LVL603:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -7233,41 +7266,41 @@ ebc_power_set.part.13:
 	str	w1, [x0, 384]
 	.loc 1 201 0
 	ldr	x1, [x0, 8]
-.LVL599:
-.LBB1566:
-.LBB1567:
+.LVL604:
+.LBB1564:
+.LBB1565:
 	.loc 11 51 0
 	mov	x0, x1
-.LVL600:
+.LVL605:
 	ldr	x1, [x1, 56]
 	blr	x1
-.LVL601:
-.LBE1567:
-.LBE1566:
+.LVL606:
+.LBE1565:
+.LBE1564:
 	.loc 1 202 0
 	ldr	x2, [x19, 16]
-.LBB1568:
-.LBB1569:
+.LBB1566:
+.LBB1567:
 	.loc 3 35 0
 	mov	w1, 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL602:
-.LBE1569:
-.LBE1568:
+.LVL607:
+.LBE1567:
+.LBE1566:
 	.loc 1 203 0
 	ldr	w0, [x19, 624]
-	cbnz	w0, .L679
+	cbnz	w0, .L689
 	.loc 1 207 0
 	ldr	x0, [x19]
 	adrp	x1, .LC23
 	add	x1, x1, :lo12:.LC23
 	bl	_dev_info
-.LVL603:
+.LVL608:
 	.loc 1 211 0
 	ldp	x19, x20, [sp, 16]
-.LVL604:
+.LVL609:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -7276,29 +7309,29 @@ ebc_power_set.part.13:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL605:
+.LVL610:
 	.p2align 3
-.L679:
+.L689:
 	.cfi_restore_state
 	.loc 1 204 0
 	str	wzr, [x19, 624]
-.LBB1570:
-.LBB1571:
+.LBB1568:
+.LBB1569:
 	.loc 4 68 0
 	add	x0, x19, 416
 	bl	__pm_relax
-.LVL606:
-.LBE1571:
-.LBE1570:
+.LVL611:
+.LBE1569:
+.LBE1568:
 	.loc 1 207 0
 	ldr	x0, [x19]
 	adrp	x1, .LC23
 	add	x1, x1, :lo12:.LC23
 	bl	_dev_info
-.LVL607:
+.LVL612:
 	.loc 1 211 0
 	ldp	x19, x20, [sp, 16]
-.LVL608:
+.LVL613:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -7307,16 +7340,16 @@ ebc_power_set.part.13:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2881:
+.LFE2880:
 	.size	ebc_power_set.part.13, .-ebc_power_set.part.13
 	.align	2
 	.p2align 3,,7
 	.type	ebc_suspend, %function
 ebc_suspend:
-.LFB2864:
+.LFB2863:
 	.loc 1 3135 0
 	.cfi_startproc
-.LVL609:
+.LVL614:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -7326,39 +7359,39 @@ ebc_suspend:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-.LBB1572:
-.LBB1573:
+.LBB1570:
+.LBB1571:
 	.loc 2 1181 0
 	ldr	x20, [x0, 184]
-.LBE1573:
-.LBE1572:
+.LBE1571:
+.LBE1570:
 	.loc 1 3139 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 200]
-.LVL610:
+.LVL615:
 	cmp	w0, 1
-	beq	.L683
-.L681:
+	beq	.L693
+.L691:
 	.loc 1 3143 0
 	mov	w0, 1
 	str	w0, [x19, 620]
 	.loc 1 3145 0
 	ldr	x1, [x20, 16]
-.LBB1574:
-.LBB1575:
+.LBB1572:
+.LBB1573:
 	.loc 3 40 0
 	mov	x0, x1
 	ldr	x1, [x1, 40]
 	blr	x1
-.LVL611:
-.LBE1575:
-.LBE1574:
+.LVL616:
+.LBE1573:
+.LBE1572:
 	.loc 1 3146 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC25
 	add	x1, x1, :lo12:.LC25
 	bl	_dev_info
-.LVL612:
+.LVL617:
 	.loc 1 3149 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
@@ -7371,7 +7404,7 @@ ebc_suspend:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L683:
+.L693:
 	.cfi_restore_state
 	.loc 1 3140 0
 	ldr	x0, [x19, 104]
@@ -7381,24 +7414,24 @@ ebc_suspend:
 	add	x2, x2, 16
 	add	x1, x1, :lo12:.LC24
 	bl	_dev_info
-.LVL613:
-.LBB1576:
-.LBB1577:
+.LVL618:
+.LBB1574:
+.LBB1575:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.13
-.LVL614:
-	b	.L681
-.LBE1577:
-.LBE1576:
+.LVL619:
+	b	.L691
+.LBE1575:
+.LBE1574:
 	.cfi_endproc
-.LFE2864:
+.LFE2863:
 	.size	ebc_suspend, .-ebc_suspend
 	.align	2
 	.p2align 3,,7
 	.type	check_black_percent.isra.15, %function
 check_black_percent.isra.15:
-.LFB2883:
+.LFB2882:
 	.loc 1 1821 0
 	.cfi_startproc
 	.loc 1 1831 0
@@ -7420,18 +7453,18 @@ check_black_percent.isra.15:
 	.loc 1 1835 0
 	asr	x4, x4, 34
 	sub	w4, w4, w2, asr 31
-.LVL615:
+.LVL620:
 	.loc 1 1836 0
-	ble	.L686
+	ble	.L696
 	mov	x1, 0
 	mov	w2, 0
-.LVL616:
-	b	.L689
+.LVL621:
+	b	.L699
 	.p2align 3
-.L697:
+.L707:
 	cmp	w5, w1
-	ble	.L686
-.L689:
+	ble	.L696
+.L699:
 	.loc 1 1838 0
 	ldr	x3, [x0, x1, lsl 3]
 	add	x1, x1, 1
@@ -7440,11 +7473,11 @@ check_black_percent.isra.15:
 	cinc	w2, w2, ne
 	.loc 1 1840 0
 	cmp	w4, w2, lsl 3
-	bge	.L697
+	bge	.L707
 	.loc 1 1841 0
 	mov	w0, 0
 	ret
-.L686:
+.L696:
 	.loc 1 1821 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
@@ -7458,7 +7491,7 @@ check_black_percent.isra.15:
 	.cfi_def_cfa_register 29
 	.loc 1 1844 0
 	bl	printk
-.LVL617:
+.LVL622:
 	.loc 1 1846 0
 	mov	w0, 1
 	.loc 1 1847 0
@@ -7468,27 +7501,27 @@ check_black_percent.isra.15:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2883:
+.LFE2882:
 	.size	check_black_percent.isra.15, .-check_black_percent.isra.15
 	.align	2
 	.p2align 3,,7
 	.type	ebc_probe, %function
 ebc_probe:
-.LFB2862:
+.LFB2861:
 	.loc 1 2999 0
 	.cfi_startproc
-.LVL618:
+.LVL623:
 	stp	x29, x30, [sp, -208]!
 	.cfi_def_cfa_offset 208
 	.cfi_offset 29, -208
 	.cfi_offset 30, -200
-.LBB1722:
-.LBB1723:
+.LBB1720:
+.LBB1721:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
-.LBE1723:
-.LBE1722:
+.LBE1721:
+.LBE1720:
 	.loc 1 2999 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -7504,7 +7537,7 @@ ebc_probe:
 	adrp	x23, __stack_chk_guard
 	stp	x19, x20, [sp, 16]
 	add	x0, x23, :lo12:__stack_chk_guard
-.LVL619:
+.LVL624:
 	stp	x25, x26, [sp, 64]
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 19, -192
@@ -7517,17 +7550,17 @@ ebc_probe:
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
-.LBB1725:
-.LBB1724:
+.LBB1723:
+.LBB1722:
 	.loc 2 711 0
 	mov	x0, x22
 	mov	x1, 824
 	bl	devm_kmalloc
-.LVL620:
-.LBE1724:
-.LBE1725:
+.LVL625:
+.LBE1722:
+.LBE1723:
 	.loc 1 3015 0
-	cbz	x0, .L748
+	cbz	x0, .L758
 	.loc 1 3019 0
 	adrp	x24, .LANCHOR0
 	mov	x20, x0
@@ -7543,27 +7576,27 @@ ebc_probe:
 	str	x22, [x20]
 	.loc 1 3021 0
 	bl	of_parse_phandle
-.LVL621:
+.LVL626:
 	.loc 1 3022 0
-	cbz	x0, .L784
+	cbz	x0, .L794
 	.loc 1 3027 0
 	bl	of_find_device_by_node
-.LVL622:
+.LVL627:
 	.loc 1 3029 0
-	cbz	x0, .L702
+	cbz	x0, .L712
+.LBB1724:
+.LBB1725:
 .LBB1726:
-.LBB1727:
-.LBB1728:
 	.loc 2 1181 0
 	ldr	x0, [x0, 200]
-.LVL623:
-.LBE1728:
-.LBE1727:
+.LVL628:
 .LBE1726:
+.LBE1725:
+.LBE1724:
 	.loc 1 3032 0
 	str	x0, [x20, 8]
 	.loc 1 3033 0
-	cbz	x0, .L702
+	cbz	x0, .L712
 	.loc 1 3035 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
@@ -7574,58 +7607,58 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC29
 	ldr	x0, [x22, 752]
 	bl	of_get_property
-.LVL624:
+.LVL629:
 	mov	x21, x0
-.LVL625:
+.LVL630:
 	.loc 1 3038 0
 	ldrsw	x0, [x29, 96]
-.LVL626:
+.LVL631:
 	lsr	x0, x0, 2
-.LVL627:
+.LVL632:
 	str	w0, [x29, 96]
-.LVL628:
+.LVL633:
 	.loc 1 3039 0
 	cmp	w0, 0
-	beq	.L703
+	beq	.L713
 	.loc 1 3044 0 discriminator 1
 	mov	w19, 0
-.LVL629:
-	bgt	.L771
-	b	.L705
+.LVL634:
+	bgt	.L781
+	b	.L715
 	.p2align 3
-.L706:
+.L716:
 	.loc 1 3052 0
 	bl	of_find_i2c_device_by_node
-.LVL630:
+.LVL635:
 	.loc 1 3054 0
-	cbz	x0, .L785
+	cbz	x0, .L795
+.LBB1727:
+.LBB1728:
 .LBB1729:
-.LBB1730:
-.LBB1731:
 	.loc 2 1181 0
 	ldr	x0, [x0, 216]
-.LVL631:
-.LBE1731:
-.LBE1730:
+.LVL636:
 .LBE1729:
+.LBE1728:
+.LBE1727:
 	.loc 1 3059 0
 	str	x0, [x20, 16]
 	.loc 1 3060 0
-	cbnz	x0, .L786
+	cbnz	x0, .L796
 	.loc 1 3044 0 discriminator 2
 	ldr	w0, [x29, 96]
 	add	w19, w19, 1
-.LVL632:
+.LVL637:
 	cmp	w0, w19
-	ble	.L710
-.L771:
+	ble	.L720
+.L781:
 	ldr	w0, [x21], 4
 	.loc 1 3046 0
 	rev	w0, w0
 	bl	of_find_node_by_phandle
-.LVL633:
+.LVL638:
 	.loc 1 3047 0
-	cbnz	x0, .L706
+	cbnz	x0, .L716
 	.loc 1 3048 0
 	adrp	x1, .LC31
 	mov	x0, x22
@@ -7634,27 +7667,27 @@ ebc_probe:
 	mov	w25, -19
 	.loc 1 3048 0
 	bl	_dev_err
-.LVL634:
+.LVL639:
 	.p2align 2
-.L698:
+.L708:
 	.loc 1 3125 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w25
-.LVL635:
+.LVL640:
 	ldr	x2, [x29, 200]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L787
+	cbnz	x1, .L797
 	ldp	x19, x20, [sp, 16]
-.LVL636:
+.LVL641:
 	ldp	x21, x22, [sp, 32]
-.LVL637:
+.LVL642:
 	ldp	x23, x24, [sp, 48]
-.LVL638:
+.LVL643:
 	ldp	x25, x26, [sp, 64]
-.LVL639:
+.LVL644:
 	ldp	x27, x28, [sp, 80]
-.LVL640:
+.LVL645:
 	ldp	x29, x30, [sp], 208
 	.cfi_remember_state
 	.cfi_restore 30
@@ -7671,9 +7704,9 @@ ebc_probe:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL641:
+.LVL646:
 	.p2align 3
-.L786:
+.L796:
 	.cfi_restore_state
 	.loc 1 3061 0
 	adrp	x1, .LC33
@@ -7681,81 +7714,81 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC33
 	mov	x0, x22
 	bl	_dev_info
-.LVL642:
-.L705:
+.LVL647:
+.L715:
 	.loc 1 3066 0
 	ldr	x0, [x20, 16]
-	cbz	x0, .L710
+	cbz	x0, .L720
 	.loc 1 3072 0
 	add	x19, x20, 184
-.LVL643:
+.LVL648:
 	.loc 1 3074 0
 	add	x21, x20, 24
-.LVL644:
+.LVL649:
 	.loc 1 3072 0
 	str	x22, [x19, 104]
+.LBB1730:
+.LBB1731:
 .LBB1732:
 .LBB1733:
 .LBB1734:
-.LBB1735:
-.LBB1736:
 	.file 12 "./include/linux/of.h"
 	.loc 12 499 0
 	adrp	x1, .LC35
-.LBE1736:
-.LBE1735:
 .LBE1734:
 .LBE1733:
 .LBE1732:
+.LBE1731:
+.LBE1730:
 	.loc 1 3074 0
 	str	x22, [x20, 24]
-.LBB1806:
-.LBB1803:
-.LBB1743:
-.LBB1740:
-.LBB1737:
-	.loc 12 499 0
-	mov	x4, 0
-.LBE1737:
-.LBE1740:
-.LBE1743:
-.LBE1803:
-.LBE1806:
-	.loc 1 3075 0
-	ldr	x2, [x20, 8]
-.LBB1807:
 .LBB1804:
-.LBB1744:
+.LBB1801:
 .LBB1741:
 .LBB1738:
+.LBB1735:
 	.loc 12 499 0
-	add	x1, x1, :lo12:.LC35
+	mov	x4, 0
+.LBE1735:
 .LBE1738:
 .LBE1741:
-.LBE1744:
+.LBE1801:
 .LBE1804:
-.LBE1807:
-	.loc 1 3076 0
-	stp	x2, x0, [x21, 8]
-.LBB1808:
+	.loc 1 3075 0
+	ldr	x2, [x20, 8]
 .LBB1805:
-.LBB1745:
+.LBB1802:
 .LBB1742:
 .LBB1739:
+.LBB1736:
+	.loc 12 499 0
+	add	x1, x1, :lo12:.LC35
+.LBE1736:
+.LBE1739:
+.LBE1742:
+.LBE1802:
+.LBE1805:
+	.loc 1 3076 0
+	stp	x2, x0, [x21, 8]
+.LBB1806:
+.LBB1803:
+.LBB1743:
+.LBB1740:
+.LBB1737:
 	.loc 12 499 0
 	mov	x3, 1
 	ldr	x0, [x22, 752]
 	add	x2, x20, 100
 	bl	of_property_read_variable_u32_array
-.LVL645:
+.LVL650:
 	.loc 12 501 0
-	tbnz	w0, #31, .L712
-.LBE1739:
-.LBE1742:
-.LBE1745:
+	tbnz	w0, #31, .L722
+.LBE1737:
+.LBE1740:
+.LBE1743:
+.LBB1744:
+.LBB1745:
 .LBB1746:
-.LBB1747:
-.LBB1748:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC61
@@ -7764,15 +7797,15 @@ ebc_probe:
 	add	x2, x20, 104
 	add	x1, x1, :lo12:.LC61
 	bl	of_property_read_variable_u32_array
-.LVL646:
+.LVL651:
 	.loc 12 501 0
-	tbnz	w0, #31, .L712
-.LBE1748:
-.LBE1747:
+	tbnz	w0, #31, .L722
 .LBE1746:
+.LBE1745:
+.LBE1744:
+.LBB1747:
+.LBB1748:
 .LBB1749:
-.LBB1750:
-.LBB1751:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC62
@@ -7781,15 +7814,15 @@ ebc_probe:
 	add	x2, x20, 108
 	add	x1, x1, :lo12:.LC62
 	bl	of_property_read_variable_u32_array
-.LVL647:
+.LVL652:
 	.loc 12 501 0
-	tbnz	w0, #31, .L712
-.LBE1751:
-.LBE1750:
+	tbnz	w0, #31, .L722
 .LBE1749:
+.LBE1748:
+.LBE1747:
+.LBB1750:
+.LBB1751:
 .LBB1752:
-.LBB1753:
-.LBB1754:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC63
@@ -7798,15 +7831,15 @@ ebc_probe:
 	add	x2, x20, 112
 	add	x1, x1, :lo12:.LC63
 	bl	of_property_read_variable_u32_array
-.LVL648:
+.LVL653:
 	.loc 12 501 0
-	tbnz	w0, #31, .L712
-.LBE1754:
-.LBE1753:
+	tbnz	w0, #31, .L722
 .LBE1752:
+.LBE1751:
+.LBE1750:
+.LBB1753:
+.LBB1754:
 .LBB1755:
-.LBB1756:
-.LBB1757:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC64
@@ -7815,15 +7848,15 @@ ebc_probe:
 	add	x2, x20, 128
 	add	x1, x1, :lo12:.LC64
 	bl	of_property_read_variable_u32_array
-.LVL649:
+.LVL654:
 	.loc 12 501 0
-	tbnz	w0, #31, .L712
-.LBE1757:
-.LBE1756:
+	tbnz	w0, #31, .L722
 .LBE1755:
+.LBE1754:
+.LBE1753:
+.LBB1756:
+.LBB1757:
 .LBB1758:
-.LBB1759:
-.LBB1760:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC65
@@ -7832,15 +7865,15 @@ ebc_probe:
 	add	x2, x20, 132
 	add	x1, x1, :lo12:.LC65
 	bl	of_property_read_variable_u32_array
-.LVL650:
+.LVL655:
 	.loc 12 501 0
-	tbnz	w0, #31, .L712
-.LBE1760:
-.LBE1759:
+	tbnz	w0, #31, .L722
 .LBE1758:
+.LBE1757:
+.LBE1756:
+.LBB1759:
+.LBB1760:
 .LBB1761:
-.LBB1762:
-.LBB1763:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC66
@@ -7849,15 +7882,15 @@ ebc_probe:
 	add	x2, x20, 136
 	add	x1, x1, :lo12:.LC66
 	bl	of_property_read_variable_u32_array
-.LVL651:
+.LVL656:
 	.loc 12 501 0
-	tbnz	w0, #31, .L712
-.LBE1763:
-.LBE1762:
+	tbnz	w0, #31, .L722
 .LBE1761:
+.LBE1760:
+.LBE1759:
+.LBB1762:
+.LBB1763:
 .LBB1764:
-.LBB1765:
-.LBB1766:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC67
@@ -7866,15 +7899,15 @@ ebc_probe:
 	add	x2, x20, 140
 	add	x1, x1, :lo12:.LC67
 	bl	of_property_read_variable_u32_array
-.LVL652:
+.LVL657:
 	.loc 12 501 0
-	tbnz	w0, #31, .L712
-.LBE1766:
-.LBE1765:
+	tbnz	w0, #31, .L722
 .LBE1764:
+.LBE1763:
+.LBE1762:
+.LBB1765:
+.LBB1766:
 .LBB1767:
-.LBB1768:
-.LBB1769:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC68
@@ -7883,15 +7916,15 @@ ebc_probe:
 	add	x2, x20, 144
 	add	x1, x1, :lo12:.LC68
 	bl	of_property_read_variable_u32_array
-.LVL653:
+.LVL658:
 	.loc 12 501 0
-	tbnz	w0, #31, .L712
-.LBE1769:
-.LBE1768:
+	tbnz	w0, #31, .L722
 .LBE1767:
+.LBE1766:
+.LBE1765:
+.LBB1768:
+.LBB1769:
 .LBB1770:
-.LBB1771:
-.LBB1772:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC69
@@ -7900,15 +7933,15 @@ ebc_probe:
 	add	x2, x20, 148
 	add	x1, x1, :lo12:.LC69
 	bl	of_property_read_variable_u32_array
-.LVL654:
+.LVL659:
 	.loc 12 501 0
-	tbnz	w0, #31, .L712
-.LBE1772:
-.LBE1771:
+	tbnz	w0, #31, .L722
 .LBE1770:
+.LBE1769:
+.LBE1768:
+.LBB1771:
+.LBB1772:
 .LBB1773:
-.LBB1774:
-.LBB1775:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC70
@@ -7917,15 +7950,15 @@ ebc_probe:
 	add	x2, x20, 152
 	add	x1, x1, :lo12:.LC70
 	bl	of_property_read_variable_u32_array
-.LVL655:
+.LVL660:
 	.loc 12 501 0
-	tbnz	w0, #31, .L712
-.LBE1775:
-.LBE1774:
+	tbnz	w0, #31, .L722
 .LBE1773:
+.LBE1772:
+.LBE1771:
+.LBB1774:
+.LBB1775:
 .LBB1776:
-.LBB1777:
-.LBB1778:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC71
@@ -7934,15 +7967,15 @@ ebc_probe:
 	add	x2, x20, 156
 	add	x1, x1, :lo12:.LC71
 	bl	of_property_read_variable_u32_array
-.LVL656:
+.LVL661:
 	.loc 12 501 0
-	tbnz	w0, #31, .L712
-.LBE1778:
-.LBE1777:
+	tbnz	w0, #31, .L722
 .LBE1776:
+.LBE1775:
+.LBE1774:
+.LBB1777:
+.LBB1778:
 .LBB1779:
-.LBB1780:
-.LBB1781:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC72
@@ -7951,15 +7984,15 @@ ebc_probe:
 	add	x2, x20, 160
 	add	x1, x1, :lo12:.LC72
 	bl	of_property_read_variable_u32_array
-.LVL657:
+.LVL662:
 	.loc 12 501 0
-	tbnz	w0, #31, .L712
-.LBE1781:
-.LBE1780:
+	tbnz	w0, #31, .L722
 .LBE1779:
+.LBE1778:
+.LBE1777:
+.LBB1780:
+.LBB1781:
 .LBB1782:
-.LBB1783:
-.LBB1784:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC73
@@ -7968,15 +8001,15 @@ ebc_probe:
 	add	x2, x20, 164
 	add	x1, x1, :lo12:.LC73
 	bl	of_property_read_variable_u32_array
-.LVL658:
+.LVL663:
 	.loc 12 501 0
-	tbnz	w0, #31, .L712
-.LBE1784:
-.LBE1783:
+	tbnz	w0, #31, .L722
 .LBE1782:
+.LBE1781:
+.LBE1780:
+.LBB1783:
+.LBB1784:
 .LBB1785:
-.LBB1786:
-.LBB1787:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC74
@@ -7985,15 +8018,15 @@ ebc_probe:
 	add	x2, x20, 168
 	add	x1, x1, :lo12:.LC74
 	bl	of_property_read_variable_u32_array
-.LVL659:
+.LVL664:
 	.loc 12 501 0
-	tbnz	w0, #31, .L712
-.LBE1787:
-.LBE1786:
+	tbnz	w0, #31, .L722
 .LBE1785:
+.LBE1784:
+.LBE1783:
+.LBB1786:
+.LBB1787:
 .LBB1788:
-.LBB1789:
-.LBB1790:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC75
@@ -8002,18 +8035,18 @@ ebc_probe:
 	add	x2, x20, 172
 	add	x1, x1, :lo12:.LC75
 	bl	of_property_read_variable_u32_array
-.LVL660:
+.LVL665:
 	.loc 12 501 0
-	tbz	w0, #31, .L738
-.LBE1790:
-.LBE1789:
+	tbz	w0, #31, .L748
 .LBE1788:
+.LBE1787:
+.LBE1786:
 	.loc 1 2339 0
 	str	wzr, [x21, 148]
-.L738:
+.L748:
+.LBB1789:
+.LBB1790:
 .LBB1791:
-.LBB1792:
-.LBB1793:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC36
@@ -8022,18 +8055,18 @@ ebc_probe:
 	add	x2, x20, 176
 	add	x1, x1, :lo12:.LC36
 	bl	of_property_read_variable_u32_array
-.LVL661:
+.LVL666:
 	.loc 12 501 0
-	tbz	w0, #31, .L739
-.LBE1793:
-.LBE1792:
+	tbz	w0, #31, .L749
 .LBE1791:
+.LBE1790:
+.LBE1789:
 	.loc 1 2342 0
 	str	wzr, [x21, 152]
-.L739:
+.L749:
+.LBB1792:
+.LBB1793:
 .LBB1794:
-.LBB1795:
-.LBB1796:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC37
@@ -8042,18 +8075,18 @@ ebc_probe:
 	add	x2, x20, 180
 	add	x1, x1, :lo12:.LC37
 	bl	of_property_read_variable_u32_array
-.LVL662:
+.LVL667:
 	.loc 12 501 0
-	tbz	w0, #31, .L740
-.LBE1796:
-.LBE1795:
+	tbz	w0, #31, .L750
 .LBE1794:
+.LBE1793:
+.LBE1792:
 	.loc 1 2345 0
 	str	wzr, [x21, 156]
-.L740:
+.L750:
+.LBB1795:
+.LBB1796:
 .LBB1797:
-.LBB1798:
-.LBB1799:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC38
@@ -8062,18 +8095,18 @@ ebc_probe:
 	add	x2, x20, 116
 	add	x1, x1, :lo12:.LC38
 	bl	of_property_read_variable_u32_array
-.LVL663:
+.LVL668:
 	.loc 12 501 0
-	tbz	w0, #31, .L741
-.LBE1799:
-.LBE1798:
+	tbz	w0, #31, .L751
 .LBE1797:
+.LBE1796:
+.LBE1795:
 	.loc 1 2348 0
 	str	wzr, [x21, 92]
-.L741:
+.L751:
+.LBB1798:
+.LBB1799:
 .LBB1800:
-.LBB1801:
-.LBB1802:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC39
@@ -8082,25 +8115,25 @@ ebc_probe:
 	add	x2, x20, 120
 	add	x1, x1, :lo12:.LC39
 	bl	of_property_read_variable_u32_array
-.LVL664:
+.LVL669:
 	.loc 12 501 0
-	tbz	w0, #31, .L742
-.LBE1802:
-.LBE1801:
+	tbz	w0, #31, .L752
 .LBE1800:
+.LBE1799:
+.LBE1798:
 	.loc 1 2351 0
 	str	wzr, [x21, 96]
-.L742:
-.LBE1805:
-.LBE1808:
+.L752:
+.LBE1803:
+.LBE1806:
 	.loc 1 3084 0
 	ldr	w0, [x21, 88]
-.LBB1809:
-.LBB1810:
+.LBB1807:
+.LBB1808:
 	.loc 1 2807 0
 	mov	w2, 0
-.LBE1810:
-.LBE1809:
+.LBE1808:
+.LBE1807:
 	.loc 1 3084 0
 	str	w0, [x19, 68]
 	.loc 1 3085 0
@@ -8113,65 +8146,65 @@ ebc_probe:
 	.loc 1 3088 0
 	cset	w1, eq
 	str	w1, [x19, 88]
-.LBB1824:
-.LBB1819:
+.LBB1822:
+.LBB1817:
 	.loc 1 2807 0
 	adrp	x1, .LC40
 	add	x1, x1, :lo12:.LC40
-.LBE1819:
-.LBE1824:
+.LBE1817:
+.LBE1822:
 	.loc 1 3086 0
 	lsr	w3, w0, 1
 	.loc 1 3087 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x19, 20]
-.LBB1825:
-.LBB1820:
+.LBB1823:
+.LBB1818:
 	.loc 1 2798 0
 	ldr	x26, [x20]
-.LVL665:
+.LVL670:
 	.loc 1 2807 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL666:
+.LVL671:
 	.loc 1 2808 0
-	cbz	x0, .L749
+	cbz	x0, .L759
 	.loc 1 2811 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL667:
+.LVL672:
 	mov	w25, w0
 	.loc 1 2813 0
-	cbnz	w0, .L788
-.LBB1811:
-.LBB1812:
+	cbnz	w0, .L798
+.LBB1809:
+.LBB1810:
 	.file 13 "./include/linux/ioport.h"
 	.loc 13 204 0
 	ldp	x1, x2, [x29, 104]
-.LBE1812:
-.LBE1811:
+.LBE1810:
+.LBE1809:
 	.loc 1 2818 0
 	str	x1, [x20, 184]
 	.loc 1 2821 0
 	mov	x3, 1
 	mov	x0, x26
-.LBB1814:
-.LBB1813:
+.LBB1812:
+.LBB1811:
 	.loc 13 204 0
 	add	x2, x2, 1
 	sub	x2, x2, x1
-.LBE1813:
-.LBE1814:
+.LBE1811:
+.LBE1812:
 	.loc 1 2819 0
 	str	w2, [x19, 16]
 	.loc 1 2821 0
 	sxtw	x2, w2
 	bl	devm_memremap
-.LVL668:
+.LVL673:
 	str	x0, [x19, 8]
 	.loc 1 2823 0
-	cbz	x0, .L720
+	cbz	x0, .L730
 	.loc 1 2831 0
 	mov	x1, x0
 	ldr	w2, [x19, 16]
@@ -8179,9 +8212,9 @@ ebc_probe:
 	mov	w4, 4
 	mov	w3, 4194304
 	bl	ebc_buf_init
-.LVL669:
+.LVL674:
 	.loc 1 2832 0
-	cbnz	w0, .L720
+	cbnz	w0, .L730
 	.loc 1 2837 0
 	ldr	x1, [x19, 8]
 	.loc 1 2838 0
@@ -8200,12 +8233,12 @@ ebc_probe:
 	.loc 1 2844 0
 	mov	x4, 23068672
 	add	x4, x1, x4
-.LBB1815:
-.LBB1816:
+.LBB1813:
+.LBB1814:
 	.loc 2 711 0
 	mov	x0, x26
-.LBE1816:
-.LBE1815:
+.LBE1814:
+.LBE1813:
 	.loc 1 2839 0
 	add	x3, x2, x3
 	str	x3, [x21, 32]
@@ -8234,70 +8267,70 @@ ebc_probe:
 	str	x1, [x19, 128]
 	.loc 1 2850 0
 	ldp	w2, w1, [x21, 84]
-.LBB1818:
-.LBB1817:
+.LBB1816:
+.LBB1815:
 	.loc 2 711 0
 	mul	w1, w2, w1
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	bl	devm_kmalloc
-.LVL670:
-.LBE1817:
-.LBE1818:
+.LVL675:
+.LBE1815:
+.LBE1816:
 	.loc 1 2850 0
 	str	x0, [x19, 168]
 	.loc 1 2851 0
-	cbz	x0, .L720
+	cbz	x0, .L730
 	.loc 1 2853 0
 	ldp	w2, w1, [x21, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
-.LVL671:
+.LVL676:
 	.loc 1 2854 0
 	ldrsw	x2, [x19, 20]
 	mov	w1, 255
 	ldr	x0, [x19, 160]
 	bl	memset
-.LVL672:
-.LBE1820:
-.LBE1825:
-.LBB1826:
-.LBB1827:
+.LVL677:
+.LBE1818:
+.LBE1823:
+.LBB1824:
+.LBB1825:
 	.loc 1 2755 0
 	ldr	x26, [x19, 104]
-.LVL673:
+.LVL678:
 	.loc 1 2761 0
 	adrp	x1, .LC42
 	mov	w2, 0
 	add	x1, x1, :lo12:.LC42
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL674:
+.LVL679:
 	.loc 1 2762 0
-	cbz	x0, .L750
+	cbz	x0, .L760
 	.loc 1 2765 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL675:
+.LVL680:
 	mov	w25, w0
 	.loc 1 2767 0
-	cbz	w0, .L789
-.L721:
-.LBE1827:
-.LBE1826:
+	cbz	w0, .L799
+.L731:
+.LBE1825:
+.LBE1824:
 	.loc 1 3100 0
 	adrp	x1, .LC77
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC77
 	bl	_dev_err
-.LVL676:
+.LVL681:
 	.loc 1 3101 0
-	b	.L698
-.LVL677:
+	b	.L708
+.LVL682:
 	.p2align 3
-.L712:
+.L722:
 	.loc 1 3082 0
 	mov	w25, -22
 	.loc 1 3081 0
@@ -8306,27 +8339,27 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC83
 	mov	x0, x22
 	bl	_dev_err
-.LVL678:
+.LVL683:
 	.loc 1 3082 0
-	b	.L698
-.LVL679:
+	b	.L708
+.LVL684:
 	.p2align 3
-.L785:
+.L795:
 	.loc 1 3055 0
 	adrp	x1, .LC32
 	mov	x0, x22
-.LVL680:
+.LVL685:
 	add	x1, x1, :lo12:.LC32
 	.loc 1 3056 0
 	mov	w25, -19
 	.loc 1 3055 0
 	bl	_dev_err
-.LVL681:
+.LVL686:
 	.loc 1 3056 0
-	b	.L698
-.LVL682:
+	b	.L708
+.LVL687:
 	.p2align 3
-.L710:
+.L720:
 	.loc 1 3067 0
 	adrp	x1, .LC34
 	mov	x0, x22
@@ -8335,101 +8368,101 @@ ebc_probe:
 	mov	w25, -517
 	.loc 1 3067 0
 	bl	_dev_err
-.LVL683:
+.LVL688:
 	.loc 1 3068 0
-	b	.L698
-.LVL684:
+	b	.L708
+.LVL689:
 	.p2align 3
-.L788:
-.LBB1835:
-.LBB1821:
+.L798:
+.LBB1833:
+.LBB1819:
 	.loc 1 2814 0
 	adrp	x1, .LC41
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC41
 	bl	_dev_err
-.LVL685:
-.L717:
-.LBE1821:
-.LBE1835:
+.LVL690:
+.L727:
+.LBE1819:
+.LBE1833:
 	.loc 1 3093 0
 	adrp	x1, .LC76
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC76
 	bl	_dev_err
-.LVL686:
+.LVL691:
 	.loc 1 3094 0
-	b	.L698
-.LVL687:
-.L789:
-.LBB1836:
-.LBB1832:
+	b	.L708
+.LVL692:
+.L799:
+.LBB1834:
+.LBB1830:
 	.loc 1 2776 0
 	mov	x0, x26
 	mov	x3, 1
-.LBB1828:
-.LBB1829:
+.LBB1826:
+.LBB1827:
 	.loc 13 204 0
 	ldp	x1, x26, [x29, 104]
-.LVL688:
-.LBE1829:
-.LBE1828:
+.LVL693:
+.LBE1827:
+.LBE1826:
 	.loc 1 2773 0
 	str	x1, [x19, 32]
-.LBB1831:
-.LBB1830:
+.LBB1829:
+.LBB1828:
 	.loc 13 204 0
 	add	x26, x26, 1
 	sub	x26, x26, x1
-.LBE1830:
-.LBE1831:
+.LBE1828:
+.LBE1829:
 	.loc 1 2774 0
 	str	w26, [x19, 40]
 	.loc 1 2776 0
 	sxtw	x2, w26
 	bl	devm_memremap
-.LVL689:
+.LVL694:
 	str	x0, [x19, 208]
 	.loc 1 2778 0
-	cbz	x0, .L790
+	cbz	x0, .L800
 	.loc 1 2783 0
 	bl	epd_lut_from_mem_init
-.LVL690:
+.LVL695:
 	.loc 1 2784 0
-	tbnz	w0, #31, .L791
-.L723:
-.LBE1832:
-.LBE1836:
-.LBB1837:
-.LBB1838:
+	tbnz	w0, #31, .L801
+.L733:
+.LBE1830:
+.LBE1834:
+.LBB1835:
+.LBB1836:
 	.loc 1 2863 0
 	add	x0, x20, 752
 	mov	x1, 68719476704
 	str	x1, [x19, 560]
 	.loc 1 2867 0
 	add	x24, x24, :lo12:.LANCHOR0
+.LBB1837:
+.LBB1838:
 .LBB1839:
 .LBB1840:
 .LBB1841:
-.LBB1842:
-.LBB1843:
 	.file 14 "./include/linux/compiler.h"
 	.loc 14 288 0
 	str	x0, [x20, 752]
-.LBE1843:
-.LBE1842:
 .LBE1841:
 .LBE1840:
 .LBE1839:
+.LBE1838:
+.LBE1837:
 	.loc 1 2864 0
 	adrp	x5, .LC78
-.LBB1845:
-.LBB1844:
+.LBB1843:
+.LBB1842:
 	.file 15 "./include/linux/list.h"
 	.loc 15 29 0
 	str	x0, [x0, 8]
-.LBE1844:
-.LBE1845:
+.LBE1842:
+.LBE1843:
 	.loc 1 2863 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
@@ -8450,7 +8483,7 @@ ebc_probe:
 	.loc 1 2864 0
 	add	x0, x0, :lo12:.LC79
 	bl	__alloc_workqueue_key
-.LVL691:
+.LVL696:
 	str	x0, [x19, 608]
 	.loc 1 2867 0
 	adrp	x3, .LC80
@@ -8460,26 +8493,26 @@ ebc_probe:
 	adrp	x0, ebc_auto_tast_function
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
-.LVL692:
+.LVL697:
 	str	x0, [x24, 8]
 	.loc 1 2868 0
 	cmn	x0, #4096
-	bhi	.L792
+	bhi	.L802
 	.loc 1 2872 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
-.LVL693:
+.LVL698:
 	.loc 1 2873 0
 	ldr	x2, [x24, 8]
-.LBB1846:
-.LBB1847:
+.LBB1844:
+.LBB1845:
 	.file 16 "./arch/arm64/include/asm/atomic_lse.h"
 	.loc 16 47 0
 	mov	w0, 1
-.LVL694:
+.LVL699:
 	add	x1, x2, 48
-.LVL695:
+.LVL700:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -8507,49 +8540,49 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL696:
+.LVL701:
 #NO_APP
-.LBE1847:
-.LBE1846:
-.LBB1848:
+.LBE1845:
+.LBE1844:
+.LBB1846:
 	.loc 1 2876 0
 	adrp	x3, .LC47
 	adrp	x0, ebc_thread
-.LVL697:
+.LVL702:
 	add	x3, x3, :lo12:.LC47
 	mov	w2, -1
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x19
-.LBE1848:
+.LBE1846:
 	.loc 1 2875 0
 	str	w26, [x29, 104]
-.LBB1849:
+.LBB1847:
 	.loc 1 2876 0
 	bl	kthread_create_on_node
-.LVL698:
+.LVL703:
 	mov	x24, x0
-.LVL699:
+.LVL704:
 	cmn	x0, #4096
-	bhi	.L725
+	bhi	.L735
 	bl	wake_up_process
-.LVL700:
-.LBE1849:
+.LVL705:
+.LBE1847:
 	str	x24, [x19, 136]
 	.loc 1 2881 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x24
 	bl	sched_setscheduler_nocheck
-.LVL701:
+.LVL706:
 	.loc 1 2882 0
 	ldr	x2, [x19, 136]
-.LBB1850:
-.LBB1851:
+.LBB1848:
+.LBB1849:
 	.loc 16 47 0
 	mov	w0, 1
-.LVL702:
+.LVL707:
 	add	x1, x2, 48
-.LVL703:
+.LVL708:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -8577,62 +8610,62 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL704:
+.LVL709:
 #NO_APP
-.LBE1851:
-.LBE1850:
-.LBE1838:
-.LBE1837:
-.LBB1854:
-.LBB1855:
+.LBE1849:
+.LBE1848:
+.LBE1836:
+.LBE1835:
+.LBB1852:
+.LBB1853:
 	.loc 1 2891 0
 	mov	w0, -1
-.LVL705:
+.LVL710:
 	str	w0, [x19, 64]
-.LBB1856:
-.LBB1857:
+.LBB1854:
+.LBB1855:
 	.loc 4 39 0
 	add	x0, x20, 416
-.LVL706:
-.LBE1857:
-.LBE1856:
+.LVL711:
+.LBE1855:
+.LBE1854:
 	.loc 1 2895 0
 	str	wzr, [x19, 44]
 	.loc 1 2894 0
 	str	wzr, [x19, 96]
-.LBB1862:
-.LBB1858:
+.LBB1860:
+.LBB1856:
 	.loc 4 43 0
 	adrp	x1, .LC48
-.LBE1858:
-.LBE1862:
+.LBE1856:
+.LBE1860:
 	.loc 1 2890 0
 	str	wzr, [x19, 200]
-.LBB1863:
-.LBB1859:
+.LBB1861:
+.LBB1857:
 	.loc 4 43 0
 	add	x1, x1, :lo12:.LC48
-.LBE1859:
-.LBE1863:
+.LBE1857:
+.LBE1861:
 	.loc 1 2892 0
 	str	wzr, [x19, 616]
 	.loc 1 2902 0
 	add	x24, x20, 632
-.LVL707:
+.LVL712:
 	.loc 1 2893 0
 	str	wzr, [x19, 620]
 	.loc 1 2903 0
 	adrp	x26, jiffies
-.LBB1864:
-.LBB1860:
+.LBB1862:
+.LBB1858:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0]
-.LBE1860:
-.LBE1864:
+.LBE1858:
+.LBE1862:
 	.loc 1 2903 0
 	mov	x27, 268435455
-.LBB1865:
-.LBB1861:
+.LBB1863:
+.LBB1859:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0, 16]
 	stp	xzr, xzr, [x0, 32]
@@ -8650,9 +8683,9 @@ ebc_probe:
 	str	x1, [x20, 416]
 	.loc 4 45 0
 	bl	wakeup_source_add
-.LVL708:
-.LBE1861:
-.LBE1865:
+.LVL713:
+.LBE1859:
+.LBE1863:
 	.loc 1 2899 0
 	str	wzr, [x19, 440]
 	.loc 1 2902 0
@@ -8663,7 +8696,7 @@ ebc_probe:
 	adrp	x1, ebc_vdd_power_timeout
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
-.LVL709:
+.LVL714:
 	.loc 1 2903 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
@@ -8672,7 +8705,7 @@ ebc_probe:
 	.loc 1 2903 0
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL710:
+.LVL715:
 	.loc 1 2906 0
 	mov	x4, 0
 	mov	x3, 0
@@ -8681,111 +8714,111 @@ ebc_probe:
 	adrp	x1, ebc_frame_timeout
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
-.LVL711:
+.LVL716:
 	.loc 1 2907 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL712:
-.LBE1855:
-.LBE1854:
-.LBB1866:
-.LBB1867:
+.LVL717:
+.LBE1853:
+.LBE1852:
+.LBB1864:
+.LBB1865:
 	.loc 1 2917 0
 	adrp	x0, saved_command_line
 	adrp	x1, .LC49
 	.loc 1 2914 0
 	stp	wzr, wzr, [x29, 100]
-.LVL713:
+.LVL718:
 	.loc 1 2917 0
 	add	x1, x1, :lo12:.LC49
 	ldr	x24, [x0, #:lo12:saved_command_line]
 	mov	x0, x24
 	bl	strstr
-.LVL714:
+.LVL719:
 	.loc 1 2918 0
 	adrp	x1, .LC50
 	.loc 1 2917 0
 	mov	x26, x0
-.LVL715:
+.LVL720:
 	.loc 1 2918 0
 	add	x1, x1, :lo12:.LC50
 	mov	x0, x24
 	bl	strstr
-.LVL716:
+.LVL721:
 	mov	x28, x0
-.LVL717:
+.LVL722:
 	.loc 1 2923 0
-	cbz	x26, .L726
+	cbz	x26, .L736
 	.loc 1 2924 0
 	add	x2, x29, 100
 	adrp	x1, .LC51
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC51
 	bl	sscanf
-.LVL718:
+.LVL723:
 	.loc 1 2925 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
-	bls	.L793
-.L726:
+	bls	.L803
+.L736:
 	.loc 1 2937 0
 	mov	w24, 0
-.LVL719:
+.LVL724:
 	mov	x27, 0
-.LVL720:
+.LVL725:
 	.loc 1 2921 0
 	mov	x26, 0
-.LVL721:
+.LVL726:
 	.loc 1 2937 0
-	cbz	x28, .L746
-.LVL722:
-.L745:
+	cbz	x28, .L756
+.LVL727:
+.L755:
 	.loc 1 2938 0
 	add	x2, x29, 104
 	mov	x0, x28
 	adrp	x1, .LC54
 	add	x1, x1, :lo12:.LC54
 	bl	sscanf
-.LVL723:
+.LVL728:
 	.loc 1 2916 0
 	mov	w28, 0
-.LVL724:
+.LVL729:
 	.loc 1 2939 0
 	ldr	w2, [x29, 104]
 	.loc 1 2921 0
 	mov	x26, 0
-.LVL725:
+.LVL730:
 	.loc 1 2939 0
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
-	bls	.L794
-.L730:
+	bls	.L804
+.L740:
 	.loc 1 2951 0
-	cbnz	w24, .L729
-.LVL726:
-.L746:
+	cbnz	w24, .L739
+.LVL731:
+.L756:
 	.loc 1 2952 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC57
 	add	x1, x1, :lo12:.LC57
 	bl	_dev_info
-.LVL727:
+.LVL732:
 	.loc 1 2953 0
 	ldr	x0, [x20, 16]
 	bl	ebc_pmic_verity_vcom
-.LVL728:
-.LBB1868:
-.LBB1869:
+.LVL733:
+.LBB1866:
+.LBB1867:
 	.loc 1 2258 0
 	adrp	x0, .LC58
 	add	x0, x0, :lo12:.LC58
 	bl	ebc_empty_buf_get
-.LVL729:
+.LVL734:
 	mov	x24, x0
-.LVL730:
+.LVL735:
 	.loc 1 2259 0
 	ldp	w2, w0, [x20, 108]
 	mov	w1, 255
@@ -8793,7 +8826,7 @@ ebc_probe:
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memset
-.LVL731:
+.LVL736:
 	.loc 1 2262 0
 	stp	wzr, wzr, [x24, 48]
 	.loc 1 2260 0
@@ -8812,90 +8845,90 @@ ebc_probe:
 	stp	w1, w2, [x24, 60]
 	.loc 1 2266 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL732:
-.L732:
-.LBE1869:
-.LBE1868:
+.LVL737:
+.L742:
+.LBE1867:
+.LBE1866:
 	.loc 1 2971 0
-	cbnz	w28, .L795
-.L734:
+	cbnz	w28, .L805
+.L744:
 	.loc 1 2985 0
 	ldr	w0, [x19, 96]
 	adrp	x21, .LANCHOR1
-	cbz	w0, .L796
-.L736:
+	cbz	w0, .L806
+.L746:
 	.loc 1 2990 0
-	cbz	x27, .L737
+	cbz	x27, .L747
 	.loc 1 2991 0
 	mov	x0, x27
 	bl	kfree
-.LVL733:
-.L737:
+.LVL738:
+.L747:
 	.loc 1 2992 0
-	cbz	x26, .L728
+	cbz	x26, .L738
 	.loc 1 2993 0
 	mov	x0, x26
 	bl	kfree
-.LVL734:
-.L728:
-.LBE1867:
-.LBE1866:
+.LVL739:
+.L738:
+.LBE1865:
+.LBE1864:
+.LBB1877:
+.LBB1878:
 .LBB1879:
-.LBB1880:
-.LBB1881:
 	.loc 2 1186 0
 	str	x20, [x22, 184]
-.LBE1881:
-.LBE1880:
 .LBE1879:
-.LBB1882:
-.LBB1883:
+.LBE1878:
+.LBE1877:
+.LBB1880:
+.LBB1881:
 	.loc 1 2738 0
 	add	x21, x21, :lo12:.LANCHOR1
 	add	x0, x21, 224
 	bl	misc_register
-.LVL735:
+.LVL740:
 	.loc 1 2739 0
 	add	x0, x21, 376
 	bl	misc_register
-.LVL736:
+.LVL741:
 	.loc 1 2741 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 456
 	bl	device_create_file
-.LVL737:
+.LVL742:
 	.loc 1 2742 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 488
 	bl	device_create_file
-.LVL738:
+.LVL743:
 	.loc 1 2743 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 520
 	bl	device_create_file
-.LVL739:
+.LVL744:
 	.loc 1 2744 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 552
 	bl	device_create_file
-.LVL740:
+.LVL745:
 	.loc 1 2745 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 584
 	bl	device_create_file
-.LVL741:
+.LVL746:
 	.loc 1 2746 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 616
 	bl	device_create_file
-.LVL742:
+.LVL747:
 	.loc 1 2747 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 648
 	bl	device_create_file
-.LVL743:
-.LBE1883:
-.LBE1882:
+.LVL748:
+.LBE1881:
+.LBE1880:
 	.loc 1 3122 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LC17
@@ -8903,13 +8936,13 @@ ebc_probe:
 	add	x2, x2, :lo12:.LC17
 	add	x1, x1, :lo12:.LC60
 	bl	_dev_info
-.LVL744:
+.LVL749:
 	.loc 1 3124 0
-	b	.L698
-.LVL745:
-.L796:
-.LBB1884:
-.LBB1876:
+	b	.L708
+.LVL750:
+.L806:
+.LBB1882:
+.LBB1874:
 	.loc 1 2986 0
 	mov	w2, 1
 	str	w2, [x19, 96]
@@ -8918,67 +8951,67 @@ ebc_probe:
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL746:
-	b	.L736
-.LVL747:
-.L793:
+.LVL751:
+	b	.L746
+.LVL752:
+.L803:
 	.loc 1 2927 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC52
 	add	x1, x1, :lo12:.LC52
 	bl	_dev_info
-.LVL748:
+.LVL753:
 	.loc 1 2928 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
+.LBB1868:
+.LBB1869:
 .LBB1870:
-.LBB1871:
-.LBB1872:
 	.file 17 "./include/linux/slab.h"
 	.loc 17 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL749:
+.LVL754:
 	mov	x27, x0
-.LVL750:
-.LBE1872:
-.LBE1871:
+.LVL755:
 .LBE1870:
+.LBE1869:
+.LBE1868:
 	.loc 1 2929 0
-	cbz	x0, .L797
+	cbz	x0, .L807
 	.loc 1 2933 0
 	ldp	w2, w1, [x21, 84]
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 100]
-.LVL751:
+.LVL756:
 	sub	x1, x1, x3
-.LVL752:
+.LVL757:
 	ldr	x3, [x19, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL753:
+.LVL758:
 	.loc 1 2937 0
-	cbnz	x28, .L798
+	cbnz	x28, .L808
 	.loc 1 2916 0
 	mov	w28, 0
-.LVL754:
+.LVL759:
 	.loc 1 2921 0
 	mov	x26, 0
-.LVL755:
-.L729:
+.LVL760:
+.L739:
 	.loc 1 2958 0
 	adrp	x0, .LC59
 	add	x0, x0, :lo12:.LC59
 	bl	ebc_empty_buf_get
-.LVL756:
+.LVL761:
 	mov	x24, x0
-.LVL757:
+.LVL762:
 	.loc 1 2959 0
-	cbz	x0, .L732
+	cbz	x0, .L742
 	.loc 1 2960 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x27
@@ -8986,7 +9019,7 @@ ebc_probe:
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL758:
+.LVL763:
 	.loc 1 2963 0
 	stp	wzr, wzr, [x24, 48]
 	.loc 1 2961 0
@@ -9005,34 +9038,34 @@ ebc_probe:
 	stp	w1, w2, [x24, 60]
 	.loc 1 2967 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL759:
-	b	.L732
-.LVL760:
-.L794:
+.LVL764:
+	b	.L742
+.LVL765:
+.L804:
 	.loc 1 2941 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC55
 	add	x1, x1, :lo12:.LC55
 	bl	_dev_info
-.LVL761:
+.LVL766:
 	.loc 1 2942 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
+.LBB1871:
+.LBB1872:
 .LBB1873:
-.LBB1874:
-.LBB1875:
 	.loc 17 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL762:
+.LVL767:
 	mov	x26, x0
-.LBE1875:
-.LBE1874:
 .LBE1873:
+.LBE1872:
+.LBE1871:
 	.loc 1 2943 0
-	cbz	x0, .L799
+	cbz	x0, .L809
 	.loc 1 2947 0
 	ldp	w2, w1, [x21, 84]
 	.loc 1 2940 0
@@ -9041,35 +9074,35 @@ ebc_probe:
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
-.LVL763:
+.LVL768:
 	sub	x1, x1, x3
-.LVL764:
+.LVL769:
 	ldr	x3, [x19, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL765:
-	b	.L730
-.LVL766:
-.L702:
-.LBE1876:
-.LBE1884:
+.LVL770:
+	b	.L740
+.LVL771:
+.L712:
+.LBE1874:
+.LBE1882:
 	.loc 1 3030 0
 	mov	w25, -517
-	b	.L698
-.LVL767:
-.L795:
-.LBB1885:
-.LBB1877:
+	b	.L708
+.LVL772:
+.L805:
+.LBB1883:
+.LBB1875:
 	.loc 1 2972 0
 	adrp	x0, .LC59
 	add	x0, x0, :lo12:.LC59
 	bl	ebc_empty_buf_get
-.LVL768:
+.LVL773:
 	mov	x24, x0
-.LVL769:
+.LVL774:
 	.loc 1 2973 0
-	cbz	x0, .L734
+	cbz	x0, .L744
 	.loc 1 2974 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x26
@@ -9077,7 +9110,7 @@ ebc_probe:
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL770:
+.LVL775:
 	.loc 1 2977 0
 	stp	wzr, wzr, [x24, 48]
 	.loc 1 2975 0
@@ -9095,17 +9128,17 @@ ebc_probe:
 	.loc 1 2981 0
 	mov	x0, x24
 	bl	ebc_add_to_dsp_buf_list
-.LVL771:
-	b	.L734
-.LVL772:
-.L748:
-.LBE1877:
-.LBE1885:
+.LVL776:
+	b	.L744
+.LVL777:
+.L758:
+.LBE1875:
+.LBE1883:
 	.loc 1 3016 0
 	mov	w25, -12
-	b	.L698
-.LVL773:
-.L703:
+	b	.L708
+.LVL778:
+.L713:
 	.loc 1 3040 0
 	adrp	x1, .LC30
 	mov	x0, x22
@@ -9114,27 +9147,27 @@ ebc_probe:
 	mov	w25, -22
 	.loc 1 3040 0
 	bl	_dev_err
-.LVL774:
+.LVL779:
 	.loc 1 3041 0
-	b	.L698
-.LVL775:
-.L791:
-.LBB1886:
-.LBB1833:
+	b	.L708
+.LVL780:
+.L801:
+.LBB1884:
+.LBB1831:
 	.loc 1 2785 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC44
 	add	x1, x1, :lo12:.LC44
 	bl	_dev_err
-.LVL776:
+.LVL781:
 	.loc 1 2786 0
 	ldr	x0, [x19, 104]
 	mov	w2, w26
 	ldr	x1, [x19, 208]
 	bl	epd_lut_from_file_init
-.LVL777:
+.LVL782:
 	.loc 1 2787 0
-	tbz	w0, #31, .L723
+	tbz	w0, #31, .L733
 	.loc 1 2788 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC45
@@ -9143,33 +9176,33 @@ ebc_probe:
 	.loc 1 2788 0
 	add	x1, x1, :lo12:.LC45
 	bl	_dev_err
-.LVL778:
-	b	.L721
-.LVL779:
+.LVL783:
+	b	.L731
+.LVL784:
 	.p2align 3
-.L720:
-.LBE1833:
-.LBE1886:
-.LBB1887:
-.LBB1822:
+.L730:
+.LBE1831:
+.LBE1884:
+.LBB1885:
+.LBB1820:
 	.loc 1 2824 0
 	mov	w25, -12
-	b	.L717
-.LVL780:
-.L792:
-.LBE1822:
-.LBE1887:
-.LBB1888:
-.LBB1852:
+	b	.L727
+.LVL785:
+.L802:
+.LBE1820:
+.LBE1885:
+.LBB1886:
+.LBB1850:
 	.loc 1 2869 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC46
 	add	x1, x1, :lo12:.LC46
 	bl	_dev_err
-.LVL781:
-.L724:
-.LBE1852:
-.LBE1888:
+.LVL786:
+.L734:
+.LBE1850:
+.LBE1886:
 	.loc 1 3107 0
 	adrp	x1, .LC82
 	mov	x0, x22
@@ -9178,28 +9211,28 @@ ebc_probe:
 	mov	w25, -1
 	.loc 1 3107 0
 	bl	_dev_err
-.LVL782:
+.LVL787:
 	.loc 1 3108 0
-	b	.L698
-.LVL783:
-.L725:
-.LBB1889:
-.LBB1853:
+	b	.L708
+.LVL788:
+.L735:
+.LBB1887:
+.LBB1851:
 	.loc 1 2878 0
 	ldr	x0, [x19, 104]
-.LVL784:
+.LVL789:
 	adrp	x1, .LC81
 	.loc 1 2876 0
 	str	x24, [x19, 136]
 	.loc 1 2878 0
 	add	x1, x1, :lo12:.LC81
 	bl	_dev_err
-.LVL785:
-	b	.L724
-.LVL786:
-.L784:
-.LBE1853:
-.LBE1889:
+.LVL790:
+	b	.L734
+.LVL791:
+.L794:
+.LBE1851:
+.LBE1887:
 	.loc 1 3023 0
 	adrp	x1, .LC28
 	mov	x0, x22
@@ -9208,27 +9241,27 @@ ebc_probe:
 	mov	w25, -19
 	.loc 1 3023 0
 	bl	_dev_err
-.LVL787:
+.LVL792:
 	.loc 1 3024 0
-	b	.L698
-.LVL788:
-.L749:
-.LBB1890:
-.LBB1823:
+	b	.L708
+.LVL793:
+.L759:
+.LBB1888:
+.LBB1821:
 	.loc 1 2809 0
 	mov	w25, -19
-	b	.L717
-.LVL789:
-.L750:
-.LBE1823:
-.LBE1890:
-.LBB1891:
-.LBB1834:
+	b	.L727
+.LVL794:
+.L760:
+.LBE1821:
+.LBE1888:
+.LBB1889:
+.LBB1832:
 	.loc 1 2763 0
 	mov	w25, -19
-	b	.L721
-.LVL790:
-.L790:
+	b	.L731
+.LVL795:
+.L800:
 	.loc 1 2779 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
@@ -9241,58 +9274,58 @@ ebc_probe:
 	mov	w25, -12
 	.loc 1 2779 0
 	bl	_dev_err
-.LVL791:
-	b	.L721
-.LVL792:
-.L798:
-.LBE1834:
-.LBE1891:
-.LBB1892:
-.LBB1878:
+.LVL796:
+	b	.L731
+.LVL797:
+.L808:
+.LBE1832:
+.LBE1889:
+.LBB1890:
+.LBB1876:
 	.loc 1 2926 0
 	mov	w24, 1
-.LVL793:
-	b	.L745
-.LVL794:
-.L797:
+.LVL798:
+	b	.L755
+.LVL799:
+.L807:
 	.loc 1 2930 0
 	ldr	x0, [x19, 104]
-.LVL795:
+.LVL800:
 	adrp	x1, .LC53
 	adrp	x21, .LANCHOR1
 	add	x1, x1, :lo12:.LC53
 	bl	_dev_err
-.LVL796:
-	b	.L728
-.LVL797:
-.L799:
+.LVL801:
+	b	.L738
+.LVL802:
+.L809:
 	.loc 1 2944 0
 	ldr	x0, [x19, 104]
-.LVL798:
+.LVL803:
 	adrp	x1, .LC56
 	adrp	x21, .LANCHOR1
 	add	x1, x1, :lo12:.LC56
 	bl	_dev_err
-.LVL799:
-	b	.L728
-.LVL800:
-.L787:
-.LBE1878:
-.LBE1892:
+.LVL804:
+	b	.L738
+.LVL805:
+.L797:
+.LBE1876:
+.LBE1890:
 	.loc 1 3125 0
 	bl	__stack_chk_fail
-.LVL801:
+.LVL806:
 	.cfi_endproc
-.LFE2862:
+.LFE2861:
 	.size	ebc_probe, .-ebc_probe
 	.align	2
 	.p2align 3,,7
 	.type	ebc_power_set.constprop.17, %function
 ebc_power_set.constprop.17:
-.LFB2887:
+.LFB2886:
 	.loc 1 183 0
 	.cfi_startproc
-.LVL802:
+.LVL807:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -9308,45 +9341,45 @@ ebc_power_set.constprop.17:
 	mov	x19, x0
 	.loc 1 189 0
 	ldr	w0, [x20, 440]
-.LVL803:
-	cbz	w0, .L803
-.L801:
+.LVL808:
+	cbz	w0, .L813
+.L811:
 	.loc 1 193 0
 	mov	w1, 1
 	str	w1, [x20, 200]
 	.loc 1 194 0
 	ldr	x2, [x19, 16]
-.LBB1893:
-.LBB1894:
+.LBB1891:
+.LBB1892:
 	.loc 3 30 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL804:
-.LBE1894:
-.LBE1893:
+.LVL809:
+.LBE1892:
+.LBE1891:
 	.loc 1 195 0
 	ldr	x2, [x19, 8]
-.LBB1895:
-.LBB1896:
+.LBB1893:
+.LBB1894:
 	.loc 11 46 0
 	add	x1, x19, 24
 	mov	x0, x2
 	ldr	x2, [x2, 48]
 	blr	x2
-.LVL805:
-.LBE1896:
-.LBE1895:
+.LVL810:
+.LBE1894:
+.LBE1893:
 	.loc 1 196 0
 	ldr	x0, [x19]
 	adrp	x1, .LC84
 	add	x1, x1, :lo12:.LC84
 	bl	_dev_info
-.LVL806:
+.LVL811:
 	.loc 1 211 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
-.LVL807:
+.LVL812:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -9355,63 +9388,63 @@ ebc_power_set.constprop.17:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL808:
+.LVL813:
 	.p2align 3
-.L803:
+.L813:
 	.cfi_restore_state
 	.loc 1 190 0
 	mov	w0, 1
 	str	w0, [x20, 440]
-.LBB1897:
-.LBB1898:
+.LBB1895:
+.LBB1896:
 	.loc 4 58 0
 	add	x0, x19, 416
 	bl	__pm_stay_awake
-.LVL809:
-	b	.L801
-.LBE1898:
-.LBE1897:
+.LVL814:
+	b	.L811
+.LBE1896:
+.LBE1895:
 	.cfi_endproc
-.LFE2887:
+.LFE2886:
 	.size	ebc_power_set.constprop.17, .-ebc_power_set.constprop.17
 	.align	2
 	.p2align 3,,7
 	.type	ebc_open, %function
 ebc_open:
-.LFB2886:
+.LFB2885:
 	.cfi_startproc
 	mov	w0, 0
 	str	xzr, [x1, 104]
 	ret
 	.cfi_endproc
-.LFE2886:
+.LFE2885:
 	.size	ebc_open, .-ebc_open
 	.align	2
 	.p2align 3,,7
 	.global	refresh_new_image2
 	.type	refresh_new_image2, %function
 refresh_new_image2:
-.LFB2810:
+.LFB2809:
 	.loc 1 216 0
 	.cfi_startproc
-.LVL810:
+.LVL815:
 	.loc 1 223 0
 	ldp	w16, w5, [x4, 68]
-.LVL811:
+.LVL816:
 	cmp	w5, 0
 	add	w11, w5, 7
 	csel	w11, w11, w5, lt
-.LVL812:
+.LVL817:
 	.loc 1 225 0
 	cmp	w16, 0
 	.loc 1 223 0
 	asr	w11, w11, 3
-.LVL813:
+.LVL818:
 	.loc 1 225 0
-	ble	.L805
+	ble	.L815
 	sub	w14, w11, #1
 	mov	w15, 0
-.LVL814:
+.LVL819:
 	add	x14, x14, 1
 	.loc 1 270 0
 	mov	w13, 234881024
@@ -9419,92 +9452,92 @@ refresh_new_image2:
 	lsl	x14, x14, 2
 	.loc 1 276 0
 	mov	w12, -536870912
-.LVL815:
+.LVL820:
 	.p2align 2
-.L807:
+.L817:
 	.loc 1 226 0 discriminator 1
 	mov	x6, 0
 	cmp	w11, 0
-	bgt	.L828
-	b	.L825
-.LVL816:
+	bgt	.L838
+	b	.L835
+.LVL821:
 	.p2align 3
-.L808:
+.L818:
 	.loc 1 239 0
 	tst	x5, 65280
-	bne	.L809
+	bne	.L819
 	.loc 1 240 0
 	and	w10, w4, 240
 	cmp	w10, 224
-	beq	.L830
+	beq	.L840
 	.loc 1 243 0
 	orr	w7, w7, 240
-.L809:
+.L819:
 	.loc 1 245 0
 	tst	x5, 16711680
-	bne	.L811
+	bne	.L821
 	.loc 1 246 0
 	and	w10, w4, 3840
 	cmp	w10, 3584
-	beq	.L831
+	beq	.L841
 	.loc 1 249 0
 	orr	w7, w7, 3840
-.L811:
+.L821:
 	.loc 1 251 0
 	tst	x5, 4278190080
-	bne	.L813
+	bne	.L823
 	.loc 1 252 0
 	and	w10, w4, 61440
 	cmp	w10, 57344
-	beq	.L832
+	beq	.L842
 	.loc 1 255 0
 	orr	w7, w7, 61440
-.L813:
+.L823:
 	.loc 1 257 0
 	tst	x5, 1095216660480
-	bne	.L815
+	bne	.L825
 	.loc 1 258 0
 	and	w10, w4, 983040
 	cmp	w10, 917504
-	beq	.L833
+	beq	.L843
 	.loc 1 261 0
 	orr	w7, w7, 983040
-.L815:
+.L825:
 	.loc 1 263 0
 	tst	x5, 280375465082880
-	bne	.L817
+	bne	.L827
 	.loc 1 264 0
 	and	w10, w4, 15728640
 	cmp	w10, 14680064
-	beq	.L834
+	beq	.L844
 	.loc 1 267 0
 	orr	w7, w7, 15728640
-.L817:
+.L827:
 	.loc 1 269 0
 	tst	x5, 71776119061217280
-	bne	.L819
+	bne	.L829
 	.loc 1 270 0
 	and	w10, w4, 251658240
 	cmp	w10, w13
-	beq	.L835
+	beq	.L845
 	.loc 1 273 0
 	orr	w7, w7, 251658240
-.L819:
+.L829:
 	.loc 1 275 0
 	tst	x5, -72057594037927936
-	bne	.L821
+	bne	.L831
 	.loc 1 276 0
 	and	w5, w4, -268435456
-.LVL817:
+.LVL822:
 	cmp	w5, w12
-	beq	.L836
+	beq	.L846
 	.loc 1 279 0
 	orr	w7, w7, -268435456
-.LVL818:
-.L821:
+.LVL823:
+.L831:
 	.loc 1 283 0 discriminator 2
 	and	w4, w4, w9
-.LVL819:
+.LVL824:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
@@ -9513,54 +9546,54 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 226 0 discriminator 2
 	cmp	w11, w6
-	ble	.L837
-.LVL820:
-.L828:
+	ble	.L847
+.LVL825:
+.L838:
 	.loc 1 227 0
 	ldr	x5, [x3, x6, lsl 3]
 	.loc 1 231 0
 	mov	w7, 0
 	.loc 1 228 0
 	ldr	w4, [x1, x6, lsl 2]
-.LVL821:
+.LVL826:
 	.loc 1 229 0
 	ldr	w8, [x0, x6, lsl 2]
 	.loc 1 233 0
 	and	x10, x5, 255
 	.loc 1 230 0
 	ldr	w9, [x2, x6, lsl 2]
-.LVL822:
+.LVL827:
 	.loc 1 233 0
-	cbnz	x10, .L808
-.LVL823:
+	cbnz	x10, .L818
+.LVL828:
 	.loc 1 234 0
 	and	w10, w4, 15
 	.loc 1 237 0
 	mov	w7, 15
 	.loc 1 234 0
 	cmp	w10, 14
-	bne	.L808
+	bne	.L818
 	.loc 1 235 0
 	orr	w8, w8, w7
-.LVL824:
+.LVL829:
 	.loc 1 231 0
 	mov	w7, 0
-.LVL825:
-	b	.L808
+.LVL830:
+	b	.L818
 	.p2align 3
-.L835:
+.L845:
 	.loc 1 271 0
 	orr	w8, w8, 251658240
-	b	.L819
-.LVL826:
+	b	.L829
+.LVL831:
 	.p2align 3
-.L836:
+.L846:
 	.loc 1 277 0
 	orr	w8, w8, -268435456
-.LVL827:
+.LVL832:
 	.loc 1 283 0
 	and	w4, w4, w9
-.LVL828:
+.LVL833:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
@@ -9569,101 +9602,101 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 226 0
 	cmp	w11, w6
-	bgt	.L828
-.LVL829:
+	bgt	.L838
+.LVL834:
 	.p2align 2
-.L837:
+.L847:
 	add	x3, x3, x17
 	add	x1, x1, x14
 	add	x2, x2, x14
 	add	x0, x0, x14
-.LVL830:
-.L825:
+.LVL835:
+.L835:
 	.loc 1 225 0 discriminator 2
 	add	w15, w15, 1
 	cmp	w16, w15
-	bne	.L807
-.L805:
+	bne	.L817
+.L815:
 	ret
-.LVL831:
+.LVL836:
 	.p2align 3
-.L831:
+.L841:
 	.loc 1 247 0
 	orr	w8, w8, 3840
-	b	.L811
+	b	.L821
 	.p2align 3
-.L832:
+.L842:
 	.loc 1 253 0
 	orr	w8, w8, 61440
-	b	.L813
+	b	.L823
 	.p2align 3
-.L833:
+.L843:
 	.loc 1 259 0
 	orr	w8, w8, 983040
-	b	.L815
+	b	.L825
 	.p2align 3
-.L834:
+.L844:
 	.loc 1 265 0
 	orr	w8, w8, 15728640
-	b	.L817
+	b	.L827
 	.p2align 3
-.L830:
+.L840:
 	.loc 1 241 0
 	orr	w8, w8, 240
-	b	.L809
+	b	.L819
 	.cfi_endproc
-.LFE2810:
+.LFE2809:
 	.size	refresh_new_image2, .-refresh_new_image2
 	.align	2
 	.p2align 3,,7
 	.global	refresh_new_image_auto_32
 	.type	refresh_new_image_auto_32, %function
 refresh_new_image_auto_32:
-.LFB2811:
+.LFB2810:
 	.loc 1 291 0
 	.cfi_startproc
-.LVL832:
+.LVL837:
 	.loc 1 298 0
 	ldp	w14, w4, [x3, 68]
 	cmp	w4, 0
 	add	w10, w4, 7
 	csel	w10, w10, w4, lt
-.LVL833:
+.LVL838:
 	.loc 1 300 0
 	cmp	w14, 0
 	.loc 1 298 0
 	asr	w10, w10, 3
-.LVL834:
+.LVL839:
 	.loc 1 300 0
-	ble	.L838
+	ble	.L848
 	sub	w13, w10, #1
 	mov	w11, 0
-.LVL835:
+.LVL840:
 	add	x13, x13, 1
 	lsl	x12, x13, 3
 	lsl	x13, x13, 2
-.LVL836:
+.LVL841:
 	.p2align 2
-.L840:
+.L850:
 	.loc 1 301 0 discriminator 1
 	mov	x8, x1
 	mov	x6, 0
 	cmp	w10, 0
-	bgt	.L853
-	b	.L851
-.LVL837:
+	bgt	.L863
+	b	.L861
+.LVL842:
 	.p2align 3
-.L856:
+.L866:
 	.loc 1 310 0
 	ubfx	x3, x7, 4, 4
-.LVL838:
+.LVL843:
 	.loc 1 309 0
 	mov	w4, 15
-.LVL839:
-.L841:
+.LVL844:
+.L851:
 	.loc 1 312 0
 	tst	x5, 65280
-	bne	.L842
+	bne	.L852
 	.loc 1 314 0
 	lsr	w9, w7, 8
 	.loc 1 313 0
@@ -9671,10 +9704,10 @@ refresh_new_image_auto_32:
 	.loc 1 314 0
 	and	w9, w9, 240
 	orr	w3, w3, w9
-.L842:
+.L852:
 	.loc 1 316 0
 	tst	x5, 16711680
-	bne	.L843
+	bne	.L853
 	.loc 1 318 0
 	lsr	w9, w7, 12
 	.loc 1 317 0
@@ -9682,10 +9715,10 @@ refresh_new_image_auto_32:
 	.loc 1 318 0
 	and	w9, w9, 3840
 	orr	w3, w3, w9
-.L843:
+.L853:
 	.loc 1 320 0
 	tst	x5, 4278190080
-	bne	.L844
+	bne	.L854
 	.loc 1 322 0
 	lsr	w7, w7, 16
 	.loc 1 321 0
@@ -9693,14 +9726,14 @@ refresh_new_image_auto_32:
 	.loc 1 322 0
 	and	w7, w7, 61440
 	orr	w3, w3, w7
-.L844:
+.L854:
 	add	x8, x8, 8
 	.loc 1 325 0
 	tst	x5, 1095216660480
 	.loc 1 324 0
 	ldr	w7, [x8, -4]
 	.loc 1 325 0
-	bne	.L845
+	bne	.L855
 	.loc 1 327 0
 	lsl	w9, w7, 12
 	.loc 1 326 0
@@ -9708,10 +9741,10 @@ refresh_new_image_auto_32:
 	.loc 1 327 0
 	and	w9, w9, 983040
 	orr	w3, w3, w9
-.L845:
+.L855:
 	.loc 1 329 0
 	tst	x5, 280375465082880
-	bne	.L846
+	bne	.L856
 	.loc 1 331 0
 	lsl	w9, w7, 8
 	.loc 1 330 0
@@ -9719,10 +9752,10 @@ refresh_new_image_auto_32:
 	.loc 1 331 0
 	and	w9, w9, 15728640
 	orr	w3, w3, w9
-.L846:
+.L856:
 	.loc 1 334 0
 	tst	x5, 71776119061217280
-	bne	.L847
+	bne	.L857
 	.loc 1 336 0
 	lsl	w9, w7, 4
 	.loc 1 335 0
@@ -9730,121 +9763,121 @@ refresh_new_image_auto_32:
 	.loc 1 336 0
 	and	w9, w9, 251658240
 	orr	w3, w3, w9
-.L847:
+.L857:
 	.loc 1 338 0
 	tst	x5, -72057594037927936
-	bne	.L848
+	bne	.L858
 	.loc 1 340 0
 	and	w7, w7, -268435456
 	.loc 1 339 0
 	orr	w4, w4, -268435456
 	.loc 1 340 0
 	orr	w3, w3, w7
-.L848:
+.L858:
 	.loc 1 342 0 discriminator 2
 	bic	w4, w15, w4
-.LVL840:
+.LVL845:
 	.loc 1 343 0 discriminator 2
 	orr	w3, w3, w4
-.LVL841:
+.LVL846:
 	.loc 1 344 0 discriminator 2
 	str	w3, [x0, x6, lsl 2]
 	add	x6, x6, 1
 	.loc 1 301 0 discriminator 2
 	cmp	w10, w6
-	ble	.L855
-.LVL842:
-.L853:
+	ble	.L865
+.LVL847:
+.L863:
 	.loc 1 302 0
 	ldr	x5, [x2, x6, lsl 3]
 	.loc 1 304 0
 	ldr	w15, [x0, x6, lsl 2]
 	.loc 1 308 0
 	and	x3, x5, 255
-.LVL843:
+.LVL848:
 	.loc 1 303 0
 	ldr	w7, [x8]
 	.loc 1 308 0
-	cbz	x3, .L856
+	cbz	x3, .L866
 	.loc 1 305 0
 	mov	w4, 0
-.LVL844:
+.LVL849:
 	.loc 1 306 0
 	mov	w3, 0
-.LVL845:
-	b	.L841
-.LVL846:
+.LVL850:
+	b	.L851
+.LVL851:
 	.p2align 3
-.L855:
+.L865:
 	add	x2, x2, x12
 	add	x1, x1, x12
-.LVL847:
+.LVL852:
 	add	x0, x0, x13
-.LVL848:
-.L851:
+.LVL853:
+.L861:
 	.loc 1 300 0 discriminator 2
 	add	w11, w11, 1
 	cmp	w14, w11
-	bne	.L840
-.L838:
+	bne	.L850
+.L848:
 	ret
 	.cfi_endproc
-.LFE2811:
+.LFE2810:
 	.size	refresh_new_image_auto_32, .-refresh_new_image_auto_32
 	.align	2
 	.p2align 3,,7
 	.global	refresh_new_image_auto
 	.type	refresh_new_image_auto, %function
 refresh_new_image_auto:
-.LFB2812:
+.LFB2811:
 	.loc 1 351 0
 	.cfi_startproc
-.LVL849:
+.LVL854:
 	.loc 1 358 0
 	ldp	w13, w4, [x3, 68]
 	cmp	w4, 0
 	add	w9, w4, 7
 	csel	w9, w9, w4, lt
-.LVL850:
+.LVL855:
 	.loc 1 360 0
 	cmp	w13, 0
 	.loc 1 358 0
 	asr	w9, w9, 3
-.LVL851:
+.LVL856:
 	.loc 1 360 0
-	ble	.L857
+	ble	.L867
 	sub	w12, w9, #1
 	mov	w11, 0
-.LVL852:
+.LVL857:
 	add	x12, x12, 1
 	.loc 1 368 0
 	mov	w10, 15
 	lsl	x14, x12, 3
 	lsl	x12, x12, 2
 	.p2align 2
-.L859:
+.L869:
 	.loc 1 361 0 discriminator 1
 	mov	x6, 0
 	cmp	w9, 0
-	ble	.L870
+	ble	.L880
 	.p2align 2
-.L872:
+.L882:
 	.loc 1 362 0
 	ldr	x4, [x2, x6, lsl 3]
-.LVL853:
+.LVL858:
 	.loc 1 364 0
 	ldr	w7, [x0, x6, lsl 2]
 	.loc 1 363 0
 	ldr	w3, [x1, x6, lsl 2]
-.LVL854:
+.LVL859:
 	.loc 1 367 0
 	and	x5, x4, 255
 	.loc 1 368 0
 	cmp	x5, 0
-.LVL855:
+.LVL860:
 	eor	w5, w3, w7
 	csel	w3, wzr, w10, ne
-.LVL856:
+.LVL861:
 	.loc 1 371 0
 	orr	w8, w3, 240
 	tst	x4, 65280
@@ -9872,10 +9905,10 @@ refresh_new_image_auto:
 	.loc 1 389 0
 	tst	x4, -72057594037927936
 	orr	w4, w3, -268435456
-.LVL857:
+.LVL862:
 	csel	w3, w4, w3, eq
 	and	w3, w5, w3
-.LVL858:
+.LVL863:
 	.loc 1 392 0
 	eor	w3, w3, w7
 	.loc 1 393 0
@@ -9883,30 +9916,30 @@ refresh_new_image_auto:
 	add	x6, x6, 1
 	.loc 1 361 0
 	cmp	w9, w6
-	bgt	.L872
+	bgt	.L882
 	add	x2, x2, x14
 	add	x1, x1, x12
 	add	x0, x0, x12
-.LVL859:
-.L870:
+.LVL864:
+.L880:
 	.loc 1 360 0 discriminator 2
 	add	w11, w11, 1
 	cmp	w13, w11
-	bne	.L859
-.L857:
+	bne	.L869
+.L867:
 	ret
 	.cfi_endproc
-.LFE2812:
+.LFE2811:
 	.size	refresh_new_image_auto, .-refresh_new_image_auto
 	.align	2
 	.p2align 3,,7
 	.global	new_buffer_refresh
 	.type	new_buffer_refresh, %function
 new_buffer_refresh:
-.LFB2813:
+.LFB2812:
 	.loc 1 399 0
 	.cfi_startproc
-.LVL860:
+.LVL865:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -9923,16 +9956,16 @@ new_buffer_refresh:
 	adrp	x20, .LANCHOR1
 	.loc 1 400 0
 	ldr	x19, [x1, #:lo12:.LANCHOR0]
-.LVL861:
+.LVL866:
 	.loc 1 403 0
 	add	x0, x20, :lo12:.LANCHOR1
-.LVL862:
+.LVL867:
 	add	x0, x0, 680
 	bl	down_write
-.LVL863:
+.LVL868:
 	.loc 1 401 0
 	add	x19, x19, 184
-.LVL864:
+.LVL869:
 	.loc 1 404 0
 	ldr	x0, [x19, 224]
 	ldr	w5, [x0, 40]
@@ -9941,22 +9974,22 @@ new_buffer_refresh:
 	.loc 1 406 0
 	cmp	w5, 0
 	ccmp	w1, 1, 0, ne
-	bls	.L879
+	bls	.L889
 	.loc 1 418 0
 	ldr	x1, [x0, 16]
 	mov	x4, x19
 	ldp	x2, x3, [x19, 160]
 	ldr	x0, [x19, 144]
 	bl	refresh_new_image2
-.LVL865:
+.LVL870:
 	.loc 1 424 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 680
 	bl	up_write
-.LVL866:
+.LVL871:
 	.loc 1 425 0
 	ldp	x19, x20, [sp, 16]
-.LVL867:
+.LVL872:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -9965,9 +9998,9 @@ new_buffer_refresh:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL868:
+.LVL873:
 	.p2align 3
-.L879:
+.L889:
 	.cfi_restore_state
 	.loc 1 407 0
 	ldr	w1, [x0, 64]
@@ -9980,18 +10013,18 @@ new_buffer_refresh:
 	ldr	x1, [x0, 16]
 	ldr	x0, [x19, 144]
 	.loc 1 407 0
-	beq	.L880
+	beq	.L890
 	.loc 1 413 0
 	bl	refresh_new_image_auto
-.LVL869:
+.LVL874:
 	.loc 1 424 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 680
 	bl	up_write
-.LVL870:
+.LVL875:
 	.loc 1 425 0
 	ldp	x19, x20, [sp, 16]
-.LVL871:
+.LVL876:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 20
@@ -10000,21 +10033,21 @@ new_buffer_refresh:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL872:
+.LVL877:
 	.p2align 3
-.L880:
+.L890:
 	.cfi_restore_state
 	.loc 1 408 0
 	bl	refresh_new_image_auto_32
-.LVL873:
+.LVL878:
 	.loc 1 424 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 680
 	bl	up_write
-.LVL874:
+.LVL879:
 	.loc 1 425 0
 	ldp	x19, x20, [sp, 16]
-.LVL875:
+.LVL880:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -10023,16 +10056,16 @@ new_buffer_refresh:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2813:
+.LFE2812:
 	.size	new_buffer_refresh, .-new_buffer_refresh
 	.align	2
 	.p2align 3,,7
 	.type	ebc_auto_tast_function, %function
 ebc_auto_tast_function:
-.LFB2832:
+.LFB2831:
 	.loc 1 1581 0
 	.cfi_startproc
-.LVL876:
+.LVL881:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
@@ -10041,7 +10074,7 @@ ebc_auto_tast_function:
 	adrp	x1, .LANCHOR0
 	.loc 1 1581 0
 	adrp	x0, __stack_chk_guard
-.LVL877:
+.LVL882:
 	add	x0, x0, :lo12:__stack_chk_guard
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -10056,21 +10089,21 @@ ebc_auto_tast_function:
 	.cfi_offset 22, -56
 	.loc 1 1582 0
 	ldr	x22, [x1, #:lo12:.LANCHOR0]
-.LVL878:
+.LVL883:
 	.loc 1 1587 0
 	add	x20, x20, 728
 	.loc 1 1581 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
+.LBB1897:
+.LBB1898:
 .LBB1899:
-.LBB1900:
-.LBB1901:
 	.loc 14 288 0
 	mov	x24, 2
-.LBE1901:
-.LBE1900:
 .LBE1899:
+.LBE1898:
+.LBE1897:
 	.loc 1 1581 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -32
@@ -10087,42 +10120,42 @@ ebc_auto_tast_function:
 	add	x25, x22, 744
 	.loc 1 1647 0
 	add	x26, x26, :lo12:.LC85
-.LBB1906:
-.LBB1903:
 .LBB1904:
+.LBB1901:
+.LBB1902:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x23, sp_el0
 // 0 "" 2
-.LVL879:
+.LVL884:
 #NO_APP
-	b	.L893
+	b	.L903
 	.p2align 3
-.L890:
+.L900:
+.LBE1902:
+.LBE1901:
 .LBE1904:
-.LBE1903:
-.LBE1906:
 	.loc 1 1667 0
 	mov	x0, x20
 	bl	up
-.LVL880:
+.LVL885:
 	.loc 1 1668 0
 	bl	schedule
-.LVL881:
-.L893:
+.LVL886:
+.L903:
 	.loc 1 1587 0
 	mov	x0, x20
 	bl	down
-.LVL882:
-.LBB1907:
+.LVL887:
 .LBB1905:
-.LBB1902:
+.LBB1903:
+.LBB1900:
 	.loc 14 288 0
 	str	x24, [x23, 32]
-.LBE1902:
+.LBE1900:
+.LBE1903:
 .LBE1905:
-.LBE1907:
 	.loc 1 1591 0
 #APP
 // 1591 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
@@ -10133,17 +10166,17 @@ ebc_auto_tast_function:
 	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 16
-	bgt	.L883
+	bgt	.L893
 	cmp	w0, 7
-	bge	.L884
-	cbz	w0, .L885
+	bge	.L894
+	cbz	w0, .L895
 	cmp	w0, 1
-	bne	.L882
+	bne	.L892
 	.loc 1 1594 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
 	bl	flip.isra.11
-.LVL883:
+.LVL888:
 	.loc 1 1595 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
@@ -10152,8 +10185,8 @@ ebc_auto_tast_function:
 	ldr	x3, [x19, 168]
 	ldr	x0, [x0, 184]
 	bl	get_overlay_image
-.LVL884:
-.L887:
+.LVL889:
+.L897:
 	.loc 1 1642 0
 	ldr	x0, [x19, 224]
 	.loc 1 1643 0
@@ -10162,24 +10195,24 @@ ebc_auto_tast_function:
 	.loc 1 1645 0
 	cmp	w1, 1
 	ccmp	w0, 1, 0, hi
-	bhi	.L890
+	bhi	.L900
 	.loc 1 1646 0
 	ldr	w0, [x19, 52]
-	cbz	w0, .L905
-.LBB1908:
-.LBB1909:
+	cbz	w0, .L915
+.LBB1906:
+.LBB1907:
 	.file 18 "./include/linux/workqueue.h"
 	.loc 18 518 0
 	ldr	x1, [x19, 608]
 	mov	x2, x25
 	mov	w0, 8
 	bl	queue_work_on
-.LVL885:
-	b	.L890
+.LVL890:
+	b	.L900
 	.p2align 3
-.L882:
-.LBE1909:
-.LBE1908:
+.L892:
+.LBE1907:
+.LBE1906:
 	.loc 1 1631 0
 	ldr	w1, [x19, 56]
 	.loc 1 1632 0
@@ -10190,10 +10223,10 @@ ebc_auto_tast_function:
 	.loc 1 1632 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.11
-.LVL886:
+.LVL891:
 	.loc 1 1633 0
 	ldr	w0, [x19, 56]
-	cbz	w0, .L887
+	cbz	w0, .L897
 	.loc 1 1635 0
 	ldrsw	x0, [x21, 72]
 	mov	x3, x19
@@ -10205,10 +10238,10 @@ ebc_auto_tast_function:
 	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
-.LVL887:
-	b	.L887
+.LVL892:
+	b	.L897
 	.p2align 3
-.L884:
+.L894:
 	.loc 1 1621 0
 	ldr	w1, [x19, 56]
 	.loc 1 1622 0
@@ -10219,10 +10252,10 @@ ebc_auto_tast_function:
 	.loc 1 1622 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.11
-.LVL888:
+.LVL893:
 	.loc 1 1623 0
 	ldr	w0, [x19, 56]
-	cbz	w0, .L887
+	cbz	w0, .L897
 	.loc 1 1625 0
 	ldrsw	x0, [x21, 72]
 	mov	x3, x19
@@ -10234,21 +10267,21 @@ ebc_auto_tast_function:
 	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part
-.LVL889:
+.LVL894:
 	.loc 1 1629 0
-	b	.L887
+	b	.L897
 	.p2align 3
-.L883:
+.L893:
 	.loc 1 1592 0
 	sub	w0, w0, #22
 	cmp	w0, 1
-	bhi	.L882
-.L885:
+	bhi	.L892
+.L895:
 	.loc 1 1604 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
 	bl	flip.isra.11
-.LVL890:
+.LVL895:
 	.loc 1 1605 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
@@ -10257,18 +10290,18 @@ ebc_auto_tast_function:
 	ldr	x3, [x19, 168]
 	ldr	x0, [x0, 184]
 	bl	get_auto_image
-.LVL891:
+.LVL896:
 	.loc 1 1610 0
-	b	.L887
-.L905:
+	b	.L897
+.L915:
 	.loc 1 1647 0
 	mov	x0, x26
 	bl	printk
-.LVL892:
+.LVL897:
 	.loc 1 1648 0
 	mov	x0, x25
 	bl	new_buffer_refresh
-.LVL893:
+.LVL898:
 	.loc 1 1649 0
 	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
@@ -10276,7 +10309,7 @@ ebc_auto_tast_function:
 	.loc 1 1650 0
 	ldrsw	x0, [x21, 72]
 	.loc 1 1649 0
-	beq	.L906
+	beq	.L916
 	.loc 1 1656 0
 	add	x0, x19, x0, lsl 3
 	ldr	x3, [x19, 168]
@@ -10284,9 +10317,9 @@ ebc_auto_tast_function:
 	mov	x4, x19
 	ldr	x0, [x0, 184]
 	bl	get_auto_image
-.LVL894:
-	b	.L890
-.L906:
+.LVL899:
+	b	.L900
+.L916:
 	.loc 1 1650 0
 	add	x0, x19, x0, lsl 3
 	ldr	x3, [x19, 168]
@@ -10294,19 +10327,19 @@ ebc_auto_tast_function:
 	mov	x4, x19
 	ldr	x0, [x0, 184]
 	bl	get_overlay_image
-.LVL895:
-	b	.L890
+.LVL900:
+	b	.L900
 	.cfi_endproc
-.LFE2832:
+.LFE2831:
 	.size	ebc_auto_tast_function, .-ebc_auto_tast_function
 	.align	2
 	.p2align 3,,7
 	.type	ebc_thread, %function
 ebc_thread:
-.LFB2838:
+.LFB2837:
 	.loc 1 1895 0
 	.cfi_startproc
-.LVL896:
+.LVL901:
 	stp	x29, x30, [sp, -240]!
 	.cfi_def_cfa_offset 240
 	.cfi_offset 29, -240
@@ -10327,14 +10360,14 @@ ebc_thread:
 	.cfi_offset 24, -184
 	adrp	x24, __stack_chk_guard
 	stp	x27, x28, [sp, 80]
+.LBB1942:
+.LBB1943:
 .LBB1944:
-.LBB1945:
-.LBB1946:
 	.loc 1 2221 0
 	adrp	x23, .LANCHOR1
-.LBE1946:
-.LBE1945:
 .LBE1944:
+.LBE1943:
+.LBE1942:
 	.loc 1 1895 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 27, -160
@@ -10343,136 +10376,136 @@ ebc_thread:
 	.cfi_offset 26, -168
 	.loc 1 1895 0
 	add	x0, x24, :lo12:__stack_chk_guard
-.LVL897:
+.LVL902:
 	.loc 1 1896 0
 	ldr	x20, [x22, #:lo12:.LANCHOR0]
-.LVL898:
-.LBB1955:
-.LBB1952:
-.LBB1949:
+.LVL903:
+.LBB1953:
+.LBB1950:
+.LBB1947:
 	.loc 1 2221 0
 	add	x23, x23, :lo12:.LANCHOR1
-.LBE1949:
-.LBE1952:
-.LBE1955:
+.LBE1947:
+.LBE1950:
+.LBE1953:
 	.loc 1 1895 0
 	ldr	x1, [x0]
 	str	x1, [x29, 232]
 	mov	x1,0
-.LBB1956:
-.LBB1953:
-.LBB1950:
+.LBB1954:
+.LBB1951:
+.LBB1948:
 	.loc 1 2221 0
 	add	x19, x23, 304
-.LBE1950:
-.LBE1953:
-.LBE1956:
+.LBE1948:
+.LBE1951:
+.LBE1954:
 	.loc 1 1897 0
 	add	x28, x20, 184
 	.loc 1 1900 0
 	str	wzr, [x29, 108]
-.LVL899:
+.LVL904:
 	.p2align 2
-.L908:
+.L918:
 	.loc 1 1905 0
 	ldr	w0, [x28, 624]
-	cbnz	w0, .L1085
-.L909:
+	cbnz	w0, .L1095
+.L919:
 	.loc 1 1911 0
 	bl	ebc_dsp_buf_get
-.LVL900:
+.LVL905:
 	mov	x26, x0
 	.loc 1 1913 0
-	cbz	x0, .L911
+	cbz	x0, .L921
 	.loc 1 1913 0 is_stmt 0 discriminator 1
 	ldr	x1, [x0, 8]
-	cbz	x1, .L911
+	cbz	x1, .L921
 	.loc 1 1914 0 is_stmt 1
 	ldr	w1, [x0, 40]
 	sub	w2, w1, #18
 	tst	w2, -3
-	bne	.L912
+	bne	.L922
 	.loc 1 1916 0
 	add	x0, x22, :lo12:.LANCHOR0
 	.loc 1 1915 0
 	str	wzr, [x28, 632]
 	.loc 1 1916 0
 	str	wzr, [x0, 16]
-.L913:
+.L923:
 	.loc 1 1979 0
 	adrp	x21, jiffies
-.LVL901:
+.LVL906:
 	mov	x1, 402653184
 	add	x0, x20, 632
 	ldr	x2, [x21, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL902:
+.LVL907:
 	.loc 1 1981 0
 	ldr	w0, [x28, 444]
-	cbz	w0, .L927
+	cbz	w0, .L937
 	ldr	x0, [x28, 216]
-.L928:
+.L938:
 	.loc 1 1984 0
 	ldr	w2, [x0, 40]
 	ldr	w3, [x26, 40]
 	cmp	w3, w2
-	beq	.L929
+	beq	.L939
 	.loc 1 1985 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC88
 	add	x1, x1, :lo12:.LC88
 	bl	_dev_info
-.LVL903:
+.LVL908:
 	.loc 1 1987 0
 	ldr	w0, [x28, 44]
 	cmp	w0, 1
-	beq	.L1086
-.L1079:
+	beq	.L1096
+.L1089:
 	ldr	w2, [x26, 40]
-.L929:
+.L939:
 	.loc 1 1994 0
 	cmp	w2, 23
-	bls	.L1087
+	bls	.L1097
 	.loc 1 2180 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC96
 	add	x1, x1, :lo12:.LC96
 	bl	_dev_err
-.LVL904:
+.LVL909:
 	.loc 1 2181 0
 	mov	x0, x26
 	bl	ebc_remove_from_dsp_buf_list
-.LVL905:
+.LVL910:
 	.loc 1 2182 0
 	mov	x0, x26
 	bl	ebc_buf_release
-.LVL906:
+.LVL911:
 	.loc 1 1905 0
 	ldr	w0, [x28, 624]
-	cbz	w0, .L909
-.LVL907:
+	cbz	w0, .L919
+.LVL912:
 	.p2align 2
-.L1085:
+.L1095:
 	.loc 1 1906 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	beq	.L1088
-.L910:
+	beq	.L1098
+.L920:
 	.loc 1 2252 0
 	add	x24, x24, :lo12:__stack_chk_guard
 	mov	w0, 0
 	ldr	x2, [x29, 232]
 	ldr	x1, [x24]
 	eor	x1, x2, x1
-	cbnz	x1, .L1089
+	cbnz	x1, .L1099
 	ldp	x19, x20, [sp, 16]
-.LVL908:
+.LVL913:
 	ldp	x21, x22, [sp, 32]
-.LVL909:
+.LVL914:
 	ldp	x23, x24, [sp, 48]
 	ldp	x25, x26, [sp, 64]
-.LVL910:
+.LVL915:
 	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 240
 	.cfi_remember_state
@@ -10490,109 +10523,109 @@ ebc_thread:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL911:
+.LVL916:
 	.p2align 3
-.L911:
+.L921:
 	.cfi_restore_state
 	.loc 1 2220 0
 	ldr	w0, [x28, 96]
-.LVL912:
-	cbz	w0, .L1090
+.LVL917:
+	cbz	w0, .L1100
 	.loc 1 2225 0
 	str	wzr, [x28, 96]
 	.loc 1 2226 0
-	b	.L908
-.LVL913:
+	b	.L918
+.LVL918:
 	.p2align 3
-.L912:
+.L922:
 	.loc 1 1918 0
 	add	x21, x22, :lo12:.LANCHOR0
-.LVL914:
+.LVL919:
 	ldr	w2, [x21, 16]
-	cbz	w2, .L914
+	cbz	w2, .L924
 	.loc 1 1919 0
 	ldr	w0, [x21, 20]
-.LVL915:
+.LVL920:
 	cmp	w0, 5
 	add	w0, w0, 1
 	str	w0, [x21, 20]
-	ble	.L915
+	ble	.L925
 	.loc 1 1920 0
 	str	wzr, [x21, 16]
-.L915:
+.L925:
 	.loc 1 1921 0
 	ldr	w2, [x20, 204]
 	ldr	w1, [x26, 64]
 	ldr	x0, [x26, 16]
 	bl	check_black_percent.isra.15
-.LVL916:
-	cbz	w0, .L913
-.L1077:
+.LVL921:
+	cbz	w0, .L923
+.L1087:
 	.loc 1 2001 0
 	mov	x0, x26
-.L1078:
+.L1088:
 	bl	ebc_remove_from_dsp_buf_list
-.LVL917:
+.LVL922:
 	.loc 1 2002 0
 	mov	x0, x26
 	bl	ebc_buf_release
-.LVL918:
+.LVL923:
 	.loc 1 2004 0
-	b	.L908
+	b	.L918
 	.p2align 3
-.L1087:
+.L1097:
 	.loc 1 1994 0
-	adrp	x0, .L937
-	add	x0, x0, :lo12:.L937
+	adrp	x0, .L947
+	add	x0, x0, :lo12:.L947
 	ldrh	w0, [x0,w2,uxtw #1]
-	adr	x1, .Lrtx937
+	adr	x1, .Lrtx947
 	add	x0, x1, w0, sxth #2
 	br	x0
-.Lrtx937:
+.Lrtx947:
 	.section	.rodata
 	.align	0
 	.align	2
-.L937:
-	.2byte	(.L936 - .Lrtx937) / 4
-	.2byte	(.L938 - .Lrtx937) / 4
-	.2byte	(.L1025 - .Lrtx937) / 4
-	.2byte	(.L1025 - .Lrtx937) / 4
-	.2byte	(.L1025 - .Lrtx937) / 4
-	.2byte	(.L1025 - .Lrtx937) / 4
-	.2byte	(.L1025 - .Lrtx937) / 4
-	.2byte	(.L940 - .Lrtx937) / 4
-	.2byte	(.L940 - .Lrtx937) / 4
-	.2byte	(.L1025 - .Lrtx937) / 4
-	.2byte	(.L1025 - .Lrtx937) / 4
-	.2byte	(.L940 - .Lrtx937) / 4
-	.2byte	(.L1025 - .Lrtx937) / 4
-	.2byte	(.L1025 - .Lrtx937) / 4
-	.2byte	(.L940 - .Lrtx937) / 4
-	.2byte	(.L940 - .Lrtx937) / 4
-	.2byte	(.L1025 - .Lrtx937) / 4
-	.2byte	(.L1025 - .Lrtx937) / 4
-	.2byte	(.L1025 - .Lrtx937) / 4
-	.2byte	(.L1025 - .Lrtx937) / 4
-	.2byte	(.L1025 - .Lrtx937) / 4
-	.2byte	(.L1025 - .Lrtx937) / 4
-	.2byte	(.L936 - .Lrtx937) / 4
-	.2byte	(.L936 - .Lrtx937) / 4
+.L947:
+	.2byte	(.L946 - .Lrtx947) / 4
+	.2byte	(.L948 - .Lrtx947) / 4
+	.2byte	(.L1035 - .Lrtx947) / 4
+	.2byte	(.L1035 - .Lrtx947) / 4
+	.2byte	(.L1035 - .Lrtx947) / 4
+	.2byte	(.L1035 - .Lrtx947) / 4
+	.2byte	(.L1035 - .Lrtx947) / 4
+	.2byte	(.L950 - .Lrtx947) / 4
+	.2byte	(.L950 - .Lrtx947) / 4
+	.2byte	(.L1035 - .Lrtx947) / 4
+	.2byte	(.L1035 - .Lrtx947) / 4
+	.2byte	(.L950 - .Lrtx947) / 4
+	.2byte	(.L1035 - .Lrtx947) / 4
+	.2byte	(.L1035 - .Lrtx947) / 4
+	.2byte	(.L950 - .Lrtx947) / 4
+	.2byte	(.L950 - .Lrtx947) / 4
+	.2byte	(.L1035 - .Lrtx947) / 4
+	.2byte	(.L1035 - .Lrtx947) / 4
+	.2byte	(.L1035 - .Lrtx947) / 4
+	.2byte	(.L1035 - .Lrtx947) / 4
+	.2byte	(.L1035 - .Lrtx947) / 4
+	.2byte	(.L1035 - .Lrtx947) / 4
+	.2byte	(.L946 - .Lrtx947) / 4
+	.2byte	(.L946 - .Lrtx947) / 4
 	.text
-.L1025:
+.L1035:
 	.loc 1 2106 0
 	mov	w4, 1
-.LVL919:
-.L939:
+.LVL924:
+.L949:
 	.loc 1 2113 0
 	ldr	x25, [x28, 216]
-.LVL920:
+.LVL925:
 	.loc 1 2115 0
 	ldr	w0, [x25, 40]
 	sub	w1, w0, #22
 	.loc 1 2117 0
 	cmp	w1, 1
 	ccmp	w0, 1, 0, hi
-	bhi	.L987
+	bhi	.L997
 	.loc 1 2120 0
 	add	x0, x29, 160
 	str	x0, [x28, 216]
@@ -10602,7 +10635,7 @@ ebc_thread:
 	.loc 1 2122 0
 	mov	w0, 16
 	str	w0, [x29, 224]
-.L987:
+.L997:
 	.loc 1 2124 0
 	str	wzr, [x28, 92]
 	.loc 1 2125 0
@@ -10612,93 +10645,93 @@ ebc_thread:
 	sub	w0, w0, #2
 	.loc 1 2127 0
 	cmp	w0, 14
-	bhi	.L988
+	bhi	.L998
 	.loc 1 2129 0
 	ldr	x1, [x28, 216]
 	ldr	w0, [x26, 64]
-.LBB1957:
-.LBB1958:
+.LBB1955:
+.LBB1956:
 	.loc 1 1858 0
 	ldr	w2, [x1, 64]
 	cmp	w0, w2
-	beq	.L1091
-.L988:
-.LBE1958:
-.LBE1957:
+	beq	.L1101
+.L998:
+.LBE1956:
+.LBE1955:
 	.loc 1 2138 0
-	cbnz	w4, .L1029
+	cbnz	w4, .L1039
 	.loc 1 2142 0
 	ldr	w0, [x28, 64]
 	cmp	w0, 0
-	ble	.L994
+	ble	.L1004
 	.loc 1 2143 0
 	ldr	w1, [x29, 108]
-.LVL921:
+.LVL926:
 	add	w1, w1, 1
 	str	w1, [x29, 108]
 	.loc 1 2144 0
 	cmp	w0, w1
-	bgt	.L994
+	bgt	.L1004
 	.loc 1 2145 0
 	mov	w0, 2
 	.loc 1 2146 0
 	str	wzr, [x29, 108]
 	.loc 1 2145 0
 	str	w0, [x26, 40]
-.L994:
+.L1004:
 	.loc 1 2150 0
 	ldr	w0, [x28, 200]
-	cbz	w0, .L1092
-.L995:
+	cbz	w0, .L1102
+.L1005:
 	.loc 1 2153 0
 	ldr	x1, [x28, 224]
-.LVL922:
+.LVL927:
 	mov	x0, x20
 	ldr	w1, [x1, 64]
 	bl	ebc_lut_update
-.LVL923:
-	cbz	w0, .L996
+.LVL928:
+	cbz	w0, .L1006
 	.loc 1 2154 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC93
 	add	x1, x1, :lo12:.LC93
 	bl	_dev_err
-.LVL924:
+.LVL929:
 	.loc 1 2156 0
 	str	x25, [x28, 216]
-.LVL925:
-.L952:
+.LVL930:
+.L962:
 	.loc 1 2191 0
 	ldr	x0, [x28, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
-	beq	.L1093
-.L1001:
+	beq	.L1103
+.L1011:
 	.loc 1 2197 0
 	cmp	w0, 18
-	beq	.L1094
-.L1002:
+	beq	.L1104
+.L1012:
 	.loc 1 2208 0
 	mov	x0, x26
 	bl	ebc_remove_from_dsp_buf_list
-.LVL926:
+.LVL931:
 	.loc 1 2210 0
 	ldr	w0, [x28, 444]
-	cbnz	w0, .L1095
+	cbnz	w0, .L1105
 	.loc 1 2213 0
 	mov	w0, 1
 	str	w0, [x28, 444]
-.L1005:
+.L1015:
 	.loc 1 2215 0
 	ldr	x0, [x28, 224]
 	str	x0, [x28, 216]
 	.loc 1 2216 0
-	b	.L908
-.LVL927:
-.L938:
+	b	.L918
+.LVL932:
+.L948:
 	.loc 1 1996 0
 	ldr	w0, [x28, 628]
-	cbz	w0, .L941
+	cbz	w0, .L951
 	.loc 1 2009 0
 	ldr	x2, [x28, 216]
 	.loc 1 1997 0
@@ -10715,24 +10748,24 @@ ebc_thread:
 	sub	w1, w0, #22
 	.loc 1 2012 0
 	ccmp	w1, 1, 0, hi
-	bls	.L1096
+	bls	.L1106
 	.loc 1 2013 0
 	ldr	w0, [x2, 64]
 	cmp	w0, 32
-	bne	.L944
+	bne	.L954
 	.loc 1 2014 0
 	ldr	x5, [x2, 16]
 	ldr	w2, [x28, 20]
 	ldr	x1, [x28, 160]
-.LBB1960:
-.LBB1961:
+.LBB1958:
+.LBB1959:
 	.loc 1 1883 0
 	cmp	w2, 0
-	ble	.L945
+	ble	.L955
 	mov	x0, 0
-.LVL928:
+.LVL933:
 	.p2align 2
-.L946:
+.L956:
 	.loc 1 1885 0
 	ldrb	w3, [x5], 2
 	.loc 1 1887 0
@@ -10744,27 +10777,27 @@ ebc_thread:
 	add	x0, x0, 1
 	.loc 1 1883 0
 	cmp	w2, w0
-	bgt	.L946
-.L1080:
+	bgt	.L956
+.L1090:
 	ldr	w2, [x28, 20]
 	ldr	x1, [x28, 160]
-.L945:
-.LBE1961:
-.LBE1960:
+.L955:
+.LBE1959:
+.LBE1958:
 	.loc 1 2017 0
 	ldr	x0, [x28, 144]
 	sxtw	x2, w2
 	bl	memcpy
-.LVL929:
+.LVL934:
 	.loc 1 2018 0
 	ldrsw	x2, [x28, 20]
 	ldp	x0, x1, [x28, 152]
 	bl	memcpy
-.LVL930:
+.LVL935:
 	ldr	x0, [x28, 224]
-.L947:
-.LBB1962:
-.LBB1963:
+.L957:
+.LBB1960:
+.LBB1961:
 	.loc 1 446 0
 	ldp	w3, w16, [x0, 48]
 	.loc 1 505 0
@@ -10792,23 +10825,23 @@ ebc_thread:
 	asr	w10, w10, 3
 	.loc 1 449 0
 	asr	w18, w18, 3
-.LVL931:
+.LVL936:
 	.loc 1 445 0
 	add	w10, w10, 1
-.LVL932:
+.LVL937:
 	ldr	w1, [x20, 252]
 	.loc 1 452 0
 	cmp	w10, w18
-.LBE1963:
-.LBE1962:
+.LBE1961:
+.LBE1960:
 	.loc 1 2025 0
 	ldr	x13, [x0, 16]
-.LBB1968:
-.LBB1964:
+.LBB1966:
+.LBB1962:
 	.loc 1 452 0
 	sub	w0, w18, #1
 	csel	w10, w0, w10, ge
-.LVL933:
+.LVL938:
 	.loc 1 454 0
 	cmp	w1, w21
 	sub	w1, w1, #1
@@ -10818,106 +10851,106 @@ ebc_thread:
 	csel	w21, w1, w21, le
 	.loc 1 444 0
 	asr	w17, w17, 3
-.LVL934:
+.LVL939:
 	mul	w7, w16, w18
 	.loc 1 456 0
 	cmp	w16, w21
-.LBE1964:
-.LBE1968:
+.LBE1962:
+.LBE1966:
 	.loc 1 2025 0
 	ldr	x8, [x28, 144]
 	.loc 1 2026 0
 	ldp	x12, x11, [x28, 160]
-.LBB1969:
-.LBB1965:
+.LBB1967:
+.LBB1963:
 	.loc 1 456 0
-	bgt	.L955
-.LVL935:
+	bgt	.L965
+.LVL940:
 	.p2align 2
-.L1051:
+.L1061:
 	.loc 1 461 0
 	mov	w5, w17
 	cmp	w17, w10
-	ble	.L1052
-	b	.L972
-.LVL936:
+	ble	.L1062
+	b	.L982
+.LVL941:
 	.p2align 3
-.L956:
+.L966:
 	.loc 1 474 0
 	tst	x2, 65280
-	bne	.L957
+	bne	.L967
 	.loc 1 475 0
 	and	w27, w0, 240
 	cmp	w27, 224
-	beq	.L1097
+	beq	.L1107
 	.loc 1 478 0
 	orr	w3, w3, 240
-.L957:
+.L967:
 	.loc 1 480 0
 	tst	x2, 16711680
-	bne	.L959
+	bne	.L969
 	.loc 1 481 0
 	and	w27, w0, 3840
 	cmp	w27, 3584
-	beq	.L1098
+	beq	.L1108
 	.loc 1 484 0
 	orr	w3, w3, 3840
-.L959:
+.L969:
 	.loc 1 486 0
 	tst	x2, 4278190080
-	bne	.L961
+	bne	.L971
 	.loc 1 487 0
 	and	w27, w0, 61440
 	cmp	w27, 57344
-	beq	.L1099
+	beq	.L1109
 	.loc 1 490 0
 	orr	w3, w3, 61440
-.L961:
+.L971:
 	.loc 1 492 0
 	tst	x2, 1095216660480
-	bne	.L963
+	bne	.L973
 	.loc 1 493 0
 	and	w27, w0, 983040
 	cmp	w27, 917504
-	beq	.L1100
+	beq	.L1110
 	.loc 1 496 0
 	orr	w3, w3, 983040
-.L963:
+.L973:
 	.loc 1 498 0
 	tst	x2, 280375465082880
-	bne	.L965
+	bne	.L975
 	.loc 1 499 0
 	and	w27, w0, 15728640
 	cmp	w27, 14680064
-	beq	.L1101
+	beq	.L1111
 	.loc 1 502 0
 	orr	w3, w3, 15728640
-.L965:
+.L975:
 	.loc 1 504 0
 	tst	x2, 71776119061217280
-	bne	.L967
+	bne	.L977
 	.loc 1 505 0
 	and	w27, w0, 251658240
 	cmp	w27, w15
-	beq	.L1102
+	beq	.L1112
 	.loc 1 508 0
 	orr	w3, w3, 251658240
-.L967:
+.L977:
 	.loc 1 510 0
 	tst	x2, -72057594037927936
-	bne	.L969
+	bne	.L979
 	.loc 1 511 0
 	and	w2, w0, -268435456
-.LVL937:
+.LVL942:
 	cmp	w2, w14
-	beq	.L1103
+	beq	.L1113
 	.loc 1 514 0
 	orr	w3, w3, -268435456
-.LVL938:
-.L969:
+.LVL943:
+.L979:
 	.loc 1 517 0
 	and	w0, w0, w25
-.LVL939:
+.LVL944:
 	.loc 1 461 0
 	add	w5, w5, 1
 	eor	w0, w0, w4
@@ -10928,19 +10961,19 @@ ebc_thread:
 	.loc 1 518 0
 	str	w0, [x8, x1]
 	.loc 1 461 0
-	bgt	.L972
-.LVL940:
-.L1052:
+	bgt	.L982
+.LVL945:
+.L1062:
 	.loc 1 462 0
 	sxtw	x1, w5
-.LVL941:
+.LVL946:
 	.loc 1 466 0
 	mov	w3, 0
 	.loc 1 465 0
 	lsl	x0, x1, 3
 	.loc 1 462 0
 	lsl	x1, x1, 2
-.LVL942:
+.LVL947:
 	.loc 1 465 0
 	add	x0, x0, x7, sxtw 3
 	add	x1, x1, x7, sxtw 2
@@ -10953,32 +10986,32 @@ ebc_thread:
 	and	x27, x2, 255
 	.loc 1 464 0
 	ldr	w25, [x12, x1]
-.LVL943:
+.LVL948:
 	.loc 1 468 0
-	cbnz	x27, .L956
-.LVL944:
+	cbnz	x27, .L966
+.LVL949:
 	.loc 1 469 0
 	and	w27, w0, 15
 	.loc 1 472 0
 	mov	w3, 15
 	.loc 1 469 0
 	cmp	w27, 14
-	bne	.L956
+	bne	.L966
 	.loc 1 470 0
 	orr	w4, w4, w3
-.LVL945:
+.LVL950:
 	.loc 1 466 0
 	mov	w3, 0
-.LVL946:
-	b	.L956
-.LVL947:
-.L936:
-.LBE1965:
-.LBE1969:
+.LVL951:
+	b	.L966
+.LVL952:
+.L946:
+.LBE1963:
+.LBE1967:
 	.loc 1 2048 0
 	add	x0, x23, 680
 	bl	down_write
-.LVL948:
+.LVL953:
 	.loc 1 2051 0
 	ldr	x1, [x28, 216]
 	.loc 1 2049 0
@@ -10989,43 +11022,43 @@ ebc_thread:
 	.loc 1 2054 0
 	cmp	w2, 1
 	ccmp	w0, 1, 0, hi
-	bls	.L974
+	bls	.L984
 	.loc 1 2055 0
 	ldr	w0, [x1, 64]
 	cmp	w0, 32
-	beq	.L1104
+	beq	.L1114
 	.loc 1 2058 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x1, 16]
 	ldr	x0, [x28, 152]
 	bl	memcpy
-.LVL949:
-.L978:
+.LVL954:
+.L988:
 	.loc 1 2059 0
 	ldr	x0, [x28, 224]
 	ldr	w1, [x0, 64]
 	cmp	w1, 32
-	bne	.L979
+	bne	.L989
 	.loc 1 2060 0
 	ldr	w4, [x28, 20]
-.LVL950:
-.LBB1970:
-.LBB1971:
+.LVL955:
+.LBB1968:
+.LBB1969:
 	.loc 1 1883 0
 	ldr	x3, [x0, 16]
-.LVL951:
+.LVL956:
 	mov	x0, 0
 	cmp	w4, 0
-.LBE1971:
-.LBE1970:
+.LBE1969:
+.LBE1968:
 	.loc 1 2060 0
 	ldr	x5, [x28, 144]
-.LBB1973:
-.LBB1972:
+.LBB1971:
+.LBB1970:
 	.loc 1 1883 0
-	ble	.L981
+	ble	.L991
 	.p2align 2
-.L1050:
+.L1060:
 	.loc 1 1885 0
 	ldrb	w1, [x3], 2
 	.loc 1 1887 0
@@ -11037,173 +11070,173 @@ ebc_thread:
 	add	x0, x0, 1
 	.loc 1 1883 0
 	cmp	w4, w0
-	bgt	.L1050
-	b	.L981
-.LVL952:
-.L940:
-.LBE1972:
-.LBE1973:
+	bgt	.L1060
+	b	.L991
+.LVL957:
+.L950:
+.LBE1970:
+.LBE1971:
 	.loc 1 1994 0
 	mov	w4, 0
-.LVL953:
-	b	.L939
-.LVL954:
+.LVL958:
+	b	.L949
+.LVL959:
 	.p2align 3
-.L927:
+.L937:
 	.loc 1 1982 0
 	mov	x0, x26
 	str	x26, [x28, 216]
-	b	.L928
-.LVL955:
+	b	.L938
+.LVL960:
 	.p2align 3
-.L1090:
-.LBB1974:
-.LBB1954:
+.L1100:
+.LBB1972:
+.LBB1952:
 	.loc 1 2221 0
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL956:
+.LVL961:
 	mov	x21, 60
-.LVL957:
-.LBB1951:
+.LVL962:
+.LBB1949:
 	mov	w2, 1
 	add	x1, x29, 120
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL958:
-.LBB1947:
+.LVL963:
+.LBB1945:
 	ldr	w1, [x28, 96]
 	mov	w2, 0
 	cmp	w1, 0
 	cset	w1, ne
-.LVL959:
+.LVL964:
 	.p2align 2
-.L1010:
-.LBE1947:
+.L1020:
+.LBE1945:
 	.loc 1 2221 0 is_stmt 0 discriminator 9
 	orr	w1, w1, w2
-.LVL960:
-	cbnz	w1, .L1009
-.LVL961:
+.LVL965:
+	cbnz	w1, .L1019
+.LVL966:
 	.loc 1 2221 0 discriminator 11
-	cbnz	x0, .L1008
+	cbnz	x0, .L1018
 	.loc 1 2221 0 discriminator 13
 	mov	x0, x21
-.LVL962:
+.LVL967:
 	bl	schedule_timeout
-.LVL963:
+.LVL968:
 	mov	w2, 1
 	mov	x21, x0
 	add	x1, x29, 120
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL964:
-.LBB1948:
+.LVL969:
+.LBB1946:
 	ldr	w1, [x28, 96]
 	cmp	w1, 0
 	cset	w1, ne
-.LVL965:
+.LVL970:
 	cmp	x21, 0
 	cset	w2, eq
 	tst	w1, w2
-	beq	.L1010
-.L1009:
-.LBE1948:
-.LBE1951:
+	beq	.L1020
+.L1019:
+.LBE1946:
+.LBE1949:
 	.loc 1 2221 0
 	add	x1, x29, 120
-.LVL966:
+.LVL971:
 	mov	x0, x19
 	bl	finish_wait
-.LVL967:
-.L1008:
-.LBE1954:
-.LBE1974:
+.LVL972:
+.L1018:
+.LBE1952:
+.LBE1972:
 	.loc 1 2222 0 is_stmt 1 discriminator 16
 	ldr	w0, [x28, 96]
-.LVL968:
-	cbnz	w0, .L908
+.LVL973:
+	cbnz	w0, .L918
 	.loc 1 2229 0
 	ldr	w0, [x28, 44]
 	cmp	w0, 1
-	beq	.L1105
+	beq	.L1115
 	.loc 1 2238 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	beq	.L1017
-.L1019:
-.LBB1975:
-.LBB1976:
+	beq	.L1027
+.L1029:
+.LBB1973:
+.LBB1974:
 	.loc 1 2242 0
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL969:
-	b	.L1018
+.LVL974:
+	b	.L1028
 	.p2align 3
-.L1106:
-.LVL970:
-.LBB1977:
+.L1116:
+.LVL975:
+.LBB1975:
 	.loc 1 2242 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L1020
+	cbnz	x0, .L1030
 	.loc 1 2242 0 discriminator 7
 	bl	schedule
-.LVL971:
-.L1018:
+.LVL976:
+.L1028:
 	.loc 1 2242 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL972:
+.LVL977:
 	ldr	w1, [x28, 96]
-	cbz	w1, .L1106
-.LBE1977:
+	cbz	w1, .L1116
+.LBE1975:
 	.loc 1 2242 0 discriminator 4
 	add	x1, x29, 120
 	mov	x0, x19
 	bl	finish_wait
-.LVL973:
-.L1022:
-.L1020:
-.LBE1976:
-.LBE1975:
+.LVL978:
+.L1032:
+.L1030:
+.LBE1974:
+.LBE1973:
 	.loc 1 2246 0 is_stmt 1
 	ldr	w0, [x28, 200]
-.LVL974:
+.LVL979:
 	.loc 1 2243 0
 	str	wzr, [x28, 96]
 	.loc 1 2246 0
-	cbnz	w0, .L908
-.L1120:
+	cbnz	w0, .L918
+.L1130:
 	.loc 1 2247 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
-.LVL975:
-	b	.L908
-.LVL976:
+.LVL980:
+	b	.L918
+.LVL981:
 	.p2align 3
-.L914:
+.L924:
 	.loc 1 1928 0
 	ldr	x2, [x28, 616]
-	cbz	x2, .L918
+	cbz	x2, .L928
 	.loc 1 1929 0
 	cmp	w1, 19
-	bne	.L1078
+	bne	.L1088
 	.loc 1 1930 0
 	str	wzr, [x28, 616]
 	.loc 1 1931 0
 	mov	x0, 3
-.LVL977:
+.LVL982:
 	bl	ebc_notify
-.LVL978:
+.LVL983:
 	.loc 1 1932 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC86
 	add	x1, x1, :lo12:.LC86
 	bl	_dev_info
-.LVL979:
+.LVL984:
 	.loc 1 1935 0
 	ldr	w2, [x20, 204]
 	.loc 1 1933 0
@@ -11215,20 +11248,20 @@ ebc_thread:
 	stp	w3, wzr, [x21, 16]
 	.loc 1 1935 0
 	bl	check_black_percent.isra.15
-.LVL980:
-	cbz	w0, .L913
-	b	.L1077
-.LVL981:
+.LVL985:
+	cbz	w0, .L923
+	b	.L1087
+.LVL986:
 	.p2align 3
-.L1095:
+.L1105:
 	.loc 1 2211 0
 	ldr	x0, [x28, 216]
 	bl	ebc_buf_release
-.LVL982:
-	b	.L1005
-.LVL983:
+.LVL987:
+	b	.L1015
+.LVL988:
 	.p2align 3
-.L996:
+.L1006:
 	.loc 1 2165 0
 	ldr	x0, [x28, 224]
 	adrp	x1, .LC95
@@ -11243,37 +11276,37 @@ ebc_thread:
 	ldr	w2, [x0, 40]
 	ldr	x0, [x28, 104]
 	bl	_dev_info
-.LVL984:
+.LVL989:
 	.loc 1 2166 0
 	mov	w0, 1
 	str	w0, [x28, 44]
 	.loc 1 2167 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL985:
+.LVL990:
 	.loc 1 2169 0
 	ldr	x1, [x21, #:lo12:jiffies]
 	add	x0, x20, 688
 	str	x0, [x29, 96]
 	add	x1, x1, 900
 	bl	mod_timer
-.LVL986:
-.LBB1978:
+.LVL991:
+.LBB1976:
 	.loc 1 2170 0
 	ldr	w0, [x28, 92]
-	cbz	w0, .L1107
-.L999:
-.LVL987:
-.L997:
-.LBE1978:
+	cbz	w0, .L1117
+.L1009:
+.LVL992:
+.L1007:
+.LBE1976:
 	.loc 1 2172 0 discriminator 11
 	ldr	x2, [x21, #:lo12:jiffies]
 	mov	x1, 402653184
 	ldr	x0, [x29, 96]
-.LVL988:
+.LVL993:
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL989:
+.LVL994:
 	.loc 1 2173 0 discriminator 11
 	str	wzr, [x28, 92]
 	.loc 1 2191 0 discriminator 11
@@ -11283,14 +11316,14 @@ ebc_thread:
 	.loc 1 2191 0 discriminator 11
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
-	bne	.L1001
-.LVL990:
-.L1093:
+	bne	.L1011
+.LVL995:
+.L1103:
 	.loc 1 2194 0
 	ldr	x0, [x28, 104]
 	.loc 1 2192 0
 	mov	w21, 1
-.LVL991:
+.LVL996:
 	.loc 1 2193 0
 	str	wzr, [x28, 204]
 	.loc 1 2194 0
@@ -11300,65 +11333,65 @@ ebc_thread:
 	.loc 1 2194 0
 	add	x1, x1, :lo12:.LC97
 	bl	_dev_info
-.LVL992:
+.LVL997:
 	.loc 1 2195 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x23, 328
 	bl	__wake_up_sync
-.LVL993:
-	b	.L1002
-.LVL994:
+.LVL998:
+	b	.L1012
+.LVL999:
 	.p2align 3
-.L1029:
+.L1039:
 	.loc 1 2150 0
 	ldr	w0, [x28, 200]
 	.loc 1 2139 0
 	str	wzr, [x29, 108]
 	.loc 1 2150 0
-	cbnz	w0, .L995
-.LVL995:
-.L1092:
+	cbnz	w0, .L1005
+.LVL1000:
+.L1102:
 	.loc 1 2151 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
-.LVL996:
-	b	.L995
-.LVL997:
+.LVL1001:
+	b	.L1005
+.LVL1002:
 	.p2align 3
-.L918:
+.L928:
 	.loc 1 1952 0
 	cmp	w1, 21
-	beq	.L1108
+	beq	.L1118
 	.loc 1 1955 0
 	ldr	w0, [x28, 632]
-.LVL998:
+.LVL1003:
 	cmp	w0, 0
 	ccmp	w1, 1, 4, ne
-	beq	.L913
+	beq	.L923
 	.loc 1 1956 0
 	add	x0, x23, 680
 	bl	down_write
-.LVL999:
+.LVL1004:
 	.loc 1 1957 0
 	ldr	w0, [x26, 64]
 	cmp	w0, 32
-	beq	.L1109
+	beq	.L1119
 	.loc 1 1960 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x26, 16]
 	ldr	x0, [x28, 160]
 	bl	memcpy
-.LVL1000:
-.L923:
+.LVL1005:
+.L933:
 	.loc 1 1961 0
 	mov	x0, x26
 	bl	ebc_remove_from_dsp_buf_list
-.LVL1001:
+.LVL1006:
 	.loc 1 1962 0
 	mov	x0, x26
 	bl	ebc_buf_release
-.LVL1002:
+.LVL1007:
 	.loc 1 1964 0
 	ldr	x1, [x28, 224]
 	mov	x4, x28
@@ -11367,14 +11400,14 @@ ebc_thread:
 	ldr	w5, [x1, 40]
 	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
-.LVL1003:
+.LVL1008:
 	.loc 1 1967 0
 	add	x0, x23, 680
 	bl	up_write
-.LVL1004:
+.LVL1009:
 	.loc 1 1968 0
 	ldr	w0, [x28, 44]
-	cbnz	w0, .L908
+	cbnz	w0, .L918
 	.loc 1 1969 0
 	mov	w0, 1
 	str	w0, [x28, 44]
@@ -11383,22 +11416,22 @@ ebc_thread:
 	.loc 1 1970 0
 	str	wzr, [x28, 92]
 	.loc 1 1971 0
-	cbz	w0, .L1110
-.L926:
+	cbz	w0, .L1120
+.L936:
 	.loc 1 1973 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC87
 	ldrb	w2, [x28, 48]
 	add	x1, x1, :lo12:.LC87
 	bl	_dev_info
-.LVL1005:
+.LVL1010:
 	.loc 1 1974 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL1006:
-	b	.L908
+.LVL1011:
+	b	.L918
 	.p2align 3
-.L974:
+.L984:
 	.loc 1 2065 0
 	ldr	w0, [x26, 64]
 	.loc 1 2066 0
@@ -11410,18 +11443,18 @@ ebc_thread:
 	ldr	x2, [x28, 168]
 	ldr	x0, [x28, 144]
 	.loc 1 2065 0
-	beq	.L1111
+	beq	.L1121
 	.loc 1 2069 0
 	bl	refresh_new_image_auto
-.LVL1007:
-.L981:
+.LVL1012:
+.L991:
 	.loc 1 2072 0
 	add	x0, x23, 680
 	bl	up_write
-.LVL1008:
+.LVL1013:
 	.loc 1 2074 0
 	ldr	w0, [x28, 44]
-	cbnz	w0, .L952
+	cbnz	w0, .L962
 	.loc 1 2077 0
 	ldr	w0, [x28, 200]
 	.loc 1 2075 0
@@ -11431,15 +11464,15 @@ ebc_thread:
 	.loc 1 2075 0
 	str	w1, [x28, 44]
 	.loc 1 2077 0
-	cbz	w0, .L1112
-.L985:
+	cbz	w0, .L1122
+.L995:
 	.loc 1 2079 0
 	mov	w1, 16
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL1009:
+.LVL1014:
 	cmn	w0, #1
-	beq	.L1113
+	beq	.L1123
 	.loc 1 2084 0
 	ldr	w3, [x28, 112]
 	.loc 1 2087 0
@@ -11455,69 +11488,69 @@ ebc_thread:
 	strb	w3, [x28, 49]
 	.loc 1 2087 0
 	bl	_dev_info
-.LVL1010:
+.LVL1015:
 	.loc 1 2088 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL1011:
-	b	.L952
-.L1086:
+.LVL1016:
+	b	.L962
+.L1096:
 	.loc 1 1988 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC89
 	add	x1, x1, :lo12:.LC89
 	bl	_dev_info
-.LVL1012:
-.LBB1982:
+.LVL1017:
+.LBB1980:
 	.loc 1 1989 0
 	ldr	w0, [x28, 92]
-	cbz	w0, .L1114
-.L933:
-.LVL1013:
-.L931:
-.LBE1982:
+	cbz	w0, .L1124
+.L943:
+.LVL1018:
+.L941:
+.LBE1980:
 	.loc 1 1990 0 discriminator 11
 	ldr	x0, [x28, 104]
-.LVL1014:
+.LVL1019:
 	adrp	x1, .LC90
 	add	x1, x1, :lo12:.LC90
 	bl	_dev_info
-.LVL1015:
-	b	.L1079
-.LVL1016:
-.L1091:
+.LVL1020:
+	b	.L1089
+.LVL1021:
+.L1101:
 	.loc 1 2129 0
 	ldr	w2, [x28, 20]
-.LBB1986:
-.LBB1959:
+.LBB1984:
+.LBB1957:
 	.loc 1 1862 0
 	cmp	w0, 32
-.LVL1017:
+.LVL1022:
 	lsl	w0, w2, 1
 	csel	w2, w0, w2, eq
 	.loc 1 1863 0
 	cmp	w2, 0
 	add	w0, w2, 7
 	csel	w0, w0, w2, lt
-.LVL1018:
+.LVL1023:
 	asr	w0, w0, 3
-.LVL1019:
+.LVL1024:
 	cmp	w0, 0
-	ble	.L990
+	ble	.L1000
 	ldr	x7, [x1, 16]
 	ldr	x5, [x26, 16]
 	.loc 1 1867 0
 	ldr	x1, [x7]
 	ldr	x2, [x5]
 	cmp	x2, x1
-	bne	.L988
+	bne	.L998
 	sub	w1, w0, #1
 	mov	x0, 8
 	add	x1, x1, 1
 	lsl	x1, x1, 3
-	b	.L992
+	b	.L1002
 	.p2align 3
-.L993:
+.L1003:
 	.loc 1 1864 0
 	ldr	x3, [x5, x0]
 	add	x0, x0, 8
@@ -11526,62 +11559,62 @@ ebc_thread:
 	.loc 1 1867 0
 	ldr	x2, [x2, -8]
 	cmp	x3, x2
-	bne	.L988
-.L992:
+	bne	.L998
+.L1002:
 	.loc 1 1863 0
 	cmp	x0, x1
-	bne	.L993
-.L990:
-.LBE1959:
-.LBE1986:
+	bne	.L1003
+.L1000:
+.LBE1957:
+.LBE1984:
 	.loc 1 2130 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC99
 	add	x1, x1, :lo12:.LC99
 	bl	_dev_info
-.LVL1020:
+.LVL1025:
 	.loc 1 2132 0
 	str	x25, [x28, 216]
 	.loc 1 2134 0
-	b	.L952
-.LVL1021:
-.L1096:
+	b	.L962
+.LVL1026:
+.L1106:
 	.loc 1 2021 0
 	cmp	w0, 0
 	mov	x0, x26
 	ccmp	w1, 1, 0, ne
-	bhi	.L947
+	bhi	.L957
 	.loc 1 2022 0
 	ldrsw	x2, [x28, 20]
 	ldp	x1, x0, [x28, 152]
 	bl	memcpy
-.LVL1022:
+.LVL1027:
 	ldr	x0, [x28, 224]
-	b	.L947
-.LVL1023:
+	b	.L957
+.LVL1028:
 	.p2align 3
-.L1101:
-.LBB1987:
-.LBB1966:
+.L1111:
+.LBB1985:
+.LBB1964:
 	.loc 1 500 0
 	orr	w4, w4, 15728640
-	b	.L965
+	b	.L975
 	.p2align 3
-.L1102:
+.L1112:
 	.loc 1 506 0
 	orr	w4, w4, 251658240
-	b	.L967
-.LVL1024:
+	b	.L977
+.LVL1029:
 	.p2align 3
-.L1103:
+.L1113:
 	.loc 1 512 0
 	orr	w4, w4, -268435456
-.LVL1025:
+.LVL1030:
 	.loc 1 517 0
 	and	w0, w0, w25
-.LVL1026:
+.LVL1031:
 	eor	w0, w0, w4
-.LVL1027:
+.LVL1032:
 	.loc 1 461 0
 	add	w5, w5, 1
 	and	w0, w0, w3
@@ -11591,21 +11624,21 @@ ebc_thread:
 	.loc 1 518 0
 	str	w0, [x8, x1]
 	.loc 1 461 0
-	ble	.L1052
-.LVL1028:
+	ble	.L1062
+.LVL1033:
 	.p2align 2
-.L972:
+.L982:
 	.loc 1 456 0
 	add	w16, w16, 1
 	add	w7, w7, w18
 	cmp	w16, w21
-	ble	.L1051
-.L955:
-.LBE1966:
-.LBE1987:
+	ble	.L1061
+.L965:
+.LBE1964:
+.LBE1985:
 	.loc 1 2029 0
 	ldr	w0, [x28, 44]
-	cbnz	w0, .L952
+	cbnz	w0, .L962
 	.loc 1 2032 0
 	ldr	w0, [x28, 200]
 	.loc 1 2030 0
@@ -11615,15 +11648,15 @@ ebc_thread:
 	.loc 1 2030 0
 	str	w1, [x28, 44]
 	.loc 1 2032 0
-	cbz	w0, .L1115
-.L973:
+	cbz	w0, .L1125
+.L983:
 	.loc 1 2034 0
 	mov	w1, 16
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL1029:
+.LVL1034:
 	cmn	w0, #1
-	beq	.L952
+	beq	.L962
 	.loc 1 2038 0
 	ldr	w2, [x28, 112]
 	.loc 1 2041 0
@@ -11641,49 +11674,49 @@ ebc_thread:
 	.loc 1 2041 0
 	and	w3, w3, 255
 	bl	_dev_info
-.LVL1030:
+.LVL1035:
 	.loc 1 2042 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL1031:
-	b	.L952
-.LVL1032:
+.LVL1036:
+	b	.L962
+.LVL1037:
 	.p2align 3
-.L1097:
-.LBB1988:
-.LBB1967:
+.L1107:
+.LBB1986:
+.LBB1965:
 	.loc 1 476 0
 	orr	w4, w4, 240
-	b	.L957
+	b	.L967
 	.p2align 3
-.L1098:
+.L1108:
 	.loc 1 482 0
 	orr	w4, w4, 3840
-	b	.L959
+	b	.L969
 	.p2align 3
-.L1099:
+.L1109:
 	.loc 1 488 0
 	orr	w4, w4, 61440
-	b	.L961
+	b	.L971
 	.p2align 3
-.L1100:
+.L1110:
 	.loc 1 494 0
 	orr	w4, w4, 983040
-	b	.L963
-.LVL1033:
-.L1094:
-.LBE1967:
-.LBE1988:
+	b	.L973
+.LVL1038:
+.L1104:
+.LBE1965:
+.LBE1986:
 	.loc 1 2198 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC98
 	add	x1, x1, :lo12:.LC98
 	bl	_dev_info
-.LVL1034:
+.LVL1039:
 	.loc 1 2199 0
 	ldr	w0, [x28, 616]
-	cbz	w0, .L1116
-.L1003:
+	cbz	w0, .L1126
+.L1013:
 	.loc 1 2204 0
 	add	x0, x22, :lo12:.LANCHOR0
 	.loc 1 2202 0
@@ -11701,88 +11734,88 @@ ebc_thread:
 	.loc 1 2205 0
 	add	x0, x23, 328
 	bl	__wake_up_sync
-.LVL1035:
-	b	.L1002
-.LVL1036:
-.L941:
+.LVL1040:
+	b	.L1012
+.LVL1041:
+.L951:
 	.loc 1 2000 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC91
 	add	x1, x1, :lo12:.LC91
 	bl	_dev_info
-.LVL1037:
-	b	.L1077
-.LVL1038:
-.L1107:
-.LBB1989:
-.LBB1979:
-.LBB1980:
+.LVL1042:
+	b	.L1087
+.LVL1043:
+.L1117:
+.LBB1987:
+.LBB1977:
+.LBB1978:
 	.loc 1 2170 0 discriminator 1
 	add	x27, x23, 352
-.LBE1980:
+.LBE1978:
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL1039:
-	b	.L1000
+.LVL1044:
+	b	.L1010
 	.p2align 3
-.L1117:
-.LVL1040:
-.LBB1981:
+.L1127:
+.LVL1045:
+.LBB1979:
 	.loc 1 2170 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L997
+	cbnz	x0, .L1007
 	.loc 1 2170 0 discriminator 7
 	bl	schedule
-.LVL1041:
-.L1000:
+.LVL1046:
+.L1010:
 	.loc 1 2170 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x27
 	bl	prepare_to_wait_event
-.LVL1042:
+.LVL1047:
 	ldr	w1, [x28, 92]
-	cbz	w1, .L1117
-.LBE1981:
+	cbz	w1, .L1127
+.LBE1979:
 	.loc 1 2170 0 discriminator 4
 	mov	x0, x27
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL1043:
-	b	.L997
-.LVL1044:
-.L1108:
-.LBE1979:
-.LBE1989:
+.LVL1048:
+	b	.L1007
+.LVL1049:
+.L1118:
+.LBE1977:
+.LBE1987:
 	.loc 1 1953 0 is_stmt 1
 	str	wzr, [x28, 632]
-	b	.L913
-.LVL1045:
-.L1111:
+	b	.L923
+.LVL1050:
+.L1121:
 	.loc 1 2066 0
 	bl	refresh_new_image_auto_32
-.LVL1046:
-	b	.L981
-.L1104:
+.LVL1051:
+	b	.L991
+.L1114:
 	.loc 1 2056 0
 	ldr	w2, [x28, 20]
 	ldr	x4, [x1, 16]
-.LBB1990:
-.LBB1991:
+.LBB1988:
+.LBB1989:
 	.loc 1 1883 0
 	cmp	w2, 0
-.LBE1991:
-.LBE1990:
+.LBE1989:
+.LBE1988:
 	.loc 1 2056 0
 	ldr	x5, [x28, 152]
-.LBB1993:
-.LBB1992:
+.LBB1991:
+.LBB1990:
 	.loc 1 1883 0
-	ble	.L976
+	ble	.L986
 	mov	x0, 0
-.LVL1047:
+.LVL1052:
 	.p2align 2
-.L977:
+.L987:
 	.loc 1 1885 0
 	ldrb	w1, [x4], 2
 	.loc 1 1887 0
@@ -11794,78 +11827,78 @@ ebc_thread:
 	add	x0, x0, 1
 	.loc 1 1883 0
 	cmp	w2, w0
-	bgt	.L977
-	b	.L978
-.LVL1048:
-.L1115:
-.LBE1992:
-.LBE1993:
+	bgt	.L987
+	b	.L988
+.LVL1053:
+.L1125:
+.LBE1990:
+.LBE1991:
 	.loc 1 2033 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
-.LVL1049:
-	b	.L973
-.LVL1050:
-.L1114:
-.LBB1994:
-.LBB1983:
-.LBB1984:
+.LVL1054:
+	b	.L983
+.LVL1055:
+.L1124:
+.LBB1992:
+.LBB1981:
+.LBB1982:
 	.loc 1 1989 0 discriminator 1
 	add	x25, x23, 352
-.LVL1051:
-.LBE1984:
+.LVL1056:
+.LBE1982:
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL1052:
-	b	.L934
+.LVL1057:
+	b	.L944
 	.p2align 3
-.L1118:
-.LVL1053:
-.LBB1985:
+.L1128:
+.LVL1058:
+.LBB1983:
 	.loc 1 1989 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L931
+	cbnz	x0, .L941
 	.loc 1 1989 0 discriminator 7
 	bl	schedule
-.LVL1054:
-.L934:
+.LVL1059:
+.L944:
 	.loc 1 1989 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x25
 	bl	prepare_to_wait_event
-.LVL1055:
+.LVL1060:
 	ldr	w1, [x28, 92]
-	cbz	w1, .L1118
-.LBE1985:
+	cbz	w1, .L1128
+.LBE1983:
 	.loc 1 1989 0 discriminator 4
 	mov	x0, x25
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL1056:
-	b	.L931
-.LVL1057:
-.L1109:
-.LBE1983:
-.LBE1994:
+.LVL1061:
+	b	.L941
+.LVL1062:
+.L1119:
+.LBE1981:
+.LBE1992:
 	.loc 1 1958 0 is_stmt 1
 	ldr	w4, [x28, 20]
-.LBB1995:
-.LBB1996:
+.LBB1993:
+.LBB1994:
 	.loc 1 1883 0
 	mov	x0, 0
 	ldr	x3, [x26, 16]
-.LVL1058:
+.LVL1063:
 	cmp	w4, 0
-.LBE1996:
-.LBE1995:
+.LBE1994:
+.LBE1993:
 	.loc 1 1958 0
 	ldr	x5, [x28, 160]
-.LBB1998:
-.LBB1997:
+.LBB1996:
+.LBB1995:
 	.loc 1 1883 0
-	ble	.L923
-.L1053:
+	ble	.L933
+.L1063:
 	.loc 1 1885 0
 	ldrb	w1, [x3], 2
 	.loc 1 1887 0
@@ -11877,152 +11910,152 @@ ebc_thread:
 	add	x0, x0, 1
 	.loc 1 1883 0
 	cmp	w4, w0
-	bgt	.L1053
-	b	.L923
-.LVL1059:
-.L1088:
-.LBE1997:
-.LBE1998:
-.LBB1999:
-.LBB2000:
+	bgt	.L1063
+	b	.L933
+.LVL1064:
+.L1098:
+.LBE1995:
+.LBE1996:
+.LBB1997:
+.LBB1998:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.13
-.LVL1060:
-	b	.L910
-.LVL1061:
-.L1105:
-.LBE2000:
-.LBE1999:
-.LBB2001:
-.LBB2002:
+.LVL1065:
+	b	.L920
+.LVL1066:
+.L1115:
+.LBE1998:
+.LBE1997:
+.LBB1999:
+.LBB2000:
 	.loc 1 2230 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL1062:
-	b	.L1016
+.LVL1067:
+	b	.L1026
 	.p2align 3
-.L1119:
-.LBB2003:
+.L1129:
+.LBB2001:
 	.loc 1 2230 0 is_stmt 0 discriminator 7
 	ldr	w1, [x28, 96]
-	cbnz	w1, .L1013
-.LVL1063:
+	cbnz	w1, .L1023
+.LVL1068:
 	.loc 1 2230 0 discriminator 9
-	cbnz	x0, .L1015
+	cbnz	x0, .L1025
 	.loc 1 2230 0 discriminator 11
 	bl	schedule
-.LVL1064:
-.L1016:
+.LVL1069:
+.L1026:
 	.loc 1 2230 0 discriminator 13
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL1065:
+.LVL1070:
 	ldr	w1, [x28, 44]
-	cbnz	w1, .L1119
-.L1013:
-.LBE2003:
+	cbnz	w1, .L1129
+.L1023:
+.LBE2001:
 	.loc 1 2230 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL1066:
+.LVL1071:
 	ldr	w0, [x28, 44]
-.LBE2002:
-.LBE2001:
+.LBE2000:
+.LBE1999:
 	.loc 1 2233 0 is_stmt 1 discriminator 8
-	cbnz	w0, .L1015
+	cbnz	w0, .L1025
 	.loc 1 2234 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	bne	.L1015
-.L1017:
-.LBB2004:
-.LBB2005:
+	bne	.L1025
+.L1027:
+.LBB2002:
+.LBB2003:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.13
-.LVL1067:
-.L1015:
-.LBE2005:
-.LBE2004:
+.LVL1072:
+.L1025:
+.LBE2003:
+.LBE2002:
 	.loc 1 2241 0
 	ldr	w0, [x28, 96]
-.LVL1068:
-	cbz	w0, .L1019
+.LVL1073:
+	cbz	w0, .L1029
 	.loc 1 2246 0
 	ldr	w0, [x28, 200]
 	.loc 1 2243 0
 	str	wzr, [x28, 96]
 	.loc 1 2246 0
-	cbnz	w0, .L908
-	b	.L1120
-.LVL1069:
-.L1113:
+	cbnz	w0, .L918
+	b	.L1130
+.LVL1074:
+.L1123:
 	.loc 1 2080 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC93
 	add	x1, x1, :lo12:.LC93
 	bl	_dev_err
-.LVL1070:
+.LVL1075:
 	.loc 1 2081 0
-	b	.L952
-.L1112:
+	b	.L962
+.L1122:
 	.loc 1 2078 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
-.LVL1071:
-	b	.L985
-.LVL1072:
-.L1116:
+.LVL1076:
+	b	.L995
+.LVL1077:
+.L1126:
 	.loc 1 2200 0
 	mov	x0, 2
 	bl	ebc_notify
-.LVL1073:
-	b	.L1003
-.LVL1074:
-.L944:
+.LVL1078:
+	b	.L1013
+.LVL1079:
+.L954:
 	.loc 1 2016 0
 	ldr	x1, [x2, 16]
 	ldr	x0, [x28, 160]
 	ldrsw	x2, [x28, 20]
 	bl	memcpy
-.LVL1075:
-	b	.L1080
-.LVL1076:
-.L979:
+.LVL1080:
+	b	.L1090
+.LVL1081:
+.L989:
 	ldr	w2, [x28, 20]
-.L1023:
+.L1033:
 	.loc 1 2062 0
 	ldr	x1, [x0, 16]
 	sxtw	x2, w2
 	ldr	x0, [x28, 144]
 	bl	memcpy
-.LVL1077:
-	b	.L981
-.L1110:
+.LVL1082:
+	b	.L991
+.L1120:
 	.loc 1 1972 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
-.LVL1078:
-	b	.L926
-.L976:
+.LVL1083:
+	b	.L936
+.L986:
 	.loc 1 2059 0
 	ldr	w0, [x26, 64]
 	cmp	w0, 32
-	beq	.L981
+	beq	.L991
 	mov	x0, x26
-	b	.L1023
-.LVL1079:
-.L1089:
+	b	.L1033
+.LVL1084:
+.L1099:
 	.loc 1 2252 0
 	bl	__stack_chk_fail
-.LVL1080:
+.LVL1085:
 	.cfi_endproc
-.LFE2838:
+.LFE2837:
 	.size	ebc_thread, .-ebc_thread
 	.data
 	.align	3
@@ -12172,24 +12205,24 @@ resume_frame_count:
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.35232, %object
-	.size	__func__.35232, 11
-__func__.35232:
+	.type	__func__.35231, %object
+	.size	__func__.35231, 11
+__func__.35231:
 	.string	"ebc_io_ctl"
 	.align	3
 	.set	.LANCHOR3,. + 0
-	.type	__func__.34978, %object
-	.size	__func__.34978, 16
-__func__.34978:
+	.type	__func__.34977, %object
+	.size	__func__.34977, 16
+__func__.34977:
 	.string	"ebc_frame_start"
-	.type	__func__.35542, %object
-	.size	__func__.35542, 12
-__func__.35542:
+	.type	__func__.35541, %object
+	.size	__func__.35541, 12
+__func__.35541:
 	.string	"ebc_suspend"
 	.zero	4
-	.type	__func__.35476, %object
-	.size	__func__.35476, 19
-__func__.35476:
+	.type	__func__.35475, %object
+	.size	__func__.35475, 19
+__func__.35475:
 	.string	"ebc_lut_table_init"
 	.zero	5
 	.type	ebc_match, %object
@@ -12292,7 +12325,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC17:
-	.string	"2.22"
+	.string	"2.23"
 	.zero	3
 .LC18:
 	.string	"%s\n"
@@ -12757,15 +12790,15 @@ __exitcall_ebc_exit:
 	.file 214 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x158a7
+	.4byte	0x158b3
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF3341
-	.byte	0x1
 	.4byte	.LASF3342
+	.byte	0x1
 	.4byte	.LASF3343
+	.4byte	.LASF3344
 	.4byte	.Ldebug_ranges0+0x13e0
 	.8byte	0
 	.4byte	.Ldebug_line0
@@ -40636,8 +40669,8 @@ __exitcall_ebc_exit:
 	.4byte	.LASF3096
 	.byte	0x1
 	.2byte	0xc75
-	.8byte	.LFB2867
-	.8byte	.LFE2867-.LFB2867
+	.8byte	.LFB2866
+	.8byte	.LFE2866-.LFB2866
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe7b4
@@ -40650,13 +40683,13 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0xc70
 	.4byte	0xc6
-	.8byte	.LFB2866
-	.8byte	.LFE2866-.LFB2866
+	.8byte	.LFB2865
+	.8byte	.LFE2865-.LFB2865
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe7e4
 	.uleb128 0x4f
-	.8byte	.LVL383
+	.8byte	.LVL388
 	.4byte	0x15578
 	.byte	0
 	.uleb128 0x51
@@ -40664,8 +40697,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0xc4f
 	.4byte	0xc6
-	.8byte	.LFB2865
-	.8byte	.LFE2865-.LFB2865
+	.8byte	.LFB2864
+	.8byte	.LFE2864-.LFB2864
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe880
@@ -40687,8 +40720,8 @@ __exitcall_ebc_exit:
 	.4byte	0xe880
 	.uleb128 0x54
 	.4byte	0x14e28
-	.8byte	.LBB1011
-	.8byte	.LBE1011-.LBB1011
+	.8byte	.LBB1009
+	.8byte	.LBE1009-.LBB1009
 	.byte	0x1
 	.2byte	0xc51
 	.4byte	0xe850
@@ -40696,14 +40729,14 @@ __exitcall_ebc_exit:
 	.4byte	0x14e39
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x149e7
-	.8byte	.LBB1013
-	.8byte	.LBE1013-.LBB1013
+	.4byte	0x149f4
+	.8byte	.LBB1011
+	.8byte	.LBE1011-.LBB1011
 	.byte	0x1
 	.2byte	0xc54
 	.4byte	0xe872
 	.uleb128 0x55
-	.4byte	0x149f4
+	.4byte	0x14a01
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL68
@@ -40717,8 +40750,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0xc3e
 	.4byte	0xc6
-	.8byte	.LFB2864
-	.8byte	.LFE2864-.LFB2864
+	.8byte	.LFB2863
+	.8byte	.LFE2863-.LFB2863
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe98d
@@ -40743,11 +40776,11 @@ __exitcall_ebc_exit:
 	.4byte	0xe99d
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35542
+	.8byte	__func__.35541
 	.uleb128 0x54
 	.4byte	0x14e28
-	.8byte	.LBB1572
-	.8byte	.LBE1572-.LBB1572
+	.8byte	.LBB1570
+	.8byte	.LBE1570-.LBB1570
 	.byte	0x1
 	.2byte	0xc40
 	.4byte	0xe905
@@ -40755,41 +40788,41 @@ __exitcall_ebc_exit:
 	.4byte	0x14e39
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a01
-	.8byte	.LBB1574
-	.8byte	.LBE1574-.LBB1574
+	.4byte	0x14a0e
+	.8byte	.LBB1572
+	.8byte	.LBE1572-.LBB1572
 	.byte	0x1
 	.2byte	0xc49
 	.4byte	0xe927
 	.uleb128 0x55
-	.4byte	0x14a0e
+	.4byte	0x14a1b
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x146aa
-	.8byte	.LBB1576
-	.8byte	.LBE1576-.LBB1576
+	.4byte	0x146b7
+	.8byte	.LBB1574
+	.8byte	.LBE1574-.LBB1574
 	.byte	0x1
 	.2byte	0xc45
 	.4byte	0xe972
 	.uleb128 0x55
-	.4byte	0x146c6
+	.4byte	0x146d3
 	.uleb128 0x55
-	.4byte	0x146ba
+	.4byte	0x146c7
 	.uleb128 0x57
-	.8byte	.LBB1577
-	.8byte	.LBE1577-.LBB1577
+	.8byte	.LBB1575
+	.8byte	.LBE1575-.LBB1575
 	.uleb128 0x58
-	.4byte	0x146d2
+	.4byte	0x146df
 	.uleb128 0x4f
-	.8byte	.LVL614
+	.8byte	.LVL619
 	.4byte	0x1539b
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL612
+	.8byte	.LVL617
 	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL613
+	.8byte	.LVL618
 	.4byte	0x15584
 	.byte	0
 	.uleb128 0x5
@@ -40806,8 +40839,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0xc37
 	.4byte	0xc6
-	.8byte	.LFB2863
-	.8byte	.LFE2863-.LFB2863
+	.8byte	.LFB2862
+	.8byte	.LFE2862-.LFB2862
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe9e2
@@ -40826,8 +40859,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0xbb6
 	.4byte	0xc6
-	.8byte	.LFB2862
-	.8byte	.LFE2862-.LFB2862
+	.8byte	.LFB2861
+	.8byte	.LFE2861-.LFB2861
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xfdbf
@@ -40910,7 +40943,7 @@ __exitcall_ebc_exit:
 	.4byte	.LLST209
 	.uleb128 0x5c
 	.4byte	0x14e46
-	.8byte	.LBB1722
+	.8byte	.LBB1720
 	.4byte	.Ldebug_ranges0+0xd50
 	.byte	0x1
 	.2byte	0xbc6
@@ -40922,13 +40955,13 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14e57
 	.uleb128 0x4f
-	.8byte	.LVL620
+	.8byte	.LVL625
 	.4byte	0x1559d
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14d20
-	.8byte	.LBB1726
-	.8byte	.LBE1726-.LBB1726
+	.8byte	.LBB1724
+	.8byte	.LBE1724-.LBB1724
 	.byte	0x1
 	.2byte	0xbd8
 	.4byte	0xeb3a
@@ -40936,8 +40969,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d30
 	.uleb128 0x5d
 	.4byte	0x14e28
-	.8byte	.LBB1727
-	.8byte	.LBE1727-.LBB1727
+	.8byte	.LBB1725
+	.8byte	.LBE1725-.LBB1725
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x55
@@ -40946,8 +40979,8 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14d43
-	.8byte	.LBB1729
-	.8byte	.LBE1729-.LBB1729
+	.8byte	.LBB1727
+	.8byte	.LBE1727-.LBB1727
 	.byte	0x1
 	.2byte	0xbf3
 	.4byte	0xeb7a
@@ -40955,8 +40988,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d54
 	.uleb128 0x5e
 	.4byte	0x14e28
-	.8byte	.LBB1730
-	.8byte	.LBE1730-.LBB1730
+	.8byte	.LBB1728
+	.8byte	.LBE1728-.LBB1728
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x55
@@ -40965,7 +40998,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0x119a1
-	.8byte	.LBB1732
+	.8byte	.LBB1730
 	.4byte	.Ldebug_ranges0+0xd80
 	.byte	0x1
 	.2byte	0xc07
@@ -40978,7 +41011,7 @@ __exitcall_ebc_exit:
 	.4byte	0x119be
 	.uleb128 0x5c
 	.4byte	0x14d67
-	.8byte	.LBB1734
+	.8byte	.LBB1732
 	.4byte	.Ldebug_ranges0+0xdd0
 	.byte	0x1
 	.2byte	0x8f5
@@ -40991,7 +41024,7 @@ __exitcall_ebc_exit:
 	.4byte	0x14d78
 	.uleb128 0x60
 	.4byte	0x14d9c
-	.8byte	.LBB1735
+	.8byte	.LBB1733
 	.4byte	.Ldebug_ranges0+0xdd0
 	.byte	0xc
 	.2byte	0x49c
@@ -41008,15 +41041,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL645
+	.8byte	.LVL650
 	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14d67
-	.8byte	.LBB1746
-	.8byte	.LBE1746-.LBB1746
+	.8byte	.LBB1744
+	.8byte	.LBE1744-.LBB1744
 	.byte	0x1
 	.2byte	0x8f8
 	.4byte	0xec87
@@ -41028,8 +41061,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d78
 	.uleb128 0x5e
 	.4byte	0x14d9c
-	.8byte	.LBB1747
-	.8byte	.LBE1747-.LBB1747
+	.8byte	.LBB1745
+	.8byte	.LBE1745-.LBB1745
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
@@ -41041,20 +41074,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1748
-	.8byte	.LBE1748-.LBB1748
+	.8byte	.LBB1746
+	.8byte	.LBE1746-.LBB1746
 	.uleb128 0x58
 	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL646
+	.8byte	.LVL651
 	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14d67
-	.8byte	.LBB1749
-	.8byte	.LBE1749-.LBB1749
+	.8byte	.LBB1747
+	.8byte	.LBE1747-.LBB1747
 	.byte	0x1
 	.2byte	0x8fb
 	.4byte	0xed04
@@ -41066,8 +41099,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d78
 	.uleb128 0x5e
 	.4byte	0x14d9c
-	.8byte	.LBB1750
-	.8byte	.LBE1750-.LBB1750
+	.8byte	.LBB1748
+	.8byte	.LBE1748-.LBB1748
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
@@ -41079,20 +41112,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1751
-	.8byte	.LBE1751-.LBB1751
+	.8byte	.LBB1749
+	.8byte	.LBE1749-.LBB1749
 	.uleb128 0x58
 	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL647
+	.8byte	.LVL652
 	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14d67
-	.8byte	.LBB1752
-	.8byte	.LBE1752-.LBB1752
+	.8byte	.LBB1750
+	.8byte	.LBE1750-.LBB1750
 	.byte	0x1
 	.2byte	0x8fe
 	.4byte	0xed81
@@ -41104,8 +41137,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d78
 	.uleb128 0x5e
 	.4byte	0x14d9c
-	.8byte	.LBB1753
-	.8byte	.LBE1753-.LBB1753
+	.8byte	.LBB1751
+	.8byte	.LBE1751-.LBB1751
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
@@ -41117,20 +41150,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1754
-	.8byte	.LBE1754-.LBB1754
+	.8byte	.LBB1752
+	.8byte	.LBE1752-.LBB1752
 	.uleb128 0x58
 	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL648
+	.8byte	.LVL653
 	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14d67
-	.8byte	.LBB1755
-	.8byte	.LBE1755-.LBB1755
+	.8byte	.LBB1753
+	.8byte	.LBE1753-.LBB1753
 	.byte	0x1
 	.2byte	0x901
 	.4byte	0xedfe
@@ -41142,8 +41175,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d78
 	.uleb128 0x5e
 	.4byte	0x14d9c
-	.8byte	.LBB1756
-	.8byte	.LBE1756-.LBB1756
+	.8byte	.LBB1754
+	.8byte	.LBE1754-.LBB1754
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
@@ -41155,20 +41188,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1757
-	.8byte	.LBE1757-.LBB1757
+	.8byte	.LBB1755
+	.8byte	.LBE1755-.LBB1755
 	.uleb128 0x58
 	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL649
+	.8byte	.LVL654
 	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14d67
-	.8byte	.LBB1758
-	.8byte	.LBE1758-.LBB1758
+	.8byte	.LBB1756
+	.8byte	.LBE1756-.LBB1756
 	.byte	0x1
 	.2byte	0x904
 	.4byte	0xee7b
@@ -41180,8 +41213,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d78
 	.uleb128 0x5e
 	.4byte	0x14d9c
-	.8byte	.LBB1759
-	.8byte	.LBE1759-.LBB1759
+	.8byte	.LBB1757
+	.8byte	.LBE1757-.LBB1757
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
@@ -41193,20 +41226,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1760
-	.8byte	.LBE1760-.LBB1760
+	.8byte	.LBB1758
+	.8byte	.LBE1758-.LBB1758
 	.uleb128 0x58
 	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL650
+	.8byte	.LVL655
 	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14d67
-	.8byte	.LBB1761
-	.8byte	.LBE1761-.LBB1761
+	.8byte	.LBB1759
+	.8byte	.LBE1759-.LBB1759
 	.byte	0x1
 	.2byte	0x907
 	.4byte	0xeef8
@@ -41218,8 +41251,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d78
 	.uleb128 0x5e
 	.4byte	0x14d9c
-	.8byte	.LBB1762
-	.8byte	.LBE1762-.LBB1762
+	.8byte	.LBB1760
+	.8byte	.LBE1760-.LBB1760
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
@@ -41231,20 +41264,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1763
-	.8byte	.LBE1763-.LBB1763
+	.8byte	.LBB1761
+	.8byte	.LBE1761-.LBB1761
 	.uleb128 0x58
 	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL651
+	.8byte	.LVL656
 	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14d67
-	.8byte	.LBB1764
-	.8byte	.LBE1764-.LBB1764
+	.8byte	.LBB1762
+	.8byte	.LBE1762-.LBB1762
 	.byte	0x1
 	.2byte	0x90a
 	.4byte	0xef75
@@ -41256,8 +41289,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d78
 	.uleb128 0x5e
 	.4byte	0x14d9c
-	.8byte	.LBB1765
-	.8byte	.LBE1765-.LBB1765
+	.8byte	.LBB1763
+	.8byte	.LBE1763-.LBB1763
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
@@ -41269,20 +41302,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1766
-	.8byte	.LBE1766-.LBB1766
+	.8byte	.LBB1764
+	.8byte	.LBE1764-.LBB1764
 	.uleb128 0x58
 	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL652
+	.8byte	.LVL657
 	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14d67
-	.8byte	.LBB1767
-	.8byte	.LBE1767-.LBB1767
+	.8byte	.LBB1765
+	.8byte	.LBE1765-.LBB1765
 	.byte	0x1
 	.2byte	0x90d
 	.4byte	0xeff2
@@ -41294,8 +41327,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d78
 	.uleb128 0x5e
 	.4byte	0x14d9c
-	.8byte	.LBB1768
-	.8byte	.LBE1768-.LBB1768
+	.8byte	.LBB1766
+	.8byte	.LBE1766-.LBB1766
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
@@ -41307,20 +41340,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1769
-	.8byte	.LBE1769-.LBB1769
+	.8byte	.LBB1767
+	.8byte	.LBE1767-.LBB1767
 	.uleb128 0x58
 	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL653
+	.8byte	.LVL658
 	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14d67
-	.8byte	.LBB1770
-	.8byte	.LBE1770-.LBB1770
+	.8byte	.LBB1768
+	.8byte	.LBE1768-.LBB1768
 	.byte	0x1
 	.2byte	0x910
 	.4byte	0xf06f
@@ -41332,8 +41365,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d78
 	.uleb128 0x5e
 	.4byte	0x14d9c
-	.8byte	.LBB1771
-	.8byte	.LBE1771-.LBB1771
+	.8byte	.LBB1769
+	.8byte	.LBE1769-.LBB1769
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
@@ -41345,20 +41378,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1772
-	.8byte	.LBE1772-.LBB1772
+	.8byte	.LBB1770
+	.8byte	.LBE1770-.LBB1770
 	.uleb128 0x58
 	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL654
+	.8byte	.LVL659
 	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14d67
-	.8byte	.LBB1773
-	.8byte	.LBE1773-.LBB1773
+	.8byte	.LBB1771
+	.8byte	.LBE1771-.LBB1771
 	.byte	0x1
 	.2byte	0x913
 	.4byte	0xf0ec
@@ -41370,8 +41403,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d78
 	.uleb128 0x5e
 	.4byte	0x14d9c
-	.8byte	.LBB1774
-	.8byte	.LBE1774-.LBB1774
+	.8byte	.LBB1772
+	.8byte	.LBE1772-.LBB1772
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
@@ -41383,20 +41416,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1775
-	.8byte	.LBE1775-.LBB1775
+	.8byte	.LBB1773
+	.8byte	.LBE1773-.LBB1773
 	.uleb128 0x58
 	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL655
+	.8byte	.LVL660
 	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14d67
-	.8byte	.LBB1776
-	.8byte	.LBE1776-.LBB1776
+	.8byte	.LBB1774
+	.8byte	.LBE1774-.LBB1774
 	.byte	0x1
 	.2byte	0x916
 	.4byte	0xf169
@@ -41408,8 +41441,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d78
 	.uleb128 0x5e
 	.4byte	0x14d9c
-	.8byte	.LBB1777
-	.8byte	.LBE1777-.LBB1777
+	.8byte	.LBB1775
+	.8byte	.LBE1775-.LBB1775
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
@@ -41421,20 +41454,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1778
-	.8byte	.LBE1778-.LBB1778
+	.8byte	.LBB1776
+	.8byte	.LBE1776-.LBB1776
 	.uleb128 0x58
 	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL656
+	.8byte	.LVL661
 	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14d67
-	.8byte	.LBB1779
-	.8byte	.LBE1779-.LBB1779
+	.8byte	.LBB1777
+	.8byte	.LBE1777-.LBB1777
 	.byte	0x1
 	.2byte	0x919
 	.4byte	0xf1e6
@@ -41446,8 +41479,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d78
 	.uleb128 0x5e
 	.4byte	0x14d9c
-	.8byte	.LBB1780
-	.8byte	.LBE1780-.LBB1780
+	.8byte	.LBB1778
+	.8byte	.LBE1778-.LBB1778
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
@@ -41459,20 +41492,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1781
-	.8byte	.LBE1781-.LBB1781
+	.8byte	.LBB1779
+	.8byte	.LBE1779-.LBB1779
 	.uleb128 0x58
 	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL657
+	.8byte	.LVL662
 	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14d67
-	.8byte	.LBB1782
-	.8byte	.LBE1782-.LBB1782
+	.8byte	.LBB1780
+	.8byte	.LBE1780-.LBB1780
 	.byte	0x1
 	.2byte	0x91c
 	.4byte	0xf263
@@ -41484,8 +41517,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d78
 	.uleb128 0x5e
 	.4byte	0x14d9c
-	.8byte	.LBB1783
-	.8byte	.LBE1783-.LBB1783
+	.8byte	.LBB1781
+	.8byte	.LBE1781-.LBB1781
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
@@ -41497,20 +41530,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1784
-	.8byte	.LBE1784-.LBB1784
+	.8byte	.LBB1782
+	.8byte	.LBE1782-.LBB1782
 	.uleb128 0x58
 	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL658
+	.8byte	.LVL663
 	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14d67
-	.8byte	.LBB1785
-	.8byte	.LBE1785-.LBB1785
+	.8byte	.LBB1783
+	.8byte	.LBE1783-.LBB1783
 	.byte	0x1
 	.2byte	0x91f
 	.4byte	0xf2e0
@@ -41522,8 +41555,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d78
 	.uleb128 0x5e
 	.4byte	0x14d9c
-	.8byte	.LBB1786
-	.8byte	.LBE1786-.LBB1786
+	.8byte	.LBB1784
+	.8byte	.LBE1784-.LBB1784
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
@@ -41535,20 +41568,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1787
-	.8byte	.LBE1787-.LBB1787
+	.8byte	.LBB1785
+	.8byte	.LBE1785-.LBB1785
 	.uleb128 0x58
 	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL659
+	.8byte	.LVL664
 	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14d67
-	.8byte	.LBB1788
-	.8byte	.LBE1788-.LBB1788
+	.8byte	.LBB1786
+	.8byte	.LBE1786-.LBB1786
 	.byte	0x1
 	.2byte	0x922
 	.4byte	0xf35d
@@ -41560,8 +41593,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d78
 	.uleb128 0x5e
 	.4byte	0x14d9c
-	.8byte	.LBB1789
-	.8byte	.LBE1789-.LBB1789
+	.8byte	.LBB1787
+	.8byte	.LBE1787-.LBB1787
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
@@ -41573,20 +41606,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1790
-	.8byte	.LBE1790-.LBB1790
+	.8byte	.LBB1788
+	.8byte	.LBE1788-.LBB1788
 	.uleb128 0x58
 	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL660
+	.8byte	.LVL665
 	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14d67
-	.8byte	.LBB1791
-	.8byte	.LBE1791-.LBB1791
+	.8byte	.LBB1789
+	.8byte	.LBE1789-.LBB1789
 	.byte	0x1
 	.2byte	0x925
 	.4byte	0xf3da
@@ -41598,8 +41631,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d78
 	.uleb128 0x5e
 	.4byte	0x14d9c
-	.8byte	.LBB1792
-	.8byte	.LBE1792-.LBB1792
+	.8byte	.LBB1790
+	.8byte	.LBE1790-.LBB1790
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
@@ -41611,20 +41644,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1793
-	.8byte	.LBE1793-.LBB1793
+	.8byte	.LBB1791
+	.8byte	.LBE1791-.LBB1791
 	.uleb128 0x58
 	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL661
+	.8byte	.LVL666
 	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14d67
-	.8byte	.LBB1794
-	.8byte	.LBE1794-.LBB1794
+	.8byte	.LBB1792
+	.8byte	.LBE1792-.LBB1792
 	.byte	0x1
 	.2byte	0x928
 	.4byte	0xf457
@@ -41636,8 +41669,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d78
 	.uleb128 0x5e
 	.4byte	0x14d9c
-	.8byte	.LBB1795
-	.8byte	.LBE1795-.LBB1795
+	.8byte	.LBB1793
+	.8byte	.LBE1793-.LBB1793
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
@@ -41649,20 +41682,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1796
-	.8byte	.LBE1796-.LBB1796
+	.8byte	.LBB1794
+	.8byte	.LBE1794-.LBB1794
 	.uleb128 0x58
 	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL662
+	.8byte	.LVL667
 	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14d67
-	.8byte	.LBB1797
-	.8byte	.LBE1797-.LBB1797
+	.8byte	.LBB1795
+	.8byte	.LBE1795-.LBB1795
 	.byte	0x1
 	.2byte	0x92b
 	.4byte	0xf4d4
@@ -41674,8 +41707,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d78
 	.uleb128 0x5e
 	.4byte	0x14d9c
-	.8byte	.LBB1798
-	.8byte	.LBE1798-.LBB1798
+	.8byte	.LBB1796
+	.8byte	.LBE1796-.LBB1796
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
@@ -41687,20 +41720,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1799
-	.8byte	.LBE1799-.LBB1799
+	.8byte	.LBB1797
+	.8byte	.LBE1797-.LBB1797
 	.uleb128 0x58
 	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL663
+	.8byte	.LVL668
 	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
 	.4byte	0x14d67
-	.8byte	.LBB1800
-	.8byte	.LBE1800-.LBB1800
+	.8byte	.LBB1798
+	.8byte	.LBE1798-.LBB1798
 	.byte	0x1
 	.2byte	0x92e
 	.uleb128 0x55
@@ -41711,8 +41744,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d78
 	.uleb128 0x5e
 	.4byte	0x14d9c
-	.8byte	.LBB1801
-	.8byte	.LBE1801-.LBB1801
+	.8byte	.LBB1799
+	.8byte	.LBE1799-.LBB1799
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
@@ -41724,12 +41757,12 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1802
-	.8byte	.LBE1802-.LBB1802
+	.8byte	.LBB1800
+	.8byte	.LBE1800-.LBB1800
 	.uleb128 0x58
 	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL664
+	.8byte	.LVL669
 	.4byte	0x155aa
 	.byte	0
 	.byte	0
@@ -41738,7 +41771,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xfeb3
-	.8byte	.LBB1809
+	.8byte	.LBB1807
 	.4byte	.Ldebug_ranges0+0xe20
 	.byte	0x1
 	.2byte	0xc13
@@ -41769,7 +41802,7 @@ __exitcall_ebc_exit:
 	.4byte	0xff22
 	.uleb128 0x5c
 	.4byte	0x14e7c
-	.8byte	.LBB1811
+	.8byte	.LBB1809
 	.4byte	.Ldebug_ranges0+0xe90
 	.byte	0x1
 	.2byte	0xb03
@@ -41779,7 +41812,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0x14e46
-	.8byte	.LBB1815
+	.8byte	.LBB1813
 	.4byte	.Ldebug_ranges0+0xec0
 	.byte	0x1
 	.2byte	0xb22
@@ -41791,35 +41824,35 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14e57
 	.uleb128 0x4f
-	.8byte	.LVL670
+	.8byte	.LVL675
 	.4byte	0x1559d
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL666
+	.8byte	.LVL671
 	.4byte	0x155b7
 	.uleb128 0x4f
-	.8byte	.LVL667
+	.8byte	.LVL672
 	.4byte	0x155c4
 	.uleb128 0x4f
-	.8byte	.LVL668
+	.8byte	.LVL673
 	.4byte	0x155d0
 	.uleb128 0x4f
-	.8byte	.LVL669
+	.8byte	.LVL674
 	.4byte	0x155dc
 	.uleb128 0x4f
-	.8byte	.LVL671
+	.8byte	.LVL676
 	.4byte	0x155e8
 	.uleb128 0x4f
-	.8byte	.LVL672
+	.8byte	.LVL677
 	.4byte	0x155f2
 	.uleb128 0x4f
-	.8byte	.LVL685
+	.8byte	.LVL690
 	.4byte	0x155fe
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xff2d
-	.8byte	.LBB1826
+	.8byte	.LBB1824
 	.4byte	.Ldebug_ranges0+0xef0
 	.byte	0x1
 	.2byte	0xc1a
@@ -41849,7 +41882,7 @@ __exitcall_ebc_exit:
 	.4byte	0xff90
 	.uleb128 0x5c
 	.4byte	0x14e7c
-	.8byte	.LBB1828
+	.8byte	.LBB1826
 	.4byte	.Ldebug_ranges0+0xf40
 	.byte	0x1
 	.2byte	0xad3
@@ -41858,34 +41891,34 @@ __exitcall_ebc_exit:
 	.4byte	0x14e8c
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL674
+	.8byte	.LVL679
 	.4byte	0x155b7
 	.uleb128 0x4f
-	.8byte	.LVL675
+	.8byte	.LVL680
 	.4byte	0x155c4
 	.uleb128 0x4f
-	.8byte	.LVL689
+	.8byte	.LVL694
 	.4byte	0x155d0
 	.uleb128 0x4f
-	.8byte	.LVL690
+	.8byte	.LVL695
 	.4byte	0x1560b
 	.uleb128 0x4f
-	.8byte	.LVL776
+	.8byte	.LVL781
 	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL777
+	.8byte	.LVL782
 	.4byte	0x15617
 	.uleb128 0x4f
-	.8byte	.LVL778
+	.8byte	.LVL783
 	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL791
+	.8byte	.LVL796
 	.4byte	0x155fe
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xfe7b
-	.8byte	.LBB1837
+	.8byte	.LBB1835
 	.4byte	.Ldebug_ranges0+0xf70
 	.byte	0x1
 	.2byte	0xc21
@@ -41901,7 +41934,7 @@ __exitcall_ebc_exit:
 	.sleb128 -104
 	.uleb128 0x5c
 	.4byte	0x15046
-	.8byte	.LBB1839
+	.8byte	.LBB1837
 	.4byte	.Ldebug_ranges0+0xfb0
 	.byte	0x1
 	.2byte	0xb2f
@@ -41909,14 +41942,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x15053
 	.uleb128 0x57
-	.8byte	.LBB1841
-	.8byte	.LBE1841-.LBB1841
+	.8byte	.LBB1839
+	.8byte	.LBE1839-.LBB1839
 	.uleb128 0x58
 	.4byte	0x1507f
 	.uleb128 0x5d
 	.4byte	0x15235
-	.8byte	.LBB1842
-	.8byte	.LBE1842-.LBB1842
+	.8byte	.LBB1840
+	.8byte	.LBE1840-.LBB1840
 	.byte	0xf
 	.byte	0x1c
 	.uleb128 0x55
@@ -41930,8 +41963,8 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x1516c
-	.8byte	.LBB1846
-	.8byte	.LBE1846-.LBB1846
+	.8byte	.LBB1844
+	.8byte	.LBE1844-.LBB1844
 	.byte	0x1
 	.2byte	0xb39
 	.4byte	0xf7fc
@@ -41940,8 +41973,8 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x15179
 	.uleb128 0x57
-	.8byte	.LBB1847
-	.8byte	.LBE1847-.LBB1847
+	.8byte	.LBB1845
+	.8byte	.LBE1845-.LBB1845
 	.uleb128 0x61
 	.4byte	0x1518d
 	.4byte	.LLST213
@@ -41957,16 +41990,16 @@ __exitcall_ebc_exit:
 	.4byte	0xfea5
 	.4byte	.LLST215
 	.uleb128 0x4f
-	.8byte	.LVL698
+	.8byte	.LVL703
 	.4byte	0x15623
 	.uleb128 0x4f
-	.8byte	.LVL700
+	.8byte	.LVL705
 	.4byte	0x1562f
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x1516c
-	.8byte	.LBB1850
-	.8byte	.LBE1850-.LBB1850
+	.8byte	.LBB1848
+	.8byte	.LBE1848-.LBB1848
 	.byte	0x1
 	.2byte	0xb42
 	.4byte	0xf874
@@ -41975,8 +42008,8 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x15179
 	.uleb128 0x57
-	.8byte	.LBB1851
-	.8byte	.LBE1851-.LBB1851
+	.8byte	.LBB1849
+	.8byte	.LBE1849-.LBB1849
 	.uleb128 0x61
 	.4byte	0x1518d
 	.4byte	.LLST216
@@ -41986,29 +42019,29 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL691
+	.8byte	.LVL696
 	.4byte	0x1563c
 	.uleb128 0x4f
-	.8byte	.LVL692
+	.8byte	.LVL697
 	.4byte	0x15623
 	.uleb128 0x4f
-	.8byte	.LVL693
+	.8byte	.LVL698
 	.4byte	0x15649
 	.uleb128 0x4f
-	.8byte	.LVL701
+	.8byte	.LVL706
 	.4byte	0x15649
 	.uleb128 0x4f
-	.8byte	.LVL781
+	.8byte	.LVL786
 	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL785
+	.8byte	.LVL790
 	.4byte	0x155fe
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0xfe61
-	.8byte	.LBB1854
-	.8byte	.LBE1854-.LBB1854
+	.8byte	.LBB1852
+	.8byte	.LBE1852-.LBB1852
 	.byte	0x1
 	.2byte	0xc28
 	.4byte	0xf95e
@@ -42016,7 +42049,7 @@ __exitcall_ebc_exit:
 	.4byte	0xfe6e
 	.uleb128 0x5c
 	.4byte	0x14a96
-	.8byte	.LBB1856
+	.8byte	.LBB1854
 	.4byte	.Ldebug_ranges0+0x1010
 	.byte	0x1
 	.2byte	0xb52
@@ -42033,26 +42066,26 @@ __exitcall_ebc_exit:
 	.4byte	0x14ac7
 	.4byte	.LLST218
 	.uleb128 0x4f
-	.8byte	.LVL708
+	.8byte	.LVL713
 	.4byte	0x15656
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL709
+	.8byte	.LVL714
 	.4byte	0x15662
 	.uleb128 0x4f
-	.8byte	.LVL710
+	.8byte	.LVL715
 	.4byte	0x1566e
 	.uleb128 0x4f
-	.8byte	.LVL711
+	.8byte	.LVL716
 	.4byte	0x15662
 	.uleb128 0x4f
-	.8byte	.LVL712
+	.8byte	.LVL717
 	.4byte	0x1566e
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xfdbf
-	.8byte	.LBB1866
+	.8byte	.LBB1864
 	.4byte	.Ldebug_ranges0+0x1070
 	.byte	0x1
 	.2byte	0xc2b
@@ -42093,8 +42126,8 @@ __exitcall_ebc_exit:
 	.4byte	.LLST226
 	.uleb128 0x54
 	.4byte	0x11a65
-	.8byte	.LBB1868
-	.8byte	.LBE1868-.LBB1868
+	.8byte	.LBB1866
+	.8byte	.LBE1866-.LBB1866
 	.byte	0x1
 	.2byte	0xb8a
 	.4byte	0xfa40
@@ -42103,26 +42136,26 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x11a76
 	.uleb128 0x57
-	.8byte	.LBB1869
-	.8byte	.LBE1869-.LBB1869
+	.8byte	.LBB1867
+	.8byte	.LBE1867-.LBB1867
 	.uleb128 0x61
 	.4byte	0x11a82
 	.4byte	.LLST227
 	.uleb128 0x4f
-	.8byte	.LVL729
+	.8byte	.LVL734
 	.4byte	0x1567a
 	.uleb128 0x4f
-	.8byte	.LVL731
+	.8byte	.LVL736
 	.4byte	0x155f2
 	.uleb128 0x4f
-	.8byte	.LVL732
+	.8byte	.LVL737
 	.4byte	0x15686
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14c26
-	.8byte	.LBB1870
-	.8byte	.LBE1870-.LBB1870
+	.8byte	.LBB1868
+	.8byte	.LBE1868-.LBB1868
 	.byte	0x1
 	.2byte	0xb70
 	.4byte	0xfa97
@@ -42132,8 +42165,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14c37
 	.uleb128 0x5e
 	.4byte	0x14c50
-	.8byte	.LBB1871
-	.8byte	.LBE1871-.LBB1871
+	.8byte	.LBB1869
+	.8byte	.LBE1869-.LBB1869
 	.byte	0x11
 	.2byte	0x2e7
 	.uleb128 0x55
@@ -42141,14 +42174,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14c61
 	.uleb128 0x4f
-	.8byte	.LVL749
+	.8byte	.LVL754
 	.4byte	0x15692
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14c26
-	.8byte	.LBB1873
-	.8byte	.LBE1873-.LBB1873
+	.8byte	.LBB1871
+	.8byte	.LBE1871-.LBB1871
 	.byte	0x1
 	.2byte	0xb7e
 	.4byte	0xfaee
@@ -42158,8 +42191,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14c37
 	.uleb128 0x5e
 	.4byte	0x14c50
-	.8byte	.LBB1874
-	.8byte	.LBE1874-.LBB1874
+	.8byte	.LBB1872
+	.8byte	.LBE1872-.LBB1872
 	.byte	0x11
 	.2byte	0x2e7
 	.uleb128 0x55
@@ -42167,79 +42200,79 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x14c61
 	.uleb128 0x4f
-	.8byte	.LVL762
+	.8byte	.LVL767
 	.4byte	0x15692
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL714
+	.8byte	.LVL719
 	.4byte	0x1569f
 	.uleb128 0x4f
-	.8byte	.LVL716
+	.8byte	.LVL721
 	.4byte	0x1569f
 	.uleb128 0x4f
-	.8byte	.LVL718
+	.8byte	.LVL723
 	.4byte	0x156ab
 	.uleb128 0x4f
-	.8byte	.LVL723
+	.8byte	.LVL728
 	.4byte	0x156ab
 	.uleb128 0x4f
-	.8byte	.LVL727
+	.8byte	.LVL732
 	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL728
+	.8byte	.LVL733
 	.4byte	0x156b8
 	.uleb128 0x4f
-	.8byte	.LVL733
+	.8byte	.LVL738
 	.4byte	0x156c4
 	.uleb128 0x4f
-	.8byte	.LVL734
+	.8byte	.LVL739
 	.4byte	0x156c4
 	.uleb128 0x4f
-	.8byte	.LVL746
+	.8byte	.LVL751
 	.4byte	0x156d0
 	.uleb128 0x4f
-	.8byte	.LVL748
+	.8byte	.LVL753
 	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL753
+	.8byte	.LVL758
 	.4byte	0x156dc
 	.uleb128 0x4f
-	.8byte	.LVL756
+	.8byte	.LVL761
 	.4byte	0x1567a
 	.uleb128 0x4f
-	.8byte	.LVL758
+	.8byte	.LVL763
 	.4byte	0x156dc
 	.uleb128 0x4f
-	.8byte	.LVL759
+	.8byte	.LVL764
 	.4byte	0x15686
 	.uleb128 0x4f
-	.8byte	.LVL761
+	.8byte	.LVL766
 	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL765
+	.8byte	.LVL770
 	.4byte	0x156dc
 	.uleb128 0x4f
-	.8byte	.LVL768
+	.8byte	.LVL773
 	.4byte	0x1567a
 	.uleb128 0x4f
-	.8byte	.LVL770
+	.8byte	.LVL775
 	.4byte	0x156dc
 	.uleb128 0x4f
-	.8byte	.LVL771
+	.8byte	.LVL776
 	.4byte	0x15686
 	.uleb128 0x4f
-	.8byte	.LVL796
+	.8byte	.LVL801
 	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL799
+	.8byte	.LVL804
 	.4byte	0x155fe
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14cfa
-	.8byte	.LBB1879
-	.8byte	.LBE1879-.LBB1879
+	.8byte	.LBB1877
+	.8byte	.LBE1877-.LBB1877
 	.byte	0x1
 	.2byte	0xc2d
 	.4byte	0xfc4a
@@ -42249,8 +42282,8 @@ __exitcall_ebc_exit:
 	.4byte	0x14d07
 	.uleb128 0x5d
 	.4byte	0x14e02
-	.8byte	.LBB1880
-	.8byte	.LBE1880-.LBB1880
+	.8byte	.LBB1878
+	.8byte	.LBE1878-.LBB1878
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x55
@@ -42261,91 +42294,91 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x54
 	.4byte	0xffb3
-	.8byte	.LBB1882
-	.8byte	.LBE1882-.LBB1882
+	.8byte	.LBB1880
+	.8byte	.LBE1880-.LBB1880
 	.byte	0x1
 	.2byte	0xc30
 	.4byte	0xfce1
 	.uleb128 0x55
 	.4byte	0xffc4
 	.uleb128 0x4f
-	.8byte	.LVL735
+	.8byte	.LVL740
 	.4byte	0x156e6
 	.uleb128 0x4f
-	.8byte	.LVL736
+	.8byte	.LVL741
 	.4byte	0x156e6
 	.uleb128 0x4f
-	.8byte	.LVL737
+	.8byte	.LVL742
 	.4byte	0x156f2
 	.uleb128 0x4f
-	.8byte	.LVL738
+	.8byte	.LVL743
 	.4byte	0x156f2
 	.uleb128 0x4f
-	.8byte	.LVL739
+	.8byte	.LVL744
 	.4byte	0x156f2
 	.uleb128 0x4f
-	.8byte	.LVL740
+	.8byte	.LVL745
 	.4byte	0x156f2
 	.uleb128 0x4f
-	.8byte	.LVL741
+	.8byte	.LVL746
 	.4byte	0x156f2
 	.uleb128 0x4f
-	.8byte	.LVL742
+	.8byte	.LVL747
 	.4byte	0x156f2
 	.uleb128 0x4f
-	.8byte	.LVL743
+	.8byte	.LVL748
 	.4byte	0x156f2
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL621
+	.8byte	.LVL626
 	.4byte	0x155b7
 	.uleb128 0x4f
-	.8byte	.LVL622
+	.8byte	.LVL627
 	.4byte	0x156ff
 	.uleb128 0x4f
-	.8byte	.LVL624
+	.8byte	.LVL629
 	.4byte	0x1570b
 	.uleb128 0x4f
-	.8byte	.LVL630
+	.8byte	.LVL635
 	.4byte	0x15718
 	.uleb128 0x4f
-	.8byte	.LVL633
+	.8byte	.LVL638
 	.4byte	0x15725
 	.uleb128 0x4f
-	.8byte	.LVL634
+	.8byte	.LVL639
 	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL642
+	.8byte	.LVL647
 	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL676
+	.8byte	.LVL681
 	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL678
+	.8byte	.LVL683
 	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL681
+	.8byte	.LVL686
 	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL683
+	.8byte	.LVL688
 	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL686
+	.8byte	.LVL691
 	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL744
+	.8byte	.LVL749
 	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL774
+	.8byte	.LVL779
 	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL782
+	.8byte	.LVL787
 	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL787
+	.8byte	.LVL792
 	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL801
+	.8byte	.LVL806
 	.4byte	0x15732
 	.byte	0
 	.uleb128 0x64
@@ -42580,8 +42613,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0xaa7
 	.4byte	0x2ee
-	.8byte	.LFB2855
-	.8byte	.LFE2855-.LFB2855
+	.8byte	.LFB2854
+	.8byte	.LFE2854-.LFB2854
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x10031
@@ -42604,7 +42637,7 @@ __exitcall_ebc_exit:
 	.4byte	0x21e
 	.4byte	.LLST88
 	.uleb128 0x4f
-	.8byte	.LVL331
+	.8byte	.LVL336
 	.4byte	0x1573c
 	.byte	0
 	.uleb128 0x50
@@ -42612,8 +42645,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0xa9e
 	.4byte	0x2ee
-	.8byte	.LFB2854
-	.8byte	.LFE2854-.LFB2854
+	.8byte	.LFB2853
+	.8byte	.LFE2853-.LFB2853
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x10091
@@ -42636,7 +42669,7 @@ __exitcall_ebc_exit:
 	.4byte	0x21e
 	.4byte	.LLST91
 	.uleb128 0x4f
-	.8byte	.LVL336
+	.8byte	.LVL341
 	.4byte	0x15748
 	.byte	0
 	.uleb128 0x50
@@ -42644,8 +42677,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0xa95
 	.4byte	0x2ee
-	.8byte	.LFB2853
-	.8byte	.LFE2853-.LFB2853
+	.8byte	.LFB2852
+	.8byte	.LFE2852-.LFB2852
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x100f1
@@ -42668,7 +42701,7 @@ __exitcall_ebc_exit:
 	.4byte	0x21e
 	.4byte	.LLST94
 	.uleb128 0x4f
-	.8byte	.LVL341
+	.8byte	.LVL346
 	.4byte	0x15748
 	.byte	0
 	.uleb128 0x50
@@ -42676,8 +42709,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0xa7d
 	.4byte	0x2ee
-	.8byte	.LFB2852
-	.8byte	.LFE2852-.LFB2852
+	.8byte	.LFB2851
+	.8byte	.LFE2851-.LFB2851
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x101c1
@@ -42723,19 +42756,19 @@ __exitcall_ebc_exit:
 	.2byte	0xa82
 	.4byte	0xc6
 	.uleb128 0x4f
-	.8byte	.LVL367
+	.8byte	.LVL372
 	.4byte	0x15755
 	.uleb128 0x4f
-	.8byte	.LVL369
+	.8byte	.LVL374
 	.4byte	0x15762
 	.uleb128 0x4f
-	.8byte	.LVL374
+	.8byte	.LVL379
 	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL377
+	.8byte	.LVL382
 	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL378
+	.8byte	.LVL383
 	.4byte	0x15732
 	.byte	0
 	.uleb128 0x51
@@ -42743,8 +42776,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0xa71
 	.4byte	0x2ee
-	.8byte	.LFB2851
-	.8byte	.LFE2851-.LFB2851
+	.8byte	.LFB2850
+	.8byte	.LFE2850-.LFB2850
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x1025b
@@ -42777,17 +42810,17 @@ __exitcall_ebc_exit:
 	.2byte	0xa76
 	.4byte	0xc6
 	.uleb128 0x54
-	.4byte	0x149a3
-	.8byte	.LBB1322
-	.8byte	.LBE1322-.LBB1322
+	.4byte	0x149b0
+	.8byte	.LBB1320
+	.8byte	.LBE1320-.LBB1320
 	.byte	0x1
 	.2byte	0xa78
 	.4byte	0x1024d
 	.uleb128 0x55
-	.4byte	0x149b3
+	.4byte	0x149c0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL346
+	.8byte	.LVL351
 	.4byte	0x15748
 	.byte	0
 	.uleb128 0x51
@@ -42795,8 +42828,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0xa63
 	.4byte	0x2ee
-	.8byte	.LFB2850
-	.8byte	.LFE2850-.LFB2850
+	.8byte	.LFB2849
+	.8byte	.LFE2849-.LFB2849
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x10304
@@ -42832,22 +42865,22 @@ __exitcall_ebc_exit:
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x5c
-	.4byte	0x149c0
-	.8byte	.LBB1324
+	.4byte	0x149cd
+	.8byte	.LBB1322
 	.4byte	.Ldebug_ranges0+0x740
 	.byte	0x1
 	.2byte	0xa6a
 	.4byte	0x102e9
 	.uleb128 0x55
-	.4byte	0x149dc
+	.4byte	0x149e9
 	.uleb128 0x55
-	.4byte	0x149d0
+	.4byte	0x149dd
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL353
+	.8byte	.LVL358
 	.4byte	0x15748
 	.uleb128 0x4f
-	.8byte	.LVL356
+	.8byte	.LVL361
 	.4byte	0x15732
 	.byte	0
 	.uleb128 0x50
@@ -42855,8 +42888,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0xa58
 	.4byte	0x2ee
-	.8byte	.LFB2849
-	.8byte	.LFE2849-.LFB2849
+	.8byte	.LFB2848
+	.8byte	.LFE2848-.LFB2848
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x10370
@@ -42884,7 +42917,7 @@ __exitcall_ebc_exit:
 	.2byte	0xa5c
 	.4byte	0xe563
 	.uleb128 0x4f
-	.8byte	.LVL361
+	.8byte	.LVL366
 	.4byte	0x15748
 	.byte	0
 	.uleb128 0x50
@@ -42892,8 +42925,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0xa4d
 	.4byte	0x2ee
-	.8byte	.LFB2848
-	.8byte	.LFE2848-.LFB2848
+	.8byte	.LFB2847
+	.8byte	.LFE2847-.LFB2847
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x103e9
@@ -42921,10 +42954,10 @@ __exitcall_ebc_exit:
 	.2byte	0xa51
 	.4byte	0x56
 	.uleb128 0x4f
-	.8byte	.LVL380
+	.8byte	.LVL385
 	.4byte	0x1576e
 	.uleb128 0x4f
-	.8byte	.LVL381
+	.8byte	.LVL386
 	.4byte	0x15748
 	.byte	0
 	.uleb128 0x64
@@ -42950,8 +42983,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0xa2a
 	.4byte	0xc6
-	.8byte	.LFB2846
-	.8byte	.LFE2846-.LFB2846
+	.8byte	.LFB2845
+	.8byte	.LFE2845-.LFB2845
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x1047b
@@ -43003,8 +43036,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0xa04
 	.4byte	0xc6
-	.8byte	.LFB2844
-	.8byte	.LFE2844-.LFB2844
+	.8byte	.LFB2843
+	.8byte	.LFE2843-.LFB2843
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x1050d
@@ -43037,8 +43070,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x934
 	.4byte	0x199
-	.8byte	.LFB2843
-	.8byte	.LFE2843-.LFB2843
+	.8byte	.LFB2842
+	.8byte	.LFE2842-.LFB2842
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x1198c
@@ -43108,7 +43141,7 @@ __exitcall_ebc_exit:
 	.4byte	0x1199c
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35232
+	.8byte	__func__.35231
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x1a0
 	.4byte	0x10678
@@ -43138,8 +43171,8 @@ __exitcall_ebc_exit:
 	.2byte	0x98d
 	.4byte	0x199
 	.uleb128 0x6d
-	.8byte	.LBB1083
-	.8byte	.LBE1083-.LBB1083
+	.8byte	.LBB1081
+	.8byte	.LBE1081-.LBB1081
 	.4byte	0x1065c
 	.uleb128 0x5a
 	.4byte	.LASF3094
@@ -43164,7 +43197,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0x14ad2
-	.8byte	.LBB1019
+	.8byte	.LBB1017
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
 	.2byte	0x9f6
@@ -43177,7 +43210,7 @@ __exitcall_ebc_exit:
 	.4byte	0x14ae2
 	.uleb128 0x6e
 	.4byte	0x14b36
-	.8byte	.LBB1020
+	.8byte	.LBB1018
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
@@ -43189,7 +43222,7 @@ __exitcall_ebc_exit:
 	.4byte	0x14b46
 	.uleb128 0x6f
 	.4byte	0x14bda
-	.8byte	.LBB1022
+	.8byte	.LBB1020
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
@@ -43209,14 +43242,14 @@ __exitcall_ebc_exit:
 	.4byte	.LLST23
 	.uleb128 0x71
 	.4byte	0x1502a
-	.8byte	.LBB1024
-	.8byte	.LBE1024-.LBB1024
+	.8byte	.LBB1022
+	.8byte	.LBE1022-.LBB1022
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10734
 	.uleb128 0x57
-	.8byte	.LBB1025
-	.8byte	.LBE1025-.LBB1025
+	.8byte	.LBB1023
+	.8byte	.LBE1023-.LBB1023
 	.uleb128 0x61
 	.4byte	0x1503a
 	.4byte	.LLST24
@@ -43224,8 +43257,8 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x71
 	.4byte	0x14ffc
-	.8byte	.LBB1026
-	.8byte	.LBE1026-.LBB1026
+	.8byte	.LBB1024
+	.8byte	.LBE1024-.LBB1024
 	.byte	0x6
 	.byte	0x55
 	.4byte	0x1077c
@@ -43235,8 +43268,8 @@ __exitcall_ebc_exit:
 	.4byte	0x1500c
 	.uleb128 0x5d
 	.4byte	0x1513e
-	.8byte	.LBB1027
-	.8byte	.LBE1027-.LBB1027
+	.8byte	.LBB1025
+	.8byte	.LBE1025-.LBB1025
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
@@ -43246,14 +43279,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x57
-	.8byte	.LBB1029
-	.8byte	.LBE1029-.LBB1029
+	.8byte	.LBB1027
+	.8byte	.LBE1027-.LBB1027
 	.uleb128 0x58
 	.4byte	0x14c19
 	.uleb128 0x5d
 	.4byte	0x150b1
-	.8byte	.LBB1030
-	.8byte	.LBE1030-.LBB1030
+	.8byte	.LBB1028
+	.8byte	.LBE1028-.LBB1028
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
@@ -43261,8 +43294,8 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1031
-	.8byte	.LBE1031-.LBB1031
+	.8byte	.LBB1029
+	.8byte	.LBE1029-.LBB1029
 	.uleb128 0x58
 	.4byte	0x150d9
 	.byte	0
@@ -43272,16 +43305,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x71
 	.4byte	0x14ba5
-	.8byte	.LBB1036
-	.8byte	.LBE1036-.LBB1036
+	.8byte	.LBB1034
+	.8byte	.LBE1034-.LBB1034
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x10889
 	.uleb128 0x55
 	.4byte	0x14bb5
 	.uleb128 0x57
-	.8byte	.LBB1037
-	.8byte	.LBE1037-.LBB1037
+	.8byte	.LBB1035
+	.8byte	.LBE1035-.LBB1035
 	.uleb128 0x61
 	.4byte	0x14bc1
 	.4byte	.LLST25
@@ -43293,8 +43326,8 @@ __exitcall_ebc_exit:
 	.4byte	.LLST26
 	.uleb128 0x5d
 	.4byte	0x150b1
-	.8byte	.LBB1039
-	.8byte	.LBE1039-.LBB1039
+	.8byte	.LBB1037
+	.8byte	.LBE1037-.LBB1037
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
@@ -43302,8 +43335,8 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1040
-	.8byte	.LBE1040-.LBB1040
+	.8byte	.LBB1038
+	.8byte	.LBE1038-.LBB1038
 	.uleb128 0x58
 	.4byte	0x150d9
 	.byte	0
@@ -43311,13 +43344,13 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5d
 	.4byte	0x1502a
-	.8byte	.LBB1041
-	.8byte	.LBE1041-.LBB1041
+	.8byte	.LBB1039
+	.8byte	.LBE1039-.LBB1039
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1042
-	.8byte	.LBE1042-.LBB1042
+	.8byte	.LBB1040
+	.8byte	.LBE1040-.LBB1040
 	.uleb128 0x61
 	.4byte	0x1503a
 	.4byte	.LLST27
@@ -43332,7 +43365,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0x14b04
-	.8byte	.LBB1052
+	.8byte	.LBB1050
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
 	.2byte	0x978
@@ -43345,7 +43378,7 @@ __exitcall_ebc_exit:
 	.4byte	0x14b14
 	.uleb128 0x6e
 	.4byte	0x14b68
-	.8byte	.LBB1053
+	.8byte	.LBB1051
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
@@ -43361,7 +43394,7 @@ __exitcall_ebc_exit:
 	.4byte	0x14b99
 	.uleb128 0x6f
 	.4byte	0x14bda
-	.8byte	.LBB1055
+	.8byte	.LBB1053
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
@@ -43381,29 +43414,29 @@ __exitcall_ebc_exit:
 	.4byte	.LLST30
 	.uleb128 0x71
 	.4byte	0x1502a
-	.8byte	.LBB1057
-	.8byte	.LBE1057-.LBB1057
+	.8byte	.LBB1055
+	.8byte	.LBE1055-.LBB1055
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x1095e
 	.uleb128 0x57
-	.8byte	.LBB1058
-	.8byte	.LBE1058-.LBB1058
+	.8byte	.LBB1056
+	.8byte	.LBE1056-.LBB1056
 	.uleb128 0x61
 	.4byte	0x1503a
 	.4byte	.LLST31
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1059
-	.8byte	.LBE1059-.LBB1059
+	.8byte	.LBB1057
+	.8byte	.LBE1057-.LBB1057
 	.4byte	0x109b2
 	.uleb128 0x58
 	.4byte	0x14c19
 	.uleb128 0x5d
 	.4byte	0x150b1
-	.8byte	.LBB1060
-	.8byte	.LBE1060-.LBB1060
+	.8byte	.LBB1058
+	.8byte	.LBE1058-.LBB1058
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
@@ -43411,8 +43444,8 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1061
-	.8byte	.LBE1061-.LBB1061
+	.8byte	.LBB1059
+	.8byte	.LBE1059-.LBB1059
 	.uleb128 0x58
 	.4byte	0x150d9
 	.byte	0
@@ -43420,8 +43453,8 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5d
 	.4byte	0x14ffc
-	.8byte	.LBB1062
-	.8byte	.LBE1062-.LBB1062
+	.8byte	.LBB1060
+	.8byte	.LBE1060-.LBB1060
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
@@ -43430,8 +43463,8 @@ __exitcall_ebc_exit:
 	.4byte	0x1500c
 	.uleb128 0x5d
 	.4byte	0x1513e
-	.8byte	.LBB1063
-	.8byte	.LBE1063-.LBB1063
+	.8byte	.LBB1061
+	.8byte	.LBE1061-.LBB1061
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
@@ -43444,16 +43477,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x71
 	.4byte	0x14ba5
-	.8byte	.LBB1067
-	.8byte	.LBE1067-.LBB1067
+	.8byte	.LBB1065
+	.8byte	.LBE1065-.LBB1065
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x10ab3
 	.uleb128 0x55
 	.4byte	0x14bb5
 	.uleb128 0x57
-	.8byte	.LBB1068
-	.8byte	.LBE1068-.LBB1068
+	.8byte	.LBB1066
+	.8byte	.LBE1066-.LBB1066
 	.uleb128 0x61
 	.4byte	0x14bc1
 	.4byte	.LLST32
@@ -43465,8 +43498,8 @@ __exitcall_ebc_exit:
 	.4byte	.LLST33
 	.uleb128 0x5d
 	.4byte	0x150b1
-	.8byte	.LBB1070
-	.8byte	.LBE1070-.LBB1070
+	.8byte	.LBB1068
+	.8byte	.LBE1068-.LBB1068
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
@@ -43474,8 +43507,8 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1071
-	.8byte	.LBE1071-.LBB1071
+	.8byte	.LBB1069
+	.8byte	.LBE1069-.LBB1069
 	.uleb128 0x58
 	.4byte	0x150d9
 	.byte	0
@@ -43483,13 +43516,13 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5d
 	.4byte	0x1502a
-	.8byte	.LBB1072
-	.8byte	.LBE1072-.LBB1072
+	.8byte	.LBB1070
+	.8byte	.LBE1070-.LBB1070
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1073
-	.8byte	.LBE1073-.LBB1073
+	.8byte	.LBB1071
+	.8byte	.LBE1071-.LBB1071
 	.uleb128 0x61
 	.4byte	0x1503a
 	.4byte	.LLST34
@@ -43505,7 +43538,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0x14b04
-	.8byte	.LBB1087
+	.8byte	.LBB1085
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
 	.2byte	0x994
@@ -43518,7 +43551,7 @@ __exitcall_ebc_exit:
 	.4byte	0x14b14
 	.uleb128 0x6e
 	.4byte	0x14b68
-	.8byte	.LBB1088
+	.8byte	.LBB1086
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
@@ -43534,7 +43567,7 @@ __exitcall_ebc_exit:
 	.4byte	0x14b99
 	.uleb128 0x6f
 	.4byte	0x14bda
-	.8byte	.LBB1090
+	.8byte	.LBB1088
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
@@ -43554,29 +43587,29 @@ __exitcall_ebc_exit:
 	.4byte	.LLST38
 	.uleb128 0x71
 	.4byte	0x1502a
-	.8byte	.LBB1092
-	.8byte	.LBE1092-.LBB1092
+	.8byte	.LBB1090
+	.8byte	.LBE1090-.LBB1090
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10b89
 	.uleb128 0x57
-	.8byte	.LBB1093
-	.8byte	.LBE1093-.LBB1093
+	.8byte	.LBB1091
+	.8byte	.LBE1091-.LBB1091
 	.uleb128 0x61
 	.4byte	0x1503a
 	.4byte	.LLST39
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1094
-	.8byte	.LBE1094-.LBB1094
+	.8byte	.LBB1092
+	.8byte	.LBE1092-.LBB1092
 	.4byte	0x10bdd
 	.uleb128 0x58
 	.4byte	0x14c19
 	.uleb128 0x5d
 	.4byte	0x150b1
-	.8byte	.LBB1095
-	.8byte	.LBE1095-.LBB1095
+	.8byte	.LBB1093
+	.8byte	.LBE1093-.LBB1093
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
@@ -43584,8 +43617,8 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1096
-	.8byte	.LBE1096-.LBB1096
+	.8byte	.LBB1094
+	.8byte	.LBE1094-.LBB1094
 	.uleb128 0x58
 	.4byte	0x150d9
 	.byte	0
@@ -43593,8 +43626,8 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5d
 	.4byte	0x14ffc
-	.8byte	.LBB1097
-	.8byte	.LBE1097-.LBB1097
+	.8byte	.LBB1095
+	.8byte	.LBE1095-.LBB1095
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
@@ -43603,8 +43636,8 @@ __exitcall_ebc_exit:
 	.4byte	0x1500c
 	.uleb128 0x5d
 	.4byte	0x1513e
-	.8byte	.LBB1098
-	.8byte	.LBE1098-.LBB1098
+	.8byte	.LBB1096
+	.8byte	.LBE1096-.LBB1096
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
@@ -43617,16 +43650,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x71
 	.4byte	0x14ba5
-	.8byte	.LBB1102
-	.8byte	.LBE1102-.LBB1102
+	.8byte	.LBB1100
+	.8byte	.LBE1100-.LBB1100
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x10cde
 	.uleb128 0x55
 	.4byte	0x14bb5
 	.uleb128 0x57
-	.8byte	.LBB1103
-	.8byte	.LBE1103-.LBB1103
+	.8byte	.LBB1101
+	.8byte	.LBE1101-.LBB1101
 	.uleb128 0x61
 	.4byte	0x14bc1
 	.4byte	.LLST40
@@ -43638,8 +43671,8 @@ __exitcall_ebc_exit:
 	.4byte	.LLST41
 	.uleb128 0x5d
 	.4byte	0x150b1
-	.8byte	.LBB1105
-	.8byte	.LBE1105-.LBB1105
+	.8byte	.LBB1103
+	.8byte	.LBE1103-.LBB1103
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
@@ -43647,8 +43680,8 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1106
-	.8byte	.LBE1106-.LBB1106
+	.8byte	.LBB1104
+	.8byte	.LBE1104-.LBB1104
 	.uleb128 0x58
 	.4byte	0x150d9
 	.byte	0
@@ -43656,13 +43689,13 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5d
 	.4byte	0x1502a
-	.8byte	.LBB1107
-	.8byte	.LBE1107-.LBB1107
+	.8byte	.LBB1105
+	.8byte	.LBE1105-.LBB1105
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1108
-	.8byte	.LBE1108-.LBB1108
+	.8byte	.LBB1106
+	.8byte	.LBE1106-.LBB1106
 	.uleb128 0x61
 	.4byte	0x1503a
 	.4byte	.LLST42
@@ -43678,7 +43711,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0x14ad2
-	.8byte	.LBB1117
+	.8byte	.LBB1115
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
 	.2byte	0x95d
@@ -43691,7 +43724,7 @@ __exitcall_ebc_exit:
 	.4byte	0x14ae2
 	.uleb128 0x6e
 	.4byte	0x14b36
-	.8byte	.LBB1118
+	.8byte	.LBB1116
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
@@ -43703,7 +43736,7 @@ __exitcall_ebc_exit:
 	.4byte	0x14b46
 	.uleb128 0x6f
 	.4byte	0x14bda
-	.8byte	.LBB1120
+	.8byte	.LBB1118
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
@@ -43723,29 +43756,29 @@ __exitcall_ebc_exit:
 	.4byte	.LLST45
 	.uleb128 0x71
 	.4byte	0x1502a
-	.8byte	.LBB1122
-	.8byte	.LBE1122-.LBB1122
+	.8byte	.LBB1120
+	.8byte	.LBE1120-.LBB1120
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10daa
 	.uleb128 0x57
-	.8byte	.LBB1123
-	.8byte	.LBE1123-.LBB1123
+	.8byte	.LBB1121
+	.8byte	.LBE1121-.LBB1121
 	.uleb128 0x61
 	.4byte	0x1503a
 	.4byte	.LLST46
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1124
-	.8byte	.LBE1124-.LBB1124
+	.8byte	.LBB1122
+	.8byte	.LBE1122-.LBB1122
 	.4byte	0x10dfe
 	.uleb128 0x58
 	.4byte	0x14c19
 	.uleb128 0x5d
 	.4byte	0x150b1
-	.8byte	.LBB1125
-	.8byte	.LBE1125-.LBB1125
+	.8byte	.LBB1123
+	.8byte	.LBE1123-.LBB1123
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
@@ -43753,8 +43786,8 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1126
-	.8byte	.LBE1126-.LBB1126
+	.8byte	.LBB1124
+	.8byte	.LBE1124-.LBB1124
 	.uleb128 0x58
 	.4byte	0x150d9
 	.byte	0
@@ -43762,8 +43795,8 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5d
 	.4byte	0x14ffc
-	.8byte	.LBB1127
-	.8byte	.LBE1127-.LBB1127
+	.8byte	.LBB1125
+	.8byte	.LBE1125-.LBB1125
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
@@ -43772,8 +43805,8 @@ __exitcall_ebc_exit:
 	.4byte	0x1500c
 	.uleb128 0x5d
 	.4byte	0x1513e
-	.8byte	.LBB1128
-	.8byte	.LBE1128-.LBB1128
+	.8byte	.LBB1126
+	.8byte	.LBE1126-.LBB1126
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
@@ -43786,16 +43819,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x71
 	.4byte	0x14ba5
-	.8byte	.LBB1134
-	.8byte	.LBE1134-.LBB1134
+	.8byte	.LBB1132
+	.8byte	.LBE1132-.LBB1132
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x10eff
 	.uleb128 0x55
 	.4byte	0x14bb5
 	.uleb128 0x57
-	.8byte	.LBB1135
-	.8byte	.LBE1135-.LBB1135
+	.8byte	.LBB1133
+	.8byte	.LBE1133-.LBB1133
 	.uleb128 0x61
 	.4byte	0x14bc1
 	.4byte	.LLST47
@@ -43807,8 +43840,8 @@ __exitcall_ebc_exit:
 	.4byte	.LLST48
 	.uleb128 0x5d
 	.4byte	0x150b1
-	.8byte	.LBB1137
-	.8byte	.LBE1137-.LBB1137
+	.8byte	.LBB1135
+	.8byte	.LBE1135-.LBB1135
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
@@ -43816,8 +43849,8 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1138
-	.8byte	.LBE1138-.LBB1138
+	.8byte	.LBB1136
+	.8byte	.LBE1136-.LBB1136
 	.uleb128 0x58
 	.4byte	0x150d9
 	.byte	0
@@ -43825,13 +43858,13 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5d
 	.4byte	0x1502a
-	.8byte	.LBB1139
-	.8byte	.LBE1139-.LBB1139
+	.8byte	.LBB1137
+	.8byte	.LBE1137-.LBB1137
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1140
-	.8byte	.LBE1140-.LBB1140
+	.8byte	.LBB1138
+	.8byte	.LBE1138-.LBB1138
 	.uleb128 0x61
 	.4byte	0x1503a
 	.4byte	.LLST49
@@ -43846,7 +43879,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0x14b04
-	.8byte	.LBB1151
+	.8byte	.LBB1149
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
 	.2byte	0x9b1
@@ -43859,7 +43892,7 @@ __exitcall_ebc_exit:
 	.4byte	0x14b14
 	.uleb128 0x6e
 	.4byte	0x14b68
-	.8byte	.LBB1152
+	.8byte	.LBB1150
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
@@ -43876,7 +43909,7 @@ __exitcall_ebc_exit:
 	.4byte	.LLST50
 	.uleb128 0x6f
 	.4byte	0x14bda
-	.8byte	.LBB1154
+	.8byte	.LBB1152
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
@@ -43896,29 +43929,29 @@ __exitcall_ebc_exit:
 	.4byte	.LLST53
 	.uleb128 0x71
 	.4byte	0x1502a
-	.8byte	.LBB1156
-	.8byte	.LBE1156-.LBB1156
+	.8byte	.LBB1154
+	.8byte	.LBE1154-.LBB1154
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10fd8
 	.uleb128 0x57
-	.8byte	.LBB1157
-	.8byte	.LBE1157-.LBB1157
+	.8byte	.LBB1155
+	.8byte	.LBE1155-.LBB1155
 	.uleb128 0x61
 	.4byte	0x1503a
 	.4byte	.LLST54
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1158
-	.8byte	.LBE1158-.LBB1158
+	.8byte	.LBB1156
+	.8byte	.LBE1156-.LBB1156
 	.4byte	0x1102c
 	.uleb128 0x58
 	.4byte	0x14c19
 	.uleb128 0x5d
 	.4byte	0x150b1
-	.8byte	.LBB1159
-	.8byte	.LBE1159-.LBB1159
+	.8byte	.LBB1157
+	.8byte	.LBE1157-.LBB1157
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
@@ -43926,8 +43959,8 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1160
-	.8byte	.LBE1160-.LBB1160
+	.8byte	.LBB1158
+	.8byte	.LBE1158-.LBB1158
 	.uleb128 0x58
 	.4byte	0x150d9
 	.byte	0
@@ -43935,8 +43968,8 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5d
 	.4byte	0x14ffc
-	.8byte	.LBB1161
-	.8byte	.LBE1161-.LBB1161
+	.8byte	.LBB1159
+	.8byte	.LBE1159-.LBB1159
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
@@ -43945,8 +43978,8 @@ __exitcall_ebc_exit:
 	.4byte	0x1500c
 	.uleb128 0x5d
 	.4byte	0x1513e
-	.8byte	.LBB1162
-	.8byte	.LBE1162-.LBB1162
+	.8byte	.LBB1160
+	.8byte	.LBE1160-.LBB1160
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
@@ -43959,16 +43992,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x71
 	.4byte	0x14ba5
-	.8byte	.LBB1168
-	.8byte	.LBE1168-.LBB1168
+	.8byte	.LBB1166
+	.8byte	.LBE1166-.LBB1166
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x1112d
 	.uleb128 0x55
 	.4byte	0x14bb5
 	.uleb128 0x57
-	.8byte	.LBB1169
-	.8byte	.LBE1169-.LBB1169
+	.8byte	.LBB1167
+	.8byte	.LBE1167-.LBB1167
 	.uleb128 0x61
 	.4byte	0x14bc1
 	.4byte	.LLST55
@@ -43980,8 +44013,8 @@ __exitcall_ebc_exit:
 	.4byte	.LLST56
 	.uleb128 0x5d
 	.4byte	0x150b1
-	.8byte	.LBB1171
-	.8byte	.LBE1171-.LBB1171
+	.8byte	.LBB1169
+	.8byte	.LBE1169-.LBB1169
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
@@ -43989,8 +44022,8 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1172
-	.8byte	.LBE1172-.LBB1172
+	.8byte	.LBB1170
+	.8byte	.LBE1170-.LBB1170
 	.uleb128 0x58
 	.4byte	0x150d9
 	.byte	0
@@ -43998,13 +44031,13 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5d
 	.4byte	0x1502a
-	.8byte	.LBB1173
-	.8byte	.LBE1173-.LBB1173
+	.8byte	.LBB1171
+	.8byte	.LBE1171-.LBB1171
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1174
-	.8byte	.LBE1174-.LBB1174
+	.8byte	.LBB1172
+	.8byte	.LBE1172-.LBB1172
 	.uleb128 0x61
 	.4byte	0x1503a
 	.4byte	.LLST57
@@ -44023,7 +44056,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0x14ad2
-	.8byte	.LBB1187
+	.8byte	.LBB1185
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
 	.2byte	0x9cf
@@ -44036,7 +44069,7 @@ __exitcall_ebc_exit:
 	.4byte	0x14ae2
 	.uleb128 0x6e
 	.4byte	0x14b36
-	.8byte	.LBB1188
+	.8byte	.LBB1186
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
@@ -44048,7 +44081,7 @@ __exitcall_ebc_exit:
 	.4byte	0x14b46
 	.uleb128 0x6e
 	.4byte	0x14bda
-	.8byte	.LBB1190
+	.8byte	.LBB1188
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
@@ -44067,13 +44100,13 @@ __exitcall_ebc_exit:
 	.4byte	.LLST58
 	.uleb128 0x5d
 	.4byte	0x1502a
-	.8byte	.LBB1192
-	.8byte	.LBE1192-.LBB1192
+	.8byte	.LBB1190
+	.8byte	.LBE1190-.LBB1190
 	.byte	0x6
 	.byte	0x4d
 	.uleb128 0x57
-	.8byte	.LBB1193
-	.8byte	.LBE1193-.LBB1193
+	.8byte	.LBB1191
+	.8byte	.LBE1191-.LBB1191
 	.uleb128 0x61
 	.4byte	0x1503a
 	.4byte	.LLST59
@@ -44085,7 +44118,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0x14ad2
-	.8byte	.LBB1199
+	.8byte	.LBB1197
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
 	.2byte	0x9bf
@@ -44098,7 +44131,7 @@ __exitcall_ebc_exit:
 	.4byte	0x14ae2
 	.uleb128 0x6e
 	.4byte	0x14b36
-	.8byte	.LBB1200
+	.8byte	.LBB1198
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
@@ -44110,7 +44143,7 @@ __exitcall_ebc_exit:
 	.4byte	0x14b46
 	.uleb128 0x6f
 	.4byte	0x14bda
-	.8byte	.LBB1202
+	.8byte	.LBB1200
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
@@ -44130,29 +44163,29 @@ __exitcall_ebc_exit:
 	.4byte	.LLST62
 	.uleb128 0x71
 	.4byte	0x1502a
-	.8byte	.LBB1204
-	.8byte	.LBE1204-.LBB1204
+	.8byte	.LBB1202
+	.8byte	.LBE1202-.LBB1202
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x112b8
 	.uleb128 0x57
-	.8byte	.LBB1205
-	.8byte	.LBE1205-.LBB1205
+	.8byte	.LBB1203
+	.8byte	.LBE1203-.LBB1203
 	.uleb128 0x61
 	.4byte	0x1503a
 	.4byte	.LLST63
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1206
-	.8byte	.LBE1206-.LBB1206
+	.8byte	.LBB1204
+	.8byte	.LBE1204-.LBB1204
 	.4byte	0x1130c
 	.uleb128 0x58
 	.4byte	0x14c19
 	.uleb128 0x5d
 	.4byte	0x150b1
-	.8byte	.LBB1207
-	.8byte	.LBE1207-.LBB1207
+	.8byte	.LBB1205
+	.8byte	.LBE1205-.LBB1205
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
@@ -44160,8 +44193,8 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1208
-	.8byte	.LBE1208-.LBB1208
+	.8byte	.LBB1206
+	.8byte	.LBE1206-.LBB1206
 	.uleb128 0x58
 	.4byte	0x150d9
 	.byte	0
@@ -44169,8 +44202,8 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5d
 	.4byte	0x14ffc
-	.8byte	.LBB1209
-	.8byte	.LBE1209-.LBB1209
+	.8byte	.LBB1207
+	.8byte	.LBE1207-.LBB1207
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
@@ -44179,8 +44212,8 @@ __exitcall_ebc_exit:
 	.4byte	0x1500c
 	.uleb128 0x5d
 	.4byte	0x1513e
-	.8byte	.LBB1210
-	.8byte	.LBE1210-.LBB1210
+	.8byte	.LBB1208
+	.8byte	.LBE1208-.LBB1208
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
@@ -44193,16 +44226,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x71
 	.4byte	0x14ba5
-	.8byte	.LBB1218
-	.8byte	.LBE1218-.LBB1218
+	.8byte	.LBB1216
+	.8byte	.LBE1216-.LBB1216
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x1140d
 	.uleb128 0x55
 	.4byte	0x14bb5
 	.uleb128 0x57
-	.8byte	.LBB1219
-	.8byte	.LBE1219-.LBB1219
+	.8byte	.LBB1217
+	.8byte	.LBE1217-.LBB1217
 	.uleb128 0x61
 	.4byte	0x14bc1
 	.4byte	.LLST64
@@ -44214,8 +44247,8 @@ __exitcall_ebc_exit:
 	.4byte	.LLST65
 	.uleb128 0x5d
 	.4byte	0x150b1
-	.8byte	.LBB1221
-	.8byte	.LBE1221-.LBB1221
+	.8byte	.LBB1219
+	.8byte	.LBE1219-.LBB1219
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
@@ -44223,8 +44256,8 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1222
-	.8byte	.LBE1222-.LBB1222
+	.8byte	.LBB1220
+	.8byte	.LBE1220-.LBB1220
 	.uleb128 0x58
 	.4byte	0x150d9
 	.byte	0
@@ -44232,13 +44265,13 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5d
 	.4byte	0x1502a
-	.8byte	.LBB1223
-	.8byte	.LBE1223-.LBB1223
+	.8byte	.LBB1221
+	.8byte	.LBE1221-.LBB1221
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1224
-	.8byte	.LBE1224-.LBB1224
+	.8byte	.LBB1222
+	.8byte	.LBE1222-.LBB1222
 	.uleb128 0x61
 	.4byte	0x1503a
 	.4byte	.LLST66
@@ -44253,7 +44286,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0x14b04
-	.8byte	.LBB1235
+	.8byte	.LBB1233
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
 	.2byte	0x960
@@ -44266,7 +44299,7 @@ __exitcall_ebc_exit:
 	.4byte	0x14b14
 	.uleb128 0x6e
 	.4byte	0x14b68
-	.8byte	.LBB1236
+	.8byte	.LBB1234
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x93
@@ -44283,7 +44316,7 @@ __exitcall_ebc_exit:
 	.4byte	.LLST67
 	.uleb128 0x6f
 	.4byte	0x14bda
-	.8byte	.LBB1238
+	.8byte	.LBB1236
 	.4byte	.Ldebug_ranges0+0x610
 	.byte	0x9
 	.byte	0x72
@@ -44303,29 +44336,29 @@ __exitcall_ebc_exit:
 	.4byte	.LLST70
 	.uleb128 0x71
 	.4byte	0x1502a
-	.8byte	.LBB1240
-	.8byte	.LBE1240-.LBB1240
+	.8byte	.LBB1238
+	.8byte	.LBE1238-.LBB1238
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x114e6
 	.uleb128 0x57
-	.8byte	.LBB1241
-	.8byte	.LBE1241-.LBB1241
+	.8byte	.LBB1239
+	.8byte	.LBE1239-.LBB1239
 	.uleb128 0x61
 	.4byte	0x1503a
 	.4byte	.LLST71
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1242
-	.8byte	.LBE1242-.LBB1242
+	.8byte	.LBB1240
+	.8byte	.LBE1240-.LBB1240
 	.4byte	0x1153a
 	.uleb128 0x58
 	.4byte	0x14c19
 	.uleb128 0x5d
 	.4byte	0x150b1
-	.8byte	.LBB1243
-	.8byte	.LBE1243-.LBB1243
+	.8byte	.LBB1241
+	.8byte	.LBE1241-.LBB1241
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
@@ -44333,8 +44366,8 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1244
-	.8byte	.LBE1244-.LBB1244
+	.8byte	.LBB1242
+	.8byte	.LBE1242-.LBB1242
 	.uleb128 0x58
 	.4byte	0x150d9
 	.byte	0
@@ -44342,8 +44375,8 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5d
 	.4byte	0x14ffc
-	.8byte	.LBB1245
-	.8byte	.LBE1245-.LBB1245
+	.8byte	.LBB1243
+	.8byte	.LBE1243-.LBB1243
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
@@ -44352,8 +44385,8 @@ __exitcall_ebc_exit:
 	.4byte	0x1500c
 	.uleb128 0x5d
 	.4byte	0x1513e
-	.8byte	.LBB1246
-	.8byte	.LBE1246-.LBB1246
+	.8byte	.LBB1244
+	.8byte	.LBE1244-.LBB1244
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
@@ -44366,16 +44399,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x71
 	.4byte	0x14ba5
-	.8byte	.LBB1250
-	.8byte	.LBE1250-.LBB1250
+	.8byte	.LBB1248
+	.8byte	.LBE1248-.LBB1248
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x1163b
 	.uleb128 0x55
 	.4byte	0x14bb5
 	.uleb128 0x57
-	.8byte	.LBB1251
-	.8byte	.LBE1251-.LBB1251
+	.8byte	.LBB1249
+	.8byte	.LBE1249-.LBB1249
 	.uleb128 0x61
 	.4byte	0x14bc1
 	.4byte	.LLST72
@@ -44387,8 +44420,8 @@ __exitcall_ebc_exit:
 	.4byte	.LLST73
 	.uleb128 0x5d
 	.4byte	0x150b1
-	.8byte	.LBB1253
-	.8byte	.LBE1253-.LBB1253
+	.8byte	.LBB1251
+	.8byte	.LBE1251-.LBB1251
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
@@ -44396,8 +44429,8 @@ __exitcall_ebc_exit:
 	.uleb128 0x55
 	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1254
-	.8byte	.LBE1254-.LBB1254
+	.8byte	.LBB1252
+	.8byte	.LBE1252-.LBB1252
 	.uleb128 0x58
 	.4byte	0x150d9
 	.byte	0
@@ -44405,13 +44438,13 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5d
 	.4byte	0x1502a
-	.8byte	.LBB1255
-	.8byte	.LBE1255-.LBB1255
+	.8byte	.LBB1253
+	.8byte	.LBE1253-.LBB1253
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1256
-	.8byte	.LBE1256-.LBB1256
+	.8byte	.LBB1254
+	.8byte	.LBE1254-.LBB1254
 	.uleb128 0x61
 	.4byte	0x1503a
 	.4byte	.LLST74
@@ -44430,7 +44463,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0x14ad2
-	.8byte	.LBB1266
+	.8byte	.LBB1264
 	.4byte	.Ldebug_ranges0+0x680
 	.byte	0x1
 	.2byte	0x970
@@ -44443,7 +44476,7 @@ __exitcall_ebc_exit:
 	.4byte	0x14ae2
 	.uleb128 0x6e
 	.4byte	0x14b36
-	.8byte	.LBB1267
+	.8byte	.LBB1265
 	.4byte	.Ldebug_ranges0+0x680
 	.byte	0x9
 	.byte	0x9b
@@ -44455,7 +44488,7 @@ __exitcall_ebc_exit:
 	.4byte	0x14b46
 	.uleb128 0x6f
 	.4byte	0x14bda
-	.8byte	.LBB1269
+	.8byte	.LBB1267
 	.4byte	.Ldebug_ranges0+0x6e0
 	.byte	0x9
 	.byte	0x84
@@ -44475,30 +44508,30 @@ __exitcall_ebc_exit:
 	.4byte	.LLST77
 	.uleb128 0x71
 	.4byte	0x1502a
-	.8byte	.LBB1271
-	.8byte	.LBE1271-.LBB1271
+	.8byte	.LBB1269
+	.8byte	.LBE1269-.LBB1269
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x11714
 	.uleb128 0x57
-	.8byte	.LBB1272
-	.8byte	.LBE1272-.LBB1272
+	.8byte	.LBB1270
+	.8byte	.LBE1270-.LBB1270
 	.uleb128 0x61
 	.4byte	0x1503a
 	.4byte	.LLST78
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1273
-	.8byte	.LBE1273-.LBB1273
+	.8byte	.LBB1271
+	.8byte	.LBE1271-.LBB1271
 	.4byte	0x1172f
 	.uleb128 0x58
 	.4byte	0x14c19
 	.byte	0
 	.uleb128 0x5d
 	.4byte	0x14ffc
-	.8byte	.LBB1274
-	.8byte	.LBE1274-.LBB1274
+	.8byte	.LBB1272
+	.8byte	.LBE1272-.LBB1272
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
@@ -44507,8 +44540,8 @@ __exitcall_ebc_exit:
 	.4byte	0x1500c
 	.uleb128 0x5d
 	.4byte	0x1513e
-	.8byte	.LBB1275
-	.8byte	.LBE1275-.LBB1275
+	.8byte	.LBB1273
+	.8byte	.LBE1273-.LBB1273
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
@@ -44521,37 +44554,37 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x71
 	.4byte	0x14ba5
-	.8byte	.LBB1285
-	.8byte	.LBE1285-.LBB1285
+	.8byte	.LBB1283
+	.8byte	.LBE1283-.LBB1283
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x11803
 	.uleb128 0x55
 	.4byte	0x14bb5
 	.uleb128 0x57
-	.8byte	.LBB1286
-	.8byte	.LBE1286-.LBB1286
+	.8byte	.LBB1284
+	.8byte	.LBE1284-.LBB1284
 	.uleb128 0x61
 	.4byte	0x14bc1
 	.4byte	.LLST79
 	.uleb128 0x71
 	.4byte	0x1502a
-	.8byte	.LBB1287
-	.8byte	.LBE1287-.LBB1287
+	.8byte	.LBB1285
+	.8byte	.LBE1285-.LBB1285
 	.byte	0x6
 	.byte	0xfd
 	.4byte	0x117e6
 	.uleb128 0x57
-	.8byte	.LBB1288
-	.8byte	.LBE1288-.LBB1288
+	.8byte	.LBB1286
+	.8byte	.LBE1286-.LBB1286
 	.uleb128 0x61
 	.4byte	0x1503a
 	.4byte	.LLST80
 	.byte	0
 	.byte	0
 	.uleb128 0x57
-	.8byte	.LBB1289
-	.8byte	.LBE1289-.LBB1289
+	.8byte	.LBB1287
+	.8byte	.LBE1287-.LBB1287
 	.uleb128 0x61
 	.4byte	0x14bcd
 	.4byte	.LLST81
@@ -44682,8 +44715,8 @@ __exitcall_ebc_exit:
 	.4byte	.LASF3097
 	.byte	0x1
 	.2byte	0x8eb
-	.8byte	.LFB2841
-	.8byte	.LFE2841-.LFB2841
+	.8byte	.LFB2840
+	.8byte	.LFE2840-.LFB2840
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x11a05
@@ -44695,14 +44728,14 @@ __exitcall_ebc_exit:
 	.4byte	.LLST82
 	.uleb128 0x4f
 	.8byte	.LVL298
-	.4byte	0x1278c
+	.4byte	0x12799
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3098
 	.byte	0x1
 	.2byte	0x8df
-	.8byte	.LFB2840
-	.8byte	.LFE2840-.LFB2840
+	.8byte	.LFB2839
+	.8byte	.LFE2839-.LFB2839
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x11a65
@@ -44719,7 +44752,7 @@ __exitcall_ebc_exit:
 	.4byte	0xe880
 	.uleb128 0x60
 	.4byte	0x14a5c
-	.8byte	.LBB1015
+	.8byte	.LBB1013
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
 	.2byte	0x8e5
@@ -44753,8 +44786,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x766
 	.4byte	0xc6
-	.8byte	.LFB2838
-	.8byte	.LFE2838-.LFB2838
+	.8byte	.LFB2837
+	.8byte	.LFE2837-.LFB2837
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x124a1
@@ -44811,7 +44844,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF3105
 	.byte	0x1
 	.2byte	0x88e
-	.8byte	.L952
+	.8byte	.L962
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x1320
 	.4byte	0x11bdf
@@ -44821,13 +44854,13 @@ __exitcall_ebc_exit:
 	.2byte	0x7c5
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB1983
-	.8byte	.LBE1983-.LBB1983
+	.8byte	.LBB1981
+	.8byte	.LBE1981-.LBB1981
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x7c5
-	.8byte	.L933
+	.8byte	.L943
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
@@ -44851,17 +44884,17 @@ __exitcall_ebc_exit:
 	.4byte	0x199
 	.4byte	.LLST271
 	.uleb128 0x4f
-	.8byte	.LVL1054
+	.8byte	.LVL1059
 	.4byte	0x15793
 	.uleb128 0x4f
-	.8byte	.LVL1055
+	.8byte	.LVL1060
 	.4byte	0x1579f
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL1052
+	.8byte	.LVL1057
 	.4byte	0x157ac
 	.uleb128 0x4f
-	.8byte	.LVL1056
+	.8byte	.LVL1061
 	.4byte	0x157b8
 	.byte	0
 	.byte	0
@@ -44874,13 +44907,13 @@ __exitcall_ebc_exit:
 	.2byte	0x87a
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB1979
-	.8byte	.LBE1979-.LBB1979
+	.8byte	.LBB1977
+	.8byte	.LBE1977-.LBB1977
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x87a
-	.8byte	.L999
+	.8byte	.L1009
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
@@ -44904,17 +44937,17 @@ __exitcall_ebc_exit:
 	.4byte	0x199
 	.4byte	.LLST270
 	.uleb128 0x4f
-	.8byte	.LVL1041
+	.8byte	.LVL1046
 	.4byte	0x15793
 	.uleb128 0x4f
-	.8byte	.LVL1042
+	.8byte	.LVL1047
 	.4byte	0x1579f
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL1039
+	.8byte	.LVL1044
 	.4byte	0x157ac
 	.uleb128 0x4f
-	.8byte	.LVL1043
+	.8byte	.LVL1048
 	.4byte	0x157b8
 	.byte	0
 	.byte	0
@@ -44940,7 +44973,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x8ad
-	.8byte	.L1008
+	.8byte	.L1018
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
@@ -44975,26 +45008,26 @@ __exitcall_ebc_exit:
 	.4byte	.LLST255
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL958
+	.8byte	.LVL963
 	.4byte	0x1579f
 	.uleb128 0x4f
-	.8byte	.LVL963
+	.8byte	.LVL968
 	.4byte	0x1581b
 	.uleb128 0x4f
-	.8byte	.LVL964
+	.8byte	.LVL969
 	.4byte	0x1579f
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL956
+	.8byte	.LVL961
 	.4byte	0x157ac
 	.uleb128 0x4f
-	.8byte	.LVL967
+	.8byte	.LVL972
 	.4byte	0x157b8
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB2001
-	.8byte	.LBE2001-.LBB2001
+	.8byte	.LBB1999
+	.8byte	.LBE1999-.LBB1999
 	.4byte	0x11e06
 	.uleb128 0x48
 	.4byte	.LASF3092
@@ -45002,8 +45035,8 @@ __exitcall_ebc_exit:
 	.2byte	0x8b6
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB2002
-	.8byte	.LBE2002-.LBB2002
+	.8byte	.LBB2000
+	.8byte	.LBE2000-.LBB2000
 	.uleb128 0x74
 	.4byte	.LASF3104
 	.byte	0x1
@@ -45022,8 +45055,8 @@ __exitcall_ebc_exit:
 	.2byte	0x8b6
 	.4byte	0x199
 	.uleb128 0x6d
-	.8byte	.LBB2003
-	.8byte	.LBE2003-.LBB2003
+	.8byte	.LBB2001
+	.8byte	.LBE2001-.LBB2001
 	.4byte	0x11dea
 	.uleb128 0x5a
 	.4byte	.LASF3094
@@ -45032,23 +45065,23 @@ __exitcall_ebc_exit:
 	.4byte	0x199
 	.4byte	.LLST274
 	.uleb128 0x4f
-	.8byte	.LVL1064
+	.8byte	.LVL1069
 	.4byte	0x15793
 	.uleb128 0x4f
-	.8byte	.LVL1065
+	.8byte	.LVL1070
 	.4byte	0x1579f
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL1062
+	.8byte	.LVL1067
 	.4byte	0x157ac
 	.uleb128 0x4f
-	.8byte	.LVL1066
+	.8byte	.LVL1071
 	.4byte	0x157b8
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1975
-	.8byte	.LBE1975-.LBB1975
+	.8byte	.LBB1973
+	.8byte	.LBE1973-.LBB1973
 	.4byte	0x11ec0
 	.uleb128 0x48
 	.4byte	.LASF3092
@@ -45056,13 +45089,13 @@ __exitcall_ebc_exit:
 	.2byte	0x8c2
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB1976
-	.8byte	.LBE1976-.LBB1976
+	.8byte	.LBB1974
+	.8byte	.LBE1974-.LBB1974
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x8c2
-	.8byte	.L1022
+	.8byte	.L1032
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
@@ -45077,8 +45110,8 @@ __exitcall_ebc_exit:
 	.2byte	0x8c2
 	.4byte	0x199
 	.uleb128 0x6d
-	.8byte	.LBB1977
-	.8byte	.LBE1977-.LBB1977
+	.8byte	.LBB1975
+	.8byte	.LBE1975-.LBB1975
 	.4byte	0x11ea4
 	.uleb128 0x5a
 	.4byte	.LASF3094
@@ -45087,23 +45120,23 @@ __exitcall_ebc_exit:
 	.4byte	0x199
 	.4byte	.LLST269
 	.uleb128 0x4f
-	.8byte	.LVL971
+	.8byte	.LVL976
 	.4byte	0x15793
 	.uleb128 0x4f
-	.8byte	.LVL972
+	.8byte	.LVL977
 	.4byte	0x1579f
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL969
+	.8byte	.LVL974
 	.4byte	0x157ac
 	.uleb128 0x4f
-	.8byte	.LVL973
+	.8byte	.LVL978
 	.4byte	0x157b8
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0x124f5
-	.8byte	.LBB1957
+	.8byte	.LBB1955
 	.4byte	.Ldebug_ranges0+0x1200
 	.byte	0x1
 	.2byte	0x851
@@ -45141,8 +45174,8 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x124a1
-	.8byte	.LBB1960
-	.8byte	.LBE1960-.LBB1960
+	.8byte	.LBB1958
+	.8byte	.LBE1958-.LBB1958
 	.byte	0x1
 	.2byte	0x7de
 	.4byte	0x11f75
@@ -45154,8 +45187,8 @@ __exitcall_ebc_exit:
 	.4byte	0x124ae
 	.4byte	.LLST257
 	.uleb128 0x57
-	.8byte	.LBB1961
-	.8byte	.LBE1961-.LBB1961
+	.8byte	.LBB1959
+	.8byte	.LBE1959-.LBB1959
 	.uleb128 0x58
 	.4byte	0x124d2
 	.uleb128 0x58
@@ -45165,81 +45198,81 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14263
-	.8byte	.LBB1962
+	.4byte	0x14270
+	.8byte	.LBB1960
 	.4byte	.Ldebug_ranges0+0x1230
 	.byte	0x1
 	.2byte	0x7e9
 	.4byte	0x1203b
 	.uleb128 0x55
-	.4byte	0x142a0
+	.4byte	0x142ad
 	.uleb128 0x55
-	.4byte	0x142a0
+	.4byte	0x142ad
 	.uleb128 0x55
-	.4byte	0x142a0
+	.4byte	0x142ad
 	.uleb128 0x55
-	.4byte	0x142ac
+	.4byte	0x142b9
 	.uleb128 0x55
-	.4byte	0x14294
+	.4byte	0x142a1
 	.uleb128 0x55
-	.4byte	0x14288
+	.4byte	0x14295
 	.uleb128 0x55
-	.4byte	0x1427c
+	.4byte	0x14289
 	.uleb128 0x55
-	.4byte	0x14270
+	.4byte	0x1427d
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1230
 	.uleb128 0x58
-	.4byte	0x142b8
+	.4byte	0x142c5
 	.uleb128 0x61
-	.4byte	0x142c4
+	.4byte	0x142d1
 	.4byte	.LLST258
 	.uleb128 0x58
-	.4byte	0x142d0
+	.4byte	0x142dd
 	.uleb128 0x61
-	.4byte	0x142dc
+	.4byte	0x142e9
 	.4byte	.LLST259
 	.uleb128 0x61
-	.4byte	0x142e8
+	.4byte	0x142f5
 	.4byte	.LLST260
 	.uleb128 0x58
-	.4byte	0x142f4
+	.4byte	0x14301
 	.uleb128 0x58
-	.4byte	0x14300
+	.4byte	0x1430d
 	.uleb128 0x58
-	.4byte	0x1430c
+	.4byte	0x14319
 	.uleb128 0x61
-	.4byte	0x14318
+	.4byte	0x14325
 	.4byte	.LLST261
 	.uleb128 0x58
-	.4byte	0x14324
+	.4byte	0x14331
 	.uleb128 0x61
-	.4byte	0x14330
+	.4byte	0x1433d
 	.4byte	.LLST262
 	.uleb128 0x62
-	.4byte	0x1433c
+	.4byte	0x14349
 	.uleb128 0x1
 	.byte	0x60
 	.uleb128 0x61
-	.4byte	0x14346
+	.4byte	0x14353
 	.4byte	.LLST263
 	.uleb128 0x61
-	.4byte	0x14350
+	.4byte	0x1435d
 	.4byte	.LLST264
 	.uleb128 0x61
-	.4byte	0x1435c
+	.4byte	0x14369
 	.4byte	.LLST265
 	.uleb128 0x61
-	.4byte	0x14368
+	.4byte	0x14375
 	.4byte	.LLST266
 	.uleb128 0x61
-	.4byte	0x14374
+	.4byte	0x14381
 	.4byte	.LLST267
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0x124a1
-	.8byte	.LBB1970
+	.8byte	.LBB1968
 	.4byte	.Ldebug_ranges0+0x1290
 	.byte	0x1
 	.2byte	0x80c
@@ -45263,7 +45296,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0x124a1
-	.8byte	.LBB1990
+	.8byte	.LBB1988
 	.4byte	.Ldebug_ranges0+0x1380
 	.byte	0x1
 	.2byte	0x808
@@ -45287,7 +45320,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0x124a1
-	.8byte	.LBB1995
+	.8byte	.LBB1993
 	.4byte	.Ldebug_ranges0+0x13b0
 	.byte	0x1
 	.2byte	0x7a6
@@ -45310,226 +45343,226 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x146aa
-	.8byte	.LBB1999
-	.8byte	.LBE1999-.LBB1999
+	.4byte	0x146b7
+	.8byte	.LBB1997
+	.8byte	.LBE1997-.LBB1997
 	.byte	0x1
 	.2byte	0x773
 	.4byte	0x12149
 	.uleb128 0x55
-	.4byte	0x146c6
+	.4byte	0x146d3
 	.uleb128 0x55
-	.4byte	0x146ba
+	.4byte	0x146c7
 	.uleb128 0x57
-	.8byte	.LBB2000
-	.8byte	.LBE2000-.LBB2000
+	.8byte	.LBB1998
+	.8byte	.LBE1998-.LBB1998
 	.uleb128 0x58
-	.4byte	0x146d2
+	.4byte	0x146df
 	.uleb128 0x4f
-	.8byte	.LVL1060
+	.8byte	.LVL1065
 	.4byte	0x1539b
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x146aa
-	.8byte	.LBB2004
-	.8byte	.LBE2004-.LBB2004
+	.4byte	0x146b7
+	.8byte	.LBB2002
+	.8byte	.LBE2002-.LBB2002
 	.byte	0x1
 	.2byte	0x8bf
 	.4byte	0x12194
 	.uleb128 0x55
-	.4byte	0x146c6
+	.4byte	0x146d3
 	.uleb128 0x55
-	.4byte	0x146ba
+	.4byte	0x146c7
 	.uleb128 0x57
-	.8byte	.LBB2005
-	.8byte	.LBE2005-.LBB2005
+	.8byte	.LBB2003
+	.8byte	.LBE2003-.LBB2003
 	.uleb128 0x58
-	.4byte	0x146d2
+	.4byte	0x146df
 	.uleb128 0x4f
-	.8byte	.LVL1067
+	.8byte	.LVL1072
 	.4byte	0x1539b
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL900
+	.8byte	.LVL905
 	.4byte	0x15827
 	.uleb128 0x4f
-	.8byte	.LVL902
+	.8byte	.LVL907
 	.4byte	0x1566e
 	.uleb128 0x4f
-	.8byte	.LVL903
+	.8byte	.LVL908
 	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL904
+	.8byte	.LVL909
 	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL905
+	.8byte	.LVL910
 	.4byte	0x15833
 	.uleb128 0x4f
-	.8byte	.LVL906
+	.8byte	.LVL911
 	.4byte	0x157df
 	.uleb128 0x4f
-	.8byte	.LVL916
+	.8byte	.LVL921
 	.4byte	0x15459
 	.uleb128 0x4f
-	.8byte	.LVL917
+	.8byte	.LVL922
 	.4byte	0x15833
 	.uleb128 0x4f
-	.8byte	.LVL918
+	.8byte	.LVL923
 	.4byte	0x157df
 	.uleb128 0x4f
-	.8byte	.LVL923
+	.8byte	.LVL928
 	.4byte	0x125f5
 	.uleb128 0x4f
-	.8byte	.LVL924
+	.8byte	.LVL929
 	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL926
+	.8byte	.LVL931
 	.4byte	0x15833
 	.uleb128 0x4f
-	.8byte	.LVL929
+	.8byte	.LVL934
 	.4byte	0x156dc
 	.uleb128 0x4f
-	.8byte	.LVL930
+	.8byte	.LVL935
 	.4byte	0x156dc
 	.uleb128 0x4f
-	.8byte	.LVL948
+	.8byte	.LVL953
 	.4byte	0x1583f
 	.uleb128 0x4f
-	.8byte	.LVL949
+	.8byte	.LVL954
 	.4byte	0x156dc
 	.uleb128 0x4f
-	.8byte	.LVL975
+	.8byte	.LVL980
 	.4byte	0x154ba
 	.uleb128 0x4f
-	.8byte	.LVL978
+	.8byte	.LVL983
 	.4byte	0x1584b
 	.uleb128 0x4f
-	.8byte	.LVL979
+	.8byte	.LVL984
 	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL980
+	.8byte	.LVL985
 	.4byte	0x15459
 	.uleb128 0x4f
-	.8byte	.LVL982
+	.8byte	.LVL987
 	.4byte	0x157df
 	.uleb128 0x4f
-	.8byte	.LVL984
+	.8byte	.LVL989
 	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL985
-	.4byte	0x12a37
+	.8byte	.LVL990
+	.4byte	0x12a44
 	.uleb128 0x4f
-	.8byte	.LVL986
+	.8byte	.LVL991
 	.4byte	0x1566e
 	.uleb128 0x4f
-	.8byte	.LVL989
+	.8byte	.LVL994
 	.4byte	0x1566e
 	.uleb128 0x4f
-	.8byte	.LVL992
+	.8byte	.LVL997
 	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL993
+	.8byte	.LVL998
 	.4byte	0x156d0
 	.uleb128 0x4f
-	.8byte	.LVL996
+	.8byte	.LVL1001
 	.4byte	0x154ba
 	.uleb128 0x4f
-	.8byte	.LVL999
+	.8byte	.LVL1004
 	.4byte	0x1583f
 	.uleb128 0x4f
-	.8byte	.LVL1000
+	.8byte	.LVL1005
 	.4byte	0x156dc
 	.uleb128 0x4f
-	.8byte	.LVL1001
+	.8byte	.LVL1006
 	.4byte	0x15833
 	.uleb128 0x4f
-	.8byte	.LVL1002
+	.8byte	.LVL1007
 	.4byte	0x157df
 	.uleb128 0x4f
-	.8byte	.LVL1003
-	.4byte	0x145c5
+	.8byte	.LVL1008
+	.4byte	0x145d2
 	.uleb128 0x4f
-	.8byte	.LVL1004
+	.8byte	.LVL1009
 	.4byte	0x15857
 	.uleb128 0x4f
-	.8byte	.LVL1005
+	.8byte	.LVL1010
 	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL1006
-	.4byte	0x12a37
+	.8byte	.LVL1011
+	.4byte	0x12a44
 	.uleb128 0x4f
-	.8byte	.LVL1007
-	.4byte	0x1442b
+	.8byte	.LVL1012
+	.4byte	0x14438
 	.uleb128 0x4f
-	.8byte	.LVL1008
+	.8byte	.LVL1013
 	.4byte	0x15857
 	.uleb128 0x4f
-	.8byte	.LVL1009
+	.8byte	.LVL1014
 	.4byte	0x125f5
 	.uleb128 0x4f
-	.8byte	.LVL1010
+	.8byte	.LVL1015
 	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL1011
-	.4byte	0x12a37
+	.8byte	.LVL1016
+	.4byte	0x12a44
 	.uleb128 0x4f
-	.8byte	.LVL1012
+	.8byte	.LVL1017
 	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL1015
+	.8byte	.LVL1020
 	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL1020
+	.8byte	.LVL1025
 	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL1022
+	.8byte	.LVL1027
 	.4byte	0x156dc
 	.uleb128 0x4f
-	.8byte	.LVL1029
+	.8byte	.LVL1034
 	.4byte	0x125f5
 	.uleb128 0x4f
-	.8byte	.LVL1030
+	.8byte	.LVL1035
 	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL1031
-	.4byte	0x12a37
+	.8byte	.LVL1036
+	.4byte	0x12a44
 	.uleb128 0x4f
-	.8byte	.LVL1034
+	.8byte	.LVL1039
 	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL1035
+	.8byte	.LVL1040
 	.4byte	0x156d0
 	.uleb128 0x4f
-	.8byte	.LVL1037
+	.8byte	.LVL1042
 	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL1046
-	.4byte	0x144f2
+	.8byte	.LVL1051
+	.4byte	0x144ff
 	.uleb128 0x4f
-	.8byte	.LVL1049
+	.8byte	.LVL1054
 	.4byte	0x154ba
 	.uleb128 0x4f
-	.8byte	.LVL1070
+	.8byte	.LVL1075
 	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL1071
+	.8byte	.LVL1076
 	.4byte	0x154ba
 	.uleb128 0x4f
-	.8byte	.LVL1073
+	.8byte	.LVL1078
 	.4byte	0x1584b
 	.uleb128 0x4f
-	.8byte	.LVL1075
+	.8byte	.LVL1080
 	.4byte	0x156dc
 	.uleb128 0x4f
-	.8byte	.LVL1077
+	.8byte	.LVL1082
 	.4byte	0x156dc
 	.uleb128 0x4f
-	.8byte	.LVL1078
+	.8byte	.LVL1083
 	.4byte	0x154ba
 	.uleb128 0x4f
-	.8byte	.LVL1080
+	.8byte	.LVL1085
 	.4byte	0x15732
 	.byte	0
 	.uleb128 0x67
@@ -45684,11 +45717,11 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x6b1
 	.4byte	0xc6
-	.8byte	.LFB2834
-	.8byte	.LFE2834-.LFB2834
+	.8byte	.LFB2833
+	.8byte	.LFE2833-.LFB2833
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1278c
+	.4byte	0x12799
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
@@ -45725,16 +45758,16 @@ __exitcall_ebc_exit:
 	.2byte	0x6b6
 	.4byte	0xd8a3
 	.uleb128 0x54
-	.4byte	0x149c0
-	.8byte	.LBB1320
-	.8byte	.LBE1320-.LBB1320
+	.4byte	0x149cd
+	.8byte	.LBB1318
+	.8byte	.LBE1318-.LBB1318
 	.byte	0x1
 	.2byte	0x6bb
 	.4byte	0x12694
 	.uleb128 0x55
-	.4byte	0x149dc
+	.4byte	0x149e9
 	.uleb128 0x55
-	.4byte	0x149d0
+	.4byte	0x149dd
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL305
@@ -45743,17 +45776,17 @@ __exitcall_ebc_exit:
 	.8byte	.LVL306
 	.4byte	0x15863
 	.uleb128 0x4f
+	.8byte	.LVL310
+	.4byte	0x15863
+	.uleb128 0x4f
 	.8byte	.LVL311
 	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL312
-	.4byte	0x15584
+	.8byte	.LVL313
+	.4byte	0x155fe
 	.uleb128 0x4f
 	.8byte	.LVL314
-	.4byte	0x15863
-	.uleb128 0x4f
-	.8byte	.LVL315
-	.4byte	0x155fe
+	.4byte	0x15584
 	.uleb128 0x4f
 	.8byte	.LVL316
 	.4byte	0x15863
@@ -45777,32 +45810,35 @@ __exitcall_ebc_exit:
 	.4byte	0x15863
 	.uleb128 0x4f
 	.8byte	.LVL323
+	.4byte	0x1586f
+	.uleb128 0x4f
+	.8byte	.LVL325
 	.4byte	0x15863
 	.uleb128 0x4f
-	.8byte	.LVL324
+	.8byte	.LVL327
 	.4byte	0x15863
 	.uleb128 0x4f
-	.8byte	.LVL325
+	.8byte	.LVL328
 	.4byte	0x15863
 	.uleb128 0x4f
-	.8byte	.LVL326
+	.8byte	.LVL329
 	.4byte	0x15863
 	.uleb128 0x4f
-	.8byte	.LVL327
+	.8byte	.LVL330
 	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL328
+	.8byte	.LVL333
 	.4byte	0x15732
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x68a
-	.8byte	.LFB2833
-	.8byte	.LFE2833-.LFB2833
+	.8byte	.LFB2832
+	.8byte	.LFE2832-.LFB2832
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12845
+	.4byte	0x12852
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
@@ -45849,11 +45885,11 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x62c
 	.4byte	0xc6
-	.8byte	.LFB2832
-	.8byte	.LFE2832-.LFB2832
+	.8byte	.LFB2831
+	.8byte	.LFE2831-.LFB2831
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12a27
+	.4byte	0x12a34
 	.uleb128 0x59
 	.4byte	.LASF794
 	.byte	0x1
@@ -45879,12 +45915,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe880
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x10c0
-	.4byte	0x1292f
+	.4byte	0x1293c
 	.uleb128 0x41
 	.byte	0x8
 	.byte	0x1
 	.2byte	0x637
-	.4byte	0x128c8
+	.4byte	0x128d5
 	.uleb128 0x43
 	.4byte	.LASF3131
 	.byte	0x1
@@ -45894,20 +45930,20 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x1
 	.2byte	0x637
-	.4byte	0x12a27
+	.4byte	0x12a34
 	.byte	0
 	.uleb128 0x53
 	.string	"__u"
 	.byte	0x1
 	.2byte	0x637
-	.4byte	0x128a6
+	.4byte	0x128b3
 	.uleb128 0x5c
 	.4byte	0x15235
-	.8byte	.LBB1900
+	.8byte	.LBB1898
 	.4byte	.Ldebug_ranges0+0x1100
 	.byte	0x1
 	.2byte	0x637
-	.4byte	0x128fc
+	.4byte	0x12909
 	.uleb128 0x55
 	.4byte	0x15258
 	.uleb128 0x55
@@ -45917,13 +45953,13 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5e
 	.4byte	0x1502a
-	.8byte	.LBB1903
-	.8byte	.LBE1903-.LBB1903
+	.8byte	.LBB1901
+	.8byte	.LBE1901-.LBB1901
 	.byte	0x1
 	.2byte	0x637
 	.uleb128 0x57
-	.8byte	.LBB1904
-	.8byte	.LBE1904-.LBB1904
+	.8byte	.LBB1902
+	.8byte	.LBE1902-.LBB1902
 	.uleb128 0x62
 	.4byte	0x1503a
 	.uleb128 0x1
@@ -45933,68 +45969,68 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x54
 	.4byte	0x14ed3
-	.8byte	.LBB1908
-	.8byte	.LBE1908-.LBB1908
+	.8byte	.LBB1906
+	.8byte	.LBE1906-.LBB1906
 	.byte	0x1
 	.2byte	0x67f
-	.4byte	0x12963
+	.4byte	0x12970
 	.uleb128 0x55
 	.4byte	0x14eef
 	.uleb128 0x55
 	.4byte	0x14ee4
 	.uleb128 0x4f
-	.8byte	.LVL885
-	.4byte	0x1586f
+	.8byte	.LVL890
+	.4byte	0x1587b
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL880
-	.4byte	0x1587c
-	.uleb128 0x4f
-	.8byte	.LVL881
-	.4byte	0x15793
-	.uleb128 0x4f
-	.8byte	.LVL882
-	.4byte	0x15886
-	.uleb128 0x4f
-	.8byte	.LVL883
-	.4byte	0x15298
-	.uleb128 0x4f
-	.8byte	.LVL884
-	.4byte	0x13fa7
+	.8byte	.LVL885
+	.4byte	0x15888
 	.uleb128 0x4f
 	.8byte	.LVL886
-	.4byte	0x15298
+	.4byte	0x15793
 	.uleb128 0x4f
 	.8byte	.LVL887
-	.4byte	0x1364e
+	.4byte	0x15892
 	.uleb128 0x4f
 	.8byte	.LVL888
 	.4byte	0x15298
 	.uleb128 0x4f
 	.8byte	.LVL889
-	.4byte	0x12c41
-	.uleb128 0x4f
-	.8byte	.LVL890
-	.4byte	0x15298
+	.4byte	0x13fb4
 	.uleb128 0x4f
 	.8byte	.LVL891
-	.4byte	0x14108
+	.4byte	0x15298
 	.uleb128 0x4f
 	.8byte	.LVL892
-	.4byte	0x15892
+	.4byte	0x1365b
 	.uleb128 0x4f
 	.8byte	.LVL893
-	.4byte	0x14381
+	.4byte	0x15298
 	.uleb128 0x4f
 	.8byte	.LVL894
-	.4byte	0x14108
+	.4byte	0x12c4e
 	.uleb128 0x4f
 	.8byte	.LVL895
-	.4byte	0x13fa7
+	.4byte	0x15298
+	.uleb128 0x4f
+	.8byte	.LVL896
+	.4byte	0x14115
+	.uleb128 0x4f
+	.8byte	.LVL897
+	.4byte	0x1589e
+	.uleb128 0x4f
+	.8byte	.LVL898
+	.4byte	0x1438e
+	.uleb128 0x4f
+	.8byte	.LVL899
+	.4byte	0x14115
+	.uleb128 0x4f
+	.8byte	.LVL900
+	.4byte	0x13fb4
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x12a37
+	.4byte	0x12a44
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
@@ -46003,11 +46039,11 @@ __exitcall_ebc_exit:
 	.4byte	.LASF3132
 	.byte	0x1
 	.2byte	0x5d5
-	.8byte	.LFB2831
-	.8byte	.LFE2831-.LFB2831
+	.8byte	.LFB2830
+	.8byte	.LFE2830-.LFB2830
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12be3
+	.4byte	0x12bf0
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
@@ -46029,96 +46065,96 @@ __exitcall_ebc_exit:
 	.4byte	0xb9b0
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34978
+	.8byte	__func__.34977
 	.uleb128 0x54
-	.4byte	0x12be3
-	.8byte	.LBB1558
-	.8byte	.LBE1558-.LBB1558
+	.4byte	0x12bf0
+	.8byte	.LBB1556
+	.8byte	.LBE1556-.LBB1556
 	.byte	0x1
 	.2byte	0x5e5
-	.4byte	0x12ac4
+	.4byte	0x12ad1
 	.uleb128 0x55
-	.4byte	0x12bfc
+	.4byte	0x12c09
 	.uleb128 0x55
-	.4byte	0x12bf0
+	.4byte	0x12bfd
 	.uleb128 0x4f
-	.8byte	.LVL574
+	.8byte	.LVL579
 	.4byte	0x15298
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12be3
-	.8byte	.LBB1560
-	.8byte	.LBE1560-.LBB1560
+	.4byte	0x12bf0
+	.8byte	.LBB1558
+	.8byte	.LBE1558-.LBB1558
 	.byte	0x1
 	.2byte	0x5f9
-	.4byte	0x12af8
+	.4byte	0x12b05
 	.uleb128 0x55
-	.4byte	0x12bfc
+	.4byte	0x12c09
 	.uleb128 0x55
-	.4byte	0x12bf0
+	.4byte	0x12bfd
 	.uleb128 0x4f
-	.8byte	.LVL579
+	.8byte	.LVL584
 	.4byte	0x15298
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12be3
-	.8byte	.LBB1562
-	.8byte	.LBE1562-.LBB1562
+	.4byte	0x12bf0
+	.8byte	.LBB1560
+	.8byte	.LBE1560-.LBB1560
 	.byte	0x1
 	.2byte	0x620
-	.4byte	0x12b2c
+	.4byte	0x12b39
 	.uleb128 0x55
-	.4byte	0x12bfc
+	.4byte	0x12c09
 	.uleb128 0x55
-	.4byte	0x12bf0
+	.4byte	0x12bfd
 	.uleb128 0x4f
-	.8byte	.LVL584
+	.8byte	.LVL589
 	.4byte	0x15298
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12be3
-	.8byte	.LBB1564
-	.8byte	.LBE1564-.LBB1564
+	.4byte	0x12bf0
+	.8byte	.LBB1562
+	.8byte	.LBE1562-.LBB1562
 	.byte	0x1
 	.2byte	0x613
-	.4byte	0x12b60
+	.4byte	0x12b6d
 	.uleb128 0x55
-	.4byte	0x12bfc
+	.4byte	0x12c09
 	.uleb128 0x55
-	.4byte	0x12bf0
+	.4byte	0x12bfd
 	.uleb128 0x4f
-	.8byte	.LVL589
+	.8byte	.LVL594
 	.4byte	0x15298
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL573
-	.4byte	0x13fa7
-	.uleb128 0x4f
-	.8byte	.LVL575
-	.4byte	0x13fa7
-	.uleb128 0x4f
 	.8byte	.LVL578
-	.4byte	0x14108
+	.4byte	0x13fb4
 	.uleb128 0x4f
 	.8byte	.LVL580
-	.4byte	0x14108
+	.4byte	0x13fb4
 	.uleb128 0x4f
 	.8byte	.LVL583
-	.4byte	0x1364e
+	.4byte	0x14115
 	.uleb128 0x4f
 	.8byte	.LVL585
-	.4byte	0x1364e
+	.4byte	0x14115
 	.uleb128 0x4f
 	.8byte	.LVL588
-	.4byte	0x12c41
+	.4byte	0x1365b
 	.uleb128 0x4f
 	.8byte	.LVL590
-	.4byte	0x12c41
+	.4byte	0x1365b
 	.uleb128 0x4f
 	.8byte	.LVL593
+	.4byte	0x12c4e
+	.uleb128 0x4f
+	.8byte	.LVL595
+	.4byte	0x12c4e
+	.uleb128 0x4f
+	.8byte	.LVL598
 	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL596
+	.8byte	.LVL601
 	.4byte	0x15584
 	.byte	0
 	.uleb128 0x67
@@ -46126,7 +46162,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x5cf
 	.byte	0x1
-	.4byte	0x12c09
+	.4byte	0x12c16
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
@@ -46143,7 +46179,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x5c4
 	.byte	0x1
-	.4byte	0x12c3b
+	.4byte	0x12c48
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
@@ -46158,7 +46194,7 @@ __exitcall_ebc_exit:
 	.string	"buf"
 	.byte	0x1
 	.2byte	0x5c6
-	.4byte	0x12c3b
+	.4byte	0x12c48
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -46167,11 +46203,11 @@ __exitcall_ebc_exit:
 	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x5af
-	.8byte	.LFB2828
-	.8byte	.LFE2828-.LFB2828
+	.8byte	.LFB2827
+	.8byte	.LFE2827-.LFB2827
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x131f0
+	.4byte	0x131fd
 	.uleb128 0x76
 	.4byte	.LASF3136
 	.byte	0x1
@@ -46198,478 +46234,478 @@ __exitcall_ebc_exit:
 	.4byte	0xe880
 	.4byte	.LLST152
 	.uleb128 0x54
-	.4byte	0x131f0
-	.8byte	.LBB1468
-	.8byte	.LBE1468-.LBB1468
+	.4byte	0x131fd
+	.8byte	.LBB1466
+	.8byte	.LBE1466-.LBB1466
 	.byte	0x1
 	.2byte	0x5c0
-	.4byte	0x12d4a
+	.4byte	0x12d57
 	.uleb128 0x55
-	.4byte	0x13221
+	.4byte	0x1322e
 	.uleb128 0x55
-	.4byte	0x13221
+	.4byte	0x1322e
 	.uleb128 0x55
-	.4byte	0x13221
+	.4byte	0x1322e
 	.uleb128 0x55
-	.4byte	0x13215
+	.4byte	0x13222
 	.uleb128 0x72
-	.4byte	0x13209
+	.4byte	0x13216
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x131fd
+	.4byte	0x1320a
 	.uleb128 0x57
-	.8byte	.LBB1469
-	.8byte	.LBE1469-.LBB1469
+	.8byte	.LBB1467
+	.8byte	.LBE1467-.LBB1467
 	.uleb128 0x58
-	.4byte	0x1322d
+	.4byte	0x1323a
 	.uleb128 0x61
-	.4byte	0x13239
+	.4byte	0x13246
 	.4byte	.LLST153
 	.uleb128 0x58
-	.4byte	0x13245
+	.4byte	0x13252
 	.uleb128 0x58
-	.4byte	0x13251
+	.4byte	0x1325e
 	.uleb128 0x58
-	.4byte	0x1325d
+	.4byte	0x1326a
 	.uleb128 0x58
-	.4byte	0x13269
+	.4byte	0x13276
 	.uleb128 0x61
-	.4byte	0x13275
+	.4byte	0x13282
 	.4byte	.LLST154
 	.uleb128 0x61
-	.4byte	0x13281
+	.4byte	0x1328e
 	.4byte	.LLST155
 	.uleb128 0x58
-	.4byte	0x1328d
+	.4byte	0x1329a
 	.uleb128 0x61
-	.4byte	0x13299
+	.4byte	0x132a6
 	.4byte	.LLST156
 	.uleb128 0x58
-	.4byte	0x132a3
+	.4byte	0x132b0
 	.uleb128 0x61
-	.4byte	0x132ad
+	.4byte	0x132ba
 	.4byte	.LLST157
 	.uleb128 0x61
-	.4byte	0x132b9
+	.4byte	0x132c6
 	.4byte	.LLST158
 	.uleb128 0x58
-	.4byte	0x132c5
+	.4byte	0x132d2
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x134a2
-	.8byte	.LBB1470
+	.4byte	0x134af
+	.8byte	.LBB1468
 	.4byte	.Ldebug_ranges0+0xa60
 	.byte	0x1
 	.2byte	0x5b9
-	.4byte	0x12f0c
+	.4byte	0x12f19
 	.uleb128 0x55
-	.4byte	0x134d3
+	.4byte	0x134e0
 	.uleb128 0x55
-	.4byte	0x134d3
+	.4byte	0x134e0
 	.uleb128 0x55
-	.4byte	0x134d3
+	.4byte	0x134e0
 	.uleb128 0x55
-	.4byte	0x134c7
+	.4byte	0x134d4
 	.uleb128 0x55
-	.4byte	0x134bb
+	.4byte	0x134c8
 	.uleb128 0x55
-	.4byte	0x134af
+	.4byte	0x134bc
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa60
 	.uleb128 0x58
-	.4byte	0x134df
+	.4byte	0x134ec
 	.uleb128 0x61
-	.4byte	0x134eb
+	.4byte	0x134f8
 	.4byte	.LLST159
 	.uleb128 0x61
-	.4byte	0x134f7
+	.4byte	0x13504
 	.4byte	.LLST160
 	.uleb128 0x61
-	.4byte	0x13503
+	.4byte	0x13510
 	.4byte	.LLST161
 	.uleb128 0x61
-	.4byte	0x1350f
+	.4byte	0x1351c
 	.4byte	.LLST162
 	.uleb128 0x61
-	.4byte	0x1351b
+	.4byte	0x13528
 	.4byte	.LLST163
 	.uleb128 0x61
-	.4byte	0x13527
+	.4byte	0x13534
 	.4byte	.LLST164
 	.uleb128 0x61
-	.4byte	0x13533
+	.4byte	0x13540
 	.4byte	.LLST165
 	.uleb128 0x61
-	.4byte	0x1353f
+	.4byte	0x1354c
 	.4byte	.LLST166
 	.uleb128 0x58
-	.4byte	0x13549
+	.4byte	0x13556
 	.uleb128 0x61
-	.4byte	0x13553
+	.4byte	0x13560
 	.4byte	.LLST167
 	.uleb128 0x61
-	.4byte	0x1355f
+	.4byte	0x1356c
 	.4byte	.LLST168
 	.uleb128 0x58
-	.4byte	0x1356b
+	.4byte	0x13578
 	.uleb128 0x5c
-	.4byte	0x14729
-	.8byte	.LBB1472
+	.4byte	0x14736
+	.8byte	.LBB1470
 	.4byte	.Ldebug_ranges0+0xaa0
 	.byte	0x1
 	.2byte	0x4de
-	.4byte	0x12e2a
+	.4byte	0x12e37
 	.uleb128 0x55
-	.4byte	0x14751
+	.4byte	0x1475e
 	.uleb128 0x55
-	.4byte	0x14745
+	.4byte	0x14752
 	.uleb128 0x55
-	.4byte	0x14739
+	.4byte	0x14746
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xaa0
 	.uleb128 0x58
-	.4byte	0x1475d
+	.4byte	0x1476a
 	.uleb128 0x61
-	.4byte	0x14768
+	.4byte	0x14775
 	.4byte	.LLST169
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14729
-	.8byte	.LBB1475
-	.8byte	.LBE1475-.LBB1475
+	.4byte	0x14736
+	.8byte	.LBB1473
+	.8byte	.LBE1473-.LBB1473
 	.byte	0x1
 	.2byte	0x4db
-	.4byte	0x12e76
+	.4byte	0x12e83
 	.uleb128 0x55
-	.4byte	0x14751
+	.4byte	0x1475e
 	.uleb128 0x55
-	.4byte	0x14745
+	.4byte	0x14752
 	.uleb128 0x55
-	.4byte	0x14739
+	.4byte	0x14746
 	.uleb128 0x57
-	.8byte	.LBB1476
-	.8byte	.LBE1476-.LBB1476
+	.8byte	.LBB1474
+	.8byte	.LBE1474-.LBB1474
 	.uleb128 0x58
-	.4byte	0x1475d
+	.4byte	0x1476a
 	.uleb128 0x61
-	.4byte	0x14768
+	.4byte	0x14775
 	.4byte	.LLST170
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14729
-	.8byte	.LBB1477
-	.8byte	.LBE1477-.LBB1477
+	.4byte	0x14736
+	.8byte	.LBB1475
+	.8byte	.LBE1475-.LBB1475
 	.byte	0x1
 	.2byte	0x4dc
-	.4byte	0x12ec2
+	.4byte	0x12ecf
 	.uleb128 0x55
-	.4byte	0x14751
+	.4byte	0x1475e
 	.uleb128 0x55
-	.4byte	0x14745
+	.4byte	0x14752
 	.uleb128 0x55
-	.4byte	0x14739
+	.4byte	0x14746
 	.uleb128 0x57
-	.8byte	.LBB1478
-	.8byte	.LBE1478-.LBB1478
+	.8byte	.LBB1476
+	.8byte	.LBE1476-.LBB1476
 	.uleb128 0x58
-	.4byte	0x1475d
+	.4byte	0x1476a
 	.uleb128 0x61
-	.4byte	0x14768
+	.4byte	0x14775
 	.4byte	.LLST171
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x14729
-	.8byte	.LBB1479
-	.8byte	.LBE1479-.LBB1479
+	.4byte	0x14736
+	.8byte	.LBB1477
+	.8byte	.LBE1477-.LBB1477
 	.byte	0x1
 	.2byte	0x4dd
 	.uleb128 0x55
-	.4byte	0x14751
+	.4byte	0x1475e
 	.uleb128 0x55
-	.4byte	0x14745
+	.4byte	0x14752
 	.uleb128 0x55
-	.4byte	0x14739
+	.4byte	0x14746
 	.uleb128 0x57
-	.8byte	.LBB1480
-	.8byte	.LBE1480-.LBB1480
+	.8byte	.LBB1478
+	.8byte	.LBE1478-.LBB1478
 	.uleb128 0x58
-	.4byte	0x1475d
+	.4byte	0x1476a
 	.uleb128 0x61
-	.4byte	0x14768
+	.4byte	0x14775
 	.4byte	.LLST172
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x132d2
-	.8byte	.LBB1485
-	.8byte	.LBE1485-.LBB1485
+	.4byte	0x132df
+	.8byte	.LBB1483
+	.8byte	.LBE1483-.LBB1483
 	.byte	0x1
 	.2byte	0x5be
-	.4byte	0x12fb5
+	.4byte	0x12fc2
 	.uleb128 0x55
-	.4byte	0x13303
+	.4byte	0x13310
 	.uleb128 0x55
-	.4byte	0x13303
+	.4byte	0x13310
 	.uleb128 0x55
-	.4byte	0x13303
+	.4byte	0x13310
 	.uleb128 0x55
-	.4byte	0x132f7
+	.4byte	0x13304
 	.uleb128 0x72
-	.4byte	0x132eb
+	.4byte	0x132f8
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x132df
+	.4byte	0x132ec
 	.uleb128 0x57
-	.8byte	.LBB1486
-	.8byte	.LBE1486-.LBB1486
+	.8byte	.LBB1484
+	.8byte	.LBE1484-.LBB1484
 	.uleb128 0x58
-	.4byte	0x1330f
+	.4byte	0x1331c
 	.uleb128 0x58
-	.4byte	0x1331b
+	.4byte	0x13328
 	.uleb128 0x58
-	.4byte	0x13327
+	.4byte	0x13334
 	.uleb128 0x58
-	.4byte	0x13333
+	.4byte	0x13340
 	.uleb128 0x58
-	.4byte	0x1333f
+	.4byte	0x1334c
 	.uleb128 0x58
-	.4byte	0x1334b
+	.4byte	0x13358
 	.uleb128 0x61
-	.4byte	0x13357
+	.4byte	0x13364
 	.4byte	.LLST173
 	.uleb128 0x61
-	.4byte	0x13363
+	.4byte	0x13370
 	.4byte	.LLST174
 	.uleb128 0x58
-	.4byte	0x1336f
+	.4byte	0x1337c
 	.uleb128 0x61
-	.4byte	0x1337b
+	.4byte	0x13388
 	.4byte	.LLST175
 	.uleb128 0x58
-	.4byte	0x13385
+	.4byte	0x13392
 	.uleb128 0x61
-	.4byte	0x1338f
+	.4byte	0x1339c
 	.4byte	.LLST176
 	.uleb128 0x61
-	.4byte	0x1339b
+	.4byte	0x133a8
 	.4byte	.LLST177
 	.uleb128 0x58
-	.4byte	0x133a7
+	.4byte	0x133b4
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13578
-	.8byte	.LBB1487
+	.4byte	0x13585
+	.8byte	.LBB1485
 	.4byte	.Ldebug_ranges0+0xad0
 	.byte	0x1
 	.2byte	0x5bb
-	.4byte	0x130c3
+	.4byte	0x130d0
 	.uleb128 0x55
-	.4byte	0x135a9
+	.4byte	0x135b6
 	.uleb128 0x55
-	.4byte	0x135a9
+	.4byte	0x135b6
 	.uleb128 0x55
-	.4byte	0x135a9
+	.4byte	0x135b6
 	.uleb128 0x55
-	.4byte	0x1359d
+	.4byte	0x135aa
 	.uleb128 0x55
-	.4byte	0x13591
+	.4byte	0x1359e
 	.uleb128 0x55
-	.4byte	0x13585
+	.4byte	0x13592
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xad0
 	.uleb128 0x58
-	.4byte	0x135b5
+	.4byte	0x135c2
 	.uleb128 0x58
-	.4byte	0x135c1
+	.4byte	0x135ce
 	.uleb128 0x58
-	.4byte	0x135cd
+	.4byte	0x135da
 	.uleb128 0x62
-	.4byte	0x135d9
+	.4byte	0x135e6
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x135e5
+	.4byte	0x135f2
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x135f1
+	.4byte	0x135fe
 	.4byte	.LLST178
 	.uleb128 0x61
-	.4byte	0x135fd
+	.4byte	0x1360a
 	.4byte	.LLST179
 	.uleb128 0x61
-	.4byte	0x13609
+	.4byte	0x13616
 	.4byte	.LLST180
 	.uleb128 0x61
-	.4byte	0x13615
+	.4byte	0x13622
 	.4byte	.LLST181
 	.uleb128 0x58
-	.4byte	0x1361f
+	.4byte	0x1362c
 	.uleb128 0x61
-	.4byte	0x13629
+	.4byte	0x13636
 	.4byte	.LLST182
 	.uleb128 0x61
-	.4byte	0x13635
+	.4byte	0x13642
 	.4byte	.LLST183
 	.uleb128 0x58
-	.4byte	0x13641
+	.4byte	0x1364e
 	.uleb128 0x5c
-	.4byte	0x14729
-	.8byte	.LBB1489
+	.4byte	0x14736
+	.8byte	.LBB1487
 	.4byte	.Ldebug_ranges0+0xb00
 	.byte	0x1
 	.2byte	0x4b3
-	.4byte	0x13089
+	.4byte	0x13096
 	.uleb128 0x55
-	.4byte	0x14751
+	.4byte	0x1475e
 	.uleb128 0x55
-	.4byte	0x14745
+	.4byte	0x14752
 	.uleb128 0x55
-	.4byte	0x14739
+	.4byte	0x14746
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xb00
 	.uleb128 0x58
-	.4byte	0x1475d
+	.4byte	0x1476a
 	.uleb128 0x61
-	.4byte	0x14768
+	.4byte	0x14775
 	.4byte	.LLST184
 	.byte	0
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x14729
-	.8byte	.LBB1496
+	.4byte	0x14736
+	.8byte	.LBB1494
 	.4byte	.Ldebug_ranges0+0xb70
 	.byte	0x1
 	.2byte	0x4b2
 	.uleb128 0x55
-	.4byte	0x14751
+	.4byte	0x1475e
 	.uleb128 0x55
-	.4byte	0x14745
+	.4byte	0x14752
 	.uleb128 0x55
-	.4byte	0x14739
+	.4byte	0x14746
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xb70
 	.uleb128 0x58
-	.4byte	0x1475d
+	.4byte	0x1476a
 	.uleb128 0x61
-	.4byte	0x14768
+	.4byte	0x14775
 	.4byte	.LLST185
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x133b4
-	.8byte	.LBB1514
-	.8byte	.LBE1514-.LBB1514
+	.4byte	0x133c1
+	.8byte	.LBB1512
+	.8byte	.LBE1512-.LBB1512
 	.byte	0x1
 	.2byte	0x5b5
 	.uleb128 0x55
-	.4byte	0x133e5
+	.4byte	0x133f2
 	.uleb128 0x55
-	.4byte	0x133e5
+	.4byte	0x133f2
 	.uleb128 0x55
-	.4byte	0x133e5
+	.4byte	0x133f2
 	.uleb128 0x55
-	.4byte	0x133d9
+	.4byte	0x133e6
 	.uleb128 0x55
-	.4byte	0x133cd
+	.4byte	0x133da
 	.uleb128 0x55
-	.4byte	0x133c1
+	.4byte	0x133ce
 	.uleb128 0x57
-	.8byte	.LBB1515
-	.8byte	.LBE1515-.LBB1515
+	.8byte	.LBB1513
+	.8byte	.LBE1513-.LBB1513
 	.uleb128 0x58
-	.4byte	0x133f1
+	.4byte	0x133fe
 	.uleb128 0x58
-	.4byte	0x133fd
+	.4byte	0x1340a
 	.uleb128 0x58
-	.4byte	0x13409
+	.4byte	0x13416
 	.uleb128 0x62
-	.4byte	0x13415
+	.4byte	0x13422
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x13421
+	.4byte	0x1342e
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x1342d
+	.4byte	0x1343a
 	.4byte	.LLST186
 	.uleb128 0x61
-	.4byte	0x13439
+	.4byte	0x13446
 	.4byte	.LLST187
 	.uleb128 0x61
-	.4byte	0x13445
+	.4byte	0x13452
 	.4byte	.LLST188
 	.uleb128 0x61
-	.4byte	0x13451
+	.4byte	0x1345e
 	.4byte	.LLST189
 	.uleb128 0x58
-	.4byte	0x1345b
+	.4byte	0x13468
 	.uleb128 0x61
-	.4byte	0x13465
+	.4byte	0x13472
 	.4byte	.LLST190
 	.uleb128 0x61
-	.4byte	0x13471
+	.4byte	0x1347e
 	.4byte	.LLST191
 	.uleb128 0x58
-	.4byte	0x1347d
+	.4byte	0x1348a
 	.uleb128 0x58
-	.4byte	0x13489
+	.4byte	0x13496
 	.uleb128 0x58
-	.4byte	0x13495
+	.4byte	0x134a2
 	.uleb128 0x5c
-	.4byte	0x146de
-	.8byte	.LBB1516
+	.4byte	0x146eb
+	.8byte	.LBB1514
 	.4byte	.Ldebug_ranges0+0xbd0
 	.byte	0x1
 	.2byte	0x509
-	.4byte	0x131b1
+	.4byte	0x131be
 	.uleb128 0x55
-	.4byte	0x14706
+	.4byte	0x14713
 	.uleb128 0x55
-	.4byte	0x146fa
+	.4byte	0x14707
 	.uleb128 0x55
-	.4byte	0x146ee
+	.4byte	0x146fb
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xbd0
 	.uleb128 0x61
-	.4byte	0x14712
+	.4byte	0x1471f
 	.4byte	.LLST192
 	.uleb128 0x61
-	.4byte	0x1471d
+	.4byte	0x1472a
 	.4byte	.LLST193
 	.byte	0
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x146de
-	.8byte	.LBB1523
+	.4byte	0x146eb
+	.8byte	.LBB1521
 	.4byte	.Ldebug_ranges0+0xc40
 	.byte	0x1
 	.2byte	0x508
 	.uleb128 0x55
-	.4byte	0x14706
+	.4byte	0x14713
 	.uleb128 0x55
-	.4byte	0x146fa
+	.4byte	0x14707
 	.uleb128 0x55
-	.4byte	0x146ee
+	.4byte	0x146fb
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xc40
 	.uleb128 0x61
-	.4byte	0x14712
+	.4byte	0x1471f
 	.4byte	.LLST194
 	.uleb128 0x61
-	.4byte	0x1471d
+	.4byte	0x1472a
 	.4byte	.LLST195
 	.byte	0
 	.byte	0
@@ -46681,7 +46717,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x561
 	.byte	0x1
-	.4byte	0x132d2
+	.4byte	0x132df
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
@@ -46778,7 +46814,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x513
 	.byte	0x1
-	.4byte	0x133b4
+	.4byte	0x133c1
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
@@ -46875,7 +46911,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x4e9
 	.byte	0x1
-	.4byte	0x134a2
+	.4byte	0x134af
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
@@ -46977,7 +47013,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x4be
 	.byte	0x1
-	.4byte	0x13578
+	.4byte	0x13585
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
@@ -47069,7 +47105,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x495
 	.byte	0x1
-	.4byte	0x1364e
+	.4byte	0x1365b
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
@@ -47160,11 +47196,11 @@ __exitcall_ebc_exit:
 	.4byte	.LASF3152
 	.byte	0x1
 	.2byte	0x47f
-	.8byte	.LFB2822
-	.8byte	.LFE2822-.LFB2822
+	.8byte	.LFB2821
+	.8byte	.LFE2821-.LFB2821
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13b49
+	.4byte	0x13b56
 	.uleb128 0x76
 	.4byte	.LASF3136
 	.byte	0x1
@@ -47191,414 +47227,414 @@ __exitcall_ebc_exit:
 	.4byte	0xe880
 	.4byte	.LLST115
 	.uleb128 0x54
-	.4byte	0x13b49
-	.8byte	.LBB1354
-	.8byte	.LBE1354-.LBB1354
+	.4byte	0x13b56
+	.8byte	.LBB1352
+	.8byte	.LBE1352-.LBB1352
 	.byte	0x1
 	.2byte	0x490
-	.4byte	0x13757
+	.4byte	0x13764
 	.uleb128 0x55
-	.4byte	0x13b7a
+	.4byte	0x13b87
 	.uleb128 0x55
-	.4byte	0x13b7a
+	.4byte	0x13b87
 	.uleb128 0x55
-	.4byte	0x13b7a
+	.4byte	0x13b87
 	.uleb128 0x55
-	.4byte	0x13b6e
+	.4byte	0x13b7b
 	.uleb128 0x72
-	.4byte	0x13b62
+	.4byte	0x13b6f
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x13b56
+	.4byte	0x13b63
 	.uleb128 0x57
-	.8byte	.LBB1355
-	.8byte	.LBE1355-.LBB1355
+	.8byte	.LBB1353
+	.8byte	.LBE1353-.LBB1353
 	.uleb128 0x58
-	.4byte	0x13b86
+	.4byte	0x13b93
 	.uleb128 0x61
-	.4byte	0x13b92
+	.4byte	0x13b9f
 	.4byte	.LLST116
 	.uleb128 0x58
-	.4byte	0x13b9e
+	.4byte	0x13bab
 	.uleb128 0x58
-	.4byte	0x13baa
+	.4byte	0x13bb7
 	.uleb128 0x58
-	.4byte	0x13bb6
+	.4byte	0x13bc3
 	.uleb128 0x58
-	.4byte	0x13bc2
+	.4byte	0x13bcf
 	.uleb128 0x61
-	.4byte	0x13bce
+	.4byte	0x13bdb
 	.4byte	.LLST117
 	.uleb128 0x61
-	.4byte	0x13bda
+	.4byte	0x13be7
 	.4byte	.LLST118
 	.uleb128 0x58
-	.4byte	0x13be6
+	.4byte	0x13bf3
 	.uleb128 0x61
-	.4byte	0x13bf2
+	.4byte	0x13bff
 	.4byte	.LLST119
 	.uleb128 0x58
-	.4byte	0x13bfc
+	.4byte	0x13c09
 	.uleb128 0x61
-	.4byte	0x13c06
+	.4byte	0x13c13
 	.4byte	.LLST120
 	.uleb128 0x61
-	.4byte	0x13c12
+	.4byte	0x13c1f
 	.4byte	.LLST121
 	.uleb128 0x58
-	.4byte	0x13c1e
+	.4byte	0x13c2b
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13ed1
-	.8byte	.LBB1356
-	.8byte	.LBE1356-.LBB1356
+	.4byte	0x13ede
+	.8byte	.LBB1354
+	.8byte	.LBE1354-.LBB1354
 	.byte	0x1
 	.2byte	0x489
-	.4byte	0x138a5
+	.4byte	0x138b2
 	.uleb128 0x55
-	.4byte	0x13f02
+	.4byte	0x13f0f
 	.uleb128 0x55
-	.4byte	0x13f02
+	.4byte	0x13f0f
 	.uleb128 0x55
-	.4byte	0x13f02
+	.4byte	0x13f0f
 	.uleb128 0x55
-	.4byte	0x13ef6
+	.4byte	0x13f03
 	.uleb128 0x55
-	.4byte	0x13eea
+	.4byte	0x13ef7
 	.uleb128 0x55
-	.4byte	0x13ede
+	.4byte	0x13eeb
 	.uleb128 0x57
-	.8byte	.LBB1357
-	.8byte	.LBE1357-.LBB1357
+	.8byte	.LBB1355
+	.8byte	.LBE1355-.LBB1355
 	.uleb128 0x58
-	.4byte	0x13f0e
+	.4byte	0x13f1b
 	.uleb128 0x61
-	.4byte	0x13f1a
+	.4byte	0x13f27
 	.4byte	.LLST122
 	.uleb128 0x58
-	.4byte	0x13f24
+	.4byte	0x13f31
 	.uleb128 0x61
-	.4byte	0x13f2e
+	.4byte	0x13f3b
 	.4byte	.LLST123
 	.uleb128 0x58
-	.4byte	0x13f3a
+	.4byte	0x13f47
 	.uleb128 0x61
-	.4byte	0x13f46
+	.4byte	0x13f53
 	.4byte	.LLST124
 	.uleb128 0x61
-	.4byte	0x13f52
+	.4byte	0x13f5f
 	.4byte	.LLST125
 	.uleb128 0x61
-	.4byte	0x13f5e
+	.4byte	0x13f6b
 	.4byte	.LLST126
 	.uleb128 0x61
-	.4byte	0x13f6a
+	.4byte	0x13f77
 	.4byte	.LLST127
 	.uleb128 0x61
-	.4byte	0x13f76
+	.4byte	0x13f83
 	.4byte	.LLST128
 	.uleb128 0x61
-	.4byte	0x13f82
+	.4byte	0x13f8f
 	.4byte	.LLST129
 	.uleb128 0x61
-	.4byte	0x13f8e
+	.4byte	0x13f9b
 	.4byte	.LLST130
 	.uleb128 0x58
-	.4byte	0x13f9a
+	.4byte	0x13fa7
 	.uleb128 0x5c
-	.4byte	0x147a9
-	.8byte	.LBB1358
+	.4byte	0x147b6
+	.8byte	.LBB1356
 	.4byte	.Ldebug_ranges0+0x770
 	.byte	0x1
 	.2byte	0x39c
-	.4byte	0x1382f
+	.4byte	0x1383c
 	.uleb128 0x55
-	.4byte	0x147d1
+	.4byte	0x147de
 	.uleb128 0x55
-	.4byte	0x147c5
+	.4byte	0x147d2
 	.uleb128 0x55
-	.4byte	0x147b9
+	.4byte	0x147c6
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x147a9
-	.8byte	.LBB1363
+	.4byte	0x147b6
+	.8byte	.LBB1361
 	.4byte	.Ldebug_ranges0+0x7c0
 	.byte	0x1
 	.2byte	0x39d
-	.4byte	0x13857
+	.4byte	0x13864
 	.uleb128 0x55
-	.4byte	0x147d1
+	.4byte	0x147de
 	.uleb128 0x55
-	.4byte	0x147c5
+	.4byte	0x147d2
 	.uleb128 0x55
-	.4byte	0x147b9
+	.4byte	0x147c6
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x147a9
-	.8byte	.LBB1375
+	.4byte	0x147b6
+	.8byte	.LBB1373
 	.4byte	.Ldebug_ranges0+0x830
 	.byte	0x1
 	.2byte	0x39e
-	.4byte	0x1387f
+	.4byte	0x1388c
 	.uleb128 0x55
-	.4byte	0x147d1
+	.4byte	0x147de
 	.uleb128 0x55
-	.4byte	0x147c5
+	.4byte	0x147d2
 	.uleb128 0x55
-	.4byte	0x147b9
+	.4byte	0x147c6
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x147a9
-	.8byte	.LBB1387
+	.4byte	0x147b6
+	.8byte	.LBB1385
 	.4byte	.Ldebug_ranges0+0x8a0
 	.byte	0x1
 	.2byte	0x39f
 	.uleb128 0x55
-	.4byte	0x147d1
+	.4byte	0x147de
 	.uleb128 0x55
-	.4byte	0x147c5
+	.4byte	0x147d2
 	.uleb128 0x55
-	.4byte	0x147b9
+	.4byte	0x147c6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13c2b
-	.8byte	.LBB1398
-	.8byte	.LBE1398-.LBB1398
+	.4byte	0x13c38
+	.8byte	.LBB1396
+	.8byte	.LBE1396-.LBB1396
 	.byte	0x1
 	.2byte	0x48e
-	.4byte	0x1394e
+	.4byte	0x1395b
 	.uleb128 0x55
-	.4byte	0x13c5c
+	.4byte	0x13c69
 	.uleb128 0x55
-	.4byte	0x13c5c
+	.4byte	0x13c69
 	.uleb128 0x55
-	.4byte	0x13c5c
+	.4byte	0x13c69
 	.uleb128 0x55
-	.4byte	0x13c50
+	.4byte	0x13c5d
 	.uleb128 0x72
-	.4byte	0x13c44
+	.4byte	0x13c51
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x13c38
+	.4byte	0x13c45
 	.uleb128 0x57
-	.8byte	.LBB1399
-	.8byte	.LBE1399-.LBB1399
+	.8byte	.LBB1397
+	.8byte	.LBE1397-.LBB1397
 	.uleb128 0x58
-	.4byte	0x13c68
+	.4byte	0x13c75
 	.uleb128 0x58
-	.4byte	0x13c74
+	.4byte	0x13c81
 	.uleb128 0x58
-	.4byte	0x13c80
+	.4byte	0x13c8d
 	.uleb128 0x58
-	.4byte	0x13c8c
+	.4byte	0x13c99
 	.uleb128 0x58
-	.4byte	0x13c98
+	.4byte	0x13ca5
 	.uleb128 0x58
-	.4byte	0x13ca4
+	.4byte	0x13cb1
 	.uleb128 0x61
-	.4byte	0x13cb0
+	.4byte	0x13cbd
 	.4byte	.LLST131
 	.uleb128 0x61
-	.4byte	0x13cbc
+	.4byte	0x13cc9
 	.4byte	.LLST132
 	.uleb128 0x58
-	.4byte	0x13cc8
+	.4byte	0x13cd5
 	.uleb128 0x61
-	.4byte	0x13cd4
+	.4byte	0x13ce1
 	.4byte	.LLST133
 	.uleb128 0x58
-	.4byte	0x13cde
+	.4byte	0x13ceb
 	.uleb128 0x61
-	.4byte	0x13ce8
+	.4byte	0x13cf5
 	.4byte	.LLST134
 	.uleb128 0x61
-	.4byte	0x13cf4
+	.4byte	0x13d01
 	.4byte	.LLST135
 	.uleb128 0x58
-	.4byte	0x13d00
+	.4byte	0x13d0d
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13dfb
-	.8byte	.LBB1400
-	.8byte	.LBE1400-.LBB1400
+	.4byte	0x13e08
+	.8byte	.LBB1398
+	.8byte	.LBE1398-.LBB1398
 	.byte	0x1
 	.2byte	0x48b
-	.4byte	0x13a48
+	.4byte	0x13a55
 	.uleb128 0x55
-	.4byte	0x13e2c
+	.4byte	0x13e39
 	.uleb128 0x55
-	.4byte	0x13e2c
+	.4byte	0x13e39
 	.uleb128 0x55
-	.4byte	0x13e2c
+	.4byte	0x13e39
 	.uleb128 0x55
-	.4byte	0x13e20
+	.4byte	0x13e2d
 	.uleb128 0x55
-	.4byte	0x13e14
+	.4byte	0x13e21
 	.uleb128 0x55
-	.4byte	0x13e08
+	.4byte	0x13e15
 	.uleb128 0x57
-	.8byte	.LBB1401
-	.8byte	.LBE1401-.LBB1401
+	.8byte	.LBB1399
+	.8byte	.LBE1399-.LBB1399
 	.uleb128 0x58
-	.4byte	0x13e38
+	.4byte	0x13e45
 	.uleb128 0x61
-	.4byte	0x13e44
+	.4byte	0x13e51
 	.4byte	.LLST136
 	.uleb128 0x58
-	.4byte	0x13e4e
+	.4byte	0x13e5b
 	.uleb128 0x61
-	.4byte	0x13e58
+	.4byte	0x13e65
 	.4byte	.LLST137
 	.uleb128 0x61
-	.4byte	0x13e64
+	.4byte	0x13e71
 	.4byte	.LLST138
 	.uleb128 0x61
-	.4byte	0x13e70
+	.4byte	0x13e7d
 	.4byte	.LLST139
 	.uleb128 0x58
-	.4byte	0x13e7c
+	.4byte	0x13e89
 	.uleb128 0x62
-	.4byte	0x13e88
+	.4byte	0x13e95
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x13e94
+	.4byte	0x13ea1
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x13ea0
+	.4byte	0x13ead
 	.4byte	.LLST140
 	.uleb128 0x61
-	.4byte	0x13eac
+	.4byte	0x13eb9
 	.4byte	.LLST141
 	.uleb128 0x61
-	.4byte	0x13eb8
+	.4byte	0x13ec5
 	.4byte	.LLST142
 	.uleb128 0x58
-	.4byte	0x13ec4
+	.4byte	0x13ed1
 	.uleb128 0x5c
-	.4byte	0x147a9
-	.8byte	.LBB1402
+	.4byte	0x147b6
+	.8byte	.LBB1400
 	.4byte	.Ldebug_ranges0+0x8f0
 	.byte	0x1
 	.2byte	0x3c4
-	.4byte	0x13a22
+	.4byte	0x13a2f
 	.uleb128 0x55
-	.4byte	0x147d1
+	.4byte	0x147de
 	.uleb128 0x55
-	.4byte	0x147c5
+	.4byte	0x147d2
 	.uleb128 0x55
-	.4byte	0x147b9
+	.4byte	0x147c6
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x147a9
-	.8byte	.LBB1409
+	.4byte	0x147b6
+	.8byte	.LBB1407
 	.4byte	.Ldebug_ranges0+0x950
 	.byte	0x1
 	.2byte	0x3c5
 	.uleb128 0x55
-	.4byte	0x147d1
+	.4byte	0x147de
 	.uleb128 0x55
-	.4byte	0x147c5
+	.4byte	0x147d2
 	.uleb128 0x55
-	.4byte	0x147b9
+	.4byte	0x147c6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x13d0d
-	.8byte	.LBB1420
-	.8byte	.LBE1420-.LBB1420
+	.4byte	0x13d1a
+	.8byte	.LBB1418
+	.8byte	.LBE1418-.LBB1418
 	.byte	0x1
 	.2byte	0x485
 	.uleb128 0x55
-	.4byte	0x13d3e
+	.4byte	0x13d4b
 	.uleb128 0x55
-	.4byte	0x13d3e
+	.4byte	0x13d4b
 	.uleb128 0x55
-	.4byte	0x13d3e
+	.4byte	0x13d4b
 	.uleb128 0x55
-	.4byte	0x13d32
+	.4byte	0x13d3f
 	.uleb128 0x55
-	.4byte	0x13d26
+	.4byte	0x13d33
 	.uleb128 0x55
-	.4byte	0x13d1a
+	.4byte	0x13d27
 	.uleb128 0x57
-	.8byte	.LBB1421
-	.8byte	.LBE1421-.LBB1421
+	.8byte	.LBB1419
+	.8byte	.LBE1419-.LBB1419
 	.uleb128 0x58
-	.4byte	0x13d4a
+	.4byte	0x13d57
 	.uleb128 0x61
-	.4byte	0x13d56
+	.4byte	0x13d63
 	.4byte	.LLST143
 	.uleb128 0x58
-	.4byte	0x13d60
+	.4byte	0x13d6d
 	.uleb128 0x61
-	.4byte	0x13d6a
+	.4byte	0x13d77
 	.4byte	.LLST144
 	.uleb128 0x61
-	.4byte	0x13d76
+	.4byte	0x13d83
 	.4byte	.LLST145
 	.uleb128 0x61
-	.4byte	0x13d82
+	.4byte	0x13d8f
 	.4byte	.LLST146
 	.uleb128 0x58
-	.4byte	0x13d8e
+	.4byte	0x13d9b
 	.uleb128 0x62
-	.4byte	0x13d9a
+	.4byte	0x13da7
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x13da6
+	.4byte	0x13db3
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x13db2
+	.4byte	0x13dbf
 	.4byte	.LLST147
 	.uleb128 0x61
-	.4byte	0x13dbe
+	.4byte	0x13dcb
 	.4byte	.LLST148
 	.uleb128 0x61
-	.4byte	0x13dca
+	.4byte	0x13dd7
 	.4byte	.LLST149
 	.uleb128 0x58
-	.4byte	0x13dd6
+	.4byte	0x13de3
 	.uleb128 0x58
-	.4byte	0x13de2
+	.4byte	0x13def
 	.uleb128 0x58
-	.4byte	0x13dee
+	.4byte	0x13dfb
 	.uleb128 0x5c
-	.4byte	0x14774
-	.8byte	.LBB1422
+	.4byte	0x14781
+	.8byte	.LBB1420
 	.4byte	.Ldebug_ranges0+0x9a0
 	.byte	0x1
 	.2byte	0x3eb
-	.4byte	0x13b22
+	.4byte	0x13b2f
 	.uleb128 0x55
-	.4byte	0x1479c
+	.4byte	0x147a9
 	.uleb128 0x55
-	.4byte	0x14790
+	.4byte	0x1479d
 	.uleb128 0x55
-	.4byte	0x14784
+	.4byte	0x14791
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x14774
-	.8byte	.LBB1428
+	.4byte	0x14781
+	.8byte	.LBB1426
 	.4byte	.Ldebug_ranges0+0xa00
 	.byte	0x1
 	.2byte	0x3ec
 	.uleb128 0x55
-	.4byte	0x1479c
+	.4byte	0x147a9
 	.uleb128 0x55
-	.4byte	0x14790
+	.4byte	0x1479d
 	.uleb128 0x55
-	.4byte	0x14784
+	.4byte	0x14791
 	.byte	0
 	.byte	0
 	.byte	0
@@ -47608,7 +47644,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x438
 	.byte	0x1
-	.4byte	0x13c2b
+	.4byte	0x13c38
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
@@ -47705,7 +47741,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x3f2
 	.byte	0x1
-	.4byte	0x13d0d
+	.4byte	0x13d1a
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
@@ -47802,7 +47838,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x3cb
 	.byte	0x1
-	.4byte	0x13dfb
+	.4byte	0x13e08
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
@@ -47904,7 +47940,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x3a6
 	.byte	0x1
-	.4byte	0x13ed1
+	.4byte	0x13ede
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
@@ -47996,7 +48032,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x37e
 	.byte	0x1
-	.4byte	0x13fa7
+	.4byte	0x13fb4
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
@@ -48087,11 +48123,11 @@ __exitcall_ebc_exit:
 	.4byte	.LASF3158
 	.byte	0x1
 	.2byte	0x2b0
-	.8byte	.LFB2816
-	.8byte	.LFE2816-.LFB2816
+	.8byte	.LFB2815
+	.8byte	.LFE2815-.LFB2815
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14108
+	.4byte	0x14115
 	.uleb128 0x76
 	.4byte	.LASF3136
 	.byte	0x1
@@ -48243,11 +48279,11 @@ __exitcall_ebc_exit:
 	.4byte	.LASF3166
 	.byte	0x1
 	.2byte	0x20b
-	.8byte	.LFB2815
-	.8byte	.LFE2815-.LFB2815
+	.8byte	.LFB2814
+	.8byte	.LFE2814-.LFB2814
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14263
+	.4byte	0x14270
 	.uleb128 0x76
 	.4byte	.LASF3136
 	.byte	0x1
@@ -48395,7 +48431,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x1ac
 	.byte	0x1
-	.4byte	0x14381
+	.4byte	0x1438e
 	.uleb128 0x66
 	.4byte	.LASF3168
 	.byte	0x1
@@ -48516,11 +48552,11 @@ __exitcall_ebc_exit:
 	.4byte	.LASF3178
 	.byte	0x1
 	.2byte	0x18e
-	.8byte	.LFB2813
-	.8byte	.LFE2813-.LFB2813
+	.8byte	.LFB2812
+	.8byte	.LFE2812-.LFB2812
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1442b
+	.4byte	0x14438
 	.uleb128 0x59
 	.4byte	.LASF2288
 	.byte	0x1
@@ -48540,36 +48576,36 @@ __exitcall_ebc_exit:
 	.4byte	0xe880
 	.4byte	.LLST245
 	.uleb128 0x4f
-	.8byte	.LVL863
+	.8byte	.LVL868
 	.4byte	0x1583f
 	.uleb128 0x4f
-	.8byte	.LVL865
-	.4byte	0x145c5
+	.8byte	.LVL870
+	.4byte	0x145d2
 	.uleb128 0x4f
-	.8byte	.LVL866
+	.8byte	.LVL871
 	.4byte	0x15857
 	.uleb128 0x4f
-	.8byte	.LVL869
-	.4byte	0x1442b
+	.8byte	.LVL874
+	.4byte	0x14438
 	.uleb128 0x4f
-	.8byte	.LVL870
+	.8byte	.LVL875
 	.4byte	0x15857
 	.uleb128 0x4f
-	.8byte	.LVL873
-	.4byte	0x144f2
+	.8byte	.LVL878
+	.4byte	0x144ff
 	.uleb128 0x4f
-	.8byte	.LVL874
+	.8byte	.LVL879
 	.4byte	0x15857
 	.byte	0
 	.uleb128 0x77
 	.4byte	.LASF3179
 	.byte	0x1
 	.2byte	0x15d
-	.8byte	.LFB2812
-	.8byte	.LFE2812-.LFB2812
+	.8byte	.LFB2811
+	.8byte	.LFE2811-.LFB2811
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x144f2
+	.4byte	0x144ff
 	.uleb128 0x76
 	.4byte	.LASF3168
 	.byte	0x1
@@ -48651,11 +48687,11 @@ __exitcall_ebc_exit:
 	.4byte	.LASF3180
 	.byte	0x1
 	.2byte	0x121
-	.8byte	.LFB2811
-	.8byte	.LFE2811-.LFB2811
+	.8byte	.LFB2810
+	.8byte	.LFE2810-.LFB2810
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x145c5
+	.4byte	0x145d2
 	.uleb128 0x76
 	.4byte	.LASF3168
 	.byte	0x1
@@ -48742,11 +48778,11 @@ __exitcall_ebc_exit:
 	.4byte	.LASF3181
 	.byte	0x1
 	.byte	0xd6
-	.8byte	.LFB2810
-	.8byte	.LFE2810-.LFB2810
+	.8byte	.LFB2809
+	.8byte	.LFE2809-.LFB2809
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x146aa
+	.4byte	0x146b7
 	.uleb128 0x79
 	.4byte	.LASF3168
 	.byte	0x1
@@ -48849,7 +48885,7 @@ __exitcall_ebc_exit:
 	.byte	0xb7
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x146de
+	.4byte	0x146eb
 	.uleb128 0x80
 	.string	"ebc"
 	.byte	0x1
@@ -48872,7 +48908,7 @@ __exitcall_ebc_exit:
 	.byte	0xa5
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x14729
+	.4byte	0x14736
 	.uleb128 0x81
 	.4byte	.LASF2871
 	.byte	0x1
@@ -48905,7 +48941,7 @@ __exitcall_ebc_exit:
 	.byte	0x8f
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x14774
+	.4byte	0x14781
 	.uleb128 0x81
 	.4byte	.LASF2871
 	.byte	0x1
@@ -48938,7 +48974,7 @@ __exitcall_ebc_exit:
 	.byte	0x89
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x147a9
+	.4byte	0x147b6
 	.uleb128 0x81
 	.4byte	.LASF2871
 	.byte	0x1
@@ -48961,7 +48997,7 @@ __exitcall_ebc_exit:
 	.byte	0x83
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x147de
+	.4byte	0x147eb
 	.uleb128 0x81
 	.4byte	.LASF2871
 	.byte	0x1
@@ -48983,7 +49019,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x14804
+	.4byte	0x14811
 	.uleb128 0x81
 	.4byte	.LASF2951
 	.byte	0xb
@@ -49000,7 +49036,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x14836
+	.4byte	0x14843
 	.uleb128 0x81
 	.4byte	.LASF2951
 	.byte	0xb
@@ -49022,7 +49058,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x14880
+	.4byte	0x1488d
 	.uleb128 0x81
 	.4byte	.LASF2951
 	.byte	0xb
@@ -49054,7 +49090,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x1489a
+	.4byte	0x148a7
 	.uleb128 0x81
 	.4byte	.LASF2951
 	.byte	0xb
@@ -49067,7 +49103,7 @@ __exitcall_ebc_exit:
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x148c3
+	.4byte	0x148d0
 	.uleb128 0x81
 	.4byte	.LASF2951
 	.byte	0xb
@@ -49084,7 +49120,7 @@ __exitcall_ebc_exit:
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x1490d
+	.4byte	0x1491a
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
@@ -49117,7 +49153,7 @@ __exitcall_ebc_exit:
 	.2byte	0x108
 	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x1492b
+	.4byte	0x14938
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
@@ -49130,7 +49166,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x14948
+	.4byte	0x14955
 	.uleb128 0x80
 	.string	"bus"
 	.byte	0xc8
@@ -49143,7 +49179,7 @@ __exitcall_ebc_exit:
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14965
+	.4byte	0x14972
 	.uleb128 0x81
 	.4byte	.LASF3204
 	.byte	0xa
@@ -49155,7 +49191,7 @@ __exitcall_ebc_exit:
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x149a3
+	.4byte	0x149b0
 	.uleb128 0x80
 	.string	"dev"
 	.byte	0xcb
@@ -49183,7 +49219,7 @@ __exitcall_ebc_exit:
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x149c0
+	.4byte	0x149cd
 	.uleb128 0x81
 	.4byte	.LASF2952
 	.byte	0x3
@@ -49196,7 +49232,7 @@ __exitcall_ebc_exit:
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x149e7
+	.4byte	0x149f4
 	.uleb128 0x81
 	.4byte	.LASF2952
 	.byte	0x3
@@ -49213,7 +49249,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x14a01
+	.4byte	0x14a0e
 	.uleb128 0x81
 	.4byte	.LASF2952
 	.byte	0x3
@@ -49225,7 +49261,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x14a1b
+	.4byte	0x14a28
 	.uleb128 0x81
 	.4byte	.LASF2952
 	.byte	0x3
@@ -49237,7 +49273,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x14a35
+	.4byte	0x14a42
 	.uleb128 0x81
 	.4byte	.LASF2952
 	.byte	0x3
@@ -49249,19 +49285,13 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x14a4f
+	.4byte	0x14a5c
 	.uleb128 0x81
 	.4byte	.LASF2952
 	.byte	0x3
 	.byte	0x1c
 	.4byte	0xdbc0
 	.byte	0
-	.uleb128 0x83
-	.4byte	.LASF3344
-	.byte	0xc2
-	.byte	0x36
-	.4byte	0xc6
-	.byte	0x3
 	.uleb128 0x82
 	.4byte	.LASF3214
 	.byte	0x4
@@ -49969,7 +49999,7 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0xf
 	.byte	0x1c
-	.4byte	0x12a27
+	.4byte	0x12a34
 	.byte	0
 	.uleb128 0x7e
 	.string	"__u"
@@ -49978,7 +50008,7 @@ __exitcall_ebc_exit:
 	.4byte	0x15060
 	.byte	0
 	.byte	0
-	.uleb128 0x84
+	.uleb128 0x83
 	.4byte	.LASF3345
 	.byte	0x20
 	.2byte	0x126
@@ -50158,7 +50188,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x1520c
-	.uleb128 0x85
+	.uleb128 0x84
 	.uleb128 0x3
 	.4byte	0x1520a
 	.uleb128 0x82
@@ -50203,10 +50233,10 @@ __exitcall_ebc_exit:
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x1520a
-	.uleb128 0x86
+	.uleb128 0x85
 	.4byte	0x103e9
-	.8byte	.LFB2847
-	.8byte	.LFE2847-.LFB2847
+	.8byte	.LFB2846
+	.8byte	.LFE2846-.LFB2846
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x15298
@@ -50218,153 +50248,153 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x51
 	.byte	0
-	.uleb128 0x87
-	.4byte	0x12c09
-	.8byte	.LFB2879
-	.8byte	.LFE2879-.LFB2879
+	.uleb128 0x86
+	.4byte	0x12c16
+	.8byte	.LFB2878
+	.8byte	.LFE2878-.LFB2878
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x1539b
 	.uleb128 0x70
-	.4byte	0x12c16
+	.4byte	0x12c23
 	.4byte	.LLST196
 	.uleb128 0x55
-	.4byte	0x12c22
+	.4byte	0x12c2f
 	.uleb128 0x58
-	.4byte	0x12c2e
+	.4byte	0x12c3b
 	.uleb128 0x5c
-	.4byte	0x148c3
-	.8byte	.LBB1536
+	.4byte	0x148d0
+	.8byte	.LBB1534
 	.4byte	.Ldebug_ranges0+0xc90
 	.byte	0x1
 	.2byte	0x5c8
 	.4byte	0x15319
 	.uleb128 0x55
-	.4byte	0x148f4
+	.4byte	0x14901
 	.uleb128 0x55
-	.4byte	0x148e8
+	.4byte	0x148f5
 	.uleb128 0x55
-	.4byte	0x148dc
+	.4byte	0x148e9
 	.uleb128 0x55
-	.4byte	0x148d0
+	.4byte	0x148dd
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xc90
 	.uleb128 0x58
-	.4byte	0x14900
-	.uleb128 0x60
 	.4byte	0x1490d
-	.8byte	.LBB1538
+	.uleb128 0x60
+	.4byte	0x1491a
+	.8byte	.LBB1536
 	.4byte	.Ldebug_ranges0+0xce0
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x55
-	.4byte	0x1491e
+	.4byte	0x1492b
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14836
-	.8byte	.LBB1547
+	.4byte	0x14843
+	.8byte	.LBB1545
 	.4byte	.Ldebug_ranges0+0xd10
 	.byte	0x1
 	.2byte	0x5c9
 	.4byte	0x1534b
 	.uleb128 0x55
-	.4byte	0x14873
+	.4byte	0x14880
 	.uleb128 0x55
-	.4byte	0x14867
+	.4byte	0x14874
 	.uleb128 0x55
-	.4byte	0x1485b
+	.4byte	0x14868
 	.uleb128 0x55
-	.4byte	0x1484f
+	.4byte	0x1485c
 	.uleb128 0x55
-	.4byte	0x14843
+	.4byte	0x14850
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14804
-	.8byte	.LBB1553
-	.8byte	.LBE1553-.LBB1553
+	.4byte	0x14811
+	.8byte	.LBB1551
+	.8byte	.LBE1551-.LBB1551
 	.byte	0x1
 	.2byte	0x5ca
 	.4byte	0x15377
 	.uleb128 0x55
-	.4byte	0x14829
+	.4byte	0x14836
 	.uleb128 0x55
-	.4byte	0x1481d
+	.4byte	0x1482a
 	.uleb128 0x55
-	.4byte	0x14811
+	.4byte	0x1481e
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x147de
-	.8byte	.LBB1555
-	.8byte	.LBE1555-.LBB1555
+	.4byte	0x147eb
+	.8byte	.LBB1553
+	.8byte	.LBE1553-.LBB1553
 	.byte	0x1
 	.2byte	0x5cb
 	.uleb128 0x55
-	.4byte	0x147f7
+	.4byte	0x14804
 	.uleb128 0x55
-	.4byte	0x147eb
+	.4byte	0x147f8
 	.byte	0
 	.byte	0
-	.uleb128 0x87
-	.4byte	0x146aa
-	.8byte	.LFB2881
-	.8byte	.LFE2881-.LFB2881
+	.uleb128 0x86
+	.4byte	0x146b7
+	.8byte	.LFB2880
+	.8byte	.LFE2880-.LFB2880
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x15459
 	.uleb128 0x70
-	.4byte	0x146ba
+	.4byte	0x146c7
 	.4byte	.LLST198
 	.uleb128 0x70
-	.4byte	0x146c6
+	.4byte	0x146d3
 	.4byte	.LLST199
 	.uleb128 0x58
-	.4byte	0x146d2
+	.4byte	0x146df
 	.uleb128 0x71
-	.4byte	0x14880
-	.8byte	.LBB1566
-	.8byte	.LBE1566-.LBB1566
+	.4byte	0x1488d
+	.8byte	.LBB1564
+	.8byte	.LBE1564-.LBB1564
 	.byte	0x1
 	.byte	0xc9
 	.4byte	0x153ef
 	.uleb128 0x55
-	.4byte	0x1488d
+	.4byte	0x1489a
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14a1b
-	.8byte	.LBB1568
-	.8byte	.LBE1568-.LBB1568
+	.4byte	0x14a28
+	.8byte	.LBB1566
+	.8byte	.LBE1566-.LBB1566
 	.byte	0x1
 	.byte	0xca
 	.4byte	0x15410
 	.uleb128 0x55
-	.4byte	0x14a28
+	.4byte	0x14a35
 	.byte	0
 	.uleb128 0x71
 	.4byte	0x14a5c
-	.8byte	.LBB1570
-	.8byte	.LBE1570-.LBB1570
+	.8byte	.LBB1568
+	.8byte	.LBE1568-.LBB1568
 	.byte	0x1
 	.byte	0xcd
 	.4byte	0x1543e
 	.uleb128 0x55
 	.4byte	0x14a69
 	.uleb128 0x4f
-	.8byte	.LVL606
+	.8byte	.LVL611
 	.4byte	0x1580f
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL603
+	.8byte	.LVL608
 	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL607
+	.8byte	.LVL612
 	.4byte	0x15584
 	.byte	0
-	.uleb128 0x86
+	.uleb128 0x85
 	.4byte	0x12585
-	.8byte	.LFB2883
-	.8byte	.LFE2883-.LFB2883
+	.8byte	.LFB2882
+	.8byte	.LFE2882-.LFB2882
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x154ba
@@ -50391,394 +50421,399 @@ __exitcall_ebc_exit:
 	.4byte	0x125e8
 	.4byte	.LLST202
 	.uleb128 0x4f
-	.8byte	.LVL617
-	.4byte	0x15892
+	.8byte	.LVL622
+	.4byte	0x1589e
 	.byte	0
-	.uleb128 0x87
-	.4byte	0x146aa
-	.8byte	.LFB2887
-	.8byte	.LFE2887-.LFB2887
+	.uleb128 0x86
+	.4byte	0x146b7
+	.8byte	.LFB2886
+	.8byte	.LFE2886-.LFB2886
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x1556c
 	.uleb128 0x70
-	.4byte	0x146ba
+	.4byte	0x146c7
 	.4byte	.LLST228
 	.uleb128 0x58
-	.4byte	0x146d2
+	.4byte	0x146df
 	.uleb128 0x55
-	.4byte	0x146c6
+	.4byte	0x146d3
 	.uleb128 0x71
-	.4byte	0x14a35
-	.8byte	.LBB1893
-	.8byte	.LBE1893-.LBB1893
+	.4byte	0x14a42
+	.8byte	.LBB1891
+	.8byte	.LBE1891-.LBB1891
 	.byte	0x1
 	.byte	0xc2
 	.4byte	0x1550a
 	.uleb128 0x55
-	.4byte	0x14a42
+	.4byte	0x14a4f
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x1489a
-	.8byte	.LBB1895
-	.8byte	.LBE1895-.LBB1895
+	.4byte	0x148a7
+	.8byte	.LBB1893
+	.8byte	.LBE1893-.LBB1893
 	.byte	0x1
 	.byte	0xc3
 	.4byte	0x15530
 	.uleb128 0x55
-	.4byte	0x148b6
+	.4byte	0x148c3
 	.uleb128 0x55
-	.4byte	0x148aa
+	.4byte	0x148b7
 	.byte	0
 	.uleb128 0x71
 	.4byte	0x14a7c
-	.8byte	.LBB1897
-	.8byte	.LBE1897-.LBB1897
+	.8byte	.LBB1895
+	.8byte	.LBE1895-.LBB1895
 	.byte	0x1
 	.byte	0xbf
 	.4byte	0x1555e
 	.uleb128 0x55
 	.4byte	0x14a89
 	.uleb128 0x4f
-	.8byte	.LVL809
-	.4byte	0x1589e
+	.8byte	.LVL814
+	.4byte	0x158aa
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL806
+	.8byte	.LVL811
 	.4byte	0x15584
 	.byte	0
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3275
 	.4byte	.LASF3275
 	.byte	0xbe
 	.byte	0xcc
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3276
 	.4byte	.LASF3276
 	.byte	0xbe
 	.byte	0xca
-	.uleb128 0x89
+	.uleb128 0x88
 	.4byte	.LASF3277
 	.4byte	.LASF3277
 	.byte	0x2
 	.2byte	0x5d1
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3278
 	.4byte	.LASF3278
 	.byte	0xac
 	.byte	0x4f
-	.uleb128 0x89
+	.uleb128 0x88
 	.4byte	.LASF3279
 	.4byte	.LASF3279
 	.byte	0x2
 	.2byte	0x2bf
-	.uleb128 0x89
+	.uleb128 0x88
 	.4byte	.LASF3280
 	.4byte	.LASF3280
 	.byte	0xc
 	.2byte	0x149
-	.uleb128 0x89
+	.uleb128 0x88
 	.4byte	.LASF3281
 	.4byte	.LASF3281
 	.byte	0xc
 	.2byte	0x172
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3282
 	.4byte	.LASF3282
 	.byte	0xd4
 	.byte	0x78
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3283
 	.4byte	.LASF3283
 	.byte	0xaa
 	.byte	0x59
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3284
 	.4byte	.LASF3284
 	.byte	0xc3
 	.byte	0x31
-	.uleb128 0x8a
+	.uleb128 0x89
 	.4byte	.LASF3285
 	.4byte	.LASF3285
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3285
 	.4byte	.LASF3285
 	.byte	0xd5
 	.byte	0x36
-	.uleb128 0x89
+	.uleb128 0x88
 	.4byte	.LASF3286
 	.4byte	.LASF3286
 	.byte	0x2
 	.2byte	0x5cb
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3287
 	.4byte	.LASF3287
 	.byte	0xc2
 	.byte	0x30
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3288
 	.4byte	.LASF3288
 	.byte	0xc2
 	.byte	0x31
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3289
 	.4byte	.LASF3289
 	.byte	0xab
 	.byte	0x9
-	.uleb128 0x89
+	.uleb128 0x88
 	.4byte	.LASF3290
 	.4byte	.LASF3290
 	.byte	0x48
 	.2byte	0x6b8
-	.uleb128 0x89
+	.uleb128 0x88
 	.4byte	.LASF3291
 	.4byte	.LASF3291
 	.byte	0x12
 	.2byte	0x190
-	.uleb128 0x89
+	.uleb128 0x88
 	.4byte	.LASF3292
 	.4byte	.LASF3292
 	.byte	0x48
 	.2byte	0x676
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3293
 	.4byte	.LASF3293
 	.byte	0x9c
 	.byte	0x67
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3294
 	.4byte	.LASF3294
 	.byte	0x54
 	.byte	0x53
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3295
 	.4byte	.LASF3295
 	.byte	0x54
 	.byte	0xa5
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3296
 	.4byte	.LASF3296
 	.byte	0xc3
 	.byte	0x2c
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3297
 	.4byte	.LASF3297
 	.byte	0xc3
 	.byte	0x28
-	.uleb128 0x89
+	.uleb128 0x88
 	.4byte	.LASF3298
 	.4byte	.LASF3298
 	.byte	0x11
 	.2byte	0x184
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3299
 	.4byte	.LASF3299
 	.byte	0xd6
 	.byte	0x51
-	.uleb128 0x89
+	.uleb128 0x88
 	.4byte	.LASF3300
 	.4byte	.LASF3300
 	.byte	0x20
 	.2byte	0x1d9
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3301
 	.4byte	.LASF3301
 	.byte	0x3
 	.byte	0x3b
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3302
 	.4byte	.LASF3302
 	.byte	0x11
 	.byte	0xb9
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3303
 	.4byte	.LASF3303
 	.byte	0x3a
 	.byte	0xc2
-	.uleb128 0x8a
+	.uleb128 0x89
 	.4byte	.LASF3304
 	.4byte	.LASF3304
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3305
 	.4byte	.LASF3305
 	.byte	0xac
 	.byte	0x4e
-	.uleb128 0x89
+	.uleb128 0x88
 	.4byte	.LASF3306
 	.4byte	.LASF3306
 	.byte	0x2
 	.2byte	0x287
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3307
 	.4byte	.LASF3307
 	.byte	0xbf
 	.byte	0x38
-	.uleb128 0x89
+	.uleb128 0x88
 	.4byte	.LASF3308
 	.4byte	.LASF3308
 	.byte	0xc
 	.2byte	0x165
-	.uleb128 0x89
+	.uleb128 0x88
 	.4byte	.LASF3309
 	.4byte	.LASF3309
 	.byte	0xa3
 	.2byte	0x37b
-	.uleb128 0x89
+	.uleb128 0x88
 	.4byte	.LASF3310
 	.4byte	.LASF3310
 	.byte	0xc
 	.2byte	0x125
-	.uleb128 0x8a
+	.uleb128 0x89
 	.4byte	.LASF3311
 	.4byte	.LASF3311
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3312
 	.4byte	.LASF3312
 	.byte	0xc3
 	.byte	0x2f
-	.uleb128 0x89
+	.uleb128 0x88
 	.4byte	.LASF3313
 	.4byte	.LASF3313
 	.byte	0x20
 	.2byte	0x1c7
-	.uleb128 0x89
+	.uleb128 0x88
 	.4byte	.LASF3314
 	.4byte	.LASF3314
 	.byte	0x20
 	.2byte	0x17e
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3315
 	.4byte	.LASF3315
 	.byte	0x3
 	.byte	0x3a
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3316
 	.4byte	.LASF3316
 	.byte	0xc2
 	.byte	0x32
-	.uleb128 0x89
+	.uleb128 0x88
 	.4byte	.LASF3317
 	.4byte	.LASF3317
 	.byte	0x76
 	.2byte	0xa0a
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3318
 	.4byte	.LASF3318
 	.byte	0xc3
 	.byte	0x2d
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3319
 	.4byte	.LASF3319
 	.byte	0x48
 	.byte	0xdc
-	.uleb128 0x89
+	.uleb128 0x88
 	.4byte	.LASF3320
 	.4byte	.LASF3320
 	.byte	0x3a
 	.2byte	0x459
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3321
 	.4byte	.LASF3321
 	.byte	0x3a
 	.byte	0xe9
-	.uleb128 0x89
+	.uleb128 0x88
 	.4byte	.LASF3322
 	.4byte	.LASF3322
 	.byte	0x3a
 	.2byte	0x45a
-	.uleb128 0x89
+	.uleb128 0x88
 	.4byte	.LASF3323
 	.4byte	.LASF3323
 	.byte	0x6
 	.2byte	0x19f
-	.uleb128 0x89
+	.uleb128 0x88
 	.4byte	.LASF3324
 	.4byte	.LASF3324
 	.byte	0x6
 	.2byte	0x199
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3325
 	.4byte	.LASF3325
 	.byte	0xc3
 	.byte	0x26
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3326
 	.4byte	.LASF3326
 	.byte	0xc3
 	.byte	0x2b
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3327
 	.4byte	.LASF3327
 	.byte	0xc3
 	.byte	0x25
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3328
 	.4byte	.LASF3328
 	.byte	0xc3
 	.byte	0x24
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3329
 	.4byte	.LASF3329
 	.byte	0x9c
 	.byte	0x73
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3330
 	.4byte	.LASF3330
 	.byte	0x48
 	.byte	0xd7
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3331
 	.4byte	.LASF3331
 	.byte	0xc3
 	.byte	0x2a
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3332
 	.4byte	.LASF3332
 	.byte	0xc3
 	.byte	0x27
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3333
 	.4byte	.LASF3333
 	.byte	0x72
 	.byte	0x88
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3334
 	.4byte	.LASF3334
 	.byte	0xc4
 	.byte	0x6f
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3335
 	.4byte	.LASF3335
 	.byte	0x72
 	.byte	0x98
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3336
 	.4byte	.LASF3336
 	.byte	0xc2
 	.byte	0x33
-	.uleb128 0x89
+	.uleb128 0x87
 	.4byte	.LASF3337
 	.4byte	.LASF3337
+	.byte	0xc2
+	.byte	0x36
+	.uleb128 0x88
+	.4byte	.LASF3338
+	.4byte	.LASF3338
 	.byte	0x12
 	.2byte	0x1d6
-	.uleb128 0x8b
+	.uleb128 0x8a
 	.string	"up"
 	.string	"up"
 	.byte	0x78
 	.byte	0x2c
-	.uleb128 0x88
-	.4byte	.LASF3338
-	.4byte	.LASF3338
-	.byte	0x78
-	.byte	0x27
-	.uleb128 0x88
+	.uleb128 0x87
 	.4byte	.LASF3339
 	.4byte	.LASF3339
-	.byte	0x1e
-	.byte	0xb0
-	.uleb128 0x88
+	.byte	0x78
+	.byte	0x27
+	.uleb128 0x87
 	.4byte	.LASF3340
 	.4byte	.LASF3340
+	.byte	0x1e
+	.byte	0xb0
+	.uleb128 0x87
+	.4byte	.LASF3341
+	.4byte	.LASF3341
 	.byte	0x9c
 	.byte	0x71
 	.byte	0
@@ -52508,23 +52543,6 @@ __exitcall_ebc_exit:
 	.uleb128 0x3a
 	.uleb128 0xb
 	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x27
-	.uleb128 0x19
-	.uleb128 0x49
-	.uleb128 0x13
-	.uleb128 0x20
-	.uleb128 0xb
-	.byte	0
-	.byte	0
-	.uleb128 0x84
-	.uleb128 0x2e
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
 	.uleb128 0x5
 	.uleb128 0x27
 	.uleb128 0x19
@@ -52532,12 +52550,12 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x85
+	.uleb128 0x84
 	.uleb128 0x35
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x86
+	.uleb128 0x85
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x31
@@ -52554,7 +52572,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x87
+	.uleb128 0x86
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x31
@@ -52571,7 +52589,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x88
+	.uleb128 0x87
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -52588,7 +52606,7 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x89
+	.uleb128 0x88
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -52605,7 +52623,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x5
 	.byte	0
 	.byte	0
-	.uleb128 0x8a
+	.uleb128 0x89
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -52618,7 +52636,7 @@ __exitcall_ebc_exit:
 	.uleb128 0xe
 	.byte	0
 	.byte	0
-	.uleb128 0x8b
+	.uleb128 0x8a
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -52646,8 +52664,8 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	0
 .LLST200:
-	.8byte	.LVL609
-	.8byte	.LVL610
+	.8byte	.LVL614
+	.8byte	.LVL615
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -52660,758 +52678,758 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	0
 .LLST203:
-	.8byte	.LVL618
-	.8byte	.LVL619
+	.8byte	.LVL623
+	.8byte	.LVL624
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST204:
-	.8byte	.LVL622
-	.8byte	.LVL623
+	.8byte	.LVL627
+	.8byte	.LVL628
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL634
-	.8byte	.LVL635
+	.8byte	.LVL639
+	.8byte	.LVL640
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL766
-	.8byte	.LVL767
+	.8byte	.LVL771
+	.8byte	.LVL772
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST205:
-	.8byte	.LVL630
-	.8byte	.LVL631
+	.8byte	.LVL635
+	.8byte	.LVL636
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL679
-	.8byte	.LVL680
+	.8byte	.LVL684
+	.8byte	.LVL685
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST206:
-	.8byte	.LVL634
-	.8byte	.LVL636
+	.8byte	.LVL639
+	.8byte	.LVL641
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL643
-	.8byte	.LVL679
+	.8byte	.LVL648
+	.8byte	.LVL684
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL684
-	.8byte	.LVL766
+	.8byte	.LVL689
+	.8byte	.LVL771
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL767
 	.8byte	.LVL772
+	.8byte	.LVL777
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL775
-	.8byte	.LVL786
+	.8byte	.LVL780
+	.8byte	.LVL791
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL788
-	.8byte	.LFE2862
+	.8byte	.LVL793
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
 .LLST207:
-	.8byte	.LVL625
-	.8byte	.LVL637
+	.8byte	.LVL630
+	.8byte	.LVL642
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL641
-	.8byte	.LVL644
+	.8byte	.LVL646
+	.8byte	.LVL649
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL679
 	.8byte	.LVL684
+	.8byte	.LVL689
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL773
-	.8byte	.LVL775
+	.8byte	.LVL778
+	.8byte	.LVL780
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL800
-	.8byte	.LFE2862
+	.8byte	.LVL805
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
 .LLST208:
-	.8byte	.LVL625
-	.8byte	.LVL626
+	.8byte	.LVL630
+	.8byte	.LVL631
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL626
-	.8byte	.LVL627
+	.8byte	.LVL631
+	.8byte	.LVL632
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL628
-	.8byte	.LVL632
+	.8byte	.LVL633
+	.8byte	.LVL637
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL632
-	.8byte	.LVL682
+	.8byte	.LVL637
+	.8byte	.LVL687
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL682
-	.8byte	.LVL766
+	.8byte	.LVL687
+	.8byte	.LVL771
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL767
 	.8byte	.LVL772
+	.8byte	.LVL777
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL773
-	.8byte	.LVL786
+	.8byte	.LVL778
+	.8byte	.LVL791
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL788
-	.8byte	.LFE2862
+	.8byte	.LVL793
+	.8byte	.LFE2861
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
 	.8byte	0
 	.8byte	0
 .LLST209:
-	.8byte	.LVL629
-	.8byte	.LVL636
+	.8byte	.LVL634
+	.8byte	.LVL641
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL641
-	.8byte	.LVL643
+	.8byte	.LVL646
+	.8byte	.LVL648
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL679
 	.8byte	.LVL684
+	.8byte	.LVL689
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL800
-	.8byte	.LFE2862
+	.8byte	.LVL805
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
 .LLST210:
-	.8byte	.LVL634
 	.8byte	.LVL639
+	.8byte	.LVL644
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL665
-	.8byte	.LVL673
+	.8byte	.LVL670
+	.8byte	.LVL678
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL684
-	.8byte	.LVL687
+	.8byte	.LVL689
+	.8byte	.LVL692
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL779
-	.8byte	.LVL780
+	.8byte	.LVL784
+	.8byte	.LVL785
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL788
-	.8byte	.LVL789
+	.8byte	.LVL793
+	.8byte	.LVL794
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL800
-	.8byte	.LFE2862
+	.8byte	.LVL805
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
 .LLST211:
-	.8byte	.LVL634
 	.8byte	.LVL639
+	.8byte	.LVL644
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL673
-	.8byte	.LVL677
+	.8byte	.LVL678
+	.8byte	.LVL682
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL687
-	.8byte	.LVL688
+	.8byte	.LVL692
+	.8byte	.LVL693
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL789
-	.8byte	.LVL790
+	.8byte	.LVL794
+	.8byte	.LVL795
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL800
-	.8byte	.LFE2862
+	.8byte	.LVL805
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
 .LLST212:
-	.8byte	.LVL688
-	.8byte	.LVL689-1
+	.8byte	.LVL693
+	.8byte	.LVL694-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST213:
-	.8byte	.LVL694
-	.8byte	.LVL697
+	.8byte	.LVL699
+	.8byte	.LVL702
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST214:
-	.8byte	.LVL695
-	.8byte	.LVL696
+	.8byte	.LVL700
+	.8byte	.LVL701
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST215:
-	.8byte	.LVL634
-	.8byte	.LVL638
+	.8byte	.LVL639
+	.8byte	.LVL643
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL699
-	.8byte	.LVL707
+	.8byte	.LVL704
+	.8byte	.LVL712
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL781
-	.8byte	.LVL783
+	.8byte	.LVL786
+	.8byte	.LVL788
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL783
-	.8byte	.LVL784
+	.8byte	.LVL788
+	.8byte	.LVL789
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL784
-	.8byte	.LVL786
+	.8byte	.LVL789
+	.8byte	.LVL791
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL800
-	.8byte	.LFE2862
+	.8byte	.LVL805
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
 .LLST216:
-	.8byte	.LVL702
-	.8byte	.LVL705
+	.8byte	.LVL707
+	.8byte	.LVL710
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST217:
-	.8byte	.LVL703
-	.8byte	.LVL704
+	.8byte	.LVL708
+	.8byte	.LVL709
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST218:
-	.8byte	.LVL706
-	.8byte	.LVL708-1
+	.8byte	.LVL711
+	.8byte	.LVL713-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST219:
-	.8byte	.LVL634
-	.8byte	.LVL641
+	.8byte	.LVL639
+	.8byte	.LVL646
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL713
-	.8byte	.LVL751
+	.8byte	.LVL718
+	.8byte	.LVL756
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL751
-	.8byte	.LVL752
+	.8byte	.LVL756
+	.8byte	.LVL757
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL755
-	.8byte	.LVL766
+	.8byte	.LVL760
+	.8byte	.LVL771
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL767
 	.8byte	.LVL772
+	.8byte	.LVL777
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL794
-	.8byte	.LFE2862
+	.8byte	.LVL799
+	.8byte	.LFE2861
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
 	.8byte	0
 	.8byte	0
 .LLST220:
-	.8byte	.LVL634
-	.8byte	.LVL641
+	.8byte	.LVL639
+	.8byte	.LVL646
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL713
-	.8byte	.LVL763
+	.8byte	.LVL718
+	.8byte	.LVL768
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL763
-	.8byte	.LVL764
+	.8byte	.LVL768
+	.8byte	.LVL769
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL767
 	.8byte	.LVL772
+	.8byte	.LVL777
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL792
-	.8byte	.LFE2862
+	.8byte	.LVL797
+	.8byte	.LFE2861
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
 	.8byte	0
 	.8byte	0
 .LLST221:
-	.8byte	.LVL634
-	.8byte	.LVL638
+	.8byte	.LVL639
+	.8byte	.LVL643
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL719
-	.8byte	.LVL730
+	.8byte	.LVL724
+	.8byte	.LVL735
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL734
-	.8byte	.LVL745
+	.8byte	.LVL739
+	.8byte	.LVL750
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL755
-	.8byte	.LVL757
+	.8byte	.LVL760
+	.8byte	.LVL762
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL760
-	.8byte	.LVL766
+	.8byte	.LVL765
+	.8byte	.LVL771
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL793
-	.8byte	.LVL794
+	.8byte	.LVL798
+	.8byte	.LVL799
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL797
-	.8byte	.LFE2862
+	.8byte	.LVL802
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
 .LLST222:
-	.8byte	.LVL634
-	.8byte	.LVL640
+	.8byte	.LVL639
+	.8byte	.LVL645
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL724
-	.8byte	.LVL747
+	.8byte	.LVL729
+	.8byte	.LVL752
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL754
-	.8byte	.LVL766
+	.8byte	.LVL759
+	.8byte	.LVL771
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL767
 	.8byte	.LVL772
+	.8byte	.LVL777
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL797
-	.8byte	.LFE2862
+	.8byte	.LVL802
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
 .LLST223:
-	.8byte	.LVL634
 	.8byte	.LVL639
+	.8byte	.LVL644
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL715
-	.8byte	.LVL721
+	.8byte	.LVL720
+	.8byte	.LVL726
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL722
-	.8byte	.LVL725
+	.8byte	.LVL727
+	.8byte	.LVL730
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL734
-	.8byte	.LVL745
+	.8byte	.LVL739
+	.8byte	.LVL750
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL747
-	.8byte	.LVL755
+	.8byte	.LVL752
+	.8byte	.LVL760
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL792
 	.8byte	.LVL797
+	.8byte	.LVL802
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL800
-	.8byte	.LFE2862
+	.8byte	.LVL805
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
 .LLST224:
-	.8byte	.LVL634
-	.8byte	.LVL640
+	.8byte	.LVL639
+	.8byte	.LVL645
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL717
-	.8byte	.LVL724
+	.8byte	.LVL722
+	.8byte	.LVL729
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL726
-	.8byte	.LVL754
+	.8byte	.LVL731
+	.8byte	.LVL759
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL767
 	.8byte	.LVL772
+	.8byte	.LVL777
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL792
 	.8byte	.LVL797
+	.8byte	.LVL802
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL800
-	.8byte	.LFE2862
+	.8byte	.LVL805
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
 .LLST225:
-	.8byte	.LVL634
-	.8byte	.LVL640
+	.8byte	.LVL639
+	.8byte	.LVL645
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL720
-	.8byte	.LVL747
+	.8byte	.LVL725
+	.8byte	.LVL752
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL750
-	.8byte	.LVL766
+	.8byte	.LVL755
+	.8byte	.LVL771
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL767
 	.8byte	.LVL772
+	.8byte	.LVL777
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL792
-	.8byte	.LVL794
+	.8byte	.LVL797
+	.8byte	.LVL799
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL794
-	.8byte	.LVL795
+	.8byte	.LVL799
+	.8byte	.LVL800
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL795
-	.8byte	.LFE2862
+	.8byte	.LVL800
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x6b
 	.8byte	0
 	.8byte	0
 .LLST226:
-	.8byte	.LVL634
 	.8byte	.LVL639
+	.8byte	.LVL644
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL721
-	.8byte	.LVL747
+	.8byte	.LVL726
+	.8byte	.LVL752
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL755
-	.8byte	.LVL766
+	.8byte	.LVL760
+	.8byte	.LVL771
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL767
 	.8byte	.LVL772
+	.8byte	.LVL777
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL797
-	.8byte	.LVL798
+	.8byte	.LVL802
+	.8byte	.LVL803
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL798
-	.8byte	.LFE2862
+	.8byte	.LVL803
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
 .LLST227:
-	.8byte	.LVL634
-	.8byte	.LVL638
+	.8byte	.LVL639
+	.8byte	.LVL643
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL730
-	.8byte	.LVL747
+	.8byte	.LVL735
+	.8byte	.LVL752
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL767
-	.8byte	.LVL769
+	.8byte	.LVL772
+	.8byte	.LVL774
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL800
-	.8byte	.LFE2862
+	.8byte	.LVL805
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
 .LLST86:
-	.8byte	.LVL329
-	.8byte	.LVL330
+	.8byte	.LVL334
+	.8byte	.LVL335
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST87:
-	.8byte	.LVL329
-	.8byte	.LVL331-1
+	.8byte	.LVL334
+	.8byte	.LVL336-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST88:
-	.8byte	.LVL329
-	.8byte	.LVL331-1
+	.8byte	.LVL334
+	.8byte	.LVL336-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST89:
-	.8byte	.LVL332
-	.8byte	.LVL333
+	.8byte	.LVL337
+	.8byte	.LVL338
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST90:
-	.8byte	.LVL332
-	.8byte	.LVL334
+	.8byte	.LVL337
+	.8byte	.LVL339
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST91:
-	.8byte	.LVL332
-	.8byte	.LVL335
+	.8byte	.LVL337
+	.8byte	.LVL340
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL335
-	.8byte	.LVL336-1
+	.8byte	.LVL340
+	.8byte	.LVL341-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST92:
-	.8byte	.LVL337
-	.8byte	.LVL338
+	.8byte	.LVL342
+	.8byte	.LVL343
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST93:
-	.8byte	.LVL337
-	.8byte	.LVL339
+	.8byte	.LVL342
+	.8byte	.LVL344
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST94:
-	.8byte	.LVL337
-	.8byte	.LVL340
+	.8byte	.LVL342
+	.8byte	.LVL345
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL340
-	.8byte	.LVL341-1
+	.8byte	.LVL345
+	.8byte	.LVL346-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST104:
-	.8byte	.LVL362
-	.8byte	.LVL363
+	.8byte	.LVL367
+	.8byte	.LVL368
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST105:
-	.8byte	.LVL362
-	.8byte	.LVL364
+	.8byte	.LVL367
+	.8byte	.LVL369
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST106:
-	.8byte	.LVL362
-	.8byte	.LVL366
+	.8byte	.LVL367
+	.8byte	.LVL371
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL366
 	.8byte	.LVL371
+	.8byte	.LVL376
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL372
-	.8byte	.LFE2852
+	.8byte	.LVL377
+	.8byte	.LFE2851
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
 .LLST107:
-	.8byte	.LVL362
-	.8byte	.LVL367-1
+	.8byte	.LVL367
+	.8byte	.LVL372-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL367-1
-	.8byte	.LVL370
+	.8byte	.LVL372-1
+	.8byte	.LVL375
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL372
-	.8byte	.LVL373
+	.8byte	.LVL377
+	.8byte	.LVL378
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL375
-	.8byte	.LVL376
+	.8byte	.LVL380
+	.8byte	.LVL381
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST108:
-	.8byte	.LVL365
-	.8byte	.LVL371
+	.8byte	.LVL370
+	.8byte	.LVL376
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL372
-	.8byte	.LFE2852
+	.8byte	.LVL377
+	.8byte	.LFE2851
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
 .LLST109:
-	.8byte	.LVL368
-	.8byte	.LVL372
+	.8byte	.LVL373
+	.8byte	.LVL377
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
-	.8byte	.LVL375
-	.8byte	.LFE2852
+	.8byte	.LVL380
+	.8byte	.LFE2851
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
 	.8byte	0
 	.8byte	0
 .LLST95:
-	.8byte	.LVL342
-	.8byte	.LVL343
+	.8byte	.LVL347
+	.8byte	.LVL348
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST96:
-	.8byte	.LVL342
-	.8byte	.LVL344
+	.8byte	.LVL347
+	.8byte	.LVL349
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST97:
-	.8byte	.LVL342
-	.8byte	.LVL345-1
+	.8byte	.LVL347
+	.8byte	.LVL350-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL345-1
-	.8byte	.LVL347
+	.8byte	.LVL350-1
+	.8byte	.LVL352
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
 .LLST98:
-	.8byte	.LVL348
-	.8byte	.LVL349
+	.8byte	.LVL353
+	.8byte	.LVL354
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST99:
-	.8byte	.LVL348
-	.8byte	.LVL350
+	.8byte	.LVL353
+	.8byte	.LVL355
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST100:
-	.8byte	.LVL348
-	.8byte	.LVL351
+	.8byte	.LVL353
+	.8byte	.LVL356
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL351
-	.8byte	.LVL354
+	.8byte	.LVL356
+	.8byte	.LVL359
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL355
-	.8byte	.LFE2850
+	.8byte	.LVL360
+	.8byte	.LFE2849
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST101:
-	.8byte	.LVL357
-	.8byte	.LVL358
+	.8byte	.LVL362
+	.8byte	.LVL363
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST102:
-	.8byte	.LVL357
-	.8byte	.LVL359
+	.8byte	.LVL362
+	.8byte	.LVL364
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST103:
-	.8byte	.LVL357
-	.8byte	.LVL360
+	.8byte	.LVL362
+	.8byte	.LVL365
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL360
-	.8byte	.LVL361-1
+	.8byte	.LVL365
+	.8byte	.LVL366-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST110:
-	.8byte	.LVL379
-	.8byte	.LVL380-1
+	.8byte	.LVL384
+	.8byte	.LVL385-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST111:
-	.8byte	.LVL379
-	.8byte	.LVL380-1
+	.8byte	.LVL384
+	.8byte	.LVL385-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST112:
-	.8byte	.LVL379
-	.8byte	.LVL380-1
+	.8byte	.LVL384
+	.8byte	.LVL385-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL380-1
-	.8byte	.LVL382
+	.8byte	.LVL385-1
+	.8byte	.LVL387
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -53532,7 +53550,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL277
-	.8byte	.LFE2843
+	.8byte	.LFE2842
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
@@ -53870,7 +53888,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL285
-	.8byte	.LFE2843
+	.8byte	.LFE2842
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -53904,7 +53922,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x53
 	.8byte	.LVL286
-	.8byte	.LFE2843
+	.8byte	.LFE2842
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
@@ -54259,609 +54277,609 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	0
 .LLST247:
-	.8byte	.LVL896
-	.8byte	.LVL897
+	.8byte	.LVL901
+	.8byte	.LVL902
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST248:
-	.8byte	.LVL898
-	.8byte	.LVL908
+	.8byte	.LVL903
+	.8byte	.LVL913
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL911
-	.8byte	.LFE2838
+	.8byte	.LVL916
+	.8byte	.LFE2837
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST249:
-	.8byte	.LVL899
-	.8byte	.LVL910
+	.8byte	.LVL904
+	.8byte	.LVL915
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL911
-	.8byte	.LVL912
+	.8byte	.LVL916
+	.8byte	.LVL917
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL912
-	.8byte	.LVL913
+	.8byte	.LVL917
+	.8byte	.LVL918
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL913
-	.8byte	.LVL915
+	.8byte	.LVL918
+	.8byte	.LVL920
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL915
-	.8byte	.LVL976
+	.8byte	.LVL920
+	.8byte	.LVL981
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL976
-	.8byte	.LVL977
+	.8byte	.LVL981
+	.8byte	.LVL982
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL977
-	.8byte	.LVL997
+	.8byte	.LVL982
+	.8byte	.LVL1002
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL997
-	.8byte	.LVL998
+	.8byte	.LVL1002
+	.8byte	.LVL1003
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL998
-	.8byte	.LVL1044
+	.8byte	.LVL1003
+	.8byte	.LVL1049
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL1044
-	.8byte	.LVL1045
+	.8byte	.LVL1049
+	.8byte	.LVL1050
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1045
-	.8byte	.LFE2838
+	.8byte	.LVL1050
+	.8byte	.LFE2837
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
 .LLST250:
-	.8byte	.LVL919
-	.8byte	.LVL923-1
+	.8byte	.LVL924
+	.8byte	.LVL928-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL953
-	.8byte	.LVL954
+	.8byte	.LVL958
+	.8byte	.LVL959
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL994
-	.8byte	.LVL996-1
+	.8byte	.LVL999
+	.8byte	.LVL1001-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL1016
-	.8byte	.LVL1020-1
+	.8byte	.LVL1021
+	.8byte	.LVL1025-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST251:
-	.8byte	.LVL921
-	.8byte	.LVL922
+	.8byte	.LVL926
+	.8byte	.LVL927
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL995
-	.8byte	.LVL996-1
+	.8byte	.LVL1000
+	.8byte	.LVL1001-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST252:
-	.8byte	.LVL899
-	.8byte	.LVL910
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL911
-	.8byte	.LVL936
+	.8byte	.LVL904
+	.8byte	.LVL915
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL940
-	.8byte	.LVL943
+	.8byte	.LVL916
+	.8byte	.LVL941
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL947
-	.8byte	.LVL1023
+	.8byte	.LVL945
+	.8byte	.LVL948
 	.2byte	0x1
 	.byte	0x69
+	.8byte	.LVL952
 	.8byte	.LVL1028
-	.8byte	.LVL1032
 	.2byte	0x1
 	.byte	0x69
 	.8byte	.LVL1033
-	.8byte	.LVL1051
+	.8byte	.LVL1037
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1057
-	.8byte	.LFE2838
+	.8byte	.LVL1038
+	.8byte	.LVL1056
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1062
+	.8byte	.LFE2837
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
 .LLST271:
-	.8byte	.LVL1013
-	.8byte	.LVL1014
+	.8byte	.LVL1018
+	.8byte	.LVL1019
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1053
-	.8byte	.LVL1054-1
+	.8byte	.LVL1058
+	.8byte	.LVL1059-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST270:
-	.8byte	.LVL987
-	.8byte	.LVL988
+	.8byte	.LVL992
+	.8byte	.LVL993
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1040
-	.8byte	.LVL1041-1
+	.8byte	.LVL1045
+	.8byte	.LVL1046-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST253:
-	.8byte	.LVL899
-	.8byte	.LVL901
+	.8byte	.LVL904
+	.8byte	.LVL906
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL907
-	.8byte	.LVL909
+	.8byte	.LVL912
+	.8byte	.LVL914
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL911
-	.8byte	.LVL914
+	.8byte	.LVL916
+	.8byte	.LVL919
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL955
-	.8byte	.LVL976
+	.8byte	.LVL960
+	.8byte	.LVL981
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL1059
-	.8byte	.LVL1069
+	.8byte	.LVL1064
+	.8byte	.LVL1074
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL1079
-	.8byte	.LFE2838
+	.8byte	.LVL1084
+	.8byte	.LFE2837
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
 .LLST254:
-	.8byte	.LVL961
-	.8byte	.LVL962
+	.8byte	.LVL966
+	.8byte	.LVL967
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL967
-	.8byte	.LVL968
+	.8byte	.LVL972
+	.8byte	.LVL973
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST255:
-	.8byte	.LVL959
-	.8byte	.LVL960
+	.8byte	.LVL964
+	.8byte	.LVL965
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL965
-	.8byte	.LVL966
+	.8byte	.LVL970
+	.8byte	.LVL971
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST274:
-	.8byte	.LVL1063
-	.8byte	.LVL1064-1
+	.8byte	.LVL1068
+	.8byte	.LVL1069-1
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1067
-	.8byte	.LVL1068
+	.8byte	.LVL1072
+	.8byte	.LVL1073
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST269:
-	.8byte	.LVL970
-	.8byte	.LVL971-1
+	.8byte	.LVL975
+	.8byte	.LVL976-1
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL973
-	.8byte	.LVL974
+	.8byte	.LVL978
+	.8byte	.LVL979
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST256:
-	.8byte	.LVL1017
-	.8byte	.LVL1018
+	.8byte	.LVL1022
+	.8byte	.LVL1023
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL1018
-	.8byte	.LVL1019
+	.8byte	.LVL1023
+	.8byte	.LVL1024
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST257:
-	.8byte	.LVL928
-	.8byte	.LVL929-1
+	.8byte	.LVL933
+	.8byte	.LVL934-1
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST258:
-	.8byte	.LVL925
-	.8byte	.LVL926-1
+	.8byte	.LVL930
+	.8byte	.LVL931-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL931
-	.8byte	.LVL947
+	.8byte	.LVL936
+	.8byte	.LVL952
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL990
-	.8byte	.LVL992-1
+	.8byte	.LVL995
+	.8byte	.LVL997-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL1023
-	.8byte	.LVL1029-1
+	.8byte	.LVL1028
+	.8byte	.LVL1034-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL1032
-	.8byte	.LVL1034-1
+	.8byte	.LVL1037
+	.8byte	.LVL1039-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL1048
-	.8byte	.LVL1049-1
+	.8byte	.LVL1053
+	.8byte	.LVL1054-1
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
 .LLST259:
-	.8byte	.LVL936
-	.8byte	.LVL939
+	.8byte	.LVL941
+	.8byte	.LVL944
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL944
-	.8byte	.LVL947
+	.8byte	.LVL949
+	.8byte	.LVL952
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1023
-	.8byte	.LVL1026
+	.8byte	.LVL1028
+	.8byte	.LVL1031
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1032
-	.8byte	.LVL1033
+	.8byte	.LVL1037
+	.8byte	.LVL1038
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST260:
-	.8byte	.LVL899
-	.8byte	.LVL910
+	.8byte	.LVL904
+	.8byte	.LVL915
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL911
-	.8byte	.LVL920
+	.8byte	.LVL916
+	.8byte	.LVL925
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL925
-	.8byte	.LVL936
+	.8byte	.LVL930
+	.8byte	.LVL941
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL938
 	.8byte	.LVL943
+	.8byte	.LVL948
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL947
-	.8byte	.LVL983
+	.8byte	.LVL952
+	.8byte	.LVL988
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL990
-	.8byte	.LVL994
+	.8byte	.LVL995
+	.8byte	.LVL999
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL997
-	.8byte	.LVL1016
+	.8byte	.LVL1002
+	.8byte	.LVL1021
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1021
-	.8byte	.LVL1023
+	.8byte	.LVL1026
+	.8byte	.LVL1028
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1025
-	.8byte	.LVL1032
+	.8byte	.LVL1030
+	.8byte	.LVL1037
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1033
 	.8byte	.LVL1038
+	.8byte	.LVL1043
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1044
-	.8byte	.LVL1051
+	.8byte	.LVL1049
+	.8byte	.LVL1056
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1057
-	.8byte	.LFE2838
+	.8byte	.LVL1062
+	.8byte	.LFE2837
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
 .LLST261:
-	.8byte	.LVL925
-	.8byte	.LVL926-1
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL935
-	.8byte	.LVL937
+	.8byte	.LVL930
+	.8byte	.LVL931-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL938
-	.8byte	.LVL947
+	.8byte	.LVL940
+	.8byte	.LVL942
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL990
-	.8byte	.LVL992-1
+	.8byte	.LVL943
+	.8byte	.LVL952
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL1023
-	.8byte	.LVL1024
+	.8byte	.LVL995
+	.8byte	.LVL997-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	.LVL1028
-	.8byte	.LVL1029-1
+	.8byte	.LVL1029
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL1032
+	.8byte	.LVL1033
 	.8byte	.LVL1034-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL1048
-	.8byte	.LVL1049-1
+	.8byte	.LVL1037
+	.8byte	.LVL1039-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL1053
+	.8byte	.LVL1054-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST262:
-	.8byte	.LVL925
-	.8byte	.LVL926-1
+	.8byte	.LVL930
+	.8byte	.LVL931-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL935
-	.8byte	.LVL945
+	.8byte	.LVL940
+	.8byte	.LVL950
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL946
-	.8byte	.LVL947
+	.8byte	.LVL951
+	.8byte	.LVL952
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL990
-	.8byte	.LVL992-1
+	.8byte	.LVL995
+	.8byte	.LVL997-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL1023
-	.8byte	.LVL1029-1
+	.8byte	.LVL1028
+	.8byte	.LVL1034-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL1032
-	.8byte	.LVL1034-1
+	.8byte	.LVL1037
+	.8byte	.LVL1039-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL1048
-	.8byte	.LVL1049-1
+	.8byte	.LVL1053
+	.8byte	.LVL1054-1
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST263:
-	.8byte	.LVL925
-	.8byte	.LVL926-1
+	.8byte	.LVL930
+	.8byte	.LVL931-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL935
-	.8byte	.LVL936
+	.8byte	.LVL940
+	.8byte	.LVL941
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL939
-	.8byte	.LVL941
+	.8byte	.LVL944
+	.8byte	.LVL946
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL941
-	.8byte	.LVL942
+	.8byte	.LVL946
+	.8byte	.LVL947
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL990
-	.8byte	.LVL992-1
+	.8byte	.LVL995
+	.8byte	.LVL997-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL1027
-	.8byte	.LVL1029-1
+	.8byte	.LVL1032
+	.8byte	.LVL1034-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL1033
-	.8byte	.LVL1034-1
+	.8byte	.LVL1038
+	.8byte	.LVL1039-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL1048
-	.8byte	.LVL1049-1
+	.8byte	.LVL1053
+	.8byte	.LVL1054-1
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST264:
-	.8byte	.LVL925
-	.8byte	.LVL926-1
+	.8byte	.LVL930
+	.8byte	.LVL931-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL934
-	.8byte	.LVL947
+	.8byte	.LVL939
+	.8byte	.LVL952
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL990
-	.8byte	.LVL992-1
+	.8byte	.LVL995
+	.8byte	.LVL997-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL1023
-	.8byte	.LVL1029-1
+	.8byte	.LVL1028
+	.8byte	.LVL1034-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL1032
-	.8byte	.LVL1034-1
+	.8byte	.LVL1037
+	.8byte	.LVL1039-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL1048
-	.8byte	.LVL1049-1
+	.8byte	.LVL1053
+	.8byte	.LVL1054-1
 	.2byte	0x1
 	.byte	0x61
 	.8byte	0
 	.8byte	0
 .LLST265:
-	.8byte	.LVL925
-	.8byte	.LVL926-1
+	.8byte	.LVL930
+	.8byte	.LVL931-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL932
-	.8byte	.LVL947
+	.8byte	.LVL937
+	.8byte	.LVL952
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL990
-	.8byte	.LVL992-1
+	.8byte	.LVL995
+	.8byte	.LVL997-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL1023
-	.8byte	.LVL1029-1
+	.8byte	.LVL1028
+	.8byte	.LVL1034-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL1032
-	.8byte	.LVL1034-1
+	.8byte	.LVL1037
+	.8byte	.LVL1039-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL1048
-	.8byte	.LVL1049-1
+	.8byte	.LVL1053
+	.8byte	.LVL1054-1
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
 .LLST266:
-	.8byte	.LVL925
-	.8byte	.LVL926-1
+	.8byte	.LVL930
+	.8byte	.LVL931-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL934
-	.8byte	.LVL947
+	.8byte	.LVL939
+	.8byte	.LVL952
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL990
-	.8byte	.LVL992-1
+	.8byte	.LVL995
+	.8byte	.LVL997-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL1023
-	.8byte	.LVL1029-1
+	.8byte	.LVL1028
+	.8byte	.LVL1034-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL1032
-	.8byte	.LVL1034-1
+	.8byte	.LVL1037
+	.8byte	.LVL1039-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL1048
-	.8byte	.LVL1049-1
+	.8byte	.LVL1053
+	.8byte	.LVL1054-1
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST267:
-	.8byte	.LVL899
-	.8byte	.LVL901
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL907
-	.8byte	.LVL909
+	.8byte	.LVL904
+	.8byte	.LVL906
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL911
+	.8byte	.LVL912
 	.8byte	.LVL914
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL925
-	.8byte	.LVL927
+	.8byte	.LVL916
+	.8byte	.LVL919
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL933
-	.8byte	.LVL947
+	.8byte	.LVL930
+	.8byte	.LVL932
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL955
-	.8byte	.LVL957
+	.8byte	.LVL938
+	.8byte	.LVL952
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL981
-	.8byte	.LVL983
+	.8byte	.LVL960
+	.8byte	.LVL962
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL990
-	.8byte	.LVL991
+	.8byte	.LVL986
+	.8byte	.LVL988
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL1023
-	.8byte	.LVL1036
+	.8byte	.LVL995
+	.8byte	.LVL996
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL1048
-	.8byte	.LVL1050
+	.8byte	.LVL1028
+	.8byte	.LVL1041
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL1059
-	.8byte	.LVL1061
+	.8byte	.LVL1053
+	.8byte	.LVL1055
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL1072
-	.8byte	.LVL1074
+	.8byte	.LVL1064
+	.8byte	.LVL1066
 	.2byte	0x1
 	.byte	0x65
+	.8byte	.LVL1077
 	.8byte	.LVL1079
-	.8byte	.LFE2838
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL1084
+	.8byte	.LFE2837
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
 .LLST268:
-	.8byte	.LVL951
-	.8byte	.LVL952
+	.8byte	.LVL956
+	.8byte	.LVL957
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL1007
-	.8byte	.LVL1008-1
+	.8byte	.LVL1012
+	.8byte	.LVL1013-1
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST272:
-	.8byte	.LVL949
-	.8byte	.LVL950
+	.8byte	.LVL954
+	.8byte	.LVL955
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL1047
-	.8byte	.LVL1048
+	.8byte	.LVL1052
+	.8byte	.LVL1053
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL1076
-	.8byte	.LVL1077-1
+	.8byte	.LVL1081
+	.8byte	.LVL1082-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST273:
-	.8byte	.LVL1000
-	.8byte	.LVL1001-1
+	.8byte	.LVL1005
+	.8byte	.LVL1006-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL1058
-	.8byte	.LVL1059
+	.8byte	.LVL1063
+	.8byte	.LVL1064
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
@@ -54874,11 +54892,11 @@ __exitcall_ebc_exit:
 	.8byte	.LVL300
 	.8byte	.LVL307
 	.2byte	0x1
-	.byte	0x65
+	.byte	0x66
 	.8byte	.LVL309
-	.8byte	.LFE2834
+	.8byte	.LFE2833
 	.2byte	0x1
-	.byte	0x65
+	.byte	0x66
 	.8byte	0
 	.8byte	0
 .LLST84:
@@ -54891,7 +54909,15 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x67
 	.8byte	.LVL309
-	.8byte	.LFE2834
+	.8byte	.LVL324
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL326
+	.8byte	.LVL331
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL332
+	.8byte	.LFE2833
 	.2byte	0x1
 	.byte	0x67
 	.8byte	0
@@ -54903,38 +54929,34 @@ __exitcall_ebc_exit:
 	.byte	0x70
 	.sleb128 -12
 	.8byte	.LVL304
-	.8byte	.LVL310
+	.8byte	.LVL312
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 36
-	.8byte	.LVL310
-	.8byte	.LVL313
+	.8byte	.LVL312
+	.8byte	.LVL315
 	.2byte	0x2
 	.byte	0x70
 	.sleb128 -12
-	.8byte	.LVL313
-	.8byte	.LFE2834
+	.8byte	.LVL315
+	.8byte	.LFE2833
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 36
 	.8byte	0
 	.8byte	0
 .LLST246:
-	.8byte	.LVL876
-	.8byte	.LVL877
+	.8byte	.LVL881
+	.8byte	.LVL882
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST197:
-	.8byte	.LVL571
-	.8byte	.LVL572
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL572
 	.8byte	.LVL576
+	.8byte	.LVL577
 	.2byte	0x1
-	.byte	0x64
+	.byte	0x50
 	.8byte	.LVL577
 	.8byte	.LVL581
 	.2byte	0x1
@@ -54948,1088 +54970,1092 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL592
-	.8byte	.LVL594
+	.8byte	.LVL596
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL595
 	.8byte	.LVL597
+	.8byte	.LVL599
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL600
+	.8byte	.LVL602
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST150:
-	.8byte	.LVL463
-	.8byte	.LVL510
+	.8byte	.LVL468
+	.8byte	.LVL515
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL511
-	.8byte	.LFE2828
+	.8byte	.LVL516
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST151:
-	.8byte	.LVL463
-	.8byte	.LVL511
+	.8byte	.LVL468
+	.8byte	.LVL516
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL511
-	.8byte	.LFE2828
+	.8byte	.LVL516
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST152:
-	.8byte	.LVL463
-	.8byte	.LVL464
+	.8byte	.LVL468
+	.8byte	.LVL469
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL483
-	.8byte	.LVL485
+	.8byte	.LVL488
+	.8byte	.LVL490
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL515
-	.8byte	.LVL516
+	.8byte	.LVL520
+	.8byte	.LVL521
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL528
-	.8byte	.LVL529
+	.8byte	.LVL533
+	.8byte	.LVL534
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL544
-	.8byte	.LVL545
+	.8byte	.LVL549
+	.8byte	.LVL550
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST153:
-	.8byte	.LVL473
-	.8byte	.LVL474
+	.8byte	.LVL478
+	.8byte	.LVL479
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST154:
-	.8byte	.LVL470
-	.8byte	.LVL471
+	.8byte	.LVL475
+	.8byte	.LVL476
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL472
-	.8byte	.LVL475
+	.8byte	.LVL477
+	.8byte	.LVL480
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL476
-	.8byte	.LVL483
+	.8byte	.LVL481
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
 .LLST155:
-	.8byte	.LVL468
-	.8byte	.LVL483
+	.8byte	.LVL473
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
 .LLST156:
-	.8byte	.LVL469
-	.8byte	.LVL483
+	.8byte	.LVL474
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
 .LLST157:
-	.8byte	.LVL465
-	.8byte	.LVL466
+	.8byte	.LVL470
+	.8byte	.LVL471
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
 .LLST158:
-	.8byte	.LVL467
-	.8byte	.LVL483
+	.8byte	.LVL472
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
 .LLST159:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL492
-	.8byte	.LVL504
+	.8byte	.LVL497
+	.8byte	.LVL509
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL509
-	.8byte	.LVL515
+	.8byte	.LVL514
+	.8byte	.LVL520
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL542
-	.8byte	.LVL543
+	.8byte	.LVL547
+	.8byte	.LVL548
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST160:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL496
-	.8byte	.LVL505
+	.8byte	.LVL501
+	.8byte	.LVL510
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL509
-	.8byte	.LVL512
+	.8byte	.LVL514
+	.8byte	.LVL517
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL542
-	.8byte	.LVL543
+	.8byte	.LVL547
+	.8byte	.LVL548
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST161:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL492
-	.8byte	.LVL515
+	.8byte	.LVL497
+	.8byte	.LVL520
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL542
-	.8byte	.LVL543
+	.8byte	.LVL547
+	.8byte	.LVL548
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST162:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL492
-	.8byte	.LVL515
+	.8byte	.LVL497
+	.8byte	.LVL520
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL542
-	.8byte	.LVL543
+	.8byte	.LVL547
+	.8byte	.LVL548
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST163:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL492
-	.8byte	.LVL493
+	.8byte	.LVL497
+	.8byte	.LVL498
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL494
-	.8byte	.LVL495
+	.8byte	.LVL499
+	.8byte	.LVL500
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL511
-	.8byte	.LVL513
+	.8byte	.LVL516
+	.8byte	.LVL518
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL514
-	.8byte	.LVL515
+	.8byte	.LVL519
+	.8byte	.LVL520
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST164:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL489
-	.8byte	.LVL515
+	.8byte	.LVL494
+	.8byte	.LVL520
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL542
-	.8byte	.LVL543
+	.8byte	.LVL547
+	.8byte	.LVL548
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
 .LLST165:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL490
-	.8byte	.LVL515
+	.8byte	.LVL495
+	.8byte	.LVL520
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL542
-	.8byte	.LVL543
+	.8byte	.LVL547
+	.8byte	.LVL548
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
 	.8byte	0
 .LLST166:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL491
-	.8byte	.LVL515
+	.8byte	.LVL496
+	.8byte	.LVL520
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL542
-	.8byte	.LVL543
+	.8byte	.LVL547
+	.8byte	.LVL548
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
 .LLST167:
-	.8byte	.LVL486
-	.8byte	.LVL487
+	.8byte	.LVL491
+	.8byte	.LVL492
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
 .LLST168:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL488
-	.8byte	.LVL515
+	.8byte	.LVL493
+	.8byte	.LVL520
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL542
-	.8byte	.LVL543
+	.8byte	.LVL547
+	.8byte	.LVL548
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
 .LLST169:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL492
 	.8byte	.LVL497
+	.8byte	.LVL502
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL506
-	.8byte	.LVL515
+	.8byte	.LVL511
+	.8byte	.LVL520
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL542
-	.8byte	.LVL543
+	.8byte	.LVL547
+	.8byte	.LVL548
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
 .LLST170:
-	.8byte	.LVL477
-	.8byte	.LVL483
-	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL492
-	.8byte	.LVL500
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL501
-	.8byte	.LVL502
+	.8byte	.LVL497
+	.8byte	.LVL505
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL503
+	.8byte	.LVL506
 	.8byte	.LVL507
 	.2byte	0x1
 	.byte	0x62
 	.8byte	.LVL508
-	.8byte	.LVL515
+	.8byte	.LVL512
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL542
-	.8byte	.LVL543
+	.8byte	.LVL513
+	.8byte	.LVL520
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL547
+	.8byte	.LVL548
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
 .LLST171:
-	.8byte	.LVL477
-	.8byte	.LVL483
-	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL492
-	.8byte	.LVL498
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL499
-	.8byte	.LVL502
+	.8byte	.LVL497
+	.8byte	.LVL503
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL503
+	.8byte	.LVL504
 	.8byte	.LVL507
 	.2byte	0x1
 	.byte	0x62
 	.8byte	.LVL508
-	.8byte	.LVL515
+	.8byte	.LVL512
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL542
-	.8byte	.LVL543
+	.8byte	.LVL513
+	.8byte	.LVL520
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL547
+	.8byte	.LVL548
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
 .LLST172:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL492
-	.8byte	.LVL498
+	.8byte	.LVL497
+	.8byte	.LVL503
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL499
-	.8byte	.LVL500
+	.8byte	.LVL504
+	.8byte	.LVL505
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL501
-	.8byte	.LVL507
+	.8byte	.LVL506
+	.8byte	.LVL512
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL508
-	.8byte	.LVL515
+	.8byte	.LVL513
+	.8byte	.LVL520
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL542
-	.8byte	.LVL543
+	.8byte	.LVL547
+	.8byte	.LVL548
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
 .LLST173:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL522
-	.8byte	.LVL523
+	.8byte	.LVL527
+	.8byte	.LVL528
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL524
-	.8byte	.LVL526
+	.8byte	.LVL529
+	.8byte	.LVL531
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL527
-	.8byte	.LVL528
+	.8byte	.LVL532
+	.8byte	.LVL533
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
 .LLST174:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL520
-	.8byte	.LVL528
+	.8byte	.LVL525
+	.8byte	.LVL533
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
 .LLST175:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL521
-	.8byte	.LVL528
+	.8byte	.LVL526
+	.8byte	.LVL533
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
 .LLST176:
-	.8byte	.LVL517
-	.8byte	.LVL518
+	.8byte	.LVL522
+	.8byte	.LVL523
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
 .LLST177:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL519
-	.8byte	.LVL528
+	.8byte	.LVL524
+	.8byte	.LVL533
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
 .LLST178:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL535
-	.8byte	.LVL536
+	.8byte	.LVL540
+	.8byte	.LVL541
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL537
-	.8byte	.LVL538
+	.8byte	.LVL542
+	.8byte	.LVL543
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL539
-	.8byte	.LVL540
+	.8byte	.LVL544
+	.8byte	.LVL545
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL541
-	.8byte	.LVL542
+	.8byte	.LVL546
+	.8byte	.LVL547
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
 	.8byte	0
 .LLST179:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL533
-	.8byte	.LVL542
+	.8byte	.LVL538
+	.8byte	.LVL547
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL543
-	.8byte	.LVL544
+	.8byte	.LVL548
+	.8byte	.LVL549
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
 .LLST180:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL534
-	.8byte	.LVL542
+	.8byte	.LVL539
+	.8byte	.LVL547
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL543
-	.8byte	.LVL544
+	.8byte	.LVL548
+	.8byte	.LVL549
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
 .LLST181:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL484
-	.8byte	.LVL491
+	.8byte	.LVL489
+	.8byte	.LVL496
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL528
-	.8byte	.LVL542
+	.8byte	.LVL533
+	.8byte	.LVL547
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL543
-	.8byte	.LVL544
+	.8byte	.LVL548
+	.8byte	.LVL549
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
 .LLST182:
-	.8byte	.LVL530
-	.8byte	.LVL531
+	.8byte	.LVL535
+	.8byte	.LVL536
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
 .LLST183:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL532
-	.8byte	.LVL542
+	.8byte	.LVL537
+	.8byte	.LVL547
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL543
-	.8byte	.LVL544
+	.8byte	.LVL548
+	.8byte	.LVL549
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
 .LLST184:
-	.8byte	.LVL477
-	.8byte	.LVL478
+	.8byte	.LVL482
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL535
-	.8byte	.LVL542
+	.8byte	.LVL540
+	.8byte	.LVL547
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL543
-	.8byte	.LVL544
+	.8byte	.LVL548
+	.8byte	.LVL549
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST185:
-	.8byte	.LVL477
-	.8byte	.LVL480
+	.8byte	.LVL482
+	.8byte	.LVL485
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL535
-	.8byte	.LVL542
+	.8byte	.LVL540
+	.8byte	.LVL547
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL543
-	.8byte	.LVL544
+	.8byte	.LVL548
+	.8byte	.LVL549
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
 .LLST186:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL552
-	.8byte	.LVL553
+	.8byte	.LVL557
+	.8byte	.LVL558
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL554
-	.8byte	.LVL561
+	.8byte	.LVL559
+	.8byte	.LVL566
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL562
-	.8byte	.LFE2828
+	.8byte	.LVL567
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST187:
-	.8byte	.LVL477
-	.8byte	.LVL479
+	.8byte	.LVL482
+	.8byte	.LVL484
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL549
-	.8byte	.LFE2828
+	.8byte	.LVL554
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
 .LLST188:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL550
-	.8byte	.LFE2828
+	.8byte	.LVL555
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x61
 	.8byte	0
 	.8byte	0
 .LLST189:
-	.8byte	.LVL477
-	.8byte	.LVL478
+	.8byte	.LVL482
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL551
-	.8byte	.LFE2828
+	.8byte	.LVL556
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
 .LLST190:
-	.8byte	.LVL546
-	.8byte	.LVL547
+	.8byte	.LVL551
+	.8byte	.LVL552
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
 .LLST191:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL548
-	.8byte	.LFE2828
+	.8byte	.LVL553
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
 .LLST192:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL552
-	.8byte	.LVL555
+	.8byte	.LVL557
+	.8byte	.LVL560
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL557
-	.8byte	.LVL559
+	.8byte	.LVL562
+	.8byte	.LVL564
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL560
-	.8byte	.LFE2828
+	.8byte	.LVL565
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST193:
-	.8byte	.LVL477
-	.8byte	.LVL481
+	.8byte	.LVL482
+	.8byte	.LVL486
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL552
-	.8byte	.LFE2828
+	.8byte	.LVL557
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
 .LLST194:
-	.8byte	.LVL477
-	.8byte	.LVL483
+	.8byte	.LVL482
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL552
-	.8byte	.LVL555
+	.8byte	.LVL557
+	.8byte	.LVL560
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL556
-	.8byte	.LVL557
+	.8byte	.LVL561
+	.8byte	.LVL562
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL558
-	.8byte	.LVL559
+	.8byte	.LVL563
+	.8byte	.LVL564
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL560
-	.8byte	.LFE2828
+	.8byte	.LVL565
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST195:
-	.8byte	.LVL477
 	.8byte	.LVL482
+	.8byte	.LVL487
 	.2byte	0x1
 	.byte	0x6e
-	.8byte	.LVL552
-	.8byte	.LFE2828
+	.8byte	.LVL557
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x6e
 	.8byte	0
 	.8byte	0
 .LLST113:
-	.8byte	.LVL384
-	.8byte	.LVL415
+	.8byte	.LVL389
+	.8byte	.LVL420
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL416
-	.8byte	.LFE2822
+	.8byte	.LVL421
+	.8byte	.LFE2821
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST114:
-	.8byte	.LVL384
-	.8byte	.LVL416
+	.8byte	.LVL389
+	.8byte	.LVL421
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL416
-	.8byte	.LFE2822
+	.8byte	.LVL421
+	.8byte	.LFE2821
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST115:
-	.8byte	.LVL384
-	.8byte	.LVL385
+	.8byte	.LVL389
+	.8byte	.LVL390
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL399
-	.8byte	.LVL401
+	.8byte	.LVL404
+	.8byte	.LVL406
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL419
-	.8byte	.LVL420
+	.8byte	.LVL424
+	.8byte	.LVL425
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL432
-	.8byte	.LVL433
+	.8byte	.LVL437
+	.8byte	.LVL438
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL447
-	.8byte	.LVL448
+	.8byte	.LVL452
+	.8byte	.LVL453
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST116:
-	.8byte	.LVL394
-	.8byte	.LVL395
+	.8byte	.LVL399
+	.8byte	.LVL400
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST117:
-	.8byte	.LVL391
-	.8byte	.LVL392
+	.8byte	.LVL396
+	.8byte	.LVL397
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL393
-	.8byte	.LVL396
+	.8byte	.LVL398
+	.8byte	.LVL401
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL397
-	.8byte	.LVL399
+	.8byte	.LVL402
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
 .LLST118:
-	.8byte	.LVL389
-	.8byte	.LVL399
+	.8byte	.LVL394
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
 .LLST119:
-	.8byte	.LVL390
-	.8byte	.LVL399
+	.8byte	.LVL395
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
 .LLST120:
-	.8byte	.LVL386
-	.8byte	.LVL387
+	.8byte	.LVL391
+	.8byte	.LVL392
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST121:
-	.8byte	.LVL388
-	.8byte	.LVL399
+	.8byte	.LVL393
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST122:
-	.8byte	.LVL398
-	.8byte	.LVL399
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL407
-	.8byte	.LVL419
+	.8byte	.LVL412
+	.8byte	.LVL424
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST123:
-	.8byte	.LVL398
-	.8byte	.LVL399
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL405
-	.8byte	.LVL419
+	.8byte	.LVL410
+	.8byte	.LVL424
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
 .LLST124:
-	.8byte	.LVL411
-	.8byte	.LVL413
+	.8byte	.LVL416
+	.8byte	.LVL418
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST125:
-	.8byte	.LVL412
-	.8byte	.LVL414
+	.8byte	.LVL417
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST126:
-	.8byte	.LVL398
-	.8byte	.LVL399
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL408
-	.8byte	.LVL419
+	.8byte	.LVL413
+	.8byte	.LVL424
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST127:
-	.8byte	.LVL398
-	.8byte	.LVL399
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL408
-	.8byte	.LVL419
+	.8byte	.LVL413
+	.8byte	.LVL424
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST128:
-	.8byte	.LVL398
-	.8byte	.LVL399
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL408
-	.8byte	.LVL409
+	.8byte	.LVL413
+	.8byte	.LVL414
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL410
-	.8byte	.LVL417
+	.8byte	.LVL415
+	.8byte	.LVL422
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL418
-	.8byte	.LVL419
+	.8byte	.LVL423
+	.8byte	.LVL424
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
 .LLST129:
-	.8byte	.LVL402
-	.8byte	.LVL403
+	.8byte	.LVL407
+	.8byte	.LVL408
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST130:
-	.8byte	.LVL398
-	.8byte	.LVL399
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL404
-	.8byte	.LVL419
+	.8byte	.LVL409
+	.8byte	.LVL424
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST131:
-	.8byte	.LVL398
-	.8byte	.LVL399
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL426
-	.8byte	.LVL427
+	.8byte	.LVL431
+	.8byte	.LVL432
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL428
-	.8byte	.LVL430
+	.8byte	.LVL433
+	.8byte	.LVL435
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL431
-	.8byte	.LVL432
+	.8byte	.LVL436
+	.8byte	.LVL437
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
 .LLST132:
-	.8byte	.LVL398
-	.8byte	.LVL399
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL424
-	.8byte	.LVL432
+	.8byte	.LVL429
+	.8byte	.LVL437
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
 .LLST133:
-	.8byte	.LVL398
-	.8byte	.LVL399
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL425
-	.8byte	.LVL432
+	.8byte	.LVL430
+	.8byte	.LVL437
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
 .LLST134:
-	.8byte	.LVL421
-	.8byte	.LVL422
+	.8byte	.LVL426
+	.8byte	.LVL427
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST135:
-	.8byte	.LVL398
-	.8byte	.LVL399
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL423
-	.8byte	.LVL432
+	.8byte	.LVL428
+	.8byte	.LVL437
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST136:
-	.8byte	.LVL398
-	.8byte	.LVL399
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL400
-	.8byte	.LVL406
+	.8byte	.LVL405
+	.8byte	.LVL411
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL432
-	.8byte	.LVL447
+	.8byte	.LVL437
+	.8byte	.LVL452
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
 .LLST137:
-	.8byte	.LVL398
-	.8byte	.LVL399
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL437
-	.8byte	.LVL447
+	.8byte	.LVL442
+	.8byte	.LVL452
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST138:
-	.8byte	.LVL398
-	.8byte	.LVL399
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL438
-	.8byte	.LVL447
+	.8byte	.LVL443
+	.8byte	.LVL452
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
 .LLST139:
-	.8byte	.LVL442
-	.8byte	.LVL444
+	.8byte	.LVL447
+	.8byte	.LVL449
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST140:
-	.8byte	.LVL398
-	.8byte	.LVL399
-	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL439
-	.8byte	.LVL440
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL441
+	.8byte	.LVL444
 	.8byte	.LVL445
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	.LVL446
-	.8byte	.LVL447
+	.8byte	.LVL450
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL451
+	.8byte	.LVL452
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
 .LLST141:
-	.8byte	.LVL434
-	.8byte	.LVL435
+	.8byte	.LVL439
+	.8byte	.LVL440
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
 .LLST142:
-	.8byte	.LVL398
-	.8byte	.LVL399
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL436
-	.8byte	.LVL447
+	.8byte	.LVL441
+	.8byte	.LVL452
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
 .LLST143:
-	.8byte	.LVL398
-	.8byte	.LVL399
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL454
-	.8byte	.LFE2822
+	.8byte	.LVL459
+	.8byte	.LFE2821
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
 .LLST144:
-	.8byte	.LVL398
-	.8byte	.LVL399
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL452
-	.8byte	.LFE2822
+	.8byte	.LVL457
+	.8byte	.LFE2821
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST145:
-	.8byte	.LVL398
-	.8byte	.LVL399
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL453
-	.8byte	.LFE2822
+	.8byte	.LVL458
+	.8byte	.LFE2821
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
 .LLST146:
-	.8byte	.LVL458
-	.8byte	.LVL460
+	.8byte	.LVL463
+	.8byte	.LVL465
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST147:
-	.8byte	.LVL398
-	.8byte	.LVL399
-	.2byte	0x1
-	.byte	0x5b
-	.8byte	.LVL455
-	.8byte	.LVL456
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL457
+	.8byte	.LVL460
 	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	.LVL462
-	.8byte	.LFE2822
+	.8byte	.LVL466
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL467
+	.8byte	.LFE2821
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
 	.8byte	0
 .LLST148:
-	.8byte	.LVL449
-	.8byte	.LVL450
+	.8byte	.LVL454
+	.8byte	.LVL455
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
 .LLST149:
-	.8byte	.LVL398
-	.8byte	.LVL399
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL451
-	.8byte	.LFE2822
+	.8byte	.LVL456
+	.8byte	.LFE2821
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
@@ -56064,7 +56090,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x56
 	.8byte	.LVL60
-	.8byte	.LFE2816
+	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
@@ -56087,7 +56113,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x55
 	.8byte	.LVL50
-	.8byte	.LFE2816
+	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
@@ -56098,7 +56124,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	.LVL61
-	.8byte	.LFE2816
+	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
@@ -56113,7 +56139,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x58
 	.8byte	.LVL50
-	.8byte	.LFE2816
+	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
@@ -56213,192 +56239,192 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	0
 .LLST243:
-	.8byte	.LVL860
-	.8byte	.LVL862
+	.8byte	.LVL865
+	.8byte	.LVL867
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST244:
-	.8byte	.LVL861
-	.8byte	.LVL864
+	.8byte	.LVL866
+	.8byte	.LVL869
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
 .LLST245:
-	.8byte	.LVL864
-	.8byte	.LVL867
+	.8byte	.LVL869
+	.8byte	.LVL872
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL868
-	.8byte	.LVL871
+	.8byte	.LVL873
+	.8byte	.LVL876
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL872
-	.8byte	.LVL875
+	.8byte	.LVL877
+	.8byte	.LVL880
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
 .LLST239:
-	.8byte	.LVL849
 	.8byte	.LVL854
+	.8byte	.LVL859
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL859
-	.8byte	.LFE2812
+	.8byte	.LVL864
+	.8byte	.LFE2811
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST240:
-	.8byte	.LVL855
-	.8byte	.LVL856
+	.8byte	.LVL860
+	.8byte	.LVL861
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST241:
-	.8byte	.LVL853
-	.8byte	.LVL857
+	.8byte	.LVL858
+	.8byte	.LVL862
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST242:
-	.8byte	.LVL856
-	.8byte	.LVL858
+	.8byte	.LVL861
+	.8byte	.LVL863
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST235:
-	.8byte	.LVL832
-	.8byte	.LVL842
+	.8byte	.LVL837
+	.8byte	.LVL847
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL842
 	.8byte	.LVL847
+	.8byte	.LVL852
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL847
-	.8byte	.LFE2811
+	.8byte	.LVL852
+	.8byte	.LFE2810
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST236:
-	.8byte	.LVL832
 	.8byte	.LVL837
-	.2byte	0x1
-	.byte	0x53
 	.8byte	.LVL842
-	.8byte	.LVL843
 	.2byte	0x1
 	.byte	0x53
+	.8byte	.LVL847
 	.8byte	.LVL848
-	.8byte	.LFE2811
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL853
+	.8byte	.LFE2810
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST237:
-	.8byte	.LVL838
-	.8byte	.LVL841
+	.8byte	.LVL843
+	.8byte	.LVL846
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL845
-	.8byte	.LVL846
+	.8byte	.LVL850
+	.8byte	.LVL851
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST238:
-	.8byte	.LVL839
-	.8byte	.LVL840
+	.8byte	.LVL844
+	.8byte	.LVL845
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL844
-	.8byte	.LVL846
+	.8byte	.LVL849
+	.8byte	.LVL851
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST229:
-	.8byte	.LVL810
-	.8byte	.LVL816
+	.8byte	.LVL815
+	.8byte	.LVL821
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL820
-	.8byte	.LVL821
+	.8byte	.LVL825
+	.8byte	.LVL826
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL830
-	.8byte	.LVL831
+	.8byte	.LVL835
+	.8byte	.LVL836
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST230:
-	.8byte	.LVL810
-	.8byte	.LVL811
+	.8byte	.LVL815
+	.8byte	.LVL816
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST231:
-	.8byte	.LVL816
-	.8byte	.LVL819
+	.8byte	.LVL821
+	.8byte	.LVL824
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL823
 	.8byte	.LVL828
+	.8byte	.LVL833
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL831
-	.8byte	.LFE2810
+	.8byte	.LVL836
+	.8byte	.LFE2809
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST232:
-	.8byte	.LVL815
-	.8byte	.LVL816
+	.8byte	.LVL820
+	.8byte	.LVL821
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL818
-	.8byte	.LVL822
+	.8byte	.LVL823
+	.8byte	.LVL827
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL827
-	.8byte	.LVL831
+	.8byte	.LVL832
+	.8byte	.LVL836
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
 .LLST233:
-	.8byte	.LVL815
-	.8byte	.LVL817
+	.8byte	.LVL820
+	.8byte	.LVL822
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL818
-	.8byte	.LVL826
+	.8byte	.LVL823
+	.8byte	.LVL831
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL829
-	.8byte	.LFE2810
+	.8byte	.LVL834
+	.8byte	.LFE2809
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST234:
-	.8byte	.LVL815
-	.8byte	.LVL824
+	.8byte	.LVL820
+	.8byte	.LVL829
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL825
-	.8byte	.LFE2810
+	.8byte	.LVL830
+	.8byte	.LFE2809
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
@@ -56411,67 +56437,67 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	0
 .LLST196:
-	.8byte	.LVL563
-	.8byte	.LVL564
+	.8byte	.LVL568
+	.8byte	.LVL569
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL564
 	.8byte	.LVL569
+	.8byte	.LVL574
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL570
-	.8byte	.LFE2879
+	.8byte	.LVL575
+	.8byte	.LFE2878
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST198:
-	.8byte	.LVL598
-	.8byte	.LVL600
+	.8byte	.LVL603
+	.8byte	.LVL605
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL600
-	.8byte	.LVL604
+	.8byte	.LVL605
+	.8byte	.LVL609
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL605
-	.8byte	.LVL608
+	.8byte	.LVL610
+	.8byte	.LVL613
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
 .LLST199:
-	.8byte	.LVL598
-	.8byte	.LVL599
+	.8byte	.LVL603
+	.8byte	.LVL604
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST201:
-	.8byte	.LVL616
-	.8byte	.LVL617-1
+	.8byte	.LVL621
+	.8byte	.LVL622-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST202:
-	.8byte	.LVL615
-	.8byte	.LVL617-1
+	.8byte	.LVL620
+	.8byte	.LVL622-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST228:
-	.8byte	.LVL802
-	.8byte	.LVL803
+	.8byte	.LVL807
+	.8byte	.LVL808
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL803
-	.8byte	.LVL807
+	.8byte	.LVL808
+	.8byte	.LVL812
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL808
-	.8byte	.LFE2887
+	.8byte	.LVL813
+	.8byte	.LFE2886
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -56486,368 +56512,370 @@ __exitcall_ebc_exit:
 	.2byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0-.Ltext0
-	.8byte	.LFB2867
-	.8byte	.LFE2867-.LFB2867
 	.8byte	.LFB2866
 	.8byte	.LFE2866-.LFB2866
+	.8byte	.LFB2865
+	.8byte	.LFE2865-.LFB2865
 	.8byte	0
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
 .Ldebug_ranges0:
-	.8byte	.LBB1015
-	.8byte	.LBE1015
-	.8byte	.LBB1018
-	.8byte	.LBE1018
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1019
-	.8byte	.LBE1019
-	.8byte	.LBB1050
-	.8byte	.LBE1050
-	.8byte	.LBB1051
-	.8byte	.LBE1051
-	.8byte	.LBB1116
-	.8byte	.LBE1116
+	.8byte	.LBB1013
+	.8byte	.LBE1013
+	.8byte	.LBB1016
+	.8byte	.LBE1016
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1022
-	.8byte	.LBE1022
-	.8byte	.LBB1034
-	.8byte	.LBE1034
-	.8byte	.LBB1035
-	.8byte	.LBE1035
+	.8byte	.LBB1017
+	.8byte	.LBE1017
+	.8byte	.LBB1048
+	.8byte	.LBE1048
+	.8byte	.LBB1049
+	.8byte	.LBE1049
+	.8byte	.LBB1114
+	.8byte	.LBE1114
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1038
-	.8byte	.LBE1038
-	.8byte	.LBB1043
-	.8byte	.LBE1043
+	.8byte	.LBB1020
+	.8byte	.LBE1020
+	.8byte	.LBB1032
+	.8byte	.LBE1032
+	.8byte	.LBB1033
+	.8byte	.LBE1033
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1052
-	.8byte	.LBE1052
-	.8byte	.LBB1306
-	.8byte	.LBE1306
-	.8byte	.LBB1307
-	.8byte	.LBE1307
+	.8byte	.LBB1036
+	.8byte	.LBE1036
+	.8byte	.LBB1041
+	.8byte	.LBE1041
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1055
-	.8byte	.LBE1055
-	.8byte	.LBB1075
-	.8byte	.LBE1075
-	.8byte	.LBB1076
-	.8byte	.LBE1076
+	.8byte	.LBB1050
+	.8byte	.LBE1050
+	.8byte	.LBB1304
+	.8byte	.LBE1304
+	.8byte	.LBB1305
+	.8byte	.LBE1305
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1069
-	.8byte	.LBE1069
+	.8byte	.LBB1053
+	.8byte	.LBE1053
+	.8byte	.LBB1073
+	.8byte	.LBE1073
 	.8byte	.LBB1074
 	.8byte	.LBE1074
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1081
-	.8byte	.LBE1081
-	.8byte	.LBB1314
-	.8byte	.LBE1314
-	.8byte	.LBB1317
-	.8byte	.LBE1317
-	.8byte	.LBB1318
-	.8byte	.LBE1318
+	.8byte	.LBB1067
+	.8byte	.LBE1067
+	.8byte	.LBB1072
+	.8byte	.LBE1072
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1087
-	.8byte	.LBE1087
-	.8byte	.LBB1300
-	.8byte	.LBE1300
-	.8byte	.LBB1301
-	.8byte	.LBE1301
+	.8byte	.LBB1079
+	.8byte	.LBE1079
+	.8byte	.LBB1312
+	.8byte	.LBE1312
+	.8byte	.LBB1315
+	.8byte	.LBE1315
+	.8byte	.LBB1316
+	.8byte	.LBE1316
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1090
-	.8byte	.LBE1090
-	.8byte	.LBB1110
-	.8byte	.LBE1110
-	.8byte	.LBB1111
-	.8byte	.LBE1111
+	.8byte	.LBB1085
+	.8byte	.LBE1085
+	.8byte	.LBB1298
+	.8byte	.LBE1298
+	.8byte	.LBB1299
+	.8byte	.LBE1299
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1104
-	.8byte	.LBE1104
+	.8byte	.LBB1088
+	.8byte	.LBE1088
+	.8byte	.LBB1108
+	.8byte	.LBE1108
 	.8byte	.LBB1109
 	.8byte	.LBE1109
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1117
-	.8byte	.LBE1117
-	.8byte	.LBB1150
-	.8byte	.LBE1150
-	.8byte	.LBB1310
-	.8byte	.LBE1310
-	.8byte	.LBB1311
-	.8byte	.LBE1311
+	.8byte	.LBB1102
+	.8byte	.LBE1102
+	.8byte	.LBB1107
+	.8byte	.LBE1107
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1120
-	.8byte	.LBE1120
-	.8byte	.LBB1133
-	.8byte	.LBE1133
-	.8byte	.LBB1142
-	.8byte	.LBE1142
-	.8byte	.LBB1143
-	.8byte	.LBE1143
+	.8byte	.LBB1115
+	.8byte	.LBE1115
+	.8byte	.LBB1148
+	.8byte	.LBE1148
+	.8byte	.LBB1308
+	.8byte	.LBE1308
+	.8byte	.LBB1309
+	.8byte	.LBE1309
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1136
-	.8byte	.LBE1136
+	.8byte	.LBB1118
+	.8byte	.LBE1118
+	.8byte	.LBB1131
+	.8byte	.LBE1131
+	.8byte	.LBB1140
+	.8byte	.LBE1140
 	.8byte	.LBB1141
 	.8byte	.LBE1141
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1151
-	.8byte	.LBE1151
-	.8byte	.LBB1186
-	.8byte	.LBE1186
-	.8byte	.LBB1308
-	.8byte	.LBE1308
-	.8byte	.LBB1309
-	.8byte	.LBE1309
-	.8byte	.LBB1319
-	.8byte	.LBE1319
+	.8byte	.LBB1134
+	.8byte	.LBE1134
+	.8byte	.LBB1139
+	.8byte	.LBE1139
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1154
-	.8byte	.LBE1154
-	.8byte	.LBB1167
-	.8byte	.LBE1167
-	.8byte	.LBB1176
-	.8byte	.LBE1176
-	.8byte	.LBB1177
-	.8byte	.LBE1177
+	.8byte	.LBB1149
+	.8byte	.LBE1149
+	.8byte	.LBB1184
+	.8byte	.LBE1184
+	.8byte	.LBB1306
+	.8byte	.LBE1306
+	.8byte	.LBB1307
+	.8byte	.LBE1307
+	.8byte	.LBB1317
+	.8byte	.LBE1317
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1170
-	.8byte	.LBE1170
+	.8byte	.LBB1152
+	.8byte	.LBE1152
+	.8byte	.LBB1165
+	.8byte	.LBE1165
+	.8byte	.LBB1174
+	.8byte	.LBE1174
 	.8byte	.LBB1175
 	.8byte	.LBE1175
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1187
-	.8byte	.LBE1187
-	.8byte	.LBB1198
-	.8byte	.LBE1198
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1190
-	.8byte	.LBE1190
-	.8byte	.LBB1195
-	.8byte	.LBE1195
+	.8byte	.LBB1168
+	.8byte	.LBE1168
+	.8byte	.LBB1173
+	.8byte	.LBE1173
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1191
-	.8byte	.LBE1191
-	.8byte	.LBB1194
-	.8byte	.LBE1194
+	.8byte	.LBB1185
+	.8byte	.LBE1185
+	.8byte	.LBB1196
+	.8byte	.LBE1196
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1199
-	.8byte	.LBE1199
-	.8byte	.LBB1234
-	.8byte	.LBE1234
-	.8byte	.LBB1304
-	.8byte	.LBE1304
-	.8byte	.LBB1305
-	.8byte	.LBE1305
-	.8byte	.LBB1316
-	.8byte	.LBE1316
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1202
-	.8byte	.LBE1202
-	.8byte	.LBB1215
-	.8byte	.LBE1215
-	.8byte	.LBB1216
-	.8byte	.LBE1216
-	.8byte	.LBB1217
-	.8byte	.LBE1217
+	.8byte	.LBB1188
+	.8byte	.LBE1188
+	.8byte	.LBB1193
+	.8byte	.LBE1193
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1220
-	.8byte	.LBE1220
-	.8byte	.LBB1225
-	.8byte	.LBE1225
+	.8byte	.LBB1189
+	.8byte	.LBE1189
+	.8byte	.LBB1192
+	.8byte	.LBE1192
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1235
-	.8byte	.LBE1235
+	.8byte	.LBB1197
+	.8byte	.LBE1197
+	.8byte	.LBB1232
+	.8byte	.LBE1232
 	.8byte	.LBB1302
 	.8byte	.LBE1302
 	.8byte	.LBB1303
 	.8byte	.LBE1303
-	.8byte	.LBB1315
-	.8byte	.LBE1315
+	.8byte	.LBB1314
+	.8byte	.LBE1314
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1238
-	.8byte	.LBE1238
-	.8byte	.LBB1258
-	.8byte	.LBE1258
-	.8byte	.LBB1259
-	.8byte	.LBE1259
+	.8byte	.LBB1200
+	.8byte	.LBE1200
+	.8byte	.LBB1213
+	.8byte	.LBE1213
+	.8byte	.LBB1214
+	.8byte	.LBE1214
+	.8byte	.LBB1215
+	.8byte	.LBE1215
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1252
-	.8byte	.LBE1252
-	.8byte	.LBB1257
-	.8byte	.LBE1257
+	.8byte	.LBB1218
+	.8byte	.LBE1218
+	.8byte	.LBB1223
+	.8byte	.LBE1223
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1266
-	.8byte	.LBE1266
-	.8byte	.LBB1298
-	.8byte	.LBE1298
-	.8byte	.LBB1299
-	.8byte	.LBE1299
-	.8byte	.LBB1312
-	.8byte	.LBE1312
+	.8byte	.LBB1233
+	.8byte	.LBE1233
+	.8byte	.LBB1300
+	.8byte	.LBE1300
+	.8byte	.LBB1301
+	.8byte	.LBE1301
 	.8byte	.LBB1313
 	.8byte	.LBE1313
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1269
-	.8byte	.LBE1269
+	.8byte	.LBB1236
+	.8byte	.LBE1236
+	.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	.LBB1264
+	.8byte	.LBE1264
+	.8byte	.LBB1296
+	.8byte	.LBE1296
+	.8byte	.LBB1297
+	.8byte	.LBE1297
+	.8byte	.LBB1310
+	.8byte	.LBE1310
+	.8byte	.LBB1311
+	.8byte	.LBE1311
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1267
+	.8byte	.LBE1267
+	.8byte	.LBB1279
+	.8byte	.LBE1279
+	.8byte	.LBB1280
+	.8byte	.LBE1280
 	.8byte	.LBB1281
 	.8byte	.LBE1281
 	.8byte	.LBB1282
 	.8byte	.LBE1282
-	.8byte	.LBB1283
-	.8byte	.LBE1283
-	.8byte	.LBB1284
-	.8byte	.LBE1284
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1324
-	.8byte	.LBE1324
-	.8byte	.LBB1327
-	.8byte	.LBE1327
+	.8byte	.LBB1322
+	.8byte	.LBE1322
+	.8byte	.LBB1325
+	.8byte	.LBE1325
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1358
-	.8byte	.LBE1358
+	.8byte	.LBB1356
+	.8byte	.LBE1356
+	.8byte	.LBB1368
+	.8byte	.LBE1368
 	.8byte	.LBB1370
 	.8byte	.LBE1370
 	.8byte	.LBB1372
 	.8byte	.LBE1372
-	.8byte	.LBB1374
-	.8byte	.LBE1374
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1363
-	.8byte	.LBE1363
+	.8byte	.LBB1361
+	.8byte	.LBE1361
+	.8byte	.LBB1369
+	.8byte	.LBE1369
 	.8byte	.LBB1371
 	.8byte	.LBE1371
-	.8byte	.LBB1373
-	.8byte	.LBE1373
+	.8byte	.LBB1380
+	.8byte	.LBE1380
 	.8byte	.LBB1382
 	.8byte	.LBE1382
 	.8byte	.LBB1384
 	.8byte	.LBE1384
-	.8byte	.LBB1386
-	.8byte	.LBE1386
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1375
-	.8byte	.LBE1375
+	.8byte	.LBB1373
+	.8byte	.LBE1373
+	.8byte	.LBB1381
+	.8byte	.LBE1381
 	.8byte	.LBB1383
 	.8byte	.LBE1383
-	.8byte	.LBB1385
-	.8byte	.LBE1385
+	.8byte	.LBB1390
+	.8byte	.LBE1390
 	.8byte	.LBB1392
 	.8byte	.LBE1392
 	.8byte	.LBB1394
 	.8byte	.LBE1394
-	.8byte	.LBB1396
-	.8byte	.LBE1396
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1387
-	.8byte	.LBE1387
+	.8byte	.LBB1385
+	.8byte	.LBE1385
+	.8byte	.LBB1391
+	.8byte	.LBE1391
 	.8byte	.LBB1393
 	.8byte	.LBE1393
 	.8byte	.LBB1395
 	.8byte	.LBE1395
-	.8byte	.LBB1397
-	.8byte	.LBE1397
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1402
-	.8byte	.LBE1402
-	.8byte	.LBB1408
-	.8byte	.LBE1408
+	.8byte	.LBB1400
+	.8byte	.LBE1400
+	.8byte	.LBB1406
+	.8byte	.LBE1406
+	.8byte	.LBB1412
+	.8byte	.LBE1412
 	.8byte	.LBB1414
 	.8byte	.LBE1414
 	.8byte	.LBB1416
 	.8byte	.LBE1416
-	.8byte	.LBB1418
-	.8byte	.LBE1418
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1409
-	.8byte	.LBE1409
+	.8byte	.LBB1407
+	.8byte	.LBE1407
+	.8byte	.LBB1413
+	.8byte	.LBE1413
 	.8byte	.LBB1415
 	.8byte	.LBE1415
 	.8byte	.LBB1417
 	.8byte	.LBE1417
-	.8byte	.LBB1419
-	.8byte	.LBE1419
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1422
-	.8byte	.LBE1422
+	.8byte	.LBB1420
+	.8byte	.LBE1420
+	.8byte	.LBB1433
+	.8byte	.LBE1433
 	.8byte	.LBB1435
 	.8byte	.LBE1435
 	.8byte	.LBB1437
 	.8byte	.LBE1437
 	.8byte	.LBB1439
 	.8byte	.LBE1439
-	.8byte	.LBB1441
-	.8byte	.LBE1441
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1428
-	.8byte	.LBE1428
+	.8byte	.LBB1426
+	.8byte	.LBE1426
+	.8byte	.LBB1432
+	.8byte	.LBE1432
 	.8byte	.LBB1434
 	.8byte	.LBE1434
 	.8byte	.LBB1436
 	.8byte	.LBE1436
 	.8byte	.LBB1438
 	.8byte	.LBE1438
-	.8byte	.LBB1440
-	.8byte	.LBE1440
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1468
+	.8byte	.LBE1468
+	.8byte	.LBB1482
+	.8byte	.LBE1482
+	.8byte	.LBB1510
+	.8byte	.LBE1510
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1470
 	.8byte	.LBE1470
-	.8byte	.LBB1484
-	.8byte	.LBE1484
-	.8byte	.LBB1512
-	.8byte	.LBE1512
+	.8byte	.LBB1479
+	.8byte	.LBE1479
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1472
-	.8byte	.LBE1472
-	.8byte	.LBB1481
-	.8byte	.LBE1481
+	.8byte	.LBB1485
+	.8byte	.LBE1485
+	.8byte	.LBB1511
+	.8byte	.LBE1511
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1487
 	.8byte	.LBE1487
-	.8byte	.LBB1513
-	.8byte	.LBE1513
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1489
-	.8byte	.LBE1489
+	.8byte	.LBB1500
+	.8byte	.LBE1500
 	.8byte	.LBB1502
 	.8byte	.LBE1502
 	.8byte	.LBB1504
@@ -56856,286 +56884,284 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1506
 	.8byte	.LBB1508
 	.8byte	.LBE1508
-	.8byte	.LBB1510
-	.8byte	.LBE1510
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1496
-	.8byte	.LBE1496
+	.8byte	.LBB1494
+	.8byte	.LBE1494
+	.8byte	.LBB1501
+	.8byte	.LBE1501
 	.8byte	.LBB1503
 	.8byte	.LBE1503
 	.8byte	.LBB1505
 	.8byte	.LBE1505
 	.8byte	.LBB1507
 	.8byte	.LBE1507
-	.8byte	.LBB1509
-	.8byte	.LBE1509
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1516
-	.8byte	.LBE1516
+	.8byte	.LBB1514
+	.8byte	.LBE1514
+	.8byte	.LBB1526
+	.8byte	.LBE1526
 	.8byte	.LBB1528
 	.8byte	.LBE1528
-	.8byte	.LBB1530
-	.8byte	.LBE1530
+	.8byte	.LBB1529
+	.8byte	.LBE1529
 	.8byte	.LBB1531
 	.8byte	.LBE1531
 	.8byte	.LBB1533
 	.8byte	.LBE1533
-	.8byte	.LBB1535
-	.8byte	.LBE1535
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1523
-	.8byte	.LBE1523
-	.8byte	.LBB1529
-	.8byte	.LBE1529
+	.8byte	.LBB1521
+	.8byte	.LBE1521
+	.8byte	.LBB1527
+	.8byte	.LBE1527
+	.8byte	.LBB1530
+	.8byte	.LBE1530
 	.8byte	.LBB1532
 	.8byte	.LBE1532
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB1534
 	.8byte	.LBE1534
+	.8byte	.LBB1543
+	.8byte	.LBE1543
+	.8byte	.LBB1544
+	.8byte	.LBE1544
+	.8byte	.LBB1555
+	.8byte	.LBE1555
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1536
 	.8byte	.LBE1536
-	.8byte	.LBB1545
-	.8byte	.LBE1545
-	.8byte	.LBB1546
-	.8byte	.LBE1546
-	.8byte	.LBB1557
-	.8byte	.LBE1557
-	.8byte	0
+	.8byte	.LBB1539
+	.8byte	.LBE1539
 	.8byte	0
-	.8byte	.LBB1538
-	.8byte	.LBE1538
-	.8byte	.LBB1541
-	.8byte	.LBE1541
 	.8byte	0
-	.8byte	0
-	.8byte	.LBB1547
-	.8byte	.LBE1547
-	.8byte	.LBB1551
-	.8byte	.LBE1551
-	.8byte	.LBB1552
-	.8byte	.LBE1552
+	.8byte	.LBB1545
+	.8byte	.LBE1545
+	.8byte	.LBB1549
+	.8byte	.LBE1549
+	.8byte	.LBB1550
+	.8byte	.LBE1550
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1722
-	.8byte	.LBE1722
-	.8byte	.LBB1725
-	.8byte	.LBE1725
+	.8byte	.LBB1720
+	.8byte	.LBE1720
+	.8byte	.LBB1723
+	.8byte	.LBE1723
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1732
-	.8byte	.LBE1732
+	.8byte	.LBB1730
+	.8byte	.LBE1730
+	.8byte	.LBB1804
+	.8byte	.LBE1804
+	.8byte	.LBB1805
+	.8byte	.LBE1805
 	.8byte	.LBB1806
 	.8byte	.LBE1806
-	.8byte	.LBB1807
-	.8byte	.LBE1807
-	.8byte	.LBB1808
-	.8byte	.LBE1808
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1734
-	.8byte	.LBE1734
+	.8byte	.LBB1732
+	.8byte	.LBE1732
+	.8byte	.LBB1741
+	.8byte	.LBE1741
+	.8byte	.LBB1742
+	.8byte	.LBE1742
 	.8byte	.LBB1743
 	.8byte	.LBE1743
-	.8byte	.LBB1744
-	.8byte	.LBE1744
-	.8byte	.LBB1745
-	.8byte	.LBE1745
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1807
+	.8byte	.LBE1807
+	.8byte	.LBB1822
+	.8byte	.LBE1822
+	.8byte	.LBB1823
+	.8byte	.LBE1823
+	.8byte	.LBB1833
+	.8byte	.LBE1833
+	.8byte	.LBB1885
+	.8byte	.LBE1885
+	.8byte	.LBB1888
+	.8byte	.LBE1888
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1809
 	.8byte	.LBE1809
-	.8byte	.LBB1824
-	.8byte	.LBE1824
-	.8byte	.LBB1825
-	.8byte	.LBE1825
-	.8byte	.LBB1835
-	.8byte	.LBE1835
-	.8byte	.LBB1887
-	.8byte	.LBE1887
-	.8byte	.LBB1890
-	.8byte	.LBE1890
+	.8byte	.LBB1812
+	.8byte	.LBE1812
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1811
-	.8byte	.LBE1811
-	.8byte	.LBB1814
-	.8byte	.LBE1814
+	.8byte	.LBB1813
+	.8byte	.LBE1813
+	.8byte	.LBB1816
+	.8byte	.LBE1816
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1815
-	.8byte	.LBE1815
-	.8byte	.LBB1818
-	.8byte	.LBE1818
+	.8byte	.LBB1824
+	.8byte	.LBE1824
+	.8byte	.LBB1834
+	.8byte	.LBE1834
+	.8byte	.LBB1884
+	.8byte	.LBE1884
+	.8byte	.LBB1889
+	.8byte	.LBE1889
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1826
 	.8byte	.LBE1826
-	.8byte	.LBB1836
-	.8byte	.LBE1836
-	.8byte	.LBB1886
-	.8byte	.LBE1886
-	.8byte	.LBB1891
-	.8byte	.LBE1891
+	.8byte	.LBB1829
+	.8byte	.LBE1829
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1828
-	.8byte	.LBE1828
-	.8byte	.LBB1831
-	.8byte	.LBE1831
+	.8byte	.LBB1835
+	.8byte	.LBE1835
+	.8byte	.LBB1886
+	.8byte	.LBE1886
+	.8byte	.LBB1887
+	.8byte	.LBE1887
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1837
 	.8byte	.LBE1837
-	.8byte	.LBB1888
-	.8byte	.LBE1888
-	.8byte	.LBB1889
-	.8byte	.LBE1889
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1839
-	.8byte	.LBE1839
-	.8byte	.LBB1845
-	.8byte	.LBE1845
+	.8byte	.LBB1843
+	.8byte	.LBE1843
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1848
-	.8byte	.LBE1848
-	.8byte	.LBB1849
-	.8byte	.LBE1849
+	.8byte	.LBB1846
+	.8byte	.LBE1846
+	.8byte	.LBB1847
+	.8byte	.LBE1847
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1856
-	.8byte	.LBE1856
+	.8byte	.LBB1854
+	.8byte	.LBE1854
+	.8byte	.LBB1860
+	.8byte	.LBE1860
+	.8byte	.LBB1861
+	.8byte	.LBE1861
 	.8byte	.LBB1862
 	.8byte	.LBE1862
 	.8byte	.LBB1863
 	.8byte	.LBE1863
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB1864
 	.8byte	.LBE1864
-	.8byte	.LBB1865
-	.8byte	.LBE1865
+	.8byte	.LBB1882
+	.8byte	.LBE1882
+	.8byte	.LBB1883
+	.8byte	.LBE1883
+	.8byte	.LBB1890
+	.8byte	.LBE1890
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1866
-	.8byte	.LBE1866
-	.8byte	.LBB1884
-	.8byte	.LBE1884
-	.8byte	.LBB1885
-	.8byte	.LBE1885
-	.8byte	.LBB1892
-	.8byte	.LBE1892
+	.8byte	.LBB1897
+	.8byte	.LBE1897
+	.8byte	.LBB1904
+	.8byte	.LBE1904
+	.8byte	.LBB1905
+	.8byte	.LBE1905
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1899
-	.8byte	.LBE1899
-	.8byte	.LBB1906
-	.8byte	.LBE1906
-	.8byte	.LBB1907
-	.8byte	.LBE1907
+	.8byte	.LBB1898
+	.8byte	.LBE1898
+	.8byte	.LBB1903
+	.8byte	.LBE1903
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1900
-	.8byte	.LBE1900
-	.8byte	.LBB1905
-	.8byte	.LBE1905
+	.8byte	.LBB1942
+	.8byte	.LBE1942
+	.8byte	.LBB1953
+	.8byte	.LBE1953
+	.8byte	.LBB1954
+	.8byte	.LBE1954
+	.8byte	.LBB1972
+	.8byte	.LBE1972
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1944
 	.8byte	.LBE1944
-	.8byte	.LBB1955
-	.8byte	.LBE1955
-	.8byte	.LBB1956
-	.8byte	.LBE1956
-	.8byte	.LBB1974
-	.8byte	.LBE1974
+	.8byte	.LBB1947
+	.8byte	.LBE1947
+	.8byte	.LBB1948
+	.8byte	.LBE1948
+	.8byte	.LBB1949
+	.8byte	.LBE1949
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1945
+	.8byte	.LBE1945
 	.8byte	.LBB1946
 	.8byte	.LBE1946
-	.8byte	.LBB1949
-	.8byte	.LBE1949
-	.8byte	.LBB1950
-	.8byte	.LBE1950
-	.8byte	.LBB1951
-	.8byte	.LBE1951
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1947
-	.8byte	.LBE1947
-	.8byte	.LBB1948
-	.8byte	.LBE1948
+	.8byte	.LBB1955
+	.8byte	.LBE1955
+	.8byte	.LBB1984
+	.8byte	.LBE1984
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1957
-	.8byte	.LBE1957
+	.8byte	.LBB1960
+	.8byte	.LBE1960
+	.8byte	.LBB1966
+	.8byte	.LBE1966
+	.8byte	.LBB1967
+	.8byte	.LBE1967
+	.8byte	.LBB1985
+	.8byte	.LBE1985
 	.8byte	.LBB1986
 	.8byte	.LBE1986
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1962
-	.8byte	.LBE1962
 	.8byte	.LBB1968
 	.8byte	.LBE1968
-	.8byte	.LBB1969
-	.8byte	.LBE1969
-	.8byte	.LBB1987
-	.8byte	.LBE1987
-	.8byte	.LBB1988
-	.8byte	.LBE1988
+	.8byte	.LBB1971
+	.8byte	.LBE1971
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1970
-	.8byte	.LBE1970
-	.8byte	.LBB1973
-	.8byte	.LBE1973
+	.8byte	.LBB1976
+	.8byte	.LBE1976
+	.8byte	.LBB1987
+	.8byte	.LBE1987
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1978
 	.8byte	.LBE1978
-	.8byte	.LBB1989
-	.8byte	.LBE1989
+	.8byte	.LBB1979
+	.8byte	.LBE1979
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1980
 	.8byte	.LBE1980
-	.8byte	.LBB1981
-	.8byte	.LBE1981
+	.8byte	.LBB1992
+	.8byte	.LBE1992
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1982
 	.8byte	.LBE1982
-	.8byte	.LBB1994
-	.8byte	.LBE1994
+	.8byte	.LBB1983
+	.8byte	.LBE1983
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1984
-	.8byte	.LBE1984
-	.8byte	.LBB1985
-	.8byte	.LBE1985
+	.8byte	.LBB1988
+	.8byte	.LBE1988
+	.8byte	.LBB1991
+	.8byte	.LBE1991
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1990
-	.8byte	.LBE1990
 	.8byte	.LBB1993
 	.8byte	.LBE1993
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1995
-	.8byte	.LBE1995
-	.8byte	.LBB1998
-	.8byte	.LBE1998
+	.8byte	.LBB1996
+	.8byte	.LBE1996
 	.8byte	0
 	.8byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0
-	.8byte	.LFB2867
-	.8byte	.LFE2867
 	.8byte	.LFB2866
 	.8byte	.LFE2866
+	.8byte	.LFB2865
+	.8byte	.LFE2865
 	.8byte	0
 	.8byte	0
 	.section	.debug_line,"",@progbits
@@ -58133,7 +58159,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_SUSPENDED"
 .LASF698:
 	.string	"reclaim_state"
-.LASF3343:
+.LASF3344:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF138:
 	.string	"vendor_panic_cb"
@@ -58239,7 +58265,7 @@ __exitcall_ebc_exit:
 	.string	"DOMAIN_BUS_WAKEUP"
 .LASF1237:
 	.string	"arm64_el2_vector_last_slot"
-.LASF3337:
+.LASF3338:
 	.string	"queue_work_on"
 .LASF2350:
 	.string	"online"
@@ -58487,7 +58513,7 @@ __exitcall_ebc_exit:
 	.string	"get_next_id"
 .LASF238:
 	.string	"rwlock_t"
-.LASF3342:
+.LASF3343:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
 .LASF855:
 	.string	"pgprot"
@@ -59023,7 +59049,7 @@ __exitcall_ebc_exit:
 	.string	"exit_code"
 .LASF1071:
 	.string	"exec_start"
-.LASF3339:
+.LASF3340:
 	.string	"printk"
 .LASF2396:
 	.string	"consumers"
@@ -61271,7 +61297,7 @@ __exitcall_ebc_exit:
 	.string	"__tracepoint_page_ref_set"
 .LASF3199:
 	.string	"ebc_tcon_enable"
-.LASF3341:
+.LASF3342:
 	.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"
@@ -61339,7 +61365,7 @@ __exitcall_ebc_exit:
 	.string	"raw_spinlock_t"
 .LASF2954:
 	.string	"vir_width"
-.LASF3344:
+.LASF3337:
 	.string	"epd_overlay_lut"
 .LASF3262:
 	.string	"INIT_LIST_HEAD"
@@ -61583,7 +61609,7 @@ __exitcall_ebc_exit:
 	.string	"image_new_tmp"
 .LASF1746:
 	.string	"num_kp"
-.LASF3340:
+.LASF3341:
 	.string	"__pm_stay_awake"
 .LASF2579:
 	.string	"vmap_area_list"
@@ -62583,7 +62609,7 @@ __exitcall_ebc_exit:
 	.string	"scatterlist"
 .LASF1282:
 	.string	"altmap_valid"
-.LASF3338:
+.LASF3339:
 	.string	"down"
 .LASF102:
 	.string	"read_iter"
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.c b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.c
index a6b98ed56d80..8e58a1c720dc 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.c
+++ b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.c
@@ -70,3 +70,9 @@ int epd_lut_get(struct epd_lut_data *output, enum epd_lut_type lut_type, int tem
 {
 	return lut_get(output, lut_type, temperture, needpic);
 }
+
+//you can change overlay lut mode here
+int epd_overlay_lut(void)
+{
+	return WF_TYPE_AUTO;
+}
\ No newline at end of file
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h
index 148b67af5740..3e4965b4ded0 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h
+++ b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h
@@ -51,10 +51,7 @@ 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 needpic);
 
 //you can change overlay lut mode here
-static inline int epd_overlay_lut(void)
-{
-	return WF_TYPE_AUTO;
-}
+int epd_overlay_lut(void);
 
 /*
  * PVI Waveform Interfaces
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S
index c33e6e1549e4..23979a3d1276 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S
@@ -14,7 +14,7 @@
 	.p2align 3,,7
 	.type	pvi_lut_init_wf_table, %function
 pvi_lut_init_wf_table:
-.LFB1558:
+.LFB1557:
 	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform.c"
 	.loc 1 679 0
 	.cfi_startproc
@@ -88,13 +88,13 @@ pvi_lut_init_wf_table:
 .L14:
 	ret
 	.cfi_endproc
-.LFE1558:
+.LFE1557:
 	.size	pvi_lut_init_wf_table, .-pvi_lut_init_wf_table
 	.align	2
 	.p2align 3,,7
 	.type	get_wf_mode_index, %function
 get_wf_mode_index:
-.LFB1552:
+.LFB1551:
 	.loc 1 473 0
 	.cfi_startproc
 .LVL8:
@@ -500,14 +500,14 @@ get_wf_mode_index:
 	add	x19, x19, 24
 	b	.L28
 	.cfi_endproc
-.LFE1552:
+.LFE1551:
 	.size	get_wf_mode_index, .-get_wf_mode_index
 	.align	2
 	.p2align 3,,7
 	.global	decodewaveform
 	.type	decodewaveform, %function
 decodewaveform:
-.LFB1548:
+.LFB1547:
 	.loc 1 67 0
 	.cfi_startproc
 .LVL29:
@@ -805,14 +805,14 @@ decodewaveform:
 	mov	w0, -22
 	b	.L65
 	.cfi_endproc
-.LFE1548:
+.LFE1547:
 	.size	decodewaveform, .-decodewaveform
 	.align	2
 	.p2align 3,,7
 	.global	decodewaveform_32
 	.type	decodewaveform_32, %function
 decodewaveform_32:
-.LFB1549:
+.LFB1548:
 	.loc 1 163 0
 	.cfi_startproc
 .LVL47:
@@ -1059,14 +1059,14 @@ decodewaveform_32:
 	mov	w0, -22
 	b	.L103
 	.cfi_endproc
-.LFE1549:
+.LFE1548:
 	.size	decodewaveform_32, .-decodewaveform_32
 	.align	2
 	.p2align 3,,7
 	.global	decodewaveform_auto
 	.type	decodewaveform_auto, %function
 decodewaveform_auto:
-.LFB1550:
+.LFB1549:
 	.loc 1 250 0
 	.cfi_startproc
 .LVL67:
@@ -1450,14 +1450,14 @@ decodewaveform_auto:
 	mov	w0, -22
 	b	.L129
 	.cfi_endproc
-.LFE1550:
+.LFE1549:
 	.size	decodewaveform_auto, .-decodewaveform_auto
 	.align	2
 	.p2align 3,,7
 	.global	pvi_wf_get_lut
 	.type	pvi_wf_get_lut, %function
 pvi_wf_get_lut:
-.LFB1560:
+.LFB1559:
 	.loc 1 744 0
 	.cfi_startproc
 .LVL93:
@@ -2193,14 +2193,14 @@ pvi_wf_get_lut:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE1560:
+.LFE1559:
 	.size	pvi_wf_get_lut, .-pvi_wf_get_lut
 	.align	2
 	.p2align 3,,7
 	.global	pvi_wf_input
 	.type	pvi_wf_input, %function
 pvi_wf_input:
-.LFB1561:
+.LFB1560:
 	.loc 1 806 0
 	.cfi_startproc
 .LVL160:
@@ -2295,14 +2295,14 @@ pvi_wf_input:
 	beq	.L248
 	b	.L245
 	.cfi_endproc
-.LFE1561:
+.LFE1560:
 	.size	pvi_wf_input, .-pvi_wf_input
 	.align	2
 	.p2align 3,,7
 	.global	pvi_wf_get_version
 	.type	pvi_wf_get_version, %function
 pvi_wf_get_version:
-.LFB1562:
+.LFB1561:
 	.loc 1 845 0
 	.cfi_startproc
 	.loc 1 846 0
@@ -2334,24 +2334,24 @@ pvi_wf_get_version:
 	.loc 1 859 0
 	ret
 	.cfi_endproc
-.LFE1562:
+.LFE1561:
 	.size	pvi_wf_get_version, .-pvi_wf_get_version
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.16939, %object
-	.size	__func__.16939, 18
-__func__.16939:
+	.type	__func__.16938, %object
+	.size	__func__.16938, 18
+__func__.16938:
 	.string	"get_wf_frm_num_32"
 	.zero	6
-	.type	__func__.16928, %object
-	.size	__func__.16928, 15
-__func__.16928:
+	.type	__func__.16927, %object
+	.size	__func__.16927, 15
+__func__.16927:
 	.string	"get_wf_frm_num"
 	.zero	1
-	.type	__func__.16951, %object
-	.size	__func__.16951, 20
-__func__.16951:
+	.type	__func__.16950, %object
+	.size	__func__.16950, 20
+__func__.16950:
 	.string	"get_wf_frm_num_auto"
 	.data
 	.align	2
@@ -2360,13 +2360,13 @@ __func__.16951:
 	.size	maxpic, 4
 maxpic:
 	.word	16
-	.type	sftemp.17009, %object
-	.size	sftemp.17009, 4
-sftemp.17009:
+	.type	sftemp.17008, %object
+	.size	sftemp.17008, 4
+sftemp.17008:
 	.word	-1
-	.type	stype.17008, %object
-	.size	stype.17008, 4
-stype.17008:
+	.type	stype.17007, %object
+	.size	stype.17007, 4
+stype.17007:
 	.word	12
 	.bss
 	.align	3
@@ -2375,18 +2375,18 @@ stype.17008:
 	.size	waveformdata, 8
 waveformdata:
 	.zero	8
-	.type	pvi_modes.16879, %object
-	.size	pvi_modes.16879, 36
-pvi_modes.16879:
+	.type	pvi_modes.16878, %object
+	.size	pvi_modes.16878, 36
+pvi_modes.16878:
 	.zero	36
 	.zero	4
 	.type	global_waveform, %object
 	.size	global_waveform, 8
 global_waveform:
 	.zero	8
-	.type	spi_id_buffer.17045, %object
-	.size	spi_id_buffer.17045, 32
-spi_id_buffer.17045:
+	.type	spi_id_buffer.17044, %object
+	.size	spi_id_buffer.17044, 32
+spi_id_buffer.17044:
 	.zero	32
 	.section	.rodata.str1.8,"aMS",@progbits,1
 	.align	3
@@ -14441,8 +14441,8 @@ spi_id_buffer.17045:
 	.byte	0x1
 	.2byte	0x34c
 	.4byte	0x55
-	.8byte	.LFB1562
-	.8byte	.LFE1562-.LFB1562
+	.8byte	.LFB1561
+	.8byte	.LFE1561-.LFB1561
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x6283
@@ -14460,7 +14460,7 @@ spi_id_buffer.17045:
 	.4byte	0x6283
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	spi_id_buffer.17045
+	.8byte	spi_id_buffer.17044
 	.uleb128 0x48
 	.string	"i"
 	.byte	0x1
@@ -14479,8 +14479,8 @@ spi_id_buffer.17045:
 	.byte	0x1
 	.2byte	0x325
 	.4byte	0xbb
-	.8byte	.LFB1561
-	.8byte	.LFE1561-.LFB1561
+	.8byte	.LFB1560
+	.8byte	.LFE1560-.LFB1560
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x62ec
@@ -14507,8 +14507,8 @@ spi_id_buffer.17045:
 	.byte	0x1
 	.2byte	0x2e7
 	.4byte	0xbb
-	.8byte	.LFB1560
-	.8byte	.LFE1560-.LFB1560
+	.8byte	.LFB1559
+	.8byte	.LFE1559-.LFB1559
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x6651
@@ -14543,7 +14543,7 @@ spi_id_buffer.17045:
 	.4byte	0x5fdb
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	stype.17008
+	.8byte	stype.17007
 	.uleb128 0x47
 	.4byte	.LASF1484
 	.byte	0x1
@@ -14551,7 +14551,7 @@ spi_id_buffer.17045:
 	.4byte	0xbb
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	sftemp.17009
+	.8byte	sftemp.17008
 	.uleb128 0x4a
 	.4byte	.LASF1485
 	.byte	0x1
@@ -14844,8 +14844,8 @@ spi_id_buffer.17045:
 	.4byte	.LASF1522
 	.byte	0x1
 	.2byte	0x2a6
-	.8byte	.LFB1558
-	.8byte	.LFE1558-.LFB1558
+	.8byte	.LFB1557
+	.8byte	.LFE1557-.LFB1557
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x6774
@@ -15193,8 +15193,8 @@ spi_id_buffer.17045:
 	.byte	0x1
 	.2byte	0x1d8
 	.4byte	0xbb
-	.8byte	.LFB1552
-	.8byte	.LFE1552-.LFB1552
+	.8byte	.LFB1551
+	.8byte	.LFE1551-.LFB1551
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x6aa9
@@ -15237,7 +15237,7 @@ spi_id_buffer.17045:
 	.4byte	0x6acc
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	pvi_modes.16879
+	.8byte	pvi_modes.16878
 	.uleb128 0x4b
 	.8byte	.LVL26
 	.4byte	0x6cfd
@@ -15269,7 +15269,7 @@ spi_id_buffer.17045:
 	.4byte	0x6ae3
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	pvi_modes.16879
+	.8byte	pvi_modes.16878
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xbb
@@ -15283,8 +15283,8 @@ spi_id_buffer.17045:
 	.byte	0x1
 	.byte	0xf9
 	.4byte	0xbb
-	.8byte	.LFB1550
-	.8byte	.LFE1550-.LFB1550
+	.8byte	.LFB1549
+	.8byte	.LFE1549-.LFB1549
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x6bb5
@@ -15356,8 +15356,8 @@ spi_id_buffer.17045:
 	.byte	0x1
 	.byte	0xa2
 	.4byte	0xbb
-	.8byte	.LFB1549
-	.8byte	.LFE1549-.LFB1549
+	.8byte	.LFB1548
+	.8byte	.LFE1548-.LFB1548
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x6c5b
@@ -15418,8 +15418,8 @@ spi_id_buffer.17045:
 	.byte	0x1
 	.byte	0x42
 	.4byte	0xbb
-	.8byte	.LFB1548
-	.8byte	.LFE1548-.LFB1548
+	.8byte	.LFB1547
+	.8byte	.LFE1547-.LFB1547
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x6cfd
@@ -16793,7 +16793,7 @@ spi_id_buffer.17045:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL164-.Ltext0
-	.8byte	.LFE1561-.Ltext0
+	.8byte	.LFE1560-.Ltext0
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
@@ -16855,7 +16855,7 @@ spi_id_buffer.17045:
 	.2byte	0x1
 	.byte	0x66
 	.8byte	.LVL156-.Ltext0
-	.8byte	.LFE1560-.Ltext0
+	.8byte	.LFE1559-.Ltext0
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
@@ -16882,7 +16882,7 @@ spi_id_buffer.17045:
 	.2byte	0x1
 	.byte	0x53
 	.8byte	.LVL156-.Ltext0
-	.8byte	.LFE1560-.Ltext0
+	.8byte	.LFE1559-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
@@ -16921,7 +16921,7 @@ spi_id_buffer.17045:
 	.2byte	0x1
 	.byte	0x63
 	.8byte	.LVL156-.Ltext0
-	.8byte	.LFE1560-.Ltext0
+	.8byte	.LFE1559-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
@@ -17109,7 +17109,7 @@ spi_id_buffer.17045:
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL17-.Ltext0
-	.8byte	.LFE1552-.Ltext0
+	.8byte	.LFE1551-.Ltext0
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S
index 3bed7bc5b6e3..89c3326c72d8 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S
@@ -14,7 +14,7 @@
 	.p2align 3,,7
 	.type	decode_wf_data, %function
 decode_wf_data:
-.LFB1557:
+.LFB1556:
 	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform.c"
 	.loc 1 242 0
 	.cfi_startproc
@@ -87,13 +87,13 @@ decode_wf_data:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE1557:
+.LFE1556:
 	.size	decode_wf_data, .-decode_wf_data
 	.align	2
 	.p2align 3,,7
 	.type	parse_wf_gray16.isra.3, %function
 parse_wf_gray16.isra.3:
-.LFB1570:
+.LFB1569:
 	.loc 1 352 0
 	.cfi_startproc
 .LVL6:
@@ -288,14 +288,14 @@ parse_wf_gray16.isra.3:
 .LBE232:
 .LBE235:
 	.cfi_endproc
-.LFE1570:
+.LFE1569:
 	.size	parse_wf_gray16.isra.3, .-parse_wf_gray16.isra.3
 	.align	2
 	.p2align 3,,7
 	.global	rkf_wf_input
 	.type	rkf_wf_input, %function
 rkf_wf_input:
-.LFB1552:
+.LFB1551:
 	.loc 1 128 0
 	.cfi_startproc
 .LVL33:
@@ -532,14 +532,14 @@ rkf_wf_input:
 	.loc 1 138 0
 	b	.L35
 	.cfi_endproc
-.LFE1552:
+.LFE1551:
 	.size	rkf_wf_input, .-rkf_wf_input
 	.align	2
 	.p2align 3,,7
 	.global	rkf_wf_get_version
 	.type	rkf_wf_get_version, %function
 rkf_wf_get_version:
-.LFB1553:
+.LFB1552:
 	.loc 1 161 0
 	.cfi_startproc
 	.loc 1 162 0
@@ -552,14 +552,14 @@ rkf_wf_get_version:
 	csel	x0, x0, xzr, ne
 	ret
 	.cfi_endproc
-.LFE1553:
+.LFE1552:
 	.size	rkf_wf_get_version, .-rkf_wf_get_version
 	.align	2
 	.p2align 3,,7
 	.global	rkf_wf_get_lut
 	.type	rkf_wf_get_lut, %function
 rkf_wf_get_lut:
-.LFB1566:
+.LFB1565:
 	.loc 1 486 0
 	.cfi_startproc
 .LVL58:
@@ -1418,25 +1418,25 @@ rkf_wf_get_lut:
 	lsl	x0, x0, 2
 	b	.L76
 	.cfi_endproc
-.LFE1566:
+.LFE1565:
 	.size	rkf_wf_get_lut, .-rkf_wf_get_lut
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.16926, %object
-	.size	__func__.16926, 15
-__func__.16926:
+	.type	__func__.16925, %object
+	.size	__func__.16925, 15
+__func__.16925:
 	.string	"decode_wf_auto"
 	.data
 	.align	2
 	.set	.LANCHOR1,. + 0
-	.type	sftemp.16997, %object
-	.size	sftemp.16997, 4
-sftemp.16997:
+	.type	sftemp.16996, %object
+	.size	sftemp.16996, 4
+sftemp.16996:
 	.word	-1
-	.type	stype.16996, %object
-	.size	stype.16996, 4
-stype.16996:
+	.type	stype.16995, %object
+	.size	stype.16995, 4
+stype.16995:
 	.word	12
 	.bss
 	.align	3
@@ -13460,8 +13460,8 @@ crc32_table:
 	.byte	0x1
 	.2byte	0x1e5
 	.4byte	0xc0
-	.8byte	.LFB1566
-	.8byte	.LFE1566-.LFB1566
+	.8byte	.LFB1565
+	.8byte	.LFE1565-.LFB1565
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x69b6
@@ -13496,7 +13496,7 @@ crc32_table:
 	.4byte	0x5fb2
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	stype.16996
+	.8byte	stype.16995
 	.uleb128 0x48
 	.4byte	.LASF1471
 	.byte	0x1
@@ -13504,7 +13504,7 @@ crc32_table:
 	.4byte	0xc0
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	sftemp.16997
+	.8byte	sftemp.16996
 	.uleb128 0x49
 	.string	"ret"
 	.byte	0x1
@@ -14491,8 +14491,8 @@ crc32_table:
 	.byte	0x1
 	.byte	0xf0
 	.4byte	0x2d56
-	.8byte	.LFB1557
-	.8byte	.LFE1557-.LFB1557
+	.8byte	.LFB1556
+	.8byte	.LFE1556-.LFB1556
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x6dba
@@ -14665,8 +14665,8 @@ crc32_table:
 	.byte	0x1
 	.byte	0xa0
 	.4byte	0x55
-	.8byte	.LFB1553
-	.8byte	.LFE1553-.LFB1553
+	.8byte	.LFB1552
+	.8byte	.LFE1552-.LFB1552
 	.uleb128 0x1
 	.byte	0x9c
 	.uleb128 0x66
@@ -14674,8 +14674,8 @@ crc32_table:
 	.byte	0x1
 	.byte	0x7f
 	.4byte	0xc0
-	.8byte	.LFB1552
-	.8byte	.LFE1552-.LFB1552
+	.8byte	.LFB1551
+	.8byte	.LFE1551-.LFB1551
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x7049
@@ -15038,8 +15038,8 @@ crc32_table:
 	.byte	0
 	.uleb128 0x6a
 	.4byte	0x6b2c
-	.8byte	.LFB1570
-	.8byte	.LFE1570-.LFB1570
+	.8byte	.LFB1569
+	.8byte	.LFE1569-.LFB1569
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x735a
@@ -16651,7 +16651,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL133-.Ltext0
-	.8byte	.LFE1566-.Ltext0
+	.8byte	.LFE1565-.Ltext0
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -16694,7 +16694,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL146-.Ltext0
-	.8byte	.LFE1566-.Ltext0
+	.8byte	.LFE1565-.Ltext0
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
@@ -16872,7 +16872,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x52
 	.8byte	.LVL146-.Ltext0
-	.8byte	.LFE1566-.Ltext0
+	.8byte	.LFE1565-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
@@ -16883,7 +16883,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x53
 	.8byte	.LVL146-.Ltext0
-	.8byte	.LFE1566-.Ltext0
+	.8byte	.LFE1565-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
@@ -16894,7 +16894,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x55
 	.8byte	.LVL146-.Ltext0
-	.8byte	.LFE1566-.Ltext0
+	.8byte	.LFE1565-.Ltext0
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
@@ -17096,7 +17096,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL55-.Ltext0
-	.8byte	.LFE1552-.Ltext0
+	.8byte	.LFE1551-.Ltext0
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
@@ -17167,7 +17167,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x52
 	.8byte	.LVL21-.Ltext0
-	.8byte	.LFE1570-.Ltext0
+	.8byte	.LFE1569-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
@@ -17182,7 +17182,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x53
 	.8byte	.LVL21-.Ltext0
-	.8byte	.LFE1570-.Ltext0
+	.8byte	.LFE1569-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
@@ -17204,7 +17204,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL20-.Ltext0
-	.8byte	.LFE1570-.Ltext0
+	.8byte	.LFE1569-.Ltext0
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -17235,7 +17235,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x56
 	.8byte	.LVL32-.Ltext0
-	.8byte	.LFE1570-.Ltext0
+	.8byte	.LFE1569-.Ltext0
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
@@ -17266,7 +17266,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x54
 	.8byte	.LVL31-.Ltext0
-	.8byte	.LFE1570-.Ltext0
+	.8byte	.LFE1569-.Ltext0
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0

commit e7b6652a08486779dd0663af469707dfac0146f9
Author: Douglas Gilbert <dgilbert@interlog.com>
Date:   Sun Dec 29 22:35:44 2019 -0500

    UPSTREAM: USB-PD tcpm: bad warning+size, PPS adapters
    
    Augmented Power Delivery Objects (A)PDO_s are used by USB-C
    PD power adapters to advertize the voltages and currents
    they support. There can be up to 7 PDO_s but before PPS
    (programmable power supply) there were seldom more than 4
    or 5. Recently Samsung released an optional PPS 45 Watt power
    adapter (EP-TA485) that has 7 PDO_s. It is for the Galaxy 10+
    tablet and charges it quicker than the adapter supplied at
    purchase. The EP-TA485 causes an overzealous WARN_ON to soil
    the log plus it miscalculates the number of bytes to read.
    
    So this bug has been there for some time but goes
    undetected for the majority of USB-C PD power adapters on
    the market today that have 6 or less PDO_s. That may soon
    change as more USB-C PD adapters with PPS come to market.
    
    Tested on a EP-TA485 and an older Lenovo PN: SA10M13950
    USB-C 65 Watt adapter (without PPS and has 4 PDO_s) plus
    several other PD power adapters.
    
    Signed-off-by: Douglas Gilbert <dgilbert@interlog.com>
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20191230033544.1809-1-dgilbert@interlog.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Wang Jie <dave.wang@rock-chips.com>
    (cherry picked from commit c215e48e97d232249a33849fc46fc50311043e11)
    Change-Id: I51f7e53e6540cdc0ad543f7cbc80416204a1c816

diff --git a/drivers/usb/typec/tcpm/tcpci.c b/drivers/usb/typec/tcpm/tcpci.c
index d30cd7329cbf..cd2dc47c538e 100644
--- a/drivers/usb/typec/tcpm/tcpci.c
+++ b/drivers/usb/typec/tcpm/tcpci.c
@@ -482,20 +482,30 @@ irqreturn_t tcpci_irq(struct tcpci *tcpci)
 
 	if (status & TCPC_ALERT_RX_STATUS) {
 		struct pd_message msg;
-		unsigned int cnt;
+		unsigned int cnt, payload_cnt;
 		u16 header;
 
 		regmap_read(tcpci->regmap, TCPC_RX_BYTE_CNT, &cnt);
+		/*
+		 * 'cnt' corresponds to READABLE_BYTE_COUNT in section 4.4.14
+		 * of the TCPCI spec [Rev 2.0 Ver 1.0 October 2017] and is
+		 * defined in table 4-36 as one greater than the number of
+		 * bytes received. And that number includes the header. So:
+		 */
+		if (cnt > 3)
+			payload_cnt = cnt - (1 + sizeof(msg.header));
+		else
+			payload_cnt = 0;
 
 		tcpci_read16(tcpci, TCPC_RX_HDR, &header);
 		msg.header = cpu_to_le16(header);
 
-		if (WARN_ON(cnt > sizeof(msg.payload)))
-			cnt = sizeof(msg.payload);
+		if (WARN_ON(payload_cnt > sizeof(msg.payload)))
+			payload_cnt = sizeof(msg.payload);
 
-		if (cnt > 0)
+		if (payload_cnt > 0)
 			regmap_raw_read(tcpci->regmap, TCPC_RX_DATA,
-					&msg.payload, cnt);
+					&msg.payload, payload_cnt);
 
 		/* Read complete, clear RX status alert bit */
 		tcpci_write16(tcpci, TCPC_ALERT, TCPC_ALERT_RX_STATUS);

commit c9282596c984b00e3e65a71c94ab679d5f28b978
Author: Guochun Huang <hero.huang@rock-chips.com>
Date:   Sat Dec 25 11:23:30 2021 +0800

    drm/rockchip/rk628: combtxphy: lvds: power up all channel after phy lock
    
    Signed-off-by: Guochun Huang <hero.huang@rock-chips.com>
    Change-Id: If28520a20e73258037c08cb4dd95888a45093d6a

diff --git a/drivers/gpu/drm/rockchip/rk628/rk628_combtxphy.c b/drivers/gpu/drm/rockchip/rk628/rk628_combtxphy.c
index efcbda8219c3..d46c4e8a7a21 100644
--- a/drivers/gpu/drm/rockchip/rk628/rk628_combtxphy.c
+++ b/drivers/gpu/drm/rockchip/rk628/rk628_combtxphy.c
@@ -174,7 +174,7 @@ static int rk628_combtxphy_lvds_power_on(struct rk628_combtxphy *combtxphy)
 		     SW_PLL_FRAC_DIV(combtxphy->frac_div) |
 		     SW_RATE(combtxphy->rate_div / 2));
 	regmap_update_bits(combtxphy->regmap, COMBTXPHY_CON0,
-			   SW_PD_PLL | SW_TX_PD_MASK, 0);
+			   SW_PD_PLL, 0);
 
 	ret = regmap_read_poll_timeout(combtxphy->grf, GRF_DPHY0_STATUS,
 				       val, val & DPHY_PHYLOCK, 0, 1000);
@@ -185,7 +185,7 @@ static int rk628_combtxphy_lvds_power_on(struct rk628_combtxphy *combtxphy)
 
 	usleep_range(100, 200);
 	regmap_update_bits(combtxphy->regmap, COMBTXPHY_CON0,
-			   SW_TX_IDLE_MASK, 0);
+			   SW_TX_IDLE_MASK | SW_TX_PD_MASK, 0);
 
 	return 0;
 }
@@ -482,9 +482,6 @@ static int rk628_combtxphy_probe(struct platform_device *pdev)
 		return ret;
 	}
 
-	regmap_write(combtxphy->regmap, COMBTXPHY_CON0,
-		     SW_TX_IDLE(0x3ff) | SW_TX_PD(0x3ff) | SW_PD_PLL);
-
 	phy = devm_phy_create(dev, NULL, &rk628_combtxphy_ops);
 	if (IS_ERR(phy)) {
 		ret = PTR_ERR(phy);

commit e4845253662632ed23a06cf4993ee9c74736cde1
Author: Yu Qiaowei <cerf.yu@rock-chips.com>
Date:   Thu Dec 23 20:13:11 2021 +0800

    video: rockchip: rga2: Fix rotating mmu interruption error.
    
    Since the ARGB format was added without processing the address offset
    during rotation, the address offset of mmu was calculated incorrectly.
    
    Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
    Change-Id: I6bddd21b50bf60cadf493e73cff10c18210c375c

diff --git a/drivers/video/rockchip/rga2/rga2_reg_info.c b/drivers/video/rockchip/rga2/rga2_reg_info.c
index d66df54ee595..a6c154989dd1 100644
--- a/drivers/video/rockchip/rga2/rga2_reg_info.c
+++ b/drivers/video/rockchip/rga2/rga2_reg_info.c
@@ -594,7 +594,9 @@ static void RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
 	/* Warning */
 	line_width_real = dst_fmt_y4_en ? ((msg->dst.act_w) >>1) : msg->dst.act_w;
 
-	if (msg->dst.format < 0x18) {
+	if (msg->dst.format < 0x18 ||
+	    (msg->dst.format >= RGA2_FORMAT_ARGB_8888 &&
+	     msg->dst.format <= RGA2_FORMAT_ABGR_4444)) {
 		/* 270 degree & Mirror V*/
 		y_ld_addr = yrgb_addr + (msg->dst.act_h - 1) * (d_stride);
 		/* 90 degree & Mirror H  */

commit 0ae800261393ff209df0fe779a11a52c45fd9712
Author: Ziyuan Xu <xzy.xu@rock-chips.com>
Date:   Thu Dec 23 14:50:57 2021 +0800

    ARM: configs: rv1126-trailcamera.config: add touchscreen(gt1x) supprot
    
    Signed-off-by: Ziyuan Xu <xzy.xu@rock-chips.com>
    Change-Id: I38fac09e8ecfc6f3ee75d1103e8a83e130c195fc

diff --git a/arch/arm/configs/rv1126-trailcamera.config b/arch/arm/configs/rv1126-trailcamera.config
index e12ab8d0d040..52abc6eaf515 100644
--- a/arch/arm/configs/rv1126-trailcamera.config
+++ b/arch/arm/configs/rv1126-trailcamera.config
@@ -5,7 +5,9 @@ CONFIG_BATTERY_CW2015=y
 # CONFIG_BT is not set
 # CONFIG_DEBUG_GPIO is not set
 # CONFIG_IIO is not set
-# CONFIG_INPUT is not set
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MISC is not set
+CONFIG_INPUT_TOUCHSCREEN=y
 # CONFIG_MAILBOX is not set
 # CONFIG_MFD_RK808 is not set
 # CONFIG_MODULE_UNLOAD is not set
@@ -39,3 +41,73 @@ CONFIG_VIDEO_OS04C10=y
 CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP=y
 # CONFIG_WIRELESS is not set
 # CONFIG_XZ_DEC is not set
+# CONFIG_TOUCHSCREEN_AD7879 is not set
+# CONFIG_TOUCHSCREEN_AR1021_I2C is not set
+# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set
+# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
+# CONFIG_TOUCHSCREEN_BU21013 is not set
+# CONFIG_TOUCHSCREEN_BU21029 is not set
+# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set
+# CONFIG_TOUCHSCREEN_CY8C40XX is not set
+# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
+# CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set
+# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set
+# CONFIG_TOUCHSCREEN_DYNAPRO is not set
+# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set
+# CONFIG_TOUCHSCREEN_EETI is not set
+# CONFIG_TOUCHSCREEN_EGALAX is not set
+# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set
+# CONFIG_TOUCHSCREEN_EKTF2127 is not set
+# CONFIG_TOUCHSCREEN_ELAN is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_EXC3000 is not set
+# CONFIG_TOUCHSCREEN_FUJITSU is not set
+# CONFIG_TOUCHSCREEN_GOODIX is not set
+# CONFIG_TOUCHSCREEN_GSL3673 is not set
+# CONFIG_TOUCHSCREEN_GSL3673_800X1280 is not set
+# CONFIG_TOUCHSCREEN_GSL3676 is not set
+# CONFIG_TOUCHSCREEN_GSLX6801 is not set
+# CONFIG_TOUCHSCREEN_GSLX680A is not set
+# CONFIG_TOUCHSCREEN_GSLX680_D708 is not set
+# CONFIG_TOUCHSCREEN_GSLX680_FIREFLY is not set
+# CONFIG_TOUCHSCREEN_GSLX680_PAD is not set
+# CONFIG_TOUCHSCREEN_GSLX680_VR is not set
+CONFIG_TOUCHSCREEN_GT1X=y
+# CONFIG_TOUCHSCREEN_GT9XX is not set
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set
+# CONFIG_TOUCHSCREEN_HIDEEP is not set
+# CONFIG_TOUCHSCREEN_HYN_CST2XX is not set
+# CONFIG_TOUCHSCREEN_ILI210X is not set
+# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set
+# CONFIG_TOUCHSCREEN_INEXIO is not set
+# CONFIG_TOUCHSCREEN_MAX11801 is not set
+# CONFIG_TOUCHSCREEN_MCS5000 is not set
+# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_MMS114 is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_PIXCIR is not set
+CONFIG_TOUCHSCREEN_PROPERTIES=y
+# CONFIG_TOUCHSCREEN_RM_TS is not set
+# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set
+# CONFIG_TOUCHSCREEN_S6SY761 is not set
+# CONFIG_TOUCHSCREEN_SILEAD is not set
+# CONFIG_TOUCHSCREEN_SIS_I2C is not set
+# CONFIG_TOUCHSCREEN_ST1232 is not set
+# CONFIG_TOUCHSCREEN_SX8654 is not set
+# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+# CONFIG_TOUCHSCREEN_TPS6507X is not set
+# CONFIG_TOUCHSCREEN_TSC2004 is not set
+# CONFIG_TOUCHSCREEN_TSC2007 is not set
+# CONFIG_TOUCHSCREEN_TSC_SERIO is not set
+# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
+# CONFIG_TOUCHSCREEN_VTL_CT36X is not set
+# CONFIG_TOUCHSCREEN_WACOM_I2C is not set
+# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
+# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set
+# CONFIG_TOUCHSCREEN_ZET6223 is not set
+# CONFIG_TOUCHSCREEN_ZFORCE is not set

commit 385667d0c9c7428be6ee7cc6905c20ab30fda691
Author: Ziyuan Xu <xzy.xu@rock-chips.com>
Date:   Thu Dec 23 14:49:45 2021 +0800

    ARM: dts: rv1126-trailcamera: add touchscreen support
    
    Signed-off-by: Ziyuan Xu <xzy.xu@rock-chips.com>
    Change-Id: Ic0055860eb37c9c5ddf07809d2742482c88ba781

diff --git a/arch/arm/boot/dts/rv1126-trailcamera.dts b/arch/arm/boot/dts/rv1126-trailcamera.dts
index 4a786d0e941d..0b8d59664117 100644
--- a/arch/arm/boot/dts/rv1126-trailcamera.dts
+++ b/arch/arm/boot/dts/rv1126-trailcamera.dts
@@ -22,6 +22,20 @@
 	status = "disabled";
 };
 
+&i2c5 {
+	status = "okay";
+	clock-frequency = <400000>;
+
+	gt1x: gt1x@14 {
+		compatible = "goodix,gt1x";
+		reg = <0x14>;
+		gtp_ics_slot_report;
+		power-supply = <&vcc18_lcd_n>;
+		goodix,rst-gpio = <&gpio2 RK_PA6 GPIO_ACTIVE_HIGH>;
+		goodix,irq-gpio = <&gpio2 RK_PA7 GPIO_ACTIVE_LOW>;
+	};
+};
+
 &thunderboot_ramoops {
 	reg = <0x00280000 0x00010000>;
 	record-size = <0x0000>;

commit d15b9a1449546fe69ff7d69ec78443816aa4f19b
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Wed Dec 22 17:48:05 2021 +0800

    phy: rockchip: naneng-combphy: Renew detect bypass reg
    
    Should use REG_19H instead of REG_DH.
    
    Fixes: 2f06afaaa8f8 ("phy: rockchip: naneng-combphy: Force detect Rx for RK356X SoCs")
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: Ifc9484e850955e6a36c30755a7ba1aee65070d0f

diff --git a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
index f3528251e297..0964d3ceec1d 100644
--- a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
+++ b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
@@ -142,9 +142,9 @@ static int rockchip_combphy_pcie_init(struct rockchip_combphy_priv *priv)
 	}
 
 	if (priv->cfg->force_det_out) {
-		val = readl(priv->mmio + (0xd << 2));
+		val = readl(priv->mmio + (0x19 << 2));
 		val |= BIT(5);
-		writel(val, priv->mmio + (0xd << 2));
+		writel(val, priv->mmio + (0x19 << 2));
 	}
 
 	return ret;

commit 4c404d41269ca8cc649038c590475c53fb5553d6
Author: Su Yuefu <yuefu.su@rock-chips.com>
Date:   Sat Oct 30 16:32:26 2021 +0800

    media: i2c: add sc1330 sensor driver
    
    Signed-off-by: Su Yuefu <yuefu.su@rock-chips.com>
    Change-Id: I3d2ad3c4607f6174d53db4189e8affccea32fdd5

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index a412ac7c495b..b5959d563a18 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -1794,6 +1794,17 @@ config VIDEO_SC035HGS
 	  To compile this driver as a module, choose M here: the
 	  module will be called sc035hgs.
 
+config VIDEO_SC1330
+	tristate "SmartSens SC1330 sensor support"
+	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
+	depends on MEDIA_CAMERA_SUPPORT
+	select V4L2_FWNODE
+	help
+	  Support for the SmartSens SC1330 sensor.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called SC1330.
+
 config VIDEO_SC132GS
 	tristate "SmartSens SC132GS sensor support"
 	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index 642bc7233b46..bd74cf2599e9 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -193,6 +193,7 @@ obj-$(CONFIG_VIDEO_JX_H65)	+= jx_h65.o
 obj-$(CONFIG_VIDEO_JX_K04)	+= jx_k04.o
 obj-$(CONFIG_VIDEO_SC031GS)	+= sc031gs.o
 obj-$(CONFIG_VIDEO_SC035HGS)	+= sc035hgs.o
+obj-$(CONFIG_VIDEO_SC1330)	+= sc1330.o
 obj-$(CONFIG_VIDEO_SC132GS)	+= sc132gs.o
 obj-$(CONFIG_VIDEO_SC200AI)	+= sc200ai.o
 obj-$(CONFIG_VIDEO_SC210IOT)	+= sc210iot.o
diff --git a/drivers/media/i2c/sc1330.c b/drivers/media/i2c/sc1330.c
new file mode 100644
index 000000000000..818381d0d456
--- /dev/null
+++ b/drivers/media/i2c/sc1330.c
@@ -0,0 +1,1499 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * sc1330 driver
+ *
+ * Copyright (C) 2021 Fuzhou Rockchip Electronics Co., Ltd.
+ *
+ * V0.0X01.0X01 add poweron function.
+ * V0.0X01.0X02 fix mclk issue when probe multiple camera.
+ * V0.0X01.0X03 add enum_frame_interval function.
+ * V0.0X01.0X04 add quick stream on/off
+ */
+#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 <linux/pinctrl/consumer.h>
+#include <linux/rk-preisp.h>
+
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x04)
+
+#define SC1330_NAME			"sc1330"
+#define OF_CAMERA_HDR_MODE		"rockchip,camera-hdr-mode"
+#define OF_CAMERA_PINCTRL_STATE_DEFAULT	"rockchip,camera_default"
+#define OF_CAMERA_PINCTRL_STATE_SLEEP	"rockchip,camera_sleep"
+
+#define SC1330_CHIP_ID			0xca18
+#define SC1330_REG_CHIP_ID		0x3107
+
+#define DVP_FREQ_72M			72000000
+#define SC1330_MAX_PIXEL_RATE		(DVP_FREQ_72M / 10 * 10) //(DVP_FREQ_72M * 2/ 10 * 10)
+
+#define SC1330_REG_CTRL_MODE		0x0100
+#define SC1330_MODE_SW_STANDBY		0x0
+#define SC1330_MODE_STREAMING		BIT(0)
+
+#define	SC1330_EXPOSURE_MIN		2// two lines long exp min
+#define	SC1330_EXPOSURE_STEP		1
+#define SC1330_VTS_MAX			0xffff
+
+#define SC1330_XVCLK_FREQ		27000000
+#define SC1330_DVP_BITS			10
+
+#define SC1330_REG_VALUE_08BIT		1
+#define SC1330_REG_VALUE_16BIT		2
+#define SC1330_REG_VALUE_24BIT		3
+
+//long exposure
+#define SC1330_REG_EXP_LONG_H		0x3e00    //[3:0]
+#define SC1330_REG_EXP_LONG_M		0x3e01    //[7:0]
+#define SC1330_REG_EXP_LONG_L		0x3e02    //[7:4]
+
+//short exposure
+#define SC1330_REG_EXP_SF_H		0x3e04    //[7:0]
+#define SC1330_REG_EXP_SF_L		0x3e05    //[7:4]
+
+//long frame and normal gain reg
+#define SC1330_REG_AGAIN		0x3e08
+#define SC1330_REG_AGAIN_FINE		0x3e09
+
+#define SC1330_REG_DGAIN		0x3e06
+#define SC1330_REG_DGAIN_FINE		0x3e07
+
+#define SC1330_GAIN_MIN			0x40
+#define SC1330_GAIN_MAX			(44 * 32 * 64)
+#define SC1330_GAIN_STEP		1
+#define SC1330_GAIN_DEFAULT		0x40
+
+//group hold
+#define SC1330_GROUP_UPDATE_ADDRESS	0x3812
+#define SC1330_GROUP_UPDATE_START_DATA	0x00
+#define SC1330_GROUP_UPDATE_LAUNCH	0x30
+
+#define SC1330_SOFTWARE_RESET_REG	0x0103
+#define SC1330_REG_TEST_PATTERN		0x4501
+#define SC1330_TEST_PATTERN_ENABLE	0x08
+
+#define SC1330_REG_VTS			0x320e
+#define SC1330_FLIP_REG			0x3221
+#define SC1330_FLIP_MASK		0x60
+#define SC1330_MIRROR_MASK		0x06
+#define REG_NULL			0xFFFF
+
+static const char * const sc1330_supply_names[] = {
+	"avdd",		/* Analog power */
+	"dovdd",	/* Digital I/O power */
+	"dvdd",		/* Digital core power */
+};
+
+#define SC1330_NUM_SUPPLIES ARRAY_SIZE(sc1330_supply_names)
+
+#define to_sc1330(sd) container_of(sd, struct sc1330, subdev)
+
+enum sc1330_max_pad {
+	PAD0,
+	PAD1,
+	PAD2,
+	PAD3,
+	PAD_MAX,
+};
+
+struct regval {
+	u16 addr;
+	u8 val;
+};
+
+struct sc1330_mode {
+	u32 bus_fmt;
+	u32 width;
+	u32 height;
+	struct v4l2_fract max_fps;
+	u32 hts_def;
+	u32 vts_def;
+	u32 exp_def;
+	const struct regval *reg_list;
+	u32 hdr_mode;
+	u32 dvp_freq_idx;
+	u32 bpp;
+	u32 vc[PAD_MAX];
+};
+
+struct sc1330 {
+	struct i2c_client	*client;
+	struct clk		*xvclk;
+	struct gpio_desc	*reset_gpio;
+	struct gpio_desc	*pwdn_gpio;
+	struct regulator_bulk_data supplies[SC1330_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	*test_pattern;
+	struct v4l2_ctrl	*pixel_rate;
+	struct v4l2_ctrl	*link_freq;
+	struct mutex		mutex;
+	bool			streaming;
+	bool			power_on;
+	const struct sc1330_mode *cur_mode;
+	u32			cfg_num;
+	u32			module_index;
+	const char		*module_facing;
+	const char		*module_name;
+	const char		*len_name;
+	bool			has_init_exp;
+	u32			cur_vts;
+	struct preisp_hdrae_exp_s init_hdrae_exp;
+};
+
+static const struct regval sc1330_linear10bit_1280x960_regs[] = {
+	{0x0103, 0x01},
+	{0x0100, 0x00},
+	{0x36e9, 0x80},
+	{0x36f9, 0x80},
+	{0x3001, 0xff},
+	{0x3002, 0xf0},
+	{0x300a, 0x24},
+	{0x3018, 0x6f},
+	{0x301a, 0xf8},
+	{0x301c, 0x94},
+	{0x301f, 0x33},
+	{0x303f, 0x81},
+	{0x320c, 0x09},
+	{0x320d, 0x60},
+	{0x3211, 0x06},
+	{0x3251, 0x98},
+	{0x3253, 0x08},
+	{0x325f, 0x0a},
+	{0x3304, 0x40},
+	{0x3306, 0x70},
+	{0x3309, 0x70},
+	{0x330a, 0x01},
+	{0x330b, 0xf0},
+	{0x330d, 0x28},
+	{0x3310, 0x0e},
+	{0x3314, 0x92},
+	{0x331e, 0x31},
+	{0x331f, 0x61},
+	{0x335d, 0x60},
+	{0x3364, 0x5e},
+	{0x3396, 0x08},
+	{0x3397, 0x18},
+	{0x3398, 0x38},
+	{0x3399, 0x0c},
+	{0x339a, 0x10},
+	{0x339b, 0x1e},
+	{0x339c, 0x70},
+	{0x33af, 0x38},
+	{0x360f, 0x21},
+	{0x3621, 0xe8},
+	{0x3632, 0x68},
+	{0x3633, 0x33},
+	{0x3634, 0x23},
+	{0x3635, 0x20},
+	{0x3637, 0x19},
+	{0x3638, 0x08},
+	{0x363b, 0x04},
+	{0x363c, 0x06},
+	{0x3641, 0x01},
+	{0x3670, 0x42},
+	{0x3671, 0x05},
+	{0x3672, 0x15},
+	{0x3673, 0x15},
+	{0x3674, 0xc0},
+	{0x3675, 0x84},
+	{0x3676, 0x88},
+	{0x367a, 0x48},
+	{0x367b, 0x58},
+	{0x367c, 0x48},
+	{0x367d, 0x58},
+	{0x3699, 0x00},
+	{0x369a, 0x00},
+	{0x369b, 0x1f},
+	{0x36a2, 0x48},
+	{0x3000, 0x0f},
+	{0x36a3, 0x58},
+	{0x36a6, 0x48},
+	{0x36a7, 0x58},
+	{0x36ab, 0xc0},
+	{0x36ac, 0x84},
+	{0x36ad, 0x88},
+	{0x36d0, 0x40},
+	{0x36db, 0x04},
+	{0x36dc, 0x14},
+	{0x36dd, 0x14},
+	{0x36de, 0x48},
+	{0x36df, 0x58},
+	{0x36ea, 0x30},
+	{0x36eb, 0x07},
+	{0x36ec, 0x17},
+	{0x36ed, 0x14},
+	{0x36fa, 0x30},
+	{0x36fb, 0x00},
+	{0x36fc, 0x10},
+	{0x36fd, 0x14},
+	{0x3e01, 0x3e},
+	{0x450a, 0x71},
+	{0x4603, 0x09},
+	{0x578a, 0x18},
+	{0x578b, 0x10},
+	{0x5793, 0x18},
+	{0x5794, 0x10},
+	{0x5799, 0x00},
+	{0x36e9, 0x20},
+	{0x36f9, 0x20},
+	{REG_NULL, 0x00},
+};
+
+/*
+ * The width and height must be configured to be
+ * the same as the current output resolution of the sensor.
+ * The input width of the isp needs to be 16 aligned.
+ * The input height of the isp needs to be 8 aligned.
+ * If the width or height does not meet the alignment rules,
+ * you can configure the cropping parameters with the following function to
+ * crop out the appropriate resolution.
+ * struct v4l2_subdev_pad_ops {
+ *	.get_selection
+ * }
+ */
+static const struct sc1330_mode supported_modes[] = {
+	{
+		/* linear modes */
+		.bus_fmt = MEDIA_BUS_FMT_SBGGR10_1X10,
+		.width = 1280,
+		.height = 960,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x03e8/2,
+		.hts_def = 0x0960,
+		.vts_def = 0x03e8,
+		.reg_list = sc1330_linear10bit_1280x960_regs,
+		.hdr_mode = NO_HDR,
+		.dvp_freq_idx = 0,
+		.bpp = 10,
+		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0,
+	}
+};
+
+static const s64 link_freq_items[] = {
+	DVP_FREQ_72M,
+};
+
+/* Write registers up to 4 at a time */
+static int sc1330_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;
+
+	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 sc1330_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 |= sc1330_write_reg(client, regs[i].addr,
+					SC1330_REG_VALUE_08BIT, regs[i].val);
+	}
+	return ret;
+}
+
+/* Read registers up to 4 at a time */
+static int sc1330_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 *)&reg_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 sc1330_enable_test_pattern(struct sc1330 *sc1330, u32 pattern)
+{
+	u32 val = 0;
+	int ret = 0;
+
+	ret = sc1330_read_reg(sc1330->client, SC1330_REG_TEST_PATTERN,
+			      SC1330_REG_VALUE_08BIT, &val);
+	if (pattern)
+		val |= SC1330_TEST_PATTERN_ENABLE;
+	else
+		val &= ~SC1330_TEST_PATTERN_ENABLE;
+	ret |= sc1330_write_reg(sc1330->client, SC1330_REG_TEST_PATTERN,
+				SC1330_REG_VALUE_08BIT, val);
+	return ret;
+}
+
+static void sc1330_get_module_inf(struct sc1330 *sc1330,
+				  struct rkmodule_inf *inf)
+{
+	memset(inf, 0, sizeof(*inf));
+	strscpy(inf->base.sensor, SC1330_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, sc1330->module_name,
+		sizeof(inf->base.module));
+	strscpy(inf->base.lens, sc1330->len_name, sizeof(inf->base.lens));
+}
+
+static void sc1330_change_mode(struct sc1330 *sc1330, const struct sc1330_mode *mode)
+{
+	sc1330->cur_mode = mode;
+	sc1330->cur_vts = sc1330->cur_mode->vts_def;
+	dev_info(&sc1330->client->dev, "set fmt: cur_mode: %dx%d, hdr: %d\n",
+		mode->width, mode->height, mode->hdr_mode);
+}
+
+static int sc1330_get_reso_dist(const struct sc1330_mode *mode,
+				struct v4l2_mbus_framefmt *framefmt)
+{
+	return abs(mode->width - framefmt->width) +
+	       abs(mode->height - framefmt->height);
+}
+
+static const struct sc1330_mode *
+sc1330_find_best_fit(struct sc1330 *sc1330, 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 < sc1330->cfg_num; i++) {
+		dist = sc1330_get_reso_dist(&supported_modes[i], framefmt);
+		if ((cur_best_fit_dist == -1 || dist <= cur_best_fit_dist) &&
+		    (supported_modes[i].bus_fmt == framefmt->code)) {
+			cur_best_fit_dist = dist;
+			cur_best_fit = i;
+		}
+	}
+
+	return &supported_modes[cur_best_fit];
+}
+
+static int sc1330_get_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct sc1330 *sc1330 = to_sc1330(sd);
+	const struct sc1330_mode *mode = sc1330->cur_mode;
+
+	mutex_lock(&sc1330->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(&sc1330->mutex);
+		return -ENOTTY;
+#endif
+		} else {
+			fmt->format.width = mode->width;
+			fmt->format.height = mode->height;
+			fmt->format.code = mode->bus_fmt;
+			fmt->format.field = V4L2_FIELD_NONE;
+			if (fmt->pad < PAD_MAX && mode->hdr_mode != NO_HDR)
+				fmt->reserved[0] = mode->vc[fmt->pad];
+	else
+		fmt->reserved[0] = mode->vc[PAD0];
+	}
+	mutex_unlock(&sc1330->mutex);
+
+	return 0;
+}
+
+static int sc1330_set_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct sc1330 *sc1330 = to_sc1330(sd);
+	const struct sc1330_mode *mode;
+	s64 h_blank, vblank_def;
+	u64 pixel_rate = 0;
+
+	mutex_lock(&sc1330->mutex);
+
+	mode = sc1330_find_best_fit(sc1330, fmt);
+	fmt->format.code = mode->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(&sc1330->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		sc1330_change_mode(sc1330, mode);
+		h_blank = mode->hts_def - mode->width;
+		__v4l2_ctrl_modify_range(sc1330->hblank, h_blank,
+					 h_blank, 1, h_blank);
+		vblank_def = mode->vts_def - mode->height;
+		__v4l2_ctrl_modify_range(sc1330->vblank, vblank_def,
+					 SC1330_VTS_MAX - mode->height,
+					 1, vblank_def);
+		__v4l2_ctrl_s_ctrl(sc1330->link_freq, mode->dvp_freq_idx);
+		pixel_rate = (u32)link_freq_items[mode->dvp_freq_idx] /
+			     mode->bpp * SC1330_DVP_BITS;
+		__v4l2_ctrl_s_ctrl_int64(sc1330->pixel_rate, pixel_rate);
+	}
+
+	mutex_unlock(&sc1330->mutex);
+
+	return 0;
+}
+
+static int sc1330_enum_mbus_code(struct v4l2_subdev *sd,
+				 struct v4l2_subdev_pad_config *cfg,
+				 struct v4l2_subdev_mbus_code_enum *code)
+{
+	struct sc1330 *sc1330 = to_sc1330(sd);
+
+	if (code->index != 0)
+		return -EINVAL;
+	code->code = sc1330->cur_mode->bus_fmt;
+
+	return 0;
+}
+
+static int sc1330_enum_frame_sizes(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_pad_config *cfg,
+				   struct v4l2_subdev_frame_size_enum *fse)
+{
+	struct sc1330 *sc1330 = to_sc1330(sd);
+
+	if (fse->index >= sc1330->cfg_num)
+		return -EINVAL;
+
+	if (fse->code != supported_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;
+
+	return 0;
+}
+
+static int sc1330_enum_frame_interval(struct v4l2_subdev *sd,
+				      struct v4l2_subdev_pad_config *cfg,
+				      struct v4l2_subdev_frame_interval_enum *fie)
+{
+	struct sc1330 *sc1330 = to_sc1330(sd);
+
+	if (fie->index >= sc1330->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;
+	return 0;
+}
+
+static int sc1330_g_frame_interval(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_frame_interval *fi)
+{
+	struct sc1330 *sc1330 = to_sc1330(sd);
+	const struct sc1330_mode *mode = sc1330->cur_mode;
+
+	mutex_lock(&sc1330->mutex);
+	fi->interval = mode->max_fps;
+	mutex_unlock(&sc1330->mutex);
+
+	return 0;
+}
+
+static int sc1330_g_mbus_config(struct v4l2_subdev *sd,
+				struct v4l2_mbus_config *config)
+{
+	struct sc1330 *sc1330 = to_sc1330(sd);
+	const struct sc1330_mode *mode = sc1330->cur_mode;
+	u32 val = 0;
+
+	if (mode->hdr_mode == NO_HDR)
+		val = V4L2_MBUS_HSYNC_ACTIVE_HIGH |
+		      V4L2_MBUS_VSYNC_ACTIVE_LOW |
+		      V4L2_MBUS_PCLK_SAMPLE_RISING;
+
+	config->type = V4L2_MBUS_PARALLEL;
+	config->flags = val;
+
+	return 0;
+}
+
+static void sc1330_get_gain_reg(u32 val, u32 *again_reg, u32 *again_fine_reg)
+{
+	if (val < 0x40) {
+		val = 0x40;
+		*again_reg = 0x03;
+		*again_fine_reg = 0x40;
+	}
+	if (val < 0x80) {/* 1x ~ 2x gain */
+		*again_reg = 0x03;
+		*again_fine_reg = val;
+	} else if (val < 0x100) {/* 2x ~ 4x gain */
+		*again_reg = 0x07;
+		*again_fine_reg = val >> 1;
+	} else if (val < 0x158) {/* 4x ~ 5.375x gain */
+		*again_reg = 0x0f;
+		*again_fine_reg = val >> 2;
+	} else if (val < 0x2b0) {/* 5.375x ~ 10.791x gain */
+		*again_reg = 0x23;
+		*again_fine_reg = (val * 0x40) / 0x158;
+	} else if (val < 0x560) {/* 10.791x ~ 21.582x gain */
+		*again_reg = 0x27;
+		*again_fine_reg = ((val * 0x40) / 0x158) >> 1;
+	} else if (val < 0xac0) {/* 21.582x ~ 43.164x gain */
+		*again_reg = 0x2f;
+		*again_fine_reg = ((val * 0x40) / 0x158) >> 2;
+	} else if (val < 0x1580) {/* 43.164x ~ 86.328x gain */
+		*again_reg = 0x3f;
+		*again_fine_reg = ((val * 0x40) / 0x158) >> 3;
+	}
+}
+
+static long sc1330_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	struct sc1330 *sc1330 = to_sc1330(sd);
+	struct rkmodule_hdr_cfg *hdr_cfg;
+
+	long ret = 0;
+
+	u32 stream;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		sc1330_get_module_inf(sc1330, (struct rkmodule_inf *)arg);
+		break;
+	case RKMODULE_GET_HDR_CFG:
+		hdr_cfg = (struct rkmodule_hdr_cfg *)arg;
+		hdr_cfg->esp.mode = HDR_NORMAL_VC;
+		hdr_cfg->hdr_mode = sc1330->cur_mode->hdr_mode;
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		stream = *((u32 *)arg);
+		if (stream)
+			ret = sc1330_write_reg(sc1330->client,
+					       SC1330_REG_CTRL_MODE,
+					       SC1330_REG_VALUE_08BIT,
+					       SC1330_MODE_STREAMING);
+		else
+			ret = sc1330_write_reg(sc1330->client,
+					       SC1330_REG_CTRL_MODE,
+					       SC1330_REG_VALUE_08BIT,
+					       SC1330_MODE_SW_STANDBY);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+
+#ifdef CONFIG_COMPAT
+static long sc1330_compat_ioctl32(struct v4l2_subdev *sd,
+				  unsigned int cmd, unsigned long arg)
+{
+	void __user *up = compat_ptr(arg);
+	struct rkmodule_inf *inf;
+	struct rkmodule_hdr_cfg *hdr;
+	struct preisp_hdrae_exp_s *hdrae;
+	long ret = 0;
+	u32 cg = 0;
+	u32 stream = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		inf = kzalloc(sizeof(*inf), GFP_KERNEL);
+		if (!inf) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = sc1330_ioctl(sd, cmd, inf);
+		if (!ret) {
+			ret = copy_to_user(up, inf, sizeof(*inf));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(inf);
+		break;
+	case RKMODULE_GET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = sc1330_ioctl(sd, cmd, hdr);
+		if (!ret) {
+			ret = copy_to_user(up, hdr, sizeof(*hdr));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(hdr);
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		if (copy_from_user(hdr, up, sizeof(*hdr))) {
+			kfree(hdr);
+			return -EFAULT;
+		}
+
+		sc1330_ioctl(sd, cmd, hdr);
+		kfree(hdr);
+		break;
+	case PREISP_CMD_SET_HDRAE_EXP:
+		hdrae = kzalloc(sizeof(*hdrae), GFP_KERNEL);
+		if (!hdrae) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		if (copy_from_user(hdrae, up, sizeof(*hdrae))) {
+			kfree(hdrae);
+			return -EFAULT;
+		}
+
+		sc1330_ioctl(sd, cmd, hdrae);
+		kfree(hdrae);
+		break;
+	case RKMODULE_SET_CONVERSION_GAIN:
+		if (copy_from_user(&cg, up, sizeof(cg)))
+			return -EFAULT;
+
+		sc1330_ioctl(sd, cmd, &cg);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		if (copy_from_user(&stream, up, sizeof(u32)))
+			return -EFAULT;
+
+		sc1330_ioctl(sd, cmd, &stream);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+#endif
+
+static int __sc1330_start_stream(struct sc1330 *sc1330)
+{
+	int ret;
+
+	ret = sc1330_write_array(sc1330->client, sc1330->cur_mode->reg_list);
+	if (ret)
+		return ret;
+
+	ret = __v4l2_ctrl_handler_setup(&sc1330->ctrl_handler);
+	if (ret)
+		return ret;
+
+	/* In case these controls are set before streaming */
+	if (sc1330->has_init_exp && sc1330->cur_mode->hdr_mode != NO_HDR) {
+		ret = sc1330_ioctl(&sc1330->subdev, PREISP_CMD_SET_HDRAE_EXP,
+				   &sc1330->init_hdrae_exp);
+		if (ret) {
+			dev_err(&sc1330->client->dev,
+				"init exp fail in hdr mode\n");
+			return ret;
+		}
+	}
+
+	return sc1330_write_reg(sc1330->client,
+				SC1330_REG_CTRL_MODE,
+				SC1330_REG_VALUE_08BIT,
+				SC1330_MODE_STREAMING);
+}
+
+static int __sc1330_stop_stream(struct sc1330 *sc1330)
+{
+	sc1330->has_init_exp = false;
+	return sc1330_write_reg(sc1330->client,
+				SC1330_REG_CTRL_MODE,
+				SC1330_REG_VALUE_08BIT,
+				SC1330_MODE_SW_STANDBY);
+}
+
+static int sc1330_s_stream(struct v4l2_subdev *sd, int on)
+{
+	struct sc1330 *sc1330 = to_sc1330(sd);
+	struct i2c_client *client = sc1330->client;
+	int ret = 0;
+
+	mutex_lock(&sc1330->mutex);
+	on = !!on;
+	if (on == sc1330->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 = __sc1330_start_stream(sc1330);
+		if (ret) {
+			v4l2_err(sd, "start stream failed while write regs\n");
+			pm_runtime_put(&client->dev);
+			goto unlock_and_return;
+		}
+	} else {
+		__sc1330_stop_stream(sc1330);
+		pm_runtime_put(&client->dev);
+	}
+
+	sc1330->streaming = on;
+
+unlock_and_return:
+	mutex_unlock(&sc1330->mutex);
+
+	return ret;
+}
+
+static int sc1330_s_power(struct v4l2_subdev *sd, int on)
+{
+	struct sc1330 *sc1330 = to_sc1330(sd);
+	struct i2c_client *client = sc1330->client;
+	int ret = 0;
+
+	mutex_lock(&sc1330->mutex);
+
+	/* If the power state is not modified - no work to do. */
+	if (sc1330->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;
+		}
+
+		ret |= sc1330_write_reg(sc1330->client,
+					SC1330_SOFTWARE_RESET_REG,
+					SC1330_REG_VALUE_08BIT,
+					0x01);
+		usleep_range(100, 200);
+
+		sc1330->power_on = true;
+	} else {
+		pm_runtime_put(&client->dev);
+		sc1330->power_on = false;
+	}
+
+unlock_and_return:
+	mutex_unlock(&sc1330->mutex);
+
+	return ret;
+}
+
+static int __sc1330_power_on(struct sc1330 *sc1330)
+{
+	int ret;
+	struct device *dev = &sc1330->client->dev;
+
+	if (!IS_ERR_OR_NULL(sc1330->pins_default)) {
+		ret = pinctrl_select_state(sc1330->pinctrl,
+					   sc1330->pins_default);
+		if (ret < 0)
+			dev_err(dev, "could not set pins\n");
+	}
+	ret = clk_set_rate(sc1330->xvclk, SC1330_XVCLK_FREQ);
+	if (ret < 0)
+		dev_warn(dev, "Failed to set xvclk rate (24MHz)\n");
+	if (clk_get_rate(sc1330->xvclk) != SC1330_XVCLK_FREQ)
+		dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n");
+	ret = clk_prepare_enable(sc1330->xvclk);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable xvclk\n");
+		return ret;
+	}
+	if (!IS_ERR(sc1330->reset_gpio))
+		gpiod_set_value_cansleep(sc1330->reset_gpio, 1);
+
+	ret = regulator_bulk_enable(SC1330_NUM_SUPPLIES, sc1330->supplies);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable regulators\n");
+		goto disable_clk;
+	}
+
+	if (!IS_ERR(sc1330->pwdn_gpio))
+		gpiod_set_value_cansleep(sc1330->pwdn_gpio, 0);
+
+	usleep_range(500, 1000);
+	if (!IS_ERR(sc1330->reset_gpio))
+		gpiod_set_value_cansleep(sc1330->reset_gpio, 0);
+
+	usleep_range(500, 1000);
+	if (!IS_ERR(sc1330->pwdn_gpio))
+		gpiod_set_value_cansleep(sc1330->pwdn_gpio, 0);
+	usleep_range(4000, 8000);
+
+	return 0;
+
+disable_clk:
+	clk_disable_unprepare(sc1330->xvclk);
+
+	return ret;
+}
+
+static void __sc1330_power_off(struct sc1330 *sc1330)
+{
+	int ret;
+	struct device *dev = &sc1330->client->dev;
+
+	if (!IS_ERR(sc1330->pwdn_gpio))
+		gpiod_set_value_cansleep(sc1330->pwdn_gpio, 1);
+	clk_disable_unprepare(sc1330->xvclk);
+	if (!IS_ERR(sc1330->reset_gpio))
+		gpiod_set_value_cansleep(sc1330->reset_gpio, 1);
+	if (!IS_ERR_OR_NULL(sc1330->pins_sleep)) {
+		ret = pinctrl_select_state(sc1330->pinctrl,
+					   sc1330->pins_sleep);
+		if (ret < 0)
+			dev_dbg(dev, "could not set pins\n");
+	}
+	regulator_bulk_disable(SC1330_NUM_SUPPLIES, sc1330->supplies);
+}
+
+static int sc1330_runtime_resume(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct sc1330 *sc1330 = to_sc1330(sd);
+
+	return __sc1330_power_on(sc1330);
+}
+
+static int sc1330_runtime_suspend(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct sc1330 *sc1330 = to_sc1330(sd);
+
+	__sc1330_power_off(sc1330);
+
+	return 0;
+}
+
+static const struct dev_pm_ops sc1330_pm_ops = {
+	SET_RUNTIME_PM_OPS(sc1330_runtime_suspend,
+			   sc1330_runtime_resume, NULL)
+};
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static int sc1330_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
+{
+	struct sc1330 *sc1330 = to_sc1330(sd);
+	struct v4l2_mbus_framefmt *try_fmt =
+				v4l2_subdev_get_try_format(sd, fh->pad, 0);
+	const struct sc1330_mode *def_mode = &supported_modes[0];
+
+	mutex_lock(&sc1330->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->field = V4L2_FIELD_NONE;
+
+	mutex_unlock(&sc1330->mutex);
+	/* No crop or compose */
+
+	return 0;
+}
+#endif
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static const struct v4l2_subdev_internal_ops sc1330_internal_ops = {
+	.open = sc1330_open,
+};
+#endif
+
+static const struct v4l2_subdev_core_ops sc1330_core_ops = {
+	.s_power = sc1330_s_power,
+	.ioctl = sc1330_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = sc1330_compat_ioctl32,
+#endif
+};
+
+static const struct v4l2_subdev_video_ops sc1330_video_ops = {
+	.s_stream = sc1330_s_stream,
+	.g_frame_interval = sc1330_g_frame_interval,
+	.g_mbus_config = sc1330_g_mbus_config,
+};
+
+static const struct v4l2_subdev_pad_ops sc1330_pad_ops = {
+	.enum_mbus_code = sc1330_enum_mbus_code,
+	.enum_frame_size = sc1330_enum_frame_sizes,
+	.enum_frame_interval = sc1330_enum_frame_interval,
+	.get_fmt = sc1330_get_fmt,
+	.set_fmt = sc1330_set_fmt,
+};
+
+static const struct v4l2_subdev_ops sc1330_subdev_ops = {
+	.core	= &sc1330_core_ops,   /* v4l2_subdev_core_ops sc1330_core_ops */
+	.video	= &sc1330_video_ops,  /* */
+	.pad	= &sc1330_pad_ops,    /* */
+};
+
+static int sc1330_set_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct sc1330 *sc1330 = container_of(ctrl->handler,
+					     struct sc1330, ctrl_handler);
+	struct i2c_client *client = sc1330->client;
+	s64 max;
+	u32 again = 0, again_fine = 0x80;
+	int ret = 0;
+	u32 val;
+
+	/* Propagate change of current control to all related controls */
+	switch (ctrl->id) {
+	case V4L2_CID_VBLANK:
+		/* Update max exposure while meeting expected vblanking */
+		max = sc1330->cur_mode->height + ctrl->val - 3;
+		__v4l2_ctrl_modify_range(sc1330->exposure,
+					 sc1330->exposure->minimum, max,
+					 sc1330->exposure->step,
+					 sc1330->exposure->default_value);
+		break;
+	}
+
+	if (!pm_runtime_get_if_in_use(&client->dev)) {
+		dev_err(&client->dev, "pm_runtime_get_if_in_use return\n");
+		return 0;
+	}
+
+	switch (ctrl->id) {
+	case V4L2_CID_EXPOSURE:
+		if (sc1330->cur_mode->hdr_mode != NO_HDR)
+			return ret;
+		val = ctrl->val << 1;
+		ret = sc1330_write_reg(sc1330->client,
+				       SC1330_REG_EXP_LONG_L,
+				       SC1330_REG_VALUE_08BIT,
+				       (val << 4 & 0XF0));
+		ret |= sc1330_write_reg(sc1330->client,
+					SC1330_REG_EXP_LONG_M,
+					SC1330_REG_VALUE_08BIT,
+					(val >> 4 & 0XFF));
+		ret |= sc1330_write_reg(sc1330->client,
+					SC1330_REG_EXP_LONG_H,
+					SC1330_REG_VALUE_08BIT,
+					(val >> 12 & 0X0F));
+		dev_dbg(&client->dev, "set exposure 0x%x\n", val);
+		break;
+
+	case V4L2_CID_ANALOGUE_GAIN:
+		if (sc1330->cur_mode->hdr_mode != NO_HDR)
+			return ret;
+		sc1330_get_gain_reg(ctrl->val, &again, &again_fine);
+		dev_dbg(&client->dev,
+			"recv:%d set again 0x%x, again_fine 0x%x\n",
+			ctrl->val, again, again_fine);
+
+		ret |= sc1330_write_reg(sc1330->client,
+					SC1330_REG_AGAIN,
+					SC1330_REG_VALUE_08BIT,
+					again);
+		ret |= sc1330_write_reg(sc1330->client,
+					SC1330_REG_AGAIN_FINE,
+					SC1330_REG_VALUE_08BIT,
+					again_fine);
+		ret |= sc1330_write_reg(sc1330->client,
+					SC1330_REG_DGAIN,
+					SC1330_REG_VALUE_08BIT,
+					0x00);
+		ret |= sc1330_write_reg(sc1330->client,
+					SC1330_REG_DGAIN_FINE,
+					SC1330_REG_VALUE_08BIT,
+					0x80);
+		break;
+	case V4L2_CID_VBLANK:
+		ret = sc1330_write_reg(sc1330->client, SC1330_REG_VTS,
+				       SC1330_REG_VALUE_16BIT,
+				       ctrl->val + sc1330->cur_mode->height);
+		dev_dbg(&client->dev, "set vblank 0x%x\n",
+			ctrl->val);
+		break;
+	case V4L2_CID_TEST_PATTERN:
+		ret = sc1330_enable_test_pattern(sc1330, ctrl->val);
+		break;
+	case V4L2_CID_HFLIP:
+		ret = sc1330_read_reg(sc1330->client, SC1330_FLIP_REG,
+				      SC1330_REG_VALUE_08BIT, &val);
+		if (ret)
+			break;
+		if (ctrl->val)
+			val |= SC1330_MIRROR_MASK;
+		else
+			val &= ~SC1330_MIRROR_MASK;
+		ret |= sc1330_write_reg(sc1330->client, SC1330_FLIP_REG,
+					SC1330_REG_VALUE_08BIT, val);
+		break;
+	case V4L2_CID_VFLIP:
+		ret = sc1330_read_reg(sc1330->client, SC1330_FLIP_REG,
+				      SC1330_REG_VALUE_08BIT, &val);
+		if (ret)
+			break;
+		if (ctrl->val)
+			val |= SC1330_FLIP_MASK;
+		else
+			val &= ~SC1330_FLIP_MASK;
+		ret |= sc1330_write_reg(sc1330->client, SC1330_FLIP_REG,
+					SC1330_REG_VALUE_08BIT, 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 sc1330_ctrl_ops = {
+	.s_ctrl = sc1330_set_ctrl,
+};
+
+static int sc1330_check_sensor_id(struct sc1330 *sc1330,
+				  struct i2c_client *client)
+{
+	struct device *dev = &sc1330->client->dev;
+	u32 id = 0;
+	int ret;
+
+
+	ret = sc1330_read_reg(client, SC1330_REG_CHIP_ID,
+			      SC1330_REG_VALUE_16BIT, &id);
+	if (id != SC1330_CHIP_ID) {
+		dev_err(dev, "Unexpected sensor id(%04x), ret(%d)\n", id, ret);
+		return -ENODEV;
+	}
+
+	dev_info(dev, "Detected SC%04x sensor\n", SC1330_CHIP_ID);
+
+	return 0;
+}
+
+static int sc1330_initialize_controls(struct sc1330 *sc1330)
+{
+	const struct sc1330_mode *mode;
+	struct v4l2_ctrl_handler *handler;
+	s64 exposure_max, vblank_def;
+	u32 h_blank;
+	int ret;
+	u64 pixel_rate = 0;
+
+	handler = &sc1330->ctrl_handler;
+	mode = sc1330->cur_mode;
+	ret = v4l2_ctrl_handler_init(handler, 9);
+	if (ret)
+		return ret;
+	handler->lock = &sc1330->mutex;
+
+	sc1330->link_freq = v4l2_ctrl_new_int_menu(handler, NULL,
+					V4L2_CID_LINK_FREQ,
+					ARRAY_SIZE(link_freq_items) - 1, 0,
+					link_freq_items);
+	__v4l2_ctrl_s_ctrl(sc1330->link_freq, mode->dvp_freq_idx);
+
+	/* pixel rate = link frequency * bits / BITS_PER_SAMPLE */
+	pixel_rate = (u32)link_freq_items[mode->dvp_freq_idx] / mode->bpp *
+		     SC1330_DVP_BITS;
+	sc1330->pixel_rate = v4l2_ctrl_new_std(handler, NULL,
+					       V4L2_CID_PIXEL_RATE, 0,
+					       SC1330_MAX_PIXEL_RATE,
+					       1, pixel_rate);
+
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(&sc1330->client->dev,
+			"Failed to V4L2_CID_PIXEL_RATE controls(%d)\n", ret);
+	}
+
+	h_blank = mode->hts_def - mode->width;
+	sc1330->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
+					   h_blank, h_blank, 1, h_blank);
+	if (sc1330->hblank)
+		sc1330->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(&sc1330->client->dev,
+			"Failed to V4L2_CID_HBLANK controls(%d)\n", ret);
+	}
+
+	vblank_def = mode->vts_def - mode->height;
+	sc1330->vblank = v4l2_ctrl_new_std(handler, &sc1330_ctrl_ops,
+					   V4L2_CID_VBLANK, vblank_def,
+					   SC1330_VTS_MAX - mode->height,
+					   1, vblank_def);
+
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(&sc1330->client->dev,
+			"Failed to V4L2_CID_VBLANK controls(%d)\n", ret);
+	}
+
+	exposure_max = mode->vts_def - 3;
+	sc1330->exposure = v4l2_ctrl_new_std(handler, &sc1330_ctrl_ops,
+					     V4L2_CID_EXPOSURE,
+					     SC1330_EXPOSURE_MIN,
+					     exposure_max,
+					     SC1330_EXPOSURE_STEP,
+					     mode->exp_def);
+
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(&sc1330->client->dev,
+			"Failed to V4L2_CID_EXPOSURE controls(%d)\n", ret);
+	}
+
+	sc1330->anal_gain = v4l2_ctrl_new_std(handler, &sc1330_ctrl_ops,
+					      V4L2_CID_ANALOGUE_GAIN,
+					      SC1330_GAIN_MIN,
+					      SC1330_GAIN_MAX,
+					      SC1330_GAIN_STEP,
+					      SC1330_GAIN_DEFAULT);
+
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(&sc1330->client->dev,
+			"Failed to V4L2_CID_ANALOGUE_GAIN controls(%d)\n", ret);
+	}
+
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(&sc1330->client->dev,
+			"Failed to V4L2_CID_TEST_PATTERN controls(%d)\n", ret);
+	}
+
+	v4l2_ctrl_new_std(handler,
+			  &sc1330_ctrl_ops,
+			  V4L2_CID_HFLIP, 0, 1, 1, 0);
+	v4l2_ctrl_new_std(handler,
+			  &sc1330_ctrl_ops,
+			  V4L2_CID_VFLIP, 0, 1, 1, 0);
+
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(&sc1330->client->dev,
+			"Failed to init controls(%d)\n", ret);
+		goto err_free_handler;
+	}
+
+	sc1330->subdev.ctrl_handler = handler;
+	sc1330->has_init_exp = false;
+
+	return 0;
+
+err_free_handler:
+	v4l2_ctrl_handler_free(handler);
+
+	return ret;
+}
+
+static int sc1330_configure_regulators(struct sc1330 *sc1330)
+{
+	unsigned int i;
+
+	for (i = 0; i < SC1330_NUM_SUPPLIES; i++)
+		sc1330->supplies[i].supply = sc1330_supply_names[i];
+
+	return devm_regulator_bulk_get(&sc1330->client->dev,
+				       SC1330_NUM_SUPPLIES,
+				       sc1330->supplies);
+}
+
+static int sc1330_probe(struct i2c_client *client,
+			const struct i2c_device_id *id)
+{
+	struct device *dev = &client->dev;
+	struct device_node *node = dev->of_node;
+	struct sc1330 *sc1330;
+	struct v4l2_subdev *sd;
+	char facing[2];
+	int ret;
+	u32 hdr_mode = 0;
+
+	dev_info(dev, " driver version: %02x.%02x.%02x",
+		 DRIVER_VERSION >> 16,
+		 (DRIVER_VERSION & 0xff00) >> 8,
+		 DRIVER_VERSION & 0x00ff);
+
+	sc1330 = devm_kzalloc(dev, sizeof(*sc1330), GFP_KERNEL);
+	if (!sc1330)
+		return -ENOMEM;
+
+	ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
+				   &sc1330->module_index);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
+				       &sc1330->module_facing);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME,
+				       &sc1330->module_name);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME,
+				       &sc1330->len_name);
+	if (ret) {
+		dev_err(dev, "could not get module information!\n");
+		return -EINVAL;
+	}
+
+	ret = of_property_read_u32(node, OF_CAMERA_HDR_MODE,
+			&hdr_mode);
+
+	if (ret) {
+		hdr_mode = NO_HDR;
+		dev_warn(dev, " Get hdr mode failed! no hdr default\n");
+	}
+
+	sc1330->cur_mode = &supported_modes[0];
+	sc1330->client = client;
+
+	sc1330->xvclk = devm_clk_get(dev, "xvclk");
+	if (IS_ERR(sc1330->xvclk)) {
+		dev_err(dev, "Failed to get xvclk\n");
+		return -EINVAL;
+	}
+
+	sc1330->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+	if (IS_ERR(sc1330->reset_gpio))
+		dev_warn(dev, "Failed to get reset-gpios\n");
+
+	sc1330->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW);
+	if (IS_ERR(sc1330->pwdn_gpio))
+		dev_warn(dev, "Failed to get pwdn-gpios\n");
+
+	sc1330->pinctrl = devm_pinctrl_get(dev);
+	if (!IS_ERR(sc1330->pinctrl)) {
+		sc1330->pins_default =
+			pinctrl_lookup_state(sc1330->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_DEFAULT);
+		if (IS_ERR(sc1330->pins_default))
+			dev_err(dev, "could not get default pinstate\n");
+
+		sc1330->pins_sleep =
+			pinctrl_lookup_state(sc1330->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_SLEEP);
+		if (IS_ERR(sc1330->pins_sleep))
+			dev_err(dev, "could not get sleep pinstate\n");
+	} else {
+		dev_err(dev, "no pinctrl\n");
+	}
+
+	ret = sc1330_configure_regulators(sc1330);
+	if (ret) {
+		dev_err(dev, "Failed to get power regulators\n");
+		return ret;
+	}
+
+	mutex_init(&sc1330->mutex);
+
+	sd = &sc1330->subdev;
+	v4l2_i2c_subdev_init(sd, client, &sc1330_subdev_ops);
+	ret = sc1330_initialize_controls(sc1330);
+	if (ret)
+		goto err_destroy_mutex;
+
+	ret = __sc1330_power_on(sc1330);
+	if (ret)
+		goto err_free_handler;
+
+	ret = sc1330_check_sensor_id(sc1330, client);
+	if (ret)
+		goto err_power_off;
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+	sd->internal_ops = &sc1330_internal_ops;
+	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
+#endif
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	sc1330->pad.flags = MEDIA_PAD_FL_SOURCE;
+	sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
+	ret = media_entity_pads_init(&sd->entity, 1, &sc1330->pad);
+	if (ret < 0)
+		goto err_power_off;
+#endif
+
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(sc1330->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s",
+		 sc1330->module_index, facing,
+		 SC1330_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);
+#ifdef USED_SYS_DEBUG
+	add_sysfs_interfaces(dev);
+#endif
+	return 0;
+
+err_clean_entity:
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	media_entity_cleanup(&sd->entity);
+#endif
+err_power_off:
+	__sc1330_power_off(sc1330);
+err_free_handler:
+	v4l2_ctrl_handler_free(&sc1330->ctrl_handler);
+err_destroy_mutex:
+	mutex_destroy(&sc1330->mutex);
+
+	return ret;
+}
+
+static int sc1330_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct sc1330 *sc1330 = to_sc1330(sd);
+
+	v4l2_async_unregister_subdev(sd);
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	media_entity_cleanup(&sd->entity);
+#endif
+	v4l2_ctrl_handler_free(&sc1330->ctrl_handler);
+	mutex_destroy(&sc1330->mutex);
+
+	pm_runtime_disable(&client->dev);
+	if (!pm_runtime_status_suspended(&client->dev))
+		__sc1330_power_off(sc1330);
+	pm_runtime_set_suspended(&client->dev);
+
+	return 0;
+}
+
+#if IS_ENABLED(CONFIG_OF)
+static const struct of_device_id sc1330_of_match[] = {
+	{ .compatible = "smartsens,sc1330" },
+	{ },
+};
+MODULE_DEVICE_TABLE(of, sc1330_of_match);
+#endif
+
+static const struct i2c_device_id sc1330_match_id[] = {
+	{ "smartsens,sc1330", 0 },
+	{ },
+};
+
+static struct i2c_driver sc1330_i2c_driver = {
+	.driver = {
+		.name = SC1330_NAME,
+		.pm = &sc1330_pm_ops,
+		.of_match_table = of_match_ptr(sc1330_of_match),
+	},
+	.probe		= &sc1330_probe,
+	.remove		= &sc1330_remove,
+	.id_table	= sc1330_match_id,
+};
+
+static int __init sensor_mod_init(void)
+{
+	return i2c_add_driver(&sc1330_i2c_driver);
+}
+
+static void __exit sensor_mod_exit(void)
+{
+	i2c_del_driver(&sc1330_i2c_driver);
+}
+
+device_initcall_sync(sensor_mod_init);
+module_exit(sensor_mod_exit);
+
+MODULE_DESCRIPTION("Smartsens sc1330 sensor driver");
+MODULE_LICENSE("GPL v2");

commit 41bb7b4852251e01a6e7f53f92c18e72096b00aa
Author: Su Yuefu <yuefu.su@rock-chips.com>
Date:   Thu Oct 28 22:05:38 2021 +0800

    media: i2c: add gc1054 sensor driver
    
    Signed-off-by: Su Yuefu <yuefu.su@rock-chips.com>
    Change-Id: I78599fac1db0b057a50f61c7edfcdfb2dc440db6

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index 81a26cb71eb9..a412ac7c495b 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -1541,6 +1541,17 @@ config VIDEO_GC0403
 	  To compile this driver as a module, choose M here: the
 	  module will be called gc0403.
 
+config VIDEO_GC1054
+	tristate "GalaxyCore GC1054 sensor support"
+	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
+	depends on MEDIA_CAMERA_SUPPORT
+	select V4L2_FWNODE
+	help
+	  Support for the GalaxyCore GC1054 sensor.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called gc1054.
+
 config VIDEO_GC2035
 	tristate "GalaxyCore GC2035 sensor support"
 	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index 9b7854135a2c..642bc7233b46 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -170,6 +170,7 @@ obj-$(CONFIG_VIDEO_GC0312)	+= gc0312.o
 obj-$(CONFIG_VIDEO_GC0329)	+= gc0329.o
 obj-$(CONFIG_VIDEO_GC032A)	+= gc032a.o
 obj-$(CONFIG_VIDEO_GC0403)	+= gc0403.o
+obj-$(CONFIG_VIDEO_GC1054)	+= gc1054.o
 obj-$(CONFIG_VIDEO_GC2035)	+= gc2035.o
 obj-$(CONFIG_VIDEO_GC2053)	+= gc2053.o
 obj-$(CONFIG_VIDEO_GC2093)	+= gc2093.o
diff --git a/drivers/media/i2c/gc1054.c b/drivers/media/i2c/gc1054.c
new file mode 100644
index 000000000000..433b8851c65e
--- /dev/null
+++ b/drivers/media/i2c/gc1054.c
@@ -0,0 +1,1350 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * gc1054 sensor driver
+ *
+ * Copyright (C) 2021 Rockchip Electronics Co., Ltd.
+ *
+ * V0.0X01.0X00 first version.
+ * V0.0X01.0X01 add quick stream on/off
+ */
+
+#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/slab.h>
+#include <linux/sysfs.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 <linux/rk-preisp.h>
+
+#define DRIVER_VERSION          KERNEL_VERSION(0, 0x01, 0x02)
+
+#ifndef V4L2_CID_DIGITAL_GAIN
+#define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
+#endif
+
+#define GC1054_NAME             "gc1054"
+#define GC1054_MEDIA_BUS_FMT    MEDIA_BUS_FMT_SRGGB10_1X10
+
+#define MIPI_FREQ_297M          297000000
+#define GC1054_XVCLK_FREQ       27000000
+
+#define GC1054_PIXEL_RATE			(47250000)
+#define GC1054_XVCLK_FREQ			27000000
+
+#define GC1054_PAGE_SELECT      0xFE
+
+#define GC1054_REG_CHIP_ID_H    0xF0
+#define GC1054_REG_CHIP_ID_L    0xF1
+
+#define GC1054_REG_EXP_H        0x03
+#define GC1054_REG_EXP_L        0x04
+
+#define GC1054_REG_VTS_H        0x41
+#define GC1054_REG_VTS_L        0x42
+
+#define GC1054_REG_CTRL_MODE    0x3E
+#define GC1054_MODE_SW_STANDBY  0x11
+#define GC1054_MODE_STREAMING   0x91
+
+#define REG_NULL                0xFF
+
+#define GC1054_CHIP_ID          0x1054
+
+#define GC1054_VTS_MAX          0x3FFF
+#define GC1054_HTS_MAX          0xFFF
+
+#define GC1054_EXPOSURE_MAX     0x3FFF
+#define GC1054_EXPOSURE_MIN     1
+#define GC1054_EXPOSURE_STEP    1
+
+#define GC1054_GAIN_MIN         0x40
+#define GC1054_GAIN_MAX         0x2000
+#define GC1054_GAIN_STEP        1
+#define GC1054_GAIN_DEFAULT     64
+
+#define GC1054_LANES            2
+
+#define GC1054_REG_VALUE_08BIT		1
+#define GC1054_REG_VALUE_16BIT		2
+#define GC1054_REG_VALUE_24BIT		3
+
+#define SENSOR_ID(_msb, _lsb)   ((_msb) << 8 | (_lsb))
+
+#define GC1054_FLIP_MIRROR_REG  0x17
+
+#define GC_MIRROR_BIT_MASK      BIT(0)
+#define GC_FLIP_BIT_MASK        BIT(1)
+
+#define PIX_FORMAT MEDIA_BUS_FMT_SRGGB10_1X10
+
+#define GC1054_NAME			"gc1054"
+
+static const char * const gc1054_supply_names[] = {
+	"vcc2v8_dvp",		/* Analog power */
+	"vcc1v8_dvp",		/* Digital I/O power */
+	"vdd1v5_dvp",		/* Digital core power */
+};
+
+#define GC1054_NUM_SUPPLIES ARRAY_SIZE(gc1054_supply_names)
+
+#define to_gc1054(sd) container_of(sd, struct gc1054, subdev)
+
+enum gc1054_max_pad {
+	PAD0,
+	PAD_MAX,
+};
+
+struct regval {
+	u8 addr;
+	u8 val;
+};
+
+struct gc1054_mode {
+	u32 width;
+	u32 height;
+	struct v4l2_fract max_fps;
+	u32 hts_def;
+	u32 vts_def;
+	u32 exp_def;
+	u32 hdr_mode;
+	const struct regval *reg_list;
+};
+
+struct gc1054 {
+	struct i2c_client   *client;
+	struct clk      *xvclk;
+	struct gpio_desc    *reset_gpio;
+	struct gpio_desc    *pwdn_gpio;
+
+	struct regulator_bulk_data supplies[GC1054_NUM_SUPPLIES];
+
+	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	*test_pattern;
+
+	struct mutex        mutex;
+	bool            streaming;
+	bool			power_on;
+	const struct gc1054_mode *cur_mode;
+
+	u32         module_index;
+	const char      *module_facing;
+	const char      *module_name;
+	const char      *len_name;
+
+};
+
+#define to_gc1054(sd) container_of(sd, struct gc1054, subdev)
+
+/*
+ * window_size=1920*1080 mipi@2lane
+ * mclk=24mhz,mipi_clk=594Mbps
+ * pixel_line_total=2200,line_frame_total=1125
+ * row_time=29.629us,frame_rate=30fps
+ */
+static const struct regval gc1054_1280x720_regs_dvp[] = {
+    //window_size=1920*1080
+//mclk=27mhz,pclk=47.25mhz
+//pixel_line_total=2200,line_frame_total=1125
+//row_time=29.629us,frame_rate=30fps
+/****system****/
+	{0xf2, 0x00},
+	{0xf6, 0x00},
+	{0xfc, 0x04},
+	{0xf7, 0x01},
+	{0xf8, 0x0d},
+	{0xf9, 0x00},
+	{0xfa, 0x80},
+	{0xfc, 0x0e},
+	{0xfe, 0x00},
+	{0x03, 0x02},
+	{0x04, 0xa6},
+	{0x05, 0x03},
+	{0x06, 0x94},
+	{0x07, 0x00},
+	{0x08, 0x0a},
+	{0x09, 0x00},
+	{0x0a, 0x04},
+	{0x0b, 0x00},
+	{0x0c, 0x00},
+	{0x0d, 0x02},
+	{0x0e, 0xd4},
+	{0x0f, 0x05},
+	{0x10, 0x08},
+	{0x17, 0xc0},
+	{0x18, 0x02},
+	{0x19, 0x08},
+	{0x1a, 0x18},
+	{0x1d, 0x12},
+	{0x1e, 0x50},
+	{0x1f, 0x80},
+	{0x21, 0x30},
+	{0x23, 0xf8},
+	{0x25, 0x10},
+	{0x28, 0x20},
+	{0x34, 0x0a},
+	{0x3c, 0x10},
+	{0x3d, 0x0e},
+	{0xcc, 0x8e},
+	{0xcd, 0x9a},
+	{0xcf, 0x70},
+	{0xd0, 0xa9},
+	{0xd1, 0xc5},
+	{0xd2, 0xed},
+	{0xd8, 0x3c},
+	{0xd9, 0x7a},
+	{0xda, 0x12},
+	{0xdb, 0x50},
+	{0xde, 0x0c},
+	{0xe3, 0x60},
+	{0xe4, 0x78},
+	{0xfe, 0x01},
+	{0xe3, 0x01},
+	{0xe6, 0x10},
+	{0xfe, 0x01},
+	{0x80, 0x50},
+	{0x88, 0x23},
+	{0x89, 0x03},
+	{0x90, 0x01},
+	{0x92, 0x02},
+	{0x94, 0x03},
+	{0x95, 0x02},
+	{0x96, 0xd0},
+	{0x97, 0x05},
+	{0x98, 0x00},
+	{0xfe, 0x01},
+	{0x40, 0x22},
+	{0x43, 0x03},
+	{0x4e, 0x3c},
+	{0x4f, 0x00},
+	{0x60, 0x00},
+	{0x61, 0x80},
+	{0xfe, 0x01},
+	{0xb0, 0x48},
+	{0xb1, 0x01},
+	{0xb2, 0x00},
+	{0xb6, 0x00},
+	{0xfe, 0x02},
+	{0x01, 0x00},
+	{0x02, 0x01},
+	{0x03, 0x02},
+	{0x04, 0x03},
+	{0x05, 0x04},
+	{0x06, 0x05},
+	{0x07, 0x06},
+	{0x08, 0x0e},
+	{0x09, 0x16},
+	{0x0a, 0x1e},
+	{0x0b, 0x36},
+	{0x0c, 0x3e},
+	{0x0d, 0x56},
+	{0xfe, 0x02},
+	{0xb0, 0x00},
+	{0xb1, 0x00},
+	{0xb2, 0x00},
+	{0xb3, 0x11},
+	{0xb4, 0x22},
+	{0xb5, 0x54},
+	{0xb6, 0xb8},
+	{0xb7, 0x60},
+	{0xb9, 0x00},
+	{0xba, 0xc0},
+	{0xc0, 0x20},
+	{0xc1, 0x2d},
+	{0xc2, 0x40},
+	{0xc3, 0x5b},
+	{0xc4, 0x80},
+	{0xc5, 0xb5},
+	{0xc6, 0x00},
+	{0xc7, 0x6a},
+	{0xc8, 0x00},
+	{0xc9, 0xd4},
+	{0xca, 0x00},
+	{0xcb, 0xa8},
+	{0xcc, 0x00},
+	{0xcd, 0x50},
+	{0xce, 0x00},
+	{0xcf, 0xa1},
+	{0xfe, 0x02},
+	{0x54, 0xf7},
+	{0x55, 0xf0},
+	{0x56, 0x00},
+	{0x57, 0x00},
+	{0x58, 0x00},
+	{0x5a, 0x04},
+	{0xfe, 0x04},
+	{0x81, 0x8a},
+	{0xfe, 0x03},
+	{0x01, 0x00},
+	{0x02, 0x00},
+	{0x03, 0x00},
+	{0x10, 0x11},
+	{0x15, 0x00},
+	{0x40, 0x01},
+	{0x41, 0x00},
+	{0xfe, 0x00},
+	{0xf2, 0x0f},
+	{REG_NULL, 0x00},
+};
+
+static const struct gc1054_mode supported_modes[] = {
+	{
+		.width = 1280,
+		.height = 720,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 250000,
+		},
+		.exp_def = 0x2D0,
+		.hts_def = 0x834,
+		.vts_def = 0x2ee,
+		.reg_list = gc1054_1280x720_regs_dvp,
+		.hdr_mode = NO_HDR,
+	},
+};
+
+/* sensor register write */
+static int gc1054_write_reg(struct i2c_client *client, u8 reg, u8 val)
+{
+	struct i2c_msg msg;
+	u8 buf[2];
+	int ret;
+
+	buf[0] = reg & 0xFF;
+	buf[1] = val;
+
+	msg.addr = client->addr;
+	msg.flags = client->flags;
+	msg.buf = buf;
+	msg.len = sizeof(buf);
+
+	ret = i2c_transfer(client->adapter, &msg, 1);
+	if (ret >= 0)
+		return 0;
+
+	dev_err(&client->dev,
+		"gc1054 write reg(0x%x val:0x%x) failed !\n", reg, val);
+
+	return ret;
+}
+
+static int gc1054_write_array(struct i2c_client *client,
+			      const struct regval *regs)
+{
+	int i, ret = 0;
+
+	i = 0;
+	while (regs[i].addr != REG_NULL) {
+		ret = gc1054_write_reg(client, regs[i].addr, regs[i].val);
+		if (ret) {
+			dev_err(&client->dev, "%s failed !\n", __func__);
+			break;
+		}
+		i++;
+	}
+
+	return ret;
+}
+
+/* sensor register read */
+static int gc1054_read_reg(struct i2c_client *client, u8 reg, u8 *val)
+{
+	struct i2c_msg msg[2];
+	u8 buf[1];
+	int ret;
+
+	buf[0] = reg & 0xFF;
+
+	msg[0].addr = client->addr;
+	msg[0].flags = client->flags;
+	msg[0].buf = buf;
+	msg[0].len = sizeof(buf);
+
+	msg[1].addr = client->addr;
+	msg[1].flags = client->flags | I2C_M_RD;
+	msg[1].buf = buf;
+	msg[1].len = 1;
+
+	ret = i2c_transfer(client->adapter, msg, 2);
+	if (ret >= 0) {
+		*val = buf[0];
+		return 0;
+	}
+
+	dev_err(&client->dev,
+		"gc1054 read reg(0x%x val:0x%x) failed !\n", reg, *val);
+
+	return ret;
+}
+
+static int gc1054_get_reso_dist(const struct gc1054_mode *mode,
+				struct v4l2_mbus_framefmt *framefmt)
+{
+	return abs(mode->width - framefmt->width) +
+	       abs(mode->height - framefmt->height);
+}
+
+static const struct gc1054_mode *
+gc1054_find_best_fit(struct gc1054 *gc1054, 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 < ARRAY_SIZE(supported_modes); i++) {
+		dist = gc1054_get_reso_dist(&supported_modes[i], framefmt);
+		if (cur_best_fit_dist == -1 || dist <= cur_best_fit_dist) {
+			cur_best_fit_dist = dist;
+			cur_best_fit = i;
+		}
+	}
+
+	return &supported_modes[cur_best_fit];
+}
+
+static int gc1054_set_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct gc1054 *gc1054 = to_gc1054(sd);
+	const struct gc1054_mode *mode;
+	s64 h_blank, vblank_def;
+
+	mutex_lock(&gc1054->mutex);
+
+	mode = gc1054_find_best_fit(gc1054, fmt);
+	fmt->format.code = PIX_FORMAT;
+	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(&gc1054->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		gc1054->cur_mode = mode;
+		h_blank = mode->hts_def - mode->width;
+		__v4l2_ctrl_modify_range(gc1054->hblank, h_blank,
+					 h_blank, 1, h_blank);
+		vblank_def = mode->vts_def - mode->height;
+		__v4l2_ctrl_modify_range(gc1054->vblank, vblank_def,
+					 GC1054_VTS_MAX - mode->height,
+					 1, vblank_def);
+	}
+
+	mutex_unlock(&gc1054->mutex);
+	return 0;
+}
+
+static int gc1054_get_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct gc1054 *gc1054 = to_gc1054(sd);
+	const struct gc1054_mode *mode = gc1054->cur_mode;
+
+	mutex_lock(&gc1054->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(&gc1054->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		fmt->format.width = mode->width;
+		fmt->format.height = mode->height;
+		fmt->format.code = PIX_FORMAT;
+		fmt->format.field = V4L2_FIELD_NONE;
+	}
+	mutex_unlock(&gc1054->mutex);
+	return 0;
+}
+
+#define CROP_START(SRC, DST) (((SRC) - (DST)) / 2 / 4 * 4)
+#define DST_WIDTH 1280
+#define DST_HEIGHT 720
+
+static int gc1054_get_selection(struct v4l2_subdev *sd,
+				struct v4l2_subdev_pad_config *cfg,
+				struct v4l2_subdev_selection *sel)
+{
+	struct gc1054 *gc1054 = to_gc1054(sd);
+
+	if (sel->target == V4L2_SEL_TGT_CROP_BOUNDS) {
+		sel->r.left = CROP_START(gc1054->cur_mode->width, DST_WIDTH);
+		sel->r.width = DST_WIDTH;
+		sel->r.top = CROP_START(gc1054->cur_mode->height, DST_HEIGHT);
+		sel->r.height = DST_HEIGHT;
+		return 0;
+	}
+	return -EINVAL;
+}
+
+static int gc1054_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 = PIX_FORMAT;
+
+	return 0;
+}
+static int gc1054_enum_frame_sizes(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_pad_config *cfg,
+				   struct v4l2_subdev_frame_size_enum *fse)
+{
+	if (fse->index >= ARRAY_SIZE(supported_modes))
+		return -EINVAL;
+
+	if (fse->code != PIX_FORMAT)
+		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;
+	return 0;
+}
+
+
+static void gc1054_get_module_inf(struct gc1054 *gc1054,
+				  struct rkmodule_inf *inf)
+{
+	memset(inf, 0, sizeof(*inf));
+	strscpy(inf->base.sensor, GC1054_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, gc1054->module_name,
+		sizeof(inf->base.module));
+	strscpy(inf->base.lens, gc1054->len_name, sizeof(inf->base.lens));
+}
+
+static long gc1054_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	struct gc1054 *gc1054 = to_gc1054(sd);
+	struct rkmodule_hdr_cfg *hdr_cfg;
+	long ret = 0;
+	u32 stream = 0;
+
+	switch (cmd) {
+	case PREISP_CMD_SET_HDRAE_EXP:
+		return -1;
+	case RKMODULE_GET_HDR_CFG:
+		hdr_cfg = (struct rkmodule_hdr_cfg *)arg;
+		hdr_cfg->esp.mode = HDR_NORMAL_VC;
+		hdr_cfg->hdr_mode = gc1054->cur_mode->hdr_mode;
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr_cfg = (struct rkmodule_hdr_cfg *)arg;
+		if (hdr_cfg->hdr_mode != 0)
+			ret = -1;
+
+		break;
+	case RKMODULE_SET_CONVERSION_GAIN:
+		break;
+	case RKMODULE_GET_MODULE_INFO:
+		gc1054_get_module_inf(gc1054, (struct rkmodule_inf *)arg);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		stream = *((u32 *)arg);
+		if (stream)
+			ret = gc1054_write_reg(gc1054->client,
+					       GC1054_REG_CTRL_MODE,
+					       GC1054_MODE_STREAMING);
+		else
+			ret = gc1054_write_reg(gc1054->client,
+					       GC1054_REG_CTRL_MODE,
+					       GC1054_MODE_SW_STANDBY);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+
+#ifdef CONFIG_COMPAT
+static long gc1054_compat_ioctl32(struct v4l2_subdev *sd,
+				  unsigned int cmd, unsigned long arg)
+{
+	void __user *up = compat_ptr(arg);
+	struct rkmodule_inf *inf;
+	struct rkmodule_hdr_cfg *hdr;
+	struct preisp_hdrae_exp_s *hdrae;
+	long ret = 0;
+	u32 stream = 0;
+	u32 cg = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = gc1054_ioctl(sd, cmd, hdr);
+		if (!ret) {
+			ret = copy_to_user(up, hdr, sizeof(*hdr));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(hdr);
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		if (copy_from_user(hdr, up, sizeof(*hdr))) {
+			kfree(hdr);
+			return -EFAULT;
+		}
+
+		gc1054_ioctl(sd, cmd, hdr);
+		kfree(hdr);
+		break;
+	case RKMODULE_SET_CONVERSION_GAIN:
+		if (copy_from_user(&cg, up, sizeof(cg)))
+			return -EFAULT;
+
+		gc1054_ioctl(sd, cmd, &cg);
+		break;
+	case RKMODULE_GET_MODULE_INFO:
+		inf = kzalloc(sizeof(*inf), GFP_KERNEL);
+		if (!inf) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = gc1054_ioctl(sd, cmd, inf);
+		if (!ret) {
+			ret = copy_to_user(up, inf, sizeof(*inf));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(inf);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		if (copy_from_user(&stream, up, sizeof(u32)))
+			return -EFAULT;
+
+		gc1054_ioctl(sd, cmd, &stream);
+		break;
+	case PREISP_CMD_SET_HDRAE_EXP:
+		hdrae = kzalloc(sizeof(*hdrae), GFP_KERNEL);
+		if (!hdrae) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		if (copy_from_user(hdrae, up, sizeof(*hdrae))) {
+			kfree(hdrae);
+			return -EFAULT;
+		}
+
+		gc1054_ioctl(sd, cmd, hdrae);
+		kfree(hdrae);
+		break;
+
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+	return ret;
+}
+#endif
+
+static int __gc1054_start_stream(struct gc1054 *gc1054)
+{
+	int ret;
+
+	ret = gc1054_write_array(gc1054->client, gc1054->cur_mode->reg_list);
+	if (ret)
+		return ret;
+
+	/* In case these controls are set before streaming */
+	mutex_unlock(&gc1054->mutex);
+	ret = v4l2_ctrl_handler_setup(&gc1054->ctrl_handler);
+	mutex_lock(&gc1054->mutex);
+	if (ret)
+		return ret;
+
+	return gc1054_write_reg(gc1054->client, GC1054_REG_CTRL_MODE,
+				GC1054_MODE_STREAMING);
+}
+
+static int __gc1054_stop_stream(struct gc1054 *gc1054)
+{
+	return gc1054_write_reg(gc1054->client, GC1054_REG_CTRL_MODE,
+				GC1054_MODE_SW_STANDBY);
+}
+
+static int gc1054_s_stream(struct v4l2_subdev *sd, int on)
+{
+	struct gc1054 *gc1054 = to_gc1054(sd);
+	struct i2c_client *client = gc1054->client;
+	int ret = 0;
+
+	mutex_lock(&gc1054->mutex);
+	on = !!on;
+	if (on == gc1054->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 = __gc1054_start_stream(gc1054);
+		if (ret) {
+			v4l2_err(sd, "start stream failed while write regs\n");
+			pm_runtime_put(&client->dev);
+			goto unlock_and_return;
+		}
+	} else {
+		__gc1054_stop_stream(gc1054);
+		pm_runtime_put(&client->dev);
+	}
+
+	gc1054->streaming = on;
+
+unlock_and_return:
+	mutex_unlock(&gc1054->mutex);
+	return 0;
+}
+
+static int gc1054_g_frame_interval(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_frame_interval *fi)
+{
+	struct gc1054 *gc1054 = to_gc1054(sd);
+	const struct gc1054_mode *mode = gc1054->cur_mode;
+
+	mutex_lock(&gc1054->mutex);
+	fi->interval = mode->max_fps;
+	mutex_unlock(&gc1054->mutex);
+
+	return 0;
+}
+
+static int gc1054_s_power(struct v4l2_subdev *sd, int on)
+{
+	struct gc1054 *gc1054 = to_gc1054(sd);
+	struct i2c_client *client = gc1054->client;
+	int ret = 0;
+
+	mutex_lock(&gc1054->mutex);
+
+	/* If the power state is not modified - no work to do. */
+	if (gc1054->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;
+		}
+
+		gc1054->power_on = true;
+	} else {
+		pm_runtime_put(&client->dev);
+		gc1054->power_on = false;
+	}
+
+unlock_and_return:
+	mutex_unlock(&gc1054->mutex);
+
+	return ret;
+}
+
+/* Calculate the delay in us by clock rate and clock cycles */
+static inline u32 gc1054_cal_delay(u32 cycles)
+{
+	return DIV_ROUND_UP(cycles, GC1054_XVCLK_FREQ / 1000 / 1000);
+}
+
+static int __gc1054_power_on(struct gc1054 *gc1054)
+{
+	int ret;
+	u32 delay_us;
+	struct device *dev = &gc1054->client->dev;
+
+	ret = clk_set_rate(gc1054->xvclk, GC1054_XVCLK_FREQ);
+	if (ret < 0) {
+		dev_err(dev, "Failed to set xvclk rate (24MHz)\n");
+		return ret;
+	}
+	if (clk_get_rate(gc1054->xvclk) != GC1054_XVCLK_FREQ)
+		dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n");
+	ret = clk_prepare_enable(gc1054->xvclk);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable xvclk\n");
+		return ret;
+	}
+
+	if (!IS_ERR(gc1054->reset_gpio))
+		gpiod_set_value_cansleep(gc1054->reset_gpio, 1);
+
+	ret = regulator_bulk_enable(GC1054_NUM_SUPPLIES, gc1054->supplies);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable regulators\n");
+		goto disable_clk;
+	}
+
+	/* According to datasheet, at least 10ms for reset duration */
+	usleep_range(10 * 1000, 15 * 1000);
+
+	if (!IS_ERR(gc1054->pwdn_gpio))
+		gpiod_set_value_cansleep(gc1054->pwdn_gpio, 0);
+	usleep_range(5 * 1000, 10 * 1000);
+
+	if (!IS_ERR(gc1054->reset_gpio))
+		gpiod_set_value_cansleep(gc1054->reset_gpio, 0);
+
+	/* 8192 cycles prior to first SCCB transaction */
+	delay_us = gc1054_cal_delay(8192);
+	usleep_range(delay_us, delay_us * 2);
+
+	return 0;
+
+disable_clk:
+	clk_disable_unprepare(gc1054->xvclk);
+
+	return ret;
+}
+
+static void __gc1054_power_off(struct gc1054 *gc1054)
+{
+	if (!IS_ERR(gc1054->pwdn_gpio))
+		gpiod_set_value_cansleep(gc1054->pwdn_gpio, 1);
+	clk_disable_unprepare(gc1054->xvclk);
+	if (!IS_ERR(gc1054->reset_gpio))
+		gpiod_set_value_cansleep(gc1054->reset_gpio, 1);
+	regulator_bulk_disable(GC1054_NUM_SUPPLIES, gc1054->supplies);
+}
+
+static int gc1054_runtime_resume(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct gc1054 *gc1054 = to_gc1054(sd);
+
+	return __gc1054_power_on(gc1054);
+}
+
+static int gc1054_runtime_suspend(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct gc1054 *gc1054 = to_gc1054(sd);
+
+	__gc1054_power_off(gc1054);
+
+	return 0;
+}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static int gc1054_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
+{
+	struct gc1054 *gc1054 = to_gc1054(sd);
+	struct v4l2_mbus_framefmt *try_fmt =
+				v4l2_subdev_get_try_format(sd, fh->pad, 0);
+	const struct gc1054_mode *def_mode = &supported_modes[0];
+
+	mutex_lock(&gc1054->mutex);
+	/* Initialize try_fmt */
+	try_fmt->width = def_mode->width;
+	try_fmt->height = def_mode->height;
+	try_fmt->code = PIX_FORMAT;
+	try_fmt->field = V4L2_FIELD_NONE;
+	mutex_unlock(&gc1054->mutex);
+	/* No crop or compose */
+
+	return 0;
+}
+#endif
+
+static int gc1054_g_mbus_config(struct v4l2_subdev *sd,
+				struct v4l2_mbus_config *config)
+{
+	config->type = V4L2_MBUS_PARALLEL;
+	config->flags = V4L2_MBUS_HSYNC_ACTIVE_HIGH |
+			V4L2_MBUS_VSYNC_ACTIVE_LOW |
+			V4L2_MBUS_PCLK_SAMPLE_RISING;
+	return 0;
+}
+
+static int gc1054_enum_frame_interval(struct v4l2_subdev *sd,
+				      struct v4l2_subdev_pad_config *cfg,
+				      struct v4l2_subdev_frame_interval_enum *fie)
+{
+	if (fie->index >= ARRAY_SIZE(supported_modes))
+		return -EINVAL;
+
+	if (fie->code != PIX_FORMAT)
+		return -EINVAL;
+
+	fie->code = GC1054_MEDIA_BUS_FMT;
+	fie->width = supported_modes[fie->index].width;
+	fie->height = supported_modes[fie->index].height;
+	fie->interval = supported_modes[fie->index].max_fps;
+	return 0;
+}
+static const struct dev_pm_ops gc1054_pm_ops = {
+	SET_RUNTIME_PM_OPS(gc1054_runtime_suspend,
+			   gc1054_runtime_resume, NULL)
+};
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static const struct v4l2_subdev_internal_ops gc1054_internal_ops = {
+	.open = gc1054_open,
+};
+#endif
+static const struct v4l2_subdev_core_ops gc1054_core_ops = {
+	.s_power = gc1054_s_power,
+	.ioctl = gc1054_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = gc1054_compat_ioctl32,
+#endif
+};
+
+static const struct v4l2_subdev_video_ops gc1054_video_ops = {
+	.s_stream = gc1054_s_stream,
+	.g_frame_interval = gc1054_g_frame_interval,
+	.g_mbus_config = gc1054_g_mbus_config,
+};
+
+static const struct v4l2_subdev_pad_ops gc1054_pad_ops = {
+	.enum_mbus_code = gc1054_enum_mbus_code,
+	.enum_frame_size = gc1054_enum_frame_sizes,
+	.enum_frame_interval = gc1054_enum_frame_interval,
+	.get_fmt = gc1054_get_fmt,
+	.set_fmt = gc1054_set_fmt,
+	.get_selection = gc1054_get_selection,
+};
+
+static const struct v4l2_subdev_ops gc1054_subdev_ops = {
+	.core   = &gc1054_core_ops,
+	.video  = &gc1054_video_ops,
+	.pad    = &gc1054_pad_ops,
+};
+
+static  uint32_t gain_level_table[12] = {
+								64,
+								91,
+								127,
+								182,
+								258,
+								369,
+								516,
+								738,
+								1032,
+								1491,
+								2084,
+								0xffffffff,
+};
+
+static int gc1054_set_gain(struct gc1054 *gc1054, u32 gain)
+{
+
+	int Analog_Index;
+	u32 tol_dig_gain = 0;
+	static	int total;
+
+	total = sizeof(gain_level_table) / sizeof(u32) - 1;
+
+	for (Analog_Index = 0; Analog_Index < total; Analog_Index++) {
+		if ((gain_level_table[Analog_Index] <= gain) &&
+			(gain < gain_level_table[Analog_Index+1]))
+			break;
+	}
+
+	tol_dig_gain = gain*64/gain_level_table[Analog_Index];
+	gc1054_write_reg(gc1054->client, 0xfe, 0x01);
+	gc1054_write_reg(gc1054->client, 0xb6, Analog_Index);
+	gc1054_write_reg(gc1054->client, 0xb1, (tol_dig_gain>>6));
+	gc1054_write_reg(gc1054->client, 0xb2, ((tol_dig_gain&0x3f)<<2));
+	gc1054_write_reg(gc1054->client, 0xfe, 0x00);
+
+	return 0;
+}
+
+static int gc1054_set_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct gc1054 *gc1054 = container_of(ctrl->handler,
+					     struct gc1054, ctrl_handler);
+	struct i2c_client *client = gc1054->client;
+	s64 max;
+	int ret = 0;
+	u32 vts = 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 = gc1054->cur_mode->height + ctrl->val - 4;
+		__v4l2_ctrl_modify_range(gc1054->exposure,
+					 gc1054->exposure->minimum, max,
+					 gc1054->exposure->step,
+					 gc1054->exposure->default_value);
+		break;
+	}
+
+	if (!pm_runtime_get_if_in_use(&client->dev))
+		return 0;
+
+	switch (ctrl->id) {
+	case V4L2_CID_EXPOSURE:
+		ret = gc1054_write_reg(gc1054->client, GC1054_REG_EXP_H,
+				       (ctrl->val >> 8) & 0x3f);
+		ret |= gc1054_write_reg(gc1054->client, GC1054_REG_EXP_L,
+					ctrl->val & 0xff);
+		break;
+	case V4L2_CID_ANALOGUE_GAIN:
+		gc1054_set_gain(gc1054, ctrl->val);
+		break;
+	case V4L2_CID_VBLANK:
+		vts = ctrl->val + gc1054->cur_mode->height;
+		ret = gc1054_write_reg(gc1054->client,
+				       GC1054_REG_VTS_H,
+				       (vts >> 8) & 0x3f);
+		ret |= gc1054_write_reg(gc1054->client,
+					GC1054_REG_VTS_L,
+					vts & 0xff);
+		break;
+	case V4L2_CID_HFLIP:
+		break;
+	case V4L2_CID_VFLIP:
+		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 gc1054_ctrl_ops = {
+	.s_ctrl = gc1054_set_ctrl,
+};
+
+static int gc1054_initialize_controls(struct gc1054 *gc1054)
+{
+	const struct gc1054_mode *mode;
+	struct v4l2_ctrl_handler *handler;
+	s64 exposure_max, vblank_def;
+	u32 h_blank;
+	int ret;
+
+	handler = &gc1054->ctrl_handler;
+	mode = gc1054->cur_mode;
+	ret = v4l2_ctrl_handler_init(handler, 8);
+
+	if (ret)
+		return ret;
+	handler->lock = &gc1054->mutex;
+
+	v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE,
+			  0, GC1054_PIXEL_RATE, 1, GC1054_PIXEL_RATE);
+
+	h_blank = mode->hts_def - mode->width;
+	gc1054->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
+					   h_blank, h_blank, 1, h_blank);
+
+	if (gc1054->hblank)
+		gc1054->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+
+	vblank_def = mode->vts_def - mode->height;
+	gc1054->vblank = v4l2_ctrl_new_std(handler, &gc1054_ctrl_ops,
+					   V4L2_CID_VBLANK, vblank_def,
+					   GC1054_VTS_MAX - mode->height,
+					   1, vblank_def);
+
+	exposure_max = mode->vts_def;
+	//exposure_max = mode->vts_def - 4;
+	gc1054->exposure = v4l2_ctrl_new_std(handler, &gc1054_ctrl_ops,
+					     V4L2_CID_EXPOSURE,
+					     GC1054_EXPOSURE_MIN,
+					     exposure_max,
+					     GC1054_EXPOSURE_STEP,
+					     mode->exp_def);
+
+	gc1054->anal_gain = v4l2_ctrl_new_std(handler, &gc1054_ctrl_ops,
+					      V4L2_CID_ANALOGUE_GAIN,
+					      GC1054_GAIN_MIN,
+					      GC1054_GAIN_MAX,
+					      GC1054_GAIN_STEP,
+					      GC1054_GAIN_DEFAULT);
+
+	/* Digital gain */
+	gc1054->digi_gain = v4l2_ctrl_new_std(handler, &gc1054_ctrl_ops,
+					      V4L2_CID_DIGITAL_GAIN,
+					      GC1054_GAIN_MIN,
+					      GC1054_GAIN_MAX,
+					      GC1054_GAIN_STEP,
+					      GC1054_GAIN_DEFAULT);
+
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(&gc1054->client->dev,
+			"Failed to init controls(%d)\n", ret);
+		goto err_free_handler;
+	}
+
+	gc1054->subdev.ctrl_handler = handler;
+//	gc1054->digi_gain = GC1054_GAIN_DEFAULT;
+
+	return 0;
+
+err_free_handler:
+	v4l2_ctrl_handler_free(handler);
+
+	return ret;
+}
+
+static int gc1054_check_sensor_id(struct gc1054 *gc1054,
+				  struct i2c_client *client)
+{
+	struct device *dev = &gc1054->client->dev;
+	u8 pid = 0, ver = 0;
+	u16 id = 0;
+	int ret = 0;
+
+	/* Check sensor revision */
+	ret = gc1054_read_reg(client, GC1054_REG_CHIP_ID_H, &pid);
+	ret |= gc1054_read_reg(client, GC1054_REG_CHIP_ID_L, &ver);
+	if (ret) {
+		dev_err(&client->dev, "gc1054_read_reg failed (%d)\n", ret);
+		return ret;
+	}
+	id = SENSOR_ID(pid, ver);
+	if (id != GC1054_CHIP_ID) {
+		dev_err(&client->dev,
+			"Sensor detection failed (%04X,%d)\n",
+			id, ret);
+		return -ENODEV;
+	}
+
+	dev_info(dev, "Detected GC%04x sensor\n", id);
+	return 0;
+}
+
+static int gc1054_configure_regulators(struct gc1054 *gc1054)
+{
+	u32 i;
+
+	for (i = 0; i < GC1054_NUM_SUPPLIES; i++)
+		gc1054->supplies[i].supply = gc1054_supply_names[i];
+
+	return devm_regulator_bulk_get(&gc1054->client->dev,
+				       GC1054_NUM_SUPPLIES,
+				       gc1054->supplies);
+}
+static int gc1054_probe(struct i2c_client *client,
+			const struct i2c_device_id *id)
+{
+	struct device *dev = &client->dev;
+	struct device_node *node = dev->of_node;
+	struct gc1054 *gc1054;
+	struct v4l2_subdev *sd;
+	char facing[2];
+	int ret;
+
+	dev_info(dev, "driver version: %02x.%02x.%02x",
+		 DRIVER_VERSION >> 16,
+		 (DRIVER_VERSION & 0xff00) >> 8,
+		 DRIVER_VERSION & 0x00ff);
+
+	gc1054 = devm_kzalloc(dev, sizeof(*gc1054), GFP_KERNEL);
+	if (!gc1054)
+		return -ENOMEM;
+
+	gc1054->client = client;
+	ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
+				   &gc1054->module_index);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
+				       &gc1054->module_facing);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME,
+				       &gc1054->module_name);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME,
+				       &gc1054->len_name);
+	if (ret) {
+		dev_err(dev,
+			"could not get module information!\n");
+		return -EINVAL;
+	}
+
+	gc1054->client = client;
+	gc1054->cur_mode = &supported_modes[0];
+	gc1054->xvclk = devm_clk_get(&client->dev, "xvclk");
+	if (IS_ERR(gc1054->xvclk)) {
+		dev_err(&client->dev, "Failed to get xvclk\n");
+		return -EINVAL;
+	}
+
+	gc1054->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+	if (IS_ERR(gc1054->reset_gpio))
+		dev_warn(dev, "Failed to get reset-gpios\n");
+
+	gc1054->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW);
+	if (IS_ERR(gc1054->pwdn_gpio))
+		dev_info(dev, "Failed to get pwdn-gpios, maybe no used\n");
+
+	ret = gc1054_configure_regulators(gc1054);
+	if (ret) {
+		dev_err(dev, "Failed to get power regulators\n");
+		return ret;
+	}
+
+	mutex_init(&gc1054->mutex);
+
+	sd = &gc1054->subdev;
+	v4l2_i2c_subdev_init(sd, client, &gc1054_subdev_ops);
+	ret = gc1054_initialize_controls(gc1054);
+	if (ret)
+		goto err_destroy_mutex;
+
+	ret = __gc1054_power_on(gc1054);
+	if (ret)
+		goto err_free_handler;
+
+	ret = gc1054_check_sensor_id(gc1054, client);
+	if (ret)
+		goto err_power_off;
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+	sd->internal_ops = &gc1054_internal_ops;
+	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
+#endif
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	gc1054->pad.flags = MEDIA_PAD_FL_SOURCE;
+	sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
+	ret = media_entity_pads_init(&sd->entity, 1, &gc1054->pad);
+	if (ret < 0)
+		goto err_power_off;
+#endif
+
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(gc1054->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s",
+		 gc1054->module_index, facing,
+		 GC1054_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:
+	__gc1054_power_off(gc1054);
+err_free_handler:
+	v4l2_ctrl_handler_free(&gc1054->ctrl_handler);
+
+err_destroy_mutex:
+	mutex_destroy(&gc1054->mutex);
+	return ret;
+}
+
+static int gc1054_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct gc1054 *gc1054 = to_gc1054(sd);
+
+	v4l2_async_unregister_subdev(sd);
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	media_entity_cleanup(&sd->entity);
+#endif
+	v4l2_ctrl_handler_free(&gc1054->ctrl_handler);
+	mutex_destroy(&gc1054->mutex);
+
+	pm_runtime_disable(&client->dev);
+	if (!pm_runtime_status_suspended(&client->dev))
+		__gc1054_power_off(gc1054);
+	pm_runtime_set_suspended(&client->dev);
+	return 0;
+}
+
+#if IS_ENABLED(CONFIG_OF)
+static const struct of_device_id gc1054_of_match[] = {
+	{ .compatible = "galaxycore,gc1054" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, gc1054_of_match);
+#endif
+
+static const struct i2c_device_id gc1054_match_id[] = {
+	{ "galaxycore,gc1054", 0 },
+	{ },
+};
+
+static struct i2c_driver gc1054_i2c_driver = {
+	.driver = {
+		.name = GC1054_NAME,
+		.pm = &gc1054_pm_ops,
+		.of_match_table = of_match_ptr(gc1054_of_match),
+	},
+	.probe      = &gc1054_probe,
+	.remove     = &gc1054_remove,
+	.id_table   = gc1054_match_id,
+};
+
+static int __init sensor_mod_init(void)
+{
+	return i2c_add_driver(&gc1054_i2c_driver);
+}
+
+static void __exit sensor_mod_exit(void)
+{
+	i2c_del_driver(&gc1054_i2c_driver);
+}
+
+device_initcall_sync(sensor_mod_init);
+module_exit(sensor_mod_exit);
+
+MODULE_DESCRIPTION("GC1054 CMOS Image Sensor driver");
+MODULE_LICENSE("GPL v2");

commit 533467b6e70bd028dce375aeb1dee5e3130a107c
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Thu Dec 23 10:29:04 2021 +0800

    spi: rockchip: clear interrupt status in error handler
    
    The interrupt status bit of the previous error data transmition will
    affect the next operation and cause continuous SPI transmission failure.
    
    Change-Id: Ib215d63d8572e3fc8d843652687e1ebfb7ff531e
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c
index ad2fb155412f..30f603a2d165 100644
--- a/drivers/spi/spi-rockchip.c
+++ b/drivers/spi/spi-rockchip.c
@@ -290,8 +290,9 @@ static void rockchip_spi_handle_err(struct spi_controller *ctlr,
 	 */
 	spi_enable_chip(rs, false);
 
-	/* make sure all interrupts are masked */
+	/* make sure all interrupts are masked and status cleared */
 	writel_relaxed(0, rs->regs + ROCKCHIP_SPI_IMR);
+	writel_relaxed(0xffffffff, rs->regs + ROCKCHIP_SPI_ICR);
 
 	if (atomic_read(&rs->state) & TXDMA)
 		dmaengine_terminate_async(ctlr->dma_tx);

commit 7a460a763b837ae43de225cf517e7a3b2ff3c5f9
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Tue Dec 7 11:08:24 2021 +0800

    spi: rockchip: terminate dma transmission when slave abort
    
    After slave abort, all DMA should be stopped, or it will affect the
    next transmission:
    
    [   31.693877] Unable to handle kernel paging request at virtual address ffffff8105a2a7c0
    [   31.694643] Mem abort info:
    [   31.694898]   ESR = 0x96000045
    [   31.695179]   EC = 0x25: DABT (current EL), IL = 32 bits
    [   31.695653]   SET = 0, FnV = 0
    [   31.695931]   EA = 0, S1PTW = 0
    [   31.696218] Data abort info:
    [   31.696485]   ISV = 0, ISS = 0x00000045
    [   31.696832]   CM = 0, WnR = 1
    [   31.697112] swapper pgtable: 4k pages, 39-bit VAs, pgdp=000000000142f000
    [   31.697713] [ffffff8105a2a7c0] pgd=0000000000000000, p4d=0000000000000000, pud=0000000000000000
    [   31.698502] Internal error: Oops: 96000045 [#1] SMP
    [   31.698943] Modules linked in:
    [   31.699235] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G        W         5.10.43 #8
    [   31.699895] Hardware name: Rockchip RK3588 EVB1 LP4 V10 Board (DT)
    [   31.700455] pstate: 60400089 (nZCv daIf +PAN -UAO -TCO BTYPE=--)
    [   31.701000] pc : rockchip_spi_slave_abort+0x150/0x18c
    [   31.701456] lr : rockchip_spi_slave_abort+0x78/0x18c
    
    Change-Id: I486211d1b96125bae18b6f1a51e1e425da5e847f
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c
index 47982d4dce72..ad2fb155412f 100644
--- a/drivers/spi/spi-rockchip.c
+++ b/drivers/spi/spi-rockchip.c
@@ -638,8 +638,6 @@ static int rockchip_spi_slave_abort(struct spi_controller *ctlr)
 	if (atomic_read(&rs->state) & RXDMA) {
 		dmaengine_pause(ctlr->dma_rx);
 		status = dmaengine_tx_status(ctlr->dma_rx, ctlr->dma_rx->cookie, &state);
-		dmaengine_terminate_sync(ctlr->dma_rx);
-		atomic_set(&rs->state, 0);
 		if (status == DMA_ERROR) {
 			rs->rx = rs->xfer->rx_buf;
 			rs->xfer->len = 0;
@@ -669,6 +667,11 @@ static int rockchip_spi_slave_abort(struct spi_controller *ctlr)
 	}
 
 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);

commit ec35373004addd93848e95e887bb7fe980ada124
Author: shengfei Xu <xsf@rock-chips.com>
Date:   Tue Dec 7 03:34:16 2021 +0000

    spi: rockchip: Suspend and resume the bus during NOIRQ_SYSTEM_SLEEP_PM ops
    
    the wakeup interrupt handler which is guaranteed not to run while
    @resume noirq() is being executed. the patch can help to avoid the
    wakeup source try to access spi when the spi is in suspend mode.
    
    Signed-off-by: shengfei Xu <xsf@rock-chips.com>
    Change-Id: I3e6bc6e05dddeedea4c82de45a9e06b40e870876

diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c
index e5fcdf18b7d5..47982d4dce72 100644
--- a/drivers/spi/spi-rockchip.c
+++ b/drivers/spi/spi-rockchip.c
@@ -1012,14 +1012,14 @@ 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;
 
-	ret = pm_runtime_force_suspend(dev);
-	if (ret < 0)
-		return ret;
+	clk_disable_unprepare(rs->spiclk);
+	clk_disable_unprepare(rs->apb_pclk);
 
 	pinctrl_pm_select_sleep_state(dev);
 
@@ -1034,10 +1034,14 @@ static int rockchip_spi_resume(struct device *dev)
 
 	pinctrl_pm_select_default_state(dev);
 
-	ret = pm_runtime_force_resume(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);
@@ -1079,7 +1083,7 @@ static int rockchip_spi_runtime_resume(struct device *dev)
 #endif /* CONFIG_PM */
 
 static const struct dev_pm_ops rockchip_spi_pm = {
-	SET_SYSTEM_SLEEP_PM_OPS(rockchip_spi_suspend, rockchip_spi_resume)
+	SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(rockchip_spi_suspend, rockchip_spi_resume)
 	SET_RUNTIME_PM_OPS(rockchip_spi_runtime_suspend,
 			   rockchip_spi_runtime_resume, NULL)
 };

commit 8bae8a08571789d566fb93ba1cb4f18acfbb51d2
Author: Tobias Schramm <t.schramm@manjaro.org>
Date:   Fri Aug 27 07:03:57 2021 +0200

    UPSTREAM: spi: rockchip: handle zero length transfers without timing out
    
    Previously zero length transfers submitted to the Rokchip SPI driver would
    time out in the SPI layer. This happens because the SPI peripheral does
    not trigger a transfer completion interrupt for zero length transfers.
    
    Fix that by completing zero length transfers immediately at start of
    transfer.
    
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>
    (cherry picked from commit 5457773ef99f25fcc4b238ac76b68e28273250f4)
    Change-Id: I0c14eee10fbf0ffd2938d52b6d0c88910d8fd9d7
    Signed-off-by: Tobias Schramm <t.schramm@manjaro.org>

diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c
index 2cd31ec56691..e5fcdf18b7d5 100644
--- a/drivers/spi/spi-rockchip.c
+++ b/drivers/spi/spi-rockchip.c
@@ -684,6 +684,12 @@ static int rockchip_spi_transfer_one(
 	struct rockchip_spi *rs = spi_controller_get_devdata(ctlr);
 	bool use_dma;
 
+	/* Zero length transfers won't trigger an interrupt on completion */
+	if (!xfer->len) {
+		spi_finalize_current_transfer(ctlr);
+		return 1;
+	}
+
 	WARN_ON(readl_relaxed(rs->regs + ROCKCHIP_SPI_SSIENR) &&
 		(readl_relaxed(rs->regs + ROCKCHIP_SPI_SR) & SR_BUSY));
 

commit 8d966971bf8194a028b8a1a43bbfa8469e31bf2a
Author: Ziyuan Xu <xzy.xu@rock-chips.com>
Date:   Wed Dec 22 09:31:55 2021 +0800

    ARM: configs: add rv1126-trailcamera.config
    
    Signed-off-by: Ziyuan Xu <xzy.xu@rock-chips.com>
    Change-Id: If776b5140255004196554bba9ebc5bf975973da4

diff --git a/arch/arm/configs/rv1126-trailcamera.config b/arch/arm/configs/rv1126-trailcamera.config
new file mode 100644
index 000000000000..e12ab8d0d040
--- /dev/null
+++ b/arch/arm/configs/rv1126-trailcamera.config
@@ -0,0 +1,41 @@
+# CONFIG_ARM_ROCKCHIP_DMC_DEBUG is not set
+# CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ is not set
+CONFIG_BATTERY_CW2015=y
+# CONFIG_BLK_DEV is not set
+# CONFIG_BT is not set
+# CONFIG_DEBUG_GPIO is not set
+# CONFIG_IIO is not set
+# CONFIG_INPUT is not set
+# CONFIG_MAILBOX is not set
+# CONFIG_MFD_RK808 is not set
+# CONFIG_MODULE_UNLOAD is not set
+# CONFIG_MTD_UBI is not set
+# CONFIG_NETDEVICES is not set
+# CONFIG_NEW_LEDS is not set
+# CONFIG_NTFS_FS is not set
+# CONFIG_OVERLAY_FS is not set
+# CONFIG_PM_DEBUG is not set
+# CONFIG_PM_DEVFREQ_EVENT is not set
+# CONFIG_PPS is not set
+CONFIG_PSTORE_MCU_LOG=y
+# CONFIG_PTP_1588_CLOCK is not set
+# CONFIG_PWRSEQ_EMMC is not set
+# CONFIG_PWRSEQ_SIMPLE is not set
+# CONFIG_RFKILL is not set
+CONFIG_ROCKCHIP_LOW_PERFORMANCE=y
+# CONFIG_ROCKCHIP_SUSPEND_MODE is not set
+CONFIG_RTC_DRV_HYM8563=y
+# CONFIG_SCSI is not set
+CONFIG_SCSI_MOD=y
+# CONFIG_SOUND is not set
+# CONFIG_SPI is not set
+# CONFIG_SQUASHFS is not set
+# CONFIG_USB is not set
+CONFIG_USB_DWC3_GADGET=y
+# CONFIG_VIDEO_OS04A10 is not set
+CONFIG_VIDEO_OS04C10=y
+# CONFIG_VIDEO_OV2718 is not set
+# CONFIG_VIDEO_ROCKCHIP_CIF is not set
+CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP=y
+# CONFIG_WIRELESS is not set
+# CONFIG_XZ_DEC is not set

commit abaa0cc7486efdf8d4f6f27b5f84b053475b503b
Author: Ziyuan Xu <xzy.xu@rock-chips.com>
Date:   Wed Dec 22 09:13:56 2021 +0800

    ARM: dts: rv1126-trailcamera: add vdec support
    
    Signed-off-by: Ziyuan Xu <xzy.xu@rock-chips.com>
    Change-Id: I62fd306268a7281f92e0fc3ca0010eb07cfeddf0

diff --git a/arch/arm/boot/dts/rv1126-trailcamera.dts b/arch/arm/boot/dts/rv1126-trailcamera.dts
index d4aa8fbc2594..4a786d0e941d 100644
--- a/arch/arm/boot/dts/rv1126-trailcamera.dts
+++ b/arch/arm/boot/dts/rv1126-trailcamera.dts
@@ -32,6 +32,14 @@
 	mcu-log-count = <0x1>;
 };
 
+&rkvdec {
+	status = "okay";
+};
+
+&rkvdec_mmu {
+	status = "okay";
+};
+
 &rkisp_thunderboot {
 	reg = <0x08000000 (64 * 0x00100000)>;
 };
@@ -58,3 +66,7 @@
 	/delete-property/ memory-region-idmac;
 	status = "disabled";
 };
+
+&vdpu {
+	status = "okay";
+};

commit ac5fd3cc4fbb114b594b275f87816df84f18053a
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Tue Dec 21 15:07:08 2021 +0800

    Revert "FROMLIST: mm/zsmalloc.c: fix zsmalloc ARM LPAE support"
    
    This reverts commit ba0401694b41613a0b8ba37d019b1c670831b544.
    
    Replaced by commit d4fe42d646f2 ("arch: pgtable: define MAX_POSSIBLE_PHYSMEM_BITS where needed").
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: I9b0f39823bd2202bd58837262a54694c096aab84

diff --git a/arch/arm/include/asm/pgtable-3level-types.h b/arch/arm/include/asm/pgtable-3level-types.h
index bd4994f98700..921aa30259c4 100644
--- a/arch/arm/include/asm/pgtable-3level-types.h
+++ b/arch/arm/include/asm/pgtable-3level-types.h
@@ -67,6 +67,4 @@ typedef pteval_t pgprot_t;
 
 #endif	/* STRICT_MM_TYPECHECKS */
 
-#define MAX_POSSIBLE_PHYSMEM_BITS	36
-
 #endif	/* _ASM_PGTABLE_3LEVEL_TYPES_H */

commit cb4c230a638adab9503358bdc1c88725f0b3b864
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Tue Dec 21 14:47:19 2021 +0800

    scripts/gcc-wrapper.py: ignore vfs.c:1261
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: I637a4f0364c06da066ea6a23ac7f19dec9b4edd3

diff --git a/scripts/gcc-wrapper.py b/scripts/gcc-wrapper.py
index f8bc043a66a1..0cc6b423a81f 100755
--- a/scripts/gcc-wrapper.py
+++ b/scripts/gcc-wrapper.py
@@ -38,7 +38,7 @@ import sys
 import subprocess
 
 allowed_warnings = set([
-    "vfs.c:1259", # fs/incfs/vfs.c:1259:10: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
+    "vfs.c:1261", # fs/incfs/vfs.c:1261:10: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
     "pseudo_files.c:715", # fs/incfs/pseudo_files.c:715:10: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
     "km_apphint.c:230", # drivers/staging/imgtec/rogue/km_apphint.c:230:48: warning: division 'sizeof (void *) / sizeof (void)' does not compute the number of array elements [-Wsizeof-pointer-div]
     "file.c:3010", # fs/f2fs/file.c:3010:12: warning: 'f2fs_ioctl_check_project' defined but not used

commit b35c8682be8e6b8684319af4446aada98669bfb9
Merge: 2f06afaaa8f8 d8aa9b09de98
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Mon Dec 20 20:43:37 2021 +0800

    Merge tag 'ASB-2021-12-05_4.19-stable' of https://android.googlesource.com/kernel/common
    
    https://source.android.com/security/bulletin/2021-12-01
    CVE-2021-33909
    CVE-2021-38204
    CVE-2021-0961
    
    * tag 'ASB-2021-12-05_4.19-stable': (1065 commits)
      BACKPORT: arm64: vdso32: suppress error message for 'make mrproper'
      Linux 4.19.219
      tty: hvc: replace BUG_ON() with negative return value
      xen/netfront: don't trust the backend response data blindly
      xen/netfront: disentangle tx_skb_freelist
      xen/netfront: don't read data from request on the ring page
      xen/netfront: read response from backend only once
      xen/blkfront: don't trust the backend response data blindly
      xen/blkfront: don't take local copy of a request from the ring page
      xen/blkfront: read response from backend only once
      xen: sync include/xen/interface/io/ring.h with Xen's newest version
      fuse: release pipe buf after last use
      NFC: add NCI_UNREG flag to eliminate the race
      hugetlbfs: flush TLBs correctly after huge_pmd_unshare
      s390/mm: validate VMA in PGSTE manipulation functions
      tracing: Check pid filtering when creating events
      vhost/vsock: fix incorrect used length reported to the guest
      net: hns3: fix VF RSS failed problem after PF enable multi-TCs
      net/smc: Don't call clcsock shutdown twice when smc shutdown
      MIPS: use 3-level pgtable for 64KB page size on MIPS_VA_BITS_48
      ...
    
    Change-Id: Iaa72ffe6492c1a9a32cbd8769ae00c3f47ed198b
    
    Conflicts:
            arch/arm64/boot/dts/rockchip/rk3328.dtsi
            drivers/media/i2c/imx258.c
            drivers/soc/rockchip/Kconfig
            drivers/usb/host/ehci.h

commit 2f06afaaa8f8e9371906c46a7cdf71e61bfc7608
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Tue Dec 14 08:20:25 2021 +0800

    phy: rockchip: naneng-combphy: Force detect Rx for RK356X SoCs
    
    Follow internal design requirement.
    
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: I1b304cfab4a65c88cfdab6f59922f297fa35e742

diff --git a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
index 08445c1890eb..f3528251e297 100644
--- a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
+++ b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
@@ -68,6 +68,7 @@ struct rockchip_combphy_cfg {
 	const int num_clks;
 	const struct clk_bulk_data *clks;
 	const struct rockchip_combphy_grfcfg *grfcfg;
+	bool force_det_out; /* Tx detect Rx errata */
 	int (*combphy_cfg)(struct rockchip_combphy_priv *priv);
 };
 
@@ -130,6 +131,7 @@ static u32 rockchip_combphy_is_ready(struct rockchip_combphy_priv *priv)
 static int rockchip_combphy_pcie_init(struct rockchip_combphy_priv *priv)
 {
 	int ret = 0;
+	u32 val;
 
 	if (priv->cfg->combphy_cfg) {
 		ret = priv->cfg->combphy_cfg(priv);
@@ -139,6 +141,12 @@ static int rockchip_combphy_pcie_init(struct rockchip_combphy_priv *priv)
 		}
 	}
 
+	if (priv->cfg->force_det_out) {
+		val = readl(priv->mmio + (0xd << 2));
+		val |= BIT(5);
+		writel(val, priv->mmio + (0xd << 2));
+	}
+
 	return ret;
 }
 
@@ -622,6 +630,7 @@ static const struct rockchip_combphy_cfg rk3568_combphy_cfgs = {
 	.clks		= rk3568_clks,
 	.grfcfg		= &rk3568_combphy_grfcfgs,
 	.combphy_cfg	= rk3568_combphy_cfg,
+	.force_det_out	= true,
 };
 
 static const struct of_device_id rockchip_combphy_of_match[] = {

commit c9992a65733aa467206302172cd624c530d2606c
Author: Su Yuefu <yuefu.su@rock-chips.com>
Date:   Fri Oct 29 09:11:22 2021 +0800

    media: i2c: add os12d40 sensor driver
    
    Signed-off-by: Su Yuefu <yuefu.su@rock-chips.com>
    Change-Id: I2fd76819530830cf760e46a9c14a9b4a23bcff55

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index fd901066673a..81a26cb71eb9 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -922,6 +922,15 @@ config VIDEO_OS08A20
 	  This is a Video4Linux2 sensor driver for the OmniVision
 	  OS08A20 camera.
 
+config VIDEO_OS12D40
+	tristate "OmniVision OS12D40 sensor support"
+	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
+	depends on MEDIA_CAMERA_SUPPORT
+	select V4L2_FWNODE
+	help
+	  This is a Video4Linux2 sensor driver for the OmniVision
+	  OS12D40 camera.
+
 config VIDEO_OV02B10
 	tristate "OmniVision OV02B10 sensor support"
 	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index 6ba262470447..9b7854135a2c 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -82,6 +82,7 @@ obj-$(CONFIG_VIDEO_OS04C10) += os04c10.o
 obj-$(CONFIG_VIDEO_OS05A20) += os05a20.o
 obj-$(CONFIG_VIDEO_OS08A10) += os08a10.o
 obj-$(CONFIG_VIDEO_OS08A20) += os08a20.o
+obj-$(CONFIG_VIDEO_OS12D40) += os12d40.o
 obj-$(CONFIG_VIDEO_OV02B10) += ov02b10.o
 obj-$(CONFIG_VIDEO_OV02K10) += ov02k10.o
 obj-$(CONFIG_VIDEO_OV2640) += ov2640.o
diff --git a/drivers/media/i2c/os12d40.c b/drivers/media/i2c/os12d40.c
new file mode 100644
index 000000000000..bae478c8a147
--- /dev/null
+++ b/drivers/media/i2c/os12d40.c
@@ -0,0 +1,2242 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * os12d40 driver
+ *
+ * Copyright (C) 2021 Rockchip Electronics Co., Ltd.
+ *
+ * V0.0X01.0X00 init version.
+ */
+
+#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/of.h>
+#include <linux/of_graph.h>
+#include <linux/regulator/consumer.h>
+#include <linux/sysfs.h>
+#include <linux/pinctrl/consumer.h>
+#include <linux/version.h>
+#include <media/v4l2-async.h>
+#include <media/media-entity.h>
+#include <media/v4l2-common.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-event.h>
+#include <media/v4l2-fwnode.h>
+#include <media/v4l2-image-sizes.h>
+#include <media/v4l2-mediabus.h>
+#include <media/v4l2-subdev.h>
+
+#include <linux/rk-camera-module.h>
+
+/* verify default register values */
+//#define CHECK_REG_VALUE
+
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x00)
+
+#ifndef V4L2_CID_DIGITAL_GAIN
+#define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
+#endif
+
+/* pixel rate = link frequency * 2 * lanes / BITS_PER_SAMPLE */
+#define MIPI_FREQ			2500000000U
+#define OS12D40_PIXEL_RATE		(MIPI_FREQ * 2LL * 4LL / 10)
+#define OS12D40_XVCLK_FREQ		24000000
+
+#define CHIP_ID				0x561441
+#define OS12D40_REG_CHIP_ID		0x300a
+
+#define OS12D40_REG_CTRL_MODE		0x0100
+#define OS12D40_MODE_SW_STANDBY		0x00
+#define OS12D40_MODE_STREAMING		0x01
+
+#define OS12D40_REG_EXPOSURE		0x3501
+
+#define	OS12D40_EXPOSURE_MIN		4
+#define	OS12D40_EXPOSURE_STEP		1
+#define OS12D40_VTS_MAX			0x7fff
+
+#define OS12D40_REG_AGAIN_L		0x3508
+
+#define OS12D40_REG_DGAIN_L		0x350a
+
+#define OS12D40_GAIN_L_MASK		0xff
+#define OS12D40_GAIN_H_MASK		0x3f
+#define OS12D40_GAIN_H_SHIFT		8
+#define	ANALOG_GAIN_MIN			0x80
+#define	ANALOG_GAIN_MAX			0x7C0
+#define	ANALOG_GAIN_STEP		1
+#define	ANALOG_GAIN_DEFAULT		1024
+
+#define OS12D40_REG_GROUP		0x3208
+
+#define OS12D40_REG_VTS			0x380e
+
+#define REG_NULL			0xFFFF
+#define DELAY_MS			0xEEEE	/* Array delay token */
+
+#define OS12D40_REG_VALUE_08BIT		1
+#define OS12D40_REG_VALUE_16BIT		2
+#define OS12D40_REG_VALUE_24BIT		3
+
+#define OS12D40_LANES			4
+#define OS12D40_BITS_PER_SAMPLE		10
+
+#define OF_CAMERA_PINCTRL_STATE_DEFAULT	"rockchip,camera_default"
+#define OF_CAMERA_PINCTRL_STATE_SLEEP	"rockchip,camera_sleep"
+
+#define OS12D40_NAME			"os12d40"
+#define OS12D40_MEDIA_BUS_FMT		MEDIA_BUS_FMT_SRGGB10_1X10
+
+struct os12d40_otp_info {
+	int flag; // bit[7]: info, bit[6]:wb
+	int module_id;
+	int lens_id;
+	int year;
+	int month;
+	int day;
+	int rg_ratio;
+	int bg_ratio;
+};
+
+static const char * const os12d40_supply_names[] = {
+	"avdd",		/* Analog power */
+	"dovdd",	/* Digital I/O power */
+	"dvdd",		/* Digital core power */
+};
+
+#define OS12D40_NUM_SUPPLIES ARRAY_SIZE(os12d40_supply_names)
+
+struct regval {
+	u16 addr;
+	u8 val;
+};
+
+struct os12d40_mode {
+	u32 width;
+	u32 height;
+	struct v4l2_fract max_fps;
+	u32 hts_def;
+	u32 vts_def;
+	u32 exp_def;
+	u32 hdr_mode;
+	const struct regval *reg_list;
+};
+
+struct os12d40 {
+	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[OS12D40_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	*test_pattern;
+	struct mutex		mutex;
+	bool			streaming;
+	bool			power_on;
+	const struct os12d40_mode *cur_mode;
+	unsigned int lane_num;
+	unsigned int cfg_num;
+	unsigned int pixel_rate;
+	u32			module_index;
+	struct os12d40_otp_info *otp;
+	const char		*module_facing;
+	const char		*module_name;
+	const char		*len_name;
+	struct rkmodule_awb_cfg	awb_cfg;
+};
+
+#define to_os12d40(sd) container_of(sd, struct os12d40, subdev)
+
+struct os12d40_id_name {
+	int id;
+	char name[RKMODULE_NAME_LEN];
+};
+
+/*
+ * Xclk 24Mhz
+ * Pclk 210Mhz
+ * linelength 2200(0x898)
+ * framelength 2250(0x7f6)
+ * grabwindow_width 3840
+ * grabwindow_height 2160
+ * max_framerate 30fps
+ * mipi_datarate per lane 960Mbps
+ */
+static const struct regval os12d40_3840x2160_regs_4lane[] = {
+	// Sysclk 148Mhz, MIPI4_960Mbps/Lane, 30Fps.
+	//Line_length =2200, Frame_length =2250
+	{0x0103, 0x01},
+	{0x0301, 0x80},
+	{0x0302, 0x01},
+	{0x0304, 0x02},
+	{0x0305, 0x71},
+	{0x0306, 0x04},
+	{0x0307, 0x00},
+	{0x0309, 0x01},
+	{0x0320, 0x20},
+	{0x0324, 0x01},
+	{0x0325, 0xc2},
+	{0x0326, 0xd3},
+	{0x032b, 0x06},
+	{0x0344, 0x01},
+	{0x0345, 0xb8},
+	{0x0346, 0xcb},
+	{0x0350, 0x02},
+	{0x0360, 0x09},
+	{0x3002, 0x80},
+	{0x300d, 0x11},
+	{0x300e, 0x11},
+	{0x3012, 0x41},
+	{0x3016, 0xf0},
+	{0x3017, 0xd0},
+	{0x3018, 0xf0},
+	{0x3019, 0xc2},
+	{0x301a, 0xf0},
+	{0x301b, 0x34},
+	{0x301c, 0x91},
+	{0x301d, 0x02},
+	{0x301e, 0x98},
+	{0x301f, 0x21},
+	{0x3022, 0xf0},
+	{0x3027, 0x2e},
+	{0x302c, 0x01},
+	{0x302d, 0x00},
+	{0x302e, 0x00},
+	{0x302f, 0x00},
+	{0x3030, 0x03},
+	{0x3044, 0xc2},
+	{0x304b, 0x00},
+	{0x30d4, 0x00},
+	{0x3209, 0x00},
+	{0x320a, 0x00},
+	{0x320b, 0x00},
+	{0x320c, 0x00},
+	{0x320d, 0x01},
+	{0x3216, 0x01},
+	{0x3218, 0x80},
+	{0x33c0, 0x00},
+	{0x33c3, 0x00},
+	{0x33c4, 0x00},
+	{0x3400, 0x04},
+	{0x3408, 0x05},
+	{0x340c, 0x10},
+	{0x340e, 0x30},
+	{0x3421, 0x08},
+	{0x3422, 0x00},
+	{0x3423, 0x15},
+	{0x3424, 0x40},
+	{0x3425, 0x10},
+	{0x3426, 0x20},
+	{0x3500, 0x00},
+	{0x3501, 0x0a},
+	{0x3502, 0xd0},
+	{0x3504, 0x08},
+	{0x3508, 0x01},
+	{0x3509, 0x00},
+	{0x350a, 0x01},
+	{0x350b, 0x00},
+	{0x350c, 0x00},
+	{0x350e, 0x00},
+	{0x3510, 0x01},
+	{0x3511, 0x00},
+	{0x3512, 0x00},
+	{0x3513, 0x01},
+	{0x3514, 0x00},
+	{0x3515, 0x00},
+	{0x3516, 0x01},
+	{0x3517, 0x00},
+	{0x3518, 0x00},
+	{0x352d, 0x00},
+	{0x352e, 0x00},
+	{0x352f, 0x00},
+	{0x3541, 0x00},
+	{0x3542, 0x40},
+	{0x3548, 0x01},
+	{0x3549, 0x00},
+	{0x354a, 0x01},
+	{0x354b, 0x00},
+	{0x354c, 0x00},
+	{0x354e, 0x00},
+	{0x3550, 0x01},
+	{0x3551, 0x00},
+	{0x3552, 0x00},
+	{0x3581, 0x00},
+	{0x3582, 0x40},
+	{0x3588, 0x01},
+	{0x3589, 0x00},
+	{0x358a, 0x01},
+	{0x358b, 0x00},
+	{0x358c, 0x00},
+	{0x3590, 0x01},
+	{0x3591, 0x00},
+	{0x3592, 0x00},
+	{0x3610, 0x80},
+	{0x3615, 0x27},
+	{0x3617, 0x5a},
+	{0x3624, 0x88},
+	{0x3628, 0x77},
+	{0x3644, 0x20},
+	{0x3652, 0x00},
+	{0x3653, 0x00},
+	{0x3663, 0x6b},
+	{0x3660, 0x4f},
+	{0x3661, 0xd0},
+	{0x3662, 0x09},
+	{0x3680, 0xc1},
+	{0x3683, 0x80},
+	{0x3684, 0x03},
+	{0x3685, 0x52},
+	{0x3687, 0xc2},
+	{0x3689, 0x27},
+	{0x368a, 0x38},
+	{0x368b, 0x08},
+	{0x368c, 0x06},
+	{0x368e, 0x00},
+	{0x3692, 0x00},
+	{0x3693, 0x00},
+	{0x3696, 0x26},
+	{0x3697, 0x1f},
+	{0x3698, 0x1d},
+	{0x3699, 0x59},
+	{0x369a, 0x02},
+	{0x369b, 0x34},
+	{0x3700, 0x2e},
+	{0x3701, 0x06},
+	{0x3702, 0x4f},
+	{0x3703, 0x28},
+	{0x3704, 0x07},
+	{0x3705, 0x00},
+	{0x3706, 0x2f},
+	{0x3707, 0x08},
+	{0x3708, 0x2d},
+	{0x3709, 0x5d},
+	{0x370a, 0x00},
+	{0x370b, 0x69},
+	{0x370c, 0x0c},
+	{0x3711, 0x00},
+	{0x3712, 0x01},
+	{0x3713, 0x00},
+	{0x3714, 0x69},
+	{0x371a, 0x1c},
+	{0x371b, 0xd0},
+	{0x371c, 0x04},
+	{0x371d, 0x24},
+	{0x371e, 0x13},
+	{0x371f, 0x0c},
+	{0x3720, 0x08},
+	{0x3721, 0x15},
+	{0x3724, 0x08},
+	{0x3725, 0x32},
+	{0x3727, 0x22},
+	{0x3728, 0x11},
+	{0x3729, 0x00},
+	{0x372a, 0x00},
+	{0x372b, 0x00},
+	{0x3752, 0x02},
+	{0x3753, 0x03},
+	{0x3754, 0xee},
+	{0x3760, 0x04},
+	{0x3761, 0x14},
+	{0x3762, 0x04},
+	{0x3765, 0x08},
+	{0x3766, 0x0c},
+	{0x3767, 0x00},
+	{0x376a, 0x00},
+	{0x376b, 0x00},
+	{0x376d, 0x1b},
+	{0x376f, 0x02},
+	{0x37d9, 0x08},
+	{0x37f6, 0x07},
+	{0x37f7, 0x04},
+	{0x37f8, 0x2d},
+	{0x37f9, 0x02},
+	{0x37fa, 0x02},
+	{0x37fb, 0x02},
+	{0x3800, 0x00},
+	{0x3801, 0x00},
+	{0x3802, 0x00},
+	{0x3803, 0x40},
+	{0x3804, 0x12},
+	{0x3805, 0x1f},
+	{0x3806, 0x0a},
+	{0x3807, 0x1f},
+	{0x3808, 0x0F},
+	{0x3809, 0x00},
+	{0x380a, 0x08},
+	{0x380b, 0x70},
+	{0x380c, 0x04},
+	{0x380d, 0x38},
+	{0x380e, 0x0a},
+	{0x380f, 0xe0},
+	{0x3810, 0x00},
+	{0x3811, 0x41},
+	{0x3812, 0x00},
+	{0x3813, 0x08},
+	{0x3814, 0x11},
+	{0x3815, 0x11},
+	{0x381a, 0x00},
+	{0x381b, 0x01},
+	{0x381e, 0x00},
+	{0x381f, 0x02},
+	{0x3820, 0x00},
+	{0x3821, 0x04},
+	{0x3822, 0x00},
+	{0x3823, 0x04},
+	{0x3824, 0x00},
+	{0x3825, 0x00},
+	{0x3826, 0x00},
+	{0x3827, 0x00},
+	{0x3828, 0xf7},
+	{0x382a, 0x83},
+	{0x382c, 0x00},
+	{0x382d, 0x00},
+	{0x3835, 0x00},
+	{0x3836, 0x00},
+	{0x3837, 0x10},
+	{0x3839, 0x00},
+	{0x383b, 0x00},
+	{0x383c, 0x00},
+	{0x383d, 0x10},
+	{0x383e, 0x00},
+	{0x383f, 0x33},
+	{0x3842, 0x00},
+	{0x3856, 0x00},
+	{0x3857, 0x10},
+	{0x3858, 0x00},
+	{0x3859, 0x20},
+	{0x3865, 0x00},
+	{0x3867, 0x08},
+	{0x3868, 0x00},
+	{0x3904, 0x33},
+	{0x3907, 0x33},
+	{0x390a, 0x9a},
+	{0x3914, 0x34},
+	{0x3938, 0x4b},
+	{0x3939, 0x0c},
+	{0x393b, 0x4b},
+	{0x393c, 0x0c},
+	{0x393e, 0x40},
+	{0x393f, 0x0c},
+	{0x394a, 0x01},
+	{0x394b, 0xa5},
+	{0x3975, 0x05},
+	{0x3979, 0x32},
+	{0x397d, 0x69},
+	{0x3981, 0x15},
+	{0x3983, 0x33},
+	{0x3985, 0x1a},
+	{0x3986, 0x08},
+	{0x398a, 0x09},
+	{0x39cd, 0x00},
+	{0x39ce, 0x24},
+	{0x39cf, 0x40},
+	{0x39d0, 0x0a},
+	{0x39d1, 0x50},
+	{0x39d2, 0x05},
+	{0x39d3, 0x94},
+	{0x39d4, 0x01},
+	{0x39d5, 0x79},
+	{0x3a12, 0x00},
+	{0x3a13, 0x00},
+	{0x3a14, 0x00},
+	{0x3a15, 0x00},
+	{0x3a16, 0x00},
+	{0x3a18, 0x04},
+	{0x3a1a, 0x05},
+	{0x3a1c, 0x0a},
+	{0x3a1e, 0x03},
+	{0x3a1f, 0x34},
+	{0x3a22, 0x12},
+	{0x3a24, 0x00},
+	{0x3a25, 0xfe},
+	{0x3a26, 0x01},
+	{0x3a27, 0x01},
+	{0x3a2a, 0xa8},
+	{0x3a2b, 0xa8},
+	{0x3a36, 0x00},
+	{0x3d84, 0x00},
+	{0x3d85, 0x1b},
+	{0x3d88, 0x00},
+	{0x3d89, 0x00},
+	{0x3d8a, 0x03},
+	{0x3d8b, 0xff},
+	{0x3d8c, 0xa3},
+	{0x3d8d, 0xc4},
+	{0x3da4, 0x04},
+	{0x3daa, 0xa0},
+	{0x3dab, 0x10},
+	{0x3dac, 0xa1},
+	{0x3dad, 0x8c},
+	{0x3dae, 0xa1},
+	{0x3daf, 0xb3},
+	{0x3e00, 0x0e},
+	{0x3e01, 0x0e},
+	{0x3e02, 0x0e},
+	{0x3e03, 0x0e},
+	{0x3e04, 0x0e},
+	{0x3e05, 0x0e},
+	{0x3e06, 0x0e},
+	{0x3e07, 0x0e},
+	{0x3e09, 0x47},
+	{0x3e0b, 0x25},
+	{0x3e0d, 0x13},
+	{0x3e0f, 0x09},
+	{0x3e11, 0x07},
+	{0x3e13, 0x06},
+	{0x3e15, 0x05},
+	{0x3e17, 0x04},
+	{0x3e18, 0x38},
+	{0x3e19, 0x38},
+	{0x3e1a, 0x13},
+	{0x3e1b, 0x30},
+	{0x3e1c, 0x07},
+	{0x3e1d, 0x06},
+	{0x3e1e, 0x05},
+	{0x3e1f, 0x04},
+	{0x3e20, 0x0f},
+	{0x3e21, 0x0f},
+	{0x3e22, 0x0f},
+	{0x3e23, 0x0f},
+	{0x3e24, 0x0f},
+	{0x3e25, 0x0f},
+	{0x3e26, 0x0f},
+	{0x3e27, 0x0f},
+	{0x3e28, 0x07},
+	{0x3e29, 0x07},
+	{0x3e2a, 0x07},
+	{0x3e2b, 0x02},
+	{0x3e2c, 0x07},
+	{0x3e2d, 0x07},
+	{0x3e30, 0x07},
+	{0x3e3a, 0x02},
+	{0x3e3b, 0xdf},
+	{0x3e3c, 0xff},
+	{0x3e3d, 0x44},
+	{0x3e3e, 0x00},
+	{0x3e3f, 0x00},
+	{0x3e40, 0xc1},
+	{0x3e42, 0x54},
+	{0x3e43, 0x54},
+	{0x3e44, 0x54},
+	{0x3e45, 0x54},
+	{0x3f00, 0x10},
+	{0x3f01, 0x26},
+	{0x3f03, 0x40},
+	{0x4002, 0xf3},
+	{0x4009, 0x02},
+	{0x400e, 0xc6},
+	{0x400f, 0x00},
+	{0x4010, 0x38},
+	{0x4011, 0x01},
+	{0x4012, 0x0d},
+	{0x4015, 0x04},
+	{0x4016, 0x23},
+	{0x4017, 0x00},
+	{0x4018, 0x07},
+	{0x401a, 0x40},
+	{0x401e, 0x00},
+	{0x401f, 0xcc},
+	{0x4020, 0x04},
+	{0x4021, 0x00},
+	{0x4022, 0x04},
+	{0x4023, 0x00},
+	{0x4024, 0x04},
+	{0x4025, 0x00},
+	{0x4026, 0x04},
+	{0x4027, 0x00},
+	{0x4028, 0x01},
+	{0x4030, 0x00},
+	{0x4031, 0x00},
+	{0x4032, 0x00},
+	{0x4033, 0x00},
+	{0x4034, 0x00},
+	{0x4035, 0x00},
+	{0x4036, 0x00},
+	{0x4037, 0x00},
+	{0x4040, 0x00},
+	{0x4041, 0x40},
+	{0x4042, 0x00},
+	{0x4043, 0x40},
+	{0x4044, 0x00},
+	{0x4045, 0x40},
+	{0x4046, 0x00},
+	{0x4047, 0x40},
+	{0x4050, 0x00},
+	{0x4051, 0x00},
+	{0x4056, 0x25},
+	{0x4102, 0xf3},
+	{0x4109, 0x02},
+	{0x410e, 0xc6},
+	{0x410f, 0x00},
+	{0x4110, 0x28},
+	{0x4111, 0x01},
+	{0x4112, 0x0d},
+	{0x4115, 0x04},
+	{0x4116, 0x1b},
+	{0x4117, 0x00},
+	{0x4118, 0x07},
+	{0x411a, 0x40},
+	{0x411e, 0x00},
+	{0x411f, 0xcc},
+	{0x4128, 0x01},
+	{0x4156, 0x25},
+	{0x4702, 0xf3},
+	{0x4709, 0x02},
+	{0x470e, 0xc6},
+	{0x470f, 0x00},
+	{0x4710, 0x28},
+	{0x4711, 0x01},
+	{0x4712, 0x0d},
+	{0x4715, 0x04},
+	{0x4716, 0x1b},
+	{0x4717, 0x00},
+	{0x4718, 0x07},
+	{0x471a, 0x40},
+	{0x471e, 0x00},
+	{0x471f, 0xcc},
+	{0x4728, 0x01},
+	{0x4756, 0x25},
+	{0x4301, 0x00},
+	{0x4303, 0x00},
+	{0x4305, 0x00},
+	{0x4307, 0x00},
+	{0x4308, 0x00},
+	{0x430b, 0xff},
+	{0x430d, 0x00},
+	{0x430e, 0x00},
+	{0x4503, 0x0f},
+	{0x4504, 0x82},
+	{0x4508, 0x00},
+	{0x451d, 0x00},
+	{0x451e, 0x00},
+	{0x451f, 0x00},
+	{0x4523, 0x00},
+	{0x4526, 0x00},
+	{0x4527, 0x00},
+	{0x4530, 0x80},
+	{0x4547, 0x06},
+	{0x4640, 0x00},
+	{0x4641, 0x30},
+	{0x4643, 0x00},
+	{0x4645, 0x13},
+	{0x464a, 0x00},
+	{0x464b, 0x30},
+	{0x4680, 0x00},
+	{0x4681, 0x24},
+	{0x4683, 0x00},
+	{0x4800, 0x64},
+	{0x480b, 0x10},
+	{0x480c, 0x80},
+	{0x480e, 0x04},
+	{0x480f, 0x32},
+	{0x4826, 0x32},
+	{0x4833, 0x18},
+	{0x4837, 0x06},
+	{0x484b, 0x27},
+	{0x4850, 0x47},
+	{0x4853, 0x04},
+	{0x4860, 0x00},
+	{0x4861, 0xec},
+	{0x4862, 0x04},
+	{0x4883, 0x00},
+	{0x4885, 0x10},
+	{0x4888, 0x10},
+	{0x4889, 0x03},
+	{0x4d00, 0x04},
+	{0x4d01, 0x8f},
+	{0x4d02, 0xb9},
+	{0x4d03, 0xc1},
+	{0x4d04, 0xb6},
+	{0x4d05, 0x7e},
+	{0x5000, 0xfb},
+	{0x5001, 0xdb},
+	{0x5002, 0x15},
+	{0x5003, 0x01},
+	{0x5007, 0x1e},
+	{0x5008, 0x00},
+	{0x5009, 0x00},
+	{0x500a, 0x00},
+	{0x500b, 0x30},
+	{0x500c, 0x12},
+	{0x500d, 0x1f},
+	{0x500e, 0x0a},
+	{0x500f, 0x0f},
+	{0x504b, 0x40},
+	{0x5081, 0x00},
+	{0x50c4, 0xaa},
+	{0x50d0, 0x00},
+	{0x50d1, 0x10},
+	{0x50d2, 0x01},
+	{0x50d3, 0xb3},
+	{0x515a, 0x06},
+	{0x515b, 0x06},
+	{0x515c, 0x02},
+	{0x515d, 0x02},
+	{0x515e, 0x02},
+	{0x515f, 0x06},
+	{0x5160, 0x0a},
+	{0x5161, 0x0e},
+	{0x5180, 0x09},
+	{0x5181, 0x10},
+	{0x5182, 0x05},
+	{0x5183, 0x20},
+	{0x5184, 0x00},
+	{0x5185, 0x08},
+	{0x5186, 0x00},
+	{0x5187, 0x00},
+	{0x5188, 0x09},
+	{0x5189, 0x00},
+	{0x518a, 0x05},
+	{0x518b, 0x20},
+	{0x518d, 0x09},
+	{0x5192, 0x00},
+	{0x5193, 0x30},
+	{0x51d2, 0x10},
+	{0x51da, 0x00},
+	{0x51db, 0x30},
+	{0x5250, 0xec},
+	{0x5251, 0x00},
+	{0x5252, 0x10},
+	{0x5254, 0x00},
+	{0x5255, 0x72},
+	{0x5256, 0x00},
+	{0x5257, 0xca},
+	{0x5258, 0x12},
+	{0x5259, 0x20},
+	{0x525a, 0x0a},
+	{0x525b, 0x40},
+	{0x525e, 0x00},
+	{0x525f, 0x30},
+	{0x5260, 0x00},
+	{0x5261, 0x10},
+	{0x5262, 0x00},
+	{0x5263, 0x10},
+	{0x5264, 0x12},
+	{0x5265, 0x00},
+	{0x5266, 0x0a},
+	{0x5267, 0x20},
+	{0x5268, 0x00},
+	{0x5269, 0x00},
+	{0x526a, 0x00},
+	{0x526b, 0x00},
+	{0x526c, 0x12},
+	{0x526d, 0x10},
+	{0x526e, 0x0a},
+	{0x526f, 0x30},
+	{0x5278, 0x10},
+	{0x5279, 0x20},
+	{0x527a, 0x01},
+	{0x527b, 0x01},
+	{0x527c, 0x0c},
+	{0x527d, 0x0c},
+	{0x527e, 0x04},
+	{0x527f, 0x04},
+	{0x5280, 0x04},
+	{0x5281, 0x0c},
+	{0x5282, 0x14},
+	{0x5283, 0x1c},
+	{0x5381, 0x00},
+	{0x53c4, 0xaa},
+	{0x545a, 0x06},
+	{0x545b, 0x06},
+	{0x545c, 0x02},
+	{0x545d, 0x02},
+	{0x545e, 0x02},
+	{0x545f, 0x06},
+	{0x5460, 0x0a},
+	{0x5461, 0x0e},
+	{0x5480, 0x09},
+	{0x5481, 0x10},
+	{0x5482, 0x05},
+	{0x5483, 0x20},
+	{0x5484, 0x00},
+	{0x5485, 0x08},
+	{0x5486, 0x00},
+	{0x5487, 0x00},
+	{0x5488, 0x09},
+	{0x5489, 0x00},
+	{0x548a, 0x05},
+	{0x548b, 0x20},
+	{0x548d, 0x09},
+	{0x54d2, 0x10},
+	{0x54da, 0x00},
+	{0x54da, 0x00},
+	{0x54db, 0x30},
+	{0x54db, 0x30},
+	{0x5550, 0xec},
+	{0x5551, 0x00},
+	{0x5552, 0x10},
+	{0x5554, 0x00},
+	{0x5555, 0x72},
+	{0x5556, 0x00},
+	{0x5557, 0xca},
+	{0x5558, 0x12},
+	{0x5559, 0x10},
+	{0x555a, 0x0a},
+	{0x555b, 0x30},
+	{0x555e, 0x00},
+	{0x555f, 0x30},
+	{0x5560, 0x00},
+	{0x5561, 0x00},
+	{0x5562, 0x00},
+	{0x5563, 0x08},
+	{0x5564, 0x12},
+	{0x5565, 0x10},
+	{0x5566, 0x0a},
+	{0x5567, 0x30},
+	{0x5568, 0x00},
+	{0x5569, 0x00},
+	{0x556a, 0x00},
+	{0x556b, 0x00},
+	{0x556c, 0x12},
+	{0x556d, 0x10},
+	{0x556e, 0x0a},
+	{0x556f, 0x30},
+	{0x557c, 0x06},
+	{0x557d, 0x06},
+	{0x557e, 0x02},
+	{0x557f, 0x02},
+	{0x5580, 0x02},
+	{0x5581, 0x06},
+	{0x5582, 0x0a},
+	{0x5583, 0x0e},
+	{0x5681, 0x00},
+	{0x56c4, 0xaa},
+	{0x575a, 0x06},
+	{0x575b, 0x06},
+	{0x575c, 0x02},
+	{0x575d, 0x02},
+	{0x575e, 0x02},
+	{0x575f, 0x06},
+	{0x5760, 0x0a},
+	{0x5761, 0x0e},
+	{0x5780, 0x09},
+	{0x5781, 0x10},
+	{0x5782, 0x05},
+	{0x5783, 0x20},
+	{0x5784, 0x00},
+	{0x5785, 0x08},
+	{0x5786, 0x00},
+	{0x5787, 0x00},
+	{0x5788, 0x09},
+	{0x5789, 0x00},
+	{0x578a, 0x05},
+	{0x578b, 0x20},
+	{0x578d, 0x09},
+	{0x5792, 0x00},
+	{0x5793, 0x30},
+	{0x57d2, 0x10},
+	{0x57da, 0x00},
+	{0x57db, 0x30},
+	{0x5850, 0xec},
+	{0x5851, 0x00},
+	{0x5852, 0x10},
+	{0x5854, 0x00},
+	{0x5855, 0x72},
+	{0x5856, 0x00},
+	{0x5857, 0xca},
+	{0x5858, 0x12},
+	{0x5859, 0x10},
+	{0x585a, 0x0a},
+	{0x585b, 0x30},
+	{0x585e, 0x00},
+	{0x585f, 0x30},
+	{0x5860, 0x00},
+	{0x5861, 0x00},
+	{0x5862, 0x00},
+	{0x5863, 0x08},
+	{0x5864, 0x12},
+	{0x5865, 0x10},
+	{0x5866, 0x0a},
+	{0x5867, 0x30},
+	{0x5868, 0x00},
+	{0x5869, 0x00},
+	{0x586a, 0x00},
+	{0x586b, 0x00},
+	{0x586c, 0x12},
+	{0x586d, 0x10},
+	{0x586e, 0x0a},
+	{0x586f, 0x30},
+	{0x587c, 0x06},
+	{0x587d, 0x06},
+	{0x587e, 0x02},
+	{0x587f, 0x02},
+	{0x5880, 0x02},
+	{0x5881, 0x06},
+	{0x5882, 0x0a},
+	{0x5883, 0x0e},
+	{0x5f06, 0x10},
+	{0x5f07, 0x20},
+	{0x5f08, 0x0c},
+	{0x5f09, 0x0c},
+	{0x5f0a, 0x04},
+	{0x5f0b, 0x04},
+	{0x5f0c, 0x04},
+	{0x5f0d, 0x0c},
+	{0x5f0e, 0x14},
+	{0x5f0f, 0x1c},
+	{0x5f10, 0x01},
+	{0x5f11, 0x01},
+	{0x5f18, 0x12},
+	{0x5f19, 0x20},
+	{0x5f1a, 0x0a},
+	{0x5f1b, 0x40},
+	{0x5f1d, 0x10},
+	{0x5f1f, 0x10},
+	{0x5f20, 0x12},
+	{0x5f21, 0x00},
+	{0x5f22, 0x0a},
+	{0x5f23, 0x20},
+	{0x5f25, 0x09},
+	{0x5f2a, 0x00},
+	{0x5f2b, 0x30},
+	{0x6600, 0x00},
+	{0x6601, 0x00},
+	{0x6602, 0x00},
+	{0x6603, 0x83},
+	{0x6960, 0x0f},
+	{0x69a2, 0x09},
+	{0x69a3, 0x00},
+	{0x69a6, 0x05},
+	{0x69a7, 0x10},
+	{0x69aa, 0x09},
+	{0x69ab, 0x00},
+	{0x69ae, 0x05},
+	{0x69af, 0x10},
+	{0x69b2, 0x09},
+	{0x69b3, 0x00},
+	{0x69b6, 0x05},
+	{0x69b7, 0x10},
+	{0x69ba, 0x09},
+	{0x69bb, 0x00},
+	{0x69be, 0x05},
+	{0x69bf, 0x10},
+	{0x6a24, 0x09},
+	{0x6a25, 0x00},
+	{0x6a2a, 0x05},
+	{0x6a2b, 0x10},
+	{0x6a61, 0x40},
+	{0x6a64, 0x09},
+	{0x6a65, 0x00},
+	{0x6a6a, 0x05},
+	{0x6a6b, 0x10},
+	{0x6a23, 0x00},
+	{0x6a27, 0x00},
+	{0x6a63, 0x00},
+	{0x6a67, 0x00},
+	{0x69a1, 0x00},
+	{0x69a5, 0x00},
+	{0x69a9, 0x00},
+	{0x69ad, 0x00},
+	{0x69b1, 0x00},
+	{0x69b5, 0x00},
+	{0x69b9, 0x00},
+	{0x69bd, 0x00},
+	{0xfff4, 0x01},
+	{0xfff6, 0x00},
+	{0x0361, 0x07},
+	{0x3644, 0x20},
+	{0x50d4, 0x00},
+	{0x5a02, 0x0f},
+	{0x5002, 0x55},
+	{0x5331, 0x0a},
+	{0x5332, 0x43},
+	{0x5333, 0x45},
+	{0x5284, 0x03},
+	{0x5285, 0x02},
+	{0x5286, 0x02},
+	{0x5287, 0x03},
+	{0x5f15, 0xeb},
+	{0x5290, 0x00},
+	{0x5291, 0x50},
+	{0x5292, 0x00},
+	{0x5293, 0x50},
+	{0x5294, 0x00},
+	{0x5295, 0x50},
+	{0x5296, 0x00},
+	{0x5297, 0x50},
+	{0x5298, 0x00},
+	{0x5299, 0x50},
+	{0x529a, 0x01},
+	{0x529b, 0x00},
+	{0x529c, 0x01},
+	{0x529d, 0x00},
+	{0x529e, 0x00},
+	{0x529f, 0x50},
+	{0x52a0, 0x00},
+	{0x52a1, 0x50},
+	{0x52a2, 0x01},
+	{0x52a3, 0x00},
+	{0x52a4, 0x01},
+	{0x52a5, 0x00},
+	{0x52a6, 0x00},
+	{0x52a7, 0x50},
+	{0x52a8, 0x00},
+	{0x52a9, 0x50},
+	{0x52aa, 0x00},
+	{0x52ab, 0x50},
+	{0x52ac, 0x00},
+	{0x52ad, 0x50},
+	{0x52ae, 0x00},
+	{0x52af, 0x50},
+	{0x52b0, 0x00},
+	{0x52b1, 0x50},
+	{0x52b2, 0x00},
+	{0x52b3, 0x50},
+	{0x52b4, 0x00},
+	{0x52b5, 0x50},
+	{0x52b6, 0x00},
+	{0x52b7, 0x50},
+	{0x52b8, 0x00},
+	{0x52b9, 0x50},
+	{0x52ba, 0x01},
+	{0x52bb, 0x00},
+	{0x52bc, 0x01},
+	{0x52bd, 0x00},
+	{0x52be, 0x00},
+	{0x52bf, 0x50},
+	{0x52c0, 0x00},
+	{0x52c1, 0x50},
+	{0x52c2, 0x01},
+	{0x52c3, 0x00},
+	{0x52c4, 0x01},
+	{0x52c5, 0x00},
+	{0x52c6, 0x00},
+	{0x52c7, 0x50},
+	{0x52c8, 0x00},
+	{0x52c9, 0x50},
+	{0x52ca, 0x00},
+	{0x52cb, 0x50},
+	{0x52cc, 0x00},
+	{0x52cd, 0x50},
+	{0x52ce, 0x00},
+	{0x52cf, 0x50},
+	{0x5f00, 0x29},
+	{0x5f2d, 0x28},
+	{0x5f2e, 0x28},
+	{0x52f0, 0x04},
+	{0x52f1, 0x03},
+	{0x52f2, 0x02},
+	{0x52f3, 0x01},
+	{0x52f4, 0x08},
+	{0x52f5, 0x07},
+	{0x52f6, 0x06},
+	{0x52f7, 0x05},
+	{0x52f8, 0x0c},
+	{0x52f9, 0x0b},
+	{0x52fa, 0x0a},
+	{0x52fb, 0x09},
+	{0x52fc, 0x10},
+	{0x52fd, 0x0f},
+	{0x52fe, 0x0e},
+	{0x52ff, 0x0d},
+	{0x5300, 0x14},
+	{0x5301, 0x13},
+	{0x5302, 0x12},
+	{0x5303, 0x11},
+	{0x5304, 0x18},
+	{0x5305, 0x17},
+	{0x5306, 0x16},
+	{0x5307, 0x15},
+	{0x5308, 0x1c},
+	{0x5309, 0x1b},
+	{0x530a, 0x1a},
+	{0x530b, 0x19},
+	{0x530c, 0x20},
+	{0x530d, 0x1f},
+	{0x530e, 0x1e},
+	{0x530f, 0x1d},
+	{0x5353, 0x21},
+	{0x5354, 0x01},
+	{0x5355, 0x02},
+	{0x5356, 0x04},
+	{0x5357, 0x06},
+	{0x5358, 0x08},
+	{0x5359, 0x0c},
+	{0x535a, 0x10},
+	{0x535b, 0x10},
+	{0x5990, 0x00},
+	{0x5991, 0x00},
+	{0x5992, 0x01},
+	{0x5993, 0x01},
+	{0x5994, 0x02},
+	{0x5995, 0x04},
+	{0x5996, 0x06},
+	{0x5997, 0x08},
+	{0x5998, 0x0a},
+	{0x5999, 0x0c},
+	{0x599a, 0x0e},
+	{0x599b, 0x10},
+	{0x599c, 0x12},
+	{0x599d, 0x14},
+	{0x599e, 0x16},
+	{0x599f, 0x18},
+	{0x3222, 0x03},
+	{0x3208, 0x06},
+	{0x3938, 0x41},
+	{0x393b, 0x41},
+	{0x3208, 0x16},
+	{0x3208, 0x07},
+	{0x3938, 0x43},
+	{0x393b, 0x44},
+	{0x3208, 0x17},
+	{0x3208, 0x08},
+	{0x3938, 0x45},
+	{0x393b, 0x46},
+	{0x3208, 0x18},
+	{0x3208, 0x09},
+	{0x3938, 0x4b},
+	{0x393b, 0x4b},
+	{0x3208, 0x19},
+	{0x5000, 0x29},
+	{0x5001, 0xd1},
+	//{0x0100, 0x01},
+	{REG_NULL, 0x00},
+};
+
+static const struct os12d40_mode supported_modes_4lane[] = {
+	{
+		.width = 3840,
+		.height = 2160,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x0ad0,
+		.hts_def = 0x438 * 4,
+		.vts_def = 0x0ae0,
+		.reg_list = os12d40_3840x2160_regs_4lane,
+	},
+};
+
+static const struct os12d40_mode *supported_modes;
+
+static const s64 link_freq_menu_items[] = {
+	MIPI_FREQ
+};
+
+/* Write registers up to 4 at a time */
+static int os12d40_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, "%s(%d) enter!\n", __func__, __LINE__);
+	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) {
+		dev_err(&client->dev,
+			"write reg(0x%x val:0x%x)failed !\n", reg, val);
+		return -EIO;
+	}
+	return 0;
+}
+
+static int os12d40_write_array(struct i2c_client *client,
+			       const struct regval *regs)
+{
+	int i, delay_ms, ret = 0;
+
+	for (i = 0; ret == 0 && regs[i].addr != REG_NULL; i++) {
+		if (regs[i].addr == DELAY_MS) {
+			delay_ms = regs[i].val;
+			dev_info(&client->dev, "delay(%d) ms !\n", delay_ms);
+			usleep_range(1000 * delay_ms, 1000 * delay_ms + 100);
+			continue;
+		}
+		ret = os12d40_write_reg(client, regs[i].addr,
+					OS12D40_REG_VALUE_08BIT, regs[i].val);
+		if (ret)
+			dev_err(&client->dev, "%s failed !\n", __func__);
+	}
+	return ret;
+}
+
+/* Read registers up to 4 at a time */
+static int os12d40_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 *)&reg_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;
+}
+
+/* Check Register value */
+#ifdef CHECK_REG_VALUE
+static int os12d40_reg_verify(struct i2c_client *client,
+			      const struct regval *regs)
+{
+	u32 i;
+	int ret = 0;
+	u32 value;
+
+	for (i = 0; ret == 0 && regs[i].addr != REG_NULL; i++) {
+		ret = os12d40_read_reg(client, regs[i].addr,
+			  OS12D40_REG_VALUE_08BIT, &value);
+		if (value != regs[i].val) {
+			dev_info(&client->dev,
+				 "%s: 0x%04x is 0x%x instead of 0x%x\n",
+				 __func__, regs[i].addr, value, regs[i].val);
+		}
+	}
+	return ret;
+}
+#endif
+
+static int os12d40_get_reso_dist(const struct os12d40_mode *mode,
+				 struct v4l2_mbus_framefmt *framefmt)
+{
+	return abs(mode->width - framefmt->width) +
+	       abs(mode->height - framefmt->height);
+}
+
+static const struct os12d40_mode *
+os12d40_find_best_fit(struct os12d40 *os12d40,
+			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 < os12d40->cfg_num; i++) {
+		dist = os12d40_get_reso_dist(&supported_modes[i], framefmt);
+		if (cur_best_fit_dist == -1 || dist < cur_best_fit_dist) {
+			cur_best_fit_dist = dist;
+			cur_best_fit = i;
+		}
+	}
+
+	return &supported_modes[cur_best_fit];
+}
+
+static int os12d40_set_fmt(struct v4l2_subdev *sd,
+			   struct v4l2_subdev_pad_config *cfg,
+			   struct v4l2_subdev_format *fmt)
+{
+	struct os12d40 *os12d40 = to_os12d40(sd);
+	const struct os12d40_mode *mode;
+	s64 h_blank, vblank_def;
+
+	mutex_lock(&os12d40->mutex);
+
+	mode = os12d40_find_best_fit(os12d40, fmt);
+	fmt->format.code = OS12D40_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(&os12d40->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		os12d40->cur_mode = mode;
+		h_blank = mode->hts_def - mode->width;
+		__v4l2_ctrl_modify_range(os12d40->hblank, h_blank,
+					 h_blank, 1, h_blank);
+		vblank_def = mode->vts_def - mode->height;
+		__v4l2_ctrl_modify_range(os12d40->vblank, vblank_def,
+					 OS12D40_VTS_MAX - mode->height,
+					 1, vblank_def);
+	}
+
+	mutex_unlock(&os12d40->mutex);
+
+	return 0;
+}
+
+static int os12d40_get_fmt(struct v4l2_subdev *sd,
+			   struct v4l2_subdev_pad_config *cfg,
+			   struct v4l2_subdev_format *fmt)
+{
+	struct os12d40 *os12d40 = to_os12d40(sd);
+	const struct os12d40_mode *mode = os12d40->cur_mode;
+
+	mutex_lock(&os12d40->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(&os12d40->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		fmt->format.width = mode->width;
+		fmt->format.height = mode->height;
+		fmt->format.code = OS12D40_MEDIA_BUS_FMT;
+		fmt->format.field = V4L2_FIELD_NONE;
+	}
+	mutex_unlock(&os12d40->mutex);
+
+	return 0;
+}
+
+static int os12d40_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 = OS12D40_MEDIA_BUS_FMT;
+
+	return 0;
+}
+
+static int os12d40_enum_frame_sizes(struct v4l2_subdev *sd,
+				    struct v4l2_subdev_pad_config *cfg,
+				    struct v4l2_subdev_frame_size_enum *fse)
+{
+	struct os12d40 *os12d40 = to_os12d40(sd);
+
+	if (fse->index >= os12d40->cfg_num)
+		return -EINVAL;
+
+	if (fse->code != OS12D40_MEDIA_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;
+
+	return 0;
+}
+
+static int os12d40_g_frame_interval(struct v4l2_subdev *sd,
+				    struct v4l2_subdev_frame_interval *fi)
+{
+	struct os12d40 *os12d40 = to_os12d40(sd);
+	const struct os12d40_mode *mode = os12d40->cur_mode;
+
+	mutex_lock(&os12d40->mutex);
+	fi->interval = mode->max_fps;
+	mutex_unlock(&os12d40->mutex);
+
+	return 0;
+}
+
+static void os12d40_get_module_inf(struct os12d40 *os12d40,
+				   struct rkmodule_inf *inf)
+{
+	memset(inf, 0, sizeof(*inf));
+	strscpy(inf->base.sensor, OS12D40_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, os12d40->module_name,
+		sizeof(inf->base.module));
+	strscpy(inf->base.lens, os12d40->len_name, sizeof(inf->base.lens));
+}
+
+static long os12d40_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	struct rkmodule_hdr_cfg *hdr_cfg;
+	struct os12d40 *os12d40 = to_os12d40(sd);
+	long ret = 0;
+	u32 stream = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_HDR_CFG:
+		hdr_cfg = (struct rkmodule_hdr_cfg *)arg;
+		hdr_cfg->esp.mode = HDR_NORMAL_VC;
+		hdr_cfg->hdr_mode = os12d40->cur_mode->hdr_mode;
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr_cfg = (struct rkmodule_hdr_cfg *)arg;
+		if (hdr_cfg->hdr_mode != 0)
+			ret = -1;
+		break;
+	case RKMODULE_GET_MODULE_INFO:
+		os12d40_get_module_inf(os12d40, (struct rkmodule_inf *)arg);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+
+		stream = *((u32 *)arg);
+
+		if (stream)
+			ret = os12d40_write_reg(os12d40->client,
+						OS12D40_REG_CTRL_MODE,
+						OS12D40_REG_VALUE_08BIT,
+						OS12D40_MODE_STREAMING);
+		else
+			ret = os12d40_write_reg(os12d40->client,
+						OS12D40_REG_CTRL_MODE,
+						OS12D40_REG_VALUE_08BIT,
+						OS12D40_MODE_SW_STANDBY);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+
+#ifdef CONFIG_COMPAT
+static long os12d40_compat_ioctl32(struct v4l2_subdev *sd,
+				   unsigned int cmd, unsigned long arg)
+{
+	void __user *up = compat_ptr(arg);
+	struct rkmodule_inf *inf;
+	struct rkmodule_hdr_cfg *hdr;
+	long ret = 0;
+	u32 stream = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = os12d40_ioctl(sd, cmd, hdr);
+		if (!ret) {
+			ret = copy_to_user(up, hdr, sizeof(*hdr));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(hdr);
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		if (copy_from_user(hdr, up, sizeof(*hdr))) {
+			kfree(hdr);
+			return -EFAULT;
+		}
+		os12d40_ioctl(sd, cmd, hdr);
+		kfree(hdr);
+		break;
+	case RKMODULE_GET_MODULE_INFO:
+		inf = kzalloc(sizeof(*inf), GFP_KERNEL);
+		if (!inf) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = os12d40_ioctl(sd, cmd, inf);
+		if (!ret) {
+			ret = copy_to_user(up, inf, sizeof(*inf));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(inf);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		if (copy_from_user(&stream, up, sizeof(u32)))
+			return -EFAULT;
+
+		os12d40_ioctl(sd, cmd, &stream);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+#endif
+
+static int __os12d40_start_stream(struct os12d40 *os12d40)
+{
+	int ret;
+
+	ret = os12d40_write_array(os12d40->client, os12d40->cur_mode->reg_list);
+	if (ret)
+		return ret;
+
+#ifdef CHECK_REG_VALUE
+	usleep_range(10000, 20000);
+	/*  verify default values to make sure everything has */
+	/*  been written correctly as expected */
+	dev_info(&os12d40->client->dev, "%s:Check register value!\n",
+		 __func__);
+	ret = os12d40_reg_verify(os12d40->client, os12d40_3840x2160_regs_4lane);
+	if (ret)
+		return ret;
+
+	ret = os12d40_reg_verify(os12d40->client, os12d40->cur_mode->reg_list);
+	if (ret)
+		return ret;
+#endif
+
+	/* In case these controls are set before streaming */
+	mutex_unlock(&os12d40->mutex);
+	ret = v4l2_ctrl_handler_setup(&os12d40->ctrl_handler);
+	mutex_lock(&os12d40->mutex);
+	if (ret)
+		return ret;
+
+	ret = os12d40_write_reg(os12d40->client, OS12D40_REG_CTRL_MODE,
+				OS12D40_REG_VALUE_08BIT,
+				OS12D40_MODE_STREAMING);
+	return ret;
+}
+
+static int __os12d40_stop_stream(struct os12d40 *os12d40)
+{
+	return os12d40_write_reg(os12d40->client, OS12D40_REG_CTRL_MODE,
+				 OS12D40_REG_VALUE_08BIT,
+				 OS12D40_MODE_SW_STANDBY);
+}
+
+static int os12d40_s_stream(struct v4l2_subdev *sd, int on)
+{
+	struct os12d40 *os12d40 = to_os12d40(sd);
+	struct i2c_client *client = os12d40->client;
+	int ret = 0;
+
+	dev_info(&client->dev, "%s: on: %d, %dx%d@%d\n", __func__, on,
+		 os12d40->cur_mode->width,
+		 os12d40->cur_mode->height,
+		DIV_ROUND_CLOSEST(os12d40->cur_mode->max_fps.denominator,
+				  os12d40->cur_mode->max_fps.numerator));
+
+	mutex_lock(&os12d40->mutex);
+	on = !!on;
+	if (on == os12d40->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 = __os12d40_start_stream(os12d40);
+		if (ret) {
+			v4l2_err(sd, "start stream failed while write regs\n");
+			pm_runtime_put(&client->dev);
+			goto unlock_and_return;
+		}
+	} else {
+		__os12d40_stop_stream(os12d40);
+		pm_runtime_put(&client->dev);
+	}
+
+	os12d40->streaming = on;
+
+unlock_and_return:
+	mutex_unlock(&os12d40->mutex);
+
+	return ret;
+}
+
+static int os12d40_s_power(struct v4l2_subdev *sd, int on)
+{
+	struct os12d40 *os12d40 = to_os12d40(sd);
+	struct i2c_client *client = os12d40->client;
+	int ret = 0;
+
+	mutex_lock(&os12d40->mutex);
+
+	/* If the power state is not modified - no work to do. */
+	if (os12d40->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;
+		}
+
+		ret = os12d40_write_array(os12d40->client, os12d40_3840x2160_regs_4lane);
+		if (ret) {
+			v4l2_err(sd, "could not set init registers\n");
+			pm_runtime_put_noidle(&client->dev);
+			goto unlock_and_return;
+		}
+
+		os12d40->power_on = true;
+		/* export gpio */
+		if (!IS_ERR(os12d40->reset_gpio))
+			gpiod_export(os12d40->reset_gpio, false);
+		if (!IS_ERR(os12d40->pwdn_gpio))
+			gpiod_export(os12d40->pwdn_gpio, false);
+	} else {
+		pm_runtime_put(&client->dev);
+		os12d40->power_on = false;
+	}
+
+unlock_and_return:
+	mutex_unlock(&os12d40->mutex);
+
+	return ret;
+}
+
+/* Calculate the delay in us by clock rate and clock cycles */
+static inline u32 os12d40_cal_delay(u32 cycles)
+{
+	return DIV_ROUND_UP(cycles, OS12D40_XVCLK_FREQ / 1000 / 1000);
+}
+
+static int __os12d40_power_on(struct os12d40 *os12d40)
+{
+	int ret;
+	u32 delay_us;
+	struct device *dev = &os12d40->client->dev;
+
+	if (!IS_ERR(os12d40->power_gpio))
+		gpiod_set_value_cansleep(os12d40->power_gpio, 1);
+
+	usleep_range(1000, 2000);
+
+	if (!IS_ERR_OR_NULL(os12d40->pins_default)) {
+		ret = pinctrl_select_state(os12d40->pinctrl,
+					   os12d40->pins_default);
+		if (ret < 0)
+			dev_err(dev, "could not set pins\n");
+	}
+	ret = clk_set_rate(os12d40->xvclk, OS12D40_XVCLK_FREQ);
+	if (ret < 0)
+		dev_warn(dev, "Failed to set xvclk rate (24MHz)\n");
+	if (clk_get_rate(os12d40->xvclk) != OS12D40_XVCLK_FREQ)
+		dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n");
+	ret = clk_prepare_enable(os12d40->xvclk);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable xvclk\n");
+		return ret;
+	}
+
+	ret = regulator_bulk_enable(OS12D40_NUM_SUPPLIES, os12d40->supplies);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable regulators\n");
+		goto disable_clk;
+	}
+
+	if (!IS_ERR(os12d40->reset_gpio))
+		gpiod_set_value_cansleep(os12d40->reset_gpio, 1);
+
+	if (!IS_ERR(os12d40->pwdn_gpio))
+		gpiod_set_value_cansleep(os12d40->pwdn_gpio, 1);
+
+	/* export gpio */
+	if (!IS_ERR(os12d40->reset_gpio))
+		gpiod_export(os12d40->reset_gpio, false);
+	if (!IS_ERR(os12d40->pwdn_gpio))
+		gpiod_export(os12d40->pwdn_gpio, false);
+
+	/* 8192 cycles prior to first SCCB transaction */
+	delay_us = os12d40_cal_delay(8192);
+	usleep_range(delay_us, delay_us * 2);
+	usleep_range(10000, 20000);
+	return 0;
+
+disable_clk:
+	clk_disable_unprepare(os12d40->xvclk);
+
+	return ret;
+}
+
+static void __os12d40_power_off(struct os12d40 *os12d40)
+{
+	int ret;
+	struct device *dev = &os12d40->client->dev;
+
+	if (!IS_ERR(os12d40->pwdn_gpio))
+		gpiod_set_value_cansleep(os12d40->pwdn_gpio, 0);
+	clk_disable_unprepare(os12d40->xvclk);
+	if (!IS_ERR(os12d40->reset_gpio))
+		gpiod_set_value_cansleep(os12d40->reset_gpio, 0);
+	if (!IS_ERR_OR_NULL(os12d40->pins_sleep)) {
+		ret = pinctrl_select_state(os12d40->pinctrl,
+					   os12d40->pins_sleep);
+		if (ret < 0)
+			dev_dbg(dev, "could not set pins\n");
+	}
+	if (!IS_ERR(os12d40->power_gpio))
+		gpiod_set_value_cansleep(os12d40->power_gpio, 0);
+
+	regulator_bulk_disable(OS12D40_NUM_SUPPLIES, os12d40->supplies);
+}
+
+static int os12d40_runtime_resume(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct os12d40 *os12d40 = to_os12d40(sd);
+
+	return __os12d40_power_on(os12d40);
+}
+
+static int os12d40_runtime_suspend(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct os12d40 *os12d40 = to_os12d40(sd);
+
+	__os12d40_power_off(os12d40);
+
+	return 0;
+}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static int os12d40_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
+{
+	struct os12d40 *os12d40 = to_os12d40(sd);
+	struct v4l2_mbus_framefmt *try_fmt =
+				v4l2_subdev_get_try_format(sd, fh->pad, 0);
+	const struct os12d40_mode *def_mode = &supported_modes[0];
+
+	mutex_lock(&os12d40->mutex);
+	/* Initialize try_fmt */
+	try_fmt->width = def_mode->width;
+	try_fmt->height = def_mode->height;
+	try_fmt->code = OS12D40_MEDIA_BUS_FMT;
+	try_fmt->field = V4L2_FIELD_NONE;
+
+	mutex_unlock(&os12d40->mutex);
+	/* No crop or compose */
+
+	return 0;
+}
+#endif
+
+static int os12d40_enum_frame_interval(struct v4l2_subdev *sd,
+				       struct v4l2_subdev_pad_config *cfg,
+				       struct v4l2_subdev_frame_interval_enum *fie)
+{
+	struct os12d40 *os12d40 = to_os12d40(sd);
+
+	if (fie->index >= os12d40->cfg_num)
+		return -EINVAL;
+
+	if (fie->code != OS12D40_MEDIA_BUS_FMT)
+		return -EINVAL;
+
+	fie->width = supported_modes[fie->index].width;
+	fie->height = supported_modes[fie->index].height;
+	fie->interval = supported_modes[fie->index].max_fps;
+	return 0;
+}
+
+static int os12d40_g_mbus_config(struct v4l2_subdev *sd,
+				 struct v4l2_mbus_config *config)
+{
+	u32 val = 0;
+
+	val = 1 << (OS12D40_LANES - 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 os12d40_pm_ops = {
+	SET_RUNTIME_PM_OPS(os12d40_runtime_suspend,
+			   os12d40_runtime_resume, NULL)
+};
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static const struct v4l2_subdev_internal_ops os12d40_internal_ops = {
+	.open = os12d40_open,
+};
+#endif
+
+static const struct v4l2_subdev_core_ops os12d40_core_ops = {
+	.s_power = os12d40_s_power,
+	.ioctl = os12d40_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = os12d40_compat_ioctl32,
+#endif
+};
+
+static const struct v4l2_subdev_video_ops os12d40_video_ops = {
+	.s_stream = os12d40_s_stream,
+	.g_frame_interval = os12d40_g_frame_interval,
+	.g_mbus_config = os12d40_g_mbus_config,
+};
+
+static const struct v4l2_subdev_pad_ops os12d40_pad_ops = {
+	.enum_mbus_code = os12d40_enum_mbus_code,
+	.enum_frame_size = os12d40_enum_frame_sizes,
+	.enum_frame_interval = os12d40_enum_frame_interval,
+	.get_fmt = os12d40_get_fmt,
+	.set_fmt = os12d40_set_fmt,
+};
+
+static const struct v4l2_subdev_ops os12d40_subdev_ops = {
+	.core	= &os12d40_core_ops,
+	.video	= &os12d40_video_ops,
+	.pad	= &os12d40_pad_ops,
+};
+
+static int os12d40_set_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct os12d40 *os12d40 = container_of(ctrl->handler,
+					       struct os12d40, ctrl_handler);
+	struct i2c_client *client = os12d40->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 = os12d40->cur_mode->height + ctrl->val - 4;
+		__v4l2_ctrl_modify_range(os12d40->exposure,
+					 os12d40->exposure->minimum, max,
+					 os12d40->exposure->step,
+					 os12d40->exposure->default_value);
+		break;
+	}
+
+	if (!pm_runtime_get_if_in_use(&client->dev))
+		return 0;
+
+	switch (ctrl->id) {
+	case V4L2_CID_EXPOSURE:
+		os12d40_write_reg(os12d40->client, OS12D40_REG_EXPOSURE,
+				  OS12D40_REG_VALUE_16BIT, ctrl->val);
+		break;
+	case V4L2_CID_ANALOGUE_GAIN:
+		if (ctrl->val < 0xf80) {
+			os12d40_write_reg(os12d40->client,
+					  OS12D40_REG_AGAIN_L,
+					  OS12D40_REG_VALUE_16BIT,
+					  ctrl->val);
+			os12d40_write_reg(os12d40->client,
+					  OS12D40_REG_DGAIN_L,
+					  OS12D40_REG_VALUE_24BIT,
+					  0x10000);
+		} else {
+			os12d40_write_reg(os12d40->client,
+					  OS12D40_REG_AGAIN_L,
+					  OS12D40_REG_VALUE_16BIT,
+					  0xf80);
+			os12d40_write_reg(os12d40->client,
+					  OS12D40_REG_DGAIN_L,
+					  OS12D40_REG_VALUE_24BIT,
+					  (ctrl->val * 0x010000) / 0xf80);
+		}
+		break;
+	case V4L2_CID_VBLANK:
+		os12d40_write_reg(os12d40->client, OS12D40_REG_VTS,
+				  OS12D40_REG_VALUE_16BIT,
+				  ctrl->val + os12d40->cur_mode->height);
+		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 os12d40_ctrl_ops = {
+	.s_ctrl = os12d40_set_ctrl,
+};
+
+static int os12d40_initialize_controls(struct os12d40 *os12d40)
+{
+	const struct os12d40_mode *mode;
+	struct v4l2_ctrl_handler *handler;
+	struct v4l2_ctrl *ctrl;
+	s64 exposure_max, vblank_def;
+	u32 h_blank;
+	int ret;
+
+	handler = &os12d40->ctrl_handler;
+	mode = os12d40->cur_mode;
+	ret = v4l2_ctrl_handler_init(handler, 8);
+	if (ret)
+		return ret;
+	handler->lock = &os12d40->mutex;
+
+	ctrl = v4l2_ctrl_new_int_menu(handler, NULL, V4L2_CID_LINK_FREQ,
+				      0, 0, link_freq_menu_items);
+	if (ctrl)
+		ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+
+	v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE,
+			  0, os12d40->pixel_rate, 1, os12d40->pixel_rate);
+	h_blank = mode->hts_def - mode->width;
+	os12d40->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
+					    h_blank, h_blank, 1, h_blank);
+	if (os12d40->hblank)
+		os12d40->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+	vblank_def = mode->vts_def - mode->height;
+	os12d40->vblank = v4l2_ctrl_new_std(handler, &os12d40_ctrl_ops,
+					    V4L2_CID_VBLANK, vblank_def,
+					    OS12D40_VTS_MAX - mode->height,
+					    1, vblank_def);
+	exposure_max = mode->vts_def - 4;
+	os12d40->exposure = v4l2_ctrl_new_std(handler, &os12d40_ctrl_ops,
+					      V4L2_CID_EXPOSURE,
+					      OS12D40_EXPOSURE_MIN,
+					      exposure_max,
+					      OS12D40_EXPOSURE_STEP,
+					      mode->exp_def);
+	os12d40->anal_gain = v4l2_ctrl_new_std(handler, &os12d40_ctrl_ops,
+					       V4L2_CID_ANALOGUE_GAIN,
+					       ANALOG_GAIN_MIN,
+					       ANALOG_GAIN_MAX,
+					       ANALOG_GAIN_STEP,
+					       ANALOG_GAIN_DEFAULT);
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(&os12d40->client->dev,
+			"Failed to init controls(%d)\n", ret);
+		goto err_free_handler;
+	}
+
+	os12d40->subdev.ctrl_handler = handler;
+
+	return 0;
+
+err_free_handler:
+	v4l2_ctrl_handler_free(handler);
+
+	return ret;
+}
+
+static int os12d40_check_sensor_id(struct os12d40 *os12d40,
+				   struct i2c_client *client)
+{
+	struct device *dev = &os12d40->client->dev;
+	u32 id = 0;
+	int ret;
+
+	ret = os12d40_read_reg(client, OS12D40_REG_CHIP_ID,
+			       OS12D40_REG_VALUE_24BIT, &id);
+	if (id != CHIP_ID) {
+		dev_err(dev, "Unexpected sensor id(%06x), ret(%d)\n", id, ret);
+		return -ENODEV;
+	}
+
+	dev_info(dev, "Detected OV%06x sensor\n", CHIP_ID);
+
+	return 0;
+}
+
+static int os12d40_configure_regulators(struct os12d40 *os12d40)
+{
+	unsigned int i;
+
+	for (i = 0; i < OS12D40_NUM_SUPPLIES; i++)
+		os12d40->supplies[i].supply = os12d40_supply_names[i];
+
+	return devm_regulator_bulk_get(&os12d40->client->dev,
+				       OS12D40_NUM_SUPPLIES,
+				       os12d40->supplies);
+}
+
+static int os12d40_parse_of(struct os12d40 *os12d40)
+{
+	struct device *dev = &os12d40->client->dev;
+	struct device_node *endpoint;
+	struct fwnode_handle *fwnode;
+	int rval;
+
+	endpoint = of_graph_get_next_endpoint(dev->of_node, NULL);
+	if (!endpoint) {
+		dev_err(dev, "Failed to get endpoint\n");
+		return -EINVAL;
+	}
+	fwnode = of_fwnode_handle(endpoint);
+	rval = fwnode_property_read_u32_array(fwnode, "data-lanes", NULL, 0);
+	if (rval <= 0) {
+		dev_warn(dev, " Get mipi lane num failed!\n");
+		return -1;
+	}
+
+	os12d40->lane_num = rval;
+	if (os12d40->lane_num == 4) {
+		os12d40->cur_mode = &supported_modes_4lane[0];
+		supported_modes = supported_modes_4lane;
+		os12d40->cfg_num = ARRAY_SIZE(supported_modes_4lane);
+
+		/* pixel rate = link frequency * 2 * lanes / BITS_PER_SAMPLE */
+		os12d40->pixel_rate = MIPI_FREQ * 2U * os12d40->lane_num / 8U;
+		dev_info(dev, "lane_num(%d)  pixel_rate(%u)\n",
+			 os12d40->lane_num, os12d40->pixel_rate);
+	} else {
+		dev_err(dev, "unsupported lane_num(%d)\n", os12d40->lane_num);
+		return -1;
+	}
+
+	return 0;
+}
+
+static int os12d40_probe(struct i2c_client *client,
+			const struct i2c_device_id *id)
+{
+	struct device *dev = &client->dev;
+	struct device_node *node = dev->of_node;
+	struct os12d40 *os12d40;
+	struct v4l2_subdev *sd;
+	char facing[2] = "b";
+	int ret;
+
+	dev_info(dev, "driver version: %02x.%02x.%02x",
+		 DRIVER_VERSION >> 16,
+		 (DRIVER_VERSION & 0xff00) >> 8,
+		 DRIVER_VERSION & 0x00ff);
+
+	os12d40 = devm_kzalloc(dev, sizeof(*os12d40), GFP_KERNEL);
+	if (!os12d40)
+		return -ENOMEM;
+
+	ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
+				   &os12d40->module_index);
+	if (ret) {
+		dev_warn(dev, "could not get module index!\n");
+		os12d40->module_index = 0;
+	}
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
+				       &os12d40->module_facing);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME,
+				       &os12d40->module_name);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME,
+				       &os12d40->len_name);
+	if (ret) {
+		dev_err(dev, "could not get module information!\n");
+		return -EINVAL;
+	}
+
+	os12d40->client = client;
+
+	os12d40->xvclk = devm_clk_get(dev, "xvclk");
+	if (IS_ERR(os12d40->xvclk)) {
+		dev_err(dev, "Failed to get xvclk\n");
+		return -EINVAL;
+	}
+
+	os12d40->power_gpio = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW);
+	if (IS_ERR(os12d40->power_gpio))
+		dev_warn(dev, "Failed to get power-gpios, maybe no use\n");
+
+	os12d40->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+	if (IS_ERR(os12d40->reset_gpio))
+		dev_warn(dev, "Failed to get reset-gpios, maybe no use\n");
+
+	os12d40->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW);
+	if (IS_ERR(os12d40->pwdn_gpio))
+		dev_warn(dev, "Failed to get pwdn-gpios\n");
+
+	ret = os12d40_configure_regulators(os12d40);
+	if (ret) {
+		dev_err(dev, "Failed to get power regulators\n");
+		return ret;
+	}
+	ret = os12d40_parse_of(os12d40);
+	if (ret != 0)
+		return -EINVAL;
+
+	os12d40->pinctrl = devm_pinctrl_get(dev);
+	if (!IS_ERR(os12d40->pinctrl)) {
+		os12d40->pins_default =
+			pinctrl_lookup_state(os12d40->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_DEFAULT);
+		if (IS_ERR(os12d40->pins_default))
+			dev_err(dev, "could not get default pinstate\n");
+
+		os12d40->pins_sleep =
+			pinctrl_lookup_state(os12d40->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_SLEEP);
+		if (IS_ERR(os12d40->pins_sleep))
+			dev_err(dev, "could not get sleep pinstate\n");
+	}
+
+	mutex_init(&os12d40->mutex);
+
+	sd = &os12d40->subdev;
+	v4l2_i2c_subdev_init(sd, client, &os12d40_subdev_ops);
+	ret = os12d40_initialize_controls(os12d40);
+	if (ret)
+		goto err_destroy_mutex;
+
+	ret = __os12d40_power_on(os12d40);
+	if (ret)
+		goto err_free_handler;
+
+	ret = os12d40_check_sensor_id(os12d40, client);
+	if (ret < 0) {
+		dev_info(&client->dev, "%s(%d) Check id  failed,\n"
+			 "check following information:\n"
+			 "Power/PowerDown/Reset/Mclk/I2cBus !!\n",
+			 __func__, __LINE__);
+		goto err_power_off;
+	}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+	sd->internal_ops = &os12d40_internal_ops;
+	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
+		     V4L2_SUBDEV_FL_HAS_EVENTS;
+#endif
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	os12d40->pad.flags = MEDIA_PAD_FL_SOURCE;
+	sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
+	ret = media_entity_pads_init(&sd->entity, 1, &os12d40->pad);
+	if (ret < 0)
+		goto err_power_off;
+#endif
+
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(os12d40->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s",
+		 os12d40->module_index, facing,
+		 OS12D40_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:
+	__os12d40_power_off(os12d40);
+err_free_handler:
+	v4l2_ctrl_handler_free(&os12d40->ctrl_handler);
+err_destroy_mutex:
+	mutex_destroy(&os12d40->mutex);
+
+	return ret;
+}
+
+static int os12d40_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct os12d40 *os12d40 = to_os12d40(sd);
+
+	v4l2_async_unregister_subdev(sd);
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	media_entity_cleanup(&sd->entity);
+#endif
+	v4l2_ctrl_handler_free(&os12d40->ctrl_handler);
+	mutex_destroy(&os12d40->mutex);
+
+	pm_runtime_disable(&client->dev);
+	if (!pm_runtime_status_suspended(&client->dev))
+		__os12d40_power_off(os12d40);
+	pm_runtime_set_suspended(&client->dev);
+
+	return 0;
+}
+
+#if IS_ENABLED(CONFIG_OF)
+static const struct of_device_id os12d40_of_match[] = {
+	{ .compatible = "ovti,os12d40" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, os12d40_of_match);
+#endif
+
+static const struct i2c_device_id os12d40_match_id[] = {
+	{ "ovti,os12d40", 0 },
+	{ },
+};
+
+static struct i2c_driver os12d40_i2c_driver = {
+	.driver = {
+		.name = OS12D40_NAME,
+		.pm = &os12d40_pm_ops,
+		.of_match_table = of_match_ptr(os12d40_of_match),
+	},
+	.probe		= &os12d40_probe,
+	.remove		= &os12d40_remove,
+	.id_table	= os12d40_match_id,
+};
+
+static int __init sensor_mod_init(void)
+{
+	return i2c_add_driver(&os12d40_i2c_driver);
+}
+
+static void __exit sensor_mod_exit(void)
+{
+	i2c_del_driver(&os12d40_i2c_driver);
+}
+
+device_initcall_sync(sensor_mod_init);
+module_exit(sensor_mod_exit);
+
+MODULE_DESCRIPTION("OmniVision os12d40 sensor driver");
+MODULE_LICENSE("GPL v2");

commit 807f68388e2571c51e876d3c435d80020ba7ee29
Author: Su Yuefu <yuefu.su@rock-chips.com>
Date:   Thu Oct 28 21:49:47 2021 +0800

    media: i2c: add jx_f37p sensor driver
    
    Signed-off-by: Su Yuefu <yuefu.su@rock-chips.com>
    Change-Id: I05b3269a9f9da1373eea83f2a9983c9a24e0a15c

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index cb75b42bf06e..fd901066673a 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -1708,6 +1708,17 @@ config VIDEO_JX_F37
 	  To compile this driver as a module, choose M here: the
 	  module will be called jx_f37.
 
+config VIDEO_JX_F37P
+	tristate "SOI JX_F37P sensor support"
+	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
+	depends on MEDIA_CAMERA_SUPPORT
+	select V4L2_FWNODE
+	help
+	  Support for the SOI JX_F37P sensor.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called jx_f37p.
+
 config VIDEO_JX_H62
 	tristate "SOI JX_H62 sensor support"
 	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index 0414c47621ea..6ba262470447 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -185,6 +185,7 @@ obj-$(CONFIG_VIDEO_GC5035)	+= gc5035.o
 obj-$(CONFIG_VIDEO_GC8034)	+= gc8034.o
 obj-$(CONFIG_VIDEO_BF3925)	+= bf3925.o
 obj-$(CONFIG_VIDEO_JX_F37)	+= jx_f37.o
+obj-$(CONFIG_VIDEO_JX_F37P)	+= jx_f37p.o
 obj-$(CONFIG_VIDEO_JX_H62)	+= jx_h62.o
 obj-$(CONFIG_VIDEO_JX_H65)	+= jx_h65.o
 obj-$(CONFIG_VIDEO_JX_K04)	+= jx_k04.o
diff --git a/drivers/media/i2c/jx_f37p.c b/drivers/media/i2c/jx_f37p.c
new file mode 100644
index 000000000000..c39ca37fad90
--- /dev/null
+++ b/drivers/media/i2c/jx_f37p.c
@@ -0,0 +1,1283 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * jx_f37pp driver
+ *
+ * Copyright (C) 2021 Rockchip Electronics Co., Ltd.
+ *
+ * V0.0X01.0X01 init version.
+ */
+
+#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/of.h>
+#include <linux/of_graph.h>
+#include <linux/regulator/consumer.h>
+#include <linux/sysfs.h>
+#include <linux/pinctrl/consumer.h>
+#include <media/media-entity.h>
+#include <media/v4l2-async.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-fwnode.h>
+#include <media/v4l2-subdev.h>
+#include <linux/version.h>
+#include <linux/rk-camera-module.h>
+
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x01)
+
+#ifndef V4L2_CID_DIGITAL_GAIN
+#define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
+#endif
+
+#define JX_F37P_PIXEL_RATE			(36000000)
+#define JX_F37P_XVCLK_FREQ		24000000
+
+#define CHIP_ID_H			0x08
+#define CHIP_ID_L			0x41
+
+#define JX_F37P_PIDH_ADDR     0x0a
+#define JX_F37P_PIDL_ADDR     0x0b
+
+#define JX_F37P_REG_CTRL_MODE		0x12
+#define JX_F37P_MODE_SW_STANDBY		0x40
+#define JX_F37P_MODE_STREAMING		0x00
+
+#define JX_F37P_AEC_PK_LONG_EXPO_HIGH_REG 0x02	/* Exposure Bits 8-15 */
+#define JX_F37P_AEC_PK_LONG_EXPO_LOW_REG 0x01	/* Exposure Bits 0-7 */
+#define JX_F37P_FETCH_HIGH_BYTE_EXP(VAL) (((VAL) >> 8) & 0xFF)	/* 8-15 Bits */
+#define JX_F37P_FETCH_LOW_BYTE_EXP(VAL) ((VAL) & 0xFF)	/* 0-7 Bits */
+#define	JX_F37P_EXPOSURE_MIN		4
+#define	JX_F37P_EXPOSURE_STEP		1
+#define JX_F37P_VTS_MAX			0xffff
+
+#define JX_F37P_AEC_PK_LONG_GAIN_REG	0x00	/* Bits 0 -7 */
+#define	ANALOG_GAIN_MIN			0x00
+#define	ANALOG_GAIN_MAX			0xf8	/* 15.5 */
+#define	ANALOG_GAIN_STEP		1
+#define	ANALOG_GAIN_DEFAULT		0x10
+
+#define JX_F37P_DIGI_GAIN_L_MASK		0x3f
+#define JX_F37P_DIGI_GAIN_H_SHIFT	6
+#define JX_F37P_DIGI_GAIN_MIN		0
+#define JX_F37P_DIGI_GAIN_MAX		(0x4000 - 1)
+#define JX_F37P_DIGI_GAIN_STEP		1
+#define JX_F37P_DIGI_GAIN_DEFAULT	1024
+
+#define JX_F37P_REG_TEST_PATTERN		0x0c
+#define	JX_F37P_TEST_PATTERN_ENABLE	0x80
+#define	JX_F37P_TEST_PATTERN_DISABLE	0x0
+
+#define JX_F37P_REG_HIGH_VTS			0x23
+#define JX_F37P_REG_LOW_VTS			0X22
+#define JX_F37P_FETCH_HIGH_BYTE_VTS(VAL) (((VAL) >> 8) & 0xFF)	/* 8-15 Bits */
+#define JX_F37P_FETCH_LOW_BYTE_VTS(VAL) ((VAL) & 0xFF)	/* 0-7 Bits */
+
+#define REG_NULL			0xFF
+#define REG_DELAY			0xFE
+
+#define OF_CAMERA_PINCTRL_STATE_DEFAULT	"rockchip,camera_default"
+#define OF_CAMERA_PINCTRL_STATE_SLEEP	"rockchip,camera_sleep"
+#define JX_F37P_NAME			"jx_f37p"
+#define JX_F37P_MEDIA_BUS_FMT		MEDIA_BUS_FMT_SBGGR10_1X10
+
+static const char * const jx_f37p_supply_names[] = {
+	"vcc2v8_dvp",		/* Analog power */
+	"vcc1v8_dvp",		/* Digital I/O power */
+};
+
+#define JX_F37P_NUM_SUPPLIES ARRAY_SIZE(jx_f37p_supply_names)
+
+struct regval {
+	u16 addr;
+	u8 val;
+};
+
+struct jx_f37p_mode {
+	u32 width;
+	u32 height;
+	struct v4l2_fract max_fps;
+	u32 hts_def;
+	u32 vts_def;
+	u32 exp_def;
+	const struct regval *reg_list;
+	u32 hdr_mode;
+};
+
+struct jx_f37p {
+	struct i2c_client	*client;
+	struct clk		*xvclk;
+	struct gpio_desc	*reset_gpio;
+	struct gpio_desc	*pwdn_gpio;
+	struct regulator_bulk_data supplies[JX_F37P_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	*test_pattern;
+	struct mutex		mutex;
+	bool			streaming;
+	bool			power_on;
+	const struct jx_f37p_mode *cur_mode;
+	unsigned int	lane_num;
+	unsigned int	cfg_num;
+	unsigned int	pixel_rate;
+	u32			module_index;
+	const char		*module_facing;
+	const char		*module_name;
+	const char		*len_name;
+	u32		old_gain;
+};
+
+#define to_jx_f37p(sd) container_of(sd, struct jx_f37p, subdev)
+
+/*
+ * Xclk 24Mhz
+ * Pclk 36Mhz
+ * linelength 750(0x2ee)
+ * framelength 1920(0x780)
+ * grabwindow_width 1280
+ * grabwindow_height 720
+ * max_framerate 25fps
+ */
+static const struct regval jx_f37p_1080p_dvp_linear_1lane_30fps[] = {
+	{0x12, 0x40},
+	{0x48, 0x85},
+	{0x48, 0x05},
+	{0x0E, 0x1D},
+	{0x0F, 0x04},
+	{0x10, 0x48},
+	{0x11, 0x80},
+	{0x46, 0x01},
+	{0x47, 0x62},
+	{0x0D, 0xAE},
+	{0x57, 0x6A},
+	{0x58, 0x22},
+	{0x5F, 0x41},
+	{0x60, 0x28},
+	{0xA5, 0xC0},
+	{0x20, 0x00},
+	{0x21, 0x05},
+	{0x22, 0x65},
+	{0x23, 0x04},
+	{0x24, 0xC0},
+	{0x25, 0x38},
+	{0x26, 0x43},
+	{0x27, 0xC6},
+	{0x28, 0x15},
+	{0x29, 0x04},
+	{0x2A, 0xBB},
+	{0x2B, 0x14},
+	{0x2C, 0x02},
+	{0x2D, 0x00},
+	{0x2E, 0x14},
+	{0x2F, 0x04},
+	{0x41, 0xC5},
+	{0x42, 0x33},
+	{0x47, 0x42},
+	{0x76, 0x60},
+	{0x77, 0x09},
+	{0x80, 0x01},
+	{0xAF, 0x22},
+	{0xAB, 0x00},
+	{0x1D, 0xFF},
+	{0x1E, 0x9F},
+	{0x6C, 0xC0},
+	{0x9E, 0xF8},
+	{0x31, 0x10},
+	{0x32, 0x18},
+	{0x33, 0xE8},
+	{0x34, 0x5E},
+	{0x35, 0x5E},
+	{0x3A, 0xAF},
+	{0x3B, 0x00},
+	{0x3C, 0xFF},
+	{0x3D, 0xFF},
+	{0x3E, 0xFF},
+	{0x3F, 0xBB},
+	{0x40, 0xFF},
+	{0x56, 0x92},
+	{0x59, 0xAF},
+	{0x5A, 0x47},
+	{0x61, 0x18},
+	{0x6F, 0x04},
+	{0x85, 0x5F},
+	{0x8A, 0x44},
+	{0x91, 0x13},
+	{0x94, 0xA0},
+	{0x9B, 0x83},
+	{0x9C, 0xE1},
+	{0xA4, 0x80},
+	{0xA6, 0x22},
+	{0xA9, 0x1C},
+	{0x5B, 0xE7},
+	{0x5C, 0x28},
+	{0x5D, 0x67},
+	{0x5E, 0x11},
+	{0x62, 0x21},
+	{0x63, 0x0F},
+	{0x64, 0xD0},
+	{0x65, 0x02},
+	{0x67, 0x49},
+	{0x66, 0x00},
+	{0x68, 0x04},
+	{0x69, 0x72},
+	{0x6A, 0x12},
+	{0x7A, 0x00},
+	{0x82, 0x20},
+	{0x8D, 0x47},
+	{0x8F, 0x90},
+	{0x45, 0x01},
+	{0x97, 0x20},
+	{0x13, 0x81},
+	{0x96, 0x84},
+	{0x4A, 0x01},
+	{0xB1, 0x00},
+	{0xA1, 0x0F},
+	{0xBE, 0x00},
+	{0x7E, 0x48},
+	{0xB5, 0xC0},
+	{0x50, 0x02},
+	{0x49, 0x10},
+	{0x7F, 0x57},
+	{0x90, 0x00},
+	{0x7B, 0x4A},
+	{0x7C, 0x0C},
+	{0x8C, 0xFF},
+	{0x8E, 0x00},
+	{0x8B, 0x01},
+	{0x0C, 0x00},
+	{0xBC, 0x11},
+	{0x19, 0x20},
+	{0x1B, 0x4F},
+	{0x12, 0x00},
+	{0x00, 0x10},
+	{REG_NULL, 0x00},
+};
+
+static const struct jx_f37p_mode supported_modes[] = {
+	{
+		.width = 1920,
+		.height = 1080,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x00ff,
+		.hts_def = 0x0500,
+		.vts_def = 0x0465,
+		.reg_list = jx_f37p_1080p_dvp_linear_1lane_30fps,
+		.hdr_mode = NO_HDR,
+	}
+};
+
+/* Calculate the delay in us by clock rate and clock cycles */
+static inline u32 jx_f37p_cal_delay(u32 cycles)
+{
+	return DIV_ROUND_UP(cycles, JX_F37P_XVCLK_FREQ / 1000 / 1000);
+}
+
+static int jx_f37p_write_reg(struct i2c_client *client, u8 reg, u8 val)
+{
+	struct i2c_msg msg;
+	u8 buf[2];
+	int ret;
+
+	buf[0] = reg & 0xFF;
+	buf[1] = val;
+
+	msg.addr =  client->addr;
+	msg.flags = client->flags;
+	msg.buf = buf;
+	msg.len = sizeof(buf);
+
+	ret = i2c_transfer(client->adapter, &msg, 1);
+	if (ret >= 0)
+		return 0;
+
+	dev_err(&client->dev,
+		"jx_f37p write reg(0x%x val:0x%x) failed !\n", reg, val);
+
+	return ret;
+}
+
+static int jx_f37p_write_array(struct i2c_client *client,
+			       const struct regval *regs)
+{
+	u32 i, delay_us;
+	int ret = 0;
+
+	for (i = 0; ret == 0 && regs[i].addr != REG_NULL; i++) {
+		if (regs[i].addr == REG_DELAY) {
+			delay_us = jx_f37p_cal_delay(500 * 1000);
+			usleep_range(delay_us, delay_us * 2);
+		} else {
+			ret = jx_f37p_write_reg(client,
+						regs[i].addr, regs[i].val);
+		}
+	}
+
+	return ret;
+}
+
+static int jx_f37p_read_reg(struct i2c_client *client, u8 reg, u8 *val)
+{
+	struct i2c_msg msg[2];
+	u8 buf[1];
+	int ret;
+
+	buf[0] = reg & 0xFF;
+
+	msg[0].addr = client->addr;
+	msg[0].flags = client->flags;
+	msg[0].buf = buf;
+	msg[0].len = sizeof(buf);
+
+	msg[1].addr = client->addr;
+	msg[1].flags = client->flags | I2C_M_RD;
+	msg[1].buf = buf;
+	msg[1].len = 1;
+
+	ret = i2c_transfer(client->adapter, msg, 2);
+	if (ret >= 0) {
+		*val = buf[0];
+		return 0;
+	}
+
+	dev_err(&client->dev,
+		"jx_f37p read reg:0x%x failed !\n", reg);
+
+	return ret;
+}
+
+static int jx_f37p_get_reso_dist(const struct jx_f37p_mode *mode,
+				 struct v4l2_mbus_framefmt *framefmt)
+{
+	return abs(mode->width - framefmt->width) +
+	       abs(mode->height - framefmt->height);
+}
+
+static const struct jx_f37p_mode *
+jx_f37p_find_best_fit(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 < ARRAY_SIZE(supported_modes); i++) {
+		dist = jx_f37p_get_reso_dist(&supported_modes[i], framefmt);
+		if (cur_best_fit_dist == -1 || dist < cur_best_fit_dist) {
+			cur_best_fit_dist = dist;
+			cur_best_fit = i;
+		}
+	}
+
+	return &supported_modes[cur_best_fit];
+}
+
+static int jx_f37p_set_fmt(struct v4l2_subdev *sd,
+			   struct v4l2_subdev_pad_config *cfg,
+			   struct v4l2_subdev_format *fmt)
+{
+	struct jx_f37p *jx_f37p = to_jx_f37p(sd);
+	const struct jx_f37p_mode *mode;
+	s64 h_blank, vblank_def;
+
+	mutex_lock(&jx_f37p->mutex);
+
+	mode = jx_f37p_find_best_fit(fmt);
+	fmt->format.code = JX_F37P_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(&jx_f37p->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		jx_f37p->cur_mode = mode;
+		h_blank = mode->hts_def - mode->width;
+		__v4l2_ctrl_modify_range(jx_f37p->hblank, h_blank,
+					 h_blank, 1, h_blank);
+		vblank_def = mode->vts_def - mode->height;
+		__v4l2_ctrl_modify_range(jx_f37p->vblank, vblank_def,
+					 JX_F37P_VTS_MAX - mode->height,
+					 1, vblank_def);
+	}
+
+	mutex_unlock(&jx_f37p->mutex);
+
+	return 0;
+}
+
+static int jx_f37p_get_fmt(struct v4l2_subdev *sd,
+			   struct v4l2_subdev_pad_config *cfg,
+			   struct v4l2_subdev_format *fmt)
+{
+	struct jx_f37p *jx_f37p = to_jx_f37p(sd);
+	const struct jx_f37p_mode *mode = jx_f37p->cur_mode;
+
+	mutex_lock(&jx_f37p->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(&jx_f37p->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		fmt->format.width = mode->width;
+		fmt->format.height = mode->height;
+		fmt->format.code = JX_F37P_MEDIA_BUS_FMT;
+		fmt->format.field = V4L2_FIELD_NONE;
+	}
+	mutex_unlock(&jx_f37p->mutex);
+
+	return 0;
+}
+
+static int jx_f37p_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 = JX_F37P_MEDIA_BUS_FMT;
+
+	return 0;
+}
+
+static int jx_f37p_enum_frame_sizes(struct v4l2_subdev *sd,
+				    struct v4l2_subdev_pad_config *cfg,
+				    struct v4l2_subdev_frame_size_enum *fse)
+{
+	if (fse->index >= ARRAY_SIZE(supported_modes))
+		return -EINVAL;
+
+	if (fse->code != JX_F37P_MEDIA_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;
+
+	return 0;
+}
+
+static int jx_f37p_enable_test_pattern(struct jx_f37p *jx_f37p, u32 pattern)
+{
+	u32 val;
+
+	if (pattern)
+		val = (pattern - 1) | JX_F37P_TEST_PATTERN_ENABLE;
+	else
+		val = JX_F37P_TEST_PATTERN_DISABLE;
+
+	return jx_f37p_write_reg(jx_f37p->client, JX_F37P_REG_TEST_PATTERN, val);
+}
+
+static void jx_f37p_get_module_inf(struct jx_f37p *jx_f37p,
+				   struct rkmodule_inf *inf)
+{
+	memset(inf, 0, sizeof(*inf));
+	strscpy(inf->base.sensor, JX_F37P_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, jx_f37p->module_name,
+		sizeof(inf->base.module));
+	strscpy(inf->base.lens, jx_f37p->len_name, sizeof(inf->base.lens));
+}
+
+static long jx_f37p_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	struct jx_f37p *jx_f37p = to_jx_f37p(sd);
+	struct rkmodule_hdr_cfg *hdr_cfg;
+	long ret = 0;
+	u32 stream = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_HDR_CFG:
+		hdr_cfg = (struct rkmodule_hdr_cfg *)arg;
+		hdr_cfg->esp.mode = HDR_NORMAL_VC;
+		hdr_cfg->hdr_mode = jx_f37p->cur_mode->hdr_mode;
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr_cfg = (struct rkmodule_hdr_cfg *)arg;
+		if (hdr_cfg->hdr_mode != 0)
+			ret = -1;
+		break;
+	case RKMODULE_GET_MODULE_INFO:
+		jx_f37p_get_module_inf(jx_f37p, (struct rkmodule_inf *)arg);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+
+		stream = *((u32 *)arg);
+
+		if (stream)
+			ret = jx_f37p_write_reg(jx_f37p->client,
+						JX_F37P_REG_CTRL_MODE,
+						JX_F37P_MODE_STREAMING);
+		else
+			ret = jx_f37p_write_reg(jx_f37p->client,
+						JX_F37P_REG_CTRL_MODE,
+						JX_F37P_MODE_SW_STANDBY);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+
+#ifdef CONFIG_COMPAT
+static long jx_f37p_compat_ioctl32(struct v4l2_subdev *sd,
+				   unsigned int cmd, unsigned long arg)
+{
+	void __user *up = compat_ptr(arg);
+	struct rkmodule_inf *inf;
+	struct rkmodule_hdr_cfg *hdr;
+	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 = jx_f37p_ioctl(sd, cmd, inf);
+		if (!ret) {
+			ret = copy_to_user(up, inf, sizeof(*inf));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(inf);
+		break;
+
+	case RKMODULE_GET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = jx_f37p_ioctl(sd, cmd, hdr);
+		if (!ret) {
+			ret = copy_to_user(up, hdr, sizeof(*hdr));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(hdr);
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		if (copy_from_user(hdr, up, sizeof(*hdr))) {
+			kfree(hdr);
+			return -EFAULT;
+		}
+
+		jx_f37p_ioctl(sd, cmd, hdr);
+		kfree(hdr);
+		break;
+
+	case RKMODULE_SET_QUICK_STREAM:
+		if (copy_from_user(&stream, up, sizeof(u32)))
+			return -EFAULT;
+
+		jx_f37p_ioctl(sd, cmd, &stream);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+#endif
+
+static int jx_f37p_g_frame_interval(struct v4l2_subdev *sd,
+				    struct v4l2_subdev_frame_interval *fi)
+{
+	struct jx_f37p *jx_f37p = to_jx_f37p(sd);
+	const struct jx_f37p_mode *mode = jx_f37p->cur_mode;
+
+	mutex_lock(&jx_f37p->mutex);
+	fi->interval = mode->max_fps;
+	mutex_unlock(&jx_f37p->mutex);
+
+	return 0;
+}
+
+static int __jx_f37p_start_stream(struct jx_f37p *jx_f37p)
+{
+	return jx_f37p_write_reg(jx_f37p->client, JX_F37P_REG_CTRL_MODE,
+				 JX_F37P_MODE_STREAMING);
+}
+
+static int __jx_f37p_stop_stream(struct jx_f37p *jx_f37p)
+{
+	return jx_f37p_write_reg(jx_f37p->client, JX_F37P_REG_CTRL_MODE,
+				 JX_F37P_MODE_SW_STANDBY);
+}
+
+static int jx_f37p_s_stream(struct v4l2_subdev *sd, int on)
+{
+	struct jx_f37p *jx_f37p = to_jx_f37p(sd);
+	struct i2c_client *client = jx_f37p->client;
+	int ret = 0;
+
+	mutex_lock(&jx_f37p->mutex);
+	on = !!on;
+	if (on == jx_f37p->streaming)
+		goto unlock_and_return;
+
+	dev_info(&client->dev, "%s: on: %d, %dx%d@%d\n", __func__, on,
+		 jx_f37p->cur_mode->width,
+		 jx_f37p->cur_mode->height,
+		 DIV_ROUND_CLOSEST(jx_f37p->cur_mode->max_fps.denominator,
+		 jx_f37p->cur_mode->max_fps.numerator));
+
+	if (on) {
+		ret = pm_runtime_get_sync(&client->dev);
+		if (ret < 0) {
+			pm_runtime_put_noidle(&client->dev);
+			goto unlock_and_return;
+		}
+
+		ret = __jx_f37p_start_stream(jx_f37p);
+		if (ret) {
+			v4l2_err(sd, " jx_f37p start stream failed while write regs\n");
+			pm_runtime_put(&client->dev);
+			goto unlock_and_return;
+		}
+	} else {
+		__jx_f37p_stop_stream(jx_f37p);
+		pm_runtime_put(&client->dev);
+	}
+
+	jx_f37p->streaming = on;
+
+unlock_and_return:
+	mutex_unlock(&jx_f37p->mutex);
+
+	return ret;
+}
+
+static int jx_f37p_s_power(struct v4l2_subdev *sd, int on)
+{
+	struct jx_f37p *jx_f37p = to_jx_f37p(sd);
+	struct i2c_client *client = jx_f37p->client;
+	int ret = 0;
+
+	mutex_lock(&jx_f37p->mutex);
+
+	/* If the power state is not modified - no work to do. */
+	if (jx_f37p->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;
+		}
+
+		ret = jx_f37p_write_array(jx_f37p->client,
+					  jx_f37p->cur_mode->reg_list);
+		if (ret)
+			goto unlock_and_return;
+
+		/*
+		 * Enter sleep state to make sure not mipi output
+		 * during rkisp init.
+		 */
+		__jx_f37p_stop_stream(jx_f37p);
+
+		mutex_unlock(&jx_f37p->mutex);
+		/* In case these controls are set before streaming */
+		ret = v4l2_ctrl_handler_setup(&jx_f37p->ctrl_handler);
+		if (ret)
+			return ret;
+		mutex_lock(&jx_f37p->mutex);
+
+		jx_f37p->power_on = true;
+	} else {
+		pm_runtime_put(&client->dev);
+		jx_f37p->power_on = false;
+	}
+
+unlock_and_return:
+	mutex_unlock(&jx_f37p->mutex);
+
+	return ret;
+}
+
+
+static int __jx_f37p_power_on(struct jx_f37p *jx_f37p)
+{
+	int ret;
+	u32 delay_us;
+	struct device *dev = &jx_f37p->client->dev;
+
+	ret = clk_set_rate(jx_f37p->xvclk, JX_F37P_XVCLK_FREQ);
+	if (ret < 0) {
+		dev_err(dev, "Failed to set xvclk rate (24MHz)\n");
+		return ret;
+	}
+	if (clk_get_rate(jx_f37p->xvclk) != JX_F37P_XVCLK_FREQ)
+		dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n");
+	ret = clk_prepare_enable(jx_f37p->xvclk);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable xvclk\n");
+		return ret;
+	}
+
+	if (!IS_ERR(jx_f37p->reset_gpio))
+		gpiod_set_value_cansleep(jx_f37p->reset_gpio, 1);
+
+	ret = regulator_bulk_enable(JX_F37P_NUM_SUPPLIES, jx_f37p->supplies);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable regulators\n");
+		goto disable_clk;
+	}
+
+	/* According to datasheet, at least 10ms for reset duration */
+	usleep_range(10 * 1000, 15 * 1000);
+
+	if (!IS_ERR(jx_f37p->reset_gpio))
+		gpiod_set_value_cansleep(jx_f37p->reset_gpio, 0);
+
+	if (!IS_ERR(jx_f37p->pwdn_gpio))
+		gpiod_set_value_cansleep(jx_f37p->pwdn_gpio, 0);
+
+	/* 8192 cycles prior to first SCCB transaction */
+	delay_us = jx_f37p_cal_delay(8192);
+	usleep_range(delay_us, delay_us * 2);
+
+	return 0;
+
+disable_clk:
+	clk_disable_unprepare(jx_f37p->xvclk);
+
+	return ret;
+}
+
+static void __jx_f37p_power_off(struct jx_f37p *jx_f37p)
+{
+	if (!IS_ERR(jx_f37p->pwdn_gpio))
+		gpiod_set_value_cansleep(jx_f37p->pwdn_gpio, 1);
+	clk_disable_unprepare(jx_f37p->xvclk);
+	if (!IS_ERR(jx_f37p->reset_gpio))
+		gpiod_set_value_cansleep(jx_f37p->reset_gpio, 1);
+	regulator_bulk_disable(JX_F37P_NUM_SUPPLIES, jx_f37p->supplies);
+}
+
+static int jx_f37p_runtime_resume(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct jx_f37p *jx_f37p = to_jx_f37p(sd);
+
+	return __jx_f37p_power_on(jx_f37p);
+}
+
+static int jx_f37p_runtime_suspend(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct jx_f37p *jx_f37p = to_jx_f37p(sd);
+
+	__jx_f37p_power_off(jx_f37p);
+
+	return 0;
+}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static int jx_f37p_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
+{
+	struct jx_f37p *jx_f37p = to_jx_f37p(sd);
+	struct v4l2_mbus_framefmt *try_fmt =
+				v4l2_subdev_get_try_format(sd, fh->pad, 0);
+	const struct jx_f37p_mode *def_mode = &supported_modes[0];
+
+	mutex_lock(&jx_f37p->mutex);
+	/* Initialize try_fmt */
+	try_fmt->width = def_mode->width;
+	try_fmt->height = def_mode->height;
+	try_fmt->code = JX_F37P_MEDIA_BUS_FMT;
+	try_fmt->field = V4L2_FIELD_NONE;
+
+	mutex_unlock(&jx_f37p->mutex);
+	/* No crop or compose */
+
+	return 0;
+}
+#endif
+
+static int jx_f37p_g_mbus_config(struct v4l2_subdev *sd,
+				 struct v4l2_mbus_config *config)
+{
+	config->type = V4L2_MBUS_PARALLEL;
+	config->flags = V4L2_MBUS_HSYNC_ACTIVE_HIGH |
+			V4L2_MBUS_VSYNC_ACTIVE_LOW |
+			V4L2_MBUS_PCLK_SAMPLE_RISING;
+	return 0;
+}
+static int jx_f37p_enum_frame_interval(struct v4l2_subdev *sd,
+				       struct v4l2_subdev_pad_config *cfg,
+				       struct v4l2_subdev_frame_interval_enum *fie)
+{
+	if (fie->index >= ARRAY_SIZE(supported_modes))
+		return -EINVAL;
+
+	if (fie->code != JX_F37P_MEDIA_BUS_FMT)
+		return -EINVAL;
+
+	fie->width = supported_modes[fie->index].width;
+	fie->height = supported_modes[fie->index].height;
+	fie->interval = supported_modes[fie->index].max_fps;
+	return 0;
+}
+
+static const struct dev_pm_ops jx_f37p_pm_ops = {
+	SET_RUNTIME_PM_OPS(jx_f37p_runtime_suspend,
+			   jx_f37p_runtime_resume, NULL)
+};
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static const struct v4l2_subdev_internal_ops jx_f37p_internal_ops = {
+	.open = jx_f37p_open,
+};
+#endif
+
+static const struct v4l2_subdev_core_ops jx_f37p_core_ops = {
+	.s_power = jx_f37p_s_power,
+	.ioctl = jx_f37p_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = jx_f37p_compat_ioctl32,
+#endif
+};
+
+static const struct v4l2_subdev_video_ops jx_f37p_video_ops = {
+	.s_stream = jx_f37p_s_stream,
+	.g_mbus_config = jx_f37p_g_mbus_config,
+	.g_frame_interval = jx_f37p_g_frame_interval,
+};
+
+static const struct v4l2_subdev_pad_ops jx_f37p_pad_ops = {
+	.enum_mbus_code = jx_f37p_enum_mbus_code,
+	.enum_frame_size = jx_f37p_enum_frame_sizes,
+	.enum_frame_interval = jx_f37p_enum_frame_interval,
+	.get_fmt = jx_f37p_get_fmt,
+	.set_fmt = jx_f37p_set_fmt,
+};
+
+static const struct v4l2_subdev_ops jx_f37p_subdev_ops = {
+	.core	= &jx_f37p_core_ops,
+	.video	= &jx_f37p_video_ops,
+	.pad	= &jx_f37p_pad_ops,
+};
+
+static int jx_f37p_set_ctrl_gain(struct jx_f37p *jx_f37p, u32 a_gain)
+{
+	int ret = 0;
+	u32 coarse_again, fine_again;
+
+	/* Total gain = 2^PGA[5:4]*(1+PGA[3:0]/16) */
+	if (a_gain != jx_f37p->old_gain) {
+		if (a_gain < 0x10) { /*1x ~ 2x*/
+			fine_again = a_gain;
+			coarse_again = 0x00 << 4;
+		} else if (a_gain < 0x40) { /*2x ~ 4x*/
+			fine_again = (a_gain >> 1) - 16;
+			coarse_again = 0x01 << 4;
+		} else if (a_gain < 0x80) { /*4x ~ 8x*/
+			fine_again = (a_gain >> 2) - 16;
+			coarse_again = 0x2;
+		} else { /*8x ~ 15.5x*/
+			fine_again = (a_gain >> 3) - 16;
+			coarse_again = 0x03 << 4;
+		}
+		ret = jx_f37p_write_reg(jx_f37p->client,
+			JX_F37P_AEC_PK_LONG_GAIN_REG, coarse_again | fine_again);
+		jx_f37p->old_gain = a_gain;
+	}
+	return ret;
+}
+
+static int jx_f37p_set_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct jx_f37p *jx_f37p = container_of(ctrl->handler,
+					       struct jx_f37p, ctrl_handler);
+	struct i2c_client *client = jx_f37p->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 = jx_f37p->cur_mode->height + ctrl->val;
+		__v4l2_ctrl_modify_range(jx_f37p->exposure,
+					 jx_f37p->exposure->minimum, max,
+					 jx_f37p->exposure->step,
+					 jx_f37p->exposure->default_value);
+		break;
+	}
+
+	if (pm_runtime_get(&client->dev) <= 0)
+		return 0;
+
+	switch (ctrl->id) {
+	case V4L2_CID_EXPOSURE:
+		dev_dbg(&client->dev, "set expo: val: %d\n", ctrl->val);
+		/* 4 least significant bits of expsoure are fractional part */
+		ret = jx_f37p_write_reg(jx_f37p->client,
+				JX_F37P_AEC_PK_LONG_EXPO_HIGH_REG,
+				JX_F37P_FETCH_HIGH_BYTE_EXP(ctrl->val));
+		ret |= jx_f37p_write_reg(jx_f37p->client,
+				JX_F37P_AEC_PK_LONG_EXPO_LOW_REG,
+				JX_F37P_FETCH_LOW_BYTE_EXP(ctrl->val));
+		break;
+	case V4L2_CID_ANALOGUE_GAIN:
+		dev_dbg(&client->dev, "set a-gain: val: %d\n", ctrl->val);
+		ret = jx_f37p_set_ctrl_gain(jx_f37p, ctrl->val);
+		break;
+	case V4L2_CID_DIGITAL_GAIN:
+		break;
+	case V4L2_CID_VBLANK:
+		dev_dbg(&client->dev, "set vblank: val: %d\n", ctrl->val);
+		ret |= jx_f37p_write_reg(jx_f37p->client, JX_F37P_REG_HIGH_VTS,
+					 JX_F37P_FETCH_HIGH_BYTE_VTS((ctrl->val
+					 + jx_f37p->cur_mode->height)));
+		ret |= jx_f37p_write_reg(jx_f37p->client, JX_F37P_REG_LOW_VTS,
+					 JX_F37P_FETCH_LOW_BYTE_VTS((ctrl->val
+					 + jx_f37p->cur_mode->height)));
+		break;
+	case V4L2_CID_TEST_PATTERN:
+		ret = jx_f37p_enable_test_pattern(jx_f37p, 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 jx_f37p_ctrl_ops = {
+	.s_ctrl = jx_f37p_set_ctrl,
+};
+
+static int jx_f37p_initialize_controls(struct jx_f37p *jx_f37p)
+{
+	const struct jx_f37p_mode *mode;
+	struct v4l2_ctrl_handler *handler;
+	s64 exposure_max, vblank_def;
+	u32 h_blank;
+	int ret;
+
+	handler = &jx_f37p->ctrl_handler;
+	mode = jx_f37p->cur_mode;
+	ret = v4l2_ctrl_handler_init(handler, 8);
+
+	if (ret)
+		return ret;
+	handler->lock = &jx_f37p->mutex;
+
+	v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE,
+			  0, JX_F37P_PIXEL_RATE, 1, JX_F37P_PIXEL_RATE);
+
+	h_blank = mode->hts_def - mode->width;
+	jx_f37p->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
+					    h_blank, h_blank, 1, h_blank);
+
+	if (jx_f37p->hblank)
+		jx_f37p->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+
+	vblank_def = mode->vts_def - mode->height;
+	jx_f37p->vblank = v4l2_ctrl_new_std(handler, &jx_f37p_ctrl_ops,
+					    V4L2_CID_VBLANK, vblank_def,
+					    JX_F37P_VTS_MAX - mode->height,
+					    1, vblank_def);
+
+	exposure_max = mode->vts_def;
+	//exposure_max = mode->vts_def - 4;
+	jx_f37p->exposure = v4l2_ctrl_new_std(handler, &jx_f37p_ctrl_ops,
+					      V4L2_CID_EXPOSURE,
+					      JX_F37P_EXPOSURE_MIN,
+					      exposure_max,
+					      JX_F37P_EXPOSURE_STEP,
+					      mode->exp_def);
+
+	jx_f37p->anal_gain = v4l2_ctrl_new_std(handler, &jx_f37p_ctrl_ops,
+					       V4L2_CID_ANALOGUE_GAIN,
+					       ANALOG_GAIN_MIN,
+					       ANALOG_GAIN_MAX,
+					       ANALOG_GAIN_STEP,
+					       ANALOG_GAIN_DEFAULT);
+
+	/* Digital gain */
+	jx_f37p->digi_gain = v4l2_ctrl_new_std(handler, &jx_f37p_ctrl_ops,
+					       V4L2_CID_DIGITAL_GAIN,
+					       JX_F37P_DIGI_GAIN_MIN,
+					       JX_F37P_DIGI_GAIN_MAX,
+					       JX_F37P_DIGI_GAIN_STEP,
+					       JX_F37P_DIGI_GAIN_DEFAULT);
+
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(&jx_f37p->client->dev,
+			"Failed to init controls(%d)\n", ret);
+		goto err_free_handler;
+	}
+
+	jx_f37p->subdev.ctrl_handler = handler;
+	jx_f37p->old_gain = ANALOG_GAIN_DEFAULT;
+
+	return 0;
+
+err_free_handler:
+	v4l2_ctrl_handler_free(handler);
+
+	return ret;
+}
+
+static int jx_f37p_check_sensor_id(struct jx_f37p *jx_f37p,
+				   struct i2c_client *client)
+{
+	struct device *dev = &jx_f37p->client->dev;
+	u8 id_h = 0;
+	u8 id_l = 0;
+	int ret;
+
+	ret = jx_f37p_read_reg(client, JX_F37P_PIDH_ADDR, &id_h);
+	ret |= jx_f37p_read_reg(client, JX_F37P_PIDL_ADDR, &id_l);
+	if (id_h != CHIP_ID_H && id_l != CHIP_ID_L) {
+		dev_err(dev, "Wrong camera sensor id(0x%02x%02x)\n",
+			id_h, id_l);
+		return -EINVAL;
+	}
+
+	dev_info(dev, "Detected jx_f37p (0x%02x%02x) sensor\n",
+		id_h, id_l);
+
+	return ret;
+}
+
+static int jx_f37p_configure_regulators(struct jx_f37p *jx_f37p)
+{
+	unsigned int i;
+
+	for (i = 0; i < JX_F37P_NUM_SUPPLIES; i++)
+		jx_f37p->supplies[i].supply = jx_f37p_supply_names[i];
+
+	return devm_regulator_bulk_get(&jx_f37p->client->dev,
+				       JX_F37P_NUM_SUPPLIES,
+				       jx_f37p->supplies);
+}
+
+static int jx_f37p_probe(struct i2c_client *client,
+			const struct i2c_device_id *id)
+{
+	struct device *dev = &client->dev;
+	struct device_node *node = dev->of_node;
+	struct jx_f37p *jx_f37p;
+	struct v4l2_subdev *sd;
+	char facing[2];
+	int ret;
+
+	dev_info(dev, "driver version: %02x.%02x.%02x",
+		DRIVER_VERSION >> 16,
+		(DRIVER_VERSION & 0xff00) >> 8,
+		DRIVER_VERSION & 0x00ff);
+
+	jx_f37p = devm_kzalloc(dev, sizeof(*jx_f37p), GFP_KERNEL);
+	if (!jx_f37p)
+		return -ENOMEM;
+
+	ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
+				   &jx_f37p->module_index);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
+				       &jx_f37p->module_facing);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME,
+				       &jx_f37p->module_name);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME,
+				       &jx_f37p->len_name);
+	if (ret) {
+		dev_err(dev, "could not get module information!\n");
+		return -EINVAL;
+	}
+
+	jx_f37p->client = client;
+	jx_f37p->cur_mode = &supported_modes[0];
+
+	jx_f37p->xvclk = devm_clk_get(dev, "xvclk");
+	if (IS_ERR(jx_f37p->xvclk)) {
+		dev_err(dev, "Failed to get xvclk\n");
+		return -EINVAL;
+	}
+
+	jx_f37p->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+	if (IS_ERR(jx_f37p->reset_gpio))
+		dev_warn(dev, "Failed to get reset-gpios\n");
+
+	jx_f37p->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW);
+	if (IS_ERR(jx_f37p->pwdn_gpio))
+		dev_warn(dev, "Failed to get pwdn-gpios\n");
+
+	ret = jx_f37p_configure_regulators(jx_f37p);
+	if (ret) {
+		dev_err(dev, "Failed to get power regulators\n");
+		return ret;
+	}
+
+	mutex_init(&jx_f37p->mutex);
+
+	sd = &jx_f37p->subdev;
+	v4l2_i2c_subdev_init(sd, client, &jx_f37p_subdev_ops);
+	ret = jx_f37p_initialize_controls(jx_f37p);
+	if (ret)
+		goto err_destroy_mutex;
+
+	ret = __jx_f37p_power_on(jx_f37p);
+	if (ret)
+		goto err_free_handler;
+
+	ret = jx_f37p_check_sensor_id(jx_f37p, client);
+	if (ret)
+		goto err_power_off;
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+	sd->internal_ops = &jx_f37p_internal_ops;
+	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
+		     V4L2_SUBDEV_FL_HAS_EVENTS;
+#endif
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	jx_f37p->pad.flags = MEDIA_PAD_FL_SOURCE;
+	sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
+	ret = media_entity_pads_init(&sd->entity, 1, &jx_f37p->pad);
+	if (ret < 0)
+		goto err_power_off;
+#endif
+
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(jx_f37p->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s",
+		 jx_f37p->module_index, facing,
+		 JX_F37P_NAME, dev_name(sd->dev));
+
+	ret = v4l2_async_register_subdev(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:
+	__jx_f37p_power_off(jx_f37p);
+err_free_handler:
+	v4l2_ctrl_handler_free(&jx_f37p->ctrl_handler);
+err_destroy_mutex:
+	mutex_destroy(&jx_f37p->mutex);
+
+	return ret;
+}
+
+static int jx_f37p_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct jx_f37p *jx_f37p = to_jx_f37p(sd);
+
+	v4l2_async_unregister_subdev(sd);
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	media_entity_cleanup(&sd->entity);
+#endif
+	v4l2_ctrl_handler_free(&jx_f37p->ctrl_handler);
+	mutex_destroy(&jx_f37p->mutex);
+
+	pm_runtime_disable(&client->dev);
+	if (!pm_runtime_status_suspended(&client->dev))
+		__jx_f37p_power_off(jx_f37p);
+	pm_runtime_set_suspended(&client->dev);
+
+	return 0;
+}
+
+#if IS_ENABLED(CONFIG_OF)
+static const struct of_device_id jx_f37p_of_match[] = {
+	{ .compatible = "soi,jx_f37p" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, jx_f37p_of_match);
+#endif
+
+static const struct i2c_device_id jx_f37p_match_id[] = {
+	{ "soi,jx_f37p", 0 },
+	{ },
+};
+
+static struct i2c_driver jx_f37p_i2c_driver = {
+	.driver = {
+		.name = JX_F37P_NAME,
+		.pm = &jx_f37p_pm_ops,
+		.of_match_table = of_match_ptr(jx_f37p_of_match),
+	},
+	.probe		= &jx_f37p_probe,
+	.remove		= &jx_f37p_remove,
+	.id_table	= jx_f37p_match_id,
+};
+
+static int __init sensor_mod_init(void)
+{
+	return i2c_add_driver(&jx_f37p_i2c_driver);
+}
+
+static void __exit sensor_mod_exit(void)
+{
+	i2c_del_driver(&jx_f37p_i2c_driver);
+}
+
+device_initcall_sync(sensor_mod_init);
+module_exit(sensor_mod_exit);
+
+MODULE_DESCRIPTION("SOI jx_f37p sensor driver by steven.ou");
+MODULE_LICENSE("GPL v2");

commit 1c12dddb5d1e757ad1561b35ab075d2769575db3
Author: Su Yuefu <yuefu.su@rock-chips.com>
Date:   Thu Oct 28 19:47:10 2021 +0800

    media: i2c: sc401ai sensor driver support 2lanes config
    
    Signed-off-by: Su Yuefu <yuefu.su@rock-chips.com>
    Change-Id: I866a82badc02da635c5dee1e3a952cc4c87affa5

diff --git a/drivers/media/i2c/sc401ai.c b/drivers/media/i2c/sc401ai.c
index 48c2ce116747..1c0bfbe874b8 100644
--- a/drivers/media/i2c/sc401ai.c
+++ b/drivers/media/i2c/sc401ai.c
@@ -2,7 +2,7 @@
 /*
  * sc401ai driver
  *
- * Copyright (C) 2020 Rockchip Electronics Co., Ltd.
+ * Copyright (C) 2021 Rockchip Electronics Co., Ltd.
  *
  * V0.0X01.0X01 add poweron function.
  * V0.0X01.0X02 fix mclk issue when probe multiple camera.
@@ -22,6 +22,8 @@
 #include <linux/sysfs.h>
 #include <linux/slab.h>
 #include <linux/version.h>
+#include <linux/of.h>
+#include <linux/of_graph.h>
 #include <linux/rk-camera-module.h>
 #include <linux/rk-preisp.h>
 #include <media/media-entity.h>
@@ -36,12 +38,18 @@
 #define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
 #endif
 
-#define SC401AI_LANES			4
 #define SC401AI_BITS_PER_SAMPLE		10
+
 #define SC401AI_LINK_FREQ_315		157500000// 315Mbps
+#define SC401AI_LINK_FREQ_630		315000000// 630Mbps
 
 #define PIXEL_RATE_WITH_315M_10BIT		(SC401AI_LINK_FREQ_315 * 2 * \
-					SC401AI_LANES / SC401AI_BITS_PER_SAMPLE)
+					4 / SC401AI_BITS_PER_SAMPLE)
+#define PIXEL_RATE_WITH_630M_10BIT		(SC401AI_LINK_FREQ_630 * 2 * \
+					2 / SC401AI_BITS_PER_SAMPLE)
+#define PIXEL_RATE_WITH_MAX			(SC401AI_LINK_FREQ_630 * 2 * \
+					2 / SC401AI_BITS_PER_SAMPLE)
+
 #define SC401AI_XVCLK_FREQ		27000000
 
 #define CHIP_ID				0xcd2e
@@ -67,7 +75,6 @@
 #define SC401AI_GAIN_STEP		1
 #define SC401AI_GAIN_DEFAULT		0x0800
 
-
 #define SC401AI_REG_GROUP_HOLD		0x3812
 #define SC401AI_GROUP_HOLD_START	0x00
 #define SC401AI_GROUP_HOLD_END		0x30
@@ -136,6 +143,7 @@ struct sc401ai_mode {
 	u32 exp_def;
 	const struct regval *reg_list;
 	u32 hdr_mode;
+	u32 mipi_freq_idx;
 	u32 vc[PAD_MAX];
 };
 
@@ -159,9 +167,13 @@ struct sc401ai {
 	struct v4l2_ctrl	*hblank;
 	struct v4l2_ctrl	*vblank;
 	struct v4l2_ctrl	*test_pattern;
+	struct v4l2_ctrl	*pixel_rate;
+	struct v4l2_ctrl	*link_freq;
 	struct mutex		mutex;
 	bool			streaming;
 	bool			power_on;
+	unsigned int		lane_num;
+	unsigned int		cfg_num;
 	const struct sc401ai_mode *cur_mode;
 	u32			module_index;
 	const char		*module_facing;
@@ -185,7 +197,7 @@ static const struct regval sc401ai_global_regs[] = {
  * max_framerate 30fps
  * mipi_datarate per lane 315Mbps, 4lane
  */
-static const struct regval sc401ai_linear_10_2560x1440_regs[] = {
+static const struct regval sc401ai_linear_10_2560x1440_4lane_regs[] = {
 	{0x0103, 0x01},
 	{0x0100, 0x00},
 	{0x36e9, 0x80},
@@ -285,6 +297,123 @@ static const struct regval sc401ai_linear_10_2560x1440_regs[] = {
 	{REG_NULL, 0x00},
 };
 
+/*
+ * Xclk 27Mhz
+ * max_framerate 30fps
+ * mipi_datarate per lane 630Mbps, 2lane
+ */
+static const struct regval sc401ai_linear_10_2560x1440_2lane_regs[] = {
+	{0x0103, 0x01},
+	{0x0100, 0x00},
+	{0x36e9, 0x80},
+	{0x36f9, 0x80},
+	{0x3018, 0x3a},
+	{0x3019, 0x0c},
+	{0x301c, 0x78},
+	{0x301f, 0x05},
+	{0x3208, 0x0a},
+	{0x3209, 0x00},
+	{0x320a, 0x05},
+	{0x320b, 0xa0},
+	{0x320e, 0x05},
+	{0x320f, 0xdc},
+	{0x3214, 0x11},
+	{0x3215, 0x11},
+	{0x3223, 0x80},
+	{0x3250, 0x00},
+	{0x3253, 0x08},
+	{0x3274, 0x01},
+	{0x3301, 0x20},
+	{0x3302, 0x18},
+	{0x3303, 0x10},
+	{0x3304, 0x50},
+	{0x3306, 0x38},
+	{0x3308, 0x18},
+	{0x3309, 0x60},
+	{0x330b, 0xc0},
+	{0x330d, 0x10},
+	{0x330e, 0x18},
+	{0x330f, 0x04},
+	{0x3310, 0x02},
+	{0x331c, 0x04},
+	{0x331e, 0x41},
+	{0x331f, 0x51},
+	{0x3320, 0x09},
+	{0x3333, 0x10},
+	{0x334c, 0x08},
+	{0x3356, 0x09},
+	{0x3364, 0x17},
+	{0x338e, 0xfd},
+	{0x3390, 0x08},
+	{0x3391, 0x18},
+	{0x3392, 0x38},
+	{0x3393, 0x20},
+	{0x3394, 0x20},
+	{0x3395, 0x20},
+	{0x3396, 0x08},
+	{0x3397, 0x18},
+	{0x3398, 0x38},
+	{0x3399, 0x20},
+	{0x339a, 0x20},
+	{0x339b, 0x20},
+	{0x339c, 0x20},
+	{0x33ac, 0x10},
+	{0x33ae, 0x18},
+	{0x33af, 0x19},
+	{0x360f, 0x01},
+	{0x3620, 0x08},
+	{0x3637, 0x25},
+	{0x363a, 0x12},
+	{0x3670, 0x0a},
+	{0x3671, 0x07},
+	{0x3672, 0x57},
+	{0x3673, 0x5e},
+	{0x3674, 0x84},
+	{0x3675, 0x88},
+	{0x3676, 0x8a},
+	{0x367a, 0x58},
+	{0x367b, 0x78},
+	{0x367c, 0x58},
+	{0x367d, 0x78},
+	{0x3690, 0x33},
+	{0x3691, 0x43},
+	{0x3692, 0x34},
+	{0x369c, 0x40},
+	{0x369d, 0x78},
+	{0x36ea, 0x39},
+	{0x36eb, 0x0d},
+	{0x36ec, 0x1c},
+	{0x36ed, 0x24},
+	{0x36fa, 0x39},
+	{0x36fb, 0x33},
+	{0x36fc, 0x10},
+	{0x36fd, 0x14},
+	{0x3908, 0x41},
+	{0x396c, 0x0e},
+	{0x3e00, 0x00},
+	{0x3e01, 0xb6},
+	{0x3e02, 0x00},
+	{0x3e03, 0x0b},
+	{0x3e08, 0x03},
+	{0x3e09, 0x40},
+	{0x3e1b, 0x2a},
+	{0x4509, 0x30},
+	{0x4819, 0x08},
+	{0x481b, 0x05},
+	{0x481d, 0x11},
+	{0x481f, 0x04},
+	{0x4821, 0x09},
+	{0x4823, 0x04},
+	{0x4825, 0x04},
+	{0x4827, 0x04},
+	{0x4829, 0x07},
+	{0x57a8, 0xd0},
+	{0x36e9, 0x14},
+	{0x36f9, 0x14},
+	//{0x0100, 0x01},
+	{REG_NULL, 0x00},
+};
+
 static const struct sc401ai_mode supported_modes[] = {
 	{
 		.width = 2560,
@@ -297,22 +426,32 @@ static const struct sc401ai_mode supported_modes[] = {
 		.hts_def = 0x0578 * 2,
 		.vts_def = 0x05dc,
 		.bus_fmt = MEDIA_BUS_FMT_SBGGR10_1X10,
-		.reg_list = sc401ai_linear_10_2560x1440_regs,
+		.reg_list = sc401ai_linear_10_2560x1440_4lane_regs,
 		.hdr_mode = NO_HDR,
+		.mipi_freq_idx = 0,
 		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0,
-	}
+	},
+	{
+		.width = 2560,
+		.height = 1440,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x0080,
+		.hts_def = 0x0578 * 2,
+		.vts_def = 0x05dc,
+		.bus_fmt = MEDIA_BUS_FMT_SBGGR10_1X10,
+		.reg_list = sc401ai_linear_10_2560x1440_2lane_regs,
+		.hdr_mode = NO_HDR,
+		.mipi_freq_idx = 1,
+		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0,
+	},
 };
 
 static const s64 link_freq_menu_items[] = {
-	SC401AI_LINK_FREQ_315
-};
-
-static const char * const sc401ai_test_pattern_menu[] = {
-	"Disabled",
-	"Vertical Color Bar Type 1",
-	"Vertical Color Bar Type 2",
-	"Vertical Color Bar Type 3",
-	"Vertical Color Bar Type 4"
+	SC401AI_LINK_FREQ_315,
+	SC401AI_LINK_FREQ_630,
 };
 
 /* Write registers up to 4 at a time */
@@ -628,7 +767,7 @@ static int sc401ai_enum_frame_sizes(struct v4l2_subdev *sd,
 	if (fse->index >= ARRAY_SIZE(supported_modes))
 		return -EINVAL;
 
-	if (fse->code != supported_modes[0].bus_fmt)
+	if (fse->code != supported_modes[1].bus_fmt)
 		return -EINVAL;
 
 	fse->min_width  = supported_modes[fse->index].width;
@@ -650,7 +789,6 @@ static int sc401ai_enable_test_pattern(struct sc401ai *sc401ai, u32 pattern)
 		val |= SC401AI_TEST_PATTERN_BIT_MASK;
 	else
 		val &= ~SC401AI_TEST_PATTERN_BIT_MASK;
-
 	ret |= sc401ai_write_reg(sc401ai->client, SC401AI_REG_TEST_PATTERN,
 				 SC401AI_REG_VALUE_08BIT, val);
 	return ret;
@@ -674,7 +812,9 @@ static int sc401ai_g_mbus_config(struct v4l2_subdev *sd,
 {
 	struct sc401ai *sc401ai = to_sc401ai(sd);
 	const struct sc401ai_mode *mode = sc401ai->cur_mode;
-	u32 val = 1 << (SC401AI_LANES - 1) |
+	u32 val = 0;
+
+	val = 1 << (sc401ai->lane_num - 1) |
 		V4L2_MBUS_CSI2_CHANNEL_0 |
 		V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
 
@@ -703,7 +843,6 @@ static long sc401ai_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 {
 	struct sc401ai *sc401ai = to_sc401ai(sd);
 	struct rkmodule_hdr_cfg *hdr;
-	u32 i, h, w;
 	long ret = 0;
 	u32 stream = 0;
 
@@ -718,28 +857,8 @@ static long sc401ai_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 		break;
 	case RKMODULE_SET_HDR_CFG:
 		hdr = (struct rkmodule_hdr_cfg *)arg;
-		w = sc401ai->cur_mode->width;
-		h = sc401ai->cur_mode->height;
-		for (i = 0; i < ARRAY_SIZE(supported_modes); i++) {
-			if (w == supported_modes[i].width &&
-			    h == supported_modes[i].height &&
-			    supported_modes[i].hdr_mode == hdr->hdr_mode) {
-				sc401ai->cur_mode = &supported_modes[i];
-				break;
-			}
-		}
-		if (i == ARRAY_SIZE(supported_modes)) {
-			dev_err(&sc401ai->client->dev,
-				"not find hdr mode:%d %dx%d config\n",
-				hdr->hdr_mode, w, h);
-			ret = -EINVAL;
-		} else {
-			w = sc401ai->cur_mode->hts_def - sc401ai->cur_mode->width;
-			h = sc401ai->cur_mode->vts_def - sc401ai->cur_mode->height;
-			__v4l2_ctrl_modify_range(sc401ai->hblank, w, w, 1, w);
-			__v4l2_ctrl_modify_range(sc401ai->vblank, h,
-						 SC401AI_VTS_MAX - sc401ai->cur_mode->height, 1, h);
-		}
+		if (hdr->hdr_mode != 0)
+			ret = -1;
 		break;
 	case PREISP_CMD_SET_HDRAE_EXP:
 		break;
@@ -748,11 +867,15 @@ static long sc401ai_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 		stream = *((u32 *)arg);
 
 		if (stream)
-			ret = sc401ai_write_reg(sc401ai->client, SC401AI_REG_CTRL_MODE,
-				 SC401AI_REG_VALUE_08BIT, SC401AI_MODE_STREAMING);
+			ret = sc401ai_write_reg(sc401ai->client,
+						SC401AI_REG_CTRL_MODE,
+						SC401AI_REG_VALUE_08BIT,
+						SC401AI_MODE_STREAMING);
 		else
-			ret = sc401ai_write_reg(sc401ai->client, SC401AI_REG_CTRL_MODE,
-				 SC401AI_REG_VALUE_08BIT, SC401AI_MODE_SW_STANDBY);
+			ret = sc401ai_write_reg(sc401ai->client,
+						SC401AI_REG_CTRL_MODE,
+						SC401AI_REG_VALUE_08BIT,
+						SC401AI_MODE_SW_STANDBY);
 		break;
 	default:
 		ret = -ENOIOCTLCMD;
@@ -771,7 +894,7 @@ static long sc401ai_compat_ioctl32(struct v4l2_subdev *sd,
 	struct rkmodule_awb_cfg *cfg;
 	struct rkmodule_hdr_cfg *hdr;
 	struct preisp_hdrae_exp_s *hdrae;
-	long ret;
+	long ret = 0;
 	u32 stream = 0;
 
 	switch (cmd) {
@@ -783,8 +906,11 @@ static long sc401ai_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = sc401ai_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:
@@ -794,9 +920,12 @@ static long sc401ai_compat_ioctl32(struct v4l2_subdev *sd,
 			return ret;
 		}
 
-		ret = copy_from_user(cfg, up, sizeof(*cfg));
-		if (!ret)
-			ret = sc401ai_ioctl(sd, cmd, cfg);
+		if (copy_from_user(cfg, up, sizeof(*cfg))) {
+			kfree(cfg);
+			return -EFAULT;
+		}
+
+		sc401ai_ioctl(sd, cmd, cfg);
 		kfree(cfg);
 		break;
 	case RKMODULE_GET_HDR_CFG:
@@ -807,8 +936,11 @@ static long sc401ai_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = sc401ai_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:
@@ -818,9 +950,12 @@ static long sc401ai_compat_ioctl32(struct v4l2_subdev *sd,
 			return ret;
 		}
 
-		ret = copy_from_user(hdr, up, sizeof(*hdr));
-		if (!ret)
-			ret = sc401ai_ioctl(sd, cmd, hdr);
+		if (copy_from_user(hdr, up, sizeof(*hdr))) {
+			kfree(hdr);
+			return -EFAULT;
+		}
+
+		sc401ai_ioctl(sd, cmd, hdr);
 		kfree(hdr);
 		break;
 	case PREISP_CMD_SET_HDRAE_EXP:
@@ -830,15 +965,19 @@ static long sc401ai_compat_ioctl32(struct v4l2_subdev *sd,
 			return ret;
 		}
 
-		ret = copy_from_user(hdrae, up, sizeof(*hdrae));
-		if (!ret)
-			ret = sc401ai_ioctl(sd, cmd, hdrae);
+		if (copy_from_user(hdrae, up, sizeof(*hdrae))) {
+			kfree(hdrae);
+			return -EFAULT;
+		}
+
+		sc401ai_ioctl(sd, cmd, hdrae);
 		kfree(hdrae);
 		break;
 	case RKMODULE_SET_QUICK_STREAM:
-		ret = copy_from_user(&stream, up, sizeof(u32));
-		if (!ret)
-			ret = sc401ai_ioctl(sd, cmd, &stream);
+		if (copy_from_user(&stream, up, sizeof(u32)))
+			return -EFAULT;
+
+		sc401ai_ioctl(sd, cmd, &stream);
 		break;
 	default:
 		ret = -ENOIOCTLCMD;
@@ -862,14 +1001,18 @@ static int __sc401ai_start_stream(struct sc401ai *sc401ai)
 	if (ret)
 		return ret;
 
-	return sc401ai_write_reg(sc401ai->client, SC401AI_REG_CTRL_MODE,
-				 SC401AI_REG_VALUE_08BIT, SC401AI_MODE_STREAMING);
+	return sc401ai_write_reg(sc401ai->client,
+				 SC401AI_REG_CTRL_MODE,
+				 SC401AI_REG_VALUE_08BIT,
+				 SC401AI_MODE_STREAMING);
 }
 
 static int __sc401ai_stop_stream(struct sc401ai *sc401ai)
 {
-	return sc401ai_write_reg(sc401ai->client, SC401AI_REG_CTRL_MODE,
-				 SC401AI_REG_VALUE_08BIT, SC401AI_MODE_SW_STANDBY);
+	return sc401ai_write_reg(sc401ai->client,
+				 SC401AI_REG_CTRL_MODE,
+				 SC401AI_REG_VALUE_08BIT,
+				 SC401AI_MODE_SW_STANDBY);
 }
 
 static int sc401ai_s_stream(struct v4l2_subdev *sd, int on)
@@ -1189,14 +1332,16 @@ static int sc401ai_set_ctrl(struct v4l2_ctrl *ctrl)
 	case V4L2_CID_HFLIP:
 		ret = sc401ai_read_reg(sc401ai->client, SC401AI_FLIP_MIRROR_REG,
 				       SC401AI_REG_VALUE_08BIT, &val);
-		ret |= sc401ai_write_reg(sc401ai->client, SC401AI_FLIP_MIRROR_REG,
+		ret |= sc401ai_write_reg(sc401ai->client,
+					 SC401AI_FLIP_MIRROR_REG,
 					 SC401AI_REG_VALUE_08BIT,
 					 SC401AI_FETCH_MIRROR(val, ctrl->val));
 		break;
 	case V4L2_CID_VFLIP:
 		ret = sc401ai_read_reg(sc401ai->client, SC401AI_FLIP_MIRROR_REG,
 				       SC401AI_REG_VALUE_08BIT, &val);
-		ret |= sc401ai_write_reg(sc401ai->client, SC401AI_FLIP_MIRROR_REG,
+		ret |= sc401ai_write_reg(sc401ai->client,
+					 SC401AI_FLIP_MIRROR_REG,
 					 SC401AI_REG_VALUE_08BIT,
 					 SC401AI_FETCH_FLIP(val, ctrl->val));
 		break;
@@ -1215,14 +1360,50 @@ static const struct v4l2_ctrl_ops sc401ai_ctrl_ops = {
 	.s_ctrl = sc401ai_set_ctrl,
 };
 
+static int sc401ai_parse_of(struct sc401ai *sc401ai)
+{
+	struct device *dev = &sc401ai->client->dev;
+	struct device_node *endpoint;
+	struct fwnode_handle *fwnode;
+	int rval;
+
+	endpoint = of_graph_get_next_endpoint(dev->of_node, NULL);
+	if (!endpoint) {
+		dev_err(dev, "Failed to get endpoint\n");
+		return -EINVAL;
+	}
+	fwnode = of_fwnode_handle(endpoint);
+	rval = fwnode_property_read_u32_array(fwnode, "data-lanes", NULL, 0);
+	if (rval <= 0) {
+		dev_warn(dev, " Get mipi lane num failed!\n");
+		return -1;
+	}
+
+	sc401ai->lane_num = rval;
+
+	if (sc401ai->lane_num == 2) {
+		sc401ai->cur_mode = &supported_modes[1];
+		dev_info(dev, "lane_num(%d)\n", sc401ai->lane_num);
+	} else if (sc401ai->lane_num == 4) {
+		sc401ai->cur_mode = &supported_modes[0];
+		dev_info(dev, "lane_num(%d)\n", sc401ai->lane_num);
+	} else {
+		dev_err(dev, "unsupported lane_num(%d)\n", sc401ai->lane_num);
+		return -1;
+	}
+	return 0;
+}
+
 static int sc401ai_initialize_controls(struct sc401ai *sc401ai)
 {
 	const struct sc401ai_mode *mode;
 	struct v4l2_ctrl_handler *handler;
-	struct v4l2_ctrl *ctrl;
+	struct device *dev = &sc401ai->client->dev;
+
 	s64 exposure_max, vblank_def;
 	u32 h_blank;
 	int ret;
+	int dst_pixel_rate = 0;
 
 	handler = &sc401ai->ctrl_handler;
 	mode = sc401ai->cur_mode;
@@ -1231,13 +1412,24 @@ static int sc401ai_initialize_controls(struct sc401ai *sc401ai)
 		return ret;
 	handler->lock = &sc401ai->mutex;
 
-	ctrl = v4l2_ctrl_new_int_menu(handler, NULL, V4L2_CID_LINK_FREQ,
-				      0, 0, link_freq_menu_items);
-	if (ctrl)
-		ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+	sc401ai->link_freq = v4l2_ctrl_new_int_menu(handler, NULL,
+				V4L2_CID_LINK_FREQ,
+				ARRAY_SIZE(link_freq_menu_items) - 1, 0,
+				link_freq_menu_items);
+	__v4l2_ctrl_s_ctrl(sc401ai->link_freq, mode->mipi_freq_idx);
 
-	v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE,
-			  0, PIXEL_RATE_WITH_315M_10BIT, 1, PIXEL_RATE_WITH_315M_10BIT);
+	if (ret < 0)
+		dev_err(dev, "get data num failed");
+
+	if (mode->mipi_freq_idx == 0)
+		dst_pixel_rate = PIXEL_RATE_WITH_315M_10BIT;
+	else if (mode->mipi_freq_idx == 1)
+		dst_pixel_rate = PIXEL_RATE_WITH_630M_10BIT;
+
+	sc401ai->pixel_rate = v4l2_ctrl_new_std(handler, NULL,
+						V4L2_CID_PIXEL_RATE, 0,
+						PIXEL_RATE_WITH_MAX,
+						1, dst_pixel_rate);
 
 	h_blank = mode->hts_def - mode->width;
 	sc401ai->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
@@ -1251,22 +1443,21 @@ static int sc401ai_initialize_controls(struct sc401ai *sc401ai)
 					    1, vblank_def);
 	exposure_max = mode->vts_def - 4;
 	sc401ai->exposure = v4l2_ctrl_new_std(handler, &sc401ai_ctrl_ops,
-					      V4L2_CID_EXPOSURE, SC401AI_EXPOSURE_MIN,
-					      exposure_max, SC401AI_EXPOSURE_STEP,
+					      V4L2_CID_EXPOSURE,
+					      SC401AI_EXPOSURE_MIN,
+					      exposure_max,
+					      SC401AI_EXPOSURE_STEP,
 					      mode->exp_def);
 	sc401ai->anal_gain = v4l2_ctrl_new_std(handler, &sc401ai_ctrl_ops,
-					       V4L2_CID_ANALOGUE_GAIN, SC401AI_GAIN_MIN,
-					       SC401AI_GAIN_MAX, SC401AI_GAIN_STEP,
+					       V4L2_CID_ANALOGUE_GAIN,
+					       SC401AI_GAIN_MIN,
+					       SC401AI_GAIN_MAX,
+					       SC401AI_GAIN_STEP,
 					       SC401AI_GAIN_DEFAULT);
-	sc401ai->test_pattern = v4l2_ctrl_new_std_menu_items(handler,
-							    &sc401ai_ctrl_ops,
-					V4L2_CID_TEST_PATTERN,
-					ARRAY_SIZE(sc401ai_test_pattern_menu) - 1,
-					0, 0, sc401ai_test_pattern_menu);
 	v4l2_ctrl_new_std(handler, &sc401ai_ctrl_ops,
-				V4L2_CID_HFLIP, 0, 1, 1, 0);
+			  V4L2_CID_HFLIP, 0, 1, 1, 0);
 	v4l2_ctrl_new_std(handler, &sc401ai_ctrl_ops,
-				V4L2_CID_VFLIP, 0, 1, 1, 0);
+			  V4L2_CID_VFLIP, 0, 1, 1, 0);
 	if (handler->error) {
 		ret = handler->error;
 		dev_err(&sc401ai->client->dev,
@@ -1396,6 +1587,10 @@ static int sc401ai_probe(struct i2c_client *client,
 		return ret;
 	}
 
+	ret = sc401ai_parse_of(sc401ai);
+	if (ret != 0)
+		return -EINVAL;
+
 	mutex_init(&sc401ai->mutex);
 
 	sd = &sc401ai->subdev;

commit c23c16b816cc38db0c63ee5cd07c93d913b0b36b
Author: Xing Zheng <zhengxing@rock-chips.com>
Date:   Thu Dec 9 20:01:11 2021 +0800

    ASoC: rockchip: rk817-codec: Reset DTOP_DIGEN_CLKE after finish digital registers
    
    This patch try to reset DTOP_DIGEN_CLKE during hook power up
    after finish configure digital registers, avoid to the incorrect
    work status.
    
    Signed-off-by: Xing Zheng <zhengxing@rock-chips.com>
    Change-Id: Iaa7eb3ebf41d0a55ddf8005bcaeccae2c60656eb

diff --git a/sound/soc/codecs/rk817_codec.c b/sound/soc/codecs/rk817_codec.c
index ea3dd2d7d448..7e13ea3e7586 100644
--- a/sound/soc/codecs/rk817_codec.c
+++ b/sound/soc/codecs/rk817_codec.c
@@ -355,6 +355,13 @@ static int rk817_codec_power_up(struct snd_soc_component *component, int type)
 						playback_power_up_list[i].reg,
 						playback_power_up_list[i].value);
 		}
+
+		snd_soc_component_update_bits(component, RK817_CODEC_DTOP_DIGEN_CLKE,
+					      DAC_DIG_CLK_MASK, DAC_DIG_CLK_DIS);
+		usleep_range(2000, 2500);
+		snd_soc_component_update_bits(component, RK817_CODEC_DTOP_DIGEN_CLKE,
+					      DAC_DIG_CLK_MASK, DAC_DIG_CLK_EN);
+		DBG("%s: %d - Playback DIG CLK OPS\n", __func__, __LINE__);
 	}
 
 	if (type & RK817_CODEC_CAPTURE) {
@@ -368,6 +375,13 @@ static int rk817_codec_power_up(struct snd_soc_component *component, int type)
 						capture_power_up_list[i].value);
 		}
 
+		snd_soc_component_update_bits(component, RK817_CODEC_DTOP_DIGEN_CLKE,
+					      ADC_DIG_CLK_MASK, DAC_DIG_CLK_DIS);
+		usleep_range(2000, 2500);
+		snd_soc_component_update_bits(component, RK817_CODEC_DTOP_DIGEN_CLKE,
+					      ADC_DIG_CLK_MASK, ADC_DIG_CLK_EN);
+		DBG("%s: %d - Capture DIG CLK OPS\n", __func__, __LINE__);
+
 		if (rk817->mic_in_differential)
 			snd_soc_component_update_bits(component,
 						      RK817_CODEC_AMIC_CFG0,

commit 13a543e8cc7845dd7ca2538e6a7dcde0bae4a856
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Sat Dec 11 20:20:24 2021 +0800

    drm/rockchip: ebc_dev: release version v2.22
    
    use tid_name to singed buf user, so we can check buf usage, and recyle
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: Iccf48bc30fbbf1ab44ac33babc9f00500b647623

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c b/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
index 5e824bcda91f..5ef0080e1f3a 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
+++ b/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
@@ -196,7 +196,7 @@ struct ebc_buf_s *ebc_osd_buf_clone(void)
 	return temp_buf;
 }
 
-struct ebc_buf_s *ebc_empty_buf_get(void)
+struct ebc_buf_s *ebc_empty_buf_get(const char *tid_name)
 {
 	struct ebc_buf_s *temp_buf = NULL;
 	int temp_pos;
@@ -210,11 +210,12 @@ struct ebc_buf_s *ebc_empty_buf_get(void)
 			if (temp_buf) {
 				if (temp_buf->status == buf_idle) {
 					temp_buf->status = buf_user;
-					memcpy(temp_buf->tid_name, current->comm, TASK_COMM_LEN); //store user thread name
+					memcpy(temp_buf->tid_name, tid_name, TASK_COMM_LEN - 1); //store user thread name
 					goto OUT;
 				}
 				// one tid only can get one buf at one time
-				else if ((temp_buf->status == buf_user) && (!strncmp(temp_buf->tid_name, current->comm, TASK_COMM_LEN - 7))) {
+				else if ((temp_buf->status == buf_user) && (!strncmp(temp_buf->tid_name, tid_name, TASK_COMM_LEN - 1))) {
+					printk("[%s]: one tid only can get one buf at one time\n", tid_name);
 					goto OUT;
 				}
 			}
@@ -248,7 +249,7 @@ int ebc_buf_state_show(char *buf)
 	if (ebc_buf_info.buf_list) {
 		for (i = 0; i < ebc_buf_info.buf_list->nb_elt; i++) {
 			temp_buf = (struct ebc_buf_s *)buf_list_get(ebc_buf_info.buf_list, i);
-			ret += sprintf(buf + ret, "ebc_buf[%d]: s = %d, m = %d\n", i, temp_buf->status, temp_buf->buf_mode);
+			ret += sprintf(buf + ret, "ebc_buf[%d]: s = %d, m = %d, tid = %s\n", i, temp_buf->status, temp_buf->buf_mode, temp_buf->tid_name);
 		}
 	}
 
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h b/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h
index 773619ee4a6c..810c4c6bab13 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h
+++ b/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h
@@ -41,7 +41,7 @@ int ebc_add_to_dsp_buf_list(struct ebc_buf_s *dsp_buf);
 int ebc_get_dsp_list_enum_num(void);
 struct ebc_buf_s *ebc_dsp_buf_get(void);
 struct ebc_buf_s *ebc_find_buf_by_phy_addr(unsigned long phy_addr);
-struct ebc_buf_s *ebc_empty_buf_get(void);
+struct ebc_buf_s *ebc_empty_buf_get(const char *tid_name);
 unsigned long ebc_phy_buf_base_get(void);
 char *ebc_virt_buf_base_get(void);
 int ebc_buf_state_show(char *buf);
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
index bbcc38215287..bb74c4ae58cd 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
@@ -102,6 +102,7 @@ struct ebc_buf_info {
 	int width_mm;
 	int height_mm;
 	int needpic;
+	char tid_name[16];
 };
 
 #if IS_ENABLED(CONFIG_ROCKCHIP_EBC_DEV)
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index a15d1f0fefb5..a2a1953c685c 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -1119,15 +1119,15 @@ get_overlay_image:
 	.type	waveform_open, %function
 waveform_open:
 .LFB2847:
-	.loc 1 2615 0
+	.loc 1 2619 0
 	.cfi_startproc
 .LVL62:
-	.loc 1 2619 0
+	.loc 1 2623 0
 	mov	w0, 0
 .LVL63:
-	.loc 1 2616 0
+	.loc 1 2620 0
 	str	xzr, [x1, 104]
-	.loc 1 2619 0
+	.loc 1 2623 0
 	ret
 	.cfi_endproc
 .LFE2847:
@@ -1137,22 +1137,22 @@ waveform_open:
 	.type	ebc_exit, %function
 ebc_exit:
 .LFB2867:
-	.loc 1 3186 0
+	.loc 1 3190 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3187 0
+	.loc 1 3191 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3186 0
+	.loc 1 3190 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3187 0
+	.loc 1 3191 0
 	bl	platform_driver_unregister
 .LVL64:
-	.loc 1 3188 0
+	.loc 1 3192 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1167,7 +1167,7 @@ ebc_exit:
 	.type	ebc_resume, %function
 ebc_resume:
 .LFB2865:
-	.loc 1 3148 0
+	.loc 1 3152 0
 	.cfi_startproc
 .LVL65:
 	stp	x29, x30, [sp, -32]!
@@ -1178,17 +1178,17 @@ ebc_resume:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-.LBB980:
-.LBB981:
+.LBB1011:
+.LBB1012:
 	.file 2 "./include/linux/device.h"
 	.loc 2 1181 0
 	ldr	x19, [x0, 184]
-.LBE981:
-.LBE980:
-	.loc 1 3152 0
+.LBE1012:
+.LBE1011:
+	.loc 1 3156 0
 	ldr	x1, [x19, 16]
-.LBB982:
-.LBB983:
+.LBB1013:
+.LBB1014:
 	.file 3 "drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic.h"
 	.loc 3 45 0
 	mov	x0, x1
@@ -1196,17 +1196,17 @@ ebc_resume:
 	ldr	x1, [x1, 48]
 	blr	x1
 .LVL67:
-.LBE983:
-.LBE982:
-	.loc 1 3153 0
+.LBE1014:
+.LBE1013:
+	.loc 1 3157 0
 	str	wzr, [x19, 804]
-	.loc 1 3154 0
+	.loc 1 3158 0
 	ldr	x0, [x19, 288]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
 .LVL68:
-	.loc 1 3157 0
+	.loc 1 3161 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -1241,25 +1241,25 @@ ebc_vdd_power_timeout:
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-.LBB984:
-.LBB985:
+.LBB1015:
+.LBB1016:
 	.file 4 "./include/linux/wakelock.h"
 	.loc 4 68 0
 	add	x0, x0, 416
-.LBE985:
-.LBE984:
+.LBE1016:
+.LBE1015:
 	.loc 1 2272 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	.loc 1 2276 0
 	str	wzr, [x0, 208]
-.LBB987:
-.LBB986:
+.LBB1018:
+.LBB1017:
 	.loc 4 68 0
 	bl	__pm_relax
 .LVL71:
-.LBE986:
-.LBE987:
+.LBE1017:
+.LBE1018:
 	.loc 1 2281 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -1274,27 +1274,27 @@ ebc_vdd_power_timeout:
 	.type	ebc_remove, %function
 ebc_remove:
 .LFB2863:
-	.loc 1 3124 0
+	.loc 1 3128 0
 	.cfi_startproc
 .LVL72:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3125 0
+	.loc 1 3129 0
 	adrp	x0, .LANCHOR1
 .LVL73:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3124 0
+	.loc 1 3128 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3125 0
+	.loc 1 3129 0
 	add	x0, x0, 224
-	.loc 1 3124 0
-	.loc 1 3125 0
+	.loc 1 3128 0
+	.loc 1 3129 0
 	bl	misc_deregister
 .LVL74:
-	.loc 1 3128 0
+	.loc 1 3132 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -1309,7 +1309,7 @@ ebc_remove:
 	.type	ebc_mmap, %function
 ebc_mmap:
 .LFB2844:
-	.loc 1 2561 0
+	.loc 1 2565 0
 	.cfi_startproc
 .LVL75:
 	stp	x29, x30, [sp, -32]!
@@ -1320,33 +1320,33 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2561 0
+	.loc 1 2565 0
 	mov	x19, x1
-	.loc 1 2564 0
+	.loc 1 2568 0
 	bl	ebc_phy_buf_base_get
 .LVL76:
-	.loc 1 2567 0
+	.loc 1 2571 0
 	lsr	x2, x0, 12
-	.loc 1 2565 0
+	.loc 1 2569 0
 	mov	x6, 16384
-	.loc 1 2567 0
+	.loc 1 2571 0
 	mov	x0, x19
-	.loc 1 2565 0
+	.loc 1 2569 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 2567 0
+	.loc 1 2571 0
 	ldp	x1, x3, [x19]
-	.loc 1 2565 0
+	.loc 1 2569 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 2567 0
+	.loc 1 2571 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
 .LVL77:
-	.loc 1 2570 0
+	.loc 1 2574 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 2573 0
+	.loc 1 2577 0
 	ldr	x19, [sp, 16]
 .LVL78:
 	csel	w0, w0, w1, eq
@@ -1364,47 +1364,47 @@ ebc_mmap:
 	.type	waveform_mmap, %function
 waveform_mmap:
 .LFB2846:
-	.loc 1 2599 0
+	.loc 1 2603 0
 	.cfi_startproc
 .LVL79:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2600 0
-	adrp	x2, .LANCHOR0
 	.loc 1 2604 0
+	adrp	x2, .LANCHOR0
+	.loc 1 2608 0
 	mov	x7, 16384
-	.loc 1 2606 0
+	.loc 1 2610 0
 	mov	x0, x1
 .LVL80:
-	.loc 1 2599 0
+	.loc 1 2603 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2603 0
+	.loc 1 2607 0
 	ldr	x2, [x2, #:lo12:.LANCHOR0]
-	.loc 1 2604 0
+	.loc 1 2608 0
 	movk	x7, 0x404, lsl 16
 	ldp	x4, x5, [x1, 72]
-	.loc 1 2606 0
+	.loc 1 2610 0
 	ldp	x6, x3, [x1]
-	.loc 1 2604 0
+	.loc 1 2608 0
 	orr	x5, x5, x7
-	.loc 1 2603 0
+	.loc 1 2607 0
 	ldr	x2, [x2, 216]
-	.loc 1 2604 0
+	.loc 1 2608 0
 	str	x5, [x1, 80]
-	.loc 1 2606 0
+	.loc 1 2610 0
 	sub	x3, x3, x6
 	mov	x1, x6
 .LVL81:
 	lsr	x2, x2, 12
 	bl	remap_pfn_range
 .LVL82:
-	.loc 1 2609 0
+	.loc 1 2613 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 2612 0
+	.loc 1 2616 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1422,34 +1422,37 @@ ebc_io_ctl:
 	.loc 1 2357 0
 	.cfi_startproc
 .LVL83:
-	stp	x29, x30, [sp, -160]!
-	.cfi_def_cfa_offset 160
-	.cfi_offset 29, -160
-	.cfi_offset 30, -152
+	stp	x29, x30, [sp, -192]!
+	.cfi_def_cfa_offset 192
+	.cfi_offset 29, -192
+	.cfi_offset 30, -184
 	.loc 1 2367 0
 	cmp	w1, 28672
 	.loc 1 2357 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
-	.cfi_offset 19, -144
-	.cfi_offset 20, -136
+	.cfi_offset 19, -176
+	.cfi_offset 20, -168
 	adrp	x19, __stack_chk_guard
 	stp	x21, x22, [sp, 32]
 	add	x0, x19, :lo12:__stack_chk_guard
 .LVL84:
-	str	x23, [sp, 48]
-	.cfi_offset 21, -128
-	.cfi_offset 22, -120
-	.cfi_offset 23, -112
+	stp	x23, x24, [sp, 48]
+	mov	x20, x2
+	str	x25, [sp, 64]
+	.cfi_offset 21, -160
+	.cfi_offset 22, -152
+	.cfi_offset 23, -144
+	.cfi_offset 24, -136
+	.cfi_offset 25, -128
 	.loc 1 2357 0
-	mov	x21, x2
 	ldr	x3, [x0]
-	str	x3, [x29, 152]
+	str	x3, [x29, 184]
 	mov	x3,0
 	.loc 1 2359 0
 	adrp	x0, .LANCHOR0
-	ldr	x20, [x0, #:lo12:.LANCHOR0]
+	ldr	x21, [x0, #:lo12:.LANCHOR0]
 	.loc 1 2367 0
 	bcc	.L177
 	mov	w0, 28675
@@ -1464,11 +1467,11 @@ ebc_io_ctl:
 	mov	w0, 28677
 	cmp	w1, w0
 	beq	.L181
-	bls	.L310
+	bls	.L322
 	mov	w0, 28680
 	cmp	w1, w0
 	beq	.L189
-	bls	.L311
+	bls	.L323
 	mov	w0, 28682
 	cmp	w1, w0
 	beq	.L193
@@ -1476,35 +1479,37 @@ ebc_io_ctl:
 	mov	w0, 28683
 	cmp	w1, w0
 	bne	.L180
-	.loc 1 2538 0
+	.loc 1 2542 0
+	adrp	x0, .LC6
+	add	x0, x0, :lo12:.LC6
 	bl	ebc_empty_buf_get
 .LVL85:
 	mov	x23, x0
-	.loc 1 2539 0
-	cbz	x0, .L201
-	.loc 1 2541 0
-	ldp	w2, w3, [x20, 108]
-	add	x22, x20, 24
-	ldr	x1, [x20, 408]
+	.loc 1 2543 0
+	cbz	x0, .L205
+	.loc 1 2545 0
+	ldp	w2, w3, [x21, 108]
+	add	x22, x21, 24
+	ldr	x1, [x21, 408]
 	ldr	x0, [x0, 16]
 	mul	w2, w2, w3
 	ldr	x1, [x1, 16]
-.L307:
+.L319:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL86:
-	.loc 1 2542 0
-	ldr	x20, [x23, 8]
+	.loc 1 2546 0
+	ldr	x21, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL87:
-	sub	w0, w20, w0
-.LBB988:
-.LBB989:
-.LBB990:
-.LBB991:
-.LBB992:
-.LBB993:
-.LBB994:
+	sub	w0, w21, w0
+.LBB1019:
+.LBB1020:
+.LBB1021:
+.LBB1022:
+.LBB1023:
+.LBB1024:
+.LBB1025:
 	.file 5 "./arch/arm64/include/asm/current.h"
 	.loc 5 19 0
 #APP
@@ -1513,79 +1518,79 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL88:
 #NO_APP
-.LBE994:
-.LBE993:
+.LBE1025:
+.LBE1024:
 	.file 6 "./arch/arm64/include/asm/uaccess.h"
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE992:
-.LBE991:
-.LBE990:
-.LBE989:
-.LBE988:
-	.loc 1 2544 0
+.LBE1023:
+.LBE1022:
+.LBE1021:
+.LBE1020:
+.LBE1019:
+	.loc 1 2548 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 2543 0
-	str	w0, [x29, 104]
-	.loc 1 2545 0
-	stp	w4, w1, [x29, 112]
-.LBB1019:
-.LBB1016:
-.LBB1013:
-.LBB1003:
-.LBB1001:
+	.loc 1 2547 0
+	str	w0, [x29, 120]
+	.loc 1 2549 0
+	stp	w4, w1, [x29, 128]
+.LBB1050:
+.LBB1047:
+.LBB1044:
+.LBB1034:
+.LBB1032:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL89:
 	.loc 6 84 0
-	tbnz	x3, 21, .L238
+	tbnz	x3, 21, .L244
 .LVL90:
-.L304:
-.LBB995:
-.LBB996:
-.LBB997:
+.L316:
+.LBB1026:
+.LBB1027:
+.LBB1028:
 	.file 7 "./include/asm-generic/bitops/non-atomic.h"
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL91:
-.LBE997:
-.LBE996:
-.LBE995:
-.LBE1001:
-.LBE1003:
-.LBE1013:
-.LBE1016:
-.LBE1019:
+.LBE1028:
+.LBE1027:
+.LBE1026:
+.LBE1032:
+.LBE1034:
+.LBE1044:
+.LBE1047:
+.LBE1050:
 	.loc 1 2358 0
-	mov	x0, x21
+	mov	x0, x20
 .LVL92:
-.LBB1020:
-.LBB1017:
-.LBB1014:
-.LBB1004:
-.LBB1002:
+.LBB1051:
+.LBB1048:
+.LBB1045:
+.LBB1035:
+.LBB1033:
 	.loc 6 84 0
-	tbz	x2, 26, .L239
+	tbz	x2, 26, .L245
 .LVL93:
-.L238:
-.LBB998:
-.LBB999:
-.LBB1000:
+.L244:
+.LBB1029:
+.LBB1030:
+.LBB1031:
 	.file 8 "./include/linux/bitops.h"
 	.loc 8 157 0
-	sbfx	x0, x21, 0, 56
+	sbfx	x0, x20, 0, 56
 .LVL94:
-.LBE1000:
-.LBE999:
+.LBE1031:
+.LBE1030:
 	.loc 6 86 0
-	and	x0, x0, x21
+	and	x0, x0, x20
 .LVL95:
-.L239:
-.LBE998:
+.L245:
+.LBE1029:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
-		adds	x0, x0, 48
+		adds	x0, x0, 64
 	csel	x1, xzr, x1, hi
 	csinv	x0, x0, xzr, cc
 	sbcs	xzr, x0, x1
@@ -1594,30 +1599,30 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL96:
 #NO_APP
-.LBE1002:
-.LBE1004:
+.LBE1033:
+.LBE1035:
 	.file 9 "./include/linux/uaccess.h"
 	.loc 9 132 0
-	mov	x22, 48
-	cbnz	x0, .L312
-.L240:
-.LBE1014:
-.LBE1017:
-.LBE1020:
-	.loc 1 2547 0
+	mov	x22, 64
+	cbnz	x0, .L324
+.L246:
+.LBE1045:
+.LBE1048:
+.LBE1051:
+	.loc 1 2551 0
 	mov	x0, x23
 .LVL97:
 	bl	ebc_buf_release
 .LVL98:
-	.loc 1 2548 0
+	.loc 1 2552 0
 	b	.L176
 .LVL99:
 	.p2align 3
 .L178:
 	.loc 1 2374 0
-	cbnz	x21, .L177
+	cbnz	x20, .L177
 	.loc 1 2375 0
-	ldr	x0, [x20, 288]
+	ldr	x0, [x21, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
 .LVL100:
@@ -1632,61 +1637,65 @@ ebc_io_ctl:
 	b	.L176
 .LVL102:
 	.p2align 3
-.L310:
+.L322:
 	.loc 1 2383 0
 	mov	w0, 28674
 	cmp	w1, w0
 	beq	.L183
-	bls	.L313
+	bls	.L325
 	mov	w0, 28675
 	cmp	w1, w0
 	beq	.L187
 	mov	w0, 28676
 	cmp	w1, w0
 	bne	.L180
-	.loc 1 2469 0
-	ldr	x0, [x20, 288]
-	.loc 1 2468 0
+	.loc 1 2473 0
+	ldr	x0, [x21, 288]
+	.loc 1 2472 0
 	mov	w2, 1
-	str	w2, [x20, 812]
-	.loc 1 2469 0
+	str	w2, [x21, 812]
+	.loc 1 2473 0
 	adrp	x1, .LC2
 .LVL103:
-	.loc 1 2470 0
+	.loc 1 2474 0
 	mov	x22, 0
-	.loc 1 2469 0
+	.loc 1 2473 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
 .LVL104:
 	.p2align 2
 .L176:
-	.loc 1 2558 0
+	.loc 1 2562 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
 .LVL105:
-	ldr	x2, [x29, 152]
+	ldr	x2, [x29, 184]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
 .LVL106:
-	cbnz	x1, .L314
+	cbnz	x1, .L326
 	ldp	x19, x20, [sp, 16]
-	ldp	x21, x22, [sp, 32]
 .LVL107:
-	ldr	x23, [sp, 48]
-	ldp	x29, x30, [sp], 160
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+.LVL108:
+	ldr	x25, [sp, 64]
+	ldp	x29, x30, [sp], 192
 	.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
-.LVL108:
+.LVL109:
 	.p2align 3
-.L313:
+.L325:
 	.cfi_restore_state
 	.loc 1 2383 0
 	cmp	w1, 28672
@@ -1694,223 +1703,225 @@ ebc_io_ctl:
 	mov	w0, 28673
 	cmp	w1, w0
 	bne	.L180
-.LBB1021:
-.LBB1022:
-.LBB1023:
-.LBB1024:
-.LBB1025:
-.LBB1026:
-.LBB1027:
+.LBB1052:
+.LBB1053:
+.LBB1054:
+.LBB1055:
+.LBB1056:
+.LBB1057:
+.LBB1058:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL109:
+.LVL110:
 #NO_APP
-.LBE1027:
-.LBE1026:
+.LBE1058:
+.LBE1057:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
-.LVL110:
-	.loc 6 84 0
-	tbz	x2, 21, .L315
 .LVL111:
-.L206:
-.LBB1028:
-.LBB1029:
-.LBB1030:
-	.loc 8 157 0
-	sbfx	x0, x21, 0, 56
+	.loc 6 84 0
+	tbz	x2, 21, .L327
 .LVL112:
-.LBE1030:
-.LBE1029:
-	.loc 6 86 0
-	and	x0, x0, x21
+.L212:
+.LBB1059:
+.LBB1060:
+.LBB1061:
+	.loc 8 157 0
+	sbfx	x0, x20, 0, 56
 .LVL113:
-.L207:
-.LBE1028:
+.LBE1061:
+.LBE1060:
+	.loc 6 86 0
+	and	x0, x0, x20
+.LVL114:
+.L213:
+.LBE1059:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
-		adds	x0, x0, 48
+		adds	x0, x0, 64
 	csel	x1, xzr, x1, hi
 	csinv	x0, x0, xzr, cc
 	sbcs	xzr, x0, x1
 	cset	x0, ls
 
 // 0 "" 2
-.LVL114:
+.LVL115:
 #NO_APP
-.LBE1025:
-.LBE1024:
+.LBE1056:
+.LBE1055:
 	.loc 9 114 0
-	cbz	x0, .L209
-.LBB1036:
-.LBB1037:
-.LBB1038:
-.LBB1039:
-.LBB1040:
+	cbz	x0, .L203
+.LBB1067:
+.LBB1068:
+.LBB1069:
+.LBB1070:
+.LBB1071:
 	.loc 8 157 0
-	sbfx	x0, x21, 0, 56
-.LVL115:
-.LBE1040:
-.LBE1039:
-.LBE1038:
-.LBB1041:
-.LBB1042:
+	sbfx	x0, x20, 0, 56
+.LVL116:
+.LBE1071:
+.LBE1070:
+.LBE1069:
+.LBB1072:
+.LBB1073:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL116:
+.LVL117:
 #NO_APP
-.LBE1042:
-.LBE1041:
-.LBB1043:
+.LBE1073:
+.LBE1072:
+.LBB1074:
 	.loc 6 254 0
-	and	x0, x0, x21
-.LVL117:
-.LBE1043:
+	and	x0, x0, x20
+.LVL118:
+.LBE1074:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x0, x2
-	csel	x1, x21, xzr, eq
+	csel	x1, x20, xzr, eq
 
 // 0 "" 2
-.LVL118:
+.LVL119:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1037:
-.LBE1036:
+.LBE1068:
+.LBE1067:
 	.loc 9 116 0
-	mov	x2, 48
-	add	x0, x29, 104
-.LVL119:
-	bl	__arch_copy_from_user
+	mov	x2, 64
+	add	x0, x29, 120
 .LVL120:
+	bl	__arch_copy_from_user
+.LVL121:
 	.loc 9 118 0
-	cbnz	x0, .L209
-.LBE1023:
-.LBE1022:
-.LBE1021:
-	.loc 1 2423 0
+	cbnz	x0, .L203
+.LBE1054:
+.LBE1053:
+.LBE1052:
+	.loc 1 2427 0
 	bl	ebc_phy_buf_base_get
-.LVL121:
-	ldrsw	x1, [x29, 104]
-	.loc 1 2424 0
+.LVL122:
+	ldrsw	x1, [x29, 120]
+	.loc 1 2428 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
-.LVL122:
-	mov	x21, x0
 .LVL123:
-	.loc 1 2425 0
-	cbz	x0, .L216
-	.loc 1 2426 0
-	ldr	w1, [x29, 108]
-	.loc 1 2435 0
-	add	x20, x20, 184
-	.loc 1 2426 0
-	str	w1, [x21, 40]
-	.loc 1 2430 0
-	ldp	w4, w2, [x29, 124]
-	stp	w4, w2, [x21, 48]
+	mov	x20, x0
+.LVL124:
 	.loc 1 2429 0
-	ldr	w3, [x29, 132]
+	cbz	x0, .L222
+	.loc 1 2430 0
+	ldr	w1, [x29, 124]
+	.loc 1 2439 0
+	add	x21, x21, 184
+	.loc 1 2430 0
+	str	w1, [x20, 40]
+	.loc 1 2434 0
+	ldp	w4, w2, [x29, 140]
+	stp	w4, w2, [x20, 48]
+	.loc 1 2433 0
+	ldr	w3, [x29, 148]
+	.loc 1 2435 0
+	ldr	w1, [x29, 152]
 	.loc 1 2431 0
-	ldr	w1, [x29, 136]
-	.loc 1 2427 0
-	ldr	w5, [x29, 148]
-	.loc 1 2429 0
-	str	w3, [x21, 56]
-	.loc 1 2427 0
-	stp	w1, w5, [x21, 60]
+	ldr	w5, [x29, 164]
 	.loc 1 2433 0
+	str	w3, [x20, 56]
+	.loc 1 2431 0
+	stp	w1, w5, [x20, 60]
+	.loc 1 2437 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL124:
-	.loc 1 2435 0
-	ldr	w0, [x20, 96]
-	cbz	w0, .L316
-.L211:
+.LVL125:
 	.loc 1 2439 0
-	ldr	w0, [x21, 40]
+	ldr	w0, [x21, 96]
+	cbz	w0, .L328
+.L217:
+	.loc 1 2443 0
+	ldr	w0, [x20, 40]
 	cmp	w0, 18
-	beq	.L317
-	.loc 1 2439 0 is_stmt 0 discriminator 3
+	beq	.L329
+	.loc 1 2443 0 is_stmt 0 discriminator 3
 	cmp	w0, 20
-	bne	.L216
-.L213:
-	.loc 1 2440 0 is_stmt 1
+	bne	.L222
+.L219:
+	.loc 1 2444 0 is_stmt 1
 	mov	w0, 1
-	str	w0, [x20, 204]
-.LBB1050:
-.LBB1051:
-	.loc 1 2441 0
+	str	w0, [x21, 204]
+.LBB1081:
+.LBB1082:
+	.loc 1 2445 0
 	mov	w1, 0
-	add	x0, x29, 64
+	add	x0, x29, 80
 	bl	init_wait_entry
-.LVL125:
+.LVL126:
 	adrp	x0, .LANCHOR1
-.LBB1052:
+.LBB1083:
 	add	x0, x0, :lo12:.LANCHOR1
-	add	x21, x0, 328
-	b	.L217
+	add	x20, x0, 328
+	b	.L223
 	.p2align 3
-.L318:
-.LVL126:
-	.loc 1 2441 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L216
-	.loc 1 2441 0 discriminator 7
-	bl	schedule
+.L330:
 .LVL127:
-.L217:
-	.loc 1 2441 0 discriminator 9
-	add	x1, x29, 64
+	.loc 1 2445 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L222
+	.loc 1 2445 0 discriminator 7
+	bl	schedule
+.LVL128:
+.L223:
+	.loc 1 2445 0 discriminator 9
+	add	x1, x29, 80
 	mov	w2, 1
-	mov	x0, x21
+	mov	x0, x20
 	bl	prepare_to_wait_event
-.LVL128:
-	ldr	w1, [x20, 204]
-	cbnz	w1, .L318
-.LBE1052:
-	.loc 1 2441 0 discriminator 4
-	add	x1, x29, 64
-	mov	x0, x21
-	bl	finish_wait
 .LVL129:
+	ldr	w1, [x21, 204]
+	cbnz	w1, .L330
+.LBE1083:
+	.loc 1 2445 0 discriminator 4
+	add	x1, x29, 80
+	mov	x0, x20
+	bl	finish_wait
+.LVL130:
 	.p2align 2
-.L216:
+.L222:
 	mov	x22, 0
 	b	.L176
-.LVL130:
+.LVL131:
 	.p2align 3
 .L193:
-.LBE1051:
-.LBE1050:
-	.loc 1 2525 0 is_stmt 1
+.LBE1082:
+.LBE1081:
+	.loc 1 2529 0 is_stmt 1
+	adrp	x0, .LC6
+	add	x0, x0, :lo12:.LC6
 	bl	ebc_empty_buf_get
-.LVL131:
+.LVL132:
 	mov	x23, x0
-	.loc 1 2526 0
-	cbz	x0, .L201
-	.loc 1 2528 0
-	ldp	w2, w3, [x20, 108]
-	add	x22, x20, 24
-	ldr	x1, [x20, 344]
+	.loc 1 2530 0
+	cbz	x0, .L205
+	.loc 1 2532 0
+	ldp	w2, w3, [x21, 108]
+	add	x22, x21, 24
+	ldr	x1, [x21, 344]
 	ldr	x0, [x0, 16]
 	mul	w2, w2, w3
-	b	.L307
-.LVL132:
+	b	.L319
+.LVL133:
 	.p2align 3
-.L311:
+.L323:
 	.loc 1 2383 0
 	mov	w0, 28678
 	cmp	w1, w0
@@ -1918,414 +1929,414 @@ ebc_io_ctl:
 	mov	w0, 28679
 	cmp	w1, w0
 	bne	.L180
-.LBB1056:
-.LBB1057:
-.LBB1058:
-.LBB1059:
-.LBB1060:
-.LBB1061:
-.LBB1062:
+.LBB1087:
+.LBB1088:
+.LBB1089:
+.LBB1090:
+.LBB1091:
+.LBB1092:
+.LBB1093:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL133:
+.LVL134:
 #NO_APP
-.LBE1062:
-.LBE1061:
+.LBE1093:
+.LBE1092:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
-.LVL134:
-	.loc 6 84 0
-	tbz	x2, 21, .L319
 .LVL135:
-.L218:
-.LBB1063:
-.LBB1064:
-.LBB1065:
-	.loc 8 157 0
-	sbfx	x0, x21, 0, 56
+	.loc 6 84 0
+	tbz	x2, 21, .L331
 .LVL136:
-.LBE1065:
-.LBE1064:
-	.loc 6 86 0
-	and	x0, x0, x21
+.L224:
+.LBB1094:
+.LBB1095:
+.LBB1096:
+	.loc 8 157 0
+	sbfx	x0, x20, 0, 56
 .LVL137:
-.L219:
-.LBE1063:
+.LBE1096:
+.LBE1095:
+	.loc 6 86 0
+	and	x0, x0, x20
+.LVL138:
+.L225:
+.LBE1094:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
-		adds	x0, x0, 48
+		adds	x0, x0, 64
 	csel	x1, xzr, x1, hi
 	csinv	x0, x0, xzr, cc
 	sbcs	xzr, x0, x1
 	cset	x0, ls
 
 // 0 "" 2
-.LVL138:
+.LVL139:
 #NO_APP
-.LBE1060:
-.LBE1059:
+.LBE1091:
+.LBE1090:
 	.loc 9 114 0
-	cbz	x0, .L209
-.LBB1071:
-.LBB1072:
-.LBB1073:
-.LBB1074:
-.LBB1075:
+	cbz	x0, .L203
+.LBB1102:
+.LBB1103:
+.LBB1104:
+.LBB1105:
+.LBB1106:
 	.loc 8 157 0
-	sbfx	x0, x21, 0, 56
-.LVL139:
-.LBE1075:
-.LBE1074:
-.LBE1073:
-.LBB1076:
-.LBB1077:
+	sbfx	x0, x20, 0, 56
+.LVL140:
+.LBE1106:
+.LBE1105:
+.LBE1104:
+.LBB1107:
+.LBB1108:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL140:
+.LVL141:
 #NO_APP
-.LBE1077:
-.LBE1076:
-.LBB1078:
+.LBE1108:
+.LBE1107:
+.LBB1109:
 	.loc 6 254 0
-	and	x0, x0, x21
-.LVL141:
-.LBE1078:
+	and	x0, x0, x20
+.LVL142:
+.LBE1109:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x0, x2
-	csel	x1, x21, xzr, eq
+	csel	x1, x20, xzr, eq
 
 // 0 "" 2
-.LVL142:
+.LVL143:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1072:
-.LBE1071:
+.LBE1103:
+.LBE1102:
 	.loc 9 116 0
-	mov	x2, 48
-	add	x0, x29, 104
-.LVL143:
-	bl	__arch_copy_from_user
+	mov	x2, 64
+	add	x0, x29, 120
 .LVL144:
+	bl	__arch_copy_from_user
+.LVL145:
 	.loc 9 118 0
-	cbnz	x0, .L209
-.LBE1058:
-.LBE1057:
-.LBE1056:
-	.loc 1 2450 0
+	cbnz	x0, .L203
+.LBE1089:
+.LBE1088:
+.LBE1087:
+	.loc 1 2454 0
 	bl	ebc_osd_buf_clone
-.LVL145:
+.LVL146:
 	mov	x1, x0
-	.loc 1 2451 0
-	cbz	x0, .L216
-	.loc 1 2452 0
-	ldr	w6, [x29, 108]
-	.loc 1 2461 0
-	add	x20, x20, 184
+	.loc 1 2455 0
+	cbz	x0, .L222
 	.loc 1 2456 0
-	ldp	w5, w3, [x29, 124]
-	.loc 1 2452 0
-	str	w6, [x1, 40]
-	.loc 1 2457 0
-	ldp	w4, w2, [x29, 132]
+	ldr	w6, [x29, 124]
+	.loc 1 2465 0
+	add	x21, x21, 184
+	.loc 1 2460 0
+	ldp	w5, w3, [x29, 140]
 	.loc 1 2456 0
+	str	w6, [x1, 40]
+	.loc 1 2461 0
+	ldp	w4, w2, [x29, 148]
+	.loc 1 2460 0
 	stp	w5, w3, [x1, 48]
-	.loc 1 2457 0
+	.loc 1 2461 0
 	stp	w4, w2, [x1, 56]
-	.loc 1 2459 0
+	.loc 1 2463 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL146:
-	.loc 1 2461 0
-	ldr	w0, [x20, 96]
-	cbnz	w0, .L216
-	.loc 1 2462 0
+.LVL147:
+	.loc 1 2465 0
+	ldr	w0, [x21, 96]
+	cbnz	w0, .L222
+	.loc 1 2466 0
 	mov	w2, 1
-	str	w2, [x20, 96]
-	.loc 1 2463 0
+	str	w2, [x21, 96]
+	.loc 1 2467 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	mov	x22, 0
 	bl	__wake_up_sync
-.LVL147:
-	b	.L176
 .LVL148:
+	b	.L176
+.LVL149:
 	.p2align 3
-.L312:
-.LBB1085:
-.LBB1018:
-.LBB1015:
-.LBB1005:
-.LBB1006:
-.LBB1007:
-.LBB1008:
-.LBB1009:
+.L324:
+.LBB1116:
+.LBB1049:
+.LBB1046:
+.LBB1036:
+.LBB1037:
+.LBB1038:
+.LBB1039:
+.LBB1040:
 	.loc 8 157 0
-	sbfx	x1, x21, 0, 56
-.LVL149:
-.LBE1009:
-.LBE1008:
-.LBE1007:
-.LBB1010:
-.LBB1011:
+	sbfx	x1, x20, 0, 56
+.LVL150:
+.LBE1040:
+.LBE1039:
+.LBE1038:
+.LBB1041:
+.LBB1042:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL150:
+.LVL151:
 #NO_APP
-.LBE1011:
-.LBE1010:
-.LBB1012:
+.LBE1042:
+.LBE1041:
+.LBB1043:
 	.loc 6 254 0
-	and	x1, x1, x21
-.LVL151:
-.LBE1012:
+	and	x1, x1, x20
+.LVL152:
+.LBE1043:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL152:
+.LVL153:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
-	csel	x0, x21, xzr, eq
+	csel	x0, x20, xzr, eq
 
 // 0 "" 2
-.LVL153:
+.LVL154:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1006:
-.LBE1005:
+.LBE1037:
+.LBE1036:
 	.loc 9 134 0
 	mov	x2, x22
-	add	x1, x29, 104
-.LVL154:
-	bl	__arch_copy_to_user
+	add	x1, x29, 120
 .LVL155:
-	sxtw	x22, w0
-	b	.L240
+	bl	__arch_copy_to_user
 .LVL156:
+	sxtw	x22, w0
+	b	.L246
+.LVL157:
 	.p2align 3
 .L191:
-.LBE1015:
-.LBE1018:
-.LBE1085:
+.LBE1046:
+.LBE1049:
+.LBE1116:
 	.loc 1 2385 0
 	bl	ebc_osd_buf_get
-.LVL157:
+.LVL158:
 	.loc 1 2386 0
-	cbz	x0, .L201
+	cbz	x0, .L205
 	.loc 1 2389 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
-.LVL158:
+.LVL159:
 	.loc 1 2394 0
-	ldr	w1, [x20, 176]
-.LBB1086:
-.LBB1087:
-.LBB1088:
-.LBB1089:
-.LBB1090:
-.LBB1091:
-.LBB1092:
+	ldr	w1, [x21, 176]
+.LBB1117:
+.LBB1118:
+.LBB1119:
+.LBB1120:
+.LBB1121:
+.LBB1122:
+.LBB1123:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL159:
+.LVL160:
 #NO_APP
-.LBE1092:
-.LBE1091:
+.LBE1123:
+.LBE1122:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1090:
-.LBE1089:
-.LBE1088:
-.LBE1087:
-.LBE1086:
-	.loc 1 2389 0
+.LBE1121:
+.LBE1120:
+.LBE1119:
+.LBE1118:
+.LBE1117:
+	.loc 1 2389 0
 	sub	w0, w22, w0
 	.loc 1 2393 0
-	ldp	w5, w4, [x20, 108]
+	ldp	w5, w4, [x21, 108]
 	.loc 1 2394 0
-	str	w1, [x29, 120]
+	str	w1, [x29, 136]
 	.loc 1 2392 0
-	stp	w4, w5, [x29, 112]
+	stp	w4, w5, [x29, 128]
 	.loc 1 2395 0
 	mov	w1, 16
 	.loc 1 2391 0
-	str	w0, [x29, 104]
+	str	w0, [x29, 120]
 	.loc 1 2395 0
-	str	w1, [x29, 148]
-.LBB1119:
-.LBB1116:
-.LBB1113:
-.LBB1102:
-.LBB1099:
+	str	w1, [x29, 164]
+.LBB1150:
+.LBB1147:
+.LBB1144:
+.LBB1133:
+.LBB1130:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL160:
-	.loc 6 84 0
-	tbz	x3, 21, .L320
 .LVL161:
+	.loc 6 84 0
+	tbz	x3, 21, .L332
+.LVL162:
 .L197:
-.LBB1093:
-.LBB1094:
-.LBB1095:
+.LBB1124:
+.LBB1125:
+.LBB1126:
 	.loc 8 157 0
-	sbfx	x0, x21, 0, 56
-.LVL162:
-.LBE1095:
-.LBE1094:
-	.loc 6 86 0
-	and	x0, x0, x21
+	sbfx	x0, x20, 0, 56
 .LVL163:
+.LBE1126:
+.LBE1125:
+	.loc 6 86 0
+	and	x0, x0, x20
+.LVL164:
 .L198:
-.LBE1093:
+.LBE1124:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
-		adds	x0, x0, 48
+		adds	x0, x0, 64
 	csel	x1, xzr, x1, hi
 	csinv	x0, x0, xzr, cc
 	sbcs	xzr, x0, x1
 	cset	x0, ls
 
 // 0 "" 2
-.LVL164:
+.LVL165:
 #NO_APP
-.LBE1099:
-.LBE1102:
+.LBE1130:
+.LBE1133:
 	.loc 9 132 0
-	mov	x22, 48
+	mov	x22, 64
 	cbz	x0, .L176
-.LBB1103:
-.LBB1104:
-.LBB1105:
-.LBB1106:
-.LBB1107:
+.LBB1134:
+.LBB1135:
+.LBB1136:
+.LBB1137:
+.LBB1138:
 	.loc 8 157 0
-	sbfx	x1, x21, 0, 56
-.LVL165:
-.LBE1107:
-.LBE1106:
-.LBE1105:
-.LBB1108:
-.LBB1109:
+	sbfx	x1, x20, 0, 56
+.LVL166:
+.LBE1138:
+.LBE1137:
+.LBE1136:
+.LBB1139:
+.LBB1140:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL166:
+.LVL167:
 #NO_APP
-.LBE1109:
-.LBE1108:
-.LBB1110:
+.LBE1140:
+.LBE1139:
+.LBB1141:
 	.loc 6 254 0
-	and	x1, x1, x21
-.LVL167:
-.LBE1110:
+	and	x1, x1, x20
+.LVL168:
+.LBE1141:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL168:
+.LVL169:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
-	csel	x0, x21, xzr, eq
+	csel	x0, x20, xzr, eq
 
 // 0 "" 2
-.LVL169:
+.LVL170:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1104:
-.LBE1103:
+.LBE1135:
+.LBE1134:
 	.loc 9 134 0
 	mov	x2, x22
-	add	x1, x29, 104
-.LVL170:
-	bl	__arch_copy_to_user
+	add	x1, x29, 120
 .LVL171:
+	bl	__arch_copy_to_user
+.LVL172:
 	sxtw	x22, w0
 	b	.L176
-.LVL172:
+.LVL173:
 	.p2align 3
 .L187:
-.LBE1113:
-.LBE1116:
-.LBE1119:
-.LBB1120:
-.LBB1121:
-.LBB1122:
-.LBB1123:
-.LBB1124:
-.LBB1125:
-.LBB1126:
+.LBE1144:
+.LBE1147:
+.LBE1150:
+.LBB1151:
+.LBB1152:
+.LBB1153:
+.LBB1154:
+.LBB1155:
+.LBB1156:
+.LBB1157:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL173:
+.LVL174:
 #NO_APP
-.LBE1126:
-.LBE1125:
+.LBE1157:
+.LBE1156:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
-.LBE1124:
-.LBE1123:
-.LBE1122:
-.LBE1121:
-.LBE1120:
-	.loc 1 2477 0
-	add	x22, x20, 248
-.LBB1155:
-.LBB1151:
-.LBB1147:
-.LBB1136:
-.LBB1133:
+.LBE1155:
+.LBE1154:
+.LBE1153:
+.LBE1152:
+.LBE1151:
+	.loc 1 2481 0
+	add	x22, x21, 248
+.LBB1186:
+.LBB1182:
+.LBB1178:
+.LBB1167:
+.LBB1164:
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
-.LVL174:
-	.loc 6 84 0
-	tbz	x2, 21, .L321
 .LVL175:
-.L221:
-.LBB1127:
-.LBB1128:
-.LBB1129:
-	.loc 8 157 0
-	sbfx	x0, x21, 0, 56
+	.loc 6 84 0
+	tbz	x2, 21, .L333
 .LVL176:
-.LBE1129:
-.LBE1128:
-	.loc 6 86 0
-	and	x0, x0, x21
+.L227:
+.LBB1158:
+.LBB1159:
+.LBB1160:
+	.loc 8 157 0
+	sbfx	x0, x20, 0, 56
 .LVL177:
-.L222:
-.LBE1127:
+.LBE1160:
+.LBE1159:
+	.loc 6 86 0
+	and	x0, x0, x20
+.LVL178:
+.L228:
+.LBE1158:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2336,843 +2347,1008 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL178:
+.LVL179:
 #NO_APP
 	mov	x3, x0
-.LBE1133:
-.LBE1136:
+.LBE1164:
+.LBE1167:
 	.loc 9 114 0
-	cbz	x0, .L250
-.LBB1137:
-.LBB1138:
-.LBB1139:
-.LBB1140:
-.LBB1141:
+	cbz	x0, .L257
+.LBB1168:
+.LBB1169:
+.LBB1170:
+.LBB1171:
+.LBB1172:
 	.loc 8 157 0
-	sbfx	x0, x21, 0, 56
-.LBE1141:
-.LBE1140:
-.LBE1139:
-.LBB1142:
-.LBB1143:
+	sbfx	x0, x20, 0, 56
+.LBE1172:
+.LBE1171:
+.LBE1170:
+.LBB1173:
+.LBB1174:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL179:
+.LVL180:
 #NO_APP
-.LBE1143:
-.LBE1142:
-.LBB1144:
+.LBE1174:
+.LBE1173:
+.LBB1175:
 	.loc 6 254 0
-	and	x0, x0, x21
-.LVL180:
-.LBE1144:
+	and	x0, x0, x20
+.LVL181:
+.LBE1175:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x0, x2
-	csel	x1, x21, xzr, eq
+	csel	x1, x20, xzr, eq
 
 // 0 "" 2
-.LVL181:
+.LVL182:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1138:
-.LBE1137:
+.LBE1169:
+.LBE1168:
 	.loc 9 116 0
 	mov	x2, 4
 	mov	x0, x22
-.LVL182:
-	bl	__arch_copy_from_user
 .LVL183:
-	.loc 9 118 0
-	cbnz	x0, .L322
-.LBE1147:
-.LBE1151:
-.LBE1155:
-	.loc 1 2481 0
-	add	x20, x20, 184
-	ldr	w2, [x20, 64]
-	ldr	x0, [x20, 104]
+	bl	__arch_copy_from_user
 .LVL184:
-	.loc 1 2482 0
+	.loc 9 118 0
+	cbnz	x0, .L334
+.LBE1178:
+.LBE1182:
+.LBE1186:
+	.loc 1 2485 0
+	add	x21, x21, 184
+	ldr	w2, [x21, 64]
+	ldr	x0, [x21, 104]
+.LVL185:
+	.loc 1 2486 0
 	mov	x22, 0
-	.loc 1 2481 0
-	adrp	x1, .LC7
-	add	x1, x1, :lo12:.LC7
+	.loc 1 2485 0
+	adrp	x1, .LC8
+	add	x1, x1, :lo12:.LC8
 	bl	_dev_info
-.LVL185:
-	.loc 1 2482 0
-	b	.L176
 .LVL186:
+	.loc 1 2486 0
+	b	.L176
+.LVL187:
 	.p2align 3
 .L181:
-	.loc 1 2474 0
-	ldr	x0, [x20, 288]
+	.loc 1 2478 0
+	ldr	x0, [x21, 288]
 	adrp	x1, .LC3
-.LVL187:
-	.loc 1 2472 0
-	str	wzr, [x20, 812]
-	.loc 1 2475 0
+.LVL188:
+	.loc 1 2476 0
+	str	wzr, [x21, 812]
+	.loc 1 2479 0
 	mov	x22, 0
-	.loc 1 2473 0
-	str	wzr, [x20, 816]
-	.loc 1 2474 0
+	.loc 1 2477 0
+	str	wzr, [x21, 816]
+	.loc 1 2478 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
-.LVL188:
-	.loc 1 2475 0
-	b	.L176
 .LVL189:
+	.loc 1 2479 0
+	b	.L176
+.LVL190:
 	.p2align 3
 .L189:
-	.loc 1 2512 0
+	.loc 1 2516 0
+	adrp	x0, .LC6
+	add	x0, x0, :lo12:.LC6
 	bl	ebc_empty_buf_get
-.LVL190:
+.LVL191:
 	mov	x23, x0
-	.loc 1 2513 0
-	cbz	x0, .L201
-	.loc 1 2515 0
-	ldp	w2, w3, [x20, 108]
-	add	x22, x20, 24
-	ldr	x1, [x20, 336]
+	.loc 1 2517 0
+	cbz	x0, .L205
+	.loc 1 2519 0
+	ldp	w2, w3, [x21, 108]
+	add	x22, x21, 24
+	ldr	x1, [x21, 336]
 	ldr	x0, [x0, 16]
 	mul	w2, w2, w3
-	b	.L307
-.LVL191:
+	b	.L319
+.LVL192:
 	.p2align 3
 .L194:
-	.loc 1 2499 0
+	.loc 1 2503 0
+	adrp	x0, .LC6
+	add	x0, x0, :lo12:.LC6
 	bl	ebc_empty_buf_get
-.LVL192:
+.LVL193:
 	mov	x23, x0
-	.loc 1 2500 0
-	cbz	x0, .L201
-	.loc 1 2502 0
-	ldp	w2, w3, [x20, 108]
-	add	x22, x20, 24
-	ldr	x1, [x20, 328]
+	.loc 1 2504 0
+	cbz	x0, .L205
+	.loc 1 2506 0
+	ldp	w2, w3, [x21, 108]
+	add	x22, x21, 24
+	ldr	x1, [x21, 328]
 	ldr	x0, [x0, 16]
 	mul	w2, w2, w3
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL193:
-	.loc 1 2503 0
-	ldr	x20, [x23, 8]
-	bl	ebc_phy_buf_base_get
 .LVL194:
-	sub	w0, w20, w0
-.LBB1156:
-.LBB1157:
-.LBB1158:
-.LBB1159:
-.LBB1160:
-.LBB1161:
-.LBB1162:
+	.loc 1 2507 0
+	ldr	x21, [x23, 8]
+	bl	ebc_phy_buf_base_get
+.LVL195:
+	sub	w0, w21, w0
+.LBB1187:
+.LBB1188:
+.LBB1189:
+.LBB1190:
+.LBB1191:
+.LBB1192:
+.LBB1193:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL195:
+.LVL196:
 #NO_APP
-.LBE1162:
-.LBE1161:
+.LBE1193:
+.LBE1192:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1160:
-.LBE1159:
-.LBE1158:
-.LBE1157:
-.LBE1156:
-	.loc 1 2506 0
+.LBE1191:
+.LBE1190:
+.LBE1189:
+.LBE1188:
+.LBE1187:
+	.loc 1 2510 0
 	ldp	w4, w1, [x22, 84]
-	.loc 1 2504 0
-	str	w0, [x29, 104]
-	.loc 1 2505 0
-	stp	w1, w4, [x29, 112]
-.LBB1167:
-.LBB1166:
-.LBB1165:
-.LBB1164:
-.LBB1163:
+	.loc 1 2508 0
+	str	w0, [x29, 120]
+	.loc 1 2509 0
+	stp	w1, w4, [x29, 128]
+.LBB1198:
+.LBB1197:
+.LBB1196:
+.LBB1195:
+.LBB1194:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL196:
-	.loc 6 84 0
-	tbnz	x3, 21, .L238
-	b	.L304
 .LVL197:
+	.loc 6 84 0
+	tbnz	x3, 21, .L244
+	b	.L316
+.LVL198:
 	.p2align 3
 .L183:
-.LBE1163:
-.LBE1164:
-.LBE1165:
-.LBE1166:
-.LBE1167:
-	.loc 1 2488 0
-	ldp	w1, w0, [x20, 116]
-.LVL198:
-.LBB1168:
-.LBB1169:
-.LBB1170:
-.LBB1171:
-.LBB1172:
-.LBB1173:
-.LBB1174:
+.LBE1194:
+.LBE1195:
+.LBE1196:
+.LBE1197:
+.LBE1198:
+	.loc 1 2492 0
+	ldp	w1, w0, [x21, 116]
+.LVL199:
+.LBB1199:
+.LBB1200:
+.LBB1201:
+.LBB1202:
+.LBB1203:
+.LBB1204:
+.LBB1205:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL199:
+.LVL200:
 #NO_APP
-.LBE1174:
-.LBE1173:
+.LBE1205:
+.LBE1204:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1172:
-.LBE1171:
-.LBE1170:
-.LBE1169:
-.LBE1168:
-	.loc 1 2485 0
-	ldp	w6, w5, [x20, 108]
-	.loc 1 2488 0
-	stp	w1, w0, [x29, 140]
-	.loc 1 2486 0
-	ldr	w4, [x20, 176]
+.LBE1203:
+.LBE1202:
+.LBE1201:
+.LBE1200:
+.LBE1199:
 	.loc 1 2489 0
+	ldp	w6, w5, [x21, 108]
+	.loc 1 2492 0
+	stp	w1, w0, [x29, 156]
+	.loc 1 2490 0
+	ldr	w4, [x21, 176]
+	.loc 1 2493 0
 	mov	w0, 16
-	.loc 1 2484 0
-	stp	w5, w6, [x29, 112]
-	.loc 1 2486 0
-	str	w4, [x29, 120]
-	.loc 1 2489 0
-	str	w0, [x29, 148]
-.LBB1203:
-.LBB1199:
-.LBB1195:
-.LBB1184:
-.LBB1181:
+	.loc 1 2488 0
+	stp	w5, w6, [x29, 128]
+	.loc 1 2490 0
+	str	w4, [x29, 136]
+	.loc 1 2493 0
+	str	w0, [x29, 164]
+.LBB1234:
+.LBB1230:
+.LBB1226:
+.LBB1215:
+.LBB1212:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL200:
-	.loc 6 84 0
-	tbz	x3, 21, .L323
 .LVL201:
-.L225:
-.LBB1175:
-.LBB1176:
-.LBB1177:
-	.loc 8 157 0
-	sbfx	x0, x21, 0, 56
+	.loc 6 84 0
+	tbz	x3, 21, .L335
 .LVL202:
-.LBE1177:
-.LBE1176:
-	.loc 6 86 0
-	and	x0, x0, x21
+.L231:
+.LBB1206:
+.LBB1207:
+.LBB1208:
+	.loc 8 157 0
+	sbfx	x0, x20, 0, 56
 .LVL203:
-.L226:
-.LBE1175:
+.LBE1208:
+.LBE1207:
+	.loc 6 86 0
+	and	x0, x0, x20
+.LVL204:
+.L232:
+.LBE1206:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
-		adds	x0, x0, 48
+		adds	x0, x0, 64
 	csel	x1, xzr, x1, hi
 	csinv	x0, x0, xzr, cc
 	sbcs	xzr, x0, x1
 	cset	x0, ls
 
 // 0 "" 2
-.LVL204:
+.LVL205:
 #NO_APP
-.LBE1181:
-.LBE1184:
+.LBE1212:
+.LBE1215:
 	.loc 9 132 0
-	cbnz	x0, .L227
-.L228:
-.LBE1195:
-.LBE1199:
-.LBE1203:
-	.loc 1 2492 0
-	ldr	x0, [x20, 288]
-.LVL205:
-	adrp	x1, .LC5
+	cbnz	x0, .L233
+.L234:
+.LBE1226:
+.LBE1230:
+.LBE1234:
+	.loc 1 2496 0
+	ldr	x0, [x21, 288]
 .LVL206:
-	.loc 1 2493 0
+	adrp	x1, .LC5
+.LVL207:
+	.loc 1 2497 0
 	mov	x22, -14
-	.loc 1 2492 0
+	.loc 1 2496 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
-.LVL207:
-	.loc 1 2493 0
-	b	.L176
 .LVL208:
+	.loc 1 2497 0
+	b	.L176
+.LVL209:
 	.p2align 3
 .L180:
-	.loc 1 2553 0
-	ldr	x0, [x20, 288]
+	.loc 1 2557 0
+	ldr	x0, [x21, 288]
 	adrp	x2, .LANCHOR2
-	adrp	x1, .LC6
-.LVL209:
+	adrp	x1, .LC7
+.LVL210:
 	add	x2, x2, :lo12:.LANCHOR2
-	add	x1, x1, :lo12:.LC6
-	.loc 1 2554 0
+	add	x1, x1, :lo12:.LC7
+	.loc 1 2558 0
 	mov	x22, 0
-	.loc 1 2553 0
-	bl	_dev_err
-.LVL210:
 	.loc 1 2557 0
-	b	.L176
+	bl	_dev_err
 .LVL211:
+	.loc 1 2561 0
+	b	.L176
+.LVL212:
 	.p2align 3
 .L185:
-	.loc 1 2400 0
-	bl	ebc_empty_buf_get
-.LVL212:
+.LBB1235:
+.LBB1236:
+.LBB1237:
+.LBB1238:
+.LBB1239:
+.LBB1240:
+.LBB1241:
+	.loc 5 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x0, sp_el0
+// 0 "" 2
+.LVL213:
+#NO_APP
+.LBE1241:
+.LBE1240:
+	.loc 6 85 0
+	ldr	w2, [x0, 52]
+	.loc 6 77 0
+	ldr	x1, [x0, 8]
+.LVL214:
+	.loc 6 84 0
+	tbz	x2, 21, .L336
+.LVL215:
+.L201:
+.LBB1242:
+.LBB1243:
+.LBB1244:
+	.loc 8 157 0
+	sbfx	x0, x20, 0, 56
+.LVL216:
+.LBE1244:
+.LBE1243:
+	.loc 6 86 0
+	and	x0, x0, x20
+.LVL217:
+.L202:
+.LBE1242:
+	.loc 6 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
+.LVL218:
+#NO_APP
+.LBE1239:
+.LBE1238:
+	.loc 9 114 0
+	cbz	x0, .L203
+.LBB1250:
+.LBB1251:
+.LBB1252:
+.LBB1253:
+.LBB1254:
+	.loc 8 157 0
+	lsl	x22, x20, 8
+.LBE1254:
+.LBE1253:
+.LBE1252:
+.LBB1255:
+.LBB1256:
+	.loc 5 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x0, sp_el0
+// 0 "" 2
+.LVL219:
+#NO_APP
+.LBE1256:
+.LBE1255:
+.LBB1257:
+	.loc 6 254 0
+	and	x2, x20, x22, asr 8
+.LVL220:
+.LBE1257:
+	.loc 6 249 0
+	ldr	x0, [x0, 8]
+.LVL221:
+#APP
+// 249 "./arch/arm64/include/asm/uaccess.h" 1
+		bics	xzr, x2, x0
+	csel	x1, x20, xzr, eq
+
+// 0 "" 2
+.LVL222:
+	.loc 6 257 0
+// 257 "./arch/arm64/include/asm/uaccess.h" 1
+	hint #20
+// 0 "" 2
+#NO_APP
+.LBE1251:
+.LBE1250:
+	.loc 9 116 0
+	add	x24, x29, 120
+	mov	x2, 64
+.LVL223:
+	mov	x0, x24
+	bl	__arch_copy_from_user
+.LVL224:
 	mov	x23, x0
-	.loc 1 2401 0
-	cbz	x0, .L201
+.LVL225:
+	.loc 9 118 0
+	cbnz	x0, .L204
+.L207:
+.LBE1237:
+.LBE1236:
+.LBE1235:
 	.loc 1 2404 0
-	ldr	x22, [x0, 8]
+	add	x0, x24, 48
+	bl	ebc_empty_buf_get
+.LVL226:
+	mov	x25, x0
+	.loc 1 2405 0
+	cbz	x0, .L205
+	.loc 1 2408 0
+	ldr	x23, [x0, 8]
+.LVL227:
 	bl	ebc_phy_buf_base_get
-.LVL213:
-	.loc 1 2409 0
-	ldr	w1, [x20, 176]
-.LBB1204:
-.LBB1205:
-.LBB1206:
-.LBB1207:
-.LBB1208:
-.LBB1209:
-.LBB1210:
+.LVL228:
+	.loc 1 2412 0
+	ldp	w3, w1, [x21, 108]
+	.loc 1 2411 0
+	stp	w1, w3, [x29, 128]
+.LBB1266:
+.LBB1267:
+.LBB1268:
+.LBB1269:
+.LBB1270:
+.LBB1271:
+.LBB1272:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL214:
+.LVL229:
 #NO_APP
-.LBE1210:
-.LBE1209:
+.LBE1272:
+.LBE1271:
+.LBE1270:
+.LBE1269:
+.LBE1268:
+.LBE1267:
+.LBE1266:
+	.loc 1 2413 0
+	ldr	w1, [x21, 176]
+	.loc 1 2408 0
+	sub	w0, w23, w0
+.LBB1298:
+.LBB1294:
+.LBB1290:
+.LBB1281:
+.LBB1277:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1208:
-.LBE1207:
-.LBE1206:
-.LBE1205:
-.LBE1204:
-	.loc 1 2404 0
-	sub	w0, w22, w0
-	.loc 1 2408 0
-	ldp	w5, w4, [x20, 108]
-	.loc 1 2409 0
-	str	w1, [x29, 120]
-	.loc 1 2407 0
-	stp	w4, w5, [x29, 112]
-	.loc 1 2410 0
+.LBE1277:
+.LBE1281:
+.LBE1290:
+.LBE1294:
+.LBE1298:
+	.loc 1 2413 0
+	str	w1, [x29, 136]
+	.loc 1 2414 0
 	mov	w1, 16
-	.loc 1 2406 0
-	str	w0, [x29, 104]
 	.loc 1 2410 0
-	str	w1, [x29, 148]
-.LBB1239:
-.LBB1235:
-.LBB1231:
-.LBB1220:
-.LBB1217:
+	str	w0, [x29, 120]
+	.loc 1 2414 0
+	str	w1, [x29, 164]
+.LBB1299:
+.LBB1295:
+.LBB1291:
+.LBB1282:
+.LBB1278:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL215:
+.LVL230:
 	.loc 6 84 0
-	tbz	x3, 21, .L324
-.LVL216:
-.L202:
-.LBB1211:
-.LBB1212:
-.LBB1213:
-	.loc 8 157 0
-	sbfx	x0, x21, 0, 56
-.LVL217:
-.LBE1213:
-.LBE1212:
+	tbz	x3, 21, .L337
+.LVL231:
+.L208:
+.LBB1273:
 	.loc 6 86 0
-	and	x0, x0, x21
-.LVL218:
-.L203:
-.LBE1211:
+	and	x0, x20, x22, asr 8
+.L209:
+.LVL232:
+.LBE1273:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
-		adds	x0, x0, 48
+		adds	x0, x0, 64
 	csel	x1, xzr, x1, hi
 	csinv	x0, x0, xzr, cc
 	sbcs	xzr, x0, x1
 	cset	x0, ls
 
 // 0 "" 2
-.LVL219:
+.LVL233:
 #NO_APP
-.LBE1217:
-.LBE1220:
+.LBE1278:
+.LBE1282:
 	.loc 9 132 0
-	cbnz	x0, .L204
-.L205:
-.LBE1231:
-.LBE1235:
-.LBE1239:
-	.loc 1 2414 0
-	mov	x0, x23
-.LVL220:
-	.loc 1 2415 0
+	cbnz	x0, .L210
+.LVL234:
+.L211:
+.LBE1291:
+.LBE1295:
+.LBE1299:
+	.loc 1 2418 0
+	mov	x0, x25
+.LVL235:
+	.loc 1 2419 0
 	mov	x22, -14
-	.loc 1 2414 0
+.LVL236:
+	.loc 1 2418 0
 	bl	ebc_buf_release
-.LVL221:
-	.loc 1 2415 0
+.LVL237:
+	.loc 1 2419 0
 	b	.L176
-.LVL222:
+.LVL238:
 	.p2align 3
-.L319:
-.LBB1240:
-.LBB1083:
-.LBB1081:
+.L331:
+.LBB1300:
+.LBB1114:
+.LBB1112:
+.LBB1110:
+.LBB1100:
+.LBB1097:
+.LBB1098:
+.LBB1099:
+	.loc 7 106 0
+	ldr	x2, [x0]
+.LBE1099:
+.LBE1098:
+.LBE1097:
+.LBE1100:
+.LBE1110:
+.LBE1112:
+.LBE1114:
+.LBE1300:
+	.loc 1 2358 0
+	mov	x0, x20
+.LVL239:
+.LBB1301:
+.LBB1115:
+.LBB1113:
+.LBB1111:
+.LBB1101:
+	.loc 6 84 0
+	tbz	x2, 26, .L225
+	b	.L224
+.LVL240:
+	.p2align 3
+.L336:
+.LBE1101:
+.LBE1111:
+.LBE1113:
+.LBE1115:
+.LBE1301:
+.LBB1302:
+.LBB1263:
+.LBB1260:
+.LBB1258:
+.LBB1248:
+.LBB1245:
+.LBB1246:
+.LBB1247:
+	.loc 7 106 0
+	ldr	x2, [x0]
+.LBE1247:
+.LBE1246:
+.LBE1245:
+.LBE1248:
+.LBE1258:
+.LBE1260:
+.LBE1263:
+.LBE1302:
+	.loc 1 2358 0
+	mov	x0, x20
+.LVL241:
+.LBB1303:
+.LBB1264:
+.LBB1261:
+.LBB1259:
+.LBB1249:
+	.loc 6 84 0
+	tbz	x2, 26, .L202
+	b	.L201
+.LVL242:
+	.p2align 3
+.L335:
+.LBE1249:
+.LBE1259:
+.LBE1261:
+.LBE1264:
+.LBE1303:
+.LBB1304:
+.LBB1231:
+.LBB1227:
+.LBB1216:
+.LBB1213:
+.LBB1209:
+.LBB1210:
+.LBB1211:
+	.loc 7 106 0
+	ldr	x2, [x2]
+.LVL243:
+.LBE1211:
+.LBE1210:
+.LBE1209:
+.LBE1213:
+.LBE1216:
+.LBE1227:
+.LBE1231:
+.LBE1304:
+	.loc 1 2358 0
+	mov	x0, x20
+.LVL244:
+.LBB1305:
+.LBB1232:
+.LBB1228:
+.LBB1217:
+.LBB1214:
+	.loc 6 84 0
+	tbz	x2, 26, .L232
+	b	.L231
+.LVL245:
+	.p2align 3
+.L327:
+.LBE1214:
+.LBE1217:
+.LBE1228:
+.LBE1232:
+.LBE1305:
+.LBB1306:
 .LBB1079:
-.LBB1069:
-.LBB1066:
-.LBB1067:
-.LBB1068:
+.LBB1077:
+.LBB1075:
+.LBB1065:
+.LBB1062:
+.LBB1063:
+.LBB1064:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1068:
-.LBE1067:
-.LBE1066:
-.LBE1069:
+.LBE1064:
+.LBE1063:
+.LBE1062:
+.LBE1065:
+.LBE1075:
+.LBE1077:
 .LBE1079:
-.LBE1081:
-.LBE1083:
-.LBE1240:
+.LBE1306:
 	.loc 1 2358 0
-	mov	x0, x21
-.LVL223:
-.LBB1241:
-.LBB1084:
-.LBB1082:
+	mov	x0, x20
+.LVL246:
+.LBB1307:
 .LBB1080:
-.LBB1070:
+.LBB1078:
+.LBB1076:
+.LBB1066:
 	.loc 6 84 0
-	tbz	x2, 26, .L219
-	b	.L218
-.LVL224:
+	tbz	x2, 26, .L213
+	b	.L212
+.LVL247:
 	.p2align 3
-.L315:
-.LBE1070:
+.L333:
+.LBE1066:
+.LBE1076:
+.LBE1078:
 .LBE1080:
-.LBE1082:
-.LBE1084:
-.LBE1241:
-.LBB1242:
-.LBB1048:
-.LBB1046:
-.LBB1044:
-.LBB1034:
-.LBB1031:
-.LBB1032:
-.LBB1033:
-	.loc 7 106 0
-	ldr	x2, [x0]
-.LBE1033:
-.LBE1032:
-.LBE1031:
-.LBE1034:
-.LBE1044:
-.LBE1046:
-.LBE1048:
-.LBE1242:
-	.loc 1 2358 0
-	mov	x0, x21
-.LVL225:
-.LBB1243:
-.LBB1049:
-.LBB1047:
-.LBB1045:
-.LBB1035:
-	.loc 6 84 0
-	tbz	x2, 26, .L207
-	b	.L206
-.LVL226:
-	.p2align 3
-.L323:
-.LBE1035:
-.LBE1045:
-.LBE1047:
-.LBE1049:
-.LBE1243:
-.LBB1244:
-.LBB1200:
-.LBB1196:
-.LBB1185:
-.LBB1182:
-.LBB1178:
+.LBE1307:
+.LBB1308:
+.LBB1183:
 .LBB1179:
-.LBB1180:
+.LBB1176:
+.LBB1165:
+.LBB1161:
+.LBB1162:
+.LBB1163:
 	.loc 7 106 0
-	ldr	x2, [x2]
-.LVL227:
-.LBE1180:
+	ldr	x2, [x0]
+.LBE1163:
+.LBE1162:
+.LBE1161:
+.LBE1165:
+.LBE1176:
 .LBE1179:
-.LBE1178:
-.LBE1182:
-.LBE1185:
-.LBE1196:
-.LBE1200:
-.LBE1244:
+.LBE1183:
+.LBE1308:
 	.loc 1 2358 0
-	mov	x0, x21
-.LVL228:
-.LBB1245:
-.LBB1201:
-.LBB1197:
-.LBB1186:
-.LBB1183:
+	mov	x0, x20
+.LVL248:
+.LBB1309:
+.LBB1184:
+.LBB1180:
+.LBB1177:
+.LBB1166:
 	.loc 6 84 0
-	tbz	x2, 26, .L226
-	b	.L225
-.LVL229:
+	tbz	x2, 26, .L228
+	b	.L227
+.LVL249:
 	.p2align 3
-.L321:
-.LBE1183:
-.LBE1186:
-.LBE1197:
-.LBE1201:
-.LBE1245:
-.LBB1246:
-.LBB1152:
+.L332:
+.LBE1166:
+.LBE1177:
+.LBE1180:
+.LBE1184:
+.LBE1309:
+.LBB1310:
 .LBB1148:
 .LBB1145:
-.LBB1134:
-.LBB1130:
+.LBB1142:
 .LBB1131:
-.LBB1132:
+.LBB1127:
+.LBB1128:
+.LBB1129:
 	.loc 7 106 0
-	ldr	x2, [x0]
-.LBE1132:
+	ldr	x2, [x2]
+.LVL250:
+.LBE1129:
+.LBE1128:
+.LBE1127:
 .LBE1131:
-.LBE1130:
-.LBE1134:
+.LBE1142:
 .LBE1145:
 .LBE1148:
-.LBE1152:
-.LBE1246:
+.LBE1310:
 	.loc 1 2358 0
-	mov	x0, x21
-.LVL230:
-.LBB1247:
-.LBB1153:
+	mov	x0, x20
+.LVL251:
+.LBB1311:
 .LBB1149:
 .LBB1146:
-.LBB1135:
+.LBB1143:
+.LBB1132:
 	.loc 6 84 0
-	tbz	x2, 26, .L222
-	b	.L221
-.LVL231:
+	tbz	x2, 26, .L198
+	b	.L197
+.LVL252:
 	.p2align 3
-.L324:
-.LBE1135:
+.L337:
+.LBE1132:
+.LBE1143:
 .LBE1146:
 .LBE1149:
-.LBE1153:
-.LBE1247:
-.LBB1248:
-.LBB1236:
-.LBB1232:
-.LBB1221:
-.LBB1218:
-.LBB1214:
-.LBB1215:
-.LBB1216:
-	.loc 7 106 0
-	ldr	x2, [x2]
-.LVL232:
-.LBE1216:
-.LBE1215:
-.LBE1214:
-.LBE1218:
-.LBE1221:
-.LBE1232:
-.LBE1236:
-.LBE1248:
-	.loc 1 2358 0
-	mov	x0, x21
-.LVL233:
-.LBB1249:
-.LBB1237:
-.LBB1233:
-.LBB1222:
-.LBB1219:
-	.loc 6 84 0
-	tbz	x2, 26, .L203
-	b	.L202
-.LVL234:
-	.p2align 3
-.L320:
-.LBE1219:
-.LBE1222:
-.LBE1233:
-.LBE1237:
-.LBE1249:
-.LBB1250:
-.LBB1117:
-.LBB1114:
-.LBB1111:
-.LBB1100:
-.LBB1096:
-.LBB1097:
-.LBB1098:
+.LBE1311:
+.LBB1312:
+.LBB1296:
+.LBB1292:
+.LBB1283:
+.LBB1279:
+.LBB1274:
+.LBB1275:
+.LBB1276:
 	.loc 7 106 0
 	ldr	x2, [x2]
-.LVL235:
-.LBE1098:
-.LBE1097:
-.LBE1096:
-.LBE1100:
-.LBE1111:
-.LBE1114:
-.LBE1117:
-.LBE1250:
+.LVL253:
+.LBE1276:
+.LBE1275:
+.LBE1274:
+.LBE1279:
+.LBE1283:
+.LBE1292:
+.LBE1296:
+.LBE1312:
 	.loc 1 2358 0
-	mov	x0, x21
-.LVL236:
-.LBB1251:
-.LBB1118:
-.LBB1115:
-.LBB1112:
-.LBB1101:
+	mov	x0, x20
+.LVL254:
+.LBB1313:
+.LBB1297:
+.LBB1293:
+.LBB1284:
+.LBB1280:
 	.loc 6 84 0
-	tbz	x2, 26, .L198
-	b	.L197
-.LVL237:
+	tbz	x2, 26, .L209
+	b	.L208
+.LVL255:
 	.p2align 3
-.L227:
-.LBE1101:
-.LBE1112:
-.LBE1115:
-.LBE1118:
-.LBE1251:
-.LBB1252:
-.LBB1202:
-.LBB1198:
-.LBB1187:
-.LBB1188:
-.LBB1189:
-.LBB1190:
-.LBB1191:
-	.loc 8 157 0
-	sbfx	x1, x21, 0, 56
-.LVL238:
-.LBE1191:
-.LBE1190:
-.LBE1189:
-.LBB1192:
-.LBB1193:
+.L210:
+.LBE1280:
+.LBE1284:
+.LBB1285:
+.LBB1286:
+.LBB1287:
+.LBB1288:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL239:
+.LVL256:
 #NO_APP
-.LBE1193:
-.LBE1192:
-.LBB1194:
+.LBE1288:
+.LBE1287:
+.LBB1289:
 	.loc 6 254 0
-	and	x1, x1, x21
-.LVL240:
-.LBE1194:
+	and	x22, x20, x22, asr 8
+.LVL257:
+.LBE1289:
 	.loc 6 249 0
-	ldr	x2, [x0, 8]
-.LVL241:
+	ldr	x1, [x0, 8]
+.LVL258:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
-		bics	xzr, x1, x2
-	csel	x0, x21, xzr, eq
+		bics	xzr, x22, x1
+	csel	x0, x20, xzr, eq
 
 // 0 "" 2
-.LVL242:
+.LVL259:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1188:
-.LBE1187:
+.LBE1286:
+.LBE1285:
 	.loc 9 134 0
-	mov	x2, 48
-	add	x1, x29, 104
-.LVL243:
+	mov	x2, 64
+.LVL260:
+	mov	x1, x24
 	bl	__arch_copy_to_user
-.LVL244:
-.LBE1198:
-.LBE1202:
-.LBE1252:
-	.loc 1 2491 0
-	cbnz	x0, .L228
-.LBB1253:
-.LBB1053:
+.LVL261:
+.LBE1293:
+.LBE1297:
+.LBE1313:
+	.loc 1 2417 0
+	cbnz	w0, .L211
+.LBB1314:
+.LBB1084:
 	mov	x22, 0
+.LVL262:
 	b	.L176
-.LVL245:
-	.p2align 3
+.LVL263:
 .L204:
-.LBE1053:
-.LBE1253:
-.LBB1254:
-.LBB1238:
-.LBB1234:
+.LBE1084:
+.LBE1314:
+.LBB1315:
+.LBB1265:
+.LBB1262:
+	.loc 9 119 0
+	sub	x0, x24, x0
+.LVL264:
+	mov	x2, x23
+	mov	w1, 0
+	add	x0, x0, 64
+	bl	memset
+.LVL265:
+.LBE1262:
+.LBE1265:
+.LBE1315:
+	.loc 1 2401 0
+	cbz	w23, .L207
+.LVL266:
+	.p2align 2
+.L203:
+	.loc 1 2425 0
+	mov	x22, -14
+	b	.L176
+.LVL267:
+	.p2align 3
+.L233:
+.LBB1316:
+.LBB1233:
+.LBB1229:
+.LBB1218:
+.LBB1219:
+.LBB1220:
+.LBB1221:
+.LBB1222:
+	.loc 8 157 0
+	sbfx	x1, x20, 0, 56
+.LVL268:
+.LBE1222:
+.LBE1221:
+.LBE1220:
 .LBB1223:
 .LBB1224:
-.LBB1225:
-.LBB1226:
-.LBB1227:
-	.loc 8 157 0
-	sbfx	x1, x21, 0, 56
-.LVL246:
-.LBE1227:
-.LBE1226:
-.LBE1225:
-.LBB1228:
-.LBB1229:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL247:
+.LVL269:
 #NO_APP
-.LBE1229:
-.LBE1228:
-.LBB1230:
+.LBE1224:
+.LBE1223:
+.LBB1225:
 	.loc 6 254 0
-	and	x1, x1, x21
-.LVL248:
-.LBE1230:
+	and	x1, x1, x20
+.LVL270:
+.LBE1225:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL249:
+.LVL271:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
-	csel	x0, x21, xzr, eq
+	csel	x0, x20, xzr, eq
 
 // 0 "" 2
-.LVL250:
+.LVL272:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1224:
-.LBE1223:
+.LBE1219:
+.LBE1218:
 	.loc 9 134 0
-	mov	x2, 48
-	add	x1, x29, 104
-.LVL251:
+	mov	x2, 64
+	add	x1, x29, 120
+.LVL273:
 	bl	__arch_copy_to_user
-.LVL252:
-.LBE1234:
-.LBE1238:
-.LBE1254:
-	.loc 1 2413 0
-	cbnz	w0, .L205
-.LBB1255:
-.LBB1054:
+.LVL274:
+.LBE1229:
+.LBE1233:
+.LBE1316:
+	.loc 1 2495 0
+	cbnz	x0, .L234
+.LBB1317:
+.LBB1085:
 	mov	x22, 0
 	b	.L176
-.LVL253:
-	.p2align 3
-.L209:
-.LBE1054:
-.LBE1255:
-	.loc 1 2421 0
-	mov	x22, -14
-	b	.L176
-.LVL254:
+.LVL275:
 	.p2align 3
-.L316:
-	.loc 1 2436 0
+.L328:
+.LBE1085:
+.LBE1317:
+	.loc 1 2440 0
 	mov	w2, 1
-	str	w2, [x20, 96]
-	.loc 1 2437 0
+	str	w2, [x21, 96]
+	.loc 1 2441 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL255:
-	b	.L211
+.LVL276:
+	b	.L217
 	.p2align 3
-.L317:
-	.loc 1 2439 0 discriminator 1
-	ldr	w0, [x20, 616]
-	cbz	w0, .L213
-.LBB1256:
-.LBB1055:
+.L329:
+	.loc 1 2443 0 discriminator 1
+	ldr	w0, [x21, 616]
+	cbz	w0, .L219
+.LBB1318:
+.LBB1086:
 	mov	x22, 0
 	b	.L176
-.LVL256:
-.L201:
-.LBE1055:
-.LBE1256:
+.LVL277:
+.L205:
+.LBE1086:
+.LBE1318:
 	.loc 1 2387 0
 	mov	x22, -1
 	b	.L176
-.LVL257:
-.L250:
-.LBB1257:
-.LBB1154:
-.LBB1150:
+.LVL278:
+.L257:
+.LBB1319:
+.LBB1185:
+.LBB1181:
 	.loc 9 112 0
 	mov	x0, 4
-.LVL258:
-.L223:
+.LVL279:
+.L229:
 	.loc 9 119 0
 	mov	x2, x0
 	mov	w1, 0
-.LVL259:
+.LVL280:
 	add	x0, x22, x3
-.LVL260:
+.LVL281:
 	bl	memset
-.LVL261:
-.LBE1150:
-.LBE1154:
-.LBE1257:
-	.loc 1 2478 0
-	ldr	x0, [x20, 288]
+.LVL282:
+.LBE1181:
+.LBE1185:
+.LBE1319:
+	.loc 1 2482 0
+	ldr	x0, [x21, 288]
 	adrp	x1, .LC4
-	.loc 1 2479 0
+	.loc 1 2483 0
 	mov	x22, -14
-	.loc 1 2478 0
+	.loc 1 2482 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
-.LVL262:
-	.loc 1 2479 0
+.LVL283:
+	.loc 1 2483 0
 	b	.L176
-.L314:
-	.loc 1 2558 0
+.LVL284:
+.L326:
+	.loc 1 2562 0
 	bl	__stack_chk_fail
-.LVL263:
-.L322:
+.LVL285:
+.L334:
 	mov	x3, 4
 	sub	x3, x3, x0
-.LVL264:
-	b	.L223
+.LVL286:
+	b	.L229
 	.cfi_endproc
 .LFE2843:
 	.size	ebc_io_ctl, .-ebc_io_ctl
@@ -3204,16 +3380,16 @@ frame_done_callback:
 	add	x19, x20, 184
 	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
-	tbnz	w0, #31, .L326
+	tbnz	w0, #31, .L339
 	cmp	w0, 1
-	ble	.L327
+	ble	.L340
 	sub	w0, w0, #22
 	cmp	w0, 1
-	bls	.L327
-.L326:
+	bls	.L340
+.L339:
 	.loc 1 1699 0
 	ldr	w0, [x19, 56]
-	cbnz	w0, .L332
+	cbnz	w0, .L345
 	.loc 1 1705 0
 	ldr	x0, [x19, 104]
 	.loc 1 1704 0
@@ -3221,29 +3397,29 @@ frame_done_callback:
 	.loc 1 1703 0
 	str	wzr, [x19, 44]
 	.loc 1 1705 0
-	adrp	x1, .LC9
+	adrp	x1, .LC10
 	.loc 1 1704 0
 	str	w20, [x19, 92]
 	.loc 1 1705 0
-	add	x1, x1, :lo12:.LC9
+	add	x1, x1, :lo12:.LC10
 	.loc 1 1706 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
 	.loc 1 1705 0
 	bl	_dev_info
-.LVL265:
+.LVL287:
 	.loc 1 1706 0
 	mov	w2, w20
 	add	x0, x19, 352
 	mov	w1, w20
 	bl	__wake_up_sync
-.LVL266:
+.LVL288:
 	.loc 1 1707 0
 	mov	w2, w20
 	mov	w1, w20
 	add	x0, x19, 304
 	bl	__wake_up_sync
-.LVL267:
+.LVL289:
 	.loc 1 1711 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
@@ -3257,16 +3433,16 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L327:
+.L340:
 	.cfi_restore_state
 	.loc 1 1684 0
 	ldr	w0, [x19, 52]
-	cbz	w0, .L328
+	cbz	w0, .L341
 	.loc 1 1685 0
 	add	x1, x1, :lo12:.LANCHOR0
 	ldr	x0, [x1, 8]
 	bl	wake_up_process
-.LVL268:
+.LVL290:
 	.loc 1 1711 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
@@ -3280,24 +3456,24 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L328:
+.L341:
 	.cfi_restore_state
 	.loc 1 1688 0
 	ldr	x0, [x19, 104]
-	adrp	x1, .LC8
-	add	x1, x1, :lo12:.LC8
+	adrp	x1, .LC9
+	add	x1, x1, :lo12:.LC9
 	.loc 1 1693 0
 	mov	w21, 1
 	.loc 1 1688 0
 	bl	_dev_info
-.LVL269:
+.LVL291:
 	.loc 1 1690 0
 	ldp	w3, w2, [x20, 108]
 	mov	w1, 0
 	ldr	x0, [x19, 168]
 	mul	w2, w3, w2
 	bl	memset
-.LVL270:
+.LVL292:
 	.loc 1 1691 0
 	adrp	x2, jiffies
 	add	x0, x20, 688
@@ -3305,7 +3481,7 @@ frame_done_callback:
 	ldr	x2, [x2, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL271:
+.LVL293:
 	.loc 1 1693 0
 	str	w21, [x19, 92]
 	.loc 1 1692 0
@@ -3317,13 +3493,13 @@ frame_done_callback:
 	mov	w1, w21
 	add	x0, x19, 352
 	bl	__wake_up_sync
-.LVL272:
+.LVL294:
 	.loc 1 1695 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x19, 304
 	bl	__wake_up_sync
-.LVL273:
+.LVL295:
 	.loc 1 1711 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
@@ -3337,7 +3513,7 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L332:
+.L345:
 	.cfi_restore_state
 	.loc 1 1701 0
 	add	x1, x1, :lo12:.LANCHOR0
@@ -3347,7 +3523,7 @@ frame_done_callback:
 	.loc 1 1701 0
 	ldr	x0, [x1, 8]
 	bl	wake_up_process
-.LVL274:
+.LVL296:
 	.loc 1 1711 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
@@ -3369,7 +3545,7 @@ ebc_frame_timeout:
 .LFB2841:
 	.loc 1 2284 0
 	.cfi_startproc
-.LVL275:
+.LVL297:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -3378,7 +3554,7 @@ ebc_frame_timeout:
 	.cfi_def_cfa_register 29
 	.loc 1 2285 0
 	bl	frame_done_callback
-.LVL276:
+.LVL298:
 	.loc 1 2287 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3395,7 +3571,7 @@ ebc_lut_update:
 .LFB2834:
 	.loc 1 1714 0
 	.cfi_startproc
-.LVL277:
+.LVL299:
 	stp	x29, x30, [sp, -80]!
 	.cfi_def_cfa_offset 80
 	.cfi_offset 29, -80
@@ -3412,7 +3588,7 @@ ebc_lut_update:
 	stp	x19, x20, [sp, 16]
 	.loc 1 1716 0
 	add	x0, x29, 80
-.LVL278:
+.LVL300:
 	.loc 1 1714 0
 	str	x23, [sp, 48]
 	.cfi_offset 19, -64
@@ -3428,71 +3604,71 @@ ebc_lut_update:
 	ldr	x1, [x3]
 	str	x1, [x29, 72]
 	mov	x1,0
-.LVL279:
+.LVL301:
 	.loc 1 1716 0
 	str	w4, [x0, -12]!
-.LVL280:
-.LBB1258:
-.LBB1259:
+.LVL302:
+.LBB1320:
+.LBB1321:
 	.loc 3 50 0
 	mov	x1, x0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL281:
+.LVL303:
 	mov	w20, w0
-.LBE1259:
-.LBE1258:
+.LBE1321:
+.LBE1320:
 	.loc 1 1724 0
-	cbnz	w0, .L336
-.LVL282:
+	cbnz	w0, .L349
+.LVL304:
 	.loc 1 1725 0
 	ldr	w2, [x29, 68]
 	.loc 1 1726 0
 	add	x22, x21, 184
 	.loc 1 1725 0
-	tbnz	w2, #31, .L363
+	tbnz	w2, #31, .L376
 	.loc 1 1729 0
 	cmp	w2, 50
-	bgt	.L364
-.L338:
+	bgt	.L377
+.L351:
 	.loc 1 1737 0
 	ldr	x0, [x22, 104]
-	adrp	x1, .LC13
-	add	x1, x1, :lo12:.LC13
+	adrp	x1, .LC14
+	add	x1, x1, :lo12:.LC14
 	bl	_dev_info
-.LVL283:
+.LVL305:
 	.loc 1 1740 0
 	ldr	x0, [x22, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 23
-	bls	.L365
+	bls	.L378
 	.loc 1 1808 0
 	ldr	w2, [x29, 68]
-.L362:
+.L375:
 	mov	w3, w23
 	mov	w1, 7
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL284:
-	cbnz	w0, .L354
+.LVL306:
+	cbnz	w0, .L367
 	.p2align 2
-.L357:
+.L370:
 	.loc 1 1813 0
-	cbnz	w20, .L355
-.L335:
+	cbnz	w20, .L368
+.L348:
 	.loc 1 1819 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	w0, w20
 	ldr	x2, [x29, 72]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L366
+	cbnz	x1, .L379
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL285:
+.LVL307:
 	ldr	x23, [sp, 48]
-.LVL286:
+.LVL308:
 	ldp	x29, x30, [sp], 80
 	.cfi_remember_state
 	.cfi_restore 30
@@ -3504,224 +3680,224 @@ ebc_lut_update:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL287:
+.LVL309:
 	.p2align 3
-.L365:
+.L378:
 	.cfi_restore_state
 	.loc 1 1740 0
-	adrp	x1, .L341
+	adrp	x1, .L354
 	.loc 1 1784 0
 	ldr	w2, [x29, 68]
 	.loc 1 1740 0
-	add	x1, x1, :lo12:.L341
+	add	x1, x1, :lo12:.L354
 	ldrb	w0, [x1,w0,uxtw]
-	adr	x1, .Lrtx341
+	adr	x1, .Lrtx354
 	add	x0, x1, w0, sxtb #2
 	br	x0
-.Lrtx341:
+.Lrtx354:
 	.section	.rodata
 	.align	0
 	.align	2
-.L341:
-	.byte	(.L340 - .Lrtx341) / 4
-	.byte	(.L342 - .Lrtx341) / 4
-	.byte	(.L362 - .Lrtx341) / 4
-	.byte	(.L344 - .Lrtx341) / 4
-	.byte	(.L345 - .Lrtx341) / 4
-	.byte	(.L346 - .Lrtx341) / 4
-	.byte	(.L347 - .Lrtx341) / 4
-	.byte	(.L362 - .Lrtx341) / 4
-	.byte	(.L344 - .Lrtx341) / 4
-	.byte	(.L345 - .Lrtx341) / 4
-	.byte	(.L346 - .Lrtx341) / 4
-	.byte	(.L347 - .Lrtx341) / 4
-	.byte	(.L348 - .Lrtx341) / 4
-	.byte	(.L348 - .Lrtx341) / 4
-	.byte	(.L349 - .Lrtx341) / 4
-	.byte	(.L350 - .Lrtx341) / 4
-	.byte	(.L349 - .Lrtx341) / 4
-	.byte	(.L351 - .Lrtx341) / 4
-	.byte	(.L362 - .Lrtx341) / 4
-	.byte	(.L362 - .Lrtx341) / 4
-	.byte	(.L362 - .Lrtx341) / 4
-	.byte	(.L362 - .Lrtx341) / 4
-	.byte	(.L352 - .Lrtx341) / 4
-	.byte	(.L353 - .Lrtx341) / 4
+.L354:
+	.byte	(.L353 - .Lrtx354) / 4
+	.byte	(.L355 - .Lrtx354) / 4
+	.byte	(.L375 - .Lrtx354) / 4
+	.byte	(.L357 - .Lrtx354) / 4
+	.byte	(.L358 - .Lrtx354) / 4
+	.byte	(.L359 - .Lrtx354) / 4
+	.byte	(.L360 - .Lrtx354) / 4
+	.byte	(.L375 - .Lrtx354) / 4
+	.byte	(.L357 - .Lrtx354) / 4
+	.byte	(.L358 - .Lrtx354) / 4
+	.byte	(.L359 - .Lrtx354) / 4
+	.byte	(.L360 - .Lrtx354) / 4
+	.byte	(.L361 - .Lrtx354) / 4
+	.byte	(.L361 - .Lrtx354) / 4
+	.byte	(.L362 - .Lrtx354) / 4
+	.byte	(.L363 - .Lrtx354) / 4
+	.byte	(.L362 - .Lrtx354) / 4
+	.byte	(.L364 - .Lrtx354) / 4
+	.byte	(.L375 - .Lrtx354) / 4
+	.byte	(.L375 - .Lrtx354) / 4
+	.byte	(.L375 - .Lrtx354) / 4
+	.byte	(.L375 - .Lrtx354) / 4
+	.byte	(.L365 - .Lrtx354) / 4
+	.byte	(.L366 - .Lrtx354) / 4
 	.text
-.LVL288:
+.LVL310:
 	.p2align 3
-.L336:
+.L349:
 	.loc 1 1735 0
 	add	x22, x21, 184
 	mov	w2, w0
-	adrp	x1, .LC12
-	add	x1, x1, :lo12:.LC12
+	adrp	x1, .LC13
+	add	x1, x1, :lo12:.LC13
 	ldr	x0, [x22, 104]
 	bl	_dev_err
-.LVL289:
+.LVL311:
 	ldr	w2, [x29, 68]
-	b	.L338
+	b	.L351
 	.p2align 3
-.L364:
+.L377:
 	.loc 1 1730 0
 	ldr	x0, [x22, 104]
-	adrp	x1, .LC11
-	add	x1, x1, :lo12:.LC11
+	adrp	x1, .LC12
+	add	x1, x1, :lo12:.LC12
 	bl	_dev_info
-.LVL290:
+.LVL312:
 	.loc 1 1731 0
 	mov	w2, 50
 	str	w2, [x29, 68]
-.LVL291:
-	b	.L338
+.LVL313:
+	b	.L351
 	.p2align 3
-.L351:
+.L364:
 	.loc 1 1742 0
 	mov	w3, w23
 	mov	w1, 1
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL292:
-	cbz	w0, .L357
+.LVL314:
+	cbz	w0, .L370
 	.p2align 2
-.L354:
+.L367:
 	.loc 1 1731 0
 	mov	w20, -1
-.L355:
+.L368:
 	.loc 1 1814 0
 	ldr	x0, [x22, 104]
-	adrp	x1, .LC14
-	add	x1, x1, :lo12:.LC14
+	adrp	x1, .LC15
+	add	x1, x1, :lo12:.LC15
 	bl	_dev_err
-.LVL293:
+.LVL315:
 	.loc 1 1815 0
-	b	.L335
+	b	.L348
 	.p2align 3
-.L352:
+.L365:
 	.loc 1 1776 0
 	mov	w3, 16
 	mov	w1, 4
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL294:
-	cbnz	w0, .L354
-	b	.L357
+.LVL316:
+	cbnz	w0, .L367
+	b	.L370
 	.p2align 3
-.L345:
+.L358:
 	.loc 1 1794 0
 	mov	w3, w23
 	mov	w1, 9
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL295:
-	cbnz	w0, .L354
-	b	.L357
+.LVL317:
+	cbnz	w0, .L367
+	b	.L370
 	.p2align 3
-.L346:
+.L359:
 	.loc 1 1799 0
 	mov	w3, w23
 	mov	w1, 10
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL296:
-	cbnz	w0, .L354
-	b	.L357
+.LVL318:
+	cbnz	w0, .L367
+	b	.L370
 	.p2align 3
-.L347:
+.L360:
 	.loc 1 1804 0
 	mov	w3, w23
 	mov	w1, 11
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL297:
-	cbnz	w0, .L354
-	b	.L357
+.LVL319:
+	cbnz	w0, .L367
+	b	.L370
 	.p2align 3
-.L340:
+.L353:
 	.loc 1 1755 0
 	mov	w3, 16
 	mov	w1, 7
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL298:
-	cbnz	w0, .L354
-	b	.L357
+.LVL320:
+	cbnz	w0, .L367
+	b	.L370
 	.p2align 3
-.L344:
+.L357:
 	.loc 1 1789 0
 	mov	w3, w23
 	mov	w1, 8
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL299:
-	cbnz	w0, .L354
-	b	.L357
+.LVL321:
+	cbnz	w0, .L367
+	b	.L370
 	.p2align 3
-.L350:
+.L363:
 	.loc 1 1780 0
 	mov	w3, w23
 	mov	w1, 3
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL300:
-	cbnz	w0, .L354
-	b	.L357
+.LVL322:
+	cbnz	w0, .L367
+	b	.L370
 	.p2align 3
-.L342:
+.L355:
 	.loc 1 1760 0
 	mov	w3, 16
 	mov	w1, 5
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL301:
-	cbnz	w0, .L354
-	b	.L357
+.LVL323:
+	cbnz	w0, .L367
+	b	.L370
 	.p2align 3
-.L353:
+.L366:
 	.loc 1 1784 0
 	mov	w3, 16
 	mov	w1, 3
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL302:
-	cbnz	w0, .L354
-	b	.L357
+.LVL324:
+	cbnz	w0, .L367
+	b	.L370
 	.p2align 3
-.L348:
+.L361:
 	.loc 1 1767 0
 	mov	w3, w23
 	mov	w1, 6
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL303:
-	cbnz	w0, .L354
-	b	.L357
+.LVL325:
+	cbnz	w0, .L367
+	b	.L370
 	.p2align 3
-.L349:
+.L362:
 	.loc 1 1772 0
 	mov	w3, w23
 	mov	w1, 4
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL304:
-	cbnz	w0, .L354
-	b	.L357
+.LVL326:
+	cbnz	w0, .L367
+	b	.L370
 	.p2align 3
-.L363:
+.L376:
 	.loc 1 1726 0
 	ldr	x0, [x22, 104]
-	adrp	x1, .LC10
-	add	x1, x1, :lo12:.LC10
+	adrp	x1, .LC11
+	add	x1, x1, :lo12:.LC11
 	bl	_dev_info
-.LVL305:
+.LVL327:
 	.loc 1 1727 0
 	str	wzr, [x29, 68]
 	mov	w2, 0
-	b	.L338
-.L366:
+	b	.L351
+.L379:
 	.loc 1 1819 0
 	bl	__stack_chk_fail
-.LVL306:
+.LVL328:
 	.cfi_endproc
 .LFE2834:
 	.size	ebc_lut_update, .-ebc_lut_update
@@ -3730,23 +3906,23 @@ ebc_lut_update:
 	.type	ebc_buf_state_read, %function
 ebc_buf_state_read:
 .LFB2855:
-	.loc 1 2726 0
+	.loc 1 2730 0
 	.cfi_startproc
-.LVL307:
+.LVL329:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2727 0
+	.loc 1 2731 0
 	mov	x0, x2
-.LVL308:
-	.loc 1 2726 0
+.LVL330:
+	.loc 1 2730 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2727 0
+	.loc 1 2731 0
 	bl	ebc_buf_state_show
-.LVL309:
-	.loc 1 2728 0
+.LVL331:
+	.loc 1 2732 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3761,32 +3937,32 @@ ebc_buf_state_read:
 	.type	ebc_state_read, %function
 ebc_state_read:
 .LFB2854:
-	.loc 1 2717 0
+	.loc 1 2721 0
 	.cfi_startproc
-.LVL310:
+.LVL332:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2718 0
+	.loc 1 2722 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2717 0
+	.loc 1 2721 0
 	mov	x0, x2
-.LVL311:
-	.loc 1 2718 0
-	adrp	x1, .LC15
-.LVL312:
-	.loc 1 2717 0
+.LVL333:
+	.loc 1 2722 0
+	adrp	x1, .LC16
+.LVL334:
+	.loc 1 2721 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2718 0
+	.loc 1 2722 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL313:
-	add	x1, x1, :lo12:.LC15
+.LVL335:
+	add	x1, x1, :lo12:.LC16
 	ldr	w2, [x2, 624]
 	bl	sprintf
-.LVL314:
-	.loc 1 2719 0
+.LVL336:
+	.loc 1 2723 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3801,31 +3977,31 @@ ebc_state_read:
 	.type	ebc_version_read, %function
 ebc_version_read:
 .LFB2853:
-	.loc 1 2708 0
+	.loc 1 2712 0
 	.cfi_startproc
-.LVL315:
+.LVL337:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mov	x0, x2
-.LVL316:
-	.loc 1 2709 0
-	adrp	x1, .LC17
-.LVL317:
-	adrp	x2, .LC16
-.LVL318:
-	.loc 1 2708 0
+.LVL338:
+	.loc 1 2713 0
+	adrp	x1, .LC18
+.LVL339:
+	adrp	x2, .LC17
+.LVL340:
+	.loc 1 2712 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2709 0
-	add	x2, x2, :lo12:.LC16
-	.loc 1 2708 0
-	.loc 1 2709 0
-	add	x1, x1, :lo12:.LC17
+	.loc 1 2713 0
+	add	x2, x2, :lo12:.LC17
+	.loc 1 2712 0
+	.loc 1 2713 0
+	add	x1, x1, :lo12:.LC18
 	bl	sprintf
-.LVL319:
-	.loc 1 2710 0
+.LVL341:
+	.loc 1 2714 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3840,49 +4016,49 @@ ebc_version_read:
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
 .LFB2851:
-	.loc 1 2672 0
+	.loc 1 2676 0
 	.cfi_startproc
-.LVL320:
+.LVL342:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 2673 0
+	.loc 1 2677 0
 	adrp	x0, .LANCHOR0
-.LVL321:
-	.loc 1 2672 0
+.LVL343:
+	.loc 1 2676 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2676 0
+	.loc 1 2680 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2672 0
+	.loc 1 2676 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2672 0
-	mov	x19, x2
 	.loc 1 2676 0
+	mov	x19, x2
+	.loc 1 2680 0
 	ldr	x1, [x0, 16]
-.LVL322:
-.LBB1260:
-.LBB1261:
+.LVL344:
+.LBB1322:
+.LBB1323:
 	.loc 3 55 0
 	mov	x0, x1
 	ldr	x1, [x1, 64]
 	blr	x1
-.LVL323:
-.LBE1261:
-.LBE1260:
-	.loc 1 2678 0
+.LVL345:
+.LBE1323:
+.LBE1322:
+	.loc 1 2682 0
 	mov	w2, w0
-	adrp	x1, .LC15
+	adrp	x1, .LC16
 	mov	x0, x19
-	add	x1, x1, :lo12:.LC15
+	add	x1, x1, :lo12:.LC16
 	bl	sprintf
-.LVL324:
-	.loc 1 2679 0
+.LVL346:
+	.loc 1 2683 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL325:
+.LVL347:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3897,65 +4073,65 @@ pmic_vcom_read:
 	.type	pmic_temp_read, %function
 pmic_temp_read:
 .LFB2850:
-	.loc 1 2658 0
+	.loc 1 2662 0
 	.cfi_startproc
-.LVL326:
+.LVL348:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 2659 0
+	.loc 1 2663 0
 	adrp	x0, .LANCHOR0
-.LVL327:
-	.loc 1 2658 0
+.LVL349:
+	.loc 1 2662 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2662 0
+	.loc 1 2666 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-.LBB1262:
-.LBB1263:
+.LBB1324:
+.LBB1325:
 	.loc 3 50 0
 	add	x1, x29, 36
-.LVL328:
-.LBE1263:
-.LBE1262:
-	.loc 1 2658 0
+.LVL350:
+.LBE1325:
+.LBE1324:
+	.loc 1 2662 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 2658 0
+	.loc 1 2662 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
-.LVL329:
-	.loc 1 2662 0
+.LVL351:
+	.loc 1 2666 0
 	ldr	x2, [x0, 16]
-.LBB1265:
-.LBB1264:
+.LBB1327:
+.LBB1326:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL330:
-.LBE1264:
-.LBE1265:
-	.loc 1 2664 0
+.LVL352:
+.LBE1326:
+.LBE1327:
+	.loc 1 2668 0
 	ldr	w2, [x29, 36]
-	adrp	x1, .LC15
+	adrp	x1, .LC16
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC15
+	add	x1, x1, :lo12:.LC16
 	bl	sprintf
-.LVL331:
-	.loc 1 2665 0
+.LVL353:
+	.loc 1 2669 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L378
+	cbnz	x1, .L391
 	ldp	x19, x20, [sp, 16]
-.LVL332:
+.LVL354:
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -3965,11 +4141,11 @@ pmic_temp_read:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL333:
-.L378:
+.LVL355:
+.L391:
 	.cfi_restore_state
 	bl	__stack_chk_fail
-.LVL334:
+.LVL356:
 	.cfi_endproc
 .LFE2850:
 	.size	pmic_temp_read, .-pmic_temp_read
@@ -3978,33 +4154,33 @@ pmic_temp_read:
 	.type	pmic_name_read, %function
 pmic_name_read:
 .LFB2849:
-	.loc 1 2647 0
+	.loc 1 2651 0
 	.cfi_startproc
-.LVL335:
+.LVL357:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2648 0
+	.loc 1 2652 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2647 0
+	.loc 1 2651 0
 	mov	x0, x2
-.LVL336:
-	.loc 1 2650 0
-	adrp	x1, .LC17
-.LVL337:
-	.loc 1 2647 0
+.LVL358:
+	.loc 1 2654 0
+	adrp	x1, .LC18
+.LVL359:
+	.loc 1 2651 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2650 0
+	.loc 1 2654 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL338:
-	add	x1, x1, :lo12:.LC17
+.LVL360:
+	add	x1, x1, :lo12:.LC18
 	ldr	x2, [x2, 16]
 	add	x2, x2, 8
 	bl	sprintf
-.LVL339:
-	.loc 1 2651 0
+.LVL361:
+	.loc 1 2655 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -4019,17 +4195,17 @@ pmic_name_read:
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
 .LFB2852:
-	.loc 1 2684 0
+	.loc 1 2688 0
 	.cfi_startproc
-.LVL340:
+.LVL362:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 2685 0
+	.loc 1 2689 0
 	adrp	x0, .LANCHOR0
-.LVL341:
-	.loc 1 2684 0
+.LVL363:
+	.loc 1 2688 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -4039,47 +4215,47 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 2684 0
+	.loc 1 2688 0
 	add	x1, x19, :lo12:__stack_chk_guard
-.LVL342:
+.LVL364:
 	mov	x21, x2
-	.loc 1 2685 0
+	.loc 1 2689 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
-.LVL343:
-	.loc 1 2684 0
+.LVL365:
+	.loc 1 2688 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
-.LVL344:
+.LVL366:
 	mov	x20, x3
-	.loc 1 2688 0
+	.loc 1 2692 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
-.LVL345:
-	.loc 1 2689 0
-	cbnz	w0, .L388
-.LVL346:
+.LVL367:
 	.loc 1 2693 0
+	cbnz	w0, .L401
+.LVL368:
+	.loc 1 2697 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
-.LVL347:
-	.loc 1 2694 0
-	cbnz	w0, .L389
-.L381:
-	.loc 1 2700 0
+.LVL369:
+	.loc 1 2698 0
+	cbnz	w0, .L402
+.L394:
+	.loc 1 2704 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
-.LVL348:
+.LVL370:
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L390
+	cbnz	x1, .L403
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL349:
+.LVL371:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -4090,42 +4266,42 @@ pmic_vcom_write:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL350:
+.LVL372:
 	.p2align 3
-.L388:
+.L401:
 	.cfi_restore_state
-	.loc 1 2690 0
+	.loc 1 2694 0
 	ldr	x0, [x22]
-	adrp	x1, .LC18
+	adrp	x1, .LC19
 	mov	x2, x21
-	add	x1, x1, :lo12:.LC18
-	.loc 1 2691 0
+	add	x1, x1, :lo12:.LC19
+	.loc 1 2695 0
 	mov	x20, -1
-.LVL351:
-	.loc 1 2690 0
+.LVL373:
+	.loc 1 2694 0
 	bl	_dev_err
-.LVL352:
-	.loc 1 2691 0
-	b	.L381
-.LVL353:
-	.p2align 3
-.L389:
+.LVL374:
 	.loc 1 2695 0
+	b	.L394
+.LVL375:
+	.p2align 3
+.L402:
+	.loc 1 2699 0
 	ldr	x0, [x22]
-	adrp	x1, .LC19
-	.loc 1 2696 0
+	adrp	x1, .LC20
+	.loc 1 2700 0
 	mov	x20, -1
-.LVL354:
-	.loc 1 2695 0
-	add	x1, x1, :lo12:.LC19
+.LVL376:
+	.loc 1 2699 0
+	add	x1, x1, :lo12:.LC20
 	bl	_dev_err
-.LVL355:
-	.loc 1 2696 0
-	b	.L381
-.L390:
+.LVL377:
 	.loc 1 2700 0
+	b	.L394
+.L403:
+	.loc 1 2704 0
 	bl	__stack_chk_fail
-.LVL356:
+.LVL378:
 	.cfi_endproc
 .LFE2852:
 	.size	pmic_vcom_write, .-pmic_vcom_write
@@ -4134,9 +4310,9 @@ pmic_vcom_write:
 	.type	waveform_version_read, %function
 waveform_version_read:
 .LFB2848:
-	.loc 1 2636 0
+	.loc 1 2640 0
 	.cfi_startproc
-.LVL357:
+.LVL379:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -4145,22 +4321,22 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2636 0
+	.loc 1 2640 0
 	mov	x19, x2
-	.loc 1 2637 0
+	.loc 1 2641 0
 	bl	epd_lut_get_wf_version
-.LVL358:
-	.loc 1 2639 0
+.LVL380:
+	.loc 1 2643 0
 	mov	x2, x0
-	adrp	x1, .LC17
+	adrp	x1, .LC18
 	mov	x0, x19
-	add	x1, x1, :lo12:.LC17
+	add	x1, x1, :lo12:.LC18
 	bl	sprintf
-.LVL359:
-	.loc 1 2640 0
+.LVL381:
+	.loc 1 2644 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL360:
+.LVL382:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -4175,23 +4351,23 @@ waveform_version_read:
 	.type	ebc_init, %function
 ebc_init:
 .LFB2866:
-	.loc 1 3181 0
+	.loc 1 3185 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3182 0
+	.loc 1 3186 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3181 0
+	.loc 1 3185 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3182 0
+	.loc 1 3186 0
 	bl	__platform_driver_register
-.LVL361:
-	.loc 1 3183 0
+.LVL383:
+	.loc 1 3187 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -4208,7 +4384,7 @@ direct_mode_data_change:
 .LFB2822:
 	.loc 1 1154 0
 	.cfi_startproc
-.LVL362:
+.LVL384:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
@@ -4225,13 +4401,13 @@ direct_mode_data_change:
 	ldr	x4, [x3, 224]
 	ldr	w4, [x4, 64]
 	cmp	w4, 32
-	beq	.L447
+	beq	.L460
 	.loc 1 1158 0
 	cmp	w4, 16
-	beq	.L448
-.L404:
-.LBB1292:
-.LBB1293:
+	beq	.L461
+.L417:
+.LBB1354:
+.LBB1355:
 	.loc 1 1084 0
 	adrp	x6, .LANCHOR0
 	.loc 1 1090 0
@@ -4241,62 +4417,62 @@ direct_mode_data_change:
 	ldr	x11, [x6, #:lo12:.LANCHOR0]
 	.loc 1 1091 0
 	ldr	x3, [x3, 128]
-.LVL363:
+.LVL385:
 	.loc 1 1090 0
 	sub	w5, w5, w4
-.LVL364:
+.LVL386:
 	.loc 1 1092 0
 	add	x11, x11, 24
 	.loc 1 1091 0
 	lsl	w5, w5, 16
-.LVL365:
+.LVL387:
 	add	x5, x3, x5, sxtw
-.LVL366:
+.LVL388:
 	.loc 1 1095 0
 	ldr	w14, [x11, 88]
 	.loc 1 1094 0
 	ldr	w3, [x11, 84]
 	.loc 1 1092 0
 	ldr	w15, [x11, 156]
-.LVL367:
+.LVL389:
 	.loc 1 1097 0
 	cmp	w14, 0
 	.loc 1 1094 0
 	lsr	w13, w3, 3
 	.loc 1 1097 0
-	ble	.L395
+	ble	.L408
 	sub	w12, w13, #1
 	mov	w10, 0
-.LVL368:
+.LVL390:
 	add	x12, x12, 1
 	lsl	x16, x12, 2
 	lsl	x12, x12, 3
 	.loc 1 1098 0
-	cbz	w15, .L421
-.LVL369:
+	cbz	w15, .L434
+.LVL391:
 	.p2align 2
-.L449:
+.L462:
 	.loc 1 1099 0
 	ldr	w7, [x11, 88]
-.LVL370:
+.LVL392:
 	sub	w7, w7, #1
 	sub	w7, w7, w10
 	mul	w7, w7, w3
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL371:
-.L422:
+.LVL393:
+.L435:
 	.loc 1 1103 0
-	cbz	w13, .L423
+	cbz	w13, .L436
 	add	x9, x1, x16
 	mov	x8, x2
 	.p2align 2
-.L424:
+.L437:
 	.loc 1 1104 0
 	ldr	w3, [x1], 4
 	.loc 1 1105 0
 	ldr	w4, [x8], 8
-.LVL372:
+.LVL394:
 	.loc 1 1110 0
 	and	w20, w3, 15
 	.loc 1 1103 0
@@ -4349,7 +4525,7 @@ direct_mode_data_change:
 	orr	w30, w19, w30, lsl 6
 	.loc 1 1141 0
 	lsr	w3, w3, 28
-.LVL373:
+.LVL395:
 	.loc 1 1122 0
 	orr	w4, w4, w30
 	.loc 1 1124 0
@@ -4393,29 +4569,29 @@ direct_mode_data_change:
 	.loc 1 1145 0
 	strb	w3, [x7, -1]
 	.loc 1 1103 0
-	bne	.L424
+	bne	.L437
 	add	x2, x2, x12
-.L423:
+.L436:
 	.loc 1 1097 0
 	add	w10, w10, 1
 	cmp	w14, w10
-	beq	.L395
+	beq	.L408
 	ldr	w3, [x11, 84]
 	.loc 1 1098 0
-	cbnz	w15, .L449
-.L421:
+	cbnz	w15, .L462
+.L434:
 	.loc 1 1101 0
 	mul	w7, w10, w3
-.LVL374:
+.LVL396:
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL375:
-	b	.L422
-.LVL376:
+.LVL397:
+	b	.L435
+.LVL398:
 	.p2align 3
-.L395:
-.LBE1293:
-.LBE1292:
+.L408:
+.LBE1355:
+.LBE1354:
 	.loc 1 1170 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
@@ -4429,20 +4605,20 @@ direct_mode_data_change:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL377:
-.L448:
+.LVL399:
+.L461:
 	.cfi_restore_state
 	.loc 1 1159 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
 	cmp	w4, 16
-	bne	.L404
+	bne	.L417
 	.loc 1 1160 0
 	ldr	w13, [x3, 88]
-.LVL378:
-	cbz	w13, .L405
-.LBB1294:
-.LBB1295:
+.LVL400:
+	cbz	w13, .L418
+.LBB1356:
+.LBB1357:
 	.loc 1 898 0
 	adrp	x6, .LANCHOR0
 	.loc 1 904 0
@@ -4452,62 +4628,62 @@ direct_mode_data_change:
 	ldr	x12, [x6, #:lo12:.LANCHOR0]
 	.loc 1 905 0
 	ldr	x3, [x3, 128]
-.LVL379:
+.LVL401:
 	.loc 1 904 0
 	sub	w5, w5, w4
-.LVL380:
+.LVL402:
 	.loc 1 906 0
 	add	x12, x12, 24
 	.loc 1 905 0
 	lsl	w5, w5, 16
-.LVL381:
+.LVL403:
 	add	x5, x3, x5, sxtw
-.LVL382:
+.LVL404:
 	.loc 1 909 0
 	ldr	w14, [x12, 88]
 	.loc 1 908 0
 	ldr	w3, [x12, 84]
 	.loc 1 906 0
 	ldr	w15, [x12, 156]
-.LVL383:
+.LVL405:
 	.loc 1 914 0
 	cmp	w14, 0
 	.loc 1 908 0
 	lsr	w13, w3, 4
-.LVL384:
+.LVL406:
 	.loc 1 914 0
-	ble	.L395
+	ble	.L408
 	sub	w11, w13, #1
 	mov	w16, 0
-.LVL385:
+.LVL407:
 	add	x11, x11, 1
 	lsl	x11, x11, 3
 	.loc 1 915 0
-	cbz	w15, .L406
-.LVL386:
-.L450:
+	cbz	w15, .L419
+.LVL408:
+.L463:
 	.loc 1 916 0
 	ldr	w6, [x12, 88]
-.LVL387:
+.LVL409:
 	sub	w6, w6, #1
 	sub	w6, w6, w16
 	mul	w6, w6, w3
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL388:
-.L407:
+.LVL410:
+.L420:
 	.loc 1 920 0
-	cbz	w13, .L408
+	cbz	w13, .L421
 	mov	x7, 0
 	.p2align 2
-.L409:
+.L422:
 	.loc 1 922 0
 	ldr	x4, [x2, x7]
-.LVL389:
+.LVL411:
 	add	x6, x6, 4
 	.loc 1 921 0
 	ldr	x3, [x1, x7]
-.LVL390:
+.LVL412:
 	add	x7, x7, 8
 	.loc 1 924 0
 	and	w9, w4, 65535
@@ -4515,8 +4691,8 @@ direct_mode_data_change:
 	cmp	x11, x7
 	.loc 1 924 0
 	and	w8, w3, 65535
-.LBB1296:
-.LBB1297:
+.LBB1358:
+.LBB1359:
 	.loc 1 133 0
 	ubfiz	w19, w9, 8, 8
 	.loc 1 134 0
@@ -4525,181 +4701,181 @@ direct_mode_data_change:
 	add	w19, w19, w8, uxtb
 	.loc 1 134 0
 	add	w9, w9, w8, lsr 8
-.LBE1297:
-.LBE1296:
+.LBE1359:
+.LBE1358:
 	.loc 1 925 0
 	lsr	w10, w4, 16
 	lsr	w8, w3, 16
-.LBB1301:
-.LBB1302:
+.LBB1363:
+.LBB1364:
 	.loc 1 133 0
 	ubfiz	w18, w10, 8, 8
-.LBE1302:
-.LBE1301:
-.LBB1308:
-.LBB1298:
+.LBE1364:
+.LBE1363:
+.LBB1370:
+.LBB1360:
 	ldrb	w19, [x5, w19, sxtw]
-.LBE1298:
-.LBE1308:
-.LBB1309:
-.LBB1303:
+.LBE1360:
+.LBE1370:
+.LBB1371:
+.LBB1365:
 	.loc 1 134 0
 	and	w10, w10, 65280
-.LBE1303:
-.LBE1309:
-.LBB1310:
-.LBB1299:
+.LBE1365:
+.LBE1371:
+.LBB1372:
+.LBB1361:
 	ldrb	w17, [x5, w9, sxtw]
-.LBE1299:
-.LBE1310:
-.LBB1311:
-.LBB1304:
+.LBE1361:
+.LBE1372:
+.LBB1373:
+.LBB1366:
 	.loc 1 133 0
 	add	w18, w18, w8, uxtb
 	.loc 1 134 0
 	add	w10, w10, w8, lsr 8
-.LBE1304:
-.LBE1311:
+.LBE1366:
+.LBE1373:
 	.loc 1 926 0
 	ubfx	x9, x4, 32, 16
 	ubfx	x8, x3, 32, 16
 	.loc 1 927 0
 	lsr	x4, x4, 48
-.LVL391:
-.LBB1312:
-.LBB1300:
+.LVL413:
+.LBB1374:
+.LBB1362:
 	.loc 1 133 0
 	orr	w17, w19, w17, lsl 4
-.LBE1300:
-.LBE1312:
+.LBE1362:
+.LBE1374:
 	.loc 1 924 0
 	strb	w17, [x6, -4]
-.LBB1313:
-.LBB1314:
+.LBB1375:
+.LBB1376:
 	.loc 1 133 0
 	ubfiz	w17, w9, 8, 8
 	.loc 1 134 0
 	and	w9, w9, 65280
-.LBE1314:
-.LBE1313:
-.LBB1320:
-.LBB1305:
+.LBE1376:
+.LBE1375:
+.LBB1382:
+.LBB1367:
 	ldrb	w10, [x5, w10, sxtw]
-.LBE1305:
-.LBE1320:
-.LBB1321:
-.LBB1315:
+.LBE1367:
+.LBE1382:
+.LBB1383:
+.LBB1377:
 	.loc 1 133 0
 	add	w17, w17, w8, uxtb
-.LBE1315:
-.LBE1321:
-.LBB1322:
-.LBB1306:
+.LBE1377:
+.LBE1383:
+.LBB1384:
+.LBB1368:
 	ldrb	w18, [x5, w18, sxtw]
-.LBE1306:
-.LBE1322:
-.LBB1323:
-.LBB1316:
+.LBE1368:
+.LBE1384:
+.LBB1385:
+.LBB1378:
 	.loc 1 134 0
 	add	w8, w9, w8, lsr 8
-.LBE1316:
-.LBE1323:
+.LBE1378:
+.LBE1385:
 	.loc 1 927 0
 	lsr	x3, x3, 48
-.LVL392:
-.LBB1324:
-.LBB1307:
+.LVL414:
+.LBB1386:
+.LBB1369:
 	.loc 1 133 0
 	orr	w9, w18, w10, lsl 4
-.LBE1307:
-.LBE1324:
+.LBE1369:
+.LBE1386:
 	.loc 1 925 0
 	strb	w9, [x6, -3]
-.LBB1325:
-.LBB1326:
+.LBB1387:
+.LBB1388:
 	.loc 1 133 0
 	ubfiz	w9, w4, 8, 8
 	.loc 1 134 0
 	and	w4, w4, 65280
-.LBE1326:
-.LBE1325:
-.LBB1330:
-.LBB1317:
+.LBE1388:
+.LBE1387:
+.LBB1392:
+.LBB1379:
 	ldrb	w10, [x5, w8, sxtw]
-.LBE1317:
-.LBE1330:
-.LBB1331:
-.LBB1327:
+.LBE1379:
+.LBE1392:
+.LBB1393:
+.LBB1389:
 	.loc 1 133 0
 	add	w8, w9, w3, uxtb
-.LBE1327:
-.LBE1331:
-.LBB1332:
-.LBB1318:
+.LBE1389:
+.LBE1393:
+.LBB1394:
+.LBB1380:
 	ldrb	w17, [x5, w17, sxtw]
-.LBE1318:
-.LBE1332:
-.LBB1333:
-.LBB1328:
+.LBE1380:
+.LBE1394:
+.LBB1395:
+.LBB1390:
 	.loc 1 134 0
 	add	w3, w4, w3, lsr 8
-.LBE1328:
-.LBE1333:
-.LBB1334:
-.LBB1319:
+.LBE1390:
+.LBE1395:
+.LBB1396:
+.LBB1381:
 	.loc 1 133 0
 	orr	w4, w17, w10, lsl 4
-.LBE1319:
-.LBE1334:
+.LBE1381:
+.LBE1396:
 	.loc 1 926 0
 	strb	w4, [x6, -2]
-.LBB1335:
-.LBB1329:
+.LBB1397:
+.LBB1391:
 	.loc 1 134 0
 	ldrb	w3, [x5, w3, sxtw]
 	.loc 1 133 0
 	ldrb	w4, [x5, w8, sxtw]
 	orr	w3, w4, w3, lsl 4
-.LBE1329:
-.LBE1335:
+.LBE1391:
+.LBE1397:
 	.loc 1 927 0
 	strb	w3, [x6, -1]
 	.loc 1 920 0
-	bne	.L409
+	bne	.L422
 	add	x1, x1, x11
-.LVL393:
+.LVL415:
 	add	x2, x2, x11
-.LVL394:
-.L408:
+.LVL416:
+.L421:
 	.loc 1 914 0
 	add	w16, w16, 1
 	cmp	w14, w16
-	beq	.L395
+	beq	.L408
 	ldr	w3, [x12, 84]
 	.loc 1 915 0
-	cbnz	w15, .L450
-.L406:
+	cbnz	w15, .L463
+.L419:
 	.loc 1 918 0
 	mul	w6, w16, w3
-.LVL395:
+.LVL417:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL396:
-	b	.L407
-.LVL397:
-.L447:
-.LBE1295:
-.LBE1294:
+.LVL418:
+	b	.L420
+.LVL419:
+.L460:
+.LBE1357:
+.LBE1356:
 	.loc 1 1156 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
 	cmp	w4, 32
-	beq	.L451
+	beq	.L464
 	.loc 1 1165 0
 	cmp	w4, 16
-	bne	.L404
-.LBB1336:
-.LBB1337:
+	bne	.L417
+.LBB1398:
+.LBB1399:
 	.loc 1 1014 0
 	adrp	x6, .LANCHOR0
 	.loc 1 1020 0
@@ -4709,63 +4885,63 @@ direct_mode_data_change:
 	ldr	x11, [x6, #:lo12:.LANCHOR0]
 	.loc 1 1021 0
 	ldr	x3, [x3, 128]
-.LVL398:
+.LVL420:
 	.loc 1 1020 0
 	sub	w5, w5, w4
-.LVL399:
+.LVL421:
 	.loc 1 1022 0
 	add	x11, x11, 24
 	.loc 1 1021 0
 	lsl	w5, w5, 16
-.LVL400:
+.LVL422:
 	add	x5, x3, x5, sxtw
-.LVL401:
+.LVL423:
 	.loc 1 1025 0
 	ldr	w14, [x11, 88]
 	.loc 1 1024 0
 	ldr	w3, [x11, 84]
 	.loc 1 1022 0
 	ldr	w15, [x11, 156]
-.LVL402:
+.LVL424:
 	.loc 1 1027 0
 	cmp	w14, 0
 	.loc 1 1024 0
 	lsr	w13, w3, 3
 	.loc 1 1027 0
-	ble	.L395
+	ble	.L408
 	sub	w12, w13, #1
 	mov	w10, 0
-.LVL403:
+.LVL425:
 	add	x12, x12, 1
 	lsl	x16, x12, 3
 	lsl	x12, x12, 2
 	.loc 1 1028 0
-	cbz	w15, .L416
-.LVL404:
-.L452:
+	cbz	w15, .L429
+.LVL426:
+.L465:
 	.loc 1 1029 0
 	ldr	w7, [x11, 88]
-.LVL405:
+.LVL427:
 	sub	w7, w7, #1
 	sub	w7, w7, w10
 	mul	w7, w7, w3
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL406:
-.L417:
+.LVL428:
+.L430:
 	.loc 1 1033 0
-	cbz	w13, .L418
+	cbz	w13, .L431
 	add	x9, x1, x16
 	mov	x8, x2
 	.p2align 2
-.L419:
+.L432:
 	.loc 1 1034 0
 	ldr	w6, [x1], 8
 	.loc 1 1035 0
 	ldr	w3, [x8], 4
 	.loc 1 1033 0
 	cmp	x1, x9
-.LVL407:
+.LVL429:
 	.loc 1 1039 0
 	and	w4, w3, 255
 	.loc 1 1042 0
@@ -4872,30 +5048,30 @@ direct_mode_data_change:
 	.loc 1 1075 0
 	strb	w3, [x7, -1]
 	.loc 1 1033 0
-	bne	.L419
+	bne	.L432
 	add	x2, x2, x12
-.L418:
+.L431:
 	.loc 1 1027 0
 	add	w10, w10, 1
 	cmp	w14, w10
-	beq	.L395
+	beq	.L408
 	ldr	w3, [x11, 84]
 	.loc 1 1028 0
-	cbnz	w15, .L452
-.L416:
+	cbnz	w15, .L465
+.L429:
 	.loc 1 1031 0
 	mul	w7, w10, w3
-.LVL408:
+.LVL430:
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL409:
-	b	.L417
-.LVL410:
-.L405:
-.LBE1337:
-.LBE1336:
-.LBB1338:
-.LBB1339:
+.LVL431:
+	b	.L430
+.LVL432:
+.L418:
+.LBE1399:
+.LBE1398:
+.LBB1400:
+.LBB1401:
 	.loc 1 938 0
 	adrp	x5, .LANCHOR0
 	.loc 1 944 0
@@ -4905,159 +5081,159 @@ direct_mode_data_change:
 	ldr	x15, [x5, #:lo12:.LANCHOR0]
 	.loc 1 945 0
 	ldr	x3, [x3, 128]
-.LVL411:
+.LVL433:
 	.loc 1 944 0
 	sub	w7, w7, w4
-.LVL412:
+.LVL434:
 	.loc 1 946 0
 	add	x15, x15, 24
 	.loc 1 945 0
 	lsl	w7, w7, 16
-.LVL413:
+.LVL435:
 	add	x7, x3, x7, sxtw
-.LVL414:
+.LVL436:
 	.loc 1 949 0
 	ldr	w16, [x15, 88]
 	.loc 1 948 0
 	ldr	w3, [x15, 84]
 	.loc 1 946 0
 	ldr	w17, [x15, 156]
-.LVL415:
+.LVL437:
 	.loc 1 954 0
 	cmp	w16, 0
 	.loc 1 948 0
 	lsr	w12, w3, 3
-.LVL416:
+.LVL438:
 	.loc 1 954 0
-	ble	.L395
+	ble	.L408
 	sub	w14, w12, #1
 	add	x14, x14, 1
 	lsl	x14, x14, 2
 	.loc 1 955 0
-	cbz	w17, .L411
-.LVL417:
-.L453:
+	cbz	w17, .L424
+.LVL439:
+.L466:
 	.loc 1 956 0
 	ldr	w10, [x15, 88]
-.LVL418:
+.LVL440:
 	sub	w10, w10, #1
 	sub	w10, w10, w13
 	mul	w10, w10, w3
 	lsr	w10, w10, 2
 	add	x10, x0, x10
-.LVL419:
-.L412:
+.LVL441:
+.L425:
 	.loc 1 960 0
-	cbz	w12, .L413
+	cbz	w12, .L426
 	mov	x5, 0
 	.p2align 2
-.L414:
+.L427:
 	.loc 1 962 0
 	ldr	w3, [x2, x5, lsl 2]
 	.loc 1 961 0
 	ldr	w4, [x1, x5, lsl 2]
 	add	x5, x5, 1
-.LVL420:
-.LBB1340:
-.LBB1341:
+.LVL442:
+.LBB1402:
+.LBB1403:
 	.loc 1 134 0
 	and	w9, w3, 65280
-.LBE1341:
-.LBE1340:
+.LBE1403:
+.LBE1402:
 	.loc 1 960 0
 	cmp	w12, w5
-.LVL421:
+.LVL443:
 	.loc 1 964 0
 	and	w6, w4, 65535
-.LBB1346:
-.LBB1342:
+.LBB1408:
+.LBB1404:
 	.loc 1 133 0
 	ubfiz	w8, w3, 8, 8
 	.loc 1 134 0
 	add	w9, w9, w6, lsr 8
 	.loc 1 133 0
 	add	w6, w8, w6, uxtb
-.LBE1342:
-.LBE1346:
+.LBE1404:
+.LBE1408:
 	.loc 1 965 0
 	lsr	w3, w3, 16
-.LVL422:
+.LVL444:
 	lsr	w4, w4, 16
-.LBB1347:
-.LBB1348:
+.LBB1409:
+.LBB1410:
 	.loc 1 133 0
 	ubfiz	w8, w3, 8, 8
 	.loc 1 134 0
 	and	w3, w3, 65280
-.LBE1348:
-.LBE1347:
-.LBB1352:
-.LBB1343:
+.LBE1410:
+.LBE1409:
+.LBB1414:
+.LBB1405:
 	.loc 1 133 0
 	ldrb	w11, [x7, w6, sxtw]
-.LBE1343:
-.LBE1352:
-.LBB1353:
-.LBB1349:
+.LBE1405:
+.LBE1414:
+.LBB1415:
+.LBB1411:
 	.loc 1 134 0
 	add	w3, w3, w4, lsr 8
-.LBE1349:
-.LBE1353:
-.LBB1354:
-.LBB1344:
+.LBE1411:
+.LBE1415:
+.LBB1416:
+.LBB1406:
 	ldrb	w9, [x7, w9, sxtw]
-.LBE1344:
-.LBE1354:
-.LBB1355:
-.LBB1350:
+.LBE1406:
+.LBE1416:
+.LBB1417:
+.LBB1412:
 	.loc 1 133 0
 	add	w6, w8, w4, uxtb
-.LBE1350:
-.LBE1355:
-.LBB1356:
-.LBB1345:
+.LBE1412:
+.LBE1417:
+.LBB1418:
+.LBB1407:
 	orr	w4, w11, w9, lsl 4
-.LBE1345:
-.LBE1356:
+.LBE1407:
+.LBE1418:
 	.loc 1 964 0
 	strb	w4, [x10], 2
-.LBB1357:
-.LBB1351:
+.LBB1419:
+.LBB1413:
 	.loc 1 134 0
 	ldrb	w3, [x7, w3, sxtw]
 	.loc 1 133 0
 	ldrb	w4, [x7, w6, sxtw]
 	orr	w3, w4, w3, lsl 4
-.LBE1351:
-.LBE1357:
+.LBE1413:
+.LBE1419:
 	.loc 1 965 0
 	strb	w3, [x10, -1]
 	.loc 1 960 0
-	bgt	.L414
+	bgt	.L427
 	add	x1, x1, x14
 	add	x2, x2, x14
-.L413:
+.L426:
 	.loc 1 954 0
 	add	w13, w13, 1
 	cmp	w16, w13
-	beq	.L395
+	beq	.L408
 	ldr	w3, [x15, 84]
 	.loc 1 955 0
-	cbnz	w17, .L453
-.L411:
+	cbnz	w17, .L466
+.L424:
 	.loc 1 958 0
 	mul	w10, w13, w3
-.LVL423:
+.LVL445:
 	lsr	w10, w10, 2
 	add	x10, x0, x10
-.LVL424:
-	b	.L412
-.LVL425:
-.L451:
-.LBE1339:
-.LBE1338:
-.LBB1358:
-.LBB1359:
+.LVL446:
+	b	.L425
+.LVL447:
+.L464:
+.LBE1401:
+.LBE1400:
+.LBB1420:
+.LBB1421:
 	.loc 1 975 0
 	adrp	x5, .LANCHOR0
 	.loc 1 981 0
@@ -5067,162 +5243,162 @@ direct_mode_data_change:
 	ldr	x15, [x5, #:lo12:.LANCHOR0]
 	.loc 1 982 0
 	ldr	x3, [x3, 128]
-.LVL426:
+.LVL448:
 	.loc 1 981 0
 	sub	w8, w8, w4
-.LVL427:
+.LVL449:
 	.loc 1 983 0
 	add	x15, x15, 24
 	.loc 1 982 0
 	lsl	w8, w8, 16
-.LVL428:
+.LVL450:
 	add	x8, x3, x8, sxtw
-.LVL429:
+.LVL451:
 	.loc 1 988 0
 	ldr	w16, [x15, 88]
 	.loc 1 987 0
 	ldr	w3, [x15, 84]
 	.loc 1 983 0
 	ldr	w17, [x15, 156]
-.LVL430:
+.LVL452:
 	.loc 1 993 0
 	cmp	w16, 0
 	.loc 1 987 0
 	lsr	w12, w3, 2
-.LVL431:
+.LVL453:
 	.loc 1 993 0
-	ble	.L395
+	ble	.L408
 	sub	w14, w12, #1
 	mov	w13, 0
-.LVL432:
+.LVL454:
 	add	x14, x14, 1
 	lsl	x14, x14, 2
 	.loc 1 994 0
-	cbz	w17, .L400
-.LVL433:
-.L454:
+	cbz	w17, .L413
+.LVL455:
+.L467:
 	.loc 1 995 0
 	ldr	w11, [x15, 88]
-.LVL434:
+.LVL456:
 	sub	w11, w11, #1
 	sub	w11, w11, w13
 	mul	w11, w11, w3
 	lsr	w11, w11, 2
 	add	x11, x0, x11
-.LVL435:
-.L401:
+.LVL457:
+.L414:
 	.loc 1 999 0
-	cbz	w12, .L402
+	cbz	w12, .L415
 	mov	x4, 0
 	.p2align 2
-.L403:
+.L416:
 	.loc 1 1001 0
 	ldr	w5, [x2, x4, lsl 2]
 	.loc 1 1000 0
 	ldr	w3, [x1, x4, lsl 2]
-.LVL436:
-.LBB1360:
-.LBB1361:
+.LVL458:
+.LBB1422:
+.LBB1423:
 	.loc 1 140 0
 	and	w9, w5, 65280
-.LBE1361:
-.LBE1360:
+.LBE1423:
+.LBE1422:
 	.loc 1 1004 0
 	lsr	w7, w5, 16
-.LVL437:
+.LVL459:
 	.loc 1 1003 0
 	and	w6, w3, 65535
-.LBB1366:
-.LBB1367:
+.LBB1428:
+.LBB1429:
 	.loc 1 139 0
 	ubfiz	w10, w7, 8, 8
-.LBE1367:
-.LBE1366:
+.LBE1429:
+.LBE1428:
 	.loc 1 1004 0
 	lsr	w3, w3, 16
-.LBB1372:
-.LBB1368:
+.LBB1434:
+.LBB1430:
 	.loc 1 140 0
 	and	w7, w7, 65280
 	.loc 1 139 0
 	add	w10, w10, w3, uxtb
-.LBE1368:
-.LBE1372:
-.LBB1373:
-.LBB1362:
+.LBE1430:
+.LBE1434:
+.LBB1435:
+.LBB1424:
 	ubfiz	w5, w5, 8, 8
-.LVL438:
-.LBE1362:
-.LBE1373:
-.LBB1374:
-.LBB1369:
+.LVL460:
+.LBE1424:
+.LBE1435:
+.LBB1436:
+.LBB1431:
 	.loc 1 140 0
 	add	w3, w7, w3, lsr 8
-.LBE1369:
-.LBE1374:
-.LBB1375:
-.LBB1363:
+.LBE1431:
+.LBE1436:
+.LBB1437:
+.LBB1425:
 	.loc 1 139 0
 	add	w5, w5, w6, uxtb
 	.loc 1 140 0
 	add	w7, w9, w6, lsr 8
-.LBE1363:
-.LBE1375:
-.LBB1376:
-.LBB1370:
+.LBE1425:
+.LBE1437:
+.LBB1438:
+.LBB1432:
 	.loc 1 139 0
 	ldrb	w9, [x8, w10, sxtw]
 	.loc 1 140 0
 	ldrb	w3, [x8, w3, sxtw]
-.LBE1370:
-.LBE1376:
-.LBB1377:
-.LBB1364:
+.LBE1432:
+.LBE1438:
+.LBB1439:
+.LBB1426:
 	ldrb	w6, [x8, w7, sxtw]
 	.loc 1 139 0
 	ldrb	w5, [x8, w5, sxtw]
-.LBE1364:
-.LBE1377:
-.LBB1378:
-.LBB1371:
+.LBE1426:
+.LBE1439:
+.LBB1440:
+.LBB1433:
 	orr	w3, w9, w3, lsl 2
-.LBE1371:
-.LBE1378:
+.LBE1433:
+.LBE1440:
 	.loc 1 1005 0
 	ubfiz	w3, w3, 4, 8
-.LBB1379:
-.LBB1365:
+.LBB1441:
+.LBB1427:
 	.loc 1 139 0
 	orr	w5, w5, w6, lsl 2
-.LBE1365:
-.LBE1379:
+.LBE1427:
+.LBE1441:
 	.loc 1 1005 0
 	orr	w3, w3, w5
 	strb	w3, [x11, x4]
 	add	x4, x4, 1
 	.loc 1 999 0
 	cmp	w12, w4
-	bgt	.L403
+	bgt	.L416
 	add	x1, x1, x14
 	add	x2, x2, x14
-.L402:
+.L415:
 	.loc 1 993 0
 	add	w13, w13, 1
 	cmp	w16, w13
-	beq	.L395
+	beq	.L408
 	ldr	w3, [x15, 84]
 	.loc 1 994 0
-	cbnz	w17, .L454
-.L400:
+	cbnz	w17, .L467
+.L413:
 	.loc 1 997 0
 	mul	w11, w13, w3
-.LVL439:
+.LVL461:
 	lsr	w11, w11, 2
 	add	x11, x0, x11
-.LVL440:
-	b	.L401
-.LBE1359:
-.LBE1358:
+.LVL462:
+	b	.L414
+.LBE1421:
+.LBE1420:
 	.cfi_endproc
 .LFE2822:
 	.size	direct_mode_data_change, .-direct_mode_data_change
@@ -5233,7 +5409,7 @@ direct_mode_data_change_part:
 .LFB2828:
 	.loc 1 1458 0
 	.cfi_startproc
-.LVL441:
+.LVL463:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
@@ -5258,13 +5434,13 @@ direct_mode_data_change_part:
 	ldr	x4, [x3, 224]
 	ldr	w4, [x4, 64]
 	cmp	w4, 32
-	beq	.L629
+	beq	.L642
 	.loc 1 1462 0
 	cmp	w4, 16
-	beq	.L630
-.L472:
-.LBB1406:
-.LBB1407:
+	beq	.L643
+.L485:
+.LBB1468:
+.LBB1469:
 	.loc 1 1381 0
 	adrp	x5, .LANCHOR0
 	.loc 1 1387 0
@@ -5274,57 +5450,57 @@ direct_mode_data_change_part:
 	ldr	x11, [x5, #:lo12:.LANCHOR0]
 	.loc 1 1388 0
 	ldr	x3, [x3, 128]
-.LVL442:
+.LVL464:
 	.loc 1 1387 0
 	sub	w6, w6, w4
-.LVL443:
+.LVL465:
 	.loc 1 1389 0
 	add	x11, x11, 24
 	.loc 1 1388 0
 	lsl	w6, w6, 16
-.LVL444:
+.LVL466:
 	add	x6, x3, x6, sxtw
-.LVL445:
+.LVL467:
 	.loc 1 1392 0
 	ldr	w14, [x11, 88]
 	.loc 1 1391 0
 	ldr	w3, [x11, 84]
 	.loc 1 1389 0
 	ldr	w15, [x11, 156]
-.LVL446:
+.LVL468:
 	.loc 1 1394 0
 	cmp	w14, 0
 	.loc 1 1391 0
 	lsr	w13, w3, 3
 	.loc 1 1394 0
-	ble	.L455
+	ble	.L468
 	sub	w12, w13, #1
 	mov	w10, 0
-.LVL447:
+.LVL469:
 	add	x12, x12, 1
 	lsl	x16, x12, 2
 	lsl	x12, x12, 3
 	.loc 1 1395 0
-	cbz	w15, .L531
-.LVL448:
+	cbz	w15, .L544
+.LVL470:
 	.p2align 2
-.L631:
+.L644:
 	.loc 1 1396 0
 	ldr	w7, [x11, 88]
-.LVL449:
+.LVL471:
 	sub	w7, w7, #1
 	sub	w7, w7, w10
 	mul	w7, w7, w3
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL450:
-.L532:
+.LVL472:
+.L545:
 	.loc 1 1400 0
-	cbz	w13, .L533
+	cbz	w13, .L546
 	add	x9, x1, x16
 	mov	x8, x2
 	.p2align 2
-.L544:
+.L557:
 	.loc 1 1402 0
 	ldr	w5, [x8]
 	.loc 1 1407 0
@@ -5333,43 +5509,43 @@ direct_mode_data_change_part:
 	ldr	w4, [x1], 4
 	.loc 1 1406 0
 	ubfx	x17, x5, 4, 4
-.LVL451:
+.LVL473:
 	.loc 1 1405 0
 	and	w18, w4, 15
 	.loc 1 1407 0
 	cmp	w18, w17
-	beq	.L534
+	beq	.L547
 	.loc 1 1408 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w3, [x6, w17, sxtw]
 	and	w3, w3, 3
-.L534:
+.L547:
 	.loc 1 1410 0
 	ubfx	x18, x4, 4, 4
 	.loc 1 1411 0
 	ubfx	x17, x5, 12, 4
 	.loc 1 1412 0
 	cmp	w18, w17
-	beq	.L535
+	beq	.L548
 	.loc 1 1413 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w17, [x6, w17, sxtw]
 	ubfiz	w17, w17, 2, 2
 	orr	w3, w3, w17
-.L535:
+.L548:
 	.loc 1 1415 0
 	ubfx	x18, x4, 8, 4
 	.loc 1 1416 0
 	ubfx	x17, x5, 20, 4
 	.loc 1 1417 0
 	cmp	w18, w17
-	beq	.L627
+	beq	.L640
 	.loc 1 1418 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w17, [x6, w17, sxtw]
 	ubfiz	w17, w17, 4, 2
 	orr	w3, w3, w17
-.L627:
+.L640:
 	.loc 1 1420 0
 	ubfx	x17, x4, 12, 4
 	.loc 1 1421 0
@@ -5378,13 +5554,13 @@ direct_mode_data_change_part:
 	and	w3, w3, 255
 	.loc 1 1422 0
 	cmp	w17, w5
-	beq	.L538
+	beq	.L551
 	.loc 1 1423 0
 	add	w5, w17, w5, lsl 8
 	ldrb	w5, [x6, w5, sxtw]
 	orr	w3, w3, w5, lsl 6
 	and	w3, w3, 255
-.L538:
+.L551:
 	add	x8, x8, 8
 	.loc 1 1425 0
 	strb	w3, [x7]
@@ -5398,91 +5574,91 @@ direct_mode_data_change_part:
 	ubfx	x17, x5, 4, 4
 	.loc 1 1432 0
 	cmp	w18, w17
-	beq	.L539
+	beq	.L552
 	.loc 1 1433 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w3, [x6, w17, sxtw]
 	and	w3, w3, 3
-.L539:
+.L552:
 	.loc 1 1435 0
 	ubfx	x18, x4, 20, 4
 	.loc 1 1436 0
 	ubfx	x17, x5, 12, 4
 	.loc 1 1437 0
 	cmp	w18, w17
-	beq	.L540
+	beq	.L553
 	.loc 1 1438 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w17, [x6, w17, sxtw]
 	ubfiz	w17, w17, 2, 2
 	orr	w3, w3, w17
-.L540:
+.L553:
 	.loc 1 1440 0
 	ubfx	x18, x4, 24, 4
 	.loc 1 1441 0
 	ubfx	x17, x5, 20, 4
 	.loc 1 1442 0
 	cmp	w18, w17
-	beq	.L628
+	beq	.L641
 	.loc 1 1443 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w17, [x6, w17, sxtw]
 	ubfiz	w17, w17, 4, 2
 	orr	w3, w3, w17
-.L628:
+.L641:
 	.loc 1 1445 0
 	lsr	w4, w4, 28
-.LVL452:
+.LVL474:
 	.loc 1 1446 0
 	lsr	w5, w5, 28
 	.loc 1 1443 0
 	and	w3, w3, 255
 	.loc 1 1447 0
 	cmp	w4, w5
-	beq	.L543
+	beq	.L556
 	.loc 1 1448 0
 	add	w4, w4, w5, lsl 8
 	ldrb	w4, [x6, w4, sxtw]
 	orr	w3, w3, w4, lsl 6
 	and	w3, w3, 255
-.L543:
+.L556:
 	add	x7, x7, 2
 	.loc 1 1450 0
 	strb	w3, [x7, -1]
 	.loc 1 1400 0
 	cmp	x1, x9
-	bne	.L544
+	bne	.L557
 	add	x2, x2, x12
-.L533:
+.L546:
 	.loc 1 1394 0
 	add	w10, w10, 1
 	cmp	w14, w10
-	beq	.L455
+	beq	.L468
 	ldr	w3, [x11, 84]
 	.loc 1 1395 0
-	cbnz	w15, .L631
-.L531:
+	cbnz	w15, .L644
+.L544:
 	.loc 1 1398 0
 	mul	w7, w10, w3
-.LVL453:
+.LVL475:
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL454:
-	b	.L532
-.LVL455:
+.LVL476:
+	b	.L545
+.LVL477:
 	.p2align 3
-.L455:
-.LBE1407:
-.LBE1406:
+.L468:
+.LBE1469:
+.LBE1468:
 	.loc 1 1474 0
 	ldp	x19, x20, [sp, 16]
-.LVL456:
+.LVL478:
 	ldp	x21, x22, [sp, 32]
-.LVL457:
+.LVL479:
 	ldp	x23, x24, [sp, 48]
-.LVL458:
+.LVL480:
 	ldp	x25, x26, [sp, 64]
-.LVL459:
+.LVL481:
 	ldr	x27, [sp, 80]
 	ldp	x29, x30, [sp], 96
 	.cfi_remember_state
@@ -5498,29 +5674,29 @@ direct_mode_data_change_part:
 	.cfi_restore 19
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
-.LVL460:
+.LVL482:
 	ret
-.LVL461:
-.L630:
+.LVL483:
+.L643:
 	.cfi_restore_state
 	.loc 1 1463 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
 	cmp	w4, 16
-	bne	.L472
+	bne	.L485
 	.loc 1 1464 0
 	ldr	w15, [x3, 88]
-.LBB1408:
-.LBB1409:
+.LBB1470:
+.LBB1471:
 	.loc 1 1218 0
 	adrp	x5, .LANCHOR0
-.LVL462:
-.LBE1409:
-.LBE1408:
+.LVL484:
+.LBE1471:
+.LBE1470:
 	.loc 1 1464 0
-	cbz	w15, .L473
-.LBB1422:
-.LBB1420:
+	cbz	w15, .L486
+.LBB1484:
+.LBB1482:
 	.loc 1 1218 0
 	ldr	x12, [x5, #:lo12:.LANCHOR0]
 	.loc 1 1223 0
@@ -5530,84 +5706,84 @@ direct_mode_data_change_part:
 	add	x12, x12, 24
 	.loc 1 1224 0
 	ldr	x3, [x3, 128]
-.LVL463:
+.LVL485:
 	.loc 1 1223 0
 	sub	w9, w9, w4
-.LVL464:
+.LVL486:
 	.loc 1 1228 0
 	ldr	w13, [x12, 88]
 	.loc 1 1224 0
 	lsl	w9, w9, 16
-.LVL465:
+.LVL487:
 	.loc 1 1225 0
 	ldr	w14, [x12, 156]
 	.loc 1 1224 0
 	add	x9, x3, x9, sxtw
-.LVL466:
+.LVL488:
 	.loc 1 1227 0
 	ldr	w3, [x12, 84]
-.LVL467:
+.LVL489:
 	.loc 1 1233 0
 	cmp	w13, 0
 	.loc 1 1227 0
 	lsr	w11, w3, 4
-.LVL468:
+.LVL490:
 	.loc 1 1233 0
-	ble	.L455
+	ble	.L468
 	sub	w16, w11, #1
 	mov	w15, 0
-.LVL469:
+.LVL491:
 	add	x16, x16, 1
-.LBB1410:
-.LBB1411:
+.LBB1472:
+.LBB1473:
 	.loc 1 145 0
 	mov	w10, 3
 	lsl	x16, x16, 3
-.LBE1411:
-.LBE1410:
+.LBE1473:
+.LBE1472:
 	.loc 1 1234 0
-	cbz	w14, .L474
-.LVL470:
-.L632:
+	cbz	w14, .L487
+.LVL492:
+.L645:
 	.loc 1 1235 0
 	ldr	w5, [x12, 88]
-.LVL471:
+.LVL493:
 	sub	w5, w5, #1
 	sub	w5, w5, w15
 	mul	w5, w5, w3
 	lsr	w5, w5, 2
 	add	x5, x0, x5
-.LVL472:
-.L475:
+.LVL494:
+.L488:
 	.loc 1 1239 0
-	cbz	w11, .L476
+	cbz	w11, .L489
 	add	x5, x5, 4
-.LVL473:
+.LVL495:
 	mov	x8, 0
-.LVL474:
+.LVL496:
 	.p2align 2
-.L499:
+.L512:
 	.loc 1 1240 0
 	ldr	x3, [x1, x8, lsl 3]
 	.loc 1 1241 0
 	ldr	x4, [x2, x8, lsl 3]
 	.loc 1 1242 0
 	cmp	x3, x4
-	beq	.L477
+	beq	.L490
 	.loc 1 1243 0
 	and	w17, w4, 65535
 	and	w7, w3, 65535
-.LVL475:
-.LBB1413:
-.LBB1414:
+.LVL497:
+.LBB1475:
+.LBB1476:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
 	cmp	w17, w7
-	beq	.L478
+	beq	.L491
 	.loc 1 146 0
 	eor	w18, w17, w7
-.LVL476:
+.LVL498:
 	.loc 1 159 0
 	ubfiz	w30, w17, 8, 8
 	.loc 1 160 0
@@ -5645,25 +5821,25 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w6, w7, w6
 	and	w6, w6, 255
-.LVL477:
-.L478:
-.LBE1414:
-.LBE1413:
+.LVL499:
+.L491:
+.LBE1476:
+.LBE1475:
 	.loc 1 1243 0
 	strb	w6, [x5, -4]
 	.loc 1 1244 0
 	lsr	w17, w4, 16
 	lsr	w7, w3, 16
-.LBB1415:
-.LBB1416:
+.LBB1477:
+.LBB1478:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
 	cmp	w17, w7
-	beq	.L483
+	beq	.L496
 	.loc 1 146 0
 	eor	w18, w17, w7
-.LVL478:
+.LVL500:
 	.loc 1 159 0
 	ubfiz	w30, w17, 8, 8
 	.loc 1 160 0
@@ -5701,25 +5877,25 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w6, w7, w6
 	and	w6, w6, 255
-.LVL479:
-.L483:
-.LBE1416:
-.LBE1415:
+.LVL501:
+.L496:
+.LBE1478:
+.LBE1477:
 	.loc 1 1244 0
 	strb	w6, [x5, -3]
 	.loc 1 1245 0
 	ubfx	x17, x4, 32, 16
 	ubfx	x7, x3, 32, 16
-.LBB1417:
-.LBB1418:
+.LBB1479:
+.LBB1480:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
 	cmp	w17, w7
-	beq	.L488
+	beq	.L501
 	.loc 1 146 0
 	eor	w18, w17, w7
-.LVL480:
+.LVL502:
 	.loc 1 159 0
 	ubfiz	w30, w17, 8, 8
 	.loc 1 160 0
@@ -5757,27 +5933,27 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w6, w7, w6
 	and	w6, w6, 255
-.LVL481:
-.L488:
-.LBE1418:
-.LBE1417:
+.LVL503:
+.L501:
+.LBE1480:
+.LBE1479:
 	.loc 1 1245 0
 	strb	w6, [x5, -2]
 	.loc 1 1246 0
 	lsr	x4, x4, 48
-.LVL482:
+.LVL504:
 	lsr	x3, x3, 48
-.LVL483:
-.LBB1419:
-.LBB1412:
+.LVL505:
+.LBB1481:
+.LBB1474:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
 	cmp	w4, w3
-	beq	.L493
+	beq	.L506
 	.loc 1 146 0
 	eor	w7, w4, w3
-.LVL484:
+.LVL506:
 	.loc 1 159 0
 	ubfiz	w6, w4, 8, 8
 	.loc 1 160 0
@@ -5793,7 +5969,7 @@ direct_mode_data_change_part:
 	.loc 1 153 0
 	tst	w7, 240
 	orr	w18, w4, 12
-.LVL485:
+.LVL507:
 	.loc 1 159 0
 	ldrb	w17, [x9, w6, sxtw]
 	.loc 1 153 0
@@ -5816,54 +5992,54 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w4, w6, w4
 	and	w6, w4, 255
-.LVL486:
-.L493:
-.LBE1412:
-.LBE1419:
+.LVL508:
+.L506:
+.LBE1474:
+.LBE1481:
 	.loc 1 1246 0
 	strb	w6, [x5, -1]
-.LVL487:
-.L498:
+.LVL509:
+.L511:
 	add	x8, x8, 1
 	add	x5, x5, 4
 	.loc 1 1239 0
 	cmp	w11, w8
-	bgt	.L499
+	bgt	.L512
 	add	x1, x1, x16
-.LVL488:
+.LVL510:
 	add	x2, x2, x16
-.LVL489:
-.L476:
+.LVL511:
+.L489:
 	.loc 1 1233 0
 	add	w15, w15, 1
 	cmp	w13, w15
-	beq	.L455
+	beq	.L468
 	ldr	w3, [x12, 84]
-.LVL490:
+.LVL512:
 	.loc 1 1234 0
-	cbnz	w14, .L632
-.L474:
+	cbnz	w14, .L645
+.L487:
 	.loc 1 1237 0
 	mul	w5, w15, w3
-.LVL491:
+.LVL513:
 	lsr	w5, w5, 2
 	add	x5, x0, x5
-.LVL492:
-	b	.L475
-.LVL493:
-.L629:
-.LBE1420:
-.LBE1422:
+.LVL514:
+	b	.L488
+.LVL515:
+.L642:
+.LBE1482:
+.LBE1484:
 	.loc 1 1460 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
 	cmp	w4, 32
-	beq	.L633
+	beq	.L646
 	.loc 1 1469 0
 	cmp	w4, 16
-	bne	.L472
-.LBB1423:
-.LBB1424:
+	bne	.L485
+.LBB1485:
+.LBB1486:
 	.loc 1 1303 0
 	adrp	x5, .LANCHOR0
 	.loc 1 1309 0
@@ -5873,63 +6049,63 @@ direct_mode_data_change_part:
 	ldr	x11, [x5, #:lo12:.LANCHOR0]
 	.loc 1 1310 0
 	ldr	x3, [x3, 128]
-.LVL494:
+.LVL516:
 	.loc 1 1309 0
 	sub	w6, w6, w4
-.LVL495:
+.LVL517:
 	.loc 1 1311 0
 	add	x11, x11, 24
 	.loc 1 1310 0
 	lsl	w6, w6, 16
-.LVL496:
+.LVL518:
 	add	x6, x3, x6, sxtw
-.LVL497:
+.LVL519:
 	.loc 1 1314 0
 	ldr	w14, [x11, 88]
 	.loc 1 1313 0
 	ldr	w3, [x11, 84]
 	.loc 1 1311 0
 	ldr	w15, [x11, 156]
-.LVL498:
+.LVL520:
 	.loc 1 1316 0
 	cmp	w14, 0
 	.loc 1 1313 0
 	lsr	w13, w3, 3
 	.loc 1 1316 0
-	ble	.L455
+	ble	.L468
 	sub	w12, w13, #1
 	mov	w10, 0
-.LVL499:
+.LVL521:
 	add	x12, x12, 1
 	lsl	x16, x12, 3
 	lsl	x12, x12, 2
 	.loc 1 1317 0
-	cbz	w15, .L518
-.LVL500:
-.L634:
+	cbz	w15, .L531
+.LVL522:
+.L647:
 	.loc 1 1318 0
 	ldr	w7, [x11, 88]
-.LVL501:
+.LVL523:
 	sub	w7, w7, #1
 	sub	w7, w7, w10
 	mul	w7, w7, w3
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL502:
-.L519:
+.LVL524:
+.L532:
 	.loc 1 1322 0
-	cbz	w13, .L520
+	cbz	w13, .L533
 	add	x9, x1, x16
 	mov	x8, x2
 	.p2align 2
-.L529:
+.L542:
 	.loc 1 1324 0
 	ldr	w3, [x8], 4
 	.loc 1 1325 0
 	mov	w17, 0
 	.loc 1 1323 0
 	ldr	w4, [x1]
-.LVL503:
+.LVL525:
 	.loc 1 1328 0
 	and	w5, w3, 255
 	ubfiz	w18, w5, 4, 4
@@ -5937,11 +6113,11 @@ direct_mode_data_change_part:
 	and	w30, w4, 248
 	.loc 1 1329 0
 	cmp	w30, w18
-	beq	.L521
+	beq	.L534
 	.loc 1 1330 0
 	add	w18, w30, w18, lsl 8
 	ldrb	w17, [x6, w18, sxtw]
-.L521:
+.L534:
 	.loc 1 1332 0
 	lsr	w18, w4, 8
 	.loc 1 1333 0
@@ -5950,13 +6126,13 @@ direct_mode_data_change_part:
 	and	w18, w18, 248
 	.loc 1 1334 0
 	cmp	w18, w5
-	beq	.L522
+	beq	.L535
 	.loc 1 1335 0
 	add	w5, w18, w5, lsl 8
 	ldrb	w5, [x6, w5, sxtw]
 	orr	w17, w17, w5, lsl 2
 	and	w17, w17, 255
-.L522:
+.L535:
 	.loc 1 1337 0
 	lsr	w18, w4, 16
 	.loc 1 1338 0
@@ -5967,13 +6143,13 @@ direct_mode_data_change_part:
 	and	w5, w5, 240
 	.loc 1 1339 0
 	cmp	w18, w5
-	beq	.L523
+	beq	.L536
 	.loc 1 1340 0
 	add	w5, w18, w5, lsl 8
 	ldrb	w5, [x6, w5, sxtw]
 	orr	w17, w17, w5, lsl 4
 	and	w17, w17, 255
-.L523:
+.L536:
 	.loc 1 1342 0
 	lsr	w4, w4, 24
 	.loc 1 1343 0
@@ -5984,13 +6160,13 @@ direct_mode_data_change_part:
 	and	w5, w5, 240
 	.loc 1 1344 0
 	cmp	w4, w5
-	beq	.L524
+	beq	.L537
 	.loc 1 1345 0
 	add	w4, w4, w5, lsl 8
 	ldrb	w4, [x6, w4, sxtw]
 	orr	w17, w17, w4, lsl 6
 	and	w17, w17, 255
-.L524:
+.L537:
 	add	x1, x1, 8
 	.loc 1 1347 0
 	strb	w17, [x7]
@@ -6006,11 +6182,11 @@ direct_mode_data_change_part:
 	and	w18, w4, 248
 	.loc 1 1354 0
 	cmp	w18, w5
-	beq	.L525
+	beq	.L538
 	.loc 1 1355 0
 	add	w5, w18, w5, lsl 8
 	ldrb	w17, [x6, w5, sxtw]
-.L525:
+.L538:
 	.loc 1 1357 0
 	lsr	w18, w4, 8
 	.loc 1 1358 0
@@ -6021,13 +6197,13 @@ direct_mode_data_change_part:
 	and	w5, w5, 240
 	.loc 1 1359 0
 	cmp	w18, w5
-	beq	.L526
+	beq	.L539
 	.loc 1 1360 0
 	add	w5, w18, w5, lsl 8
 	ldrb	w5, [x6, w5, sxtw]
 	orr	w17, w17, w5, lsl 2
 	and	w17, w17, 255
-.L526:
+.L539:
 	.loc 1 1362 0
 	lsr	w18, w4, 16
 	.loc 1 1363 0
@@ -6038,13 +6214,13 @@ direct_mode_data_change_part:
 	and	w5, w5, 240
 	.loc 1 1364 0
 	cmp	w18, w5
-	beq	.L527
+	beq	.L540
 	.loc 1 1365 0
 	add	w5, w18, w5, lsl 8
 	ldrb	w5, [x6, w5, sxtw]
 	orr	w17, w17, w5, lsl 4
 	and	w17, w17, 255
-.L527:
+.L540:
 	.loc 1 1367 0
 	lsr	w4, w4, 24
 	.loc 1 1368 0
@@ -6055,42 +6231,42 @@ direct_mode_data_change_part:
 	and	w3, w3, 240
 	.loc 1 1369 0
 	cmp	w4, w3
-	beq	.L528
+	beq	.L541
 	.loc 1 1370 0
 	add	w3, w4, w3, lsl 8
 	ldrb	w3, [x6, w3, sxtw]
 	orr	w17, w17, w3, lsl 6
 	and	w17, w17, 255
-.L528:
+.L541:
 	add	x7, x7, 2
 	.loc 1 1372 0
 	strb	w17, [x7, -1]
 	.loc 1 1322 0
 	cmp	x1, x9
-	bne	.L529
+	bne	.L542
 	add	x2, x2, x12
-.L520:
+.L533:
 	.loc 1 1316 0
 	add	w10, w10, 1
 	cmp	w14, w10
-	beq	.L455
+	beq	.L468
 	ldr	w3, [x11, 84]
 	.loc 1 1317 0
-	cbnz	w15, .L634
-.L518:
+	cbnz	w15, .L647
+.L531:
 	.loc 1 1320 0
 	mul	w7, w10, w3
-.LVL504:
+.LVL526:
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL505:
-	b	.L519
-.LVL506:
-.L473:
-.LBE1424:
-.LBE1423:
-.LBB1425:
-.LBB1426:
+.LVL527:
+	b	.L532
+.LVL528:
+.L486:
+.LBE1486:
+.LBE1485:
+.LBB1487:
+.LBB1488:
 	.loc 1 1177 0
 	ldr	x17, [x5, #:lo12:.LANCHOR0]
 	.loc 1 1182 0
@@ -6100,134 +6276,134 @@ direct_mode_data_change_part:
 	add	x17, x17, 24
 	.loc 1 1183 0
 	ldr	x3, [x3, 128]
-.LVL507:
+.LVL529:
 	.loc 1 1182 0
 	sub	w12, w12, w4
-.LVL508:
+.LVL530:
 	.loc 1 1187 0
 	ldr	w18, [x17, 88]
 	.loc 1 1183 0
 	lsl	w12, w12, 16
-.LVL509:
+.LVL531:
 	.loc 1 1184 0
 	ldr	w30, [x17, 156]
 	.loc 1 1183 0
 	add	x12, x3, x12, sxtw
-.LVL510:
+.LVL532:
 	.loc 1 1186 0
 	ldr	w3, [x17, 84]
-.LVL511:
+.LVL533:
 	.loc 1 1192 0
 	cmp	w18, 0
 	.loc 1 1186 0
 	lsr	w13, w3, 3
-.LVL512:
+.LVL534:
 	.loc 1 1192 0
-	ble	.L455
+	ble	.L468
 	sub	w16, w13, #1
-.LBB1427:
-.LBB1428:
+.LBB1489:
+.LBB1490:
 	.loc 1 145 0
 	mov	w14, 3
 	add	x16, x16, 1
 	lsl	x16, x16, 2
-.LBE1428:
-.LBE1427:
+.LBE1490:
+.LBE1489:
 	.loc 1 1193 0
-	cbz	w30, .L501
-.LVL513:
-.L635:
+	cbz	w30, .L514
+.LVL535:
+.L648:
 	.loc 1 1194 0
 	ldr	w11, [x17, 88]
-.LVL514:
+.LVL536:
 	sub	w11, w11, #1
 	sub	w11, w11, w15
 	mul	w11, w11, w3
 	lsr	w11, w11, 2
 	add	x11, x0, x11
-.LVL515:
-.L502:
+.LVL537:
+.L515:
 	.loc 1 1198 0
-	cbz	w13, .L503
+	cbz	w13, .L516
 	add	x11, x11, 2
-.LVL516:
+.LVL538:
 	mov	x9, 0
 	.p2align 2
-.L516:
+.L529:
 	.loc 1 1200 0
 	ldr	w5, [x2, x9, lsl 2]
-.LBB1434:
-.LBB1435:
+.LBB1496:
+.LBB1497:
 	.loc 1 149 0
 	mov	w4, 0
-.LBE1435:
-.LBE1434:
+.LBE1497:
+.LBE1496:
 	.loc 1 1199 0
 	ldr	w22, [x1, x9, lsl 2]
-.LBB1440:
-.LBB1429:
+.LBB1502:
+.LBB1491:
 	.loc 1 149 0
 	mov	w8, 0
-.LBE1429:
-.LBE1440:
+.LBE1491:
+.LBE1502:
 	.loc 1 1202 0
 	and	w25, w5, 65535
 	and	w7, w22, 65535
-.LBB1441:
-.LBB1436:
+.LBB1503:
+.LBB1498:
 	.loc 1 160 0
 	and	w3, w25, 65280
 	add	w6, w3, w7, lsr 8
-.LBE1436:
-.LBE1441:
+.LBE1498:
+.LBE1503:
 	.loc 1 1203 0
 	lsr	w3, w5, 16
-.LBB1442:
-.LBB1430:
+.LBB1504:
+.LBB1492:
 	.loc 1 159 0
 	ubfiz	w21, w3, 8, 8
-.LBE1430:
-.LBE1442:
+.LBE1492:
+.LBE1504:
 	.loc 1 1203 0
 	and	w3, w3, 65535
 	lsr	w10, w22, 16
-.LBB1443:
-.LBB1437:
+.LBB1505:
+.LBB1499:
 	.loc 1 159 0
 	ubfiz	w23, w5, 8, 8
-.LBE1437:
-.LBE1443:
-.LBB1444:
-.LBB1431:
+.LBE1499:
+.LBE1505:
+.LBB1506:
+.LBB1493:
 	.loc 1 160 0
 	and	w19, w3, 65280
-.LBE1431:
-.LBE1444:
-.LBB1445:
-.LBB1438:
+.LBE1493:
+.LBE1506:
+.LBB1507:
+.LBB1500:
 	.loc 1 146 0
 	eor	w24, w25, w7
 	.loc 1 159 0
 	add	w23, w23, w7, uxtb
-.LBE1438:
-.LBE1445:
-.LBB1446:
-.LBB1432:
+.LBE1500:
+.LBE1507:
+.LBB1508:
+.LBB1494:
 	add	w21, w21, w10, uxtb
 	.loc 1 146 0
 	eor	w20, w3, w10
 	.loc 1 160 0
 	add	w19, w19, w10, lsr 8
-.LBE1432:
-.LBE1446:
+.LBE1494:
+.LBE1508:
 	.loc 1 1201 0
 	cmp	w22, w5
-	beq	.L504
-.LBB1447:
-.LBB1439:
+	beq	.L517
+.LBB1509:
+.LBB1501:
 	.loc 1 148 0
 	cmp	w25, w7
-	beq	.L505
+	beq	.L518
 	.loc 1 145 0
 	tst	x24, 15
 	.loc 1 160 0
@@ -6256,16 +6432,16 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w4, w5, w4
 	and	w4, w4, 255
-.L505:
-.LBE1439:
-.LBE1447:
+.L518:
+.LBE1501:
+.LBE1509:
 	.loc 1 1202 0
 	strb	w4, [x11, -2]
-.LBB1448:
-.LBB1433:
+.LBB1510:
+.LBB1495:
 	.loc 1 148 0
 	cmp	w3, w10
-	beq	.L510
+	beq	.L523
 	.loc 1 145 0
 	tst	x20, 15
 	.loc 1 159 0
@@ -6294,62 +6470,62 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w3, w4, w3
 	and	w8, w3, 255
-.L510:
-.LBE1433:
-.LBE1448:
+.L523:
+.LBE1495:
+.LBE1510:
 	.loc 1 1203 0
 	strb	w8, [x11, -1]
-.L515:
+.L528:
 	add	x9, x9, 1
 	add	x11, x11, 2
 	.loc 1 1198 0
 	cmp	w13, w9
-	bgt	.L516
+	bgt	.L529
 	add	x1, x1, x16
 	add	x2, x2, x16
-.LVL517:
-.L503:
+.LVL539:
+.L516:
 	.loc 1 1192 0
 	add	w15, w15, 1
 	cmp	w18, w15
-	beq	.L455
+	beq	.L468
 	ldr	w3, [x17, 84]
 	.loc 1 1193 0
-	cbnz	w30, .L635
-.L501:
+	cbnz	w30, .L648
+.L514:
 	.loc 1 1196 0
 	mul	w11, w15, w3
-.LVL518:
+.LVL540:
 	lsr	w11, w11, 2
 	add	x11, x0, x11
-.LVL519:
-	b	.L502
-.LVL520:
+.LVL541:
+	b	.L515
+.LVL542:
 	.p2align 3
-.L477:
-.LBE1426:
-.LBE1425:
-.LBB1450:
-.LBB1421:
+.L490:
+.LBE1488:
+.LBE1487:
+.LBB1512:
+.LBB1483:
 	.loc 1 1249 0
 	str	wzr, [x5, -4]
-	b	.L498
-.LVL521:
+	b	.L511
+.LVL543:
 	.p2align 3
-.L504:
-.LBE1421:
-.LBE1450:
-.LBB1451:
-.LBB1449:
+.L517:
+.LBE1483:
+.LBE1512:
+.LBB1513:
+.LBB1511:
 	.loc 1 1206 0
 	strh	wzr, [x11, -2]
-	b	.L515
-.LVL522:
-.L633:
-.LBE1449:
-.LBE1451:
-.LBB1452:
-.LBB1453:
+	b	.L528
+.LVL544:
+.L646:
+.LBE1511:
+.LBE1513:
+.LBB1514:
+.LBB1515:
 	.loc 1 1261 0
 	adrp	x5, .LANCHOR0
 	.loc 1 1266 0
@@ -6359,68 +6535,68 @@ direct_mode_data_change_part:
 	ldr	x21, [x5, #:lo12:.LANCHOR0]
 	.loc 1 1267 0
 	ldr	x3, [x3, 128]
-.LVL523:
+.LVL545:
 	.loc 1 1266 0
 	sub	w15, w15, w4
-.LVL524:
+.LVL546:
 	.loc 1 1268 0
 	add	x21, x21, 24
 	.loc 1 1267 0
 	lsl	w15, w15, 16
-.LVL525:
+.LVL547:
 	add	x15, x3, x15, sxtw
-.LVL526:
+.LVL548:
 	.loc 1 1273 0
 	ldr	w22, [x21, 88]
 	.loc 1 1272 0
 	ldr	w3, [x21, 84]
 	.loc 1 1268 0
 	ldr	w23, [x21, 156]
-.LVL527:
+.LVL549:
 	.loc 1 1278 0
 	cmp	w22, 0
 	.loc 1 1272 0
 	lsr	w17, w3, 2
-.LVL528:
+.LVL550:
 	.loc 1 1278 0
-	ble	.L455
+	ble	.L468
 	sub	w20, w17, #1
 	mov	w19, 0
-.LVL529:
+.LVL551:
 	add	x20, x20, 1
-.LBB1454:
-.LBB1455:
+.LBB1516:
+.LBB1517:
 	.loc 1 167 0
 	mov	w18, 3
 	lsl	x20, x20, 2
-.LBE1455:
-.LBE1454:
+.LBE1517:
+.LBE1516:
 	.loc 1 1279 0
-	cbz	w23, .L460
-.LVL530:
-.L638:
+	cbz	w23, .L473
+.LVL552:
+.L651:
 	.loc 1 1280 0
 	ldr	w16, [x21, 88]
-.LVL531:
+.LVL553:
 	sub	w16, w16, #1
 	sub	w16, w16, w19
 	mul	w16, w16, w3
 	lsr	w16, w16, 2
 	add	x16, x0, x16
-.LVL532:
-.L461:
+.LVL554:
+.L474:
 	.loc 1 1284 0
-	cbz	w17, .L462
+	cbz	w17, .L475
 	mov	x11, 0
-	b	.L471
-.LVL533:
+	b	.L484
+.LVL555:
 	.p2align 3
-.L637:
-.LBB1461:
-.LBB1462:
+.L650:
+.LBB1523:
+.LBB1524:
 	.loc 1 170 0
 	cmp	w7, w5
-	beq	.L464
+	beq	.L477
 	.loc 1 177 0
 	ldrb	w4, [x15, w8, sxtw]
 	.loc 1 167 0
@@ -6431,20 +6607,20 @@ direct_mode_data_change_part:
 	orr	w12, w4, w12, lsl 2
 	.loc 1 167 0
 	csel	w4, w18, wzr, ne
-.LVL534:
+.LVL556:
 	.loc 1 175 0
 	orr	w5, w4, 12
 	tst	w30, 65280
 	csel	w4, w5, w4, ne
 	and	w12, w12, w4
-.L464:
-.LBE1462:
-.LBE1461:
-.LBB1466:
-.LBB1456:
+.L477:
+.LBE1524:
+.LBE1523:
+.LBB1528:
+.LBB1518:
 	.loc 1 170 0
 	cmp	w3, w13
-	beq	.L467
+	beq	.L480
 	.loc 1 167 0
 	cmp	w26, 0
 	.loc 1 178 0
@@ -6453,7 +6629,7 @@ direct_mode_data_change_part:
 	ldrb	w5, [x15, w14, sxtw]
 	.loc 1 167 0
 	csel	w4, w18, wzr, ne
-.LVL535:
+.LVL557:
 	.loc 1 175 0
 	orr	w6, w4, 12
 	tst	w25, 65280
@@ -6463,35 +6639,35 @@ direct_mode_data_change_part:
 	and	w3, w3, w4
 	lsl	w3, w3, 4
 	sxtb	w10, w3
-.LVL536:
-.L467:
-.LBE1456:
-.LBE1466:
+.LVL558:
+.L480:
+.LBE1518:
+.LBE1528:
 	.loc 1 1290 0
 	orr	w3, w12, w10
 	strb	w3, [x16, x11]
 	add	x11, x11, 1
 	.loc 1 1284 0
 	cmp	w17, w11
-	ble	.L636
-.L471:
+	ble	.L649
+.L484:
 	.loc 1 1286 0
 	ldr	w4, [x2, x11, lsl 2]
-.LVL537:
-.LBB1467:
-.LBB1463:
+.LVL559:
+.LBB1529:
+.LBB1525:
 	.loc 1 170 0
 	mov	w12, 0
-.LBE1463:
-.LBE1467:
+.LBE1525:
+.LBE1529:
 	.loc 1 1285 0
 	ldr	w6, [x1, x11, lsl 2]
-.LBB1468:
-.LBB1457:
+.LBB1530:
+.LBB1519:
 	.loc 1 170 0
 	mov	w10, 0
-.LBE1457:
-.LBE1468:
+.LBE1519:
+.LBE1530:
 	.loc 1 1288 0
 	and	w7, w4, 65535
 	.loc 1 1289 0
@@ -6500,83 +6676,83 @@ direct_mode_data_change_part:
 	and	w5, w6, 65535
 	.loc 1 1289 0
 	lsr	w13, w6, 16
-.LBB1469:
-.LBB1458:
+.LBB1531:
+.LBB1520:
 	.loc 1 177 0
 	ubfiz	w14, w3, 8, 8
-.LBE1458:
-.LBE1469:
+.LBE1520:
+.LBE1531:
 	.loc 1 1289 0
 	and	w3, w3, 65535
-.LBB1470:
-.LBB1464:
+.LBB1532:
+.LBB1526:
 	.loc 1 177 0
 	ubfiz	w8, w4, 8, 8
 	.loc 1 178 0
 	and	w9, w7, 65280
 	.loc 1 168 0
 	eor	w30, w7, w5
-.LBE1464:
-.LBE1470:
-.LBB1471:
-.LBB1459:
+.LBE1526:
+.LBE1532:
+.LBB1533:
+.LBB1521:
 	.loc 1 178 0
 	and	w24, w3, 65280
 	.loc 1 168 0
 	eor	w25, w3, w13
-.LBE1459:
-.LBE1471:
-.LBB1472:
-.LBB1465:
+.LBE1521:
+.LBE1533:
+.LBB1534:
+.LBB1527:
 	.loc 1 177 0
 	add	w8, w8, w5, uxtb
 	.loc 1 178 0
 	add	w9, w9, w5, lsr 8
 	.loc 1 172 0
 	and	w27, w30, 255
-.LBE1465:
-.LBE1472:
-.LBB1473:
-.LBB1460:
+.LBE1527:
+.LBE1534:
+.LBB1535:
+.LBB1522:
 	.loc 1 177 0
 	add	w14, w14, w13, uxtb
 	.loc 1 178 0
 	add	w24, w24, w13, lsr 8
 	.loc 1 172 0
 	and	w26, w25, 255
-.LBE1460:
-.LBE1473:
+.LBE1522:
+.LBE1535:
 	.loc 1 1287 0
 	cmp	w6, w4
-	bne	.L637
+	bne	.L650
 	.loc 1 1293 0
 	strb	wzr, [x16, x11]
 	add	x11, x11, 1
 	.loc 1 1284 0
 	cmp	w17, w11
-	bgt	.L471
-.LVL538:
-.L636:
+	bgt	.L484
+.LVL560:
+.L649:
 	add	x1, x1, x20
 	add	x2, x2, x20
-.L462:
+.L475:
 	.loc 1 1278 0
 	add	w19, w19, 1
 	cmp	w22, w19
-	beq	.L455
+	beq	.L468
 	ldr	w3, [x21, 84]
 	.loc 1 1279 0
-	cbnz	w23, .L638
-.L460:
+	cbnz	w23, .L651
+.L473:
 	.loc 1 1282 0
 	mul	w16, w19, w3
-.LVL539:
+.LVL561:
 	lsr	w16, w16, 2
 	add	x16, x0, x16
-.LVL540:
-	b	.L461
-.LBE1453:
-.LBE1452:
+.LVL562:
+	b	.L474
+.LBE1515:
+.LBE1514:
 	.cfi_endproc
 .LFE2828:
 	.size	direct_mode_data_change_part, .-direct_mode_data_change_part
@@ -6587,7 +6763,7 @@ flip.isra.11:
 .LFB2879:
 	.loc 1 1476 0
 	.cfi_startproc
-.LVL541:
+.LVL563:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -6606,52 +6782,52 @@ flip.isra.11:
 	ldr	w19, [x0, 72]
 	.loc 1 1480 0
 	ldr	x0, [x0]
-.LVL542:
-.LBB1474:
-.LBB1475:
-.LBB1476:
-.LBB1477:
+.LVL564:
+.LBB1536:
+.LBB1537:
+.LBB1538:
+.LBB1539:
 	.file 10 "./include/linux/dma-mapping.h"
 	.loc 10 266 0
-	cbz	x0, .L642
+	cbz	x0, .L655
 	ldr	x3, [x0, 648]
 	.loc 10 268 0
 	adrp	x4, dummy_dma_ops
 	add	x4, x4, :lo12:dummy_dma_ops
 	cmp	x3, 0
 	csel	x3, x4, x3, eq
-.L640:
-.LBE1477:
-.LBE1476:
+.L653:
+.LBE1539:
+.LBE1538:
 	.loc 10 434 0
 	ldr	x5, [x3, 88]
 	sxtw	x19, w19
-	cbz	x5, .L641
-.LBE1475:
-.LBE1474:
+	cbz	x5, .L654
+.LBE1537:
+.LBE1536:
 	.loc 1 1480 0
 	add	x4, x19, x19, lsl 1
-.LBB1483:
-.LBB1480:
+.LBB1545:
+.LBB1542:
 	.loc 10 435 0
 	mov	w3, 1
-.LBE1480:
-.LBE1483:
+.LBE1542:
+.LBE1545:
 	.loc 1 1480 0
 	add	x4, x20, x4, lsl 3
-.LBB1484:
-.LBB1481:
+.LBB1546:
+.LBB1543:
 	.loc 10 435 0
 	ldr	x1, [x4, 32]
 	blr	x5
-.LVL543:
-.L641:
-.LBE1481:
-.LBE1484:
+.LVL565:
+.L654:
+.LBE1543:
+.LBE1546:
 	.loc 1 1481 0
 	ldr	x5, [x20, 8]
-.LBB1485:
-.LBB1486:
+.LBB1547:
+.LBB1548:
 	.file 11 "drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.h"
 	.loc 11 57 0
 	mov	w4, 0
@@ -6659,50 +6835,50 @@ flip.isra.11:
 	mov	w2, 0
 	mov	x0, x5
 	mov	w1, 0
-.LBE1486:
-.LBE1485:
+.LBE1548:
+.LBE1547:
 	.loc 1 1482 0
 	add	x19, x19, x19, lsl 1
-.LBB1489:
-.LBB1487:
+.LBB1551:
+.LBB1549:
 	.loc 11 57 0
 	ldr	x5, [x5, 64]
-.LBE1487:
-.LBE1489:
+.LBE1549:
+.LBE1551:
 	.loc 1 1482 0
 	add	x19, x20, x19, lsl 3
-.LBB1490:
-.LBB1488:
+.LBB1552:
+.LBB1550:
 	.loc 11 57 0
 	blr	x5
-.LVL544:
-.LBE1488:
-.LBE1490:
+.LVL566:
+.LBE1550:
+.LBE1552:
 	.loc 1 1482 0
 	ldr	x1, [x20, 8]
-.LBB1491:
-.LBB1492:
+.LBB1553:
+.LBB1554:
 	.loc 11 62 0
 	mov	w2, 0
 	mov	x0, x1
 	ldr	x3, [x1, 72]
 	ldr	w1, [x19, 32]
 	blr	x3
-.LVL545:
-.LBE1492:
-.LBE1491:
+.LVL567:
+.LBE1554:
+.LBE1553:
 	.loc 1 1483 0
 	ldr	x2, [x20, 8]
-.LBB1493:
-.LBB1494:
+.LBB1555:
+.LBB1556:
 	.loc 11 77 0
 	mov	w1, 1
 	mov	x0, x2
 	ldr	x2, [x2, 96]
 	blr	x2
-.LVL546:
-.LBE1494:
-.LBE1493:
+.LVL568:
+.LBE1556:
+.LBE1555:
 	.loc 1 1484 0
 	ldr	w1, [x20, 72]
 	mov	w0, 1
@@ -6710,7 +6886,7 @@ flip.isra.11:
 	str	w0, [x20, 72]
 	.loc 1 1485 0
 	ldp	x19, x20, [sp, 16]
-.LVL547:
+.LVL569:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -6719,22 +6895,22 @@ flip.isra.11:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL548:
+.LVL570:
 	.p2align 3
-.L642:
+.L655:
 	.cfi_restore_state
-.LBB1495:
-.LBB1482:
-.LBB1479:
-.LBB1478:
+.LBB1557:
+.LBB1544:
+.LBB1541:
+.LBB1540:
 	.loc 10 268 0
 	adrp	x3, dummy_dma_ops
 	add	x3, x3, :lo12:dummy_dma_ops
-	b	.L640
-.LBE1478:
-.LBE1479:
-.LBE1482:
-.LBE1495:
+	b	.L653
+.LBE1540:
+.LBE1541:
+.LBE1544:
+.LBE1557:
 	.cfi_endproc
 .LFE2879:
 	.size	flip.isra.11, .-flip.isra.11
@@ -6745,7 +6921,7 @@ ebc_frame_start:
 .LFB2831:
 	.loc 1 1494 0
 	.cfi_startproc
-.LVL549:
+.LVL571:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
@@ -6767,46 +6943,46 @@ ebc_frame_start:
 	.loc 1 1501 0
 	ldr	x1, [x19, 224]
 	ldr	w0, [x1, 40]
-.LVL550:
+.LVL572:
 	cmp	w0, 16
-	bgt	.L649
+	bgt	.L662
 	cmp	w0, 7
-	bge	.L650
-	cbz	w0, .L651
+	bge	.L663
+	cbz	w0, .L664
 	cmp	w0, 1
-	bne	.L648
+	bne	.L661
 	.loc 1 1503 0
 	ldr	x0, [x19, 184]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
 	ldr	x3, [x19, 168]
 	bl	get_overlay_image
-.LVL551:
+.LVL573:
 	.loc 1 1508 0
 	ldr	w0, [x19, 52]
-	cbz	w0, .L653
-.LBB1496:
-.LBB1497:
+	cbz	w0, .L666
+.LBB1558:
+.LBB1559:
 	.loc 1 1489 0
 	str	wzr, [x21, 72]
 	.loc 1 1490 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
-.LVL552:
-.LBE1497:
-.LBE1496:
+.LVL574:
+.LBE1559:
+.LBE1558:
 	.loc 1 1510 0
 	ldp	x1, x2, [x19, 144]
 	mov	x4, x19
 	ldr	x3, [x19, 168]
 	ldr	x0, [x19, 192]
 	bl	get_overlay_image
-.LVL553:
+.LVL575:
 	.loc 1 1578 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL554:
+.LVL576:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -6816,47 +6992,47 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL555:
+.LVL577:
 	.p2align 3
-.L649:
+.L662:
 	.cfi_restore_state
 	.loc 1 1501 0
 	sub	w0, w0, #22
 	cmp	w0, 1
-	bhi	.L648
-.L651:
+	bhi	.L661
+.L664:
 	.loc 1 1523 0
 	ldr	x0, [x19, 184]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
 	ldr	x3, [x19, 168]
 	bl	get_auto_image
-.LVL556:
+.LVL578:
 	.loc 1 1528 0
 	ldr	w0, [x19, 52]
-	cbz	w0, .L655
-.LBB1498:
-.LBB1499:
+	cbz	w0, .L668
+.LBB1560:
+.LBB1561:
 	.loc 1 1489 0
 	str	wzr, [x21, 72]
 	.loc 1 1490 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
-.LVL557:
-.LBE1499:
-.LBE1498:
+.LVL579:
+.LBE1561:
+.LBE1560:
 	.loc 1 1530 0
 	ldp	x1, x2, [x19, 144]
 	mov	x4, x19
 	ldr	x3, [x19, 168]
 	ldr	x0, [x19, 192]
 	bl	get_auto_image
-.LVL558:
+.LVL580:
 	.loc 1 1578 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL559:
+.LVL581:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -6866,9 +7042,9 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL560:
+.LVL582:
 	.p2align 3
-.L648:
+.L661:
 	.cfi_restore_state
 	.loc 1 1566 0
 	ldr	x2, [x19, 216]
@@ -6882,18 +7058,18 @@ ebc_frame_start:
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change
-.LVL561:
-.LBB1500:
-.LBB1501:
+.LVL583:
+.LBB1562:
+.LBB1563:
 	.loc 1 1489 0
 	str	wzr, [x21, 72]
 	.loc 1 1490 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
-.LVL562:
-.LBE1501:
-.LBE1500:
+.LVL584:
+.LBE1563:
+.LBE1562:
 	.loc 1 1569 0
 	ldr	w0, [x19, 56]
 	.loc 1 1570 0
@@ -6908,11 +7084,11 @@ ebc_frame_start:
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
-.LVL563:
+.LVL585:
 	.loc 1 1578 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL564:
+.LVL586:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 30
@@ -6922,9 +7098,9 @@ ebc_frame_start:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL565:
+.LVL587:
 	.p2align 3
-.L650:
+.L663:
 	.cfi_restore_state
 	.loc 1 1553 0
 	ldr	x2, [x19, 216]
@@ -6938,18 +7114,18 @@ ebc_frame_start:
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change_part
-.LVL566:
-.LBB1502:
-.LBB1503:
+.LVL588:
+.LBB1564:
+.LBB1565:
 	.loc 1 1489 0
 	str	wzr, [x21, 72]
 	.loc 1 1490 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
-.LVL567:
-.LBE1503:
-.LBE1502:
+.LVL589:
+.LBE1565:
+.LBE1564:
 	.loc 1 1556 0
 	ldr	w0, [x19, 56]
 	.loc 1 1557 0
@@ -6964,11 +7140,11 @@ ebc_frame_start:
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part
-.LVL568:
+.LVL590:
 	.loc 1 1578 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL569:
+.LVL591:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -6978,23 +7154,23 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL570:
+.LVL592:
 	.p2align 3
-.L655:
+.L668:
 	.cfi_restore_state
 	.loc 1 1536 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
-	adrp	x1, .LC21
+	adrp	x1, .LC22
 	add	x2, x2, :lo12:.LANCHOR3
-	add	x1, x1, :lo12:.LC21
+	add	x1, x1, :lo12:.LC22
 	bl	_dev_info
-.LVL571:
+.LVL593:
 	.loc 1 1537 0
 	str	wzr, [x19, 44]
 	.loc 1 1578 0
 	ldp	x19, x20, [sp, 16]
-.LVL572:
+.LVL594:
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -7005,23 +7181,23 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL573:
+.LVL595:
 	.p2align 3
-.L653:
+.L666:
 	.cfi_restore_state
 	.loc 1 1516 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
-	adrp	x1, .LC20
+	adrp	x1, .LC21
 	add	x2, x2, :lo12:.LANCHOR3
-	add	x1, x1, :lo12:.LC20
+	add	x1, x1, :lo12:.LC21
 	bl	_dev_info
-.LVL574:
+.LVL596:
 	.loc 1 1517 0
 	str	wzr, [x19, 44]
 	.loc 1 1578 0
 	ldp	x19, x20, [sp, 16]
-.LVL575:
+.LVL597:
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	.cfi_restore 20
@@ -7041,7 +7217,7 @@ ebc_power_set.part.13:
 .LFB2881:
 	.loc 1 183 0
 	.cfi_startproc
-.LVL576:
+.LVL598:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -7057,41 +7233,41 @@ ebc_power_set.part.13:
 	str	w1, [x0, 384]
 	.loc 1 201 0
 	ldr	x1, [x0, 8]
-.LVL577:
-.LBB1504:
-.LBB1505:
+.LVL599:
+.LBB1566:
+.LBB1567:
 	.loc 11 51 0
 	mov	x0, x1
-.LVL578:
+.LVL600:
 	ldr	x1, [x1, 56]
 	blr	x1
-.LVL579:
-.LBE1505:
-.LBE1504:
+.LVL601:
+.LBE1567:
+.LBE1566:
 	.loc 1 202 0
 	ldr	x2, [x19, 16]
-.LBB1506:
-.LBB1507:
+.LBB1568:
+.LBB1569:
 	.loc 3 35 0
 	mov	w1, 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL580:
-.LBE1507:
-.LBE1506:
+.LVL602:
+.LBE1569:
+.LBE1568:
 	.loc 1 203 0
 	ldr	w0, [x19, 624]
-	cbnz	w0, .L666
+	cbnz	w0, .L679
 	.loc 1 207 0
 	ldr	x0, [x19]
-	adrp	x1, .LC22
-	add	x1, x1, :lo12:.LC22
+	adrp	x1, .LC23
+	add	x1, x1, :lo12:.LC23
 	bl	_dev_info
-.LVL581:
+.LVL603:
 	.loc 1 211 0
 	ldp	x19, x20, [sp, 16]
-.LVL582:
+.LVL604:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -7100,29 +7276,29 @@ ebc_power_set.part.13:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL583:
+.LVL605:
 	.p2align 3
-.L666:
+.L679:
 	.cfi_restore_state
 	.loc 1 204 0
 	str	wzr, [x19, 624]
-.LBB1508:
-.LBB1509:
+.LBB1570:
+.LBB1571:
 	.loc 4 68 0
 	add	x0, x19, 416
 	bl	__pm_relax
-.LVL584:
-.LBE1509:
-.LBE1508:
+.LVL606:
+.LBE1571:
+.LBE1570:
 	.loc 1 207 0
 	ldr	x0, [x19]
-	adrp	x1, .LC22
-	add	x1, x1, :lo12:.LC22
+	adrp	x1, .LC23
+	add	x1, x1, :lo12:.LC23
 	bl	_dev_info
-.LVL585:
+.LVL607:
 	.loc 1 211 0
 	ldp	x19, x20, [sp, 16]
-.LVL586:
+.LVL608:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -7138,9 +7314,9 @@ ebc_power_set.part.13:
 	.type	ebc_suspend, %function
 ebc_suspend:
 .LFB2864:
-	.loc 1 3131 0
+	.loc 1 3135 0
 	.cfi_startproc
-.LVL587:
+.LVL609:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -7150,40 +7326,40 @@ ebc_suspend:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-.LBB1510:
-.LBB1511:
+.LBB1572:
+.LBB1573:
 	.loc 2 1181 0
 	ldr	x20, [x0, 184]
-.LBE1511:
-.LBE1510:
-	.loc 1 3135 0
+.LBE1573:
+.LBE1572:
+	.loc 1 3139 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 200]
-.LVL588:
+.LVL610:
 	cmp	w0, 1
-	beq	.L670
-.L668:
-	.loc 1 3139 0
+	beq	.L683
+.L681:
+	.loc 1 3143 0
 	mov	w0, 1
 	str	w0, [x19, 620]
-	.loc 1 3141 0
+	.loc 1 3145 0
 	ldr	x1, [x20, 16]
-.LBB1512:
-.LBB1513:
+.LBB1574:
+.LBB1575:
 	.loc 3 40 0
 	mov	x0, x1
 	ldr	x1, [x1, 40]
 	blr	x1
-.LVL589:
-.LBE1513:
-.LBE1512:
-	.loc 1 3142 0
+.LVL611:
+.LBE1575:
+.LBE1574:
+	.loc 1 3146 0
 	ldr	x0, [x19, 104]
-	adrp	x1, .LC24
-	add	x1, x1, :lo12:.LC24
+	adrp	x1, .LC25
+	add	x1, x1, :lo12:.LC25
 	bl	_dev_info
-.LVL590:
-	.loc 1 3145 0
+.LVL612:
+	.loc 1 3149 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -7195,26 +7371,26 @@ ebc_suspend:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L670:
+.L683:
 	.cfi_restore_state
-	.loc 1 3136 0
+	.loc 1 3140 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
-	adrp	x1, .LC23
+	adrp	x1, .LC24
 	add	x2, x2, 16
-	add	x1, x1, :lo12:.LC23
+	add	x1, x1, :lo12:.LC24
 	bl	_dev_info
-.LVL591:
-.LBB1514:
-.LBB1515:
+.LVL613:
+.LBB1576:
+.LBB1577:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.13
-.LVL592:
-	b	.L668
-.LBE1515:
-.LBE1514:
+.LVL614:
+	b	.L681
+.LBE1577:
+.LBE1576:
 	.cfi_endproc
 .LFE2864:
 	.size	ebc_suspend, .-ebc_suspend
@@ -7244,18 +7420,18 @@ check_black_percent.isra.15:
 	.loc 1 1835 0
 	asr	x4, x4, 34
 	sub	w4, w4, w2, asr 31
-.LVL593:
+.LVL615:
 	.loc 1 1836 0
-	ble	.L673
+	ble	.L686
 	mov	x1, 0
 	mov	w2, 0
-.LVL594:
-	b	.L676
+.LVL616:
+	b	.L689
 	.p2align 3
-.L684:
+.L697:
 	cmp	w5, w1
-	ble	.L673
-.L676:
+	ble	.L686
+.L689:
 	.loc 1 1838 0
 	ldr	x3, [x0, x1, lsl 3]
 	add	x1, x1, 1
@@ -7264,25 +7440,25 @@ check_black_percent.isra.15:
 	cinc	w2, w2, ne
 	.loc 1 1840 0
 	cmp	w4, w2, lsl 3
-	bge	.L684
+	bge	.L697
 	.loc 1 1841 0
 	mov	w0, 0
 	ret
-.L673:
+.L686:
 	.loc 1 1821 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	.loc 1 1844 0
-	adrp	x0, .LC25
-	add	x0, x0, :lo12:.LC25
+	adrp	x0, .LC26
+	add	x0, x0, :lo12:.LC26
 	.loc 1 1821 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	.loc 1 1844 0
 	bl	printk
-.LVL595:
+.LVL617:
 	.loc 1 1846 0
 	mov	w0, 1
 	.loc 1 1847 0
@@ -7299,36 +7475,36 @@ check_black_percent.isra.15:
 	.type	ebc_probe, %function
 ebc_probe:
 .LFB2862:
-	.loc 1 2995 0
+	.loc 1 2999 0
 	.cfi_startproc
-.LVL596:
+.LVL618:
 	stp	x29, x30, [sp, -208]!
 	.cfi_def_cfa_offset 208
 	.cfi_offset 29, -208
 	.cfi_offset 30, -200
-.LBB1660:
-.LBB1661:
+.LBB1722:
+.LBB1723:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
-.LBE1661:
-.LBE1660:
-	.loc 1 2995 0
+.LBE1723:
+.LBE1722:
+	.loc 1 2999 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 2996 0
+	.loc 1 3000 0
 	add	x22, x0, 16
-	.loc 1 2995 0
+	.loc 1 2999 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
-.LVL597:
+.LVL619:
 	stp	x25, x26, [sp, 64]
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 19, -192
@@ -7337,148 +7513,148 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 2995 0
+	.loc 1 2999 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
-.LBB1663:
-.LBB1662:
+.LBB1725:
+.LBB1724:
 	.loc 2 711 0
 	mov	x0, x22
 	mov	x1, 824
 	bl	devm_kmalloc
-.LVL598:
-.LBE1662:
-.LBE1663:
-	.loc 1 3011 0
-	cbz	x0, .L735
+.LVL620:
+.LBE1724:
+.LBE1725:
 	.loc 1 3015 0
+	cbz	x0, .L748
+	.loc 1 3019 0
 	adrp	x24, .LANCHOR0
 	mov	x20, x0
-	.loc 1 3017 0
-	adrp	x1, .LC26
+	.loc 1 3021 0
+	adrp	x1, .LC27
 	mov	w2, 0
-	.loc 1 3015 0
+	.loc 1 3019 0
 	str	x0, [x24, #:lo12:.LANCHOR0]
-	.loc 1 3017 0
-	add	x1, x1, :lo12:.LC26
+	.loc 1 3021 0
+	add	x1, x1, :lo12:.LC27
 	ldr	x0, [x22, 752]
-	.loc 1 3014 0
+	.loc 1 3018 0
 	str	x22, [x20]
-	.loc 1 3017 0
+	.loc 1 3021 0
 	bl	of_parse_phandle
-.LVL599:
-	.loc 1 3018 0
-	cbz	x0, .L771
-	.loc 1 3023 0
+.LVL621:
+	.loc 1 3022 0
+	cbz	x0, .L784
+	.loc 1 3027 0
 	bl	of_find_device_by_node
-.LVL600:
-	.loc 1 3025 0
-	cbz	x0, .L689
-.LBB1664:
-.LBB1665:
-.LBB1666:
+.LVL622:
+	.loc 1 3029 0
+	cbz	x0, .L702
+.LBB1726:
+.LBB1727:
+.LBB1728:
 	.loc 2 1181 0
 	ldr	x0, [x0, 200]
-.LVL601:
-.LBE1666:
-.LBE1665:
-.LBE1664:
-	.loc 1 3028 0
+.LVL623:
+.LBE1728:
+.LBE1727:
+.LBE1726:
+	.loc 1 3032 0
 	str	x0, [x20, 8]
-	.loc 1 3029 0
-	cbz	x0, .L689
-	.loc 1 3031 0
+	.loc 1 3033 0
+	cbz	x0, .L702
+	.loc 1 3035 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 3033 0
+	.loc 1 3037 0
 	add	x2, x29, 96
-	adrp	x1, .LC28
-	add	x1, x1, :lo12:.LC28
+	adrp	x1, .LC29
+	add	x1, x1, :lo12:.LC29
 	ldr	x0, [x22, 752]
 	bl	of_get_property
-.LVL602:
+.LVL624:
 	mov	x21, x0
-.LVL603:
-	.loc 1 3034 0
+.LVL625:
+	.loc 1 3038 0
 	ldrsw	x0, [x29, 96]
-.LVL604:
+.LVL626:
 	lsr	x0, x0, 2
-.LVL605:
+.LVL627:
 	str	w0, [x29, 96]
-.LVL606:
-	.loc 1 3035 0
+.LVL628:
+	.loc 1 3039 0
 	cmp	w0, 0
-	beq	.L690
-	.loc 1 3040 0 discriminator 1
+	beq	.L703
+	.loc 1 3044 0 discriminator 1
 	mov	w19, 0
-.LVL607:
-	bgt	.L758
-	b	.L692
+.LVL629:
+	bgt	.L771
+	b	.L705
 	.p2align 3
-.L693:
-	.loc 1 3048 0
+.L706:
+	.loc 1 3052 0
 	bl	of_find_i2c_device_by_node
-.LVL608:
-	.loc 1 3050 0
-	cbz	x0, .L772
-.LBB1667:
-.LBB1668:
-.LBB1669:
+.LVL630:
+	.loc 1 3054 0
+	cbz	x0, .L785
+.LBB1729:
+.LBB1730:
+.LBB1731:
 	.loc 2 1181 0
 	ldr	x0, [x0, 216]
-.LVL609:
-.LBE1669:
-.LBE1668:
-.LBE1667:
-	.loc 1 3055 0
+.LVL631:
+.LBE1731:
+.LBE1730:
+.LBE1729:
+	.loc 1 3059 0
 	str	x0, [x20, 16]
-	.loc 1 3056 0
-	cbnz	x0, .L773
-	.loc 1 3040 0 discriminator 2
+	.loc 1 3060 0
+	cbnz	x0, .L786
+	.loc 1 3044 0 discriminator 2
 	ldr	w0, [x29, 96]
 	add	w19, w19, 1
-.LVL610:
+.LVL632:
 	cmp	w0, w19
-	ble	.L697
-.L758:
+	ble	.L710
+.L771:
 	ldr	w0, [x21], 4
-	.loc 1 3042 0
+	.loc 1 3046 0
 	rev	w0, w0
 	bl	of_find_node_by_phandle
-.LVL611:
-	.loc 1 3043 0
-	cbnz	x0, .L693
-	.loc 1 3044 0
-	adrp	x1, .LC30
+.LVL633:
+	.loc 1 3047 0
+	cbnz	x0, .L706
+	.loc 1 3048 0
+	adrp	x1, .LC31
 	mov	x0, x22
-	add	x1, x1, :lo12:.LC30
-	.loc 1 3045 0
+	add	x1, x1, :lo12:.LC31
+	.loc 1 3049 0
 	mov	w25, -19
-	.loc 1 3044 0
+	.loc 1 3048 0
 	bl	_dev_err
-.LVL612:
+.LVL634:
 	.p2align 2
-.L685:
-	.loc 1 3121 0
+.L698:
+	.loc 1 3125 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w25
-.LVL613:
+.LVL635:
 	ldr	x2, [x29, 200]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L774
+	cbnz	x1, .L787
 	ldp	x19, x20, [sp, 16]
-.LVL614:
+.LVL636:
 	ldp	x21, x22, [sp, 32]
-.LVL615:
+.LVL637:
 	ldp	x23, x24, [sp, 48]
-.LVL616:
+.LVL638:
 	ldp	x25, x26, [sp, 64]
-.LVL617:
+.LVL639:
 	ldp	x27, x28, [sp, 80]
-.LVL618:
+.LVL640:
 	ldp	x29, x30, [sp], 208
 	.cfi_remember_state
 	.cfi_restore 30
@@ -7495,815 +7671,815 @@ ebc_probe:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL619:
+.LVL641:
 	.p2align 3
-.L773:
+.L786:
 	.cfi_restore_state
-	.loc 1 3057 0
-	adrp	x1, .LC32
+	.loc 1 3061 0
+	adrp	x1, .LC33
 	mov	w2, w19
-	add	x1, x1, :lo12:.LC32
+	add	x1, x1, :lo12:.LC33
 	mov	x0, x22
 	bl	_dev_info
-.LVL620:
-.L692:
-	.loc 1 3062 0
+.LVL642:
+.L705:
+	.loc 1 3066 0
 	ldr	x0, [x20, 16]
-	cbz	x0, .L697
-	.loc 1 3068 0
+	cbz	x0, .L710
+	.loc 1 3072 0
 	add	x19, x20, 184
-.LVL621:
-	.loc 1 3070 0
+.LVL643:
+	.loc 1 3074 0
 	add	x21, x20, 24
-.LVL622:
-	.loc 1 3068 0
+.LVL644:
+	.loc 1 3072 0
 	str	x22, [x19, 104]
-.LBB1670:
-.LBB1671:
-.LBB1672:
-.LBB1673:
-.LBB1674:
+.LBB1732:
+.LBB1733:
+.LBB1734:
+.LBB1735:
+.LBB1736:
 	.file 12 "./include/linux/of.h"
 	.loc 12 499 0
-	adrp	x1, .LC34
-.LBE1674:
-.LBE1673:
-.LBE1672:
-.LBE1671:
-.LBE1670:
-	.loc 1 3070 0
+	adrp	x1, .LC35
+.LBE1736:
+.LBE1735:
+.LBE1734:
+.LBE1733:
+.LBE1732:
+	.loc 1 3074 0
 	str	x22, [x20, 24]
+.LBB1806:
+.LBB1803:
+.LBB1743:
+.LBB1740:
+.LBB1737:
+	.loc 12 499 0
+	mov	x4, 0
+.LBE1737:
+.LBE1740:
+.LBE1743:
+.LBE1803:
+.LBE1806:
+	.loc 1 3075 0
+	ldr	x2, [x20, 8]
+.LBB1807:
+.LBB1804:
 .LBB1744:
 .LBB1741:
-.LBB1681:
-.LBB1678:
-.LBB1675:
+.LBB1738:
 	.loc 12 499 0
-	mov	x4, 0
-.LBE1675:
-.LBE1678:
-.LBE1681:
+	add	x1, x1, :lo12:.LC35
+.LBE1738:
 .LBE1741:
 .LBE1744:
-	.loc 1 3071 0
-	ldr	x2, [x20, 8]
+.LBE1804:
+.LBE1807:
+	.loc 1 3076 0
+	stp	x2, x0, [x21, 8]
+.LBB1808:
+.LBB1805:
 .LBB1745:
 .LBB1742:
-.LBB1682:
-.LBB1679:
-.LBB1676:
-	.loc 12 499 0
-	add	x1, x1, :lo12:.LC34
-.LBE1676:
-.LBE1679:
-.LBE1682:
-.LBE1742:
-.LBE1745:
-	.loc 1 3072 0
-	stp	x2, x0, [x21, 8]
-.LBB1746:
-.LBB1743:
-.LBB1683:
-.LBB1680:
-.LBB1677:
+.LBB1739:
 	.loc 12 499 0
 	mov	x3, 1
 	ldr	x0, [x22, 752]
 	add	x2, x20, 100
 	bl	of_property_read_variable_u32_array
-.LVL623:
+.LVL645:
 	.loc 12 501 0
-	tbnz	w0, #31, .L699
-.LBE1677:
-.LBE1680:
-.LBE1683:
-.LBB1684:
-.LBB1685:
-.LBB1686:
+	tbnz	w0, #31, .L712
+.LBE1739:
+.LBE1742:
+.LBE1745:
+.LBB1746:
+.LBB1747:
+.LBB1748:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC58
+	adrp	x1, .LC61
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 104
-	add	x1, x1, :lo12:.LC58
+	add	x1, x1, :lo12:.LC61
 	bl	of_property_read_variable_u32_array
-.LVL624:
+.LVL646:
 	.loc 12 501 0
-	tbnz	w0, #31, .L699
-.LBE1686:
-.LBE1685:
-.LBE1684:
-.LBB1687:
-.LBB1688:
-.LBB1689:
+	tbnz	w0, #31, .L712
+.LBE1748:
+.LBE1747:
+.LBE1746:
+.LBB1749:
+.LBB1750:
+.LBB1751:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC59
+	adrp	x1, .LC62
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 108
-	add	x1, x1, :lo12:.LC59
+	add	x1, x1, :lo12:.LC62
 	bl	of_property_read_variable_u32_array
-.LVL625:
+.LVL647:
 	.loc 12 501 0
-	tbnz	w0, #31, .L699
-.LBE1689:
-.LBE1688:
-.LBE1687:
-.LBB1690:
-.LBB1691:
-.LBB1692:
+	tbnz	w0, #31, .L712
+.LBE1751:
+.LBE1750:
+.LBE1749:
+.LBB1752:
+.LBB1753:
+.LBB1754:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC60
+	adrp	x1, .LC63
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 112
-	add	x1, x1, :lo12:.LC60
+	add	x1, x1, :lo12:.LC63
 	bl	of_property_read_variable_u32_array
-.LVL626:
+.LVL648:
 	.loc 12 501 0
-	tbnz	w0, #31, .L699
-.LBE1692:
-.LBE1691:
-.LBE1690:
-.LBB1693:
-.LBB1694:
-.LBB1695:
+	tbnz	w0, #31, .L712
+.LBE1754:
+.LBE1753:
+.LBE1752:
+.LBB1755:
+.LBB1756:
+.LBB1757:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC61
+	adrp	x1, .LC64
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 128
-	add	x1, x1, :lo12:.LC61
+	add	x1, x1, :lo12:.LC64
 	bl	of_property_read_variable_u32_array
-.LVL627:
+.LVL649:
 	.loc 12 501 0
-	tbnz	w0, #31, .L699
-.LBE1695:
-.LBE1694:
-.LBE1693:
-.LBB1696:
-.LBB1697:
-.LBB1698:
+	tbnz	w0, #31, .L712
+.LBE1757:
+.LBE1756:
+.LBE1755:
+.LBB1758:
+.LBB1759:
+.LBB1760:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC62
+	adrp	x1, .LC65
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 132
-	add	x1, x1, :lo12:.LC62
+	add	x1, x1, :lo12:.LC65
 	bl	of_property_read_variable_u32_array
-.LVL628:
+.LVL650:
 	.loc 12 501 0
-	tbnz	w0, #31, .L699
-.LBE1698:
-.LBE1697:
-.LBE1696:
-.LBB1699:
-.LBB1700:
-.LBB1701:
+	tbnz	w0, #31, .L712
+.LBE1760:
+.LBE1759:
+.LBE1758:
+.LBB1761:
+.LBB1762:
+.LBB1763:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC63
+	adrp	x1, .LC66
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 136
-	add	x1, x1, :lo12:.LC63
+	add	x1, x1, :lo12:.LC66
 	bl	of_property_read_variable_u32_array
-.LVL629:
+.LVL651:
 	.loc 12 501 0
-	tbnz	w0, #31, .L699
-.LBE1701:
-.LBE1700:
-.LBE1699:
-.LBB1702:
-.LBB1703:
-.LBB1704:
+	tbnz	w0, #31, .L712
+.LBE1763:
+.LBE1762:
+.LBE1761:
+.LBB1764:
+.LBB1765:
+.LBB1766:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC64
+	adrp	x1, .LC67
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 140
-	add	x1, x1, :lo12:.LC64
+	add	x1, x1, :lo12:.LC67
 	bl	of_property_read_variable_u32_array
-.LVL630:
+.LVL652:
 	.loc 12 501 0
-	tbnz	w0, #31, .L699
-.LBE1704:
-.LBE1703:
-.LBE1702:
-.LBB1705:
-.LBB1706:
-.LBB1707:
+	tbnz	w0, #31, .L712
+.LBE1766:
+.LBE1765:
+.LBE1764:
+.LBB1767:
+.LBB1768:
+.LBB1769:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC65
+	adrp	x1, .LC68
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 144
-	add	x1, x1, :lo12:.LC65
+	add	x1, x1, :lo12:.LC68
 	bl	of_property_read_variable_u32_array
-.LVL631:
+.LVL653:
 	.loc 12 501 0
-	tbnz	w0, #31, .L699
-.LBE1707:
-.LBE1706:
-.LBE1705:
-.LBB1708:
-.LBB1709:
-.LBB1710:
+	tbnz	w0, #31, .L712
+.LBE1769:
+.LBE1768:
+.LBE1767:
+.LBB1770:
+.LBB1771:
+.LBB1772:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC66
+	adrp	x1, .LC69
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 148
-	add	x1, x1, :lo12:.LC66
+	add	x1, x1, :lo12:.LC69
 	bl	of_property_read_variable_u32_array
-.LVL632:
+.LVL654:
 	.loc 12 501 0
-	tbnz	w0, #31, .L699
-.LBE1710:
-.LBE1709:
-.LBE1708:
-.LBB1711:
-.LBB1712:
-.LBB1713:
+	tbnz	w0, #31, .L712
+.LBE1772:
+.LBE1771:
+.LBE1770:
+.LBB1773:
+.LBB1774:
+.LBB1775:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC67
+	adrp	x1, .LC70
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 152
-	add	x1, x1, :lo12:.LC67
+	add	x1, x1, :lo12:.LC70
 	bl	of_property_read_variable_u32_array
-.LVL633:
+.LVL655:
 	.loc 12 501 0
-	tbnz	w0, #31, .L699
-.LBE1713:
-.LBE1712:
-.LBE1711:
-.LBB1714:
-.LBB1715:
-.LBB1716:
+	tbnz	w0, #31, .L712
+.LBE1775:
+.LBE1774:
+.LBE1773:
+.LBB1776:
+.LBB1777:
+.LBB1778:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC68
+	adrp	x1, .LC71
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 156
-	add	x1, x1, :lo12:.LC68
+	add	x1, x1, :lo12:.LC71
 	bl	of_property_read_variable_u32_array
-.LVL634:
+.LVL656:
 	.loc 12 501 0
-	tbnz	w0, #31, .L699
-.LBE1716:
-.LBE1715:
-.LBE1714:
-.LBB1717:
-.LBB1718:
-.LBB1719:
+	tbnz	w0, #31, .L712
+.LBE1778:
+.LBE1777:
+.LBE1776:
+.LBB1779:
+.LBB1780:
+.LBB1781:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC69
+	adrp	x1, .LC72
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 160
-	add	x1, x1, :lo12:.LC69
+	add	x1, x1, :lo12:.LC72
 	bl	of_property_read_variable_u32_array
-.LVL635:
+.LVL657:
 	.loc 12 501 0
-	tbnz	w0, #31, .L699
-.LBE1719:
-.LBE1718:
-.LBE1717:
-.LBB1720:
-.LBB1721:
-.LBB1722:
+	tbnz	w0, #31, .L712
+.LBE1781:
+.LBE1780:
+.LBE1779:
+.LBB1782:
+.LBB1783:
+.LBB1784:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC70
+	adrp	x1, .LC73
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 164
-	add	x1, x1, :lo12:.LC70
+	add	x1, x1, :lo12:.LC73
 	bl	of_property_read_variable_u32_array
-.LVL636:
+.LVL658:
 	.loc 12 501 0
-	tbnz	w0, #31, .L699
-.LBE1722:
-.LBE1721:
-.LBE1720:
-.LBB1723:
-.LBB1724:
-.LBB1725:
+	tbnz	w0, #31, .L712
+.LBE1784:
+.LBE1783:
+.LBE1782:
+.LBB1785:
+.LBB1786:
+.LBB1787:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC71
+	adrp	x1, .LC74
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 168
-	add	x1, x1, :lo12:.LC71
+	add	x1, x1, :lo12:.LC74
 	bl	of_property_read_variable_u32_array
-.LVL637:
+.LVL659:
 	.loc 12 501 0
-	tbnz	w0, #31, .L699
-.LBE1725:
-.LBE1724:
-.LBE1723:
-.LBB1726:
-.LBB1727:
-.LBB1728:
+	tbnz	w0, #31, .L712
+.LBE1787:
+.LBE1786:
+.LBE1785:
+.LBB1788:
+.LBB1789:
+.LBB1790:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC72
+	adrp	x1, .LC75
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 172
-	add	x1, x1, :lo12:.LC72
+	add	x1, x1, :lo12:.LC75
 	bl	of_property_read_variable_u32_array
-.LVL638:
+.LVL660:
 	.loc 12 501 0
-	tbz	w0, #31, .L725
-.LBE1728:
-.LBE1727:
-.LBE1726:
+	tbz	w0, #31, .L738
+.LBE1790:
+.LBE1789:
+.LBE1788:
 	.loc 1 2339 0
 	str	wzr, [x21, 148]
-.L725:
-.LBB1729:
-.LBB1730:
-.LBB1731:
+.L738:
+.LBB1791:
+.LBB1792:
+.LBB1793:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC35
+	adrp	x1, .LC36
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 176
-	add	x1, x1, :lo12:.LC35
+	add	x1, x1, :lo12:.LC36
 	bl	of_property_read_variable_u32_array
-.LVL639:
+.LVL661:
 	.loc 12 501 0
-	tbz	w0, #31, .L726
-.LBE1731:
-.LBE1730:
-.LBE1729:
+	tbz	w0, #31, .L739
+.LBE1793:
+.LBE1792:
+.LBE1791:
 	.loc 1 2342 0
 	str	wzr, [x21, 152]
-.L726:
-.LBB1732:
-.LBB1733:
-.LBB1734:
+.L739:
+.LBB1794:
+.LBB1795:
+.LBB1796:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC36
+	adrp	x1, .LC37
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 180
-	add	x1, x1, :lo12:.LC36
+	add	x1, x1, :lo12:.LC37
 	bl	of_property_read_variable_u32_array
-.LVL640:
+.LVL662:
 	.loc 12 501 0
-	tbz	w0, #31, .L727
-.LBE1734:
-.LBE1733:
-.LBE1732:
+	tbz	w0, #31, .L740
+.LBE1796:
+.LBE1795:
+.LBE1794:
 	.loc 1 2345 0
 	str	wzr, [x21, 156]
-.L727:
-.LBB1735:
-.LBB1736:
-.LBB1737:
+.L740:
+.LBB1797:
+.LBB1798:
+.LBB1799:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC37
+	adrp	x1, .LC38
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 116
-	add	x1, x1, :lo12:.LC37
+	add	x1, x1, :lo12:.LC38
 	bl	of_property_read_variable_u32_array
-.LVL641:
+.LVL663:
 	.loc 12 501 0
-	tbz	w0, #31, .L728
-.LBE1737:
-.LBE1736:
-.LBE1735:
+	tbz	w0, #31, .L741
+.LBE1799:
+.LBE1798:
+.LBE1797:
 	.loc 1 2348 0
 	str	wzr, [x21, 92]
-.L728:
-.LBB1738:
-.LBB1739:
-.LBB1740:
+.L741:
+.LBB1800:
+.LBB1801:
+.LBB1802:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC38
+	adrp	x1, .LC39
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 120
-	add	x1, x1, :lo12:.LC38
+	add	x1, x1, :lo12:.LC39
 	bl	of_property_read_variable_u32_array
-.LVL642:
+.LVL664:
 	.loc 12 501 0
-	tbz	w0, #31, .L729
-.LBE1740:
-.LBE1739:
-.LBE1738:
+	tbz	w0, #31, .L742
+.LBE1802:
+.LBE1801:
+.LBE1800:
 	.loc 1 2351 0
 	str	wzr, [x21, 96]
-.L729:
-.LBE1743:
-.LBE1746:
-	.loc 1 3080 0
+.L742:
+.LBE1805:
+.LBE1808:
+	.loc 1 3084 0
 	ldr	w0, [x21, 88]
-.LBB1747:
-.LBB1748:
-	.loc 1 2803 0
+.LBB1809:
+.LBB1810:
+	.loc 1 2807 0
 	mov	w2, 0
-.LBE1748:
-.LBE1747:
-	.loc 1 3080 0
+.LBE1810:
+.LBE1809:
+	.loc 1 3084 0
 	str	w0, [x19, 68]
-	.loc 1 3081 0
+	.loc 1 3085 0
 	ldr	w1, [x21, 84]
 	str	w1, [x19, 72]
-	.loc 1 3084 0
+	.loc 1 3088 0
 	tst	x1, 15
-	.loc 1 3082 0
+	.loc 1 3086 0
 	mul	w0, w0, w1
-	.loc 1 3084 0
+	.loc 1 3088 0
 	cset	w1, eq
 	str	w1, [x19, 88]
-.LBB1762:
-.LBB1757:
-	.loc 1 2803 0
-	adrp	x1, .LC39
-	add	x1, x1, :lo12:.LC39
-.LBE1757:
-.LBE1762:
-	.loc 1 3082 0
+.LBB1824:
+.LBB1819:
+	.loc 1 2807 0
+	adrp	x1, .LC40
+	add	x1, x1, :lo12:.LC40
+.LBE1819:
+.LBE1824:
+	.loc 1 3086 0
 	lsr	w3, w0, 1
-	.loc 1 3083 0
+	.loc 1 3087 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x19, 20]
-.LBB1763:
-.LBB1758:
-	.loc 1 2794 0
+.LBB1825:
+.LBB1820:
+	.loc 1 2798 0
 	ldr	x26, [x20]
-.LVL643:
-	.loc 1 2803 0
+.LVL665:
+	.loc 1 2807 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL644:
-	.loc 1 2804 0
-	cbz	x0, .L736
-	.loc 1 2807 0
+.LVL666:
+	.loc 1 2808 0
+	cbz	x0, .L749
+	.loc 1 2811 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL645:
+.LVL667:
 	mov	w25, w0
-	.loc 1 2809 0
-	cbnz	w0, .L775
-.LBB1749:
-.LBB1750:
+	.loc 1 2813 0
+	cbnz	w0, .L788
+.LBB1811:
+.LBB1812:
 	.file 13 "./include/linux/ioport.h"
 	.loc 13 204 0
 	ldp	x1, x2, [x29, 104]
-.LBE1750:
-.LBE1749:
-	.loc 1 2814 0
+.LBE1812:
+.LBE1811:
+	.loc 1 2818 0
 	str	x1, [x20, 184]
-	.loc 1 2817 0
+	.loc 1 2821 0
 	mov	x3, 1
 	mov	x0, x26
-.LBB1752:
-.LBB1751:
+.LBB1814:
+.LBB1813:
 	.loc 13 204 0
 	add	x2, x2, 1
 	sub	x2, x2, x1
-.LBE1751:
-.LBE1752:
-	.loc 1 2815 0
+.LBE1813:
+.LBE1814:
+	.loc 1 2819 0
 	str	w2, [x19, 16]
-	.loc 1 2817 0
+	.loc 1 2821 0
 	sxtw	x2, w2
 	bl	devm_memremap
-.LVL646:
+.LVL668:
 	str	x0, [x19, 8]
-	.loc 1 2819 0
-	cbz	x0, .L707
-	.loc 1 2827 0
+	.loc 1 2823 0
+	cbz	x0, .L720
+	.loc 1 2831 0
 	mov	x1, x0
 	ldr	w2, [x19, 16]
 	ldr	x0, [x20, 184]
 	mov	w4, 4
 	mov	w3, 4194304
 	bl	ebc_buf_init
-.LVL647:
-	.loc 1 2828 0
-	cbnz	w0, .L707
-	.loc 1 2833 0
+.LVL669:
+	.loc 1 2832 0
+	cbnz	w0, .L720
+	.loc 1 2837 0
 	ldr	x1, [x19, 8]
-	.loc 1 2834 0
+	.loc 1 2838 0
 	mov	x6, 1048576
-	.loc 1 2833 0
+	.loc 1 2837 0
 	mov	x3, 20971520
-	.loc 1 2834 0
+	.loc 1 2838 0
 	str	x6, [x21, 40]
-	.loc 1 2833 0
+	.loc 1 2837 0
 	add	x8, x1, x3
 	str	x8, [x21, 24]
 	mov	x7, 22020096
 	add	x5, x1, x7
-	.loc 1 2835 0
+	.loc 1 2839 0
 	ldr	x2, [x20, 184]
-	.loc 1 2840 0
+	.loc 1 2844 0
 	mov	x4, 23068672
 	add	x4, x1, x4
-.LBB1753:
-.LBB1754:
+.LBB1815:
+.LBB1816:
 	.loc 2 711 0
 	mov	x0, x26
-.LBE1754:
-.LBE1753:
-	.loc 1 2835 0
+.LBE1816:
+.LBE1815:
+	.loc 1 2839 0
 	add	x3, x2, x3
 	str	x3, [x21, 32]
-	.loc 1 2836 0
+	.loc 1 2840 0
 	str	x8, [x19, 184]
-	.loc 1 2835 0
+	.loc 1 2839 0
 	add	x2, x2, x7
-	.loc 1 2834 0
+	.loc 1 2838 0
 	str	x6, [x21, 64]
-	.loc 1 2835 0
+	.loc 1 2839 0
 	stp	x5, x2, [x21, 48]
-	.loc 1 2841 0
+	.loc 1 2845 0
 	mov	x2, 27262976
 	add	x2, x1, x2
 	stp	x4, x2, [x19, 144]
-	.loc 1 2842 0
+	.loc 1 2846 0
 	mov	x2, 31457280
 	add	x2, x1, x2
-	.loc 1 2836 0
+	.loc 1 2840 0
 	str	x5, [x19, 192]
-	.loc 1 2842 0
+	.loc 1 2846 0
 	str	x2, [x19, 160]
-	.loc 1 2843 0
+	.loc 1 2847 0
 	mov	x2, 35651584
 	add	x1, x1, x2
 	str	x1, [x19, 128]
-	.loc 1 2846 0
+	.loc 1 2850 0
 	ldp	w2, w1, [x21, 84]
-.LBB1756:
-.LBB1755:
+.LBB1818:
+.LBB1817:
 	.loc 2 711 0
 	mul	w1, w2, w1
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	bl	devm_kmalloc
-.LVL648:
-.LBE1755:
-.LBE1756:
-	.loc 1 2846 0
+.LVL670:
+.LBE1817:
+.LBE1818:
+	.loc 1 2850 0
 	str	x0, [x19, 168]
-	.loc 1 2847 0
-	cbz	x0, .L707
-	.loc 1 2849 0
+	.loc 1 2851 0
+	cbz	x0, .L720
+	.loc 1 2853 0
 	ldp	w2, w1, [x21, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
-.LVL649:
-	.loc 1 2850 0
+.LVL671:
+	.loc 1 2854 0
 	ldrsw	x2, [x19, 20]
 	mov	w1, 255
 	ldr	x0, [x19, 160]
 	bl	memset
-.LVL650:
-.LBE1758:
-.LBE1763:
-.LBB1764:
-.LBB1765:
-	.loc 1 2751 0
+.LVL672:
+.LBE1820:
+.LBE1825:
+.LBB1826:
+.LBB1827:
+	.loc 1 2755 0
 	ldr	x26, [x19, 104]
-.LVL651:
-	.loc 1 2757 0
-	adrp	x1, .LC41
+.LVL673:
+	.loc 1 2761 0
+	adrp	x1, .LC42
 	mov	w2, 0
-	add	x1, x1, :lo12:.LC41
+	add	x1, x1, :lo12:.LC42
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL652:
-	.loc 1 2758 0
-	cbz	x0, .L737
-	.loc 1 2761 0
+.LVL674:
+	.loc 1 2762 0
+	cbz	x0, .L750
+	.loc 1 2765 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL653:
+.LVL675:
 	mov	w25, w0
-	.loc 1 2763 0
-	cbz	w0, .L776
-.L708:
-.LBE1765:
-.LBE1764:
-	.loc 1 3096 0
-	adrp	x1, .LC74
+	.loc 1 2767 0
+	cbz	w0, .L789
+.L721:
+.LBE1827:
+.LBE1826:
+	.loc 1 3100 0
+	adrp	x1, .LC77
 	mov	x0, x22
-	add	x1, x1, :lo12:.LC74
+	add	x1, x1, :lo12:.LC77
 	bl	_dev_err
-.LVL654:
-	.loc 1 3097 0
-	b	.L685
-.LVL655:
+.LVL676:
+	.loc 1 3101 0
+	b	.L698
+.LVL677:
 	.p2align 3
-.L699:
-	.loc 1 3078 0
+.L712:
+	.loc 1 3082 0
 	mov	w25, -22
-	.loc 1 3077 0
-	adrp	x1, .LC80
+	.loc 1 3081 0
+	adrp	x1, .LC83
 	mov	w2, w25
-	add	x1, x1, :lo12:.LC80
+	add	x1, x1, :lo12:.LC83
 	mov	x0, x22
 	bl	_dev_err
-.LVL656:
-	.loc 1 3078 0
-	b	.L685
-.LVL657:
+.LVL678:
+	.loc 1 3082 0
+	b	.L698
+.LVL679:
 	.p2align 3
-.L772:
-	.loc 1 3051 0
-	adrp	x1, .LC31
+.L785:
+	.loc 1 3055 0
+	adrp	x1, .LC32
 	mov	x0, x22
-.LVL658:
-	add	x1, x1, :lo12:.LC31
-	.loc 1 3052 0
+.LVL680:
+	add	x1, x1, :lo12:.LC32
+	.loc 1 3056 0
 	mov	w25, -19
-	.loc 1 3051 0
+	.loc 1 3055 0
 	bl	_dev_err
-.LVL659:
-	.loc 1 3052 0
-	b	.L685
-.LVL660:
+.LVL681:
+	.loc 1 3056 0
+	b	.L698
+.LVL682:
 	.p2align 3
-.L697:
-	.loc 1 3063 0
-	adrp	x1, .LC33
+.L710:
+	.loc 1 3067 0
+	adrp	x1, .LC34
 	mov	x0, x22
-	add	x1, x1, :lo12:.LC33
-	.loc 1 3064 0
+	add	x1, x1, :lo12:.LC34
+	.loc 1 3068 0
 	mov	w25, -517
-	.loc 1 3063 0
+	.loc 1 3067 0
 	bl	_dev_err
-.LVL661:
-	.loc 1 3064 0
-	b	.L685
-.LVL662:
+.LVL683:
+	.loc 1 3068 0
+	b	.L698
+.LVL684:
 	.p2align 3
-.L775:
-.LBB1773:
-.LBB1759:
-	.loc 1 2810 0
-	adrp	x1, .LC40
+.L788:
+.LBB1835:
+.LBB1821:
+	.loc 1 2814 0
+	adrp	x1, .LC41
 	mov	x0, x26
-	add	x1, x1, :lo12:.LC40
+	add	x1, x1, :lo12:.LC41
 	bl	_dev_err
-.LVL663:
-.L704:
-.LBE1759:
-.LBE1773:
-	.loc 1 3089 0
-	adrp	x1, .LC73
+.LVL685:
+.L717:
+.LBE1821:
+.LBE1835:
+	.loc 1 3093 0
+	adrp	x1, .LC76
 	mov	x0, x22
-	add	x1, x1, :lo12:.LC73
+	add	x1, x1, :lo12:.LC76
 	bl	_dev_err
-.LVL664:
-	.loc 1 3090 0
-	b	.L685
-.LVL665:
-.L776:
-.LBB1774:
-.LBB1770:
-	.loc 1 2772 0
+.LVL686:
+	.loc 1 3094 0
+	b	.L698
+.LVL687:
+.L789:
+.LBB1836:
+.LBB1832:
+	.loc 1 2776 0
 	mov	x0, x26
 	mov	x3, 1
-.LBB1766:
-.LBB1767:
+.LBB1828:
+.LBB1829:
 	.loc 13 204 0
 	ldp	x1, x26, [x29, 104]
-.LVL666:
-.LBE1767:
-.LBE1766:
-	.loc 1 2769 0
+.LVL688:
+.LBE1829:
+.LBE1828:
+	.loc 1 2773 0
 	str	x1, [x19, 32]
-.LBB1769:
-.LBB1768:
+.LBB1831:
+.LBB1830:
 	.loc 13 204 0
 	add	x26, x26, 1
 	sub	x26, x26, x1
-.LBE1768:
-.LBE1769:
-	.loc 1 2770 0
+.LBE1830:
+.LBE1831:
+	.loc 1 2774 0
 	str	w26, [x19, 40]
-	.loc 1 2772 0
+	.loc 1 2776 0
 	sxtw	x2, w26
 	bl	devm_memremap
-.LVL667:
+.LVL689:
 	str	x0, [x19, 208]
-	.loc 1 2774 0
-	cbz	x0, .L777
-	.loc 1 2779 0
+	.loc 1 2778 0
+	cbz	x0, .L790
+	.loc 1 2783 0
 	bl	epd_lut_from_mem_init
-.LVL668:
-	.loc 1 2780 0
-	tbnz	w0, #31, .L778
-.L710:
-.LBE1770:
-.LBE1774:
-.LBB1775:
-.LBB1776:
-	.loc 1 2859 0
+.LVL690:
+	.loc 1 2784 0
+	tbnz	w0, #31, .L791
+.L723:
+.LBE1832:
+.LBE1836:
+.LBB1837:
+.LBB1838:
+	.loc 1 2863 0
 	add	x0, x20, 752
 	mov	x1, 68719476704
 	str	x1, [x19, 560]
-	.loc 1 2863 0
+	.loc 1 2867 0
 	add	x24, x24, :lo12:.LANCHOR0
-.LBB1777:
-.LBB1778:
-.LBB1779:
-.LBB1780:
-.LBB1781:
+.LBB1839:
+.LBB1840:
+.LBB1841:
+.LBB1842:
+.LBB1843:
 	.file 14 "./include/linux/compiler.h"
 	.loc 14 288 0
 	str	x0, [x20, 752]
-.LBE1781:
-.LBE1780:
-.LBE1779:
-.LBE1778:
-.LBE1777:
-	.loc 1 2860 0
-	adrp	x5, .LC75
-.LBB1783:
-.LBB1782:
+.LBE1843:
+.LBE1842:
+.LBE1841:
+.LBE1840:
+.LBE1839:
+	.loc 1 2864 0
+	adrp	x5, .LC78
+.LBB1845:
+.LBB1844:
 	.file 15 "./include/linux/list.h"
 	.loc 15 29 0
 	str	x0, [x0, 8]
-.LBE1782:
-.LBE1783:
-	.loc 1 2859 0
+.LBE1844:
+.LBE1845:
+	.loc 1 2863 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x19, 584]
-	.loc 1 2860 0
-	add	x5, x5, :lo12:.LC75
+	.loc 1 2864 0
+	add	x5, x5, :lo12:.LC78
 	mov	w1, 14
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 1
 	movk	w1, 0xa, lsl 16
-	.loc 1 2857 0
+	.loc 1 2861 0
 	mov	w26, 99
-	.loc 1 2860 0
-	adrp	x0, .LC76
-	.loc 1 2857 0
+	.loc 1 2864 0
+	adrp	x0, .LC79
+	.loc 1 2861 0
 	str	w26, [x29, 104]
-	.loc 1 2860 0
-	add	x0, x0, :lo12:.LC76
+	.loc 1 2864 0
+	add	x0, x0, :lo12:.LC79
 	bl	__alloc_workqueue_key
-.LVL669:
+.LVL691:
 	str	x0, [x19, 608]
-	.loc 1 2863 0
-	adrp	x3, .LC77
+	.loc 1 2867 0
+	adrp	x3, .LC80
 	mov	w2, -1
-	add	x3, x3, :lo12:.LC77
+	add	x3, x3, :lo12:.LC80
 	mov	x1, x19
 	adrp	x0, ebc_auto_tast_function
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
-.LVL670:
+.LVL692:
 	str	x0, [x24, 8]
-	.loc 1 2864 0
-	cmn	x0, #4096
-	bhi	.L779
 	.loc 1 2868 0
+	cmn	x0, #4096
+	bhi	.L792
+	.loc 1 2872 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
-.LVL671:
-	.loc 1 2869 0
+.LVL693:
+	.loc 1 2873 0
 	ldr	x2, [x24, 8]
-.LBB1784:
-.LBB1785:
+.LBB1846:
+.LBB1847:
 	.file 16 "./arch/arm64/include/asm/atomic_lse.h"
 	.loc 16 47 0
 	mov	w0, 1
-.LVL672:
+.LVL694:
 	add	x1, x2, 48
-.LVL673:
+.LVL695:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -8331,49 +8507,49 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL674:
+.LVL696:
 #NO_APP
-.LBE1785:
-.LBE1784:
-.LBB1786:
-	.loc 1 2872 0
-	adrp	x3, .LC46
+.LBE1847:
+.LBE1846:
+.LBB1848:
+	.loc 1 2876 0
+	adrp	x3, .LC47
 	adrp	x0, ebc_thread
-.LVL675:
-	add	x3, x3, :lo12:.LC46
+.LVL697:
+	add	x3, x3, :lo12:.LC47
 	mov	w2, -1
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x19
-.LBE1786:
-	.loc 1 2871 0
+.LBE1848:
+	.loc 1 2875 0
 	str	w26, [x29, 104]
-.LBB1787:
-	.loc 1 2872 0
+.LBB1849:
+	.loc 1 2876 0
 	bl	kthread_create_on_node
-.LVL676:
+.LVL698:
 	mov	x24, x0
-.LVL677:
+.LVL699:
 	cmn	x0, #4096
-	bhi	.L712
+	bhi	.L725
 	bl	wake_up_process
-.LVL678:
-.LBE1787:
+.LVL700:
+.LBE1849:
 	str	x24, [x19, 136]
-	.loc 1 2877 0
+	.loc 1 2881 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x24
 	bl	sched_setscheduler_nocheck
-.LVL679:
-	.loc 1 2878 0
+.LVL701:
+	.loc 1 2882 0
 	ldr	x2, [x19, 136]
-.LBB1788:
-.LBB1789:
+.LBB1850:
+.LBB1851:
 	.loc 16 47 0
 	mov	w0, 1
-.LVL680:
+.LVL702:
 	add	x1, x2, 48
-.LVL681:
+.LVL703:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -8401,62 +8577,62 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL682:
+.LVL704:
 #NO_APP
-.LBE1789:
-.LBE1788:
-.LBE1776:
-.LBE1775:
-.LBB1792:
-.LBB1793:
-	.loc 1 2887 0
+.LBE1851:
+.LBE1850:
+.LBE1838:
+.LBE1837:
+.LBB1854:
+.LBB1855:
+	.loc 1 2891 0
 	mov	w0, -1
-.LVL683:
+.LVL705:
 	str	w0, [x19, 64]
-.LBB1794:
-.LBB1795:
+.LBB1856:
+.LBB1857:
 	.loc 4 39 0
 	add	x0, x20, 416
-.LVL684:
-.LBE1795:
-.LBE1794:
-	.loc 1 2891 0
+.LVL706:
+.LBE1857:
+.LBE1856:
+	.loc 1 2895 0
 	str	wzr, [x19, 44]
-	.loc 1 2890 0
+	.loc 1 2894 0
 	str	wzr, [x19, 96]
-.LBB1800:
-.LBB1796:
+.LBB1862:
+.LBB1858:
 	.loc 4 43 0
-	adrp	x1, .LC47
-.LBE1796:
-.LBE1800:
-	.loc 1 2886 0
+	adrp	x1, .LC48
+.LBE1858:
+.LBE1862:
+	.loc 1 2890 0
 	str	wzr, [x19, 200]
-.LBB1801:
-.LBB1797:
+.LBB1863:
+.LBB1859:
 	.loc 4 43 0
-	add	x1, x1, :lo12:.LC47
-.LBE1797:
-.LBE1801:
-	.loc 1 2888 0
+	add	x1, x1, :lo12:.LC48
+.LBE1859:
+.LBE1863:
+	.loc 1 2892 0
 	str	wzr, [x19, 616]
-	.loc 1 2898 0
+	.loc 1 2902 0
 	add	x24, x20, 632
-.LVL685:
-	.loc 1 2889 0
+.LVL707:
+	.loc 1 2893 0
 	str	wzr, [x19, 620]
-	.loc 1 2899 0
+	.loc 1 2903 0
 	adrp	x26, jiffies
-.LBB1802:
-.LBB1798:
+.LBB1864:
+.LBB1860:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0]
-.LBE1798:
-.LBE1802:
-	.loc 1 2899 0
+.LBE1860:
+.LBE1864:
+	.loc 1 2903 0
 	mov	x27, 268435455
-.LBB1803:
-.LBB1799:
+.LBB1865:
+.LBB1861:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0, 16]
 	stp	xzr, xzr, [x0, 32]
@@ -8474,12 +8650,12 @@ ebc_probe:
 	str	x1, [x20, 416]
 	.loc 4 45 0
 	bl	wakeup_source_add
-.LVL686:
-.LBE1799:
-.LBE1803:
-	.loc 1 2895 0
+.LVL708:
+.LBE1861:
+.LBE1865:
+	.loc 1 2899 0
 	str	wzr, [x19, 440]
-	.loc 1 2898 0
+	.loc 1 2902 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -8487,17 +8663,17 @@ ebc_probe:
 	adrp	x1, ebc_vdd_power_timeout
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
-.LVL687:
-	.loc 1 2899 0
+.LVL709:
+	.loc 1 2903 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
-	.loc 1 2902 0
+	.loc 1 2906 0
 	add	x24, x20, 688
-	.loc 1 2899 0
+	.loc 1 2903 0
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL688:
-	.loc 1 2902 0
+.LVL710:
+	.loc 1 2906 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -8505,109 +8681,111 @@ ebc_probe:
 	adrp	x1, ebc_frame_timeout
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
-.LVL689:
-	.loc 1 2903 0
+.LVL711:
+	.loc 1 2907 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL690:
-.LBE1793:
-.LBE1792:
-.LBB1804:
-.LBB1805:
-	.loc 1 2913 0
+.LVL712:
+.LBE1855:
+.LBE1854:
+.LBB1866:
+.LBB1867:
+	.loc 1 2917 0
 	adrp	x0, saved_command_line
-	adrp	x1, .LC48
-	.loc 1 2910 0
+	adrp	x1, .LC49
+	.loc 1 2914 0
 	stp	wzr, wzr, [x29, 100]
-.LVL691:
-	.loc 1 2913 0
-	add	x1, x1, :lo12:.LC48
+.LVL713:
+	.loc 1 2917 0
+	add	x1, x1, :lo12:.LC49
 	ldr	x24, [x0, #:lo12:saved_command_line]
 	mov	x0, x24
 	bl	strstr
-.LVL692:
-	.loc 1 2914 0
-	adrp	x1, .LC49
-	.loc 1 2913 0
+.LVL714:
+	.loc 1 2918 0
+	adrp	x1, .LC50
+	.loc 1 2917 0
 	mov	x26, x0
-.LVL693:
-	.loc 1 2914 0
-	add	x1, x1, :lo12:.LC49
+.LVL715:
+	.loc 1 2918 0
+	add	x1, x1, :lo12:.LC50
 	mov	x0, x24
 	bl	strstr
-.LVL694:
+.LVL716:
 	mov	x28, x0
-.LVL695:
-	.loc 1 2919 0
-	cbz	x26, .L713
-	.loc 1 2920 0
+.LVL717:
+	.loc 1 2923 0
+	cbz	x26, .L726
+	.loc 1 2924 0
 	add	x2, x29, 100
-	adrp	x1, .LC50
+	adrp	x1, .LC51
 	mov	x0, x26
-	add	x1, x1, :lo12:.LC50
+	add	x1, x1, :lo12:.LC51
 	bl	sscanf
-.LVL696:
-	.loc 1 2921 0
+.LVL718:
+	.loc 1 2925 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
-	bls	.L780
-.L713:
-	.loc 1 2933 0
+	bls	.L793
+.L726:
+	.loc 1 2937 0
 	mov	w24, 0
-.LVL697:
+.LVL719:
 	mov	x27, 0
-.LVL698:
-	.loc 1 2917 0
+.LVL720:
+	.loc 1 2921 0
 	mov	x26, 0
-.LVL699:
-	.loc 1 2933 0
-	cbz	x28, .L733
-.LVL700:
-.L732:
-	.loc 1 2934 0
+.LVL721:
+	.loc 1 2937 0
+	cbz	x28, .L746
+.LVL722:
+.L745:
+	.loc 1 2938 0
 	add	x2, x29, 104
 	mov	x0, x28
-	adrp	x1, .LC53
-	add	x1, x1, :lo12:.LC53
+	adrp	x1, .LC54
+	add	x1, x1, :lo12:.LC54
 	bl	sscanf
-.LVL701:
-	.loc 1 2912 0
+.LVL723:
+	.loc 1 2916 0
 	mov	w28, 0
-.LVL702:
-	.loc 1 2935 0
+.LVL724:
+	.loc 1 2939 0
 	ldr	w2, [x29, 104]
-	.loc 1 2917 0
+	.loc 1 2921 0
 	mov	x26, 0
-.LVL703:
-	.loc 1 2935 0
+.LVL725:
+	.loc 1 2939 0
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
-	bls	.L781
-.L717:
-	.loc 1 2947 0
-	cbnz	w24, .L716
-.LVL704:
-.L733:
-	.loc 1 2948 0
+	bls	.L794
+.L730:
+	.loc 1 2951 0
+	cbnz	w24, .L729
+.LVL726:
+.L746:
+	.loc 1 2952 0
 	ldr	x0, [x19, 104]
-	adrp	x1, .LC56
-	add	x1, x1, :lo12:.LC56
+	adrp	x1, .LC57
+	add	x1, x1, :lo12:.LC57
 	bl	_dev_info
-.LVL705:
-	.loc 1 2949 0
+.LVL727:
+	.loc 1 2953 0
 	ldr	x0, [x20, 16]
 	bl	ebc_pmic_verity_vcom
-.LVL706:
-.LBB1806:
-.LBB1807:
+.LVL728:
+.LBB1868:
+.LBB1869:
 	.loc 1 2258 0
+	adrp	x0, .LC58
+	add	x0, x0, :lo12:.LC58
 	bl	ebc_empty_buf_get
-.LVL707:
+.LVL729:
 	mov	x24, x0
-.LVL708:
+.LVL730:
 	.loc 1 2259 0
 	ldp	w2, w0, [x20, 108]
 	mov	w1, 255
@@ -8615,7 +8793,7 @@ ebc_probe:
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memset
-.LVL709:
+.LVL731:
 	.loc 1 2262 0
 	stp	wzr, wzr, [x24, 48]
 	.loc 1 2260 0
@@ -8634,472 +8812,476 @@ ebc_probe:
 	stp	w1, w2, [x24, 60]
 	.loc 1 2266 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL710:
-.L719:
-.LBE1807:
-.LBE1806:
-	.loc 1 2967 0
-	cbnz	w28, .L782
-.L721:
-	.loc 1 2981 0
+.LVL732:
+.L732:
+.LBE1869:
+.LBE1868:
+	.loc 1 2971 0
+	cbnz	w28, .L795
+.L734:
+	.loc 1 2985 0
 	ldr	w0, [x19, 96]
 	adrp	x21, .LANCHOR1
-	cbz	w0, .L783
-.L723:
-	.loc 1 2986 0
-	cbz	x27, .L724
-	.loc 1 2987 0
+	cbz	w0, .L796
+.L736:
+	.loc 1 2990 0
+	cbz	x27, .L737
+	.loc 1 2991 0
 	mov	x0, x27
 	bl	kfree
-.LVL711:
-.L724:
-	.loc 1 2988 0
-	cbz	x26, .L715
-	.loc 1 2989 0
+.LVL733:
+.L737:
+	.loc 1 2992 0
+	cbz	x26, .L728
+	.loc 1 2993 0
 	mov	x0, x26
 	bl	kfree
-.LVL712:
-.L715:
-.LBE1805:
-.LBE1804:
-.LBB1817:
-.LBB1818:
-.LBB1819:
+.LVL734:
+.L728:
+.LBE1867:
+.LBE1866:
+.LBB1879:
+.LBB1880:
+.LBB1881:
 	.loc 2 1186 0
 	str	x20, [x22, 184]
-.LBE1819:
-.LBE1818:
-.LBE1817:
-.LBB1820:
-.LBB1821:
-	.loc 1 2734 0
+.LBE1881:
+.LBE1880:
+.LBE1879:
+.LBB1882:
+.LBB1883:
+	.loc 1 2738 0
 	add	x21, x21, :lo12:.LANCHOR1
 	add	x0, x21, 224
 	bl	misc_register
-.LVL713:
-	.loc 1 2735 0
+.LVL735:
+	.loc 1 2739 0
 	add	x0, x21, 376
 	bl	misc_register
-.LVL714:
-	.loc 1 2737 0
+.LVL736:
+	.loc 1 2741 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 456
 	bl	device_create_file
-.LVL715:
-	.loc 1 2738 0
+.LVL737:
+	.loc 1 2742 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 488
 	bl	device_create_file
-.LVL716:
-	.loc 1 2739 0
+.LVL738:
+	.loc 1 2743 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 520
 	bl	device_create_file
-.LVL717:
-	.loc 1 2740 0
+.LVL739:
+	.loc 1 2744 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 552
 	bl	device_create_file
-.LVL718:
-	.loc 1 2741 0
+.LVL740:
+	.loc 1 2745 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 584
 	bl	device_create_file
-.LVL719:
-	.loc 1 2742 0
+.LVL741:
+	.loc 1 2746 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 616
 	bl	device_create_file
-.LVL720:
-	.loc 1 2743 0
+.LVL742:
+	.loc 1 2747 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 648
 	bl	device_create_file
-.LVL721:
-.LBE1821:
-.LBE1820:
-	.loc 1 3118 0
+.LVL743:
+.LBE1883:
+.LBE1882:
+	.loc 1 3122 0
 	ldr	x0, [x19, 104]
-	adrp	x2, .LC16
-	adrp	x1, .LC57
-	add	x2, x2, :lo12:.LC16
-	add	x1, x1, :lo12:.LC57
+	adrp	x2, .LC17
+	adrp	x1, .LC60
+	add	x2, x2, :lo12:.LC17
+	add	x1, x1, :lo12:.LC60
 	bl	_dev_info
-.LVL722:
-	.loc 1 3120 0
-	b	.L685
-.LVL723:
-.L783:
-.LBB1822:
-.LBB1814:
-	.loc 1 2982 0
+.LVL744:
+	.loc 1 3124 0
+	b	.L698
+.LVL745:
+.L796:
+.LBB1884:
+.LBB1876:
+	.loc 1 2986 0
 	mov	w2, 1
 	str	w2, [x19, 96]
-	.loc 1 2983 0
+	.loc 1 2987 0
 	add	x0, x21, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL724:
-	b	.L723
-.LVL725:
-.L780:
-	.loc 1 2923 0
+.LVL746:
+	b	.L736
+.LVL747:
+.L793:
+	.loc 1 2927 0
 	ldr	x0, [x19, 104]
-	adrp	x1, .LC51
-	add	x1, x1, :lo12:.LC51
+	adrp	x1, .LC52
+	add	x1, x1, :lo12:.LC52
 	bl	_dev_info
-.LVL726:
-	.loc 1 2924 0
+.LVL748:
+	.loc 1 2928 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
-.LBB1808:
-.LBB1809:
-.LBB1810:
+.LBB1870:
+.LBB1871:
+.LBB1872:
 	.file 17 "./include/linux/slab.h"
 	.loc 17 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL727:
+.LVL749:
 	mov	x27, x0
-.LVL728:
-.LBE1810:
-.LBE1809:
-.LBE1808:
-	.loc 1 2925 0
-	cbz	x0, .L784
+.LVL750:
+.LBE1872:
+.LBE1871:
+.LBE1870:
 	.loc 1 2929 0
+	cbz	x0, .L797
+	.loc 1 2933 0
 	ldp	w2, w1, [x21, 84]
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 100]
-.LVL729:
+.LVL751:
 	sub	x1, x1, x3
-.LVL730:
+.LVL752:
 	ldr	x3, [x19, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL731:
-	.loc 1 2933 0
-	cbnz	x28, .L785
-	.loc 1 2912 0
+.LVL753:
+	.loc 1 2937 0
+	cbnz	x28, .L798
+	.loc 1 2916 0
 	mov	w28, 0
-.LVL732:
-	.loc 1 2917 0
+.LVL754:
+	.loc 1 2921 0
 	mov	x26, 0
-.LVL733:
-.L716:
-	.loc 1 2954 0
+.LVL755:
+.L729:
+	.loc 1 2958 0
+	adrp	x0, .LC59
+	add	x0, x0, :lo12:.LC59
 	bl	ebc_empty_buf_get
-.LVL734:
+.LVL756:
 	mov	x24, x0
-.LVL735:
-	.loc 1 2955 0
-	cbz	x0, .L719
-	.loc 1 2956 0
+.LVL757:
+	.loc 1 2959 0
+	cbz	x0, .L732
+	.loc 1 2960 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL736:
-	.loc 1 2959 0
+.LVL758:
+	.loc 1 2963 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2957 0
+	.loc 1 2961 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2962 0
+	.loc 1 2966 0
 	mov	w2, 16
-	.loc 1 2963 0
+	.loc 1 2967 0
 	mov	x0, x24
-	.loc 1 2960 0
+	.loc 1 2964 0
 	ldr	w1, [x21, 84]
 	str	w1, [x24, 56]
-	.loc 1 2961 0
+	.loc 1 2965 0
 	ldr	w1, [x21, 88]
-	.loc 1 2962 0
+	.loc 1 2966 0
 	stp	w1, w2, [x24, 60]
-	.loc 1 2963 0
+	.loc 1 2967 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL737:
-	b	.L719
-.LVL738:
-.L781:
-	.loc 1 2937 0
+.LVL759:
+	b	.L732
+.LVL760:
+.L794:
+	.loc 1 2941 0
 	ldr	x0, [x19, 104]
-	adrp	x1, .LC54
-	add	x1, x1, :lo12:.LC54
+	adrp	x1, .LC55
+	add	x1, x1, :lo12:.LC55
 	bl	_dev_info
-.LVL739:
-	.loc 1 2938 0
+.LVL761:
+	.loc 1 2942 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
-.LBB1811:
-.LBB1812:
-.LBB1813:
+.LBB1873:
+.LBB1874:
+.LBB1875:
 	.loc 17 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL740:
+.LVL762:
 	mov	x26, x0
-.LBE1813:
-.LBE1812:
-.LBE1811:
-	.loc 1 2939 0
-	cbz	x0, .L786
+.LBE1875:
+.LBE1874:
+.LBE1873:
 	.loc 1 2943 0
+	cbz	x0, .L799
+	.loc 1 2947 0
 	ldp	w2, w1, [x21, 84]
-	.loc 1 2936 0
+	.loc 1 2940 0
 	mov	w28, 1
-	.loc 1 2943 0
+	.loc 1 2947 0
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
-.LVL741:
+.LVL763:
 	sub	x1, x1, x3
-.LVL742:
+.LVL764:
 	ldr	x3, [x19, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL743:
-	b	.L717
-.LVL744:
-.L689:
-.LBE1814:
-.LBE1822:
-	.loc 1 3026 0
+.LVL765:
+	b	.L730
+.LVL766:
+.L702:
+.LBE1876:
+.LBE1884:
+	.loc 1 3030 0
 	mov	w25, -517
-	b	.L685
-.LVL745:
-.L782:
-.LBB1823:
-.LBB1815:
-	.loc 1 2968 0
+	b	.L698
+.LVL767:
+.L795:
+.LBB1885:
+.LBB1877:
+	.loc 1 2972 0
+	adrp	x0, .LC59
+	add	x0, x0, :lo12:.LC59
 	bl	ebc_empty_buf_get
-.LVL746:
+.LVL768:
 	mov	x24, x0
-.LVL747:
-	.loc 1 2969 0
-	cbz	x0, .L721
-	.loc 1 2970 0
+.LVL769:
+	.loc 1 2973 0
+	cbz	x0, .L734
+	.loc 1 2974 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL748:
-	.loc 1 2973 0
+.LVL770:
+	.loc 1 2977 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2971 0
+	.loc 1 2975 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2976 0
+	.loc 1 2980 0
 	mov	w1, 16
-	.loc 1 2974 0
+	.loc 1 2978 0
 	ldr	w0, [x21, 84]
 	str	w0, [x24, 56]
-	.loc 1 2975 0
+	.loc 1 2979 0
 	ldr	w0, [x21, 88]
-	.loc 1 2976 0
+	.loc 1 2980 0
 	stp	w0, w1, [x24, 60]
-	.loc 1 2977 0
+	.loc 1 2981 0
 	mov	x0, x24
 	bl	ebc_add_to_dsp_buf_list
-.LVL749:
-	b	.L721
-.LVL750:
-.L735:
-.LBE1815:
-.LBE1823:
-	.loc 1 3012 0
+.LVL771:
+	b	.L734
+.LVL772:
+.L748:
+.LBE1877:
+.LBE1885:
+	.loc 1 3016 0
 	mov	w25, -12
-	b	.L685
-.LVL751:
-.L690:
-	.loc 1 3036 0
-	adrp	x1, .LC29
+	b	.L698
+.LVL773:
+.L703:
+	.loc 1 3040 0
+	adrp	x1, .LC30
 	mov	x0, x22
-	add	x1, x1, :lo12:.LC29
-	.loc 1 3037 0
+	add	x1, x1, :lo12:.LC30
+	.loc 1 3041 0
 	mov	w25, -22
-	.loc 1 3036 0
+	.loc 1 3040 0
 	bl	_dev_err
-.LVL752:
-	.loc 1 3037 0
-	b	.L685
-.LVL753:
-.L778:
-.LBB1824:
-.LBB1771:
-	.loc 1 2781 0
+.LVL774:
+	.loc 1 3041 0
+	b	.L698
+.LVL775:
+.L791:
+.LBB1886:
+.LBB1833:
+	.loc 1 2785 0
 	ldr	x0, [x19, 104]
-	adrp	x1, .LC43
-	add	x1, x1, :lo12:.LC43
+	adrp	x1, .LC44
+	add	x1, x1, :lo12:.LC44
 	bl	_dev_err
-.LVL754:
-	.loc 1 2782 0
+.LVL776:
+	.loc 1 2786 0
 	ldr	x0, [x19, 104]
 	mov	w2, w26
 	ldr	x1, [x19, 208]
 	bl	epd_lut_from_file_init
-.LVL755:
-	.loc 1 2783 0
-	tbz	w0, #31, .L710
-	.loc 1 2784 0
+.LVL777:
+	.loc 1 2787 0
+	tbz	w0, #31, .L723
+	.loc 1 2788 0
 	ldr	x0, [x19, 104]
-	adrp	x1, .LC44
-	.loc 1 2785 0
+	adrp	x1, .LC45
+	.loc 1 2789 0
 	mov	w25, -1
-	.loc 1 2784 0
-	add	x1, x1, :lo12:.LC44
+	.loc 1 2788 0
+	add	x1, x1, :lo12:.LC45
 	bl	_dev_err
-.LVL756:
-	b	.L708
-.LVL757:
+.LVL778:
+	b	.L721
+.LVL779:
 	.p2align 3
-.L707:
-.LBE1771:
-.LBE1824:
-.LBB1825:
-.LBB1760:
-	.loc 1 2820 0
+.L720:
+.LBE1833:
+.LBE1886:
+.LBB1887:
+.LBB1822:
+	.loc 1 2824 0
 	mov	w25, -12
-	b	.L704
-.LVL758:
-.L779:
-.LBE1760:
-.LBE1825:
-.LBB1826:
-.LBB1790:
-	.loc 1 2865 0
+	b	.L717
+.LVL780:
+.L792:
+.LBE1822:
+.LBE1887:
+.LBB1888:
+.LBB1852:
+	.loc 1 2869 0
 	ldr	x0, [x19, 104]
-	adrp	x1, .LC45
-	add	x1, x1, :lo12:.LC45
+	adrp	x1, .LC46
+	add	x1, x1, :lo12:.LC46
 	bl	_dev_err
-.LVL759:
-.L711:
-.LBE1790:
-.LBE1826:
-	.loc 1 3103 0
-	adrp	x1, .LC79
+.LVL781:
+.L724:
+.LBE1852:
+.LBE1888:
+	.loc 1 3107 0
+	adrp	x1, .LC82
 	mov	x0, x22
-	add	x1, x1, :lo12:.LC79
-	.loc 1 3104 0
+	add	x1, x1, :lo12:.LC82
+	.loc 1 3108 0
 	mov	w25, -1
-	.loc 1 3103 0
+	.loc 1 3107 0
 	bl	_dev_err
-.LVL760:
-	.loc 1 3104 0
-	b	.L685
-.LVL761:
-.L712:
-.LBB1827:
-.LBB1791:
-	.loc 1 2874 0
+.LVL782:
+	.loc 1 3108 0
+	b	.L698
+.LVL783:
+.L725:
+.LBB1889:
+.LBB1853:
+	.loc 1 2878 0
 	ldr	x0, [x19, 104]
-.LVL762:
-	adrp	x1, .LC78
-	.loc 1 2872 0
+.LVL784:
+	adrp	x1, .LC81
+	.loc 1 2876 0
 	str	x24, [x19, 136]
-	.loc 1 2874 0
-	add	x1, x1, :lo12:.LC78
+	.loc 1 2878 0
+	add	x1, x1, :lo12:.LC81
 	bl	_dev_err
-.LVL763:
-	b	.L711
-.LVL764:
-.L771:
-.LBE1791:
-.LBE1827:
-	.loc 1 3019 0
-	adrp	x1, .LC27
+.LVL785:
+	b	.L724
+.LVL786:
+.L784:
+.LBE1853:
+.LBE1889:
+	.loc 1 3023 0
+	adrp	x1, .LC28
 	mov	x0, x22
-	add	x1, x1, :lo12:.LC27
-	.loc 1 3020 0
+	add	x1, x1, :lo12:.LC28
+	.loc 1 3024 0
 	mov	w25, -19
-	.loc 1 3019 0
+	.loc 1 3023 0
 	bl	_dev_err
-.LVL765:
-	.loc 1 3020 0
-	b	.L685
-.LVL766:
-.L736:
-.LBB1828:
-.LBB1761:
-	.loc 1 2805 0
+.LVL787:
+	.loc 1 3024 0
+	b	.L698
+.LVL788:
+.L749:
+.LBB1890:
+.LBB1823:
+	.loc 1 2809 0
 	mov	w25, -19
-	b	.L704
-.LVL767:
-.L737:
-.LBE1761:
-.LBE1828:
-.LBB1829:
-.LBB1772:
-	.loc 1 2759 0
+	b	.L717
+.LVL789:
+.L750:
+.LBE1823:
+.LBE1890:
+.LBB1891:
+.LBB1834:
+	.loc 1 2763 0
 	mov	w25, -19
-	b	.L708
-.LVL768:
-.L777:
-	.loc 1 2775 0
+	b	.L721
+.LVL790:
+.L790:
+	.loc 1 2779 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
-	adrp	x1, .LC42
-	mov	w3, 2775
+	adrp	x1, .LC43
+	mov	w3, 2779
 	add	x2, x2, 32
-	add	x1, x1, :lo12:.LC42
-	.loc 1 2776 0
+	add	x1, x1, :lo12:.LC43
+	.loc 1 2780 0
 	mov	w25, -12
-	.loc 1 2775 0
+	.loc 1 2779 0
 	bl	_dev_err
-.LVL769:
-	b	.L708
-.LVL770:
-.L785:
-.LBE1772:
-.LBE1829:
-.LBB1830:
-.LBB1816:
-	.loc 1 2922 0
-	mov	w24, 1
-.LVL771:
-	b	.L732
-.LVL772:
-.L784:
+.LVL791:
+	b	.L721
+.LVL792:
+.L798:
+.LBE1834:
+.LBE1891:
+.LBB1892:
+.LBB1878:
 	.loc 1 2926 0
+	mov	w24, 1
+.LVL793:
+	b	.L745
+.LVL794:
+.L797:
+	.loc 1 2930 0
 	ldr	x0, [x19, 104]
-.LVL773:
-	adrp	x1, .LC52
+.LVL795:
+	adrp	x1, .LC53
 	adrp	x21, .LANCHOR1
-	add	x1, x1, :lo12:.LC52
+	add	x1, x1, :lo12:.LC53
 	bl	_dev_err
-.LVL774:
-	b	.L715
-.LVL775:
-.L786:
-	.loc 1 2940 0
+.LVL796:
+	b	.L728
+.LVL797:
+.L799:
+	.loc 1 2944 0
 	ldr	x0, [x19, 104]
-.LVL776:
-	adrp	x1, .LC55
+.LVL798:
+	adrp	x1, .LC56
 	adrp	x21, .LANCHOR1
-	add	x1, x1, :lo12:.LC55
+	add	x1, x1, :lo12:.LC56
 	bl	_dev_err
-.LVL777:
-	b	.L715
-.LVL778:
-.L774:
-.LBE1816:
-.LBE1830:
-	.loc 1 3121 0
+.LVL799:
+	b	.L728
+.LVL800:
+.L787:
+.LBE1878:
+.LBE1892:
+	.loc 1 3125 0
 	bl	__stack_chk_fail
-.LVL779:
+.LVL801:
 	.cfi_endproc
 .LFE2862:
 	.size	ebc_probe, .-ebc_probe
@@ -9110,7 +9292,7 @@ ebc_power_set.constprop.17:
 .LFB2887:
 	.loc 1 183 0
 	.cfi_startproc
-.LVL780:
+.LVL802:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -9126,45 +9308,45 @@ ebc_power_set.constprop.17:
 	mov	x19, x0
 	.loc 1 189 0
 	ldr	w0, [x20, 440]
-.LVL781:
-	cbz	w0, .L790
-.L788:
+.LVL803:
+	cbz	w0, .L803
+.L801:
 	.loc 1 193 0
 	mov	w1, 1
 	str	w1, [x20, 200]
 	.loc 1 194 0
 	ldr	x2, [x19, 16]
-.LBB1831:
-.LBB1832:
+.LBB1893:
+.LBB1894:
 	.loc 3 30 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL782:
-.LBE1832:
-.LBE1831:
+.LVL804:
+.LBE1894:
+.LBE1893:
 	.loc 1 195 0
 	ldr	x2, [x19, 8]
-.LBB1833:
-.LBB1834:
+.LBB1895:
+.LBB1896:
 	.loc 11 46 0
 	add	x1, x19, 24
 	mov	x0, x2
 	ldr	x2, [x2, 48]
 	blr	x2
-.LVL783:
-.LBE1834:
-.LBE1833:
+.LVL805:
+.LBE1896:
+.LBE1895:
 	.loc 1 196 0
 	ldr	x0, [x19]
-	adrp	x1, .LC81
-	add	x1, x1, :lo12:.LC81
+	adrp	x1, .LC84
+	add	x1, x1, :lo12:.LC84
 	bl	_dev_info
-.LVL784:
+.LVL806:
 	.loc 1 211 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
-.LVL785:
+.LVL807:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -9173,22 +9355,22 @@ ebc_power_set.constprop.17:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL786:
+.LVL808:
 	.p2align 3
-.L790:
+.L803:
 	.cfi_restore_state
 	.loc 1 190 0
 	mov	w0, 1
 	str	w0, [x20, 440]
-.LBB1835:
-.LBB1836:
+.LBB1897:
+.LBB1898:
 	.loc 4 58 0
 	add	x0, x19, 416
 	bl	__pm_stay_awake
-.LVL787:
-	b	.L788
-.LBE1836:
-.LBE1835:
+.LVL809:
+	b	.L801
+.LBE1898:
+.LBE1897:
 	.cfi_endproc
 .LFE2887:
 	.size	ebc_power_set.constprop.17, .-ebc_power_set.constprop.17
@@ -9212,24 +9394,24 @@ refresh_new_image2:
 .LFB2810:
 	.loc 1 216 0
 	.cfi_startproc
-.LVL788:
+.LVL810:
 	.loc 1 223 0
 	ldp	w16, w5, [x4, 68]
-.LVL789:
+.LVL811:
 	cmp	w5, 0
 	add	w11, w5, 7
 	csel	w11, w11, w5, lt
-.LVL790:
+.LVL812:
 	.loc 1 225 0
 	cmp	w16, 0
 	.loc 1 223 0
 	asr	w11, w11, 3
-.LVL791:
+.LVL813:
 	.loc 1 225 0
-	ble	.L792
+	ble	.L805
 	sub	w14, w11, #1
 	mov	w15, 0
-.LVL792:
+.LVL814:
 	add	x14, x14, 1
 	.loc 1 270 0
 	mov	w13, 234881024
@@ -9237,92 +9419,92 @@ refresh_new_image2:
 	lsl	x14, x14, 2
 	.loc 1 276 0
 	mov	w12, -536870912
-.LVL793:
+.LVL815:
 	.p2align 2
-.L794:
+.L807:
 	.loc 1 226 0 discriminator 1
 	mov	x6, 0
 	cmp	w11, 0
-	bgt	.L815
-	b	.L812
-.LVL794:
+	bgt	.L828
+	b	.L825
+.LVL816:
 	.p2align 3
-.L795:
+.L808:
 	.loc 1 239 0
 	tst	x5, 65280
-	bne	.L796
+	bne	.L809
 	.loc 1 240 0
 	and	w10, w4, 240
 	cmp	w10, 224
-	beq	.L817
+	beq	.L830
 	.loc 1 243 0
 	orr	w7, w7, 240
-.L796:
+.L809:
 	.loc 1 245 0
 	tst	x5, 16711680
-	bne	.L798
+	bne	.L811
 	.loc 1 246 0
 	and	w10, w4, 3840
 	cmp	w10, 3584
-	beq	.L818
+	beq	.L831
 	.loc 1 249 0
 	orr	w7, w7, 3840
-.L798:
+.L811:
 	.loc 1 251 0
 	tst	x5, 4278190080
-	bne	.L800
+	bne	.L813
 	.loc 1 252 0
 	and	w10, w4, 61440
 	cmp	w10, 57344
-	beq	.L819
+	beq	.L832
 	.loc 1 255 0
 	orr	w7, w7, 61440
-.L800:
+.L813:
 	.loc 1 257 0
 	tst	x5, 1095216660480
-	bne	.L802
+	bne	.L815
 	.loc 1 258 0
 	and	w10, w4, 983040
 	cmp	w10, 917504
-	beq	.L820
+	beq	.L833
 	.loc 1 261 0
 	orr	w7, w7, 983040
-.L802:
+.L815:
 	.loc 1 263 0
 	tst	x5, 280375465082880
-	bne	.L804
+	bne	.L817
 	.loc 1 264 0
 	and	w10, w4, 15728640
 	cmp	w10, 14680064
-	beq	.L821
+	beq	.L834
 	.loc 1 267 0
 	orr	w7, w7, 15728640
-.L804:
+.L817:
 	.loc 1 269 0
 	tst	x5, 71776119061217280
-	bne	.L806
+	bne	.L819
 	.loc 1 270 0
 	and	w10, w4, 251658240
 	cmp	w10, w13
-	beq	.L822
+	beq	.L835
 	.loc 1 273 0
 	orr	w7, w7, 251658240
-.L806:
+.L819:
 	.loc 1 275 0
 	tst	x5, -72057594037927936
-	bne	.L808
+	bne	.L821
 	.loc 1 276 0
 	and	w5, w4, -268435456
-.LVL795:
+.LVL817:
 	cmp	w5, w12
-	beq	.L823
+	beq	.L836
 	.loc 1 279 0
 	orr	w7, w7, -268435456
-.LVL796:
-.L808:
+.LVL818:
+.L821:
 	.loc 1 283 0 discriminator 2
 	and	w4, w4, w9
-.LVL797:
+.LVL819:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
@@ -9331,54 +9513,54 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 226 0 discriminator 2
 	cmp	w11, w6
-	ble	.L824
-.LVL798:
-.L815:
+	ble	.L837
+.LVL820:
+.L828:
 	.loc 1 227 0
 	ldr	x5, [x3, x6, lsl 3]
 	.loc 1 231 0
 	mov	w7, 0
 	.loc 1 228 0
 	ldr	w4, [x1, x6, lsl 2]
-.LVL799:
+.LVL821:
 	.loc 1 229 0
 	ldr	w8, [x0, x6, lsl 2]
 	.loc 1 233 0
 	and	x10, x5, 255
 	.loc 1 230 0
 	ldr	w9, [x2, x6, lsl 2]
-.LVL800:
+.LVL822:
 	.loc 1 233 0
-	cbnz	x10, .L795
-.LVL801:
+	cbnz	x10, .L808
+.LVL823:
 	.loc 1 234 0
 	and	w10, w4, 15
 	.loc 1 237 0
 	mov	w7, 15
 	.loc 1 234 0
 	cmp	w10, 14
-	bne	.L795
+	bne	.L808
 	.loc 1 235 0
 	orr	w8, w8, w7
-.LVL802:
+.LVL824:
 	.loc 1 231 0
 	mov	w7, 0
-.LVL803:
-	b	.L795
+.LVL825:
+	b	.L808
 	.p2align 3
-.L822:
+.L835:
 	.loc 1 271 0
 	orr	w8, w8, 251658240
-	b	.L806
-.LVL804:
+	b	.L819
+.LVL826:
 	.p2align 3
-.L823:
+.L836:
 	.loc 1 277 0
 	orr	w8, w8, -268435456
-.LVL805:
+.LVL827:
 	.loc 1 283 0
 	and	w4, w4, w9
-.LVL806:
+.LVL828:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
@@ -9387,48 +9569,48 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 226 0
 	cmp	w11, w6
-	bgt	.L815
-.LVL807:
+	bgt	.L828
+.LVL829:
 	.p2align 2
-.L824:
+.L837:
 	add	x3, x3, x17
 	add	x1, x1, x14
 	add	x2, x2, x14
 	add	x0, x0, x14
-.LVL808:
-.L812:
+.LVL830:
+.L825:
 	.loc 1 225 0 discriminator 2
 	add	w15, w15, 1
 	cmp	w16, w15
-	bne	.L794
-.L792:
+	bne	.L807
+.L805:
 	ret
-.LVL809:
+.LVL831:
 	.p2align 3
-.L818:
+.L831:
 	.loc 1 247 0
 	orr	w8, w8, 3840
-	b	.L798
+	b	.L811
 	.p2align 3
-.L819:
+.L832:
 	.loc 1 253 0
 	orr	w8, w8, 61440
-	b	.L800
+	b	.L813
 	.p2align 3
-.L820:
+.L833:
 	.loc 1 259 0
 	orr	w8, w8, 983040
-	b	.L802
+	b	.L815
 	.p2align 3
-.L821:
+.L834:
 	.loc 1 265 0
 	orr	w8, w8, 15728640
-	b	.L804
+	b	.L817
 	.p2align 3
-.L817:
+.L830:
 	.loc 1 241 0
 	orr	w8, w8, 240
-	b	.L796
+	b	.L809
 	.cfi_endproc
 .LFE2810:
 	.size	refresh_new_image2, .-refresh_new_image2
@@ -9440,48 +9622,48 @@ refresh_new_image_auto_32:
 .LFB2811:
 	.loc 1 291 0
 	.cfi_startproc
-.LVL810:
+.LVL832:
 	.loc 1 298 0
 	ldp	w14, w4, [x3, 68]
 	cmp	w4, 0
 	add	w10, w4, 7
 	csel	w10, w10, w4, lt
-.LVL811:
+.LVL833:
 	.loc 1 300 0
 	cmp	w14, 0
 	.loc 1 298 0
 	asr	w10, w10, 3
-.LVL812:
+.LVL834:
 	.loc 1 300 0
-	ble	.L825
+	ble	.L838
 	sub	w13, w10, #1
 	mov	w11, 0
-.LVL813:
+.LVL835:
 	add	x13, x13, 1
 	lsl	x12, x13, 3
 	lsl	x13, x13, 2
-.LVL814:
+.LVL836:
 	.p2align 2
-.L827:
+.L840:
 	.loc 1 301 0 discriminator 1
 	mov	x8, x1
 	mov	x6, 0
 	cmp	w10, 0
-	bgt	.L840
-	b	.L838
-.LVL815:
+	bgt	.L853
+	b	.L851
+.LVL837:
 	.p2align 3
-.L843:
+.L856:
 	.loc 1 310 0
 	ubfx	x3, x7, 4, 4
-.LVL816:
+.LVL838:
 	.loc 1 309 0
 	mov	w4, 15
-.LVL817:
-.L828:
+.LVL839:
+.L841:
 	.loc 1 312 0
 	tst	x5, 65280
-	bne	.L829
+	bne	.L842
 	.loc 1 314 0
 	lsr	w9, w7, 8
 	.loc 1 313 0
@@ -9489,10 +9671,10 @@ refresh_new_image_auto_32:
 	.loc 1 314 0
 	and	w9, w9, 240
 	orr	w3, w3, w9
-.L829:
+.L842:
 	.loc 1 316 0
 	tst	x5, 16711680
-	bne	.L830
+	bne	.L843
 	.loc 1 318 0
 	lsr	w9, w7, 12
 	.loc 1 317 0
@@ -9500,10 +9682,10 @@ refresh_new_image_auto_32:
 	.loc 1 318 0
 	and	w9, w9, 3840
 	orr	w3, w3, w9
-.L830:
+.L843:
 	.loc 1 320 0
 	tst	x5, 4278190080
-	bne	.L831
+	bne	.L844
 	.loc 1 322 0
 	lsr	w7, w7, 16
 	.loc 1 321 0
@@ -9511,14 +9693,14 @@ refresh_new_image_auto_32:
 	.loc 1 322 0
 	and	w7, w7, 61440
 	orr	w3, w3, w7
-.L831:
+.L844:
 	add	x8, x8, 8
 	.loc 1 325 0
 	tst	x5, 1095216660480
 	.loc 1 324 0
 	ldr	w7, [x8, -4]
 	.loc 1 325 0
-	bne	.L832
+	bne	.L845
 	.loc 1 327 0
 	lsl	w9, w7, 12
 	.loc 1 326 0
@@ -9526,10 +9708,10 @@ refresh_new_image_auto_32:
 	.loc 1 327 0
 	and	w9, w9, 983040
 	orr	w3, w3, w9
-.L832:
+.L845:
 	.loc 1 329 0
 	tst	x5, 280375465082880
-	bne	.L833
+	bne	.L846
 	.loc 1 331 0
 	lsl	w9, w7, 8
 	.loc 1 330 0
@@ -9537,10 +9719,10 @@ refresh_new_image_auto_32:
 	.loc 1 331 0
 	and	w9, w9, 15728640
 	orr	w3, w3, w9
-.L833:
+.L846:
 	.loc 1 334 0
 	tst	x5, 71776119061217280
-	bne	.L834
+	bne	.L847
 	.loc 1 336 0
 	lsl	w9, w7, 4
 	.loc 1 335 0
@@ -9548,63 +9730,63 @@ refresh_new_image_auto_32:
 	.loc 1 336 0
 	and	w9, w9, 251658240
 	orr	w3, w3, w9
-.L834:
+.L847:
 	.loc 1 338 0
 	tst	x5, -72057594037927936
-	bne	.L835
+	bne	.L848
 	.loc 1 340 0
 	and	w7, w7, -268435456
 	.loc 1 339 0
 	orr	w4, w4, -268435456
 	.loc 1 340 0
 	orr	w3, w3, w7
-.L835:
+.L848:
 	.loc 1 342 0 discriminator 2
 	bic	w4, w15, w4
-.LVL818:
+.LVL840:
 	.loc 1 343 0 discriminator 2
 	orr	w3, w3, w4
-.LVL819:
+.LVL841:
 	.loc 1 344 0 discriminator 2
 	str	w3, [x0, x6, lsl 2]
 	add	x6, x6, 1
 	.loc 1 301 0 discriminator 2
 	cmp	w10, w6
-	ble	.L842
-.LVL820:
-.L840:
+	ble	.L855
+.LVL842:
+.L853:
 	.loc 1 302 0
 	ldr	x5, [x2, x6, lsl 3]
 	.loc 1 304 0
 	ldr	w15, [x0, x6, lsl 2]
 	.loc 1 308 0
 	and	x3, x5, 255
-.LVL821:
+.LVL843:
 	.loc 1 303 0
 	ldr	w7, [x8]
 	.loc 1 308 0
-	cbz	x3, .L843
+	cbz	x3, .L856
 	.loc 1 305 0
 	mov	w4, 0
-.LVL822:
+.LVL844:
 	.loc 1 306 0
 	mov	w3, 0
-.LVL823:
-	b	.L828
-.LVL824:
+.LVL845:
+	b	.L841
+.LVL846:
 	.p2align 3
-.L842:
+.L855:
 	add	x2, x2, x12
 	add	x1, x1, x12
-.LVL825:
+.LVL847:
 	add	x0, x0, x13
-.LVL826:
-.L838:
+.LVL848:
+.L851:
 	.loc 1 300 0 discriminator 2
 	add	w11, w11, 1
 	cmp	w14, w11
-	bne	.L827
-.L825:
+	bne	.L840
+.L838:
 	ret
 	.cfi_endproc
 .LFE2811:
@@ -9617,52 +9799,52 @@ refresh_new_image_auto:
 .LFB2812:
 	.loc 1 351 0
 	.cfi_startproc
-.LVL827:
+.LVL849:
 	.loc 1 358 0
 	ldp	w13, w4, [x3, 68]
 	cmp	w4, 0
 	add	w9, w4, 7
 	csel	w9, w9, w4, lt
-.LVL828:
+.LVL850:
 	.loc 1 360 0
 	cmp	w13, 0
 	.loc 1 358 0
 	asr	w9, w9, 3
-.LVL829:
+.LVL851:
 	.loc 1 360 0
-	ble	.L844
+	ble	.L857
 	sub	w12, w9, #1
 	mov	w11, 0
-.LVL830:
+.LVL852:
 	add	x12, x12, 1
 	.loc 1 368 0
 	mov	w10, 15
 	lsl	x14, x12, 3
 	lsl	x12, x12, 2
 	.p2align 2
-.L846:
+.L859:
 	.loc 1 361 0 discriminator 1
 	mov	x6, 0
 	cmp	w9, 0
-	ble	.L857
+	ble	.L870
 	.p2align 2
-.L859:
+.L872:
 	.loc 1 362 0
 	ldr	x4, [x2, x6, lsl 3]
-.LVL831:
+.LVL853:
 	.loc 1 364 0
 	ldr	w7, [x0, x6, lsl 2]
 	.loc 1 363 0
 	ldr	w3, [x1, x6, lsl 2]
-.LVL832:
+.LVL854:
 	.loc 1 367 0
 	and	x5, x4, 255
 	.loc 1 368 0
 	cmp	x5, 0
-.LVL833:
+.LVL855:
 	eor	w5, w3, w7
 	csel	w3, wzr, w10, ne
-.LVL834:
+.LVL856:
 	.loc 1 371 0
 	orr	w8, w3, 240
 	tst	x4, 65280
@@ -9690,10 +9872,10 @@ refresh_new_image_auto:
 	.loc 1 389 0
 	tst	x4, -72057594037927936
 	orr	w4, w3, -268435456
-.LVL835:
+.LVL857:
 	csel	w3, w4, w3, eq
 	and	w3, w5, w3
-.LVL836:
+.LVL858:
 	.loc 1 392 0
 	eor	w3, w3, w7
 	.loc 1 393 0
@@ -9701,17 +9883,17 @@ refresh_new_image_auto:
 	add	x6, x6, 1
 	.loc 1 361 0
 	cmp	w9, w6
-	bgt	.L859
+	bgt	.L872
 	add	x2, x2, x14
 	add	x1, x1, x12
 	add	x0, x0, x12
-.LVL837:
-.L857:
+.LVL859:
+.L870:
 	.loc 1 360 0 discriminator 2
 	add	w11, w11, 1
 	cmp	w13, w11
-	bne	.L846
-.L844:
+	bne	.L859
+.L857:
 	ret
 	.cfi_endproc
 .LFE2812:
@@ -9724,7 +9906,7 @@ new_buffer_refresh:
 .LFB2813:
 	.loc 1 399 0
 	.cfi_startproc
-.LVL838:
+.LVL860:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -9741,16 +9923,16 @@ new_buffer_refresh:
 	adrp	x20, .LANCHOR1
 	.loc 1 400 0
 	ldr	x19, [x1, #:lo12:.LANCHOR0]
-.LVL839:
+.LVL861:
 	.loc 1 403 0
 	add	x0, x20, :lo12:.LANCHOR1
-.LVL840:
+.LVL862:
 	add	x0, x0, 680
 	bl	down_write
-.LVL841:
+.LVL863:
 	.loc 1 401 0
 	add	x19, x19, 184
-.LVL842:
+.LVL864:
 	.loc 1 404 0
 	ldr	x0, [x19, 224]
 	ldr	w5, [x0, 40]
@@ -9759,22 +9941,22 @@ new_buffer_refresh:
 	.loc 1 406 0
 	cmp	w5, 0
 	ccmp	w1, 1, 0, ne
-	bls	.L866
+	bls	.L879
 	.loc 1 418 0
 	ldr	x1, [x0, 16]
 	mov	x4, x19
 	ldp	x2, x3, [x19, 160]
 	ldr	x0, [x19, 144]
 	bl	refresh_new_image2
-.LVL843:
+.LVL865:
 	.loc 1 424 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 680
 	bl	up_write
-.LVL844:
+.LVL866:
 	.loc 1 425 0
 	ldp	x19, x20, [sp, 16]
-.LVL845:
+.LVL867:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -9783,9 +9965,9 @@ new_buffer_refresh:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL846:
+.LVL868:
 	.p2align 3
-.L866:
+.L879:
 	.cfi_restore_state
 	.loc 1 407 0
 	ldr	w1, [x0, 64]
@@ -9798,18 +9980,18 @@ new_buffer_refresh:
 	ldr	x1, [x0, 16]
 	ldr	x0, [x19, 144]
 	.loc 1 407 0
-	beq	.L867
+	beq	.L880
 	.loc 1 413 0
 	bl	refresh_new_image_auto
-.LVL847:
+.LVL869:
 	.loc 1 424 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 680
 	bl	up_write
-.LVL848:
+.LVL870:
 	.loc 1 425 0
 	ldp	x19, x20, [sp, 16]
-.LVL849:
+.LVL871:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 20
@@ -9818,21 +10000,21 @@ new_buffer_refresh:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL850:
+.LVL872:
 	.p2align 3
-.L867:
+.L880:
 	.cfi_restore_state
 	.loc 1 408 0
 	bl	refresh_new_image_auto_32
-.LVL851:
+.LVL873:
 	.loc 1 424 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 680
 	bl	up_write
-.LVL852:
+.LVL874:
 	.loc 1 425 0
 	ldp	x19, x20, [sp, 16]
-.LVL853:
+.LVL875:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -9850,7 +10032,7 @@ ebc_auto_tast_function:
 .LFB2832:
 	.loc 1 1581 0
 	.cfi_startproc
-.LVL854:
+.LVL876:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
@@ -9859,7 +10041,7 @@ ebc_auto_tast_function:
 	adrp	x1, .LANCHOR0
 	.loc 1 1581 0
 	adrp	x0, __stack_chk_guard
-.LVL855:
+.LVL877:
 	add	x0, x0, :lo12:__stack_chk_guard
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -9874,28 +10056,28 @@ ebc_auto_tast_function:
 	.cfi_offset 22, -56
 	.loc 1 1582 0
 	ldr	x22, [x1, #:lo12:.LANCHOR0]
-.LVL856:
+.LVL878:
 	.loc 1 1587 0
 	add	x20, x20, 728
 	.loc 1 1581 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
-.LBB1837:
-.LBB1838:
-.LBB1839:
+.LBB1899:
+.LBB1900:
+.LBB1901:
 	.loc 14 288 0
 	mov	x24, 2
-.LBE1839:
-.LBE1838:
-.LBE1837:
+.LBE1901:
+.LBE1900:
+.LBE1899:
 	.loc 1 1581 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -32
 	.cfi_offset 26, -24
 	.loc 1 1583 0
 	add	x21, x22, 24
-	adrp	x26, .LC82
+	adrp	x26, .LC85
 	.loc 1 1584 0
 	add	x19, x22, 184
 	.loc 1 1581 0
@@ -9904,43 +10086,43 @@ ebc_auto_tast_function:
 	mov	x1,0
 	add	x25, x22, 744
 	.loc 1 1647 0
-	add	x26, x26, :lo12:.LC82
-.LBB1844:
-.LBB1841:
-.LBB1842:
+	add	x26, x26, :lo12:.LC85
+.LBB1906:
+.LBB1903:
+.LBB1904:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x23, sp_el0
 // 0 "" 2
-.LVL857:
+.LVL879:
 #NO_APP
-	b	.L880
+	b	.L893
 	.p2align 3
-.L877:
-.LBE1842:
-.LBE1841:
-.LBE1844:
+.L890:
+.LBE1904:
+.LBE1903:
+.LBE1906:
 	.loc 1 1667 0
 	mov	x0, x20
 	bl	up
-.LVL858:
+.LVL880:
 	.loc 1 1668 0
 	bl	schedule
-.LVL859:
-.L880:
+.LVL881:
+.L893:
 	.loc 1 1587 0
 	mov	x0, x20
 	bl	down
-.LVL860:
-.LBB1845:
-.LBB1843:
-.LBB1840:
+.LVL882:
+.LBB1907:
+.LBB1905:
+.LBB1902:
 	.loc 14 288 0
 	str	x24, [x23, 32]
-.LBE1840:
-.LBE1843:
-.LBE1845:
+.LBE1902:
+.LBE1905:
+.LBE1907:
 	.loc 1 1591 0
 #APP
 // 1591 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
@@ -9951,17 +10133,17 @@ ebc_auto_tast_function:
 	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 16
-	bgt	.L870
+	bgt	.L883
 	cmp	w0, 7
-	bge	.L871
-	cbz	w0, .L872
+	bge	.L884
+	cbz	w0, .L885
 	cmp	w0, 1
-	bne	.L869
+	bne	.L882
 	.loc 1 1594 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
 	bl	flip.isra.11
-.LVL861:
+.LVL883:
 	.loc 1 1595 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
@@ -9970,8 +10152,8 @@ ebc_auto_tast_function:
 	ldr	x3, [x19, 168]
 	ldr	x0, [x0, 184]
 	bl	get_overlay_image
-.LVL862:
-.L874:
+.LVL884:
+.L887:
 	.loc 1 1642 0
 	ldr	x0, [x19, 224]
 	.loc 1 1643 0
@@ -9980,24 +10162,24 @@ ebc_auto_tast_function:
 	.loc 1 1645 0
 	cmp	w1, 1
 	ccmp	w0, 1, 0, hi
-	bhi	.L877
+	bhi	.L890
 	.loc 1 1646 0
 	ldr	w0, [x19, 52]
-	cbz	w0, .L892
-.LBB1846:
-.LBB1847:
+	cbz	w0, .L905
+.LBB1908:
+.LBB1909:
 	.file 18 "./include/linux/workqueue.h"
 	.loc 18 518 0
 	ldr	x1, [x19, 608]
 	mov	x2, x25
 	mov	w0, 8
 	bl	queue_work_on
-.LVL863:
-	b	.L877
+.LVL885:
+	b	.L890
 	.p2align 3
-.L869:
-.LBE1847:
-.LBE1846:
+.L882:
+.LBE1909:
+.LBE1908:
 	.loc 1 1631 0
 	ldr	w1, [x19, 56]
 	.loc 1 1632 0
@@ -10008,10 +10190,10 @@ ebc_auto_tast_function:
 	.loc 1 1632 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.11
-.LVL864:
+.LVL886:
 	.loc 1 1633 0
 	ldr	w0, [x19, 56]
-	cbz	w0, .L874
+	cbz	w0, .L887
 	.loc 1 1635 0
 	ldrsw	x0, [x21, 72]
 	mov	x3, x19
@@ -10023,10 +10205,10 @@ ebc_auto_tast_function:
 	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
-.LVL865:
-	b	.L874
+.LVL887:
+	b	.L887
 	.p2align 3
-.L871:
+.L884:
 	.loc 1 1621 0
 	ldr	w1, [x19, 56]
 	.loc 1 1622 0
@@ -10037,10 +10219,10 @@ ebc_auto_tast_function:
 	.loc 1 1622 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.11
-.LVL866:
+.LVL888:
 	.loc 1 1623 0
 	ldr	w0, [x19, 56]
-	cbz	w0, .L874
+	cbz	w0, .L887
 	.loc 1 1625 0
 	ldrsw	x0, [x21, 72]
 	mov	x3, x19
@@ -10052,21 +10234,21 @@ ebc_auto_tast_function:
 	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part
-.LVL867:
+.LVL889:
 	.loc 1 1629 0
-	b	.L874
+	b	.L887
 	.p2align 3
-.L870:
+.L883:
 	.loc 1 1592 0
 	sub	w0, w0, #22
 	cmp	w0, 1
-	bhi	.L869
-.L872:
+	bhi	.L882
+.L885:
 	.loc 1 1604 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
 	bl	flip.isra.11
-.LVL868:
+.LVL890:
 	.loc 1 1605 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
@@ -10075,18 +10257,18 @@ ebc_auto_tast_function:
 	ldr	x3, [x19, 168]
 	ldr	x0, [x0, 184]
 	bl	get_auto_image
-.LVL869:
+.LVL891:
 	.loc 1 1610 0
-	b	.L874
-.L892:
+	b	.L887
+.L905:
 	.loc 1 1647 0
 	mov	x0, x26
 	bl	printk
-.LVL870:
+.LVL892:
 	.loc 1 1648 0
 	mov	x0, x25
 	bl	new_buffer_refresh
-.LVL871:
+.LVL893:
 	.loc 1 1649 0
 	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
@@ -10094,7 +10276,7 @@ ebc_auto_tast_function:
 	.loc 1 1650 0
 	ldrsw	x0, [x21, 72]
 	.loc 1 1649 0
-	beq	.L893
+	beq	.L906
 	.loc 1 1656 0
 	add	x0, x19, x0, lsl 3
 	ldr	x3, [x19, 168]
@@ -10102,9 +10284,9 @@ ebc_auto_tast_function:
 	mov	x4, x19
 	ldr	x0, [x0, 184]
 	bl	get_auto_image
-.LVL872:
-	b	.L877
-.L893:
+.LVL894:
+	b	.L890
+.L906:
 	.loc 1 1650 0
 	add	x0, x19, x0, lsl 3
 	ldr	x3, [x19, 168]
@@ -10112,8 +10294,8 @@ ebc_auto_tast_function:
 	mov	x4, x19
 	ldr	x0, [x0, 184]
 	bl	get_overlay_image
-.LVL873:
-	b	.L877
+.LVL895:
+	b	.L890
 	.cfi_endproc
 .LFE2832:
 	.size	ebc_auto_tast_function, .-ebc_auto_tast_function
@@ -10124,7 +10306,7 @@ ebc_thread:
 .LFB2838:
 	.loc 1 1895 0
 	.cfi_startproc
-.LVL874:
+.LVL896:
 	stp	x29, x30, [sp, -240]!
 	.cfi_def_cfa_offset 240
 	.cfi_offset 29, -240
@@ -10145,14 +10327,14 @@ ebc_thread:
 	.cfi_offset 24, -184
 	adrp	x24, __stack_chk_guard
 	stp	x27, x28, [sp, 80]
-.LBB1882:
-.LBB1883:
-.LBB1884:
+.LBB1944:
+.LBB1945:
+.LBB1946:
 	.loc 1 2221 0
 	adrp	x23, .LANCHOR1
-.LBE1884:
-.LBE1883:
-.LBE1882:
+.LBE1946:
+.LBE1945:
+.LBE1944:
 	.loc 1 1895 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 27, -160
@@ -10161,136 +10343,136 @@ ebc_thread:
 	.cfi_offset 26, -168
 	.loc 1 1895 0
 	add	x0, x24, :lo12:__stack_chk_guard
-.LVL875:
+.LVL897:
 	.loc 1 1896 0
 	ldr	x20, [x22, #:lo12:.LANCHOR0]
-.LVL876:
-.LBB1893:
-.LBB1890:
-.LBB1887:
+.LVL898:
+.LBB1955:
+.LBB1952:
+.LBB1949:
 	.loc 1 2221 0
 	add	x23, x23, :lo12:.LANCHOR1
-.LBE1887:
-.LBE1890:
-.LBE1893:
+.LBE1949:
+.LBE1952:
+.LBE1955:
 	.loc 1 1895 0
 	ldr	x1, [x0]
 	str	x1, [x29, 232]
 	mov	x1,0
-.LBB1894:
-.LBB1891:
-.LBB1888:
+.LBB1956:
+.LBB1953:
+.LBB1950:
 	.loc 1 2221 0
 	add	x19, x23, 304
-.LBE1888:
-.LBE1891:
-.LBE1894:
+.LBE1950:
+.LBE1953:
+.LBE1956:
 	.loc 1 1897 0
 	add	x28, x20, 184
 	.loc 1 1900 0
 	str	wzr, [x29, 108]
-.LVL877:
+.LVL899:
 	.p2align 2
-.L895:
+.L908:
 	.loc 1 1905 0
 	ldr	w0, [x28, 624]
-	cbnz	w0, .L1072
-.L896:
+	cbnz	w0, .L1085
+.L909:
 	.loc 1 1911 0
 	bl	ebc_dsp_buf_get
-.LVL878:
+.LVL900:
 	mov	x26, x0
 	.loc 1 1913 0
-	cbz	x0, .L898
+	cbz	x0, .L911
 	.loc 1 1913 0 is_stmt 0 discriminator 1
 	ldr	x1, [x0, 8]
-	cbz	x1, .L898
+	cbz	x1, .L911
 	.loc 1 1914 0 is_stmt 1
 	ldr	w1, [x0, 40]
 	sub	w2, w1, #18
 	tst	w2, -3
-	bne	.L899
+	bne	.L912
 	.loc 1 1916 0
 	add	x0, x22, :lo12:.LANCHOR0
 	.loc 1 1915 0
 	str	wzr, [x28, 632]
 	.loc 1 1916 0
 	str	wzr, [x0, 16]
-.L900:
+.L913:
 	.loc 1 1979 0
 	adrp	x21, jiffies
-.LVL879:
+.LVL901:
 	mov	x1, 402653184
 	add	x0, x20, 632
 	ldr	x2, [x21, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL880:
+.LVL902:
 	.loc 1 1981 0
 	ldr	w0, [x28, 444]
-	cbz	w0, .L914
+	cbz	w0, .L927
 	ldr	x0, [x28, 216]
-.L915:
+.L928:
 	.loc 1 1984 0
 	ldr	w2, [x0, 40]
 	ldr	w3, [x26, 40]
 	cmp	w3, w2
-	beq	.L916
+	beq	.L929
 	.loc 1 1985 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC85
-	add	x1, x1, :lo12:.LC85
+	adrp	x1, .LC88
+	add	x1, x1, :lo12:.LC88
 	bl	_dev_info
-.LVL881:
+.LVL903:
 	.loc 1 1987 0
 	ldr	w0, [x28, 44]
 	cmp	w0, 1
-	beq	.L1073
-.L1066:
+	beq	.L1086
+.L1079:
 	ldr	w2, [x26, 40]
-.L916:
+.L929:
 	.loc 1 1994 0
 	cmp	w2, 23
-	bls	.L1074
+	bls	.L1087
 	.loc 1 2180 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC93
-	add	x1, x1, :lo12:.LC93
+	adrp	x1, .LC96
+	add	x1, x1, :lo12:.LC96
 	bl	_dev_err
-.LVL882:
+.LVL904:
 	.loc 1 2181 0
 	mov	x0, x26
 	bl	ebc_remove_from_dsp_buf_list
-.LVL883:
+.LVL905:
 	.loc 1 2182 0
 	mov	x0, x26
 	bl	ebc_buf_release
-.LVL884:
+.LVL906:
 	.loc 1 1905 0
 	ldr	w0, [x28, 624]
-	cbz	w0, .L896
-.LVL885:
+	cbz	w0, .L909
+.LVL907:
 	.p2align 2
-.L1072:
+.L1085:
 	.loc 1 1906 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	beq	.L1075
-.L897:
+	beq	.L1088
+.L910:
 	.loc 1 2252 0
 	add	x24, x24, :lo12:__stack_chk_guard
 	mov	w0, 0
 	ldr	x2, [x29, 232]
 	ldr	x1, [x24]
 	eor	x1, x2, x1
-	cbnz	x1, .L1076
+	cbnz	x1, .L1089
 	ldp	x19, x20, [sp, 16]
-.LVL886:
+.LVL908:
 	ldp	x21, x22, [sp, 32]
-.LVL887:
+.LVL909:
 	ldp	x23, x24, [sp, 48]
 	ldp	x25, x26, [sp, 64]
-.LVL888:
+.LVL910:
 	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 240
 	.cfi_remember_state
@@ -10308,109 +10490,109 @@ ebc_thread:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL889:
+.LVL911:
 	.p2align 3
-.L898:
+.L911:
 	.cfi_restore_state
 	.loc 1 2220 0
 	ldr	w0, [x28, 96]
-.LVL890:
-	cbz	w0, .L1077
+.LVL912:
+	cbz	w0, .L1090
 	.loc 1 2225 0
 	str	wzr, [x28, 96]
 	.loc 1 2226 0
-	b	.L895
-.LVL891:
+	b	.L908
+.LVL913:
 	.p2align 3
-.L899:
+.L912:
 	.loc 1 1918 0
 	add	x21, x22, :lo12:.LANCHOR0
-.LVL892:
+.LVL914:
 	ldr	w2, [x21, 16]
-	cbz	w2, .L901
+	cbz	w2, .L914
 	.loc 1 1919 0
 	ldr	w0, [x21, 20]
-.LVL893:
+.LVL915:
 	cmp	w0, 5
 	add	w0, w0, 1
 	str	w0, [x21, 20]
-	ble	.L902
+	ble	.L915
 	.loc 1 1920 0
 	str	wzr, [x21, 16]
-.L902:
+.L915:
 	.loc 1 1921 0
 	ldr	w2, [x20, 204]
 	ldr	w1, [x26, 64]
 	ldr	x0, [x26, 16]
 	bl	check_black_percent.isra.15
-.LVL894:
-	cbz	w0, .L900
-.L1064:
+.LVL916:
+	cbz	w0, .L913
+.L1077:
 	.loc 1 2001 0
 	mov	x0, x26
-.L1065:
+.L1078:
 	bl	ebc_remove_from_dsp_buf_list
-.LVL895:
+.LVL917:
 	.loc 1 2002 0
 	mov	x0, x26
 	bl	ebc_buf_release
-.LVL896:
+.LVL918:
 	.loc 1 2004 0
-	b	.L895
+	b	.L908
 	.p2align 3
-.L1074:
+.L1087:
 	.loc 1 1994 0
-	adrp	x0, .L924
-	add	x0, x0, :lo12:.L924
+	adrp	x0, .L937
+	add	x0, x0, :lo12:.L937
 	ldrh	w0, [x0,w2,uxtw #1]
-	adr	x1, .Lrtx924
+	adr	x1, .Lrtx937
 	add	x0, x1, w0, sxth #2
 	br	x0
-.Lrtx924:
+.Lrtx937:
 	.section	.rodata
 	.align	0
 	.align	2
-.L924:
-	.2byte	(.L923 - .Lrtx924) / 4
-	.2byte	(.L925 - .Lrtx924) / 4
-	.2byte	(.L1012 - .Lrtx924) / 4
-	.2byte	(.L1012 - .Lrtx924) / 4
-	.2byte	(.L1012 - .Lrtx924) / 4
-	.2byte	(.L1012 - .Lrtx924) / 4
-	.2byte	(.L1012 - .Lrtx924) / 4
-	.2byte	(.L927 - .Lrtx924) / 4
-	.2byte	(.L927 - .Lrtx924) / 4
-	.2byte	(.L1012 - .Lrtx924) / 4
-	.2byte	(.L1012 - .Lrtx924) / 4
-	.2byte	(.L927 - .Lrtx924) / 4
-	.2byte	(.L1012 - .Lrtx924) / 4
-	.2byte	(.L1012 - .Lrtx924) / 4
-	.2byte	(.L927 - .Lrtx924) / 4
-	.2byte	(.L927 - .Lrtx924) / 4
-	.2byte	(.L1012 - .Lrtx924) / 4
-	.2byte	(.L1012 - .Lrtx924) / 4
-	.2byte	(.L1012 - .Lrtx924) / 4
-	.2byte	(.L1012 - .Lrtx924) / 4
-	.2byte	(.L1012 - .Lrtx924) / 4
-	.2byte	(.L1012 - .Lrtx924) / 4
-	.2byte	(.L923 - .Lrtx924) / 4
-	.2byte	(.L923 - .Lrtx924) / 4
+.L937:
+	.2byte	(.L936 - .Lrtx937) / 4
+	.2byte	(.L938 - .Lrtx937) / 4
+	.2byte	(.L1025 - .Lrtx937) / 4
+	.2byte	(.L1025 - .Lrtx937) / 4
+	.2byte	(.L1025 - .Lrtx937) / 4
+	.2byte	(.L1025 - .Lrtx937) / 4
+	.2byte	(.L1025 - .Lrtx937) / 4
+	.2byte	(.L940 - .Lrtx937) / 4
+	.2byte	(.L940 - .Lrtx937) / 4
+	.2byte	(.L1025 - .Lrtx937) / 4
+	.2byte	(.L1025 - .Lrtx937) / 4
+	.2byte	(.L940 - .Lrtx937) / 4
+	.2byte	(.L1025 - .Lrtx937) / 4
+	.2byte	(.L1025 - .Lrtx937) / 4
+	.2byte	(.L940 - .Lrtx937) / 4
+	.2byte	(.L940 - .Lrtx937) / 4
+	.2byte	(.L1025 - .Lrtx937) / 4
+	.2byte	(.L1025 - .Lrtx937) / 4
+	.2byte	(.L1025 - .Lrtx937) / 4
+	.2byte	(.L1025 - .Lrtx937) / 4
+	.2byte	(.L1025 - .Lrtx937) / 4
+	.2byte	(.L1025 - .Lrtx937) / 4
+	.2byte	(.L936 - .Lrtx937) / 4
+	.2byte	(.L936 - .Lrtx937) / 4
 	.text
-.L1012:
+.L1025:
 	.loc 1 2106 0
 	mov	w4, 1
-.LVL897:
-.L926:
+.LVL919:
+.L939:
 	.loc 1 2113 0
 	ldr	x25, [x28, 216]
-.LVL898:
+.LVL920:
 	.loc 1 2115 0
 	ldr	w0, [x25, 40]
 	sub	w1, w0, #22
 	.loc 1 2117 0
 	cmp	w1, 1
 	ccmp	w0, 1, 0, hi
-	bhi	.L974
+	bhi	.L987
 	.loc 1 2120 0
 	add	x0, x29, 160
 	str	x0, [x28, 216]
@@ -10420,7 +10602,7 @@ ebc_thread:
 	.loc 1 2122 0
 	mov	w0, 16
 	str	w0, [x29, 224]
-.L974:
+.L987:
 	.loc 1 2124 0
 	str	wzr, [x28, 92]
 	.loc 1 2125 0
@@ -10430,93 +10612,93 @@ ebc_thread:
 	sub	w0, w0, #2
 	.loc 1 2127 0
 	cmp	w0, 14
-	bhi	.L975
+	bhi	.L988
 	.loc 1 2129 0
 	ldr	x1, [x28, 216]
 	ldr	w0, [x26, 64]
-.LBB1895:
-.LBB1896:
+.LBB1957:
+.LBB1958:
 	.loc 1 1858 0
 	ldr	w2, [x1, 64]
 	cmp	w0, w2
-	beq	.L1078
-.L975:
-.LBE1896:
-.LBE1895:
+	beq	.L1091
+.L988:
+.LBE1958:
+.LBE1957:
 	.loc 1 2138 0
-	cbnz	w4, .L1016
+	cbnz	w4, .L1029
 	.loc 1 2142 0
 	ldr	w0, [x28, 64]
 	cmp	w0, 0
-	ble	.L981
+	ble	.L994
 	.loc 1 2143 0
 	ldr	w1, [x29, 108]
-.LVL899:
+.LVL921:
 	add	w1, w1, 1
 	str	w1, [x29, 108]
 	.loc 1 2144 0
 	cmp	w0, w1
-	bgt	.L981
+	bgt	.L994
 	.loc 1 2145 0
 	mov	w0, 2
 	.loc 1 2146 0
 	str	wzr, [x29, 108]
 	.loc 1 2145 0
 	str	w0, [x26, 40]
-.L981:
+.L994:
 	.loc 1 2150 0
 	ldr	w0, [x28, 200]
-	cbz	w0, .L1079
-.L982:
+	cbz	w0, .L1092
+.L995:
 	.loc 1 2153 0
 	ldr	x1, [x28, 224]
-.LVL900:
+.LVL922:
 	mov	x0, x20
 	ldr	w1, [x1, 64]
 	bl	ebc_lut_update
-.LVL901:
-	cbz	w0, .L983
+.LVL923:
+	cbz	w0, .L996
 	.loc 1 2154 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC90
-	add	x1, x1, :lo12:.LC90
+	adrp	x1, .LC93
+	add	x1, x1, :lo12:.LC93
 	bl	_dev_err
-.LVL902:
+.LVL924:
 	.loc 1 2156 0
 	str	x25, [x28, 216]
-.LVL903:
-.L939:
+.LVL925:
+.L952:
 	.loc 1 2191 0
 	ldr	x0, [x28, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
-	beq	.L1080
-.L988:
+	beq	.L1093
+.L1001:
 	.loc 1 2197 0
 	cmp	w0, 18
-	beq	.L1081
-.L989:
+	beq	.L1094
+.L1002:
 	.loc 1 2208 0
 	mov	x0, x26
 	bl	ebc_remove_from_dsp_buf_list
-.LVL904:
+.LVL926:
 	.loc 1 2210 0
 	ldr	w0, [x28, 444]
-	cbnz	w0, .L1082
+	cbnz	w0, .L1095
 	.loc 1 2213 0
 	mov	w0, 1
 	str	w0, [x28, 444]
-.L992:
+.L1005:
 	.loc 1 2215 0
 	ldr	x0, [x28, 224]
 	str	x0, [x28, 216]
 	.loc 1 2216 0
-	b	.L895
-.LVL905:
-.L925:
+	b	.L908
+.LVL927:
+.L938:
 	.loc 1 1996 0
 	ldr	w0, [x28, 628]
-	cbz	w0, .L928
+	cbz	w0, .L941
 	.loc 1 2009 0
 	ldr	x2, [x28, 216]
 	.loc 1 1997 0
@@ -10533,24 +10715,24 @@ ebc_thread:
 	sub	w1, w0, #22
 	.loc 1 2012 0
 	ccmp	w1, 1, 0, hi
-	bls	.L1083
+	bls	.L1096
 	.loc 1 2013 0
 	ldr	w0, [x2, 64]
 	cmp	w0, 32
-	bne	.L931
+	bne	.L944
 	.loc 1 2014 0
 	ldr	x5, [x2, 16]
 	ldr	w2, [x28, 20]
 	ldr	x1, [x28, 160]
-.LBB1898:
-.LBB1899:
+.LBB1960:
+.LBB1961:
 	.loc 1 1883 0
 	cmp	w2, 0
-	ble	.L932
+	ble	.L945
 	mov	x0, 0
-.LVL906:
+.LVL928:
 	.p2align 2
-.L933:
+.L946:
 	.loc 1 1885 0
 	ldrb	w3, [x5], 2
 	.loc 1 1887 0
@@ -10562,27 +10744,27 @@ ebc_thread:
 	add	x0, x0, 1
 	.loc 1 1883 0
 	cmp	w2, w0
-	bgt	.L933
-.L1067:
+	bgt	.L946
+.L1080:
 	ldr	w2, [x28, 20]
 	ldr	x1, [x28, 160]
-.L932:
-.LBE1899:
-.LBE1898:
+.L945:
+.LBE1961:
+.LBE1960:
 	.loc 1 2017 0
 	ldr	x0, [x28, 144]
 	sxtw	x2, w2
 	bl	memcpy
-.LVL907:
+.LVL929:
 	.loc 1 2018 0
 	ldrsw	x2, [x28, 20]
 	ldp	x0, x1, [x28, 152]
 	bl	memcpy
-.LVL908:
+.LVL930:
 	ldr	x0, [x28, 224]
-.L934:
-.LBB1900:
-.LBB1901:
+.L947:
+.LBB1962:
+.LBB1963:
 	.loc 1 446 0
 	ldp	w3, w16, [x0, 48]
 	.loc 1 505 0
@@ -10610,23 +10792,23 @@ ebc_thread:
 	asr	w10, w10, 3
 	.loc 1 449 0
 	asr	w18, w18, 3
-.LVL909:
+.LVL931:
 	.loc 1 445 0
 	add	w10, w10, 1
-.LVL910:
+.LVL932:
 	ldr	w1, [x20, 252]
 	.loc 1 452 0
 	cmp	w10, w18
-.LBE1901:
-.LBE1900:
+.LBE1963:
+.LBE1962:
 	.loc 1 2025 0
 	ldr	x13, [x0, 16]
-.LBB1906:
-.LBB1902:
+.LBB1968:
+.LBB1964:
 	.loc 1 452 0
 	sub	w0, w18, #1
 	csel	w10, w0, w10, ge
-.LVL911:
+.LVL933:
 	.loc 1 454 0
 	cmp	w1, w21
 	sub	w1, w1, #1
@@ -10636,106 +10818,106 @@ ebc_thread:
 	csel	w21, w1, w21, le
 	.loc 1 444 0
 	asr	w17, w17, 3
-.LVL912:
+.LVL934:
 	mul	w7, w16, w18
 	.loc 1 456 0
 	cmp	w16, w21
-.LBE1902:
-.LBE1906:
+.LBE1964:
+.LBE1968:
 	.loc 1 2025 0
 	ldr	x8, [x28, 144]
 	.loc 1 2026 0
 	ldp	x12, x11, [x28, 160]
-.LBB1907:
-.LBB1903:
+.LBB1969:
+.LBB1965:
 	.loc 1 456 0
-	bgt	.L942
-.LVL913:
+	bgt	.L955
+.LVL935:
 	.p2align 2
-.L1038:
+.L1051:
 	.loc 1 461 0
 	mov	w5, w17
 	cmp	w17, w10
-	ble	.L1039
-	b	.L959
-.LVL914:
+	ble	.L1052
+	b	.L972
+.LVL936:
 	.p2align 3
-.L943:
+.L956:
 	.loc 1 474 0
 	tst	x2, 65280
-	bne	.L944
+	bne	.L957
 	.loc 1 475 0
 	and	w27, w0, 240
 	cmp	w27, 224
-	beq	.L1084
+	beq	.L1097
 	.loc 1 478 0
 	orr	w3, w3, 240
-.L944:
+.L957:
 	.loc 1 480 0
 	tst	x2, 16711680
-	bne	.L946
+	bne	.L959
 	.loc 1 481 0
 	and	w27, w0, 3840
 	cmp	w27, 3584
-	beq	.L1085
+	beq	.L1098
 	.loc 1 484 0
 	orr	w3, w3, 3840
-.L946:
+.L959:
 	.loc 1 486 0
 	tst	x2, 4278190080
-	bne	.L948
+	bne	.L961
 	.loc 1 487 0
 	and	w27, w0, 61440
 	cmp	w27, 57344
-	beq	.L1086
+	beq	.L1099
 	.loc 1 490 0
 	orr	w3, w3, 61440
-.L948:
+.L961:
 	.loc 1 492 0
 	tst	x2, 1095216660480
-	bne	.L950
+	bne	.L963
 	.loc 1 493 0
 	and	w27, w0, 983040
 	cmp	w27, 917504
-	beq	.L1087
+	beq	.L1100
 	.loc 1 496 0
 	orr	w3, w3, 983040
-.L950:
+.L963:
 	.loc 1 498 0
 	tst	x2, 280375465082880
-	bne	.L952
+	bne	.L965
 	.loc 1 499 0
 	and	w27, w0, 15728640
 	cmp	w27, 14680064
-	beq	.L1088
+	beq	.L1101
 	.loc 1 502 0
 	orr	w3, w3, 15728640
-.L952:
+.L965:
 	.loc 1 504 0
 	tst	x2, 71776119061217280
-	bne	.L954
+	bne	.L967
 	.loc 1 505 0
 	and	w27, w0, 251658240
 	cmp	w27, w15
-	beq	.L1089
+	beq	.L1102
 	.loc 1 508 0
 	orr	w3, w3, 251658240
-.L954:
+.L967:
 	.loc 1 510 0
 	tst	x2, -72057594037927936
-	bne	.L956
+	bne	.L969
 	.loc 1 511 0
 	and	w2, w0, -268435456
-.LVL915:
+.LVL937:
 	cmp	w2, w14
-	beq	.L1090
+	beq	.L1103
 	.loc 1 514 0
 	orr	w3, w3, -268435456
-.LVL916:
-.L956:
+.LVL938:
+.L969:
 	.loc 1 517 0
 	and	w0, w0, w25
-.LVL917:
+.LVL939:
 	.loc 1 461 0
 	add	w5, w5, 1
 	eor	w0, w0, w4
@@ -10746,19 +10928,19 @@ ebc_thread:
 	.loc 1 518 0
 	str	w0, [x8, x1]
 	.loc 1 461 0
-	bgt	.L959
-.LVL918:
-.L1039:
+	bgt	.L972
+.LVL940:
+.L1052:
 	.loc 1 462 0
 	sxtw	x1, w5
-.LVL919:
+.LVL941:
 	.loc 1 466 0
 	mov	w3, 0
 	.loc 1 465 0
 	lsl	x0, x1, 3
 	.loc 1 462 0
 	lsl	x1, x1, 2
-.LVL920:
+.LVL942:
 	.loc 1 465 0
 	add	x0, x0, x7, sxtw 3
 	add	x1, x1, x7, sxtw 2
@@ -10771,32 +10953,32 @@ ebc_thread:
 	and	x27, x2, 255
 	.loc 1 464 0
 	ldr	w25, [x12, x1]
-.LVL921:
+.LVL943:
 	.loc 1 468 0
-	cbnz	x27, .L943
-.LVL922:
+	cbnz	x27, .L956
+.LVL944:
 	.loc 1 469 0
 	and	w27, w0, 15
 	.loc 1 472 0
 	mov	w3, 15
 	.loc 1 469 0
 	cmp	w27, 14
-	bne	.L943
+	bne	.L956
 	.loc 1 470 0
 	orr	w4, w4, w3
-.LVL923:
+.LVL945:
 	.loc 1 466 0
 	mov	w3, 0
-.LVL924:
-	b	.L943
-.LVL925:
-.L923:
-.LBE1903:
-.LBE1907:
+.LVL946:
+	b	.L956
+.LVL947:
+.L936:
+.LBE1965:
+.LBE1969:
 	.loc 1 2048 0
 	add	x0, x23, 680
 	bl	down_write
-.LVL926:
+.LVL948:
 	.loc 1 2051 0
 	ldr	x1, [x28, 216]
 	.loc 1 2049 0
@@ -10807,43 +10989,43 @@ ebc_thread:
 	.loc 1 2054 0
 	cmp	w2, 1
 	ccmp	w0, 1, 0, hi
-	bls	.L961
+	bls	.L974
 	.loc 1 2055 0
 	ldr	w0, [x1, 64]
 	cmp	w0, 32
-	beq	.L1091
+	beq	.L1104
 	.loc 1 2058 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x1, 16]
 	ldr	x0, [x28, 152]
 	bl	memcpy
-.LVL927:
-.L965:
+.LVL949:
+.L978:
 	.loc 1 2059 0
 	ldr	x0, [x28, 224]
 	ldr	w1, [x0, 64]
 	cmp	w1, 32
-	bne	.L966
+	bne	.L979
 	.loc 1 2060 0
 	ldr	w4, [x28, 20]
-.LVL928:
-.LBB1908:
-.LBB1909:
+.LVL950:
+.LBB1970:
+.LBB1971:
 	.loc 1 1883 0
 	ldr	x3, [x0, 16]
-.LVL929:
+.LVL951:
 	mov	x0, 0
 	cmp	w4, 0
-.LBE1909:
-.LBE1908:
+.LBE1971:
+.LBE1970:
 	.loc 1 2060 0
 	ldr	x5, [x28, 144]
-.LBB1911:
-.LBB1910:
+.LBB1973:
+.LBB1972:
 	.loc 1 1883 0
-	ble	.L968
+	ble	.L981
 	.p2align 2
-.L1037:
+.L1050:
 	.loc 1 1885 0
 	ldrb	w1, [x3], 2
 	.loc 1 1887 0
@@ -10855,173 +11037,173 @@ ebc_thread:
 	add	x0, x0, 1
 	.loc 1 1883 0
 	cmp	w4, w0
-	bgt	.L1037
-	b	.L968
-.LVL930:
-.L927:
-.LBE1910:
-.LBE1911:
+	bgt	.L1050
+	b	.L981
+.LVL952:
+.L940:
+.LBE1972:
+.LBE1973:
 	.loc 1 1994 0
 	mov	w4, 0
-.LVL931:
-	b	.L926
-.LVL932:
+.LVL953:
+	b	.L939
+.LVL954:
 	.p2align 3
-.L914:
+.L927:
 	.loc 1 1982 0
 	mov	x0, x26
 	str	x26, [x28, 216]
-	b	.L915
-.LVL933:
+	b	.L928
+.LVL955:
 	.p2align 3
-.L1077:
-.LBB1912:
-.LBB1892:
+.L1090:
+.LBB1974:
+.LBB1954:
 	.loc 1 2221 0
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL934:
+.LVL956:
 	mov	x21, 60
-.LVL935:
-.LBB1889:
+.LVL957:
+.LBB1951:
 	mov	w2, 1
 	add	x1, x29, 120
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL936:
-.LBB1885:
+.LVL958:
+.LBB1947:
 	ldr	w1, [x28, 96]
 	mov	w2, 0
 	cmp	w1, 0
 	cset	w1, ne
-.LVL937:
+.LVL959:
 	.p2align 2
-.L997:
-.LBE1885:
+.L1010:
+.LBE1947:
 	.loc 1 2221 0 is_stmt 0 discriminator 9
 	orr	w1, w1, w2
-.LVL938:
-	cbnz	w1, .L996
-.LVL939:
+.LVL960:
+	cbnz	w1, .L1009
+.LVL961:
 	.loc 1 2221 0 discriminator 11
-	cbnz	x0, .L995
+	cbnz	x0, .L1008
 	.loc 1 2221 0 discriminator 13
 	mov	x0, x21
-.LVL940:
+.LVL962:
 	bl	schedule_timeout
-.LVL941:
+.LVL963:
 	mov	w2, 1
 	mov	x21, x0
 	add	x1, x29, 120
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL942:
-.LBB1886:
+.LVL964:
+.LBB1948:
 	ldr	w1, [x28, 96]
 	cmp	w1, 0
 	cset	w1, ne
-.LVL943:
+.LVL965:
 	cmp	x21, 0
 	cset	w2, eq
 	tst	w1, w2
-	beq	.L997
-.L996:
-.LBE1886:
-.LBE1889:
+	beq	.L1010
+.L1009:
+.LBE1948:
+.LBE1951:
 	.loc 1 2221 0
 	add	x1, x29, 120
-.LVL944:
+.LVL966:
 	mov	x0, x19
 	bl	finish_wait
-.LVL945:
-.L995:
-.LBE1892:
-.LBE1912:
+.LVL967:
+.L1008:
+.LBE1954:
+.LBE1974:
 	.loc 1 2222 0 is_stmt 1 discriminator 16
 	ldr	w0, [x28, 96]
-.LVL946:
-	cbnz	w0, .L895
+.LVL968:
+	cbnz	w0, .L908
 	.loc 1 2229 0
 	ldr	w0, [x28, 44]
 	cmp	w0, 1
-	beq	.L1092
+	beq	.L1105
 	.loc 1 2238 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	beq	.L1004
-.L1006:
-.LBB1913:
-.LBB1914:
+	beq	.L1017
+.L1019:
+.LBB1975:
+.LBB1976:
 	.loc 1 2242 0
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL947:
-	b	.L1005
+.LVL969:
+	b	.L1018
 	.p2align 3
-.L1093:
-.LVL948:
-.LBB1915:
+.L1106:
+.LVL970:
+.LBB1977:
 	.loc 1 2242 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L1007
+	cbnz	x0, .L1020
 	.loc 1 2242 0 discriminator 7
 	bl	schedule
-.LVL949:
-.L1005:
+.LVL971:
+.L1018:
 	.loc 1 2242 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL950:
+.LVL972:
 	ldr	w1, [x28, 96]
-	cbz	w1, .L1093
-.LBE1915:
+	cbz	w1, .L1106
+.LBE1977:
 	.loc 1 2242 0 discriminator 4
 	add	x1, x29, 120
 	mov	x0, x19
 	bl	finish_wait
-.LVL951:
-.L1009:
-.L1007:
-.LBE1914:
-.LBE1913:
+.LVL973:
+.L1022:
+.L1020:
+.LBE1976:
+.LBE1975:
 	.loc 1 2246 0 is_stmt 1
 	ldr	w0, [x28, 200]
-.LVL952:
+.LVL974:
 	.loc 1 2243 0
 	str	wzr, [x28, 96]
 	.loc 1 2246 0
-	cbnz	w0, .L895
-.L1107:
+	cbnz	w0, .L908
+.L1120:
 	.loc 1 2247 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
-.LVL953:
-	b	.L895
-.LVL954:
+.LVL975:
+	b	.L908
+.LVL976:
 	.p2align 3
-.L901:
+.L914:
 	.loc 1 1928 0
 	ldr	x2, [x28, 616]
-	cbz	x2, .L905
+	cbz	x2, .L918
 	.loc 1 1929 0
 	cmp	w1, 19
-	bne	.L1065
+	bne	.L1078
 	.loc 1 1930 0
 	str	wzr, [x28, 616]
 	.loc 1 1931 0
 	mov	x0, 3
-.LVL955:
+.LVL977:
 	bl	ebc_notify
-.LVL956:
+.LVL978:
 	.loc 1 1932 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC83
-	add	x1, x1, :lo12:.LC83
+	adrp	x1, .LC86
+	add	x1, x1, :lo12:.LC86
 	bl	_dev_info
-.LVL957:
+.LVL979:
 	.loc 1 1935 0
 	ldr	w2, [x20, 204]
 	.loc 1 1933 0
@@ -11033,27 +11215,27 @@ ebc_thread:
 	stp	w3, wzr, [x21, 16]
 	.loc 1 1935 0
 	bl	check_black_percent.isra.15
-.LVL958:
-	cbz	w0, .L900
-	b	.L1064
-.LVL959:
+.LVL980:
+	cbz	w0, .L913
+	b	.L1077
+.LVL981:
 	.p2align 3
-.L1082:
+.L1095:
 	.loc 1 2211 0
 	ldr	x0, [x28, 216]
 	bl	ebc_buf_release
-.LVL960:
-	b	.L992
-.LVL961:
+.LVL982:
+	b	.L1005
+.LVL983:
 	.p2align 3
-.L983:
+.L996:
 	.loc 1 2165 0
 	ldr	x0, [x28, 224]
-	adrp	x1, .LC92
+	adrp	x1, .LC95
 	.loc 1 2162 0
 	ldr	w3, [x28, 112]
 	.loc 1 2165 0
-	add	x1, x1, :lo12:.LC92
+	add	x1, x1, :lo12:.LC95
 	.loc 1 2162 0
 	strb	w3, [x28, 48]
 	.loc 1 2165 0
@@ -11061,37 +11243,37 @@ ebc_thread:
 	ldr	w2, [x0, 40]
 	ldr	x0, [x28, 104]
 	bl	_dev_info
-.LVL962:
+.LVL984:
 	.loc 1 2166 0
 	mov	w0, 1
 	str	w0, [x28, 44]
 	.loc 1 2167 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL963:
+.LVL985:
 	.loc 1 2169 0
 	ldr	x1, [x21, #:lo12:jiffies]
 	add	x0, x20, 688
 	str	x0, [x29, 96]
 	add	x1, x1, 900
 	bl	mod_timer
-.LVL964:
-.LBB1916:
+.LVL986:
+.LBB1978:
 	.loc 1 2170 0
 	ldr	w0, [x28, 92]
-	cbz	w0, .L1094
-.L986:
-.LVL965:
-.L984:
-.LBE1916:
+	cbz	w0, .L1107
+.L999:
+.LVL987:
+.L997:
+.LBE1978:
 	.loc 1 2172 0 discriminator 11
 	ldr	x2, [x21, #:lo12:jiffies]
 	mov	x1, 402653184
 	ldr	x0, [x29, 96]
-.LVL966:
+.LVL988:
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL967:
+.LVL989:
 	.loc 1 2173 0 discriminator 11
 	str	wzr, [x28, 92]
 	.loc 1 2191 0 discriminator 11
@@ -11101,82 +11283,82 @@ ebc_thread:
 	.loc 1 2191 0 discriminator 11
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
-	bne	.L988
-.LVL968:
-.L1080:
+	bne	.L1001
+.LVL990:
+.L1093:
 	.loc 1 2194 0
 	ldr	x0, [x28, 104]
 	.loc 1 2192 0
 	mov	w21, 1
-.LVL969:
+.LVL991:
 	.loc 1 2193 0
 	str	wzr, [x28, 204]
 	.loc 1 2194 0
-	adrp	x1, .LC94
+	adrp	x1, .LC97
 	.loc 1 2192 0
 	str	w21, [x28, 624]
 	.loc 1 2194 0
-	add	x1, x1, :lo12:.LC94
+	add	x1, x1, :lo12:.LC97
 	bl	_dev_info
-.LVL970:
+.LVL992:
 	.loc 1 2195 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x23, 328
 	bl	__wake_up_sync
-.LVL971:
-	b	.L989
-.LVL972:
+.LVL993:
+	b	.L1002
+.LVL994:
 	.p2align 3
-.L1016:
+.L1029:
 	.loc 1 2150 0
 	ldr	w0, [x28, 200]
 	.loc 1 2139 0
 	str	wzr, [x29, 108]
 	.loc 1 2150 0
-	cbnz	w0, .L982
-.LVL973:
-.L1079:
+	cbnz	w0, .L995
+.LVL995:
+.L1092:
 	.loc 1 2151 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
-.LVL974:
-	b	.L982
-.LVL975:
+.LVL996:
+	b	.L995
+.LVL997:
 	.p2align 3
-.L905:
+.L918:
 	.loc 1 1952 0
 	cmp	w1, 21
-	beq	.L1095
+	beq	.L1108
 	.loc 1 1955 0
 	ldr	w0, [x28, 632]
-.LVL976:
+.LVL998:
 	cmp	w0, 0
 	ccmp	w1, 1, 4, ne
-	beq	.L900
+	beq	.L913
 	.loc 1 1956 0
 	add	x0, x23, 680
 	bl	down_write
-.LVL977:
+.LVL999:
 	.loc 1 1957 0
 	ldr	w0, [x26, 64]
 	cmp	w0, 32
-	beq	.L1096
+	beq	.L1109
 	.loc 1 1960 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x26, 16]
 	ldr	x0, [x28, 160]
 	bl	memcpy
-.LVL978:
-.L910:
+.LVL1000:
+.L923:
 	.loc 1 1961 0
 	mov	x0, x26
 	bl	ebc_remove_from_dsp_buf_list
-.LVL979:
+.LVL1001:
 	.loc 1 1962 0
 	mov	x0, x26
 	bl	ebc_buf_release
-.LVL980:
+.LVL1002:
 	.loc 1 1964 0
 	ldr	x1, [x28, 224]
 	mov	x4, x28
@@ -11185,14 +11367,14 @@ ebc_thread:
 	ldr	w5, [x1, 40]
 	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
-.LVL981:
+.LVL1003:
 	.loc 1 1967 0
 	add	x0, x23, 680
 	bl	up_write
-.LVL982:
+.LVL1004:
 	.loc 1 1968 0
 	ldr	w0, [x28, 44]
-	cbnz	w0, .L895
+	cbnz	w0, .L908
 	.loc 1 1969 0
 	mov	w0, 1
 	str	w0, [x28, 44]
@@ -11201,22 +11383,22 @@ ebc_thread:
 	.loc 1 1970 0
 	str	wzr, [x28, 92]
 	.loc 1 1971 0
-	cbz	w0, .L1097
-.L913:
+	cbz	w0, .L1110
+.L926:
 	.loc 1 1973 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC84
+	adrp	x1, .LC87
 	ldrb	w2, [x28, 48]
-	add	x1, x1, :lo12:.LC84
+	add	x1, x1, :lo12:.LC87
 	bl	_dev_info
-.LVL983:
+.LVL1005:
 	.loc 1 1974 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL984:
-	b	.L895
+.LVL1006:
+	b	.L908
 	.p2align 3
-.L961:
+.L974:
 	.loc 1 2065 0
 	ldr	w0, [x26, 64]
 	.loc 1 2066 0
@@ -11228,18 +11410,18 @@ ebc_thread:
 	ldr	x2, [x28, 168]
 	ldr	x0, [x28, 144]
 	.loc 1 2065 0
-	beq	.L1098
+	beq	.L1111
 	.loc 1 2069 0
 	bl	refresh_new_image_auto
-.LVL985:
-.L968:
+.LVL1007:
+.L981:
 	.loc 1 2072 0
 	add	x0, x23, 680
 	bl	up_write
-.LVL986:
+.LVL1008:
 	.loc 1 2074 0
 	ldr	w0, [x28, 44]
-	cbnz	w0, .L939
+	cbnz	w0, .L952
 	.loc 1 2077 0
 	ldr	w0, [x28, 200]
 	.loc 1 2075 0
@@ -11249,21 +11431,21 @@ ebc_thread:
 	.loc 1 2075 0
 	str	w1, [x28, 44]
 	.loc 1 2077 0
-	cbz	w0, .L1099
-.L972:
+	cbz	w0, .L1112
+.L985:
 	.loc 1 2079 0
 	mov	w1, 16
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL987:
+.LVL1009:
 	cmn	w0, #1
-	beq	.L1100
+	beq	.L1113
 	.loc 1 2084 0
 	ldr	w3, [x28, 112]
 	.loc 1 2087 0
-	adrp	x1, .LC91
+	adrp	x1, .LC94
 	ldr	x0, [x28, 104]
-	add	x1, x1, :lo12:.LC91
+	add	x1, x1, :lo12:.LC94
 	.loc 1 2084 0
 	strb	w3, [x28, 48]
 	.loc 1 2087 0
@@ -11273,69 +11455,69 @@ ebc_thread:
 	strb	w3, [x28, 49]
 	.loc 1 2087 0
 	bl	_dev_info
-.LVL988:
+.LVL1010:
 	.loc 1 2088 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL989:
-	b	.L939
-.L1073:
+.LVL1011:
+	b	.L952
+.L1086:
 	.loc 1 1988 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC86
-	add	x1, x1, :lo12:.LC86
+	adrp	x1, .LC89
+	add	x1, x1, :lo12:.LC89
 	bl	_dev_info
-.LVL990:
-.LBB1920:
+.LVL1012:
+.LBB1982:
 	.loc 1 1989 0
 	ldr	w0, [x28, 92]
-	cbz	w0, .L1101
-.L920:
-.LVL991:
-.L918:
-.LBE1920:
+	cbz	w0, .L1114
+.L933:
+.LVL1013:
+.L931:
+.LBE1982:
 	.loc 1 1990 0 discriminator 11
 	ldr	x0, [x28, 104]
-.LVL992:
-	adrp	x1, .LC87
-	add	x1, x1, :lo12:.LC87
+.LVL1014:
+	adrp	x1, .LC90
+	add	x1, x1, :lo12:.LC90
 	bl	_dev_info
-.LVL993:
-	b	.L1066
-.LVL994:
-.L1078:
+.LVL1015:
+	b	.L1079
+.LVL1016:
+.L1091:
 	.loc 1 2129 0
 	ldr	w2, [x28, 20]
-.LBB1924:
-.LBB1897:
+.LBB1986:
+.LBB1959:
 	.loc 1 1862 0
 	cmp	w0, 32
-.LVL995:
+.LVL1017:
 	lsl	w0, w2, 1
 	csel	w2, w0, w2, eq
 	.loc 1 1863 0
 	cmp	w2, 0
 	add	w0, w2, 7
 	csel	w0, w0, w2, lt
-.LVL996:
+.LVL1018:
 	asr	w0, w0, 3
-.LVL997:
+.LVL1019:
 	cmp	w0, 0
-	ble	.L977
+	ble	.L990
 	ldr	x7, [x1, 16]
 	ldr	x5, [x26, 16]
 	.loc 1 1867 0
 	ldr	x1, [x7]
 	ldr	x2, [x5]
 	cmp	x2, x1
-	bne	.L975
+	bne	.L988
 	sub	w1, w0, #1
 	mov	x0, 8
 	add	x1, x1, 1
 	lsl	x1, x1, 3
-	b	.L979
+	b	.L992
 	.p2align 3
-.L980:
+.L993:
 	.loc 1 1864 0
 	ldr	x3, [x5, x0]
 	add	x0, x0, 8
@@ -11344,62 +11526,62 @@ ebc_thread:
 	.loc 1 1867 0
 	ldr	x2, [x2, -8]
 	cmp	x3, x2
-	bne	.L975
-.L979:
+	bne	.L988
+.L992:
 	.loc 1 1863 0
 	cmp	x0, x1
-	bne	.L980
-.L977:
-.LBE1897:
-.LBE1924:
+	bne	.L993
+.L990:
+.LBE1959:
+.LBE1986:
 	.loc 1 2130 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC96
-	add	x1, x1, :lo12:.LC96
+	adrp	x1, .LC99
+	add	x1, x1, :lo12:.LC99
 	bl	_dev_info
-.LVL998:
+.LVL1020:
 	.loc 1 2132 0
 	str	x25, [x28, 216]
 	.loc 1 2134 0
-	b	.L939
-.LVL999:
-.L1083:
+	b	.L952
+.LVL1021:
+.L1096:
 	.loc 1 2021 0
 	cmp	w0, 0
 	mov	x0, x26
 	ccmp	w1, 1, 0, ne
-	bhi	.L934
+	bhi	.L947
 	.loc 1 2022 0
 	ldrsw	x2, [x28, 20]
 	ldp	x1, x0, [x28, 152]
 	bl	memcpy
-.LVL1000:
+.LVL1022:
 	ldr	x0, [x28, 224]
-	b	.L934
-.LVL1001:
+	b	.L947
+.LVL1023:
 	.p2align 3
-.L1088:
-.LBB1925:
-.LBB1904:
+.L1101:
+.LBB1987:
+.LBB1966:
 	.loc 1 500 0
 	orr	w4, w4, 15728640
-	b	.L952
+	b	.L965
 	.p2align 3
-.L1089:
+.L1102:
 	.loc 1 506 0
 	orr	w4, w4, 251658240
-	b	.L954
-.LVL1002:
+	b	.L967
+.LVL1024:
 	.p2align 3
-.L1090:
+.L1103:
 	.loc 1 512 0
 	orr	w4, w4, -268435456
-.LVL1003:
+.LVL1025:
 	.loc 1 517 0
 	and	w0, w0, w25
-.LVL1004:
+.LVL1026:
 	eor	w0, w0, w4
-.LVL1005:
+.LVL1027:
 	.loc 1 461 0
 	add	w5, w5, 1
 	and	w0, w0, w3
@@ -11409,21 +11591,21 @@ ebc_thread:
 	.loc 1 518 0
 	str	w0, [x8, x1]
 	.loc 1 461 0
-	ble	.L1039
-.LVL1006:
+	ble	.L1052
+.LVL1028:
 	.p2align 2
-.L959:
+.L972:
 	.loc 1 456 0
 	add	w16, w16, 1
 	add	w7, w7, w18
 	cmp	w16, w21
-	ble	.L1038
-.L942:
-.LBE1904:
-.LBE1925:
+	ble	.L1051
+.L955:
+.LBE1966:
+.LBE1987:
 	.loc 1 2029 0
 	ldr	w0, [x28, 44]
-	cbnz	w0, .L939
+	cbnz	w0, .L952
 	.loc 1 2032 0
 	ldr	w0, [x28, 200]
 	.loc 1 2030 0
@@ -11433,21 +11615,21 @@ ebc_thread:
 	.loc 1 2030 0
 	str	w1, [x28, 44]
 	.loc 1 2032 0
-	cbz	w0, .L1102
-.L960:
+	cbz	w0, .L1115
+.L973:
 	.loc 1 2034 0
 	mov	w1, 16
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL1007:
+.LVL1029:
 	cmn	w0, #1
-	beq	.L939
+	beq	.L952
 	.loc 1 2038 0
 	ldr	w2, [x28, 112]
 	.loc 1 2041 0
-	adrp	x1, .LC89
+	adrp	x1, .LC92
 	ldr	x0, [x28, 104]
-	add	x1, x1, :lo12:.LC89
+	add	x1, x1, :lo12:.LC92
 	.loc 1 2038 0
 	strb	w2, [x28, 48]
 	.loc 1 2039 0
@@ -11459,49 +11641,49 @@ ebc_thread:
 	.loc 1 2041 0
 	and	w3, w3, 255
 	bl	_dev_info
-.LVL1008:
+.LVL1030:
 	.loc 1 2042 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL1009:
-	b	.L939
-.LVL1010:
+.LVL1031:
+	b	.L952
+.LVL1032:
 	.p2align 3
-.L1084:
-.LBB1926:
-.LBB1905:
+.L1097:
+.LBB1988:
+.LBB1967:
 	.loc 1 476 0
 	orr	w4, w4, 240
-	b	.L944
+	b	.L957
 	.p2align 3
-.L1085:
+.L1098:
 	.loc 1 482 0
 	orr	w4, w4, 3840
-	b	.L946
+	b	.L959
 	.p2align 3
-.L1086:
+.L1099:
 	.loc 1 488 0
 	orr	w4, w4, 61440
-	b	.L948
+	b	.L961
 	.p2align 3
-.L1087:
+.L1100:
 	.loc 1 494 0
 	orr	w4, w4, 983040
-	b	.L950
-.LVL1011:
-.L1081:
-.LBE1905:
-.LBE1926:
+	b	.L963
+.LVL1033:
+.L1094:
+.LBE1967:
+.LBE1988:
 	.loc 1 2198 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC95
-	add	x1, x1, :lo12:.LC95
+	adrp	x1, .LC98
+	add	x1, x1, :lo12:.LC98
 	bl	_dev_info
-.LVL1012:
+.LVL1034:
 	.loc 1 2199 0
 	ldr	w0, [x28, 616]
-	cbz	w0, .L1103
-.L990:
+	cbz	w0, .L1116
+.L1003:
 	.loc 1 2204 0
 	add	x0, x22, :lo12:.LANCHOR0
 	.loc 1 2202 0
@@ -11519,88 +11701,88 @@ ebc_thread:
 	.loc 1 2205 0
 	add	x0, x23, 328
 	bl	__wake_up_sync
-.LVL1013:
-	b	.L989
-.LVL1014:
-.L928:
+.LVL1035:
+	b	.L1002
+.LVL1036:
+.L941:
 	.loc 1 2000 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC88
-	add	x1, x1, :lo12:.LC88
+	adrp	x1, .LC91
+	add	x1, x1, :lo12:.LC91
 	bl	_dev_info
-.LVL1015:
-	b	.L1064
-.LVL1016:
-.L1094:
-.LBB1927:
-.LBB1917:
-.LBB1918:
+.LVL1037:
+	b	.L1077
+.LVL1038:
+.L1107:
+.LBB1989:
+.LBB1979:
+.LBB1980:
 	.loc 1 2170 0 discriminator 1
 	add	x27, x23, 352
-.LBE1918:
+.LBE1980:
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL1017:
-	b	.L987
+.LVL1039:
+	b	.L1000
 	.p2align 3
-.L1104:
-.LVL1018:
-.LBB1919:
+.L1117:
+.LVL1040:
+.LBB1981:
 	.loc 1 2170 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L984
+	cbnz	x0, .L997
 	.loc 1 2170 0 discriminator 7
 	bl	schedule
-.LVL1019:
-.L987:
+.LVL1041:
+.L1000:
 	.loc 1 2170 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x27
 	bl	prepare_to_wait_event
-.LVL1020:
+.LVL1042:
 	ldr	w1, [x28, 92]
-	cbz	w1, .L1104
-.LBE1919:
+	cbz	w1, .L1117
+.LBE1981:
 	.loc 1 2170 0 discriminator 4
 	mov	x0, x27
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL1021:
-	b	.L984
-.LVL1022:
-.L1095:
-.LBE1917:
-.LBE1927:
+.LVL1043:
+	b	.L997
+.LVL1044:
+.L1108:
+.LBE1979:
+.LBE1989:
 	.loc 1 1953 0 is_stmt 1
 	str	wzr, [x28, 632]
-	b	.L900
-.LVL1023:
-.L1098:
+	b	.L913
+.LVL1045:
+.L1111:
 	.loc 1 2066 0
 	bl	refresh_new_image_auto_32
-.LVL1024:
-	b	.L968
-.L1091:
+.LVL1046:
+	b	.L981
+.L1104:
 	.loc 1 2056 0
 	ldr	w2, [x28, 20]
 	ldr	x4, [x1, 16]
-.LBB1928:
-.LBB1929:
+.LBB1990:
+.LBB1991:
 	.loc 1 1883 0
 	cmp	w2, 0
-.LBE1929:
-.LBE1928:
+.LBE1991:
+.LBE1990:
 	.loc 1 2056 0
 	ldr	x5, [x28, 152]
-.LBB1931:
-.LBB1930:
+.LBB1993:
+.LBB1992:
 	.loc 1 1883 0
-	ble	.L963
+	ble	.L976
 	mov	x0, 0
-.LVL1025:
+.LVL1047:
 	.p2align 2
-.L964:
+.L977:
 	.loc 1 1885 0
 	ldrb	w1, [x4], 2
 	.loc 1 1887 0
@@ -11612,78 +11794,78 @@ ebc_thread:
 	add	x0, x0, 1
 	.loc 1 1883 0
 	cmp	w2, w0
-	bgt	.L964
-	b	.L965
-.LVL1026:
-.L1102:
-.LBE1930:
-.LBE1931:
+	bgt	.L977
+	b	.L978
+.LVL1048:
+.L1115:
+.LBE1992:
+.LBE1993:
 	.loc 1 2033 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
-.LVL1027:
-	b	.L960
-.LVL1028:
-.L1101:
-.LBB1932:
-.LBB1921:
-.LBB1922:
+.LVL1049:
+	b	.L973
+.LVL1050:
+.L1114:
+.LBB1994:
+.LBB1983:
+.LBB1984:
 	.loc 1 1989 0 discriminator 1
 	add	x25, x23, 352
-.LVL1029:
-.LBE1922:
+.LVL1051:
+.LBE1984:
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL1030:
-	b	.L921
+.LVL1052:
+	b	.L934
 	.p2align 3
-.L1105:
-.LVL1031:
-.LBB1923:
+.L1118:
+.LVL1053:
+.LBB1985:
 	.loc 1 1989 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L918
+	cbnz	x0, .L931
 	.loc 1 1989 0 discriminator 7
 	bl	schedule
-.LVL1032:
-.L921:
+.LVL1054:
+.L934:
 	.loc 1 1989 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x25
 	bl	prepare_to_wait_event
-.LVL1033:
+.LVL1055:
 	ldr	w1, [x28, 92]
-	cbz	w1, .L1105
-.LBE1923:
+	cbz	w1, .L1118
+.LBE1985:
 	.loc 1 1989 0 discriminator 4
 	mov	x0, x25
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL1034:
-	b	.L918
-.LVL1035:
-.L1096:
-.LBE1921:
-.LBE1932:
+.LVL1056:
+	b	.L931
+.LVL1057:
+.L1109:
+.LBE1983:
+.LBE1994:
 	.loc 1 1958 0 is_stmt 1
 	ldr	w4, [x28, 20]
-.LBB1933:
-.LBB1934:
+.LBB1995:
+.LBB1996:
 	.loc 1 1883 0
 	mov	x0, 0
 	ldr	x3, [x26, 16]
-.LVL1036:
+.LVL1058:
 	cmp	w4, 0
-.LBE1934:
-.LBE1933:
+.LBE1996:
+.LBE1995:
 	.loc 1 1958 0
 	ldr	x5, [x28, 160]
-.LBB1936:
-.LBB1935:
+.LBB1998:
+.LBB1997:
 	.loc 1 1883 0
-	ble	.L910
-.L1040:
+	ble	.L923
+.L1053:
 	.loc 1 1885 0
 	ldrb	w1, [x3], 2
 	.loc 1 1887 0
@@ -11695,150 +11877,150 @@ ebc_thread:
 	add	x0, x0, 1
 	.loc 1 1883 0
 	cmp	w4, w0
-	bgt	.L1040
-	b	.L910
-.LVL1037:
-.L1075:
-.LBE1935:
-.LBE1936:
-.LBB1937:
-.LBB1938:
+	bgt	.L1053
+	b	.L923
+.LVL1059:
+.L1088:
+.LBE1997:
+.LBE1998:
+.LBB1999:
+.LBB2000:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.13
-.LVL1038:
-	b	.L897
-.LVL1039:
-.L1092:
-.LBE1938:
-.LBE1937:
-.LBB1939:
-.LBB1940:
+.LVL1060:
+	b	.L910
+.LVL1061:
+.L1105:
+.LBE2000:
+.LBE1999:
+.LBB2001:
+.LBB2002:
 	.loc 1 2230 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL1040:
-	b	.L1003
+.LVL1062:
+	b	.L1016
 	.p2align 3
-.L1106:
-.LBB1941:
+.L1119:
+.LBB2003:
 	.loc 1 2230 0 is_stmt 0 discriminator 7
 	ldr	w1, [x28, 96]
-	cbnz	w1, .L1000
-.LVL1041:
+	cbnz	w1, .L1013
+.LVL1063:
 	.loc 1 2230 0 discriminator 9
-	cbnz	x0, .L1002
+	cbnz	x0, .L1015
 	.loc 1 2230 0 discriminator 11
 	bl	schedule
-.LVL1042:
-.L1003:
+.LVL1064:
+.L1016:
 	.loc 1 2230 0 discriminator 13
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL1043:
+.LVL1065:
 	ldr	w1, [x28, 44]
-	cbnz	w1, .L1106
-.L1000:
-.LBE1941:
+	cbnz	w1, .L1119
+.L1013:
+.LBE2003:
 	.loc 1 2230 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL1044:
+.LVL1066:
 	ldr	w0, [x28, 44]
-.LBE1940:
-.LBE1939:
+.LBE2002:
+.LBE2001:
 	.loc 1 2233 0 is_stmt 1 discriminator 8
-	cbnz	w0, .L1002
+	cbnz	w0, .L1015
 	.loc 1 2234 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	bne	.L1002
-.L1004:
-.LBB1942:
-.LBB1943:
+	bne	.L1015
+.L1017:
+.LBB2004:
+.LBB2005:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.13
-.LVL1045:
-.L1002:
-.LBE1943:
-.LBE1942:
+.LVL1067:
+.L1015:
+.LBE2005:
+.LBE2004:
 	.loc 1 2241 0
 	ldr	w0, [x28, 96]
-.LVL1046:
-	cbz	w0, .L1006
+.LVL1068:
+	cbz	w0, .L1019
 	.loc 1 2246 0
 	ldr	w0, [x28, 200]
 	.loc 1 2243 0
 	str	wzr, [x28, 96]
 	.loc 1 2246 0
-	cbnz	w0, .L895
-	b	.L1107
-.LVL1047:
-.L1100:
+	cbnz	w0, .L908
+	b	.L1120
+.LVL1069:
+.L1113:
 	.loc 1 2080 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC90
-	add	x1, x1, :lo12:.LC90
+	adrp	x1, .LC93
+	add	x1, x1, :lo12:.LC93
 	bl	_dev_err
-.LVL1048:
+.LVL1070:
 	.loc 1 2081 0
-	b	.L939
-.L1099:
+	b	.L952
+.L1112:
 	.loc 1 2078 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
-.LVL1049:
-	b	.L972
-.LVL1050:
-.L1103:
+.LVL1071:
+	b	.L985
+.LVL1072:
+.L1116:
 	.loc 1 2200 0
 	mov	x0, 2
 	bl	ebc_notify
-.LVL1051:
-	b	.L990
-.LVL1052:
-.L931:
+.LVL1073:
+	b	.L1003
+.LVL1074:
+.L944:
 	.loc 1 2016 0
 	ldr	x1, [x2, 16]
 	ldr	x0, [x28, 160]
 	ldrsw	x2, [x28, 20]
 	bl	memcpy
-.LVL1053:
-	b	.L1067
-.LVL1054:
-.L966:
+.LVL1075:
+	b	.L1080
+.LVL1076:
+.L979:
 	ldr	w2, [x28, 20]
-.L1010:
+.L1023:
 	.loc 1 2062 0
 	ldr	x1, [x0, 16]
 	sxtw	x2, w2
 	ldr	x0, [x28, 144]
 	bl	memcpy
-.LVL1055:
-	b	.L968
-.L1097:
+.LVL1077:
+	b	.L981
+.L1110:
 	.loc 1 1972 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
-.LVL1056:
-	b	.L913
-.L963:
+.LVL1078:
+	b	.L926
+.L976:
 	.loc 1 2059 0
 	ldr	w0, [x26, 64]
 	cmp	w0, 32
-	beq	.L968
+	beq	.L981
 	mov	x0, x26
-	b	.L1010
-.LVL1057:
-.L1076:
+	b	.L1023
+.LVL1079:
+.L1089:
 	.loc 1 2252 0
 	bl	__stack_chk_fail
-.LVL1058:
+.LVL1080:
 	.cfi_endproc
 .LFE2838:
 	.size	ebc_thread, .-ebc_thread
@@ -11851,7 +12033,7 @@ ebc_driver:
 	.xword	ebc_probe
 	.xword	ebc_remove
 	.zero	24
-	.xword	.LC97
+	.xword	.LC100
 	.zero	32
 	.xword	ebc_match
 	.zero	64
@@ -11863,7 +12045,7 @@ ebc_driver:
 ebc_misc:
 	.word	243
 	.zero	4
-	.xword	.LC47
+	.xword	.LC48
 	.xword	ebc_ops
 	.zero	56
 	.type	ebc_thread_wq, %object
@@ -11892,13 +12074,13 @@ ebc_wq:
 waveform_misc:
 	.word	244
 	.zero	4
-	.xword	.LC105
+	.xword	.LC108
 	.xword	waveform_ops
 	.zero	56
 	.type	dev_attr_waveform_version, %object
 	.size	dev_attr_waveform_version, 32
 dev_attr_waveform_version:
-	.xword	.LC104
+	.xword	.LC107
 	.hword	292
 	.zero	6
 	.xword	waveform_version_read
@@ -11906,7 +12088,7 @@ dev_attr_waveform_version:
 	.type	dev_attr_pmic_name, %object
 	.size	dev_attr_pmic_name, 32
 dev_attr_pmic_name:
-	.xword	.LC103
+	.xword	.LC106
 	.hword	292
 	.zero	6
 	.xword	pmic_name_read
@@ -11914,7 +12096,7 @@ dev_attr_pmic_name:
 	.type	dev_attr_pmic_temp, %object
 	.size	dev_attr_pmic_temp, 32
 dev_attr_pmic_temp:
-	.xword	.LC102
+	.xword	.LC105
 	.hword	292
 	.zero	6
 	.xword	pmic_temp_read
@@ -11922,7 +12104,7 @@ dev_attr_pmic_temp:
 	.type	dev_attr_pmic_vcom, %object
 	.size	dev_attr_pmic_vcom, 32
 dev_attr_pmic_vcom:
-	.xword	.LC101
+	.xword	.LC104
 	.hword	420
 	.zero	6
 	.xword	pmic_vcom_read
@@ -11930,7 +12112,7 @@ dev_attr_pmic_vcom:
 	.type	dev_attr_ebc_version, %object
 	.size	dev_attr_ebc_version, 32
 dev_attr_ebc_version:
-	.xword	.LC100
+	.xword	.LC103
 	.hword	292
 	.zero	6
 	.xword	ebc_version_read
@@ -11938,7 +12120,7 @@ dev_attr_ebc_version:
 	.type	dev_attr_ebc_state, %object
 	.size	dev_attr_ebc_state, 32
 dev_attr_ebc_state:
-	.xword	.LC99
+	.xword	.LC102
 	.hword	292
 	.zero	6
 	.xword	ebc_state_read
@@ -11946,7 +12128,7 @@ dev_attr_ebc_state:
 	.type	dev_attr_ebc_buf_state, %object
 	.size	dev_attr_ebc_buf_state, 32
 dev_attr_ebc_buf_state:
-	.xword	.LC98
+	.xword	.LC101
 	.hword	292
 	.zero	6
 	.xword	ebc_buf_state_read
@@ -11990,24 +12172,24 @@ resume_frame_count:
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.35231, %object
-	.size	__func__.35231, 11
-__func__.35231:
+	.type	__func__.35232, %object
+	.size	__func__.35232, 11
+__func__.35232:
 	.string	"ebc_io_ctl"
 	.align	3
 	.set	.LANCHOR3,. + 0
-	.type	__func__.34977, %object
-	.size	__func__.34977, 16
-__func__.34977:
+	.type	__func__.34978, %object
+	.size	__func__.34978, 16
+__func__.34978:
 	.string	"ebc_frame_start"
-	.type	__func__.35541, %object
-	.size	__func__.35541, 12
-__func__.35541:
+	.type	__func__.35542, %object
+	.size	__func__.35542, 12
+__func__.35542:
 	.string	"ebc_suspend"
 	.zero	4
-	.type	__func__.35475, %object
-	.size	__func__.35475, 19
-__func__.35475:
+	.type	__func__.35476, %object
+	.size	__func__.35476, 19
+__func__.35476:
 	.string	"ebc_lut_table_init"
 	.zero	5
 	.type	ebc_match, %object
@@ -12047,9 +12229,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init3190, %object
-	.size	__addressable_ebc_init3190, 8
-__addressable_ebc_init3190:
+	.type	__addressable_ebc_init3194, %object
+	.size	__addressable_ebc_init3194, 8
+__addressable_ebc_init3194:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -12078,293 +12260,302 @@ __exitcall_ebc_exit:
 	.string	"EBC_GET_BUFFER_INFO failed\n"
 	.zero	4
 .LC6:
-	.string	"%s: unknow cmd\n"
+	.string	"ebc_dev_debug"
+	.zero	2
 .LC7:
+	.string	"%s: unknow cmd\n"
+.LC8:
 	.string	"full_mode_num = %d\n"
 	.zero	4
-.LC8:
+.LC9:
 	.string	"auto frame done\n"
 	.zero	7
-.LC9:
+.LC10:
 	.string	"frame done\n"
 	.zero	4
-.LC10:
+.LC11:
 	.string	"temperature = %d, out of range0~50 ,use 0 \n"
 	.zero	4
-.LC11:
+.LC12:
 	.string	"temperature = %d, out of range0~50 ,use 50 \n"
 	.zero	3
-.LC12:
+.LC13:
 	.string	"ebc_pmic_read_temp failed, ret = %d\n"
 	.zero	3
-.LC13:
+.LC14:
 	.string	"lut update use temperature = %d\n"
 	.zero	7
-.LC14:
+.LC15:
 	.string	"get lut data failed\n"
 	.zero	3
-.LC15:
+.LC16:
 	.string	"%d\n"
 	.zero	4
-.LC16:
-	.string	"2.21"
-	.zero	3
 .LC17:
+	.string	"2.22"
+	.zero	3
+.LC18:
 	.string	"%s\n"
 	.zero	4
-.LC18:
+.LC19:
 	.string	"invalid value = %s\n"
 	.zero	4
-.LC19:
+.LC20:
 	.string	"set vcom value failed\n"
 	.zero	1
-.LC20:
+.LC21:
 	.string	"%s: overlay no need to update\n"
 	.zero	1
-.LC21:
+.LC22:
 	.string	"%s: auto no need to update\n"
 	.zero	4
-.LC22:
+.LC23:
 	.string	"ebc hw power off\n"
 	.zero	6
-.LC23:
+.LC24:
 	.string	"%s: device is busy now...\n"
 	.zero	5
-.LC24:
-	.string	"device suspend\n"
 .LC25:
+	.string	"device suspend\n"
+.LC26:
 	.string	"black point > 90percent, skip this frame\n"
 	.zero	6
-.LC26:
+.LC27:
 	.string	"ebc_tcon"
 	.zero	7
-.LC27:
+.LC28:
 	.string	"not find ebc tcon\n"
 	.zero	5
-.LC28:
+.LC29:
 	.string	"pmic"
 	.zero	3
-.LC29:
+.LC30:
 	.string	"wrong pmics number\n"
 	.zero	4
-.LC30:
+.LC31:
 	.string	"not find pmic node\n"
 	.zero	4
-.LC31:
+.LC32:
 	.string	"not find pmic i2c client\n"
 	.zero	6
-.LC32:
+.LC33:
 	.string	"use pmic%d\n"
 	.zero	4
-.LC33:
+.LC34:
 	.string	"get drvdata from pmic client failed\n"
 	.zero	3
-.LC34:
+.LC35:
 	.string	"panel,width"
 	.zero	4
-.LC35:
+.LC36:
 	.string	"panel,panel_color"
 	.zero	6
-.LC36:
+.LC37:
 	.string	"panel,mirror"
 	.zero	3
-.LC37:
+.LC38:
 	.string	"panel,width-mm"
 	.zero	1
-.LC38:
-	.string	"panel,height-mm"
 .LC39:
+	.string	"panel,height-mm"
+.LC40:
 	.string	"memory-region"
 	.zero	2
-.LC40:
+.LC41:
 	.string	"Couldn't address to resource for reserved memory\n"
 	.zero	6
-.LC41:
-	.string	"waveform-region"
 .LC42:
-	.string	"%s:%d: failed to get mem from reserved\n"
+	.string	"waveform-region"
 .LC43:
+	.string	"%s:%d: failed to get mem from reserved\n"
+.LC44:
 	.string	"Failed to read waveform from mem, we use waveform file from kernel file instead\n"
 	.zero	7
-.LC44:
+.LC45:
 	.string	"Failed to read waveform file from kernel, no waveform!!!\n"
 	.zero	6
-.LC45:
+.LC46:
 	.string	"failed to create ebc_task thread\n"
 	.zero	6
-.LC46:
+.LC47:
 	.string	"ebc_thread"
 	.zero	5
-.LC47:
+.LC48:
 	.string	"ebc"
 	.zero	4
-.LC48:
+.LC49:
 	.string	"ulogo_addr="
 	.zero	4
-.LC49:
+.LC50:
 	.string	"klogo_addr="
 	.zero	4
-.LC50:
-	.string	"ulogo_addr=0x%x"
 .LC51:
+	.string	"ulogo_addr=0x%x"
+.LC52:
 	.string	"have ulogo display, ulogo addr = 0x%x\n"
 	.zero	1
-.LC52:
+.LC53:
 	.string	"malloc ulogo buffer failed\n"
 	.zero	4
-.LC53:
-	.string	"klogo_addr=0x%x"
 .LC54:
+	.string	"klogo_addr=0x%x"
+.LC55:
 	.string	"need show klogo, klogo addr = 0x%x\n"
 	.zero	4
-.LC55:
+.LC56:
 	.string	"malloc klogo buffer failed\n"
 	.zero	4
-.LC56:
+.LC57:
 	.string	"no uboot logo, panel init\n"
 	.zero	5
-.LC57:
+.LC58:
+	.string	"ebc_dev_reset"
+	.zero	2
+.LC59:
+	.string	"ebc_dev_logo"
+	.zero	3
+.LC60:
 	.string	"rockchip ebc driver %s probe success\n"
 	.zero	2
-.LC58:
+.LC61:
 	.string	"panel,height"
 	.zero	3
-.LC59:
+.LC62:
 	.string	"panel,vir_width"
-.LC60:
+.LC63:
 	.string	"panel,vir_height"
 	.zero	7
-.LC61:
+.LC64:
 	.string	"panel,sdck"
 	.zero	5
-.LC62:
+.LC65:
 	.string	"panel,lsl"
 	.zero	6
-.LC63:
+.LC66:
 	.string	"panel,lbl"
 	.zero	6
-.LC64:
+.LC67:
 	.string	"panel,ldl"
 	.zero	6
-.LC65:
+.LC68:
 	.string	"panel,lel"
 	.zero	6
-.LC66:
+.LC69:
 	.string	"panel,gdck-sta"
 	.zero	1
-.LC67:
+.LC70:
 	.string	"panel,lgonl"
 	.zero	4
-.LC68:
+.LC71:
 	.string	"panel,fsl"
 	.zero	6
-.LC69:
+.LC72:
 	.string	"panel,fbl"
 	.zero	6
-.LC70:
+.LC73:
 	.string	"panel,fdl"
 	.zero	6
-.LC71:
+.LC74:
 	.string	"panel,fel"
 	.zero	6
-.LC72:
+.LC75:
 	.string	"panel,panel_16bit"
 	.zero	6
-.LC73:
+.LC76:
 	.string	"buffer manage init failed\n"
 	.zero	5
-.LC74:
+.LC77:
 	.string	"lut table init failed\n"
 	.zero	1
-.LC75:
+.LC78:
 	.string	"auto-refresh-wq"
-.LC76:
+.LC79:
 	.string	"%s"
 	.zero	5
-.LC77:
+.LC80:
 	.string	"ebc_task"
 	.zero	7
-.LC78:
+.LC81:
 	.string	"failed to run ebc thread\n"
 	.zero	6
-.LC79:
+.LC82:
 	.string	"task init failed\n"
 	.zero	6
-.LC80:
+.LC83:
 	.string	"failed to probe panel: %d\n"
 	.zero	5
-.LC81:
+.LC84:
 	.string	"ebc hw power on\n"
 	.zero	7
-.LC82:
+.LC85:
 	.string	"ebc_info->auto_need_refresh == 0, check again\n"
 	.zero	1
-.LC83:
+.LC86:
 	.string	"early resume\n"
 	.zero	2
-.LC84:
+.LC87:
 	.string	"overlay mode start, update background, frame_total=%d\n"
 	.zero	1
-.LC85:
+.LC88:
 	.string	"change display mode from %d to %d\n"
 	.zero	5
-.LC86:
+.LC89:
 	.string	"ebc is busy now, waiting prev refresh mode end...\n"
 	.zero	5
-.LC87:
+.LC90:
 	.string	"prev refresh mode end\n"
 	.zero	1
-.LC88:
+.LC91:
 	.string	"overlay disabled, drop EPD_OVERLAY frame\n"
 	.zero	6
-.LC89:
+.LC92:
 	.string	"overlay mode start, frame_total=%d, bw_frame = %d\n"
 	.zero	5
-.LC90:
+.LC93:
 	.string	"ebc_lut_update err\n"
 	.zero	4
-.LC91:
+.LC94:
 	.string	"auto mode start, frame_total=%d\n"
 	.zero	7
-.LC92:
+.LC95:
 	.string	"frame start, mode = %d, framecount = %d\n"
 	.zero	7
-.LC93:
+.LC96:
 	.string	"ebc buffer mode %d error!!!\n"
 	.zero	3
-.LC94:
+.LC97:
 	.string	"power off\n"
 	.zero	5
-.LC95:
+.LC98:
 	.string	"early suspend\n"
 	.zero	1
-.LC96:
+.LC99:
 	.string	"check_part_mode==0, no need refresh\n"
 	.zero	3
-.LC97:
+.LC100:
 	.string	"ebc-dev"
-.LC98:
+.LC101:
 	.string	"ebc_buf_state"
 	.zero	2
-.LC99:
+.LC102:
 	.string	"ebc_state"
 	.zero	6
-.LC100:
+.LC103:
 	.string	"ebc_version"
 	.zero	4
-.LC101:
+.LC104:
 	.string	"pmic_vcom"
 	.zero	6
-.LC102:
+.LC105:
 	.string	"pmic_temp"
 	.zero	6
-.LC103:
+.LC106:
 	.string	"pmic_name"
 	.zero	6
-.LC104:
+.LC107:
 	.string	"waveform_version"
 	.zero	7
-.LC105:
+.LC108:
 	.string	"waveform"
 	.text
 .Letext0:
@@ -12566,7 +12757,7 @@ __exitcall_ebc_exit:
 	.file 214 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x156c4
+	.4byte	0x158a7
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
@@ -12575,7 +12766,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.4byte	.LASF3342
 	.4byte	.LASF3343
-	.4byte	.Ldebug_ranges0+0x1340
+	.4byte	.Ldebug_ranges0+0x13e0
 	.8byte	0
 	.4byte	.Ldebug_line0
 	.uleb128 0x2
@@ -34643,121 +34834,121 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2413
 	.byte	0xa
 	.byte	0x85
-	.4byte	0xdcec
+	.4byte	0xdcf8
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF2414
 	.byte	0xa
 	.byte	0x88
-	.4byte	0xdd11
+	.4byte	0xdd1d
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF109
 	.byte	0xa
 	.byte	0x8b
-	.4byte	0xdd3f
+	.4byte	0xdd4b
 	.byte	0x10
 	.uleb128 0xe
 	.4byte	.LASF2415
 	.byte	0xa
 	.byte	0x8f
-	.4byte	0xdd73
+	.4byte	0xdd7f
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF2416
 	.byte	0xa
 	.byte	0x92
-	.4byte	0xdda1
+	.4byte	0xddad
 	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF2417
 	.byte	0xa
 	.byte	0x96
-	.4byte	0xddc6
+	.4byte	0xddd2
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF2418
 	.byte	0xa
 	.byte	0x9d
-	.4byte	0xddef
+	.4byte	0xddfb
 	.byte	0x30
 	.uleb128 0xe
 	.4byte	.LASF2419
 	.byte	0xa
 	.byte	0xa0
-	.4byte	0xde14
+	.4byte	0xde20
 	.byte	0x38
 	.uleb128 0xe
 	.4byte	.LASF2420
 	.byte	0xa
 	.byte	0xa4
-	.4byte	0xde3d
+	.4byte	0xde49
 	.byte	0x40
 	.uleb128 0xe
 	.4byte	.LASF2421
 	.byte	0xa
 	.byte	0xa7
-	.4byte	0xddc6
+	.4byte	0xddd2
 	.byte	0x48
 	.uleb128 0xe
 	.4byte	.LASF2422
 	.byte	0xa
 	.byte	0xaa
-	.4byte	0xde5d
+	.4byte	0xde69
 	.byte	0x50
 	.uleb128 0xe
 	.4byte	.LASF2423
 	.byte	0xa
 	.byte	0xad
-	.4byte	0xde5d
+	.4byte	0xde69
 	.byte	0x58
 	.uleb128 0xe
 	.4byte	.LASF2424
 	.byte	0xa
 	.byte	0xb0
-	.4byte	0xde7d
+	.4byte	0xde89
 	.byte	0x60
 	.uleb128 0xe
 	.4byte	.LASF2425
 	.byte	0xa
 	.byte	0xb3
-	.4byte	0xde7d
+	.4byte	0xde89
 	.byte	0x68
 	.uleb128 0xe
 	.4byte	.LASF2426
 	.byte	0xa
 	.byte	0xb6
-	.4byte	0xde9d
+	.4byte	0xdea9
 	.byte	0x70
 	.uleb128 0xe
 	.4byte	.LASF2427
 	.byte	0xa
 	.byte	0xb8
-	.4byte	0xdeb7
+	.4byte	0xdec3
 	.byte	0x78
 	.uleb128 0xe
 	.4byte	.LASF2428
 	.byte	0xa
 	.byte	0xb9
-	.4byte	0xded1
+	.4byte	0xdedd
 	.byte	0x80
 	.uleb128 0xe
 	.4byte	.LASF2429
 	.byte	0xa
 	.byte	0xba
-	.4byte	0xded1
+	.4byte	0xdedd
 	.byte	0x88
 	.uleb128 0xe
 	.4byte	.LASF2430
 	.byte	0xa
 	.byte	0xbb
-	.4byte	0xdefa
+	.4byte	0xdf06
 	.byte	0x90
 	.uleb128 0xe
 	.4byte	.LASF2431
 	.byte	0xa
 	.byte	0xbd
-	.4byte	0xdf15
+	.4byte	0xdf21
 	.byte	0x98
 	.uleb128 0xe
 	.4byte	.LASF130
@@ -38928,10 +39119,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0xd
 	.4byte	.LASF2913
-	.byte	0x30
+	.byte	0x40
 	.byte	0xc4
 	.byte	0x5c
-	.4byte	0xdb2b
+	.4byte	0xdb37
 	.uleb128 0xe
 	.4byte	.LASF898
 	.byte	0xc4
@@ -39004,13 +39195,19 @@ __exitcall_ebc_exit:
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x2c
+	.uleb128 0xe
+	.4byte	.LASF2881
+	.byte	0xc4
+	.byte	0x69
+	.4byte	0x4848
+	.byte	0x30
 	.byte	0
 	.uleb128 0xd
 	.4byte	.LASF2919
 	.byte	0x50
 	.byte	0x3
 	.byte	0x10
-	.4byte	0xdba4
+	.4byte	0xdbb0
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x3
@@ -39033,98 +39230,98 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2922
 	.byte	0x3
 	.byte	0x14
-	.4byte	0xdbba
+	.4byte	0xdbc6
 	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF2923
 	.byte	0x3
 	.byte	0x15
-	.4byte	0xdbcb
+	.4byte	0xdbd7
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF2924
 	.byte	0x3
 	.byte	0x16
-	.4byte	0xdbcb
+	.4byte	0xdbd7
 	.byte	0x30
 	.uleb128 0xe
 	.4byte	.LASF2925
 	.byte	0x3
 	.byte	0x17
-	.4byte	0xdbe5
+	.4byte	0xdbf1
 	.byte	0x38
 	.uleb128 0xe
 	.4byte	.LASF2926
 	.byte	0x3
 	.byte	0x18
-	.4byte	0xdbfa
+	.4byte	0xdc06
 	.byte	0x40
 	.uleb128 0xe
 	.4byte	.LASF2927
 	.byte	0x3
 	.byte	0x19
-	.4byte	0xdc14
+	.4byte	0xdc20
 	.byte	0x48
 	.byte	0
 	.uleb128 0x10
-	.4byte	0xdbb4
+	.4byte	0xdbc0
 	.uleb128 0x11
-	.4byte	0xdbb4
+	.4byte	0xdbc0
 	.uleb128 0x11
 	.4byte	0x2b0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb2b
+	.4byte	0xdb37
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdba4
+	.4byte	0xdbb0
 	.uleb128 0x10
-	.4byte	0xdbcb
+	.4byte	0xdbd7
 	.uleb128 0x11
-	.4byte	0xdbb4
+	.4byte	0xdbc0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdbc0
+	.4byte	0xdbcc
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdbe5
+	.4byte	0xdbf1
 	.uleb128 0x11
-	.4byte	0xdbb4
+	.4byte	0xdbc0
 	.uleb128 0x11
 	.4byte	0x46ee
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdbd1
+	.4byte	0xdbdd
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdbfa
+	.4byte	0xdc06
 	.uleb128 0x11
-	.4byte	0xdbb4
+	.4byte	0xdbc0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdbeb
+	.4byte	0xdbf7
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdc14
+	.4byte	0xdc20
 	.uleb128 0x11
-	.4byte	0xdbb4
+	.4byte	0xdbc0
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc00
+	.4byte	0xdc0c
 	.uleb128 0x1f
 	.4byte	.LASF2928
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc5
 	.byte	0x5
-	.4byte	0xdc43
+	.4byte	0xdc4f
 	.uleb128 0xc
 	.4byte	.LASF2929
 	.byte	0
@@ -39143,7 +39340,7 @@ __exitcall_ebc_exit:
 	.byte	0x20
 	.byte	0xc6
 	.byte	0xb
-	.4byte	0xdc8c
+	.4byte	0xdc98
 	.uleb128 0xe
 	.4byte	.LASF2934
 	.byte	0xc6
@@ -39180,12 +39377,12 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0xc6
 	.byte	0x2a
-	.4byte	0xdcbd
+	.4byte	0xdcc9
 	.uleb128 0x20
 	.string	"sgl"
 	.byte	0xc6
 	.byte	0x2b
-	.4byte	0xdcbd
+	.4byte	0xdcc9
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF2938
@@ -39202,16 +39399,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc43
+	.4byte	0xdc4f
 	.uleb128 0x14
 	.4byte	0x458
-	.4byte	0xdce6
+	.4byte	0xdcf2
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdce6
+	.4byte	0xdcf2
 	.uleb128 0x11
 	.4byte	0x330
 	.uleb128 0x11
@@ -39222,9 +39419,9 @@ __exitcall_ebc_exit:
 	.4byte	0x325
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdcc3
+	.4byte	0xdccf
 	.uleb128 0x10
-	.4byte	0xdd11
+	.4byte	0xdd1d
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -39238,10 +39435,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdcf2
+	.4byte	0xdcfe
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdd3f
+	.4byte	0xdd4b
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -39257,14 +39454,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd17
+	.4byte	0xdd23
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdd6d
+	.4byte	0xdd79
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0xdd6d
+	.4byte	0xdd79
 	.uleb128 0x11
 	.4byte	0x458
 	.uleb128 0x11
@@ -39276,13 +39473,13 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc8c
+	.4byte	0xdc98
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd45
+	.4byte	0xdd51
 	.uleb128 0x14
 	.4byte	0x325
-	.4byte	0xdda1
+	.4byte	0xddad
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -39292,15 +39489,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdc1a
+	.4byte	0xdc26
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd79
+	.4byte	0xdd85
 	.uleb128 0x10
-	.4byte	0xddc6
+	.4byte	0xddd2
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -39308,49 +39505,49 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdc1a
+	.4byte	0xdc26
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdda7
+	.4byte	0xddb3
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xddef
+	.4byte	0xddfb
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0xdcbd
+	.4byte	0xdcc9
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdc1a
+	.4byte	0xdc26
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xddcc
+	.4byte	0xddd8
 	.uleb128 0x10
-	.4byte	0xde14
+	.4byte	0xde20
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0xdcbd
+	.4byte	0xdcc9
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdc1a
+	.4byte	0xdc26
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xddf5
+	.4byte	0xde01
 	.uleb128 0x14
 	.4byte	0x325
-	.4byte	0xde3d
+	.4byte	0xde49
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -39358,15 +39555,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdc1a
+	.4byte	0xdc26
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde1a
+	.4byte	0xde26
 	.uleb128 0x10
-	.4byte	0xde5d
+	.4byte	0xde69
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -39374,27 +39571,27 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdc1a
+	.4byte	0xdc26
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde43
+	.4byte	0xde4f
 	.uleb128 0x10
-	.4byte	0xde7d
+	.4byte	0xde89
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0xdcbd
+	.4byte	0xdcc9
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdc1a
+	.4byte	0xdc26
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde63
+	.4byte	0xde6f
 	.uleb128 0x10
-	.4byte	0xde9d
+	.4byte	0xdea9
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -39402,14 +39599,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdc1a
+	.4byte	0xdc26
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde83
+	.4byte	0xde8f
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdeb7
+	.4byte	0xdec3
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -39417,10 +39614,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdea3
+	.4byte	0xdeaf
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xded1
+	.4byte	0xdedd
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -39428,10 +39625,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdebd
+	.4byte	0xdec9
 	.uleb128 0x14
 	.4byte	0x458
-	.4byte	0xdefa
+	.4byte	0xdf06
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -39445,9 +39642,9 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xded7
+	.4byte	0xdee3
 	.uleb128 0x10
-	.4byte	0xdf15
+	.4byte	0xdf21
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -39457,7 +39654,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdf00
+	.4byte	0xdf0c
 	.uleb128 0x19
 	.4byte	.LASF2940
 	.byte	0xa
@@ -39479,20 +39676,20 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2944
 	.byte	0xc7
 	.byte	0x7
-	.4byte	0xdf4c
+	.4byte	0xdf58
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdf3c
+	.4byte	0xdf48
 	.uleb128 0x24
 	.4byte	.LASF2945
 	.uleb128 0x19
 	.4byte	.LASF2946
 	.byte	0xc7
 	.byte	0x8
-	.4byte	0xdf62
+	.4byte	0xdf6e
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdf52
+	.4byte	0xdf5e
 	.uleb128 0x19
 	.4byte	.LASF2947
 	.byte	0xc7
@@ -39508,7 +39705,7 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0xc9
 	.byte	0xf
-	.4byte	0xdfaf
+	.4byte	0xdfbb
 	.uleb128 0xe
 	.4byte	.LASF2880
 	.byte	0xc9
@@ -39533,7 +39730,7 @@ __exitcall_ebc_exit:
 	.byte	0xa0
 	.byte	0xc9
 	.byte	0x15
-	.4byte	0xe0f3
+	.4byte	0xe0ff
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xc9
@@ -39544,19 +39741,19 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2951
 	.byte	0xc9
 	.byte	0x17
-	.4byte	0xe1b4
+	.4byte	0xe1c0
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF2952
 	.byte	0xc9
 	.byte	0x18
-	.4byte	0xdbb4
+	.4byte	0xdbc0
 	.byte	0x10
 	.uleb128 0x20
 	.string	"fb"
 	.byte	0xc9
 	.byte	0x19
-	.4byte	0xe1ba
+	.4byte	0xe1c6
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF2953
@@ -39696,7 +39893,7 @@ __exitcall_ebc_exit:
 	.byte	0x70
 	.byte	0xb
 	.byte	0x17
-	.4byte	0xe1b4
+	.4byte	0xe1c0
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xb
@@ -39725,61 +39922,61 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2964
 	.byte	0xb
 	.byte	0x1d
-	.4byte	0xe1cf
+	.4byte	0xe1db
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF2965
 	.byte	0xb
 	.byte	0x1e
-	.4byte	0xe1cf
+	.4byte	0xe1db
 	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF2966
 	.byte	0xb
 	.byte	0x1f
-	.4byte	0xe1da
+	.4byte	0xe1e6
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF2967
 	.byte	0xb
 	.byte	0x21
-	.4byte	0xe1fa
+	.4byte	0xe206
 	.byte	0x30
 	.uleb128 0xe
 	.4byte	.LASF2968
 	.byte	0xb
 	.byte	0x22
-	.4byte	0xe20b
+	.4byte	0xe217
 	.byte	0x38
 	.uleb128 0xe
 	.4byte	.LASF2969
 	.byte	0xb
 	.byte	0x23
-	.4byte	0xe230
+	.4byte	0xe23c
 	.byte	0x40
 	.uleb128 0xe
 	.4byte	.LASF2970
 	.byte	0xb
 	.byte	0x24
-	.4byte	0xe24b
+	.4byte	0xe257
 	.byte	0x48
 	.uleb128 0xe
 	.4byte	.LASF2971
 	.byte	0xb
 	.byte	0x25
-	.4byte	0xe261
+	.4byte	0xe26d
 	.byte	0x50
 	.uleb128 0xe
 	.4byte	.LASF2972
 	.byte	0xb
 	.byte	0x26
-	.4byte	0xe285
+	.4byte	0xe291
 	.byte	0x58
 	.uleb128 0xe
 	.4byte	.LASF2973
 	.byte	0xb
 	.byte	0x27
-	.4byte	0xe29b
+	.4byte	0xe2a7
 	.byte	0x60
 	.uleb128 0xe
 	.4byte	.LASF2974
@@ -39790,10 +39987,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe0f3
+	.4byte	0xe0ff
 	.uleb128 0x5
-	.4byte	0xdf7e
-	.4byte	0xe1ca
+	.4byte	0xdf8a
+	.4byte	0xe1d6
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
@@ -39802,38 +39999,38 @@ __exitcall_ebc_exit:
 	.string	"clk"
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1ca
+	.4byte	0xe1d6
 	.uleb128 0x24
 	.4byte	.LASF2975
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1d5
+	.4byte	0xe1e1
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.uleb128 0x11
-	.4byte	0xe1b4
+	.4byte	0xe1c0
 	.uleb128 0x11
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdfaf
+	.4byte	0xdfbb
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1e0
+	.4byte	0xe1ec
 	.uleb128 0x10
-	.4byte	0xe20b
+	.4byte	0xe217
 	.uleb128 0x11
-	.4byte	0xe1b4
+	.4byte	0xe1c0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe200
+	.4byte	0xe20c
 	.uleb128 0x10
-	.4byte	0xe230
+	.4byte	0xe23c
 	.uleb128 0x11
-	.4byte	0xe1b4
+	.4byte	0xe1c0
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -39845,11 +40042,11 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe211
+	.4byte	0xe21d
 	.uleb128 0x10
-	.4byte	0xe24b
+	.4byte	0xe257
 	.uleb128 0x11
-	.4byte	0xe1b4
+	.4byte	0xe1c0
 	.uleb128 0x11
 	.4byte	0x13f
 	.uleb128 0x11
@@ -39857,22 +40054,22 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe236
+	.4byte	0xe242
 	.uleb128 0x10
-	.4byte	0xe261
+	.4byte	0xe26d
 	.uleb128 0x11
-	.4byte	0xe1b4
+	.4byte	0xe1c0
 	.uleb128 0x11
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe251
+	.4byte	0xe25d
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xe285
+	.4byte	0xe291
 	.uleb128 0x11
-	.4byte	0xe1b4
+	.4byte	0xe1c0
 	.uleb128 0x11
 	.4byte	0x35e3
 	.uleb128 0x11
@@ -39882,23 +40079,23 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe267
+	.4byte	0xe273
 	.uleb128 0x10
-	.4byte	0xe29b
+	.4byte	0xe2a7
 	.uleb128 0x11
-	.4byte	0xe1b4
+	.4byte	0xe1c0
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe28b
+	.4byte	0xe297
 	.uleb128 0x26
 	.4byte	.LASF2976
 	.2byte	0x280
 	.byte	0x1
 	.byte	0x33
-	.4byte	0xe4e2
+	.4byte	0xe4ee
 	.uleb128 0xe
 	.4byte	.LASF2977
 	.byte	0x1
@@ -40071,7 +40268,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF3002
 	.byte	0x1
 	.byte	0x52
-	.4byte	0xe4e2
+	.4byte	0xe4ee
 	.byte	0xb8
 	.uleb128 0xe
 	.4byte	.LASF3003
@@ -40095,13 +40292,13 @@ __exitcall_ebc_exit:
 	.4byte	.LASF3006
 	.byte	0x1
 	.byte	0x56
-	.4byte	0xe4f2
+	.4byte	0xe4fe
 	.byte	0xd8
 	.uleb128 0xe
 	.4byte	.LASF3007
 	.byte	0x1
 	.byte	0x57
-	.4byte	0xe4f2
+	.4byte	0xe4fe
 	.byte	0xe0
 	.uleb128 0xe
 	.4byte	.LASF3008
@@ -40178,7 +40375,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x458
-	.4byte	0xe4f2
+	.4byte	0xe4fe
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
@@ -40191,7 +40388,7 @@ __exitcall_ebc_exit:
 	.2byte	0x338
 	.byte	0x1
 	.byte	0x72
-	.4byte	0xe542
+	.4byte	0xe54e
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x1
@@ -40202,38 +40399,38 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2951
 	.byte	0x1
 	.byte	0x74
-	.4byte	0xe1b4
+	.4byte	0xe1c0
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF2952
 	.byte	0x1
 	.byte	0x75
-	.4byte	0xdbb4
+	.4byte	0xdbc0
 	.byte	0x10
 	.uleb128 0xe
 	.4byte	.LASF3020
 	.byte	0x1
 	.byte	0x76
-	.4byte	0xdfaf
+	.4byte	0xdfbb
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF1788
 	.byte	0x1
 	.byte	0x77
-	.4byte	0xe2a1
+	.4byte	0xe2ad
 	.byte	0xb8
 	.byte	0
 	.uleb128 0x4c
 	.4byte	.LASF3021
 	.byte	0x1
 	.byte	0x7a
-	.4byte	0xe557
+	.4byte	0xe563
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	global_ebc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe4f8
+	.4byte	0xe504
 	.uleb128 0x4c
 	.4byte	.LASF3022
 	.byte	0x1
@@ -40301,7 +40498,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0xa16
+	.2byte	0xa1a
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
@@ -40309,7 +40506,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0xa20
+	.2byte	0xa24
 	.4byte	0xc680
 	.uleb128 0x9
 	.byte	0x3
@@ -40317,7 +40514,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0xa3d
+	.2byte	0xa41
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
@@ -40325,7 +40522,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0xa43
+	.2byte	0xa47
 	.4byte	0xc680
 	.uleb128 0x9
 	.byte	0x3
@@ -40333,7 +40530,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0xa52
+	.2byte	0xa56
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40341,7 +40538,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0xa5d
+	.2byte	0xa61
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40349,7 +40546,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0xa6b
+	.2byte	0xa6f
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40357,7 +40554,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0xa8e
+	.2byte	0xa92
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40365,7 +40562,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0xa98
+	.2byte	0xa9c
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40373,7 +40570,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0xaa1
+	.2byte	0xaa5
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40381,7 +40578,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0xaaa
+	.2byte	0xaae
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40389,32 +40586,32 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0xc57
+	.2byte	0xc5b
 	.4byte	0xa5cc
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_pm
 	.uleb128 0x5
 	.4byte	0xb20b
-	.4byte	0xe71f
+	.4byte	0xe72b
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe70f
+	.4byte	0xe71b
 	.uleb128 0x4d
 	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0xc5c
-	.4byte	0xe71f
+	.2byte	0xc60
+	.4byte	0xe72b
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_match
 	.uleb128 0x4d
 	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0xc62
+	.2byte	0xc66
 	.4byte	0xd70e
 	.uleb128 0x9
 	.byte	0x3
@@ -40422,15 +40619,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0xc76
+	.2byte	0xc7a
 	.4byte	0x458
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init3190
+	.8byte	__addressable_ebc_init3194
 	.uleb128 0x4d
 	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0xc77
+	.2byte	0xc7b
 	.4byte	0x4ac
 	.uleb128 0x9
 	.byte	0x3
@@ -40438,2402 +40635,2402 @@ __exitcall_ebc_exit:
 	.uleb128 0x4e
 	.4byte	.LASF3096
 	.byte	0x1
-	.2byte	0xc71
+	.2byte	0xc75
 	.8byte	.LFB2867
 	.8byte	.LFE2867-.LFB2867
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe7a8
+	.4byte	0xe7b4
 	.uleb128 0x4f
 	.8byte	.LVL64
-	.4byte	0x15389
+	.4byte	0x1556c
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0xc6c
+	.2byte	0xc70
 	.4byte	0xc6
 	.8byte	.LFB2866
 	.8byte	.LFE2866-.LFB2866
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe7d8
+	.4byte	0xe7e4
 	.uleb128 0x4f
-	.8byte	.LVL361
-	.4byte	0x15395
+	.8byte	.LVL383
+	.4byte	0x15578
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0xc4b
+	.2byte	0xc4f
 	.4byte	0xc6
 	.8byte	.LFB2865
 	.8byte	.LFE2865-.LFB2865
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xc4b
+	.2byte	0xc4f
 	.4byte	0xa5e0
 	.4byte	.LLST11
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xc4d
-	.4byte	0xe557
+	.2byte	0xc51
+	.4byte	0xe563
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xc4e
-	.4byte	0xe874
+	.2byte	0xc52
+	.4byte	0xe880
 	.uleb128 0x54
-	.4byte	0x14c45
-	.8byte	.LBB980
-	.8byte	.LBE980-.LBB980
+	.4byte	0x14e28
+	.8byte	.LBB1011
+	.8byte	.LBE1011-.LBB1011
 	.byte	0x1
-	.2byte	0xc4d
-	.4byte	0xe844
+	.2byte	0xc51
+	.4byte	0xe850
 	.uleb128 0x55
-	.4byte	0x14c56
+	.4byte	0x14e39
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14804
-	.8byte	.LBB982
-	.8byte	.LBE982-.LBB982
+	.4byte	0x149e7
+	.8byte	.LBB1013
+	.8byte	.LBE1013-.LBB1013
 	.byte	0x1
-	.2byte	0xc50
-	.4byte	0xe866
+	.2byte	0xc54
+	.4byte	0xe872
 	.uleb128 0x55
-	.4byte	0x14811
+	.4byte	0x149f4
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL68
-	.4byte	0x153a1
+	.4byte	0x15584
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe2a1
+	.4byte	0xe2ad
 	.uleb128 0x51
 	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0xc3a
+	.2byte	0xc3e
 	.4byte	0xc6
 	.8byte	.LFB2864
 	.8byte	.LFE2864-.LFB2864
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe981
+	.4byte	0xe98d
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xc3a
+	.2byte	0xc3e
 	.4byte	0xa5e0
-	.4byte	.LLST192
+	.4byte	.LLST200
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xc3c
-	.4byte	0xe557
+	.2byte	0xc40
+	.4byte	0xe563
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xc3d
-	.4byte	0xe874
+	.2byte	0xc41
+	.4byte	0xe880
 	.uleb128 0x56
 	.4byte	.LASF3050
-	.4byte	0xe991
+	.4byte	0xe99d
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35541
+	.8byte	__func__.35542
 	.uleb128 0x54
-	.4byte	0x14c45
-	.8byte	.LBB1510
-	.8byte	.LBE1510-.LBB1510
+	.4byte	0x14e28
+	.8byte	.LBB1572
+	.8byte	.LBE1572-.LBB1572
 	.byte	0x1
-	.2byte	0xc3c
-	.4byte	0xe8f9
+	.2byte	0xc40
+	.4byte	0xe905
 	.uleb128 0x55
-	.4byte	0x14c56
+	.4byte	0x14e39
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1481e
-	.8byte	.LBB1512
-	.8byte	.LBE1512-.LBB1512
+	.4byte	0x14a01
+	.8byte	.LBB1574
+	.8byte	.LBE1574-.LBB1574
 	.byte	0x1
-	.2byte	0xc45
-	.4byte	0xe91b
+	.2byte	0xc49
+	.4byte	0xe927
 	.uleb128 0x55
-	.4byte	0x1482b
+	.4byte	0x14a0e
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x144c7
-	.8byte	.LBB1514
-	.8byte	.LBE1514-.LBB1514
+	.4byte	0x146aa
+	.8byte	.LBB1576
+	.8byte	.LBE1576-.LBB1576
 	.byte	0x1
-	.2byte	0xc41
-	.4byte	0xe966
+	.2byte	0xc45
+	.4byte	0xe972
 	.uleb128 0x55
-	.4byte	0x144e3
+	.4byte	0x146c6
 	.uleb128 0x55
-	.4byte	0x144d7
+	.4byte	0x146ba
 	.uleb128 0x57
-	.8byte	.LBB1515
-	.8byte	.LBE1515-.LBB1515
+	.8byte	.LBB1577
+	.8byte	.LBE1577-.LBB1577
 	.uleb128 0x58
-	.4byte	0x144ef
+	.4byte	0x146d2
 	.uleb128 0x4f
-	.8byte	.LVL592
-	.4byte	0x151b8
+	.8byte	.LVL614
+	.4byte	0x1539b
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL590
-	.4byte	0x153a1
+	.8byte	.LVL612
+	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL591
-	.4byte	0x153a1
+	.8byte	.LVL613
+	.4byte	0x15584
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xe991
+	.4byte	0xe99d
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xb
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe981
+	.4byte	0xe98d
 	.uleb128 0x50
 	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0xc33
+	.2byte	0xc37
 	.4byte	0xc6
 	.8byte	.LFB2863
 	.8byte	.LFE2863-.LFB2863
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe9d6
+	.4byte	0xe9e2
 	.uleb128 0x59
 	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0xc33
+	.2byte	0xc37
 	.4byte	0xd78a
 	.4byte	.LLST13
 	.uleb128 0x4f
 	.8byte	.LVL74
-	.4byte	0x153ae
+	.4byte	0x15591
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0xbb2
+	.2byte	0xbb6
 	.4byte	0xc6
 	.8byte	.LFB2862
 	.8byte	.LFE2862-.LFB2862
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfdb3
+	.4byte	0xfdbf
 	.uleb128 0x59
 	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0xbb2
+	.2byte	0xbb6
 	.4byte	0xd78a
-	.4byte	.LLST195
+	.4byte	.LLST203
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xbb4
+	.2byte	0xbb8
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0xbb5
+	.2byte	0xbb9
 	.4byte	0xb904
 	.uleb128 0x5a
 	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0xbb6
+	.2byte	0xbba
 	.4byte	0xd78a
-	.4byte	.LLST196
+	.4byte	.LLST204
 	.uleb128 0x48
 	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0xbb7
+	.2byte	0xbbb
 	.4byte	0xb904
 	.uleb128 0x5a
 	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0xbb8
+	.2byte	0xbbc
 	.4byte	0xc0b3
-	.4byte	.LLST197
+	.4byte	.LLST205
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xbb9
-	.4byte	0xe557
+	.2byte	0xbbd
+	.4byte	0xe563
 	.uleb128 0x5a
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xbba
-	.4byte	0xe874
-	.4byte	.LLST198
+	.2byte	0xbbe
+	.4byte	0xe880
+	.4byte	.LLST206
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xbbb
-	.4byte	0xe1f4
+	.2byte	0xbbf
+	.4byte	0xe200
 	.uleb128 0x5a
 	.4byte	.LASF976
 	.byte	0x1
-	.2byte	0xbbc
+	.2byte	0xbc0
 	.4byte	0xbd30
-	.4byte	.LLST199
+	.4byte	.LLST207
 	.uleb128 0x48
 	.4byte	.LASF2435
 	.byte	0x1
-	.2byte	0xbbd
+	.2byte	0xbc1
 	.4byte	0xbcd0
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xbbe
+	.2byte	0xbc2
 	.4byte	0xc6
 	.uleb128 0x5a
 	.4byte	.LASF1001
 	.byte	0x1
-	.2byte	0xbbf
+	.2byte	0xbc3
 	.4byte	0xc6
-	.4byte	.LLST200
+	.4byte	.LLST208
 	.uleb128 0x5b
 	.string	"i"
 	.byte	0x1
-	.2byte	0xbc0
+	.2byte	0xbc4
 	.4byte	0xc6
-	.4byte	.LLST201
+	.4byte	.LLST209
 	.uleb128 0x5c
-	.4byte	0x14c63
-	.8byte	.LBB1660
-	.4byte	.Ldebug_ranges0+0xcb0
+	.4byte	0x14e46
+	.8byte	.LBB1722
+	.4byte	.Ldebug_ranges0+0xd50
 	.byte	0x1
-	.2byte	0xbc2
-	.4byte	0xeaef
+	.2byte	0xbc6
+	.4byte	0xeafb
 	.uleb128 0x55
-	.4byte	0x14c8c
+	.4byte	0x14e6f
 	.uleb128 0x55
-	.4byte	0x14c80
+	.4byte	0x14e63
 	.uleb128 0x55
-	.4byte	0x14c74
+	.4byte	0x14e57
 	.uleb128 0x4f
-	.8byte	.LVL598
-	.4byte	0x153ba
+	.8byte	.LVL620
+	.4byte	0x1559d
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14b3d
-	.8byte	.LBB1664
-	.8byte	.LBE1664-.LBB1664
+	.4byte	0x14d20
+	.8byte	.LBB1726
+	.8byte	.LBE1726-.LBB1726
 	.byte	0x1
-	.2byte	0xbd4
-	.4byte	0xeb2e
+	.2byte	0xbd8
+	.4byte	0xeb3a
 	.uleb128 0x55
-	.4byte	0x14b4d
+	.4byte	0x14d30
 	.uleb128 0x5d
-	.4byte	0x14c45
-	.8byte	.LBB1665
-	.8byte	.LBE1665-.LBB1665
+	.4byte	0x14e28
+	.8byte	.LBB1727
+	.8byte	.LBE1727-.LBB1727
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x55
-	.4byte	0x14c56
+	.4byte	0x14e39
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14b60
-	.8byte	.LBB1667
-	.8byte	.LBE1667-.LBB1667
+	.4byte	0x14d43
+	.8byte	.LBB1729
+	.8byte	.LBE1729-.LBB1729
 	.byte	0x1
-	.2byte	0xbef
-	.4byte	0xeb6e
+	.2byte	0xbf3
+	.4byte	0xeb7a
 	.uleb128 0x55
-	.4byte	0x14b71
+	.4byte	0x14d54
 	.uleb128 0x5e
-	.4byte	0x14c45
-	.8byte	.LBB1668
-	.8byte	.LBE1668-.LBB1668
+	.4byte	0x14e28
+	.8byte	.LBB1730
+	.8byte	.LBE1730-.LBB1730
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x55
-	.4byte	0x14c56
+	.4byte	0x14e39
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x117be
-	.8byte	.LBB1670
-	.4byte	.Ldebug_ranges0+0xce0
+	.4byte	0x119a1
+	.8byte	.LBB1732
+	.4byte	.Ldebug_ranges0+0xd80
 	.byte	0x1
-	.2byte	0xc03
-	.4byte	0xf543
+	.2byte	0xc07
+	.4byte	0xf54f
 	.uleb128 0x55
-	.4byte	0x117cf
+	.4byte	0x119b2
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xce0
+	.4byte	.Ldebug_ranges0+0xd80
 	.uleb128 0x58
-	.4byte	0x117db
+	.4byte	0x119be
 	.uleb128 0x5c
-	.4byte	0x14b84
-	.8byte	.LBB1672
-	.4byte	.Ldebug_ranges0+0xd30
+	.4byte	0x14d67
+	.8byte	.LBB1734
+	.4byte	.Ldebug_ranges0+0xdd0
 	.byte	0x1
 	.2byte	0x8f5
-	.4byte	0xebfe
+	.4byte	0xec0a
 	.uleb128 0x55
-	.4byte	0x14bac
+	.4byte	0x14d8f
 	.uleb128 0x55
-	.4byte	0x14ba0
+	.4byte	0x14d83
 	.uleb128 0x55
-	.4byte	0x14b95
+	.4byte	0x14d78
 	.uleb128 0x60
-	.4byte	0x14bb9
-	.8byte	.LBB1673
-	.4byte	.Ldebug_ranges0+0xd30
+	.4byte	0x14d9c
+	.8byte	.LBB1735
+	.4byte	.Ldebug_ranges0+0xdd0
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14bed
+	.4byte	0x14dd0
 	.uleb128 0x55
-	.4byte	0x14be1
+	.4byte	0x14dc4
 	.uleb128 0x55
-	.4byte	0x14bd5
+	.4byte	0x14db8
 	.uleb128 0x55
-	.4byte	0x14bca
+	.4byte	0x14dad
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xd30
+	.4byte	.Ldebug_ranges0+0xdd0
 	.uleb128 0x58
-	.4byte	0x14bf8
+	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL623
-	.4byte	0x153c7
+	.8byte	.LVL645
+	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14b84
-	.8byte	.LBB1684
-	.8byte	.LBE1684-.LBB1684
+	.4byte	0x14d67
+	.8byte	.LBB1746
+	.8byte	.LBE1746-.LBB1746
 	.byte	0x1
 	.2byte	0x8f8
-	.4byte	0xec7b
+	.4byte	0xec87
 	.uleb128 0x55
-	.4byte	0x14bac
+	.4byte	0x14d8f
 	.uleb128 0x55
-	.4byte	0x14ba0
+	.4byte	0x14d83
 	.uleb128 0x55
-	.4byte	0x14b95
+	.4byte	0x14d78
 	.uleb128 0x5e
-	.4byte	0x14bb9
-	.8byte	.LBB1685
-	.8byte	.LBE1685-.LBB1685
+	.4byte	0x14d9c
+	.8byte	.LBB1747
+	.8byte	.LBE1747-.LBB1747
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14bed
+	.4byte	0x14dd0
 	.uleb128 0x55
-	.4byte	0x14be1
+	.4byte	0x14dc4
 	.uleb128 0x55
-	.4byte	0x14bd5
+	.4byte	0x14db8
 	.uleb128 0x55
-	.4byte	0x14bca
+	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1686
-	.8byte	.LBE1686-.LBB1686
+	.8byte	.LBB1748
+	.8byte	.LBE1748-.LBB1748
 	.uleb128 0x58
-	.4byte	0x14bf8
+	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL624
-	.4byte	0x153c7
+	.8byte	.LVL646
+	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14b84
-	.8byte	.LBB1687
-	.8byte	.LBE1687-.LBB1687
+	.4byte	0x14d67
+	.8byte	.LBB1749
+	.8byte	.LBE1749-.LBB1749
 	.byte	0x1
 	.2byte	0x8fb
-	.4byte	0xecf8
+	.4byte	0xed04
 	.uleb128 0x55
-	.4byte	0x14bac
+	.4byte	0x14d8f
 	.uleb128 0x55
-	.4byte	0x14ba0
+	.4byte	0x14d83
 	.uleb128 0x55
-	.4byte	0x14b95
+	.4byte	0x14d78
 	.uleb128 0x5e
-	.4byte	0x14bb9
-	.8byte	.LBB1688
-	.8byte	.LBE1688-.LBB1688
+	.4byte	0x14d9c
+	.8byte	.LBB1750
+	.8byte	.LBE1750-.LBB1750
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14bed
+	.4byte	0x14dd0
 	.uleb128 0x55
-	.4byte	0x14be1
+	.4byte	0x14dc4
 	.uleb128 0x55
-	.4byte	0x14bd5
+	.4byte	0x14db8
 	.uleb128 0x55
-	.4byte	0x14bca
+	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1689
-	.8byte	.LBE1689-.LBB1689
+	.8byte	.LBB1751
+	.8byte	.LBE1751-.LBB1751
 	.uleb128 0x58
-	.4byte	0x14bf8
+	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL625
-	.4byte	0x153c7
+	.8byte	.LVL647
+	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14b84
-	.8byte	.LBB1690
-	.8byte	.LBE1690-.LBB1690
+	.4byte	0x14d67
+	.8byte	.LBB1752
+	.8byte	.LBE1752-.LBB1752
 	.byte	0x1
 	.2byte	0x8fe
-	.4byte	0xed75
+	.4byte	0xed81
 	.uleb128 0x55
-	.4byte	0x14bac
+	.4byte	0x14d8f
 	.uleb128 0x55
-	.4byte	0x14ba0
+	.4byte	0x14d83
 	.uleb128 0x55
-	.4byte	0x14b95
+	.4byte	0x14d78
 	.uleb128 0x5e
-	.4byte	0x14bb9
-	.8byte	.LBB1691
-	.8byte	.LBE1691-.LBB1691
+	.4byte	0x14d9c
+	.8byte	.LBB1753
+	.8byte	.LBE1753-.LBB1753
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14bed
+	.4byte	0x14dd0
 	.uleb128 0x55
-	.4byte	0x14be1
+	.4byte	0x14dc4
 	.uleb128 0x55
-	.4byte	0x14bd5
+	.4byte	0x14db8
 	.uleb128 0x55
-	.4byte	0x14bca
+	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1692
-	.8byte	.LBE1692-.LBB1692
+	.8byte	.LBB1754
+	.8byte	.LBE1754-.LBB1754
 	.uleb128 0x58
-	.4byte	0x14bf8
+	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL626
-	.4byte	0x153c7
+	.8byte	.LVL648
+	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14b84
-	.8byte	.LBB1693
-	.8byte	.LBE1693-.LBB1693
+	.4byte	0x14d67
+	.8byte	.LBB1755
+	.8byte	.LBE1755-.LBB1755
 	.byte	0x1
 	.2byte	0x901
-	.4byte	0xedf2
+	.4byte	0xedfe
 	.uleb128 0x55
-	.4byte	0x14bac
+	.4byte	0x14d8f
 	.uleb128 0x55
-	.4byte	0x14ba0
+	.4byte	0x14d83
 	.uleb128 0x55
-	.4byte	0x14b95
+	.4byte	0x14d78
 	.uleb128 0x5e
-	.4byte	0x14bb9
-	.8byte	.LBB1694
-	.8byte	.LBE1694-.LBB1694
+	.4byte	0x14d9c
+	.8byte	.LBB1756
+	.8byte	.LBE1756-.LBB1756
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14bed
+	.4byte	0x14dd0
 	.uleb128 0x55
-	.4byte	0x14be1
+	.4byte	0x14dc4
 	.uleb128 0x55
-	.4byte	0x14bd5
+	.4byte	0x14db8
 	.uleb128 0x55
-	.4byte	0x14bca
+	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1695
-	.8byte	.LBE1695-.LBB1695
+	.8byte	.LBB1757
+	.8byte	.LBE1757-.LBB1757
 	.uleb128 0x58
-	.4byte	0x14bf8
+	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL627
-	.4byte	0x153c7
+	.8byte	.LVL649
+	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14b84
-	.8byte	.LBB1696
-	.8byte	.LBE1696-.LBB1696
+	.4byte	0x14d67
+	.8byte	.LBB1758
+	.8byte	.LBE1758-.LBB1758
 	.byte	0x1
 	.2byte	0x904
-	.4byte	0xee6f
+	.4byte	0xee7b
 	.uleb128 0x55
-	.4byte	0x14bac
+	.4byte	0x14d8f
 	.uleb128 0x55
-	.4byte	0x14ba0
+	.4byte	0x14d83
 	.uleb128 0x55
-	.4byte	0x14b95
+	.4byte	0x14d78
 	.uleb128 0x5e
-	.4byte	0x14bb9
-	.8byte	.LBB1697
-	.8byte	.LBE1697-.LBB1697
+	.4byte	0x14d9c
+	.8byte	.LBB1759
+	.8byte	.LBE1759-.LBB1759
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14bed
+	.4byte	0x14dd0
 	.uleb128 0x55
-	.4byte	0x14be1
+	.4byte	0x14dc4
 	.uleb128 0x55
-	.4byte	0x14bd5
+	.4byte	0x14db8
 	.uleb128 0x55
-	.4byte	0x14bca
+	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1698
-	.8byte	.LBE1698-.LBB1698
+	.8byte	.LBB1760
+	.8byte	.LBE1760-.LBB1760
 	.uleb128 0x58
-	.4byte	0x14bf8
+	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL628
-	.4byte	0x153c7
+	.8byte	.LVL650
+	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14b84
-	.8byte	.LBB1699
-	.8byte	.LBE1699-.LBB1699
+	.4byte	0x14d67
+	.8byte	.LBB1761
+	.8byte	.LBE1761-.LBB1761
 	.byte	0x1
 	.2byte	0x907
-	.4byte	0xeeec
+	.4byte	0xeef8
 	.uleb128 0x55
-	.4byte	0x14bac
+	.4byte	0x14d8f
 	.uleb128 0x55
-	.4byte	0x14ba0
+	.4byte	0x14d83
 	.uleb128 0x55
-	.4byte	0x14b95
+	.4byte	0x14d78
 	.uleb128 0x5e
-	.4byte	0x14bb9
-	.8byte	.LBB1700
-	.8byte	.LBE1700-.LBB1700
+	.4byte	0x14d9c
+	.8byte	.LBB1762
+	.8byte	.LBE1762-.LBB1762
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14bed
+	.4byte	0x14dd0
 	.uleb128 0x55
-	.4byte	0x14be1
+	.4byte	0x14dc4
 	.uleb128 0x55
-	.4byte	0x14bd5
+	.4byte	0x14db8
 	.uleb128 0x55
-	.4byte	0x14bca
+	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1701
-	.8byte	.LBE1701-.LBB1701
+	.8byte	.LBB1763
+	.8byte	.LBE1763-.LBB1763
 	.uleb128 0x58
-	.4byte	0x14bf8
+	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL629
-	.4byte	0x153c7
+	.8byte	.LVL651
+	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14b84
-	.8byte	.LBB1702
-	.8byte	.LBE1702-.LBB1702
+	.4byte	0x14d67
+	.8byte	.LBB1764
+	.8byte	.LBE1764-.LBB1764
 	.byte	0x1
 	.2byte	0x90a
-	.4byte	0xef69
+	.4byte	0xef75
 	.uleb128 0x55
-	.4byte	0x14bac
+	.4byte	0x14d8f
 	.uleb128 0x55
-	.4byte	0x14ba0
+	.4byte	0x14d83
 	.uleb128 0x55
-	.4byte	0x14b95
+	.4byte	0x14d78
 	.uleb128 0x5e
-	.4byte	0x14bb9
-	.8byte	.LBB1703
-	.8byte	.LBE1703-.LBB1703
+	.4byte	0x14d9c
+	.8byte	.LBB1765
+	.8byte	.LBE1765-.LBB1765
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14bed
+	.4byte	0x14dd0
 	.uleb128 0x55
-	.4byte	0x14be1
+	.4byte	0x14dc4
 	.uleb128 0x55
-	.4byte	0x14bd5
+	.4byte	0x14db8
 	.uleb128 0x55
-	.4byte	0x14bca
+	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1704
-	.8byte	.LBE1704-.LBB1704
+	.8byte	.LBB1766
+	.8byte	.LBE1766-.LBB1766
 	.uleb128 0x58
-	.4byte	0x14bf8
+	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL630
-	.4byte	0x153c7
+	.8byte	.LVL652
+	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14b84
-	.8byte	.LBB1705
-	.8byte	.LBE1705-.LBB1705
+	.4byte	0x14d67
+	.8byte	.LBB1767
+	.8byte	.LBE1767-.LBB1767
 	.byte	0x1
 	.2byte	0x90d
-	.4byte	0xefe6
+	.4byte	0xeff2
 	.uleb128 0x55
-	.4byte	0x14bac
+	.4byte	0x14d8f
 	.uleb128 0x55
-	.4byte	0x14ba0
+	.4byte	0x14d83
 	.uleb128 0x55
-	.4byte	0x14b95
+	.4byte	0x14d78
 	.uleb128 0x5e
-	.4byte	0x14bb9
-	.8byte	.LBB1706
-	.8byte	.LBE1706-.LBB1706
+	.4byte	0x14d9c
+	.8byte	.LBB1768
+	.8byte	.LBE1768-.LBB1768
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14bed
+	.4byte	0x14dd0
 	.uleb128 0x55
-	.4byte	0x14be1
+	.4byte	0x14dc4
 	.uleb128 0x55
-	.4byte	0x14bd5
+	.4byte	0x14db8
 	.uleb128 0x55
-	.4byte	0x14bca
+	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1707
-	.8byte	.LBE1707-.LBB1707
+	.8byte	.LBB1769
+	.8byte	.LBE1769-.LBB1769
 	.uleb128 0x58
-	.4byte	0x14bf8
+	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL631
-	.4byte	0x153c7
+	.8byte	.LVL653
+	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14b84
-	.8byte	.LBB1708
-	.8byte	.LBE1708-.LBB1708
+	.4byte	0x14d67
+	.8byte	.LBB1770
+	.8byte	.LBE1770-.LBB1770
 	.byte	0x1
 	.2byte	0x910
-	.4byte	0xf063
+	.4byte	0xf06f
 	.uleb128 0x55
-	.4byte	0x14bac
+	.4byte	0x14d8f
 	.uleb128 0x55
-	.4byte	0x14ba0
+	.4byte	0x14d83
 	.uleb128 0x55
-	.4byte	0x14b95
+	.4byte	0x14d78
 	.uleb128 0x5e
-	.4byte	0x14bb9
-	.8byte	.LBB1709
-	.8byte	.LBE1709-.LBB1709
+	.4byte	0x14d9c
+	.8byte	.LBB1771
+	.8byte	.LBE1771-.LBB1771
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14bed
+	.4byte	0x14dd0
 	.uleb128 0x55
-	.4byte	0x14be1
+	.4byte	0x14dc4
 	.uleb128 0x55
-	.4byte	0x14bd5
+	.4byte	0x14db8
 	.uleb128 0x55
-	.4byte	0x14bca
+	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1710
-	.8byte	.LBE1710-.LBB1710
+	.8byte	.LBB1772
+	.8byte	.LBE1772-.LBB1772
 	.uleb128 0x58
-	.4byte	0x14bf8
+	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL632
-	.4byte	0x153c7
+	.8byte	.LVL654
+	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14b84
-	.8byte	.LBB1711
-	.8byte	.LBE1711-.LBB1711
+	.4byte	0x14d67
+	.8byte	.LBB1773
+	.8byte	.LBE1773-.LBB1773
 	.byte	0x1
 	.2byte	0x913
-	.4byte	0xf0e0
+	.4byte	0xf0ec
 	.uleb128 0x55
-	.4byte	0x14bac
+	.4byte	0x14d8f
 	.uleb128 0x55
-	.4byte	0x14ba0
+	.4byte	0x14d83
 	.uleb128 0x55
-	.4byte	0x14b95
+	.4byte	0x14d78
 	.uleb128 0x5e
-	.4byte	0x14bb9
-	.8byte	.LBB1712
-	.8byte	.LBE1712-.LBB1712
+	.4byte	0x14d9c
+	.8byte	.LBB1774
+	.8byte	.LBE1774-.LBB1774
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14bed
+	.4byte	0x14dd0
 	.uleb128 0x55
-	.4byte	0x14be1
+	.4byte	0x14dc4
 	.uleb128 0x55
-	.4byte	0x14bd5
+	.4byte	0x14db8
 	.uleb128 0x55
-	.4byte	0x14bca
+	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1713
-	.8byte	.LBE1713-.LBB1713
+	.8byte	.LBB1775
+	.8byte	.LBE1775-.LBB1775
 	.uleb128 0x58
-	.4byte	0x14bf8
+	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL633
-	.4byte	0x153c7
+	.8byte	.LVL655
+	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14b84
-	.8byte	.LBB1714
-	.8byte	.LBE1714-.LBB1714
+	.4byte	0x14d67
+	.8byte	.LBB1776
+	.8byte	.LBE1776-.LBB1776
 	.byte	0x1
 	.2byte	0x916
-	.4byte	0xf15d
+	.4byte	0xf169
 	.uleb128 0x55
-	.4byte	0x14bac
+	.4byte	0x14d8f
 	.uleb128 0x55
-	.4byte	0x14ba0
+	.4byte	0x14d83
 	.uleb128 0x55
-	.4byte	0x14b95
+	.4byte	0x14d78
 	.uleb128 0x5e
-	.4byte	0x14bb9
-	.8byte	.LBB1715
-	.8byte	.LBE1715-.LBB1715
+	.4byte	0x14d9c
+	.8byte	.LBB1777
+	.8byte	.LBE1777-.LBB1777
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14bed
+	.4byte	0x14dd0
 	.uleb128 0x55
-	.4byte	0x14be1
+	.4byte	0x14dc4
 	.uleb128 0x55
-	.4byte	0x14bd5
+	.4byte	0x14db8
 	.uleb128 0x55
-	.4byte	0x14bca
+	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1716
-	.8byte	.LBE1716-.LBB1716
+	.8byte	.LBB1778
+	.8byte	.LBE1778-.LBB1778
 	.uleb128 0x58
-	.4byte	0x14bf8
+	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL634
-	.4byte	0x153c7
+	.8byte	.LVL656
+	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14b84
-	.8byte	.LBB1717
-	.8byte	.LBE1717-.LBB1717
+	.4byte	0x14d67
+	.8byte	.LBB1779
+	.8byte	.LBE1779-.LBB1779
 	.byte	0x1
 	.2byte	0x919
-	.4byte	0xf1da
+	.4byte	0xf1e6
 	.uleb128 0x55
-	.4byte	0x14bac
+	.4byte	0x14d8f
 	.uleb128 0x55
-	.4byte	0x14ba0
+	.4byte	0x14d83
 	.uleb128 0x55
-	.4byte	0x14b95
+	.4byte	0x14d78
 	.uleb128 0x5e
-	.4byte	0x14bb9
-	.8byte	.LBB1718
-	.8byte	.LBE1718-.LBB1718
+	.4byte	0x14d9c
+	.8byte	.LBB1780
+	.8byte	.LBE1780-.LBB1780
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14bed
+	.4byte	0x14dd0
 	.uleb128 0x55
-	.4byte	0x14be1
+	.4byte	0x14dc4
 	.uleb128 0x55
-	.4byte	0x14bd5
+	.4byte	0x14db8
 	.uleb128 0x55
-	.4byte	0x14bca
+	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1719
-	.8byte	.LBE1719-.LBB1719
+	.8byte	.LBB1781
+	.8byte	.LBE1781-.LBB1781
 	.uleb128 0x58
-	.4byte	0x14bf8
+	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL635
-	.4byte	0x153c7
+	.8byte	.LVL657
+	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14b84
-	.8byte	.LBB1720
-	.8byte	.LBE1720-.LBB1720
+	.4byte	0x14d67
+	.8byte	.LBB1782
+	.8byte	.LBE1782-.LBB1782
 	.byte	0x1
 	.2byte	0x91c
-	.4byte	0xf257
+	.4byte	0xf263
 	.uleb128 0x55
-	.4byte	0x14bac
+	.4byte	0x14d8f
 	.uleb128 0x55
-	.4byte	0x14ba0
+	.4byte	0x14d83
 	.uleb128 0x55
-	.4byte	0x14b95
+	.4byte	0x14d78
 	.uleb128 0x5e
-	.4byte	0x14bb9
-	.8byte	.LBB1721
-	.8byte	.LBE1721-.LBB1721
+	.4byte	0x14d9c
+	.8byte	.LBB1783
+	.8byte	.LBE1783-.LBB1783
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14bed
+	.4byte	0x14dd0
 	.uleb128 0x55
-	.4byte	0x14be1
+	.4byte	0x14dc4
 	.uleb128 0x55
-	.4byte	0x14bd5
+	.4byte	0x14db8
 	.uleb128 0x55
-	.4byte	0x14bca
+	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1722
-	.8byte	.LBE1722-.LBB1722
+	.8byte	.LBB1784
+	.8byte	.LBE1784-.LBB1784
 	.uleb128 0x58
-	.4byte	0x14bf8
+	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL636
-	.4byte	0x153c7
+	.8byte	.LVL658
+	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14b84
-	.8byte	.LBB1723
-	.8byte	.LBE1723-.LBB1723
+	.4byte	0x14d67
+	.8byte	.LBB1785
+	.8byte	.LBE1785-.LBB1785
 	.byte	0x1
 	.2byte	0x91f
-	.4byte	0xf2d4
+	.4byte	0xf2e0
 	.uleb128 0x55
-	.4byte	0x14bac
+	.4byte	0x14d8f
 	.uleb128 0x55
-	.4byte	0x14ba0
+	.4byte	0x14d83
 	.uleb128 0x55
-	.4byte	0x14b95
+	.4byte	0x14d78
 	.uleb128 0x5e
-	.4byte	0x14bb9
-	.8byte	.LBB1724
-	.8byte	.LBE1724-.LBB1724
+	.4byte	0x14d9c
+	.8byte	.LBB1786
+	.8byte	.LBE1786-.LBB1786
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14bed
+	.4byte	0x14dd0
 	.uleb128 0x55
-	.4byte	0x14be1
+	.4byte	0x14dc4
 	.uleb128 0x55
-	.4byte	0x14bd5
+	.4byte	0x14db8
 	.uleb128 0x55
-	.4byte	0x14bca
+	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1725
-	.8byte	.LBE1725-.LBB1725
+	.8byte	.LBB1787
+	.8byte	.LBE1787-.LBB1787
 	.uleb128 0x58
-	.4byte	0x14bf8
+	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL637
-	.4byte	0x153c7
+	.8byte	.LVL659
+	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14b84
-	.8byte	.LBB1726
-	.8byte	.LBE1726-.LBB1726
+	.4byte	0x14d67
+	.8byte	.LBB1788
+	.8byte	.LBE1788-.LBB1788
 	.byte	0x1
 	.2byte	0x922
-	.4byte	0xf351
+	.4byte	0xf35d
 	.uleb128 0x55
-	.4byte	0x14bac
+	.4byte	0x14d8f
 	.uleb128 0x55
-	.4byte	0x14ba0
+	.4byte	0x14d83
 	.uleb128 0x55
-	.4byte	0x14b95
+	.4byte	0x14d78
 	.uleb128 0x5e
-	.4byte	0x14bb9
-	.8byte	.LBB1727
-	.8byte	.LBE1727-.LBB1727
+	.4byte	0x14d9c
+	.8byte	.LBB1789
+	.8byte	.LBE1789-.LBB1789
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14bed
+	.4byte	0x14dd0
 	.uleb128 0x55
-	.4byte	0x14be1
+	.4byte	0x14dc4
 	.uleb128 0x55
-	.4byte	0x14bd5
+	.4byte	0x14db8
 	.uleb128 0x55
-	.4byte	0x14bca
+	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1728
-	.8byte	.LBE1728-.LBB1728
+	.8byte	.LBB1790
+	.8byte	.LBE1790-.LBB1790
 	.uleb128 0x58
-	.4byte	0x14bf8
+	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL638
-	.4byte	0x153c7
+	.8byte	.LVL660
+	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14b84
-	.8byte	.LBB1729
-	.8byte	.LBE1729-.LBB1729
+	.4byte	0x14d67
+	.8byte	.LBB1791
+	.8byte	.LBE1791-.LBB1791
 	.byte	0x1
 	.2byte	0x925
-	.4byte	0xf3ce
+	.4byte	0xf3da
 	.uleb128 0x55
-	.4byte	0x14bac
+	.4byte	0x14d8f
 	.uleb128 0x55
-	.4byte	0x14ba0
+	.4byte	0x14d83
 	.uleb128 0x55
-	.4byte	0x14b95
+	.4byte	0x14d78
 	.uleb128 0x5e
-	.4byte	0x14bb9
-	.8byte	.LBB1730
-	.8byte	.LBE1730-.LBB1730
+	.4byte	0x14d9c
+	.8byte	.LBB1792
+	.8byte	.LBE1792-.LBB1792
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14bed
+	.4byte	0x14dd0
 	.uleb128 0x55
-	.4byte	0x14be1
+	.4byte	0x14dc4
 	.uleb128 0x55
-	.4byte	0x14bd5
+	.4byte	0x14db8
 	.uleb128 0x55
-	.4byte	0x14bca
+	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1731
-	.8byte	.LBE1731-.LBB1731
+	.8byte	.LBB1793
+	.8byte	.LBE1793-.LBB1793
 	.uleb128 0x58
-	.4byte	0x14bf8
+	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL639
-	.4byte	0x153c7
+	.8byte	.LVL661
+	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14b84
-	.8byte	.LBB1732
-	.8byte	.LBE1732-.LBB1732
+	.4byte	0x14d67
+	.8byte	.LBB1794
+	.8byte	.LBE1794-.LBB1794
 	.byte	0x1
 	.2byte	0x928
-	.4byte	0xf44b
+	.4byte	0xf457
 	.uleb128 0x55
-	.4byte	0x14bac
+	.4byte	0x14d8f
 	.uleb128 0x55
-	.4byte	0x14ba0
+	.4byte	0x14d83
 	.uleb128 0x55
-	.4byte	0x14b95
+	.4byte	0x14d78
 	.uleb128 0x5e
-	.4byte	0x14bb9
-	.8byte	.LBB1733
-	.8byte	.LBE1733-.LBB1733
+	.4byte	0x14d9c
+	.8byte	.LBB1795
+	.8byte	.LBE1795-.LBB1795
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14bed
+	.4byte	0x14dd0
 	.uleb128 0x55
-	.4byte	0x14be1
+	.4byte	0x14dc4
 	.uleb128 0x55
-	.4byte	0x14bd5
+	.4byte	0x14db8
 	.uleb128 0x55
-	.4byte	0x14bca
+	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1734
-	.8byte	.LBE1734-.LBB1734
+	.8byte	.LBB1796
+	.8byte	.LBE1796-.LBB1796
 	.uleb128 0x58
-	.4byte	0x14bf8
+	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL640
-	.4byte	0x153c7
+	.8byte	.LVL662
+	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14b84
-	.8byte	.LBB1735
-	.8byte	.LBE1735-.LBB1735
+	.4byte	0x14d67
+	.8byte	.LBB1797
+	.8byte	.LBE1797-.LBB1797
 	.byte	0x1
 	.2byte	0x92b
-	.4byte	0xf4c8
+	.4byte	0xf4d4
 	.uleb128 0x55
-	.4byte	0x14bac
+	.4byte	0x14d8f
 	.uleb128 0x55
-	.4byte	0x14ba0
+	.4byte	0x14d83
 	.uleb128 0x55
-	.4byte	0x14b95
+	.4byte	0x14d78
 	.uleb128 0x5e
-	.4byte	0x14bb9
-	.8byte	.LBB1736
-	.8byte	.LBE1736-.LBB1736
+	.4byte	0x14d9c
+	.8byte	.LBB1798
+	.8byte	.LBE1798-.LBB1798
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14bed
+	.4byte	0x14dd0
 	.uleb128 0x55
-	.4byte	0x14be1
+	.4byte	0x14dc4
 	.uleb128 0x55
-	.4byte	0x14bd5
+	.4byte	0x14db8
 	.uleb128 0x55
-	.4byte	0x14bca
+	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1737
-	.8byte	.LBE1737-.LBB1737
+	.8byte	.LBB1799
+	.8byte	.LBE1799-.LBB1799
 	.uleb128 0x58
-	.4byte	0x14bf8
+	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL641
-	.4byte	0x153c7
+	.8byte	.LVL663
+	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x14b84
-	.8byte	.LBB1738
-	.8byte	.LBE1738-.LBB1738
+	.4byte	0x14d67
+	.8byte	.LBB1800
+	.8byte	.LBE1800-.LBB1800
 	.byte	0x1
 	.2byte	0x92e
 	.uleb128 0x55
-	.4byte	0x14bac
+	.4byte	0x14d8f
 	.uleb128 0x55
-	.4byte	0x14ba0
+	.4byte	0x14d83
 	.uleb128 0x55
-	.4byte	0x14b95
+	.4byte	0x14d78
 	.uleb128 0x5e
-	.4byte	0x14bb9
-	.8byte	.LBB1739
-	.8byte	.LBE1739-.LBB1739
+	.4byte	0x14d9c
+	.8byte	.LBB1801
+	.8byte	.LBE1801-.LBB1801
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14bed
+	.4byte	0x14dd0
 	.uleb128 0x55
-	.4byte	0x14be1
+	.4byte	0x14dc4
 	.uleb128 0x55
-	.4byte	0x14bd5
+	.4byte	0x14db8
 	.uleb128 0x55
-	.4byte	0x14bca
+	.4byte	0x14dad
 	.uleb128 0x57
-	.8byte	.LBB1740
-	.8byte	.LBE1740-.LBB1740
+	.8byte	.LBB1802
+	.8byte	.LBE1802-.LBB1802
 	.uleb128 0x58
-	.4byte	0x14bf8
+	.4byte	0x14ddb
 	.uleb128 0x4f
-	.8byte	.LVL642
-	.4byte	0x153c7
+	.8byte	.LVL664
+	.4byte	0x155aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0xfea7
-	.8byte	.LBB1747
-	.4byte	.Ldebug_ranges0+0xd80
+	.4byte	0xfeb3
+	.8byte	.LBB1809
+	.4byte	.Ldebug_ranges0+0xe20
 	.byte	0x1
-	.2byte	0xc0f
-	.4byte	0xf645
+	.2byte	0xc13
+	.4byte	0xf651
 	.uleb128 0x55
-	.4byte	0xfeb8
+	.4byte	0xfec4
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xd80
+	.4byte	.Ldebug_ranges0+0xe20
 	.uleb128 0x61
-	.4byte	0xfec4
-	.4byte	.LLST202
-	.uleb128 0x58
 	.4byte	0xfed0
+	.4byte	.LLST210
 	.uleb128 0x58
 	.4byte	0xfedc
 	.uleb128 0x58
 	.4byte	0xfee8
-	.uleb128 0x62
+	.uleb128 0x58
 	.4byte	0xfef4
+	.uleb128 0x62
+	.4byte	0xff00
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x58
-	.4byte	0xfefe
-	.uleb128 0x58
 	.4byte	0xff0a
 	.uleb128 0x58
 	.4byte	0xff16
+	.uleb128 0x58
+	.4byte	0xff22
 	.uleb128 0x5c
-	.4byte	0x14c99
-	.8byte	.LBB1749
-	.4byte	.Ldebug_ranges0+0xdf0
+	.4byte	0x14e7c
+	.8byte	.LBB1811
+	.4byte	.Ldebug_ranges0+0xe90
 	.byte	0x1
-	.2byte	0xaff
-	.4byte	0xf5b3
+	.2byte	0xb03
+	.4byte	0xf5bf
 	.uleb128 0x55
-	.4byte	0x14ca9
+	.4byte	0x14e8c
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14c63
-	.8byte	.LBB1753
-	.4byte	.Ldebug_ranges0+0xe20
+	.4byte	0x14e46
+	.8byte	.LBB1815
+	.4byte	.Ldebug_ranges0+0xec0
 	.byte	0x1
-	.2byte	0xb1e
-	.4byte	0xf5e8
+	.2byte	0xb22
+	.4byte	0xf5f4
 	.uleb128 0x55
-	.4byte	0x14c8c
+	.4byte	0x14e6f
 	.uleb128 0x55
-	.4byte	0x14c80
+	.4byte	0x14e63
 	.uleb128 0x55
-	.4byte	0x14c74
+	.4byte	0x14e57
 	.uleb128 0x4f
-	.8byte	.LVL648
-	.4byte	0x153ba
+	.8byte	.LVL670
+	.4byte	0x1559d
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL644
-	.4byte	0x153d4
+	.8byte	.LVL666
+	.4byte	0x155b7
 	.uleb128 0x4f
-	.8byte	.LVL645
-	.4byte	0x153e1
+	.8byte	.LVL667
+	.4byte	0x155c4
 	.uleb128 0x4f
-	.8byte	.LVL646
-	.4byte	0x153ed
+	.8byte	.LVL668
+	.4byte	0x155d0
 	.uleb128 0x4f
-	.8byte	.LVL647
-	.4byte	0x153f9
+	.8byte	.LVL669
+	.4byte	0x155dc
 	.uleb128 0x4f
-	.8byte	.LVL649
-	.4byte	0x15405
+	.8byte	.LVL671
+	.4byte	0x155e8
 	.uleb128 0x4f
-	.8byte	.LVL650
-	.4byte	0x1540f
+	.8byte	.LVL672
+	.4byte	0x155f2
 	.uleb128 0x4f
-	.8byte	.LVL663
-	.4byte	0x1541b
+	.8byte	.LVL685
+	.4byte	0x155fe
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0xff21
-	.8byte	.LBB1764
-	.4byte	.Ldebug_ranges0+0xe50
+	.4byte	0xff2d
+	.8byte	.LBB1826
+	.4byte	.Ldebug_ranges0+0xef0
 	.byte	0x1
-	.2byte	0xc16
-	.4byte	0xf71e
+	.2byte	0xc1a
+	.4byte	0xf72a
 	.uleb128 0x55
-	.4byte	0xff32
+	.4byte	0xff3e
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xe50
+	.4byte	.Ldebug_ranges0+0xef0
 	.uleb128 0x58
-	.4byte	0xff3e
-	.uleb128 0x61
 	.4byte	0xff4a
-	.4byte	.LLST203
-	.uleb128 0x58
+	.uleb128 0x61
 	.4byte	0xff56
-	.uleb128 0x62
+	.4byte	.LLST211
+	.uleb128 0x58
 	.4byte	0xff62
+	.uleb128 0x62
+	.4byte	0xff6e
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x61
-	.4byte	0xff6c
-	.4byte	.LLST204
-	.uleb128 0x58
 	.4byte	0xff78
+	.4byte	.LLST212
 	.uleb128 0x58
 	.4byte	0xff84
+	.uleb128 0x58
+	.4byte	0xff90
 	.uleb128 0x5c
-	.4byte	0x14c99
-	.8byte	.LBB1766
-	.4byte	.Ldebug_ranges0+0xea0
+	.4byte	0x14e7c
+	.8byte	.LBB1828
+	.4byte	.Ldebug_ranges0+0xf40
 	.byte	0x1
-	.2byte	0xacf
-	.4byte	0xf6b4
+	.2byte	0xad3
+	.4byte	0xf6c0
 	.uleb128 0x55
-	.4byte	0x14ca9
+	.4byte	0x14e8c
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL652
-	.4byte	0x153d4
+	.8byte	.LVL674
+	.4byte	0x155b7
 	.uleb128 0x4f
-	.8byte	.LVL653
-	.4byte	0x153e1
+	.8byte	.LVL675
+	.4byte	0x155c4
 	.uleb128 0x4f
-	.8byte	.LVL667
-	.4byte	0x153ed
+	.8byte	.LVL689
+	.4byte	0x155d0
 	.uleb128 0x4f
-	.8byte	.LVL668
-	.4byte	0x15428
+	.8byte	.LVL690
+	.4byte	0x1560b
 	.uleb128 0x4f
-	.8byte	.LVL754
-	.4byte	0x1541b
+	.8byte	.LVL776
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL755
-	.4byte	0x15434
+	.8byte	.LVL777
+	.4byte	0x15617
 	.uleb128 0x4f
-	.8byte	.LVL756
-	.4byte	0x1541b
+	.8byte	.LVL778
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL769
-	.4byte	0x1541b
+	.8byte	.LVL791
+	.4byte	0x155fe
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0xfe6f
-	.8byte	.LBB1775
-	.4byte	.Ldebug_ranges0+0xed0
+	.4byte	0xfe7b
+	.8byte	.LBB1837
+	.4byte	.Ldebug_ranges0+0xf70
 	.byte	0x1
-	.2byte	0xc1d
-	.4byte	0xf8b8
+	.2byte	0xc21
+	.4byte	0xf8c4
 	.uleb128 0x55
-	.4byte	0xfe80
+	.4byte	0xfe8c
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xed0
+	.4byte	.Ldebug_ranges0+0xf70
 	.uleb128 0x62
-	.4byte	0xfe8c
+	.4byte	0xfe98
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5c
-	.4byte	0x14e63
-	.8byte	.LBB1777
-	.4byte	.Ldebug_ranges0+0xf10
+	.4byte	0x15046
+	.8byte	.LBB1839
+	.4byte	.Ldebug_ranges0+0xfb0
 	.byte	0x1
-	.2byte	0xb2b
-	.4byte	0xf7a5
+	.2byte	0xb2f
+	.4byte	0xf7b1
 	.uleb128 0x55
-	.4byte	0x14e70
+	.4byte	0x15053
 	.uleb128 0x57
-	.8byte	.LBB1779
-	.8byte	.LBE1779-.LBB1779
+	.8byte	.LBB1841
+	.8byte	.LBE1841-.LBB1841
 	.uleb128 0x58
-	.4byte	0x14e9c
+	.4byte	0x1507f
 	.uleb128 0x5d
-	.4byte	0x15052
-	.8byte	.LBB1780
-	.8byte	.LBE1780-.LBB1780
+	.4byte	0x15235
+	.8byte	.LBB1842
+	.8byte	.LBE1842-.LBB1842
 	.byte	0xf
 	.byte	0x1c
 	.uleb128 0x55
-	.4byte	0x15075
+	.4byte	0x15258
 	.uleb128 0x55
-	.4byte	0x15069
+	.4byte	0x1524c
 	.uleb128 0x55
-	.4byte	0x1505f
+	.4byte	0x15242
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14f89
-	.8byte	.LBB1784
-	.8byte	.LBE1784-.LBB1784
+	.4byte	0x1516c
+	.8byte	.LBB1846
+	.8byte	.LBE1846-.LBB1846
 	.byte	0x1
-	.2byte	0xb35
-	.4byte	0xf7f0
+	.2byte	0xb39
+	.4byte	0xf7fc
 	.uleb128 0x55
-	.4byte	0x14fa0
+	.4byte	0x15183
 	.uleb128 0x55
-	.4byte	0x14f96
+	.4byte	0x15179
 	.uleb128 0x57
-	.8byte	.LBB1785
-	.8byte	.LBE1785-.LBB1785
+	.8byte	.LBB1847
+	.8byte	.LBE1847-.LBB1847
 	.uleb128 0x61
-	.4byte	0x14faa
-	.4byte	.LLST205
+	.4byte	0x1518d
+	.4byte	.LLST213
 	.uleb128 0x61
-	.4byte	0x14fb4
-	.4byte	.LLST206
+	.4byte	0x15197
+	.4byte	.LLST214
 	.byte	0
 	.byte	0
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0xf40
-	.4byte	0xf81d
+	.4byte	.Ldebug_ranges0+0xfe0
+	.4byte	0xf829
 	.uleb128 0x61
-	.4byte	0xfe99
-	.4byte	.LLST207
+	.4byte	0xfea5
+	.4byte	.LLST215
 	.uleb128 0x4f
-	.8byte	.LVL676
-	.4byte	0x15440
+	.8byte	.LVL698
+	.4byte	0x15623
 	.uleb128 0x4f
-	.8byte	.LVL678
-	.4byte	0x1544c
+	.8byte	.LVL700
+	.4byte	0x1562f
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14f89
-	.8byte	.LBB1788
-	.8byte	.LBE1788-.LBB1788
+	.4byte	0x1516c
+	.8byte	.LBB1850
+	.8byte	.LBE1850-.LBB1850
 	.byte	0x1
-	.2byte	0xb3e
-	.4byte	0xf868
+	.2byte	0xb42
+	.4byte	0xf874
 	.uleb128 0x55
-	.4byte	0x14fa0
+	.4byte	0x15183
 	.uleb128 0x55
-	.4byte	0x14f96
+	.4byte	0x15179
 	.uleb128 0x57
-	.8byte	.LBB1789
-	.8byte	.LBE1789-.LBB1789
+	.8byte	.LBB1851
+	.8byte	.LBE1851-.LBB1851
 	.uleb128 0x61
-	.4byte	0x14faa
-	.4byte	.LLST208
+	.4byte	0x1518d
+	.4byte	.LLST216
 	.uleb128 0x61
-	.4byte	0x14fb4
-	.4byte	.LLST209
+	.4byte	0x15197
+	.4byte	.LLST217
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL669
-	.4byte	0x15459
+	.8byte	.LVL691
+	.4byte	0x1563c
 	.uleb128 0x4f
-	.8byte	.LVL670
-	.4byte	0x15440
+	.8byte	.LVL692
+	.4byte	0x15623
 	.uleb128 0x4f
-	.8byte	.LVL671
-	.4byte	0x15466
+	.8byte	.LVL693
+	.4byte	0x15649
 	.uleb128 0x4f
-	.8byte	.LVL679
-	.4byte	0x15466
+	.8byte	.LVL701
+	.4byte	0x15649
 	.uleb128 0x4f
-	.8byte	.LVL759
-	.4byte	0x1541b
+	.8byte	.LVL781
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL763
-	.4byte	0x1541b
+	.8byte	.LVL785
+	.4byte	0x155fe
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0xfe55
-	.8byte	.LBB1792
-	.8byte	.LBE1792-.LBB1792
+	.4byte	0xfe61
+	.8byte	.LBB1854
+	.8byte	.LBE1854-.LBB1854
 	.byte	0x1
-	.2byte	0xc24
-	.4byte	0xf952
+	.2byte	0xc28
+	.4byte	0xf95e
 	.uleb128 0x55
-	.4byte	0xfe62
+	.4byte	0xfe6e
 	.uleb128 0x5c
-	.4byte	0x148b3
-	.8byte	.LBB1794
-	.4byte	.Ldebug_ranges0+0xf70
+	.4byte	0x14a96
+	.8byte	.LBB1856
+	.4byte	.Ldebug_ranges0+0x1010
 	.byte	0x1
-	.2byte	0xb4e
-	.4byte	0xf91d
+	.2byte	0xb52
+	.4byte	0xf929
 	.uleb128 0x55
-	.4byte	0x148d8
+	.4byte	0x14abb
 	.uleb128 0x55
-	.4byte	0x148cc
+	.4byte	0x14aaf
 	.uleb128 0x55
-	.4byte	0x148c0
+	.4byte	0x14aa3
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xf70
+	.4byte	.Ldebug_ranges0+0x1010
 	.uleb128 0x61
-	.4byte	0x148e4
-	.4byte	.LLST210
+	.4byte	0x14ac7
+	.4byte	.LLST218
 	.uleb128 0x4f
-	.8byte	.LVL686
-	.4byte	0x15473
+	.8byte	.LVL708
+	.4byte	0x15656
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL687
-	.4byte	0x1547f
+	.8byte	.LVL709
+	.4byte	0x15662
 	.uleb128 0x4f
-	.8byte	.LVL688
-	.4byte	0x1548b
+	.8byte	.LVL710
+	.4byte	0x1566e
 	.uleb128 0x4f
-	.8byte	.LVL689
-	.4byte	0x1547f
+	.8byte	.LVL711
+	.4byte	0x15662
 	.uleb128 0x4f
-	.8byte	.LVL690
-	.4byte	0x1548b
+	.8byte	.LVL712
+	.4byte	0x1566e
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0xfdb3
-	.8byte	.LBB1804
-	.4byte	.Ldebug_ranges0+0xfd0
+	.4byte	0xfdbf
+	.8byte	.LBB1866
+	.4byte	.Ldebug_ranges0+0x1070
 	.byte	0x1
-	.2byte	0xc27
-	.4byte	0xfbf5
+	.2byte	0xc2b
+	.4byte	0xfc01
 	.uleb128 0x55
-	.4byte	0xfdd0
+	.4byte	0xfddc
 	.uleb128 0x55
-	.4byte	0xfdc4
+	.4byte	0xfdd0
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xfd0
+	.4byte	.Ldebug_ranges0+0x1070
 	.uleb128 0x58
-	.4byte	0xfddc
-	.uleb128 0x61
 	.4byte	0xfde8
-	.4byte	.LLST211
 	.uleb128 0x61
 	.4byte	0xfdf4
-	.4byte	.LLST212
+	.4byte	.LLST219
 	.uleb128 0x61
 	.4byte	0xfe00
-	.4byte	.LLST213
+	.4byte	.LLST220
 	.uleb128 0x61
 	.4byte	0xfe0c
-	.4byte	.LLST214
+	.4byte	.LLST221
 	.uleb128 0x61
 	.4byte	0xfe18
-	.4byte	.LLST215
+	.4byte	.LLST222
 	.uleb128 0x61
 	.4byte	0xfe24
-	.4byte	.LLST216
-	.uleb128 0x58
-	.4byte	0xfe30
+	.4byte	.LLST223
 	.uleb128 0x61
+	.4byte	0xfe30
+	.4byte	.LLST224
+	.uleb128 0x58
 	.4byte	0xfe3c
-	.4byte	.LLST217
 	.uleb128 0x61
 	.4byte	0xfe48
-	.4byte	.LLST218
+	.4byte	.LLST225
+	.uleb128 0x61
+	.4byte	0xfe54
+	.4byte	.LLST226
 	.uleb128 0x54
-	.4byte	0x11882
-	.8byte	.LBB1806
-	.8byte	.LBE1806-.LBB1806
+	.4byte	0x11a65
+	.8byte	.LBB1868
+	.8byte	.LBE1868-.LBB1868
 	.byte	0x1
-	.2byte	0xb86
-	.4byte	0xfa34
+	.2byte	0xb8a
+	.4byte	0xfa40
 	.uleb128 0x55
-	.4byte	0x11893
+	.4byte	0x11a76
 	.uleb128 0x55
-	.4byte	0x11893
+	.4byte	0x11a76
 	.uleb128 0x57
-	.8byte	.LBB1807
-	.8byte	.LBE1807-.LBB1807
+	.8byte	.LBB1869
+	.8byte	.LBE1869-.LBB1869
 	.uleb128 0x61
-	.4byte	0x1189f
-	.4byte	.LLST219
+	.4byte	0x11a82
+	.4byte	.LLST227
 	.uleb128 0x4f
-	.8byte	.LVL707
-	.4byte	0x15497
+	.8byte	.LVL729
+	.4byte	0x1567a
 	.uleb128 0x4f
-	.8byte	.LVL709
-	.4byte	0x1540f
+	.8byte	.LVL731
+	.4byte	0x155f2
 	.uleb128 0x4f
-	.8byte	.LVL710
-	.4byte	0x154a3
+	.8byte	.LVL732
+	.4byte	0x15686
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a43
-	.8byte	.LBB1808
-	.8byte	.LBE1808-.LBB1808
+	.4byte	0x14c26
+	.8byte	.LBB1870
+	.8byte	.LBE1870-.LBB1870
 	.byte	0x1
-	.2byte	0xb6c
-	.4byte	0xfa8b
+	.2byte	0xb70
+	.4byte	0xfa97
 	.uleb128 0x55
-	.4byte	0x14a60
+	.4byte	0x14c43
 	.uleb128 0x55
-	.4byte	0x14a54
+	.4byte	0x14c37
 	.uleb128 0x5e
-	.4byte	0x14a6d
-	.8byte	.LBB1809
-	.8byte	.LBE1809-.LBB1809
+	.4byte	0x14c50
+	.8byte	.LBB1871
+	.8byte	.LBE1871-.LBB1871
 	.byte	0x11
 	.2byte	0x2e7
 	.uleb128 0x55
-	.4byte	0x14a8a
+	.4byte	0x14c6d
 	.uleb128 0x55
-	.4byte	0x14a7e
+	.4byte	0x14c61
 	.uleb128 0x4f
-	.8byte	.LVL727
-	.4byte	0x154af
+	.8byte	.LVL749
+	.4byte	0x15692
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a43
-	.8byte	.LBB1811
-	.8byte	.LBE1811-.LBB1811
+	.4byte	0x14c26
+	.8byte	.LBB1873
+	.8byte	.LBE1873-.LBB1873
 	.byte	0x1
-	.2byte	0xb7a
-	.4byte	0xfae2
+	.2byte	0xb7e
+	.4byte	0xfaee
 	.uleb128 0x55
-	.4byte	0x14a60
+	.4byte	0x14c43
 	.uleb128 0x55
-	.4byte	0x14a54
+	.4byte	0x14c37
 	.uleb128 0x5e
-	.4byte	0x14a6d
-	.8byte	.LBB1812
-	.8byte	.LBE1812-.LBB1812
+	.4byte	0x14c50
+	.8byte	.LBB1874
+	.8byte	.LBE1874-.LBB1874
 	.byte	0x11
 	.2byte	0x2e7
 	.uleb128 0x55
-	.4byte	0x14a8a
+	.4byte	0x14c6d
 	.uleb128 0x55
-	.4byte	0x14a7e
+	.4byte	0x14c61
 	.uleb128 0x4f
-	.8byte	.LVL740
-	.4byte	0x154af
+	.8byte	.LVL762
+	.4byte	0x15692
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL692
-	.4byte	0x154bc
+	.8byte	.LVL714
+	.4byte	0x1569f
 	.uleb128 0x4f
-	.8byte	.LVL694
-	.4byte	0x154bc
+	.8byte	.LVL716
+	.4byte	0x1569f
 	.uleb128 0x4f
-	.8byte	.LVL696
-	.4byte	0x154c8
+	.8byte	.LVL718
+	.4byte	0x156ab
 	.uleb128 0x4f
-	.8byte	.LVL701
-	.4byte	0x154c8
+	.8byte	.LVL723
+	.4byte	0x156ab
 	.uleb128 0x4f
-	.8byte	.LVL705
-	.4byte	0x153a1
+	.8byte	.LVL727
+	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL706
-	.4byte	0x154d5
+	.8byte	.LVL728
+	.4byte	0x156b8
 	.uleb128 0x4f
-	.8byte	.LVL711
-	.4byte	0x154e1
+	.8byte	.LVL733
+	.4byte	0x156c4
 	.uleb128 0x4f
-	.8byte	.LVL712
-	.4byte	0x154e1
+	.8byte	.LVL734
+	.4byte	0x156c4
 	.uleb128 0x4f
-	.8byte	.LVL724
-	.4byte	0x154ed
+	.8byte	.LVL746
+	.4byte	0x156d0
 	.uleb128 0x4f
-	.8byte	.LVL726
-	.4byte	0x153a1
+	.8byte	.LVL748
+	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL731
-	.4byte	0x154f9
+	.8byte	.LVL753
+	.4byte	0x156dc
 	.uleb128 0x4f
-	.8byte	.LVL734
-	.4byte	0x15497
+	.8byte	.LVL756
+	.4byte	0x1567a
 	.uleb128 0x4f
-	.8byte	.LVL736
-	.4byte	0x154f9
+	.8byte	.LVL758
+	.4byte	0x156dc
 	.uleb128 0x4f
-	.8byte	.LVL737
-	.4byte	0x154a3
+	.8byte	.LVL759
+	.4byte	0x15686
 	.uleb128 0x4f
-	.8byte	.LVL739
-	.4byte	0x153a1
+	.8byte	.LVL761
+	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL743
-	.4byte	0x154f9
+	.8byte	.LVL765
+	.4byte	0x156dc
 	.uleb128 0x4f
-	.8byte	.LVL746
-	.4byte	0x15497
+	.8byte	.LVL768
+	.4byte	0x1567a
 	.uleb128 0x4f
-	.8byte	.LVL748
-	.4byte	0x154f9
+	.8byte	.LVL770
+	.4byte	0x156dc
 	.uleb128 0x4f
-	.8byte	.LVL749
-	.4byte	0x154a3
+	.8byte	.LVL771
+	.4byte	0x15686
 	.uleb128 0x4f
-	.8byte	.LVL774
-	.4byte	0x1541b
+	.8byte	.LVL796
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL777
-	.4byte	0x1541b
+	.8byte	.LVL799
+	.4byte	0x155fe
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14b17
-	.8byte	.LBB1817
-	.8byte	.LBE1817-.LBB1817
+	.4byte	0x14cfa
+	.8byte	.LBB1879
+	.8byte	.LBE1879-.LBB1879
 	.byte	0x1
-	.2byte	0xc29
-	.4byte	0xfc3e
+	.2byte	0xc2d
+	.4byte	0xfc4a
 	.uleb128 0x55
-	.4byte	0x14b30
+	.4byte	0x14d13
 	.uleb128 0x55
-	.4byte	0x14b24
+	.4byte	0x14d07
 	.uleb128 0x5d
-	.4byte	0x14c1f
-	.8byte	.LBB1818
-	.8byte	.LBE1818-.LBB1818
+	.4byte	0x14e02
+	.8byte	.LBB1880
+	.8byte	.LBE1880-.LBB1880
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x55
-	.4byte	0x14c38
+	.4byte	0x14e1b
 	.uleb128 0x55
-	.4byte	0x14c2c
+	.4byte	0x14e0f
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0xffa7
-	.8byte	.LBB1820
-	.8byte	.LBE1820-.LBB1820
+	.4byte	0xffb3
+	.8byte	.LBB1882
+	.8byte	.LBE1882-.LBB1882
 	.byte	0x1
-	.2byte	0xc2c
-	.4byte	0xfcd5
+	.2byte	0xc30
+	.4byte	0xfce1
 	.uleb128 0x55
-	.4byte	0xffb8
+	.4byte	0xffc4
 	.uleb128 0x4f
-	.8byte	.LVL713
-	.4byte	0x15503
+	.8byte	.LVL735
+	.4byte	0x156e6
 	.uleb128 0x4f
-	.8byte	.LVL714
-	.4byte	0x15503
+	.8byte	.LVL736
+	.4byte	0x156e6
 	.uleb128 0x4f
-	.8byte	.LVL715
-	.4byte	0x1550f
+	.8byte	.LVL737
+	.4byte	0x156f2
 	.uleb128 0x4f
-	.8byte	.LVL716
-	.4byte	0x1550f
+	.8byte	.LVL738
+	.4byte	0x156f2
 	.uleb128 0x4f
-	.8byte	.LVL717
-	.4byte	0x1550f
+	.8byte	.LVL739
+	.4byte	0x156f2
 	.uleb128 0x4f
-	.8byte	.LVL718
-	.4byte	0x1550f
+	.8byte	.LVL740
+	.4byte	0x156f2
 	.uleb128 0x4f
-	.8byte	.LVL719
-	.4byte	0x1550f
+	.8byte	.LVL741
+	.4byte	0x156f2
 	.uleb128 0x4f
-	.8byte	.LVL720
-	.4byte	0x1550f
+	.8byte	.LVL742
+	.4byte	0x156f2
 	.uleb128 0x4f
-	.8byte	.LVL721
-	.4byte	0x1550f
+	.8byte	.LVL743
+	.4byte	0x156f2
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL599
-	.4byte	0x153d4
+	.8byte	.LVL621
+	.4byte	0x155b7
 	.uleb128 0x4f
-	.8byte	.LVL600
-	.4byte	0x1551c
+	.8byte	.LVL622
+	.4byte	0x156ff
 	.uleb128 0x4f
-	.8byte	.LVL602
-	.4byte	0x15528
+	.8byte	.LVL624
+	.4byte	0x1570b
 	.uleb128 0x4f
-	.8byte	.LVL608
-	.4byte	0x15535
+	.8byte	.LVL630
+	.4byte	0x15718
 	.uleb128 0x4f
-	.8byte	.LVL611
-	.4byte	0x15542
+	.8byte	.LVL633
+	.4byte	0x15725
 	.uleb128 0x4f
-	.8byte	.LVL612
-	.4byte	0x1541b
+	.8byte	.LVL634
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL620
-	.4byte	0x153a1
+	.8byte	.LVL642
+	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL654
-	.4byte	0x1541b
+	.8byte	.LVL676
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL656
-	.4byte	0x1541b
+	.8byte	.LVL678
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL659
-	.4byte	0x1541b
+	.8byte	.LVL681
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL661
-	.4byte	0x1541b
+	.8byte	.LVL683
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL664
-	.4byte	0x1541b
+	.8byte	.LVL686
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL722
-	.4byte	0x153a1
+	.8byte	.LVL744
+	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL752
-	.4byte	0x1541b
+	.8byte	.LVL774
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL760
-	.4byte	0x1541b
+	.8byte	.LVL782
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL765
-	.4byte	0x1541b
+	.8byte	.LVL787
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL779
-	.4byte	0x1554f
+	.8byte	.LVL801
+	.4byte	0x15732
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0xb5a
+	.2byte	0xb5e
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe55
+	.4byte	0xfe61
 	.uleb128 0x65
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xb5a
-	.4byte	0xe557
+	.2byte	0xb5e
+	.4byte	0xe563
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xb5a
-	.4byte	0xe1f4
+	.2byte	0xb5e
+	.4byte	0xe200
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xb5c
-	.4byte	0xe874
+	.2byte	0xb60
+	.4byte	0xe880
 	.uleb128 0x48
 	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0xb5d
+	.2byte	0xb61
 	.4byte	0x6d
 	.uleb128 0x48
 	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0xb5e
+	.2byte	0xb62
 	.4byte	0x6d
 	.uleb128 0x48
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0xb5f
+	.2byte	0xb63
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0xb60
+	.2byte	0xb64
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0xb61
+	.2byte	0xb65
 	.4byte	0x21e
 	.uleb128 0x48
 	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0xb62
+	.2byte	0xb66
 	.4byte	0x21e
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xb63
-	.4byte	0xe4f2
+	.2byte	0xb67
+	.4byte	0xe4fe
 	.uleb128 0x48
 	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0xb64
+	.2byte	0xb68
 	.4byte	0x458
 	.uleb128 0x48
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0xb65
+	.2byte	0xb69
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0xb43
+	.2byte	0xb47
 	.byte	0x1
-	.4byte	0xfe6f
+	.4byte	0xfe7b
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xb43
-	.4byte	0xe874
+	.2byte	0xb47
+	.4byte	0xe880
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0xb27
+	.2byte	0xb2b
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfea7
+	.4byte	0xfeb3
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xb27
-	.4byte	0xe874
+	.2byte	0xb2b
+	.4byte	0xe880
 	.uleb128 0x48
 	.4byte	.LASF2480
 	.byte	0x1
-	.2byte	0xb29
+	.2byte	0xb2d
 	.4byte	0xd88a
 	.uleb128 0x68
 	.uleb128 0x53
 	.string	"__k"
 	.byte	0x1
-	.2byte	0xb38
+	.2byte	0xb3c
 	.4byte	0x2f05
 	.byte	0
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0xae8
+	.2byte	0xaec
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xff21
+	.4byte	0xff2d
 	.uleb128 0x65
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xae8
-	.4byte	0xe557
+	.2byte	0xaec
+	.4byte	0xe563
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xaea
+	.2byte	0xaee
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xaeb
-	.4byte	0xe1f4
+	.2byte	0xaef
+	.4byte	0xe200
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xaec
-	.4byte	0xe874
+	.2byte	0xaf0
+	.4byte	0xe880
 	.uleb128 0x48
 	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0xaed
+	.2byte	0xaf1
 	.4byte	0xb904
 	.uleb128 0x53
 	.string	"r"
 	.byte	0x1
-	.2byte	0xaee
+	.2byte	0xaf2
 	.4byte	0x97bc
 	.uleb128 0x48
 	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0xaef
+	.2byte	0xaf3
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xaf0
+	.2byte	0xaf4
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0xaf0
+	.2byte	0xaf4
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0xabc
+	.2byte	0xac0
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xff92
+	.4byte	0xff9e
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xabc
-	.4byte	0xe874
+	.2byte	0xac0
+	.4byte	0xe880
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xabe
+	.2byte	0xac2
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xabf
+	.2byte	0xac3
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0xac0
+	.2byte	0xac4
 	.4byte	0xb904
 	.uleb128 0x53
 	.string	"r"
 	.byte	0x1
-	.2byte	0xac1
+	.2byte	0xac5
 	.4byte	0x97bc
 	.uleb128 0x48
 	.4byte	.LASF2982
 	.byte	0x1
-	.2byte	0xac2
+	.2byte	0xac6
 	.4byte	0x29
 	.uleb128 0x48
 	.4byte	.LASF2983
 	.byte	0x1
-	.2byte	0xac3
+	.2byte	0xac7
 	.4byte	0xc6
 	.uleb128 0x69
 	.4byte	.LASF3050
-	.4byte	0xffa2
+	.4byte	0xffae
 	.4byte	.LASF3071
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xffa2
+	.4byte	0xffae
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x12
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xff92
+	.4byte	0xff9e
 	.uleb128 0x64
 	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0xaac
+	.2byte	0xab0
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xffc5
+	.4byte	0xffd1
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xaac
-	.4byte	0xe874
+	.2byte	0xab0
+	.4byte	0xe880
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0xaa3
+	.2byte	0xaa7
 	.4byte	0x2ee
 	.8byte	.LFB2855
 	.8byte	.LFE2855-.LFB2855
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10025
+	.4byte	0x10031
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xaa3
+	.2byte	0xaa7
 	.4byte	0xa5e0
-	.4byte	.LLST78
+	.4byte	.LLST86
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xaa4
+	.2byte	0xaa8
 	.4byte	0xb45b
-	.4byte	.LLST79
+	.4byte	.LLST87
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xaa5
+	.2byte	0xaa9
 	.4byte	0x21e
-	.4byte	.LLST80
+	.4byte	.LLST88
 	.uleb128 0x4f
-	.8byte	.LVL309
-	.4byte	0x15559
+	.8byte	.LVL331
+	.4byte	0x1573c
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0xa9a
+	.2byte	0xa9e
 	.4byte	0x2ee
 	.8byte	.LFB2854
 	.8byte	.LFE2854-.LFB2854
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10085
+	.4byte	0x10091
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa9a
+	.2byte	0xa9e
 	.4byte	0xa5e0
-	.4byte	.LLST81
+	.4byte	.LLST89
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa9b
+	.2byte	0xa9f
 	.4byte	0xb45b
-	.4byte	.LLST82
+	.4byte	.LLST90
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa9c
+	.2byte	0xaa0
 	.4byte	0x21e
-	.4byte	.LLST83
+	.4byte	.LLST91
 	.uleb128 0x4f
-	.8byte	.LVL314
-	.4byte	0x15565
+	.8byte	.LVL336
+	.4byte	0x15748
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0xa91
+	.2byte	0xa95
 	.4byte	0x2ee
 	.8byte	.LFB2853
 	.8byte	.LFE2853-.LFB2853
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x100e5
+	.4byte	0x100f1
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa91
+	.2byte	0xa95
 	.4byte	0xa5e0
-	.4byte	.LLST84
+	.4byte	.LLST92
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa92
+	.2byte	0xa96
 	.4byte	0xb45b
-	.4byte	.LLST85
+	.4byte	.LLST93
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa93
+	.2byte	0xa97
 	.4byte	0x21e
-	.4byte	.LLST86
+	.4byte	.LLST94
 	.uleb128 0x4f
-	.8byte	.LVL319
-	.4byte	0x15565
+	.8byte	.LVL341
+	.4byte	0x15748
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0xa79
+	.2byte	0xa7d
 	.4byte	0x2ee
 	.8byte	.LFB2852
 	.8byte	.LFE2852-.LFB2852
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x101b5
+	.4byte	0x101c1
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa79
+	.2byte	0xa7d
 	.4byte	0xa5e0
-	.4byte	.LLST96
+	.4byte	.LLST104
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa7a
+	.2byte	0xa7e
 	.4byte	0xb45b
-	.4byte	.LLST97
+	.4byte	.LLST105
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa7b
+	.2byte	0xa7f
 	.4byte	0x56
-	.4byte	.LLST98
+	.4byte	.LLST106
 	.uleb128 0x59
 	.4byte	.LASF383
 	.byte	0x1
-	.2byte	0xa7b
+	.2byte	0xa7f
 	.4byte	0x2e3
-	.4byte	.LLST99
+	.4byte	.LLST107
 	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa7d
-	.4byte	0xe557
-	.4byte	.LLST100
+	.2byte	0xa81
+	.4byte	0xe563
+	.4byte	.LLST108
 	.uleb128 0x5a
 	.4byte	.LASF2470
 	.byte	0x1
-	.2byte	0xa7e
+	.2byte	0xa82
 	.4byte	0xc6
-	.4byte	.LLST101
+	.4byte	.LLST109
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xa7e
+	.2byte	0xa82
 	.4byte	0xc6
 	.uleb128 0x4f
-	.8byte	.LVL345
-	.4byte	0x15572
+	.8byte	.LVL367
+	.4byte	0x15755
 	.uleb128 0x4f
-	.8byte	.LVL347
-	.4byte	0x1557f
+	.8byte	.LVL369
+	.4byte	0x15762
 	.uleb128 0x4f
-	.8byte	.LVL352
-	.4byte	0x1541b
+	.8byte	.LVL374
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL355
-	.4byte	0x1541b
+	.8byte	.LVL377
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL356
-	.4byte	0x1554f
+	.8byte	.LVL378
+	.4byte	0x15732
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0xa6d
+	.2byte	0xa71
 	.4byte	0x2ee
 	.8byte	.LFB2851
 	.8byte	.LFE2851-.LFB2851
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1024f
+	.4byte	0x1025b
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa6d
+	.2byte	0xa71
 	.4byte	0xa5e0
-	.4byte	.LLST87
+	.4byte	.LLST95
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa6e
+	.2byte	0xa72
 	.4byte	0xb45b
-	.4byte	.LLST88
+	.4byte	.LLST96
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa6f
+	.2byte	0xa73
 	.4byte	0x21e
-	.4byte	.LLST89
+	.4byte	.LLST97
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa71
-	.4byte	0xe557
+	.2byte	0xa75
+	.4byte	0xe563
 	.uleb128 0x48
 	.4byte	.LASF2470
 	.byte	0x1
-	.2byte	0xa72
+	.2byte	0xa76
 	.4byte	0xc6
 	.uleb128 0x54
-	.4byte	0x147c0
-	.8byte	.LBB1260
-	.8byte	.LBE1260-.LBB1260
+	.4byte	0x149a3
+	.8byte	.LBB1322
+	.8byte	.LBE1322-.LBB1322
 	.byte	0x1
-	.2byte	0xa74
-	.4byte	0x10241
+	.2byte	0xa78
+	.4byte	0x1024d
 	.uleb128 0x55
-	.4byte	0x147d0
+	.4byte	0x149b3
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL324
-	.4byte	0x15565
+	.8byte	.LVL346
+	.4byte	0x15748
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0xa5f
+	.2byte	0xa63
 	.4byte	0x2ee
 	.8byte	.LFB2850
 	.8byte	.LFE2850-.LFB2850
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x102f8
+	.4byte	0x10304
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa5f
+	.2byte	0xa63
 	.4byte	0xa5e0
-	.4byte	.LLST90
+	.4byte	.LLST98
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa60
+	.2byte	0xa64
 	.4byte	0xb45b
-	.4byte	.LLST91
+	.4byte	.LLST99
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa61
+	.2byte	0xa65
 	.4byte	0x21e
-	.4byte	.LLST92
+	.4byte	.LLST100
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa63
-	.4byte	0xe557
+	.2byte	0xa67
+	.4byte	0xe563
 	.uleb128 0x6a
 	.string	"t"
 	.byte	0x1
-	.2byte	0xa64
+	.2byte	0xa68
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x5c
-	.4byte	0x147dd
-	.8byte	.LBB1262
-	.4byte	.Ldebug_ranges0+0x6a0
+	.4byte	0x149c0
+	.8byte	.LBB1324
+	.4byte	.Ldebug_ranges0+0x740
 	.byte	0x1
-	.2byte	0xa66
-	.4byte	0x102dd
+	.2byte	0xa6a
+	.4byte	0x102e9
 	.uleb128 0x55
-	.4byte	0x147f9
+	.4byte	0x149dc
 	.uleb128 0x55
-	.4byte	0x147ed
+	.4byte	0x149d0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL331
-	.4byte	0x15565
+	.8byte	.LVL353
+	.4byte	0x15748
 	.uleb128 0x4f
-	.8byte	.LVL334
-	.4byte	0x1554f
+	.8byte	.LVL356
+	.4byte	0x15732
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0xa54
+	.2byte	0xa58
 	.4byte	0x2ee
 	.8byte	.LFB2849
 	.8byte	.LFE2849-.LFB2849
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10364
+	.4byte	0x10370
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa54
+	.2byte	0xa58
 	.4byte	0xa5e0
-	.4byte	.LLST93
+	.4byte	.LLST101
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa55
+	.2byte	0xa59
 	.4byte	0xb45b
-	.4byte	.LLST94
+	.4byte	.LLST102
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa56
+	.2byte	0xa5a
 	.4byte	0x21e
-	.4byte	.LLST95
+	.4byte	.LLST103
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa58
-	.4byte	0xe557
+	.2byte	0xa5c
+	.4byte	0xe563
 	.uleb128 0x4f
-	.8byte	.LVL339
-	.4byte	0x15565
+	.8byte	.LVL361
+	.4byte	0x15748
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0xa49
+	.2byte	0xa4d
 	.4byte	0x2ee
 	.8byte	.LFB2848
 	.8byte	.LFE2848-.LFB2848
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x103dd
+	.4byte	0x103e9
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa49
+	.2byte	0xa4d
 	.4byte	0xa5e0
-	.4byte	.LLST102
+	.4byte	.LLST110
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa4a
+	.2byte	0xa4e
 	.4byte	0xb45b
-	.4byte	.LLST103
+	.4byte	.LLST111
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa4b
+	.2byte	0xa4f
 	.4byte	0x21e
-	.4byte	.LLST104
+	.4byte	.LLST112
 	.uleb128 0x48
 	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0xa4d
+	.2byte	0xa51
 	.4byte	0x56
 	.uleb128 0x4f
-	.8byte	.LVL358
-	.4byte	0x1558b
+	.8byte	.LVL380
+	.4byte	0x1576e
 	.uleb128 0x4f
-	.8byte	.LVL359
-	.4byte	0x15565
+	.8byte	.LVL381
+	.4byte	0x15748
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0xa36
+	.2byte	0xa3a
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x10407
+	.4byte	0x10413
 	.uleb128 0x66
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0xa36
+	.2byte	0xa3a
 	.4byte	0x1c7f
 	.uleb128 0x66
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0xa36
+	.2byte	0xa3a
 	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0xa26
+	.2byte	0xa2a
 	.4byte	0xc6
 	.8byte	.LFB2846
 	.8byte	.LFE2846-.LFB2846
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1046f
+	.4byte	0x1047b
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0xa26
+	.2byte	0xa2a
 	.4byte	0x55cc
 	.4byte	.LLST16
 	.uleb128 0x52
 	.string	"vma"
 	.byte	0x1
-	.2byte	0xa26
+	.2byte	0xa2a
 	.4byte	0x3d25
 	.4byte	.LLST17
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xa28
-	.4byte	0xe874
+	.2byte	0xa2c
+	.4byte	0xe880
 	.uleb128 0x48
 	.4byte	.LASF898
 	.byte	0x1
-	.2byte	0xa29
+	.2byte	0xa2d
 	.4byte	0x29
 	.uleb128 0x4f
 	.8byte	.LVL82
-	.4byte	0x15597
+	.4byte	0x1577a
 	.byte	0
 	.uleb128 0x6b
 	.4byte	.LASF3085
 	.byte	0x1
-	.2byte	0xa0f
+	.2byte	0xa13
 	.4byte	0xc6
-	.4byte	0x10498
+	.4byte	0x104a4
 	.uleb128 0x66
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0xa0f
+	.2byte	0xa13
 	.4byte	0x1c7f
 	.uleb128 0x66
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0xa0f
+	.2byte	0xa13
 	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0xa00
+	.2byte	0xa04
 	.4byte	0xc6
 	.8byte	.LFB2844
 	.8byte	.LFE2844-.LFB2844
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10501
+	.4byte	0x1050d
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0xa00
+	.2byte	0xa04
 	.4byte	0x55cc
 	.4byte	.LLST14
 	.uleb128 0x52
 	.string	"vma"
 	.byte	0x1
-	.2byte	0xa00
+	.2byte	0xa04
 	.4byte	0x3d25
 	.4byte	.LLST15
 	.uleb128 0x48
 	.4byte	.LASF898
 	.byte	0x1
-	.2byte	0xa02
+	.2byte	0xa06
 	.4byte	0x29
 	.uleb128 0x4f
 	.8byte	.LVL76
-	.4byte	0x155a4
+	.4byte	0x15787
 	.uleb128 0x4f
 	.8byte	.LVL77
-	.4byte	0x15597
+	.4byte	0x1577a
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3087
@@ -42844,7 +43041,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2843-.LFB2843
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x117a9
+	.4byte	0x1198c
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
@@ -42872,25 +43069,25 @@ __exitcall_ebc_exit:
 	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x937
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x938
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x4d
 	.4byte	.LASF3089
 	.byte	0x1
 	.2byte	0x939
 	.4byte	0xda8e
-	.uleb128 0x2
+	.uleb128 0x3
 	.byte	0x91
-	.sleb128 -56
+	.sleb128 -72
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
 	.2byte	0x93a
-	.4byte	0xe4f2
+	.4byte	0xe4fe
 	.uleb128 0x48
 	.4byte	.LASF3090
 	.byte	0x1
@@ -42908,977 +43105,977 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.uleb128 0x56
 	.4byte	.LASF3050
-	.4byte	0x117b9
+	.4byte	0x1199c
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35231
+	.8byte	__func__.35232
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x1a0
-	.4byte	0x1066b
+	.4byte	0x10678
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x989
+	.2byte	0x98d
 	.4byte	0xc6
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1a0
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x989
-	.8byte	.L216
+	.2byte	0x98d
+	.8byte	.L222
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x989
+	.2byte	0x98d
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
-	.sleb128 -96
+	.sleb128 -112
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x989
+	.2byte	0x98d
 	.4byte	0x199
 	.uleb128 0x6d
-	.8byte	.LBB1052
-	.8byte	.LBE1052-.LBB1052
-	.4byte	0x1064f
+	.8byte	.LBB1083
+	.8byte	.LBE1083-.LBB1083
+	.4byte	0x1065c
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x989
+	.2byte	0x98d
 	.4byte	0x199
 	.4byte	.LLST35
 	.uleb128 0x4f
-	.8byte	.LVL127
-	.4byte	0x155b0
-	.uleb128 0x4f
 	.8byte	.LVL128
-	.4byte	0x155bc
+	.4byte	0x15793
+	.uleb128 0x4f
+	.8byte	.LVL129
+	.4byte	0x1579f
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL125
-	.4byte	0x155c9
+	.8byte	.LVL126
+	.4byte	0x157ac
 	.uleb128 0x4f
-	.8byte	.LVL129
-	.4byte	0x155d5
+	.8byte	.LVL130
+	.4byte	0x157b8
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x148ef
-	.8byte	.LBB988
+	.4byte	0x14ad2
+	.8byte	.LBB1019
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x9f2
-	.4byte	0x1088b
+	.2byte	0x9f6
+	.4byte	0x10898
 	.uleb128 0x55
-	.4byte	0x14916
+	.4byte	0x14af9
 	.uleb128 0x55
-	.4byte	0x1490a
+	.4byte	0x14aed
 	.uleb128 0x55
-	.4byte	0x148ff
+	.4byte	0x14ae2
 	.uleb128 0x6e
-	.4byte	0x14953
-	.8byte	.LBB989
+	.4byte	0x14b36
+	.8byte	.LBB1020
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1497a
+	.4byte	0x14b5d
 	.uleb128 0x55
-	.4byte	0x1496e
+	.4byte	0x14b51
 	.uleb128 0x55
-	.4byte	0x14963
+	.4byte	0x14b46
 	.uleb128 0x6f
-	.4byte	0x149f7
-	.8byte	.LBB991
+	.4byte	0x14bda
+	.8byte	.LBB1022
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x107c1
+	.4byte	0x107ce
 	.uleb128 0x55
-	.4byte	0x14a13
+	.4byte	0x14bf6
 	.uleb128 0x70
-	.4byte	0x14a07
+	.4byte	0x14bea
 	.4byte	.LLST21
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x80
 	.uleb128 0x61
-	.4byte	0x14a1f
+	.4byte	0x14c02
 	.4byte	.LLST22
 	.uleb128 0x61
-	.4byte	0x14a2a
+	.4byte	0x14c0d
 	.4byte	.LLST23
 	.uleb128 0x71
-	.4byte	0x14e47
-	.8byte	.LBB993
-	.8byte	.LBE993-.LBB993
+	.4byte	0x1502a
+	.8byte	.LBB1024
+	.8byte	.LBE1024-.LBB1024
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10727
+	.4byte	0x10734
 	.uleb128 0x57
-	.8byte	.LBB994
-	.8byte	.LBE994-.LBB994
+	.8byte	.LBB1025
+	.8byte	.LBE1025-.LBB1025
 	.uleb128 0x61
-	.4byte	0x14e57
+	.4byte	0x1503a
 	.4byte	.LLST24
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14e19
-	.8byte	.LBB995
-	.8byte	.LBE995-.LBB995
+	.4byte	0x14ffc
+	.8byte	.LBB1026
+	.8byte	.LBE1026-.LBB1026
 	.byte	0x6
 	.byte	0x55
-	.4byte	0x1076f
+	.4byte	0x1077c
 	.uleb128 0x55
-	.4byte	0x14e34
+	.4byte	0x15017
 	.uleb128 0x55
-	.4byte	0x14e29
+	.4byte	0x1500c
 	.uleb128 0x5d
-	.4byte	0x14f5b
-	.8byte	.LBB996
-	.8byte	.LBE996-.LBB996
+	.4byte	0x1513e
+	.8byte	.LBB1027
+	.8byte	.LBE1027-.LBB1027
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14f76
+	.4byte	0x15159
 	.uleb128 0x55
-	.4byte	0x14f6b
+	.4byte	0x1514e
 	.byte	0
 	.byte	0
 	.uleb128 0x57
-	.8byte	.LBB998
-	.8byte	.LBE998-.LBB998
+	.8byte	.LBB1029
+	.8byte	.LBE1029-.LBB1029
 	.uleb128 0x58
-	.4byte	0x14a36
+	.4byte	0x14c19
 	.uleb128 0x5d
-	.4byte	0x14ece
-	.8byte	.LBB999
-	.8byte	.LBE999-.LBB999
+	.4byte	0x150b1
+	.8byte	.LBB1030
+	.8byte	.LBE1030-.LBB1030
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14eea
+	.4byte	0x150cd
 	.uleb128 0x55
-	.4byte	0x14ede
+	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1000
-	.8byte	.LBE1000-.LBB1000
+	.8byte	.LBB1031
+	.8byte	.LBE1031-.LBB1031
 	.uleb128 0x58
-	.4byte	0x14ef6
+	.4byte	0x150d9
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x149c2
-	.8byte	.LBB1005
-	.8byte	.LBE1005-.LBB1005
+	.4byte	0x14ba5
+	.8byte	.LBB1036
+	.8byte	.LBE1036-.LBB1036
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x1087c
+	.4byte	0x10889
 	.uleb128 0x55
-	.4byte	0x149d2
+	.4byte	0x14bb5
 	.uleb128 0x57
-	.8byte	.LBB1006
-	.8byte	.LBE1006-.LBB1006
+	.8byte	.LBB1037
+	.8byte	.LBE1037-.LBB1037
 	.uleb128 0x61
-	.4byte	0x149de
+	.4byte	0x14bc1
 	.4byte	.LLST25
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0xc0
-	.4byte	0x10847
+	.4byte	0x10854
 	.uleb128 0x61
-	.4byte	0x149ea
+	.4byte	0x14bcd
 	.4byte	.LLST26
 	.uleb128 0x5d
-	.4byte	0x14ece
-	.8byte	.LBB1008
-	.8byte	.LBE1008-.LBB1008
+	.4byte	0x150b1
+	.8byte	.LBB1039
+	.8byte	.LBE1039-.LBB1039
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14eea
+	.4byte	0x150cd
 	.uleb128 0x55
-	.4byte	0x14ede
+	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1009
-	.8byte	.LBE1009-.LBB1009
+	.8byte	.LBB1040
+	.8byte	.LBE1040-.LBB1040
 	.uleb128 0x58
-	.4byte	0x14ef6
+	.4byte	0x150d9
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14e47
-	.8byte	.LBB1010
-	.8byte	.LBE1010-.LBB1010
+	.4byte	0x1502a
+	.8byte	.LBB1041
+	.8byte	.LBE1041-.LBB1041
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1011
-	.8byte	.LBE1011-.LBB1011
+	.8byte	.LBB1042
+	.8byte	.LBE1042-.LBB1042
 	.uleb128 0x61
-	.4byte	0x14e57
+	.4byte	0x1503a
 	.4byte	.LLST27
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL155
-	.4byte	0x155e2
+	.8byte	.LVL156
+	.4byte	0x157c5
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14921
-	.8byte	.LBB1021
+	.4byte	0x14b04
+	.8byte	.LBB1052
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
-	.2byte	0x974
-	.4byte	0x10ab6
+	.2byte	0x978
+	.4byte	0x10ac3
 	.uleb128 0x55
-	.4byte	0x14948
+	.4byte	0x14b2b
 	.uleb128 0x55
-	.4byte	0x1493c
+	.4byte	0x14b1f
 	.uleb128 0x55
-	.4byte	0x14931
+	.4byte	0x14b14
 	.uleb128 0x6e
-	.4byte	0x14985
-	.8byte	.LBB1022
+	.4byte	0x14b68
+	.8byte	.LBB1053
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x149ac
+	.4byte	0x14b8f
 	.uleb128 0x55
-	.4byte	0x149a0
+	.4byte	0x14b83
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14b78
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x58
-	.4byte	0x149b6
+	.4byte	0x14b99
 	.uleb128 0x6f
-	.4byte	0x149f7
-	.8byte	.LBB1024
+	.4byte	0x14bda
+	.8byte	.LBB1055
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x109eb
+	.4byte	0x109f8
 	.uleb128 0x55
-	.4byte	0x14a13
+	.4byte	0x14bf6
 	.uleb128 0x70
-	.4byte	0x14a07
+	.4byte	0x14bea
 	.4byte	.LLST28
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x130
 	.uleb128 0x61
-	.4byte	0x14a1f
+	.4byte	0x14c02
 	.4byte	.LLST29
 	.uleb128 0x61
-	.4byte	0x14a2a
+	.4byte	0x14c0d
 	.4byte	.LLST30
 	.uleb128 0x71
-	.4byte	0x14e47
-	.8byte	.LBB1026
-	.8byte	.LBE1026-.LBB1026
+	.4byte	0x1502a
+	.8byte	.LBB1057
+	.8byte	.LBE1057-.LBB1057
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10951
+	.4byte	0x1095e
 	.uleb128 0x57
-	.8byte	.LBB1027
-	.8byte	.LBE1027-.LBB1027
+	.8byte	.LBB1058
+	.8byte	.LBE1058-.LBB1058
 	.uleb128 0x61
-	.4byte	0x14e57
+	.4byte	0x1503a
 	.4byte	.LLST31
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1028
-	.8byte	.LBE1028-.LBB1028
-	.4byte	0x109a5
+	.8byte	.LBB1059
+	.8byte	.LBE1059-.LBB1059
+	.4byte	0x109b2
 	.uleb128 0x58
-	.4byte	0x14a36
+	.4byte	0x14c19
 	.uleb128 0x5d
-	.4byte	0x14ece
-	.8byte	.LBB1029
-	.8byte	.LBE1029-.LBB1029
+	.4byte	0x150b1
+	.8byte	.LBB1060
+	.8byte	.LBE1060-.LBB1060
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14eea
+	.4byte	0x150cd
 	.uleb128 0x55
-	.4byte	0x14ede
+	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1030
-	.8byte	.LBE1030-.LBB1030
+	.8byte	.LBB1061
+	.8byte	.LBE1061-.LBB1061
 	.uleb128 0x58
-	.4byte	0x14ef6
+	.4byte	0x150d9
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14e19
-	.8byte	.LBB1031
-	.8byte	.LBE1031-.LBB1031
+	.4byte	0x14ffc
+	.8byte	.LBB1062
+	.8byte	.LBE1062-.LBB1062
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14e34
+	.4byte	0x15017
 	.uleb128 0x55
-	.4byte	0x14e29
+	.4byte	0x1500c
 	.uleb128 0x5d
-	.4byte	0x14f5b
-	.8byte	.LBB1032
-	.8byte	.LBE1032-.LBB1032
+	.4byte	0x1513e
+	.8byte	.LBB1063
+	.8byte	.LBE1063-.LBB1063
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14f76
+	.4byte	0x15159
 	.uleb128 0x55
-	.4byte	0x14f6b
+	.4byte	0x1514e
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x149c2
-	.8byte	.LBB1036
-	.8byte	.LBE1036-.LBB1036
+	.4byte	0x14ba5
+	.8byte	.LBB1067
+	.8byte	.LBE1067-.LBB1067
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10aa6
+	.4byte	0x10ab3
 	.uleb128 0x55
-	.4byte	0x149d2
+	.4byte	0x14bb5
 	.uleb128 0x57
-	.8byte	.LBB1037
-	.8byte	.LBE1037-.LBB1037
+	.8byte	.LBB1068
+	.8byte	.LBE1068-.LBB1068
 	.uleb128 0x61
-	.4byte	0x149de
+	.4byte	0x14bc1
 	.4byte	.LLST32
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x170
-	.4byte	0x10a71
+	.4byte	0x10a7e
 	.uleb128 0x61
-	.4byte	0x149ea
+	.4byte	0x14bcd
 	.4byte	.LLST33
 	.uleb128 0x5d
-	.4byte	0x14ece
-	.8byte	.LBB1039
-	.8byte	.LBE1039-.LBB1039
+	.4byte	0x150b1
+	.8byte	.LBB1070
+	.8byte	.LBE1070-.LBB1070
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14eea
+	.4byte	0x150cd
 	.uleb128 0x55
-	.4byte	0x14ede
+	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1040
-	.8byte	.LBE1040-.LBB1040
+	.8byte	.LBB1071
+	.8byte	.LBE1071-.LBB1071
 	.uleb128 0x58
-	.4byte	0x14ef6
+	.4byte	0x150d9
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14e47
-	.8byte	.LBB1041
-	.8byte	.LBE1041-.LBB1041
+	.4byte	0x1502a
+	.8byte	.LBB1072
+	.8byte	.LBE1072-.LBB1072
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1042
-	.8byte	.LBE1042-.LBB1042
+	.8byte	.LBB1073
+	.8byte	.LBE1073-.LBB1073
 	.uleb128 0x61
-	.4byte	0x14e57
+	.4byte	0x1503a
 	.4byte	.LLST34
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL120
-	.4byte	0x155ef
+	.8byte	.LVL121
+	.4byte	0x157d2
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14921
-	.8byte	.LBB1056
+	.4byte	0x14b04
+	.8byte	.LBB1087
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
-	.2byte	0x990
-	.4byte	0x10ce1
+	.2byte	0x994
+	.4byte	0x10cee
 	.uleb128 0x55
-	.4byte	0x14948
+	.4byte	0x14b2b
 	.uleb128 0x55
-	.4byte	0x1493c
+	.4byte	0x14b1f
 	.uleb128 0x55
-	.4byte	0x14931
+	.4byte	0x14b14
 	.uleb128 0x6e
-	.4byte	0x14985
-	.8byte	.LBB1057
+	.4byte	0x14b68
+	.8byte	.LBB1088
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x149ac
+	.4byte	0x14b8f
 	.uleb128 0x55
-	.4byte	0x149a0
+	.4byte	0x14b83
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14b78
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1f0
 	.uleb128 0x58
-	.4byte	0x149b6
+	.4byte	0x14b99
 	.uleb128 0x6f
-	.4byte	0x149f7
-	.8byte	.LBB1059
+	.4byte	0x14bda
+	.8byte	.LBB1090
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x10c16
+	.4byte	0x10c23
 	.uleb128 0x55
-	.4byte	0x14a13
+	.4byte	0x14bf6
 	.uleb128 0x70
-	.4byte	0x14a07
+	.4byte	0x14bea
 	.4byte	.LLST36
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x230
 	.uleb128 0x61
-	.4byte	0x14a1f
+	.4byte	0x14c02
 	.4byte	.LLST37
 	.uleb128 0x61
-	.4byte	0x14a2a
+	.4byte	0x14c0d
 	.4byte	.LLST38
 	.uleb128 0x71
-	.4byte	0x14e47
-	.8byte	.LBB1061
-	.8byte	.LBE1061-.LBB1061
+	.4byte	0x1502a
+	.8byte	.LBB1092
+	.8byte	.LBE1092-.LBB1092
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10b7c
+	.4byte	0x10b89
 	.uleb128 0x57
-	.8byte	.LBB1062
-	.8byte	.LBE1062-.LBB1062
+	.8byte	.LBB1093
+	.8byte	.LBE1093-.LBB1093
 	.uleb128 0x61
-	.4byte	0x14e57
+	.4byte	0x1503a
 	.4byte	.LLST39
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1063
-	.8byte	.LBE1063-.LBB1063
-	.4byte	0x10bd0
+	.8byte	.LBB1094
+	.8byte	.LBE1094-.LBB1094
+	.4byte	0x10bdd
 	.uleb128 0x58
-	.4byte	0x14a36
+	.4byte	0x14c19
 	.uleb128 0x5d
-	.4byte	0x14ece
-	.8byte	.LBB1064
-	.8byte	.LBE1064-.LBB1064
+	.4byte	0x150b1
+	.8byte	.LBB1095
+	.8byte	.LBE1095-.LBB1095
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14eea
+	.4byte	0x150cd
 	.uleb128 0x55
-	.4byte	0x14ede
+	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1065
-	.8byte	.LBE1065-.LBB1065
+	.8byte	.LBB1096
+	.8byte	.LBE1096-.LBB1096
 	.uleb128 0x58
-	.4byte	0x14ef6
+	.4byte	0x150d9
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14e19
-	.8byte	.LBB1066
-	.8byte	.LBE1066-.LBB1066
+	.4byte	0x14ffc
+	.8byte	.LBB1097
+	.8byte	.LBE1097-.LBB1097
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14e34
+	.4byte	0x15017
 	.uleb128 0x55
-	.4byte	0x14e29
+	.4byte	0x1500c
 	.uleb128 0x5d
-	.4byte	0x14f5b
-	.8byte	.LBB1067
-	.8byte	.LBE1067-.LBB1067
+	.4byte	0x1513e
+	.8byte	.LBB1098
+	.8byte	.LBE1098-.LBB1098
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14f76
+	.4byte	0x15159
 	.uleb128 0x55
-	.4byte	0x14f6b
+	.4byte	0x1514e
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x149c2
-	.8byte	.LBB1071
-	.8byte	.LBE1071-.LBB1071
+	.4byte	0x14ba5
+	.8byte	.LBB1102
+	.8byte	.LBE1102-.LBB1102
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10cd1
+	.4byte	0x10cde
 	.uleb128 0x55
-	.4byte	0x149d2
+	.4byte	0x14bb5
 	.uleb128 0x57
-	.8byte	.LBB1072
-	.8byte	.LBE1072-.LBB1072
+	.8byte	.LBB1103
+	.8byte	.LBE1103-.LBB1103
 	.uleb128 0x61
-	.4byte	0x149de
+	.4byte	0x14bc1
 	.4byte	.LLST40
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x270
-	.4byte	0x10c9c
+	.4byte	0x10ca9
 	.uleb128 0x61
-	.4byte	0x149ea
+	.4byte	0x14bcd
 	.4byte	.LLST41
 	.uleb128 0x5d
-	.4byte	0x14ece
-	.8byte	.LBB1074
-	.8byte	.LBE1074-.LBB1074
+	.4byte	0x150b1
+	.8byte	.LBB1105
+	.8byte	.LBE1105-.LBB1105
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14eea
+	.4byte	0x150cd
 	.uleb128 0x55
-	.4byte	0x14ede
+	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1075
-	.8byte	.LBE1075-.LBB1075
+	.8byte	.LBB1106
+	.8byte	.LBE1106-.LBB1106
 	.uleb128 0x58
-	.4byte	0x14ef6
+	.4byte	0x150d9
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14e47
-	.8byte	.LBB1076
-	.8byte	.LBE1076-.LBB1076
+	.4byte	0x1502a
+	.8byte	.LBB1107
+	.8byte	.LBE1107-.LBB1107
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1077
-	.8byte	.LBE1077-.LBB1077
+	.8byte	.LBB1108
+	.8byte	.LBE1108-.LBB1108
 	.uleb128 0x61
-	.4byte	0x14e57
+	.4byte	0x1503a
 	.4byte	.LLST42
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL144
-	.4byte	0x155ef
+	.8byte	.LVL145
+	.4byte	0x157d2
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x148ef
-	.8byte	.LBB1086
+	.4byte	0x14ad2
+	.8byte	.LBB1117
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
 	.2byte	0x95d
-	.4byte	0x10f01
+	.4byte	0x10f0e
 	.uleb128 0x55
-	.4byte	0x14916
+	.4byte	0x14af9
 	.uleb128 0x55
-	.4byte	0x1490a
+	.4byte	0x14aed
 	.uleb128 0x55
-	.4byte	0x148ff
+	.4byte	0x14ae2
 	.uleb128 0x6e
-	.4byte	0x14953
-	.8byte	.LBB1087
+	.4byte	0x14b36
+	.8byte	.LBB1118
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1497a
+	.4byte	0x14b5d
 	.uleb128 0x55
-	.4byte	0x1496e
+	.4byte	0x14b51
 	.uleb128 0x55
-	.4byte	0x14963
+	.4byte	0x14b46
 	.uleb128 0x6f
-	.4byte	0x149f7
-	.8byte	.LBB1089
+	.4byte	0x14bda
+	.8byte	.LBB1120
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10e37
+	.4byte	0x10e44
 	.uleb128 0x55
-	.4byte	0x14a13
+	.4byte	0x14bf6
 	.uleb128 0x70
-	.4byte	0x14a07
+	.4byte	0x14bea
 	.4byte	.LLST43
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x2f0
 	.uleb128 0x61
-	.4byte	0x14a1f
+	.4byte	0x14c02
 	.4byte	.LLST44
 	.uleb128 0x61
-	.4byte	0x14a2a
+	.4byte	0x14c0d
 	.4byte	.LLST45
 	.uleb128 0x71
-	.4byte	0x14e47
-	.8byte	.LBB1091
-	.8byte	.LBE1091-.LBB1091
+	.4byte	0x1502a
+	.8byte	.LBB1122
+	.8byte	.LBE1122-.LBB1122
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10d9d
+	.4byte	0x10daa
 	.uleb128 0x57
-	.8byte	.LBB1092
-	.8byte	.LBE1092-.LBB1092
+	.8byte	.LBB1123
+	.8byte	.LBE1123-.LBB1123
 	.uleb128 0x61
-	.4byte	0x14e57
+	.4byte	0x1503a
 	.4byte	.LLST46
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1093
-	.8byte	.LBE1093-.LBB1093
-	.4byte	0x10df1
+	.8byte	.LBB1124
+	.8byte	.LBE1124-.LBB1124
+	.4byte	0x10dfe
 	.uleb128 0x58
-	.4byte	0x14a36
-	.uleb128 0x5d
-	.4byte	0x14ece
-	.8byte	.LBB1094
-	.8byte	.LBE1094-.LBB1094
+	.4byte	0x14c19
+	.uleb128 0x5d
+	.4byte	0x150b1
+	.8byte	.LBB1125
+	.8byte	.LBE1125-.LBB1125
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14eea
+	.4byte	0x150cd
 	.uleb128 0x55
-	.4byte	0x14ede
+	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1095
-	.8byte	.LBE1095-.LBB1095
+	.8byte	.LBB1126
+	.8byte	.LBE1126-.LBB1126
 	.uleb128 0x58
-	.4byte	0x14ef6
+	.4byte	0x150d9
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14e19
-	.8byte	.LBB1096
-	.8byte	.LBE1096-.LBB1096
+	.4byte	0x14ffc
+	.8byte	.LBB1127
+	.8byte	.LBE1127-.LBB1127
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14e34
+	.4byte	0x15017
 	.uleb128 0x55
-	.4byte	0x14e29
+	.4byte	0x1500c
 	.uleb128 0x5d
-	.4byte	0x14f5b
-	.8byte	.LBB1097
-	.8byte	.LBE1097-.LBB1097
+	.4byte	0x1513e
+	.8byte	.LBB1128
+	.8byte	.LBE1128-.LBB1128
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14f76
+	.4byte	0x15159
 	.uleb128 0x55
-	.4byte	0x14f6b
+	.4byte	0x1514e
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x149c2
-	.8byte	.LBB1103
-	.8byte	.LBE1103-.LBB1103
+	.4byte	0x14ba5
+	.8byte	.LBB1134
+	.8byte	.LBE1134-.LBB1134
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x10ef2
+	.4byte	0x10eff
 	.uleb128 0x55
-	.4byte	0x149d2
+	.4byte	0x14bb5
 	.uleb128 0x57
-	.8byte	.LBB1104
-	.8byte	.LBE1104-.LBB1104
+	.8byte	.LBB1135
+	.8byte	.LBE1135-.LBB1135
 	.uleb128 0x61
-	.4byte	0x149de
+	.4byte	0x14bc1
 	.4byte	.LLST47
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x340
-	.4byte	0x10ebd
+	.4byte	0x10eca
 	.uleb128 0x61
-	.4byte	0x149ea
+	.4byte	0x14bcd
 	.4byte	.LLST48
 	.uleb128 0x5d
-	.4byte	0x14ece
-	.8byte	.LBB1106
-	.8byte	.LBE1106-.LBB1106
+	.4byte	0x150b1
+	.8byte	.LBB1137
+	.8byte	.LBE1137-.LBB1137
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14eea
+	.4byte	0x150cd
 	.uleb128 0x55
-	.4byte	0x14ede
+	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1107
-	.8byte	.LBE1107-.LBB1107
+	.8byte	.LBB1138
+	.8byte	.LBE1138-.LBB1138
 	.uleb128 0x58
-	.4byte	0x14ef6
+	.4byte	0x150d9
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14e47
-	.8byte	.LBB1108
-	.8byte	.LBE1108-.LBB1108
+	.4byte	0x1502a
+	.8byte	.LBB1139
+	.8byte	.LBE1139-.LBB1139
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1109
-	.8byte	.LBE1109-.LBB1109
+	.8byte	.LBB1140
+	.8byte	.LBE1140-.LBB1140
 	.uleb128 0x61
-	.4byte	0x14e57
+	.4byte	0x1503a
 	.4byte	.LLST49
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL171
-	.4byte	0x155e2
+	.8byte	.LVL172
+	.4byte	0x157c5
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14921
-	.8byte	.LBB1120
+	.4byte	0x14b04
+	.8byte	.LBB1151
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
-	.2byte	0x9ad
-	.4byte	0x1113d
+	.2byte	0x9b1
+	.4byte	0x1114a
 	.uleb128 0x55
-	.4byte	0x14948
+	.4byte	0x14b2b
 	.uleb128 0x55
-	.4byte	0x1493c
+	.4byte	0x14b1f
 	.uleb128 0x55
-	.4byte	0x14931
+	.4byte	0x14b14
 	.uleb128 0x6e
-	.4byte	0x14985
-	.8byte	.LBB1121
+	.4byte	0x14b68
+	.8byte	.LBB1152
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x149ac
+	.4byte	0x14b8f
 	.uleb128 0x55
-	.4byte	0x149a0
+	.4byte	0x14b83
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14b78
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x370
 	.uleb128 0x61
-	.4byte	0x149b6
+	.4byte	0x14b99
 	.4byte	.LLST50
 	.uleb128 0x6f
-	.4byte	0x149f7
-	.8byte	.LBB1123
+	.4byte	0x14bda
+	.8byte	.LBB1154
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x11065
+	.4byte	0x11072
 	.uleb128 0x55
-	.4byte	0x14a13
+	.4byte	0x14bf6
 	.uleb128 0x70
-	.4byte	0x14a07
+	.4byte	0x14bea
 	.4byte	.LLST51
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x61
-	.4byte	0x14a1f
+	.4byte	0x14c02
 	.4byte	.LLST52
 	.uleb128 0x61
-	.4byte	0x14a2a
+	.4byte	0x14c0d
 	.4byte	.LLST53
 	.uleb128 0x71
-	.4byte	0x14e47
-	.8byte	.LBB1125
-	.8byte	.LBE1125-.LBB1125
+	.4byte	0x1502a
+	.8byte	.LBB1156
+	.8byte	.LBE1156-.LBB1156
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10fcb
+	.4byte	0x10fd8
 	.uleb128 0x57
-	.8byte	.LBB1126
-	.8byte	.LBE1126-.LBB1126
+	.8byte	.LBB1157
+	.8byte	.LBE1157-.LBB1157
 	.uleb128 0x61
-	.4byte	0x14e57
+	.4byte	0x1503a
 	.4byte	.LLST54
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1127
-	.8byte	.LBE1127-.LBB1127
-	.4byte	0x1101f
+	.8byte	.LBB1158
+	.8byte	.LBE1158-.LBB1158
+	.4byte	0x1102c
 	.uleb128 0x58
-	.4byte	0x14a36
+	.4byte	0x14c19
 	.uleb128 0x5d
-	.4byte	0x14ece
-	.8byte	.LBB1128
-	.8byte	.LBE1128-.LBB1128
+	.4byte	0x150b1
+	.8byte	.LBB1159
+	.8byte	.LBE1159-.LBB1159
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14eea
+	.4byte	0x150cd
 	.uleb128 0x55
-	.4byte	0x14ede
+	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1129
-	.8byte	.LBE1129-.LBB1129
+	.8byte	.LBB1160
+	.8byte	.LBE1160-.LBB1160
 	.uleb128 0x58
-	.4byte	0x14ef6
+	.4byte	0x150d9
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14e19
-	.8byte	.LBB1130
-	.8byte	.LBE1130-.LBB1130
+	.4byte	0x14ffc
+	.8byte	.LBB1161
+	.8byte	.LBE1161-.LBB1161
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14e34
+	.4byte	0x15017
 	.uleb128 0x55
-	.4byte	0x14e29
+	.4byte	0x1500c
 	.uleb128 0x5d
-	.4byte	0x14f5b
-	.8byte	.LBB1131
-	.8byte	.LBE1131-.LBB1131
+	.4byte	0x1513e
+	.8byte	.LBB1162
+	.8byte	.LBE1162-.LBB1162
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14f76
+	.4byte	0x15159
 	.uleb128 0x55
-	.4byte	0x14f6b
+	.4byte	0x1514e
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x149c2
-	.8byte	.LBB1137
-	.8byte	.LBE1137-.LBB1137
+	.4byte	0x14ba5
+	.8byte	.LBB1168
+	.8byte	.LBE1168-.LBB1168
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x11120
+	.4byte	0x1112d
 	.uleb128 0x55
-	.4byte	0x149d2
+	.4byte	0x14bb5
 	.uleb128 0x57
-	.8byte	.LBB1138
-	.8byte	.LBE1138-.LBB1138
+	.8byte	.LBB1169
+	.8byte	.LBE1169-.LBB1169
 	.uleb128 0x61
-	.4byte	0x149de
+	.4byte	0x14bc1
 	.4byte	.LLST55
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x420
-	.4byte	0x110eb
+	.4byte	0x110f8
 	.uleb128 0x61
-	.4byte	0x149ea
+	.4byte	0x14bcd
 	.4byte	.LLST56
 	.uleb128 0x5d
-	.4byte	0x14ece
-	.8byte	.LBB1140
-	.8byte	.LBE1140-.LBB1140
+	.4byte	0x150b1
+	.8byte	.LBB1171
+	.8byte	.LBE1171-.LBB1171
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14eea
+	.4byte	0x150cd
 	.uleb128 0x55
-	.4byte	0x14ede
+	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1141
-	.8byte	.LBE1141-.LBB1141
+	.8byte	.LBB1172
+	.8byte	.LBE1172-.LBB1172
 	.uleb128 0x58
-	.4byte	0x14ef6
+	.4byte	0x150d9
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14e47
-	.8byte	.LBB1142
-	.8byte	.LBE1142-.LBB1142
+	.4byte	0x1502a
+	.8byte	.LBB1173
+	.8byte	.LBE1173-.LBB1173
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1143
-	.8byte	.LBE1143-.LBB1143
+	.8byte	.LBB1174
+	.8byte	.LBE1174-.LBB1174
 	.uleb128 0x61
-	.4byte	0x14e57
+	.4byte	0x1503a
 	.4byte	.LLST57
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL183
-	.4byte	0x155ef
+	.8byte	.LVL184
+	.4byte	0x157d2
 	.uleb128 0x4f
-	.8byte	.LVL261
-	.4byte	0x15405
+	.8byte	.LVL282
+	.4byte	0x155e8
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x148ef
-	.8byte	.LBB1156
+	.4byte	0x14ad2
+	.8byte	.LBB1187
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
-	.2byte	0x9cb
-	.4byte	0x111ef
+	.2byte	0x9cf
+	.4byte	0x111fc
 	.uleb128 0x55
-	.4byte	0x14916
+	.4byte	0x14af9
 	.uleb128 0x55
-	.4byte	0x1490a
+	.4byte	0x14aed
 	.uleb128 0x55
-	.4byte	0x148ff
+	.4byte	0x14ae2
 	.uleb128 0x6e
-	.4byte	0x14953
-	.8byte	.LBB1157
+	.4byte	0x14b36
+	.8byte	.LBB1188
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1497a
+	.4byte	0x14b5d
 	.uleb128 0x55
-	.4byte	0x1496e
+	.4byte	0x14b51
 	.uleb128 0x55
-	.4byte	0x14963
+	.4byte	0x14b46
 	.uleb128 0x6e
-	.4byte	0x149f7
-	.8byte	.LBB1159
+	.4byte	0x14bda
+	.8byte	.LBB1190
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x55
-	.4byte	0x14a13
+	.4byte	0x14bf6
 	.uleb128 0x72
-	.4byte	0x14a07
+	.4byte	0x14bea
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x4b0
 	.uleb128 0x58
-	.4byte	0x14a1f
+	.4byte	0x14c02
 	.uleb128 0x61
-	.4byte	0x14a2a
+	.4byte	0x14c0d
 	.4byte	.LLST58
 	.uleb128 0x5d
-	.4byte	0x14e47
-	.8byte	.LBB1161
-	.8byte	.LBE1161-.LBB1161
+	.4byte	0x1502a
+	.8byte	.LBB1192
+	.8byte	.LBE1192-.LBB1192
 	.byte	0x6
 	.byte	0x4d
 	.uleb128 0x57
-	.8byte	.LBB1162
-	.8byte	.LBE1162-.LBB1162
+	.8byte	.LBB1193
+	.8byte	.LBE1193-.LBB1193
 	.uleb128 0x61
-	.4byte	0x14e57
+	.4byte	0x1503a
 	.4byte	.LLST59
 	.byte	0
 	.byte	0
@@ -43887,450 +44084,594 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x148ef
-	.8byte	.LBB1168
+	.4byte	0x14ad2
+	.8byte	.LBB1199
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
-	.2byte	0x9bb
-	.4byte	0x1140f
+	.2byte	0x9bf
+	.4byte	0x1141c
 	.uleb128 0x55
-	.4byte	0x14916
+	.4byte	0x14af9
 	.uleb128 0x55
-	.4byte	0x1490a
+	.4byte	0x14aed
 	.uleb128 0x55
-	.4byte	0x148ff
+	.4byte	0x14ae2
 	.uleb128 0x6e
-	.4byte	0x14953
-	.8byte	.LBB1169
+	.4byte	0x14b36
+	.8byte	.LBB1200
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1497a
+	.4byte	0x14b5d
 	.uleb128 0x55
-	.4byte	0x1496e
+	.4byte	0x14b51
 	.uleb128 0x55
-	.4byte	0x14963
+	.4byte	0x14b46
 	.uleb128 0x6f
-	.4byte	0x149f7
-	.8byte	.LBB1171
+	.4byte	0x14bda
+	.8byte	.LBB1202
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x11345
+	.4byte	0x11352
 	.uleb128 0x55
-	.4byte	0x14a13
+	.4byte	0x14bf6
 	.uleb128 0x70
-	.4byte	0x14a07
+	.4byte	0x14bea
 	.4byte	.LLST60
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x540
 	.uleb128 0x61
-	.4byte	0x14a1f
+	.4byte	0x14c02
 	.4byte	.LLST61
 	.uleb128 0x61
-	.4byte	0x14a2a
+	.4byte	0x14c0d
 	.4byte	.LLST62
 	.uleb128 0x71
-	.4byte	0x14e47
-	.8byte	.LBB1173
-	.8byte	.LBE1173-.LBB1173
+	.4byte	0x1502a
+	.8byte	.LBB1204
+	.8byte	.LBE1204-.LBB1204
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x112ab
+	.4byte	0x112b8
 	.uleb128 0x57
-	.8byte	.LBB1174
-	.8byte	.LBE1174-.LBB1174
+	.8byte	.LBB1205
+	.8byte	.LBE1205-.LBB1205
 	.uleb128 0x61
-	.4byte	0x14e57
+	.4byte	0x1503a
 	.4byte	.LLST63
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1175
-	.8byte	.LBE1175-.LBB1175
-	.4byte	0x112ff
+	.8byte	.LBB1206
+	.8byte	.LBE1206-.LBB1206
+	.4byte	0x1130c
 	.uleb128 0x58
-	.4byte	0x14a36
+	.4byte	0x14c19
 	.uleb128 0x5d
-	.4byte	0x14ece
-	.8byte	.LBB1176
-	.8byte	.LBE1176-.LBB1176
+	.4byte	0x150b1
+	.8byte	.LBB1207
+	.8byte	.LBE1207-.LBB1207
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14eea
+	.4byte	0x150cd
 	.uleb128 0x55
-	.4byte	0x14ede
+	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1177
-	.8byte	.LBE1177-.LBB1177
+	.8byte	.LBB1208
+	.8byte	.LBE1208-.LBB1208
 	.uleb128 0x58
-	.4byte	0x14ef6
+	.4byte	0x150d9
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14e19
-	.8byte	.LBB1178
-	.8byte	.LBE1178-.LBB1178
+	.4byte	0x14ffc
+	.8byte	.LBB1209
+	.8byte	.LBE1209-.LBB1209
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14e34
+	.4byte	0x15017
 	.uleb128 0x55
-	.4byte	0x14e29
+	.4byte	0x1500c
 	.uleb128 0x5d
-	.4byte	0x14f5b
-	.8byte	.LBB1179
-	.8byte	.LBE1179-.LBB1179
+	.4byte	0x1513e
+	.8byte	.LBB1210
+	.8byte	.LBE1210-.LBB1210
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14f76
+	.4byte	0x15159
 	.uleb128 0x55
-	.4byte	0x14f6b
+	.4byte	0x1514e
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x149c2
-	.8byte	.LBB1187
-	.8byte	.LBE1187-.LBB1187
+	.4byte	0x14ba5
+	.8byte	.LBB1218
+	.8byte	.LBE1218-.LBB1218
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x11400
+	.4byte	0x1140d
 	.uleb128 0x55
-	.4byte	0x149d2
+	.4byte	0x14bb5
 	.uleb128 0x57
-	.8byte	.LBB1188
-	.8byte	.LBE1188-.LBB1188
+	.8byte	.LBB1219
+	.8byte	.LBE1219-.LBB1219
 	.uleb128 0x61
-	.4byte	0x149de
+	.4byte	0x14bc1
 	.4byte	.LLST64
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x590
-	.4byte	0x113cb
+	.4byte	0x113d8
 	.uleb128 0x61
-	.4byte	0x149ea
+	.4byte	0x14bcd
 	.4byte	.LLST65
 	.uleb128 0x5d
-	.4byte	0x14ece
-	.8byte	.LBB1190
-	.8byte	.LBE1190-.LBB1190
+	.4byte	0x150b1
+	.8byte	.LBB1221
+	.8byte	.LBE1221-.LBB1221
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14eea
+	.4byte	0x150cd
 	.uleb128 0x55
-	.4byte	0x14ede
+	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1191
-	.8byte	.LBE1191-.LBB1191
+	.8byte	.LBB1222
+	.8byte	.LBE1222-.LBB1222
 	.uleb128 0x58
-	.4byte	0x14ef6
+	.4byte	0x150d9
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14e47
-	.8byte	.LBB1192
-	.8byte	.LBE1192-.LBB1192
+	.4byte	0x1502a
+	.8byte	.LBB1223
+	.8byte	.LBE1223-.LBB1223
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1193
-	.8byte	.LBE1193-.LBB1193
+	.8byte	.LBB1224
+	.8byte	.LBE1224-.LBB1224
 	.uleb128 0x61
-	.4byte	0x14e57
+	.4byte	0x1503a
 	.4byte	.LLST66
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL244
-	.4byte	0x155e2
+	.8byte	.LVL274
+	.4byte	0x157c5
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x148ef
-	.8byte	.LBB1204
+	.4byte	0x14b04
+	.8byte	.LBB1235
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
-	.2byte	0x96c
-	.4byte	0x1162f
+	.2byte	0x960
+	.4byte	0x11658
 	.uleb128 0x55
-	.4byte	0x14916
+	.4byte	0x14b2b
 	.uleb128 0x55
-	.4byte	0x1490a
+	.4byte	0x14b1f
 	.uleb128 0x55
-	.4byte	0x148ff
+	.4byte	0x14b14
 	.uleb128 0x6e
-	.4byte	0x14953
-	.8byte	.LBB1205
+	.4byte	0x14b68
+	.8byte	.LBB1236
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
-	.byte	0x9b
+	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x1497a
+	.4byte	0x14b8f
 	.uleb128 0x55
-	.4byte	0x1496e
+	.4byte	0x14b83
 	.uleb128 0x55
-	.4byte	0x14963
+	.4byte	0x14b78
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0x5c0
+	.uleb128 0x61
+	.4byte	0x14b99
+	.4byte	.LLST67
 	.uleb128 0x6f
-	.4byte	0x149f7
-	.8byte	.LBB1207
-	.4byte	.Ldebug_ranges0+0x620
+	.4byte	0x14bda
+	.8byte	.LBB1238
+	.4byte	.Ldebug_ranges0+0x610
 	.byte	0x9
-	.byte	0x84
-	.4byte	0x11565
+	.byte	0x72
+	.4byte	0x11580
 	.uleb128 0x55
-	.4byte	0x14a13
+	.4byte	0x14bf6
 	.uleb128 0x70
-	.4byte	0x14a07
-	.4byte	.LLST67
-	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x620
-	.uleb128 0x61
-	.4byte	0x14a1f
+	.4byte	0x14bea
 	.4byte	.LLST68
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0x610
 	.uleb128 0x61
-	.4byte	0x14a2a
+	.4byte	0x14c02
 	.4byte	.LLST69
+	.uleb128 0x61
+	.4byte	0x14c0d
+	.4byte	.LLST70
 	.uleb128 0x71
-	.4byte	0x14e47
-	.8byte	.LBB1209
-	.8byte	.LBE1209-.LBB1209
+	.4byte	0x1502a
+	.8byte	.LBB1240
+	.8byte	.LBE1240-.LBB1240
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x114cb
+	.4byte	0x114e6
 	.uleb128 0x57
-	.8byte	.LBB1210
-	.8byte	.LBE1210-.LBB1210
+	.8byte	.LBB1241
+	.8byte	.LBE1241-.LBB1241
 	.uleb128 0x61
-	.4byte	0x14e57
-	.4byte	.LLST70
+	.4byte	0x1503a
+	.4byte	.LLST71
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1211
-	.8byte	.LBE1211-.LBB1211
-	.4byte	0x1151f
+	.8byte	.LBB1242
+	.8byte	.LBE1242-.LBB1242
+	.4byte	0x1153a
 	.uleb128 0x58
-	.4byte	0x14a36
+	.4byte	0x14c19
 	.uleb128 0x5d
-	.4byte	0x14ece
-	.8byte	.LBB1212
-	.8byte	.LBE1212-.LBB1212
+	.4byte	0x150b1
+	.8byte	.LBB1243
+	.8byte	.LBE1243-.LBB1243
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14eea
+	.4byte	0x150cd
 	.uleb128 0x55
-	.4byte	0x14ede
+	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1213
-	.8byte	.LBE1213-.LBB1213
+	.8byte	.LBB1244
+	.8byte	.LBE1244-.LBB1244
 	.uleb128 0x58
-	.4byte	0x14ef6
+	.4byte	0x150d9
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14e19
-	.8byte	.LBB1214
-	.8byte	.LBE1214-.LBB1214
+	.4byte	0x14ffc
+	.8byte	.LBB1245
+	.8byte	.LBE1245-.LBB1245
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14e34
+	.4byte	0x15017
 	.uleb128 0x55
-	.4byte	0x14e29
+	.4byte	0x1500c
 	.uleb128 0x5d
-	.4byte	0x14f5b
-	.8byte	.LBB1215
-	.8byte	.LBE1215-.LBB1215
+	.4byte	0x1513e
+	.8byte	.LBB1246
+	.8byte	.LBE1246-.LBB1246
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14f76
+	.4byte	0x15159
 	.uleb128 0x55
-	.4byte	0x14f6b
+	.4byte	0x1514e
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x149c2
-	.8byte	.LBB1223
-	.8byte	.LBE1223-.LBB1223
+	.4byte	0x14ba5
+	.8byte	.LBB1250
+	.8byte	.LBE1250-.LBB1250
 	.byte	0x9
-	.byte	0x86
-	.4byte	0x11620
+	.byte	0x74
+	.4byte	0x1163b
 	.uleb128 0x55
-	.4byte	0x149d2
+	.4byte	0x14bb5
 	.uleb128 0x57
-	.8byte	.LBB1224
-	.8byte	.LBE1224-.LBB1224
+	.8byte	.LBB1251
+	.8byte	.LBE1251-.LBB1251
 	.uleb128 0x61
-	.4byte	0x149de
-	.4byte	.LLST71
+	.4byte	0x14bc1
+	.4byte	.LLST72
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x670
-	.4byte	0x115eb
+	.4byte	.Ldebug_ranges0+0x650
+	.4byte	0x11606
 	.uleb128 0x61
-	.4byte	0x149ea
-	.4byte	.LLST72
+	.4byte	0x14bcd
+	.4byte	.LLST73
 	.uleb128 0x5d
-	.4byte	0x14ece
-	.8byte	.LBB1226
-	.8byte	.LBE1226-.LBB1226
+	.4byte	0x150b1
+	.8byte	.LBB1253
+	.8byte	.LBE1253-.LBB1253
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14eea
+	.4byte	0x150cd
 	.uleb128 0x55
-	.4byte	0x14ede
+	.4byte	0x150c1
 	.uleb128 0x57
-	.8byte	.LBB1227
-	.8byte	.LBE1227-.LBB1227
+	.8byte	.LBB1254
+	.8byte	.LBE1254-.LBB1254
 	.uleb128 0x58
-	.4byte	0x14ef6
+	.4byte	0x150d9
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14e47
-	.8byte	.LBB1228
-	.8byte	.LBE1228-.LBB1228
+	.4byte	0x1502a
+	.8byte	.LBB1255
+	.8byte	.LBE1255-.LBB1255
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1229
-	.8byte	.LBE1229-.LBB1229
+	.8byte	.LBB1256
+	.8byte	.LBE1256-.LBB1256
 	.uleb128 0x61
-	.4byte	0x14e57
-	.4byte	.LLST73
+	.4byte	0x1503a
+	.4byte	.LLST74
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL252
-	.4byte	0x155e2
+	.8byte	.LVL224
+	.4byte	0x157d2
+	.uleb128 0x4f
+	.8byte	.LVL265
+	.4byte	0x155e8
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x5c
+	.4byte	0x14ad2
+	.8byte	.LBB1266
+	.4byte	.Ldebug_ranges0+0x680
+	.byte	0x1
+	.2byte	0x970
+	.4byte	0x11812
+	.uleb128 0x55
+	.4byte	0x14af9
+	.uleb128 0x55
+	.4byte	0x14aed
+	.uleb128 0x55
+	.4byte	0x14ae2
+	.uleb128 0x6e
+	.4byte	0x14b36
+	.8byte	.LBB1267
+	.4byte	.Ldebug_ranges0+0x680
+	.byte	0x9
+	.byte	0x9b
+	.uleb128 0x55
+	.4byte	0x14b5d
+	.uleb128 0x55
+	.4byte	0x14b51
+	.uleb128 0x55
+	.4byte	0x14b46
+	.uleb128 0x6f
+	.4byte	0x14bda
+	.8byte	.LBB1269
+	.4byte	.Ldebug_ranges0+0x6e0
+	.byte	0x9
+	.byte	0x84
+	.4byte	0x11775
+	.uleb128 0x55
+	.4byte	0x14bf6
+	.uleb128 0x70
+	.4byte	0x14bea
+	.4byte	.LLST75
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0x6e0
+	.uleb128 0x61
+	.4byte	0x14c02
+	.4byte	.LLST76
+	.uleb128 0x61
+	.4byte	0x14c0d
+	.4byte	.LLST77
+	.uleb128 0x71
+	.4byte	0x1502a
+	.8byte	.LBB1271
+	.8byte	.LBE1271-.LBB1271
+	.byte	0x6
+	.byte	0x4d
+	.4byte	0x11714
+	.uleb128 0x57
+	.8byte	.LBB1272
+	.8byte	.LBE1272-.LBB1272
+	.uleb128 0x61
+	.4byte	0x1503a
+	.4byte	.LLST78
+	.byte	0
+	.byte	0
+	.uleb128 0x6d
+	.8byte	.LBB1273
+	.8byte	.LBE1273-.LBB1273
+	.4byte	0x1172f
+	.uleb128 0x58
+	.4byte	0x14c19
+	.byte	0
+	.uleb128 0x5d
+	.4byte	0x14ffc
+	.8byte	.LBB1274
+	.8byte	.LBE1274-.LBB1274
+	.byte	0x6
+	.byte	0x55
+	.uleb128 0x55
+	.4byte	0x15017
+	.uleb128 0x55
+	.4byte	0x1500c
+	.uleb128 0x5d
+	.4byte	0x1513e
+	.8byte	.LBB1275
+	.8byte	.LBE1275-.LBB1275
+	.byte	0xca
+	.byte	0x61
+	.uleb128 0x55
+	.4byte	0x15159
+	.uleb128 0x55
+	.4byte	0x1514e
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x71
+	.4byte	0x14ba5
+	.8byte	.LBB1285
+	.8byte	.LBE1285-.LBB1285
+	.byte	0x9
+	.byte	0x86
+	.4byte	0x11803
+	.uleb128 0x55
+	.4byte	0x14bb5
+	.uleb128 0x57
+	.8byte	.LBB1286
+	.8byte	.LBE1286-.LBB1286
+	.uleb128 0x61
+	.4byte	0x14bc1
+	.4byte	.LLST79
+	.uleb128 0x71
+	.4byte	0x1502a
+	.8byte	.LBB1287
+	.8byte	.LBE1287-.LBB1287
+	.byte	0x6
+	.byte	0xfd
+	.4byte	0x117e6
+	.uleb128 0x57
+	.8byte	.LBB1288
+	.8byte	.LBE1288-.LBB1288
+	.uleb128 0x61
+	.4byte	0x1503a
+	.4byte	.LLST80
+	.byte	0
+	.byte	0
+	.uleb128 0x57
+	.8byte	.LBB1289
+	.8byte	.LBE1289-.LBB1289
+	.uleb128 0x61
+	.4byte	0x14bcd
+	.4byte	.LLST81
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4f
+	.8byte	.LVL261
+	.4byte	0x157c5
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL85
-	.4byte	0x15497
+	.4byte	0x1567a
 	.uleb128 0x4f
 	.8byte	.LVL86
-	.4byte	0x154f9
+	.4byte	0x156dc
 	.uleb128 0x4f
 	.8byte	.LVL87
-	.4byte	0x155a4
+	.4byte	0x15787
 	.uleb128 0x4f
 	.8byte	.LVL98
-	.4byte	0x155fc
+	.4byte	0x157df
 	.uleb128 0x4f
 	.8byte	.LVL101
-	.4byte	0x1541b
+	.4byte	0x155fe
 	.uleb128 0x4f
 	.8byte	.LVL104
-	.4byte	0x153a1
-	.uleb128 0x4f
-	.8byte	.LVL121
-	.4byte	0x155a4
+	.4byte	0x15584
 	.uleb128 0x4f
 	.8byte	.LVL122
-	.4byte	0x15608
+	.4byte	0x15787
 	.uleb128 0x4f
-	.8byte	.LVL124
-	.4byte	0x154a3
+	.8byte	.LVL123
+	.4byte	0x157eb
 	.uleb128 0x4f
-	.8byte	.LVL131
-	.4byte	0x15497
+	.8byte	.LVL125
+	.4byte	0x15686
 	.uleb128 0x4f
-	.8byte	.LVL145
-	.4byte	0x15614
+	.8byte	.LVL132
+	.4byte	0x1567a
 	.uleb128 0x4f
 	.8byte	.LVL146
-	.4byte	0x154a3
+	.4byte	0x157f7
 	.uleb128 0x4f
 	.8byte	.LVL147
-	.4byte	0x154ed
+	.4byte	0x15686
 	.uleb128 0x4f
-	.8byte	.LVL157
-	.4byte	0x15620
+	.8byte	.LVL148
+	.4byte	0x156d0
 	.uleb128 0x4f
 	.8byte	.LVL158
-	.4byte	0x155a4
+	.4byte	0x15803
 	.uleb128 0x4f
-	.8byte	.LVL185
-	.4byte	0x153a1
+	.8byte	.LVL159
+	.4byte	0x15787
 	.uleb128 0x4f
-	.8byte	.LVL188
-	.4byte	0x153a1
+	.8byte	.LVL186
+	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL190
-	.4byte	0x15497
+	.8byte	.LVL189
+	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL192
-	.4byte	0x15497
+	.8byte	.LVL191
+	.4byte	0x1567a
 	.uleb128 0x4f
 	.8byte	.LVL193
-	.4byte	0x154f9
+	.4byte	0x1567a
 	.uleb128 0x4f
 	.8byte	.LVL194
-	.4byte	0x155a4
+	.4byte	0x156dc
 	.uleb128 0x4f
-	.8byte	.LVL207
-	.4byte	0x1541b
+	.8byte	.LVL195
+	.4byte	0x15787
 	.uleb128 0x4f
-	.8byte	.LVL210
-	.4byte	0x1541b
+	.8byte	.LVL208
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL212
-	.4byte	0x15497
+	.8byte	.LVL211
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL213
-	.4byte	0x155a4
+	.8byte	.LVL226
+	.4byte	0x1567a
 	.uleb128 0x4f
-	.8byte	.LVL221
-	.4byte	0x155fc
+	.8byte	.LVL228
+	.4byte	0x15787
 	.uleb128 0x4f
-	.8byte	.LVL255
-	.4byte	0x154ed
+	.8byte	.LVL237
+	.4byte	0x157df
 	.uleb128 0x4f
-	.8byte	.LVL262
-	.4byte	0x1541b
+	.8byte	.LVL276
+	.4byte	0x156d0
 	.uleb128 0x4f
-	.8byte	.LVL263
-	.4byte	0x1554f
+	.8byte	.LVL283
+	.4byte	0x155fe
+	.uleb128 0x4f
+	.8byte	.LVL285
+	.4byte	0x15732
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0x117b9
+	.4byte	0x1199c
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xa
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x117a9
+	.4byte	0x1198c
 	.uleb128 0x64
 	.4byte	.LASF3095
 	.byte	0x1
 	.2byte	0x8f1
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x117e8
+	.4byte	0x119cb
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x8f1
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
@@ -44345,16 +44686,16 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2841-.LFB2841
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11822
+	.4byte	0x11a05
 	.uleb128 0x52
 	.string	"t"
 	.byte	0x1
 	.2byte	0x8eb
 	.4byte	0x31d2
-	.4byte	.LLST74
+	.4byte	.LLST82
 	.uleb128 0x4f
-	.8byte	.LVL276
-	.4byte	0x125a9
+	.8byte	.LVL298
+	.4byte	0x1278c
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3098
@@ -44364,7 +44705,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2840-.LFB2840
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11882
+	.4byte	0x11a65
 	.uleb128 0x52
 	.string	"t"
 	.byte	0x1
@@ -44375,18 +44716,18 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x8e1
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x60
-	.4byte	0x14879
-	.8byte	.LBB984
+	.4byte	0x14a5c
+	.8byte	.LBB1015
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
 	.2byte	0x8e5
 	.uleb128 0x55
-	.4byte	0x14886
+	.4byte	0x14a69
 	.uleb128 0x4f
 	.8byte	.LVL71
-	.4byte	0x1562c
+	.4byte	0x1580f
 	.byte	0
 	.byte	0
 	.uleb128 0x64
@@ -44395,17 +44736,17 @@ __exitcall_ebc_exit:
 	.2byte	0x8ce
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x118ac
+	.4byte	0x11a8f
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x8ce
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
 	.2byte	0x8d0
-	.4byte	0xe4f2
+	.4byte	0xe4fe
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3100
@@ -44416,42 +44757,42 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2838-.LFB2838
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x122be
+	.4byte	0x124a1
 	.uleb128 0x52
 	.string	"ptr"
 	.byte	0x1
 	.2byte	0x766
 	.4byte	0x458
-	.4byte	.LLST239
+	.4byte	.LLST247
 	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x768
-	.4byte	0xe557
-	.4byte	.LLST240
+	.4byte	0xe563
+	.4byte	.LLST248
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x769
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x5b
 	.string	"buf"
 	.byte	0x1
 	.2byte	0x76a
-	.4byte	0xe4f2
-	.4byte	.LLST241
+	.4byte	0xe4fe
+	.4byte	.LLST249
 	.uleb128 0x5a
 	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x76b
 	.4byte	0xc6
-	.4byte	.LLST242
+	.4byte	.LLST250
 	.uleb128 0x5a
 	.4byte	.LASF2989
 	.byte	0x1
 	.2byte	0x76c
 	.4byte	0xc6
-	.4byte	.LLST243
+	.4byte	.LLST251
 	.uleb128 0x4d
 	.4byte	.LASF3102
 	.byte	0x1
@@ -44464,29 +44805,29 @@ __exitcall_ebc_exit:
 	.4byte	.LASF3103
 	.byte	0x1
 	.2byte	0x76e
-	.4byte	0xe4f2
-	.4byte	.LLST244
+	.4byte	0xe4fe
+	.4byte	.LLST252
 	.uleb128 0x6c
 	.4byte	.LASF3105
 	.byte	0x1
 	.2byte	0x88e
-	.8byte	.L939
+	.8byte	.L952
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1280
-	.4byte	0x119fc
+	.4byte	.Ldebug_ranges0+0x1320
+	.4byte	0x11bdf
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
 	.2byte	0x7c5
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB1921
-	.8byte	.LBE1921-.LBB1921
+	.8byte	.LBB1983
+	.8byte	.LBE1983-.LBB1983
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x7c5
-	.8byte	.L920
+	.8byte	.L933
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
@@ -44501,45 +44842,45 @@ __exitcall_ebc_exit:
 	.2byte	0x7c5
 	.4byte	0x199
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x12b0
-	.4byte	0x119e0
+	.4byte	.Ldebug_ranges0+0x1350
+	.4byte	0x11bc3
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
 	.2byte	0x7c5
 	.4byte	0x199
-	.4byte	.LLST263
+	.4byte	.LLST271
 	.uleb128 0x4f
-	.8byte	.LVL1032
-	.4byte	0x155b0
+	.8byte	.LVL1054
+	.4byte	0x15793
 	.uleb128 0x4f
-	.8byte	.LVL1033
-	.4byte	0x155bc
+	.8byte	.LVL1055
+	.4byte	0x1579f
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL1030
-	.4byte	0x155c9
+	.8byte	.LVL1052
+	.4byte	0x157ac
 	.uleb128 0x4f
-	.8byte	.LVL1034
-	.4byte	0x155d5
+	.8byte	.LVL1056
+	.4byte	0x157b8
 	.byte	0
 	.byte	0
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1220
-	.4byte	0x11a9e
+	.4byte	.Ldebug_ranges0+0x12c0
+	.4byte	0x11c81
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
 	.2byte	0x87a
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB1917
-	.8byte	.LBE1917-.LBB1917
+	.8byte	.LBB1979
+	.8byte	.LBE1979-.LBB1979
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x87a
-	.8byte	.L986
+	.8byte	.L999
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
@@ -44554,39 +44895,39 @@ __exitcall_ebc_exit:
 	.2byte	0x87a
 	.4byte	0x199
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1250
-	.4byte	0x11a82
+	.4byte	.Ldebug_ranges0+0x12f0
+	.4byte	0x11c65
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
 	.2byte	0x87a
 	.4byte	0x199
-	.4byte	.LLST262
+	.4byte	.LLST270
 	.uleb128 0x4f
-	.8byte	.LVL1019
-	.4byte	0x155b0
+	.8byte	.LVL1041
+	.4byte	0x15793
 	.uleb128 0x4f
-	.8byte	.LVL1020
-	.4byte	0x155bc
+	.8byte	.LVL1042
+	.4byte	0x1579f
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL1017
-	.4byte	0x155c9
+	.8byte	.LVL1039
+	.4byte	0x157ac
 	.uleb128 0x4f
-	.8byte	.LVL1021
-	.4byte	0x155d5
+	.8byte	.LVL1043
+	.4byte	0x157b8
 	.byte	0
 	.byte	0
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1090
-	.4byte	0x11b71
+	.4byte	.Ldebug_ranges0+0x1130
+	.4byte	0x11d54
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
 	.2byte	0x8ad
 	.4byte	0x199
 	.uleb128 0x73
-	.4byte	0x11ac5
+	.4byte	0x11ca8
 	.uleb128 0x48
 	.4byte	.LASF3106
 	.byte	0x1
@@ -44594,12 +44935,12 @@ __exitcall_ebc_exit:
 	.4byte	0x2b0
 	.byte	0
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x1090
+	.4byte	.Ldebug_ranges0+0x1130
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x8ad
-	.8byte	.L995
+	.8byte	.L1008
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
@@ -44613,56 +44954,56 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x8ad
 	.4byte	0x199
-	.4byte	.LLST245
+	.4byte	.LLST253
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x10e0
-	.4byte	0x11b55
+	.4byte	.Ldebug_ranges0+0x1180
+	.4byte	0x11d38
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
 	.2byte	0x8ad
 	.4byte	0x199
-	.4byte	.LLST246
+	.4byte	.LLST254
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1130
-	.4byte	0x11b2d
+	.4byte	.Ldebug_ranges0+0x11d0
+	.4byte	0x11d10
 	.uleb128 0x5a
 	.4byte	.LASF3106
 	.byte	0x1
 	.2byte	0x8ad
 	.4byte	0x2b0
-	.4byte	.LLST247
+	.4byte	.LLST255
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL936
-	.4byte	0x155bc
+	.8byte	.LVL958
+	.4byte	0x1579f
 	.uleb128 0x4f
-	.8byte	.LVL941
-	.4byte	0x15638
+	.8byte	.LVL963
+	.4byte	0x1581b
 	.uleb128 0x4f
-	.8byte	.LVL942
-	.4byte	0x155bc
+	.8byte	.LVL964
+	.4byte	0x1579f
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL934
-	.4byte	0x155c9
+	.8byte	.LVL956
+	.4byte	0x157ac
 	.uleb128 0x4f
-	.8byte	.LVL945
-	.4byte	0x155d5
+	.8byte	.LVL967
+	.4byte	0x157b8
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1939
-	.8byte	.LBE1939-.LBB1939
-	.4byte	0x11c23
+	.8byte	.LBB2001
+	.8byte	.LBE2001-.LBB2001
+	.4byte	0x11e06
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
 	.2byte	0x8b6
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB1940
-	.8byte	.LBE1940-.LBB1940
+	.8byte	.LBB2002
+	.8byte	.LBE2002-.LBB2002
 	.uleb128 0x74
 	.4byte	.LASF3104
 	.byte	0x1
@@ -44681,47 +45022,47 @@ __exitcall_ebc_exit:
 	.2byte	0x8b6
 	.4byte	0x199
 	.uleb128 0x6d
-	.8byte	.LBB1941
-	.8byte	.LBE1941-.LBB1941
-	.4byte	0x11c07
+	.8byte	.LBB2003
+	.8byte	.LBE2003-.LBB2003
+	.4byte	0x11dea
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
 	.2byte	0x8b6
 	.4byte	0x199
-	.4byte	.LLST266
+	.4byte	.LLST274
 	.uleb128 0x4f
-	.8byte	.LVL1042
-	.4byte	0x155b0
+	.8byte	.LVL1064
+	.4byte	0x15793
 	.uleb128 0x4f
-	.8byte	.LVL1043
-	.4byte	0x155bc
+	.8byte	.LVL1065
+	.4byte	0x1579f
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL1040
-	.4byte	0x155c9
+	.8byte	.LVL1062
+	.4byte	0x157ac
 	.uleb128 0x4f
-	.8byte	.LVL1044
-	.4byte	0x155d5
+	.8byte	.LVL1066
+	.4byte	0x157b8
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1913
-	.8byte	.LBE1913-.LBB1913
-	.4byte	0x11cdd
+	.8byte	.LBB1975
+	.8byte	.LBE1975-.LBB1975
+	.4byte	0x11ec0
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
 	.2byte	0x8c2
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB1914
-	.8byte	.LBE1914-.LBB1914
+	.8byte	.LBB1976
+	.8byte	.LBE1976-.LBB1976
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x8c2
-	.8byte	.L1009
+	.8byte	.L1022
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
@@ -44736,467 +45077,467 @@ __exitcall_ebc_exit:
 	.2byte	0x8c2
 	.4byte	0x199
 	.uleb128 0x6d
-	.8byte	.LBB1915
-	.8byte	.LBE1915-.LBB1915
-	.4byte	0x11cc1
+	.8byte	.LBB1977
+	.8byte	.LBE1977-.LBB1977
+	.4byte	0x11ea4
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
 	.2byte	0x8c2
 	.4byte	0x199
-	.4byte	.LLST261
+	.4byte	.LLST269
 	.uleb128 0x4f
-	.8byte	.LVL949
-	.4byte	0x155b0
+	.8byte	.LVL971
+	.4byte	0x15793
 	.uleb128 0x4f
-	.8byte	.LVL950
-	.4byte	0x155bc
+	.8byte	.LVL972
+	.4byte	0x1579f
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL947
-	.4byte	0x155c9
+	.8byte	.LVL969
+	.4byte	0x157ac
 	.uleb128 0x4f
-	.8byte	.LVL951
-	.4byte	0x155d5
+	.8byte	.LVL973
+	.4byte	0x157b8
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12312
-	.8byte	.LBB1895
-	.4byte	.Ldebug_ranges0+0x1160
+	.4byte	0x124f5
+	.8byte	.LBB1957
+	.4byte	.Ldebug_ranges0+0x1200
 	.byte	0x1
 	.2byte	0x851
-	.4byte	0x11d41
+	.4byte	0x11f24
 	.uleb128 0x55
-	.4byte	0x12323
+	.4byte	0x12506
 	.uleb128 0x55
-	.4byte	0x12323
+	.4byte	0x12506
 	.uleb128 0x55
-	.4byte	0x1232f
+	.4byte	0x12512
 	.uleb128 0x55
-	.4byte	0x1232f
+	.4byte	0x12512
 	.uleb128 0x55
-	.4byte	0x1233b
+	.4byte	0x1251e
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x1160
+	.4byte	.Ldebug_ranges0+0x1200
 	.uleb128 0x58
-	.4byte	0x12347
+	.4byte	0x1252a
 	.uleb128 0x58
-	.4byte	0x12351
+	.4byte	0x12534
 	.uleb128 0x58
-	.4byte	0x1235d
+	.4byte	0x12540
 	.uleb128 0x58
-	.4byte	0x12369
+	.4byte	0x1254c
 	.uleb128 0x61
-	.4byte	0x12375
-	.4byte	.LLST248
+	.4byte	0x12558
+	.4byte	.LLST256
 	.uleb128 0x58
-	.4byte	0x12381
+	.4byte	0x12564
 	.uleb128 0x58
-	.4byte	0x1238d
+	.4byte	0x12570
 	.uleb128 0x75
-	.4byte	0x12399
+	.4byte	0x1257c
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x122be
-	.8byte	.LBB1898
-	.8byte	.LBE1898-.LBB1898
+	.4byte	0x124a1
+	.8byte	.LBB1960
+	.8byte	.LBE1960-.LBB1960
 	.byte	0x1
 	.2byte	0x7de
-	.4byte	0x11d92
+	.4byte	0x11f75
 	.uleb128 0x55
-	.4byte	0x122e3
+	.4byte	0x124c6
 	.uleb128 0x55
-	.4byte	0x122d7
+	.4byte	0x124ba
 	.uleb128 0x70
-	.4byte	0x122cb
-	.4byte	.LLST249
+	.4byte	0x124ae
+	.4byte	.LLST257
 	.uleb128 0x57
-	.8byte	.LBB1899
-	.8byte	.LBE1899-.LBB1899
+	.8byte	.LBB1961
+	.8byte	.LBE1961-.LBB1961
 	.uleb128 0x58
-	.4byte	0x122ef
+	.4byte	0x124d2
 	.uleb128 0x58
-	.4byte	0x122f9
+	.4byte	0x124dc
 	.uleb128 0x58
-	.4byte	0x12305
+	.4byte	0x124e8
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14080
-	.8byte	.LBB1900
-	.4byte	.Ldebug_ranges0+0x1190
+	.4byte	0x14263
+	.8byte	.LBB1962
+	.4byte	.Ldebug_ranges0+0x1230
 	.byte	0x1
 	.2byte	0x7e9
-	.4byte	0x11e58
+	.4byte	0x1203b
 	.uleb128 0x55
-	.4byte	0x140bd
+	.4byte	0x142a0
 	.uleb128 0x55
-	.4byte	0x140bd
+	.4byte	0x142a0
 	.uleb128 0x55
-	.4byte	0x140bd
+	.4byte	0x142a0
 	.uleb128 0x55
-	.4byte	0x140c9
+	.4byte	0x142ac
 	.uleb128 0x55
-	.4byte	0x140b1
+	.4byte	0x14294
 	.uleb128 0x55
-	.4byte	0x140a5
+	.4byte	0x14288
 	.uleb128 0x55
-	.4byte	0x14099
+	.4byte	0x1427c
 	.uleb128 0x55
-	.4byte	0x1408d
+	.4byte	0x14270
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x1190
+	.4byte	.Ldebug_ranges0+0x1230
 	.uleb128 0x58
-	.4byte	0x140d5
+	.4byte	0x142b8
 	.uleb128 0x61
-	.4byte	0x140e1
-	.4byte	.LLST250
+	.4byte	0x142c4
+	.4byte	.LLST258
 	.uleb128 0x58
-	.4byte	0x140ed
+	.4byte	0x142d0
 	.uleb128 0x61
-	.4byte	0x140f9
-	.4byte	.LLST251
+	.4byte	0x142dc
+	.4byte	.LLST259
 	.uleb128 0x61
-	.4byte	0x14105
-	.4byte	.LLST252
+	.4byte	0x142e8
+	.4byte	.LLST260
 	.uleb128 0x58
-	.4byte	0x14111
+	.4byte	0x142f4
 	.uleb128 0x58
-	.4byte	0x1411d
+	.4byte	0x14300
 	.uleb128 0x58
-	.4byte	0x14129
+	.4byte	0x1430c
 	.uleb128 0x61
-	.4byte	0x14135
-	.4byte	.LLST253
+	.4byte	0x14318
+	.4byte	.LLST261
 	.uleb128 0x58
-	.4byte	0x14141
+	.4byte	0x14324
 	.uleb128 0x61
-	.4byte	0x1414d
-	.4byte	.LLST254
+	.4byte	0x14330
+	.4byte	.LLST262
 	.uleb128 0x62
-	.4byte	0x14159
+	.4byte	0x1433c
 	.uleb128 0x1
 	.byte	0x60
 	.uleb128 0x61
-	.4byte	0x14163
-	.4byte	.LLST255
+	.4byte	0x14346
+	.4byte	.LLST263
 	.uleb128 0x61
-	.4byte	0x1416d
-	.4byte	.LLST256
+	.4byte	0x14350
+	.4byte	.LLST264
 	.uleb128 0x61
-	.4byte	0x14179
-	.4byte	.LLST257
+	.4byte	0x1435c
+	.4byte	.LLST265
 	.uleb128 0x61
-	.4byte	0x14185
-	.4byte	.LLST258
+	.4byte	0x14368
+	.4byte	.LLST266
 	.uleb128 0x61
-	.4byte	0x14191
-	.4byte	.LLST259
+	.4byte	0x14374
+	.4byte	.LLST267
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x122be
-	.8byte	.LBB1908
-	.4byte	.Ldebug_ranges0+0x11f0
+	.4byte	0x124a1
+	.8byte	.LBB1970
+	.4byte	.Ldebug_ranges0+0x1290
 	.byte	0x1
 	.2byte	0x80c
-	.4byte	0x11e99
+	.4byte	0x1207c
 	.uleb128 0x55
-	.4byte	0x122e3
+	.4byte	0x124c6
 	.uleb128 0x55
-	.4byte	0x122d7
+	.4byte	0x124ba
 	.uleb128 0x70
-	.4byte	0x122cb
-	.4byte	.LLST260
+	.4byte	0x124ae
+	.4byte	.LLST268
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x11f0
+	.4byte	.Ldebug_ranges0+0x1290
 	.uleb128 0x58
-	.4byte	0x122ef
+	.4byte	0x124d2
 	.uleb128 0x58
-	.4byte	0x122f9
+	.4byte	0x124dc
 	.uleb128 0x58
-	.4byte	0x12305
+	.4byte	0x124e8
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x122be
-	.8byte	.LBB1928
-	.4byte	.Ldebug_ranges0+0x12e0
+	.4byte	0x124a1
+	.8byte	.LBB1990
+	.4byte	.Ldebug_ranges0+0x1380
 	.byte	0x1
 	.2byte	0x808
-	.4byte	0x11eda
+	.4byte	0x120bd
 	.uleb128 0x55
-	.4byte	0x122e3
+	.4byte	0x124c6
 	.uleb128 0x55
-	.4byte	0x122d7
+	.4byte	0x124ba
 	.uleb128 0x70
-	.4byte	0x122cb
-	.4byte	.LLST264
+	.4byte	0x124ae
+	.4byte	.LLST272
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x12e0
+	.4byte	.Ldebug_ranges0+0x1380
 	.uleb128 0x58
-	.4byte	0x122ef
+	.4byte	0x124d2
 	.uleb128 0x58
-	.4byte	0x122f9
+	.4byte	0x124dc
 	.uleb128 0x58
-	.4byte	0x12305
+	.4byte	0x124e8
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x122be
-	.8byte	.LBB1933
-	.4byte	.Ldebug_ranges0+0x1310
+	.4byte	0x124a1
+	.8byte	.LBB1995
+	.4byte	.Ldebug_ranges0+0x13b0
 	.byte	0x1
 	.2byte	0x7a6
-	.4byte	0x11f1b
+	.4byte	0x120fe
 	.uleb128 0x55
-	.4byte	0x122e3
+	.4byte	0x124c6
 	.uleb128 0x55
-	.4byte	0x122d7
+	.4byte	0x124ba
 	.uleb128 0x70
-	.4byte	0x122cb
-	.4byte	.LLST265
+	.4byte	0x124ae
+	.4byte	.LLST273
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x1310
+	.4byte	.Ldebug_ranges0+0x13b0
 	.uleb128 0x58
-	.4byte	0x122ef
+	.4byte	0x124d2
 	.uleb128 0x58
-	.4byte	0x122f9
+	.4byte	0x124dc
 	.uleb128 0x58
-	.4byte	0x12305
+	.4byte	0x124e8
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x144c7
-	.8byte	.LBB1937
-	.8byte	.LBE1937-.LBB1937
+	.4byte	0x146aa
+	.8byte	.LBB1999
+	.8byte	.LBE1999-.LBB1999
 	.byte	0x1
 	.2byte	0x773
-	.4byte	0x11f66
+	.4byte	0x12149
 	.uleb128 0x55
-	.4byte	0x144e3
+	.4byte	0x146c6
 	.uleb128 0x55
-	.4byte	0x144d7
+	.4byte	0x146ba
 	.uleb128 0x57
-	.8byte	.LBB1938
-	.8byte	.LBE1938-.LBB1938
+	.8byte	.LBB2000
+	.8byte	.LBE2000-.LBB2000
 	.uleb128 0x58
-	.4byte	0x144ef
+	.4byte	0x146d2
 	.uleb128 0x4f
-	.8byte	.LVL1038
-	.4byte	0x151b8
+	.8byte	.LVL1060
+	.4byte	0x1539b
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x144c7
-	.8byte	.LBB1942
-	.8byte	.LBE1942-.LBB1942
+	.4byte	0x146aa
+	.8byte	.LBB2004
+	.8byte	.LBE2004-.LBB2004
 	.byte	0x1
 	.2byte	0x8bf
-	.4byte	0x11fb1
+	.4byte	0x12194
 	.uleb128 0x55
-	.4byte	0x144e3
+	.4byte	0x146c6
 	.uleb128 0x55
-	.4byte	0x144d7
+	.4byte	0x146ba
 	.uleb128 0x57
-	.8byte	.LBB1943
-	.8byte	.LBE1943-.LBB1943
+	.8byte	.LBB2005
+	.8byte	.LBE2005-.LBB2005
 	.uleb128 0x58
-	.4byte	0x144ef
+	.4byte	0x146d2
 	.uleb128 0x4f
-	.8byte	.LVL1045
-	.4byte	0x151b8
+	.8byte	.LVL1067
+	.4byte	0x1539b
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL878
-	.4byte	0x15644
-	.uleb128 0x4f
-	.8byte	.LVL880
-	.4byte	0x1548b
-	.uleb128 0x4f
-	.8byte	.LVL881
-	.4byte	0x153a1
-	.uleb128 0x4f
-	.8byte	.LVL882
-	.4byte	0x1541b
-	.uleb128 0x4f
-	.8byte	.LVL883
-	.4byte	0x15650
-	.uleb128 0x4f
-	.8byte	.LVL884
-	.4byte	0x155fc
-	.uleb128 0x4f
-	.8byte	.LVL894
-	.4byte	0x15276
-	.uleb128 0x4f
-	.8byte	.LVL895
-	.4byte	0x15650
-	.uleb128 0x4f
-	.8byte	.LVL896
-	.4byte	0x155fc
-	.uleb128 0x4f
-	.8byte	.LVL901
-	.4byte	0x12412
+	.8byte	.LVL900
+	.4byte	0x15827
 	.uleb128 0x4f
 	.8byte	.LVL902
-	.4byte	0x1541b
-	.uleb128 0x4f
-	.8byte	.LVL904
-	.4byte	0x15650
-	.uleb128 0x4f
-	.8byte	.LVL907
-	.4byte	0x154f9
-	.uleb128 0x4f
-	.8byte	.LVL908
-	.4byte	0x154f9
+	.4byte	0x1566e
 	.uleb128 0x4f
-	.8byte	.LVL926
-	.4byte	0x1565c
+	.8byte	.LVL903
+	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL927
-	.4byte	0x154f9
+	.8byte	.LVL904
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL953
-	.4byte	0x152d7
+	.8byte	.LVL905
+	.4byte	0x15833
 	.uleb128 0x4f
-	.8byte	.LVL956
-	.4byte	0x15668
+	.8byte	.LVL906
+	.4byte	0x157df
 	.uleb128 0x4f
-	.8byte	.LVL957
-	.4byte	0x153a1
+	.8byte	.LVL916
+	.4byte	0x15459
 	.uleb128 0x4f
-	.8byte	.LVL958
-	.4byte	0x15276
+	.8byte	.LVL917
+	.4byte	0x15833
 	.uleb128 0x4f
-	.8byte	.LVL960
-	.4byte	0x155fc
+	.8byte	.LVL918
+	.4byte	0x157df
 	.uleb128 0x4f
-	.8byte	.LVL962
-	.4byte	0x153a1
+	.8byte	.LVL923
+	.4byte	0x125f5
 	.uleb128 0x4f
-	.8byte	.LVL963
-	.4byte	0x12854
+	.8byte	.LVL924
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL964
-	.4byte	0x1548b
+	.8byte	.LVL926
+	.4byte	0x15833
 	.uleb128 0x4f
-	.8byte	.LVL967
-	.4byte	0x1548b
+	.8byte	.LVL929
+	.4byte	0x156dc
 	.uleb128 0x4f
-	.8byte	.LVL970
-	.4byte	0x153a1
+	.8byte	.LVL930
+	.4byte	0x156dc
 	.uleb128 0x4f
-	.8byte	.LVL971
-	.4byte	0x154ed
+	.8byte	.LVL948
+	.4byte	0x1583f
 	.uleb128 0x4f
-	.8byte	.LVL974
-	.4byte	0x152d7
+	.8byte	.LVL949
+	.4byte	0x156dc
 	.uleb128 0x4f
-	.8byte	.LVL977
-	.4byte	0x1565c
+	.8byte	.LVL975
+	.4byte	0x154ba
 	.uleb128 0x4f
 	.8byte	.LVL978
-	.4byte	0x154f9
+	.4byte	0x1584b
 	.uleb128 0x4f
 	.8byte	.LVL979
-	.4byte	0x15650
+	.4byte	0x15584
 	.uleb128 0x4f
 	.8byte	.LVL980
-	.4byte	0x155fc
-	.uleb128 0x4f
-	.8byte	.LVL981
-	.4byte	0x143e2
+	.4byte	0x15459
 	.uleb128 0x4f
 	.8byte	.LVL982
-	.4byte	0x15674
-	.uleb128 0x4f
-	.8byte	.LVL983
-	.4byte	0x153a1
+	.4byte	0x157df
 	.uleb128 0x4f
 	.8byte	.LVL984
-	.4byte	0x12854
+	.4byte	0x15584
 	.uleb128 0x4f
 	.8byte	.LVL985
-	.4byte	0x14248
+	.4byte	0x12a37
 	.uleb128 0x4f
 	.8byte	.LVL986
-	.4byte	0x15674
-	.uleb128 0x4f
-	.8byte	.LVL987
-	.4byte	0x12412
-	.uleb128 0x4f
-	.8byte	.LVL988
-	.4byte	0x153a1
+	.4byte	0x1566e
 	.uleb128 0x4f
 	.8byte	.LVL989
-	.4byte	0x12854
+	.4byte	0x1566e
 	.uleb128 0x4f
-	.8byte	.LVL990
-	.4byte	0x153a1
+	.8byte	.LVL992
+	.4byte	0x15584
 	.uleb128 0x4f
 	.8byte	.LVL993
-	.4byte	0x153a1
+	.4byte	0x156d0
 	.uleb128 0x4f
-	.8byte	.LVL998
-	.4byte	0x153a1
+	.8byte	.LVL996
+	.4byte	0x154ba
+	.uleb128 0x4f
+	.8byte	.LVL999
+	.4byte	0x1583f
 	.uleb128 0x4f
 	.8byte	.LVL1000
-	.4byte	0x154f9
+	.4byte	0x156dc
+	.uleb128 0x4f
+	.8byte	.LVL1001
+	.4byte	0x15833
+	.uleb128 0x4f
+	.8byte	.LVL1002
+	.4byte	0x157df
+	.uleb128 0x4f
+	.8byte	.LVL1003
+	.4byte	0x145c5
+	.uleb128 0x4f
+	.8byte	.LVL1004
+	.4byte	0x15857
+	.uleb128 0x4f
+	.8byte	.LVL1005
+	.4byte	0x15584
+	.uleb128 0x4f
+	.8byte	.LVL1006
+	.4byte	0x12a37
 	.uleb128 0x4f
 	.8byte	.LVL1007
-	.4byte	0x12412
+	.4byte	0x1442b
 	.uleb128 0x4f
 	.8byte	.LVL1008
-	.4byte	0x153a1
+	.4byte	0x15857
 	.uleb128 0x4f
 	.8byte	.LVL1009
-	.4byte	0x12854
+	.4byte	0x125f5
 	.uleb128 0x4f
-	.8byte	.LVL1012
-	.4byte	0x153a1
+	.8byte	.LVL1010
+	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL1013
-	.4byte	0x154ed
+	.8byte	.LVL1011
+	.4byte	0x12a37
+	.uleb128 0x4f
+	.8byte	.LVL1012
+	.4byte	0x15584
 	.uleb128 0x4f
 	.8byte	.LVL1015
-	.4byte	0x153a1
+	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL1024
-	.4byte	0x1430f
+	.8byte	.LVL1020
+	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL1027
-	.4byte	0x152d7
+	.8byte	.LVL1022
+	.4byte	0x156dc
 	.uleb128 0x4f
-	.8byte	.LVL1048
-	.4byte	0x1541b
+	.8byte	.LVL1029
+	.4byte	0x125f5
+	.uleb128 0x4f
+	.8byte	.LVL1030
+	.4byte	0x15584
+	.uleb128 0x4f
+	.8byte	.LVL1031
+	.4byte	0x12a37
+	.uleb128 0x4f
+	.8byte	.LVL1034
+	.4byte	0x15584
+	.uleb128 0x4f
+	.8byte	.LVL1035
+	.4byte	0x156d0
+	.uleb128 0x4f
+	.8byte	.LVL1037
+	.4byte	0x15584
+	.uleb128 0x4f
+	.8byte	.LVL1046
+	.4byte	0x144f2
 	.uleb128 0x4f
 	.8byte	.LVL1049
-	.4byte	0x152d7
+	.4byte	0x154ba
 	.uleb128 0x4f
-	.8byte	.LVL1051
-	.4byte	0x15668
+	.8byte	.LVL1070
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL1053
-	.4byte	0x154f9
+	.8byte	.LVL1071
+	.4byte	0x154ba
 	.uleb128 0x4f
-	.8byte	.LVL1055
-	.4byte	0x154f9
+	.8byte	.LVL1073
+	.4byte	0x1584b
 	.uleb128 0x4f
-	.8byte	.LVL1056
-	.4byte	0x152d7
+	.8byte	.LVL1075
+	.4byte	0x156dc
 	.uleb128 0x4f
-	.8byte	.LVL1058
-	.4byte	0x1554f
+	.8byte	.LVL1077
+	.4byte	0x156dc
+	.uleb128 0x4f
+	.8byte	.LVL1078
+	.4byte	0x154ba
+	.uleb128 0x4f
+	.8byte	.LVL1080
+	.4byte	0x15732
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3107
 	.byte	0x1
 	.2byte	0x755
 	.byte	0x1
-	.4byte	0x12312
+	.4byte	0x124f5
 	.uleb128 0x66
 	.4byte	.LASF3108
 	.byte	0x1
@@ -45234,17 +45575,17 @@ __exitcall_ebc_exit:
 	.2byte	0x739
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x123a2
+	.4byte	0x12585
 	.uleb128 0x66
 	.4byte	.LASF3113
 	.byte	0x1
 	.2byte	0x739
-	.4byte	0xe4f2
+	.4byte	0xe4fe
 	.uleb128 0x66
 	.4byte	.LASF3114
 	.byte	0x1
 	.2byte	0x739
-	.4byte	0xe4f2
+	.4byte	0xe4fe
 	.uleb128 0x66
 	.4byte	.LASF3115
 	.byte	0x1
@@ -45296,17 +45637,17 @@ __exitcall_ebc_exit:
 	.2byte	0x71d
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x12412
+	.4byte	0x125f5
 	.uleb128 0x65
 	.string	"buf"
 	.byte	0x1
 	.2byte	0x71d
-	.4byte	0xe4f2
+	.4byte	0xe4fe
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x71d
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
@@ -45347,30 +45688,30 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2834-.LFB2834
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x125a9
+	.4byte	0x1278c
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x6b1
-	.4byte	0xe557
-	.4byte	.LLST75
+	.4byte	0xe563
+	.4byte	.LLST83
 	.uleb128 0x59
 	.4byte	.LASF2887
 	.byte	0x1
 	.2byte	0x6b1
 	.4byte	0xc6
-	.4byte	.LLST76
+	.4byte	.LLST84
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x6b3
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x5a
 	.4byte	.LASF3127
 	.byte	0x1
 	.2byte	0x6b4
 	.4byte	0xc6
-	.4byte	.LLST77
+	.4byte	.LLST85
 	.uleb128 0x6a
 	.string	"ret"
 	.byte	0x1
@@ -45384,74 +45725,74 @@ __exitcall_ebc_exit:
 	.2byte	0x6b6
 	.4byte	0xd8a3
 	.uleb128 0x54
-	.4byte	0x147dd
-	.8byte	.LBB1258
-	.8byte	.LBE1258-.LBB1258
+	.4byte	0x149c0
+	.8byte	.LBB1320
+	.8byte	.LBE1320-.LBB1320
 	.byte	0x1
 	.2byte	0x6bb
-	.4byte	0x124b1
+	.4byte	0x12694
 	.uleb128 0x55
-	.4byte	0x147f9
+	.4byte	0x149dc
 	.uleb128 0x55
-	.4byte	0x147ed
+	.4byte	0x149d0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL283
-	.4byte	0x153a1
+	.8byte	.LVL305
+	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL284
-	.4byte	0x15680
+	.8byte	.LVL306
+	.4byte	0x15863
 	.uleb128 0x4f
-	.8byte	.LVL289
-	.4byte	0x1541b
+	.8byte	.LVL311
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL290
-	.4byte	0x153a1
+	.8byte	.LVL312
+	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL292
-	.4byte	0x15680
+	.8byte	.LVL314
+	.4byte	0x15863
 	.uleb128 0x4f
-	.8byte	.LVL293
-	.4byte	0x1541b
+	.8byte	.LVL315
+	.4byte	0x155fe
 	.uleb128 0x4f
-	.8byte	.LVL294
-	.4byte	0x15680
+	.8byte	.LVL316
+	.4byte	0x15863
 	.uleb128 0x4f
-	.8byte	.LVL295
-	.4byte	0x15680
+	.8byte	.LVL317
+	.4byte	0x15863
 	.uleb128 0x4f
-	.8byte	.LVL296
-	.4byte	0x15680
+	.8byte	.LVL318
+	.4byte	0x15863
 	.uleb128 0x4f
-	.8byte	.LVL297
-	.4byte	0x15680
+	.8byte	.LVL319
+	.4byte	0x15863
 	.uleb128 0x4f
-	.8byte	.LVL298
-	.4byte	0x15680
+	.8byte	.LVL320
+	.4byte	0x15863
 	.uleb128 0x4f
-	.8byte	.LVL299
-	.4byte	0x15680
+	.8byte	.LVL321
+	.4byte	0x15863
 	.uleb128 0x4f
-	.8byte	.LVL300
-	.4byte	0x15680
+	.8byte	.LVL322
+	.4byte	0x15863
 	.uleb128 0x4f
-	.8byte	.LVL301
-	.4byte	0x15680
+	.8byte	.LVL323
+	.4byte	0x15863
 	.uleb128 0x4f
-	.8byte	.LVL302
-	.4byte	0x15680
+	.8byte	.LVL324
+	.4byte	0x15863
 	.uleb128 0x4f
-	.8byte	.LVL303
-	.4byte	0x15680
+	.8byte	.LVL325
+	.4byte	0x15863
 	.uleb128 0x4f
-	.8byte	.LVL304
-	.4byte	0x15680
+	.8byte	.LVL326
+	.4byte	0x15863
 	.uleb128 0x4f
-	.8byte	.LVL305
-	.4byte	0x153a1
+	.8byte	.LVL327
+	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL306
-	.4byte	0x1554f
+	.8byte	.LVL328
+	.4byte	0x15732
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3129
@@ -45461,47 +45802,47 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2833-.LFB2833
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12662
+	.4byte	0x12845
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x68c
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x68d
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.uleb128 0x4f
-	.8byte	.LVL265
-	.4byte	0x153a1
+	.8byte	.LVL287
+	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL266
-	.4byte	0x154ed
+	.8byte	.LVL288
+	.4byte	0x156d0
 	.uleb128 0x4f
-	.8byte	.LVL267
-	.4byte	0x154ed
+	.8byte	.LVL289
+	.4byte	0x156d0
 	.uleb128 0x4f
-	.8byte	.LVL268
-	.4byte	0x1544c
+	.8byte	.LVL290
+	.4byte	0x1562f
 	.uleb128 0x4f
-	.8byte	.LVL269
-	.4byte	0x153a1
+	.8byte	.LVL291
+	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL270
-	.4byte	0x15405
+	.8byte	.LVL292
+	.4byte	0x155e8
 	.uleb128 0x4f
-	.8byte	.LVL271
-	.4byte	0x1548b
+	.8byte	.LVL293
+	.4byte	0x1566e
 	.uleb128 0x4f
-	.8byte	.LVL272
-	.4byte	0x154ed
+	.8byte	.LVL294
+	.4byte	0x156d0
 	.uleb128 0x4f
-	.8byte	.LVL273
-	.4byte	0x154ed
+	.8byte	.LVL295
+	.4byte	0x156d0
 	.uleb128 0x4f
-	.8byte	.LVL274
-	.4byte	0x1544c
+	.8byte	.LVL296
+	.4byte	0x1562f
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3130
@@ -45512,38 +45853,38 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2832-.LFB2832
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12844
+	.4byte	0x12a27
 	.uleb128 0x59
 	.4byte	.LASF794
 	.byte	0x1
 	.2byte	0x62c
 	.4byte	0x458
-	.4byte	.LLST238
+	.4byte	.LLST246
 	.uleb128 0x6a
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x62e
-	.4byte	0xe557
+	.4byte	0xe563
 	.uleb128 0x1
 	.byte	0x66
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x62f
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x630
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1020
-	.4byte	0x1274c
+	.4byte	.Ldebug_ranges0+0x10c0
+	.4byte	0x1292f
 	.uleb128 0x41
 	.byte	0x8
 	.byte	0x1
 	.2byte	0x637
-	.4byte	0x126e5
+	.4byte	0x128c8
 	.uleb128 0x43
 	.4byte	.LASF3131
 	.byte	0x1
@@ -45553,107 +45894,107 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x1
 	.2byte	0x637
-	.4byte	0x12844
+	.4byte	0x12a27
 	.byte	0
 	.uleb128 0x53
 	.string	"__u"
 	.byte	0x1
 	.2byte	0x637
-	.4byte	0x126c3
+	.4byte	0x128a6
 	.uleb128 0x5c
-	.4byte	0x15052
-	.8byte	.LBB1838
-	.4byte	.Ldebug_ranges0+0x1060
+	.4byte	0x15235
+	.8byte	.LBB1900
+	.4byte	.Ldebug_ranges0+0x1100
 	.byte	0x1
 	.2byte	0x637
-	.4byte	0x12719
+	.4byte	0x128fc
 	.uleb128 0x55
-	.4byte	0x15075
+	.4byte	0x15258
 	.uleb128 0x55
-	.4byte	0x15069
+	.4byte	0x1524c
 	.uleb128 0x55
-	.4byte	0x1505f
+	.4byte	0x15242
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x14e47
-	.8byte	.LBB1841
-	.8byte	.LBE1841-.LBB1841
+	.4byte	0x1502a
+	.8byte	.LBB1903
+	.8byte	.LBE1903-.LBB1903
 	.byte	0x1
 	.2byte	0x637
 	.uleb128 0x57
-	.8byte	.LBB1842
-	.8byte	.LBE1842-.LBB1842
+	.8byte	.LBB1904
+	.8byte	.LBE1904-.LBB1904
 	.uleb128 0x62
-	.4byte	0x14e57
+	.4byte	0x1503a
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14cf0
-	.8byte	.LBB1846
-	.8byte	.LBE1846-.LBB1846
+	.4byte	0x14ed3
+	.8byte	.LBB1908
+	.8byte	.LBE1908-.LBB1908
 	.byte	0x1
 	.2byte	0x67f
-	.4byte	0x12780
+	.4byte	0x12963
 	.uleb128 0x55
-	.4byte	0x14d0c
+	.4byte	0x14eef
 	.uleb128 0x55
-	.4byte	0x14d01
+	.4byte	0x14ee4
 	.uleb128 0x4f
-	.8byte	.LVL863
-	.4byte	0x1568c
+	.8byte	.LVL885
+	.4byte	0x1586f
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL858
-	.4byte	0x15699
+	.8byte	.LVL880
+	.4byte	0x1587c
 	.uleb128 0x4f
-	.8byte	.LVL859
-	.4byte	0x155b0
+	.8byte	.LVL881
+	.4byte	0x15793
 	.uleb128 0x4f
-	.8byte	.LVL860
-	.4byte	0x156a3
+	.8byte	.LVL882
+	.4byte	0x15886
 	.uleb128 0x4f
-	.8byte	.LVL861
-	.4byte	0x150b5
+	.8byte	.LVL883
+	.4byte	0x15298
 	.uleb128 0x4f
-	.8byte	.LVL862
-	.4byte	0x13dc4
+	.8byte	.LVL884
+	.4byte	0x13fa7
 	.uleb128 0x4f
-	.8byte	.LVL864
-	.4byte	0x150b5
+	.8byte	.LVL886
+	.4byte	0x15298
 	.uleb128 0x4f
-	.8byte	.LVL865
-	.4byte	0x1346b
+	.8byte	.LVL887
+	.4byte	0x1364e
 	.uleb128 0x4f
-	.8byte	.LVL866
-	.4byte	0x150b5
+	.8byte	.LVL888
+	.4byte	0x15298
 	.uleb128 0x4f
-	.8byte	.LVL867
-	.4byte	0x12a5e
+	.8byte	.LVL889
+	.4byte	0x12c41
 	.uleb128 0x4f
-	.8byte	.LVL868
-	.4byte	0x150b5
+	.8byte	.LVL890
+	.4byte	0x15298
 	.uleb128 0x4f
-	.8byte	.LVL869
-	.4byte	0x13f25
+	.8byte	.LVL891
+	.4byte	0x14108
 	.uleb128 0x4f
-	.8byte	.LVL870
-	.4byte	0x156af
+	.8byte	.LVL892
+	.4byte	0x15892
 	.uleb128 0x4f
-	.8byte	.LVL871
-	.4byte	0x1419e
+	.8byte	.LVL893
+	.4byte	0x14381
 	.uleb128 0x4f
-	.8byte	.LVL872
-	.4byte	0x13f25
+	.8byte	.LVL894
+	.4byte	0x14108
 	.uleb128 0x4f
-	.8byte	.LVL873
-	.4byte	0x13dc4
+	.8byte	.LVL895
+	.4byte	0x13fa7
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x12854
+	.4byte	0x12a37
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
@@ -45666,162 +46007,162 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2831-.LFB2831
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12a00
+	.4byte	0x12be3
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x5d5
-	.4byte	0xe557
-	.4byte	.LLST189
+	.4byte	0xe563
+	.4byte	.LLST197
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x5d7
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x5d8
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x56
 	.4byte	.LASF3050
 	.4byte	0xb9b0
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34977
+	.8byte	__func__.34978
 	.uleb128 0x54
-	.4byte	0x12a00
-	.8byte	.LBB1496
-	.8byte	.LBE1496-.LBB1496
+	.4byte	0x12be3
+	.8byte	.LBB1558
+	.8byte	.LBE1558-.LBB1558
 	.byte	0x1
 	.2byte	0x5e5
-	.4byte	0x128e1
+	.4byte	0x12ac4
 	.uleb128 0x55
-	.4byte	0x12a19
+	.4byte	0x12bfc
 	.uleb128 0x55
-	.4byte	0x12a0d
+	.4byte	0x12bf0
 	.uleb128 0x4f
-	.8byte	.LVL552
-	.4byte	0x150b5
+	.8byte	.LVL574
+	.4byte	0x15298
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12a00
-	.8byte	.LBB1498
-	.8byte	.LBE1498-.LBB1498
+	.4byte	0x12be3
+	.8byte	.LBB1560
+	.8byte	.LBE1560-.LBB1560
 	.byte	0x1
 	.2byte	0x5f9
-	.4byte	0x12915
+	.4byte	0x12af8
 	.uleb128 0x55
-	.4byte	0x12a19
+	.4byte	0x12bfc
 	.uleb128 0x55
-	.4byte	0x12a0d
+	.4byte	0x12bf0
 	.uleb128 0x4f
-	.8byte	.LVL557
-	.4byte	0x150b5
+	.8byte	.LVL579
+	.4byte	0x15298
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12a00
-	.8byte	.LBB1500
-	.8byte	.LBE1500-.LBB1500
+	.4byte	0x12be3
+	.8byte	.LBB1562
+	.8byte	.LBE1562-.LBB1562
 	.byte	0x1
 	.2byte	0x620
-	.4byte	0x12949
+	.4byte	0x12b2c
 	.uleb128 0x55
-	.4byte	0x12a19
+	.4byte	0x12bfc
 	.uleb128 0x55
-	.4byte	0x12a0d
+	.4byte	0x12bf0
 	.uleb128 0x4f
-	.8byte	.LVL562
-	.4byte	0x150b5
+	.8byte	.LVL584
+	.4byte	0x15298
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12a00
-	.8byte	.LBB1502
-	.8byte	.LBE1502-.LBB1502
+	.4byte	0x12be3
+	.8byte	.LBB1564
+	.8byte	.LBE1564-.LBB1564
 	.byte	0x1
 	.2byte	0x613
-	.4byte	0x1297d
+	.4byte	0x12b60
 	.uleb128 0x55
-	.4byte	0x12a19
+	.4byte	0x12bfc
 	.uleb128 0x55
-	.4byte	0x12a0d
+	.4byte	0x12bf0
 	.uleb128 0x4f
-	.8byte	.LVL567
-	.4byte	0x150b5
+	.8byte	.LVL589
+	.4byte	0x15298
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL551
-	.4byte	0x13dc4
+	.8byte	.LVL573
+	.4byte	0x13fa7
 	.uleb128 0x4f
-	.8byte	.LVL553
-	.4byte	0x13dc4
+	.8byte	.LVL575
+	.4byte	0x13fa7
 	.uleb128 0x4f
-	.8byte	.LVL556
-	.4byte	0x13f25
+	.8byte	.LVL578
+	.4byte	0x14108
 	.uleb128 0x4f
-	.8byte	.LVL558
-	.4byte	0x13f25
+	.8byte	.LVL580
+	.4byte	0x14108
 	.uleb128 0x4f
-	.8byte	.LVL561
-	.4byte	0x1346b
+	.8byte	.LVL583
+	.4byte	0x1364e
 	.uleb128 0x4f
-	.8byte	.LVL563
-	.4byte	0x1346b
+	.8byte	.LVL585
+	.4byte	0x1364e
 	.uleb128 0x4f
-	.8byte	.LVL566
-	.4byte	0x12a5e
+	.8byte	.LVL588
+	.4byte	0x12c41
 	.uleb128 0x4f
-	.8byte	.LVL568
-	.4byte	0x12a5e
+	.8byte	.LVL590
+	.4byte	0x12c41
 	.uleb128 0x4f
-	.8byte	.LVL571
-	.4byte	0x153a1
+	.8byte	.LVL593
+	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL574
-	.4byte	0x153a1
+	.8byte	.LVL596
+	.4byte	0x15584
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x5cf
 	.byte	0x1
-	.4byte	0x12a26
+	.4byte	0x12c09
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x5cf
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x5cf
-	.4byte	0xe874
+	.4byte	0xe880
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x5c4
 	.byte	0x1
-	.4byte	0x12a58
+	.4byte	0x12c3b
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x5c4
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x5c4
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
 	.2byte	0x5c6
-	.4byte	0x12a58
+	.4byte	0x12c3b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdf7e
+	.4byte	0xdf8a
 	.uleb128 0x4e
 	.4byte	.LASF3135
 	.byte	0x1
@@ -45830,7 +46171,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2828-.LFB2828
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1300d
+	.4byte	0x131f0
 	.uleb128 0x76
 	.4byte	.LASF3136
 	.byte	0x1
@@ -45843,493 +46184,493 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x5b0
 	.4byte	0xac0
-	.4byte	.LLST142
+	.4byte	.LLST150
 	.uleb128 0x59
 	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x5b0
 	.4byte	0xac0
-	.4byte	.LLST143
+	.4byte	.LLST151
 	.uleb128 0x59
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x5b1
-	.4byte	0xe874
-	.4byte	.LLST144
+	.4byte	0xe880
+	.4byte	.LLST152
 	.uleb128 0x54
-	.4byte	0x1300d
-	.8byte	.LBB1406
-	.8byte	.LBE1406-.LBB1406
+	.4byte	0x131f0
+	.8byte	.LBB1468
+	.8byte	.LBE1468-.LBB1468
 	.byte	0x1
 	.2byte	0x5c0
-	.4byte	0x12b67
+	.4byte	0x12d4a
 	.uleb128 0x55
-	.4byte	0x1303e
+	.4byte	0x13221
 	.uleb128 0x55
-	.4byte	0x1303e
+	.4byte	0x13221
 	.uleb128 0x55
-	.4byte	0x1303e
+	.4byte	0x13221
 	.uleb128 0x55
-	.4byte	0x13032
+	.4byte	0x13215
 	.uleb128 0x72
-	.4byte	0x13026
+	.4byte	0x13209
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x1301a
+	.4byte	0x131fd
 	.uleb128 0x57
-	.8byte	.LBB1407
-	.8byte	.LBE1407-.LBB1407
+	.8byte	.LBB1469
+	.8byte	.LBE1469-.LBB1469
 	.uleb128 0x58
-	.4byte	0x1304a
+	.4byte	0x1322d
 	.uleb128 0x61
-	.4byte	0x13056
-	.4byte	.LLST145
+	.4byte	0x13239
+	.4byte	.LLST153
 	.uleb128 0x58
-	.4byte	0x13062
+	.4byte	0x13245
 	.uleb128 0x58
-	.4byte	0x1306e
+	.4byte	0x13251
 	.uleb128 0x58
-	.4byte	0x1307a
+	.4byte	0x1325d
 	.uleb128 0x58
-	.4byte	0x13086
+	.4byte	0x13269
 	.uleb128 0x61
-	.4byte	0x13092
-	.4byte	.LLST146
+	.4byte	0x13275
+	.4byte	.LLST154
 	.uleb128 0x61
-	.4byte	0x1309e
-	.4byte	.LLST147
+	.4byte	0x13281
+	.4byte	.LLST155
 	.uleb128 0x58
-	.4byte	0x130aa
+	.4byte	0x1328d
 	.uleb128 0x61
-	.4byte	0x130b6
-	.4byte	.LLST148
+	.4byte	0x13299
+	.4byte	.LLST156
 	.uleb128 0x58
-	.4byte	0x130c0
+	.4byte	0x132a3
 	.uleb128 0x61
-	.4byte	0x130ca
-	.4byte	.LLST149
+	.4byte	0x132ad
+	.4byte	.LLST157
 	.uleb128 0x61
-	.4byte	0x130d6
-	.4byte	.LLST150
+	.4byte	0x132b9
+	.4byte	.LLST158
 	.uleb128 0x58
-	.4byte	0x130e2
+	.4byte	0x132c5
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x132bf
-	.8byte	.LBB1408
-	.4byte	.Ldebug_ranges0+0x9c0
+	.4byte	0x134a2
+	.8byte	.LBB1470
+	.4byte	.Ldebug_ranges0+0xa60
 	.byte	0x1
 	.2byte	0x5b9
-	.4byte	0x12d29
+	.4byte	0x12f0c
 	.uleb128 0x55
-	.4byte	0x132f0
+	.4byte	0x134d3
 	.uleb128 0x55
-	.4byte	0x132f0
+	.4byte	0x134d3
 	.uleb128 0x55
-	.4byte	0x132f0
+	.4byte	0x134d3
 	.uleb128 0x55
-	.4byte	0x132e4
+	.4byte	0x134c7
 	.uleb128 0x55
-	.4byte	0x132d8
+	.4byte	0x134bb
 	.uleb128 0x55
-	.4byte	0x132cc
+	.4byte	0x134af
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x9c0
+	.4byte	.Ldebug_ranges0+0xa60
 	.uleb128 0x58
-	.4byte	0x132fc
+	.4byte	0x134df
 	.uleb128 0x61
-	.4byte	0x13308
-	.4byte	.LLST151
+	.4byte	0x134eb
+	.4byte	.LLST159
 	.uleb128 0x61
-	.4byte	0x13314
-	.4byte	.LLST152
+	.4byte	0x134f7
+	.4byte	.LLST160
 	.uleb128 0x61
-	.4byte	0x13320
-	.4byte	.LLST153
+	.4byte	0x13503
+	.4byte	.LLST161
 	.uleb128 0x61
-	.4byte	0x1332c
-	.4byte	.LLST154
+	.4byte	0x1350f
+	.4byte	.LLST162
 	.uleb128 0x61
-	.4byte	0x13338
-	.4byte	.LLST155
+	.4byte	0x1351b
+	.4byte	.LLST163
 	.uleb128 0x61
-	.4byte	0x13344
-	.4byte	.LLST156
+	.4byte	0x13527
+	.4byte	.LLST164
 	.uleb128 0x61
-	.4byte	0x13350
-	.4byte	.LLST157
+	.4byte	0x13533
+	.4byte	.LLST165
 	.uleb128 0x61
-	.4byte	0x1335c
-	.4byte	.LLST158
+	.4byte	0x1353f
+	.4byte	.LLST166
 	.uleb128 0x58
-	.4byte	0x13366
+	.4byte	0x13549
 	.uleb128 0x61
-	.4byte	0x13370
-	.4byte	.LLST159
+	.4byte	0x13553
+	.4byte	.LLST167
 	.uleb128 0x61
-	.4byte	0x1337c
-	.4byte	.LLST160
+	.4byte	0x1355f
+	.4byte	.LLST168
 	.uleb128 0x58
-	.4byte	0x13388
+	.4byte	0x1356b
 	.uleb128 0x5c
-	.4byte	0x14546
-	.8byte	.LBB1410
-	.4byte	.Ldebug_ranges0+0xa00
+	.4byte	0x14729
+	.8byte	.LBB1472
+	.4byte	.Ldebug_ranges0+0xaa0
 	.byte	0x1
 	.2byte	0x4de
-	.4byte	0x12c47
+	.4byte	0x12e2a
 	.uleb128 0x55
-	.4byte	0x1456e
+	.4byte	0x14751
 	.uleb128 0x55
-	.4byte	0x14562
+	.4byte	0x14745
 	.uleb128 0x55
-	.4byte	0x14556
+	.4byte	0x14739
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xa00
+	.4byte	.Ldebug_ranges0+0xaa0
 	.uleb128 0x58
-	.4byte	0x1457a
+	.4byte	0x1475d
 	.uleb128 0x61
-	.4byte	0x14585
-	.4byte	.LLST161
+	.4byte	0x14768
+	.4byte	.LLST169
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14546
-	.8byte	.LBB1413
-	.8byte	.LBE1413-.LBB1413
+	.4byte	0x14729
+	.8byte	.LBB1475
+	.8byte	.LBE1475-.LBB1475
 	.byte	0x1
 	.2byte	0x4db
-	.4byte	0x12c93
+	.4byte	0x12e76
 	.uleb128 0x55
-	.4byte	0x1456e
+	.4byte	0x14751
 	.uleb128 0x55
-	.4byte	0x14562
+	.4byte	0x14745
 	.uleb128 0x55
-	.4byte	0x14556
+	.4byte	0x14739
 	.uleb128 0x57
-	.8byte	.LBB1414
-	.8byte	.LBE1414-.LBB1414
+	.8byte	.LBB1476
+	.8byte	.LBE1476-.LBB1476
 	.uleb128 0x58
-	.4byte	0x1457a
+	.4byte	0x1475d
 	.uleb128 0x61
-	.4byte	0x14585
-	.4byte	.LLST162
+	.4byte	0x14768
+	.4byte	.LLST170
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14546
-	.8byte	.LBB1415
-	.8byte	.LBE1415-.LBB1415
+	.4byte	0x14729
+	.8byte	.LBB1477
+	.8byte	.LBE1477-.LBB1477
 	.byte	0x1
 	.2byte	0x4dc
-	.4byte	0x12cdf
+	.4byte	0x12ec2
 	.uleb128 0x55
-	.4byte	0x1456e
+	.4byte	0x14751
 	.uleb128 0x55
-	.4byte	0x14562
+	.4byte	0x14745
 	.uleb128 0x55
-	.4byte	0x14556
+	.4byte	0x14739
 	.uleb128 0x57
-	.8byte	.LBB1416
-	.8byte	.LBE1416-.LBB1416
+	.8byte	.LBB1478
+	.8byte	.LBE1478-.LBB1478
 	.uleb128 0x58
-	.4byte	0x1457a
+	.4byte	0x1475d
 	.uleb128 0x61
-	.4byte	0x14585
-	.4byte	.LLST163
+	.4byte	0x14768
+	.4byte	.LLST171
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x14546
-	.8byte	.LBB1417
-	.8byte	.LBE1417-.LBB1417
+	.4byte	0x14729
+	.8byte	.LBB1479
+	.8byte	.LBE1479-.LBB1479
 	.byte	0x1
 	.2byte	0x4dd
 	.uleb128 0x55
-	.4byte	0x1456e
+	.4byte	0x14751
 	.uleb128 0x55
-	.4byte	0x14562
+	.4byte	0x14745
 	.uleb128 0x55
-	.4byte	0x14556
+	.4byte	0x14739
 	.uleb128 0x57
-	.8byte	.LBB1418
-	.8byte	.LBE1418-.LBB1418
+	.8byte	.LBB1480
+	.8byte	.LBE1480-.LBB1480
 	.uleb128 0x58
-	.4byte	0x1457a
+	.4byte	0x1475d
 	.uleb128 0x61
-	.4byte	0x14585
-	.4byte	.LLST164
+	.4byte	0x14768
+	.4byte	.LLST172
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x130ef
-	.8byte	.LBB1423
-	.8byte	.LBE1423-.LBB1423
+	.4byte	0x132d2
+	.8byte	.LBB1485
+	.8byte	.LBE1485-.LBB1485
 	.byte	0x1
 	.2byte	0x5be
-	.4byte	0x12dd2
+	.4byte	0x12fb5
 	.uleb128 0x55
-	.4byte	0x13120
+	.4byte	0x13303
 	.uleb128 0x55
-	.4byte	0x13120
+	.4byte	0x13303
 	.uleb128 0x55
-	.4byte	0x13120
+	.4byte	0x13303
 	.uleb128 0x55
-	.4byte	0x13114
+	.4byte	0x132f7
 	.uleb128 0x72
-	.4byte	0x13108
+	.4byte	0x132eb
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x130fc
+	.4byte	0x132df
 	.uleb128 0x57
-	.8byte	.LBB1424
-	.8byte	.LBE1424-.LBB1424
+	.8byte	.LBB1486
+	.8byte	.LBE1486-.LBB1486
 	.uleb128 0x58
-	.4byte	0x1312c
+	.4byte	0x1330f
 	.uleb128 0x58
-	.4byte	0x13138
+	.4byte	0x1331b
 	.uleb128 0x58
-	.4byte	0x13144
+	.4byte	0x13327
 	.uleb128 0x58
-	.4byte	0x13150
+	.4byte	0x13333
 	.uleb128 0x58
-	.4byte	0x1315c
+	.4byte	0x1333f
 	.uleb128 0x58
-	.4byte	0x13168
+	.4byte	0x1334b
 	.uleb128 0x61
-	.4byte	0x13174
-	.4byte	.LLST165
+	.4byte	0x13357
+	.4byte	.LLST173
 	.uleb128 0x61
-	.4byte	0x13180
-	.4byte	.LLST166
+	.4byte	0x13363
+	.4byte	.LLST174
 	.uleb128 0x58
-	.4byte	0x1318c
+	.4byte	0x1336f
 	.uleb128 0x61
-	.4byte	0x13198
-	.4byte	.LLST167
+	.4byte	0x1337b
+	.4byte	.LLST175
 	.uleb128 0x58
-	.4byte	0x131a2
+	.4byte	0x13385
 	.uleb128 0x61
-	.4byte	0x131ac
-	.4byte	.LLST168
+	.4byte	0x1338f
+	.4byte	.LLST176
 	.uleb128 0x61
-	.4byte	0x131b8
-	.4byte	.LLST169
+	.4byte	0x1339b
+	.4byte	.LLST177
 	.uleb128 0x58
-	.4byte	0x131c4
+	.4byte	0x133a7
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13395
-	.8byte	.LBB1425
-	.4byte	.Ldebug_ranges0+0xa30
+	.4byte	0x13578
+	.8byte	.LBB1487
+	.4byte	.Ldebug_ranges0+0xad0
 	.byte	0x1
 	.2byte	0x5bb
-	.4byte	0x12ee0
-	.uleb128 0x55
-	.4byte	0x133c6
-	.uleb128 0x55
-	.4byte	0x133c6
-	.uleb128 0x55
-	.4byte	0x133c6
-	.uleb128 0x55
-	.4byte	0x133ba
-	.uleb128 0x55
-	.4byte	0x133ae
-	.uleb128 0x55
-	.4byte	0x133a2
-	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xa30
-	.uleb128 0x58
-	.4byte	0x133d2
-	.uleb128 0x58
-	.4byte	0x133de
-	.uleb128 0x58
-	.4byte	0x133ea
-	.uleb128 0x62
-	.4byte	0x133f6
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x62
-	.4byte	0x13402
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x61
-	.4byte	0x1340e
-	.4byte	.LLST170
-	.uleb128 0x61
-	.4byte	0x1341a
-	.4byte	.LLST171
-	.uleb128 0x61
-	.4byte	0x13426
-	.4byte	.LLST172
-	.uleb128 0x61
-	.4byte	0x13432
-	.4byte	.LLST173
-	.uleb128 0x58
-	.4byte	0x1343c
-	.uleb128 0x61
-	.4byte	0x13446
-	.4byte	.LLST174
-	.uleb128 0x61
-	.4byte	0x13452
-	.4byte	.LLST175
-	.uleb128 0x58
-	.4byte	0x1345e
-	.uleb128 0x5c
-	.4byte	0x14546
-	.8byte	.LBB1427
-	.4byte	.Ldebug_ranges0+0xa60
-	.byte	0x1
-	.2byte	0x4b3
-	.4byte	0x12ea6
+	.4byte	0x130c3
 	.uleb128 0x55
-	.4byte	0x1456e
+	.4byte	0x135a9
 	.uleb128 0x55
-	.4byte	0x14562
+	.4byte	0x135a9
 	.uleb128 0x55
-	.4byte	0x14556
-	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xa60
-	.uleb128 0x58
-	.4byte	0x1457a
-	.uleb128 0x61
-	.4byte	0x14585
-	.4byte	.LLST176
-	.byte	0
-	.byte	0
-	.uleb128 0x60
-	.4byte	0x14546
-	.8byte	.LBB1434
-	.4byte	.Ldebug_ranges0+0xad0
-	.byte	0x1
-	.2byte	0x4b2
+	.4byte	0x135a9
 	.uleb128 0x55
-	.4byte	0x1456e
+	.4byte	0x1359d
 	.uleb128 0x55
-	.4byte	0x14562
+	.4byte	0x13591
 	.uleb128 0x55
-	.4byte	0x14556
+	.4byte	0x13585
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xad0
 	.uleb128 0x58
-	.4byte	0x1457a
-	.uleb128 0x61
-	.4byte	0x14585
-	.4byte	.LLST177
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x5e
-	.4byte	0x131d1
-	.8byte	.LBB1452
-	.8byte	.LBE1452-.LBB1452
-	.byte	0x1
-	.2byte	0x5b5
-	.uleb128 0x55
-	.4byte	0x13202
-	.uleb128 0x55
-	.4byte	0x13202
-	.uleb128 0x55
-	.4byte	0x13202
-	.uleb128 0x55
-	.4byte	0x131f6
-	.uleb128 0x55
-	.4byte	0x131ea
-	.uleb128 0x55
-	.4byte	0x131de
-	.uleb128 0x57
-	.8byte	.LBB1453
-	.8byte	.LBE1453-.LBB1453
-	.uleb128 0x58
-	.4byte	0x1320e
+	.4byte	0x135b5
 	.uleb128 0x58
-	.4byte	0x1321a
+	.4byte	0x135c1
 	.uleb128 0x58
-	.4byte	0x13226
+	.4byte	0x135cd
 	.uleb128 0x62
-	.4byte	0x13232
+	.4byte	0x135d9
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x1323e
+	.4byte	0x135e5
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x1324a
+	.4byte	0x135f1
 	.4byte	.LLST178
 	.uleb128 0x61
-	.4byte	0x13256
+	.4byte	0x135fd
 	.4byte	.LLST179
 	.uleb128 0x61
-	.4byte	0x13262
+	.4byte	0x13609
 	.4byte	.LLST180
 	.uleb128 0x61
-	.4byte	0x1326e
+	.4byte	0x13615
 	.4byte	.LLST181
 	.uleb128 0x58
-	.4byte	0x13278
+	.4byte	0x1361f
 	.uleb128 0x61
-	.4byte	0x13282
+	.4byte	0x13629
 	.4byte	.LLST182
 	.uleb128 0x61
-	.4byte	0x1328e
+	.4byte	0x13635
 	.4byte	.LLST183
 	.uleb128 0x58
-	.4byte	0x1329a
+	.4byte	0x13641
+	.uleb128 0x5c
+	.4byte	0x14729
+	.8byte	.LBB1489
+	.4byte	.Ldebug_ranges0+0xb00
+	.byte	0x1
+	.2byte	0x4b3
+	.4byte	0x13089
+	.uleb128 0x55
+	.4byte	0x14751
+	.uleb128 0x55
+	.4byte	0x14745
+	.uleb128 0x55
+	.4byte	0x14739
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0xb00
 	.uleb128 0x58
-	.4byte	0x132a6
+	.4byte	0x1475d
+	.uleb128 0x61
+	.4byte	0x14768
+	.4byte	.LLST184
+	.byte	0
+	.byte	0
+	.uleb128 0x60
+	.4byte	0x14729
+	.8byte	.LBB1496
+	.4byte	.Ldebug_ranges0+0xb70
+	.byte	0x1
+	.2byte	0x4b2
+	.uleb128 0x55
+	.4byte	0x14751
+	.uleb128 0x55
+	.4byte	0x14745
+	.uleb128 0x55
+	.4byte	0x14739
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0xb70
 	.uleb128 0x58
-	.4byte	0x132b2
+	.4byte	0x1475d
+	.uleb128 0x61
+	.4byte	0x14768
+	.4byte	.LLST185
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x5e
+	.4byte	0x133b4
+	.8byte	.LBB1514
+	.8byte	.LBE1514-.LBB1514
+	.byte	0x1
+	.2byte	0x5b5
+	.uleb128 0x55
+	.4byte	0x133e5
+	.uleb128 0x55
+	.4byte	0x133e5
+	.uleb128 0x55
+	.4byte	0x133e5
+	.uleb128 0x55
+	.4byte	0x133d9
+	.uleb128 0x55
+	.4byte	0x133cd
+	.uleb128 0x55
+	.4byte	0x133c1
+	.uleb128 0x57
+	.8byte	.LBB1515
+	.8byte	.LBE1515-.LBB1515
+	.uleb128 0x58
+	.4byte	0x133f1
+	.uleb128 0x58
+	.4byte	0x133fd
+	.uleb128 0x58
+	.4byte	0x13409
+	.uleb128 0x62
+	.4byte	0x13415
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x62
+	.4byte	0x13421
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x61
+	.4byte	0x1342d
+	.4byte	.LLST186
+	.uleb128 0x61
+	.4byte	0x13439
+	.4byte	.LLST187
+	.uleb128 0x61
+	.4byte	0x13445
+	.4byte	.LLST188
+	.uleb128 0x61
+	.4byte	0x13451
+	.4byte	.LLST189
+	.uleb128 0x58
+	.4byte	0x1345b
+	.uleb128 0x61
+	.4byte	0x13465
+	.4byte	.LLST190
+	.uleb128 0x61
+	.4byte	0x13471
+	.4byte	.LLST191
+	.uleb128 0x58
+	.4byte	0x1347d
+	.uleb128 0x58
+	.4byte	0x13489
+	.uleb128 0x58
+	.4byte	0x13495
 	.uleb128 0x5c
-	.4byte	0x144fb
-	.8byte	.LBB1454
-	.4byte	.Ldebug_ranges0+0xb30
+	.4byte	0x146de
+	.8byte	.LBB1516
+	.4byte	.Ldebug_ranges0+0xbd0
 	.byte	0x1
 	.2byte	0x509
-	.4byte	0x12fce
+	.4byte	0x131b1
 	.uleb128 0x55
-	.4byte	0x14523
+	.4byte	0x14706
 	.uleb128 0x55
-	.4byte	0x14517
+	.4byte	0x146fa
 	.uleb128 0x55
-	.4byte	0x1450b
+	.4byte	0x146ee
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xb30
+	.4byte	.Ldebug_ranges0+0xbd0
 	.uleb128 0x61
-	.4byte	0x1452f
-	.4byte	.LLST184
+	.4byte	0x14712
+	.4byte	.LLST192
 	.uleb128 0x61
-	.4byte	0x1453a
-	.4byte	.LLST185
+	.4byte	0x1471d
+	.4byte	.LLST193
 	.byte	0
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x144fb
-	.8byte	.LBB1461
-	.4byte	.Ldebug_ranges0+0xba0
+	.4byte	0x146de
+	.8byte	.LBB1523
+	.4byte	.Ldebug_ranges0+0xc40
 	.byte	0x1
 	.2byte	0x508
 	.uleb128 0x55
-	.4byte	0x14523
+	.4byte	0x14706
 	.uleb128 0x55
-	.4byte	0x14517
+	.4byte	0x146fa
 	.uleb128 0x55
-	.4byte	0x1450b
+	.4byte	0x146ee
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xba0
+	.4byte	.Ldebug_ranges0+0xc40
 	.uleb128 0x61
-	.4byte	0x1452f
-	.4byte	.LLST186
+	.4byte	0x14712
+	.4byte	.LLST194
 	.uleb128 0x61
-	.4byte	0x1453a
-	.4byte	.LLST187
+	.4byte	0x1471d
+	.4byte	.LLST195
 	.byte	0
 	.byte	0
 	.byte	0
@@ -46340,7 +46681,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x561
 	.byte	0x1
-	.4byte	0x130ef
+	.4byte	0x132d2
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
@@ -46360,12 +46701,12 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x563
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x565
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.uleb128 0x48
 	.4byte	.LASF3140
 	.byte	0x1
@@ -46437,7 +46778,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x513
 	.byte	0x1
-	.4byte	0x131d1
+	.4byte	0x133b4
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
@@ -46457,12 +46798,12 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x515
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x517
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.uleb128 0x48
 	.4byte	.LASF3140
 	.byte	0x1
@@ -46534,7 +46875,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x4e9
 	.byte	0x1
-	.4byte	0x132bf
+	.4byte	0x134a2
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
@@ -46554,12 +46895,12 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x4eb
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x4ed
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.uleb128 0x48
 	.4byte	.LASF3142
 	.byte	0x1
@@ -46636,7 +46977,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x4be
 	.byte	0x1
-	.4byte	0x13395
+	.4byte	0x13578
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
@@ -46656,12 +46997,12 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x4c0
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x4c2
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.uleb128 0x48
 	.4byte	.LASF3142
 	.byte	0x1
@@ -46728,7 +47069,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x495
 	.byte	0x1
-	.4byte	0x1346b
+	.4byte	0x1364e
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
@@ -46748,12 +47089,12 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x497
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x499
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.uleb128 0x48
 	.4byte	.LASF3142
 	.byte	0x1
@@ -46823,7 +47164,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13966
+	.4byte	0x13b49
 	.uleb128 0x76
 	.4byte	.LASF3136
 	.byte	0x1
@@ -46836,428 +47177,428 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x480
 	.4byte	0xac0
-	.4byte	.LLST105
+	.4byte	.LLST113
 	.uleb128 0x59
 	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x480
 	.4byte	0xac0
-	.4byte	.LLST106
+	.4byte	.LLST114
 	.uleb128 0x59
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x481
-	.4byte	0xe874
-	.4byte	.LLST107
+	.4byte	0xe880
+	.4byte	.LLST115
 	.uleb128 0x54
-	.4byte	0x13966
-	.8byte	.LBB1292
-	.8byte	.LBE1292-.LBB1292
+	.4byte	0x13b49
+	.8byte	.LBB1354
+	.8byte	.LBE1354-.LBB1354
 	.byte	0x1
 	.2byte	0x490
-	.4byte	0x13574
+	.4byte	0x13757
 	.uleb128 0x55
-	.4byte	0x13997
+	.4byte	0x13b7a
 	.uleb128 0x55
-	.4byte	0x13997
+	.4byte	0x13b7a
 	.uleb128 0x55
-	.4byte	0x13997
+	.4byte	0x13b7a
 	.uleb128 0x55
-	.4byte	0x1398b
+	.4byte	0x13b6e
 	.uleb128 0x72
-	.4byte	0x1397f
+	.4byte	0x13b62
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x13973
+	.4byte	0x13b56
 	.uleb128 0x57
-	.8byte	.LBB1293
-	.8byte	.LBE1293-.LBB1293
+	.8byte	.LBB1355
+	.8byte	.LBE1355-.LBB1355
 	.uleb128 0x58
-	.4byte	0x139a3
+	.4byte	0x13b86
 	.uleb128 0x61
-	.4byte	0x139af
-	.4byte	.LLST108
+	.4byte	0x13b92
+	.4byte	.LLST116
 	.uleb128 0x58
-	.4byte	0x139bb
+	.4byte	0x13b9e
 	.uleb128 0x58
-	.4byte	0x139c7
+	.4byte	0x13baa
 	.uleb128 0x58
-	.4byte	0x139d3
+	.4byte	0x13bb6
 	.uleb128 0x58
-	.4byte	0x139df
+	.4byte	0x13bc2
 	.uleb128 0x61
-	.4byte	0x139eb
-	.4byte	.LLST109
+	.4byte	0x13bce
+	.4byte	.LLST117
 	.uleb128 0x61
-	.4byte	0x139f7
-	.4byte	.LLST110
+	.4byte	0x13bda
+	.4byte	.LLST118
 	.uleb128 0x58
-	.4byte	0x13a03
+	.4byte	0x13be6
 	.uleb128 0x61
-	.4byte	0x13a0f
-	.4byte	.LLST111
+	.4byte	0x13bf2
+	.4byte	.LLST119
 	.uleb128 0x58
-	.4byte	0x13a19
+	.4byte	0x13bfc
 	.uleb128 0x61
-	.4byte	0x13a23
-	.4byte	.LLST112
+	.4byte	0x13c06
+	.4byte	.LLST120
 	.uleb128 0x61
-	.4byte	0x13a2f
-	.4byte	.LLST113
+	.4byte	0x13c12
+	.4byte	.LLST121
 	.uleb128 0x58
-	.4byte	0x13a3b
+	.4byte	0x13c1e
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13cee
-	.8byte	.LBB1294
-	.8byte	.LBE1294-.LBB1294
+	.4byte	0x13ed1
+	.8byte	.LBB1356
+	.8byte	.LBE1356-.LBB1356
 	.byte	0x1
 	.2byte	0x489
-	.4byte	0x136c2
+	.4byte	0x138a5
 	.uleb128 0x55
-	.4byte	0x13d1f
+	.4byte	0x13f02
 	.uleb128 0x55
-	.4byte	0x13d1f
+	.4byte	0x13f02
 	.uleb128 0x55
-	.4byte	0x13d1f
+	.4byte	0x13f02
 	.uleb128 0x55
-	.4byte	0x13d13
+	.4byte	0x13ef6
 	.uleb128 0x55
-	.4byte	0x13d07
+	.4byte	0x13eea
 	.uleb128 0x55
-	.4byte	0x13cfb
+	.4byte	0x13ede
 	.uleb128 0x57
-	.8byte	.LBB1295
-	.8byte	.LBE1295-.LBB1295
+	.8byte	.LBB1357
+	.8byte	.LBE1357-.LBB1357
 	.uleb128 0x58
-	.4byte	0x13d2b
+	.4byte	0x13f0e
 	.uleb128 0x61
-	.4byte	0x13d37
-	.4byte	.LLST114
+	.4byte	0x13f1a
+	.4byte	.LLST122
 	.uleb128 0x58
-	.4byte	0x13d41
+	.4byte	0x13f24
 	.uleb128 0x61
-	.4byte	0x13d4b
-	.4byte	.LLST115
+	.4byte	0x13f2e
+	.4byte	.LLST123
 	.uleb128 0x58
-	.4byte	0x13d57
+	.4byte	0x13f3a
 	.uleb128 0x61
-	.4byte	0x13d63
-	.4byte	.LLST116
+	.4byte	0x13f46
+	.4byte	.LLST124
 	.uleb128 0x61
-	.4byte	0x13d6f
-	.4byte	.LLST117
+	.4byte	0x13f52
+	.4byte	.LLST125
 	.uleb128 0x61
-	.4byte	0x13d7b
-	.4byte	.LLST118
+	.4byte	0x13f5e
+	.4byte	.LLST126
 	.uleb128 0x61
-	.4byte	0x13d87
-	.4byte	.LLST119
+	.4byte	0x13f6a
+	.4byte	.LLST127
 	.uleb128 0x61
-	.4byte	0x13d93
-	.4byte	.LLST120
+	.4byte	0x13f76
+	.4byte	.LLST128
 	.uleb128 0x61
-	.4byte	0x13d9f
-	.4byte	.LLST121
+	.4byte	0x13f82
+	.4byte	.LLST129
 	.uleb128 0x61
-	.4byte	0x13dab
-	.4byte	.LLST122
+	.4byte	0x13f8e
+	.4byte	.LLST130
 	.uleb128 0x58
-	.4byte	0x13db7
+	.4byte	0x13f9a
 	.uleb128 0x5c
-	.4byte	0x145c6
-	.8byte	.LBB1296
-	.4byte	.Ldebug_ranges0+0x6d0
+	.4byte	0x147a9
+	.8byte	.LBB1358
+	.4byte	.Ldebug_ranges0+0x770
 	.byte	0x1
 	.2byte	0x39c
-	.4byte	0x1364c
+	.4byte	0x1382f
 	.uleb128 0x55
-	.4byte	0x145ee
+	.4byte	0x147d1
 	.uleb128 0x55
-	.4byte	0x145e2
+	.4byte	0x147c5
 	.uleb128 0x55
-	.4byte	0x145d6
+	.4byte	0x147b9
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x145c6
-	.8byte	.LBB1301
-	.4byte	.Ldebug_ranges0+0x720
+	.4byte	0x147a9
+	.8byte	.LBB1363
+	.4byte	.Ldebug_ranges0+0x7c0
 	.byte	0x1
 	.2byte	0x39d
-	.4byte	0x13674
+	.4byte	0x13857
 	.uleb128 0x55
-	.4byte	0x145ee
+	.4byte	0x147d1
 	.uleb128 0x55
-	.4byte	0x145e2
+	.4byte	0x147c5
 	.uleb128 0x55
-	.4byte	0x145d6
+	.4byte	0x147b9
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x145c6
-	.8byte	.LBB1313
-	.4byte	.Ldebug_ranges0+0x790
+	.4byte	0x147a9
+	.8byte	.LBB1375
+	.4byte	.Ldebug_ranges0+0x830
 	.byte	0x1
 	.2byte	0x39e
-	.4byte	0x1369c
+	.4byte	0x1387f
 	.uleb128 0x55
-	.4byte	0x145ee
+	.4byte	0x147d1
 	.uleb128 0x55
-	.4byte	0x145e2
+	.4byte	0x147c5
 	.uleb128 0x55
-	.4byte	0x145d6
+	.4byte	0x147b9
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x145c6
-	.8byte	.LBB1325
-	.4byte	.Ldebug_ranges0+0x800
+	.4byte	0x147a9
+	.8byte	.LBB1387
+	.4byte	.Ldebug_ranges0+0x8a0
 	.byte	0x1
 	.2byte	0x39f
 	.uleb128 0x55
-	.4byte	0x145ee
+	.4byte	0x147d1
 	.uleb128 0x55
-	.4byte	0x145e2
+	.4byte	0x147c5
 	.uleb128 0x55
-	.4byte	0x145d6
+	.4byte	0x147b9
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13a48
-	.8byte	.LBB1336
-	.8byte	.LBE1336-.LBB1336
+	.4byte	0x13c2b
+	.8byte	.LBB1398
+	.8byte	.LBE1398-.LBB1398
 	.byte	0x1
 	.2byte	0x48e
-	.4byte	0x1376b
+	.4byte	0x1394e
 	.uleb128 0x55
-	.4byte	0x13a79
+	.4byte	0x13c5c
 	.uleb128 0x55
-	.4byte	0x13a79
+	.4byte	0x13c5c
 	.uleb128 0x55
-	.4byte	0x13a79
+	.4byte	0x13c5c
 	.uleb128 0x55
-	.4byte	0x13a6d
+	.4byte	0x13c50
 	.uleb128 0x72
-	.4byte	0x13a61
+	.4byte	0x13c44
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x13a55
+	.4byte	0x13c38
 	.uleb128 0x57
-	.8byte	.LBB1337
-	.8byte	.LBE1337-.LBB1337
+	.8byte	.LBB1399
+	.8byte	.LBE1399-.LBB1399
 	.uleb128 0x58
-	.4byte	0x13a85
+	.4byte	0x13c68
 	.uleb128 0x58
-	.4byte	0x13a91
+	.4byte	0x13c74
 	.uleb128 0x58
-	.4byte	0x13a9d
+	.4byte	0x13c80
 	.uleb128 0x58
-	.4byte	0x13aa9
+	.4byte	0x13c8c
 	.uleb128 0x58
-	.4byte	0x13ab5
+	.4byte	0x13c98
 	.uleb128 0x58
-	.4byte	0x13ac1
+	.4byte	0x13ca4
 	.uleb128 0x61
-	.4byte	0x13acd
-	.4byte	.LLST123
+	.4byte	0x13cb0
+	.4byte	.LLST131
 	.uleb128 0x61
-	.4byte	0x13ad9
-	.4byte	.LLST124
+	.4byte	0x13cbc
+	.4byte	.LLST132
 	.uleb128 0x58
-	.4byte	0x13ae5
+	.4byte	0x13cc8
 	.uleb128 0x61
-	.4byte	0x13af1
-	.4byte	.LLST125
+	.4byte	0x13cd4
+	.4byte	.LLST133
 	.uleb128 0x58
-	.4byte	0x13afb
+	.4byte	0x13cde
 	.uleb128 0x61
-	.4byte	0x13b05
-	.4byte	.LLST126
+	.4byte	0x13ce8
+	.4byte	.LLST134
 	.uleb128 0x61
-	.4byte	0x13b11
-	.4byte	.LLST127
+	.4byte	0x13cf4
+	.4byte	.LLST135
 	.uleb128 0x58
-	.4byte	0x13b1d
+	.4byte	0x13d00
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13c18
-	.8byte	.LBB1338
-	.8byte	.LBE1338-.LBB1338
+	.4byte	0x13dfb
+	.8byte	.LBB1400
+	.8byte	.LBE1400-.LBB1400
 	.byte	0x1
 	.2byte	0x48b
-	.4byte	0x13865
+	.4byte	0x13a48
 	.uleb128 0x55
-	.4byte	0x13c49
+	.4byte	0x13e2c
 	.uleb128 0x55
-	.4byte	0x13c49
+	.4byte	0x13e2c
 	.uleb128 0x55
-	.4byte	0x13c49
+	.4byte	0x13e2c
 	.uleb128 0x55
-	.4byte	0x13c3d
+	.4byte	0x13e20
 	.uleb128 0x55
-	.4byte	0x13c31
+	.4byte	0x13e14
 	.uleb128 0x55
-	.4byte	0x13c25
+	.4byte	0x13e08
 	.uleb128 0x57
-	.8byte	.LBB1339
-	.8byte	.LBE1339-.LBB1339
+	.8byte	.LBB1401
+	.8byte	.LBE1401-.LBB1401
 	.uleb128 0x58
-	.4byte	0x13c55
+	.4byte	0x13e38
 	.uleb128 0x61
-	.4byte	0x13c61
-	.4byte	.LLST128
+	.4byte	0x13e44
+	.4byte	.LLST136
 	.uleb128 0x58
-	.4byte	0x13c6b
+	.4byte	0x13e4e
 	.uleb128 0x61
-	.4byte	0x13c75
-	.4byte	.LLST129
+	.4byte	0x13e58
+	.4byte	.LLST137
 	.uleb128 0x61
-	.4byte	0x13c81
-	.4byte	.LLST130
+	.4byte	0x13e64
+	.4byte	.LLST138
 	.uleb128 0x61
-	.4byte	0x13c8d
-	.4byte	.LLST131
+	.4byte	0x13e70
+	.4byte	.LLST139
 	.uleb128 0x58
-	.4byte	0x13c99
+	.4byte	0x13e7c
 	.uleb128 0x62
-	.4byte	0x13ca5
+	.4byte	0x13e88
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x13cb1
+	.4byte	0x13e94
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x13cbd
-	.4byte	.LLST132
+	.4byte	0x13ea0
+	.4byte	.LLST140
 	.uleb128 0x61
-	.4byte	0x13cc9
-	.4byte	.LLST133
+	.4byte	0x13eac
+	.4byte	.LLST141
 	.uleb128 0x61
-	.4byte	0x13cd5
-	.4byte	.LLST134
+	.4byte	0x13eb8
+	.4byte	.LLST142
 	.uleb128 0x58
-	.4byte	0x13ce1
+	.4byte	0x13ec4
 	.uleb128 0x5c
-	.4byte	0x145c6
-	.8byte	.LBB1340
-	.4byte	.Ldebug_ranges0+0x850
+	.4byte	0x147a9
+	.8byte	.LBB1402
+	.4byte	.Ldebug_ranges0+0x8f0
 	.byte	0x1
 	.2byte	0x3c4
-	.4byte	0x1383f
+	.4byte	0x13a22
 	.uleb128 0x55
-	.4byte	0x145ee
+	.4byte	0x147d1
 	.uleb128 0x55
-	.4byte	0x145e2
+	.4byte	0x147c5
 	.uleb128 0x55
-	.4byte	0x145d6
+	.4byte	0x147b9
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x145c6
-	.8byte	.LBB1347
-	.4byte	.Ldebug_ranges0+0x8b0
+	.4byte	0x147a9
+	.8byte	.LBB1409
+	.4byte	.Ldebug_ranges0+0x950
 	.byte	0x1
 	.2byte	0x3c5
 	.uleb128 0x55
-	.4byte	0x145ee
+	.4byte	0x147d1
 	.uleb128 0x55
-	.4byte	0x145e2
+	.4byte	0x147c5
 	.uleb128 0x55
-	.4byte	0x145d6
+	.4byte	0x147b9
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x13b2a
-	.8byte	.LBB1358
-	.8byte	.LBE1358-.LBB1358
+	.4byte	0x13d0d
+	.8byte	.LBB1420
+	.8byte	.LBE1420-.LBB1420
 	.byte	0x1
 	.2byte	0x485
 	.uleb128 0x55
-	.4byte	0x13b5b
+	.4byte	0x13d3e
 	.uleb128 0x55
-	.4byte	0x13b5b
+	.4byte	0x13d3e
 	.uleb128 0x55
-	.4byte	0x13b5b
+	.4byte	0x13d3e
 	.uleb128 0x55
-	.4byte	0x13b4f
+	.4byte	0x13d32
 	.uleb128 0x55
-	.4byte	0x13b43
+	.4byte	0x13d26
 	.uleb128 0x55
-	.4byte	0x13b37
+	.4byte	0x13d1a
 	.uleb128 0x57
-	.8byte	.LBB1359
-	.8byte	.LBE1359-.LBB1359
+	.8byte	.LBB1421
+	.8byte	.LBE1421-.LBB1421
 	.uleb128 0x58
-	.4byte	0x13b67
+	.4byte	0x13d4a
 	.uleb128 0x61
-	.4byte	0x13b73
-	.4byte	.LLST135
+	.4byte	0x13d56
+	.4byte	.LLST143
 	.uleb128 0x58
-	.4byte	0x13b7d
+	.4byte	0x13d60
 	.uleb128 0x61
-	.4byte	0x13b87
-	.4byte	.LLST136
+	.4byte	0x13d6a
+	.4byte	.LLST144
 	.uleb128 0x61
-	.4byte	0x13b93
-	.4byte	.LLST137
+	.4byte	0x13d76
+	.4byte	.LLST145
 	.uleb128 0x61
-	.4byte	0x13b9f
-	.4byte	.LLST138
+	.4byte	0x13d82
+	.4byte	.LLST146
 	.uleb128 0x58
-	.4byte	0x13bab
+	.4byte	0x13d8e
 	.uleb128 0x62
-	.4byte	0x13bb7
+	.4byte	0x13d9a
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x13bc3
+	.4byte	0x13da6
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x13bcf
-	.4byte	.LLST139
+	.4byte	0x13db2
+	.4byte	.LLST147
 	.uleb128 0x61
-	.4byte	0x13bdb
-	.4byte	.LLST140
+	.4byte	0x13dbe
+	.4byte	.LLST148
 	.uleb128 0x61
-	.4byte	0x13be7
-	.4byte	.LLST141
+	.4byte	0x13dca
+	.4byte	.LLST149
 	.uleb128 0x58
-	.4byte	0x13bf3
+	.4byte	0x13dd6
 	.uleb128 0x58
-	.4byte	0x13bff
+	.4byte	0x13de2
 	.uleb128 0x58
-	.4byte	0x13c0b
+	.4byte	0x13dee
 	.uleb128 0x5c
-	.4byte	0x14591
-	.8byte	.LBB1360
-	.4byte	.Ldebug_ranges0+0x900
+	.4byte	0x14774
+	.8byte	.LBB1422
+	.4byte	.Ldebug_ranges0+0x9a0
 	.byte	0x1
 	.2byte	0x3eb
-	.4byte	0x1393f
+	.4byte	0x13b22
 	.uleb128 0x55
-	.4byte	0x145b9
+	.4byte	0x1479c
 	.uleb128 0x55
-	.4byte	0x145ad
+	.4byte	0x14790
 	.uleb128 0x55
-	.4byte	0x145a1
+	.4byte	0x14784
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x14591
-	.8byte	.LBB1366
-	.4byte	.Ldebug_ranges0+0x960
+	.4byte	0x14774
+	.8byte	.LBB1428
+	.4byte	.Ldebug_ranges0+0xa00
 	.byte	0x1
 	.2byte	0x3ec
 	.uleb128 0x55
-	.4byte	0x145b9
+	.4byte	0x1479c
 	.uleb128 0x55
-	.4byte	0x145ad
+	.4byte	0x14790
 	.uleb128 0x55
-	.4byte	0x145a1
+	.4byte	0x14784
 	.byte	0
 	.byte	0
 	.byte	0
@@ -47267,7 +47608,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x438
 	.byte	0x1
-	.4byte	0x13a48
+	.4byte	0x13c2b
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
@@ -47287,12 +47628,12 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x43a
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x43c
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.uleb128 0x48
 	.4byte	.LASF3140
 	.byte	0x1
@@ -47364,7 +47705,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x3f2
 	.byte	0x1
-	.4byte	0x13b2a
+	.4byte	0x13d0d
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
@@ -47384,12 +47725,12 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x3f4
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x3f6
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.uleb128 0x48
 	.4byte	.LASF3140
 	.byte	0x1
@@ -47461,7 +47802,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x3cb
 	.byte	0x1
-	.4byte	0x13c18
+	.4byte	0x13dfb
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
@@ -47481,12 +47822,12 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x3cd
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x3cf
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
@@ -47563,7 +47904,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x3a6
 	.byte	0x1
-	.4byte	0x13cee
+	.4byte	0x13ed1
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
@@ -47583,12 +47924,12 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x3a8
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x3aa
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
@@ -47655,7 +47996,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x37e
 	.byte	0x1
-	.4byte	0x13dc4
+	.4byte	0x13fa7
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
@@ -47675,12 +48016,12 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x380
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x382
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
@@ -47750,7 +48091,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2816-.LFB2816
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13f25
+	.4byte	0x14108
 	.uleb128 0x76
 	.4byte	.LASF3136
 	.byte	0x1
@@ -47783,14 +48124,14 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x2b1
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x2b3
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.uleb128 0x6a
 	.string	"i"
 	.byte	0x1
@@ -47906,7 +48247,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2815-.LFB2815
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14080
+	.4byte	0x14263
 	.uleb128 0x76
 	.4byte	.LASF3136
 	.byte	0x1
@@ -47939,14 +48280,14 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x20c
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x20e
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.uleb128 0x5b
 	.string	"i"
 	.byte	0x1
@@ -48054,7 +48395,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x1ac
 	.byte	0x1
-	.4byte	0x1419e
+	.4byte	0x14381
 	.uleb128 0x66
 	.4byte	.LASF3168
 	.byte	0x1
@@ -48079,7 +48420,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x1ad
-	.4byte	0xe874
+	.4byte	0xe880
 	.uleb128 0x66
 	.4byte	.LASF2882
 	.byte	0x1
@@ -48179,46 +48520,46 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2813-.LFB2813
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14248
+	.4byte	0x1442b
 	.uleb128 0x59
 	.4byte	.LASF2288
 	.byte	0x1
 	.2byte	0x18e
 	.4byte	0x3205
-	.4byte	.LLST235
+	.4byte	.LLST243
 	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x190
-	.4byte	0xe557
-	.4byte	.LLST236
+	.4byte	0xe563
+	.4byte	.LLST244
 	.uleb128 0x5a
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x191
-	.4byte	0xe874
-	.4byte	.LLST237
+	.4byte	0xe880
+	.4byte	.LLST245
 	.uleb128 0x4f
-	.8byte	.LVL841
-	.4byte	0x1565c
+	.8byte	.LVL863
+	.4byte	0x1583f
 	.uleb128 0x4f
-	.8byte	.LVL843
-	.4byte	0x143e2
+	.8byte	.LVL865
+	.4byte	0x145c5
 	.uleb128 0x4f
-	.8byte	.LVL844
-	.4byte	0x15674
+	.8byte	.LVL866
+	.4byte	0x15857
 	.uleb128 0x4f
-	.8byte	.LVL847
-	.4byte	0x14248
+	.8byte	.LVL869
+	.4byte	0x1442b
 	.uleb128 0x4f
-	.8byte	.LVL848
-	.4byte	0x15674
+	.8byte	.LVL870
+	.4byte	0x15857
 	.uleb128 0x4f
-	.8byte	.LVL851
-	.4byte	0x1430f
+	.8byte	.LVL873
+	.4byte	0x144f2
 	.uleb128 0x4f
-	.8byte	.LVL852
-	.4byte	0x15674
+	.8byte	.LVL874
+	.4byte	0x15857
 	.byte	0
 	.uleb128 0x77
 	.4byte	.LASF3179
@@ -48228,7 +48569,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2812-.LFB2812
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1430f
+	.4byte	0x144f2
 	.uleb128 0x76
 	.4byte	.LASF3168
 	.byte	0x1
@@ -48254,8 +48595,8 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x15e
-	.4byte	0xe874
-	.4byte	.LLST231
+	.4byte	0xe880
+	.4byte	.LLST239
 	.uleb128 0x4d
 	.4byte	.LASF2915
 	.byte	0x1
@@ -48280,13 +48621,13 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x161
 	.4byte	0x13f
-	.4byte	.LLST232
+	.4byte	.LLST240
 	.uleb128 0x5a
 	.4byte	.LASF3162
 	.byte	0x1
 	.2byte	0x162
 	.4byte	0x15a
-	.4byte	.LLST233
+	.4byte	.LLST241
 	.uleb128 0x6a
 	.string	"i"
 	.byte	0x1
@@ -48304,7 +48645,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x164
 	.4byte	0x13f
-	.4byte	.LLST234
+	.4byte	.LLST242
 	.byte	0
 	.uleb128 0x77
 	.4byte	.LASF3180
@@ -48314,7 +48655,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2811-.LFB2811
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x143e2
+	.4byte	0x145c5
 	.uleb128 0x76
 	.4byte	.LASF3168
 	.byte	0x1
@@ -48327,7 +48668,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0xac0
-	.4byte	.LLST227
+	.4byte	.LLST235
 	.uleb128 0x76
 	.4byte	.LASF3159
 	.byte	0x1
@@ -48339,8 +48680,8 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x122
-	.4byte	0xe874
-	.4byte	.LLST228
+	.4byte	0xe880
+	.4byte	.LLST236
 	.uleb128 0x4d
 	.4byte	.LASF2915
 	.byte	0x1
@@ -48370,7 +48711,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x125
 	.4byte	0x13f
-	.4byte	.LLST229
+	.4byte	.LLST237
 	.uleb128 0x4d
 	.4byte	.LASF3162
 	.byte	0x1
@@ -48395,7 +48736,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x128
 	.4byte	0x13f
-	.4byte	.LLST230
+	.4byte	.LLST238
 	.byte	0
 	.uleb128 0x78
 	.4byte	.LASF3181
@@ -48405,7 +48746,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2810-.LFB2810
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x144c7
+	.4byte	0x146aa
 	.uleb128 0x79
 	.4byte	.LASF3168
 	.byte	0x1
@@ -48438,14 +48779,14 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2976
 	.byte	0x1
 	.byte	0xd7
-	.4byte	0xe874
-	.4byte	.LLST221
+	.4byte	0xe880
+	.4byte	.LLST229
 	.uleb128 0x7a
 	.4byte	.LASF2882
 	.byte	0x1
 	.byte	0xd7
 	.4byte	0xc6
-	.4byte	.LLST222
+	.4byte	.LLST230
 	.uleb128 0x4c
 	.4byte	.LASF2915
 	.byte	0x1
@@ -48470,19 +48811,19 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x13f
-	.4byte	.LLST223
+	.4byte	.LLST231
 	.uleb128 0x7c
 	.4byte	.LASF3173
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x13f
-	.4byte	.LLST224
+	.4byte	.LLST232
 	.uleb128 0x7c
 	.4byte	.LASF3162
 	.byte	0x1
 	.byte	0xdb
 	.4byte	0x15a
-	.4byte	.LLST225
+	.4byte	.LLST233
 	.uleb128 0x7d
 	.string	"i"
 	.byte	0x1
@@ -48500,7 +48841,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0xdd
 	.4byte	0x13f
-	.4byte	.LLST226
+	.4byte	.LLST234
 	.byte	0
 	.uleb128 0x7f
 	.4byte	.LASF3182
@@ -48508,12 +48849,12 @@ __exitcall_ebc_exit:
 	.byte	0xb7
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x144fb
+	.4byte	0x146de
 	.uleb128 0x80
 	.string	"ebc"
 	.byte	0x1
 	.byte	0xb7
-	.4byte	0xe557
+	.4byte	0xe563
 	.uleb128 0x81
 	.4byte	.LASF3183
 	.byte	0x1
@@ -48523,7 +48864,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2976
 	.byte	0x1
 	.byte	0xb9
-	.4byte	0xe874
+	.4byte	0xe880
 	.byte	0
 	.uleb128 0x7f
 	.4byte	.LASF3184
@@ -48531,7 +48872,7 @@ __exitcall_ebc_exit:
 	.byte	0xa5
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x14546
+	.4byte	0x14729
 	.uleb128 0x81
 	.4byte	.LASF2871
 	.byte	0x1
@@ -48564,7 +48905,7 @@ __exitcall_ebc_exit:
 	.byte	0x8f
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x14591
+	.4byte	0x14774
 	.uleb128 0x81
 	.4byte	.LASF2871
 	.byte	0x1
@@ -48597,7 +48938,7 @@ __exitcall_ebc_exit:
 	.byte	0x89
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x145c6
+	.4byte	0x147a9
 	.uleb128 0x81
 	.4byte	.LASF2871
 	.byte	0x1
@@ -48620,7 +48961,7 @@ __exitcall_ebc_exit:
 	.byte	0x83
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x145fb
+	.4byte	0x147de
 	.uleb128 0x81
 	.4byte	.LASF2871
 	.byte	0x1
@@ -48642,12 +48983,12 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x14621
+	.4byte	0x14804
 	.uleb128 0x81
 	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x4b
-	.4byte	0xe1b4
+	.4byte	0xe1c0
 	.uleb128 0x81
 	.4byte	.LASF2985
 	.byte	0xb
@@ -48659,12 +49000,12 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x14653
+	.4byte	0x14836
 	.uleb128 0x81
 	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x3c
-	.4byte	0xe1b4
+	.4byte	0xe1c0
 	.uleb128 0x81
 	.4byte	.LASF3191
 	.byte	0xb
@@ -48681,12 +49022,12 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x1469d
+	.4byte	0x14880
 	.uleb128 0x81
 	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x36
-	.4byte	0xe1b4
+	.4byte	0xe1c0
 	.uleb128 0x81
 	.4byte	.LASF3194
 	.byte	0xb
@@ -48713,12 +49054,12 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x146b7
+	.4byte	0x1489a
 	.uleb128 0x81
 	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x31
-	.4byte	0xe1b4
+	.4byte	0xe1c0
 	.byte	0
 	.uleb128 0x7f
 	.4byte	.LASF3199
@@ -48726,24 +49067,24 @@ __exitcall_ebc_exit:
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x146e0
+	.4byte	0x148c3
 	.uleb128 0x81
 	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x2c
-	.4byte	0xe1b4
+	.4byte	0xe1c0
 	.uleb128 0x81
 	.4byte	.LASF3020
 	.byte	0xb
 	.byte	0x2c
-	.4byte	0xe1f4
+	.4byte	0xe200
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3200
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x1472a
+	.4byte	0x1490d
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
@@ -48763,7 +49104,7 @@ __exitcall_ebc_exit:
 	.string	"dir"
 	.byte	0xa
 	.2byte	0x1ad
-	.4byte	0xdc1a
+	.4byte	0xdc26
 	.uleb128 0x53
 	.string	"ops"
 	.byte	0xa
@@ -48776,7 +49117,7 @@ __exitcall_ebc_exit:
 	.2byte	0x108
 	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x14748
+	.4byte	0x1492b
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
@@ -48789,7 +49130,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x14765
+	.4byte	0x14948
 	.uleb128 0x80
 	.string	"bus"
 	.byte	0xc8
@@ -48802,7 +49143,7 @@ __exitcall_ebc_exit:
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14782
+	.4byte	0x14965
 	.uleb128 0x81
 	.4byte	.LASF3204
 	.byte	0xa
@@ -48814,7 +49155,7 @@ __exitcall_ebc_exit:
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x147c0
+	.4byte	0x149a3
 	.uleb128 0x80
 	.string	"dev"
 	.byte	0xcb
@@ -48842,12 +49183,12 @@ __exitcall_ebc_exit:
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x147dd
+	.4byte	0x149c0
 	.uleb128 0x81
 	.4byte	.LASF2952
 	.byte	0x3
 	.byte	0x35
-	.4byte	0xdbb4
+	.4byte	0xdbc0
 	.byte	0
 	.uleb128 0x7f
 	.4byte	.LASF3209
@@ -48855,12 +49196,12 @@ __exitcall_ebc_exit:
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14804
+	.4byte	0x149e7
 	.uleb128 0x81
 	.4byte	.LASF2952
 	.byte	0x3
 	.byte	0x30
-	.4byte	0xdbb4
+	.4byte	0xdbc0
 	.uleb128 0x80
 	.string	"t"
 	.byte	0x3
@@ -48872,48 +49213,48 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x1481e
+	.4byte	0x14a01
 	.uleb128 0x81
 	.4byte	.LASF2952
 	.byte	0x3
 	.byte	0x2b
-	.4byte	0xdbb4
+	.4byte	0xdbc0
 	.byte	0
 	.uleb128 0x82
 	.4byte	.LASF3211
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x14838
+	.4byte	0x14a1b
 	.uleb128 0x81
 	.4byte	.LASF2952
 	.byte	0x3
 	.byte	0x26
-	.4byte	0xdbb4
+	.4byte	0xdbc0
 	.byte	0
 	.uleb128 0x82
 	.4byte	.LASF3212
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x14852
+	.4byte	0x14a35
 	.uleb128 0x81
 	.4byte	.LASF2952
 	.byte	0x3
 	.byte	0x21
-	.4byte	0xdbb4
+	.4byte	0xdbc0
 	.byte	0
 	.uleb128 0x82
 	.4byte	.LASF3213
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x1486c
+	.4byte	0x14a4f
 	.uleb128 0x81
 	.4byte	.LASF2952
 	.byte	0x3
 	.byte	0x1c
-	.4byte	0xdbb4
+	.4byte	0xdbc0
 	.byte	0
 	.uleb128 0x83
 	.4byte	.LASF3344
@@ -48926,12 +49267,12 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x14893
+	.4byte	0x14a76
 	.uleb128 0x81
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x14893
+	.4byte	0x14a76
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -48941,24 +49282,24 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x148b3
+	.4byte	0x14a96
 	.uleb128 0x81
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x14893
+	.4byte	0x14a76
 	.byte	0
 	.uleb128 0x82
 	.4byte	.LASF3215
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x148ef
+	.4byte	0x14ad2
 	.uleb128 0x81
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x14893
+	.4byte	0x14a76
 	.uleb128 0x81
 	.4byte	.LASF193
 	.byte	0x4
@@ -48981,7 +49322,7 @@ __exitcall_ebc_exit:
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14921
+	.4byte	0x14b04
 	.uleb128 0x80
 	.string	"to"
 	.byte	0x9
@@ -49004,7 +49345,7 @@ __exitcall_ebc_exit:
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14953
+	.4byte	0x14b36
 	.uleb128 0x80
 	.string	"to"
 	.byte	0x9
@@ -49027,7 +49368,7 @@ __exitcall_ebc_exit:
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14985
+	.4byte	0x14b68
 	.uleb128 0x80
 	.string	"to"
 	.byte	0x9
@@ -49050,7 +49391,7 @@ __exitcall_ebc_exit:
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x149c2
+	.4byte	0x14ba5
 	.uleb128 0x80
 	.string	"to"
 	.byte	0x9
@@ -49078,7 +49419,7 @@ __exitcall_ebc_exit:
 	.byte	0xf5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x149f7
+	.4byte	0x14bda
 	.uleb128 0x80
 	.string	"ptr"
 	.byte	0x6
@@ -49103,7 +49444,7 @@ __exitcall_ebc_exit:
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14a43
+	.4byte	0x14c26
 	.uleb128 0x81
 	.4byte	.LASF1164
 	.byte	0x6
@@ -49138,7 +49479,7 @@ __exitcall_ebc_exit:
 	.2byte	0x2e5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14a6d
+	.4byte	0x14c50
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x11
@@ -49156,7 +49497,7 @@ __exitcall_ebc_exit:
 	.2byte	0x216
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14aa5
+	.4byte	0x14c88
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x11
@@ -49181,7 +49522,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1dd
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14adb
+	.4byte	0x14cbe
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x11
@@ -49204,7 +49545,7 @@ __exitcall_ebc_exit:
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x14af9
+	.4byte	0x14cdc
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x11
@@ -49217,7 +49558,7 @@ __exitcall_ebc_exit:
 	.2byte	0x13d
 	.4byte	0xd813
 	.byte	0x3
-	.4byte	0x14b17
+	.4byte	0x14cfa
 	.uleb128 0x66
 	.4byte	.LASF171
 	.byte	0x11
@@ -49229,7 +49570,7 @@ __exitcall_ebc_exit:
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x14b3d
+	.4byte	0x14d20
 	.uleb128 0x81
 	.4byte	.LASF3052
 	.byte	0xbe
@@ -49247,12 +49588,12 @@ __exitcall_ebc_exit:
 	.byte	0xd6
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14b5a
+	.4byte	0x14d3d
 	.uleb128 0x81
 	.4byte	.LASF3052
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x14b5a
+	.4byte	0x14d3d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -49263,12 +49604,12 @@ __exitcall_ebc_exit:
 	.2byte	0x164
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14b7e
+	.4byte	0x14d61
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x14b7e
+	.4byte	0x14d61
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -49279,7 +49620,7 @@ __exitcall_ebc_exit:
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14bb9
+	.4byte	0x14d9c
 	.uleb128 0x65
 	.string	"np"
 	.byte	0xc
@@ -49302,7 +49643,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14c05
+	.4byte	0x14de8
 	.uleb128 0x65
 	.string	"np"
 	.byte	0xc
@@ -49334,7 +49675,7 @@ __exitcall_ebc_exit:
 	.byte	0xc
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x14c1f
+	.4byte	0x14e02
 	.uleb128 0x81
 	.4byte	.LASF882
 	.byte	0xc
@@ -49346,7 +49687,7 @@ __exitcall_ebc_exit:
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x14c45
+	.4byte	0x14e28
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -49364,7 +49705,7 @@ __exitcall_ebc_exit:
 	.2byte	0x49b
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14c63
+	.4byte	0x14e46
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -49377,7 +49718,7 @@ __exitcall_ebc_exit:
 	.2byte	0x2c5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14c99
+	.4byte	0x14e7c
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -49400,7 +49741,7 @@ __exitcall_ebc_exit:
 	.byte	0xca
 	.4byte	0x351
 	.byte	0x3
-	.4byte	0x14cb6
+	.4byte	0x14e99
 	.uleb128 0x80
 	.string	"res"
 	.byte	0xd
@@ -49413,7 +49754,7 @@ __exitcall_ebc_exit:
 	.byte	0x22
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x14cd3
+	.4byte	0x14eb6
 	.uleb128 0x80
 	.string	"ptr"
 	.byte	0xcc
@@ -49426,7 +49767,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14cf0
+	.4byte	0x14ed3
 	.uleb128 0x81
 	.4byte	.LASF1001
 	.byte	0xcd
@@ -49439,7 +49780,7 @@ __exitcall_ebc_exit:
 	.2byte	0x203
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x14d19
+	.4byte	0x14efc
 	.uleb128 0x65
 	.string	"wq"
 	.byte	0x12
@@ -49456,7 +49797,7 @@ __exitcall_ebc_exit:
 	.byte	0x12
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x14d3f
+	.4byte	0x14f22
 	.uleb128 0x81
 	.4byte	.LASF2288
 	.byte	0x12
@@ -49474,7 +49815,7 @@ __exitcall_ebc_exit:
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14d5b
+	.4byte	0x14f3e
 	.uleb128 0x65
 	.string	"m"
 	.byte	0x51
@@ -49487,7 +49828,7 @@ __exitcall_ebc_exit:
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14d77
+	.4byte	0x14f5a
 	.uleb128 0x65
 	.string	"m"
 	.byte	0x51
@@ -49500,7 +49841,7 @@ __exitcall_ebc_exit:
 	.byte	0x97
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x14db6
+	.4byte	0x14f99
 	.uleb128 0x81
 	.4byte	.LASF1164
 	.byte	0xca
@@ -49527,7 +49868,7 @@ __exitcall_ebc_exit:
 	.byte	0xca
 	.byte	0x91
 	.byte	0x3
-	.4byte	0x14de9
+	.4byte	0x14fcc
 	.uleb128 0x81
 	.4byte	.LASF1001
 	.byte	0xca
@@ -49551,7 +49892,7 @@ __exitcall_ebc_exit:
 	.byte	0xca
 	.byte	0x80
 	.byte	0x3
-	.4byte	0x14e19
+	.4byte	0x14ffc
 	.uleb128 0x80
 	.string	"ptr"
 	.byte	0xca
@@ -49574,12 +49915,12 @@ __exitcall_ebc_exit:
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14e41
+	.4byte	0x15024
 	.uleb128 0x80
 	.string	"ti"
 	.byte	0xca
 	.byte	0x5f
-	.4byte	0x14e41
+	.4byte	0x15024
 	.uleb128 0x81
 	.4byte	.LASF3259
 	.byte	0xca
@@ -49595,7 +49936,7 @@ __exitcall_ebc_exit:
 	.byte	0xf
 	.4byte	0x2f05
 	.byte	0x3
-	.4byte	0x14e63
+	.4byte	0x15046
 	.uleb128 0x7b
 	.4byte	.LASF3261
 	.byte	0x5
@@ -49607,7 +49948,7 @@ __exitcall_ebc_exit:
 	.byte	0xf
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x14ea9
+	.4byte	0x1508c
 	.uleb128 0x81
 	.4byte	.LASF976
 	.byte	0xf
@@ -49618,7 +49959,7 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0xf
 	.byte	0x1c
-	.4byte	0x14e9c
+	.4byte	0x1507f
 	.uleb128 0x22
 	.4byte	.LASF3131
 	.byte	0xf
@@ -49628,13 +49969,13 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0xf
 	.byte	0x1c
-	.4byte	0x12844
+	.4byte	0x12a27
 	.byte	0
 	.uleb128 0x7e
 	.string	"__u"
 	.byte	0xf
 	.byte	0x1c
-	.4byte	0x14e7d
+	.4byte	0x15060
 	.byte	0
 	.byte	0
 	.uleb128 0x84
@@ -49648,7 +49989,7 @@ __exitcall_ebc_exit:
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14ece
+	.4byte	0x150b1
 	.uleb128 0x80
 	.string	"n"
 	.byte	0xce
@@ -49661,7 +50002,7 @@ __exitcall_ebc_exit:
 	.byte	0x9a
 	.4byte	0xe2
 	.byte	0x3
-	.4byte	0x14f02
+	.4byte	0x150e5
 	.uleb128 0x81
 	.4byte	.LASF2470
 	.byte	0x8
@@ -49684,7 +50025,7 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x14f1d
+	.4byte	0x15100
 	.uleb128 0x80
 	.string	"p"
 	.byte	0xcf
@@ -49697,12 +50038,12 @@ __exitcall_ebc_exit:
 	.byte	0xb8
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x14f38
+	.4byte	0x1511b
 	.uleb128 0x80
 	.string	"p"
 	.byte	0xd0
 	.byte	0xb8
-	.4byte	0x14f38
+	.4byte	0x1511b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -49713,7 +50054,7 @@ __exitcall_ebc_exit:
 	.byte	0x39
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x14f5b
+	.4byte	0x1513e
 	.uleb128 0x80
 	.string	"val"
 	.byte	0xd0
@@ -49726,7 +50067,7 @@ __exitcall_ebc_exit:
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14f83
+	.4byte	0x15166
 	.uleb128 0x80
 	.string	"nr"
 	.byte	0x7
@@ -49736,7 +50077,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF1164
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x14f83
+	.4byte	0x15166
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -49746,7 +50087,7 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x14fbf
+	.4byte	0x151a2
 	.uleb128 0x80
 	.string	"i"
 	.byte	0x10
@@ -49756,7 +50097,7 @@ __exitcall_ebc_exit:
 	.string	"v"
 	.byte	0x10
 	.byte	0x2f
-	.4byte	0x14fbf
+	.4byte	0x151a2
 	.uleb128 0x7e
 	.string	"w0"
 	.byte	0x10
@@ -49766,7 +50107,7 @@ __exitcall_ebc_exit:
 	.string	"x1"
 	.byte	0x10
 	.byte	0x2f
-	.4byte	0x14fbf
+	.4byte	0x151a2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -49777,7 +50118,7 @@ __exitcall_ebc_exit:
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14fe0
+	.4byte	0x151c3
 	.uleb128 0x80
 	.string	"x"
 	.byte	0xd1
@@ -49790,7 +50131,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14ffd
+	.4byte	0x151e0
 	.uleb128 0x81
 	.4byte	.LASF2503
 	.byte	0xd2
@@ -49802,12 +50143,12 @@ __exitcall_ebc_exit:
 	.byte	0xd3
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x15021
+	.4byte	0x15204
 	.uleb128 0x80
 	.string	"p"
 	.byte	0xd3
 	.byte	0xb
-	.4byte	0x15021
+	.4byte	0x15204
 	.uleb128 0x81
 	.4byte	.LASF1001
 	.byte	0xd3
@@ -49816,21 +50157,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x15029
+	.4byte	0x1520c
 	.uleb128 0x85
 	.uleb128 0x3
-	.4byte	0x15027
+	.4byte	0x1520a
 	.uleb128 0x82
 	.4byte	.LASF3273
 	.byte	0xd3
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x15052
+	.4byte	0x15235
 	.uleb128 0x80
 	.string	"p"
 	.byte	0xd3
 	.byte	0x9
-	.4byte	0x15021
+	.4byte	0x15204
 	.uleb128 0x81
 	.4byte	.LASF1001
 	.byte	0xd3
@@ -49842,12 +50183,12 @@ __exitcall_ebc_exit:
 	.byte	0xe
 	.2byte	0x11a
 	.byte	0x3
-	.4byte	0x15082
+	.4byte	0x15265
 	.uleb128 0x65
 	.string	"p"
 	.byte	0xe
 	.2byte	0x11a
-	.4byte	0x15082
+	.4byte	0x15265
 	.uleb128 0x65
 	.string	"res"
 	.byte	0xe
@@ -49861,250 +50202,250 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x15027
+	.4byte	0x1520a
 	.uleb128 0x86
-	.4byte	0x103dd
+	.4byte	0x103e9
 	.8byte	.LFB2847
 	.8byte	.LFE2847-.LFB2847
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x150b5
+	.4byte	0x15298
 	.uleb128 0x70
-	.4byte	0x103ee
+	.4byte	0x103fa
 	.4byte	.LLST10
 	.uleb128 0x72
-	.4byte	0x103fa
+	.4byte	0x10406
 	.uleb128 0x1
 	.byte	0x51
 	.byte	0
 	.uleb128 0x87
-	.4byte	0x12a26
+	.4byte	0x12c09
 	.8byte	.LFB2879
 	.8byte	.LFE2879-.LFB2879
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x151b8
+	.4byte	0x1539b
 	.uleb128 0x70
-	.4byte	0x12a33
-	.4byte	.LLST188
+	.4byte	0x12c16
+	.4byte	.LLST196
 	.uleb128 0x55
-	.4byte	0x12a3f
+	.4byte	0x12c22
 	.uleb128 0x58
-	.4byte	0x12a4b
+	.4byte	0x12c2e
 	.uleb128 0x5c
-	.4byte	0x146e0
-	.8byte	.LBB1474
-	.4byte	.Ldebug_ranges0+0xbf0
+	.4byte	0x148c3
+	.8byte	.LBB1536
+	.4byte	.Ldebug_ranges0+0xc90
 	.byte	0x1
 	.2byte	0x5c8
-	.4byte	0x15136
+	.4byte	0x15319
 	.uleb128 0x55
-	.4byte	0x14711
+	.4byte	0x148f4
 	.uleb128 0x55
-	.4byte	0x14705
+	.4byte	0x148e8
 	.uleb128 0x55
-	.4byte	0x146f9
+	.4byte	0x148dc
 	.uleb128 0x55
-	.4byte	0x146ed
+	.4byte	0x148d0
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xbf0
+	.4byte	.Ldebug_ranges0+0xc90
 	.uleb128 0x58
-	.4byte	0x1471d
+	.4byte	0x14900
 	.uleb128 0x60
-	.4byte	0x1472a
-	.8byte	.LBB1476
-	.4byte	.Ldebug_ranges0+0xc40
+	.4byte	0x1490d
+	.8byte	.LBB1538
+	.4byte	.Ldebug_ranges0+0xce0
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x55
-	.4byte	0x1473b
+	.4byte	0x1491e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14653
-	.8byte	.LBB1485
-	.4byte	.Ldebug_ranges0+0xc70
+	.4byte	0x14836
+	.8byte	.LBB1547
+	.4byte	.Ldebug_ranges0+0xd10
 	.byte	0x1
 	.2byte	0x5c9
-	.4byte	0x15168
+	.4byte	0x1534b
 	.uleb128 0x55
-	.4byte	0x14690
+	.4byte	0x14873
 	.uleb128 0x55
-	.4byte	0x14684
+	.4byte	0x14867
 	.uleb128 0x55
-	.4byte	0x14678
+	.4byte	0x1485b
 	.uleb128 0x55
-	.4byte	0x1466c
+	.4byte	0x1484f
 	.uleb128 0x55
-	.4byte	0x14660
+	.4byte	0x14843
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14621
-	.8byte	.LBB1491
-	.8byte	.LBE1491-.LBB1491
+	.4byte	0x14804
+	.8byte	.LBB1553
+	.8byte	.LBE1553-.LBB1553
 	.byte	0x1
 	.2byte	0x5ca
-	.4byte	0x15194
+	.4byte	0x15377
 	.uleb128 0x55
-	.4byte	0x14646
+	.4byte	0x14829
 	.uleb128 0x55
-	.4byte	0x1463a
+	.4byte	0x1481d
 	.uleb128 0x55
-	.4byte	0x1462e
+	.4byte	0x14811
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x145fb
-	.8byte	.LBB1493
-	.8byte	.LBE1493-.LBB1493
+	.4byte	0x147de
+	.8byte	.LBB1555
+	.8byte	.LBE1555-.LBB1555
 	.byte	0x1
 	.2byte	0x5cb
 	.uleb128 0x55
-	.4byte	0x14614
+	.4byte	0x147f7
 	.uleb128 0x55
-	.4byte	0x14608
+	.4byte	0x147eb
 	.byte	0
 	.byte	0
 	.uleb128 0x87
-	.4byte	0x144c7
+	.4byte	0x146aa
 	.8byte	.LFB2881
 	.8byte	.LFE2881-.LFB2881
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x15276
+	.4byte	0x15459
 	.uleb128 0x70
-	.4byte	0x144d7
-	.4byte	.LLST190
+	.4byte	0x146ba
+	.4byte	.LLST198
 	.uleb128 0x70
-	.4byte	0x144e3
-	.4byte	.LLST191
+	.4byte	0x146c6
+	.4byte	.LLST199
 	.uleb128 0x58
-	.4byte	0x144ef
+	.4byte	0x146d2
 	.uleb128 0x71
-	.4byte	0x1469d
-	.8byte	.LBB1504
-	.8byte	.LBE1504-.LBB1504
+	.4byte	0x14880
+	.8byte	.LBB1566
+	.8byte	.LBE1566-.LBB1566
 	.byte	0x1
 	.byte	0xc9
-	.4byte	0x1520c
+	.4byte	0x153ef
 	.uleb128 0x55
-	.4byte	0x146aa
+	.4byte	0x1488d
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14838
-	.8byte	.LBB1506
-	.8byte	.LBE1506-.LBB1506
+	.4byte	0x14a1b
+	.8byte	.LBB1568
+	.8byte	.LBE1568-.LBB1568
 	.byte	0x1
 	.byte	0xca
-	.4byte	0x1522d
+	.4byte	0x15410
 	.uleb128 0x55
-	.4byte	0x14845
+	.4byte	0x14a28
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14879
-	.8byte	.LBB1508
-	.8byte	.LBE1508-.LBB1508
+	.4byte	0x14a5c
+	.8byte	.LBB1570
+	.8byte	.LBE1570-.LBB1570
 	.byte	0x1
 	.byte	0xcd
-	.4byte	0x1525b
+	.4byte	0x1543e
 	.uleb128 0x55
-	.4byte	0x14886
+	.4byte	0x14a69
 	.uleb128 0x4f
-	.8byte	.LVL584
-	.4byte	0x1562c
+	.8byte	.LVL606
+	.4byte	0x1580f
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL581
-	.4byte	0x153a1
+	.8byte	.LVL603
+	.4byte	0x15584
 	.uleb128 0x4f
-	.8byte	.LVL585
-	.4byte	0x153a1
+	.8byte	.LVL607
+	.4byte	0x15584
 	.byte	0
 	.uleb128 0x86
-	.4byte	0x123a2
+	.4byte	0x12585
 	.8byte	.LFB2883
 	.8byte	.LFE2883-.LFB2883
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x152d7
+	.4byte	0x154ba
 	.uleb128 0x55
-	.4byte	0x123bf
+	.4byte	0x125a2
 	.uleb128 0x55
-	.4byte	0x123b3
+	.4byte	0x12596
 	.uleb128 0x55
-	.4byte	0x123b3
+	.4byte	0x12596
 	.uleb128 0x58
-	.4byte	0x123cb
+	.4byte	0x125ae
 	.uleb128 0x58
-	.4byte	0x123d5
+	.4byte	0x125b8
 	.uleb128 0x58
-	.4byte	0x123e1
+	.4byte	0x125c4
 	.uleb128 0x61
-	.4byte	0x123ed
-	.4byte	.LLST193
+	.4byte	0x125d0
+	.4byte	.LLST201
 	.uleb128 0x62
-	.4byte	0x123f9
+	.4byte	0x125dc
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x12405
-	.4byte	.LLST194
+	.4byte	0x125e8
+	.4byte	.LLST202
 	.uleb128 0x4f
-	.8byte	.LVL595
-	.4byte	0x156af
+	.8byte	.LVL617
+	.4byte	0x15892
 	.byte	0
 	.uleb128 0x87
-	.4byte	0x144c7
+	.4byte	0x146aa
 	.8byte	.LFB2887
 	.8byte	.LFE2887-.LFB2887
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x15389
+	.4byte	0x1556c
 	.uleb128 0x70
-	.4byte	0x144d7
-	.4byte	.LLST220
+	.4byte	0x146ba
+	.4byte	.LLST228
 	.uleb128 0x58
-	.4byte	0x144ef
+	.4byte	0x146d2
 	.uleb128 0x55
-	.4byte	0x144e3
+	.4byte	0x146c6
 	.uleb128 0x71
-	.4byte	0x14852
-	.8byte	.LBB1831
-	.8byte	.LBE1831-.LBB1831
+	.4byte	0x14a35
+	.8byte	.LBB1893
+	.8byte	.LBE1893-.LBB1893
 	.byte	0x1
 	.byte	0xc2
-	.4byte	0x15327
+	.4byte	0x1550a
 	.uleb128 0x55
-	.4byte	0x1485f
+	.4byte	0x14a42
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x146b7
-	.8byte	.LBB1833
-	.8byte	.LBE1833-.LBB1833
+	.4byte	0x1489a
+	.8byte	.LBB1895
+	.8byte	.LBE1895-.LBB1895
 	.byte	0x1
 	.byte	0xc3
-	.4byte	0x1534d
+	.4byte	0x15530
 	.uleb128 0x55
-	.4byte	0x146d3
+	.4byte	0x148b6
 	.uleb128 0x55
-	.4byte	0x146c7
+	.4byte	0x148aa
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14899
-	.8byte	.LBB1835
-	.8byte	.LBE1835-.LBB1835
+	.4byte	0x14a7c
+	.8byte	.LBB1897
+	.8byte	.LBE1897-.LBB1897
 	.byte	0x1
 	.byte	0xbf
-	.4byte	0x1537b
+	.4byte	0x1555e
 	.uleb128 0x55
-	.4byte	0x148a6
+	.4byte	0x14a89
 	.uleb128 0x4f
-	.8byte	.LVL787
-	.4byte	0x156bb
+	.8byte	.LVL809
+	.4byte	0x1589e
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL784
-	.4byte	0x153a1
+	.8byte	.LVL806
+	.4byte	0x15584
 	.byte	0
 	.uleb128 0x88
 	.4byte	.LASF3275
@@ -50404,7 +50745,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF3334
 	.4byte	.LASF3334
 	.byte	0xc4
-	.byte	0x6e
+	.byte	0x6f
 	.uleb128 0x88
 	.4byte	.LASF3335
 	.4byte	.LASF3335
@@ -52304,9 +52645,9 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST192:
-	.8byte	.LVL587
-	.8byte	.LVL588
+.LLST200:
+	.8byte	.LVL609
+	.8byte	.LVL610
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -52318,759 +52659,759 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST195:
-	.8byte	.LVL596
-	.8byte	.LVL597
+.LLST203:
+	.8byte	.LVL618
+	.8byte	.LVL619
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST196:
-	.8byte	.LVL600
-	.8byte	.LVL601
+.LLST204:
+	.8byte	.LVL622
+	.8byte	.LVL623
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL612
-	.8byte	.LVL613
+	.8byte	.LVL634
+	.8byte	.LVL635
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL744
-	.8byte	.LVL745
+	.8byte	.LVL766
+	.8byte	.LVL767
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST197:
-	.8byte	.LVL608
-	.8byte	.LVL609
+.LLST205:
+	.8byte	.LVL630
+	.8byte	.LVL631
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL657
-	.8byte	.LVL658
+	.8byte	.LVL679
+	.8byte	.LVL680
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST198:
-	.8byte	.LVL612
-	.8byte	.LVL614
+.LLST206:
+	.8byte	.LVL634
+	.8byte	.LVL636
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL621
-	.8byte	.LVL657
+	.8byte	.LVL643
+	.8byte	.LVL679
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL662
-	.8byte	.LVL744
+	.8byte	.LVL684
+	.8byte	.LVL766
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL745
-	.8byte	.LVL750
+	.8byte	.LVL767
+	.8byte	.LVL772
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL753
-	.8byte	.LVL764
+	.8byte	.LVL775
+	.8byte	.LVL786
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL766
+	.8byte	.LVL788
 	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST199:
-	.8byte	.LVL603
-	.8byte	.LVL615
+.LLST207:
+	.8byte	.LVL625
+	.8byte	.LVL637
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL619
-	.8byte	.LVL622
+	.8byte	.LVL641
+	.8byte	.LVL644
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL657
-	.8byte	.LVL662
+	.8byte	.LVL679
+	.8byte	.LVL684
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL751
-	.8byte	.LVL753
+	.8byte	.LVL773
+	.8byte	.LVL775
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL778
+	.8byte	.LVL800
 	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST200:
-	.8byte	.LVL603
-	.8byte	.LVL604
+.LLST208:
+	.8byte	.LVL625
+	.8byte	.LVL626
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL604
-	.8byte	.LVL605
+	.8byte	.LVL626
+	.8byte	.LVL627
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL606
-	.8byte	.LVL610
+	.8byte	.LVL628
+	.8byte	.LVL632
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL610
-	.8byte	.LVL660
+	.8byte	.LVL632
+	.8byte	.LVL682
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL660
-	.8byte	.LVL744
+	.8byte	.LVL682
+	.8byte	.LVL766
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL745
-	.8byte	.LVL750
+	.8byte	.LVL767
+	.8byte	.LVL772
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL751
-	.8byte	.LVL764
+	.8byte	.LVL773
+	.8byte	.LVL786
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL766
+	.8byte	.LVL788
 	.8byte	.LFE2862
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
 	.8byte	0
 	.8byte	0
-.LLST201:
-	.8byte	.LVL607
-	.8byte	.LVL614
+.LLST209:
+	.8byte	.LVL629
+	.8byte	.LVL636
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL619
-	.8byte	.LVL621
+	.8byte	.LVL641
+	.8byte	.LVL643
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL657
-	.8byte	.LVL662
+	.8byte	.LVL679
+	.8byte	.LVL684
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL778
+	.8byte	.LVL800
 	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST202:
-	.8byte	.LVL612
-	.8byte	.LVL617
+.LLST210:
+	.8byte	.LVL634
+	.8byte	.LVL639
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL643
-	.8byte	.LVL651
+	.8byte	.LVL665
+	.8byte	.LVL673
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL662
-	.8byte	.LVL665
+	.8byte	.LVL684
+	.8byte	.LVL687
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL757
-	.8byte	.LVL758
+	.8byte	.LVL779
+	.8byte	.LVL780
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL766
-	.8byte	.LVL767
+	.8byte	.LVL788
+	.8byte	.LVL789
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL778
+	.8byte	.LVL800
 	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST203:
-	.8byte	.LVL612
-	.8byte	.LVL617
+.LLST211:
+	.8byte	.LVL634
+	.8byte	.LVL639
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL651
-	.8byte	.LVL655
+	.8byte	.LVL673
+	.8byte	.LVL677
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL665
-	.8byte	.LVL666
+	.8byte	.LVL687
+	.8byte	.LVL688
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL767
-	.8byte	.LVL768
+	.8byte	.LVL789
+	.8byte	.LVL790
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL778
+	.8byte	.LVL800
 	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST204:
-	.8byte	.LVL666
-	.8byte	.LVL667-1
+.LLST212:
+	.8byte	.LVL688
+	.8byte	.LVL689-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST205:
-	.8byte	.LVL672
-	.8byte	.LVL675
+.LLST213:
+	.8byte	.LVL694
+	.8byte	.LVL697
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST206:
-	.8byte	.LVL673
-	.8byte	.LVL674
+.LLST214:
+	.8byte	.LVL695
+	.8byte	.LVL696
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST207:
-	.8byte	.LVL612
-	.8byte	.LVL616
+.LLST215:
+	.8byte	.LVL634
+	.8byte	.LVL638
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL677
-	.8byte	.LVL685
+	.8byte	.LVL699
+	.8byte	.LVL707
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL759
-	.8byte	.LVL761
+	.8byte	.LVL781
+	.8byte	.LVL783
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL761
-	.8byte	.LVL762
+	.8byte	.LVL783
+	.8byte	.LVL784
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL762
-	.8byte	.LVL764
+	.8byte	.LVL784
+	.8byte	.LVL786
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL778
+	.8byte	.LVL800
 	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST208:
-	.8byte	.LVL680
-	.8byte	.LVL683
+.LLST216:
+	.8byte	.LVL702
+	.8byte	.LVL705
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST209:
-	.8byte	.LVL681
-	.8byte	.LVL682
+.LLST217:
+	.8byte	.LVL703
+	.8byte	.LVL704
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST210:
-	.8byte	.LVL684
-	.8byte	.LVL686-1
+.LLST218:
+	.8byte	.LVL706
+	.8byte	.LVL708-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST211:
-	.8byte	.LVL612
-	.8byte	.LVL619
+.LLST219:
+	.8byte	.LVL634
+	.8byte	.LVL641
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL691
-	.8byte	.LVL729
+	.8byte	.LVL713
+	.8byte	.LVL751
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL729
-	.8byte	.LVL730
+	.8byte	.LVL751
+	.8byte	.LVL752
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL733
-	.8byte	.LVL744
+	.8byte	.LVL755
+	.8byte	.LVL766
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL745
-	.8byte	.LVL750
+	.8byte	.LVL767
+	.8byte	.LVL772
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL772
+	.8byte	.LVL794
 	.8byte	.LFE2862
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
 	.8byte	0
 	.8byte	0
-.LLST212:
-	.8byte	.LVL612
-	.8byte	.LVL619
+.LLST220:
+	.8byte	.LVL634
+	.8byte	.LVL641
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL691
-	.8byte	.LVL741
+	.8byte	.LVL713
+	.8byte	.LVL763
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL741
-	.8byte	.LVL742
+	.8byte	.LVL763
+	.8byte	.LVL764
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL745
-	.8byte	.LVL750
+	.8byte	.LVL767
+	.8byte	.LVL772
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL770
+	.8byte	.LVL792
 	.8byte	.LFE2862
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
 	.8byte	0
 	.8byte	0
-.LLST213:
-	.8byte	.LVL612
-	.8byte	.LVL616
+.LLST221:
+	.8byte	.LVL634
+	.8byte	.LVL638
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL697
-	.8byte	.LVL708
+	.8byte	.LVL719
+	.8byte	.LVL730
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL712
-	.8byte	.LVL723
+	.8byte	.LVL734
+	.8byte	.LVL745
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL733
-	.8byte	.LVL735
+	.8byte	.LVL755
+	.8byte	.LVL757
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL738
-	.8byte	.LVL744
+	.8byte	.LVL760
+	.8byte	.LVL766
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL771
-	.8byte	.LVL772
+	.8byte	.LVL793
+	.8byte	.LVL794
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL775
+	.8byte	.LVL797
 	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST214:
-	.8byte	.LVL612
-	.8byte	.LVL618
+.LLST222:
+	.8byte	.LVL634
+	.8byte	.LVL640
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL702
-	.8byte	.LVL725
+	.8byte	.LVL724
+	.8byte	.LVL747
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL732
-	.8byte	.LVL744
+	.8byte	.LVL754
+	.8byte	.LVL766
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL745
-	.8byte	.LVL750
+	.8byte	.LVL767
+	.8byte	.LVL772
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL775
+	.8byte	.LVL797
 	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST215:
-	.8byte	.LVL612
-	.8byte	.LVL617
+.LLST223:
+	.8byte	.LVL634
+	.8byte	.LVL639
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL693
-	.8byte	.LVL699
+	.8byte	.LVL715
+	.8byte	.LVL721
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL700
-	.8byte	.LVL703
+	.8byte	.LVL722
+	.8byte	.LVL725
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL712
-	.8byte	.LVL723
+	.8byte	.LVL734
+	.8byte	.LVL745
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL725
-	.8byte	.LVL733
+	.8byte	.LVL747
+	.8byte	.LVL755
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL770
-	.8byte	.LVL775
+	.8byte	.LVL792
+	.8byte	.LVL797
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL778
+	.8byte	.LVL800
 	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST216:
-	.8byte	.LVL612
-	.8byte	.LVL618
+.LLST224:
+	.8byte	.LVL634
+	.8byte	.LVL640
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL695
-	.8byte	.LVL702
+	.8byte	.LVL717
+	.8byte	.LVL724
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL704
-	.8byte	.LVL732
+	.8byte	.LVL726
+	.8byte	.LVL754
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL745
-	.8byte	.LVL750
+	.8byte	.LVL767
+	.8byte	.LVL772
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL770
-	.8byte	.LVL775
+	.8byte	.LVL792
+	.8byte	.LVL797
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL778
+	.8byte	.LVL800
 	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST217:
-	.8byte	.LVL612
-	.8byte	.LVL618
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL698
-	.8byte	.LVL725
+.LLST225:
+	.8byte	.LVL634
+	.8byte	.LVL640
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL728
-	.8byte	.LVL744
+	.8byte	.LVL720
+	.8byte	.LVL747
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL745
 	.8byte	.LVL750
+	.8byte	.LVL766
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL770
+	.8byte	.LVL767
 	.8byte	.LVL772
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL772
-	.8byte	.LVL773
+	.8byte	.LVL792
+	.8byte	.LVL794
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL794
+	.8byte	.LVL795
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL773
+	.8byte	.LVL795
 	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x6b
 	.8byte	0
 	.8byte	0
-.LLST218:
-	.8byte	.LVL612
-	.8byte	.LVL617
+.LLST226:
+	.8byte	.LVL634
+	.8byte	.LVL639
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL699
-	.8byte	.LVL725
+	.8byte	.LVL721
+	.8byte	.LVL747
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL733
-	.8byte	.LVL744
+	.8byte	.LVL755
+	.8byte	.LVL766
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL745
-	.8byte	.LVL750
+	.8byte	.LVL767
+	.8byte	.LVL772
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL775
-	.8byte	.LVL776
+	.8byte	.LVL797
+	.8byte	.LVL798
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL776
+	.8byte	.LVL798
 	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST219:
-	.8byte	.LVL612
-	.8byte	.LVL616
+.LLST227:
+	.8byte	.LVL634
+	.8byte	.LVL638
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL708
-	.8byte	.LVL725
+	.8byte	.LVL730
+	.8byte	.LVL747
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL745
-	.8byte	.LVL747
+	.8byte	.LVL767
+	.8byte	.LVL769
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL778
+	.8byte	.LVL800
 	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST78:
-	.8byte	.LVL307
-	.8byte	.LVL308
+.LLST86:
+	.8byte	.LVL329
+	.8byte	.LVL330
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST79:
-	.8byte	.LVL307
-	.8byte	.LVL309-1
+.LLST87:
+	.8byte	.LVL329
+	.8byte	.LVL331-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST80:
-	.8byte	.LVL307
-	.8byte	.LVL309-1
+.LLST88:
+	.8byte	.LVL329
+	.8byte	.LVL331-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST81:
-	.8byte	.LVL310
-	.8byte	.LVL311
+.LLST89:
+	.8byte	.LVL332
+	.8byte	.LVL333
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST82:
-	.8byte	.LVL310
-	.8byte	.LVL312
+.LLST90:
+	.8byte	.LVL332
+	.8byte	.LVL334
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST83:
-	.8byte	.LVL310
-	.8byte	.LVL313
+.LLST91:
+	.8byte	.LVL332
+	.8byte	.LVL335
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL313
-	.8byte	.LVL314-1
+	.8byte	.LVL335
+	.8byte	.LVL336-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST84:
-	.8byte	.LVL315
-	.8byte	.LVL316
+.LLST92:
+	.8byte	.LVL337
+	.8byte	.LVL338
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST85:
-	.8byte	.LVL315
-	.8byte	.LVL317
+.LLST93:
+	.8byte	.LVL337
+	.8byte	.LVL339
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST86:
-	.8byte	.LVL315
-	.8byte	.LVL318
+.LLST94:
+	.8byte	.LVL337
+	.8byte	.LVL340
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL318
-	.8byte	.LVL319-1
+	.8byte	.LVL340
+	.8byte	.LVL341-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST96:
-	.8byte	.LVL340
-	.8byte	.LVL341
+.LLST104:
+	.8byte	.LVL362
+	.8byte	.LVL363
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST97:
-	.8byte	.LVL340
-	.8byte	.LVL342
+.LLST105:
+	.8byte	.LVL362
+	.8byte	.LVL364
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST98:
-	.8byte	.LVL340
-	.8byte	.LVL344
+.LLST106:
+	.8byte	.LVL362
+	.8byte	.LVL366
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL344
-	.8byte	.LVL349
+	.8byte	.LVL366
+	.8byte	.LVL371
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL350
+	.8byte	.LVL372
 	.8byte	.LFE2852
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST99:
-	.8byte	.LVL340
-	.8byte	.LVL345-1
+.LLST107:
+	.8byte	.LVL362
+	.8byte	.LVL367-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL345-1
-	.8byte	.LVL348
+	.8byte	.LVL367-1
+	.8byte	.LVL370
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL350
-	.8byte	.LVL351
+	.8byte	.LVL372
+	.8byte	.LVL373
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL353
-	.8byte	.LVL354
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST100:
-	.8byte	.LVL343
-	.8byte	.LVL349
+.LLST108:
+	.8byte	.LVL365
+	.8byte	.LVL371
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL350
+	.8byte	.LVL372
 	.8byte	.LFE2852
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST101:
-	.8byte	.LVL346
-	.8byte	.LVL350
+.LLST109:
+	.8byte	.LVL368
+	.8byte	.LVL372
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
-	.8byte	.LVL353
+	.8byte	.LVL375
 	.8byte	.LFE2852
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
 	.8byte	0
 	.8byte	0
-.LLST87:
-	.8byte	.LVL320
-	.8byte	.LVL321
+.LLST95:
+	.8byte	.LVL342
+	.8byte	.LVL343
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST88:
-	.8byte	.LVL320
-	.8byte	.LVL322
+.LLST96:
+	.8byte	.LVL342
+	.8byte	.LVL344
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST89:
-	.8byte	.LVL320
-	.8byte	.LVL323-1
+.LLST97:
+	.8byte	.LVL342
+	.8byte	.LVL345-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL323-1
-	.8byte	.LVL325
+	.8byte	.LVL345-1
+	.8byte	.LVL347
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST90:
-	.8byte	.LVL326
-	.8byte	.LVL327
+.LLST98:
+	.8byte	.LVL348
+	.8byte	.LVL349
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST91:
-	.8byte	.LVL326
-	.8byte	.LVL328
+.LLST99:
+	.8byte	.LVL348
+	.8byte	.LVL350
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST92:
-	.8byte	.LVL326
-	.8byte	.LVL329
+.LLST100:
+	.8byte	.LVL348
+	.8byte	.LVL351
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL329
-	.8byte	.LVL332
+	.8byte	.LVL351
+	.8byte	.LVL354
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL333
+	.8byte	.LVL355
 	.8byte	.LFE2850
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST93:
-	.8byte	.LVL335
-	.8byte	.LVL336
+.LLST101:
+	.8byte	.LVL357
+	.8byte	.LVL358
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST94:
-	.8byte	.LVL335
-	.8byte	.LVL337
+.LLST102:
+	.8byte	.LVL357
+	.8byte	.LVL359
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST95:
-	.8byte	.LVL335
-	.8byte	.LVL338
+.LLST103:
+	.8byte	.LVL357
+	.8byte	.LVL360
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL338
-	.8byte	.LVL339-1
+	.8byte	.LVL360
+	.8byte	.LVL361-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST102:
-	.8byte	.LVL357
-	.8byte	.LVL358-1
+.LLST110:
+	.8byte	.LVL379
+	.8byte	.LVL380-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST103:
-	.8byte	.LVL357
-	.8byte	.LVL358-1
+.LLST111:
+	.8byte	.LVL379
+	.8byte	.LVL380-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST104:
-	.8byte	.LVL357
-	.8byte	.LVL358-1
+.LLST112:
+	.8byte	.LVL379
+	.8byte	.LVL380-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL358-1
-	.8byte	.LVL360
+	.8byte	.LVL380-1
+	.8byte	.LVL382
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -53127,48 +53468,48 @@ __exitcall_ebc_exit:
 	.8byte	.LVL103
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL108
-	.8byte	.LVL110
+	.8byte	.LVL109
+	.8byte	.LVL111
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL130
-	.8byte	.LVL131-1
+	.8byte	.LVL131
+	.8byte	.LVL132-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL132
-	.8byte	.LVL134
+	.8byte	.LVL133
+	.8byte	.LVL135
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL156
-	.8byte	.LVL157-1
+	.8byte	.LVL157
+	.8byte	.LVL158-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL172
-	.8byte	.LVL174
+	.8byte	.LVL173
+	.8byte	.LVL175
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL186
 	.8byte	.LVL187
+	.8byte	.LVL188
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL189
-	.8byte	.LVL190-1
+	.8byte	.LVL190
+	.8byte	.LVL191-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL191
-	.8byte	.LVL192-1
+	.8byte	.LVL192
+	.8byte	.LVL193-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL197
 	.8byte	.LVL198
+	.8byte	.LVL199
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL208
 	.8byte	.LVL209
+	.8byte	.LVL210
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL211
-	.8byte	.LVL212-1
+	.8byte	.LVL212
+	.8byte	.LVL214
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
@@ -53181,19 +53522,19 @@ __exitcall_ebc_exit:
 	.8byte	.LVL99
 	.8byte	.LVL107
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL108
-	.8byte	.LVL123
+	.byte	0x64
+	.8byte	.LVL109
+	.8byte	.LVL124
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL129
-	.8byte	.LVL254
+	.byte	0x64
+	.8byte	.LVL130
+	.8byte	.LVL275
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL256
+	.byte	0x64
+	.8byte	.LVL277
 	.8byte	.LFE2843
 	.2byte	0x1
-	.byte	0x65
+	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST35:
@@ -53201,12 +53542,12 @@ __exitcall_ebc_exit:
 	.8byte	.LVL105
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL126
-	.8byte	.LVL127-1
+	.8byte	.LVL127
+	.8byte	.LVL128-1
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL129
 	.8byte	.LVL130
+	.8byte	.LVL131
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -53227,8 +53568,8 @@ __exitcall_ebc_exit:
 	.8byte	.LVL97
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL148
-	.8byte	.LVL150
+	.8byte	.LVL149
+	.8byte	.LVL151
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -53238,8 +53579,8 @@ __exitcall_ebc_exit:
 	.8byte	.LVL98-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL148
 	.8byte	.LVL149
+	.8byte	.LVL150
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
@@ -53253,44 +53594,44 @@ __exitcall_ebc_exit:
 	.8byte	.LVL98-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL148
-	.8byte	.LVL152
+	.8byte	.LVL149
+	.8byte	.LVL153
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST25:
-	.8byte	.LVL153
-	.8byte	.LVL155-1
+	.8byte	.LVL154
+	.8byte	.LVL156-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST26:
-	.8byte	.LVL151
-	.8byte	.LVL154
+	.8byte	.LVL152
+	.8byte	.LVL155
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST27:
-	.8byte	.LVL150
-	.8byte	.LVL153
+	.8byte	.LVL151
+	.8byte	.LVL154
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST28:
-	.8byte	.LVL111
 	.8byte	.LVL112
+	.8byte	.LVL113
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL113
 	.8byte	.LVL114
+	.8byte	.LVL115
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL225
-	.8byte	.LVL226
+	.8byte	.LVL246
+	.8byte	.LVL247
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -53300,12 +53641,12 @@ __exitcall_ebc_exit:
 	.8byte	.LVL105
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL113
-	.8byte	.LVL115
+	.8byte	.LVL114
+	.8byte	.LVL116
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL253
-	.8byte	.LVL254
+	.8byte	.LVL266
+	.8byte	.LVL267
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -53315,63 +53656,63 @@ __exitcall_ebc_exit:
 	.8byte	.LVL106
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL110
-	.8byte	.LVL116
+	.8byte	.LVL111
+	.8byte	.LVL117
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL224
-	.8byte	.LVL226
+	.8byte	.LVL245
+	.8byte	.LVL247
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL253
-	.8byte	.LVL254
+	.8byte	.LVL266
+	.8byte	.LVL267
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST31:
-	.8byte	.LVL109
-	.8byte	.LVL112
+	.8byte	.LVL110
+	.8byte	.LVL113
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL224
-	.8byte	.LVL225
+	.8byte	.LVL245
+	.8byte	.LVL246
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST32:
-	.8byte	.LVL118
-	.8byte	.LVL120-1
+	.8byte	.LVL119
+	.8byte	.LVL121-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST33:
-	.8byte	.LVL117
-	.8byte	.LVL119
+	.8byte	.LVL118
+	.8byte	.LVL120
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST34:
-	.8byte	.LVL116
-	.8byte	.LVL118
+	.8byte	.LVL117
+	.8byte	.LVL119
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST36:
-	.8byte	.LVL135
 	.8byte	.LVL136
+	.8byte	.LVL137
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL137
 	.8byte	.LVL138
+	.8byte	.LVL139
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL223
-	.8byte	.LVL224
+	.8byte	.LVL239
+	.8byte	.LVL240
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -53381,12 +53722,12 @@ __exitcall_ebc_exit:
 	.8byte	.LVL105
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL137
-	.8byte	.LVL139
+	.8byte	.LVL138
+	.8byte	.LVL140
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL253
-	.8byte	.LVL254
+	.8byte	.LVL266
+	.8byte	.LVL267
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -53396,63 +53737,63 @@ __exitcall_ebc_exit:
 	.8byte	.LVL106
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL134
-	.8byte	.LVL140
+	.8byte	.LVL135
+	.8byte	.LVL141
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL222
-	.8byte	.LVL224
+	.8byte	.LVL238
+	.8byte	.LVL240
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL253
-	.8byte	.LVL254
+	.8byte	.LVL266
+	.8byte	.LVL267
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST39:
-	.8byte	.LVL133
-	.8byte	.LVL136
+	.8byte	.LVL134
+	.8byte	.LVL137
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL222
-	.8byte	.LVL223
+	.8byte	.LVL238
+	.8byte	.LVL239
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST40:
-	.8byte	.LVL142
-	.8byte	.LVL144-1
+	.8byte	.LVL143
+	.8byte	.LVL145-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST41:
-	.8byte	.LVL141
-	.8byte	.LVL143
+	.8byte	.LVL142
+	.8byte	.LVL144
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST42:
-	.8byte	.LVL140
-	.8byte	.LVL142
+	.8byte	.LVL141
+	.8byte	.LVL143
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST43:
-	.8byte	.LVL161
 	.8byte	.LVL162
+	.8byte	.LVL163
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL163
 	.8byte	.LVL164
+	.8byte	.LVL165
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL236
-	.8byte	.LVL237
+	.8byte	.LVL251
+	.8byte	.LVL252
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -53462,8 +53803,8 @@ __exitcall_ebc_exit:
 	.8byte	.LVL105
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL163
-	.8byte	.LVL166
+	.8byte	.LVL164
+	.8byte	.LVL167
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -53473,12 +53814,12 @@ __exitcall_ebc_exit:
 	.8byte	.LVL106
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL160
-	.8byte	.LVL165
+	.8byte	.LVL161
+	.8byte	.LVL166
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL234
-	.8byte	.LVL237
+	.8byte	.LVL249
+	.8byte	.LVL252
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
@@ -53488,129 +53829,129 @@ __exitcall_ebc_exit:
 	.8byte	.LVL106
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL159
-	.8byte	.LVL168
+	.8byte	.LVL160
+	.8byte	.LVL169
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL234
-	.8byte	.LVL235
+	.8byte	.LVL249
+	.8byte	.LVL250
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST47:
-	.8byte	.LVL169
-	.8byte	.LVL171-1
+	.8byte	.LVL170
+	.8byte	.LVL172-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST48:
-	.8byte	.LVL167
-	.8byte	.LVL170
+	.8byte	.LVL168
+	.8byte	.LVL171
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST49:
-	.8byte	.LVL166
-	.8byte	.LVL169
+	.8byte	.LVL167
+	.8byte	.LVL170
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST50:
-	.8byte	.LVL183
 	.8byte	.LVL184
+	.8byte	.LVL185
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL258
-	.8byte	.LVL260
+	.8byte	.LVL279
+	.8byte	.LVL281
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL263
+	.8byte	.LVL285
 	.8byte	.LFE2843
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST51:
-	.8byte	.LVL175
 	.8byte	.LVL176
+	.8byte	.LVL177
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL177
 	.8byte	.LVL178
+	.8byte	.LVL179
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL230
-	.8byte	.LVL231
+	.8byte	.LVL248
+	.8byte	.LVL249
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST52:
-	.8byte	.LVL177
-	.8byte	.LVL183-1
+	.8byte	.LVL178
+	.8byte	.LVL184-1
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL257
-	.8byte	.LVL258
+	.8byte	.LVL278
+	.8byte	.LVL279
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL258
-	.8byte	.LVL261-1
+	.8byte	.LVL279
+	.8byte	.LVL282-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL264
+	.8byte	.LVL286
 	.8byte	.LFE2843
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST53:
-	.8byte	.LVL174
-	.8byte	.LVL179
+	.8byte	.LVL175
+	.8byte	.LVL180
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL229
-	.8byte	.LVL231
+	.8byte	.LVL247
+	.8byte	.LVL249
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL257
-	.8byte	.LVL259
+	.8byte	.LVL278
+	.8byte	.LVL280
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST54:
-	.8byte	.LVL173
-	.8byte	.LVL176
+	.8byte	.LVL174
+	.8byte	.LVL177
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL229
-	.8byte	.LVL230
+	.8byte	.LVL247
+	.8byte	.LVL248
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST55:
-	.8byte	.LVL181
-	.8byte	.LVL183-1
+	.8byte	.LVL182
+	.8byte	.LVL184-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST56:
-	.8byte	.LVL180
-	.8byte	.LVL182
+	.8byte	.LVL181
+	.8byte	.LVL183
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST57:
-	.8byte	.LVL179
-	.8byte	.LVL181
+	.8byte	.LVL180
+	.8byte	.LVL182
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
@@ -53620,8 +53961,8 @@ __exitcall_ebc_exit:
 	.8byte	.LVL96
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL196
 	.8byte	.LVL197
+	.8byte	.LVL198
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
@@ -53635,173 +53976,277 @@ __exitcall_ebc_exit:
 	.8byte	.LVL98-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL148
-	.8byte	.LVL152
+	.8byte	.LVL149
+	.8byte	.LVL153
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL195
-	.8byte	.LVL197
+	.8byte	.LVL196
+	.8byte	.LVL198
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST60:
-	.8byte	.LVL201
 	.8byte	.LVL202
+	.8byte	.LVL203
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL203
 	.8byte	.LVL204
+	.8byte	.LVL205
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL228
-	.8byte	.LVL229
+	.8byte	.LVL244
+	.8byte	.LVL245
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST61:
-	.8byte	.LVL203
-	.8byte	.LVL205
+	.8byte	.LVL204
+	.8byte	.LVL206
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL237
-	.8byte	.LVL239
+	.8byte	.LVL267
+	.8byte	.LVL269
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST62:
+	.8byte	.LVL201
+	.8byte	.LVL207
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL242
+	.8byte	.LVL245
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL267
+	.8byte	.LVL268
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST63:
+	.8byte	.LVL200
+	.8byte	.LVL208-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL242
+	.8byte	.LVL243
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL267
+	.8byte	.LVL271
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST64:
+	.8byte	.LVL272
+	.8byte	.LVL274-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST65:
+	.8byte	.LVL270
+	.8byte	.LVL273
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST66:
+	.8byte	.LVL269
+	.8byte	.LVL272
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST67:
+	.8byte	.LVL104
+	.8byte	.LVL108
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL225
+	.8byte	.LVL227
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL263
+	.8byte	.LVL264
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL264
+	.8byte	.LVL267
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL277
+	.8byte	.LVL278
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL284
+	.8byte	.LVL285
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST68:
+	.8byte	.LVL215
+	.8byte	.LVL216
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL217
+	.8byte	.LVL218
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL241
+	.8byte	.LVL242
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST69:
+	.8byte	.LVL104
+	.8byte	.LVL105
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL217
+	.8byte	.LVL219
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL266
+	.8byte	.LVL267
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST62:
-	.8byte	.LVL200
-	.8byte	.LVL206
+.LLST70:
+	.8byte	.LVL104
+	.8byte	.LVL106
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL226
-	.8byte	.LVL229
+	.8byte	.LVL214
+	.8byte	.LVL222
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL237
-	.8byte	.LVL238
+	.8byte	.LVL240
+	.8byte	.LVL242
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL266
+	.8byte	.LVL267
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST63:
-	.8byte	.LVL199
-	.8byte	.LVL207-1
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL226
-	.8byte	.LVL227
+.LLST71:
+	.8byte	.LVL213
+	.8byte	.LVL216
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL237
+	.byte	0x50
+	.8byte	.LVL240
 	.8byte	.LVL241
 	.2byte	0x1
-	.byte	0x52
-	.8byte	0
-	.8byte	0
-.LLST64:
-	.8byte	.LVL242
-	.8byte	.LVL244-1
-	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST65:
-	.8byte	.LVL240
-	.8byte	.LVL243
+.LLST72:
+	.8byte	.LVL222
+	.8byte	.LVL224-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST66:
-	.8byte	.LVL239
-	.8byte	.LVL242
+.LLST73:
+	.8byte	.LVL220
+	.8byte	.LVL223
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST67:
-	.8byte	.LVL216
-	.8byte	.LVL217
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL218
+.LLST74:
 	.8byte	.LVL219
+	.8byte	.LVL221
 	.2byte	0x1
 	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST75:
+	.8byte	.LVL231
 	.8byte	.LVL233
-	.8byte	.LVL234
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL254
+	.8byte	.LVL255
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST68:
-	.8byte	.LVL218
-	.8byte	.LVL220
+.LLST76:
+	.8byte	.LVL232
+	.8byte	.LVL235
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL245
-	.8byte	.LVL247
+	.8byte	.LVL255
+	.8byte	.LVL256
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST69:
-	.8byte	.LVL215
-	.8byte	.LVL221-1
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL231
-	.8byte	.LVL234
+.LLST77:
+	.8byte	.LVL230
+	.8byte	.LVL237-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL245
-	.8byte	.LVL246
+	.8byte	.LVL252
+	.8byte	.LVL258
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST70:
-	.8byte	.LVL214
-	.8byte	.LVL221-1
+.LLST78:
+	.8byte	.LVL229
+	.8byte	.LVL237-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL231
-	.8byte	.LVL232
+	.8byte	.LVL252
+	.8byte	.LVL253
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL245
-	.8byte	.LVL249
+	.8byte	.LVL255
+	.8byte	.LVL260
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST71:
-	.8byte	.LVL250
-	.8byte	.LVL252-1
+.LLST79:
+	.8byte	.LVL259
+	.8byte	.LVL261-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST72:
-	.8byte	.LVL248
-	.8byte	.LVL251
+.LLST80:
+	.8byte	.LVL256
+	.8byte	.LVL259
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST73:
-	.8byte	.LVL247
-	.8byte	.LVL250
+.LLST81:
+	.8byte	.LVL234
+	.8byte	.LVL236
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x66
+	.8byte	.LVL257
+	.8byte	.LVL262
+	.2byte	0x1
+	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST74:
-	.8byte	.LVL275
-	.8byte	.LVL276-1
+.LLST82:
+	.8byte	.LVL297
+	.8byte	.LVL298-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -53813,1777 +54258,1777 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST239:
-	.8byte	.LVL874
-	.8byte	.LVL875
+.LLST247:
+	.8byte	.LVL896
+	.8byte	.LVL897
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST240:
-	.8byte	.LVL876
-	.8byte	.LVL886
+.LLST248:
+	.8byte	.LVL898
+	.8byte	.LVL908
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL889
+	.8byte	.LVL911
 	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST241:
-	.8byte	.LVL877
-	.8byte	.LVL888
+.LLST249:
+	.8byte	.LVL899
+	.8byte	.LVL910
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL889
-	.8byte	.LVL890
+	.8byte	.LVL911
+	.8byte	.LVL912
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL890
-	.8byte	.LVL891
+	.8byte	.LVL912
+	.8byte	.LVL913
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL891
-	.8byte	.LVL893
+	.8byte	.LVL913
+	.8byte	.LVL915
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL893
-	.8byte	.LVL954
+	.8byte	.LVL915
+	.8byte	.LVL976
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL954
-	.8byte	.LVL955
+	.8byte	.LVL976
+	.8byte	.LVL977
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL955
-	.8byte	.LVL975
+	.8byte	.LVL977
+	.8byte	.LVL997
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL975
-	.8byte	.LVL976
+	.8byte	.LVL997
+	.8byte	.LVL998
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL976
-	.8byte	.LVL1022
+	.8byte	.LVL998
+	.8byte	.LVL1044
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL1022
-	.8byte	.LVL1023
+	.8byte	.LVL1044
+	.8byte	.LVL1045
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1023
+	.8byte	.LVL1045
 	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST242:
-	.8byte	.LVL897
-	.8byte	.LVL901-1
+.LLST250:
+	.8byte	.LVL919
+	.8byte	.LVL923-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL931
-	.8byte	.LVL932
+	.8byte	.LVL953
+	.8byte	.LVL954
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL972
-	.8byte	.LVL974-1
+	.8byte	.LVL994
+	.8byte	.LVL996-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL994
-	.8byte	.LVL998-1
+	.8byte	.LVL1016
+	.8byte	.LVL1020-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST243:
-	.8byte	.LVL899
-	.8byte	.LVL900
+.LLST251:
+	.8byte	.LVL921
+	.8byte	.LVL922
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL973
-	.8byte	.LVL974-1
+	.8byte	.LVL995
+	.8byte	.LVL996-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST244:
-	.8byte	.LVL877
-	.8byte	.LVL888
+.LLST252:
+	.8byte	.LVL899
+	.8byte	.LVL910
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL889
-	.8byte	.LVL914
+	.8byte	.LVL911
+	.8byte	.LVL936
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL918
-	.8byte	.LVL921
+	.8byte	.LVL940
+	.8byte	.LVL943
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL925
-	.8byte	.LVL1001
+	.8byte	.LVL947
+	.8byte	.LVL1023
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1006
-	.8byte	.LVL1010
+	.8byte	.LVL1028
+	.8byte	.LVL1032
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1011
-	.8byte	.LVL1029
+	.8byte	.LVL1033
+	.8byte	.LVL1051
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1035
+	.8byte	.LVL1057
 	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST263:
-	.8byte	.LVL991
-	.8byte	.LVL992
+.LLST271:
+	.8byte	.LVL1013
+	.8byte	.LVL1014
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1031
-	.8byte	.LVL1032-1
+	.8byte	.LVL1053
+	.8byte	.LVL1054-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST262:
-	.8byte	.LVL965
-	.8byte	.LVL966
+.LLST270:
+	.8byte	.LVL987
+	.8byte	.LVL988
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1018
-	.8byte	.LVL1019-1
+	.8byte	.LVL1040
+	.8byte	.LVL1041-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST245:
-	.8byte	.LVL877
-	.8byte	.LVL879
+.LLST253:
+	.8byte	.LVL899
+	.8byte	.LVL901
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL885
-	.8byte	.LVL887
+	.8byte	.LVL907
+	.8byte	.LVL909
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL889
-	.8byte	.LVL892
+	.8byte	.LVL911
+	.8byte	.LVL914
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL933
-	.8byte	.LVL954
+	.8byte	.LVL955
+	.8byte	.LVL976
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL1037
-	.8byte	.LVL1047
+	.8byte	.LVL1059
+	.8byte	.LVL1069
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL1057
+	.8byte	.LVL1079
 	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST246:
-	.8byte	.LVL939
-	.8byte	.LVL940
+.LLST254:
+	.8byte	.LVL961
+	.8byte	.LVL962
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL945
-	.8byte	.LVL946
+	.8byte	.LVL967
+	.8byte	.LVL968
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST247:
-	.8byte	.LVL937
-	.8byte	.LVL938
+.LLST255:
+	.8byte	.LVL959
+	.8byte	.LVL960
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL943
-	.8byte	.LVL944
+	.8byte	.LVL965
+	.8byte	.LVL966
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST266:
-	.8byte	.LVL1041
-	.8byte	.LVL1042-1
+.LLST274:
+	.8byte	.LVL1063
+	.8byte	.LVL1064-1
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1045
-	.8byte	.LVL1046
+	.8byte	.LVL1067
+	.8byte	.LVL1068
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST261:
-	.8byte	.LVL948
-	.8byte	.LVL949-1
+.LLST269:
+	.8byte	.LVL970
+	.8byte	.LVL971-1
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL951
-	.8byte	.LVL952
+	.8byte	.LVL973
+	.8byte	.LVL974
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST248:
-	.8byte	.LVL995
-	.8byte	.LVL996
+.LLST256:
+	.8byte	.LVL1017
+	.8byte	.LVL1018
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL996
-	.8byte	.LVL997
+	.8byte	.LVL1018
+	.8byte	.LVL1019
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST249:
-	.8byte	.LVL906
-	.8byte	.LVL907-1
+.LLST257:
+	.8byte	.LVL928
+	.8byte	.LVL929-1
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST250:
-	.8byte	.LVL903
-	.8byte	.LVL904-1
+.LLST258:
+	.8byte	.LVL925
+	.8byte	.LVL926-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL909
-	.8byte	.LVL925
+	.8byte	.LVL931
+	.8byte	.LVL947
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL968
-	.8byte	.LVL970-1
+	.8byte	.LVL990
+	.8byte	.LVL992-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL1001
-	.8byte	.LVL1007-1
+	.8byte	.LVL1023
+	.8byte	.LVL1029-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL1010
-	.8byte	.LVL1012-1
+	.8byte	.LVL1032
+	.8byte	.LVL1034-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL1026
-	.8byte	.LVL1027-1
+	.8byte	.LVL1048
+	.8byte	.LVL1049-1
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST251:
-	.8byte	.LVL914
-	.8byte	.LVL917
+.LLST259:
+	.8byte	.LVL936
+	.8byte	.LVL939
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL922
-	.8byte	.LVL925
+	.8byte	.LVL944
+	.8byte	.LVL947
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1001
-	.8byte	.LVL1004
+	.8byte	.LVL1023
+	.8byte	.LVL1026
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1010
-	.8byte	.LVL1011
+	.8byte	.LVL1032
+	.8byte	.LVL1033
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST252:
-	.8byte	.LVL877
-	.8byte	.LVL888
+.LLST260:
+	.8byte	.LVL899
+	.8byte	.LVL910
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL889
-	.8byte	.LVL898
+	.8byte	.LVL911
+	.8byte	.LVL920
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL903
-	.8byte	.LVL914
+	.8byte	.LVL925
+	.8byte	.LVL936
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL916
-	.8byte	.LVL921
+	.8byte	.LVL938
+	.8byte	.LVL943
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL925
-	.8byte	.LVL961
+	.8byte	.LVL947
+	.8byte	.LVL983
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL968
-	.8byte	.LVL972
+	.8byte	.LVL990
+	.8byte	.LVL994
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL975
-	.8byte	.LVL994
+	.8byte	.LVL997
+	.8byte	.LVL1016
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL999
-	.8byte	.LVL1001
+	.8byte	.LVL1021
+	.8byte	.LVL1023
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1003
-	.8byte	.LVL1010
+	.8byte	.LVL1025
+	.8byte	.LVL1032
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1011
-	.8byte	.LVL1016
+	.8byte	.LVL1033
+	.8byte	.LVL1038
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1022
-	.8byte	.LVL1029
+	.8byte	.LVL1044
+	.8byte	.LVL1051
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1035
+	.8byte	.LVL1057
 	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST253:
-	.8byte	.LVL903
-	.8byte	.LVL904-1
+.LLST261:
+	.8byte	.LVL925
+	.8byte	.LVL926-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL913
-	.8byte	.LVL915
+	.8byte	.LVL935
+	.8byte	.LVL937
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL916
-	.8byte	.LVL925
+	.8byte	.LVL938
+	.8byte	.LVL947
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL968
-	.8byte	.LVL970-1
+	.8byte	.LVL990
+	.8byte	.LVL992-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL1001
-	.8byte	.LVL1002
+	.8byte	.LVL1023
+	.8byte	.LVL1024
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL1006
-	.8byte	.LVL1007-1
+	.8byte	.LVL1028
+	.8byte	.LVL1029-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL1010
-	.8byte	.LVL1012-1
+	.8byte	.LVL1032
+	.8byte	.LVL1034-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL1026
-	.8byte	.LVL1027-1
+	.8byte	.LVL1048
+	.8byte	.LVL1049-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST254:
-	.8byte	.LVL903
-	.8byte	.LVL904-1
+.LLST262:
+	.8byte	.LVL925
+	.8byte	.LVL926-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL913
-	.8byte	.LVL923
+	.8byte	.LVL935
+	.8byte	.LVL945
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL924
-	.8byte	.LVL925
+	.8byte	.LVL946
+	.8byte	.LVL947
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL968
-	.8byte	.LVL970-1
+	.8byte	.LVL990
+	.8byte	.LVL992-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL1001
-	.8byte	.LVL1007-1
+	.8byte	.LVL1023
+	.8byte	.LVL1029-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL1010
-	.8byte	.LVL1012-1
+	.8byte	.LVL1032
+	.8byte	.LVL1034-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL1026
-	.8byte	.LVL1027-1
+	.8byte	.LVL1048
+	.8byte	.LVL1049-1
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST255:
-	.8byte	.LVL903
-	.8byte	.LVL904-1
+.LLST263:
+	.8byte	.LVL925
+	.8byte	.LVL926-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL913
-	.8byte	.LVL914
+	.8byte	.LVL935
+	.8byte	.LVL936
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL917
-	.8byte	.LVL919
+	.8byte	.LVL939
+	.8byte	.LVL941
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL919
-	.8byte	.LVL920
+	.8byte	.LVL941
+	.8byte	.LVL942
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL968
-	.8byte	.LVL970-1
+	.8byte	.LVL990
+	.8byte	.LVL992-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL1005
-	.8byte	.LVL1007-1
+	.8byte	.LVL1027
+	.8byte	.LVL1029-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL1011
-	.8byte	.LVL1012-1
+	.8byte	.LVL1033
+	.8byte	.LVL1034-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL1026
-	.8byte	.LVL1027-1
+	.8byte	.LVL1048
+	.8byte	.LVL1049-1
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST256:
-	.8byte	.LVL903
-	.8byte	.LVL904-1
+.LLST264:
+	.8byte	.LVL925
+	.8byte	.LVL926-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL912
-	.8byte	.LVL925
+	.8byte	.LVL934
+	.8byte	.LVL947
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL968
-	.8byte	.LVL970-1
+	.8byte	.LVL990
+	.8byte	.LVL992-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL1001
-	.8byte	.LVL1007-1
+	.8byte	.LVL1023
+	.8byte	.LVL1029-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL1010
-	.8byte	.LVL1012-1
+	.8byte	.LVL1032
+	.8byte	.LVL1034-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL1026
-	.8byte	.LVL1027-1
+	.8byte	.LVL1048
+	.8byte	.LVL1049-1
 	.2byte	0x1
 	.byte	0x61
 	.8byte	0
 	.8byte	0
-.LLST257:
-	.8byte	.LVL903
-	.8byte	.LVL904-1
+.LLST265:
+	.8byte	.LVL925
+	.8byte	.LVL926-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL910
-	.8byte	.LVL925
+	.8byte	.LVL932
+	.8byte	.LVL947
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL968
-	.8byte	.LVL970-1
+	.8byte	.LVL990
+	.8byte	.LVL992-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL1001
-	.8byte	.LVL1007-1
+	.8byte	.LVL1023
+	.8byte	.LVL1029-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL1010
-	.8byte	.LVL1012-1
+	.8byte	.LVL1032
+	.8byte	.LVL1034-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL1026
-	.8byte	.LVL1027-1
+	.8byte	.LVL1048
+	.8byte	.LVL1049-1
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST258:
-	.8byte	.LVL903
-	.8byte	.LVL904-1
+.LLST266:
+	.8byte	.LVL925
+	.8byte	.LVL926-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL912
-	.8byte	.LVL925
+	.8byte	.LVL934
+	.8byte	.LVL947
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL968
-	.8byte	.LVL970-1
+	.8byte	.LVL990
+	.8byte	.LVL992-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL1001
-	.8byte	.LVL1007-1
+	.8byte	.LVL1023
+	.8byte	.LVL1029-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL1010
-	.8byte	.LVL1012-1
+	.8byte	.LVL1032
+	.8byte	.LVL1034-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL1026
-	.8byte	.LVL1027-1
+	.8byte	.LVL1048
+	.8byte	.LVL1049-1
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST259:
-	.8byte	.LVL877
-	.8byte	.LVL879
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL885
-	.8byte	.LVL887
+.LLST267:
+	.8byte	.LVL899
+	.8byte	.LVL901
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL889
-	.8byte	.LVL892
+	.8byte	.LVL907
+	.8byte	.LVL909
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL903
-	.8byte	.LVL905
+	.8byte	.LVL911
+	.8byte	.LVL914
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL911
 	.8byte	.LVL925
+	.8byte	.LVL927
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL933
-	.8byte	.LVL935
+	.8byte	.LVL947
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL959
-	.8byte	.LVL961
+	.8byte	.LVL955
+	.8byte	.LVL957
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL968
-	.8byte	.LVL969
+	.8byte	.LVL981
+	.8byte	.LVL983
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL1001
-	.8byte	.LVL1014
+	.8byte	.LVL990
+	.8byte	.LVL991
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL1026
-	.8byte	.LVL1028
+	.8byte	.LVL1023
+	.8byte	.LVL1036
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL1037
-	.8byte	.LVL1039
+	.8byte	.LVL1048
+	.8byte	.LVL1050
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL1050
-	.8byte	.LVL1052
+	.8byte	.LVL1059
+	.8byte	.LVL1061
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL1057
+	.8byte	.LVL1072
+	.8byte	.LVL1074
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL1079
 	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST260:
-	.8byte	.LVL929
-	.8byte	.LVL930
+.LLST268:
+	.8byte	.LVL951
+	.8byte	.LVL952
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL985
-	.8byte	.LVL986-1
+	.8byte	.LVL1007
+	.8byte	.LVL1008-1
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST264:
-	.8byte	.LVL927
-	.8byte	.LVL928
+.LLST272:
+	.8byte	.LVL949
+	.8byte	.LVL950
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL1025
-	.8byte	.LVL1026
+	.8byte	.LVL1047
+	.8byte	.LVL1048
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL1054
-	.8byte	.LVL1055-1
+	.8byte	.LVL1076
+	.8byte	.LVL1077-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST265:
-	.8byte	.LVL978
-	.8byte	.LVL979-1
+.LLST273:
+	.8byte	.LVL1000
+	.8byte	.LVL1001-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL1036
-	.8byte	.LVL1037
+	.8byte	.LVL1058
+	.8byte	.LVL1059
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST75:
-	.8byte	.LVL277
-	.8byte	.LVL278
+.LLST83:
+	.8byte	.LVL299
+	.8byte	.LVL300
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL278
-	.8byte	.LVL285
+	.8byte	.LVL300
+	.8byte	.LVL307
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL287
+	.8byte	.LVL309
 	.8byte	.LFE2834
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST76:
-	.8byte	.LVL277
-	.8byte	.LVL279
+.LLST84:
+	.8byte	.LVL299
+	.8byte	.LVL301
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL279
-	.8byte	.LVL286
+	.8byte	.LVL301
+	.8byte	.LVL308
 	.2byte	0x1
 	.byte	0x67
-	.8byte	.LVL287
+	.8byte	.LVL309
 	.8byte	.LFE2834
 	.2byte	0x1
 	.byte	0x67
 	.8byte	0
 	.8byte	0
-.LLST77:
-	.8byte	.LVL280
-	.8byte	.LVL282
+.LLST85:
+	.8byte	.LVL302
+	.8byte	.LVL304
 	.2byte	0x2
 	.byte	0x70
 	.sleb128 -12
-	.8byte	.LVL282
-	.8byte	.LVL288
+	.8byte	.LVL304
+	.8byte	.LVL310
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 36
-	.8byte	.LVL288
-	.8byte	.LVL291
+	.8byte	.LVL310
+	.8byte	.LVL313
 	.2byte	0x2
 	.byte	0x70
 	.sleb128 -12
-	.8byte	.LVL291
+	.8byte	.LVL313
 	.8byte	.LFE2834
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 36
 	.8byte	0
 	.8byte	0
-.LLST238:
-	.8byte	.LVL854
-	.8byte	.LVL855
+.LLST246:
+	.8byte	.LVL876
+	.8byte	.LVL877
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST189:
-	.8byte	.LVL549
-	.8byte	.LVL550
+.LLST197:
+	.8byte	.LVL571
+	.8byte	.LVL572
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL550
-	.8byte	.LVL554
+	.8byte	.LVL572
+	.8byte	.LVL576
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL555
-	.8byte	.LVL559
+	.8byte	.LVL577
+	.8byte	.LVL581
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL560
-	.8byte	.LVL564
+	.8byte	.LVL582
+	.8byte	.LVL586
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL565
-	.8byte	.LVL569
+	.8byte	.LVL587
+	.8byte	.LVL591
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL570
-	.8byte	.LVL572
+	.8byte	.LVL592
+	.8byte	.LVL594
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL573
-	.8byte	.LVL575
+	.8byte	.LVL595
+	.8byte	.LVL597
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST142:
-	.8byte	.LVL441
-	.8byte	.LVL488
+.LLST150:
+	.8byte	.LVL463
+	.8byte	.LVL510
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL489
+	.8byte	.LVL511
 	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST143:
-	.8byte	.LVL441
-	.8byte	.LVL489
+.LLST151:
+	.8byte	.LVL463
+	.8byte	.LVL511
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL489
+	.8byte	.LVL511
 	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST144:
-	.8byte	.LVL441
-	.8byte	.LVL442
+.LLST152:
+	.8byte	.LVL463
+	.8byte	.LVL464
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL461
-	.8byte	.LVL463
+	.8byte	.LVL483
+	.8byte	.LVL485
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL493
-	.8byte	.LVL494
+	.8byte	.LVL515
+	.8byte	.LVL516
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL506
-	.8byte	.LVL507
+	.8byte	.LVL528
+	.8byte	.LVL529
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL522
-	.8byte	.LVL523
+	.8byte	.LVL544
+	.8byte	.LVL545
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST145:
-	.8byte	.LVL451
-	.8byte	.LVL452
+.LLST153:
+	.8byte	.LVL473
+	.8byte	.LVL474
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST146:
-	.8byte	.LVL448
-	.8byte	.LVL449
+.LLST154:
+	.8byte	.LVL470
+	.8byte	.LVL471
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL450
-	.8byte	.LVL453
+	.8byte	.LVL472
+	.8byte	.LVL475
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL454
-	.8byte	.LVL461
+	.8byte	.LVL476
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST147:
-	.8byte	.LVL446
-	.8byte	.LVL461
+.LLST155:
+	.8byte	.LVL468
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST148:
-	.8byte	.LVL447
-	.8byte	.LVL461
+.LLST156:
+	.8byte	.LVL469
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST149:
-	.8byte	.LVL443
-	.8byte	.LVL444
+.LLST157:
+	.8byte	.LVL465
+	.8byte	.LVL466
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST150:
-	.8byte	.LVL445
-	.8byte	.LVL461
+.LLST158:
+	.8byte	.LVL467
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST151:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST159:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL470
-	.8byte	.LVL482
+	.8byte	.LVL492
+	.8byte	.LVL504
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL487
-	.8byte	.LVL493
+	.8byte	.LVL509
+	.8byte	.LVL515
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL520
-	.8byte	.LVL521
+	.8byte	.LVL542
+	.8byte	.LVL543
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST152:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST160:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL474
-	.8byte	.LVL483
+	.8byte	.LVL496
+	.8byte	.LVL505
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL487
-	.8byte	.LVL490
+	.8byte	.LVL509
+	.8byte	.LVL512
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL520
-	.8byte	.LVL521
+	.8byte	.LVL542
+	.8byte	.LVL543
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST153:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST161:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL470
-	.8byte	.LVL493
+	.8byte	.LVL492
+	.8byte	.LVL515
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL520
-	.8byte	.LVL521
+	.8byte	.LVL542
+	.8byte	.LVL543
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST154:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST162:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL470
-	.8byte	.LVL493
+	.8byte	.LVL492
+	.8byte	.LVL515
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL520
-	.8byte	.LVL521
+	.8byte	.LVL542
+	.8byte	.LVL543
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST155:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST163:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL470
-	.8byte	.LVL471
+	.8byte	.LVL492
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL472
-	.8byte	.LVL473
+	.8byte	.LVL494
+	.8byte	.LVL495
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL489
-	.8byte	.LVL491
+	.8byte	.LVL511
+	.8byte	.LVL513
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL492
-	.8byte	.LVL493
+	.8byte	.LVL514
+	.8byte	.LVL515
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST156:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST164:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL467
-	.8byte	.LVL493
+	.8byte	.LVL489
+	.8byte	.LVL515
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL520
-	.8byte	.LVL521
+	.8byte	.LVL542
+	.8byte	.LVL543
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
-.LLST157:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST165:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL468
-	.8byte	.LVL493
+	.8byte	.LVL490
+	.8byte	.LVL515
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL520
-	.8byte	.LVL521
+	.8byte	.LVL542
+	.8byte	.LVL543
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST158:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST166:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL469
-	.8byte	.LVL493
+	.8byte	.LVL491
+	.8byte	.LVL515
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL520
-	.8byte	.LVL521
+	.8byte	.LVL542
+	.8byte	.LVL543
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST159:
-	.8byte	.LVL464
-	.8byte	.LVL465
+.LLST167:
+	.8byte	.LVL486
+	.8byte	.LVL487
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST160:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST168:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL466
-	.8byte	.LVL493
+	.8byte	.LVL488
+	.8byte	.LVL515
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL520
-	.8byte	.LVL521
+	.8byte	.LVL542
+	.8byte	.LVL543
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST161:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST169:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL470
-	.8byte	.LVL475
+	.8byte	.LVL492
+	.8byte	.LVL497
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL484
-	.8byte	.LVL493
+	.8byte	.LVL506
+	.8byte	.LVL515
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL520
-	.8byte	.LVL521
+	.8byte	.LVL542
+	.8byte	.LVL543
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST162:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST170:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL470
-	.8byte	.LVL478
+	.8byte	.LVL492
+	.8byte	.LVL500
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL479
-	.8byte	.LVL480
+	.8byte	.LVL501
+	.8byte	.LVL502
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL481
-	.8byte	.LVL485
+	.8byte	.LVL503
+	.8byte	.LVL507
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL486
-	.8byte	.LVL493
+	.8byte	.LVL508
+	.8byte	.LVL515
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL520
-	.8byte	.LVL521
+	.8byte	.LVL542
+	.8byte	.LVL543
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST163:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST171:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL470
-	.8byte	.LVL476
+	.8byte	.LVL492
+	.8byte	.LVL498
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL477
-	.8byte	.LVL480
+	.8byte	.LVL499
+	.8byte	.LVL502
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL481
-	.8byte	.LVL485
+	.8byte	.LVL503
+	.8byte	.LVL507
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL486
-	.8byte	.LVL493
+	.8byte	.LVL508
+	.8byte	.LVL515
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL520
-	.8byte	.LVL521
+	.8byte	.LVL542
+	.8byte	.LVL543
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST164:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST172:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL470
-	.8byte	.LVL476
+	.8byte	.LVL492
+	.8byte	.LVL498
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL477
-	.8byte	.LVL478
+	.8byte	.LVL499
+	.8byte	.LVL500
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL479
-	.8byte	.LVL485
+	.8byte	.LVL501
+	.8byte	.LVL507
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL486
-	.8byte	.LVL493
+	.8byte	.LVL508
+	.8byte	.LVL515
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL520
-	.8byte	.LVL521
+	.8byte	.LVL542
+	.8byte	.LVL543
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST165:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST173:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL500
-	.8byte	.LVL501
+	.8byte	.LVL522
+	.8byte	.LVL523
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL502
-	.8byte	.LVL504
+	.8byte	.LVL524
+	.8byte	.LVL526
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL505
-	.8byte	.LVL506
+	.8byte	.LVL527
+	.8byte	.LVL528
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST166:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST174:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL498
-	.8byte	.LVL506
+	.8byte	.LVL520
+	.8byte	.LVL528
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST167:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST175:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL499
-	.8byte	.LVL506
+	.8byte	.LVL521
+	.8byte	.LVL528
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST168:
-	.8byte	.LVL495
-	.8byte	.LVL496
+.LLST176:
+	.8byte	.LVL517
+	.8byte	.LVL518
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST169:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST177:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL497
-	.8byte	.LVL506
+	.8byte	.LVL519
+	.8byte	.LVL528
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
-	.8byte	0
-.LLST170:
-	.8byte	.LVL455
-	.8byte	.LVL461
+	.8byte	0
+.LLST178:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL513
-	.8byte	.LVL514
+	.8byte	.LVL535
+	.8byte	.LVL536
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL515
-	.8byte	.LVL516
+	.8byte	.LVL537
+	.8byte	.LVL538
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL517
-	.8byte	.LVL518
+	.8byte	.LVL539
+	.8byte	.LVL540
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL519
-	.8byte	.LVL520
+	.8byte	.LVL541
+	.8byte	.LVL542
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST171:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST179:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL511
-	.8byte	.LVL520
+	.8byte	.LVL533
+	.8byte	.LVL542
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL521
-	.8byte	.LVL522
+	.8byte	.LVL543
+	.8byte	.LVL544
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST172:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST180:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL512
-	.8byte	.LVL520
+	.8byte	.LVL534
+	.8byte	.LVL542
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL521
-	.8byte	.LVL522
+	.8byte	.LVL543
+	.8byte	.LVL544
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
-.LLST173:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST181:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL462
-	.8byte	.LVL469
+	.8byte	.LVL484
+	.8byte	.LVL491
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL506
-	.8byte	.LVL520
+	.8byte	.LVL528
+	.8byte	.LVL542
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL521
-	.8byte	.LVL522
+	.8byte	.LVL543
+	.8byte	.LVL544
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST174:
-	.8byte	.LVL508
-	.8byte	.LVL509
+.LLST182:
+	.8byte	.LVL530
+	.8byte	.LVL531
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST175:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST183:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL510
-	.8byte	.LVL520
+	.8byte	.LVL532
+	.8byte	.LVL542
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL521
-	.8byte	.LVL522
+	.8byte	.LVL543
+	.8byte	.LVL544
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST176:
-	.8byte	.LVL455
-	.8byte	.LVL456
+.LLST184:
+	.8byte	.LVL477
+	.8byte	.LVL478
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL513
-	.8byte	.LVL520
+	.8byte	.LVL535
+	.8byte	.LVL542
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL521
-	.8byte	.LVL522
+	.8byte	.LVL543
+	.8byte	.LVL544
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST177:
-	.8byte	.LVL455
-	.8byte	.LVL458
+.LLST185:
+	.8byte	.LVL477
+	.8byte	.LVL480
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL513
-	.8byte	.LVL520
+	.8byte	.LVL535
+	.8byte	.LVL542
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL521
-	.8byte	.LVL522
+	.8byte	.LVL543
+	.8byte	.LVL544
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST178:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST186:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL530
-	.8byte	.LVL531
+	.8byte	.LVL552
+	.8byte	.LVL553
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL532
-	.8byte	.LVL539
+	.8byte	.LVL554
+	.8byte	.LVL561
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL540
+	.8byte	.LVL562
 	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST179:
-	.8byte	.LVL455
-	.8byte	.LVL457
+.LLST187:
+	.8byte	.LVL477
+	.8byte	.LVL479
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL527
+	.8byte	.LVL549
 	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST180:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST188:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL528
+	.8byte	.LVL550
 	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x61
 	.8byte	0
 	.8byte	0
-.LLST181:
-	.8byte	.LVL455
-	.8byte	.LVL456
+.LLST189:
+	.8byte	.LVL477
+	.8byte	.LVL478
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL529
+	.8byte	.LVL551
 	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST182:
-	.8byte	.LVL524
-	.8byte	.LVL525
+.LLST190:
+	.8byte	.LVL546
+	.8byte	.LVL547
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST183:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST191:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL526
+	.8byte	.LVL548
 	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST184:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST192:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL530
-	.8byte	.LVL533
+	.8byte	.LVL552
+	.8byte	.LVL555
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL535
-	.8byte	.LVL537
+	.8byte	.LVL557
+	.8byte	.LVL559
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL538
+	.8byte	.LVL560
 	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST185:
-	.8byte	.LVL455
-	.8byte	.LVL459
+.LLST193:
+	.8byte	.LVL477
+	.8byte	.LVL481
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL530
+	.8byte	.LVL552
 	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST186:
-	.8byte	.LVL455
-	.8byte	.LVL461
+.LLST194:
+	.8byte	.LVL477
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL530
-	.8byte	.LVL533
+	.8byte	.LVL552
+	.8byte	.LVL555
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL534
-	.8byte	.LVL535
+	.8byte	.LVL556
+	.8byte	.LVL557
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL536
-	.8byte	.LVL537
+	.8byte	.LVL558
+	.8byte	.LVL559
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL538
+	.8byte	.LVL560
 	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST187:
-	.8byte	.LVL455
-	.8byte	.LVL460
+.LLST195:
+	.8byte	.LVL477
+	.8byte	.LVL482
 	.2byte	0x1
 	.byte	0x6e
-	.8byte	.LVL530
+	.8byte	.LVL552
 	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x6e
 	.8byte	0
 	.8byte	0
-.LLST105:
-	.8byte	.LVL362
-	.8byte	.LVL393
+.LLST113:
+	.8byte	.LVL384
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL394
+	.8byte	.LVL416
 	.8byte	.LFE2822
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST106:
-	.8byte	.LVL362
-	.8byte	.LVL394
+.LLST114:
+	.8byte	.LVL384
+	.8byte	.LVL416
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL394
+	.8byte	.LVL416
 	.8byte	.LFE2822
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST107:
-	.8byte	.LVL362
-	.8byte	.LVL363
+.LLST115:
+	.8byte	.LVL384
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL377
-	.8byte	.LVL379
+	.8byte	.LVL399
+	.8byte	.LVL401
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL397
-	.8byte	.LVL398
+	.8byte	.LVL419
+	.8byte	.LVL420
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL410
-	.8byte	.LVL411
+	.8byte	.LVL432
+	.8byte	.LVL433
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL425
-	.8byte	.LVL426
+	.8byte	.LVL447
+	.8byte	.LVL448
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST108:
-	.8byte	.LVL372
-	.8byte	.LVL373
+.LLST116:
+	.8byte	.LVL394
+	.8byte	.LVL395
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST109:
-	.8byte	.LVL369
-	.8byte	.LVL370
+.LLST117:
+	.8byte	.LVL391
+	.8byte	.LVL392
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL371
-	.8byte	.LVL374
+	.8byte	.LVL393
+	.8byte	.LVL396
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL375
-	.8byte	.LVL377
+	.8byte	.LVL397
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST110:
-	.8byte	.LVL367
-	.8byte	.LVL377
+.LLST118:
+	.8byte	.LVL389
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST111:
-	.8byte	.LVL368
-	.8byte	.LVL377
+.LLST119:
+	.8byte	.LVL390
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST112:
-	.8byte	.LVL364
-	.8byte	.LVL365
+.LLST120:
+	.8byte	.LVL386
+	.8byte	.LVL387
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST113:
-	.8byte	.LVL366
-	.8byte	.LVL377
+.LLST121:
+	.8byte	.LVL388
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST114:
-	.8byte	.LVL376
-	.8byte	.LVL377
+.LLST122:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL385
-	.8byte	.LVL397
+	.8byte	.LVL407
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST115:
-	.8byte	.LVL376
-	.8byte	.LVL377
+.LLST123:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL383
-	.8byte	.LVL397
+	.8byte	.LVL405
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST116:
-	.8byte	.LVL389
-	.8byte	.LVL391
+.LLST124:
+	.8byte	.LVL411
+	.8byte	.LVL413
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST117:
-	.8byte	.LVL390
-	.8byte	.LVL392
+.LLST125:
+	.8byte	.LVL412
+	.8byte	.LVL414
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST118:
-	.8byte	.LVL376
-	.8byte	.LVL377
+.LLST126:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL386
-	.8byte	.LVL397
+	.8byte	.LVL408
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST119:
-	.8byte	.LVL376
-	.8byte	.LVL377
+.LLST127:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL386
-	.8byte	.LVL397
+	.8byte	.LVL408
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST120:
-	.8byte	.LVL376
-	.8byte	.LVL377
+.LLST128:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL386
-	.8byte	.LVL387
+	.8byte	.LVL408
+	.8byte	.LVL409
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL388
-	.8byte	.LVL395
+	.8byte	.LVL410
+	.8byte	.LVL417
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL396
-	.8byte	.LVL397
+	.8byte	.LVL418
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST121:
-	.8byte	.LVL380
-	.8byte	.LVL381
+.LLST129:
+	.8byte	.LVL402
+	.8byte	.LVL403
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST122:
-	.8byte	.LVL376
-	.8byte	.LVL377
+.LLST130:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL382
-	.8byte	.LVL397
+	.8byte	.LVL404
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST123:
-	.8byte	.LVL376
-	.8byte	.LVL377
+.LLST131:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL404
-	.8byte	.LVL405
+	.8byte	.LVL426
+	.8byte	.LVL427
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL406
-	.8byte	.LVL408
+	.8byte	.LVL428
+	.8byte	.LVL430
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL409
-	.8byte	.LVL410
+	.8byte	.LVL431
+	.8byte	.LVL432
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST124:
-	.8byte	.LVL376
-	.8byte	.LVL377
+.LLST132:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL402
-	.8byte	.LVL410
+	.8byte	.LVL424
+	.8byte	.LVL432
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST125:
-	.8byte	.LVL376
-	.8byte	.LVL377
+.LLST133:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL403
-	.8byte	.LVL410
+	.8byte	.LVL425
+	.8byte	.LVL432
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST126:
-	.8byte	.LVL399
-	.8byte	.LVL400
+.LLST134:
+	.8byte	.LVL421
+	.8byte	.LVL422
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST127:
-	.8byte	.LVL376
-	.8byte	.LVL377
+.LLST135:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL401
-	.8byte	.LVL410
+	.8byte	.LVL423
+	.8byte	.LVL432
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST128:
-	.8byte	.LVL376
-	.8byte	.LVL377
+.LLST136:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL378
-	.8byte	.LVL384
+	.8byte	.LVL400
+	.8byte	.LVL406
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL410
-	.8byte	.LVL425
+	.8byte	.LVL432
+	.8byte	.LVL447
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
-.LLST129:
-	.8byte	.LVL376
-	.8byte	.LVL377
+.LLST137:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL415
-	.8byte	.LVL425
+	.8byte	.LVL437
+	.8byte	.LVL447
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST130:
-	.8byte	.LVL376
-	.8byte	.LVL377
+.LLST138:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL416
-	.8byte	.LVL425
+	.8byte	.LVL438
+	.8byte	.LVL447
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST131:
-	.8byte	.LVL420
-	.8byte	.LVL422
+.LLST139:
+	.8byte	.LVL442
+	.8byte	.LVL444
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST132:
-	.8byte	.LVL376
-	.8byte	.LVL377
+.LLST140:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL417
-	.8byte	.LVL418
+	.8byte	.LVL439
+	.8byte	.LVL440
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL419
-	.8byte	.LVL423
+	.8byte	.LVL441
+	.8byte	.LVL445
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL424
-	.8byte	.LVL425
+	.8byte	.LVL446
+	.8byte	.LVL447
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST133:
-	.8byte	.LVL412
-	.8byte	.LVL413
+.LLST141:
+	.8byte	.LVL434
+	.8byte	.LVL435
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST134:
-	.8byte	.LVL376
-	.8byte	.LVL377
+.LLST142:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL414
-	.8byte	.LVL425
+	.8byte	.LVL436
+	.8byte	.LVL447
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST135:
-	.8byte	.LVL376
-	.8byte	.LVL377
+.LLST143:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL432
+	.8byte	.LVL454
 	.8byte	.LFE2822
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
-.LLST136:
-	.8byte	.LVL376
-	.8byte	.LVL377
+.LLST144:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL430
+	.8byte	.LVL452
 	.8byte	.LFE2822
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST137:
-	.8byte	.LVL376
-	.8byte	.LVL377
+.LLST145:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL431
+	.8byte	.LVL453
 	.8byte	.LFE2822
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST138:
-	.8byte	.LVL436
-	.8byte	.LVL438
+.LLST146:
+	.8byte	.LVL458
+	.8byte	.LVL460
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST139:
-	.8byte	.LVL376
-	.8byte	.LVL377
+.LLST147:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL433
-	.8byte	.LVL434
+	.8byte	.LVL455
+	.8byte	.LVL456
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL435
-	.8byte	.LVL439
+	.8byte	.LVL457
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL440
+	.8byte	.LVL462
 	.8byte	.LFE2822
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST140:
-	.8byte	.LVL427
-	.8byte	.LVL428
+.LLST148:
+	.8byte	.LVL449
+	.8byte	.LVL450
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST141:
-	.8byte	.LVL376
-	.8byte	.LVL377
+.LLST149:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL429
+	.8byte	.LVL451
 	.8byte	.LFE2822
 	.2byte	0x1
 	.byte	0x58
@@ -55767,192 +56212,192 @@ __exitcall_ebc_exit:
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST235:
-	.8byte	.LVL838
-	.8byte	.LVL840
+.LLST243:
+	.8byte	.LVL860
+	.8byte	.LVL862
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST236:
-	.8byte	.LVL839
-	.8byte	.LVL842
+.LLST244:
+	.8byte	.LVL861
+	.8byte	.LVL864
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST237:
-	.8byte	.LVL842
-	.8byte	.LVL845
+.LLST245:
+	.8byte	.LVL864
+	.8byte	.LVL867
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL846
-	.8byte	.LVL849
+	.8byte	.LVL868
+	.8byte	.LVL871
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL850
-	.8byte	.LVL853
+	.8byte	.LVL872
+	.8byte	.LVL875
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST231:
-	.8byte	.LVL827
-	.8byte	.LVL832
+.LLST239:
+	.8byte	.LVL849
+	.8byte	.LVL854
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL837
+	.8byte	.LVL859
 	.8byte	.LFE2812
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST232:
-	.8byte	.LVL833
-	.8byte	.LVL834
+.LLST240:
+	.8byte	.LVL855
+	.8byte	.LVL856
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST233:
-	.8byte	.LVL831
-	.8byte	.LVL835
+.LLST241:
+	.8byte	.LVL853
+	.8byte	.LVL857
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST234:
-	.8byte	.LVL834
-	.8byte	.LVL836
+.LLST242:
+	.8byte	.LVL856
+	.8byte	.LVL858
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST227:
-	.8byte	.LVL810
-	.8byte	.LVL820
+.LLST235:
+	.8byte	.LVL832
+	.8byte	.LVL842
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL820
-	.8byte	.LVL825
+	.8byte	.LVL842
+	.8byte	.LVL847
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL825
+	.8byte	.LVL847
 	.8byte	.LFE2811
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST228:
-	.8byte	.LVL810
-	.8byte	.LVL815
+.LLST236:
+	.8byte	.LVL832
+	.8byte	.LVL837
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL820
-	.8byte	.LVL821
+	.8byte	.LVL842
+	.8byte	.LVL843
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL826
+	.8byte	.LVL848
 	.8byte	.LFE2811
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST229:
-	.8byte	.LVL816
-	.8byte	.LVL819
+.LLST237:
+	.8byte	.LVL838
+	.8byte	.LVL841
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL823
-	.8byte	.LVL824
+	.8byte	.LVL845
+	.8byte	.LVL846
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST230:
-	.8byte	.LVL817
-	.8byte	.LVL818
+.LLST238:
+	.8byte	.LVL839
+	.8byte	.LVL840
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL822
-	.8byte	.LVL824
+	.8byte	.LVL844
+	.8byte	.LVL846
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST221:
-	.8byte	.LVL788
-	.8byte	.LVL794
+.LLST229:
+	.8byte	.LVL810
+	.8byte	.LVL816
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL798
-	.8byte	.LVL799
+	.8byte	.LVL820
+	.8byte	.LVL821
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL808
-	.8byte	.LVL809
+	.8byte	.LVL830
+	.8byte	.LVL831
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST222:
-	.8byte	.LVL788
-	.8byte	.LVL789
+.LLST230:
+	.8byte	.LVL810
+	.8byte	.LVL811
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST223:
-	.8byte	.LVL794
-	.8byte	.LVL797
+.LLST231:
+	.8byte	.LVL816
+	.8byte	.LVL819
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL801
-	.8byte	.LVL806
+	.8byte	.LVL823
+	.8byte	.LVL828
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL809
+	.8byte	.LVL831
 	.8byte	.LFE2810
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST224:
-	.8byte	.LVL793
-	.8byte	.LVL794
+.LLST232:
+	.8byte	.LVL815
+	.8byte	.LVL816
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL796
-	.8byte	.LVL800
+	.8byte	.LVL818
+	.8byte	.LVL822
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL805
-	.8byte	.LVL809
+	.8byte	.LVL827
+	.8byte	.LVL831
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST225:
-	.8byte	.LVL793
-	.8byte	.LVL795
+.LLST233:
+	.8byte	.LVL815
+	.8byte	.LVL817
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL796
-	.8byte	.LVL804
+	.8byte	.LVL818
+	.8byte	.LVL826
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL807
+	.8byte	.LVL829
 	.8byte	.LFE2810
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST226:
-	.8byte	.LVL793
-	.8byte	.LVL802
+.LLST234:
+	.8byte	.LVL815
+	.8byte	.LVL824
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL803
+	.8byte	.LVL825
 	.8byte	.LFE2810
 	.2byte	0x1
 	.byte	0x57
@@ -55965,67 +56410,67 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST188:
-	.8byte	.LVL541
-	.8byte	.LVL542
+.LLST196:
+	.8byte	.LVL563
+	.8byte	.LVL564
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL542
-	.8byte	.LVL547
+	.8byte	.LVL564
+	.8byte	.LVL569
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL548
+	.8byte	.LVL570
 	.8byte	.LFE2879
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST190:
-	.8byte	.LVL576
-	.8byte	.LVL578
+.LLST198:
+	.8byte	.LVL598
+	.8byte	.LVL600
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL578
-	.8byte	.LVL582
+	.8byte	.LVL600
+	.8byte	.LVL604
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL583
-	.8byte	.LVL586
+	.8byte	.LVL605
+	.8byte	.LVL608
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST191:
-	.8byte	.LVL576
-	.8byte	.LVL577
+.LLST199:
+	.8byte	.LVL598
+	.8byte	.LVL599
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST193:
-	.8byte	.LVL594
-	.8byte	.LVL595-1
+.LLST201:
+	.8byte	.LVL616
+	.8byte	.LVL617-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST194:
-	.8byte	.LVL593
-	.8byte	.LVL595-1
+.LLST202:
+	.8byte	.LVL615
+	.8byte	.LVL617-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST220:
-	.8byte	.LVL780
-	.8byte	.LVL781
+.LLST228:
+	.8byte	.LVL802
+	.8byte	.LVL803
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL781
-	.8byte	.LVL785
+	.8byte	.LVL803
+	.8byte	.LVL807
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL786
+	.8byte	.LVL808
 	.8byte	.LFE2887
 	.2byte	0x1
 	.byte	0x63
@@ -56049,50 +56494,28 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
 .Ldebug_ranges0:
-	.8byte	.LBB984
-	.8byte	.LBE984
-	.8byte	.LBB987
-	.8byte	.LBE987
+	.8byte	.LBB1015
+	.8byte	.LBE1015
+	.8byte	.LBB1018
+	.8byte	.LBE1018
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB988
-	.8byte	.LBE988
 	.8byte	.LBB1019
 	.8byte	.LBE1019
-	.8byte	.LBB1020
-	.8byte	.LBE1020
-	.8byte	.LBB1085
-	.8byte	.LBE1085
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB991
-	.8byte	.LBE991
-	.8byte	.LBB1003
-	.8byte	.LBE1003
-	.8byte	.LBB1004
-	.8byte	.LBE1004
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1007
-	.8byte	.LBE1007
-	.8byte	.LBB1012
-	.8byte	.LBE1012
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1021
-	.8byte	.LBE1021
-	.8byte	.LBB1242
-	.8byte	.LBE1242
-	.8byte	.LBB1243
-	.8byte	.LBE1243
+	.8byte	.LBB1050
+	.8byte	.LBE1050
+	.8byte	.LBB1051
+	.8byte	.LBE1051
+	.8byte	.LBB1116
+	.8byte	.LBE1116
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1024
-	.8byte	.LBE1024
-	.8byte	.LBB1044
-	.8byte	.LBE1044
-	.8byte	.LBB1045
-	.8byte	.LBE1045
+	.8byte	.LBB1022
+	.8byte	.LBE1022
+	.8byte	.LBB1034
+	.8byte	.LBE1034
+	.8byte	.LBB1035
+	.8byte	.LBE1035
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1038
@@ -56101,568 +56524,610 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1043
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1050
-	.8byte	.LBE1050
-	.8byte	.LBB1253
-	.8byte	.LBE1253
-	.8byte	.LBB1255
-	.8byte	.LBE1255
-	.8byte	.LBB1256
-	.8byte	.LBE1256
+	.8byte	.LBB1052
+	.8byte	.LBE1052
+	.8byte	.LBB1306
+	.8byte	.LBE1306
+	.8byte	.LBB1307
+	.8byte	.LBE1307
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1056
-	.8byte	.LBE1056
-	.8byte	.LBB1240
-	.8byte	.LBE1240
-	.8byte	.LBB1241
-	.8byte	.LBE1241
+	.8byte	.LBB1055
+	.8byte	.LBE1055
+	.8byte	.LBB1075
+	.8byte	.LBE1075
+	.8byte	.LBB1076
+	.8byte	.LBE1076
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1059
-	.8byte	.LBE1059
-	.8byte	.LBB1079
-	.8byte	.LBE1079
-	.8byte	.LBB1080
-	.8byte	.LBE1080
+	.8byte	.LBB1069
+	.8byte	.LBE1069
+	.8byte	.LBB1074
+	.8byte	.LBE1074
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1073
-	.8byte	.LBE1073
-	.8byte	.LBB1078
-	.8byte	.LBE1078
+	.8byte	.LBB1081
+	.8byte	.LBE1081
+	.8byte	.LBB1314
+	.8byte	.LBE1314
+	.8byte	.LBB1317
+	.8byte	.LBE1317
+	.8byte	.LBB1318
+	.8byte	.LBE1318
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1086
-	.8byte	.LBE1086
-	.8byte	.LBB1119
-	.8byte	.LBE1119
-	.8byte	.LBB1250
-	.8byte	.LBE1250
-	.8byte	.LBB1251
-	.8byte	.LBE1251
+	.8byte	.LBB1087
+	.8byte	.LBE1087
+	.8byte	.LBB1300
+	.8byte	.LBE1300
+	.8byte	.LBB1301
+	.8byte	.LBE1301
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1089
-	.8byte	.LBE1089
-	.8byte	.LBB1102
-	.8byte	.LBE1102
+	.8byte	.LBB1090
+	.8byte	.LBE1090
+	.8byte	.LBB1110
+	.8byte	.LBE1110
 	.8byte	.LBB1111
 	.8byte	.LBE1111
-	.8byte	.LBB1112
-	.8byte	.LBE1112
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1105
-	.8byte	.LBE1105
-	.8byte	.LBB1110
-	.8byte	.LBE1110
+	.8byte	.LBB1104
+	.8byte	.LBE1104
+	.8byte	.LBB1109
+	.8byte	.LBE1109
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1117
+	.8byte	.LBE1117
+	.8byte	.LBB1150
+	.8byte	.LBE1150
+	.8byte	.LBB1310
+	.8byte	.LBE1310
+	.8byte	.LBB1311
+	.8byte	.LBE1311
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1120
 	.8byte	.LBE1120
-	.8byte	.LBB1155
-	.8byte	.LBE1155
-	.8byte	.LBB1246
-	.8byte	.LBE1246
-	.8byte	.LBB1247
-	.8byte	.LBE1247
-	.8byte	.LBB1257
-	.8byte	.LBE1257
+	.8byte	.LBB1133
+	.8byte	.LBE1133
+	.8byte	.LBB1142
+	.8byte	.LBE1142
+	.8byte	.LBB1143
+	.8byte	.LBE1143
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1123
-	.8byte	.LBE1123
 	.8byte	.LBB1136
 	.8byte	.LBE1136
-	.8byte	.LBB1145
-	.8byte	.LBE1145
-	.8byte	.LBB1146
-	.8byte	.LBE1146
+	.8byte	.LBB1141
+	.8byte	.LBE1141
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1139
-	.8byte	.LBE1139
-	.8byte	.LBB1144
-	.8byte	.LBE1144
+	.8byte	.LBB1151
+	.8byte	.LBE1151
+	.8byte	.LBB1186
+	.8byte	.LBE1186
+	.8byte	.LBB1308
+	.8byte	.LBE1308
+	.8byte	.LBB1309
+	.8byte	.LBE1309
+	.8byte	.LBB1319
+	.8byte	.LBE1319
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1156
-	.8byte	.LBE1156
+	.8byte	.LBB1154
+	.8byte	.LBE1154
 	.8byte	.LBB1167
 	.8byte	.LBE1167
+	.8byte	.LBB1176
+	.8byte	.LBE1176
+	.8byte	.LBB1177
+	.8byte	.LBE1177
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1159
-	.8byte	.LBE1159
-	.8byte	.LBB1164
-	.8byte	.LBE1164
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1160
-	.8byte	.LBE1160
-	.8byte	.LBB1163
-	.8byte	.LBE1163
+	.8byte	.LBB1170
+	.8byte	.LBE1170
+	.8byte	.LBB1175
+	.8byte	.LBE1175
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1168
-	.8byte	.LBE1168
-	.8byte	.LBB1203
-	.8byte	.LBE1203
-	.8byte	.LBB1244
-	.8byte	.LBE1244
-	.8byte	.LBB1245
-	.8byte	.LBE1245
-	.8byte	.LBB1252
-	.8byte	.LBE1252
+	.8byte	.LBB1187
+	.8byte	.LBE1187
+	.8byte	.LBB1198
+	.8byte	.LBE1198
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1171
-	.8byte	.LBE1171
-	.8byte	.LBB1184
-	.8byte	.LBE1184
-	.8byte	.LBB1185
-	.8byte	.LBE1185
-	.8byte	.LBB1186
-	.8byte	.LBE1186
+	.8byte	.LBB1190
+	.8byte	.LBE1190
+	.8byte	.LBB1195
+	.8byte	.LBE1195
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1189
-	.8byte	.LBE1189
+	.8byte	.LBB1191
+	.8byte	.LBE1191
 	.8byte	.LBB1194
 	.8byte	.LBE1194
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1204
-	.8byte	.LBE1204
-	.8byte	.LBB1239
-	.8byte	.LBE1239
-	.8byte	.LBB1248
-	.8byte	.LBE1248
-	.8byte	.LBB1249
-	.8byte	.LBE1249
-	.8byte	.LBB1254
-	.8byte	.LBE1254
+	.8byte	.LBB1199
+	.8byte	.LBE1199
+	.8byte	.LBB1234
+	.8byte	.LBE1234
+	.8byte	.LBB1304
+	.8byte	.LBE1304
+	.8byte	.LBB1305
+	.8byte	.LBE1305
+	.8byte	.LBB1316
+	.8byte	.LBE1316
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1207
-	.8byte	.LBE1207
-	.8byte	.LBB1220
-	.8byte	.LBE1220
-	.8byte	.LBB1221
-	.8byte	.LBE1221
-	.8byte	.LBB1222
-	.8byte	.LBE1222
+	.8byte	.LBB1202
+	.8byte	.LBE1202
+	.8byte	.LBB1215
+	.8byte	.LBE1215
+	.8byte	.LBB1216
+	.8byte	.LBE1216
+	.8byte	.LBB1217
+	.8byte	.LBE1217
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1220
+	.8byte	.LBE1220
 	.8byte	.LBB1225
 	.8byte	.LBE1225
-	.8byte	.LBB1230
-	.8byte	.LBE1230
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1262
-	.8byte	.LBE1262
-	.8byte	.LBB1265
-	.8byte	.LBE1265
+	.8byte	.LBB1235
+	.8byte	.LBE1235
+	.8byte	.LBB1302
+	.8byte	.LBE1302
+	.8byte	.LBB1303
+	.8byte	.LBE1303
+	.8byte	.LBB1315
+	.8byte	.LBE1315
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1296
-	.8byte	.LBE1296
-	.8byte	.LBB1308
-	.8byte	.LBE1308
-	.8byte	.LBB1310
-	.8byte	.LBE1310
-	.8byte	.LBB1312
-	.8byte	.LBE1312
+	.8byte	.LBB1238
+	.8byte	.LBE1238
+	.8byte	.LBB1258
+	.8byte	.LBE1258
+	.8byte	.LBB1259
+	.8byte	.LBE1259
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1301
-	.8byte	.LBE1301
-	.8byte	.LBB1309
-	.8byte	.LBE1309
-	.8byte	.LBB1311
-	.8byte	.LBE1311
-	.8byte	.LBB1320
-	.8byte	.LBE1320
-	.8byte	.LBB1322
-	.8byte	.LBE1322
-	.8byte	.LBB1324
-	.8byte	.LBE1324
+	.8byte	.LBB1252
+	.8byte	.LBE1252
+	.8byte	.LBB1257
+	.8byte	.LBE1257
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1266
+	.8byte	.LBE1266
+	.8byte	.LBB1298
+	.8byte	.LBE1298
+	.8byte	.LBB1299
+	.8byte	.LBE1299
+	.8byte	.LBB1312
+	.8byte	.LBE1312
 	.8byte	.LBB1313
 	.8byte	.LBE1313
-	.8byte	.LBB1321
-	.8byte	.LBE1321
-	.8byte	.LBB1323
-	.8byte	.LBE1323
-	.8byte	.LBB1330
-	.8byte	.LBE1330
-	.8byte	.LBB1332
-	.8byte	.LBE1332
-	.8byte	.LBB1334
-	.8byte	.LBE1334
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1325
-	.8byte	.LBE1325
-	.8byte	.LBB1331
-	.8byte	.LBE1331
-	.8byte	.LBB1333
-	.8byte	.LBE1333
-	.8byte	.LBB1335
-	.8byte	.LBE1335
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1340
-	.8byte	.LBE1340
-	.8byte	.LBB1346
-	.8byte	.LBE1346
-	.8byte	.LBB1352
-	.8byte	.LBE1352
-	.8byte	.LBB1354
-	.8byte	.LBE1354
-	.8byte	.LBB1356
-	.8byte	.LBE1356
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1347
-	.8byte	.LBE1347
-	.8byte	.LBB1353
-	.8byte	.LBE1353
-	.8byte	.LBB1355
-	.8byte	.LBE1355
-	.8byte	.LBB1357
-	.8byte	.LBE1357
+	.8byte	.LBB1269
+	.8byte	.LBE1269
+	.8byte	.LBB1281
+	.8byte	.LBE1281
+	.8byte	.LBB1282
+	.8byte	.LBE1282
+	.8byte	.LBB1283
+	.8byte	.LBE1283
+	.8byte	.LBB1284
+	.8byte	.LBE1284
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1360
-	.8byte	.LBE1360
-	.8byte	.LBB1373
-	.8byte	.LBE1373
-	.8byte	.LBB1375
-	.8byte	.LBE1375
-	.8byte	.LBB1377
-	.8byte	.LBE1377
-	.8byte	.LBB1379
-	.8byte	.LBE1379
+	.8byte	.LBB1324
+	.8byte	.LBE1324
+	.8byte	.LBB1327
+	.8byte	.LBE1327
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1366
-	.8byte	.LBE1366
+	.8byte	.LBB1358
+	.8byte	.LBE1358
+	.8byte	.LBB1370
+	.8byte	.LBE1370
 	.8byte	.LBB1372
 	.8byte	.LBE1372
 	.8byte	.LBB1374
 	.8byte	.LBE1374
-	.8byte	.LBB1376
-	.8byte	.LBE1376
-	.8byte	.LBB1378
-	.8byte	.LBE1378
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1363
+	.8byte	.LBE1363
+	.8byte	.LBB1371
+	.8byte	.LBE1371
+	.8byte	.LBB1373
+	.8byte	.LBE1373
+	.8byte	.LBB1382
+	.8byte	.LBE1382
+	.8byte	.LBB1384
+	.8byte	.LBE1384
+	.8byte	.LBB1386
+	.8byte	.LBE1386
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1375
+	.8byte	.LBE1375
+	.8byte	.LBB1383
+	.8byte	.LBE1383
+	.8byte	.LBB1385
+	.8byte	.LBE1385
+	.8byte	.LBB1392
+	.8byte	.LBE1392
+	.8byte	.LBB1394
+	.8byte	.LBE1394
+	.8byte	.LBB1396
+	.8byte	.LBE1396
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1387
+	.8byte	.LBE1387
+	.8byte	.LBB1393
+	.8byte	.LBE1393
+	.8byte	.LBB1395
+	.8byte	.LBE1395
+	.8byte	.LBB1397
+	.8byte	.LBE1397
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1402
+	.8byte	.LBE1402
 	.8byte	.LBB1408
 	.8byte	.LBE1408
-	.8byte	.LBB1422
-	.8byte	.LBE1422
-	.8byte	.LBB1450
-	.8byte	.LBE1450
+	.8byte	.LBB1414
+	.8byte	.LBE1414
+	.8byte	.LBB1416
+	.8byte	.LBE1416
+	.8byte	.LBB1418
+	.8byte	.LBE1418
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1410
-	.8byte	.LBE1410
+	.8byte	.LBB1409
+	.8byte	.LBE1409
+	.8byte	.LBB1415
+	.8byte	.LBE1415
+	.8byte	.LBB1417
+	.8byte	.LBE1417
 	.8byte	.LBB1419
 	.8byte	.LBE1419
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1425
-	.8byte	.LBE1425
-	.8byte	.LBB1451
-	.8byte	.LBE1451
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1427
-	.8byte	.LBE1427
-	.8byte	.LBB1440
-	.8byte	.LBE1440
-	.8byte	.LBB1442
-	.8byte	.LBE1442
-	.8byte	.LBB1444
-	.8byte	.LBE1444
-	.8byte	.LBB1446
-	.8byte	.LBE1446
-	.8byte	.LBB1448
-	.8byte	.LBE1448
+	.8byte	.LBB1422
+	.8byte	.LBE1422
+	.8byte	.LBB1435
+	.8byte	.LBE1435
+	.8byte	.LBB1437
+	.8byte	.LBE1437
+	.8byte	.LBB1439
+	.8byte	.LBE1439
+	.8byte	.LBB1441
+	.8byte	.LBE1441
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1428
+	.8byte	.LBE1428
 	.8byte	.LBB1434
 	.8byte	.LBE1434
-	.8byte	.LBB1441
-	.8byte	.LBE1441
-	.8byte	.LBB1443
-	.8byte	.LBE1443
-	.8byte	.LBB1445
-	.8byte	.LBE1445
-	.8byte	.LBB1447
-	.8byte	.LBE1447
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1454
-	.8byte	.LBE1454
-	.8byte	.LBB1466
-	.8byte	.LBE1466
-	.8byte	.LBB1468
-	.8byte	.LBE1468
-	.8byte	.LBB1469
-	.8byte	.LBE1469
-	.8byte	.LBB1471
-	.8byte	.LBE1471
-	.8byte	.LBB1473
-	.8byte	.LBE1473
+	.8byte	.LBB1436
+	.8byte	.LBE1436
+	.8byte	.LBB1438
+	.8byte	.LBE1438
+	.8byte	.LBB1440
+	.8byte	.LBE1440
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1461
-	.8byte	.LBE1461
-	.8byte	.LBB1467
-	.8byte	.LBE1467
 	.8byte	.LBB1470
 	.8byte	.LBE1470
-	.8byte	.LBB1472
-	.8byte	.LBE1472
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1474
-	.8byte	.LBE1474
-	.8byte	.LBB1483
-	.8byte	.LBE1483
 	.8byte	.LBB1484
 	.8byte	.LBE1484
-	.8byte	.LBB1495
-	.8byte	.LBE1495
+	.8byte	.LBB1512
+	.8byte	.LBE1512
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1476
-	.8byte	.LBE1476
-	.8byte	.LBB1479
-	.8byte	.LBE1479
+	.8byte	.LBB1472
+	.8byte	.LBE1472
+	.8byte	.LBB1481
+	.8byte	.LBE1481
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1487
+	.8byte	.LBE1487
+	.8byte	.LBB1513
+	.8byte	.LBE1513
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1485
-	.8byte	.LBE1485
 	.8byte	.LBB1489
 	.8byte	.LBE1489
-	.8byte	.LBB1490
-	.8byte	.LBE1490
+	.8byte	.LBB1502
+	.8byte	.LBE1502
+	.8byte	.LBB1504
+	.8byte	.LBE1504
+	.8byte	.LBB1506
+	.8byte	.LBE1506
+	.8byte	.LBB1508
+	.8byte	.LBE1508
+	.8byte	.LBB1510
+	.8byte	.LBE1510
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1496
+	.8byte	.LBE1496
+	.8byte	.LBB1503
+	.8byte	.LBE1503
+	.8byte	.LBB1505
+	.8byte	.LBE1505
+	.8byte	.LBB1507
+	.8byte	.LBE1507
+	.8byte	.LBB1509
+	.8byte	.LBE1509
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1516
+	.8byte	.LBE1516
+	.8byte	.LBB1528
+	.8byte	.LBE1528
+	.8byte	.LBB1530
+	.8byte	.LBE1530
+	.8byte	.LBB1531
+	.8byte	.LBE1531
+	.8byte	.LBB1533
+	.8byte	.LBE1533
+	.8byte	.LBB1535
+	.8byte	.LBE1535
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1523
+	.8byte	.LBE1523
+	.8byte	.LBB1529
+	.8byte	.LBE1529
+	.8byte	.LBB1532
+	.8byte	.LBE1532
+	.8byte	.LBB1534
+	.8byte	.LBE1534
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1536
+	.8byte	.LBE1536
+	.8byte	.LBB1545
+	.8byte	.LBE1545
+	.8byte	.LBB1546
+	.8byte	.LBE1546
+	.8byte	.LBB1557
+	.8byte	.LBE1557
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1538
+	.8byte	.LBE1538
+	.8byte	.LBB1541
+	.8byte	.LBE1541
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1547
+	.8byte	.LBE1547
+	.8byte	.LBB1551
+	.8byte	.LBE1551
+	.8byte	.LBB1552
+	.8byte	.LBE1552
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1722
+	.8byte	.LBE1722
+	.8byte	.LBB1725
+	.8byte	.LBE1725
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1660
-	.8byte	.LBE1660
-	.8byte	.LBB1663
-	.8byte	.LBE1663
+	.8byte	.LBB1732
+	.8byte	.LBE1732
+	.8byte	.LBB1806
+	.8byte	.LBE1806
+	.8byte	.LBB1807
+	.8byte	.LBE1807
+	.8byte	.LBB1808
+	.8byte	.LBE1808
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1670
-	.8byte	.LBE1670
+	.8byte	.LBB1734
+	.8byte	.LBE1734
+	.8byte	.LBB1743
+	.8byte	.LBE1743
 	.8byte	.LBB1744
 	.8byte	.LBE1744
 	.8byte	.LBB1745
 	.8byte	.LBE1745
-	.8byte	.LBB1746
-	.8byte	.LBE1746
-	.8byte	0
 	.8byte	0
-	.8byte	.LBB1672
-	.8byte	.LBE1672
-	.8byte	.LBB1681
-	.8byte	.LBE1681
-	.8byte	.LBB1682
-	.8byte	.LBE1682
-	.8byte	.LBB1683
-	.8byte	.LBE1683
 	.8byte	0
-	.8byte	0
-	.8byte	.LBB1747
-	.8byte	.LBE1747
-	.8byte	.LBB1762
-	.8byte	.LBE1762
-	.8byte	.LBB1763
-	.8byte	.LBE1763
-	.8byte	.LBB1773
-	.8byte	.LBE1773
+	.8byte	.LBB1809
+	.8byte	.LBE1809
+	.8byte	.LBB1824
+	.8byte	.LBE1824
 	.8byte	.LBB1825
 	.8byte	.LBE1825
-	.8byte	.LBB1828
-	.8byte	.LBE1828
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1749
-	.8byte	.LBE1749
-	.8byte	.LBB1752
-	.8byte	.LBE1752
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1753
-	.8byte	.LBE1753
-	.8byte	.LBB1756
-	.8byte	.LBE1756
+	.8byte	.LBB1835
+	.8byte	.LBE1835
+	.8byte	.LBB1887
+	.8byte	.LBE1887
+	.8byte	.LBB1890
+	.8byte	.LBE1890
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1764
-	.8byte	.LBE1764
-	.8byte	.LBB1774
-	.8byte	.LBE1774
-	.8byte	.LBB1824
-	.8byte	.LBE1824
-	.8byte	.LBB1829
-	.8byte	.LBE1829
+	.8byte	.LBB1811
+	.8byte	.LBE1811
+	.8byte	.LBB1814
+	.8byte	.LBE1814
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1766
-	.8byte	.LBE1766
-	.8byte	.LBB1769
-	.8byte	.LBE1769
+	.8byte	.LBB1815
+	.8byte	.LBE1815
+	.8byte	.LBB1818
+	.8byte	.LBE1818
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1775
-	.8byte	.LBE1775
 	.8byte	.LBB1826
 	.8byte	.LBE1826
-	.8byte	.LBB1827
-	.8byte	.LBE1827
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1777
-	.8byte	.LBE1777
-	.8byte	.LBB1783
-	.8byte	.LBE1783
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1786
-	.8byte	.LBE1786
-	.8byte	.LBB1787
-	.8byte	.LBE1787
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1794
-	.8byte	.LBE1794
-	.8byte	.LBB1800
-	.8byte	.LBE1800
-	.8byte	.LBB1801
-	.8byte	.LBE1801
-	.8byte	.LBB1802
-	.8byte	.LBE1802
-	.8byte	.LBB1803
-	.8byte	.LBE1803
+	.8byte	.LBB1836
+	.8byte	.LBE1836
+	.8byte	.LBB1886
+	.8byte	.LBE1886
+	.8byte	.LBB1891
+	.8byte	.LBE1891
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1804
-	.8byte	.LBE1804
-	.8byte	.LBB1822
-	.8byte	.LBE1822
-	.8byte	.LBB1823
-	.8byte	.LBE1823
-	.8byte	.LBB1830
-	.8byte	.LBE1830
+	.8byte	.LBB1828
+	.8byte	.LBE1828
+	.8byte	.LBB1831
+	.8byte	.LBE1831
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1837
 	.8byte	.LBE1837
-	.8byte	.LBB1844
-	.8byte	.LBE1844
+	.8byte	.LBB1888
+	.8byte	.LBE1888
+	.8byte	.LBB1889
+	.8byte	.LBE1889
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1839
+	.8byte	.LBE1839
 	.8byte	.LBB1845
 	.8byte	.LBE1845
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1838
-	.8byte	.LBE1838
-	.8byte	.LBB1843
-	.8byte	.LBE1843
+	.8byte	.LBB1848
+	.8byte	.LBE1848
+	.8byte	.LBB1849
+	.8byte	.LBE1849
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1882
-	.8byte	.LBE1882
-	.8byte	.LBB1893
-	.8byte	.LBE1893
-	.8byte	.LBB1894
-	.8byte	.LBE1894
-	.8byte	.LBB1912
-	.8byte	.LBE1912
+	.8byte	.LBB1856
+	.8byte	.LBE1856
+	.8byte	.LBB1862
+	.8byte	.LBE1862
+	.8byte	.LBB1863
+	.8byte	.LBE1863
+	.8byte	.LBB1864
+	.8byte	.LBE1864
+	.8byte	.LBB1865
+	.8byte	.LBE1865
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1866
+	.8byte	.LBE1866
 	.8byte	.LBB1884
 	.8byte	.LBE1884
-	.8byte	.LBB1887
-	.8byte	.LBE1887
-	.8byte	.LBB1888
-	.8byte	.LBE1888
-	.8byte	.LBB1889
-	.8byte	.LBE1889
-	.8byte	0
-	.8byte	0
 	.8byte	.LBB1885
 	.8byte	.LBE1885
-	.8byte	.LBB1886
-	.8byte	.LBE1886
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1895
-	.8byte	.LBE1895
-	.8byte	.LBB1924
-	.8byte	.LBE1924
+	.8byte	.LBB1892
+	.8byte	.LBE1892
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1900
-	.8byte	.LBE1900
+	.8byte	.LBB1899
+	.8byte	.LBE1899
 	.8byte	.LBB1906
 	.8byte	.LBE1906
 	.8byte	.LBB1907
 	.8byte	.LBE1907
-	.8byte	.LBB1925
-	.8byte	.LBE1925
-	.8byte	.LBB1926
-	.8byte	.LBE1926
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1908
-	.8byte	.LBE1908
-	.8byte	.LBB1911
-	.8byte	.LBE1911
+	.8byte	.LBB1900
+	.8byte	.LBE1900
+	.8byte	.LBB1905
+	.8byte	.LBE1905
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1944
+	.8byte	.LBE1944
+	.8byte	.LBB1955
+	.8byte	.LBE1955
+	.8byte	.LBB1956
+	.8byte	.LBE1956
+	.8byte	.LBB1974
+	.8byte	.LBE1974
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1946
+	.8byte	.LBE1946
+	.8byte	.LBB1949
+	.8byte	.LBE1949
+	.8byte	.LBB1950
+	.8byte	.LBE1950
+	.8byte	.LBB1951
+	.8byte	.LBE1951
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1947
+	.8byte	.LBE1947
+	.8byte	.LBB1948
+	.8byte	.LBE1948
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1957
+	.8byte	.LBE1957
+	.8byte	.LBB1986
+	.8byte	.LBE1986
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1962
+	.8byte	.LBE1962
+	.8byte	.LBB1968
+	.8byte	.LBE1968
+	.8byte	.LBB1969
+	.8byte	.LBE1969
+	.8byte	.LBB1987
+	.8byte	.LBE1987
+	.8byte	.LBB1988
+	.8byte	.LBE1988
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1970
+	.8byte	.LBE1970
+	.8byte	.LBB1973
+	.8byte	.LBE1973
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1916
-	.8byte	.LBE1916
-	.8byte	.LBB1927
-	.8byte	.LBE1927
+	.8byte	.LBB1978
+	.8byte	.LBE1978
+	.8byte	.LBB1989
+	.8byte	.LBE1989
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1918
-	.8byte	.LBE1918
-	.8byte	.LBB1919
-	.8byte	.LBE1919
+	.8byte	.LBB1980
+	.8byte	.LBE1980
+	.8byte	.LBB1981
+	.8byte	.LBE1981
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1920
-	.8byte	.LBE1920
-	.8byte	.LBB1932
-	.8byte	.LBE1932
+	.8byte	.LBB1982
+	.8byte	.LBE1982
+	.8byte	.LBB1994
+	.8byte	.LBE1994
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1922
-	.8byte	.LBE1922
-	.8byte	.LBB1923
-	.8byte	.LBE1923
+	.8byte	.LBB1984
+	.8byte	.LBE1984
+	.8byte	.LBB1985
+	.8byte	.LBE1985
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1928
-	.8byte	.LBE1928
-	.8byte	.LBB1931
-	.8byte	.LBE1931
+	.8byte	.LBB1990
+	.8byte	.LBE1990
+	.8byte	.LBB1993
+	.8byte	.LBE1993
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1933
-	.8byte	.LBE1933
-	.8byte	.LBB1936
-	.8byte	.LBE1936
+	.8byte	.LBB1995
+	.8byte	.LBE1995
+	.8byte	.LBB1998
+	.8byte	.LBE1998
 	.8byte	0
 	.8byte	0
 	.8byte	.Ltext0
@@ -57649,7 +58114,7 @@ __exitcall_ebc_exit:
 .LASF594:
 	.string	"sched_class"
 .LASF3044:
-	.string	"__addressable_ebc_init3190"
+	.string	"__addressable_ebc_init3194"
 .LASF1985:
 	.string	"umount_end"
 .LASF692:

commit 828254f3a493dd2b0a1e95a43ec1fdbe9f073fc2
Author: Wang Panzhenzhuan <randy.wang@rock-chips.com>
Date:   Thu Dec 9 01:59:08 2021 +0000

    arm64: dts: rockchip: rk3326-evb-lp3-v10-avb: fix camera config
    
    Signed-off-by: Wang Panzhenzhuan <randy.wang@rock-chips.com>
    Change-Id: I3516e6cef2dbc1b3df4430cc73637968d6fea0dd

diff --git a/arch/arm64/boot/dts/rockchip/rk3326-evb-lp3-v10-avb.dts b/arch/arm64/boot/dts/rockchip/rk3326-evb-lp3-v10-avb.dts
index 4c12a79f814b..d8e0b6c50b3e 100644
--- a/arch/arm64/boot/dts/rockchip/rk3326-evb-lp3-v10-avb.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3326-evb-lp3-v10-avb.dts
@@ -77,7 +77,7 @@
 &rkisp1 {
 	status = "okay";
 	pinctrl-names = "default";
-	pinctrl-0 = <&cif_clkout_m0 &dvp_d0d1_m0 &dvp_d2d9_m0>;
+	pinctrl-0 = <&cif_clkout_m0>;
 	port {
 		#address-cells = <1>;
 		#size-cells = <0>;

commit 1ea2bb4a99fb39d011859f8eabda07b342199e84
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Wed Dec 8 11:38:32 2021 +0800

    arm64: dts: rockchip: config the pmic_sleep internal pull up/down for
    rk3566 eink boards
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: I7c9c31babd2ec700d522836eeadbe2e4ce6cc819

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts
index 957f6e897fbf..56831aba7741 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts
@@ -893,12 +893,12 @@
 
 		soc_slppin_gpio: soc_slppin_gpio {
 			rockchip,pins =
-				<0 RK_PA2 RK_FUNC_GPIO &pcfg_output_low>;
+				<0 RK_PA2 RK_FUNC_GPIO &pcfg_output_low_pull_down>;
 		};
 
 		soc_slppin_slp: soc_slppin_slp {
 			rockchip,pins =
-				<0 RK_PA2 1 &pcfg_pull_none>;
+				<0 RK_PA2 1 &pcfg_pull_up>;
 		};
 
 		soc_slppin_rst: soc_slppin_rst {
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w6.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w6.dts
index 015fdc4a740d..08e7d51f929a 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w6.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w6.dts
@@ -759,12 +759,12 @@
 
 		soc_slppin_gpio: soc_slppin_gpio {
 			rockchip,pins =
-				<0 RK_PA2 RK_FUNC_GPIO &pcfg_output_low>;
+				<0 RK_PA2 RK_FUNC_GPIO &pcfg_output_low_pull_down>;
 		};
 
 		soc_slppin_slp: soc_slppin_slp {
 			rockchip,pins =
-				<0 RK_PA2 1 &pcfg_pull_none>;
+				<0 RK_PA2 1 &pcfg_pull_up>;
 		};
 
 		soc_slppin_rst: soc_slppin_rst {

commit 70e7a473ce638bf74812fb27e58f97c38313e965
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Wed Dec 8 10:17:37 2021 +0800

    drm/rockchip: ebc_dev: release version v2.21
    
    ebc delay 200ms poweroff when no refresh request
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: Ica4c3b56d4ae92a83fbd965b14e4a434b2700729

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index fff705fe85ea..a15d1f0fefb5 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -1119,15 +1119,15 @@ get_overlay_image:
 	.type	waveform_open, %function
 waveform_open:
 .LFB2847:
-	.loc 1 2605 0
+	.loc 1 2615 0
 	.cfi_startproc
 .LVL62:
-	.loc 1 2609 0
+	.loc 1 2619 0
 	mov	w0, 0
 .LVL63:
-	.loc 1 2606 0
+	.loc 1 2616 0
 	str	xzr, [x1, 104]
-	.loc 1 2609 0
+	.loc 1 2619 0
 	ret
 	.cfi_endproc
 .LFE2847:
@@ -1137,22 +1137,22 @@ waveform_open:
 	.type	ebc_exit, %function
 ebc_exit:
 .LFB2867:
-	.loc 1 3176 0
+	.loc 1 3186 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3177 0
+	.loc 1 3187 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3176 0
+	.loc 1 3186 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3177 0
+	.loc 1 3187 0
 	bl	platform_driver_unregister
 .LVL64:
-	.loc 1 3178 0
+	.loc 1 3188 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1167,7 +1167,7 @@ ebc_exit:
 	.type	ebc_resume, %function
 ebc_resume:
 .LFB2865:
-	.loc 1 3138 0
+	.loc 1 3148 0
 	.cfi_startproc
 .LVL65:
 	stp	x29, x30, [sp, -32]!
@@ -1178,17 +1178,17 @@ ebc_resume:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-.LBB954:
-.LBB955:
+.LBB980:
+.LBB981:
 	.file 2 "./include/linux/device.h"
 	.loc 2 1181 0
 	ldr	x19, [x0, 184]
-.LBE955:
-.LBE954:
-	.loc 1 3142 0
+.LBE981:
+.LBE980:
+	.loc 1 3152 0
 	ldr	x1, [x19, 16]
-.LBB956:
-.LBB957:
+.LBB982:
+.LBB983:
 	.file 3 "drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic.h"
 	.loc 3 45 0
 	mov	x0, x1
@@ -1196,17 +1196,17 @@ ebc_resume:
 	ldr	x1, [x1, 48]
 	blr	x1
 .LVL67:
-.LBE957:
-.LBE956:
-	.loc 1 3143 0
+.LBE983:
+.LBE982:
+	.loc 1 3153 0
 	str	wzr, [x19, 804]
-	.loc 1 3144 0
+	.loc 1 3154 0
 	ldr	x0, [x19, 288]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
 .LVL68:
-	.loc 1 3147 0
+	.loc 1 3157 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -1223,44 +1223,44 @@ ebc_resume:
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
 .LFB2840:
-	.loc 1 2262 0
+	.loc 1 2272 0
 	.cfi_startproc
 .LVL69:
-	.loc 1 2263 0
+	.loc 1 2273 0
 	adrp	x0, .LANCHOR0
 .LVL70:
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2265 0
+	.loc 1 2275 0
 	ldr	w2, [x0, 624]
 	cbnz	w2, .L165
 	ret
 	.p2align 3
 .L165:
-	.loc 1 2262 0
+	.loc 1 2272 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-.LBB958:
-.LBB959:
+.LBB984:
+.LBB985:
 	.file 4 "./include/linux/wakelock.h"
 	.loc 4 68 0
 	add	x0, x0, 416
-.LBE959:
-.LBE958:
-	.loc 1 2262 0
+.LBE985:
+.LBE984:
+	.loc 1 2272 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2266 0
+	.loc 1 2276 0
 	str	wzr, [x0, 208]
-.LBB961:
-.LBB960:
+.LBB987:
+.LBB986:
 	.loc 4 68 0
 	bl	__pm_relax
 .LVL71:
-.LBE960:
-.LBE961:
-	.loc 1 2271 0
+.LBE986:
+.LBE987:
+	.loc 1 2281 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1274,27 +1274,27 @@ ebc_vdd_power_timeout:
 	.type	ebc_remove, %function
 ebc_remove:
 .LFB2863:
-	.loc 1 3114 0
+	.loc 1 3124 0
 	.cfi_startproc
 .LVL72:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3115 0
+	.loc 1 3125 0
 	adrp	x0, .LANCHOR1
 .LVL73:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3114 0
+	.loc 1 3124 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3115 0
+	.loc 1 3125 0
 	add	x0, x0, 224
-	.loc 1 3114 0
-	.loc 1 3115 0
+	.loc 1 3124 0
+	.loc 1 3125 0
 	bl	misc_deregister
 .LVL74:
-	.loc 1 3118 0
+	.loc 1 3128 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -1309,7 +1309,7 @@ ebc_remove:
 	.type	ebc_mmap, %function
 ebc_mmap:
 .LFB2844:
-	.loc 1 2551 0
+	.loc 1 2561 0
 	.cfi_startproc
 .LVL75:
 	stp	x29, x30, [sp, -32]!
@@ -1320,33 +1320,33 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2551 0
+	.loc 1 2561 0
 	mov	x19, x1
-	.loc 1 2554 0
+	.loc 1 2564 0
 	bl	ebc_phy_buf_base_get
 .LVL76:
-	.loc 1 2557 0
+	.loc 1 2567 0
 	lsr	x2, x0, 12
-	.loc 1 2555 0
+	.loc 1 2565 0
 	mov	x6, 16384
-	.loc 1 2557 0
+	.loc 1 2567 0
 	mov	x0, x19
-	.loc 1 2555 0
+	.loc 1 2565 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 2557 0
+	.loc 1 2567 0
 	ldp	x1, x3, [x19]
-	.loc 1 2555 0
+	.loc 1 2565 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 2557 0
+	.loc 1 2567 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
 .LVL77:
-	.loc 1 2560 0
+	.loc 1 2570 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 2563 0
+	.loc 1 2573 0
 	ldr	x19, [sp, 16]
 .LVL78:
 	csel	w0, w0, w1, eq
@@ -1364,47 +1364,47 @@ ebc_mmap:
 	.type	waveform_mmap, %function
 waveform_mmap:
 .LFB2846:
-	.loc 1 2589 0
+	.loc 1 2599 0
 	.cfi_startproc
 .LVL79:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2590 0
+	.loc 1 2600 0
 	adrp	x2, .LANCHOR0
-	.loc 1 2594 0
+	.loc 1 2604 0
 	mov	x7, 16384
-	.loc 1 2596 0
+	.loc 1 2606 0
 	mov	x0, x1
 .LVL80:
-	.loc 1 2589 0
+	.loc 1 2599 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2593 0
+	.loc 1 2603 0
 	ldr	x2, [x2, #:lo12:.LANCHOR0]
-	.loc 1 2594 0
+	.loc 1 2604 0
 	movk	x7, 0x404, lsl 16
 	ldp	x4, x5, [x1, 72]
-	.loc 1 2596 0
+	.loc 1 2606 0
 	ldp	x6, x3, [x1]
-	.loc 1 2594 0
+	.loc 1 2604 0
 	orr	x5, x5, x7
-	.loc 1 2593 0
+	.loc 1 2603 0
 	ldr	x2, [x2, 216]
-	.loc 1 2594 0
+	.loc 1 2604 0
 	str	x5, [x1, 80]
-	.loc 1 2596 0
+	.loc 1 2606 0
 	sub	x3, x3, x6
 	mov	x1, x6
 .LVL81:
 	lsr	x2, x2, 12
 	bl	remap_pfn_range
 .LVL82:
-	.loc 1 2599 0
+	.loc 1 2609 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 2602 0
+	.loc 1 2612 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1419,16 +1419,16 @@ waveform_mmap:
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
 .LFB2843:
-	.loc 1 2347 0
+	.loc 1 2357 0
 	.cfi_startproc
 .LVL83:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 2357 0
+	.loc 1 2367 0
 	cmp	w1, 28672
-	.loc 1 2347 0
+	.loc 1 2357 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -1442,15 +1442,15 @@ ebc_io_ctl:
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
 	.cfi_offset 23, -112
-	.loc 1 2347 0
+	.loc 1 2357 0
 	mov	x21, x2
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 2349 0
+	.loc 1 2359 0
 	adrp	x0, .LANCHOR0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2357 0
+	.loc 1 2367 0
 	bcc	.L177
 	mov	w0, 28675
 	cmp	w1, w0
@@ -1460,7 +1460,7 @@ ebc_io_ctl:
 	cmp	w0, 1
 	bls	.L178
 .L177:
-	.loc 1 2373 0
+	.loc 1 2383 0
 	mov	w0, 28677
 	cmp	w1, w0
 	beq	.L181
@@ -1476,13 +1476,13 @@ ebc_io_ctl:
 	mov	w0, 28683
 	cmp	w1, w0
 	bne	.L180
-	.loc 1 2528 0
+	.loc 1 2538 0
 	bl	ebc_empty_buf_get
 .LVL85:
 	mov	x23, x0
-	.loc 1 2529 0
+	.loc 1 2539 0
 	cbz	x0, .L201
-	.loc 1 2531 0
+	.loc 1 2541 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 408]
@@ -1493,18 +1493,18 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL86:
-	.loc 1 2532 0
+	.loc 1 2542 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL87:
 	sub	w0, w20, w0
-.LBB962:
-.LBB963:
-.LBB964:
-.LBB965:
-.LBB966:
-.LBB967:
-.LBB968:
+.LBB988:
+.LBB989:
+.LBB990:
+.LBB991:
+.LBB992:
+.LBB993:
+.LBB994:
 	.file 5 "./arch/arm64/include/asm/current.h"
 	.loc 5 19 0
 #APP
@@ -1513,27 +1513,27 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL88:
 #NO_APP
-.LBE968:
-.LBE967:
+.LBE994:
+.LBE993:
 	.file 6 "./arch/arm64/include/asm/uaccess.h"
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE966:
-.LBE965:
-.LBE964:
-.LBE963:
-.LBE962:
-	.loc 1 2534 0
+.LBE992:
+.LBE991:
+.LBE990:
+.LBE989:
+.LBE988:
+	.loc 1 2544 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 2533 0
+	.loc 1 2543 0
 	str	w0, [x29, 104]
-	.loc 1 2535 0
+	.loc 1 2545 0
 	stp	w4, w1, [x29, 112]
-.LBB993:
-.LBB990:
-.LBB987:
-.LBB977:
-.LBB975:
+.LBB1019:
+.LBB1016:
+.LBB1013:
+.LBB1003:
+.LBB1001:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL89:
@@ -1541,47 +1541,47 @@ ebc_io_ctl:
 	tbnz	x3, 21, .L238
 .LVL90:
 .L304:
-.LBB969:
-.LBB970:
-.LBB971:
+.LBB995:
+.LBB996:
+.LBB997:
 	.file 7 "./include/asm-generic/bitops/non-atomic.h"
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL91:
-.LBE971:
-.LBE970:
-.LBE969:
-.LBE975:
-.LBE977:
-.LBE987:
-.LBE990:
-.LBE993:
-	.loc 1 2348 0
+.LBE997:
+.LBE996:
+.LBE995:
+.LBE1001:
+.LBE1003:
+.LBE1013:
+.LBE1016:
+.LBE1019:
+	.loc 1 2358 0
 	mov	x0, x21
 .LVL92:
-.LBB994:
-.LBB991:
-.LBB988:
-.LBB978:
-.LBB976:
+.LBB1020:
+.LBB1017:
+.LBB1014:
+.LBB1004:
+.LBB1002:
 	.loc 6 84 0
 	tbz	x2, 26, .L239
 .LVL93:
 .L238:
-.LBB972:
-.LBB973:
-.LBB974:
+.LBB998:
+.LBB999:
+.LBB1000:
 	.file 8 "./include/linux/bitops.h"
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL94:
-.LBE974:
-.LBE973:
+.LBE1000:
+.LBE999:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL95:
 .L239:
-.LBE972:
+.LBE998:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1594,46 +1594,46 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL96:
 #NO_APP
-.LBE976:
-.LBE978:
+.LBE1002:
+.LBE1004:
 	.file 9 "./include/linux/uaccess.h"
 	.loc 9 132 0
 	mov	x22, 48
 	cbnz	x0, .L312
 .L240:
-.LBE988:
-.LBE991:
-.LBE994:
-	.loc 1 2537 0
+.LBE1014:
+.LBE1017:
+.LBE1020:
+	.loc 1 2547 0
 	mov	x0, x23
 .LVL97:
 	bl	ebc_buf_release
 .LVL98:
-	.loc 1 2538 0
+	.loc 1 2548 0
 	b	.L176
 .LVL99:
 	.p2align 3
 .L178:
-	.loc 1 2364 0
+	.loc 1 2374 0
 	cbnz	x21, .L177
-	.loc 1 2365 0
+	.loc 1 2375 0
 	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
 .LVL100:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC1
-	.loc 1 2366 0
+	.loc 1 2376 0
 	mov	x22, -14
-	.loc 1 2365 0
+	.loc 1 2375 0
 	bl	_dev_err
 .LVL101:
-	.loc 1 2366 0
+	.loc 1 2376 0
 	b	.L176
 .LVL102:
 	.p2align 3
 .L310:
-	.loc 1 2373 0
+	.loc 1 2383 0
 	mov	w0, 28674
 	cmp	w1, w0
 	beq	.L183
@@ -1644,23 +1644,23 @@ ebc_io_ctl:
 	mov	w0, 28676
 	cmp	w1, w0
 	bne	.L180
-	.loc 1 2459 0
+	.loc 1 2469 0
 	ldr	x0, [x20, 288]
-	.loc 1 2458 0
+	.loc 1 2468 0
 	mov	w2, 1
 	str	w2, [x20, 812]
-	.loc 1 2459 0
+	.loc 1 2469 0
 	adrp	x1, .LC2
 .LVL103:
-	.loc 1 2460 0
+	.loc 1 2470 0
 	mov	x22, 0
-	.loc 1 2459 0
+	.loc 1 2469 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
 .LVL104:
 	.p2align 2
 .L176:
-	.loc 1 2548 0
+	.loc 1 2558 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
 .LVL105:
@@ -1688,19 +1688,19 @@ ebc_io_ctl:
 	.p2align 3
 .L313:
 	.cfi_restore_state
-	.loc 1 2373 0
+	.loc 1 2383 0
 	cmp	w1, 28672
 	beq	.L185
 	mov	w0, 28673
 	cmp	w1, w0
 	bne	.L180
-.LBB995:
-.LBB996:
-.LBB997:
-.LBB998:
-.LBB999:
-.LBB1000:
-.LBB1001:
+.LBB1021:
+.LBB1022:
+.LBB1023:
+.LBB1024:
+.LBB1025:
+.LBB1026:
+.LBB1027:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1708,8 +1708,8 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL109:
 #NO_APP
-.LBE1001:
-.LBE1000:
+.LBE1027:
+.LBE1026:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
@@ -1719,19 +1719,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L315
 .LVL111:
 .L206:
-.LBB1002:
-.LBB1003:
-.LBB1004:
+.LBB1028:
+.LBB1029:
+.LBB1030:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL112:
-.LBE1004:
-.LBE1003:
+.LBE1030:
+.LBE1029:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL113:
 .L207:
-.LBE1002:
+.LBE1028:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1744,23 +1744,23 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL114:
 #NO_APP
-.LBE999:
-.LBE998:
+.LBE1025:
+.LBE1024:
 	.loc 9 114 0
 	cbz	x0, .L209
-.LBB1010:
-.LBB1011:
-.LBB1012:
-.LBB1013:
-.LBB1014:
+.LBB1036:
+.LBB1037:
+.LBB1038:
+.LBB1039:
+.LBB1040:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL115:
-.LBE1014:
-.LBE1013:
-.LBE1012:
-.LBB1015:
-.LBB1016:
+.LBE1040:
+.LBE1039:
+.LBE1038:
+.LBB1041:
+.LBB1042:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1768,13 +1768,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL116:
 #NO_APP
-.LBE1016:
-.LBE1015:
-.LBB1017:
+.LBE1042:
+.LBE1041:
+.LBB1043:
 	.loc 6 254 0
 	and	x0, x0, x21
 .LVL117:
-.LBE1017:
+.LBE1043:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1789,8 +1789,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1011:
-.LBE1010:
+.LBE1037:
+.LBE1036:
 	.loc 9 116 0
 	mov	x2, 48
 	add	x0, x29, 104
@@ -1799,80 +1799,80 @@ ebc_io_ctl:
 .LVL120:
 	.loc 9 118 0
 	cbnz	x0, .L209
-.LBE997:
-.LBE996:
-.LBE995:
-	.loc 1 2413 0
+.LBE1023:
+.LBE1022:
+.LBE1021:
+	.loc 1 2423 0
 	bl	ebc_phy_buf_base_get
 .LVL121:
 	ldrsw	x1, [x29, 104]
-	.loc 1 2414 0
+	.loc 1 2424 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
 .LVL122:
 	mov	x21, x0
 .LVL123:
-	.loc 1 2415 0
+	.loc 1 2425 0
 	cbz	x0, .L216
-	.loc 1 2416 0
+	.loc 1 2426 0
 	ldr	w1, [x29, 108]
-	.loc 1 2425 0
+	.loc 1 2435 0
 	add	x20, x20, 184
-	.loc 1 2416 0
+	.loc 1 2426 0
 	str	w1, [x21, 40]
-	.loc 1 2420 0
+	.loc 1 2430 0
 	ldp	w4, w2, [x29, 124]
 	stp	w4, w2, [x21, 48]
-	.loc 1 2419 0
+	.loc 1 2429 0
 	ldr	w3, [x29, 132]
-	.loc 1 2421 0
+	.loc 1 2431 0
 	ldr	w1, [x29, 136]
-	.loc 1 2417 0
+	.loc 1 2427 0
 	ldr	w5, [x29, 148]
-	.loc 1 2419 0
+	.loc 1 2429 0
 	str	w3, [x21, 56]
-	.loc 1 2417 0
+	.loc 1 2427 0
 	stp	w1, w5, [x21, 60]
-	.loc 1 2423 0
+	.loc 1 2433 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL124:
-	.loc 1 2425 0
+	.loc 1 2435 0
 	ldr	w0, [x20, 96]
 	cbz	w0, .L316
 .L211:
-	.loc 1 2429 0
+	.loc 1 2439 0
 	ldr	w0, [x21, 40]
 	cmp	w0, 18
 	beq	.L317
-	.loc 1 2429 0 is_stmt 0 discriminator 3
+	.loc 1 2439 0 is_stmt 0 discriminator 3
 	cmp	w0, 20
 	bne	.L216
 .L213:
-	.loc 1 2430 0 is_stmt 1
+	.loc 1 2440 0 is_stmt 1
 	mov	w0, 1
 	str	w0, [x20, 204]
-.LBB1024:
-.LBB1025:
-	.loc 1 2431 0
+.LBB1050:
+.LBB1051:
+	.loc 1 2441 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
 .LVL125:
 	adrp	x0, .LANCHOR1
-.LBB1026:
+.LBB1052:
 	add	x0, x0, :lo12:.LANCHOR1
 	add	x21, x0, 328
 	b	.L217
 	.p2align 3
 .L318:
 .LVL126:
-	.loc 1 2431 0 is_stmt 0 discriminator 5
+	.loc 1 2441 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L216
-	.loc 1 2431 0 discriminator 7
+	.loc 1 2441 0 discriminator 7
 	bl	schedule
 .LVL127:
 .L217:
-	.loc 1 2431 0 discriminator 9
+	.loc 1 2441 0 discriminator 9
 	add	x1, x29, 64
 	mov	w2, 1
 	mov	x0, x21
@@ -1880,8 +1880,8 @@ ebc_io_ctl:
 .LVL128:
 	ldr	w1, [x20, 204]
 	cbnz	w1, .L318
-.LBE1026:
-	.loc 1 2431 0 discriminator 4
+.LBE1052:
+	.loc 1 2441 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
 	bl	finish_wait
@@ -1893,15 +1893,15 @@ ebc_io_ctl:
 .LVL130:
 	.p2align 3
 .L193:
-.LBE1025:
-.LBE1024:
-	.loc 1 2515 0 is_stmt 1
+.LBE1051:
+.LBE1050:
+	.loc 1 2525 0 is_stmt 1
 	bl	ebc_empty_buf_get
 .LVL131:
 	mov	x23, x0
-	.loc 1 2516 0
+	.loc 1 2526 0
 	cbz	x0, .L201
-	.loc 1 2518 0
+	.loc 1 2528 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 344]
@@ -1911,20 +1911,20 @@ ebc_io_ctl:
 .LVL132:
 	.p2align 3
 .L311:
-	.loc 1 2373 0
+	.loc 1 2383 0
 	mov	w0, 28678
 	cmp	w1, w0
 	beq	.L191
 	mov	w0, 28679
 	cmp	w1, w0
 	bne	.L180
-.LBB1030:
-.LBB1031:
-.LBB1032:
-.LBB1033:
-.LBB1034:
-.LBB1035:
-.LBB1036:
+.LBB1056:
+.LBB1057:
+.LBB1058:
+.LBB1059:
+.LBB1060:
+.LBB1061:
+.LBB1062:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1932,8 +1932,8 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL133:
 #NO_APP
-.LBE1036:
-.LBE1035:
+.LBE1062:
+.LBE1061:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
@@ -1943,19 +1943,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L319
 .LVL135:
 .L218:
-.LBB1037:
-.LBB1038:
-.LBB1039:
+.LBB1063:
+.LBB1064:
+.LBB1065:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL136:
-.LBE1039:
-.LBE1038:
+.LBE1065:
+.LBE1064:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL137:
 .L219:
-.LBE1037:
+.LBE1063:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1968,23 +1968,23 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL138:
 #NO_APP
-.LBE1034:
-.LBE1033:
+.LBE1060:
+.LBE1059:
 	.loc 9 114 0
 	cbz	x0, .L209
-.LBB1045:
-.LBB1046:
-.LBB1047:
-.LBB1048:
-.LBB1049:
+.LBB1071:
+.LBB1072:
+.LBB1073:
+.LBB1074:
+.LBB1075:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL139:
-.LBE1049:
-.LBE1048:
-.LBE1047:
-.LBB1050:
-.LBB1051:
+.LBE1075:
+.LBE1074:
+.LBE1073:
+.LBB1076:
+.LBB1077:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1992,13 +1992,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL140:
 #NO_APP
-.LBE1051:
-.LBE1050:
-.LBB1052:
+.LBE1077:
+.LBE1076:
+.LBB1078:
 	.loc 6 254 0
 	and	x0, x0, x21
 .LVL141:
-.LBE1052:
+.LBE1078:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -2013,8 +2013,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1046:
-.LBE1045:
+.LBE1072:
+.LBE1071:
 	.loc 9 116 0
 	mov	x2, 48
 	add	x0, x29, 104
@@ -2023,39 +2023,39 @@ ebc_io_ctl:
 .LVL144:
 	.loc 9 118 0
 	cbnz	x0, .L209
-.LBE1032:
-.LBE1031:
-.LBE1030:
-	.loc 1 2440 0
+.LBE1058:
+.LBE1057:
+.LBE1056:
+	.loc 1 2450 0
 	bl	ebc_osd_buf_clone
 .LVL145:
 	mov	x1, x0
-	.loc 1 2441 0
+	.loc 1 2451 0
 	cbz	x0, .L216
-	.loc 1 2442 0
+	.loc 1 2452 0
 	ldr	w6, [x29, 108]
-	.loc 1 2451 0
+	.loc 1 2461 0
 	add	x20, x20, 184
-	.loc 1 2446 0
+	.loc 1 2456 0
 	ldp	w5, w3, [x29, 124]
-	.loc 1 2442 0
+	.loc 1 2452 0
 	str	w6, [x1, 40]
-	.loc 1 2447 0
+	.loc 1 2457 0
 	ldp	w4, w2, [x29, 132]
-	.loc 1 2446 0
+	.loc 1 2456 0
 	stp	w5, w3, [x1, 48]
-	.loc 1 2447 0
+	.loc 1 2457 0
 	stp	w4, w2, [x1, 56]
-	.loc 1 2449 0
+	.loc 1 2459 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL146:
-	.loc 1 2451 0
+	.loc 1 2461 0
 	ldr	w0, [x20, 96]
 	cbnz	w0, .L216
-	.loc 1 2452 0
+	.loc 1 2462 0
 	mov	w2, 1
 	str	w2, [x20, 96]
-	.loc 1 2453 0
+	.loc 1 2463 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -2067,22 +2067,22 @@ ebc_io_ctl:
 .LVL148:
 	.p2align 3
 .L312:
-.LBB1059:
-.LBB992:
-.LBB989:
-.LBB979:
-.LBB980:
-.LBB981:
-.LBB982:
-.LBB983:
+.LBB1085:
+.LBB1018:
+.LBB1015:
+.LBB1005:
+.LBB1006:
+.LBB1007:
+.LBB1008:
+.LBB1009:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL149:
-.LBE983:
-.LBE982:
-.LBE981:
-.LBB984:
-.LBB985:
+.LBE1009:
+.LBE1008:
+.LBE1007:
+.LBB1010:
+.LBB1011:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2090,13 +2090,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL150:
 #NO_APP
-.LBE985:
-.LBE984:
-.LBB986:
+.LBE1011:
+.LBE1010:
+.LBB1012:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL151:
-.LBE986:
+.LBE1012:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL152:
@@ -2112,8 +2112,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE980:
-.LBE979:
+.LBE1006:
+.LBE1005:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
@@ -2125,27 +2125,27 @@ ebc_io_ctl:
 .LVL156:
 	.p2align 3
 .L191:
-.LBE989:
-.LBE992:
-.LBE1059:
-	.loc 1 2375 0
+.LBE1015:
+.LBE1018:
+.LBE1085:
+	.loc 1 2385 0
 	bl	ebc_osd_buf_get
 .LVL157:
-	.loc 1 2376 0
+	.loc 1 2386 0
 	cbz	x0, .L201
-	.loc 1 2379 0
+	.loc 1 2389 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL158:
-	.loc 1 2384 0
+	.loc 1 2394 0
 	ldr	w1, [x20, 176]
-.LBB1060:
-.LBB1061:
-.LBB1062:
-.LBB1063:
-.LBB1064:
-.LBB1065:
-.LBB1066:
+.LBB1086:
+.LBB1087:
+.LBB1088:
+.LBB1089:
+.LBB1090:
+.LBB1091:
+.LBB1092:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2153,34 +2153,34 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL159:
 #NO_APP
-.LBE1066:
-.LBE1065:
+.LBE1092:
+.LBE1091:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1064:
-.LBE1063:
-.LBE1062:
-.LBE1061:
-.LBE1060:
-	.loc 1 2379 0
+.LBE1090:
+.LBE1089:
+.LBE1088:
+.LBE1087:
+.LBE1086:
+	.loc 1 2389 0
 	sub	w0, w22, w0
-	.loc 1 2383 0
+	.loc 1 2393 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 2384 0
+	.loc 1 2394 0
 	str	w1, [x29, 120]
-	.loc 1 2382 0
+	.loc 1 2392 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 2385 0
+	.loc 1 2395 0
 	mov	w1, 16
-	.loc 1 2381 0
+	.loc 1 2391 0
 	str	w0, [x29, 104]
-	.loc 1 2385 0
+	.loc 1 2395 0
 	str	w1, [x29, 148]
-.LBB1093:
-.LBB1090:
-.LBB1087:
-.LBB1076:
-.LBB1073:
+.LBB1119:
+.LBB1116:
+.LBB1113:
+.LBB1102:
+.LBB1099:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL160:
@@ -2188,19 +2188,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L320
 .LVL161:
 .L197:
-.LBB1067:
-.LBB1068:
-.LBB1069:
+.LBB1093:
+.LBB1094:
+.LBB1095:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL162:
-.LBE1069:
-.LBE1068:
+.LBE1095:
+.LBE1094:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL163:
 .L198:
-.LBE1067:
+.LBE1093:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2213,24 +2213,24 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL164:
 #NO_APP
-.LBE1073:
-.LBE1076:
+.LBE1099:
+.LBE1102:
 	.loc 9 132 0
 	mov	x22, 48
 	cbz	x0, .L176
-.LBB1077:
-.LBB1078:
-.LBB1079:
-.LBB1080:
-.LBB1081:
+.LBB1103:
+.LBB1104:
+.LBB1105:
+.LBB1106:
+.LBB1107:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL165:
-.LBE1081:
-.LBE1080:
-.LBE1079:
-.LBB1082:
-.LBB1083:
+.LBE1107:
+.LBE1106:
+.LBE1105:
+.LBB1108:
+.LBB1109:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2238,13 +2238,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL166:
 #NO_APP
-.LBE1083:
-.LBE1082:
-.LBB1084:
+.LBE1109:
+.LBE1108:
+.LBB1110:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL167:
-.LBE1084:
+.LBE1110:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL168:
@@ -2260,8 +2260,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1078:
-.LBE1077:
+.LBE1104:
+.LBE1103:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
@@ -2273,16 +2273,16 @@ ebc_io_ctl:
 .LVL172:
 	.p2align 3
 .L187:
-.LBE1087:
-.LBE1090:
-.LBE1093:
-.LBB1094:
-.LBB1095:
-.LBB1096:
-.LBB1097:
-.LBB1098:
-.LBB1099:
-.LBB1100:
+.LBE1113:
+.LBE1116:
+.LBE1119:
+.LBB1120:
+.LBB1121:
+.LBB1122:
+.LBB1123:
+.LBB1124:
+.LBB1125:
+.LBB1126:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2290,22 +2290,22 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL173:
 #NO_APP
-.LBE1100:
-.LBE1099:
+.LBE1126:
+.LBE1125:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
-.LBE1098:
-.LBE1097:
-.LBE1096:
-.LBE1095:
-.LBE1094:
-	.loc 1 2467 0
+.LBE1124:
+.LBE1123:
+.LBE1122:
+.LBE1121:
+.LBE1120:
+	.loc 1 2477 0
 	add	x22, x20, 248
-.LBB1129:
-.LBB1125:
-.LBB1121:
-.LBB1110:
-.LBB1107:
+.LBB1155:
+.LBB1151:
+.LBB1147:
+.LBB1136:
+.LBB1133:
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
 .LVL174:
@@ -2313,19 +2313,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L321
 .LVL175:
 .L221:
-.LBB1101:
-.LBB1102:
-.LBB1103:
+.LBB1127:
+.LBB1128:
+.LBB1129:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL176:
-.LBE1103:
-.LBE1102:
+.LBE1129:
+.LBE1128:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL177:
 .L222:
-.LBE1101:
+.LBE1127:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2339,22 +2339,22 @@ ebc_io_ctl:
 .LVL178:
 #NO_APP
 	mov	x3, x0
-.LBE1107:
-.LBE1110:
-	.loc 9 114 0
+.LBE1133:
+.LBE1136:
+	.loc 9 114 0
 	cbz	x0, .L250
-.LBB1111:
-.LBB1112:
-.LBB1113:
-.LBB1114:
-.LBB1115:
+.LBB1137:
+.LBB1138:
+.LBB1139:
+.LBB1140:
+.LBB1141:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LBE1115:
-.LBE1114:
-.LBE1113:
-.LBB1116:
-.LBB1117:
+.LBE1141:
+.LBE1140:
+.LBE1139:
+.LBB1142:
+.LBB1143:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2362,13 +2362,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL179:
 #NO_APP
-.LBE1117:
-.LBE1116:
-.LBB1118:
+.LBE1143:
+.LBE1142:
+.LBB1144:
 	.loc 6 254 0
 	and	x0, x0, x21
 .LVL180:
-.LBE1118:
+.LBE1144:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -2383,8 +2383,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1112:
-.LBE1111:
+.LBE1138:
+.LBE1137:
 	.loc 9 116 0
 	mov	x2, 4
 	mov	x0, x22
@@ -2393,52 +2393,52 @@ ebc_io_ctl:
 .LVL183:
 	.loc 9 118 0
 	cbnz	x0, .L322
-.LBE1121:
-.LBE1125:
-.LBE1129:
-	.loc 1 2471 0
+.LBE1147:
+.LBE1151:
+.LBE1155:
+	.loc 1 2481 0
 	add	x20, x20, 184
 	ldr	w2, [x20, 64]
 	ldr	x0, [x20, 104]
 .LVL184:
-	.loc 1 2472 0
+	.loc 1 2482 0
 	mov	x22, 0
-	.loc 1 2471 0
+	.loc 1 2481 0
 	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	_dev_info
 .LVL185:
-	.loc 1 2472 0
+	.loc 1 2482 0
 	b	.L176
 .LVL186:
 	.p2align 3
 .L181:
-	.loc 1 2464 0
+	.loc 1 2474 0
 	ldr	x0, [x20, 288]
 	adrp	x1, .LC3
 .LVL187:
-	.loc 1 2462 0
+	.loc 1 2472 0
 	str	wzr, [x20, 812]
-	.loc 1 2465 0
+	.loc 1 2475 0
 	mov	x22, 0
-	.loc 1 2463 0
+	.loc 1 2473 0
 	str	wzr, [x20, 816]
-	.loc 1 2464 0
+	.loc 1 2474 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
 .LVL188:
-	.loc 1 2465 0
+	.loc 1 2475 0
 	b	.L176
 .LVL189:
 	.p2align 3
 .L189:
-	.loc 1 2502 0
+	.loc 1 2512 0
 	bl	ebc_empty_buf_get
 .LVL190:
 	mov	x23, x0
-	.loc 1 2503 0
+	.loc 1 2513 0
 	cbz	x0, .L201
-	.loc 1 2505 0
+	.loc 1 2515 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 336]
@@ -2448,13 +2448,13 @@ ebc_io_ctl:
 .LVL191:
 	.p2align 3
 .L194:
-	.loc 1 2489 0
+	.loc 1 2499 0
 	bl	ebc_empty_buf_get
 .LVL192:
 	mov	x23, x0
-	.loc 1 2490 0
+	.loc 1 2500 0
 	cbz	x0, .L201
-	.loc 1 2492 0
+	.loc 1 2502 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 328]
@@ -2463,18 +2463,18 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL193:
-	.loc 1 2493 0
+	.loc 1 2503 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL194:
 	sub	w0, w20, w0
-.LBB1130:
-.LBB1131:
-.LBB1132:
-.LBB1133:
-.LBB1134:
-.LBB1135:
-.LBB1136:
+.LBB1156:
+.LBB1157:
+.LBB1158:
+.LBB1159:
+.LBB1160:
+.LBB1161:
+.LBB1162:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2482,26 +2482,26 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL195:
 #NO_APP
-.LBE1136:
-.LBE1135:
+.LBE1162:
+.LBE1161:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1134:
-.LBE1133:
-.LBE1132:
-.LBE1131:
-.LBE1130:
-	.loc 1 2496 0
+.LBE1160:
+.LBE1159:
+.LBE1158:
+.LBE1157:
+.LBE1156:
+	.loc 1 2506 0
 	ldp	w4, w1, [x22, 84]
-	.loc 1 2494 0
+	.loc 1 2504 0
 	str	w0, [x29, 104]
-	.loc 1 2495 0
+	.loc 1 2505 0
 	stp	w1, w4, [x29, 112]
-.LBB1141:
-.LBB1140:
-.LBB1139:
-.LBB1138:
-.LBB1137:
+.LBB1167:
+.LBB1166:
+.LBB1165:
+.LBB1164:
+.LBB1163:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL196:
@@ -2511,21 +2511,21 @@ ebc_io_ctl:
 .LVL197:
 	.p2align 3
 .L183:
-.LBE1137:
-.LBE1138:
-.LBE1139:
-.LBE1140:
-.LBE1141:
-	.loc 1 2478 0
+.LBE1163:
+.LBE1164:
+.LBE1165:
+.LBE1166:
+.LBE1167:
+	.loc 1 2488 0
 	ldp	w1, w0, [x20, 116]
 .LVL198:
-.LBB1142:
-.LBB1143:
-.LBB1144:
-.LBB1145:
-.LBB1146:
-.LBB1147:
-.LBB1148:
+.LBB1168:
+.LBB1169:
+.LBB1170:
+.LBB1171:
+.LBB1172:
+.LBB1173:
+.LBB1174:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2533,34 +2533,34 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL199:
 #NO_APP
-.LBE1148:
-.LBE1147:
+.LBE1174:
+.LBE1173:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1146:
-.LBE1145:
-.LBE1144:
-.LBE1143:
-.LBE1142:
-	.loc 1 2475 0
+.LBE1172:
+.LBE1171:
+.LBE1170:
+.LBE1169:
+.LBE1168:
+	.loc 1 2485 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 2478 0
+	.loc 1 2488 0
 	stp	w1, w0, [x29, 140]
-	.loc 1 2476 0
+	.loc 1 2486 0
 	ldr	w4, [x20, 176]
-	.loc 1 2479 0
+	.loc 1 2489 0
 	mov	w0, 16
-	.loc 1 2474 0
+	.loc 1 2484 0
 	stp	w5, w6, [x29, 112]
-	.loc 1 2476 0
+	.loc 1 2486 0
 	str	w4, [x29, 120]
-	.loc 1 2479 0
+	.loc 1 2489 0
 	str	w0, [x29, 148]
-.LBB1177:
-.LBB1173:
-.LBB1169:
-.LBB1158:
-.LBB1155:
+.LBB1203:
+.LBB1199:
+.LBB1195:
+.LBB1184:
+.LBB1181:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL200:
@@ -2568,19 +2568,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L323
 .LVL201:
 .L225:
-.LBB1149:
-.LBB1150:
-.LBB1151:
+.LBB1175:
+.LBB1176:
+.LBB1177:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL202:
-.LBE1151:
-.LBE1150:
+.LBE1177:
+.LBE1176:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL203:
 .L226:
-.LBE1149:
+.LBE1175:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2593,66 +2593,66 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL204:
 #NO_APP
-.LBE1155:
-.LBE1158:
+.LBE1181:
+.LBE1184:
 	.loc 9 132 0
 	cbnz	x0, .L227
 .L228:
-.LBE1169:
-.LBE1173:
-.LBE1177:
-	.loc 1 2482 0
+.LBE1195:
+.LBE1199:
+.LBE1203:
+	.loc 1 2492 0
 	ldr	x0, [x20, 288]
 .LVL205:
 	adrp	x1, .LC5
 .LVL206:
-	.loc 1 2483 0
+	.loc 1 2493 0
 	mov	x22, -14
-	.loc 1 2482 0
+	.loc 1 2492 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
 .LVL207:
-	.loc 1 2483 0
+	.loc 1 2493 0
 	b	.L176
 .LVL208:
 	.p2align 3
 .L180:
-	.loc 1 2543 0
+	.loc 1 2553 0
 	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
 .LVL209:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
-	.loc 1 2544 0
+	.loc 1 2554 0
 	mov	x22, 0
-	.loc 1 2543 0
+	.loc 1 2553 0
 	bl	_dev_err
 .LVL210:
-	.loc 1 2547 0
+	.loc 1 2557 0
 	b	.L176
 .LVL211:
 	.p2align 3
 .L185:
-	.loc 1 2390 0
+	.loc 1 2400 0
 	bl	ebc_empty_buf_get
 .LVL212:
 	mov	x23, x0
-	.loc 1 2391 0
+	.loc 1 2401 0
 	cbz	x0, .L201
-	.loc 1 2394 0
+	.loc 1 2404 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL213:
-	.loc 1 2399 0
+	.loc 1 2409 0
 	ldr	w1, [x20, 176]
-.LBB1178:
-.LBB1179:
-.LBB1180:
-.LBB1181:
-.LBB1182:
-.LBB1183:
-.LBB1184:
+.LBB1204:
+.LBB1205:
+.LBB1206:
+.LBB1207:
+.LBB1208:
+.LBB1209:
+.LBB1210:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2660,34 +2660,34 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL214:
 #NO_APP
-.LBE1184:
-.LBE1183:
+.LBE1210:
+.LBE1209:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1182:
-.LBE1181:
-.LBE1180:
-.LBE1179:
-.LBE1178:
-	.loc 1 2394 0
+.LBE1208:
+.LBE1207:
+.LBE1206:
+.LBE1205:
+.LBE1204:
+	.loc 1 2404 0
 	sub	w0, w22, w0
-	.loc 1 2398 0
+	.loc 1 2408 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 2399 0
+	.loc 1 2409 0
 	str	w1, [x29, 120]
-	.loc 1 2397 0
+	.loc 1 2407 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 2400 0
+	.loc 1 2410 0
 	mov	w1, 16
-	.loc 1 2396 0
+	.loc 1 2406 0
 	str	w0, [x29, 104]
-	.loc 1 2400 0
+	.loc 1 2410 0
 	str	w1, [x29, 148]
-.LBB1213:
-.LBB1209:
-.LBB1205:
-.LBB1194:
-.LBB1191:
+.LBB1239:
+.LBB1235:
+.LBB1231:
+.LBB1220:
+.LBB1217:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL215:
@@ -2695,19 +2695,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L324
 .LVL216:
 .L202:
-.LBB1185:
-.LBB1186:
-.LBB1187:
+.LBB1211:
+.LBB1212:
+.LBB1213:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL217:
-.LBE1187:
-.LBE1186:
+.LBE1213:
+.LBE1212:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL218:
 .L203:
-.LBE1185:
+.LBE1211:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2720,268 +2720,268 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL219:
 #NO_APP
-.LBE1191:
-.LBE1194:
+.LBE1217:
+.LBE1220:
 	.loc 9 132 0
 	cbnz	x0, .L204
 .L205:
-.LBE1205:
-.LBE1209:
-.LBE1213:
-	.loc 1 2404 0
+.LBE1231:
+.LBE1235:
+.LBE1239:
+	.loc 1 2414 0
 	mov	x0, x23
 .LVL220:
-	.loc 1 2405 0
+	.loc 1 2415 0
 	mov	x22, -14
-	.loc 1 2404 0
+	.loc 1 2414 0
 	bl	ebc_buf_release
 .LVL221:
-	.loc 1 2405 0
+	.loc 1 2415 0
 	b	.L176
 .LVL222:
 	.p2align 3
 .L319:
-.LBB1214:
-.LBB1057:
-.LBB1055:
-.LBB1053:
-.LBB1043:
-.LBB1040:
-.LBB1041:
-.LBB1042:
+.LBB1240:
+.LBB1083:
+.LBB1081:
+.LBB1079:
+.LBB1069:
+.LBB1066:
+.LBB1067:
+.LBB1068:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1042:
-.LBE1041:
-.LBE1040:
-.LBE1043:
-.LBE1053:
-.LBE1055:
-.LBE1057:
-.LBE1214:
-	.loc 1 2348 0
+.LBE1068:
+.LBE1067:
+.LBE1066:
+.LBE1069:
+.LBE1079:
+.LBE1081:
+.LBE1083:
+.LBE1240:
+	.loc 1 2358 0
 	mov	x0, x21
 .LVL223:
-.LBB1215:
-.LBB1058:
-.LBB1056:
-.LBB1054:
-.LBB1044:
+.LBB1241:
+.LBB1084:
+.LBB1082:
+.LBB1080:
+.LBB1070:
 	.loc 6 84 0
 	tbz	x2, 26, .L219
 	b	.L218
 .LVL224:
 	.p2align 3
 .L315:
-.LBE1044:
-.LBE1054:
-.LBE1056:
-.LBE1058:
-.LBE1215:
-.LBB1216:
-.LBB1022:
-.LBB1020:
-.LBB1018:
-.LBB1008:
-.LBB1005:
-.LBB1006:
-.LBB1007:
+.LBE1070:
+.LBE1080:
+.LBE1082:
+.LBE1084:
+.LBE1241:
+.LBB1242:
+.LBB1048:
+.LBB1046:
+.LBB1044:
+.LBB1034:
+.LBB1031:
+.LBB1032:
+.LBB1033:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1007:
-.LBE1006:
-.LBE1005:
-.LBE1008:
-.LBE1018:
-.LBE1020:
-.LBE1022:
-.LBE1216:
-	.loc 1 2348 0
+.LBE1033:
+.LBE1032:
+.LBE1031:
+.LBE1034:
+.LBE1044:
+.LBE1046:
+.LBE1048:
+.LBE1242:
+	.loc 1 2358 0
 	mov	x0, x21
 .LVL225:
-.LBB1217:
-.LBB1023:
-.LBB1021:
-.LBB1019:
-.LBB1009:
+.LBB1243:
+.LBB1049:
+.LBB1047:
+.LBB1045:
+.LBB1035:
 	.loc 6 84 0
 	tbz	x2, 26, .L207
 	b	.L206
 .LVL226:
 	.p2align 3
 .L323:
-.LBE1009:
-.LBE1019:
-.LBE1021:
-.LBE1023:
-.LBE1217:
-.LBB1218:
-.LBB1174:
-.LBB1170:
-.LBB1159:
-.LBB1156:
-.LBB1152:
-.LBB1153:
-.LBB1154:
+.LBE1035:
+.LBE1045:
+.LBE1047:
+.LBE1049:
+.LBE1243:
+.LBB1244:
+.LBB1200:
+.LBB1196:
+.LBB1185:
+.LBB1182:
+.LBB1178:
+.LBB1179:
+.LBB1180:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL227:
-.LBE1154:
-.LBE1153:
-.LBE1152:
-.LBE1156:
-.LBE1159:
-.LBE1170:
-.LBE1174:
-.LBE1218:
-	.loc 1 2348 0
+.LBE1180:
+.LBE1179:
+.LBE1178:
+.LBE1182:
+.LBE1185:
+.LBE1196:
+.LBE1200:
+.LBE1244:
+	.loc 1 2358 0
 	mov	x0, x21
 .LVL228:
-.LBB1219:
-.LBB1175:
-.LBB1171:
-.LBB1160:
-.LBB1157:
+.LBB1245:
+.LBB1201:
+.LBB1197:
+.LBB1186:
+.LBB1183:
 	.loc 6 84 0
 	tbz	x2, 26, .L226
 	b	.L225
 .LVL229:
 	.p2align 3
 .L321:
-.LBE1157:
-.LBE1160:
-.LBE1171:
-.LBE1175:
-.LBE1219:
-.LBB1220:
-.LBB1126:
-.LBB1122:
-.LBB1119:
-.LBB1108:
-.LBB1104:
-.LBB1105:
-.LBB1106:
+.LBE1183:
+.LBE1186:
+.LBE1197:
+.LBE1201:
+.LBE1245:
+.LBB1246:
+.LBB1152:
+.LBB1148:
+.LBB1145:
+.LBB1134:
+.LBB1130:
+.LBB1131:
+.LBB1132:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1106:
-.LBE1105:
-.LBE1104:
-.LBE1108:
-.LBE1119:
-.LBE1122:
-.LBE1126:
-.LBE1220:
-	.loc 1 2348 0
+.LBE1132:
+.LBE1131:
+.LBE1130:
+.LBE1134:
+.LBE1145:
+.LBE1148:
+.LBE1152:
+.LBE1246:
+	.loc 1 2358 0
 	mov	x0, x21
 .LVL230:
-.LBB1221:
-.LBB1127:
-.LBB1123:
-.LBB1120:
-.LBB1109:
+.LBB1247:
+.LBB1153:
+.LBB1149:
+.LBB1146:
+.LBB1135:
 	.loc 6 84 0
 	tbz	x2, 26, .L222
 	b	.L221
 .LVL231:
 	.p2align 3
 .L324:
-.LBE1109:
-.LBE1120:
-.LBE1123:
-.LBE1127:
-.LBE1221:
-.LBB1222:
-.LBB1210:
-.LBB1206:
-.LBB1195:
-.LBB1192:
-.LBB1188:
-.LBB1189:
-.LBB1190:
+.LBE1135:
+.LBE1146:
+.LBE1149:
+.LBE1153:
+.LBE1247:
+.LBB1248:
+.LBB1236:
+.LBB1232:
+.LBB1221:
+.LBB1218:
+.LBB1214:
+.LBB1215:
+.LBB1216:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL232:
-.LBE1190:
-.LBE1189:
-.LBE1188:
-.LBE1192:
-.LBE1195:
-.LBE1206:
-.LBE1210:
-.LBE1222:
-	.loc 1 2348 0
+.LBE1216:
+.LBE1215:
+.LBE1214:
+.LBE1218:
+.LBE1221:
+.LBE1232:
+.LBE1236:
+.LBE1248:
+	.loc 1 2358 0
 	mov	x0, x21
 .LVL233:
-.LBB1223:
-.LBB1211:
-.LBB1207:
-.LBB1196:
-.LBB1193:
+.LBB1249:
+.LBB1237:
+.LBB1233:
+.LBB1222:
+.LBB1219:
 	.loc 6 84 0
 	tbz	x2, 26, .L203
 	b	.L202
 .LVL234:
 	.p2align 3
 .L320:
-.LBE1193:
-.LBE1196:
-.LBE1207:
-.LBE1211:
-.LBE1223:
-.LBB1224:
-.LBB1091:
-.LBB1088:
-.LBB1085:
-.LBB1074:
-.LBB1070:
-.LBB1071:
-.LBB1072:
+.LBE1219:
+.LBE1222:
+.LBE1233:
+.LBE1237:
+.LBE1249:
+.LBB1250:
+.LBB1117:
+.LBB1114:
+.LBB1111:
+.LBB1100:
+.LBB1096:
+.LBB1097:
+.LBB1098:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL235:
-.LBE1072:
-.LBE1071:
-.LBE1070:
-.LBE1074:
-.LBE1085:
-.LBE1088:
-.LBE1091:
-.LBE1224:
-	.loc 1 2348 0
+.LBE1098:
+.LBE1097:
+.LBE1096:
+.LBE1100:
+.LBE1111:
+.LBE1114:
+.LBE1117:
+.LBE1250:
+	.loc 1 2358 0
 	mov	x0, x21
 .LVL236:
-.LBB1225:
-.LBB1092:
-.LBB1089:
-.LBB1086:
-.LBB1075:
+.LBB1251:
+.LBB1118:
+.LBB1115:
+.LBB1112:
+.LBB1101:
 	.loc 6 84 0
 	tbz	x2, 26, .L198
 	b	.L197
 .LVL237:
 	.p2align 3
 .L227:
-.LBE1075:
-.LBE1086:
-.LBE1089:
-.LBE1092:
-.LBE1225:
-.LBB1226:
-.LBB1176:
-.LBB1172:
-.LBB1161:
-.LBB1162:
-.LBB1163:
-.LBB1164:
-.LBB1165:
+.LBE1101:
+.LBE1112:
+.LBE1115:
+.LBE1118:
+.LBE1251:
+.LBB1252:
+.LBB1202:
+.LBB1198:
+.LBB1187:
+.LBB1188:
+.LBB1189:
+.LBB1190:
+.LBB1191:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL238:
-.LBE1165:
-.LBE1164:
-.LBE1163:
-.LBB1166:
-.LBB1167:
+.LBE1191:
+.LBE1190:
+.LBE1189:
+.LBB1192:
+.LBB1193:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2989,13 +2989,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL239:
 #NO_APP
-.LBE1167:
-.LBE1166:
-.LBB1168:
+.LBE1193:
+.LBE1192:
+.LBB1194:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL240:
-.LBE1168:
+.LBE1194:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL241:
@@ -3011,44 +3011,44 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1162:
-.LBE1161:
+.LBE1188:
+.LBE1187:
 	.loc 9 134 0
 	mov	x2, 48
 	add	x1, x29, 104
 .LVL243:
 	bl	__arch_copy_to_user
 .LVL244:
-.LBE1172:
-.LBE1176:
-.LBE1226:
-	.loc 1 2481 0
+.LBE1198:
+.LBE1202:
+.LBE1252:
+	.loc 1 2491 0
 	cbnz	x0, .L228
-.LBB1227:
-.LBB1027:
+.LBB1253:
+.LBB1053:
 	mov	x22, 0
 	b	.L176
 .LVL245:
 	.p2align 3
 .L204:
-.LBE1027:
-.LBE1227:
-.LBB1228:
-.LBB1212:
-.LBB1208:
-.LBB1197:
-.LBB1198:
-.LBB1199:
-.LBB1200:
-.LBB1201:
+.LBE1053:
+.LBE1253:
+.LBB1254:
+.LBB1238:
+.LBB1234:
+.LBB1223:
+.LBB1224:
+.LBB1225:
+.LBB1226:
+.LBB1227:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL246:
-.LBE1201:
-.LBE1200:
-.LBE1199:
-.LBB1202:
-.LBB1203:
+.LBE1227:
+.LBE1226:
+.LBE1225:
+.LBB1228:
+.LBB1229:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -3056,13 +3056,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL247:
 #NO_APP
-.LBE1203:
-.LBE1202:
-.LBB1204:
+.LBE1229:
+.LBE1228:
+.LBB1230:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL248:
-.LBE1204:
+.LBE1230:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL249:
@@ -3078,38 +3078,38 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1198:
-.LBE1197:
+.LBE1224:
+.LBE1223:
 	.loc 9 134 0
 	mov	x2, 48
 	add	x1, x29, 104
 .LVL251:
 	bl	__arch_copy_to_user
 .LVL252:
-.LBE1208:
-.LBE1212:
-.LBE1228:
-	.loc 1 2403 0
+.LBE1234:
+.LBE1238:
+.LBE1254:
+	.loc 1 2413 0
 	cbnz	w0, .L205
-.LBB1229:
-.LBB1028:
+.LBB1255:
+.LBB1054:
 	mov	x22, 0
 	b	.L176
 .LVL253:
 	.p2align 3
 .L209:
-.LBE1028:
-.LBE1229:
-	.loc 1 2411 0
+.LBE1054:
+.LBE1255:
+	.loc 1 2421 0
 	mov	x22, -14
 	b	.L176
 .LVL254:
 	.p2align 3
 .L316:
-	.loc 1 2426 0
+	.loc 1 2436 0
 	mov	w2, 1
 	str	w2, [x20, 96]
-	.loc 1 2427 0
+	.loc 1 2437 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -3119,25 +3119,25 @@ ebc_io_ctl:
 	b	.L211
 	.p2align 3
 .L317:
-	.loc 1 2429 0 discriminator 1
+	.loc 1 2439 0 discriminator 1
 	ldr	w0, [x20, 616]
 	cbz	w0, .L213
-.LBB1230:
-.LBB1029:
+.LBB1256:
+.LBB1055:
 	mov	x22, 0
 	b	.L176
 .LVL256:
 .L201:
-.LBE1029:
-.LBE1230:
-	.loc 1 2377 0
+.LBE1055:
+.LBE1256:
+	.loc 1 2387 0
 	mov	x22, -1
 	b	.L176
 .LVL257:
 .L250:
-.LBB1231:
-.LBB1128:
-.LBB1124:
+.LBB1257:
+.LBB1154:
+.LBB1150:
 	.loc 9 112 0
 	mov	x0, 4
 .LVL258:
@@ -3150,22 +3150,22 @@ ebc_io_ctl:
 .LVL260:
 	bl	memset
 .LVL261:
-.LBE1124:
-.LBE1128:
-.LBE1231:
-	.loc 1 2468 0
+.LBE1150:
+.LBE1154:
+.LBE1257:
+	.loc 1 2478 0
 	ldr	x0, [x20, 288]
 	adrp	x1, .LC4
-	.loc 1 2469 0
+	.loc 1 2479 0
 	mov	x22, -14
-	.loc 1 2468 0
+	.loc 1 2478 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
 .LVL262:
-	.loc 1 2469 0
+	.loc 1 2479 0
 	b	.L176
 .L314:
-	.loc 1 2548 0
+	.loc 1 2558 0
 	bl	__stack_chk_fail
 .LVL263:
 .L322:
@@ -3367,7 +3367,7 @@ frame_done_callback:
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
 .LFB2841:
-	.loc 1 2274 0
+	.loc 1 2284 0
 	.cfi_startproc
 .LVL275:
 	stp	x29, x30, [sp, -16]!
@@ -3376,10 +3376,10 @@ ebc_frame_timeout:
 	.cfi_offset 30, -8
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2275 0
+	.loc 1 2285 0
 	bl	frame_done_callback
 .LVL276:
-	.loc 1 2277 0
+	.loc 1 2287 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3432,8 +3432,8 @@ ebc_lut_update:
 	.loc 1 1716 0
 	str	w4, [x0, -12]!
 .LVL280:
-.LBB1232:
-.LBB1233:
+.LBB1258:
+.LBB1259:
 	.loc 3 50 0
 	mov	x1, x0
 	mov	x0, x2
@@ -3441,8 +3441,8 @@ ebc_lut_update:
 	blr	x2
 .LVL281:
 	mov	w20, w0
-.LBE1233:
-.LBE1232:
+.LBE1259:
+.LBE1258:
 	.loc 1 1724 0
 	cbnz	w0, .L336
 .LVL282:
@@ -3730,23 +3730,23 @@ ebc_lut_update:
 	.type	ebc_buf_state_read, %function
 ebc_buf_state_read:
 .LFB2855:
-	.loc 1 2716 0
+	.loc 1 2726 0
 	.cfi_startproc
 .LVL307:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2717 0
+	.loc 1 2727 0
 	mov	x0, x2
 .LVL308:
-	.loc 1 2716 0
+	.loc 1 2726 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2717 0
+	.loc 1 2727 0
 	bl	ebc_buf_state_show
 .LVL309:
-	.loc 1 2718 0
+	.loc 1 2728 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3761,32 +3761,32 @@ ebc_buf_state_read:
 	.type	ebc_state_read, %function
 ebc_state_read:
 .LFB2854:
-	.loc 1 2707 0
+	.loc 1 2717 0
 	.cfi_startproc
 .LVL310:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2708 0
+	.loc 1 2718 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2707 0
+	.loc 1 2717 0
 	mov	x0, x2
 .LVL311:
-	.loc 1 2708 0
+	.loc 1 2718 0
 	adrp	x1, .LC15
 .LVL312:
-	.loc 1 2707 0
+	.loc 1 2717 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2708 0
+	.loc 1 2718 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL313:
 	add	x1, x1, :lo12:.LC15
 	ldr	w2, [x2, 624]
 	bl	sprintf
 .LVL314:
-	.loc 1 2709 0
+	.loc 1 2719 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3801,7 +3801,7 @@ ebc_state_read:
 	.type	ebc_version_read, %function
 ebc_version_read:
 .LFB2853:
-	.loc 1 2698 0
+	.loc 1 2708 0
 	.cfi_startproc
 .LVL315:
 	stp	x29, x30, [sp, -16]!
@@ -3810,22 +3810,22 @@ ebc_version_read:
 	.cfi_offset 30, -8
 	mov	x0, x2
 .LVL316:
-	.loc 1 2699 0
+	.loc 1 2709 0
 	adrp	x1, .LC17
 .LVL317:
 	adrp	x2, .LC16
 .LVL318:
-	.loc 1 2698 0
+	.loc 1 2708 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2699 0
+	.loc 1 2709 0
 	add	x2, x2, :lo12:.LC16
-	.loc 1 2698 0
-	.loc 1 2699 0
+	.loc 1 2708 0
+	.loc 1 2709 0
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
 .LVL319:
-	.loc 1 2700 0
+	.loc 1 2710 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3840,46 +3840,46 @@ ebc_version_read:
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
 .LFB2851:
-	.loc 1 2662 0
+	.loc 1 2672 0
 	.cfi_startproc
 .LVL320:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 2663 0
+	.loc 1 2673 0
 	adrp	x0, .LANCHOR0
 .LVL321:
-	.loc 1 2662 0
+	.loc 1 2672 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2666 0
+	.loc 1 2676 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2662 0
+	.loc 1 2672 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2662 0
+	.loc 1 2672 0
 	mov	x19, x2
-	.loc 1 2666 0
+	.loc 1 2676 0
 	ldr	x1, [x0, 16]
 .LVL322:
-.LBB1234:
-.LBB1235:
+.LBB1260:
+.LBB1261:
 	.loc 3 55 0
 	mov	x0, x1
 	ldr	x1, [x1, 64]
 	blr	x1
 .LVL323:
-.LBE1235:
-.LBE1234:
-	.loc 1 2668 0
+.LBE1261:
+.LBE1260:
+	.loc 1 2678 0
 	mov	w2, w0
 	adrp	x1, .LC15
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
 .LVL324:
-	.loc 1 2669 0
+	.loc 1 2679 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL325:
@@ -3897,33 +3897,33 @@ pmic_vcom_read:
 	.type	pmic_temp_read, %function
 pmic_temp_read:
 .LFB2850:
-	.loc 1 2648 0
+	.loc 1 2658 0
 	.cfi_startproc
 .LVL326:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 2649 0
+	.loc 1 2659 0
 	adrp	x0, .LANCHOR0
 .LVL327:
-	.loc 1 2648 0
+	.loc 1 2658 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2652 0
+	.loc 1 2662 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-.LBB1236:
-.LBB1237:
+.LBB1262:
+.LBB1263:
 	.loc 3 50 0
 	add	x1, x29, 36
 .LVL328:
-.LBE1237:
-.LBE1236:
-	.loc 1 2648 0
+.LBE1263:
+.LBE1262:
+	.loc 1 2658 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 2648 0
+	.loc 1 2658 0
 	adrp	x19, __stack_chk_guard
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x20, x2
@@ -3931,25 +3931,25 @@ pmic_temp_read:
 	str	x2, [x29, 40]
 	mov	x2,0
 .LVL329:
-	.loc 1 2652 0
+	.loc 1 2662 0
 	ldr	x2, [x0, 16]
-.LBB1239:
-.LBB1238:
+.LBB1265:
+.LBB1264:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
 .LVL330:
-.LBE1238:
-.LBE1239:
-	.loc 1 2654 0
+.LBE1264:
+.LBE1265:
+	.loc 1 2664 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC15
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
 .LVL331:
-	.loc 1 2655 0
+	.loc 1 2665 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
@@ -3978,25 +3978,25 @@ pmic_temp_read:
 	.type	pmic_name_read, %function
 pmic_name_read:
 .LFB2849:
-	.loc 1 2637 0
+	.loc 1 2647 0
 	.cfi_startproc
 .LVL335:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2638 0
+	.loc 1 2648 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2637 0
+	.loc 1 2647 0
 	mov	x0, x2
 .LVL336:
-	.loc 1 2640 0
+	.loc 1 2650 0
 	adrp	x1, .LC17
 .LVL337:
-	.loc 1 2637 0
+	.loc 1 2647 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2640 0
+	.loc 1 2650 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL338:
 	add	x1, x1, :lo12:.LC17
@@ -4004,7 +4004,7 @@ pmic_name_read:
 	add	x2, x2, 8
 	bl	sprintf
 .LVL339:
-	.loc 1 2641 0
+	.loc 1 2651 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -4019,17 +4019,17 @@ pmic_name_read:
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
 .LFB2852:
-	.loc 1 2674 0
+	.loc 1 2684 0
 	.cfi_startproc
 .LVL340:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 2675 0
+	.loc 1 2685 0
 	adrp	x0, .LANCHOR0
 .LVL341:
-	.loc 1 2674 0
+	.loc 1 2684 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -4039,37 +4039,37 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 2674 0
+	.loc 1 2684 0
 	add	x1, x19, :lo12:__stack_chk_guard
 .LVL342:
 	mov	x21, x2
-	.loc 1 2675 0
+	.loc 1 2685 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
 .LVL343:
-	.loc 1 2674 0
+	.loc 1 2684 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
 .LVL344:
 	mov	x20, x3
-	.loc 1 2678 0
+	.loc 1 2688 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
 .LVL345:
-	.loc 1 2679 0
+	.loc 1 2689 0
 	cbnz	w0, .L388
 .LVL346:
-	.loc 1 2683 0
+	.loc 1 2693 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
 .LVL347:
-	.loc 1 2684 0
+	.loc 1 2694 0
 	cbnz	w0, .L389
 .L381:
-	.loc 1 2690 0
+	.loc 1 2700 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
 .LVL348:
@@ -4094,36 +4094,36 @@ pmic_vcom_write:
 	.p2align 3
 .L388:
 	.cfi_restore_state
-	.loc 1 2680 0
+	.loc 1 2690 0
 	ldr	x0, [x22]
 	adrp	x1, .LC18
 	mov	x2, x21
 	add	x1, x1, :lo12:.LC18
-	.loc 1 2681 0
+	.loc 1 2691 0
 	mov	x20, -1
 .LVL351:
-	.loc 1 2680 0
+	.loc 1 2690 0
 	bl	_dev_err
 .LVL352:
-	.loc 1 2681 0
+	.loc 1 2691 0
 	b	.L381
 .LVL353:
 	.p2align 3
 .L389:
-	.loc 1 2685 0
+	.loc 1 2695 0
 	ldr	x0, [x22]
 	adrp	x1, .LC19
-	.loc 1 2686 0
+	.loc 1 2696 0
 	mov	x20, -1
 .LVL354:
-	.loc 1 2685 0
+	.loc 1 2695 0
 	add	x1, x1, :lo12:.LC19
 	bl	_dev_err
 .LVL355:
-	.loc 1 2686 0
+	.loc 1 2696 0
 	b	.L381
 .L390:
-	.loc 1 2690 0
+	.loc 1 2700 0
 	bl	__stack_chk_fail
 .LVL356:
 	.cfi_endproc
@@ -4134,7 +4134,7 @@ pmic_vcom_write:
 	.type	waveform_version_read, %function
 waveform_version_read:
 .LFB2848:
-	.loc 1 2626 0
+	.loc 1 2636 0
 	.cfi_startproc
 .LVL357:
 	stp	x29, x30, [sp, -32]!
@@ -4145,19 +4145,19 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2626 0
+	.loc 1 2636 0
 	mov	x19, x2
-	.loc 1 2627 0
+	.loc 1 2637 0
 	bl	epd_lut_get_wf_version
 .LVL358:
-	.loc 1 2629 0
+	.loc 1 2639 0
 	mov	x2, x0
 	adrp	x1, .LC17
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
 .LVL359:
-	.loc 1 2630 0
+	.loc 1 2640 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL360:
@@ -4175,23 +4175,23 @@ waveform_version_read:
 	.type	ebc_init, %function
 ebc_init:
 .LFB2866:
-	.loc 1 3171 0
+	.loc 1 3181 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3172 0
+	.loc 1 3182 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3171 0
+	.loc 1 3181 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3172 0
+	.loc 1 3182 0
 	bl	__platform_driver_register
 .LVL361:
-	.loc 1 3173 0
+	.loc 1 3183 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -4230,8 +4230,8 @@ direct_mode_data_change:
 	cmp	w4, 16
 	beq	.L448
 .L404:
-.LBB1266:
-.LBB1267:
+.LBB1292:
+.LBB1293:
 	.loc 1 1084 0
 	adrp	x6, .LANCHOR0
 	.loc 1 1090 0
@@ -4414,8 +4414,8 @@ direct_mode_data_change:
 .LVL376:
 	.p2align 3
 .L395:
-.LBE1267:
-.LBE1266:
+.LBE1293:
+.LBE1292:
 	.loc 1 1170 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
@@ -4441,8 +4441,8 @@ direct_mode_data_change:
 	ldr	w13, [x3, 88]
 .LVL378:
 	cbz	w13, .L405
-.LBB1268:
-.LBB1269:
+.LBB1294:
+.LBB1295:
 	.loc 1 898 0
 	adrp	x6, .LANCHOR0
 	.loc 1 904 0
@@ -4515,8 +4515,8 @@ direct_mode_data_change:
 	cmp	x11, x7
 	.loc 1 924 0
 	and	w8, w3, 65535
-.LBB1270:
-.LBB1271:
+.LBB1296:
+.LBB1297:
 	.loc 1 133 0
 	ubfiz	w19, w9, 8, 8
 	.loc 1 134 0
@@ -4525,143 +4525,143 @@ direct_mode_data_change:
 	add	w19, w19, w8, uxtb
 	.loc 1 134 0
 	add	w9, w9, w8, lsr 8
-.LBE1271:
-.LBE1270:
+.LBE1297:
+.LBE1296:
 	.loc 1 925 0
 	lsr	w10, w4, 16
 	lsr	w8, w3, 16
-.LBB1275:
-.LBB1276:
+.LBB1301:
+.LBB1302:
 	.loc 1 133 0
 	ubfiz	w18, w10, 8, 8
-.LBE1276:
-.LBE1275:
-.LBB1282:
-.LBB1272:
+.LBE1302:
+.LBE1301:
+.LBB1308:
+.LBB1298:
 	ldrb	w19, [x5, w19, sxtw]
-.LBE1272:
-.LBE1282:
-.LBB1283:
-.LBB1277:
+.LBE1298:
+.LBE1308:
+.LBB1309:
+.LBB1303:
 	.loc 1 134 0
 	and	w10, w10, 65280
-.LBE1277:
-.LBE1283:
-.LBB1284:
-.LBB1273:
+.LBE1303:
+.LBE1309:
+.LBB1310:
+.LBB1299:
 	ldrb	w17, [x5, w9, sxtw]
-.LBE1273:
-.LBE1284:
-.LBB1285:
-.LBB1278:
+.LBE1299:
+.LBE1310:
+.LBB1311:
+.LBB1304:
 	.loc 1 133 0
 	add	w18, w18, w8, uxtb
 	.loc 1 134 0
 	add	w10, w10, w8, lsr 8
-.LBE1278:
-.LBE1285:
+.LBE1304:
+.LBE1311:
 	.loc 1 926 0
 	ubfx	x9, x4, 32, 16
 	ubfx	x8, x3, 32, 16
 	.loc 1 927 0
 	lsr	x4, x4, 48
 .LVL391:
-.LBB1286:
-.LBB1274:
+.LBB1312:
+.LBB1300:
 	.loc 1 133 0
 	orr	w17, w19, w17, lsl 4
-.LBE1274:
-.LBE1286:
+.LBE1300:
+.LBE1312:
 	.loc 1 924 0
 	strb	w17, [x6, -4]
-.LBB1287:
-.LBB1288:
+.LBB1313:
+.LBB1314:
 	.loc 1 133 0
 	ubfiz	w17, w9, 8, 8
 	.loc 1 134 0
 	and	w9, w9, 65280
-.LBE1288:
-.LBE1287:
-.LBB1294:
-.LBB1279:
+.LBE1314:
+.LBE1313:
+.LBB1320:
+.LBB1305:
 	ldrb	w10, [x5, w10, sxtw]
-.LBE1279:
-.LBE1294:
-.LBB1295:
-.LBB1289:
+.LBE1305:
+.LBE1320:
+.LBB1321:
+.LBB1315:
 	.loc 1 133 0
 	add	w17, w17, w8, uxtb
-.LBE1289:
-.LBE1295:
-.LBB1296:
-.LBB1280:
+.LBE1315:
+.LBE1321:
+.LBB1322:
+.LBB1306:
 	ldrb	w18, [x5, w18, sxtw]
-.LBE1280:
-.LBE1296:
-.LBB1297:
-.LBB1290:
+.LBE1306:
+.LBE1322:
+.LBB1323:
+.LBB1316:
 	.loc 1 134 0
 	add	w8, w9, w8, lsr 8
-.LBE1290:
-.LBE1297:
+.LBE1316:
+.LBE1323:
 	.loc 1 927 0
 	lsr	x3, x3, 48
 .LVL392:
-.LBB1298:
-.LBB1281:
+.LBB1324:
+.LBB1307:
 	.loc 1 133 0
 	orr	w9, w18, w10, lsl 4
-.LBE1281:
-.LBE1298:
+.LBE1307:
+.LBE1324:
 	.loc 1 925 0
 	strb	w9, [x6, -3]
-.LBB1299:
-.LBB1300:
+.LBB1325:
+.LBB1326:
 	.loc 1 133 0
 	ubfiz	w9, w4, 8, 8
 	.loc 1 134 0
 	and	w4, w4, 65280
-.LBE1300:
-.LBE1299:
-.LBB1304:
-.LBB1291:
+.LBE1326:
+.LBE1325:
+.LBB1330:
+.LBB1317:
 	ldrb	w10, [x5, w8, sxtw]
-.LBE1291:
-.LBE1304:
-.LBB1305:
-.LBB1301:
+.LBE1317:
+.LBE1330:
+.LBB1331:
+.LBB1327:
 	.loc 1 133 0
 	add	w8, w9, w3, uxtb
-.LBE1301:
-.LBE1305:
-.LBB1306:
-.LBB1292:
+.LBE1327:
+.LBE1331:
+.LBB1332:
+.LBB1318:
 	ldrb	w17, [x5, w17, sxtw]
-.LBE1292:
-.LBE1306:
-.LBB1307:
-.LBB1302:
+.LBE1318:
+.LBE1332:
+.LBB1333:
+.LBB1328:
 	.loc 1 134 0
 	add	w3, w4, w3, lsr 8
-.LBE1302:
-.LBE1307:
-.LBB1308:
-.LBB1293:
+.LBE1328:
+.LBE1333:
+.LBB1334:
+.LBB1319:
 	.loc 1 133 0
 	orr	w4, w17, w10, lsl 4
-.LBE1293:
-.LBE1308:
+.LBE1319:
+.LBE1334:
 	.loc 1 926 0
 	strb	w4, [x6, -2]
-.LBB1309:
-.LBB1303:
+.LBB1335:
+.LBB1329:
 	.loc 1 134 0
 	ldrb	w3, [x5, w3, sxtw]
 	.loc 1 133 0
 	ldrb	w4, [x5, w8, sxtw]
 	orr	w3, w4, w3, lsl 4
-.LBE1303:
-.LBE1309:
+.LBE1329:
+.LBE1335:
 	.loc 1 927 0
 	strb	w3, [x6, -1]
 	.loc 1 920 0
@@ -4688,8 +4688,8 @@ direct_mode_data_change:
 	b	.L407
 .LVL397:
 .L447:
-.LBE1269:
-.LBE1268:
+.LBE1295:
+.LBE1294:
 	.loc 1 1156 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
@@ -4698,8 +4698,8 @@ direct_mode_data_change:
 	.loc 1 1165 0
 	cmp	w4, 16
 	bne	.L404
-.LBB1310:
-.LBB1311:
+.LBB1336:
+.LBB1337:
 	.loc 1 1014 0
 	adrp	x6, .LANCHOR0
 	.loc 1 1020 0
@@ -4892,10 +4892,10 @@ direct_mode_data_change:
 	b	.L417
 .LVL410:
 .L405:
-.LBE1311:
-.LBE1310:
-.LBB1312:
-.LBB1313:
+.LBE1337:
+.LBE1336:
+.LBB1338:
+.LBB1339:
 	.loc 1 938 0
 	adrp	x5, .LANCHOR0
 	.loc 1 944 0
@@ -4958,78 +4958,78 @@ direct_mode_data_change:
 	ldr	w4, [x1, x5, lsl 2]
 	add	x5, x5, 1
 .LVL420:
-.LBB1314:
-.LBB1315:
+.LBB1340:
+.LBB1341:
 	.loc 1 134 0
 	and	w9, w3, 65280
-.LBE1315:
-.LBE1314:
+.LBE1341:
+.LBE1340:
 	.loc 1 960 0
 	cmp	w12, w5
 .LVL421:
 	.loc 1 964 0
 	and	w6, w4, 65535
-.LBB1320:
-.LBB1316:
+.LBB1346:
+.LBB1342:
 	.loc 1 133 0
 	ubfiz	w8, w3, 8, 8
 	.loc 1 134 0
 	add	w9, w9, w6, lsr 8
 	.loc 1 133 0
 	add	w6, w8, w6, uxtb
-.LBE1316:
-.LBE1320:
+.LBE1342:
+.LBE1346:
 	.loc 1 965 0
 	lsr	w3, w3, 16
 .LVL422:
 	lsr	w4, w4, 16
-.LBB1321:
-.LBB1322:
+.LBB1347:
+.LBB1348:
 	.loc 1 133 0
 	ubfiz	w8, w3, 8, 8
 	.loc 1 134 0
 	and	w3, w3, 65280
-.LBE1322:
-.LBE1321:
-.LBB1326:
-.LBB1317:
+.LBE1348:
+.LBE1347:
+.LBB1352:
+.LBB1343:
 	.loc 1 133 0
 	ldrb	w11, [x7, w6, sxtw]
-.LBE1317:
-.LBE1326:
-.LBB1327:
-.LBB1323:
+.LBE1343:
+.LBE1352:
+.LBB1353:
+.LBB1349:
 	.loc 1 134 0
 	add	w3, w3, w4, lsr 8
-.LBE1323:
-.LBE1327:
-.LBB1328:
-.LBB1318:
+.LBE1349:
+.LBE1353:
+.LBB1354:
+.LBB1344:
 	ldrb	w9, [x7, w9, sxtw]
-.LBE1318:
-.LBE1328:
-.LBB1329:
-.LBB1324:
+.LBE1344:
+.LBE1354:
+.LBB1355:
+.LBB1350:
 	.loc 1 133 0
 	add	w6, w8, w4, uxtb
-.LBE1324:
-.LBE1329:
-.LBB1330:
-.LBB1319:
+.LBE1350:
+.LBE1355:
+.LBB1356:
+.LBB1345:
 	orr	w4, w11, w9, lsl 4
-.LBE1319:
-.LBE1330:
+.LBE1345:
+.LBE1356:
 	.loc 1 964 0
 	strb	w4, [x10], 2
-.LBB1331:
-.LBB1325:
+.LBB1357:
+.LBB1351:
 	.loc 1 134 0
 	ldrb	w3, [x7, w3, sxtw]
 	.loc 1 133 0
 	ldrb	w4, [x7, w6, sxtw]
 	orr	w3, w4, w3, lsl 4
-.LBE1325:
-.LBE1331:
+.LBE1351:
+.LBE1357:
 	.loc 1 965 0
 	strb	w3, [x10, -1]
 	.loc 1 960 0
@@ -5054,10 +5054,10 @@ direct_mode_data_change:
 	b	.L412
 .LVL425:
 .L451:
-.LBE1313:
-.LBE1312:
-.LBB1332:
-.LBB1333:
+.LBE1339:
+.LBE1338:
+.LBB1358:
+.LBB1359:
 	.loc 1 975 0
 	adrp	x5, .LANCHOR0
 	.loc 1 981 0
@@ -5121,81 +5121,81 @@ direct_mode_data_change:
 	.loc 1 1000 0
 	ldr	w3, [x1, x4, lsl 2]
 .LVL436:
-.LBB1334:
-.LBB1335:
+.LBB1360:
+.LBB1361:
 	.loc 1 140 0
 	and	w9, w5, 65280
-.LBE1335:
-.LBE1334:
+.LBE1361:
+.LBE1360:
 	.loc 1 1004 0
 	lsr	w7, w5, 16
 .LVL437:
 	.loc 1 1003 0
 	and	w6, w3, 65535
-.LBB1340:
-.LBB1341:
+.LBB1366:
+.LBB1367:
 	.loc 1 139 0
 	ubfiz	w10, w7, 8, 8
-.LBE1341:
-.LBE1340:
+.LBE1367:
+.LBE1366:
 	.loc 1 1004 0
 	lsr	w3, w3, 16
-.LBB1346:
-.LBB1342:
+.LBB1372:
+.LBB1368:
 	.loc 1 140 0
 	and	w7, w7, 65280
 	.loc 1 139 0
 	add	w10, w10, w3, uxtb
-.LBE1342:
-.LBE1346:
-.LBB1347:
-.LBB1336:
+.LBE1368:
+.LBE1372:
+.LBB1373:
+.LBB1362:
 	ubfiz	w5, w5, 8, 8
 .LVL438:
-.LBE1336:
-.LBE1347:
-.LBB1348:
-.LBB1343:
+.LBE1362:
+.LBE1373:
+.LBB1374:
+.LBB1369:
 	.loc 1 140 0
 	add	w3, w7, w3, lsr 8
-.LBE1343:
-.LBE1348:
-.LBB1349:
-.LBB1337:
+.LBE1369:
+.LBE1374:
+.LBB1375:
+.LBB1363:
 	.loc 1 139 0
 	add	w5, w5, w6, uxtb
 	.loc 1 140 0
 	add	w7, w9, w6, lsr 8
-.LBE1337:
-.LBE1349:
-.LBB1350:
-.LBB1344:
+.LBE1363:
+.LBE1375:
+.LBB1376:
+.LBB1370:
 	.loc 1 139 0
 	ldrb	w9, [x8, w10, sxtw]
 	.loc 1 140 0
 	ldrb	w3, [x8, w3, sxtw]
-.LBE1344:
-.LBE1350:
-.LBB1351:
-.LBB1338:
+.LBE1370:
+.LBE1376:
+.LBB1377:
+.LBB1364:
 	ldrb	w6, [x8, w7, sxtw]
 	.loc 1 139 0
 	ldrb	w5, [x8, w5, sxtw]
-.LBE1338:
-.LBE1351:
-.LBB1352:
-.LBB1345:
+.LBE1364:
+.LBE1377:
+.LBB1378:
+.LBB1371:
 	orr	w3, w9, w3, lsl 2
-.LBE1345:
-.LBE1352:
+.LBE1371:
+.LBE1378:
 	.loc 1 1005 0
 	ubfiz	w3, w3, 4, 8
-.LBB1353:
-.LBB1339:
+.LBB1379:
+.LBB1365:
 	.loc 1 139 0
 	orr	w5, w5, w6, lsl 2
-.LBE1339:
-.LBE1353:
+.LBE1365:
+.LBE1379:
 	.loc 1 1005 0
 	orr	w3, w3, w5
 	strb	w3, [x11, x4]
@@ -5221,8 +5221,8 @@ direct_mode_data_change:
 	add	x11, x0, x11
 .LVL440:
 	b	.L401
-.LBE1333:
-.LBE1332:
+.LBE1359:
+.LBE1358:
 	.cfi_endproc
 .LFE2822:
 	.size	direct_mode_data_change, .-direct_mode_data_change
@@ -5263,8 +5263,8 @@ direct_mode_data_change_part:
 	cmp	w4, 16
 	beq	.L630
 .L472:
-.LBB1380:
-.LBB1381:
+.LBB1406:
+.LBB1407:
 	.loc 1 1381 0
 	adrp	x5, .LANCHOR0
 	.loc 1 1387 0
@@ -5472,8 +5472,8 @@ direct_mode_data_change_part:
 .LVL455:
 	.p2align 3
 .L455:
-.LBE1381:
-.LBE1380:
+.LBE1407:
+.LBE1406:
 	.loc 1 1474 0
 	ldp	x19, x20, [sp, 16]
 .LVL456:
@@ -5510,17 +5510,17 @@ direct_mode_data_change_part:
 	bne	.L472
 	.loc 1 1464 0
 	ldr	w15, [x3, 88]
-.LBB1382:
-.LBB1383:
+.LBB1408:
+.LBB1409:
 	.loc 1 1218 0
 	adrp	x5, .LANCHOR0
 .LVL462:
-.LBE1383:
-.LBE1382:
+.LBE1409:
+.LBE1408:
 	.loc 1 1464 0
 	cbz	w15, .L473
-.LBB1396:
-.LBB1394:
+.LBB1422:
+.LBB1420:
 	.loc 1 1218 0
 	ldr	x12, [x5, #:lo12:.LANCHOR0]
 	.loc 1 1223 0
@@ -5558,13 +5558,13 @@ direct_mode_data_change_part:
 	mov	w15, 0
 .LVL469:
 	add	x16, x16, 1
-.LBB1384:
-.LBB1385:
+.LBB1410:
+.LBB1411:
 	.loc 1 145 0
 	mov	w10, 3
 	lsl	x16, x16, 3
-.LBE1385:
-.LBE1384:
+.LBE1411:
+.LBE1410:
 	.loc 1 1234 0
 	cbz	w14, .L474
 .LVL470:
@@ -5598,8 +5598,8 @@ direct_mode_data_change_part:
 	and	w17, w4, 65535
 	and	w7, w3, 65535
 .LVL475:
-.LBB1387:
-.LBB1388:
+.LBB1413:
+.LBB1414:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
@@ -5647,15 +5647,15 @@ direct_mode_data_change_part:
 	and	w6, w6, 255
 .LVL477:
 .L478:
-.LBE1388:
-.LBE1387:
+.LBE1414:
+.LBE1413:
 	.loc 1 1243 0
 	strb	w6, [x5, -4]
 	.loc 1 1244 0
 	lsr	w17, w4, 16
 	lsr	w7, w3, 16
-.LBB1389:
-.LBB1390:
+.LBB1415:
+.LBB1416:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
@@ -5703,15 +5703,15 @@ direct_mode_data_change_part:
 	and	w6, w6, 255
 .LVL479:
 .L483:
-.LBE1390:
-.LBE1389:
+.LBE1416:
+.LBE1415:
 	.loc 1 1244 0
 	strb	w6, [x5, -3]
 	.loc 1 1245 0
 	ubfx	x17, x4, 32, 16
 	ubfx	x7, x3, 32, 16
-.LBB1391:
-.LBB1392:
+.LBB1417:
+.LBB1418:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
@@ -5759,8 +5759,8 @@ direct_mode_data_change_part:
 	and	w6, w6, 255
 .LVL481:
 .L488:
-.LBE1392:
-.LBE1391:
+.LBE1418:
+.LBE1417:
 	.loc 1 1245 0
 	strb	w6, [x5, -2]
 	.loc 1 1246 0
@@ -5768,8 +5768,8 @@ direct_mode_data_change_part:
 .LVL482:
 	lsr	x3, x3, 48
 .LVL483:
-.LBB1393:
-.LBB1386:
+.LBB1419:
+.LBB1412:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
@@ -5818,8 +5818,8 @@ direct_mode_data_change_part:
 	and	w6, w4, 255
 .LVL486:
 .L493:
-.LBE1386:
-.LBE1393:
+.LBE1412:
+.LBE1419:
 	.loc 1 1246 0
 	strb	w6, [x5, -1]
 .LVL487:
@@ -5852,8 +5852,8 @@ direct_mode_data_change_part:
 	b	.L475
 .LVL493:
 .L629:
-.LBE1394:
-.LBE1396:
+.LBE1420:
+.LBE1422:
 	.loc 1 1460 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
@@ -5862,8 +5862,8 @@ direct_mode_data_change_part:
 	.loc 1 1469 0
 	cmp	w4, 16
 	bne	.L472
-.LBB1397:
-.LBB1398:
+.LBB1423:
+.LBB1424:
 	.loc 1 1303 0
 	adrp	x5, .LANCHOR0
 	.loc 1 1309 0
@@ -6087,10 +6087,10 @@ direct_mode_data_change_part:
 	b	.L519
 .LVL506:
 .L473:
-.LBE1398:
-.LBE1397:
-.LBB1399:
-.LBB1400:
+.LBE1424:
+.LBE1423:
+.LBB1425:
+.LBB1426:
 	.loc 1 1177 0
 	ldr	x17, [x5, #:lo12:.LANCHOR0]
 	.loc 1 1182 0
@@ -6125,14 +6125,14 @@ direct_mode_data_change_part:
 	.loc 1 1192 0
 	ble	.L455
 	sub	w16, w13, #1
-.LBB1401:
-.LBB1402:
+.LBB1427:
+.LBB1428:
 	.loc 1 145 0
 	mov	w14, 3
 	add	x16, x16, 1
 	lsl	x16, x16, 2
-.LBE1402:
-.LBE1401:
+.LBE1428:
+.LBE1427:
 	.loc 1 1193 0
 	cbz	w30, .L501
 .LVL513:
@@ -6156,75 +6156,75 @@ direct_mode_data_change_part:
 .L516:
 	.loc 1 1200 0
 	ldr	w5, [x2, x9, lsl 2]
-.LBB1408:
-.LBB1409:
+.LBB1434:
+.LBB1435:
 	.loc 1 149 0
 	mov	w4, 0
-.LBE1409:
-.LBE1408:
+.LBE1435:
+.LBE1434:
 	.loc 1 1199 0
 	ldr	w22, [x1, x9, lsl 2]
-.LBB1414:
-.LBB1403:
+.LBB1440:
+.LBB1429:
 	.loc 1 149 0
 	mov	w8, 0
-.LBE1403:
-.LBE1414:
+.LBE1429:
+.LBE1440:
 	.loc 1 1202 0
 	and	w25, w5, 65535
 	and	w7, w22, 65535
-.LBB1415:
-.LBB1410:
+.LBB1441:
+.LBB1436:
 	.loc 1 160 0
 	and	w3, w25, 65280
 	add	w6, w3, w7, lsr 8
-.LBE1410:
-.LBE1415:
+.LBE1436:
+.LBE1441:
 	.loc 1 1203 0
 	lsr	w3, w5, 16
-.LBB1416:
-.LBB1404:
+.LBB1442:
+.LBB1430:
 	.loc 1 159 0
 	ubfiz	w21, w3, 8, 8
-.LBE1404:
-.LBE1416:
+.LBE1430:
+.LBE1442:
 	.loc 1 1203 0
 	and	w3, w3, 65535
 	lsr	w10, w22, 16
-.LBB1417:
-.LBB1411:
+.LBB1443:
+.LBB1437:
 	.loc 1 159 0
 	ubfiz	w23, w5, 8, 8
-.LBE1411:
-.LBE1417:
-.LBB1418:
-.LBB1405:
+.LBE1437:
+.LBE1443:
+.LBB1444:
+.LBB1431:
 	.loc 1 160 0
 	and	w19, w3, 65280
-.LBE1405:
-.LBE1418:
-.LBB1419:
-.LBB1412:
+.LBE1431:
+.LBE1444:
+.LBB1445:
+.LBB1438:
 	.loc 1 146 0
 	eor	w24, w25, w7
 	.loc 1 159 0
 	add	w23, w23, w7, uxtb
-.LBE1412:
-.LBE1419:
-.LBB1420:
-.LBB1406:
+.LBE1438:
+.LBE1445:
+.LBB1446:
+.LBB1432:
 	add	w21, w21, w10, uxtb
 	.loc 1 146 0
 	eor	w20, w3, w10
 	.loc 1 160 0
 	add	w19, w19, w10, lsr 8
-.LBE1406:
-.LBE1420:
+.LBE1432:
+.LBE1446:
 	.loc 1 1201 0
 	cmp	w22, w5
 	beq	.L504
-.LBB1421:
-.LBB1413:
+.LBB1447:
+.LBB1439:
 	.loc 1 148 0
 	cmp	w25, w7
 	beq	.L505
@@ -6257,12 +6257,12 @@ direct_mode_data_change_part:
 	and	w4, w5, w4
 	and	w4, w4, 255
 .L505:
-.LBE1413:
-.LBE1421:
+.LBE1439:
+.LBE1447:
 	.loc 1 1202 0
 	strb	w4, [x11, -2]
-.LBB1422:
-.LBB1407:
+.LBB1448:
+.LBB1433:
 	.loc 1 148 0
 	cmp	w3, w10
 	beq	.L510
@@ -6295,8 +6295,8 @@ direct_mode_data_change_part:
 	and	w3, w4, w3
 	and	w8, w3, 255
 .L510:
-.LBE1407:
-.LBE1422:
+.LBE1433:
+.LBE1448:
 	.loc 1 1203 0
 	strb	w8, [x11, -1]
 .L515:
@@ -6327,29 +6327,29 @@ direct_mode_data_change_part:
 .LVL520:
 	.p2align 3
 .L477:
-.LBE1400:
-.LBE1399:
-.LBB1424:
-.LBB1395:
+.LBE1426:
+.LBE1425:
+.LBB1450:
+.LBB1421:
 	.loc 1 1249 0
 	str	wzr, [x5, -4]
 	b	.L498
 .LVL521:
 	.p2align 3
 .L504:
-.LBE1395:
-.LBE1424:
-.LBB1425:
-.LBB1423:
+.LBE1421:
+.LBE1450:
+.LBB1451:
+.LBB1449:
 	.loc 1 1206 0
 	strh	wzr, [x11, -2]
 	b	.L515
 .LVL522:
 .L633:
-.LBE1423:
-.LBE1425:
-.LBB1426:
-.LBB1427:
+.LBE1449:
+.LBE1451:
+.LBB1452:
+.LBB1453:
 	.loc 1 1261 0
 	adrp	x5, .LANCHOR0
 	.loc 1 1266 0
@@ -6388,13 +6388,13 @@ direct_mode_data_change_part:
 	mov	w19, 0
 .LVL529:
 	add	x20, x20, 1
-.LBB1428:
-.LBB1429:
+.LBB1454:
+.LBB1455:
 	.loc 1 167 0
 	mov	w18, 3
 	lsl	x20, x20, 2
-.LBE1429:
-.LBE1428:
+.LBE1455:
+.LBE1454:
 	.loc 1 1279 0
 	cbz	w23, .L460
 .LVL530:
@@ -6416,8 +6416,8 @@ direct_mode_data_change_part:
 .LVL533:
 	.p2align 3
 .L637:
-.LBB1435:
-.LBB1436:
+.LBB1461:
+.LBB1462:
 	.loc 1 170 0
 	cmp	w7, w5
 	beq	.L464
@@ -6438,10 +6438,10 @@ direct_mode_data_change_part:
 	csel	w4, w5, w4, ne
 	and	w12, w12, w4
 .L464:
-.LBE1436:
-.LBE1435:
-.LBB1440:
-.LBB1430:
+.LBE1462:
+.LBE1461:
+.LBB1466:
+.LBB1456:
 	.loc 1 170 0
 	cmp	w3, w13
 	beq	.L467
@@ -6465,8 +6465,8 @@ direct_mode_data_change_part:
 	sxtb	w10, w3
 .LVL536:
 .L467:
-.LBE1430:
-.LBE1440:
+.LBE1456:
+.LBE1466:
 	.loc 1 1290 0
 	orr	w3, w12, w10
 	strb	w3, [x16, x11]
@@ -6478,20 +6478,20 @@ direct_mode_data_change_part:
 	.loc 1 1286 0
 	ldr	w4, [x2, x11, lsl 2]
 .LVL537:
-.LBB1441:
-.LBB1437:
+.LBB1467:
+.LBB1463:
 	.loc 1 170 0
 	mov	w12, 0
-.LBE1437:
-.LBE1441:
+.LBE1463:
+.LBE1467:
 	.loc 1 1285 0
 	ldr	w6, [x1, x11, lsl 2]
-.LBB1442:
-.LBB1431:
+.LBB1468:
+.LBB1457:
 	.loc 1 170 0
 	mov	w10, 0
-.LBE1431:
-.LBE1442:
+.LBE1457:
+.LBE1468:
 	.loc 1 1288 0
 	and	w7, w4, 65535
 	.loc 1 1289 0
@@ -6500,52 +6500,52 @@ direct_mode_data_change_part:
 	and	w5, w6, 65535
 	.loc 1 1289 0
 	lsr	w13, w6, 16
-.LBB1443:
-.LBB1432:
+.LBB1469:
+.LBB1458:
 	.loc 1 177 0
 	ubfiz	w14, w3, 8, 8
-.LBE1432:
-.LBE1443:
+.LBE1458:
+.LBE1469:
 	.loc 1 1289 0
 	and	w3, w3, 65535
-.LBB1444:
-.LBB1438:
+.LBB1470:
+.LBB1464:
 	.loc 1 177 0
 	ubfiz	w8, w4, 8, 8
 	.loc 1 178 0
 	and	w9, w7, 65280
 	.loc 1 168 0
 	eor	w30, w7, w5
-.LBE1438:
-.LBE1444:
-.LBB1445:
-.LBB1433:
+.LBE1464:
+.LBE1470:
+.LBB1471:
+.LBB1459:
 	.loc 1 178 0
 	and	w24, w3, 65280
 	.loc 1 168 0
 	eor	w25, w3, w13
-.LBE1433:
-.LBE1445:
-.LBB1446:
-.LBB1439:
+.LBE1459:
+.LBE1471:
+.LBB1472:
+.LBB1465:
 	.loc 1 177 0
 	add	w8, w8, w5, uxtb
 	.loc 1 178 0
 	add	w9, w9, w5, lsr 8
 	.loc 1 172 0
 	and	w27, w30, 255
-.LBE1439:
-.LBE1446:
-.LBB1447:
-.LBB1434:
+.LBE1465:
+.LBE1472:
+.LBB1473:
+.LBB1460:
 	.loc 1 177 0
 	add	w14, w14, w13, uxtb
 	.loc 1 178 0
 	add	w24, w24, w13, lsr 8
 	.loc 1 172 0
 	and	w26, w25, 255
-.LBE1434:
-.LBE1447:
+.LBE1460:
+.LBE1473:
 	.loc 1 1287 0
 	cmp	w6, w4
 	bne	.L637
@@ -6575,8 +6575,8 @@ direct_mode_data_change_part:
 	add	x16, x0, x16
 .LVL540:
 	b	.L461
-.LBE1427:
-.LBE1426:
+.LBE1453:
+.LBE1452:
 	.cfi_endproc
 .LFE2828:
 	.size	direct_mode_data_change_part, .-direct_mode_data_change_part
@@ -6607,10 +6607,10 @@ flip.isra.11:
 	.loc 1 1480 0
 	ldr	x0, [x0]
 .LVL542:
-.LBB1448:
-.LBB1449:
-.LBB1450:
-.LBB1451:
+.LBB1474:
+.LBB1475:
+.LBB1476:
+.LBB1477:
 	.file 10 "./include/linux/dma-mapping.h"
 	.loc 10 266 0
 	cbz	x0, .L642
@@ -6621,37 +6621,37 @@ flip.isra.11:
 	cmp	x3, 0
 	csel	x3, x4, x3, eq
 .L640:
-.LBE1451:
-.LBE1450:
+.LBE1477:
+.LBE1476:
 	.loc 10 434 0
 	ldr	x5, [x3, 88]
 	sxtw	x19, w19
 	cbz	x5, .L641
-.LBE1449:
-.LBE1448:
+.LBE1475:
+.LBE1474:
 	.loc 1 1480 0
 	add	x4, x19, x19, lsl 1
-.LBB1457:
-.LBB1454:
+.LBB1483:
+.LBB1480:
 	.loc 10 435 0
 	mov	w3, 1
-.LBE1454:
-.LBE1457:
+.LBE1480:
+.LBE1483:
 	.loc 1 1480 0
 	add	x4, x20, x4, lsl 3
-.LBB1458:
-.LBB1455:
+.LBB1484:
+.LBB1481:
 	.loc 10 435 0
 	ldr	x1, [x4, 32]
 	blr	x5
 .LVL543:
 .L641:
-.LBE1455:
-.LBE1458:
+.LBE1481:
+.LBE1484:
 	.loc 1 1481 0
 	ldr	x5, [x20, 8]
-.LBB1459:
-.LBB1460:
+.LBB1485:
+.LBB1486:
 	.file 11 "drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.h"
 	.loc 11 57 0
 	mov	w4, 0
@@ -6659,29 +6659,29 @@ flip.isra.11:
 	mov	w2, 0
 	mov	x0, x5
 	mov	w1, 0
-.LBE1460:
-.LBE1459:
+.LBE1486:
+.LBE1485:
 	.loc 1 1482 0
 	add	x19, x19, x19, lsl 1
-.LBB1463:
-.LBB1461:
+.LBB1489:
+.LBB1487:
 	.loc 11 57 0
 	ldr	x5, [x5, 64]
-.LBE1461:
-.LBE1463:
+.LBE1487:
+.LBE1489:
 	.loc 1 1482 0
 	add	x19, x20, x19, lsl 3
-.LBB1464:
-.LBB1462:
+.LBB1490:
+.LBB1488:
 	.loc 11 57 0
 	blr	x5
 .LVL544:
-.LBE1462:
-.LBE1464:
+.LBE1488:
+.LBE1490:
 	.loc 1 1482 0
 	ldr	x1, [x20, 8]
-.LBB1465:
-.LBB1466:
+.LBB1491:
+.LBB1492:
 	.loc 11 62 0
 	mov	w2, 0
 	mov	x0, x1
@@ -6689,20 +6689,20 @@ flip.isra.11:
 	ldr	w1, [x19, 32]
 	blr	x3
 .LVL545:
-.LBE1466:
-.LBE1465:
+.LBE1492:
+.LBE1491:
 	.loc 1 1483 0
 	ldr	x2, [x20, 8]
-.LBB1467:
-.LBB1468:
+.LBB1493:
+.LBB1494:
 	.loc 11 77 0
 	mov	w1, 1
 	mov	x0, x2
 	ldr	x2, [x2, 96]
 	blr	x2
 .LVL546:
-.LBE1468:
-.LBE1467:
+.LBE1494:
+.LBE1493:
 	.loc 1 1484 0
 	ldr	w1, [x20, 72]
 	mov	w0, 1
@@ -6723,18 +6723,18 @@ flip.isra.11:
 	.p2align 3
 .L642:
 	.cfi_restore_state
-.LBB1469:
-.LBB1456:
-.LBB1453:
-.LBB1452:
+.LBB1495:
+.LBB1482:
+.LBB1479:
+.LBB1478:
 	.loc 10 268 0
 	adrp	x3, dummy_dma_ops
 	add	x3, x3, :lo12:dummy_dma_ops
 	b	.L640
-.LBE1452:
-.LBE1453:
-.LBE1456:
-.LBE1469:
+.LBE1478:
+.LBE1479:
+.LBE1482:
+.LBE1495:
 	.cfi_endproc
 .LFE2879:
 	.size	flip.isra.11, .-flip.isra.11
@@ -6785,8 +6785,8 @@ ebc_frame_start:
 	.loc 1 1508 0
 	ldr	w0, [x19, 52]
 	cbz	w0, .L653
-.LBB1470:
-.LBB1471:
+.LBB1496:
+.LBB1497:
 	.loc 1 1489 0
 	str	wzr, [x21, 72]
 	.loc 1 1490 0
@@ -6794,8 +6794,8 @@ ebc_frame_start:
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
 .LVL552:
-.LBE1471:
-.LBE1470:
+.LBE1497:
+.LBE1496:
 	.loc 1 1510 0
 	ldp	x1, x2, [x19, 144]
 	mov	x4, x19
@@ -6835,8 +6835,8 @@ ebc_frame_start:
 	.loc 1 1528 0
 	ldr	w0, [x19, 52]
 	cbz	w0, .L655
-.LBB1472:
-.LBB1473:
+.LBB1498:
+.LBB1499:
 	.loc 1 1489 0
 	str	wzr, [x21, 72]
 	.loc 1 1490 0
@@ -6844,8 +6844,8 @@ ebc_frame_start:
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
 .LVL557:
-.LBE1473:
-.LBE1472:
+.LBE1499:
+.LBE1498:
 	.loc 1 1530 0
 	ldp	x1, x2, [x19, 144]
 	mov	x4, x19
@@ -6883,8 +6883,8 @@ ebc_frame_start:
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change
 .LVL561:
-.LBB1474:
-.LBB1475:
+.LBB1500:
+.LBB1501:
 	.loc 1 1489 0
 	str	wzr, [x21, 72]
 	.loc 1 1490 0
@@ -6892,8 +6892,8 @@ ebc_frame_start:
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
 .LVL562:
-.LBE1475:
-.LBE1474:
+.LBE1501:
+.LBE1500:
 	.loc 1 1569 0
 	ldr	w0, [x19, 56]
 	.loc 1 1570 0
@@ -6939,8 +6939,8 @@ ebc_frame_start:
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change_part
 .LVL566:
-.LBB1476:
-.LBB1477:
+.LBB1502:
+.LBB1503:
 	.loc 1 1489 0
 	str	wzr, [x21, 72]
 	.loc 1 1490 0
@@ -6948,8 +6948,8 @@ ebc_frame_start:
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
 .LVL567:
-.LBE1477:
-.LBE1476:
+.LBE1503:
+.LBE1502:
 	.loc 1 1556 0
 	ldr	w0, [x19, 56]
 	.loc 1 1557 0
@@ -7058,28 +7058,28 @@ ebc_power_set.part.13:
 	.loc 1 201 0
 	ldr	x1, [x0, 8]
 .LVL577:
-.LBB1478:
-.LBB1479:
+.LBB1504:
+.LBB1505:
 	.loc 11 51 0
 	mov	x0, x1
 .LVL578:
 	ldr	x1, [x1, 56]
 	blr	x1
 .LVL579:
-.LBE1479:
-.LBE1478:
+.LBE1505:
+.LBE1504:
 	.loc 1 202 0
 	ldr	x2, [x19, 16]
-.LBB1480:
-.LBB1481:
+.LBB1506:
+.LBB1507:
 	.loc 3 35 0
 	mov	w1, 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
 .LVL580:
-.LBE1481:
-.LBE1480:
+.LBE1507:
+.LBE1506:
 	.loc 1 203 0
 	ldr	w0, [x19, 624]
 	cbnz	w0, .L666
@@ -7106,14 +7106,14 @@ ebc_power_set.part.13:
 	.cfi_restore_state
 	.loc 1 204 0
 	str	wzr, [x19, 624]
-.LBB1482:
-.LBB1483:
+.LBB1508:
+.LBB1509:
 	.loc 4 68 0
 	add	x0, x19, 416
 	bl	__pm_relax
 .LVL584:
-.LBE1483:
-.LBE1482:
+.LBE1509:
+.LBE1508:
 	.loc 1 207 0
 	ldr	x0, [x19]
 	adrp	x1, .LC22
@@ -7138,7 +7138,7 @@ ebc_power_set.part.13:
 	.type	ebc_suspend, %function
 ebc_suspend:
 .LFB2864:
-	.loc 1 3121 0
+	.loc 1 3131 0
 	.cfi_startproc
 .LVL587:
 	stp	x29, x30, [sp, -32]!
@@ -7150,40 +7150,40 @@ ebc_suspend:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-.LBB1484:
-.LBB1485:
+.LBB1510:
+.LBB1511:
 	.loc 2 1181 0
 	ldr	x20, [x0, 184]
-.LBE1485:
-.LBE1484:
-	.loc 1 3125 0
+.LBE1511:
+.LBE1510:
+	.loc 1 3135 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 200]
 .LVL588:
 	cmp	w0, 1
 	beq	.L670
 .L668:
-	.loc 1 3129 0
+	.loc 1 3139 0
 	mov	w0, 1
 	str	w0, [x19, 620]
-	.loc 1 3131 0
+	.loc 1 3141 0
 	ldr	x1, [x20, 16]
-.LBB1486:
-.LBB1487:
+.LBB1512:
+.LBB1513:
 	.loc 3 40 0
 	mov	x0, x1
 	ldr	x1, [x1, 40]
 	blr	x1
 .LVL589:
-.LBE1487:
-.LBE1486:
-	.loc 1 3132 0
+.LBE1513:
+.LBE1512:
+	.loc 1 3142 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC24
 	add	x1, x1, :lo12:.LC24
 	bl	_dev_info
 .LVL590:
-	.loc 1 3135 0
+	.loc 1 3145 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -7197,7 +7197,7 @@ ebc_suspend:
 	.p2align 3
 .L670:
 	.cfi_restore_state
-	.loc 1 3126 0
+	.loc 1 3136 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
@@ -7206,15 +7206,15 @@ ebc_suspend:
 	add	x1, x1, :lo12:.LC23
 	bl	_dev_info
 .LVL591:
-.LBB1488:
-.LBB1489:
+.LBB1514:
+.LBB1515:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.13
 .LVL592:
 	b	.L668
-.LBE1489:
-.LBE1488:
+.LBE1515:
+.LBE1514:
 	.cfi_endproc
 .LFE2864:
 	.size	ebc_suspend, .-ebc_suspend
@@ -7299,29 +7299,29 @@ check_black_percent.isra.15:
 	.type	ebc_probe, %function
 ebc_probe:
 .LFB2862:
-	.loc 1 2985 0
+	.loc 1 2995 0
 	.cfi_startproc
 .LVL596:
 	stp	x29, x30, [sp, -208]!
 	.cfi_def_cfa_offset 208
 	.cfi_offset 29, -208
 	.cfi_offset 30, -200
-.LBB1634:
-.LBB1635:
+.LBB1660:
+.LBB1661:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
-.LBE1635:
-.LBE1634:
-	.loc 1 2985 0
+.LBE1661:
+.LBE1660:
+	.loc 1 2995 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 2986 0
+	.loc 1 2996 0
 	add	x22, x0, 16
-	.loc 1 2985 0
+	.loc 1 2995 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -160
 	.cfi_offset 24, -152
@@ -7337,62 +7337,62 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 2985 0
+	.loc 1 2995 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
-.LBB1637:
-.LBB1636:
+.LBB1663:
+.LBB1662:
 	.loc 2 711 0
 	mov	x0, x22
 	mov	x1, 824
 	bl	devm_kmalloc
 .LVL598:
-.LBE1636:
-.LBE1637:
-	.loc 1 3001 0
+.LBE1662:
+.LBE1663:
+	.loc 1 3011 0
 	cbz	x0, .L735
-	.loc 1 3005 0
+	.loc 1 3015 0
 	adrp	x24, .LANCHOR0
 	mov	x20, x0
-	.loc 1 3007 0
+	.loc 1 3017 0
 	adrp	x1, .LC26
 	mov	w2, 0
-	.loc 1 3005 0
+	.loc 1 3015 0
 	str	x0, [x24, #:lo12:.LANCHOR0]
-	.loc 1 3007 0
+	.loc 1 3017 0
 	add	x1, x1, :lo12:.LC26
 	ldr	x0, [x22, 752]
-	.loc 1 3004 0
+	.loc 1 3014 0
 	str	x22, [x20]
-	.loc 1 3007 0
+	.loc 1 3017 0
 	bl	of_parse_phandle
 .LVL599:
-	.loc 1 3008 0
+	.loc 1 3018 0
 	cbz	x0, .L771
-	.loc 1 3013 0
+	.loc 1 3023 0
 	bl	of_find_device_by_node
 .LVL600:
-	.loc 1 3015 0
+	.loc 1 3025 0
 	cbz	x0, .L689
-.LBB1638:
-.LBB1639:
-.LBB1640:
+.LBB1664:
+.LBB1665:
+.LBB1666:
 	.loc 2 1181 0
 	ldr	x0, [x0, 200]
 .LVL601:
-.LBE1640:
-.LBE1639:
-.LBE1638:
-	.loc 1 3018 0
+.LBE1666:
+.LBE1665:
+.LBE1664:
+	.loc 1 3028 0
 	str	x0, [x20, 8]
-	.loc 1 3019 0
+	.loc 1 3029 0
 	cbz	x0, .L689
-	.loc 1 3021 0
+	.loc 1 3031 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 3023 0
+	.loc 1 3033 0
 	add	x2, x29, 96
 	adrp	x1, .LC28
 	add	x1, x1, :lo12:.LC28
@@ -7401,42 +7401,42 @@ ebc_probe:
 .LVL602:
 	mov	x21, x0
 .LVL603:
-	.loc 1 3024 0
+	.loc 1 3034 0
 	ldrsw	x0, [x29, 96]
 .LVL604:
 	lsr	x0, x0, 2
 .LVL605:
 	str	w0, [x29, 96]
 .LVL606:
-	.loc 1 3025 0
+	.loc 1 3035 0
 	cmp	w0, 0
 	beq	.L690
-	.loc 1 3030 0 discriminator 1
+	.loc 1 3040 0 discriminator 1
 	mov	w19, 0
 .LVL607:
 	bgt	.L758
 	b	.L692
 	.p2align 3
 .L693:
-	.loc 1 3038 0
+	.loc 1 3048 0
 	bl	of_find_i2c_device_by_node
 .LVL608:
-	.loc 1 3040 0
+	.loc 1 3050 0
 	cbz	x0, .L772
-.LBB1641:
-.LBB1642:
-.LBB1643:
+.LBB1667:
+.LBB1668:
+.LBB1669:
 	.loc 2 1181 0
 	ldr	x0, [x0, 216]
 .LVL609:
-.LBE1643:
-.LBE1642:
-.LBE1641:
-	.loc 1 3045 0
+.LBE1669:
+.LBE1668:
+.LBE1667:
+	.loc 1 3055 0
 	str	x0, [x20, 16]
-	.loc 1 3046 0
+	.loc 1 3056 0
 	cbnz	x0, .L773
-	.loc 1 3030 0 discriminator 2
+	.loc 1 3040 0 discriminator 2
 	ldr	w0, [x29, 96]
 	add	w19, w19, 1
 .LVL610:
@@ -7444,24 +7444,24 @@ ebc_probe:
 	ble	.L697
 .L758:
 	ldr	w0, [x21], 4
-	.loc 1 3032 0
+	.loc 1 3042 0
 	rev	w0, w0
 	bl	of_find_node_by_phandle
 .LVL611:
-	.loc 1 3033 0
+	.loc 1 3043 0
 	cbnz	x0, .L693
-	.loc 1 3034 0
+	.loc 1 3044 0
 	adrp	x1, .LC30
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC30
-	.loc 1 3035 0
+	.loc 1 3045 0
 	mov	w25, -19
-	.loc 1 3034 0
+	.loc 1 3044 0
 	bl	_dev_err
 .LVL612:
 	.p2align 2
 .L685:
-	.loc 1 3111 0
+	.loc 1 3121 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w25
 .LVL613:
@@ -7499,7 +7499,7 @@ ebc_probe:
 	.p2align 3
 .L773:
 	.cfi_restore_state
-	.loc 1 3047 0
+	.loc 1 3057 0
 	adrp	x1, .LC32
 	mov	w2, w19
 	add	x1, x1, :lo12:.LC32
@@ -7507,65 +7507,65 @@ ebc_probe:
 	bl	_dev_info
 .LVL620:
 .L692:
-	.loc 1 3052 0
+	.loc 1 3062 0
 	ldr	x0, [x20, 16]
 	cbz	x0, .L697
-	.loc 1 3058 0
+	.loc 1 3068 0
 	add	x19, x20, 184
 .LVL621:
-	.loc 1 3060 0
+	.loc 1 3070 0
 	add	x21, x20, 24
 .LVL622:
-	.loc 1 3058 0
+	.loc 1 3068 0
 	str	x22, [x19, 104]
-.LBB1644:
-.LBB1645:
-.LBB1646:
-.LBB1647:
-.LBB1648:
+.LBB1670:
+.LBB1671:
+.LBB1672:
+.LBB1673:
+.LBB1674:
 	.file 12 "./include/linux/of.h"
 	.loc 12 499 0
 	adrp	x1, .LC34
-.LBE1648:
-.LBE1647:
-.LBE1646:
-.LBE1645:
-.LBE1644:
-	.loc 1 3060 0
+.LBE1674:
+.LBE1673:
+.LBE1672:
+.LBE1671:
+.LBE1670:
+	.loc 1 3070 0
 	str	x22, [x20, 24]
-.LBB1718:
-.LBB1715:
-.LBB1655:
-.LBB1652:
-.LBB1649:
+.LBB1744:
+.LBB1741:
+.LBB1681:
+.LBB1678:
+.LBB1675:
 	.loc 12 499 0
 	mov	x4, 0
-.LBE1649:
-.LBE1652:
-.LBE1655:
-.LBE1715:
-.LBE1718:
-	.loc 1 3061 0
+.LBE1675:
+.LBE1678:
+.LBE1681:
+.LBE1741:
+.LBE1744:
+	.loc 1 3071 0
 	ldr	x2, [x20, 8]
-.LBB1719:
-.LBB1716:
-.LBB1656:
-.LBB1653:
-.LBB1650:
+.LBB1745:
+.LBB1742:
+.LBB1682:
+.LBB1679:
+.LBB1676:
 	.loc 12 499 0
 	add	x1, x1, :lo12:.LC34
-.LBE1650:
-.LBE1653:
-.LBE1656:
-.LBE1716:
-.LBE1719:
-	.loc 1 3062 0
+.LBE1676:
+.LBE1679:
+.LBE1682:
+.LBE1742:
+.LBE1745:
+	.loc 1 3072 0
 	stp	x2, x0, [x21, 8]
-.LBB1720:
-.LBB1717:
-.LBB1657:
-.LBB1654:
-.LBB1651:
+.LBB1746:
+.LBB1743:
+.LBB1683:
+.LBB1680:
+.LBB1677:
 	.loc 12 499 0
 	mov	x3, 1
 	ldr	x0, [x22, 752]
@@ -7574,12 +7574,12 @@ ebc_probe:
 .LVL623:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
-.LBE1651:
-.LBE1654:
-.LBE1657:
-.LBB1658:
-.LBB1659:
-.LBB1660:
+.LBE1677:
+.LBE1680:
+.LBE1683:
+.LBB1684:
+.LBB1685:
+.LBB1686:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC58
@@ -7591,12 +7591,12 @@ ebc_probe:
 .LVL624:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
-.LBE1660:
-.LBE1659:
-.LBE1658:
-.LBB1661:
-.LBB1662:
-.LBB1663:
+.LBE1686:
+.LBE1685:
+.LBE1684:
+.LBB1687:
+.LBB1688:
+.LBB1689:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC59
@@ -7608,12 +7608,12 @@ ebc_probe:
 .LVL625:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
-.LBE1663:
-.LBE1662:
-.LBE1661:
-.LBB1664:
-.LBB1665:
-.LBB1666:
+.LBE1689:
+.LBE1688:
+.LBE1687:
+.LBB1690:
+.LBB1691:
+.LBB1692:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC60
@@ -7625,12 +7625,12 @@ ebc_probe:
 .LVL626:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
-.LBE1666:
-.LBE1665:
-.LBE1664:
-.LBB1667:
-.LBB1668:
-.LBB1669:
+.LBE1692:
+.LBE1691:
+.LBE1690:
+.LBB1693:
+.LBB1694:
+.LBB1695:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC61
@@ -7642,12 +7642,12 @@ ebc_probe:
 .LVL627:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
-.LBE1669:
-.LBE1668:
-.LBE1667:
-.LBB1670:
-.LBB1671:
-.LBB1672:
+.LBE1695:
+.LBE1694:
+.LBE1693:
+.LBB1696:
+.LBB1697:
+.LBB1698:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC62
@@ -7659,12 +7659,12 @@ ebc_probe:
 .LVL628:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
-.LBE1672:
-.LBE1671:
-.LBE1670:
-.LBB1673:
-.LBB1674:
-.LBB1675:
+.LBE1698:
+.LBE1697:
+.LBE1696:
+.LBB1699:
+.LBB1700:
+.LBB1701:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC63
@@ -7676,12 +7676,12 @@ ebc_probe:
 .LVL629:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
-.LBE1675:
-.LBE1674:
-.LBE1673:
-.LBB1676:
-.LBB1677:
-.LBB1678:
+.LBE1701:
+.LBE1700:
+.LBE1699:
+.LBB1702:
+.LBB1703:
+.LBB1704:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC64
@@ -7693,12 +7693,12 @@ ebc_probe:
 .LVL630:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
-.LBE1678:
-.LBE1677:
-.LBE1676:
-.LBB1679:
-.LBB1680:
-.LBB1681:
+.LBE1704:
+.LBE1703:
+.LBE1702:
+.LBB1705:
+.LBB1706:
+.LBB1707:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC65
@@ -7710,12 +7710,12 @@ ebc_probe:
 .LVL631:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
-.LBE1681:
-.LBE1680:
-.LBE1679:
-.LBB1682:
-.LBB1683:
-.LBB1684:
+.LBE1707:
+.LBE1706:
+.LBE1705:
+.LBB1708:
+.LBB1709:
+.LBB1710:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC66
@@ -7727,12 +7727,12 @@ ebc_probe:
 .LVL632:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
-.LBE1684:
-.LBE1683:
-.LBE1682:
-.LBB1685:
-.LBB1686:
-.LBB1687:
+.LBE1710:
+.LBE1709:
+.LBE1708:
+.LBB1711:
+.LBB1712:
+.LBB1713:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC67
@@ -7744,12 +7744,12 @@ ebc_probe:
 .LVL633:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
-.LBE1687:
-.LBE1686:
-.LBE1685:
-.LBB1688:
-.LBB1689:
-.LBB1690:
+.LBE1713:
+.LBE1712:
+.LBE1711:
+.LBB1714:
+.LBB1715:
+.LBB1716:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC68
@@ -7761,12 +7761,12 @@ ebc_probe:
 .LVL634:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
-.LBE1690:
-.LBE1689:
-.LBE1688:
-.LBB1691:
-.LBB1692:
-.LBB1693:
+.LBE1716:
+.LBE1715:
+.LBE1714:
+.LBB1717:
+.LBB1718:
+.LBB1719:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC69
@@ -7778,12 +7778,12 @@ ebc_probe:
 .LVL635:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
-.LBE1693:
-.LBE1692:
-.LBE1691:
-.LBB1694:
-.LBB1695:
-.LBB1696:
+.LBE1719:
+.LBE1718:
+.LBE1717:
+.LBB1720:
+.LBB1721:
+.LBB1722:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC70
@@ -7795,12 +7795,12 @@ ebc_probe:
 .LVL636:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
-.LBE1696:
-.LBE1695:
-.LBE1694:
-.LBB1697:
-.LBB1698:
-.LBB1699:
+.LBE1722:
+.LBE1721:
+.LBE1720:
+.LBB1723:
+.LBB1724:
+.LBB1725:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC71
@@ -7812,12 +7812,12 @@ ebc_probe:
 .LVL637:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
-.LBE1699:
-.LBE1698:
-.LBE1697:
-.LBB1700:
-.LBB1701:
-.LBB1702:
+.LBE1725:
+.LBE1724:
+.LBE1723:
+.LBB1726:
+.LBB1727:
+.LBB1728:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC72
@@ -7829,15 +7829,15 @@ ebc_probe:
 .LVL638:
 	.loc 12 501 0
 	tbz	w0, #31, .L725
-.LBE1702:
-.LBE1701:
-.LBE1700:
-	.loc 1 2329 0
+.LBE1728:
+.LBE1727:
+.LBE1726:
+	.loc 1 2339 0
 	str	wzr, [x21, 148]
 .L725:
-.LBB1703:
-.LBB1704:
-.LBB1705:
+.LBB1729:
+.LBB1730:
+.LBB1731:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC35
@@ -7849,15 +7849,15 @@ ebc_probe:
 .LVL639:
 	.loc 12 501 0
 	tbz	w0, #31, .L726
-.LBE1705:
-.LBE1704:
-.LBE1703:
-	.loc 1 2332 0
+.LBE1731:
+.LBE1730:
+.LBE1729:
+	.loc 1 2342 0
 	str	wzr, [x21, 152]
 .L726:
-.LBB1706:
-.LBB1707:
-.LBB1708:
+.LBB1732:
+.LBB1733:
+.LBB1734:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC36
@@ -7869,15 +7869,15 @@ ebc_probe:
 .LVL640:
 	.loc 12 501 0
 	tbz	w0, #31, .L727
-.LBE1708:
-.LBE1707:
-.LBE1706:
-	.loc 1 2335 0
+.LBE1734:
+.LBE1733:
+.LBE1732:
+	.loc 1 2345 0
 	str	wzr, [x21, 156]
 .L727:
-.LBB1709:
-.LBB1710:
-.LBB1711:
+.LBB1735:
+.LBB1736:
+.LBB1737:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC37
@@ -7889,15 +7889,15 @@ ebc_probe:
 .LVL641:
 	.loc 12 501 0
 	tbz	w0, #31, .L728
-.LBE1711:
-.LBE1710:
-.LBE1709:
-	.loc 1 2338 0
+.LBE1737:
+.LBE1736:
+.LBE1735:
+	.loc 1 2348 0
 	str	wzr, [x21, 92]
 .L728:
-.LBB1712:
-.LBB1713:
-.LBB1714:
+.LBB1738:
+.LBB1739:
+.LBB1740:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC38
@@ -7909,94 +7909,94 @@ ebc_probe:
 .LVL642:
 	.loc 12 501 0
 	tbz	w0, #31, .L729
-.LBE1714:
-.LBE1713:
-.LBE1712:
-	.loc 1 2341 0
+.LBE1740:
+.LBE1739:
+.LBE1738:
+	.loc 1 2351 0
 	str	wzr, [x21, 96]
 .L729:
-.LBE1717:
-.LBE1720:
-	.loc 1 3070 0
+.LBE1743:
+.LBE1746:
+	.loc 1 3080 0
 	ldr	w0, [x21, 88]
-.LBB1721:
-.LBB1722:
-	.loc 1 2793 0
+.LBB1747:
+.LBB1748:
+	.loc 1 2803 0
 	mov	w2, 0
-.LBE1722:
-.LBE1721:
-	.loc 1 3070 0
+.LBE1748:
+.LBE1747:
+	.loc 1 3080 0
 	str	w0, [x19, 68]
-	.loc 1 3071 0
+	.loc 1 3081 0
 	ldr	w1, [x21, 84]
 	str	w1, [x19, 72]
-	.loc 1 3074 0
+	.loc 1 3084 0
 	tst	x1, 15
-	.loc 1 3072 0
+	.loc 1 3082 0
 	mul	w0, w0, w1
-	.loc 1 3074 0
+	.loc 1 3084 0
 	cset	w1, eq
 	str	w1, [x19, 88]
-.LBB1736:
-.LBB1731:
-	.loc 1 2793 0
+.LBB1762:
+.LBB1757:
+	.loc 1 2803 0
 	adrp	x1, .LC39
 	add	x1, x1, :lo12:.LC39
-.LBE1731:
-.LBE1736:
-	.loc 1 3072 0
+.LBE1757:
+.LBE1762:
+	.loc 1 3082 0
 	lsr	w3, w0, 1
-	.loc 1 3073 0
+	.loc 1 3083 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x19, 20]
-.LBB1737:
-.LBB1732:
-	.loc 1 2784 0
+.LBB1763:
+.LBB1758:
+	.loc 1 2794 0
 	ldr	x26, [x20]
 .LVL643:
-	.loc 1 2793 0
+	.loc 1 2803 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL644:
-	.loc 1 2794 0
+	.loc 1 2804 0
 	cbz	x0, .L736
-	.loc 1 2797 0
+	.loc 1 2807 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL645:
 	mov	w25, w0
-	.loc 1 2799 0
+	.loc 1 2809 0
 	cbnz	w0, .L775
-.LBB1723:
-.LBB1724:
+.LBB1749:
+.LBB1750:
 	.file 13 "./include/linux/ioport.h"
 	.loc 13 204 0
 	ldp	x1, x2, [x29, 104]
-.LBE1724:
-.LBE1723:
-	.loc 1 2804 0
+.LBE1750:
+.LBE1749:
+	.loc 1 2814 0
 	str	x1, [x20, 184]
-	.loc 1 2807 0
+	.loc 1 2817 0
 	mov	x3, 1
 	mov	x0, x26
-.LBB1726:
-.LBB1725:
+.LBB1752:
+.LBB1751:
 	.loc 13 204 0
 	add	x2, x2, 1
 	sub	x2, x2, x1
-.LBE1725:
-.LBE1726:
-	.loc 1 2805 0
+.LBE1751:
+.LBE1752:
+	.loc 1 2815 0
 	str	w2, [x19, 16]
-	.loc 1 2807 0
+	.loc 1 2817 0
 	sxtw	x2, w2
 	bl	devm_memremap
 .LVL646:
 	str	x0, [x19, 8]
-	.loc 1 2809 0
+	.loc 1 2819 0
 	cbz	x0, .L707
-	.loc 1 2817 0
+	.loc 1 2827 0
 	mov	x1, x0
 	ldr	w2, [x19, 16]
 	ldr	x0, [x20, 184]
@@ -8004,279 +8004,279 @@ ebc_probe:
 	mov	w3, 4194304
 	bl	ebc_buf_init
 .LVL647:
-	.loc 1 2818 0
+	.loc 1 2828 0
 	cbnz	w0, .L707
-	.loc 1 2823 0
+	.loc 1 2833 0
 	ldr	x1, [x19, 8]
-	.loc 1 2824 0
+	.loc 1 2834 0
 	mov	x6, 1048576
-	.loc 1 2823 0
+	.loc 1 2833 0
 	mov	x3, 20971520
-	.loc 1 2824 0
+	.loc 1 2834 0
 	str	x6, [x21, 40]
-	.loc 1 2823 0
+	.loc 1 2833 0
 	add	x8, x1, x3
 	str	x8, [x21, 24]
 	mov	x7, 22020096
 	add	x5, x1, x7
-	.loc 1 2825 0
+	.loc 1 2835 0
 	ldr	x2, [x20, 184]
-	.loc 1 2830 0
+	.loc 1 2840 0
 	mov	x4, 23068672
 	add	x4, x1, x4
-.LBB1727:
-.LBB1728:
+.LBB1753:
+.LBB1754:
 	.loc 2 711 0
 	mov	x0, x26
-.LBE1728:
-.LBE1727:
-	.loc 1 2825 0
+.LBE1754:
+.LBE1753:
+	.loc 1 2835 0
 	add	x3, x2, x3
 	str	x3, [x21, 32]
-	.loc 1 2826 0
+	.loc 1 2836 0
 	str	x8, [x19, 184]
-	.loc 1 2825 0
+	.loc 1 2835 0
 	add	x2, x2, x7
-	.loc 1 2824 0
+	.loc 1 2834 0
 	str	x6, [x21, 64]
-	.loc 1 2825 0
+	.loc 1 2835 0
 	stp	x5, x2, [x21, 48]
-	.loc 1 2831 0
+	.loc 1 2841 0
 	mov	x2, 27262976
 	add	x2, x1, x2
 	stp	x4, x2, [x19, 144]
-	.loc 1 2832 0
+	.loc 1 2842 0
 	mov	x2, 31457280
 	add	x2, x1, x2
-	.loc 1 2826 0
+	.loc 1 2836 0
 	str	x5, [x19, 192]
-	.loc 1 2832 0
+	.loc 1 2842 0
 	str	x2, [x19, 160]
-	.loc 1 2833 0
+	.loc 1 2843 0
 	mov	x2, 35651584
 	add	x1, x1, x2
 	str	x1, [x19, 128]
-	.loc 1 2836 0
+	.loc 1 2846 0
 	ldp	w2, w1, [x21, 84]
-.LBB1730:
-.LBB1729:
+.LBB1756:
+.LBB1755:
 	.loc 2 711 0
 	mul	w1, w2, w1
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	bl	devm_kmalloc
 .LVL648:
-.LBE1729:
-.LBE1730:
-	.loc 1 2836 0
+.LBE1755:
+.LBE1756:
+	.loc 1 2846 0
 	str	x0, [x19, 168]
-	.loc 1 2837 0
+	.loc 1 2847 0
 	cbz	x0, .L707
-	.loc 1 2839 0
+	.loc 1 2849 0
 	ldp	w2, w1, [x21, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
 .LVL649:
-	.loc 1 2840 0
+	.loc 1 2850 0
 	ldrsw	x2, [x19, 20]
 	mov	w1, 255
 	ldr	x0, [x19, 160]
 	bl	memset
 .LVL650:
-.LBE1732:
-.LBE1737:
-.LBB1738:
-.LBB1739:
-	.loc 1 2741 0
+.LBE1758:
+.LBE1763:
+.LBB1764:
+.LBB1765:
+	.loc 1 2751 0
 	ldr	x26, [x19, 104]
 .LVL651:
-	.loc 1 2747 0
+	.loc 1 2757 0
 	adrp	x1, .LC41
 	mov	w2, 0
 	add	x1, x1, :lo12:.LC41
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL652:
-	.loc 1 2748 0
+	.loc 1 2758 0
 	cbz	x0, .L737
-	.loc 1 2751 0
+	.loc 1 2761 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL653:
 	mov	w25, w0
-	.loc 1 2753 0
+	.loc 1 2763 0
 	cbz	w0, .L776
 .L708:
-.LBE1739:
-.LBE1738:
-	.loc 1 3086 0
+.LBE1765:
+.LBE1764:
+	.loc 1 3096 0
 	adrp	x1, .LC74
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC74
 	bl	_dev_err
 .LVL654:
-	.loc 1 3087 0
+	.loc 1 3097 0
 	b	.L685
 .LVL655:
 	.p2align 3
 .L699:
-	.loc 1 3068 0
+	.loc 1 3078 0
 	mov	w25, -22
-	.loc 1 3067 0
+	.loc 1 3077 0
 	adrp	x1, .LC80
 	mov	w2, w25
 	add	x1, x1, :lo12:.LC80
 	mov	x0, x22
 	bl	_dev_err
 .LVL656:
-	.loc 1 3068 0
+	.loc 1 3078 0
 	b	.L685
 .LVL657:
 	.p2align 3
 .L772:
-	.loc 1 3041 0
+	.loc 1 3051 0
 	adrp	x1, .LC31
 	mov	x0, x22
 .LVL658:
 	add	x1, x1, :lo12:.LC31
-	.loc 1 3042 0
+	.loc 1 3052 0
 	mov	w25, -19
-	.loc 1 3041 0
+	.loc 1 3051 0
 	bl	_dev_err
 .LVL659:
-	.loc 1 3042 0
+	.loc 1 3052 0
 	b	.L685
 .LVL660:
 	.p2align 3
 .L697:
-	.loc 1 3053 0
+	.loc 1 3063 0
 	adrp	x1, .LC33
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC33
-	.loc 1 3054 0
+	.loc 1 3064 0
 	mov	w25, -517
-	.loc 1 3053 0
+	.loc 1 3063 0
 	bl	_dev_err
 .LVL661:
-	.loc 1 3054 0
+	.loc 1 3064 0
 	b	.L685
 .LVL662:
 	.p2align 3
 .L775:
-.LBB1747:
-.LBB1733:
-	.loc 1 2800 0
+.LBB1773:
+.LBB1759:
+	.loc 1 2810 0
 	adrp	x1, .LC40
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC40
 	bl	_dev_err
 .LVL663:
 .L704:
-.LBE1733:
-.LBE1747:
-	.loc 1 3079 0
+.LBE1759:
+.LBE1773:
+	.loc 1 3089 0
 	adrp	x1, .LC73
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC73
 	bl	_dev_err
 .LVL664:
-	.loc 1 3080 0
+	.loc 1 3090 0
 	b	.L685
 .LVL665:
 .L776:
-.LBB1748:
-.LBB1744:
-	.loc 1 2762 0
+.LBB1774:
+.LBB1770:
+	.loc 1 2772 0
 	mov	x0, x26
 	mov	x3, 1
-.LBB1740:
-.LBB1741:
+.LBB1766:
+.LBB1767:
 	.loc 13 204 0
 	ldp	x1, x26, [x29, 104]
 .LVL666:
-.LBE1741:
-.LBE1740:
-	.loc 1 2759 0
+.LBE1767:
+.LBE1766:
+	.loc 1 2769 0
 	str	x1, [x19, 32]
-.LBB1743:
-.LBB1742:
+.LBB1769:
+.LBB1768:
 	.loc 13 204 0
 	add	x26, x26, 1
 	sub	x26, x26, x1
-.LBE1742:
-.LBE1743:
-	.loc 1 2760 0
+.LBE1768:
+.LBE1769:
+	.loc 1 2770 0
 	str	w26, [x19, 40]
-	.loc 1 2762 0
+	.loc 1 2772 0
 	sxtw	x2, w26
 	bl	devm_memremap
 .LVL667:
 	str	x0, [x19, 208]
-	.loc 1 2764 0
+	.loc 1 2774 0
 	cbz	x0, .L777
-	.loc 1 2769 0
+	.loc 1 2779 0
 	bl	epd_lut_from_mem_init
 .LVL668:
-	.loc 1 2770 0
+	.loc 1 2780 0
 	tbnz	w0, #31, .L778
 .L710:
-.LBE1744:
-.LBE1748:
-.LBB1749:
-.LBB1750:
-	.loc 1 2849 0
+.LBE1770:
+.LBE1774:
+.LBB1775:
+.LBB1776:
+	.loc 1 2859 0
 	add	x0, x20, 752
 	mov	x1, 68719476704
 	str	x1, [x19, 560]
-	.loc 1 2853 0
+	.loc 1 2863 0
 	add	x24, x24, :lo12:.LANCHOR0
-.LBB1751:
-.LBB1752:
-.LBB1753:
-.LBB1754:
-.LBB1755:
+.LBB1777:
+.LBB1778:
+.LBB1779:
+.LBB1780:
+.LBB1781:
 	.file 14 "./include/linux/compiler.h"
 	.loc 14 288 0
 	str	x0, [x20, 752]
-.LBE1755:
-.LBE1754:
-.LBE1753:
-.LBE1752:
-.LBE1751:
-	.loc 1 2850 0
+.LBE1781:
+.LBE1780:
+.LBE1779:
+.LBE1778:
+.LBE1777:
+	.loc 1 2860 0
 	adrp	x5, .LC75
-.LBB1757:
-.LBB1756:
+.LBB1783:
+.LBB1782:
 	.file 15 "./include/linux/list.h"
 	.loc 15 29 0
 	str	x0, [x0, 8]
-.LBE1756:
-.LBE1757:
-	.loc 1 2849 0
+.LBE1782:
+.LBE1783:
+	.loc 1 2859 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x19, 584]
-	.loc 1 2850 0
+	.loc 1 2860 0
 	add	x5, x5, :lo12:.LC75
 	mov	w1, 14
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 1
 	movk	w1, 0xa, lsl 16
-	.loc 1 2847 0
+	.loc 1 2857 0
 	mov	w26, 99
-	.loc 1 2850 0
+	.loc 1 2860 0
 	adrp	x0, .LC76
-	.loc 1 2847 0
+	.loc 1 2857 0
 	str	w26, [x29, 104]
-	.loc 1 2850 0
+	.loc 1 2860 0
 	add	x0, x0, :lo12:.LC76
 	bl	__alloc_workqueue_key
 .LVL669:
 	str	x0, [x19, 608]
-	.loc 1 2853 0
+	.loc 1 2863 0
 	adrp	x3, .LC77
 	mov	w2, -1
 	add	x3, x3, :lo12:.LC77
@@ -8286,18 +8286,18 @@ ebc_probe:
 	bl	kthread_create_on_node
 .LVL670:
 	str	x0, [x24, 8]
-	.loc 1 2854 0
+	.loc 1 2864 0
 	cmn	x0, #4096
 	bhi	.L779
-	.loc 1 2858 0
+	.loc 1 2868 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
 .LVL671:
-	.loc 1 2859 0
+	.loc 1 2869 0
 	ldr	x2, [x24, 8]
-.LBB1758:
-.LBB1759:
+.LBB1784:
+.LBB1785:
 	.file 16 "./arch/arm64/include/asm/atomic_lse.h"
 	.loc 16 47 0
 	mov	w0, 1
@@ -8333,10 +8333,10 @@ ebc_probe:
 // 0 "" 2
 .LVL674:
 #NO_APP
-.LBE1759:
-.LBE1758:
-.LBB1760:
-	.loc 1 2862 0
+.LBE1785:
+.LBE1784:
+.LBB1786:
+	.loc 1 2872 0
 	adrp	x3, .LC46
 	adrp	x0, ebc_thread
 .LVL675:
@@ -8344,11 +8344,11 @@ ebc_probe:
 	mov	w2, -1
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x19
-.LBE1760:
-	.loc 1 2861 0
+.LBE1786:
+	.loc 1 2871 0
 	str	w26, [x29, 104]
-.LBB1761:
-	.loc 1 2862 0
+.LBB1787:
+	.loc 1 2872 0
 	bl	kthread_create_on_node
 .LVL676:
 	mov	x24, x0
@@ -8357,18 +8357,18 @@ ebc_probe:
 	bhi	.L712
 	bl	wake_up_process
 .LVL678:
-.LBE1761:
+.LBE1787:
 	str	x24, [x19, 136]
-	.loc 1 2867 0
+	.loc 1 2877 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x24
 	bl	sched_setscheduler_nocheck
 .LVL679:
-	.loc 1 2868 0
+	.loc 1 2878 0
 	ldr	x2, [x19, 136]
-.LBB1762:
-.LBB1763:
+.LBB1788:
+.LBB1789:
 	.loc 16 47 0
 	mov	w0, 1
 .LVL680:
@@ -8403,60 +8403,60 @@ ebc_probe:
 // 0 "" 2
 .LVL682:
 #NO_APP
-.LBE1763:
-.LBE1762:
-.LBE1750:
-.LBE1749:
-.LBB1766:
-.LBB1767:
-	.loc 1 2877 0
+.LBE1789:
+.LBE1788:
+.LBE1776:
+.LBE1775:
+.LBB1792:
+.LBB1793:
+	.loc 1 2887 0
 	mov	w0, -1
 .LVL683:
 	str	w0, [x19, 64]
-.LBB1768:
-.LBB1769:
+.LBB1794:
+.LBB1795:
 	.loc 4 39 0
 	add	x0, x20, 416
 .LVL684:
-.LBE1769:
-.LBE1768:
-	.loc 1 2881 0
+.LBE1795:
+.LBE1794:
+	.loc 1 2891 0
 	str	wzr, [x19, 44]
-	.loc 1 2880 0
+	.loc 1 2890 0
 	str	wzr, [x19, 96]
-.LBB1774:
-.LBB1770:
+.LBB1800:
+.LBB1796:
 	.loc 4 43 0
 	adrp	x1, .LC47
-.LBE1770:
-.LBE1774:
-	.loc 1 2876 0
+.LBE1796:
+.LBE1800:
+	.loc 1 2886 0
 	str	wzr, [x19, 200]
-.LBB1775:
-.LBB1771:
+.LBB1801:
+.LBB1797:
 	.loc 4 43 0
 	add	x1, x1, :lo12:.LC47
-.LBE1771:
-.LBE1775:
-	.loc 1 2878 0
-	str	wzr, [x19, 616]
+.LBE1797:
+.LBE1801:
 	.loc 1 2888 0
+	str	wzr, [x19, 616]
+	.loc 1 2898 0
 	add	x24, x20, 632
 .LVL685:
-	.loc 1 2879 0
-	str	wzr, [x19, 620]
 	.loc 1 2889 0
+	str	wzr, [x19, 620]
+	.loc 1 2899 0
 	adrp	x26, jiffies
-.LBB1776:
-.LBB1772:
+.LBB1802:
+.LBB1798:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0]
-.LBE1772:
-.LBE1776:
-	.loc 1 2889 0
+.LBE1798:
+.LBE1802:
+	.loc 1 2899 0
 	mov	x27, 268435455
-.LBB1777:
-.LBB1773:
+.LBB1803:
+.LBB1799:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0, 16]
 	stp	xzr, xzr, [x0, 32]
@@ -8475,11 +8475,11 @@ ebc_probe:
 	.loc 4 45 0
 	bl	wakeup_source_add
 .LVL686:
-.LBE1773:
-.LBE1777:
-	.loc 1 2885 0
+.LBE1799:
+.LBE1803:
+	.loc 1 2895 0
 	str	wzr, [x19, 440]
-	.loc 1 2888 0
+	.loc 1 2898 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -8488,16 +8488,16 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
 .LVL687:
-	.loc 1 2889 0
+	.loc 1 2899 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
-	.loc 1 2892 0
+	.loc 1 2902 0
 	add	x24, x20, 688
-	.loc 1 2889 0
+	.loc 1 2899 0
 	add	x1, x1, x27
 	bl	mod_timer
 .LVL688:
-	.loc 1 2892 0
+	.loc 1 2902 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -8506,109 +8506,109 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
 .LVL689:
-	.loc 1 2893 0
+	.loc 1 2903 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
 	add	x1, x1, x27
 	bl	mod_timer
 .LVL690:
-.LBE1767:
-.LBE1766:
-.LBB1778:
-.LBB1779:
-	.loc 1 2903 0
+.LBE1793:
+.LBE1792:
+.LBB1804:
+.LBB1805:
+	.loc 1 2913 0
 	adrp	x0, saved_command_line
 	adrp	x1, .LC48
-	.loc 1 2900 0
+	.loc 1 2910 0
 	stp	wzr, wzr, [x29, 100]
 .LVL691:
-	.loc 1 2903 0
+	.loc 1 2913 0
 	add	x1, x1, :lo12:.LC48
 	ldr	x24, [x0, #:lo12:saved_command_line]
 	mov	x0, x24
 	bl	strstr
 .LVL692:
-	.loc 1 2904 0
+	.loc 1 2914 0
 	adrp	x1, .LC49
-	.loc 1 2903 0
+	.loc 1 2913 0
 	mov	x26, x0
 .LVL693:
-	.loc 1 2904 0
+	.loc 1 2914 0
 	add	x1, x1, :lo12:.LC49
 	mov	x0, x24
 	bl	strstr
 .LVL694:
 	mov	x28, x0
 .LVL695:
-	.loc 1 2909 0
+	.loc 1 2919 0
 	cbz	x26, .L713
-	.loc 1 2910 0
+	.loc 1 2920 0
 	add	x2, x29, 100
 	adrp	x1, .LC50
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC50
 	bl	sscanf
 .LVL696:
-	.loc 1 2911 0
+	.loc 1 2921 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
 	bls	.L780
 .L713:
-	.loc 1 2923 0
+	.loc 1 2933 0
 	mov	w24, 0
 .LVL697:
 	mov	x27, 0
 .LVL698:
-	.loc 1 2907 0
+	.loc 1 2917 0
 	mov	x26, 0
 .LVL699:
-	.loc 1 2923 0
+	.loc 1 2933 0
 	cbz	x28, .L733
 .LVL700:
 .L732:
-	.loc 1 2924 0
+	.loc 1 2934 0
 	add	x2, x29, 104
 	mov	x0, x28
 	adrp	x1, .LC53
 	add	x1, x1, :lo12:.LC53
 	bl	sscanf
 .LVL701:
-	.loc 1 2902 0
+	.loc 1 2912 0
 	mov	w28, 0
 .LVL702:
-	.loc 1 2925 0
+	.loc 1 2935 0
 	ldr	w2, [x29, 104]
-	.loc 1 2907 0
+	.loc 1 2917 0
 	mov	x26, 0
 .LVL703:
-	.loc 1 2925 0
+	.loc 1 2935 0
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
 	bls	.L781
 .L717:
-	.loc 1 2937 0
+	.loc 1 2947 0
 	cbnz	w24, .L716
 .LVL704:
 .L733:
-	.loc 1 2938 0
+	.loc 1 2948 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC56
 	add	x1, x1, :lo12:.LC56
 	bl	_dev_info
 .LVL705:
-	.loc 1 2939 0
+	.loc 1 2949 0
 	ldr	x0, [x20, 16]
 	bl	ebc_pmic_verity_vcom
 .LVL706:
-.LBB1780:
-.LBB1781:
-	.loc 1 2248 0
+.LBB1806:
+.LBB1807:
+	.loc 1 2258 0
 	bl	ebc_empty_buf_get
 .LVL707:
 	mov	x24, x0
 .LVL708:
-	.loc 1 2249 0
+	.loc 1 2259 0
 	ldp	w2, w0, [x20, 108]
 	mov	w1, 255
 	mul	w2, w2, w0
@@ -8616,109 +8616,109 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memset
 .LVL709:
-	.loc 1 2252 0
+	.loc 1 2262 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2250 0
+	.loc 1 2260 0
 	mov	w0, 17
 	str	w0, [x24, 40]
-	.loc 1 2255 0
+	.loc 1 2265 0
 	mov	w2, 16
-	.loc 1 2256 0
+	.loc 1 2266 0
 	mov	x0, x24
-	.loc 1 2253 0
+	.loc 1 2263 0
 	ldr	w1, [x20, 108]
 	str	w1, [x24, 56]
-	.loc 1 2254 0
+	.loc 1 2264 0
 	ldr	w1, [x20, 112]
-	.loc 1 2255 0
+	.loc 1 2265 0
 	stp	w1, w2, [x24, 60]
-	.loc 1 2256 0
+	.loc 1 2266 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL710:
 .L719:
-.LBE1781:
-.LBE1780:
-	.loc 1 2957 0
+.LBE1807:
+.LBE1806:
+	.loc 1 2967 0
 	cbnz	w28, .L782
 .L721:
-	.loc 1 2971 0
+	.loc 1 2981 0
 	ldr	w0, [x19, 96]
 	adrp	x21, .LANCHOR1
 	cbz	w0, .L783
 .L723:
-	.loc 1 2976 0
+	.loc 1 2986 0
 	cbz	x27, .L724
-	.loc 1 2977 0
+	.loc 1 2987 0
 	mov	x0, x27
 	bl	kfree
 .LVL711:
 .L724:
-	.loc 1 2978 0
+	.loc 1 2988 0
 	cbz	x26, .L715
-	.loc 1 2979 0
+	.loc 1 2989 0
 	mov	x0, x26
 	bl	kfree
 .LVL712:
 .L715:
-.LBE1779:
-.LBE1778:
-.LBB1791:
-.LBB1792:
-.LBB1793:
+.LBE1805:
+.LBE1804:
+.LBB1817:
+.LBB1818:
+.LBB1819:
 	.loc 2 1186 0
 	str	x20, [x22, 184]
-.LBE1793:
-.LBE1792:
-.LBE1791:
-.LBB1794:
-.LBB1795:
-	.loc 1 2724 0
+.LBE1819:
+.LBE1818:
+.LBE1817:
+.LBB1820:
+.LBB1821:
+	.loc 1 2734 0
 	add	x21, x21, :lo12:.LANCHOR1
 	add	x0, x21, 224
 	bl	misc_register
 .LVL713:
-	.loc 1 2725 0
+	.loc 1 2735 0
 	add	x0, x21, 376
 	bl	misc_register
 .LVL714:
-	.loc 1 2727 0
+	.loc 1 2737 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 456
 	bl	device_create_file
 .LVL715:
-	.loc 1 2728 0
+	.loc 1 2738 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 488
 	bl	device_create_file
 .LVL716:
-	.loc 1 2729 0
+	.loc 1 2739 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 520
 	bl	device_create_file
 .LVL717:
-	.loc 1 2730 0
+	.loc 1 2740 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 552
 	bl	device_create_file
 .LVL718:
-	.loc 1 2731 0
+	.loc 1 2741 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 584
 	bl	device_create_file
 .LVL719:
-	.loc 1 2732 0
+	.loc 1 2742 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 616
 	bl	device_create_file
 .LVL720:
-	.loc 1 2733 0
+	.loc 1 2743 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 648
 	bl	device_create_file
 .LVL721:
-.LBE1795:
-.LBE1794:
-	.loc 1 3108 0
+.LBE1821:
+.LBE1820:
+	.loc 1 3118 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LC16
 	adrp	x1, .LC57
@@ -8726,16 +8726,16 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC57
 	bl	_dev_info
 .LVL722:
-	.loc 1 3110 0
+	.loc 1 3120 0
 	b	.L685
 .LVL723:
 .L783:
-.LBB1796:
-.LBB1788:
-	.loc 1 2972 0
+.LBB1822:
+.LBB1814:
+	.loc 1 2982 0
 	mov	w2, 1
 	str	w2, [x19, 96]
-	.loc 1 2973 0
+	.loc 1 2983 0
 	add	x0, x21, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
@@ -8744,18 +8744,18 @@ ebc_probe:
 	b	.L723
 .LVL725:
 .L780:
-	.loc 1 2913 0
+	.loc 1 2923 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC51
 	add	x1, x1, :lo12:.LC51
 	bl	_dev_info
 .LVL726:
-	.loc 1 2914 0
+	.loc 1 2924 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
-.LBB1782:
-.LBB1783:
-.LBB1784:
+.LBB1808:
+.LBB1809:
+.LBB1810:
 	.file 17 "./include/linux/slab.h"
 	.loc 17 553 0
 	mov	w1, 32960
@@ -8765,12 +8765,12 @@ ebc_probe:
 .LVL727:
 	mov	x27, x0
 .LVL728:
-.LBE1784:
-.LBE1783:
-.LBE1782:
-	.loc 1 2915 0
+.LBE1810:
+.LBE1809:
+.LBE1808:
+	.loc 1 2925 0
 	cbz	x0, .L784
-	.loc 1 2919 0
+	.loc 1 2929 0
 	ldp	w2, w1, [x21, 84]
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
@@ -8783,23 +8783,23 @@ ebc_probe:
 	add	x1, x3, x1
 	bl	memcpy
 .LVL731:
-	.loc 1 2923 0
+	.loc 1 2933 0
 	cbnz	x28, .L785
-	.loc 1 2902 0
+	.loc 1 2912 0
 	mov	w28, 0
 .LVL732:
-	.loc 1 2907 0
+	.loc 1 2917 0
 	mov	x26, 0
 .LVL733:
 .L716:
-	.loc 1 2944 0
+	.loc 1 2954 0
 	bl	ebc_empty_buf_get
 .LVL734:
 	mov	x24, x0
 .LVL735:
-	.loc 1 2945 0
+	.loc 1 2955 0
 	cbz	x0, .L719
-	.loc 1 2946 0
+	.loc 1 2956 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
@@ -8807,40 +8807,40 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL736:
-	.loc 1 2949 0
+	.loc 1 2959 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2947 0
+	.loc 1 2957 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2952 0
+	.loc 1 2962 0
 	mov	w2, 16
-	.loc 1 2953 0
+	.loc 1 2963 0
 	mov	x0, x24
-	.loc 1 2950 0
+	.loc 1 2960 0
 	ldr	w1, [x21, 84]
 	str	w1, [x24, 56]
-	.loc 1 2951 0
+	.loc 1 2961 0
 	ldr	w1, [x21, 88]
-	.loc 1 2952 0
+	.loc 1 2962 0
 	stp	w1, w2, [x24, 60]
-	.loc 1 2953 0
+	.loc 1 2963 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL737:
 	b	.L719
 .LVL738:
 .L781:
-	.loc 1 2927 0
+	.loc 1 2937 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC54
 	add	x1, x1, :lo12:.LC54
 	bl	_dev_info
 .LVL739:
-	.loc 1 2928 0
+	.loc 1 2938 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
-.LBB1785:
-.LBB1786:
-.LBB1787:
+.LBB1811:
+.LBB1812:
+.LBB1813:
 	.loc 17 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
@@ -8848,16 +8848,16 @@ ebc_probe:
 	bl	__kmalloc
 .LVL740:
 	mov	x26, x0
-.LBE1787:
-.LBE1786:
-.LBE1785:
-	.loc 1 2929 0
+.LBE1813:
+.LBE1812:
+.LBE1811:
+	.loc 1 2939 0
 	cbz	x0, .L786
-	.loc 1 2933 0
+	.loc 1 2943 0
 	ldp	w2, w1, [x21, 84]
-	.loc 1 2926 0
+	.loc 1 2936 0
 	mov	w28, 1
-	.loc 1 2933 0
+	.loc 1 2943 0
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
@@ -8872,23 +8872,23 @@ ebc_probe:
 	b	.L717
 .LVL744:
 .L689:
-.LBE1788:
-.LBE1796:
-	.loc 1 3016 0
+.LBE1814:
+.LBE1822:
+	.loc 1 3026 0
 	mov	w25, -517
 	b	.L685
 .LVL745:
 .L782:
-.LBB1797:
-.LBB1789:
-	.loc 1 2958 0
+.LBB1823:
+.LBB1815:
+	.loc 1 2968 0
 	bl	ebc_empty_buf_get
 .LVL746:
 	mov	x24, x0
 .LVL747:
-	.loc 1 2959 0
+	.loc 1 2969 0
 	cbz	x0, .L721
-	.loc 1 2960 0
+	.loc 1 2970 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
@@ -8896,69 +8896,69 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL748:
-	.loc 1 2963 0
+	.loc 1 2973 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2961 0
+	.loc 1 2971 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2966 0
+	.loc 1 2976 0
 	mov	w1, 16
-	.loc 1 2964 0
+	.loc 1 2974 0
 	ldr	w0, [x21, 84]
 	str	w0, [x24, 56]
-	.loc 1 2965 0
+	.loc 1 2975 0
 	ldr	w0, [x21, 88]
-	.loc 1 2966 0
+	.loc 1 2976 0
 	stp	w0, w1, [x24, 60]
-	.loc 1 2967 0
+	.loc 1 2977 0
 	mov	x0, x24
 	bl	ebc_add_to_dsp_buf_list
 .LVL749:
 	b	.L721
 .LVL750:
 .L735:
-.LBE1789:
-.LBE1797:
-	.loc 1 3002 0
+.LBE1815:
+.LBE1823:
+	.loc 1 3012 0
 	mov	w25, -12
 	b	.L685
 .LVL751:
 .L690:
-	.loc 1 3026 0
+	.loc 1 3036 0
 	adrp	x1, .LC29
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC29
-	.loc 1 3027 0
+	.loc 1 3037 0
 	mov	w25, -22
-	.loc 1 3026 0
+	.loc 1 3036 0
 	bl	_dev_err
 .LVL752:
-	.loc 1 3027 0
+	.loc 1 3037 0
 	b	.L685
 .LVL753:
 .L778:
-.LBB1798:
-.LBB1745:
-	.loc 1 2771 0
+.LBB1824:
+.LBB1771:
+	.loc 1 2781 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC43
 	add	x1, x1, :lo12:.LC43
 	bl	_dev_err
 .LVL754:
-	.loc 1 2772 0
+	.loc 1 2782 0
 	ldr	x0, [x19, 104]
 	mov	w2, w26
 	ldr	x1, [x19, 208]
 	bl	epd_lut_from_file_init
 .LVL755:
-	.loc 1 2773 0
+	.loc 1 2783 0
 	tbz	w0, #31, .L710
-	.loc 1 2774 0
+	.loc 1 2784 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC44
-	.loc 1 2775 0
+	.loc 1 2785 0
 	mov	w25, -1
-	.loc 1 2774 0
+	.loc 1 2784 0
 	add	x1, x1, :lo12:.LC44
 	bl	_dev_err
 .LVL756:
@@ -8966,114 +8966,114 @@ ebc_probe:
 .LVL757:
 	.p2align 3
 .L707:
-.LBE1745:
-.LBE1798:
-.LBB1799:
-.LBB1734:
-	.loc 1 2810 0
+.LBE1771:
+.LBE1824:
+.LBB1825:
+.LBB1760:
+	.loc 1 2820 0
 	mov	w25, -12
 	b	.L704
 .LVL758:
 .L779:
-.LBE1734:
-.LBE1799:
-.LBB1800:
-.LBB1764:
-	.loc 1 2855 0
+.LBE1760:
+.LBE1825:
+.LBB1826:
+.LBB1790:
+	.loc 1 2865 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC45
 	add	x1, x1, :lo12:.LC45
 	bl	_dev_err
 .LVL759:
 .L711:
-.LBE1764:
-.LBE1800:
-	.loc 1 3093 0
+.LBE1790:
+.LBE1826:
+	.loc 1 3103 0
 	adrp	x1, .LC79
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC79
-	.loc 1 3094 0
+	.loc 1 3104 0
 	mov	w25, -1
-	.loc 1 3093 0
+	.loc 1 3103 0
 	bl	_dev_err
 .LVL760:
-	.loc 1 3094 0
+	.loc 1 3104 0
 	b	.L685
 .LVL761:
 .L712:
-.LBB1801:
-.LBB1765:
-	.loc 1 2864 0
+.LBB1827:
+.LBB1791:
+	.loc 1 2874 0
 	ldr	x0, [x19, 104]
 .LVL762:
 	adrp	x1, .LC78
-	.loc 1 2862 0
+	.loc 1 2872 0
 	str	x24, [x19, 136]
-	.loc 1 2864 0
+	.loc 1 2874 0
 	add	x1, x1, :lo12:.LC78
 	bl	_dev_err
 .LVL763:
 	b	.L711
 .LVL764:
 .L771:
-.LBE1765:
-.LBE1801:
-	.loc 1 3009 0
+.LBE1791:
+.LBE1827:
+	.loc 1 3019 0
 	adrp	x1, .LC27
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC27
-	.loc 1 3010 0
+	.loc 1 3020 0
 	mov	w25, -19
-	.loc 1 3009 0
+	.loc 1 3019 0
 	bl	_dev_err
 .LVL765:
-	.loc 1 3010 0
+	.loc 1 3020 0
 	b	.L685
 .LVL766:
 .L736:
-.LBB1802:
-.LBB1735:
-	.loc 1 2795 0
+.LBB1828:
+.LBB1761:
+	.loc 1 2805 0
 	mov	w25, -19
 	b	.L704
 .LVL767:
 .L737:
-.LBE1735:
-.LBE1802:
-.LBB1803:
-.LBB1746:
-	.loc 1 2749 0
+.LBE1761:
+.LBE1828:
+.LBB1829:
+.LBB1772:
+	.loc 1 2759 0
 	mov	w25, -19
 	b	.L708
 .LVL768:
 .L777:
-	.loc 1 2765 0
+	.loc 1 2775 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
 	adrp	x1, .LC42
-	mov	w3, 2765
+	mov	w3, 2775
 	add	x2, x2, 32
 	add	x1, x1, :lo12:.LC42
-	.loc 1 2766 0
+	.loc 1 2776 0
 	mov	w25, -12
-	.loc 1 2765 0
+	.loc 1 2775 0
 	bl	_dev_err
 .LVL769:
 	b	.L708
 .LVL770:
 .L785:
-.LBE1746:
-.LBE1803:
-.LBB1804:
-.LBB1790:
-	.loc 1 2912 0
+.LBE1772:
+.LBE1829:
+.LBB1830:
+.LBB1816:
+	.loc 1 2922 0
 	mov	w24, 1
 .LVL771:
 	b	.L732
 .LVL772:
 .L784:
-	.loc 1 2916 0
+	.loc 1 2926 0
 	ldr	x0, [x19, 104]
 .LVL773:
 	adrp	x1, .LC52
@@ -9084,7 +9084,7 @@ ebc_probe:
 	b	.L715
 .LVL775:
 .L786:
-	.loc 1 2930 0
+	.loc 1 2940 0
 	ldr	x0, [x19, 104]
 .LVL776:
 	adrp	x1, .LC55
@@ -9095,9 +9095,9 @@ ebc_probe:
 	b	.L715
 .LVL778:
 .L774:
-.LBE1790:
-.LBE1804:
-	.loc 1 3111 0
+.LBE1816:
+.LBE1830:
+	.loc 1 3121 0
 	bl	__stack_chk_fail
 .LVL779:
 	.cfi_endproc
@@ -9134,27 +9134,27 @@ ebc_power_set.constprop.17:
 	str	w1, [x20, 200]
 	.loc 1 194 0
 	ldr	x2, [x19, 16]
-.LBB1805:
-.LBB1806:
+.LBB1831:
+.LBB1832:
 	.loc 3 30 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
 .LVL782:
-.LBE1806:
-.LBE1805:
+.LBE1832:
+.LBE1831:
 	.loc 1 195 0
 	ldr	x2, [x19, 8]
-.LBB1807:
-.LBB1808:
+.LBB1833:
+.LBB1834:
 	.loc 11 46 0
 	add	x1, x19, 24
 	mov	x0, x2
 	ldr	x2, [x2, 48]
 	blr	x2
 .LVL783:
-.LBE1808:
-.LBE1807:
+.LBE1834:
+.LBE1833:
 	.loc 1 196 0
 	ldr	x0, [x19]
 	adrp	x1, .LC81
@@ -9180,15 +9180,15 @@ ebc_power_set.constprop.17:
 	.loc 1 190 0
 	mov	w0, 1
 	str	w0, [x20, 440]
-.LBB1809:
-.LBB1810:
+.LBB1835:
+.LBB1836:
 	.loc 4 58 0
 	add	x0, x19, 416
 	bl	__pm_stay_awake
 .LVL787:
 	b	.L788
-.LBE1810:
-.LBE1809:
+.LBE1836:
+.LBE1835:
 	.cfi_endproc
 .LFE2887:
 	.size	ebc_power_set.constprop.17, .-ebc_power_set.constprop.17
@@ -9881,14 +9881,14 @@ ebc_auto_tast_function:
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
-.LBB1811:
-.LBB1812:
-.LBB1813:
+.LBB1837:
+.LBB1838:
+.LBB1839:
 	.loc 14 288 0
 	mov	x24, 2
-.LBE1813:
-.LBE1812:
-.LBE1811:
+.LBE1839:
+.LBE1838:
+.LBE1837:
 	.loc 1 1581 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -32
@@ -9905,9 +9905,9 @@ ebc_auto_tast_function:
 	add	x25, x22, 744
 	.loc 1 1647 0
 	add	x26, x26, :lo12:.LC82
-.LBB1818:
-.LBB1815:
-.LBB1816:
+.LBB1844:
+.LBB1841:
+.LBB1842:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -9918,9 +9918,9 @@ ebc_auto_tast_function:
 	b	.L880
 	.p2align 3
 .L877:
-.LBE1816:
-.LBE1815:
-.LBE1818:
+.LBE1842:
+.LBE1841:
+.LBE1844:
 	.loc 1 1667 0
 	mov	x0, x20
 	bl	up
@@ -9933,14 +9933,14 @@ ebc_auto_tast_function:
 	mov	x0, x20
 	bl	down
 .LVL860:
-.LBB1819:
-.LBB1817:
-.LBB1814:
+.LBB1845:
+.LBB1843:
+.LBB1840:
 	.loc 14 288 0
 	str	x24, [x23, 32]
-.LBE1814:
-.LBE1817:
-.LBE1819:
+.LBE1840:
+.LBE1843:
+.LBE1845:
 	.loc 1 1591 0
 #APP
 // 1591 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
@@ -9984,8 +9984,8 @@ ebc_auto_tast_function:
 	.loc 1 1646 0
 	ldr	w0, [x19, 52]
 	cbz	w0, .L892
-.LBB1820:
-.LBB1821:
+.LBB1846:
+.LBB1847:
 	.file 18 "./include/linux/workqueue.h"
 	.loc 18 518 0
 	ldr	x1, [x19, 608]
@@ -9996,8 +9996,8 @@ ebc_auto_tast_function:
 	b	.L877
 	.p2align 3
 .L869:
-.LBE1821:
-.LBE1820:
+.LBE1847:
+.LBE1846:
 	.loc 1 1631 0
 	ldr	w1, [x19, 56]
 	.loc 1 1632 0
@@ -10145,7 +10145,15 @@ ebc_thread:
 	.cfi_offset 24, -184
 	adrp	x24, __stack_chk_guard
 	stp	x27, x28, [sp, 80]
+.LBB1882:
+.LBB1883:
+.LBB1884:
+	.loc 1 2221 0
 	adrp	x23, .LANCHOR1
+.LBE1884:
+.LBE1883:
+.LBE1882:
+	.loc 1 1895 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 27, -160
 	.cfi_offset 28, -152
@@ -10157,26 +10165,26 @@ ebc_thread:
 	.loc 1 1896 0
 	ldr	x20, [x22, #:lo12:.LANCHOR0]
 .LVL876:
-.LBB1852:
-.LBB1853:
-.LBB1854:
-	.loc 1 2232 0
+.LBB1893:
+.LBB1890:
+.LBB1887:
+	.loc 1 2221 0
 	add	x23, x23, :lo12:.LANCHOR1
-.LBE1854:
-.LBE1853:
-.LBE1852:
+.LBE1887:
+.LBE1890:
+.LBE1893:
 	.loc 1 1895 0
 	ldr	x1, [x0]
 	str	x1, [x29, 232]
 	mov	x1,0
-.LBB1859:
-.LBB1857:
-.LBB1855:
-	.loc 1 2232 0
+.LBB1894:
+.LBB1891:
+.LBB1888:
+	.loc 1 2221 0
 	add	x19, x23, 304
-.LBE1855:
-.LBE1857:
-.LBE1859:
+.LBE1888:
+.LBE1891:
+.LBE1894:
 	.loc 1 1897 0
 	add	x28, x20, 184
 	.loc 1 1900 0
@@ -10186,7 +10194,7 @@ ebc_thread:
 .L895:
 	.loc 1 1905 0
 	ldr	w0, [x28, 624]
-	cbnz	w0, .L1068
+	cbnz	w0, .L1072
 .L896:
 	.loc 1 1911 0
 	bl	ebc_dsp_buf_get
@@ -10221,7 +10229,6 @@ ebc_thread:
 	.loc 1 1981 0
 	ldr	w0, [x28, 444]
 	cbz	w0, .L914
-.L1076:
 	ldr	x0, [x28, 216]
 .L915:
 	.loc 1 1984 0
@@ -10238,23 +10245,21 @@ ebc_thread:
 	.loc 1 1987 0
 	ldr	w0, [x28, 44]
 	cmp	w0, 1
-	beq	.L1069
-.L1061:
+	beq	.L1073
+.L1066:
 	ldr	w2, [x26, 40]
 .L916:
 	.loc 1 1994 0
 	cmp	w2, 23
-	bls	.L1070
+	bls	.L1074
 	.loc 1 2180 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC93
 	add	x1, x1, :lo12:.LC93
 	bl	_dev_err
 .LVL882:
-.L1060:
 	.loc 1 2181 0
 	mov	x0, x26
-.L1059:
 	bl	ebc_remove_from_dsp_buf_list
 .LVL883:
 	.loc 1 2182 0
@@ -10266,19 +10271,19 @@ ebc_thread:
 	cbz	w0, .L896
 .LVL885:
 	.p2align 2
-.L1068:
+.L1072:
 	.loc 1 1906 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	beq	.L1071
+	beq	.L1075
 .L897:
-	.loc 1 2242 0
+	.loc 1 2252 0
 	add	x24, x24, :lo12:__stack_chk_guard
 	mov	w0, 0
 	ldr	x2, [x29, 232]
 	ldr	x1, [x24]
 	eor	x1, x2, x1
-	cbnz	x1, .L1072
+	cbnz	x1, .L1076
 	ldp	x19, x20, [sp, 16]
 .LVL886:
 	ldp	x21, x22, [sp, 32]
@@ -10307,47 +10312,25 @@ ebc_thread:
 	.p2align 3
 .L898:
 	.cfi_restore_state
-	.loc 1 2219 0
-	ldr	w0, [x28, 44]
-.LVL890:
-	cmp	w0, 1
-	beq	.L1073
-	.loc 1 2228 0
-	ldr	w0, [x28, 200]
-	cmp	w0, 1
-	beq	.L1074
-.LVL891:
-.L1063:
+	.loc 1 2220 0
 	ldr	w0, [x28, 96]
-.LVL892:
-	.loc 1 2231 0
-	cbz	w0, .L1075
-.L1003:
-.LVL893:
-.L993:
-	.loc 1 2236 0
-	ldr	w0, [x28, 200]
-.LVL894:
-	.loc 1 2233 0
+.LVL890:
+	cbz	w0, .L1077
+	.loc 1 2225 0
 	str	wzr, [x28, 96]
-	.loc 1 2236 0
-	cbnz	w0, .L895
-	.loc 1 2237 0
-	mov	x0, x20
-	bl	ebc_power_set.constprop.17
-.LVL895:
+	.loc 1 2226 0
 	b	.L895
-.LVL896:
+.LVL891:
 	.p2align 3
 .L899:
 	.loc 1 1918 0
 	add	x21, x22, :lo12:.LANCHOR0
-.LVL897:
+.LVL892:
 	ldr	w2, [x21, 16]
 	cbz	w2, .L901
 	.loc 1 1919 0
 	ldr	w0, [x21, 20]
-.LVL898:
+.LVL893:
 	cmp	w0, 5
 	add	w0, w0, 1
 	str	w0, [x21, 20]
@@ -10360,26 +10343,22 @@ ebc_thread:
 	ldr	w1, [x26, 64]
 	ldr	x0, [x26, 16]
 	bl	check_black_percent.isra.15
-.LVL899:
-	cbnz	w0, .L1060
-	.loc 1 1979 0
-	adrp	x21, jiffies
-	mov	x1, 402653184
-	add	x0, x20, 632
-	ldr	x2, [x21, #:lo12:jiffies]
-	add	x1, x2, x1
-	bl	mod_timer
-.LVL900:
-	.loc 1 1981 0
-	ldr	w0, [x28, 444]
-	cbnz	w0, .L1076
-.L914:
-	.loc 1 1982 0
+.LVL894:
+	cbz	w0, .L900
+.L1064:
+	.loc 1 2001 0
 	mov	x0, x26
-	str	x26, [x28, 216]
-	b	.L915
+.L1065:
+	bl	ebc_remove_from_dsp_buf_list
+.LVL895:
+	.loc 1 2002 0
+	mov	x0, x26
+	bl	ebc_buf_release
+.LVL896:
+	.loc 1 2004 0
+	b	.L895
 	.p2align 3
-.L1070:
+.L1074:
 	.loc 1 1994 0
 	adrp	x0, .L924
 	add	x0, x0, :lo12:.L924
@@ -10394,37 +10373,37 @@ ebc_thread:
 .L924:
 	.2byte	(.L923 - .Lrtx924) / 4
 	.2byte	(.L925 - .Lrtx924) / 4
-	.2byte	(.L1009 - .Lrtx924) / 4
-	.2byte	(.L1009 - .Lrtx924) / 4
-	.2byte	(.L1009 - .Lrtx924) / 4
-	.2byte	(.L1009 - .Lrtx924) / 4
-	.2byte	(.L1009 - .Lrtx924) / 4
+	.2byte	(.L1012 - .Lrtx924) / 4
+	.2byte	(.L1012 - .Lrtx924) / 4
+	.2byte	(.L1012 - .Lrtx924) / 4
+	.2byte	(.L1012 - .Lrtx924) / 4
+	.2byte	(.L1012 - .Lrtx924) / 4
 	.2byte	(.L927 - .Lrtx924) / 4
 	.2byte	(.L927 - .Lrtx924) / 4
-	.2byte	(.L1009 - .Lrtx924) / 4
-	.2byte	(.L1009 - .Lrtx924) / 4
+	.2byte	(.L1012 - .Lrtx924) / 4
+	.2byte	(.L1012 - .Lrtx924) / 4
 	.2byte	(.L927 - .Lrtx924) / 4
-	.2byte	(.L1009 - .Lrtx924) / 4
-	.2byte	(.L1009 - .Lrtx924) / 4
+	.2byte	(.L1012 - .Lrtx924) / 4
+	.2byte	(.L1012 - .Lrtx924) / 4
 	.2byte	(.L927 - .Lrtx924) / 4
 	.2byte	(.L927 - .Lrtx924) / 4
-	.2byte	(.L1009 - .Lrtx924) / 4
-	.2byte	(.L1009 - .Lrtx924) / 4
-	.2byte	(.L1009 - .Lrtx924) / 4
-	.2byte	(.L1009 - .Lrtx924) / 4
-	.2byte	(.L1009 - .Lrtx924) / 4
-	.2byte	(.L1009 - .Lrtx924) / 4
+	.2byte	(.L1012 - .Lrtx924) / 4
+	.2byte	(.L1012 - .Lrtx924) / 4
+	.2byte	(.L1012 - .Lrtx924) / 4
+	.2byte	(.L1012 - .Lrtx924) / 4
+	.2byte	(.L1012 - .Lrtx924) / 4
+	.2byte	(.L1012 - .Lrtx924) / 4
 	.2byte	(.L923 - .Lrtx924) / 4
 	.2byte	(.L923 - .Lrtx924) / 4
 	.text
-.L1009:
+.L1012:
 	.loc 1 2106 0
 	mov	w4, 1
-.LVL901:
+.LVL897:
 .L926:
 	.loc 1 2113 0
 	ldr	x25, [x28, 216]
-.LVL902:
+.LVL898:
 	.loc 1 2115 0
 	ldr	w0, [x25, 40]
 	sub	w1, w0, #22
@@ -10455,24 +10434,24 @@ ebc_thread:
 	.loc 1 2129 0
 	ldr	x1, [x28, 216]
 	ldr	w0, [x26, 64]
-.LBB1860:
-.LBB1861:
+.LBB1895:
+.LBB1896:
 	.loc 1 1858 0
 	ldr	w2, [x1, 64]
 	cmp	w0, w2
-	beq	.L1077
+	beq	.L1078
 .L975:
-.LBE1861:
-.LBE1860:
+.LBE1896:
+.LBE1895:
 	.loc 1 2138 0
-	cbnz	w4, .L1013
+	cbnz	w4, .L1016
 	.loc 1 2142 0
 	ldr	w0, [x28, 64]
 	cmp	w0, 0
 	ble	.L981
 	.loc 1 2143 0
 	ldr	w1, [x29, 108]
-.LVL903:
+.LVL899:
 	add	w1, w1, 1
 	str	w1, [x29, 108]
 	.loc 1 2144 0
@@ -10487,43 +10466,43 @@ ebc_thread:
 .L981:
 	.loc 1 2150 0
 	ldr	w0, [x28, 200]
-	cbz	w0, .L1078
+	cbz	w0, .L1079
 .L982:
 	.loc 1 2153 0
 	ldr	x1, [x28, 224]
-.LVL904:
+.LVL900:
 	mov	x0, x20
 	ldr	w1, [x1, 64]
 	bl	ebc_lut_update
-.LVL905:
+.LVL901:
 	cbz	w0, .L983
 	.loc 1 2154 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC90
 	add	x1, x1, :lo12:.LC90
 	bl	_dev_err
-.LVL906:
+.LVL902:
 	.loc 1 2156 0
 	str	x25, [x28, 216]
-.LVL907:
+.LVL903:
 .L939:
 	.loc 1 2191 0
 	ldr	x0, [x28, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
-	beq	.L1079
+	beq	.L1080
 .L988:
 	.loc 1 2197 0
 	cmp	w0, 18
-	beq	.L1080
+	beq	.L1081
 .L989:
 	.loc 1 2208 0
 	mov	x0, x26
 	bl	ebc_remove_from_dsp_buf_list
-.LVL908:
+.LVL904:
 	.loc 1 2210 0
 	ldr	w0, [x28, 444]
-	cbnz	w0, .L1081
+	cbnz	w0, .L1082
 	.loc 1 2213 0
 	mov	w0, 1
 	str	w0, [x28, 444]
@@ -10533,7 +10512,7 @@ ebc_thread:
 	str	x0, [x28, 216]
 	.loc 1 2216 0
 	b	.L895
-.LVL909:
+.LVL905:
 .L925:
 	.loc 1 1996 0
 	ldr	w0, [x28, 628]
@@ -10554,7 +10533,7 @@ ebc_thread:
 	sub	w1, w0, #22
 	.loc 1 2012 0
 	ccmp	w1, 1, 0, hi
-	bls	.L1082
+	bls	.L1083
 	.loc 1 2013 0
 	ldr	w0, [x2, 64]
 	cmp	w0, 32
@@ -10563,13 +10542,13 @@ ebc_thread:
 	ldr	x5, [x2, 16]
 	ldr	w2, [x28, 20]
 	ldr	x1, [x28, 160]
-.LBB1863:
-.LBB1864:
+.LBB1898:
+.LBB1899:
 	.loc 1 1883 0
 	cmp	w2, 0
 	ble	.L932
 	mov	x0, 0
-.LVL910:
+.LVL906:
 	.p2align 2
 .L933:
 	.loc 1 1885 0
@@ -10584,26 +10563,26 @@ ebc_thread:
 	.loc 1 1883 0
 	cmp	w2, w0
 	bgt	.L933
-.L1062:
+.L1067:
 	ldr	w2, [x28, 20]
 	ldr	x1, [x28, 160]
 .L932:
-.LBE1864:
-.LBE1863:
+.LBE1899:
+.LBE1898:
 	.loc 1 2017 0
 	ldr	x0, [x28, 144]
 	sxtw	x2, w2
 	bl	memcpy
-.LVL911:
+.LVL907:
 	.loc 1 2018 0
 	ldrsw	x2, [x28, 20]
 	ldp	x0, x1, [x28, 152]
 	bl	memcpy
-.LVL912:
+.LVL908:
 	ldr	x0, [x28, 224]
 .L934:
-.LBB1865:
-.LBB1866:
+.LBB1900:
+.LBB1901:
 	.loc 1 446 0
 	ldp	w3, w16, [x0, 48]
 	.loc 1 505 0
@@ -10631,23 +10610,23 @@ ebc_thread:
 	asr	w10, w10, 3
 	.loc 1 449 0
 	asr	w18, w18, 3
-.LVL913:
+.LVL909:
 	.loc 1 445 0
 	add	w10, w10, 1
-.LVL914:
+.LVL910:
 	ldr	w1, [x20, 252]
 	.loc 1 452 0
 	cmp	w10, w18
-.LBE1866:
-.LBE1865:
+.LBE1901:
+.LBE1900:
 	.loc 1 2025 0
 	ldr	x13, [x0, 16]
-.LBB1870:
-.LBB1867:
+.LBB1906:
+.LBB1902:
 	.loc 1 452 0
 	sub	w0, w18, #1
 	csel	w10, w0, w10, ge
-.LVL915:
+.LVL911:
 	.loc 1 454 0
 	cmp	w1, w21
 	sub	w1, w1, #1
@@ -10657,29 +10636,29 @@ ebc_thread:
 	csel	w21, w1, w21, le
 	.loc 1 444 0
 	asr	w17, w17, 3
-.LVL916:
+.LVL912:
 	mul	w7, w16, w18
 	.loc 1 456 0
 	cmp	w16, w21
-.LBE1867:
-.LBE1870:
+.LBE1902:
+.LBE1906:
 	.loc 1 2025 0
 	ldr	x8, [x28, 144]
 	.loc 1 2026 0
 	ldp	x12, x11, [x28, 160]
-.LBB1871:
-.LBB1868:
+.LBB1907:
+.LBB1903:
 	.loc 1 456 0
 	bgt	.L942
-.LVL917:
+.LVL913:
 	.p2align 2
-.L1033:
+.L1038:
 	.loc 1 461 0
 	mov	w5, w17
 	cmp	w17, w10
-	ble	.L1034
+	ble	.L1039
 	b	.L959
-.LVL918:
+.LVL914:
 	.p2align 3
 .L943:
 	.loc 1 474 0
@@ -10688,7 +10667,7 @@ ebc_thread:
 	.loc 1 475 0
 	and	w27, w0, 240
 	cmp	w27, 224
-	beq	.L1083
+	beq	.L1084
 	.loc 1 478 0
 	orr	w3, w3, 240
 .L944:
@@ -10698,7 +10677,7 @@ ebc_thread:
 	.loc 1 481 0
 	and	w27, w0, 3840
 	cmp	w27, 3584
-	beq	.L1084
+	beq	.L1085
 	.loc 1 484 0
 	orr	w3, w3, 3840
 .L946:
@@ -10708,7 +10687,7 @@ ebc_thread:
 	.loc 1 487 0
 	and	w27, w0, 61440
 	cmp	w27, 57344
-	beq	.L1085
+	beq	.L1086
 	.loc 1 490 0
 	orr	w3, w3, 61440
 .L948:
@@ -10718,7 +10697,7 @@ ebc_thread:
 	.loc 1 493 0
 	and	w27, w0, 983040
 	cmp	w27, 917504
-	beq	.L1086
+	beq	.L1087
 	.loc 1 496 0
 	orr	w3, w3, 983040
 .L950:
@@ -10728,7 +10707,7 @@ ebc_thread:
 	.loc 1 499 0
 	and	w27, w0, 15728640
 	cmp	w27, 14680064
-	beq	.L1087
+	beq	.L1088
 	.loc 1 502 0
 	orr	w3, w3, 15728640
 .L952:
@@ -10738,7 +10717,7 @@ ebc_thread:
 	.loc 1 505 0
 	and	w27, w0, 251658240
 	cmp	w27, w15
-	beq	.L1088
+	beq	.L1089
 	.loc 1 508 0
 	orr	w3, w3, 251658240
 .L954:
@@ -10747,16 +10726,16 @@ ebc_thread:
 	bne	.L956
 	.loc 1 511 0
 	and	w2, w0, -268435456
-.LVL919:
+.LVL915:
 	cmp	w2, w14
-	beq	.L1089
+	beq	.L1090
 	.loc 1 514 0
 	orr	w3, w3, -268435456
-.LVL920:
+.LVL916:
 .L956:
 	.loc 1 517 0
 	and	w0, w0, w25
-.LVL921:
+.LVL917:
 	.loc 1 461 0
 	add	w5, w5, 1
 	eor	w0, w0, w4
@@ -10768,18 +10747,18 @@ ebc_thread:
 	str	w0, [x8, x1]
 	.loc 1 461 0
 	bgt	.L959
-.LVL922:
-.L1034:
+.LVL918:
+.L1039:
 	.loc 1 462 0
 	sxtw	x1, w5
-.LVL923:
+.LVL919:
 	.loc 1 466 0
 	mov	w3, 0
 	.loc 1 465 0
 	lsl	x0, x1, 3
 	.loc 1 462 0
 	lsl	x1, x1, 2
-.LVL924:
+.LVL920:
 	.loc 1 465 0
 	add	x0, x0, x7, sxtw 3
 	add	x1, x1, x7, sxtw 2
@@ -10792,10 +10771,10 @@ ebc_thread:
 	and	x27, x2, 255
 	.loc 1 464 0
 	ldr	w25, [x12, x1]
-.LVL925:
+.LVL921:
 	.loc 1 468 0
 	cbnz	x27, .L943
-.LVL926:
+.LVL922:
 	.loc 1 469 0
 	and	w27, w0, 15
 	.loc 1 472 0
@@ -10805,19 +10784,19 @@ ebc_thread:
 	bne	.L943
 	.loc 1 470 0
 	orr	w4, w4, w3
-.LVL927:
+.LVL923:
 	.loc 1 466 0
 	mov	w3, 0
-.LVL928:
+.LVL924:
 	b	.L943
-.LVL929:
+.LVL925:
 .L923:
-.LBE1868:
-.LBE1871:
+.LBE1903:
+.LBE1907:
 	.loc 1 2048 0
 	add	x0, x23, 680
 	bl	down_write
-.LVL930:
+.LVL926:
 	.loc 1 2051 0
 	ldr	x1, [x28, 216]
 	.loc 1 2049 0
@@ -10832,13 +10811,13 @@ ebc_thread:
 	.loc 1 2055 0
 	ldr	w0, [x1, 64]
 	cmp	w0, 32
-	beq	.L1090
+	beq	.L1091
 	.loc 1 2058 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x1, 16]
 	ldr	x0, [x28, 152]
 	bl	memcpy
-.LVL931:
+.LVL927:
 .L965:
 	.loc 1 2059 0
 	ldr	x0, [x28, 224]
@@ -10847,24 +10826,24 @@ ebc_thread:
 	bne	.L966
 	.loc 1 2060 0
 	ldr	w4, [x28, 20]
-.LVL932:
-.LBB1872:
-.LBB1873:
+.LVL928:
+.LBB1908:
+.LBB1909:
 	.loc 1 1883 0
 	ldr	x3, [x0, 16]
-.LVL933:
+.LVL929:
 	mov	x0, 0
 	cmp	w4, 0
-.LBE1873:
-.LBE1872:
+.LBE1909:
+.LBE1908:
 	.loc 1 2060 0
 	ldr	x5, [x28, 144]
-.LBB1875:
-.LBB1874:
+.LBB1911:
+.LBB1910:
 	.loc 1 1883 0
 	ble	.L968
 	.p2align 2
-.L1032:
+.L1037:
 	.loc 1 1885 0
 	ldrb	w1, [x3], 2
 	.loc 1 1887 0
@@ -10876,76 +10855,173 @@ ebc_thread:
 	add	x0, x0, 1
 	.loc 1 1883 0
 	cmp	w4, w0
-	bgt	.L1032
+	bgt	.L1037
 	b	.L968
-.LVL934:
+.LVL930:
 .L927:
-.LBE1874:
-.LBE1875:
+.LBE1910:
+.LBE1911:
 	.loc 1 1994 0
 	mov	w4, 0
-.LVL935:
+.LVL931:
 	b	.L926
-.LVL936:
+.LVL932:
 	.p2align 3
-.L1075:
-.LBB1876:
-.LBB1858:
-	.loc 1 2232 0 discriminator 1
+.L914:
+	.loc 1 1982 0
+	mov	x0, x26
+	str	x26, [x28, 216]
+	b	.L915
+.LVL933:
+	.p2align 3
+.L1077:
+.LBB1912:
+.LBB1892:
+	.loc 1 2221 0
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
+.LVL934:
+	mov	x21, 60
+.LVL935:
+.LBB1889:
+	mov	w2, 1
+	add	x1, x29, 120
+	mov	x0, x19
+	bl	prepare_to_wait_event
+.LVL936:
+.LBB1885:
+	ldr	w1, [x28, 96]
+	mov	w2, 0
+	cmp	w1, 0
+	cset	w1, ne
 .LVL937:
-	b	.L1004
-	.p2align 3
-.L1091:
+	.p2align 2
+.L997:
+.LBE1885:
+	.loc 1 2221 0 is_stmt 0 discriminator 9
+	orr	w1, w1, w2
 .LVL938:
-.LBB1856:
-	.loc 1 2232 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L993
-	.loc 1 2232 0 discriminator 7
-	bl	schedule
+	cbnz	w1, .L996
 .LVL939:
-.L1004:
-	.loc 1 2232 0 discriminator 9
+	.loc 1 2221 0 discriminator 11
+	cbnz	x0, .L995
+	.loc 1 2221 0 discriminator 13
+	mov	x0, x21
+.LVL940:
+	bl	schedule_timeout
+.LVL941:
+	mov	w2, 1
+	mov	x21, x0
+	add	x1, x29, 120
+	mov	x0, x19
+	bl	prepare_to_wait_event
+.LVL942:
+.LBB1886:
+	ldr	w1, [x28, 96]
+	cmp	w1, 0
+	cset	w1, ne
+.LVL943:
+	cmp	x21, 0
+	cset	w2, eq
+	tst	w1, w2
+	beq	.L997
+.L996:
+.LBE1886:
+.LBE1889:
+	.loc 1 2221 0
+	add	x1, x29, 120
+.LVL944:
+	mov	x0, x19
+	bl	finish_wait
+.LVL945:
+.L995:
+.LBE1892:
+.LBE1912:
+	.loc 1 2222 0 is_stmt 1 discriminator 16
+	ldr	w0, [x28, 96]
+.LVL946:
+	cbnz	w0, .L895
+	.loc 1 2229 0
+	ldr	w0, [x28, 44]
+	cmp	w0, 1
+	beq	.L1092
+	.loc 1 2238 0
+	ldr	w0, [x28, 200]
+	cmp	w0, 1
+	beq	.L1004
+.L1006:
+.LBB1913:
+.LBB1914:
+	.loc 1 2242 0
+	mov	w1, 0
+	add	x0, x29, 120
+	bl	init_wait_entry
+.LVL947:
+	b	.L1005
+	.p2align 3
+.L1093:
+.LVL948:
+.LBB1915:
+	.loc 1 2242 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L1007
+	.loc 1 2242 0 discriminator 7
+	bl	schedule
+.LVL949:
+.L1005:
+	.loc 1 2242 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL940:
+.LVL950:
 	ldr	w1, [x28, 96]
-	cbz	w1, .L1091
-.LBE1856:
-	.loc 1 2232 0 discriminator 4
+	cbz	w1, .L1093
+.LBE1915:
+	.loc 1 2242 0 discriminator 4
 	add	x1, x29, 120
 	mov	x0, x19
 	bl	finish_wait
-.LVL941:
-	b	.L993
-.LVL942:
+.LVL951:
+.L1009:
+.L1007:
+.LBE1914:
+.LBE1913:
+	.loc 1 2246 0 is_stmt 1
+	ldr	w0, [x28, 200]
+.LVL952:
+	.loc 1 2243 0
+	str	wzr, [x28, 96]
+	.loc 1 2246 0
+	cbnz	w0, .L895
+.L1107:
+	.loc 1 2247 0
+	mov	x0, x20
+	bl	ebc_power_set.constprop.17
+.LVL953:
+	b	.L895
+.LVL954:
 	.p2align 3
 .L901:
-.LBE1858:
-.LBE1876:
-	.loc 1 1928 0 is_stmt 1
+	.loc 1 1928 0
 	ldr	x2, [x28, 616]
 	cbz	x2, .L905
 	.loc 1 1929 0
 	cmp	w1, 19
-	bne	.L1059
+	bne	.L1065
 	.loc 1 1930 0
 	str	wzr, [x28, 616]
 	.loc 1 1931 0
 	mov	x0, 3
-.LVL943:
+.LVL955:
 	bl	ebc_notify
-.LVL944:
+.LVL956:
 	.loc 1 1932 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC83
 	add	x1, x1, :lo12:.LC83
 	bl	_dev_info
-.LVL945:
+.LVL957:
 	.loc 1 1935 0
 	ldr	w2, [x20, 204]
 	.loc 1 1933 0
@@ -10957,79 +11033,18 @@ ebc_thread:
 	stp	w3, wzr, [x21, 16]
 	.loc 1 1935 0
 	bl	check_black_percent.isra.15
-.LVL946:
+.LVL958:
 	cbz	w0, .L900
-	b	.L1060
-.LVL947:
-	.p2align 3
-.L1073:
-.LBB1877:
-	.loc 1 2220 0 discriminator 1
-	ldr	w0, [x28, 96]
-	cbnz	w0, .L993
-.LBB1878:
-	.loc 1 2220 0 is_stmt 0 discriminator 3
-	mov	w1, 0
-	add	x0, x29, 120
-	bl	init_wait_entry
-.LVL948:
-	b	.L997
-	.p2align 3
-.L1092:
-.LBB1879:
-	.loc 1 2220 0 discriminator 7
-	ldr	w1, [x28, 96]
-	cbnz	w1, .L994
-.LVL949:
-	.loc 1 2220 0 discriminator 9
-	cbnz	x0, .L1063
-	.loc 1 2220 0 discriminator 11
-	bl	schedule
-.LVL950:
-.L997:
-	.loc 1 2220 0 discriminator 13
-	add	x1, x29, 120
-	mov	w2, 1
-	mov	x0, x19
-	bl	prepare_to_wait_event
-.LVL951:
-	ldr	w1, [x28, 44]
-	cbnz	w1, .L1092
-.L994:
-.LBE1879:
-	.loc 1 2220 0 discriminator 8
-	mov	x0, x19
-	add	x1, x29, 120
-	bl	finish_wait
-.LVL952:
-	ldr	w0, [x28, 44]
-.LBE1878:
-.LBE1877:
-	.loc 1 2223 0 is_stmt 1 discriminator 8
-	cbnz	w0, .L1063
-	.loc 1 2228 0
-	ldr	w0, [x28, 200]
-	cmp	w0, 1
-	bne	.L1063
-	.p2align 2
-.L1074:
-.LBB1880:
-.LBB1881:
-	mov	w1, 0
-	mov	x0, x20
-	bl	ebc_power_set.part.13
-.LVL953:
-	b	.L1063
+	b	.L1064
+.LVL959:
 	.p2align 3
-.L1081:
-.LBE1881:
-.LBE1880:
+.L1082:
 	.loc 1 2211 0
 	ldr	x0, [x28, 216]
 	bl	ebc_buf_release
-.LVL954:
+.LVL960:
 	b	.L992
-.LVL955:
+.LVL961:
 	.p2align 3
 .L983:
 	.loc 1 2165 0
@@ -11046,37 +11061,37 @@ ebc_thread:
 	ldr	w2, [x0, 40]
 	ldr	x0, [x28, 104]
 	bl	_dev_info
-.LVL956:
+.LVL962:
 	.loc 1 2166 0
 	mov	w0, 1
 	str	w0, [x28, 44]
 	.loc 1 2167 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL957:
+.LVL963:
 	.loc 1 2169 0
 	ldr	x1, [x21, #:lo12:jiffies]
 	add	x0, x20, 688
 	str	x0, [x29, 96]
 	add	x1, x1, 900
 	bl	mod_timer
-.LVL958:
-.LBB1882:
+.LVL964:
+.LBB1916:
 	.loc 1 2170 0
 	ldr	w0, [x28, 92]
-	cbz	w0, .L1093
+	cbz	w0, .L1094
 .L986:
-.LVL959:
+.LVL965:
 .L984:
-.LBE1882:
+.LBE1916:
 	.loc 1 2172 0 discriminator 11
 	ldr	x2, [x21, #:lo12:jiffies]
 	mov	x1, 402653184
 	ldr	x0, [x29, 96]
-.LVL960:
+.LVL966:
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL961:
+.LVL967:
 	.loc 1 2173 0 discriminator 11
 	str	wzr, [x28, 92]
 	.loc 1 2191 0 discriminator 11
@@ -11087,13 +11102,13 @@ ebc_thread:
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
 	bne	.L988
-.LVL962:
-.L1079:
+.LVL968:
+.L1080:
 	.loc 1 2194 0
 	ldr	x0, [x28, 104]
 	.loc 1 2192 0
 	mov	w21, 1
-.LVL963:
+.LVL969:
 	.loc 1 2193 0
 	str	wzr, [x28, 204]
 	.loc 1 2194 0
@@ -11103,65 +11118,65 @@ ebc_thread:
 	.loc 1 2194 0
 	add	x1, x1, :lo12:.LC94
 	bl	_dev_info
-.LVL964:
+.LVL970:
 	.loc 1 2195 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x23, 328
 	bl	__wake_up_sync
-.LVL965:
+.LVL971:
 	b	.L989
-.LVL966:
+.LVL972:
 	.p2align 3
-.L1013:
+.L1016:
 	.loc 1 2150 0
 	ldr	w0, [x28, 200]
 	.loc 1 2139 0
 	str	wzr, [x29, 108]
 	.loc 1 2150 0
 	cbnz	w0, .L982
-.LVL967:
-.L1078:
+.LVL973:
+.L1079:
 	.loc 1 2151 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
-.LVL968:
+.LVL974:
 	b	.L982
-.LVL969:
+.LVL975:
 	.p2align 3
 .L905:
 	.loc 1 1952 0
 	cmp	w1, 21
-	beq	.L1094
+	beq	.L1095
 	.loc 1 1955 0
 	ldr	w0, [x28, 632]
-.LVL970:
+.LVL976:
 	cmp	w0, 0
 	ccmp	w1, 1, 4, ne
 	beq	.L900
 	.loc 1 1956 0
 	add	x0, x23, 680
 	bl	down_write
-.LVL971:
+.LVL977:
 	.loc 1 1957 0
 	ldr	w0, [x26, 64]
 	cmp	w0, 32
-	beq	.L1095
+	beq	.L1096
 	.loc 1 1960 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x26, 16]
 	ldr	x0, [x28, 160]
 	bl	memcpy
-.LVL972:
+.LVL978:
 .L910:
 	.loc 1 1961 0
 	mov	x0, x26
 	bl	ebc_remove_from_dsp_buf_list
-.LVL973:
+.LVL979:
 	.loc 1 1962 0
 	mov	x0, x26
 	bl	ebc_buf_release
-.LVL974:
+.LVL980:
 	.loc 1 1964 0
 	ldr	x1, [x28, 224]
 	mov	x4, x28
@@ -11170,11 +11185,11 @@ ebc_thread:
 	ldr	w5, [x1, 40]
 	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
-.LVL975:
+.LVL981:
 	.loc 1 1967 0
 	add	x0, x23, 680
 	bl	up_write
-.LVL976:
+.LVL982:
 	.loc 1 1968 0
 	ldr	w0, [x28, 44]
 	cbnz	w0, .L895
@@ -11186,7 +11201,7 @@ ebc_thread:
 	.loc 1 1970 0
 	str	wzr, [x28, 92]
 	.loc 1 1971 0
-	cbz	w0, .L1096
+	cbz	w0, .L1097
 .L913:
 	.loc 1 1973 0
 	ldr	x0, [x28, 104]
@@ -11194,11 +11209,11 @@ ebc_thread:
 	ldrb	w2, [x28, 48]
 	add	x1, x1, :lo12:.LC84
 	bl	_dev_info
-.LVL977:
+.LVL983:
 	.loc 1 1974 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL978:
+.LVL984:
 	b	.L895
 	.p2align 3
 .L961:
@@ -11213,15 +11228,15 @@ ebc_thread:
 	ldr	x2, [x28, 168]
 	ldr	x0, [x28, 144]
 	.loc 1 2065 0
-	beq	.L1097
+	beq	.L1098
 	.loc 1 2069 0
 	bl	refresh_new_image_auto
-.LVL979:
+.LVL985:
 .L968:
 	.loc 1 2072 0
 	add	x0, x23, 680
 	bl	up_write
-.LVL980:
+.LVL986:
 	.loc 1 2074 0
 	ldr	w0, [x28, 44]
 	cbnz	w0, .L939
@@ -11234,15 +11249,15 @@ ebc_thread:
 	.loc 1 2075 0
 	str	w1, [x28, 44]
 	.loc 1 2077 0
-	cbz	w0, .L1098
+	cbz	w0, .L1099
 .L972:
 	.loc 1 2079 0
 	mov	w1, 16
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL981:
+.LVL987:
 	cmn	w0, #1
-	beq	.L1099
+	beq	.L1100
 	.loc 1 2084 0
 	ldr	w3, [x28, 112]
 	.loc 1 2087 0
@@ -11258,53 +11273,53 @@ ebc_thread:
 	strb	w3, [x28, 49]
 	.loc 1 2087 0
 	bl	_dev_info
-.LVL982:
+.LVL988:
 	.loc 1 2088 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL983:
+.LVL989:
 	b	.L939
-.L1069:
+.L1073:
 	.loc 1 1988 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC86
 	add	x1, x1, :lo12:.LC86
 	bl	_dev_info
-.LVL984:
-.LBB1886:
+.LVL990:
+.LBB1920:
 	.loc 1 1989 0
 	ldr	w0, [x28, 92]
-	cbz	w0, .L1100
+	cbz	w0, .L1101
 .L920:
-.LVL985:
+.LVL991:
 .L918:
-.LBE1886:
+.LBE1920:
 	.loc 1 1990 0 discriminator 11
 	ldr	x0, [x28, 104]
-.LVL986:
+.LVL992:
 	adrp	x1, .LC87
 	add	x1, x1, :lo12:.LC87
 	bl	_dev_info
-.LVL987:
-	b	.L1061
-.LVL988:
-.L1077:
+.LVL993:
+	b	.L1066
+.LVL994:
+.L1078:
 	.loc 1 2129 0
 	ldr	w2, [x28, 20]
-.LBB1890:
-.LBB1862:
+.LBB1924:
+.LBB1897:
 	.loc 1 1862 0
 	cmp	w0, 32
-.LVL989:
+.LVL995:
 	lsl	w0, w2, 1
 	csel	w2, w0, w2, eq
 	.loc 1 1863 0
 	cmp	w2, 0
 	add	w0, w2, 7
 	csel	w0, w0, w2, lt
-.LVL990:
+.LVL996:
 	asr	w0, w0, 3
-.LVL991:
+.LVL997:
 	cmp	w0, 0
 	ble	.L977
 	ldr	x7, [x1, 16]
@@ -11332,23 +11347,23 @@ ebc_thread:
 	bne	.L975
 .L979:
 	.loc 1 1863 0
-	cmp	x1, x0
+	cmp	x0, x1
 	bne	.L980
 .L977:
-.LBE1862:
-.LBE1890:
+.LBE1897:
+.LBE1924:
 	.loc 1 2130 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC96
 	add	x1, x1, :lo12:.LC96
 	bl	_dev_info
-.LVL992:
+.LVL998:
 	.loc 1 2132 0
 	str	x25, [x28, 216]
 	.loc 1 2134 0
 	b	.L939
-.LVL993:
-.L1082:
+.LVL999:
+.L1083:
 	.loc 1 2021 0
 	cmp	w0, 0
 	mov	x0, x26
@@ -11358,53 +11373,33 @@ ebc_thread:
 	ldrsw	x2, [x28, 20]
 	ldp	x1, x0, [x28, 152]
 	bl	memcpy
-.LVL994:
+.LVL1000:
 	ldr	x0, [x28, 224]
 	b	.L934
-.LVL995:
-	.p2align 3
-.L1083:
-.LBB1891:
-.LBB1869:
-	.loc 1 476 0
-	orr	w4, w4, 240
-	b	.L944
-	.p2align 3
-.L1084:
-	.loc 1 482 0
-	orr	w4, w4, 3840
-	b	.L946
-	.p2align 3
-.L1085:
-	.loc 1 488 0
-	orr	w4, w4, 61440
-	b	.L948
-	.p2align 3
-.L1086:
-	.loc 1 494 0
-	orr	w4, w4, 983040
-	b	.L950
+.LVL1001:
 	.p2align 3
-.L1087:
+.L1088:
+.LBB1925:
+.LBB1904:
 	.loc 1 500 0
 	orr	w4, w4, 15728640
 	b	.L952
 	.p2align 3
-.L1088:
+.L1089:
 	.loc 1 506 0
 	orr	w4, w4, 251658240
 	b	.L954
-.LVL996:
+.LVL1002:
 	.p2align 3
-.L1089:
+.L1090:
 	.loc 1 512 0
 	orr	w4, w4, -268435456
-.LVL997:
+.LVL1003:
 	.loc 1 517 0
 	and	w0, w0, w25
-.LVL998:
+.LVL1004:
 	eor	w0, w0, w4
-.LVL999:
+.LVL1005:
 	.loc 1 461 0
 	add	w5, w5, 1
 	and	w0, w0, w3
@@ -11414,18 +11409,18 @@ ebc_thread:
 	.loc 1 518 0
 	str	w0, [x8, x1]
 	.loc 1 461 0
-	ble	.L1034
-.LVL1000:
+	ble	.L1039
+.LVL1006:
 	.p2align 2
 .L959:
 	.loc 1 456 0
 	add	w16, w16, 1
 	add	w7, w7, w18
 	cmp	w16, w21
-	ble	.L1033
+	ble	.L1038
 .L942:
-.LBE1869:
-.LBE1891:
+.LBE1904:
+.LBE1925:
 	.loc 1 2029 0
 	ldr	w0, [x28, 44]
 	cbnz	w0, .L939
@@ -11438,13 +11433,13 @@ ebc_thread:
 	.loc 1 2030 0
 	str	w1, [x28, 44]
 	.loc 1 2032 0
-	cbz	w0, .L1101
+	cbz	w0, .L1102
 .L960:
 	.loc 1 2034 0
 	mov	w1, 16
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL1001:
+.LVL1007:
 	cmn	w0, #1
 	beq	.L939
 	.loc 1 2038 0
@@ -11464,23 +11459,48 @@ ebc_thread:
 	.loc 1 2041 0
 	and	w3, w3, 255
 	bl	_dev_info
-.LVL1002:
+.LVL1008:
 	.loc 1 2042 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL1003:
+.LVL1009:
 	b	.L939
-.LVL1004:
-.L1080:
+.LVL1010:
+	.p2align 3
+.L1084:
+.LBB1926:
+.LBB1905:
+	.loc 1 476 0
+	orr	w4, w4, 240
+	b	.L944
+	.p2align 3
+.L1085:
+	.loc 1 482 0
+	orr	w4, w4, 3840
+	b	.L946
+	.p2align 3
+.L1086:
+	.loc 1 488 0
+	orr	w4, w4, 61440
+	b	.L948
+	.p2align 3
+.L1087:
+	.loc 1 494 0
+	orr	w4, w4, 983040
+	b	.L950
+.LVL1011:
+.L1081:
+.LBE1905:
+.LBE1926:
 	.loc 1 2198 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC95
 	add	x1, x1, :lo12:.LC95
 	bl	_dev_info
-.LVL1005:
+.LVL1012:
 	.loc 1 2199 0
 	ldr	w0, [x28, 616]
-	cbz	w0, .L1102
+	cbz	w0, .L1103
 .L990:
 	.loc 1 2204 0
 	add	x0, x22, :lo12:.LANCHOR0
@@ -11499,86 +11519,86 @@ ebc_thread:
 	.loc 1 2205 0
 	add	x0, x23, 328
 	bl	__wake_up_sync
-.LVL1006:
+.LVL1013:
 	b	.L989
-.LVL1007:
+.LVL1014:
 .L928:
 	.loc 1 2000 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC88
 	add	x1, x1, :lo12:.LC88
 	bl	_dev_info
-.LVL1008:
-	b	.L1060
-.LVL1009:
-.L1093:
-.LBB1892:
-.LBB1883:
-.LBB1884:
+.LVL1015:
+	b	.L1064
+.LVL1016:
+.L1094:
+.LBB1927:
+.LBB1917:
+.LBB1918:
 	.loc 1 2170 0 discriminator 1
 	add	x27, x23, 352
-.LBE1884:
+.LBE1918:
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL1010:
+.LVL1017:
 	b	.L987
 	.p2align 3
-.L1103:
-.LVL1011:
-.LBB1885:
+.L1104:
+.LVL1018:
+.LBB1919:
 	.loc 1 2170 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L984
 	.loc 1 2170 0 discriminator 7
 	bl	schedule
-.LVL1012:
+.LVL1019:
 .L987:
 	.loc 1 2170 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x27
 	bl	prepare_to_wait_event
-.LVL1013:
+.LVL1020:
 	ldr	w1, [x28, 92]
-	cbz	w1, .L1103
-.LBE1885:
+	cbz	w1, .L1104
+.LBE1919:
 	.loc 1 2170 0 discriminator 4
 	mov	x0, x27
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL1014:
+.LVL1021:
 	b	.L984
-.LVL1015:
-.L1094:
-.LBE1883:
-.LBE1892:
+.LVL1022:
+.L1095:
+.LBE1917:
+.LBE1927:
 	.loc 1 1953 0 is_stmt 1
 	str	wzr, [x28, 632]
 	b	.L900
-.LVL1016:
-.L1097:
+.LVL1023:
+.L1098:
 	.loc 1 2066 0
 	bl	refresh_new_image_auto_32
-.LVL1017:
+.LVL1024:
 	b	.L968
-.L1090:
+.L1091:
 	.loc 1 2056 0
 	ldr	w2, [x28, 20]
 	ldr	x4, [x1, 16]
-.LBB1893:
-.LBB1894:
+.LBB1928:
+.LBB1929:
 	.loc 1 1883 0
 	cmp	w2, 0
-.LBE1894:
-.LBE1893:
+.LBE1929:
+.LBE1928:
 	.loc 1 2056 0
 	ldr	x5, [x28, 152]
-.LBB1896:
-.LBB1895:
+.LBB1931:
+.LBB1930:
 	.loc 1 1883 0
 	ble	.L963
 	mov	x0, 0
-.LVL1018:
+.LVL1025:
 	.p2align 2
 .L964:
 	.loc 1 1885 0
@@ -11594,76 +11614,76 @@ ebc_thread:
 	cmp	w2, w0
 	bgt	.L964
 	b	.L965
-.LVL1019:
-.L1100:
-.LBE1895:
-.LBE1896:
-.LBB1897:
-.LBB1887:
-.LBB1888:
+.LVL1026:
+.L1102:
+.LBE1930:
+.LBE1931:
+	.loc 1 2033 0
+	mov	x0, x20
+	bl	ebc_power_set.constprop.17
+.LVL1027:
+	b	.L960
+.LVL1028:
+.L1101:
+.LBB1932:
+.LBB1921:
+.LBB1922:
 	.loc 1 1989 0 discriminator 1
 	add	x25, x23, 352
-.LVL1020:
-.LBE1888:
+.LVL1029:
+.LBE1922:
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL1021:
+.LVL1030:
 	b	.L921
 	.p2align 3
-.L1104:
-.LVL1022:
-.LBB1889:
+.L1105:
+.LVL1031:
+.LBB1923:
 	.loc 1 1989 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L918
 	.loc 1 1989 0 discriminator 7
 	bl	schedule
-.LVL1023:
+.LVL1032:
 .L921:
 	.loc 1 1989 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x25
 	bl	prepare_to_wait_event
-.LVL1024:
+.LVL1033:
 	ldr	w1, [x28, 92]
-	cbz	w1, .L1104
-.LBE1889:
+	cbz	w1, .L1105
+.LBE1923:
 	.loc 1 1989 0 discriminator 4
 	mov	x0, x25
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL1025:
+.LVL1034:
 	b	.L918
-.LVL1026:
-.L1101:
-.LBE1887:
-.LBE1897:
-	.loc 1 2033 0 is_stmt 1
-	mov	x0, x20
-	bl	ebc_power_set.constprop.17
-.LVL1027:
-	b	.L960
-.LVL1028:
-.L1095:
-	.loc 1 1958 0
+.LVL1035:
+.L1096:
+.LBE1921:
+.LBE1932:
+	.loc 1 1958 0 is_stmt 1
 	ldr	w4, [x28, 20]
-.LBB1898:
-.LBB1899:
+.LBB1933:
+.LBB1934:
 	.loc 1 1883 0
 	mov	x0, 0
 	ldr	x3, [x26, 16]
-.LVL1029:
+.LVL1036:
 	cmp	w4, 0
-.LBE1899:
-.LBE1898:
+.LBE1934:
+.LBE1933:
 	.loc 1 1958 0
 	ldr	x5, [x28, 160]
-.LBB1901:
-.LBB1900:
+.LBB1936:
+.LBB1935:
 	.loc 1 1883 0
 	ble	.L910
-.L1035:
+.L1040:
 	.loc 1 1885 0
 	ldrb	w1, [x3], 2
 	.loc 1 1887 0
@@ -11675,69 +11695,137 @@ ebc_thread:
 	add	x0, x0, 1
 	.loc 1 1883 0
 	cmp	w4, w0
-	bgt	.L1035
+	bgt	.L1040
 	b	.L910
-.LVL1030:
-.L1071:
-.LBE1900:
-.LBE1901:
-.LBB1902:
-.LBB1903:
+.LVL1037:
+.L1075:
+.LBE1935:
+.LBE1936:
+.LBB1937:
+.LBB1938:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.13
-.LVL1031:
+.LVL1038:
 	b	.L897
-.LVL1032:
-.L1099:
-.LBE1903:
-.LBE1902:
+.LVL1039:
+.L1092:
+.LBE1938:
+.LBE1937:
+.LBB1939:
+.LBB1940:
+	.loc 1 2230 0 discriminator 3
+	mov	w1, 0
+	add	x0, x29, 120
+	bl	init_wait_entry
+.LVL1040:
+	b	.L1003
+	.p2align 3
+.L1106:
+.LBB1941:
+	.loc 1 2230 0 is_stmt 0 discriminator 7
+	ldr	w1, [x28, 96]
+	cbnz	w1, .L1000
+.LVL1041:
+	.loc 1 2230 0 discriminator 9
+	cbnz	x0, .L1002
+	.loc 1 2230 0 discriminator 11
+	bl	schedule
+.LVL1042:
+.L1003:
+	.loc 1 2230 0 discriminator 13
+	add	x1, x29, 120
+	mov	w2, 1
+	mov	x0, x19
+	bl	prepare_to_wait_event
+.LVL1043:
+	ldr	w1, [x28, 44]
+	cbnz	w1, .L1106
+.L1000:
+.LBE1941:
+	.loc 1 2230 0 discriminator 8
+	mov	x0, x19
+	add	x1, x29, 120
+	bl	finish_wait
+.LVL1044:
+	ldr	w0, [x28, 44]
+.LBE1940:
+.LBE1939:
+	.loc 1 2233 0 is_stmt 1 discriminator 8
+	cbnz	w0, .L1002
+	.loc 1 2234 0
+	ldr	w0, [x28, 200]
+	cmp	w0, 1
+	bne	.L1002
+.L1004:
+.LBB1942:
+.LBB1943:
+	mov	w1, 0
+	mov	x0, x20
+	bl	ebc_power_set.part.13
+.LVL1045:
+.L1002:
+.LBE1943:
+.LBE1942:
+	.loc 1 2241 0
+	ldr	w0, [x28, 96]
+.LVL1046:
+	cbz	w0, .L1006
+	.loc 1 2246 0
+	ldr	w0, [x28, 200]
+	.loc 1 2243 0
+	str	wzr, [x28, 96]
+	.loc 1 2246 0
+	cbnz	w0, .L895
+	b	.L1107
+.LVL1047:
+.L1100:
 	.loc 1 2080 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC90
 	add	x1, x1, :lo12:.LC90
 	bl	_dev_err
-.LVL1033:
+.LVL1048:
 	.loc 1 2081 0
 	b	.L939
-.L1098:
+.L1099:
 	.loc 1 2078 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
-.LVL1034:
+.LVL1049:
 	b	.L972
+.LVL1050:
+.L1103:
+	.loc 1 2200 0
+	mov	x0, 2
+	bl	ebc_notify
+.LVL1051:
+	b	.L990
+.LVL1052:
 .L931:
 	.loc 1 2016 0
 	ldr	x1, [x2, 16]
 	ldr	x0, [x28, 160]
 	ldrsw	x2, [x28, 20]
 	bl	memcpy
-.LVL1035:
-	b	.L1062
-.LVL1036:
+.LVL1053:
+	b	.L1067
+.LVL1054:
 .L966:
 	ldr	w2, [x28, 20]
-.L1007:
+.L1010:
 	.loc 1 2062 0
 	ldr	x1, [x0, 16]
 	sxtw	x2, w2
 	ldr	x0, [x28, 144]
 	bl	memcpy
-.LVL1037:
+.LVL1055:
 	b	.L968
-.LVL1038:
-.L1102:
-	.loc 1 2200 0
-	mov	x0, 2
-	bl	ebc_notify
-.LVL1039:
-	b	.L990
-.LVL1040:
-.L1096:
+.L1097:
 	.loc 1 1972 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
-.LVL1041:
+.LVL1056:
 	b	.L913
 .L963:
 	.loc 1 2059 0
@@ -11745,12 +11833,12 @@ ebc_thread:
 	cmp	w0, 32
 	beq	.L968
 	mov	x0, x26
-	b	.L1007
-.LVL1042:
-.L1072:
-	.loc 1 2242 0
+	b	.L1010
+.LVL1057:
+.L1076:
+	.loc 1 2252 0
 	bl	__stack_chk_fail
-.LVL1043:
+.LVL1058:
 	.cfi_endproc
 .LFE2838:
 	.size	ebc_thread, .-ebc_thread
@@ -11902,9 +11990,9 @@ resume_frame_count:
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.35218, %object
-	.size	__func__.35218, 11
-__func__.35218:
+	.type	__func__.35231, %object
+	.size	__func__.35231, 11
+__func__.35231:
 	.string	"ebc_io_ctl"
 	.align	3
 	.set	.LANCHOR3,. + 0
@@ -11912,14 +12000,14 @@ __func__.35218:
 	.size	__func__.34977, 16
 __func__.34977:
 	.string	"ebc_frame_start"
-	.type	__func__.35528, %object
-	.size	__func__.35528, 12
-__func__.35528:
+	.type	__func__.35541, %object
+	.size	__func__.35541, 12
+__func__.35541:
 	.string	"ebc_suspend"
 	.zero	4
-	.type	__func__.35462, %object
-	.size	__func__.35462, 19
-__func__.35462:
+	.type	__func__.35475, %object
+	.size	__func__.35475, 19
+__func__.35475:
 	.string	"ebc_lut_table_init"
 	.zero	5
 	.type	ebc_match, %object
@@ -11959,9 +12047,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init3180, %object
-	.size	__addressable_ebc_init3180, 8
-__addressable_ebc_init3180:
+	.type	__addressable_ebc_init3190, %object
+	.size	__addressable_ebc_init3190, 8
+__addressable_ebc_init3190:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -12019,7 +12107,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC16:
-	.string	"2.20"
+	.string	"2.21"
 	.zero	3
 .LC17:
 	.string	"%s\n"
@@ -12478,16 +12566,16 @@ __exitcall_ebc_exit:
 	.file 214 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x15598
+	.4byte	0x156c4
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF3339
-	.byte	0x1
-	.4byte	.LASF3340
 	.4byte	.LASF3341
-	.4byte	.Ldebug_ranges0+0x12e0
+	.byte	0x1
+	.4byte	.LASF3342
+	.4byte	.LASF3343
+	.4byte	.Ldebug_ranges0+0x1340
 	.8byte	0
 	.4byte	.Ldebug_line0
 	.uleb128 0x2
@@ -40213,7 +40301,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0xa0c
+	.2byte	0xa16
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
@@ -40221,7 +40309,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0xa16
+	.2byte	0xa20
 	.4byte	0xc680
 	.uleb128 0x9
 	.byte	0x3
@@ -40229,7 +40317,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0xa33
+	.2byte	0xa3d
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
@@ -40237,7 +40325,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0xa39
+	.2byte	0xa43
 	.4byte	0xc680
 	.uleb128 0x9
 	.byte	0x3
@@ -40245,7 +40333,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0xa48
+	.2byte	0xa52
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40253,7 +40341,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0xa53
+	.2byte	0xa5d
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40261,7 +40349,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0xa61
+	.2byte	0xa6b
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40269,7 +40357,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0xa84
+	.2byte	0xa8e
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40277,7 +40365,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0xa8e
+	.2byte	0xa98
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40285,7 +40373,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0xa97
+	.2byte	0xaa1
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40293,7 +40381,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0xaa0
+	.2byte	0xaaa
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40301,7 +40389,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0xc4d
+	.2byte	0xc57
 	.4byte	0xa5cc
 	.uleb128 0x9
 	.byte	0x3
@@ -40318,7 +40406,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0xc52
+	.2byte	0xc5c
 	.4byte	0xe71f
 	.uleb128 0x9
 	.byte	0x3
@@ -40326,7 +40414,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0xc58
+	.2byte	0xc62
 	.4byte	0xd70e
 	.uleb128 0x9
 	.byte	0x3
@@ -40334,15 +40422,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0xc6c
+	.2byte	0xc76
 	.4byte	0x458
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init3180
+	.8byte	__addressable_ebc_init3190
 	.uleb128 0x4d
 	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0xc6d
+	.2byte	0xc77
 	.4byte	0x4ac
 	.uleb128 0x9
 	.byte	0x3
@@ -40350,7 +40438,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4e
 	.4byte	.LASF3096
 	.byte	0x1
-	.2byte	0xc67
+	.2byte	0xc71
 	.8byte	.LFB2867
 	.8byte	.LFE2867-.LFB2867
 	.uleb128 0x1
@@ -40358,12 +40446,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe7a8
 	.uleb128 0x4f
 	.8byte	.LVL64
-	.4byte	0x15269
+	.4byte	0x15389
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0xc62
+	.2byte	0xc6c
 	.4byte	0xc6
 	.8byte	.LFB2866
 	.8byte	.LFE2866-.LFB2866
@@ -40372,12 +40460,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe7d8
 	.uleb128 0x4f
 	.8byte	.LVL361
-	.4byte	0x15275
+	.4byte	0x15395
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0xc41
+	.2byte	0xc4b
 	.4byte	0xc6
 	.8byte	.LFB2865
 	.8byte	.LFE2865-.LFB2865
@@ -40387,42 +40475,42 @@ __exitcall_ebc_exit:
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xc41
+	.2byte	0xc4b
 	.4byte	0xa5e0
 	.4byte	.LLST11
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xc43
+	.2byte	0xc4d
 	.4byte	0xe557
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xc44
+	.2byte	0xc4e
 	.4byte	0xe874
 	.uleb128 0x54
-	.4byte	0x14b34
-	.8byte	.LBB954
-	.8byte	.LBE954-.LBB954
+	.4byte	0x14c45
+	.8byte	.LBB980
+	.8byte	.LBE980-.LBB980
 	.byte	0x1
-	.2byte	0xc43
+	.2byte	0xc4d
 	.4byte	0xe844
 	.uleb128 0x55
-	.4byte	0x14b45
+	.4byte	0x14c56
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x146fc
-	.8byte	.LBB956
-	.8byte	.LBE956-.LBB956
+	.4byte	0x14804
+	.8byte	.LBB982
+	.8byte	.LBE982-.LBB982
 	.byte	0x1
-	.2byte	0xc46
+	.2byte	0xc50
 	.4byte	0xe866
 	.uleb128 0x55
-	.4byte	0x14709
+	.4byte	0x14811
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL68
-	.4byte	0x15281
+	.4byte	0x153a1
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -40430,7 +40518,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x51
 	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0xc30
+	.2byte	0xc3a
 	.4byte	0xc6
 	.8byte	.LFB2864
 	.8byte	.LFE2864-.LFB2864
@@ -40440,72 +40528,72 @@ __exitcall_ebc_exit:
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xc30
+	.2byte	0xc3a
 	.4byte	0xa5e0
 	.4byte	.LLST192
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xc32
+	.2byte	0xc3c
 	.4byte	0xe557
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xc33
+	.2byte	0xc3d
 	.4byte	0xe874
 	.uleb128 0x56
 	.4byte	.LASF3050
 	.4byte	0xe991
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35528
+	.8byte	__func__.35541
 	.uleb128 0x54
-	.4byte	0x14b34
-	.8byte	.LBB1484
-	.8byte	.LBE1484-.LBB1484
+	.4byte	0x14c45
+	.8byte	.LBB1510
+	.8byte	.LBE1510-.LBB1510
 	.byte	0x1
-	.2byte	0xc32
+	.2byte	0xc3c
 	.4byte	0xe8f9
 	.uleb128 0x55
-	.4byte	0x14b45
+	.4byte	0x14c56
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14716
-	.8byte	.LBB1486
-	.8byte	.LBE1486-.LBB1486
+	.4byte	0x1481e
+	.8byte	.LBB1512
+	.8byte	.LBE1512-.LBB1512
 	.byte	0x1
-	.2byte	0xc3b
+	.2byte	0xc45
 	.4byte	0xe91b
 	.uleb128 0x55
-	.4byte	0x14723
+	.4byte	0x1482b
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x143c3
-	.8byte	.LBB1488
-	.8byte	.LBE1488-.LBB1488
+	.4byte	0x144c7
+	.8byte	.LBB1514
+	.8byte	.LBE1514-.LBB1514
 	.byte	0x1
-	.2byte	0xc37
+	.2byte	0xc41
 	.4byte	0xe966
 	.uleb128 0x55
-	.4byte	0x143de
+	.4byte	0x144e3
 	.uleb128 0x55
-	.4byte	0x143d3
+	.4byte	0x144d7
 	.uleb128 0x57
-	.8byte	.LBB1489
-	.8byte	.LBE1489-.LBB1489
+	.8byte	.LBB1515
+	.8byte	.LBE1515-.LBB1515
 	.uleb128 0x58
-	.4byte	0x143ea
+	.4byte	0x144ef
 	.uleb128 0x4f
 	.8byte	.LVL592
-	.4byte	0x15098
+	.4byte	0x151b8
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL590
-	.4byte	0x15281
+	.4byte	0x153a1
 	.uleb128 0x4f
 	.8byte	.LVL591
-	.4byte	0x15281
+	.4byte	0x153a1
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
@@ -40519,7 +40607,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x50
 	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0xc29
+	.2byte	0xc33
 	.4byte	0xc6
 	.8byte	.LFB2863
 	.8byte	.LFE2863-.LFB2863
@@ -40529,17 +40617,17 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0xc29
+	.2byte	0xc33
 	.4byte	0xd78a
 	.4byte	.LLST13
 	.uleb128 0x4f
 	.8byte	.LVL74
-	.4byte	0x1528e
+	.4byte	0x153ae
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0xba8
+	.2byte	0xbb2
 	.4byte	0xc6
 	.8byte	.LFB2862
 	.8byte	.LFE2862-.LFB2862
@@ -40549,141 +40637,141 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0xba8
+	.2byte	0xbb2
 	.4byte	0xd78a
 	.4byte	.LLST195
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xbaa
+	.2byte	0xbb4
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0xbab
+	.2byte	0xbb5
 	.4byte	0xb904
 	.uleb128 0x5a
 	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0xbac
+	.2byte	0xbb6
 	.4byte	0xd78a
 	.4byte	.LLST196
 	.uleb128 0x48
 	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0xbad
+	.2byte	0xbb7
 	.4byte	0xb904
 	.uleb128 0x5a
 	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0xbae
+	.2byte	0xbb8
 	.4byte	0xc0b3
 	.4byte	.LLST197
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xbaf
+	.2byte	0xbb9
 	.4byte	0xe557
 	.uleb128 0x5a
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xbb0
+	.2byte	0xbba
 	.4byte	0xe874
 	.4byte	.LLST198
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xbb1
+	.2byte	0xbbb
 	.4byte	0xe1f4
 	.uleb128 0x5a
 	.4byte	.LASF976
 	.byte	0x1
-	.2byte	0xbb2
+	.2byte	0xbbc
 	.4byte	0xbd30
 	.4byte	.LLST199
 	.uleb128 0x48
 	.4byte	.LASF2435
 	.byte	0x1
-	.2byte	0xbb3
+	.2byte	0xbbd
 	.4byte	0xbcd0
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xbb4
+	.2byte	0xbbe
 	.4byte	0xc6
 	.uleb128 0x5a
 	.4byte	.LASF1001
 	.byte	0x1
-	.2byte	0xbb5
+	.2byte	0xbbf
 	.4byte	0xc6
 	.4byte	.LLST200
 	.uleb128 0x5b
 	.string	"i"
 	.byte	0x1
-	.2byte	0xbb6
+	.2byte	0xbc0
 	.4byte	0xc6
 	.4byte	.LLST201
 	.uleb128 0x5c
-	.4byte	0x14b52
-	.8byte	.LBB1634
+	.4byte	0x14c63
+	.8byte	.LBB1660
 	.4byte	.Ldebug_ranges0+0xcb0
 	.byte	0x1
-	.2byte	0xbb8
+	.2byte	0xbc2
 	.4byte	0xeaef
 	.uleb128 0x55
-	.4byte	0x14b7b
+	.4byte	0x14c8c
 	.uleb128 0x55
-	.4byte	0x14b6f
+	.4byte	0x14c80
 	.uleb128 0x55
-	.4byte	0x14b63
+	.4byte	0x14c74
 	.uleb128 0x4f
 	.8byte	.LVL598
-	.4byte	0x1529a
+	.4byte	0x153ba
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a2c
-	.8byte	.LBB1638
-	.8byte	.LBE1638-.LBB1638
+	.4byte	0x14b3d
+	.8byte	.LBB1664
+	.8byte	.LBE1664-.LBB1664
 	.byte	0x1
-	.2byte	0xbca
+	.2byte	0xbd4
 	.4byte	0xeb2e
 	.uleb128 0x55
-	.4byte	0x14a3c
+	.4byte	0x14b4d
 	.uleb128 0x5d
-	.4byte	0x14b34
-	.8byte	.LBB1639
-	.8byte	.LBE1639-.LBB1639
+	.4byte	0x14c45
+	.8byte	.LBB1665
+	.8byte	.LBE1665-.LBB1665
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x55
-	.4byte	0x14b45
+	.4byte	0x14c56
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a4f
-	.8byte	.LBB1641
-	.8byte	.LBE1641-.LBB1641
+	.4byte	0x14b60
+	.8byte	.LBB1667
+	.8byte	.LBE1667-.LBB1667
 	.byte	0x1
-	.2byte	0xbe5
+	.2byte	0xbef
 	.4byte	0xeb6e
 	.uleb128 0x55
-	.4byte	0x14a60
+	.4byte	0x14b71
 	.uleb128 0x5e
-	.4byte	0x14b34
-	.8byte	.LBB1642
-	.8byte	.LBE1642-.LBB1642
+	.4byte	0x14c45
+	.8byte	.LBB1668
+	.8byte	.LBE1668-.LBB1668
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x55
-	.4byte	0x14b45
+	.4byte	0x14c56
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0x117be
-	.8byte	.LBB1644
+	.8byte	.LBB1670
 	.4byte	.Ldebug_ranges0+0xce0
 	.byte	0x1
-	.2byte	0xbf9
+	.2byte	0xc03
 	.4byte	0xf543
 	.uleb128 0x55
 	.4byte	0x117cf
@@ -40692,760 +40780,760 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	0x117db
 	.uleb128 0x5c
-	.4byte	0x14a73
-	.8byte	.LBB1646
+	.4byte	0x14b84
+	.8byte	.LBB1672
 	.4byte	.Ldebug_ranges0+0xd30
 	.byte	0x1
-	.2byte	0x8eb
+	.2byte	0x8f5
 	.4byte	0xebfe
 	.uleb128 0x55
-	.4byte	0x14a9b
+	.4byte	0x14bac
 	.uleb128 0x55
-	.4byte	0x14a8f
+	.4byte	0x14ba0
 	.uleb128 0x55
-	.4byte	0x14a84
+	.4byte	0x14b95
 	.uleb128 0x60
-	.4byte	0x14aa8
-	.8byte	.LBB1647
+	.4byte	0x14bb9
+	.8byte	.LBB1673
 	.4byte	.Ldebug_ranges0+0xd30
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14adc
+	.4byte	0x14bed
 	.uleb128 0x55
-	.4byte	0x14ad0
+	.4byte	0x14be1
 	.uleb128 0x55
-	.4byte	0x14ac4
+	.4byte	0x14bd5
 	.uleb128 0x55
-	.4byte	0x14ab9
+	.4byte	0x14bca
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xd30
 	.uleb128 0x58
-	.4byte	0x14ae7
+	.4byte	0x14bf8
 	.uleb128 0x4f
 	.8byte	.LVL623
-	.4byte	0x152a7
+	.4byte	0x153c7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a73
-	.8byte	.LBB1658
-	.8byte	.LBE1658-.LBB1658
+	.4byte	0x14b84
+	.8byte	.LBB1684
+	.8byte	.LBE1684-.LBB1684
 	.byte	0x1
-	.2byte	0x8ee
+	.2byte	0x8f8
 	.4byte	0xec7b
 	.uleb128 0x55
-	.4byte	0x14a9b
+	.4byte	0x14bac
 	.uleb128 0x55
-	.4byte	0x14a8f
+	.4byte	0x14ba0
 	.uleb128 0x55
-	.4byte	0x14a84
+	.4byte	0x14b95
 	.uleb128 0x5e
-	.4byte	0x14aa8
-	.8byte	.LBB1659
-	.8byte	.LBE1659-.LBB1659
+	.4byte	0x14bb9
+	.8byte	.LBB1685
+	.8byte	.LBE1685-.LBB1685
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14adc
+	.4byte	0x14bed
 	.uleb128 0x55
-	.4byte	0x14ad0
+	.4byte	0x14be1
 	.uleb128 0x55
-	.4byte	0x14ac4
+	.4byte	0x14bd5
 	.uleb128 0x55
-	.4byte	0x14ab9
+	.4byte	0x14bca
 	.uleb128 0x57
-	.8byte	.LBB1660
-	.8byte	.LBE1660-.LBB1660
+	.8byte	.LBB1686
+	.8byte	.LBE1686-.LBB1686
 	.uleb128 0x58
-	.4byte	0x14ae7
+	.4byte	0x14bf8
 	.uleb128 0x4f
 	.8byte	.LVL624
-	.4byte	0x152a7
+	.4byte	0x153c7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a73
-	.8byte	.LBB1661
-	.8byte	.LBE1661-.LBB1661
+	.4byte	0x14b84
+	.8byte	.LBB1687
+	.8byte	.LBE1687-.LBB1687
 	.byte	0x1
-	.2byte	0x8f1
+	.2byte	0x8fb
 	.4byte	0xecf8
 	.uleb128 0x55
-	.4byte	0x14a9b
+	.4byte	0x14bac
 	.uleb128 0x55
-	.4byte	0x14a8f
+	.4byte	0x14ba0
 	.uleb128 0x55
-	.4byte	0x14a84
+	.4byte	0x14b95
 	.uleb128 0x5e
-	.4byte	0x14aa8
-	.8byte	.LBB1662
-	.8byte	.LBE1662-.LBB1662
+	.4byte	0x14bb9
+	.8byte	.LBB1688
+	.8byte	.LBE1688-.LBB1688
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14adc
+	.4byte	0x14bed
 	.uleb128 0x55
-	.4byte	0x14ad0
+	.4byte	0x14be1
 	.uleb128 0x55
-	.4byte	0x14ac4
+	.4byte	0x14bd5
 	.uleb128 0x55
-	.4byte	0x14ab9
+	.4byte	0x14bca
 	.uleb128 0x57
-	.8byte	.LBB1663
-	.8byte	.LBE1663-.LBB1663
+	.8byte	.LBB1689
+	.8byte	.LBE1689-.LBB1689
 	.uleb128 0x58
-	.4byte	0x14ae7
+	.4byte	0x14bf8
 	.uleb128 0x4f
 	.8byte	.LVL625
-	.4byte	0x152a7
+	.4byte	0x153c7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a73
-	.8byte	.LBB1664
-	.8byte	.LBE1664-.LBB1664
+	.4byte	0x14b84
+	.8byte	.LBB1690
+	.8byte	.LBE1690-.LBB1690
 	.byte	0x1
-	.2byte	0x8f4
+	.2byte	0x8fe
 	.4byte	0xed75
 	.uleb128 0x55
-	.4byte	0x14a9b
+	.4byte	0x14bac
 	.uleb128 0x55
-	.4byte	0x14a8f
+	.4byte	0x14ba0
 	.uleb128 0x55
-	.4byte	0x14a84
+	.4byte	0x14b95
 	.uleb128 0x5e
-	.4byte	0x14aa8
-	.8byte	.LBB1665
-	.8byte	.LBE1665-.LBB1665
+	.4byte	0x14bb9
+	.8byte	.LBB1691
+	.8byte	.LBE1691-.LBB1691
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14adc
+	.4byte	0x14bed
 	.uleb128 0x55
-	.4byte	0x14ad0
+	.4byte	0x14be1
 	.uleb128 0x55
-	.4byte	0x14ac4
+	.4byte	0x14bd5
 	.uleb128 0x55
-	.4byte	0x14ab9
+	.4byte	0x14bca
 	.uleb128 0x57
-	.8byte	.LBB1666
-	.8byte	.LBE1666-.LBB1666
+	.8byte	.LBB1692
+	.8byte	.LBE1692-.LBB1692
 	.uleb128 0x58
-	.4byte	0x14ae7
+	.4byte	0x14bf8
 	.uleb128 0x4f
 	.8byte	.LVL626
-	.4byte	0x152a7
+	.4byte	0x153c7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a73
-	.8byte	.LBB1667
-	.8byte	.LBE1667-.LBB1667
+	.4byte	0x14b84
+	.8byte	.LBB1693
+	.8byte	.LBE1693-.LBB1693
 	.byte	0x1
-	.2byte	0x8f7
+	.2byte	0x901
 	.4byte	0xedf2
 	.uleb128 0x55
-	.4byte	0x14a9b
+	.4byte	0x14bac
 	.uleb128 0x55
-	.4byte	0x14a8f
+	.4byte	0x14ba0
 	.uleb128 0x55
-	.4byte	0x14a84
+	.4byte	0x14b95
 	.uleb128 0x5e
-	.4byte	0x14aa8
-	.8byte	.LBB1668
-	.8byte	.LBE1668-.LBB1668
+	.4byte	0x14bb9
+	.8byte	.LBB1694
+	.8byte	.LBE1694-.LBB1694
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14adc
+	.4byte	0x14bed
 	.uleb128 0x55
-	.4byte	0x14ad0
+	.4byte	0x14be1
 	.uleb128 0x55
-	.4byte	0x14ac4
+	.4byte	0x14bd5
 	.uleb128 0x55
-	.4byte	0x14ab9
+	.4byte	0x14bca
 	.uleb128 0x57
-	.8byte	.LBB1669
-	.8byte	.LBE1669-.LBB1669
+	.8byte	.LBB1695
+	.8byte	.LBE1695-.LBB1695
 	.uleb128 0x58
-	.4byte	0x14ae7
+	.4byte	0x14bf8
 	.uleb128 0x4f
 	.8byte	.LVL627
-	.4byte	0x152a7
+	.4byte	0x153c7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a73
-	.8byte	.LBB1670
-	.8byte	.LBE1670-.LBB1670
+	.4byte	0x14b84
+	.8byte	.LBB1696
+	.8byte	.LBE1696-.LBB1696
 	.byte	0x1
-	.2byte	0x8fa
+	.2byte	0x904
 	.4byte	0xee6f
 	.uleb128 0x55
-	.4byte	0x14a9b
+	.4byte	0x14bac
 	.uleb128 0x55
-	.4byte	0x14a8f
+	.4byte	0x14ba0
 	.uleb128 0x55
-	.4byte	0x14a84
+	.4byte	0x14b95
 	.uleb128 0x5e
-	.4byte	0x14aa8
-	.8byte	.LBB1671
-	.8byte	.LBE1671-.LBB1671
+	.4byte	0x14bb9
+	.8byte	.LBB1697
+	.8byte	.LBE1697-.LBB1697
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14adc
+	.4byte	0x14bed
 	.uleb128 0x55
-	.4byte	0x14ad0
+	.4byte	0x14be1
 	.uleb128 0x55
-	.4byte	0x14ac4
+	.4byte	0x14bd5
 	.uleb128 0x55
-	.4byte	0x14ab9
+	.4byte	0x14bca
 	.uleb128 0x57
-	.8byte	.LBB1672
-	.8byte	.LBE1672-.LBB1672
+	.8byte	.LBB1698
+	.8byte	.LBE1698-.LBB1698
 	.uleb128 0x58
-	.4byte	0x14ae7
+	.4byte	0x14bf8
 	.uleb128 0x4f
 	.8byte	.LVL628
-	.4byte	0x152a7
+	.4byte	0x153c7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a73
-	.8byte	.LBB1673
-	.8byte	.LBE1673-.LBB1673
+	.4byte	0x14b84
+	.8byte	.LBB1699
+	.8byte	.LBE1699-.LBB1699
 	.byte	0x1
-	.2byte	0x8fd
+	.2byte	0x907
 	.4byte	0xeeec
 	.uleb128 0x55
-	.4byte	0x14a9b
+	.4byte	0x14bac
 	.uleb128 0x55
-	.4byte	0x14a8f
+	.4byte	0x14ba0
 	.uleb128 0x55
-	.4byte	0x14a84
+	.4byte	0x14b95
 	.uleb128 0x5e
-	.4byte	0x14aa8
-	.8byte	.LBB1674
-	.8byte	.LBE1674-.LBB1674
+	.4byte	0x14bb9
+	.8byte	.LBB1700
+	.8byte	.LBE1700-.LBB1700
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14adc
+	.4byte	0x14bed
 	.uleb128 0x55
-	.4byte	0x14ad0
+	.4byte	0x14be1
 	.uleb128 0x55
-	.4byte	0x14ac4
+	.4byte	0x14bd5
 	.uleb128 0x55
-	.4byte	0x14ab9
+	.4byte	0x14bca
 	.uleb128 0x57
-	.8byte	.LBB1675
-	.8byte	.LBE1675-.LBB1675
+	.8byte	.LBB1701
+	.8byte	.LBE1701-.LBB1701
 	.uleb128 0x58
-	.4byte	0x14ae7
+	.4byte	0x14bf8
 	.uleb128 0x4f
 	.8byte	.LVL629
-	.4byte	0x152a7
+	.4byte	0x153c7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a73
-	.8byte	.LBB1676
-	.8byte	.LBE1676-.LBB1676
+	.4byte	0x14b84
+	.8byte	.LBB1702
+	.8byte	.LBE1702-.LBB1702
 	.byte	0x1
-	.2byte	0x900
+	.2byte	0x90a
 	.4byte	0xef69
 	.uleb128 0x55
-	.4byte	0x14a9b
+	.4byte	0x14bac
 	.uleb128 0x55
-	.4byte	0x14a8f
+	.4byte	0x14ba0
 	.uleb128 0x55
-	.4byte	0x14a84
+	.4byte	0x14b95
 	.uleb128 0x5e
-	.4byte	0x14aa8
-	.8byte	.LBB1677
-	.8byte	.LBE1677-.LBB1677
+	.4byte	0x14bb9
+	.8byte	.LBB1703
+	.8byte	.LBE1703-.LBB1703
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14adc
+	.4byte	0x14bed
 	.uleb128 0x55
-	.4byte	0x14ad0
+	.4byte	0x14be1
 	.uleb128 0x55
-	.4byte	0x14ac4
+	.4byte	0x14bd5
 	.uleb128 0x55
-	.4byte	0x14ab9
+	.4byte	0x14bca
 	.uleb128 0x57
-	.8byte	.LBB1678
-	.8byte	.LBE1678-.LBB1678
+	.8byte	.LBB1704
+	.8byte	.LBE1704-.LBB1704
 	.uleb128 0x58
-	.4byte	0x14ae7
+	.4byte	0x14bf8
 	.uleb128 0x4f
 	.8byte	.LVL630
-	.4byte	0x152a7
+	.4byte	0x153c7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a73
-	.8byte	.LBB1679
-	.8byte	.LBE1679-.LBB1679
+	.4byte	0x14b84
+	.8byte	.LBB1705
+	.8byte	.LBE1705-.LBB1705
 	.byte	0x1
-	.2byte	0x903
+	.2byte	0x90d
 	.4byte	0xefe6
 	.uleb128 0x55
-	.4byte	0x14a9b
+	.4byte	0x14bac
 	.uleb128 0x55
-	.4byte	0x14a8f
+	.4byte	0x14ba0
 	.uleb128 0x55
-	.4byte	0x14a84
+	.4byte	0x14b95
 	.uleb128 0x5e
-	.4byte	0x14aa8
-	.8byte	.LBB1680
-	.8byte	.LBE1680-.LBB1680
+	.4byte	0x14bb9
+	.8byte	.LBB1706
+	.8byte	.LBE1706-.LBB1706
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14adc
+	.4byte	0x14bed
 	.uleb128 0x55
-	.4byte	0x14ad0
+	.4byte	0x14be1
 	.uleb128 0x55
-	.4byte	0x14ac4
+	.4byte	0x14bd5
 	.uleb128 0x55
-	.4byte	0x14ab9
+	.4byte	0x14bca
 	.uleb128 0x57
-	.8byte	.LBB1681
-	.8byte	.LBE1681-.LBB1681
+	.8byte	.LBB1707
+	.8byte	.LBE1707-.LBB1707
 	.uleb128 0x58
-	.4byte	0x14ae7
+	.4byte	0x14bf8
 	.uleb128 0x4f
 	.8byte	.LVL631
-	.4byte	0x152a7
+	.4byte	0x153c7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a73
-	.8byte	.LBB1682
-	.8byte	.LBE1682-.LBB1682
+	.4byte	0x14b84
+	.8byte	.LBB1708
+	.8byte	.LBE1708-.LBB1708
 	.byte	0x1
-	.2byte	0x906
+	.2byte	0x910
 	.4byte	0xf063
 	.uleb128 0x55
-	.4byte	0x14a9b
+	.4byte	0x14bac
 	.uleb128 0x55
-	.4byte	0x14a8f
+	.4byte	0x14ba0
 	.uleb128 0x55
-	.4byte	0x14a84
+	.4byte	0x14b95
 	.uleb128 0x5e
-	.4byte	0x14aa8
-	.8byte	.LBB1683
-	.8byte	.LBE1683-.LBB1683
+	.4byte	0x14bb9
+	.8byte	.LBB1709
+	.8byte	.LBE1709-.LBB1709
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14adc
+	.4byte	0x14bed
 	.uleb128 0x55
-	.4byte	0x14ad0
+	.4byte	0x14be1
 	.uleb128 0x55
-	.4byte	0x14ac4
+	.4byte	0x14bd5
 	.uleb128 0x55
-	.4byte	0x14ab9
+	.4byte	0x14bca
 	.uleb128 0x57
-	.8byte	.LBB1684
-	.8byte	.LBE1684-.LBB1684
+	.8byte	.LBB1710
+	.8byte	.LBE1710-.LBB1710
 	.uleb128 0x58
-	.4byte	0x14ae7
+	.4byte	0x14bf8
 	.uleb128 0x4f
 	.8byte	.LVL632
-	.4byte	0x152a7
+	.4byte	0x153c7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a73
-	.8byte	.LBB1685
-	.8byte	.LBE1685-.LBB1685
+	.4byte	0x14b84
+	.8byte	.LBB1711
+	.8byte	.LBE1711-.LBB1711
 	.byte	0x1
-	.2byte	0x909
+	.2byte	0x913
 	.4byte	0xf0e0
 	.uleb128 0x55
-	.4byte	0x14a9b
+	.4byte	0x14bac
 	.uleb128 0x55
-	.4byte	0x14a8f
+	.4byte	0x14ba0
 	.uleb128 0x55
-	.4byte	0x14a84
+	.4byte	0x14b95
 	.uleb128 0x5e
-	.4byte	0x14aa8
-	.8byte	.LBB1686
-	.8byte	.LBE1686-.LBB1686
+	.4byte	0x14bb9
+	.8byte	.LBB1712
+	.8byte	.LBE1712-.LBB1712
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14adc
+	.4byte	0x14bed
 	.uleb128 0x55
-	.4byte	0x14ad0
+	.4byte	0x14be1
 	.uleb128 0x55
-	.4byte	0x14ac4
+	.4byte	0x14bd5
 	.uleb128 0x55
-	.4byte	0x14ab9
+	.4byte	0x14bca
 	.uleb128 0x57
-	.8byte	.LBB1687
-	.8byte	.LBE1687-.LBB1687
+	.8byte	.LBB1713
+	.8byte	.LBE1713-.LBB1713
 	.uleb128 0x58
-	.4byte	0x14ae7
+	.4byte	0x14bf8
 	.uleb128 0x4f
 	.8byte	.LVL633
-	.4byte	0x152a7
+	.4byte	0x153c7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a73
-	.8byte	.LBB1688
-	.8byte	.LBE1688-.LBB1688
+	.4byte	0x14b84
+	.8byte	.LBB1714
+	.8byte	.LBE1714-.LBB1714
 	.byte	0x1
-	.2byte	0x90c
+	.2byte	0x916
 	.4byte	0xf15d
 	.uleb128 0x55
-	.4byte	0x14a9b
+	.4byte	0x14bac
 	.uleb128 0x55
-	.4byte	0x14a8f
+	.4byte	0x14ba0
 	.uleb128 0x55
-	.4byte	0x14a84
+	.4byte	0x14b95
 	.uleb128 0x5e
-	.4byte	0x14aa8
-	.8byte	.LBB1689
-	.8byte	.LBE1689-.LBB1689
+	.4byte	0x14bb9
+	.8byte	.LBB1715
+	.8byte	.LBE1715-.LBB1715
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14adc
+	.4byte	0x14bed
 	.uleb128 0x55
-	.4byte	0x14ad0
+	.4byte	0x14be1
 	.uleb128 0x55
-	.4byte	0x14ac4
+	.4byte	0x14bd5
 	.uleb128 0x55
-	.4byte	0x14ab9
+	.4byte	0x14bca
 	.uleb128 0x57
-	.8byte	.LBB1690
-	.8byte	.LBE1690-.LBB1690
+	.8byte	.LBB1716
+	.8byte	.LBE1716-.LBB1716
 	.uleb128 0x58
-	.4byte	0x14ae7
+	.4byte	0x14bf8
 	.uleb128 0x4f
 	.8byte	.LVL634
-	.4byte	0x152a7
+	.4byte	0x153c7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a73
-	.8byte	.LBB1691
-	.8byte	.LBE1691-.LBB1691
+	.4byte	0x14b84
+	.8byte	.LBB1717
+	.8byte	.LBE1717-.LBB1717
 	.byte	0x1
-	.2byte	0x90f
+	.2byte	0x919
 	.4byte	0xf1da
 	.uleb128 0x55
-	.4byte	0x14a9b
+	.4byte	0x14bac
 	.uleb128 0x55
-	.4byte	0x14a8f
+	.4byte	0x14ba0
 	.uleb128 0x55
-	.4byte	0x14a84
+	.4byte	0x14b95
 	.uleb128 0x5e
-	.4byte	0x14aa8
-	.8byte	.LBB1692
-	.8byte	.LBE1692-.LBB1692
+	.4byte	0x14bb9
+	.8byte	.LBB1718
+	.8byte	.LBE1718-.LBB1718
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14adc
+	.4byte	0x14bed
 	.uleb128 0x55
-	.4byte	0x14ad0
+	.4byte	0x14be1
 	.uleb128 0x55
-	.4byte	0x14ac4
+	.4byte	0x14bd5
 	.uleb128 0x55
-	.4byte	0x14ab9
+	.4byte	0x14bca
 	.uleb128 0x57
-	.8byte	.LBB1693
-	.8byte	.LBE1693-.LBB1693
+	.8byte	.LBB1719
+	.8byte	.LBE1719-.LBB1719
 	.uleb128 0x58
-	.4byte	0x14ae7
+	.4byte	0x14bf8
 	.uleb128 0x4f
 	.8byte	.LVL635
-	.4byte	0x152a7
+	.4byte	0x153c7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a73
-	.8byte	.LBB1694
-	.8byte	.LBE1694-.LBB1694
+	.4byte	0x14b84
+	.8byte	.LBB1720
+	.8byte	.LBE1720-.LBB1720
 	.byte	0x1
-	.2byte	0x912
+	.2byte	0x91c
 	.4byte	0xf257
 	.uleb128 0x55
-	.4byte	0x14a9b
+	.4byte	0x14bac
 	.uleb128 0x55
-	.4byte	0x14a8f
+	.4byte	0x14ba0
 	.uleb128 0x55
-	.4byte	0x14a84
+	.4byte	0x14b95
 	.uleb128 0x5e
-	.4byte	0x14aa8
-	.8byte	.LBB1695
-	.8byte	.LBE1695-.LBB1695
+	.4byte	0x14bb9
+	.8byte	.LBB1721
+	.8byte	.LBE1721-.LBB1721
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14adc
+	.4byte	0x14bed
 	.uleb128 0x55
-	.4byte	0x14ad0
+	.4byte	0x14be1
 	.uleb128 0x55
-	.4byte	0x14ac4
+	.4byte	0x14bd5
 	.uleb128 0x55
-	.4byte	0x14ab9
+	.4byte	0x14bca
 	.uleb128 0x57
-	.8byte	.LBB1696
-	.8byte	.LBE1696-.LBB1696
+	.8byte	.LBB1722
+	.8byte	.LBE1722-.LBB1722
 	.uleb128 0x58
-	.4byte	0x14ae7
+	.4byte	0x14bf8
 	.uleb128 0x4f
 	.8byte	.LVL636
-	.4byte	0x152a7
+	.4byte	0x153c7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a73
-	.8byte	.LBB1697
-	.8byte	.LBE1697-.LBB1697
+	.4byte	0x14b84
+	.8byte	.LBB1723
+	.8byte	.LBE1723-.LBB1723
 	.byte	0x1
-	.2byte	0x915
+	.2byte	0x91f
 	.4byte	0xf2d4
 	.uleb128 0x55
-	.4byte	0x14a9b
+	.4byte	0x14bac
 	.uleb128 0x55
-	.4byte	0x14a8f
+	.4byte	0x14ba0
 	.uleb128 0x55
-	.4byte	0x14a84
+	.4byte	0x14b95
 	.uleb128 0x5e
-	.4byte	0x14aa8
-	.8byte	.LBB1698
-	.8byte	.LBE1698-.LBB1698
+	.4byte	0x14bb9
+	.8byte	.LBB1724
+	.8byte	.LBE1724-.LBB1724
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14adc
+	.4byte	0x14bed
 	.uleb128 0x55
-	.4byte	0x14ad0
+	.4byte	0x14be1
 	.uleb128 0x55
-	.4byte	0x14ac4
+	.4byte	0x14bd5
 	.uleb128 0x55
-	.4byte	0x14ab9
+	.4byte	0x14bca
 	.uleb128 0x57
-	.8byte	.LBB1699
-	.8byte	.LBE1699-.LBB1699
+	.8byte	.LBB1725
+	.8byte	.LBE1725-.LBB1725
 	.uleb128 0x58
-	.4byte	0x14ae7
+	.4byte	0x14bf8
 	.uleb128 0x4f
 	.8byte	.LVL637
-	.4byte	0x152a7
+	.4byte	0x153c7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a73
-	.8byte	.LBB1700
-	.8byte	.LBE1700-.LBB1700
+	.4byte	0x14b84
+	.8byte	.LBB1726
+	.8byte	.LBE1726-.LBB1726
 	.byte	0x1
-	.2byte	0x918
+	.2byte	0x922
 	.4byte	0xf351
 	.uleb128 0x55
-	.4byte	0x14a9b
+	.4byte	0x14bac
 	.uleb128 0x55
-	.4byte	0x14a8f
+	.4byte	0x14ba0
 	.uleb128 0x55
-	.4byte	0x14a84
+	.4byte	0x14b95
 	.uleb128 0x5e
-	.4byte	0x14aa8
-	.8byte	.LBB1701
-	.8byte	.LBE1701-.LBB1701
+	.4byte	0x14bb9
+	.8byte	.LBB1727
+	.8byte	.LBE1727-.LBB1727
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14adc
+	.4byte	0x14bed
 	.uleb128 0x55
-	.4byte	0x14ad0
+	.4byte	0x14be1
 	.uleb128 0x55
-	.4byte	0x14ac4
+	.4byte	0x14bd5
 	.uleb128 0x55
-	.4byte	0x14ab9
+	.4byte	0x14bca
 	.uleb128 0x57
-	.8byte	.LBB1702
-	.8byte	.LBE1702-.LBB1702
+	.8byte	.LBB1728
+	.8byte	.LBE1728-.LBB1728
 	.uleb128 0x58
-	.4byte	0x14ae7
+	.4byte	0x14bf8
 	.uleb128 0x4f
 	.8byte	.LVL638
-	.4byte	0x152a7
+	.4byte	0x153c7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a73
-	.8byte	.LBB1703
-	.8byte	.LBE1703-.LBB1703
+	.4byte	0x14b84
+	.8byte	.LBB1729
+	.8byte	.LBE1729-.LBB1729
 	.byte	0x1
-	.2byte	0x91b
+	.2byte	0x925
 	.4byte	0xf3ce
 	.uleb128 0x55
-	.4byte	0x14a9b
+	.4byte	0x14bac
 	.uleb128 0x55
-	.4byte	0x14a8f
+	.4byte	0x14ba0
 	.uleb128 0x55
-	.4byte	0x14a84
+	.4byte	0x14b95
 	.uleb128 0x5e
-	.4byte	0x14aa8
-	.8byte	.LBB1704
-	.8byte	.LBE1704-.LBB1704
+	.4byte	0x14bb9
+	.8byte	.LBB1730
+	.8byte	.LBE1730-.LBB1730
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14adc
+	.4byte	0x14bed
 	.uleb128 0x55
-	.4byte	0x14ad0
+	.4byte	0x14be1
 	.uleb128 0x55
-	.4byte	0x14ac4
+	.4byte	0x14bd5
 	.uleb128 0x55
-	.4byte	0x14ab9
+	.4byte	0x14bca
 	.uleb128 0x57
-	.8byte	.LBB1705
-	.8byte	.LBE1705-.LBB1705
+	.8byte	.LBB1731
+	.8byte	.LBE1731-.LBB1731
 	.uleb128 0x58
-	.4byte	0x14ae7
+	.4byte	0x14bf8
 	.uleb128 0x4f
 	.8byte	.LVL639
-	.4byte	0x152a7
+	.4byte	0x153c7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a73
-	.8byte	.LBB1706
-	.8byte	.LBE1706-.LBB1706
+	.4byte	0x14b84
+	.8byte	.LBB1732
+	.8byte	.LBE1732-.LBB1732
 	.byte	0x1
-	.2byte	0x91e
+	.2byte	0x928
 	.4byte	0xf44b
 	.uleb128 0x55
-	.4byte	0x14a9b
+	.4byte	0x14bac
 	.uleb128 0x55
-	.4byte	0x14a8f
+	.4byte	0x14ba0
 	.uleb128 0x55
-	.4byte	0x14a84
+	.4byte	0x14b95
 	.uleb128 0x5e
-	.4byte	0x14aa8
-	.8byte	.LBB1707
-	.8byte	.LBE1707-.LBB1707
+	.4byte	0x14bb9
+	.8byte	.LBB1733
+	.8byte	.LBE1733-.LBB1733
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14adc
+	.4byte	0x14bed
 	.uleb128 0x55
-	.4byte	0x14ad0
+	.4byte	0x14be1
 	.uleb128 0x55
-	.4byte	0x14ac4
+	.4byte	0x14bd5
 	.uleb128 0x55
-	.4byte	0x14ab9
+	.4byte	0x14bca
 	.uleb128 0x57
-	.8byte	.LBB1708
-	.8byte	.LBE1708-.LBB1708
+	.8byte	.LBB1734
+	.8byte	.LBE1734-.LBB1734
 	.uleb128 0x58
-	.4byte	0x14ae7
+	.4byte	0x14bf8
 	.uleb128 0x4f
 	.8byte	.LVL640
-	.4byte	0x152a7
+	.4byte	0x153c7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a73
-	.8byte	.LBB1709
-	.8byte	.LBE1709-.LBB1709
+	.4byte	0x14b84
+	.8byte	.LBB1735
+	.8byte	.LBE1735-.LBB1735
 	.byte	0x1
-	.2byte	0x921
+	.2byte	0x92b
 	.4byte	0xf4c8
 	.uleb128 0x55
-	.4byte	0x14a9b
+	.4byte	0x14bac
 	.uleb128 0x55
-	.4byte	0x14a8f
+	.4byte	0x14ba0
 	.uleb128 0x55
-	.4byte	0x14a84
+	.4byte	0x14b95
 	.uleb128 0x5e
-	.4byte	0x14aa8
-	.8byte	.LBB1710
-	.8byte	.LBE1710-.LBB1710
+	.4byte	0x14bb9
+	.8byte	.LBB1736
+	.8byte	.LBE1736-.LBB1736
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14adc
+	.4byte	0x14bed
 	.uleb128 0x55
-	.4byte	0x14ad0
+	.4byte	0x14be1
 	.uleb128 0x55
-	.4byte	0x14ac4
+	.4byte	0x14bd5
 	.uleb128 0x55
-	.4byte	0x14ab9
+	.4byte	0x14bca
 	.uleb128 0x57
-	.8byte	.LBB1711
-	.8byte	.LBE1711-.LBB1711
+	.8byte	.LBB1737
+	.8byte	.LBE1737-.LBB1737
 	.uleb128 0x58
-	.4byte	0x14ae7
+	.4byte	0x14bf8
 	.uleb128 0x4f
 	.8byte	.LVL641
-	.4byte	0x152a7
+	.4byte	0x153c7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x14a73
-	.8byte	.LBB1712
-	.8byte	.LBE1712-.LBB1712
+	.4byte	0x14b84
+	.8byte	.LBB1738
+	.8byte	.LBE1738-.LBB1738
 	.byte	0x1
-	.2byte	0x924
+	.2byte	0x92e
 	.uleb128 0x55
-	.4byte	0x14a9b
+	.4byte	0x14bac
 	.uleb128 0x55
-	.4byte	0x14a8f
+	.4byte	0x14ba0
 	.uleb128 0x55
-	.4byte	0x14a84
+	.4byte	0x14b95
 	.uleb128 0x5e
-	.4byte	0x14aa8
-	.8byte	.LBB1713
-	.8byte	.LBE1713-.LBB1713
+	.4byte	0x14bb9
+	.8byte	.LBB1739
+	.8byte	.LBE1739-.LBB1739
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14adc
+	.4byte	0x14bed
 	.uleb128 0x55
-	.4byte	0x14ad0
+	.4byte	0x14be1
 	.uleb128 0x55
-	.4byte	0x14ac4
+	.4byte	0x14bd5
 	.uleb128 0x55
-	.4byte	0x14ab9
+	.4byte	0x14bca
 	.uleb128 0x57
-	.8byte	.LBB1714
-	.8byte	.LBE1714-.LBB1714
+	.8byte	.LBB1740
+	.8byte	.LBE1740-.LBB1740
 	.uleb128 0x58
-	.4byte	0x14ae7
+	.4byte	0x14bf8
 	.uleb128 0x4f
 	.8byte	.LVL642
-	.4byte	0x152a7
+	.4byte	0x153c7
 	.byte	0
 	.byte	0
 	.byte	0
@@ -41453,10 +41541,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xfea7
-	.8byte	.LBB1721
+	.8byte	.LBB1747
 	.4byte	.Ldebug_ranges0+0xd80
 	.byte	0x1
-	.2byte	0xc05
+	.2byte	0xc0f
 	.4byte	0xf645
 	.uleb128 0x55
 	.4byte	0xfeb8
@@ -41483,61 +41571,61 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	0xff16
 	.uleb128 0x5c
-	.4byte	0x14b88
-	.8byte	.LBB1723
+	.4byte	0x14c99
+	.8byte	.LBB1749
 	.4byte	.Ldebug_ranges0+0xdf0
 	.byte	0x1
-	.2byte	0xaf5
+	.2byte	0xaff
 	.4byte	0xf5b3
 	.uleb128 0x55
-	.4byte	0x14b98
+	.4byte	0x14ca9
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14b52
-	.8byte	.LBB1727
+	.4byte	0x14c63
+	.8byte	.LBB1753
 	.4byte	.Ldebug_ranges0+0xe20
 	.byte	0x1
-	.2byte	0xb14
+	.2byte	0xb1e
 	.4byte	0xf5e8
 	.uleb128 0x55
-	.4byte	0x14b7b
+	.4byte	0x14c8c
 	.uleb128 0x55
-	.4byte	0x14b6f
+	.4byte	0x14c80
 	.uleb128 0x55
-	.4byte	0x14b63
+	.4byte	0x14c74
 	.uleb128 0x4f
 	.8byte	.LVL648
-	.4byte	0x1529a
+	.4byte	0x153ba
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL644
-	.4byte	0x152b4
+	.4byte	0x153d4
 	.uleb128 0x4f
 	.8byte	.LVL645
-	.4byte	0x152c1
+	.4byte	0x153e1
 	.uleb128 0x4f
 	.8byte	.LVL646
-	.4byte	0x152cd
+	.4byte	0x153ed
 	.uleb128 0x4f
 	.8byte	.LVL647
-	.4byte	0x152d9
+	.4byte	0x153f9
 	.uleb128 0x4f
 	.8byte	.LVL649
-	.4byte	0x152e5
+	.4byte	0x15405
 	.uleb128 0x4f
 	.8byte	.LVL650
-	.4byte	0x152ef
+	.4byte	0x1540f
 	.uleb128 0x4f
 	.8byte	.LVL663
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xff21
-	.8byte	.LBB1738
+	.8byte	.LBB1764
 	.4byte	.Ldebug_ranges0+0xe50
 	.byte	0x1
-	.2byte	0xc0c
+	.2byte	0xc16
 	.4byte	0xf71e
 	.uleb128 0x55
 	.4byte	0xff32
@@ -41563,47 +41651,47 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	0xff84
 	.uleb128 0x5c
-	.4byte	0x14b88
-	.8byte	.LBB1740
+	.4byte	0x14c99
+	.8byte	.LBB1766
 	.4byte	.Ldebug_ranges0+0xea0
 	.byte	0x1
-	.2byte	0xac5
+	.2byte	0xacf
 	.4byte	0xf6b4
 	.uleb128 0x55
-	.4byte	0x14b98
+	.4byte	0x14ca9
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL652
-	.4byte	0x152b4
+	.4byte	0x153d4
 	.uleb128 0x4f
 	.8byte	.LVL653
-	.4byte	0x152c1
+	.4byte	0x153e1
 	.uleb128 0x4f
 	.8byte	.LVL667
-	.4byte	0x152cd
+	.4byte	0x153ed
 	.uleb128 0x4f
 	.8byte	.LVL668
-	.4byte	0x15308
+	.4byte	0x15428
 	.uleb128 0x4f
 	.8byte	.LVL754
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL755
-	.4byte	0x15314
+	.4byte	0x15434
 	.uleb128 0x4f
 	.8byte	.LVL756
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL769
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xfe6f
-	.8byte	.LBB1749
+	.8byte	.LBB1775
 	.4byte	.Ldebug_ranges0+0xed0
 	.byte	0x1
-	.2byte	0xc13
+	.2byte	0xc1d
 	.4byte	0xf8b8
 	.uleb128 0x55
 	.4byte	0xfe80
@@ -41615,53 +41703,53 @@ __exitcall_ebc_exit:
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5c
-	.4byte	0x14d4d
-	.8byte	.LBB1751
+	.4byte	0x14e63
+	.8byte	.LBB1777
 	.4byte	.Ldebug_ranges0+0xf10
 	.byte	0x1
-	.2byte	0xb21
+	.2byte	0xb2b
 	.4byte	0xf7a5
 	.uleb128 0x55
-	.4byte	0x14d5a
+	.4byte	0x14e70
 	.uleb128 0x57
-	.8byte	.LBB1753
-	.8byte	.LBE1753-.LBB1753
+	.8byte	.LBB1779
+	.8byte	.LBE1779-.LBB1779
 	.uleb128 0x58
-	.4byte	0x14d86
+	.4byte	0x14e9c
 	.uleb128 0x5d
-	.4byte	0x14f32
-	.8byte	.LBB1754
-	.8byte	.LBE1754-.LBB1754
+	.4byte	0x15052
+	.8byte	.LBB1780
+	.8byte	.LBE1780-.LBB1780
 	.byte	0xf
 	.byte	0x1c
 	.uleb128 0x55
-	.4byte	0x14f55
+	.4byte	0x15075
 	.uleb128 0x55
-	.4byte	0x14f49
+	.4byte	0x15069
 	.uleb128 0x55
-	.4byte	0x14f3f
+	.4byte	0x1505f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14e6e
-	.8byte	.LBB1758
-	.8byte	.LBE1758-.LBB1758
+	.4byte	0x14f89
+	.8byte	.LBB1784
+	.8byte	.LBE1784-.LBB1784
 	.byte	0x1
-	.2byte	0xb2b
+	.2byte	0xb35
 	.4byte	0xf7f0
 	.uleb128 0x55
-	.4byte	0x14e84
+	.4byte	0x14fa0
 	.uleb128 0x55
-	.4byte	0x14e7b
+	.4byte	0x14f96
 	.uleb128 0x57
-	.8byte	.LBB1759
-	.8byte	.LBE1759-.LBB1759
+	.8byte	.LBB1785
+	.8byte	.LBE1785-.LBB1785
 	.uleb128 0x61
-	.4byte	0x14e8d
+	.4byte	0x14faa
 	.4byte	.LLST205
 	.uleb128 0x61
-	.4byte	0x14e97
+	.4byte	0x14fb4
 	.4byte	.LLST206
 	.byte	0
 	.byte	0
@@ -41673,104 +41761,104 @@ __exitcall_ebc_exit:
 	.4byte	.LLST207
 	.uleb128 0x4f
 	.8byte	.LVL676
-	.4byte	0x15320
+	.4byte	0x15440
 	.uleb128 0x4f
 	.8byte	.LVL678
-	.4byte	0x1532c
+	.4byte	0x1544c
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14e6e
-	.8byte	.LBB1762
-	.8byte	.LBE1762-.LBB1762
+	.4byte	0x14f89
+	.8byte	.LBB1788
+	.8byte	.LBE1788-.LBB1788
 	.byte	0x1
-	.2byte	0xb34
+	.2byte	0xb3e
 	.4byte	0xf868
 	.uleb128 0x55
-	.4byte	0x14e84
+	.4byte	0x14fa0
 	.uleb128 0x55
-	.4byte	0x14e7b
+	.4byte	0x14f96
 	.uleb128 0x57
-	.8byte	.LBB1763
-	.8byte	.LBE1763-.LBB1763
+	.8byte	.LBB1789
+	.8byte	.LBE1789-.LBB1789
 	.uleb128 0x61
-	.4byte	0x14e8d
+	.4byte	0x14faa
 	.4byte	.LLST208
 	.uleb128 0x61
-	.4byte	0x14e97
+	.4byte	0x14fb4
 	.4byte	.LLST209
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL669
-	.4byte	0x15339
+	.4byte	0x15459
 	.uleb128 0x4f
 	.8byte	.LVL670
-	.4byte	0x15320
+	.4byte	0x15440
 	.uleb128 0x4f
 	.8byte	.LVL671
-	.4byte	0x15346
+	.4byte	0x15466
 	.uleb128 0x4f
 	.8byte	.LVL679
-	.4byte	0x15346
+	.4byte	0x15466
 	.uleb128 0x4f
 	.8byte	.LVL759
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL763
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0xfe55
-	.8byte	.LBB1766
-	.8byte	.LBE1766-.LBB1766
+	.8byte	.LBB1792
+	.8byte	.LBE1792-.LBB1792
 	.byte	0x1
-	.2byte	0xc1a
+	.2byte	0xc24
 	.4byte	0xf952
 	.uleb128 0x55
 	.4byte	0xfe62
 	.uleb128 0x5c
-	.4byte	0x147ab
-	.8byte	.LBB1768
+	.4byte	0x148b3
+	.8byte	.LBB1794
 	.4byte	.Ldebug_ranges0+0xf70
 	.byte	0x1
-	.2byte	0xb44
+	.2byte	0xb4e
 	.4byte	0xf91d
 	.uleb128 0x55
-	.4byte	0x147d0
+	.4byte	0x148d8
 	.uleb128 0x55
-	.4byte	0x147c4
+	.4byte	0x148cc
 	.uleb128 0x55
-	.4byte	0x147b8
+	.4byte	0x148c0
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xf70
 	.uleb128 0x61
-	.4byte	0x147dc
+	.4byte	0x148e4
 	.4byte	.LLST210
 	.uleb128 0x4f
 	.8byte	.LVL686
-	.4byte	0x15353
+	.4byte	0x15473
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL687
-	.4byte	0x1535f
+	.4byte	0x1547f
 	.uleb128 0x4f
 	.8byte	.LVL688
-	.4byte	0x1536b
+	.4byte	0x1548b
 	.uleb128 0x4f
 	.8byte	.LVL689
-	.4byte	0x1535f
+	.4byte	0x1547f
 	.uleb128 0x4f
 	.8byte	.LVL690
-	.4byte	0x1536b
+	.4byte	0x1548b
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xfdb3
-	.8byte	.LBB1778
+	.8byte	.LBB1804
 	.4byte	.Ldebug_ranges0+0xfd0
 	.byte	0x1
-	.2byte	0xc1d
+	.2byte	0xc27
 	.4byte	0xfbf5
 	.uleb128 0x55
 	.4byte	0xfdd0
@@ -41808,460 +41896,460 @@ __exitcall_ebc_exit:
 	.4byte	.LLST218
 	.uleb128 0x54
 	.4byte	0x11882
-	.8byte	.LBB1780
-	.8byte	.LBE1780-.LBB1780
+	.8byte	.LBB1806
+	.8byte	.LBE1806-.LBB1806
 	.byte	0x1
-	.2byte	0xb7c
+	.2byte	0xb86
 	.4byte	0xfa34
 	.uleb128 0x55
 	.4byte	0x11893
 	.uleb128 0x55
 	.4byte	0x11893
 	.uleb128 0x57
-	.8byte	.LBB1781
-	.8byte	.LBE1781-.LBB1781
+	.8byte	.LBB1807
+	.8byte	.LBE1807-.LBB1807
 	.uleb128 0x61
 	.4byte	0x1189f
 	.4byte	.LLST219
 	.uleb128 0x4f
 	.8byte	.LVL707
-	.4byte	0x15377
+	.4byte	0x15497
 	.uleb128 0x4f
 	.8byte	.LVL709
-	.4byte	0x152ef
+	.4byte	0x1540f
 	.uleb128 0x4f
 	.8byte	.LVL710
-	.4byte	0x15383
+	.4byte	0x154a3
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14932
-	.8byte	.LBB1782
-	.8byte	.LBE1782-.LBB1782
+	.4byte	0x14a43
+	.8byte	.LBB1808
+	.8byte	.LBE1808-.LBB1808
 	.byte	0x1
-	.2byte	0xb62
+	.2byte	0xb6c
 	.4byte	0xfa8b
 	.uleb128 0x55
-	.4byte	0x1494f
+	.4byte	0x14a60
 	.uleb128 0x55
-	.4byte	0x14943
+	.4byte	0x14a54
 	.uleb128 0x5e
-	.4byte	0x1495c
-	.8byte	.LBB1783
-	.8byte	.LBE1783-.LBB1783
+	.4byte	0x14a6d
+	.8byte	.LBB1809
+	.8byte	.LBE1809-.LBB1809
 	.byte	0x11
 	.2byte	0x2e7
 	.uleb128 0x55
-	.4byte	0x14979
+	.4byte	0x14a8a
 	.uleb128 0x55
-	.4byte	0x1496d
+	.4byte	0x14a7e
 	.uleb128 0x4f
 	.8byte	.LVL727
-	.4byte	0x1538f
+	.4byte	0x154af
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14932
-	.8byte	.LBB1785
-	.8byte	.LBE1785-.LBB1785
+	.4byte	0x14a43
+	.8byte	.LBB1811
+	.8byte	.LBE1811-.LBB1811
 	.byte	0x1
-	.2byte	0xb70
+	.2byte	0xb7a
 	.4byte	0xfae2
 	.uleb128 0x55
-	.4byte	0x1494f
+	.4byte	0x14a60
 	.uleb128 0x55
-	.4byte	0x14943
+	.4byte	0x14a54
 	.uleb128 0x5e
-	.4byte	0x1495c
-	.8byte	.LBB1786
-	.8byte	.LBE1786-.LBB1786
+	.4byte	0x14a6d
+	.8byte	.LBB1812
+	.8byte	.LBE1812-.LBB1812
 	.byte	0x11
 	.2byte	0x2e7
 	.uleb128 0x55
-	.4byte	0x14979
+	.4byte	0x14a8a
 	.uleb128 0x55
-	.4byte	0x1496d
+	.4byte	0x14a7e
 	.uleb128 0x4f
 	.8byte	.LVL740
-	.4byte	0x1538f
+	.4byte	0x154af
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL692
-	.4byte	0x1539c
+	.4byte	0x154bc
 	.uleb128 0x4f
 	.8byte	.LVL694
-	.4byte	0x1539c
+	.4byte	0x154bc
 	.uleb128 0x4f
 	.8byte	.LVL696
-	.4byte	0x153a8
+	.4byte	0x154c8
 	.uleb128 0x4f
 	.8byte	.LVL701
-	.4byte	0x153a8
+	.4byte	0x154c8
 	.uleb128 0x4f
 	.8byte	.LVL705
-	.4byte	0x15281
+	.4byte	0x153a1
 	.uleb128 0x4f
 	.8byte	.LVL706
-	.4byte	0x153b5
+	.4byte	0x154d5
 	.uleb128 0x4f
 	.8byte	.LVL711
-	.4byte	0x153c1
+	.4byte	0x154e1
 	.uleb128 0x4f
 	.8byte	.LVL712
-	.4byte	0x153c1
+	.4byte	0x154e1
 	.uleb128 0x4f
 	.8byte	.LVL724
-	.4byte	0x153cd
+	.4byte	0x154ed
 	.uleb128 0x4f
 	.8byte	.LVL726
-	.4byte	0x15281
+	.4byte	0x153a1
 	.uleb128 0x4f
 	.8byte	.LVL731
-	.4byte	0x153d9
+	.4byte	0x154f9
 	.uleb128 0x4f
 	.8byte	.LVL734
-	.4byte	0x15377
+	.4byte	0x15497
 	.uleb128 0x4f
 	.8byte	.LVL736
-	.4byte	0x153d9
+	.4byte	0x154f9
 	.uleb128 0x4f
 	.8byte	.LVL737
-	.4byte	0x15383
+	.4byte	0x154a3
 	.uleb128 0x4f
 	.8byte	.LVL739
-	.4byte	0x15281
+	.4byte	0x153a1
 	.uleb128 0x4f
 	.8byte	.LVL743
-	.4byte	0x153d9
+	.4byte	0x154f9
 	.uleb128 0x4f
 	.8byte	.LVL746
-	.4byte	0x15377
+	.4byte	0x15497
 	.uleb128 0x4f
 	.8byte	.LVL748
-	.4byte	0x153d9
+	.4byte	0x154f9
 	.uleb128 0x4f
 	.8byte	.LVL749
-	.4byte	0x15383
+	.4byte	0x154a3
 	.uleb128 0x4f
 	.8byte	.LVL774
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL777
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a06
-	.8byte	.LBB1791
-	.8byte	.LBE1791-.LBB1791
+	.4byte	0x14b17
+	.8byte	.LBB1817
+	.8byte	.LBE1817-.LBB1817
 	.byte	0x1
-	.2byte	0xc1f
+	.2byte	0xc29
 	.4byte	0xfc3e
 	.uleb128 0x55
-	.4byte	0x14a1f
+	.4byte	0x14b30
 	.uleb128 0x55
-	.4byte	0x14a13
+	.4byte	0x14b24
 	.uleb128 0x5d
-	.4byte	0x14b0e
-	.8byte	.LBB1792
-	.8byte	.LBE1792-.LBB1792
+	.4byte	0x14c1f
+	.8byte	.LBB1818
+	.8byte	.LBE1818-.LBB1818
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x55
-	.4byte	0x14b27
+	.4byte	0x14c38
 	.uleb128 0x55
-	.4byte	0x14b1b
+	.4byte	0x14c2c
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0xffa7
-	.8byte	.LBB1794
-	.8byte	.LBE1794-.LBB1794
+	.8byte	.LBB1820
+	.8byte	.LBE1820-.LBB1820
 	.byte	0x1
-	.2byte	0xc22
+	.2byte	0xc2c
 	.4byte	0xfcd5
 	.uleb128 0x55
 	.4byte	0xffb8
 	.uleb128 0x4f
 	.8byte	.LVL713
-	.4byte	0x153e3
+	.4byte	0x15503
 	.uleb128 0x4f
 	.8byte	.LVL714
-	.4byte	0x153e3
+	.4byte	0x15503
 	.uleb128 0x4f
 	.8byte	.LVL715
-	.4byte	0x153ef
+	.4byte	0x1550f
 	.uleb128 0x4f
 	.8byte	.LVL716
-	.4byte	0x153ef
+	.4byte	0x1550f
 	.uleb128 0x4f
 	.8byte	.LVL717
-	.4byte	0x153ef
+	.4byte	0x1550f
 	.uleb128 0x4f
 	.8byte	.LVL718
-	.4byte	0x153ef
+	.4byte	0x1550f
 	.uleb128 0x4f
 	.8byte	.LVL719
-	.4byte	0x153ef
+	.4byte	0x1550f
 	.uleb128 0x4f
 	.8byte	.LVL720
-	.4byte	0x153ef
+	.4byte	0x1550f
 	.uleb128 0x4f
 	.8byte	.LVL721
-	.4byte	0x153ef
+	.4byte	0x1550f
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL599
-	.4byte	0x152b4
+	.4byte	0x153d4
 	.uleb128 0x4f
 	.8byte	.LVL600
-	.4byte	0x153fc
+	.4byte	0x1551c
 	.uleb128 0x4f
 	.8byte	.LVL602
-	.4byte	0x15408
+	.4byte	0x15528
 	.uleb128 0x4f
 	.8byte	.LVL608
-	.4byte	0x15415
+	.4byte	0x15535
 	.uleb128 0x4f
 	.8byte	.LVL611
-	.4byte	0x15422
+	.4byte	0x15542
 	.uleb128 0x4f
 	.8byte	.LVL612
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL620
-	.4byte	0x15281
+	.4byte	0x153a1
 	.uleb128 0x4f
 	.8byte	.LVL654
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL656
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL659
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL661
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL664
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL722
-	.4byte	0x15281
+	.4byte	0x153a1
 	.uleb128 0x4f
 	.8byte	.LVL752
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL760
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL765
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL779
-	.4byte	0x1542f
+	.4byte	0x1554f
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0xb50
+	.2byte	0xb5a
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfe55
 	.uleb128 0x65
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xb50
+	.2byte	0xb5a
 	.4byte	0xe557
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xb50
+	.2byte	0xb5a
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xb52
+	.2byte	0xb5c
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0xb53
+	.2byte	0xb5d
 	.4byte	0x6d
 	.uleb128 0x48
 	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0xb54
+	.2byte	0xb5e
 	.4byte	0x6d
 	.uleb128 0x48
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0xb55
+	.2byte	0xb5f
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0xb56
+	.2byte	0xb60
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0xb57
+	.2byte	0xb61
 	.4byte	0x21e
 	.uleb128 0x48
 	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0xb58
+	.2byte	0xb62
 	.4byte	0x21e
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xb59
+	.2byte	0xb63
 	.4byte	0xe4f2
 	.uleb128 0x48
 	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0xb5a
+	.2byte	0xb64
 	.4byte	0x458
 	.uleb128 0x48
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0xb5b
+	.2byte	0xb65
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0xb39
+	.2byte	0xb43
 	.byte	0x1
 	.4byte	0xfe6f
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xb39
+	.2byte	0xb43
 	.4byte	0xe874
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0xb1d
+	.2byte	0xb27
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfea7
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xb1d
+	.2byte	0xb27
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF2480
 	.byte	0x1
-	.2byte	0xb1f
+	.2byte	0xb29
 	.4byte	0xd88a
 	.uleb128 0x68
 	.uleb128 0x53
 	.string	"__k"
 	.byte	0x1
-	.2byte	0xb2e
+	.2byte	0xb38
 	.4byte	0x2f05
 	.byte	0
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0xade
+	.2byte	0xae8
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xff21
 	.uleb128 0x65
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xade
+	.2byte	0xae8
 	.4byte	0xe557
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xae0
+	.2byte	0xaea
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xae1
+	.2byte	0xaeb
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xae2
+	.2byte	0xaec
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0xae3
+	.2byte	0xaed
 	.4byte	0xb904
 	.uleb128 0x53
 	.string	"r"
 	.byte	0x1
-	.2byte	0xae4
+	.2byte	0xaee
 	.4byte	0x97bc
 	.uleb128 0x48
 	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0xae5
+	.2byte	0xaef
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xae6
+	.2byte	0xaf0
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0xae6
+	.2byte	0xaf0
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0xab2
+	.2byte	0xabc
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xff92
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xab2
+	.2byte	0xabc
 	.4byte	0xe874
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xab4
+	.2byte	0xabe
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xab5
+	.2byte	0xabf
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0xab6
+	.2byte	0xac0
 	.4byte	0xb904
 	.uleb128 0x53
 	.string	"r"
 	.byte	0x1
-	.2byte	0xab7
+	.2byte	0xac1
 	.4byte	0x97bc
 	.uleb128 0x48
 	.4byte	.LASF2982
 	.byte	0x1
-	.2byte	0xab8
+	.2byte	0xac2
 	.4byte	0x29
 	.uleb128 0x48
 	.4byte	.LASF2983
 	.byte	0x1
-	.2byte	0xab9
+	.2byte	0xac3
 	.4byte	0xc6
 	.uleb128 0x69
 	.4byte	.LASF3050
@@ -42280,20 +42368,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x64
 	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0xaa2
+	.2byte	0xaac
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xffc5
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xaa2
+	.2byte	0xaac
 	.4byte	0xe874
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0xa99
+	.2byte	0xaa3
 	.4byte	0x2ee
 	.8byte	.LFB2855
 	.8byte	.LFE2855-.LFB2855
@@ -42303,29 +42391,29 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa99
+	.2byte	0xaa3
 	.4byte	0xa5e0
 	.4byte	.LLST78
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa9a
+	.2byte	0xaa4
 	.4byte	0xb45b
 	.4byte	.LLST79
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa9b
+	.2byte	0xaa5
 	.4byte	0x21e
 	.4byte	.LLST80
 	.uleb128 0x4f
 	.8byte	.LVL309
-	.4byte	0x15439
+	.4byte	0x15559
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0xa90
+	.2byte	0xa9a
 	.4byte	0x2ee
 	.8byte	.LFB2854
 	.8byte	.LFE2854-.LFB2854
@@ -42335,29 +42423,29 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa90
+	.2byte	0xa9a
 	.4byte	0xa5e0
 	.4byte	.LLST81
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa91
+	.2byte	0xa9b
 	.4byte	0xb45b
 	.4byte	.LLST82
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa92
+	.2byte	0xa9c
 	.4byte	0x21e
 	.4byte	.LLST83
 	.uleb128 0x4f
 	.8byte	.LVL314
-	.4byte	0x15445
+	.4byte	0x15565
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0xa87
+	.2byte	0xa91
 	.4byte	0x2ee
 	.8byte	.LFB2853
 	.8byte	.LFE2853-.LFB2853
@@ -42367,29 +42455,29 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa87
+	.2byte	0xa91
 	.4byte	0xa5e0
 	.4byte	.LLST84
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa88
+	.2byte	0xa92
 	.4byte	0xb45b
 	.4byte	.LLST85
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa89
+	.2byte	0xa93
 	.4byte	0x21e
 	.4byte	.LLST86
 	.uleb128 0x4f
 	.8byte	.LVL319
-	.4byte	0x15445
+	.4byte	0x15565
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0xa6f
+	.2byte	0xa79
 	.4byte	0x2ee
 	.8byte	.LFB2852
 	.8byte	.LFE2852-.LFB2852
@@ -42399,64 +42487,64 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa6f
+	.2byte	0xa79
 	.4byte	0xa5e0
 	.4byte	.LLST96
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa70
+	.2byte	0xa7a
 	.4byte	0xb45b
 	.4byte	.LLST97
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa71
+	.2byte	0xa7b
 	.4byte	0x56
 	.4byte	.LLST98
 	.uleb128 0x59
 	.4byte	.LASF383
 	.byte	0x1
-	.2byte	0xa71
+	.2byte	0xa7b
 	.4byte	0x2e3
 	.4byte	.LLST99
 	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa73
+	.2byte	0xa7d
 	.4byte	0xe557
 	.4byte	.LLST100
 	.uleb128 0x5a
 	.4byte	.LASF2470
 	.byte	0x1
-	.2byte	0xa74
+	.2byte	0xa7e
 	.4byte	0xc6
 	.4byte	.LLST101
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xa74
+	.2byte	0xa7e
 	.4byte	0xc6
 	.uleb128 0x4f
 	.8byte	.LVL345
-	.4byte	0x15452
+	.4byte	0x15572
 	.uleb128 0x4f
 	.8byte	.LVL347
-	.4byte	0x1545f
+	.4byte	0x1557f
 	.uleb128 0x4f
 	.8byte	.LVL352
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL355
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL356
-	.4byte	0x1542f
+	.4byte	0x1554f
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0xa63
+	.2byte	0xa6d
 	.4byte	0x2ee
 	.8byte	.LFB2851
 	.8byte	.LFE2851-.LFB2851
@@ -42466,49 +42554,49 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa63
+	.2byte	0xa6d
 	.4byte	0xa5e0
 	.4byte	.LLST87
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa64
+	.2byte	0xa6e
 	.4byte	0xb45b
 	.4byte	.LLST88
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa65
+	.2byte	0xa6f
 	.4byte	0x21e
 	.4byte	.LLST89
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa67
+	.2byte	0xa71
 	.4byte	0xe557
 	.uleb128 0x48
 	.4byte	.LASF2470
 	.byte	0x1
-	.2byte	0xa68
+	.2byte	0xa72
 	.4byte	0xc6
 	.uleb128 0x54
-	.4byte	0x146b9
-	.8byte	.LBB1234
-	.8byte	.LBE1234-.LBB1234
+	.4byte	0x147c0
+	.8byte	.LBB1260
+	.8byte	.LBE1260-.LBB1260
 	.byte	0x1
-	.2byte	0xa6a
+	.2byte	0xa74
 	.4byte	0x10241
 	.uleb128 0x55
-	.4byte	0x146c9
+	.4byte	0x147d0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL324
-	.4byte	0x15445
+	.4byte	0x15565
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0xa55
+	.2byte	0xa5f
 	.4byte	0x2ee
 	.8byte	.LFB2850
 	.8byte	.LFE2850-.LFB2850
@@ -42518,57 +42606,57 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa55
+	.2byte	0xa5f
 	.4byte	0xa5e0
 	.4byte	.LLST90
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa56
+	.2byte	0xa60
 	.4byte	0xb45b
 	.4byte	.LLST91
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa57
+	.2byte	0xa61
 	.4byte	0x21e
 	.4byte	.LLST92
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa59
+	.2byte	0xa63
 	.4byte	0xe557
 	.uleb128 0x6a
 	.string	"t"
 	.byte	0x1
-	.2byte	0xa5a
+	.2byte	0xa64
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x5c
-	.4byte	0x146d6
-	.8byte	.LBB1236
+	.4byte	0x147dd
+	.8byte	.LBB1262
 	.4byte	.Ldebug_ranges0+0x6a0
 	.byte	0x1
-	.2byte	0xa5c
+	.2byte	0xa66
 	.4byte	0x102dd
 	.uleb128 0x55
-	.4byte	0x146f2
+	.4byte	0x147f9
 	.uleb128 0x55
-	.4byte	0x146e6
+	.4byte	0x147ed
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL331
-	.4byte	0x15445
+	.4byte	0x15565
 	.uleb128 0x4f
 	.8byte	.LVL334
-	.4byte	0x1542f
+	.4byte	0x1554f
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0xa4a
+	.2byte	0xa54
 	.4byte	0x2ee
 	.8byte	.LFB2849
 	.8byte	.LFE2849-.LFB2849
@@ -42578,34 +42666,34 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa4a
+	.2byte	0xa54
 	.4byte	0xa5e0
 	.4byte	.LLST93
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa4b
+	.2byte	0xa55
 	.4byte	0xb45b
 	.4byte	.LLST94
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa4c
+	.2byte	0xa56
 	.4byte	0x21e
 	.4byte	.LLST95
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa4e
+	.2byte	0xa58
 	.4byte	0xe557
 	.uleb128 0x4f
 	.8byte	.LVL339
-	.4byte	0x15445
+	.4byte	0x15565
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0xa3f
+	.2byte	0xa49
 	.4byte	0x2ee
 	.8byte	.LFB2848
 	.8byte	.LFE2848-.LFB2848
@@ -42615,55 +42703,55 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa3f
+	.2byte	0xa49
 	.4byte	0xa5e0
 	.4byte	.LLST102
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa40
+	.2byte	0xa4a
 	.4byte	0xb45b
 	.4byte	.LLST103
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa41
+	.2byte	0xa4b
 	.4byte	0x21e
 	.4byte	.LLST104
 	.uleb128 0x48
 	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0xa43
+	.2byte	0xa4d
 	.4byte	0x56
 	.uleb128 0x4f
 	.8byte	.LVL358
-	.4byte	0x1546b
+	.4byte	0x1558b
 	.uleb128 0x4f
 	.8byte	.LVL359
-	.4byte	0x15445
+	.4byte	0x15565
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0xa2c
+	.2byte	0xa36
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x10407
 	.uleb128 0x66
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0xa2c
+	.2byte	0xa36
 	.4byte	0x1c7f
 	.uleb128 0x66
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0xa2c
+	.2byte	0xa36
 	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0xa1c
+	.2byte	0xa26
 	.4byte	0xc6
 	.8byte	.LFB2846
 	.8byte	.LFE2846-.LFB2846
@@ -42673,50 +42761,50 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0xa1c
+	.2byte	0xa26
 	.4byte	0x55cc
 	.4byte	.LLST16
 	.uleb128 0x52
 	.string	"vma"
 	.byte	0x1
-	.2byte	0xa1c
+	.2byte	0xa26
 	.4byte	0x3d25
 	.4byte	.LLST17
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xa1e
+	.2byte	0xa28
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF898
 	.byte	0x1
-	.2byte	0xa1f
+	.2byte	0xa29
 	.4byte	0x29
 	.uleb128 0x4f
 	.8byte	.LVL82
-	.4byte	0x15477
+	.4byte	0x15597
 	.byte	0
 	.uleb128 0x6b
 	.4byte	.LASF3085
 	.byte	0x1
-	.2byte	0xa05
+	.2byte	0xa0f
 	.4byte	0xc6
 	.4byte	0x10498
 	.uleb128 0x66
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0xa05
+	.2byte	0xa0f
 	.4byte	0x1c7f
 	.uleb128 0x66
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0xa05
+	.2byte	0xa0f
 	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0x9f6
+	.2byte	0xa00
 	.4byte	0xc6
 	.8byte	.LFB2844
 	.8byte	.LFE2844-.LFB2844
@@ -42726,31 +42814,31 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x9f6
+	.2byte	0xa00
 	.4byte	0x55cc
 	.4byte	.LLST14
 	.uleb128 0x52
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x9f6
+	.2byte	0xa00
 	.4byte	0x3d25
 	.4byte	.LLST15
 	.uleb128 0x48
 	.4byte	.LASF898
 	.byte	0x1
-	.2byte	0x9f8
+	.2byte	0xa02
 	.4byte	0x29
 	.uleb128 0x4f
 	.8byte	.LVL76
-	.4byte	0x15484
+	.4byte	0x155a4
 	.uleb128 0x4f
 	.8byte	.LVL77
-	.4byte	0x15477
+	.4byte	0x15597
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3087
 	.byte	0x1
-	.2byte	0x92a
+	.2byte	0x934
 	.4byte	0x199
 	.8byte	.LFB2843
 	.8byte	.LFE2843-.LFB2843
@@ -42760,40 +42848,40 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x92a
+	.2byte	0x934
 	.4byte	0x55cc
 	.4byte	.LLST18
 	.uleb128 0x52
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0x92a
+	.2byte	0x934
 	.4byte	0x6d
 	.4byte	.LLST19
 	.uleb128 0x52
 	.string	"arg"
 	.byte	0x1
-	.2byte	0x92a
+	.2byte	0x934
 	.4byte	0x29
 	.4byte	.LLST20
 	.uleb128 0x48
 	.4byte	.LASF3088
 	.byte	0x1
-	.2byte	0x92c
+	.2byte	0x936
 	.4byte	0x458
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x92d
+	.2byte	0x937
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x92e
+	.2byte	0x938
 	.4byte	0xe874
 	.uleb128 0x4d
 	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x92f
+	.2byte	0x939
 	.4byte	0xda8e
 	.uleb128 0x2
 	.byte	0x91
@@ -42801,48 +42889,48 @@ __exitcall_ebc_exit:
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x930
+	.2byte	0x93a
 	.4byte	0xe4f2
 	.uleb128 0x48
 	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x931
+	.2byte	0x93b
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x932
+	.2byte	0x93c
 	.4byte	0x29
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x933
+	.2byte	0x93d
 	.4byte	0xc6
 	.uleb128 0x56
 	.4byte	.LASF3050
 	.4byte	0x117b9
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35218
+	.8byte	__func__.35231
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x1a0
 	.4byte	0x1066b
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x97f
+	.2byte	0x989
 	.4byte	0xc6
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1a0
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x97f
+	.2byte	0x989
 	.8byte	.L216
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x97f
+	.2byte	0x989
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -42850,191 +42938,191 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x97f
+	.2byte	0x989
 	.4byte	0x199
 	.uleb128 0x6d
-	.8byte	.LBB1026
-	.8byte	.LBE1026-.LBB1026
+	.8byte	.LBB1052
+	.8byte	.LBE1052-.LBB1052
 	.4byte	0x1064f
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x97f
+	.2byte	0x989
 	.4byte	0x199
 	.4byte	.LLST35
 	.uleb128 0x4f
 	.8byte	.LVL127
-	.4byte	0x15490
+	.4byte	0x155b0
 	.uleb128 0x4f
 	.8byte	.LVL128
-	.4byte	0x1549c
+	.4byte	0x155bc
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL125
-	.4byte	0x154a9
+	.4byte	0x155c9
 	.uleb128 0x4f
 	.8byte	.LVL129
-	.4byte	0x154b5
+	.4byte	0x155d5
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x147e7
-	.8byte	.LBB962
+	.4byte	0x148ef
+	.8byte	.LBB988
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x9e8
+	.2byte	0x9f2
 	.4byte	0x1088b
 	.uleb128 0x55
-	.4byte	0x1480d
+	.4byte	0x14916
 	.uleb128 0x55
-	.4byte	0x14801
+	.4byte	0x1490a
 	.uleb128 0x55
-	.4byte	0x147f7
+	.4byte	0x148ff
 	.uleb128 0x6e
-	.4byte	0x14847
-	.8byte	.LBB963
+	.4byte	0x14953
+	.8byte	.LBB989
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1486d
+	.4byte	0x1497a
 	.uleb128 0x55
-	.4byte	0x14861
+	.4byte	0x1496e
 	.uleb128 0x55
-	.4byte	0x14857
+	.4byte	0x14963
 	.uleb128 0x6f
-	.4byte	0x148e6
-	.8byte	.LBB965
+	.4byte	0x149f7
+	.8byte	.LBB991
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x107c1
 	.uleb128 0x55
-	.4byte	0x14902
+	.4byte	0x14a13
 	.uleb128 0x70
-	.4byte	0x148f6
+	.4byte	0x14a07
 	.4byte	.LLST21
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x80
 	.uleb128 0x61
-	.4byte	0x1490e
+	.4byte	0x14a1f
 	.4byte	.LLST22
 	.uleb128 0x61
-	.4byte	0x14919
+	.4byte	0x14a2a
 	.4byte	.LLST23
 	.uleb128 0x71
-	.4byte	0x14d31
-	.8byte	.LBB967
-	.8byte	.LBE967-.LBB967
+	.4byte	0x14e47
+	.8byte	.LBB993
+	.8byte	.LBE993-.LBB993
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10727
 	.uleb128 0x57
-	.8byte	.LBB968
-	.8byte	.LBE968-.LBB968
+	.8byte	.LBB994
+	.8byte	.LBE994-.LBB994
 	.uleb128 0x61
-	.4byte	0x14d41
+	.4byte	0x14e57
 	.4byte	.LLST24
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14d04
-	.8byte	.LBB969
-	.8byte	.LBE969-.LBB969
+	.4byte	0x14e19
+	.8byte	.LBB995
+	.8byte	.LBE995-.LBB995
 	.byte	0x6
 	.byte	0x55
 	.4byte	0x1076f
 	.uleb128 0x55
-	.4byte	0x14d1e
+	.4byte	0x14e34
 	.uleb128 0x55
-	.4byte	0x14d14
+	.4byte	0x14e29
 	.uleb128 0x5d
-	.4byte	0x14e41
-	.8byte	.LBB970
-	.8byte	.LBE970-.LBB970
+	.4byte	0x14f5b
+	.8byte	.LBB996
+	.8byte	.LBE996-.LBB996
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14e5b
+	.4byte	0x14f76
 	.uleb128 0x55
-	.4byte	0x14e51
+	.4byte	0x14f6b
 	.byte	0
 	.byte	0
 	.uleb128 0x57
-	.8byte	.LBB972
-	.8byte	.LBE972-.LBB972
+	.8byte	.LBB998
+	.8byte	.LBE998-.LBB998
 	.uleb128 0x58
-	.4byte	0x14925
+	.4byte	0x14a36
 	.uleb128 0x5d
-	.4byte	0x14db7
-	.8byte	.LBB973
-	.8byte	.LBE973-.LBB973
+	.4byte	0x14ece
+	.8byte	.LBB999
+	.8byte	.LBE999-.LBB999
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14dd3
+	.4byte	0x14eea
 	.uleb128 0x55
-	.4byte	0x14dc7
+	.4byte	0x14ede
 	.uleb128 0x57
-	.8byte	.LBB974
-	.8byte	.LBE974-.LBB974
+	.8byte	.LBB1000
+	.8byte	.LBE1000-.LBB1000
 	.uleb128 0x58
-	.4byte	0x14ddf
+	.4byte	0x14ef6
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x148b2
-	.8byte	.LBB979
-	.8byte	.LBE979-.LBB979
+	.4byte	0x149c2
+	.8byte	.LBB1005
+	.8byte	.LBE1005-.LBB1005
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x1087c
 	.uleb128 0x55
-	.4byte	0x148c2
+	.4byte	0x149d2
 	.uleb128 0x57
-	.8byte	.LBB980
-	.8byte	.LBE980-.LBB980
+	.8byte	.LBB1006
+	.8byte	.LBE1006-.LBB1006
 	.uleb128 0x61
-	.4byte	0x148cd
+	.4byte	0x149de
 	.4byte	.LLST25
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0xc0
 	.4byte	0x10847
 	.uleb128 0x61
-	.4byte	0x148d9
+	.4byte	0x149ea
 	.4byte	.LLST26
 	.uleb128 0x5d
-	.4byte	0x14db7
-	.8byte	.LBB982
-	.8byte	.LBE982-.LBB982
+	.4byte	0x14ece
+	.8byte	.LBB1008
+	.8byte	.LBE1008-.LBB1008
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14dd3
+	.4byte	0x14eea
 	.uleb128 0x55
-	.4byte	0x14dc7
+	.4byte	0x14ede
 	.uleb128 0x57
-	.8byte	.LBB983
-	.8byte	.LBE983-.LBB983
+	.8byte	.LBB1009
+	.8byte	.LBE1009-.LBB1009
 	.uleb128 0x58
-	.4byte	0x14ddf
+	.4byte	0x14ef6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d31
-	.8byte	.LBB984
-	.8byte	.LBE984-.LBB984
+	.4byte	0x14e47
+	.8byte	.LBB1010
+	.8byte	.LBE1010-.LBB1010
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB985
-	.8byte	.LBE985-.LBB985
+	.8byte	.LBB1011
+	.8byte	.LBE1011-.LBB1011
 	.uleb128 0x61
-	.4byte	0x14d41
+	.4byte	0x14e57
 	.4byte	.LLST27
 	.byte	0
 	.byte	0
@@ -43042,171 +43130,171 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL155
-	.4byte	0x154c2
+	.4byte	0x155e2
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14817
-	.8byte	.LBB995
+	.4byte	0x14921
+	.8byte	.LBB1021
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
-	.2byte	0x96a
+	.2byte	0x974
 	.4byte	0x10ab6
 	.uleb128 0x55
-	.4byte	0x1483d
+	.4byte	0x14948
 	.uleb128 0x55
-	.4byte	0x14831
+	.4byte	0x1493c
 	.uleb128 0x55
-	.4byte	0x14827
+	.4byte	0x14931
 	.uleb128 0x6e
-	.4byte	0x14877
-	.8byte	.LBB996
+	.4byte	0x14985
+	.8byte	.LBB1022
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x1489d
+	.4byte	0x149ac
 	.uleb128 0x55
-	.4byte	0x14891
+	.4byte	0x149a0
 	.uleb128 0x55
-	.4byte	0x14887
+	.4byte	0x14995
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x58
-	.4byte	0x148a6
+	.4byte	0x149b6
 	.uleb128 0x6f
-	.4byte	0x148e6
-	.8byte	.LBB998
+	.4byte	0x149f7
+	.8byte	.LBB1024
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x109eb
 	.uleb128 0x55
-	.4byte	0x14902
+	.4byte	0x14a13
 	.uleb128 0x70
-	.4byte	0x148f6
+	.4byte	0x14a07
 	.4byte	.LLST28
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x130
 	.uleb128 0x61
-	.4byte	0x1490e
+	.4byte	0x14a1f
 	.4byte	.LLST29
 	.uleb128 0x61
-	.4byte	0x14919
+	.4byte	0x14a2a
 	.4byte	.LLST30
 	.uleb128 0x71
-	.4byte	0x14d31
-	.8byte	.LBB1000
-	.8byte	.LBE1000-.LBB1000
+	.4byte	0x14e47
+	.8byte	.LBB1026
+	.8byte	.LBE1026-.LBB1026
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10951
 	.uleb128 0x57
-	.8byte	.LBB1001
-	.8byte	.LBE1001-.LBB1001
+	.8byte	.LBB1027
+	.8byte	.LBE1027-.LBB1027
 	.uleb128 0x61
-	.4byte	0x14d41
+	.4byte	0x14e57
 	.4byte	.LLST31
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1002
-	.8byte	.LBE1002-.LBB1002
+	.8byte	.LBB1028
+	.8byte	.LBE1028-.LBB1028
 	.4byte	0x109a5
 	.uleb128 0x58
-	.4byte	0x14925
+	.4byte	0x14a36
 	.uleb128 0x5d
-	.4byte	0x14db7
-	.8byte	.LBB1003
-	.8byte	.LBE1003-.LBB1003
+	.4byte	0x14ece
+	.8byte	.LBB1029
+	.8byte	.LBE1029-.LBB1029
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14dd3
+	.4byte	0x14eea
 	.uleb128 0x55
-	.4byte	0x14dc7
+	.4byte	0x14ede
 	.uleb128 0x57
-	.8byte	.LBB1004
-	.8byte	.LBE1004-.LBB1004
+	.8byte	.LBB1030
+	.8byte	.LBE1030-.LBB1030
 	.uleb128 0x58
-	.4byte	0x14ddf
+	.4byte	0x14ef6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d04
-	.8byte	.LBB1005
-	.8byte	.LBE1005-.LBB1005
+	.4byte	0x14e19
+	.8byte	.LBB1031
+	.8byte	.LBE1031-.LBB1031
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14d1e
+	.4byte	0x14e34
 	.uleb128 0x55
-	.4byte	0x14d14
+	.4byte	0x14e29
 	.uleb128 0x5d
-	.4byte	0x14e41
-	.8byte	.LBB1006
-	.8byte	.LBE1006-.LBB1006
+	.4byte	0x14f5b
+	.8byte	.LBB1032
+	.8byte	.LBE1032-.LBB1032
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14e5b
+	.4byte	0x14f76
 	.uleb128 0x55
-	.4byte	0x14e51
+	.4byte	0x14f6b
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x148b2
-	.8byte	.LBB1010
-	.8byte	.LBE1010-.LBB1010
+	.4byte	0x149c2
+	.8byte	.LBB1036
+	.8byte	.LBE1036-.LBB1036
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x10aa6
 	.uleb128 0x55
-	.4byte	0x148c2
+	.4byte	0x149d2
 	.uleb128 0x57
-	.8byte	.LBB1011
-	.8byte	.LBE1011-.LBB1011
+	.8byte	.LBB1037
+	.8byte	.LBE1037-.LBB1037
 	.uleb128 0x61
-	.4byte	0x148cd
+	.4byte	0x149de
 	.4byte	.LLST32
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x170
 	.4byte	0x10a71
 	.uleb128 0x61
-	.4byte	0x148d9
+	.4byte	0x149ea
 	.4byte	.LLST33
 	.uleb128 0x5d
-	.4byte	0x14db7
-	.8byte	.LBB1013
-	.8byte	.LBE1013-.LBB1013
+	.4byte	0x14ece
+	.8byte	.LBB1039
+	.8byte	.LBE1039-.LBB1039
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14dd3
+	.4byte	0x14eea
 	.uleb128 0x55
-	.4byte	0x14dc7
+	.4byte	0x14ede
 	.uleb128 0x57
-	.8byte	.LBB1014
-	.8byte	.LBE1014-.LBB1014
+	.8byte	.LBB1040
+	.8byte	.LBE1040-.LBB1040
 	.uleb128 0x58
-	.4byte	0x14ddf
+	.4byte	0x14ef6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d31
-	.8byte	.LBB1015
-	.8byte	.LBE1015-.LBB1015
+	.4byte	0x14e47
+	.8byte	.LBB1041
+	.8byte	.LBE1041-.LBB1041
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1016
-	.8byte	.LBE1016-.LBB1016
+	.8byte	.LBB1042
+	.8byte	.LBE1042-.LBB1042
 	.uleb128 0x61
-	.4byte	0x14d41
+	.4byte	0x14e57
 	.4byte	.LLST34
 	.byte	0
 	.byte	0
@@ -43214,172 +43302,172 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL120
-	.4byte	0x154cf
+	.4byte	0x155ef
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14817
-	.8byte	.LBB1030
+	.4byte	0x14921
+	.8byte	.LBB1056
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
-	.2byte	0x986
+	.2byte	0x990
 	.4byte	0x10ce1
 	.uleb128 0x55
-	.4byte	0x1483d
+	.4byte	0x14948
 	.uleb128 0x55
-	.4byte	0x14831
+	.4byte	0x1493c
 	.uleb128 0x55
-	.4byte	0x14827
+	.4byte	0x14931
 	.uleb128 0x6e
-	.4byte	0x14877
-	.8byte	.LBB1031
+	.4byte	0x14985
+	.8byte	.LBB1057
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x1489d
+	.4byte	0x149ac
 	.uleb128 0x55
-	.4byte	0x14891
+	.4byte	0x149a0
 	.uleb128 0x55
-	.4byte	0x14887
+	.4byte	0x14995
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1f0
 	.uleb128 0x58
-	.4byte	0x148a6
+	.4byte	0x149b6
 	.uleb128 0x6f
-	.4byte	0x148e6
-	.8byte	.LBB1033
+	.4byte	0x149f7
+	.8byte	.LBB1059
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x10c16
 	.uleb128 0x55
-	.4byte	0x14902
+	.4byte	0x14a13
 	.uleb128 0x70
-	.4byte	0x148f6
+	.4byte	0x14a07
 	.4byte	.LLST36
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x230
 	.uleb128 0x61
-	.4byte	0x1490e
+	.4byte	0x14a1f
 	.4byte	.LLST37
 	.uleb128 0x61
-	.4byte	0x14919
+	.4byte	0x14a2a
 	.4byte	.LLST38
 	.uleb128 0x71
-	.4byte	0x14d31
-	.8byte	.LBB1035
-	.8byte	.LBE1035-.LBB1035
+	.4byte	0x14e47
+	.8byte	.LBB1061
+	.8byte	.LBE1061-.LBB1061
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10b7c
 	.uleb128 0x57
-	.8byte	.LBB1036
-	.8byte	.LBE1036-.LBB1036
+	.8byte	.LBB1062
+	.8byte	.LBE1062-.LBB1062
 	.uleb128 0x61
-	.4byte	0x14d41
+	.4byte	0x14e57
 	.4byte	.LLST39
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1037
-	.8byte	.LBE1037-.LBB1037
+	.8byte	.LBB1063
+	.8byte	.LBE1063-.LBB1063
 	.4byte	0x10bd0
 	.uleb128 0x58
-	.4byte	0x14925
+	.4byte	0x14a36
 	.uleb128 0x5d
-	.4byte	0x14db7
-	.8byte	.LBB1038
-	.8byte	.LBE1038-.LBB1038
+	.4byte	0x14ece
+	.8byte	.LBB1064
+	.8byte	.LBE1064-.LBB1064
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14dd3
+	.4byte	0x14eea
 	.uleb128 0x55
-	.4byte	0x14dc7
+	.4byte	0x14ede
 	.uleb128 0x57
-	.8byte	.LBB1039
-	.8byte	.LBE1039-.LBB1039
+	.8byte	.LBB1065
+	.8byte	.LBE1065-.LBB1065
 	.uleb128 0x58
-	.4byte	0x14ddf
+	.4byte	0x14ef6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d04
-	.8byte	.LBB1040
-	.8byte	.LBE1040-.LBB1040
+	.4byte	0x14e19
+	.8byte	.LBB1066
+	.8byte	.LBE1066-.LBB1066
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14d1e
+	.4byte	0x14e34
 	.uleb128 0x55
-	.4byte	0x14d14
+	.4byte	0x14e29
 	.uleb128 0x5d
-	.4byte	0x14e41
-	.8byte	.LBB1041
-	.8byte	.LBE1041-.LBB1041
+	.4byte	0x14f5b
+	.8byte	.LBB1067
+	.8byte	.LBE1067-.LBB1067
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14e5b
+	.4byte	0x14f76
 	.uleb128 0x55
-	.4byte	0x14e51
+	.4byte	0x14f6b
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x148b2
-	.8byte	.LBB1045
-	.8byte	.LBE1045-.LBB1045
+	.4byte	0x149c2
+	.8byte	.LBB1071
+	.8byte	.LBE1071-.LBB1071
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x10cd1
 	.uleb128 0x55
-	.4byte	0x148c2
+	.4byte	0x149d2
 	.uleb128 0x57
-	.8byte	.LBB1046
-	.8byte	.LBE1046-.LBB1046
+	.8byte	.LBB1072
+	.8byte	.LBE1072-.LBB1072
 	.uleb128 0x61
-	.4byte	0x148cd
+	.4byte	0x149de
 	.4byte	.LLST40
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x270
 	.4byte	0x10c9c
 	.uleb128 0x61
-	.4byte	0x148d9
+	.4byte	0x149ea
 	.4byte	.LLST41
 	.uleb128 0x5d
-	.4byte	0x14db7
-	.8byte	.LBB1048
-	.8byte	.LBE1048-.LBB1048
+	.4byte	0x14ece
+	.8byte	.LBB1074
+	.8byte	.LBE1074-.LBB1074
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14dd3
+	.4byte	0x14eea
 	.uleb128 0x55
-	.4byte	0x14dc7
+	.4byte	0x14ede
 	.uleb128 0x57
-	.8byte	.LBB1049
-	.8byte	.LBE1049-.LBB1049
+	.8byte	.LBB1075
+	.8byte	.LBE1075-.LBB1075
 	.uleb128 0x58
-	.4byte	0x14ddf
+	.4byte	0x14ef6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d31
-	.8byte	.LBB1050
-	.8byte	.LBE1050-.LBB1050
+	.4byte	0x14e47
+	.8byte	.LBB1076
+	.8byte	.LBE1076-.LBB1076
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1051
-	.8byte	.LBE1051-.LBB1051
+	.8byte	.LBB1077
+	.8byte	.LBE1077-.LBB1077
 	.uleb128 0x61
-	.4byte	0x14d41
+	.4byte	0x14e57
 	.4byte	.LLST42
 	.byte	0
 	.byte	0
@@ -43387,168 +43475,168 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL144
-	.4byte	0x154cf
+	.4byte	0x155ef
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x147e7
-	.8byte	.LBB1060
+	.4byte	0x148ef
+	.8byte	.LBB1086
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
-	.2byte	0x953
+	.2byte	0x95d
 	.4byte	0x10f01
 	.uleb128 0x55
-	.4byte	0x1480d
+	.4byte	0x14916
 	.uleb128 0x55
-	.4byte	0x14801
+	.4byte	0x1490a
 	.uleb128 0x55
-	.4byte	0x147f7
+	.4byte	0x148ff
 	.uleb128 0x6e
-	.4byte	0x14847
-	.8byte	.LBB1061
+	.4byte	0x14953
+	.8byte	.LBB1087
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1486d
+	.4byte	0x1497a
 	.uleb128 0x55
-	.4byte	0x14861
+	.4byte	0x1496e
 	.uleb128 0x55
-	.4byte	0x14857
+	.4byte	0x14963
 	.uleb128 0x6f
-	.4byte	0x148e6
-	.8byte	.LBB1063
+	.4byte	0x149f7
+	.8byte	.LBB1089
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x10e37
 	.uleb128 0x55
-	.4byte	0x14902
+	.4byte	0x14a13
 	.uleb128 0x70
-	.4byte	0x148f6
+	.4byte	0x14a07
 	.4byte	.LLST43
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x2f0
 	.uleb128 0x61
-	.4byte	0x1490e
+	.4byte	0x14a1f
 	.4byte	.LLST44
 	.uleb128 0x61
-	.4byte	0x14919
+	.4byte	0x14a2a
 	.4byte	.LLST45
 	.uleb128 0x71
-	.4byte	0x14d31
-	.8byte	.LBB1065
-	.8byte	.LBE1065-.LBB1065
+	.4byte	0x14e47
+	.8byte	.LBB1091
+	.8byte	.LBE1091-.LBB1091
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10d9d
 	.uleb128 0x57
-	.8byte	.LBB1066
-	.8byte	.LBE1066-.LBB1066
+	.8byte	.LBB1092
+	.8byte	.LBE1092-.LBB1092
 	.uleb128 0x61
-	.4byte	0x14d41
+	.4byte	0x14e57
 	.4byte	.LLST46
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1067
-	.8byte	.LBE1067-.LBB1067
+	.8byte	.LBB1093
+	.8byte	.LBE1093-.LBB1093
 	.4byte	0x10df1
 	.uleb128 0x58
-	.4byte	0x14925
+	.4byte	0x14a36
 	.uleb128 0x5d
-	.4byte	0x14db7
-	.8byte	.LBB1068
-	.8byte	.LBE1068-.LBB1068
+	.4byte	0x14ece
+	.8byte	.LBB1094
+	.8byte	.LBE1094-.LBB1094
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14dd3
+	.4byte	0x14eea
 	.uleb128 0x55
-	.4byte	0x14dc7
+	.4byte	0x14ede
 	.uleb128 0x57
-	.8byte	.LBB1069
-	.8byte	.LBE1069-.LBB1069
+	.8byte	.LBB1095
+	.8byte	.LBE1095-.LBB1095
 	.uleb128 0x58
-	.4byte	0x14ddf
+	.4byte	0x14ef6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d04
-	.8byte	.LBB1070
-	.8byte	.LBE1070-.LBB1070
+	.4byte	0x14e19
+	.8byte	.LBB1096
+	.8byte	.LBE1096-.LBB1096
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14d1e
+	.4byte	0x14e34
 	.uleb128 0x55
-	.4byte	0x14d14
+	.4byte	0x14e29
 	.uleb128 0x5d
-	.4byte	0x14e41
-	.8byte	.LBB1071
-	.8byte	.LBE1071-.LBB1071
+	.4byte	0x14f5b
+	.8byte	.LBB1097
+	.8byte	.LBE1097-.LBB1097
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14e5b
+	.4byte	0x14f76
 	.uleb128 0x55
-	.4byte	0x14e51
+	.4byte	0x14f6b
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x148b2
-	.8byte	.LBB1077
-	.8byte	.LBE1077-.LBB1077
+	.4byte	0x149c2
+	.8byte	.LBB1103
+	.8byte	.LBE1103-.LBB1103
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x10ef2
 	.uleb128 0x55
-	.4byte	0x148c2
+	.4byte	0x149d2
 	.uleb128 0x57
-	.8byte	.LBB1078
-	.8byte	.LBE1078-.LBB1078
+	.8byte	.LBB1104
+	.8byte	.LBE1104-.LBB1104
 	.uleb128 0x61
-	.4byte	0x148cd
+	.4byte	0x149de
 	.4byte	.LLST47
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x340
 	.4byte	0x10ebd
 	.uleb128 0x61
-	.4byte	0x148d9
+	.4byte	0x149ea
 	.4byte	.LLST48
 	.uleb128 0x5d
-	.4byte	0x14db7
-	.8byte	.LBB1080
-	.8byte	.LBE1080-.LBB1080
+	.4byte	0x14ece
+	.8byte	.LBB1106
+	.8byte	.LBE1106-.LBB1106
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14dd3
+	.4byte	0x14eea
 	.uleb128 0x55
-	.4byte	0x14dc7
+	.4byte	0x14ede
 	.uleb128 0x57
-	.8byte	.LBB1081
-	.8byte	.LBE1081-.LBB1081
+	.8byte	.LBB1107
+	.8byte	.LBE1107-.LBB1107
 	.uleb128 0x58
-	.4byte	0x14ddf
+	.4byte	0x14ef6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d31
-	.8byte	.LBB1082
-	.8byte	.LBE1082-.LBB1082
+	.4byte	0x14e47
+	.8byte	.LBB1108
+	.8byte	.LBE1108-.LBB1108
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1083
-	.8byte	.LBE1083-.LBB1083
+	.8byte	.LBB1109
+	.8byte	.LBE1109-.LBB1109
 	.uleb128 0x61
-	.4byte	0x14d41
+	.4byte	0x14e57
 	.4byte	.LLST49
 	.byte	0
 	.byte	0
@@ -43556,172 +43644,172 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL171
-	.4byte	0x154c2
+	.4byte	0x155e2
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14817
-	.8byte	.LBB1094
+	.4byte	0x14921
+	.8byte	.LBB1120
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
-	.2byte	0x9a3
+	.2byte	0x9ad
 	.4byte	0x1113d
 	.uleb128 0x55
-	.4byte	0x1483d
+	.4byte	0x14948
 	.uleb128 0x55
-	.4byte	0x14831
+	.4byte	0x1493c
 	.uleb128 0x55
-	.4byte	0x14827
+	.4byte	0x14931
 	.uleb128 0x6e
-	.4byte	0x14877
-	.8byte	.LBB1095
+	.4byte	0x14985
+	.8byte	.LBB1121
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x1489d
+	.4byte	0x149ac
 	.uleb128 0x55
-	.4byte	0x14891
+	.4byte	0x149a0
 	.uleb128 0x55
-	.4byte	0x14887
+	.4byte	0x14995
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x370
 	.uleb128 0x61
-	.4byte	0x148a6
+	.4byte	0x149b6
 	.4byte	.LLST50
 	.uleb128 0x6f
-	.4byte	0x148e6
-	.8byte	.LBB1097
+	.4byte	0x149f7
+	.8byte	.LBB1123
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x11065
 	.uleb128 0x55
-	.4byte	0x14902
+	.4byte	0x14a13
 	.uleb128 0x70
-	.4byte	0x148f6
+	.4byte	0x14a07
 	.4byte	.LLST51
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x61
-	.4byte	0x1490e
+	.4byte	0x14a1f
 	.4byte	.LLST52
 	.uleb128 0x61
-	.4byte	0x14919
+	.4byte	0x14a2a
 	.4byte	.LLST53
 	.uleb128 0x71
-	.4byte	0x14d31
-	.8byte	.LBB1099
-	.8byte	.LBE1099-.LBB1099
+	.4byte	0x14e47
+	.8byte	.LBB1125
+	.8byte	.LBE1125-.LBB1125
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10fcb
 	.uleb128 0x57
-	.8byte	.LBB1100
-	.8byte	.LBE1100-.LBB1100
+	.8byte	.LBB1126
+	.8byte	.LBE1126-.LBB1126
 	.uleb128 0x61
-	.4byte	0x14d41
+	.4byte	0x14e57
 	.4byte	.LLST54
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1101
-	.8byte	.LBE1101-.LBB1101
+	.8byte	.LBB1127
+	.8byte	.LBE1127-.LBB1127
 	.4byte	0x1101f
 	.uleb128 0x58
-	.4byte	0x14925
+	.4byte	0x14a36
 	.uleb128 0x5d
-	.4byte	0x14db7
-	.8byte	.LBB1102
-	.8byte	.LBE1102-.LBB1102
+	.4byte	0x14ece
+	.8byte	.LBB1128
+	.8byte	.LBE1128-.LBB1128
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14dd3
+	.4byte	0x14eea
 	.uleb128 0x55
-	.4byte	0x14dc7
+	.4byte	0x14ede
 	.uleb128 0x57
-	.8byte	.LBB1103
-	.8byte	.LBE1103-.LBB1103
+	.8byte	.LBB1129
+	.8byte	.LBE1129-.LBB1129
 	.uleb128 0x58
-	.4byte	0x14ddf
+	.4byte	0x14ef6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d04
-	.8byte	.LBB1104
-	.8byte	.LBE1104-.LBB1104
+	.4byte	0x14e19
+	.8byte	.LBB1130
+	.8byte	.LBE1130-.LBB1130
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14d1e
+	.4byte	0x14e34
 	.uleb128 0x55
-	.4byte	0x14d14
+	.4byte	0x14e29
 	.uleb128 0x5d
-	.4byte	0x14e41
-	.8byte	.LBB1105
-	.8byte	.LBE1105-.LBB1105
+	.4byte	0x14f5b
+	.8byte	.LBB1131
+	.8byte	.LBE1131-.LBB1131
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14e5b
+	.4byte	0x14f76
 	.uleb128 0x55
-	.4byte	0x14e51
+	.4byte	0x14f6b
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x148b2
-	.8byte	.LBB1111
-	.8byte	.LBE1111-.LBB1111
+	.4byte	0x149c2
+	.8byte	.LBB1137
+	.8byte	.LBE1137-.LBB1137
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x11120
 	.uleb128 0x55
-	.4byte	0x148c2
+	.4byte	0x149d2
 	.uleb128 0x57
-	.8byte	.LBB1112
-	.8byte	.LBE1112-.LBB1112
+	.8byte	.LBB1138
+	.8byte	.LBE1138-.LBB1138
 	.uleb128 0x61
-	.4byte	0x148cd
+	.4byte	0x149de
 	.4byte	.LLST55
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x420
 	.4byte	0x110eb
 	.uleb128 0x61
-	.4byte	0x148d9
+	.4byte	0x149ea
 	.4byte	.LLST56
 	.uleb128 0x5d
-	.4byte	0x14db7
-	.8byte	.LBB1114
-	.8byte	.LBE1114-.LBB1114
+	.4byte	0x14ece
+	.8byte	.LBB1140
+	.8byte	.LBE1140-.LBB1140
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14dd3
+	.4byte	0x14eea
 	.uleb128 0x55
-	.4byte	0x14dc7
+	.4byte	0x14ede
 	.uleb128 0x57
-	.8byte	.LBB1115
-	.8byte	.LBE1115-.LBB1115
+	.8byte	.LBB1141
+	.8byte	.LBE1141-.LBB1141
 	.uleb128 0x58
-	.4byte	0x14ddf
+	.4byte	0x14ef6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d31
-	.8byte	.LBB1116
-	.8byte	.LBE1116-.LBB1116
+	.4byte	0x14e47
+	.8byte	.LBB1142
+	.8byte	.LBE1142-.LBB1142
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1117
-	.8byte	.LBE1117-.LBB1117
+	.8byte	.LBB1143
+	.8byte	.LBE1143-.LBB1143
 	.uleb128 0x61
-	.4byte	0x14d41
+	.4byte	0x14e57
 	.4byte	.LLST57
 	.byte	0
 	.byte	0
@@ -43729,68 +43817,68 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL183
-	.4byte	0x154cf
+	.4byte	0x155ef
 	.uleb128 0x4f
 	.8byte	.LVL261
-	.4byte	0x152e5
+	.4byte	0x15405
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x147e7
-	.8byte	.LBB1130
+	.4byte	0x148ef
+	.8byte	.LBB1156
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
-	.2byte	0x9c1
+	.2byte	0x9cb
 	.4byte	0x111ef
 	.uleb128 0x55
-	.4byte	0x1480d
+	.4byte	0x14916
 	.uleb128 0x55
-	.4byte	0x14801
+	.4byte	0x1490a
 	.uleb128 0x55
-	.4byte	0x147f7
+	.4byte	0x148ff
 	.uleb128 0x6e
-	.4byte	0x14847
-	.8byte	.LBB1131
+	.4byte	0x14953
+	.8byte	.LBB1157
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1486d
+	.4byte	0x1497a
 	.uleb128 0x55
-	.4byte	0x14861
+	.4byte	0x1496e
 	.uleb128 0x55
-	.4byte	0x14857
+	.4byte	0x14963
 	.uleb128 0x6e
-	.4byte	0x148e6
-	.8byte	.LBB1133
+	.4byte	0x149f7
+	.8byte	.LBB1159
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x55
-	.4byte	0x14902
+	.4byte	0x14a13
 	.uleb128 0x72
-	.4byte	0x148f6
+	.4byte	0x14a07
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x4b0
 	.uleb128 0x58
-	.4byte	0x1490e
+	.4byte	0x14a1f
 	.uleb128 0x61
-	.4byte	0x14919
+	.4byte	0x14a2a
 	.4byte	.LLST58
 	.uleb128 0x5d
-	.4byte	0x14d31
-	.8byte	.LBB1135
-	.8byte	.LBE1135-.LBB1135
+	.4byte	0x14e47
+	.8byte	.LBB1161
+	.8byte	.LBE1161-.LBB1161
 	.byte	0x6
 	.byte	0x4d
 	.uleb128 0x57
-	.8byte	.LBB1136
-	.8byte	.LBE1136-.LBB1136
+	.8byte	.LBB1162
+	.8byte	.LBE1162-.LBB1162
 	.uleb128 0x61
-	.4byte	0x14d41
+	.4byte	0x14e57
 	.4byte	.LLST59
 	.byte	0
 	.byte	0
@@ -43799,163 +43887,163 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x147e7
-	.8byte	.LBB1142
+	.4byte	0x148ef
+	.8byte	.LBB1168
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
-	.2byte	0x9b1
+	.2byte	0x9bb
 	.4byte	0x1140f
 	.uleb128 0x55
-	.4byte	0x1480d
+	.4byte	0x14916
 	.uleb128 0x55
-	.4byte	0x14801
+	.4byte	0x1490a
 	.uleb128 0x55
-	.4byte	0x147f7
+	.4byte	0x148ff
 	.uleb128 0x6e
-	.4byte	0x14847
-	.8byte	.LBB1143
+	.4byte	0x14953
+	.8byte	.LBB1169
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1486d
+	.4byte	0x1497a
 	.uleb128 0x55
-	.4byte	0x14861
+	.4byte	0x1496e
 	.uleb128 0x55
-	.4byte	0x14857
+	.4byte	0x14963
 	.uleb128 0x6f
-	.4byte	0x148e6
-	.8byte	.LBB1145
+	.4byte	0x149f7
+	.8byte	.LBB1171
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x11345
 	.uleb128 0x55
-	.4byte	0x14902
+	.4byte	0x14a13
 	.uleb128 0x70
-	.4byte	0x148f6
+	.4byte	0x14a07
 	.4byte	.LLST60
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x540
 	.uleb128 0x61
-	.4byte	0x1490e
+	.4byte	0x14a1f
 	.4byte	.LLST61
 	.uleb128 0x61
-	.4byte	0x14919
+	.4byte	0x14a2a
 	.4byte	.LLST62
 	.uleb128 0x71
-	.4byte	0x14d31
-	.8byte	.LBB1147
-	.8byte	.LBE1147-.LBB1147
+	.4byte	0x14e47
+	.8byte	.LBB1173
+	.8byte	.LBE1173-.LBB1173
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x112ab
 	.uleb128 0x57
-	.8byte	.LBB1148
-	.8byte	.LBE1148-.LBB1148
+	.8byte	.LBB1174
+	.8byte	.LBE1174-.LBB1174
 	.uleb128 0x61
-	.4byte	0x14d41
+	.4byte	0x14e57
 	.4byte	.LLST63
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1149
-	.8byte	.LBE1149-.LBB1149
+	.8byte	.LBB1175
+	.8byte	.LBE1175-.LBB1175
 	.4byte	0x112ff
 	.uleb128 0x58
-	.4byte	0x14925
+	.4byte	0x14a36
 	.uleb128 0x5d
-	.4byte	0x14db7
-	.8byte	.LBB1150
-	.8byte	.LBE1150-.LBB1150
+	.4byte	0x14ece
+	.8byte	.LBB1176
+	.8byte	.LBE1176-.LBB1176
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14dd3
+	.4byte	0x14eea
 	.uleb128 0x55
-	.4byte	0x14dc7
+	.4byte	0x14ede
 	.uleb128 0x57
-	.8byte	.LBB1151
-	.8byte	.LBE1151-.LBB1151
+	.8byte	.LBB1177
+	.8byte	.LBE1177-.LBB1177
 	.uleb128 0x58
-	.4byte	0x14ddf
+	.4byte	0x14ef6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d04
-	.8byte	.LBB1152
-	.8byte	.LBE1152-.LBB1152
+	.4byte	0x14e19
+	.8byte	.LBB1178
+	.8byte	.LBE1178-.LBB1178
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14d1e
+	.4byte	0x14e34
 	.uleb128 0x55
-	.4byte	0x14d14
+	.4byte	0x14e29
 	.uleb128 0x5d
-	.4byte	0x14e41
-	.8byte	.LBB1153
-	.8byte	.LBE1153-.LBB1153
+	.4byte	0x14f5b
+	.8byte	.LBB1179
+	.8byte	.LBE1179-.LBB1179
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14e5b
+	.4byte	0x14f76
 	.uleb128 0x55
-	.4byte	0x14e51
+	.4byte	0x14f6b
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x148b2
-	.8byte	.LBB1161
-	.8byte	.LBE1161-.LBB1161
+	.4byte	0x149c2
+	.8byte	.LBB1187
+	.8byte	.LBE1187-.LBB1187
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x11400
 	.uleb128 0x55
-	.4byte	0x148c2
+	.4byte	0x149d2
 	.uleb128 0x57
-	.8byte	.LBB1162
-	.8byte	.LBE1162-.LBB1162
+	.8byte	.LBB1188
+	.8byte	.LBE1188-.LBB1188
 	.uleb128 0x61
-	.4byte	0x148cd
+	.4byte	0x149de
 	.4byte	.LLST64
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x590
 	.4byte	0x113cb
 	.uleb128 0x61
-	.4byte	0x148d9
+	.4byte	0x149ea
 	.4byte	.LLST65
 	.uleb128 0x5d
-	.4byte	0x14db7
-	.8byte	.LBB1164
-	.8byte	.LBE1164-.LBB1164
+	.4byte	0x14ece
+	.8byte	.LBB1190
+	.8byte	.LBE1190-.LBB1190
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14dd3
+	.4byte	0x14eea
 	.uleb128 0x55
-	.4byte	0x14dc7
+	.4byte	0x14ede
 	.uleb128 0x57
-	.8byte	.LBB1165
-	.8byte	.LBE1165-.LBB1165
+	.8byte	.LBB1191
+	.8byte	.LBE1191-.LBB1191
 	.uleb128 0x58
-	.4byte	0x14ddf
+	.4byte	0x14ef6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d31
-	.8byte	.LBB1166
-	.8byte	.LBE1166-.LBB1166
+	.4byte	0x14e47
+	.8byte	.LBB1192
+	.8byte	.LBE1192-.LBB1192
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1167
-	.8byte	.LBE1167-.LBB1167
+	.8byte	.LBB1193
+	.8byte	.LBE1193-.LBB1193
 	.uleb128 0x61
-	.4byte	0x14d41
+	.4byte	0x14e57
 	.4byte	.LLST66
 	.byte	0
 	.byte	0
@@ -43963,167 +44051,167 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL244
-	.4byte	0x154c2
+	.4byte	0x155e2
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x147e7
-	.8byte	.LBB1178
+	.4byte	0x148ef
+	.8byte	.LBB1204
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
-	.2byte	0x962
+	.2byte	0x96c
 	.4byte	0x1162f
 	.uleb128 0x55
-	.4byte	0x1480d
+	.4byte	0x14916
 	.uleb128 0x55
-	.4byte	0x14801
+	.4byte	0x1490a
 	.uleb128 0x55
-	.4byte	0x147f7
+	.4byte	0x148ff
 	.uleb128 0x6e
-	.4byte	0x14847
-	.8byte	.LBB1179
+	.4byte	0x14953
+	.8byte	.LBB1205
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1486d
+	.4byte	0x1497a
 	.uleb128 0x55
-	.4byte	0x14861
+	.4byte	0x1496e
 	.uleb128 0x55
-	.4byte	0x14857
+	.4byte	0x14963
 	.uleb128 0x6f
-	.4byte	0x148e6
-	.8byte	.LBB1181
+	.4byte	0x149f7
+	.8byte	.LBB1207
 	.4byte	.Ldebug_ranges0+0x620
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x11565
 	.uleb128 0x55
-	.4byte	0x14902
+	.4byte	0x14a13
 	.uleb128 0x70
-	.4byte	0x148f6
+	.4byte	0x14a07
 	.4byte	.LLST67
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x620
 	.uleb128 0x61
-	.4byte	0x1490e
+	.4byte	0x14a1f
 	.4byte	.LLST68
 	.uleb128 0x61
-	.4byte	0x14919
+	.4byte	0x14a2a
 	.4byte	.LLST69
 	.uleb128 0x71
-	.4byte	0x14d31
-	.8byte	.LBB1183
-	.8byte	.LBE1183-.LBB1183
+	.4byte	0x14e47
+	.8byte	.LBB1209
+	.8byte	.LBE1209-.LBB1209
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x114cb
 	.uleb128 0x57
-	.8byte	.LBB1184
-	.8byte	.LBE1184-.LBB1184
+	.8byte	.LBB1210
+	.8byte	.LBE1210-.LBB1210
 	.uleb128 0x61
-	.4byte	0x14d41
+	.4byte	0x14e57
 	.4byte	.LLST70
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1185
-	.8byte	.LBE1185-.LBB1185
+	.8byte	.LBB1211
+	.8byte	.LBE1211-.LBB1211
 	.4byte	0x1151f
 	.uleb128 0x58
-	.4byte	0x14925
+	.4byte	0x14a36
 	.uleb128 0x5d
-	.4byte	0x14db7
-	.8byte	.LBB1186
-	.8byte	.LBE1186-.LBB1186
+	.4byte	0x14ece
+	.8byte	.LBB1212
+	.8byte	.LBE1212-.LBB1212
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14dd3
+	.4byte	0x14eea
 	.uleb128 0x55
-	.4byte	0x14dc7
+	.4byte	0x14ede
 	.uleb128 0x57
-	.8byte	.LBB1187
-	.8byte	.LBE1187-.LBB1187
+	.8byte	.LBB1213
+	.8byte	.LBE1213-.LBB1213
 	.uleb128 0x58
-	.4byte	0x14ddf
+	.4byte	0x14ef6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d04
-	.8byte	.LBB1188
-	.8byte	.LBE1188-.LBB1188
+	.4byte	0x14e19
+	.8byte	.LBB1214
+	.8byte	.LBE1214-.LBB1214
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14d1e
+	.4byte	0x14e34
 	.uleb128 0x55
-	.4byte	0x14d14
+	.4byte	0x14e29
 	.uleb128 0x5d
-	.4byte	0x14e41
-	.8byte	.LBB1189
-	.8byte	.LBE1189-.LBB1189
+	.4byte	0x14f5b
+	.8byte	.LBB1215
+	.8byte	.LBE1215-.LBB1215
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14e5b
+	.4byte	0x14f76
 	.uleb128 0x55
-	.4byte	0x14e51
+	.4byte	0x14f6b
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x148b2
-	.8byte	.LBB1197
-	.8byte	.LBE1197-.LBB1197
+	.4byte	0x149c2
+	.8byte	.LBB1223
+	.8byte	.LBE1223-.LBB1223
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x11620
 	.uleb128 0x55
-	.4byte	0x148c2
+	.4byte	0x149d2
 	.uleb128 0x57
-	.8byte	.LBB1198
-	.8byte	.LBE1198-.LBB1198
+	.8byte	.LBB1224
+	.8byte	.LBE1224-.LBB1224
 	.uleb128 0x61
-	.4byte	0x148cd
+	.4byte	0x149de
 	.4byte	.LLST71
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x670
 	.4byte	0x115eb
 	.uleb128 0x61
-	.4byte	0x148d9
+	.4byte	0x149ea
 	.4byte	.LLST72
 	.uleb128 0x5d
-	.4byte	0x14db7
-	.8byte	.LBB1200
-	.8byte	.LBE1200-.LBB1200
+	.4byte	0x14ece
+	.8byte	.LBB1226
+	.8byte	.LBE1226-.LBB1226
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14dd3
+	.4byte	0x14eea
 	.uleb128 0x55
-	.4byte	0x14dc7
+	.4byte	0x14ede
 	.uleb128 0x57
-	.8byte	.LBB1201
-	.8byte	.LBE1201-.LBB1201
+	.8byte	.LBB1227
+	.8byte	.LBE1227-.LBB1227
 	.uleb128 0x58
-	.4byte	0x14ddf
+	.4byte	0x14ef6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d31
-	.8byte	.LBB1202
-	.8byte	.LBE1202-.LBB1202
+	.4byte	0x14e47
+	.8byte	.LBB1228
+	.8byte	.LBE1228-.LBB1228
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1203
-	.8byte	.LBE1203-.LBB1203
+	.8byte	.LBB1229
+	.8byte	.LBE1229-.LBB1229
 	.uleb128 0x61
-	.4byte	0x14d41
+	.4byte	0x14e57
 	.4byte	.LLST73
 	.byte	0
 	.byte	0
@@ -44131,96 +44219,96 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL252
-	.4byte	0x154c2
+	.4byte	0x155e2
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL85
-	.4byte	0x15377
+	.4byte	0x15497
 	.uleb128 0x4f
 	.8byte	.LVL86
-	.4byte	0x153d9
+	.4byte	0x154f9
 	.uleb128 0x4f
 	.8byte	.LVL87
-	.4byte	0x15484
+	.4byte	0x155a4
 	.uleb128 0x4f
 	.8byte	.LVL98
-	.4byte	0x154dc
+	.4byte	0x155fc
 	.uleb128 0x4f
 	.8byte	.LVL101
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL104
-	.4byte	0x15281
+	.4byte	0x153a1
 	.uleb128 0x4f
 	.8byte	.LVL121
-	.4byte	0x15484
+	.4byte	0x155a4
 	.uleb128 0x4f
 	.8byte	.LVL122
-	.4byte	0x154e8
+	.4byte	0x15608
 	.uleb128 0x4f
 	.8byte	.LVL124
-	.4byte	0x15383
+	.4byte	0x154a3
 	.uleb128 0x4f
 	.8byte	.LVL131
-	.4byte	0x15377
+	.4byte	0x15497
 	.uleb128 0x4f
 	.8byte	.LVL145
-	.4byte	0x154f4
+	.4byte	0x15614
 	.uleb128 0x4f
 	.8byte	.LVL146
-	.4byte	0x15383
+	.4byte	0x154a3
 	.uleb128 0x4f
 	.8byte	.LVL147
-	.4byte	0x153cd
+	.4byte	0x154ed
 	.uleb128 0x4f
 	.8byte	.LVL157
-	.4byte	0x15500
+	.4byte	0x15620
 	.uleb128 0x4f
 	.8byte	.LVL158
-	.4byte	0x15484
+	.4byte	0x155a4
 	.uleb128 0x4f
 	.8byte	.LVL185
-	.4byte	0x15281
+	.4byte	0x153a1
 	.uleb128 0x4f
 	.8byte	.LVL188
-	.4byte	0x15281
+	.4byte	0x153a1
 	.uleb128 0x4f
 	.8byte	.LVL190
-	.4byte	0x15377
+	.4byte	0x15497
 	.uleb128 0x4f
 	.8byte	.LVL192
-	.4byte	0x15377
+	.4byte	0x15497
 	.uleb128 0x4f
 	.8byte	.LVL193
-	.4byte	0x153d9
+	.4byte	0x154f9
 	.uleb128 0x4f
 	.8byte	.LVL194
-	.4byte	0x15484
+	.4byte	0x155a4
 	.uleb128 0x4f
 	.8byte	.LVL207
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL210
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL212
-	.4byte	0x15377
+	.4byte	0x15497
 	.uleb128 0x4f
 	.8byte	.LVL213
-	.4byte	0x15484
+	.4byte	0x155a4
 	.uleb128 0x4f
 	.8byte	.LVL221
-	.4byte	0x154dc
+	.4byte	0x155fc
 	.uleb128 0x4f
 	.8byte	.LVL255
-	.4byte	0x153cd
+	.4byte	0x154ed
 	.uleb128 0x4f
 	.8byte	.LVL262
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL263
-	.4byte	0x1542f
+	.4byte	0x1554f
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
@@ -44234,25 +44322,25 @@ __exitcall_ebc_exit:
 	.uleb128 0x64
 	.4byte	.LASF3095
 	.byte	0x1
-	.2byte	0x8e7
+	.2byte	0x8f1
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x117e8
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x8e7
+	.2byte	0x8f1
 	.4byte	0xe1f4
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x8e9
+	.2byte	0x8f3
 	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x8e1
+	.2byte	0x8eb
 	.8byte	.LFB2841
 	.8byte	.LFE2841-.LFB2841
 	.uleb128 0x1
@@ -44261,17 +44349,17 @@ __exitcall_ebc_exit:
 	.uleb128 0x52
 	.string	"t"
 	.byte	0x1
-	.2byte	0x8e1
+	.2byte	0x8eb
 	.4byte	0x31d2
 	.4byte	.LLST74
 	.uleb128 0x4f
 	.8byte	.LVL276
-	.4byte	0x124a5
+	.4byte	0x125a9
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x8d5
+	.2byte	0x8df
 	.8byte	.LFB2840
 	.8byte	.LFE2840-.LFB2840
 	.uleb128 0x1
@@ -44280,43 +44368,43 @@ __exitcall_ebc_exit:
 	.uleb128 0x52
 	.string	"t"
 	.byte	0x1
-	.2byte	0x8d5
+	.2byte	0x8df
 	.4byte	0x31d2
 	.4byte	.LLST12
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x8d7
+	.2byte	0x8e1
 	.4byte	0xe874
 	.uleb128 0x60
-	.4byte	0x14771
-	.8byte	.LBB958
+	.4byte	0x14879
+	.8byte	.LBB984
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.2byte	0x8db
+	.2byte	0x8e5
 	.uleb128 0x55
-	.4byte	0x1477e
+	.4byte	0x14886
 	.uleb128 0x4f
 	.8byte	.LVL71
-	.4byte	0x1550c
+	.4byte	0x1562c
 	.byte	0
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x8c4
+	.2byte	0x8ce
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x118ac
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x8c4
+	.2byte	0x8ce
 	.4byte	0xe1f4
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x8c6
+	.2byte	0x8d0
 	.4byte	0xe4f2
 	.byte	0
 	.uleb128 0x50
@@ -44328,7 +44416,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2838-.LFB2838
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x121ba
+	.4byte	0x122be
 	.uleb128 0x52
 	.string	"ptr"
 	.byte	0x1
@@ -44384,7 +44472,7 @@ __exitcall_ebc_exit:
 	.2byte	0x88e
 	.8byte	.L939
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1220
+	.4byte	.Ldebug_ranges0+0x1280
 	.4byte	0x119fc
 	.uleb128 0x48
 	.4byte	.LASF3092
@@ -44392,8 +44480,8 @@ __exitcall_ebc_exit:
 	.2byte	0x7c5
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB1887
-	.8byte	.LBE1887-.LBB1887
+	.8byte	.LBB1921
+	.8byte	.LBE1921-.LBB1921
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
@@ -44413,102 +44501,176 @@ __exitcall_ebc_exit:
 	.2byte	0x7c5
 	.4byte	0x199
 	.uleb128 0x63
+	.4byte	.Ldebug_ranges0+0x12b0
+	.4byte	0x119e0
+	.uleb128 0x5a
+	.4byte	.LASF3094
+	.byte	0x1
+	.2byte	0x7c5
+	.4byte	0x199
+	.4byte	.LLST263
+	.uleb128 0x4f
+	.8byte	.LVL1032
+	.4byte	0x155b0
+	.uleb128 0x4f
+	.8byte	.LVL1033
+	.4byte	0x155bc
+	.byte	0
+	.uleb128 0x4f
+	.8byte	.LVL1030
+	.4byte	0x155c9
+	.uleb128 0x4f
+	.8byte	.LVL1034
+	.4byte	0x155d5
+	.byte	0
+	.byte	0
+	.uleb128 0x63
+	.4byte	.Ldebug_ranges0+0x1220
+	.4byte	0x11a9e
+	.uleb128 0x48
+	.4byte	.LASF3092
+	.byte	0x1
+	.2byte	0x87a
+	.4byte	0xc6
+	.uleb128 0x57
+	.8byte	.LBB1917
+	.8byte	.LBE1917-.LBB1917
+	.uleb128 0x6c
+	.4byte	.LASF3104
+	.byte	0x1
+	.2byte	0x87a
+	.8byte	.L986
+	.uleb128 0x4d
+	.4byte	.LASF3093
+	.byte	0x1
+	.2byte	0x87a
+	.4byte	0x1528
+	.uleb128 0x3
+	.byte	0x91
+	.sleb128 -120
+	.uleb128 0x48
+	.4byte	.LASF3092
+	.byte	0x1
+	.2byte	0x87a
+	.4byte	0x199
+	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x1250
-	.4byte	0x119e0
+	.4byte	0x11a82
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x7c5
+	.2byte	0x87a
 	.4byte	0x199
-	.4byte	.LLST261
+	.4byte	.LLST262
 	.uleb128 0x4f
-	.8byte	.LVL1023
-	.4byte	0x15490
+	.8byte	.LVL1019
+	.4byte	0x155b0
 	.uleb128 0x4f
-	.8byte	.LVL1024
-	.4byte	0x1549c
+	.8byte	.LVL1020
+	.4byte	0x155bc
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL1021
-	.4byte	0x154a9
+	.8byte	.LVL1017
+	.4byte	0x155c9
 	.uleb128 0x4f
-	.8byte	.LVL1025
-	.4byte	0x154b5
+	.8byte	.LVL1021
+	.4byte	0x155d5
 	.byte	0
 	.byte	0
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x11c0
-	.4byte	0x11a9e
+	.4byte	.Ldebug_ranges0+0x1090
+	.4byte	0x11b71
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x87a
-	.4byte	0xc6
-	.uleb128 0x57
-	.8byte	.LBB1883
-	.8byte	.LBE1883-.LBB1883
+	.2byte	0x8ad
+	.4byte	0x199
+	.uleb128 0x73
+	.4byte	0x11ac5
+	.uleb128 0x48
+	.4byte	.LASF3106
+	.byte	0x1
+	.2byte	0x8ad
+	.4byte	0x2b0
+	.byte	0
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0x1090
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x87a
-	.8byte	.L986
+	.2byte	0x8ad
+	.8byte	.L995
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x87a
+	.2byte	0x8ad
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -120
-	.uleb128 0x48
+	.uleb128 0x5a
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x87a
+	.2byte	0x8ad
 	.4byte	0x199
+	.4byte	.LLST245
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x11f0
-	.4byte	0x11a82
+	.4byte	.Ldebug_ranges0+0x10e0
+	.4byte	0x11b55
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x87a
+	.2byte	0x8ad
 	.4byte	0x199
-	.4byte	.LLST260
+	.4byte	.LLST246
+	.uleb128 0x63
+	.4byte	.Ldebug_ranges0+0x1130
+	.4byte	0x11b2d
+	.uleb128 0x5a
+	.4byte	.LASF3106
+	.byte	0x1
+	.2byte	0x8ad
+	.4byte	0x2b0
+	.4byte	.LLST247
+	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL1012
-	.4byte	0x15490
+	.8byte	.LVL936
+	.4byte	0x155bc
 	.uleb128 0x4f
-	.8byte	.LVL1013
-	.4byte	0x1549c
+	.8byte	.LVL941
+	.4byte	0x15638
+	.uleb128 0x4f
+	.8byte	.LVL942
+	.4byte	0x155bc
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL1010
-	.4byte	0x154a9
+	.8byte	.LVL934
+	.4byte	0x155c9
 	.uleb128 0x4f
-	.8byte	.LVL1014
-	.4byte	0x154b5
+	.8byte	.LVL945
+	.4byte	0x155d5
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1877
-	.8byte	.LBE1877-.LBB1877
-	.4byte	0x11b50
+	.8byte	.LBB1939
+	.8byte	.LBE1939-.LBB1939
+	.4byte	0x11c23
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x8ac
+	.2byte	0x8b6
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB1878
-	.8byte	.LBE1878-.LBB1878
-	.uleb128 0x73
+	.8byte	.LBB1940
+	.8byte	.LBE1940-.LBB1940
+	.uleb128 0x74
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x8ac
+	.2byte	0x8b6
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x8ac
+	.2byte	0x8b6
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -44516,52 +44678,54 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x8ac
+	.2byte	0x8b6
 	.4byte	0x199
 	.uleb128 0x6d
-	.8byte	.LBB1879
-	.8byte	.LBE1879-.LBB1879
-	.4byte	0x11b34
+	.8byte	.LBB1941
+	.8byte	.LBE1941-.LBB1941
+	.4byte	0x11c07
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x8ac
+	.2byte	0x8b6
 	.4byte	0x199
-	.4byte	.LLST259
+	.4byte	.LLST266
 	.uleb128 0x4f
-	.8byte	.LVL950
-	.4byte	0x15490
+	.8byte	.LVL1042
+	.4byte	0x155b0
 	.uleb128 0x4f
-	.8byte	.LVL951
-	.4byte	0x1549c
+	.8byte	.LVL1043
+	.4byte	0x155bc
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL948
-	.4byte	0x154a9
+	.8byte	.LVL1040
+	.4byte	0x155c9
 	.uleb128 0x4f
-	.8byte	.LVL952
-	.4byte	0x154b5
+	.8byte	.LVL1044
+	.4byte	0x155d5
 	.byte	0
 	.byte	0
-	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1090
-	.4byte	0x11be6
+	.uleb128 0x6d
+	.8byte	.LBB1913
+	.8byte	.LBE1913-.LBB1913
+	.4byte	0x11cdd
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x8b8
+	.2byte	0x8c2
 	.4byte	0xc6
-	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x1090
+	.uleb128 0x57
+	.8byte	.LBB1914
+	.8byte	.LBE1914-.LBB1914
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x8b8
-	.8byte	.L1003
+	.2byte	0x8c2
+	.8byte	.L1009
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x8b8
+	.2byte	0x8c2
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -44569,473 +44733,477 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x8b8
+	.2byte	0x8c2
 	.4byte	0x199
-	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x10d0
-	.4byte	0x11bca
+	.uleb128 0x6d
+	.8byte	.LBB1915
+	.8byte	.LBE1915-.LBB1915
+	.4byte	0x11cc1
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x8b8
+	.2byte	0x8c2
 	.4byte	0x199
-	.4byte	.LLST245
+	.4byte	.LLST261
 	.uleb128 0x4f
-	.8byte	.LVL939
-	.4byte	0x15490
+	.8byte	.LVL949
+	.4byte	0x155b0
 	.uleb128 0x4f
-	.8byte	.LVL940
-	.4byte	0x1549c
+	.8byte	.LVL950
+	.4byte	0x155bc
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL937
-	.4byte	0x154a9
+	.8byte	.LVL947
+	.4byte	0x155c9
 	.uleb128 0x4f
-	.8byte	.LVL941
-	.4byte	0x154b5
+	.8byte	.LVL951
+	.4byte	0x155d5
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x1220e
-	.8byte	.LBB1860
-	.4byte	.Ldebug_ranges0+0x1110
+	.4byte	0x12312
+	.8byte	.LBB1895
+	.4byte	.Ldebug_ranges0+0x1160
 	.byte	0x1
 	.2byte	0x851
-	.4byte	0x11c4a
+	.4byte	0x11d41
 	.uleb128 0x55
-	.4byte	0x1221f
+	.4byte	0x12323
 	.uleb128 0x55
-	.4byte	0x1221f
+	.4byte	0x12323
 	.uleb128 0x55
-	.4byte	0x1222b
+	.4byte	0x1232f
 	.uleb128 0x55
-	.4byte	0x1222b
+	.4byte	0x1232f
 	.uleb128 0x55
-	.4byte	0x12237
+	.4byte	0x1233b
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x1110
+	.4byte	.Ldebug_ranges0+0x1160
 	.uleb128 0x58
-	.4byte	0x12243
+	.4byte	0x12347
 	.uleb128 0x58
-	.4byte	0x1224d
+	.4byte	0x12351
 	.uleb128 0x58
-	.4byte	0x12259
+	.4byte	0x1235d
 	.uleb128 0x58
-	.4byte	0x12265
+	.4byte	0x12369
 	.uleb128 0x61
-	.4byte	0x12271
-	.4byte	.LLST246
+	.4byte	0x12375
+	.4byte	.LLST248
 	.uleb128 0x58
-	.4byte	0x1227d
+	.4byte	0x12381
 	.uleb128 0x58
-	.4byte	0x12289
-	.uleb128 0x74
-	.4byte	0x12295
+	.4byte	0x1238d
+	.uleb128 0x75
+	.4byte	0x12399
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x121ba
-	.8byte	.LBB1863
-	.8byte	.LBE1863-.LBB1863
+	.4byte	0x122be
+	.8byte	.LBB1898
+	.8byte	.LBE1898-.LBB1898
 	.byte	0x1
 	.2byte	0x7de
-	.4byte	0x11c9b
+	.4byte	0x11d92
 	.uleb128 0x55
-	.4byte	0x121df
+	.4byte	0x122e3
 	.uleb128 0x55
-	.4byte	0x121d3
+	.4byte	0x122d7
 	.uleb128 0x70
-	.4byte	0x121c7
-	.4byte	.LLST247
+	.4byte	0x122cb
+	.4byte	.LLST249
 	.uleb128 0x57
-	.8byte	.LBB1864
-	.8byte	.LBE1864-.LBB1864
+	.8byte	.LBB1899
+	.8byte	.LBE1899-.LBB1899
 	.uleb128 0x58
-	.4byte	0x121eb
+	.4byte	0x122ef
 	.uleb128 0x58
-	.4byte	0x121f5
+	.4byte	0x122f9
 	.uleb128 0x58
-	.4byte	0x12201
+	.4byte	0x12305
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13f7c
-	.8byte	.LBB1865
-	.4byte	.Ldebug_ranges0+0x1140
+	.4byte	0x14080
+	.8byte	.LBB1900
+	.4byte	.Ldebug_ranges0+0x1190
 	.byte	0x1
 	.2byte	0x7e9
-	.4byte	0x11d61
+	.4byte	0x11e58
 	.uleb128 0x55
-	.4byte	0x13fb9
+	.4byte	0x140bd
 	.uleb128 0x55
-	.4byte	0x13fb9
+	.4byte	0x140bd
 	.uleb128 0x55
-	.4byte	0x13fb9
+	.4byte	0x140bd
 	.uleb128 0x55
-	.4byte	0x13fc5
+	.4byte	0x140c9
 	.uleb128 0x55
-	.4byte	0x13fad
+	.4byte	0x140b1
 	.uleb128 0x55
-	.4byte	0x13fa1
+	.4byte	0x140a5
 	.uleb128 0x55
-	.4byte	0x13f95
+	.4byte	0x14099
 	.uleb128 0x55
-	.4byte	0x13f89
+	.4byte	0x1408d
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x1140
+	.4byte	.Ldebug_ranges0+0x1190
 	.uleb128 0x58
-	.4byte	0x13fd1
+	.4byte	0x140d5
 	.uleb128 0x61
-	.4byte	0x13fdd
-	.4byte	.LLST248
+	.4byte	0x140e1
+	.4byte	.LLST250
 	.uleb128 0x58
-	.4byte	0x13fe9
+	.4byte	0x140ed
 	.uleb128 0x61
-	.4byte	0x13ff5
-	.4byte	.LLST249
+	.4byte	0x140f9
+	.4byte	.LLST251
 	.uleb128 0x61
-	.4byte	0x14001
-	.4byte	.LLST250
+	.4byte	0x14105
+	.4byte	.LLST252
 	.uleb128 0x58
-	.4byte	0x1400d
+	.4byte	0x14111
 	.uleb128 0x58
-	.4byte	0x14019
+	.4byte	0x1411d
 	.uleb128 0x58
-	.4byte	0x14025
+	.4byte	0x14129
 	.uleb128 0x61
-	.4byte	0x14031
-	.4byte	.LLST251
+	.4byte	0x14135
+	.4byte	.LLST253
 	.uleb128 0x58
-	.4byte	0x1403d
+	.4byte	0x14141
 	.uleb128 0x61
-	.4byte	0x14049
-	.4byte	.LLST252
+	.4byte	0x1414d
+	.4byte	.LLST254
 	.uleb128 0x62
-	.4byte	0x14055
+	.4byte	0x14159
 	.uleb128 0x1
 	.byte	0x60
 	.uleb128 0x61
-	.4byte	0x1405f
-	.4byte	.LLST253
-	.uleb128 0x61
-	.4byte	0x14069
-	.4byte	.LLST254
-	.uleb128 0x61
-	.4byte	0x14075
+	.4byte	0x14163
 	.4byte	.LLST255
 	.uleb128 0x61
-	.4byte	0x14081
+	.4byte	0x1416d
 	.4byte	.LLST256
 	.uleb128 0x61
-	.4byte	0x1408d
+	.4byte	0x14179
 	.4byte	.LLST257
+	.uleb128 0x61
+	.4byte	0x14185
+	.4byte	.LLST258
+	.uleb128 0x61
+	.4byte	0x14191
+	.4byte	.LLST259
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x121ba
-	.8byte	.LBB1872
-	.4byte	.Ldebug_ranges0+0x1190
+	.4byte	0x122be
+	.8byte	.LBB1908
+	.4byte	.Ldebug_ranges0+0x11f0
 	.byte	0x1
 	.2byte	0x80c
-	.4byte	0x11da2
+	.4byte	0x11e99
 	.uleb128 0x55
-	.4byte	0x121df
+	.4byte	0x122e3
 	.uleb128 0x55
-	.4byte	0x121d3
+	.4byte	0x122d7
 	.uleb128 0x70
-	.4byte	0x121c7
-	.4byte	.LLST258
+	.4byte	0x122cb
+	.4byte	.LLST260
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x1190
-	.uleb128 0x58
-	.4byte	0x121eb
+	.4byte	.Ldebug_ranges0+0x11f0
 	.uleb128 0x58
-	.4byte	0x121f5
+	.4byte	0x122ef
 	.uleb128 0x58
-	.4byte	0x12201
-	.byte	0
-	.byte	0
-	.uleb128 0x54
-	.4byte	0x143c3
-	.8byte	.LBB1880
-	.8byte	.LBE1880-.LBB1880
-	.byte	0x1
-	.2byte	0x8b5
-	.4byte	0x11ded
-	.uleb128 0x55
-	.4byte	0x143de
-	.uleb128 0x55
-	.4byte	0x143d3
-	.uleb128 0x57
-	.8byte	.LBB1881
-	.8byte	.LBE1881-.LBB1881
+	.4byte	0x122f9
 	.uleb128 0x58
-	.4byte	0x143ea
-	.uleb128 0x4f
-	.8byte	.LVL953
-	.4byte	0x15098
+	.4byte	0x12305
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x121ba
-	.8byte	.LBB1893
-	.4byte	.Ldebug_ranges0+0x1280
+	.4byte	0x122be
+	.8byte	.LBB1928
+	.4byte	.Ldebug_ranges0+0x12e0
 	.byte	0x1
 	.2byte	0x808
-	.4byte	0x11e2e
+	.4byte	0x11eda
 	.uleb128 0x55
-	.4byte	0x121df
+	.4byte	0x122e3
 	.uleb128 0x55
-	.4byte	0x121d3
+	.4byte	0x122d7
 	.uleb128 0x70
-	.4byte	0x121c7
-	.4byte	.LLST262
+	.4byte	0x122cb
+	.4byte	.LLST264
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x1280
+	.4byte	.Ldebug_ranges0+0x12e0
 	.uleb128 0x58
-	.4byte	0x121eb
+	.4byte	0x122ef
 	.uleb128 0x58
-	.4byte	0x121f5
+	.4byte	0x122f9
 	.uleb128 0x58
-	.4byte	0x12201
+	.4byte	0x12305
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x121ba
-	.8byte	.LBB1898
-	.4byte	.Ldebug_ranges0+0x12b0
+	.4byte	0x122be
+	.8byte	.LBB1933
+	.4byte	.Ldebug_ranges0+0x1310
 	.byte	0x1
 	.2byte	0x7a6
-	.4byte	0x11e6f
+	.4byte	0x11f1b
 	.uleb128 0x55
-	.4byte	0x121df
+	.4byte	0x122e3
 	.uleb128 0x55
-	.4byte	0x121d3
+	.4byte	0x122d7
 	.uleb128 0x70
-	.4byte	0x121c7
-	.4byte	.LLST263
+	.4byte	0x122cb
+	.4byte	.LLST265
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x12b0
+	.4byte	.Ldebug_ranges0+0x1310
 	.uleb128 0x58
-	.4byte	0x121eb
+	.4byte	0x122ef
 	.uleb128 0x58
-	.4byte	0x121f5
+	.4byte	0x122f9
 	.uleb128 0x58
-	.4byte	0x12201
+	.4byte	0x12305
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x143c3
-	.8byte	.LBB1902
-	.8byte	.LBE1902-.LBB1902
+	.4byte	0x144c7
+	.8byte	.LBB1937
+	.8byte	.LBE1937-.LBB1937
 	.byte	0x1
 	.2byte	0x773
-	.4byte	0x11eba
+	.4byte	0x11f66
 	.uleb128 0x55
-	.4byte	0x143de
+	.4byte	0x144e3
 	.uleb128 0x55
-	.4byte	0x143d3
+	.4byte	0x144d7
 	.uleb128 0x57
-	.8byte	.LBB1903
-	.8byte	.LBE1903-.LBB1903
+	.8byte	.LBB1938
+	.8byte	.LBE1938-.LBB1938
 	.uleb128 0x58
-	.4byte	0x143ea
+	.4byte	0x144ef
 	.uleb128 0x4f
-	.8byte	.LVL1031
-	.4byte	0x15098
+	.8byte	.LVL1038
+	.4byte	0x151b8
+	.byte	0
+	.byte	0
+	.uleb128 0x54
+	.4byte	0x144c7
+	.8byte	.LBB1942
+	.8byte	.LBE1942-.LBB1942
+	.byte	0x1
+	.2byte	0x8bf
+	.4byte	0x11fb1
+	.uleb128 0x55
+	.4byte	0x144e3
+	.uleb128 0x55
+	.4byte	0x144d7
+	.uleb128 0x57
+	.8byte	.LBB1943
+	.8byte	.LBE1943-.LBB1943
+	.uleb128 0x58
+	.4byte	0x144ef
+	.uleb128 0x4f
+	.8byte	.LVL1045
+	.4byte	0x151b8
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL878
-	.4byte	0x15518
+	.4byte	0x15644
 	.uleb128 0x4f
 	.8byte	.LVL880
-	.4byte	0x1536b
+	.4byte	0x1548b
 	.uleb128 0x4f
 	.8byte	.LVL881
-	.4byte	0x15281
+	.4byte	0x153a1
 	.uleb128 0x4f
 	.8byte	.LVL882
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL883
-	.4byte	0x15524
+	.4byte	0x15650
 	.uleb128 0x4f
 	.8byte	.LVL884
-	.4byte	0x154dc
-	.uleb128 0x4f
-	.8byte	.LVL895
-	.4byte	0x151b7
-	.uleb128 0x4f
-	.8byte	.LVL899
-	.4byte	0x15156
-	.uleb128 0x4f
-	.8byte	.LVL900
-	.4byte	0x1536b
+	.4byte	0x155fc
 	.uleb128 0x4f
-	.8byte	.LVL905
-	.4byte	0x1230e
+	.8byte	.LVL894
+	.4byte	0x15276
 	.uleb128 0x4f
-	.8byte	.LVL906
-	.4byte	0x152fb
+	.8byte	.LVL895
+	.4byte	0x15650
 	.uleb128 0x4f
-	.8byte	.LVL908
-	.4byte	0x15524
+	.8byte	.LVL896
+	.4byte	0x155fc
 	.uleb128 0x4f
-	.8byte	.LVL911
-	.4byte	0x153d9
+	.8byte	.LVL901
+	.4byte	0x12412
 	.uleb128 0x4f
-	.8byte	.LVL912
-	.4byte	0x153d9
+	.8byte	.LVL902
+	.4byte	0x1541b
 	.uleb128 0x4f
-	.8byte	.LVL930
-	.4byte	0x15530
+	.8byte	.LVL904
+	.4byte	0x15650
 	.uleb128 0x4f
-	.8byte	.LVL931
-	.4byte	0x153d9
+	.8byte	.LVL907
+	.4byte	0x154f9
 	.uleb128 0x4f
-	.8byte	.LVL944
-	.4byte	0x1553c
+	.8byte	.LVL908
+	.4byte	0x154f9
 	.uleb128 0x4f
-	.8byte	.LVL945
-	.4byte	0x15281
+	.8byte	.LVL926
+	.4byte	0x1565c
 	.uleb128 0x4f
-	.8byte	.LVL946
-	.4byte	0x15156
+	.8byte	.LVL927
+	.4byte	0x154f9
 	.uleb128 0x4f
-	.8byte	.LVL954
-	.4byte	0x154dc
+	.8byte	.LVL953
+	.4byte	0x152d7
 	.uleb128 0x4f
 	.8byte	.LVL956
-	.4byte	0x15281
+	.4byte	0x15668
 	.uleb128 0x4f
 	.8byte	.LVL957
-	.4byte	0x12750
+	.4byte	0x153a1
 	.uleb128 0x4f
 	.8byte	.LVL958
-	.4byte	0x1536b
+	.4byte	0x15276
 	.uleb128 0x4f
-	.8byte	.LVL961
-	.4byte	0x1536b
+	.8byte	.LVL960
+	.4byte	0x155fc
 	.uleb128 0x4f
-	.8byte	.LVL964
-	.4byte	0x15281
+	.8byte	.LVL962
+	.4byte	0x153a1
 	.uleb128 0x4f
-	.8byte	.LVL965
-	.4byte	0x153cd
+	.8byte	.LVL963
+	.4byte	0x12854
 	.uleb128 0x4f
-	.8byte	.LVL968
-	.4byte	0x151b7
+	.8byte	.LVL964
+	.4byte	0x1548b
 	.uleb128 0x4f
-	.8byte	.LVL971
-	.4byte	0x15530
+	.8byte	.LVL967
+	.4byte	0x1548b
 	.uleb128 0x4f
-	.8byte	.LVL972
-	.4byte	0x153d9
+	.8byte	.LVL970
+	.4byte	0x153a1
 	.uleb128 0x4f
-	.8byte	.LVL973
-	.4byte	0x15524
+	.8byte	.LVL971
+	.4byte	0x154ed
 	.uleb128 0x4f
 	.8byte	.LVL974
-	.4byte	0x154dc
-	.uleb128 0x4f
-	.8byte	.LVL975
-	.4byte	0x142de
-	.uleb128 0x4f
-	.8byte	.LVL976
-	.4byte	0x15548
+	.4byte	0x152d7
 	.uleb128 0x4f
 	.8byte	.LVL977
-	.4byte	0x15281
+	.4byte	0x1565c
 	.uleb128 0x4f
 	.8byte	.LVL978
-	.4byte	0x12750
+	.4byte	0x154f9
 	.uleb128 0x4f
 	.8byte	.LVL979
-	.4byte	0x14144
+	.4byte	0x15650
 	.uleb128 0x4f
 	.8byte	.LVL980
-	.4byte	0x15548
+	.4byte	0x155fc
 	.uleb128 0x4f
 	.8byte	.LVL981
-	.4byte	0x1230e
+	.4byte	0x143e2
 	.uleb128 0x4f
 	.8byte	.LVL982
-	.4byte	0x15281
+	.4byte	0x15674
 	.uleb128 0x4f
 	.8byte	.LVL983
-	.4byte	0x12750
+	.4byte	0x153a1
 	.uleb128 0x4f
 	.8byte	.LVL984
-	.4byte	0x15281
+	.4byte	0x12854
+	.uleb128 0x4f
+	.8byte	.LVL985
+	.4byte	0x14248
+	.uleb128 0x4f
+	.8byte	.LVL986
+	.4byte	0x15674
 	.uleb128 0x4f
 	.8byte	.LVL987
-	.4byte	0x15281
+	.4byte	0x12412
 	.uleb128 0x4f
-	.8byte	.LVL992
-	.4byte	0x15281
+	.8byte	.LVL988
+	.4byte	0x153a1
 	.uleb128 0x4f
-	.8byte	.LVL994
-	.4byte	0x153d9
+	.8byte	.LVL989
+	.4byte	0x12854
 	.uleb128 0x4f
-	.8byte	.LVL1001
-	.4byte	0x1230e
+	.8byte	.LVL990
+	.4byte	0x153a1
 	.uleb128 0x4f
-	.8byte	.LVL1002
-	.4byte	0x15281
+	.8byte	.LVL993
+	.4byte	0x153a1
 	.uleb128 0x4f
-	.8byte	.LVL1003
-	.4byte	0x12750
+	.8byte	.LVL998
+	.4byte	0x153a1
 	.uleb128 0x4f
-	.8byte	.LVL1005
-	.4byte	0x15281
+	.8byte	.LVL1000
+	.4byte	0x154f9
 	.uleb128 0x4f
-	.8byte	.LVL1006
-	.4byte	0x153cd
+	.8byte	.LVL1007
+	.4byte	0x12412
 	.uleb128 0x4f
 	.8byte	.LVL1008
-	.4byte	0x15281
+	.4byte	0x153a1
 	.uleb128 0x4f
-	.8byte	.LVL1017
-	.4byte	0x1420b
+	.8byte	.LVL1009
+	.4byte	0x12854
+	.uleb128 0x4f
+	.8byte	.LVL1012
+	.4byte	0x153a1
+	.uleb128 0x4f
+	.8byte	.LVL1013
+	.4byte	0x154ed
+	.uleb128 0x4f
+	.8byte	.LVL1015
+	.4byte	0x153a1
+	.uleb128 0x4f
+	.8byte	.LVL1024
+	.4byte	0x1430f
 	.uleb128 0x4f
 	.8byte	.LVL1027
-	.4byte	0x151b7
+	.4byte	0x152d7
 	.uleb128 0x4f
-	.8byte	.LVL1033
-	.4byte	0x152fb
+	.8byte	.LVL1048
+	.4byte	0x1541b
 	.uleb128 0x4f
-	.8byte	.LVL1034
-	.4byte	0x151b7
+	.8byte	.LVL1049
+	.4byte	0x152d7
 	.uleb128 0x4f
-	.8byte	.LVL1035
-	.4byte	0x153d9
+	.8byte	.LVL1051
+	.4byte	0x15668
 	.uleb128 0x4f
-	.8byte	.LVL1037
-	.4byte	0x153d9
+	.8byte	.LVL1053
+	.4byte	0x154f9
 	.uleb128 0x4f
-	.8byte	.LVL1039
-	.4byte	0x1553c
+	.8byte	.LVL1055
+	.4byte	0x154f9
 	.uleb128 0x4f
-	.8byte	.LVL1041
-	.4byte	0x151b7
+	.8byte	.LVL1056
+	.4byte	0x152d7
 	.uleb128 0x4f
-	.8byte	.LVL1043
-	.4byte	0x1542f
+	.8byte	.LVL1058
+	.4byte	0x1554f
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3106
+	.4byte	.LASF3107
 	.byte	0x1
 	.2byte	0x755
 	.byte	0x1
-	.4byte	0x1220e
+	.4byte	0x12312
 	.uleb128 0x66
-	.4byte	.LASF3107
+	.4byte	.LASF3108
 	.byte	0x1
 	.2byte	0x755
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3108
+	.4byte	.LASF3109
 	.byte	0x1
 	.2byte	0x755
 	.4byte	0xc138
@@ -45050,35 +45218,35 @@ __exitcall_ebc_exit:
 	.2byte	0x757
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3109
+	.4byte	.LASF3110
 	.byte	0x1
 	.2byte	0x758
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3110
+	.4byte	.LASF3111
 	.byte	0x1
 	.2byte	0x759
 	.4byte	0x110
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3111
+	.4byte	.LASF3112
 	.byte	0x1
 	.2byte	0x739
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1229e
+	.4byte	0x123a2
 	.uleb128 0x66
-	.4byte	.LASF3112
+	.4byte	.LASF3113
 	.byte	0x1
 	.2byte	0x739
 	.4byte	0xe4f2
 	.uleb128 0x66
-	.4byte	.LASF3113
+	.4byte	.LASF3114
 	.byte	0x1
 	.2byte	0x739
 	.4byte	0xe4f2
 	.uleb128 0x66
-	.4byte	.LASF3114
+	.4byte	.LASF3115
 	.byte	0x1
 	.2byte	0x739
 	.4byte	0xc6
@@ -45088,47 +45256,47 @@ __exitcall_ebc_exit:
 	.2byte	0x73b
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3115
+	.4byte	.LASF3116
 	.byte	0x1
 	.2byte	0x73c
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3116
+	.4byte	.LASF3117
 	.byte	0x1
 	.2byte	0x73c
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3117
+	.4byte	.LASF3118
 	.byte	0x1
 	.2byte	0x73d
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3118
+	.4byte	.LASF3119
 	.byte	0x1
 	.2byte	0x73e
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3119
+	.4byte	.LASF3120
 	.byte	0x1
 	.2byte	0x73f
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3120
+	.4byte	.LASF3121
 	.byte	0x1
 	.2byte	0x740
 	.4byte	0x46f4
-	.uleb128 0x73
-	.4byte	.LASF3121
+	.uleb128 0x74
+	.4byte	.LASF3122
 	.byte	0x1
 	.2byte	0x751
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3122
+	.4byte	.LASF3123
 	.byte	0x1
 	.2byte	0x71d
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1230e
+	.4byte	0x12412
 	.uleb128 0x65
 	.string	"buf"
 	.byte	0x1
@@ -45145,33 +45313,33 @@ __exitcall_ebc_exit:
 	.2byte	0x71f
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3115
+	.4byte	.LASF3116
 	.byte	0x1
 	.2byte	0x720
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3119
+	.4byte	.LASF3120
 	.byte	0x1
 	.2byte	0x721
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3123
+	.4byte	.LASF3124
 	.byte	0x1
 	.2byte	0x722
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3114
+	.4byte	.LASF3115
 	.byte	0x1
 	.2byte	0x723
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3124
+	.4byte	.LASF3125
 	.byte	0x1
 	.2byte	0x724
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x51
-	.4byte	.LASF3125
+	.4byte	.LASF3126
 	.byte	0x1
 	.2byte	0x6b1
 	.4byte	0xc6
@@ -45179,7 +45347,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2834-.LFB2834
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x124a5
+	.4byte	0x125a9
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
@@ -45198,7 +45366,7 @@ __exitcall_ebc_exit:
 	.2byte	0x6b3
 	.4byte	0xe874
 	.uleb128 0x5a
-	.4byte	.LASF3126
+	.4byte	.LASF3127
 	.byte	0x1
 	.2byte	0x6b4
 	.4byte	0xc6
@@ -45211,89 +45379,89 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x64
 	.uleb128 0x48
-	.4byte	.LASF3127
+	.4byte	.LASF3128
 	.byte	0x1
 	.2byte	0x6b6
 	.4byte	0xd8a3
 	.uleb128 0x54
-	.4byte	0x146d6
-	.8byte	.LBB1232
-	.8byte	.LBE1232-.LBB1232
+	.4byte	0x147dd
+	.8byte	.LBB1258
+	.8byte	.LBE1258-.LBB1258
 	.byte	0x1
 	.2byte	0x6bb
-	.4byte	0x123ad
+	.4byte	0x124b1
 	.uleb128 0x55
-	.4byte	0x146f2
+	.4byte	0x147f9
 	.uleb128 0x55
-	.4byte	0x146e6
+	.4byte	0x147ed
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL283
-	.4byte	0x15281
+	.4byte	0x153a1
 	.uleb128 0x4f
 	.8byte	.LVL284
-	.4byte	0x15554
+	.4byte	0x15680
 	.uleb128 0x4f
 	.8byte	.LVL289
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL290
-	.4byte	0x15281
+	.4byte	0x153a1
 	.uleb128 0x4f
 	.8byte	.LVL292
-	.4byte	0x15554
+	.4byte	0x15680
 	.uleb128 0x4f
 	.8byte	.LVL293
-	.4byte	0x152fb
+	.4byte	0x1541b
 	.uleb128 0x4f
 	.8byte	.LVL294
-	.4byte	0x15554
+	.4byte	0x15680
 	.uleb128 0x4f
 	.8byte	.LVL295
-	.4byte	0x15554
+	.4byte	0x15680
 	.uleb128 0x4f
 	.8byte	.LVL296
-	.4byte	0x15554
+	.4byte	0x15680
 	.uleb128 0x4f
 	.8byte	.LVL297
-	.4byte	0x15554
+	.4byte	0x15680
 	.uleb128 0x4f
 	.8byte	.LVL298
-	.4byte	0x15554
+	.4byte	0x15680
 	.uleb128 0x4f
 	.8byte	.LVL299
-	.4byte	0x15554
+	.4byte	0x15680
 	.uleb128 0x4f
 	.8byte	.LVL300
-	.4byte	0x15554
+	.4byte	0x15680
 	.uleb128 0x4f
 	.8byte	.LVL301
-	.4byte	0x15554
+	.4byte	0x15680
 	.uleb128 0x4f
 	.8byte	.LVL302
-	.4byte	0x15554
+	.4byte	0x15680
 	.uleb128 0x4f
 	.8byte	.LVL303
-	.4byte	0x15554
+	.4byte	0x15680
 	.uleb128 0x4f
 	.8byte	.LVL304
-	.4byte	0x15554
+	.4byte	0x15680
 	.uleb128 0x4f
 	.8byte	.LVL305
-	.4byte	0x15281
+	.4byte	0x153a1
 	.uleb128 0x4f
 	.8byte	.LVL306
-	.4byte	0x1542f
+	.4byte	0x1554f
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3128
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x68a
 	.8byte	.LFB2833
 	.8byte	.LFE2833-.LFB2833
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1255e
+	.4byte	0x12662
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
@@ -45306,37 +45474,37 @@ __exitcall_ebc_exit:
 	.4byte	0xe1f4
 	.uleb128 0x4f
 	.8byte	.LVL265
-	.4byte	0x15281
+	.4byte	0x153a1
 	.uleb128 0x4f
 	.8byte	.LVL266
-	.4byte	0x153cd
+	.4byte	0x154ed
 	.uleb128 0x4f
 	.8byte	.LVL267
-	.4byte	0x153cd
+	.4byte	0x154ed
 	.uleb128 0x4f
 	.8byte	.LVL268
-	.4byte	0x1532c
+	.4byte	0x1544c
 	.uleb128 0x4f
 	.8byte	.LVL269
-	.4byte	0x15281
+	.4byte	0x153a1
 	.uleb128 0x4f
 	.8byte	.LVL270
-	.4byte	0x152e5
+	.4byte	0x15405
 	.uleb128 0x4f
 	.8byte	.LVL271
-	.4byte	0x1536b
+	.4byte	0x1548b
 	.uleb128 0x4f
 	.8byte	.LVL272
-	.4byte	0x153cd
+	.4byte	0x154ed
 	.uleb128 0x4f
 	.8byte	.LVL273
-	.4byte	0x153cd
+	.4byte	0x154ed
 	.uleb128 0x4f
 	.8byte	.LVL274
-	.4byte	0x1532c
+	.4byte	0x1544c
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3129
+	.4byte	.LASF3130
 	.byte	0x1
 	.2byte	0x62c
 	.4byte	0xc6
@@ -45344,7 +45512,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2832-.LFB2832
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12740
+	.4byte	0x12844
 	.uleb128 0x59
 	.4byte	.LASF794
 	.byte	0x1
@@ -45370,14 +45538,14 @@ __exitcall_ebc_exit:
 	.4byte	0xe874
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x1020
-	.4byte	0x12648
+	.4byte	0x1274c
 	.uleb128 0x41
 	.byte	0x8
 	.byte	0x1
 	.2byte	0x637
-	.4byte	0x125e1
+	.4byte	0x126e5
 	.uleb128 0x43
-	.4byte	.LASF3130
+	.4byte	.LASF3131
 	.byte	0x1
 	.2byte	0x637
 	.4byte	0x1a0
@@ -45385,120 +45553,120 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x1
 	.2byte	0x637
-	.4byte	0x12740
+	.4byte	0x12844
 	.byte	0
 	.uleb128 0x53
 	.string	"__u"
 	.byte	0x1
 	.2byte	0x637
-	.4byte	0x125bf
+	.4byte	0x126c3
 	.uleb128 0x5c
-	.4byte	0x14f32
-	.8byte	.LBB1812
+	.4byte	0x15052
+	.8byte	.LBB1838
 	.4byte	.Ldebug_ranges0+0x1060
 	.byte	0x1
 	.2byte	0x637
-	.4byte	0x12615
+	.4byte	0x12719
 	.uleb128 0x55
-	.4byte	0x14f55
+	.4byte	0x15075
 	.uleb128 0x55
-	.4byte	0x14f49
+	.4byte	0x15069
 	.uleb128 0x55
-	.4byte	0x14f3f
+	.4byte	0x1505f
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x14d31
-	.8byte	.LBB1815
-	.8byte	.LBE1815-.LBB1815
+	.4byte	0x14e47
+	.8byte	.LBB1841
+	.8byte	.LBE1841-.LBB1841
 	.byte	0x1
 	.2byte	0x637
 	.uleb128 0x57
-	.8byte	.LBB1816
-	.8byte	.LBE1816-.LBB1816
+	.8byte	.LBB1842
+	.8byte	.LBE1842-.LBB1842
 	.uleb128 0x62
-	.4byte	0x14d41
+	.4byte	0x14e57
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14bdd
-	.8byte	.LBB1820
-	.8byte	.LBE1820-.LBB1820
+	.4byte	0x14cf0
+	.8byte	.LBB1846
+	.8byte	.LBE1846-.LBB1846
 	.byte	0x1
 	.2byte	0x67f
-	.4byte	0x1267c
+	.4byte	0x12780
 	.uleb128 0x55
-	.4byte	0x14bf9
+	.4byte	0x14d0c
 	.uleb128 0x55
-	.4byte	0x14bee
+	.4byte	0x14d01
 	.uleb128 0x4f
 	.8byte	.LVL863
-	.4byte	0x15560
+	.4byte	0x1568c
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL858
-	.4byte	0x1556d
+	.4byte	0x15699
 	.uleb128 0x4f
 	.8byte	.LVL859
-	.4byte	0x15490
+	.4byte	0x155b0
 	.uleb128 0x4f
 	.8byte	.LVL860
-	.4byte	0x15577
+	.4byte	0x156a3
 	.uleb128 0x4f
 	.8byte	.LVL861
-	.4byte	0x14f95
+	.4byte	0x150b5
 	.uleb128 0x4f
 	.8byte	.LVL862
-	.4byte	0x13cc0
+	.4byte	0x13dc4
 	.uleb128 0x4f
 	.8byte	.LVL864
-	.4byte	0x14f95
+	.4byte	0x150b5
 	.uleb128 0x4f
 	.8byte	.LVL865
-	.4byte	0x13367
+	.4byte	0x1346b
 	.uleb128 0x4f
 	.8byte	.LVL866
-	.4byte	0x14f95
+	.4byte	0x150b5
 	.uleb128 0x4f
 	.8byte	.LVL867
-	.4byte	0x1295a
+	.4byte	0x12a5e
 	.uleb128 0x4f
 	.8byte	.LVL868
-	.4byte	0x14f95
+	.4byte	0x150b5
 	.uleb128 0x4f
 	.8byte	.LVL869
-	.4byte	0x13e21
+	.4byte	0x13f25
 	.uleb128 0x4f
 	.8byte	.LVL870
-	.4byte	0x15583
+	.4byte	0x156af
 	.uleb128 0x4f
 	.8byte	.LVL871
-	.4byte	0x1409a
+	.4byte	0x1419e
 	.uleb128 0x4f
 	.8byte	.LVL872
-	.4byte	0x13e21
+	.4byte	0x13f25
 	.uleb128 0x4f
 	.8byte	.LVL873
-	.4byte	0x13cc0
+	.4byte	0x13dc4
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x12750
+	.4byte	0x12854
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3131
+	.4byte	.LASF3132
 	.byte	0x1
 	.2byte	0x5d5
 	.8byte	.LFB2831
 	.8byte	.LFE2831-.LFB2831
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x128fc
+	.4byte	0x12a00
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
@@ -45522,102 +45690,102 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	__func__.34977
 	.uleb128 0x54
-	.4byte	0x128fc
-	.8byte	.LBB1470
-	.8byte	.LBE1470-.LBB1470
+	.4byte	0x12a00
+	.8byte	.LBB1496
+	.8byte	.LBE1496-.LBB1496
 	.byte	0x1
 	.2byte	0x5e5
-	.4byte	0x127dd
+	.4byte	0x128e1
 	.uleb128 0x55
-	.4byte	0x12915
+	.4byte	0x12a19
 	.uleb128 0x55
-	.4byte	0x12909
+	.4byte	0x12a0d
 	.uleb128 0x4f
 	.8byte	.LVL552
-	.4byte	0x14f95
+	.4byte	0x150b5
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x128fc
-	.8byte	.LBB1472
-	.8byte	.LBE1472-.LBB1472
+	.4byte	0x12a00
+	.8byte	.LBB1498
+	.8byte	.LBE1498-.LBB1498
 	.byte	0x1
 	.2byte	0x5f9
-	.4byte	0x12811
-	.uleb128 0x55
 	.4byte	0x12915
 	.uleb128 0x55
-	.4byte	0x12909
+	.4byte	0x12a19
+	.uleb128 0x55
+	.4byte	0x12a0d
 	.uleb128 0x4f
 	.8byte	.LVL557
-	.4byte	0x14f95
+	.4byte	0x150b5
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x128fc
-	.8byte	.LBB1474
-	.8byte	.LBE1474-.LBB1474
+	.4byte	0x12a00
+	.8byte	.LBB1500
+	.8byte	.LBE1500-.LBB1500
 	.byte	0x1
 	.2byte	0x620
-	.4byte	0x12845
+	.4byte	0x12949
 	.uleb128 0x55
-	.4byte	0x12915
+	.4byte	0x12a19
 	.uleb128 0x55
-	.4byte	0x12909
+	.4byte	0x12a0d
 	.uleb128 0x4f
 	.8byte	.LVL562
-	.4byte	0x14f95
+	.4byte	0x150b5
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x128fc
-	.8byte	.LBB1476
-	.8byte	.LBE1476-.LBB1476
+	.4byte	0x12a00
+	.8byte	.LBB1502
+	.8byte	.LBE1502-.LBB1502
 	.byte	0x1
 	.2byte	0x613
-	.4byte	0x12879
+	.4byte	0x1297d
 	.uleb128 0x55
-	.4byte	0x12915
+	.4byte	0x12a19
 	.uleb128 0x55
-	.4byte	0x12909
+	.4byte	0x12a0d
 	.uleb128 0x4f
 	.8byte	.LVL567
-	.4byte	0x14f95
+	.4byte	0x150b5
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL551
-	.4byte	0x13cc0
+	.4byte	0x13dc4
 	.uleb128 0x4f
 	.8byte	.LVL553
-	.4byte	0x13cc0
+	.4byte	0x13dc4
 	.uleb128 0x4f
 	.8byte	.LVL556
-	.4byte	0x13e21
+	.4byte	0x13f25
 	.uleb128 0x4f
 	.8byte	.LVL558
-	.4byte	0x13e21
+	.4byte	0x13f25
 	.uleb128 0x4f
 	.8byte	.LVL561
-	.4byte	0x13367
+	.4byte	0x1346b
 	.uleb128 0x4f
 	.8byte	.LVL563
-	.4byte	0x13367
+	.4byte	0x1346b
 	.uleb128 0x4f
 	.8byte	.LVL566
-	.4byte	0x1295a
+	.4byte	0x12a5e
 	.uleb128 0x4f
 	.8byte	.LVL568
-	.4byte	0x1295a
+	.4byte	0x12a5e
 	.uleb128 0x4f
 	.8byte	.LVL571
-	.4byte	0x15281
+	.4byte	0x153a1
 	.uleb128 0x4f
 	.8byte	.LVL574
-	.4byte	0x15281
+	.4byte	0x153a1
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3132
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x5cf
 	.byte	0x1
-	.4byte	0x12922
+	.4byte	0x12a26
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
@@ -45630,11 +45798,11 @@ __exitcall_ebc_exit:
 	.4byte	0xe874
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3133
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x5c4
 	.byte	0x1
-	.4byte	0x12954
+	.4byte	0x12a58
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
@@ -45649,35 +45817,35 @@ __exitcall_ebc_exit:
 	.string	"buf"
 	.byte	0x1
 	.2byte	0x5c6
-	.4byte	0x12954
+	.4byte	0x12a58
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xdf7e
 	.uleb128 0x4e
-	.4byte	.LASF3134
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x5af
 	.8byte	.LFB2828
 	.8byte	.LFE2828-.LFB2828
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12f09
-	.uleb128 0x75
-	.4byte	.LASF3135
+	.4byte	0x1300d
+	.uleb128 0x76
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x5af
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x59
-	.4byte	.LASF3136
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x5b0
 	.4byte	0xac0
 	.4byte	.LLST142
 	.uleb128 0x59
-	.4byte	.LASF3137
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x5b0
 	.4byte	0xac0
@@ -45689,478 +45857,478 @@ __exitcall_ebc_exit:
 	.4byte	0xe874
 	.4byte	.LLST144
 	.uleb128 0x54
-	.4byte	0x12f09
-	.8byte	.LBB1380
-	.8byte	.LBE1380-.LBB1380
+	.4byte	0x1300d
+	.8byte	.LBB1406
+	.8byte	.LBE1406-.LBB1406
 	.byte	0x1
 	.2byte	0x5c0
-	.4byte	0x12a63
+	.4byte	0x12b67
 	.uleb128 0x55
-	.4byte	0x12f3a
+	.4byte	0x1303e
 	.uleb128 0x55
-	.4byte	0x12f3a
+	.4byte	0x1303e
 	.uleb128 0x55
-	.4byte	0x12f3a
+	.4byte	0x1303e
 	.uleb128 0x55
-	.4byte	0x12f2e
+	.4byte	0x13032
 	.uleb128 0x72
-	.4byte	0x12f22
+	.4byte	0x13026
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x12f16
+	.4byte	0x1301a
 	.uleb128 0x57
-	.8byte	.LBB1381
-	.8byte	.LBE1381-.LBB1381
+	.8byte	.LBB1407
+	.8byte	.LBE1407-.LBB1407
 	.uleb128 0x58
-	.4byte	0x12f46
+	.4byte	0x1304a
 	.uleb128 0x61
-	.4byte	0x12f52
+	.4byte	0x13056
 	.4byte	.LLST145
 	.uleb128 0x58
-	.4byte	0x12f5e
+	.4byte	0x13062
 	.uleb128 0x58
-	.4byte	0x12f6a
+	.4byte	0x1306e
 	.uleb128 0x58
-	.4byte	0x12f76
+	.4byte	0x1307a
 	.uleb128 0x58
-	.4byte	0x12f82
+	.4byte	0x13086
 	.uleb128 0x61
-	.4byte	0x12f8e
+	.4byte	0x13092
 	.4byte	.LLST146
 	.uleb128 0x61
-	.4byte	0x12f9a
+	.4byte	0x1309e
 	.4byte	.LLST147
 	.uleb128 0x58
-	.4byte	0x12fa6
+	.4byte	0x130aa
 	.uleb128 0x61
-	.4byte	0x12fb2
+	.4byte	0x130b6
 	.4byte	.LLST148
 	.uleb128 0x58
-	.4byte	0x12fbc
+	.4byte	0x130c0
 	.uleb128 0x61
-	.4byte	0x12fc6
+	.4byte	0x130ca
 	.4byte	.LLST149
 	.uleb128 0x61
-	.4byte	0x12fd2
+	.4byte	0x130d6
 	.4byte	.LLST150
 	.uleb128 0x58
-	.4byte	0x12fde
+	.4byte	0x130e2
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x131bb
-	.8byte	.LBB1382
+	.4byte	0x132bf
+	.8byte	.LBB1408
 	.4byte	.Ldebug_ranges0+0x9c0
 	.byte	0x1
 	.2byte	0x5b9
-	.4byte	0x12c25
+	.4byte	0x12d29
 	.uleb128 0x55
-	.4byte	0x131ec
+	.4byte	0x132f0
 	.uleb128 0x55
-	.4byte	0x131ec
+	.4byte	0x132f0
 	.uleb128 0x55
-	.4byte	0x131ec
+	.4byte	0x132f0
 	.uleb128 0x55
-	.4byte	0x131e0
+	.4byte	0x132e4
 	.uleb128 0x55
-	.4byte	0x131d4
+	.4byte	0x132d8
 	.uleb128 0x55
-	.4byte	0x131c8
+	.4byte	0x132cc
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x9c0
 	.uleb128 0x58
-	.4byte	0x131f8
+	.4byte	0x132fc
 	.uleb128 0x61
-	.4byte	0x13204
+	.4byte	0x13308
 	.4byte	.LLST151
 	.uleb128 0x61
-	.4byte	0x13210
+	.4byte	0x13314
 	.4byte	.LLST152
 	.uleb128 0x61
-	.4byte	0x1321c
+	.4byte	0x13320
 	.4byte	.LLST153
 	.uleb128 0x61
-	.4byte	0x13228
+	.4byte	0x1332c
 	.4byte	.LLST154
 	.uleb128 0x61
-	.4byte	0x13234
+	.4byte	0x13338
 	.4byte	.LLST155
 	.uleb128 0x61
-	.4byte	0x13240
+	.4byte	0x13344
 	.4byte	.LLST156
 	.uleb128 0x61
-	.4byte	0x1324c
+	.4byte	0x13350
 	.4byte	.LLST157
 	.uleb128 0x61
-	.4byte	0x13258
+	.4byte	0x1335c
 	.4byte	.LLST158
 	.uleb128 0x58
-	.4byte	0x13262
+	.4byte	0x13366
 	.uleb128 0x61
-	.4byte	0x1326c
+	.4byte	0x13370
 	.4byte	.LLST159
 	.uleb128 0x61
-	.4byte	0x13278
+	.4byte	0x1337c
 	.4byte	.LLST160
 	.uleb128 0x58
-	.4byte	0x13284
+	.4byte	0x13388
 	.uleb128 0x5c
-	.4byte	0x14441
-	.8byte	.LBB1384
+	.4byte	0x14546
+	.8byte	.LBB1410
 	.4byte	.Ldebug_ranges0+0xa00
 	.byte	0x1
 	.2byte	0x4de
-	.4byte	0x12b43
+	.4byte	0x12c47
 	.uleb128 0x55
-	.4byte	0x14469
+	.4byte	0x1456e
 	.uleb128 0x55
-	.4byte	0x1445d
+	.4byte	0x14562
 	.uleb128 0x55
-	.4byte	0x14451
+	.4byte	0x14556
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa00
 	.uleb128 0x58
-	.4byte	0x14475
+	.4byte	0x1457a
 	.uleb128 0x61
-	.4byte	0x14480
+	.4byte	0x14585
 	.4byte	.LLST161
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14441
-	.8byte	.LBB1387
-	.8byte	.LBE1387-.LBB1387
+	.4byte	0x14546
+	.8byte	.LBB1413
+	.8byte	.LBE1413-.LBB1413
 	.byte	0x1
 	.2byte	0x4db
-	.4byte	0x12b8f
+	.4byte	0x12c93
 	.uleb128 0x55
-	.4byte	0x14469
+	.4byte	0x1456e
 	.uleb128 0x55
-	.4byte	0x1445d
+	.4byte	0x14562
 	.uleb128 0x55
-	.4byte	0x14451
+	.4byte	0x14556
 	.uleb128 0x57
-	.8byte	.LBB1388
-	.8byte	.LBE1388-.LBB1388
+	.8byte	.LBB1414
+	.8byte	.LBE1414-.LBB1414
 	.uleb128 0x58
-	.4byte	0x14475
+	.4byte	0x1457a
 	.uleb128 0x61
-	.4byte	0x14480
+	.4byte	0x14585
 	.4byte	.LLST162
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14441
-	.8byte	.LBB1389
-	.8byte	.LBE1389-.LBB1389
+	.4byte	0x14546
+	.8byte	.LBB1415
+	.8byte	.LBE1415-.LBB1415
 	.byte	0x1
 	.2byte	0x4dc
-	.4byte	0x12bdb
+	.4byte	0x12cdf
 	.uleb128 0x55
-	.4byte	0x14469
+	.4byte	0x1456e
 	.uleb128 0x55
-	.4byte	0x1445d
+	.4byte	0x14562
 	.uleb128 0x55
-	.4byte	0x14451
+	.4byte	0x14556
 	.uleb128 0x57
-	.8byte	.LBB1390
-	.8byte	.LBE1390-.LBB1390
+	.8byte	.LBB1416
+	.8byte	.LBE1416-.LBB1416
 	.uleb128 0x58
-	.4byte	0x14475
+	.4byte	0x1457a
 	.uleb128 0x61
-	.4byte	0x14480
+	.4byte	0x14585
 	.4byte	.LLST163
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x14441
-	.8byte	.LBB1391
-	.8byte	.LBE1391-.LBB1391
+	.4byte	0x14546
+	.8byte	.LBB1417
+	.8byte	.LBE1417-.LBB1417
 	.byte	0x1
 	.2byte	0x4dd
 	.uleb128 0x55
-	.4byte	0x14469
+	.4byte	0x1456e
 	.uleb128 0x55
-	.4byte	0x1445d
+	.4byte	0x14562
 	.uleb128 0x55
-	.4byte	0x14451
+	.4byte	0x14556
 	.uleb128 0x57
-	.8byte	.LBB1392
-	.8byte	.LBE1392-.LBB1392
+	.8byte	.LBB1418
+	.8byte	.LBE1418-.LBB1418
 	.uleb128 0x58
-	.4byte	0x14475
+	.4byte	0x1457a
 	.uleb128 0x61
-	.4byte	0x14480
+	.4byte	0x14585
 	.4byte	.LLST164
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12feb
-	.8byte	.LBB1397
-	.8byte	.LBE1397-.LBB1397
+	.4byte	0x130ef
+	.8byte	.LBB1423
+	.8byte	.LBE1423-.LBB1423
 	.byte	0x1
 	.2byte	0x5be
-	.4byte	0x12cce
+	.4byte	0x12dd2
 	.uleb128 0x55
-	.4byte	0x1301c
+	.4byte	0x13120
 	.uleb128 0x55
-	.4byte	0x1301c
+	.4byte	0x13120
 	.uleb128 0x55
-	.4byte	0x1301c
+	.4byte	0x13120
 	.uleb128 0x55
-	.4byte	0x13010
+	.4byte	0x13114
 	.uleb128 0x72
-	.4byte	0x13004
+	.4byte	0x13108
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x12ff8
+	.4byte	0x130fc
 	.uleb128 0x57
-	.8byte	.LBB1398
-	.8byte	.LBE1398-.LBB1398
+	.8byte	.LBB1424
+	.8byte	.LBE1424-.LBB1424
 	.uleb128 0x58
-	.4byte	0x13028
+	.4byte	0x1312c
 	.uleb128 0x58
-	.4byte	0x13034
+	.4byte	0x13138
 	.uleb128 0x58
-	.4byte	0x13040
+	.4byte	0x13144
 	.uleb128 0x58
-	.4byte	0x1304c
+	.4byte	0x13150
 	.uleb128 0x58
-	.4byte	0x13058
+	.4byte	0x1315c
 	.uleb128 0x58
-	.4byte	0x13064
+	.4byte	0x13168
 	.uleb128 0x61
-	.4byte	0x13070
+	.4byte	0x13174
 	.4byte	.LLST165
 	.uleb128 0x61
-	.4byte	0x1307c
+	.4byte	0x13180
 	.4byte	.LLST166
 	.uleb128 0x58
-	.4byte	0x13088
+	.4byte	0x1318c
 	.uleb128 0x61
-	.4byte	0x13094
+	.4byte	0x13198
 	.4byte	.LLST167
 	.uleb128 0x58
-	.4byte	0x1309e
+	.4byte	0x131a2
 	.uleb128 0x61
-	.4byte	0x130a8
+	.4byte	0x131ac
 	.4byte	.LLST168
 	.uleb128 0x61
-	.4byte	0x130b4
+	.4byte	0x131b8
 	.4byte	.LLST169
 	.uleb128 0x58
-	.4byte	0x130c0
+	.4byte	0x131c4
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13291
-	.8byte	.LBB1399
+	.4byte	0x13395
+	.8byte	.LBB1425
 	.4byte	.Ldebug_ranges0+0xa30
 	.byte	0x1
 	.2byte	0x5bb
-	.4byte	0x12ddc
+	.4byte	0x12ee0
 	.uleb128 0x55
-	.4byte	0x132c2
+	.4byte	0x133c6
 	.uleb128 0x55
-	.4byte	0x132c2
+	.4byte	0x133c6
 	.uleb128 0x55
-	.4byte	0x132c2
+	.4byte	0x133c6
 	.uleb128 0x55
-	.4byte	0x132b6
+	.4byte	0x133ba
 	.uleb128 0x55
-	.4byte	0x132aa
+	.4byte	0x133ae
 	.uleb128 0x55
-	.4byte	0x1329e
+	.4byte	0x133a2
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa30
 	.uleb128 0x58
-	.4byte	0x132ce
+	.4byte	0x133d2
 	.uleb128 0x58
-	.4byte	0x132da
+	.4byte	0x133de
 	.uleb128 0x58
-	.4byte	0x132e6
+	.4byte	0x133ea
 	.uleb128 0x62
-	.4byte	0x132f2
+	.4byte	0x133f6
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x132fe
+	.4byte	0x13402
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x1330a
+	.4byte	0x1340e
 	.4byte	.LLST170
 	.uleb128 0x61
-	.4byte	0x13316
+	.4byte	0x1341a
 	.4byte	.LLST171
 	.uleb128 0x61
-	.4byte	0x13322
+	.4byte	0x13426
 	.4byte	.LLST172
 	.uleb128 0x61
-	.4byte	0x1332e
+	.4byte	0x13432
 	.4byte	.LLST173
 	.uleb128 0x58
-	.4byte	0x13338
+	.4byte	0x1343c
 	.uleb128 0x61
-	.4byte	0x13342
+	.4byte	0x13446
 	.4byte	.LLST174
 	.uleb128 0x61
-	.4byte	0x1334e
+	.4byte	0x13452
 	.4byte	.LLST175
 	.uleb128 0x58
-	.4byte	0x1335a
+	.4byte	0x1345e
 	.uleb128 0x5c
-	.4byte	0x14441
-	.8byte	.LBB1401
+	.4byte	0x14546
+	.8byte	.LBB1427
 	.4byte	.Ldebug_ranges0+0xa60
 	.byte	0x1
 	.2byte	0x4b3
-	.4byte	0x12da2
+	.4byte	0x12ea6
 	.uleb128 0x55
-	.4byte	0x14469
+	.4byte	0x1456e
 	.uleb128 0x55
-	.4byte	0x1445d
+	.4byte	0x14562
 	.uleb128 0x55
-	.4byte	0x14451
+	.4byte	0x14556
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa60
 	.uleb128 0x58
-	.4byte	0x14475
+	.4byte	0x1457a
 	.uleb128 0x61
-	.4byte	0x14480
+	.4byte	0x14585
 	.4byte	.LLST176
 	.byte	0
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x14441
-	.8byte	.LBB1408
+	.4byte	0x14546
+	.8byte	.LBB1434
 	.4byte	.Ldebug_ranges0+0xad0
 	.byte	0x1
 	.2byte	0x4b2
 	.uleb128 0x55
-	.4byte	0x14469
+	.4byte	0x1456e
 	.uleb128 0x55
-	.4byte	0x1445d
+	.4byte	0x14562
 	.uleb128 0x55
-	.4byte	0x14451
+	.4byte	0x14556
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xad0
 	.uleb128 0x58
-	.4byte	0x14475
+	.4byte	0x1457a
 	.uleb128 0x61
-	.4byte	0x14480
+	.4byte	0x14585
 	.4byte	.LLST177
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x130cd
-	.8byte	.LBB1426
-	.8byte	.LBE1426-.LBB1426
+	.4byte	0x131d1
+	.8byte	.LBB1452
+	.8byte	.LBE1452-.LBB1452
 	.byte	0x1
 	.2byte	0x5b5
 	.uleb128 0x55
-	.4byte	0x130fe
+	.4byte	0x13202
 	.uleb128 0x55
-	.4byte	0x130fe
+	.4byte	0x13202
 	.uleb128 0x55
-	.4byte	0x130fe
+	.4byte	0x13202
 	.uleb128 0x55
-	.4byte	0x130f2
+	.4byte	0x131f6
 	.uleb128 0x55
-	.4byte	0x130e6
+	.4byte	0x131ea
 	.uleb128 0x55
-	.4byte	0x130da
+	.4byte	0x131de
 	.uleb128 0x57
-	.8byte	.LBB1427
-	.8byte	.LBE1427-.LBB1427
+	.8byte	.LBB1453
+	.8byte	.LBE1453-.LBB1453
 	.uleb128 0x58
-	.4byte	0x1310a
+	.4byte	0x1320e
 	.uleb128 0x58
-	.4byte	0x13116
+	.4byte	0x1321a
 	.uleb128 0x58
-	.4byte	0x13122
+	.4byte	0x13226
 	.uleb128 0x62
-	.4byte	0x1312e
+	.4byte	0x13232
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x1313a
+	.4byte	0x1323e
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x13146
+	.4byte	0x1324a
 	.4byte	.LLST178
 	.uleb128 0x61
-	.4byte	0x13152
+	.4byte	0x13256
 	.4byte	.LLST179
 	.uleb128 0x61
-	.4byte	0x1315e
+	.4byte	0x13262
 	.4byte	.LLST180
 	.uleb128 0x61
-	.4byte	0x1316a
+	.4byte	0x1326e
 	.4byte	.LLST181
 	.uleb128 0x58
-	.4byte	0x13174
+	.4byte	0x13278
 	.uleb128 0x61
-	.4byte	0x1317e
+	.4byte	0x13282
 	.4byte	.LLST182
 	.uleb128 0x61
-	.4byte	0x1318a
+	.4byte	0x1328e
 	.4byte	.LLST183
 	.uleb128 0x58
-	.4byte	0x13196
+	.4byte	0x1329a
 	.uleb128 0x58
-	.4byte	0x131a2
+	.4byte	0x132a6
 	.uleb128 0x58
-	.4byte	0x131ae
+	.4byte	0x132b2
 	.uleb128 0x5c
-	.4byte	0x143f6
-	.8byte	.LBB1428
+	.4byte	0x144fb
+	.8byte	.LBB1454
 	.4byte	.Ldebug_ranges0+0xb30
 	.byte	0x1
 	.2byte	0x509
-	.4byte	0x12eca
+	.4byte	0x12fce
 	.uleb128 0x55
-	.4byte	0x1441e
+	.4byte	0x14523
 	.uleb128 0x55
-	.4byte	0x14412
+	.4byte	0x14517
 	.uleb128 0x55
-	.4byte	0x14406
+	.4byte	0x1450b
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xb30
 	.uleb128 0x61
-	.4byte	0x1442a
+	.4byte	0x1452f
 	.4byte	.LLST184
 	.uleb128 0x61
-	.4byte	0x14435
+	.4byte	0x1453a
 	.4byte	.LLST185
 	.byte	0
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x143f6
-	.8byte	.LBB1435
+	.4byte	0x144fb
+	.8byte	.LBB1461
 	.4byte	.Ldebug_ranges0+0xba0
 	.byte	0x1
 	.2byte	0x508
 	.uleb128 0x55
-	.4byte	0x1441e
+	.4byte	0x14523
 	.uleb128 0x55
-	.4byte	0x14412
+	.4byte	0x14517
 	.uleb128 0x55
-	.4byte	0x14406
+	.4byte	0x1450b
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xba0
 	.uleb128 0x61
-	.4byte	0x1442a
+	.4byte	0x1452f
 	.4byte	.LLST186
 	.uleb128 0x61
-	.4byte	0x14435
+	.4byte	0x1453a
 	.4byte	.LLST187
 	.byte	0
 	.byte	0
@@ -46168,23 +46336,23 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3138
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x561
 	.byte	0x1
-	.4byte	0x12feb
+	.4byte	0x130ef
 	.uleb128 0x66
-	.4byte	.LASF3135
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x561
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3136
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x562
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3137
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x562
 	.4byte	0xac0
@@ -46199,22 +46367,22 @@ __exitcall_ebc_exit:
 	.2byte	0x565
 	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3139
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x566
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x566
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x567
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x567
 	.4byte	0x110
@@ -46224,7 +46392,7 @@ __exitcall_ebc_exit:
 	.2byte	0x567
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3143
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x568
 	.4byte	0xc138
@@ -46249,7 +46417,7 @@ __exitcall_ebc_exit:
 	.2byte	0x56a
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3144
+	.4byte	.LASF3145
 	.byte	0x1
 	.2byte	0x56b
 	.4byte	0xc6
@@ -46265,23 +46433,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3145
+	.4byte	.LASF3146
 	.byte	0x1
 	.2byte	0x513
 	.byte	0x1
-	.4byte	0x130cd
+	.4byte	0x131d1
 	.uleb128 0x66
-	.4byte	.LASF3135
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x513
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3136
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x514
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3137
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x514
 	.4byte	0xac0
@@ -46296,22 +46464,22 @@ __exitcall_ebc_exit:
 	.2byte	0x517
 	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3139
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x518
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x518
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x519
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x519
 	.4byte	0x110
@@ -46321,7 +46489,7 @@ __exitcall_ebc_exit:
 	.2byte	0x519
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3143
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x51a
 	.4byte	0xc138
@@ -46346,7 +46514,7 @@ __exitcall_ebc_exit:
 	.2byte	0x51c
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3144
+	.4byte	.LASF3145
 	.byte	0x1
 	.2byte	0x51d
 	.4byte	0xc6
@@ -46362,23 +46530,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3146
+	.4byte	.LASF3147
 	.byte	0x1
 	.2byte	0x4e9
 	.byte	0x1
-	.4byte	0x131bb
+	.4byte	0x132bf
 	.uleb128 0x66
-	.4byte	.LASF3135
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x4e9
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3136
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x4ea
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3137
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x4ea
 	.4byte	0xac0
@@ -46393,27 +46561,27 @@ __exitcall_ebc_exit:
 	.2byte	0x4ed
 	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x4ee
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x4ee
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3139
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x4ee
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x4ee
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3143
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x4ef
 	.4byte	0xc138
@@ -46438,7 +46606,7 @@ __exitcall_ebc_exit:
 	.2byte	0x4f1
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3144
+	.4byte	.LASF3145
 	.byte	0x1
 	.2byte	0x4f2
 	.4byte	0xc6
@@ -46453,34 +46621,34 @@ __exitcall_ebc_exit:
 	.2byte	0x4f4
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3147
+	.4byte	.LASF3148
 	.byte	0x1
 	.2byte	0x4f5
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3148
+	.4byte	.LASF3149
 	.byte	0x1
 	.2byte	0x4f6
 	.4byte	0x110
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3149
+	.4byte	.LASF3150
 	.byte	0x1
 	.2byte	0x4be
 	.byte	0x1
-	.4byte	0x13291
+	.4byte	0x13395
 	.uleb128 0x66
-	.4byte	.LASF3135
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x4be
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3136
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x4bf
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3137
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x4bf
 	.4byte	0xac0
@@ -46495,27 +46663,27 @@ __exitcall_ebc_exit:
 	.2byte	0x4c2
 	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x4c3
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x4c3
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3139
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x4c3
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x4c3
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3143
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x4c4
 	.4byte	0xc138
@@ -46540,7 +46708,7 @@ __exitcall_ebc_exit:
 	.2byte	0x4c6
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3144
+	.4byte	.LASF3145
 	.byte	0x1
 	.2byte	0x4c7
 	.4byte	0xc6
@@ -46556,23 +46724,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3150
+	.4byte	.LASF3151
 	.byte	0x1
 	.2byte	0x495
 	.byte	0x1
-	.4byte	0x13367
+	.4byte	0x1346b
 	.uleb128 0x66
-	.4byte	.LASF3135
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x495
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3136
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x496
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3137
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x496
 	.4byte	0xac0
@@ -46587,27 +46755,27 @@ __exitcall_ebc_exit:
 	.2byte	0x499
 	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x49a
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x49a
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3139
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x49a
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x49a
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3143
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x49b
 	.4byte	0xc138
@@ -46632,7 +46800,7 @@ __exitcall_ebc_exit:
 	.2byte	0x49d
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3144
+	.4byte	.LASF3145
 	.byte	0x1
 	.2byte	0x49e
 	.4byte	0xc6
@@ -46648,29 +46816,29 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3151
+	.4byte	.LASF3152
 	.byte	0x1
 	.2byte	0x47f
 	.8byte	.LFB2822
 	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13862
-	.uleb128 0x75
-	.4byte	.LASF3135
+	.4byte	0x13966
+	.uleb128 0x76
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x47f
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x59
-	.4byte	.LASF3136
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x480
 	.4byte	0xac0
 	.4byte	.LLST105
 	.uleb128 0x59
-	.4byte	.LASF3137
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x480
 	.4byte	0xac0
@@ -46682,436 +46850,436 @@ __exitcall_ebc_exit:
 	.4byte	0xe874
 	.4byte	.LLST107
 	.uleb128 0x54
-	.4byte	0x13862
-	.8byte	.LBB1266
-	.8byte	.LBE1266-.LBB1266
+	.4byte	0x13966
+	.8byte	.LBB1292
+	.8byte	.LBE1292-.LBB1292
 	.byte	0x1
 	.2byte	0x490
-	.4byte	0x13470
+	.4byte	0x13574
 	.uleb128 0x55
-	.4byte	0x13893
+	.4byte	0x13997
 	.uleb128 0x55
-	.4byte	0x13893
+	.4byte	0x13997
 	.uleb128 0x55
-	.4byte	0x13893
+	.4byte	0x13997
 	.uleb128 0x55
-	.4byte	0x13887
+	.4byte	0x1398b
 	.uleb128 0x72
-	.4byte	0x1387b
+	.4byte	0x1397f
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x1386f
+	.4byte	0x13973
 	.uleb128 0x57
-	.8byte	.LBB1267
-	.8byte	.LBE1267-.LBB1267
+	.8byte	.LBB1293
+	.8byte	.LBE1293-.LBB1293
 	.uleb128 0x58
-	.4byte	0x1389f
+	.4byte	0x139a3
 	.uleb128 0x61
-	.4byte	0x138ab
+	.4byte	0x139af
 	.4byte	.LLST108
 	.uleb128 0x58
-	.4byte	0x138b7
+	.4byte	0x139bb
 	.uleb128 0x58
-	.4byte	0x138c3
+	.4byte	0x139c7
 	.uleb128 0x58
-	.4byte	0x138cf
+	.4byte	0x139d3
 	.uleb128 0x58
-	.4byte	0x138db
+	.4byte	0x139df
 	.uleb128 0x61
-	.4byte	0x138e7
+	.4byte	0x139eb
 	.4byte	.LLST109
 	.uleb128 0x61
-	.4byte	0x138f3
+	.4byte	0x139f7
 	.4byte	.LLST110
 	.uleb128 0x58
-	.4byte	0x138ff
+	.4byte	0x13a03
 	.uleb128 0x61
-	.4byte	0x1390b
+	.4byte	0x13a0f
 	.4byte	.LLST111
 	.uleb128 0x58
-	.4byte	0x13915
+	.4byte	0x13a19
 	.uleb128 0x61
-	.4byte	0x1391f
+	.4byte	0x13a23
 	.4byte	.LLST112
 	.uleb128 0x61
-	.4byte	0x1392b
+	.4byte	0x13a2f
 	.4byte	.LLST113
 	.uleb128 0x58
-	.4byte	0x13937
+	.4byte	0x13a3b
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13bea
-	.8byte	.LBB1268
-	.8byte	.LBE1268-.LBB1268
+	.4byte	0x13cee
+	.8byte	.LBB1294
+	.8byte	.LBE1294-.LBB1294
 	.byte	0x1
 	.2byte	0x489
-	.4byte	0x135be
+	.4byte	0x136c2
 	.uleb128 0x55
-	.4byte	0x13c1b
+	.4byte	0x13d1f
 	.uleb128 0x55
-	.4byte	0x13c1b
+	.4byte	0x13d1f
 	.uleb128 0x55
-	.4byte	0x13c1b
+	.4byte	0x13d1f
 	.uleb128 0x55
-	.4byte	0x13c0f
+	.4byte	0x13d13
 	.uleb128 0x55
-	.4byte	0x13c03
+	.4byte	0x13d07
 	.uleb128 0x55
-	.4byte	0x13bf7
+	.4byte	0x13cfb
 	.uleb128 0x57
-	.8byte	.LBB1269
-	.8byte	.LBE1269-.LBB1269
+	.8byte	.LBB1295
+	.8byte	.LBE1295-.LBB1295
 	.uleb128 0x58
-	.4byte	0x13c27
+	.4byte	0x13d2b
 	.uleb128 0x61
-	.4byte	0x13c33
+	.4byte	0x13d37
 	.4byte	.LLST114
 	.uleb128 0x58
-	.4byte	0x13c3d
+	.4byte	0x13d41
 	.uleb128 0x61
-	.4byte	0x13c47
+	.4byte	0x13d4b
 	.4byte	.LLST115
 	.uleb128 0x58
-	.4byte	0x13c53
+	.4byte	0x13d57
 	.uleb128 0x61
-	.4byte	0x13c5f
+	.4byte	0x13d63
 	.4byte	.LLST116
 	.uleb128 0x61
-	.4byte	0x13c6b
+	.4byte	0x13d6f
 	.4byte	.LLST117
 	.uleb128 0x61
-	.4byte	0x13c77
+	.4byte	0x13d7b
 	.4byte	.LLST118
 	.uleb128 0x61
-	.4byte	0x13c83
+	.4byte	0x13d87
 	.4byte	.LLST119
 	.uleb128 0x61
-	.4byte	0x13c8f
+	.4byte	0x13d93
 	.4byte	.LLST120
 	.uleb128 0x61
-	.4byte	0x13c9b
+	.4byte	0x13d9f
 	.4byte	.LLST121
 	.uleb128 0x61
-	.4byte	0x13ca7
+	.4byte	0x13dab
 	.4byte	.LLST122
 	.uleb128 0x58
-	.4byte	0x13cb3
+	.4byte	0x13db7
 	.uleb128 0x5c
-	.4byte	0x144c1
-	.8byte	.LBB1270
+	.4byte	0x145c6
+	.8byte	.LBB1296
 	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
 	.2byte	0x39c
-	.4byte	0x13548
+	.4byte	0x1364c
 	.uleb128 0x55
-	.4byte	0x144e9
+	.4byte	0x145ee
 	.uleb128 0x55
-	.4byte	0x144dd
+	.4byte	0x145e2
 	.uleb128 0x55
-	.4byte	0x144d1
+	.4byte	0x145d6
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x144c1
-	.8byte	.LBB1275
+	.4byte	0x145c6
+	.8byte	.LBB1301
 	.4byte	.Ldebug_ranges0+0x720
 	.byte	0x1
 	.2byte	0x39d
-	.4byte	0x13570
+	.4byte	0x13674
 	.uleb128 0x55
-	.4byte	0x144e9
+	.4byte	0x145ee
 	.uleb128 0x55
-	.4byte	0x144dd
+	.4byte	0x145e2
 	.uleb128 0x55
-	.4byte	0x144d1
+	.4byte	0x145d6
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x144c1
-	.8byte	.LBB1287
+	.4byte	0x145c6
+	.8byte	.LBB1313
 	.4byte	.Ldebug_ranges0+0x790
 	.byte	0x1
 	.2byte	0x39e
-	.4byte	0x13598
+	.4byte	0x1369c
 	.uleb128 0x55
-	.4byte	0x144e9
+	.4byte	0x145ee
 	.uleb128 0x55
-	.4byte	0x144dd
+	.4byte	0x145e2
 	.uleb128 0x55
-	.4byte	0x144d1
+	.4byte	0x145d6
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x144c1
-	.8byte	.LBB1299
+	.4byte	0x145c6
+	.8byte	.LBB1325
 	.4byte	.Ldebug_ranges0+0x800
 	.byte	0x1
 	.2byte	0x39f
 	.uleb128 0x55
-	.4byte	0x144e9
+	.4byte	0x145ee
 	.uleb128 0x55
-	.4byte	0x144dd
+	.4byte	0x145e2
 	.uleb128 0x55
-	.4byte	0x144d1
+	.4byte	0x145d6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13944
-	.8byte	.LBB1310
-	.8byte	.LBE1310-.LBB1310
+	.4byte	0x13a48
+	.8byte	.LBB1336
+	.8byte	.LBE1336-.LBB1336
 	.byte	0x1
 	.2byte	0x48e
-	.4byte	0x13667
+	.4byte	0x1376b
 	.uleb128 0x55
-	.4byte	0x13975
+	.4byte	0x13a79
 	.uleb128 0x55
-	.4byte	0x13975
+	.4byte	0x13a79
 	.uleb128 0x55
-	.4byte	0x13975
+	.4byte	0x13a79
 	.uleb128 0x55
-	.4byte	0x13969
+	.4byte	0x13a6d
 	.uleb128 0x72
-	.4byte	0x1395d
+	.4byte	0x13a61
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x13951
+	.4byte	0x13a55
 	.uleb128 0x57
-	.8byte	.LBB1311
-	.8byte	.LBE1311-.LBB1311
+	.8byte	.LBB1337
+	.8byte	.LBE1337-.LBB1337
 	.uleb128 0x58
-	.4byte	0x13981
+	.4byte	0x13a85
 	.uleb128 0x58
-	.4byte	0x1398d
+	.4byte	0x13a91
 	.uleb128 0x58
-	.4byte	0x13999
+	.4byte	0x13a9d
 	.uleb128 0x58
-	.4byte	0x139a5
+	.4byte	0x13aa9
 	.uleb128 0x58
-	.4byte	0x139b1
+	.4byte	0x13ab5
 	.uleb128 0x58
-	.4byte	0x139bd
+	.4byte	0x13ac1
 	.uleb128 0x61
-	.4byte	0x139c9
+	.4byte	0x13acd
 	.4byte	.LLST123
 	.uleb128 0x61
-	.4byte	0x139d5
+	.4byte	0x13ad9
 	.4byte	.LLST124
 	.uleb128 0x58
-	.4byte	0x139e1
+	.4byte	0x13ae5
 	.uleb128 0x61
-	.4byte	0x139ed
+	.4byte	0x13af1
 	.4byte	.LLST125
 	.uleb128 0x58
-	.4byte	0x139f7
+	.4byte	0x13afb
 	.uleb128 0x61
-	.4byte	0x13a01
+	.4byte	0x13b05
 	.4byte	.LLST126
 	.uleb128 0x61
-	.4byte	0x13a0d
+	.4byte	0x13b11
 	.4byte	.LLST127
 	.uleb128 0x58
-	.4byte	0x13a19
+	.4byte	0x13b1d
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13b14
-	.8byte	.LBB1312
-	.8byte	.LBE1312-.LBB1312
+	.4byte	0x13c18
+	.8byte	.LBB1338
+	.8byte	.LBE1338-.LBB1338
 	.byte	0x1
 	.2byte	0x48b
-	.4byte	0x13761
+	.4byte	0x13865
 	.uleb128 0x55
-	.4byte	0x13b45
+	.4byte	0x13c49
 	.uleb128 0x55
-	.4byte	0x13b45
+	.4byte	0x13c49
 	.uleb128 0x55
-	.4byte	0x13b45
+	.4byte	0x13c49
 	.uleb128 0x55
-	.4byte	0x13b39
+	.4byte	0x13c3d
 	.uleb128 0x55
-	.4byte	0x13b2d
+	.4byte	0x13c31
 	.uleb128 0x55
-	.4byte	0x13b21
+	.4byte	0x13c25
 	.uleb128 0x57
-	.8byte	.LBB1313
-	.8byte	.LBE1313-.LBB1313
+	.8byte	.LBB1339
+	.8byte	.LBE1339-.LBB1339
 	.uleb128 0x58
-	.4byte	0x13b51
+	.4byte	0x13c55
 	.uleb128 0x61
-	.4byte	0x13b5d
+	.4byte	0x13c61
 	.4byte	.LLST128
 	.uleb128 0x58
-	.4byte	0x13b67
+	.4byte	0x13c6b
 	.uleb128 0x61
-	.4byte	0x13b71
+	.4byte	0x13c75
 	.4byte	.LLST129
 	.uleb128 0x61
-	.4byte	0x13b7d
+	.4byte	0x13c81
 	.4byte	.LLST130
 	.uleb128 0x61
-	.4byte	0x13b89
+	.4byte	0x13c8d
 	.4byte	.LLST131
 	.uleb128 0x58
-	.4byte	0x13b95
+	.4byte	0x13c99
 	.uleb128 0x62
-	.4byte	0x13ba1
+	.4byte	0x13ca5
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x13bad
+	.4byte	0x13cb1
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x13bb9
+	.4byte	0x13cbd
 	.4byte	.LLST132
 	.uleb128 0x61
-	.4byte	0x13bc5
+	.4byte	0x13cc9
 	.4byte	.LLST133
 	.uleb128 0x61
-	.4byte	0x13bd1
+	.4byte	0x13cd5
 	.4byte	.LLST134
 	.uleb128 0x58
-	.4byte	0x13bdd
+	.4byte	0x13ce1
 	.uleb128 0x5c
-	.4byte	0x144c1
-	.8byte	.LBB1314
+	.4byte	0x145c6
+	.8byte	.LBB1340
 	.4byte	.Ldebug_ranges0+0x850
 	.byte	0x1
 	.2byte	0x3c4
-	.4byte	0x1373b
+	.4byte	0x1383f
 	.uleb128 0x55
-	.4byte	0x144e9
+	.4byte	0x145ee
 	.uleb128 0x55
-	.4byte	0x144dd
+	.4byte	0x145e2
 	.uleb128 0x55
-	.4byte	0x144d1
+	.4byte	0x145d6
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x144c1
-	.8byte	.LBB1321
+	.4byte	0x145c6
+	.8byte	.LBB1347
 	.4byte	.Ldebug_ranges0+0x8b0
 	.byte	0x1
 	.2byte	0x3c5
 	.uleb128 0x55
-	.4byte	0x144e9
+	.4byte	0x145ee
 	.uleb128 0x55
-	.4byte	0x144dd
+	.4byte	0x145e2
 	.uleb128 0x55
-	.4byte	0x144d1
+	.4byte	0x145d6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x13a26
-	.8byte	.LBB1332
-	.8byte	.LBE1332-.LBB1332
+	.4byte	0x13b2a
+	.8byte	.LBB1358
+	.8byte	.LBE1358-.LBB1358
 	.byte	0x1
 	.2byte	0x485
 	.uleb128 0x55
-	.4byte	0x13a57
+	.4byte	0x13b5b
 	.uleb128 0x55
-	.4byte	0x13a57
+	.4byte	0x13b5b
 	.uleb128 0x55
-	.4byte	0x13a57
+	.4byte	0x13b5b
 	.uleb128 0x55
-	.4byte	0x13a4b
+	.4byte	0x13b4f
 	.uleb128 0x55
-	.4byte	0x13a3f
+	.4byte	0x13b43
 	.uleb128 0x55
-	.4byte	0x13a33
+	.4byte	0x13b37
 	.uleb128 0x57
-	.8byte	.LBB1333
-	.8byte	.LBE1333-.LBB1333
+	.8byte	.LBB1359
+	.8byte	.LBE1359-.LBB1359
 	.uleb128 0x58
-	.4byte	0x13a63
+	.4byte	0x13b67
 	.uleb128 0x61
-	.4byte	0x13a6f
+	.4byte	0x13b73
 	.4byte	.LLST135
 	.uleb128 0x58
-	.4byte	0x13a79
+	.4byte	0x13b7d
 	.uleb128 0x61
-	.4byte	0x13a83
+	.4byte	0x13b87
 	.4byte	.LLST136
 	.uleb128 0x61
-	.4byte	0x13a8f
+	.4byte	0x13b93
 	.4byte	.LLST137
 	.uleb128 0x61
-	.4byte	0x13a9b
+	.4byte	0x13b9f
 	.4byte	.LLST138
 	.uleb128 0x58
-	.4byte	0x13aa7
+	.4byte	0x13bab
 	.uleb128 0x62
-	.4byte	0x13ab3
+	.4byte	0x13bb7
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x13abf
+	.4byte	0x13bc3
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x13acb
+	.4byte	0x13bcf
 	.4byte	.LLST139
 	.uleb128 0x61
-	.4byte	0x13ad7
+	.4byte	0x13bdb
 	.4byte	.LLST140
 	.uleb128 0x61
-	.4byte	0x13ae3
+	.4byte	0x13be7
 	.4byte	.LLST141
 	.uleb128 0x58
-	.4byte	0x13aef
+	.4byte	0x13bf3
 	.uleb128 0x58
-	.4byte	0x13afb
+	.4byte	0x13bff
 	.uleb128 0x58
-	.4byte	0x13b07
+	.4byte	0x13c0b
 	.uleb128 0x5c
-	.4byte	0x1448c
-	.8byte	.LBB1334
+	.4byte	0x14591
+	.8byte	.LBB1360
 	.4byte	.Ldebug_ranges0+0x900
 	.byte	0x1
 	.2byte	0x3eb
-	.4byte	0x1383b
+	.4byte	0x1393f
 	.uleb128 0x55
-	.4byte	0x144b4
+	.4byte	0x145b9
 	.uleb128 0x55
-	.4byte	0x144a8
+	.4byte	0x145ad
 	.uleb128 0x55
-	.4byte	0x1449c
+	.4byte	0x145a1
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x1448c
-	.8byte	.LBB1340
+	.4byte	0x14591
+	.8byte	.LBB1366
 	.4byte	.Ldebug_ranges0+0x960
 	.byte	0x1
 	.2byte	0x3ec
 	.uleb128 0x55
-	.4byte	0x144b4
+	.4byte	0x145b9
 	.uleb128 0x55
-	.4byte	0x144a8
+	.4byte	0x145ad
 	.uleb128 0x55
-	.4byte	0x1449c
+	.4byte	0x145a1
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3152
+	.4byte	.LASF3153
 	.byte	0x1
 	.2byte	0x438
 	.byte	0x1
-	.4byte	0x13944
+	.4byte	0x13a48
 	.uleb128 0x66
-	.4byte	.LASF3135
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x438
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3136
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x439
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3137
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x439
 	.4byte	0xac0
@@ -47126,22 +47294,22 @@ __exitcall_ebc_exit:
 	.2byte	0x43c
 	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3139
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x43d
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x43d
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x43e
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x43e
 	.4byte	0x110
@@ -47151,7 +47319,7 @@ __exitcall_ebc_exit:
 	.2byte	0x43e
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3143
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x43f
 	.4byte	0xc138
@@ -47176,7 +47344,7 @@ __exitcall_ebc_exit:
 	.2byte	0x441
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3144
+	.4byte	.LASF3145
 	.byte	0x1
 	.2byte	0x442
 	.4byte	0xc6
@@ -47192,23 +47360,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3153
+	.4byte	.LASF3154
 	.byte	0x1
 	.2byte	0x3f2
 	.byte	0x1
-	.4byte	0x13a26
+	.4byte	0x13b2a
 	.uleb128 0x66
-	.4byte	.LASF3135
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x3f2
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3136
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x3f3
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3137
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x3f3
 	.4byte	0xac0
@@ -47223,22 +47391,22 @@ __exitcall_ebc_exit:
 	.2byte	0x3f6
 	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3139
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x3f7
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x3f7
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x3f8
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x3f8
 	.4byte	0x110
@@ -47248,7 +47416,7 @@ __exitcall_ebc_exit:
 	.2byte	0x3f8
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3143
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x3f9
 	.4byte	0xc138
@@ -47273,7 +47441,7 @@ __exitcall_ebc_exit:
 	.2byte	0x3fb
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3144
+	.4byte	.LASF3145
 	.byte	0x1
 	.2byte	0x3fc
 	.4byte	0xc6
@@ -47289,23 +47457,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3154
+	.4byte	.LASF3155
 	.byte	0x1
 	.2byte	0x3cb
 	.byte	0x1
-	.4byte	0x13b14
+	.4byte	0x13c18
 	.uleb128 0x66
-	.4byte	.LASF3135
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x3cb
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3136
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x3cc
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3137
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x3cc
 	.4byte	0xac0
@@ -47340,32 +47508,32 @@ __exitcall_ebc_exit:
 	.2byte	0x3d2
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x3d3
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x3d3
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3139
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x3d3
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x3d3
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3143
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x3d4
 	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF3144
+	.4byte	.LASF3145
 	.byte	0x1
 	.2byte	0x3d5
 	.4byte	0xc6
@@ -47380,34 +47548,34 @@ __exitcall_ebc_exit:
 	.2byte	0x3d7
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3147
+	.4byte	.LASF3148
 	.byte	0x1
 	.2byte	0x3d8
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3148
+	.4byte	.LASF3149
 	.byte	0x1
 	.2byte	0x3d9
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3155
+	.4byte	.LASF3156
 	.byte	0x1
 	.2byte	0x3a6
 	.byte	0x1
-	.4byte	0x13bea
+	.4byte	0x13cee
 	.uleb128 0x66
-	.4byte	.LASF3135
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x3a6
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3136
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x3a7
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3137
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x3a7
 	.4byte	0xac0
@@ -47442,32 +47610,32 @@ __exitcall_ebc_exit:
 	.2byte	0x3ad
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x3ae
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x3ae
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3139
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x3ae
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x3ae
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3143
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x3af
 	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF3144
+	.4byte	.LASF3145
 	.byte	0x1
 	.2byte	0x3b0
 	.4byte	0xc6
@@ -47483,23 +47651,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3156
+	.4byte	.LASF3157
 	.byte	0x1
 	.2byte	0x37e
 	.byte	0x1
-	.4byte	0x13cc0
+	.4byte	0x13dc4
 	.uleb128 0x66
-	.4byte	.LASF3135
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x37e
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3136
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x37f
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3137
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x37f
 	.4byte	0xac0
@@ -47534,32 +47702,32 @@ __exitcall_ebc_exit:
 	.2byte	0x385
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x386
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x386
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3139
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x386
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x386
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3143
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x387
 	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF3144
+	.4byte	.LASF3145
 	.byte	0x1
 	.2byte	0x388
 	.4byte	0xc6
@@ -47575,43 +47743,43 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3157
+	.4byte	.LASF3158
 	.byte	0x1
 	.2byte	0x2b0
 	.8byte	.LFB2816
 	.8byte	.LFE2816-.LFB2816
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13e21
-	.uleb128 0x75
-	.4byte	.LASF3135
+	.4byte	0x13f25
+	.uleb128 0x76
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x2b0
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
-	.uleb128 0x75
-	.4byte	.LASF3136
+	.uleb128 0x76
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x2b0
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
-	.uleb128 0x75
-	.4byte	.LASF3137
+	.uleb128 0x76
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x2b0
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
-	.uleb128 0x75
-	.4byte	.LASF3158
+	.uleb128 0x76
+	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x2b1
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
-	.uleb128 0x75
+	.uleb128 0x76
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x2b1
@@ -47650,38 +47818,38 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x5a
-	.4byte	.LASF3141
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x2b8
 	.4byte	0x13f
 	.4byte	.LLST6
 	.uleb128 0x5a
-	.4byte	.LASF3142
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x2b8
 	.4byte	0x13f
 	.4byte	.LLST7
 	.uleb128 0x48
-	.4byte	.LASF3159
+	.4byte	.LASF3160
 	.byte	0x1
 	.2byte	0x2b8
 	.4byte	0x13f
 	.uleb128 0x4d
-	.4byte	.LASF3139
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x2b9
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4d
-	.4byte	.LASF3140
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x2b9
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5a
-	.4byte	.LASF3143
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x2ba
 	.4byte	0xc138
@@ -47692,14 +47860,14 @@ __exitcall_ebc_exit:
 	.2byte	0x2bb
 	.4byte	0x110
 	.uleb128 0x4d
-	.4byte	.LASF3160
+	.4byte	.LASF3161
 	.byte	0x1
 	.2byte	0x2bc
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x48
-	.4byte	.LASF3161
+	.4byte	.LASF3162
 	.byte	0x1
 	.2byte	0x2bd
 	.4byte	0x110
@@ -47714,60 +47882,60 @@ __exitcall_ebc_exit:
 	.2byte	0x2bf
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3162
+	.4byte	.LASF3163
 	.byte	0x1
 	.2byte	0x2c0
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3163
+	.4byte	.LASF3164
 	.byte	0x1
 	.2byte	0x2c0
 	.4byte	0x110
 	.uleb128 0x5a
-	.4byte	.LASF3164
+	.4byte	.LASF3165
 	.byte	0x1
 	.2byte	0x2c1
 	.4byte	0x13f
 	.4byte	.LLST9
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3165
+	.4byte	.LASF3166
 	.byte	0x1
 	.2byte	0x20b
 	.8byte	.LFB2815
 	.8byte	.LFE2815-.LFB2815
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13f7c
-	.uleb128 0x75
-	.4byte	.LASF3135
+	.4byte	0x14080
+	.uleb128 0x76
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x20b
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
-	.uleb128 0x75
-	.4byte	.LASF3136
+	.uleb128 0x76
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x20b
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
-	.uleb128 0x75
-	.4byte	.LASF3137
+	.uleb128 0x76
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x20b
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
-	.uleb128 0x75
-	.4byte	.LASF3158
+	.uleb128 0x76
+	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x20c
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
-	.uleb128 0x75
+	.uleb128 0x76
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x20c
@@ -47804,33 +47972,33 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.4byte	.LLST1
 	.uleb128 0x5a
-	.4byte	.LASF3141
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x213
 	.4byte	0x13f
 	.4byte	.LLST2
 	.uleb128 0x5a
-	.4byte	.LASF3142
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x213
 	.4byte	0x13f
 	.4byte	.LLST3
 	.uleb128 0x4d
-	.4byte	.LASF3139
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x214
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4d
-	.4byte	.LASF3140
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x214
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5a
-	.4byte	.LASF3143
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x215
 	.4byte	0xc138
@@ -47843,14 +48011,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x4d
-	.4byte	.LASF3160
+	.4byte	.LASF3161
 	.byte	0x1
 	.2byte	0x217
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x48
-	.4byte	.LASF3161
+	.4byte	.LASF3162
 	.byte	0x1
 	.2byte	0x218
 	.4byte	0x110
@@ -47865,45 +48033,45 @@ __exitcall_ebc_exit:
 	.2byte	0x21a
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3162
+	.4byte	.LASF3163
 	.byte	0x1
 	.2byte	0x21b
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3163
+	.4byte	.LASF3164
 	.byte	0x1
 	.2byte	0x21b
 	.4byte	0x110
 	.uleb128 0x5a
-	.4byte	.LASF3164
+	.4byte	.LASF3165
 	.byte	0x1
 	.2byte	0x21c
 	.4byte	0x13f
 	.4byte	.LLST5
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3166
+	.4byte	.LASF3167
 	.byte	0x1
 	.2byte	0x1ac
 	.byte	0x1
-	.4byte	0x1409a
+	.4byte	0x1419e
 	.uleb128 0x66
-	.4byte	.LASF3167
+	.4byte	.LASF3168
 	.byte	0x1
 	.2byte	0x1ac
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3168
+	.4byte	.LASF3169
 	.byte	0x1
 	.2byte	0x1ac
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3169
+	.4byte	.LASF3170
 	.byte	0x1
 	.2byte	0x1ac
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3158
+	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x1ac
 	.4byte	0x46f4
@@ -47928,47 +48096,47 @@ __exitcall_ebc_exit:
 	.2byte	0x1af
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3170
+	.4byte	.LASF3171
 	.byte	0x1
 	.2byte	0x1b0
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3171
+	.4byte	.LASF3172
 	.byte	0x1
 	.2byte	0x1b0
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3172
+	.4byte	.LASF3173
 	.byte	0x1
 	.2byte	0x1b0
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3173
+	.4byte	.LASF3174
 	.byte	0x1
 	.2byte	0x1b1
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3174
+	.4byte	.LASF3175
 	.byte	0x1
 	.2byte	0x1b1
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3175
+	.4byte	.LASF3176
 	.byte	0x1
 	.2byte	0x1b1
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3161
+	.4byte	.LASF3162
 	.byte	0x1
 	.2byte	0x1b2
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3160
+	.4byte	.LASF3161
 	.byte	0x1
 	.2byte	0x1b3
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3176
+	.4byte	.LASF3177
 	.byte	0x1
 	.2byte	0x1b4
 	.4byte	0x13f
@@ -48003,15 +48171,15 @@ __exitcall_ebc_exit:
 	.2byte	0x1ba
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x76
-	.4byte	.LASF3177
+	.uleb128 0x77
+	.4byte	.LASF3178
 	.byte	0x1
 	.2byte	0x18e
 	.8byte	.LFB2813
 	.8byte	.LFE2813-.LFB2813
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14144
+	.4byte	0x14248
 	.uleb128 0x59
 	.4byte	.LASF2288
 	.byte	0x1
@@ -48032,51 +48200,51 @@ __exitcall_ebc_exit:
 	.4byte	.LLST237
 	.uleb128 0x4f
 	.8byte	.LVL841
-	.4byte	0x15530
+	.4byte	0x1565c
 	.uleb128 0x4f
 	.8byte	.LVL843
-	.4byte	0x142de
+	.4byte	0x143e2
 	.uleb128 0x4f
 	.8byte	.LVL844
-	.4byte	0x15548
+	.4byte	0x15674
 	.uleb128 0x4f
 	.8byte	.LVL847
-	.4byte	0x14144
+	.4byte	0x14248
 	.uleb128 0x4f
 	.8byte	.LVL848
-	.4byte	0x15548
+	.4byte	0x15674
 	.uleb128 0x4f
 	.8byte	.LVL851
-	.4byte	0x1420b
+	.4byte	0x1430f
 	.uleb128 0x4f
 	.8byte	.LVL852
-	.4byte	0x15548
+	.4byte	0x15674
 	.byte	0
-	.uleb128 0x76
-	.4byte	.LASF3178
+	.uleb128 0x77
+	.4byte	.LASF3179
 	.byte	0x1
 	.2byte	0x15d
 	.8byte	.LFB2812
 	.8byte	.LFE2812-.LFB2812
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1420b
-	.uleb128 0x75
-	.4byte	.LASF3167
+	.4byte	0x1430f
+	.uleb128 0x76
+	.4byte	.LASF3168
 	.byte	0x1
 	.2byte	0x15d
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
-	.uleb128 0x75
-	.4byte	.LASF3168
+	.uleb128 0x76
+	.4byte	.LASF3169
 	.byte	0x1
 	.2byte	0x15d
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
-	.uleb128 0x75
-	.4byte	.LASF3158
+	.uleb128 0x76
+	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x15d
 	.4byte	0x46f4
@@ -48103,18 +48271,18 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x59
 	.uleb128 0x48
-	.4byte	.LASF3170
+	.4byte	.LASF3171
 	.byte	0x1
 	.2byte	0x161
 	.4byte	0x13f
 	.uleb128 0x5a
-	.4byte	.LASF3171
+	.4byte	.LASF3172
 	.byte	0x1
 	.2byte	0x161
 	.4byte	0x13f
 	.4byte	.LLST232
 	.uleb128 0x5a
-	.4byte	.LASF3161
+	.4byte	.LASF3162
 	.byte	0x1
 	.2byte	0x162
 	.4byte	0x15a
@@ -48132,36 +48300,36 @@ __exitcall_ebc_exit:
 	.2byte	0x163
 	.4byte	0xc6
 	.uleb128 0x5a
-	.4byte	.LASF3176
+	.4byte	.LASF3177
 	.byte	0x1
 	.2byte	0x164
 	.4byte	0x13f
 	.4byte	.LLST234
 	.byte	0
-	.uleb128 0x76
-	.4byte	.LASF3179
+	.uleb128 0x77
+	.4byte	.LASF3180
 	.byte	0x1
 	.2byte	0x121
 	.8byte	.LFB2811
 	.8byte	.LFE2811-.LFB2811
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x142de
-	.uleb128 0x75
-	.4byte	.LASF3167
+	.4byte	0x143e2
+	.uleb128 0x76
+	.4byte	.LASF3168
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x59
-	.4byte	.LASF3168
+	.4byte	.LASF3169
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0xac0
 	.4byte	.LLST227
-	.uleb128 0x75
-	.4byte	.LASF3158
+	.uleb128 0x76
+	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0x46f4
@@ -48188,23 +48356,23 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x5a
 	.uleb128 0x48
-	.4byte	.LASF3170
+	.4byte	.LASF3171
 	.byte	0x1
 	.2byte	0x125
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3171
+	.4byte	.LASF3172
 	.byte	0x1
 	.2byte	0x125
 	.4byte	0x13f
 	.uleb128 0x5a
-	.4byte	.LASF3174
+	.4byte	.LASF3175
 	.byte	0x1
 	.2byte	0x125
 	.4byte	0x13f
 	.4byte	.LLST229
 	.uleb128 0x4d
-	.4byte	.LASF3161
+	.4byte	.LASF3162
 	.byte	0x1
 	.2byte	0x126
 	.4byte	0x15a
@@ -48223,56 +48391,56 @@ __exitcall_ebc_exit:
 	.2byte	0x127
 	.4byte	0xc6
 	.uleb128 0x5a
-	.4byte	.LASF3176
+	.4byte	.LASF3177
 	.byte	0x1
 	.2byte	0x128
 	.4byte	0x13f
 	.4byte	.LLST230
 	.byte	0
-	.uleb128 0x77
-	.4byte	.LASF3180
+	.uleb128 0x78
+	.4byte	.LASF3181
 	.byte	0x1
 	.byte	0xd6
 	.8byte	.LFB2810
 	.8byte	.LFE2810-.LFB2810
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x143c3
-	.uleb128 0x78
-	.4byte	.LASF3167
+	.4byte	0x144c7
+	.uleb128 0x79
+	.4byte	.LASF3168
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
-	.uleb128 0x78
-	.4byte	.LASF3168
+	.uleb128 0x79
+	.4byte	.LASF3169
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
-	.uleb128 0x78
-	.4byte	.LASF3169
+	.uleb128 0x79
+	.4byte	.LASF3170
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
-	.uleb128 0x78
-	.4byte	.LASF3158
+	.uleb128 0x79
+	.4byte	.LASF3159
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0x46f4
 	.uleb128 0x1
 	.byte	0x53
-	.uleb128 0x79
+	.uleb128 0x7a
 	.4byte	.LASF2976
 	.byte	0x1
 	.byte	0xd7
 	.4byte	0xe874
 	.4byte	.LLST221
-	.uleb128 0x79
+	.uleb128 0x7a
 	.4byte	.LASF2882
 	.byte	0x1
 	.byte	0xd7
@@ -48292,290 +48460,290 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5b
-	.uleb128 0x7a
-	.4byte	.LASF3170
+	.uleb128 0x7b
+	.4byte	.LASF3171
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x13f
-	.uleb128 0x7b
-	.4byte	.LASF3171
+	.uleb128 0x7c
+	.4byte	.LASF3172
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x13f
 	.4byte	.LLST223
-	.uleb128 0x7b
-	.4byte	.LASF3172
+	.uleb128 0x7c
+	.4byte	.LASF3173
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x13f
 	.4byte	.LLST224
-	.uleb128 0x7b
-	.4byte	.LASF3161
+	.uleb128 0x7c
+	.4byte	.LASF3162
 	.byte	0x1
 	.byte	0xdb
 	.4byte	0x15a
 	.4byte	.LLST225
-	.uleb128 0x7c
+	.uleb128 0x7d
 	.string	"i"
 	.byte	0x1
 	.byte	0xdc
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5f
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.string	"j"
 	.byte	0x1
 	.byte	0xdc
 	.4byte	0xc6
-	.uleb128 0x7b
-	.4byte	.LASF3176
+	.uleb128 0x7c
+	.4byte	.LASF3177
 	.byte	0x1
 	.byte	0xdd
 	.4byte	0x13f
 	.4byte	.LLST226
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3181
+	.uleb128 0x7f
+	.4byte	.LASF3182
 	.byte	0x1
 	.byte	0xb7
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x143f6
-	.uleb128 0x7f
+	.4byte	0x144fb
+	.uleb128 0x80
 	.string	"ebc"
 	.byte	0x1
 	.byte	0xb7
 	.4byte	0xe557
-	.uleb128 0x80
-	.4byte	.LASF3182
+	.uleb128 0x81
+	.4byte	.LASF3183
 	.byte	0x1
 	.byte	0xb7
 	.4byte	0xc6
-	.uleb128 0x7a
+	.uleb128 0x7b
 	.4byte	.LASF2976
 	.byte	0x1
 	.byte	0xb9
 	.4byte	0xe874
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3183
+	.uleb128 0x7f
+	.4byte	.LASF3184
 	.byte	0x1
 	.byte	0xa5
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x14441
-	.uleb128 0x80
+	.4byte	0x14546
+	.uleb128 0x81
 	.4byte	.LASF2871
 	.byte	0x1
 	.byte	0xa5
 	.4byte	0xc138
-	.uleb128 0x80
-	.4byte	.LASF3141
+	.uleb128 0x81
+	.4byte	.LASF3142
 	.byte	0x1
 	.byte	0xa5
 	.4byte	0x11f
-	.uleb128 0x80
-	.4byte	.LASF3142
+	.uleb128 0x81
+	.4byte	.LASF3143
 	.byte	0x1
 	.byte	0xa5
 	.4byte	0x11f
-	.uleb128 0x7a
-	.4byte	.LASF3184
+	.uleb128 0x7b
+	.4byte	.LASF3185
 	.byte	0x1
 	.byte	0xa7
 	.4byte	0x110
-	.uleb128 0x7a
-	.4byte	.LASF3164
+	.uleb128 0x7b
+	.4byte	.LASF3165
 	.byte	0x1
 	.byte	0xa8
 	.4byte	0x11f
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3185
+	.uleb128 0x7f
+	.4byte	.LASF3186
 	.byte	0x1
 	.byte	0x8f
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x1448c
-	.uleb128 0x80
+	.4byte	0x14591
+	.uleb128 0x81
 	.4byte	.LASF2871
 	.byte	0x1
 	.byte	0x8f
 	.4byte	0xc138
-	.uleb128 0x80
-	.4byte	.LASF3141
+	.uleb128 0x81
+	.4byte	.LASF3142
 	.byte	0x1
 	.byte	0x8f
 	.4byte	0x11f
-	.uleb128 0x80
-	.4byte	.LASF3142
+	.uleb128 0x81
+	.4byte	.LASF3143
 	.byte	0x1
 	.byte	0x8f
 	.4byte	0x11f
-	.uleb128 0x7a
-	.4byte	.LASF3184
+	.uleb128 0x7b
+	.4byte	.LASF3185
 	.byte	0x1
 	.byte	0x91
 	.4byte	0x110
-	.uleb128 0x7a
-	.4byte	.LASF3164
+	.uleb128 0x7b
+	.4byte	.LASF3165
 	.byte	0x1
 	.byte	0x92
 	.4byte	0x11f
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3186
+	.uleb128 0x7f
+	.4byte	.LASF3187
 	.byte	0x1
 	.byte	0x89
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x144c1
-	.uleb128 0x80
+	.4byte	0x145c6
+	.uleb128 0x81
 	.4byte	.LASF2871
 	.byte	0x1
 	.byte	0x89
 	.4byte	0xc138
-	.uleb128 0x80
-	.4byte	.LASF3141
+	.uleb128 0x81
+	.4byte	.LASF3142
 	.byte	0x1
 	.byte	0x89
 	.4byte	0x11f
-	.uleb128 0x80
-	.4byte	.LASF3142
+	.uleb128 0x81
+	.4byte	.LASF3143
 	.byte	0x1
 	.byte	0x89
 	.4byte	0x11f
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3187
+	.uleb128 0x7f
+	.4byte	.LASF3188
 	.byte	0x1
 	.byte	0x83
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x144f6
-	.uleb128 0x80
+	.4byte	0x145fb
+	.uleb128 0x81
 	.4byte	.LASF2871
 	.byte	0x1
 	.byte	0x83
 	.4byte	0xc138
-	.uleb128 0x80
-	.4byte	.LASF3141
+	.uleb128 0x81
+	.4byte	.LASF3142
 	.byte	0x1
 	.byte	0x83
 	.4byte	0x11f
-	.uleb128 0x80
-	.4byte	.LASF3142
+	.uleb128 0x81
+	.4byte	.LASF3143
 	.byte	0x1
 	.byte	0x83
 	.4byte	0x11f
 	.byte	0
-	.uleb128 0x81
-	.4byte	.LASF3188
+	.uleb128 0x82
+	.4byte	.LASF3189
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x1451c
-	.uleb128 0x80
+	.4byte	0x14621
+	.uleb128 0x81
 	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x4b
 	.4byte	0xe1b4
-	.uleb128 0x80
+	.uleb128 0x81
 	.4byte	.LASF2985
 	.byte	0xb
 	.byte	0x4b
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x81
-	.4byte	.LASF3189
+	.uleb128 0x82
+	.4byte	.LASF3190
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x1454e
-	.uleb128 0x80
+	.4byte	0x14653
+	.uleb128 0x81
 	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0xe1b4
-	.uleb128 0x80
-	.4byte	.LASF3190
+	.uleb128 0x81
+	.4byte	.LASF3191
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13f
-	.uleb128 0x80
-	.4byte	.LASF3191
+	.uleb128 0x81
+	.4byte	.LASF3192
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13f
 	.byte	0
-	.uleb128 0x81
-	.4byte	.LASF3192
+	.uleb128 0x82
+	.4byte	.LASF3193
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x14598
-	.uleb128 0x80
+	.4byte	0x1469d
+	.uleb128 0x81
 	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xe1b4
-	.uleb128 0x80
-	.4byte	.LASF3193
-	.byte	0xb
-	.byte	0x36
-	.4byte	0xc6
-	.uleb128 0x80
+	.uleb128 0x81
 	.4byte	.LASF3194
 	.byte	0xb
-	.byte	0x37
+	.byte	0x36
 	.4byte	0xc6
-	.uleb128 0x80
+	.uleb128 0x81
 	.4byte	.LASF3195
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
-	.uleb128 0x80
+	.uleb128 0x81
 	.4byte	.LASF3196
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
-	.byte	0
 	.uleb128 0x81
 	.4byte	.LASF3197
 	.byte	0xb
+	.byte	0x37
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x82
+	.4byte	.LASF3198
+	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x145b2
-	.uleb128 0x80
+	.4byte	0x146b7
+	.uleb128 0x81
 	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x31
 	.4byte	0xe1b4
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3198
+	.uleb128 0x7f
+	.4byte	.LASF3199
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x145db
-	.uleb128 0x80
+	.4byte	0x146e0
+	.uleb128 0x81
 	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xe1b4
-	.uleb128 0x80
+	.uleb128 0x81
 	.4byte	.LASF3020
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xe1f4
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3199
+	.4byte	.LASF3200
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x14625
+	.4byte	0x1472a
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
@@ -48603,374 +48771,374 @@ __exitcall_ebc_exit:
 	.4byte	0xb829
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3200
+	.4byte	.LASF3201
 	.byte	0xa
 	.2byte	0x108
 	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x14643
+	.4byte	0x14748
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
 	.2byte	0x108
 	.4byte	0xa5e0
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3201
+	.uleb128 0x7f
+	.4byte	.LASF3202
 	.byte	0xc8
 	.byte	0x1d
 	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x1465f
-	.uleb128 0x7f
+	.4byte	0x14765
+	.uleb128 0x80
 	.string	"bus"
 	.byte	0xc8
 	.byte	0x1d
 	.4byte	0xae47
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3202
+	.uleb128 0x7f
+	.4byte	.LASF3203
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1467c
-	.uleb128 0x80
-	.4byte	.LASF3203
+	.4byte	0x14782
+	.uleb128 0x81
+	.4byte	.LASF3204
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x81
-	.4byte	.LASF3204
+	.uleb128 0x82
+	.4byte	.LASF3205
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x146b9
-	.uleb128 0x7f
+	.4byte	0x147c0
+	.uleb128 0x80
 	.string	"dev"
 	.byte	0xcb
 	.byte	0xa3
 	.4byte	0xa5e0
-	.uleb128 0x80
-	.4byte	.LASF3205
+	.uleb128 0x81
+	.4byte	.LASF3206
 	.byte	0xcb
 	.byte	0xa4
 	.4byte	0x325
-	.uleb128 0x80
+	.uleb128 0x81
 	.4byte	.LASF1001
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0x2e3
-	.uleb128 0x80
-	.4byte	.LASF3206
+	.uleb128 0x81
+	.4byte	.LASF3207
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3207
+	.uleb128 0x7f
+	.4byte	.LASF3208
 	.byte	0x3
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x146d6
-	.uleb128 0x80
+	.4byte	0x147dd
+	.uleb128 0x81
 	.4byte	.LASF2952
 	.byte	0x3
 	.byte	0x35
 	.4byte	0xdbb4
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3208
+	.uleb128 0x7f
+	.4byte	.LASF3209
 	.byte	0x3
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x146fc
-	.uleb128 0x80
+	.4byte	0x14804
+	.uleb128 0x81
 	.4byte	.LASF2952
 	.byte	0x3
 	.byte	0x30
 	.4byte	0xdbb4
-	.uleb128 0x7f
+	.uleb128 0x80
 	.string	"t"
 	.byte	0x3
 	.byte	0x30
 	.4byte	0x46ee
 	.byte	0
-	.uleb128 0x81
-	.4byte	.LASF3209
+	.uleb128 0x82
+	.4byte	.LASF3210
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x14716
-	.uleb128 0x80
+	.4byte	0x1481e
+	.uleb128 0x81
 	.4byte	.LASF2952
 	.byte	0x3
 	.byte	0x2b
 	.4byte	0xdbb4
 	.byte	0
-	.uleb128 0x81
-	.4byte	.LASF3210
+	.uleb128 0x82
+	.4byte	.LASF3211
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x14730
-	.uleb128 0x80
+	.4byte	0x14838
+	.uleb128 0x81
 	.4byte	.LASF2952
 	.byte	0x3
 	.byte	0x26
 	.4byte	0xdbb4
 	.byte	0
-	.uleb128 0x81
-	.4byte	.LASF3211
+	.uleb128 0x82
+	.4byte	.LASF3212
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x1474a
-	.uleb128 0x80
+	.4byte	0x14852
+	.uleb128 0x81
 	.4byte	.LASF2952
 	.byte	0x3
 	.byte	0x21
 	.4byte	0xdbb4
 	.byte	0
-	.uleb128 0x81
-	.4byte	.LASF3212
+	.uleb128 0x82
+	.4byte	.LASF3213
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x14764
-	.uleb128 0x80
+	.4byte	0x1486c
+	.uleb128 0x81
 	.4byte	.LASF2952
 	.byte	0x3
 	.byte	0x1c
 	.4byte	0xdbb4
 	.byte	0
-	.uleb128 0x82
-	.4byte	.LASF3342
+	.uleb128 0x83
+	.4byte	.LASF3344
 	.byte	0xc2
 	.byte	0x36
 	.4byte	0xc6
 	.byte	0x3
-	.uleb128 0x81
-	.4byte	.LASF3213
+	.uleb128 0x82
+	.4byte	.LASF3214
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x1478b
-	.uleb128 0x80
+	.4byte	0x14893
+	.uleb128 0x81
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x1478b
+	.4byte	0x14893
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xd872
-	.uleb128 0x81
+	.uleb128 0x82
 	.4byte	.LASF2853
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x147ab
-	.uleb128 0x80
+	.4byte	0x148b3
+	.uleb128 0x81
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x1478b
+	.4byte	0x14893
 	.byte	0
-	.uleb128 0x81
-	.4byte	.LASF3214
+	.uleb128 0x82
+	.4byte	.LASF3215
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x147e7
-	.uleb128 0x80
+	.4byte	0x148ef
+	.uleb128 0x81
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x1478b
-	.uleb128 0x80
+	.4byte	0x14893
+	.uleb128 0x81
 	.4byte	.LASF193
 	.byte	0x4
 	.byte	0x24
 	.4byte	0xc6
-	.uleb128 0x80
+	.uleb128 0x81
 	.4byte	.LASF265
 	.byte	0x4
 	.byte	0x25
 	.4byte	0x56
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.string	"ws"
 	.byte	0x4
 	.byte	0x27
 	.4byte	0xad7d
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3215
+	.uleb128 0x7f
+	.4byte	.LASF3216
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14817
-	.uleb128 0x7f
+	.4byte	0x14921
+	.uleb128 0x80
 	.string	"to"
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x458
-	.uleb128 0x80
+	.uleb128 0x81
 	.4byte	.LASF2019
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x30bc
-	.uleb128 0x7f
+	.uleb128 0x80
 	.string	"n"
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3216
+	.uleb128 0x7f
+	.4byte	.LASF3217
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14847
-	.uleb128 0x7f
+	.4byte	0x14953
+	.uleb128 0x80
 	.string	"to"
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x458
-	.uleb128 0x80
+	.uleb128 0x81
 	.4byte	.LASF2019
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x30bc
-	.uleb128 0x7f
+	.uleb128 0x80
 	.string	"n"
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3217
+	.uleb128 0x7f
+	.4byte	.LASF3218
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14877
-	.uleb128 0x7f
+	.4byte	0x14985
+	.uleb128 0x80
 	.string	"to"
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x458
-	.uleb128 0x80
+	.uleb128 0x81
 	.4byte	.LASF2019
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x30bc
-	.uleb128 0x7f
+	.uleb128 0x80
 	.string	"n"
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3218
+	.uleb128 0x7f
+	.4byte	.LASF3219
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x148b2
-	.uleb128 0x7f
+	.4byte	0x149c2
+	.uleb128 0x80
 	.string	"to"
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x458
-	.uleb128 0x80
+	.uleb128 0x81
 	.4byte	.LASF2019
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x30bc
-	.uleb128 0x7f
+	.uleb128 0x80
 	.string	"n"
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x29
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.string	"res"
 	.byte	0x9
 	.byte	0x70
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3219
+	.uleb128 0x7f
+	.4byte	.LASF3220
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x148e6
-	.uleb128 0x7f
+	.4byte	0x149f7
+	.uleb128 0x80
 	.string	"ptr"
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x30bc
-	.uleb128 0x7a
-	.4byte	.LASF3220
+	.uleb128 0x7b
+	.4byte	.LASF3221
 	.byte	0x6
 	.byte	0xf7
 	.4byte	0x458
 	.uleb128 0x68
-	.uleb128 0x7a
-	.4byte	.LASF3221
+	.uleb128 0x7b
+	.4byte	.LASF3222
 	.byte	0x6
 	.byte	0xfe
 	.4byte	0x15a
 	.byte	0
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3222
+	.uleb128 0x7f
+	.4byte	.LASF3223
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14932
-	.uleb128 0x80
+	.4byte	0x14a43
+	.uleb128 0x81
 	.4byte	.LASF1164
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x30bc
-	.uleb128 0x80
+	.uleb128 0x81
 	.4byte	.LASF1001
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.string	"ret"
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
-	.uleb128 0x7a
-	.4byte	.LASF3223
+	.uleb128 0x7b
+	.4byte	.LASF3224
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x68
-	.uleb128 0x7a
-	.4byte	.LASF3221
+	.uleb128 0x7b
+	.4byte	.LASF3222
 	.byte	0x6
 	.byte	0x56
 	.4byte	0x15a
 	.byte	0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3224
+	.4byte	.LASF3225
 	.byte	0x11
 	.2byte	0x2e5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x1495c
+	.4byte	0x14a6d
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x11
@@ -48983,12 +49151,12 @@ __exitcall_ebc_exit:
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3225
+	.4byte	.LASF3226
 	.byte	0x11
 	.2byte	0x216
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14994
+	.4byte	0x14aa5
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x11
@@ -49008,12 +49176,12 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3226
+	.4byte	.LASF3227
 	.byte	0x11
 	.2byte	0x1dd
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x149ca
+	.4byte	0x14adb
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x11
@@ -49025,18 +49193,18 @@ __exitcall_ebc_exit:
 	.2byte	0x1dd
 	.4byte	0x330
 	.uleb128 0x48
-	.4byte	.LASF3227
+	.4byte	.LASF3228
 	.byte	0x11
 	.2byte	0x1df
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3228
+	.4byte	.LASF3229
 	.byte	0x11
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x149e8
+	.4byte	0x14af9
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x11
@@ -49044,109 +49212,109 @@ __exitcall_ebc_exit:
 	.4byte	0x2e3
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3229
+	.4byte	.LASF3230
 	.byte	0x11
 	.2byte	0x13d
 	.4byte	0xd813
 	.byte	0x3
-	.4byte	0x14a06
+	.4byte	0x14b17
 	.uleb128 0x66
 	.4byte	.LASF171
 	.byte	0x11
 	.2byte	0x13d
 	.4byte	0x330
 	.byte	0
-	.uleb128 0x81
-	.4byte	.LASF3230
+	.uleb128 0x82
+	.4byte	.LASF3231
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x14a2c
-	.uleb128 0x80
+	.4byte	0x14b3d
+	.uleb128 0x81
 	.4byte	.LASF3052
 	.byte	0xbe
 	.byte	0xdb
 	.4byte	0xd78a
-	.uleb128 0x80
+	.uleb128 0x81
 	.4byte	.LASF794
 	.byte	0xbe
 	.byte	0xdc
 	.4byte	0x458
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3231
+	.uleb128 0x7f
+	.4byte	.LASF3232
 	.byte	0xbe
 	.byte	0xd6
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14a49
-	.uleb128 0x80
+	.4byte	0x14b5a
+	.uleb128 0x81
 	.4byte	.LASF3052
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x14a49
+	.4byte	0x14b5a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xd6e2
 	.uleb128 0x64
-	.4byte	.LASF3232
+	.4byte	.LASF3233
 	.byte	0xa3
 	.2byte	0x164
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14a6d
+	.4byte	0x14b7e
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x14a6d
+	.4byte	0x14b7e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc133
 	.uleb128 0x64
-	.4byte	.LASF3233
+	.4byte	.LASF3234
 	.byte	0xc
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14aa8
+	.4byte	0x14bb9
 	.uleb128 0x65
 	.string	"np"
 	.byte	0xc
 	.2byte	0x498
 	.4byte	0xbd2a
 	.uleb128 0x66
-	.4byte	.LASF3234
+	.4byte	.LASF3235
 	.byte	0xc
 	.2byte	0x499
 	.4byte	0x56
 	.uleb128 0x66
-	.4byte	.LASF3235
+	.4byte	.LASF3236
 	.byte	0xc
 	.2byte	0x49a
 	.4byte	0xac0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3236
+	.4byte	.LASF3237
 	.byte	0xc
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14af4
+	.4byte	0x14c05
 	.uleb128 0x65
 	.string	"np"
 	.byte	0xc
 	.2byte	0x1ef
 	.4byte	0xbd2a
 	.uleb128 0x66
-	.4byte	.LASF3234
+	.4byte	.LASF3235
 	.byte	0xc
 	.2byte	0x1f0
 	.4byte	0x56
 	.uleb128 0x66
-	.4byte	.LASF3237
+	.4byte	.LASF3238
 	.byte	0xc
 	.2byte	0x1f1
 	.4byte	0xac0
@@ -49161,24 +49329,24 @@ __exitcall_ebc_exit:
 	.2byte	0x1f3
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x81
-	.4byte	.LASF3238
+	.uleb128 0x82
+	.4byte	.LASF3239
 	.byte	0xc
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x14b0e
-	.uleb128 0x80
+	.4byte	0x14c1f
+	.uleb128 0x81
 	.4byte	.LASF882
 	.byte	0xc
 	.byte	0x83
 	.4byte	0xb904
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3239
+	.4byte	.LASF3240
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x14b34
+	.4byte	0x14c45
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -49191,12 +49359,12 @@ __exitcall_ebc_exit:
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3240
+	.4byte	.LASF3241
 	.byte	0x2
 	.2byte	0x49b
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14b52
+	.4byte	0x14c63
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -49204,12 +49372,12 @@ __exitcall_ebc_exit:
 	.4byte	0xbb9a
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3241
+	.4byte	.LASF3242
 	.byte	0x2
 	.2byte	0x2c5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14b88
+	.4byte	0x14c99
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -49226,52 +49394,52 @@ __exitcall_ebc_exit:
 	.2byte	0x2c5
 	.4byte	0x330
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3242
+	.uleb128 0x7f
+	.4byte	.LASF3243
 	.byte	0xd
 	.byte	0xca
 	.4byte	0x351
 	.byte	0x3
-	.4byte	0x14ba4
-	.uleb128 0x7f
+	.4byte	0x14cb6
+	.uleb128 0x80
 	.string	"res"
 	.byte	0xd
 	.byte	0xca
 	.4byte	0xc244
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3243
+	.uleb128 0x7f
+	.4byte	.LASF3244
 	.byte	0xcc
 	.byte	0x22
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x14bc0
-	.uleb128 0x7f
+	.4byte	0x14cd3
+	.uleb128 0x80
 	.string	"ptr"
 	.byte	0xcc
 	.byte	0x22
 	.4byte	0x30bc
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3244
+	.uleb128 0x7f
+	.4byte	.LASF3245
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14bdd
-	.uleb128 0x80
+	.4byte	0x14cf0
+	.uleb128 0x81
 	.4byte	.LASF1001
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3245
+	.4byte	.LASF3246
 	.byte	0x12
 	.2byte	0x203
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x14c06
+	.4byte	0x14d19
 	.uleb128 0x65
 	.string	"wq"
 	.byte	0x12
@@ -49283,30 +49451,30 @@ __exitcall_ebc_exit:
 	.2byte	0x204
 	.4byte	0x3205
 	.byte	0
-	.uleb128 0x81
-	.4byte	.LASF3246
+	.uleb128 0x82
+	.4byte	.LASF3247
 	.byte	0x12
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x14c2c
-	.uleb128 0x80
+	.4byte	0x14d3f
+	.uleb128 0x81
 	.4byte	.LASF2288
 	.byte	0x12
 	.byte	0xdd
 	.4byte	0x3205
-	.uleb128 0x80
-	.4byte	.LASF3247
+	.uleb128 0x81
+	.4byte	.LASF3248
 	.byte	0x12
 	.byte	0xdd
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3248
+	.4byte	.LASF3249
 	.byte	0x51
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14c48
+	.4byte	0x14d5b
 	.uleb128 0x65
 	.string	"m"
 	.byte	0x51
@@ -49314,106 +49482,106 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3249
+	.4byte	.LASF3250
 	.byte	0x51
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14c64
+	.4byte	0x14d77
 	.uleb128 0x65
 	.string	"m"
 	.byte	0x51
 	.2byte	0x148
 	.4byte	0x74
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3250
+	.uleb128 0x7f
+	.4byte	.LASF3251
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x14ca3
-	.uleb128 0x80
+	.4byte	0x14db6
+	.uleb128 0x81
 	.4byte	.LASF1164
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x30bc
-	.uleb128 0x80
-	.4byte	.LASF3251
+	.uleb128 0x81
+	.4byte	.LASF3252
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2e3
-	.uleb128 0x80
-	.4byte	.LASF3252
+	.uleb128 0x81
+	.4byte	.LASF3253
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2b0
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.string	"sz"
 	.byte	0xca
 	.byte	0x99
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x81
-	.4byte	.LASF3253
+	.uleb128 0x82
+	.4byte	.LASF3254
 	.byte	0xca
 	.byte	0x91
 	.byte	0x3
-	.4byte	0x14cd6
-	.uleb128 0x80
+	.4byte	0x14de9
+	.uleb128 0x81
 	.4byte	.LASF1001
 	.byte	0xca
 	.byte	0x91
 	.4byte	0xc6
-	.uleb128 0x80
+	.uleb128 0x81
 	.4byte	.LASF383
 	.byte	0xca
 	.byte	0x91
 	.4byte	0x29
 	.uleb128 0x68
-	.uleb128 0x7a
-	.4byte	.LASF3254
+	.uleb128 0x7b
+	.4byte	.LASF3255
 	.byte	0xca
 	.byte	0x93
 	.4byte	0xc6
 	.byte	0
 	.byte	0
-	.uleb128 0x81
-	.4byte	.LASF3255
+	.uleb128 0x82
+	.4byte	.LASF3256
 	.byte	0xca
 	.byte	0x80
 	.byte	0x3
-	.4byte	0x14d04
-	.uleb128 0x7f
+	.4byte	0x14e19
+	.uleb128 0x80
 	.string	"ptr"
 	.byte	0xca
 	.byte	0x80
 	.4byte	0x30bc
-	.uleb128 0x7f
+	.uleb128 0x80
 	.string	"n"
 	.byte	0xca
 	.byte	0x80
 	.4byte	0x29
-	.uleb128 0x80
-	.4byte	.LASF3256
+	.uleb128 0x81
+	.4byte	.LASF3257
 	.byte	0xca
 	.byte	0x81
 	.4byte	0x2b0
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3257
+	.uleb128 0x7f
+	.4byte	.LASF3258
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14d2b
-	.uleb128 0x7f
+	.4byte	0x14e41
+	.uleb128 0x80
 	.string	"ti"
 	.byte	0xca
 	.byte	0x5f
-	.4byte	0x14d2b
-	.uleb128 0x80
-	.4byte	.LASF3258
+	.4byte	0x14e41
+	.uleb128 0x81
+	.4byte	.LASF3259
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
@@ -49421,26 +49589,26 @@ __exitcall_ebc_exit:
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc33
-	.uleb128 0x7e
-	.4byte	.LASF3259
+	.uleb128 0x7f
+	.4byte	.LASF3260
 	.byte	0x5
 	.byte	0xf
 	.4byte	0x2f05
 	.byte	0x3
-	.4byte	0x14d4d
-	.uleb128 0x7a
-	.4byte	.LASF3260
+	.4byte	0x14e63
+	.uleb128 0x7b
+	.4byte	.LASF3261
 	.byte	0x5
 	.byte	0x11
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x81
-	.4byte	.LASF3261
+	.uleb128 0x82
+	.4byte	.LASF3262
 	.byte	0xf
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x14d93
-	.uleb128 0x80
+	.4byte	0x14ea9
+	.uleb128 0x81
 	.4byte	.LASF976
 	.byte	0xf
 	.byte	0x1a
@@ -49450,9 +49618,9 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0xf
 	.byte	0x1c
-	.4byte	0x14d86
+	.4byte	0x14e9c
 	.uleb128 0x22
-	.4byte	.LASF3130
+	.4byte	.LASF3131
 	.byte	0xf
 	.byte	0x1c
 	.4byte	0x3cc
@@ -49460,187 +49628,187 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0xf
 	.byte	0x1c
-	.4byte	0x12740
+	.4byte	0x12844
 	.byte	0
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.string	"__u"
 	.byte	0xf
 	.byte	0x1c
-	.4byte	0x14d67
+	.4byte	0x14e7d
 	.byte	0
 	.byte	0
-	.uleb128 0x83
-	.4byte	.LASF3343
+	.uleb128 0x84
+	.4byte	.LASF3345
 	.byte	0x20
 	.2byte	0x126
 	.byte	0x3
-	.uleb128 0x7e
-	.4byte	.LASF3262
+	.uleb128 0x7f
+	.4byte	.LASF3263
 	.byte	0xce
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14db7
-	.uleb128 0x7f
+	.4byte	0x14ece
+	.uleb128 0x80
 	.string	"n"
 	.byte	0xce
 	.byte	0x22
 	.4byte	0x15a
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3263
+	.uleb128 0x7f
+	.4byte	.LASF3264
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xe2
 	.byte	0x3
-	.4byte	0x14deb
-	.uleb128 0x80
+	.4byte	0x14f02
+	.uleb128 0x81
 	.4byte	.LASF2470
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xf4
-	.uleb128 0x80
+	.uleb128 0x81
 	.4byte	.LASF894
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xc6
-	.uleb128 0x7a
+	.uleb128 0x7b
 	.4byte	.LASF261
 	.byte	0x8
 	.byte	0x9c
 	.4byte	0x8b
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3264
+	.uleb128 0x7f
+	.4byte	.LASF3265
 	.byte	0xcf
 	.byte	0x50
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x14e05
-	.uleb128 0x7f
+	.4byte	0x14f1d
+	.uleb128 0x80
 	.string	"p"
 	.byte	0xcf
 	.byte	0x50
 	.4byte	0xbd30
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3265
+	.uleb128 0x7f
+	.4byte	.LASF3266
 	.byte	0xd0
 	.byte	0xb8
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x14e1f
-	.uleb128 0x7f
+	.4byte	0x14f38
+	.uleb128 0x80
 	.string	"p"
 	.byte	0xd0
 	.byte	0xb8
-	.4byte	0x14e1f
+	.4byte	0x14f38
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xdd
-	.uleb128 0x7e
-	.4byte	.LASF3266
+	.uleb128 0x7f
+	.4byte	.LASF3267
 	.byte	0xd0
 	.byte	0x39
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x14e41
-	.uleb128 0x7f
+	.4byte	0x14f5b
+	.uleb128 0x80
 	.string	"val"
 	.byte	0xd0
 	.byte	0x39
 	.4byte	0xd2
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3267
+	.uleb128 0x7f
+	.4byte	.LASF3268
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14e68
-	.uleb128 0x7f
+	.4byte	0x14f83
+	.uleb128 0x80
 	.string	"nr"
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
-	.uleb128 0x80
+	.uleb128 0x81
 	.4byte	.LASF1164
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x14e68
+	.4byte	0x14f83
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x3a
-	.uleb128 0x81
-	.4byte	.LASF3268
+	.uleb128 0x82
+	.4byte	.LASF3269
 	.byte	0x10
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x14ea2
-	.uleb128 0x7f
+	.4byte	0x14fbf
+	.uleb128 0x80
 	.string	"i"
 	.byte	0x10
 	.byte	0x2f
 	.4byte	0xc6
-	.uleb128 0x7f
+	.uleb128 0x80
 	.string	"v"
 	.byte	0x10
 	.byte	0x2f
-	.4byte	0x14ea2
-	.uleb128 0x7d
+	.4byte	0x14fbf
+	.uleb128 0x7e
 	.string	"w0"
 	.byte	0x10
 	.byte	0x2f
 	.4byte	0xc6
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.string	"x1"
 	.byte	0x10
 	.byte	0x2f
-	.4byte	0x14ea2
+	.4byte	0x14fbf
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x37c
-	.uleb128 0x7e
-	.4byte	.LASF3269
+	.uleb128 0x7f
+	.4byte	.LASF3270
 	.byte	0xd1
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14ec2
-	.uleb128 0x7f
+	.4byte	0x14fe0
+	.uleb128 0x80
 	.string	"x"
 	.byte	0xd1
 	.byte	0x1b
 	.4byte	0xf4
 	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3270
+	.uleb128 0x7f
+	.4byte	.LASF3271
 	.byte	0xd2
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14edf
-	.uleb128 0x80
+	.4byte	0x14ffd
+	.uleb128 0x81
 	.4byte	.LASF2503
 	.byte	0xd2
 	.byte	0xb
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x81
-	.4byte	.LASF3271
+	.uleb128 0x82
+	.4byte	.LASF3272
 	.byte	0xd3
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x14f02
-	.uleb128 0x7f
+	.4byte	0x15021
+	.uleb128 0x80
 	.string	"p"
 	.byte	0xd3
 	.byte	0xb
-	.4byte	0x14f02
-	.uleb128 0x80
+	.4byte	0x15021
+	.uleb128 0x81
 	.4byte	.LASF1001
 	.byte	0xd3
 	.byte	0xb
@@ -49648,38 +49816,38 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x14f0a
-	.uleb128 0x84
+	.4byte	0x15029
+	.uleb128 0x85
 	.uleb128 0x3
-	.4byte	0x14f08
-	.uleb128 0x81
-	.4byte	.LASF3272
+	.4byte	0x15027
+	.uleb128 0x82
+	.4byte	.LASF3273
 	.byte	0xd3
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x14f32
-	.uleb128 0x7f
+	.4byte	0x15052
+	.uleb128 0x80
 	.string	"p"
 	.byte	0xd3
 	.byte	0x9
-	.4byte	0x14f02
-	.uleb128 0x80
+	.4byte	0x15021
+	.uleb128 0x81
 	.4byte	.LASF1001
 	.byte	0xd3
 	.byte	0x9
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3273
+	.4byte	.LASF3274
 	.byte	0xe
 	.2byte	0x11a
 	.byte	0x3
-	.4byte	0x14f62
+	.4byte	0x15082
 	.uleb128 0x65
 	.string	"p"
 	.byte	0xe
 	.2byte	0x11a
-	.4byte	0x14f62
+	.4byte	0x15082
 	.uleb128 0x65
 	.string	"res"
 	.byte	0xe
@@ -49693,14 +49861,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x14f08
-	.uleb128 0x85
+	.4byte	0x15027
+	.uleb128 0x86
 	.4byte	0x103dd
 	.8byte	.LFB2847
 	.8byte	.LFE2847-.LFB2847
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14f95
+	.4byte	0x150b5
 	.uleb128 0x70
 	.4byte	0x103ee
 	.4byte	.LLST10
@@ -49709,562 +49877,567 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x51
 	.byte	0
-	.uleb128 0x86
-	.4byte	0x12922
+	.uleb128 0x87
+	.4byte	0x12a26
 	.8byte	.LFB2879
 	.8byte	.LFE2879-.LFB2879
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x15098
+	.4byte	0x151b8
 	.uleb128 0x70
-	.4byte	0x1292f
+	.4byte	0x12a33
 	.4byte	.LLST188
 	.uleb128 0x55
-	.4byte	0x1293b
+	.4byte	0x12a3f
 	.uleb128 0x58
-	.4byte	0x12947
+	.4byte	0x12a4b
 	.uleb128 0x5c
-	.4byte	0x145db
-	.8byte	.LBB1448
+	.4byte	0x146e0
+	.8byte	.LBB1474
 	.4byte	.Ldebug_ranges0+0xbf0
 	.byte	0x1
 	.2byte	0x5c8
-	.4byte	0x15016
+	.4byte	0x15136
 	.uleb128 0x55
-	.4byte	0x1460c
+	.4byte	0x14711
 	.uleb128 0x55
-	.4byte	0x14600
+	.4byte	0x14705
 	.uleb128 0x55
-	.4byte	0x145f4
+	.4byte	0x146f9
 	.uleb128 0x55
-	.4byte	0x145e8
+	.4byte	0x146ed
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xbf0
 	.uleb128 0x58
-	.4byte	0x14618
+	.4byte	0x1471d
 	.uleb128 0x60
-	.4byte	0x14625
-	.8byte	.LBB1450
+	.4byte	0x1472a
+	.8byte	.LBB1476
 	.4byte	.Ldebug_ranges0+0xc40
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x55
-	.4byte	0x14636
+	.4byte	0x1473b
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x1454e
-	.8byte	.LBB1459
+	.4byte	0x14653
+	.8byte	.LBB1485
 	.4byte	.Ldebug_ranges0+0xc70
 	.byte	0x1
 	.2byte	0x5c9
-	.4byte	0x15048
+	.4byte	0x15168
 	.uleb128 0x55
-	.4byte	0x1458b
+	.4byte	0x14690
 	.uleb128 0x55
-	.4byte	0x1457f
+	.4byte	0x14684
 	.uleb128 0x55
-	.4byte	0x14573
+	.4byte	0x14678
 	.uleb128 0x55
-	.4byte	0x14567
+	.4byte	0x1466c
 	.uleb128 0x55
-	.4byte	0x1455b
+	.4byte	0x14660
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1451c
-	.8byte	.LBB1465
-	.8byte	.LBE1465-.LBB1465
+	.4byte	0x14621
+	.8byte	.LBB1491
+	.8byte	.LBE1491-.LBB1491
 	.byte	0x1
 	.2byte	0x5ca
-	.4byte	0x15074
+	.4byte	0x15194
 	.uleb128 0x55
-	.4byte	0x14541
+	.4byte	0x14646
 	.uleb128 0x55
-	.4byte	0x14535
+	.4byte	0x1463a
 	.uleb128 0x55
-	.4byte	0x14529
+	.4byte	0x1462e
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x144f6
-	.8byte	.LBB1467
-	.8byte	.LBE1467-.LBB1467
+	.4byte	0x145fb
+	.8byte	.LBB1493
+	.8byte	.LBE1493-.LBB1493
 	.byte	0x1
 	.2byte	0x5cb
 	.uleb128 0x55
-	.4byte	0x1450f
+	.4byte	0x14614
 	.uleb128 0x55
-	.4byte	0x14503
+	.4byte	0x14608
 	.byte	0
 	.byte	0
-	.uleb128 0x86
-	.4byte	0x143c3
+	.uleb128 0x87
+	.4byte	0x144c7
 	.8byte	.LFB2881
 	.8byte	.LFE2881-.LFB2881
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x15156
+	.4byte	0x15276
 	.uleb128 0x70
-	.4byte	0x143d3
+	.4byte	0x144d7
 	.4byte	.LLST190
 	.uleb128 0x70
-	.4byte	0x143de
+	.4byte	0x144e3
 	.4byte	.LLST191
 	.uleb128 0x58
-	.4byte	0x143ea
+	.4byte	0x144ef
 	.uleb128 0x71
-	.4byte	0x14598
-	.8byte	.LBB1478
-	.8byte	.LBE1478-.LBB1478
+	.4byte	0x1469d
+	.8byte	.LBB1504
+	.8byte	.LBE1504-.LBB1504
 	.byte	0x1
 	.byte	0xc9
-	.4byte	0x150ec
+	.4byte	0x1520c
 	.uleb128 0x55
-	.4byte	0x145a5
+	.4byte	0x146aa
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14730
-	.8byte	.LBB1480
-	.8byte	.LBE1480-.LBB1480
+	.4byte	0x14838
+	.8byte	.LBB1506
+	.8byte	.LBE1506-.LBB1506
 	.byte	0x1
 	.byte	0xca
-	.4byte	0x1510d
+	.4byte	0x1522d
 	.uleb128 0x55
-	.4byte	0x1473d
+	.4byte	0x14845
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14771
-	.8byte	.LBB1482
-	.8byte	.LBE1482-.LBB1482
+	.4byte	0x14879
+	.8byte	.LBB1508
+	.8byte	.LBE1508-.LBB1508
 	.byte	0x1
 	.byte	0xcd
-	.4byte	0x1513b
+	.4byte	0x1525b
 	.uleb128 0x55
-	.4byte	0x1477e
+	.4byte	0x14886
 	.uleb128 0x4f
 	.8byte	.LVL584
-	.4byte	0x1550c
+	.4byte	0x1562c
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL581
-	.4byte	0x15281
+	.4byte	0x153a1
 	.uleb128 0x4f
 	.8byte	.LVL585
-	.4byte	0x15281
+	.4byte	0x153a1
 	.byte	0
-	.uleb128 0x85
-	.4byte	0x1229e
+	.uleb128 0x86
+	.4byte	0x123a2
 	.8byte	.LFB2883
 	.8byte	.LFE2883-.LFB2883
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x151b7
+	.4byte	0x152d7
 	.uleb128 0x55
-	.4byte	0x122bb
+	.4byte	0x123bf
 	.uleb128 0x55
-	.4byte	0x122af
+	.4byte	0x123b3
 	.uleb128 0x55
-	.4byte	0x122af
+	.4byte	0x123b3
 	.uleb128 0x58
-	.4byte	0x122c7
+	.4byte	0x123cb
 	.uleb128 0x58
-	.4byte	0x122d1
+	.4byte	0x123d5
 	.uleb128 0x58
-	.4byte	0x122dd
+	.4byte	0x123e1
 	.uleb128 0x61
-	.4byte	0x122e9
+	.4byte	0x123ed
 	.4byte	.LLST193
 	.uleb128 0x62
-	.4byte	0x122f5
+	.4byte	0x123f9
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x12301
+	.4byte	0x12405
 	.4byte	.LLST194
 	.uleb128 0x4f
 	.8byte	.LVL595
-	.4byte	0x15583
+	.4byte	0x156af
 	.byte	0
-	.uleb128 0x86
-	.4byte	0x143c3
+	.uleb128 0x87
+	.4byte	0x144c7
 	.8byte	.LFB2887
 	.8byte	.LFE2887-.LFB2887
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x15269
+	.4byte	0x15389
 	.uleb128 0x70
-	.4byte	0x143d3
+	.4byte	0x144d7
 	.4byte	.LLST220
 	.uleb128 0x58
-	.4byte	0x143ea
+	.4byte	0x144ef
 	.uleb128 0x55
-	.4byte	0x143de
+	.4byte	0x144e3
 	.uleb128 0x71
-	.4byte	0x1474a
-	.8byte	.LBB1805
-	.8byte	.LBE1805-.LBB1805
+	.4byte	0x14852
+	.8byte	.LBB1831
+	.8byte	.LBE1831-.LBB1831
 	.byte	0x1
 	.byte	0xc2
-	.4byte	0x15207
+	.4byte	0x15327
 	.uleb128 0x55
-	.4byte	0x14757
+	.4byte	0x1485f
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x145b2
-	.8byte	.LBB1807
-	.8byte	.LBE1807-.LBB1807
+	.4byte	0x146b7
+	.8byte	.LBB1833
+	.8byte	.LBE1833-.LBB1833
 	.byte	0x1
 	.byte	0xc3
-	.4byte	0x1522d
+	.4byte	0x1534d
 	.uleb128 0x55
-	.4byte	0x145ce
+	.4byte	0x146d3
 	.uleb128 0x55
-	.4byte	0x145c2
+	.4byte	0x146c7
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14791
-	.8byte	.LBB1809
-	.8byte	.LBE1809-.LBB1809
+	.4byte	0x14899
+	.8byte	.LBB1835
+	.8byte	.LBE1835-.LBB1835
 	.byte	0x1
 	.byte	0xbf
-	.4byte	0x1525b
+	.4byte	0x1537b
 	.uleb128 0x55
-	.4byte	0x1479e
+	.4byte	0x148a6
 	.uleb128 0x4f
 	.8byte	.LVL787
-	.4byte	0x1558f
+	.4byte	0x156bb
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL784
-	.4byte	0x15281
+	.4byte	0x153a1
 	.byte	0
-	.uleb128 0x87
-	.4byte	.LASF3274
-	.4byte	.LASF3274
-	.byte	0xbe
-	.byte	0xcc
-	.uleb128 0x87
+	.uleb128 0x88
 	.4byte	.LASF3275
 	.4byte	.LASF3275
 	.byte	0xbe
-	.byte	0xca
+	.byte	0xcc
 	.uleb128 0x88
 	.4byte	.LASF3276
 	.4byte	.LASF3276
-	.byte	0x2
-	.2byte	0x5d1
-	.uleb128 0x87
+	.byte	0xbe
+	.byte	0xca
+	.uleb128 0x89
 	.4byte	.LASF3277
 	.4byte	.LASF3277
-	.byte	0xac
-	.byte	0x4f
+	.byte	0x2
+	.2byte	0x5d1
 	.uleb128 0x88
 	.4byte	.LASF3278
 	.4byte	.LASF3278
-	.byte	0x2
-	.2byte	0x2bf
-	.uleb128 0x88
+	.byte	0xac
+	.byte	0x4f
+	.uleb128 0x89
 	.4byte	.LASF3279
 	.4byte	.LASF3279
-	.byte	0xc
-	.2byte	0x149
-	.uleb128 0x88
+	.byte	0x2
+	.2byte	0x2bf
+	.uleb128 0x89
 	.4byte	.LASF3280
 	.4byte	.LASF3280
 	.byte	0xc
-	.2byte	0x172
-	.uleb128 0x87
+	.2byte	0x149
+	.uleb128 0x89
 	.4byte	.LASF3281
 	.4byte	.LASF3281
-	.byte	0xd4
-	.byte	0x78
-	.uleb128 0x87
+	.byte	0xc
+	.2byte	0x172
+	.uleb128 0x88
 	.4byte	.LASF3282
 	.4byte	.LASF3282
-	.byte	0xaa
-	.byte	0x59
-	.uleb128 0x87
+	.byte	0xd4
+	.byte	0x78
+	.uleb128 0x88
 	.4byte	.LASF3283
 	.4byte	.LASF3283
-	.byte	0xc3
-	.byte	0x31
-	.uleb128 0x89
-	.4byte	.LASF3284
-	.4byte	.LASF3284
-	.uleb128 0x87
+	.byte	0xaa
+	.byte	0x59
+	.uleb128 0x88
 	.4byte	.LASF3284
 	.4byte	.LASF3284
-	.byte	0xd5
-	.byte	0x36
+	.byte	0xc3
+	.byte	0x31
+	.uleb128 0x8a
+	.4byte	.LASF3285
+	.4byte	.LASF3285
 	.uleb128 0x88
 	.4byte	.LASF3285
 	.4byte	.LASF3285
-	.byte	0x2
-	.2byte	0x5cb
-	.uleb128 0x87
+	.byte	0xd5
+	.byte	0x36
+	.uleb128 0x89
 	.4byte	.LASF3286
 	.4byte	.LASF3286
-	.byte	0xc2
-	.byte	0x30
-	.uleb128 0x87
+	.byte	0x2
+	.2byte	0x5cb
+	.uleb128 0x88
 	.4byte	.LASF3287
 	.4byte	.LASF3287
 	.byte	0xc2
-	.byte	0x31
-	.uleb128 0x87
+	.byte	0x30
+	.uleb128 0x88
 	.4byte	.LASF3288
 	.4byte	.LASF3288
-	.byte	0xab
-	.byte	0x9
+	.byte	0xc2
+	.byte	0x31
 	.uleb128 0x88
 	.4byte	.LASF3289
 	.4byte	.LASF3289
-	.byte	0x48
-	.2byte	0x6b8
-	.uleb128 0x88
+	.byte	0xab
+	.byte	0x9
+	.uleb128 0x89
 	.4byte	.LASF3290
 	.4byte	.LASF3290
-	.byte	0x12
-	.2byte	0x190
-	.uleb128 0x88
+	.byte	0x48
+	.2byte	0x6b8
+	.uleb128 0x89
 	.4byte	.LASF3291
 	.4byte	.LASF3291
-	.byte	0x48
-	.2byte	0x676
-	.uleb128 0x87
+	.byte	0x12
+	.2byte	0x190
+	.uleb128 0x89
 	.4byte	.LASF3292
 	.4byte	.LASF3292
-	.byte	0x9c
-	.byte	0x67
-	.uleb128 0x87
+	.byte	0x48
+	.2byte	0x676
+	.uleb128 0x88
 	.4byte	.LASF3293
 	.4byte	.LASF3293
-	.byte	0x54
-	.byte	0x53
-	.uleb128 0x87
+	.byte	0x9c
+	.byte	0x67
+	.uleb128 0x88
 	.4byte	.LASF3294
 	.4byte	.LASF3294
 	.byte	0x54
-	.byte	0xa5
-	.uleb128 0x87
+	.byte	0x53
+	.uleb128 0x88
 	.4byte	.LASF3295
 	.4byte	.LASF3295
-	.byte	0xc3
-	.byte	0x2c
-	.uleb128 0x87
+	.byte	0x54
+	.byte	0xa5
+	.uleb128 0x88
 	.4byte	.LASF3296
 	.4byte	.LASF3296
 	.byte	0xc3
-	.byte	0x28
+	.byte	0x2c
 	.uleb128 0x88
 	.4byte	.LASF3297
 	.4byte	.LASF3297
-	.byte	0x11
-	.2byte	0x184
-	.uleb128 0x87
+	.byte	0xc3
+	.byte	0x28
+	.uleb128 0x89
 	.4byte	.LASF3298
 	.4byte	.LASF3298
-	.byte	0xd6
-	.byte	0x51
+	.byte	0x11
+	.2byte	0x184
 	.uleb128 0x88
 	.4byte	.LASF3299
 	.4byte	.LASF3299
-	.byte	0x20
-	.2byte	0x1d9
-	.uleb128 0x87
+	.byte	0xd6
+	.byte	0x51
+	.uleb128 0x89
 	.4byte	.LASF3300
 	.4byte	.LASF3300
-	.byte	0x3
-	.byte	0x3b
-	.uleb128 0x87
+	.byte	0x20
+	.2byte	0x1d9
+	.uleb128 0x88
 	.4byte	.LASF3301
 	.4byte	.LASF3301
-	.byte	0x11
-	.byte	0xb9
-	.uleb128 0x87
+	.byte	0x3
+	.byte	0x3b
+	.uleb128 0x88
 	.4byte	.LASF3302
 	.4byte	.LASF3302
-	.byte	0x3a
-	.byte	0xc2
-	.uleb128 0x89
+	.byte	0x11
+	.byte	0xb9
+	.uleb128 0x88
 	.4byte	.LASF3303
 	.4byte	.LASF3303
-	.uleb128 0x87
+	.byte	0x3a
+	.byte	0xc2
+	.uleb128 0x8a
 	.4byte	.LASF3304
 	.4byte	.LASF3304
-	.byte	0xac
-	.byte	0x4e
 	.uleb128 0x88
 	.4byte	.LASF3305
 	.4byte	.LASF3305
-	.byte	0x2
-	.2byte	0x287
-	.uleb128 0x87
+	.byte	0xac
+	.byte	0x4e
+	.uleb128 0x89
 	.4byte	.LASF3306
 	.4byte	.LASF3306
-	.byte	0xbf
-	.byte	0x38
+	.byte	0x2
+	.2byte	0x287
 	.uleb128 0x88
 	.4byte	.LASF3307
 	.4byte	.LASF3307
-	.byte	0xc
-	.2byte	0x165
-	.uleb128 0x88
+	.byte	0xbf
+	.byte	0x38
+	.uleb128 0x89
 	.4byte	.LASF3308
 	.4byte	.LASF3308
-	.byte	0xa3
-	.2byte	0x37b
-	.uleb128 0x88
+	.byte	0xc
+	.2byte	0x165
+	.uleb128 0x89
 	.4byte	.LASF3309
 	.4byte	.LASF3309
-	.byte	0xc
-	.2byte	0x125
+	.byte	0xa3
+	.2byte	0x37b
 	.uleb128 0x89
 	.4byte	.LASF3310
 	.4byte	.LASF3310
-	.uleb128 0x87
+	.byte	0xc
+	.2byte	0x125
+	.uleb128 0x8a
 	.4byte	.LASF3311
 	.4byte	.LASF3311
-	.byte	0xc3
-	.byte	0x2f
 	.uleb128 0x88
 	.4byte	.LASF3312
 	.4byte	.LASF3312
-	.byte	0x20
-	.2byte	0x1c7
-	.uleb128 0x88
+	.byte	0xc3
+	.byte	0x2f
+	.uleb128 0x89
 	.4byte	.LASF3313
 	.4byte	.LASF3313
 	.byte	0x20
-	.2byte	0x17e
-	.uleb128 0x87
+	.2byte	0x1c7
+	.uleb128 0x89
 	.4byte	.LASF3314
 	.4byte	.LASF3314
-	.byte	0x3
-	.byte	0x3a
-	.uleb128 0x87
+	.byte	0x20
+	.2byte	0x17e
+	.uleb128 0x88
 	.4byte	.LASF3315
 	.4byte	.LASF3315
-	.byte	0xc2
-	.byte	0x32
+	.byte	0x3
+	.byte	0x3a
 	.uleb128 0x88
 	.4byte	.LASF3316
 	.4byte	.LASF3316
-	.byte	0x76
-	.2byte	0xa0a
-	.uleb128 0x87
+	.byte	0xc2
+	.byte	0x32
+	.uleb128 0x89
 	.4byte	.LASF3317
 	.4byte	.LASF3317
-	.byte	0xc3
-	.byte	0x2d
-	.uleb128 0x87
+	.byte	0x76
+	.2byte	0xa0a
+	.uleb128 0x88
 	.4byte	.LASF3318
 	.4byte	.LASF3318
-	.byte	0x48
-	.byte	0xdc
+	.byte	0xc3
+	.byte	0x2d
 	.uleb128 0x88
 	.4byte	.LASF3319
 	.4byte	.LASF3319
-	.byte	0x3a
-	.2byte	0x459
-	.uleb128 0x87
+	.byte	0x48
+	.byte	0xdc
+	.uleb128 0x89
 	.4byte	.LASF3320
 	.4byte	.LASF3320
 	.byte	0x3a
-	.byte	0xe9
+	.2byte	0x459
 	.uleb128 0x88
 	.4byte	.LASF3321
 	.4byte	.LASF3321
 	.byte	0x3a
-	.2byte	0x45a
-	.uleb128 0x88
+	.byte	0xe9
+	.uleb128 0x89
 	.4byte	.LASF3322
 	.4byte	.LASF3322
-	.byte	0x6
-	.2byte	0x19f
-	.uleb128 0x88
+	.byte	0x3a
+	.2byte	0x45a
+	.uleb128 0x89
 	.4byte	.LASF3323
 	.4byte	.LASF3323
 	.byte	0x6
-	.2byte	0x199
-	.uleb128 0x87
+	.2byte	0x19f
+	.uleb128 0x89
 	.4byte	.LASF3324
 	.4byte	.LASF3324
-	.byte	0xc3
-	.byte	0x26
-	.uleb128 0x87
+	.byte	0x6
+	.2byte	0x199
+	.uleb128 0x88
 	.4byte	.LASF3325
 	.4byte	.LASF3325
 	.byte	0xc3
-	.byte	0x2b
-	.uleb128 0x87
+	.byte	0x26
+	.uleb128 0x88
 	.4byte	.LASF3326
 	.4byte	.LASF3326
 	.byte	0xc3
-	.byte	0x25
-	.uleb128 0x87
+	.byte	0x2b
+	.uleb128 0x88
 	.4byte	.LASF3327
 	.4byte	.LASF3327
 	.byte	0xc3
-	.byte	0x24
-	.uleb128 0x87
+	.byte	0x25
+	.uleb128 0x88
 	.4byte	.LASF3328
 	.4byte	.LASF3328
-	.byte	0x9c
-	.byte	0x73
-	.uleb128 0x87
+	.byte	0xc3
+	.byte	0x24
+	.uleb128 0x88
 	.4byte	.LASF3329
 	.4byte	.LASF3329
-	.byte	0xc3
-	.byte	0x2a
-	.uleb128 0x87
+	.byte	0x9c
+	.byte	0x73
+	.uleb128 0x88
 	.4byte	.LASF3330
 	.4byte	.LASF3330
-	.byte	0xc3
-	.byte	0x27
-	.uleb128 0x87
+	.byte	0x48
+	.byte	0xd7
+	.uleb128 0x88
 	.4byte	.LASF3331
 	.4byte	.LASF3331
-	.byte	0x72
-	.byte	0x88
-	.uleb128 0x87
+	.byte	0xc3
+	.byte	0x2a
+	.uleb128 0x88
 	.4byte	.LASF3332
 	.4byte	.LASF3332
-	.byte	0xc4
-	.byte	0x6e
-	.uleb128 0x87
+	.byte	0xc3
+	.byte	0x27
+	.uleb128 0x88
 	.4byte	.LASF3333
 	.4byte	.LASF3333
 	.byte	0x72
-	.byte	0x98
-	.uleb128 0x87
+	.byte	0x88
+	.uleb128 0x88
 	.4byte	.LASF3334
 	.4byte	.LASF3334
-	.byte	0xc2
-	.byte	0x33
+	.byte	0xc4
+	.byte	0x6e
 	.uleb128 0x88
 	.4byte	.LASF3335
 	.4byte	.LASF3335
+	.byte	0x72
+	.byte	0x98
+	.uleb128 0x88
+	.4byte	.LASF3336
+	.4byte	.LASF3336
+	.byte	0xc2
+	.byte	0x33
+	.uleb128 0x89
+	.4byte	.LASF3337
+	.4byte	.LASF3337
 	.byte	0x12
 	.2byte	0x1d6
-	.uleb128 0x8a
+	.uleb128 0x8b
 	.string	"up"
 	.string	"up"
 	.byte	0x78
 	.byte	0x2c
-	.uleb128 0x87
-	.4byte	.LASF3336
-	.4byte	.LASF3336
+	.uleb128 0x88
+	.4byte	.LASF3338
+	.4byte	.LASF3338
 	.byte	0x78
 	.byte	0x27
-	.uleb128 0x87
-	.4byte	.LASF3337
-	.4byte	.LASF3337
+	.uleb128 0x88
+	.4byte	.LASF3339
+	.4byte	.LASF3339
 	.byte	0x1e
 	.byte	0xb0
-	.uleb128 0x87
-	.4byte	.LASF3338
-	.4byte	.LASF3338
+	.uleb128 0x88
+	.4byte	.LASF3340
+	.4byte	.LASF3340
 	.byte	0x9c
 	.byte	0x71
 	.byte	0
@@ -51749,6 +51922,13 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x73
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x74
 	.uleb128 0xa
 	.byte	0
 	.uleb128 0x3
@@ -51759,14 +51939,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x5
 	.byte	0
 	.byte	0
-	.uleb128 0x74
+	.uleb128 0x75
 	.uleb128 0xa
 	.byte	0
 	.uleb128 0x31
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x75
+	.uleb128 0x76
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -51781,7 +51961,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x18
 	.byte	0
 	.byte	0
-	.uleb128 0x76
+	.uleb128 0x77
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3f
@@ -51806,7 +51986,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x77
+	.uleb128 0x78
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3f
@@ -51831,7 +52011,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x78
+	.uleb128 0x79
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -51846,7 +52026,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x18
 	.byte	0
 	.byte	0
-	.uleb128 0x79
+	.uleb128 0x7a
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -51861,7 +52041,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x7a
+	.uleb128 0x7b
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -51874,7 +52054,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -51889,7 +52069,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x7c
+	.uleb128 0x7d
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -51904,7 +52084,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x18
 	.byte	0
 	.byte	0
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -51917,7 +52097,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -51936,7 +52116,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x7f
+	.uleb128 0x80
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -51949,7 +52129,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x80
+	.uleb128 0x81
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -51962,7 +52142,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x81
+	.uleb128 0x82
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -51979,7 +52159,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x82
+	.uleb128 0x83
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3
@@ -51996,7 +52176,7 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x83
+	.uleb128 0x84
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3
@@ -52011,12 +52191,12 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x84
+	.uleb128 0x85
 	.uleb128 0x35
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x85
+	.uleb128 0x86
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x31
@@ -52033,7 +52213,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x86
+	.uleb128 0x87
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x31
@@ -52050,7 +52230,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x87
+	.uleb128 0x88
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -52067,7 +52247,7 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x88
+	.uleb128 0x89
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -52084,7 +52264,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x5
 	.byte	0
 	.byte	0
-	.uleb128 0x89
+	.uleb128 0x8a
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -52097,7 +52277,7 @@ __exitcall_ebc_exit:
 	.uleb128 0xe
 	.byte	0
 	.byte	0
-	.uleb128 0x8a
+	.uleb128 0x8b
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -53661,69 +53841,69 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL890
-	.8byte	.LVL896
+	.8byte	.LVL891
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL896
-	.8byte	.LVL898
+	.8byte	.LVL891
+	.8byte	.LVL893
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL898
-	.8byte	.LVL942
+	.8byte	.LVL893
+	.8byte	.LVL954
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL942
-	.8byte	.LVL943
+	.8byte	.LVL954
+	.8byte	.LVL955
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL943
-	.8byte	.LVL969
+	.8byte	.LVL955
+	.8byte	.LVL975
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL969
-	.8byte	.LVL970
+	.8byte	.LVL975
+	.8byte	.LVL976
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL970
-	.8byte	.LVL1015
+	.8byte	.LVL976
+	.8byte	.LVL1022
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL1015
-	.8byte	.LVL1016
+	.8byte	.LVL1022
+	.8byte	.LVL1023
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1016
+	.8byte	.LVL1023
 	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
 .LLST242:
-	.8byte	.LVL901
-	.8byte	.LVL905-1
+	.8byte	.LVL897
+	.8byte	.LVL901-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL935
-	.8byte	.LVL936
+	.8byte	.LVL931
+	.8byte	.LVL932
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL966
-	.8byte	.LVL968-1
+	.8byte	.LVL972
+	.8byte	.LVL974-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL988
-	.8byte	.LVL992-1
+	.8byte	.LVL994
+	.8byte	.LVL998-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST243:
-	.8byte	.LVL903
-	.8byte	.LVL904
+	.8byte	.LVL899
+	.8byte	.LVL900
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL967
-	.8byte	.LVL968-1
+	.8byte	.LVL973
+	.8byte	.LVL974-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
@@ -53734,108 +53914,161 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x69
 	.8byte	.LVL889
+	.8byte	.LVL914
+	.2byte	0x1
+	.byte	0x69
 	.8byte	.LVL918
+	.8byte	.LVL921
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL922
 	.8byte	.LVL925
+	.8byte	.LVL1001
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL929
-	.8byte	.LVL995
+	.8byte	.LVL1006
+	.8byte	.LVL1010
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1000
-	.8byte	.LVL1020
+	.8byte	.LVL1011
+	.8byte	.LVL1029
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1026
+	.8byte	.LVL1035
 	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST261:
-	.8byte	.LVL985
-	.8byte	.LVL986
+.LLST263:
+	.8byte	.LVL991
+	.8byte	.LVL992
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1022
-	.8byte	.LVL1023-1
+	.8byte	.LVL1031
+	.8byte	.LVL1032-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST260:
-	.8byte	.LVL959
-	.8byte	.LVL960
+.LLST262:
+	.8byte	.LVL965
+	.8byte	.LVL966
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1011
-	.8byte	.LVL1012-1
+	.8byte	.LVL1018
+	.8byte	.LVL1019-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST259:
-	.8byte	.LVL891
+.LLST245:
+	.8byte	.LVL877
+	.8byte	.LVL879
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL885
+	.8byte	.LVL887
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL889
 	.8byte	.LVL892
 	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL933
+	.8byte	.LVL954
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL1037
+	.8byte	.LVL1047
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL1057
+	.8byte	.LFE2838
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST246:
+	.8byte	.LVL939
+	.8byte	.LVL940
+	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL949
-	.8byte	.LVL950-1
+	.8byte	.LVL945
+	.8byte	.LVL946
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST245:
-	.8byte	.LVL893
-	.8byte	.LVL894
+.LLST247:
+	.8byte	.LVL937
+	.8byte	.LVL938
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL943
+	.8byte	.LVL944
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST266:
+	.8byte	.LVL1041
+	.8byte	.LVL1042-1
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL938
-	.8byte	.LVL939-1
+	.8byte	.LVL1045
+	.8byte	.LVL1046
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST246:
-	.8byte	.LVL989
-	.8byte	.LVL990
+.LLST261:
+	.8byte	.LVL948
+	.8byte	.LVL949-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL951
+	.8byte	.LVL952
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST248:
+	.8byte	.LVL995
+	.8byte	.LVL996
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL990
-	.8byte	.LVL991
+	.8byte	.LVL996
+	.8byte	.LVL997
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST247:
-	.8byte	.LVL910
-	.8byte	.LVL911-1
+.LLST249:
+	.8byte	.LVL906
+	.8byte	.LVL907-1
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST248:
-	.8byte	.LVL907
-	.8byte	.LVL908-1
+.LLST250:
+	.8byte	.LVL903
+	.8byte	.LVL904-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL913
-	.8byte	.LVL929
+	.8byte	.LVL909
+	.8byte	.LVL925
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL962
-	.8byte	.LVL964-1
+	.8byte	.LVL968
+	.8byte	.LVL970-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL995
-	.8byte	.LVL1001-1
+	.8byte	.LVL1001
+	.8byte	.LVL1007-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL1004
-	.8byte	.LVL1005-1
+	.8byte	.LVL1010
+	.8byte	.LVL1012-1
 	.2byte	0x1
 	.byte	0x62
 	.8byte	.LVL1026
@@ -53844,95 +54077,103 @@ __exitcall_ebc_exit:
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST249:
-	.8byte	.LVL918
-	.8byte	.LVL921
+.LLST251:
+	.8byte	.LVL914
+	.8byte	.LVL917
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL926
-	.8byte	.LVL929
+	.8byte	.LVL922
+	.8byte	.LVL925
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL995
-	.8byte	.LVL998
+	.8byte	.LVL1001
+	.8byte	.LVL1004
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1010
+	.8byte	.LVL1011
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST250:
+.LLST252:
 	.8byte	.LVL877
 	.8byte	.LVL888
 	.2byte	0x1
 	.byte	0x69
 	.8byte	.LVL889
-	.8byte	.LVL902
+	.8byte	.LVL898
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL907
-	.8byte	.LVL918
+	.8byte	.LVL903
+	.8byte	.LVL914
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL916
+	.8byte	.LVL921
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL920
 	.8byte	.LVL925
+	.8byte	.LVL961
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL929
-	.8byte	.LVL955
+	.8byte	.LVL968
+	.8byte	.LVL972
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL962
-	.8byte	.LVL966
+	.8byte	.LVL975
+	.8byte	.LVL994
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL969
-	.8byte	.LVL988
+	.8byte	.LVL999
+	.8byte	.LVL1001
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL993
-	.8byte	.LVL995
+	.8byte	.LVL1003
+	.8byte	.LVL1010
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL997
-	.8byte	.LVL1009
+	.8byte	.LVL1011
+	.8byte	.LVL1016
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1015
-	.8byte	.LVL1020
+	.8byte	.LVL1022
+	.8byte	.LVL1029
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1026
+	.8byte	.LVL1035
 	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST251:
-	.8byte	.LVL907
-	.8byte	.LVL908-1
+.LLST253:
+	.8byte	.LVL903
+	.8byte	.LVL904-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL917
-	.8byte	.LVL919
+	.8byte	.LVL913
+	.8byte	.LVL915
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL920
-	.8byte	.LVL929
+	.8byte	.LVL916
+	.8byte	.LVL925
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL962
-	.8byte	.LVL964-1
+	.8byte	.LVL968
+	.8byte	.LVL970-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL995
-	.8byte	.LVL996
+	.8byte	.LVL1001
+	.8byte	.LVL1002
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL1000
-	.8byte	.LVL1001-1
+	.8byte	.LVL1006
+	.8byte	.LVL1007-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL1004
-	.8byte	.LVL1005-1
+	.8byte	.LVL1010
+	.8byte	.LVL1012-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	.LVL1026
@@ -53941,29 +54182,29 @@ __exitcall_ebc_exit:
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST252:
-	.8byte	.LVL907
-	.8byte	.LVL908-1
+.LLST254:
+	.8byte	.LVL903
+	.8byte	.LVL904-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL917
-	.8byte	.LVL927
+	.8byte	.LVL913
+	.8byte	.LVL923
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL928
-	.8byte	.LVL929
+	.8byte	.LVL924
+	.8byte	.LVL925
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL962
-	.8byte	.LVL964-1
+	.8byte	.LVL968
+	.8byte	.LVL970-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL995
-	.8byte	.LVL1001-1
+	.8byte	.LVL1001
+	.8byte	.LVL1007-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL1004
-	.8byte	.LVL1005-1
+	.8byte	.LVL1010
+	.8byte	.LVL1012-1
 	.2byte	0x1
 	.byte	0x53
 	.8byte	.LVL1026
@@ -53972,33 +54213,33 @@ __exitcall_ebc_exit:
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST253:
-	.8byte	.LVL907
-	.8byte	.LVL908-1
+.LLST255:
+	.8byte	.LVL903
+	.8byte	.LVL904-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL917
-	.8byte	.LVL918
+	.8byte	.LVL913
+	.8byte	.LVL914
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL921
-	.8byte	.LVL923
+	.8byte	.LVL917
+	.8byte	.LVL919
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL923
-	.8byte	.LVL924
+	.8byte	.LVL919
+	.8byte	.LVL920
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL962
-	.8byte	.LVL964-1
+	.8byte	.LVL968
+	.8byte	.LVL970-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL999
-	.8byte	.LVL1001-1
+	.8byte	.LVL1005
+	.8byte	.LVL1007-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL1004
-	.8byte	.LVL1005-1
+	.8byte	.LVL1011
+	.8byte	.LVL1012-1
 	.2byte	0x1
 	.byte	0x55
 	.8byte	.LVL1026
@@ -54007,25 +54248,25 @@ __exitcall_ebc_exit:
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST254:
-	.8byte	.LVL907
-	.8byte	.LVL908-1
+.LLST256:
+	.8byte	.LVL903
+	.8byte	.LVL904-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL916
-	.8byte	.LVL929
+	.8byte	.LVL912
+	.8byte	.LVL925
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL962
-	.8byte	.LVL964-1
+	.8byte	.LVL968
+	.8byte	.LVL970-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL995
-	.8byte	.LVL1001-1
+	.8byte	.LVL1001
+	.8byte	.LVL1007-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL1004
-	.8byte	.LVL1005-1
+	.8byte	.LVL1010
+	.8byte	.LVL1012-1
 	.2byte	0x1
 	.byte	0x61
 	.8byte	.LVL1026
@@ -54034,25 +54275,25 @@ __exitcall_ebc_exit:
 	.byte	0x61
 	.8byte	0
 	.8byte	0
-.LLST255:
-	.8byte	.LVL907
-	.8byte	.LVL908-1
+.LLST257:
+	.8byte	.LVL903
+	.8byte	.LVL904-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL914
-	.8byte	.LVL929
+	.8byte	.LVL910
+	.8byte	.LVL925
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL962
-	.8byte	.LVL964-1
+	.8byte	.LVL968
+	.8byte	.LVL970-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL995
-	.8byte	.LVL1001-1
+	.8byte	.LVL1001
+	.8byte	.LVL1007-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL1004
-	.8byte	.LVL1005-1
+	.8byte	.LVL1010
+	.8byte	.LVL1012-1
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	.LVL1026
@@ -54061,25 +54302,25 @@ __exitcall_ebc_exit:
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST256:
-	.8byte	.LVL907
-	.8byte	.LVL908-1
+.LLST258:
+	.8byte	.LVL903
+	.8byte	.LVL904-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL916
-	.8byte	.LVL929
+	.8byte	.LVL912
+	.8byte	.LVL925
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL962
-	.8byte	.LVL964-1
+	.8byte	.LVL968
+	.8byte	.LVL970-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL995
-	.8byte	.LVL1001-1
+	.8byte	.LVL1001
+	.8byte	.LVL1007-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL1004
-	.8byte	.LVL1005-1
+	.8byte	.LVL1010
+	.8byte	.LVL1012-1
 	.2byte	0x1
 	.byte	0x60
 	.8byte	.LVL1026
@@ -54088,7 +54329,7 @@ __exitcall_ebc_exit:
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST257:
+.LLST259:
 	.8byte	.LVL877
 	.8byte	.LVL879
 	.2byte	0x1
@@ -54098,84 +54339,84 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL889
-	.8byte	.LVL897
+	.8byte	.LVL892
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL907
-	.8byte	.LVL909
+	.8byte	.LVL903
+	.8byte	.LVL905
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL915
-	.8byte	.LVL929
+	.8byte	.LVL911
+	.8byte	.LVL925
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL936
-	.8byte	.LVL942
+	.8byte	.LVL933
+	.8byte	.LVL935
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL947
-	.8byte	.LVL955
+	.8byte	.LVL959
+	.8byte	.LVL961
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL962
-	.8byte	.LVL963
+	.8byte	.LVL968
+	.8byte	.LVL969
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL995
-	.8byte	.LVL1007
+	.8byte	.LVL1001
+	.8byte	.LVL1014
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL1026
 	.8byte	.LVL1028
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL1030
-	.8byte	.LVL1032
+	.8byte	.LVL1037
+	.8byte	.LVL1039
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL1038
-	.8byte	.LVL1040
+	.8byte	.LVL1050
+	.8byte	.LVL1052
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL1042
+	.8byte	.LVL1057
 	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST258:
-	.8byte	.LVL933
-	.8byte	.LVL934
+.LLST260:
+	.8byte	.LVL929
+	.8byte	.LVL930
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL979
-	.8byte	.LVL980-1
+	.8byte	.LVL985
+	.8byte	.LVL986-1
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST262:
-	.8byte	.LVL931
-	.8byte	.LVL932
+.LLST264:
+	.8byte	.LVL927
+	.8byte	.LVL928
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL1018
-	.8byte	.LVL1019
+	.8byte	.LVL1025
+	.8byte	.LVL1026
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL1036
-	.8byte	.LVL1037-1
+	.8byte	.LVL1054
+	.8byte	.LVL1055-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST263:
-	.8byte	.LVL972
-	.8byte	.LVL973-1
+.LLST265:
+	.8byte	.LVL978
+	.8byte	.LVL979-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL1029
-	.8byte	.LVL1030
+	.8byte	.LVL1036
+	.8byte	.LVL1037
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
@@ -55800,616 +56041,628 @@ __exitcall_ebc_exit:
 	.2byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0-.Ltext0
-	.8byte	.LFB2867
-	.8byte	.LFE2867-.LFB2867
-	.8byte	.LFB2866
-	.8byte	.LFE2866-.LFB2866
-	.8byte	0
-	.8byte	0
-	.section	.debug_ranges,"",@progbits
-.Ldebug_ranges0:
-	.8byte	.LBB958
-	.8byte	.LBE958
-	.8byte	.LBB961
-	.8byte	.LBE961
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB962
-	.8byte	.LBE962
-	.8byte	.LBB993
-	.8byte	.LBE993
-	.8byte	.LBB994
-	.8byte	.LBE994
-	.8byte	.LBB1059
-	.8byte	.LBE1059
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB965
-	.8byte	.LBE965
-	.8byte	.LBB977
-	.8byte	.LBE977
-	.8byte	.LBB978
-	.8byte	.LBE978
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB981
-	.8byte	.LBE981
-	.8byte	.LBB986
-	.8byte	.LBE986
+	.8byte	.LFB2867
+	.8byte	.LFE2867-.LFB2867
+	.8byte	.LFB2866
+	.8byte	.LFE2866-.LFB2866
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB995
-	.8byte	.LBE995
-	.8byte	.LBB1216
-	.8byte	.LBE1216
-	.8byte	.LBB1217
-	.8byte	.LBE1217
+	.section	.debug_ranges,"",@progbits
+.Ldebug_ranges0:
+	.8byte	.LBB984
+	.8byte	.LBE984
+	.8byte	.LBB987
+	.8byte	.LBE987
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB998
-	.8byte	.LBE998
-	.8byte	.LBB1018
-	.8byte	.LBE1018
+	.8byte	.LBB988
+	.8byte	.LBE988
 	.8byte	.LBB1019
 	.8byte	.LBE1019
+	.8byte	.LBB1020
+	.8byte	.LBE1020
+	.8byte	.LBB1085
+	.8byte	.LBE1085
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1012
-	.8byte	.LBE1012
-	.8byte	.LBB1017
-	.8byte	.LBE1017
+	.8byte	.LBB991
+	.8byte	.LBE991
+	.8byte	.LBB1003
+	.8byte	.LBE1003
+	.8byte	.LBB1004
+	.8byte	.LBE1004
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1024
-	.8byte	.LBE1024
-	.8byte	.LBB1227
-	.8byte	.LBE1227
-	.8byte	.LBB1229
-	.8byte	.LBE1229
-	.8byte	.LBB1230
-	.8byte	.LBE1230
+	.8byte	.LBB1007
+	.8byte	.LBE1007
+	.8byte	.LBB1012
+	.8byte	.LBE1012
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1030
-	.8byte	.LBE1030
-	.8byte	.LBB1214
-	.8byte	.LBE1214
-	.8byte	.LBB1215
-	.8byte	.LBE1215
+	.8byte	.LBB1021
+	.8byte	.LBE1021
+	.8byte	.LBB1242
+	.8byte	.LBE1242
+	.8byte	.LBB1243
+	.8byte	.LBE1243
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1033
-	.8byte	.LBE1033
-	.8byte	.LBB1053
-	.8byte	.LBE1053
-	.8byte	.LBB1054
-	.8byte	.LBE1054
+	.8byte	.LBB1024
+	.8byte	.LBE1024
+	.8byte	.LBB1044
+	.8byte	.LBE1044
+	.8byte	.LBB1045
+	.8byte	.LBE1045
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1047
-	.8byte	.LBE1047
-	.8byte	.LBB1052
-	.8byte	.LBE1052
+	.8byte	.LBB1038
+	.8byte	.LBE1038
+	.8byte	.LBB1043
+	.8byte	.LBE1043
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1060
-	.8byte	.LBE1060
-	.8byte	.LBB1093
-	.8byte	.LBE1093
-	.8byte	.LBB1224
-	.8byte	.LBE1224
-	.8byte	.LBB1225
-	.8byte	.LBE1225
+	.8byte	.LBB1050
+	.8byte	.LBE1050
+	.8byte	.LBB1253
+	.8byte	.LBE1253
+	.8byte	.LBB1255
+	.8byte	.LBE1255
+	.8byte	.LBB1256
+	.8byte	.LBE1256
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1063
-	.8byte	.LBE1063
-	.8byte	.LBB1076
-	.8byte	.LBE1076
-	.8byte	.LBB1085
-	.8byte	.LBE1085
-	.8byte	.LBB1086
-	.8byte	.LBE1086
+	.8byte	.LBB1056
+	.8byte	.LBE1056
+	.8byte	.LBB1240
+	.8byte	.LBE1240
+	.8byte	.LBB1241
+	.8byte	.LBE1241
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1059
+	.8byte	.LBE1059
 	.8byte	.LBB1079
 	.8byte	.LBE1079
-	.8byte	.LBB1084
-	.8byte	.LBE1084
+	.8byte	.LBB1080
+	.8byte	.LBE1080
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1094
-	.8byte	.LBE1094
-	.8byte	.LBB1129
-	.8byte	.LBE1129
-	.8byte	.LBB1220
-	.8byte	.LBE1220
-	.8byte	.LBB1221
-	.8byte	.LBE1221
-	.8byte	.LBB1231
-	.8byte	.LBE1231
+	.8byte	.LBB1073
+	.8byte	.LBE1073
+	.8byte	.LBB1078
+	.8byte	.LBE1078
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1097
-	.8byte	.LBE1097
-	.8byte	.LBB1110
-	.8byte	.LBE1110
+	.8byte	.LBB1086
+	.8byte	.LBE1086
 	.8byte	.LBB1119
 	.8byte	.LBE1119
-	.8byte	.LBB1120
-	.8byte	.LBE1120
+	.8byte	.LBB1250
+	.8byte	.LBE1250
+	.8byte	.LBB1251
+	.8byte	.LBE1251
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1113
-	.8byte	.LBE1113
-	.8byte	.LBB1118
-	.8byte	.LBE1118
+	.8byte	.LBB1089
+	.8byte	.LBE1089
+	.8byte	.LBB1102
+	.8byte	.LBE1102
+	.8byte	.LBB1111
+	.8byte	.LBE1111
+	.8byte	.LBB1112
+	.8byte	.LBE1112
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1130
-	.8byte	.LBE1130
-	.8byte	.LBB1141
-	.8byte	.LBE1141
+	.8byte	.LBB1105
+	.8byte	.LBE1105
+	.8byte	.LBB1110
+	.8byte	.LBE1110
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1133
-	.8byte	.LBE1133
-	.8byte	.LBB1138
-	.8byte	.LBE1138
+	.8byte	.LBB1120
+	.8byte	.LBE1120
+	.8byte	.LBB1155
+	.8byte	.LBE1155
+	.8byte	.LBB1246
+	.8byte	.LBE1246
+	.8byte	.LBB1247
+	.8byte	.LBE1247
+	.8byte	.LBB1257
+	.8byte	.LBE1257
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1123
+	.8byte	.LBE1123
+	.8byte	.LBB1136
+	.8byte	.LBE1136
+	.8byte	.LBB1145
+	.8byte	.LBE1145
+	.8byte	.LBB1146
+	.8byte	.LBE1146
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1134
-	.8byte	.LBE1134
-	.8byte	.LBB1137
-	.8byte	.LBE1137
+	.8byte	.LBB1139
+	.8byte	.LBE1139
+	.8byte	.LBB1144
+	.8byte	.LBE1144
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1142
-	.8byte	.LBE1142
-	.8byte	.LBB1177
-	.8byte	.LBE1177
-	.8byte	.LBB1218
-	.8byte	.LBE1218
-	.8byte	.LBB1219
-	.8byte	.LBE1219
-	.8byte	.LBB1226
-	.8byte	.LBE1226
+	.8byte	.LBB1156
+	.8byte	.LBE1156
+	.8byte	.LBB1167
+	.8byte	.LBE1167
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1145
-	.8byte	.LBE1145
-	.8byte	.LBB1158
-	.8byte	.LBE1158
 	.8byte	.LBB1159
 	.8byte	.LBE1159
-	.8byte	.LBB1160
-	.8byte	.LBE1160
+	.8byte	.LBB1164
+	.8byte	.LBE1164
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1160
+	.8byte	.LBE1160
 	.8byte	.LBB1163
 	.8byte	.LBE1163
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB1168
 	.8byte	.LBE1168
+	.8byte	.LBB1203
+	.8byte	.LBE1203
+	.8byte	.LBB1244
+	.8byte	.LBE1244
+	.8byte	.LBB1245
+	.8byte	.LBE1245
+	.8byte	.LBB1252
+	.8byte	.LBE1252
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1178
-	.8byte	.LBE1178
-	.8byte	.LBB1213
-	.8byte	.LBE1213
-	.8byte	.LBB1222
-	.8byte	.LBE1222
-	.8byte	.LBB1223
-	.8byte	.LBE1223
-	.8byte	.LBB1228
-	.8byte	.LBE1228
+	.8byte	.LBB1171
+	.8byte	.LBE1171
+	.8byte	.LBB1184
+	.8byte	.LBE1184
+	.8byte	.LBB1185
+	.8byte	.LBE1185
+	.8byte	.LBB1186
+	.8byte	.LBE1186
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1181
-	.8byte	.LBE1181
+	.8byte	.LBB1189
+	.8byte	.LBE1189
 	.8byte	.LBB1194
 	.8byte	.LBE1194
-	.8byte	.LBB1195
-	.8byte	.LBE1195
-	.8byte	.LBB1196
-	.8byte	.LBE1196
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1199
-	.8byte	.LBE1199
 	.8byte	.LBB1204
 	.8byte	.LBE1204
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1236
-	.8byte	.LBE1236
 	.8byte	.LBB1239
 	.8byte	.LBE1239
+	.8byte	.LBB1248
+	.8byte	.LBE1248
+	.8byte	.LBB1249
+	.8byte	.LBE1249
+	.8byte	.LBB1254
+	.8byte	.LBE1254
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1270
-	.8byte	.LBE1270
-	.8byte	.LBB1282
-	.8byte	.LBE1282
-	.8byte	.LBB1284
-	.8byte	.LBE1284
-	.8byte	.LBB1286
-	.8byte	.LBE1286
+	.8byte	.LBB1207
+	.8byte	.LBE1207
+	.8byte	.LBB1220
+	.8byte	.LBE1220
+	.8byte	.LBB1221
+	.8byte	.LBE1221
+	.8byte	.LBB1222
+	.8byte	.LBE1222
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1275
-	.8byte	.LBE1275
-	.8byte	.LBB1283
-	.8byte	.LBE1283
-	.8byte	.LBB1285
-	.8byte	.LBE1285
-	.8byte	.LBB1294
-	.8byte	.LBE1294
-	.8byte	.LBB1296
-	.8byte	.LBE1296
-	.8byte	.LBB1298
-	.8byte	.LBE1298
+	.8byte	.LBB1225
+	.8byte	.LBE1225
+	.8byte	.LBB1230
+	.8byte	.LBE1230
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1287
-	.8byte	.LBE1287
-	.8byte	.LBB1295
-	.8byte	.LBE1295
-	.8byte	.LBB1297
-	.8byte	.LBE1297
-	.8byte	.LBB1304
-	.8byte	.LBE1304
-	.8byte	.LBB1306
-	.8byte	.LBE1306
+	.8byte	.LBB1262
+	.8byte	.LBE1262
+	.8byte	.LBB1265
+	.8byte	.LBE1265
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1296
+	.8byte	.LBE1296
 	.8byte	.LBB1308
 	.8byte	.LBE1308
+	.8byte	.LBB1310
+	.8byte	.LBE1310
+	.8byte	.LBB1312
+	.8byte	.LBE1312
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1299
-	.8byte	.LBE1299
-	.8byte	.LBB1305
-	.8byte	.LBE1305
-	.8byte	.LBB1307
-	.8byte	.LBE1307
+	.8byte	.LBB1301
+	.8byte	.LBE1301
 	.8byte	.LBB1309
 	.8byte	.LBE1309
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1314
-	.8byte	.LBE1314
+	.8byte	.LBB1311
+	.8byte	.LBE1311
 	.8byte	.LBB1320
 	.8byte	.LBE1320
-	.8byte	.LBB1326
-	.8byte	.LBE1326
-	.8byte	.LBB1328
-	.8byte	.LBE1328
-	.8byte	.LBB1330
-	.8byte	.LBE1330
+	.8byte	.LBB1322
+	.8byte	.LBE1322
+	.8byte	.LBB1324
+	.8byte	.LBE1324
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1313
+	.8byte	.LBE1313
 	.8byte	.LBB1321
 	.8byte	.LBE1321
-	.8byte	.LBB1327
-	.8byte	.LBE1327
-	.8byte	.LBB1329
-	.8byte	.LBE1329
-	.8byte	.LBB1331
-	.8byte	.LBE1331
-	.8byte	0
-	.8byte	0
+	.8byte	.LBB1323
+	.8byte	.LBE1323
+	.8byte	.LBB1330
+	.8byte	.LBE1330
+	.8byte	.LBB1332
+	.8byte	.LBE1332
 	.8byte	.LBB1334
 	.8byte	.LBE1334
-	.8byte	.LBB1347
-	.8byte	.LBE1347
-	.8byte	.LBB1349
-	.8byte	.LBE1349
-	.8byte	.LBB1351
-	.8byte	.LBE1351
-	.8byte	.LBB1353
-	.8byte	.LBE1353
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1325
+	.8byte	.LBE1325
+	.8byte	.LBB1331
+	.8byte	.LBE1331
+	.8byte	.LBB1333
+	.8byte	.LBE1333
+	.8byte	.LBB1335
+	.8byte	.LBE1335
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1340
 	.8byte	.LBE1340
 	.8byte	.LBB1346
 	.8byte	.LBE1346
-	.8byte	.LBB1348
-	.8byte	.LBE1348
-	.8byte	.LBB1350
-	.8byte	.LBE1350
 	.8byte	.LBB1352
 	.8byte	.LBE1352
+	.8byte	.LBB1354
+	.8byte	.LBE1354
+	.8byte	.LBB1356
+	.8byte	.LBE1356
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1382
-	.8byte	.LBE1382
-	.8byte	.LBB1396
-	.8byte	.LBE1396
-	.8byte	.LBB1424
-	.8byte	.LBE1424
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1384
-	.8byte	.LBE1384
-	.8byte	.LBB1393
-	.8byte	.LBE1393
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1399
-	.8byte	.LBE1399
-	.8byte	.LBB1425
-	.8byte	.LBE1425
+	.8byte	.LBB1347
+	.8byte	.LBE1347
+	.8byte	.LBB1353
+	.8byte	.LBE1353
+	.8byte	.LBB1355
+	.8byte	.LBE1355
+	.8byte	.LBB1357
+	.8byte	.LBE1357
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1360
+	.8byte	.LBE1360
+	.8byte	.LBB1373
+	.8byte	.LBE1373
+	.8byte	.LBB1375
+	.8byte	.LBE1375
+	.8byte	.LBB1377
+	.8byte	.LBE1377
+	.8byte	.LBB1379
+	.8byte	.LBE1379
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1366
+	.8byte	.LBE1366
+	.8byte	.LBB1372
+	.8byte	.LBE1372
+	.8byte	.LBB1374
+	.8byte	.LBE1374
+	.8byte	.LBB1376
+	.8byte	.LBE1376
+	.8byte	.LBB1378
+	.8byte	.LBE1378
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1401
-	.8byte	.LBE1401
-	.8byte	.LBB1414
-	.8byte	.LBE1414
-	.8byte	.LBB1416
-	.8byte	.LBE1416
-	.8byte	.LBB1418
-	.8byte	.LBE1418
-	.8byte	.LBB1420
-	.8byte	.LBE1420
+	.8byte	.LBB1408
+	.8byte	.LBE1408
 	.8byte	.LBB1422
 	.8byte	.LBE1422
+	.8byte	.LBB1450
+	.8byte	.LBE1450
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1408
-	.8byte	.LBE1408
-	.8byte	.LBB1415
-	.8byte	.LBE1415
-	.8byte	.LBB1417
-	.8byte	.LBE1417
+	.8byte	.LBB1410
+	.8byte	.LBE1410
 	.8byte	.LBB1419
 	.8byte	.LBE1419
-	.8byte	.LBB1421
-	.8byte	.LBE1421
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1428
-	.8byte	.LBE1428
+	.8byte	.LBB1425
+	.8byte	.LBE1425
+	.8byte	.LBB1451
+	.8byte	.LBE1451
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1427
+	.8byte	.LBE1427
 	.8byte	.LBB1440
 	.8byte	.LBE1440
 	.8byte	.LBB1442
 	.8byte	.LBE1442
-	.8byte	.LBB1443
-	.8byte	.LBE1443
-	.8byte	.LBB1445
-	.8byte	.LBE1445
-	.8byte	.LBB1447
-	.8byte	.LBE1447
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1435
-	.8byte	.LBE1435
-	.8byte	.LBB1441
-	.8byte	.LBE1441
 	.8byte	.LBB1444
 	.8byte	.LBE1444
 	.8byte	.LBB1446
 	.8byte	.LBE1446
-	.8byte	0
-	.8byte	0
 	.8byte	.LBB1448
 	.8byte	.LBE1448
-	.8byte	.LBB1457
-	.8byte	.LBE1457
-	.8byte	.LBB1458
-	.8byte	.LBE1458
-	.8byte	.LBB1469
-	.8byte	.LBE1469
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1450
-	.8byte	.LBE1450
-	.8byte	.LBB1453
-	.8byte	.LBE1453
+	.8byte	.LBB1434
+	.8byte	.LBE1434
+	.8byte	.LBB1441
+	.8byte	.LBE1441
+	.8byte	.LBB1443
+	.8byte	.LBE1443
+	.8byte	.LBB1445
+	.8byte	.LBE1445
+	.8byte	.LBB1447
+	.8byte	.LBE1447
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1459
-	.8byte	.LBE1459
-	.8byte	.LBB1463
-	.8byte	.LBE1463
-	.8byte	.LBB1464
-	.8byte	.LBE1464
+	.8byte	.LBB1454
+	.8byte	.LBE1454
+	.8byte	.LBB1466
+	.8byte	.LBE1466
+	.8byte	.LBB1468
+	.8byte	.LBE1468
+	.8byte	.LBB1469
+	.8byte	.LBE1469
+	.8byte	.LBB1471
+	.8byte	.LBE1471
+	.8byte	.LBB1473
+	.8byte	.LBE1473
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1634
-	.8byte	.LBE1634
-	.8byte	.LBB1637
-	.8byte	.LBE1637
+	.8byte	.LBB1461
+	.8byte	.LBE1461
+	.8byte	.LBB1467
+	.8byte	.LBE1467
+	.8byte	.LBB1470
+	.8byte	.LBE1470
+	.8byte	.LBB1472
+	.8byte	.LBE1472
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1644
-	.8byte	.LBE1644
-	.8byte	.LBB1718
-	.8byte	.LBE1718
-	.8byte	.LBB1719
-	.8byte	.LBE1719
-	.8byte	.LBB1720
-	.8byte	.LBE1720
+	.8byte	.LBB1474
+	.8byte	.LBE1474
+	.8byte	.LBB1483
+	.8byte	.LBE1483
+	.8byte	.LBB1484
+	.8byte	.LBE1484
+	.8byte	.LBB1495
+	.8byte	.LBE1495
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1646
-	.8byte	.LBE1646
-	.8byte	.LBB1655
-	.8byte	.LBE1655
-	.8byte	.LBB1656
-	.8byte	.LBE1656
-	.8byte	.LBB1657
-	.8byte	.LBE1657
+	.8byte	.LBB1476
+	.8byte	.LBE1476
+	.8byte	.LBB1479
+	.8byte	.LBE1479
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1721
-	.8byte	.LBE1721
-	.8byte	.LBB1736
-	.8byte	.LBE1736
-	.8byte	.LBB1737
-	.8byte	.LBE1737
-	.8byte	.LBB1747
-	.8byte	.LBE1747
-	.8byte	.LBB1799
-	.8byte	.LBE1799
-	.8byte	.LBB1802
-	.8byte	.LBE1802
+	.8byte	.LBB1485
+	.8byte	.LBE1485
+	.8byte	.LBB1489
+	.8byte	.LBE1489
+	.8byte	.LBB1490
+	.8byte	.LBE1490
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1723
-	.8byte	.LBE1723
-	.8byte	.LBB1726
-	.8byte	.LBE1726
+	.8byte	.LBB1660
+	.8byte	.LBE1660
+	.8byte	.LBB1663
+	.8byte	.LBE1663
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1727
-	.8byte	.LBE1727
-	.8byte	.LBB1730
-	.8byte	.LBE1730
+	.8byte	.LBB1670
+	.8byte	.LBE1670
+	.8byte	.LBB1744
+	.8byte	.LBE1744
+	.8byte	.LBB1745
+	.8byte	.LBE1745
+	.8byte	.LBB1746
+	.8byte	.LBE1746
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1738
-	.8byte	.LBE1738
-	.8byte	.LBB1748
-	.8byte	.LBE1748
-	.8byte	.LBB1798
-	.8byte	.LBE1798
-	.8byte	.LBB1803
-	.8byte	.LBE1803
+	.8byte	.LBB1672
+	.8byte	.LBE1672
+	.8byte	.LBB1681
+	.8byte	.LBE1681
+	.8byte	.LBB1682
+	.8byte	.LBE1682
+	.8byte	.LBB1683
+	.8byte	.LBE1683
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1740
-	.8byte	.LBE1740
-	.8byte	.LBB1743
-	.8byte	.LBE1743
+	.8byte	.LBB1747
+	.8byte	.LBE1747
+	.8byte	.LBB1762
+	.8byte	.LBE1762
+	.8byte	.LBB1763
+	.8byte	.LBE1763
+	.8byte	.LBB1773
+	.8byte	.LBE1773
+	.8byte	.LBB1825
+	.8byte	.LBE1825
+	.8byte	.LBB1828
+	.8byte	.LBE1828
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1749
 	.8byte	.LBE1749
-	.8byte	.LBB1800
-	.8byte	.LBE1800
-	.8byte	.LBB1801
-	.8byte	.LBE1801
+	.8byte	.LBB1752
+	.8byte	.LBE1752
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1751
-	.8byte	.LBE1751
-	.8byte	.LBB1757
-	.8byte	.LBE1757
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1760
-	.8byte	.LBE1760
-	.8byte	.LBB1761
-	.8byte	.LBE1761
+	.8byte	.LBB1753
+	.8byte	.LBE1753
+	.8byte	.LBB1756
+	.8byte	.LBE1756
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1768
-	.8byte	.LBE1768
+	.8byte	.LBB1764
+	.8byte	.LBE1764
 	.8byte	.LBB1774
 	.8byte	.LBE1774
-	.8byte	.LBB1775
-	.8byte	.LBE1775
-	.8byte	.LBB1776
-	.8byte	.LBE1776
-	.8byte	.LBB1777
-	.8byte	.LBE1777
+	.8byte	.LBB1824
+	.8byte	.LBE1824
+	.8byte	.LBB1829
+	.8byte	.LBE1829
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1778
-	.8byte	.LBE1778
-	.8byte	.LBB1796
-	.8byte	.LBE1796
-	.8byte	.LBB1797
-	.8byte	.LBE1797
-	.8byte	.LBB1804
-	.8byte	.LBE1804
+	.8byte	.LBB1766
+	.8byte	.LBE1766
+	.8byte	.LBB1769
+	.8byte	.LBE1769
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1811
-	.8byte	.LBE1811
-	.8byte	.LBB1818
-	.8byte	.LBE1818
-	.8byte	.LBB1819
-	.8byte	.LBE1819
+	.8byte	.LBB1775
+	.8byte	.LBE1775
+	.8byte	.LBB1826
+	.8byte	.LBE1826
+	.8byte	.LBB1827
+	.8byte	.LBE1827
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1812
-	.8byte	.LBE1812
-	.8byte	.LBB1817
-	.8byte	.LBE1817
+	.8byte	.LBB1777
+	.8byte	.LBE1777
+	.8byte	.LBB1783
+	.8byte	.LBE1783
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1852
-	.8byte	.LBE1852
-	.8byte	.LBB1859
-	.8byte	.LBE1859
-	.8byte	.LBB1876
-	.8byte	.LBE1876
+	.8byte	.LBB1786
+	.8byte	.LBE1786
+	.8byte	.LBB1787
+	.8byte	.LBE1787
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1854
-	.8byte	.LBE1854
-	.8byte	.LBB1855
-	.8byte	.LBE1855
-	.8byte	.LBB1856
-	.8byte	.LBE1856
+	.8byte	.LBB1794
+	.8byte	.LBE1794
+	.8byte	.LBB1800
+	.8byte	.LBE1800
+	.8byte	.LBB1801
+	.8byte	.LBE1801
+	.8byte	.LBB1802
+	.8byte	.LBE1802
+	.8byte	.LBB1803
+	.8byte	.LBE1803
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1860
-	.8byte	.LBE1860
-	.8byte	.LBB1890
-	.8byte	.LBE1890
+	.8byte	.LBB1804
+	.8byte	.LBE1804
+	.8byte	.LBB1822
+	.8byte	.LBE1822
+	.8byte	.LBB1823
+	.8byte	.LBE1823
+	.8byte	.LBB1830
+	.8byte	.LBE1830
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1865
-	.8byte	.LBE1865
-	.8byte	.LBB1870
-	.8byte	.LBE1870
-	.8byte	.LBB1871
-	.8byte	.LBE1871
-	.8byte	.LBB1891
-	.8byte	.LBE1891
+	.8byte	.LBB1837
+	.8byte	.LBE1837
+	.8byte	.LBB1844
+	.8byte	.LBE1844
+	.8byte	.LBB1845
+	.8byte	.LBE1845
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1872
-	.8byte	.LBE1872
-	.8byte	.LBB1875
-	.8byte	.LBE1875
+	.8byte	.LBB1838
+	.8byte	.LBE1838
+	.8byte	.LBB1843
+	.8byte	.LBE1843
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1882
 	.8byte	.LBE1882
-	.8byte	.LBB1892
-	.8byte	.LBE1892
+	.8byte	.LBB1893
+	.8byte	.LBE1893
+	.8byte	.LBB1894
+	.8byte	.LBE1894
+	.8byte	.LBB1912
+	.8byte	.LBE1912
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1884
 	.8byte	.LBE1884
-	.8byte	.LBB1885
-	.8byte	.LBE1885
+	.8byte	.LBB1887
+	.8byte	.LBE1887
+	.8byte	.LBB1888
+	.8byte	.LBE1888
+	.8byte	.LBB1889
+	.8byte	.LBE1889
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1885
+	.8byte	.LBE1885
 	.8byte	.LBB1886
 	.8byte	.LBE1886
-	.8byte	.LBB1897
-	.8byte	.LBE1897
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1888
-	.8byte	.LBE1888
-	.8byte	.LBB1889
-	.8byte	.LBE1889
+	.8byte	.LBB1895
+	.8byte	.LBE1895
+	.8byte	.LBB1924
+	.8byte	.LBE1924
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1893
-	.8byte	.LBE1893
-	.8byte	.LBB1896
-	.8byte	.LBE1896
+	.8byte	.LBB1900
+	.8byte	.LBE1900
+	.8byte	.LBB1906
+	.8byte	.LBE1906
+	.8byte	.LBB1907
+	.8byte	.LBE1907
+	.8byte	.LBB1925
+	.8byte	.LBE1925
+	.8byte	.LBB1926
+	.8byte	.LBE1926
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1898
-	.8byte	.LBE1898
-	.8byte	.LBB1901
-	.8byte	.LBE1901
+	.8byte	.LBB1908
+	.8byte	.LBE1908
+	.8byte	.LBB1911
+	.8byte	.LBE1911
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1916
+	.8byte	.LBE1916
+	.8byte	.LBB1927
+	.8byte	.LBE1927
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1918
+	.8byte	.LBE1918
+	.8byte	.LBB1919
+	.8byte	.LBE1919
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1920
+	.8byte	.LBE1920
+	.8byte	.LBB1932
+	.8byte	.LBE1932
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1922
+	.8byte	.LBE1922
+	.8byte	.LBB1923
+	.8byte	.LBE1923
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1928
+	.8byte	.LBE1928
+	.8byte	.LBB1931
+	.8byte	.LBE1931
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1933
+	.8byte	.LBE1933
+	.8byte	.LBB1936
+	.8byte	.LBE1936
 	.8byte	0
 	.8byte	0
 	.8byte	.Ltext0
@@ -56499,7 +56752,7 @@ __exitcall_ebc_exit:
 	.string	"dev_kobj"
 .LASF475:
 	.string	"d_release"
-.LASF3201:
+.LASF3202:
 	.string	"get_arch_dma_ops"
 .LASF305:
 	.string	"__ctors_start"
@@ -56533,7 +56786,7 @@ __exitcall_ebc_exit:
 	.string	"si_code"
 .LASF649:
 	.string	"thread_node"
-.LASF3126:
+.LASF3127:
 	.string	"temperature"
 .LASF1316:
 	.string	"map_pages"
@@ -56575,9 +56828,9 @@ __exitcall_ebc_exit:
 	.string	"gpio_desc"
 .LASF976:
 	.string	"list"
-.LASF3218:
+.LASF3219:
 	.string	"_copy_from_user"
-.LASF3244:
+.LASF3245:
 	.string	"get_order"
 .LASF959:
 	.string	"si_errno"
@@ -56637,7 +56890,7 @@ __exitcall_ebc_exit:
 	.string	"n_node"
 .LASF1638:
 	.string	"qsize_t"
-.LASF3241:
+.LASF3242:
 	.string	"devm_kzalloc"
 .LASF380:
 	.string	"sequence"
@@ -56653,7 +56906,7 @@ __exitcall_ebc_exit:
 	.string	"s_state"
 .LASF1080:
 	.string	"run_list"
-.LASF3155:
+.LASF3156:
 	.string	"clac_full_data_align8"
 .LASF2567:
 	.string	"SCHED_SOFTIRQ"
@@ -56691,7 +56944,7 @@ __exitcall_ebc_exit:
 	.string	"contig_page_data"
 .LASF2308:
 	.string	"autosuspend_delay"
-.LASF3109:
+.LASF3110:
 	.string	"buffer_in"
 .LASF3:
 	.string	"unsigned int"
@@ -56729,7 +56982,7 @@ __exitcall_ebc_exit:
 	.string	"size_t"
 .LASF209:
 	.string	"compat_elf_hwcap"
-.LASF3319:
+.LASF3320:
 	.string	"prepare_to_wait_event"
 .LASF1124:
 	.string	"cap_permitted"
@@ -56771,7 +57024,7 @@ __exitcall_ebc_exit:
 	.string	"__reserved"
 .LASF954:
 	.string	"_sigfault"
-.LASF3169:
+.LASF3170:
 	.string	"image_bg"
 .LASF2872:
 	.string	"ebc_buf_status"
@@ -56861,9 +57114,9 @@ __exitcall_ebc_exit:
 	.string	"irqchip_fwnode_ops"
 .LASF1628:
 	.string	"dq_id"
-.LASF3160:
+.LASF3161:
 	.string	"frame_count_tmp"
-.LASF3168:
+.LASF3169:
 	.string	"image_fb"
 .LASF1803:
 	.string	"write_end"
@@ -56871,7 +57124,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ION_HEAP_POOL"
 .LASF1438:
 	.string	"sysctl_protected_hardlinks"
-.LASF3323:
+.LASF3324:
 	.string	"__arch_copy_from_user"
 .LASF1191:
 	.string	"scan_objects"
@@ -56879,7 +57132,7 @@ __exitcall_ebc_exit:
 	.string	"pageset"
 .LASF1252:
 	.string	"wb_err"
-.LASF3215:
+.LASF3216:
 	.string	"copy_to_user"
 .LASF735:
 	.string	"trace_recursion"
@@ -56959,7 +57212,7 @@ __exitcall_ebc_exit:
 	.string	"poll"
 .LASF2458:
 	.string	"graph_get_next_endpoint"
-.LASF3152:
+.LASF3153:
 	.string	"clac_full_data_32_to_16"
 .LASF1424:
 	.string	"io_cq"
@@ -56993,7 +57246,7 @@ __exitcall_ebc_exit:
 	.string	"pcpu_chosen_fc"
 .LASF391:
 	.string	"dentry_stat_t"
-.LASF3268:
+.LASF3269:
 	.string	"atomic_add"
 .LASF1657:
 	.string	"dqi_bgrace"
@@ -57011,7 +57264,7 @@ __exitcall_ebc_exit:
 	.string	"ctl_table"
 .LASF44:
 	.string	"uid_t"
-.LASF3298:
+.LASF3299:
 	.string	"strstr"
 .LASF2862:
 	.string	"WF_TYPE_A2"
@@ -57035,7 +57288,7 @@ __exitcall_ebc_exit:
 	.string	"panel_buffer"
 .LASF317:
 	.string	"__exception_text_end"
-.LASF3145:
+.LASF3146:
 	.string	"clac_part_data_16_to_32"
 .LASF2748:
 	.string	"sh_addr"
@@ -57075,7 +57328,7 @@ __exitcall_ebc_exit:
 	.string	"pteval_t"
 .LASF430:
 	.string	"i_ino"
-.LASF3343:
+.LASF3345:
 	.string	"might_fault"
 .LASF1576:
 	.string	"compact_cached_free_pfn"
@@ -57165,7 +57418,7 @@ __exitcall_ebc_exit:
 	.string	"seq_operations"
 .LASF638:
 	.string	"stack_canary"
-.LASF3123:
+.LASF3124:
 	.string	"no_black_count"
 .LASF1175:
 	.string	"blksize"
@@ -57195,7 +57448,7 @@ __exitcall_ebc_exit:
 	.string	"pidfd_fops"
 .LASF1931:
 	.string	"lm_put_owner"
-.LASF3300:
+.LASF3301:
 	.string	"ebc_pmic_verity_vcom"
 .LASF2538:
 	.string	"set_sda"
@@ -57219,7 +57472,7 @@ __exitcall_ebc_exit:
 	.string	"dquot"
 .LASF1087:
 	.string	"dl_runtime"
-.LASF3127:
+.LASF3128:
 	.string	"lut_type"
 .LASF85:
 	.string	"initcall_debug"
@@ -57305,7 +57558,7 @@ __exitcall_ebc_exit:
 	.string	"sysfs_dev_block_kobj"
 .LASF555:
 	.string	"upid"
-.LASF3331:
+.LASF3333:
 	.string	"down_write"
 .LASF1113:
 	.string	"completion"
@@ -57359,7 +57612,7 @@ __exitcall_ebc_exit:
 	.string	"taint_flag"
 .LASF1993:
 	.string	"get_dquots"
-.LASF3309:
+.LASF3310:
 	.string	"of_find_node_by_phandle"
 .LASF2417:
 	.string	"unmap_page"
@@ -57377,15 +57630,13 @@ __exitcall_ebc_exit:
 	.string	"nr_leaves_on_tree"
 .LASF1726:
 	.string	"quota_on"
-.LASF3044:
-	.string	"__addressable_ebc_init3180"
 .LASF2473:
 	.string	"of_root"
 .LASF1310:
 	.string	"vm_operations_struct"
 .LASF2405:
 	.string	"hwirq_max"
-.LASF3266:
+.LASF3267:
 	.string	"__fswab32"
 .LASF2213:
 	.string	"runtime_idle"
@@ -57397,6 +57648,8 @@ __exitcall_ebc_exit:
 	.string	"i_state"
 .LASF594:
 	.string	"sched_class"
+.LASF3044:
+	.string	"__addressable_ebc_init3190"
 .LASF1985:
 	.string	"umount_end"
 .LASF692:
@@ -57415,13 +57668,13 @@ __exitcall_ebc_exit:
 	.string	"RPM_SUSPENDED"
 .LASF698:
 	.string	"reclaim_state"
-.LASF3341:
+.LASF3343:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF138:
 	.string	"vendor_panic_cb"
 .LASF3098:
 	.string	"ebc_vdd_power_timeout"
-.LASF3187:
+.LASF3188:
 	.string	"ebc_get_4pix_wf"
 .LASF2813:
 	.string	"num_symtab"
@@ -57451,13 +57704,13 @@ __exitcall_ebc_exit:
 	.string	"module_alloc_base"
 .LASF1766:
 	.string	"core_kallsyms"
-.LASF3303:
+.LASF3304:
 	.string	"memcpy"
 .LASF2910:
 	.string	"EPD_FORCE_FULL"
 .LASF2415:
 	.string	"get_sgtable"
-.LASF3164:
+.LASF3165:
 	.string	"xor_val"
 .LASF2170:
 	.string	"envp_idx"
@@ -57469,11 +57722,11 @@ __exitcall_ebc_exit:
 	.string	"OOM_KILL"
 .LASF445:
 	.string	"i_hash"
-.LASF3141:
+.LASF3142:
 	.string	"gray_old"
 .LASF68:
 	.string	"hlist_node"
-.LASF3312:
+.LASF3313:
 	.string	"sprintf"
 .LASF1923:
 	.string	"fl_ops"
@@ -57485,7 +57738,7 @@ __exitcall_ebc_exit:
 	.string	"WQ_MEM_RECLAIM"
 .LASF2688:
 	.string	"COMPACTISOLATED"
-.LASF3279:
+.LASF3280:
 	.string	"of_property_read_variable_u32_array"
 .LASF328:
 	.string	"__inittext_begin"
@@ -57521,7 +57774,7 @@ __exitcall_ebc_exit:
 	.string	"DOMAIN_BUS_WAKEUP"
 .LASF1237:
 	.string	"arm64_el2_vector_last_slot"
-.LASF3335:
+.LASF3337:
 	.string	"queue_work_on"
 .LASF2350:
 	.string	"online"
@@ -57529,7 +57782,7 @@ __exitcall_ebc_exit:
 	.string	"runtime_resume"
 .LASF1222:
 	.string	"dup_xol_work"
-.LASF3208:
+.LASF3209:
 	.string	"ebc_pmic_read_temp"
 .LASF2891:
 	.string	"EPD_FULL_GC16"
@@ -57643,7 +57896,7 @@ __exitcall_ebc_exit:
 	.string	"driver"
 .LASF1559:
 	.string	"ZONE_NORMAL"
-.LASF3170:
+.LASF3171:
 	.string	"image_new_data"
 .LASF426:
 	.string	"i_op"
@@ -57697,7 +57950,7 @@ __exitcall_ebc_exit:
 	.string	"huge_fault"
 .LASF2023:
 	.string	"kstatfs"
-.LASF3211:
+.LASF3212:
 	.string	"ebc_pmic_power_off"
 .LASF2649:
 	.string	"PGPGOUTCLEAN"
@@ -57725,7 +57978,7 @@ __exitcall_ebc_exit:
 	.string	"fsnotify_mark_connector"
 .LASF956:
 	.string	"_sigsys"
-.LASF3125:
+.LASF3126:
 	.string	"ebc_lut_update"
 .LASF1936:
 	.string	"lm_setup"
@@ -57769,7 +58022,7 @@ __exitcall_ebc_exit:
 	.string	"get_next_id"
 .LASF238:
 	.string	"rwlock_t"
-.LASF3340:
+.LASF3342:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
 .LASF855:
 	.string	"pgprot"
@@ -57797,7 +58050,7 @@ __exitcall_ebc_exit:
 	.string	"__icache_flags"
 .LASF148:
 	.string	"crash_kexec_post_notifiers"
-.LASF3196:
+.LASF3197:
 	.string	"eink_mode"
 .LASF1712:
 	.string	"rt_spc_warnlimit"
@@ -57819,7 +58072,7 @@ __exitcall_ebc_exit:
 	.string	"_pid"
 .LASF1171:
 	.string	"init_stack"
-.LASF3176:
+.LASF3177:
 	.string	"dmask"
 .LASF1240:
 	.string	"address_space"
@@ -57827,7 +58080,7 @@ __exitcall_ebc_exit:
 	.string	"mm_context_t"
 .LASF1326:
 	.string	"startup"
-.LASF3146:
+.LASF3147:
 	.string	"clac_part_data_32"
 .LASF835:
 	.string	"__WQ_ORDERED_EXPLICIT"
@@ -57841,7 +58094,7 @@ __exitcall_ebc_exit:
 	.string	"i_wb"
 .LASF2101:
 	.string	"idr_next"
-.LASF3161:
+.LASF3162:
 	.string	"frame_count_data"
 .LASF2973:
 	.string	"frame_start"
@@ -57891,7 +58144,7 @@ __exitcall_ebc_exit:
 	.string	"normal_prio"
 .LASF1303:
 	.string	"f_ep_links"
-.LASF3174:
+.LASF3175:
 	.string	"image_fb_tmp"
 .LASF2309:
 	.string	"last_busy"
@@ -57903,7 +58156,7 @@ __exitcall_ebc_exit:
 	.string	"host"
 .LASF185:
 	.string	"uaddr"
-.LASF3330:
+.LASF3332:
 	.string	"ebc_remove_from_dsp_buf_list"
 .LASF662:
 	.string	"real_start_time"
@@ -57939,11 +58192,11 @@ __exitcall_ebc_exit:
 	.string	"devres_head"
 .LASF428:
 	.string	"i_mapping"
-.LASF3304:
+.LASF3305:
 	.string	"misc_register"
 .LASF723:
 	.string	"rseq_sig"
-.LASF3230:
+.LASF3231:
 	.string	"platform_set_drvdata"
 .LASF343:
 	.string	"cpu_context"
@@ -57951,7 +58204,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pm_domain"
 .LASF1528:
 	.string	"nr_zones"
-.LASF3252:
+.LASF3253:
 	.string	"is_source"
 .LASF1390:
 	.string	"migrate_mode"
@@ -57973,11 +58226,11 @@ __exitcall_ebc_exit:
 	.string	"d_hash"
 .LASF1090:
 	.string	"dl_bw"
-.LASF3223:
+.LASF3224:
 	.string	"limit"
 .LASF2160:
 	.string	"kobj"
-.LASF3313:
+.LASF3314:
 	.string	"kstrtouint"
 .LASF114:
 	.string	"fsync"
@@ -57987,9 +58240,9 @@ __exitcall_ebc_exit:
 	.string	"i_flags"
 .LASF2908:
 	.string	"EPD_RESUME"
-.LASF3299:
+.LASF3300:
 	.string	"sscanf"
-.LASF3295:
+.LASF3296:
 	.string	"ebc_empty_buf_get"
 .LASF1489:
 	.string	"NR_ISOLATED_ANON"
@@ -58003,7 +58256,7 @@ __exitcall_ebc_exit:
 	.string	"rb_node"
 .LASF614:
 	.string	"pushable_tasks"
-.LASF3175:
+.LASF3176:
 	.string	"image_bg_tmp"
 .LASF2217:
 	.string	"platform_data"
@@ -58033,7 +58286,7 @@ __exitcall_ebc_exit:
 	.string	"last_update_time"
 .LASF1152:
 	.string	"robust_list_head"
-.LASF3293:
+.LASF3294:
 	.string	"init_timer_key"
 .LASF1495:
 	.string	"NR_ANON_MAPPED"
@@ -58049,7 +58302,7 @@ __exitcall_ebc_exit:
 	.string	"srcversion"
 .LASF873:
 	.string	"pcpu_unit_offsets"
-.LASF3199:
+.LASF3200:
 	.string	"dma_sync_single_for_device"
 .LASF2974:
 	.string	"dsp_end_callback"
@@ -58115,7 +58368,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_INACTIVE_ANON"
 .LASF729:
 	.string	"nr_dirtied"
-.LASF3240:
+.LASF3241:
 	.string	"dev_get_drvdata"
 .LASF2410:
 	.string	"linear_revmap"
@@ -58159,11 +58412,11 @@ __exitcall_ebc_exit:
 	.string	"sysctl_memory_failure_early_kill"
 .LASF2775:
 	.string	"param_ops_bool_enable_only"
-.LASF3182:
+.LASF3183:
 	.string	"power_status"
 .LASF307:
 	.string	"__start_opd"
-.LASF3308:
+.LASF3309:
 	.string	"of_find_i2c_device_by_node"
 .LASF154:
 	.string	"SYSTEM_RUNNING"
@@ -58203,7 +58456,7 @@ __exitcall_ebc_exit:
 	.string	"panel"
 .LASF2447:
 	.string	"irq_data"
-.LASF3116:
+.LASF3117:
 	.string	"old_buffer_temp"
 .LASF2720:
 	.string	"sysctl_memory_failure_recovery"
@@ -58237,7 +58490,7 @@ __exitcall_ebc_exit:
 	.string	"taint_flags"
 .LASF1362:
 	.string	"membarrier_state"
-.LASF3190:
+.LASF3191:
 	.string	"pre_image_addr"
 .LASF2193:
 	.string	"suspend"
@@ -58305,7 +58558,7 @@ __exitcall_ebc_exit:
 	.string	"exit_code"
 .LASF1071:
 	.string	"exec_start"
-.LASF3337:
+.LASF3339:
 	.string	"printk"
 .LASF2396:
 	.string	"consumers"
@@ -58369,7 +58622,7 @@ __exitcall_ebc_exit:
 	.string	"timer"
 .LASF2477:
 	.string	"devtree_lock"
-.LASF3178:
+.LASF3179:
 	.string	"refresh_new_image_auto"
 .LASF3092:
 	.string	"__ret"
@@ -58397,11 +58650,11 @@ __exitcall_ebc_exit:
 	.string	"optimistic_spin_queue"
 .LASF2979:
 	.string	"ebc_buffer_size"
-.LASF3314:
+.LASF3315:
 	.string	"ebc_pmic_set_vcom"
 .LASF2656:
 	.string	"ALLOCSTALL_NORMAL"
-.LASF3143:
+.LASF3144:
 	.string	"data_buf_tmp"
 .LASF326:
 	.string	"__initdata_begin"
@@ -58557,6 +58810,8 @@ __exitcall_ebc_exit:
 	.string	"mmap_base"
 .LASF700:
 	.string	"io_context"
+.LASF3106:
+	.string	"__cond"
 .LASF210:
 	.string	"compat_elf_hwcap2"
 .LASF2524:
@@ -58569,13 +58824,13 @@ __exitcall_ebc_exit:
 	.string	"seq_show"
 .LASF767:
 	.string	"ate_match_dt"
-.LASF3238:
+.LASF3239:
 	.string	"of_node_put"
 .LASF1375:
 	.string	"cow_page"
 .LASF1607:
 	.string	"core_id"
-.LASF3186:
+.LASF3187:
 	.string	"ebc_get_2pix_wf_32"
 .LASF2504:
 	.string	"block"
@@ -58593,11 +58848,11 @@ __exitcall_ebc_exit:
 	.string	"param_ops_ushort"
 .LASF526:
 	.string	"s_shrink"
-.LASF3159:
+.LASF3160:
 	.string	"gray_new_temp"
 .LASF1540:
 	.string	"kcompactd_classzone_idx"
-.LASF3228:
+.LASF3229:
 	.string	"kmalloc_index"
 .LASF884:
 	.string	"hrtimer_restart"
@@ -58707,7 +58962,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_DELAYED_BIT"
 .LASF1053:
 	.string	"nr_failed_migrations_affine"
-.LASF3243:
+.LASF3244:
 	.string	"IS_ERR"
 .LASF876:
 	.string	"PCPU_FC_EMBED"
@@ -58721,7 +58976,7 @@ __exitcall_ebc_exit:
 	.string	"pi_top_task"
 .LASF806:
 	.string	"WORK_NR_COLORS"
-.LASF3180:
+.LASF3181:
 	.string	"refresh_new_image2"
 .LASF528:
 	.string	"s_fsnotify_inode_refs"
@@ -58733,7 +58988,7 @@ __exitcall_ebc_exit:
 	.string	"uprobe"
 .LASF529:
 	.string	"s_readonly_remount"
-.LASF3271:
+.LASF3272:
 	.string	"kasan_check_write"
 .LASF378:
 	.string	"hlist_bl_node"
@@ -58759,7 +59014,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_FLAG_MASK"
 .LASF1286:
 	.string	"units"
-.LASF3286:
+.LASF3287:
 	.string	"epd_lut_from_mem_init"
 .LASF312:
 	.string	"__nosave_begin"
@@ -58779,7 +59034,7 @@ __exitcall_ebc_exit:
 	.string	"user_namespace"
 .LASF2771:
 	.string	"param_ops_ulong"
-.LASF3259:
+.LASF3260:
 	.string	"get_current"
 .LASF232:
 	.string	"raw_spinlock"
@@ -58803,9 +59058,9 @@ __exitcall_ebc_exit:
 	.string	"fault_address"
 .LASF1621:
 	.string	"dq_inuse"
-.LASF3108:
+.LASF3109:
 	.string	"out_buffer"
-.LASF3134:
+.LASF3135:
 	.string	"direct_mode_data_change_part"
 .LASF1656:
 	.string	"dqi_flags"
@@ -58813,9 +59068,9 @@ __exitcall_ebc_exit:
 	.string	"PGREFILL"
 .LASF2777:
 	.string	"param_ops_bint"
-.LASF3296:
+.LASF3297:
 	.string	"ebc_add_to_dsp_buf_list"
-.LASF3301:
+.LASF3302:
 	.string	"kfree"
 .LASF1817:
 	.string	"swap_deactivate"
@@ -58885,7 +59140,7 @@ __exitcall_ebc_exit:
 	.string	"boost_expires"
 .LASF2929:
 	.string	"DMA_BIDIRECTIONAL"
-.LASF3322:
+.LASF3323:
 	.string	"__arch_copy_to_user"
 .LASF236:
 	.string	"spinlock"
@@ -58903,11 +59158,11 @@ __exitcall_ebc_exit:
 	.string	"d_compare"
 .LASF986:
 	.string	"vm_mm"
-.LASF3117:
+.LASF3118:
 	.string	"need_refresh"
 .LASF2835:
 	.string	"platform_bus_type"
-.LASF3135:
+.LASF3136:
 	.string	"data_buf"
 .LASF3064:
 	.string	"ulogo_buf"
@@ -58927,7 +59182,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_OFFQ_POOL_BITS"
 .LASF1920:
 	.string	"fl_fasync"
-.LASF3193:
+.LASF3194:
 	.string	"update_mode"
 .LASF2956:
 	.string	"direct_mode"
@@ -59001,13 +59256,13 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_HIGH_WMARK_HIT_QUICKLY"
 .LASF3074:
 	.string	"ebc_state_read"
-.LASF3310:
+.LASF3311:
 	.string	"__stack_chk_fail"
 .LASF2927:
 	.string	"pmic_set_vcom"
 .LASF2714:
 	.string	"stack_guard_gap"
-.LASF3251:
+.LASF3252:
 	.string	"bytes"
 .LASF1753:
 	.string	"gpl_future_crcs"
@@ -59111,7 +59366,7 @@ __exitcall_ebc_exit:
 	.string	"i_mtime"
 .LASF2619:
 	.string	"dev_page_fault_t"
-.LASF3129:
+.LASF3130:
 	.string	"ebc_auto_tast_function"
 .LASF24:
 	.string	"__kernel_gid32_t"
@@ -59123,7 +59378,7 @@ __exitcall_ebc_exit:
 	.string	"MODULE_STATE_COMING"
 .LASF2246:
 	.string	"offline_disabled"
-.LASF3236:
+.LASF3237:
 	.string	"of_property_read_u32_array"
 .LASF2491:
 	.string	"select"
@@ -59169,7 +59424,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pagemap"
 .LASF2663:
 	.string	"PGDEACTIVATE"
-.LASF3140:
+.LASF3141:
 	.string	"buffer_old_tmp"
 .LASF1799:
 	.string	"writepages"
@@ -59191,7 +59446,7 @@ __exitcall_ebc_exit:
 	.string	"writeback_control"
 .LASF1919:
 	.string	"fl_end"
-.LASF3325:
+.LASF3326:
 	.string	"ebc_find_buf_by_phy_addr"
 .LASF1966:
 	.string	"super_operations"
@@ -59231,13 +59486,13 @@ __exitcall_ebc_exit:
 	.string	"core"
 .LASF1830:
 	.string	"bd_holders"
-.LASF3132:
+.LASF3133:
 	.string	"reset_and_flip"
 .LASF2967:
 	.string	"enable"
 .LASF970:
 	.string	"pipe_bufs"
-.LASF3256:
+.LASF3257:
 	.string	"to_user"
 .LASF2139:
 	.string	"KOBJ_NS_TYPE_NET"
@@ -59257,7 +59512,7 @@ __exitcall_ebc_exit:
 	.string	"__rb_parent_color"
 .LASF2239:
 	.string	"devres_lock"
-.LASF3177:
+.LASF3178:
 	.string	"new_buffer_refresh"
 .LASF366:
 	.string	"bits"
@@ -59273,9 +59528,9 @@ __exitcall_ebc_exit:
 	.string	"lookup"
 .LASF1605:
 	.string	"cpu_topology"
-.LASF3260:
+.LASF3261:
 	.string	"sp_el0"
-.LASF3329:
+.LASF3331:
 	.string	"ebc_dsp_buf_get"
 .LASF2916:
 	.string	"panel_color"
@@ -59305,7 +59560,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_AUTO"
 .LASF1242:
 	.string	"i_pages"
-.LASF3220:
+.LASF3221:
 	.string	"safe_ptr"
 .LASF377:
 	.string	"hlist_bl_head"
@@ -59337,7 +59592,7 @@ __exitcall_ebc_exit:
 	.string	"holders_dir"
 .LASF3093:
 	.string	"__wq_entry"
-.LASF3112:
+.LASF3113:
 	.string	"new_buffer"
 .LASF464:
 	.string	"i_fsnotify_mask"
@@ -59345,7 +59600,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_LOW_WMARK_HIT_QUICKLY"
 .LASF1009:
 	.string	"syscfs"
-.LASF3213:
+.LASF3214:
 	.string	"wake_unlock"
 .LASF2460:
 	.string	"graph_get_port_parent"
@@ -59355,7 +59610,7 @@ __exitcall_ebc_exit:
 	.string	"UNEVICTABLE_PGRESCUED"
 .LASF2224:
 	.string	"msi_list"
-.LASF3262:
+.LASF3263:
 	.string	"__ilog2_u64"
 .LASF548:
 	.string	"compat_time_t"
@@ -59379,7 +59634,7 @@ __exitcall_ebc_exit:
 	.string	"cap_effective"
 .LASF1761:
 	.string	"taints"
-.LASF3281:
+.LASF3282:
 	.string	"of_address_to_resource"
 .LASF1027:
 	.string	"enqueued"
@@ -59407,7 +59662,7 @@ __exitcall_ebc_exit:
 	.string	"bd_private"
 .LASF1918:
 	.string	"fl_start"
-.LASF3235:
+.LASF3236:
 	.string	"out_value"
 .LASF1976:
 	.string	"freeze_fs"
@@ -59415,7 +59670,7 @@ __exitcall_ebc_exit:
 	.string	"sigset_t"
 .LASF1932:
 	.string	"lm_notify"
-.LASF3192:
+.LASF3193:
 	.string	"ebc_tcon_dsp_mode_set"
 .LASF895:
 	.string	"running"
@@ -59441,7 +59696,7 @@ __exitcall_ebc_exit:
 	.string	"d_automount"
 .LASF1280:
 	.string	"page_free"
-.LASF3130:
+.LASF3131:
 	.string	"__val"
 .LASF1496:
 	.string	"NR_FILE_MAPPED"
@@ -59453,13 +59708,13 @@ __exitcall_ebc_exit:
 	.string	"copy_file_range"
 .LASF2700:
 	.string	"UNEVICTABLE_PGCLEARED"
-.LASF3315:
+.LASF3316:
 	.string	"epd_lut_get_wf_version"
 .LASF2062:
 	.string	"key_type"
 .LASF798:
 	.string	"WORK_STRUCT_LINKED_BIT"
-.LASF3253:
+.LASF3254:
 	.string	"copy_overflow"
 .LASF2456:
 	.string	"get_named_child_node"
@@ -59475,7 +59730,7 @@ __exitcall_ebc_exit:
 	.string	"module_kobject"
 .LASF3069:
 	.string	"memory"
-.LASF3227:
+.LASF3228:
 	.string	"order"
 .LASF740:
 	.string	"active_memcg"
@@ -59511,7 +59766,7 @@ __exitcall_ebc_exit:
 	.string	"EPD_A2"
 .LASF2117:
 	.string	"kernfs_elem_attr"
-.LASF3115:
+.LASF3116:
 	.string	"new_buffer_temp"
 .LASF2314:
 	.string	"set_latency_tolerance"
@@ -59525,7 +59780,7 @@ __exitcall_ebc_exit:
 	.string	"arm64_ftr_reg_ctrel0"
 .LASF1259:
 	.string	"counters"
-.LASF3272:
+.LASF3273:
 	.string	"kasan_check_read"
 .LASF2074:
 	.string	"name_link"
@@ -59581,7 +59836,7 @@ __exitcall_ebc_exit:
 	.string	"WQ_CPU_INTENSIVE"
 .LASF3054:
 	.string	"ebc_tcon_node"
-.LASF3106:
+.LASF3107:
 	.string	"change_8bit_to_4bit"
 .LASF2832:
 	.string	"id_entry"
@@ -59589,9 +59844,11 @@ __exitcall_ebc_exit:
 	.string	"putback_page"
 .LASF2551:
 	.string	"nr_irqs"
+.LASF3330:
+	.string	"schedule_timeout"
 .LASF909:
 	.string	"max_hang_time"
-.LASF3216:
+.LASF3217:
 	.string	"copy_from_user"
 .LASF2482:
 	.string	"DOMAIN_BUS_ANY"
@@ -59605,7 +59862,7 @@ __exitcall_ebc_exit:
 	.string	"mmap_miss"
 .LASF1669:
 	.string	"quota_format_ops"
-.LASF3327:
+.LASF3328:
 	.string	"ebc_osd_buf_get"
 .LASF3088:
 	.string	"argp"
@@ -59645,13 +59902,13 @@ __exitcall_ebc_exit:
 	.string	"thread_keyring"
 .LASF2760:
 	.string	"kparam_array"
-.LASF3274:
+.LASF3275:
 	.string	"platform_driver_unregister"
 .LASF653:
 	.string	"utime"
-.LASF3147:
-	.string	"pix0"
 .LASF3148:
+	.string	"pix0"
+.LASF3149:
 	.string	"pix1"
 .LASF1349:
 	.string	"start_code"
@@ -59659,7 +59916,7 @@ __exitcall_ebc_exit:
 	.string	"ebc_driver"
 .LASF2620:
 	.string	"dev_page_free_t"
-.LASF3233:
+.LASF3234:
 	.string	"of_property_read_u32"
 .LASF1413:
 	.string	"guid_t"
@@ -59667,7 +59924,7 @@ __exitcall_ebc_exit:
 	.string	"sysctl_panic_on_stackoverflow"
 .LASF1909:
 	.string	"fl_link"
-.LASF3122:
+.LASF3123:
 	.string	"check_black_percent"
 .LASF2264:
 	.string	"clock_list"
@@ -59681,7 +59938,7 @@ __exitcall_ebc_exit:
 	.string	"tz_minuteswest"
 .LASF2474:
 	.string	"of_chosen"
-.LASF3131:
+.LASF3132:
 	.string	"ebc_frame_start"
 .LASF349:
 	.string	"sve_state"
@@ -59691,7 +59948,7 @@ __exitcall_ebc_exit:
 	.string	"cpumask_t"
 .LASF134:
 	.string	"kmsg_fops"
-.LASF3324:
+.LASF3325:
 	.string	"ebc_buf_release"
 .LASF820:
 	.string	"WORK_STRUCT_NO_POOL"
@@ -59713,7 +59970,7 @@ __exitcall_ebc_exit:
 	.string	"sched_rt_entity"
 .LASF117:
 	.string	"sendpage"
-.LASF3184:
+.LASF3185:
 	.string	"ret_val"
 .LASF881:
 	.string	"timerqueue_node"
@@ -59723,7 +59980,7 @@ __exitcall_ebc_exit:
 	.string	"mem_dqblk"
 .LASF2787:
 	.string	"plt_entry"
-.LASF3194:
+.LASF3195:
 	.string	"display_mode"
 .LASF1995:
 	.string	"nr_cached_objects"
@@ -59755,11 +60012,11 @@ __exitcall_ebc_exit:
 	.string	"fops"
 .LASF1288:
 	.string	"f_path"
-.LASF3288:
+.LASF3289:
 	.string	"kthread_create_on_node"
 .LASF712:
 	.string	"cgroups"
-.LASF3219:
+.LASF3220:
 	.string	"__uaccess_mask_ptr"
 .LASF2359:
 	.string	"probe_type"
@@ -59779,9 +60036,9 @@ __exitcall_ebc_exit:
 	.string	"userspace_clients"
 .LASF2158:
 	.string	"uevent_seqnum"
-.LASF3284:
+.LASF3285:
 	.string	"memset"
-.LASF3191:
+.LASF3192:
 	.string	"cur_image_addr"
 .LASF2159:
 	.string	"list_lock"
@@ -59829,7 +60086,7 @@ __exitcall_ebc_exit:
 	.string	"qf_fmt_id"
 .LASF1065:
 	.string	"nr_wakeups_idle"
-.LASF3333:
+.LASF3335:
 	.string	"up_write"
 .LASF1473:
 	.string	"NR_MLOCK"
@@ -59865,7 +60122,7 @@ __exitcall_ebc_exit:
 	.string	"console_printk"
 .LASF703:
 	.string	"ioac"
-.LASF3246:
+.LASF3247:
 	.string	"__init_work"
 .LASF1186:
 	.string	"nr_to_scan"
@@ -59877,7 +60134,7 @@ __exitcall_ebc_exit:
 	.string	"exec_max"
 .LASF1418:
 	.string	"uuid_index"
-.LASF3247:
+.LASF3248:
 	.string	"onstack"
 .LASF190:
 	.string	"compat_rmtp"
@@ -59889,7 +60146,7 @@ __exitcall_ebc_exit:
 	.string	"nfs_fl"
 .LASF403:
 	.string	"dentry"
-.LASF3264:
+.LASF3265:
 	.string	"__be32_to_cpup"
 .LASF2181:
 	.string	"klist_node"
@@ -59973,7 +60230,7 @@ __exitcall_ebc_exit:
 	.string	"d_rt_space"
 .LASF265:
 	.string	"name"
-.LASF3294:
+.LASF3295:
 	.string	"mod_timer"
 .LASF151:
 	.string	"early_boot_irqs_disabled"
@@ -59999,7 +60256,7 @@ __exitcall_ebc_exit:
 	.string	"i_gid"
 .LASF1634:
 	.string	"quota_type"
-.LASF3137:
+.LASF3138:
 	.string	"buffer_old"
 .LASF1551:
 	.string	"high"
@@ -60045,7 +60302,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_WRITE_PENDING"
 .LASF1311:
 	.string	"close"
-.LASF3171:
+.LASF3172:
 	.string	"image_fb_data"
 .LASF3065:
 	.string	"klogo_buf"
@@ -60057,13 +60314,13 @@ __exitcall_ebc_exit:
 	.string	"ebc_wq"
 .LASF737:
 	.string	"memcg_oom_gfp_mask"
-.LASF3249:
+.LASF3250:
 	.string	"_msecs_to_jiffies"
 .LASF1698:
 	.string	"d_spc_timer"
 .LASF1774:
 	.string	"jump_entries"
-.LASF3257:
+.LASF3258:
 	.string	"test_ti_thread_flag"
 .LASF2270:
 	.string	"async_suspend"
@@ -60073,7 +60330,7 @@ __exitcall_ebc_exit:
 	.string	"read_pos"
 .LASF482:
 	.string	"super_block"
-.LASF3221:
+.LASF3222:
 	.string	"__addr"
 .LASF2337:
 	.string	"dma_coherent"
@@ -60119,11 +60376,11 @@ __exitcall_ebc_exit:
 	.string	"devkmsg_log_str"
 .LASF255:
 	.string	"FTR_HIGHER_SAFE"
-.LASF3232:
+.LASF3233:
 	.string	"i2c_get_clientdata"
-.LASF3217:
+.LASF3218:
 	.string	"_copy_to_user"
-.LASF3267:
+.LASF3268:
 	.string	"test_bit"
 .LASF249:
 	.string	"__start___jump_table"
@@ -60139,7 +60396,7 @@ __exitcall_ebc_exit:
 	.string	"mems_allowed_seq"
 .LASF1785:
 	.string	"refcnt"
-.LASF3119:
+.LASF3120:
 	.string	"pbuf_new"
 .LASF2196:
 	.string	"thaw"
@@ -60155,9 +60412,9 @@ __exitcall_ebc_exit:
 	.string	"futex"
 .LASF1040:
 	.string	"wait_max"
-.LASF3292:
+.LASF3293:
 	.string	"wakeup_source_add"
-.LASF3210:
+.LASF3211:
 	.string	"ebc_pmic_suspend"
 .LASF1173:
 	.string	"result_mask"
@@ -60169,15 +60426,15 @@ __exitcall_ebc_exit:
 	.string	"dquot_operations"
 .LASF1239:
 	.string	"mapping"
-.LASF3242:
+.LASF3243:
 	.string	"resource_size"
-.LASF3289:
+.LASF3290:
 	.string	"wake_up_process"
 .LASF1369:
 	.string	"kioctx_table"
 .LASF867:
 	.string	"rb_right"
-.LASF3139:
+.LASF3140:
 	.string	"buffer_new_tmp"
 .LASF993:
 	.string	"vm_file"
@@ -60203,13 +60460,13 @@ __exitcall_ebc_exit:
 	.string	"__initdata_end"
 .LASF2516:
 	.string	"bus_lock"
-.LASF3229:
+.LASF3230:
 	.string	"kmalloc_type"
 .LASF388:
 	.string	"qstr"
-.LASF3142:
+.LASF3143:
 	.string	"gray_new"
-.LASF3107:
+.LASF3108:
 	.string	"in_buffer"
 .LASF1107:
 	.string	"futex_state"
@@ -60217,7 +60474,7 @@ __exitcall_ebc_exit:
 	.string	"WORKINGSET_RESTORE"
 .LASF629:
 	.string	"sched_psi_wake_requeue"
-.LASF3250:
+.LASF3251:
 	.string	"check_copy_size"
 .LASF738:
 	.string	"memcg_oom_order"
@@ -60273,7 +60530,7 @@ __exitcall_ebc_exit:
 	.string	"core_state"
 .LASF883:
 	.string	"timerqueue_head"
-.LASF3291:
+.LASF3292:
 	.string	"sched_setscheduler_nocheck"
 .LASF1306:
 	.string	"f_wb_err"
@@ -60281,7 +60538,7 @@ __exitcall_ebc_exit:
 	.string	"rt_mutex"
 .LASF1005:
 	.string	"rchar"
-.LASF3202:
+.LASF3203:
 	.string	"valid_dma_direction"
 .LASF1833:
 	.string	"bd_contains"
@@ -60323,7 +60580,7 @@ __exitcall_ebc_exit:
 	.string	"epoll_watches"
 .LASF2692:
 	.string	"KCOMPACTD_WAKE"
-.LASF3166:
+.LASF3167:
 	.string	"refresh_new_image"
 .LASF2089:
 	.string	"non_rcu"
@@ -60397,13 +60654,13 @@ __exitcall_ebc_exit:
 	.string	"need"
 .LASF505:
 	.string	"s_encoding"
-.LASF3245:
+.LASF3246:
 	.string	"queue_work"
 .LASF1749:
 	.string	"gpl_crcs"
 .LASF1735:
 	.string	"get_state"
-.LASF3205:
+.LASF3206:
 	.string	"dma_handle"
 .LASF1374:
 	.string	"orig_pte"
@@ -60471,13 +60728,13 @@ __exitcall_ebc_exit:
 	.string	"NR_WRITEBACK_TEMP"
 .LASF2528:
 	.string	"functionality"
-.LASF3150:
+.LASF3151:
 	.string	"clac_part_data_align8"
 .LASF306:
 	.string	"__ctors_end"
 .LASF2281:
 	.string	"wakeup_path"
-.LASF3311:
+.LASF3312:
 	.string	"ebc_buf_state_show"
 .LASF983:
 	.string	"vm_prev"
@@ -60493,7 +60750,7 @@ __exitcall_ebc_exit:
 	.string	"__u8"
 .LASF116:
 	.string	"lock"
-.LASF3209:
+.LASF3210:
 	.string	"ebc_pmic_resume"
 .LASF1577:
 	.string	"compact_cached_migrate_pfn"
@@ -60535,7 +60792,7 @@ __exitcall_ebc_exit:
 	.string	"compact_order_failed"
 .LASF1120:
 	.string	"fsuid"
-.LASF3258:
+.LASF3259:
 	.string	"flag"
 .LASF1490:
 	.string	"NR_ISOLATED_FILE"
@@ -60547,9 +60804,9 @@ __exitcall_ebc_exit:
 	.string	"managed_pages"
 .LASF2604:
 	.string	"__tracepoint_page_ref_set"
-.LASF3198:
+.LASF3199:
 	.string	"ebc_tcon_enable"
-.LASF3339:
+.LASF3341:
 	.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"
@@ -60597,13 +60854,13 @@ __exitcall_ebc_exit:
 	.string	"s_vop"
 .LASF1665:
 	.string	"qf_owner"
-.LASF3273:
+.LASF3274:
 	.string	"__write_once_size"
 .LASF2846:
 	.string	"kmalloc_cache_type"
 .LASF575:
 	.string	"mutex"
-.LASF3237:
+.LASF3238:
 	.string	"out_values"
 .LASF854:
 	.string	"pgd_t"
@@ -60617,9 +60874,9 @@ __exitcall_ebc_exit:
 	.string	"raw_spinlock_t"
 .LASF2954:
 	.string	"vir_width"
-.LASF3342:
+.LASF3344:
 	.string	"epd_overlay_lut"
-.LASF3261:
+.LASF3262:
 	.string	"INIT_LIST_HEAD"
 .LASF1953:
 	.string	"fs_flags"
@@ -60637,7 +60894,7 @@ __exitcall_ebc_exit:
 	.string	"resume_frame_count"
 .LASF1204:
 	.string	"radix_tree_node"
-.LASF3263:
+.LASF3264:
 	.string	"sign_extend64"
 .LASF2328:
 	.string	"wake_irq"
@@ -60659,13 +60916,13 @@ __exitcall_ebc_exit:
 	.string	"ptraced"
 .LASF2766:
 	.string	"param_ops_short"
-.LASF3306:
+.LASF3307:
 	.string	"of_find_device_by_node"
 .LASF2568:
 	.string	"HRTIMER_SOFTIRQ"
 .LASF802:
 	.string	"WORK_STRUCT_DELAYED"
-.LASF3183:
+.LASF3184:
 	.string	"ebc_get_2pix_wf_part_32"
 .LASF455:
 	.string	"i_sequence"
@@ -60687,7 +60944,7 @@ __exitcall_ebc_exit:
 	.string	"addr"
 .LASF2400:
 	.string	"device_private"
-.LASF3200:
+.LASF3201:
 	.string	"get_dma_ops"
 .LASF2712:
 	.string	"watermark_scale_factor"
@@ -60703,7 +60960,7 @@ __exitcall_ebc_exit:
 	.string	"mkobj"
 .LASF2981:
 	.string	"direct_buf_real_size"
-.LASF3328:
+.LASF3329:
 	.string	"__pm_relax"
 .LASF473:
 	.string	"d_delete"
@@ -60751,7 +61008,7 @@ __exitcall_ebc_exit:
 	.string	"kill"
 .LASF1044:
 	.string	"iowait_sum"
-.LASF3167:
+.LASF3168:
 	.string	"image_new"
 .LASF15:
 	.string	"__u64"
@@ -60785,7 +61042,7 @@ __exitcall_ebc_exit:
 	.string	"sum_sleep_runtime"
 .LASF3062:
 	.string	"ulogo_addr_str"
-.LASF3133:
+.LASF3134:
 	.string	"flip"
 .LASF1093:
 	.string	"deadline"
@@ -60829,11 +61086,11 @@ __exitcall_ebc_exit:
 	.string	"read_dqblk"
 .LASF1630:
 	.string	"dq_flags"
-.LASF3136:
+.LASF3137:
 	.string	"buffer_new"
 .LASF213:
 	.string	"user_fpsimd_state"
-.LASF3305:
+.LASF3306:
 	.string	"device_create_file"
 .LASF521:
 	.string	"s_time_gran"
@@ -60857,11 +61114,11 @@ __exitcall_ebc_exit:
 	.string	"s_bdi"
 .LASF2871:
 	.string	"wf_table"
-.LASF3173:
+.LASF3174:
 	.string	"image_new_tmp"
 .LASF1746:
 	.string	"num_kp"
-.LASF3338:
+.LASF3340:
 	.string	"__pm_stay_awake"
 .LASF2579:
 	.string	"vmap_area_list"
@@ -60909,7 +61166,7 @@ __exitcall_ebc_exit:
 	.string	"pgoff"
 .LASF2236:
 	.string	"of_node"
-.LASF3179:
+.LASF3180:
 	.string	"refresh_new_image_auto_32"
 .LASF2900:
 	.string	"EPD_PART_GCC16"
@@ -61069,7 +61326,7 @@ __exitcall_ebc_exit:
 	.string	"s_inode_list_lock"
 .LASF2614:
 	.string	"align"
-.LASF3144:
+.LASF3145:
 	.string	"frame_idx"
 .LASF204:
 	.string	"mm_segment_t"
@@ -61091,7 +61348,7 @@ __exitcall_ebc_exit:
 	.string	"maj_flt"
 .LASF229:
 	.string	"arch_rwlock_t"
-.LASF3326:
+.LASF3327:
 	.string	"ebc_osd_buf_clone"
 .LASF162:
 	.string	"c_false"
@@ -61117,7 +61374,7 @@ __exitcall_ebc_exit:
 	.string	"minor"
 .LASF1713:
 	.string	"nextents"
-.LASF3203:
+.LASF3204:
 	.string	"dma_direction"
 .LASF1:
 	.string	"sizetype"
@@ -61127,7 +61384,7 @@ __exitcall_ebc_exit:
 	.string	"arg_lock"
 .LASF1755:
 	.string	"num_exentries"
-.LASF3121:
+.LASF3122:
 	.string	"check_out"
 .LASF2623:
 	.string	"high_memory"
@@ -61141,7 +61398,7 @@ __exitcall_ebc_exit:
 	.string	"next_timer"
 .LASF741:
 	.string	"throttle_queue"
-.LASF3321:
+.LASF3322:
 	.string	"finish_wait"
 .LASF1494:
 	.string	"WORKINGSET_NODERECLAIM"
@@ -61153,7 +61410,7 @@ __exitcall_ebc_exit:
 	.string	"keyring_index_key"
 .LASF833:
 	.string	"__WQ_ORDERED"
-.LASF3197:
+.LASF3198:
 	.string	"ebc_tcon_disable"
 .LASF1435:
 	.string	"leases_enable"
@@ -61195,7 +61452,7 @@ __exitcall_ebc_exit:
 	.string	"num_vf"
 .LASF1549:
 	.string	"isolate_mode_t"
-.LASF3204:
+.LASF3205:
 	.string	"debug_dma_sync_single_for_device"
 .LASF99:
 	.string	"llseek"
@@ -61237,9 +61494,9 @@ __exitcall_ebc_exit:
 	.string	"target"
 .LASF2560:
 	.string	"HI_SOFTIRQ"
-.LASF3206:
+.LASF3207:
 	.string	"direction"
-.LASF3172:
+.LASF3173:
 	.string	"image_bg_data"
 .LASF972:
 	.string	"session_keyring"
@@ -61249,7 +61506,7 @@ __exitcall_ebc_exit:
 	.string	"key_restrict_link_func_t"
 .LASF1499:
 	.string	"NR_WRITEBACK"
-.LASF3158:
+.LASF3159:
 	.string	"frame_count"
 .LASF487:
 	.string	"s_maxbytes"
@@ -61263,7 +61520,7 @@ __exitcall_ebc_exit:
 	.string	"i2c_bus_type"
 .LASF899:
 	.string	"hrtimer_cpu_base"
-.LASF3332:
+.LASF3334:
 	.string	"ebc_notify"
 .LASF1405:
 	.string	"cb_head"
@@ -61291,7 +61548,7 @@ __exitcall_ebc_exit:
 	.string	"cpus_requested"
 .LASF2608:
 	.string	"__tracepoint_page_ref_mod_unless"
-.LASF3214:
+.LASF3215:
 	.string	"wake_lock_init"
 .LASF1200:
 	.string	"list_lru"
@@ -61317,7 +61574,7 @@ __exitcall_ebc_exit:
 	.string	"d_iput"
 .LASF108:
 	.string	"compat_ioctl"
-.LASF3222:
+.LASF3223:
 	.string	"__range_ok"
 .LASF287:
 	.string	"__start_ro_after_init"
@@ -61325,7 +61582,7 @@ __exitcall_ebc_exit:
 	.string	"num_poisoned_pages"
 .LASF919:
 	.string	"filter"
-.LASF3207:
+.LASF3208:
 	.string	"ebc_pmic_get_vcom"
 .LASF2962:
 	.string	"ebc_tcon"
@@ -61437,11 +61694,11 @@ __exitcall_ebc_exit:
 	.string	"power"
 .LASF266:
 	.string	"strict_mask"
-.LASF3320:
+.LASF3321:
 	.string	"init_wait_entry"
 .LASF2801:
 	.string	"module_state"
-.LASF3276:
+.LASF3277:
 	.string	"_dev_info"
 .LASF417:
 	.string	"d_subdirs"
@@ -61487,9 +61744,9 @@ __exitcall_ebc_exit:
 	.string	"removed_mem"
 .LASF248:
 	.string	"jump_label_t"
-.LASF3307:
+.LASF3308:
 	.string	"of_get_property"
-.LASF3188:
+.LASF3189:
 	.string	"ebc_tcon_frame_start"
 .LASF2726:
 	.string	"Elf64_Half"
@@ -61503,7 +61760,7 @@ __exitcall_ebc_exit:
 	.string	"can_wakeup"
 .LASF2561:
 	.string	"TIMER_SOFTIRQ"
-.LASF3163:
+.LASF3164:
 	.string	"temp_data"
 .LASF1229:
 	.string	"xol_area"
@@ -61529,11 +61786,11 @@ __exitcall_ebc_exit:
 	.string	"init_on_free"
 .LASF1166:
 	.string	"nr_pages"
-.LASF3181:
+.LASF3182:
 	.string	"ebc_power_set"
 .LASF1776:
 	.string	"num_trace_bprintk_fmt"
-.LASF3270:
+.LASF3271:
 	.string	"__fls"
 .LASF1144:
 	.string	"ioprio"
@@ -61559,9 +61816,9 @@ __exitcall_ebc_exit:
 	.string	"persistent_clock_is_local"
 .LASF2428:
 	.string	"dma_supported"
-.LASF3239:
+.LASF3240:
 	.string	"dev_set_drvdata"
-.LASF3334:
+.LASF3336:
 	.string	"epd_lut_get"
 .LASF1550:
 	.string	"per_cpu_pages"
@@ -61597,7 +61854,7 @@ __exitcall_ebc_exit:
 	.string	"BLOCK_SOFTIRQ"
 .LASF1426:
 	.string	"files_stat_struct"
-.LASF3282:
+.LASF3283:
 	.string	"devm_memremap"
 .LASF858:
 	.string	"pgtable_t"
@@ -61609,13 +61866,13 @@ __exitcall_ebc_exit:
 	.string	"symlink"
 .LASF1589:
 	.string	"mem_map"
-.LASF3113:
+.LASF3114:
 	.string	"old_buffer"
 .LASF2972:
 	.string	"lut_data_set"
 .LASF791:
 	.string	"sysctl_timer_migration"
-.LASF3153:
+.LASF3154:
 	.string	"clac_full_data_16_to_32"
 .LASF2932:
 	.string	"DMA_NONE"
@@ -61627,7 +61884,7 @@ __exitcall_ebc_exit:
 	.string	"WAKE_LOCK_SUSPEND"
 .LASF1792:
 	.string	"WRITE_LIFE_SHORT"
-.LASF3265:
+.LASF3266:
 	.string	"__swab32p"
 .LASF286:
 	.string	"_einittext"
@@ -61669,7 +61926,7 @@ __exitcall_ebc_exit:
 	.string	"rm_xquota"
 .LASF1099:
 	.string	"dl_timer"
-.LASF3316:
+.LASF3317:
 	.string	"remap_pfn_range"
 .LASF2390:
 	.string	"DL_DEV_NO_DRIVER"
@@ -61683,7 +61940,7 @@ __exitcall_ebc_exit:
 	.string	"watermark"
 .LASF2438:
 	.string	"deadprops"
-.LASF3278:
+.LASF3279:
 	.string	"devm_kmalloc"
 .LASF16:
 	.string	"long long unsigned int"
@@ -61819,7 +62076,7 @@ __exitcall_ebc_exit:
 	.string	"free_list"
 .LASF590:
 	.string	"prio"
-.LASF3231:
+.LASF3232:
 	.string	"platform_get_drvdata"
 .LASF2570:
 	.string	"NR_SOFTIRQS"
@@ -61841,7 +62098,7 @@ __exitcall_ebc_exit:
 	.string	"atomic_t"
 .LASF813:
 	.string	"WORK_OFFQ_FLAG_BITS"
-.LASF3189:
+.LASF3190:
 	.string	"ebc_tcon_image_addr_set"
 .LASF2546:
 	.string	"max_num_msgs"
@@ -61861,7 +62118,7 @@ __exitcall_ebc_exit:
 	.string	"scatterlist"
 .LASF1282:
 	.string	"altmap_valid"
-.LASF3336:
+.LASF3338:
 	.string	"down"
 .LASF102:
 	.string	"read_iter"
@@ -61899,7 +62156,7 @@ __exitcall_ebc_exit:
 	.string	"pm_domain_data"
 .LASF2502:
 	.string	"byte"
-.LASF3302:
+.LASF3303:
 	.string	"__wake_up_sync"
 .LASF2017:
 	.string	"poll_table_struct"
@@ -61925,7 +62182,7 @@ __exitcall_ebc_exit:
 	.string	"page_fault"
 .LASF1484:
 	.string	"NR_INACTIVE_FILE"
-.LASF3254:
+.LASF3255:
 	.string	"__ret_warn_on"
 .LASF1640:
 	.string	"kqid"
@@ -61997,7 +62254,7 @@ __exitcall_ebc_exit:
 	.string	"shift"
 .LASF1452:
 	.string	"ia_gid"
-.LASF3124:
+.LASF3125:
 	.string	"vaild_size"
 .LASF36:
 	.string	"name_offset"
@@ -62007,7 +62264,7 @@ __exitcall_ebc_exit:
 	.string	"__irqentry_text_end"
 .LASF1361:
 	.string	"context"
-.LASF3157:
+.LASF3158:
 	.string	"get_overlay_image"
 .LASF1555:
 	.string	"per_cpu_nodestat"
@@ -62049,13 +62306,13 @@ __exitcall_ebc_exit:
 	.string	"of_match_table"
 .LASF2593:
 	.string	"percpu_count_ptr"
-.LASF3317:
+.LASF3318:
 	.string	"ebc_phy_buf_base_get"
 .LASF2094:
 	.string	"loops_per_jiffy"
 .LASF2525:
 	.string	"i2c_algorithm"
-.LASF3118:
+.LASF3119:
 	.string	"check_size"
 .LASF2873:
 	.string	"buf_idle"
@@ -62073,7 +62330,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_INODESTEAL"
 .LASF1190:
 	.string	"count_objects"
-.LASF3269:
+.LASF3270:
 	.string	"fls64"
 .LASF936:
 	.string	"_stime"
@@ -62093,7 +62350,7 @@ __exitcall_ebc_exit:
 	.string	"statistics"
 .LASF2953:
 	.string	"current_buffer"
-.LASF3151:
+.LASF3152:
 	.string	"direct_mode_data_change"
 .LASF1633:
 	.string	"kprojid_t"
@@ -62109,11 +62366,11 @@ __exitcall_ebc_exit:
 	.string	"sync_sg_for_device"
 .LASF1979:
 	.string	"statfs"
-.LASF3297:
+.LASF3298:
 	.string	"__kmalloc"
-.LASF3285:
+.LASF3286:
 	.string	"_dev_err"
-.LASF3275:
+.LASF3276:
 	.string	"__platform_driver_register"
 .LASF2980:
 	.string	"ebc_buf_real_size"
@@ -62199,7 +62456,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_PENDING_BIT"
 .LASF721:
 	.string	"rseq"
-.LASF3165:
+.LASF3166:
 	.string	"get_auto_image"
 .LASF196:
 	.string	"nfds"
@@ -62213,7 +62470,7 @@ __exitcall_ebc_exit:
 	.string	"i_acl"
 .LASF1804:
 	.string	"bmap"
-.LASF3283:
+.LASF3284:
 	.string	"ebc_buf_init"
 .LASF2063:
 	.string	"key_payload"
@@ -62253,7 +62510,7 @@ __exitcall_ebc_exit:
 	.string	"fallocate"
 .LASF1722:
 	.string	"i_spc_warnlimit"
-.LASF3255:
+.LASF3256:
 	.string	"check_object_size"
 .LASF1530:
 	.string	"node_present_pages"
@@ -62317,7 +62574,7 @@ __exitcall_ebc_exit:
 	.string	"hiwater_vm"
 .LASF3077:
 	.string	"pmic_vcom_read"
-.LASF3277:
+.LASF3278:
 	.string	"misc_deregister"
 .LASF1263:
 	.string	"compound_head"
@@ -62337,7 +62594,7 @@ __exitcall_ebc_exit:
 	.string	"bd_write_holder"
 .LASF2209:
 	.string	"poweroff_noirq"
-.LASF3280:
+.LASF3281:
 	.string	"of_parse_phandle"
 .LASF1873:
 	.string	"rename"
@@ -62367,9 +62624,9 @@ __exitcall_ebc_exit:
 	.string	"sync_single_for_cpu"
 .LASF794:
 	.string	"data"
-.LASF3224:
+.LASF3225:
 	.string	"kzalloc"
-.LASF3248:
+.LASF3249:
 	.string	"msecs_to_jiffies"
 .LASF1934:
 	.string	"lm_break"
@@ -62405,7 +62662,7 @@ __exitcall_ebc_exit:
 	.string	"signed char"
 .LASF376:
 	.string	"rcu_scheduler_active"
-.LASF3234:
+.LASF3235:
 	.string	"propname"
 .LASF2116:
 	.string	"priv"
@@ -62521,7 +62778,7 @@ __exitcall_ebc_exit:
 	.string	"WQ_MAX_UNBOUND_PER_CPU"
 .LASF1552:
 	.string	"per_cpu_pageset"
-.LASF3290:
+.LASF3291:
 	.string	"__alloc_workqueue_key"
 .LASF760:
 	.string	"status"
@@ -62535,7 +62792,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_GCC16"
 .LASF2529:
 	.string	"i2c_lock_operations"
-.LASF3185:
+.LASF3186:
 	.string	"ebc_get_4pix_wf_part"
 .LASF1635:
 	.string	"USRQUOTA"
@@ -62581,9 +62838,9 @@ __exitcall_ebc_exit:
 	.string	"f_inode"
 .LASF2046:
 	.string	"procname"
-.LASF3162:
+.LASF3163:
 	.string	"point_data"
-.LASF3287:
+.LASF3288:
 	.string	"epd_lut_from_file_init"
 .LASF1684:
 	.string	"mark_dirty"
@@ -62613,11 +62870,11 @@ __exitcall_ebc_exit:
 	.string	"releasepage"
 .LASF1717:
 	.string	"qc_info"
-.LASF3138:
+.LASF3139:
 	.string	"clac_part_data_32_to_16"
 .LASF3100:
 	.string	"ebc_thread"
-.LASF3120:
+.LASF3121:
 	.string	"pbuf_old"
 .LASF2905:
 	.string	"EPD_A2_ENTER"
@@ -62635,7 +62892,7 @@ __exitcall_ebc_exit:
 	.string	"win_y1"
 .LASF2886:
 	.string	"win_y2"
-.LASF3114:
+.LASF3115:
 	.string	"buf_size"
 .LASF2103:
 	.string	"bitmap"
@@ -62739,7 +62996,7 @@ __exitcall_ebc_exit:
 	.string	"percpu_size"
 .LASF1338:
 	.string	"mmap_sem"
-.LASF3318:
+.LASF3319:
 	.string	"schedule"
 .LASF2457:
 	.string	"get_reference_args"
@@ -62845,7 +63102,7 @@ __exitcall_ebc_exit:
 	.string	"restore_noirq"
 .LASF1442:
 	.string	"ki_filp"
-.LASF3156:
+.LASF3157:
 	.string	"clac_full_data_align16"
 .LASF1127:
 	.string	"cap_ambient"
@@ -62867,13 +63124,13 @@ __exitcall_ebc_exit:
 	.string	"PROBE_DEFAULT_STRATEGY"
 .LASF2761:
 	.string	"elemsize"
-.LASF3149:
+.LASF3150:
 	.string	"clac_part_data_align16"
 .LASF906:
 	.string	"nr_events"
 .LASF2336:
 	.string	"iommu"
-.LASF3154:
+.LASF3155:
 	.string	"clac_full_data_32"
 .LASF360:
 	.string	"private"
@@ -62897,7 +63154,7 @@ __exitcall_ebc_exit:
 	.string	"uid_keyring"
 .LASF726:
 	.string	"splice_pipe"
-.LASF3128:
+.LASF3129:
 	.string	"frame_done_callback"
 .LASF1815:
 	.string	"error_remove_page"
@@ -62943,7 +63200,7 @@ __exitcall_ebc_exit:
 	.string	"compound_mapcount"
 .LASF1464:
 	.string	"zone_stat_item"
-.LASF3226:
+.LASF3227:
 	.string	"kmalloc_large"
 .LASF2641:
 	.string	"PE_SIZE_PMD"
@@ -62981,7 +63238,7 @@ __exitcall_ebc_exit:
 	.string	"gp_count"
 .LASF2066:
 	.string	"key_restriction"
-.LASF3111:
+.LASF3112:
 	.string	"check_part_mode"
 .LASF619:
 	.string	"exit_state"
@@ -63015,7 +63272,7 @@ __exitcall_ebc_exit:
 	.string	"last_waited"
 .LASF3085:
 	.string	"ebc_open"
-.LASF3195:
+.LASF3196:
 	.string	"three_win_mode"
 .LASF2890:
 	.string	"EPD_OVERLAY"
@@ -63039,7 +63296,7 @@ __exitcall_ebc_exit:
 	.string	"notifier_block"
 .LASF2311:
 	.string	"suspended_jiffies"
-.LASF3110:
+.LASF3111:
 	.string	"buffer_out"
 .LASF2177:
 	.string	"mm_kobj"
@@ -63069,7 +63326,7 @@ __exitcall_ebc_exit:
 	.string	"timer_expires"
 .LASF2842:
 	.string	"mmlist_lock"
-.LASF3212:
+.LASF3213:
 	.string	"ebc_pmic_power_on"
 .LASF1780:
 	.string	"trace_evals"
@@ -63113,7 +63370,7 @@ __exitcall_ebc_exit:
 	.string	"relax_count"
 .LASF1428:
 	.string	"nr_free_files"
-.LASF3225:
+.LASF3226:
 	.string	"kmalloc"
 	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
 	.section	.note.GNU-stack,"",@progbits

commit f46e670930df833fd48f139bb4b93ca5dfcc08c4
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Tue Dec 7 17:52:17 2021 +0800

    drm/rockchip: ebc_dev: release version v2.20
    
    ebc power on in advance
    fix resume check not drop buf
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: I1f34d4c5bd49a730967c997225f40dbed165bc92

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index 993afa0d2ee0..fff705fe85ea 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -1119,15 +1119,15 @@ get_overlay_image:
 	.type	waveform_open, %function
 waveform_open:
 .LFB2847:
-	.loc 1 2597 0
+	.loc 1 2605 0
 	.cfi_startproc
 .LVL62:
-	.loc 1 2601 0
+	.loc 1 2609 0
 	mov	w0, 0
 .LVL63:
-	.loc 1 2598 0
+	.loc 1 2606 0
 	str	xzr, [x1, 104]
-	.loc 1 2601 0
+	.loc 1 2609 0
 	ret
 	.cfi_endproc
 .LFE2847:
@@ -1137,22 +1137,22 @@ waveform_open:
 	.type	ebc_exit, %function
 ebc_exit:
 .LFB2867:
-	.loc 1 3168 0
+	.loc 1 3176 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3169 0
+	.loc 1 3177 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3168 0
+	.loc 1 3176 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3169 0
+	.loc 1 3177 0
 	bl	platform_driver_unregister
 .LVL64:
-	.loc 1 3170 0
+	.loc 1 3178 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1167,7 +1167,7 @@ ebc_exit:
 	.type	ebc_resume, %function
 ebc_resume:
 .LFB2865:
-	.loc 1 3130 0
+	.loc 1 3138 0
 	.cfi_startproc
 .LVL65:
 	stp	x29, x30, [sp, -32]!
@@ -1185,7 +1185,7 @@ ebc_resume:
 	ldr	x19, [x0, 184]
 .LBE955:
 .LBE954:
-	.loc 1 3134 0
+	.loc 1 3142 0
 	ldr	x1, [x19, 16]
 .LBB956:
 .LBB957:
@@ -1198,15 +1198,15 @@ ebc_resume:
 .LVL67:
 .LBE957:
 .LBE956:
-	.loc 1 3135 0
+	.loc 1 3143 0
 	str	wzr, [x19, 804]
-	.loc 1 3136 0
+	.loc 1 3144 0
 	ldr	x0, [x19, 288]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
 .LVL68:
-	.loc 1 3139 0
+	.loc 1 3147 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -1223,20 +1223,20 @@ ebc_resume:
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
 .LFB2840:
-	.loc 1 2254 0
+	.loc 1 2262 0
 	.cfi_startproc
 .LVL69:
-	.loc 1 2255 0
+	.loc 1 2263 0
 	adrp	x0, .LANCHOR0
 .LVL70:
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2257 0
+	.loc 1 2265 0
 	ldr	w2, [x0, 624]
 	cbnz	w2, .L165
 	ret
 	.p2align 3
 .L165:
-	.loc 1 2254 0
+	.loc 1 2262 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -1248,10 +1248,10 @@ ebc_vdd_power_timeout:
 	add	x0, x0, 416
 .LBE959:
 .LBE958:
-	.loc 1 2254 0
+	.loc 1 2262 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2258 0
+	.loc 1 2266 0
 	str	wzr, [x0, 208]
 .LBB961:
 .LBB960:
@@ -1260,7 +1260,7 @@ ebc_vdd_power_timeout:
 .LVL71:
 .LBE960:
 .LBE961:
-	.loc 1 2263 0
+	.loc 1 2271 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1274,27 +1274,27 @@ ebc_vdd_power_timeout:
 	.type	ebc_remove, %function
 ebc_remove:
 .LFB2863:
-	.loc 1 3106 0
+	.loc 1 3114 0
 	.cfi_startproc
 .LVL72:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3107 0
+	.loc 1 3115 0
 	adrp	x0, .LANCHOR1
 .LVL73:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3106 0
+	.loc 1 3114 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3107 0
+	.loc 1 3115 0
 	add	x0, x0, 224
-	.loc 1 3106 0
-	.loc 1 3107 0
+	.loc 1 3114 0
+	.loc 1 3115 0
 	bl	misc_deregister
 .LVL74:
-	.loc 1 3110 0
+	.loc 1 3118 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -1309,7 +1309,7 @@ ebc_remove:
 	.type	ebc_mmap, %function
 ebc_mmap:
 .LFB2844:
-	.loc 1 2543 0
+	.loc 1 2551 0
 	.cfi_startproc
 .LVL75:
 	stp	x29, x30, [sp, -32]!
@@ -1320,33 +1320,33 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2543 0
+	.loc 1 2551 0
 	mov	x19, x1
-	.loc 1 2546 0
+	.loc 1 2554 0
 	bl	ebc_phy_buf_base_get
 .LVL76:
-	.loc 1 2549 0
+	.loc 1 2557 0
 	lsr	x2, x0, 12
-	.loc 1 2547 0
+	.loc 1 2555 0
 	mov	x6, 16384
-	.loc 1 2549 0
+	.loc 1 2557 0
 	mov	x0, x19
-	.loc 1 2547 0
+	.loc 1 2555 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 2549 0
+	.loc 1 2557 0
 	ldp	x1, x3, [x19]
-	.loc 1 2547 0
+	.loc 1 2555 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 2549 0
+	.loc 1 2557 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
 .LVL77:
-	.loc 1 2552 0
+	.loc 1 2560 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 2555 0
+	.loc 1 2563 0
 	ldr	x19, [sp, 16]
 .LVL78:
 	csel	w0, w0, w1, eq
@@ -1364,47 +1364,47 @@ ebc_mmap:
 	.type	waveform_mmap, %function
 waveform_mmap:
 .LFB2846:
-	.loc 1 2581 0
+	.loc 1 2589 0
 	.cfi_startproc
 .LVL79:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2582 0
+	.loc 1 2590 0
 	adrp	x2, .LANCHOR0
-	.loc 1 2586 0
+	.loc 1 2594 0
 	mov	x7, 16384
-	.loc 1 2588 0
+	.loc 1 2596 0
 	mov	x0, x1
 .LVL80:
-	.loc 1 2581 0
+	.loc 1 2589 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2585 0
+	.loc 1 2593 0
 	ldr	x2, [x2, #:lo12:.LANCHOR0]
-	.loc 1 2586 0
+	.loc 1 2594 0
 	movk	x7, 0x404, lsl 16
 	ldp	x4, x5, [x1, 72]
-	.loc 1 2588 0
+	.loc 1 2596 0
 	ldp	x6, x3, [x1]
-	.loc 1 2586 0
+	.loc 1 2594 0
 	orr	x5, x5, x7
-	.loc 1 2585 0
+	.loc 1 2593 0
 	ldr	x2, [x2, 216]
-	.loc 1 2586 0
+	.loc 1 2594 0
 	str	x5, [x1, 80]
-	.loc 1 2588 0
+	.loc 1 2596 0
 	sub	x3, x3, x6
 	mov	x1, x6
 .LVL81:
 	lsr	x2, x2, 12
 	bl	remap_pfn_range
 .LVL82:
-	.loc 1 2591 0
+	.loc 1 2599 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 2594 0
+	.loc 1 2602 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1419,16 +1419,16 @@ waveform_mmap:
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
 .LFB2843:
-	.loc 1 2339 0
+	.loc 1 2347 0
 	.cfi_startproc
 .LVL83:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 2349 0
+	.loc 1 2357 0
 	cmp	w1, 28672
-	.loc 1 2339 0
+	.loc 1 2347 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -1442,15 +1442,15 @@ ebc_io_ctl:
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
 	.cfi_offset 23, -112
-	.loc 1 2339 0
+	.loc 1 2347 0
 	mov	x21, x2
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 2341 0
+	.loc 1 2349 0
 	adrp	x0, .LANCHOR0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2349 0
+	.loc 1 2357 0
 	bcc	.L177
 	mov	w0, 28675
 	cmp	w1, w0
@@ -1460,7 +1460,7 @@ ebc_io_ctl:
 	cmp	w0, 1
 	bls	.L178
 .L177:
-	.loc 1 2365 0
+	.loc 1 2373 0
 	mov	w0, 28677
 	cmp	w1, w0
 	beq	.L181
@@ -1476,13 +1476,13 @@ ebc_io_ctl:
 	mov	w0, 28683
 	cmp	w1, w0
 	bne	.L180
-	.loc 1 2520 0
+	.loc 1 2528 0
 	bl	ebc_empty_buf_get
 .LVL85:
 	mov	x23, x0
-	.loc 1 2521 0
+	.loc 1 2529 0
 	cbz	x0, .L201
-	.loc 1 2523 0
+	.loc 1 2531 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 408]
@@ -1493,7 +1493,7 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL86:
-	.loc 1 2524 0
+	.loc 1 2532 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL87:
@@ -1523,11 +1523,11 @@ ebc_io_ctl:
 .LBE964:
 .LBE963:
 .LBE962:
-	.loc 1 2526 0
+	.loc 1 2534 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 2525 0
+	.loc 1 2533 0
 	str	w0, [x29, 104]
-	.loc 1 2527 0
+	.loc 1 2535 0
 	stp	w4, w1, [x29, 112]
 .LBB993:
 .LBB990:
@@ -1556,7 +1556,7 @@ ebc_io_ctl:
 .LBE987:
 .LBE990:
 .LBE993:
-	.loc 1 2340 0
+	.loc 1 2348 0
 	mov	x0, x21
 .LVL92:
 .LBB994:
@@ -1604,36 +1604,36 @@ ebc_io_ctl:
 .LBE988:
 .LBE991:
 .LBE994:
-	.loc 1 2529 0
+	.loc 1 2537 0
 	mov	x0, x23
 .LVL97:
 	bl	ebc_buf_release
 .LVL98:
-	.loc 1 2530 0
+	.loc 1 2538 0
 	b	.L176
 .LVL99:
 	.p2align 3
 .L178:
-	.loc 1 2356 0
+	.loc 1 2364 0
 	cbnz	x21, .L177
-	.loc 1 2357 0
+	.loc 1 2365 0
 	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
 .LVL100:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC1
-	.loc 1 2358 0
+	.loc 1 2366 0
 	mov	x22, -14
-	.loc 1 2357 0
+	.loc 1 2365 0
 	bl	_dev_err
 .LVL101:
-	.loc 1 2358 0
+	.loc 1 2366 0
 	b	.L176
 .LVL102:
 	.p2align 3
 .L310:
-	.loc 1 2365 0
+	.loc 1 2373 0
 	mov	w0, 28674
 	cmp	w1, w0
 	beq	.L183
@@ -1644,23 +1644,23 @@ ebc_io_ctl:
 	mov	w0, 28676
 	cmp	w1, w0
 	bne	.L180
-	.loc 1 2451 0
+	.loc 1 2459 0
 	ldr	x0, [x20, 288]
-	.loc 1 2450 0
+	.loc 1 2458 0
 	mov	w2, 1
 	str	w2, [x20, 812]
-	.loc 1 2451 0
+	.loc 1 2459 0
 	adrp	x1, .LC2
 .LVL103:
-	.loc 1 2452 0
+	.loc 1 2460 0
 	mov	x22, 0
-	.loc 1 2451 0
+	.loc 1 2459 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
 .LVL104:
 	.p2align 2
 .L176:
-	.loc 1 2540 0
+	.loc 1 2548 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
 .LVL105:
@@ -1688,7 +1688,7 @@ ebc_io_ctl:
 	.p2align 3
 .L313:
 	.cfi_restore_state
-	.loc 1 2365 0
+	.loc 1 2373 0
 	cmp	w1, 28672
 	beq	.L185
 	mov	w0, 28673
@@ -1802,58 +1802,58 @@ ebc_io_ctl:
 .LBE997:
 .LBE996:
 .LBE995:
-	.loc 1 2405 0
+	.loc 1 2413 0
 	bl	ebc_phy_buf_base_get
 .LVL121:
 	ldrsw	x1, [x29, 104]
-	.loc 1 2406 0
+	.loc 1 2414 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
 .LVL122:
 	mov	x21, x0
 .LVL123:
-	.loc 1 2407 0
+	.loc 1 2415 0
 	cbz	x0, .L216
-	.loc 1 2408 0
+	.loc 1 2416 0
 	ldr	w1, [x29, 108]
-	.loc 1 2417 0
+	.loc 1 2425 0
 	add	x20, x20, 184
-	.loc 1 2408 0
+	.loc 1 2416 0
 	str	w1, [x21, 40]
-	.loc 1 2412 0
+	.loc 1 2420 0
 	ldp	w4, w2, [x29, 124]
 	stp	w4, w2, [x21, 48]
-	.loc 1 2411 0
+	.loc 1 2419 0
 	ldr	w3, [x29, 132]
-	.loc 1 2413 0
+	.loc 1 2421 0
 	ldr	w1, [x29, 136]
-	.loc 1 2409 0
+	.loc 1 2417 0
 	ldr	w5, [x29, 148]
-	.loc 1 2411 0
+	.loc 1 2419 0
 	str	w3, [x21, 56]
-	.loc 1 2409 0
+	.loc 1 2417 0
 	stp	w1, w5, [x21, 60]
-	.loc 1 2415 0
+	.loc 1 2423 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL124:
-	.loc 1 2417 0
+	.loc 1 2425 0
 	ldr	w0, [x20, 96]
 	cbz	w0, .L316
 .L211:
-	.loc 1 2421 0
+	.loc 1 2429 0
 	ldr	w0, [x21, 40]
 	cmp	w0, 18
 	beq	.L317
-	.loc 1 2421 0 is_stmt 0 discriminator 3
+	.loc 1 2429 0 is_stmt 0 discriminator 3
 	cmp	w0, 20
 	bne	.L216
 .L213:
-	.loc 1 2422 0 is_stmt 1
+	.loc 1 2430 0 is_stmt 1
 	mov	w0, 1
 	str	w0, [x20, 204]
 .LBB1024:
 .LBB1025:
-	.loc 1 2423 0
+	.loc 1 2431 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
@@ -1866,13 +1866,13 @@ ebc_io_ctl:
 	.p2align 3
 .L318:
 .LVL126:
-	.loc 1 2423 0 is_stmt 0 discriminator 5
+	.loc 1 2431 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L216
-	.loc 1 2423 0 discriminator 7
+	.loc 1 2431 0 discriminator 7
 	bl	schedule
 .LVL127:
 .L217:
-	.loc 1 2423 0 discriminator 9
+	.loc 1 2431 0 discriminator 9
 	add	x1, x29, 64
 	mov	w2, 1
 	mov	x0, x21
@@ -1881,7 +1881,7 @@ ebc_io_ctl:
 	ldr	w1, [x20, 204]
 	cbnz	w1, .L318
 .LBE1026:
-	.loc 1 2423 0 discriminator 4
+	.loc 1 2431 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
 	bl	finish_wait
@@ -1895,13 +1895,13 @@ ebc_io_ctl:
 .L193:
 .LBE1025:
 .LBE1024:
-	.loc 1 2507 0 is_stmt 1
+	.loc 1 2515 0 is_stmt 1
 	bl	ebc_empty_buf_get
 .LVL131:
 	mov	x23, x0
-	.loc 1 2508 0
+	.loc 1 2516 0
 	cbz	x0, .L201
-	.loc 1 2510 0
+	.loc 1 2518 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 344]
@@ -1911,7 +1911,7 @@ ebc_io_ctl:
 .LVL132:
 	.p2align 3
 .L311:
-	.loc 1 2365 0
+	.loc 1 2373 0
 	mov	w0, 28678
 	cmp	w1, w0
 	beq	.L191
@@ -2026,36 +2026,36 @@ ebc_io_ctl:
 .LBE1032:
 .LBE1031:
 .LBE1030:
-	.loc 1 2432 0
+	.loc 1 2440 0
 	bl	ebc_osd_buf_clone
 .LVL145:
 	mov	x1, x0
-	.loc 1 2433 0
+	.loc 1 2441 0
 	cbz	x0, .L216
-	.loc 1 2434 0
+	.loc 1 2442 0
 	ldr	w6, [x29, 108]
-	.loc 1 2443 0
+	.loc 1 2451 0
 	add	x20, x20, 184
-	.loc 1 2438 0
+	.loc 1 2446 0
 	ldp	w5, w3, [x29, 124]
-	.loc 1 2434 0
+	.loc 1 2442 0
 	str	w6, [x1, 40]
-	.loc 1 2439 0
+	.loc 1 2447 0
 	ldp	w4, w2, [x29, 132]
-	.loc 1 2438 0
+	.loc 1 2446 0
 	stp	w5, w3, [x1, 48]
-	.loc 1 2439 0
+	.loc 1 2447 0
 	stp	w4, w2, [x1, 56]
-	.loc 1 2441 0
+	.loc 1 2449 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL146:
-	.loc 1 2443 0
+	.loc 1 2451 0
 	ldr	w0, [x20, 96]
 	cbnz	w0, .L216
-	.loc 1 2444 0
+	.loc 1 2452 0
 	mov	w2, 1
 	str	w2, [x20, 96]
-	.loc 1 2445 0
+	.loc 1 2453 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -2128,16 +2128,16 @@ ebc_io_ctl:
 .LBE989:
 .LBE992:
 .LBE1059:
-	.loc 1 2367 0
+	.loc 1 2375 0
 	bl	ebc_osd_buf_get
 .LVL157:
-	.loc 1 2368 0
+	.loc 1 2376 0
 	cbz	x0, .L201
-	.loc 1 2371 0
+	.loc 1 2379 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL158:
-	.loc 1 2376 0
+	.loc 1 2384 0
 	ldr	w1, [x20, 176]
 .LBB1060:
 .LBB1061:
@@ -2162,19 +2162,19 @@ ebc_io_ctl:
 .LBE1062:
 .LBE1061:
 .LBE1060:
-	.loc 1 2371 0
+	.loc 1 2379 0
 	sub	w0, w22, w0
-	.loc 1 2375 0
+	.loc 1 2383 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 2376 0
+	.loc 1 2384 0
 	str	w1, [x29, 120]
-	.loc 1 2374 0
+	.loc 1 2382 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 2377 0
+	.loc 1 2385 0
 	mov	w1, 16
-	.loc 1 2373 0
+	.loc 1 2381 0
 	str	w0, [x29, 104]
-	.loc 1 2377 0
+	.loc 1 2385 0
 	str	w1, [x29, 148]
 .LBB1093:
 .LBB1090:
@@ -2299,7 +2299,7 @@ ebc_io_ctl:
 .LBE1096:
 .LBE1095:
 .LBE1094:
-	.loc 1 2459 0
+	.loc 1 2467 0
 	add	x22, x20, 248
 .LBB1129:
 .LBB1125:
@@ -2396,49 +2396,49 @@ ebc_io_ctl:
 .LBE1121:
 .LBE1125:
 .LBE1129:
-	.loc 1 2463 0
+	.loc 1 2471 0
 	add	x20, x20, 184
 	ldr	w2, [x20, 64]
 	ldr	x0, [x20, 104]
 .LVL184:
-	.loc 1 2464 0
+	.loc 1 2472 0
 	mov	x22, 0
-	.loc 1 2463 0
+	.loc 1 2471 0
 	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	_dev_info
 .LVL185:
-	.loc 1 2464 0
+	.loc 1 2472 0
 	b	.L176
 .LVL186:
 	.p2align 3
 .L181:
-	.loc 1 2456 0
+	.loc 1 2464 0
 	ldr	x0, [x20, 288]
 	adrp	x1, .LC3
 .LVL187:
-	.loc 1 2454 0
+	.loc 1 2462 0
 	str	wzr, [x20, 812]
-	.loc 1 2457 0
+	.loc 1 2465 0
 	mov	x22, 0
-	.loc 1 2455 0
+	.loc 1 2463 0
 	str	wzr, [x20, 816]
-	.loc 1 2456 0
+	.loc 1 2464 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
 .LVL188:
-	.loc 1 2457 0
+	.loc 1 2465 0
 	b	.L176
 .LVL189:
 	.p2align 3
 .L189:
-	.loc 1 2494 0
+	.loc 1 2502 0
 	bl	ebc_empty_buf_get
 .LVL190:
 	mov	x23, x0
-	.loc 1 2495 0
+	.loc 1 2503 0
 	cbz	x0, .L201
-	.loc 1 2497 0
+	.loc 1 2505 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 336]
@@ -2448,13 +2448,13 @@ ebc_io_ctl:
 .LVL191:
 	.p2align 3
 .L194:
-	.loc 1 2481 0
+	.loc 1 2489 0
 	bl	ebc_empty_buf_get
 .LVL192:
 	mov	x23, x0
-	.loc 1 2482 0
+	.loc 1 2490 0
 	cbz	x0, .L201
-	.loc 1 2484 0
+	.loc 1 2492 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 328]
@@ -2463,7 +2463,7 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL193:
-	.loc 1 2485 0
+	.loc 1 2493 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL194:
@@ -2491,11 +2491,11 @@ ebc_io_ctl:
 .LBE1132:
 .LBE1131:
 .LBE1130:
-	.loc 1 2488 0
+	.loc 1 2496 0
 	ldp	w4, w1, [x22, 84]
-	.loc 1 2486 0
+	.loc 1 2494 0
 	str	w0, [x29, 104]
-	.loc 1 2487 0
+	.loc 1 2495 0
 	stp	w1, w4, [x29, 112]
 .LBB1141:
 .LBB1140:
@@ -2516,7 +2516,7 @@ ebc_io_ctl:
 .LBE1139:
 .LBE1140:
 .LBE1141:
-	.loc 1 2470 0
+	.loc 1 2478 0
 	ldp	w1, w0, [x20, 116]
 .LVL198:
 .LBB1142:
@@ -2542,19 +2542,19 @@ ebc_io_ctl:
 .LBE1144:
 .LBE1143:
 .LBE1142:
-	.loc 1 2467 0
+	.loc 1 2475 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 2470 0
+	.loc 1 2478 0
 	stp	w1, w0, [x29, 140]
-	.loc 1 2468 0
+	.loc 1 2476 0
 	ldr	w4, [x20, 176]
-	.loc 1 2471 0
+	.loc 1 2479 0
 	mov	w0, 16
-	.loc 1 2466 0
+	.loc 1 2474 0
 	stp	w5, w6, [x29, 112]
-	.loc 1 2468 0
+	.loc 1 2476 0
 	str	w4, [x29, 120]
-	.loc 1 2471 0
+	.loc 1 2479 0
 	str	w0, [x29, 148]
 .LBB1177:
 .LBB1173:
@@ -2601,50 +2601,50 @@ ebc_io_ctl:
 .LBE1169:
 .LBE1173:
 .LBE1177:
-	.loc 1 2474 0
+	.loc 1 2482 0
 	ldr	x0, [x20, 288]
 .LVL205:
 	adrp	x1, .LC5
 .LVL206:
-	.loc 1 2475 0
+	.loc 1 2483 0
 	mov	x22, -14
-	.loc 1 2474 0
+	.loc 1 2482 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
 .LVL207:
-	.loc 1 2475 0
+	.loc 1 2483 0
 	b	.L176
 .LVL208:
 	.p2align 3
 .L180:
-	.loc 1 2535 0
+	.loc 1 2543 0
 	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
 .LVL209:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
-	.loc 1 2536 0
+	.loc 1 2544 0
 	mov	x22, 0
-	.loc 1 2535 0
+	.loc 1 2543 0
 	bl	_dev_err
 .LVL210:
-	.loc 1 2539 0
+	.loc 1 2547 0
 	b	.L176
 .LVL211:
 	.p2align 3
 .L185:
-	.loc 1 2382 0
+	.loc 1 2390 0
 	bl	ebc_empty_buf_get
 .LVL212:
 	mov	x23, x0
-	.loc 1 2383 0
+	.loc 1 2391 0
 	cbz	x0, .L201
-	.loc 1 2386 0
+	.loc 1 2394 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL213:
-	.loc 1 2391 0
+	.loc 1 2399 0
 	ldr	w1, [x20, 176]
 .LBB1178:
 .LBB1179:
@@ -2669,19 +2669,19 @@ ebc_io_ctl:
 .LBE1180:
 .LBE1179:
 .LBE1178:
-	.loc 1 2386 0
+	.loc 1 2394 0
 	sub	w0, w22, w0
-	.loc 1 2390 0
+	.loc 1 2398 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 2391 0
+	.loc 1 2399 0
 	str	w1, [x29, 120]
-	.loc 1 2389 0
+	.loc 1 2397 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 2392 0
+	.loc 1 2400 0
 	mov	w1, 16
-	.loc 1 2388 0
+	.loc 1 2396 0
 	str	w0, [x29, 104]
-	.loc 1 2392 0
+	.loc 1 2400 0
 	str	w1, [x29, 148]
 .LBB1213:
 .LBB1209:
@@ -2728,15 +2728,15 @@ ebc_io_ctl:
 .LBE1205:
 .LBE1209:
 .LBE1213:
-	.loc 1 2396 0
+	.loc 1 2404 0
 	mov	x0, x23
 .LVL220:
-	.loc 1 2397 0
+	.loc 1 2405 0
 	mov	x22, -14
-	.loc 1 2396 0
+	.loc 1 2404 0
 	bl	ebc_buf_release
 .LVL221:
-	.loc 1 2397 0
+	.loc 1 2405 0
 	b	.L176
 .LVL222:
 	.p2align 3
@@ -2759,7 +2759,7 @@ ebc_io_ctl:
 .LBE1055:
 .LBE1057:
 .LBE1214:
-	.loc 1 2340 0
+	.loc 1 2348 0
 	mov	x0, x21
 .LVL223:
 .LBB1215:
@@ -2796,7 +2796,7 @@ ebc_io_ctl:
 .LBE1020:
 .LBE1022:
 .LBE1216:
-	.loc 1 2340 0
+	.loc 1 2348 0
 	mov	x0, x21
 .LVL225:
 .LBB1217:
@@ -2834,7 +2834,7 @@ ebc_io_ctl:
 .LBE1170:
 .LBE1174:
 .LBE1218:
-	.loc 1 2340 0
+	.loc 1 2348 0
 	mov	x0, x21
 .LVL228:
 .LBB1219:
@@ -2871,7 +2871,7 @@ ebc_io_ctl:
 .LBE1122:
 .LBE1126:
 .LBE1220:
-	.loc 1 2340 0
+	.loc 1 2348 0
 	mov	x0, x21
 .LVL230:
 .LBB1221:
@@ -2909,7 +2909,7 @@ ebc_io_ctl:
 .LBE1206:
 .LBE1210:
 .LBE1222:
-	.loc 1 2340 0
+	.loc 1 2348 0
 	mov	x0, x21
 .LVL233:
 .LBB1223:
@@ -2947,7 +2947,7 @@ ebc_io_ctl:
 .LBE1088:
 .LBE1091:
 .LBE1224:
-	.loc 1 2340 0
+	.loc 1 2348 0
 	mov	x0, x21
 .LVL236:
 .LBB1225:
@@ -3022,7 +3022,7 @@ ebc_io_ctl:
 .LBE1172:
 .LBE1176:
 .LBE1226:
-	.loc 1 2473 0
+	.loc 1 2481 0
 	cbnz	x0, .L228
 .LBB1227:
 .LBB1027:
@@ -3089,7 +3089,7 @@ ebc_io_ctl:
 .LBE1208:
 .LBE1212:
 .LBE1228:
-	.loc 1 2395 0
+	.loc 1 2403 0
 	cbnz	w0, .L205
 .LBB1229:
 .LBB1028:
@@ -3100,16 +3100,16 @@ ebc_io_ctl:
 .L209:
 .LBE1028:
 .LBE1229:
-	.loc 1 2403 0
+	.loc 1 2411 0
 	mov	x22, -14
 	b	.L176
 .LVL254:
 	.p2align 3
 .L316:
-	.loc 1 2418 0
+	.loc 1 2426 0
 	mov	w2, 1
 	str	w2, [x20, 96]
-	.loc 1 2419 0
+	.loc 1 2427 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -3119,7 +3119,7 @@ ebc_io_ctl:
 	b	.L211
 	.p2align 3
 .L317:
-	.loc 1 2421 0 discriminator 1
+	.loc 1 2429 0 discriminator 1
 	ldr	w0, [x20, 616]
 	cbz	w0, .L213
 .LBB1230:
@@ -3130,7 +3130,7 @@ ebc_io_ctl:
 .L201:
 .LBE1029:
 .LBE1230:
-	.loc 1 2369 0
+	.loc 1 2377 0
 	mov	x22, -1
 	b	.L176
 .LVL257:
@@ -3153,19 +3153,19 @@ ebc_io_ctl:
 .LBE1124:
 .LBE1128:
 .LBE1231:
-	.loc 1 2460 0
+	.loc 1 2468 0
 	ldr	x0, [x20, 288]
 	adrp	x1, .LC4
-	.loc 1 2461 0
+	.loc 1 2469 0
 	mov	x22, -14
-	.loc 1 2460 0
+	.loc 1 2468 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
 .LVL262:
-	.loc 1 2461 0
+	.loc 1 2469 0
 	b	.L176
 .L314:
-	.loc 1 2540 0
+	.loc 1 2548 0
 	bl	__stack_chk_fail
 .LVL263:
 .L322:
@@ -3367,7 +3367,7 @@ frame_done_callback:
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
 .LFB2841:
-	.loc 1 2266 0
+	.loc 1 2274 0
 	.cfi_startproc
 .LVL275:
 	stp	x29, x30, [sp, -16]!
@@ -3376,10 +3376,10 @@ ebc_frame_timeout:
 	.cfi_offset 30, -8
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2267 0
+	.loc 1 2275 0
 	bl	frame_done_callback
 .LVL276:
-	.loc 1 2269 0
+	.loc 1 2277 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3730,23 +3730,23 @@ ebc_lut_update:
 	.type	ebc_buf_state_read, %function
 ebc_buf_state_read:
 .LFB2855:
-	.loc 1 2708 0
+	.loc 1 2716 0
 	.cfi_startproc
 .LVL307:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2709 0
+	.loc 1 2717 0
 	mov	x0, x2
 .LVL308:
-	.loc 1 2708 0
+	.loc 1 2716 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2709 0
+	.loc 1 2717 0
 	bl	ebc_buf_state_show
 .LVL309:
-	.loc 1 2710 0
+	.loc 1 2718 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3761,32 +3761,32 @@ ebc_buf_state_read:
 	.type	ebc_state_read, %function
 ebc_state_read:
 .LFB2854:
-	.loc 1 2699 0
+	.loc 1 2707 0
 	.cfi_startproc
 .LVL310:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2700 0
+	.loc 1 2708 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2699 0
+	.loc 1 2707 0
 	mov	x0, x2
 .LVL311:
-	.loc 1 2700 0
+	.loc 1 2708 0
 	adrp	x1, .LC15
 .LVL312:
-	.loc 1 2699 0
+	.loc 1 2707 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2700 0
+	.loc 1 2708 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL313:
 	add	x1, x1, :lo12:.LC15
 	ldr	w2, [x2, 624]
 	bl	sprintf
 .LVL314:
-	.loc 1 2701 0
+	.loc 1 2709 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3801,7 +3801,7 @@ ebc_state_read:
 	.type	ebc_version_read, %function
 ebc_version_read:
 .LFB2853:
-	.loc 1 2690 0
+	.loc 1 2698 0
 	.cfi_startproc
 .LVL315:
 	stp	x29, x30, [sp, -16]!
@@ -3810,22 +3810,22 @@ ebc_version_read:
 	.cfi_offset 30, -8
 	mov	x0, x2
 .LVL316:
-	.loc 1 2691 0
+	.loc 1 2699 0
 	adrp	x1, .LC17
 .LVL317:
 	adrp	x2, .LC16
 .LVL318:
-	.loc 1 2690 0
+	.loc 1 2698 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2691 0
+	.loc 1 2699 0
 	add	x2, x2, :lo12:.LC16
-	.loc 1 2690 0
-	.loc 1 2691 0
+	.loc 1 2698 0
+	.loc 1 2699 0
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
 .LVL319:
-	.loc 1 2692 0
+	.loc 1 2700 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3840,27 +3840,27 @@ ebc_version_read:
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
 .LFB2851:
-	.loc 1 2654 0
+	.loc 1 2662 0
 	.cfi_startproc
 .LVL320:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 2655 0
+	.loc 1 2663 0
 	adrp	x0, .LANCHOR0
 .LVL321:
-	.loc 1 2654 0
+	.loc 1 2662 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2658 0
+	.loc 1 2666 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2654 0
+	.loc 1 2662 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2654 0
+	.loc 1 2662 0
 	mov	x19, x2
-	.loc 1 2658 0
+	.loc 1 2666 0
 	ldr	x1, [x0, 16]
 .LVL322:
 .LBB1234:
@@ -3872,14 +3872,14 @@ pmic_vcom_read:
 .LVL323:
 .LBE1235:
 .LBE1234:
-	.loc 1 2660 0
+	.loc 1 2668 0
 	mov	w2, w0
 	adrp	x1, .LC15
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
 .LVL324:
-	.loc 1 2661 0
+	.loc 1 2669 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL325:
@@ -3897,20 +3897,20 @@ pmic_vcom_read:
 	.type	pmic_temp_read, %function
 pmic_temp_read:
 .LFB2850:
-	.loc 1 2640 0
+	.loc 1 2648 0
 	.cfi_startproc
 .LVL326:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 2641 0
+	.loc 1 2649 0
 	adrp	x0, .LANCHOR0
 .LVL327:
-	.loc 1 2640 0
+	.loc 1 2648 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2644 0
+	.loc 1 2652 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
 .LBB1236:
 .LBB1237:
@@ -3919,11 +3919,11 @@ pmic_temp_read:
 .LVL328:
 .LBE1237:
 .LBE1236:
-	.loc 1 2640 0
+	.loc 1 2648 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 2640 0
+	.loc 1 2648 0
 	adrp	x19, __stack_chk_guard
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x20, x2
@@ -3931,7 +3931,7 @@ pmic_temp_read:
 	str	x2, [x29, 40]
 	mov	x2,0
 .LVL329:
-	.loc 1 2644 0
+	.loc 1 2652 0
 	ldr	x2, [x0, 16]
 .LBB1239:
 .LBB1238:
@@ -3942,14 +3942,14 @@ pmic_temp_read:
 .LVL330:
 .LBE1238:
 .LBE1239:
-	.loc 1 2646 0
+	.loc 1 2654 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC15
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
 .LVL331:
-	.loc 1 2647 0
+	.loc 1 2655 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
@@ -3978,25 +3978,25 @@ pmic_temp_read:
 	.type	pmic_name_read, %function
 pmic_name_read:
 .LFB2849:
-	.loc 1 2629 0
+	.loc 1 2637 0
 	.cfi_startproc
 .LVL335:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2630 0
+	.loc 1 2638 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2629 0
+	.loc 1 2637 0
 	mov	x0, x2
 .LVL336:
-	.loc 1 2632 0
+	.loc 1 2640 0
 	adrp	x1, .LC17
 .LVL337:
-	.loc 1 2629 0
+	.loc 1 2637 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2632 0
+	.loc 1 2640 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL338:
 	add	x1, x1, :lo12:.LC17
@@ -4004,7 +4004,7 @@ pmic_name_read:
 	add	x2, x2, 8
 	bl	sprintf
 .LVL339:
-	.loc 1 2633 0
+	.loc 1 2641 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -4019,17 +4019,17 @@ pmic_name_read:
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
 .LFB2852:
-	.loc 1 2666 0
+	.loc 1 2674 0
 	.cfi_startproc
 .LVL340:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 2667 0
+	.loc 1 2675 0
 	adrp	x0, .LANCHOR0
 .LVL341:
-	.loc 1 2666 0
+	.loc 1 2674 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -4039,37 +4039,37 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 2666 0
+	.loc 1 2674 0
 	add	x1, x19, :lo12:__stack_chk_guard
 .LVL342:
 	mov	x21, x2
-	.loc 1 2667 0
+	.loc 1 2675 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
 .LVL343:
-	.loc 1 2666 0
+	.loc 1 2674 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
 .LVL344:
 	mov	x20, x3
-	.loc 1 2670 0
+	.loc 1 2678 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
 .LVL345:
-	.loc 1 2671 0
+	.loc 1 2679 0
 	cbnz	w0, .L388
 .LVL346:
-	.loc 1 2675 0
+	.loc 1 2683 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
 .LVL347:
-	.loc 1 2676 0
+	.loc 1 2684 0
 	cbnz	w0, .L389
 .L381:
-	.loc 1 2682 0
+	.loc 1 2690 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
 .LVL348:
@@ -4094,36 +4094,36 @@ pmic_vcom_write:
 	.p2align 3
 .L388:
 	.cfi_restore_state
-	.loc 1 2672 0
+	.loc 1 2680 0
 	ldr	x0, [x22]
 	adrp	x1, .LC18
 	mov	x2, x21
 	add	x1, x1, :lo12:.LC18
-	.loc 1 2673 0
+	.loc 1 2681 0
 	mov	x20, -1
 .LVL351:
-	.loc 1 2672 0
+	.loc 1 2680 0
 	bl	_dev_err
 .LVL352:
-	.loc 1 2673 0
+	.loc 1 2681 0
 	b	.L381
 .LVL353:
 	.p2align 3
 .L389:
-	.loc 1 2677 0
+	.loc 1 2685 0
 	ldr	x0, [x22]
 	adrp	x1, .LC19
-	.loc 1 2678 0
+	.loc 1 2686 0
 	mov	x20, -1
 .LVL354:
-	.loc 1 2677 0
+	.loc 1 2685 0
 	add	x1, x1, :lo12:.LC19
 	bl	_dev_err
 .LVL355:
-	.loc 1 2678 0
+	.loc 1 2686 0
 	b	.L381
 .L390:
-	.loc 1 2682 0
+	.loc 1 2690 0
 	bl	__stack_chk_fail
 .LVL356:
 	.cfi_endproc
@@ -4134,7 +4134,7 @@ pmic_vcom_write:
 	.type	waveform_version_read, %function
 waveform_version_read:
 .LFB2848:
-	.loc 1 2618 0
+	.loc 1 2626 0
 	.cfi_startproc
 .LVL357:
 	stp	x29, x30, [sp, -32]!
@@ -4145,19 +4145,19 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2618 0
+	.loc 1 2626 0
 	mov	x19, x2
-	.loc 1 2619 0
+	.loc 1 2627 0
 	bl	epd_lut_get_wf_version
 .LVL358:
-	.loc 1 2621 0
+	.loc 1 2629 0
 	mov	x2, x0
 	adrp	x1, .LC17
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
 .LVL359:
-	.loc 1 2622 0
+	.loc 1 2630 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL360:
@@ -4175,23 +4175,23 @@ waveform_version_read:
 	.type	ebc_init, %function
 ebc_init:
 .LFB2866:
-	.loc 1 3163 0
+	.loc 1 3171 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3164 0
+	.loc 1 3172 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3163 0
+	.loc 1 3171 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3164 0
+	.loc 1 3172 0
 	bl	__platform_driver_register
 .LVL361:
-	.loc 1 3165 0
+	.loc 1 3173 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -7138,7 +7138,7 @@ ebc_power_set.part.13:
 	.type	ebc_suspend, %function
 ebc_suspend:
 .LFB2864:
-	.loc 1 3113 0
+	.loc 1 3121 0
 	.cfi_startproc
 .LVL587:
 	stp	x29, x30, [sp, -32]!
@@ -7156,17 +7156,17 @@ ebc_suspend:
 	ldr	x20, [x0, 184]
 .LBE1485:
 .LBE1484:
-	.loc 1 3117 0
+	.loc 1 3125 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 200]
 .LVL588:
 	cmp	w0, 1
 	beq	.L670
 .L668:
-	.loc 1 3121 0
+	.loc 1 3129 0
 	mov	w0, 1
 	str	w0, [x19, 620]
-	.loc 1 3123 0
+	.loc 1 3131 0
 	ldr	x1, [x20, 16]
 .LBB1486:
 .LBB1487:
@@ -7177,13 +7177,13 @@ ebc_suspend:
 .LVL589:
 .LBE1487:
 .LBE1486:
-	.loc 1 3124 0
+	.loc 1 3132 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC24
 	add	x1, x1, :lo12:.LC24
 	bl	_dev_info
 .LVL590:
-	.loc 1 3127 0
+	.loc 1 3135 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -7197,7 +7197,7 @@ ebc_suspend:
 	.p2align 3
 .L670:
 	.cfi_restore_state
-	.loc 1 3118 0
+	.loc 1 3126 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
@@ -7299,7 +7299,7 @@ check_black_percent.isra.15:
 	.type	ebc_probe, %function
 ebc_probe:
 .LFB2862:
-	.loc 1 2977 0
+	.loc 1 2985 0
 	.cfi_startproc
 .LVL596:
 	stp	x29, x30, [sp, -208]!
@@ -7313,15 +7313,15 @@ ebc_probe:
 	movk	w2, 0x60, lsl 16
 .LBE1635:
 .LBE1634:
-	.loc 1 2977 0
+	.loc 1 2985 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 2978 0
+	.loc 1 2986 0
 	add	x22, x0, 16
-	.loc 1 2977 0
+	.loc 1 2985 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -160
 	.cfi_offset 24, -152
@@ -7337,7 +7337,7 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 2977 0
+	.loc 1 2985 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
@@ -7350,30 +7350,30 @@ ebc_probe:
 .LVL598:
 .LBE1636:
 .LBE1637:
-	.loc 1 2993 0
+	.loc 1 3001 0
 	cbz	x0, .L735
-	.loc 1 2997 0
+	.loc 1 3005 0
 	adrp	x24, .LANCHOR0
 	mov	x20, x0
-	.loc 1 2999 0
+	.loc 1 3007 0
 	adrp	x1, .LC26
 	mov	w2, 0
-	.loc 1 2997 0
+	.loc 1 3005 0
 	str	x0, [x24, #:lo12:.LANCHOR0]
-	.loc 1 2999 0
+	.loc 1 3007 0
 	add	x1, x1, :lo12:.LC26
 	ldr	x0, [x22, 752]
-	.loc 1 2996 0
+	.loc 1 3004 0
 	str	x22, [x20]
-	.loc 1 2999 0
+	.loc 1 3007 0
 	bl	of_parse_phandle
 .LVL599:
-	.loc 1 3000 0
+	.loc 1 3008 0
 	cbz	x0, .L771
-	.loc 1 3005 0
+	.loc 1 3013 0
 	bl	of_find_device_by_node
 .LVL600:
-	.loc 1 3007 0
+	.loc 1 3015 0
 	cbz	x0, .L689
 .LBB1638:
 .LBB1639:
@@ -7384,15 +7384,15 @@ ebc_probe:
 .LBE1640:
 .LBE1639:
 .LBE1638:
-	.loc 1 3010 0
+	.loc 1 3018 0
 	str	x0, [x20, 8]
-	.loc 1 3011 0
+	.loc 1 3019 0
 	cbz	x0, .L689
-	.loc 1 3013 0
+	.loc 1 3021 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 3015 0
+	.loc 1 3023 0
 	add	x2, x29, 96
 	adrp	x1, .LC28
 	add	x1, x1, :lo12:.LC28
@@ -7401,27 +7401,27 @@ ebc_probe:
 .LVL602:
 	mov	x21, x0
 .LVL603:
-	.loc 1 3016 0
+	.loc 1 3024 0
 	ldrsw	x0, [x29, 96]
 .LVL604:
 	lsr	x0, x0, 2
 .LVL605:
 	str	w0, [x29, 96]
 .LVL606:
-	.loc 1 3017 0
+	.loc 1 3025 0
 	cmp	w0, 0
 	beq	.L690
-	.loc 1 3022 0 discriminator 1
+	.loc 1 3030 0 discriminator 1
 	mov	w19, 0
 .LVL607:
 	bgt	.L758
 	b	.L692
 	.p2align 3
 .L693:
-	.loc 1 3030 0
+	.loc 1 3038 0
 	bl	of_find_i2c_device_by_node
 .LVL608:
-	.loc 1 3032 0
+	.loc 1 3040 0
 	cbz	x0, .L772
 .LBB1641:
 .LBB1642:
@@ -7432,11 +7432,11 @@ ebc_probe:
 .LBE1643:
 .LBE1642:
 .LBE1641:
-	.loc 1 3037 0
+	.loc 1 3045 0
 	str	x0, [x20, 16]
-	.loc 1 3038 0
+	.loc 1 3046 0
 	cbnz	x0, .L773
-	.loc 1 3022 0 discriminator 2
+	.loc 1 3030 0 discriminator 2
 	ldr	w0, [x29, 96]
 	add	w19, w19, 1
 .LVL610:
@@ -7444,24 +7444,24 @@ ebc_probe:
 	ble	.L697
 .L758:
 	ldr	w0, [x21], 4
-	.loc 1 3024 0
+	.loc 1 3032 0
 	rev	w0, w0
 	bl	of_find_node_by_phandle
 .LVL611:
-	.loc 1 3025 0
+	.loc 1 3033 0
 	cbnz	x0, .L693
-	.loc 1 3026 0
+	.loc 1 3034 0
 	adrp	x1, .LC30
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC30
-	.loc 1 3027 0
+	.loc 1 3035 0
 	mov	w25, -19
-	.loc 1 3026 0
+	.loc 1 3034 0
 	bl	_dev_err
 .LVL612:
 	.p2align 2
 .L685:
-	.loc 1 3103 0
+	.loc 1 3111 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w25
 .LVL613:
@@ -7499,7 +7499,7 @@ ebc_probe:
 	.p2align 3
 .L773:
 	.cfi_restore_state
-	.loc 1 3039 0
+	.loc 1 3047 0
 	adrp	x1, .LC32
 	mov	w2, w19
 	add	x1, x1, :lo12:.LC32
@@ -7507,16 +7507,16 @@ ebc_probe:
 	bl	_dev_info
 .LVL620:
 .L692:
-	.loc 1 3044 0
+	.loc 1 3052 0
 	ldr	x0, [x20, 16]
 	cbz	x0, .L697
-	.loc 1 3050 0
+	.loc 1 3058 0
 	add	x19, x20, 184
 .LVL621:
-	.loc 1 3052 0
+	.loc 1 3060 0
 	add	x21, x20, 24
 .LVL622:
-	.loc 1 3050 0
+	.loc 1 3058 0
 	str	x22, [x19, 104]
 .LBB1644:
 .LBB1645:
@@ -7531,7 +7531,7 @@ ebc_probe:
 .LBE1646:
 .LBE1645:
 .LBE1644:
-	.loc 1 3052 0
+	.loc 1 3060 0
 	str	x22, [x20, 24]
 .LBB1718:
 .LBB1715:
@@ -7545,7 +7545,7 @@ ebc_probe:
 .LBE1655:
 .LBE1715:
 .LBE1718:
-	.loc 1 3053 0
+	.loc 1 3061 0
 	ldr	x2, [x20, 8]
 .LBB1719:
 .LBB1716:
@@ -7559,7 +7559,7 @@ ebc_probe:
 .LBE1656:
 .LBE1716:
 .LBE1719:
-	.loc 1 3054 0
+	.loc 1 3062 0
 	stp	x2, x0, [x21, 8]
 .LBB1720:
 .LBB1717:
@@ -7832,7 +7832,7 @@ ebc_probe:
 .LBE1702:
 .LBE1701:
 .LBE1700:
-	.loc 1 2321 0
+	.loc 1 2329 0
 	str	wzr, [x21, 148]
 .L725:
 .LBB1703:
@@ -7852,7 +7852,7 @@ ebc_probe:
 .LBE1705:
 .LBE1704:
 .LBE1703:
-	.loc 1 2324 0
+	.loc 1 2332 0
 	str	wzr, [x21, 152]
 .L726:
 .LBB1706:
@@ -7872,7 +7872,7 @@ ebc_probe:
 .LBE1708:
 .LBE1707:
 .LBE1706:
-	.loc 1 2327 0
+	.loc 1 2335 0
 	str	wzr, [x21, 156]
 .L727:
 .LBB1709:
@@ -7892,7 +7892,7 @@ ebc_probe:
 .LBE1711:
 .LBE1710:
 .LBE1709:
-	.loc 1 2330 0
+	.loc 1 2338 0
 	str	wzr, [x21, 92]
 .L728:
 .LBB1712:
@@ -7912,61 +7912,61 @@ ebc_probe:
 .LBE1714:
 .LBE1713:
 .LBE1712:
-	.loc 1 2333 0
+	.loc 1 2341 0
 	str	wzr, [x21, 96]
 .L729:
 .LBE1717:
 .LBE1720:
-	.loc 1 3062 0
+	.loc 1 3070 0
 	ldr	w0, [x21, 88]
 .LBB1721:
 .LBB1722:
-	.loc 1 2785 0
+	.loc 1 2793 0
 	mov	w2, 0
 .LBE1722:
 .LBE1721:
-	.loc 1 3062 0
+	.loc 1 3070 0
 	str	w0, [x19, 68]
-	.loc 1 3063 0
+	.loc 1 3071 0
 	ldr	w1, [x21, 84]
 	str	w1, [x19, 72]
-	.loc 1 3066 0
+	.loc 1 3074 0
 	tst	x1, 15
-	.loc 1 3064 0
+	.loc 1 3072 0
 	mul	w0, w0, w1
-	.loc 1 3066 0
+	.loc 1 3074 0
 	cset	w1, eq
 	str	w1, [x19, 88]
 .LBB1736:
 .LBB1731:
-	.loc 1 2785 0
+	.loc 1 2793 0
 	adrp	x1, .LC39
 	add	x1, x1, :lo12:.LC39
 .LBE1731:
 .LBE1736:
-	.loc 1 3064 0
+	.loc 1 3072 0
 	lsr	w3, w0, 1
-	.loc 1 3065 0
+	.loc 1 3073 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x19, 20]
 .LBB1737:
 .LBB1732:
-	.loc 1 2776 0
+	.loc 1 2784 0
 	ldr	x26, [x20]
 .LVL643:
-	.loc 1 2785 0
+	.loc 1 2793 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL644:
-	.loc 1 2786 0
+	.loc 1 2794 0
 	cbz	x0, .L736
-	.loc 1 2789 0
+	.loc 1 2797 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL645:
 	mov	w25, w0
-	.loc 1 2791 0
+	.loc 1 2799 0
 	cbnz	w0, .L775
 .LBB1723:
 .LBB1724:
@@ -7975,9 +7975,9 @@ ebc_probe:
 	ldp	x1, x2, [x29, 104]
 .LBE1724:
 .LBE1723:
-	.loc 1 2796 0
+	.loc 1 2804 0
 	str	x1, [x20, 184]
-	.loc 1 2799 0
+	.loc 1 2807 0
 	mov	x3, 1
 	mov	x0, x26
 .LBB1726:
@@ -7987,16 +7987,16 @@ ebc_probe:
 	sub	x2, x2, x1
 .LBE1725:
 .LBE1726:
-	.loc 1 2797 0
+	.loc 1 2805 0
 	str	w2, [x19, 16]
-	.loc 1 2799 0
+	.loc 1 2807 0
 	sxtw	x2, w2
 	bl	devm_memremap
 .LVL646:
 	str	x0, [x19, 8]
-	.loc 1 2801 0
-	cbz	x0, .L707
 	.loc 1 2809 0
+	cbz	x0, .L707
+	.loc 1 2817 0
 	mov	x1, x0
 	ldr	w2, [x19, 16]
 	ldr	x0, [x20, 184]
@@ -8004,24 +8004,24 @@ ebc_probe:
 	mov	w3, 4194304
 	bl	ebc_buf_init
 .LVL647:
-	.loc 1 2810 0
+	.loc 1 2818 0
 	cbnz	w0, .L707
-	.loc 1 2815 0
+	.loc 1 2823 0
 	ldr	x1, [x19, 8]
-	.loc 1 2816 0
+	.loc 1 2824 0
 	mov	x6, 1048576
-	.loc 1 2815 0
+	.loc 1 2823 0
 	mov	x3, 20971520
-	.loc 1 2816 0
+	.loc 1 2824 0
 	str	x6, [x21, 40]
-	.loc 1 2815 0
+	.loc 1 2823 0
 	add	x8, x1, x3
 	str	x8, [x21, 24]
 	mov	x7, 22020096
 	add	x5, x1, x7
-	.loc 1 2817 0
+	.loc 1 2825 0
 	ldr	x2, [x20, 184]
-	.loc 1 2822 0
+	.loc 1 2830 0
 	mov	x4, 23068672
 	add	x4, x1, x4
 .LBB1727:
@@ -8030,33 +8030,33 @@ ebc_probe:
 	mov	x0, x26
 .LBE1728:
 .LBE1727:
-	.loc 1 2817 0
+	.loc 1 2825 0
 	add	x3, x2, x3
 	str	x3, [x21, 32]
-	.loc 1 2818 0
+	.loc 1 2826 0
 	str	x8, [x19, 184]
-	.loc 1 2817 0
+	.loc 1 2825 0
 	add	x2, x2, x7
-	.loc 1 2816 0
+	.loc 1 2824 0
 	str	x6, [x21, 64]
-	.loc 1 2817 0
+	.loc 1 2825 0
 	stp	x5, x2, [x21, 48]
-	.loc 1 2823 0
+	.loc 1 2831 0
 	mov	x2, 27262976
 	add	x2, x1, x2
 	stp	x4, x2, [x19, 144]
-	.loc 1 2824 0
+	.loc 1 2832 0
 	mov	x2, 31457280
 	add	x2, x1, x2
-	.loc 1 2818 0
+	.loc 1 2826 0
 	str	x5, [x19, 192]
-	.loc 1 2824 0
+	.loc 1 2832 0
 	str	x2, [x19, 160]
-	.loc 1 2825 0
+	.loc 1 2833 0
 	mov	x2, 35651584
 	add	x1, x1, x2
 	str	x1, [x19, 128]
-	.loc 1 2828 0
+	.loc 1 2836 0
 	ldp	w2, w1, [x21, 84]
 .LBB1730:
 .LBB1729:
@@ -8068,17 +8068,17 @@ ebc_probe:
 .LVL648:
 .LBE1729:
 .LBE1730:
-	.loc 1 2828 0
+	.loc 1 2836 0
 	str	x0, [x19, 168]
-	.loc 1 2829 0
+	.loc 1 2837 0
 	cbz	x0, .L707
-	.loc 1 2831 0
+	.loc 1 2839 0
 	ldp	w2, w1, [x21, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
 .LVL649:
-	.loc 1 2832 0
+	.loc 1 2840 0
 	ldrsw	x2, [x19, 20]
 	mov	w1, 255
 	ldr	x0, [x19, 160]
@@ -8088,86 +8088,86 @@ ebc_probe:
 .LBE1737:
 .LBB1738:
 .LBB1739:
-	.loc 1 2733 0
+	.loc 1 2741 0
 	ldr	x26, [x19, 104]
 .LVL651:
-	.loc 1 2739 0
+	.loc 1 2747 0
 	adrp	x1, .LC41
 	mov	w2, 0
 	add	x1, x1, :lo12:.LC41
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL652:
-	.loc 1 2740 0
+	.loc 1 2748 0
 	cbz	x0, .L737
-	.loc 1 2743 0
+	.loc 1 2751 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL653:
 	mov	w25, w0
-	.loc 1 2745 0
+	.loc 1 2753 0
 	cbz	w0, .L776
 .L708:
 .LBE1739:
 .LBE1738:
-	.loc 1 3078 0
+	.loc 1 3086 0
 	adrp	x1, .LC74
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC74
 	bl	_dev_err
 .LVL654:
-	.loc 1 3079 0
+	.loc 1 3087 0
 	b	.L685
 .LVL655:
 	.p2align 3
 .L699:
-	.loc 1 3060 0
+	.loc 1 3068 0
 	mov	w25, -22
-	.loc 1 3059 0
+	.loc 1 3067 0
 	adrp	x1, .LC80
 	mov	w2, w25
 	add	x1, x1, :lo12:.LC80
 	mov	x0, x22
 	bl	_dev_err
 .LVL656:
-	.loc 1 3060 0
+	.loc 1 3068 0
 	b	.L685
 .LVL657:
 	.p2align 3
 .L772:
-	.loc 1 3033 0
+	.loc 1 3041 0
 	adrp	x1, .LC31
 	mov	x0, x22
 .LVL658:
 	add	x1, x1, :lo12:.LC31
-	.loc 1 3034 0
+	.loc 1 3042 0
 	mov	w25, -19
-	.loc 1 3033 0
+	.loc 1 3041 0
 	bl	_dev_err
 .LVL659:
-	.loc 1 3034 0
+	.loc 1 3042 0
 	b	.L685
 .LVL660:
 	.p2align 3
 .L697:
-	.loc 1 3045 0
+	.loc 1 3053 0
 	adrp	x1, .LC33
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC33
-	.loc 1 3046 0
+	.loc 1 3054 0
 	mov	w25, -517
-	.loc 1 3045 0
+	.loc 1 3053 0
 	bl	_dev_err
 .LVL661:
-	.loc 1 3046 0
+	.loc 1 3054 0
 	b	.L685
 .LVL662:
 	.p2align 3
 .L775:
 .LBB1747:
 .LBB1733:
-	.loc 1 2792 0
+	.loc 1 2800 0
 	adrp	x1, .LC40
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC40
@@ -8176,19 +8176,19 @@ ebc_probe:
 .L704:
 .LBE1733:
 .LBE1747:
-	.loc 1 3071 0
+	.loc 1 3079 0
 	adrp	x1, .LC73
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC73
 	bl	_dev_err
 .LVL664:
-	.loc 1 3072 0
+	.loc 1 3080 0
 	b	.L685
 .LVL665:
 .L776:
 .LBB1748:
 .LBB1744:
-	.loc 1 2754 0
+	.loc 1 2762 0
 	mov	x0, x26
 	mov	x3, 1
 .LBB1740:
@@ -8198,7 +8198,7 @@ ebc_probe:
 .LVL666:
 .LBE1741:
 .LBE1740:
-	.loc 1 2751 0
+	.loc 1 2759 0
 	str	x1, [x19, 32]
 .LBB1743:
 .LBB1742:
@@ -8207,30 +8207,30 @@ ebc_probe:
 	sub	x26, x26, x1
 .LBE1742:
 .LBE1743:
-	.loc 1 2752 0
+	.loc 1 2760 0
 	str	w26, [x19, 40]
-	.loc 1 2754 0
+	.loc 1 2762 0
 	sxtw	x2, w26
 	bl	devm_memremap
 .LVL667:
 	str	x0, [x19, 208]
-	.loc 1 2756 0
+	.loc 1 2764 0
 	cbz	x0, .L777
-	.loc 1 2761 0
+	.loc 1 2769 0
 	bl	epd_lut_from_mem_init
 .LVL668:
-	.loc 1 2762 0
+	.loc 1 2770 0
 	tbnz	w0, #31, .L778
 .L710:
 .LBE1744:
 .LBE1748:
 .LBB1749:
 .LBB1750:
-	.loc 1 2841 0
+	.loc 1 2849 0
 	add	x0, x20, 752
 	mov	x1, 68719476704
 	str	x1, [x19, 560]
-	.loc 1 2845 0
+	.loc 1 2853 0
 	add	x24, x24, :lo12:.LANCHOR0
 .LBB1751:
 .LBB1752:
@@ -8245,7 +8245,7 @@ ebc_probe:
 .LBE1753:
 .LBE1752:
 .LBE1751:
-	.loc 1 2842 0
+	.loc 1 2850 0
 	adrp	x5, .LC75
 .LBB1757:
 .LBB1756:
@@ -8254,29 +8254,29 @@ ebc_probe:
 	str	x0, [x0, 8]
 .LBE1756:
 .LBE1757:
-	.loc 1 2841 0
+	.loc 1 2849 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x19, 584]
-	.loc 1 2842 0
+	.loc 1 2850 0
 	add	x5, x5, :lo12:.LC75
 	mov	w1, 14
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 1
 	movk	w1, 0xa, lsl 16
-	.loc 1 2839 0
+	.loc 1 2847 0
 	mov	w26, 99
-	.loc 1 2842 0
+	.loc 1 2850 0
 	adrp	x0, .LC76
-	.loc 1 2839 0
+	.loc 1 2847 0
 	str	w26, [x29, 104]
-	.loc 1 2842 0
+	.loc 1 2850 0
 	add	x0, x0, :lo12:.LC76
 	bl	__alloc_workqueue_key
 .LVL669:
 	str	x0, [x19, 608]
-	.loc 1 2845 0
+	.loc 1 2853 0
 	adrp	x3, .LC77
 	mov	w2, -1
 	add	x3, x3, :lo12:.LC77
@@ -8286,15 +8286,15 @@ ebc_probe:
 	bl	kthread_create_on_node
 .LVL670:
 	str	x0, [x24, 8]
-	.loc 1 2846 0
+	.loc 1 2854 0
 	cmn	x0, #4096
 	bhi	.L779
-	.loc 1 2850 0
+	.loc 1 2858 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
 .LVL671:
-	.loc 1 2851 0
+	.loc 1 2859 0
 	ldr	x2, [x24, 8]
 .LBB1758:
 .LBB1759:
@@ -8336,7 +8336,7 @@ ebc_probe:
 .LBE1759:
 .LBE1758:
 .LBB1760:
-	.loc 1 2854 0
+	.loc 1 2862 0
 	adrp	x3, .LC46
 	adrp	x0, ebc_thread
 .LVL675:
@@ -8345,10 +8345,10 @@ ebc_probe:
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x19
 .LBE1760:
-	.loc 1 2853 0
+	.loc 1 2861 0
 	str	w26, [x29, 104]
 .LBB1761:
-	.loc 1 2854 0
+	.loc 1 2862 0
 	bl	kthread_create_on_node
 .LVL676:
 	mov	x24, x0
@@ -8359,13 +8359,13 @@ ebc_probe:
 .LVL678:
 .LBE1761:
 	str	x24, [x19, 136]
-	.loc 1 2859 0
+	.loc 1 2867 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x24
 	bl	sched_setscheduler_nocheck
 .LVL679:
-	.loc 1 2860 0
+	.loc 1 2868 0
 	ldr	x2, [x19, 136]
 .LBB1762:
 .LBB1763:
@@ -8409,7 +8409,7 @@ ebc_probe:
 .LBE1749:
 .LBB1766:
 .LBB1767:
-	.loc 1 2869 0
+	.loc 1 2877 0
 	mov	w0, -1
 .LVL683:
 	str	w0, [x19, 64]
@@ -8420,9 +8420,9 @@ ebc_probe:
 .LVL684:
 .LBE1769:
 .LBE1768:
-	.loc 1 2873 0
+	.loc 1 2881 0
 	str	wzr, [x19, 44]
-	.loc 1 2872 0
+	.loc 1 2880 0
 	str	wzr, [x19, 96]
 .LBB1774:
 .LBB1770:
@@ -8430,7 +8430,7 @@ ebc_probe:
 	adrp	x1, .LC47
 .LBE1770:
 .LBE1774:
-	.loc 1 2868 0
+	.loc 1 2876 0
 	str	wzr, [x19, 200]
 .LBB1775:
 .LBB1771:
@@ -8438,14 +8438,14 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC47
 .LBE1771:
 .LBE1775:
-	.loc 1 2870 0
+	.loc 1 2878 0
 	str	wzr, [x19, 616]
-	.loc 1 2880 0
+	.loc 1 2888 0
 	add	x24, x20, 632
 .LVL685:
-	.loc 1 2871 0
+	.loc 1 2879 0
 	str	wzr, [x19, 620]
-	.loc 1 2881 0
+	.loc 1 2889 0
 	adrp	x26, jiffies
 .LBB1776:
 .LBB1772:
@@ -8453,7 +8453,7 @@ ebc_probe:
 	stp	xzr, xzr, [x0]
 .LBE1772:
 .LBE1776:
-	.loc 1 2881 0
+	.loc 1 2889 0
 	mov	x27, 268435455
 .LBB1777:
 .LBB1773:
@@ -8477,9 +8477,9 @@ ebc_probe:
 .LVL686:
 .LBE1773:
 .LBE1777:
-	.loc 1 2877 0
+	.loc 1 2885 0
 	str	wzr, [x19, 440]
-	.loc 1 2880 0
+	.loc 1 2888 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -8488,16 +8488,16 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
 .LVL687:
-	.loc 1 2881 0
+	.loc 1 2889 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
-	.loc 1 2884 0
+	.loc 1 2892 0
 	add	x24, x20, 688
-	.loc 1 2881 0
+	.loc 1 2889 0
 	add	x1, x1, x27
 	bl	mod_timer
 .LVL688:
-	.loc 1 2884 0
+	.loc 1 2892 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -8506,7 +8506,7 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
 .LVL689:
-	.loc 1 2885 0
+	.loc 1 2893 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
 	add	x1, x1, x27
@@ -8516,99 +8516,99 @@ ebc_probe:
 .LBE1766:
 .LBB1778:
 .LBB1779:
-	.loc 1 2895 0
+	.loc 1 2903 0
 	adrp	x0, saved_command_line
 	adrp	x1, .LC48
-	.loc 1 2892 0
+	.loc 1 2900 0
 	stp	wzr, wzr, [x29, 100]
 .LVL691:
-	.loc 1 2895 0
+	.loc 1 2903 0
 	add	x1, x1, :lo12:.LC48
 	ldr	x24, [x0, #:lo12:saved_command_line]
 	mov	x0, x24
 	bl	strstr
 .LVL692:
-	.loc 1 2896 0
+	.loc 1 2904 0
 	adrp	x1, .LC49
-	.loc 1 2895 0
+	.loc 1 2903 0
 	mov	x26, x0
 .LVL693:
-	.loc 1 2896 0
+	.loc 1 2904 0
 	add	x1, x1, :lo12:.LC49
 	mov	x0, x24
 	bl	strstr
 .LVL694:
 	mov	x28, x0
 .LVL695:
-	.loc 1 2901 0
+	.loc 1 2909 0
 	cbz	x26, .L713
-	.loc 1 2902 0
+	.loc 1 2910 0
 	add	x2, x29, 100
 	adrp	x1, .LC50
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC50
 	bl	sscanf
 .LVL696:
-	.loc 1 2903 0
+	.loc 1 2911 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
 	bls	.L780
 .L713:
-	.loc 1 2915 0
+	.loc 1 2923 0
 	mov	w24, 0
 .LVL697:
 	mov	x27, 0
 .LVL698:
-	.loc 1 2899 0
+	.loc 1 2907 0
 	mov	x26, 0
 .LVL699:
-	.loc 1 2915 0
+	.loc 1 2923 0
 	cbz	x28, .L733
 .LVL700:
 .L732:
-	.loc 1 2916 0
+	.loc 1 2924 0
 	add	x2, x29, 104
 	mov	x0, x28
 	adrp	x1, .LC53
 	add	x1, x1, :lo12:.LC53
 	bl	sscanf
 .LVL701:
-	.loc 1 2894 0
+	.loc 1 2902 0
 	mov	w28, 0
 .LVL702:
-	.loc 1 2917 0
+	.loc 1 2925 0
 	ldr	w2, [x29, 104]
-	.loc 1 2899 0
+	.loc 1 2907 0
 	mov	x26, 0
 .LVL703:
-	.loc 1 2917 0
+	.loc 1 2925 0
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
 	bls	.L781
 .L717:
-	.loc 1 2929 0
+	.loc 1 2937 0
 	cbnz	w24, .L716
 .LVL704:
 .L733:
-	.loc 1 2930 0
+	.loc 1 2938 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC56
 	add	x1, x1, :lo12:.LC56
 	bl	_dev_info
 .LVL705:
-	.loc 1 2931 0
+	.loc 1 2939 0
 	ldr	x0, [x20, 16]
 	bl	ebc_pmic_verity_vcom
 .LVL706:
 .LBB1780:
 .LBB1781:
-	.loc 1 2240 0
+	.loc 1 2248 0
 	bl	ebc_empty_buf_get
 .LVL707:
 	mov	x24, x0
 .LVL708:
-	.loc 1 2241 0
+	.loc 1 2249 0
 	ldp	w2, w0, [x20, 108]
 	mov	w1, 255
 	mul	w2, w2, w0
@@ -8616,46 +8616,46 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memset
 .LVL709:
-	.loc 1 2244 0
+	.loc 1 2252 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2242 0
+	.loc 1 2250 0
 	mov	w0, 17
 	str	w0, [x24, 40]
-	.loc 1 2247 0
+	.loc 1 2255 0
 	mov	w2, 16
-	.loc 1 2248 0
+	.loc 1 2256 0
 	mov	x0, x24
-	.loc 1 2245 0
+	.loc 1 2253 0
 	ldr	w1, [x20, 108]
 	str	w1, [x24, 56]
-	.loc 1 2246 0
+	.loc 1 2254 0
 	ldr	w1, [x20, 112]
-	.loc 1 2247 0
+	.loc 1 2255 0
 	stp	w1, w2, [x24, 60]
-	.loc 1 2248 0
+	.loc 1 2256 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL710:
 .L719:
 .LBE1781:
 .LBE1780:
-	.loc 1 2949 0
+	.loc 1 2957 0
 	cbnz	w28, .L782
 .L721:
-	.loc 1 2963 0
+	.loc 1 2971 0
 	ldr	w0, [x19, 96]
 	adrp	x21, .LANCHOR1
 	cbz	w0, .L783
 .L723:
-	.loc 1 2968 0
+	.loc 1 2976 0
 	cbz	x27, .L724
-	.loc 1 2969 0
+	.loc 1 2977 0
 	mov	x0, x27
 	bl	kfree
 .LVL711:
 .L724:
-	.loc 1 2970 0
+	.loc 1 2978 0
 	cbz	x26, .L715
-	.loc 1 2971 0
+	.loc 1 2979 0
 	mov	x0, x26
 	bl	kfree
 .LVL712:
@@ -8672,53 +8672,53 @@ ebc_probe:
 .LBE1791:
 .LBB1794:
 .LBB1795:
-	.loc 1 2716 0
+	.loc 1 2724 0
 	add	x21, x21, :lo12:.LANCHOR1
 	add	x0, x21, 224
 	bl	misc_register
 .LVL713:
-	.loc 1 2717 0
+	.loc 1 2725 0
 	add	x0, x21, 376
 	bl	misc_register
 .LVL714:
-	.loc 1 2719 0
+	.loc 1 2727 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 456
 	bl	device_create_file
 .LVL715:
-	.loc 1 2720 0
+	.loc 1 2728 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 488
 	bl	device_create_file
 .LVL716:
-	.loc 1 2721 0
+	.loc 1 2729 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 520
 	bl	device_create_file
 .LVL717:
-	.loc 1 2722 0
+	.loc 1 2730 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 552
 	bl	device_create_file
 .LVL718:
-	.loc 1 2723 0
+	.loc 1 2731 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 584
 	bl	device_create_file
 .LVL719:
-	.loc 1 2724 0
+	.loc 1 2732 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 616
 	bl	device_create_file
 .LVL720:
-	.loc 1 2725 0
+	.loc 1 2733 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 648
 	bl	device_create_file
 .LVL721:
 .LBE1795:
 .LBE1794:
-	.loc 1 3100 0
+	.loc 1 3108 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LC16
 	adrp	x1, .LC57
@@ -8726,16 +8726,16 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC57
 	bl	_dev_info
 .LVL722:
-	.loc 1 3102 0
+	.loc 1 3110 0
 	b	.L685
 .LVL723:
 .L783:
 .LBB1796:
 .LBB1788:
-	.loc 1 2964 0
+	.loc 1 2972 0
 	mov	w2, 1
 	str	w2, [x19, 96]
-	.loc 1 2965 0
+	.loc 1 2973 0
 	add	x0, x21, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
@@ -8744,13 +8744,13 @@ ebc_probe:
 	b	.L723
 .LVL725:
 .L780:
-	.loc 1 2905 0
+	.loc 1 2913 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC51
 	add	x1, x1, :lo12:.LC51
 	bl	_dev_info
 .LVL726:
-	.loc 1 2906 0
+	.loc 1 2914 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
 .LBB1782:
@@ -8768,9 +8768,9 @@ ebc_probe:
 .LBE1784:
 .LBE1783:
 .LBE1782:
-	.loc 1 2907 0
+	.loc 1 2915 0
 	cbz	x0, .L784
-	.loc 1 2911 0
+	.loc 1 2919 0
 	ldp	w2, w1, [x21, 84]
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
@@ -8783,23 +8783,23 @@ ebc_probe:
 	add	x1, x3, x1
 	bl	memcpy
 .LVL731:
-	.loc 1 2915 0
+	.loc 1 2923 0
 	cbnz	x28, .L785
-	.loc 1 2894 0
+	.loc 1 2902 0
 	mov	w28, 0
 .LVL732:
-	.loc 1 2899 0
+	.loc 1 2907 0
 	mov	x26, 0
 .LVL733:
 .L716:
-	.loc 1 2936 0
+	.loc 1 2944 0
 	bl	ebc_empty_buf_get
 .LVL734:
 	mov	x24, x0
 .LVL735:
-	.loc 1 2937 0
+	.loc 1 2945 0
 	cbz	x0, .L719
-	.loc 1 2938 0
+	.loc 1 2946 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
@@ -8807,35 +8807,35 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL736:
-	.loc 1 2941 0
+	.loc 1 2949 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2939 0
+	.loc 1 2947 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2944 0
+	.loc 1 2952 0
 	mov	w2, 16
-	.loc 1 2945 0
+	.loc 1 2953 0
 	mov	x0, x24
-	.loc 1 2942 0
+	.loc 1 2950 0
 	ldr	w1, [x21, 84]
 	str	w1, [x24, 56]
-	.loc 1 2943 0
+	.loc 1 2951 0
 	ldr	w1, [x21, 88]
-	.loc 1 2944 0
+	.loc 1 2952 0
 	stp	w1, w2, [x24, 60]
-	.loc 1 2945 0
+	.loc 1 2953 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL737:
 	b	.L719
 .LVL738:
 .L781:
-	.loc 1 2919 0
+	.loc 1 2927 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC54
 	add	x1, x1, :lo12:.LC54
 	bl	_dev_info
 .LVL739:
-	.loc 1 2920 0
+	.loc 1 2928 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
 .LBB1785:
@@ -8851,13 +8851,13 @@ ebc_probe:
 .LBE1787:
 .LBE1786:
 .LBE1785:
-	.loc 1 2921 0
+	.loc 1 2929 0
 	cbz	x0, .L786
-	.loc 1 2925 0
+	.loc 1 2933 0
 	ldp	w2, w1, [x21, 84]
-	.loc 1 2918 0
+	.loc 1 2926 0
 	mov	w28, 1
-	.loc 1 2925 0
+	.loc 1 2933 0
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
@@ -8874,21 +8874,21 @@ ebc_probe:
 .L689:
 .LBE1788:
 .LBE1796:
-	.loc 1 3008 0
+	.loc 1 3016 0
 	mov	w25, -517
 	b	.L685
 .LVL745:
 .L782:
 .LBB1797:
 .LBB1789:
-	.loc 1 2950 0
+	.loc 1 2958 0
 	bl	ebc_empty_buf_get
 .LVL746:
 	mov	x24, x0
 .LVL747:
-	.loc 1 2951 0
+	.loc 1 2959 0
 	cbz	x0, .L721
-	.loc 1 2952 0
+	.loc 1 2960 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
@@ -8896,21 +8896,21 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL748:
-	.loc 1 2955 0
+	.loc 1 2963 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2953 0
+	.loc 1 2961 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2958 0
+	.loc 1 2966 0
 	mov	w1, 16
-	.loc 1 2956 0
+	.loc 1 2964 0
 	ldr	w0, [x21, 84]
 	str	w0, [x24, 56]
-	.loc 1 2957 0
+	.loc 1 2965 0
 	ldr	w0, [x21, 88]
-	.loc 1 2958 0
+	.loc 1 2966 0
 	stp	w0, w1, [x24, 60]
-	.loc 1 2959 0
+	.loc 1 2967 0
 	mov	x0, x24
 	bl	ebc_add_to_dsp_buf_list
 .LVL749:
@@ -8919,46 +8919,46 @@ ebc_probe:
 .L735:
 .LBE1789:
 .LBE1797:
-	.loc 1 2994 0
+	.loc 1 3002 0
 	mov	w25, -12
 	b	.L685
 .LVL751:
 .L690:
-	.loc 1 3018 0
+	.loc 1 3026 0
 	adrp	x1, .LC29
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC29
-	.loc 1 3019 0
+	.loc 1 3027 0
 	mov	w25, -22
-	.loc 1 3018 0
+	.loc 1 3026 0
 	bl	_dev_err
 .LVL752:
-	.loc 1 3019 0
+	.loc 1 3027 0
 	b	.L685
 .LVL753:
 .L778:
 .LBB1798:
 .LBB1745:
-	.loc 1 2763 0
+	.loc 1 2771 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC43
 	add	x1, x1, :lo12:.LC43
 	bl	_dev_err
 .LVL754:
-	.loc 1 2764 0
+	.loc 1 2772 0
 	ldr	x0, [x19, 104]
 	mov	w2, w26
 	ldr	x1, [x19, 208]
 	bl	epd_lut_from_file_init
 .LVL755:
-	.loc 1 2765 0
+	.loc 1 2773 0
 	tbz	w0, #31, .L710
-	.loc 1 2766 0
+	.loc 1 2774 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC44
-	.loc 1 2767 0
+	.loc 1 2775 0
 	mov	w25, -1
-	.loc 1 2766 0
+	.loc 1 2774 0
 	add	x1, x1, :lo12:.LC44
 	bl	_dev_err
 .LVL756:
@@ -8970,7 +8970,7 @@ ebc_probe:
 .LBE1798:
 .LBB1799:
 .LBB1734:
-	.loc 1 2802 0
+	.loc 1 2810 0
 	mov	w25, -12
 	b	.L704
 .LVL758:
@@ -8979,7 +8979,7 @@ ebc_probe:
 .LBE1799:
 .LBB1800:
 .LBB1764:
-	.loc 1 2847 0
+	.loc 1 2855 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC45
 	add	x1, x1, :lo12:.LC45
@@ -8988,28 +8988,28 @@ ebc_probe:
 .L711:
 .LBE1764:
 .LBE1800:
-	.loc 1 3085 0
+	.loc 1 3093 0
 	adrp	x1, .LC79
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC79
-	.loc 1 3086 0
+	.loc 1 3094 0
 	mov	w25, -1
-	.loc 1 3085 0
+	.loc 1 3093 0
 	bl	_dev_err
 .LVL760:
-	.loc 1 3086 0
+	.loc 1 3094 0
 	b	.L685
 .LVL761:
 .L712:
 .LBB1801:
 .LBB1765:
-	.loc 1 2856 0
+	.loc 1 2864 0
 	ldr	x0, [x19, 104]
 .LVL762:
 	adrp	x1, .LC78
-	.loc 1 2854 0
+	.loc 1 2862 0
 	str	x24, [x19, 136]
-	.loc 1 2856 0
+	.loc 1 2864 0
 	add	x1, x1, :lo12:.LC78
 	bl	_dev_err
 .LVL763:
@@ -9018,22 +9018,22 @@ ebc_probe:
 .L771:
 .LBE1765:
 .LBE1801:
-	.loc 1 3001 0
+	.loc 1 3009 0
 	adrp	x1, .LC27
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC27
-	.loc 1 3002 0
+	.loc 1 3010 0
 	mov	w25, -19
-	.loc 1 3001 0
+	.loc 1 3009 0
 	bl	_dev_err
 .LVL765:
-	.loc 1 3002 0
+	.loc 1 3010 0
 	b	.L685
 .LVL766:
 .L736:
 .LBB1802:
 .LBB1735:
-	.loc 1 2787 0
+	.loc 1 2795 0
 	mov	w25, -19
 	b	.L704
 .LVL767:
@@ -9042,22 +9042,22 @@ ebc_probe:
 .LBE1802:
 .LBB1803:
 .LBB1746:
-	.loc 1 2741 0
+	.loc 1 2749 0
 	mov	w25, -19
 	b	.L708
 .LVL768:
 .L777:
-	.loc 1 2757 0
+	.loc 1 2765 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
 	adrp	x1, .LC42
-	mov	w3, 2757
+	mov	w3, 2765
 	add	x2, x2, 32
 	add	x1, x1, :lo12:.LC42
-	.loc 1 2758 0
+	.loc 1 2766 0
 	mov	w25, -12
-	.loc 1 2757 0
+	.loc 1 2765 0
 	bl	_dev_err
 .LVL769:
 	b	.L708
@@ -9067,13 +9067,13 @@ ebc_probe:
 .LBE1803:
 .LBB1804:
 .LBB1790:
-	.loc 1 2904 0
+	.loc 1 2912 0
 	mov	w24, 1
 .LVL771:
 	b	.L732
 .LVL772:
 .L784:
-	.loc 1 2908 0
+	.loc 1 2916 0
 	ldr	x0, [x19, 104]
 .LVL773:
 	adrp	x1, .LC52
@@ -9084,7 +9084,7 @@ ebc_probe:
 	b	.L715
 .LVL775:
 .L786:
-	.loc 1 2922 0
+	.loc 1 2930 0
 	ldr	x0, [x19, 104]
 .LVL776:
 	adrp	x1, .LC55
@@ -9097,7 +9097,7 @@ ebc_probe:
 .L774:
 .LBE1790:
 .LBE1804:
-	.loc 1 3103 0
+	.loc 1 3111 0
 	bl	__stack_chk_fail
 .LVL779:
 	.cfi_endproc
@@ -10160,7 +10160,7 @@ ebc_thread:
 .LBB1852:
 .LBB1853:
 .LBB1854:
-	.loc 1 2228 0
+	.loc 1 2232 0
 	add	x23, x23, :lo12:.LANCHOR1
 .LBE1854:
 .LBE1853:
@@ -10172,7 +10172,7 @@ ebc_thread:
 .LBB1859:
 .LBB1857:
 .LBB1855:
-	.loc 1 2228 0
+	.loc 1 2232 0
 	add	x19, x23, 304
 .LBE1855:
 .LBE1857:
@@ -10186,12 +10186,11 @@ ebc_thread:
 .L895:
 	.loc 1 1905 0
 	ldr	w0, [x28, 624]
-.LVL878:
-	cbnz	w0, .L1063
+	cbnz	w0, .L1068
 .L896:
 	.loc 1 1911 0
 	bl	ebc_dsp_buf_get
-.LVL879:
+.LVL878:
 	mov	x26, x0
 	.loc 1 1913 0
 	cbz	x0, .L898
@@ -10210,83 +10209,83 @@ ebc_thread:
 	.loc 1 1916 0
 	str	wzr, [x0, 16]
 .L900:
-	.loc 1 1975 0
+	.loc 1 1979 0
 	adrp	x21, jiffies
-.LVL880:
+.LVL879:
 	mov	x1, 402653184
 	add	x0, x20, 632
 	ldr	x2, [x21, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL881:
-	.loc 1 1977 0
+.LVL880:
+	.loc 1 1981 0
 	ldr	w0, [x28, 444]
 	cbz	w0, .L914
-.L1072:
+.L1076:
 	ldr	x0, [x28, 216]
 .L915:
-	.loc 1 1980 0
+	.loc 1 1984 0
 	ldr	w2, [x0, 40]
 	ldr	w3, [x26, 40]
 	cmp	w3, w2
 	beq	.L916
-	.loc 1 1981 0
+	.loc 1 1985 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC85
 	add	x1, x1, :lo12:.LC85
 	bl	_dev_info
-.LVL882:
-	.loc 1 1983 0
+.LVL881:
+	.loc 1 1987 0
 	ldr	w0, [x28, 44]
 	cmp	w0, 1
-	beq	.L1064
-.L1056:
+	beq	.L1069
+.L1061:
 	ldr	w2, [x26, 40]
 .L916:
-	.loc 1 1990 0
+	.loc 1 1994 0
 	cmp	w2, 23
-	bls	.L1065
-	.loc 1 2176 0
+	bls	.L1070
+	.loc 1 2180 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC93
 	add	x1, x1, :lo12:.LC93
 	bl	_dev_err
-.LVL883:
-.L1054:
-	.loc 1 2177 0
+.LVL882:
+.L1060:
+	.loc 1 2181 0
 	mov	x0, x26
-.L1055:
+.L1059:
 	bl	ebc_remove_from_dsp_buf_list
-.LVL884:
-	.loc 1 2178 0
+.LVL883:
+	.loc 1 2182 0
 	mov	x0, x26
 	bl	ebc_buf_release
-.LVL885:
+.LVL884:
 	.loc 1 1905 0
 	ldr	w0, [x28, 624]
 	cbz	w0, .L896
-.LVL886:
+.LVL885:
 	.p2align 2
-.L1063:
+.L1068:
 	.loc 1 1906 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	beq	.L1066
+	beq	.L1071
 .L897:
-	.loc 1 2234 0
+	.loc 1 2242 0
 	add	x24, x24, :lo12:__stack_chk_guard
 	mov	w0, 0
 	ldr	x2, [x29, 232]
 	ldr	x1, [x24]
 	eor	x1, x2, x1
-	cbnz	x1, .L1067
+	cbnz	x1, .L1072
 	ldp	x19, x20, [sp, 16]
-.LVL887:
+.LVL886:
 	ldp	x21, x22, [sp, 32]
-.LVL888:
+.LVL887:
 	ldp	x23, x24, [sp, 48]
 	ldp	x25, x26, [sp, 64]
-.LVL889:
+.LVL888:
 	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 240
 	.cfi_remember_state
@@ -10304,82 +10303,51 @@ ebc_thread:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL890:
+.LVL889:
 	.p2align 3
 .L898:
 	.cfi_restore_state
-	.loc 1 2215 0
+	.loc 1 2219 0
 	ldr	w0, [x28, 44]
-.LVL891:
+.LVL890:
 	cmp	w0, 1
-	beq	.L1068
-	.loc 1 2224 0
+	beq	.L1073
+	.loc 1 2228 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	beq	.L1069
-.LVL892:
-.L1058:
+	beq	.L1074
+.LVL891:
+.L1063:
 	ldr	w0, [x28, 96]
-.LVL893:
-	.loc 1 2227 0
-	cbz	w0, .L1070
+.LVL892:
+	.loc 1 2231 0
+	cbz	w0, .L1075
 .L1003:
-.LVL894:
+.LVL893:
 .L993:
-	.loc 1 2229 0
+	.loc 1 2236 0
+	ldr	w0, [x28, 200]
+.LVL894:
+	.loc 1 2233 0
 	str	wzr, [x28, 96]
-	b	.L895
+	.loc 1 2236 0
+	cbnz	w0, .L895
+	.loc 1 2237 0
+	mov	x0, x20
+	bl	ebc_power_set.constprop.17
 .LVL895:
-	.p2align 3
-.L1070:
-.LBB1860:
-.LBB1858:
-	.loc 1 2228 0 discriminator 1
-	mov	w1, 0
-	add	x0, x29, 120
-	bl	init_wait_entry
-.LVL896:
-	b	.L1004
-	.p2align 3
-.L1071:
-.LVL897:
-.LBB1856:
-	.loc 1 2228 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L993
-	.loc 1 2228 0 discriminator 7
-	bl	schedule
-.LVL898:
-.L1004:
-	.loc 1 2228 0 discriminator 9
-	add	x1, x29, 120
-	mov	w2, 1
-	mov	x0, x19
-	bl	prepare_to_wait_event
-.LVL899:
-	ldr	w1, [x28, 96]
-	cbz	w1, .L1071
-.LBE1856:
-	.loc 1 2228 0 discriminator 4
-	add	x1, x29, 120
-	mov	x0, x19
-	bl	finish_wait
-.LVL900:
-.LBE1858:
-.LBE1860:
-	.loc 1 2229 0 is_stmt 1 discriminator 4
-	str	wzr, [x28, 96]
 	b	.L895
-.LVL901:
+.LVL896:
 	.p2align 3
 .L899:
 	.loc 1 1918 0
 	add	x21, x22, :lo12:.LANCHOR0
-.LVL902:
+.LVL897:
 	ldr	w2, [x21, 16]
 	cbz	w2, .L901
 	.loc 1 1919 0
 	ldr	w0, [x21, 20]
-.LVL903:
+.LVL898:
 	cmp	w0, 5
 	add	w0, w0, 1
 	str	w0, [x21, 20]
@@ -10392,27 +10360,27 @@ ebc_thread:
 	ldr	w1, [x26, 64]
 	ldr	x0, [x26, 16]
 	bl	check_black_percent.isra.15
-.LVL904:
-	cbnz	w0, .L1054
-	.loc 1 1975 0
+.LVL899:
+	cbnz	w0, .L1060
+	.loc 1 1979 0
 	adrp	x21, jiffies
 	mov	x1, 402653184
 	add	x0, x20, 632
 	ldr	x2, [x21, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL905:
-	.loc 1 1977 0
+.LVL900:
+	.loc 1 1981 0
 	ldr	w0, [x28, 444]
-	cbnz	w0, .L1072
+	cbnz	w0, .L1076
 .L914:
-	.loc 1 1978 0
+	.loc 1 1982 0
 	mov	x0, x26
 	str	x26, [x28, 216]
 	b	.L915
 	.p2align 3
-.L1065:
-	.loc 1 1990 0
+.L1070:
+	.loc 1 1994 0
 	adrp	x0, .L924
 	add	x0, x0, :lo12:.L924
 	ldrh	w0, [x0,w2,uxtw #1]
@@ -10450,158 +10418,158 @@ ebc_thread:
 	.2byte	(.L923 - .Lrtx924) / 4
 	.text
 .L1009:
-	.loc 1 2102 0
+	.loc 1 2106 0
 	mov	w4, 1
-.LVL906:
+.LVL901:
 .L926:
-	.loc 1 2109 0
+	.loc 1 2113 0
 	ldr	x25, [x28, 216]
-.LVL907:
-	.loc 1 2111 0
+.LVL902:
+	.loc 1 2115 0
 	ldr	w0, [x25, 40]
 	sub	w1, w0, #22
-	.loc 1 2113 0
+	.loc 1 2117 0
 	cmp	w1, 1
 	ccmp	w0, 1, 0, hi
 	bhi	.L974
-	.loc 1 2116 0
+	.loc 1 2120 0
 	add	x0, x29, 160
 	str	x0, [x28, 216]
-	.loc 1 2117 0
+	.loc 1 2121 0
 	ldr	x0, [x28, 152]
 	str	x0, [x29, 176]
-	.loc 1 2118 0
+	.loc 1 2122 0
 	mov	w0, 16
 	str	w0, [x29, 224]
 .L974:
-	.loc 1 2120 0
+	.loc 1 2124 0
 	str	wzr, [x28, 92]
-	.loc 1 2121 0
+	.loc 1 2125 0
 	str	x26, [x28, 224]
-	.loc 1 2124 0
+	.loc 1 2128 0
 	ldr	w0, [x26, 40]
 	sub	w0, w0, #2
-	.loc 1 2123 0
+	.loc 1 2127 0
 	cmp	w0, 14
 	bhi	.L975
-	.loc 1 2125 0
+	.loc 1 2129 0
 	ldr	x1, [x28, 216]
 	ldr	w0, [x26, 64]
+.LBB1860:
 .LBB1861:
-.LBB1862:
 	.loc 1 1858 0
 	ldr	w2, [x1, 64]
 	cmp	w0, w2
-	beq	.L1073
+	beq	.L1077
 .L975:
-.LBE1862:
 .LBE1861:
-	.loc 1 2134 0
-	cbnz	w4, .L1013
+.LBE1860:
 	.loc 1 2138 0
+	cbnz	w4, .L1013
+	.loc 1 2142 0
 	ldr	w0, [x28, 64]
 	cmp	w0, 0
 	ble	.L981
-	.loc 1 2139 0
+	.loc 1 2143 0
 	ldr	w1, [x29, 108]
-.LVL908:
+.LVL903:
 	add	w1, w1, 1
 	str	w1, [x29, 108]
-	.loc 1 2140 0
+	.loc 1 2144 0
 	cmp	w0, w1
 	bgt	.L981
-	.loc 1 2141 0
+	.loc 1 2145 0
 	mov	w0, 2
-	.loc 1 2142 0
+	.loc 1 2146 0
 	str	wzr, [x29, 108]
-	.loc 1 2141 0
+	.loc 1 2145 0
 	str	w0, [x26, 40]
 .L981:
-	.loc 1 2146 0
+	.loc 1 2150 0
 	ldr	w0, [x28, 200]
-	cbz	w0, .L1074
+	cbz	w0, .L1078
 .L982:
-	.loc 1 2149 0
+	.loc 1 2153 0
 	ldr	x1, [x28, 224]
-.LVL909:
+.LVL904:
 	mov	x0, x20
 	ldr	w1, [x1, 64]
 	bl	ebc_lut_update
-.LVL910:
+.LVL905:
 	cbz	w0, .L983
-	.loc 1 2150 0
+	.loc 1 2154 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC90
 	add	x1, x1, :lo12:.LC90
 	bl	_dev_err
-.LVL911:
-	.loc 1 2152 0
+.LVL906:
+	.loc 1 2156 0
 	str	x25, [x28, 216]
-.LVL912:
+.LVL907:
 .L939:
-	.loc 1 2187 0
+	.loc 1 2191 0
 	ldr	x0, [x28, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
-	beq	.L1075
+	beq	.L1079
 .L988:
-	.loc 1 2193 0
+	.loc 1 2197 0
 	cmp	w0, 18
-	beq	.L1076
+	beq	.L1080
 .L989:
-	.loc 1 2204 0
+	.loc 1 2208 0
 	mov	x0, x26
 	bl	ebc_remove_from_dsp_buf_list
-.LVL913:
-	.loc 1 2206 0
+.LVL908:
+	.loc 1 2210 0
 	ldr	w0, [x28, 444]
-	cbnz	w0, .L1077
-	.loc 1 2209 0
+	cbnz	w0, .L1081
+	.loc 1 2213 0
 	mov	w0, 1
 	str	w0, [x28, 444]
 .L992:
-	.loc 1 2211 0
+	.loc 1 2215 0
 	ldr	x0, [x28, 224]
 	str	x0, [x28, 216]
-	.loc 1 2212 0
+	.loc 1 2216 0
 	b	.L895
-.LVL914:
+.LVL909:
 .L925:
-	.loc 1 1992 0
+	.loc 1 1996 0
 	ldr	w0, [x28, 628]
 	cbz	w0, .L928
-	.loc 1 2005 0
+	.loc 1 2009 0
 	ldr	x2, [x28, 216]
-	.loc 1 1993 0
+	.loc 1 1997 0
 	mov	w0, 1
-	.loc 1 2003 0
+	.loc 1 2007 0
 	str	x26, [x28, 224]
-	.loc 1 1993 0
+	.loc 1 1997 0
 	str	w0, [x28, 632]
-	.loc 1 2005 0
+	.loc 1 2009 0
 	ldr	w0, [x2, 40]
-	.loc 1 2008 0
+	.loc 1 2012 0
 	cmp	w0, 1
-	.loc 1 2007 0
+	.loc 1 2011 0
 	sub	w1, w0, #22
-	.loc 1 2008 0
+	.loc 1 2012 0
 	ccmp	w1, 1, 0, hi
-	bls	.L1078
-	.loc 1 2009 0
+	bls	.L1082
+	.loc 1 2013 0
 	ldr	w0, [x2, 64]
 	cmp	w0, 32
 	bne	.L931
-	.loc 1 2010 0
+	.loc 1 2014 0
 	ldr	x5, [x2, 16]
 	ldr	w2, [x28, 20]
 	ldr	x1, [x28, 160]
+.LBB1863:
 .LBB1864:
-.LBB1865:
 	.loc 1 1883 0
 	cmp	w2, 0
 	ble	.L932
 	mov	x0, 0
-.LVL915:
+.LVL910:
 	.p2align 2
 .L933:
 	.loc 1 1885 0
@@ -10616,26 +10584,26 @@ ebc_thread:
 	.loc 1 1883 0
 	cmp	w2, w0
 	bgt	.L933
-.L1057:
+.L1062:
 	ldr	w2, [x28, 20]
 	ldr	x1, [x28, 160]
 .L932:
-.LBE1865:
 .LBE1864:
-	.loc 1 2013 0
+.LBE1863:
+	.loc 1 2017 0
 	ldr	x0, [x28, 144]
 	sxtw	x2, w2
 	bl	memcpy
-.LVL916:
-	.loc 1 2014 0
+.LVL911:
+	.loc 1 2018 0
 	ldrsw	x2, [x28, 20]
 	ldp	x0, x1, [x28, 152]
 	bl	memcpy
-.LVL917:
+.LVL912:
 	ldr	x0, [x28, 224]
 .L934:
+.LBB1865:
 .LBB1866:
-.LBB1867:
 	.loc 1 446 0
 	ldp	w3, w16, [x0, 48]
 	.loc 1 505 0
@@ -10663,23 +10631,23 @@ ebc_thread:
 	asr	w10, w10, 3
 	.loc 1 449 0
 	asr	w18, w18, 3
-.LVL918:
+.LVL913:
 	.loc 1 445 0
 	add	w10, w10, 1
-.LVL919:
+.LVL914:
 	ldr	w1, [x20, 252]
 	.loc 1 452 0
 	cmp	w10, w18
-.LBE1867:
 .LBE1866:
-	.loc 1 2021 0
+.LBE1865:
+	.loc 1 2025 0
 	ldr	x13, [x0, 16]
-.LBB1871:
-.LBB1868:
+.LBB1870:
+.LBB1867:
 	.loc 1 452 0
 	sub	w0, w18, #1
 	csel	w10, w0, w10, ge
-.LVL920:
+.LVL915:
 	.loc 1 454 0
 	cmp	w1, w21
 	sub	w1, w1, #1
@@ -10689,29 +10657,29 @@ ebc_thread:
 	csel	w21, w1, w21, le
 	.loc 1 444 0
 	asr	w17, w17, 3
-.LVL921:
+.LVL916:
 	mul	w7, w16, w18
 	.loc 1 456 0
 	cmp	w16, w21
-.LBE1868:
-.LBE1871:
-	.loc 1 2021 0
+.LBE1867:
+.LBE1870:
+	.loc 1 2025 0
 	ldr	x8, [x28, 144]
-	.loc 1 2022 0
+	.loc 1 2026 0
 	ldp	x12, x11, [x28, 160]
-.LBB1872:
-.LBB1869:
+.LBB1871:
+.LBB1868:
 	.loc 1 456 0
 	bgt	.L942
-.LVL922:
+.LVL917:
 	.p2align 2
-.L1031:
+.L1033:
 	.loc 1 461 0
 	mov	w5, w17
 	cmp	w17, w10
-	ble	.L1032
+	ble	.L1034
 	b	.L959
-.LVL923:
+.LVL918:
 	.p2align 3
 .L943:
 	.loc 1 474 0
@@ -10720,7 +10688,7 @@ ebc_thread:
 	.loc 1 475 0
 	and	w27, w0, 240
 	cmp	w27, 224
-	beq	.L1079
+	beq	.L1083
 	.loc 1 478 0
 	orr	w3, w3, 240
 .L944:
@@ -10730,7 +10698,7 @@ ebc_thread:
 	.loc 1 481 0
 	and	w27, w0, 3840
 	cmp	w27, 3584
-	beq	.L1080
+	beq	.L1084
 	.loc 1 484 0
 	orr	w3, w3, 3840
 .L946:
@@ -10740,7 +10708,7 @@ ebc_thread:
 	.loc 1 487 0
 	and	w27, w0, 61440
 	cmp	w27, 57344
-	beq	.L1081
+	beq	.L1085
 	.loc 1 490 0
 	orr	w3, w3, 61440
 .L948:
@@ -10750,7 +10718,7 @@ ebc_thread:
 	.loc 1 493 0
 	and	w27, w0, 983040
 	cmp	w27, 917504
-	beq	.L1082
+	beq	.L1086
 	.loc 1 496 0
 	orr	w3, w3, 983040
 .L950:
@@ -10760,7 +10728,7 @@ ebc_thread:
 	.loc 1 499 0
 	and	w27, w0, 15728640
 	cmp	w27, 14680064
-	beq	.L1083
+	beq	.L1087
 	.loc 1 502 0
 	orr	w3, w3, 15728640
 .L952:
@@ -10770,7 +10738,7 @@ ebc_thread:
 	.loc 1 505 0
 	and	w27, w0, 251658240
 	cmp	w27, w15
-	beq	.L1084
+	beq	.L1088
 	.loc 1 508 0
 	orr	w3, w3, 251658240
 .L954:
@@ -10779,16 +10747,16 @@ ebc_thread:
 	bne	.L956
 	.loc 1 511 0
 	and	w2, w0, -268435456
-.LVL924:
+.LVL919:
 	cmp	w2, w14
-	beq	.L1085
+	beq	.L1089
 	.loc 1 514 0
 	orr	w3, w3, -268435456
-.LVL925:
+.LVL920:
 .L956:
 	.loc 1 517 0
 	and	w0, w0, w25
-.LVL926:
+.LVL921:
 	.loc 1 461 0
 	add	w5, w5, 1
 	eor	w0, w0, w4
@@ -10800,18 +10768,18 @@ ebc_thread:
 	str	w0, [x8, x1]
 	.loc 1 461 0
 	bgt	.L959
-.LVL927:
-.L1032:
+.LVL922:
+.L1034:
 	.loc 1 462 0
 	sxtw	x1, w5
-.LVL928:
+.LVL923:
 	.loc 1 466 0
 	mov	w3, 0
 	.loc 1 465 0
 	lsl	x0, x1, 3
 	.loc 1 462 0
 	lsl	x1, x1, 2
-.LVL929:
+.LVL924:
 	.loc 1 465 0
 	add	x0, x0, x7, sxtw 3
 	add	x1, x1, x7, sxtw 2
@@ -10824,10 +10792,10 @@ ebc_thread:
 	and	x27, x2, 255
 	.loc 1 464 0
 	ldr	w25, [x12, x1]
-.LVL930:
+.LVL925:
 	.loc 1 468 0
 	cbnz	x27, .L943
-.LVL931:
+.LVL926:
 	.loc 1 469 0
 	and	w27, w0, 15
 	.loc 1 472 0
@@ -10837,66 +10805,66 @@ ebc_thread:
 	bne	.L943
 	.loc 1 470 0
 	orr	w4, w4, w3
-.LVL932:
+.LVL927:
 	.loc 1 466 0
 	mov	w3, 0
-.LVL933:
+.LVL928:
 	b	.L943
-.LVL934:
+.LVL929:
 .L923:
-.LBE1869:
-.LBE1872:
-	.loc 1 2044 0
+.LBE1868:
+.LBE1871:
+	.loc 1 2048 0
 	add	x0, x23, 680
 	bl	down_write
-.LVL935:
-	.loc 1 2047 0
+.LVL930:
+	.loc 1 2051 0
 	ldr	x1, [x28, 216]
-	.loc 1 2045 0
+	.loc 1 2049 0
 	str	x26, [x28, 224]
-	.loc 1 2048 0
+	.loc 1 2052 0
 	ldr	w0, [x1, 40]
 	sub	w2, w0, #22
-	.loc 1 2050 0
+	.loc 1 2054 0
 	cmp	w2, 1
 	ccmp	w0, 1, 0, hi
 	bls	.L961
-	.loc 1 2051 0
+	.loc 1 2055 0
 	ldr	w0, [x1, 64]
 	cmp	w0, 32
-	beq	.L1086
-	.loc 1 2054 0
+	beq	.L1090
+	.loc 1 2058 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x1, 16]
 	ldr	x0, [x28, 152]
 	bl	memcpy
-.LVL936:
+.LVL931:
 .L965:
-	.loc 1 2055 0
+	.loc 1 2059 0
 	ldr	x0, [x28, 224]
 	ldr	w1, [x0, 64]
 	cmp	w1, 32
 	bne	.L966
-	.loc 1 2056 0
+	.loc 1 2060 0
 	ldr	w4, [x28, 20]
-.LVL937:
+.LVL932:
+.LBB1872:
 .LBB1873:
-.LBB1874:
 	.loc 1 1883 0
 	ldr	x3, [x0, 16]
-.LVL938:
+.LVL933:
 	mov	x0, 0
 	cmp	w4, 0
-.LBE1874:
 .LBE1873:
-	.loc 1 2056 0
+.LBE1872:
+	.loc 1 2060 0
 	ldr	x5, [x28, 144]
-.LBB1876:
 .LBB1875:
+.LBB1874:
 	.loc 1 1883 0
 	ble	.L968
 	.p2align 2
-.L1030:
+.L1032:
 	.loc 1 1885 0
 	ldrb	w1, [x3], 2
 	.loc 1 1887 0
@@ -10908,38 +10876,76 @@ ebc_thread:
 	add	x0, x0, 1
 	.loc 1 1883 0
 	cmp	w4, w0
-	bgt	.L1030
+	bgt	.L1032
 	b	.L968
-.LVL939:
+.LVL934:
 .L927:
+.LBE1874:
 .LBE1875:
-.LBE1876:
-	.loc 1 1990 0
+	.loc 1 1994 0
 	mov	w4, 0
-.LVL940:
+.LVL935:
 	b	.L926
+.LVL936:
+	.p2align 3
+.L1075:
+.LBB1876:
+.LBB1858:
+	.loc 1 2232 0 discriminator 1
+	mov	w1, 0
+	add	x0, x29, 120
+	bl	init_wait_entry
+.LVL937:
+	b	.L1004
+	.p2align 3
+.L1091:
+.LVL938:
+.LBB1856:
+	.loc 1 2232 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L993
+	.loc 1 2232 0 discriminator 7
+	bl	schedule
+.LVL939:
+.L1004:
+	.loc 1 2232 0 discriminator 9
+	add	x1, x29, 120
+	mov	w2, 1
+	mov	x0, x19
+	bl	prepare_to_wait_event
+.LVL940:
+	ldr	w1, [x28, 96]
+	cbz	w1, .L1091
+.LBE1856:
+	.loc 1 2232 0 discriminator 4
+	add	x1, x29, 120
+	mov	x0, x19
+	bl	finish_wait
 .LVL941:
+	b	.L993
+.LVL942:
 	.p2align 3
 .L901:
-	.loc 1 1928 0
+.LBE1858:
+.LBE1876:
+	.loc 1 1928 0 is_stmt 1
 	ldr	x2, [x28, 616]
 	cbz	x2, .L905
 	.loc 1 1929 0
 	cmp	w1, 19
-	bne	.L1055
+	bne	.L1059
 	.loc 1 1930 0
 	str	wzr, [x28, 616]
 	.loc 1 1931 0
 	mov	x0, 3
-.LVL942:
-	bl	ebc_notify
 .LVL943:
+	bl	ebc_notify
+.LVL944:
 	.loc 1 1932 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC83
 	add	x1, x1, :lo12:.LC83
 	bl	_dev_info
-.LVL944:
+.LVL945:
 	.loc 1 1935 0
 	ldr	w2, [x20, 204]
 	.loc 1 1933 0
@@ -10951,212 +10957,212 @@ ebc_thread:
 	stp	w3, wzr, [x21, 16]
 	.loc 1 1935 0
 	bl	check_black_percent.isra.15
-.LVL945:
-	cbnz	w0, .L895
-	b	.L900
 .LVL946:
+	cbz	w0, .L900
+	b	.L1060
+.LVL947:
 	.p2align 3
-.L1068:
+.L1073:
 .LBB1877:
-	.loc 1 2216 0 discriminator 1
+	.loc 1 2220 0 discriminator 1
 	ldr	w0, [x28, 96]
 	cbnz	w0, .L993
 .LBB1878:
-	.loc 1 2216 0 is_stmt 0 discriminator 3
+	.loc 1 2220 0 is_stmt 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL947:
+.LVL948:
 	b	.L997
 	.p2align 3
-.L1087:
+.L1092:
 .LBB1879:
-	.loc 1 2216 0 discriminator 7
+	.loc 1 2220 0 discriminator 7
 	ldr	w1, [x28, 96]
 	cbnz	w1, .L994
-.LVL948:
-	.loc 1 2216 0 discriminator 9
-	cbnz	x0, .L1058
-	.loc 1 2216 0 discriminator 11
-	bl	schedule
 .LVL949:
+	.loc 1 2220 0 discriminator 9
+	cbnz	x0, .L1063
+	.loc 1 2220 0 discriminator 11
+	bl	schedule
+.LVL950:
 .L997:
-	.loc 1 2216 0 discriminator 13
+	.loc 1 2220 0 discriminator 13
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL950:
+.LVL951:
 	ldr	w1, [x28, 44]
-	cbnz	w1, .L1087
+	cbnz	w1, .L1092
 .L994:
 .LBE1879:
-	.loc 1 2216 0 discriminator 8
+	.loc 1 2220 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL951:
+.LVL952:
 	ldr	w0, [x28, 44]
 .LBE1878:
 .LBE1877:
-	.loc 1 2219 0 is_stmt 1 discriminator 8
-	cbnz	w0, .L1058
-	.loc 1 2224 0
+	.loc 1 2223 0 is_stmt 1 discriminator 8
+	cbnz	w0, .L1063
+	.loc 1 2228 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	bne	.L1058
+	bne	.L1063
 	.p2align 2
-.L1069:
+.L1074:
 .LBB1880:
 .LBB1881:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.13
-.LVL952:
-	b	.L1058
+.LVL953:
+	b	.L1063
 	.p2align 3
-.L1077:
+.L1081:
 .LBE1881:
 .LBE1880:
-	.loc 1 2207 0
+	.loc 1 2211 0
 	ldr	x0, [x28, 216]
 	bl	ebc_buf_release
-.LVL953:
-	b	.L992
 .LVL954:
+	b	.L992
+.LVL955:
 	.p2align 3
 .L983:
-	.loc 1 2161 0
+	.loc 1 2165 0
 	ldr	x0, [x28, 224]
 	adrp	x1, .LC92
-	.loc 1 2158 0
+	.loc 1 2162 0
 	ldr	w3, [x28, 112]
-	.loc 1 2161 0
+	.loc 1 2165 0
 	add	x1, x1, :lo12:.LC92
-	.loc 1 2158 0
+	.loc 1 2162 0
 	strb	w3, [x28, 48]
-	.loc 1 2161 0
+	.loc 1 2165 0
 	and	w3, w3, 255
 	ldr	w2, [x0, 40]
 	ldr	x0, [x28, 104]
 	bl	_dev_info
-.LVL955:
-	.loc 1 2162 0
+.LVL956:
+	.loc 1 2166 0
 	mov	w0, 1
 	str	w0, [x28, 44]
-	.loc 1 2163 0
+	.loc 1 2167 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL956:
-	.loc 1 2165 0
+.LVL957:
+	.loc 1 2169 0
 	ldr	x1, [x21, #:lo12:jiffies]
 	add	x0, x20, 688
 	str	x0, [x29, 96]
 	add	x1, x1, 900
 	bl	mod_timer
-.LVL957:
+.LVL958:
 .LBB1882:
-	.loc 1 2166 0
+	.loc 1 2170 0
 	ldr	w0, [x28, 92]
-	cbz	w0, .L1088
+	cbz	w0, .L1093
 .L986:
-.LVL958:
+.LVL959:
 .L984:
 .LBE1882:
-	.loc 1 2168 0 discriminator 11
+	.loc 1 2172 0 discriminator 11
 	ldr	x2, [x21, #:lo12:jiffies]
 	mov	x1, 402653184
 	ldr	x0, [x29, 96]
-.LVL959:
+.LVL960:
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL960:
-	.loc 1 2169 0 discriminator 11
+.LVL961:
+	.loc 1 2173 0 discriminator 11
 	str	wzr, [x28, 92]
-	.loc 1 2187 0 discriminator 11
+	.loc 1 2191 0 discriminator 11
 	ldr	x0, [x28, 224]
-	.loc 1 2171 0 discriminator 11
+	.loc 1 2175 0 discriminator 11
 	str	x25, [x28, 216]
-	.loc 1 2187 0 discriminator 11
+	.loc 1 2191 0 discriminator 11
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
 	bne	.L988
-.LVL961:
-.L1075:
-	.loc 1 2190 0
+.LVL962:
+.L1079:
+	.loc 1 2194 0
 	ldr	x0, [x28, 104]
-	.loc 1 2188 0
+	.loc 1 2192 0
 	mov	w21, 1
-.LVL962:
-	.loc 1 2189 0
+.LVL963:
+	.loc 1 2193 0
 	str	wzr, [x28, 204]
-	.loc 1 2190 0
+	.loc 1 2194 0
 	adrp	x1, .LC94
-	.loc 1 2188 0
+	.loc 1 2192 0
 	str	w21, [x28, 624]
-	.loc 1 2190 0
+	.loc 1 2194 0
 	add	x1, x1, :lo12:.LC94
 	bl	_dev_info
-.LVL963:
-	.loc 1 2191 0
+.LVL964:
+	.loc 1 2195 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x23, 328
 	bl	__wake_up_sync
-.LVL964:
-	b	.L989
 .LVL965:
+	b	.L989
+.LVL966:
 	.p2align 3
 .L1013:
-	.loc 1 2146 0
+	.loc 1 2150 0
 	ldr	w0, [x28, 200]
-	.loc 1 2135 0
+	.loc 1 2139 0
 	str	wzr, [x29, 108]
-	.loc 1 2146 0
+	.loc 1 2150 0
 	cbnz	w0, .L982
-.LVL966:
-.L1074:
-	.loc 1 2147 0
+.LVL967:
+.L1078:
+	.loc 1 2151 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
-.LVL967:
-	b	.L982
 .LVL968:
+	b	.L982
+.LVL969:
 	.p2align 3
 .L905:
-	.loc 1 1948 0
+	.loc 1 1952 0
 	cmp	w1, 21
-	beq	.L1089
-	.loc 1 1951 0
+	beq	.L1094
+	.loc 1 1955 0
 	ldr	w0, [x28, 632]
-.LVL969:
+.LVL970:
 	cmp	w0, 0
 	ccmp	w1, 1, 4, ne
 	beq	.L900
-	.loc 1 1952 0
+	.loc 1 1956 0
 	add	x0, x23, 680
 	bl	down_write
-.LVL970:
-	.loc 1 1953 0
+.LVL971:
+	.loc 1 1957 0
 	ldr	w0, [x26, 64]
 	cmp	w0, 32
-	beq	.L1090
-	.loc 1 1956 0
+	beq	.L1095
+	.loc 1 1960 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x26, 16]
 	ldr	x0, [x28, 160]
 	bl	memcpy
-.LVL971:
+.LVL972:
 .L910:
-	.loc 1 1957 0
+	.loc 1 1961 0
 	mov	x0, x26
 	bl	ebc_remove_from_dsp_buf_list
-.LVL972:
-	.loc 1 1958 0
+.LVL973:
+	.loc 1 1962 0
 	mov	x0, x26
 	bl	ebc_buf_release
-.LVL973:
-	.loc 1 1960 0
+.LVL974:
+	.loc 1 1964 0
 	ldr	x1, [x28, 224]
 	mov	x4, x28
 	ldr	x0, [x28, 144]
@@ -11164,141 +11170,141 @@ ebc_thread:
 	ldr	w5, [x1, 40]
 	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
-.LVL974:
-	.loc 1 1963 0
+.LVL975:
+	.loc 1 1967 0
 	add	x0, x23, 680
 	bl	up_write
-.LVL975:
-	.loc 1 1964 0
+.LVL976:
+	.loc 1 1968 0
 	ldr	w0, [x28, 44]
 	cbnz	w0, .L895
-	.loc 1 1965 0
+	.loc 1 1969 0
 	mov	w0, 1
 	str	w0, [x28, 44]
-	.loc 1 1967 0
+	.loc 1 1971 0
 	ldr	w0, [x28, 200]
-	.loc 1 1966 0
+	.loc 1 1970 0
 	str	wzr, [x28, 92]
-	.loc 1 1967 0
-	cbz	w0, .L1091
+	.loc 1 1971 0
+	cbz	w0, .L1096
 .L913:
-	.loc 1 1969 0
+	.loc 1 1973 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC84
 	ldrb	w2, [x28, 48]
 	add	x1, x1, :lo12:.LC84
 	bl	_dev_info
-.LVL976:
-	.loc 1 1970 0
+.LVL977:
+	.loc 1 1974 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL977:
+.LVL978:
 	b	.L895
 	.p2align 3
 .L961:
-	.loc 1 2061 0
+	.loc 1 2065 0
 	ldr	w0, [x26, 64]
-	.loc 1 2062 0
+	.loc 1 2066 0
 	mov	x3, x28
 	ldr	x1, [x26, 16]
-	.loc 1 2061 0
+	.loc 1 2065 0
 	cmp	w0, 32
-	.loc 1 2062 0
+	.loc 1 2066 0
 	ldr	x2, [x28, 168]
 	ldr	x0, [x28, 144]
-	.loc 1 2061 0
-	beq	.L1092
 	.loc 1 2065 0
+	beq	.L1097
+	.loc 1 2069 0
 	bl	refresh_new_image_auto
-.LVL978:
+.LVL979:
 .L968:
-	.loc 1 2068 0
+	.loc 1 2072 0
 	add	x0, x23, 680
 	bl	up_write
-.LVL979:
-	.loc 1 2070 0
+.LVL980:
+	.loc 1 2074 0
 	ldr	w0, [x28, 44]
 	cbnz	w0, .L939
-	.loc 1 2073 0
+	.loc 1 2077 0
 	ldr	w0, [x28, 200]
-	.loc 1 2071 0
+	.loc 1 2075 0
 	mov	w1, 1
-	.loc 1 2072 0
+	.loc 1 2076 0
 	str	wzr, [x28, 92]
-	.loc 1 2071 0
+	.loc 1 2075 0
 	str	w1, [x28, 44]
-	.loc 1 2073 0
-	cbz	w0, .L1093
+	.loc 1 2077 0
+	cbz	w0, .L1098
 .L972:
-	.loc 1 2075 0
+	.loc 1 2079 0
 	mov	w1, 16
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL980:
+.LVL981:
 	cmn	w0, #1
-	beq	.L1094
-	.loc 1 2080 0
+	beq	.L1099
+	.loc 1 2084 0
 	ldr	w3, [x28, 112]
-	.loc 1 2083 0
+	.loc 1 2087 0
 	adrp	x1, .LC91
 	ldr	x0, [x28, 104]
 	add	x1, x1, :lo12:.LC91
-	.loc 1 2080 0
+	.loc 1 2084 0
 	strb	w3, [x28, 48]
-	.loc 1 2083 0
+	.loc 1 2087 0
 	and	w2, w3, 255
-	.loc 1 2081 0
+	.loc 1 2085 0
 	lsr	w3, w3, 8
 	strb	w3, [x28, 49]
-	.loc 1 2083 0
+	.loc 1 2087 0
 	bl	_dev_info
-.LVL981:
-	.loc 1 2084 0
+.LVL982:
+	.loc 1 2088 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL982:
+.LVL983:
 	b	.L939
-.L1064:
-	.loc 1 1984 0
+.L1069:
+	.loc 1 1988 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC86
 	add	x1, x1, :lo12:.LC86
 	bl	_dev_info
-.LVL983:
+.LVL984:
 .LBB1886:
-	.loc 1 1985 0
+	.loc 1 1989 0
 	ldr	w0, [x28, 92]
-	cbz	w0, .L1095
+	cbz	w0, .L1100
 .L920:
-.LVL984:
+.LVL985:
 .L918:
 .LBE1886:
-	.loc 1 1986 0 discriminator 11
+	.loc 1 1990 0 discriminator 11
 	ldr	x0, [x28, 104]
-.LVL985:
+.LVL986:
 	adrp	x1, .LC87
 	add	x1, x1, :lo12:.LC87
 	bl	_dev_info
-.LVL986:
-	b	.L1056
 .LVL987:
-.L1073:
-	.loc 1 2125 0
+	b	.L1061
+.LVL988:
+.L1077:
+	.loc 1 2129 0
 	ldr	w2, [x28, 20]
 .LBB1890:
-.LBB1863:
+.LBB1862:
 	.loc 1 1862 0
 	cmp	w0, 32
-.LVL988:
+.LVL989:
 	lsl	w0, w2, 1
 	csel	w2, w0, w2, eq
 	.loc 1 1863 0
 	cmp	w2, 0
 	add	w0, w2, 7
 	csel	w0, w0, w2, lt
-.LVL989:
-	asr	w0, w0, 3
 .LVL990:
+	asr	w0, w0, 3
+.LVL991:
 	cmp	w0, 0
 	ble	.L977
 	ldr	x7, [x1, 16]
@@ -11329,76 +11335,76 @@ ebc_thread:
 	cmp	x1, x0
 	bne	.L980
 .L977:
-.LBE1863:
+.LBE1862:
 .LBE1890:
-	.loc 1 2126 0
+	.loc 1 2130 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC96
 	add	x1, x1, :lo12:.LC96
 	bl	_dev_info
-.LVL991:
-	.loc 1 2128 0
+.LVL992:
+	.loc 1 2132 0
 	str	x25, [x28, 216]
-	.loc 1 2130 0
+	.loc 1 2134 0
 	b	.L939
-.LVL992:
-.L1078:
-	.loc 1 2017 0
+.LVL993:
+.L1082:
+	.loc 1 2021 0
 	cmp	w0, 0
 	mov	x0, x26
 	ccmp	w1, 1, 0, ne
 	bhi	.L934
-	.loc 1 2018 0
+	.loc 1 2022 0
 	ldrsw	x2, [x28, 20]
 	ldp	x1, x0, [x28, 152]
 	bl	memcpy
-.LVL993:
+.LVL994:
 	ldr	x0, [x28, 224]
 	b	.L934
-.LVL994:
+.LVL995:
 	.p2align 3
-.L1079:
+.L1083:
 .LBB1891:
-.LBB1870:
+.LBB1869:
 	.loc 1 476 0
 	orr	w4, w4, 240
 	b	.L944
 	.p2align 3
-.L1080:
+.L1084:
 	.loc 1 482 0
 	orr	w4, w4, 3840
 	b	.L946
 	.p2align 3
-.L1081:
+.L1085:
 	.loc 1 488 0
 	orr	w4, w4, 61440
 	b	.L948
 	.p2align 3
-.L1082:
+.L1086:
 	.loc 1 494 0
 	orr	w4, w4, 983040
 	b	.L950
 	.p2align 3
-.L1083:
+.L1087:
 	.loc 1 500 0
 	orr	w4, w4, 15728640
 	b	.L952
 	.p2align 3
-.L1084:
+.L1088:
 	.loc 1 506 0
 	orr	w4, w4, 251658240
 	b	.L954
-.LVL995:
+.LVL996:
 	.p2align 3
-.L1085:
+.L1089:
 	.loc 1 512 0
 	orr	w4, w4, -268435456
-.LVL996:
+.LVL997:
 	.loc 1 517 0
 	and	w0, w0, w25
-.LVL997:
-	eor	w0, w0, w4
 .LVL998:
+	eor	w0, w0, w4
+.LVL999:
 	.loc 1 461 0
 	add	w5, w5, 1
 	and	w0, w0, w3
@@ -11408,164 +11414,155 @@ ebc_thread:
 	.loc 1 518 0
 	str	w0, [x8, x1]
 	.loc 1 461 0
-	ble	.L1032
-.LVL999:
+	ble	.L1034
+.LVL1000:
 	.p2align 2
 .L959:
 	.loc 1 456 0
 	add	w16, w16, 1
 	add	w7, w7, w18
 	cmp	w16, w21
-	ble	.L1031
+	ble	.L1033
 .L942:
-.LBE1870:
+.LBE1869:
 .LBE1891:
-	.loc 1 2025 0
+	.loc 1 2029 0
 	ldr	w0, [x28, 44]
 	cbnz	w0, .L939
-	.loc 1 2028 0
+	.loc 1 2032 0
 	ldr	w0, [x28, 200]
-	.loc 1 2026 0
+	.loc 1 2030 0
 	mov	w1, 1
-	.loc 1 2027 0
+	.loc 1 2031 0
 	str	wzr, [x28, 92]
-	.loc 1 2026 0
+	.loc 1 2030 0
 	str	w1, [x28, 44]
-	.loc 1 2028 0
-	cbz	w0, .L1096
+	.loc 1 2032 0
+	cbz	w0, .L1101
 .L960:
-	.loc 1 2030 0
+	.loc 1 2034 0
 	mov	w1, 16
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL1000:
+.LVL1001:
 	cmn	w0, #1
 	beq	.L939
-	.loc 1 2034 0
+	.loc 1 2038 0
 	ldr	w2, [x28, 112]
-	.loc 1 2037 0
+	.loc 1 2041 0
 	adrp	x1, .LC89
 	ldr	x0, [x28, 104]
 	add	x1, x1, :lo12:.LC89
-	.loc 1 2034 0
+	.loc 1 2038 0
 	strb	w2, [x28, 48]
-	.loc 1 2035 0
+	.loc 1 2039 0
 	lsr	w3, w2, 8
-	.loc 1 2037 0
+	.loc 1 2041 0
 	and	w2, w2, 255
-	.loc 1 2035 0
+	.loc 1 2039 0
 	strb	w3, [x28, 49]
-	.loc 1 2037 0
+	.loc 1 2041 0
 	and	w3, w3, 255
 	bl	_dev_info
-.LVL1001:
-	.loc 1 2038 0
+.LVL1002:
+	.loc 1 2042 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL1002:
-	b	.L939
 .LVL1003:
-.L1076:
-	.loc 1 2194 0
+	b	.L939
+.LVL1004:
+.L1080:
+	.loc 1 2198 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC95
 	add	x1, x1, :lo12:.LC95
 	bl	_dev_info
-.LVL1004:
-	.loc 1 2195 0
+.LVL1005:
+	.loc 1 2199 0
 	ldr	w0, [x28, 616]
-	cbz	w0, .L1097
+	cbz	w0, .L1102
 .L990:
-	.loc 1 2200 0
+	.loc 1 2204 0
 	add	x0, x22, :lo12:.LANCHOR0
-	.loc 1 2198 0
+	.loc 1 2202 0
 	mov	w2, 1
-	.loc 1 2197 0
-	str	wzr, [x28, 204]
 	.loc 1 2201 0
+	str	wzr, [x28, 204]
+	.loc 1 2205 0
 	mov	w1, w2
-	.loc 1 2198 0
+	.loc 1 2202 0
 	str	w2, [x28, 616]
-	.loc 1 2199 0
+	.loc 1 2203 0
 	str	wzr, [x28, 632]
-	.loc 1 2200 0
+	.loc 1 2204 0
 	str	wzr, [x0, 16]
-	.loc 1 2201 0
+	.loc 1 2205 0
 	add	x0, x23, 328
 	bl	__wake_up_sync
-.LVL1005:
-	b	.L989
 .LVL1006:
+	b	.L989
+.LVL1007:
 .L928:
-	.loc 1 1996 0
+	.loc 1 2000 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC88
 	add	x1, x1, :lo12:.LC88
 	bl	_dev_info
-.LVL1007:
-	.loc 1 1997 0
-	mov	x0, x26
-	bl	ebc_remove_from_dsp_buf_list
 .LVL1008:
-	.loc 1 1998 0
-	mov	x0, x26
-	bl	ebc_buf_release
+	b	.L1060
 .LVL1009:
-	.loc 1 2000 0
-	b	.L895
-.LVL1010:
-.L1088:
+.L1093:
 .LBB1892:
 .LBB1883:
 .LBB1884:
-	.loc 1 2166 0 discriminator 1
+	.loc 1 2170 0 discriminator 1
 	add	x27, x23, 352
 .LBE1884:
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL1011:
+.LVL1010:
 	b	.L987
 	.p2align 3
-.L1098:
-.LVL1012:
+.L1103:
+.LVL1011:
 .LBB1885:
-	.loc 1 2166 0 is_stmt 0 discriminator 5
+	.loc 1 2170 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L984
-	.loc 1 2166 0 discriminator 7
+	.loc 1 2170 0 discriminator 7
 	bl	schedule
-.LVL1013:
+.LVL1012:
 .L987:
-	.loc 1 2166 0 discriminator 9
+	.loc 1 2170 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x27
 	bl	prepare_to_wait_event
-.LVL1014:
+.LVL1013:
 	ldr	w1, [x28, 92]
-	cbz	w1, .L1098
+	cbz	w1, .L1103
 .LBE1885:
-	.loc 1 2166 0 discriminator 4
+	.loc 1 2170 0 discriminator 4
 	mov	x0, x27
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL1015:
+.LVL1014:
 	b	.L984
-.LVL1016:
-.L1089:
+.LVL1015:
+.L1094:
 .LBE1883:
 .LBE1892:
-	.loc 1 1949 0 is_stmt 1
+	.loc 1 1953 0 is_stmt 1
 	str	wzr, [x28, 632]
 	b	.L900
-.LVL1017:
-.L1092:
-	.loc 1 2062 0
+.LVL1016:
+.L1097:
+	.loc 1 2066 0
 	bl	refresh_new_image_auto_32
-.LVL1018:
+.LVL1017:
 	b	.L968
-.L1086:
-	.loc 1 2052 0
+.L1090:
+	.loc 1 2056 0
 	ldr	w2, [x28, 20]
 	ldr	x4, [x1, 16]
 .LBB1893:
@@ -11574,14 +11571,14 @@ ebc_thread:
 	cmp	w2, 0
 .LBE1894:
 .LBE1893:
-	.loc 1 2052 0
+	.loc 1 2056 0
 	ldr	x5, [x28, 152]
 .LBB1896:
 .LBB1895:
 	.loc 1 1883 0
 	ble	.L963
 	mov	x0, 0
-.LVL1019:
+.LVL1018:
 	.p2align 2
 .L964:
 	.loc 1 1885 0
@@ -11597,76 +11594,76 @@ ebc_thread:
 	cmp	w2, w0
 	bgt	.L964
 	b	.L965
-.LVL1020:
-.L1095:
+.LVL1019:
+.L1100:
 .LBE1895:
 .LBE1896:
 .LBB1897:
 .LBB1887:
 .LBB1888:
-	.loc 1 1985 0 discriminator 1
+	.loc 1 1989 0 discriminator 1
 	add	x25, x23, 352
-.LVL1021:
+.LVL1020:
 .LBE1888:
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL1022:
+.LVL1021:
 	b	.L921
 	.p2align 3
-.L1099:
-.LVL1023:
+.L1104:
+.LVL1022:
 .LBB1889:
-	.loc 1 1985 0 is_stmt 0 discriminator 5
+	.loc 1 1989 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L918
-	.loc 1 1985 0 discriminator 7
+	.loc 1 1989 0 discriminator 7
 	bl	schedule
-.LVL1024:
+.LVL1023:
 .L921:
-	.loc 1 1985 0 discriminator 9
+	.loc 1 1989 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x25
 	bl	prepare_to_wait_event
-.LVL1025:
+.LVL1024:
 	ldr	w1, [x28, 92]
-	cbz	w1, .L1099
+	cbz	w1, .L1104
 .LBE1889:
-	.loc 1 1985 0 discriminator 4
+	.loc 1 1989 0 discriminator 4
 	mov	x0, x25
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL1026:
+.LVL1025:
 	b	.L918
-.LVL1027:
-.L1096:
+.LVL1026:
+.L1101:
 .LBE1887:
 .LBE1897:
-	.loc 1 2029 0 is_stmt 1
+	.loc 1 2033 0 is_stmt 1
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
-.LVL1028:
+.LVL1027:
 	b	.L960
-.LVL1029:
-.L1090:
-	.loc 1 1954 0
+.LVL1028:
+.L1095:
+	.loc 1 1958 0
 	ldr	w4, [x28, 20]
 .LBB1898:
 .LBB1899:
 	.loc 1 1883 0
 	mov	x0, 0
 	ldr	x3, [x26, 16]
-.LVL1030:
+.LVL1029:
 	cmp	w4, 0
 .LBE1899:
 .LBE1898:
-	.loc 1 1954 0
+	.loc 1 1958 0
 	ldr	x5, [x28, 160]
 .LBB1901:
 .LBB1900:
 	.loc 1 1883 0
 	ble	.L910
-.L1033:
+.L1035:
 	.loc 1 1885 0
 	ldrb	w1, [x3], 2
 	.loc 1 1887 0
@@ -11678,10 +11675,10 @@ ebc_thread:
 	add	x0, x0, 1
 	.loc 1 1883 0
 	cmp	w4, w0
-	bgt	.L1033
+	bgt	.L1035
 	b	.L910
-.LVL1031:
-.L1066:
+.LVL1030:
+.L1071:
 .LBE1900:
 .LBE1901:
 .LBB1902:
@@ -11689,71 +11686,71 @@ ebc_thread:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.13
-.LVL1032:
+.LVL1031:
 	b	.L897
-.LVL1033:
-.L1094:
+.LVL1032:
+.L1099:
 .LBE1903:
 .LBE1902:
-	.loc 1 2076 0
+	.loc 1 2080 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC90
 	add	x1, x1, :lo12:.LC90
 	bl	_dev_err
-.LVL1034:
-	.loc 1 2077 0
+.LVL1033:
+	.loc 1 2081 0
 	b	.L939
-.L1093:
-	.loc 1 2074 0
+.L1098:
+	.loc 1 2078 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
-.LVL1035:
+.LVL1034:
 	b	.L972
 .L931:
-	.loc 1 2012 0
+	.loc 1 2016 0
 	ldr	x1, [x2, 16]
 	ldr	x0, [x28, 160]
 	ldrsw	x2, [x28, 20]
 	bl	memcpy
+.LVL1035:
+	b	.L1062
 .LVL1036:
-	b	.L1057
-.LVL1037:
 .L966:
 	ldr	w2, [x28, 20]
 .L1007:
-	.loc 1 2058 0
+	.loc 1 2062 0
 	ldr	x1, [x0, 16]
 	sxtw	x2, w2
 	ldr	x0, [x28, 144]
 	bl	memcpy
-.LVL1038:
+.LVL1037:
 	b	.L968
-.LVL1039:
-.L1097:
-	.loc 1 2196 0
+.LVL1038:
+.L1102:
+	.loc 1 2200 0
 	mov	x0, 2
 	bl	ebc_notify
-.LVL1040:
+.LVL1039:
 	b	.L990
-.LVL1041:
-.L1091:
-	.loc 1 1968 0
+.LVL1040:
+.L1096:
+	.loc 1 1972 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
-.LVL1042:
+.LVL1041:
 	b	.L913
 .L963:
-	.loc 1 2055 0
+	.loc 1 2059 0
 	ldr	w0, [x26, 64]
 	cmp	w0, 32
 	beq	.L968
 	mov	x0, x26
 	b	.L1007
-.LVL1043:
-.L1067:
-	.loc 1 2234 0
+.LVL1042:
+.L1072:
+	.loc 1 2242 0
 	bl	__stack_chk_fail
-.LVL1044:
+.LVL1043:
 	.cfi_endproc
 .LFE2838:
 	.size	ebc_thread, .-ebc_thread
@@ -11962,9 +11959,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init3172, %object
-	.size	__addressable_ebc_init3172, 8
-__addressable_ebc_init3172:
+	.type	__addressable_ebc_init3180, %object
+	.size	__addressable_ebc_init3180, 8
+__addressable_ebc_init3180:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -12022,7 +12019,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC16:
-	.string	"2.19"
+	.string	"2.20"
 	.zero	3
 .LC17:
 	.string	"%s\n"
@@ -12481,7 +12478,7 @@ __exitcall_ebc_exit:
 	.file 214 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x155a5
+	.4byte	0x15598
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
@@ -40216,7 +40213,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0xa04
+	.2byte	0xa0c
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
@@ -40224,7 +40221,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0xa0e
+	.2byte	0xa16
 	.4byte	0xc680
 	.uleb128 0x9
 	.byte	0x3
@@ -40232,7 +40229,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0xa2b
+	.2byte	0xa33
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
@@ -40240,7 +40237,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0xa31
+	.2byte	0xa39
 	.4byte	0xc680
 	.uleb128 0x9
 	.byte	0x3
@@ -40248,7 +40245,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0xa40
+	.2byte	0xa48
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40256,7 +40253,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0xa4b
+	.2byte	0xa53
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40264,7 +40261,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0xa59
+	.2byte	0xa61
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40272,7 +40269,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0xa7c
+	.2byte	0xa84
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40280,7 +40277,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0xa86
+	.2byte	0xa8e
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40288,7 +40285,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0xa8f
+	.2byte	0xa97
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40296,7 +40293,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0xa98
+	.2byte	0xaa0
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40304,7 +40301,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0xc45
+	.2byte	0xc4d
 	.4byte	0xa5cc
 	.uleb128 0x9
 	.byte	0x3
@@ -40321,7 +40318,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0xc4a
+	.2byte	0xc52
 	.4byte	0xe71f
 	.uleb128 0x9
 	.byte	0x3
@@ -40329,7 +40326,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0xc50
+	.2byte	0xc58
 	.4byte	0xd70e
 	.uleb128 0x9
 	.byte	0x3
@@ -40337,15 +40334,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0xc64
+	.2byte	0xc6c
 	.4byte	0x458
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init3172
+	.8byte	__addressable_ebc_init3180
 	.uleb128 0x4d
 	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0xc65
+	.2byte	0xc6d
 	.4byte	0x4ac
 	.uleb128 0x9
 	.byte	0x3
@@ -40353,7 +40350,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4e
 	.4byte	.LASF3096
 	.byte	0x1
-	.2byte	0xc5f
+	.2byte	0xc67
 	.8byte	.LFB2867
 	.8byte	.LFE2867-.LFB2867
 	.uleb128 0x1
@@ -40361,12 +40358,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe7a8
 	.uleb128 0x4f
 	.8byte	.LVL64
-	.4byte	0x15276
+	.4byte	0x15269
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0xc5a
+	.2byte	0xc62
 	.4byte	0xc6
 	.8byte	.LFB2866
 	.8byte	.LFE2866-.LFB2866
@@ -40375,12 +40372,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe7d8
 	.uleb128 0x4f
 	.8byte	.LVL361
-	.4byte	0x15282
+	.4byte	0x15275
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0xc39
+	.2byte	0xc41
 	.4byte	0xc6
 	.8byte	.LFB2865
 	.8byte	.LFE2865-.LFB2865
@@ -40390,42 +40387,42 @@ __exitcall_ebc_exit:
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xc39
+	.2byte	0xc41
 	.4byte	0xa5e0
 	.4byte	.LLST11
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xc3b
+	.2byte	0xc43
 	.4byte	0xe557
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xc3c
+	.2byte	0xc44
 	.4byte	0xe874
 	.uleb128 0x54
-	.4byte	0x14b41
+	.4byte	0x14b34
 	.8byte	.LBB954
 	.8byte	.LBE954-.LBB954
 	.byte	0x1
-	.2byte	0xc3b
+	.2byte	0xc43
 	.4byte	0xe844
 	.uleb128 0x55
-	.4byte	0x14b52
+	.4byte	0x14b45
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14709
+	.4byte	0x146fc
 	.8byte	.LBB956
 	.8byte	.LBE956-.LBB956
 	.byte	0x1
-	.2byte	0xc3e
+	.2byte	0xc46
 	.4byte	0xe866
 	.uleb128 0x55
-	.4byte	0x14716
+	.4byte	0x14709
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL68
-	.4byte	0x1528e
+	.4byte	0x15281
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -40433,7 +40430,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x51
 	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0xc28
+	.2byte	0xc30
 	.4byte	0xc6
 	.8byte	.LFB2864
 	.8byte	.LFE2864-.LFB2864
@@ -40443,18 +40440,18 @@ __exitcall_ebc_exit:
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xc28
+	.2byte	0xc30
 	.4byte	0xa5e0
 	.4byte	.LLST192
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xc2a
+	.2byte	0xc32
 	.4byte	0xe557
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xc2b
+	.2byte	0xc33
 	.4byte	0xe874
 	.uleb128 0x56
 	.4byte	.LASF3050
@@ -40463,52 +40460,52 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	__func__.35528
 	.uleb128 0x54
-	.4byte	0x14b41
+	.4byte	0x14b34
 	.8byte	.LBB1484
 	.8byte	.LBE1484-.LBB1484
 	.byte	0x1
-	.2byte	0xc2a
+	.2byte	0xc32
 	.4byte	0xe8f9
 	.uleb128 0x55
-	.4byte	0x14b52
+	.4byte	0x14b45
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14723
+	.4byte	0x14716
 	.8byte	.LBB1486
 	.8byte	.LBE1486-.LBB1486
 	.byte	0x1
-	.2byte	0xc33
+	.2byte	0xc3b
 	.4byte	0xe91b
 	.uleb128 0x55
-	.4byte	0x14730
+	.4byte	0x14723
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x143d0
+	.4byte	0x143c3
 	.8byte	.LBB1488
 	.8byte	.LBE1488-.LBB1488
 	.byte	0x1
-	.2byte	0xc2f
+	.2byte	0xc37
 	.4byte	0xe966
 	.uleb128 0x55
-	.4byte	0x143eb
+	.4byte	0x143de
 	.uleb128 0x55
-	.4byte	0x143e0
+	.4byte	0x143d3
 	.uleb128 0x57
 	.8byte	.LBB1489
 	.8byte	.LBE1489-.LBB1489
 	.uleb128 0x58
-	.4byte	0x143f7
+	.4byte	0x143ea
 	.uleb128 0x4f
 	.8byte	.LVL592
-	.4byte	0x150a5
+	.4byte	0x15098
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL590
-	.4byte	0x1528e
+	.4byte	0x15281
 	.uleb128 0x4f
 	.8byte	.LVL591
-	.4byte	0x1528e
+	.4byte	0x15281
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
@@ -40522,7 +40519,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x50
 	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0xc21
+	.2byte	0xc29
 	.4byte	0xc6
 	.8byte	.LFB2863
 	.8byte	.LFE2863-.LFB2863
@@ -40532,17 +40529,17 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0xc21
+	.2byte	0xc29
 	.4byte	0xd78a
 	.4byte	.LLST13
 	.uleb128 0x4f
 	.8byte	.LVL74
-	.4byte	0x1529b
+	.4byte	0x1528e
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0xba0
+	.2byte	0xba8
 	.4byte	0xc6
 	.8byte	.LFB2862
 	.8byte	.LFE2862-.LFB2862
@@ -40552,133 +40549,133 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0xba0
+	.2byte	0xba8
 	.4byte	0xd78a
 	.4byte	.LLST195
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xba2
+	.2byte	0xbaa
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0xba3
+	.2byte	0xbab
 	.4byte	0xb904
 	.uleb128 0x5a
 	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0xba4
+	.2byte	0xbac
 	.4byte	0xd78a
 	.4byte	.LLST196
 	.uleb128 0x48
 	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0xba5
+	.2byte	0xbad
 	.4byte	0xb904
 	.uleb128 0x5a
 	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0xba6
+	.2byte	0xbae
 	.4byte	0xc0b3
 	.4byte	.LLST197
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xba7
+	.2byte	0xbaf
 	.4byte	0xe557
 	.uleb128 0x5a
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xba8
+	.2byte	0xbb0
 	.4byte	0xe874
 	.4byte	.LLST198
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xba9
+	.2byte	0xbb1
 	.4byte	0xe1f4
 	.uleb128 0x5a
 	.4byte	.LASF976
 	.byte	0x1
-	.2byte	0xbaa
+	.2byte	0xbb2
 	.4byte	0xbd30
 	.4byte	.LLST199
 	.uleb128 0x48
 	.4byte	.LASF2435
 	.byte	0x1
-	.2byte	0xbab
+	.2byte	0xbb3
 	.4byte	0xbcd0
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xbac
+	.2byte	0xbb4
 	.4byte	0xc6
 	.uleb128 0x5a
 	.4byte	.LASF1001
 	.byte	0x1
-	.2byte	0xbad
+	.2byte	0xbb5
 	.4byte	0xc6
 	.4byte	.LLST200
 	.uleb128 0x5b
 	.string	"i"
 	.byte	0x1
-	.2byte	0xbae
+	.2byte	0xbb6
 	.4byte	0xc6
 	.4byte	.LLST201
 	.uleb128 0x5c
-	.4byte	0x14b5f
+	.4byte	0x14b52
 	.8byte	.LBB1634
 	.4byte	.Ldebug_ranges0+0xcb0
 	.byte	0x1
-	.2byte	0xbb0
+	.2byte	0xbb8
 	.4byte	0xeaef
 	.uleb128 0x55
-	.4byte	0x14b88
+	.4byte	0x14b7b
 	.uleb128 0x55
-	.4byte	0x14b7c
+	.4byte	0x14b6f
 	.uleb128 0x55
-	.4byte	0x14b70
+	.4byte	0x14b63
 	.uleb128 0x4f
 	.8byte	.LVL598
-	.4byte	0x152a7
+	.4byte	0x1529a
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a39
+	.4byte	0x14a2c
 	.8byte	.LBB1638
 	.8byte	.LBE1638-.LBB1638
 	.byte	0x1
-	.2byte	0xbc2
+	.2byte	0xbca
 	.4byte	0xeb2e
 	.uleb128 0x55
-	.4byte	0x14a49
+	.4byte	0x14a3c
 	.uleb128 0x5d
-	.4byte	0x14b41
+	.4byte	0x14b34
 	.8byte	.LBB1639
 	.8byte	.LBE1639-.LBB1639
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x55
-	.4byte	0x14b52
+	.4byte	0x14b45
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a5c
+	.4byte	0x14a4f
 	.8byte	.LBB1641
 	.8byte	.LBE1641-.LBB1641
 	.byte	0x1
-	.2byte	0xbdd
+	.2byte	0xbe5
 	.4byte	0xeb6e
 	.uleb128 0x55
-	.4byte	0x14a6d
+	.4byte	0x14a60
 	.uleb128 0x5e
-	.4byte	0x14b41
+	.4byte	0x14b34
 	.8byte	.LBB1642
 	.8byte	.LBE1642-.LBB1642
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x55
-	.4byte	0x14b52
+	.4byte	0x14b45
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
@@ -40686,7 +40683,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1644
 	.4byte	.Ldebug_ranges0+0xce0
 	.byte	0x1
-	.2byte	0xbf1
+	.2byte	0xbf9
 	.4byte	0xf543
 	.uleb128 0x55
 	.4byte	0x117cf
@@ -40695,760 +40692,760 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	0x117db
 	.uleb128 0x5c
-	.4byte	0x14a80
+	.4byte	0x14a73
 	.8byte	.LBB1646
 	.4byte	.Ldebug_ranges0+0xd30
 	.byte	0x1
-	.2byte	0x8e3
+	.2byte	0x8eb
 	.4byte	0xebfe
 	.uleb128 0x55
-	.4byte	0x14aa8
+	.4byte	0x14a9b
 	.uleb128 0x55
-	.4byte	0x14a9c
+	.4byte	0x14a8f
 	.uleb128 0x55
-	.4byte	0x14a91
+	.4byte	0x14a84
 	.uleb128 0x60
-	.4byte	0x14ab5
+	.4byte	0x14aa8
 	.8byte	.LBB1647
 	.4byte	.Ldebug_ranges0+0xd30
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ae9
+	.4byte	0x14adc
 	.uleb128 0x55
-	.4byte	0x14add
+	.4byte	0x14ad0
 	.uleb128 0x55
-	.4byte	0x14ad1
+	.4byte	0x14ac4
 	.uleb128 0x55
-	.4byte	0x14ac6
+	.4byte	0x14ab9
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xd30
 	.uleb128 0x58
-	.4byte	0x14af4
+	.4byte	0x14ae7
 	.uleb128 0x4f
 	.8byte	.LVL623
-	.4byte	0x152b4
+	.4byte	0x152a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a80
+	.4byte	0x14a73
 	.8byte	.LBB1658
 	.8byte	.LBE1658-.LBB1658
 	.byte	0x1
-	.2byte	0x8e6
+	.2byte	0x8ee
 	.4byte	0xec7b
 	.uleb128 0x55
-	.4byte	0x14aa8
+	.4byte	0x14a9b
 	.uleb128 0x55
-	.4byte	0x14a9c
+	.4byte	0x14a8f
 	.uleb128 0x55
-	.4byte	0x14a91
+	.4byte	0x14a84
 	.uleb128 0x5e
-	.4byte	0x14ab5
+	.4byte	0x14aa8
 	.8byte	.LBB1659
 	.8byte	.LBE1659-.LBB1659
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ae9
+	.4byte	0x14adc
 	.uleb128 0x55
-	.4byte	0x14add
+	.4byte	0x14ad0
 	.uleb128 0x55
-	.4byte	0x14ad1
+	.4byte	0x14ac4
 	.uleb128 0x55
-	.4byte	0x14ac6
+	.4byte	0x14ab9
 	.uleb128 0x57
 	.8byte	.LBB1660
 	.8byte	.LBE1660-.LBB1660
 	.uleb128 0x58
-	.4byte	0x14af4
+	.4byte	0x14ae7
 	.uleb128 0x4f
 	.8byte	.LVL624
-	.4byte	0x152b4
+	.4byte	0x152a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a80
+	.4byte	0x14a73
 	.8byte	.LBB1661
 	.8byte	.LBE1661-.LBB1661
 	.byte	0x1
-	.2byte	0x8e9
+	.2byte	0x8f1
 	.4byte	0xecf8
 	.uleb128 0x55
-	.4byte	0x14aa8
+	.4byte	0x14a9b
 	.uleb128 0x55
-	.4byte	0x14a9c
+	.4byte	0x14a8f
 	.uleb128 0x55
-	.4byte	0x14a91
+	.4byte	0x14a84
 	.uleb128 0x5e
-	.4byte	0x14ab5
+	.4byte	0x14aa8
 	.8byte	.LBB1662
 	.8byte	.LBE1662-.LBB1662
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ae9
+	.4byte	0x14adc
 	.uleb128 0x55
-	.4byte	0x14add
+	.4byte	0x14ad0
 	.uleb128 0x55
-	.4byte	0x14ad1
+	.4byte	0x14ac4
 	.uleb128 0x55
-	.4byte	0x14ac6
+	.4byte	0x14ab9
 	.uleb128 0x57
 	.8byte	.LBB1663
 	.8byte	.LBE1663-.LBB1663
 	.uleb128 0x58
-	.4byte	0x14af4
+	.4byte	0x14ae7
 	.uleb128 0x4f
 	.8byte	.LVL625
-	.4byte	0x152b4
+	.4byte	0x152a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a80
+	.4byte	0x14a73
 	.8byte	.LBB1664
 	.8byte	.LBE1664-.LBB1664
 	.byte	0x1
-	.2byte	0x8ec
+	.2byte	0x8f4
 	.4byte	0xed75
 	.uleb128 0x55
-	.4byte	0x14aa8
+	.4byte	0x14a9b
 	.uleb128 0x55
-	.4byte	0x14a9c
+	.4byte	0x14a8f
 	.uleb128 0x55
-	.4byte	0x14a91
+	.4byte	0x14a84
 	.uleb128 0x5e
-	.4byte	0x14ab5
+	.4byte	0x14aa8
 	.8byte	.LBB1665
 	.8byte	.LBE1665-.LBB1665
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ae9
+	.4byte	0x14adc
 	.uleb128 0x55
-	.4byte	0x14add
+	.4byte	0x14ad0
 	.uleb128 0x55
-	.4byte	0x14ad1
+	.4byte	0x14ac4
 	.uleb128 0x55
-	.4byte	0x14ac6
+	.4byte	0x14ab9
 	.uleb128 0x57
 	.8byte	.LBB1666
 	.8byte	.LBE1666-.LBB1666
 	.uleb128 0x58
-	.4byte	0x14af4
+	.4byte	0x14ae7
 	.uleb128 0x4f
 	.8byte	.LVL626
-	.4byte	0x152b4
+	.4byte	0x152a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a80
+	.4byte	0x14a73
 	.8byte	.LBB1667
 	.8byte	.LBE1667-.LBB1667
 	.byte	0x1
-	.2byte	0x8ef
+	.2byte	0x8f7
 	.4byte	0xedf2
 	.uleb128 0x55
-	.4byte	0x14aa8
+	.4byte	0x14a9b
 	.uleb128 0x55
-	.4byte	0x14a9c
+	.4byte	0x14a8f
 	.uleb128 0x55
-	.4byte	0x14a91
+	.4byte	0x14a84
 	.uleb128 0x5e
-	.4byte	0x14ab5
+	.4byte	0x14aa8
 	.8byte	.LBB1668
 	.8byte	.LBE1668-.LBB1668
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ae9
+	.4byte	0x14adc
 	.uleb128 0x55
-	.4byte	0x14add
+	.4byte	0x14ad0
 	.uleb128 0x55
-	.4byte	0x14ad1
+	.4byte	0x14ac4
 	.uleb128 0x55
-	.4byte	0x14ac6
+	.4byte	0x14ab9
 	.uleb128 0x57
 	.8byte	.LBB1669
 	.8byte	.LBE1669-.LBB1669
 	.uleb128 0x58
-	.4byte	0x14af4
+	.4byte	0x14ae7
 	.uleb128 0x4f
 	.8byte	.LVL627
-	.4byte	0x152b4
+	.4byte	0x152a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a80
+	.4byte	0x14a73
 	.8byte	.LBB1670
 	.8byte	.LBE1670-.LBB1670
 	.byte	0x1
-	.2byte	0x8f2
+	.2byte	0x8fa
 	.4byte	0xee6f
 	.uleb128 0x55
-	.4byte	0x14aa8
+	.4byte	0x14a9b
 	.uleb128 0x55
-	.4byte	0x14a9c
+	.4byte	0x14a8f
 	.uleb128 0x55
-	.4byte	0x14a91
+	.4byte	0x14a84
 	.uleb128 0x5e
-	.4byte	0x14ab5
+	.4byte	0x14aa8
 	.8byte	.LBB1671
 	.8byte	.LBE1671-.LBB1671
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ae9
+	.4byte	0x14adc
 	.uleb128 0x55
-	.4byte	0x14add
+	.4byte	0x14ad0
 	.uleb128 0x55
-	.4byte	0x14ad1
+	.4byte	0x14ac4
 	.uleb128 0x55
-	.4byte	0x14ac6
+	.4byte	0x14ab9
 	.uleb128 0x57
 	.8byte	.LBB1672
 	.8byte	.LBE1672-.LBB1672
 	.uleb128 0x58
-	.4byte	0x14af4
+	.4byte	0x14ae7
 	.uleb128 0x4f
 	.8byte	.LVL628
-	.4byte	0x152b4
+	.4byte	0x152a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a80
+	.4byte	0x14a73
 	.8byte	.LBB1673
 	.8byte	.LBE1673-.LBB1673
 	.byte	0x1
-	.2byte	0x8f5
+	.2byte	0x8fd
 	.4byte	0xeeec
 	.uleb128 0x55
-	.4byte	0x14aa8
+	.4byte	0x14a9b
 	.uleb128 0x55
-	.4byte	0x14a9c
+	.4byte	0x14a8f
 	.uleb128 0x55
-	.4byte	0x14a91
+	.4byte	0x14a84
 	.uleb128 0x5e
-	.4byte	0x14ab5
+	.4byte	0x14aa8
 	.8byte	.LBB1674
 	.8byte	.LBE1674-.LBB1674
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ae9
+	.4byte	0x14adc
 	.uleb128 0x55
-	.4byte	0x14add
+	.4byte	0x14ad0
 	.uleb128 0x55
-	.4byte	0x14ad1
+	.4byte	0x14ac4
 	.uleb128 0x55
-	.4byte	0x14ac6
+	.4byte	0x14ab9
 	.uleb128 0x57
 	.8byte	.LBB1675
 	.8byte	.LBE1675-.LBB1675
 	.uleb128 0x58
-	.4byte	0x14af4
+	.4byte	0x14ae7
 	.uleb128 0x4f
 	.8byte	.LVL629
-	.4byte	0x152b4
+	.4byte	0x152a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a80
+	.4byte	0x14a73
 	.8byte	.LBB1676
 	.8byte	.LBE1676-.LBB1676
 	.byte	0x1
-	.2byte	0x8f8
+	.2byte	0x900
 	.4byte	0xef69
 	.uleb128 0x55
-	.4byte	0x14aa8
+	.4byte	0x14a9b
 	.uleb128 0x55
-	.4byte	0x14a9c
+	.4byte	0x14a8f
 	.uleb128 0x55
-	.4byte	0x14a91
+	.4byte	0x14a84
 	.uleb128 0x5e
-	.4byte	0x14ab5
+	.4byte	0x14aa8
 	.8byte	.LBB1677
 	.8byte	.LBE1677-.LBB1677
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ae9
+	.4byte	0x14adc
 	.uleb128 0x55
-	.4byte	0x14add
+	.4byte	0x14ad0
 	.uleb128 0x55
-	.4byte	0x14ad1
+	.4byte	0x14ac4
 	.uleb128 0x55
-	.4byte	0x14ac6
+	.4byte	0x14ab9
 	.uleb128 0x57
 	.8byte	.LBB1678
 	.8byte	.LBE1678-.LBB1678
 	.uleb128 0x58
-	.4byte	0x14af4
+	.4byte	0x14ae7
 	.uleb128 0x4f
 	.8byte	.LVL630
-	.4byte	0x152b4
+	.4byte	0x152a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a80
+	.4byte	0x14a73
 	.8byte	.LBB1679
 	.8byte	.LBE1679-.LBB1679
 	.byte	0x1
-	.2byte	0x8fb
+	.2byte	0x903
 	.4byte	0xefe6
 	.uleb128 0x55
-	.4byte	0x14aa8
+	.4byte	0x14a9b
 	.uleb128 0x55
-	.4byte	0x14a9c
+	.4byte	0x14a8f
 	.uleb128 0x55
-	.4byte	0x14a91
+	.4byte	0x14a84
 	.uleb128 0x5e
-	.4byte	0x14ab5
+	.4byte	0x14aa8
 	.8byte	.LBB1680
 	.8byte	.LBE1680-.LBB1680
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ae9
+	.4byte	0x14adc
 	.uleb128 0x55
-	.4byte	0x14add
+	.4byte	0x14ad0
 	.uleb128 0x55
-	.4byte	0x14ad1
+	.4byte	0x14ac4
 	.uleb128 0x55
-	.4byte	0x14ac6
+	.4byte	0x14ab9
 	.uleb128 0x57
 	.8byte	.LBB1681
 	.8byte	.LBE1681-.LBB1681
 	.uleb128 0x58
-	.4byte	0x14af4
+	.4byte	0x14ae7
 	.uleb128 0x4f
 	.8byte	.LVL631
-	.4byte	0x152b4
+	.4byte	0x152a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a80
+	.4byte	0x14a73
 	.8byte	.LBB1682
 	.8byte	.LBE1682-.LBB1682
 	.byte	0x1
-	.2byte	0x8fe
+	.2byte	0x906
 	.4byte	0xf063
 	.uleb128 0x55
-	.4byte	0x14aa8
+	.4byte	0x14a9b
 	.uleb128 0x55
-	.4byte	0x14a9c
+	.4byte	0x14a8f
 	.uleb128 0x55
-	.4byte	0x14a91
+	.4byte	0x14a84
 	.uleb128 0x5e
-	.4byte	0x14ab5
+	.4byte	0x14aa8
 	.8byte	.LBB1683
 	.8byte	.LBE1683-.LBB1683
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ae9
+	.4byte	0x14adc
 	.uleb128 0x55
-	.4byte	0x14add
+	.4byte	0x14ad0
 	.uleb128 0x55
-	.4byte	0x14ad1
+	.4byte	0x14ac4
 	.uleb128 0x55
-	.4byte	0x14ac6
+	.4byte	0x14ab9
 	.uleb128 0x57
 	.8byte	.LBB1684
 	.8byte	.LBE1684-.LBB1684
 	.uleb128 0x58
-	.4byte	0x14af4
+	.4byte	0x14ae7
 	.uleb128 0x4f
 	.8byte	.LVL632
-	.4byte	0x152b4
+	.4byte	0x152a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a80
+	.4byte	0x14a73
 	.8byte	.LBB1685
 	.8byte	.LBE1685-.LBB1685
 	.byte	0x1
-	.2byte	0x901
+	.2byte	0x909
 	.4byte	0xf0e0
 	.uleb128 0x55
-	.4byte	0x14aa8
+	.4byte	0x14a9b
 	.uleb128 0x55
-	.4byte	0x14a9c
+	.4byte	0x14a8f
 	.uleb128 0x55
-	.4byte	0x14a91
+	.4byte	0x14a84
 	.uleb128 0x5e
-	.4byte	0x14ab5
+	.4byte	0x14aa8
 	.8byte	.LBB1686
 	.8byte	.LBE1686-.LBB1686
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ae9
+	.4byte	0x14adc
 	.uleb128 0x55
-	.4byte	0x14add
+	.4byte	0x14ad0
 	.uleb128 0x55
-	.4byte	0x14ad1
+	.4byte	0x14ac4
 	.uleb128 0x55
-	.4byte	0x14ac6
+	.4byte	0x14ab9
 	.uleb128 0x57
 	.8byte	.LBB1687
 	.8byte	.LBE1687-.LBB1687
 	.uleb128 0x58
-	.4byte	0x14af4
+	.4byte	0x14ae7
 	.uleb128 0x4f
 	.8byte	.LVL633
-	.4byte	0x152b4
+	.4byte	0x152a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a80
+	.4byte	0x14a73
 	.8byte	.LBB1688
 	.8byte	.LBE1688-.LBB1688
 	.byte	0x1
-	.2byte	0x904
+	.2byte	0x90c
 	.4byte	0xf15d
 	.uleb128 0x55
-	.4byte	0x14aa8
+	.4byte	0x14a9b
 	.uleb128 0x55
-	.4byte	0x14a9c
+	.4byte	0x14a8f
 	.uleb128 0x55
-	.4byte	0x14a91
+	.4byte	0x14a84
 	.uleb128 0x5e
-	.4byte	0x14ab5
+	.4byte	0x14aa8
 	.8byte	.LBB1689
 	.8byte	.LBE1689-.LBB1689
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ae9
+	.4byte	0x14adc
 	.uleb128 0x55
-	.4byte	0x14add
+	.4byte	0x14ad0
 	.uleb128 0x55
-	.4byte	0x14ad1
+	.4byte	0x14ac4
 	.uleb128 0x55
-	.4byte	0x14ac6
+	.4byte	0x14ab9
 	.uleb128 0x57
 	.8byte	.LBB1690
 	.8byte	.LBE1690-.LBB1690
 	.uleb128 0x58
-	.4byte	0x14af4
+	.4byte	0x14ae7
 	.uleb128 0x4f
 	.8byte	.LVL634
-	.4byte	0x152b4
+	.4byte	0x152a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a80
+	.4byte	0x14a73
 	.8byte	.LBB1691
 	.8byte	.LBE1691-.LBB1691
 	.byte	0x1
-	.2byte	0x907
+	.2byte	0x90f
 	.4byte	0xf1da
 	.uleb128 0x55
-	.4byte	0x14aa8
+	.4byte	0x14a9b
 	.uleb128 0x55
-	.4byte	0x14a9c
+	.4byte	0x14a8f
 	.uleb128 0x55
-	.4byte	0x14a91
+	.4byte	0x14a84
 	.uleb128 0x5e
-	.4byte	0x14ab5
+	.4byte	0x14aa8
 	.8byte	.LBB1692
 	.8byte	.LBE1692-.LBB1692
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ae9
+	.4byte	0x14adc
 	.uleb128 0x55
-	.4byte	0x14add
+	.4byte	0x14ad0
 	.uleb128 0x55
-	.4byte	0x14ad1
+	.4byte	0x14ac4
 	.uleb128 0x55
-	.4byte	0x14ac6
+	.4byte	0x14ab9
 	.uleb128 0x57
 	.8byte	.LBB1693
 	.8byte	.LBE1693-.LBB1693
 	.uleb128 0x58
-	.4byte	0x14af4
+	.4byte	0x14ae7
 	.uleb128 0x4f
 	.8byte	.LVL635
-	.4byte	0x152b4
+	.4byte	0x152a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a80
+	.4byte	0x14a73
 	.8byte	.LBB1694
 	.8byte	.LBE1694-.LBB1694
 	.byte	0x1
-	.2byte	0x90a
+	.2byte	0x912
 	.4byte	0xf257
 	.uleb128 0x55
-	.4byte	0x14aa8
+	.4byte	0x14a9b
 	.uleb128 0x55
-	.4byte	0x14a9c
+	.4byte	0x14a8f
 	.uleb128 0x55
-	.4byte	0x14a91
+	.4byte	0x14a84
 	.uleb128 0x5e
-	.4byte	0x14ab5
+	.4byte	0x14aa8
 	.8byte	.LBB1695
 	.8byte	.LBE1695-.LBB1695
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ae9
+	.4byte	0x14adc
 	.uleb128 0x55
-	.4byte	0x14add
+	.4byte	0x14ad0
 	.uleb128 0x55
-	.4byte	0x14ad1
+	.4byte	0x14ac4
 	.uleb128 0x55
-	.4byte	0x14ac6
+	.4byte	0x14ab9
 	.uleb128 0x57
 	.8byte	.LBB1696
 	.8byte	.LBE1696-.LBB1696
 	.uleb128 0x58
-	.4byte	0x14af4
+	.4byte	0x14ae7
 	.uleb128 0x4f
 	.8byte	.LVL636
-	.4byte	0x152b4
+	.4byte	0x152a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a80
+	.4byte	0x14a73
 	.8byte	.LBB1697
 	.8byte	.LBE1697-.LBB1697
 	.byte	0x1
-	.2byte	0x90d
+	.2byte	0x915
 	.4byte	0xf2d4
 	.uleb128 0x55
-	.4byte	0x14aa8
+	.4byte	0x14a9b
 	.uleb128 0x55
-	.4byte	0x14a9c
+	.4byte	0x14a8f
 	.uleb128 0x55
-	.4byte	0x14a91
+	.4byte	0x14a84
 	.uleb128 0x5e
-	.4byte	0x14ab5
+	.4byte	0x14aa8
 	.8byte	.LBB1698
 	.8byte	.LBE1698-.LBB1698
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ae9
+	.4byte	0x14adc
 	.uleb128 0x55
-	.4byte	0x14add
+	.4byte	0x14ad0
 	.uleb128 0x55
-	.4byte	0x14ad1
+	.4byte	0x14ac4
 	.uleb128 0x55
-	.4byte	0x14ac6
+	.4byte	0x14ab9
 	.uleb128 0x57
 	.8byte	.LBB1699
 	.8byte	.LBE1699-.LBB1699
 	.uleb128 0x58
-	.4byte	0x14af4
+	.4byte	0x14ae7
 	.uleb128 0x4f
 	.8byte	.LVL637
-	.4byte	0x152b4
+	.4byte	0x152a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a80
+	.4byte	0x14a73
 	.8byte	.LBB1700
 	.8byte	.LBE1700-.LBB1700
 	.byte	0x1
-	.2byte	0x910
+	.2byte	0x918
 	.4byte	0xf351
 	.uleb128 0x55
-	.4byte	0x14aa8
+	.4byte	0x14a9b
 	.uleb128 0x55
-	.4byte	0x14a9c
+	.4byte	0x14a8f
 	.uleb128 0x55
-	.4byte	0x14a91
+	.4byte	0x14a84
 	.uleb128 0x5e
-	.4byte	0x14ab5
+	.4byte	0x14aa8
 	.8byte	.LBB1701
 	.8byte	.LBE1701-.LBB1701
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ae9
+	.4byte	0x14adc
 	.uleb128 0x55
-	.4byte	0x14add
+	.4byte	0x14ad0
 	.uleb128 0x55
-	.4byte	0x14ad1
+	.4byte	0x14ac4
 	.uleb128 0x55
-	.4byte	0x14ac6
+	.4byte	0x14ab9
 	.uleb128 0x57
 	.8byte	.LBB1702
 	.8byte	.LBE1702-.LBB1702
 	.uleb128 0x58
-	.4byte	0x14af4
+	.4byte	0x14ae7
 	.uleb128 0x4f
 	.8byte	.LVL638
-	.4byte	0x152b4
+	.4byte	0x152a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a80
+	.4byte	0x14a73
 	.8byte	.LBB1703
 	.8byte	.LBE1703-.LBB1703
 	.byte	0x1
-	.2byte	0x913
+	.2byte	0x91b
 	.4byte	0xf3ce
 	.uleb128 0x55
-	.4byte	0x14aa8
+	.4byte	0x14a9b
 	.uleb128 0x55
-	.4byte	0x14a9c
+	.4byte	0x14a8f
 	.uleb128 0x55
-	.4byte	0x14a91
+	.4byte	0x14a84
 	.uleb128 0x5e
-	.4byte	0x14ab5
+	.4byte	0x14aa8
 	.8byte	.LBB1704
 	.8byte	.LBE1704-.LBB1704
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ae9
+	.4byte	0x14adc
 	.uleb128 0x55
-	.4byte	0x14add
+	.4byte	0x14ad0
 	.uleb128 0x55
-	.4byte	0x14ad1
+	.4byte	0x14ac4
 	.uleb128 0x55
-	.4byte	0x14ac6
+	.4byte	0x14ab9
 	.uleb128 0x57
 	.8byte	.LBB1705
 	.8byte	.LBE1705-.LBB1705
 	.uleb128 0x58
-	.4byte	0x14af4
+	.4byte	0x14ae7
 	.uleb128 0x4f
 	.8byte	.LVL639
-	.4byte	0x152b4
+	.4byte	0x152a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a80
+	.4byte	0x14a73
 	.8byte	.LBB1706
 	.8byte	.LBE1706-.LBB1706
 	.byte	0x1
-	.2byte	0x916
+	.2byte	0x91e
 	.4byte	0xf44b
 	.uleb128 0x55
-	.4byte	0x14aa8
+	.4byte	0x14a9b
 	.uleb128 0x55
-	.4byte	0x14a9c
+	.4byte	0x14a8f
 	.uleb128 0x55
-	.4byte	0x14a91
+	.4byte	0x14a84
 	.uleb128 0x5e
-	.4byte	0x14ab5
+	.4byte	0x14aa8
 	.8byte	.LBB1707
 	.8byte	.LBE1707-.LBB1707
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ae9
+	.4byte	0x14adc
 	.uleb128 0x55
-	.4byte	0x14add
+	.4byte	0x14ad0
 	.uleb128 0x55
-	.4byte	0x14ad1
+	.4byte	0x14ac4
 	.uleb128 0x55
-	.4byte	0x14ac6
+	.4byte	0x14ab9
 	.uleb128 0x57
 	.8byte	.LBB1708
 	.8byte	.LBE1708-.LBB1708
 	.uleb128 0x58
-	.4byte	0x14af4
+	.4byte	0x14ae7
 	.uleb128 0x4f
 	.8byte	.LVL640
-	.4byte	0x152b4
+	.4byte	0x152a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a80
+	.4byte	0x14a73
 	.8byte	.LBB1709
 	.8byte	.LBE1709-.LBB1709
 	.byte	0x1
-	.2byte	0x919
+	.2byte	0x921
 	.4byte	0xf4c8
 	.uleb128 0x55
-	.4byte	0x14aa8
+	.4byte	0x14a9b
 	.uleb128 0x55
-	.4byte	0x14a9c
+	.4byte	0x14a8f
 	.uleb128 0x55
-	.4byte	0x14a91
+	.4byte	0x14a84
 	.uleb128 0x5e
-	.4byte	0x14ab5
+	.4byte	0x14aa8
 	.8byte	.LBB1710
 	.8byte	.LBE1710-.LBB1710
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ae9
+	.4byte	0x14adc
 	.uleb128 0x55
-	.4byte	0x14add
+	.4byte	0x14ad0
 	.uleb128 0x55
-	.4byte	0x14ad1
+	.4byte	0x14ac4
 	.uleb128 0x55
-	.4byte	0x14ac6
+	.4byte	0x14ab9
 	.uleb128 0x57
 	.8byte	.LBB1711
 	.8byte	.LBE1711-.LBB1711
 	.uleb128 0x58
-	.4byte	0x14af4
+	.4byte	0x14ae7
 	.uleb128 0x4f
 	.8byte	.LVL641
-	.4byte	0x152b4
+	.4byte	0x152a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x14a80
+	.4byte	0x14a73
 	.8byte	.LBB1712
 	.8byte	.LBE1712-.LBB1712
 	.byte	0x1
-	.2byte	0x91c
+	.2byte	0x924
 	.uleb128 0x55
-	.4byte	0x14aa8
+	.4byte	0x14a9b
 	.uleb128 0x55
-	.4byte	0x14a9c
+	.4byte	0x14a8f
 	.uleb128 0x55
-	.4byte	0x14a91
+	.4byte	0x14a84
 	.uleb128 0x5e
-	.4byte	0x14ab5
+	.4byte	0x14aa8
 	.8byte	.LBB1713
 	.8byte	.LBE1713-.LBB1713
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ae9
+	.4byte	0x14adc
 	.uleb128 0x55
-	.4byte	0x14add
+	.4byte	0x14ad0
 	.uleb128 0x55
-	.4byte	0x14ad1
+	.4byte	0x14ac4
 	.uleb128 0x55
-	.4byte	0x14ac6
+	.4byte	0x14ab9
 	.uleb128 0x57
 	.8byte	.LBB1714
 	.8byte	.LBE1714-.LBB1714
 	.uleb128 0x58
-	.4byte	0x14af4
+	.4byte	0x14ae7
 	.uleb128 0x4f
 	.8byte	.LVL642
-	.4byte	0x152b4
+	.4byte	0x152a7
 	.byte	0
 	.byte	0
 	.byte	0
@@ -41459,7 +41456,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1721
 	.4byte	.Ldebug_ranges0+0xd80
 	.byte	0x1
-	.2byte	0xbfd
+	.2byte	0xc05
 	.4byte	0xf645
 	.uleb128 0x55
 	.4byte	0xfeb8
@@ -41486,53 +41483,53 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	0xff16
 	.uleb128 0x5c
-	.4byte	0x14b95
+	.4byte	0x14b88
 	.8byte	.LBB1723
 	.4byte	.Ldebug_ranges0+0xdf0
 	.byte	0x1
-	.2byte	0xaed
+	.2byte	0xaf5
 	.4byte	0xf5b3
 	.uleb128 0x55
-	.4byte	0x14ba5
+	.4byte	0x14b98
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14b5f
+	.4byte	0x14b52
 	.8byte	.LBB1727
 	.4byte	.Ldebug_ranges0+0xe20
 	.byte	0x1
-	.2byte	0xb0c
+	.2byte	0xb14
 	.4byte	0xf5e8
 	.uleb128 0x55
-	.4byte	0x14b88
+	.4byte	0x14b7b
 	.uleb128 0x55
-	.4byte	0x14b7c
+	.4byte	0x14b6f
 	.uleb128 0x55
-	.4byte	0x14b70
+	.4byte	0x14b63
 	.uleb128 0x4f
 	.8byte	.LVL648
-	.4byte	0x152a7
+	.4byte	0x1529a
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL644
-	.4byte	0x152c1
+	.4byte	0x152b4
 	.uleb128 0x4f
 	.8byte	.LVL645
-	.4byte	0x152ce
+	.4byte	0x152c1
 	.uleb128 0x4f
 	.8byte	.LVL646
-	.4byte	0x152da
+	.4byte	0x152cd
 	.uleb128 0x4f
 	.8byte	.LVL647
-	.4byte	0x152e6
+	.4byte	0x152d9
 	.uleb128 0x4f
 	.8byte	.LVL649
-	.4byte	0x152f2
+	.4byte	0x152e5
 	.uleb128 0x4f
 	.8byte	.LVL650
-	.4byte	0x152fc
+	.4byte	0x152ef
 	.uleb128 0x4f
 	.8byte	.LVL663
-	.4byte	0x15308
+	.4byte	0x152fb
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
@@ -41540,7 +41537,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1738
 	.4byte	.Ldebug_ranges0+0xe50
 	.byte	0x1
-	.2byte	0xc04
+	.2byte	0xc0c
 	.4byte	0xf71e
 	.uleb128 0x55
 	.4byte	0xff32
@@ -41566,39 +41563,39 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	0xff84
 	.uleb128 0x5c
-	.4byte	0x14b95
+	.4byte	0x14b88
 	.8byte	.LBB1740
 	.4byte	.Ldebug_ranges0+0xea0
 	.byte	0x1
-	.2byte	0xabd
+	.2byte	0xac5
 	.4byte	0xf6b4
 	.uleb128 0x55
-	.4byte	0x14ba5
+	.4byte	0x14b98
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL652
-	.4byte	0x152c1
+	.4byte	0x152b4
 	.uleb128 0x4f
 	.8byte	.LVL653
-	.4byte	0x152ce
+	.4byte	0x152c1
 	.uleb128 0x4f
 	.8byte	.LVL667
-	.4byte	0x152da
+	.4byte	0x152cd
 	.uleb128 0x4f
 	.8byte	.LVL668
-	.4byte	0x15315
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL754
-	.4byte	0x15308
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL755
-	.4byte	0x15321
+	.4byte	0x15314
 	.uleb128 0x4f
 	.8byte	.LVL756
-	.4byte	0x15308
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL769
-	.4byte	0x15308
+	.4byte	0x152fb
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
@@ -41606,7 +41603,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1749
 	.4byte	.Ldebug_ranges0+0xed0
 	.byte	0x1
-	.2byte	0xc0b
+	.2byte	0xc13
 	.4byte	0xf8b8
 	.uleb128 0x55
 	.4byte	0xfe80
@@ -41618,53 +41615,53 @@ __exitcall_ebc_exit:
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5c
-	.4byte	0x14d5a
+	.4byte	0x14d4d
 	.8byte	.LBB1751
 	.4byte	.Ldebug_ranges0+0xf10
 	.byte	0x1
-	.2byte	0xb19
+	.2byte	0xb21
 	.4byte	0xf7a5
 	.uleb128 0x55
-	.4byte	0x14d67
+	.4byte	0x14d5a
 	.uleb128 0x57
 	.8byte	.LBB1753
 	.8byte	.LBE1753-.LBB1753
 	.uleb128 0x58
-	.4byte	0x14d93
+	.4byte	0x14d86
 	.uleb128 0x5d
-	.4byte	0x14f3f
+	.4byte	0x14f32
 	.8byte	.LBB1754
 	.8byte	.LBE1754-.LBB1754
 	.byte	0xf
 	.byte	0x1c
 	.uleb128 0x55
-	.4byte	0x14f62
+	.4byte	0x14f55
 	.uleb128 0x55
-	.4byte	0x14f56
+	.4byte	0x14f49
 	.uleb128 0x55
-	.4byte	0x14f4c
+	.4byte	0x14f3f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14e7b
+	.4byte	0x14e6e
 	.8byte	.LBB1758
 	.8byte	.LBE1758-.LBB1758
 	.byte	0x1
-	.2byte	0xb23
+	.2byte	0xb2b
 	.4byte	0xf7f0
 	.uleb128 0x55
-	.4byte	0x14e91
+	.4byte	0x14e84
 	.uleb128 0x55
-	.4byte	0x14e88
+	.4byte	0x14e7b
 	.uleb128 0x57
 	.8byte	.LBB1759
 	.8byte	.LBE1759-.LBB1759
 	.uleb128 0x61
-	.4byte	0x14e9a
+	.4byte	0x14e8d
 	.4byte	.LLST205
 	.uleb128 0x61
-	.4byte	0x14ea4
+	.4byte	0x14e97
 	.4byte	.LLST206
 	.byte	0
 	.byte	0
@@ -41676,51 +41673,51 @@ __exitcall_ebc_exit:
 	.4byte	.LLST207
 	.uleb128 0x4f
 	.8byte	.LVL676
-	.4byte	0x1532d
+	.4byte	0x15320
 	.uleb128 0x4f
 	.8byte	.LVL678
-	.4byte	0x15339
+	.4byte	0x1532c
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14e7b
+	.4byte	0x14e6e
 	.8byte	.LBB1762
 	.8byte	.LBE1762-.LBB1762
 	.byte	0x1
-	.2byte	0xb2c
+	.2byte	0xb34
 	.4byte	0xf868
 	.uleb128 0x55
-	.4byte	0x14e91
+	.4byte	0x14e84
 	.uleb128 0x55
-	.4byte	0x14e88
+	.4byte	0x14e7b
 	.uleb128 0x57
 	.8byte	.LBB1763
 	.8byte	.LBE1763-.LBB1763
 	.uleb128 0x61
-	.4byte	0x14e9a
+	.4byte	0x14e8d
 	.4byte	.LLST208
 	.uleb128 0x61
-	.4byte	0x14ea4
+	.4byte	0x14e97
 	.4byte	.LLST209
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL669
-	.4byte	0x15346
+	.4byte	0x15339
 	.uleb128 0x4f
 	.8byte	.LVL670
-	.4byte	0x1532d
+	.4byte	0x15320
 	.uleb128 0x4f
 	.8byte	.LVL671
-	.4byte	0x15353
+	.4byte	0x15346
 	.uleb128 0x4f
 	.8byte	.LVL679
-	.4byte	0x15353
+	.4byte	0x15346
 	.uleb128 0x4f
 	.8byte	.LVL759
-	.4byte	0x15308
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL763
-	.4byte	0x15308
+	.4byte	0x152fb
 	.byte	0
 	.byte	0
 	.uleb128 0x54
@@ -41728,52 +41725,52 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1766
 	.8byte	.LBE1766-.LBB1766
 	.byte	0x1
-	.2byte	0xc12
+	.2byte	0xc1a
 	.4byte	0xf952
 	.uleb128 0x55
 	.4byte	0xfe62
 	.uleb128 0x5c
-	.4byte	0x147b8
+	.4byte	0x147ab
 	.8byte	.LBB1768
 	.4byte	.Ldebug_ranges0+0xf70
 	.byte	0x1
-	.2byte	0xb3c
+	.2byte	0xb44
 	.4byte	0xf91d
 	.uleb128 0x55
-	.4byte	0x147dd
+	.4byte	0x147d0
 	.uleb128 0x55
-	.4byte	0x147d1
+	.4byte	0x147c4
 	.uleb128 0x55
-	.4byte	0x147c5
+	.4byte	0x147b8
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xf70
 	.uleb128 0x61
-	.4byte	0x147e9
+	.4byte	0x147dc
 	.4byte	.LLST210
 	.uleb128 0x4f
 	.8byte	.LVL686
-	.4byte	0x15360
+	.4byte	0x15353
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL687
-	.4byte	0x1536c
+	.4byte	0x1535f
 	.uleb128 0x4f
 	.8byte	.LVL688
-	.4byte	0x15378
+	.4byte	0x1536b
 	.uleb128 0x4f
 	.8byte	.LVL689
-	.4byte	0x1536c
+	.4byte	0x1535f
 	.uleb128 0x4f
 	.8byte	.LVL690
-	.4byte	0x15378
+	.4byte	0x1536b
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xfdb3
 	.8byte	.LBB1778
 	.4byte	.Ldebug_ranges0+0xfd0
 	.byte	0x1
-	.2byte	0xc15
+	.2byte	0xc1d
 	.4byte	0xfbf5
 	.uleb128 0x55
 	.4byte	0xfdd0
@@ -41814,7 +41811,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1780
 	.8byte	.LBE1780-.LBB1780
 	.byte	0x1
-	.2byte	0xb74
+	.2byte	0xb7c
 	.4byte	0xfa34
 	.uleb128 0x55
 	.4byte	0x11893
@@ -41828,153 +41825,153 @@ __exitcall_ebc_exit:
 	.4byte	.LLST219
 	.uleb128 0x4f
 	.8byte	.LVL707
-	.4byte	0x15384
+	.4byte	0x15377
 	.uleb128 0x4f
 	.8byte	.LVL709
-	.4byte	0x152fc
+	.4byte	0x152ef
 	.uleb128 0x4f
 	.8byte	.LVL710
-	.4byte	0x15390
+	.4byte	0x15383
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1493f
+	.4byte	0x14932
 	.8byte	.LBB1782
 	.8byte	.LBE1782-.LBB1782
 	.byte	0x1
-	.2byte	0xb5a
+	.2byte	0xb62
 	.4byte	0xfa8b
 	.uleb128 0x55
-	.4byte	0x1495c
+	.4byte	0x1494f
 	.uleb128 0x55
-	.4byte	0x14950
+	.4byte	0x14943
 	.uleb128 0x5e
-	.4byte	0x14969
+	.4byte	0x1495c
 	.8byte	.LBB1783
 	.8byte	.LBE1783-.LBB1783
 	.byte	0x11
 	.2byte	0x2e7
 	.uleb128 0x55
-	.4byte	0x14986
+	.4byte	0x14979
 	.uleb128 0x55
-	.4byte	0x1497a
+	.4byte	0x1496d
 	.uleb128 0x4f
 	.8byte	.LVL727
-	.4byte	0x1539c
+	.4byte	0x1538f
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1493f
+	.4byte	0x14932
 	.8byte	.LBB1785
 	.8byte	.LBE1785-.LBB1785
 	.byte	0x1
-	.2byte	0xb68
+	.2byte	0xb70
 	.4byte	0xfae2
 	.uleb128 0x55
-	.4byte	0x1495c
+	.4byte	0x1494f
 	.uleb128 0x55
-	.4byte	0x14950
+	.4byte	0x14943
 	.uleb128 0x5e
-	.4byte	0x14969
+	.4byte	0x1495c
 	.8byte	.LBB1786
 	.8byte	.LBE1786-.LBB1786
 	.byte	0x11
 	.2byte	0x2e7
 	.uleb128 0x55
-	.4byte	0x14986
+	.4byte	0x14979
 	.uleb128 0x55
-	.4byte	0x1497a
+	.4byte	0x1496d
 	.uleb128 0x4f
 	.8byte	.LVL740
-	.4byte	0x1539c
+	.4byte	0x1538f
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL692
-	.4byte	0x153a9
+	.4byte	0x1539c
 	.uleb128 0x4f
 	.8byte	.LVL694
-	.4byte	0x153a9
+	.4byte	0x1539c
 	.uleb128 0x4f
 	.8byte	.LVL696
-	.4byte	0x153b5
+	.4byte	0x153a8
 	.uleb128 0x4f
 	.8byte	.LVL701
-	.4byte	0x153b5
+	.4byte	0x153a8
 	.uleb128 0x4f
 	.8byte	.LVL705
-	.4byte	0x1528e
+	.4byte	0x15281
 	.uleb128 0x4f
 	.8byte	.LVL706
-	.4byte	0x153c2
+	.4byte	0x153b5
 	.uleb128 0x4f
 	.8byte	.LVL711
-	.4byte	0x153ce
+	.4byte	0x153c1
 	.uleb128 0x4f
 	.8byte	.LVL712
-	.4byte	0x153ce
+	.4byte	0x153c1
 	.uleb128 0x4f
 	.8byte	.LVL724
-	.4byte	0x153da
+	.4byte	0x153cd
 	.uleb128 0x4f
 	.8byte	.LVL726
-	.4byte	0x1528e
+	.4byte	0x15281
 	.uleb128 0x4f
 	.8byte	.LVL731
-	.4byte	0x153e6
+	.4byte	0x153d9
 	.uleb128 0x4f
 	.8byte	.LVL734
-	.4byte	0x15384
+	.4byte	0x15377
 	.uleb128 0x4f
 	.8byte	.LVL736
-	.4byte	0x153e6
+	.4byte	0x153d9
 	.uleb128 0x4f
 	.8byte	.LVL737
-	.4byte	0x15390
+	.4byte	0x15383
 	.uleb128 0x4f
 	.8byte	.LVL739
-	.4byte	0x1528e
+	.4byte	0x15281
 	.uleb128 0x4f
 	.8byte	.LVL743
-	.4byte	0x153e6
+	.4byte	0x153d9
 	.uleb128 0x4f
 	.8byte	.LVL746
-	.4byte	0x15384
+	.4byte	0x15377
 	.uleb128 0x4f
 	.8byte	.LVL748
-	.4byte	0x153e6
+	.4byte	0x153d9
 	.uleb128 0x4f
 	.8byte	.LVL749
-	.4byte	0x15390
+	.4byte	0x15383
 	.uleb128 0x4f
 	.8byte	.LVL774
-	.4byte	0x15308
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL777
-	.4byte	0x15308
+	.4byte	0x152fb
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a13
+	.4byte	0x14a06
 	.8byte	.LBB1791
 	.8byte	.LBE1791-.LBB1791
 	.byte	0x1
-	.2byte	0xc17
+	.2byte	0xc1f
 	.4byte	0xfc3e
 	.uleb128 0x55
-	.4byte	0x14a2c
+	.4byte	0x14a1f
 	.uleb128 0x55
-	.4byte	0x14a20
+	.4byte	0x14a13
 	.uleb128 0x5d
-	.4byte	0x14b1b
+	.4byte	0x14b0e
 	.8byte	.LBB1792
 	.8byte	.LBE1792-.LBB1792
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x55
-	.4byte	0x14b34
+	.4byte	0x14b27
 	.uleb128 0x55
-	.4byte	0x14b28
+	.4byte	0x14b1b
 	.byte	0
 	.byte	0
 	.uleb128 0x54
@@ -41982,289 +41979,289 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1794
 	.8byte	.LBE1794-.LBB1794
 	.byte	0x1
-	.2byte	0xc1a
+	.2byte	0xc22
 	.4byte	0xfcd5
 	.uleb128 0x55
 	.4byte	0xffb8
 	.uleb128 0x4f
 	.8byte	.LVL713
-	.4byte	0x153f0
+	.4byte	0x153e3
 	.uleb128 0x4f
 	.8byte	.LVL714
-	.4byte	0x153f0
+	.4byte	0x153e3
 	.uleb128 0x4f
 	.8byte	.LVL715
-	.4byte	0x153fc
+	.4byte	0x153ef
 	.uleb128 0x4f
 	.8byte	.LVL716
-	.4byte	0x153fc
+	.4byte	0x153ef
 	.uleb128 0x4f
 	.8byte	.LVL717
-	.4byte	0x153fc
+	.4byte	0x153ef
 	.uleb128 0x4f
 	.8byte	.LVL718
-	.4byte	0x153fc
+	.4byte	0x153ef
 	.uleb128 0x4f
 	.8byte	.LVL719
-	.4byte	0x153fc
+	.4byte	0x153ef
 	.uleb128 0x4f
 	.8byte	.LVL720
-	.4byte	0x153fc
+	.4byte	0x153ef
 	.uleb128 0x4f
 	.8byte	.LVL721
-	.4byte	0x153fc
+	.4byte	0x153ef
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL599
-	.4byte	0x152c1
+	.4byte	0x152b4
 	.uleb128 0x4f
 	.8byte	.LVL600
-	.4byte	0x15409
+	.4byte	0x153fc
 	.uleb128 0x4f
 	.8byte	.LVL602
-	.4byte	0x15415
+	.4byte	0x15408
 	.uleb128 0x4f
 	.8byte	.LVL608
-	.4byte	0x15422
+	.4byte	0x15415
 	.uleb128 0x4f
 	.8byte	.LVL611
-	.4byte	0x1542f
+	.4byte	0x15422
 	.uleb128 0x4f
 	.8byte	.LVL612
-	.4byte	0x15308
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL620
-	.4byte	0x1528e
+	.4byte	0x15281
 	.uleb128 0x4f
 	.8byte	.LVL654
-	.4byte	0x15308
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL656
-	.4byte	0x15308
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL659
-	.4byte	0x15308
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL661
-	.4byte	0x15308
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL664
-	.4byte	0x15308
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL722
-	.4byte	0x1528e
+	.4byte	0x15281
 	.uleb128 0x4f
 	.8byte	.LVL752
-	.4byte	0x15308
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL760
-	.4byte	0x15308
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL765
-	.4byte	0x15308
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL779
-	.4byte	0x1543c
+	.4byte	0x1542f
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0xb48
+	.2byte	0xb50
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfe55
 	.uleb128 0x65
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xb48
+	.2byte	0xb50
 	.4byte	0xe557
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xb48
+	.2byte	0xb50
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xb4a
+	.2byte	0xb52
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0xb4b
+	.2byte	0xb53
 	.4byte	0x6d
 	.uleb128 0x48
 	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0xb4c
+	.2byte	0xb54
 	.4byte	0x6d
 	.uleb128 0x48
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0xb4d
+	.2byte	0xb55
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0xb4e
+	.2byte	0xb56
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0xb4f
+	.2byte	0xb57
 	.4byte	0x21e
 	.uleb128 0x48
 	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0xb50
+	.2byte	0xb58
 	.4byte	0x21e
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xb51
+	.2byte	0xb59
 	.4byte	0xe4f2
 	.uleb128 0x48
 	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0xb52
+	.2byte	0xb5a
 	.4byte	0x458
 	.uleb128 0x48
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0xb53
+	.2byte	0xb5b
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0xb31
+	.2byte	0xb39
 	.byte	0x1
 	.4byte	0xfe6f
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xb31
+	.2byte	0xb39
 	.4byte	0xe874
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0xb15
+	.2byte	0xb1d
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfea7
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xb15
+	.2byte	0xb1d
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF2480
 	.byte	0x1
-	.2byte	0xb17
+	.2byte	0xb1f
 	.4byte	0xd88a
 	.uleb128 0x68
 	.uleb128 0x53
 	.string	"__k"
 	.byte	0x1
-	.2byte	0xb26
+	.2byte	0xb2e
 	.4byte	0x2f05
 	.byte	0
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0xad6
+	.2byte	0xade
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xff21
 	.uleb128 0x65
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xad6
+	.2byte	0xade
 	.4byte	0xe557
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xad8
+	.2byte	0xae0
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xad9
+	.2byte	0xae1
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xada
+	.2byte	0xae2
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0xadb
+	.2byte	0xae3
 	.4byte	0xb904
 	.uleb128 0x53
 	.string	"r"
 	.byte	0x1
-	.2byte	0xadc
+	.2byte	0xae4
 	.4byte	0x97bc
 	.uleb128 0x48
 	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0xadd
+	.2byte	0xae5
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xade
+	.2byte	0xae6
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0xade
+	.2byte	0xae6
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0xaaa
+	.2byte	0xab2
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xff92
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xaaa
+	.2byte	0xab2
 	.4byte	0xe874
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xaac
+	.2byte	0xab4
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xaad
+	.2byte	0xab5
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0xaae
+	.2byte	0xab6
 	.4byte	0xb904
 	.uleb128 0x53
 	.string	"r"
 	.byte	0x1
-	.2byte	0xaaf
+	.2byte	0xab7
 	.4byte	0x97bc
 	.uleb128 0x48
 	.4byte	.LASF2982
 	.byte	0x1
-	.2byte	0xab0
+	.2byte	0xab8
 	.4byte	0x29
 	.uleb128 0x48
 	.4byte	.LASF2983
 	.byte	0x1
-	.2byte	0xab1
+	.2byte	0xab9
 	.4byte	0xc6
 	.uleb128 0x69
 	.4byte	.LASF3050
@@ -42283,20 +42280,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x64
 	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0xa9a
+	.2byte	0xaa2
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xffc5
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xa9a
+	.2byte	0xaa2
 	.4byte	0xe874
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0xa91
+	.2byte	0xa99
 	.4byte	0x2ee
 	.8byte	.LFB2855
 	.8byte	.LFE2855-.LFB2855
@@ -42306,29 +42303,29 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa91
+	.2byte	0xa99
 	.4byte	0xa5e0
 	.4byte	.LLST78
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa92
+	.2byte	0xa9a
 	.4byte	0xb45b
 	.4byte	.LLST79
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa93
+	.2byte	0xa9b
 	.4byte	0x21e
 	.4byte	.LLST80
 	.uleb128 0x4f
 	.8byte	.LVL309
-	.4byte	0x15446
+	.4byte	0x15439
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0xa88
+	.2byte	0xa90
 	.4byte	0x2ee
 	.8byte	.LFB2854
 	.8byte	.LFE2854-.LFB2854
@@ -42338,29 +42335,29 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa88
+	.2byte	0xa90
 	.4byte	0xa5e0
 	.4byte	.LLST81
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa89
+	.2byte	0xa91
 	.4byte	0xb45b
 	.4byte	.LLST82
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa8a
+	.2byte	0xa92
 	.4byte	0x21e
 	.4byte	.LLST83
 	.uleb128 0x4f
 	.8byte	.LVL314
-	.4byte	0x15452
+	.4byte	0x15445
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0xa7f
+	.2byte	0xa87
 	.4byte	0x2ee
 	.8byte	.LFB2853
 	.8byte	.LFE2853-.LFB2853
@@ -42370,29 +42367,29 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa7f
+	.2byte	0xa87
 	.4byte	0xa5e0
 	.4byte	.LLST84
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa80
+	.2byte	0xa88
 	.4byte	0xb45b
 	.4byte	.LLST85
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa81
+	.2byte	0xa89
 	.4byte	0x21e
 	.4byte	.LLST86
 	.uleb128 0x4f
 	.8byte	.LVL319
-	.4byte	0x15452
+	.4byte	0x15445
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0xa67
+	.2byte	0xa6f
 	.4byte	0x2ee
 	.8byte	.LFB2852
 	.8byte	.LFE2852-.LFB2852
@@ -42402,64 +42399,64 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa67
+	.2byte	0xa6f
 	.4byte	0xa5e0
 	.4byte	.LLST96
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa68
+	.2byte	0xa70
 	.4byte	0xb45b
 	.4byte	.LLST97
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa69
+	.2byte	0xa71
 	.4byte	0x56
 	.4byte	.LLST98
 	.uleb128 0x59
 	.4byte	.LASF383
 	.byte	0x1
-	.2byte	0xa69
+	.2byte	0xa71
 	.4byte	0x2e3
 	.4byte	.LLST99
 	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa6b
+	.2byte	0xa73
 	.4byte	0xe557
 	.4byte	.LLST100
 	.uleb128 0x5a
 	.4byte	.LASF2470
 	.byte	0x1
-	.2byte	0xa6c
+	.2byte	0xa74
 	.4byte	0xc6
 	.4byte	.LLST101
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xa6c
+	.2byte	0xa74
 	.4byte	0xc6
 	.uleb128 0x4f
 	.8byte	.LVL345
-	.4byte	0x1545f
+	.4byte	0x15452
 	.uleb128 0x4f
 	.8byte	.LVL347
-	.4byte	0x1546c
+	.4byte	0x1545f
 	.uleb128 0x4f
 	.8byte	.LVL352
-	.4byte	0x15308
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL355
-	.4byte	0x15308
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL356
-	.4byte	0x1543c
+	.4byte	0x1542f
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0xa5b
+	.2byte	0xa63
 	.4byte	0x2ee
 	.8byte	.LFB2851
 	.8byte	.LFE2851-.LFB2851
@@ -42469,49 +42466,49 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa5b
+	.2byte	0xa63
 	.4byte	0xa5e0
 	.4byte	.LLST87
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa5c
+	.2byte	0xa64
 	.4byte	0xb45b
 	.4byte	.LLST88
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa5d
+	.2byte	0xa65
 	.4byte	0x21e
 	.4byte	.LLST89
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa5f
+	.2byte	0xa67
 	.4byte	0xe557
 	.uleb128 0x48
 	.4byte	.LASF2470
 	.byte	0x1
-	.2byte	0xa60
+	.2byte	0xa68
 	.4byte	0xc6
 	.uleb128 0x54
-	.4byte	0x146c6
+	.4byte	0x146b9
 	.8byte	.LBB1234
 	.8byte	.LBE1234-.LBB1234
 	.byte	0x1
-	.2byte	0xa62
+	.2byte	0xa6a
 	.4byte	0x10241
 	.uleb128 0x55
-	.4byte	0x146d6
+	.4byte	0x146c9
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL324
-	.4byte	0x15452
+	.4byte	0x15445
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0xa4d
+	.2byte	0xa55
 	.4byte	0x2ee
 	.8byte	.LFB2850
 	.8byte	.LFE2850-.LFB2850
@@ -42521,57 +42518,57 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa4d
+	.2byte	0xa55
 	.4byte	0xa5e0
 	.4byte	.LLST90
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa4e
+	.2byte	0xa56
 	.4byte	0xb45b
 	.4byte	.LLST91
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa4f
+	.2byte	0xa57
 	.4byte	0x21e
 	.4byte	.LLST92
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa51
+	.2byte	0xa59
 	.4byte	0xe557
 	.uleb128 0x6a
 	.string	"t"
 	.byte	0x1
-	.2byte	0xa52
+	.2byte	0xa5a
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x5c
-	.4byte	0x146e3
+	.4byte	0x146d6
 	.8byte	.LBB1236
 	.4byte	.Ldebug_ranges0+0x6a0
 	.byte	0x1
-	.2byte	0xa54
+	.2byte	0xa5c
 	.4byte	0x102dd
 	.uleb128 0x55
-	.4byte	0x146ff
+	.4byte	0x146f2
 	.uleb128 0x55
-	.4byte	0x146f3
+	.4byte	0x146e6
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL331
-	.4byte	0x15452
+	.4byte	0x15445
 	.uleb128 0x4f
 	.8byte	.LVL334
-	.4byte	0x1543c
+	.4byte	0x1542f
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0xa42
+	.2byte	0xa4a
 	.4byte	0x2ee
 	.8byte	.LFB2849
 	.8byte	.LFE2849-.LFB2849
@@ -42581,34 +42578,34 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa42
+	.2byte	0xa4a
 	.4byte	0xa5e0
 	.4byte	.LLST93
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa43
+	.2byte	0xa4b
 	.4byte	0xb45b
 	.4byte	.LLST94
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa44
+	.2byte	0xa4c
 	.4byte	0x21e
 	.4byte	.LLST95
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa46
+	.2byte	0xa4e
 	.4byte	0xe557
 	.uleb128 0x4f
 	.8byte	.LVL339
-	.4byte	0x15452
+	.4byte	0x15445
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0xa37
+	.2byte	0xa3f
 	.4byte	0x2ee
 	.8byte	.LFB2848
 	.8byte	.LFE2848-.LFB2848
@@ -42618,55 +42615,55 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa37
+	.2byte	0xa3f
 	.4byte	0xa5e0
 	.4byte	.LLST102
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa38
+	.2byte	0xa40
 	.4byte	0xb45b
 	.4byte	.LLST103
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa39
+	.2byte	0xa41
 	.4byte	0x21e
 	.4byte	.LLST104
 	.uleb128 0x48
 	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0xa3b
+	.2byte	0xa43
 	.4byte	0x56
 	.uleb128 0x4f
 	.8byte	.LVL358
-	.4byte	0x15478
+	.4byte	0x1546b
 	.uleb128 0x4f
 	.8byte	.LVL359
-	.4byte	0x15452
+	.4byte	0x15445
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0xa24
+	.2byte	0xa2c
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x10407
 	.uleb128 0x66
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0xa24
+	.2byte	0xa2c
 	.4byte	0x1c7f
 	.uleb128 0x66
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0xa24
+	.2byte	0xa2c
 	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0xa14
+	.2byte	0xa1c
 	.4byte	0xc6
 	.8byte	.LFB2846
 	.8byte	.LFE2846-.LFB2846
@@ -42676,50 +42673,50 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0xa14
+	.2byte	0xa1c
 	.4byte	0x55cc
 	.4byte	.LLST16
 	.uleb128 0x52
 	.string	"vma"
 	.byte	0x1
-	.2byte	0xa14
+	.2byte	0xa1c
 	.4byte	0x3d25
 	.4byte	.LLST17
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xa16
+	.2byte	0xa1e
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF898
 	.byte	0x1
-	.2byte	0xa17
+	.2byte	0xa1f
 	.4byte	0x29
 	.uleb128 0x4f
 	.8byte	.LVL82
-	.4byte	0x15484
+	.4byte	0x15477
 	.byte	0
 	.uleb128 0x6b
 	.4byte	.LASF3085
 	.byte	0x1
-	.2byte	0x9fd
+	.2byte	0xa05
 	.4byte	0xc6
 	.4byte	0x10498
 	.uleb128 0x66
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0x9fd
+	.2byte	0xa05
 	.4byte	0x1c7f
 	.uleb128 0x66
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x9fd
+	.2byte	0xa05
 	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0x9ee
+	.2byte	0x9f6
 	.4byte	0xc6
 	.8byte	.LFB2844
 	.8byte	.LFE2844-.LFB2844
@@ -42729,31 +42726,31 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x9ee
+	.2byte	0x9f6
 	.4byte	0x55cc
 	.4byte	.LLST14
 	.uleb128 0x52
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x9ee
+	.2byte	0x9f6
 	.4byte	0x3d25
 	.4byte	.LLST15
 	.uleb128 0x48
 	.4byte	.LASF898
 	.byte	0x1
-	.2byte	0x9f0
+	.2byte	0x9f8
 	.4byte	0x29
 	.uleb128 0x4f
 	.8byte	.LVL76
-	.4byte	0x15491
+	.4byte	0x15484
 	.uleb128 0x4f
 	.8byte	.LVL77
-	.4byte	0x15484
+	.4byte	0x15477
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3087
 	.byte	0x1
-	.2byte	0x922
+	.2byte	0x92a
 	.4byte	0x199
 	.8byte	.LFB2843
 	.8byte	.LFE2843-.LFB2843
@@ -42763,40 +42760,40 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x922
+	.2byte	0x92a
 	.4byte	0x55cc
 	.4byte	.LLST18
 	.uleb128 0x52
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0x922
+	.2byte	0x92a
 	.4byte	0x6d
 	.4byte	.LLST19
 	.uleb128 0x52
 	.string	"arg"
 	.byte	0x1
-	.2byte	0x922
+	.2byte	0x92a
 	.4byte	0x29
 	.4byte	.LLST20
 	.uleb128 0x48
 	.4byte	.LASF3088
 	.byte	0x1
-	.2byte	0x924
+	.2byte	0x92c
 	.4byte	0x458
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x925
+	.2byte	0x92d
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x926
+	.2byte	0x92e
 	.4byte	0xe874
 	.uleb128 0x4d
 	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x927
+	.2byte	0x92f
 	.4byte	0xda8e
 	.uleb128 0x2
 	.byte	0x91
@@ -42804,22 +42801,22 @@ __exitcall_ebc_exit:
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x928
+	.2byte	0x930
 	.4byte	0xe4f2
 	.uleb128 0x48
 	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x929
+	.2byte	0x931
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x92a
+	.2byte	0x932
 	.4byte	0x29
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x92b
+	.2byte	0x933
 	.4byte	0xc6
 	.uleb128 0x56
 	.4byte	.LASF3050
@@ -42833,19 +42830,19 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x977
+	.2byte	0x97f
 	.4byte	0xc6
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1a0
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x977
+	.2byte	0x97f
 	.8byte	.L216
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x977
+	.2byte	0x97f
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -42853,7 +42850,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x977
+	.2byte	0x97f
 	.4byte	0x199
 	.uleb128 0x6d
 	.8byte	.LBB1026
@@ -42862,71 +42859,71 @@ __exitcall_ebc_exit:
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x977
+	.2byte	0x97f
 	.4byte	0x199
 	.4byte	.LLST35
 	.uleb128 0x4f
 	.8byte	.LVL127
-	.4byte	0x1549d
+	.4byte	0x15490
 	.uleb128 0x4f
 	.8byte	.LVL128
-	.4byte	0x154a9
+	.4byte	0x1549c
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL125
-	.4byte	0x154b6
+	.4byte	0x154a9
 	.uleb128 0x4f
 	.8byte	.LVL129
-	.4byte	0x154c2
+	.4byte	0x154b5
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x147f4
+	.4byte	0x147e7
 	.8byte	.LBB962
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x9e0
+	.2byte	0x9e8
 	.4byte	0x1088b
 	.uleb128 0x55
-	.4byte	0x1481a
+	.4byte	0x1480d
 	.uleb128 0x55
-	.4byte	0x1480e
+	.4byte	0x14801
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x147f7
 	.uleb128 0x6e
-	.4byte	0x14854
+	.4byte	0x14847
 	.8byte	.LBB963
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1487a
+	.4byte	0x1486d
 	.uleb128 0x55
-	.4byte	0x1486e
+	.4byte	0x14861
 	.uleb128 0x55
-	.4byte	0x14864
+	.4byte	0x14857
 	.uleb128 0x6f
-	.4byte	0x148f3
+	.4byte	0x148e6
 	.8byte	.LBB965
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x107c1
 	.uleb128 0x55
-	.4byte	0x1490f
+	.4byte	0x14902
 	.uleb128 0x70
-	.4byte	0x14903
+	.4byte	0x148f6
 	.4byte	.LLST21
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x80
 	.uleb128 0x61
-	.4byte	0x1491b
+	.4byte	0x1490e
 	.4byte	.LLST22
 	.uleb128 0x61
-	.4byte	0x14926
+	.4byte	0x14919
 	.4byte	.LLST23
 	.uleb128 0x71
-	.4byte	0x14d3e
+	.4byte	0x14d31
 	.8byte	.LBB967
 	.8byte	.LBE967-.LBB967
 	.byte	0x6
@@ -42936,99 +42933,99 @@ __exitcall_ebc_exit:
 	.8byte	.LBB968
 	.8byte	.LBE968-.LBB968
 	.uleb128 0x61
-	.4byte	0x14d4e
+	.4byte	0x14d41
 	.4byte	.LLST24
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14d11
+	.4byte	0x14d04
 	.8byte	.LBB969
 	.8byte	.LBE969-.LBB969
 	.byte	0x6
 	.byte	0x55
 	.4byte	0x1076f
 	.uleb128 0x55
-	.4byte	0x14d2b
+	.4byte	0x14d1e
 	.uleb128 0x55
-	.4byte	0x14d21
+	.4byte	0x14d14
 	.uleb128 0x5d
-	.4byte	0x14e4e
+	.4byte	0x14e41
 	.8byte	.LBB970
 	.8byte	.LBE970-.LBB970
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14e68
+	.4byte	0x14e5b
 	.uleb128 0x55
-	.4byte	0x14e5e
+	.4byte	0x14e51
 	.byte	0
 	.byte	0
 	.uleb128 0x57
 	.8byte	.LBB972
 	.8byte	.LBE972-.LBB972
 	.uleb128 0x58
-	.4byte	0x14932
+	.4byte	0x14925
 	.uleb128 0x5d
-	.4byte	0x14dc4
+	.4byte	0x14db7
 	.8byte	.LBB973
 	.8byte	.LBE973-.LBB973
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14de0
+	.4byte	0x14dd3
 	.uleb128 0x55
-	.4byte	0x14dd4
+	.4byte	0x14dc7
 	.uleb128 0x57
 	.8byte	.LBB974
 	.8byte	.LBE974-.LBB974
 	.uleb128 0x58
-	.4byte	0x14dec
+	.4byte	0x14ddf
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x148bf
+	.4byte	0x148b2
 	.8byte	.LBB979
 	.8byte	.LBE979-.LBB979
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x1087c
 	.uleb128 0x55
-	.4byte	0x148cf
+	.4byte	0x148c2
 	.uleb128 0x57
 	.8byte	.LBB980
 	.8byte	.LBE980-.LBB980
 	.uleb128 0x61
-	.4byte	0x148da
+	.4byte	0x148cd
 	.4byte	.LLST25
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0xc0
 	.4byte	0x10847
 	.uleb128 0x61
-	.4byte	0x148e6
+	.4byte	0x148d9
 	.4byte	.LLST26
 	.uleb128 0x5d
-	.4byte	0x14dc4
+	.4byte	0x14db7
 	.8byte	.LBB982
 	.8byte	.LBE982-.LBB982
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14de0
+	.4byte	0x14dd3
 	.uleb128 0x55
-	.4byte	0x14dd4
+	.4byte	0x14dc7
 	.uleb128 0x57
 	.8byte	.LBB983
 	.8byte	.LBE983-.LBB983
 	.uleb128 0x58
-	.4byte	0x14dec
+	.4byte	0x14ddf
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d3e
+	.4byte	0x14d31
 	.8byte	.LBB984
 	.8byte	.LBE984-.LBB984
 	.byte	0x6
@@ -43037,7 +43034,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB985
 	.8byte	.LBE985-.LBB985
 	.uleb128 0x61
-	.4byte	0x14d4e
+	.4byte	0x14d41
 	.4byte	.LLST27
 	.byte	0
 	.byte	0
@@ -43045,60 +43042,60 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL155
-	.4byte	0x154cf
+	.4byte	0x154c2
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14824
+	.4byte	0x14817
 	.8byte	.LBB995
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
-	.2byte	0x962
+	.2byte	0x96a
 	.4byte	0x10ab6
 	.uleb128 0x55
-	.4byte	0x1484a
+	.4byte	0x1483d
 	.uleb128 0x55
-	.4byte	0x1483e
+	.4byte	0x14831
 	.uleb128 0x55
-	.4byte	0x14834
+	.4byte	0x14827
 	.uleb128 0x6e
-	.4byte	0x14884
+	.4byte	0x14877
 	.8byte	.LBB996
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x148aa
+	.4byte	0x1489d
 	.uleb128 0x55
-	.4byte	0x1489e
+	.4byte	0x14891
 	.uleb128 0x55
-	.4byte	0x14894
+	.4byte	0x14887
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x58
-	.4byte	0x148b3
+	.4byte	0x148a6
 	.uleb128 0x6f
-	.4byte	0x148f3
+	.4byte	0x148e6
 	.8byte	.LBB998
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x109eb
 	.uleb128 0x55
-	.4byte	0x1490f
+	.4byte	0x14902
 	.uleb128 0x70
-	.4byte	0x14903
+	.4byte	0x148f6
 	.4byte	.LLST28
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x130
 	.uleb128 0x61
-	.4byte	0x1491b
+	.4byte	0x1490e
 	.4byte	.LLST29
 	.uleb128 0x61
-	.4byte	0x14926
+	.4byte	0x14919
 	.4byte	.LLST30
 	.uleb128 0x71
-	.4byte	0x14d3e
+	.4byte	0x14d31
 	.8byte	.LBB1000
 	.8byte	.LBE1000-.LBB1000
 	.byte	0x6
@@ -43108,7 +43105,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1001
 	.8byte	.LBE1001-.LBB1001
 	.uleb128 0x61
-	.4byte	0x14d4e
+	.4byte	0x14d41
 	.4byte	.LLST31
 	.byte	0
 	.byte	0
@@ -43117,90 +43114,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1002-.LBB1002
 	.4byte	0x109a5
 	.uleb128 0x58
-	.4byte	0x14932
+	.4byte	0x14925
 	.uleb128 0x5d
-	.4byte	0x14dc4
+	.4byte	0x14db7
 	.8byte	.LBB1003
 	.8byte	.LBE1003-.LBB1003
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14de0
+	.4byte	0x14dd3
 	.uleb128 0x55
-	.4byte	0x14dd4
+	.4byte	0x14dc7
 	.uleb128 0x57
 	.8byte	.LBB1004
 	.8byte	.LBE1004-.LBB1004
 	.uleb128 0x58
-	.4byte	0x14dec
+	.4byte	0x14ddf
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d11
+	.4byte	0x14d04
 	.8byte	.LBB1005
 	.8byte	.LBE1005-.LBB1005
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14d2b
+	.4byte	0x14d1e
 	.uleb128 0x55
-	.4byte	0x14d21
+	.4byte	0x14d14
 	.uleb128 0x5d
-	.4byte	0x14e4e
+	.4byte	0x14e41
 	.8byte	.LBB1006
 	.8byte	.LBE1006-.LBB1006
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14e68
+	.4byte	0x14e5b
 	.uleb128 0x55
-	.4byte	0x14e5e
+	.4byte	0x14e51
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x148bf
+	.4byte	0x148b2
 	.8byte	.LBB1010
 	.8byte	.LBE1010-.LBB1010
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x10aa6
 	.uleb128 0x55
-	.4byte	0x148cf
+	.4byte	0x148c2
 	.uleb128 0x57
 	.8byte	.LBB1011
 	.8byte	.LBE1011-.LBB1011
 	.uleb128 0x61
-	.4byte	0x148da
+	.4byte	0x148cd
 	.4byte	.LLST32
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x170
 	.4byte	0x10a71
 	.uleb128 0x61
-	.4byte	0x148e6
+	.4byte	0x148d9
 	.4byte	.LLST33
 	.uleb128 0x5d
-	.4byte	0x14dc4
+	.4byte	0x14db7
 	.8byte	.LBB1013
 	.8byte	.LBE1013-.LBB1013
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14de0
+	.4byte	0x14dd3
 	.uleb128 0x55
-	.4byte	0x14dd4
+	.4byte	0x14dc7
 	.uleb128 0x57
 	.8byte	.LBB1014
 	.8byte	.LBE1014-.LBB1014
 	.uleb128 0x58
-	.4byte	0x14dec
+	.4byte	0x14ddf
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d3e
+	.4byte	0x14d31
 	.8byte	.LBB1015
 	.8byte	.LBE1015-.LBB1015
 	.byte	0x6
@@ -43209,7 +43206,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1016
 	.8byte	.LBE1016-.LBB1016
 	.uleb128 0x61
-	.4byte	0x14d4e
+	.4byte	0x14d41
 	.4byte	.LLST34
 	.byte	0
 	.byte	0
@@ -43217,61 +43214,61 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL120
-	.4byte	0x154dc
+	.4byte	0x154cf
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14824
+	.4byte	0x14817
 	.8byte	.LBB1030
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
-	.2byte	0x97e
+	.2byte	0x986
 	.4byte	0x10ce1
 	.uleb128 0x55
-	.4byte	0x1484a
+	.4byte	0x1483d
 	.uleb128 0x55
-	.4byte	0x1483e
+	.4byte	0x14831
 	.uleb128 0x55
-	.4byte	0x14834
+	.4byte	0x14827
 	.uleb128 0x6e
-	.4byte	0x14884
+	.4byte	0x14877
 	.8byte	.LBB1031
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x148aa
+	.4byte	0x1489d
 	.uleb128 0x55
-	.4byte	0x1489e
+	.4byte	0x14891
 	.uleb128 0x55
-	.4byte	0x14894
+	.4byte	0x14887
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1f0
 	.uleb128 0x58
-	.4byte	0x148b3
+	.4byte	0x148a6
 	.uleb128 0x6f
-	.4byte	0x148f3
+	.4byte	0x148e6
 	.8byte	.LBB1033
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x10c16
 	.uleb128 0x55
-	.4byte	0x1490f
+	.4byte	0x14902
 	.uleb128 0x70
-	.4byte	0x14903
+	.4byte	0x148f6
 	.4byte	.LLST36
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x230
 	.uleb128 0x61
-	.4byte	0x1491b
+	.4byte	0x1490e
 	.4byte	.LLST37
 	.uleb128 0x61
-	.4byte	0x14926
+	.4byte	0x14919
 	.4byte	.LLST38
 	.uleb128 0x71
-	.4byte	0x14d3e
+	.4byte	0x14d31
 	.8byte	.LBB1035
 	.8byte	.LBE1035-.LBB1035
 	.byte	0x6
@@ -43281,7 +43278,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1036
 	.8byte	.LBE1036-.LBB1036
 	.uleb128 0x61
-	.4byte	0x14d4e
+	.4byte	0x14d41
 	.4byte	.LLST39
 	.byte	0
 	.byte	0
@@ -43290,90 +43287,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1037-.LBB1037
 	.4byte	0x10bd0
 	.uleb128 0x58
-	.4byte	0x14932
+	.4byte	0x14925
 	.uleb128 0x5d
-	.4byte	0x14dc4
+	.4byte	0x14db7
 	.8byte	.LBB1038
 	.8byte	.LBE1038-.LBB1038
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14de0
+	.4byte	0x14dd3
 	.uleb128 0x55
-	.4byte	0x14dd4
+	.4byte	0x14dc7
 	.uleb128 0x57
 	.8byte	.LBB1039
 	.8byte	.LBE1039-.LBB1039
 	.uleb128 0x58
-	.4byte	0x14dec
+	.4byte	0x14ddf
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d11
+	.4byte	0x14d04
 	.8byte	.LBB1040
 	.8byte	.LBE1040-.LBB1040
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14d2b
+	.4byte	0x14d1e
 	.uleb128 0x55
-	.4byte	0x14d21
+	.4byte	0x14d14
 	.uleb128 0x5d
-	.4byte	0x14e4e
+	.4byte	0x14e41
 	.8byte	.LBB1041
 	.8byte	.LBE1041-.LBB1041
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14e68
+	.4byte	0x14e5b
 	.uleb128 0x55
-	.4byte	0x14e5e
+	.4byte	0x14e51
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x148bf
+	.4byte	0x148b2
 	.8byte	.LBB1045
 	.8byte	.LBE1045-.LBB1045
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x10cd1
 	.uleb128 0x55
-	.4byte	0x148cf
+	.4byte	0x148c2
 	.uleb128 0x57
 	.8byte	.LBB1046
 	.8byte	.LBE1046-.LBB1046
 	.uleb128 0x61
-	.4byte	0x148da
+	.4byte	0x148cd
 	.4byte	.LLST40
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x270
 	.4byte	0x10c9c
 	.uleb128 0x61
-	.4byte	0x148e6
+	.4byte	0x148d9
 	.4byte	.LLST41
 	.uleb128 0x5d
-	.4byte	0x14dc4
+	.4byte	0x14db7
 	.8byte	.LBB1048
 	.8byte	.LBE1048-.LBB1048
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14de0
+	.4byte	0x14dd3
 	.uleb128 0x55
-	.4byte	0x14dd4
+	.4byte	0x14dc7
 	.uleb128 0x57
 	.8byte	.LBB1049
 	.8byte	.LBE1049-.LBB1049
 	.uleb128 0x58
-	.4byte	0x14dec
+	.4byte	0x14ddf
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d3e
+	.4byte	0x14d31
 	.8byte	.LBB1050
 	.8byte	.LBE1050-.LBB1050
 	.byte	0x6
@@ -43382,7 +43379,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1051
 	.8byte	.LBE1051-.LBB1051
 	.uleb128 0x61
-	.4byte	0x14d4e
+	.4byte	0x14d41
 	.4byte	.LLST42
 	.byte	0
 	.byte	0
@@ -43390,57 +43387,57 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL144
-	.4byte	0x154dc
+	.4byte	0x154cf
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x147f4
+	.4byte	0x147e7
 	.8byte	.LBB1060
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
-	.2byte	0x94b
+	.2byte	0x953
 	.4byte	0x10f01
 	.uleb128 0x55
-	.4byte	0x1481a
+	.4byte	0x1480d
 	.uleb128 0x55
-	.4byte	0x1480e
+	.4byte	0x14801
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x147f7
 	.uleb128 0x6e
-	.4byte	0x14854
+	.4byte	0x14847
 	.8byte	.LBB1061
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1487a
+	.4byte	0x1486d
 	.uleb128 0x55
-	.4byte	0x1486e
+	.4byte	0x14861
 	.uleb128 0x55
-	.4byte	0x14864
+	.4byte	0x14857
 	.uleb128 0x6f
-	.4byte	0x148f3
+	.4byte	0x148e6
 	.8byte	.LBB1063
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x10e37
 	.uleb128 0x55
-	.4byte	0x1490f
+	.4byte	0x14902
 	.uleb128 0x70
-	.4byte	0x14903
+	.4byte	0x148f6
 	.4byte	.LLST43
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x2f0
 	.uleb128 0x61
-	.4byte	0x1491b
+	.4byte	0x1490e
 	.4byte	.LLST44
 	.uleb128 0x61
-	.4byte	0x14926
+	.4byte	0x14919
 	.4byte	.LLST45
 	.uleb128 0x71
-	.4byte	0x14d3e
+	.4byte	0x14d31
 	.8byte	.LBB1065
 	.8byte	.LBE1065-.LBB1065
 	.byte	0x6
@@ -43450,7 +43447,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1066
 	.8byte	.LBE1066-.LBB1066
 	.uleb128 0x61
-	.4byte	0x14d4e
+	.4byte	0x14d41
 	.4byte	.LLST46
 	.byte	0
 	.byte	0
@@ -43459,90 +43456,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1067-.LBB1067
 	.4byte	0x10df1
 	.uleb128 0x58
-	.4byte	0x14932
+	.4byte	0x14925
 	.uleb128 0x5d
-	.4byte	0x14dc4
+	.4byte	0x14db7
 	.8byte	.LBB1068
 	.8byte	.LBE1068-.LBB1068
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14de0
+	.4byte	0x14dd3
 	.uleb128 0x55
-	.4byte	0x14dd4
+	.4byte	0x14dc7
 	.uleb128 0x57
 	.8byte	.LBB1069
 	.8byte	.LBE1069-.LBB1069
 	.uleb128 0x58
-	.4byte	0x14dec
+	.4byte	0x14ddf
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d11
+	.4byte	0x14d04
 	.8byte	.LBB1070
 	.8byte	.LBE1070-.LBB1070
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14d2b
+	.4byte	0x14d1e
 	.uleb128 0x55
-	.4byte	0x14d21
+	.4byte	0x14d14
 	.uleb128 0x5d
-	.4byte	0x14e4e
+	.4byte	0x14e41
 	.8byte	.LBB1071
 	.8byte	.LBE1071-.LBB1071
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14e68
+	.4byte	0x14e5b
 	.uleb128 0x55
-	.4byte	0x14e5e
+	.4byte	0x14e51
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x148bf
+	.4byte	0x148b2
 	.8byte	.LBB1077
 	.8byte	.LBE1077-.LBB1077
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x10ef2
 	.uleb128 0x55
-	.4byte	0x148cf
+	.4byte	0x148c2
 	.uleb128 0x57
 	.8byte	.LBB1078
 	.8byte	.LBE1078-.LBB1078
 	.uleb128 0x61
-	.4byte	0x148da
+	.4byte	0x148cd
 	.4byte	.LLST47
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x340
 	.4byte	0x10ebd
 	.uleb128 0x61
-	.4byte	0x148e6
+	.4byte	0x148d9
 	.4byte	.LLST48
 	.uleb128 0x5d
-	.4byte	0x14dc4
+	.4byte	0x14db7
 	.8byte	.LBB1080
 	.8byte	.LBE1080-.LBB1080
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14de0
+	.4byte	0x14dd3
 	.uleb128 0x55
-	.4byte	0x14dd4
+	.4byte	0x14dc7
 	.uleb128 0x57
 	.8byte	.LBB1081
 	.8byte	.LBE1081-.LBB1081
 	.uleb128 0x58
-	.4byte	0x14dec
+	.4byte	0x14ddf
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d3e
+	.4byte	0x14d31
 	.8byte	.LBB1082
 	.8byte	.LBE1082-.LBB1082
 	.byte	0x6
@@ -43551,7 +43548,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1083
 	.8byte	.LBE1083-.LBB1083
 	.uleb128 0x61
-	.4byte	0x14d4e
+	.4byte	0x14d41
 	.4byte	.LLST49
 	.byte	0
 	.byte	0
@@ -43559,61 +43556,61 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL171
-	.4byte	0x154cf
+	.4byte	0x154c2
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14824
+	.4byte	0x14817
 	.8byte	.LBB1094
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
-	.2byte	0x99b
+	.2byte	0x9a3
 	.4byte	0x1113d
 	.uleb128 0x55
-	.4byte	0x1484a
+	.4byte	0x1483d
 	.uleb128 0x55
-	.4byte	0x1483e
+	.4byte	0x14831
 	.uleb128 0x55
-	.4byte	0x14834
+	.4byte	0x14827
 	.uleb128 0x6e
-	.4byte	0x14884
+	.4byte	0x14877
 	.8byte	.LBB1095
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x148aa
+	.4byte	0x1489d
 	.uleb128 0x55
-	.4byte	0x1489e
+	.4byte	0x14891
 	.uleb128 0x55
-	.4byte	0x14894
+	.4byte	0x14887
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x370
 	.uleb128 0x61
-	.4byte	0x148b3
+	.4byte	0x148a6
 	.4byte	.LLST50
 	.uleb128 0x6f
-	.4byte	0x148f3
+	.4byte	0x148e6
 	.8byte	.LBB1097
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x11065
 	.uleb128 0x55
-	.4byte	0x1490f
+	.4byte	0x14902
 	.uleb128 0x70
-	.4byte	0x14903
+	.4byte	0x148f6
 	.4byte	.LLST51
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x61
-	.4byte	0x1491b
+	.4byte	0x1490e
 	.4byte	.LLST52
 	.uleb128 0x61
-	.4byte	0x14926
+	.4byte	0x14919
 	.4byte	.LLST53
 	.uleb128 0x71
-	.4byte	0x14d3e
+	.4byte	0x14d31
 	.8byte	.LBB1099
 	.8byte	.LBE1099-.LBB1099
 	.byte	0x6
@@ -43623,7 +43620,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1100
 	.8byte	.LBE1100-.LBB1100
 	.uleb128 0x61
-	.4byte	0x14d4e
+	.4byte	0x14d41
 	.4byte	.LLST54
 	.byte	0
 	.byte	0
@@ -43632,90 +43629,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1101-.LBB1101
 	.4byte	0x1101f
 	.uleb128 0x58
-	.4byte	0x14932
+	.4byte	0x14925
 	.uleb128 0x5d
-	.4byte	0x14dc4
+	.4byte	0x14db7
 	.8byte	.LBB1102
 	.8byte	.LBE1102-.LBB1102
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14de0
+	.4byte	0x14dd3
 	.uleb128 0x55
-	.4byte	0x14dd4
+	.4byte	0x14dc7
 	.uleb128 0x57
 	.8byte	.LBB1103
 	.8byte	.LBE1103-.LBB1103
 	.uleb128 0x58
-	.4byte	0x14dec
+	.4byte	0x14ddf
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d11
+	.4byte	0x14d04
 	.8byte	.LBB1104
 	.8byte	.LBE1104-.LBB1104
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14d2b
+	.4byte	0x14d1e
 	.uleb128 0x55
-	.4byte	0x14d21
+	.4byte	0x14d14
 	.uleb128 0x5d
-	.4byte	0x14e4e
+	.4byte	0x14e41
 	.8byte	.LBB1105
 	.8byte	.LBE1105-.LBB1105
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14e68
+	.4byte	0x14e5b
 	.uleb128 0x55
-	.4byte	0x14e5e
+	.4byte	0x14e51
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x148bf
+	.4byte	0x148b2
 	.8byte	.LBB1111
 	.8byte	.LBE1111-.LBB1111
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x11120
 	.uleb128 0x55
-	.4byte	0x148cf
+	.4byte	0x148c2
 	.uleb128 0x57
 	.8byte	.LBB1112
 	.8byte	.LBE1112-.LBB1112
 	.uleb128 0x61
-	.4byte	0x148da
+	.4byte	0x148cd
 	.4byte	.LLST55
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x420
 	.4byte	0x110eb
 	.uleb128 0x61
-	.4byte	0x148e6
+	.4byte	0x148d9
 	.4byte	.LLST56
 	.uleb128 0x5d
-	.4byte	0x14dc4
+	.4byte	0x14db7
 	.8byte	.LBB1114
 	.8byte	.LBE1114-.LBB1114
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14de0
+	.4byte	0x14dd3
 	.uleb128 0x55
-	.4byte	0x14dd4
+	.4byte	0x14dc7
 	.uleb128 0x57
 	.8byte	.LBB1115
 	.8byte	.LBE1115-.LBB1115
 	.uleb128 0x58
-	.4byte	0x14dec
+	.4byte	0x14ddf
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d3e
+	.4byte	0x14d31
 	.8byte	.LBB1116
 	.8byte	.LBE1116-.LBB1116
 	.byte	0x6
@@ -43724,7 +43721,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1117
 	.8byte	.LBE1117-.LBB1117
 	.uleb128 0x61
-	.4byte	0x14d4e
+	.4byte	0x14d41
 	.4byte	.LLST57
 	.byte	0
 	.byte	0
@@ -43732,59 +43729,59 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL183
-	.4byte	0x154dc
+	.4byte	0x154cf
 	.uleb128 0x4f
 	.8byte	.LVL261
-	.4byte	0x152f2
+	.4byte	0x152e5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x147f4
+	.4byte	0x147e7
 	.8byte	.LBB1130
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
-	.2byte	0x9b9
+	.2byte	0x9c1
 	.4byte	0x111ef
 	.uleb128 0x55
-	.4byte	0x1481a
+	.4byte	0x1480d
 	.uleb128 0x55
-	.4byte	0x1480e
+	.4byte	0x14801
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x147f7
 	.uleb128 0x6e
-	.4byte	0x14854
+	.4byte	0x14847
 	.8byte	.LBB1131
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1487a
+	.4byte	0x1486d
 	.uleb128 0x55
-	.4byte	0x1486e
+	.4byte	0x14861
 	.uleb128 0x55
-	.4byte	0x14864
+	.4byte	0x14857
 	.uleb128 0x6e
-	.4byte	0x148f3
+	.4byte	0x148e6
 	.8byte	.LBB1133
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x55
-	.4byte	0x1490f
+	.4byte	0x14902
 	.uleb128 0x72
-	.4byte	0x14903
+	.4byte	0x148f6
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x4b0
 	.uleb128 0x58
-	.4byte	0x1491b
+	.4byte	0x1490e
 	.uleb128 0x61
-	.4byte	0x14926
+	.4byte	0x14919
 	.4byte	.LLST58
 	.uleb128 0x5d
-	.4byte	0x14d3e
+	.4byte	0x14d31
 	.8byte	.LBB1135
 	.8byte	.LBE1135-.LBB1135
 	.byte	0x6
@@ -43793,7 +43790,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1136
 	.8byte	.LBE1136-.LBB1136
 	.uleb128 0x61
-	.4byte	0x14d4e
+	.4byte	0x14d41
 	.4byte	.LLST59
 	.byte	0
 	.byte	0
@@ -43802,52 +43799,52 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x147f4
+	.4byte	0x147e7
 	.8byte	.LBB1142
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
-	.2byte	0x9a9
+	.2byte	0x9b1
 	.4byte	0x1140f
 	.uleb128 0x55
-	.4byte	0x1481a
+	.4byte	0x1480d
 	.uleb128 0x55
-	.4byte	0x1480e
+	.4byte	0x14801
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x147f7
 	.uleb128 0x6e
-	.4byte	0x14854
+	.4byte	0x14847
 	.8byte	.LBB1143
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1487a
+	.4byte	0x1486d
 	.uleb128 0x55
-	.4byte	0x1486e
+	.4byte	0x14861
 	.uleb128 0x55
-	.4byte	0x14864
+	.4byte	0x14857
 	.uleb128 0x6f
-	.4byte	0x148f3
+	.4byte	0x148e6
 	.8byte	.LBB1145
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x11345
 	.uleb128 0x55
-	.4byte	0x1490f
+	.4byte	0x14902
 	.uleb128 0x70
-	.4byte	0x14903
+	.4byte	0x148f6
 	.4byte	.LLST60
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x540
 	.uleb128 0x61
-	.4byte	0x1491b
+	.4byte	0x1490e
 	.4byte	.LLST61
 	.uleb128 0x61
-	.4byte	0x14926
+	.4byte	0x14919
 	.4byte	.LLST62
 	.uleb128 0x71
-	.4byte	0x14d3e
+	.4byte	0x14d31
 	.8byte	.LBB1147
 	.8byte	.LBE1147-.LBB1147
 	.byte	0x6
@@ -43857,7 +43854,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1148
 	.8byte	.LBE1148-.LBB1148
 	.uleb128 0x61
-	.4byte	0x14d4e
+	.4byte	0x14d41
 	.4byte	.LLST63
 	.byte	0
 	.byte	0
@@ -43866,90 +43863,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1149-.LBB1149
 	.4byte	0x112ff
 	.uleb128 0x58
-	.4byte	0x14932
+	.4byte	0x14925
 	.uleb128 0x5d
-	.4byte	0x14dc4
+	.4byte	0x14db7
 	.8byte	.LBB1150
 	.8byte	.LBE1150-.LBB1150
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14de0
+	.4byte	0x14dd3
 	.uleb128 0x55
-	.4byte	0x14dd4
+	.4byte	0x14dc7
 	.uleb128 0x57
 	.8byte	.LBB1151
 	.8byte	.LBE1151-.LBB1151
 	.uleb128 0x58
-	.4byte	0x14dec
+	.4byte	0x14ddf
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d11
+	.4byte	0x14d04
 	.8byte	.LBB1152
 	.8byte	.LBE1152-.LBB1152
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14d2b
+	.4byte	0x14d1e
 	.uleb128 0x55
-	.4byte	0x14d21
+	.4byte	0x14d14
 	.uleb128 0x5d
-	.4byte	0x14e4e
+	.4byte	0x14e41
 	.8byte	.LBB1153
 	.8byte	.LBE1153-.LBB1153
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14e68
+	.4byte	0x14e5b
 	.uleb128 0x55
-	.4byte	0x14e5e
+	.4byte	0x14e51
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x148bf
+	.4byte	0x148b2
 	.8byte	.LBB1161
 	.8byte	.LBE1161-.LBB1161
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x11400
 	.uleb128 0x55
-	.4byte	0x148cf
+	.4byte	0x148c2
 	.uleb128 0x57
 	.8byte	.LBB1162
 	.8byte	.LBE1162-.LBB1162
 	.uleb128 0x61
-	.4byte	0x148da
+	.4byte	0x148cd
 	.4byte	.LLST64
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x590
 	.4byte	0x113cb
 	.uleb128 0x61
-	.4byte	0x148e6
+	.4byte	0x148d9
 	.4byte	.LLST65
 	.uleb128 0x5d
-	.4byte	0x14dc4
+	.4byte	0x14db7
 	.8byte	.LBB1164
 	.8byte	.LBE1164-.LBB1164
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14de0
+	.4byte	0x14dd3
 	.uleb128 0x55
-	.4byte	0x14dd4
+	.4byte	0x14dc7
 	.uleb128 0x57
 	.8byte	.LBB1165
 	.8byte	.LBE1165-.LBB1165
 	.uleb128 0x58
-	.4byte	0x14dec
+	.4byte	0x14ddf
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d3e
+	.4byte	0x14d31
 	.8byte	.LBB1166
 	.8byte	.LBE1166-.LBB1166
 	.byte	0x6
@@ -43958,7 +43955,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1167
 	.8byte	.LBE1167-.LBB1167
 	.uleb128 0x61
-	.4byte	0x14d4e
+	.4byte	0x14d41
 	.4byte	.LLST66
 	.byte	0
 	.byte	0
@@ -43966,56 +43963,56 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL244
-	.4byte	0x154cf
+	.4byte	0x154c2
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x147f4
+	.4byte	0x147e7
 	.8byte	.LBB1178
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
-	.2byte	0x95a
+	.2byte	0x962
 	.4byte	0x1162f
 	.uleb128 0x55
-	.4byte	0x1481a
+	.4byte	0x1480d
 	.uleb128 0x55
-	.4byte	0x1480e
+	.4byte	0x14801
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x147f7
 	.uleb128 0x6e
-	.4byte	0x14854
+	.4byte	0x14847
 	.8byte	.LBB1179
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1487a
+	.4byte	0x1486d
 	.uleb128 0x55
-	.4byte	0x1486e
+	.4byte	0x14861
 	.uleb128 0x55
-	.4byte	0x14864
+	.4byte	0x14857
 	.uleb128 0x6f
-	.4byte	0x148f3
+	.4byte	0x148e6
 	.8byte	.LBB1181
 	.4byte	.Ldebug_ranges0+0x620
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x11565
 	.uleb128 0x55
-	.4byte	0x1490f
+	.4byte	0x14902
 	.uleb128 0x70
-	.4byte	0x14903
+	.4byte	0x148f6
 	.4byte	.LLST67
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x620
 	.uleb128 0x61
-	.4byte	0x1491b
+	.4byte	0x1490e
 	.4byte	.LLST68
 	.uleb128 0x61
-	.4byte	0x14926
+	.4byte	0x14919
 	.4byte	.LLST69
 	.uleb128 0x71
-	.4byte	0x14d3e
+	.4byte	0x14d31
 	.8byte	.LBB1183
 	.8byte	.LBE1183-.LBB1183
 	.byte	0x6
@@ -44025,7 +44022,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1184
 	.8byte	.LBE1184-.LBB1184
 	.uleb128 0x61
-	.4byte	0x14d4e
+	.4byte	0x14d41
 	.4byte	.LLST70
 	.byte	0
 	.byte	0
@@ -44034,90 +44031,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1185-.LBB1185
 	.4byte	0x1151f
 	.uleb128 0x58
-	.4byte	0x14932
+	.4byte	0x14925
 	.uleb128 0x5d
-	.4byte	0x14dc4
+	.4byte	0x14db7
 	.8byte	.LBB1186
 	.8byte	.LBE1186-.LBB1186
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14de0
+	.4byte	0x14dd3
 	.uleb128 0x55
-	.4byte	0x14dd4
+	.4byte	0x14dc7
 	.uleb128 0x57
 	.8byte	.LBB1187
 	.8byte	.LBE1187-.LBB1187
 	.uleb128 0x58
-	.4byte	0x14dec
+	.4byte	0x14ddf
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d11
+	.4byte	0x14d04
 	.8byte	.LBB1188
 	.8byte	.LBE1188-.LBB1188
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14d2b
+	.4byte	0x14d1e
 	.uleb128 0x55
-	.4byte	0x14d21
+	.4byte	0x14d14
 	.uleb128 0x5d
-	.4byte	0x14e4e
+	.4byte	0x14e41
 	.8byte	.LBB1189
 	.8byte	.LBE1189-.LBB1189
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14e68
+	.4byte	0x14e5b
 	.uleb128 0x55
-	.4byte	0x14e5e
+	.4byte	0x14e51
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x148bf
+	.4byte	0x148b2
 	.8byte	.LBB1197
 	.8byte	.LBE1197-.LBB1197
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x11620
 	.uleb128 0x55
-	.4byte	0x148cf
+	.4byte	0x148c2
 	.uleb128 0x57
 	.8byte	.LBB1198
 	.8byte	.LBE1198-.LBB1198
 	.uleb128 0x61
-	.4byte	0x148da
+	.4byte	0x148cd
 	.4byte	.LLST71
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x670
 	.4byte	0x115eb
 	.uleb128 0x61
-	.4byte	0x148e6
+	.4byte	0x148d9
 	.4byte	.LLST72
 	.uleb128 0x5d
-	.4byte	0x14dc4
+	.4byte	0x14db7
 	.8byte	.LBB1200
 	.8byte	.LBE1200-.LBB1200
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14de0
+	.4byte	0x14dd3
 	.uleb128 0x55
-	.4byte	0x14dd4
+	.4byte	0x14dc7
 	.uleb128 0x57
 	.8byte	.LBB1201
 	.8byte	.LBE1201-.LBB1201
 	.uleb128 0x58
-	.4byte	0x14dec
+	.4byte	0x14ddf
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d3e
+	.4byte	0x14d31
 	.8byte	.LBB1202
 	.8byte	.LBE1202-.LBB1202
 	.byte	0x6
@@ -44126,7 +44123,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1203
 	.8byte	.LBE1203-.LBB1203
 	.uleb128 0x61
-	.4byte	0x14d4e
+	.4byte	0x14d41
 	.4byte	.LLST73
 	.byte	0
 	.byte	0
@@ -44134,96 +44131,96 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL252
-	.4byte	0x154cf
+	.4byte	0x154c2
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL85
-	.4byte	0x15384
+	.4byte	0x15377
 	.uleb128 0x4f
 	.8byte	.LVL86
-	.4byte	0x153e6
+	.4byte	0x153d9
 	.uleb128 0x4f
 	.8byte	.LVL87
-	.4byte	0x15491
+	.4byte	0x15484
 	.uleb128 0x4f
 	.8byte	.LVL98
-	.4byte	0x154e9
+	.4byte	0x154dc
 	.uleb128 0x4f
 	.8byte	.LVL101
-	.4byte	0x15308
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL104
-	.4byte	0x1528e
+	.4byte	0x15281
 	.uleb128 0x4f
 	.8byte	.LVL121
-	.4byte	0x15491
+	.4byte	0x15484
 	.uleb128 0x4f
 	.8byte	.LVL122
-	.4byte	0x154f5
+	.4byte	0x154e8
 	.uleb128 0x4f
 	.8byte	.LVL124
-	.4byte	0x15390
+	.4byte	0x15383
 	.uleb128 0x4f
 	.8byte	.LVL131
-	.4byte	0x15384
+	.4byte	0x15377
 	.uleb128 0x4f
 	.8byte	.LVL145
-	.4byte	0x15501
+	.4byte	0x154f4
 	.uleb128 0x4f
 	.8byte	.LVL146
-	.4byte	0x15390
+	.4byte	0x15383
 	.uleb128 0x4f
 	.8byte	.LVL147
-	.4byte	0x153da
+	.4byte	0x153cd
 	.uleb128 0x4f
 	.8byte	.LVL157
-	.4byte	0x1550d
+	.4byte	0x15500
 	.uleb128 0x4f
 	.8byte	.LVL158
-	.4byte	0x15491
+	.4byte	0x15484
 	.uleb128 0x4f
 	.8byte	.LVL185
-	.4byte	0x1528e
+	.4byte	0x15281
 	.uleb128 0x4f
 	.8byte	.LVL188
-	.4byte	0x1528e
+	.4byte	0x15281
 	.uleb128 0x4f
 	.8byte	.LVL190
-	.4byte	0x15384
+	.4byte	0x15377
 	.uleb128 0x4f
 	.8byte	.LVL192
-	.4byte	0x15384
+	.4byte	0x15377
 	.uleb128 0x4f
 	.8byte	.LVL193
-	.4byte	0x153e6
+	.4byte	0x153d9
 	.uleb128 0x4f
 	.8byte	.LVL194
-	.4byte	0x15491
+	.4byte	0x15484
 	.uleb128 0x4f
 	.8byte	.LVL207
-	.4byte	0x15308
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL210
-	.4byte	0x15308
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL212
-	.4byte	0x15384
+	.4byte	0x15377
 	.uleb128 0x4f
 	.8byte	.LVL213
-	.4byte	0x15491
+	.4byte	0x15484
 	.uleb128 0x4f
 	.8byte	.LVL221
-	.4byte	0x154e9
+	.4byte	0x154dc
 	.uleb128 0x4f
 	.8byte	.LVL255
-	.4byte	0x153da
+	.4byte	0x153cd
 	.uleb128 0x4f
 	.8byte	.LVL262
-	.4byte	0x15308
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL263
-	.4byte	0x1543c
+	.4byte	0x1542f
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
@@ -44237,25 +44234,25 @@ __exitcall_ebc_exit:
 	.uleb128 0x64
 	.4byte	.LASF3095
 	.byte	0x1
-	.2byte	0x8df
+	.2byte	0x8e7
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x117e8
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x8df
+	.2byte	0x8e7
 	.4byte	0xe1f4
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x8e1
+	.2byte	0x8e9
 	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x8d9
+	.2byte	0x8e1
 	.8byte	.LFB2841
 	.8byte	.LFE2841-.LFB2841
 	.uleb128 0x1
@@ -44264,17 +44261,17 @@ __exitcall_ebc_exit:
 	.uleb128 0x52
 	.string	"t"
 	.byte	0x1
-	.2byte	0x8d9
+	.2byte	0x8e1
 	.4byte	0x31d2
 	.4byte	.LLST74
 	.uleb128 0x4f
 	.8byte	.LVL276
-	.4byte	0x124b2
+	.4byte	0x124a5
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x8cd
+	.2byte	0x8d5
 	.8byte	.LFB2840
 	.8byte	.LFE2840-.LFB2840
 	.uleb128 0x1
@@ -44283,43 +44280,43 @@ __exitcall_ebc_exit:
 	.uleb128 0x52
 	.string	"t"
 	.byte	0x1
-	.2byte	0x8cd
+	.2byte	0x8d5
 	.4byte	0x31d2
 	.4byte	.LLST12
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x8cf
+	.2byte	0x8d7
 	.4byte	0xe874
 	.uleb128 0x60
-	.4byte	0x1477e
+	.4byte	0x14771
 	.8byte	.LBB958
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.2byte	0x8d3
+	.2byte	0x8db
 	.uleb128 0x55
-	.4byte	0x1478b
+	.4byte	0x1477e
 	.uleb128 0x4f
 	.8byte	.LVL71
-	.4byte	0x15519
+	.4byte	0x1550c
 	.byte	0
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x8bc
+	.2byte	0x8c4
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x118ac
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x8bc
+	.2byte	0x8c4
 	.4byte	0xe1f4
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x8be
+	.2byte	0x8c6
 	.4byte	0xe4f2
 	.byte	0
 	.uleb128 0x50
@@ -44331,7 +44328,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2838-.LFB2838
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x121c7
+	.4byte	0x121ba
 	.uleb128 0x52
 	.string	"ptr"
 	.byte	0x1
@@ -44384,7 +44381,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x6c
 	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x88a
+	.2byte	0x88e
 	.8byte	.L939
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x1220
@@ -44392,7 +44389,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x7c1
+	.2byte	0x7c5
 	.4byte	0xc6
 	.uleb128 0x57
 	.8byte	.LBB1887
@@ -44400,12 +44397,12 @@ __exitcall_ebc_exit:
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x7c1
+	.2byte	0x7c5
 	.8byte	.L920
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x7c1
+	.2byte	0x7c5
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -44413,7 +44410,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x7c1
+	.2byte	0x7c5
 	.4byte	0x199
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x1250
@@ -44421,22 +44418,22 @@ __exitcall_ebc_exit:
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x7c1
+	.2byte	0x7c5
 	.4byte	0x199
 	.4byte	.LLST261
 	.uleb128 0x4f
-	.8byte	.LVL1024
-	.4byte	0x1549d
+	.8byte	.LVL1023
+	.4byte	0x15490
 	.uleb128 0x4f
-	.8byte	.LVL1025
-	.4byte	0x154a9
+	.8byte	.LVL1024
+	.4byte	0x1549c
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL1022
-	.4byte	0x154b6
+	.8byte	.LVL1021
+	.4byte	0x154a9
 	.uleb128 0x4f
-	.8byte	.LVL1026
-	.4byte	0x154c2
+	.8byte	.LVL1025
+	.4byte	0x154b5
 	.byte	0
 	.byte	0
 	.uleb128 0x63
@@ -44445,7 +44442,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x876
+	.2byte	0x87a
 	.4byte	0xc6
 	.uleb128 0x57
 	.8byte	.LBB1883
@@ -44453,12 +44450,12 @@ __exitcall_ebc_exit:
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x876
+	.2byte	0x87a
 	.8byte	.L986
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x876
+	.2byte	0x87a
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -44466,7 +44463,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x876
+	.2byte	0x87a
 	.4byte	0x199
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x11f0
@@ -44474,22 +44471,22 @@ __exitcall_ebc_exit:
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x876
+	.2byte	0x87a
 	.4byte	0x199
 	.4byte	.LLST260
 	.uleb128 0x4f
-	.8byte	.LVL1013
-	.4byte	0x1549d
+	.8byte	.LVL1012
+	.4byte	0x15490
 	.uleb128 0x4f
-	.8byte	.LVL1014
-	.4byte	0x154a9
+	.8byte	.LVL1013
+	.4byte	0x1549c
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL1011
-	.4byte	0x154b6
+	.8byte	.LVL1010
+	.4byte	0x154a9
 	.uleb128 0x4f
-	.8byte	.LVL1015
-	.4byte	0x154c2
+	.8byte	.LVL1014
+	.4byte	0x154b5
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
@@ -44499,7 +44496,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x8a8
+	.2byte	0x8ac
 	.4byte	0xc6
 	.uleb128 0x57
 	.8byte	.LBB1878
@@ -44507,11 +44504,11 @@ __exitcall_ebc_exit:
 	.uleb128 0x73
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x8a8
+	.2byte	0x8ac
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x8a8
+	.2byte	0x8ac
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -44519,7 +44516,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x8a8
+	.2byte	0x8ac
 	.4byte	0x199
 	.uleb128 0x6d
 	.8byte	.LBB1879
@@ -44528,22 +44525,22 @@ __exitcall_ebc_exit:
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x8a8
+	.2byte	0x8ac
 	.4byte	0x199
 	.4byte	.LLST259
 	.uleb128 0x4f
-	.8byte	.LVL949
-	.4byte	0x1549d
-	.uleb128 0x4f
 	.8byte	.LVL950
-	.4byte	0x154a9
+	.4byte	0x15490
+	.uleb128 0x4f
+	.8byte	.LVL951
+	.4byte	0x1549c
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL947
-	.4byte	0x154b6
+	.8byte	.LVL948
+	.4byte	0x154a9
 	.uleb128 0x4f
-	.8byte	.LVL951
-	.4byte	0x154c2
+	.8byte	.LVL952
+	.4byte	0x154b5
 	.byte	0
 	.byte	0
 	.uleb128 0x63
@@ -44552,19 +44549,19 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x8b4
+	.2byte	0x8b8
 	.4byte	0xc6
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1090
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x8b4
+	.2byte	0x8b8
 	.8byte	.L1003
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x8b4
+	.2byte	0x8b8
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -44572,7 +44569,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x8b4
+	.2byte	0x8b8
 	.4byte	0x199
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x10d0
@@ -44580,461 +44577,458 @@ __exitcall_ebc_exit:
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x8b4
+	.2byte	0x8b8
 	.4byte	0x199
 	.4byte	.LLST245
 	.uleb128 0x4f
-	.8byte	.LVL898
-	.4byte	0x1549d
+	.8byte	.LVL939
+	.4byte	0x15490
 	.uleb128 0x4f
-	.8byte	.LVL899
-	.4byte	0x154a9
+	.8byte	.LVL940
+	.4byte	0x1549c
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL896
-	.4byte	0x154b6
+	.8byte	.LVL937
+	.4byte	0x154a9
 	.uleb128 0x4f
-	.8byte	.LVL900
-	.4byte	0x154c2
+	.8byte	.LVL941
+	.4byte	0x154b5
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x1221b
-	.8byte	.LBB1861
+	.4byte	0x1220e
+	.8byte	.LBB1860
 	.4byte	.Ldebug_ranges0+0x1110
 	.byte	0x1
-	.2byte	0x84d
+	.2byte	0x851
 	.4byte	0x11c4a
 	.uleb128 0x55
-	.4byte	0x1222c
+	.4byte	0x1221f
 	.uleb128 0x55
-	.4byte	0x1222c
+	.4byte	0x1221f
 	.uleb128 0x55
-	.4byte	0x12238
+	.4byte	0x1222b
 	.uleb128 0x55
-	.4byte	0x12238
+	.4byte	0x1222b
 	.uleb128 0x55
-	.4byte	0x12244
+	.4byte	0x12237
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1110
 	.uleb128 0x58
-	.4byte	0x12250
+	.4byte	0x12243
 	.uleb128 0x58
-	.4byte	0x1225a
+	.4byte	0x1224d
 	.uleb128 0x58
-	.4byte	0x12266
+	.4byte	0x12259
 	.uleb128 0x58
-	.4byte	0x12272
+	.4byte	0x12265
 	.uleb128 0x61
-	.4byte	0x1227e
+	.4byte	0x12271
 	.4byte	.LLST246
 	.uleb128 0x58
-	.4byte	0x1228a
+	.4byte	0x1227d
 	.uleb128 0x58
-	.4byte	0x12296
+	.4byte	0x12289
 	.uleb128 0x74
-	.4byte	0x122a2
+	.4byte	0x12295
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x121c7
-	.8byte	.LBB1864
-	.8byte	.LBE1864-.LBB1864
+	.4byte	0x121ba
+	.8byte	.LBB1863
+	.8byte	.LBE1863-.LBB1863
 	.byte	0x1
-	.2byte	0x7da
+	.2byte	0x7de
 	.4byte	0x11c9b
 	.uleb128 0x55
-	.4byte	0x121ec
+	.4byte	0x121df
 	.uleb128 0x55
-	.4byte	0x121e0
+	.4byte	0x121d3
 	.uleb128 0x70
-	.4byte	0x121d4
+	.4byte	0x121c7
 	.4byte	.LLST247
 	.uleb128 0x57
-	.8byte	.LBB1865
-	.8byte	.LBE1865-.LBB1865
+	.8byte	.LBB1864
+	.8byte	.LBE1864-.LBB1864
 	.uleb128 0x58
-	.4byte	0x121f8
+	.4byte	0x121eb
 	.uleb128 0x58
-	.4byte	0x12202
+	.4byte	0x121f5
 	.uleb128 0x58
-	.4byte	0x1220e
+	.4byte	0x12201
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13f89
-	.8byte	.LBB1866
+	.4byte	0x13f7c
+	.8byte	.LBB1865
 	.4byte	.Ldebug_ranges0+0x1140
 	.byte	0x1
-	.2byte	0x7e5
+	.2byte	0x7e9
 	.4byte	0x11d61
 	.uleb128 0x55
-	.4byte	0x13fc6
+	.4byte	0x13fb9
 	.uleb128 0x55
-	.4byte	0x13fc6
+	.4byte	0x13fb9
 	.uleb128 0x55
-	.4byte	0x13fc6
+	.4byte	0x13fb9
 	.uleb128 0x55
-	.4byte	0x13fd2
+	.4byte	0x13fc5
 	.uleb128 0x55
-	.4byte	0x13fba
+	.4byte	0x13fad
 	.uleb128 0x55
-	.4byte	0x13fae
+	.4byte	0x13fa1
 	.uleb128 0x55
-	.4byte	0x13fa2
+	.4byte	0x13f95
 	.uleb128 0x55
-	.4byte	0x13f96
+	.4byte	0x13f89
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1140
 	.uleb128 0x58
-	.4byte	0x13fde
+	.4byte	0x13fd1
 	.uleb128 0x61
-	.4byte	0x13fea
+	.4byte	0x13fdd
 	.4byte	.LLST248
 	.uleb128 0x58
-	.4byte	0x13ff6
+	.4byte	0x13fe9
 	.uleb128 0x61
-	.4byte	0x14002
+	.4byte	0x13ff5
 	.4byte	.LLST249
 	.uleb128 0x61
-	.4byte	0x1400e
+	.4byte	0x14001
 	.4byte	.LLST250
 	.uleb128 0x58
-	.4byte	0x1401a
+	.4byte	0x1400d
 	.uleb128 0x58
-	.4byte	0x14026
+	.4byte	0x14019
 	.uleb128 0x58
-	.4byte	0x14032
+	.4byte	0x14025
 	.uleb128 0x61
-	.4byte	0x1403e
+	.4byte	0x14031
 	.4byte	.LLST251
 	.uleb128 0x58
-	.4byte	0x1404a
+	.4byte	0x1403d
 	.uleb128 0x61
-	.4byte	0x14056
+	.4byte	0x14049
 	.4byte	.LLST252
 	.uleb128 0x62
-	.4byte	0x14062
+	.4byte	0x14055
 	.uleb128 0x1
 	.byte	0x60
 	.uleb128 0x61
-	.4byte	0x1406c
+	.4byte	0x1405f
 	.4byte	.LLST253
 	.uleb128 0x61
-	.4byte	0x14076
+	.4byte	0x14069
 	.4byte	.LLST254
 	.uleb128 0x61
-	.4byte	0x14082
+	.4byte	0x14075
 	.4byte	.LLST255
 	.uleb128 0x61
-	.4byte	0x1408e
+	.4byte	0x14081
 	.4byte	.LLST256
 	.uleb128 0x61
-	.4byte	0x1409a
+	.4byte	0x1408d
 	.4byte	.LLST257
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x121c7
-	.8byte	.LBB1873
+	.4byte	0x121ba
+	.8byte	.LBB1872
 	.4byte	.Ldebug_ranges0+0x1190
 	.byte	0x1
-	.2byte	0x808
+	.2byte	0x80c
 	.4byte	0x11da2
 	.uleb128 0x55
-	.4byte	0x121ec
+	.4byte	0x121df
 	.uleb128 0x55
-	.4byte	0x121e0
+	.4byte	0x121d3
 	.uleb128 0x70
-	.4byte	0x121d4
+	.4byte	0x121c7
 	.4byte	.LLST258
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1190
 	.uleb128 0x58
-	.4byte	0x121f8
+	.4byte	0x121eb
 	.uleb128 0x58
-	.4byte	0x12202
+	.4byte	0x121f5
 	.uleb128 0x58
-	.4byte	0x1220e
+	.4byte	0x12201
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x143d0
+	.4byte	0x143c3
 	.8byte	.LBB1880
 	.8byte	.LBE1880-.LBB1880
 	.byte	0x1
-	.2byte	0x8b1
+	.2byte	0x8b5
 	.4byte	0x11ded
 	.uleb128 0x55
-	.4byte	0x143eb
+	.4byte	0x143de
 	.uleb128 0x55
-	.4byte	0x143e0
+	.4byte	0x143d3
 	.uleb128 0x57
 	.8byte	.LBB1881
 	.8byte	.LBE1881-.LBB1881
 	.uleb128 0x58
-	.4byte	0x143f7
+	.4byte	0x143ea
 	.uleb128 0x4f
-	.8byte	.LVL952
-	.4byte	0x150a5
+	.8byte	.LVL953
+	.4byte	0x15098
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x121c7
+	.4byte	0x121ba
 	.8byte	.LBB1893
 	.4byte	.Ldebug_ranges0+0x1280
 	.byte	0x1
-	.2byte	0x804
+	.2byte	0x808
 	.4byte	0x11e2e
 	.uleb128 0x55
-	.4byte	0x121ec
+	.4byte	0x121df
 	.uleb128 0x55
-	.4byte	0x121e0
+	.4byte	0x121d3
 	.uleb128 0x70
-	.4byte	0x121d4
+	.4byte	0x121c7
 	.4byte	.LLST262
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1280
 	.uleb128 0x58
-	.4byte	0x121f8
+	.4byte	0x121eb
 	.uleb128 0x58
-	.4byte	0x12202
+	.4byte	0x121f5
 	.uleb128 0x58
-	.4byte	0x1220e
+	.4byte	0x12201
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x121c7
+	.4byte	0x121ba
 	.8byte	.LBB1898
 	.4byte	.Ldebug_ranges0+0x12b0
 	.byte	0x1
-	.2byte	0x7a2
+	.2byte	0x7a6
 	.4byte	0x11e6f
 	.uleb128 0x55
-	.4byte	0x121ec
+	.4byte	0x121df
 	.uleb128 0x55
-	.4byte	0x121e0
+	.4byte	0x121d3
 	.uleb128 0x70
-	.4byte	0x121d4
+	.4byte	0x121c7
 	.4byte	.LLST263
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x12b0
 	.uleb128 0x58
-	.4byte	0x121f8
+	.4byte	0x121eb
 	.uleb128 0x58
-	.4byte	0x12202
+	.4byte	0x121f5
 	.uleb128 0x58
-	.4byte	0x1220e
+	.4byte	0x12201
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x143d0
+	.4byte	0x143c3
 	.8byte	.LBB1902
 	.8byte	.LBE1902-.LBB1902
 	.byte	0x1
 	.2byte	0x773
 	.4byte	0x11eba
 	.uleb128 0x55
-	.4byte	0x143eb
+	.4byte	0x143de
 	.uleb128 0x55
-	.4byte	0x143e0
+	.4byte	0x143d3
 	.uleb128 0x57
 	.8byte	.LBB1903
 	.8byte	.LBE1903-.LBB1903
 	.uleb128 0x58
-	.4byte	0x143f7
+	.4byte	0x143ea
 	.uleb128 0x4f
-	.8byte	.LVL1032
-	.4byte	0x150a5
+	.8byte	.LVL1031
+	.4byte	0x15098
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL879
-	.4byte	0x15525
+	.8byte	.LVL878
+	.4byte	0x15518
+	.uleb128 0x4f
+	.8byte	.LVL880
+	.4byte	0x1536b
 	.uleb128 0x4f
 	.8byte	.LVL881
-	.4byte	0x15378
+	.4byte	0x15281
 	.uleb128 0x4f
 	.8byte	.LVL882
-	.4byte	0x1528e
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL883
-	.4byte	0x15308
+	.4byte	0x15524
 	.uleb128 0x4f
 	.8byte	.LVL884
-	.4byte	0x15531
-	.uleb128 0x4f
-	.8byte	.LVL885
-	.4byte	0x154e9
+	.4byte	0x154dc
 	.uleb128 0x4f
-	.8byte	.LVL904
-	.4byte	0x15163
+	.8byte	.LVL895
+	.4byte	0x151b7
 	.uleb128 0x4f
-	.8byte	.LVL905
-	.4byte	0x15378
+	.8byte	.LVL899
+	.4byte	0x15156
 	.uleb128 0x4f
-	.8byte	.LVL910
-	.4byte	0x1231b
+	.8byte	.LVL900
+	.4byte	0x1536b
 	.uleb128 0x4f
-	.8byte	.LVL911
-	.4byte	0x15308
+	.8byte	.LVL905
+	.4byte	0x1230e
 	.uleb128 0x4f
-	.8byte	.LVL913
-	.4byte	0x15531
+	.8byte	.LVL906
+	.4byte	0x152fb
 	.uleb128 0x4f
-	.8byte	.LVL916
-	.4byte	0x153e6
+	.8byte	.LVL908
+	.4byte	0x15524
 	.uleb128 0x4f
-	.8byte	.LVL917
-	.4byte	0x153e6
+	.8byte	.LVL911
+	.4byte	0x153d9
 	.uleb128 0x4f
-	.8byte	.LVL935
-	.4byte	0x1553d
+	.8byte	.LVL912
+	.4byte	0x153d9
 	.uleb128 0x4f
-	.8byte	.LVL936
-	.4byte	0x153e6
+	.8byte	.LVL930
+	.4byte	0x15530
 	.uleb128 0x4f
-	.8byte	.LVL943
-	.4byte	0x15549
+	.8byte	.LVL931
+	.4byte	0x153d9
 	.uleb128 0x4f
 	.8byte	.LVL944
-	.4byte	0x1528e
+	.4byte	0x1553c
 	.uleb128 0x4f
 	.8byte	.LVL945
-	.4byte	0x15163
+	.4byte	0x15281
 	.uleb128 0x4f
-	.8byte	.LVL953
-	.4byte	0x154e9
+	.8byte	.LVL946
+	.4byte	0x15156
 	.uleb128 0x4f
-	.8byte	.LVL955
-	.4byte	0x1528e
+	.8byte	.LVL954
+	.4byte	0x154dc
 	.uleb128 0x4f
 	.8byte	.LVL956
-	.4byte	0x1275d
+	.4byte	0x15281
 	.uleb128 0x4f
 	.8byte	.LVL957
-	.4byte	0x15378
+	.4byte	0x12750
 	.uleb128 0x4f
-	.8byte	.LVL960
-	.4byte	0x15378
+	.8byte	.LVL958
+	.4byte	0x1536b
 	.uleb128 0x4f
-	.8byte	.LVL963
-	.4byte	0x1528e
+	.8byte	.LVL961
+	.4byte	0x1536b
 	.uleb128 0x4f
 	.8byte	.LVL964
-	.4byte	0x153da
+	.4byte	0x15281
 	.uleb128 0x4f
-	.8byte	.LVL967
-	.4byte	0x151c4
+	.8byte	.LVL965
+	.4byte	0x153cd
 	.uleb128 0x4f
-	.8byte	.LVL970
-	.4byte	0x1553d
+	.8byte	.LVL968
+	.4byte	0x151b7
 	.uleb128 0x4f
 	.8byte	.LVL971
-	.4byte	0x153e6
+	.4byte	0x15530
 	.uleb128 0x4f
 	.8byte	.LVL972
-	.4byte	0x15531
+	.4byte	0x153d9
 	.uleb128 0x4f
 	.8byte	.LVL973
-	.4byte	0x154e9
+	.4byte	0x15524
 	.uleb128 0x4f
 	.8byte	.LVL974
-	.4byte	0x142eb
+	.4byte	0x154dc
 	.uleb128 0x4f
 	.8byte	.LVL975
-	.4byte	0x15555
+	.4byte	0x142de
 	.uleb128 0x4f
 	.8byte	.LVL976
-	.4byte	0x1528e
+	.4byte	0x15548
 	.uleb128 0x4f
 	.8byte	.LVL977
-	.4byte	0x1275d
+	.4byte	0x15281
 	.uleb128 0x4f
 	.8byte	.LVL978
-	.4byte	0x14151
+	.4byte	0x12750
 	.uleb128 0x4f
 	.8byte	.LVL979
-	.4byte	0x15555
+	.4byte	0x14144
 	.uleb128 0x4f
 	.8byte	.LVL980
-	.4byte	0x1231b
+	.4byte	0x15548
 	.uleb128 0x4f
 	.8byte	.LVL981
-	.4byte	0x1528e
+	.4byte	0x1230e
 	.uleb128 0x4f
 	.8byte	.LVL982
-	.4byte	0x1275d
+	.4byte	0x15281
 	.uleb128 0x4f
 	.8byte	.LVL983
-	.4byte	0x1528e
+	.4byte	0x12750
 	.uleb128 0x4f
-	.8byte	.LVL986
-	.4byte	0x1528e
+	.8byte	.LVL984
+	.4byte	0x15281
 	.uleb128 0x4f
-	.8byte	.LVL991
-	.4byte	0x1528e
+	.8byte	.LVL987
+	.4byte	0x15281
 	.uleb128 0x4f
-	.8byte	.LVL993
-	.4byte	0x153e6
+	.8byte	.LVL992
+	.4byte	0x15281
 	.uleb128 0x4f
-	.8byte	.LVL1000
-	.4byte	0x1231b
+	.8byte	.LVL994
+	.4byte	0x153d9
 	.uleb128 0x4f
 	.8byte	.LVL1001
-	.4byte	0x1528e
+	.4byte	0x1230e
 	.uleb128 0x4f
 	.8byte	.LVL1002
-	.4byte	0x1275d
+	.4byte	0x15281
 	.uleb128 0x4f
-	.8byte	.LVL1004
-	.4byte	0x1528e
+	.8byte	.LVL1003
+	.4byte	0x12750
 	.uleb128 0x4f
 	.8byte	.LVL1005
-	.4byte	0x153da
+	.4byte	0x15281
 	.uleb128 0x4f
-	.8byte	.LVL1007
-	.4byte	0x1528e
+	.8byte	.LVL1006
+	.4byte	0x153cd
 	.uleb128 0x4f
 	.8byte	.LVL1008
-	.4byte	0x15531
+	.4byte	0x15281
 	.uleb128 0x4f
-	.8byte	.LVL1009
-	.4byte	0x154e9
+	.8byte	.LVL1017
+	.4byte	0x1420b
 	.uleb128 0x4f
-	.8byte	.LVL1018
-	.4byte	0x14218
+	.8byte	.LVL1027
+	.4byte	0x151b7
 	.uleb128 0x4f
-	.8byte	.LVL1028
-	.4byte	0x151c4
+	.8byte	.LVL1033
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL1034
-	.4byte	0x15308
+	.4byte	0x151b7
 	.uleb128 0x4f
 	.8byte	.LVL1035
-	.4byte	0x151c4
+	.4byte	0x153d9
 	.uleb128 0x4f
-	.8byte	.LVL1036
-	.4byte	0x153e6
-	.uleb128 0x4f
-	.8byte	.LVL1038
-	.4byte	0x153e6
+	.8byte	.LVL1037
+	.4byte	0x153d9
 	.uleb128 0x4f
-	.8byte	.LVL1040
-	.4byte	0x15549
+	.8byte	.LVL1039
+	.4byte	0x1553c
 	.uleb128 0x4f
-	.8byte	.LVL1042
-	.4byte	0x151c4
+	.8byte	.LVL1041
+	.4byte	0x151b7
 	.uleb128 0x4f
-	.8byte	.LVL1044
-	.4byte	0x1543c
+	.8byte	.LVL1043
+	.4byte	0x1542f
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3106
 	.byte	0x1
 	.2byte	0x755
 	.byte	0x1
-	.4byte	0x1221b
+	.4byte	0x1220e
 	.uleb128 0x66
 	.4byte	.LASF3107
 	.byte	0x1
@@ -45072,7 +45066,7 @@ __exitcall_ebc_exit:
 	.2byte	0x739
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x122ab
+	.4byte	0x1229e
 	.uleb128 0x66
 	.4byte	.LASF3112
 	.byte	0x1
@@ -45134,7 +45128,7 @@ __exitcall_ebc_exit:
 	.2byte	0x71d
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1231b
+	.4byte	0x1230e
 	.uleb128 0x65
 	.string	"buf"
 	.byte	0x1
@@ -45185,7 +45179,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2834-.LFB2834
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x124b2
+	.4byte	0x124a5
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
@@ -45222,74 +45216,74 @@ __exitcall_ebc_exit:
 	.2byte	0x6b6
 	.4byte	0xd8a3
 	.uleb128 0x54
-	.4byte	0x146e3
+	.4byte	0x146d6
 	.8byte	.LBB1232
 	.8byte	.LBE1232-.LBB1232
 	.byte	0x1
 	.2byte	0x6bb
-	.4byte	0x123ba
+	.4byte	0x123ad
 	.uleb128 0x55
-	.4byte	0x146ff
+	.4byte	0x146f2
 	.uleb128 0x55
-	.4byte	0x146f3
+	.4byte	0x146e6
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL283
-	.4byte	0x1528e
+	.4byte	0x15281
 	.uleb128 0x4f
 	.8byte	.LVL284
-	.4byte	0x15561
+	.4byte	0x15554
 	.uleb128 0x4f
 	.8byte	.LVL289
-	.4byte	0x15308
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL290
-	.4byte	0x1528e
+	.4byte	0x15281
 	.uleb128 0x4f
 	.8byte	.LVL292
-	.4byte	0x15561
+	.4byte	0x15554
 	.uleb128 0x4f
 	.8byte	.LVL293
-	.4byte	0x15308
+	.4byte	0x152fb
 	.uleb128 0x4f
 	.8byte	.LVL294
-	.4byte	0x15561
+	.4byte	0x15554
 	.uleb128 0x4f
 	.8byte	.LVL295
-	.4byte	0x15561
+	.4byte	0x15554
 	.uleb128 0x4f
 	.8byte	.LVL296
-	.4byte	0x15561
+	.4byte	0x15554
 	.uleb128 0x4f
 	.8byte	.LVL297
-	.4byte	0x15561
+	.4byte	0x15554
 	.uleb128 0x4f
 	.8byte	.LVL298
-	.4byte	0x15561
+	.4byte	0x15554
 	.uleb128 0x4f
 	.8byte	.LVL299
-	.4byte	0x15561
+	.4byte	0x15554
 	.uleb128 0x4f
 	.8byte	.LVL300
-	.4byte	0x15561
+	.4byte	0x15554
 	.uleb128 0x4f
 	.8byte	.LVL301
-	.4byte	0x15561
+	.4byte	0x15554
 	.uleb128 0x4f
 	.8byte	.LVL302
-	.4byte	0x15561
+	.4byte	0x15554
 	.uleb128 0x4f
 	.8byte	.LVL303
-	.4byte	0x15561
+	.4byte	0x15554
 	.uleb128 0x4f
 	.8byte	.LVL304
-	.4byte	0x15561
+	.4byte	0x15554
 	.uleb128 0x4f
 	.8byte	.LVL305
-	.4byte	0x1528e
+	.4byte	0x15281
 	.uleb128 0x4f
 	.8byte	.LVL306
-	.4byte	0x1543c
+	.4byte	0x1542f
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3128
@@ -45299,7 +45293,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2833-.LFB2833
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1256b
+	.4byte	0x1255e
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
@@ -45312,34 +45306,34 @@ __exitcall_ebc_exit:
 	.4byte	0xe1f4
 	.uleb128 0x4f
 	.8byte	.LVL265
-	.4byte	0x1528e
+	.4byte	0x15281
 	.uleb128 0x4f
 	.8byte	.LVL266
-	.4byte	0x153da
+	.4byte	0x153cd
 	.uleb128 0x4f
 	.8byte	.LVL267
-	.4byte	0x153da
+	.4byte	0x153cd
 	.uleb128 0x4f
 	.8byte	.LVL268
-	.4byte	0x15339
+	.4byte	0x1532c
 	.uleb128 0x4f
 	.8byte	.LVL269
-	.4byte	0x1528e
+	.4byte	0x15281
 	.uleb128 0x4f
 	.8byte	.LVL270
-	.4byte	0x152f2
+	.4byte	0x152e5
 	.uleb128 0x4f
 	.8byte	.LVL271
-	.4byte	0x15378
+	.4byte	0x1536b
 	.uleb128 0x4f
 	.8byte	.LVL272
-	.4byte	0x153da
+	.4byte	0x153cd
 	.uleb128 0x4f
 	.8byte	.LVL273
-	.4byte	0x153da
+	.4byte	0x153cd
 	.uleb128 0x4f
 	.8byte	.LVL274
-	.4byte	0x15339
+	.4byte	0x1532c
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3129
@@ -45350,7 +45344,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2832-.LFB2832
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1274d
+	.4byte	0x12740
 	.uleb128 0x59
 	.4byte	.LASF794
 	.byte	0x1
@@ -45376,12 +45370,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe874
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x1020
-	.4byte	0x12655
+	.4byte	0x12648
 	.uleb128 0x41
 	.byte	0x8
 	.byte	0x1
 	.2byte	0x637
-	.4byte	0x125ee
+	.4byte	0x125e1
 	.uleb128 0x43
 	.4byte	.LASF3130
 	.byte	0x1
@@ -45391,29 +45385,29 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x1
 	.2byte	0x637
-	.4byte	0x1274d
+	.4byte	0x12740
 	.byte	0
 	.uleb128 0x53
 	.string	"__u"
 	.byte	0x1
 	.2byte	0x637
-	.4byte	0x125cc
+	.4byte	0x125bf
 	.uleb128 0x5c
-	.4byte	0x14f3f
+	.4byte	0x14f32
 	.8byte	.LBB1812
 	.4byte	.Ldebug_ranges0+0x1060
 	.byte	0x1
 	.2byte	0x637
-	.4byte	0x12622
+	.4byte	0x12615
 	.uleb128 0x55
-	.4byte	0x14f62
+	.4byte	0x14f55
 	.uleb128 0x55
-	.4byte	0x14f56
+	.4byte	0x14f49
 	.uleb128 0x55
-	.4byte	0x14f4c
+	.4byte	0x14f3f
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x14d3e
+	.4byte	0x14d31
 	.8byte	.LBB1815
 	.8byte	.LBE1815-.LBB1815
 	.byte	0x1
@@ -45422,76 +45416,76 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1816
 	.8byte	.LBE1816-.LBB1816
 	.uleb128 0x62
-	.4byte	0x14d4e
+	.4byte	0x14d41
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14bea
+	.4byte	0x14bdd
 	.8byte	.LBB1820
 	.8byte	.LBE1820-.LBB1820
 	.byte	0x1
 	.2byte	0x67f
-	.4byte	0x12689
+	.4byte	0x1267c
 	.uleb128 0x55
-	.4byte	0x14c06
+	.4byte	0x14bf9
 	.uleb128 0x55
-	.4byte	0x14bfb
+	.4byte	0x14bee
 	.uleb128 0x4f
 	.8byte	.LVL863
-	.4byte	0x1556d
+	.4byte	0x15560
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL858
-	.4byte	0x1557a
+	.4byte	0x1556d
 	.uleb128 0x4f
 	.8byte	.LVL859
-	.4byte	0x1549d
+	.4byte	0x15490
 	.uleb128 0x4f
 	.8byte	.LVL860
-	.4byte	0x15584
+	.4byte	0x15577
 	.uleb128 0x4f
 	.8byte	.LVL861
-	.4byte	0x14fa2
+	.4byte	0x14f95
 	.uleb128 0x4f
 	.8byte	.LVL862
-	.4byte	0x13ccd
+	.4byte	0x13cc0
 	.uleb128 0x4f
 	.8byte	.LVL864
-	.4byte	0x14fa2
+	.4byte	0x14f95
 	.uleb128 0x4f
 	.8byte	.LVL865
-	.4byte	0x13374
+	.4byte	0x13367
 	.uleb128 0x4f
 	.8byte	.LVL866
-	.4byte	0x14fa2
+	.4byte	0x14f95
 	.uleb128 0x4f
 	.8byte	.LVL867
-	.4byte	0x12967
+	.4byte	0x1295a
 	.uleb128 0x4f
 	.8byte	.LVL868
-	.4byte	0x14fa2
+	.4byte	0x14f95
 	.uleb128 0x4f
 	.8byte	.LVL869
-	.4byte	0x13e2e
+	.4byte	0x13e21
 	.uleb128 0x4f
 	.8byte	.LVL870
-	.4byte	0x15590
+	.4byte	0x15583
 	.uleb128 0x4f
 	.8byte	.LVL871
-	.4byte	0x140a7
+	.4byte	0x1409a
 	.uleb128 0x4f
 	.8byte	.LVL872
-	.4byte	0x13e2e
+	.4byte	0x13e21
 	.uleb128 0x4f
 	.8byte	.LVL873
-	.4byte	0x13ccd
+	.4byte	0x13cc0
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x1275d
+	.4byte	0x12750
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
@@ -45504,7 +45498,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2831-.LFB2831
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12909
+	.4byte	0x128fc
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
@@ -45528,102 +45522,102 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	__func__.34977
 	.uleb128 0x54
-	.4byte	0x12909
+	.4byte	0x128fc
 	.8byte	.LBB1470
 	.8byte	.LBE1470-.LBB1470
 	.byte	0x1
 	.2byte	0x5e5
-	.4byte	0x127ea
+	.4byte	0x127dd
 	.uleb128 0x55
-	.4byte	0x12922
+	.4byte	0x12915
 	.uleb128 0x55
-	.4byte	0x12916
+	.4byte	0x12909
 	.uleb128 0x4f
 	.8byte	.LVL552
-	.4byte	0x14fa2
+	.4byte	0x14f95
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12909
+	.4byte	0x128fc
 	.8byte	.LBB1472
 	.8byte	.LBE1472-.LBB1472
 	.byte	0x1
 	.2byte	0x5f9
-	.4byte	0x1281e
+	.4byte	0x12811
 	.uleb128 0x55
-	.4byte	0x12922
+	.4byte	0x12915
 	.uleb128 0x55
-	.4byte	0x12916
+	.4byte	0x12909
 	.uleb128 0x4f
 	.8byte	.LVL557
-	.4byte	0x14fa2
+	.4byte	0x14f95
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12909
+	.4byte	0x128fc
 	.8byte	.LBB1474
 	.8byte	.LBE1474-.LBB1474
 	.byte	0x1
 	.2byte	0x620
-	.4byte	0x12852
+	.4byte	0x12845
 	.uleb128 0x55
-	.4byte	0x12922
+	.4byte	0x12915
 	.uleb128 0x55
-	.4byte	0x12916
+	.4byte	0x12909
 	.uleb128 0x4f
 	.8byte	.LVL562
-	.4byte	0x14fa2
+	.4byte	0x14f95
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12909
+	.4byte	0x128fc
 	.8byte	.LBB1476
 	.8byte	.LBE1476-.LBB1476
 	.byte	0x1
 	.2byte	0x613
-	.4byte	0x12886
+	.4byte	0x12879
 	.uleb128 0x55
-	.4byte	0x12922
+	.4byte	0x12915
 	.uleb128 0x55
-	.4byte	0x12916
+	.4byte	0x12909
 	.uleb128 0x4f
 	.8byte	.LVL567
-	.4byte	0x14fa2
+	.4byte	0x14f95
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL551
-	.4byte	0x13ccd
+	.4byte	0x13cc0
 	.uleb128 0x4f
 	.8byte	.LVL553
-	.4byte	0x13ccd
+	.4byte	0x13cc0
 	.uleb128 0x4f
 	.8byte	.LVL556
-	.4byte	0x13e2e
+	.4byte	0x13e21
 	.uleb128 0x4f
 	.8byte	.LVL558
-	.4byte	0x13e2e
+	.4byte	0x13e21
 	.uleb128 0x4f
 	.8byte	.LVL561
-	.4byte	0x13374
+	.4byte	0x13367
 	.uleb128 0x4f
 	.8byte	.LVL563
-	.4byte	0x13374
+	.4byte	0x13367
 	.uleb128 0x4f
 	.8byte	.LVL566
-	.4byte	0x12967
+	.4byte	0x1295a
 	.uleb128 0x4f
 	.8byte	.LVL568
-	.4byte	0x12967
+	.4byte	0x1295a
 	.uleb128 0x4f
 	.8byte	.LVL571
-	.4byte	0x1528e
+	.4byte	0x15281
 	.uleb128 0x4f
 	.8byte	.LVL574
-	.4byte	0x1528e
+	.4byte	0x15281
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3132
 	.byte	0x1
 	.2byte	0x5cf
 	.byte	0x1
-	.4byte	0x1292f
+	.4byte	0x12922
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
@@ -45640,7 +45634,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x5c4
 	.byte	0x1
-	.4byte	0x12961
+	.4byte	0x12954
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
@@ -45655,7 +45649,7 @@ __exitcall_ebc_exit:
 	.string	"buf"
 	.byte	0x1
 	.2byte	0x5c6
-	.4byte	0x12961
+	.4byte	0x12954
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -45668,7 +45662,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2828-.LFB2828
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12f16
+	.4byte	0x12f09
 	.uleb128 0x75
 	.4byte	.LASF3135
 	.byte	0x1
@@ -45695,478 +45689,478 @@ __exitcall_ebc_exit:
 	.4byte	0xe874
 	.4byte	.LLST144
 	.uleb128 0x54
-	.4byte	0x12f16
+	.4byte	0x12f09
 	.8byte	.LBB1380
 	.8byte	.LBE1380-.LBB1380
 	.byte	0x1
 	.2byte	0x5c0
-	.4byte	0x12a70
+	.4byte	0x12a63
 	.uleb128 0x55
-	.4byte	0x12f47
+	.4byte	0x12f3a
 	.uleb128 0x55
-	.4byte	0x12f47
+	.4byte	0x12f3a
 	.uleb128 0x55
-	.4byte	0x12f47
+	.4byte	0x12f3a
 	.uleb128 0x55
-	.4byte	0x12f3b
+	.4byte	0x12f2e
 	.uleb128 0x72
-	.4byte	0x12f2f
+	.4byte	0x12f22
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x12f23
+	.4byte	0x12f16
 	.uleb128 0x57
 	.8byte	.LBB1381
 	.8byte	.LBE1381-.LBB1381
 	.uleb128 0x58
-	.4byte	0x12f53
+	.4byte	0x12f46
 	.uleb128 0x61
-	.4byte	0x12f5f
+	.4byte	0x12f52
 	.4byte	.LLST145
 	.uleb128 0x58
-	.4byte	0x12f6b
+	.4byte	0x12f5e
 	.uleb128 0x58
-	.4byte	0x12f77
+	.4byte	0x12f6a
 	.uleb128 0x58
-	.4byte	0x12f83
+	.4byte	0x12f76
 	.uleb128 0x58
-	.4byte	0x12f8f
+	.4byte	0x12f82
 	.uleb128 0x61
-	.4byte	0x12f9b
+	.4byte	0x12f8e
 	.4byte	.LLST146
 	.uleb128 0x61
-	.4byte	0x12fa7
+	.4byte	0x12f9a
 	.4byte	.LLST147
 	.uleb128 0x58
-	.4byte	0x12fb3
+	.4byte	0x12fa6
 	.uleb128 0x61
-	.4byte	0x12fbf
+	.4byte	0x12fb2
 	.4byte	.LLST148
 	.uleb128 0x58
-	.4byte	0x12fc9
+	.4byte	0x12fbc
 	.uleb128 0x61
-	.4byte	0x12fd3
+	.4byte	0x12fc6
 	.4byte	.LLST149
 	.uleb128 0x61
-	.4byte	0x12fdf
+	.4byte	0x12fd2
 	.4byte	.LLST150
 	.uleb128 0x58
-	.4byte	0x12feb
+	.4byte	0x12fde
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x131c8
+	.4byte	0x131bb
 	.8byte	.LBB1382
 	.4byte	.Ldebug_ranges0+0x9c0
 	.byte	0x1
 	.2byte	0x5b9
-	.4byte	0x12c32
+	.4byte	0x12c25
 	.uleb128 0x55
-	.4byte	0x131f9
+	.4byte	0x131ec
 	.uleb128 0x55
-	.4byte	0x131f9
+	.4byte	0x131ec
 	.uleb128 0x55
-	.4byte	0x131f9
+	.4byte	0x131ec
 	.uleb128 0x55
-	.4byte	0x131ed
+	.4byte	0x131e0
 	.uleb128 0x55
-	.4byte	0x131e1
+	.4byte	0x131d4
 	.uleb128 0x55
-	.4byte	0x131d5
+	.4byte	0x131c8
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x9c0
 	.uleb128 0x58
-	.4byte	0x13205
+	.4byte	0x131f8
 	.uleb128 0x61
-	.4byte	0x13211
+	.4byte	0x13204
 	.4byte	.LLST151
 	.uleb128 0x61
-	.4byte	0x1321d
+	.4byte	0x13210
 	.4byte	.LLST152
 	.uleb128 0x61
-	.4byte	0x13229
+	.4byte	0x1321c
 	.4byte	.LLST153
 	.uleb128 0x61
-	.4byte	0x13235
+	.4byte	0x13228
 	.4byte	.LLST154
 	.uleb128 0x61
-	.4byte	0x13241
+	.4byte	0x13234
 	.4byte	.LLST155
 	.uleb128 0x61
-	.4byte	0x1324d
+	.4byte	0x13240
 	.4byte	.LLST156
 	.uleb128 0x61
-	.4byte	0x13259
+	.4byte	0x1324c
 	.4byte	.LLST157
 	.uleb128 0x61
-	.4byte	0x13265
+	.4byte	0x13258
 	.4byte	.LLST158
 	.uleb128 0x58
-	.4byte	0x1326f
+	.4byte	0x13262
 	.uleb128 0x61
-	.4byte	0x13279
+	.4byte	0x1326c
 	.4byte	.LLST159
 	.uleb128 0x61
-	.4byte	0x13285
+	.4byte	0x13278
 	.4byte	.LLST160
 	.uleb128 0x58
-	.4byte	0x13291
+	.4byte	0x13284
 	.uleb128 0x5c
-	.4byte	0x1444e
+	.4byte	0x14441
 	.8byte	.LBB1384
 	.4byte	.Ldebug_ranges0+0xa00
 	.byte	0x1
 	.2byte	0x4de
-	.4byte	0x12b50
+	.4byte	0x12b43
 	.uleb128 0x55
-	.4byte	0x14476
+	.4byte	0x14469
 	.uleb128 0x55
-	.4byte	0x1446a
+	.4byte	0x1445d
 	.uleb128 0x55
-	.4byte	0x1445e
+	.4byte	0x14451
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa00
 	.uleb128 0x58
-	.4byte	0x14482
+	.4byte	0x14475
 	.uleb128 0x61
-	.4byte	0x1448d
+	.4byte	0x14480
 	.4byte	.LLST161
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1444e
+	.4byte	0x14441
 	.8byte	.LBB1387
 	.8byte	.LBE1387-.LBB1387
 	.byte	0x1
 	.2byte	0x4db
-	.4byte	0x12b9c
+	.4byte	0x12b8f
 	.uleb128 0x55
-	.4byte	0x14476
+	.4byte	0x14469
 	.uleb128 0x55
-	.4byte	0x1446a
+	.4byte	0x1445d
 	.uleb128 0x55
-	.4byte	0x1445e
+	.4byte	0x14451
 	.uleb128 0x57
 	.8byte	.LBB1388
 	.8byte	.LBE1388-.LBB1388
 	.uleb128 0x58
-	.4byte	0x14482
+	.4byte	0x14475
 	.uleb128 0x61
-	.4byte	0x1448d
+	.4byte	0x14480
 	.4byte	.LLST162
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1444e
+	.4byte	0x14441
 	.8byte	.LBB1389
 	.8byte	.LBE1389-.LBB1389
 	.byte	0x1
 	.2byte	0x4dc
-	.4byte	0x12be8
+	.4byte	0x12bdb
 	.uleb128 0x55
-	.4byte	0x14476
+	.4byte	0x14469
 	.uleb128 0x55
-	.4byte	0x1446a
+	.4byte	0x1445d
 	.uleb128 0x55
-	.4byte	0x1445e
+	.4byte	0x14451
 	.uleb128 0x57
 	.8byte	.LBB1390
 	.8byte	.LBE1390-.LBB1390
 	.uleb128 0x58
-	.4byte	0x14482
+	.4byte	0x14475
 	.uleb128 0x61
-	.4byte	0x1448d
+	.4byte	0x14480
 	.4byte	.LLST163
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x1444e
+	.4byte	0x14441
 	.8byte	.LBB1391
 	.8byte	.LBE1391-.LBB1391
 	.byte	0x1
 	.2byte	0x4dd
 	.uleb128 0x55
-	.4byte	0x14476
+	.4byte	0x14469
 	.uleb128 0x55
-	.4byte	0x1446a
+	.4byte	0x1445d
 	.uleb128 0x55
-	.4byte	0x1445e
+	.4byte	0x14451
 	.uleb128 0x57
 	.8byte	.LBB1392
 	.8byte	.LBE1392-.LBB1392
 	.uleb128 0x58
-	.4byte	0x14482
+	.4byte	0x14475
 	.uleb128 0x61
-	.4byte	0x1448d
+	.4byte	0x14480
 	.4byte	.LLST164
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12ff8
+	.4byte	0x12feb
 	.8byte	.LBB1397
 	.8byte	.LBE1397-.LBB1397
 	.byte	0x1
 	.2byte	0x5be
-	.4byte	0x12cdb
+	.4byte	0x12cce
 	.uleb128 0x55
-	.4byte	0x13029
+	.4byte	0x1301c
 	.uleb128 0x55
-	.4byte	0x13029
+	.4byte	0x1301c
 	.uleb128 0x55
-	.4byte	0x13029
+	.4byte	0x1301c
 	.uleb128 0x55
-	.4byte	0x1301d
+	.4byte	0x13010
 	.uleb128 0x72
-	.4byte	0x13011
+	.4byte	0x13004
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x13005
+	.4byte	0x12ff8
 	.uleb128 0x57
 	.8byte	.LBB1398
 	.8byte	.LBE1398-.LBB1398
 	.uleb128 0x58
-	.4byte	0x13035
+	.4byte	0x13028
 	.uleb128 0x58
-	.4byte	0x13041
+	.4byte	0x13034
 	.uleb128 0x58
-	.4byte	0x1304d
+	.4byte	0x13040
 	.uleb128 0x58
-	.4byte	0x13059
+	.4byte	0x1304c
 	.uleb128 0x58
-	.4byte	0x13065
+	.4byte	0x13058
 	.uleb128 0x58
-	.4byte	0x13071
+	.4byte	0x13064
 	.uleb128 0x61
-	.4byte	0x1307d
+	.4byte	0x13070
 	.4byte	.LLST165
 	.uleb128 0x61
-	.4byte	0x13089
+	.4byte	0x1307c
 	.4byte	.LLST166
 	.uleb128 0x58
-	.4byte	0x13095
+	.4byte	0x13088
 	.uleb128 0x61
-	.4byte	0x130a1
+	.4byte	0x13094
 	.4byte	.LLST167
 	.uleb128 0x58
-	.4byte	0x130ab
+	.4byte	0x1309e
 	.uleb128 0x61
-	.4byte	0x130b5
+	.4byte	0x130a8
 	.4byte	.LLST168
 	.uleb128 0x61
-	.4byte	0x130c1
+	.4byte	0x130b4
 	.4byte	.LLST169
 	.uleb128 0x58
-	.4byte	0x130cd
+	.4byte	0x130c0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x1329e
+	.4byte	0x13291
 	.8byte	.LBB1399
 	.4byte	.Ldebug_ranges0+0xa30
 	.byte	0x1
 	.2byte	0x5bb
-	.4byte	0x12de9
+	.4byte	0x12ddc
 	.uleb128 0x55
-	.4byte	0x132cf
+	.4byte	0x132c2
 	.uleb128 0x55
-	.4byte	0x132cf
+	.4byte	0x132c2
 	.uleb128 0x55
-	.4byte	0x132cf
+	.4byte	0x132c2
 	.uleb128 0x55
-	.4byte	0x132c3
+	.4byte	0x132b6
 	.uleb128 0x55
-	.4byte	0x132b7
+	.4byte	0x132aa
 	.uleb128 0x55
-	.4byte	0x132ab
+	.4byte	0x1329e
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa30
 	.uleb128 0x58
-	.4byte	0x132db
+	.4byte	0x132ce
 	.uleb128 0x58
-	.4byte	0x132e7
+	.4byte	0x132da
 	.uleb128 0x58
-	.4byte	0x132f3
+	.4byte	0x132e6
 	.uleb128 0x62
-	.4byte	0x132ff
+	.4byte	0x132f2
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x1330b
+	.4byte	0x132fe
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x13317
+	.4byte	0x1330a
 	.4byte	.LLST170
 	.uleb128 0x61
-	.4byte	0x13323
+	.4byte	0x13316
 	.4byte	.LLST171
 	.uleb128 0x61
-	.4byte	0x1332f
+	.4byte	0x13322
 	.4byte	.LLST172
 	.uleb128 0x61
-	.4byte	0x1333b
+	.4byte	0x1332e
 	.4byte	.LLST173
 	.uleb128 0x58
-	.4byte	0x13345
+	.4byte	0x13338
 	.uleb128 0x61
-	.4byte	0x1334f
+	.4byte	0x13342
 	.4byte	.LLST174
 	.uleb128 0x61
-	.4byte	0x1335b
+	.4byte	0x1334e
 	.4byte	.LLST175
 	.uleb128 0x58
-	.4byte	0x13367
+	.4byte	0x1335a
 	.uleb128 0x5c
-	.4byte	0x1444e
+	.4byte	0x14441
 	.8byte	.LBB1401
 	.4byte	.Ldebug_ranges0+0xa60
 	.byte	0x1
 	.2byte	0x4b3
-	.4byte	0x12daf
+	.4byte	0x12da2
 	.uleb128 0x55
-	.4byte	0x14476
+	.4byte	0x14469
 	.uleb128 0x55
-	.4byte	0x1446a
+	.4byte	0x1445d
 	.uleb128 0x55
-	.4byte	0x1445e
+	.4byte	0x14451
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa60
 	.uleb128 0x58
-	.4byte	0x14482
+	.4byte	0x14475
 	.uleb128 0x61
-	.4byte	0x1448d
+	.4byte	0x14480
 	.4byte	.LLST176
 	.byte	0
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x1444e
+	.4byte	0x14441
 	.8byte	.LBB1408
 	.4byte	.Ldebug_ranges0+0xad0
 	.byte	0x1
 	.2byte	0x4b2
 	.uleb128 0x55
-	.4byte	0x14476
+	.4byte	0x14469
 	.uleb128 0x55
-	.4byte	0x1446a
+	.4byte	0x1445d
 	.uleb128 0x55
-	.4byte	0x1445e
+	.4byte	0x14451
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xad0
 	.uleb128 0x58
-	.4byte	0x14482
+	.4byte	0x14475
 	.uleb128 0x61
-	.4byte	0x1448d
+	.4byte	0x14480
 	.4byte	.LLST177
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x130da
+	.4byte	0x130cd
 	.8byte	.LBB1426
 	.8byte	.LBE1426-.LBB1426
 	.byte	0x1
 	.2byte	0x5b5
 	.uleb128 0x55
-	.4byte	0x1310b
+	.4byte	0x130fe
 	.uleb128 0x55
-	.4byte	0x1310b
+	.4byte	0x130fe
 	.uleb128 0x55
-	.4byte	0x1310b
+	.4byte	0x130fe
 	.uleb128 0x55
-	.4byte	0x130ff
+	.4byte	0x130f2
 	.uleb128 0x55
-	.4byte	0x130f3
+	.4byte	0x130e6
 	.uleb128 0x55
-	.4byte	0x130e7
+	.4byte	0x130da
 	.uleb128 0x57
 	.8byte	.LBB1427
 	.8byte	.LBE1427-.LBB1427
 	.uleb128 0x58
-	.4byte	0x13117
+	.4byte	0x1310a
 	.uleb128 0x58
-	.4byte	0x13123
+	.4byte	0x13116
 	.uleb128 0x58
-	.4byte	0x1312f
+	.4byte	0x13122
 	.uleb128 0x62
-	.4byte	0x1313b
+	.4byte	0x1312e
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x13147
+	.4byte	0x1313a
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x13153
+	.4byte	0x13146
 	.4byte	.LLST178
 	.uleb128 0x61
-	.4byte	0x1315f
+	.4byte	0x13152
 	.4byte	.LLST179
 	.uleb128 0x61
-	.4byte	0x1316b
+	.4byte	0x1315e
 	.4byte	.LLST180
 	.uleb128 0x61
-	.4byte	0x13177
+	.4byte	0x1316a
 	.4byte	.LLST181
 	.uleb128 0x58
-	.4byte	0x13181
+	.4byte	0x13174
 	.uleb128 0x61
-	.4byte	0x1318b
+	.4byte	0x1317e
 	.4byte	.LLST182
 	.uleb128 0x61
-	.4byte	0x13197
+	.4byte	0x1318a
 	.4byte	.LLST183
 	.uleb128 0x58
-	.4byte	0x131a3
+	.4byte	0x13196
 	.uleb128 0x58
-	.4byte	0x131af
+	.4byte	0x131a2
 	.uleb128 0x58
-	.4byte	0x131bb
+	.4byte	0x131ae
 	.uleb128 0x5c
-	.4byte	0x14403
+	.4byte	0x143f6
 	.8byte	.LBB1428
 	.4byte	.Ldebug_ranges0+0xb30
 	.byte	0x1
 	.2byte	0x509
-	.4byte	0x12ed7
+	.4byte	0x12eca
 	.uleb128 0x55
-	.4byte	0x1442b
+	.4byte	0x1441e
 	.uleb128 0x55
-	.4byte	0x1441f
+	.4byte	0x14412
 	.uleb128 0x55
-	.4byte	0x14413
+	.4byte	0x14406
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xb30
 	.uleb128 0x61
-	.4byte	0x14437
+	.4byte	0x1442a
 	.4byte	.LLST184
 	.uleb128 0x61
-	.4byte	0x14442
+	.4byte	0x14435
 	.4byte	.LLST185
 	.byte	0
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x14403
+	.4byte	0x143f6
 	.8byte	.LBB1435
 	.4byte	.Ldebug_ranges0+0xba0
 	.byte	0x1
 	.2byte	0x508
 	.uleb128 0x55
-	.4byte	0x1442b
+	.4byte	0x1441e
 	.uleb128 0x55
-	.4byte	0x1441f
+	.4byte	0x14412
 	.uleb128 0x55
-	.4byte	0x14413
+	.4byte	0x14406
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xba0
 	.uleb128 0x61
-	.4byte	0x14437
+	.4byte	0x1442a
 	.4byte	.LLST186
 	.uleb128 0x61
-	.4byte	0x14442
+	.4byte	0x14435
 	.4byte	.LLST187
 	.byte	0
 	.byte	0
@@ -46178,7 +46172,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x561
 	.byte	0x1
-	.4byte	0x12ff8
+	.4byte	0x12feb
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
@@ -46275,7 +46269,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x513
 	.byte	0x1
-	.4byte	0x130da
+	.4byte	0x130cd
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
@@ -46372,7 +46366,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x4e9
 	.byte	0x1
-	.4byte	0x131c8
+	.4byte	0x131bb
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
@@ -46474,7 +46468,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x4be
 	.byte	0x1
-	.4byte	0x1329e
+	.4byte	0x13291
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
@@ -46566,7 +46560,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x495
 	.byte	0x1
-	.4byte	0x13374
+	.4byte	0x13367
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
@@ -46661,7 +46655,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1386f
+	.4byte	0x13862
 	.uleb128 0x75
 	.4byte	.LASF3135
 	.byte	0x1
@@ -46688,414 +46682,414 @@ __exitcall_ebc_exit:
 	.4byte	0xe874
 	.4byte	.LLST107
 	.uleb128 0x54
-	.4byte	0x1386f
+	.4byte	0x13862
 	.8byte	.LBB1266
 	.8byte	.LBE1266-.LBB1266
 	.byte	0x1
 	.2byte	0x490
-	.4byte	0x1347d
+	.4byte	0x13470
 	.uleb128 0x55
-	.4byte	0x138a0
+	.4byte	0x13893
 	.uleb128 0x55
-	.4byte	0x138a0
+	.4byte	0x13893
 	.uleb128 0x55
-	.4byte	0x138a0
+	.4byte	0x13893
 	.uleb128 0x55
-	.4byte	0x13894
+	.4byte	0x13887
 	.uleb128 0x72
-	.4byte	0x13888
+	.4byte	0x1387b
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x1387c
+	.4byte	0x1386f
 	.uleb128 0x57
 	.8byte	.LBB1267
 	.8byte	.LBE1267-.LBB1267
 	.uleb128 0x58
-	.4byte	0x138ac
+	.4byte	0x1389f
 	.uleb128 0x61
-	.4byte	0x138b8
+	.4byte	0x138ab
 	.4byte	.LLST108
 	.uleb128 0x58
-	.4byte	0x138c4
+	.4byte	0x138b7
 	.uleb128 0x58
-	.4byte	0x138d0
+	.4byte	0x138c3
 	.uleb128 0x58
-	.4byte	0x138dc
+	.4byte	0x138cf
 	.uleb128 0x58
-	.4byte	0x138e8
+	.4byte	0x138db
 	.uleb128 0x61
-	.4byte	0x138f4
+	.4byte	0x138e7
 	.4byte	.LLST109
 	.uleb128 0x61
-	.4byte	0x13900
+	.4byte	0x138f3
 	.4byte	.LLST110
 	.uleb128 0x58
-	.4byte	0x1390c
+	.4byte	0x138ff
 	.uleb128 0x61
-	.4byte	0x13918
+	.4byte	0x1390b
 	.4byte	.LLST111
 	.uleb128 0x58
-	.4byte	0x13922
+	.4byte	0x13915
 	.uleb128 0x61
-	.4byte	0x1392c
+	.4byte	0x1391f
 	.4byte	.LLST112
 	.uleb128 0x61
-	.4byte	0x13938
+	.4byte	0x1392b
 	.4byte	.LLST113
 	.uleb128 0x58
-	.4byte	0x13944
+	.4byte	0x13937
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13bf7
+	.4byte	0x13bea
 	.8byte	.LBB1268
 	.8byte	.LBE1268-.LBB1268
 	.byte	0x1
 	.2byte	0x489
-	.4byte	0x135cb
+	.4byte	0x135be
 	.uleb128 0x55
-	.4byte	0x13c28
+	.4byte	0x13c1b
 	.uleb128 0x55
-	.4byte	0x13c28
+	.4byte	0x13c1b
 	.uleb128 0x55
-	.4byte	0x13c28
+	.4byte	0x13c1b
 	.uleb128 0x55
-	.4byte	0x13c1c
+	.4byte	0x13c0f
 	.uleb128 0x55
-	.4byte	0x13c10
+	.4byte	0x13c03
 	.uleb128 0x55
-	.4byte	0x13c04
+	.4byte	0x13bf7
 	.uleb128 0x57
 	.8byte	.LBB1269
 	.8byte	.LBE1269-.LBB1269
 	.uleb128 0x58
-	.4byte	0x13c34
+	.4byte	0x13c27
 	.uleb128 0x61
-	.4byte	0x13c40
+	.4byte	0x13c33
 	.4byte	.LLST114
 	.uleb128 0x58
-	.4byte	0x13c4a
+	.4byte	0x13c3d
 	.uleb128 0x61
-	.4byte	0x13c54
+	.4byte	0x13c47
 	.4byte	.LLST115
 	.uleb128 0x58
-	.4byte	0x13c60
+	.4byte	0x13c53
 	.uleb128 0x61
-	.4byte	0x13c6c
+	.4byte	0x13c5f
 	.4byte	.LLST116
 	.uleb128 0x61
-	.4byte	0x13c78
+	.4byte	0x13c6b
 	.4byte	.LLST117
 	.uleb128 0x61
-	.4byte	0x13c84
+	.4byte	0x13c77
 	.4byte	.LLST118
 	.uleb128 0x61
-	.4byte	0x13c90
+	.4byte	0x13c83
 	.4byte	.LLST119
 	.uleb128 0x61
-	.4byte	0x13c9c
+	.4byte	0x13c8f
 	.4byte	.LLST120
 	.uleb128 0x61
-	.4byte	0x13ca8
+	.4byte	0x13c9b
 	.4byte	.LLST121
 	.uleb128 0x61
-	.4byte	0x13cb4
+	.4byte	0x13ca7
 	.4byte	.LLST122
 	.uleb128 0x58
-	.4byte	0x13cc0
+	.4byte	0x13cb3
 	.uleb128 0x5c
-	.4byte	0x144ce
+	.4byte	0x144c1
 	.8byte	.LBB1270
 	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
 	.2byte	0x39c
-	.4byte	0x13555
+	.4byte	0x13548
 	.uleb128 0x55
-	.4byte	0x144f6
+	.4byte	0x144e9
 	.uleb128 0x55
-	.4byte	0x144ea
+	.4byte	0x144dd
 	.uleb128 0x55
-	.4byte	0x144de
+	.4byte	0x144d1
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x144ce
+	.4byte	0x144c1
 	.8byte	.LBB1275
 	.4byte	.Ldebug_ranges0+0x720
 	.byte	0x1
 	.2byte	0x39d
-	.4byte	0x1357d
+	.4byte	0x13570
 	.uleb128 0x55
-	.4byte	0x144f6
+	.4byte	0x144e9
 	.uleb128 0x55
-	.4byte	0x144ea
+	.4byte	0x144dd
 	.uleb128 0x55
-	.4byte	0x144de
+	.4byte	0x144d1
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x144ce
+	.4byte	0x144c1
 	.8byte	.LBB1287
 	.4byte	.Ldebug_ranges0+0x790
 	.byte	0x1
 	.2byte	0x39e
-	.4byte	0x135a5
+	.4byte	0x13598
 	.uleb128 0x55
-	.4byte	0x144f6
+	.4byte	0x144e9
 	.uleb128 0x55
-	.4byte	0x144ea
+	.4byte	0x144dd
 	.uleb128 0x55
-	.4byte	0x144de
+	.4byte	0x144d1
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x144ce
+	.4byte	0x144c1
 	.8byte	.LBB1299
 	.4byte	.Ldebug_ranges0+0x800
 	.byte	0x1
 	.2byte	0x39f
 	.uleb128 0x55
-	.4byte	0x144f6
+	.4byte	0x144e9
 	.uleb128 0x55
-	.4byte	0x144ea
+	.4byte	0x144dd
 	.uleb128 0x55
-	.4byte	0x144de
+	.4byte	0x144d1
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13951
+	.4byte	0x13944
 	.8byte	.LBB1310
 	.8byte	.LBE1310-.LBB1310
 	.byte	0x1
 	.2byte	0x48e
-	.4byte	0x13674
+	.4byte	0x13667
 	.uleb128 0x55
-	.4byte	0x13982
+	.4byte	0x13975
 	.uleb128 0x55
-	.4byte	0x13982
+	.4byte	0x13975
 	.uleb128 0x55
-	.4byte	0x13982
+	.4byte	0x13975
 	.uleb128 0x55
-	.4byte	0x13976
+	.4byte	0x13969
 	.uleb128 0x72
-	.4byte	0x1396a
+	.4byte	0x1395d
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x1395e
+	.4byte	0x13951
 	.uleb128 0x57
 	.8byte	.LBB1311
 	.8byte	.LBE1311-.LBB1311
 	.uleb128 0x58
-	.4byte	0x1398e
+	.4byte	0x13981
 	.uleb128 0x58
-	.4byte	0x1399a
+	.4byte	0x1398d
 	.uleb128 0x58
-	.4byte	0x139a6
+	.4byte	0x13999
 	.uleb128 0x58
-	.4byte	0x139b2
+	.4byte	0x139a5
 	.uleb128 0x58
-	.4byte	0x139be
+	.4byte	0x139b1
 	.uleb128 0x58
-	.4byte	0x139ca
+	.4byte	0x139bd
 	.uleb128 0x61
-	.4byte	0x139d6
+	.4byte	0x139c9
 	.4byte	.LLST123
 	.uleb128 0x61
-	.4byte	0x139e2
+	.4byte	0x139d5
 	.4byte	.LLST124
 	.uleb128 0x58
-	.4byte	0x139ee
+	.4byte	0x139e1
 	.uleb128 0x61
-	.4byte	0x139fa
+	.4byte	0x139ed
 	.4byte	.LLST125
 	.uleb128 0x58
-	.4byte	0x13a04
+	.4byte	0x139f7
 	.uleb128 0x61
-	.4byte	0x13a0e
+	.4byte	0x13a01
 	.4byte	.LLST126
 	.uleb128 0x61
-	.4byte	0x13a1a
+	.4byte	0x13a0d
 	.4byte	.LLST127
 	.uleb128 0x58
-	.4byte	0x13a26
+	.4byte	0x13a19
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13b21
+	.4byte	0x13b14
 	.8byte	.LBB1312
 	.8byte	.LBE1312-.LBB1312
 	.byte	0x1
 	.2byte	0x48b
-	.4byte	0x1376e
+	.4byte	0x13761
 	.uleb128 0x55
-	.4byte	0x13b52
+	.4byte	0x13b45
 	.uleb128 0x55
-	.4byte	0x13b52
+	.4byte	0x13b45
 	.uleb128 0x55
-	.4byte	0x13b52
+	.4byte	0x13b45
 	.uleb128 0x55
-	.4byte	0x13b46
+	.4byte	0x13b39
 	.uleb128 0x55
-	.4byte	0x13b3a
+	.4byte	0x13b2d
 	.uleb128 0x55
-	.4byte	0x13b2e
+	.4byte	0x13b21
 	.uleb128 0x57
 	.8byte	.LBB1313
 	.8byte	.LBE1313-.LBB1313
 	.uleb128 0x58
-	.4byte	0x13b5e
+	.4byte	0x13b51
 	.uleb128 0x61
-	.4byte	0x13b6a
+	.4byte	0x13b5d
 	.4byte	.LLST128
 	.uleb128 0x58
-	.4byte	0x13b74
+	.4byte	0x13b67
 	.uleb128 0x61
-	.4byte	0x13b7e
+	.4byte	0x13b71
 	.4byte	.LLST129
 	.uleb128 0x61
-	.4byte	0x13b8a
+	.4byte	0x13b7d
 	.4byte	.LLST130
 	.uleb128 0x61
-	.4byte	0x13b96
+	.4byte	0x13b89
 	.4byte	.LLST131
 	.uleb128 0x58
-	.4byte	0x13ba2
+	.4byte	0x13b95
 	.uleb128 0x62
-	.4byte	0x13bae
+	.4byte	0x13ba1
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x13bba
+	.4byte	0x13bad
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x13bc6
+	.4byte	0x13bb9
 	.4byte	.LLST132
 	.uleb128 0x61
-	.4byte	0x13bd2
+	.4byte	0x13bc5
 	.4byte	.LLST133
 	.uleb128 0x61
-	.4byte	0x13bde
+	.4byte	0x13bd1
 	.4byte	.LLST134
 	.uleb128 0x58
-	.4byte	0x13bea
+	.4byte	0x13bdd
 	.uleb128 0x5c
-	.4byte	0x144ce
+	.4byte	0x144c1
 	.8byte	.LBB1314
 	.4byte	.Ldebug_ranges0+0x850
 	.byte	0x1
 	.2byte	0x3c4
-	.4byte	0x13748
+	.4byte	0x1373b
 	.uleb128 0x55
-	.4byte	0x144f6
+	.4byte	0x144e9
 	.uleb128 0x55
-	.4byte	0x144ea
+	.4byte	0x144dd
 	.uleb128 0x55
-	.4byte	0x144de
+	.4byte	0x144d1
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x144ce
+	.4byte	0x144c1
 	.8byte	.LBB1321
 	.4byte	.Ldebug_ranges0+0x8b0
 	.byte	0x1
 	.2byte	0x3c5
 	.uleb128 0x55
-	.4byte	0x144f6
+	.4byte	0x144e9
 	.uleb128 0x55
-	.4byte	0x144ea
+	.4byte	0x144dd
 	.uleb128 0x55
-	.4byte	0x144de
+	.4byte	0x144d1
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x13a33
+	.4byte	0x13a26
 	.8byte	.LBB1332
 	.8byte	.LBE1332-.LBB1332
 	.byte	0x1
 	.2byte	0x485
 	.uleb128 0x55
-	.4byte	0x13a64
+	.4byte	0x13a57
 	.uleb128 0x55
-	.4byte	0x13a64
+	.4byte	0x13a57
 	.uleb128 0x55
-	.4byte	0x13a64
+	.4byte	0x13a57
 	.uleb128 0x55
-	.4byte	0x13a58
+	.4byte	0x13a4b
 	.uleb128 0x55
-	.4byte	0x13a4c
+	.4byte	0x13a3f
 	.uleb128 0x55
-	.4byte	0x13a40
+	.4byte	0x13a33
 	.uleb128 0x57
 	.8byte	.LBB1333
 	.8byte	.LBE1333-.LBB1333
 	.uleb128 0x58
-	.4byte	0x13a70
+	.4byte	0x13a63
 	.uleb128 0x61
-	.4byte	0x13a7c
+	.4byte	0x13a6f
 	.4byte	.LLST135
 	.uleb128 0x58
-	.4byte	0x13a86
+	.4byte	0x13a79
 	.uleb128 0x61
-	.4byte	0x13a90
+	.4byte	0x13a83
 	.4byte	.LLST136
 	.uleb128 0x61
-	.4byte	0x13a9c
+	.4byte	0x13a8f
 	.4byte	.LLST137
 	.uleb128 0x61
-	.4byte	0x13aa8
+	.4byte	0x13a9b
 	.4byte	.LLST138
 	.uleb128 0x58
-	.4byte	0x13ab4
+	.4byte	0x13aa7
 	.uleb128 0x62
-	.4byte	0x13ac0
+	.4byte	0x13ab3
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x13acc
+	.4byte	0x13abf
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x13ad8
+	.4byte	0x13acb
 	.4byte	.LLST139
 	.uleb128 0x61
-	.4byte	0x13ae4
+	.4byte	0x13ad7
 	.4byte	.LLST140
 	.uleb128 0x61
-	.4byte	0x13af0
+	.4byte	0x13ae3
 	.4byte	.LLST141
 	.uleb128 0x58
-	.4byte	0x13afc
+	.4byte	0x13aef
 	.uleb128 0x58
-	.4byte	0x13b08
+	.4byte	0x13afb
 	.uleb128 0x58
-	.4byte	0x13b14
+	.4byte	0x13b07
 	.uleb128 0x5c
-	.4byte	0x14499
+	.4byte	0x1448c
 	.8byte	.LBB1334
 	.4byte	.Ldebug_ranges0+0x900
 	.byte	0x1
 	.2byte	0x3eb
-	.4byte	0x13848
+	.4byte	0x1383b
 	.uleb128 0x55
-	.4byte	0x144c1
+	.4byte	0x144b4
 	.uleb128 0x55
-	.4byte	0x144b5
+	.4byte	0x144a8
 	.uleb128 0x55
-	.4byte	0x144a9
+	.4byte	0x1449c
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x14499
+	.4byte	0x1448c
 	.8byte	.LBB1340
 	.4byte	.Ldebug_ranges0+0x960
 	.byte	0x1
 	.2byte	0x3ec
 	.uleb128 0x55
-	.4byte	0x144c1
+	.4byte	0x144b4
 	.uleb128 0x55
-	.4byte	0x144b5
+	.4byte	0x144a8
 	.uleb128 0x55
-	.4byte	0x144a9
+	.4byte	0x1449c
 	.byte	0
 	.byte	0
 	.byte	0
@@ -47105,7 +47099,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x438
 	.byte	0x1
-	.4byte	0x13951
+	.4byte	0x13944
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
@@ -47202,7 +47196,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x3f2
 	.byte	0x1
-	.4byte	0x13a33
+	.4byte	0x13a26
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
@@ -47299,7 +47293,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x3cb
 	.byte	0x1
-	.4byte	0x13b21
+	.4byte	0x13b14
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
@@ -47401,7 +47395,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x3a6
 	.byte	0x1
-	.4byte	0x13bf7
+	.4byte	0x13bea
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
@@ -47493,7 +47487,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x37e
 	.byte	0x1
-	.4byte	0x13ccd
+	.4byte	0x13cc0
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
@@ -47588,7 +47582,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2816-.LFB2816
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13e2e
+	.4byte	0x13e21
 	.uleb128 0x75
 	.4byte	.LASF3135
 	.byte	0x1
@@ -47744,7 +47738,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2815-.LFB2815
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13f89
+	.4byte	0x13f7c
 	.uleb128 0x75
 	.4byte	.LASF3135
 	.byte	0x1
@@ -47892,7 +47886,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x1ac
 	.byte	0x1
-	.4byte	0x140a7
+	.4byte	0x1409a
 	.uleb128 0x66
 	.4byte	.LASF3167
 	.byte	0x1
@@ -48017,7 +48011,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2813-.LFB2813
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14151
+	.4byte	0x14144
 	.uleb128 0x59
 	.4byte	.LASF2288
 	.byte	0x1
@@ -48038,25 +48032,25 @@ __exitcall_ebc_exit:
 	.4byte	.LLST237
 	.uleb128 0x4f
 	.8byte	.LVL841
-	.4byte	0x1553d
+	.4byte	0x15530
 	.uleb128 0x4f
 	.8byte	.LVL843
-	.4byte	0x142eb
+	.4byte	0x142de
 	.uleb128 0x4f
 	.8byte	.LVL844
-	.4byte	0x15555
+	.4byte	0x15548
 	.uleb128 0x4f
 	.8byte	.LVL847
-	.4byte	0x14151
+	.4byte	0x14144
 	.uleb128 0x4f
 	.8byte	.LVL848
-	.4byte	0x15555
+	.4byte	0x15548
 	.uleb128 0x4f
 	.8byte	.LVL851
-	.4byte	0x14218
+	.4byte	0x1420b
 	.uleb128 0x4f
 	.8byte	.LVL852
-	.4byte	0x15555
+	.4byte	0x15548
 	.byte	0
 	.uleb128 0x76
 	.4byte	.LASF3178
@@ -48066,7 +48060,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2812-.LFB2812
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14218
+	.4byte	0x1420b
 	.uleb128 0x75
 	.4byte	.LASF3167
 	.byte	0x1
@@ -48152,7 +48146,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2811-.LFB2811
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x142eb
+	.4byte	0x142de
 	.uleb128 0x75
 	.4byte	.LASF3167
 	.byte	0x1
@@ -48243,7 +48237,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2810-.LFB2810
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x143d0
+	.4byte	0x143c3
 	.uleb128 0x78
 	.4byte	.LASF3167
 	.byte	0x1
@@ -48346,7 +48340,7 @@ __exitcall_ebc_exit:
 	.byte	0xb7
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x14403
+	.4byte	0x143f6
 	.uleb128 0x7f
 	.string	"ebc"
 	.byte	0x1
@@ -48369,7 +48363,7 @@ __exitcall_ebc_exit:
 	.byte	0xa5
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x1444e
+	.4byte	0x14441
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
@@ -48402,7 +48396,7 @@ __exitcall_ebc_exit:
 	.byte	0x8f
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x14499
+	.4byte	0x1448c
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
@@ -48435,7 +48429,7 @@ __exitcall_ebc_exit:
 	.byte	0x89
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x144ce
+	.4byte	0x144c1
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
@@ -48458,7 +48452,7 @@ __exitcall_ebc_exit:
 	.byte	0x83
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x14503
+	.4byte	0x144f6
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
@@ -48480,7 +48474,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x14529
+	.4byte	0x1451c
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
@@ -48497,7 +48491,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x1455b
+	.4byte	0x1454e
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
@@ -48519,7 +48513,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x145a5
+	.4byte	0x14598
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
@@ -48551,7 +48545,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x145bf
+	.4byte	0x145b2
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
@@ -48564,7 +48558,7 @@ __exitcall_ebc_exit:
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x145e8
+	.4byte	0x145db
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
@@ -48581,7 +48575,7 @@ __exitcall_ebc_exit:
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x14632
+	.4byte	0x14625
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
@@ -48614,7 +48608,7 @@ __exitcall_ebc_exit:
 	.2byte	0x108
 	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x14650
+	.4byte	0x14643
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
@@ -48627,7 +48621,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x1466c
+	.4byte	0x1465f
 	.uleb128 0x7f
 	.string	"bus"
 	.byte	0xc8
@@ -48640,7 +48634,7 @@ __exitcall_ebc_exit:
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14689
+	.4byte	0x1467c
 	.uleb128 0x80
 	.4byte	.LASF3203
 	.byte	0xa
@@ -48652,7 +48646,7 @@ __exitcall_ebc_exit:
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x146c6
+	.4byte	0x146b9
 	.uleb128 0x7f
 	.string	"dev"
 	.byte	0xcb
@@ -48680,7 +48674,7 @@ __exitcall_ebc_exit:
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x146e3
+	.4byte	0x146d6
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48693,7 +48687,7 @@ __exitcall_ebc_exit:
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14709
+	.4byte	0x146fc
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48710,7 +48704,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x14723
+	.4byte	0x14716
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48722,7 +48716,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x1473d
+	.4byte	0x14730
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48734,7 +48728,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x14757
+	.4byte	0x1474a
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48746,7 +48740,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x14771
+	.4byte	0x14764
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48764,12 +48758,12 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x14798
+	.4byte	0x1478b
 	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x14798
+	.4byte	0x1478b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -48779,24 +48773,24 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x147b8
+	.4byte	0x147ab
 	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x14798
+	.4byte	0x1478b
 	.byte	0
 	.uleb128 0x81
 	.4byte	.LASF3214
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x147f4
+	.4byte	0x147e7
 	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x14798
+	.4byte	0x1478b
 	.uleb128 0x80
 	.4byte	.LASF193
 	.byte	0x4
@@ -48819,7 +48813,7 @@ __exitcall_ebc_exit:
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14824
+	.4byte	0x14817
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -48842,7 +48836,7 @@ __exitcall_ebc_exit:
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14854
+	.4byte	0x14847
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -48865,7 +48859,7 @@ __exitcall_ebc_exit:
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14884
+	.4byte	0x14877
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -48888,7 +48882,7 @@ __exitcall_ebc_exit:
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x148bf
+	.4byte	0x148b2
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -48916,7 +48910,7 @@ __exitcall_ebc_exit:
 	.byte	0xf5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x148f3
+	.4byte	0x148e6
 	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0x6
@@ -48941,7 +48935,7 @@ __exitcall_ebc_exit:
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1493f
+	.4byte	0x14932
 	.uleb128 0x80
 	.4byte	.LASF1164
 	.byte	0x6
@@ -48976,7 +48970,7 @@ __exitcall_ebc_exit:
 	.2byte	0x2e5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14969
+	.4byte	0x1495c
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x11
@@ -48994,7 +48988,7 @@ __exitcall_ebc_exit:
 	.2byte	0x216
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x149a1
+	.4byte	0x14994
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x11
@@ -49019,7 +49013,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1dd
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x149d7
+	.4byte	0x149ca
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x11
@@ -49042,7 +49036,7 @@ __exitcall_ebc_exit:
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x149f5
+	.4byte	0x149e8
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x11
@@ -49055,7 +49049,7 @@ __exitcall_ebc_exit:
 	.2byte	0x13d
 	.4byte	0xd813
 	.byte	0x3
-	.4byte	0x14a13
+	.4byte	0x14a06
 	.uleb128 0x66
 	.4byte	.LASF171
 	.byte	0x11
@@ -49067,7 +49061,7 @@ __exitcall_ebc_exit:
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x14a39
+	.4byte	0x14a2c
 	.uleb128 0x80
 	.4byte	.LASF3052
 	.byte	0xbe
@@ -49085,12 +49079,12 @@ __exitcall_ebc_exit:
 	.byte	0xd6
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14a56
+	.4byte	0x14a49
 	.uleb128 0x80
 	.4byte	.LASF3052
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x14a56
+	.4byte	0x14a49
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -49101,12 +49095,12 @@ __exitcall_ebc_exit:
 	.2byte	0x164
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14a7a
+	.4byte	0x14a6d
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x14a7a
+	.4byte	0x14a6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -49117,7 +49111,7 @@ __exitcall_ebc_exit:
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14ab5
+	.4byte	0x14aa8
 	.uleb128 0x65
 	.string	"np"
 	.byte	0xc
@@ -49140,7 +49134,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14b01
+	.4byte	0x14af4
 	.uleb128 0x65
 	.string	"np"
 	.byte	0xc
@@ -49172,7 +49166,7 @@ __exitcall_ebc_exit:
 	.byte	0xc
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x14b1b
+	.4byte	0x14b0e
 	.uleb128 0x80
 	.4byte	.LASF882
 	.byte	0xc
@@ -49184,7 +49178,7 @@ __exitcall_ebc_exit:
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x14b41
+	.4byte	0x14b34
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -49202,7 +49196,7 @@ __exitcall_ebc_exit:
 	.2byte	0x49b
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14b5f
+	.4byte	0x14b52
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -49215,7 +49209,7 @@ __exitcall_ebc_exit:
 	.2byte	0x2c5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14b95
+	.4byte	0x14b88
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -49238,7 +49232,7 @@ __exitcall_ebc_exit:
 	.byte	0xca
 	.4byte	0x351
 	.byte	0x3
-	.4byte	0x14bb1
+	.4byte	0x14ba4
 	.uleb128 0x7f
 	.string	"res"
 	.byte	0xd
@@ -49251,7 +49245,7 @@ __exitcall_ebc_exit:
 	.byte	0x22
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x14bcd
+	.4byte	0x14bc0
 	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0xcc
@@ -49264,7 +49258,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14bea
+	.4byte	0x14bdd
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xcd
@@ -49277,7 +49271,7 @@ __exitcall_ebc_exit:
 	.2byte	0x203
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x14c13
+	.4byte	0x14c06
 	.uleb128 0x65
 	.string	"wq"
 	.byte	0x12
@@ -49294,7 +49288,7 @@ __exitcall_ebc_exit:
 	.byte	0x12
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x14c39
+	.4byte	0x14c2c
 	.uleb128 0x80
 	.4byte	.LASF2288
 	.byte	0x12
@@ -49312,7 +49306,7 @@ __exitcall_ebc_exit:
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14c55
+	.4byte	0x14c48
 	.uleb128 0x65
 	.string	"m"
 	.byte	0x51
@@ -49325,7 +49319,7 @@ __exitcall_ebc_exit:
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14c71
+	.4byte	0x14c64
 	.uleb128 0x65
 	.string	"m"
 	.byte	0x51
@@ -49338,7 +49332,7 @@ __exitcall_ebc_exit:
 	.byte	0x97
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x14cb0
+	.4byte	0x14ca3
 	.uleb128 0x80
 	.4byte	.LASF1164
 	.byte	0xca
@@ -49365,7 +49359,7 @@ __exitcall_ebc_exit:
 	.byte	0xca
 	.byte	0x91
 	.byte	0x3
-	.4byte	0x14ce3
+	.4byte	0x14cd6
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xca
@@ -49389,7 +49383,7 @@ __exitcall_ebc_exit:
 	.byte	0xca
 	.byte	0x80
 	.byte	0x3
-	.4byte	0x14d11
+	.4byte	0x14d04
 	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0xca
@@ -49412,12 +49406,12 @@ __exitcall_ebc_exit:
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14d38
+	.4byte	0x14d2b
 	.uleb128 0x7f
 	.string	"ti"
 	.byte	0xca
 	.byte	0x5f
-	.4byte	0x14d38
+	.4byte	0x14d2b
 	.uleb128 0x80
 	.4byte	.LASF3258
 	.byte	0xca
@@ -49433,7 +49427,7 @@ __exitcall_ebc_exit:
 	.byte	0xf
 	.4byte	0x2f05
 	.byte	0x3
-	.4byte	0x14d5a
+	.4byte	0x14d4d
 	.uleb128 0x7a
 	.4byte	.LASF3260
 	.byte	0x5
@@ -49445,7 +49439,7 @@ __exitcall_ebc_exit:
 	.byte	0xf
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x14da0
+	.4byte	0x14d93
 	.uleb128 0x80
 	.4byte	.LASF976
 	.byte	0xf
@@ -49456,7 +49450,7 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0xf
 	.byte	0x1c
-	.4byte	0x14d93
+	.4byte	0x14d86
 	.uleb128 0x22
 	.4byte	.LASF3130
 	.byte	0xf
@@ -49466,13 +49460,13 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0xf
 	.byte	0x1c
-	.4byte	0x1274d
+	.4byte	0x12740
 	.byte	0
 	.uleb128 0x7d
 	.string	"__u"
 	.byte	0xf
 	.byte	0x1c
-	.4byte	0x14d74
+	.4byte	0x14d67
 	.byte	0
 	.byte	0
 	.uleb128 0x83
@@ -49486,7 +49480,7 @@ __exitcall_ebc_exit:
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14dc4
+	.4byte	0x14db7
 	.uleb128 0x7f
 	.string	"n"
 	.byte	0xce
@@ -49499,7 +49493,7 @@ __exitcall_ebc_exit:
 	.byte	0x9a
 	.4byte	0xe2
 	.byte	0x3
-	.4byte	0x14df8
+	.4byte	0x14deb
 	.uleb128 0x80
 	.4byte	.LASF2470
 	.byte	0x8
@@ -49522,7 +49516,7 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x14e12
+	.4byte	0x14e05
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xcf
@@ -49535,12 +49529,12 @@ __exitcall_ebc_exit:
 	.byte	0xb8
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x14e2c
+	.4byte	0x14e1f
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd0
 	.byte	0xb8
-	.4byte	0x14e2c
+	.4byte	0x14e1f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -49551,7 +49545,7 @@ __exitcall_ebc_exit:
 	.byte	0x39
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x14e4e
+	.4byte	0x14e41
 	.uleb128 0x7f
 	.string	"val"
 	.byte	0xd0
@@ -49564,7 +49558,7 @@ __exitcall_ebc_exit:
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14e75
+	.4byte	0x14e68
 	.uleb128 0x7f
 	.string	"nr"
 	.byte	0x7
@@ -49574,7 +49568,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF1164
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x14e75
+	.4byte	0x14e68
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -49584,7 +49578,7 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x14eaf
+	.4byte	0x14ea2
 	.uleb128 0x7f
 	.string	"i"
 	.byte	0x10
@@ -49594,7 +49588,7 @@ __exitcall_ebc_exit:
 	.string	"v"
 	.byte	0x10
 	.byte	0x2f
-	.4byte	0x14eaf
+	.4byte	0x14ea2
 	.uleb128 0x7d
 	.string	"w0"
 	.byte	0x10
@@ -49604,7 +49598,7 @@ __exitcall_ebc_exit:
 	.string	"x1"
 	.byte	0x10
 	.byte	0x2f
-	.4byte	0x14eaf
+	.4byte	0x14ea2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -49615,7 +49609,7 @@ __exitcall_ebc_exit:
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14ecf
+	.4byte	0x14ec2
 	.uleb128 0x7f
 	.string	"x"
 	.byte	0xd1
@@ -49628,7 +49622,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14eec
+	.4byte	0x14edf
 	.uleb128 0x80
 	.4byte	.LASF2503
 	.byte	0xd2
@@ -49640,12 +49634,12 @@ __exitcall_ebc_exit:
 	.byte	0xd3
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x14f0f
+	.4byte	0x14f02
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd3
 	.byte	0xb
-	.4byte	0x14f0f
+	.4byte	0x14f02
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xd3
@@ -49654,21 +49648,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x14f17
+	.4byte	0x14f0a
 	.uleb128 0x84
 	.uleb128 0x3
-	.4byte	0x14f15
+	.4byte	0x14f08
 	.uleb128 0x81
 	.4byte	.LASF3272
 	.byte	0xd3
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x14f3f
+	.4byte	0x14f32
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd3
 	.byte	0x9
-	.4byte	0x14f0f
+	.4byte	0x14f02
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xd3
@@ -49680,12 +49674,12 @@ __exitcall_ebc_exit:
 	.byte	0xe
 	.2byte	0x11a
 	.byte	0x3
-	.4byte	0x14f6f
+	.4byte	0x14f62
 	.uleb128 0x65
 	.string	"p"
 	.byte	0xe
 	.2byte	0x11a
-	.4byte	0x14f6f
+	.4byte	0x14f62
 	.uleb128 0x65
 	.string	"res"
 	.byte	0xe
@@ -49699,14 +49693,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x14f15
+	.4byte	0x14f08
 	.uleb128 0x85
 	.4byte	0x103dd
 	.8byte	.LFB2847
 	.8byte	.LFE2847-.LFB2847
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14fa2
+	.4byte	0x14f95
 	.uleb128 0x70
 	.4byte	0x103ee
 	.4byte	.LLST10
@@ -49716,233 +49710,233 @@ __exitcall_ebc_exit:
 	.byte	0x51
 	.byte	0
 	.uleb128 0x86
-	.4byte	0x1292f
+	.4byte	0x12922
 	.8byte	.LFB2879
 	.8byte	.LFE2879-.LFB2879
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x150a5
+	.4byte	0x15098
 	.uleb128 0x70
-	.4byte	0x1293c
+	.4byte	0x1292f
 	.4byte	.LLST188
 	.uleb128 0x55
-	.4byte	0x12948
+	.4byte	0x1293b
 	.uleb128 0x58
-	.4byte	0x12954
+	.4byte	0x12947
 	.uleb128 0x5c
-	.4byte	0x145e8
+	.4byte	0x145db
 	.8byte	.LBB1448
 	.4byte	.Ldebug_ranges0+0xbf0
 	.byte	0x1
 	.2byte	0x5c8
-	.4byte	0x15023
+	.4byte	0x15016
 	.uleb128 0x55
-	.4byte	0x14619
+	.4byte	0x1460c
 	.uleb128 0x55
-	.4byte	0x1460d
+	.4byte	0x14600
 	.uleb128 0x55
-	.4byte	0x14601
+	.4byte	0x145f4
 	.uleb128 0x55
-	.4byte	0x145f5
+	.4byte	0x145e8
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xbf0
 	.uleb128 0x58
-	.4byte	0x14625
+	.4byte	0x14618
 	.uleb128 0x60
-	.4byte	0x14632
+	.4byte	0x14625
 	.8byte	.LBB1450
 	.4byte	.Ldebug_ranges0+0xc40
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x55
-	.4byte	0x14643
+	.4byte	0x14636
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x1455b
+	.4byte	0x1454e
 	.8byte	.LBB1459
 	.4byte	.Ldebug_ranges0+0xc70
 	.byte	0x1
 	.2byte	0x5c9
-	.4byte	0x15055
+	.4byte	0x15048
 	.uleb128 0x55
-	.4byte	0x14598
+	.4byte	0x1458b
 	.uleb128 0x55
-	.4byte	0x1458c
+	.4byte	0x1457f
 	.uleb128 0x55
-	.4byte	0x14580
+	.4byte	0x14573
 	.uleb128 0x55
-	.4byte	0x14574
+	.4byte	0x14567
 	.uleb128 0x55
-	.4byte	0x14568
+	.4byte	0x1455b
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14529
+	.4byte	0x1451c
 	.8byte	.LBB1465
 	.8byte	.LBE1465-.LBB1465
 	.byte	0x1
 	.2byte	0x5ca
-	.4byte	0x15081
+	.4byte	0x15074
 	.uleb128 0x55
-	.4byte	0x1454e
+	.4byte	0x14541
 	.uleb128 0x55
-	.4byte	0x14542
+	.4byte	0x14535
 	.uleb128 0x55
-	.4byte	0x14536
+	.4byte	0x14529
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x14503
+	.4byte	0x144f6
 	.8byte	.LBB1467
 	.8byte	.LBE1467-.LBB1467
 	.byte	0x1
 	.2byte	0x5cb
 	.uleb128 0x55
-	.4byte	0x1451c
+	.4byte	0x1450f
 	.uleb128 0x55
-	.4byte	0x14510
+	.4byte	0x14503
 	.byte	0
 	.byte	0
 	.uleb128 0x86
-	.4byte	0x143d0
+	.4byte	0x143c3
 	.8byte	.LFB2881
 	.8byte	.LFE2881-.LFB2881
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x15163
+	.4byte	0x15156
 	.uleb128 0x70
-	.4byte	0x143e0
+	.4byte	0x143d3
 	.4byte	.LLST190
 	.uleb128 0x70
-	.4byte	0x143eb
+	.4byte	0x143de
 	.4byte	.LLST191
 	.uleb128 0x58
-	.4byte	0x143f7
+	.4byte	0x143ea
 	.uleb128 0x71
-	.4byte	0x145a5
+	.4byte	0x14598
 	.8byte	.LBB1478
 	.8byte	.LBE1478-.LBB1478
 	.byte	0x1
 	.byte	0xc9
-	.4byte	0x150f9
+	.4byte	0x150ec
 	.uleb128 0x55
-	.4byte	0x145b2
+	.4byte	0x145a5
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x1473d
+	.4byte	0x14730
 	.8byte	.LBB1480
 	.8byte	.LBE1480-.LBB1480
 	.byte	0x1
 	.byte	0xca
-	.4byte	0x1511a
+	.4byte	0x1510d
 	.uleb128 0x55
-	.4byte	0x1474a
+	.4byte	0x1473d
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x1477e
+	.4byte	0x14771
 	.8byte	.LBB1482
 	.8byte	.LBE1482-.LBB1482
 	.byte	0x1
 	.byte	0xcd
-	.4byte	0x15148
+	.4byte	0x1513b
 	.uleb128 0x55
-	.4byte	0x1478b
+	.4byte	0x1477e
 	.uleb128 0x4f
 	.8byte	.LVL584
-	.4byte	0x15519
+	.4byte	0x1550c
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL581
-	.4byte	0x1528e
+	.4byte	0x15281
 	.uleb128 0x4f
 	.8byte	.LVL585
-	.4byte	0x1528e
+	.4byte	0x15281
 	.byte	0
 	.uleb128 0x85
-	.4byte	0x122ab
+	.4byte	0x1229e
 	.8byte	.LFB2883
 	.8byte	.LFE2883-.LFB2883
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x151c4
+	.4byte	0x151b7
 	.uleb128 0x55
-	.4byte	0x122c8
+	.4byte	0x122bb
 	.uleb128 0x55
-	.4byte	0x122bc
+	.4byte	0x122af
 	.uleb128 0x55
-	.4byte	0x122bc
+	.4byte	0x122af
 	.uleb128 0x58
-	.4byte	0x122d4
+	.4byte	0x122c7
 	.uleb128 0x58
-	.4byte	0x122de
+	.4byte	0x122d1
 	.uleb128 0x58
-	.4byte	0x122ea
+	.4byte	0x122dd
 	.uleb128 0x61
-	.4byte	0x122f6
+	.4byte	0x122e9
 	.4byte	.LLST193
 	.uleb128 0x62
-	.4byte	0x12302
+	.4byte	0x122f5
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x1230e
+	.4byte	0x12301
 	.4byte	.LLST194
 	.uleb128 0x4f
 	.8byte	.LVL595
-	.4byte	0x15590
+	.4byte	0x15583
 	.byte	0
 	.uleb128 0x86
-	.4byte	0x143d0
+	.4byte	0x143c3
 	.8byte	.LFB2887
 	.8byte	.LFE2887-.LFB2887
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x15276
+	.4byte	0x15269
 	.uleb128 0x70
-	.4byte	0x143e0
+	.4byte	0x143d3
 	.4byte	.LLST220
 	.uleb128 0x58
-	.4byte	0x143f7
+	.4byte	0x143ea
 	.uleb128 0x55
-	.4byte	0x143eb
+	.4byte	0x143de
 	.uleb128 0x71
-	.4byte	0x14757
+	.4byte	0x1474a
 	.8byte	.LBB1805
 	.8byte	.LBE1805-.LBB1805
 	.byte	0x1
 	.byte	0xc2
-	.4byte	0x15214
+	.4byte	0x15207
 	.uleb128 0x55
-	.4byte	0x14764
+	.4byte	0x14757
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x145bf
+	.4byte	0x145b2
 	.8byte	.LBB1807
 	.8byte	.LBE1807-.LBB1807
 	.byte	0x1
 	.byte	0xc3
-	.4byte	0x1523a
+	.4byte	0x1522d
 	.uleb128 0x55
-	.4byte	0x145db
+	.4byte	0x145ce
 	.uleb128 0x55
-	.4byte	0x145cf
+	.4byte	0x145c2
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x1479e
+	.4byte	0x14791
 	.8byte	.LBB1809
 	.8byte	.LBE1809-.LBB1809
 	.byte	0x1
 	.byte	0xbf
-	.4byte	0x15268
+	.4byte	0x1525b
 	.uleb128 0x55
-	.4byte	0x147ab
+	.4byte	0x1479e
 	.uleb128 0x4f
 	.8byte	.LVL787
-	.4byte	0x1559c
+	.4byte	0x1558f
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL784
-	.4byte	0x1528e
+	.4byte	0x15281
 	.byte	0
 	.uleb128 0x87
 	.4byte	.LASF3274
@@ -53648,10 +53642,10 @@ __exitcall_ebc_exit:
 	.8byte	0
 .LLST240:
 	.8byte	.LVL876
-	.8byte	.LVL887
+	.8byte	.LVL886
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL890
+	.8byte	.LVL889
 	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x64
@@ -53659,529 +53653,529 @@ __exitcall_ebc_exit:
 	.8byte	0
 .LLST241:
 	.8byte	.LVL877
-	.8byte	.LVL889
+	.8byte	.LVL888
 	.2byte	0x1
 	.byte	0x6a
+	.8byte	.LVL889
 	.8byte	.LVL890
-	.8byte	.LVL891
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL891
-	.8byte	.LVL901
+	.8byte	.LVL890
+	.8byte	.LVL896
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL901
-	.8byte	.LVL903
+	.8byte	.LVL896
+	.8byte	.LVL898
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL903
-	.8byte	.LVL941
+	.8byte	.LVL898
+	.8byte	.LVL942
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL941
 	.8byte	.LVL942
+	.8byte	.LVL943
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL942
-	.8byte	.LVL968
+	.8byte	.LVL943
+	.8byte	.LVL969
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL968
 	.8byte	.LVL969
+	.8byte	.LVL970
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL969
-	.8byte	.LVL1016
+	.8byte	.LVL970
+	.8byte	.LVL1015
 	.2byte	0x1
 	.byte	0x6a
+	.8byte	.LVL1015
 	.8byte	.LVL1016
-	.8byte	.LVL1017
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1017
+	.8byte	.LVL1016
 	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
 .LLST242:
-	.8byte	.LVL906
-	.8byte	.LVL910-1
+	.8byte	.LVL901
+	.8byte	.LVL905-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL940
-	.8byte	.LVL941
+	.8byte	.LVL935
+	.8byte	.LVL936
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL965
-	.8byte	.LVL967-1
+	.8byte	.LVL966
+	.8byte	.LVL968-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL987
-	.8byte	.LVL991-1
+	.8byte	.LVL988
+	.8byte	.LVL992-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST243:
-	.8byte	.LVL908
-	.8byte	.LVL909
+	.8byte	.LVL903
+	.8byte	.LVL904
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL966
-	.8byte	.LVL967-1
+	.8byte	.LVL967
+	.8byte	.LVL968-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST244:
 	.8byte	.LVL877
-	.8byte	.LVL889
+	.8byte	.LVL888
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL890
-	.8byte	.LVL923
+	.8byte	.LVL889
+	.8byte	.LVL918
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL927
-	.8byte	.LVL930
+	.8byte	.LVL922
+	.8byte	.LVL925
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL934
-	.8byte	.LVL994
+	.8byte	.LVL929
+	.8byte	.LVL995
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL999
-	.8byte	.LVL1021
+	.8byte	.LVL1000
+	.8byte	.LVL1020
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1027
+	.8byte	.LVL1026
 	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
 .LLST261:
-	.8byte	.LVL984
 	.8byte	.LVL985
+	.8byte	.LVL986
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1023
-	.8byte	.LVL1024-1
+	.8byte	.LVL1022
+	.8byte	.LVL1023-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST260:
-	.8byte	.LVL958
 	.8byte	.LVL959
+	.8byte	.LVL960
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1012
-	.8byte	.LVL1013-1
+	.8byte	.LVL1011
+	.8byte	.LVL1012-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST259:
+	.8byte	.LVL891
 	.8byte	.LVL892
-	.8byte	.LVL893
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL948
-	.8byte	.LVL949-1
+	.8byte	.LVL949
+	.8byte	.LVL950-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST245:
-	.8byte	.LVL877
-	.8byte	.LVL878
-	.2byte	0x1
-	.byte	0x50
+	.8byte	.LVL893
 	.8byte	.LVL894
-	.8byte	.LVL895
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL897
-	.8byte	.LVL898-1
+	.8byte	.LVL938
+	.8byte	.LVL939-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST246:
-	.8byte	.LVL988
 	.8byte	.LVL989
+	.8byte	.LVL990
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL989
 	.8byte	.LVL990
+	.8byte	.LVL991
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST247:
-	.8byte	.LVL915
-	.8byte	.LVL916-1
+	.8byte	.LVL910
+	.8byte	.LVL911-1
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST248:
-	.8byte	.LVL912
-	.8byte	.LVL913-1
+	.8byte	.LVL907
+	.8byte	.LVL908-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL918
-	.8byte	.LVL934
+	.8byte	.LVL913
+	.8byte	.LVL929
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL961
-	.8byte	.LVL963-1
+	.8byte	.LVL962
+	.8byte	.LVL964-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL994
-	.8byte	.LVL1000-1
+	.8byte	.LVL995
+	.8byte	.LVL1001-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL1003
-	.8byte	.LVL1004-1
+	.8byte	.LVL1004
+	.8byte	.LVL1005-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL1027
-	.8byte	.LVL1028-1
+	.8byte	.LVL1026
+	.8byte	.LVL1027-1
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
 .LLST249:
-	.8byte	.LVL923
-	.8byte	.LVL926
+	.8byte	.LVL918
+	.8byte	.LVL921
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL931
-	.8byte	.LVL934
+	.8byte	.LVL926
+	.8byte	.LVL929
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL994
-	.8byte	.LVL997
+	.8byte	.LVL995
+	.8byte	.LVL998
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST250:
 	.8byte	.LVL877
-	.8byte	.LVL889
+	.8byte	.LVL888
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL890
-	.8byte	.LVL907
+	.8byte	.LVL889
+	.8byte	.LVL902
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL912
-	.8byte	.LVL923
+	.8byte	.LVL907
+	.8byte	.LVL918
 	.2byte	0x1
 	.byte	0x69
+	.8byte	.LVL920
 	.8byte	.LVL925
-	.8byte	.LVL930
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL934
-	.8byte	.LVL954
+	.8byte	.LVL929
+	.8byte	.LVL955
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL961
-	.8byte	.LVL965
+	.8byte	.LVL962
+	.8byte	.LVL966
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL968
-	.8byte	.LVL987
+	.8byte	.LVL969
+	.8byte	.LVL988
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL992
-	.8byte	.LVL994
+	.8byte	.LVL993
+	.8byte	.LVL995
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL996
-	.8byte	.LVL1010
+	.8byte	.LVL997
+	.8byte	.LVL1009
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1016
-	.8byte	.LVL1021
+	.8byte	.LVL1015
+	.8byte	.LVL1020
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1027
+	.8byte	.LVL1026
 	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
 .LLST251:
-	.8byte	.LVL912
-	.8byte	.LVL913-1
+	.8byte	.LVL907
+	.8byte	.LVL908-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL922
-	.8byte	.LVL924
+	.8byte	.LVL917
+	.8byte	.LVL919
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL925
-	.8byte	.LVL934
+	.8byte	.LVL920
+	.8byte	.LVL929
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL961
-	.8byte	.LVL963-1
+	.8byte	.LVL962
+	.8byte	.LVL964-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL994
 	.8byte	.LVL995
+	.8byte	.LVL996
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL999
-	.8byte	.LVL1000-1
+	.8byte	.LVL1000
+	.8byte	.LVL1001-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL1003
-	.8byte	.LVL1004-1
+	.8byte	.LVL1004
+	.8byte	.LVL1005-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL1027
-	.8byte	.LVL1028-1
+	.8byte	.LVL1026
+	.8byte	.LVL1027-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST252:
-	.8byte	.LVL912
-	.8byte	.LVL913-1
+	.8byte	.LVL907
+	.8byte	.LVL908-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL922
-	.8byte	.LVL932
+	.8byte	.LVL917
+	.8byte	.LVL927
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL933
-	.8byte	.LVL934
+	.8byte	.LVL928
+	.8byte	.LVL929
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL961
-	.8byte	.LVL963-1
+	.8byte	.LVL962
+	.8byte	.LVL964-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL994
-	.8byte	.LVL1000-1
+	.8byte	.LVL995
+	.8byte	.LVL1001-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL1003
-	.8byte	.LVL1004-1
+	.8byte	.LVL1004
+	.8byte	.LVL1005-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL1027
-	.8byte	.LVL1028-1
+	.8byte	.LVL1026
+	.8byte	.LVL1027-1
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST253:
-	.8byte	.LVL912
-	.8byte	.LVL913-1
+	.8byte	.LVL907
+	.8byte	.LVL908-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL922
-	.8byte	.LVL923
+	.8byte	.LVL917
+	.8byte	.LVL918
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL926
-	.8byte	.LVL928
+	.8byte	.LVL921
+	.8byte	.LVL923
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL928
-	.8byte	.LVL929
+	.8byte	.LVL923
+	.8byte	.LVL924
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL961
-	.8byte	.LVL963-1
+	.8byte	.LVL962
+	.8byte	.LVL964-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL998
-	.8byte	.LVL1000-1
+	.8byte	.LVL999
+	.8byte	.LVL1001-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL1003
-	.8byte	.LVL1004-1
+	.8byte	.LVL1004
+	.8byte	.LVL1005-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL1027
-	.8byte	.LVL1028-1
+	.8byte	.LVL1026
+	.8byte	.LVL1027-1
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST254:
-	.8byte	.LVL912
-	.8byte	.LVL913-1
+	.8byte	.LVL907
+	.8byte	.LVL908-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL921
-	.8byte	.LVL934
+	.8byte	.LVL916
+	.8byte	.LVL929
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL961
-	.8byte	.LVL963-1
+	.8byte	.LVL962
+	.8byte	.LVL964-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL994
-	.8byte	.LVL1000-1
+	.8byte	.LVL995
+	.8byte	.LVL1001-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL1003
-	.8byte	.LVL1004-1
+	.8byte	.LVL1004
+	.8byte	.LVL1005-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL1027
-	.8byte	.LVL1028-1
+	.8byte	.LVL1026
+	.8byte	.LVL1027-1
 	.2byte	0x1
 	.byte	0x61
 	.8byte	0
 	.8byte	0
 .LLST255:
-	.8byte	.LVL912
-	.8byte	.LVL913-1
+	.8byte	.LVL907
+	.8byte	.LVL908-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL919
-	.8byte	.LVL934
+	.8byte	.LVL914
+	.8byte	.LVL929
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL961
-	.8byte	.LVL963-1
+	.8byte	.LVL962
+	.8byte	.LVL964-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL994
-	.8byte	.LVL1000-1
+	.8byte	.LVL995
+	.8byte	.LVL1001-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL1003
-	.8byte	.LVL1004-1
+	.8byte	.LVL1004
+	.8byte	.LVL1005-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL1027
-	.8byte	.LVL1028-1
+	.8byte	.LVL1026
+	.8byte	.LVL1027-1
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
 .LLST256:
-	.8byte	.LVL912
-	.8byte	.LVL913-1
+	.8byte	.LVL907
+	.8byte	.LVL908-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL921
-	.8byte	.LVL934
+	.8byte	.LVL916
+	.8byte	.LVL929
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL961
-	.8byte	.LVL963-1
+	.8byte	.LVL962
+	.8byte	.LVL964-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL994
-	.8byte	.LVL1000-1
+	.8byte	.LVL995
+	.8byte	.LVL1001-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL1003
-	.8byte	.LVL1004-1
+	.8byte	.LVL1004
+	.8byte	.LVL1005-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL1027
-	.8byte	.LVL1028-1
+	.8byte	.LVL1026
+	.8byte	.LVL1027-1
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST257:
 	.8byte	.LVL877
-	.8byte	.LVL880
+	.8byte	.LVL879
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL886
-	.8byte	.LVL888
+	.8byte	.LVL885
+	.8byte	.LVL887
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL890
-	.8byte	.LVL902
+	.8byte	.LVL889
+	.8byte	.LVL897
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL912
-	.8byte	.LVL914
+	.8byte	.LVL907
+	.8byte	.LVL909
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL920
-	.8byte	.LVL934
+	.8byte	.LVL915
+	.8byte	.LVL929
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL946
-	.8byte	.LVL954
+	.8byte	.LVL936
+	.8byte	.LVL942
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL947
+	.8byte	.LVL955
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL961
 	.8byte	.LVL962
+	.8byte	.LVL963
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL994
-	.8byte	.LVL1006
+	.8byte	.LVL995
+	.8byte	.LVL1007
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL1027
-	.8byte	.LVL1029
+	.8byte	.LVL1026
+	.8byte	.LVL1028
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL1031
-	.8byte	.LVL1033
+	.8byte	.LVL1030
+	.8byte	.LVL1032
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL1039
-	.8byte	.LVL1041
+	.8byte	.LVL1038
+	.8byte	.LVL1040
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL1043
+	.8byte	.LVL1042
 	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
 .LLST258:
-	.8byte	.LVL938
-	.8byte	.LVL939
+	.8byte	.LVL933
+	.8byte	.LVL934
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL978
-	.8byte	.LVL979-1
+	.8byte	.LVL979
+	.8byte	.LVL980-1
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST262:
-	.8byte	.LVL936
-	.8byte	.LVL937
+	.8byte	.LVL931
+	.8byte	.LVL932
 	.2byte	0x1
 	.byte	0x54
+	.8byte	.LVL1018
 	.8byte	.LVL1019
-	.8byte	.LVL1020
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL1037
-	.8byte	.LVL1038-1
+	.8byte	.LVL1036
+	.8byte	.LVL1037-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST263:
-	.8byte	.LVL971
-	.8byte	.LVL972-1
+	.8byte	.LVL972
+	.8byte	.LVL973-1
 	.2byte	0x1
 	.byte	0x53
+	.8byte	.LVL1029
 	.8byte	.LVL1030
-	.8byte	.LVL1031
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
@@ -56348,8 +56342,8 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1852
 	.8byte	.LBB1859
 	.8byte	.LBE1859
-	.8byte	.LBB1860
-	.8byte	.LBE1860
+	.8byte	.LBB1876
+	.8byte	.LBE1876
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1854
@@ -56360,26 +56354,26 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1856
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1861
-	.8byte	.LBE1861
+	.8byte	.LBB1860
+	.8byte	.LBE1860
 	.8byte	.LBB1890
 	.8byte	.LBE1890
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1866
-	.8byte	.LBE1866
+	.8byte	.LBB1865
+	.8byte	.LBE1865
+	.8byte	.LBB1870
+	.8byte	.LBE1870
 	.8byte	.LBB1871
 	.8byte	.LBE1871
-	.8byte	.LBB1872
-	.8byte	.LBE1872
 	.8byte	.LBB1891
 	.8byte	.LBE1891
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1873
-	.8byte	.LBE1873
-	.8byte	.LBB1876
-	.8byte	.LBE1876
+	.8byte	.LBB1872
+	.8byte	.LBE1872
+	.8byte	.LBB1875
+	.8byte	.LBE1875
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1882
@@ -57359,8 +57353,6 @@ __exitcall_ebc_exit:
 	.string	"thread_union"
 .LASF1826:
 	.string	"bd_super"
-.LASF3044:
-	.string	"__addressable_ebc_init3172"
 .LASF2723:
 	.string	"usermodehelper_table"
 .LASF160:
@@ -57385,6 +57377,8 @@ __exitcall_ebc_exit:
 	.string	"nr_leaves_on_tree"
 .LASF1726:
 	.string	"quota_on"
+.LASF3044:
+	.string	"__addressable_ebc_init3180"
 .LASF2473:
 	.string	"of_root"
 .LASF1310:

commit b5188743249e54fa7725d142bc2626b216e84c26
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Fri Dec 3 17:47:48 2021 +0800

    drm/rockchip: ebc_dev: release version v2.19
    
    fix auto mode refresh not complete
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: Ieb6949abf7f27432d5f5a343e6e7b5e2b358f8a5

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index d4dbb16903ed..993afa0d2ee0 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -1119,15 +1119,15 @@ get_overlay_image:
 	.type	waveform_open, %function
 waveform_open:
 .LFB2847:
-	.loc 1 2596 0
+	.loc 1 2597 0
 	.cfi_startproc
 .LVL62:
-	.loc 1 2600 0
+	.loc 1 2601 0
 	mov	w0, 0
 .LVL63:
-	.loc 1 2597 0
+	.loc 1 2598 0
 	str	xzr, [x1, 104]
-	.loc 1 2600 0
+	.loc 1 2601 0
 	ret
 	.cfi_endproc
 .LFE2847:
@@ -1137,22 +1137,22 @@ waveform_open:
 	.type	ebc_exit, %function
 ebc_exit:
 .LFB2867:
-	.loc 1 3167 0
+	.loc 1 3168 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3168 0
+	.loc 1 3169 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3167 0
+	.loc 1 3168 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3168 0
+	.loc 1 3169 0
 	bl	platform_driver_unregister
 .LVL64:
-	.loc 1 3169 0
+	.loc 1 3170 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1167,7 +1167,7 @@ ebc_exit:
 	.type	ebc_resume, %function
 ebc_resume:
 .LFB2865:
-	.loc 1 3129 0
+	.loc 1 3130 0
 	.cfi_startproc
 .LVL65:
 	stp	x29, x30, [sp, -32]!
@@ -1178,17 +1178,17 @@ ebc_resume:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-.LBB952:
-.LBB953:
+.LBB954:
+.LBB955:
 	.file 2 "./include/linux/device.h"
 	.loc 2 1181 0
 	ldr	x19, [x0, 184]
-.LBE953:
-.LBE952:
-	.loc 1 3133 0
+.LBE955:
+.LBE954:
+	.loc 1 3134 0
 	ldr	x1, [x19, 16]
-.LBB954:
-.LBB955:
+.LBB956:
+.LBB957:
 	.file 3 "drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic.h"
 	.loc 3 45 0
 	mov	x0, x1
@@ -1196,17 +1196,17 @@ ebc_resume:
 	ldr	x1, [x1, 48]
 	blr	x1
 .LVL67:
-.LBE955:
-.LBE954:
-	.loc 1 3134 0
-	str	wzr, [x19, 804]
+.LBE957:
+.LBE956:
 	.loc 1 3135 0
+	str	wzr, [x19, 804]
+	.loc 1 3136 0
 	ldr	x0, [x19, 288]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
 .LVL68:
-	.loc 1 3138 0
+	.loc 1 3139 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -1223,44 +1223,44 @@ ebc_resume:
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
 .LFB2840:
-	.loc 1 2253 0
+	.loc 1 2254 0
 	.cfi_startproc
 .LVL69:
-	.loc 1 2254 0
+	.loc 1 2255 0
 	adrp	x0, .LANCHOR0
 .LVL70:
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2256 0
+	.loc 1 2257 0
 	ldr	w2, [x0, 624]
 	cbnz	w2, .L165
 	ret
 	.p2align 3
 .L165:
-	.loc 1 2253 0
+	.loc 1 2254 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-.LBB956:
-.LBB957:
+.LBB958:
+.LBB959:
 	.file 4 "./include/linux/wakelock.h"
 	.loc 4 68 0
 	add	x0, x0, 416
-.LBE957:
-.LBE956:
-	.loc 1 2253 0
+.LBE959:
+.LBE958:
+	.loc 1 2254 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2257 0
+	.loc 1 2258 0
 	str	wzr, [x0, 208]
-.LBB959:
-.LBB958:
+.LBB961:
+.LBB960:
 	.loc 4 68 0
 	bl	__pm_relax
 .LVL71:
-.LBE958:
-.LBE959:
-	.loc 1 2262 0
+.LBE960:
+.LBE961:
+	.loc 1 2263 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1274,27 +1274,27 @@ ebc_vdd_power_timeout:
 	.type	ebc_remove, %function
 ebc_remove:
 .LFB2863:
-	.loc 1 3105 0
+	.loc 1 3106 0
 	.cfi_startproc
 .LVL72:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3106 0
+	.loc 1 3107 0
 	adrp	x0, .LANCHOR1
 .LVL73:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3105 0
+	.loc 1 3106 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3106 0
+	.loc 1 3107 0
 	add	x0, x0, 224
-	.loc 1 3105 0
 	.loc 1 3106 0
+	.loc 1 3107 0
 	bl	misc_deregister
 .LVL74:
-	.loc 1 3109 0
+	.loc 1 3110 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -1309,7 +1309,7 @@ ebc_remove:
 	.type	ebc_mmap, %function
 ebc_mmap:
 .LFB2844:
-	.loc 1 2542 0
+	.loc 1 2543 0
 	.cfi_startproc
 .LVL75:
 	stp	x29, x30, [sp, -32]!
@@ -1320,33 +1320,33 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2542 0
+	.loc 1 2543 0
 	mov	x19, x1
-	.loc 1 2545 0
+	.loc 1 2546 0
 	bl	ebc_phy_buf_base_get
 .LVL76:
-	.loc 1 2548 0
+	.loc 1 2549 0
 	lsr	x2, x0, 12
-	.loc 1 2546 0
+	.loc 1 2547 0
 	mov	x6, 16384
-	.loc 1 2548 0
+	.loc 1 2549 0
 	mov	x0, x19
-	.loc 1 2546 0
+	.loc 1 2547 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 2548 0
+	.loc 1 2549 0
 	ldp	x1, x3, [x19]
-	.loc 1 2546 0
+	.loc 1 2547 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 2548 0
+	.loc 1 2549 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
 .LVL77:
-	.loc 1 2551 0
+	.loc 1 2552 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 2554 0
+	.loc 1 2555 0
 	ldr	x19, [sp, 16]
 .LVL78:
 	csel	w0, w0, w1, eq
@@ -1364,47 +1364,47 @@ ebc_mmap:
 	.type	waveform_mmap, %function
 waveform_mmap:
 .LFB2846:
-	.loc 1 2580 0
+	.loc 1 2581 0
 	.cfi_startproc
 .LVL79:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2581 0
+	.loc 1 2582 0
 	adrp	x2, .LANCHOR0
-	.loc 1 2585 0
+	.loc 1 2586 0
 	mov	x7, 16384
-	.loc 1 2587 0
+	.loc 1 2588 0
 	mov	x0, x1
 .LVL80:
-	.loc 1 2580 0
+	.loc 1 2581 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2584 0
-	ldr	x2, [x2, #:lo12:.LANCHOR0]
 	.loc 1 2585 0
+	ldr	x2, [x2, #:lo12:.LANCHOR0]
+	.loc 1 2586 0
 	movk	x7, 0x404, lsl 16
 	ldp	x4, x5, [x1, 72]
-	.loc 1 2587 0
+	.loc 1 2588 0
 	ldp	x6, x3, [x1]
-	.loc 1 2585 0
+	.loc 1 2586 0
 	orr	x5, x5, x7
-	.loc 1 2584 0
-	ldr	x2, [x2, 216]
 	.loc 1 2585 0
+	ldr	x2, [x2, 216]
+	.loc 1 2586 0
 	str	x5, [x1, 80]
-	.loc 1 2587 0
+	.loc 1 2588 0
 	sub	x3, x3, x6
 	mov	x1, x6
 .LVL81:
 	lsr	x2, x2, 12
 	bl	remap_pfn_range
 .LVL82:
-	.loc 1 2590 0
+	.loc 1 2591 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 2593 0
+	.loc 1 2594 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1419,16 +1419,16 @@ waveform_mmap:
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
 .LFB2843:
-	.loc 1 2338 0
+	.loc 1 2339 0
 	.cfi_startproc
 .LVL83:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 2348 0
+	.loc 1 2349 0
 	cmp	w1, 28672
-	.loc 1 2338 0
+	.loc 1 2339 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -1442,15 +1442,15 @@ ebc_io_ctl:
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
 	.cfi_offset 23, -112
-	.loc 1 2338 0
+	.loc 1 2339 0
 	mov	x21, x2
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 2340 0
+	.loc 1 2341 0
 	adrp	x0, .LANCHOR0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2348 0
+	.loc 1 2349 0
 	bcc	.L177
 	mov	w0, 28675
 	cmp	w1, w0
@@ -1460,7 +1460,7 @@ ebc_io_ctl:
 	cmp	w0, 1
 	bls	.L178
 .L177:
-	.loc 1 2364 0
+	.loc 1 2365 0
 	mov	w0, 28677
 	cmp	w1, w0
 	beq	.L181
@@ -1476,13 +1476,13 @@ ebc_io_ctl:
 	mov	w0, 28683
 	cmp	w1, w0
 	bne	.L180
-	.loc 1 2519 0
+	.loc 1 2520 0
 	bl	ebc_empty_buf_get
 .LVL85:
 	mov	x23, x0
-	.loc 1 2520 0
+	.loc 1 2521 0
 	cbz	x0, .L201
-	.loc 1 2522 0
+	.loc 1 2523 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 408]
@@ -1493,18 +1493,18 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL86:
-	.loc 1 2523 0
+	.loc 1 2524 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL87:
 	sub	w0, w20, w0
-.LBB960:
-.LBB961:
 .LBB962:
 .LBB963:
 .LBB964:
 .LBB965:
 .LBB966:
+.LBB967:
+.LBB968:
 	.file 5 "./arch/arm64/include/asm/current.h"
 	.loc 5 19 0
 #APP
@@ -1513,27 +1513,27 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL88:
 #NO_APP
-.LBE966:
-.LBE965:
+.LBE968:
+.LBE967:
 	.file 6 "./arch/arm64/include/asm/uaccess.h"
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
+.LBE966:
+.LBE965:
 .LBE964:
 .LBE963:
 .LBE962:
-.LBE961:
-.LBE960:
-	.loc 1 2525 0
+	.loc 1 2526 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 2524 0
+	.loc 1 2525 0
 	str	w0, [x29, 104]
-	.loc 1 2526 0
+	.loc 1 2527 0
 	stp	w4, w1, [x29, 112]
-.LBB991:
-.LBB988:
-.LBB985:
+.LBB993:
+.LBB990:
+.LBB987:
+.LBB977:
 .LBB975:
-.LBB973:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL89:
@@ -1541,47 +1541,47 @@ ebc_io_ctl:
 	tbnz	x3, 21, .L238
 .LVL90:
 .L304:
-.LBB967:
-.LBB968:
 .LBB969:
+.LBB970:
+.LBB971:
 	.file 7 "./include/asm-generic/bitops/non-atomic.h"
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL91:
+.LBE971:
+.LBE970:
 .LBE969:
-.LBE968:
-.LBE967:
-.LBE973:
 .LBE975:
-.LBE985:
-.LBE988:
-.LBE991:
-	.loc 1 2339 0
+.LBE977:
+.LBE987:
+.LBE990:
+.LBE993:
+	.loc 1 2340 0
 	mov	x0, x21
 .LVL92:
-.LBB992:
-.LBB989:
-.LBB986:
+.LBB994:
+.LBB991:
+.LBB988:
+.LBB978:
 .LBB976:
-.LBB974:
 	.loc 6 84 0
 	tbz	x2, 26, .L239
 .LVL93:
 .L238:
-.LBB970:
-.LBB971:
 .LBB972:
+.LBB973:
+.LBB974:
 	.file 8 "./include/linux/bitops.h"
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL94:
-.LBE972:
-.LBE971:
+.LBE974:
+.LBE973:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL95:
 .L239:
-.LBE970:
+.LBE972:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1594,46 +1594,46 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL96:
 #NO_APP
-.LBE974:
 .LBE976:
+.LBE978:
 	.file 9 "./include/linux/uaccess.h"
 	.loc 9 132 0
 	mov	x22, 48
 	cbnz	x0, .L312
 .L240:
-.LBE986:
-.LBE989:
-.LBE992:
-	.loc 1 2528 0
+.LBE988:
+.LBE991:
+.LBE994:
+	.loc 1 2529 0
 	mov	x0, x23
 .LVL97:
 	bl	ebc_buf_release
 .LVL98:
-	.loc 1 2529 0
+	.loc 1 2530 0
 	b	.L176
 .LVL99:
 	.p2align 3
 .L178:
-	.loc 1 2355 0
-	cbnz	x21, .L177
 	.loc 1 2356 0
+	cbnz	x21, .L177
+	.loc 1 2357 0
 	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
 .LVL100:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC1
-	.loc 1 2357 0
+	.loc 1 2358 0
 	mov	x22, -14
-	.loc 1 2356 0
+	.loc 1 2357 0
 	bl	_dev_err
 .LVL101:
-	.loc 1 2357 0
+	.loc 1 2358 0
 	b	.L176
 .LVL102:
 	.p2align 3
 .L310:
-	.loc 1 2364 0
+	.loc 1 2365 0
 	mov	w0, 28674
 	cmp	w1, w0
 	beq	.L183
@@ -1644,23 +1644,23 @@ ebc_io_ctl:
 	mov	w0, 28676
 	cmp	w1, w0
 	bne	.L180
-	.loc 1 2450 0
+	.loc 1 2451 0
 	ldr	x0, [x20, 288]
-	.loc 1 2449 0
+	.loc 1 2450 0
 	mov	w2, 1
 	str	w2, [x20, 812]
-	.loc 1 2450 0
+	.loc 1 2451 0
 	adrp	x1, .LC2
 .LVL103:
-	.loc 1 2451 0
+	.loc 1 2452 0
 	mov	x22, 0
-	.loc 1 2450 0
+	.loc 1 2451 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
 .LVL104:
 	.p2align 2
 .L176:
-	.loc 1 2539 0
+	.loc 1 2540 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
 .LVL105:
@@ -1688,19 +1688,19 @@ ebc_io_ctl:
 	.p2align 3
 .L313:
 	.cfi_restore_state
-	.loc 1 2364 0
+	.loc 1 2365 0
 	cmp	w1, 28672
 	beq	.L185
 	mov	w0, 28673
 	cmp	w1, w0
 	bne	.L180
-.LBB993:
-.LBB994:
 .LBB995:
 .LBB996:
 .LBB997:
 .LBB998:
 .LBB999:
+.LBB1000:
+.LBB1001:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1708,8 +1708,8 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL109:
 #NO_APP
-.LBE999:
-.LBE998:
+.LBE1001:
+.LBE1000:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
@@ -1719,19 +1719,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L315
 .LVL111:
 .L206:
-.LBB1000:
-.LBB1001:
 .LBB1002:
+.LBB1003:
+.LBB1004:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL112:
-.LBE1002:
-.LBE1001:
+.LBE1004:
+.LBE1003:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL113:
 .L207:
-.LBE1000:
+.LBE1002:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1744,23 +1744,23 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL114:
 #NO_APP
-.LBE997:
-.LBE996:
+.LBE999:
+.LBE998:
 	.loc 9 114 0
 	cbz	x0, .L209
-.LBB1008:
-.LBB1009:
 .LBB1010:
 .LBB1011:
 .LBB1012:
+.LBB1013:
+.LBB1014:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL115:
+.LBE1014:
+.LBE1013:
 .LBE1012:
-.LBE1011:
-.LBE1010:
-.LBB1013:
-.LBB1014:
+.LBB1015:
+.LBB1016:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1768,13 +1768,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL116:
 #NO_APP
-.LBE1014:
-.LBE1013:
-.LBB1015:
+.LBE1016:
+.LBE1015:
+.LBB1017:
 	.loc 6 254 0
 	and	x0, x0, x21
 .LVL117:
-.LBE1015:
+.LBE1017:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1789,8 +1789,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1009:
-.LBE1008:
+.LBE1011:
+.LBE1010:
 	.loc 9 116 0
 	mov	x2, 48
 	add	x0, x29, 104
@@ -1799,80 +1799,80 @@ ebc_io_ctl:
 .LVL120:
 	.loc 9 118 0
 	cbnz	x0, .L209
+.LBE997:
+.LBE996:
 .LBE995:
-.LBE994:
-.LBE993:
-	.loc 1 2404 0
+	.loc 1 2405 0
 	bl	ebc_phy_buf_base_get
 .LVL121:
 	ldrsw	x1, [x29, 104]
-	.loc 1 2405 0
+	.loc 1 2406 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
 .LVL122:
 	mov	x21, x0
 .LVL123:
-	.loc 1 2406 0
-	cbz	x0, .L216
 	.loc 1 2407 0
+	cbz	x0, .L216
+	.loc 1 2408 0
 	ldr	w1, [x29, 108]
-	.loc 1 2416 0
+	.loc 1 2417 0
 	add	x20, x20, 184
-	.loc 1 2407 0
+	.loc 1 2408 0
 	str	w1, [x21, 40]
-	.loc 1 2411 0
+	.loc 1 2412 0
 	ldp	w4, w2, [x29, 124]
 	stp	w4, w2, [x21, 48]
-	.loc 1 2410 0
+	.loc 1 2411 0
 	ldr	w3, [x29, 132]
-	.loc 1 2412 0
+	.loc 1 2413 0
 	ldr	w1, [x29, 136]
-	.loc 1 2408 0
+	.loc 1 2409 0
 	ldr	w5, [x29, 148]
-	.loc 1 2410 0
+	.loc 1 2411 0
 	str	w3, [x21, 56]
-	.loc 1 2408 0
+	.loc 1 2409 0
 	stp	w1, w5, [x21, 60]
-	.loc 1 2414 0
+	.loc 1 2415 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL124:
-	.loc 1 2416 0
+	.loc 1 2417 0
 	ldr	w0, [x20, 96]
 	cbz	w0, .L316
 .L211:
-	.loc 1 2420 0
+	.loc 1 2421 0
 	ldr	w0, [x21, 40]
 	cmp	w0, 18
 	beq	.L317
-	.loc 1 2420 0 is_stmt 0 discriminator 3
+	.loc 1 2421 0 is_stmt 0 discriminator 3
 	cmp	w0, 20
 	bne	.L216
 .L213:
-	.loc 1 2421 0 is_stmt 1
+	.loc 1 2422 0 is_stmt 1
 	mov	w0, 1
 	str	w0, [x20, 204]
-.LBB1022:
-.LBB1023:
-	.loc 1 2422 0
+.LBB1024:
+.LBB1025:
+	.loc 1 2423 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
 .LVL125:
 	adrp	x0, .LANCHOR1
-.LBB1024:
+.LBB1026:
 	add	x0, x0, :lo12:.LANCHOR1
 	add	x21, x0, 328
 	b	.L217
 	.p2align 3
 .L318:
 .LVL126:
-	.loc 1 2422 0 is_stmt 0 discriminator 5
+	.loc 1 2423 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L216
-	.loc 1 2422 0 discriminator 7
+	.loc 1 2423 0 discriminator 7
 	bl	schedule
 .LVL127:
 .L217:
-	.loc 1 2422 0 discriminator 9
+	.loc 1 2423 0 discriminator 9
 	add	x1, x29, 64
 	mov	w2, 1
 	mov	x0, x21
@@ -1880,8 +1880,8 @@ ebc_io_ctl:
 .LVL128:
 	ldr	w1, [x20, 204]
 	cbnz	w1, .L318
-.LBE1024:
-	.loc 1 2422 0 discriminator 4
+.LBE1026:
+	.loc 1 2423 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
 	bl	finish_wait
@@ -1893,15 +1893,15 @@ ebc_io_ctl:
 .LVL130:
 	.p2align 3
 .L193:
-.LBE1023:
-.LBE1022:
-	.loc 1 2506 0 is_stmt 1
+.LBE1025:
+.LBE1024:
+	.loc 1 2507 0 is_stmt 1
 	bl	ebc_empty_buf_get
 .LVL131:
 	mov	x23, x0
-	.loc 1 2507 0
+	.loc 1 2508 0
 	cbz	x0, .L201
-	.loc 1 2509 0
+	.loc 1 2510 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 344]
@@ -1911,20 +1911,20 @@ ebc_io_ctl:
 .LVL132:
 	.p2align 3
 .L311:
-	.loc 1 2364 0
+	.loc 1 2365 0
 	mov	w0, 28678
 	cmp	w1, w0
 	beq	.L191
 	mov	w0, 28679
 	cmp	w1, w0
 	bne	.L180
-.LBB1028:
-.LBB1029:
 .LBB1030:
 .LBB1031:
 .LBB1032:
 .LBB1033:
 .LBB1034:
+.LBB1035:
+.LBB1036:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1932,8 +1932,8 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL133:
 #NO_APP
-.LBE1034:
-.LBE1033:
+.LBE1036:
+.LBE1035:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
@@ -1943,19 +1943,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L319
 .LVL135:
 .L218:
-.LBB1035:
-.LBB1036:
 .LBB1037:
+.LBB1038:
+.LBB1039:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL136:
-.LBE1037:
-.LBE1036:
+.LBE1039:
+.LBE1038:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL137:
 .L219:
-.LBE1035:
+.LBE1037:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1968,23 +1968,23 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL138:
 #NO_APP
-.LBE1032:
-.LBE1031:
+.LBE1034:
+.LBE1033:
 	.loc 9 114 0
 	cbz	x0, .L209
-.LBB1043:
-.LBB1044:
 .LBB1045:
 .LBB1046:
 .LBB1047:
+.LBB1048:
+.LBB1049:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL139:
+.LBE1049:
+.LBE1048:
 .LBE1047:
-.LBE1046:
-.LBE1045:
-.LBB1048:
-.LBB1049:
+.LBB1050:
+.LBB1051:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1992,13 +1992,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL140:
 #NO_APP
-.LBE1049:
-.LBE1048:
-.LBB1050:
+.LBE1051:
+.LBE1050:
+.LBB1052:
 	.loc 6 254 0
 	and	x0, x0, x21
 .LVL141:
-.LBE1050:
+.LBE1052:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -2013,8 +2013,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1044:
-.LBE1043:
+.LBE1046:
+.LBE1045:
 	.loc 9 116 0
 	mov	x2, 48
 	add	x0, x29, 104
@@ -2023,39 +2023,39 @@ ebc_io_ctl:
 .LVL144:
 	.loc 9 118 0
 	cbnz	x0, .L209
+.LBE1032:
+.LBE1031:
 .LBE1030:
-.LBE1029:
-.LBE1028:
-	.loc 1 2431 0
+	.loc 1 2432 0
 	bl	ebc_osd_buf_clone
 .LVL145:
 	mov	x1, x0
-	.loc 1 2432 0
-	cbz	x0, .L216
 	.loc 1 2433 0
+	cbz	x0, .L216
+	.loc 1 2434 0
 	ldr	w6, [x29, 108]
-	.loc 1 2442 0
+	.loc 1 2443 0
 	add	x20, x20, 184
-	.loc 1 2437 0
+	.loc 1 2438 0
 	ldp	w5, w3, [x29, 124]
-	.loc 1 2433 0
+	.loc 1 2434 0
 	str	w6, [x1, 40]
-	.loc 1 2438 0
+	.loc 1 2439 0
 	ldp	w4, w2, [x29, 132]
-	.loc 1 2437 0
-	stp	w5, w3, [x1, 48]
 	.loc 1 2438 0
+	stp	w5, w3, [x1, 48]
+	.loc 1 2439 0
 	stp	w4, w2, [x1, 56]
-	.loc 1 2440 0
+	.loc 1 2441 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL146:
-	.loc 1 2442 0
+	.loc 1 2443 0
 	ldr	w0, [x20, 96]
 	cbnz	w0, .L216
-	.loc 1 2443 0
+	.loc 1 2444 0
 	mov	w2, 1
 	str	w2, [x20, 96]
-	.loc 1 2444 0
+	.loc 1 2445 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -2067,22 +2067,22 @@ ebc_io_ctl:
 .LVL148:
 	.p2align 3
 .L312:
-.LBB1057:
-.LBB990:
-.LBB987:
-.LBB977:
-.LBB978:
+.LBB1059:
+.LBB992:
+.LBB989:
 .LBB979:
 .LBB980:
 .LBB981:
+.LBB982:
+.LBB983:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL149:
+.LBE983:
+.LBE982:
 .LBE981:
-.LBE980:
-.LBE979:
-.LBB982:
-.LBB983:
+.LBB984:
+.LBB985:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2090,13 +2090,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL150:
 #NO_APP
-.LBE983:
-.LBE982:
-.LBB984:
+.LBE985:
+.LBE984:
+.LBB986:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL151:
-.LBE984:
+.LBE986:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL152:
@@ -2112,8 +2112,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE978:
-.LBE977:
+.LBE980:
+.LBE979:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
@@ -2125,27 +2125,27 @@ ebc_io_ctl:
 .LVL156:
 	.p2align 3
 .L191:
-.LBE987:
-.LBE990:
-.LBE1057:
-	.loc 1 2366 0
+.LBE989:
+.LBE992:
+.LBE1059:
+	.loc 1 2367 0
 	bl	ebc_osd_buf_get
 .LVL157:
-	.loc 1 2367 0
+	.loc 1 2368 0
 	cbz	x0, .L201
-	.loc 1 2370 0
+	.loc 1 2371 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL158:
-	.loc 1 2375 0
+	.loc 1 2376 0
 	ldr	w1, [x20, 176]
-.LBB1058:
-.LBB1059:
 .LBB1060:
 .LBB1061:
 .LBB1062:
 .LBB1063:
 .LBB1064:
+.LBB1065:
+.LBB1066:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2153,34 +2153,34 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL159:
 #NO_APP
-.LBE1064:
-.LBE1063:
+.LBE1066:
+.LBE1065:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
+.LBE1064:
+.LBE1063:
 .LBE1062:
 .LBE1061:
 .LBE1060:
-.LBE1059:
-.LBE1058:
-	.loc 1 2370 0
+	.loc 1 2371 0
 	sub	w0, w22, w0
-	.loc 1 2374 0
-	ldp	w5, w4, [x20, 108]
 	.loc 1 2375 0
+	ldp	w5, w4, [x20, 108]
+	.loc 1 2376 0
 	str	w1, [x29, 120]
-	.loc 1 2373 0
+	.loc 1 2374 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 2376 0
+	.loc 1 2377 0
 	mov	w1, 16
-	.loc 1 2372 0
+	.loc 1 2373 0
 	str	w0, [x29, 104]
-	.loc 1 2376 0
+	.loc 1 2377 0
 	str	w1, [x29, 148]
-.LBB1091:
-.LBB1088:
-.LBB1085:
-.LBB1074:
-.LBB1071:
+.LBB1093:
+.LBB1090:
+.LBB1087:
+.LBB1076:
+.LBB1073:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL160:
@@ -2188,19 +2188,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L320
 .LVL161:
 .L197:
-.LBB1065:
-.LBB1066:
 .LBB1067:
+.LBB1068:
+.LBB1069:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL162:
-.LBE1067:
-.LBE1066:
+.LBE1069:
+.LBE1068:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL163:
 .L198:
-.LBE1065:
+.LBE1067:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2213,24 +2213,24 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL164:
 #NO_APP
-.LBE1071:
-.LBE1074:
+.LBE1073:
+.LBE1076:
 	.loc 9 132 0
 	mov	x22, 48
 	cbz	x0, .L176
-.LBB1075:
-.LBB1076:
 .LBB1077:
 .LBB1078:
 .LBB1079:
+.LBB1080:
+.LBB1081:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL165:
+.LBE1081:
+.LBE1080:
 .LBE1079:
-.LBE1078:
-.LBE1077:
-.LBB1080:
-.LBB1081:
+.LBB1082:
+.LBB1083:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2238,13 +2238,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL166:
 #NO_APP
-.LBE1081:
-.LBE1080:
-.LBB1082:
+.LBE1083:
+.LBE1082:
+.LBB1084:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL167:
-.LBE1082:
+.LBE1084:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL168:
@@ -2260,8 +2260,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1076:
-.LBE1075:
+.LBE1078:
+.LBE1077:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
@@ -2273,16 +2273,16 @@ ebc_io_ctl:
 .LVL172:
 	.p2align 3
 .L187:
-.LBE1085:
-.LBE1088:
-.LBE1091:
-.LBB1092:
-.LBB1093:
+.LBE1087:
+.LBE1090:
+.LBE1093:
 .LBB1094:
 .LBB1095:
 .LBB1096:
 .LBB1097:
 .LBB1098:
+.LBB1099:
+.LBB1100:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2290,22 +2290,22 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL173:
 #NO_APP
-.LBE1098:
-.LBE1097:
+.LBE1100:
+.LBE1099:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
+.LBE1098:
+.LBE1097:
 .LBE1096:
 .LBE1095:
 .LBE1094:
-.LBE1093:
-.LBE1092:
-	.loc 1 2458 0
+	.loc 1 2459 0
 	add	x22, x20, 248
-.LBB1127:
-.LBB1123:
-.LBB1119:
-.LBB1108:
-.LBB1105:
+.LBB1129:
+.LBB1125:
+.LBB1121:
+.LBB1110:
+.LBB1107:
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
 .LVL174:
@@ -2313,19 +2313,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L321
 .LVL175:
 .L221:
-.LBB1099:
-.LBB1100:
 .LBB1101:
+.LBB1102:
+.LBB1103:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL176:
-.LBE1101:
-.LBE1100:
+.LBE1103:
+.LBE1102:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL177:
 .L222:
-.LBE1099:
+.LBE1101:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2339,22 +2339,22 @@ ebc_io_ctl:
 .LVL178:
 #NO_APP
 	mov	x3, x0
-.LBE1105:
-.LBE1108:
+.LBE1107:
+.LBE1110:
 	.loc 9 114 0
 	cbz	x0, .L250
-.LBB1109:
-.LBB1110:
 .LBB1111:
 .LBB1112:
 .LBB1113:
+.LBB1114:
+.LBB1115:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
+.LBE1115:
+.LBE1114:
 .LBE1113:
-.LBE1112:
-.LBE1111:
-.LBB1114:
-.LBB1115:
+.LBB1116:
+.LBB1117:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2362,13 +2362,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL179:
 #NO_APP
-.LBE1115:
-.LBE1114:
-.LBB1116:
+.LBE1117:
+.LBE1116:
+.LBB1118:
 	.loc 6 254 0
 	and	x0, x0, x21
 .LVL180:
-.LBE1116:
+.LBE1118:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -2383,8 +2383,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1110:
-.LBE1109:
+.LBE1112:
+.LBE1111:
 	.loc 9 116 0
 	mov	x2, 4
 	mov	x0, x22
@@ -2393,52 +2393,52 @@ ebc_io_ctl:
 .LVL183:
 	.loc 9 118 0
 	cbnz	x0, .L322
-.LBE1119:
-.LBE1123:
-.LBE1127:
-	.loc 1 2462 0
+.LBE1121:
+.LBE1125:
+.LBE1129:
+	.loc 1 2463 0
 	add	x20, x20, 184
 	ldr	w2, [x20, 64]
 	ldr	x0, [x20, 104]
 .LVL184:
-	.loc 1 2463 0
+	.loc 1 2464 0
 	mov	x22, 0
-	.loc 1 2462 0
+	.loc 1 2463 0
 	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	_dev_info
 .LVL185:
-	.loc 1 2463 0
+	.loc 1 2464 0
 	b	.L176
 .LVL186:
 	.p2align 3
 .L181:
-	.loc 1 2455 0
+	.loc 1 2456 0
 	ldr	x0, [x20, 288]
 	adrp	x1, .LC3
 .LVL187:
-	.loc 1 2453 0
+	.loc 1 2454 0
 	str	wzr, [x20, 812]
-	.loc 1 2456 0
+	.loc 1 2457 0
 	mov	x22, 0
-	.loc 1 2454 0
-	str	wzr, [x20, 816]
 	.loc 1 2455 0
+	str	wzr, [x20, 816]
+	.loc 1 2456 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
 .LVL188:
-	.loc 1 2456 0
+	.loc 1 2457 0
 	b	.L176
 .LVL189:
 	.p2align 3
 .L189:
-	.loc 1 2493 0
+	.loc 1 2494 0
 	bl	ebc_empty_buf_get
 .LVL190:
 	mov	x23, x0
-	.loc 1 2494 0
+	.loc 1 2495 0
 	cbz	x0, .L201
-	.loc 1 2496 0
+	.loc 1 2497 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 336]
@@ -2448,13 +2448,13 @@ ebc_io_ctl:
 .LVL191:
 	.p2align 3
 .L194:
-	.loc 1 2480 0
+	.loc 1 2481 0
 	bl	ebc_empty_buf_get
 .LVL192:
 	mov	x23, x0
-	.loc 1 2481 0
+	.loc 1 2482 0
 	cbz	x0, .L201
-	.loc 1 2483 0
+	.loc 1 2484 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 328]
@@ -2463,18 +2463,18 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL193:
-	.loc 1 2484 0
+	.loc 1 2485 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL194:
 	sub	w0, w20, w0
-.LBB1128:
-.LBB1129:
 .LBB1130:
 .LBB1131:
 .LBB1132:
 .LBB1133:
 .LBB1134:
+.LBB1135:
+.LBB1136:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2482,26 +2482,26 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL195:
 #NO_APP
-.LBE1134:
-.LBE1133:
+.LBE1136:
+.LBE1135:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
+.LBE1134:
+.LBE1133:
 .LBE1132:
 .LBE1131:
 .LBE1130:
-.LBE1129:
-.LBE1128:
-	.loc 1 2487 0
+	.loc 1 2488 0
 	ldp	w4, w1, [x22, 84]
-	.loc 1 2485 0
-	str	w0, [x29, 104]
 	.loc 1 2486 0
+	str	w0, [x29, 104]
+	.loc 1 2487 0
 	stp	w1, w4, [x29, 112]
+.LBB1141:
+.LBB1140:
 .LBB1139:
 .LBB1138:
 .LBB1137:
-.LBB1136:
-.LBB1135:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL196:
@@ -2511,21 +2511,21 @@ ebc_io_ctl:
 .LVL197:
 	.p2align 3
 .L183:
-.LBE1135:
-.LBE1136:
 .LBE1137:
 .LBE1138:
 .LBE1139:
-	.loc 1 2469 0
+.LBE1140:
+.LBE1141:
+	.loc 1 2470 0
 	ldp	w1, w0, [x20, 116]
 .LVL198:
-.LBB1140:
-.LBB1141:
 .LBB1142:
 .LBB1143:
 .LBB1144:
 .LBB1145:
 .LBB1146:
+.LBB1147:
+.LBB1148:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2533,34 +2533,34 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL199:
 #NO_APP
-.LBE1146:
-.LBE1145:
+.LBE1148:
+.LBE1147:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
+.LBE1146:
+.LBE1145:
 .LBE1144:
 .LBE1143:
 .LBE1142:
-.LBE1141:
-.LBE1140:
-	.loc 1 2466 0
+	.loc 1 2467 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 2469 0
+	.loc 1 2470 0
 	stp	w1, w0, [x29, 140]
-	.loc 1 2467 0
+	.loc 1 2468 0
 	ldr	w4, [x20, 176]
-	.loc 1 2470 0
+	.loc 1 2471 0
 	mov	w0, 16
-	.loc 1 2465 0
+	.loc 1 2466 0
 	stp	w5, w6, [x29, 112]
-	.loc 1 2467 0
+	.loc 1 2468 0
 	str	w4, [x29, 120]
-	.loc 1 2470 0
+	.loc 1 2471 0
 	str	w0, [x29, 148]
-.LBB1175:
-.LBB1171:
-.LBB1167:
-.LBB1156:
-.LBB1153:
+.LBB1177:
+.LBB1173:
+.LBB1169:
+.LBB1158:
+.LBB1155:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL200:
@@ -2568,19 +2568,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L323
 .LVL201:
 .L225:
-.LBB1147:
-.LBB1148:
 .LBB1149:
+.LBB1150:
+.LBB1151:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL202:
-.LBE1149:
-.LBE1148:
+.LBE1151:
+.LBE1150:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL203:
 .L226:
-.LBE1147:
+.LBE1149:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2593,66 +2593,66 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL204:
 #NO_APP
-.LBE1153:
-.LBE1156:
+.LBE1155:
+.LBE1158:
 	.loc 9 132 0
 	cbnz	x0, .L227
 .L228:
-.LBE1167:
-.LBE1171:
-.LBE1175:
-	.loc 1 2473 0
+.LBE1169:
+.LBE1173:
+.LBE1177:
+	.loc 1 2474 0
 	ldr	x0, [x20, 288]
 .LVL205:
 	adrp	x1, .LC5
 .LVL206:
-	.loc 1 2474 0
+	.loc 1 2475 0
 	mov	x22, -14
-	.loc 1 2473 0
+	.loc 1 2474 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
 .LVL207:
-	.loc 1 2474 0
+	.loc 1 2475 0
 	b	.L176
 .LVL208:
 	.p2align 3
 .L180:
-	.loc 1 2534 0
+	.loc 1 2535 0
 	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
 .LVL209:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
-	.loc 1 2535 0
+	.loc 1 2536 0
 	mov	x22, 0
-	.loc 1 2534 0
+	.loc 1 2535 0
 	bl	_dev_err
 .LVL210:
-	.loc 1 2538 0
+	.loc 1 2539 0
 	b	.L176
 .LVL211:
 	.p2align 3
 .L185:
-	.loc 1 2381 0
+	.loc 1 2382 0
 	bl	ebc_empty_buf_get
 .LVL212:
 	mov	x23, x0
-	.loc 1 2382 0
+	.loc 1 2383 0
 	cbz	x0, .L201
-	.loc 1 2385 0
+	.loc 1 2386 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL213:
-	.loc 1 2390 0
+	.loc 1 2391 0
 	ldr	w1, [x20, 176]
-.LBB1176:
-.LBB1177:
 .LBB1178:
 .LBB1179:
 .LBB1180:
 .LBB1181:
 .LBB1182:
+.LBB1183:
+.LBB1184:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2660,34 +2660,34 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL214:
 #NO_APP
-.LBE1182:
-.LBE1181:
+.LBE1184:
+.LBE1183:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
+.LBE1182:
+.LBE1181:
 .LBE1180:
 .LBE1179:
 .LBE1178:
-.LBE1177:
-.LBE1176:
-	.loc 1 2385 0
+	.loc 1 2386 0
 	sub	w0, w22, w0
-	.loc 1 2389 0
-	ldp	w5, w4, [x20, 108]
 	.loc 1 2390 0
+	ldp	w5, w4, [x20, 108]
+	.loc 1 2391 0
 	str	w1, [x29, 120]
-	.loc 1 2388 0
+	.loc 1 2389 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 2391 0
+	.loc 1 2392 0
 	mov	w1, 16
-	.loc 1 2387 0
+	.loc 1 2388 0
 	str	w0, [x29, 104]
-	.loc 1 2391 0
+	.loc 1 2392 0
 	str	w1, [x29, 148]
-.LBB1211:
-.LBB1207:
-.LBB1203:
-.LBB1192:
-.LBB1189:
+.LBB1213:
+.LBB1209:
+.LBB1205:
+.LBB1194:
+.LBB1191:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL215:
@@ -2695,19 +2695,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L324
 .LVL216:
 .L202:
-.LBB1183:
-.LBB1184:
 .LBB1185:
+.LBB1186:
+.LBB1187:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL217:
-.LBE1185:
-.LBE1184:
+.LBE1187:
+.LBE1186:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL218:
 .L203:
-.LBE1183:
+.LBE1185:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2720,268 +2720,268 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL219:
 #NO_APP
-.LBE1189:
-.LBE1192:
+.LBE1191:
+.LBE1194:
 	.loc 9 132 0
 	cbnz	x0, .L204
 .L205:
-.LBE1203:
-.LBE1207:
-.LBE1211:
-	.loc 1 2395 0
+.LBE1205:
+.LBE1209:
+.LBE1213:
+	.loc 1 2396 0
 	mov	x0, x23
 .LVL220:
-	.loc 1 2396 0
+	.loc 1 2397 0
 	mov	x22, -14
-	.loc 1 2395 0
+	.loc 1 2396 0
 	bl	ebc_buf_release
 .LVL221:
-	.loc 1 2396 0
+	.loc 1 2397 0
 	b	.L176
 .LVL222:
 	.p2align 3
 .L319:
-.LBB1212:
+.LBB1214:
+.LBB1057:
 .LBB1055:
 .LBB1053:
-.LBB1051:
-.LBB1041:
-.LBB1038:
-.LBB1039:
+.LBB1043:
 .LBB1040:
+.LBB1041:
+.LBB1042:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1040:
-.LBE1039:
-.LBE1038:
+.LBE1042:
 .LBE1041:
-.LBE1051:
+.LBE1040:
+.LBE1043:
 .LBE1053:
 .LBE1055:
-.LBE1212:
-	.loc 1 2339 0
+.LBE1057:
+.LBE1214:
+	.loc 1 2340 0
 	mov	x0, x21
 .LVL223:
-.LBB1213:
+.LBB1215:
+.LBB1058:
 .LBB1056:
 .LBB1054:
-.LBB1052:
-.LBB1042:
+.LBB1044:
 	.loc 6 84 0
 	tbz	x2, 26, .L219
 	b	.L218
 .LVL224:
 	.p2align 3
 .L315:
-.LBE1042:
-.LBE1052:
+.LBE1044:
 .LBE1054:
 .LBE1056:
-.LBE1213:
-.LBB1214:
+.LBE1058:
+.LBE1215:
+.LBB1216:
+.LBB1022:
 .LBB1020:
 .LBB1018:
-.LBB1016:
-.LBB1006:
-.LBB1003:
-.LBB1004:
+.LBB1008:
 .LBB1005:
+.LBB1006:
+.LBB1007:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1005:
-.LBE1004:
-.LBE1003:
+.LBE1007:
 .LBE1006:
-.LBE1016:
+.LBE1005:
+.LBE1008:
 .LBE1018:
 .LBE1020:
-.LBE1214:
-	.loc 1 2339 0
+.LBE1022:
+.LBE1216:
+	.loc 1 2340 0
 	mov	x0, x21
 .LVL225:
-.LBB1215:
+.LBB1217:
+.LBB1023:
 .LBB1021:
 .LBB1019:
-.LBB1017:
-.LBB1007:
+.LBB1009:
 	.loc 6 84 0
 	tbz	x2, 26, .L207
 	b	.L206
 .LVL226:
 	.p2align 3
 .L323:
-.LBE1007:
-.LBE1017:
+.LBE1009:
 .LBE1019:
 .LBE1021:
-.LBE1215:
-.LBB1216:
-.LBB1172:
-.LBB1168:
-.LBB1157:
-.LBB1154:
-.LBB1150:
-.LBB1151:
+.LBE1023:
+.LBE1217:
+.LBB1218:
+.LBB1174:
+.LBB1170:
+.LBB1159:
+.LBB1156:
 .LBB1152:
+.LBB1153:
+.LBB1154:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL227:
-.LBE1152:
-.LBE1151:
-.LBE1150:
 .LBE1154:
-.LBE1157:
-.LBE1168:
-.LBE1172:
-.LBE1216:
-	.loc 1 2339 0
+.LBE1153:
+.LBE1152:
+.LBE1156:
+.LBE1159:
+.LBE1170:
+.LBE1174:
+.LBE1218:
+	.loc 1 2340 0
 	mov	x0, x21
 .LVL228:
-.LBB1217:
-.LBB1173:
-.LBB1169:
-.LBB1158:
-.LBB1155:
+.LBB1219:
+.LBB1175:
+.LBB1171:
+.LBB1160:
+.LBB1157:
 	.loc 6 84 0
 	tbz	x2, 26, .L226
 	b	.L225
 .LVL229:
 	.p2align 3
 .L321:
-.LBE1155:
-.LBE1158:
-.LBE1169:
-.LBE1173:
-.LBE1217:
-.LBB1218:
-.LBB1124:
-.LBB1120:
-.LBB1117:
-.LBB1106:
-.LBB1102:
-.LBB1103:
+.LBE1157:
+.LBE1160:
+.LBE1171:
+.LBE1175:
+.LBE1219:
+.LBB1220:
+.LBB1126:
+.LBB1122:
+.LBB1119:
+.LBB1108:
 .LBB1104:
+.LBB1105:
+.LBB1106:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1104:
-.LBE1103:
-.LBE1102:
 .LBE1106:
-.LBE1117:
-.LBE1120:
-.LBE1124:
-.LBE1218:
-	.loc 1 2339 0
+.LBE1105:
+.LBE1104:
+.LBE1108:
+.LBE1119:
+.LBE1122:
+.LBE1126:
+.LBE1220:
+	.loc 1 2340 0
 	mov	x0, x21
 .LVL230:
-.LBB1219:
-.LBB1125:
-.LBB1121:
-.LBB1118:
-.LBB1107:
+.LBB1221:
+.LBB1127:
+.LBB1123:
+.LBB1120:
+.LBB1109:
 	.loc 6 84 0
 	tbz	x2, 26, .L222
 	b	.L221
 .LVL231:
 	.p2align 3
 .L324:
-.LBE1107:
-.LBE1118:
-.LBE1121:
-.LBE1125:
-.LBE1219:
-.LBB1220:
-.LBB1208:
-.LBB1204:
-.LBB1193:
-.LBB1190:
-.LBB1186:
-.LBB1187:
+.LBE1109:
+.LBE1120:
+.LBE1123:
+.LBE1127:
+.LBE1221:
+.LBB1222:
+.LBB1210:
+.LBB1206:
+.LBB1195:
+.LBB1192:
 .LBB1188:
+.LBB1189:
+.LBB1190:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL232:
-.LBE1188:
-.LBE1187:
-.LBE1186:
 .LBE1190:
-.LBE1193:
-.LBE1204:
-.LBE1208:
-.LBE1220:
-	.loc 1 2339 0
+.LBE1189:
+.LBE1188:
+.LBE1192:
+.LBE1195:
+.LBE1206:
+.LBE1210:
+.LBE1222:
+	.loc 1 2340 0
 	mov	x0, x21
 .LVL233:
-.LBB1221:
-.LBB1209:
-.LBB1205:
-.LBB1194:
-.LBB1191:
+.LBB1223:
+.LBB1211:
+.LBB1207:
+.LBB1196:
+.LBB1193:
 	.loc 6 84 0
 	tbz	x2, 26, .L203
 	b	.L202
 .LVL234:
 	.p2align 3
 .L320:
-.LBE1191:
-.LBE1194:
-.LBE1205:
-.LBE1209:
-.LBE1221:
-.LBB1222:
-.LBB1089:
-.LBB1086:
-.LBB1083:
-.LBB1072:
-.LBB1068:
-.LBB1069:
+.LBE1193:
+.LBE1196:
+.LBE1207:
+.LBE1211:
+.LBE1223:
+.LBB1224:
+.LBB1091:
+.LBB1088:
+.LBB1085:
+.LBB1074:
 .LBB1070:
+.LBB1071:
+.LBB1072:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL235:
-.LBE1070:
-.LBE1069:
-.LBE1068:
 .LBE1072:
-.LBE1083:
-.LBE1086:
-.LBE1089:
-.LBE1222:
-	.loc 1 2339 0
+.LBE1071:
+.LBE1070:
+.LBE1074:
+.LBE1085:
+.LBE1088:
+.LBE1091:
+.LBE1224:
+	.loc 1 2340 0
 	mov	x0, x21
 .LVL236:
-.LBB1223:
-.LBB1090:
-.LBB1087:
-.LBB1084:
-.LBB1073:
+.LBB1225:
+.LBB1092:
+.LBB1089:
+.LBB1086:
+.LBB1075:
 	.loc 6 84 0
 	tbz	x2, 26, .L198
 	b	.L197
 .LVL237:
 	.p2align 3
 .L227:
-.LBE1073:
-.LBE1084:
-.LBE1087:
-.LBE1090:
-.LBE1223:
-.LBB1224:
-.LBB1174:
-.LBB1170:
-.LBB1159:
-.LBB1160:
+.LBE1075:
+.LBE1086:
+.LBE1089:
+.LBE1092:
+.LBE1225:
+.LBB1226:
+.LBB1176:
+.LBB1172:
 .LBB1161:
 .LBB1162:
 .LBB1163:
+.LBB1164:
+.LBB1165:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL238:
+.LBE1165:
+.LBE1164:
 .LBE1163:
-.LBE1162:
-.LBE1161:
-.LBB1164:
-.LBB1165:
+.LBB1166:
+.LBB1167:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2989,13 +2989,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL239:
 #NO_APP
-.LBE1165:
-.LBE1164:
-.LBB1166:
+.LBE1167:
+.LBE1166:
+.LBB1168:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL240:
-.LBE1166:
+.LBE1168:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL241:
@@ -3011,44 +3011,44 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1160:
-.LBE1159:
+.LBE1162:
+.LBE1161:
 	.loc 9 134 0
 	mov	x2, 48
 	add	x1, x29, 104
 .LVL243:
 	bl	__arch_copy_to_user
 .LVL244:
-.LBE1170:
-.LBE1174:
-.LBE1224:
-	.loc 1 2472 0
+.LBE1172:
+.LBE1176:
+.LBE1226:
+	.loc 1 2473 0
 	cbnz	x0, .L228
-.LBB1225:
-.LBB1025:
+.LBB1227:
+.LBB1027:
 	mov	x22, 0
 	b	.L176
 .LVL245:
 	.p2align 3
 .L204:
-.LBE1025:
-.LBE1225:
-.LBB1226:
-.LBB1210:
-.LBB1206:
-.LBB1195:
-.LBB1196:
+.LBE1027:
+.LBE1227:
+.LBB1228:
+.LBB1212:
+.LBB1208:
 .LBB1197:
 .LBB1198:
 .LBB1199:
+.LBB1200:
+.LBB1201:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL246:
+.LBE1201:
+.LBE1200:
 .LBE1199:
-.LBE1198:
-.LBE1197:
-.LBB1200:
-.LBB1201:
+.LBB1202:
+.LBB1203:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -3056,13 +3056,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL247:
 #NO_APP
-.LBE1201:
-.LBE1200:
-.LBB1202:
+.LBE1203:
+.LBE1202:
+.LBB1204:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL248:
-.LBE1202:
+.LBE1204:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL249:
@@ -3078,38 +3078,38 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1196:
-.LBE1195:
+.LBE1198:
+.LBE1197:
 	.loc 9 134 0
 	mov	x2, 48
 	add	x1, x29, 104
 .LVL251:
 	bl	__arch_copy_to_user
 .LVL252:
-.LBE1206:
-.LBE1210:
-.LBE1226:
-	.loc 1 2394 0
+.LBE1208:
+.LBE1212:
+.LBE1228:
+	.loc 1 2395 0
 	cbnz	w0, .L205
-.LBB1227:
-.LBB1026:
+.LBB1229:
+.LBB1028:
 	mov	x22, 0
 	b	.L176
 .LVL253:
 	.p2align 3
 .L209:
-.LBE1026:
-.LBE1227:
-	.loc 1 2402 0
+.LBE1028:
+.LBE1229:
+	.loc 1 2403 0
 	mov	x22, -14
 	b	.L176
 .LVL254:
 	.p2align 3
 .L316:
-	.loc 1 2417 0
+	.loc 1 2418 0
 	mov	w2, 1
 	str	w2, [x20, 96]
-	.loc 1 2418 0
+	.loc 1 2419 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -3119,25 +3119,25 @@ ebc_io_ctl:
 	b	.L211
 	.p2align 3
 .L317:
-	.loc 1 2420 0 discriminator 1
+	.loc 1 2421 0 discriminator 1
 	ldr	w0, [x20, 616]
 	cbz	w0, .L213
-.LBB1228:
-.LBB1027:
+.LBB1230:
+.LBB1029:
 	mov	x22, 0
 	b	.L176
 .LVL256:
 .L201:
-.LBE1027:
-.LBE1228:
-	.loc 1 2368 0
+.LBE1029:
+.LBE1230:
+	.loc 1 2369 0
 	mov	x22, -1
 	b	.L176
 .LVL257:
 .L250:
-.LBB1229:
-.LBB1126:
-.LBB1122:
+.LBB1231:
+.LBB1128:
+.LBB1124:
 	.loc 9 112 0
 	mov	x0, 4
 .LVL258:
@@ -3150,22 +3150,22 @@ ebc_io_ctl:
 .LVL260:
 	bl	memset
 .LVL261:
-.LBE1122:
-.LBE1126:
-.LBE1229:
-	.loc 1 2459 0
+.LBE1124:
+.LBE1128:
+.LBE1231:
+	.loc 1 2460 0
 	ldr	x0, [x20, 288]
 	adrp	x1, .LC4
-	.loc 1 2460 0
+	.loc 1 2461 0
 	mov	x22, -14
-	.loc 1 2459 0
+	.loc 1 2460 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
 .LVL262:
-	.loc 1 2460 0
+	.loc 1 2461 0
 	b	.L176
 .L314:
-	.loc 1 2539 0
+	.loc 1 2540 0
 	bl	__stack_chk_fail
 .LVL263:
 .L322:
@@ -3367,7 +3367,7 @@ frame_done_callback:
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
 .LFB2841:
-	.loc 1 2265 0
+	.loc 1 2266 0
 	.cfi_startproc
 .LVL275:
 	stp	x29, x30, [sp, -16]!
@@ -3376,10 +3376,10 @@ ebc_frame_timeout:
 	.cfi_offset 30, -8
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2266 0
+	.loc 1 2267 0
 	bl	frame_done_callback
 .LVL276:
-	.loc 1 2268 0
+	.loc 1 2269 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3432,8 +3432,8 @@ ebc_lut_update:
 	.loc 1 1716 0
 	str	w4, [x0, -12]!
 .LVL280:
-.LBB1230:
-.LBB1231:
+.LBB1232:
+.LBB1233:
 	.loc 3 50 0
 	mov	x1, x0
 	mov	x0, x2
@@ -3441,8 +3441,8 @@ ebc_lut_update:
 	blr	x2
 .LVL281:
 	mov	w20, w0
-.LBE1231:
-.LBE1230:
+.LBE1233:
+.LBE1232:
 	.loc 1 1724 0
 	cbnz	w0, .L336
 .LVL282:
@@ -3730,23 +3730,23 @@ ebc_lut_update:
 	.type	ebc_buf_state_read, %function
 ebc_buf_state_read:
 .LFB2855:
-	.loc 1 2707 0
+	.loc 1 2708 0
 	.cfi_startproc
 .LVL307:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2708 0
+	.loc 1 2709 0
 	mov	x0, x2
 .LVL308:
-	.loc 1 2707 0
+	.loc 1 2708 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2708 0
+	.loc 1 2709 0
 	bl	ebc_buf_state_show
 .LVL309:
-	.loc 1 2709 0
+	.loc 1 2710 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3761,32 +3761,32 @@ ebc_buf_state_read:
 	.type	ebc_state_read, %function
 ebc_state_read:
 .LFB2854:
-	.loc 1 2698 0
+	.loc 1 2699 0
 	.cfi_startproc
 .LVL310:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2699 0
+	.loc 1 2700 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2698 0
+	.loc 1 2699 0
 	mov	x0, x2
 .LVL311:
-	.loc 1 2699 0
+	.loc 1 2700 0
 	adrp	x1, .LC15
 .LVL312:
-	.loc 1 2698 0
+	.loc 1 2699 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2699 0
+	.loc 1 2700 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL313:
 	add	x1, x1, :lo12:.LC15
 	ldr	w2, [x2, 624]
 	bl	sprintf
 .LVL314:
-	.loc 1 2700 0
+	.loc 1 2701 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3801,7 +3801,7 @@ ebc_state_read:
 	.type	ebc_version_read, %function
 ebc_version_read:
 .LFB2853:
-	.loc 1 2689 0
+	.loc 1 2690 0
 	.cfi_startproc
 .LVL315:
 	stp	x29, x30, [sp, -16]!
@@ -3810,22 +3810,22 @@ ebc_version_read:
 	.cfi_offset 30, -8
 	mov	x0, x2
 .LVL316:
-	.loc 1 2690 0
+	.loc 1 2691 0
 	adrp	x1, .LC17
 .LVL317:
 	adrp	x2, .LC16
 .LVL318:
-	.loc 1 2689 0
+	.loc 1 2690 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2690 0
+	.loc 1 2691 0
 	add	x2, x2, :lo12:.LC16
-	.loc 1 2689 0
 	.loc 1 2690 0
+	.loc 1 2691 0
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
 .LVL319:
-	.loc 1 2691 0
+	.loc 1 2692 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3840,46 +3840,46 @@ ebc_version_read:
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
 .LFB2851:
-	.loc 1 2653 0
+	.loc 1 2654 0
 	.cfi_startproc
 .LVL320:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 2654 0
+	.loc 1 2655 0
 	adrp	x0, .LANCHOR0
 .LVL321:
-	.loc 1 2653 0
+	.loc 1 2654 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2657 0
+	.loc 1 2658 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2653 0
+	.loc 1 2654 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2653 0
+	.loc 1 2654 0
 	mov	x19, x2
-	.loc 1 2657 0
+	.loc 1 2658 0
 	ldr	x1, [x0, 16]
 .LVL322:
-.LBB1232:
-.LBB1233:
+.LBB1234:
+.LBB1235:
 	.loc 3 55 0
 	mov	x0, x1
 	ldr	x1, [x1, 64]
 	blr	x1
 .LVL323:
-.LBE1233:
-.LBE1232:
-	.loc 1 2659 0
+.LBE1235:
+.LBE1234:
+	.loc 1 2660 0
 	mov	w2, w0
 	adrp	x1, .LC15
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
 .LVL324:
-	.loc 1 2660 0
+	.loc 1 2661 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL325:
@@ -3897,33 +3897,33 @@ pmic_vcom_read:
 	.type	pmic_temp_read, %function
 pmic_temp_read:
 .LFB2850:
-	.loc 1 2639 0
+	.loc 1 2640 0
 	.cfi_startproc
 .LVL326:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 2640 0
+	.loc 1 2641 0
 	adrp	x0, .LANCHOR0
 .LVL327:
-	.loc 1 2639 0
+	.loc 1 2640 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2643 0
+	.loc 1 2644 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-.LBB1234:
-.LBB1235:
+.LBB1236:
+.LBB1237:
 	.loc 3 50 0
 	add	x1, x29, 36
 .LVL328:
-.LBE1235:
-.LBE1234:
-	.loc 1 2639 0
+.LBE1237:
+.LBE1236:
+	.loc 1 2640 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 2639 0
+	.loc 1 2640 0
 	adrp	x19, __stack_chk_guard
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x20, x2
@@ -3931,25 +3931,25 @@ pmic_temp_read:
 	str	x2, [x29, 40]
 	mov	x2,0
 .LVL329:
-	.loc 1 2643 0
+	.loc 1 2644 0
 	ldr	x2, [x0, 16]
-.LBB1237:
-.LBB1236:
+.LBB1239:
+.LBB1238:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
 .LVL330:
-.LBE1236:
-.LBE1237:
-	.loc 1 2645 0
+.LBE1238:
+.LBE1239:
+	.loc 1 2646 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC15
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
 .LVL331:
-	.loc 1 2646 0
+	.loc 1 2647 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
@@ -3978,25 +3978,25 @@ pmic_temp_read:
 	.type	pmic_name_read, %function
 pmic_name_read:
 .LFB2849:
-	.loc 1 2628 0
+	.loc 1 2629 0
 	.cfi_startproc
 .LVL335:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2629 0
+	.loc 1 2630 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2628 0
+	.loc 1 2629 0
 	mov	x0, x2
 .LVL336:
-	.loc 1 2631 0
+	.loc 1 2632 0
 	adrp	x1, .LC17
 .LVL337:
-	.loc 1 2628 0
+	.loc 1 2629 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2631 0
+	.loc 1 2632 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL338:
 	add	x1, x1, :lo12:.LC17
@@ -4004,7 +4004,7 @@ pmic_name_read:
 	add	x2, x2, 8
 	bl	sprintf
 .LVL339:
-	.loc 1 2632 0
+	.loc 1 2633 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -4019,17 +4019,17 @@ pmic_name_read:
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
 .LFB2852:
-	.loc 1 2665 0
+	.loc 1 2666 0
 	.cfi_startproc
 .LVL340:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 2666 0
+	.loc 1 2667 0
 	adrp	x0, .LANCHOR0
 .LVL341:
-	.loc 1 2665 0
+	.loc 1 2666 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -4039,37 +4039,37 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 2665 0
+	.loc 1 2666 0
 	add	x1, x19, :lo12:__stack_chk_guard
 .LVL342:
 	mov	x21, x2
-	.loc 1 2666 0
+	.loc 1 2667 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
 .LVL343:
-	.loc 1 2665 0
+	.loc 1 2666 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
 .LVL344:
 	mov	x20, x3
-	.loc 1 2669 0
+	.loc 1 2670 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
 .LVL345:
-	.loc 1 2670 0
+	.loc 1 2671 0
 	cbnz	w0, .L388
 .LVL346:
-	.loc 1 2674 0
+	.loc 1 2675 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
 .LVL347:
-	.loc 1 2675 0
+	.loc 1 2676 0
 	cbnz	w0, .L389
 .L381:
-	.loc 1 2681 0
+	.loc 1 2682 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
 .LVL348:
@@ -4094,36 +4094,36 @@ pmic_vcom_write:
 	.p2align 3
 .L388:
 	.cfi_restore_state
-	.loc 1 2671 0
+	.loc 1 2672 0
 	ldr	x0, [x22]
 	adrp	x1, .LC18
 	mov	x2, x21
 	add	x1, x1, :lo12:.LC18
-	.loc 1 2672 0
+	.loc 1 2673 0
 	mov	x20, -1
 .LVL351:
-	.loc 1 2671 0
+	.loc 1 2672 0
 	bl	_dev_err
 .LVL352:
-	.loc 1 2672 0
+	.loc 1 2673 0
 	b	.L381
 .LVL353:
 	.p2align 3
 .L389:
-	.loc 1 2676 0
+	.loc 1 2677 0
 	ldr	x0, [x22]
 	adrp	x1, .LC19
-	.loc 1 2677 0
+	.loc 1 2678 0
 	mov	x20, -1
 .LVL354:
-	.loc 1 2676 0
+	.loc 1 2677 0
 	add	x1, x1, :lo12:.LC19
 	bl	_dev_err
 .LVL355:
-	.loc 1 2677 0
+	.loc 1 2678 0
 	b	.L381
 .L390:
-	.loc 1 2681 0
+	.loc 1 2682 0
 	bl	__stack_chk_fail
 .LVL356:
 	.cfi_endproc
@@ -4134,7 +4134,7 @@ pmic_vcom_write:
 	.type	waveform_version_read, %function
 waveform_version_read:
 .LFB2848:
-	.loc 1 2617 0
+	.loc 1 2618 0
 	.cfi_startproc
 .LVL357:
 	stp	x29, x30, [sp, -32]!
@@ -4145,19 +4145,19 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2617 0
-	mov	x19, x2
 	.loc 1 2618 0
+	mov	x19, x2
+	.loc 1 2619 0
 	bl	epd_lut_get_wf_version
 .LVL358:
-	.loc 1 2620 0
+	.loc 1 2621 0
 	mov	x2, x0
 	adrp	x1, .LC17
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
 .LVL359:
-	.loc 1 2621 0
+	.loc 1 2622 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL360:
@@ -4175,23 +4175,23 @@ waveform_version_read:
 	.type	ebc_init, %function
 ebc_init:
 .LFB2866:
-	.loc 1 3162 0
+	.loc 1 3163 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3163 0
+	.loc 1 3164 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3162 0
+	.loc 1 3163 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3163 0
+	.loc 1 3164 0
 	bl	__platform_driver_register
 .LVL361:
-	.loc 1 3164 0
+	.loc 1 3165 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -4230,8 +4230,8 @@ direct_mode_data_change:
 	cmp	w4, 16
 	beq	.L448
 .L404:
-.LBB1264:
-.LBB1265:
+.LBB1266:
+.LBB1267:
 	.loc 1 1084 0
 	adrp	x6, .LANCHOR0
 	.loc 1 1090 0
@@ -4414,8 +4414,8 @@ direct_mode_data_change:
 .LVL376:
 	.p2align 3
 .L395:
-.LBE1265:
-.LBE1264:
+.LBE1267:
+.LBE1266:
 	.loc 1 1170 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
@@ -4441,8 +4441,8 @@ direct_mode_data_change:
 	ldr	w13, [x3, 88]
 .LVL378:
 	cbz	w13, .L405
-.LBB1266:
-.LBB1267:
+.LBB1268:
+.LBB1269:
 	.loc 1 898 0
 	adrp	x6, .LANCHOR0
 	.loc 1 904 0
@@ -4515,8 +4515,8 @@ direct_mode_data_change:
 	cmp	x11, x7
 	.loc 1 924 0
 	and	w8, w3, 65535
-.LBB1268:
-.LBB1269:
+.LBB1270:
+.LBB1271:
 	.loc 1 133 0
 	ubfiz	w19, w9, 8, 8
 	.loc 1 134 0
@@ -4525,143 +4525,143 @@ direct_mode_data_change:
 	add	w19, w19, w8, uxtb
 	.loc 1 134 0
 	add	w9, w9, w8, lsr 8
-.LBE1269:
-.LBE1268:
+.LBE1271:
+.LBE1270:
 	.loc 1 925 0
 	lsr	w10, w4, 16
 	lsr	w8, w3, 16
-.LBB1273:
-.LBB1274:
+.LBB1275:
+.LBB1276:
 	.loc 1 133 0
 	ubfiz	w18, w10, 8, 8
-.LBE1274:
-.LBE1273:
-.LBB1280:
-.LBB1270:
-	ldrb	w19, [x5, w19, sxtw]
-.LBE1270:
-.LBE1280:
-.LBB1281:
-.LBB1275:
-	.loc 1 134 0
-	and	w10, w10, 65280
+.LBE1276:
 .LBE1275:
-.LBE1281:
 .LBB1282:
-.LBB1271:
-	ldrb	w17, [x5, w9, sxtw]
-.LBE1271:
+.LBB1272:
+	ldrb	w19, [x5, w19, sxtw]
+.LBE1272:
 .LBE1282:
 .LBB1283:
-.LBB1276:
+.LBB1277:
+	.loc 1 134 0
+	and	w10, w10, 65280
+.LBE1277:
+.LBE1283:
+.LBB1284:
+.LBB1273:
+	ldrb	w17, [x5, w9, sxtw]
+.LBE1273:
+.LBE1284:
+.LBB1285:
+.LBB1278:
 	.loc 1 133 0
 	add	w18, w18, w8, uxtb
 	.loc 1 134 0
 	add	w10, w10, w8, lsr 8
-.LBE1276:
-.LBE1283:
+.LBE1278:
+.LBE1285:
 	.loc 1 926 0
 	ubfx	x9, x4, 32, 16
 	ubfx	x8, x3, 32, 16
 	.loc 1 927 0
 	lsr	x4, x4, 48
 .LVL391:
-.LBB1284:
-.LBB1272:
+.LBB1286:
+.LBB1274:
 	.loc 1 133 0
 	orr	w17, w19, w17, lsl 4
-.LBE1272:
-.LBE1284:
+.LBE1274:
+.LBE1286:
 	.loc 1 924 0
 	strb	w17, [x6, -4]
-.LBB1285:
-.LBB1286:
+.LBB1287:
+.LBB1288:
 	.loc 1 133 0
 	ubfiz	w17, w9, 8, 8
 	.loc 1 134 0
 	and	w9, w9, 65280
-.LBE1286:
-.LBE1285:
-.LBB1292:
-.LBB1277:
-	ldrb	w10, [x5, w10, sxtw]
-.LBE1277:
-.LBE1292:
-.LBB1293:
-.LBB1287:
-	.loc 1 133 0
-	add	w17, w17, w8, uxtb
+.LBE1288:
 .LBE1287:
-.LBE1293:
 .LBB1294:
-.LBB1278:
-	ldrb	w18, [x5, w18, sxtw]
-.LBE1278:
+.LBB1279:
+	ldrb	w10, [x5, w10, sxtw]
+.LBE1279:
 .LBE1294:
 .LBB1295:
-.LBB1288:
+.LBB1289:
+	.loc 1 133 0
+	add	w17, w17, w8, uxtb
+.LBE1289:
+.LBE1295:
+.LBB1296:
+.LBB1280:
+	ldrb	w18, [x5, w18, sxtw]
+.LBE1280:
+.LBE1296:
+.LBB1297:
+.LBB1290:
 	.loc 1 134 0
 	add	w8, w9, w8, lsr 8
-.LBE1288:
-.LBE1295:
+.LBE1290:
+.LBE1297:
 	.loc 1 927 0
 	lsr	x3, x3, 48
 .LVL392:
-.LBB1296:
-.LBB1279:
+.LBB1298:
+.LBB1281:
 	.loc 1 133 0
 	orr	w9, w18, w10, lsl 4
-.LBE1279:
-.LBE1296:
+.LBE1281:
+.LBE1298:
 	.loc 1 925 0
 	strb	w9, [x6, -3]
-.LBB1297:
-.LBB1298:
+.LBB1299:
+.LBB1300:
 	.loc 1 133 0
 	ubfiz	w9, w4, 8, 8
 	.loc 1 134 0
 	and	w4, w4, 65280
-.LBE1298:
-.LBE1297:
-.LBB1302:
-.LBB1289:
-	ldrb	w10, [x5, w8, sxtw]
-.LBE1289:
-.LBE1302:
-.LBB1303:
-.LBB1299:
-	.loc 1 133 0
-	add	w8, w9, w3, uxtb
+.LBE1300:
 .LBE1299:
-.LBE1303:
 .LBB1304:
-.LBB1290:
-	ldrb	w17, [x5, w17, sxtw]
-.LBE1290:
+.LBB1291:
+	ldrb	w10, [x5, w8, sxtw]
+.LBE1291:
 .LBE1304:
 .LBB1305:
-.LBB1300:
-	.loc 1 134 0
-	add	w3, w4, w3, lsr 8
-.LBE1300:
+.LBB1301:
+	.loc 1 133 0
+	add	w8, w9, w3, uxtb
+.LBE1301:
 .LBE1305:
 .LBB1306:
-.LBB1291:
+.LBB1292:
+	ldrb	w17, [x5, w17, sxtw]
+.LBE1292:
+.LBE1306:
+.LBB1307:
+.LBB1302:
+	.loc 1 134 0
+	add	w3, w4, w3, lsr 8
+.LBE1302:
+.LBE1307:
+.LBB1308:
+.LBB1293:
 	.loc 1 133 0
 	orr	w4, w17, w10, lsl 4
-.LBE1291:
-.LBE1306:
+.LBE1293:
+.LBE1308:
 	.loc 1 926 0
 	strb	w4, [x6, -2]
-.LBB1307:
-.LBB1301:
+.LBB1309:
+.LBB1303:
 	.loc 1 134 0
 	ldrb	w3, [x5, w3, sxtw]
 	.loc 1 133 0
 	ldrb	w4, [x5, w8, sxtw]
 	orr	w3, w4, w3, lsl 4
-.LBE1301:
-.LBE1307:
+.LBE1303:
+.LBE1309:
 	.loc 1 927 0
 	strb	w3, [x6, -1]
 	.loc 1 920 0
@@ -4688,8 +4688,8 @@ direct_mode_data_change:
 	b	.L407
 .LVL397:
 .L447:
-.LBE1267:
-.LBE1266:
+.LBE1269:
+.LBE1268:
 	.loc 1 1156 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
@@ -4698,8 +4698,8 @@ direct_mode_data_change:
 	.loc 1 1165 0
 	cmp	w4, 16
 	bne	.L404
-.LBB1308:
-.LBB1309:
+.LBB1310:
+.LBB1311:
 	.loc 1 1014 0
 	adrp	x6, .LANCHOR0
 	.loc 1 1020 0
@@ -4892,10 +4892,10 @@ direct_mode_data_change:
 	b	.L417
 .LVL410:
 .L405:
-.LBE1309:
-.LBE1308:
-.LBB1310:
-.LBB1311:
+.LBE1311:
+.LBE1310:
+.LBB1312:
+.LBB1313:
 	.loc 1 938 0
 	adrp	x5, .LANCHOR0
 	.loc 1 944 0
@@ -4958,78 +4958,78 @@ direct_mode_data_change:
 	ldr	w4, [x1, x5, lsl 2]
 	add	x5, x5, 1
 .LVL420:
-.LBB1312:
-.LBB1313:
+.LBB1314:
+.LBB1315:
 	.loc 1 134 0
 	and	w9, w3, 65280
-.LBE1313:
-.LBE1312:
+.LBE1315:
+.LBE1314:
 	.loc 1 960 0
 	cmp	w12, w5
 .LVL421:
 	.loc 1 964 0
 	and	w6, w4, 65535
-.LBB1318:
-.LBB1314:
+.LBB1320:
+.LBB1316:
 	.loc 1 133 0
 	ubfiz	w8, w3, 8, 8
 	.loc 1 134 0
 	add	w9, w9, w6, lsr 8
 	.loc 1 133 0
 	add	w6, w8, w6, uxtb
-.LBE1314:
-.LBE1318:
+.LBE1316:
+.LBE1320:
 	.loc 1 965 0
 	lsr	w3, w3, 16
 .LVL422:
 	lsr	w4, w4, 16
-.LBB1319:
-.LBB1320:
+.LBB1321:
+.LBB1322:
 	.loc 1 133 0
 	ubfiz	w8, w3, 8, 8
 	.loc 1 134 0
 	and	w3, w3, 65280
-.LBE1320:
-.LBE1319:
-.LBB1324:
-.LBB1315:
+.LBE1322:
+.LBE1321:
+.LBB1326:
+.LBB1317:
 	.loc 1 133 0
 	ldrb	w11, [x7, w6, sxtw]
-.LBE1315:
-.LBE1324:
-.LBB1325:
-.LBB1321:
+.LBE1317:
+.LBE1326:
+.LBB1327:
+.LBB1323:
 	.loc 1 134 0
 	add	w3, w3, w4, lsr 8
-.LBE1321:
-.LBE1325:
-.LBB1326:
-.LBB1316:
+.LBE1323:
+.LBE1327:
+.LBB1328:
+.LBB1318:
 	ldrb	w9, [x7, w9, sxtw]
-.LBE1316:
-.LBE1326:
-.LBB1327:
-.LBB1322:
+.LBE1318:
+.LBE1328:
+.LBB1329:
+.LBB1324:
 	.loc 1 133 0
 	add	w6, w8, w4, uxtb
-.LBE1322:
-.LBE1327:
-.LBB1328:
-.LBB1317:
+.LBE1324:
+.LBE1329:
+.LBB1330:
+.LBB1319:
 	orr	w4, w11, w9, lsl 4
-.LBE1317:
-.LBE1328:
+.LBE1319:
+.LBE1330:
 	.loc 1 964 0
 	strb	w4, [x10], 2
-.LBB1329:
-.LBB1323:
+.LBB1331:
+.LBB1325:
 	.loc 1 134 0
 	ldrb	w3, [x7, w3, sxtw]
 	.loc 1 133 0
 	ldrb	w4, [x7, w6, sxtw]
 	orr	w3, w4, w3, lsl 4
-.LBE1323:
-.LBE1329:
+.LBE1325:
+.LBE1331:
 	.loc 1 965 0
 	strb	w3, [x10, -1]
 	.loc 1 960 0
@@ -5054,10 +5054,10 @@ direct_mode_data_change:
 	b	.L412
 .LVL425:
 .L451:
-.LBE1311:
-.LBE1310:
-.LBB1330:
-.LBB1331:
+.LBE1313:
+.LBE1312:
+.LBB1332:
+.LBB1333:
 	.loc 1 975 0
 	adrp	x5, .LANCHOR0
 	.loc 1 981 0
@@ -5121,81 +5121,81 @@ direct_mode_data_change:
 	.loc 1 1000 0
 	ldr	w3, [x1, x4, lsl 2]
 .LVL436:
-.LBB1332:
-.LBB1333:
+.LBB1334:
+.LBB1335:
 	.loc 1 140 0
 	and	w9, w5, 65280
-.LBE1333:
-.LBE1332:
+.LBE1335:
+.LBE1334:
 	.loc 1 1004 0
 	lsr	w7, w5, 16
 .LVL437:
 	.loc 1 1003 0
 	and	w6, w3, 65535
-.LBB1338:
-.LBB1339:
+.LBB1340:
+.LBB1341:
 	.loc 1 139 0
 	ubfiz	w10, w7, 8, 8
-.LBE1339:
-.LBE1338:
+.LBE1341:
+.LBE1340:
 	.loc 1 1004 0
 	lsr	w3, w3, 16
-.LBB1344:
-.LBB1340:
+.LBB1346:
+.LBB1342:
 	.loc 1 140 0
 	and	w7, w7, 65280
 	.loc 1 139 0
 	add	w10, w10, w3, uxtb
-.LBE1340:
-.LBE1344:
-.LBB1345:
-.LBB1334:
+.LBE1342:
+.LBE1346:
+.LBB1347:
+.LBB1336:
 	ubfiz	w5, w5, 8, 8
 .LVL438:
-.LBE1334:
-.LBE1345:
-.LBB1346:
-.LBB1341:
+.LBE1336:
+.LBE1347:
+.LBB1348:
+.LBB1343:
 	.loc 1 140 0
 	add	w3, w7, w3, lsr 8
-.LBE1341:
-.LBE1346:
-.LBB1347:
-.LBB1335:
+.LBE1343:
+.LBE1348:
+.LBB1349:
+.LBB1337:
 	.loc 1 139 0
 	add	w5, w5, w6, uxtb
 	.loc 1 140 0
 	add	w7, w9, w6, lsr 8
-.LBE1335:
-.LBE1347:
-.LBB1348:
-.LBB1342:
+.LBE1337:
+.LBE1349:
+.LBB1350:
+.LBB1344:
 	.loc 1 139 0
 	ldrb	w9, [x8, w10, sxtw]
 	.loc 1 140 0
 	ldrb	w3, [x8, w3, sxtw]
-.LBE1342:
-.LBE1348:
-.LBB1349:
-.LBB1336:
+.LBE1344:
+.LBE1350:
+.LBB1351:
+.LBB1338:
 	ldrb	w6, [x8, w7, sxtw]
 	.loc 1 139 0
 	ldrb	w5, [x8, w5, sxtw]
-.LBE1336:
-.LBE1349:
-.LBB1350:
-.LBB1343:
+.LBE1338:
+.LBE1351:
+.LBB1352:
+.LBB1345:
 	orr	w3, w9, w3, lsl 2
-.LBE1343:
-.LBE1350:
+.LBE1345:
+.LBE1352:
 	.loc 1 1005 0
 	ubfiz	w3, w3, 4, 8
-.LBB1351:
-.LBB1337:
+.LBB1353:
+.LBB1339:
 	.loc 1 139 0
 	orr	w5, w5, w6, lsl 2
-.LBE1337:
-.LBE1351:
+.LBE1339:
+.LBE1353:
 	.loc 1 1005 0
 	orr	w3, w3, w5
 	strb	w3, [x11, x4]
@@ -5221,8 +5221,8 @@ direct_mode_data_change:
 	add	x11, x0, x11
 .LVL440:
 	b	.L401
-.LBE1331:
-.LBE1330:
+.LBE1333:
+.LBE1332:
 	.cfi_endproc
 .LFE2822:
 	.size	direct_mode_data_change, .-direct_mode_data_change
@@ -5263,8 +5263,8 @@ direct_mode_data_change_part:
 	cmp	w4, 16
 	beq	.L630
 .L472:
-.LBB1378:
-.LBB1379:
+.LBB1380:
+.LBB1381:
 	.loc 1 1381 0
 	adrp	x5, .LANCHOR0
 	.loc 1 1387 0
@@ -5472,8 +5472,8 @@ direct_mode_data_change_part:
 .LVL455:
 	.p2align 3
 .L455:
-.LBE1379:
-.LBE1378:
+.LBE1381:
+.LBE1380:
 	.loc 1 1474 0
 	ldp	x19, x20, [sp, 16]
 .LVL456:
@@ -5510,17 +5510,17 @@ direct_mode_data_change_part:
 	bne	.L472
 	.loc 1 1464 0
 	ldr	w15, [x3, 88]
-.LBB1380:
-.LBB1381:
+.LBB1382:
+.LBB1383:
 	.loc 1 1218 0
 	adrp	x5, .LANCHOR0
 .LVL462:
-.LBE1381:
-.LBE1380:
+.LBE1383:
+.LBE1382:
 	.loc 1 1464 0
 	cbz	w15, .L473
+.LBB1396:
 .LBB1394:
-.LBB1392:
 	.loc 1 1218 0
 	ldr	x12, [x5, #:lo12:.LANCHOR0]
 	.loc 1 1223 0
@@ -5558,13 +5558,13 @@ direct_mode_data_change_part:
 	mov	w15, 0
 .LVL469:
 	add	x16, x16, 1
-.LBB1382:
-.LBB1383:
+.LBB1384:
+.LBB1385:
 	.loc 1 145 0
 	mov	w10, 3
 	lsl	x16, x16, 3
-.LBE1383:
-.LBE1382:
+.LBE1385:
+.LBE1384:
 	.loc 1 1234 0
 	cbz	w14, .L474
 .LVL470:
@@ -5598,8 +5598,8 @@ direct_mode_data_change_part:
 	and	w17, w4, 65535
 	and	w7, w3, 65535
 .LVL475:
-.LBB1385:
-.LBB1386:
+.LBB1387:
+.LBB1388:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
@@ -5647,15 +5647,15 @@ direct_mode_data_change_part:
 	and	w6, w6, 255
 .LVL477:
 .L478:
-.LBE1386:
-.LBE1385:
+.LBE1388:
+.LBE1387:
 	.loc 1 1243 0
 	strb	w6, [x5, -4]
 	.loc 1 1244 0
 	lsr	w17, w4, 16
 	lsr	w7, w3, 16
-.LBB1387:
-.LBB1388:
+.LBB1389:
+.LBB1390:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
@@ -5703,15 +5703,15 @@ direct_mode_data_change_part:
 	and	w6, w6, 255
 .LVL479:
 .L483:
-.LBE1388:
-.LBE1387:
+.LBE1390:
+.LBE1389:
 	.loc 1 1244 0
 	strb	w6, [x5, -3]
 	.loc 1 1245 0
 	ubfx	x17, x4, 32, 16
 	ubfx	x7, x3, 32, 16
-.LBB1389:
-.LBB1390:
+.LBB1391:
+.LBB1392:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
@@ -5759,8 +5759,8 @@ direct_mode_data_change_part:
 	and	w6, w6, 255
 .LVL481:
 .L488:
-.LBE1390:
-.LBE1389:
+.LBE1392:
+.LBE1391:
 	.loc 1 1245 0
 	strb	w6, [x5, -2]
 	.loc 1 1246 0
@@ -5768,8 +5768,8 @@ direct_mode_data_change_part:
 .LVL482:
 	lsr	x3, x3, 48
 .LVL483:
-.LBB1391:
-.LBB1384:
+.LBB1393:
+.LBB1386:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
@@ -5818,8 +5818,8 @@ direct_mode_data_change_part:
 	and	w6, w4, 255
 .LVL486:
 .L493:
-.LBE1384:
-.LBE1391:
+.LBE1386:
+.LBE1393:
 	.loc 1 1246 0
 	strb	w6, [x5, -1]
 .LVL487:
@@ -5852,8 +5852,8 @@ direct_mode_data_change_part:
 	b	.L475
 .LVL493:
 .L629:
-.LBE1392:
 .LBE1394:
+.LBE1396:
 	.loc 1 1460 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
@@ -5862,8 +5862,8 @@ direct_mode_data_change_part:
 	.loc 1 1469 0
 	cmp	w4, 16
 	bne	.L472
-.LBB1395:
-.LBB1396:
+.LBB1397:
+.LBB1398:
 	.loc 1 1303 0
 	adrp	x5, .LANCHOR0
 	.loc 1 1309 0
@@ -6087,10 +6087,10 @@ direct_mode_data_change_part:
 	b	.L519
 .LVL506:
 .L473:
-.LBE1396:
-.LBE1395:
-.LBB1397:
-.LBB1398:
+.LBE1398:
+.LBE1397:
+.LBB1399:
+.LBB1400:
 	.loc 1 1177 0
 	ldr	x17, [x5, #:lo12:.LANCHOR0]
 	.loc 1 1182 0
@@ -6125,14 +6125,14 @@ direct_mode_data_change_part:
 	.loc 1 1192 0
 	ble	.L455
 	sub	w16, w13, #1
-.LBB1399:
-.LBB1400:
+.LBB1401:
+.LBB1402:
 	.loc 1 145 0
 	mov	w14, 3
 	add	x16, x16, 1
 	lsl	x16, x16, 2
-.LBE1400:
-.LBE1399:
+.LBE1402:
+.LBE1401:
 	.loc 1 1193 0
 	cbz	w30, .L501
 .LVL513:
@@ -6156,75 +6156,75 @@ direct_mode_data_change_part:
 .L516:
 	.loc 1 1200 0
 	ldr	w5, [x2, x9, lsl 2]
-.LBB1406:
-.LBB1407:
+.LBB1408:
+.LBB1409:
 	.loc 1 149 0
 	mov	w4, 0
-.LBE1407:
-.LBE1406:
+.LBE1409:
+.LBE1408:
 	.loc 1 1199 0
 	ldr	w22, [x1, x9, lsl 2]
-.LBB1412:
-.LBB1401:
+.LBB1414:
+.LBB1403:
 	.loc 1 149 0
 	mov	w8, 0
-.LBE1401:
-.LBE1412:
+.LBE1403:
+.LBE1414:
 	.loc 1 1202 0
 	and	w25, w5, 65535
 	and	w7, w22, 65535
-.LBB1413:
-.LBB1408:
+.LBB1415:
+.LBB1410:
 	.loc 1 160 0
 	and	w3, w25, 65280
 	add	w6, w3, w7, lsr 8
-.LBE1408:
-.LBE1413:
+.LBE1410:
+.LBE1415:
 	.loc 1 1203 0
 	lsr	w3, w5, 16
-.LBB1414:
-.LBB1402:
+.LBB1416:
+.LBB1404:
 	.loc 1 159 0
 	ubfiz	w21, w3, 8, 8
-.LBE1402:
-.LBE1414:
+.LBE1404:
+.LBE1416:
 	.loc 1 1203 0
 	and	w3, w3, 65535
 	lsr	w10, w22, 16
-.LBB1415:
-.LBB1409:
+.LBB1417:
+.LBB1411:
 	.loc 1 159 0
 	ubfiz	w23, w5, 8, 8
-.LBE1409:
-.LBE1415:
-.LBB1416:
-.LBB1403:
+.LBE1411:
+.LBE1417:
+.LBB1418:
+.LBB1405:
 	.loc 1 160 0
 	and	w19, w3, 65280
-.LBE1403:
-.LBE1416:
-.LBB1417:
-.LBB1410:
+.LBE1405:
+.LBE1418:
+.LBB1419:
+.LBB1412:
 	.loc 1 146 0
 	eor	w24, w25, w7
 	.loc 1 159 0
 	add	w23, w23, w7, uxtb
-.LBE1410:
-.LBE1417:
-.LBB1418:
-.LBB1404:
+.LBE1412:
+.LBE1419:
+.LBB1420:
+.LBB1406:
 	add	w21, w21, w10, uxtb
 	.loc 1 146 0
 	eor	w20, w3, w10
 	.loc 1 160 0
 	add	w19, w19, w10, lsr 8
-.LBE1404:
-.LBE1418:
+.LBE1406:
+.LBE1420:
 	.loc 1 1201 0
 	cmp	w22, w5
 	beq	.L504
-.LBB1419:
-.LBB1411:
+.LBB1421:
+.LBB1413:
 	.loc 1 148 0
 	cmp	w25, w7
 	beq	.L505
@@ -6257,12 +6257,12 @@ direct_mode_data_change_part:
 	and	w4, w5, w4
 	and	w4, w4, 255
 .L505:
-.LBE1411:
-.LBE1419:
+.LBE1413:
+.LBE1421:
 	.loc 1 1202 0
 	strb	w4, [x11, -2]
-.LBB1420:
-.LBB1405:
+.LBB1422:
+.LBB1407:
 	.loc 1 148 0
 	cmp	w3, w10
 	beq	.L510
@@ -6295,8 +6295,8 @@ direct_mode_data_change_part:
 	and	w3, w4, w3
 	and	w8, w3, 255
 .L510:
-.LBE1405:
-.LBE1420:
+.LBE1407:
+.LBE1422:
 	.loc 1 1203 0
 	strb	w8, [x11, -1]
 .L515:
@@ -6327,29 +6327,29 @@ direct_mode_data_change_part:
 .LVL520:
 	.p2align 3
 .L477:
-.LBE1398:
-.LBE1397:
-.LBB1422:
-.LBB1393:
+.LBE1400:
+.LBE1399:
+.LBB1424:
+.LBB1395:
 	.loc 1 1249 0
 	str	wzr, [x5, -4]
 	b	.L498
 .LVL521:
 	.p2align 3
 .L504:
-.LBE1393:
-.LBE1422:
+.LBE1395:
+.LBE1424:
+.LBB1425:
 .LBB1423:
-.LBB1421:
 	.loc 1 1206 0
 	strh	wzr, [x11, -2]
 	b	.L515
 .LVL522:
 .L633:
-.LBE1421:
 .LBE1423:
-.LBB1424:
-.LBB1425:
+.LBE1425:
+.LBB1426:
+.LBB1427:
 	.loc 1 1261 0
 	adrp	x5, .LANCHOR0
 	.loc 1 1266 0
@@ -6388,13 +6388,13 @@ direct_mode_data_change_part:
 	mov	w19, 0
 .LVL529:
 	add	x20, x20, 1
-.LBB1426:
-.LBB1427:
+.LBB1428:
+.LBB1429:
 	.loc 1 167 0
 	mov	w18, 3
 	lsl	x20, x20, 2
-.LBE1427:
-.LBE1426:
+.LBE1429:
+.LBE1428:
 	.loc 1 1279 0
 	cbz	w23, .L460
 .LVL530:
@@ -6416,8 +6416,8 @@ direct_mode_data_change_part:
 .LVL533:
 	.p2align 3
 .L637:
-.LBB1433:
-.LBB1434:
+.LBB1435:
+.LBB1436:
 	.loc 1 170 0
 	cmp	w7, w5
 	beq	.L464
@@ -6438,10 +6438,10 @@ direct_mode_data_change_part:
 	csel	w4, w5, w4, ne
 	and	w12, w12, w4
 .L464:
-.LBE1434:
-.LBE1433:
-.LBB1438:
-.LBB1428:
+.LBE1436:
+.LBE1435:
+.LBB1440:
+.LBB1430:
 	.loc 1 170 0
 	cmp	w3, w13
 	beq	.L467
@@ -6465,8 +6465,8 @@ direct_mode_data_change_part:
 	sxtb	w10, w3
 .LVL536:
 .L467:
-.LBE1428:
-.LBE1438:
+.LBE1430:
+.LBE1440:
 	.loc 1 1290 0
 	orr	w3, w12, w10
 	strb	w3, [x16, x11]
@@ -6478,20 +6478,20 @@ direct_mode_data_change_part:
 	.loc 1 1286 0
 	ldr	w4, [x2, x11, lsl 2]
 .LVL537:
-.LBB1439:
-.LBB1435:
+.LBB1441:
+.LBB1437:
 	.loc 1 170 0
 	mov	w12, 0
-.LBE1435:
-.LBE1439:
+.LBE1437:
+.LBE1441:
 	.loc 1 1285 0
 	ldr	w6, [x1, x11, lsl 2]
-.LBB1440:
-.LBB1429:
+.LBB1442:
+.LBB1431:
 	.loc 1 170 0
 	mov	w10, 0
-.LBE1429:
-.LBE1440:
+.LBE1431:
+.LBE1442:
 	.loc 1 1288 0
 	and	w7, w4, 65535
 	.loc 1 1289 0
@@ -6500,52 +6500,52 @@ direct_mode_data_change_part:
 	and	w5, w6, 65535
 	.loc 1 1289 0
 	lsr	w13, w6, 16
-.LBB1441:
-.LBB1430:
+.LBB1443:
+.LBB1432:
 	.loc 1 177 0
 	ubfiz	w14, w3, 8, 8
-.LBE1430:
-.LBE1441:
+.LBE1432:
+.LBE1443:
 	.loc 1 1289 0
 	and	w3, w3, 65535
-.LBB1442:
-.LBB1436:
+.LBB1444:
+.LBB1438:
 	.loc 1 177 0
 	ubfiz	w8, w4, 8, 8
 	.loc 1 178 0
 	and	w9, w7, 65280
 	.loc 1 168 0
 	eor	w30, w7, w5
-.LBE1436:
-.LBE1442:
-.LBB1443:
-.LBB1431:
+.LBE1438:
+.LBE1444:
+.LBB1445:
+.LBB1433:
 	.loc 1 178 0
 	and	w24, w3, 65280
 	.loc 1 168 0
 	eor	w25, w3, w13
-.LBE1431:
-.LBE1443:
-.LBB1444:
-.LBB1437:
+.LBE1433:
+.LBE1445:
+.LBB1446:
+.LBB1439:
 	.loc 1 177 0
 	add	w8, w8, w5, uxtb
 	.loc 1 178 0
 	add	w9, w9, w5, lsr 8
 	.loc 1 172 0
 	and	w27, w30, 255
-.LBE1437:
-.LBE1444:
-.LBB1445:
-.LBB1432:
+.LBE1439:
+.LBE1446:
+.LBB1447:
+.LBB1434:
 	.loc 1 177 0
 	add	w14, w14, w13, uxtb
 	.loc 1 178 0
 	add	w24, w24, w13, lsr 8
 	.loc 1 172 0
 	and	w26, w25, 255
-.LBE1432:
-.LBE1445:
+.LBE1434:
+.LBE1447:
 	.loc 1 1287 0
 	cmp	w6, w4
 	bne	.L637
@@ -6575,8 +6575,8 @@ direct_mode_data_change_part:
 	add	x16, x0, x16
 .LVL540:
 	b	.L461
-.LBE1425:
-.LBE1424:
+.LBE1427:
+.LBE1426:
 	.cfi_endproc
 .LFE2828:
 	.size	direct_mode_data_change_part, .-direct_mode_data_change_part
@@ -6607,10 +6607,10 @@ flip.isra.11:
 	.loc 1 1480 0
 	ldr	x0, [x0]
 .LVL542:
-.LBB1446:
-.LBB1447:
 .LBB1448:
 .LBB1449:
+.LBB1450:
+.LBB1451:
 	.file 10 "./include/linux/dma-mapping.h"
 	.loc 10 266 0
 	cbz	x0, .L642
@@ -6621,37 +6621,37 @@ flip.isra.11:
 	cmp	x3, 0
 	csel	x3, x4, x3, eq
 .L640:
-.LBE1449:
-.LBE1448:
+.LBE1451:
+.LBE1450:
 	.loc 10 434 0
 	ldr	x5, [x3, 88]
 	sxtw	x19, w19
 	cbz	x5, .L641
-.LBE1447:
-.LBE1446:
+.LBE1449:
+.LBE1448:
 	.loc 1 1480 0
 	add	x4, x19, x19, lsl 1
-.LBB1455:
-.LBB1452:
+.LBB1457:
+.LBB1454:
 	.loc 10 435 0
 	mov	w3, 1
-.LBE1452:
-.LBE1455:
+.LBE1454:
+.LBE1457:
 	.loc 1 1480 0
 	add	x4, x20, x4, lsl 3
-.LBB1456:
-.LBB1453:
+.LBB1458:
+.LBB1455:
 	.loc 10 435 0
 	ldr	x1, [x4, 32]
 	blr	x5
 .LVL543:
 .L641:
-.LBE1453:
-.LBE1456:
+.LBE1455:
+.LBE1458:
 	.loc 1 1481 0
 	ldr	x5, [x20, 8]
-.LBB1457:
-.LBB1458:
+.LBB1459:
+.LBB1460:
 	.file 11 "drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.h"
 	.loc 11 57 0
 	mov	w4, 0
@@ -6659,29 +6659,29 @@ flip.isra.11:
 	mov	w2, 0
 	mov	x0, x5
 	mov	w1, 0
-.LBE1458:
-.LBE1457:
+.LBE1460:
+.LBE1459:
 	.loc 1 1482 0
 	add	x19, x19, x19, lsl 1
+.LBB1463:
 .LBB1461:
-.LBB1459:
 	.loc 11 57 0
 	ldr	x5, [x5, 64]
-.LBE1459:
 .LBE1461:
+.LBE1463:
 	.loc 1 1482 0
 	add	x19, x20, x19, lsl 3
+.LBB1464:
 .LBB1462:
-.LBB1460:
 	.loc 11 57 0
 	blr	x5
 .LVL544:
-.LBE1460:
 .LBE1462:
+.LBE1464:
 	.loc 1 1482 0
 	ldr	x1, [x20, 8]
-.LBB1463:
-.LBB1464:
+.LBB1465:
+.LBB1466:
 	.loc 11 62 0
 	mov	w2, 0
 	mov	x0, x1
@@ -6689,20 +6689,20 @@ flip.isra.11:
 	ldr	w1, [x19, 32]
 	blr	x3
 .LVL545:
-.LBE1464:
-.LBE1463:
+.LBE1466:
+.LBE1465:
 	.loc 1 1483 0
 	ldr	x2, [x20, 8]
-.LBB1465:
-.LBB1466:
+.LBB1467:
+.LBB1468:
 	.loc 11 77 0
 	mov	w1, 1
 	mov	x0, x2
 	ldr	x2, [x2, 96]
 	blr	x2
 .LVL546:
-.LBE1466:
-.LBE1465:
+.LBE1468:
+.LBE1467:
 	.loc 1 1484 0
 	ldr	w1, [x20, 72]
 	mov	w0, 1
@@ -6723,18 +6723,18 @@ flip.isra.11:
 	.p2align 3
 .L642:
 	.cfi_restore_state
-.LBB1467:
-.LBB1454:
-.LBB1451:
-.LBB1450:
+.LBB1469:
+.LBB1456:
+.LBB1453:
+.LBB1452:
 	.loc 10 268 0
 	adrp	x3, dummy_dma_ops
 	add	x3, x3, :lo12:dummy_dma_ops
 	b	.L640
-.LBE1450:
-.LBE1451:
-.LBE1454:
-.LBE1467:
+.LBE1452:
+.LBE1453:
+.LBE1456:
+.LBE1469:
 	.cfi_endproc
 .LFE2879:
 	.size	flip.isra.11, .-flip.isra.11
@@ -6785,8 +6785,8 @@ ebc_frame_start:
 	.loc 1 1508 0
 	ldr	w0, [x19, 52]
 	cbz	w0, .L653
-.LBB1468:
-.LBB1469:
+.LBB1470:
+.LBB1471:
 	.loc 1 1489 0
 	str	wzr, [x21, 72]
 	.loc 1 1490 0
@@ -6794,8 +6794,8 @@ ebc_frame_start:
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
 .LVL552:
-.LBE1469:
-.LBE1468:
+.LBE1471:
+.LBE1470:
 	.loc 1 1510 0
 	ldp	x1, x2, [x19, 144]
 	mov	x4, x19
@@ -6835,8 +6835,8 @@ ebc_frame_start:
 	.loc 1 1528 0
 	ldr	w0, [x19, 52]
 	cbz	w0, .L655
-.LBB1470:
-.LBB1471:
+.LBB1472:
+.LBB1473:
 	.loc 1 1489 0
 	str	wzr, [x21, 72]
 	.loc 1 1490 0
@@ -6844,8 +6844,8 @@ ebc_frame_start:
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
 .LVL557:
-.LBE1471:
-.LBE1470:
+.LBE1473:
+.LBE1472:
 	.loc 1 1530 0
 	ldp	x1, x2, [x19, 144]
 	mov	x4, x19
@@ -6883,8 +6883,8 @@ ebc_frame_start:
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change
 .LVL561:
-.LBB1472:
-.LBB1473:
+.LBB1474:
+.LBB1475:
 	.loc 1 1489 0
 	str	wzr, [x21, 72]
 	.loc 1 1490 0
@@ -6892,8 +6892,8 @@ ebc_frame_start:
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
 .LVL562:
-.LBE1473:
-.LBE1472:
+.LBE1475:
+.LBE1474:
 	.loc 1 1569 0
 	ldr	w0, [x19, 56]
 	.loc 1 1570 0
@@ -6939,8 +6939,8 @@ ebc_frame_start:
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change_part
 .LVL566:
-.LBB1474:
-.LBB1475:
+.LBB1476:
+.LBB1477:
 	.loc 1 1489 0
 	str	wzr, [x21, 72]
 	.loc 1 1490 0
@@ -6948,8 +6948,8 @@ ebc_frame_start:
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
 .LVL567:
-.LBE1475:
-.LBE1474:
+.LBE1477:
+.LBE1476:
 	.loc 1 1556 0
 	ldr	w0, [x19, 56]
 	.loc 1 1557 0
@@ -7058,28 +7058,28 @@ ebc_power_set.part.13:
 	.loc 1 201 0
 	ldr	x1, [x0, 8]
 .LVL577:
-.LBB1476:
-.LBB1477:
+.LBB1478:
+.LBB1479:
 	.loc 11 51 0
 	mov	x0, x1
 .LVL578:
 	ldr	x1, [x1, 56]
 	blr	x1
 .LVL579:
-.LBE1477:
-.LBE1476:
+.LBE1479:
+.LBE1478:
 	.loc 1 202 0
 	ldr	x2, [x19, 16]
-.LBB1478:
-.LBB1479:
+.LBB1480:
+.LBB1481:
 	.loc 3 35 0
 	mov	w1, 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
 .LVL580:
-.LBE1479:
-.LBE1478:
+.LBE1481:
+.LBE1480:
 	.loc 1 203 0
 	ldr	w0, [x19, 624]
 	cbnz	w0, .L666
@@ -7106,14 +7106,14 @@ ebc_power_set.part.13:
 	.cfi_restore_state
 	.loc 1 204 0
 	str	wzr, [x19, 624]
-.LBB1480:
-.LBB1481:
+.LBB1482:
+.LBB1483:
 	.loc 4 68 0
 	add	x0, x19, 416
 	bl	__pm_relax
 .LVL584:
-.LBE1481:
-.LBE1480:
+.LBE1483:
+.LBE1482:
 	.loc 1 207 0
 	ldr	x0, [x19]
 	adrp	x1, .LC22
@@ -7138,7 +7138,7 @@ ebc_power_set.part.13:
 	.type	ebc_suspend, %function
 ebc_suspend:
 .LFB2864:
-	.loc 1 3112 0
+	.loc 1 3113 0
 	.cfi_startproc
 .LVL587:
 	stp	x29, x30, [sp, -32]!
@@ -7150,40 +7150,40 @@ ebc_suspend:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-.LBB1482:
-.LBB1483:
+.LBB1484:
+.LBB1485:
 	.loc 2 1181 0
 	ldr	x20, [x0, 184]
-.LBE1483:
-.LBE1482:
-	.loc 1 3116 0
+.LBE1485:
+.LBE1484:
+	.loc 1 3117 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 200]
 .LVL588:
 	cmp	w0, 1
 	beq	.L670
 .L668:
-	.loc 1 3120 0
+	.loc 1 3121 0
 	mov	w0, 1
 	str	w0, [x19, 620]
-	.loc 1 3122 0
+	.loc 1 3123 0
 	ldr	x1, [x20, 16]
-.LBB1484:
-.LBB1485:
+.LBB1486:
+.LBB1487:
 	.loc 3 40 0
 	mov	x0, x1
 	ldr	x1, [x1, 40]
 	blr	x1
 .LVL589:
-.LBE1485:
-.LBE1484:
-	.loc 1 3123 0
+.LBE1487:
+.LBE1486:
+	.loc 1 3124 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC24
 	add	x1, x1, :lo12:.LC24
 	bl	_dev_info
 .LVL590:
-	.loc 1 3126 0
+	.loc 1 3127 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -7197,7 +7197,7 @@ ebc_suspend:
 	.p2align 3
 .L670:
 	.cfi_restore_state
-	.loc 1 3117 0
+	.loc 1 3118 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
@@ -7206,15 +7206,15 @@ ebc_suspend:
 	add	x1, x1, :lo12:.LC23
 	bl	_dev_info
 .LVL591:
-.LBB1486:
-.LBB1487:
+.LBB1488:
+.LBB1489:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.13
 .LVL592:
 	b	.L668
-.LBE1487:
-.LBE1486:
+.LBE1489:
+.LBE1488:
 	.cfi_endproc
 .LFE2864:
 	.size	ebc_suspend, .-ebc_suspend
@@ -7299,29 +7299,29 @@ check_black_percent.isra.15:
 	.type	ebc_probe, %function
 ebc_probe:
 .LFB2862:
-	.loc 1 2976 0
+	.loc 1 2977 0
 	.cfi_startproc
 .LVL596:
 	stp	x29, x30, [sp, -208]!
 	.cfi_def_cfa_offset 208
 	.cfi_offset 29, -208
 	.cfi_offset 30, -200
-.LBB1632:
-.LBB1633:
+.LBB1634:
+.LBB1635:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
-.LBE1633:
-.LBE1632:
-	.loc 1 2976 0
+.LBE1635:
+.LBE1634:
+	.loc 1 2977 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 2977 0
+	.loc 1 2978 0
 	add	x22, x0, 16
-	.loc 1 2976 0
+	.loc 1 2977 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -160
 	.cfi_offset 24, -152
@@ -7337,62 +7337,62 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 2976 0
+	.loc 1 2977 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
-.LBB1635:
-.LBB1634:
+.LBB1637:
+.LBB1636:
 	.loc 2 711 0
 	mov	x0, x22
 	mov	x1, 824
 	bl	devm_kmalloc
 .LVL598:
-.LBE1634:
-.LBE1635:
-	.loc 1 2992 0
+.LBE1636:
+.LBE1637:
+	.loc 1 2993 0
 	cbz	x0, .L735
-	.loc 1 2996 0
+	.loc 1 2997 0
 	adrp	x24, .LANCHOR0
 	mov	x20, x0
-	.loc 1 2998 0
+	.loc 1 2999 0
 	adrp	x1, .LC26
 	mov	w2, 0
-	.loc 1 2996 0
+	.loc 1 2997 0
 	str	x0, [x24, #:lo12:.LANCHOR0]
-	.loc 1 2998 0
+	.loc 1 2999 0
 	add	x1, x1, :lo12:.LC26
 	ldr	x0, [x22, 752]
-	.loc 1 2995 0
+	.loc 1 2996 0
 	str	x22, [x20]
-	.loc 1 2998 0
+	.loc 1 2999 0
 	bl	of_parse_phandle
 .LVL599:
-	.loc 1 2999 0
+	.loc 1 3000 0
 	cbz	x0, .L771
-	.loc 1 3004 0
+	.loc 1 3005 0
 	bl	of_find_device_by_node
 .LVL600:
-	.loc 1 3006 0
+	.loc 1 3007 0
 	cbz	x0, .L689
-.LBB1636:
-.LBB1637:
 .LBB1638:
+.LBB1639:
+.LBB1640:
 	.loc 2 1181 0
 	ldr	x0, [x0, 200]
 .LVL601:
+.LBE1640:
+.LBE1639:
 .LBE1638:
-.LBE1637:
-.LBE1636:
-	.loc 1 3009 0
-	str	x0, [x20, 8]
 	.loc 1 3010 0
+	str	x0, [x20, 8]
+	.loc 1 3011 0
 	cbz	x0, .L689
-	.loc 1 3012 0
+	.loc 1 3013 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 3014 0
+	.loc 1 3015 0
 	add	x2, x29, 96
 	adrp	x1, .LC28
 	add	x1, x1, :lo12:.LC28
@@ -7401,42 +7401,42 @@ ebc_probe:
 .LVL602:
 	mov	x21, x0
 .LVL603:
-	.loc 1 3015 0
+	.loc 1 3016 0
 	ldrsw	x0, [x29, 96]
 .LVL604:
 	lsr	x0, x0, 2
 .LVL605:
 	str	w0, [x29, 96]
 .LVL606:
-	.loc 1 3016 0
+	.loc 1 3017 0
 	cmp	w0, 0
 	beq	.L690
-	.loc 1 3021 0 discriminator 1
+	.loc 1 3022 0 discriminator 1
 	mov	w19, 0
 .LVL607:
 	bgt	.L758
 	b	.L692
 	.p2align 3
 .L693:
-	.loc 1 3029 0
+	.loc 1 3030 0
 	bl	of_find_i2c_device_by_node
 .LVL608:
-	.loc 1 3031 0
+	.loc 1 3032 0
 	cbz	x0, .L772
-.LBB1639:
-.LBB1640:
 .LBB1641:
+.LBB1642:
+.LBB1643:
 	.loc 2 1181 0
 	ldr	x0, [x0, 216]
 .LVL609:
+.LBE1643:
+.LBE1642:
 .LBE1641:
-.LBE1640:
-.LBE1639:
-	.loc 1 3036 0
-	str	x0, [x20, 16]
 	.loc 1 3037 0
+	str	x0, [x20, 16]
+	.loc 1 3038 0
 	cbnz	x0, .L773
-	.loc 1 3021 0 discriminator 2
+	.loc 1 3022 0 discriminator 2
 	ldr	w0, [x29, 96]
 	add	w19, w19, 1
 .LVL610:
@@ -7444,24 +7444,24 @@ ebc_probe:
 	ble	.L697
 .L758:
 	ldr	w0, [x21], 4
-	.loc 1 3023 0
+	.loc 1 3024 0
 	rev	w0, w0
 	bl	of_find_node_by_phandle
 .LVL611:
-	.loc 1 3024 0
-	cbnz	x0, .L693
 	.loc 1 3025 0
+	cbnz	x0, .L693
+	.loc 1 3026 0
 	adrp	x1, .LC30
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC30
-	.loc 1 3026 0
+	.loc 1 3027 0
 	mov	w25, -19
-	.loc 1 3025 0
+	.loc 1 3026 0
 	bl	_dev_err
 .LVL612:
 	.p2align 2
 .L685:
-	.loc 1 3102 0
+	.loc 1 3103 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w25
 .LVL613:
@@ -7499,7 +7499,7 @@ ebc_probe:
 	.p2align 3
 .L773:
 	.cfi_restore_state
-	.loc 1 3038 0
+	.loc 1 3039 0
 	adrp	x1, .LC32
 	mov	w2, w19
 	add	x1, x1, :lo12:.LC32
@@ -7507,65 +7507,65 @@ ebc_probe:
 	bl	_dev_info
 .LVL620:
 .L692:
-	.loc 1 3043 0
+	.loc 1 3044 0
 	ldr	x0, [x20, 16]
 	cbz	x0, .L697
-	.loc 1 3049 0
+	.loc 1 3050 0
 	add	x19, x20, 184
 .LVL621:
-	.loc 1 3051 0
+	.loc 1 3052 0
 	add	x21, x20, 24
 .LVL622:
-	.loc 1 3049 0
+	.loc 1 3050 0
 	str	x22, [x19, 104]
-.LBB1642:
-.LBB1643:
 .LBB1644:
 .LBB1645:
 .LBB1646:
+.LBB1647:
+.LBB1648:
 	.file 12 "./include/linux/of.h"
 	.loc 12 499 0
 	adrp	x1, .LC34
+.LBE1648:
+.LBE1647:
 .LBE1646:
 .LBE1645:
 .LBE1644:
-.LBE1643:
-.LBE1642:
-	.loc 1 3051 0
+	.loc 1 3052 0
 	str	x22, [x20, 24]
+.LBB1718:
+.LBB1715:
+.LBB1655:
+.LBB1652:
+.LBB1649:
+	.loc 12 499 0
+	mov	x4, 0
+.LBE1649:
+.LBE1652:
+.LBE1655:
+.LBE1715:
+.LBE1718:
+	.loc 1 3053 0
+	ldr	x2, [x20, 8]
+.LBB1719:
 .LBB1716:
-.LBB1713:
+.LBB1656:
 .LBB1653:
 .LBB1650:
-.LBB1647:
 	.loc 12 499 0
-	mov	x4, 0
-.LBE1647:
+	add	x1, x1, :lo12:.LC34
 .LBE1650:
 .LBE1653:
-.LBE1713:
+.LBE1656:
 .LBE1716:
-	.loc 1 3052 0
-	ldr	x2, [x20, 8]
+.LBE1719:
+	.loc 1 3054 0
+	stp	x2, x0, [x21, 8]
+.LBB1720:
 .LBB1717:
-.LBB1714:
+.LBB1657:
 .LBB1654:
 .LBB1651:
-.LBB1648:
-	.loc 12 499 0
-	add	x1, x1, :lo12:.LC34
-.LBE1648:
-.LBE1651:
-.LBE1654:
-.LBE1714:
-.LBE1717:
-	.loc 1 3053 0
-	stp	x2, x0, [x21, 8]
-.LBB1718:
-.LBB1715:
-.LBB1655:
-.LBB1652:
-.LBB1649:
 	.loc 12 499 0
 	mov	x3, 1
 	ldr	x0, [x22, 752]
@@ -7574,12 +7574,12 @@ ebc_probe:
 .LVL623:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
-.LBE1649:
-.LBE1652:
-.LBE1655:
-.LBB1656:
-.LBB1657:
+.LBE1651:
+.LBE1654:
+.LBE1657:
 .LBB1658:
+.LBB1659:
+.LBB1660:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC58
@@ -7591,12 +7591,12 @@ ebc_probe:
 .LVL624:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
+.LBE1660:
+.LBE1659:
 .LBE1658:
-.LBE1657:
-.LBE1656:
-.LBB1659:
-.LBB1660:
 .LBB1661:
+.LBB1662:
+.LBB1663:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC59
@@ -7608,12 +7608,12 @@ ebc_probe:
 .LVL625:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
+.LBE1663:
+.LBE1662:
 .LBE1661:
-.LBE1660:
-.LBE1659:
-.LBB1662:
-.LBB1663:
 .LBB1664:
+.LBB1665:
+.LBB1666:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC60
@@ -7625,12 +7625,12 @@ ebc_probe:
 .LVL626:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
+.LBE1666:
+.LBE1665:
 .LBE1664:
-.LBE1663:
-.LBE1662:
-.LBB1665:
-.LBB1666:
 .LBB1667:
+.LBB1668:
+.LBB1669:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC61
@@ -7642,12 +7642,12 @@ ebc_probe:
 .LVL627:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
+.LBE1669:
+.LBE1668:
 .LBE1667:
-.LBE1666:
-.LBE1665:
-.LBB1668:
-.LBB1669:
 .LBB1670:
+.LBB1671:
+.LBB1672:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC62
@@ -7659,12 +7659,12 @@ ebc_probe:
 .LVL628:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
+.LBE1672:
+.LBE1671:
 .LBE1670:
-.LBE1669:
-.LBE1668:
-.LBB1671:
-.LBB1672:
 .LBB1673:
+.LBB1674:
+.LBB1675:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC63
@@ -7676,12 +7676,12 @@ ebc_probe:
 .LVL629:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
+.LBE1675:
+.LBE1674:
 .LBE1673:
-.LBE1672:
-.LBE1671:
-.LBB1674:
-.LBB1675:
 .LBB1676:
+.LBB1677:
+.LBB1678:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC64
@@ -7693,12 +7693,12 @@ ebc_probe:
 .LVL630:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
+.LBE1678:
+.LBE1677:
 .LBE1676:
-.LBE1675:
-.LBE1674:
-.LBB1677:
-.LBB1678:
 .LBB1679:
+.LBB1680:
+.LBB1681:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC65
@@ -7710,12 +7710,12 @@ ebc_probe:
 .LVL631:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
+.LBE1681:
+.LBE1680:
 .LBE1679:
-.LBE1678:
-.LBE1677:
-.LBB1680:
-.LBB1681:
 .LBB1682:
+.LBB1683:
+.LBB1684:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC66
@@ -7727,12 +7727,12 @@ ebc_probe:
 .LVL632:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
+.LBE1684:
+.LBE1683:
 .LBE1682:
-.LBE1681:
-.LBE1680:
-.LBB1683:
-.LBB1684:
 .LBB1685:
+.LBB1686:
+.LBB1687:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC67
@@ -7744,12 +7744,12 @@ ebc_probe:
 .LVL633:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
+.LBE1687:
+.LBE1686:
 .LBE1685:
-.LBE1684:
-.LBE1683:
-.LBB1686:
-.LBB1687:
 .LBB1688:
+.LBB1689:
+.LBB1690:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC68
@@ -7761,12 +7761,12 @@ ebc_probe:
 .LVL634:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
+.LBE1690:
+.LBE1689:
 .LBE1688:
-.LBE1687:
-.LBE1686:
-.LBB1689:
-.LBB1690:
 .LBB1691:
+.LBB1692:
+.LBB1693:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC69
@@ -7778,12 +7778,12 @@ ebc_probe:
 .LVL635:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
+.LBE1693:
+.LBE1692:
 .LBE1691:
-.LBE1690:
-.LBE1689:
-.LBB1692:
-.LBB1693:
 .LBB1694:
+.LBB1695:
+.LBB1696:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC70
@@ -7795,12 +7795,12 @@ ebc_probe:
 .LVL636:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
+.LBE1696:
+.LBE1695:
 .LBE1694:
-.LBE1693:
-.LBE1692:
-.LBB1695:
-.LBB1696:
 .LBB1697:
+.LBB1698:
+.LBB1699:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC71
@@ -7812,12 +7812,12 @@ ebc_probe:
 .LVL637:
 	.loc 12 501 0
 	tbnz	w0, #31, .L699
+.LBE1699:
+.LBE1698:
 .LBE1697:
-.LBE1696:
-.LBE1695:
-.LBB1698:
-.LBB1699:
 .LBB1700:
+.LBB1701:
+.LBB1702:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC72
@@ -7829,15 +7829,15 @@ ebc_probe:
 .LVL638:
 	.loc 12 501 0
 	tbz	w0, #31, .L725
+.LBE1702:
+.LBE1701:
 .LBE1700:
-.LBE1699:
-.LBE1698:
-	.loc 1 2320 0
+	.loc 1 2321 0
 	str	wzr, [x21, 148]
 .L725:
-.LBB1701:
-.LBB1702:
 .LBB1703:
+.LBB1704:
+.LBB1705:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC35
@@ -7849,15 +7849,15 @@ ebc_probe:
 .LVL639:
 	.loc 12 501 0
 	tbz	w0, #31, .L726
+.LBE1705:
+.LBE1704:
 .LBE1703:
-.LBE1702:
-.LBE1701:
-	.loc 1 2323 0
+	.loc 1 2324 0
 	str	wzr, [x21, 152]
 .L726:
-.LBB1704:
-.LBB1705:
 .LBB1706:
+.LBB1707:
+.LBB1708:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC36
@@ -7869,15 +7869,15 @@ ebc_probe:
 .LVL640:
 	.loc 12 501 0
 	tbz	w0, #31, .L727
+.LBE1708:
+.LBE1707:
 .LBE1706:
-.LBE1705:
-.LBE1704:
-	.loc 1 2326 0
+	.loc 1 2327 0
 	str	wzr, [x21, 156]
 .L727:
-.LBB1707:
-.LBB1708:
 .LBB1709:
+.LBB1710:
+.LBB1711:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC37
@@ -7889,15 +7889,15 @@ ebc_probe:
 .LVL641:
 	.loc 12 501 0
 	tbz	w0, #31, .L728
+.LBE1711:
+.LBE1710:
 .LBE1709:
-.LBE1708:
-.LBE1707:
-	.loc 1 2329 0
+	.loc 1 2330 0
 	str	wzr, [x21, 92]
 .L728:
-.LBB1710:
-.LBB1711:
 .LBB1712:
+.LBB1713:
+.LBB1714:
 	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC38
@@ -7909,94 +7909,94 @@ ebc_probe:
 .LVL642:
 	.loc 12 501 0
 	tbz	w0, #31, .L729
+.LBE1714:
+.LBE1713:
 .LBE1712:
-.LBE1711:
-.LBE1710:
-	.loc 1 2332 0
+	.loc 1 2333 0
 	str	wzr, [x21, 96]
 .L729:
-.LBE1715:
-.LBE1718:
-	.loc 1 3061 0
+.LBE1717:
+.LBE1720:
+	.loc 1 3062 0
 	ldr	w0, [x21, 88]
-.LBB1719:
-.LBB1720:
-	.loc 1 2784 0
+.LBB1721:
+.LBB1722:
+	.loc 1 2785 0
 	mov	w2, 0
-.LBE1720:
-.LBE1719:
-	.loc 1 3061 0
-	str	w0, [x19, 68]
+.LBE1722:
+.LBE1721:
 	.loc 1 3062 0
+	str	w0, [x19, 68]
+	.loc 1 3063 0
 	ldr	w1, [x21, 84]
 	str	w1, [x19, 72]
-	.loc 1 3065 0
+	.loc 1 3066 0
 	tst	x1, 15
-	.loc 1 3063 0
+	.loc 1 3064 0
 	mul	w0, w0, w1
-	.loc 1 3065 0
+	.loc 1 3066 0
 	cset	w1, eq
 	str	w1, [x19, 88]
-.LBB1734:
-.LBB1729:
-	.loc 1 2784 0
+.LBB1736:
+.LBB1731:
+	.loc 1 2785 0
 	adrp	x1, .LC39
 	add	x1, x1, :lo12:.LC39
-.LBE1729:
-.LBE1734:
-	.loc 1 3063 0
-	lsr	w3, w0, 1
+.LBE1731:
+.LBE1736:
 	.loc 1 3064 0
+	lsr	w3, w0, 1
+	.loc 1 3065 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x19, 20]
-.LBB1735:
-.LBB1730:
-	.loc 1 2775 0
+.LBB1737:
+.LBB1732:
+	.loc 1 2776 0
 	ldr	x26, [x20]
 .LVL643:
-	.loc 1 2784 0
+	.loc 1 2785 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL644:
-	.loc 1 2785 0
+	.loc 1 2786 0
 	cbz	x0, .L736
-	.loc 1 2788 0
+	.loc 1 2789 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL645:
 	mov	w25, w0
-	.loc 1 2790 0
+	.loc 1 2791 0
 	cbnz	w0, .L775
-.LBB1721:
-.LBB1722:
+.LBB1723:
+.LBB1724:
 	.file 13 "./include/linux/ioport.h"
 	.loc 13 204 0
 	ldp	x1, x2, [x29, 104]
-.LBE1722:
-.LBE1721:
-	.loc 1 2795 0
+.LBE1724:
+.LBE1723:
+	.loc 1 2796 0
 	str	x1, [x20, 184]
-	.loc 1 2798 0
+	.loc 1 2799 0
 	mov	x3, 1
 	mov	x0, x26
-.LBB1724:
-.LBB1723:
+.LBB1726:
+.LBB1725:
 	.loc 13 204 0
 	add	x2, x2, 1
 	sub	x2, x2, x1
-.LBE1723:
-.LBE1724:
-	.loc 1 2796 0
+.LBE1725:
+.LBE1726:
+	.loc 1 2797 0
 	str	w2, [x19, 16]
-	.loc 1 2798 0
+	.loc 1 2799 0
 	sxtw	x2, w2
 	bl	devm_memremap
 .LVL646:
 	str	x0, [x19, 8]
-	.loc 1 2800 0
+	.loc 1 2801 0
 	cbz	x0, .L707
-	.loc 1 2808 0
+	.loc 1 2809 0
 	mov	x1, x0
 	ldr	w2, [x19, 16]
 	ldr	x0, [x20, 184]
@@ -8004,279 +8004,279 @@ ebc_probe:
 	mov	w3, 4194304
 	bl	ebc_buf_init
 .LVL647:
-	.loc 1 2809 0
+	.loc 1 2810 0
 	cbnz	w0, .L707
-	.loc 1 2814 0
-	ldr	x1, [x19, 8]
 	.loc 1 2815 0
+	ldr	x1, [x19, 8]
+	.loc 1 2816 0
 	mov	x6, 1048576
-	.loc 1 2814 0
-	mov	x3, 20971520
 	.loc 1 2815 0
+	mov	x3, 20971520
+	.loc 1 2816 0
 	str	x6, [x21, 40]
-	.loc 1 2814 0
+	.loc 1 2815 0
 	add	x8, x1, x3
 	str	x8, [x21, 24]
 	mov	x7, 22020096
 	add	x5, x1, x7
-	.loc 1 2816 0
+	.loc 1 2817 0
 	ldr	x2, [x20, 184]
-	.loc 1 2821 0
+	.loc 1 2822 0
 	mov	x4, 23068672
 	add	x4, x1, x4
-.LBB1725:
-.LBB1726:
+.LBB1727:
+.LBB1728:
 	.loc 2 711 0
 	mov	x0, x26
-.LBE1726:
-.LBE1725:
-	.loc 1 2816 0
+.LBE1728:
+.LBE1727:
+	.loc 1 2817 0
 	add	x3, x2, x3
 	str	x3, [x21, 32]
-	.loc 1 2817 0
+	.loc 1 2818 0
 	str	x8, [x19, 184]
-	.loc 1 2816 0
+	.loc 1 2817 0
 	add	x2, x2, x7
-	.loc 1 2815 0
-	str	x6, [x21, 64]
 	.loc 1 2816 0
+	str	x6, [x21, 64]
+	.loc 1 2817 0
 	stp	x5, x2, [x21, 48]
-	.loc 1 2822 0
+	.loc 1 2823 0
 	mov	x2, 27262976
 	add	x2, x1, x2
 	stp	x4, x2, [x19, 144]
-	.loc 1 2823 0
+	.loc 1 2824 0
 	mov	x2, 31457280
 	add	x2, x1, x2
-	.loc 1 2817 0
+	.loc 1 2818 0
 	str	x5, [x19, 192]
-	.loc 1 2823 0
-	str	x2, [x19, 160]
 	.loc 1 2824 0
+	str	x2, [x19, 160]
+	.loc 1 2825 0
 	mov	x2, 35651584
 	add	x1, x1, x2
 	str	x1, [x19, 128]
-	.loc 1 2827 0
+	.loc 1 2828 0
 	ldp	w2, w1, [x21, 84]
-.LBB1728:
-.LBB1727:
+.LBB1730:
+.LBB1729:
 	.loc 2 711 0
 	mul	w1, w2, w1
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	bl	devm_kmalloc
 .LVL648:
-.LBE1727:
-.LBE1728:
-	.loc 1 2827 0
-	str	x0, [x19, 168]
+.LBE1729:
+.LBE1730:
 	.loc 1 2828 0
+	str	x0, [x19, 168]
+	.loc 1 2829 0
 	cbz	x0, .L707
-	.loc 1 2830 0
+	.loc 1 2831 0
 	ldp	w2, w1, [x21, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
 .LVL649:
-	.loc 1 2831 0
+	.loc 1 2832 0
 	ldrsw	x2, [x19, 20]
 	mov	w1, 255
 	ldr	x0, [x19, 160]
 	bl	memset
 .LVL650:
-.LBE1730:
-.LBE1735:
-.LBB1736:
-.LBB1737:
-	.loc 1 2732 0
+.LBE1732:
+.LBE1737:
+.LBB1738:
+.LBB1739:
+	.loc 1 2733 0
 	ldr	x26, [x19, 104]
 .LVL651:
-	.loc 1 2738 0
+	.loc 1 2739 0
 	adrp	x1, .LC41
 	mov	w2, 0
 	add	x1, x1, :lo12:.LC41
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL652:
-	.loc 1 2739 0
+	.loc 1 2740 0
 	cbz	x0, .L737
-	.loc 1 2742 0
+	.loc 1 2743 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL653:
 	mov	w25, w0
-	.loc 1 2744 0
+	.loc 1 2745 0
 	cbz	w0, .L776
 .L708:
-.LBE1737:
-.LBE1736:
-	.loc 1 3077 0
+.LBE1739:
+.LBE1738:
+	.loc 1 3078 0
 	adrp	x1, .LC74
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC74
 	bl	_dev_err
 .LVL654:
-	.loc 1 3078 0
+	.loc 1 3079 0
 	b	.L685
 .LVL655:
 	.p2align 3
 .L699:
-	.loc 1 3059 0
+	.loc 1 3060 0
 	mov	w25, -22
-	.loc 1 3058 0
+	.loc 1 3059 0
 	adrp	x1, .LC80
 	mov	w2, w25
 	add	x1, x1, :lo12:.LC80
 	mov	x0, x22
 	bl	_dev_err
 .LVL656:
-	.loc 1 3059 0
+	.loc 1 3060 0
 	b	.L685
 .LVL657:
 	.p2align 3
 .L772:
-	.loc 1 3032 0
+	.loc 1 3033 0
 	adrp	x1, .LC31
 	mov	x0, x22
 .LVL658:
 	add	x1, x1, :lo12:.LC31
-	.loc 1 3033 0
+	.loc 1 3034 0
 	mov	w25, -19
-	.loc 1 3032 0
+	.loc 1 3033 0
 	bl	_dev_err
 .LVL659:
-	.loc 1 3033 0
+	.loc 1 3034 0
 	b	.L685
 .LVL660:
 	.p2align 3
 .L697:
-	.loc 1 3044 0
+	.loc 1 3045 0
 	adrp	x1, .LC33
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC33
-	.loc 1 3045 0
+	.loc 1 3046 0
 	mov	w25, -517
-	.loc 1 3044 0
+	.loc 1 3045 0
 	bl	_dev_err
 .LVL661:
-	.loc 1 3045 0
+	.loc 1 3046 0
 	b	.L685
 .LVL662:
 	.p2align 3
 .L775:
-.LBB1745:
-.LBB1731:
-	.loc 1 2791 0
+.LBB1747:
+.LBB1733:
+	.loc 1 2792 0
 	adrp	x1, .LC40
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC40
 	bl	_dev_err
 .LVL663:
 .L704:
-.LBE1731:
-.LBE1745:
-	.loc 1 3070 0
+.LBE1733:
+.LBE1747:
+	.loc 1 3071 0
 	adrp	x1, .LC73
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC73
 	bl	_dev_err
 .LVL664:
-	.loc 1 3071 0
+	.loc 1 3072 0
 	b	.L685
 .LVL665:
 .L776:
-.LBB1746:
-.LBB1742:
-	.loc 1 2753 0
+.LBB1748:
+.LBB1744:
+	.loc 1 2754 0
 	mov	x0, x26
 	mov	x3, 1
-.LBB1738:
-.LBB1739:
+.LBB1740:
+.LBB1741:
 	.loc 13 204 0
 	ldp	x1, x26, [x29, 104]
 .LVL666:
-.LBE1739:
-.LBE1738:
-	.loc 1 2750 0
+.LBE1741:
+.LBE1740:
+	.loc 1 2751 0
 	str	x1, [x19, 32]
-.LBB1741:
-.LBB1740:
+.LBB1743:
+.LBB1742:
 	.loc 13 204 0
 	add	x26, x26, 1
 	sub	x26, x26, x1
-.LBE1740:
-.LBE1741:
-	.loc 1 2751 0
+.LBE1742:
+.LBE1743:
+	.loc 1 2752 0
 	str	w26, [x19, 40]
-	.loc 1 2753 0
+	.loc 1 2754 0
 	sxtw	x2, w26
 	bl	devm_memremap
 .LVL667:
 	str	x0, [x19, 208]
-	.loc 1 2755 0
+	.loc 1 2756 0
 	cbz	x0, .L777
-	.loc 1 2760 0
+	.loc 1 2761 0
 	bl	epd_lut_from_mem_init
 .LVL668:
-	.loc 1 2761 0
+	.loc 1 2762 0
 	tbnz	w0, #31, .L778
 .L710:
-.LBE1742:
-.LBE1746:
-.LBB1747:
-.LBB1748:
-	.loc 1 2840 0
+.LBE1744:
+.LBE1748:
+.LBB1749:
+.LBB1750:
+	.loc 1 2841 0
 	add	x0, x20, 752
 	mov	x1, 68719476704
 	str	x1, [x19, 560]
-	.loc 1 2844 0
+	.loc 1 2845 0
 	add	x24, x24, :lo12:.LANCHOR0
-.LBB1749:
-.LBB1750:
 .LBB1751:
 .LBB1752:
 .LBB1753:
+.LBB1754:
+.LBB1755:
 	.file 14 "./include/linux/compiler.h"
 	.loc 14 288 0
 	str	x0, [x20, 752]
+.LBE1755:
+.LBE1754:
 .LBE1753:
 .LBE1752:
 .LBE1751:
-.LBE1750:
-.LBE1749:
-	.loc 1 2841 0
+	.loc 1 2842 0
 	adrp	x5, .LC75
-.LBB1755:
-.LBB1754:
+.LBB1757:
+.LBB1756:
 	.file 15 "./include/linux/list.h"
 	.loc 15 29 0
 	str	x0, [x0, 8]
-.LBE1754:
-.LBE1755:
-	.loc 1 2840 0
+.LBE1756:
+.LBE1757:
+	.loc 1 2841 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x19, 584]
-	.loc 1 2841 0
+	.loc 1 2842 0
 	add	x5, x5, :lo12:.LC75
 	mov	w1, 14
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 1
 	movk	w1, 0xa, lsl 16
-	.loc 1 2838 0
+	.loc 1 2839 0
 	mov	w26, 99
-	.loc 1 2841 0
+	.loc 1 2842 0
 	adrp	x0, .LC76
-	.loc 1 2838 0
+	.loc 1 2839 0
 	str	w26, [x29, 104]
-	.loc 1 2841 0
+	.loc 1 2842 0
 	add	x0, x0, :lo12:.LC76
 	bl	__alloc_workqueue_key
 .LVL669:
 	str	x0, [x19, 608]
-	.loc 1 2844 0
+	.loc 1 2845 0
 	adrp	x3, .LC77
 	mov	w2, -1
 	add	x3, x3, :lo12:.LC77
@@ -8286,18 +8286,18 @@ ebc_probe:
 	bl	kthread_create_on_node
 .LVL670:
 	str	x0, [x24, 8]
-	.loc 1 2845 0
+	.loc 1 2846 0
 	cmn	x0, #4096
 	bhi	.L779
-	.loc 1 2849 0
+	.loc 1 2850 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
 .LVL671:
-	.loc 1 2850 0
+	.loc 1 2851 0
 	ldr	x2, [x24, 8]
-.LBB1756:
-.LBB1757:
+.LBB1758:
+.LBB1759:
 	.file 16 "./arch/arm64/include/asm/atomic_lse.h"
 	.loc 16 47 0
 	mov	w0, 1
@@ -8333,10 +8333,10 @@ ebc_probe:
 // 0 "" 2
 .LVL674:
 #NO_APP
-.LBE1757:
-.LBE1756:
-.LBB1758:
-	.loc 1 2853 0
+.LBE1759:
+.LBE1758:
+.LBB1760:
+	.loc 1 2854 0
 	adrp	x3, .LC46
 	adrp	x0, ebc_thread
 .LVL675:
@@ -8344,11 +8344,11 @@ ebc_probe:
 	mov	w2, -1
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x19
-.LBE1758:
-	.loc 1 2852 0
-	str	w26, [x29, 104]
-.LBB1759:
+.LBE1760:
 	.loc 1 2853 0
+	str	w26, [x29, 104]
+.LBB1761:
+	.loc 1 2854 0
 	bl	kthread_create_on_node
 .LVL676:
 	mov	x24, x0
@@ -8357,18 +8357,18 @@ ebc_probe:
 	bhi	.L712
 	bl	wake_up_process
 .LVL678:
-.LBE1759:
+.LBE1761:
 	str	x24, [x19, 136]
-	.loc 1 2858 0
+	.loc 1 2859 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x24
 	bl	sched_setscheduler_nocheck
 .LVL679:
-	.loc 1 2859 0
+	.loc 1 2860 0
 	ldr	x2, [x19, 136]
-.LBB1760:
-.LBB1761:
+.LBB1762:
+.LBB1763:
 	.loc 16 47 0
 	mov	w0, 1
 .LVL680:
@@ -8403,60 +8403,60 @@ ebc_probe:
 // 0 "" 2
 .LVL682:
 #NO_APP
-.LBE1761:
-.LBE1760:
-.LBE1748:
-.LBE1747:
-.LBB1764:
-.LBB1765:
-	.loc 1 2868 0
+.LBE1763:
+.LBE1762:
+.LBE1750:
+.LBE1749:
+.LBB1766:
+.LBB1767:
+	.loc 1 2869 0
 	mov	w0, -1
 .LVL683:
 	str	w0, [x19, 64]
-.LBB1766:
-.LBB1767:
+.LBB1768:
+.LBB1769:
 	.loc 4 39 0
 	add	x0, x20, 416
 .LVL684:
-.LBE1767:
-.LBE1766:
-	.loc 1 2872 0
+.LBE1769:
+.LBE1768:
+	.loc 1 2873 0
 	str	wzr, [x19, 44]
-	.loc 1 2871 0
+	.loc 1 2872 0
 	str	wzr, [x19, 96]
-.LBB1772:
-.LBB1768:
+.LBB1774:
+.LBB1770:
 	.loc 4 43 0
 	adrp	x1, .LC47
-.LBE1768:
-.LBE1772:
-	.loc 1 2867 0
+.LBE1770:
+.LBE1774:
+	.loc 1 2868 0
 	str	wzr, [x19, 200]
-.LBB1773:
-.LBB1769:
+.LBB1775:
+.LBB1771:
 	.loc 4 43 0
 	add	x1, x1, :lo12:.LC47
-.LBE1769:
-.LBE1773:
-	.loc 1 2869 0
+.LBE1771:
+.LBE1775:
+	.loc 1 2870 0
 	str	wzr, [x19, 616]
-	.loc 1 2879 0
+	.loc 1 2880 0
 	add	x24, x20, 632
 .LVL685:
-	.loc 1 2870 0
+	.loc 1 2871 0
 	str	wzr, [x19, 620]
-	.loc 1 2880 0
+	.loc 1 2881 0
 	adrp	x26, jiffies
-.LBB1774:
-.LBB1770:
+.LBB1776:
+.LBB1772:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0]
-.LBE1770:
-.LBE1774:
-	.loc 1 2880 0
+.LBE1772:
+.LBE1776:
+	.loc 1 2881 0
 	mov	x27, 268435455
-.LBB1775:
-.LBB1771:
+.LBB1777:
+.LBB1773:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0, 16]
 	stp	xzr, xzr, [x0, 32]
@@ -8475,11 +8475,11 @@ ebc_probe:
 	.loc 4 45 0
 	bl	wakeup_source_add
 .LVL686:
-.LBE1771:
-.LBE1775:
-	.loc 1 2876 0
+.LBE1773:
+.LBE1777:
+	.loc 1 2877 0
 	str	wzr, [x19, 440]
-	.loc 1 2879 0
+	.loc 1 2880 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -8488,16 +8488,16 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
 .LVL687:
-	.loc 1 2880 0
+	.loc 1 2881 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
-	.loc 1 2883 0
+	.loc 1 2884 0
 	add	x24, x20, 688
-	.loc 1 2880 0
+	.loc 1 2881 0
 	add	x1, x1, x27
 	bl	mod_timer
 .LVL688:
-	.loc 1 2883 0
+	.loc 1 2884 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -8506,109 +8506,109 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
 .LVL689:
-	.loc 1 2884 0
+	.loc 1 2885 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
 	add	x1, x1, x27
 	bl	mod_timer
 .LVL690:
-.LBE1765:
-.LBE1764:
-.LBB1776:
-.LBB1777:
-	.loc 1 2894 0
+.LBE1767:
+.LBE1766:
+.LBB1778:
+.LBB1779:
+	.loc 1 2895 0
 	adrp	x0, saved_command_line
 	adrp	x1, .LC48
-	.loc 1 2891 0
+	.loc 1 2892 0
 	stp	wzr, wzr, [x29, 100]
 .LVL691:
-	.loc 1 2894 0
+	.loc 1 2895 0
 	add	x1, x1, :lo12:.LC48
 	ldr	x24, [x0, #:lo12:saved_command_line]
 	mov	x0, x24
 	bl	strstr
 .LVL692:
-	.loc 1 2895 0
+	.loc 1 2896 0
 	adrp	x1, .LC49
-	.loc 1 2894 0
+	.loc 1 2895 0
 	mov	x26, x0
 .LVL693:
-	.loc 1 2895 0
+	.loc 1 2896 0
 	add	x1, x1, :lo12:.LC49
 	mov	x0, x24
 	bl	strstr
 .LVL694:
 	mov	x28, x0
 .LVL695:
-	.loc 1 2900 0
-	cbz	x26, .L713
 	.loc 1 2901 0
+	cbz	x26, .L713
+	.loc 1 2902 0
 	add	x2, x29, 100
 	adrp	x1, .LC50
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC50
 	bl	sscanf
 .LVL696:
-	.loc 1 2902 0
+	.loc 1 2903 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
 	bls	.L780
 .L713:
-	.loc 1 2914 0
+	.loc 1 2915 0
 	mov	w24, 0
 .LVL697:
 	mov	x27, 0
 .LVL698:
-	.loc 1 2898 0
+	.loc 1 2899 0
 	mov	x26, 0
 .LVL699:
-	.loc 1 2914 0
+	.loc 1 2915 0
 	cbz	x28, .L733
 .LVL700:
 .L732:
-	.loc 1 2915 0
+	.loc 1 2916 0
 	add	x2, x29, 104
 	mov	x0, x28
 	adrp	x1, .LC53
 	add	x1, x1, :lo12:.LC53
 	bl	sscanf
 .LVL701:
-	.loc 1 2893 0
+	.loc 1 2894 0
 	mov	w28, 0
 .LVL702:
-	.loc 1 2916 0
+	.loc 1 2917 0
 	ldr	w2, [x29, 104]
-	.loc 1 2898 0
+	.loc 1 2899 0
 	mov	x26, 0
 .LVL703:
-	.loc 1 2916 0
+	.loc 1 2917 0
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
 	bls	.L781
 .L717:
-	.loc 1 2928 0
+	.loc 1 2929 0
 	cbnz	w24, .L716
 .LVL704:
 .L733:
-	.loc 1 2929 0
+	.loc 1 2930 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC56
 	add	x1, x1, :lo12:.LC56
 	bl	_dev_info
 .LVL705:
-	.loc 1 2930 0
+	.loc 1 2931 0
 	ldr	x0, [x20, 16]
 	bl	ebc_pmic_verity_vcom
 .LVL706:
-.LBB1778:
-.LBB1779:
-	.loc 1 2239 0
+.LBB1780:
+.LBB1781:
+	.loc 1 2240 0
 	bl	ebc_empty_buf_get
 .LVL707:
 	mov	x24, x0
 .LVL708:
-	.loc 1 2240 0
+	.loc 1 2241 0
 	ldp	w2, w0, [x20, 108]
 	mov	w1, 255
 	mul	w2, w2, w0
@@ -8616,109 +8616,109 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memset
 .LVL709:
-	.loc 1 2243 0
+	.loc 1 2244 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2241 0
+	.loc 1 2242 0
 	mov	w0, 17
 	str	w0, [x24, 40]
-	.loc 1 2246 0
-	mov	w2, 16
 	.loc 1 2247 0
+	mov	w2, 16
+	.loc 1 2248 0
 	mov	x0, x24
-	.loc 1 2244 0
+	.loc 1 2245 0
 	ldr	w1, [x20, 108]
 	str	w1, [x24, 56]
-	.loc 1 2245 0
-	ldr	w1, [x20, 112]
 	.loc 1 2246 0
-	stp	w1, w2, [x24, 60]
+	ldr	w1, [x20, 112]
 	.loc 1 2247 0
+	stp	w1, w2, [x24, 60]
+	.loc 1 2248 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL710:
 .L719:
-.LBE1779:
-.LBE1778:
-	.loc 1 2948 0
+.LBE1781:
+.LBE1780:
+	.loc 1 2949 0
 	cbnz	w28, .L782
 .L721:
-	.loc 1 2962 0
+	.loc 1 2963 0
 	ldr	w0, [x19, 96]
 	adrp	x21, .LANCHOR1
 	cbz	w0, .L783
 .L723:
-	.loc 1 2967 0
-	cbz	x27, .L724
 	.loc 1 2968 0
+	cbz	x27, .L724
+	.loc 1 2969 0
 	mov	x0, x27
 	bl	kfree
 .LVL711:
 .L724:
-	.loc 1 2969 0
-	cbz	x26, .L715
 	.loc 1 2970 0
+	cbz	x26, .L715
+	.loc 1 2971 0
 	mov	x0, x26
 	bl	kfree
 .LVL712:
 .L715:
-.LBE1777:
-.LBE1776:
-.LBB1789:
-.LBB1790:
+.LBE1779:
+.LBE1778:
 .LBB1791:
+.LBB1792:
+.LBB1793:
 	.loc 2 1186 0
 	str	x20, [x22, 184]
+.LBE1793:
+.LBE1792:
 .LBE1791:
-.LBE1790:
-.LBE1789:
-.LBB1792:
-.LBB1793:
-	.loc 1 2715 0
+.LBB1794:
+.LBB1795:
+	.loc 1 2716 0
 	add	x21, x21, :lo12:.LANCHOR1
 	add	x0, x21, 224
 	bl	misc_register
 .LVL713:
-	.loc 1 2716 0
+	.loc 1 2717 0
 	add	x0, x21, 376
 	bl	misc_register
 .LVL714:
-	.loc 1 2718 0
+	.loc 1 2719 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 456
 	bl	device_create_file
 .LVL715:
-	.loc 1 2719 0
+	.loc 1 2720 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 488
 	bl	device_create_file
 .LVL716:
-	.loc 1 2720 0
+	.loc 1 2721 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 520
 	bl	device_create_file
 .LVL717:
-	.loc 1 2721 0
+	.loc 1 2722 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 552
 	bl	device_create_file
 .LVL718:
-	.loc 1 2722 0
+	.loc 1 2723 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 584
 	bl	device_create_file
 .LVL719:
-	.loc 1 2723 0
+	.loc 1 2724 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 616
 	bl	device_create_file
 .LVL720:
-	.loc 1 2724 0
+	.loc 1 2725 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 648
 	bl	device_create_file
 .LVL721:
-.LBE1793:
-.LBE1792:
-	.loc 1 3099 0
+.LBE1795:
+.LBE1794:
+	.loc 1 3100 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LC16
 	adrp	x1, .LC57
@@ -8726,16 +8726,16 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC57
 	bl	_dev_info
 .LVL722:
-	.loc 1 3101 0
+	.loc 1 3102 0
 	b	.L685
 .LVL723:
 .L783:
-.LBB1794:
-.LBB1786:
-	.loc 1 2963 0
+.LBB1796:
+.LBB1788:
+	.loc 1 2964 0
 	mov	w2, 1
 	str	w2, [x19, 96]
-	.loc 1 2964 0
+	.loc 1 2965 0
 	add	x0, x21, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
@@ -8744,18 +8744,18 @@ ebc_probe:
 	b	.L723
 .LVL725:
 .L780:
-	.loc 1 2904 0
+	.loc 1 2905 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC51
 	add	x1, x1, :lo12:.LC51
 	bl	_dev_info
 .LVL726:
-	.loc 1 2905 0
+	.loc 1 2906 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
-.LBB1780:
-.LBB1781:
 .LBB1782:
+.LBB1783:
+.LBB1784:
 	.file 17 "./include/linux/slab.h"
 	.loc 17 553 0
 	mov	w1, 32960
@@ -8765,12 +8765,12 @@ ebc_probe:
 .LVL727:
 	mov	x27, x0
 .LVL728:
+.LBE1784:
+.LBE1783:
 .LBE1782:
-.LBE1781:
-.LBE1780:
-	.loc 1 2906 0
+	.loc 1 2907 0
 	cbz	x0, .L784
-	.loc 1 2910 0
+	.loc 1 2911 0
 	ldp	w2, w1, [x21, 84]
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
@@ -8783,23 +8783,23 @@ ebc_probe:
 	add	x1, x3, x1
 	bl	memcpy
 .LVL731:
-	.loc 1 2914 0
+	.loc 1 2915 0
 	cbnz	x28, .L785
-	.loc 1 2893 0
+	.loc 1 2894 0
 	mov	w28, 0
 .LVL732:
-	.loc 1 2898 0
+	.loc 1 2899 0
 	mov	x26, 0
 .LVL733:
 .L716:
-	.loc 1 2935 0
+	.loc 1 2936 0
 	bl	ebc_empty_buf_get
 .LVL734:
 	mov	x24, x0
 .LVL735:
-	.loc 1 2936 0
-	cbz	x0, .L719
 	.loc 1 2937 0
+	cbz	x0, .L719
+	.loc 1 2938 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
@@ -8807,40 +8807,40 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL736:
-	.loc 1 2940 0
+	.loc 1 2941 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2938 0
+	.loc 1 2939 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2943 0
-	mov	w2, 16
 	.loc 1 2944 0
+	mov	w2, 16
+	.loc 1 2945 0
 	mov	x0, x24
-	.loc 1 2941 0
+	.loc 1 2942 0
 	ldr	w1, [x21, 84]
 	str	w1, [x24, 56]
-	.loc 1 2942 0
-	ldr	w1, [x21, 88]
 	.loc 1 2943 0
-	stp	w1, w2, [x24, 60]
+	ldr	w1, [x21, 88]
 	.loc 1 2944 0
+	stp	w1, w2, [x24, 60]
+	.loc 1 2945 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL737:
 	b	.L719
 .LVL738:
 .L781:
-	.loc 1 2918 0
+	.loc 1 2919 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC54
 	add	x1, x1, :lo12:.LC54
 	bl	_dev_info
 .LVL739:
-	.loc 1 2919 0
+	.loc 1 2920 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
-.LBB1783:
-.LBB1784:
 .LBB1785:
+.LBB1786:
+.LBB1787:
 	.loc 17 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
@@ -8848,16 +8848,16 @@ ebc_probe:
 	bl	__kmalloc
 .LVL740:
 	mov	x26, x0
+.LBE1787:
+.LBE1786:
 .LBE1785:
-.LBE1784:
-.LBE1783:
-	.loc 1 2920 0
+	.loc 1 2921 0
 	cbz	x0, .L786
-	.loc 1 2924 0
+	.loc 1 2925 0
 	ldp	w2, w1, [x21, 84]
-	.loc 1 2917 0
+	.loc 1 2918 0
 	mov	w28, 1
-	.loc 1 2924 0
+	.loc 1 2925 0
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
@@ -8872,23 +8872,23 @@ ebc_probe:
 	b	.L717
 .LVL744:
 .L689:
-.LBE1786:
-.LBE1794:
-	.loc 1 3007 0
+.LBE1788:
+.LBE1796:
+	.loc 1 3008 0
 	mov	w25, -517
 	b	.L685
 .LVL745:
 .L782:
-.LBB1795:
-.LBB1787:
-	.loc 1 2949 0
+.LBB1797:
+.LBB1789:
+	.loc 1 2950 0
 	bl	ebc_empty_buf_get
 .LVL746:
 	mov	x24, x0
 .LVL747:
-	.loc 1 2950 0
-	cbz	x0, .L721
 	.loc 1 2951 0
+	cbz	x0, .L721
+	.loc 1 2952 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
@@ -8896,69 +8896,69 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL748:
-	.loc 1 2954 0
+	.loc 1 2955 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2952 0
+	.loc 1 2953 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2957 0
+	.loc 1 2958 0
 	mov	w1, 16
-	.loc 1 2955 0
+	.loc 1 2956 0
 	ldr	w0, [x21, 84]
 	str	w0, [x24, 56]
-	.loc 1 2956 0
-	ldr	w0, [x21, 88]
 	.loc 1 2957 0
-	stp	w0, w1, [x24, 60]
+	ldr	w0, [x21, 88]
 	.loc 1 2958 0
+	stp	w0, w1, [x24, 60]
+	.loc 1 2959 0
 	mov	x0, x24
 	bl	ebc_add_to_dsp_buf_list
 .LVL749:
 	b	.L721
 .LVL750:
 .L735:
-.LBE1787:
-.LBE1795:
-	.loc 1 2993 0
+.LBE1789:
+.LBE1797:
+	.loc 1 2994 0
 	mov	w25, -12
 	b	.L685
 .LVL751:
 .L690:
-	.loc 1 3017 0
+	.loc 1 3018 0
 	adrp	x1, .LC29
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC29
-	.loc 1 3018 0
+	.loc 1 3019 0
 	mov	w25, -22
-	.loc 1 3017 0
+	.loc 1 3018 0
 	bl	_dev_err
 .LVL752:
-	.loc 1 3018 0
+	.loc 1 3019 0
 	b	.L685
 .LVL753:
 .L778:
-.LBB1796:
-.LBB1743:
-	.loc 1 2762 0
+.LBB1798:
+.LBB1745:
+	.loc 1 2763 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC43
 	add	x1, x1, :lo12:.LC43
 	bl	_dev_err
 .LVL754:
-	.loc 1 2763 0
+	.loc 1 2764 0
 	ldr	x0, [x19, 104]
 	mov	w2, w26
 	ldr	x1, [x19, 208]
 	bl	epd_lut_from_file_init
 .LVL755:
-	.loc 1 2764 0
-	tbz	w0, #31, .L710
 	.loc 1 2765 0
+	tbz	w0, #31, .L710
+	.loc 1 2766 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC44
-	.loc 1 2766 0
+	.loc 1 2767 0
 	mov	w25, -1
-	.loc 1 2765 0
+	.loc 1 2766 0
 	add	x1, x1, :lo12:.LC44
 	bl	_dev_err
 .LVL756:
@@ -8966,114 +8966,114 @@ ebc_probe:
 .LVL757:
 	.p2align 3
 .L707:
-.LBE1743:
-.LBE1796:
-.LBB1797:
-.LBB1732:
-	.loc 1 2801 0
+.LBE1745:
+.LBE1798:
+.LBB1799:
+.LBB1734:
+	.loc 1 2802 0
 	mov	w25, -12
 	b	.L704
 .LVL758:
 .L779:
-.LBE1732:
-.LBE1797:
-.LBB1798:
-.LBB1762:
-	.loc 1 2846 0
+.LBE1734:
+.LBE1799:
+.LBB1800:
+.LBB1764:
+	.loc 1 2847 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC45
 	add	x1, x1, :lo12:.LC45
 	bl	_dev_err
 .LVL759:
 .L711:
-.LBE1762:
-.LBE1798:
-	.loc 1 3084 0
+.LBE1764:
+.LBE1800:
+	.loc 1 3085 0
 	adrp	x1, .LC79
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC79
-	.loc 1 3085 0
+	.loc 1 3086 0
 	mov	w25, -1
-	.loc 1 3084 0
+	.loc 1 3085 0
 	bl	_dev_err
 .LVL760:
-	.loc 1 3085 0
+	.loc 1 3086 0
 	b	.L685
 .LVL761:
 .L712:
-.LBB1799:
-.LBB1763:
-	.loc 1 2855 0
+.LBB1801:
+.LBB1765:
+	.loc 1 2856 0
 	ldr	x0, [x19, 104]
 .LVL762:
 	adrp	x1, .LC78
-	.loc 1 2853 0
+	.loc 1 2854 0
 	str	x24, [x19, 136]
-	.loc 1 2855 0
+	.loc 1 2856 0
 	add	x1, x1, :lo12:.LC78
 	bl	_dev_err
 .LVL763:
 	b	.L711
 .LVL764:
 .L771:
-.LBE1763:
-.LBE1799:
-	.loc 1 3000 0
+.LBE1765:
+.LBE1801:
+	.loc 1 3001 0
 	adrp	x1, .LC27
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC27
-	.loc 1 3001 0
+	.loc 1 3002 0
 	mov	w25, -19
-	.loc 1 3000 0
+	.loc 1 3001 0
 	bl	_dev_err
 .LVL765:
-	.loc 1 3001 0
+	.loc 1 3002 0
 	b	.L685
 .LVL766:
 .L736:
-.LBB1800:
-.LBB1733:
-	.loc 1 2786 0
+.LBB1802:
+.LBB1735:
+	.loc 1 2787 0
 	mov	w25, -19
 	b	.L704
 .LVL767:
 .L737:
-.LBE1733:
-.LBE1800:
-.LBB1801:
-.LBB1744:
-	.loc 1 2740 0
+.LBE1735:
+.LBE1802:
+.LBB1803:
+.LBB1746:
+	.loc 1 2741 0
 	mov	w25, -19
 	b	.L708
 .LVL768:
 .L777:
-	.loc 1 2756 0
+	.loc 1 2757 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
 	adrp	x1, .LC42
-	mov	w3, 2756
+	mov	w3, 2757
 	add	x2, x2, 32
 	add	x1, x1, :lo12:.LC42
-	.loc 1 2757 0
+	.loc 1 2758 0
 	mov	w25, -12
-	.loc 1 2756 0
+	.loc 1 2757 0
 	bl	_dev_err
 .LVL769:
 	b	.L708
 .LVL770:
 .L785:
-.LBE1744:
-.LBE1801:
-.LBB1802:
-.LBB1788:
-	.loc 1 2903 0
+.LBE1746:
+.LBE1803:
+.LBB1804:
+.LBB1790:
+	.loc 1 2904 0
 	mov	w24, 1
 .LVL771:
 	b	.L732
 .LVL772:
 .L784:
-	.loc 1 2907 0
+	.loc 1 2908 0
 	ldr	x0, [x19, 104]
 .LVL773:
 	adrp	x1, .LC52
@@ -9084,7 +9084,7 @@ ebc_probe:
 	b	.L715
 .LVL775:
 .L786:
-	.loc 1 2921 0
+	.loc 1 2922 0
 	ldr	x0, [x19, 104]
 .LVL776:
 	adrp	x1, .LC55
@@ -9095,9 +9095,9 @@ ebc_probe:
 	b	.L715
 .LVL778:
 .L774:
-.LBE1788:
-.LBE1802:
-	.loc 1 3102 0
+.LBE1790:
+.LBE1804:
+	.loc 1 3103 0
 	bl	__stack_chk_fail
 .LVL779:
 	.cfi_endproc
@@ -9134,27 +9134,27 @@ ebc_power_set.constprop.17:
 	str	w1, [x20, 200]
 	.loc 1 194 0
 	ldr	x2, [x19, 16]
-.LBB1803:
-.LBB1804:
+.LBB1805:
+.LBB1806:
 	.loc 3 30 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
 .LVL782:
-.LBE1804:
-.LBE1803:
+.LBE1806:
+.LBE1805:
 	.loc 1 195 0
 	ldr	x2, [x19, 8]
-.LBB1805:
-.LBB1806:
+.LBB1807:
+.LBB1808:
 	.loc 11 46 0
 	add	x1, x19, 24
 	mov	x0, x2
 	ldr	x2, [x2, 48]
 	blr	x2
 .LVL783:
-.LBE1806:
-.LBE1805:
+.LBE1808:
+.LBE1807:
 	.loc 1 196 0
 	ldr	x0, [x19]
 	adrp	x1, .LC81
@@ -9180,15 +9180,15 @@ ebc_power_set.constprop.17:
 	.loc 1 190 0
 	mov	w0, 1
 	str	w0, [x20, 440]
-.LBB1807:
-.LBB1808:
+.LBB1809:
+.LBB1810:
 	.loc 4 58 0
 	add	x0, x19, 416
 	bl	__pm_stay_awake
 .LVL787:
 	b	.L788
-.LBE1808:
-.LBE1807:
+.LBE1810:
+.LBE1809:
 	.cfi_endproc
 .LFE2887:
 	.size	ebc_power_set.constprop.17, .-ebc_power_set.constprop.17
@@ -9881,14 +9881,14 @@ ebc_auto_tast_function:
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
-.LBB1809:
-.LBB1810:
 .LBB1811:
+.LBB1812:
+.LBB1813:
 	.loc 14 288 0
 	mov	x24, 2
+.LBE1813:
+.LBE1812:
 .LBE1811:
-.LBE1810:
-.LBE1809:
 	.loc 1 1581 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -32
@@ -9905,9 +9905,9 @@ ebc_auto_tast_function:
 	add	x25, x22, 744
 	.loc 1 1647 0
 	add	x26, x26, :lo12:.LC82
+.LBB1818:
+.LBB1815:
 .LBB1816:
-.LBB1813:
-.LBB1814:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -9918,9 +9918,9 @@ ebc_auto_tast_function:
 	b	.L880
 	.p2align 3
 .L877:
-.LBE1814:
-.LBE1813:
 .LBE1816:
+.LBE1815:
+.LBE1818:
 	.loc 1 1667 0
 	mov	x0, x20
 	bl	up
@@ -9933,14 +9933,14 @@ ebc_auto_tast_function:
 	mov	x0, x20
 	bl	down
 .LVL860:
+.LBB1819:
 .LBB1817:
-.LBB1815:
-.LBB1812:
+.LBB1814:
 	.loc 14 288 0
 	str	x24, [x23, 32]
-.LBE1812:
-.LBE1815:
+.LBE1814:
 .LBE1817:
+.LBE1819:
 	.loc 1 1591 0
 #APP
 // 1591 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
@@ -9984,8 +9984,8 @@ ebc_auto_tast_function:
 	.loc 1 1646 0
 	ldr	w0, [x19, 52]
 	cbz	w0, .L892
-.LBB1818:
-.LBB1819:
+.LBB1820:
+.LBB1821:
 	.file 18 "./include/linux/workqueue.h"
 	.loc 18 518 0
 	ldr	x1, [x19, 608]
@@ -9996,8 +9996,8 @@ ebc_auto_tast_function:
 	b	.L877
 	.p2align 3
 .L869:
-.LBE1819:
-.LBE1818:
+.LBE1821:
+.LBE1820:
 	.loc 1 1631 0
 	ldr	w1, [x19, 56]
 	.loc 1 1632 0
@@ -10135,186 +10135,158 @@ ebc_thread:
 	.cfi_offset 21, -208
 	.cfi_offset 22, -200
 	.loc 1 1896 0
-	adrp	x21, .LANCHOR0
+	adrp	x22, .LANCHOR0
 	.loc 1 1895 0
 	stp	x19, x20, [sp, 16]
-	adrp	x22, .LANCHOR1
 	stp	x23, x24, [sp, 48]
-.LBB1848:
-.LBB1849:
-.LBB1850:
-	.loc 1 2227 0
-	add	x22, x22, :lo12:.LANCHOR1
-.LBE1850:
-.LBE1849:
-.LBE1848:
-	.loc 1 1895 0
-	stp	x27, x28, [sp, 80]
 	.cfi_offset 19, -224
 	.cfi_offset 20, -216
 	.cfi_offset 23, -192
 	.cfi_offset 24, -184
+	adrp	x24, __stack_chk_guard
+	stp	x27, x28, [sp, 80]
+	adrp	x23, .LANCHOR1
+	stp	x25, x26, [sp, 64]
 	.cfi_offset 27, -160
 	.cfi_offset 28, -152
-	adrp	x23, __stack_chk_guard
-	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -176
 	.cfi_offset 26, -168
 	.loc 1 1895 0
-	add	x0, x23, :lo12:__stack_chk_guard
+	add	x0, x24, :lo12:__stack_chk_guard
 .LVL875:
 	.loc 1 1896 0
-	ldr	x20, [x21, #:lo12:.LANCHOR0]
+	ldr	x20, [x22, #:lo12:.LANCHOR0]
 .LVL876:
-.LBB1855:
+.LBB1852:
 .LBB1853:
-.LBB1851:
-	.loc 1 2227 0
-	add	x19, x22, 304
-.LBE1851:
+.LBB1854:
+	.loc 1 2228 0
+	add	x23, x23, :lo12:.LANCHOR1
+.LBE1854:
 .LBE1853:
-.LBE1855:
+.LBE1852:
 	.loc 1 1895 0
 	ldr	x1, [x0]
 	str	x1, [x29, 232]
 	mov	x1,0
-	.loc 1 1900 0
-	str	wzr, [x29, 108]
+.LBB1859:
+.LBB1857:
+.LBB1855:
+	.loc 1 2228 0
+	add	x19, x23, 304
+.LBE1855:
+.LBE1857:
+.LBE1859:
 	.loc 1 1897 0
 	add	x28, x20, 184
+	.loc 1 1900 0
+	str	wzr, [x29, 108]
 .LVL877:
 	.p2align 2
 .L895:
 	.loc 1 1905 0
 	ldr	w0, [x28, 624]
 .LVL878:
-	cbnz	w0, .L1055
+	cbnz	w0, .L1063
 .L896:
 	.loc 1 1911 0
 	bl	ebc_dsp_buf_get
 .LVL879:
-	mov	x24, x0
+	mov	x26, x0
 	.loc 1 1913 0
 	cbz	x0, .L898
 	.loc 1 1913 0 is_stmt 0 discriminator 1
-	ldr	x0, [x0, 8]
-	cbz	x0, .L898
-	.loc 1 1915 0 is_stmt 1
-	add	x0, x21, :lo12:.LANCHOR0
-	ldr	w1, [x0, 16]
-	cbz	w1, .L899
+	ldr	x1, [x0, 8]
+	cbz	x1, .L898
+	.loc 1 1914 0 is_stmt 1
+	ldr	w1, [x0, 40]
+	sub	w2, w1, #18
+	tst	w2, -3
+	bne	.L899
+	.loc 1 1916 0
+	add	x0, x22, :lo12:.LANCHOR0
+	.loc 1 1915 0
+	str	wzr, [x28, 632]
 	.loc 1 1916 0
-	ldr	w1, [x0, 20]
-	add	w2, w1, 1
-	str	w2, [x0, 20]
-	cmp	w1, 5
-	ble	.L900
-	.loc 1 1917 0
 	str	wzr, [x0, 16]
 .L900:
-	.loc 1 1918 0
-	ldr	w2, [x20, 204]
-	ldr	w1, [x24, 64]
-	ldr	x0, [x24, 16]
-	bl	check_black_percent.isra.15
+	.loc 1 1975 0
+	adrp	x21, jiffies
 .LVL880:
-	cbnz	w0, .L1047
-.L899:
-	.loc 1 1926 0
-	ldr	w0, [x24, 40]
-	cmp	w0, 20
-	beq	.L1056
-	.loc 1 1930 0
-	ldr	x1, [x28, 616]
-	cbz	x1, .L904
-	.loc 1 1931 0
-	cmp	w0, 19
-	beq	.L1057
-	.loc 1 1940 0
-	mov	w1, 18
-	tst	w0, w1
-	beq	.L1047
-	.loc 1 1941 0
-	ldr	x0, [x28, 104]
-	adrp	x1, .LC84
-	add	x1, x1, :lo12:.LC84
-	bl	_dev_info
-.LVL881:
-.L903:
-	.loc 1 1977 0
-	adrp	x25, jiffies
-.LVL882:
 	mov	x1, 402653184
 	add	x0, x20, 632
-	ldr	x2, [x25, #:lo12:jiffies]
+	ldr	x2, [x21, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL883:
-	.loc 1 1979 0
+.LVL881:
+	.loc 1 1977 0
 	ldr	w0, [x28, 444]
-	cbz	w0, .L915
+	cbz	w0, .L914
+.L1072:
 	ldr	x0, [x28, 216]
-.L916:
-	.loc 1 1982 0
+.L915:
+	.loc 1 1980 0
 	ldr	w2, [x0, 40]
-	ldr	w3, [x24, 40]
+	ldr	w3, [x26, 40]
 	cmp	w3, w2
-	beq	.L917
-	.loc 1 1983 0
+	beq	.L916
+	.loc 1 1981 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC86
-	add	x1, x1, :lo12:.LC86
+	adrp	x1, .LC85
+	add	x1, x1, :lo12:.LC85
 	bl	_dev_info
-.LVL884:
-	.loc 1 1985 0
+.LVL882:
+	.loc 1 1983 0
 	ldr	w0, [x28, 44]
 	cmp	w0, 1
-	beq	.L1058
-.L1048:
-	ldr	w2, [x24, 40]
-.L917:
-	.loc 1 1992 0
+	beq	.L1064
+.L1056:
+	ldr	w2, [x26, 40]
+.L916:
+	.loc 1 1990 0
 	cmp	w2, 23
-	bls	.L1059
-	.loc 1 2175 0
+	bls	.L1065
+	.loc 1 2176 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC94
-	add	x1, x1, :lo12:.LC94
+	adrp	x1, .LC93
+	add	x1, x1, :lo12:.LC93
 	bl	_dev_err
-.LVL885:
-.L1047:
-	.loc 1 2176 0
-	mov	x0, x24
-	bl	ebc_remove_from_dsp_buf_list
-.LVL886:
+.LVL883:
+.L1054:
 	.loc 1 2177 0
-	mov	x0, x24
+	mov	x0, x26
+.L1055:
+	bl	ebc_remove_from_dsp_buf_list
+.LVL884:
+	.loc 1 2178 0
+	mov	x0, x26
 	bl	ebc_buf_release
-.LVL887:
+.LVL885:
 	.loc 1 1905 0
 	ldr	w0, [x28, 624]
 	cbz	w0, .L896
+.LVL886:
 	.p2align 2
-.L1055:
+.L1063:
 	.loc 1 1906 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	beq	.L1060
+	beq	.L1066
 .L897:
-	.loc 1 2233 0
-	add	x23, x23, :lo12:__stack_chk_guard
+	.loc 1 2234 0
+	add	x24, x24, :lo12:__stack_chk_guard
 	mov	w0, 0
 	ldr	x2, [x29, 232]
-	ldr	x1, [x23]
+	ldr	x1, [x24]
 	eor	x1, x2, x1
-	cbnz	x1, .L1061
+	cbnz	x1, .L1067
 	ldp	x19, x20, [sp, 16]
-.LVL888:
+.LVL887:
 	ldp	x21, x22, [sp, 32]
+.LVL888:
 	ldp	x23, x24, [sp, 48]
-.LVL889:
 	ldp	x25, x26, [sp, 64]
-.LVL890:
+.LVL889:
 	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 240
 	.cfi_remember_state
@@ -10332,269 +10304,344 @@ ebc_thread:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL891:
+.LVL890:
 	.p2align 3
 .L898:
 	.cfi_restore_state
-	.loc 1 2214 0
+	.loc 1 2215 0
 	ldr	w0, [x28, 44]
+.LVL891:
 	cmp	w0, 1
-	beq	.L1062
-	.loc 1 2223 0
+	beq	.L1068
+	.loc 1 2224 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	beq	.L1063
+	beq	.L1069
 .LVL892:
-.L1051:
+.L1058:
 	ldr	w0, [x28, 96]
 .LVL893:
-	.loc 1 2226 0
-	cbz	w0, .L1064
-.L999:
+	.loc 1 2227 0
+	cbz	w0, .L1070
+.L1003:
 .LVL894:
-.L989:
-	.loc 1 2228 0
+.L993:
+	.loc 1 2229 0
 	str	wzr, [x28, 96]
 	b	.L895
 .LVL895:
 	.p2align 3
-.L1064:
-.LBB1856:
-.LBB1854:
-	.loc 1 2227 0 discriminator 1
+.L1070:
+.LBB1860:
+.LBB1858:
+	.loc 1 2228 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
 .LVL896:
-	b	.L1000
+	b	.L1004
 	.p2align 3
-.L1065:
+.L1071:
 .LVL897:
-.LBB1852:
-	.loc 1 2227 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L989
-	.loc 1 2227 0 discriminator 7
+.LBB1856:
+	.loc 1 2228 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L993
+	.loc 1 2228 0 discriminator 7
 	bl	schedule
 .LVL898:
-.L1000:
-	.loc 1 2227 0 discriminator 9
+.L1004:
+	.loc 1 2228 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
 .LVL899:
 	ldr	w1, [x28, 96]
-	cbz	w1, .L1065
-.LBE1852:
-	.loc 1 2227 0 discriminator 4
+	cbz	w1, .L1071
+.LBE1856:
+	.loc 1 2228 0 discriminator 4
 	add	x1, x29, 120
 	mov	x0, x19
 	bl	finish_wait
 .LVL900:
-.LBE1854:
-.LBE1856:
-	.loc 1 2228 0 is_stmt 1 discriminator 4
+.LBE1858:
+.LBE1860:
+	.loc 1 2229 0 is_stmt 1 discriminator 4
 	str	wzr, [x28, 96]
 	b	.L895
 .LVL901:
 	.p2align 3
-.L1059:
-	.loc 1 1992 0
-	adrp	x0, .L925
-	add	x0, x0, :lo12:.L925
+.L899:
+	.loc 1 1918 0
+	add	x21, x22, :lo12:.LANCHOR0
+.LVL902:
+	ldr	w2, [x21, 16]
+	cbz	w2, .L901
+	.loc 1 1919 0
+	ldr	w0, [x21, 20]
+.LVL903:
+	cmp	w0, 5
+	add	w0, w0, 1
+	str	w0, [x21, 20]
+	ble	.L902
+	.loc 1 1920 0
+	str	wzr, [x21, 16]
+.L902:
+	.loc 1 1921 0
+	ldr	w2, [x20, 204]
+	ldr	w1, [x26, 64]
+	ldr	x0, [x26, 16]
+	bl	check_black_percent.isra.15
+.LVL904:
+	cbnz	w0, .L1054
+	.loc 1 1975 0
+	adrp	x21, jiffies
+	mov	x1, 402653184
+	add	x0, x20, 632
+	ldr	x2, [x21, #:lo12:jiffies]
+	add	x1, x2, x1
+	bl	mod_timer
+.LVL905:
+	.loc 1 1977 0
+	ldr	w0, [x28, 444]
+	cbnz	w0, .L1072
+.L914:
+	.loc 1 1978 0
+	mov	x0, x26
+	str	x26, [x28, 216]
+	b	.L915
+	.p2align 3
+.L1065:
+	.loc 1 1990 0
+	adrp	x0, .L924
+	add	x0, x0, :lo12:.L924
 	ldrh	w0, [x0,w2,uxtw #1]
-	adr	x1, .Lrtx925
+	adr	x1, .Lrtx924
 	add	x0, x1, w0, sxth #2
 	br	x0
-.Lrtx925:
+.Lrtx924:
 	.section	.rodata
 	.align	0
 	.align	2
-.L925:
-	.2byte	(.L924 - .Lrtx925) / 4
-	.2byte	(.L926 - .Lrtx925) / 4
-	.2byte	(.L1004 - .Lrtx925) / 4
-	.2byte	(.L1004 - .Lrtx925) / 4
-	.2byte	(.L1004 - .Lrtx925) / 4
-	.2byte	(.L1004 - .Lrtx925) / 4
-	.2byte	(.L1004 - .Lrtx925) / 4
-	.2byte	(.L928 - .Lrtx925) / 4
-	.2byte	(.L928 - .Lrtx925) / 4
-	.2byte	(.L1004 - .Lrtx925) / 4
-	.2byte	(.L1004 - .Lrtx925) / 4
-	.2byte	(.L928 - .Lrtx925) / 4
-	.2byte	(.L1004 - .Lrtx925) / 4
-	.2byte	(.L1004 - .Lrtx925) / 4
-	.2byte	(.L928 - .Lrtx925) / 4
-	.2byte	(.L928 - .Lrtx925) / 4
-	.2byte	(.L1004 - .Lrtx925) / 4
-	.2byte	(.L1004 - .Lrtx925) / 4
-	.2byte	(.L1004 - .Lrtx925) / 4
-	.2byte	(.L1004 - .Lrtx925) / 4
-	.2byte	(.L1004 - .Lrtx925) / 4
-	.2byte	(.L1004 - .Lrtx925) / 4
-	.2byte	(.L924 - .Lrtx925) / 4
-	.2byte	(.L924 - .Lrtx925) / 4
+.L924:
+	.2byte	(.L923 - .Lrtx924) / 4
+	.2byte	(.L925 - .Lrtx924) / 4
+	.2byte	(.L1009 - .Lrtx924) / 4
+	.2byte	(.L1009 - .Lrtx924) / 4
+	.2byte	(.L1009 - .Lrtx924) / 4
+	.2byte	(.L1009 - .Lrtx924) / 4
+	.2byte	(.L1009 - .Lrtx924) / 4
+	.2byte	(.L927 - .Lrtx924) / 4
+	.2byte	(.L927 - .Lrtx924) / 4
+	.2byte	(.L1009 - .Lrtx924) / 4
+	.2byte	(.L1009 - .Lrtx924) / 4
+	.2byte	(.L927 - .Lrtx924) / 4
+	.2byte	(.L1009 - .Lrtx924) / 4
+	.2byte	(.L1009 - .Lrtx924) / 4
+	.2byte	(.L927 - .Lrtx924) / 4
+	.2byte	(.L927 - .Lrtx924) / 4
+	.2byte	(.L1009 - .Lrtx924) / 4
+	.2byte	(.L1009 - .Lrtx924) / 4
+	.2byte	(.L1009 - .Lrtx924) / 4
+	.2byte	(.L1009 - .Lrtx924) / 4
+	.2byte	(.L1009 - .Lrtx924) / 4
+	.2byte	(.L1009 - .Lrtx924) / 4
+	.2byte	(.L923 - .Lrtx924) / 4
+	.2byte	(.L923 - .Lrtx924) / 4
 	.text
-.L1004:
-	.loc 1 2101 0
+.L1009:
+	.loc 1 2102 0
 	mov	w4, 1
-.LVL902:
-.L927:
-	.loc 1 2108 0
-	ldr	x26, [x28, 216]
-.LVL903:
-	.loc 1 2110 0
-	ldr	w0, [x26, 40]
+.LVL906:
+.L926:
+	.loc 1 2109 0
+	ldr	x25, [x28, 216]
+.LVL907:
+	.loc 1 2111 0
+	ldr	w0, [x25, 40]
 	sub	w1, w0, #22
-	.loc 1 2112 0
+	.loc 1 2113 0
 	cmp	w1, 1
 	ccmp	w0, 1, 0, hi
-	bhi	.L970
-	.loc 1 2115 0
+	bhi	.L974
+	.loc 1 2116 0
 	add	x0, x29, 160
 	str	x0, [x28, 216]
-	.loc 1 2116 0
+	.loc 1 2117 0
 	ldr	x0, [x28, 152]
 	str	x0, [x29, 176]
-	.loc 1 2117 0
+	.loc 1 2118 0
 	mov	w0, 16
 	str	w0, [x29, 224]
-.L970:
-	.loc 1 2119 0
-	str	wzr, [x28, 92]
+.L974:
 	.loc 1 2120 0
-	str	x24, [x28, 224]
-	.loc 1 2123 0
-	ldr	w0, [x24, 40]
+	str	wzr, [x28, 92]
+	.loc 1 2121 0
+	str	x26, [x28, 224]
+	.loc 1 2124 0
+	ldr	w0, [x26, 40]
 	sub	w0, w0, #2
-	.loc 1 2122 0
+	.loc 1 2123 0
 	cmp	w0, 14
-	bhi	.L971
-	.loc 1 2124 0
+	bhi	.L975
+	.loc 1 2125 0
 	ldr	x1, [x28, 216]
-	ldr	w0, [x24, 64]
-.LBB1857:
-.LBB1858:
+	ldr	w0, [x26, 64]
+.LBB1861:
+.LBB1862:
 	.loc 1 1858 0
 	ldr	w2, [x1, 64]
 	cmp	w0, w2
-	beq	.L1066
-.L971:
-.LBE1858:
-.LBE1857:
-	.loc 1 2133 0
-	cbz	w4, .L1067
+	beq	.L1073
+.L975:
+.LBE1862:
+.LBE1861:
 	.loc 1 2134 0
+	cbnz	w4, .L1013
+	.loc 1 2138 0
+	ldr	w0, [x28, 64]
+	cmp	w0, 0
+	ble	.L981
+	.loc 1 2139 0
+	ldr	w1, [x29, 108]
+.LVL908:
+	add	w1, w1, 1
+	str	w1, [x29, 108]
+	.loc 1 2140 0
+	cmp	w0, w1
+	bgt	.L981
+	.loc 1 2141 0
+	mov	w0, 2
+	.loc 1 2142 0
 	str	wzr, [x29, 108]
-.LVL904:
-.L977:
-	.loc 1 2145 0
+	.loc 1 2141 0
+	str	w0, [x26, 40]
+.L981:
+	.loc 1 2146 0
 	ldr	w0, [x28, 200]
-	cbz	w0, .L1068
-.L978:
-	.loc 1 2148 0
-	ldr	x0, [x28, 224]
-	ldr	w1, [x0, 64]
-.LVL905:
+	cbz	w0, .L1074
+.L982:
+	.loc 1 2149 0
+	ldr	x1, [x28, 224]
+.LVL909:
 	mov	x0, x20
+	ldr	w1, [x1, 64]
 	bl	ebc_lut_update
-.LVL906:
-	cbz	w0, .L979
-.L1083:
-	.loc 1 2149 0
+.LVL910:
+	cbz	w0, .L983
+	.loc 1 2150 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC91
-	add	x1, x1, :lo12:.LC91
+	adrp	x1, .LC90
+	add	x1, x1, :lo12:.LC90
 	bl	_dev_err
-.LVL907:
-	.loc 1 2151 0
-	str	x26, [x28, 216]
-.LVL908:
-.L940:
-	.loc 1 2186 0
+.LVL911:
+	.loc 1 2152 0
+	str	x25, [x28, 216]
+.LVL912:
+.L939:
+	.loc 1 2187 0
 	ldr	x0, [x28, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
-	beq	.L1069
-.L984:
-	.loc 1 2192 0
+	beq	.L1075
+.L988:
+	.loc 1 2193 0
 	cmp	w0, 18
-	beq	.L1070
-.L985:
-	.loc 1 2203 0
-	mov	x0, x24
+	beq	.L1076
+.L989:
+	.loc 1 2204 0
+	mov	x0, x26
 	bl	ebc_remove_from_dsp_buf_list
-.LVL909:
-	.loc 1 2205 0
+.LVL913:
+	.loc 1 2206 0
 	ldr	w0, [x28, 444]
-	cbnz	w0, .L1071
-.L987:
-	.loc 1 2208 0
+	cbnz	w0, .L1077
+	.loc 1 2209 0
 	mov	w0, 1
 	str	w0, [x28, 444]
-.L988:
-	.loc 1 2210 0
+.L992:
+	.loc 1 2211 0
 	ldr	x0, [x28, 224]
 	str	x0, [x28, 216]
-	.loc 1 2211 0
+	.loc 1 2212 0
 	b	.L895
-.LVL910:
-.L926:
-	.loc 1 1994 0
+.LVL914:
+.L925:
+	.loc 1 1992 0
 	ldr	w0, [x28, 628]
-	cbz	w0, .L929
-	.loc 1 2007 0
+	cbz	w0, .L928
+	.loc 1 2005 0
 	ldr	x2, [x28, 216]
-	.loc 1 1995 0
+	.loc 1 1993 0
 	mov	w0, 1
-	.loc 1 2005 0
-	str	x24, [x28, 224]
-	.loc 1 1995 0
+	.loc 1 2003 0
+	str	x26, [x28, 224]
+	.loc 1 1993 0
 	str	w0, [x28, 632]
-	.loc 1 2007 0
+	.loc 1 2005 0
 	ldr	w0, [x2, 40]
-	.loc 1 2010 0
+	.loc 1 2008 0
 	cmp	w0, 1
-	.loc 1 2009 0
+	.loc 1 2007 0
 	sub	w1, w0, #22
-	.loc 1 2010 0
+	.loc 1 2008 0
 	ccmp	w1, 1, 0, hi
-	bls	.L1072
-	.loc 1 2011 0
+	bls	.L1078
+	.loc 1 2009 0
 	ldr	w0, [x2, 64]
 	cmp	w0, 32
-	beq	.L1073
-	.loc 1 2014 0
-	ldr	x1, [x2, 16]
-	ldr	x0, [x28, 160]
-	ldrsw	x2, [x28, 20]
-	bl	memcpy
-.LVL911:
-.L1049:
+	bne	.L931
+	.loc 1 2010 0
+	ldr	x5, [x2, 16]
 	ldr	w2, [x28, 20]
 	ldr	x1, [x28, 160]
+.LBB1864:
+.LBB1865:
+	.loc 1 1883 0
+	cmp	w2, 0
+	ble	.L932
+	mov	x0, 0
+.LVL915:
+	.p2align 2
 .L933:
-	.loc 1 2015 0
+	.loc 1 1885 0
+	ldrb	w3, [x5], 2
+	.loc 1 1887 0
+	ldrb	w4, [x5, -1]
+	and	w4, w4, -16
+	orr	w3, w4, w3, lsr 4
+	.loc 1 1888 0
+	strb	w3, [x1, x0]
+	add	x0, x0, 1
+	.loc 1 1883 0
+	cmp	w2, w0
+	bgt	.L933
+.L1057:
+	ldr	w2, [x28, 20]
+	ldr	x1, [x28, 160]
+.L932:
+.LBE1865:
+.LBE1864:
+	.loc 1 2013 0
 	ldr	x0, [x28, 144]
 	sxtw	x2, w2
 	bl	memcpy
-.LVL912:
-	.loc 1 2016 0
+.LVL916:
+	.loc 1 2014 0
 	ldrsw	x2, [x28, 20]
 	ldp	x0, x1, [x28, 152]
 	bl	memcpy
-.LVL913:
+.LVL917:
 	ldr	x0, [x28, 224]
-.L935:
-.LBB1860:
-.LBB1861:
+.L934:
+.LBB1866:
+.LBB1867:
 	.loc 1 446 0
 	ldp	w3, w16, [x0, 48]
 	.loc 1 505 0
 	mov	w15, 234881024
 	.loc 1 447 0
-	ldp	w2, w25, [x0, 56]
+	ldp	w2, w21, [x0, 56]
 	.loc 1 444 0
 	cmp	w3, 0
 	.loc 1 449 0
@@ -10616,132 +10663,132 @@ ebc_thread:
 	asr	w10, w10, 3
 	.loc 1 449 0
 	asr	w18, w18, 3
-.LVL914:
+.LVL918:
 	.loc 1 445 0
 	add	w10, w10, 1
-.LVL915:
+.LVL919:
 	ldr	w1, [x20, 252]
 	.loc 1 452 0
 	cmp	w10, w18
-.LBE1861:
-.LBE1860:
-	.loc 1 2023 0
+.LBE1867:
+.LBE1866:
+	.loc 1 2021 0
 	ldr	x13, [x0, 16]
-.LBB1866:
-.LBB1862:
+.LBB1871:
+.LBB1868:
 	.loc 1 452 0
 	sub	w0, w18, #1
 	csel	w10, w0, w10, ge
-.LVL916:
+.LVL920:
 	.loc 1 454 0
-	cmp	w1, w25
+	cmp	w1, w21
 	sub	w1, w1, #1
 	.loc 1 511 0
 	mov	w14, -536870912
 	.loc 1 454 0
-	csel	w25, w1, w25, le
+	csel	w21, w1, w21, le
 	.loc 1 444 0
 	asr	w17, w17, 3
-.LVL917:
+.LVL921:
 	mul	w7, w16, w18
 	.loc 1 456 0
-	cmp	w16, w25
-.LBE1862:
-.LBE1866:
-	.loc 1 2023 0
-	ldr	x9, [x28, 144]
-	.loc 1 2024 0
+	cmp	w16, w21
+.LBE1868:
+.LBE1871:
+	.loc 1 2021 0
+	ldr	x8, [x28, 144]
+	.loc 1 2022 0
 	ldp	x12, x11, [x28, 160]
-.LBB1867:
-.LBB1863:
+.LBB1872:
+.LBB1869:
 	.loc 1 456 0
-	bgt	.L943
-.LVL918:
+	bgt	.L942
+.LVL922:
 	.p2align 2
-.L1025:
+.L1031:
 	.loc 1 461 0
 	mov	w5, w17
 	cmp	w17, w10
-	ble	.L1026
-	b	.L960
-.LVL919:
+	ble	.L1032
+	b	.L959
+.LVL923:
 	.p2align 3
-.L944:
+.L943:
 	.loc 1 474 0
 	tst	x2, 65280
-	bne	.L945
+	bne	.L944
 	.loc 1 475 0
 	and	w27, w0, 240
 	cmp	w27, 224
-	beq	.L1074
+	beq	.L1079
 	.loc 1 478 0
 	orr	w3, w3, 240
-.L945:
+.L944:
 	.loc 1 480 0
 	tst	x2, 16711680
-	bne	.L947
+	bne	.L946
 	.loc 1 481 0
 	and	w27, w0, 3840
 	cmp	w27, 3584
-	beq	.L1075
+	beq	.L1080
 	.loc 1 484 0
 	orr	w3, w3, 3840
-.L947:
+.L946:
 	.loc 1 486 0
 	tst	x2, 4278190080
-	bne	.L949
+	bne	.L948
 	.loc 1 487 0
 	and	w27, w0, 61440
 	cmp	w27, 57344
-	beq	.L1076
+	beq	.L1081
 	.loc 1 490 0
 	orr	w3, w3, 61440
-.L949:
+.L948:
 	.loc 1 492 0
 	tst	x2, 1095216660480
-	bne	.L951
+	bne	.L950
 	.loc 1 493 0
 	and	w27, w0, 983040
 	cmp	w27, 917504
-	beq	.L1077
+	beq	.L1082
 	.loc 1 496 0
 	orr	w3, w3, 983040
-.L951:
+.L950:
 	.loc 1 498 0
 	tst	x2, 280375465082880
-	bne	.L953
+	bne	.L952
 	.loc 1 499 0
 	and	w27, w0, 15728640
 	cmp	w27, 14680064
-	beq	.L1078
+	beq	.L1083
 	.loc 1 502 0
 	orr	w3, w3, 15728640
-.L953:
+.L952:
 	.loc 1 504 0
 	tst	x2, 71776119061217280
-	bne	.L955
+	bne	.L954
 	.loc 1 505 0
 	and	w27, w0, 251658240
 	cmp	w27, w15
-	beq	.L1079
+	beq	.L1084
 	.loc 1 508 0
 	orr	w3, w3, 251658240
-.L955:
+.L954:
 	.loc 1 510 0
 	tst	x2, -72057594037927936
-	bne	.L957
+	bne	.L956
 	.loc 1 511 0
 	and	w2, w0, -268435456
-.LVL920:
+.LVL924:
 	cmp	w2, w14
-	beq	.L1080
+	beq	.L1085
 	.loc 1 514 0
 	orr	w3, w3, -268435456
-.LVL921:
-.L957:
+.LVL925:
+.L956:
 	.loc 1 517 0
-	and	w0, w0, w26
-.LVL922:
+	and	w0, w0, w25
+.LVL926:
 	.loc 1 461 0
 	add	w5, w5, 1
 	eor	w0, w0, w4
@@ -10750,570 +10797,608 @@ ebc_thread:
 	.loc 1 517 0
 	eor	w0, w4, w0
 	.loc 1 518 0
-	str	w0, [x9, x1]
+	str	w0, [x8, x1]
 	.loc 1 461 0
-	bgt	.L960
-.LVL923:
-.L1026:
+	bgt	.L959
+.LVL927:
+.L1032:
 	.loc 1 462 0
 	sxtw	x1, w5
-.LVL924:
+.LVL928:
 	.loc 1 466 0
 	mov	w3, 0
 	.loc 1 465 0
 	lsl	x0, x1, 3
 	.loc 1 462 0
 	lsl	x1, x1, 2
-.LVL925:
+.LVL929:
 	.loc 1 465 0
 	add	x0, x0, x7, sxtw 3
 	add	x1, x1, x7, sxtw 2
 	ldr	x2, [x11, x0]
 	.loc 1 462 0
-	ldr	w4, [x9, x1]
+	ldr	w4, [x8, x1]
 	.loc 1 463 0
 	ldr	w0, [x13, x1]
 	.loc 1 468 0
 	and	x27, x2, 255
 	.loc 1 464 0
-	ldr	w26, [x12, x1]
-.LVL926:
+	ldr	w25, [x12, x1]
+.LVL930:
 	.loc 1 468 0
-	cbnz	x27, .L944
-.LVL927:
+	cbnz	x27, .L943
+.LVL931:
 	.loc 1 469 0
 	and	w27, w0, 15
 	.loc 1 472 0
 	mov	w3, 15
 	.loc 1 469 0
 	cmp	w27, 14
-	bne	.L944
+	bne	.L943
 	.loc 1 470 0
 	orr	w4, w4, w3
-.LVL928:
+.LVL932:
 	.loc 1 466 0
 	mov	w3, 0
-.LVL929:
-	b	.L944
-.LVL930:
-.L924:
-.LBE1863:
-.LBE1867:
-	.loc 1 2046 0
-	add	x0, x22, 680
+.LVL933:
+	b	.L943
+.LVL934:
+.L923:
+.LBE1869:
+.LBE1872:
+	.loc 1 2044 0
+	add	x0, x23, 680
 	bl	down_write
-.LVL931:
-	.loc 1 2049 0
-	ldr	x1, [x28, 216]
+.LVL935:
 	.loc 1 2047 0
-	str	x24, [x28, 224]
-	.loc 1 2050 0
+	ldr	x1, [x28, 216]
+	.loc 1 2045 0
+	str	x26, [x28, 224]
+	.loc 1 2048 0
 	ldr	w0, [x1, 40]
 	sub	w2, w0, #22
-	.loc 1 2052 0
+	.loc 1 2050 0
 	cmp	w2, 1
 	ccmp	w0, 1, 0, hi
-	bls	.L962
-	.loc 1 2053 0
+	bls	.L961
+	.loc 1 2051 0
 	ldr	w0, [x1, 64]
 	cmp	w0, 32
-	bne	.L963
-	.loc 1 2054 0
-	ldr	w2, [x28, 20]
-	ldr	x5, [x1, 16]
-.LBB1868:
-.LBB1869:
-	.loc 1 1883 0
-	cmp	w2, 0
-.LBE1869:
-.LBE1868:
+	beq	.L1086
 	.loc 1 2054 0
-	ldr	x1, [x28, 152]
-.LBB1871:
-.LBB1870:
+	ldrsw	x2, [x28, 20]
+	ldr	x1, [x1, 16]
+	ldr	x0, [x28, 152]
+	bl	memcpy
+.LVL936:
+.L965:
+	.loc 1 2055 0
+	ldr	x0, [x28, 224]
+	ldr	w1, [x0, 64]
+	cmp	w1, 32
+	bne	.L966
+	.loc 1 2056 0
+	ldr	w4, [x28, 20]
+.LVL937:
+.LBB1873:
+.LBB1874:
 	.loc 1 1883 0
-	ble	.L964
+	ldr	x3, [x0, 16]
+.LVL938:
 	mov	x0, 0
-.LVL932:
+	cmp	w4, 0
+.LBE1874:
+.LBE1873:
+	.loc 1 2056 0
+	ldr	x5, [x28, 144]
+.LBB1876:
+.LBB1875:
+	.loc 1 1883 0
+	ble	.L968
 	.p2align 2
-.L965:
+.L1030:
 	.loc 1 1885 0
-	ldrb	w3, [x5], 2
+	ldrb	w1, [x3], 2
 	.loc 1 1887 0
-	ldrb	w4, [x5, -1]
-	and	w4, w4, -16
-	orr	w3, w4, w3, lsr 4
+	ldrb	w2, [x3, -1]
+	and	w2, w2, -16
+	orr	w1, w2, w1, lsr 4
 	.loc 1 1888 0
-	strb	w3, [x1, x0]
+	strb	w1, [x5, x0]
 	add	x0, x0, 1
 	.loc 1 1883 0
-	cmp	w2, w0
-	bgt	.L965
-.L1050:
-	ldr	w2, [x28, 20]
-	ldr	x1, [x28, 152]
-.L964:
-.LBE1870:
-.LBE1871:
-	.loc 1 2057 0
-	ldr	x0, [x28, 144]
-	sxtw	x2, w2
-	bl	memcpy
-.LVL933:
-	b	.L966
-.L928:
-	.loc 1 1992 0
+	cmp	w4, w0
+	bgt	.L1030
+	b	.L968
+.LVL939:
+.L927:
+.LBE1875:
+.LBE1876:
+	.loc 1 1990 0
 	mov	w4, 0
-.LVL934:
-	b	.L927
-.LVL935:
-	.p2align 3
-.L915:
-	.loc 1 1980 0
-	mov	x0, x24
-	str	x24, [x28, 216]
-	b	.L916
-.LVL936:
-	.p2align 3
-.L904:
-	.loc 1 1950 0
-	cmp	w0, 18
-	ccmp	w0, 21, 4, ne
-	bne	.L908
-	.loc 1 1951 0
-	str	wzr, [x28, 632]
-	b	.L903
+.LVL940:
+	b	.L926
+.LVL941:
 	.p2align 3
-.L1056:
+.L901:
 	.loc 1 1928 0
-	str	wzr, [x28, 628]
-	.loc 1 1927 0
-	str	wzr, [x28, 632]
-	b	.L903
+	ldr	x2, [x28, 616]
+	cbz	x2, .L905
+	.loc 1 1929 0
+	cmp	w1, 19
+	bne	.L1055
+	.loc 1 1930 0
+	str	wzr, [x28, 616]
+	.loc 1 1931 0
+	mov	x0, 3
+.LVL942:
+	bl	ebc_notify
+.LVL943:
+	.loc 1 1932 0
+	ldr	x0, [x28, 104]
+	adrp	x1, .LC83
+	add	x1, x1, :lo12:.LC83
+	bl	_dev_info
+.LVL944:
+	.loc 1 1935 0
+	ldr	w2, [x20, 204]
+	.loc 1 1933 0
+	mov	w3, 1
+	.loc 1 1935 0
+	ldr	w1, [x26, 64]
+	ldr	x0, [x26, 16]
+	.loc 1 1934 0
+	stp	w3, wzr, [x21, 16]
+	.loc 1 1935 0
+	bl	check_black_percent.isra.15
+.LVL945:
+	cbnz	w0, .L895
+	b	.L900
+.LVL946:
 	.p2align 3
-.L1062:
-.LBB1872:
-	.loc 1 2215 0 discriminator 1
+.L1068:
+.LBB1877:
+	.loc 1 2216 0 discriminator 1
 	ldr	w0, [x28, 96]
-	cbnz	w0, .L989
-.LBB1873:
-	.loc 1 2215 0 is_stmt 0 discriminator 3
+	cbnz	w0, .L993
+.LBB1878:
+	.loc 1 2216 0 is_stmt 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL937:
-	b	.L993
+.LVL947:
+	b	.L997
 	.p2align 3
-.L1081:
-.LBB1874:
-	.loc 1 2215 0 discriminator 7
+.L1087:
+.LBB1879:
+	.loc 1 2216 0 discriminator 7
 	ldr	w1, [x28, 96]
-	cbnz	w1, .L990
-.LVL938:
-	.loc 1 2215 0 discriminator 9
-	cbnz	x0, .L1051
-	.loc 1 2215 0 discriminator 11
+	cbnz	w1, .L994
+.LVL948:
+	.loc 1 2216 0 discriminator 9
+	cbnz	x0, .L1058
+	.loc 1 2216 0 discriminator 11
 	bl	schedule
-.LVL939:
-.L993:
-	.loc 1 2215 0 discriminator 13
+.LVL949:
+.L997:
+	.loc 1 2216 0 discriminator 13
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL940:
+.LVL950:
 	ldr	w1, [x28, 44]
-	cbnz	w1, .L1081
-.L990:
-.LBE1874:
-	.loc 1 2215 0 discriminator 8
+	cbnz	w1, .L1087
+.L994:
+.LBE1879:
+	.loc 1 2216 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL941:
+.LVL951:
 	ldr	w0, [x28, 44]
-.LBE1873:
-.LBE1872:
-	.loc 1 2218 0 is_stmt 1 discriminator 8
-	cbnz	w0, .L1051
-	.loc 1 2223 0
+.LBE1878:
+.LBE1877:
+	.loc 1 2219 0 is_stmt 1 discriminator 8
+	cbnz	w0, .L1058
+	.loc 1 2224 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	bne	.L1051
+	bne	.L1058
 	.p2align 2
-.L1063:
-.LBB1875:
-.LBB1876:
+.L1069:
+.LBB1880:
+.LBB1881:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.13
-.LVL942:
-	b	.L1051
+.LVL952:
+	b	.L1058
 	.p2align 3
-.L908:
-.LBE1876:
-.LBE1875:
-	.loc 1 1953 0
-	ldr	w1, [x28, 632]
-	cmp	w1, 0
-	ccmp	w0, 1, 4, ne
-	beq	.L903
-	.loc 1 1954 0
-	add	x0, x22, 680
-	bl	down_write
-.LVL943:
-	.loc 1 1955 0
-	ldr	w0, [x24, 64]
-	cmp	w0, 32
-	bne	.L909
-	.loc 1 1956 0
-	ldr	w4, [x28, 20]
-.LBB1877:
-.LBB1878:
-	.loc 1 1883 0
-	mov	x0, 0
-	ldr	x3, [x24, 16]
-.LVL944:
-	cmp	w4, 0
-.LBE1878:
-.LBE1877:
-	.loc 1 1956 0
-	ldr	x5, [x28, 160]
-.LBB1880:
-.LBB1879:
-	.loc 1 1883 0
-	ble	.L911
-	.p2align 2
-.L1027:
-	.loc 1 1885 0
-	ldrb	w1, [x3], 2
-	.loc 1 1887 0
-	ldrb	w2, [x3, -1]
-	and	w2, w2, -16
-	orr	w1, w2, w1, lsr 4
-	.loc 1 1888 0
-	strb	w1, [x5, x0]
-	add	x0, x0, 1
-	.loc 1 1883 0
-	cmp	w4, w0
-	bgt	.L1027
-.L911:
-.LBE1879:
+.L1077:
+.LBE1881:
 .LBE1880:
-	.loc 1 1959 0
-	mov	x0, x24
-	bl	ebc_remove_from_dsp_buf_list
-.LVL945:
-	.loc 1 1960 0
-	mov	x0, x24
+	.loc 1 2207 0
+	ldr	x0, [x28, 216]
 	bl	ebc_buf_release
-.LVL946:
-	.loc 1 1962 0
-	ldr	x1, [x28, 224]
-	mov	x4, x28
-	ldr	x0, [x28, 144]
-	ldp	x2, x3, [x28, 160]
-	ldr	w5, [x1, 40]
-	ldr	x1, [x1, 16]
-	bl	refresh_new_image2
-.LVL947:
-	.loc 1 1965 0
-	add	x0, x22, 680
-	bl	up_write
-.LVL948:
-	.loc 1 1966 0
-	ldr	w0, [x28, 44]
-	cbnz	w0, .L895
-	.loc 1 1967 0
-	mov	w0, 1
-	str	w0, [x28, 44]
-	.loc 1 1969 0
-	ldr	w0, [x28, 200]
-	.loc 1 1968 0
-	str	wzr, [x28, 92]
-	.loc 1 1969 0
-	cbz	w0, .L1082
-.L914:
-	.loc 1 1971 0
-	ldr	x0, [x28, 104]
-	adrp	x1, .LC85
-	ldrb	w2, [x28, 48]
-	add	x1, x1, :lo12:.LC85
-	bl	_dev_info
-.LVL949:
-	.loc 1 1972 0
-	mov	x0, x20
-	bl	ebc_frame_start
-.LVL950:
-	b	.L895
-.LVL951:
-	.p2align 3
-.L1067:
-	.loc 1 2137 0
-	ldr	w0, [x28, 64]
-	cmp	w0, 0
-	ble	.L977
-	.loc 1 2138 0
-	ldr	w1, [x29, 108]
-.LVL952:
-	add	w1, w1, 1
-	str	w1, [x29, 108]
-	.loc 1 2139 0
-	cmp	w0, w1
-	bgt	.L977
-	.loc 1 2140 0
-	mov	w0, 2
-	str	w0, [x24, 40]
-	.loc 1 2141 0
-	str	wzr, [x29, 108]
-	.loc 1 2145 0
-	ldr	w0, [x28, 200]
-	cbnz	w0, .L978
-.L1068:
-	.loc 1 2146 0
-	mov	x0, x20
-	bl	ebc_power_set.constprop.17
 .LVL953:
-	.loc 1 2148 0
-	ldr	x0, [x28, 224]
-	ldr	w1, [x0, 64]
-	mov	x0, x20
-	bl	ebc_lut_update
+	b	.L992
 .LVL954:
-	cbnz	w0, .L1083
-.L979:
-	.loc 1 2160 0
+	.p2align 3
+.L983:
+	.loc 1 2161 0
 	ldr	x0, [x28, 224]
-	adrp	x1, .LC93
-	.loc 1 2157 0
+	adrp	x1, .LC92
+	.loc 1 2158 0
 	ldr	w3, [x28, 112]
-	.loc 1 2160 0
-	add	x1, x1, :lo12:.LC93
-	.loc 1 2157 0
+	.loc 1 2161 0
+	add	x1, x1, :lo12:.LC92
+	.loc 1 2158 0
 	strb	w3, [x28, 48]
-	.loc 1 2160 0
+	.loc 1 2161 0
 	and	w3, w3, 255
 	ldr	w2, [x0, 40]
 	ldr	x0, [x28, 104]
 	bl	_dev_info
 .LVL955:
-	.loc 1 2161 0
+	.loc 1 2162 0
 	mov	w0, 1
 	str	w0, [x28, 44]
-	.loc 1 2162 0
+	.loc 1 2163 0
 	mov	x0, x20
 	bl	ebc_frame_start
 .LVL956:
-	.loc 1 2164 0
-	ldr	x1, [x25, #:lo12:jiffies]
+	.loc 1 2165 0
+	ldr	x1, [x21, #:lo12:jiffies]
 	add	x0, x20, 688
 	str	x0, [x29, 96]
 	add	x1, x1, 900
 	bl	mod_timer
 .LVL957:
-.LBB1881:
-	.loc 1 2165 0
+.LBB1882:
+	.loc 1 2166 0
 	ldr	w0, [x28, 92]
-	cbz	w0, .L1084
-.L982:
+	cbz	w0, .L1088
+.L986:
 .LVL958:
-.L980:
-.LBE1881:
-	.loc 1 2167 0 discriminator 11
-	ldr	x2, [x25, #:lo12:jiffies]
+.L984:
+.LBE1882:
+	.loc 1 2168 0 discriminator 11
+	ldr	x2, [x21, #:lo12:jiffies]
 	mov	x1, 402653184
 	ldr	x0, [x29, 96]
 .LVL959:
 	add	x1, x2, x1
 	bl	mod_timer
 .LVL960:
-	.loc 1 2168 0 discriminator 11
+	.loc 1 2169 0 discriminator 11
 	str	wzr, [x28, 92]
-	.loc 1 2186 0 discriminator 11
+	.loc 1 2187 0 discriminator 11
 	ldr	x0, [x28, 224]
-	.loc 1 2170 0 discriminator 11
-	str	x26, [x28, 216]
-	.loc 1 2186 0 discriminator 11
+	.loc 1 2171 0 discriminator 11
+	str	x25, [x28, 216]
+	.loc 1 2187 0 discriminator 11
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
-	bne	.L984
+	bne	.L988
 .LVL961:
-.L1069:
-	.loc 1 2189 0
+.L1075:
+	.loc 1 2190 0
 	ldr	x0, [x28, 104]
-	.loc 1 2187 0
-	mov	w25, 1
-.LVL962:
 	.loc 1 2188 0
-	str	wzr, [x28, 204]
-	.loc 1 2189 0
-	adrp	x1, .LC95
-	.loc 1 2187 0
-	str	w25, [x28, 624]
+	mov	w21, 1
+.LVL962:
 	.loc 1 2189 0
-	add	x1, x1, :lo12:.LC95
+	str	wzr, [x28, 204]
+	.loc 1 2190 0
+	adrp	x1, .LC94
+	.loc 1 2188 0
+	str	w21, [x28, 624]
+	.loc 1 2190 0
+	add	x1, x1, :lo12:.LC94
 	bl	_dev_info
 .LVL963:
-	.loc 1 2190 0
-	mov	w2, w25
-	mov	w1, w25
-	add	x0, x22, 328
+	.loc 1 2191 0
+	mov	w2, w21
+	mov	w1, w21
+	add	x0, x23, 328
 	bl	__wake_up_sync
 .LVL964:
-	.loc 1 2203 0
-	mov	x0, x24
-	bl	ebc_remove_from_dsp_buf_list
+	b	.L989
 .LVL965:
-	.loc 1 2205 0
-	ldr	w0, [x28, 444]
-	cbz	w0, .L987
+	.p2align 3
+.L1013:
+	.loc 1 2146 0
+	ldr	w0, [x28, 200]
+	.loc 1 2135 0
+	str	wzr, [x29, 108]
+	.loc 1 2146 0
+	cbnz	w0, .L982
 .LVL966:
-	.p2align 2
-.L1071:
-	.loc 1 2206 0
-	ldr	x0, [x28, 216]
-	bl	ebc_buf_release
+.L1074:
+	.loc 1 2147 0
+	mov	x0, x20
+	bl	ebc_power_set.constprop.17
 .LVL967:
-	b	.L988
+	b	.L982
 .LVL968:
-.L1058:
-	.loc 1 1986 0
-	ldr	x0, [x28, 104]
-	adrp	x1, .LC87
-	add	x1, x1, :lo12:.LC87
-	bl	_dev_info
+	.p2align 3
+.L905:
+	.loc 1 1948 0
+	cmp	w1, 21
+	beq	.L1089
+	.loc 1 1951 0
+	ldr	w0, [x28, 632]
 .LVL969:
-.LBB1885:
-	.loc 1 1987 0
-	ldr	w0, [x28, 92]
-	cbz	w0, .L1085
-.L921:
+	cmp	w0, 0
+	ccmp	w1, 1, 4, ne
+	beq	.L900
+	.loc 1 1952 0
+	add	x0, x23, 680
+	bl	down_write
 .LVL970:
-.L919:
-.LBE1885:
-	.loc 1 1988 0 discriminator 11
-	ldr	x0, [x28, 104]
+	.loc 1 1953 0
+	ldr	w0, [x26, 64]
+	cmp	w0, 32
+	beq	.L1090
+	.loc 1 1956 0
+	ldrsw	x2, [x28, 20]
+	ldr	x1, [x26, 16]
+	ldr	x0, [x28, 160]
+	bl	memcpy
 .LVL971:
-	adrp	x1, .LC88
-	add	x1, x1, :lo12:.LC88
-	bl	_dev_info
+.L910:
+	.loc 1 1957 0
+	mov	x0, x26
+	bl	ebc_remove_from_dsp_buf_list
 .LVL972:
-	b	.L1048
-.L962:
-	.loc 1 2060 0
-	ldr	w0, [x24, 64]
+	.loc 1 1958 0
+	mov	x0, x26
+	bl	ebc_buf_release
+.LVL973:
+	.loc 1 1960 0
+	ldr	x1, [x28, 224]
+	mov	x4, x28
+	ldr	x0, [x28, 144]
+	ldp	x2, x3, [x28, 160]
+	ldr	w5, [x1, 40]
+	ldr	x1, [x1, 16]
+	bl	refresh_new_image2
+.LVL974:
+	.loc 1 1963 0
+	add	x0, x23, 680
+	bl	up_write
+.LVL975:
+	.loc 1 1964 0
+	ldr	w0, [x28, 44]
+	cbnz	w0, .L895
+	.loc 1 1965 0
+	mov	w0, 1
+	str	w0, [x28, 44]
+	.loc 1 1967 0
+	ldr	w0, [x28, 200]
+	.loc 1 1966 0
+	str	wzr, [x28, 92]
+	.loc 1 1967 0
+	cbz	w0, .L1091
+.L913:
+	.loc 1 1969 0
+	ldr	x0, [x28, 104]
+	adrp	x1, .LC84
+	ldrb	w2, [x28, 48]
+	add	x1, x1, :lo12:.LC84
+	bl	_dev_info
+.LVL976:
+	.loc 1 1970 0
+	mov	x0, x20
+	bl	ebc_frame_start
+.LVL977:
+	b	.L895
+	.p2align 3
+.L961:
 	.loc 1 2061 0
+	ldr	w0, [x26, 64]
+	.loc 1 2062 0
 	mov	x3, x28
-	ldr	x1, [x24, 16]
-	.loc 1 2060 0
-	cmp	w0, 32
+	ldr	x1, [x26, 16]
 	.loc 1 2061 0
+	cmp	w0, 32
+	.loc 1 2062 0
 	ldr	x2, [x28, 168]
 	ldr	x0, [x28, 144]
-	.loc 1 2060 0
-	beq	.L1086
-	.loc 1 2064 0
+	.loc 1 2061 0
+	beq	.L1092
+	.loc 1 2065 0
 	bl	refresh_new_image_auto
-.LVL973:
-.L966:
-	.loc 1 2067 0
-	add	x0, x22, 680
+.LVL978:
+.L968:
+	.loc 1 2068 0
+	add	x0, x23, 680
 	bl	up_write
-.LVL974:
-	.loc 1 2069 0
+.LVL979:
+	.loc 1 2070 0
 	ldr	w0, [x28, 44]
-	cbnz	w0, .L940
-	.loc 1 2072 0
+	cbnz	w0, .L939
+	.loc 1 2073 0
 	ldr	w0, [x28, 200]
-	.loc 1 2070 0
-	mov	w1, 1
 	.loc 1 2071 0
+	mov	w1, 1
+	.loc 1 2072 0
 	str	wzr, [x28, 92]
-	.loc 1 2070 0
+	.loc 1 2071 0
 	str	w1, [x28, 44]
-	.loc 1 2072 0
-	cbz	w0, .L1087
-.L968:
-	.loc 1 2074 0
+	.loc 1 2073 0
+	cbz	w0, .L1093
+.L972:
+	.loc 1 2075 0
 	mov	w1, 16
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL975:
+.LVL980:
 	cmn	w0, #1
-	beq	.L1088
-	.loc 1 2079 0
+	beq	.L1094
+	.loc 1 2080 0
 	ldr	w3, [x28, 112]
-	.loc 1 2082 0
-	adrp	x1, .LC92
+	.loc 1 2083 0
+	adrp	x1, .LC91
 	ldr	x0, [x28, 104]
-	add	x1, x1, :lo12:.LC92
-	.loc 1 2079 0
+	add	x1, x1, :lo12:.LC91
+	.loc 1 2080 0
 	strb	w3, [x28, 48]
-	.loc 1 2082 0
+	.loc 1 2083 0
 	and	w2, w3, 255
-	.loc 1 2080 0
+	.loc 1 2081 0
 	lsr	w3, w3, 8
 	strb	w3, [x28, 49]
-	.loc 1 2082 0
-	bl	_dev_info
-.LVL976:
 	.loc 1 2083 0
+	bl	_dev_info
+.LVL981:
+	.loc 1 2084 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL977:
-	b	.L940
-.L1072:
-	.loc 1 2019 0
+.LVL982:
+	b	.L939
+.L1064:
+	.loc 1 1984 0
+	ldr	x0, [x28, 104]
+	adrp	x1, .LC86
+	add	x1, x1, :lo12:.LC86
+	bl	_dev_info
+.LVL983:
+.LBB1886:
+	.loc 1 1985 0
+	ldr	w0, [x28, 92]
+	cbz	w0, .L1095
+.L920:
+.LVL984:
+.L918:
+.LBE1886:
+	.loc 1 1986 0 discriminator 11
+	ldr	x0, [x28, 104]
+.LVL985:
+	adrp	x1, .LC87
+	add	x1, x1, :lo12:.LC87
+	bl	_dev_info
+.LVL986:
+	b	.L1056
+.LVL987:
+.L1073:
+	.loc 1 2125 0
+	ldr	w2, [x28, 20]
+.LBB1890:
+.LBB1863:
+	.loc 1 1862 0
+	cmp	w0, 32
+.LVL988:
+	lsl	w0, w2, 1
+	csel	w2, w0, w2, eq
+	.loc 1 1863 0
+	cmp	w2, 0
+	add	w0, w2, 7
+	csel	w0, w0, w2, lt
+.LVL989:
+	asr	w0, w0, 3
+.LVL990:
 	cmp	w0, 0
-	mov	x0, x24
+	ble	.L977
+	ldr	x7, [x1, 16]
+	ldr	x5, [x26, 16]
+	.loc 1 1867 0
+	ldr	x1, [x7]
+	ldr	x2, [x5]
+	cmp	x2, x1
+	bne	.L975
+	sub	w1, w0, #1
+	mov	x0, 8
+	add	x1, x1, 1
+	lsl	x1, x1, 3
+	b	.L979
+	.p2align 3
+.L980:
+	.loc 1 1864 0
+	ldr	x3, [x5, x0]
+	add	x0, x0, 8
+	.loc 1 1865 0
+	add	x2, x7, x0
+	.loc 1 1867 0
+	ldr	x2, [x2, -8]
+	cmp	x3, x2
+	bne	.L975
+.L979:
+	.loc 1 1863 0
+	cmp	x1, x0
+	bne	.L980
+.L977:
+.LBE1863:
+.LBE1890:
+	.loc 1 2126 0
+	ldr	x0, [x28, 104]
+	adrp	x1, .LC96
+	add	x1, x1, :lo12:.LC96
+	bl	_dev_info
+.LVL991:
+	.loc 1 2128 0
+	str	x25, [x28, 216]
+	.loc 1 2130 0
+	b	.L939
+.LVL992:
+.L1078:
+	.loc 1 2017 0
+	cmp	w0, 0
+	mov	x0, x26
 	ccmp	w1, 1, 0, ne
-	bhi	.L935
-	.loc 1 2020 0
+	bhi	.L934
+	.loc 1 2018 0
 	ldrsw	x2, [x28, 20]
 	ldp	x1, x0, [x28, 152]
 	bl	memcpy
-.LVL978:
+.LVL993:
 	ldr	x0, [x28, 224]
-	b	.L935
-.LVL979:
+	b	.L934
+.LVL994:
 	.p2align 3
-.L1075:
-.LBB1889:
-.LBB1864:
+.L1079:
+.LBB1891:
+.LBB1870:
+	.loc 1 476 0
+	orr	w4, w4, 240
+	b	.L944
+	.p2align 3
+.L1080:
 	.loc 1 482 0
 	orr	w4, w4, 3840
-	b	.L947
+	b	.L946
 	.p2align 3
-.L1076:
+.L1081:
 	.loc 1 488 0
 	orr	w4, w4, 61440
-	b	.L949
+	b	.L948
 	.p2align 3
-.L1077:
+.L1082:
 	.loc 1 494 0
 	orr	w4, w4, 983040
-	b	.L951
+	b	.L950
 	.p2align 3
-.L1078:
+.L1083:
 	.loc 1 500 0
 	orr	w4, w4, 15728640
-	b	.L953
+	b	.L952
 	.p2align 3
-.L1079:
+.L1084:
 	.loc 1 506 0
 	orr	w4, w4, 251658240
-	b	.L955
-.LVL980:
+	b	.L954
+.LVL995:
 	.p2align 3
-.L1080:
+.L1085:
 	.loc 1 512 0
 	orr	w4, w4, -268435456
-.LVL981:
+.LVL996:
 	.loc 1 517 0
-	and	w0, w0, w26
-.LVL982:
+	and	w0, w0, w25
+.LVL997:
 	eor	w0, w0, w4
-.LVL983:
+.LVL998:
 	.loc 1 461 0
 	add	w5, w5, 1
 	and	w0, w0, w3
@@ -11321,400 +11406,354 @@ ebc_thread:
 	.loc 1 517 0
 	eor	w0, w4, w0
 	.loc 1 518 0
-	str	w0, [x9, x1]
+	str	w0, [x8, x1]
 	.loc 1 461 0
-	ble	.L1026
-.LVL984:
+	ble	.L1032
+.LVL999:
 	.p2align 2
-.L960:
+.L959:
 	.loc 1 456 0
 	add	w16, w16, 1
 	add	w7, w7, w18
-	cmp	w16, w25
-	ble	.L1025
-.L943:
-.LBE1864:
-.LBE1889:
-	.loc 1 2027 0
+	cmp	w16, w21
+	ble	.L1031
+.L942:
+.LBE1870:
+.LBE1891:
+	.loc 1 2025 0
 	ldr	w0, [x28, 44]
-	cbnz	w0, .L940
-	.loc 1 2030 0
-	ldr	w0, [x28, 200]
+	cbnz	w0, .L939
 	.loc 1 2028 0
+	ldr	w0, [x28, 200]
+	.loc 1 2026 0
 	mov	w1, 1
-	.loc 1 2029 0
+	.loc 1 2027 0
 	str	wzr, [x28, 92]
-	.loc 1 2028 0
+	.loc 1 2026 0
 	str	w1, [x28, 44]
+	.loc 1 2028 0
+	cbz	w0, .L1096
+.L960:
 	.loc 1 2030 0
-	cbz	w0, .L1089
-.L961:
-	.loc 1 2032 0
 	mov	w1, 16
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL985:
+.LVL1000:
 	cmn	w0, #1
-	beq	.L940
-	.loc 1 2036 0
+	beq	.L939
+	.loc 1 2034 0
 	ldr	w2, [x28, 112]
-	.loc 1 2039 0
-	adrp	x1, .LC90
+	.loc 1 2037 0
+	adrp	x1, .LC89
 	ldr	x0, [x28, 104]
-	add	x1, x1, :lo12:.LC90
-	.loc 1 2036 0
+	add	x1, x1, :lo12:.LC89
+	.loc 1 2034 0
 	strb	w2, [x28, 48]
-	.loc 1 2037 0
+	.loc 1 2035 0
 	lsr	w3, w2, 8
-	.loc 1 2039 0
-	and	w2, w2, 255
 	.loc 1 2037 0
+	and	w2, w2, 255
+	.loc 1 2035 0
 	strb	w3, [x28, 49]
-	.loc 1 2039 0
+	.loc 1 2037 0
 	and	w3, w3, 255
 	bl	_dev_info
-.LVL986:
-	.loc 1 2040 0
+.LVL1001:
+	.loc 1 2038 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL987:
-	b	.L940
-.LVL988:
-	.p2align 3
-.L1074:
-.LBB1890:
-.LBB1865:
-	.loc 1 476 0
-	orr	w4, w4, 240
-	b	.L945
-.LVL989:
-.L1070:
-.LBE1865:
-.LBE1890:
-	.loc 1 2193 0
+.LVL1002:
+	b	.L939
+.LVL1003:
+.L1076:
+	.loc 1 2194 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC96
-	add	x1, x1, :lo12:.LC96
+	adrp	x1, .LC95
+	add	x1, x1, :lo12:.LC95
 	bl	_dev_info
-.LVL990:
-	.loc 1 2194 0
+.LVL1004:
+	.loc 1 2195 0
 	ldr	w0, [x28, 616]
-	cbz	w0, .L1090
-.L986:
-	.loc 1 2199 0
-	add	x0, x21, :lo12:.LANCHOR0
-	.loc 1 2197 0
+	cbz	w0, .L1097
+.L990:
+	.loc 1 2200 0
+	add	x0, x22, :lo12:.LANCHOR0
+	.loc 1 2198 0
 	mov	w2, 1
-	.loc 1 2196 0
+	.loc 1 2197 0
 	str	wzr, [x28, 204]
-	.loc 1 2200 0
+	.loc 1 2201 0
 	mov	w1, w2
-	.loc 1 2197 0
-	str	w2, [x28, 616]
 	.loc 1 2198 0
-	str	wzr, [x28, 632]
+	str	w2, [x28, 616]
 	.loc 1 2199 0
-	str	wzr, [x0, 16]
+	str	wzr, [x28, 632]
 	.loc 1 2200 0
-	add	x0, x22, 328
+	str	wzr, [x0, 16]
+	.loc 1 2201 0
+	add	x0, x23, 328
 	bl	__wake_up_sync
-.LVL991:
-	b	.L985
-.LVL992:
-.L929:
-	.loc 1 1998 0
+.LVL1005:
+	b	.L989
+.LVL1006:
+.L928:
+	.loc 1 1996 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC89
-	add	x1, x1, :lo12:.LC89
+	adrp	x1, .LC88
+	add	x1, x1, :lo12:.LC88
 	bl	_dev_info
-.LVL993:
-	.loc 1 1999 0
-	mov	x0, x24
+.LVL1007:
+	.loc 1 1997 0
+	mov	x0, x26
 	bl	ebc_remove_from_dsp_buf_list
-.LVL994:
-	.loc 1 2000 0
-	mov	x0, x24
+.LVL1008:
+	.loc 1 1998 0
+	mov	x0, x26
 	bl	ebc_buf_release
-.LVL995:
-	.loc 1 2002 0
+.LVL1009:
+	.loc 1 2000 0
 	b	.L895
-.LVL996:
-.L1066:
-	.loc 1 2124 0
-	ldr	w2, [x28, 20]
-.LBB1891:
-.LBB1859:
-	.loc 1 1862 0
-	cmp	w0, 32
-.LVL997:
-	lsl	w0, w2, 1
-	csel	w2, w0, w2, eq
-	.loc 1 1863 0
-	cmp	w2, 0
-	add	w0, w2, 7
-	csel	w0, w0, w2, lt
-.LVL998:
-	asr	w0, w0, 3
-.LVL999:
-	cmp	w0, 0
-	ble	.L973
-	ldr	x7, [x1, 16]
-	ldr	x5, [x24, 16]
-	.loc 1 1867 0
-	ldr	x2, [x7]
-	ldr	x1, [x5]
-	cmp	x2, x1
-	bne	.L971
-	sub	w1, w0, #1
-	mov	x0, 8
-	add	x1, x1, 1
-	lsl	x1, x1, 3
-	b	.L975
-	.p2align 3
-.L976:
-	.loc 1 1864 0
-	ldr	x3, [x5, x0]
-	add	x0, x0, 8
-	.loc 1 1865 0
-	add	x2, x7, x0
-	.loc 1 1867 0
-	ldr	x2, [x2, -8]
-	cmp	x3, x2
-	bne	.L971
-.L975:
-	.loc 1 1863 0
-	cmp	x0, x1
-	bne	.L976
-.L973:
-.LBE1859:
-.LBE1891:
-	.loc 1 2125 0
-	ldr	x0, [x28, 104]
-	adrp	x1, .LC97
-	add	x1, x1, :lo12:.LC97
-	bl	_dev_info
-.LVL1000:
-	.loc 1 2127 0
-	str	x26, [x28, 216]
-	.loc 1 2129 0
-	b	.L940
-.LVL1001:
-.L1090:
-	.loc 1 2195 0
-	mov	x0, 2
-	bl	ebc_notify
-.LVL1002:
-	b	.L986
-.LVL1003:
-.L1073:
-	.loc 1 2012 0
-	ldr	x5, [x2, 16]
-	ldr	w2, [x28, 20]
-	ldr	x1, [x28, 160]
+.LVL1010:
+.L1088:
 .LBB1892:
-.LBB1893:
-	.loc 1 1883 0
-	cmp	w2, 0
-	ble	.L933
-	mov	x0, 0
-.LVL1004:
-	.p2align 2
-.L934:
-	.loc 1 1885 0
-	ldrb	w3, [x5], 2
-	.loc 1 1887 0
-	ldrb	w4, [x5, -1]
-	and	w4, w4, -16
-	orr	w3, w4, w3, lsr 4
-	.loc 1 1888 0
-	strb	w3, [x1, x0]
-	add	x0, x0, 1
-	.loc 1 1883 0
-	cmp	w2, w0
-	bgt	.L934
-	b	.L1049
-.LVL1005:
-.L1089:
-.LBE1893:
-.LBE1892:
-	.loc 1 2031 0
-	mov	x0, x20
-	bl	ebc_power_set.constprop.17
-.LVL1006:
-	b	.L961
-.LVL1007:
-.L1085:
-.LBB1894:
-.LBB1886:
-.LBB1887:
-	.loc 1 1987 0 discriminator 1
-	add	x26, x22, 352
-.LVL1008:
-.LBE1887:
+.LBB1883:
+.LBB1884:
+	.loc 1 2166 0 discriminator 1
+	add	x27, x23, 352
+.LBE1884:
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL1009:
-	b	.L922
+.LVL1011:
+	b	.L987
 	.p2align 3
-.L1091:
-.LVL1010:
-.LBB1888:
-	.loc 1 1987 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L919
-	.loc 1 1987 0 discriminator 7
+.L1098:
+.LVL1012:
+.LBB1885:
+	.loc 1 2166 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L984
+	.loc 1 2166 0 discriminator 7
 	bl	schedule
-.LVL1011:
-.L922:
-	.loc 1 1987 0 discriminator 9
+.LVL1013:
+.L987:
+	.loc 1 2166 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
-	mov	x0, x26
+	mov	x0, x27
 	bl	prepare_to_wait_event
-.LVL1012:
+.LVL1014:
 	ldr	w1, [x28, 92]
-	cbz	w1, .L1091
-.LBE1888:
-	.loc 1 1987 0 discriminator 4
-	mov	x0, x26
+	cbz	w1, .L1098
+.LBE1885:
+	.loc 1 2166 0 discriminator 4
+	mov	x0, x27
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL1013:
-	b	.L919
-.LVL1014:
-.L1057:
-.LBE1886:
-.LBE1894:
-	.loc 1 1932 0 is_stmt 1
-	str	wzr, [x28, 616]
-	.loc 1 1933 0
-	mov	x0, 3
-	bl	ebc_notify
 .LVL1015:
-	.loc 1 1934 0
-	ldr	x0, [x28, 104]
-	adrp	x1, .LC83
-	add	x1, x1, :lo12:.LC83
-	bl	_dev_info
+	b	.L984
 .LVL1016:
-	.loc 1 1937 0
-	ldr	w2, [x20, 204]
-	.loc 1 1935 0
-	add	x3, x21, :lo12:.LANCHOR0
-	.loc 1 1937 0
-	ldr	w1, [x24, 64]
-	.loc 1 1935 0
-	mov	w4, 1
-	.loc 1 1937 0
-	ldr	x0, [x24, 16]
-	.loc 1 1936 0
-	stp	w4, wzr, [x3, 16]
-	.loc 1 1937 0
-	bl	check_black_percent.isra.15
+.L1089:
+.LBE1883:
+.LBE1892:
+	.loc 1 1949 0 is_stmt 1
+	str	wzr, [x28, 632]
+	b	.L900
 .LVL1017:
-	cbnz	w0, .L895
-	b	.L903
+.L1092:
+	.loc 1 2062 0
+	bl	refresh_new_image_auto_32
 .LVL1018:
-.L1084:
+	b	.L968
+.L1086:
+	.loc 1 2052 0
+	ldr	w2, [x28, 20]
+	ldr	x4, [x1, 16]
+.LBB1893:
+.LBB1894:
+	.loc 1 1883 0
+	cmp	w2, 0
+.LBE1894:
+.LBE1893:
+	.loc 1 2052 0
+	ldr	x5, [x28, 152]
+.LBB1896:
 .LBB1895:
-.LBB1882:
-.LBB1883:
-	.loc 1 2165 0 discriminator 1
-	add	x27, x22, 352
-.LBE1883:
+	.loc 1 1883 0
+	ble	.L963
+	mov	x0, 0
+.LVL1019:
+	.p2align 2
+.L964:
+	.loc 1 1885 0
+	ldrb	w1, [x4], 2
+	.loc 1 1887 0
+	ldrb	w3, [x4, -1]
+	and	w3, w3, -16
+	orr	w1, w3, w1, lsr 4
+	.loc 1 1888 0
+	strb	w1, [x5, x0]
+	add	x0, x0, 1
+	.loc 1 1883 0
+	cmp	w2, w0
+	bgt	.L964
+	b	.L965
+.LVL1020:
+.L1095:
+.LBE1895:
+.LBE1896:
+.LBB1897:
+.LBB1887:
+.LBB1888:
+	.loc 1 1985 0 discriminator 1
+	add	x25, x23, 352
+.LVL1021:
+.LBE1888:
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL1019:
-	b	.L983
+.LVL1022:
+	b	.L921
 	.p2align 3
-.L1092:
-.LVL1020:
-.LBB1884:
-	.loc 1 2165 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L980
-	.loc 1 2165 0 discriminator 7
+.L1099:
+.LVL1023:
+.LBB1889:
+	.loc 1 1985 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L918
+	.loc 1 1985 0 discriminator 7
 	bl	schedule
-.LVL1021:
-.L983:
-	.loc 1 2165 0 discriminator 9
+.LVL1024:
+.L921:
+	.loc 1 1985 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
-	mov	x0, x27
+	mov	x0, x25
 	bl	prepare_to_wait_event
-.LVL1022:
+.LVL1025:
 	ldr	w1, [x28, 92]
-	cbz	w1, .L1092
-.LBE1884:
-	.loc 1 2165 0 discriminator 4
-	mov	x0, x27
+	cbz	w1, .L1099
+.LBE1889:
+	.loc 1 1985 0 discriminator 4
+	mov	x0, x25
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL1023:
-	b	.L980
-.LVL1024:
-.L1060:
-.LBE1882:
-.LBE1895:
-.LBB1896:
-.LBB1897:
-	mov	w1, 0
-	mov	x0, x20
-	bl	ebc_power_set.part.13
-.LVL1025:
-	b	.L897
 .LVL1026:
-.L1086:
-.LBE1897:
-.LBE1896:
-	.loc 1 2061 0 is_stmt 1
-	bl	refresh_new_image_auto_32
+	b	.L918
 .LVL1027:
-	b	.L966
+.L1096:
+.LBE1887:
+.LBE1897:
+	.loc 1 2029 0 is_stmt 1
+	mov	x0, x20
+	bl	ebc_power_set.constprop.17
 .LVL1028:
-.L909:
-	.loc 1 1958 0
-	ldrsw	x2, [x28, 20]
-	ldr	x1, [x24, 16]
-	ldr	x0, [x28, 160]
-	bl	memcpy
+	b	.L960
 .LVL1029:
-	b	.L911
+.L1090:
+	.loc 1 1954 0
+	ldr	w4, [x28, 20]
+.LBB1898:
+.LBB1899:
+	.loc 1 1883 0
+	mov	x0, 0
+	ldr	x3, [x26, 16]
 .LVL1030:
-.L1088:
-	.loc 1 2075 0
-	ldr	x0, [x28, 104]
-	adrp	x1, .LC91
-	add	x1, x1, :lo12:.LC91
-	bl	_dev_err
+	cmp	w4, 0
+.LBE1899:
+.LBE1898:
+	.loc 1 1954 0
+	ldr	x5, [x28, 160]
+.LBB1901:
+.LBB1900:
+	.loc 1 1883 0
+	ble	.L910
+.L1033:
+	.loc 1 1885 0
+	ldrb	w1, [x3], 2
+	.loc 1 1887 0
+	ldrb	w2, [x3, -1]
+	and	w2, w2, -16
+	orr	w1, w2, w1, lsr 4
+	.loc 1 1888 0
+	strb	w1, [x5, x0]
+	add	x0, x0, 1
+	.loc 1 1883 0
+	cmp	w4, w0
+	bgt	.L1033
+	b	.L910
 .LVL1031:
-	.loc 1 2076 0
-	b	.L940
-.L1087:
-	.loc 1 2073 0
+.L1066:
+.LBE1900:
+.LBE1901:
+.LBB1902:
+.LBB1903:
+	mov	w1, 0
 	mov	x0, x20
-	bl	ebc_power_set.constprop.17
+	bl	ebc_power_set.part.13
 .LVL1032:
-	b	.L968
-.L963:
-	.loc 1 2056 0
-	ldrsw	x2, [x28, 20]
-	ldr	x1, [x1, 16]
-	ldr	x0, [x28, 152]
-	bl	memcpy
+	b	.L897
 .LVL1033:
-	b	.L1050
+.L1094:
+.LBE1903:
+.LBE1902:
+	.loc 1 2076 0
+	ldr	x0, [x28, 104]
+	adrp	x1, .LC90
+	add	x1, x1, :lo12:.LC90
+	bl	_dev_err
 .LVL1034:
-.L1082:
-	.loc 1 1970 0
+	.loc 1 2077 0
+	b	.L939
+.L1093:
+	.loc 1 2074 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
 .LVL1035:
-	b	.L914
-.L1061:
-	.loc 1 2233 0
-	bl	__stack_chk_fail
+	b	.L972
+.L931:
+	.loc 1 2012 0
+	ldr	x1, [x2, 16]
+	ldr	x0, [x28, 160]
+	ldrsw	x2, [x28, 20]
+	bl	memcpy
 .LVL1036:
+	b	.L1057
+.LVL1037:
+.L966:
+	ldr	w2, [x28, 20]
+.L1007:
+	.loc 1 2058 0
+	ldr	x1, [x0, 16]
+	sxtw	x2, w2
+	ldr	x0, [x28, 144]
+	bl	memcpy
+.LVL1038:
+	b	.L968
+.LVL1039:
+.L1097:
+	.loc 1 2196 0
+	mov	x0, 2
+	bl	ebc_notify
+.LVL1040:
+	b	.L990
+.LVL1041:
+.L1091:
+	.loc 1 1968 0
+	mov	x0, x20
+	bl	ebc_power_set.constprop.17
+.LVL1042:
+	b	.L913
+.L963:
+	.loc 1 2055 0
+	ldr	w0, [x26, 64]
+	cmp	w0, 32
+	beq	.L968
+	mov	x0, x26
+	b	.L1007
+.LVL1043:
+.L1067:
+	.loc 1 2234 0
+	bl	__stack_chk_fail
+.LVL1044:
 	.cfi_endproc
 .LFE2838:
 	.size	ebc_thread, .-ebc_thread
@@ -11727,7 +11766,7 @@ ebc_driver:
 	.xword	ebc_probe
 	.xword	ebc_remove
 	.zero	24
-	.xword	.LC98
+	.xword	.LC97
 	.zero	32
 	.xword	ebc_match
 	.zero	64
@@ -11768,13 +11807,13 @@ ebc_wq:
 waveform_misc:
 	.word	244
 	.zero	4
-	.xword	.LC106
+	.xword	.LC105
 	.xword	waveform_ops
 	.zero	56
 	.type	dev_attr_waveform_version, %object
 	.size	dev_attr_waveform_version, 32
 dev_attr_waveform_version:
-	.xword	.LC105
+	.xword	.LC104
 	.hword	292
 	.zero	6
 	.xword	waveform_version_read
@@ -11782,7 +11821,7 @@ dev_attr_waveform_version:
 	.type	dev_attr_pmic_name, %object
 	.size	dev_attr_pmic_name, 32
 dev_attr_pmic_name:
-	.xword	.LC104
+	.xword	.LC103
 	.hword	292
 	.zero	6
 	.xword	pmic_name_read
@@ -11790,7 +11829,7 @@ dev_attr_pmic_name:
 	.type	dev_attr_pmic_temp, %object
 	.size	dev_attr_pmic_temp, 32
 dev_attr_pmic_temp:
-	.xword	.LC103
+	.xword	.LC102
 	.hword	292
 	.zero	6
 	.xword	pmic_temp_read
@@ -11798,7 +11837,7 @@ dev_attr_pmic_temp:
 	.type	dev_attr_pmic_vcom, %object
 	.size	dev_attr_pmic_vcom, 32
 dev_attr_pmic_vcom:
-	.xword	.LC102
+	.xword	.LC101
 	.hword	420
 	.zero	6
 	.xword	pmic_vcom_read
@@ -11806,7 +11845,7 @@ dev_attr_pmic_vcom:
 	.type	dev_attr_ebc_version, %object
 	.size	dev_attr_ebc_version, 32
 dev_attr_ebc_version:
-	.xword	.LC101
+	.xword	.LC100
 	.hword	292
 	.zero	6
 	.xword	ebc_version_read
@@ -11814,7 +11853,7 @@ dev_attr_ebc_version:
 	.type	dev_attr_ebc_state, %object
 	.size	dev_attr_ebc_state, 32
 dev_attr_ebc_state:
-	.xword	.LC100
+	.xword	.LC99
 	.hword	292
 	.zero	6
 	.xword	ebc_state_read
@@ -11822,7 +11861,7 @@ dev_attr_ebc_state:
 	.type	dev_attr_ebc_buf_state, %object
 	.size	dev_attr_ebc_buf_state, 32
 dev_attr_ebc_buf_state:
-	.xword	.LC99
+	.xword	.LC98
 	.hword	292
 	.zero	6
 	.xword	ebc_buf_state_read
@@ -11923,9 +11962,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init3171, %object
-	.size	__addressable_ebc_init3171, 8
-__addressable_ebc_init3171:
+	.type	__addressable_ebc_init3172, %object
+	.size	__addressable_ebc_init3172, 8
+__addressable_ebc_init3172:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -11983,7 +12022,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC16:
-	.string	"2.18"
+	.string	"2.19"
 	.zero	3
 .LC17:
 	.string	"%s\n"
@@ -12179,71 +12218,68 @@ __exitcall_ebc_exit:
 	.string	"early resume\n"
 	.zero	2
 .LC84:
-	.string	"refresh suspend logo\n"
-	.zero	2
-.LC85:
 	.string	"overlay mode start, update background, frame_total=%d\n"
 	.zero	1
-.LC86:
+.LC85:
 	.string	"change display mode from %d to %d\n"
 	.zero	5
-.LC87:
+.LC86:
 	.string	"ebc is busy now, waiting prev refresh mode end...\n"
 	.zero	5
-.LC88:
+.LC87:
 	.string	"prev refresh mode end\n"
 	.zero	1
-.LC89:
+.LC88:
 	.string	"overlay disabled, drop EPD_OVERLAY frame\n"
 	.zero	6
-.LC90:
+.LC89:
 	.string	"overlay mode start, frame_total=%d, bw_frame = %d\n"
 	.zero	5
-.LC91:
+.LC90:
 	.string	"ebc_lut_update err\n"
 	.zero	4
-.LC92:
+.LC91:
 	.string	"auto mode start, frame_total=%d\n"
 	.zero	7
-.LC93:
+.LC92:
 	.string	"frame start, mode = %d, framecount = %d\n"
 	.zero	7
-.LC94:
+.LC93:
 	.string	"ebc buffer mode %d error!!!\n"
 	.zero	3
-.LC95:
+.LC94:
 	.string	"power off\n"
 	.zero	5
-.LC96:
+.LC95:
 	.string	"early suspend\n"
 	.zero	1
-.LC97:
+.LC96:
 	.string	"check_part_mode==0, no need refresh\n"
 	.zero	3
-.LC98:
+.LC97:
 	.string	"ebc-dev"
-.LC99:
+.LC98:
 	.string	"ebc_buf_state"
 	.zero	2
-.LC100:
+.LC99:
 	.string	"ebc_state"
 	.zero	6
-.LC101:
+.LC100:
 	.string	"ebc_version"
 	.zero	4
-.LC102:
+.LC101:
 	.string	"pmic_vcom"
 	.zero	6
-.LC103:
+.LC102:
 	.string	"pmic_temp"
 	.zero	6
-.LC104:
+.LC103:
 	.string	"pmic_name"
 	.zero	6
-.LC105:
+.LC104:
 	.string	"waveform_version"
 	.zero	7
-.LC106:
+.LC105:
 	.string	"waveform"
 	.text
 .Letext0:
@@ -12445,7 +12481,7 @@ __exitcall_ebc_exit:
 	.file 214 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x1557e
+	.4byte	0x155a5
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
@@ -12454,7 +12490,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.4byte	.LASF3340
 	.4byte	.LASF3341
-	.4byte	.Ldebug_ranges0+0x12c0
+	.4byte	.Ldebug_ranges0+0x12e0
 	.8byte	0
 	.4byte	.Ldebug_line0
 	.uleb128 0x2
@@ -40180,7 +40216,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0xa03
+	.2byte	0xa04
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
@@ -40188,7 +40224,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0xa0d
+	.2byte	0xa0e
 	.4byte	0xc680
 	.uleb128 0x9
 	.byte	0x3
@@ -40196,7 +40232,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0xa2a
+	.2byte	0xa2b
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
@@ -40204,7 +40240,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0xa30
+	.2byte	0xa31
 	.4byte	0xc680
 	.uleb128 0x9
 	.byte	0x3
@@ -40212,7 +40248,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0xa3f
+	.2byte	0xa40
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40220,7 +40256,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0xa4a
+	.2byte	0xa4b
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40228,7 +40264,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0xa58
+	.2byte	0xa59
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40236,7 +40272,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0xa7b
+	.2byte	0xa7c
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40244,7 +40280,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0xa85
+	.2byte	0xa86
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40252,7 +40288,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0xa8e
+	.2byte	0xa8f
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40260,7 +40296,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0xa97
+	.2byte	0xa98
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40268,7 +40304,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0xc44
+	.2byte	0xc45
 	.4byte	0xa5cc
 	.uleb128 0x9
 	.byte	0x3
@@ -40285,7 +40321,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0xc49
+	.2byte	0xc4a
 	.4byte	0xe71f
 	.uleb128 0x9
 	.byte	0x3
@@ -40293,7 +40329,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0xc4f
+	.2byte	0xc50
 	.4byte	0xd70e
 	.uleb128 0x9
 	.byte	0x3
@@ -40301,15 +40337,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0xc63
+	.2byte	0xc64
 	.4byte	0x458
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init3171
+	.8byte	__addressable_ebc_init3172
 	.uleb128 0x4d
 	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0xc64
+	.2byte	0xc65
 	.4byte	0x4ac
 	.uleb128 0x9
 	.byte	0x3
@@ -40317,7 +40353,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4e
 	.4byte	.LASF3096
 	.byte	0x1
-	.2byte	0xc5e
+	.2byte	0xc5f
 	.8byte	.LFB2867
 	.8byte	.LFE2867-.LFB2867
 	.uleb128 0x1
@@ -40325,12 +40361,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe7a8
 	.uleb128 0x4f
 	.8byte	.LVL64
-	.4byte	0x1524f
+	.4byte	0x15276
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0xc59
+	.2byte	0xc5a
 	.4byte	0xc6
 	.8byte	.LFB2866
 	.8byte	.LFE2866-.LFB2866
@@ -40339,12 +40375,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe7d8
 	.uleb128 0x4f
 	.8byte	.LVL361
-	.4byte	0x1525b
+	.4byte	0x15282
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0xc38
+	.2byte	0xc39
 	.4byte	0xc6
 	.8byte	.LFB2865
 	.8byte	.LFE2865-.LFB2865
@@ -40354,42 +40390,42 @@ __exitcall_ebc_exit:
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xc38
+	.2byte	0xc39
 	.4byte	0xa5e0
 	.4byte	.LLST11
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xc3a
+	.2byte	0xc3b
 	.4byte	0xe557
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xc3b
+	.2byte	0xc3c
 	.4byte	0xe874
 	.uleb128 0x54
-	.4byte	0x14b1a
-	.8byte	.LBB952
-	.8byte	.LBE952-.LBB952
+	.4byte	0x14b41
+	.8byte	.LBB954
+	.8byte	.LBE954-.LBB954
 	.byte	0x1
-	.2byte	0xc3a
+	.2byte	0xc3b
 	.4byte	0xe844
 	.uleb128 0x55
-	.4byte	0x14b2b
+	.4byte	0x14b52
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x146e2
-	.8byte	.LBB954
-	.8byte	.LBE954-.LBB954
+	.4byte	0x14709
+	.8byte	.LBB956
+	.8byte	.LBE956-.LBB956
 	.byte	0x1
-	.2byte	0xc3d
+	.2byte	0xc3e
 	.4byte	0xe866
 	.uleb128 0x55
-	.4byte	0x146ef
+	.4byte	0x14716
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL68
-	.4byte	0x15267
+	.4byte	0x1528e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -40397,7 +40433,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x51
 	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0xc27
+	.2byte	0xc28
 	.4byte	0xc6
 	.8byte	.LFB2864
 	.8byte	.LFE2864-.LFB2864
@@ -40407,18 +40443,18 @@ __exitcall_ebc_exit:
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xc27
+	.2byte	0xc28
 	.4byte	0xa5e0
 	.4byte	.LLST192
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xc29
+	.2byte	0xc2a
 	.4byte	0xe557
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xc2a
+	.2byte	0xc2b
 	.4byte	0xe874
 	.uleb128 0x56
 	.4byte	.LASF3050
@@ -40427,52 +40463,52 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	__func__.35528
 	.uleb128 0x54
-	.4byte	0x14b1a
-	.8byte	.LBB1482
-	.8byte	.LBE1482-.LBB1482
+	.4byte	0x14b41
+	.8byte	.LBB1484
+	.8byte	.LBE1484-.LBB1484
 	.byte	0x1
-	.2byte	0xc29
+	.2byte	0xc2a
 	.4byte	0xe8f9
 	.uleb128 0x55
-	.4byte	0x14b2b
+	.4byte	0x14b52
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x146fc
-	.8byte	.LBB1484
-	.8byte	.LBE1484-.LBB1484
+	.4byte	0x14723
+	.8byte	.LBB1486
+	.8byte	.LBE1486-.LBB1486
 	.byte	0x1
-	.2byte	0xc32
+	.2byte	0xc33
 	.4byte	0xe91b
 	.uleb128 0x55
-	.4byte	0x14709
+	.4byte	0x14730
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x143a9
-	.8byte	.LBB1486
-	.8byte	.LBE1486-.LBB1486
+	.4byte	0x143d0
+	.8byte	.LBB1488
+	.8byte	.LBE1488-.LBB1488
 	.byte	0x1
-	.2byte	0xc2e
+	.2byte	0xc2f
 	.4byte	0xe966
 	.uleb128 0x55
-	.4byte	0x143c4
+	.4byte	0x143eb
 	.uleb128 0x55
-	.4byte	0x143b9
+	.4byte	0x143e0
 	.uleb128 0x57
-	.8byte	.LBB1487
-	.8byte	.LBE1487-.LBB1487
+	.8byte	.LBB1489
+	.8byte	.LBE1489-.LBB1489
 	.uleb128 0x58
-	.4byte	0x143d0
+	.4byte	0x143f7
 	.uleb128 0x4f
 	.8byte	.LVL592
-	.4byte	0x1507e
+	.4byte	0x150a5
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL590
-	.4byte	0x15267
+	.4byte	0x1528e
 	.uleb128 0x4f
 	.8byte	.LVL591
-	.4byte	0x15267
+	.4byte	0x1528e
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
@@ -40486,7 +40522,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x50
 	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0xc20
+	.2byte	0xc21
 	.4byte	0xc6
 	.8byte	.LFB2863
 	.8byte	.LFE2863-.LFB2863
@@ -40496,17 +40532,17 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0xc20
+	.2byte	0xc21
 	.4byte	0xd78a
 	.4byte	.LLST13
 	.uleb128 0x4f
 	.8byte	.LVL74
-	.4byte	0x15274
+	.4byte	0x1529b
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0xb9f
+	.2byte	0xba0
 	.4byte	0xc6
 	.8byte	.LFB2862
 	.8byte	.LFE2862-.LFB2862
@@ -40516,141 +40552,141 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0xb9f
+	.2byte	0xba0
 	.4byte	0xd78a
 	.4byte	.LLST195
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xba1
+	.2byte	0xba2
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0xba2
+	.2byte	0xba3
 	.4byte	0xb904
 	.uleb128 0x5a
 	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0xba3
+	.2byte	0xba4
 	.4byte	0xd78a
 	.4byte	.LLST196
 	.uleb128 0x48
 	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0xba4
+	.2byte	0xba5
 	.4byte	0xb904
 	.uleb128 0x5a
 	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0xba5
+	.2byte	0xba6
 	.4byte	0xc0b3
 	.4byte	.LLST197
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xba6
+	.2byte	0xba7
 	.4byte	0xe557
 	.uleb128 0x5a
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xba7
+	.2byte	0xba8
 	.4byte	0xe874
 	.4byte	.LLST198
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xba8
+	.2byte	0xba9
 	.4byte	0xe1f4
 	.uleb128 0x5a
 	.4byte	.LASF976
 	.byte	0x1
-	.2byte	0xba9
+	.2byte	0xbaa
 	.4byte	0xbd30
 	.4byte	.LLST199
 	.uleb128 0x48
 	.4byte	.LASF2435
 	.byte	0x1
-	.2byte	0xbaa
+	.2byte	0xbab
 	.4byte	0xbcd0
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xbab
+	.2byte	0xbac
 	.4byte	0xc6
 	.uleb128 0x5a
 	.4byte	.LASF1001
 	.byte	0x1
-	.2byte	0xbac
+	.2byte	0xbad
 	.4byte	0xc6
 	.4byte	.LLST200
 	.uleb128 0x5b
 	.string	"i"
 	.byte	0x1
-	.2byte	0xbad
+	.2byte	0xbae
 	.4byte	0xc6
 	.4byte	.LLST201
 	.uleb128 0x5c
-	.4byte	0x14b38
-	.8byte	.LBB1632
+	.4byte	0x14b5f
+	.8byte	.LBB1634
 	.4byte	.Ldebug_ranges0+0xcb0
 	.byte	0x1
-	.2byte	0xbaf
+	.2byte	0xbb0
 	.4byte	0xeaef
 	.uleb128 0x55
-	.4byte	0x14b61
+	.4byte	0x14b88
 	.uleb128 0x55
-	.4byte	0x14b55
+	.4byte	0x14b7c
 	.uleb128 0x55
-	.4byte	0x14b49
+	.4byte	0x14b70
 	.uleb128 0x4f
 	.8byte	.LVL598
-	.4byte	0x15280
+	.4byte	0x152a7
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a12
-	.8byte	.LBB1636
-	.8byte	.LBE1636-.LBB1636
+	.4byte	0x14a39
+	.8byte	.LBB1638
+	.8byte	.LBE1638-.LBB1638
 	.byte	0x1
-	.2byte	0xbc1
+	.2byte	0xbc2
 	.4byte	0xeb2e
 	.uleb128 0x55
-	.4byte	0x14a22
+	.4byte	0x14a49
 	.uleb128 0x5d
-	.4byte	0x14b1a
-	.8byte	.LBB1637
-	.8byte	.LBE1637-.LBB1637
+	.4byte	0x14b41
+	.8byte	.LBB1639
+	.8byte	.LBE1639-.LBB1639
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x55
-	.4byte	0x14b2b
+	.4byte	0x14b52
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a35
-	.8byte	.LBB1639
-	.8byte	.LBE1639-.LBB1639
+	.4byte	0x14a5c
+	.8byte	.LBB1641
+	.8byte	.LBE1641-.LBB1641
 	.byte	0x1
-	.2byte	0xbdc
+	.2byte	0xbdd
 	.4byte	0xeb6e
 	.uleb128 0x55
-	.4byte	0x14a46
+	.4byte	0x14a6d
 	.uleb128 0x5e
-	.4byte	0x14b1a
-	.8byte	.LBB1640
-	.8byte	.LBE1640-.LBB1640
+	.4byte	0x14b41
+	.8byte	.LBB1642
+	.8byte	.LBE1642-.LBB1642
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x55
-	.4byte	0x14b2b
+	.4byte	0x14b52
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0x117be
-	.8byte	.LBB1642
+	.8byte	.LBB1644
 	.4byte	.Ldebug_ranges0+0xce0
 	.byte	0x1
-	.2byte	0xbf0
+	.2byte	0xbf1
 	.4byte	0xf543
 	.uleb128 0x55
 	.4byte	0x117cf
@@ -40659,760 +40695,760 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	0x117db
 	.uleb128 0x5c
-	.4byte	0x14a59
-	.8byte	.LBB1644
+	.4byte	0x14a80
+	.8byte	.LBB1646
 	.4byte	.Ldebug_ranges0+0xd30
 	.byte	0x1
-	.2byte	0x8e2
+	.2byte	0x8e3
 	.4byte	0xebfe
 	.uleb128 0x55
-	.4byte	0x14a81
+	.4byte	0x14aa8
 	.uleb128 0x55
-	.4byte	0x14a75
+	.4byte	0x14a9c
 	.uleb128 0x55
-	.4byte	0x14a6a
+	.4byte	0x14a91
 	.uleb128 0x60
-	.4byte	0x14a8e
-	.8byte	.LBB1645
+	.4byte	0x14ab5
+	.8byte	.LBB1647
 	.4byte	.Ldebug_ranges0+0xd30
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ac2
+	.4byte	0x14ae9
 	.uleb128 0x55
-	.4byte	0x14ab6
+	.4byte	0x14add
 	.uleb128 0x55
-	.4byte	0x14aaa
+	.4byte	0x14ad1
 	.uleb128 0x55
-	.4byte	0x14a9f
+	.4byte	0x14ac6
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xd30
 	.uleb128 0x58
-	.4byte	0x14acd
+	.4byte	0x14af4
 	.uleb128 0x4f
 	.8byte	.LVL623
-	.4byte	0x1528d
+	.4byte	0x152b4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a59
-	.8byte	.LBB1656
-	.8byte	.LBE1656-.LBB1656
+	.4byte	0x14a80
+	.8byte	.LBB1658
+	.8byte	.LBE1658-.LBB1658
 	.byte	0x1
-	.2byte	0x8e5
+	.2byte	0x8e6
 	.4byte	0xec7b
 	.uleb128 0x55
-	.4byte	0x14a81
+	.4byte	0x14aa8
 	.uleb128 0x55
-	.4byte	0x14a75
+	.4byte	0x14a9c
 	.uleb128 0x55
-	.4byte	0x14a6a
+	.4byte	0x14a91
 	.uleb128 0x5e
-	.4byte	0x14a8e
-	.8byte	.LBB1657
-	.8byte	.LBE1657-.LBB1657
+	.4byte	0x14ab5
+	.8byte	.LBB1659
+	.8byte	.LBE1659-.LBB1659
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ac2
+	.4byte	0x14ae9
 	.uleb128 0x55
-	.4byte	0x14ab6
+	.4byte	0x14add
 	.uleb128 0x55
-	.4byte	0x14aaa
+	.4byte	0x14ad1
 	.uleb128 0x55
-	.4byte	0x14a9f
+	.4byte	0x14ac6
 	.uleb128 0x57
-	.8byte	.LBB1658
-	.8byte	.LBE1658-.LBB1658
+	.8byte	.LBB1660
+	.8byte	.LBE1660-.LBB1660
 	.uleb128 0x58
-	.4byte	0x14acd
+	.4byte	0x14af4
 	.uleb128 0x4f
 	.8byte	.LVL624
-	.4byte	0x1528d
+	.4byte	0x152b4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a59
-	.8byte	.LBB1659
-	.8byte	.LBE1659-.LBB1659
+	.4byte	0x14a80
+	.8byte	.LBB1661
+	.8byte	.LBE1661-.LBB1661
 	.byte	0x1
-	.2byte	0x8e8
+	.2byte	0x8e9
 	.4byte	0xecf8
 	.uleb128 0x55
-	.4byte	0x14a81
+	.4byte	0x14aa8
 	.uleb128 0x55
-	.4byte	0x14a75
+	.4byte	0x14a9c
 	.uleb128 0x55
-	.4byte	0x14a6a
+	.4byte	0x14a91
 	.uleb128 0x5e
-	.4byte	0x14a8e
-	.8byte	.LBB1660
-	.8byte	.LBE1660-.LBB1660
+	.4byte	0x14ab5
+	.8byte	.LBB1662
+	.8byte	.LBE1662-.LBB1662
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ac2
+	.4byte	0x14ae9
 	.uleb128 0x55
-	.4byte	0x14ab6
+	.4byte	0x14add
 	.uleb128 0x55
-	.4byte	0x14aaa
+	.4byte	0x14ad1
 	.uleb128 0x55
-	.4byte	0x14a9f
+	.4byte	0x14ac6
 	.uleb128 0x57
-	.8byte	.LBB1661
-	.8byte	.LBE1661-.LBB1661
+	.8byte	.LBB1663
+	.8byte	.LBE1663-.LBB1663
 	.uleb128 0x58
-	.4byte	0x14acd
+	.4byte	0x14af4
 	.uleb128 0x4f
 	.8byte	.LVL625
-	.4byte	0x1528d
+	.4byte	0x152b4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a59
-	.8byte	.LBB1662
-	.8byte	.LBE1662-.LBB1662
+	.4byte	0x14a80
+	.8byte	.LBB1664
+	.8byte	.LBE1664-.LBB1664
 	.byte	0x1
-	.2byte	0x8eb
+	.2byte	0x8ec
 	.4byte	0xed75
 	.uleb128 0x55
-	.4byte	0x14a81
+	.4byte	0x14aa8
 	.uleb128 0x55
-	.4byte	0x14a75
+	.4byte	0x14a9c
 	.uleb128 0x55
-	.4byte	0x14a6a
+	.4byte	0x14a91
 	.uleb128 0x5e
-	.4byte	0x14a8e
-	.8byte	.LBB1663
-	.8byte	.LBE1663-.LBB1663
+	.4byte	0x14ab5
+	.8byte	.LBB1665
+	.8byte	.LBE1665-.LBB1665
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ac2
+	.4byte	0x14ae9
 	.uleb128 0x55
-	.4byte	0x14ab6
+	.4byte	0x14add
 	.uleb128 0x55
-	.4byte	0x14aaa
+	.4byte	0x14ad1
 	.uleb128 0x55
-	.4byte	0x14a9f
+	.4byte	0x14ac6
 	.uleb128 0x57
-	.8byte	.LBB1664
-	.8byte	.LBE1664-.LBB1664
+	.8byte	.LBB1666
+	.8byte	.LBE1666-.LBB1666
 	.uleb128 0x58
-	.4byte	0x14acd
+	.4byte	0x14af4
 	.uleb128 0x4f
 	.8byte	.LVL626
-	.4byte	0x1528d
+	.4byte	0x152b4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a59
-	.8byte	.LBB1665
-	.8byte	.LBE1665-.LBB1665
+	.4byte	0x14a80
+	.8byte	.LBB1667
+	.8byte	.LBE1667-.LBB1667
 	.byte	0x1
-	.2byte	0x8ee
+	.2byte	0x8ef
 	.4byte	0xedf2
 	.uleb128 0x55
-	.4byte	0x14a81
+	.4byte	0x14aa8
 	.uleb128 0x55
-	.4byte	0x14a75
+	.4byte	0x14a9c
 	.uleb128 0x55
-	.4byte	0x14a6a
+	.4byte	0x14a91
 	.uleb128 0x5e
-	.4byte	0x14a8e
-	.8byte	.LBB1666
-	.8byte	.LBE1666-.LBB1666
+	.4byte	0x14ab5
+	.8byte	.LBB1668
+	.8byte	.LBE1668-.LBB1668
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ac2
+	.4byte	0x14ae9
 	.uleb128 0x55
-	.4byte	0x14ab6
+	.4byte	0x14add
 	.uleb128 0x55
-	.4byte	0x14aaa
+	.4byte	0x14ad1
 	.uleb128 0x55
-	.4byte	0x14a9f
+	.4byte	0x14ac6
 	.uleb128 0x57
-	.8byte	.LBB1667
-	.8byte	.LBE1667-.LBB1667
+	.8byte	.LBB1669
+	.8byte	.LBE1669-.LBB1669
 	.uleb128 0x58
-	.4byte	0x14acd
+	.4byte	0x14af4
 	.uleb128 0x4f
 	.8byte	.LVL627
-	.4byte	0x1528d
+	.4byte	0x152b4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a59
-	.8byte	.LBB1668
-	.8byte	.LBE1668-.LBB1668
+	.4byte	0x14a80
+	.8byte	.LBB1670
+	.8byte	.LBE1670-.LBB1670
 	.byte	0x1
-	.2byte	0x8f1
+	.2byte	0x8f2
 	.4byte	0xee6f
 	.uleb128 0x55
-	.4byte	0x14a81
+	.4byte	0x14aa8
 	.uleb128 0x55
-	.4byte	0x14a75
+	.4byte	0x14a9c
 	.uleb128 0x55
-	.4byte	0x14a6a
+	.4byte	0x14a91
 	.uleb128 0x5e
-	.4byte	0x14a8e
-	.8byte	.LBB1669
-	.8byte	.LBE1669-.LBB1669
+	.4byte	0x14ab5
+	.8byte	.LBB1671
+	.8byte	.LBE1671-.LBB1671
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ac2
+	.4byte	0x14ae9
 	.uleb128 0x55
-	.4byte	0x14ab6
+	.4byte	0x14add
 	.uleb128 0x55
-	.4byte	0x14aaa
+	.4byte	0x14ad1
 	.uleb128 0x55
-	.4byte	0x14a9f
+	.4byte	0x14ac6
 	.uleb128 0x57
-	.8byte	.LBB1670
-	.8byte	.LBE1670-.LBB1670
+	.8byte	.LBB1672
+	.8byte	.LBE1672-.LBB1672
 	.uleb128 0x58
-	.4byte	0x14acd
+	.4byte	0x14af4
 	.uleb128 0x4f
 	.8byte	.LVL628
-	.4byte	0x1528d
+	.4byte	0x152b4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a59
-	.8byte	.LBB1671
-	.8byte	.LBE1671-.LBB1671
+	.4byte	0x14a80
+	.8byte	.LBB1673
+	.8byte	.LBE1673-.LBB1673
 	.byte	0x1
-	.2byte	0x8f4
+	.2byte	0x8f5
 	.4byte	0xeeec
 	.uleb128 0x55
-	.4byte	0x14a81
+	.4byte	0x14aa8
 	.uleb128 0x55
-	.4byte	0x14a75
+	.4byte	0x14a9c
 	.uleb128 0x55
-	.4byte	0x14a6a
+	.4byte	0x14a91
 	.uleb128 0x5e
-	.4byte	0x14a8e
-	.8byte	.LBB1672
-	.8byte	.LBE1672-.LBB1672
+	.4byte	0x14ab5
+	.8byte	.LBB1674
+	.8byte	.LBE1674-.LBB1674
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ac2
+	.4byte	0x14ae9
 	.uleb128 0x55
-	.4byte	0x14ab6
+	.4byte	0x14add
 	.uleb128 0x55
-	.4byte	0x14aaa
+	.4byte	0x14ad1
 	.uleb128 0x55
-	.4byte	0x14a9f
+	.4byte	0x14ac6
 	.uleb128 0x57
-	.8byte	.LBB1673
-	.8byte	.LBE1673-.LBB1673
+	.8byte	.LBB1675
+	.8byte	.LBE1675-.LBB1675
 	.uleb128 0x58
-	.4byte	0x14acd
+	.4byte	0x14af4
 	.uleb128 0x4f
 	.8byte	.LVL629
-	.4byte	0x1528d
+	.4byte	0x152b4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a59
-	.8byte	.LBB1674
-	.8byte	.LBE1674-.LBB1674
+	.4byte	0x14a80
+	.8byte	.LBB1676
+	.8byte	.LBE1676-.LBB1676
 	.byte	0x1
-	.2byte	0x8f7
+	.2byte	0x8f8
 	.4byte	0xef69
 	.uleb128 0x55
-	.4byte	0x14a81
+	.4byte	0x14aa8
 	.uleb128 0x55
-	.4byte	0x14a75
+	.4byte	0x14a9c
 	.uleb128 0x55
-	.4byte	0x14a6a
+	.4byte	0x14a91
 	.uleb128 0x5e
-	.4byte	0x14a8e
-	.8byte	.LBB1675
-	.8byte	.LBE1675-.LBB1675
+	.4byte	0x14ab5
+	.8byte	.LBB1677
+	.8byte	.LBE1677-.LBB1677
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ac2
+	.4byte	0x14ae9
 	.uleb128 0x55
-	.4byte	0x14ab6
+	.4byte	0x14add
 	.uleb128 0x55
-	.4byte	0x14aaa
+	.4byte	0x14ad1
 	.uleb128 0x55
-	.4byte	0x14a9f
+	.4byte	0x14ac6
 	.uleb128 0x57
-	.8byte	.LBB1676
-	.8byte	.LBE1676-.LBB1676
+	.8byte	.LBB1678
+	.8byte	.LBE1678-.LBB1678
 	.uleb128 0x58
-	.4byte	0x14acd
+	.4byte	0x14af4
 	.uleb128 0x4f
 	.8byte	.LVL630
-	.4byte	0x1528d
+	.4byte	0x152b4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a59
-	.8byte	.LBB1677
-	.8byte	.LBE1677-.LBB1677
+	.4byte	0x14a80
+	.8byte	.LBB1679
+	.8byte	.LBE1679-.LBB1679
 	.byte	0x1
-	.2byte	0x8fa
+	.2byte	0x8fb
 	.4byte	0xefe6
 	.uleb128 0x55
-	.4byte	0x14a81
+	.4byte	0x14aa8
 	.uleb128 0x55
-	.4byte	0x14a75
+	.4byte	0x14a9c
 	.uleb128 0x55
-	.4byte	0x14a6a
+	.4byte	0x14a91
 	.uleb128 0x5e
-	.4byte	0x14a8e
-	.8byte	.LBB1678
-	.8byte	.LBE1678-.LBB1678
+	.4byte	0x14ab5
+	.8byte	.LBB1680
+	.8byte	.LBE1680-.LBB1680
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ac2
+	.4byte	0x14ae9
 	.uleb128 0x55
-	.4byte	0x14ab6
+	.4byte	0x14add
 	.uleb128 0x55
-	.4byte	0x14aaa
+	.4byte	0x14ad1
 	.uleb128 0x55
-	.4byte	0x14a9f
+	.4byte	0x14ac6
 	.uleb128 0x57
-	.8byte	.LBB1679
-	.8byte	.LBE1679-.LBB1679
+	.8byte	.LBB1681
+	.8byte	.LBE1681-.LBB1681
 	.uleb128 0x58
-	.4byte	0x14acd
+	.4byte	0x14af4
 	.uleb128 0x4f
 	.8byte	.LVL631
-	.4byte	0x1528d
+	.4byte	0x152b4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a59
-	.8byte	.LBB1680
-	.8byte	.LBE1680-.LBB1680
+	.4byte	0x14a80
+	.8byte	.LBB1682
+	.8byte	.LBE1682-.LBB1682
 	.byte	0x1
-	.2byte	0x8fd
+	.2byte	0x8fe
 	.4byte	0xf063
 	.uleb128 0x55
-	.4byte	0x14a81
+	.4byte	0x14aa8
 	.uleb128 0x55
-	.4byte	0x14a75
+	.4byte	0x14a9c
 	.uleb128 0x55
-	.4byte	0x14a6a
+	.4byte	0x14a91
 	.uleb128 0x5e
-	.4byte	0x14a8e
-	.8byte	.LBB1681
-	.8byte	.LBE1681-.LBB1681
+	.4byte	0x14ab5
+	.8byte	.LBB1683
+	.8byte	.LBE1683-.LBB1683
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ac2
+	.4byte	0x14ae9
 	.uleb128 0x55
-	.4byte	0x14ab6
+	.4byte	0x14add
 	.uleb128 0x55
-	.4byte	0x14aaa
+	.4byte	0x14ad1
 	.uleb128 0x55
-	.4byte	0x14a9f
+	.4byte	0x14ac6
 	.uleb128 0x57
-	.8byte	.LBB1682
-	.8byte	.LBE1682-.LBB1682
+	.8byte	.LBB1684
+	.8byte	.LBE1684-.LBB1684
 	.uleb128 0x58
-	.4byte	0x14acd
+	.4byte	0x14af4
 	.uleb128 0x4f
 	.8byte	.LVL632
-	.4byte	0x1528d
+	.4byte	0x152b4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a59
-	.8byte	.LBB1683
-	.8byte	.LBE1683-.LBB1683
+	.4byte	0x14a80
+	.8byte	.LBB1685
+	.8byte	.LBE1685-.LBB1685
 	.byte	0x1
-	.2byte	0x900
+	.2byte	0x901
 	.4byte	0xf0e0
 	.uleb128 0x55
-	.4byte	0x14a81
+	.4byte	0x14aa8
 	.uleb128 0x55
-	.4byte	0x14a75
+	.4byte	0x14a9c
 	.uleb128 0x55
-	.4byte	0x14a6a
+	.4byte	0x14a91
 	.uleb128 0x5e
-	.4byte	0x14a8e
-	.8byte	.LBB1684
-	.8byte	.LBE1684-.LBB1684
+	.4byte	0x14ab5
+	.8byte	.LBB1686
+	.8byte	.LBE1686-.LBB1686
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ac2
+	.4byte	0x14ae9
 	.uleb128 0x55
-	.4byte	0x14ab6
+	.4byte	0x14add
 	.uleb128 0x55
-	.4byte	0x14aaa
+	.4byte	0x14ad1
 	.uleb128 0x55
-	.4byte	0x14a9f
+	.4byte	0x14ac6
 	.uleb128 0x57
-	.8byte	.LBB1685
-	.8byte	.LBE1685-.LBB1685
+	.8byte	.LBB1687
+	.8byte	.LBE1687-.LBB1687
 	.uleb128 0x58
-	.4byte	0x14acd
+	.4byte	0x14af4
 	.uleb128 0x4f
 	.8byte	.LVL633
-	.4byte	0x1528d
+	.4byte	0x152b4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a59
-	.8byte	.LBB1686
-	.8byte	.LBE1686-.LBB1686
+	.4byte	0x14a80
+	.8byte	.LBB1688
+	.8byte	.LBE1688-.LBB1688
 	.byte	0x1
-	.2byte	0x903
+	.2byte	0x904
 	.4byte	0xf15d
 	.uleb128 0x55
-	.4byte	0x14a81
+	.4byte	0x14aa8
 	.uleb128 0x55
-	.4byte	0x14a75
+	.4byte	0x14a9c
 	.uleb128 0x55
-	.4byte	0x14a6a
+	.4byte	0x14a91
 	.uleb128 0x5e
-	.4byte	0x14a8e
-	.8byte	.LBB1687
-	.8byte	.LBE1687-.LBB1687
+	.4byte	0x14ab5
+	.8byte	.LBB1689
+	.8byte	.LBE1689-.LBB1689
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ac2
+	.4byte	0x14ae9
 	.uleb128 0x55
-	.4byte	0x14ab6
+	.4byte	0x14add
 	.uleb128 0x55
-	.4byte	0x14aaa
+	.4byte	0x14ad1
 	.uleb128 0x55
-	.4byte	0x14a9f
+	.4byte	0x14ac6
 	.uleb128 0x57
-	.8byte	.LBB1688
-	.8byte	.LBE1688-.LBB1688
+	.8byte	.LBB1690
+	.8byte	.LBE1690-.LBB1690
 	.uleb128 0x58
-	.4byte	0x14acd
+	.4byte	0x14af4
 	.uleb128 0x4f
 	.8byte	.LVL634
-	.4byte	0x1528d
+	.4byte	0x152b4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a59
-	.8byte	.LBB1689
-	.8byte	.LBE1689-.LBB1689
+	.4byte	0x14a80
+	.8byte	.LBB1691
+	.8byte	.LBE1691-.LBB1691
 	.byte	0x1
-	.2byte	0x906
+	.2byte	0x907
 	.4byte	0xf1da
 	.uleb128 0x55
-	.4byte	0x14a81
+	.4byte	0x14aa8
 	.uleb128 0x55
-	.4byte	0x14a75
+	.4byte	0x14a9c
 	.uleb128 0x55
-	.4byte	0x14a6a
+	.4byte	0x14a91
 	.uleb128 0x5e
-	.4byte	0x14a8e
-	.8byte	.LBB1690
-	.8byte	.LBE1690-.LBB1690
+	.4byte	0x14ab5
+	.8byte	.LBB1692
+	.8byte	.LBE1692-.LBB1692
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ac2
+	.4byte	0x14ae9
 	.uleb128 0x55
-	.4byte	0x14ab6
+	.4byte	0x14add
 	.uleb128 0x55
-	.4byte	0x14aaa
+	.4byte	0x14ad1
 	.uleb128 0x55
-	.4byte	0x14a9f
+	.4byte	0x14ac6
 	.uleb128 0x57
-	.8byte	.LBB1691
-	.8byte	.LBE1691-.LBB1691
+	.8byte	.LBB1693
+	.8byte	.LBE1693-.LBB1693
 	.uleb128 0x58
-	.4byte	0x14acd
+	.4byte	0x14af4
 	.uleb128 0x4f
 	.8byte	.LVL635
-	.4byte	0x1528d
+	.4byte	0x152b4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a59
-	.8byte	.LBB1692
-	.8byte	.LBE1692-.LBB1692
+	.4byte	0x14a80
+	.8byte	.LBB1694
+	.8byte	.LBE1694-.LBB1694
 	.byte	0x1
-	.2byte	0x909
+	.2byte	0x90a
 	.4byte	0xf257
 	.uleb128 0x55
-	.4byte	0x14a81
+	.4byte	0x14aa8
 	.uleb128 0x55
-	.4byte	0x14a75
+	.4byte	0x14a9c
 	.uleb128 0x55
-	.4byte	0x14a6a
+	.4byte	0x14a91
 	.uleb128 0x5e
-	.4byte	0x14a8e
-	.8byte	.LBB1693
-	.8byte	.LBE1693-.LBB1693
+	.4byte	0x14ab5
+	.8byte	.LBB1695
+	.8byte	.LBE1695-.LBB1695
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ac2
+	.4byte	0x14ae9
 	.uleb128 0x55
-	.4byte	0x14ab6
+	.4byte	0x14add
 	.uleb128 0x55
-	.4byte	0x14aaa
+	.4byte	0x14ad1
 	.uleb128 0x55
-	.4byte	0x14a9f
+	.4byte	0x14ac6
 	.uleb128 0x57
-	.8byte	.LBB1694
-	.8byte	.LBE1694-.LBB1694
+	.8byte	.LBB1696
+	.8byte	.LBE1696-.LBB1696
 	.uleb128 0x58
-	.4byte	0x14acd
+	.4byte	0x14af4
 	.uleb128 0x4f
 	.8byte	.LVL636
-	.4byte	0x1528d
+	.4byte	0x152b4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a59
-	.8byte	.LBB1695
-	.8byte	.LBE1695-.LBB1695
+	.4byte	0x14a80
+	.8byte	.LBB1697
+	.8byte	.LBE1697-.LBB1697
 	.byte	0x1
-	.2byte	0x90c
+	.2byte	0x90d
 	.4byte	0xf2d4
 	.uleb128 0x55
-	.4byte	0x14a81
+	.4byte	0x14aa8
 	.uleb128 0x55
-	.4byte	0x14a75
+	.4byte	0x14a9c
 	.uleb128 0x55
-	.4byte	0x14a6a
+	.4byte	0x14a91
 	.uleb128 0x5e
-	.4byte	0x14a8e
-	.8byte	.LBB1696
-	.8byte	.LBE1696-.LBB1696
+	.4byte	0x14ab5
+	.8byte	.LBB1698
+	.8byte	.LBE1698-.LBB1698
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ac2
+	.4byte	0x14ae9
 	.uleb128 0x55
-	.4byte	0x14ab6
+	.4byte	0x14add
 	.uleb128 0x55
-	.4byte	0x14aaa
+	.4byte	0x14ad1
 	.uleb128 0x55
-	.4byte	0x14a9f
+	.4byte	0x14ac6
 	.uleb128 0x57
-	.8byte	.LBB1697
-	.8byte	.LBE1697-.LBB1697
+	.8byte	.LBB1699
+	.8byte	.LBE1699-.LBB1699
 	.uleb128 0x58
-	.4byte	0x14acd
+	.4byte	0x14af4
 	.uleb128 0x4f
 	.8byte	.LVL637
-	.4byte	0x1528d
+	.4byte	0x152b4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a59
-	.8byte	.LBB1698
-	.8byte	.LBE1698-.LBB1698
+	.4byte	0x14a80
+	.8byte	.LBB1700
+	.8byte	.LBE1700-.LBB1700
 	.byte	0x1
-	.2byte	0x90f
+	.2byte	0x910
 	.4byte	0xf351
 	.uleb128 0x55
-	.4byte	0x14a81
+	.4byte	0x14aa8
 	.uleb128 0x55
-	.4byte	0x14a75
+	.4byte	0x14a9c
 	.uleb128 0x55
-	.4byte	0x14a6a
+	.4byte	0x14a91
 	.uleb128 0x5e
-	.4byte	0x14a8e
-	.8byte	.LBB1699
-	.8byte	.LBE1699-.LBB1699
+	.4byte	0x14ab5
+	.8byte	.LBB1701
+	.8byte	.LBE1701-.LBB1701
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ac2
+	.4byte	0x14ae9
 	.uleb128 0x55
-	.4byte	0x14ab6
+	.4byte	0x14add
 	.uleb128 0x55
-	.4byte	0x14aaa
+	.4byte	0x14ad1
 	.uleb128 0x55
-	.4byte	0x14a9f
+	.4byte	0x14ac6
 	.uleb128 0x57
-	.8byte	.LBB1700
-	.8byte	.LBE1700-.LBB1700
+	.8byte	.LBB1702
+	.8byte	.LBE1702-.LBB1702
 	.uleb128 0x58
-	.4byte	0x14acd
+	.4byte	0x14af4
 	.uleb128 0x4f
 	.8byte	.LVL638
-	.4byte	0x1528d
+	.4byte	0x152b4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a59
-	.8byte	.LBB1701
-	.8byte	.LBE1701-.LBB1701
+	.4byte	0x14a80
+	.8byte	.LBB1703
+	.8byte	.LBE1703-.LBB1703
 	.byte	0x1
-	.2byte	0x912
+	.2byte	0x913
 	.4byte	0xf3ce
 	.uleb128 0x55
-	.4byte	0x14a81
+	.4byte	0x14aa8
 	.uleb128 0x55
-	.4byte	0x14a75
+	.4byte	0x14a9c
 	.uleb128 0x55
-	.4byte	0x14a6a
+	.4byte	0x14a91
 	.uleb128 0x5e
-	.4byte	0x14a8e
-	.8byte	.LBB1702
-	.8byte	.LBE1702-.LBB1702
+	.4byte	0x14ab5
+	.8byte	.LBB1704
+	.8byte	.LBE1704-.LBB1704
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ac2
+	.4byte	0x14ae9
 	.uleb128 0x55
-	.4byte	0x14ab6
+	.4byte	0x14add
 	.uleb128 0x55
-	.4byte	0x14aaa
+	.4byte	0x14ad1
 	.uleb128 0x55
-	.4byte	0x14a9f
+	.4byte	0x14ac6
 	.uleb128 0x57
-	.8byte	.LBB1703
-	.8byte	.LBE1703-.LBB1703
+	.8byte	.LBB1705
+	.8byte	.LBE1705-.LBB1705
 	.uleb128 0x58
-	.4byte	0x14acd
+	.4byte	0x14af4
 	.uleb128 0x4f
 	.8byte	.LVL639
-	.4byte	0x1528d
+	.4byte	0x152b4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a59
-	.8byte	.LBB1704
-	.8byte	.LBE1704-.LBB1704
+	.4byte	0x14a80
+	.8byte	.LBB1706
+	.8byte	.LBE1706-.LBB1706
 	.byte	0x1
-	.2byte	0x915
+	.2byte	0x916
 	.4byte	0xf44b
 	.uleb128 0x55
-	.4byte	0x14a81
+	.4byte	0x14aa8
 	.uleb128 0x55
-	.4byte	0x14a75
+	.4byte	0x14a9c
 	.uleb128 0x55
-	.4byte	0x14a6a
+	.4byte	0x14a91
 	.uleb128 0x5e
-	.4byte	0x14a8e
-	.8byte	.LBB1705
-	.8byte	.LBE1705-.LBB1705
+	.4byte	0x14ab5
+	.8byte	.LBB1707
+	.8byte	.LBE1707-.LBB1707
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ac2
+	.4byte	0x14ae9
 	.uleb128 0x55
-	.4byte	0x14ab6
+	.4byte	0x14add
 	.uleb128 0x55
-	.4byte	0x14aaa
+	.4byte	0x14ad1
 	.uleb128 0x55
-	.4byte	0x14a9f
+	.4byte	0x14ac6
 	.uleb128 0x57
-	.8byte	.LBB1706
-	.8byte	.LBE1706-.LBB1706
+	.8byte	.LBB1708
+	.8byte	.LBE1708-.LBB1708
 	.uleb128 0x58
-	.4byte	0x14acd
+	.4byte	0x14af4
 	.uleb128 0x4f
 	.8byte	.LVL640
-	.4byte	0x1528d
+	.4byte	0x152b4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14a59
-	.8byte	.LBB1707
-	.8byte	.LBE1707-.LBB1707
+	.4byte	0x14a80
+	.8byte	.LBB1709
+	.8byte	.LBE1709-.LBB1709
 	.byte	0x1
-	.2byte	0x918
+	.2byte	0x919
 	.4byte	0xf4c8
 	.uleb128 0x55
-	.4byte	0x14a81
+	.4byte	0x14aa8
 	.uleb128 0x55
-	.4byte	0x14a75
+	.4byte	0x14a9c
 	.uleb128 0x55
-	.4byte	0x14a6a
+	.4byte	0x14a91
 	.uleb128 0x5e
-	.4byte	0x14a8e
-	.8byte	.LBB1708
-	.8byte	.LBE1708-.LBB1708
+	.4byte	0x14ab5
+	.8byte	.LBB1710
+	.8byte	.LBE1710-.LBB1710
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ac2
+	.4byte	0x14ae9
 	.uleb128 0x55
-	.4byte	0x14ab6
+	.4byte	0x14add
 	.uleb128 0x55
-	.4byte	0x14aaa
+	.4byte	0x14ad1
 	.uleb128 0x55
-	.4byte	0x14a9f
+	.4byte	0x14ac6
 	.uleb128 0x57
-	.8byte	.LBB1709
-	.8byte	.LBE1709-.LBB1709
+	.8byte	.LBB1711
+	.8byte	.LBE1711-.LBB1711
 	.uleb128 0x58
-	.4byte	0x14acd
+	.4byte	0x14af4
 	.uleb128 0x4f
 	.8byte	.LVL641
-	.4byte	0x1528d
+	.4byte	0x152b4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x14a59
-	.8byte	.LBB1710
-	.8byte	.LBE1710-.LBB1710
+	.4byte	0x14a80
+	.8byte	.LBB1712
+	.8byte	.LBE1712-.LBB1712
 	.byte	0x1
-	.2byte	0x91b
+	.2byte	0x91c
 	.uleb128 0x55
-	.4byte	0x14a81
+	.4byte	0x14aa8
 	.uleb128 0x55
-	.4byte	0x14a75
+	.4byte	0x14a9c
 	.uleb128 0x55
-	.4byte	0x14a6a
+	.4byte	0x14a91
 	.uleb128 0x5e
-	.4byte	0x14a8e
-	.8byte	.LBB1711
-	.8byte	.LBE1711-.LBB1711
+	.4byte	0x14ab5
+	.8byte	.LBB1713
+	.8byte	.LBE1713-.LBB1713
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14ac2
+	.4byte	0x14ae9
 	.uleb128 0x55
-	.4byte	0x14ab6
+	.4byte	0x14add
 	.uleb128 0x55
-	.4byte	0x14aaa
+	.4byte	0x14ad1
 	.uleb128 0x55
-	.4byte	0x14a9f
+	.4byte	0x14ac6
 	.uleb128 0x57
-	.8byte	.LBB1712
-	.8byte	.LBE1712-.LBB1712
+	.8byte	.LBB1714
+	.8byte	.LBE1714-.LBB1714
 	.uleb128 0x58
-	.4byte	0x14acd
+	.4byte	0x14af4
 	.uleb128 0x4f
 	.8byte	.LVL642
-	.4byte	0x1528d
+	.4byte	0x152b4
 	.byte	0
 	.byte	0
 	.byte	0
@@ -41420,10 +41456,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xfea7
-	.8byte	.LBB1719
+	.8byte	.LBB1721
 	.4byte	.Ldebug_ranges0+0xd80
 	.byte	0x1
-	.2byte	0xbfc
+	.2byte	0xbfd
 	.4byte	0xf645
 	.uleb128 0x55
 	.4byte	0xfeb8
@@ -41450,61 +41486,61 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	0xff16
 	.uleb128 0x5c
-	.4byte	0x14b6e
-	.8byte	.LBB1721
+	.4byte	0x14b95
+	.8byte	.LBB1723
 	.4byte	.Ldebug_ranges0+0xdf0
 	.byte	0x1
-	.2byte	0xaec
+	.2byte	0xaed
 	.4byte	0xf5b3
 	.uleb128 0x55
-	.4byte	0x14b7e
+	.4byte	0x14ba5
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14b38
-	.8byte	.LBB1725
+	.4byte	0x14b5f
+	.8byte	.LBB1727
 	.4byte	.Ldebug_ranges0+0xe20
 	.byte	0x1
-	.2byte	0xb0b
+	.2byte	0xb0c
 	.4byte	0xf5e8
 	.uleb128 0x55
-	.4byte	0x14b61
+	.4byte	0x14b88
 	.uleb128 0x55
-	.4byte	0x14b55
+	.4byte	0x14b7c
 	.uleb128 0x55
-	.4byte	0x14b49
+	.4byte	0x14b70
 	.uleb128 0x4f
 	.8byte	.LVL648
-	.4byte	0x15280
+	.4byte	0x152a7
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL644
-	.4byte	0x1529a
+	.4byte	0x152c1
 	.uleb128 0x4f
 	.8byte	.LVL645
-	.4byte	0x152a7
+	.4byte	0x152ce
 	.uleb128 0x4f
 	.8byte	.LVL646
-	.4byte	0x152b3
+	.4byte	0x152da
 	.uleb128 0x4f
 	.8byte	.LVL647
-	.4byte	0x152bf
+	.4byte	0x152e6
 	.uleb128 0x4f
 	.8byte	.LVL649
-	.4byte	0x152cb
+	.4byte	0x152f2
 	.uleb128 0x4f
 	.8byte	.LVL650
-	.4byte	0x152d5
+	.4byte	0x152fc
 	.uleb128 0x4f
 	.8byte	.LVL663
-	.4byte	0x152e1
+	.4byte	0x15308
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xff21
-	.8byte	.LBB1736
+	.8byte	.LBB1738
 	.4byte	.Ldebug_ranges0+0xe50
 	.byte	0x1
-	.2byte	0xc03
+	.2byte	0xc04
 	.4byte	0xf71e
 	.uleb128 0x55
 	.4byte	0xff32
@@ -41530,47 +41566,47 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	0xff84
 	.uleb128 0x5c
-	.4byte	0x14b6e
-	.8byte	.LBB1738
+	.4byte	0x14b95
+	.8byte	.LBB1740
 	.4byte	.Ldebug_ranges0+0xea0
 	.byte	0x1
-	.2byte	0xabc
+	.2byte	0xabd
 	.4byte	0xf6b4
 	.uleb128 0x55
-	.4byte	0x14b7e
+	.4byte	0x14ba5
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL652
-	.4byte	0x1529a
+	.4byte	0x152c1
 	.uleb128 0x4f
 	.8byte	.LVL653
-	.4byte	0x152a7
+	.4byte	0x152ce
 	.uleb128 0x4f
 	.8byte	.LVL667
-	.4byte	0x152b3
+	.4byte	0x152da
 	.uleb128 0x4f
 	.8byte	.LVL668
-	.4byte	0x152ee
+	.4byte	0x15315
 	.uleb128 0x4f
 	.8byte	.LVL754
-	.4byte	0x152e1
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL755
-	.4byte	0x152fa
+	.4byte	0x15321
 	.uleb128 0x4f
 	.8byte	.LVL756
-	.4byte	0x152e1
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL769
-	.4byte	0x152e1
+	.4byte	0x15308
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xfe6f
-	.8byte	.LBB1747
+	.8byte	.LBB1749
 	.4byte	.Ldebug_ranges0+0xed0
 	.byte	0x1
-	.2byte	0xc0a
+	.2byte	0xc0b
 	.4byte	0xf8b8
 	.uleb128 0x55
 	.4byte	0xfe80
@@ -41582,53 +41618,53 @@ __exitcall_ebc_exit:
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5c
-	.4byte	0x14d33
-	.8byte	.LBB1749
+	.4byte	0x14d5a
+	.8byte	.LBB1751
 	.4byte	.Ldebug_ranges0+0xf10
 	.byte	0x1
-	.2byte	0xb18
+	.2byte	0xb19
 	.4byte	0xf7a5
 	.uleb128 0x55
-	.4byte	0x14d40
+	.4byte	0x14d67
 	.uleb128 0x57
-	.8byte	.LBB1751
-	.8byte	.LBE1751-.LBB1751
+	.8byte	.LBB1753
+	.8byte	.LBE1753-.LBB1753
 	.uleb128 0x58
-	.4byte	0x14d6c
+	.4byte	0x14d93
 	.uleb128 0x5d
-	.4byte	0x14f18
-	.8byte	.LBB1752
-	.8byte	.LBE1752-.LBB1752
+	.4byte	0x14f3f
+	.8byte	.LBB1754
+	.8byte	.LBE1754-.LBB1754
 	.byte	0xf
 	.byte	0x1c
 	.uleb128 0x55
-	.4byte	0x14f3b
+	.4byte	0x14f62
 	.uleb128 0x55
-	.4byte	0x14f2f
+	.4byte	0x14f56
 	.uleb128 0x55
-	.4byte	0x14f25
+	.4byte	0x14f4c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14e54
-	.8byte	.LBB1756
-	.8byte	.LBE1756-.LBB1756
+	.4byte	0x14e7b
+	.8byte	.LBB1758
+	.8byte	.LBE1758-.LBB1758
 	.byte	0x1
-	.2byte	0xb22
+	.2byte	0xb23
 	.4byte	0xf7f0
 	.uleb128 0x55
-	.4byte	0x14e6a
+	.4byte	0x14e91
 	.uleb128 0x55
-	.4byte	0x14e61
+	.4byte	0x14e88
 	.uleb128 0x57
-	.8byte	.LBB1757
-	.8byte	.LBE1757-.LBB1757
+	.8byte	.LBB1759
+	.8byte	.LBE1759-.LBB1759
 	.uleb128 0x61
-	.4byte	0x14e73
+	.4byte	0x14e9a
 	.4byte	.LLST205
 	.uleb128 0x61
-	.4byte	0x14e7d
+	.4byte	0x14ea4
 	.4byte	.LLST206
 	.byte	0
 	.byte	0
@@ -41640,104 +41676,104 @@ __exitcall_ebc_exit:
 	.4byte	.LLST207
 	.uleb128 0x4f
 	.8byte	.LVL676
-	.4byte	0x15306
+	.4byte	0x1532d
 	.uleb128 0x4f
 	.8byte	.LVL678
-	.4byte	0x15312
+	.4byte	0x15339
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14e54
-	.8byte	.LBB1760
-	.8byte	.LBE1760-.LBB1760
+	.4byte	0x14e7b
+	.8byte	.LBB1762
+	.8byte	.LBE1762-.LBB1762
 	.byte	0x1
-	.2byte	0xb2b
+	.2byte	0xb2c
 	.4byte	0xf868
 	.uleb128 0x55
-	.4byte	0x14e6a
+	.4byte	0x14e91
 	.uleb128 0x55
-	.4byte	0x14e61
+	.4byte	0x14e88
 	.uleb128 0x57
-	.8byte	.LBB1761
-	.8byte	.LBE1761-.LBB1761
+	.8byte	.LBB1763
+	.8byte	.LBE1763-.LBB1763
 	.uleb128 0x61
-	.4byte	0x14e73
+	.4byte	0x14e9a
 	.4byte	.LLST208
 	.uleb128 0x61
-	.4byte	0x14e7d
+	.4byte	0x14ea4
 	.4byte	.LLST209
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL669
-	.4byte	0x1531f
+	.4byte	0x15346
 	.uleb128 0x4f
 	.8byte	.LVL670
-	.4byte	0x15306
+	.4byte	0x1532d
 	.uleb128 0x4f
 	.8byte	.LVL671
-	.4byte	0x1532c
+	.4byte	0x15353
 	.uleb128 0x4f
 	.8byte	.LVL679
-	.4byte	0x1532c
+	.4byte	0x15353
 	.uleb128 0x4f
 	.8byte	.LVL759
-	.4byte	0x152e1
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL763
-	.4byte	0x152e1
+	.4byte	0x15308
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0xfe55
-	.8byte	.LBB1764
-	.8byte	.LBE1764-.LBB1764
+	.8byte	.LBB1766
+	.8byte	.LBE1766-.LBB1766
 	.byte	0x1
-	.2byte	0xc11
+	.2byte	0xc12
 	.4byte	0xf952
 	.uleb128 0x55
 	.4byte	0xfe62
 	.uleb128 0x5c
-	.4byte	0x14791
-	.8byte	.LBB1766
+	.4byte	0x147b8
+	.8byte	.LBB1768
 	.4byte	.Ldebug_ranges0+0xf70
 	.byte	0x1
-	.2byte	0xb3b
+	.2byte	0xb3c
 	.4byte	0xf91d
 	.uleb128 0x55
-	.4byte	0x147b6
+	.4byte	0x147dd
 	.uleb128 0x55
-	.4byte	0x147aa
+	.4byte	0x147d1
 	.uleb128 0x55
-	.4byte	0x1479e
+	.4byte	0x147c5
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xf70
 	.uleb128 0x61
-	.4byte	0x147c2
+	.4byte	0x147e9
 	.4byte	.LLST210
 	.uleb128 0x4f
 	.8byte	.LVL686
-	.4byte	0x15339
+	.4byte	0x15360
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL687
-	.4byte	0x15345
+	.4byte	0x1536c
 	.uleb128 0x4f
 	.8byte	.LVL688
-	.4byte	0x15351
+	.4byte	0x15378
 	.uleb128 0x4f
 	.8byte	.LVL689
-	.4byte	0x15345
+	.4byte	0x1536c
 	.uleb128 0x4f
 	.8byte	.LVL690
-	.4byte	0x15351
+	.4byte	0x15378
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xfdb3
-	.8byte	.LBB1776
+	.8byte	.LBB1778
 	.4byte	.Ldebug_ranges0+0xfd0
 	.byte	0x1
-	.2byte	0xc14
+	.2byte	0xc15
 	.4byte	0xfbf5
 	.uleb128 0x55
 	.4byte	0xfdd0
@@ -41775,460 +41811,460 @@ __exitcall_ebc_exit:
 	.4byte	.LLST218
 	.uleb128 0x54
 	.4byte	0x11882
-	.8byte	.LBB1778
-	.8byte	.LBE1778-.LBB1778
+	.8byte	.LBB1780
+	.8byte	.LBE1780-.LBB1780
 	.byte	0x1
-	.2byte	0xb73
+	.2byte	0xb74
 	.4byte	0xfa34
 	.uleb128 0x55
 	.4byte	0x11893
 	.uleb128 0x55
 	.4byte	0x11893
 	.uleb128 0x57
-	.8byte	.LBB1779
-	.8byte	.LBE1779-.LBB1779
+	.8byte	.LBB1781
+	.8byte	.LBE1781-.LBB1781
 	.uleb128 0x61
 	.4byte	0x1189f
 	.4byte	.LLST219
 	.uleb128 0x4f
 	.8byte	.LVL707
-	.4byte	0x1535d
+	.4byte	0x15384
 	.uleb128 0x4f
 	.8byte	.LVL709
-	.4byte	0x152d5
+	.4byte	0x152fc
 	.uleb128 0x4f
 	.8byte	.LVL710
-	.4byte	0x15369
+	.4byte	0x15390
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14918
-	.8byte	.LBB1780
-	.8byte	.LBE1780-.LBB1780
+	.4byte	0x1493f
+	.8byte	.LBB1782
+	.8byte	.LBE1782-.LBB1782
 	.byte	0x1
-	.2byte	0xb59
+	.2byte	0xb5a
 	.4byte	0xfa8b
 	.uleb128 0x55
-	.4byte	0x14935
+	.4byte	0x1495c
 	.uleb128 0x55
-	.4byte	0x14929
+	.4byte	0x14950
 	.uleb128 0x5e
-	.4byte	0x14942
-	.8byte	.LBB1781
-	.8byte	.LBE1781-.LBB1781
+	.4byte	0x14969
+	.8byte	.LBB1783
+	.8byte	.LBE1783-.LBB1783
 	.byte	0x11
 	.2byte	0x2e7
 	.uleb128 0x55
-	.4byte	0x1495f
+	.4byte	0x14986
 	.uleb128 0x55
-	.4byte	0x14953
+	.4byte	0x1497a
 	.uleb128 0x4f
 	.8byte	.LVL727
-	.4byte	0x15375
+	.4byte	0x1539c
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14918
-	.8byte	.LBB1783
-	.8byte	.LBE1783-.LBB1783
+	.4byte	0x1493f
+	.8byte	.LBB1785
+	.8byte	.LBE1785-.LBB1785
 	.byte	0x1
-	.2byte	0xb67
+	.2byte	0xb68
 	.4byte	0xfae2
 	.uleb128 0x55
-	.4byte	0x14935
+	.4byte	0x1495c
 	.uleb128 0x55
-	.4byte	0x14929
+	.4byte	0x14950
 	.uleb128 0x5e
-	.4byte	0x14942
-	.8byte	.LBB1784
-	.8byte	.LBE1784-.LBB1784
+	.4byte	0x14969
+	.8byte	.LBB1786
+	.8byte	.LBE1786-.LBB1786
 	.byte	0x11
 	.2byte	0x2e7
 	.uleb128 0x55
-	.4byte	0x1495f
+	.4byte	0x14986
 	.uleb128 0x55
-	.4byte	0x14953
+	.4byte	0x1497a
 	.uleb128 0x4f
 	.8byte	.LVL740
-	.4byte	0x15375
+	.4byte	0x1539c
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL692
-	.4byte	0x15382
+	.4byte	0x153a9
 	.uleb128 0x4f
 	.8byte	.LVL694
-	.4byte	0x15382
+	.4byte	0x153a9
 	.uleb128 0x4f
 	.8byte	.LVL696
-	.4byte	0x1538e
+	.4byte	0x153b5
 	.uleb128 0x4f
 	.8byte	.LVL701
-	.4byte	0x1538e
+	.4byte	0x153b5
 	.uleb128 0x4f
 	.8byte	.LVL705
-	.4byte	0x15267
+	.4byte	0x1528e
 	.uleb128 0x4f
 	.8byte	.LVL706
-	.4byte	0x1539b
+	.4byte	0x153c2
 	.uleb128 0x4f
 	.8byte	.LVL711
-	.4byte	0x153a7
+	.4byte	0x153ce
 	.uleb128 0x4f
 	.8byte	.LVL712
-	.4byte	0x153a7
+	.4byte	0x153ce
 	.uleb128 0x4f
 	.8byte	.LVL724
-	.4byte	0x153b3
+	.4byte	0x153da
 	.uleb128 0x4f
 	.8byte	.LVL726
-	.4byte	0x15267
+	.4byte	0x1528e
 	.uleb128 0x4f
 	.8byte	.LVL731
-	.4byte	0x153bf
+	.4byte	0x153e6
 	.uleb128 0x4f
 	.8byte	.LVL734
-	.4byte	0x1535d
+	.4byte	0x15384
 	.uleb128 0x4f
 	.8byte	.LVL736
-	.4byte	0x153bf
+	.4byte	0x153e6
 	.uleb128 0x4f
 	.8byte	.LVL737
-	.4byte	0x15369
+	.4byte	0x15390
 	.uleb128 0x4f
 	.8byte	.LVL739
-	.4byte	0x15267
+	.4byte	0x1528e
 	.uleb128 0x4f
 	.8byte	.LVL743
-	.4byte	0x153bf
+	.4byte	0x153e6
 	.uleb128 0x4f
 	.8byte	.LVL746
-	.4byte	0x1535d
+	.4byte	0x15384
 	.uleb128 0x4f
 	.8byte	.LVL748
-	.4byte	0x153bf
+	.4byte	0x153e6
 	.uleb128 0x4f
 	.8byte	.LVL749
-	.4byte	0x15369
+	.4byte	0x15390
 	.uleb128 0x4f
 	.8byte	.LVL774
-	.4byte	0x152e1
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL777
-	.4byte	0x152e1
+	.4byte	0x15308
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x149ec
-	.8byte	.LBB1789
-	.8byte	.LBE1789-.LBB1789
+	.4byte	0x14a13
+	.8byte	.LBB1791
+	.8byte	.LBE1791-.LBB1791
 	.byte	0x1
-	.2byte	0xc16
+	.2byte	0xc17
 	.4byte	0xfc3e
 	.uleb128 0x55
-	.4byte	0x14a05
+	.4byte	0x14a2c
 	.uleb128 0x55
-	.4byte	0x149f9
+	.4byte	0x14a20
 	.uleb128 0x5d
-	.4byte	0x14af4
-	.8byte	.LBB1790
-	.8byte	.LBE1790-.LBB1790
+	.4byte	0x14b1b
+	.8byte	.LBB1792
+	.8byte	.LBE1792-.LBB1792
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x55
-	.4byte	0x14b0d
+	.4byte	0x14b34
 	.uleb128 0x55
-	.4byte	0x14b01
+	.4byte	0x14b28
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0xffa7
-	.8byte	.LBB1792
-	.8byte	.LBE1792-.LBB1792
+	.8byte	.LBB1794
+	.8byte	.LBE1794-.LBB1794
 	.byte	0x1
-	.2byte	0xc19
+	.2byte	0xc1a
 	.4byte	0xfcd5
 	.uleb128 0x55
 	.4byte	0xffb8
 	.uleb128 0x4f
 	.8byte	.LVL713
-	.4byte	0x153c9
+	.4byte	0x153f0
 	.uleb128 0x4f
 	.8byte	.LVL714
-	.4byte	0x153c9
+	.4byte	0x153f0
 	.uleb128 0x4f
 	.8byte	.LVL715
-	.4byte	0x153d5
+	.4byte	0x153fc
 	.uleb128 0x4f
 	.8byte	.LVL716
-	.4byte	0x153d5
+	.4byte	0x153fc
 	.uleb128 0x4f
 	.8byte	.LVL717
-	.4byte	0x153d5
+	.4byte	0x153fc
 	.uleb128 0x4f
 	.8byte	.LVL718
-	.4byte	0x153d5
+	.4byte	0x153fc
 	.uleb128 0x4f
 	.8byte	.LVL719
-	.4byte	0x153d5
+	.4byte	0x153fc
 	.uleb128 0x4f
 	.8byte	.LVL720
-	.4byte	0x153d5
+	.4byte	0x153fc
 	.uleb128 0x4f
 	.8byte	.LVL721
-	.4byte	0x153d5
+	.4byte	0x153fc
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL599
-	.4byte	0x1529a
+	.4byte	0x152c1
 	.uleb128 0x4f
 	.8byte	.LVL600
-	.4byte	0x153e2
+	.4byte	0x15409
 	.uleb128 0x4f
 	.8byte	.LVL602
-	.4byte	0x153ee
+	.4byte	0x15415
 	.uleb128 0x4f
 	.8byte	.LVL608
-	.4byte	0x153fb
+	.4byte	0x15422
 	.uleb128 0x4f
 	.8byte	.LVL611
-	.4byte	0x15408
+	.4byte	0x1542f
 	.uleb128 0x4f
 	.8byte	.LVL612
-	.4byte	0x152e1
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL620
-	.4byte	0x15267
+	.4byte	0x1528e
 	.uleb128 0x4f
 	.8byte	.LVL654
-	.4byte	0x152e1
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL656
-	.4byte	0x152e1
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL659
-	.4byte	0x152e1
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL661
-	.4byte	0x152e1
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL664
-	.4byte	0x152e1
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL722
-	.4byte	0x15267
+	.4byte	0x1528e
 	.uleb128 0x4f
 	.8byte	.LVL752
-	.4byte	0x152e1
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL760
-	.4byte	0x152e1
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL765
-	.4byte	0x152e1
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL779
-	.4byte	0x15415
+	.4byte	0x1543c
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0xb47
+	.2byte	0xb48
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfe55
 	.uleb128 0x65
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xb47
+	.2byte	0xb48
 	.4byte	0xe557
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xb47
+	.2byte	0xb48
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xb49
+	.2byte	0xb4a
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0xb4a
+	.2byte	0xb4b
 	.4byte	0x6d
 	.uleb128 0x48
 	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0xb4b
+	.2byte	0xb4c
 	.4byte	0x6d
 	.uleb128 0x48
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0xb4c
+	.2byte	0xb4d
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0xb4d
+	.2byte	0xb4e
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0xb4e
+	.2byte	0xb4f
 	.4byte	0x21e
 	.uleb128 0x48
 	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0xb4f
+	.2byte	0xb50
 	.4byte	0x21e
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xb50
+	.2byte	0xb51
 	.4byte	0xe4f2
 	.uleb128 0x48
 	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0xb51
+	.2byte	0xb52
 	.4byte	0x458
 	.uleb128 0x48
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0xb52
+	.2byte	0xb53
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0xb30
+	.2byte	0xb31
 	.byte	0x1
 	.4byte	0xfe6f
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xb30
+	.2byte	0xb31
 	.4byte	0xe874
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0xb14
+	.2byte	0xb15
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfea7
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xb14
+	.2byte	0xb15
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF2480
 	.byte	0x1
-	.2byte	0xb16
+	.2byte	0xb17
 	.4byte	0xd88a
 	.uleb128 0x68
 	.uleb128 0x53
 	.string	"__k"
 	.byte	0x1
-	.2byte	0xb25
+	.2byte	0xb26
 	.4byte	0x2f05
 	.byte	0
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0xad5
+	.2byte	0xad6
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xff21
 	.uleb128 0x65
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xad5
+	.2byte	0xad6
 	.4byte	0xe557
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xad7
+	.2byte	0xad8
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xad8
+	.2byte	0xad9
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xad9
+	.2byte	0xada
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0xada
+	.2byte	0xadb
 	.4byte	0xb904
 	.uleb128 0x53
 	.string	"r"
 	.byte	0x1
-	.2byte	0xadb
+	.2byte	0xadc
 	.4byte	0x97bc
 	.uleb128 0x48
 	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0xadc
+	.2byte	0xadd
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xadd
+	.2byte	0xade
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0xadd
+	.2byte	0xade
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0xaa9
+	.2byte	0xaaa
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xff92
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xaa9
+	.2byte	0xaaa
 	.4byte	0xe874
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xaab
+	.2byte	0xaac
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xaac
+	.2byte	0xaad
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0xaad
+	.2byte	0xaae
 	.4byte	0xb904
 	.uleb128 0x53
 	.string	"r"
 	.byte	0x1
-	.2byte	0xaae
+	.2byte	0xaaf
 	.4byte	0x97bc
 	.uleb128 0x48
 	.4byte	.LASF2982
 	.byte	0x1
-	.2byte	0xaaf
+	.2byte	0xab0
 	.4byte	0x29
 	.uleb128 0x48
 	.4byte	.LASF2983
 	.byte	0x1
-	.2byte	0xab0
+	.2byte	0xab1
 	.4byte	0xc6
 	.uleb128 0x69
 	.4byte	.LASF3050
@@ -42247,20 +42283,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x64
 	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0xa99
+	.2byte	0xa9a
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xffc5
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xa99
+	.2byte	0xa9a
 	.4byte	0xe874
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0xa90
+	.2byte	0xa91
 	.4byte	0x2ee
 	.8byte	.LFB2855
 	.8byte	.LFE2855-.LFB2855
@@ -42270,29 +42306,29 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa90
+	.2byte	0xa91
 	.4byte	0xa5e0
 	.4byte	.LLST78
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa91
+	.2byte	0xa92
 	.4byte	0xb45b
 	.4byte	.LLST79
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa92
+	.2byte	0xa93
 	.4byte	0x21e
 	.4byte	.LLST80
 	.uleb128 0x4f
 	.8byte	.LVL309
-	.4byte	0x1541f
+	.4byte	0x15446
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0xa87
+	.2byte	0xa88
 	.4byte	0x2ee
 	.8byte	.LFB2854
 	.8byte	.LFE2854-.LFB2854
@@ -42302,29 +42338,29 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa87
+	.2byte	0xa88
 	.4byte	0xa5e0
 	.4byte	.LLST81
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa88
+	.2byte	0xa89
 	.4byte	0xb45b
 	.4byte	.LLST82
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa89
+	.2byte	0xa8a
 	.4byte	0x21e
 	.4byte	.LLST83
 	.uleb128 0x4f
 	.8byte	.LVL314
-	.4byte	0x1542b
+	.4byte	0x15452
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0xa7e
+	.2byte	0xa7f
 	.4byte	0x2ee
 	.8byte	.LFB2853
 	.8byte	.LFE2853-.LFB2853
@@ -42334,29 +42370,29 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa7e
+	.2byte	0xa7f
 	.4byte	0xa5e0
 	.4byte	.LLST84
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa7f
+	.2byte	0xa80
 	.4byte	0xb45b
 	.4byte	.LLST85
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa80
+	.2byte	0xa81
 	.4byte	0x21e
 	.4byte	.LLST86
 	.uleb128 0x4f
 	.8byte	.LVL319
-	.4byte	0x1542b
+	.4byte	0x15452
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0xa66
+	.2byte	0xa67
 	.4byte	0x2ee
 	.8byte	.LFB2852
 	.8byte	.LFE2852-.LFB2852
@@ -42366,64 +42402,64 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa66
+	.2byte	0xa67
 	.4byte	0xa5e0
 	.4byte	.LLST96
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa67
+	.2byte	0xa68
 	.4byte	0xb45b
 	.4byte	.LLST97
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa68
+	.2byte	0xa69
 	.4byte	0x56
 	.4byte	.LLST98
 	.uleb128 0x59
 	.4byte	.LASF383
 	.byte	0x1
-	.2byte	0xa68
+	.2byte	0xa69
 	.4byte	0x2e3
 	.4byte	.LLST99
 	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa6a
+	.2byte	0xa6b
 	.4byte	0xe557
 	.4byte	.LLST100
 	.uleb128 0x5a
 	.4byte	.LASF2470
 	.byte	0x1
-	.2byte	0xa6b
+	.2byte	0xa6c
 	.4byte	0xc6
 	.4byte	.LLST101
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xa6b
+	.2byte	0xa6c
 	.4byte	0xc6
 	.uleb128 0x4f
 	.8byte	.LVL345
-	.4byte	0x15438
+	.4byte	0x1545f
 	.uleb128 0x4f
 	.8byte	.LVL347
-	.4byte	0x15445
+	.4byte	0x1546c
 	.uleb128 0x4f
 	.8byte	.LVL352
-	.4byte	0x152e1
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL355
-	.4byte	0x152e1
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL356
-	.4byte	0x15415
+	.4byte	0x1543c
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0xa5a
+	.2byte	0xa5b
 	.4byte	0x2ee
 	.8byte	.LFB2851
 	.8byte	.LFE2851-.LFB2851
@@ -42433,49 +42469,49 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa5a
+	.2byte	0xa5b
 	.4byte	0xa5e0
 	.4byte	.LLST87
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa5b
+	.2byte	0xa5c
 	.4byte	0xb45b
 	.4byte	.LLST88
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa5c
+	.2byte	0xa5d
 	.4byte	0x21e
 	.4byte	.LLST89
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa5e
+	.2byte	0xa5f
 	.4byte	0xe557
 	.uleb128 0x48
 	.4byte	.LASF2470
 	.byte	0x1
-	.2byte	0xa5f
+	.2byte	0xa60
 	.4byte	0xc6
 	.uleb128 0x54
-	.4byte	0x1469f
-	.8byte	.LBB1232
-	.8byte	.LBE1232-.LBB1232
+	.4byte	0x146c6
+	.8byte	.LBB1234
+	.8byte	.LBE1234-.LBB1234
 	.byte	0x1
-	.2byte	0xa61
+	.2byte	0xa62
 	.4byte	0x10241
 	.uleb128 0x55
-	.4byte	0x146af
+	.4byte	0x146d6
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL324
-	.4byte	0x1542b
+	.4byte	0x15452
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0xa4c
+	.2byte	0xa4d
 	.4byte	0x2ee
 	.8byte	.LFB2850
 	.8byte	.LFE2850-.LFB2850
@@ -42485,57 +42521,57 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa4c
+	.2byte	0xa4d
 	.4byte	0xa5e0
 	.4byte	.LLST90
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa4d
+	.2byte	0xa4e
 	.4byte	0xb45b
 	.4byte	.LLST91
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa4e
+	.2byte	0xa4f
 	.4byte	0x21e
 	.4byte	.LLST92
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa50
+	.2byte	0xa51
 	.4byte	0xe557
 	.uleb128 0x6a
 	.string	"t"
 	.byte	0x1
-	.2byte	0xa51
+	.2byte	0xa52
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x5c
-	.4byte	0x146bc
-	.8byte	.LBB1234
+	.4byte	0x146e3
+	.8byte	.LBB1236
 	.4byte	.Ldebug_ranges0+0x6a0
 	.byte	0x1
-	.2byte	0xa53
+	.2byte	0xa54
 	.4byte	0x102dd
 	.uleb128 0x55
-	.4byte	0x146d8
+	.4byte	0x146ff
 	.uleb128 0x55
-	.4byte	0x146cc
+	.4byte	0x146f3
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL331
-	.4byte	0x1542b
+	.4byte	0x15452
 	.uleb128 0x4f
 	.8byte	.LVL334
-	.4byte	0x15415
+	.4byte	0x1543c
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0xa41
+	.2byte	0xa42
 	.4byte	0x2ee
 	.8byte	.LFB2849
 	.8byte	.LFE2849-.LFB2849
@@ -42545,34 +42581,34 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa41
+	.2byte	0xa42
 	.4byte	0xa5e0
 	.4byte	.LLST93
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa42
+	.2byte	0xa43
 	.4byte	0xb45b
 	.4byte	.LLST94
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa43
+	.2byte	0xa44
 	.4byte	0x21e
 	.4byte	.LLST95
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa45
+	.2byte	0xa46
 	.4byte	0xe557
 	.uleb128 0x4f
 	.8byte	.LVL339
-	.4byte	0x1542b
+	.4byte	0x15452
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0xa36
+	.2byte	0xa37
 	.4byte	0x2ee
 	.8byte	.LFB2848
 	.8byte	.LFE2848-.LFB2848
@@ -42582,55 +42618,55 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa36
+	.2byte	0xa37
 	.4byte	0xa5e0
 	.4byte	.LLST102
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa37
+	.2byte	0xa38
 	.4byte	0xb45b
 	.4byte	.LLST103
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa38
+	.2byte	0xa39
 	.4byte	0x21e
 	.4byte	.LLST104
 	.uleb128 0x48
 	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0xa3a
+	.2byte	0xa3b
 	.4byte	0x56
 	.uleb128 0x4f
 	.8byte	.LVL358
-	.4byte	0x15451
+	.4byte	0x15478
 	.uleb128 0x4f
 	.8byte	.LVL359
-	.4byte	0x1542b
+	.4byte	0x15452
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0xa23
+	.2byte	0xa24
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x10407
 	.uleb128 0x66
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0xa23
+	.2byte	0xa24
 	.4byte	0x1c7f
 	.uleb128 0x66
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0xa23
+	.2byte	0xa24
 	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0xa13
+	.2byte	0xa14
 	.4byte	0xc6
 	.8byte	.LFB2846
 	.8byte	.LFE2846-.LFB2846
@@ -42640,50 +42676,50 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0xa13
+	.2byte	0xa14
 	.4byte	0x55cc
 	.4byte	.LLST16
 	.uleb128 0x52
 	.string	"vma"
 	.byte	0x1
-	.2byte	0xa13
+	.2byte	0xa14
 	.4byte	0x3d25
 	.4byte	.LLST17
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xa15
+	.2byte	0xa16
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF898
 	.byte	0x1
-	.2byte	0xa16
+	.2byte	0xa17
 	.4byte	0x29
 	.uleb128 0x4f
 	.8byte	.LVL82
-	.4byte	0x1545d
+	.4byte	0x15484
 	.byte	0
 	.uleb128 0x6b
 	.4byte	.LASF3085
 	.byte	0x1
-	.2byte	0x9fc
+	.2byte	0x9fd
 	.4byte	0xc6
 	.4byte	0x10498
 	.uleb128 0x66
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0x9fc
+	.2byte	0x9fd
 	.4byte	0x1c7f
 	.uleb128 0x66
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x9fc
+	.2byte	0x9fd
 	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0x9ed
+	.2byte	0x9ee
 	.4byte	0xc6
 	.8byte	.LFB2844
 	.8byte	.LFE2844-.LFB2844
@@ -42693,31 +42729,31 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x9ed
+	.2byte	0x9ee
 	.4byte	0x55cc
 	.4byte	.LLST14
 	.uleb128 0x52
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x9ed
+	.2byte	0x9ee
 	.4byte	0x3d25
 	.4byte	.LLST15
 	.uleb128 0x48
 	.4byte	.LASF898
 	.byte	0x1
-	.2byte	0x9ef
+	.2byte	0x9f0
 	.4byte	0x29
 	.uleb128 0x4f
 	.8byte	.LVL76
-	.4byte	0x1546a
+	.4byte	0x15491
 	.uleb128 0x4f
 	.8byte	.LVL77
-	.4byte	0x1545d
+	.4byte	0x15484
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3087
 	.byte	0x1
-	.2byte	0x921
+	.2byte	0x922
 	.4byte	0x199
 	.8byte	.LFB2843
 	.8byte	.LFE2843-.LFB2843
@@ -42727,40 +42763,40 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x921
+	.2byte	0x922
 	.4byte	0x55cc
 	.4byte	.LLST18
 	.uleb128 0x52
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0x921
+	.2byte	0x922
 	.4byte	0x6d
 	.4byte	.LLST19
 	.uleb128 0x52
 	.string	"arg"
 	.byte	0x1
-	.2byte	0x921
+	.2byte	0x922
 	.4byte	0x29
 	.4byte	.LLST20
 	.uleb128 0x48
 	.4byte	.LASF3088
 	.byte	0x1
-	.2byte	0x923
+	.2byte	0x924
 	.4byte	0x458
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x924
+	.2byte	0x925
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x925
+	.2byte	0x926
 	.4byte	0xe874
 	.uleb128 0x4d
 	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x926
+	.2byte	0x927
 	.4byte	0xda8e
 	.uleb128 0x2
 	.byte	0x91
@@ -42768,22 +42804,22 @@ __exitcall_ebc_exit:
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x927
+	.2byte	0x928
 	.4byte	0xe4f2
 	.uleb128 0x48
 	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x928
+	.2byte	0x929
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x929
+	.2byte	0x92a
 	.4byte	0x29
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x92a
+	.2byte	0x92b
 	.4byte	0xc6
 	.uleb128 0x56
 	.4byte	.LASF3050
@@ -42797,19 +42833,19 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x976
+	.2byte	0x977
 	.4byte	0xc6
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1a0
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x976
+	.2byte	0x977
 	.8byte	.L216
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x976
+	.2byte	0x977
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -42817,191 +42853,191 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x976
+	.2byte	0x977
 	.4byte	0x199
 	.uleb128 0x6d
-	.8byte	.LBB1024
-	.8byte	.LBE1024-.LBB1024
+	.8byte	.LBB1026
+	.8byte	.LBE1026-.LBB1026
 	.4byte	0x1064f
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x976
+	.2byte	0x977
 	.4byte	0x199
 	.4byte	.LLST35
 	.uleb128 0x4f
 	.8byte	.LVL127
-	.4byte	0x15476
+	.4byte	0x1549d
 	.uleb128 0x4f
 	.8byte	.LVL128
-	.4byte	0x15482
+	.4byte	0x154a9
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL125
-	.4byte	0x1548f
+	.4byte	0x154b6
 	.uleb128 0x4f
 	.8byte	.LVL129
-	.4byte	0x1549b
+	.4byte	0x154c2
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x147cd
-	.8byte	.LBB960
+	.4byte	0x147f4
+	.8byte	.LBB962
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x9df
+	.2byte	0x9e0
 	.4byte	0x1088b
 	.uleb128 0x55
-	.4byte	0x147f3
+	.4byte	0x1481a
 	.uleb128 0x55
-	.4byte	0x147e7
+	.4byte	0x1480e
 	.uleb128 0x55
-	.4byte	0x147dd
+	.4byte	0x14804
 	.uleb128 0x6e
-	.4byte	0x1482d
-	.8byte	.LBB961
+	.4byte	0x14854
+	.8byte	.LBB963
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x14853
+	.4byte	0x1487a
 	.uleb128 0x55
-	.4byte	0x14847
+	.4byte	0x1486e
 	.uleb128 0x55
-	.4byte	0x1483d
+	.4byte	0x14864
 	.uleb128 0x6f
-	.4byte	0x148cc
-	.8byte	.LBB963
+	.4byte	0x148f3
+	.8byte	.LBB965
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x107c1
 	.uleb128 0x55
-	.4byte	0x148e8
+	.4byte	0x1490f
 	.uleb128 0x70
-	.4byte	0x148dc
+	.4byte	0x14903
 	.4byte	.LLST21
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x80
 	.uleb128 0x61
-	.4byte	0x148f4
+	.4byte	0x1491b
 	.4byte	.LLST22
 	.uleb128 0x61
-	.4byte	0x148ff
+	.4byte	0x14926
 	.4byte	.LLST23
 	.uleb128 0x71
-	.4byte	0x14d17
-	.8byte	.LBB965
-	.8byte	.LBE965-.LBB965
+	.4byte	0x14d3e
+	.8byte	.LBB967
+	.8byte	.LBE967-.LBB967
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10727
 	.uleb128 0x57
-	.8byte	.LBB966
-	.8byte	.LBE966-.LBB966
+	.8byte	.LBB968
+	.8byte	.LBE968-.LBB968
 	.uleb128 0x61
-	.4byte	0x14d27
+	.4byte	0x14d4e
 	.4byte	.LLST24
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14cea
-	.8byte	.LBB967
-	.8byte	.LBE967-.LBB967
+	.4byte	0x14d11
+	.8byte	.LBB969
+	.8byte	.LBE969-.LBB969
 	.byte	0x6
 	.byte	0x55
 	.4byte	0x1076f
 	.uleb128 0x55
-	.4byte	0x14d04
+	.4byte	0x14d2b
 	.uleb128 0x55
-	.4byte	0x14cfa
+	.4byte	0x14d21
 	.uleb128 0x5d
-	.4byte	0x14e27
-	.8byte	.LBB968
-	.8byte	.LBE968-.LBB968
+	.4byte	0x14e4e
+	.8byte	.LBB970
+	.8byte	.LBE970-.LBB970
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14e41
+	.4byte	0x14e68
 	.uleb128 0x55
-	.4byte	0x14e37
+	.4byte	0x14e5e
 	.byte	0
 	.byte	0
 	.uleb128 0x57
-	.8byte	.LBB970
-	.8byte	.LBE970-.LBB970
+	.8byte	.LBB972
+	.8byte	.LBE972-.LBB972
 	.uleb128 0x58
-	.4byte	0x1490b
+	.4byte	0x14932
 	.uleb128 0x5d
-	.4byte	0x14d9d
-	.8byte	.LBB971
-	.8byte	.LBE971-.LBB971
+	.4byte	0x14dc4
+	.8byte	.LBB973
+	.8byte	.LBE973-.LBB973
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14db9
+	.4byte	0x14de0
 	.uleb128 0x55
-	.4byte	0x14dad
+	.4byte	0x14dd4
 	.uleb128 0x57
-	.8byte	.LBB972
-	.8byte	.LBE972-.LBB972
+	.8byte	.LBB974
+	.8byte	.LBE974-.LBB974
 	.uleb128 0x58
-	.4byte	0x14dc5
+	.4byte	0x14dec
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14898
-	.8byte	.LBB977
-	.8byte	.LBE977-.LBB977
+	.4byte	0x148bf
+	.8byte	.LBB979
+	.8byte	.LBE979-.LBB979
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x1087c
 	.uleb128 0x55
-	.4byte	0x148a8
+	.4byte	0x148cf
 	.uleb128 0x57
-	.8byte	.LBB978
-	.8byte	.LBE978-.LBB978
+	.8byte	.LBB980
+	.8byte	.LBE980-.LBB980
 	.uleb128 0x61
-	.4byte	0x148b3
+	.4byte	0x148da
 	.4byte	.LLST25
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0xc0
 	.4byte	0x10847
 	.uleb128 0x61
-	.4byte	0x148bf
+	.4byte	0x148e6
 	.4byte	.LLST26
 	.uleb128 0x5d
-	.4byte	0x14d9d
-	.8byte	.LBB980
-	.8byte	.LBE980-.LBB980
+	.4byte	0x14dc4
+	.8byte	.LBB982
+	.8byte	.LBE982-.LBB982
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14db9
+	.4byte	0x14de0
 	.uleb128 0x55
-	.4byte	0x14dad
+	.4byte	0x14dd4
 	.uleb128 0x57
-	.8byte	.LBB981
-	.8byte	.LBE981-.LBB981
+	.8byte	.LBB983
+	.8byte	.LBE983-.LBB983
 	.uleb128 0x58
-	.4byte	0x14dc5
+	.4byte	0x14dec
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d17
-	.8byte	.LBB982
-	.8byte	.LBE982-.LBB982
+	.4byte	0x14d3e
+	.8byte	.LBB984
+	.8byte	.LBE984-.LBB984
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB983
-	.8byte	.LBE983-.LBB983
+	.8byte	.LBB985
+	.8byte	.LBE985-.LBB985
 	.uleb128 0x61
-	.4byte	0x14d27
+	.4byte	0x14d4e
 	.4byte	.LLST27
 	.byte	0
 	.byte	0
@@ -43009,171 +43045,171 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL155
-	.4byte	0x154a8
+	.4byte	0x154cf
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x147fd
-	.8byte	.LBB993
+	.4byte	0x14824
+	.8byte	.LBB995
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
-	.2byte	0x961
+	.2byte	0x962
 	.4byte	0x10ab6
 	.uleb128 0x55
-	.4byte	0x14823
+	.4byte	0x1484a
 	.uleb128 0x55
-	.4byte	0x14817
+	.4byte	0x1483e
 	.uleb128 0x55
-	.4byte	0x1480d
+	.4byte	0x14834
 	.uleb128 0x6e
-	.4byte	0x1485d
-	.8byte	.LBB994
+	.4byte	0x14884
+	.8byte	.LBB996
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x14883
+	.4byte	0x148aa
 	.uleb128 0x55
-	.4byte	0x14877
+	.4byte	0x1489e
 	.uleb128 0x55
-	.4byte	0x1486d
+	.4byte	0x14894
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x58
-	.4byte	0x1488c
+	.4byte	0x148b3
 	.uleb128 0x6f
-	.4byte	0x148cc
-	.8byte	.LBB996
+	.4byte	0x148f3
+	.8byte	.LBB998
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x109eb
 	.uleb128 0x55
-	.4byte	0x148e8
+	.4byte	0x1490f
 	.uleb128 0x70
-	.4byte	0x148dc
+	.4byte	0x14903
 	.4byte	.LLST28
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x130
 	.uleb128 0x61
-	.4byte	0x148f4
+	.4byte	0x1491b
 	.4byte	.LLST29
 	.uleb128 0x61
-	.4byte	0x148ff
+	.4byte	0x14926
 	.4byte	.LLST30
 	.uleb128 0x71
-	.4byte	0x14d17
-	.8byte	.LBB998
-	.8byte	.LBE998-.LBB998
+	.4byte	0x14d3e
+	.8byte	.LBB1000
+	.8byte	.LBE1000-.LBB1000
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10951
 	.uleb128 0x57
-	.8byte	.LBB999
-	.8byte	.LBE999-.LBB999
+	.8byte	.LBB1001
+	.8byte	.LBE1001-.LBB1001
 	.uleb128 0x61
-	.4byte	0x14d27
+	.4byte	0x14d4e
 	.4byte	.LLST31
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1000
-	.8byte	.LBE1000-.LBB1000
+	.8byte	.LBB1002
+	.8byte	.LBE1002-.LBB1002
 	.4byte	0x109a5
 	.uleb128 0x58
-	.4byte	0x1490b
+	.4byte	0x14932
 	.uleb128 0x5d
-	.4byte	0x14d9d
-	.8byte	.LBB1001
-	.8byte	.LBE1001-.LBB1001
+	.4byte	0x14dc4
+	.8byte	.LBB1003
+	.8byte	.LBE1003-.LBB1003
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14db9
+	.4byte	0x14de0
 	.uleb128 0x55
-	.4byte	0x14dad
+	.4byte	0x14dd4
 	.uleb128 0x57
-	.8byte	.LBB1002
-	.8byte	.LBE1002-.LBB1002
+	.8byte	.LBB1004
+	.8byte	.LBE1004-.LBB1004
 	.uleb128 0x58
-	.4byte	0x14dc5
+	.4byte	0x14dec
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14cea
-	.8byte	.LBB1003
-	.8byte	.LBE1003-.LBB1003
+	.4byte	0x14d11
+	.8byte	.LBB1005
+	.8byte	.LBE1005-.LBB1005
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14d04
+	.4byte	0x14d2b
 	.uleb128 0x55
-	.4byte	0x14cfa
+	.4byte	0x14d21
 	.uleb128 0x5d
-	.4byte	0x14e27
-	.8byte	.LBB1004
-	.8byte	.LBE1004-.LBB1004
+	.4byte	0x14e4e
+	.8byte	.LBB1006
+	.8byte	.LBE1006-.LBB1006
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14e41
+	.4byte	0x14e68
 	.uleb128 0x55
-	.4byte	0x14e37
+	.4byte	0x14e5e
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14898
-	.8byte	.LBB1008
-	.8byte	.LBE1008-.LBB1008
+	.4byte	0x148bf
+	.8byte	.LBB1010
+	.8byte	.LBE1010-.LBB1010
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x10aa6
 	.uleb128 0x55
-	.4byte	0x148a8
+	.4byte	0x148cf
 	.uleb128 0x57
-	.8byte	.LBB1009
-	.8byte	.LBE1009-.LBB1009
+	.8byte	.LBB1011
+	.8byte	.LBE1011-.LBB1011
 	.uleb128 0x61
-	.4byte	0x148b3
+	.4byte	0x148da
 	.4byte	.LLST32
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x170
 	.4byte	0x10a71
 	.uleb128 0x61
-	.4byte	0x148bf
+	.4byte	0x148e6
 	.4byte	.LLST33
 	.uleb128 0x5d
-	.4byte	0x14d9d
-	.8byte	.LBB1011
-	.8byte	.LBE1011-.LBB1011
+	.4byte	0x14dc4
+	.8byte	.LBB1013
+	.8byte	.LBE1013-.LBB1013
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14db9
+	.4byte	0x14de0
 	.uleb128 0x55
-	.4byte	0x14dad
+	.4byte	0x14dd4
 	.uleb128 0x57
-	.8byte	.LBB1012
-	.8byte	.LBE1012-.LBB1012
+	.8byte	.LBB1014
+	.8byte	.LBE1014-.LBB1014
 	.uleb128 0x58
-	.4byte	0x14dc5
+	.4byte	0x14dec
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d17
-	.8byte	.LBB1013
-	.8byte	.LBE1013-.LBB1013
+	.4byte	0x14d3e
+	.8byte	.LBB1015
+	.8byte	.LBE1015-.LBB1015
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1014
-	.8byte	.LBE1014-.LBB1014
+	.8byte	.LBB1016
+	.8byte	.LBE1016-.LBB1016
 	.uleb128 0x61
-	.4byte	0x14d27
+	.4byte	0x14d4e
 	.4byte	.LLST34
 	.byte	0
 	.byte	0
@@ -43181,172 +43217,172 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL120
-	.4byte	0x154b5
+	.4byte	0x154dc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x147fd
-	.8byte	.LBB1028
+	.4byte	0x14824
+	.8byte	.LBB1030
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
-	.2byte	0x97d
+	.2byte	0x97e
 	.4byte	0x10ce1
 	.uleb128 0x55
-	.4byte	0x14823
+	.4byte	0x1484a
 	.uleb128 0x55
-	.4byte	0x14817
+	.4byte	0x1483e
 	.uleb128 0x55
-	.4byte	0x1480d
+	.4byte	0x14834
 	.uleb128 0x6e
-	.4byte	0x1485d
-	.8byte	.LBB1029
+	.4byte	0x14884
+	.8byte	.LBB1031
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x14883
+	.4byte	0x148aa
 	.uleb128 0x55
-	.4byte	0x14877
+	.4byte	0x1489e
 	.uleb128 0x55
-	.4byte	0x1486d
+	.4byte	0x14894
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1f0
 	.uleb128 0x58
-	.4byte	0x1488c
+	.4byte	0x148b3
 	.uleb128 0x6f
-	.4byte	0x148cc
-	.8byte	.LBB1031
+	.4byte	0x148f3
+	.8byte	.LBB1033
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x10c16
 	.uleb128 0x55
-	.4byte	0x148e8
+	.4byte	0x1490f
 	.uleb128 0x70
-	.4byte	0x148dc
+	.4byte	0x14903
 	.4byte	.LLST36
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x230
 	.uleb128 0x61
-	.4byte	0x148f4
+	.4byte	0x1491b
 	.4byte	.LLST37
 	.uleb128 0x61
-	.4byte	0x148ff
+	.4byte	0x14926
 	.4byte	.LLST38
 	.uleb128 0x71
-	.4byte	0x14d17
-	.8byte	.LBB1033
-	.8byte	.LBE1033-.LBB1033
+	.4byte	0x14d3e
+	.8byte	.LBB1035
+	.8byte	.LBE1035-.LBB1035
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10b7c
 	.uleb128 0x57
-	.8byte	.LBB1034
-	.8byte	.LBE1034-.LBB1034
+	.8byte	.LBB1036
+	.8byte	.LBE1036-.LBB1036
 	.uleb128 0x61
-	.4byte	0x14d27
+	.4byte	0x14d4e
 	.4byte	.LLST39
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1035
-	.8byte	.LBE1035-.LBB1035
+	.8byte	.LBB1037
+	.8byte	.LBE1037-.LBB1037
 	.4byte	0x10bd0
 	.uleb128 0x58
-	.4byte	0x1490b
+	.4byte	0x14932
 	.uleb128 0x5d
-	.4byte	0x14d9d
-	.8byte	.LBB1036
-	.8byte	.LBE1036-.LBB1036
+	.4byte	0x14dc4
+	.8byte	.LBB1038
+	.8byte	.LBE1038-.LBB1038
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14db9
+	.4byte	0x14de0
 	.uleb128 0x55
-	.4byte	0x14dad
+	.4byte	0x14dd4
 	.uleb128 0x57
-	.8byte	.LBB1037
-	.8byte	.LBE1037-.LBB1037
+	.8byte	.LBB1039
+	.8byte	.LBE1039-.LBB1039
 	.uleb128 0x58
-	.4byte	0x14dc5
+	.4byte	0x14dec
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14cea
-	.8byte	.LBB1038
-	.8byte	.LBE1038-.LBB1038
+	.4byte	0x14d11
+	.8byte	.LBB1040
+	.8byte	.LBE1040-.LBB1040
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14d04
+	.4byte	0x14d2b
 	.uleb128 0x55
-	.4byte	0x14cfa
+	.4byte	0x14d21
 	.uleb128 0x5d
-	.4byte	0x14e27
-	.8byte	.LBB1039
-	.8byte	.LBE1039-.LBB1039
+	.4byte	0x14e4e
+	.8byte	.LBB1041
+	.8byte	.LBE1041-.LBB1041
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14e41
+	.4byte	0x14e68
 	.uleb128 0x55
-	.4byte	0x14e37
+	.4byte	0x14e5e
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14898
-	.8byte	.LBB1043
-	.8byte	.LBE1043-.LBB1043
+	.4byte	0x148bf
+	.8byte	.LBB1045
+	.8byte	.LBE1045-.LBB1045
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x10cd1
 	.uleb128 0x55
-	.4byte	0x148a8
+	.4byte	0x148cf
 	.uleb128 0x57
-	.8byte	.LBB1044
-	.8byte	.LBE1044-.LBB1044
+	.8byte	.LBB1046
+	.8byte	.LBE1046-.LBB1046
 	.uleb128 0x61
-	.4byte	0x148b3
+	.4byte	0x148da
 	.4byte	.LLST40
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x270
 	.4byte	0x10c9c
 	.uleb128 0x61
-	.4byte	0x148bf
+	.4byte	0x148e6
 	.4byte	.LLST41
 	.uleb128 0x5d
-	.4byte	0x14d9d
-	.8byte	.LBB1046
-	.8byte	.LBE1046-.LBB1046
+	.4byte	0x14dc4
+	.8byte	.LBB1048
+	.8byte	.LBE1048-.LBB1048
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14db9
+	.4byte	0x14de0
 	.uleb128 0x55
-	.4byte	0x14dad
+	.4byte	0x14dd4
 	.uleb128 0x57
-	.8byte	.LBB1047
-	.8byte	.LBE1047-.LBB1047
+	.8byte	.LBB1049
+	.8byte	.LBE1049-.LBB1049
 	.uleb128 0x58
-	.4byte	0x14dc5
+	.4byte	0x14dec
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d17
-	.8byte	.LBB1048
-	.8byte	.LBE1048-.LBB1048
+	.4byte	0x14d3e
+	.8byte	.LBB1050
+	.8byte	.LBE1050-.LBB1050
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1049
-	.8byte	.LBE1049-.LBB1049
+	.8byte	.LBB1051
+	.8byte	.LBE1051-.LBB1051
 	.uleb128 0x61
-	.4byte	0x14d27
+	.4byte	0x14d4e
 	.4byte	.LLST42
 	.byte	0
 	.byte	0
@@ -43354,168 +43390,168 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL144
-	.4byte	0x154b5
+	.4byte	0x154dc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x147cd
-	.8byte	.LBB1058
+	.4byte	0x147f4
+	.8byte	.LBB1060
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
-	.2byte	0x94a
+	.2byte	0x94b
 	.4byte	0x10f01
 	.uleb128 0x55
-	.4byte	0x147f3
+	.4byte	0x1481a
 	.uleb128 0x55
-	.4byte	0x147e7
+	.4byte	0x1480e
 	.uleb128 0x55
-	.4byte	0x147dd
+	.4byte	0x14804
 	.uleb128 0x6e
-	.4byte	0x1482d
-	.8byte	.LBB1059
+	.4byte	0x14854
+	.8byte	.LBB1061
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x14853
+	.4byte	0x1487a
 	.uleb128 0x55
-	.4byte	0x14847
+	.4byte	0x1486e
 	.uleb128 0x55
-	.4byte	0x1483d
+	.4byte	0x14864
 	.uleb128 0x6f
-	.4byte	0x148cc
-	.8byte	.LBB1061
+	.4byte	0x148f3
+	.8byte	.LBB1063
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x10e37
 	.uleb128 0x55
-	.4byte	0x148e8
+	.4byte	0x1490f
 	.uleb128 0x70
-	.4byte	0x148dc
+	.4byte	0x14903
 	.4byte	.LLST43
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x2f0
 	.uleb128 0x61
-	.4byte	0x148f4
+	.4byte	0x1491b
 	.4byte	.LLST44
 	.uleb128 0x61
-	.4byte	0x148ff
+	.4byte	0x14926
 	.4byte	.LLST45
 	.uleb128 0x71
-	.4byte	0x14d17
-	.8byte	.LBB1063
-	.8byte	.LBE1063-.LBB1063
+	.4byte	0x14d3e
+	.8byte	.LBB1065
+	.8byte	.LBE1065-.LBB1065
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10d9d
 	.uleb128 0x57
-	.8byte	.LBB1064
-	.8byte	.LBE1064-.LBB1064
+	.8byte	.LBB1066
+	.8byte	.LBE1066-.LBB1066
 	.uleb128 0x61
-	.4byte	0x14d27
+	.4byte	0x14d4e
 	.4byte	.LLST46
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1065
-	.8byte	.LBE1065-.LBB1065
+	.8byte	.LBB1067
+	.8byte	.LBE1067-.LBB1067
 	.4byte	0x10df1
 	.uleb128 0x58
-	.4byte	0x1490b
+	.4byte	0x14932
 	.uleb128 0x5d
-	.4byte	0x14d9d
-	.8byte	.LBB1066
-	.8byte	.LBE1066-.LBB1066
+	.4byte	0x14dc4
+	.8byte	.LBB1068
+	.8byte	.LBE1068-.LBB1068
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14db9
+	.4byte	0x14de0
 	.uleb128 0x55
-	.4byte	0x14dad
+	.4byte	0x14dd4
 	.uleb128 0x57
-	.8byte	.LBB1067
-	.8byte	.LBE1067-.LBB1067
+	.8byte	.LBB1069
+	.8byte	.LBE1069-.LBB1069
 	.uleb128 0x58
-	.4byte	0x14dc5
+	.4byte	0x14dec
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14cea
-	.8byte	.LBB1068
-	.8byte	.LBE1068-.LBB1068
+	.4byte	0x14d11
+	.8byte	.LBB1070
+	.8byte	.LBE1070-.LBB1070
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14d04
+	.4byte	0x14d2b
 	.uleb128 0x55
-	.4byte	0x14cfa
+	.4byte	0x14d21
 	.uleb128 0x5d
-	.4byte	0x14e27
-	.8byte	.LBB1069
-	.8byte	.LBE1069-.LBB1069
+	.4byte	0x14e4e
+	.8byte	.LBB1071
+	.8byte	.LBE1071-.LBB1071
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14e41
+	.4byte	0x14e68
 	.uleb128 0x55
-	.4byte	0x14e37
+	.4byte	0x14e5e
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14898
-	.8byte	.LBB1075
-	.8byte	.LBE1075-.LBB1075
+	.4byte	0x148bf
+	.8byte	.LBB1077
+	.8byte	.LBE1077-.LBB1077
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x10ef2
 	.uleb128 0x55
-	.4byte	0x148a8
+	.4byte	0x148cf
 	.uleb128 0x57
-	.8byte	.LBB1076
-	.8byte	.LBE1076-.LBB1076
+	.8byte	.LBB1078
+	.8byte	.LBE1078-.LBB1078
 	.uleb128 0x61
-	.4byte	0x148b3
+	.4byte	0x148da
 	.4byte	.LLST47
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x340
 	.4byte	0x10ebd
 	.uleb128 0x61
-	.4byte	0x148bf
+	.4byte	0x148e6
 	.4byte	.LLST48
 	.uleb128 0x5d
-	.4byte	0x14d9d
-	.8byte	.LBB1078
-	.8byte	.LBE1078-.LBB1078
+	.4byte	0x14dc4
+	.8byte	.LBB1080
+	.8byte	.LBE1080-.LBB1080
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14db9
+	.4byte	0x14de0
 	.uleb128 0x55
-	.4byte	0x14dad
+	.4byte	0x14dd4
 	.uleb128 0x57
-	.8byte	.LBB1079
-	.8byte	.LBE1079-.LBB1079
+	.8byte	.LBB1081
+	.8byte	.LBE1081-.LBB1081
 	.uleb128 0x58
-	.4byte	0x14dc5
+	.4byte	0x14dec
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d17
-	.8byte	.LBB1080
-	.8byte	.LBE1080-.LBB1080
+	.4byte	0x14d3e
+	.8byte	.LBB1082
+	.8byte	.LBE1082-.LBB1082
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1081
-	.8byte	.LBE1081-.LBB1081
+	.8byte	.LBB1083
+	.8byte	.LBE1083-.LBB1083
 	.uleb128 0x61
-	.4byte	0x14d27
+	.4byte	0x14d4e
 	.4byte	.LLST49
 	.byte	0
 	.byte	0
@@ -43523,172 +43559,172 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL171
-	.4byte	0x154a8
+	.4byte	0x154cf
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x147fd
-	.8byte	.LBB1092
+	.4byte	0x14824
+	.8byte	.LBB1094
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
-	.2byte	0x99a
+	.2byte	0x99b
 	.4byte	0x1113d
 	.uleb128 0x55
-	.4byte	0x14823
+	.4byte	0x1484a
 	.uleb128 0x55
-	.4byte	0x14817
+	.4byte	0x1483e
 	.uleb128 0x55
-	.4byte	0x1480d
+	.4byte	0x14834
 	.uleb128 0x6e
-	.4byte	0x1485d
-	.8byte	.LBB1093
+	.4byte	0x14884
+	.8byte	.LBB1095
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x14883
+	.4byte	0x148aa
 	.uleb128 0x55
-	.4byte	0x14877
+	.4byte	0x1489e
 	.uleb128 0x55
-	.4byte	0x1486d
+	.4byte	0x14894
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x370
 	.uleb128 0x61
-	.4byte	0x1488c
+	.4byte	0x148b3
 	.4byte	.LLST50
 	.uleb128 0x6f
-	.4byte	0x148cc
-	.8byte	.LBB1095
+	.4byte	0x148f3
+	.8byte	.LBB1097
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x11065
 	.uleb128 0x55
-	.4byte	0x148e8
+	.4byte	0x1490f
 	.uleb128 0x70
-	.4byte	0x148dc
+	.4byte	0x14903
 	.4byte	.LLST51
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x61
-	.4byte	0x148f4
+	.4byte	0x1491b
 	.4byte	.LLST52
 	.uleb128 0x61
-	.4byte	0x148ff
+	.4byte	0x14926
 	.4byte	.LLST53
 	.uleb128 0x71
-	.4byte	0x14d17
-	.8byte	.LBB1097
-	.8byte	.LBE1097-.LBB1097
+	.4byte	0x14d3e
+	.8byte	.LBB1099
+	.8byte	.LBE1099-.LBB1099
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10fcb
 	.uleb128 0x57
-	.8byte	.LBB1098
-	.8byte	.LBE1098-.LBB1098
+	.8byte	.LBB1100
+	.8byte	.LBE1100-.LBB1100
 	.uleb128 0x61
-	.4byte	0x14d27
+	.4byte	0x14d4e
 	.4byte	.LLST54
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1099
-	.8byte	.LBE1099-.LBB1099
+	.8byte	.LBB1101
+	.8byte	.LBE1101-.LBB1101
 	.4byte	0x1101f
 	.uleb128 0x58
-	.4byte	0x1490b
+	.4byte	0x14932
 	.uleb128 0x5d
-	.4byte	0x14d9d
-	.8byte	.LBB1100
-	.8byte	.LBE1100-.LBB1100
+	.4byte	0x14dc4
+	.8byte	.LBB1102
+	.8byte	.LBE1102-.LBB1102
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14db9
+	.4byte	0x14de0
 	.uleb128 0x55
-	.4byte	0x14dad
+	.4byte	0x14dd4
 	.uleb128 0x57
-	.8byte	.LBB1101
-	.8byte	.LBE1101-.LBB1101
+	.8byte	.LBB1103
+	.8byte	.LBE1103-.LBB1103
 	.uleb128 0x58
-	.4byte	0x14dc5
+	.4byte	0x14dec
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14cea
-	.8byte	.LBB1102
-	.8byte	.LBE1102-.LBB1102
+	.4byte	0x14d11
+	.8byte	.LBB1104
+	.8byte	.LBE1104-.LBB1104
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14d04
+	.4byte	0x14d2b
 	.uleb128 0x55
-	.4byte	0x14cfa
+	.4byte	0x14d21
 	.uleb128 0x5d
-	.4byte	0x14e27
-	.8byte	.LBB1103
-	.8byte	.LBE1103-.LBB1103
+	.4byte	0x14e4e
+	.8byte	.LBB1105
+	.8byte	.LBE1105-.LBB1105
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14e41
+	.4byte	0x14e68
 	.uleb128 0x55
-	.4byte	0x14e37
+	.4byte	0x14e5e
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14898
-	.8byte	.LBB1109
-	.8byte	.LBE1109-.LBB1109
+	.4byte	0x148bf
+	.8byte	.LBB1111
+	.8byte	.LBE1111-.LBB1111
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x11120
 	.uleb128 0x55
-	.4byte	0x148a8
+	.4byte	0x148cf
 	.uleb128 0x57
-	.8byte	.LBB1110
-	.8byte	.LBE1110-.LBB1110
+	.8byte	.LBB1112
+	.8byte	.LBE1112-.LBB1112
 	.uleb128 0x61
-	.4byte	0x148b3
+	.4byte	0x148da
 	.4byte	.LLST55
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x420
 	.4byte	0x110eb
 	.uleb128 0x61
-	.4byte	0x148bf
+	.4byte	0x148e6
 	.4byte	.LLST56
 	.uleb128 0x5d
-	.4byte	0x14d9d
-	.8byte	.LBB1112
-	.8byte	.LBE1112-.LBB1112
+	.4byte	0x14dc4
+	.8byte	.LBB1114
+	.8byte	.LBE1114-.LBB1114
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14db9
+	.4byte	0x14de0
 	.uleb128 0x55
-	.4byte	0x14dad
+	.4byte	0x14dd4
 	.uleb128 0x57
-	.8byte	.LBB1113
-	.8byte	.LBE1113-.LBB1113
+	.8byte	.LBB1115
+	.8byte	.LBE1115-.LBB1115
 	.uleb128 0x58
-	.4byte	0x14dc5
+	.4byte	0x14dec
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d17
-	.8byte	.LBB1114
-	.8byte	.LBE1114-.LBB1114
+	.4byte	0x14d3e
+	.8byte	.LBB1116
+	.8byte	.LBE1116-.LBB1116
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1115
-	.8byte	.LBE1115-.LBB1115
+	.8byte	.LBB1117
+	.8byte	.LBE1117-.LBB1117
 	.uleb128 0x61
-	.4byte	0x14d27
+	.4byte	0x14d4e
 	.4byte	.LLST57
 	.byte	0
 	.byte	0
@@ -43696,68 +43732,68 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL183
-	.4byte	0x154b5
+	.4byte	0x154dc
 	.uleb128 0x4f
 	.8byte	.LVL261
-	.4byte	0x152cb
+	.4byte	0x152f2
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x147cd
-	.8byte	.LBB1128
+	.4byte	0x147f4
+	.8byte	.LBB1130
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
-	.2byte	0x9b8
+	.2byte	0x9b9
 	.4byte	0x111ef
 	.uleb128 0x55
-	.4byte	0x147f3
+	.4byte	0x1481a
 	.uleb128 0x55
-	.4byte	0x147e7
+	.4byte	0x1480e
 	.uleb128 0x55
-	.4byte	0x147dd
+	.4byte	0x14804
 	.uleb128 0x6e
-	.4byte	0x1482d
-	.8byte	.LBB1129
+	.4byte	0x14854
+	.8byte	.LBB1131
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x14853
+	.4byte	0x1487a
 	.uleb128 0x55
-	.4byte	0x14847
+	.4byte	0x1486e
 	.uleb128 0x55
-	.4byte	0x1483d
+	.4byte	0x14864
 	.uleb128 0x6e
-	.4byte	0x148cc
-	.8byte	.LBB1131
+	.4byte	0x148f3
+	.8byte	.LBB1133
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x55
-	.4byte	0x148e8
+	.4byte	0x1490f
 	.uleb128 0x72
-	.4byte	0x148dc
+	.4byte	0x14903
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x4b0
 	.uleb128 0x58
-	.4byte	0x148f4
+	.4byte	0x1491b
 	.uleb128 0x61
-	.4byte	0x148ff
+	.4byte	0x14926
 	.4byte	.LLST58
 	.uleb128 0x5d
-	.4byte	0x14d17
-	.8byte	.LBB1133
-	.8byte	.LBE1133-.LBB1133
+	.4byte	0x14d3e
+	.8byte	.LBB1135
+	.8byte	.LBE1135-.LBB1135
 	.byte	0x6
 	.byte	0x4d
 	.uleb128 0x57
-	.8byte	.LBB1134
-	.8byte	.LBE1134-.LBB1134
+	.8byte	.LBB1136
+	.8byte	.LBE1136-.LBB1136
 	.uleb128 0x61
-	.4byte	0x14d27
+	.4byte	0x14d4e
 	.4byte	.LLST59
 	.byte	0
 	.byte	0
@@ -43766,163 +43802,163 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x147cd
-	.8byte	.LBB1140
+	.4byte	0x147f4
+	.8byte	.LBB1142
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
-	.2byte	0x9a8
+	.2byte	0x9a9
 	.4byte	0x1140f
 	.uleb128 0x55
-	.4byte	0x147f3
+	.4byte	0x1481a
 	.uleb128 0x55
-	.4byte	0x147e7
+	.4byte	0x1480e
 	.uleb128 0x55
-	.4byte	0x147dd
+	.4byte	0x14804
 	.uleb128 0x6e
-	.4byte	0x1482d
-	.8byte	.LBB1141
+	.4byte	0x14854
+	.8byte	.LBB1143
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x14853
+	.4byte	0x1487a
 	.uleb128 0x55
-	.4byte	0x14847
+	.4byte	0x1486e
 	.uleb128 0x55
-	.4byte	0x1483d
+	.4byte	0x14864
 	.uleb128 0x6f
-	.4byte	0x148cc
-	.8byte	.LBB1143
+	.4byte	0x148f3
+	.8byte	.LBB1145
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x11345
 	.uleb128 0x55
-	.4byte	0x148e8
+	.4byte	0x1490f
 	.uleb128 0x70
-	.4byte	0x148dc
+	.4byte	0x14903
 	.4byte	.LLST60
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x540
 	.uleb128 0x61
-	.4byte	0x148f4
+	.4byte	0x1491b
 	.4byte	.LLST61
 	.uleb128 0x61
-	.4byte	0x148ff
+	.4byte	0x14926
 	.4byte	.LLST62
 	.uleb128 0x71
-	.4byte	0x14d17
-	.8byte	.LBB1145
-	.8byte	.LBE1145-.LBB1145
+	.4byte	0x14d3e
+	.8byte	.LBB1147
+	.8byte	.LBE1147-.LBB1147
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x112ab
 	.uleb128 0x57
-	.8byte	.LBB1146
-	.8byte	.LBE1146-.LBB1146
+	.8byte	.LBB1148
+	.8byte	.LBE1148-.LBB1148
 	.uleb128 0x61
-	.4byte	0x14d27
+	.4byte	0x14d4e
 	.4byte	.LLST63
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1147
-	.8byte	.LBE1147-.LBB1147
+	.8byte	.LBB1149
+	.8byte	.LBE1149-.LBB1149
 	.4byte	0x112ff
 	.uleb128 0x58
-	.4byte	0x1490b
+	.4byte	0x14932
 	.uleb128 0x5d
-	.4byte	0x14d9d
-	.8byte	.LBB1148
-	.8byte	.LBE1148-.LBB1148
+	.4byte	0x14dc4
+	.8byte	.LBB1150
+	.8byte	.LBE1150-.LBB1150
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14db9
+	.4byte	0x14de0
 	.uleb128 0x55
-	.4byte	0x14dad
+	.4byte	0x14dd4
 	.uleb128 0x57
-	.8byte	.LBB1149
-	.8byte	.LBE1149-.LBB1149
+	.8byte	.LBB1151
+	.8byte	.LBE1151-.LBB1151
 	.uleb128 0x58
-	.4byte	0x14dc5
+	.4byte	0x14dec
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14cea
-	.8byte	.LBB1150
-	.8byte	.LBE1150-.LBB1150
+	.4byte	0x14d11
+	.8byte	.LBB1152
+	.8byte	.LBE1152-.LBB1152
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14d04
+	.4byte	0x14d2b
 	.uleb128 0x55
-	.4byte	0x14cfa
+	.4byte	0x14d21
 	.uleb128 0x5d
-	.4byte	0x14e27
-	.8byte	.LBB1151
-	.8byte	.LBE1151-.LBB1151
+	.4byte	0x14e4e
+	.8byte	.LBB1153
+	.8byte	.LBE1153-.LBB1153
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14e41
+	.4byte	0x14e68
 	.uleb128 0x55
-	.4byte	0x14e37
+	.4byte	0x14e5e
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14898
-	.8byte	.LBB1159
-	.8byte	.LBE1159-.LBB1159
+	.4byte	0x148bf
+	.8byte	.LBB1161
+	.8byte	.LBE1161-.LBB1161
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x11400
 	.uleb128 0x55
-	.4byte	0x148a8
+	.4byte	0x148cf
 	.uleb128 0x57
-	.8byte	.LBB1160
-	.8byte	.LBE1160-.LBB1160
+	.8byte	.LBB1162
+	.8byte	.LBE1162-.LBB1162
 	.uleb128 0x61
-	.4byte	0x148b3
+	.4byte	0x148da
 	.4byte	.LLST64
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x590
 	.4byte	0x113cb
 	.uleb128 0x61
-	.4byte	0x148bf
+	.4byte	0x148e6
 	.4byte	.LLST65
 	.uleb128 0x5d
-	.4byte	0x14d9d
-	.8byte	.LBB1162
-	.8byte	.LBE1162-.LBB1162
+	.4byte	0x14dc4
+	.8byte	.LBB1164
+	.8byte	.LBE1164-.LBB1164
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14db9
+	.4byte	0x14de0
 	.uleb128 0x55
-	.4byte	0x14dad
+	.4byte	0x14dd4
 	.uleb128 0x57
-	.8byte	.LBB1163
-	.8byte	.LBE1163-.LBB1163
+	.8byte	.LBB1165
+	.8byte	.LBE1165-.LBB1165
 	.uleb128 0x58
-	.4byte	0x14dc5
+	.4byte	0x14dec
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d17
-	.8byte	.LBB1164
-	.8byte	.LBE1164-.LBB1164
+	.4byte	0x14d3e
+	.8byte	.LBB1166
+	.8byte	.LBE1166-.LBB1166
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1165
-	.8byte	.LBE1165-.LBB1165
+	.8byte	.LBB1167
+	.8byte	.LBE1167-.LBB1167
 	.uleb128 0x61
-	.4byte	0x14d27
+	.4byte	0x14d4e
 	.4byte	.LLST66
 	.byte	0
 	.byte	0
@@ -43930,167 +43966,167 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL244
-	.4byte	0x154a8
+	.4byte	0x154cf
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x147cd
-	.8byte	.LBB1176
+	.4byte	0x147f4
+	.8byte	.LBB1178
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
-	.2byte	0x959
+	.2byte	0x95a
 	.4byte	0x1162f
 	.uleb128 0x55
-	.4byte	0x147f3
+	.4byte	0x1481a
 	.uleb128 0x55
-	.4byte	0x147e7
+	.4byte	0x1480e
 	.uleb128 0x55
-	.4byte	0x147dd
+	.4byte	0x14804
 	.uleb128 0x6e
-	.4byte	0x1482d
-	.8byte	.LBB1177
+	.4byte	0x14854
+	.8byte	.LBB1179
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x14853
+	.4byte	0x1487a
 	.uleb128 0x55
-	.4byte	0x14847
+	.4byte	0x1486e
 	.uleb128 0x55
-	.4byte	0x1483d
+	.4byte	0x14864
 	.uleb128 0x6f
-	.4byte	0x148cc
-	.8byte	.LBB1179
+	.4byte	0x148f3
+	.8byte	.LBB1181
 	.4byte	.Ldebug_ranges0+0x620
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x11565
 	.uleb128 0x55
-	.4byte	0x148e8
+	.4byte	0x1490f
 	.uleb128 0x70
-	.4byte	0x148dc
+	.4byte	0x14903
 	.4byte	.LLST67
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x620
 	.uleb128 0x61
-	.4byte	0x148f4
+	.4byte	0x1491b
 	.4byte	.LLST68
 	.uleb128 0x61
-	.4byte	0x148ff
+	.4byte	0x14926
 	.4byte	.LLST69
 	.uleb128 0x71
-	.4byte	0x14d17
-	.8byte	.LBB1181
-	.8byte	.LBE1181-.LBB1181
+	.4byte	0x14d3e
+	.8byte	.LBB1183
+	.8byte	.LBE1183-.LBB1183
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x114cb
 	.uleb128 0x57
-	.8byte	.LBB1182
-	.8byte	.LBE1182-.LBB1182
+	.8byte	.LBB1184
+	.8byte	.LBE1184-.LBB1184
 	.uleb128 0x61
-	.4byte	0x14d27
+	.4byte	0x14d4e
 	.4byte	.LLST70
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1183
-	.8byte	.LBE1183-.LBB1183
+	.8byte	.LBB1185
+	.8byte	.LBE1185-.LBB1185
 	.4byte	0x1151f
 	.uleb128 0x58
-	.4byte	0x1490b
+	.4byte	0x14932
 	.uleb128 0x5d
-	.4byte	0x14d9d
-	.8byte	.LBB1184
-	.8byte	.LBE1184-.LBB1184
+	.4byte	0x14dc4
+	.8byte	.LBB1186
+	.8byte	.LBE1186-.LBB1186
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14db9
+	.4byte	0x14de0
 	.uleb128 0x55
-	.4byte	0x14dad
+	.4byte	0x14dd4
 	.uleb128 0x57
-	.8byte	.LBB1185
-	.8byte	.LBE1185-.LBB1185
+	.8byte	.LBB1187
+	.8byte	.LBE1187-.LBB1187
 	.uleb128 0x58
-	.4byte	0x14dc5
+	.4byte	0x14dec
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14cea
-	.8byte	.LBB1186
-	.8byte	.LBE1186-.LBB1186
+	.4byte	0x14d11
+	.8byte	.LBB1188
+	.8byte	.LBE1188-.LBB1188
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14d04
+	.4byte	0x14d2b
 	.uleb128 0x55
-	.4byte	0x14cfa
+	.4byte	0x14d21
 	.uleb128 0x5d
-	.4byte	0x14e27
-	.8byte	.LBB1187
-	.8byte	.LBE1187-.LBB1187
+	.4byte	0x14e4e
+	.8byte	.LBB1189
+	.8byte	.LBE1189-.LBB1189
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14e41
+	.4byte	0x14e68
 	.uleb128 0x55
-	.4byte	0x14e37
+	.4byte	0x14e5e
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14898
-	.8byte	.LBB1195
-	.8byte	.LBE1195-.LBB1195
+	.4byte	0x148bf
+	.8byte	.LBB1197
+	.8byte	.LBE1197-.LBB1197
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x11620
 	.uleb128 0x55
-	.4byte	0x148a8
+	.4byte	0x148cf
 	.uleb128 0x57
-	.8byte	.LBB1196
-	.8byte	.LBE1196-.LBB1196
+	.8byte	.LBB1198
+	.8byte	.LBE1198-.LBB1198
 	.uleb128 0x61
-	.4byte	0x148b3
+	.4byte	0x148da
 	.4byte	.LLST71
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x670
 	.4byte	0x115eb
 	.uleb128 0x61
-	.4byte	0x148bf
+	.4byte	0x148e6
 	.4byte	.LLST72
 	.uleb128 0x5d
-	.4byte	0x14d9d
-	.8byte	.LBB1198
-	.8byte	.LBE1198-.LBB1198
+	.4byte	0x14dc4
+	.8byte	.LBB1200
+	.8byte	.LBE1200-.LBB1200
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14db9
+	.4byte	0x14de0
 	.uleb128 0x55
-	.4byte	0x14dad
+	.4byte	0x14dd4
 	.uleb128 0x57
-	.8byte	.LBB1199
-	.8byte	.LBE1199-.LBB1199
+	.8byte	.LBB1201
+	.8byte	.LBE1201-.LBB1201
 	.uleb128 0x58
-	.4byte	0x14dc5
+	.4byte	0x14dec
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14d17
-	.8byte	.LBB1200
-	.8byte	.LBE1200-.LBB1200
+	.4byte	0x14d3e
+	.8byte	.LBB1202
+	.8byte	.LBE1202-.LBB1202
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1201
-	.8byte	.LBE1201-.LBB1201
+	.8byte	.LBB1203
+	.8byte	.LBE1203-.LBB1203
 	.uleb128 0x61
-	.4byte	0x14d27
+	.4byte	0x14d4e
 	.4byte	.LLST73
 	.byte	0
 	.byte	0
@@ -44098,96 +44134,96 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL252
-	.4byte	0x154a8
+	.4byte	0x154cf
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL85
-	.4byte	0x1535d
+	.4byte	0x15384
 	.uleb128 0x4f
 	.8byte	.LVL86
-	.4byte	0x153bf
+	.4byte	0x153e6
 	.uleb128 0x4f
 	.8byte	.LVL87
-	.4byte	0x1546a
+	.4byte	0x15491
 	.uleb128 0x4f
 	.8byte	.LVL98
-	.4byte	0x154c2
+	.4byte	0x154e9
 	.uleb128 0x4f
 	.8byte	.LVL101
-	.4byte	0x152e1
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL104
-	.4byte	0x15267
+	.4byte	0x1528e
 	.uleb128 0x4f
 	.8byte	.LVL121
-	.4byte	0x1546a
+	.4byte	0x15491
 	.uleb128 0x4f
 	.8byte	.LVL122
-	.4byte	0x154ce
+	.4byte	0x154f5
 	.uleb128 0x4f
 	.8byte	.LVL124
-	.4byte	0x15369
+	.4byte	0x15390
 	.uleb128 0x4f
 	.8byte	.LVL131
-	.4byte	0x1535d
+	.4byte	0x15384
 	.uleb128 0x4f
 	.8byte	.LVL145
-	.4byte	0x154da
+	.4byte	0x15501
 	.uleb128 0x4f
 	.8byte	.LVL146
-	.4byte	0x15369
+	.4byte	0x15390
 	.uleb128 0x4f
 	.8byte	.LVL147
-	.4byte	0x153b3
+	.4byte	0x153da
 	.uleb128 0x4f
 	.8byte	.LVL157
-	.4byte	0x154e6
+	.4byte	0x1550d
 	.uleb128 0x4f
 	.8byte	.LVL158
-	.4byte	0x1546a
+	.4byte	0x15491
 	.uleb128 0x4f
 	.8byte	.LVL185
-	.4byte	0x15267
+	.4byte	0x1528e
 	.uleb128 0x4f
 	.8byte	.LVL188
-	.4byte	0x15267
+	.4byte	0x1528e
 	.uleb128 0x4f
 	.8byte	.LVL190
-	.4byte	0x1535d
+	.4byte	0x15384
 	.uleb128 0x4f
 	.8byte	.LVL192
-	.4byte	0x1535d
+	.4byte	0x15384
 	.uleb128 0x4f
 	.8byte	.LVL193
-	.4byte	0x153bf
+	.4byte	0x153e6
 	.uleb128 0x4f
 	.8byte	.LVL194
-	.4byte	0x1546a
+	.4byte	0x15491
 	.uleb128 0x4f
 	.8byte	.LVL207
-	.4byte	0x152e1
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL210
-	.4byte	0x152e1
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL212
-	.4byte	0x1535d
+	.4byte	0x15384
 	.uleb128 0x4f
 	.8byte	.LVL213
-	.4byte	0x1546a
+	.4byte	0x15491
 	.uleb128 0x4f
 	.8byte	.LVL221
-	.4byte	0x154c2
+	.4byte	0x154e9
 	.uleb128 0x4f
 	.8byte	.LVL255
-	.4byte	0x153b3
+	.4byte	0x153da
 	.uleb128 0x4f
 	.8byte	.LVL262
-	.4byte	0x152e1
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL263
-	.4byte	0x15415
+	.4byte	0x1543c
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
@@ -44201,25 +44237,25 @@ __exitcall_ebc_exit:
 	.uleb128 0x64
 	.4byte	.LASF3095
 	.byte	0x1
-	.2byte	0x8de
+	.2byte	0x8df
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x117e8
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x8de
+	.2byte	0x8df
 	.4byte	0xe1f4
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x8e0
+	.2byte	0x8e1
 	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x8d8
+	.2byte	0x8d9
 	.8byte	.LFB2841
 	.8byte	.LFE2841-.LFB2841
 	.uleb128 0x1
@@ -44228,17 +44264,17 @@ __exitcall_ebc_exit:
 	.uleb128 0x52
 	.string	"t"
 	.byte	0x1
-	.2byte	0x8d8
+	.2byte	0x8d9
 	.4byte	0x31d2
 	.4byte	.LLST74
 	.uleb128 0x4f
 	.8byte	.LVL276
-	.4byte	0x1248b
+	.4byte	0x124b2
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x8cc
+	.2byte	0x8cd
 	.8byte	.LFB2840
 	.8byte	.LFE2840-.LFB2840
 	.uleb128 0x1
@@ -44247,43 +44283,43 @@ __exitcall_ebc_exit:
 	.uleb128 0x52
 	.string	"t"
 	.byte	0x1
-	.2byte	0x8cc
+	.2byte	0x8cd
 	.4byte	0x31d2
 	.4byte	.LLST12
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x8ce
+	.2byte	0x8cf
 	.4byte	0xe874
 	.uleb128 0x60
-	.4byte	0x14757
-	.8byte	.LBB956
+	.4byte	0x1477e
+	.8byte	.LBB958
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.2byte	0x8d2
+	.2byte	0x8d3
 	.uleb128 0x55
-	.4byte	0x14764
+	.4byte	0x1478b
 	.uleb128 0x4f
 	.8byte	.LVL71
-	.4byte	0x154f2
+	.4byte	0x15519
 	.byte	0
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x8bb
+	.2byte	0x8bc
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x118ac
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x8bb
+	.2byte	0x8bc
 	.4byte	0xe1f4
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x8bd
+	.2byte	0x8be
 	.4byte	0xe4f2
 	.byte	0
 	.uleb128 0x50
@@ -44295,7 +44331,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2838-.LFB2838
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x121a0
+	.4byte	0x121c7
 	.uleb128 0x52
 	.string	"ptr"
 	.byte	0x1
@@ -44348,28 +44384,28 @@ __exitcall_ebc_exit:
 	.uleb128 0x6c
 	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x889
-	.8byte	.L940
+	.2byte	0x88a
+	.8byte	.L939
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1260
+	.4byte	.Ldebug_ranges0+0x1220
 	.4byte	0x119fc
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x7c3
+	.2byte	0x7c1
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB1886
-	.8byte	.LBE1886-.LBB1886
+	.8byte	.LBB1887
+	.8byte	.LBE1887-.LBB1887
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x7c3
-	.8byte	.L921
+	.2byte	0x7c1
+	.8byte	.L920
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x7c3
+	.2byte	0x7c1
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -44377,52 +44413,52 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x7c3
+	.2byte	0x7c1
 	.4byte	0x199
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1290
+	.4byte	.Ldebug_ranges0+0x1250
 	.4byte	0x119e0
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x7c3
+	.2byte	0x7c1
 	.4byte	0x199
 	.4byte	.LLST261
 	.uleb128 0x4f
-	.8byte	.LVL1011
-	.4byte	0x15476
+	.8byte	.LVL1024
+	.4byte	0x1549d
 	.uleb128 0x4f
-	.8byte	.LVL1012
-	.4byte	0x15482
+	.8byte	.LVL1025
+	.4byte	0x154a9
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL1009
-	.4byte	0x1548f
+	.8byte	.LVL1022
+	.4byte	0x154b6
 	.uleb128 0x4f
-	.8byte	.LVL1013
-	.4byte	0x1549b
+	.8byte	.LVL1026
+	.4byte	0x154c2
 	.byte	0
 	.byte	0
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1200
+	.4byte	.Ldebug_ranges0+0x11c0
 	.4byte	0x11a9e
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x875
+	.2byte	0x876
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB1882
-	.8byte	.LBE1882-.LBB1882
+	.8byte	.LBB1883
+	.8byte	.LBE1883-.LBB1883
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x875
-	.8byte	.L982
+	.2byte	0x876
+	.8byte	.L986
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x875
+	.2byte	0x876
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -44430,52 +44466,52 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x875
+	.2byte	0x876
 	.4byte	0x199
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1230
+	.4byte	.Ldebug_ranges0+0x11f0
 	.4byte	0x11a82
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x875
+	.2byte	0x876
 	.4byte	0x199
 	.4byte	.LLST260
 	.uleb128 0x4f
-	.8byte	.LVL1021
-	.4byte	0x15476
+	.8byte	.LVL1013
+	.4byte	0x1549d
 	.uleb128 0x4f
-	.8byte	.LVL1022
-	.4byte	0x15482
+	.8byte	.LVL1014
+	.4byte	0x154a9
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL1019
-	.4byte	0x1548f
+	.8byte	.LVL1011
+	.4byte	0x154b6
 	.uleb128 0x4f
-	.8byte	.LVL1023
-	.4byte	0x1549b
+	.8byte	.LVL1015
+	.4byte	0x154c2
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1872
-	.8byte	.LBE1872-.LBB1872
+	.8byte	.LBB1877
+	.8byte	.LBE1877-.LBB1877
 	.4byte	0x11b50
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x8a7
+	.2byte	0x8a8
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB1873
-	.8byte	.LBE1873-.LBB1873
+	.8byte	.LBB1878
+	.8byte	.LBE1878-.LBB1878
 	.uleb128 0x73
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x8a7
+	.2byte	0x8a8
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x8a7
+	.2byte	0x8a8
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -44483,31 +44519,31 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x8a7
+	.2byte	0x8a8
 	.4byte	0x199
 	.uleb128 0x6d
-	.8byte	.LBB1874
-	.8byte	.LBE1874-.LBB1874
+	.8byte	.LBB1879
+	.8byte	.LBE1879-.LBB1879
 	.4byte	0x11b34
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x8a7
+	.2byte	0x8a8
 	.4byte	0x199
-	.4byte	.LLST258
+	.4byte	.LLST259
 	.uleb128 0x4f
-	.8byte	.LVL939
-	.4byte	0x15476
+	.8byte	.LVL949
+	.4byte	0x1549d
 	.uleb128 0x4f
-	.8byte	.LVL940
-	.4byte	0x15482
+	.8byte	.LVL950
+	.4byte	0x154a9
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL937
-	.4byte	0x1548f
+	.8byte	.LVL947
+	.4byte	0x154b6
 	.uleb128 0x4f
-	.8byte	.LVL941
-	.4byte	0x1549b
+	.8byte	.LVL951
+	.4byte	0x154c2
 	.byte	0
 	.byte	0
 	.uleb128 0x63
@@ -44516,19 +44552,19 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x8b3
+	.2byte	0x8b4
 	.4byte	0xc6
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1090
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x8b3
-	.8byte	.L999
+	.2byte	0x8b4
+	.8byte	.L1003
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x8b3
+	.2byte	0x8b4
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -44536,7 +44572,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x8b3
+	.2byte	0x8b4
 	.4byte	0x199
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x10d0
@@ -44544,443 +44580,461 @@ __exitcall_ebc_exit:
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x8b3
+	.2byte	0x8b4
 	.4byte	0x199
 	.4byte	.LLST245
 	.uleb128 0x4f
 	.8byte	.LVL898
-	.4byte	0x15476
+	.4byte	0x1549d
 	.uleb128 0x4f
 	.8byte	.LVL899
-	.4byte	0x15482
+	.4byte	0x154a9
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL896
-	.4byte	0x1548f
+	.4byte	0x154b6
 	.uleb128 0x4f
 	.8byte	.LVL900
-	.4byte	0x1549b
+	.4byte	0x154c2
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x121f4
-	.8byte	.LBB1857
+	.4byte	0x1221b
+	.8byte	.LBB1861
 	.4byte	.Ldebug_ranges0+0x1110
 	.byte	0x1
-	.2byte	0x84c
+	.2byte	0x84d
 	.4byte	0x11c4a
 	.uleb128 0x55
-	.4byte	0x12205
+	.4byte	0x1222c
 	.uleb128 0x55
-	.4byte	0x12205
+	.4byte	0x1222c
 	.uleb128 0x55
-	.4byte	0x12211
+	.4byte	0x12238
 	.uleb128 0x55
-	.4byte	0x12211
+	.4byte	0x12238
 	.uleb128 0x55
-	.4byte	0x1221d
+	.4byte	0x12244
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1110
 	.uleb128 0x58
-	.4byte	0x12229
+	.4byte	0x12250
 	.uleb128 0x58
-	.4byte	0x12233
+	.4byte	0x1225a
 	.uleb128 0x58
-	.4byte	0x1223f
+	.4byte	0x12266
 	.uleb128 0x58
-	.4byte	0x1224b
+	.4byte	0x12272
 	.uleb128 0x61
-	.4byte	0x12257
+	.4byte	0x1227e
 	.4byte	.LLST246
 	.uleb128 0x58
-	.4byte	0x12263
+	.4byte	0x1228a
 	.uleb128 0x58
-	.4byte	0x1226f
+	.4byte	0x12296
 	.uleb128 0x74
-	.4byte	0x1227b
+	.4byte	0x122a2
+	.byte	0
+	.byte	0
+	.uleb128 0x54
+	.4byte	0x121c7
+	.8byte	.LBB1864
+	.8byte	.LBE1864-.LBB1864
+	.byte	0x1
+	.2byte	0x7da
+	.4byte	0x11c9b
+	.uleb128 0x55
+	.4byte	0x121ec
+	.uleb128 0x55
+	.4byte	0x121e0
+	.uleb128 0x70
+	.4byte	0x121d4
+	.4byte	.LLST247
+	.uleb128 0x57
+	.8byte	.LBB1865
+	.8byte	.LBE1865-.LBB1865
+	.uleb128 0x58
+	.4byte	0x121f8
+	.uleb128 0x58
+	.4byte	0x12202
+	.uleb128 0x58
+	.4byte	0x1220e
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13f62
-	.8byte	.LBB1860
+	.4byte	0x13f89
+	.8byte	.LBB1866
 	.4byte	.Ldebug_ranges0+0x1140
 	.byte	0x1
-	.2byte	0x7e7
-	.4byte	0x11d10
+	.2byte	0x7e5
+	.4byte	0x11d61
 	.uleb128 0x55
-	.4byte	0x13f9f
+	.4byte	0x13fc6
 	.uleb128 0x55
-	.4byte	0x13f9f
+	.4byte	0x13fc6
 	.uleb128 0x55
-	.4byte	0x13f9f
+	.4byte	0x13fc6
 	.uleb128 0x55
-	.4byte	0x13fab
+	.4byte	0x13fd2
 	.uleb128 0x55
-	.4byte	0x13f93
+	.4byte	0x13fba
 	.uleb128 0x55
-	.4byte	0x13f87
+	.4byte	0x13fae
 	.uleb128 0x55
-	.4byte	0x13f7b
+	.4byte	0x13fa2
 	.uleb128 0x55
-	.4byte	0x13f6f
+	.4byte	0x13f96
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1140
 	.uleb128 0x58
-	.4byte	0x13fb7
-	.uleb128 0x61
-	.4byte	0x13fc3
-	.4byte	.LLST247
-	.uleb128 0x58
-	.4byte	0x13fcf
+	.4byte	0x13fde
 	.uleb128 0x61
-	.4byte	0x13fdb
+	.4byte	0x13fea
 	.4byte	.LLST248
+	.uleb128 0x58
+	.4byte	0x13ff6
 	.uleb128 0x61
-	.4byte	0x13fe7
+	.4byte	0x14002
 	.4byte	.LLST249
+	.uleb128 0x61
+	.4byte	0x1400e
+	.4byte	.LLST250
 	.uleb128 0x58
-	.4byte	0x13ff3
+	.4byte	0x1401a
 	.uleb128 0x58
-	.4byte	0x13fff
+	.4byte	0x14026
 	.uleb128 0x58
-	.4byte	0x1400b
+	.4byte	0x14032
 	.uleb128 0x61
-	.4byte	0x14017
-	.4byte	.LLST250
+	.4byte	0x1403e
+	.4byte	.LLST251
 	.uleb128 0x58
-	.4byte	0x14023
+	.4byte	0x1404a
 	.uleb128 0x61
-	.4byte	0x1402f
-	.4byte	.LLST251
+	.4byte	0x14056
+	.4byte	.LLST252
 	.uleb128 0x62
-	.4byte	0x1403b
+	.4byte	0x14062
 	.uleb128 0x1
 	.byte	0x60
 	.uleb128 0x61
-	.4byte	0x14045
-	.4byte	.LLST252
-	.uleb128 0x61
-	.4byte	0x1404f
+	.4byte	0x1406c
 	.4byte	.LLST253
 	.uleb128 0x61
-	.4byte	0x1405b
+	.4byte	0x14076
 	.4byte	.LLST254
 	.uleb128 0x61
-	.4byte	0x14067
+	.4byte	0x14082
 	.4byte	.LLST255
 	.uleb128 0x61
-	.4byte	0x14073
+	.4byte	0x1408e
 	.4byte	.LLST256
+	.uleb128 0x61
+	.4byte	0x1409a
+	.4byte	.LLST257
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x121a0
-	.8byte	.LBB1868
-	.4byte	.Ldebug_ranges0+0x11a0
+	.4byte	0x121c7
+	.8byte	.LBB1873
+	.4byte	.Ldebug_ranges0+0x1190
 	.byte	0x1
-	.2byte	0x806
-	.4byte	0x11d51
+	.2byte	0x808
+	.4byte	0x11da2
 	.uleb128 0x55
-	.4byte	0x121c5
+	.4byte	0x121ec
 	.uleb128 0x55
-	.4byte	0x121b9
+	.4byte	0x121e0
 	.uleb128 0x70
-	.4byte	0x121ad
-	.4byte	.LLST257
+	.4byte	0x121d4
+	.4byte	.LLST258
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x11a0
+	.4byte	.Ldebug_ranges0+0x1190
 	.uleb128 0x58
-	.4byte	0x121d1
+	.4byte	0x121f8
 	.uleb128 0x58
-	.4byte	0x121db
+	.4byte	0x12202
 	.uleb128 0x58
-	.4byte	0x121e7
+	.4byte	0x1220e
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x143a9
-	.8byte	.LBB1875
-	.8byte	.LBE1875-.LBB1875
+	.4byte	0x143d0
+	.8byte	.LBB1880
+	.8byte	.LBE1880-.LBB1880
 	.byte	0x1
-	.2byte	0x8b0
-	.4byte	0x11d9c
+	.2byte	0x8b1
+	.4byte	0x11ded
 	.uleb128 0x55
-	.4byte	0x143c4
+	.4byte	0x143eb
 	.uleb128 0x55
-	.4byte	0x143b9
+	.4byte	0x143e0
 	.uleb128 0x57
-	.8byte	.LBB1876
-	.8byte	.LBE1876-.LBB1876
+	.8byte	.LBB1881
+	.8byte	.LBE1881-.LBB1881
 	.uleb128 0x58
-	.4byte	0x143d0
+	.4byte	0x143f7
 	.uleb128 0x4f
-	.8byte	.LVL942
-	.4byte	0x1507e
+	.8byte	.LVL952
+	.4byte	0x150a5
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x121a0
-	.8byte	.LBB1877
-	.4byte	.Ldebug_ranges0+0x11d0
+	.4byte	0x121c7
+	.8byte	.LBB1893
+	.4byte	.Ldebug_ranges0+0x1280
 	.byte	0x1
-	.2byte	0x7a4
-	.4byte	0x11ddd
+	.2byte	0x804
+	.4byte	0x11e2e
 	.uleb128 0x55
-	.4byte	0x121c5
+	.4byte	0x121ec
 	.uleb128 0x55
-	.4byte	0x121b9
+	.4byte	0x121e0
 	.uleb128 0x70
-	.4byte	0x121ad
-	.4byte	.LLST259
+	.4byte	0x121d4
+	.4byte	.LLST262
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x11d0
+	.4byte	.Ldebug_ranges0+0x1280
 	.uleb128 0x58
-	.4byte	0x121d1
+	.4byte	0x121f8
 	.uleb128 0x58
-	.4byte	0x121db
+	.4byte	0x12202
 	.uleb128 0x58
-	.4byte	0x121e7
+	.4byte	0x1220e
 	.byte	0
 	.byte	0
-	.uleb128 0x54
-	.4byte	0x121a0
-	.8byte	.LBB1892
-	.8byte	.LBE1892-.LBB1892
+	.uleb128 0x5c
+	.4byte	0x121c7
+	.8byte	.LBB1898
+	.4byte	.Ldebug_ranges0+0x12b0
 	.byte	0x1
-	.2byte	0x7dc
-	.4byte	0x11e2e
+	.2byte	0x7a2
+	.4byte	0x11e6f
 	.uleb128 0x55
-	.4byte	0x121c5
+	.4byte	0x121ec
 	.uleb128 0x55
-	.4byte	0x121b9
+	.4byte	0x121e0
 	.uleb128 0x70
-	.4byte	0x121ad
-	.4byte	.LLST262
-	.uleb128 0x57
-	.8byte	.LBB1893
-	.8byte	.LBE1893-.LBB1893
+	.4byte	0x121d4
+	.4byte	.LLST263
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0x12b0
 	.uleb128 0x58
-	.4byte	0x121d1
+	.4byte	0x121f8
 	.uleb128 0x58
-	.4byte	0x121db
+	.4byte	0x12202
 	.uleb128 0x58
-	.4byte	0x121e7
+	.4byte	0x1220e
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x143a9
-	.8byte	.LBB1896
-	.8byte	.LBE1896-.LBB1896
+	.4byte	0x143d0
+	.8byte	.LBB1902
+	.8byte	.LBE1902-.LBB1902
 	.byte	0x1
 	.2byte	0x773
-	.4byte	0x11e79
+	.4byte	0x11eba
 	.uleb128 0x55
-	.4byte	0x143c4
+	.4byte	0x143eb
 	.uleb128 0x55
-	.4byte	0x143b9
+	.4byte	0x143e0
 	.uleb128 0x57
-	.8byte	.LBB1897
-	.8byte	.LBE1897-.LBB1897
+	.8byte	.LBB1903
+	.8byte	.LBE1903-.LBB1903
 	.uleb128 0x58
-	.4byte	0x143d0
+	.4byte	0x143f7
 	.uleb128 0x4f
-	.8byte	.LVL1025
-	.4byte	0x1507e
+	.8byte	.LVL1032
+	.4byte	0x150a5
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL879
-	.4byte	0x154fe
-	.uleb128 0x4f
-	.8byte	.LVL880
-	.4byte	0x1513c
+	.4byte	0x15525
 	.uleb128 0x4f
 	.8byte	.LVL881
-	.4byte	0x15267
+	.4byte	0x15378
+	.uleb128 0x4f
+	.8byte	.LVL882
+	.4byte	0x1528e
 	.uleb128 0x4f
 	.8byte	.LVL883
-	.4byte	0x15351
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL884
-	.4byte	0x15267
+	.4byte	0x15531
 	.uleb128 0x4f
 	.8byte	.LVL885
-	.4byte	0x152e1
+	.4byte	0x154e9
 	.uleb128 0x4f
-	.8byte	.LVL886
-	.4byte	0x1550a
-	.uleb128 0x4f
-	.8byte	.LVL887
-	.4byte	0x154c2
-	.uleb128 0x4f
-	.8byte	.LVL906
-	.4byte	0x122f4
+	.8byte	.LVL904
+	.4byte	0x15163
 	.uleb128 0x4f
-	.8byte	.LVL907
-	.4byte	0x152e1
+	.8byte	.LVL905
+	.4byte	0x15378
 	.uleb128 0x4f
-	.8byte	.LVL909
-	.4byte	0x1550a
+	.8byte	.LVL910
+	.4byte	0x1231b
 	.uleb128 0x4f
 	.8byte	.LVL911
-	.4byte	0x153bf
-	.uleb128 0x4f
-	.8byte	.LVL912
-	.4byte	0x153bf
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL913
-	.4byte	0x153bf
-	.uleb128 0x4f
-	.8byte	.LVL931
-	.4byte	0x15516
+	.4byte	0x15531
 	.uleb128 0x4f
-	.8byte	.LVL933
-	.4byte	0x153bf
-	.uleb128 0x4f
-	.8byte	.LVL943
-	.4byte	0x15516
+	.8byte	.LVL916
+	.4byte	0x153e6
 	.uleb128 0x4f
-	.8byte	.LVL945
-	.4byte	0x1550a
+	.8byte	.LVL917
+	.4byte	0x153e6
 	.uleb128 0x4f
-	.8byte	.LVL946
-	.4byte	0x154c2
+	.8byte	.LVL935
+	.4byte	0x1553d
 	.uleb128 0x4f
-	.8byte	.LVL947
-	.4byte	0x142c4
+	.8byte	.LVL936
+	.4byte	0x153e6
 	.uleb128 0x4f
-	.8byte	.LVL948
-	.4byte	0x15522
+	.8byte	.LVL943
+	.4byte	0x15549
 	.uleb128 0x4f
-	.8byte	.LVL949
-	.4byte	0x15267
+	.8byte	.LVL944
+	.4byte	0x1528e
 	.uleb128 0x4f
-	.8byte	.LVL950
-	.4byte	0x12736
+	.8byte	.LVL945
+	.4byte	0x15163
 	.uleb128 0x4f
 	.8byte	.LVL953
-	.4byte	0x1519d
-	.uleb128 0x4f
-	.8byte	.LVL954
-	.4byte	0x122f4
+	.4byte	0x154e9
 	.uleb128 0x4f
 	.8byte	.LVL955
-	.4byte	0x15267
+	.4byte	0x1528e
 	.uleb128 0x4f
 	.8byte	.LVL956
-	.4byte	0x12736
+	.4byte	0x1275d
 	.uleb128 0x4f
 	.8byte	.LVL957
-	.4byte	0x15351
+	.4byte	0x15378
 	.uleb128 0x4f
 	.8byte	.LVL960
-	.4byte	0x15351
+	.4byte	0x15378
 	.uleb128 0x4f
 	.8byte	.LVL963
-	.4byte	0x15267
+	.4byte	0x1528e
 	.uleb128 0x4f
 	.8byte	.LVL964
-	.4byte	0x153b3
-	.uleb128 0x4f
-	.8byte	.LVL965
-	.4byte	0x1550a
+	.4byte	0x153da
 	.uleb128 0x4f
 	.8byte	.LVL967
-	.4byte	0x154c2
+	.4byte	0x151c4
 	.uleb128 0x4f
-	.8byte	.LVL969
-	.4byte	0x15267
+	.8byte	.LVL970
+	.4byte	0x1553d
+	.uleb128 0x4f
+	.8byte	.LVL971
+	.4byte	0x153e6
 	.uleb128 0x4f
 	.8byte	.LVL972
-	.4byte	0x15267
+	.4byte	0x15531
 	.uleb128 0x4f
 	.8byte	.LVL973
-	.4byte	0x1412a
+	.4byte	0x154e9
 	.uleb128 0x4f
 	.8byte	.LVL974
-	.4byte	0x15522
+	.4byte	0x142eb
 	.uleb128 0x4f
 	.8byte	.LVL975
-	.4byte	0x122f4
+	.4byte	0x15555
 	.uleb128 0x4f
 	.8byte	.LVL976
-	.4byte	0x15267
+	.4byte	0x1528e
 	.uleb128 0x4f
 	.8byte	.LVL977
-	.4byte	0x12736
+	.4byte	0x1275d
 	.uleb128 0x4f
 	.8byte	.LVL978
-	.4byte	0x153bf
+	.4byte	0x14151
 	.uleb128 0x4f
-	.8byte	.LVL985
-	.4byte	0x122f4
+	.8byte	.LVL979
+	.4byte	0x15555
 	.uleb128 0x4f
-	.8byte	.LVL986
-	.4byte	0x15267
+	.8byte	.LVL980
+	.4byte	0x1231b
 	.uleb128 0x4f
-	.8byte	.LVL987
-	.4byte	0x12736
+	.8byte	.LVL981
+	.4byte	0x1528e
 	.uleb128 0x4f
-	.8byte	.LVL990
-	.4byte	0x15267
+	.8byte	.LVL982
+	.4byte	0x1275d
 	.uleb128 0x4f
-	.8byte	.LVL991
-	.4byte	0x153b3
+	.8byte	.LVL983
+	.4byte	0x1528e
 	.uleb128 0x4f
-	.8byte	.LVL993
-	.4byte	0x15267
+	.8byte	.LVL986
+	.4byte	0x1528e
 	.uleb128 0x4f
-	.8byte	.LVL994
-	.4byte	0x1550a
+	.8byte	.LVL991
+	.4byte	0x1528e
 	.uleb128 0x4f
-	.8byte	.LVL995
-	.4byte	0x154c2
+	.8byte	.LVL993
+	.4byte	0x153e6
 	.uleb128 0x4f
 	.8byte	.LVL1000
-	.4byte	0x15267
+	.4byte	0x1231b
 	.uleb128 0x4f
-	.8byte	.LVL1002
-	.4byte	0x1552e
+	.8byte	.LVL1001
+	.4byte	0x1528e
 	.uleb128 0x4f
-	.8byte	.LVL1006
-	.4byte	0x1519d
+	.8byte	.LVL1002
+	.4byte	0x1275d
 	.uleb128 0x4f
-	.8byte	.LVL1015
-	.4byte	0x1552e
+	.8byte	.LVL1004
+	.4byte	0x1528e
 	.uleb128 0x4f
-	.8byte	.LVL1016
-	.4byte	0x15267
+	.8byte	.LVL1005
+	.4byte	0x153da
 	.uleb128 0x4f
-	.8byte	.LVL1017
-	.4byte	0x1513c
+	.8byte	.LVL1007
+	.4byte	0x1528e
 	.uleb128 0x4f
-	.8byte	.LVL1027
-	.4byte	0x141f1
+	.8byte	.LVL1008
+	.4byte	0x15531
 	.uleb128 0x4f
-	.8byte	.LVL1029
-	.4byte	0x153bf
+	.8byte	.LVL1009
+	.4byte	0x154e9
 	.uleb128 0x4f
-	.8byte	.LVL1031
-	.4byte	0x152e1
+	.8byte	.LVL1018
+	.4byte	0x14218
 	.uleb128 0x4f
-	.8byte	.LVL1032
-	.4byte	0x1519d
+	.8byte	.LVL1028
+	.4byte	0x151c4
 	.uleb128 0x4f
-	.8byte	.LVL1033
-	.4byte	0x153bf
+	.8byte	.LVL1034
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL1035
-	.4byte	0x1519d
+	.4byte	0x151c4
 	.uleb128 0x4f
 	.8byte	.LVL1036
-	.4byte	0x15415
+	.4byte	0x153e6
+	.uleb128 0x4f
+	.8byte	.LVL1038
+	.4byte	0x153e6
+	.uleb128 0x4f
+	.8byte	.LVL1040
+	.4byte	0x15549
+	.uleb128 0x4f
+	.8byte	.LVL1042
+	.4byte	0x151c4
+	.uleb128 0x4f
+	.8byte	.LVL1044
+	.4byte	0x1543c
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3106
 	.byte	0x1
 	.2byte	0x755
 	.byte	0x1
-	.4byte	0x121f4
+	.4byte	0x1221b
 	.uleb128 0x66
 	.4byte	.LASF3107
 	.byte	0x1
@@ -45018,7 +45072,7 @@ __exitcall_ebc_exit:
 	.2byte	0x739
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x12284
+	.4byte	0x122ab
 	.uleb128 0x66
 	.4byte	.LASF3112
 	.byte	0x1
@@ -45080,7 +45134,7 @@ __exitcall_ebc_exit:
 	.2byte	0x71d
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x122f4
+	.4byte	0x1231b
 	.uleb128 0x65
 	.string	"buf"
 	.byte	0x1
@@ -45131,7 +45185,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2834-.LFB2834
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1248b
+	.4byte	0x124b2
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
@@ -45168,74 +45222,74 @@ __exitcall_ebc_exit:
 	.2byte	0x6b6
 	.4byte	0xd8a3
 	.uleb128 0x54
-	.4byte	0x146bc
-	.8byte	.LBB1230
-	.8byte	.LBE1230-.LBB1230
+	.4byte	0x146e3
+	.8byte	.LBB1232
+	.8byte	.LBE1232-.LBB1232
 	.byte	0x1
 	.2byte	0x6bb
-	.4byte	0x12393
+	.4byte	0x123ba
 	.uleb128 0x55
-	.4byte	0x146d8
+	.4byte	0x146ff
 	.uleb128 0x55
-	.4byte	0x146cc
+	.4byte	0x146f3
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL283
-	.4byte	0x15267
+	.4byte	0x1528e
 	.uleb128 0x4f
 	.8byte	.LVL284
-	.4byte	0x1553a
+	.4byte	0x15561
 	.uleb128 0x4f
 	.8byte	.LVL289
-	.4byte	0x152e1
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL290
-	.4byte	0x15267
+	.4byte	0x1528e
 	.uleb128 0x4f
 	.8byte	.LVL292
-	.4byte	0x1553a
+	.4byte	0x15561
 	.uleb128 0x4f
 	.8byte	.LVL293
-	.4byte	0x152e1
+	.4byte	0x15308
 	.uleb128 0x4f
 	.8byte	.LVL294
-	.4byte	0x1553a
+	.4byte	0x15561
 	.uleb128 0x4f
 	.8byte	.LVL295
-	.4byte	0x1553a
+	.4byte	0x15561
 	.uleb128 0x4f
 	.8byte	.LVL296
-	.4byte	0x1553a
+	.4byte	0x15561
 	.uleb128 0x4f
 	.8byte	.LVL297
-	.4byte	0x1553a
+	.4byte	0x15561
 	.uleb128 0x4f
 	.8byte	.LVL298
-	.4byte	0x1553a
+	.4byte	0x15561
 	.uleb128 0x4f
 	.8byte	.LVL299
-	.4byte	0x1553a
+	.4byte	0x15561
 	.uleb128 0x4f
 	.8byte	.LVL300
-	.4byte	0x1553a
+	.4byte	0x15561
 	.uleb128 0x4f
 	.8byte	.LVL301
-	.4byte	0x1553a
+	.4byte	0x15561
 	.uleb128 0x4f
 	.8byte	.LVL302
-	.4byte	0x1553a
+	.4byte	0x15561
 	.uleb128 0x4f
 	.8byte	.LVL303
-	.4byte	0x1553a
+	.4byte	0x15561
 	.uleb128 0x4f
 	.8byte	.LVL304
-	.4byte	0x1553a
+	.4byte	0x15561
 	.uleb128 0x4f
 	.8byte	.LVL305
-	.4byte	0x15267
+	.4byte	0x1528e
 	.uleb128 0x4f
 	.8byte	.LVL306
-	.4byte	0x15415
+	.4byte	0x1543c
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3128
@@ -45245,7 +45299,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2833-.LFB2833
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12544
+	.4byte	0x1256b
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
@@ -45258,34 +45312,34 @@ __exitcall_ebc_exit:
 	.4byte	0xe1f4
 	.uleb128 0x4f
 	.8byte	.LVL265
-	.4byte	0x15267
+	.4byte	0x1528e
 	.uleb128 0x4f
 	.8byte	.LVL266
-	.4byte	0x153b3
+	.4byte	0x153da
 	.uleb128 0x4f
 	.8byte	.LVL267
-	.4byte	0x153b3
+	.4byte	0x153da
 	.uleb128 0x4f
 	.8byte	.LVL268
-	.4byte	0x15312
+	.4byte	0x15339
 	.uleb128 0x4f
 	.8byte	.LVL269
-	.4byte	0x15267
+	.4byte	0x1528e
 	.uleb128 0x4f
 	.8byte	.LVL270
-	.4byte	0x152cb
+	.4byte	0x152f2
 	.uleb128 0x4f
 	.8byte	.LVL271
-	.4byte	0x15351
+	.4byte	0x15378
 	.uleb128 0x4f
 	.8byte	.LVL272
-	.4byte	0x153b3
+	.4byte	0x153da
 	.uleb128 0x4f
 	.8byte	.LVL273
-	.4byte	0x153b3
+	.4byte	0x153da
 	.uleb128 0x4f
 	.8byte	.LVL274
-	.4byte	0x15312
+	.4byte	0x15339
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3129
@@ -45296,7 +45350,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2832-.LFB2832
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12726
+	.4byte	0x1274d
 	.uleb128 0x59
 	.4byte	.LASF794
 	.byte	0x1
@@ -45322,12 +45376,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe874
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x1020
-	.4byte	0x1262e
+	.4byte	0x12655
 	.uleb128 0x41
 	.byte	0x8
 	.byte	0x1
 	.2byte	0x637
-	.4byte	0x125c7
+	.4byte	0x125ee
 	.uleb128 0x43
 	.4byte	.LASF3130
 	.byte	0x1
@@ -45337,107 +45391,107 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x1
 	.2byte	0x637
-	.4byte	0x12726
+	.4byte	0x1274d
 	.byte	0
 	.uleb128 0x53
 	.string	"__u"
 	.byte	0x1
 	.2byte	0x637
-	.4byte	0x125a5
+	.4byte	0x125cc
 	.uleb128 0x5c
-	.4byte	0x14f18
-	.8byte	.LBB1810
+	.4byte	0x14f3f
+	.8byte	.LBB1812
 	.4byte	.Ldebug_ranges0+0x1060
 	.byte	0x1
 	.2byte	0x637
-	.4byte	0x125fb
+	.4byte	0x12622
 	.uleb128 0x55
-	.4byte	0x14f3b
+	.4byte	0x14f62
 	.uleb128 0x55
-	.4byte	0x14f2f
+	.4byte	0x14f56
 	.uleb128 0x55
-	.4byte	0x14f25
+	.4byte	0x14f4c
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x14d17
-	.8byte	.LBB1813
-	.8byte	.LBE1813-.LBB1813
+	.4byte	0x14d3e
+	.8byte	.LBB1815
+	.8byte	.LBE1815-.LBB1815
 	.byte	0x1
 	.2byte	0x637
 	.uleb128 0x57
-	.8byte	.LBB1814
-	.8byte	.LBE1814-.LBB1814
+	.8byte	.LBB1816
+	.8byte	.LBE1816-.LBB1816
 	.uleb128 0x62
-	.4byte	0x14d27
+	.4byte	0x14d4e
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14bc3
-	.8byte	.LBB1818
-	.8byte	.LBE1818-.LBB1818
+	.4byte	0x14bea
+	.8byte	.LBB1820
+	.8byte	.LBE1820-.LBB1820
 	.byte	0x1
 	.2byte	0x67f
-	.4byte	0x12662
+	.4byte	0x12689
 	.uleb128 0x55
-	.4byte	0x14bdf
+	.4byte	0x14c06
 	.uleb128 0x55
-	.4byte	0x14bd4
+	.4byte	0x14bfb
 	.uleb128 0x4f
 	.8byte	.LVL863
-	.4byte	0x15546
+	.4byte	0x1556d
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL858
-	.4byte	0x15553
+	.4byte	0x1557a
 	.uleb128 0x4f
 	.8byte	.LVL859
-	.4byte	0x15476
+	.4byte	0x1549d
 	.uleb128 0x4f
 	.8byte	.LVL860
-	.4byte	0x1555d
+	.4byte	0x15584
 	.uleb128 0x4f
 	.8byte	.LVL861
-	.4byte	0x14f7b
+	.4byte	0x14fa2
 	.uleb128 0x4f
 	.8byte	.LVL862
-	.4byte	0x13ca6
+	.4byte	0x13ccd
 	.uleb128 0x4f
 	.8byte	.LVL864
-	.4byte	0x14f7b
+	.4byte	0x14fa2
 	.uleb128 0x4f
 	.8byte	.LVL865
-	.4byte	0x1334d
+	.4byte	0x13374
 	.uleb128 0x4f
 	.8byte	.LVL866
-	.4byte	0x14f7b
+	.4byte	0x14fa2
 	.uleb128 0x4f
 	.8byte	.LVL867
-	.4byte	0x12940
+	.4byte	0x12967
 	.uleb128 0x4f
 	.8byte	.LVL868
-	.4byte	0x14f7b
+	.4byte	0x14fa2
 	.uleb128 0x4f
 	.8byte	.LVL869
-	.4byte	0x13e07
+	.4byte	0x13e2e
 	.uleb128 0x4f
 	.8byte	.LVL870
-	.4byte	0x15569
+	.4byte	0x15590
 	.uleb128 0x4f
 	.8byte	.LVL871
-	.4byte	0x14080
+	.4byte	0x140a7
 	.uleb128 0x4f
 	.8byte	.LVL872
-	.4byte	0x13e07
+	.4byte	0x13e2e
 	.uleb128 0x4f
 	.8byte	.LVL873
-	.4byte	0x13ca6
+	.4byte	0x13ccd
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x12736
+	.4byte	0x1275d
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
@@ -45450,7 +45504,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2831-.LFB2831
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x128e2
+	.4byte	0x12909
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
@@ -45474,102 +45528,102 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	__func__.34977
 	.uleb128 0x54
-	.4byte	0x128e2
-	.8byte	.LBB1468
-	.8byte	.LBE1468-.LBB1468
+	.4byte	0x12909
+	.8byte	.LBB1470
+	.8byte	.LBE1470-.LBB1470
 	.byte	0x1
 	.2byte	0x5e5
-	.4byte	0x127c3
+	.4byte	0x127ea
 	.uleb128 0x55
-	.4byte	0x128fb
+	.4byte	0x12922
 	.uleb128 0x55
-	.4byte	0x128ef
+	.4byte	0x12916
 	.uleb128 0x4f
 	.8byte	.LVL552
-	.4byte	0x14f7b
+	.4byte	0x14fa2
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x128e2
-	.8byte	.LBB1470
-	.8byte	.LBE1470-.LBB1470
+	.4byte	0x12909
+	.8byte	.LBB1472
+	.8byte	.LBE1472-.LBB1472
 	.byte	0x1
 	.2byte	0x5f9
-	.4byte	0x127f7
+	.4byte	0x1281e
 	.uleb128 0x55
-	.4byte	0x128fb
+	.4byte	0x12922
 	.uleb128 0x55
-	.4byte	0x128ef
+	.4byte	0x12916
 	.uleb128 0x4f
 	.8byte	.LVL557
-	.4byte	0x14f7b
+	.4byte	0x14fa2
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x128e2
-	.8byte	.LBB1472
-	.8byte	.LBE1472-.LBB1472
+	.4byte	0x12909
+	.8byte	.LBB1474
+	.8byte	.LBE1474-.LBB1474
 	.byte	0x1
 	.2byte	0x620
-	.4byte	0x1282b
+	.4byte	0x12852
 	.uleb128 0x55
-	.4byte	0x128fb
+	.4byte	0x12922
 	.uleb128 0x55
-	.4byte	0x128ef
+	.4byte	0x12916
 	.uleb128 0x4f
 	.8byte	.LVL562
-	.4byte	0x14f7b
+	.4byte	0x14fa2
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x128e2
-	.8byte	.LBB1474
-	.8byte	.LBE1474-.LBB1474
+	.4byte	0x12909
+	.8byte	.LBB1476
+	.8byte	.LBE1476-.LBB1476
 	.byte	0x1
 	.2byte	0x613
-	.4byte	0x1285f
+	.4byte	0x12886
 	.uleb128 0x55
-	.4byte	0x128fb
+	.4byte	0x12922
 	.uleb128 0x55
-	.4byte	0x128ef
+	.4byte	0x12916
 	.uleb128 0x4f
 	.8byte	.LVL567
-	.4byte	0x14f7b
+	.4byte	0x14fa2
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL551
-	.4byte	0x13ca6
+	.4byte	0x13ccd
 	.uleb128 0x4f
 	.8byte	.LVL553
-	.4byte	0x13ca6
+	.4byte	0x13ccd
 	.uleb128 0x4f
 	.8byte	.LVL556
-	.4byte	0x13e07
+	.4byte	0x13e2e
 	.uleb128 0x4f
 	.8byte	.LVL558
-	.4byte	0x13e07
+	.4byte	0x13e2e
 	.uleb128 0x4f
 	.8byte	.LVL561
-	.4byte	0x1334d
+	.4byte	0x13374
 	.uleb128 0x4f
 	.8byte	.LVL563
-	.4byte	0x1334d
+	.4byte	0x13374
 	.uleb128 0x4f
 	.8byte	.LVL566
-	.4byte	0x12940
+	.4byte	0x12967
 	.uleb128 0x4f
 	.8byte	.LVL568
-	.4byte	0x12940
+	.4byte	0x12967
 	.uleb128 0x4f
 	.8byte	.LVL571
-	.4byte	0x15267
+	.4byte	0x1528e
 	.uleb128 0x4f
 	.8byte	.LVL574
-	.4byte	0x15267
+	.4byte	0x1528e
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3132
 	.byte	0x1
 	.2byte	0x5cf
 	.byte	0x1
-	.4byte	0x12908
+	.4byte	0x1292f
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
@@ -45586,7 +45640,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x5c4
 	.byte	0x1
-	.4byte	0x1293a
+	.4byte	0x12961
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
@@ -45601,7 +45655,7 @@ __exitcall_ebc_exit:
 	.string	"buf"
 	.byte	0x1
 	.2byte	0x5c6
-	.4byte	0x1293a
+	.4byte	0x12961
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -45614,7 +45668,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2828-.LFB2828
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12eef
+	.4byte	0x12f16
 	.uleb128 0x75
 	.4byte	.LASF3135
 	.byte	0x1
@@ -45641,478 +45695,478 @@ __exitcall_ebc_exit:
 	.4byte	0xe874
 	.4byte	.LLST144
 	.uleb128 0x54
-	.4byte	0x12eef
-	.8byte	.LBB1378
-	.8byte	.LBE1378-.LBB1378
+	.4byte	0x12f16
+	.8byte	.LBB1380
+	.8byte	.LBE1380-.LBB1380
 	.byte	0x1
 	.2byte	0x5c0
-	.4byte	0x12a49
+	.4byte	0x12a70
 	.uleb128 0x55
-	.4byte	0x12f20
+	.4byte	0x12f47
 	.uleb128 0x55
-	.4byte	0x12f20
+	.4byte	0x12f47
 	.uleb128 0x55
-	.4byte	0x12f20
+	.4byte	0x12f47
 	.uleb128 0x55
-	.4byte	0x12f14
+	.4byte	0x12f3b
 	.uleb128 0x72
-	.4byte	0x12f08
+	.4byte	0x12f2f
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x12efc
+	.4byte	0x12f23
 	.uleb128 0x57
-	.8byte	.LBB1379
-	.8byte	.LBE1379-.LBB1379
+	.8byte	.LBB1381
+	.8byte	.LBE1381-.LBB1381
 	.uleb128 0x58
-	.4byte	0x12f2c
+	.4byte	0x12f53
 	.uleb128 0x61
-	.4byte	0x12f38
+	.4byte	0x12f5f
 	.4byte	.LLST145
 	.uleb128 0x58
-	.4byte	0x12f44
+	.4byte	0x12f6b
 	.uleb128 0x58
-	.4byte	0x12f50
+	.4byte	0x12f77
 	.uleb128 0x58
-	.4byte	0x12f5c
+	.4byte	0x12f83
 	.uleb128 0x58
-	.4byte	0x12f68
+	.4byte	0x12f8f
 	.uleb128 0x61
-	.4byte	0x12f74
+	.4byte	0x12f9b
 	.4byte	.LLST146
 	.uleb128 0x61
-	.4byte	0x12f80
+	.4byte	0x12fa7
 	.4byte	.LLST147
 	.uleb128 0x58
-	.4byte	0x12f8c
+	.4byte	0x12fb3
 	.uleb128 0x61
-	.4byte	0x12f98
+	.4byte	0x12fbf
 	.4byte	.LLST148
 	.uleb128 0x58
-	.4byte	0x12fa2
+	.4byte	0x12fc9
 	.uleb128 0x61
-	.4byte	0x12fac
+	.4byte	0x12fd3
 	.4byte	.LLST149
 	.uleb128 0x61
-	.4byte	0x12fb8
+	.4byte	0x12fdf
 	.4byte	.LLST150
 	.uleb128 0x58
-	.4byte	0x12fc4
+	.4byte	0x12feb
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x131a1
-	.8byte	.LBB1380
+	.4byte	0x131c8
+	.8byte	.LBB1382
 	.4byte	.Ldebug_ranges0+0x9c0
 	.byte	0x1
 	.2byte	0x5b9
-	.4byte	0x12c0b
+	.4byte	0x12c32
 	.uleb128 0x55
-	.4byte	0x131d2
+	.4byte	0x131f9
 	.uleb128 0x55
-	.4byte	0x131d2
+	.4byte	0x131f9
 	.uleb128 0x55
-	.4byte	0x131d2
+	.4byte	0x131f9
 	.uleb128 0x55
-	.4byte	0x131c6
+	.4byte	0x131ed
 	.uleb128 0x55
-	.4byte	0x131ba
+	.4byte	0x131e1
 	.uleb128 0x55
-	.4byte	0x131ae
+	.4byte	0x131d5
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x9c0
 	.uleb128 0x58
-	.4byte	0x131de
+	.4byte	0x13205
 	.uleb128 0x61
-	.4byte	0x131ea
+	.4byte	0x13211
 	.4byte	.LLST151
 	.uleb128 0x61
-	.4byte	0x131f6
+	.4byte	0x1321d
 	.4byte	.LLST152
 	.uleb128 0x61
-	.4byte	0x13202
+	.4byte	0x13229
 	.4byte	.LLST153
 	.uleb128 0x61
-	.4byte	0x1320e
+	.4byte	0x13235
 	.4byte	.LLST154
 	.uleb128 0x61
-	.4byte	0x1321a
+	.4byte	0x13241
 	.4byte	.LLST155
 	.uleb128 0x61
-	.4byte	0x13226
+	.4byte	0x1324d
 	.4byte	.LLST156
 	.uleb128 0x61
-	.4byte	0x13232
+	.4byte	0x13259
 	.4byte	.LLST157
 	.uleb128 0x61
-	.4byte	0x1323e
+	.4byte	0x13265
 	.4byte	.LLST158
 	.uleb128 0x58
-	.4byte	0x13248
+	.4byte	0x1326f
 	.uleb128 0x61
-	.4byte	0x13252
+	.4byte	0x13279
 	.4byte	.LLST159
 	.uleb128 0x61
-	.4byte	0x1325e
+	.4byte	0x13285
 	.4byte	.LLST160
 	.uleb128 0x58
-	.4byte	0x1326a
+	.4byte	0x13291
 	.uleb128 0x5c
-	.4byte	0x14427
-	.8byte	.LBB1382
+	.4byte	0x1444e
+	.8byte	.LBB1384
 	.4byte	.Ldebug_ranges0+0xa00
 	.byte	0x1
 	.2byte	0x4de
-	.4byte	0x12b29
+	.4byte	0x12b50
 	.uleb128 0x55
-	.4byte	0x1444f
+	.4byte	0x14476
 	.uleb128 0x55
-	.4byte	0x14443
+	.4byte	0x1446a
 	.uleb128 0x55
-	.4byte	0x14437
+	.4byte	0x1445e
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa00
 	.uleb128 0x58
-	.4byte	0x1445b
+	.4byte	0x14482
 	.uleb128 0x61
-	.4byte	0x14466
+	.4byte	0x1448d
 	.4byte	.LLST161
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14427
-	.8byte	.LBB1385
-	.8byte	.LBE1385-.LBB1385
+	.4byte	0x1444e
+	.8byte	.LBB1387
+	.8byte	.LBE1387-.LBB1387
 	.byte	0x1
 	.2byte	0x4db
-	.4byte	0x12b75
+	.4byte	0x12b9c
 	.uleb128 0x55
-	.4byte	0x1444f
+	.4byte	0x14476
 	.uleb128 0x55
-	.4byte	0x14443
+	.4byte	0x1446a
 	.uleb128 0x55
-	.4byte	0x14437
+	.4byte	0x1445e
 	.uleb128 0x57
-	.8byte	.LBB1386
-	.8byte	.LBE1386-.LBB1386
+	.8byte	.LBB1388
+	.8byte	.LBE1388-.LBB1388
 	.uleb128 0x58
-	.4byte	0x1445b
+	.4byte	0x14482
 	.uleb128 0x61
-	.4byte	0x14466
+	.4byte	0x1448d
 	.4byte	.LLST162
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14427
-	.8byte	.LBB1387
-	.8byte	.LBE1387-.LBB1387
+	.4byte	0x1444e
+	.8byte	.LBB1389
+	.8byte	.LBE1389-.LBB1389
 	.byte	0x1
 	.2byte	0x4dc
-	.4byte	0x12bc1
+	.4byte	0x12be8
 	.uleb128 0x55
-	.4byte	0x1444f
+	.4byte	0x14476
 	.uleb128 0x55
-	.4byte	0x14443
+	.4byte	0x1446a
 	.uleb128 0x55
-	.4byte	0x14437
+	.4byte	0x1445e
 	.uleb128 0x57
-	.8byte	.LBB1388
-	.8byte	.LBE1388-.LBB1388
+	.8byte	.LBB1390
+	.8byte	.LBE1390-.LBB1390
 	.uleb128 0x58
-	.4byte	0x1445b
+	.4byte	0x14482
 	.uleb128 0x61
-	.4byte	0x14466
+	.4byte	0x1448d
 	.4byte	.LLST163
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x14427
-	.8byte	.LBB1389
-	.8byte	.LBE1389-.LBB1389
+	.4byte	0x1444e
+	.8byte	.LBB1391
+	.8byte	.LBE1391-.LBB1391
 	.byte	0x1
 	.2byte	0x4dd
 	.uleb128 0x55
-	.4byte	0x1444f
+	.4byte	0x14476
 	.uleb128 0x55
-	.4byte	0x14443
+	.4byte	0x1446a
 	.uleb128 0x55
-	.4byte	0x14437
+	.4byte	0x1445e
 	.uleb128 0x57
-	.8byte	.LBB1390
-	.8byte	.LBE1390-.LBB1390
+	.8byte	.LBB1392
+	.8byte	.LBE1392-.LBB1392
 	.uleb128 0x58
-	.4byte	0x1445b
+	.4byte	0x14482
 	.uleb128 0x61
-	.4byte	0x14466
+	.4byte	0x1448d
 	.4byte	.LLST164
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12fd1
-	.8byte	.LBB1395
-	.8byte	.LBE1395-.LBB1395
+	.4byte	0x12ff8
+	.8byte	.LBB1397
+	.8byte	.LBE1397-.LBB1397
 	.byte	0x1
 	.2byte	0x5be
-	.4byte	0x12cb4
+	.4byte	0x12cdb
 	.uleb128 0x55
-	.4byte	0x13002
+	.4byte	0x13029
 	.uleb128 0x55
-	.4byte	0x13002
+	.4byte	0x13029
 	.uleb128 0x55
-	.4byte	0x13002
+	.4byte	0x13029
 	.uleb128 0x55
-	.4byte	0x12ff6
+	.4byte	0x1301d
 	.uleb128 0x72
-	.4byte	0x12fea
+	.4byte	0x13011
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x12fde
+	.4byte	0x13005
 	.uleb128 0x57
-	.8byte	.LBB1396
-	.8byte	.LBE1396-.LBB1396
+	.8byte	.LBB1398
+	.8byte	.LBE1398-.LBB1398
 	.uleb128 0x58
-	.4byte	0x1300e
+	.4byte	0x13035
 	.uleb128 0x58
-	.4byte	0x1301a
+	.4byte	0x13041
 	.uleb128 0x58
-	.4byte	0x13026
+	.4byte	0x1304d
 	.uleb128 0x58
-	.4byte	0x13032
+	.4byte	0x13059
 	.uleb128 0x58
-	.4byte	0x1303e
+	.4byte	0x13065
 	.uleb128 0x58
-	.4byte	0x1304a
+	.4byte	0x13071
 	.uleb128 0x61
-	.4byte	0x13056
+	.4byte	0x1307d
 	.4byte	.LLST165
 	.uleb128 0x61
-	.4byte	0x13062
+	.4byte	0x13089
 	.4byte	.LLST166
 	.uleb128 0x58
-	.4byte	0x1306e
+	.4byte	0x13095
 	.uleb128 0x61
-	.4byte	0x1307a
+	.4byte	0x130a1
 	.4byte	.LLST167
 	.uleb128 0x58
-	.4byte	0x13084
+	.4byte	0x130ab
 	.uleb128 0x61
-	.4byte	0x1308e
+	.4byte	0x130b5
 	.4byte	.LLST168
 	.uleb128 0x61
-	.4byte	0x1309a
+	.4byte	0x130c1
 	.4byte	.LLST169
 	.uleb128 0x58
-	.4byte	0x130a6
+	.4byte	0x130cd
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13277
-	.8byte	.LBB1397
+	.4byte	0x1329e
+	.8byte	.LBB1399
 	.4byte	.Ldebug_ranges0+0xa30
 	.byte	0x1
 	.2byte	0x5bb
-	.4byte	0x12dc2
+	.4byte	0x12de9
 	.uleb128 0x55
-	.4byte	0x132a8
+	.4byte	0x132cf
 	.uleb128 0x55
-	.4byte	0x132a8
+	.4byte	0x132cf
 	.uleb128 0x55
-	.4byte	0x132a8
+	.4byte	0x132cf
 	.uleb128 0x55
-	.4byte	0x1329c
+	.4byte	0x132c3
 	.uleb128 0x55
-	.4byte	0x13290
+	.4byte	0x132b7
 	.uleb128 0x55
-	.4byte	0x13284
+	.4byte	0x132ab
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa30
 	.uleb128 0x58
-	.4byte	0x132b4
+	.4byte	0x132db
 	.uleb128 0x58
-	.4byte	0x132c0
+	.4byte	0x132e7
 	.uleb128 0x58
-	.4byte	0x132cc
+	.4byte	0x132f3
 	.uleb128 0x62
-	.4byte	0x132d8
+	.4byte	0x132ff
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x132e4
+	.4byte	0x1330b
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x132f0
+	.4byte	0x13317
 	.4byte	.LLST170
 	.uleb128 0x61
-	.4byte	0x132fc
+	.4byte	0x13323
 	.4byte	.LLST171
 	.uleb128 0x61
-	.4byte	0x13308
+	.4byte	0x1332f
 	.4byte	.LLST172
 	.uleb128 0x61
-	.4byte	0x13314
+	.4byte	0x1333b
 	.4byte	.LLST173
 	.uleb128 0x58
-	.4byte	0x1331e
+	.4byte	0x13345
 	.uleb128 0x61
-	.4byte	0x13328
+	.4byte	0x1334f
 	.4byte	.LLST174
 	.uleb128 0x61
-	.4byte	0x13334
+	.4byte	0x1335b
 	.4byte	.LLST175
 	.uleb128 0x58
-	.4byte	0x13340
+	.4byte	0x13367
 	.uleb128 0x5c
-	.4byte	0x14427
-	.8byte	.LBB1399
+	.4byte	0x1444e
+	.8byte	.LBB1401
 	.4byte	.Ldebug_ranges0+0xa60
 	.byte	0x1
 	.2byte	0x4b3
-	.4byte	0x12d88
+	.4byte	0x12daf
 	.uleb128 0x55
-	.4byte	0x1444f
+	.4byte	0x14476
 	.uleb128 0x55
-	.4byte	0x14443
+	.4byte	0x1446a
 	.uleb128 0x55
-	.4byte	0x14437
+	.4byte	0x1445e
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa60
 	.uleb128 0x58
-	.4byte	0x1445b
+	.4byte	0x14482
 	.uleb128 0x61
-	.4byte	0x14466
+	.4byte	0x1448d
 	.4byte	.LLST176
 	.byte	0
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x14427
-	.8byte	.LBB1406
+	.4byte	0x1444e
+	.8byte	.LBB1408
 	.4byte	.Ldebug_ranges0+0xad0
 	.byte	0x1
 	.2byte	0x4b2
 	.uleb128 0x55
-	.4byte	0x1444f
+	.4byte	0x14476
 	.uleb128 0x55
-	.4byte	0x14443
+	.4byte	0x1446a
 	.uleb128 0x55
-	.4byte	0x14437
+	.4byte	0x1445e
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xad0
 	.uleb128 0x58
-	.4byte	0x1445b
+	.4byte	0x14482
 	.uleb128 0x61
-	.4byte	0x14466
+	.4byte	0x1448d
 	.4byte	.LLST177
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x130b3
-	.8byte	.LBB1424
-	.8byte	.LBE1424-.LBB1424
+	.4byte	0x130da
+	.8byte	.LBB1426
+	.8byte	.LBE1426-.LBB1426
 	.byte	0x1
 	.2byte	0x5b5
 	.uleb128 0x55
-	.4byte	0x130e4
+	.4byte	0x1310b
 	.uleb128 0x55
-	.4byte	0x130e4
+	.4byte	0x1310b
 	.uleb128 0x55
-	.4byte	0x130e4
+	.4byte	0x1310b
 	.uleb128 0x55
-	.4byte	0x130d8
+	.4byte	0x130ff
 	.uleb128 0x55
-	.4byte	0x130cc
+	.4byte	0x130f3
 	.uleb128 0x55
-	.4byte	0x130c0
+	.4byte	0x130e7
 	.uleb128 0x57
-	.8byte	.LBB1425
-	.8byte	.LBE1425-.LBB1425
+	.8byte	.LBB1427
+	.8byte	.LBE1427-.LBB1427
 	.uleb128 0x58
-	.4byte	0x130f0
+	.4byte	0x13117
 	.uleb128 0x58
-	.4byte	0x130fc
+	.4byte	0x13123
 	.uleb128 0x58
-	.4byte	0x13108
+	.4byte	0x1312f
 	.uleb128 0x62
-	.4byte	0x13114
+	.4byte	0x1313b
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x13120
+	.4byte	0x13147
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x1312c
+	.4byte	0x13153
 	.4byte	.LLST178
 	.uleb128 0x61
-	.4byte	0x13138
+	.4byte	0x1315f
 	.4byte	.LLST179
 	.uleb128 0x61
-	.4byte	0x13144
+	.4byte	0x1316b
 	.4byte	.LLST180
 	.uleb128 0x61
-	.4byte	0x13150
+	.4byte	0x13177
 	.4byte	.LLST181
 	.uleb128 0x58
-	.4byte	0x1315a
+	.4byte	0x13181
 	.uleb128 0x61
-	.4byte	0x13164
+	.4byte	0x1318b
 	.4byte	.LLST182
 	.uleb128 0x61
-	.4byte	0x13170
+	.4byte	0x13197
 	.4byte	.LLST183
 	.uleb128 0x58
-	.4byte	0x1317c
+	.4byte	0x131a3
 	.uleb128 0x58
-	.4byte	0x13188
+	.4byte	0x131af
 	.uleb128 0x58
-	.4byte	0x13194
+	.4byte	0x131bb
 	.uleb128 0x5c
-	.4byte	0x143dc
-	.8byte	.LBB1426
+	.4byte	0x14403
+	.8byte	.LBB1428
 	.4byte	.Ldebug_ranges0+0xb30
 	.byte	0x1
 	.2byte	0x509
-	.4byte	0x12eb0
+	.4byte	0x12ed7
 	.uleb128 0x55
-	.4byte	0x14404
+	.4byte	0x1442b
 	.uleb128 0x55
-	.4byte	0x143f8
+	.4byte	0x1441f
 	.uleb128 0x55
-	.4byte	0x143ec
+	.4byte	0x14413
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xb30
 	.uleb128 0x61
-	.4byte	0x14410
+	.4byte	0x14437
 	.4byte	.LLST184
 	.uleb128 0x61
-	.4byte	0x1441b
+	.4byte	0x14442
 	.4byte	.LLST185
 	.byte	0
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x143dc
-	.8byte	.LBB1433
+	.4byte	0x14403
+	.8byte	.LBB1435
 	.4byte	.Ldebug_ranges0+0xba0
 	.byte	0x1
 	.2byte	0x508
 	.uleb128 0x55
-	.4byte	0x14404
+	.4byte	0x1442b
 	.uleb128 0x55
-	.4byte	0x143f8
+	.4byte	0x1441f
 	.uleb128 0x55
-	.4byte	0x143ec
+	.4byte	0x14413
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xba0
 	.uleb128 0x61
-	.4byte	0x14410
+	.4byte	0x14437
 	.4byte	.LLST186
 	.uleb128 0x61
-	.4byte	0x1441b
+	.4byte	0x14442
 	.4byte	.LLST187
 	.byte	0
 	.byte	0
@@ -46124,7 +46178,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x561
 	.byte	0x1
-	.4byte	0x12fd1
+	.4byte	0x12ff8
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
@@ -46221,7 +46275,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x513
 	.byte	0x1
-	.4byte	0x130b3
+	.4byte	0x130da
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
@@ -46318,7 +46372,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x4e9
 	.byte	0x1
-	.4byte	0x131a1
+	.4byte	0x131c8
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
@@ -46420,7 +46474,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x4be
 	.byte	0x1
-	.4byte	0x13277
+	.4byte	0x1329e
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
@@ -46512,7 +46566,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x495
 	.byte	0x1
-	.4byte	0x1334d
+	.4byte	0x13374
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
@@ -46607,7 +46661,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13848
+	.4byte	0x1386f
 	.uleb128 0x75
 	.4byte	.LASF3135
 	.byte	0x1
@@ -46634,414 +46688,414 @@ __exitcall_ebc_exit:
 	.4byte	0xe874
 	.4byte	.LLST107
 	.uleb128 0x54
-	.4byte	0x13848
-	.8byte	.LBB1264
-	.8byte	.LBE1264-.LBB1264
+	.4byte	0x1386f
+	.8byte	.LBB1266
+	.8byte	.LBE1266-.LBB1266
 	.byte	0x1
 	.2byte	0x490
-	.4byte	0x13456
+	.4byte	0x1347d
 	.uleb128 0x55
-	.4byte	0x13879
+	.4byte	0x138a0
 	.uleb128 0x55
-	.4byte	0x13879
+	.4byte	0x138a0
 	.uleb128 0x55
-	.4byte	0x13879
+	.4byte	0x138a0
 	.uleb128 0x55
-	.4byte	0x1386d
+	.4byte	0x13894
 	.uleb128 0x72
-	.4byte	0x13861
+	.4byte	0x13888
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x13855
+	.4byte	0x1387c
 	.uleb128 0x57
-	.8byte	.LBB1265
-	.8byte	.LBE1265-.LBB1265
+	.8byte	.LBB1267
+	.8byte	.LBE1267-.LBB1267
 	.uleb128 0x58
-	.4byte	0x13885
+	.4byte	0x138ac
 	.uleb128 0x61
-	.4byte	0x13891
+	.4byte	0x138b8
 	.4byte	.LLST108
 	.uleb128 0x58
-	.4byte	0x1389d
+	.4byte	0x138c4
 	.uleb128 0x58
-	.4byte	0x138a9
+	.4byte	0x138d0
 	.uleb128 0x58
-	.4byte	0x138b5
+	.4byte	0x138dc
 	.uleb128 0x58
-	.4byte	0x138c1
+	.4byte	0x138e8
 	.uleb128 0x61
-	.4byte	0x138cd
+	.4byte	0x138f4
 	.4byte	.LLST109
 	.uleb128 0x61
-	.4byte	0x138d9
+	.4byte	0x13900
 	.4byte	.LLST110
 	.uleb128 0x58
-	.4byte	0x138e5
+	.4byte	0x1390c
 	.uleb128 0x61
-	.4byte	0x138f1
+	.4byte	0x13918
 	.4byte	.LLST111
 	.uleb128 0x58
-	.4byte	0x138fb
+	.4byte	0x13922
 	.uleb128 0x61
-	.4byte	0x13905
+	.4byte	0x1392c
 	.4byte	.LLST112
 	.uleb128 0x61
-	.4byte	0x13911
+	.4byte	0x13938
 	.4byte	.LLST113
 	.uleb128 0x58
-	.4byte	0x1391d
+	.4byte	0x13944
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13bd0
-	.8byte	.LBB1266
-	.8byte	.LBE1266-.LBB1266
+	.4byte	0x13bf7
+	.8byte	.LBB1268
+	.8byte	.LBE1268-.LBB1268
 	.byte	0x1
 	.2byte	0x489
-	.4byte	0x135a4
+	.4byte	0x135cb
 	.uleb128 0x55
-	.4byte	0x13c01
+	.4byte	0x13c28
 	.uleb128 0x55
-	.4byte	0x13c01
+	.4byte	0x13c28
 	.uleb128 0x55
-	.4byte	0x13c01
+	.4byte	0x13c28
 	.uleb128 0x55
-	.4byte	0x13bf5
+	.4byte	0x13c1c
 	.uleb128 0x55
-	.4byte	0x13be9
+	.4byte	0x13c10
 	.uleb128 0x55
-	.4byte	0x13bdd
+	.4byte	0x13c04
 	.uleb128 0x57
-	.8byte	.LBB1267
-	.8byte	.LBE1267-.LBB1267
+	.8byte	.LBB1269
+	.8byte	.LBE1269-.LBB1269
 	.uleb128 0x58
-	.4byte	0x13c0d
+	.4byte	0x13c34
 	.uleb128 0x61
-	.4byte	0x13c19
+	.4byte	0x13c40
 	.4byte	.LLST114
 	.uleb128 0x58
-	.4byte	0x13c23
+	.4byte	0x13c4a
 	.uleb128 0x61
-	.4byte	0x13c2d
+	.4byte	0x13c54
 	.4byte	.LLST115
 	.uleb128 0x58
-	.4byte	0x13c39
+	.4byte	0x13c60
 	.uleb128 0x61
-	.4byte	0x13c45
+	.4byte	0x13c6c
 	.4byte	.LLST116
 	.uleb128 0x61
-	.4byte	0x13c51
+	.4byte	0x13c78
 	.4byte	.LLST117
 	.uleb128 0x61
-	.4byte	0x13c5d
+	.4byte	0x13c84
 	.4byte	.LLST118
 	.uleb128 0x61
-	.4byte	0x13c69
+	.4byte	0x13c90
 	.4byte	.LLST119
 	.uleb128 0x61
-	.4byte	0x13c75
+	.4byte	0x13c9c
 	.4byte	.LLST120
 	.uleb128 0x61
-	.4byte	0x13c81
+	.4byte	0x13ca8
 	.4byte	.LLST121
 	.uleb128 0x61
-	.4byte	0x13c8d
+	.4byte	0x13cb4
 	.4byte	.LLST122
 	.uleb128 0x58
-	.4byte	0x13c99
+	.4byte	0x13cc0
 	.uleb128 0x5c
-	.4byte	0x144a7
-	.8byte	.LBB1268
+	.4byte	0x144ce
+	.8byte	.LBB1270
 	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
 	.2byte	0x39c
-	.4byte	0x1352e
+	.4byte	0x13555
 	.uleb128 0x55
-	.4byte	0x144cf
+	.4byte	0x144f6
 	.uleb128 0x55
-	.4byte	0x144c3
+	.4byte	0x144ea
 	.uleb128 0x55
-	.4byte	0x144b7
+	.4byte	0x144de
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x144a7
-	.8byte	.LBB1273
+	.4byte	0x144ce
+	.8byte	.LBB1275
 	.4byte	.Ldebug_ranges0+0x720
 	.byte	0x1
 	.2byte	0x39d
-	.4byte	0x13556
+	.4byte	0x1357d
 	.uleb128 0x55
-	.4byte	0x144cf
+	.4byte	0x144f6
 	.uleb128 0x55
-	.4byte	0x144c3
+	.4byte	0x144ea
 	.uleb128 0x55
-	.4byte	0x144b7
+	.4byte	0x144de
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x144a7
-	.8byte	.LBB1285
+	.4byte	0x144ce
+	.8byte	.LBB1287
 	.4byte	.Ldebug_ranges0+0x790
 	.byte	0x1
 	.2byte	0x39e
-	.4byte	0x1357e
+	.4byte	0x135a5
 	.uleb128 0x55
-	.4byte	0x144cf
+	.4byte	0x144f6
 	.uleb128 0x55
-	.4byte	0x144c3
+	.4byte	0x144ea
 	.uleb128 0x55
-	.4byte	0x144b7
+	.4byte	0x144de
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x144a7
-	.8byte	.LBB1297
+	.4byte	0x144ce
+	.8byte	.LBB1299
 	.4byte	.Ldebug_ranges0+0x800
 	.byte	0x1
 	.2byte	0x39f
 	.uleb128 0x55
-	.4byte	0x144cf
+	.4byte	0x144f6
 	.uleb128 0x55
-	.4byte	0x144c3
+	.4byte	0x144ea
 	.uleb128 0x55
-	.4byte	0x144b7
+	.4byte	0x144de
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1392a
-	.8byte	.LBB1308
-	.8byte	.LBE1308-.LBB1308
+	.4byte	0x13951
+	.8byte	.LBB1310
+	.8byte	.LBE1310-.LBB1310
 	.byte	0x1
 	.2byte	0x48e
-	.4byte	0x1364d
+	.4byte	0x13674
 	.uleb128 0x55
-	.4byte	0x1395b
+	.4byte	0x13982
 	.uleb128 0x55
-	.4byte	0x1395b
+	.4byte	0x13982
 	.uleb128 0x55
-	.4byte	0x1395b
+	.4byte	0x13982
 	.uleb128 0x55
-	.4byte	0x1394f
+	.4byte	0x13976
 	.uleb128 0x72
-	.4byte	0x13943
+	.4byte	0x1396a
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x13937
+	.4byte	0x1395e
 	.uleb128 0x57
-	.8byte	.LBB1309
-	.8byte	.LBE1309-.LBB1309
+	.8byte	.LBB1311
+	.8byte	.LBE1311-.LBB1311
 	.uleb128 0x58
-	.4byte	0x13967
+	.4byte	0x1398e
 	.uleb128 0x58
-	.4byte	0x13973
+	.4byte	0x1399a
 	.uleb128 0x58
-	.4byte	0x1397f
+	.4byte	0x139a6
 	.uleb128 0x58
-	.4byte	0x1398b
+	.4byte	0x139b2
 	.uleb128 0x58
-	.4byte	0x13997
+	.4byte	0x139be
 	.uleb128 0x58
-	.4byte	0x139a3
+	.4byte	0x139ca
 	.uleb128 0x61
-	.4byte	0x139af
+	.4byte	0x139d6
 	.4byte	.LLST123
 	.uleb128 0x61
-	.4byte	0x139bb
+	.4byte	0x139e2
 	.4byte	.LLST124
 	.uleb128 0x58
-	.4byte	0x139c7
+	.4byte	0x139ee
 	.uleb128 0x61
-	.4byte	0x139d3
+	.4byte	0x139fa
 	.4byte	.LLST125
 	.uleb128 0x58
-	.4byte	0x139dd
+	.4byte	0x13a04
 	.uleb128 0x61
-	.4byte	0x139e7
+	.4byte	0x13a0e
 	.4byte	.LLST126
 	.uleb128 0x61
-	.4byte	0x139f3
+	.4byte	0x13a1a
 	.4byte	.LLST127
 	.uleb128 0x58
-	.4byte	0x139ff
+	.4byte	0x13a26
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13afa
-	.8byte	.LBB1310
-	.8byte	.LBE1310-.LBB1310
+	.4byte	0x13b21
+	.8byte	.LBB1312
+	.8byte	.LBE1312-.LBB1312
 	.byte	0x1
 	.2byte	0x48b
-	.4byte	0x13747
+	.4byte	0x1376e
 	.uleb128 0x55
-	.4byte	0x13b2b
+	.4byte	0x13b52
 	.uleb128 0x55
-	.4byte	0x13b2b
+	.4byte	0x13b52
 	.uleb128 0x55
-	.4byte	0x13b2b
+	.4byte	0x13b52
 	.uleb128 0x55
-	.4byte	0x13b1f
+	.4byte	0x13b46
 	.uleb128 0x55
-	.4byte	0x13b13
+	.4byte	0x13b3a
 	.uleb128 0x55
-	.4byte	0x13b07
+	.4byte	0x13b2e
 	.uleb128 0x57
-	.8byte	.LBB1311
-	.8byte	.LBE1311-.LBB1311
+	.8byte	.LBB1313
+	.8byte	.LBE1313-.LBB1313
 	.uleb128 0x58
-	.4byte	0x13b37
+	.4byte	0x13b5e
 	.uleb128 0x61
-	.4byte	0x13b43
+	.4byte	0x13b6a
 	.4byte	.LLST128
 	.uleb128 0x58
-	.4byte	0x13b4d
+	.4byte	0x13b74
 	.uleb128 0x61
-	.4byte	0x13b57
+	.4byte	0x13b7e
 	.4byte	.LLST129
 	.uleb128 0x61
-	.4byte	0x13b63
+	.4byte	0x13b8a
 	.4byte	.LLST130
 	.uleb128 0x61
-	.4byte	0x13b6f
+	.4byte	0x13b96
 	.4byte	.LLST131
 	.uleb128 0x58
-	.4byte	0x13b7b
+	.4byte	0x13ba2
 	.uleb128 0x62
-	.4byte	0x13b87
+	.4byte	0x13bae
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x13b93
+	.4byte	0x13bba
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x13b9f
+	.4byte	0x13bc6
 	.4byte	.LLST132
 	.uleb128 0x61
-	.4byte	0x13bab
+	.4byte	0x13bd2
 	.4byte	.LLST133
 	.uleb128 0x61
-	.4byte	0x13bb7
+	.4byte	0x13bde
 	.4byte	.LLST134
 	.uleb128 0x58
-	.4byte	0x13bc3
+	.4byte	0x13bea
 	.uleb128 0x5c
-	.4byte	0x144a7
-	.8byte	.LBB1312
+	.4byte	0x144ce
+	.8byte	.LBB1314
 	.4byte	.Ldebug_ranges0+0x850
 	.byte	0x1
 	.2byte	0x3c4
-	.4byte	0x13721
+	.4byte	0x13748
 	.uleb128 0x55
-	.4byte	0x144cf
+	.4byte	0x144f6
 	.uleb128 0x55
-	.4byte	0x144c3
+	.4byte	0x144ea
 	.uleb128 0x55
-	.4byte	0x144b7
+	.4byte	0x144de
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x144a7
-	.8byte	.LBB1319
+	.4byte	0x144ce
+	.8byte	.LBB1321
 	.4byte	.Ldebug_ranges0+0x8b0
 	.byte	0x1
 	.2byte	0x3c5
 	.uleb128 0x55
-	.4byte	0x144cf
+	.4byte	0x144f6
 	.uleb128 0x55
-	.4byte	0x144c3
+	.4byte	0x144ea
 	.uleb128 0x55
-	.4byte	0x144b7
+	.4byte	0x144de
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x13a0c
-	.8byte	.LBB1330
-	.8byte	.LBE1330-.LBB1330
+	.4byte	0x13a33
+	.8byte	.LBB1332
+	.8byte	.LBE1332-.LBB1332
 	.byte	0x1
 	.2byte	0x485
 	.uleb128 0x55
-	.4byte	0x13a3d
+	.4byte	0x13a64
 	.uleb128 0x55
-	.4byte	0x13a3d
+	.4byte	0x13a64
 	.uleb128 0x55
-	.4byte	0x13a3d
+	.4byte	0x13a64
 	.uleb128 0x55
-	.4byte	0x13a31
+	.4byte	0x13a58
 	.uleb128 0x55
-	.4byte	0x13a25
+	.4byte	0x13a4c
 	.uleb128 0x55
-	.4byte	0x13a19
+	.4byte	0x13a40
 	.uleb128 0x57
-	.8byte	.LBB1331
-	.8byte	.LBE1331-.LBB1331
+	.8byte	.LBB1333
+	.8byte	.LBE1333-.LBB1333
 	.uleb128 0x58
-	.4byte	0x13a49
+	.4byte	0x13a70
 	.uleb128 0x61
-	.4byte	0x13a55
+	.4byte	0x13a7c
 	.4byte	.LLST135
 	.uleb128 0x58
-	.4byte	0x13a5f
+	.4byte	0x13a86
 	.uleb128 0x61
-	.4byte	0x13a69
+	.4byte	0x13a90
 	.4byte	.LLST136
 	.uleb128 0x61
-	.4byte	0x13a75
+	.4byte	0x13a9c
 	.4byte	.LLST137
 	.uleb128 0x61
-	.4byte	0x13a81
+	.4byte	0x13aa8
 	.4byte	.LLST138
 	.uleb128 0x58
-	.4byte	0x13a8d
+	.4byte	0x13ab4
 	.uleb128 0x62
-	.4byte	0x13a99
+	.4byte	0x13ac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x13aa5
+	.4byte	0x13acc
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x13ab1
+	.4byte	0x13ad8
 	.4byte	.LLST139
 	.uleb128 0x61
-	.4byte	0x13abd
+	.4byte	0x13ae4
 	.4byte	.LLST140
 	.uleb128 0x61
-	.4byte	0x13ac9
+	.4byte	0x13af0
 	.4byte	.LLST141
 	.uleb128 0x58
-	.4byte	0x13ad5
+	.4byte	0x13afc
 	.uleb128 0x58
-	.4byte	0x13ae1
+	.4byte	0x13b08
 	.uleb128 0x58
-	.4byte	0x13aed
+	.4byte	0x13b14
 	.uleb128 0x5c
-	.4byte	0x14472
-	.8byte	.LBB1332
+	.4byte	0x14499
+	.8byte	.LBB1334
 	.4byte	.Ldebug_ranges0+0x900
 	.byte	0x1
 	.2byte	0x3eb
-	.4byte	0x13821
+	.4byte	0x13848
 	.uleb128 0x55
-	.4byte	0x1449a
+	.4byte	0x144c1
 	.uleb128 0x55
-	.4byte	0x1448e
+	.4byte	0x144b5
 	.uleb128 0x55
-	.4byte	0x14482
+	.4byte	0x144a9
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x14472
-	.8byte	.LBB1338
+	.4byte	0x14499
+	.8byte	.LBB1340
 	.4byte	.Ldebug_ranges0+0x960
 	.byte	0x1
 	.2byte	0x3ec
 	.uleb128 0x55
-	.4byte	0x1449a
+	.4byte	0x144c1
 	.uleb128 0x55
-	.4byte	0x1448e
+	.4byte	0x144b5
 	.uleb128 0x55
-	.4byte	0x14482
+	.4byte	0x144a9
 	.byte	0
 	.byte	0
 	.byte	0
@@ -47051,7 +47105,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x438
 	.byte	0x1
-	.4byte	0x1392a
+	.4byte	0x13951
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
@@ -47148,7 +47202,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x3f2
 	.byte	0x1
-	.4byte	0x13a0c
+	.4byte	0x13a33
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
@@ -47245,7 +47299,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x3cb
 	.byte	0x1
-	.4byte	0x13afa
+	.4byte	0x13b21
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
@@ -47347,7 +47401,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x3a6
 	.byte	0x1
-	.4byte	0x13bd0
+	.4byte	0x13bf7
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
@@ -47439,7 +47493,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x37e
 	.byte	0x1
-	.4byte	0x13ca6
+	.4byte	0x13ccd
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
@@ -47534,7 +47588,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2816-.LFB2816
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13e07
+	.4byte	0x13e2e
 	.uleb128 0x75
 	.4byte	.LASF3135
 	.byte	0x1
@@ -47690,7 +47744,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2815-.LFB2815
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13f62
+	.4byte	0x13f89
 	.uleb128 0x75
 	.4byte	.LASF3135
 	.byte	0x1
@@ -47838,7 +47892,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x1ac
 	.byte	0x1
-	.4byte	0x14080
+	.4byte	0x140a7
 	.uleb128 0x66
 	.4byte	.LASF3167
 	.byte	0x1
@@ -47963,7 +48017,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2813-.LFB2813
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1412a
+	.4byte	0x14151
 	.uleb128 0x59
 	.4byte	.LASF2288
 	.byte	0x1
@@ -47984,25 +48038,25 @@ __exitcall_ebc_exit:
 	.4byte	.LLST237
 	.uleb128 0x4f
 	.8byte	.LVL841
-	.4byte	0x15516
+	.4byte	0x1553d
 	.uleb128 0x4f
 	.8byte	.LVL843
-	.4byte	0x142c4
+	.4byte	0x142eb
 	.uleb128 0x4f
 	.8byte	.LVL844
-	.4byte	0x15522
+	.4byte	0x15555
 	.uleb128 0x4f
 	.8byte	.LVL847
-	.4byte	0x1412a
+	.4byte	0x14151
 	.uleb128 0x4f
 	.8byte	.LVL848
-	.4byte	0x15522
+	.4byte	0x15555
 	.uleb128 0x4f
 	.8byte	.LVL851
-	.4byte	0x141f1
+	.4byte	0x14218
 	.uleb128 0x4f
 	.8byte	.LVL852
-	.4byte	0x15522
+	.4byte	0x15555
 	.byte	0
 	.uleb128 0x76
 	.4byte	.LASF3178
@@ -48012,7 +48066,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2812-.LFB2812
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x141f1
+	.4byte	0x14218
 	.uleb128 0x75
 	.4byte	.LASF3167
 	.byte	0x1
@@ -48098,7 +48152,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2811-.LFB2811
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x142c4
+	.4byte	0x142eb
 	.uleb128 0x75
 	.4byte	.LASF3167
 	.byte	0x1
@@ -48189,7 +48243,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2810-.LFB2810
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x143a9
+	.4byte	0x143d0
 	.uleb128 0x78
 	.4byte	.LASF3167
 	.byte	0x1
@@ -48292,7 +48346,7 @@ __exitcall_ebc_exit:
 	.byte	0xb7
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x143dc
+	.4byte	0x14403
 	.uleb128 0x7f
 	.string	"ebc"
 	.byte	0x1
@@ -48315,7 +48369,7 @@ __exitcall_ebc_exit:
 	.byte	0xa5
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x14427
+	.4byte	0x1444e
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
@@ -48348,7 +48402,7 @@ __exitcall_ebc_exit:
 	.byte	0x8f
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x14472
+	.4byte	0x14499
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
@@ -48381,7 +48435,7 @@ __exitcall_ebc_exit:
 	.byte	0x89
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x144a7
+	.4byte	0x144ce
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
@@ -48404,7 +48458,7 @@ __exitcall_ebc_exit:
 	.byte	0x83
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x144dc
+	.4byte	0x14503
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
@@ -48426,7 +48480,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x14502
+	.4byte	0x14529
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
@@ -48443,7 +48497,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x14534
+	.4byte	0x1455b
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
@@ -48465,7 +48519,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x1457e
+	.4byte	0x145a5
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
@@ -48497,7 +48551,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x14598
+	.4byte	0x145bf
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
@@ -48510,7 +48564,7 @@ __exitcall_ebc_exit:
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x145c1
+	.4byte	0x145e8
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
@@ -48527,7 +48581,7 @@ __exitcall_ebc_exit:
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x1460b
+	.4byte	0x14632
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
@@ -48560,7 +48614,7 @@ __exitcall_ebc_exit:
 	.2byte	0x108
 	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x14629
+	.4byte	0x14650
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
@@ -48573,7 +48627,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x14645
+	.4byte	0x1466c
 	.uleb128 0x7f
 	.string	"bus"
 	.byte	0xc8
@@ -48586,7 +48640,7 @@ __exitcall_ebc_exit:
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14662
+	.4byte	0x14689
 	.uleb128 0x80
 	.4byte	.LASF3203
 	.byte	0xa
@@ -48598,7 +48652,7 @@ __exitcall_ebc_exit:
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x1469f
+	.4byte	0x146c6
 	.uleb128 0x7f
 	.string	"dev"
 	.byte	0xcb
@@ -48626,7 +48680,7 @@ __exitcall_ebc_exit:
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x146bc
+	.4byte	0x146e3
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48639,7 +48693,7 @@ __exitcall_ebc_exit:
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x146e2
+	.4byte	0x14709
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48656,7 +48710,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x146fc
+	.4byte	0x14723
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48668,7 +48722,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x14716
+	.4byte	0x1473d
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48680,7 +48734,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x14730
+	.4byte	0x14757
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48692,7 +48746,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x1474a
+	.4byte	0x14771
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48710,12 +48764,12 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x14771
+	.4byte	0x14798
 	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x14771
+	.4byte	0x14798
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -48725,24 +48779,24 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x14791
+	.4byte	0x147b8
 	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x14771
+	.4byte	0x14798
 	.byte	0
 	.uleb128 0x81
 	.4byte	.LASF3214
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x147cd
+	.4byte	0x147f4
 	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x14771
+	.4byte	0x14798
 	.uleb128 0x80
 	.4byte	.LASF193
 	.byte	0x4
@@ -48765,7 +48819,7 @@ __exitcall_ebc_exit:
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x147fd
+	.4byte	0x14824
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -48788,7 +48842,7 @@ __exitcall_ebc_exit:
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1482d
+	.4byte	0x14854
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -48811,7 +48865,7 @@ __exitcall_ebc_exit:
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1485d
+	.4byte	0x14884
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -48834,7 +48888,7 @@ __exitcall_ebc_exit:
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14898
+	.4byte	0x148bf
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -48862,7 +48916,7 @@ __exitcall_ebc_exit:
 	.byte	0xf5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x148cc
+	.4byte	0x148f3
 	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0x6
@@ -48887,7 +48941,7 @@ __exitcall_ebc_exit:
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14918
+	.4byte	0x1493f
 	.uleb128 0x80
 	.4byte	.LASF1164
 	.byte	0x6
@@ -48922,7 +48976,7 @@ __exitcall_ebc_exit:
 	.2byte	0x2e5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14942
+	.4byte	0x14969
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x11
@@ -48940,7 +48994,7 @@ __exitcall_ebc_exit:
 	.2byte	0x216
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x1497a
+	.4byte	0x149a1
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x11
@@ -48965,7 +49019,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1dd
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x149b0
+	.4byte	0x149d7
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x11
@@ -48988,7 +49042,7 @@ __exitcall_ebc_exit:
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x149ce
+	.4byte	0x149f5
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x11
@@ -49001,7 +49055,7 @@ __exitcall_ebc_exit:
 	.2byte	0x13d
 	.4byte	0xd813
 	.byte	0x3
-	.4byte	0x149ec
+	.4byte	0x14a13
 	.uleb128 0x66
 	.4byte	.LASF171
 	.byte	0x11
@@ -49013,7 +49067,7 @@ __exitcall_ebc_exit:
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x14a12
+	.4byte	0x14a39
 	.uleb128 0x80
 	.4byte	.LASF3052
 	.byte	0xbe
@@ -49031,12 +49085,12 @@ __exitcall_ebc_exit:
 	.byte	0xd6
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14a2f
+	.4byte	0x14a56
 	.uleb128 0x80
 	.4byte	.LASF3052
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x14a2f
+	.4byte	0x14a56
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -49047,12 +49101,12 @@ __exitcall_ebc_exit:
 	.2byte	0x164
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14a53
+	.4byte	0x14a7a
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x14a53
+	.4byte	0x14a7a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -49063,7 +49117,7 @@ __exitcall_ebc_exit:
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14a8e
+	.4byte	0x14ab5
 	.uleb128 0x65
 	.string	"np"
 	.byte	0xc
@@ -49086,7 +49140,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14ada
+	.4byte	0x14b01
 	.uleb128 0x65
 	.string	"np"
 	.byte	0xc
@@ -49118,7 +49172,7 @@ __exitcall_ebc_exit:
 	.byte	0xc
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x14af4
+	.4byte	0x14b1b
 	.uleb128 0x80
 	.4byte	.LASF882
 	.byte	0xc
@@ -49130,7 +49184,7 @@ __exitcall_ebc_exit:
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x14b1a
+	.4byte	0x14b41
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -49148,7 +49202,7 @@ __exitcall_ebc_exit:
 	.2byte	0x49b
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14b38
+	.4byte	0x14b5f
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -49161,7 +49215,7 @@ __exitcall_ebc_exit:
 	.2byte	0x2c5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14b6e
+	.4byte	0x14b95
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -49184,7 +49238,7 @@ __exitcall_ebc_exit:
 	.byte	0xca
 	.4byte	0x351
 	.byte	0x3
-	.4byte	0x14b8a
+	.4byte	0x14bb1
 	.uleb128 0x7f
 	.string	"res"
 	.byte	0xd
@@ -49197,7 +49251,7 @@ __exitcall_ebc_exit:
 	.byte	0x22
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x14ba6
+	.4byte	0x14bcd
 	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0xcc
@@ -49210,7 +49264,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14bc3
+	.4byte	0x14bea
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xcd
@@ -49223,7 +49277,7 @@ __exitcall_ebc_exit:
 	.2byte	0x203
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x14bec
+	.4byte	0x14c13
 	.uleb128 0x65
 	.string	"wq"
 	.byte	0x12
@@ -49240,7 +49294,7 @@ __exitcall_ebc_exit:
 	.byte	0x12
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x14c12
+	.4byte	0x14c39
 	.uleb128 0x80
 	.4byte	.LASF2288
 	.byte	0x12
@@ -49258,7 +49312,7 @@ __exitcall_ebc_exit:
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14c2e
+	.4byte	0x14c55
 	.uleb128 0x65
 	.string	"m"
 	.byte	0x51
@@ -49271,7 +49325,7 @@ __exitcall_ebc_exit:
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14c4a
+	.4byte	0x14c71
 	.uleb128 0x65
 	.string	"m"
 	.byte	0x51
@@ -49284,7 +49338,7 @@ __exitcall_ebc_exit:
 	.byte	0x97
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x14c89
+	.4byte	0x14cb0
 	.uleb128 0x80
 	.4byte	.LASF1164
 	.byte	0xca
@@ -49311,7 +49365,7 @@ __exitcall_ebc_exit:
 	.byte	0xca
 	.byte	0x91
 	.byte	0x3
-	.4byte	0x14cbc
+	.4byte	0x14ce3
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xca
@@ -49335,7 +49389,7 @@ __exitcall_ebc_exit:
 	.byte	0xca
 	.byte	0x80
 	.byte	0x3
-	.4byte	0x14cea
+	.4byte	0x14d11
 	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0xca
@@ -49358,12 +49412,12 @@ __exitcall_ebc_exit:
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14d11
+	.4byte	0x14d38
 	.uleb128 0x7f
 	.string	"ti"
 	.byte	0xca
 	.byte	0x5f
-	.4byte	0x14d11
+	.4byte	0x14d38
 	.uleb128 0x80
 	.4byte	.LASF3258
 	.byte	0xca
@@ -49379,7 +49433,7 @@ __exitcall_ebc_exit:
 	.byte	0xf
 	.4byte	0x2f05
 	.byte	0x3
-	.4byte	0x14d33
+	.4byte	0x14d5a
 	.uleb128 0x7a
 	.4byte	.LASF3260
 	.byte	0x5
@@ -49391,7 +49445,7 @@ __exitcall_ebc_exit:
 	.byte	0xf
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x14d79
+	.4byte	0x14da0
 	.uleb128 0x80
 	.4byte	.LASF976
 	.byte	0xf
@@ -49402,7 +49456,7 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0xf
 	.byte	0x1c
-	.4byte	0x14d6c
+	.4byte	0x14d93
 	.uleb128 0x22
 	.4byte	.LASF3130
 	.byte	0xf
@@ -49412,13 +49466,13 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0xf
 	.byte	0x1c
-	.4byte	0x12726
+	.4byte	0x1274d
 	.byte	0
 	.uleb128 0x7d
 	.string	"__u"
 	.byte	0xf
 	.byte	0x1c
-	.4byte	0x14d4d
+	.4byte	0x14d74
 	.byte	0
 	.byte	0
 	.uleb128 0x83
@@ -49432,7 +49486,7 @@ __exitcall_ebc_exit:
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14d9d
+	.4byte	0x14dc4
 	.uleb128 0x7f
 	.string	"n"
 	.byte	0xce
@@ -49445,7 +49499,7 @@ __exitcall_ebc_exit:
 	.byte	0x9a
 	.4byte	0xe2
 	.byte	0x3
-	.4byte	0x14dd1
+	.4byte	0x14df8
 	.uleb128 0x80
 	.4byte	.LASF2470
 	.byte	0x8
@@ -49468,7 +49522,7 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x14deb
+	.4byte	0x14e12
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xcf
@@ -49481,12 +49535,12 @@ __exitcall_ebc_exit:
 	.byte	0xb8
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x14e05
+	.4byte	0x14e2c
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd0
 	.byte	0xb8
-	.4byte	0x14e05
+	.4byte	0x14e2c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -49497,7 +49551,7 @@ __exitcall_ebc_exit:
 	.byte	0x39
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x14e27
+	.4byte	0x14e4e
 	.uleb128 0x7f
 	.string	"val"
 	.byte	0xd0
@@ -49510,7 +49564,7 @@ __exitcall_ebc_exit:
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14e4e
+	.4byte	0x14e75
 	.uleb128 0x7f
 	.string	"nr"
 	.byte	0x7
@@ -49520,7 +49574,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF1164
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x14e4e
+	.4byte	0x14e75
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -49530,7 +49584,7 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x14e88
+	.4byte	0x14eaf
 	.uleb128 0x7f
 	.string	"i"
 	.byte	0x10
@@ -49540,7 +49594,7 @@ __exitcall_ebc_exit:
 	.string	"v"
 	.byte	0x10
 	.byte	0x2f
-	.4byte	0x14e88
+	.4byte	0x14eaf
 	.uleb128 0x7d
 	.string	"w0"
 	.byte	0x10
@@ -49550,7 +49604,7 @@ __exitcall_ebc_exit:
 	.string	"x1"
 	.byte	0x10
 	.byte	0x2f
-	.4byte	0x14e88
+	.4byte	0x14eaf
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -49561,7 +49615,7 @@ __exitcall_ebc_exit:
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14ea8
+	.4byte	0x14ecf
 	.uleb128 0x7f
 	.string	"x"
 	.byte	0xd1
@@ -49574,7 +49628,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14ec5
+	.4byte	0x14eec
 	.uleb128 0x80
 	.4byte	.LASF2503
 	.byte	0xd2
@@ -49586,12 +49640,12 @@ __exitcall_ebc_exit:
 	.byte	0xd3
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x14ee8
+	.4byte	0x14f0f
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd3
 	.byte	0xb
-	.4byte	0x14ee8
+	.4byte	0x14f0f
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xd3
@@ -49600,21 +49654,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x14ef0
+	.4byte	0x14f17
 	.uleb128 0x84
 	.uleb128 0x3
-	.4byte	0x14eee
+	.4byte	0x14f15
 	.uleb128 0x81
 	.4byte	.LASF3272
 	.byte	0xd3
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x14f18
+	.4byte	0x14f3f
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd3
 	.byte	0x9
-	.4byte	0x14ee8
+	.4byte	0x14f0f
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xd3
@@ -49626,12 +49680,12 @@ __exitcall_ebc_exit:
 	.byte	0xe
 	.2byte	0x11a
 	.byte	0x3
-	.4byte	0x14f48
+	.4byte	0x14f6f
 	.uleb128 0x65
 	.string	"p"
 	.byte	0xe
 	.2byte	0x11a
-	.4byte	0x14f48
+	.4byte	0x14f6f
 	.uleb128 0x65
 	.string	"res"
 	.byte	0xe
@@ -49645,14 +49699,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x14eee
+	.4byte	0x14f15
 	.uleb128 0x85
 	.4byte	0x103dd
 	.8byte	.LFB2847
 	.8byte	.LFE2847-.LFB2847
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14f7b
+	.4byte	0x14fa2
 	.uleb128 0x70
 	.4byte	0x103ee
 	.4byte	.LLST10
@@ -49662,233 +49716,233 @@ __exitcall_ebc_exit:
 	.byte	0x51
 	.byte	0
 	.uleb128 0x86
-	.4byte	0x12908
+	.4byte	0x1292f
 	.8byte	.LFB2879
 	.8byte	.LFE2879-.LFB2879
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1507e
+	.4byte	0x150a5
 	.uleb128 0x70
-	.4byte	0x12915
+	.4byte	0x1293c
 	.4byte	.LLST188
 	.uleb128 0x55
-	.4byte	0x12921
+	.4byte	0x12948
 	.uleb128 0x58
-	.4byte	0x1292d
+	.4byte	0x12954
 	.uleb128 0x5c
-	.4byte	0x145c1
-	.8byte	.LBB1446
+	.4byte	0x145e8
+	.8byte	.LBB1448
 	.4byte	.Ldebug_ranges0+0xbf0
 	.byte	0x1
 	.2byte	0x5c8
-	.4byte	0x14ffc
+	.4byte	0x15023
 	.uleb128 0x55
-	.4byte	0x145f2
+	.4byte	0x14619
 	.uleb128 0x55
-	.4byte	0x145e6
+	.4byte	0x1460d
 	.uleb128 0x55
-	.4byte	0x145da
+	.4byte	0x14601
 	.uleb128 0x55
-	.4byte	0x145ce
+	.4byte	0x145f5
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xbf0
 	.uleb128 0x58
-	.4byte	0x145fe
+	.4byte	0x14625
 	.uleb128 0x60
-	.4byte	0x1460b
-	.8byte	.LBB1448
+	.4byte	0x14632
+	.8byte	.LBB1450
 	.4byte	.Ldebug_ranges0+0xc40
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x55
-	.4byte	0x1461c
+	.4byte	0x14643
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14534
-	.8byte	.LBB1457
+	.4byte	0x1455b
+	.8byte	.LBB1459
 	.4byte	.Ldebug_ranges0+0xc70
 	.byte	0x1
 	.2byte	0x5c9
-	.4byte	0x1502e
+	.4byte	0x15055
 	.uleb128 0x55
-	.4byte	0x14571
+	.4byte	0x14598
 	.uleb128 0x55
-	.4byte	0x14565
+	.4byte	0x1458c
 	.uleb128 0x55
-	.4byte	0x14559
+	.4byte	0x14580
 	.uleb128 0x55
-	.4byte	0x1454d
+	.4byte	0x14574
 	.uleb128 0x55
-	.4byte	0x14541
+	.4byte	0x14568
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14502
-	.8byte	.LBB1463
-	.8byte	.LBE1463-.LBB1463
+	.4byte	0x14529
+	.8byte	.LBB1465
+	.8byte	.LBE1465-.LBB1465
 	.byte	0x1
 	.2byte	0x5ca
-	.4byte	0x1505a
+	.4byte	0x15081
 	.uleb128 0x55
-	.4byte	0x14527
+	.4byte	0x1454e
 	.uleb128 0x55
-	.4byte	0x1451b
+	.4byte	0x14542
 	.uleb128 0x55
-	.4byte	0x1450f
+	.4byte	0x14536
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x144dc
-	.8byte	.LBB1465
-	.8byte	.LBE1465-.LBB1465
+	.4byte	0x14503
+	.8byte	.LBB1467
+	.8byte	.LBE1467-.LBB1467
 	.byte	0x1
 	.2byte	0x5cb
 	.uleb128 0x55
-	.4byte	0x144f5
+	.4byte	0x1451c
 	.uleb128 0x55
-	.4byte	0x144e9
+	.4byte	0x14510
 	.byte	0
 	.byte	0
 	.uleb128 0x86
-	.4byte	0x143a9
+	.4byte	0x143d0
 	.8byte	.LFB2881
 	.8byte	.LFE2881-.LFB2881
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1513c
+	.4byte	0x15163
 	.uleb128 0x70
-	.4byte	0x143b9
+	.4byte	0x143e0
 	.4byte	.LLST190
 	.uleb128 0x70
-	.4byte	0x143c4
+	.4byte	0x143eb
 	.4byte	.LLST191
 	.uleb128 0x58
-	.4byte	0x143d0
+	.4byte	0x143f7
 	.uleb128 0x71
-	.4byte	0x1457e
-	.8byte	.LBB1476
-	.8byte	.LBE1476-.LBB1476
+	.4byte	0x145a5
+	.8byte	.LBB1478
+	.8byte	.LBE1478-.LBB1478
 	.byte	0x1
 	.byte	0xc9
-	.4byte	0x150d2
+	.4byte	0x150f9
 	.uleb128 0x55
-	.4byte	0x1458b
+	.4byte	0x145b2
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14716
-	.8byte	.LBB1478
-	.8byte	.LBE1478-.LBB1478
+	.4byte	0x1473d
+	.8byte	.LBB1480
+	.8byte	.LBE1480-.LBB1480
 	.byte	0x1
 	.byte	0xca
-	.4byte	0x150f3
+	.4byte	0x1511a
 	.uleb128 0x55
-	.4byte	0x14723
+	.4byte	0x1474a
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14757
-	.8byte	.LBB1480
-	.8byte	.LBE1480-.LBB1480
+	.4byte	0x1477e
+	.8byte	.LBB1482
+	.8byte	.LBE1482-.LBB1482
 	.byte	0x1
 	.byte	0xcd
-	.4byte	0x15121
+	.4byte	0x15148
 	.uleb128 0x55
-	.4byte	0x14764
+	.4byte	0x1478b
 	.uleb128 0x4f
 	.8byte	.LVL584
-	.4byte	0x154f2
+	.4byte	0x15519
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL581
-	.4byte	0x15267
+	.4byte	0x1528e
 	.uleb128 0x4f
 	.8byte	.LVL585
-	.4byte	0x15267
+	.4byte	0x1528e
 	.byte	0
 	.uleb128 0x85
-	.4byte	0x12284
+	.4byte	0x122ab
 	.8byte	.LFB2883
 	.8byte	.LFE2883-.LFB2883
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1519d
+	.4byte	0x151c4
 	.uleb128 0x55
-	.4byte	0x122a1
+	.4byte	0x122c8
 	.uleb128 0x55
-	.4byte	0x12295
+	.4byte	0x122bc
 	.uleb128 0x55
-	.4byte	0x12295
+	.4byte	0x122bc
 	.uleb128 0x58
-	.4byte	0x122ad
+	.4byte	0x122d4
 	.uleb128 0x58
-	.4byte	0x122b7
+	.4byte	0x122de
 	.uleb128 0x58
-	.4byte	0x122c3
+	.4byte	0x122ea
 	.uleb128 0x61
-	.4byte	0x122cf
+	.4byte	0x122f6
 	.4byte	.LLST193
 	.uleb128 0x62
-	.4byte	0x122db
+	.4byte	0x12302
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x122e7
+	.4byte	0x1230e
 	.4byte	.LLST194
 	.uleb128 0x4f
 	.8byte	.LVL595
-	.4byte	0x15569
+	.4byte	0x15590
 	.byte	0
 	.uleb128 0x86
-	.4byte	0x143a9
+	.4byte	0x143d0
 	.8byte	.LFB2887
 	.8byte	.LFE2887-.LFB2887
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1524f
+	.4byte	0x15276
 	.uleb128 0x70
-	.4byte	0x143b9
+	.4byte	0x143e0
 	.4byte	.LLST220
 	.uleb128 0x58
-	.4byte	0x143d0
+	.4byte	0x143f7
 	.uleb128 0x55
-	.4byte	0x143c4
+	.4byte	0x143eb
 	.uleb128 0x71
-	.4byte	0x14730
-	.8byte	.LBB1803
-	.8byte	.LBE1803-.LBB1803
+	.4byte	0x14757
+	.8byte	.LBB1805
+	.8byte	.LBE1805-.LBB1805
 	.byte	0x1
 	.byte	0xc2
-	.4byte	0x151ed
+	.4byte	0x15214
 	.uleb128 0x55
-	.4byte	0x1473d
+	.4byte	0x14764
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14598
-	.8byte	.LBB1805
-	.8byte	.LBE1805-.LBB1805
+	.4byte	0x145bf
+	.8byte	.LBB1807
+	.8byte	.LBE1807-.LBB1807
 	.byte	0x1
 	.byte	0xc3
-	.4byte	0x15213
+	.4byte	0x1523a
 	.uleb128 0x55
-	.4byte	0x145b4
+	.4byte	0x145db
 	.uleb128 0x55
-	.4byte	0x145a8
+	.4byte	0x145cf
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14777
-	.8byte	.LBB1807
-	.8byte	.LBE1807-.LBB1807
+	.4byte	0x1479e
+	.8byte	.LBB1809
+	.8byte	.LBE1809-.LBB1809
 	.byte	0x1
 	.byte	0xbf
-	.4byte	0x15241
+	.4byte	0x15268
 	.uleb128 0x55
-	.4byte	0x14784
+	.4byte	0x147ab
 	.uleb128 0x4f
 	.8byte	.LVL787
-	.4byte	0x15575
+	.4byte	0x1559c
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL784
-	.4byte	0x15267
+	.4byte	0x1528e
 	.byte	0
 	.uleb128 0x87
 	.4byte	.LASF3274
@@ -50182,13 +50236,13 @@ __exitcall_ebc_exit:
 	.uleb128 0x87
 	.4byte	.LASF3332
 	.4byte	.LASF3332
-	.byte	0x72
-	.byte	0x98
+	.byte	0xc4
+	.byte	0x6e
 	.uleb128 0x87
 	.4byte	.LASF3333
 	.4byte	.LASF3333
-	.byte	0xc4
-	.byte	0x6e
+	.byte	0x72
+	.byte	0x98
 	.uleb128 0x87
 	.4byte	.LASF3334
 	.4byte	.LASF3334
@@ -53594,10 +53648,10 @@ __exitcall_ebc_exit:
 	.8byte	0
 .LLST240:
 	.8byte	.LVL876
-	.8byte	.LVL888
+	.8byte	.LVL887
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL891
+	.8byte	.LVL890
 	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x64
@@ -53607,81 +53661,113 @@ __exitcall_ebc_exit:
 	.8byte	.LVL877
 	.8byte	.LVL889
 	.2byte	0x1
-	.byte	0x68
+	.byte	0x6a
+	.8byte	.LVL890
 	.8byte	.LVL891
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL891
+	.8byte	.LVL901
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL901
+	.8byte	.LVL903
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL903
+	.8byte	.LVL941
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL941
+	.8byte	.LVL942
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL942
+	.8byte	.LVL968
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL968
+	.8byte	.LVL969
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL969
+	.8byte	.LVL1016
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1016
+	.8byte	.LVL1017
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1017
 	.8byte	.LFE2838
 	.2byte	0x1
-	.byte	0x68
+	.byte	0x6a
 	.8byte	0
 	.8byte	0
 .LLST242:
-	.8byte	.LVL902
-	.8byte	.LVL906-1
+	.8byte	.LVL906
+	.8byte	.LVL910-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL934
-	.8byte	.LVL935
+	.8byte	.LVL940
+	.8byte	.LVL941
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL951
-	.8byte	.LVL953-1
+	.8byte	.LVL965
+	.8byte	.LVL967-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL996
-	.8byte	.LVL1000-1
+	.8byte	.LVL987
+	.8byte	.LVL991-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST243:
-	.8byte	.LVL904
-	.8byte	.LVL905
+	.8byte	.LVL908
+	.8byte	.LVL909
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL952
-	.8byte	.LVL953-1
+	.8byte	.LVL966
+	.8byte	.LVL967-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST244:
 	.8byte	.LVL877
-	.8byte	.LVL890
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL891
-	.8byte	.LVL919
+	.8byte	.LVL889
 	.2byte	0x1
-	.byte	0x6a
+	.byte	0x69
+	.8byte	.LVL890
 	.8byte	.LVL923
-	.8byte	.LVL926
 	.2byte	0x1
-	.byte	0x6a
+	.byte	0x69
+	.8byte	.LVL927
 	.8byte	.LVL930
-	.8byte	.LVL979
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL984
-	.8byte	.LVL988
+	.byte	0x69
+	.8byte	.LVL934
+	.8byte	.LVL994
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL989
-	.8byte	.LVL1008
+	.byte	0x69
+	.8byte	.LVL999
+	.8byte	.LVL1021
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1014
+	.byte	0x69
+	.8byte	.LVL1027
 	.8byte	.LFE2838
 	.2byte	0x1
-	.byte	0x6a
+	.byte	0x69
 	.8byte	0
 	.8byte	0
 .LLST261:
-	.8byte	.LVL970
-	.8byte	.LVL971
+	.8byte	.LVL984
+	.8byte	.LVL985
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1010
-	.8byte	.LVL1011-1
+	.8byte	.LVL1023
+	.8byte	.LVL1024-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -53691,19 +53777,19 @@ __exitcall_ebc_exit:
 	.8byte	.LVL959
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1020
-	.8byte	.LVL1021-1
+	.8byte	.LVL1012
+	.8byte	.LVL1013-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST258:
+.LLST259:
 	.8byte	.LVL892
 	.8byte	.LVL893
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL938
-	.8byte	.LVL939-1
+	.8byte	.LVL948
+	.8byte	.LVL949-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -53724,377 +53810,380 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	0
 .LLST246:
-	.8byte	.LVL997
-	.8byte	.LVL998
+	.8byte	.LVL988
+	.8byte	.LVL989
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL998
-	.8byte	.LVL999
+	.8byte	.LVL989
+	.8byte	.LVL990
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST247:
-	.8byte	.LVL908
-	.8byte	.LVL909-1
+	.8byte	.LVL915
+	.8byte	.LVL916-1
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST248:
+	.8byte	.LVL912
+	.8byte	.LVL913-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL914
-	.8byte	.LVL930
+	.8byte	.LVL918
+	.8byte	.LVL934
 	.2byte	0x1
 	.byte	0x62
 	.8byte	.LVL961
 	.8byte	.LVL963-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL979
-	.8byte	.LVL985-1
+	.8byte	.LVL994
+	.8byte	.LVL1000-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL988
-	.8byte	.LVL990-1
+	.8byte	.LVL1003
+	.8byte	.LVL1004-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL1005
-	.8byte	.LVL1006-1
+	.8byte	.LVL1027
+	.8byte	.LVL1028-1
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST248:
-	.8byte	.LVL919
-	.8byte	.LVL922
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL927
-	.8byte	.LVL930
+.LLST249:
+	.8byte	.LVL923
+	.8byte	.LVL926
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL979
-	.8byte	.LVL982
+	.8byte	.LVL931
+	.8byte	.LVL934
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL988
-	.8byte	.LVL989
+	.8byte	.LVL994
+	.8byte	.LVL997
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST249:
+.LLST250:
 	.8byte	.LVL877
-	.8byte	.LVL890
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL891
-	.8byte	.LVL903
+	.8byte	.LVL889
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL908
-	.8byte	.LVL919
+	.byte	0x69
+	.8byte	.LVL890
+	.8byte	.LVL907
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL921
-	.8byte	.LVL926
+	.byte	0x69
+	.8byte	.LVL912
+	.8byte	.LVL923
 	.2byte	0x1
-	.byte	0x6a
+	.byte	0x69
+	.8byte	.LVL925
 	.8byte	.LVL930
-	.8byte	.LVL951
 	.2byte	0x1
-	.byte	0x6a
+	.byte	0x69
+	.8byte	.LVL934
+	.8byte	.LVL954
+	.2byte	0x1
+	.byte	0x69
 	.8byte	.LVL961
-	.8byte	.LVL979
+	.8byte	.LVL965
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL981
-	.8byte	.LVL988
+	.byte	0x69
+	.8byte	.LVL968
+	.8byte	.LVL987
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL989
-	.8byte	.LVL996
+	.byte	0x69
+	.8byte	.LVL992
+	.8byte	.LVL994
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1001
-	.8byte	.LVL1008
+	.byte	0x69
+	.8byte	.LVL996
+	.8byte	.LVL1010
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1014
-	.8byte	.LVL1018
+	.byte	0x69
+	.8byte	.LVL1016
+	.8byte	.LVL1021
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1024
+	.byte	0x69
+	.8byte	.LVL1027
 	.8byte	.LFE2838
 	.2byte	0x1
-	.byte	0x6a
+	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST250:
-	.8byte	.LVL908
-	.8byte	.LVL909-1
+.LLST251:
+	.8byte	.LVL912
+	.8byte	.LVL913-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL918
-	.8byte	.LVL920
+	.8byte	.LVL922
+	.8byte	.LVL924
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL921
-	.8byte	.LVL930
+	.8byte	.LVL925
+	.8byte	.LVL934
 	.2byte	0x1
 	.byte	0x52
 	.8byte	.LVL961
 	.8byte	.LVL963-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL979
-	.8byte	.LVL980
+	.8byte	.LVL994
+	.8byte	.LVL995
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL984
-	.8byte	.LVL985-1
+	.8byte	.LVL999
+	.8byte	.LVL1000-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL988
-	.8byte	.LVL990-1
+	.8byte	.LVL1003
+	.8byte	.LVL1004-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL1005
-	.8byte	.LVL1006-1
+	.8byte	.LVL1027
+	.8byte	.LVL1028-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST251:
-	.8byte	.LVL908
-	.8byte	.LVL909-1
+.LLST252:
+	.8byte	.LVL912
+	.8byte	.LVL913-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL918
-	.8byte	.LVL928
+	.8byte	.LVL922
+	.8byte	.LVL932
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL929
-	.8byte	.LVL930
+	.8byte	.LVL933
+	.8byte	.LVL934
 	.2byte	0x1
 	.byte	0x53
 	.8byte	.LVL961
 	.8byte	.LVL963-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL979
-	.8byte	.LVL985-1
+	.8byte	.LVL994
+	.8byte	.LVL1000-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL988
-	.8byte	.LVL990-1
+	.8byte	.LVL1003
+	.8byte	.LVL1004-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL1005
-	.8byte	.LVL1006-1
+	.8byte	.LVL1027
+	.8byte	.LVL1028-1
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST252:
-	.8byte	.LVL908
-	.8byte	.LVL909-1
+.LLST253:
+	.8byte	.LVL912
+	.8byte	.LVL913-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL918
-	.8byte	.LVL919
+	.8byte	.LVL922
+	.8byte	.LVL923
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL922
-	.8byte	.LVL924
+	.8byte	.LVL926
+	.8byte	.LVL928
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL924
-	.8byte	.LVL925
+	.8byte	.LVL928
+	.8byte	.LVL929
 	.2byte	0x1
 	.byte	0x51
 	.8byte	.LVL961
 	.8byte	.LVL963-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL983
-	.8byte	.LVL985-1
+	.8byte	.LVL998
+	.8byte	.LVL1000-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL989
-	.8byte	.LVL990-1
+	.8byte	.LVL1003
+	.8byte	.LVL1004-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL1005
-	.8byte	.LVL1006-1
+	.8byte	.LVL1027
+	.8byte	.LVL1028-1
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST253:
-	.8byte	.LVL908
-	.8byte	.LVL909-1
+.LLST254:
+	.8byte	.LVL912
+	.8byte	.LVL913-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL917
-	.8byte	.LVL930
+	.8byte	.LVL921
+	.8byte	.LVL934
 	.2byte	0x1
 	.byte	0x61
 	.8byte	.LVL961
 	.8byte	.LVL963-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL979
-	.8byte	.LVL985-1
+	.8byte	.LVL994
+	.8byte	.LVL1000-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL988
-	.8byte	.LVL990-1
+	.8byte	.LVL1003
+	.8byte	.LVL1004-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL1005
-	.8byte	.LVL1006-1
+	.8byte	.LVL1027
+	.8byte	.LVL1028-1
 	.2byte	0x1
 	.byte	0x61
 	.8byte	0
 	.8byte	0
-.LLST254:
-	.8byte	.LVL908
-	.8byte	.LVL909-1
+.LLST255:
+	.8byte	.LVL912
+	.8byte	.LVL913-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL915
-	.8byte	.LVL930
+	.8byte	.LVL919
+	.8byte	.LVL934
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	.LVL961
 	.8byte	.LVL963-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL979
-	.8byte	.LVL985-1
+	.8byte	.LVL994
+	.8byte	.LVL1000-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL988
-	.8byte	.LVL990-1
+	.8byte	.LVL1003
+	.8byte	.LVL1004-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL1005
-	.8byte	.LVL1006-1
+	.8byte	.LVL1027
+	.8byte	.LVL1028-1
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST255:
-	.8byte	.LVL908
-	.8byte	.LVL909-1
+.LLST256:
+	.8byte	.LVL912
+	.8byte	.LVL913-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL917
-	.8byte	.LVL930
+	.8byte	.LVL921
+	.8byte	.LVL934
 	.2byte	0x1
 	.byte	0x60
 	.8byte	.LVL961
 	.8byte	.LVL963-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL979
-	.8byte	.LVL985-1
+	.8byte	.LVL994
+	.8byte	.LVL1000-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL988
-	.8byte	.LVL990-1
+	.8byte	.LVL1003
+	.8byte	.LVL1004-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL1005
-	.8byte	.LVL1006-1
+	.8byte	.LVL1027
+	.8byte	.LVL1028-1
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST256:
+.LLST257:
 	.8byte	.LVL877
-	.8byte	.LVL882
+	.8byte	.LVL880
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL885
-	.8byte	.LVL890
+	.byte	0x65
+	.8byte	.LVL886
+	.8byte	.LVL888
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL891
-	.8byte	.LVL901
+	.byte	0x65
+	.8byte	.LVL890
+	.8byte	.LVL902
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL908
-	.8byte	.LVL910
+	.byte	0x65
+	.8byte	.LVL912
+	.8byte	.LVL914
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL916
-	.8byte	.LVL930
+	.byte	0x65
+	.8byte	.LVL920
+	.8byte	.LVL934
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL936
-	.8byte	.LVL951
+	.byte	0x65
+	.8byte	.LVL946
+	.8byte	.LVL954
 	.2byte	0x1
-	.byte	0x69
+	.byte	0x65
 	.8byte	.LVL961
 	.8byte	.LVL962
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL966
-	.8byte	.LVL968
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL979
-	.8byte	.LVL992
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1001
-	.8byte	.LVL1003
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1005
-	.8byte	.LVL1007
+	.byte	0x65
+	.8byte	.LVL994
+	.8byte	.LVL1006
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1014
-	.8byte	.LVL1018
+	.byte	0x65
+	.8byte	.LVL1027
+	.8byte	.LVL1029
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1024
-	.8byte	.LVL1026
+	.byte	0x65
+	.8byte	.LVL1031
+	.8byte	.LVL1033
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1028
-	.8byte	.LVL1030
+	.byte	0x65
+	.8byte	.LVL1039
+	.8byte	.LVL1041
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1034
+	.byte	0x65
+	.8byte	.LVL1043
 	.8byte	.LFE2838
 	.2byte	0x1
-	.byte	0x69
+	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST257:
-	.8byte	.LVL932
-	.8byte	.LVL933-1
+.LLST258:
+	.8byte	.LVL938
+	.8byte	.LVL939
 	.2byte	0x1
-	.byte	0x55
-	.8byte	0
-	.8byte	0
-.LLST259:
-	.8byte	.LVL944
-	.8byte	.LVL945-1
+	.byte	0x53
+	.8byte	.LVL978
+	.8byte	.LVL979-1
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST262:
-	.8byte	.LVL911
-	.8byte	.LVL912-1
+	.8byte	.LVL936
+	.8byte	.LVL937
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL1004
-	.8byte	.LVL1005
+	.byte	0x54
+	.8byte	.LVL1019
+	.8byte	.LVL1020
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x54
+	.8byte	.LVL1037
+	.8byte	.LVL1038-1
+	.2byte	0x1
+	.byte	0x54
+	.8byte	0
+	.8byte	0
+.LLST263:
+	.8byte	.LVL971
+	.8byte	.LVL972-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL1030
+	.8byte	.LVL1031
+	.2byte	0x1
+	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST75:
@@ -55725,342 +55814,340 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
 .Ldebug_ranges0:
-	.8byte	.LBB956
-	.8byte	.LBE956
-	.8byte	.LBB959
-	.8byte	.LBE959
+	.8byte	.LBB958
+	.8byte	.LBE958
+	.8byte	.LBB961
+	.8byte	.LBE961
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB960
-	.8byte	.LBE960
-	.8byte	.LBB991
-	.8byte	.LBE991
-	.8byte	.LBB992
-	.8byte	.LBE992
-	.8byte	.LBB1057
-	.8byte	.LBE1057
+	.8byte	.LBB962
+	.8byte	.LBE962
+	.8byte	.LBB993
+	.8byte	.LBE993
+	.8byte	.LBB994
+	.8byte	.LBE994
+	.8byte	.LBB1059
+	.8byte	.LBE1059
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB963
-	.8byte	.LBE963
-	.8byte	.LBB975
-	.8byte	.LBE975
-	.8byte	.LBB976
-	.8byte	.LBE976
+	.8byte	.LBB965
+	.8byte	.LBE965
+	.8byte	.LBB977
+	.8byte	.LBE977
+	.8byte	.LBB978
+	.8byte	.LBE978
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB979
-	.8byte	.LBE979
-	.8byte	.LBB984
-	.8byte	.LBE984
+	.8byte	.LBB981
+	.8byte	.LBE981
+	.8byte	.LBB986
+	.8byte	.LBE986
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB993
-	.8byte	.LBE993
-	.8byte	.LBB1214
-	.8byte	.LBE1214
-	.8byte	.LBB1215
-	.8byte	.LBE1215
+	.8byte	.LBB995
+	.8byte	.LBE995
+	.8byte	.LBB1216
+	.8byte	.LBE1216
+	.8byte	.LBB1217
+	.8byte	.LBE1217
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB996
-	.8byte	.LBE996
-	.8byte	.LBB1016
-	.8byte	.LBE1016
-	.8byte	.LBB1017
-	.8byte	.LBE1017
+	.8byte	.LBB998
+	.8byte	.LBE998
+	.8byte	.LBB1018
+	.8byte	.LBE1018
+	.8byte	.LBB1019
+	.8byte	.LBE1019
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1010
-	.8byte	.LBE1010
-	.8byte	.LBB1015
-	.8byte	.LBE1015
+	.8byte	.LBB1012
+	.8byte	.LBE1012
+	.8byte	.LBB1017
+	.8byte	.LBE1017
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1022
-	.8byte	.LBE1022
-	.8byte	.LBB1225
-	.8byte	.LBE1225
+	.8byte	.LBB1024
+	.8byte	.LBE1024
 	.8byte	.LBB1227
 	.8byte	.LBE1227
-	.8byte	.LBB1228
-	.8byte	.LBE1228
+	.8byte	.LBB1229
+	.8byte	.LBE1229
+	.8byte	.LBB1230
+	.8byte	.LBE1230
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1028
-	.8byte	.LBE1028
-	.8byte	.LBB1212
-	.8byte	.LBE1212
-	.8byte	.LBB1213
-	.8byte	.LBE1213
+	.8byte	.LBB1030
+	.8byte	.LBE1030
+	.8byte	.LBB1214
+	.8byte	.LBE1214
+	.8byte	.LBB1215
+	.8byte	.LBE1215
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1031
-	.8byte	.LBE1031
-	.8byte	.LBB1051
-	.8byte	.LBE1051
+	.8byte	.LBB1033
+	.8byte	.LBE1033
+	.8byte	.LBB1053
+	.8byte	.LBE1053
+	.8byte	.LBB1054
+	.8byte	.LBE1054
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1047
+	.8byte	.LBE1047
 	.8byte	.LBB1052
 	.8byte	.LBE1052
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1045
-	.8byte	.LBE1045
-	.8byte	.LBB1050
-	.8byte	.LBE1050
+	.8byte	.LBB1060
+	.8byte	.LBE1060
+	.8byte	.LBB1093
+	.8byte	.LBE1093
+	.8byte	.LBB1224
+	.8byte	.LBE1224
+	.8byte	.LBB1225
+	.8byte	.LBE1225
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1058
-	.8byte	.LBE1058
-	.8byte	.LBB1091
-	.8byte	.LBE1091
-	.8byte	.LBB1222
-	.8byte	.LBE1222
-	.8byte	.LBB1223
-	.8byte	.LBE1223
+	.8byte	.LBB1063
+	.8byte	.LBE1063
+	.8byte	.LBB1076
+	.8byte	.LBE1076
+	.8byte	.LBB1085
+	.8byte	.LBE1085
+	.8byte	.LBB1086
+	.8byte	.LBE1086
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1061
-	.8byte	.LBE1061
-	.8byte	.LBB1074
-	.8byte	.LBE1074
-	.8byte	.LBB1083
-	.8byte	.LBE1083
+	.8byte	.LBB1079
+	.8byte	.LBE1079
 	.8byte	.LBB1084
 	.8byte	.LBE1084
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1077
-	.8byte	.LBE1077
-	.8byte	.LBB1082
-	.8byte	.LBE1082
+	.8byte	.LBB1094
+	.8byte	.LBE1094
+	.8byte	.LBB1129
+	.8byte	.LBE1129
+	.8byte	.LBB1220
+	.8byte	.LBE1220
+	.8byte	.LBB1221
+	.8byte	.LBE1221
+	.8byte	.LBB1231
+	.8byte	.LBE1231
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1092
-	.8byte	.LBE1092
-	.8byte	.LBB1127
-	.8byte	.LBE1127
-	.8byte	.LBB1218
-	.8byte	.LBE1218
-	.8byte	.LBB1219
-	.8byte	.LBE1219
-	.8byte	.LBB1229
-	.8byte	.LBE1229
+	.8byte	.LBB1097
+	.8byte	.LBE1097
+	.8byte	.LBB1110
+	.8byte	.LBE1110
+	.8byte	.LBB1119
+	.8byte	.LBE1119
+	.8byte	.LBB1120
+	.8byte	.LBE1120
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1095
-	.8byte	.LBE1095
-	.8byte	.LBB1108
-	.8byte	.LBE1108
-	.8byte	.LBB1117
-	.8byte	.LBE1117
+	.8byte	.LBB1113
+	.8byte	.LBE1113
 	.8byte	.LBB1118
 	.8byte	.LBE1118
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1111
-	.8byte	.LBE1111
-	.8byte	.LBB1116
-	.8byte	.LBE1116
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1128
-	.8byte	.LBE1128
-	.8byte	.LBB1139
-	.8byte	.LBE1139
+	.8byte	.LBB1130
+	.8byte	.LBE1130
+	.8byte	.LBB1141
+	.8byte	.LBE1141
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1131
-	.8byte	.LBE1131
-	.8byte	.LBB1136
-	.8byte	.LBE1136
+	.8byte	.LBB1133
+	.8byte	.LBE1133
+	.8byte	.LBB1138
+	.8byte	.LBE1138
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1132
-	.8byte	.LBE1132
-	.8byte	.LBB1135
-	.8byte	.LBE1135
+	.8byte	.LBB1134
+	.8byte	.LBE1134
+	.8byte	.LBB1137
+	.8byte	.LBE1137
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1140
-	.8byte	.LBE1140
-	.8byte	.LBB1175
-	.8byte	.LBE1175
-	.8byte	.LBB1216
-	.8byte	.LBE1216
-	.8byte	.LBB1217
-	.8byte	.LBE1217
-	.8byte	.LBB1224
-	.8byte	.LBE1224
+	.8byte	.LBB1142
+	.8byte	.LBE1142
+	.8byte	.LBB1177
+	.8byte	.LBE1177
+	.8byte	.LBB1218
+	.8byte	.LBE1218
+	.8byte	.LBB1219
+	.8byte	.LBE1219
+	.8byte	.LBB1226
+	.8byte	.LBE1226
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1143
-	.8byte	.LBE1143
-	.8byte	.LBB1156
-	.8byte	.LBE1156
-	.8byte	.LBB1157
-	.8byte	.LBE1157
+	.8byte	.LBB1145
+	.8byte	.LBE1145
 	.8byte	.LBB1158
 	.8byte	.LBE1158
+	.8byte	.LBB1159
+	.8byte	.LBE1159
+	.8byte	.LBB1160
+	.8byte	.LBE1160
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1161
-	.8byte	.LBE1161
-	.8byte	.LBB1166
-	.8byte	.LBE1166
+	.8byte	.LBB1163
+	.8byte	.LBE1163
+	.8byte	.LBB1168
+	.8byte	.LBE1168
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1176
-	.8byte	.LBE1176
-	.8byte	.LBB1211
-	.8byte	.LBE1211
-	.8byte	.LBB1220
-	.8byte	.LBE1220
-	.8byte	.LBB1221
-	.8byte	.LBE1221
-	.8byte	.LBB1226
-	.8byte	.LBE1226
+	.8byte	.LBB1178
+	.8byte	.LBE1178
+	.8byte	.LBB1213
+	.8byte	.LBE1213
+	.8byte	.LBB1222
+	.8byte	.LBE1222
+	.8byte	.LBB1223
+	.8byte	.LBE1223
+	.8byte	.LBB1228
+	.8byte	.LBE1228
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1179
-	.8byte	.LBE1179
-	.8byte	.LBB1192
-	.8byte	.LBE1192
-	.8byte	.LBB1193
-	.8byte	.LBE1193
+	.8byte	.LBB1181
+	.8byte	.LBE1181
 	.8byte	.LBB1194
 	.8byte	.LBE1194
+	.8byte	.LBB1195
+	.8byte	.LBE1195
+	.8byte	.LBB1196
+	.8byte	.LBE1196
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1197
-	.8byte	.LBE1197
-	.8byte	.LBB1202
-	.8byte	.LBE1202
+	.8byte	.LBB1199
+	.8byte	.LBE1199
+	.8byte	.LBB1204
+	.8byte	.LBE1204
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1234
-	.8byte	.LBE1234
-	.8byte	.LBB1237
-	.8byte	.LBE1237
+	.8byte	.LBB1236
+	.8byte	.LBE1236
+	.8byte	.LBB1239
+	.8byte	.LBE1239
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1268
-	.8byte	.LBE1268
-	.8byte	.LBB1280
-	.8byte	.LBE1280
+	.8byte	.LBB1270
+	.8byte	.LBE1270
 	.8byte	.LBB1282
 	.8byte	.LBE1282
 	.8byte	.LBB1284
 	.8byte	.LBE1284
+	.8byte	.LBB1286
+	.8byte	.LBE1286
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1273
-	.8byte	.LBE1273
-	.8byte	.LBB1281
-	.8byte	.LBE1281
+	.8byte	.LBB1275
+	.8byte	.LBE1275
 	.8byte	.LBB1283
 	.8byte	.LBE1283
-	.8byte	.LBB1292
-	.8byte	.LBE1292
+	.8byte	.LBB1285
+	.8byte	.LBE1285
 	.8byte	.LBB1294
 	.8byte	.LBE1294
 	.8byte	.LBB1296
 	.8byte	.LBE1296
+	.8byte	.LBB1298
+	.8byte	.LBE1298
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1285
-	.8byte	.LBE1285
-	.8byte	.LBB1293
-	.8byte	.LBE1293
+	.8byte	.LBB1287
+	.8byte	.LBE1287
 	.8byte	.LBB1295
 	.8byte	.LBE1295
-	.8byte	.LBB1302
-	.8byte	.LBE1302
+	.8byte	.LBB1297
+	.8byte	.LBE1297
 	.8byte	.LBB1304
 	.8byte	.LBE1304
 	.8byte	.LBB1306
 	.8byte	.LBE1306
+	.8byte	.LBB1308
+	.8byte	.LBE1308
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1297
-	.8byte	.LBE1297
-	.8byte	.LBB1303
-	.8byte	.LBE1303
+	.8byte	.LBB1299
+	.8byte	.LBE1299
 	.8byte	.LBB1305
 	.8byte	.LBE1305
 	.8byte	.LBB1307
 	.8byte	.LBE1307
+	.8byte	.LBB1309
+	.8byte	.LBE1309
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1312
-	.8byte	.LBE1312
-	.8byte	.LBB1318
-	.8byte	.LBE1318
-	.8byte	.LBB1324
-	.8byte	.LBE1324
+	.8byte	.LBB1314
+	.8byte	.LBE1314
+	.8byte	.LBB1320
+	.8byte	.LBE1320
 	.8byte	.LBB1326
 	.8byte	.LBE1326
 	.8byte	.LBB1328
 	.8byte	.LBE1328
+	.8byte	.LBB1330
+	.8byte	.LBE1330
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1319
-	.8byte	.LBE1319
-	.8byte	.LBB1325
-	.8byte	.LBE1325
+	.8byte	.LBB1321
+	.8byte	.LBE1321
 	.8byte	.LBB1327
 	.8byte	.LBE1327
 	.8byte	.LBB1329
 	.8byte	.LBE1329
+	.8byte	.LBB1331
+	.8byte	.LBE1331
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1332
-	.8byte	.LBE1332
-	.8byte	.LBB1345
-	.8byte	.LBE1345
+	.8byte	.LBB1334
+	.8byte	.LBE1334
 	.8byte	.LBB1347
 	.8byte	.LBE1347
 	.8byte	.LBB1349
 	.8byte	.LBE1349
 	.8byte	.LBB1351
 	.8byte	.LBE1351
+	.8byte	.LBB1353
+	.8byte	.LBE1353
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1338
-	.8byte	.LBE1338
-	.8byte	.LBB1344
-	.8byte	.LBE1344
+	.8byte	.LBB1340
+	.8byte	.LBE1340
 	.8byte	.LBB1346
 	.8byte	.LBE1346
 	.8byte	.LBB1348
 	.8byte	.LBE1348
 	.8byte	.LBB1350
 	.8byte	.LBE1350
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1380
-	.8byte	.LBE1380
-	.8byte	.LBB1394
-	.8byte	.LBE1394
-	.8byte	.LBB1422
-	.8byte	.LBE1422
+	.8byte	.LBB1352
+	.8byte	.LBE1352
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1382
 	.8byte	.LBE1382
-	.8byte	.LBB1391
-	.8byte	.LBE1391
+	.8byte	.LBB1396
+	.8byte	.LBE1396
+	.8byte	.LBB1424
+	.8byte	.LBE1424
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1397
-	.8byte	.LBE1397
-	.8byte	.LBB1423
-	.8byte	.LBE1423
+	.8byte	.LBB1384
+	.8byte	.LBE1384
+	.8byte	.LBB1393
+	.8byte	.LBE1393
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1399
 	.8byte	.LBE1399
-	.8byte	.LBB1412
-	.8byte	.LBE1412
+	.8byte	.LBB1425
+	.8byte	.LBE1425
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1401
+	.8byte	.LBE1401
 	.8byte	.LBB1414
 	.8byte	.LBE1414
 	.8byte	.LBB1416
@@ -56069,260 +56156,266 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1418
 	.8byte	.LBB1420
 	.8byte	.LBE1420
+	.8byte	.LBB1422
+	.8byte	.LBE1422
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1406
-	.8byte	.LBE1406
-	.8byte	.LBB1413
-	.8byte	.LBE1413
+	.8byte	.LBB1408
+	.8byte	.LBE1408
 	.8byte	.LBB1415
 	.8byte	.LBE1415
 	.8byte	.LBB1417
 	.8byte	.LBE1417
 	.8byte	.LBB1419
 	.8byte	.LBE1419
+	.8byte	.LBB1421
+	.8byte	.LBE1421
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1426
-	.8byte	.LBE1426
-	.8byte	.LBB1438
-	.8byte	.LBE1438
+	.8byte	.LBB1428
+	.8byte	.LBE1428
 	.8byte	.LBB1440
 	.8byte	.LBE1440
-	.8byte	.LBB1441
-	.8byte	.LBE1441
+	.8byte	.LBB1442
+	.8byte	.LBE1442
 	.8byte	.LBB1443
 	.8byte	.LBE1443
 	.8byte	.LBB1445
 	.8byte	.LBE1445
+	.8byte	.LBB1447
+	.8byte	.LBE1447
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1433
-	.8byte	.LBE1433
-	.8byte	.LBB1439
-	.8byte	.LBE1439
-	.8byte	.LBB1442
-	.8byte	.LBE1442
+	.8byte	.LBB1435
+	.8byte	.LBE1435
+	.8byte	.LBB1441
+	.8byte	.LBE1441
 	.8byte	.LBB1444
 	.8byte	.LBE1444
-	.8byte	0
-	.8byte	0
 	.8byte	.LBB1446
 	.8byte	.LBE1446
-	.8byte	.LBB1455
-	.8byte	.LBE1455
-	.8byte	.LBB1456
-	.8byte	.LBE1456
-	.8byte	.LBB1467
-	.8byte	.LBE1467
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1448
 	.8byte	.LBE1448
-	.8byte	.LBB1451
-	.8byte	.LBE1451
-	.8byte	0
-	.8byte	0
 	.8byte	.LBB1457
 	.8byte	.LBE1457
-	.8byte	.LBB1461
-	.8byte	.LBE1461
-	.8byte	.LBB1462
-	.8byte	.LBE1462
+	.8byte	.LBB1458
+	.8byte	.LBE1458
+	.8byte	.LBB1469
+	.8byte	.LBE1469
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1632
-	.8byte	.LBE1632
-	.8byte	.LBB1635
-	.8byte	.LBE1635
+	.8byte	.LBB1450
+	.8byte	.LBE1450
+	.8byte	.LBB1453
+	.8byte	.LBE1453
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1642
-	.8byte	.LBE1642
-	.8byte	.LBB1716
-	.8byte	.LBE1716
-	.8byte	.LBB1717
-	.8byte	.LBE1717
-	.8byte	.LBB1718
-	.8byte	.LBE1718
+	.8byte	.LBB1459
+	.8byte	.LBE1459
+	.8byte	.LBB1463
+	.8byte	.LBE1463
+	.8byte	.LBB1464
+	.8byte	.LBE1464
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1644
-	.8byte	.LBE1644
-	.8byte	.LBB1653
-	.8byte	.LBE1653
-	.8byte	.LBB1654
-	.8byte	.LBE1654
-	.8byte	.LBB1655
-	.8byte	.LBE1655
+	.8byte	.LBB1634
+	.8byte	.LBE1634
+	.8byte	.LBB1637
+	.8byte	.LBE1637
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1644
+	.8byte	.LBE1644
+	.8byte	.LBB1718
+	.8byte	.LBE1718
 	.8byte	.LBB1719
 	.8byte	.LBE1719
-	.8byte	.LBB1734
-	.8byte	.LBE1734
-	.8byte	.LBB1735
-	.8byte	.LBE1735
-	.8byte	.LBB1745
-	.8byte	.LBE1745
-	.8byte	.LBB1797
-	.8byte	.LBE1797
-	.8byte	.LBB1800
-	.8byte	.LBE1800
+	.8byte	.LBB1720
+	.8byte	.LBE1720
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1646
+	.8byte	.LBE1646
+	.8byte	.LBB1655
+	.8byte	.LBE1655
+	.8byte	.LBB1656
+	.8byte	.LBE1656
+	.8byte	.LBB1657
+	.8byte	.LBE1657
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1721
 	.8byte	.LBE1721
-	.8byte	.LBB1724
-	.8byte	.LBE1724
+	.8byte	.LBB1736
+	.8byte	.LBE1736
+	.8byte	.LBB1737
+	.8byte	.LBE1737
+	.8byte	.LBB1747
+	.8byte	.LBE1747
+	.8byte	.LBB1799
+	.8byte	.LBE1799
+	.8byte	.LBB1802
+	.8byte	.LBE1802
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1725
-	.8byte	.LBE1725
-	.8byte	.LBB1728
-	.8byte	.LBE1728
+	.8byte	.LBB1723
+	.8byte	.LBE1723
+	.8byte	.LBB1726
+	.8byte	.LBE1726
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1736
-	.8byte	.LBE1736
-	.8byte	.LBB1746
-	.8byte	.LBE1746
-	.8byte	.LBB1796
-	.8byte	.LBE1796
-	.8byte	.LBB1801
-	.8byte	.LBE1801
+	.8byte	.LBB1727
+	.8byte	.LBE1727
+	.8byte	.LBB1730
+	.8byte	.LBE1730
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1738
 	.8byte	.LBE1738
-	.8byte	.LBB1741
-	.8byte	.LBE1741
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1747
-	.8byte	.LBE1747
+	.8byte	.LBB1748
+	.8byte	.LBE1748
 	.8byte	.LBB1798
 	.8byte	.LBE1798
-	.8byte	.LBB1799
-	.8byte	.LBE1799
+	.8byte	.LBB1803
+	.8byte	.LBE1803
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1740
+	.8byte	.LBE1740
+	.8byte	.LBB1743
+	.8byte	.LBE1743
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1749
 	.8byte	.LBE1749
-	.8byte	.LBB1755
-	.8byte	.LBE1755
+	.8byte	.LBB1800
+	.8byte	.LBE1800
+	.8byte	.LBB1801
+	.8byte	.LBE1801
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1758
-	.8byte	.LBE1758
-	.8byte	.LBB1759
-	.8byte	.LBE1759
+	.8byte	.LBB1751
+	.8byte	.LBE1751
+	.8byte	.LBB1757
+	.8byte	.LBE1757
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1766
-	.8byte	.LBE1766
-	.8byte	.LBB1772
-	.8byte	.LBE1772
-	.8byte	.LBB1773
-	.8byte	.LBE1773
+	.8byte	.LBB1760
+	.8byte	.LBE1760
+	.8byte	.LBB1761
+	.8byte	.LBE1761
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1768
+	.8byte	.LBE1768
 	.8byte	.LBB1774
 	.8byte	.LBE1774
 	.8byte	.LBB1775
 	.8byte	.LBE1775
-	.8byte	0
-	.8byte	0
 	.8byte	.LBB1776
 	.8byte	.LBE1776
-	.8byte	.LBB1794
-	.8byte	.LBE1794
-	.8byte	.LBB1795
-	.8byte	.LBE1795
-	.8byte	.LBB1802
-	.8byte	.LBE1802
+	.8byte	.LBB1777
+	.8byte	.LBE1777
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1809
-	.8byte	.LBE1809
-	.8byte	.LBB1816
-	.8byte	.LBE1816
-	.8byte	.LBB1817
-	.8byte	.LBE1817
+	.8byte	.LBB1778
+	.8byte	.LBE1778
+	.8byte	.LBB1796
+	.8byte	.LBE1796
+	.8byte	.LBB1797
+	.8byte	.LBE1797
+	.8byte	.LBB1804
+	.8byte	.LBE1804
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1810
-	.8byte	.LBE1810
-	.8byte	.LBB1815
-	.8byte	.LBE1815
+	.8byte	.LBB1811
+	.8byte	.LBE1811
+	.8byte	.LBB1818
+	.8byte	.LBE1818
+	.8byte	.LBB1819
+	.8byte	.LBE1819
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1848
-	.8byte	.LBE1848
-	.8byte	.LBB1855
-	.8byte	.LBE1855
-	.8byte	.LBB1856
-	.8byte	.LBE1856
+	.8byte	.LBB1812
+	.8byte	.LBE1812
+	.8byte	.LBB1817
+	.8byte	.LBE1817
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1850
-	.8byte	.LBE1850
-	.8byte	.LBB1851
-	.8byte	.LBE1851
 	.8byte	.LBB1852
 	.8byte	.LBE1852
+	.8byte	.LBB1859
+	.8byte	.LBE1859
+	.8byte	.LBB1860
+	.8byte	.LBE1860
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1857
-	.8byte	.LBE1857
-	.8byte	.LBB1891
-	.8byte	.LBE1891
+	.8byte	.LBB1854
+	.8byte	.LBE1854
+	.8byte	.LBB1855
+	.8byte	.LBE1855
+	.8byte	.LBB1856
+	.8byte	.LBE1856
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1860
-	.8byte	.LBE1860
-	.8byte	.LBB1866
-	.8byte	.LBE1866
-	.8byte	.LBB1867
-	.8byte	.LBE1867
-	.8byte	.LBB1889
-	.8byte	.LBE1889
+	.8byte	.LBB1861
+	.8byte	.LBE1861
 	.8byte	.LBB1890
 	.8byte	.LBE1890
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1868
-	.8byte	.LBE1868
+	.8byte	.LBB1866
+	.8byte	.LBE1866
 	.8byte	.LBB1871
 	.8byte	.LBE1871
+	.8byte	.LBB1872
+	.8byte	.LBE1872
+	.8byte	.LBB1891
+	.8byte	.LBE1891
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1877
-	.8byte	.LBE1877
-	.8byte	.LBB1880
-	.8byte	.LBE1880
+	.8byte	.LBB1873
+	.8byte	.LBE1873
+	.8byte	.LBB1876
+	.8byte	.LBE1876
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1881
-	.8byte	.LBE1881
-	.8byte	.LBB1895
-	.8byte	.LBE1895
+	.8byte	.LBB1882
+	.8byte	.LBE1882
+	.8byte	.LBB1892
+	.8byte	.LBE1892
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1883
-	.8byte	.LBE1883
 	.8byte	.LBB1884
 	.8byte	.LBE1884
-	.8byte	0
-	.8byte	0
 	.8byte	.LBB1885
 	.8byte	.LBE1885
-	.8byte	.LBB1894
-	.8byte	.LBE1894
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1887
-	.8byte	.LBE1887
+	.8byte	.LBB1886
+	.8byte	.LBE1886
+	.8byte	.LBB1897
+	.8byte	.LBE1897
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB1888
 	.8byte	.LBE1888
+	.8byte	.LBB1889
+	.8byte	.LBE1889
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1893
+	.8byte	.LBE1893
+	.8byte	.LBB1896
+	.8byte	.LBE1896
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1898
+	.8byte	.LBE1898
+	.8byte	.LBB1901
+	.8byte	.LBE1901
 	.8byte	0
 	.8byte	0
 	.8byte	.Ltext0
@@ -57267,7 +57360,7 @@ __exitcall_ebc_exit:
 .LASF1826:
 	.string	"bd_super"
 .LASF3044:
-	.string	"__addressable_ebc_init3171"
+	.string	"__addressable_ebc_init3172"
 .LASF2723:
 	.string	"usermodehelper_table"
 .LASF160:
@@ -59742,7 +59835,7 @@ __exitcall_ebc_exit:
 	.string	"qf_fmt_id"
 .LASF1065:
 	.string	"nr_wakeups_idle"
-.LASF3332:
+.LASF3333:
 	.string	"up_write"
 .LASF1473:
 	.string	"NR_MLOCK"
@@ -61176,7 +61269,7 @@ __exitcall_ebc_exit:
 	.string	"i2c_bus_type"
 .LASF899:
 	.string	"hrtimer_cpu_base"
-.LASF3333:
+.LASF3332:
 	.string	"ebc_notify"
 .LASF1405:
 	.string	"cb_head"

commit 2f2690e24e05358055c70c3d64b96c3350c3ba6c
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Fri Dec 3 10:48:50 2021 +0800

    drm/rockchip: ebc_tcon: set ebc dclk div 0
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: Icab6c9539fd055899c1bc95cf7ac496a17809117

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.c b/drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.c
index 23c82751bb1b..f3c50d64ffbe 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.c
+++ b/drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.c
@@ -209,7 +209,7 @@ static int tcon_enable(struct ebc_tcon *tcon, struct ebc_panel *panel)
 				| EPD_SDSHR(1));
 	tcon_write(tcon, EBC_DSP_START, DSP_SDCE_WIDTH(panel->ldl) | SW_BURST_CTRL);
 	tcon_write(tcon, EBC_DSP_CTRL,
-				DSP_SWAP_MODE(panel->panel_16bit ? 2 : 3) | DSP_VCOM_MODE(1) | DSP_SDCLK_DIV(panel->panel_16bit ? 7 : 3));
+				DSP_SWAP_MODE(panel->panel_16bit ? 2 : 3) | DSP_VCOM_MODE(1) | DSP_SDCLK_DIV(0));
 	tcon_cfg_done(tcon);
 
 	enable_irq(tcon->irq);

commit 77fca5bc9f7d2cc5d7faf29dfff138e4de5534d2
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Fri Dec 3 10:47:13 2021 +0800

    arm64: dts: rockchip: rk3566-rk817-eink-w103: assign ebc dclk
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: I384f758401e5d591ff0a9fe2a1c7e0326cb064c2

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts
index db0e3a0e6735..957f6e897fbf 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts
@@ -224,8 +224,7 @@
 &ebc {
 	/* clock rate 1000M/n, (n=1~32) */
 	assigned-clocks = <&cru CPLL_333M>, <&cru DCLK_EBC>;
-	//assigned-clock-rates = <340000000>, <340000000>;
-	assigned-clock-rates = <250000000>, <250000000>;
+	assigned-clock-rates = <34000000>, <34000000>;
 	status = "okay";
 };
 
@@ -261,7 +260,7 @@
 	panel,height = <1404>;
 	panel,vir_width = <1872>;
 	panel,vir_height = <1404>;
-	panel,sdck = <33300000>;
+	panel,sdck = <34000000>;
 	panel,lsl = <18>;
 	panel,lbl = <17>;
 	panel,ldl = <234>;

commit 48f29b227e7b14cbca6931704053e12f888bc5a1
Author: Caesar Wang <wxt@rock-chips.com>
Date:   Wed Sep 29 16:25:12 2021 +0800

    arm64: dts: rockchip: add rk3358 evb for linux
    
    Signed-off-by: Caesar Wang <wxt@rock-chips.com>
    Change-Id: I64fd77f17c4df93dc1ba14b19a054ec551500ba8

diff --git a/arch/arm64/boot/dts/rockchip/Makefile b/arch/arm64/boot/dts/rockchip/Makefile
index bbba4717608e..8046acf41fd8 100644
--- a/arch/arm64/boot/dts/rockchip/Makefile
+++ b/arch/arm64/boot/dts/rockchip/Makefile
@@ -41,6 +41,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64-android.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64-android-avb.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-roc-cc.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3358-evb-ddr3-v10-linux.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-808-evb.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-evb-act8846.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-geekbox.dtb
diff --git a/arch/arm64/boot/dts/rockchip/rk3358-evb-ddr3-v10-linux.dts b/arch/arm64/boot/dts/rockchip/rk3358-evb-ddr3-v10-linux.dts
new file mode 100644
index 000000000000..16a6362b708d
--- /dev/null
+++ b/arch/arm64/boot/dts/rockchip/rk3358-evb-ddr3-v10-linux.dts
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+/dts-v1/;
+
+#include "rk3358-evb-ddr3.dtsi"
+#include "rk3358-linux.dtsi"
+
+/ {
+	model = "Rockchip linux RK3358 EVB DDR3 board";
+	compatible = "rockchip,rk3358-evb-ddr3-v10-linux", "rockchip,px30", "rockchip,rk3358";
+};
diff --git a/arch/arm64/boot/dts/rockchip/rk3358-evb-ddr3.dtsi b/arch/arm64/boot/dts/rockchip/rk3358-evb-ddr3.dtsi
new file mode 100644
index 000000000000..ae750d38fc4f
--- /dev/null
+++ b/arch/arm64/boot/dts/rockchip/rk3358-evb-ddr3.dtsi
@@ -0,0 +1,1089 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co., Ltd
+ *
+ */
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/pinctrl/rockchip.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/display/drm_mipi_dsi.h>
+#include "rk3358.dtsi"
+
+/ {
+	adc-keys {
+		compatible = "adc-keys";
+		io-channels = <&saradc 2>;
+		io-channel-names = "buttons";
+		poll-interval = <100>;
+		keyup-threshold-microvolt = <1800000>;
+
+		esc-key {
+			linux,code = <KEY_ESC>;
+			label = "esc";
+			press-threshold-microvolt = <1310000>;
+		};
+
+		home-key {
+			linux,code = <KEY_HOME>;
+			label = "home";
+			press-threshold-microvolt = <624000>;
+		};
+
+		menu-key {
+			linux,code = <KEY_MENU>;
+			label = "menu";
+			press-threshold-microvolt = <987000>;
+		};
+
+		vol-down-key {
+			linux,code = <KEY_VOLUMEDOWN>;
+			label = "volume down";
+			press-threshold-microvolt = <300000>;
+		};
+
+		vol-up-key {
+			linux,code = <KEY_VOLUMEUP>;
+			label = "volume up";
+			press-threshold-microvolt = <17000>;
+		};
+	};
+
+	backlight: backlight {
+		compatible = "pwm-backlight";
+		pwms = <&pwm1 0 25000 0>;
+		brightness-levels = <
+			  0   1   2   3   4   5   6   7
+			  8   9  10  11  12  13  14  15
+			 16  17  18  19  20  21  22  23
+			 24  25  26  27  28  29  30  31
+			 32  33  34  35  36  37  38  39
+			 40  41  42  43  44  45  46  47
+			 48  49  50  51  52  53  54  55
+			 56  57  58  59  60  61  62  63
+			 64  65  66  67  68  69  70  71
+			 72  73  74  75  76  77  78  79
+			 80  81  82  83  84  85  86  87
+			 88  89  90  91  92  93  94  95
+			 96  97  98  99 100 101 102 103
+			104 105 106 107 108 109 110 111
+			112 113 114 115 116 117 118 119
+			120 121 122 123 124 125 126 127
+			128 129 130 131 132 133 134 135
+			136 137 138 139 140 141 142 143
+			144 145 146 147 148 149 150 151
+			152 153 154 155 156 157 158 159
+			160 161 162 163 164 165 166 167
+			168 169 170 171 172 173 174 175
+			176 177 178 179 180 181 182 183
+			184 185 186 187 188 189 190 191
+			192 193 194 195 196 197 198 199
+			200 201 202 203 204 205 206 207
+			208 209 210 211 212 213 214 215
+			216 217 218 219 220 221 222 223
+			224 225 226 227 228 229 230 231
+			232 233 234 235 236 237 238 239
+			240 241 242 243 244 245 246 247
+			248 249 250 251 252 253 254 255>;
+		default-brightness-level = <200>;
+	};
+
+	charge-animation {
+		compatible = "rockchip,uboot-charge";
+		rockchip,uboot-charge-on = <0>;
+		rockchip,android-charge-on = <1>;
+		rockchip,uboot-low-power-voltage = <3500>;
+		rockchip,screen-on-voltage = <3600>;
+		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 = <&gpio2 RK_PB0 GPIO_ACTIVE_LOW>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&hp_det>;
+		io-channels = <&saradc 1>;
+	};
+
+	sdio_pwrseq: sdio-pwrseq {
+		compatible = "mmc-pwrseq-simple";
+		/*clocks = <&rk809 1>;*/
+		/*clock-names = "ext_clock";*/
+		pinctrl-names = "default";
+		pinctrl-0 = <&wifi_enable_h>;
+
+		/*
+		 * On the module itself this is one of these (depending
+		 * on the actual card populated):
+		 * - SDIO_RESET_L_WL_REG_ON
+		 * - PDN (power down when low)
+		 */
+		reset-gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_LOW>; /* GPIO3_A4 */
+	};
+
+	vcc_phy: vcc-phy-regulator {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc_phy";
+		regulator-always-on;
+		regulator-boot-on;
+	};
+
+	vcc5v0_sys: vccsys {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc5v0_sys";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+	};
+
+	vcc5v0_host_vbus: vcc5v0-host-regulator {
+		compatible = "regulator-fixed";
+		gpio = <&gpio3 RK_PD0 GPIO_ACTIVE_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&host_vbus_drv>;
+		regulator-name = "vcc5v0_host_vbus";
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		regulator-always-on;
+		enable-active-high;
+	};
+
+	wireless-wlan {
+		compatible = "wlan-platdata";
+		wifi_chip_type = "AP6210";
+		WIFI,host_wake_irq = <&gpio3 RK_PB0 GPIO_ACTIVE_HIGH>;
+		status = "okay";
+	};
+
+	wireless-bluetooth {
+		compatible = "bluetooth-platdata";
+		clocks = <&rk809 1>;
+		clock-names = "ext_clock";
+		uart_rts_gpios = <&gpio1 RK_PC3 GPIO_ACTIVE_LOW>;
+		pinctrl-names = "default","rts_gpio";
+		pinctrl-0 = <&uart1_rts>;
+		pinctrl-1 = <&uart1_rts_gpio>;
+		BT,reset_gpio = <&gpio0 RK_PA1 GPIO_ACTIVE_HIGH>;
+		BT,wake_gpio = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>;
+		BT,wake_host_irq = <&gpio3 RK_PB3 GPIO_ACTIVE_HIGH>;
+		status = "okay";
+	};
+};
+
+&display_subsystem {
+	status = "okay";
+};
+
+&dsi {
+	status = "okay";
+
+	panel@0 {
+		compatible = "sitronix,st7703", "simple-panel-dsi";
+		reg = <0>;
+		power-supply = <&vcc3v3_lcd>;
+		backlight = <&backlight>;
+		prepare-delay-ms = <0>;
+		reset-delay-ms = <0>;
+		init-delay-ms = <80>;
+		enable-delay-ms = <0>;
+		disable-delay-ms = <10>;
+		unprepare-delay-ms = <60>;
+
+		width-mm = <68>;
+		height-mm = <121>;
+
+		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 = [
+			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 53
+			15 00 02 05 13
+			15 00 02 06 04
+			15 00 02 07 02
+			15 00 02 08 02
+			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 00
+
+			15 00 02 10 00
+			15 00 02 11 00
+			15 00 02 12 00
+			15 00 02 13 00
+			15 00 02 14 00
+			15 00 02 15 08
+			15 00 02 16 10
+			15 00 02 17 00
+			15 00 02 18 08
+			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 c0
+			15 00 02 1f 80
+
+			15 00 02 20 02
+			15 00 02 21 09
+			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 55
+			15 00 02 29 03
+			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 04
+			15 00 02 35 05
+			15 00 02 36 05
+			15 00 02 37 00
+			15 00 02 38 3c
+			15 00 02 39 35
+			15 00 02 3a 00
+			15 00 02 3b 40
+			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 88
+			15 00 02 42 00
+			15 00 02 43 00
+			15 00 02 44 1f
+
+			15 00 02 50 01
+			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 03
+			15 00 02 5f 14
+
+			15 00 02 60 15
+			15 00 02 61 0c
+			15 00 02 62 0d
+			15 00 02 63 0e
+			15 00 02 64 0f
+			15 00 02 65 10
+			15 00 02 66 11
+			15 00 02 67 08
+			15 00 02 68 02
+			15 00 02 69 0a
+			15 00 02 6a 02
+			15 00 02 6b 02
+			15 00 02 6c 02
+			15 00 02 6d 02
+			15 00 02 6e 02
+			15 00 02 6f 02
+
+			15 00 02 70 02
+			15 00 02 71 02
+			15 00 02 72 06
+			15 00 02 73 02
+			15 00 02 74 02
+			15 00 02 75 14
+			15 00 02 76 15
+			15 00 02 77 0f
+			15 00 02 78 0e
+			15 00 02 79 0d
+			15 00 02 7a 0c
+			15 00 02 7b 11
+			15 00 02 7c 10
+			15 00 02 7d 06
+			15 00 02 7e 02
+			15 00 02 7f 0a
+
+			15 00 02 80 02
+			15 00 02 81 02
+			15 00 02 82 02
+			15 00 02 83 02
+			15 00 02 84 02
+			15 00 02 85 02
+			15 00 02 86 02
+			15 00 02 87 02
+			15 00 02 88 08
+			15 00 02 89 02
+			15 00 02 8a 02
+
+			39 00 04 ff 98 81 04
+			15 00 02 00 80
+			15 00 02 70 00
+			15 00 02 71 00
+			15 00 02 66 fe
+			15 00 02 82 15
+			15 00 02 84 15
+			15 00 02 85 15
+			15 00 02 3a 24
+			15 00 02 32 ac
+			15 00 02 8c 80
+			15 00 02 3c f5
+			15 00 02 88 33
+
+			39 00 04 ff 98 81 01
+			15 00 02 22 0a
+			15 00 02 31 00
+			15 00 02 53 78
+			15 00 02 50 5b
+			15 00 02 51 5b
+			15 00 02 60 20
+			15 00 02 61 00
+			15 00 02 62 0d
+			15 00 02 63 00
+
+			15 00 02 a0 00
+			15 00 02 a1 10
+			15 00 02 a2 1c
+			15 00 02 a3 13
+			15 00 02 a4 15
+			15 00 02 a5 26
+			15 00 02 a6 1a
+			15 00 02 a7 1d
+			15 00 02 a8 67
+			15 00 02 a9 1c
+			15 00 02 aa 29
+			15 00 02 ab 5b
+			15 00 02 ac 26
+			15 00 02 ad 28
+			15 00 02 ae 5c
+			15 00 02 af 30
+			15 00 02 b0 31
+			15 00 02 b1 2e
+			15 00 02 b2 32
+			15 00 02 b3 00
+
+			15 00 02 c0 00
+			15 00 02 c1 10
+			15 00 02 c2 1c
+			15 00 02 c3 13
+			15 00 02 c4 15
+			15 00 02 c5 26
+			15 00 02 c6 1a
+			15 00 02 c7 1d
+			15 00 02 c8 67
+			15 00 02 c9 1c
+			15 00 02 ca 29
+			15 00 02 cb 5b
+			15 00 02 cc 26
+			15 00 02 cd 28
+			15 00 02 ce 5c
+			15 00 02 cf 30
+			15 00 02 d0 31
+			15 00 02 d1 2e
+			15 00 02 d2 32
+			15 00 02 d3 00
+			39 00 04 ff 98 81 00
+			05 00 01 11
+			05 01 01 29
+		];
+
+		panel-exit-sequence = [
+			05 00 01 28
+			05 00 01 10
+		];
+
+		display-timings {
+			native-mode = <&timing1>;
+
+			timing1: timing1 {
+				clock-frequency = <64000000>;
+				hactive = <720>;
+				vactive = <1280>;
+				hfront-porch = <40>;
+				hsync-len = <10>;
+				hback-porch = <40>;
+				vfront-porch = <22>;
+				vsync-len = <4>;
+				vback-porch = <11>;
+				hsync-active = <0>;
+				vsync-active = <0>;
+				de-active = <0>;
+				pixelclk-active = <0>;
+			};
+		};
+
+		ports {
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			port@0 {
+				reg = <0>;
+				panel_in_dsi: endpoint {
+					remote-endpoint = <&dsi_out_panel>;
+				};
+			};
+		};
+
+	};
+
+	ports {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		port@1 {
+			reg = <1>;
+			dsi_out_panel: endpoint {
+				remote-endpoint = <&panel_in_dsi>;
+			};
+		};
+	};
+};
+
+&dsi_in_vopb {
+	status = "okay";
+};
+
+&dsi_in_vopl {
+	status = "disabled";
+};
+
+&route_dsi {
+	connect = <&vopb_out_dsi>;
+	status = "okay";
+};
+
+&bus_apll {
+	bus-supply = <&vdd_logic>;
+	status = "okay";
+};
+
+&cpu0 {
+	cpu-supply = <&vdd_arm>;
+};
+
+&dfi {
+	status = "okay";
+};
+
+&dmc {
+	center-supply = <&vdd_logic>;
+	status = "okay";
+};
+
+&emmc {
+	bus-width = <8>;
+	cap-mmc-highspeed;
+	mmc-hs200-1_8v;
+	supports-emmc;
+	disable-wp;
+	non-removable;
+	num-slots = <1>;
+	status = "okay";
+};
+
+&gmac {
+	phy-supply = <&vcc_phy>;
+	clock_in_out = "output";
+	snps,reset-gpio = <&gpio2 13 GPIO_ACTIVE_LOW>;
+	snps,reset-active-low;
+	snps,reset-delays-us = <0 50000 50000>;
+	status = "okay";
+};
+
+&gpu {
+	mali-supply = <&vdd_logic>;
+	status = "okay";
+};
+
+&i2c0 {
+	status = "okay";
+
+	rk809: pmic@20 {
+		compatible = "rockchip,rk809";
+		reg = <0x20>;
+		interrupt-parent = <&gpio0>;
+		interrupts = <7 IRQ_TYPE_LEVEL_LOW>;
+		pinctrl-names = "default", "pmic-sleep",
+				"pmic-power-off", "pmic-reset";
+		pinctrl-0 = <&pmic_int>;
+		pinctrl-1 = <&soc_slppin_slp>, <&rk817_slppin_slp>;
+		pinctrl-2 = <&soc_slppin_gpio>, <&rk817_slppin_pwrdn>;
+		pinctrl-3 = <&soc_slppin_rst>, <&rk817_slppin_rst>;
+		rockchip,system-power-controller;
+		wakeup-source;
+		#clock-cells = <1>;
+		clock-output-names = "rk808-clkout1", "rk808-clkout2";
+		//fb-inner-reg-idxs = <2>;
+		/* 1: rst regs (default in codes), 0: rst the pmic */
+		pmic-reset-func = <1>;
+
+		vcc1-supply = <&vcc5v0_sys>;
+		vcc2-supply = <&vcc5v0_sys>;
+		vcc3-supply = <&vcc5v0_sys>;
+		vcc4-supply = <&vcc5v0_sys>;
+		vcc5-supply = <&vcc3v3_sys>;
+		vcc6-supply = <&vcc3v3_sys>;
+		vcc7-supply = <&vcc3v3_sys>;
+		vcc8-supply = <&vcc3v3_sys>;
+		vcc9-supply = <&vcc5v0_sys>;
+
+		pwrkey {
+			status = "okay";
+		};
+
+		pinctrl_rk8xx: pinctrl_rk8xx {
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			rk817_slppin_null: rk817_slppin_null {
+				pins = "gpio_slp";
+				function = "pin_fun0";
+			};
+
+			rk817_slppin_slp: rk817_slppin_slp {
+				pins = "gpio_slp";
+				function = "pin_fun1";
+			};
+
+			rk817_slppin_pwrdn: rk817_slppin_pwrdn {
+				pins = "gpio_slp";
+				function = "pin_fun2";
+			};
+
+			rk817_slppin_rst: rk817_slppin_rst {
+				pins = "gpio_slp";
+				function = "pin_fun3";
+			};
+		};
+
+		regulators {
+			vdd_logic: DCDC_REG1 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <950000>;
+				regulator-max-microvolt = <1350000>;
+				regulator-ramp-delay = <6001>;
+				regulator-initial-mode = <0x2>;
+				regulator-name = "vdd_logic";
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <950000>;
+				};
+			};
+
+			vdd_arm: DCDC_REG2 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <950000>;
+				regulator-max-microvolt = <1350000>;
+				regulator-ramp-delay = <6001>;
+				regulator-initial-mode = <0x2>;
+				regulator-name = "vdd_arm";
+				regulator-state-mem {
+					regulator-off-in-suspend;
+					regulator-suspend-microvolt = <950000>;
+				};
+			};
+
+			vcc_ddr: DCDC_REG3 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-name = "vcc_ddr";
+				regulator-initial-mode = <0x2>;
+				regulator-state-mem {
+					regulator-on-in-suspend;
+				};
+			};
+
+			vcc_3v0: DCDC_REG4 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <3300000>;
+				regulator-max-microvolt = <3300000>;
+				regulator-initial-mode = <0x2>;
+				regulator-name = "vcc_3v0";
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <3300000>;
+				};
+			};
+
+			vcc_1v0: LDO_REG1 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <1000000>;
+				regulator-max-microvolt = <1000000>;
+				regulator-name = "vcc_1v0";
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <1000000>;
+				};
+			};
+
+			vcc1v8_soc: LDO_REG2 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <1800000>;
+
+				regulator-name = "vcc1v8_soc";
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <1800000>;
+				};
+			};
+
+			vdd1v0_soc: LDO_REG3 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <1000000>;
+				regulator-max-microvolt = <1000000>;
+
+				regulator-name = "vcc1v0_soc";
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <1000000>;
+				};
+			};
+
+			vcc3v0_pmu: LDO_REG4 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <3000000>;
+				regulator-max-microvolt = <3000000>;
+
+				regulator-name = "vcc3v0_pmu";
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <3000000>;
+
+				};
+			};
+
+			vccio_sd: LDO_REG5 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <3300000>;
+
+				regulator-name = "vccio_sd";
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <3300000>;
+				};
+			};
+
+			vcc_sd: LDO_REG6 {
+				regulator-min-microvolt = <3300000>;
+				regulator-max-microvolt = <3300000>;
+				regulator-boot-on;
+
+				regulator-name = "vcc_sd";
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <3300000>;
+
+				};
+			};
+
+			vcc2v8_dvp: LDO_REG7 {
+				regulator-boot-on;
+				regulator-min-microvolt = <2800000>;
+				regulator-max-microvolt = <2800000>;
+
+				regulator-name = "vcc2v8_dvp";
+				regulator-state-mem {
+					regulator-off-in-suspend;
+					regulator-suspend-microvolt = <2800000>;
+				};
+			};
+
+			vcc1v8_dvp: LDO_REG8 {
+				regulator-boot-on;
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <1800000>;
+
+				regulator-name = "vcc1v8_dvp";
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <1800000>;
+				};
+			};
+
+			vdd1v5_dvp: LDO_REG9 {
+				regulator-boot-on;
+				regulator-min-microvolt = <1500000>;
+				regulator-max-microvolt = <1500000>;
+
+				regulator-name = "vdd1v5_dvp";
+				regulator-state-mem {
+					regulator-off-in-suspend;
+					regulator-suspend-microvolt = <1500000>;
+				};
+			};
+
+			vcc3v3_sys: DCDC_REG5 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <3300000>;
+				regulator-max-microvolt = <3300000>;
+				regulator-name = "vcc3v3_sys";
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <3300000>;
+				};
+			};
+
+			vcc5v0_host: SWITCH_REG1 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-name = "vcc5v0_host";
+			};
+
+			vcc3v3_lcd: SWITCH_REG2 {
+				regulator-boot-on;
+				regulator-name = "vcc3v3_lcd";
+			};
+		};
+
+		rk809_codec: codec {
+			#sound-dai-cells = <0>;
+			compatible = "rockchip,rk809-codec", "rockchip,rk817-codec";
+			clocks = <&cru SCLK_I2S1_OUT>;
+			clock-names = "mclk";
+			pinctrl-names = "default";
+			pinctrl-0 = <&i2s1_2ch_mclk>;
+			hp-volume = <20>;
+			spk-volume = <3>;
+			status = "okay";
+		};
+	};
+};
+
+&i2c1 {
+	status = "okay";
+
+	gt1x: gt1x@14 {
+		compatible = "goodix,gt1x";
+		reg = <0x14>;
+		power-supply = <&vcc3v3_lcd>;
+		goodix,rst-gpio = <&gpio3 RK_PB5 GPIO_ACTIVE_HIGH>;
+		goodix,irq-gpio = <&gpio0 RK_PA5 IRQ_TYPE_LEVEL_LOW>;
+	};
+};
+
+&i2c2 {
+	status = "okay";
+
+	clock-frequency = <100000>;
+
+	/* These are relatively safe rise/fall times; TODO: measure */
+	i2c-scl-falling-time-ns = <50>;
+	i2c-scl-rising-time-ns = <300>;
+
+	ov5695: ov5695@36 {
+		compatible = "ovti,ov5695";
+		reg = <0x36>;
+		clocks = <&cru SCLK_CIF_OUT>;
+		clock-names = "xvclk";
+
+		avdd-supply = <&vcc2v8_dvp>;
+		dovdd-supply = <&vcc1v8_dvp>;
+		dvdd-supply = <&vdd1v5_dvp>;
+
+		/*reset-gpios = <&gpio2 14 GPIO_ACTIVE_HIGH>;*/
+		pwdn-gpios = <&gpio2 14 GPIO_ACTIVE_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&cif_clkout_m0>;
+		port {
+			ucam_out: endpoint {
+				remote-endpoint = <&mipi_in_ucam>;
+				data-lanes = <1 2>;
+			};
+		};
+	};
+};
+
+&i2s1_2ch {
+	status = "okay";
+	#sound-dai-cells = <0>;
+};
+
+&io_domains {
+	status = "okay";
+
+	vccio1-supply = <&vcc_3v0>;
+	vccio2-supply = <&vccio_sd>;
+	vccio3-supply = <&vcc_3v0>;
+	vccio4-supply = <&vcc3v0_pmu>;
+	vccio5-supply = <&vcc_3v0>;
+};
+
+&isp_mmu {
+	status = "okay";
+};
+
+&mipi_dphy_rx0 {
+	status = "okay";
+
+	ports {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		port@0 {
+			reg = <0>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			mipi_in_ucam: endpoint@1 {
+				reg = <1>;
+				remote-endpoint = <&ucam_out>;
+				data-lanes = <1 2>;
+			};
+		};
+
+		port@1 {
+			reg = <1>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			dphy_rx0_out: endpoint@0 {
+				reg = <0>;
+				remote-endpoint = <&isp0_mipi_in>;
+			};
+		};
+	};
+};
+
+&nandc0 {
+	status = "okay";
+};
+
+&pmu_io_domains {
+	status = "okay";
+
+	pmuio1-supply = <&vcc3v0_pmu>;
+	pmuio2-supply = <&vcc3v0_pmu>;
+};
+
+&pwm1 {
+	status = "okay";
+};
+
+&rk_rga {
+	status = "okay";
+};
+
+&rkisp1 {
+	status = "okay";
+
+	port {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		isp0_mipi_in: endpoint@0 {
+			reg = <0>;
+			remote-endpoint = <&dphy_rx0_out>;
+		};
+	};
+};
+
+&rockchip_suspend {
+	status = "okay";
+	rockchip,sleep-debug-en = <1>;
+};
+
+&saradc {
+	status = "okay";
+	vref-supply = <&vcc1v8_soc>;
+};
+
+&sdmmc {
+	bus-width = <4>;
+	cap-mmc-highspeed;
+	cap-sd-highspeed;
+	supports-sd;
+	card-detect-delay = <800>;
+	ignore-pm-notify;
+	/*cd-gpios = <&gpio2 4 GPIO_ACTIVE_HIGH>; [> CD GPIO <]*/
+	sd-uhs-sdr12;
+	sd-uhs-sdr25;
+	sd-uhs-sdr50;
+	sd-uhs-sdr104;
+	vqmmc-supply = <&vccio_sd>;
+	vmmc-supply = <&vcc_sd>;
+	status = "okay";
+};
+
+&sdio {
+	bus-width = <4>;
+	cap-sd-highspeed;
+	supports-sdio;
+	ignore-pm-notify;
+	keep-power-in-suspend;
+	non-removable;
+	mmc-pwrseq = <&sdio_pwrseq>;
+	sd-uhs-sdr104;
+	status = "okay";
+};
+
+&tsadc {
+	pinctrl-names = "gpio", "otpout";
+	pinctrl-0 = <&tsadc_otp_gpio>;
+	pinctrl-1 = <&tsadc_otp_out>;
+	status = "okay";
+};
+
+&uart1 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&uart1_xfer &uart1_cts>;
+	status = "okay";
+};
+
+&u2phy {
+	status = "okay";
+
+	u2phy_host: host-port {
+		status = "okay";
+		phy-supply = <&vcc5v0_host_vbus>;
+	};
+
+	u2phy_otg: otg-port {
+		status = "okay";
+	};
+};
+
+&usb20_otg {
+	status = "okay";
+};
+
+&usb_host0_ehci {
+	status = "okay";
+};
+
+&usb_host0_ohci {
+	status = "okay";
+};
+
+&vopb {
+	status = "okay";
+};
+
+&vopb_mmu {
+	status = "okay";
+};
+
+&vopl {
+	status = "okay";
+};
+
+&vopl_mmu {
+	status = "okay";
+};
+
+&mpp_srv {
+	status = "okay";
+};
+
+&vdpu {
+	status = "okay";
+};
+
+&vepu {
+	status = "okay";
+};
+
+&vpu_mmu {
+	status = "okay";
+};
+
+&hevc {
+	status = "okay";
+};
+
+&hevc_mmu {
+	status = "okay";
+};
+
+&pinctrl {
+	headphone {
+		hp_det: hp-det {
+			rockchip,pins = <2 RK_PB0 RK_FUNC_GPIO &pcfg_pull_down>;
+		};
+	};
+
+	pmic {
+		pmic_int: pmic_int {
+			rockchip,pins =
+				<0 RK_PA7 RK_FUNC_GPIO &pcfg_pull_up>;
+		};
+
+		soc_slppin_gpio: soc_slppin_gpio {
+			rockchip,pins =
+				<0 RK_PA4 RK_FUNC_GPIO &pcfg_output_low>;
+		};
+
+		soc_slppin_slp: soc_slppin_slp {
+			rockchip,pins =
+				<0 RK_PA4 1 &pcfg_pull_none>;
+		};
+
+		soc_slppin_rst: soc_slppin_rst {
+			rockchip,pins =
+				<0 RK_PA4 2 &pcfg_pull_none>;
+		};
+	};
+
+	sdio-pwrseq {
+		wifi_enable_h: wifi-enable-h {
+			rockchip,pins = <0 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+
+	usb {
+		host_vbus_drv: host-vbus-drv {
+			rockchip,pins = <3 RK_PD0 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+};
diff --git a/arch/arm64/boot/dts/rockchip/rk3358-linux.dtsi b/arch/arm64/boot/dts/rockchip/rk3358-linux.dtsi
new file mode 100644
index 000000000000..5a55558eb7c9
--- /dev/null
+++ b/arch/arm64/boot/dts/rockchip/rk3358-linux.dtsi
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+/ {
+	compatible = "rockchip,linux", "rockchip,rk3358", "rockchip,px30";
+
+	chosen {
+		bootargs = "earlycon=uart8250,mmio32,0xff160000 console=ttyFIQ0 rw root=PARTUUID=614e0000-0000 rootwait";
+	};
+
+	fiq-debugger {
+		compatible = "rockchip,fiq-debugger";
+		rockchip,serial-id = <2>;
+		rockchip,wake-irq = <0>;
+		/* If enable uart uses irq instead of fiq */
+		rockchip,irq-mode-enable = <0>;
+		rockchip,baudrate = <1500000>;  /* Only 115200 and 1500000 */
+		interrupts = <GIC_SPI 127 IRQ_TYPE_LEVEL_LOW>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&uart2m0_xfer>;
+		status = "okay";
+	};
+
+	reserved-memory {
+		#address-cells = <2>;
+		#size-cells = <2>;
+		ranges;
+
+		drm_logo: drm-logo@00000000 {
+			compatible = "rockchip,drm-logo";
+			reg = <0x0 0x0 0x0 0x0>;
+		};
+	};
+};
+
+&cpu0_opp_table {
+	rockchip,avs = <1>;
+};
+
+&rng {
+	status = "okay";
+};
+
+&video_phy {
+	status = "okay";
+};
diff --git a/arch/arm64/boot/dts/rockchip/rk3358.dtsi b/arch/arm64/boot/dts/rockchip/rk3358.dtsi
new file mode 100644
index 000000000000..02481b2bd1ec
--- /dev/null
+++ b/arch/arm64/boot/dts/rockchip/rk3358.dtsi
@@ -0,0 +1,122 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+#include "px30.dtsi"
+
+&cpu0_opp_table {
+	/delete-node/ opp-1200000000;
+	/delete-node/ opp-1248000000;
+	/delete-node/ opp-1296000000;
+	/delete-node/ opp-1416000000;
+	/delete-node/ opp-1512000000;
+};
+
+&cru {
+	assigned-clocks = <&cru PLL_NPLL>;
+	assigned-clock-rates = <1040000000>;
+};
+
+&display_subsystem {
+	status = "disabled";
+	ports = <&vopb_out>, <&vopl_out>;
+	logo-memory-region = <&drm_logo>;
+
+	route {
+		route_lvds: route-lvds {
+			status = "disabled";
+			logo,uboot = "logo.bmp";
+			logo,kernel = "logo_kernel.bmp";
+			logo,mode = "center";
+			charge_logo,mode = "center";
+			connect = <&vopb_out_lvds>;
+		};
+
+		route_dsi: route-dsi {
+			status = "disabled";
+			logo,uboot = "logo.bmp";
+			logo,kernel = "logo_kernel.bmp";
+			logo,mode = "center";
+			charge_logo,mode = "center";
+			connect = <&vopb_out_dsi>;
+		};
+
+		route_rgb: route-rgb {
+			status = "disabled";
+			logo,uboot = "logo.bmp";
+			logo,kernel = "logo_kernel.bmp";
+			logo,mode = "center";
+			charge_logo,mode = "center";
+			connect = <&vopb_out_rgb>;
+		};
+	};
+};
+
+&gpu_opp_table {
+	opp-520000000 {
+		opp-hz = /bits/ 64 <520000000>;
+		opp-microvolt = <1175000>;
+		opp-microvolt-L0 = <1175000>;
+		opp-microvolt-L1 = <1150000>;
+		opp-microvolt-L2 = <1100000>;
+		opp-microvolt-L3 = <1050000>;
+	};
+};
+
+&rgb {
+	phys = <&video_phy>;
+	phy-names = "phy";
+	pinctrl-names = "default", "sleep";
+	pinctrl-0 = <&lcdc_m1_rgb_pins>;
+	pinctrl-1 = <&lcdc_m1_sleep_pins>;
+};
+
+&pinctrl {
+	lcdc {
+		lcdc_m1_rgb_pins: lcdc-m1-rgb-pins {
+			rockchip,pins =
+				<3 RK_PA0 1 &pcfg_pull_none_8ma>,	/* LCDC_DCLK */
+				<3 RK_PA4 1 &pcfg_pull_none_8ma>,	/* LCDC_D0 */
+				<3 RK_PA6 1 &pcfg_pull_none_8ma>,	/* LCDC_D2 */
+				<3 RK_PB2 1 &pcfg_pull_none_8ma>,	/* LCDC_D6 */
+				<3 RK_PB3 1 &pcfg_pull_none_8ma>,	/* LCDC_D7 */
+				<3 RK_PB5 1 &pcfg_pull_none_8ma>,	/* LCDC_D9 */
+				<3 RK_PC0 1 &pcfg_pull_none_8ma>,	/* LCDC_D12 */
+				<3 RK_PC1 1 &pcfg_pull_none_8ma>,	/* LCDC_D13 */
+				<3 RK_PC2 1 &pcfg_pull_none_8ma>,	/* LCDC_D14 */
+				<3 RK_PC3 1 &pcfg_pull_none_8ma>,	/* LCDC_D15 */
+				<3 RK_PC4 1 &pcfg_pull_none_8ma>,	/* LCDC_D16 */
+				<3 RK_PC5 1 &pcfg_pull_none_8ma>,	/* LCDC_D17 */
+				<3 RK_PC6 1 &pcfg_pull_none_8ma>,	/* LCDC_D18 */
+				<3 RK_PC7 1 &pcfg_pull_none_8ma>,	/* LCDC_D19 */
+				<3 RK_PD0 1 &pcfg_pull_none_8ma>,	/* LCDC_D20 */
+				<3 RK_PD1 1 &pcfg_pull_none_8ma>,	/* LCDC_D21 */
+				<3 RK_PD2 1 &pcfg_pull_none_8ma>,	/* LCDC_D22 */
+				<3 RK_PD3 1 &pcfg_pull_none_8ma>;	/* LCDC_D23 */
+		};
+
+		lcdc_m1_sleep_pins: lcdc-m1-sleep-pins {
+			rockchip,pins =
+				<3 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>,	/* LCDC_DCLK */
+				<3 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none>,	/* LCDC_D0 */
+				<3 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>,	/* LCDC_D2 */
+				<3 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>,	/* LCDC_D6 */
+				<3 RK_PB3 RK_FUNC_GPIO &pcfg_pull_none>,	/* LCDC_D7 */
+				<3 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>,	/* LCDC_D9 */
+				<3 RK_PC0 RK_FUNC_GPIO &pcfg_pull_none>,	/* LCDC_D12 */
+				<3 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>,	/* LCDC_D13 */
+				<3 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none>,	/* LCDC_D14 */
+				<3 RK_PC3 RK_FUNC_GPIO &pcfg_pull_none>,	/* LCDC_D15 */
+				<3 RK_PC4 RK_FUNC_GPIO &pcfg_pull_none>,	/* LCDC_D16 */
+				<3 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>,	/* LCDC_D17 */
+				<3 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none>,	/* LCDC_D18 */
+				<3 RK_PC7 RK_FUNC_GPIO &pcfg_pull_none>,	/* LCDC_D19 */
+				<3 RK_PD0 RK_FUNC_GPIO &pcfg_pull_none>,	/* LCDC_D20 */
+				<3 RK_PD1 RK_FUNC_GPIO &pcfg_pull_none>,	/* LCDC_D21 */
+				<3 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none>,	/* LCDC_D22 */
+				<3 RK_PD3 RK_FUNC_GPIO &pcfg_pull_none>;	/* LCDC_D23 */
+		};
+	};
+};

commit 017f095a482b6e2f2c56d8bab443d445bcdb4c40
Author: Binyuan Lan <lby@rock-chips.com>
Date:   Thu Dec 2 21:24:41 2021 +0800

    amr64: dts: rockchip: px30-evb-ddr3-v10: add test power
    
    Signed-off-by: Binyuan Lan <lby@rock-chips.com>
    Change-Id: I60106f13af425e9578703ec667cf4657deb8a5c7

diff --git a/arch/arm64/boot/dts/rockchip/px30-evb-ddr3-v10.dtsi b/arch/arm64/boot/dts/rockchip/px30-evb-ddr3-v10.dtsi
index 964d76bbf2cf..db619ae1731f 100644
--- a/arch/arm64/boot/dts/rockchip/px30-evb-ddr3-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/px30-evb-ddr3-v10.dtsi
@@ -144,6 +144,10 @@
 		reset-gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_LOW>; /* GPIO3_A4 */
 	};
 
+	test-power {
+		status = "okay";
+	};
+
 	vcc_phy: vcc-phy-regulator {
 		compatible = "regulator-fixed";
 		regulator-name = "vcc_phy";

commit d8aa9b09de98e115740d9a7b8eba6a777edd541b
Author: Nick Desaulniers <ndesaulniers@google.com>
Date:   Thu Dec 2 13:58:37 2021 -0800

    BACKPORT: arm64: vdso32: suppress error message for 'make mrproper'
    
    commit 14831fad73f5ac30ac61760487d95a538e6ab3cb upstream.
    
    When running the following command without arm-linux-gnueabi-gcc in
    one's $PATH, the following warning is observed:
    
    $ ARCH=arm64 CROSS_COMPILE_COMPAT=arm-linux-gnueabi- make -j72 LLVM=1 mrproper
    make[1]: arm-linux-gnueabi-gcc: No such file or directory
    
    This is because KCONFIG is not run for mrproper, so CONFIG_CC_IS_CLANG
    is not set, and we end up eagerly evaluating various variables that try
    to invoke CC_COMPAT.
    
    This is a similar problem to what was observed in
    commit dc960bfeedb0 ("h8300: suppress error messages for 'make clean'")
    
    Reported-by: Lucas Henneman <henneman@google.com>
    Suggested-by: Masahiro Yamada <masahiroy@kernel.org>
    [nd: adjusted context due to missing e35123d83ee3]
    [nd: backported because Android backported compat vdso support to 4.19.y]
    Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
    Reviewed-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
    Reviewed-by: Nathan Chancellor <nathan@kernel.org>
    Tested-by: Nathan Chancellor <nathan@kernel.org>
    Link: https://lore.kernel.org/r/20211019223646.1146945-4-ndesaulniers@google.com
    Signed-off-by: Will Deacon <will@kernel.org>
    Bug: 202827173
    Change-Id: Ic1ad9eb2871fd4f6c4f0e27df673df5cb4012df9

diff --git a/arch/arm64/kernel/vdso32/Makefile b/arch/arm64/kernel/vdso32/Makefile
index a8730723203b..ea0b7581ee51 100644
--- a/arch/arm64/kernel/vdso32/Makefile
+++ b/arch/arm64/kernel/vdso32/Makefile
@@ -40,7 +40,8 @@ cc32-as-instr = $(call try-run,\
 # As a result we set our own flags here.
 
 # KBUILD_CPPFLAGS and NOSTDINC_FLAGS from top-level Makefile
-VDSO_CPPFLAGS := -D__KERNEL__ -nostdinc -isystem $(shell $(CC_COMPAT) -print-file-name=include)
+VDSO_CPPFLAGS := -D__KERNEL__ -nostdinc
+VDSO_CPPFLAGS += -isystem $(shell $(CC_COMPAT) -print-file-name=include 2>/dev/null)
 VDSO_CPPFLAGS += $(LINUXINCLUDE)
 
 # Common C and assembly flags

commit 35f020b0e85c04048bdc403f2feea6d39f12c658
Author: William Wu <william.wu@rock-chips.com>
Date:   Thu Dec 2 18:09:39 2021 +0800

    usb: gadget: u_audio: improve uac compatibility
    
    Some PC USB Hosts (e.g Dell laptop) fail to send
    SetInterface(AltSet=0) to stop capture/playback
    when PC enter suspend or play YouTube Video.
    
    To be compatible with these PC, add this patch to
    stop capture/playback prior to start again if the
    stream_state is true.
    
    Signed-off-by: William Wu <william.wu@rock-chips.com>
    Change-Id: Iced57de39b6b88a7c987897dcb123cf8d7cf6473

diff --git a/drivers/usb/gadget/function/u_audio.c b/drivers/usb/gadget/function/u_audio.c
index ba3f1b9fd6c8..347633399359 100644
--- a/drivers/usb/gadget/function/u_audio.c
+++ b/drivers/usb/gadget/function/u_audio.c
@@ -532,6 +532,15 @@ int u_audio_start_capture(struct g_audio *audio_dev)
 	struct uac_params *params = &audio_dev->params;
 	int req_len, i;
 
+	/*
+	 * For better compatibility on some PC Hosts which
+	 * failed to send SetInterface(AltSet=0) to stop
+	 * capture last time. It needs to stop capture
+	 * prior to start capture next time.
+	 */
+	if (audio_dev->stream_state[STATE_OUT])
+		u_audio_stop_capture(audio_dev);
+
 	audio_dev->usb_state[SET_INTERFACE_OUT] = true;
 	audio_dev->stream_state[STATE_OUT] = true;
 	schedule_work(&audio_dev->work);
@@ -591,6 +600,15 @@ int u_audio_start_playback(struct g_audio *audio_dev)
 	struct uac_params *params = &audio_dev->params;
 	int req_len, i;
 
+	/*
+	 * For better compatibility on some PC Hosts which
+	 * failed to send SetInterface(AltSet=0) to stop
+	 * playback last time. It needs to stop playback
+	 * prior to start playback next time.
+	 */
+	if (audio_dev->stream_state[STATE_IN])
+		u_audio_stop_playback(audio_dev);
+
 	audio_dev->usb_state[SET_INTERFACE_IN] = true;
 	audio_dev->stream_state[STATE_IN] = true;
 	schedule_work(&audio_dev->work);

commit c8fea9b9399b2cb046cf2d158597ec04a4d37419
Merge: 3bf28c82aea7 24e6b4723c20
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Wed Dec 1 09:42:16 2021 +0100

    Merge 4.19.219 into android-4.19-stable
    
    Changes in 4.19.219
            USB: serial: option: add Telit LE910S1 0x9200 composition
            USB: serial: option: add Fibocom FM101-GL variants
            usb: dwc2: hcd_queue: Fix use of floating point literal
            usb: hub: Fix usb enumeration issue due to address0 race
            usb: hub: Fix locking issues with address0_mutex
            binder: fix test regression due to sender_euid change
            ALSA: ctxfi: Fix out-of-range access
            media: cec: copy sequence field for the reply
            HID: wacom: Use "Confidence" flag to prevent reporting invalid contacts
            staging: rtl8192e: Fix use after free in _rtl92e_pci_disconnect()
            fuse: fix page stealing
            xen: don't continue xenstore initialization in case of errors
            xen: detect uninitialized xenbus in xenbus_init
            tracing: Fix pid filtering when triggers are attached
            xtensa: use CONFIG_USE_OF instead of CONFIG_OF
            proc/vmcore: fix clearing user buffer by properly using clear_user()
            PCI: aardvark: Fix a leaked reference by adding missing of_node_put()
            PCI: aardvark: Wait for endpoint to be ready before training link
            PCI: aardvark: Train link immediately after enabling training
            PCI: aardvark: Improve link training
            PCI: aardvark: Issue PERST via GPIO
            PCI: aardvark: Replace custom macros by standard linux/pci_regs.h macros
            PCI: aardvark: Indicate error in 'val' when config read fails
            PCI: aardvark: Don't touch PCIe registers if no card connected
            PCI: aardvark: Fix compilation on s390
            PCI: aardvark: Move PCIe reset card code to advk_pcie_train_link()
            PCI: aardvark: Update comment about disabling link training
            PCI: aardvark: Configure PCIe resources from 'ranges' DT property
            PCI: aardvark: Fix PCIe Max Payload Size setting
            PCI: aardvark: Fix link training
            PCI: aardvark: Fix checking for link up via LTSSM state
            pinctrl: armada-37xx: Correct mpp definitions
            pinctrl: armada-37xx: add missing pin: PCIe1 Wakeup
            pinctrl: armada-37xx: Correct PWM pins definitions
            arm64: dts: marvell: armada-37xx: declare PCIe reset pin
            arm64: dts: marvell: armada-37xx: Set pcie_reset_pin to gpio function
            netfilter: ipvs: Fix reuse connection if RS weight is 0
            ARM: dts: BCM5301X: Fix I2C controller interrupt
            ARM: dts: BCM5301X: Add interrupt properties to GPIO node
            ASoC: qdsp6: q6routing: Conditionally reset FrontEnd Mixer
            ASoC: topology: Add missing rwsem around snd_ctl_remove() calls
            net: ieee802154: handle iftypes as u32
            firmware: arm_scmi: pm: Propagate return value to caller
            NFSv42: Don't fail clone() unless the OP_CLONE operation failed
            ARM: socfpga: Fix crash with CONFIG_FORTIRY_SOURCE
            scsi: mpt3sas: Fix kernel panic during drive powercycle test
            drm/vc4: fix error code in vc4_create_object()
            ipv6: fix typos in __ip6_finish_output()
            net/smc: Ensure the active closing peer first closes clcsock
            PM: hibernate: use correct mode for swsusp_close()
            tcp_cubic: fix spurious Hystart ACK train detections for not-cwnd-limited flows
            MIPS: use 3-level pgtable for 64KB page size on MIPS_VA_BITS_48
            net/smc: Don't call clcsock shutdown twice when smc shutdown
            net: hns3: fix VF RSS failed problem after PF enable multi-TCs
            vhost/vsock: fix incorrect used length reported to the guest
            tracing: Check pid filtering when creating events
            s390/mm: validate VMA in PGSTE manipulation functions
            hugetlbfs: flush TLBs correctly after huge_pmd_unshare
            NFC: add NCI_UNREG flag to eliminate the race
            fuse: release pipe buf after last use
            xen: sync include/xen/interface/io/ring.h with Xen's newest version
            xen/blkfront: read response from backend only once
            xen/blkfront: don't take local copy of a request from the ring page
            xen/blkfront: don't trust the backend response data blindly
            xen/netfront: read response from backend only once
            xen/netfront: don't read data from request on the ring page
            xen/netfront: disentangle tx_skb_freelist
            xen/netfront: don't trust the backend response data blindly
            tty: hvc: replace BUG_ON() with negative return value
            Linux 4.19.219
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I08d2ac89cddf44071c644a999ca39fc5230b1b21

commit 24e6b4723c20c874840781dcd31e681502b8adca
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Wed Dec 1 09:27:44 2021 +0100

    Linux 4.19.219
    
    Link: https://lore.kernel.org/r/20211129181703.670197996@linuxfoundation.org
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Hulk Robot <hulkrobot@huawei.com>
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index 455ba411998f..310cc8508b9e 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 218
+SUBLEVEL = 219
 EXTRAVERSION =
 NAME = "People's Front"
 

commit bdef6fc5e725663f471ec1ff4c0350dae7b794c7
Author: Juergen Gross <jgross@suse.com>
Date:   Mon Nov 29 10:45:11 2021 +0100

    tty: hvc: replace BUG_ON() with negative return value
    
    commit e679004dec37566f658a255157d3aed9d762a2b7 upstream.
    
    Xen frontends shouldn't BUG() in case of illegal data received from
    their backends. So replace the BUG_ON()s when reading illegal data from
    the ring page with negative return values.
    
    Reviewed-by: Jan Beulich <jbeulich@suse.com>
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Link: https://lore.kernel.org/r/20210707091045.460-1-jgross@suse.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/tty/hvc/hvc_xen.c b/drivers/tty/hvc/hvc_xen.c
index dc43fa96c3de..7874aaf30ef4 100644
--- a/drivers/tty/hvc/hvc_xen.c
+++ b/drivers/tty/hvc/hvc_xen.c
@@ -86,7 +86,11 @@ static int __write_console(struct xencons_info *xencons,
 	cons = intf->out_cons;
 	prod = intf->out_prod;
 	mb();			/* update queue values before going on */
-	BUG_ON((prod - cons) > sizeof(intf->out));
+
+	if ((prod - cons) > sizeof(intf->out)) {
+		pr_err_once("xencons: Illegal ring page indices");
+		return -EINVAL;
+	}
 
 	while ((sent < len) && ((prod - cons) < sizeof(intf->out)))
 		intf->out[MASK_XENCONS_IDX(prod++, intf->out)] = data[sent++];
@@ -114,7 +118,10 @@ static int domU_write_console(uint32_t vtermno, const char *data, int len)
 	 */
 	while (len) {
 		int sent = __write_console(cons, data, len);
-		
+
+		if (sent < 0)
+			return sent;
+
 		data += sent;
 		len -= sent;
 
@@ -138,7 +145,11 @@ static int domU_read_console(uint32_t vtermno, char *buf, int len)
 	cons = intf->in_cons;
 	prod = intf->in_prod;
 	mb();			/* get pointers before reading ring */
-	BUG_ON((prod - cons) > sizeof(intf->in));
+
+	if ((prod - cons) > sizeof(intf->in)) {
+		pr_err_once("xencons: Illegal ring page indices");
+		return -EINVAL;
+	}
 
 	while (cons != prod && recv < len)
 		buf[recv++] = intf->in[MASK_XENCONS_IDX(cons++, intf->in)];

commit e4e01b0e4b7fca40586639647f83eaa21a0a8203
Author: Juergen Gross <jgross@suse.com>
Date:   Mon Nov 29 10:44:30 2021 +0100

    xen/netfront: don't trust the backend response data blindly
    
    commit a884daa61a7d91650987e855464526aef219590f upstream.
    
    Today netfront will trust the backend to send only sane response data.
    In order to avoid privilege escalations or crashes in case of malicious
    backends verify the data to be within expected limits. Especially make
    sure that the response always references an outstanding request.
    
    Note that only the tx queue needs special id handling, as for the rx
    queue the id is equal to the index in the ring page.
    
    Introduce a new indicator for the device whether it is broken and let
    the device stop working when it is set. Set this indicator in case the
    backend sets any weird data.
    
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Reviewed-by: Jan Beulich <jbeulich@suse.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index c1b8e7b59059..434a009c52d9 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -126,10 +126,12 @@ struct netfront_queue {
 	struct sk_buff *tx_skbs[NET_TX_RING_SIZE];
 	unsigned short tx_link[NET_TX_RING_SIZE];
 #define TX_LINK_NONE 0xffff
+#define TX_PENDING   0xfffe
 	grant_ref_t gref_tx_head;
 	grant_ref_t grant_tx_ref[NET_TX_RING_SIZE];
 	struct page *grant_tx_page[NET_TX_RING_SIZE];
 	unsigned tx_skb_freelist;
+	unsigned int tx_pend_queue;
 
 	spinlock_t   rx_lock ____cacheline_aligned_in_smp;
 	struct xen_netif_rx_front_ring rx;
@@ -155,6 +157,9 @@ struct netfront_info {
 	struct netfront_stats __percpu *rx_stats;
 	struct netfront_stats __percpu *tx_stats;
 
+	/* Is device behaving sane? */
+	bool broken;
+
 	atomic_t rx_gso_checksum_fixup;
 };
 
@@ -339,7 +344,7 @@ static int xennet_open(struct net_device *dev)
 	unsigned int i = 0;
 	struct netfront_queue *queue = NULL;
 
-	if (!np->queues)
+	if (!np->queues || np->broken)
 		return -ENODEV;
 
 	for (i = 0; i < num_queues; ++i) {
@@ -367,11 +372,17 @@ static void xennet_tx_buf_gc(struct netfront_queue *queue)
 	unsigned short id;
 	struct sk_buff *skb;
 	bool more_to_do;
+	const struct device *dev = &queue->info->netdev->dev;
 
 	BUG_ON(!netif_carrier_ok(queue->info->netdev));
 
 	do {
 		prod = queue->tx.sring->rsp_prod;
+		if (RING_RESPONSE_PROD_OVERFLOW(&queue->tx, prod)) {
+			dev_alert(dev, "Illegal number of responses %u\n",
+				  prod - queue->tx.rsp_cons);
+			goto err;
+		}
 		rmb(); /* Ensure we see responses up to 'rp'. */
 
 		for (cons = queue->tx.rsp_cons; cons != prod; cons++) {
@@ -381,14 +392,27 @@ static void xennet_tx_buf_gc(struct netfront_queue *queue)
 			if (txrsp.status == XEN_NETIF_RSP_NULL)
 				continue;
 
-			id  = txrsp.id;
+			id = txrsp.id;
+			if (id >= RING_SIZE(&queue->tx)) {
+				dev_alert(dev,
+					  "Response has incorrect id (%u)\n",
+					  id);
+				goto err;
+			}
+			if (queue->tx_link[id] != TX_PENDING) {
+				dev_alert(dev,
+					  "Response for inactive request\n");
+				goto err;
+			}
+
+			queue->tx_link[id] = TX_LINK_NONE;
 			skb = queue->tx_skbs[id];
 			queue->tx_skbs[id] = NULL;
 			if (unlikely(gnttab_query_foreign_access(
 				queue->grant_tx_ref[id]) != 0)) {
-				pr_alert("%s: warning -- grant still in use by backend domain\n",
-					 __func__);
-				BUG();
+				dev_alert(dev,
+					  "Grant still in use by backend domain\n");
+				goto err;
 			}
 			gnttab_end_foreign_access_ref(
 				queue->grant_tx_ref[id], GNTMAP_readonly);
@@ -406,6 +430,12 @@ static void xennet_tx_buf_gc(struct netfront_queue *queue)
 	} while (more_to_do);
 
 	xennet_maybe_wake_tx(queue);
+
+	return;
+
+ err:
+	queue->info->broken = true;
+	dev_alert(dev, "Disabled for further use\n");
 }
 
 struct xennet_gnttab_make_txreq {
@@ -449,6 +479,12 @@ static void xennet_tx_setup_grant(unsigned long gfn, unsigned int offset,
 
 	*tx = info->tx_local;
 
+	/*
+	 * Put the request in the pending queue, it will be set to be pending
+	 * when the producer index is about to be raised.
+	 */
+	add_id_to_list(&queue->tx_pend_queue, queue->tx_link, id);
+
 	info->tx = tx;
 	info->size += info->tx_local.size;
 }
@@ -542,6 +578,15 @@ static u16 xennet_select_queue(struct net_device *dev, struct sk_buff *skb,
 	return queue_idx;
 }
 
+static void xennet_mark_tx_pending(struct netfront_queue *queue)
+{
+	unsigned int i;
+
+	while ((i = get_id_from_list(&queue->tx_pend_queue, queue->tx_link)) !=
+		TX_LINK_NONE)
+		queue->tx_link[i] = TX_PENDING;
+}
+
 #define MAX_XEN_SKB_FRAGS (65536 / XEN_PAGE_SIZE + 1)
 
 static netdev_tx_t xennet_start_xmit(struct sk_buff *skb, struct net_device *dev)
@@ -565,6 +610,8 @@ static netdev_tx_t xennet_start_xmit(struct sk_buff *skb, struct net_device *dev
 	/* Drop the packet if no queues are set up */
 	if (num_queues < 1)
 		goto drop;
+	if (unlikely(np->broken))
+		goto drop;
 	/* Determine which queue to transmit this SKB on */
 	queue_index = skb_get_queue_mapping(skb);
 	queue = &np->queues[queue_index];
@@ -668,6 +715,8 @@ static netdev_tx_t xennet_start_xmit(struct sk_buff *skb, struct net_device *dev
 	/* First request has the packet length. */
 	first_tx->size = skb->len;
 
+	xennet_mark_tx_pending(queue);
+
 	RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&queue->tx, notify);
 	if (notify)
 		notify_remote_via_irq(queue->tx_irq);
@@ -992,6 +1041,13 @@ static int xennet_poll(struct napi_struct *napi, int budget)
 	skb_queue_head_init(&tmpq);
 
 	rp = queue->rx.sring->rsp_prod;
+	if (RING_RESPONSE_PROD_OVERFLOW(&queue->rx, rp)) {
+		dev_alert(&dev->dev, "Illegal number of responses %u\n",
+			  rp - queue->rx.rsp_cons);
+		queue->info->broken = true;
+		spin_unlock(&queue->rx_lock);
+		return 0;
+	}
 	rmb(); /* Ensure we see queued responses up to 'rp'. */
 
 	i = queue->rx.rsp_cons;
@@ -1210,6 +1266,9 @@ static irqreturn_t xennet_tx_interrupt(int irq, void *dev_id)
 	struct netfront_queue *queue = dev_id;
 	unsigned long flags;
 
+	if (queue->info->broken)
+		return IRQ_HANDLED;
+
 	spin_lock_irqsave(&queue->tx_lock, flags);
 	xennet_tx_buf_gc(queue);
 	spin_unlock_irqrestore(&queue->tx_lock, flags);
@@ -1222,6 +1281,9 @@ static irqreturn_t xennet_rx_interrupt(int irq, void *dev_id)
 	struct netfront_queue *queue = dev_id;
 	struct net_device *dev = queue->info->netdev;
 
+	if (queue->info->broken)
+		return IRQ_HANDLED;
+
 	if (likely(netif_carrier_ok(dev) &&
 		   RING_HAS_UNCONSUMED_RESPONSES(&queue->rx)))
 		napi_schedule(&queue->napi);
@@ -1243,6 +1305,10 @@ static void xennet_poll_controller(struct net_device *dev)
 	struct netfront_info *info = netdev_priv(dev);
 	unsigned int num_queues = dev->real_num_tx_queues;
 	unsigned int i;
+
+	if (info->broken)
+		return;
+
 	for (i = 0; i < num_queues; ++i)
 		xennet_interrupt(0, &info->queues[i]);
 }
@@ -1614,6 +1680,7 @@ static int xennet_init_queue(struct netfront_queue *queue)
 
 	/* Initialise tx_skb_freelist as a free chain containing every entry. */
 	queue->tx_skb_freelist = 0;
+	queue->tx_pend_queue = TX_LINK_NONE;
 	for (i = 0; i < NET_TX_RING_SIZE; i++) {
 		queue->tx_link[i] = i + 1;
 		queue->grant_tx_ref[i] = GRANT_INVALID_REF;
@@ -1824,6 +1891,9 @@ static int talk_to_netback(struct xenbus_device *dev,
 	if (info->queues)
 		xennet_destroy_queues(info);
 
+	/* For the case of a reconnect reset the "broken" indicator. */
+	info->broken = false;
+
 	err = xennet_create_queues(info, &num_queues);
 	if (err < 0) {
 		xenbus_dev_fatal(dev, err, "creating queues");

commit e52c0efbd23ca50e4afa76e6ec3c8c83b032c823
Author: Juergen Gross <jgross@suse.com>
Date:   Mon Nov 29 10:43:35 2021 +0100

    xen/netfront: disentangle tx_skb_freelist
    
    commit 21631d2d741a64a073e167c27769e73bc7844a2f upstream.
    
    The tx_skb_freelist elements are in a single linked list with the
    request id used as link reference. The per element link field is in a
    union with the skb pointer of an in use request.
    
    Move the link reference out of the union in order to enable a later
    reuse of it for requests which need a populated skb pointer.
    
    Rename add_id_to_freelist() and get_id_from_freelist() to
    add_id_to_list() and get_id_from_list() in order to prepare using
    those for other lists as well. Define ~0 as value to indicate the end
    of a list and place that value into the link for a request not being
    on the list.
    
    When freeing a skb zero the skb pointer in the request. Use a NULL
    value of the skb pointer instead of skb_entry_is_link() for deciding
    whether a request has a skb linked to it.
    
    Remove skb_entry_set_link() and open code it instead as it is really
    trivial now.
    
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index 8f2fdfb0192c..c1b8e7b59059 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -121,17 +121,11 @@ struct netfront_queue {
 
 	/*
 	 * {tx,rx}_skbs store outstanding skbuffs. Free tx_skb entries
-	 * are linked from tx_skb_freelist through skb_entry.link.
-	 *
-	 *  NB. Freelist index entries are always going to be less than
-	 *  PAGE_OFFSET, whereas pointers to skbs will always be equal or
-	 *  greater than PAGE_OFFSET: we use this property to distinguish
-	 *  them.
+	 * are linked from tx_skb_freelist through tx_link.
 	 */
-	union skb_entry {
-		struct sk_buff *skb;
-		unsigned long link;
-	} tx_skbs[NET_TX_RING_SIZE];
+	struct sk_buff *tx_skbs[NET_TX_RING_SIZE];
+	unsigned short tx_link[NET_TX_RING_SIZE];
+#define TX_LINK_NONE 0xffff
 	grant_ref_t gref_tx_head;
 	grant_ref_t grant_tx_ref[NET_TX_RING_SIZE];
 	struct page *grant_tx_page[NET_TX_RING_SIZE];
@@ -169,33 +163,25 @@ struct netfront_rx_info {
 	struct xen_netif_extra_info extras[XEN_NETIF_EXTRA_TYPE_MAX - 1];
 };
 
-static void skb_entry_set_link(union skb_entry *list, unsigned short id)
-{
-	list->link = id;
-}
-
-static int skb_entry_is_link(const union skb_entry *list)
-{
-	BUILD_BUG_ON(sizeof(list->skb) != sizeof(list->link));
-	return (unsigned long)list->skb < PAGE_OFFSET;
-}
-
 /*
  * Access macros for acquiring freeing slots in tx_skbs[].
  */
 
-static void add_id_to_freelist(unsigned *head, union skb_entry *list,
-			       unsigned short id)
+static void add_id_to_list(unsigned *head, unsigned short *list,
+			   unsigned short id)
 {
-	skb_entry_set_link(&list[id], *head);
+	list[id] = *head;
 	*head = id;
 }
 
-static unsigned short get_id_from_freelist(unsigned *head,
-					   union skb_entry *list)
+static unsigned short get_id_from_list(unsigned *head, unsigned short *list)
 {
 	unsigned int id = *head;
-	*head = list[id].link;
+
+	if (id != TX_LINK_NONE) {
+		*head = list[id];
+		list[id] = TX_LINK_NONE;
+	}
 	return id;
 }
 
@@ -396,7 +382,8 @@ static void xennet_tx_buf_gc(struct netfront_queue *queue)
 				continue;
 
 			id  = txrsp.id;
-			skb = queue->tx_skbs[id].skb;
+			skb = queue->tx_skbs[id];
+			queue->tx_skbs[id] = NULL;
 			if (unlikely(gnttab_query_foreign_access(
 				queue->grant_tx_ref[id]) != 0)) {
 				pr_alert("%s: warning -- grant still in use by backend domain\n",
@@ -409,7 +396,7 @@ static void xennet_tx_buf_gc(struct netfront_queue *queue)
 				&queue->gref_tx_head, queue->grant_tx_ref[id]);
 			queue->grant_tx_ref[id] = GRANT_INVALID_REF;
 			queue->grant_tx_page[id] = NULL;
-			add_id_to_freelist(&queue->tx_skb_freelist, queue->tx_skbs, id);
+			add_id_to_list(&queue->tx_skb_freelist, queue->tx_link, id);
 			dev_kfree_skb_irq(skb);
 		}
 
@@ -442,7 +429,7 @@ static void xennet_tx_setup_grant(unsigned long gfn, unsigned int offset,
 	struct netfront_queue *queue = info->queue;
 	struct sk_buff *skb = info->skb;
 
-	id = get_id_from_freelist(&queue->tx_skb_freelist, queue->tx_skbs);
+	id = get_id_from_list(&queue->tx_skb_freelist, queue->tx_link);
 	tx = RING_GET_REQUEST(&queue->tx, queue->tx.req_prod_pvt++);
 	ref = gnttab_claim_grant_reference(&queue->gref_tx_head);
 	WARN_ON_ONCE(IS_ERR_VALUE((unsigned long)(int)ref));
@@ -450,7 +437,7 @@ static void xennet_tx_setup_grant(unsigned long gfn, unsigned int offset,
 	gnttab_grant_foreign_access_ref(ref, queue->info->xbdev->otherend_id,
 					gfn, GNTMAP_readonly);
 
-	queue->tx_skbs[id].skb = skb;
+	queue->tx_skbs[id] = skb;
 	queue->grant_tx_page[id] = page;
 	queue->grant_tx_ref[id] = ref;
 
@@ -1132,17 +1119,18 @@ static void xennet_release_tx_bufs(struct netfront_queue *queue)
 
 	for (i = 0; i < NET_TX_RING_SIZE; i++) {
 		/* Skip over entries which are actually freelist references */
-		if (skb_entry_is_link(&queue->tx_skbs[i]))
+		if (!queue->tx_skbs[i])
 			continue;
 
-		skb = queue->tx_skbs[i].skb;
+		skb = queue->tx_skbs[i];
+		queue->tx_skbs[i] = NULL;
 		get_page(queue->grant_tx_page[i]);
 		gnttab_end_foreign_access(queue->grant_tx_ref[i],
 					  GNTMAP_readonly,
 					  (unsigned long)page_address(queue->grant_tx_page[i]));
 		queue->grant_tx_page[i] = NULL;
 		queue->grant_tx_ref[i] = GRANT_INVALID_REF;
-		add_id_to_freelist(&queue->tx_skb_freelist, queue->tx_skbs, i);
+		add_id_to_list(&queue->tx_skb_freelist, queue->tx_link, i);
 		dev_kfree_skb_irq(skb);
 	}
 }
@@ -1624,13 +1612,14 @@ static int xennet_init_queue(struct netfront_queue *queue)
 	snprintf(queue->name, sizeof(queue->name), "vif%s-q%u",
 		 devid, queue->id);
 
-	/* Initialise tx_skbs as a free chain containing every entry. */
+	/* Initialise tx_skb_freelist as a free chain containing every entry. */
 	queue->tx_skb_freelist = 0;
 	for (i = 0; i < NET_TX_RING_SIZE; i++) {
-		skb_entry_set_link(&queue->tx_skbs[i], i+1);
+		queue->tx_link[i] = i + 1;
 		queue->grant_tx_ref[i] = GRANT_INVALID_REF;
 		queue->grant_tx_page[i] = NULL;
 	}
+	queue->tx_link[NET_TX_RING_SIZE - 1] = TX_LINK_NONE;
 
 	/* Clear out rx_skbs */
 	for (i = 0; i < NET_RX_RING_SIZE; i++) {

commit 26509bb5dd2fc9177fe612a778cc4b8f305ea89f
Author: Juergen Gross <jgross@suse.com>
Date:   Mon Nov 29 10:38:28 2021 +0100

    xen/netfront: don't read data from request on the ring page
    
    commit 162081ec33c2686afa29d91bf8d302824aa846c7 upstream.
    
    In order to avoid a malicious backend being able to influence the local
    processing of a request build the request locally first and then copy
    it to the ring page. Any reading from the request influencing the
    processing in the frontend needs to be done on the local instance.
    
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Reviewed-by: Jan Beulich <jbeulich@suse.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index 95d8cddb995d..8f2fdfb0192c 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -425,7 +425,8 @@ struct xennet_gnttab_make_txreq {
 	struct netfront_queue *queue;
 	struct sk_buff *skb;
 	struct page *page;
-	struct xen_netif_tx_request *tx; /* Last request */
+	struct xen_netif_tx_request *tx;      /* Last request on ring page */
+	struct xen_netif_tx_request tx_local; /* Last request local copy*/
 	unsigned int size;
 };
 
@@ -453,30 +454,27 @@ static void xennet_tx_setup_grant(unsigned long gfn, unsigned int offset,
 	queue->grant_tx_page[id] = page;
 	queue->grant_tx_ref[id] = ref;
 
-	tx->id = id;
-	tx->gref = ref;
-	tx->offset = offset;
-	tx->size = len;
-	tx->flags = 0;
+	info->tx_local.id = id;
+	info->tx_local.gref = ref;
+	info->tx_local.offset = offset;
+	info->tx_local.size = len;
+	info->tx_local.flags = 0;
+
+	*tx = info->tx_local;
 
 	info->tx = tx;
-	info->size += tx->size;
+	info->size += info->tx_local.size;
 }
 
 static struct xen_netif_tx_request *xennet_make_first_txreq(
-	struct netfront_queue *queue, struct sk_buff *skb,
-	struct page *page, unsigned int offset, unsigned int len)
+	struct xennet_gnttab_make_txreq *info,
+	unsigned int offset, unsigned int len)
 {
-	struct xennet_gnttab_make_txreq info = {
-		.queue = queue,
-		.skb = skb,
-		.page = page,
-		.size = 0,
-	};
+	info->size = 0;
 
-	gnttab_for_one_grant(page, offset, len, xennet_tx_setup_grant, &info);
+	gnttab_for_one_grant(info->page, offset, len, xennet_tx_setup_grant, info);
 
-	return info.tx;
+	return info->tx;
 }
 
 static void xennet_make_one_txreq(unsigned long gfn, unsigned int offset,
@@ -489,35 +487,27 @@ static void xennet_make_one_txreq(unsigned long gfn, unsigned int offset,
 	xennet_tx_setup_grant(gfn, offset, len, data);
 }
 
-static struct xen_netif_tx_request *xennet_make_txreqs(
-	struct netfront_queue *queue, struct xen_netif_tx_request *tx,
-	struct sk_buff *skb, struct page *page,
+static void xennet_make_txreqs(
+	struct xennet_gnttab_make_txreq *info,
+	struct page *page,
 	unsigned int offset, unsigned int len)
 {
-	struct xennet_gnttab_make_txreq info = {
-		.queue = queue,
-		.skb = skb,
-		.tx = tx,
-	};
-
 	/* Skip unused frames from start of page */
 	page += offset >> PAGE_SHIFT;
 	offset &= ~PAGE_MASK;
 
 	while (len) {
-		info.page = page;
-		info.size = 0;
+		info->page = page;
+		info->size = 0;
 
 		gnttab_foreach_grant_in_range(page, offset, len,
 					      xennet_make_one_txreq,
-					      &info);
+					      info);
 
 		page++;
 		offset = 0;
-		len -= info.size;
+		len -= info->size;
 	}
-
-	return info.tx;
 }
 
 /*
@@ -571,7 +561,7 @@ static netdev_tx_t xennet_start_xmit(struct sk_buff *skb, struct net_device *dev
 {
 	struct netfront_info *np = netdev_priv(dev);
 	struct netfront_stats *tx_stats = this_cpu_ptr(np->tx_stats);
-	struct xen_netif_tx_request *tx, *first_tx;
+	struct xen_netif_tx_request *first_tx;
 	unsigned int i;
 	int notify;
 	int slots;
@@ -580,6 +570,7 @@ static netdev_tx_t xennet_start_xmit(struct sk_buff *skb, struct net_device *dev
 	unsigned int len;
 	unsigned long flags;
 	struct netfront_queue *queue = NULL;
+	struct xennet_gnttab_make_txreq info = { };
 	unsigned int num_queues = dev->real_num_tx_queues;
 	u16 queue_index;
 	struct sk_buff *nskb;
@@ -637,21 +628,24 @@ static netdev_tx_t xennet_start_xmit(struct sk_buff *skb, struct net_device *dev
 	}
 
 	/* First request for the linear area. */
-	first_tx = tx = xennet_make_first_txreq(queue, skb,
-						page, offset, len);
-	offset += tx->size;
+	info.queue = queue;
+	info.skb = skb;
+	info.page = page;
+	first_tx = xennet_make_first_txreq(&info, offset, len);
+	offset += info.tx_local.size;
 	if (offset == PAGE_SIZE) {
 		page++;
 		offset = 0;
 	}
-	len -= tx->size;
+	len -= info.tx_local.size;
 
 	if (skb->ip_summed == CHECKSUM_PARTIAL)
 		/* local packet? */
-		tx->flags |= XEN_NETTXF_csum_blank | XEN_NETTXF_data_validated;
+		first_tx->flags |= XEN_NETTXF_csum_blank |
+				   XEN_NETTXF_data_validated;
 	else if (skb->ip_summed == CHECKSUM_UNNECESSARY)
 		/* remote but checksummed. */
-		tx->flags |= XEN_NETTXF_data_validated;
+		first_tx->flags |= XEN_NETTXF_data_validated;
 
 	/* Optional extra info after the first request. */
 	if (skb_shinfo(skb)->gso_size) {
@@ -660,7 +654,7 @@ static netdev_tx_t xennet_start_xmit(struct sk_buff *skb, struct net_device *dev
 		gso = (struct xen_netif_extra_info *)
 			RING_GET_REQUEST(&queue->tx, queue->tx.req_prod_pvt++);
 
-		tx->flags |= XEN_NETTXF_extra_info;
+		first_tx->flags |= XEN_NETTXF_extra_info;
 
 		gso->u.gso.size = skb_shinfo(skb)->gso_size;
 		gso->u.gso.type = (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) ?
@@ -674,13 +668,13 @@ static netdev_tx_t xennet_start_xmit(struct sk_buff *skb, struct net_device *dev
 	}
 
 	/* Requests for the rest of the linear area. */
-	tx = xennet_make_txreqs(queue, tx, skb, page, offset, len);
+	xennet_make_txreqs(&info, page, offset, len);
 
 	/* Requests for all the frags. */
 	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
 		skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
-		tx = xennet_make_txreqs(queue, tx, skb,
-					skb_frag_page(frag), frag->page_offset,
+		xennet_make_txreqs(&info, skb_frag_page(frag),
+					frag->page_offset,
 					skb_frag_size(frag));
 	}
 

commit e7d1024f5b19e76ae7ff6789998cefb91c2b6a61
Author: Juergen Gross <jgross@suse.com>
Date:   Mon Nov 29 08:58:22 2021 +0100

    xen/netfront: read response from backend only once
    
    commit 8446066bf8c1f9f7b7412c43fbea0fb87464d75b upstream.
    
    In order to avoid problems in case the backend is modifying a response
    on the ring page while the frontend has already seen it, just read the
    response into a local buffer in one go and then operate on that buffer
    only.
    
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Reviewed-by: Jan Beulich <jbeulich@suse.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index a1c828ffac8b..95d8cddb995d 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -389,13 +389,13 @@ static void xennet_tx_buf_gc(struct netfront_queue *queue)
 		rmb(); /* Ensure we see responses up to 'rp'. */
 
 		for (cons = queue->tx.rsp_cons; cons != prod; cons++) {
-			struct xen_netif_tx_response *txrsp;
+			struct xen_netif_tx_response txrsp;
 
-			txrsp = RING_GET_RESPONSE(&queue->tx, cons);
-			if (txrsp->status == XEN_NETIF_RSP_NULL)
+			RING_COPY_RESPONSE(&queue->tx, cons, &txrsp);
+			if (txrsp.status == XEN_NETIF_RSP_NULL)
 				continue;
 
-			id  = txrsp->id;
+			id  = txrsp.id;
 			skb = queue->tx_skbs[id].skb;
 			if (unlikely(gnttab_query_foreign_access(
 				queue->grant_tx_ref[id]) != 0)) {
@@ -744,7 +744,7 @@ static int xennet_get_extras(struct netfront_queue *queue,
 			     RING_IDX rp)
 
 {
-	struct xen_netif_extra_info *extra;
+	struct xen_netif_extra_info extra;
 	struct device *dev = &queue->info->netdev->dev;
 	RING_IDX cons = queue->rx.rsp_cons;
 	int err = 0;
@@ -760,24 +760,22 @@ static int xennet_get_extras(struct netfront_queue *queue,
 			break;
 		}
 
-		extra = (struct xen_netif_extra_info *)
-			RING_GET_RESPONSE(&queue->rx, ++cons);
+		RING_COPY_RESPONSE(&queue->rx, ++cons, &extra);
 
-		if (unlikely(!extra->type ||
-			     extra->type >= XEN_NETIF_EXTRA_TYPE_MAX)) {
+		if (unlikely(!extra.type ||
+			     extra.type >= XEN_NETIF_EXTRA_TYPE_MAX)) {
 			if (net_ratelimit())
 				dev_warn(dev, "Invalid extra type: %d\n",
-					extra->type);
+					 extra.type);
 			err = -EINVAL;
 		} else {
-			memcpy(&extras[extra->type - 1], extra,
-			       sizeof(*extra));
+			extras[extra.type - 1] = extra;
 		}
 
 		skb = xennet_get_rx_skb(queue, cons);
 		ref = xennet_get_rx_ref(queue, cons);
 		xennet_move_rx_slot(queue, skb, ref);
-	} while (extra->flags & XEN_NETIF_EXTRA_FLAG_MORE);
+	} while (extra.flags & XEN_NETIF_EXTRA_FLAG_MORE);
 
 	queue->rx.rsp_cons = cons;
 	return err;
@@ -787,7 +785,7 @@ static int xennet_get_responses(struct netfront_queue *queue,
 				struct netfront_rx_info *rinfo, RING_IDX rp,
 				struct sk_buff_head *list)
 {
-	struct xen_netif_rx_response *rx = &rinfo->rx;
+	struct xen_netif_rx_response *rx = &rinfo->rx, rx_local;
 	struct xen_netif_extra_info *extras = rinfo->extras;
 	struct device *dev = &queue->info->netdev->dev;
 	RING_IDX cons = queue->rx.rsp_cons;
@@ -845,7 +843,8 @@ static int xennet_get_responses(struct netfront_queue *queue,
 			break;
 		}
 
-		rx = RING_GET_RESPONSE(&queue->rx, cons + slots);
+		RING_COPY_RESPONSE(&queue->rx, cons + slots, &rx_local);
+		rx = &rx_local;
 		skb = xennet_get_rx_skb(queue, cons + slots);
 		ref = xennet_get_rx_ref(queue, cons + slots);
 		slots++;
@@ -900,10 +899,11 @@ static int xennet_fill_frags(struct netfront_queue *queue,
 	struct sk_buff *nskb;
 
 	while ((nskb = __skb_dequeue(list))) {
-		struct xen_netif_rx_response *rx =
-			RING_GET_RESPONSE(&queue->rx, ++cons);
+		struct xen_netif_rx_response rx;
 		skb_frag_t *nfrag = &skb_shinfo(nskb)->frags[0];
 
+		RING_COPY_RESPONSE(&queue->rx, ++cons, &rx);
+
 		if (skb_shinfo(skb)->nr_frags == MAX_SKB_FRAGS) {
 			unsigned int pull_to = NETFRONT_SKB_CB(skb)->pull_to;
 
@@ -918,7 +918,7 @@ static int xennet_fill_frags(struct netfront_queue *queue,
 
 		skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
 				skb_frag_page(nfrag),
-				rx->offset, rx->status, PAGE_SIZE);
+				rx.offset, rx.status, PAGE_SIZE);
 
 		skb_shinfo(nskb)->nr_frags = 0;
 		kfree_skb(nskb);
@@ -1016,7 +1016,7 @@ static int xennet_poll(struct napi_struct *napi, int budget)
 	i = queue->rx.rsp_cons;
 	work_done = 0;
 	while ((i != rp) && (work_done < budget)) {
-		memcpy(rx, RING_GET_RESPONSE(&queue->rx, i), sizeof(*rx));
+		RING_COPY_RESPONSE(&queue->rx, i, rx);
 		memset(extras, 0, sizeof(rinfo.extras));
 
 		err = xennet_get_responses(queue, &rinfo, rp, &tmpq);

commit f89a05402f7403b2b9e5ef588a16c29f0d5c72a1
Author: Juergen Gross <jgross@suse.com>
Date:   Mon Nov 29 08:47:08 2021 +0100

    xen/blkfront: don't trust the backend response data blindly
    
    commit b94e4b147fd1992ad450e1fea1fdaa3738753373 upstream.
    
    Today blkfront will trust the backend to send only sane response data.
    In order to avoid privilege escalations or crashes in case of malicious
    backends verify the data to be within expected limits. Especially make
    sure that the response always references an outstanding request.
    
    Introduce a new state of the ring BLKIF_STATE_ERROR which will be
    switched to in case an inconsistency is being detected. Recovering from
    this state is possible only via removing and adding the virtual device
    again (e.g. via a suspend/resume cycle).
    
    Make all warning messages issued due to valid error responses rate
    limited in order to avoid message floods being triggered by a malicious
    backend.
    
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Reviewed-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Roger Pau Monné <roger.pau@citrix.com>
    Link: https://lore.kernel.org/r/20210730103854.12681-4-jgross@suse.com
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index f12632c9034c..bd756b294d30 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -80,6 +80,7 @@ enum blkif_state {
 	BLKIF_STATE_DISCONNECTED,
 	BLKIF_STATE_CONNECTED,
 	BLKIF_STATE_SUSPENDED,
+	BLKIF_STATE_ERROR,
 };
 
 struct grant {
@@ -89,6 +90,7 @@ struct grant {
 };
 
 enum blk_req_status {
+	REQ_PROCESSING,
 	REQ_WAITING,
 	REQ_DONE,
 	REQ_ERROR,
@@ -533,7 +535,7 @@ static unsigned long blkif_ring_get_request(struct blkfront_ring_info *rinfo,
 
 	id = get_id_from_freelist(rinfo);
 	rinfo->shadow[id].request = req;
-	rinfo->shadow[id].status = REQ_WAITING;
+	rinfo->shadow[id].status = REQ_PROCESSING;
 	rinfo->shadow[id].associated_id = NO_ASSOCIATED_ID;
 
 	rinfo->shadow[id].req.u.rw.id = id;
@@ -562,6 +564,7 @@ static int blkif_queue_discard_req(struct request *req, struct blkfront_ring_inf
 
 	/* Copy the request to the ring page. */
 	*final_ring_req = *ring_req;
+	rinfo->shadow[id].status = REQ_WAITING;
 
 	return 0;
 }
@@ -837,8 +840,11 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri
 
 	/* Copy request(s) to the ring page. */
 	*final_ring_req = *ring_req;
-	if (unlikely(require_extra_req))
+	rinfo->shadow[id].status = REQ_WAITING;
+	if (unlikely(require_extra_req)) {
 		*final_extra_ring_req = *extra_ring_req;
+		rinfo->shadow[extra_id].status = REQ_WAITING;
+	}
 
 	if (new_persistent_gnts)
 		gnttab_free_grant_references(setup.gref_head);
@@ -1412,8 +1418,8 @@ static enum blk_req_status blkif_rsp_to_req_status(int rsp)
 static int blkif_get_final_status(enum blk_req_status s1,
 				  enum blk_req_status s2)
 {
-	BUG_ON(s1 == REQ_WAITING);
-	BUG_ON(s2 == REQ_WAITING);
+	BUG_ON(s1 < REQ_DONE);
+	BUG_ON(s2 < REQ_DONE);
 
 	if (s1 == REQ_ERROR || s2 == REQ_ERROR)
 		return BLKIF_RSP_ERROR;
@@ -1446,7 +1452,7 @@ static bool blkif_completion(unsigned long *id,
 		s->status = blkif_rsp_to_req_status(bret->status);
 
 		/* Wait the second response if not yet here. */
-		if (s2->status == REQ_WAITING)
+		if (s2->status < REQ_DONE)
 			return false;
 
 		bret->status = blkif_get_final_status(s->status,
@@ -1565,11 +1571,17 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
 
 	spin_lock_irqsave(&rinfo->ring_lock, flags);
  again:
-	rp = rinfo->ring.sring->rsp_prod;
-	rmb(); /* Ensure we see queued responses up to 'rp'. */
+	rp = READ_ONCE(rinfo->ring.sring->rsp_prod);
+	virt_rmb(); /* Ensure we see queued responses up to 'rp'. */
+	if (RING_RESPONSE_PROD_OVERFLOW(&rinfo->ring, rp)) {
+		pr_alert("%s: illegal number of responses %u\n",
+			 info->gd->disk_name, rp - rinfo->ring.rsp_cons);
+		goto err;
+	}
 
 	for (i = rinfo->ring.rsp_cons; i != rp; i++) {
 		unsigned long id;
+		unsigned int op;
 
 		RING_COPY_RESPONSE(&rinfo->ring, i, &bret);
 		id = bret.id;
@@ -1580,14 +1592,28 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
 		 * look in get_id_from_freelist.
 		 */
 		if (id >= BLK_RING_SIZE(info)) {
-			WARN(1, "%s: response to %s has incorrect id (%ld)\n",
-			     info->gd->disk_name, op_name(bret.operation), id);
-			/* We can't safely get the 'struct request' as
-			 * the id is busted. */
-			continue;
+			pr_alert("%s: response has incorrect id (%ld)\n",
+				 info->gd->disk_name, id);
+			goto err;
+		}
+		if (rinfo->shadow[id].status != REQ_WAITING) {
+			pr_alert("%s: response references no pending request\n",
+				 info->gd->disk_name);
+			goto err;
 		}
+
+		rinfo->shadow[id].status = REQ_PROCESSING;
 		req  = rinfo->shadow[id].request;
 
+		op = rinfo->shadow[id].req.operation;
+		if (op == BLKIF_OP_INDIRECT)
+			op = rinfo->shadow[id].req.u.indirect.indirect_op;
+		if (bret.operation != op) {
+			pr_alert("%s: response has wrong operation (%u instead of %u)\n",
+				 info->gd->disk_name, bret.operation, op);
+			goto err;
+		}
+
 		if (bret.operation != BLKIF_OP_DISCARD) {
 			/*
 			 * We may need to wait for an extra response if the
@@ -1612,7 +1638,8 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
 		case BLKIF_OP_DISCARD:
 			if (unlikely(bret.status == BLKIF_RSP_EOPNOTSUPP)) {
 				struct request_queue *rq = info->rq;
-				printk(KERN_WARNING "blkfront: %s: %s op failed\n",
+
+				pr_warn_ratelimited("blkfront: %s: %s op failed\n",
 					   info->gd->disk_name, op_name(bret.operation));
 				blkif_req(req)->error = BLK_STS_NOTSUPP;
 				info->feature_discard = 0;
@@ -1624,13 +1651,13 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
 		case BLKIF_OP_FLUSH_DISKCACHE:
 		case BLKIF_OP_WRITE_BARRIER:
 			if (unlikely(bret.status == BLKIF_RSP_EOPNOTSUPP)) {
-				printk(KERN_WARNING "blkfront: %s: %s op failed\n",
+				pr_warn_ratelimited("blkfront: %s: %s op failed\n",
 				       info->gd->disk_name, op_name(bret.operation));
 				blkif_req(req)->error = BLK_STS_NOTSUPP;
 			}
 			if (unlikely(bret.status == BLKIF_RSP_ERROR &&
 				     rinfo->shadow[id].req.u.rw.nr_segments == 0)) {
-				printk(KERN_WARNING "blkfront: %s: empty %s op failed\n",
+				pr_warn_ratelimited("blkfront: %s: empty %s op failed\n",
 				       info->gd->disk_name, op_name(bret.operation));
 				blkif_req(req)->error = BLK_STS_NOTSUPP;
 			}
@@ -1645,8 +1672,9 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
 		case BLKIF_OP_READ:
 		case BLKIF_OP_WRITE:
 			if (unlikely(bret.status != BLKIF_RSP_OKAY))
-				dev_dbg(&info->xbdev->dev, "Bad return from blkdev data "
-					"request: %x\n", bret.status);
+				dev_dbg_ratelimited(&info->xbdev->dev,
+					"Bad return from blkdev data request: %#x\n",
+					bret.status);
 
 			break;
 		default:
@@ -1671,6 +1699,14 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
 	spin_unlock_irqrestore(&rinfo->ring_lock, flags);
 
 	return IRQ_HANDLED;
+
+ err:
+	info->connected = BLKIF_STATE_ERROR;
+
+	spin_unlock_irqrestore(&rinfo->ring_lock, flags);
+
+	pr_alert("%s disabled for further use\n", info->gd->disk_name);
+	return IRQ_HANDLED;
 }
 
 

commit 80baa77511eee363140b76265086f7f88f872877
Author: Juergen Gross <jgross@suse.com>
Date:   Mon Nov 29 08:45:38 2021 +0100

    xen/blkfront: don't take local copy of a request from the ring page
    
    commit 8f5a695d99000fc3aa73934d7ced33cfc64dcdab upstream.
    
    In order to avoid a malicious backend being able to influence the local
    copy of a request build the request locally first and then copy it to
    the ring page instead of doing it the other way round as today.
    
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Reviewed-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Roger Pau Monné <roger.pau@citrix.com>
    Link: https://lore.kernel.org/r/20210730103854.12681-3-jgross@suse.com
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index e04192fc7902..f12632c9034c 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -536,7 +536,7 @@ static unsigned long blkif_ring_get_request(struct blkfront_ring_info *rinfo,
 	rinfo->shadow[id].status = REQ_WAITING;
 	rinfo->shadow[id].associated_id = NO_ASSOCIATED_ID;
 
-	(*ring_req)->u.rw.id = id;
+	rinfo->shadow[id].req.u.rw.id = id;
 
 	return id;
 }
@@ -544,11 +544,12 @@ static unsigned long blkif_ring_get_request(struct blkfront_ring_info *rinfo,
 static int blkif_queue_discard_req(struct request *req, struct blkfront_ring_info *rinfo)
 {
 	struct blkfront_info *info = rinfo->dev_info;
-	struct blkif_request *ring_req;
+	struct blkif_request *ring_req, *final_ring_req;
 	unsigned long id;
 
 	/* Fill out a communications ring structure. */
-	id = blkif_ring_get_request(rinfo, req, &ring_req);
+	id = blkif_ring_get_request(rinfo, req, &final_ring_req);
+	ring_req = &rinfo->shadow[id].req;
 
 	ring_req->operation = BLKIF_OP_DISCARD;
 	ring_req->u.discard.nr_sectors = blk_rq_sectors(req);
@@ -559,8 +560,8 @@ static int blkif_queue_discard_req(struct request *req, struct blkfront_ring_inf
 	else
 		ring_req->u.discard.flag = 0;
 
-	/* Keep a private copy so we can reissue requests when recovering. */
-	rinfo->shadow[id].req = *ring_req;
+	/* Copy the request to the ring page. */
+	*final_ring_req = *ring_req;
 
 	return 0;
 }
@@ -693,6 +694,7 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri
 {
 	struct blkfront_info *info = rinfo->dev_info;
 	struct blkif_request *ring_req, *extra_ring_req = NULL;
+	struct blkif_request *final_ring_req, *final_extra_ring_req = NULL;
 	unsigned long id, extra_id = NO_ASSOCIATED_ID;
 	bool require_extra_req = false;
 	int i;
@@ -737,7 +739,8 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri
 	}
 
 	/* Fill out a communications ring structure. */
-	id = blkif_ring_get_request(rinfo, req, &ring_req);
+	id = blkif_ring_get_request(rinfo, req, &final_ring_req);
+	ring_req = &rinfo->shadow[id].req;
 
 	num_sg = blk_rq_map_sg(req->q, req, rinfo->shadow[id].sg);
 	num_grant = 0;
@@ -788,7 +791,9 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri
 		ring_req->u.rw.nr_segments = num_grant;
 		if (unlikely(require_extra_req)) {
 			extra_id = blkif_ring_get_request(rinfo, req,
-							  &extra_ring_req);
+							  &final_extra_ring_req);
+			extra_ring_req = &rinfo->shadow[extra_id].req;
+
 			/*
 			 * Only the first request contains the scatter-gather
 			 * list.
@@ -830,10 +835,10 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri
 	if (setup.segments)
 		kunmap_atomic(setup.segments);
 
-	/* Keep a private copy so we can reissue requests when recovering. */
-	rinfo->shadow[id].req = *ring_req;
+	/* Copy request(s) to the ring page. */
+	*final_ring_req = *ring_req;
 	if (unlikely(require_extra_req))
-		rinfo->shadow[extra_id].req = *extra_ring_req;
+		*final_extra_ring_req = *extra_ring_req;
 
 	if (new_persistent_gnts)
 		gnttab_free_grant_references(setup.gref_head);

commit b647c449f166a99fd5a011e4a2bc6f8b9fcd3222
Author: Juergen Gross <jgross@suse.com>
Date:   Mon Nov 29 08:41:07 2021 +0100

    xen/blkfront: read response from backend only once
    
    commit 71b66243f9898d0e54296b4e7035fb33cdcb0707 upstream.
    
    In order to avoid problems in case the backend is modifying a response
    on the ring page while the frontend has already seen it, just read the
    response into a local buffer in one go and then operate on that buffer
    only.
    
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Reviewed-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Roger Pau Monné <roger.pau@citrix.com>
    Link: https://lore.kernel.org/r/20210730103854.12681-2-jgross@suse.com
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index 1b06c8e46ffa..e04192fc7902 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -1549,7 +1549,7 @@ static bool blkif_completion(unsigned long *id,
 static irqreturn_t blkif_interrupt(int irq, void *dev_id)
 {
 	struct request *req;
-	struct blkif_response *bret;
+	struct blkif_response bret;
 	RING_IDX i, rp;
 	unsigned long flags;
 	struct blkfront_ring_info *rinfo = (struct blkfront_ring_info *)dev_id;
@@ -1566,8 +1566,9 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
 	for (i = rinfo->ring.rsp_cons; i != rp; i++) {
 		unsigned long id;
 
-		bret = RING_GET_RESPONSE(&rinfo->ring, i);
-		id   = bret->id;
+		RING_COPY_RESPONSE(&rinfo->ring, i, &bret);
+		id = bret.id;
+
 		/*
 		 * The backend has messed up and given us an id that we would
 		 * never have given to it (we stamp it up to BLK_RING_SIZE -
@@ -1575,39 +1576,39 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
 		 */
 		if (id >= BLK_RING_SIZE(info)) {
 			WARN(1, "%s: response to %s has incorrect id (%ld)\n",
-			     info->gd->disk_name, op_name(bret->operation), id);
+			     info->gd->disk_name, op_name(bret.operation), id);
 			/* We can't safely get the 'struct request' as
 			 * the id is busted. */
 			continue;
 		}
 		req  = rinfo->shadow[id].request;
 
-		if (bret->operation != BLKIF_OP_DISCARD) {
+		if (bret.operation != BLKIF_OP_DISCARD) {
 			/*
 			 * We may need to wait for an extra response if the
 			 * I/O request is split in 2
 			 */
-			if (!blkif_completion(&id, rinfo, bret))
+			if (!blkif_completion(&id, rinfo, &bret))
 				continue;
 		}
 
 		if (add_id_to_freelist(rinfo, id)) {
 			WARN(1, "%s: response to %s (id %ld) couldn't be recycled!\n",
-			     info->gd->disk_name, op_name(bret->operation), id);
+			     info->gd->disk_name, op_name(bret.operation), id);
 			continue;
 		}
 
-		if (bret->status == BLKIF_RSP_OKAY)
+		if (bret.status == BLKIF_RSP_OKAY)
 			blkif_req(req)->error = BLK_STS_OK;
 		else
 			blkif_req(req)->error = BLK_STS_IOERR;
 
-		switch (bret->operation) {
+		switch (bret.operation) {
 		case BLKIF_OP_DISCARD:
-			if (unlikely(bret->status == BLKIF_RSP_EOPNOTSUPP)) {
+			if (unlikely(bret.status == BLKIF_RSP_EOPNOTSUPP)) {
 				struct request_queue *rq = info->rq;
 				printk(KERN_WARNING "blkfront: %s: %s op failed\n",
-					   info->gd->disk_name, op_name(bret->operation));
+					   info->gd->disk_name, op_name(bret.operation));
 				blkif_req(req)->error = BLK_STS_NOTSUPP;
 				info->feature_discard = 0;
 				info->feature_secdiscard = 0;
@@ -1617,15 +1618,15 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
 			break;
 		case BLKIF_OP_FLUSH_DISKCACHE:
 		case BLKIF_OP_WRITE_BARRIER:
-			if (unlikely(bret->status == BLKIF_RSP_EOPNOTSUPP)) {
+			if (unlikely(bret.status == BLKIF_RSP_EOPNOTSUPP)) {
 				printk(KERN_WARNING "blkfront: %s: %s op failed\n",
-				       info->gd->disk_name, op_name(bret->operation));
+				       info->gd->disk_name, op_name(bret.operation));
 				blkif_req(req)->error = BLK_STS_NOTSUPP;
 			}
-			if (unlikely(bret->status == BLKIF_RSP_ERROR &&
+			if (unlikely(bret.status == BLKIF_RSP_ERROR &&
 				     rinfo->shadow[id].req.u.rw.nr_segments == 0)) {
 				printk(KERN_WARNING "blkfront: %s: empty %s op failed\n",
-				       info->gd->disk_name, op_name(bret->operation));
+				       info->gd->disk_name, op_name(bret.operation));
 				blkif_req(req)->error = BLK_STS_NOTSUPP;
 			}
 			if (unlikely(blkif_req(req)->error)) {
@@ -1638,9 +1639,9 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
 			/* fall through */
 		case BLKIF_OP_READ:
 		case BLKIF_OP_WRITE:
-			if (unlikely(bret->status != BLKIF_RSP_OKAY))
+			if (unlikely(bret.status != BLKIF_RSP_OKAY))
 				dev_dbg(&info->xbdev->dev, "Bad return from blkdev data "
-					"request: %x\n", bret->status);
+					"request: %x\n", bret.status);
 
 			break;
 		default:

commit dcbfd3f13b1363a358e65b1800aac840d176eacc
Author: Juergen Gross <jgross@suse.com>
Date:   Mon Nov 29 08:36:21 2021 +0100

    xen: sync include/xen/interface/io/ring.h with Xen's newest version
    
    commit 629a5d87e26fe96bcaab44cbb81f5866af6f7008 upstream.
    
    Sync include/xen/interface/io/ring.h with Xen's newest version in
    order to get the RING_COPY_RESPONSE() and RING_RESPONSE_PROD_OVERFLOW()
    macros.
    
    Note that this will correct the wrong license info by adding the
    missing original copyright notice.
    
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/xen/interface/io/ring.h b/include/xen/interface/io/ring.h
index 3f40501fc60b..b39cdbc522ec 100644
--- a/include/xen/interface/io/ring.h
+++ b/include/xen/interface/io/ring.h
@@ -1,21 +1,53 @@
-/* SPDX-License-Identifier: GPL-2.0 */
 /******************************************************************************
  * ring.h
  *
  * Shared producer-consumer ring macros.
  *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
  * Tim Deegan and Andrew Warfield November 2004.
  */
 
 #ifndef __XEN_PUBLIC_IO_RING_H__
 #define __XEN_PUBLIC_IO_RING_H__
 
+/*
+ * When #include'ing this header, you need to provide the following
+ * declaration upfront:
+ * - standard integers types (uint8_t, uint16_t, etc)
+ * They are provided by stdint.h of the standard headers.
+ *
+ * In addition, if you intend to use the FLEX macros, you also need to
+ * provide the following, before invoking the FLEX macros:
+ * - size_t
+ * - memcpy
+ * - grant_ref_t
+ * These declarations are provided by string.h of the standard headers,
+ * and grant_table.h from the Xen public headers.
+ */
+
 #include <xen/interface/grant_table.h>
 
 typedef unsigned int RING_IDX;
 
 /* Round a 32-bit unsigned constant down to the nearest power of two. */
-#define __RD2(_x)  (((_x) & 0x00000002) ? 0x2		       : ((_x) & 0x1))
+#define __RD2(_x)  (((_x) & 0x00000002) ? 0x2                  : ((_x) & 0x1))
 #define __RD4(_x)  (((_x) & 0x0000000c) ? __RD2((_x)>>2)<<2    : __RD2(_x))
 #define __RD8(_x)  (((_x) & 0x000000f0) ? __RD4((_x)>>4)<<4    : __RD4(_x))
 #define __RD16(_x) (((_x) & 0x0000ff00) ? __RD8((_x)>>8)<<8    : __RD8(_x))
@@ -27,82 +59,79 @@ typedef unsigned int RING_IDX;
  * A ring contains as many entries as will fit, rounded down to the nearest
  * power of two (so we can mask with (size-1) to loop around).
  */
-#define __CONST_RING_SIZE(_s, _sz)				\
-	(__RD32(((_sz) - offsetof(struct _s##_sring, ring)) /	\
-		sizeof(((struct _s##_sring *)0)->ring[0])))
-
+#define __CONST_RING_SIZE(_s, _sz) \
+    (__RD32(((_sz) - offsetof(struct _s##_sring, ring)) / \
+	    sizeof(((struct _s##_sring *)0)->ring[0])))
 /*
  * The same for passing in an actual pointer instead of a name tag.
  */
-#define __RING_SIZE(_s, _sz)						\
-	(__RD32(((_sz) - (long)&(_s)->ring + (long)(_s)) / sizeof((_s)->ring[0])))
+#define __RING_SIZE(_s, _sz) \
+    (__RD32(((_sz) - (long)(_s)->ring + (long)(_s)) / sizeof((_s)->ring[0])))
 
 /*
  * Macros to make the correct C datatypes for a new kind of ring.
  *
  * To make a new ring datatype, you need to have two message structures,
- * let's say struct request, and struct response already defined.
+ * let's say request_t, and response_t already defined.
  *
  * In a header where you want the ring datatype declared, you then do:
  *
- *     DEFINE_RING_TYPES(mytag, struct request, struct response);
+ *     DEFINE_RING_TYPES(mytag, request_t, response_t);
  *
  * These expand out to give you a set of types, as you can see below.
  * The most important of these are:
  *
- *     struct mytag_sring      - The shared ring.
- *     struct mytag_front_ring - The 'front' half of the ring.
- *     struct mytag_back_ring  - The 'back' half of the ring.
+ *     mytag_sring_t      - The shared ring.
+ *     mytag_front_ring_t - The 'front' half of the ring.
+ *     mytag_back_ring_t  - The 'back' half of the ring.
  *
  * To initialize a ring in your code you need to know the location and size
  * of the shared memory area (PAGE_SIZE, for instance). To initialise
  * the front half:
  *
- *     struct mytag_front_ring front_ring;
- *     SHARED_RING_INIT((struct mytag_sring *)shared_page);
- *     FRONT_RING_INIT(&front_ring, (struct mytag_sring *)shared_page,
- *		       PAGE_SIZE);
+ *     mytag_front_ring_t front_ring;
+ *     SHARED_RING_INIT((mytag_sring_t *)shared_page);
+ *     FRONT_RING_INIT(&front_ring, (mytag_sring_t *)shared_page, PAGE_SIZE);
  *
  * Initializing the back follows similarly (note that only the front
  * initializes the shared ring):
  *
- *     struct mytag_back_ring back_ring;
- *     BACK_RING_INIT(&back_ring, (struct mytag_sring *)shared_page,
- *		      PAGE_SIZE);
+ *     mytag_back_ring_t back_ring;
+ *     BACK_RING_INIT(&back_ring, (mytag_sring_t *)shared_page, PAGE_SIZE);
  */
 
-#define DEFINE_RING_TYPES(__name, __req_t, __rsp_t)			\
-									\
-/* Shared ring entry */							\
-union __name##_sring_entry {						\
-    __req_t req;							\
-    __rsp_t rsp;							\
-};									\
-									\
-/* Shared ring page */							\
-struct __name##_sring {							\
-    RING_IDX req_prod, req_event;					\
-    RING_IDX rsp_prod, rsp_event;					\
-    uint8_t  pad[48];							\
-    union __name##_sring_entry ring[1]; /* variable-length */		\
-};									\
-									\
-/* "Front" end's private variables */					\
-struct __name##_front_ring {						\
-    RING_IDX req_prod_pvt;						\
-    RING_IDX rsp_cons;							\
-    unsigned int nr_ents;						\
-    struct __name##_sring *sring;					\
-};									\
-									\
-/* "Back" end's private variables */					\
-struct __name##_back_ring {						\
-    RING_IDX rsp_prod_pvt;						\
-    RING_IDX req_cons;							\
-    unsigned int nr_ents;						\
-    struct __name##_sring *sring;					\
-};
-
+#define DEFINE_RING_TYPES(__name, __req_t, __rsp_t)                     \
+                                                                        \
+/* Shared ring entry */                                                 \
+union __name##_sring_entry {                                            \
+    __req_t req;                                                        \
+    __rsp_t rsp;                                                        \
+};                                                                      \
+                                                                        \
+/* Shared ring page */                                                  \
+struct __name##_sring {                                                 \
+    RING_IDX req_prod, req_event;                                       \
+    RING_IDX rsp_prod, rsp_event;                                       \
+    uint8_t __pad[48];                                                  \
+    union __name##_sring_entry ring[1]; /* variable-length */           \
+};                                                                      \
+                                                                        \
+/* "Front" end's private variables */                                   \
+struct __name##_front_ring {                                            \
+    RING_IDX req_prod_pvt;                                              \
+    RING_IDX rsp_cons;                                                  \
+    unsigned int nr_ents;                                               \
+    struct __name##_sring *sring;                                       \
+};                                                                      \
+                                                                        \
+/* "Back" end's private variables */                                    \
+struct __name##_back_ring {                                             \
+    RING_IDX rsp_prod_pvt;                                              \
+    RING_IDX req_cons;                                                  \
+    unsigned int nr_ents;                                               \
+    struct __name##_sring *sring;                                       \
+};                                                                      \
+                                                                        \
 /*
  * Macros for manipulating rings.
  *
@@ -119,105 +148,99 @@ struct __name##_back_ring {						\
  */
 
 /* Initialising empty rings */
-#define SHARED_RING_INIT(_s) do {					\
-    (_s)->req_prod  = (_s)->rsp_prod  = 0;				\
-    (_s)->req_event = (_s)->rsp_event = 1;				\
-    memset((_s)->pad, 0, sizeof((_s)->pad));				\
+#define SHARED_RING_INIT(_s) do {                                       \
+    (_s)->req_prod  = (_s)->rsp_prod  = 0;                              \
+    (_s)->req_event = (_s)->rsp_event = 1;                              \
+    (void)memset((_s)->__pad, 0, sizeof((_s)->__pad));                  \
 } while(0)
 
-#define FRONT_RING_INIT(_r, _s, __size) do {				\
-    (_r)->req_prod_pvt = 0;						\
-    (_r)->rsp_cons = 0;							\
-    (_r)->nr_ents = __RING_SIZE(_s, __size);				\
-    (_r)->sring = (_s);							\
+#define FRONT_RING_ATTACH(_r, _s, _i, __size) do {                      \
+    (_r)->req_prod_pvt = (_i);                                          \
+    (_r)->rsp_cons = (_i);                                              \
+    (_r)->nr_ents = __RING_SIZE(_s, __size);                            \
+    (_r)->sring = (_s);                                                 \
 } while (0)
 
-#define BACK_RING_INIT(_r, _s, __size) do {				\
-    (_r)->rsp_prod_pvt = 0;						\
-    (_r)->req_cons = 0;							\
-    (_r)->nr_ents = __RING_SIZE(_s, __size);				\
-    (_r)->sring = (_s);							\
-} while (0)
+#define FRONT_RING_INIT(_r, _s, __size) FRONT_RING_ATTACH(_r, _s, 0, __size)
 
-/* Initialize to existing shared indexes -- for recovery */
-#define FRONT_RING_ATTACH(_r, _s, __size) do {				\
-    (_r)->sring = (_s);							\
-    (_r)->req_prod_pvt = (_s)->req_prod;				\
-    (_r)->rsp_cons = (_s)->rsp_prod;					\
-    (_r)->nr_ents = __RING_SIZE(_s, __size);				\
+#define BACK_RING_ATTACH(_r, _s, _i, __size) do {                       \
+    (_r)->rsp_prod_pvt = (_i);                                          \
+    (_r)->req_cons = (_i);                                              \
+    (_r)->nr_ents = __RING_SIZE(_s, __size);                            \
+    (_r)->sring = (_s);                                                 \
 } while (0)
 
-#define BACK_RING_ATTACH(_r, _s, __size) do {				\
-    (_r)->sring = (_s);							\
-    (_r)->rsp_prod_pvt = (_s)->rsp_prod;				\
-    (_r)->req_cons = (_s)->req_prod;					\
-    (_r)->nr_ents = __RING_SIZE(_s, __size);				\
-} while (0)
+#define BACK_RING_INIT(_r, _s, __size) BACK_RING_ATTACH(_r, _s, 0, __size)
 
 /* How big is this ring? */
-#define RING_SIZE(_r)							\
+#define RING_SIZE(_r)                                                   \
     ((_r)->nr_ents)
 
 /* Number of free requests (for use on front side only). */
-#define RING_FREE_REQUESTS(_r)						\
+#define RING_FREE_REQUESTS(_r)                                          \
     (RING_SIZE(_r) - ((_r)->req_prod_pvt - (_r)->rsp_cons))
 
 /* Test if there is an empty slot available on the front ring.
  * (This is only meaningful from the front. )
  */
-#define RING_FULL(_r)							\
+#define RING_FULL(_r)                                                   \
     (RING_FREE_REQUESTS(_r) == 0)
 
 /* Test if there are outstanding messages to be processed on a ring. */
-#define RING_HAS_UNCONSUMED_RESPONSES(_r)				\
+#define RING_HAS_UNCONSUMED_RESPONSES(_r)                               \
     ((_r)->sring->rsp_prod - (_r)->rsp_cons)
 
-#define RING_HAS_UNCONSUMED_REQUESTS(_r)				\
-    ({									\
-	unsigned int req = (_r)->sring->req_prod - (_r)->req_cons;	\
-	unsigned int rsp = RING_SIZE(_r) -				\
-			   ((_r)->req_cons - (_r)->rsp_prod_pvt);	\
-	req < rsp ? req : rsp;						\
-    })
+#define RING_HAS_UNCONSUMED_REQUESTS(_r) ({                             \
+    unsigned int req = (_r)->sring->req_prod - (_r)->req_cons;          \
+    unsigned int rsp = RING_SIZE(_r) -                                  \
+        ((_r)->req_cons - (_r)->rsp_prod_pvt);                          \
+    req < rsp ? req : rsp;                                              \
+})
 
 /* Direct access to individual ring elements, by index. */
-#define RING_GET_REQUEST(_r, _idx)					\
+#define RING_GET_REQUEST(_r, _idx)                                      \
     (&((_r)->sring->ring[((_idx) & (RING_SIZE(_r) - 1))].req))
 
+#define RING_GET_RESPONSE(_r, _idx)                                     \
+    (&((_r)->sring->ring[((_idx) & (RING_SIZE(_r) - 1))].rsp))
+
 /*
- * Get a local copy of a request.
+ * Get a local copy of a request/response.
  *
- * Use this in preference to RING_GET_REQUEST() so all processing is
+ * Use this in preference to RING_GET_{REQUEST,RESPONSE}() so all processing is
  * done on a local copy that cannot be modified by the other end.
  *
  * Note that https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58145 may cause this
- * to be ineffective where _req is a struct which consists of only bitfields.
+ * to be ineffective where dest is a struct which consists of only bitfields.
  */
-#define RING_COPY_REQUEST(_r, _idx, _req) do {				\
-	/* Use volatile to force the copy into _req. */			\
-	*(_req) = *(volatile typeof(_req))RING_GET_REQUEST(_r, _idx);	\
+#define RING_COPY_(type, r, idx, dest) do {				\
+	/* Use volatile to force the copy into dest. */			\
+	*(dest) = *(volatile typeof(dest))RING_GET_##type(r, idx);	\
 } while (0)
 
-#define RING_GET_RESPONSE(_r, _idx)					\
-    (&((_r)->sring->ring[((_idx) & (RING_SIZE(_r) - 1))].rsp))
+#define RING_COPY_REQUEST(r, idx, req)  RING_COPY_(REQUEST, r, idx, req)
+#define RING_COPY_RESPONSE(r, idx, rsp) RING_COPY_(RESPONSE, r, idx, rsp)
 
 /* Loop termination condition: Would the specified index overflow the ring? */
-#define RING_REQUEST_CONS_OVERFLOW(_r, _cons)				\
+#define RING_REQUEST_CONS_OVERFLOW(_r, _cons)                           \
     (((_cons) - (_r)->rsp_prod_pvt) >= RING_SIZE(_r))
 
 /* Ill-behaved frontend determination: Can there be this many requests? */
-#define RING_REQUEST_PROD_OVERFLOW(_r, _prod)               \
+#define RING_REQUEST_PROD_OVERFLOW(_r, _prod)                           \
     (((_prod) - (_r)->rsp_prod_pvt) > RING_SIZE(_r))
 
+/* Ill-behaved backend determination: Can there be this many responses? */
+#define RING_RESPONSE_PROD_OVERFLOW(_r, _prod)                          \
+    (((_prod) - (_r)->rsp_cons) > RING_SIZE(_r))
 
-#define RING_PUSH_REQUESTS(_r) do {					\
-    virt_wmb(); /* back sees requests /before/ updated producer index */	\
-    (_r)->sring->req_prod = (_r)->req_prod_pvt;				\
+#define RING_PUSH_REQUESTS(_r) do {                                     \
+    virt_wmb(); /* back sees requests /before/ updated producer index */\
+    (_r)->sring->req_prod = (_r)->req_prod_pvt;                         \
 } while (0)
 
-#define RING_PUSH_RESPONSES(_r) do {					\
-    virt_wmb(); /* front sees responses /before/ updated producer index */	\
-    (_r)->sring->rsp_prod = (_r)->rsp_prod_pvt;				\
+#define RING_PUSH_RESPONSES(_r) do {                                    \
+    virt_wmb(); /* front sees resps /before/ updated producer index */  \
+    (_r)->sring->rsp_prod = (_r)->rsp_prod_pvt;                         \
 } while (0)
 
 /*
@@ -250,40 +273,40 @@ struct __name##_back_ring {						\
  *  field appropriately.
  */
 
-#define RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(_r, _notify) do {		\
-    RING_IDX __old = (_r)->sring->req_prod;				\
-    RING_IDX __new = (_r)->req_prod_pvt;				\
-    virt_wmb(); /* back sees requests /before/ updated producer index */	\
-    (_r)->sring->req_prod = __new;					\
-    virt_mb(); /* back sees new requests /before/ we check req_event */	\
-    (_notify) = ((RING_IDX)(__new - (_r)->sring->req_event) <		\
-		 (RING_IDX)(__new - __old));				\
+#define RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(_r, _notify) do {           \
+    RING_IDX __old = (_r)->sring->req_prod;                             \
+    RING_IDX __new = (_r)->req_prod_pvt;                                \
+    virt_wmb(); /* back sees requests /before/ updated producer index */\
+    (_r)->sring->req_prod = __new;                                      \
+    virt_mb(); /* back sees new requests /before/ we check req_event */ \
+    (_notify) = ((RING_IDX)(__new - (_r)->sring->req_event) <           \
+                 (RING_IDX)(__new - __old));                            \
 } while (0)
 
-#define RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(_r, _notify) do {		\
-    RING_IDX __old = (_r)->sring->rsp_prod;				\
-    RING_IDX __new = (_r)->rsp_prod_pvt;				\
-    virt_wmb(); /* front sees responses /before/ updated producer index */	\
-    (_r)->sring->rsp_prod = __new;					\
-    virt_mb(); /* front sees new responses /before/ we check rsp_event */	\
-    (_notify) = ((RING_IDX)(__new - (_r)->sring->rsp_event) <		\
-		 (RING_IDX)(__new - __old));				\
+#define RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(_r, _notify) do {          \
+    RING_IDX __old = (_r)->sring->rsp_prod;                             \
+    RING_IDX __new = (_r)->rsp_prod_pvt;                                \
+    virt_wmb(); /* front sees resps /before/ updated producer index */  \
+    (_r)->sring->rsp_prod = __new;                                      \
+    virt_mb(); /* front sees new resps /before/ we check rsp_event */   \
+    (_notify) = ((RING_IDX)(__new - (_r)->sring->rsp_event) <           \
+                 (RING_IDX)(__new - __old));                            \
 } while (0)
 
-#define RING_FINAL_CHECK_FOR_REQUESTS(_r, _work_to_do) do {		\
-    (_work_to_do) = RING_HAS_UNCONSUMED_REQUESTS(_r);			\
-    if (_work_to_do) break;						\
-    (_r)->sring->req_event = (_r)->req_cons + 1;			\
-    virt_mb();								\
-    (_work_to_do) = RING_HAS_UNCONSUMED_REQUESTS(_r);			\
+#define RING_FINAL_CHECK_FOR_REQUESTS(_r, _work_to_do) do {             \
+    (_work_to_do) = RING_HAS_UNCONSUMED_REQUESTS(_r);                   \
+    if (_work_to_do) break;                                             \
+    (_r)->sring->req_event = (_r)->req_cons + 1;                        \
+    virt_mb();                                                          \
+    (_work_to_do) = RING_HAS_UNCONSUMED_REQUESTS(_r);                   \
 } while (0)
 
-#define RING_FINAL_CHECK_FOR_RESPONSES(_r, _work_to_do) do {		\
-    (_work_to_do) = RING_HAS_UNCONSUMED_RESPONSES(_r);			\
-    if (_work_to_do) break;						\
-    (_r)->sring->rsp_event = (_r)->rsp_cons + 1;			\
-    virt_mb();								\
-    (_work_to_do) = RING_HAS_UNCONSUMED_RESPONSES(_r);			\
+#define RING_FINAL_CHECK_FOR_RESPONSES(_r, _work_to_do) do {            \
+    (_work_to_do) = RING_HAS_UNCONSUMED_RESPONSES(_r);                  \
+    if (_work_to_do) break;                                             \
+    (_r)->sring->rsp_event = (_r)->rsp_cons + 1;                        \
+    virt_mb();                                                          \
+    (_work_to_do) = RING_HAS_UNCONSUMED_RESPONSES(_r);                  \
 } while (0)
 
 

commit 22b814fdce55caf8db1cb550a32a64159e5b83a8
Author: Miklos Szeredi <mszeredi@redhat.com>
Date:   Thu Nov 25 14:05:18 2021 +0100

    fuse: release pipe buf after last use
    
    commit 473441720c8616dfaf4451f9c7ea14f0eb5e5d65 upstream.
    
    Checking buf->flags should be done before the pipe_buf_release() is called
    on the pipe buffer, since releasing the buffer might modify the flags.
    
    This is exactly what page_cache_pipe_buf_release() does, and which results
    in the same VM_BUG_ON_PAGE(PageLRU(page)) that the original patch was
    trying to fix.
    
    Reported-by: Justin Forbes <jmforbes@linuxtx.org>
    Fixes: 712a951025c0 ("fuse: fix page stealing")
    Cc: <stable@vger.kernel.org> # v2.6.35
    Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index 496fad83abac..d1dc54530252 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -905,17 +905,17 @@ static int fuse_try_move_page(struct fuse_copy_state *cs, struct page **pagep)
 		goto out_put_old;
 	}
 
+	get_page(newpage);
+
+	if (!(buf->flags & PIPE_BUF_FLAG_LRU))
+		lru_cache_add_file(newpage);
+
 	/*
 	 * Release while we have extra ref on stolen page.  Otherwise
 	 * anon_pipe_buf_release() might think the page can be reused.
 	 */
 	pipe_buf_release(cs->pipe, buf);
 
-	get_page(newpage);
-
-	if (!(buf->flags & PIPE_BUF_FLAG_LRU))
-		lru_cache_add_file(newpage);
-
 	err = 0;
 	spin_lock(&cs->req->waitq.lock);
 	if (test_bit(FR_ABORTED, &cs->req->flags))

commit 2350cffd71e74bf81dedc989fdec12aebe89a4a5
Author: Lin Ma <linma@zju.edu.cn>
Date:   Tue Nov 16 23:27:32 2021 +0800

    NFC: add NCI_UNREG flag to eliminate the race
    
    commit 48b71a9e66c2eab60564b1b1c85f4928ed04e406 upstream.
    
    There are two sites that calls queue_work() after the
    destroy_workqueue() and lead to possible UAF.
    
    The first site is nci_send_cmd(), which can happen after the
    nci_close_device as below
    
    nfcmrvl_nci_unregister_dev   |  nfc_genl_dev_up
      nci_close_device           |
        flush_workqueue          |
        del_timer_sync           |
      nci_unregister_device      |    nfc_get_device
        destroy_workqueue        |    nfc_dev_up
        nfc_unregister_device    |      nci_dev_up
          device_del             |        nci_open_device
                                 |          __nci_request
                                 |            nci_send_cmd
                                 |              queue_work !!!
    
    Another site is nci_cmd_timer, awaked by the nci_cmd_work from the
    nci_send_cmd.
    
      ...                        |  ...
      nci_unregister_device      |  queue_work
        destroy_workqueue        |
        nfc_unregister_device    |  ...
          device_del             |  nci_cmd_work
                                 |  mod_timer
                                 |  ...
                                 |  nci_cmd_timer
                                 |    queue_work !!!
    
    For the above two UAF, the root cause is that the nfc_dev_up can race
    between the nci_unregister_device routine. Therefore, this patch
    introduce NCI_UNREG flag to easily eliminate the possible race. In
    addition, the mutex_lock in nci_close_device can act as a barrier.
    
    Signed-off-by: Lin Ma <linma@zju.edu.cn>
    Fixes: 6a2968aaf50c ("NFC: basic NCI protocol implementation")
    Reviewed-by: Jakub Kicinski <kuba@kernel.org>
    Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Link: https://lore.kernel.org/r/20211116152732.19238-1-linma@zju.edu.cn
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/net/nfc/nci_core.h b/include/net/nfc/nci_core.h
index e67564af6f93..1560ce548add 100644
--- a/include/net/nfc/nci_core.h
+++ b/include/net/nfc/nci_core.h
@@ -42,6 +42,7 @@ enum nci_flag {
 	NCI_UP,
 	NCI_DATA_EXCHANGE,
 	NCI_DATA_EXCHANGE_TO,
+	NCI_UNREG,
 };
 
 /* NCI device states */
diff --git a/net/nfc/nci/core.c b/net/nfc/nci/core.c
index 1008bbbb3af9..0e0dff72a9e4 100644
--- a/net/nfc/nci/core.c
+++ b/net/nfc/nci/core.c
@@ -485,6 +485,11 @@ static int nci_open_device(struct nci_dev *ndev)
 
 	mutex_lock(&ndev->req_lock);
 
+	if (test_bit(NCI_UNREG, &ndev->flags)) {
+		rc = -ENODEV;
+		goto done;
+	}
+
 	if (test_bit(NCI_UP, &ndev->flags)) {
 		rc = -EALREADY;
 		goto done;
@@ -548,6 +553,10 @@ static int nci_open_device(struct nci_dev *ndev)
 static int nci_close_device(struct nci_dev *ndev)
 {
 	nci_req_cancel(ndev, ENODEV);
+
+	/* This mutex needs to be held as a barrier for
+	 * caller nci_unregister_device
+	 */
 	mutex_lock(&ndev->req_lock);
 
 	if (!test_and_clear_bit(NCI_UP, &ndev->flags)) {
@@ -585,8 +594,8 @@ static int nci_close_device(struct nci_dev *ndev)
 	/* Flush cmd wq */
 	flush_workqueue(ndev->cmd_wq);
 
-	/* Clear flags */
-	ndev->flags = 0;
+	/* Clear flags except NCI_UNREG */
+	ndev->flags &= BIT(NCI_UNREG);
 
 	mutex_unlock(&ndev->req_lock);
 
@@ -1268,6 +1277,12 @@ void nci_unregister_device(struct nci_dev *ndev)
 {
 	struct nci_conn_info    *conn_info, *n;
 
+	/* This set_bit is not protected with specialized barrier,
+	 * However, it is fine because the mutex_lock(&ndev->req_lock);
+	 * in nci_close_device() will help to emit one.
+	 */
+	set_bit(NCI_UNREG, &ndev->flags);
+
 	nci_close_device(ndev);
 
 	destroy_workqueue(ndev->cmd_wq);

commit b0313bc7f5fbb6beee327af39d818ffdc921821a
Author: Nadav Amit <namit@vmware.com>
Date:   Sun Nov 21 12:40:07 2021 -0800

    hugetlbfs: flush TLBs correctly after huge_pmd_unshare
    
    commit a4a118f2eead1d6c49e00765de89878288d4b890 upstream.
    
    When __unmap_hugepage_range() calls to huge_pmd_unshare() succeed, a TLB
    flush is missing.  This TLB flush must be performed before releasing the
    i_mmap_rwsem, in order to prevent an unshared PMDs page from being
    released and reused before the TLB flush took place.
    
    Arguably, a comprehensive solution would use mmu_gather interface to
    batch the TLB flushes and the PMDs page release, however it is not an
    easy solution: (1) try_to_unmap_one() and try_to_migrate_one() also call
    huge_pmd_unshare() and they cannot use the mmu_gather interface; and (2)
    deferring the release of the page reference for the PMDs page until
    after i_mmap_rwsem is dropeed can confuse huge_pmd_unshare() into
    thinking PMDs are shared when they are not.
    
    Fix __unmap_hugepage_range() by adding the missing TLB flush, and
    forcing a flush when unshare is successful.
    
    Fixes: 24669e58477e ("hugetlb: use mmu_gather instead of a temporary linked list for accumulating pages)" # 3.6
    Signed-off-by: Nadav Amit <namit@vmware.com>
    Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
    Cc: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
    Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/include/asm/tlb.h b/arch/arm/include/asm/tlb.h
index f854148c8d7c..00baa13c158d 100644
--- a/arch/arm/include/asm/tlb.h
+++ b/arch/arm/include/asm/tlb.h
@@ -280,6 +280,14 @@ tlb_remove_pmd_tlb_entry(struct mmu_gather *tlb, pmd_t *pmdp, unsigned long addr
 	tlb_add_flush(tlb, addr);
 }
 
+static inline void
+tlb_flush_pmd_range(struct mmu_gather *tlb, unsigned long address,
+		    unsigned long size)
+{
+	tlb_add_flush(tlb, address);
+	tlb_add_flush(tlb, address + size - PMD_SIZE);
+}
+
 #define pte_free_tlb(tlb, ptep, addr)	__pte_free_tlb(tlb, ptep, addr)
 #define pmd_free_tlb(tlb, pmdp, addr)	__pmd_free_tlb(tlb, pmdp, addr)
 #define pud_free_tlb(tlb, pudp, addr)	pud_free((tlb)->mm, pudp)
diff --git a/arch/ia64/include/asm/tlb.h b/arch/ia64/include/asm/tlb.h
index 516355a774bf..5d032d97c254 100644
--- a/arch/ia64/include/asm/tlb.h
+++ b/arch/ia64/include/asm/tlb.h
@@ -268,6 +268,16 @@ __tlb_remove_tlb_entry (struct mmu_gather *tlb, pte_t *ptep, unsigned long addre
 	tlb->end_addr = address + PAGE_SIZE;
 }
 
+static inline void
+tlb_flush_pmd_range(struct mmu_gather *tlb, unsigned long address,
+		    unsigned long size)
+{
+	if (tlb->start_addr > address)
+		tlb->start_addr = address;
+	if (tlb->end_addr < address + size)
+		tlb->end_addr = address + size;
+}
+
 #define tlb_migrate_finish(mm)	platform_tlb_migrate_finish(mm)
 
 #define tlb_start_vma(tlb, vma)			do { } while (0)
diff --git a/arch/s390/include/asm/tlb.h b/arch/s390/include/asm/tlb.h
index b31c779cf581..1df28a8e2f19 100644
--- a/arch/s390/include/asm/tlb.h
+++ b/arch/s390/include/asm/tlb.h
@@ -116,6 +116,20 @@ static inline void tlb_remove_page_size(struct mmu_gather *tlb,
 	return tlb_remove_page(tlb, page);
 }
 
+static inline void tlb_flush_pmd_range(struct mmu_gather *tlb,
+				unsigned long address, unsigned long size)
+{
+	/*
+	 * the range might exceed the original range that was provided to
+	 * tlb_gather_mmu(), so we need to update it despite the fact it is
+	 * usually not updated.
+	 */
+	if (tlb->start > address)
+		tlb->start = address;
+	if (tlb->end < address + size)
+		tlb->end = address + size;
+}
+
 /*
  * pte_free_tlb frees a pte table and clears the CRSTE for the
  * page table from the tlb.
@@ -177,6 +191,8 @@ static inline void pud_free_tlb(struct mmu_gather *tlb, pud_t *pud,
 #define tlb_remove_tlb_entry(tlb, ptep, addr)	do { } while (0)
 #define tlb_remove_pmd_tlb_entry(tlb, pmdp, addr)	do { } while (0)
 #define tlb_migrate_finish(mm)			do { } while (0)
+#define tlb_flush_pmd_range(tlb, addr, sz)	do { } while (0)
+
 #define tlb_remove_huge_tlb_entry(h, tlb, ptep, address)	\
 	tlb_remove_tlb_entry(tlb, ptep, address)
 
diff --git a/arch/sh/include/asm/tlb.h b/arch/sh/include/asm/tlb.h
index 77abe192fb43..adcb0bfe238e 100644
--- a/arch/sh/include/asm/tlb.h
+++ b/arch/sh/include/asm/tlb.h
@@ -127,6 +127,16 @@ static inline void tlb_remove_page_size(struct mmu_gather *tlb,
 	return tlb_remove_page(tlb, page);
 }
 
+static inline void
+tlb_flush_pmd_range(struct mmu_gather *tlb, unsigned long address,
+		    unsigned long size)
+{
+	if (tlb->start > address)
+		tlb->start = address;
+	if (tlb->end < address + size)
+		tlb->end = address + size;
+}
+
 #define tlb_remove_check_page_size_change tlb_remove_check_page_size_change
 static inline void tlb_remove_check_page_size_change(struct mmu_gather *tlb,
 						     unsigned int page_size)
diff --git a/arch/um/include/asm/tlb.h b/arch/um/include/asm/tlb.h
index dce6db147f24..02e61f6abfca 100644
--- a/arch/um/include/asm/tlb.h
+++ b/arch/um/include/asm/tlb.h
@@ -130,6 +130,18 @@ static inline void tlb_remove_page_size(struct mmu_gather *tlb,
 	return tlb_remove_page(tlb, page);
 }
 
+static inline void
+tlb_flush_pmd_range(struct mmu_gather *tlb, unsigned long address,
+		    unsigned long size)
+{
+	tlb->need_flush = 1;
+
+	if (tlb->start > address)
+		tlb->start = address;
+	if (tlb->end < address + size)
+		tlb->end = address + size;
+}
+
 /**
  * tlb_remove_tlb_entry - remember a pte unmapping for later tlb invalidation.
  *
diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h
index b3353e21f3b3..db72ad39853b 100644
--- a/include/asm-generic/tlb.h
+++ b/include/asm-generic/tlb.h
@@ -118,6 +118,8 @@ void arch_tlb_gather_mmu(struct mmu_gather *tlb,
 void tlb_flush_mmu(struct mmu_gather *tlb);
 void arch_tlb_finish_mmu(struct mmu_gather *tlb,
 			 unsigned long start, unsigned long end, bool force);
+void tlb_flush_pmd_range(struct mmu_gather *tlb, unsigned long address,
+			 unsigned long size);
 extern bool __tlb_remove_page_size(struct mmu_gather *tlb, struct page *page,
 				   int page_size);
 
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index ebcf26bc4cd4..0c5a2b4e003d 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -3425,6 +3425,7 @@ void __unmap_hugepage_range(struct mmu_gather *tlb, struct vm_area_struct *vma,
 	unsigned long sz = huge_page_size(h);
 	unsigned long mmun_start = start;	/* For mmu_notifiers */
 	unsigned long mmun_end   = end;		/* For mmu_notifiers */
+	bool force_flush = false;
 
 	WARN_ON(!is_vm_hugetlb_page(vma));
 	BUG_ON(start & ~huge_page_mask(h));
@@ -3451,10 +3452,8 @@ void __unmap_hugepage_range(struct mmu_gather *tlb, struct vm_area_struct *vma,
 		ptl = huge_pte_lock(h, mm, ptep);
 		if (huge_pmd_unshare(mm, &address, ptep)) {
 			spin_unlock(ptl);
-			/*
-			 * We just unmapped a page of PMDs by clearing a PUD.
-			 * The caller's TLB flush range should cover this area.
-			 */
+			tlb_flush_pmd_range(tlb, address & PUD_MASK, PUD_SIZE);
+			force_flush = true;
 			continue;
 		}
 
@@ -3511,6 +3510,22 @@ void __unmap_hugepage_range(struct mmu_gather *tlb, struct vm_area_struct *vma,
 	}
 	mmu_notifier_invalidate_range_end(mm, mmun_start, mmun_end);
 	tlb_end_vma(tlb, vma);
+
+	/*
+	 * If we unshared PMDs, the TLB flush was not recorded in mmu_gather. We
+	 * could defer the flush until now, since by holding i_mmap_rwsem we
+	 * guaranteed that the last refernece would not be dropped. But we must
+	 * do the flushing before we return, as otherwise i_mmap_rwsem will be
+	 * dropped and the last reference to the shared PMDs page might be
+	 * dropped as well.
+	 *
+	 * In theory we could defer the freeing of the PMD pages as well, but
+	 * huge_pmd_unshare() relies on the exact page_count for the PMD page to
+	 * detect sharing, so we cannot defer the release of the page either.
+	 * Instead, do flush now.
+	 */
+	if (force_flush)
+		tlb_flush_mmu_tlbonly(tlb);
 }
 
 void __unmap_hugepage_range_final(struct mmu_gather *tlb,
diff --git a/mm/memory.c b/mm/memory.c
index 49b546cdce0d..1d03085fde02 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -324,6 +324,16 @@ bool __tlb_remove_page_size(struct mmu_gather *tlb, struct page *page, int page_
 	return false;
 }
 
+void tlb_flush_pmd_range(struct mmu_gather *tlb, unsigned long address,
+			 unsigned long size)
+{
+	if (tlb->page_size != 0 && tlb->page_size != PMD_SIZE)
+		tlb_flush_mmu(tlb);
+
+	tlb->page_size = PMD_SIZE;
+	tlb->start = min(tlb->start, address);
+	tlb->end = max(tlb->end, address + size);
+}
 #endif /* HAVE_GENERIC_MMU_GATHER */
 
 #ifdef CONFIG_HAVE_RCU_TABLE_FREE

commit b2a7e63edf21b3598f1eaec060f971102f735311
Author: David Hildenbrand <david@redhat.com>
Date:   Thu Sep 9 18:22:42 2021 +0200

    s390/mm: validate VMA in PGSTE manipulation functions
    
    commit fe3d10024073f06f04c74b9674bd71ccc1d787cf upstream.
    
    We should not walk/touch page tables outside of VMA boundaries when
    holding only the mmap sem in read mode. Evil user space can modify the
    VMA layout just before this function runs and e.g., trigger races with
    page table removal code since commit dd2283f2605e ("mm: mmap: zap pages
    with read mmap_sem in munmap"). gfn_to_hva() will only translate using
    KVM memory regions, but won't validate the VMA.
    
    Further, we should not allocate page tables outside of VMA boundaries: if
    evil user space decides to map hugetlbfs to these ranges, bad things will
    happen because we suddenly have PTE or PMD page tables where we
    shouldn't have them.
    
    Similarly, we have to check if we suddenly find a hugetlbfs VMA, before
    calling get_locked_pte().
    
    Fixes: 2d42f9477320 ("s390/kvm: Add PGSTE manipulation functions")
    Signed-off-by: David Hildenbrand <david@redhat.com>
    Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
    Acked-by: Heiko Carstens <hca@linux.ibm.com>
    Link: https://lore.kernel.org/r/20210909162248.14969-4-david@redhat.com
    Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c
index ae894ac83fd6..4354ac607750 100644
--- a/arch/s390/mm/pgtable.c
+++ b/arch/s390/mm/pgtable.c
@@ -970,6 +970,7 @@ EXPORT_SYMBOL(get_guest_storage_key);
 int pgste_perform_essa(struct mm_struct *mm, unsigned long hva, int orc,
 			unsigned long *oldpte, unsigned long *oldpgste)
 {
+	struct vm_area_struct *vma;
 	unsigned long pgstev;
 	spinlock_t *ptl;
 	pgste_t pgste;
@@ -979,6 +980,10 @@ int pgste_perform_essa(struct mm_struct *mm, unsigned long hva, int orc,
 	WARN_ON_ONCE(orc > ESSA_MAX);
 	if (unlikely(orc > ESSA_MAX))
 		return -EINVAL;
+
+	vma = find_vma(mm, hva);
+	if (!vma || hva < vma->vm_start || is_vm_hugetlb_page(vma))
+		return -EFAULT;
 	ptep = get_locked_pte(mm, hva, &ptl);
 	if (unlikely(!ptep))
 		return -EFAULT;
@@ -1071,10 +1076,14 @@ EXPORT_SYMBOL(pgste_perform_essa);
 int set_pgste_bits(struct mm_struct *mm, unsigned long hva,
 			unsigned long bits, unsigned long value)
 {
+	struct vm_area_struct *vma;
 	spinlock_t *ptl;
 	pgste_t new;
 	pte_t *ptep;
 
+	vma = find_vma(mm, hva);
+	if (!vma || hva < vma->vm_start || is_vm_hugetlb_page(vma))
+		return -EFAULT;
 	ptep = get_locked_pte(mm, hva, &ptl);
 	if (unlikely(!ptep))
 		return -EFAULT;
@@ -1099,9 +1108,13 @@ EXPORT_SYMBOL(set_pgste_bits);
  */
 int get_pgste(struct mm_struct *mm, unsigned long hva, unsigned long *pgstep)
 {
+	struct vm_area_struct *vma;
 	spinlock_t *ptl;
 	pte_t *ptep;
 
+	vma = find_vma(mm, hva);
+	if (!vma || hva < vma->vm_start || is_vm_hugetlb_page(vma))
+		return -EFAULT;
 	ptep = get_locked_pte(mm, hva, &ptl);
 	if (unlikely(!ptep))
 		return -EFAULT;

commit 2692931d92d83afaa636703e95203d53629ca7c1
Author: Steven Rostedt (VMware) <rostedt@goodmis.org>
Date:   Fri Nov 26 13:35:26 2021 -0500

    tracing: Check pid filtering when creating events
    
    commit 6cb206508b621a9a0a2c35b60540e399225c8243 upstream.
    
    When pid filtering is activated in an instance, all of the events trace
    files for that instance has the PID_FILTER flag set. This determines
    whether or not pid filtering needs to be done on the event, otherwise the
    event is executed as normal.
    
    If pid filtering is enabled when an event is created (via a dynamic event
    or modules), its flag is not updated to reflect the current state, and the
    events are not filtered properly.
    
    Cc: stable@vger.kernel.org
    Fixes: 3fdaf80f4a836 ("tracing: Implement event pid filtering")
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index ea43be6b9cc3..1ca64a9296d0 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -2255,12 +2255,19 @@ static struct trace_event_file *
 trace_create_new_event(struct trace_event_call *call,
 		       struct trace_array *tr)
 {
+	struct trace_pid_list *pid_list;
 	struct trace_event_file *file;
 
 	file = kmem_cache_alloc(file_cachep, GFP_TRACE);
 	if (!file)
 		return NULL;
 
+	pid_list = rcu_dereference_protected(tr->filtered_pids,
+					     lockdep_is_held(&event_mutex));
+
+	if (pid_list)
+		file->flags |= EVENT_FILE_FL_PID_FILTER;
+
 	file->event_call = call;
 	file->tr = tr;
 	atomic_set(&file->sm_ref, 0);

commit 3f8ad84723efe05bfedb3b45426b5030f8d04947
Author: Stefano Garzarella <sgarzare@redhat.com>
Date:   Mon Nov 22 17:35:24 2021 +0100

    vhost/vsock: fix incorrect used length reported to the guest
    
    commit 49d8c5ffad07ca014cfae72a1b9b8c52b6ad9cb8 upstream.
    
    The "used length" reported by calling vhost_add_used() must be the
    number of bytes written by the device (using "in" buffers).
    
    In vhost_vsock_handle_tx_kick() the device only reads the guest
    buffers (they are all "out" buffers), without writing anything,
    so we must pass 0 as "used length" to comply virtio spec.
    
    Fixes: 433fc58e6bf2 ("VSOCK: Introduce vhost_vsock.ko")
    Cc: stable@vger.kernel.org
    Reported-by: Halil Pasic <pasic@linux.ibm.com>
    Suggested-by: Jason Wang <jasowang@redhat.com>
    Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
    Link: https://lore.kernel.org/r/20211122163525.294024-2-sgarzare@redhat.com
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
    Reviewed-by: Halil Pasic <pasic@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c
index 6ee320259e4f..d61abf569dc1 100644
--- a/drivers/vhost/vsock.c
+++ b/drivers/vhost/vsock.c
@@ -490,7 +490,7 @@ static void vhost_vsock_handle_tx_kick(struct vhost_work *work)
 			virtio_transport_free_pkt(pkt);
 
 		len += sizeof(pkt->hdr);
-		vhost_add_used(vq, head, len);
+		vhost_add_used(vq, head, 0);
 		total_len += len;
 		added = true;
 	} while(likely(!vhost_exceeds_weight(vq, ++pkts, total_len)));

commit a539070b7b5a0e76ec00ddd67d79c0b2895186a2
Author: Guangbin Huang <huangguangbin2@huawei.com>
Date:   Fri Nov 26 20:03:15 2021 +0800

    net: hns3: fix VF RSS failed problem after PF enable multi-TCs
    
    [ Upstream commit 8d2ad993aa05c0768f00c886c9d369cd97a337ac ]
    
    When PF is set to multi-TCs and configured mapping relationship between
    priorities and TCs, the hardware will active these settings for this PF
    and its VFs.
    
    In this case when VF just uses one TC and its rx packets contain priority,
    and if the priority is not mapped to TC0, as other TCs of VF is not valid,
    hardware always put this kind of packets to the queue 0. It cause this kind
    of packets of VF can not be used RSS function.
    
    To fix this problem, set tc mode of all unused TCs of VF to the setting of
    TC0, then rx packet with priority which map to unused TC will be direct to
    TC0.
    
    Fixes: e2cb1dec9779 ("net: hns3: Add HNS3 VF HCL(Hardware Compatibility Layer) Support")
    Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
index fd5375b5991b..a257bf635bc2 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
@@ -451,9 +451,9 @@ static int hclgevf_set_rss_tc_mode(struct hclgevf_dev *hdev,  u16 rss_size)
 	roundup_size = ilog2(roundup_size);
 
 	for (i = 0; i < HCLGEVF_MAX_TC_NUM; i++) {
-		tc_valid[i] = !!(hdev->hw_tc_map & BIT(i));
+		tc_valid[i] = 1;
 		tc_size[i] = roundup_size;
-		tc_offset[i] = rss_size * i;
+		tc_offset[i] = (hdev->hw_tc_map & BIT(i)) ? rss_size * i : 0;
 	}
 
 	hclgevf_cmd_setup_basic_desc(&desc, HCLGEVF_OPC_RSS_TC_MODE, false);

commit 7d0354c9a1736593fc2d32d26ae898dfc3089c87
Author: Tony Lu <tonylu@linux.alibaba.com>
Date:   Fri Nov 26 10:41:35 2021 +0800

    net/smc: Don't call clcsock shutdown twice when smc shutdown
    
    [ Upstream commit bacb6c1e47691cda4a95056c21b5487fb7199fcc ]
    
    When applications call shutdown() with SHUT_RDWR in userspace,
    smc_close_active() calls kernel_sock_shutdown(), and it is called
    twice in smc_shutdown().
    
    This fixes this by checking sk_state before do clcsock shutdown, and
    avoids missing the application's call of smc_shutdown().
    
    Link: https://lore.kernel.org/linux-s390/1f67548e-cbf6-0dce-82b5-10288a4583bd@linux.ibm.com/
    Fixes: 606a63c9783a ("net/smc: Ensure the active closing peer first closes clcsock")
    Signed-off-by: Tony Lu <tonylu@linux.alibaba.com>
    Reviewed-by: Wen Gu <guwen@linux.alibaba.com>
    Acked-by: Karsten Graul <kgraul@linux.ibm.com>
    Link: https://lore.kernel.org/r/20211126024134.45693-1-tonylu@linux.alibaba.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c
index 9aab4ab8161b..4c904ab29e0e 100644
--- a/net/smc/af_smc.c
+++ b/net/smc/af_smc.c
@@ -1589,8 +1589,10 @@ static __poll_t smc_poll(struct file *file, struct socket *sock,
 static int smc_shutdown(struct socket *sock, int how)
 {
 	struct sock *sk = sock->sk;
+	bool do_shutdown = true;
 	struct smc_sock *smc;
 	int rc = -EINVAL;
+	int old_state;
 	int rc1 = 0;
 
 	smc = smc_sk(sk);
@@ -1617,7 +1619,11 @@ static int smc_shutdown(struct socket *sock, int how)
 	}
 	switch (how) {
 	case SHUT_RDWR:		/* shutdown in both directions */
+		old_state = sk->sk_state;
 		rc = smc_close_active(smc);
+		if (old_state == SMC_ACTIVE &&
+		    sk->sk_state == SMC_PEERCLOSEWAIT1)
+			do_shutdown = false;
 		break;
 	case SHUT_WR:
 		rc = smc_close_shutdown_write(smc);
@@ -1627,7 +1633,7 @@ static int smc_shutdown(struct socket *sock, int how)
 		/* nothing more to do because peer is not involved */
 		break;
 	}
-	if (smc->clcsock)
+	if (do_shutdown && smc->clcsock)
 		rc1 = kernel_sock_shutdown(smc->clcsock, how);
 	/* map sock_shutdown_cmd constants to sk_shutdown value range */
 	sk->sk_shutdown |= how + 1;

commit fd25bc47e641970cb365f5fd80915e20646d0ae7
Author: Huang Pei <huangpei@loongson.cn>
Date:   Thu Nov 25 18:59:48 2021 +0800

    MIPS: use 3-level pgtable for 64KB page size on MIPS_VA_BITS_48
    
    [ Upstream commit 41ce097f714401e6ad8f3f5eb30d7f91b0b5e495 ]
    
    It hangup when booting Loongson 3A1000 with BOTH
    CONFIG_PAGE_SIZE_64KB and CONFIG_MIPS_VA_BITS_48, that it turn
    out to use 2-level pgtable instead of 3-level. 64KB page size
    with 2-level pgtable only cover 42 bits VA, use 3-level pgtable
    to cover all 48 bits VA(55 bits)
    
    Fixes: 1e321fa917fb ("MIPS64: Support of at least 48 bits of SEGBITS)
    Signed-off-by: Huang Pei <huangpei@loongson.cn>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index e513528be3ad..8a227a80f6bd 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -2991,7 +2991,7 @@ config HAVE_LATENCYTOP_SUPPORT
 config PGTABLE_LEVELS
 	int
 	default 4 if PAGE_SIZE_4KB && MIPS_VA_BITS_48
-	default 3 if 64BIT && !PAGE_SIZE_64KB
+	default 3 if 64BIT && (!PAGE_SIZE_64KB || MIPS_VA_BITS_48)
 	default 2
 
 config MIPS_AUTO_PFN_OFFSET

commit 1bc55e92bc0e1c0de59ed48cb943c3f35c4d7eb6
Author: Eric Dumazet <edumazet@google.com>
Date:   Tue Nov 23 12:25:35 2021 -0800

    tcp_cubic: fix spurious Hystart ACK train detections for not-cwnd-limited flows
    
    [ Upstream commit 4e1fddc98d2585ddd4792b5e44433dcee7ece001 ]
    
    While testing BIG TCP patch series, I was expecting that TCP_RR workloads
    with 80KB requests/answers would send one 80KB TSO packet,
    then being received as a single GRO packet.
    
    It turns out this was not happening, and the root cause was that
    cubic Hystart ACK train was triggering after a few (2 or 3) rounds of RPC.
    
    Hystart was wrongly setting CWND/SSTHRESH to 30, while my RPC
    needed a budget of ~20 segments.
    
    Ideally these TCP_RR flows should not exit slow start.
    
    Cubic Hystart should reset itself at each round, instead of assuming
    every TCP flow is a bulk one.
    
    Note that even after this patch, Hystart can still trigger, depending
    on scheduling artifacts, but at a higher CWND/SSTHRESH threshold,
    keeping optimal TSO packet sizes.
    
    Tested:
    
    ip link set dev eth0 gro_ipv6_max_size 131072 gso_ipv6_max_size 131072
    nstat -n; netperf -H ... -t TCP_RR  -l 5  -- -r 80000,80000 -K cubic; nstat|egrep "Ip6InReceives|Hystart|Ip6OutRequests"
    
    Before:
    
       8605
    Ip6InReceives                   87541              0.0
    Ip6OutRequests                  129496             0.0
    TcpExtTCPHystartTrainDetect     1                  0.0
    TcpExtTCPHystartTrainCwnd       30                 0.0
    
    After:
    
      8760
    Ip6InReceives                   88514              0.0
    Ip6OutRequests                  87975              0.0
    
    Fixes: ae27e98a5152 ("[TCP] CUBIC v2.3")
    Co-developed-by: Neal Cardwell <ncardwell@google.com>
    Signed-off-by: Neal Cardwell <ncardwell@google.com>
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Cc: Stephen Hemminger <stephen@networkplumber.org>
    Cc: Yuchung Cheng <ycheng@google.com>
    Cc: Soheil Hassas Yeganeh <soheil@google.com>
    Link: https://lore.kernel.org/r/20211123202535.1843771-1-eric.dumazet@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv4/tcp_cubic.c b/net/ipv4/tcp_cubic.c
index 8b5ba0a5cd38..93530bd33247 100644
--- a/net/ipv4/tcp_cubic.c
+++ b/net/ipv4/tcp_cubic.c
@@ -340,8 +340,6 @@ static void bictcp_cong_avoid(struct sock *sk, u32 ack, u32 acked)
 		return;
 
 	if (tcp_in_slow_start(tp)) {
-		if (hystart && after(ack, ca->end_seq))
-			bictcp_hystart_reset(sk);
 		acked = tcp_slow_start(tp, acked);
 		if (!acked)
 			return;
@@ -383,6 +381,9 @@ static void hystart_update(struct sock *sk, u32 delay)
 	if (ca->found & hystart_detect)
 		return;
 
+	if (after(tp->snd_una, ca->end_seq))
+		bictcp_hystart_reset(sk);
+
 	if (hystart_detect & HYSTART_ACK_TRAIN) {
 		u32 now = bictcp_clock();
 

commit 68945e943519df1532e598fafab16ac54488933f
Author: Thomas Zeitlhofer <thomas.zeitlhofer+lkml@ze-it.at>
Date:   Tue Nov 23 20:18:43 2021 +0100

    PM: hibernate: use correct mode for swsusp_close()
    
    [ Upstream commit cefcf24b4d351daf70ecd945324e200d3736821e ]
    
    Commit 39fbef4b0f77 ("PM: hibernate: Get block device exclusively in
    swsusp_check()") changed the opening mode of the block device to
    (FMODE_READ | FMODE_EXCL).
    
    In the corresponding calls to swsusp_close(), the mode is still just
    FMODE_READ which triggers the warning in blkdev_flush_mapping() on
    resume from hibernate.
    
    So, use the mode (FMODE_READ | FMODE_EXCL) also when closing the
    device.
    
    Fixes: 39fbef4b0f77 ("PM: hibernate: Get block device exclusively in swsusp_check()")
    Signed-off-by: Thomas Zeitlhofer <thomas.zeitlhofer+lkml@ze-it.at>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c
index 28db51274ed0..6670a44ec5d4 100644
--- a/kernel/power/hibernate.c
+++ b/kernel/power/hibernate.c
@@ -677,7 +677,7 @@ static int load_image_and_restore(void)
 		goto Unlock;
 
 	error = swsusp_read(&flags);
-	swsusp_close(FMODE_READ);
+	swsusp_close(FMODE_READ | FMODE_EXCL);
 	if (!error)
 		hibernation_restore(flags & SF_PLATFORM_MODE);
 
@@ -874,7 +874,7 @@ static int software_resume(void)
 	/* The snapshot device should not be opened while we're running */
 	if (!atomic_add_unless(&snapshot_device_available, -1, 0)) {
 		error = -EBUSY;
-		swsusp_close(FMODE_READ);
+		swsusp_close(FMODE_READ | FMODE_EXCL);
 		goto Unlock;
 	}
 
@@ -910,7 +910,7 @@ static int software_resume(void)
 	pm_pr_dbg("Hibernation image not present or could not be loaded.\n");
 	return error;
  Close_Finish:
-	swsusp_close(FMODE_READ);
+	swsusp_close(FMODE_READ | FMODE_EXCL);
 	goto Finish;
 }
 

commit 8ba43fd0c680b6d4af11b9bb3118a663dbe5019f
Author: Tony Lu <tonylu@linux.alibaba.com>
Date:   Tue Nov 23 16:25:18 2021 +0800

    net/smc: Ensure the active closing peer first closes clcsock
    
    [ Upstream commit 606a63c9783a32a45bd2ef0eee393711d75b3284 ]
    
    The side that actively closed socket, it's clcsock doesn't enter
    TIME_WAIT state, but the passive side does it. It should show the same
    behavior as TCP sockets.
    
    Consider this, when client actively closes the socket, the clcsock in
    server enters TIME_WAIT state, which means the address is occupied and
    won't be reused before TIME_WAIT dismissing. If we restarted server, the
    service would be unavailable for a long time.
    
    To solve this issue, shutdown the clcsock in [A], perform the TCP active
    close progress first, before the passive closed side closing it. So that
    the actively closed side enters TIME_WAIT, not the passive one.
    
    Client                                            |  Server
    close() // client actively close                  |
      smc_release()                                   |
          smc_close_active() // PEERCLOSEWAIT1        |
              smc_close_final() // abort or closed = 1|
                  smc_cdc_get_slot_and_msg_send()     |
              [A]                                     |
                                                      |smc_cdc_msg_recv_action() // ACTIVE
                                                      |  queue_work(smc_close_wq, &conn->close_work)
                                                      |    smc_close_passive_work() // PROCESSABORT or APPCLOSEWAIT1
                                                      |      smc_close_passive_abort_received() // only in abort
                                                      |
                                                      |close() // server recv zero, close
                                                      |  smc_release() // PROCESSABORT or APPCLOSEWAIT1
                                                      |    smc_close_active()
                                                      |      smc_close_abort() or smc_close_final() // CLOSED
                                                      |        smc_cdc_get_slot_and_msg_send() // abort or closed = 1
    smc_cdc_msg_recv_action()                         |    smc_clcsock_release()
      queue_work(smc_close_wq, &conn->close_work)     |      sock_release(tcp) // actively close clc, enter TIME_WAIT
        smc_close_passive_work() // PEERCLOSEWAIT1    |    smc_conn_free()
          smc_close_passive_abort_received() // CLOSED|
          smc_conn_free()                             |
          smc_clcsock_release()                       |
            sock_release(tcp) // passive close clc    |
    
    Link: https://www.spinics.net/lists/netdev/msg780407.html
    Fixes: b38d732477e4 ("smc: socket closing and linkgroup cleanup")
    Signed-off-by: Tony Lu <tonylu@linux.alibaba.com>
    Reviewed-by: Wen Gu <guwen@linux.alibaba.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/smc/smc_close.c b/net/smc/smc_close.c
index ea2b87f29469..e25c023582f9 100644
--- a/net/smc/smc_close.c
+++ b/net/smc/smc_close.c
@@ -202,6 +202,12 @@ int smc_close_active(struct smc_sock *smc)
 			if (rc)
 				break;
 			sk->sk_state = SMC_PEERCLOSEWAIT1;
+
+			/* actively shutdown clcsock before peer close it,
+			 * prevent peer from entering TIME_WAIT state.
+			 */
+			if (smc->clcsock && smc->clcsock->sk)
+				rc = kernel_sock_shutdown(smc->clcsock, SHUT_RDWR);
 		} else {
 			/* peer event has changed the state */
 			goto again;

commit 3b7c37106bcf08f154404f1f212a3713ebf37cec
Author: Eric Dumazet <edumazet@google.com>
Date:   Thu Nov 18 17:37:58 2021 -0800

    ipv6: fix typos in __ip6_finish_output()
    
    [ Upstream commit 19d36c5f294879949c9d6f57cb61d39cc4c48553 ]
    
    We deal with IPv6 packets, so we need to use IP6CB(skb)->flags and
    IP6SKB_REROUTED, instead of IPCB(skb)->flags and IPSKB_REROUTED
    
    Found by code inspection, please double check that fixing this bug
    does not surface other bugs.
    
    Fixes: 09ee9dba9611 ("ipv6: Reinject IPv6 packets if IPsec policy matches after SNAT")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Cc: Tobias Brunner <tobias@strongswan.org>
    Cc: Steffen Klassert <steffen.klassert@secunet.com>
    Cc: David Ahern <dsahern@kernel.org>
    Reviewed-by: David Ahern <dsahern@kernel.org>
    Tested-by: Tobias Brunner <tobias@strongswan.org>
    Acked-by: Tobias Brunner <tobias@strongswan.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index fc36f3b0dceb..251ec12517e9 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -175,7 +175,7 @@ static int ip6_finish_output(struct net *net, struct sock *sk, struct sk_buff *s
 #if defined(CONFIG_NETFILTER) && defined(CONFIG_XFRM)
 	/* Policy lookup after SNAT yielded a new policy */
 	if (skb_dst(skb)->xfrm) {
-		IPCB(skb)->flags |= IPSKB_REROUTED;
+		IP6CB(skb)->flags |= IP6SKB_REROUTED;
 		return dst_output(net, sk, skb);
 	}
 #endif

commit 482522c199844473cb851cf8b536a702ca095aa1
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Thu Nov 18 14:14:16 2021 +0300

    drm/vc4: fix error code in vc4_create_object()
    
    [ Upstream commit 96c5f82ef0a145d3e56e5b26f2bf6dcd2ffeae1c ]
    
    The ->gem_create_object() functions are supposed to return NULL if there
    is an error.  None of the callers expect error pointers so returing one
    will lead to an Oops.  See drm_gem_vram_create(), for example.
    
    Fixes: c826a6e10644 ("drm/vc4: Add a BO cache.")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Maxime Ripard <maxime@cerno.tech>
    Link: https://patchwork.freedesktop.org/patch/msgid/20211118111416.GC1147@kili
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/vc4/vc4_bo.c b/drivers/gpu/drm/vc4/vc4_bo.c
index 8dcce7182bb7..1e28ff981599 100644
--- a/drivers/gpu/drm/vc4/vc4_bo.c
+++ b/drivers/gpu/drm/vc4/vc4_bo.c
@@ -417,7 +417,7 @@ struct drm_gem_object *vc4_create_object(struct drm_device *dev, size_t size)
 
 	bo = kzalloc(sizeof(*bo), GFP_KERNEL);
 	if (!bo)
-		return ERR_PTR(-ENOMEM);
+		return NULL;
 
 	bo->madv = VC4_MADV_WILLNEED;
 	refcount_set(&bo->usecnt, 0);

commit 0d4b29eaadc1f59cec0c7e85eae77d08fcca9824
Author: Sreekanth Reddy <sreekanth.reddy@broadcom.com>
Date:   Wed Nov 17 16:19:09 2021 +0530

    scsi: mpt3sas: Fix kernel panic during drive powercycle test
    
    [ Upstream commit 0ee4ba13e09c9d9c1cb6abb59da8295d9952328b ]
    
    While looping over shost's sdev list it is possible that one
    of the drives is getting removed and its sas_target object is
    freed but its sdev object remains intact.
    
    Consequently, a kernel panic can occur while the driver is trying to access
    the sas_address field of sas_target object without also checking the
    sas_target object for NULL.
    
    Link: https://lore.kernel.org/r/20211117104909.2069-1-sreekanth.reddy@broadcom.com
    Fixes: f92363d12359 ("[SCSI] mpt3sas: add new driver supporting 12GB SAS")
    Signed-off-by: Sreekanth Reddy <sreekanth.reddy@broadcom.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
index add699b01836..d899f216245e 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
@@ -3364,7 +3364,7 @@ _scsih_ublock_io_device(struct MPT3SAS_ADAPTER *ioc, u64 sas_address)
 
 	shost_for_each_device(sdev, ioc->shost) {
 		sas_device_priv_data = sdev->hostdata;
-		if (!sas_device_priv_data)
+		if (!sas_device_priv_data || !sas_device_priv_data->sas_target)
 			continue;
 		if (sas_device_priv_data->sas_target->sas_address
 		    != sas_address)

commit 33712bc6482ef9e4ac13835ebe20f77b4984a8aa
Author: Takashi Iwai <tiwai@suse.de>
Date:   Thu Nov 18 15:25:08 2021 +0100

    ARM: socfpga: Fix crash with CONFIG_FORTIRY_SOURCE
    
    [ Upstream commit 187bea472600dcc8d2eb714335053264dd437172 ]
    
    When CONFIG_FORTIFY_SOURCE is set, memcpy() checks the potential
    buffer overflow and panics.  The code in sofcpga bootstrapping
    contains the memcpy() calls are mistakenly translated as the shorter
    size, hence it triggers a panic as if it were overflowing.
    
    This patch changes the secondary_trampoline and *_end definitions
    to arrays for avoiding the false-positive crash above.
    
    Fixes: 9c4566a117a6 ("ARM: socfpga: Enable SMP for socfpga")
    Suggested-by: Kees Cook <keescook@chromium.org>
    Buglink: https://bugzilla.suse.com/show_bug.cgi?id=1192473
    Link: https://lore.kernel.org/r/20211117193244.31162-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/mach-socfpga/core.h b/arch/arm/mach-socfpga/core.h
index 65e1817d8afe..692a287a8712 100644
--- a/arch/arm/mach-socfpga/core.h
+++ b/arch/arm/mach-socfpga/core.h
@@ -48,7 +48,7 @@ extern void __iomem *sdr_ctl_base_addr;
 u32 socfpga_sdram_self_refresh(u32 sdr_base);
 extern unsigned int socfpga_sdram_self_refresh_sz;
 
-extern char secondary_trampoline, secondary_trampoline_end;
+extern char secondary_trampoline[], secondary_trampoline_end[];
 
 extern unsigned long socfpga_cpu1start_addr;
 
diff --git a/arch/arm/mach-socfpga/platsmp.c b/arch/arm/mach-socfpga/platsmp.c
index 0ee76772b507..a272999ce04b 100644
--- a/arch/arm/mach-socfpga/platsmp.c
+++ b/arch/arm/mach-socfpga/platsmp.c
@@ -31,14 +31,14 @@
 
 static int socfpga_boot_secondary(unsigned int cpu, struct task_struct *idle)
 {
-	int trampoline_size = &secondary_trampoline_end - &secondary_trampoline;
+	int trampoline_size = secondary_trampoline_end - secondary_trampoline;
 
 	if (socfpga_cpu1start_addr) {
 		/* This will put CPU #1 into reset. */
 		writel(RSTMGR_MPUMODRST_CPU1,
 		       rst_manager_base_addr + SOCFPGA_RSTMGR_MODMPURST);
 
-		memcpy(phys_to_virt(0), &secondary_trampoline, trampoline_size);
+		memcpy(phys_to_virt(0), secondary_trampoline, trampoline_size);
 
 		writel(__pa_symbol(secondary_startup),
 		       sys_manager_base_addr + (socfpga_cpu1start_addr & 0x000000ff));
@@ -56,12 +56,12 @@ static int socfpga_boot_secondary(unsigned int cpu, struct task_struct *idle)
 
 static int socfpga_a10_boot_secondary(unsigned int cpu, struct task_struct *idle)
 {
-	int trampoline_size = &secondary_trampoline_end - &secondary_trampoline;
+	int trampoline_size = secondary_trampoline_end - secondary_trampoline;
 
 	if (socfpga_cpu1start_addr) {
 		writel(RSTMGR_MPUMODRST_CPU1, rst_manager_base_addr +
 		       SOCFPGA_A10_RSTMGR_MODMPURST);
-		memcpy(phys_to_virt(0), &secondary_trampoline, trampoline_size);
+		memcpy(phys_to_virt(0), secondary_trampoline, trampoline_size);
 
 		writel(__pa_symbol(secondary_startup),
 		       sys_manager_base_addr + (socfpga_cpu1start_addr & 0x00000fff));

commit 301cdc22d74419c4f1309fcc5011bf041516c7fe
Author: Trond Myklebust <trond.myklebust@hammerspace.com>
Date:   Tue Nov 16 09:55:01 2021 -0500

    NFSv42: Don't fail clone() unless the OP_CLONE operation failed
    
    [ Upstream commit d3c45824ad65aebf765fcf51366d317a29538820 ]
    
    The failure to retrieve post-op attributes has no bearing on whether or
    not the clone operation itself was successful. We must therefore ignore
    the return value of decode_getfattr() when looking at the success or
    failure of nfs4_xdr_dec_clone().
    
    Fixes: 36022770de6c ("nfs42: add CLONE xdr functions")
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/nfs/nfs42xdr.c b/fs/nfs/nfs42xdr.c
index ec9803088f6b..eee011de3f58 100644
--- a/fs/nfs/nfs42xdr.c
+++ b/fs/nfs/nfs42xdr.c
@@ -707,8 +707,7 @@ static int nfs4_xdr_dec_clone(struct rpc_rqst *rqstp,
 	status = decode_clone(xdr);
 	if (status)
 		goto out;
-	status = decode_getfattr(xdr, res->dst_fattr, res->server);
-
+	decode_getfattr(xdr, res->dst_fattr, res->server);
 out:
 	res->rpc_status = status;
 	return status;

commit b03c7892c360071a733d8018b5b662b774b296b7
Author: Peng Fan <peng.fan@nxp.com>
Date:   Tue Nov 16 14:42:27 2021 +0800

    firmware: arm_scmi: pm: Propagate return value to caller
    
    [ Upstream commit 1446fc6c678e8d8b31606a4b877abe205f344b38 ]
    
    of_genpd_add_provider_onecell may return error, so let's propagate
    its return value to caller
    
    Link: https://lore.kernel.org/r/20211116064227.20571-1-peng.fan@oss.nxp.com
    Fixes: 898216c97ed2 ("firmware: arm_scmi: add device power domain support using genpd")
    Signed-off-by: Peng Fan <peng.fan@nxp.com>
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/firmware/arm_scmi/scmi_pm_domain.c b/drivers/firmware/arm_scmi/scmi_pm_domain.c
index 041f8152272b..177874adccf0 100644
--- a/drivers/firmware/arm_scmi/scmi_pm_domain.c
+++ b/drivers/firmware/arm_scmi/scmi_pm_domain.c
@@ -106,9 +106,7 @@ static int scmi_pm_domain_probe(struct scmi_device *sdev)
 	scmi_pd_data->domains = domains;
 	scmi_pd_data->num_domains = num_domains;
 
-	of_genpd_add_provider_onecell(np, scmi_pd_data);
-
-	return 0;
+	return of_genpd_add_provider_onecell(np, scmi_pd_data);
 }
 
 static const struct scmi_device_id scmi_id_table[] = {

commit d67bad99ba32128546d95b68909421b58a5af28a
Author: Alexander Aring <aahringo@redhat.com>
Date:   Thu Nov 11 22:09:16 2021 -0500

    net: ieee802154: handle iftypes as u32
    
    [ Upstream commit 451dc48c806a7ce9fbec5e7a24ccf4b2c936e834 ]
    
    This patch fixes an issue that an u32 netlink value is handled as a
    signed enum value which doesn't fit into the range of u32 netlink type.
    If it's handled as -1 value some BIT() evaluation ends in a
    shift-out-of-bounds issue. To solve the issue we set the to u32 max which
    is s32 "-1" value to keep backwards compatibility and let the followed enum
    values start counting at 0. This brings the compiler to never handle the
    enum as signed and a check if the value is above NL802154_IFTYPE_MAX should
    filter -1 out.
    
    Fixes: f3ea5e44231a ("ieee802154: add new interface command")
    Signed-off-by: Alexander Aring <aahringo@redhat.com>
    Link: https://lore.kernel.org/r/20211112030916.685793-1-aahringo@redhat.com
    Signed-off-by: Stefan Schmidt <stefan@datenfreihafen.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/net/nl802154.h b/include/net/nl802154.h
index ddcee128f5d9..145acb8f2509 100644
--- a/include/net/nl802154.h
+++ b/include/net/nl802154.h
@@ -19,6 +19,8 @@
  *
  */
 
+#include <linux/types.h>
+
 #define NL802154_GENL_NAME "nl802154"
 
 enum nl802154_commands {
@@ -150,10 +152,9 @@ enum nl802154_attrs {
 };
 
 enum nl802154_iftype {
-	/* for backwards compatibility TODO */
-	NL802154_IFTYPE_UNSPEC = -1,
+	NL802154_IFTYPE_UNSPEC = (~(__u32)0),
 
-	NL802154_IFTYPE_NODE,
+	NL802154_IFTYPE_NODE = 0,
 	NL802154_IFTYPE_MONITOR,
 	NL802154_IFTYPE_COORD,
 

commit caa6246acac484a89ab5ff1ea246a27553d4a4f0
Author: Takashi Iwai <tiwai@suse.de>
Date:   Tue Nov 16 08:18:12 2021 +0100

    ASoC: topology: Add missing rwsem around snd_ctl_remove() calls
    
    [ Upstream commit 7e567b5ae06315ef2d70666b149962e2bb4b97af ]
    
    snd_ctl_remove() has to be called with card->controls_rwsem held (when
    called after the card instantiation).  This patch add the missing
    rwsem calls around it.
    
    Fixes: 8a9782346dcc ("ASoC: topology: Add topology core")
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Link: https://lore.kernel.org/r/20211116071812.18109-1-tiwai@suse.de
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index 2c6598e07dde..ccf6dd941197 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -2565,6 +2565,7 @@ EXPORT_SYMBOL_GPL(snd_soc_tplg_widget_remove_all);
 /* remove dynamic controls from the component driver */
 int snd_soc_tplg_component_remove(struct snd_soc_component *comp, u32 index)
 {
+	struct snd_card *card = comp->card->snd_card;
 	struct snd_soc_dobj *dobj, *next_dobj;
 	int pass = SOC_TPLG_PASS_END;
 
@@ -2572,6 +2573,7 @@ int snd_soc_tplg_component_remove(struct snd_soc_component *comp, u32 index)
 	while (pass >= SOC_TPLG_PASS_START) {
 
 		/* remove mixer controls */
+		down_write(&card->controls_rwsem);
 		list_for_each_entry_safe(dobj, next_dobj, &comp->dobj_list,
 			list) {
 
@@ -2605,6 +2607,7 @@ int snd_soc_tplg_component_remove(struct snd_soc_component *comp, u32 index)
 				break;
 			}
 		}
+		up_write(&card->controls_rwsem);
 		pass--;
 	}
 

commit 33bb18e65268c8860c4bbceb78c5325f28abec1d
Author: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Date:   Tue Nov 16 11:47:18 2021 +0000

    ASoC: qdsp6: q6routing: Conditionally reset FrontEnd Mixer
    
    [ Upstream commit 861afeac7990587588d057b2c0b3222331c3da29 ]
    
    Stream IDs are reused across multiple BackEnd mixers, do not reset the
    stream mixers if they are not already set for that particular FrontEnd.
    
    Ex:
    amixer cset iface=MIXER,name='SLIMBUS_0_RX Audio Mixer MultiMedia1' 1
    
    would set the MultiMedia1 steam for SLIMBUS_0_RX, however doing below
    command will reset previously setup MultiMedia1 stream, because both of them
    are using MultiMedia1 PCM stream.
    
    amixer cset iface=MIXER,name='SLIMBUS_2_RX Audio Mixer MultiMedia1' 0
    
    reset the FrontEnd Mixers conditionally to fix this issue.
    
    This is more noticeable in desktop setup, where in alsactl tries to restore
    the alsa state and overwriting the previous mixer settings.
    
    Fixes: e3a33673e845 ("ASoC: qdsp6: q6routing: Add q6routing driver")
    Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
    Link: https://lore.kernel.org/r/20211116114721.12517-3-srinivas.kandagatla@linaro.org
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/qcom/qdsp6/q6routing.c b/sound/soc/qcom/qdsp6/q6routing.c
index 44eee18c658a..7d2c5de38031 100644
--- a/sound/soc/qcom/qdsp6/q6routing.c
+++ b/sound/soc/qcom/qdsp6/q6routing.c
@@ -443,7 +443,11 @@ static int msm_routing_put_audio_mixer(struct snd_kcontrol *kcontrol,
 		session->port_id = be_id;
 		snd_soc_dapm_mixer_update_power(dapm, kcontrol, 1, update);
 	} else {
-		session->port_id = -1;
+		if (session->port_id == be_id) {
+			session->port_id = -1;
+			return 0;
+		}
+
 		snd_soc_dapm_mixer_update_power(dapm, kcontrol, 0, update);
 	}
 

commit e6295d39e9d0eb520128a140f8fcc4968559133f
Author: Florian Fainelli <f.fainelli@gmail.com>
Date:   Thu Oct 28 09:46:53 2021 -0700

    ARM: dts: BCM5301X: Add interrupt properties to GPIO node
    
    [ Upstream commit 40f7342f0587639e5ad625adaa15efdd3cffb18f ]
    
    The GPIO controller is also an interrupt controller provider and is
    currently missing the appropriate 'interrupt-controller' and
    '#interrupt-cells' properties to denote that.
    
    Fixes: fb026d3de33b ("ARM: BCM5301X: Add Broadcom's bus-axi to the DTS file")
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/bcm5301x.dtsi b/arch/arm/boot/dts/bcm5301x.dtsi
index bb8b15e42fe9..6edc4bd1e7ea 100644
--- a/arch/arm/boot/dts/bcm5301x.dtsi
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
@@ -239,6 +239,8 @@
 
 			gpio-controller;
 			#gpio-cells = <2>;
+			interrupt-controller;
+			#interrupt-cells = <2>;
 		};
 
 		pcie0: pcie@12000 {

commit 14f6a7a2e2f812cd1b0871303b646a74b890831f
Author: Florian Fainelli <f.fainelli@gmail.com>
Date:   Wed Oct 27 12:37:29 2021 -0700

    ARM: dts: BCM5301X: Fix I2C controller interrupt
    
    [ Upstream commit 754c4050a00e802e122690112fc2c3a6abafa7e2 ]
    
    The I2C interrupt controller line is off by 32 because the datasheet
    describes interrupt inputs into the GIC which are for Shared Peripheral
    Interrupts and are starting at offset 32. The ARM GIC binding expects
    the SPI interrupts to be numbered from 0 relative to the SPI base.
    
    Fixes: bb097e3e0045 ("ARM: dts: BCM5301X: Add I2C support to the DT")
    Tested-by: Christian Lamparter <chunkeey@gmail.com>
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/bcm5301x.dtsi b/arch/arm/boot/dts/bcm5301x.dtsi
index fa3422c4caec..bb8b15e42fe9 100644
--- a/arch/arm/boot/dts/bcm5301x.dtsi
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
@@ -384,7 +384,7 @@
 	i2c0: i2c@18009000 {
 		compatible = "brcm,iproc-i2c";
 		reg = <0x18009000 0x50>;
-		interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
+		interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
 		#address-cells = <1>;
 		#size-cells = <0>;
 		clock-frequency = <100000>;

commit 0dc62d3d6b6ef2067b6cd897f942826dd65e6b66
Author: yangxingwu <xingwu.yang@gmail.com>
Date:   Thu Nov 4 03:10:29 2021 +0100

    netfilter: ipvs: Fix reuse connection if RS weight is 0
    
    [ Upstream commit c95c07836fa4c1767ed11d8eca0769c652760e32 ]
    
    We are changing expire_nodest_conn to work even for reused connections when
    conn_reuse_mode=0, just as what was done with commit dc7b3eb900aa ("ipvs:
    Fix reuse connection if real server is dead").
    
    For controlled and persistent connections, the new connection will get the
    needed real server depending on the rules in ip_vs_check_template().
    
    Fixes: d752c3645717 ("ipvs: allow rescheduling of new connections when port reuse is detected")
    Co-developed-by: Chuanqi Liu <legend050709@qq.com>
    Signed-off-by: Chuanqi Liu <legend050709@qq.com>
    Signed-off-by: yangxingwu <xingwu.yang@gmail.com>
    Acked-by: Simon Horman <horms@verge.net.au>
    Acked-by: Julian Anastasov <ja@ssi.bg>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/Documentation/networking/ipvs-sysctl.txt b/Documentation/networking/ipvs-sysctl.txt
index 056898685d40..fc531c29a2e8 100644
--- a/Documentation/networking/ipvs-sysctl.txt
+++ b/Documentation/networking/ipvs-sysctl.txt
@@ -30,8 +30,7 @@ conn_reuse_mode - INTEGER
 
 	0: disable any special handling on port reuse. The new
 	connection will be delivered to the same real server that was
-	servicing the previous connection. This will effectively
-	disable expire_nodest_conn.
+	servicing the previous connection.
 
 	bit 1: enable rescheduling of new connections when it is safe.
 	That is, whenever expire_nodest_conn and for TCP sockets, when
diff --git a/net/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c
index acaeeaf81441..f20b08db9fe9 100644
--- a/net/netfilter/ipvs/ip_vs_core.c
+++ b/net/netfilter/ipvs/ip_vs_core.c
@@ -1850,7 +1850,6 @@ ip_vs_in(struct netns_ipvs *ipvs, unsigned int hooknum, struct sk_buff *skb, int
 	struct ip_vs_proto_data *pd;
 	struct ip_vs_conn *cp;
 	int ret, pkts;
-	int conn_reuse_mode;
 	struct sock *sk;
 
 	/* Already marked as IPVS request or reply? */
@@ -1926,15 +1925,16 @@ ip_vs_in(struct netns_ipvs *ipvs, unsigned int hooknum, struct sk_buff *skb, int
 	 */
 	cp = pp->conn_in_get(ipvs, af, skb, &iph);
 
-	conn_reuse_mode = sysctl_conn_reuse_mode(ipvs);
-	if (conn_reuse_mode && !iph.fragoffs && is_new_conn(skb, &iph) && cp) {
+	if (!iph.fragoffs && is_new_conn(skb, &iph) && cp) {
+		int conn_reuse_mode = sysctl_conn_reuse_mode(ipvs);
 		bool old_ct = false, resched = false;
 
 		if (unlikely(sysctl_expire_nodest_conn(ipvs)) && cp->dest &&
 		    unlikely(!atomic_read(&cp->dest->weight))) {
 			resched = true;
 			old_ct = ip_vs_conn_uses_old_conntrack(cp, skb);
-		} else if (is_new_conn_expected(cp, conn_reuse_mode)) {
+		} else if (conn_reuse_mode &&
+			   is_new_conn_expected(cp, conn_reuse_mode)) {
 			old_ct = ip_vs_conn_uses_old_conntrack(cp, skb);
 			if (!atomic_read(&cp->n_control)) {
 				resched = true;

commit c472f170cb1c833edf53493156ac6043ba80477e
Author: Marek Behún <marek.behun@nic.cz>
Date:   Thu Nov 25 00:05:00 2021 +0100

    arm64: dts: marvell: armada-37xx: Set pcie_reset_pin to gpio function
    
    commit 715878016984b2617f6c1f177c50039e12e7bd5b upstream.
    
    We found out that we are unable to control the PERST# signal via the
    default pin dedicated to be PERST# pin (GPIO2[3] pin) on A3700 SOC when
    this pin is in EP_PCIE1_Resetn mode. There is a register in the PCIe
    register space called PERSTN_GPIO_EN (D0088004[3]), but changing the
    value of this register does not change the pin output when measuring
    with voltmeter.
    
    We do not know if this is a bug in the SOC, or if it works only when
    PCIe controller is in a certain state.
    
    Commit f4c7d053d7f7 ("PCI: aardvark: Wait for endpoint to be ready
    before training link") says that when this pin changes pinctrl mode
    from EP_PCIE1_Resetn to GPIO, the PERST# signal is asserted for a brief
    moment.
    
    So currently the situation is that on A3700 boards the PERST# signal is
    asserted in U-Boot (because the code in U-Boot issues reset via this pin
    via GPIO mode), and then in Linux by the obscure and undocumented
    mechanism described by the above mentioned commit.
    
    We want to issue PERST# signal in a known way, therefore this patch
    changes the pcie_reset_pin function from "pcie" to "gpio" and adds the
    reset-gpios property to the PCIe node in device tree files of
    EspressoBin and Armada 3720 Dev Board (Turris Mox device tree already
    has this property and uDPU does not have a PCIe port).
    
    Signed-off-by: Marek Behún <marek.behun@nic.cz>
    Cc: Remi Pommarel <repk@triplefau.lt>
    Tested-by: Tomasz Maciej Nowak <tmn505@gmail.com>
    Acked-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
    Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm64/boot/dts/marvell/armada-3720-db.dts b/arch/arm64/boot/dts/marvell/armada-3720-db.dts
index f2cc00594d64..3e5789f37206 100644
--- a/arch/arm64/boot/dts/marvell/armada-3720-db.dts
+++ b/arch/arm64/boot/dts/marvell/armada-3720-db.dts
@@ -128,6 +128,9 @@
 
 /* CON15(V2.0)/CON17(V1.4) : PCIe / CON15(V2.0)/CON12(V1.4) :mini-PCIe */
 &pcie0 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&pcie_reset_pins &pcie_clkreq_pins>;
+	reset-gpios = <&gpiosb 3 GPIO_ACTIVE_LOW>;
 	status = "okay";
 };
 
diff --git a/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dts b/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dts
index 1a3e6e3b04eb..f36089198243 100644
--- a/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dts
+++ b/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dts
@@ -55,6 +55,9 @@
 
 /* J9 */
 &pcie0 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&pcie_reset_pins &pcie_clkreq_pins>;
+	reset-gpios = <&gpiosb 3 GPIO_ACTIVE_LOW>;
 	status = "okay";
 };
 
diff --git a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
index 5299a16459f2..7500be1a11a3 100644
--- a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
+++ b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
@@ -256,7 +256,7 @@
 
 				pcie_reset_pins: pcie-reset-pins {
 					groups = "pcie1";
-					function = "pcie";
+					function = "gpio";
 				};
 
 				pcie_clkreq_pins: pcie-clkreq-pins {

commit 33a174313477c1d7e64b27829d9a82745ced75a7
Author: Miquel Raynal <miquel.raynal@bootlin.com>
Date:   Thu Nov 25 00:04:59 2021 +0100

    arm64: dts: marvell: armada-37xx: declare PCIe reset pin
    
    commit a5470af981a0cc14a650af8da5186668971a4fc8 upstream.
    
    One pin can be muxed as PCIe endpoint card reset.
    
    Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
    Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
index fca78eb334b1..5299a16459f2 100644
--- a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
+++ b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
@@ -254,6 +254,15 @@
 					function = "mii";
 				};
 
+				pcie_reset_pins: pcie-reset-pins {
+					groups = "pcie1";
+					function = "pcie";
+				};
+
+				pcie_clkreq_pins: pcie-clkreq-pins {
+					groups = "pcie1_clkreq";
+					function = "pcie";
+				};
 			};
 
 			eth0: ethernet@30000 {

commit 72168c3cce9bbb02e955854880636f6ec50e1cda
Author: Marek Behún <kabel@kernel.org>
Date:   Thu Nov 25 00:04:58 2021 +0100

    pinctrl: armada-37xx: Correct PWM pins definitions
    
    commit baf8d6899b1e8906dc076ef26cc633e96a8bb0c3 upstream.
    
    The PWM pins on North Bridge on Armada 37xx can be configured into PWM
    or GPIO functions. When in PWM function, each pin can also be configured
    to drive low on 0 and tri-state on 1 (LED mode).
    
    The current definitions handle this by declaring two pin groups for each
    pin:
    - group "pwmN" with functions "pwm" and "gpio"
    - group "ledN_od" ("od" for open drain) with functions "led" and "gpio"
    
    This is semantically incorrect. The correct definition for each pin
    should be one group with three functions: "pwm", "led" and "gpio".
    
    Change the "pwmN" groups to support "led" function.
    
    Remove "ledN_od" groups. This cannot break backwards compatibility with
    older device trees: no device tree uses it since there is no PWM driver
    for this SOC yet. Also "ledN_od" groups are not even documented.
    
    Fixes: b835d6953009 ("pinctrl: armada-37xx: swap polarity on LED group")
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Acked-by: Rob Herring <robh@kernel.org>
    Link: https://lore.kernel.org/r/20210719112938.27594-1-kabel@kernel.org
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Documentation/devicetree/bindings/pinctrl/marvell,armada-37xx-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/marvell,armada-37xx-pinctrl.txt
index f69f82741cae..fb8ec9b0f8c7 100644
--- a/Documentation/devicetree/bindings/pinctrl/marvell,armada-37xx-pinctrl.txt
+++ b/Documentation/devicetree/bindings/pinctrl/marvell,armada-37xx-pinctrl.txt
@@ -43,19 +43,19 @@ group emmc_nb
 
 group pwm0
  - pin 11 (GPIO1-11)
- - functions pwm, gpio
+ - functions pwm, led, gpio
 
 group pwm1
  - pin 12
- - functions pwm, gpio
+ - functions pwm, led, gpio
 
 group pwm2
  - pin 13
- - functions pwm, gpio
+ - functions pwm, led, gpio
 
 group pwm3
  - pin 14
- - functions pwm, gpio
+ - functions pwm, led, gpio
 
 group pmic1
  - pin 7
diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c
index adfb1d0d58dd..e69b84d9538a 100644
--- a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c
+++ b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c
@@ -166,10 +166,14 @@ static struct armada_37xx_pin_group armada_37xx_nb_groups[] = {
 	PIN_GRP_GPIO("jtag", 20, 5, BIT(0), "jtag"),
 	PIN_GRP_GPIO("sdio0", 8, 3, BIT(1), "sdio"),
 	PIN_GRP_GPIO("emmc_nb", 27, 9, BIT(2), "emmc"),
-	PIN_GRP_GPIO("pwm0", 11, 1, BIT(3), "pwm"),
-	PIN_GRP_GPIO("pwm1", 12, 1, BIT(4), "pwm"),
-	PIN_GRP_GPIO("pwm2", 13, 1, BIT(5), "pwm"),
-	PIN_GRP_GPIO("pwm3", 14, 1, BIT(6), "pwm"),
+	PIN_GRP_GPIO_3("pwm0", 11, 1, BIT(3) | BIT(20), 0, BIT(20), BIT(3),
+		       "pwm", "led"),
+	PIN_GRP_GPIO_3("pwm1", 12, 1, BIT(4) | BIT(21), 0, BIT(21), BIT(4),
+		       "pwm", "led"),
+	PIN_GRP_GPIO_3("pwm2", 13, 1, BIT(5) | BIT(22), 0, BIT(22), BIT(5),
+		       "pwm", "led"),
+	PIN_GRP_GPIO_3("pwm3", 14, 1, BIT(6) | BIT(23), 0, BIT(23), BIT(6),
+		       "pwm", "led"),
 	PIN_GRP_GPIO("pmic1", 7, 1, BIT(7), "pmic"),
 	PIN_GRP_GPIO("pmic0", 6, 1, BIT(8), "pmic"),
 	PIN_GRP_GPIO("i2c2", 2, 2, BIT(9), "i2c"),
@@ -183,11 +187,6 @@ static struct armada_37xx_pin_group armada_37xx_nb_groups[] = {
 	PIN_GRP_EXTRA("uart2", 9, 2, BIT(1) | BIT(13) | BIT(14) | BIT(19),
 		      BIT(1) | BIT(13) | BIT(14), BIT(1) | BIT(19),
 		      18, 2, "gpio", "uart"),
-	PIN_GRP_GPIO_2("led0_od", 11, 1, BIT(20), BIT(20), 0, "led"),
-	PIN_GRP_GPIO_2("led1_od", 12, 1, BIT(21), BIT(21), 0, "led"),
-	PIN_GRP_GPIO_2("led2_od", 13, 1, BIT(22), BIT(22), 0, "led"),
-	PIN_GRP_GPIO_2("led3_od", 14, 1, BIT(23), BIT(23), 0, "led"),
-
 };
 
 static struct armada_37xx_pin_group armada_37xx_sb_groups[] = {

commit 44d9715fda1f6cd2e06a260edff40138850e94cd
Author: Gregory CLEMENT <gregory.clement@bootlin.com>
Date:   Thu Nov 25 00:04:57 2021 +0100

    pinctrl: armada-37xx: add missing pin: PCIe1 Wakeup
    
    commit 4d98fbaacd79a82f408febb66a9c42fe42361b16 upstream.
    
    Declare the PCIe1 Wakeup which was initially missing.
    
    Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
    Tested-by: Miquel Raynal <miquel.raynal@bootlin.com>
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c
index cf678ac22a95..adfb1d0d58dd 100644
--- a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c
+++ b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c
@@ -198,6 +198,7 @@ static struct armada_37xx_pin_group armada_37xx_sb_groups[] = {
 	PIN_GRP_GPIO("smi", 18, 2, BIT(4), "smi"),
 	PIN_GRP_GPIO("pcie1", 3, 1, BIT(5), "pcie"),
 	PIN_GRP_GPIO("pcie1_clkreq", 4, 1, BIT(9), "pcie"),
+	PIN_GRP_GPIO("pcie1_wakeup", 5, 1, BIT(10), "pcie"),
 	PIN_GRP_GPIO("ptp", 20, 3, BIT(11) | BIT(12) | BIT(13), "ptp"),
 	PIN_GRP("ptp_clk", 21, 1, BIT(6), "ptp", "mii"),
 	PIN_GRP("ptp_trig", 22, 1, BIT(7), "ptp", "mii"),

commit 601f8bf68a8f33445cde54ff39810f081f856c97
Author: Marek Behún <marek.behun@nic.cz>
Date:   Thu Nov 25 00:04:56 2021 +0100

    pinctrl: armada-37xx: Correct mpp definitions
    
    commit 823868fceae3bac07cf5eccb128d6916e7a5ae9d upstream.
    
    This is a cleanup and fix of the patch by Ken Ma <make@marvell.com>.
    
    Fix the mpp definitions according to newest revision of the
    specification:
      - northbridge:
        fix pmic1 gpio number to 7
        fix pmic0 gpio number to 6
      - southbridge
        split pcie1 group bit mask to BIT(5) and  BIT(9)
        fix ptp group bit mask to BIT(11) | BIT(12) | BIT(13)
        add smi group with bit mask BIT(4)
    
    [gregory: split the pcie group in 2, as at hardware level they can be
    configured separately]
    Signed-off-by: Marek Behún <marek.behun@nic.cz>
    Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
    Tested-by: Miquel Raynal <miquel.raynal@bootlin.com>
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Documentation/devicetree/bindings/pinctrl/marvell,armada-37xx-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/marvell,armada-37xx-pinctrl.txt
index c7c088d2dd50..f69f82741cae 100644
--- a/Documentation/devicetree/bindings/pinctrl/marvell,armada-37xx-pinctrl.txt
+++ b/Documentation/devicetree/bindings/pinctrl/marvell,armada-37xx-pinctrl.txt
@@ -58,11 +58,11 @@ group pwm3
  - functions pwm, gpio
 
 group pmic1
- - pin 17
+ - pin 7
  - functions pmic, gpio
 
 group pmic0
- - pin 16
+ - pin 6
  - functions pmic, gpio
 
 group i2c2
@@ -112,17 +112,25 @@ group usb2_drvvbus1
  - functions drvbus, gpio
 
 group sdio_sb
- - pins 60-64
+ - pins 60-65
  - functions sdio, gpio
 
 group rgmii
- - pins 42-55
+ - pins 42-53
  - functions mii, gpio
 
 group pcie1
- - pins 39-40
+ - pins 39
+ - functions pcie, gpio
+
+group pcie1_clkreq
+ - pins 40
  - functions pcie, gpio
 
+group smi
+ - pins 54-55
+ - functions smi, gpio
+
 group ptp
  - pins 56-58
  - functions ptp, gpio
diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c
index d76ac6b4b40d..cf678ac22a95 100644
--- a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c
+++ b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c
@@ -170,8 +170,8 @@ static struct armada_37xx_pin_group armada_37xx_nb_groups[] = {
 	PIN_GRP_GPIO("pwm1", 12, 1, BIT(4), "pwm"),
 	PIN_GRP_GPIO("pwm2", 13, 1, BIT(5), "pwm"),
 	PIN_GRP_GPIO("pwm3", 14, 1, BIT(6), "pwm"),
-	PIN_GRP_GPIO("pmic1", 17, 1, BIT(7), "pmic"),
-	PIN_GRP_GPIO("pmic0", 16, 1, BIT(8), "pmic"),
+	PIN_GRP_GPIO("pmic1", 7, 1, BIT(7), "pmic"),
+	PIN_GRP_GPIO("pmic0", 6, 1, BIT(8), "pmic"),
 	PIN_GRP_GPIO("i2c2", 2, 2, BIT(9), "i2c"),
 	PIN_GRP_GPIO("i2c1", 0, 2, BIT(10), "i2c"),
 	PIN_GRP_GPIO("spi_cs1", 17, 1, BIT(12), "spi"),
@@ -195,8 +195,10 @@ static struct armada_37xx_pin_group armada_37xx_sb_groups[] = {
 	PIN_GRP_GPIO("usb2_drvvbus1", 1, 1, BIT(1), "drvbus"),
 	PIN_GRP_GPIO("sdio_sb", 24, 6, BIT(2), "sdio"),
 	PIN_GRP_GPIO("rgmii", 6, 12, BIT(3), "mii"),
-	PIN_GRP_GPIO("pcie1", 3, 2, BIT(4), "pcie"),
-	PIN_GRP_GPIO("ptp", 20, 3, BIT(5), "ptp"),
+	PIN_GRP_GPIO("smi", 18, 2, BIT(4), "smi"),
+	PIN_GRP_GPIO("pcie1", 3, 1, BIT(5), "pcie"),
+	PIN_GRP_GPIO("pcie1_clkreq", 4, 1, BIT(9), "pcie"),
+	PIN_GRP_GPIO("ptp", 20, 3, BIT(11) | BIT(12) | BIT(13), "ptp"),
 	PIN_GRP("ptp_clk", 21, 1, BIT(6), "ptp", "mii"),
 	PIN_GRP("ptp_trig", 22, 1, BIT(7), "ptp", "mii"),
 	PIN_GRP_GPIO_3("mii_col", 23, 1, BIT(8) | BIT(14), 0, BIT(8), BIT(14),

commit 5973eb634d04bea50db26d644a18a46cd3de3dfa
Author: Pali Rohár <pali@kernel.org>
Date:   Thu Nov 25 00:04:55 2021 +0100

    PCI: aardvark: Fix checking for link up via LTSSM state
    
    commit 661c399a651c11aaf83c45cbfe0b4a1fb7bc3179 upstream.
    
    Current implementation of advk_pcie_link_up() is wrong as it marks also
    link disabled or hot reset states as link up.
    
    Fix it by marking link up only to those states which are defined in PCIe
    Base specification 3.0, Table 4-14: Link Status Mapped to the LTSSM.
    
    To simplify implementation, Define macros for every LTSSM state which
    aardvark hardware can return in CFG_REG register.
    
    Fix also checking for link training according to the same Table 4-14.
    Define a new function advk_pcie_link_training() for this purpose.
    
    Link: https://lore.kernel.org/r/20211005180952.6812-13-kabel@kernel.org
    Fixes: 8c39d710363c ("PCI: aardvark: Add Aardvark PCI host controller driver")
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Reviewed-by: Marek Behún <kabel@kernel.org>
    Cc: stable@vger.kernel.org
    Cc: Remi Pommarel <repk@triplefau.lt>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index 847060e76e5c..e6d60fa2217d 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -151,9 +151,50 @@
 #define CFG_REG					(LMI_BASE_ADDR + 0x0)
 #define     LTSSM_SHIFT				24
 #define     LTSSM_MASK				0x3f
-#define     LTSSM_L0				0x10
 #define     RC_BAR_CONFIG			0x300
 
+/* LTSSM values in CFG_REG */
+enum {
+	LTSSM_DETECT_QUIET			= 0x0,
+	LTSSM_DETECT_ACTIVE			= 0x1,
+	LTSSM_POLLING_ACTIVE			= 0x2,
+	LTSSM_POLLING_COMPLIANCE		= 0x3,
+	LTSSM_POLLING_CONFIGURATION		= 0x4,
+	LTSSM_CONFIG_LINKWIDTH_START		= 0x5,
+	LTSSM_CONFIG_LINKWIDTH_ACCEPT		= 0x6,
+	LTSSM_CONFIG_LANENUM_ACCEPT		= 0x7,
+	LTSSM_CONFIG_LANENUM_WAIT		= 0x8,
+	LTSSM_CONFIG_COMPLETE			= 0x9,
+	LTSSM_CONFIG_IDLE			= 0xa,
+	LTSSM_RECOVERY_RCVR_LOCK		= 0xb,
+	LTSSM_RECOVERY_SPEED			= 0xc,
+	LTSSM_RECOVERY_RCVR_CFG			= 0xd,
+	LTSSM_RECOVERY_IDLE			= 0xe,
+	LTSSM_L0				= 0x10,
+	LTSSM_RX_L0S_ENTRY			= 0x11,
+	LTSSM_RX_L0S_IDLE			= 0x12,
+	LTSSM_RX_L0S_FTS			= 0x13,
+	LTSSM_TX_L0S_ENTRY			= 0x14,
+	LTSSM_TX_L0S_IDLE			= 0x15,
+	LTSSM_TX_L0S_FTS			= 0x16,
+	LTSSM_L1_ENTRY				= 0x17,
+	LTSSM_L1_IDLE				= 0x18,
+	LTSSM_L2_IDLE				= 0x19,
+	LTSSM_L2_TRANSMIT_WAKE			= 0x1a,
+	LTSSM_DISABLED				= 0x20,
+	LTSSM_LOOPBACK_ENTRY_MASTER		= 0x21,
+	LTSSM_LOOPBACK_ACTIVE_MASTER		= 0x22,
+	LTSSM_LOOPBACK_EXIT_MASTER		= 0x23,
+	LTSSM_LOOPBACK_ENTRY_SLAVE		= 0x24,
+	LTSSM_LOOPBACK_ACTIVE_SLAVE		= 0x25,
+	LTSSM_LOOPBACK_EXIT_SLAVE		= 0x26,
+	LTSSM_HOT_RESET				= 0x27,
+	LTSSM_RECOVERY_EQUALIZATION_PHASE0	= 0x28,
+	LTSSM_RECOVERY_EQUALIZATION_PHASE1	= 0x29,
+	LTSSM_RECOVERY_EQUALIZATION_PHASE2	= 0x2a,
+	LTSSM_RECOVERY_EQUALIZATION_PHASE3	= 0x2b,
+};
+
 /* PCIe core controller registers */
 #define CTRL_CORE_BASE_ADDR			0x18000
 #define CTRL_CONFIG_REG				(CTRL_CORE_BASE_ADDR + 0x0)
@@ -247,13 +288,35 @@ static inline u32 advk_readl(struct advk_pcie *pcie, u64 reg)
 	return readl(pcie->base + reg);
 }
 
-static int advk_pcie_link_up(struct advk_pcie *pcie)
+static u8 advk_pcie_ltssm_state(struct advk_pcie *pcie)
 {
-	u32 val, ltssm_state;
+	u32 val;
+	u8 ltssm_state;
 
 	val = advk_readl(pcie, CFG_REG);
 	ltssm_state = (val >> LTSSM_SHIFT) & LTSSM_MASK;
-	return ltssm_state >= LTSSM_L0;
+	return ltssm_state;
+}
+
+static inline bool advk_pcie_link_up(struct advk_pcie *pcie)
+{
+	/* check if LTSSM is in normal operation - some L* state */
+	u8 ltssm_state = advk_pcie_ltssm_state(pcie);
+	return ltssm_state >= LTSSM_L0 && ltssm_state < LTSSM_DISABLED;
+}
+
+static inline bool advk_pcie_link_training(struct advk_pcie *pcie)
+{
+	/*
+	  * According to PCIe Base specification 3.0, Table 4-14: Link
+	  * Status Mapped to the LTSSM is Link Training mapped to LTSSM
+	  * Configuration and Recovery states.
+	  */
+	u8 ltssm_state = advk_pcie_ltssm_state(pcie);
+	return ((ltssm_state >= LTSSM_CONFIG_LINKWIDTH_START &&
+		  ltssm_state < LTSSM_L0) ||
+		(ltssm_state >= LTSSM_RECOVERY_EQUALIZATION_PHASE0 &&
+		  ltssm_state <= LTSSM_RECOVERY_EQUALIZATION_PHASE3));
 }
 
 static int advk_pcie_wait_for_link(struct advk_pcie *pcie)

commit 3f157850460a45b24acf8541377bd3edbd49acda
Author: Pali Rohár <pali@kernel.org>
Date:   Thu Nov 25 00:04:54 2021 +0100

    PCI: aardvark: Fix link training
    
    commit f76b36d40beee0a13aa8f6aa011df0d7cbbb8a7f upstream.
    
    Fix multiple link training issues in aardvark driver. The main reason of
    these issues was misunderstanding of what certain registers do, since their
    names and comments were misleading: before commit 96be36dbffac ("PCI:
    aardvark: Replace custom macros by standard linux/pci_regs.h macros"), the
    pci-aardvark.c driver used custom macros for accessing standard PCIe Root
    Bridge registers, and misleading comments did not help to understand what
    the code was really doing.
    
    After doing more tests and experiments I've come to the conclusion that the
    SPEED_GEN register in aardvark sets the PCIe revision / generation
    compliance and forces maximal link speed. Both GEN3 and GEN2 values set the
    read-only PCI_EXP_FLAGS_VERS bits (PCIe capabilities version of Root
    Bridge) to value 2, while GEN1 value sets PCI_EXP_FLAGS_VERS to 1, which
    matches with PCI Express specifications revisions 3, 2 and 1 respectively.
    Changing SPEED_GEN also sets the read-only bits PCI_EXP_LNKCAP_SLS and
    PCI_EXP_LNKCAP2_SLS to corresponding speed.
    
    (Note that PCI Express rev 1 specification does not define PCI_EXP_LNKCAP2
     and PCI_EXP_LNKCTL2 registers and when SPEED_GEN is set to GEN1 (which
     also sets PCI_EXP_FLAGS_VERS set to 1), lspci cannot access
     PCI_EXP_LNKCAP2 and PCI_EXP_LNKCTL2 registers.)
    
    Changing PCIe link speed can be done via PCI_EXP_LNKCTL2_TLS bits of
    PCI_EXP_LNKCTL2 register. Armada 3700 Functional Specifications says that
    the default value of PCI_EXP_LNKCTL2_TLS is based on SPEED_GEN value, but
    tests showed that the default value is always 8.0 GT/s, independently of
    speed set by SPEED_GEN. So after setting SPEED_GEN, we must also set value
    in PCI_EXP_LNKCTL2 register via PCI_EXP_LNKCTL2_TLS bits.
    
    Triggering PCI_EXP_LNKCTL_RL bit immediately after setting LINK_TRAINING_EN
    bit actually doesn't do anything. Tests have shown that a delay is needed
    after enabling LINK_TRAINING_EN bit. As triggering PCI_EXP_LNKCTL_RL
    currently does nothing, remove it.
    
    Commit 43fc679ced18 ("PCI: aardvark: Improve link training") introduced
    code which sets SPEED_GEN register based on negotiated link speed from
    PCI_EXP_LNKSTA_CLS bits of PCI_EXP_LNKSTA register. This code was added to
    fix detection of Compex WLE900VX (Atheros QCA9880) WiFi GEN1 PCIe cards, as
    otherwise these cards were "invisible" on PCIe bus (probably because they
    crashed). But apparently more people reported the same issues with these
    cards also with other PCIe controllers [1] and I was able to reproduce this
    issue also with other "noname" WiFi cards based on Atheros QCA9890 chip
    (with the same PCI vendor/device ids as Atheros QCA9880). So this is not an
    issue in aardvark but rather an issue in Atheros QCA98xx chips. Also, this
    issue only exists if the kernel is compiled with PCIe ASPM support, and a
    generic workaround for this is to change PCIe Bridge to 2.5 GT/s link speed
    via PCI_EXP_LNKCTL2_TLS_2_5GT bits in PCI_EXP_LNKCTL2 register [2], before
    triggering PCI_EXP_LNKCTL_RL bit. This workaround also works when SPEED_GEN
    is set to value GEN2 (5 GT/s). So remove this hack completely in the
    aardvark driver and always set SPEED_GEN to value from 'max-link-speed' DT
    property. Fix for Atheros QCA98xx chips is handled separately by patch [2].
    
    These two things (code for triggering PCI_EXP_LNKCTL_RL bit and changing
    SPEED_GEN value) also explain why commit 6964494582f5 ("PCI: aardvark:
    Train link immediately after enabling training") somehow fixed detection of
    those problematic Compex cards with Atheros chips: if triggering link
    retraining (via PCI_EXP_LNKCTL_RL bit) was done immediately after enabling
    link training (via LINK_TRAINING_EN), it did nothing. If there was a
    specific delay, aardvark HW already initialized PCIe link and therefore
    triggering link retraining caused the above issue. Compex cards triggered
    link down event and disappeared from the PCIe bus.
    
    Commit f4c7d053d7f7 ("PCI: aardvark: Wait for endpoint to be ready before
    training link") added 100ms sleep before calling 'Start link training'
    command and explained that it is a requirement of PCI Express
    specification. But the code after this 100ms sleep was not doing 'Start
    link training', rather it triggered PCI_EXP_LNKCTL_RL bit via PCIe Root
    Bridge to put link into Recovery state.
    
    The required delay after fundamental reset is already done in function
    advk_pcie_wait_for_link() which also checks whether PCIe link is up.
    So after removing the code which triggers PCI_EXP_LNKCTL_RL bit on PCIe
    Root Bridge, there is no need to wait 100ms again. Remove the extra
    msleep() call and update comment about the delay required by the PCI
    Express specification.
    
    According to Marvell Armada 3700 Functional Specifications, Link training
    should be enabled via aardvark register LINK_TRAINING_EN after selecting
    PCIe generation and x1 lane. There is no need to disable it prior resetting
    card via PERST# signal. This disabling code was introduced in commit
    5169a9851daa ("PCI: aardvark: Issue PERST via GPIO") as a workaround for
    some Atheros cards. It turns out that this also is Atheros specific issue
    and affects any PCIe controller, not only aardvark. Moreover this Atheros
    issue was triggered by juggling with PCI_EXP_LNKCTL_RL, LINK_TRAINING_EN
    and SPEED_GEN bits interleaved with sleeps. Now, after removing triggering
    PCI_EXP_LNKCTL_RL, there is no need to explicitly disable LINK_TRAINING_EN
    bit. So remove this code too. The problematic Compex cards described in
    previous git commits are correctly detected in advk_pcie_train_link()
    function even after applying all these changes.
    
    Note that with this patch, and also prior this patch, some NVMe disks which
    support PCIe GEN3 with 8 GT/s speed are negotiated only at the lowest link
    speed 2.5 GT/s, independently of SPEED_GEN value. After manually triggering
    PCI_EXP_LNKCTL_RL bit (e.g. from userspace via setpci), these NVMe disks
    change link speed to 5 GT/s when SPEED_GEN was configured to GEN2. This
    issue first needs to be properly investigated. I will send a fix in the
    future.
    
    On the other hand, some other GEN2 PCIe cards with 5 GT/s speed are
    autonomously by HW autonegotiated at full 5 GT/s speed without need of any
    software interaction.
    
    Armada 3700 Functional Specifications describes the following steps for
    link training: set SPEED_GEN to GEN2, enable LINK_TRAINING_EN, poll until
    link training is complete, trigger PCI_EXP_LNKCTL_RL, poll until signal
    rate is 5 GT/s, poll until link training is complete, enable ASPM L0s.
    
    The requirement for triggering PCI_EXP_LNKCTL_RL can be explained by the
    need to achieve 5 GT/s speed (as changing link speed is done by throw to
    recovery state entered by PCI_EXP_LNKCTL_RL) or maybe as a part of enabling
    ASPM L0s (but in this case ASPM L0s should have been enabled prior
    PCI_EXP_LNKCTL_RL).
    
    It is unknown why the original pci-aardvark.c driver was triggering
    PCI_EXP_LNKCTL_RL bit before waiting for the link to be up. This does not
    align with neither PCIe base specifications nor with Armada 3700 Functional
    Specification. (Note that in older versions of aardvark, this bit was
    called incorrectly PCIE_CORE_LINK_TRAINING, so this may be the reason.)
    
    It is also unknown why Armada 3700 Functional Specification says that it is
    needed to trigger PCI_EXP_LNKCTL_RL for GEN2 mode, as according to PCIe
    base specification 5 GT/s speed negotiation is supposed to be entirely
    autonomous, even if initial speed is 2.5 GT/s.
    
    [1] - https://lore.kernel.org/linux-pci/87h7l8axqp.fsf@toke.dk/
    [2] - https://lore.kernel.org/linux-pci/20210326124326.21163-1-pali@kernel.org/
    
    Link: https://lore.kernel.org/r/20211005180952.6812-12-kabel@kernel.org
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Reviewed-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index 4789f4692a5f..847060e76e5c 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -247,11 +247,6 @@ static inline u32 advk_readl(struct advk_pcie *pcie, u64 reg)
 	return readl(pcie->base + reg);
 }
 
-static inline u16 advk_read16(struct advk_pcie *pcie, u64 reg)
-{
-	return advk_readl(pcie, (reg & ~0x3)) >> ((reg & 0x3) * 8);
-}
-
 static int advk_pcie_link_up(struct advk_pcie *pcie)
 {
 	u32 val, ltssm_state;
@@ -278,23 +273,9 @@ static int advk_pcie_wait_for_link(struct advk_pcie *pcie)
 
 static void advk_pcie_issue_perst(struct advk_pcie *pcie)
 {
-	u32 reg;
-
 	if (!pcie->reset_gpio)
 		return;
 
-	/*
-	 * As required by PCI Express spec (PCI Express Base Specification, REV.
-	 * 4.0 PCI Express, February 19 2014, 6.6.1 Conventional Reset) a delay
-	 * for at least 100ms after de-asserting PERST# signal is needed before
-	 * link training is enabled. So ensure that link training is disabled
-	 * prior de-asserting PERST# signal to fulfill that PCI Express spec
-	 * requirement.
-	 */
-	reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
-	reg &= ~LINK_TRAINING_EN;
-	advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
-
 	/* 10ms delay is needed for some cards */
 	dev_info(&pcie->pdev->dev, "issuing PERST via reset GPIO for 10ms\n");
 	gpiod_set_value_cansleep(pcie->reset_gpio, 1);
@@ -302,53 +283,46 @@ static void advk_pcie_issue_perst(struct advk_pcie *pcie)
 	gpiod_set_value_cansleep(pcie->reset_gpio, 0);
 }
 
-static int advk_pcie_train_at_gen(struct advk_pcie *pcie, int gen)
+static void advk_pcie_train_link(struct advk_pcie *pcie)
 {
-	int ret, neg_gen;
+	struct device *dev = &pcie->pdev->dev;
 	u32 reg;
+	int ret;
 
-	/* Setup link speed */
+	/*
+	 * Setup PCIe rev / gen compliance based on device tree property
+	 * 'max-link-speed' which also forces maximal link speed.
+	 */
 	reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
 	reg &= ~PCIE_GEN_SEL_MSK;
-	if (gen == 3)
+	if (pcie->link_gen == 3)
 		reg |= SPEED_GEN_3;
-	else if (gen == 2)
+	else if (pcie->link_gen == 2)
 		reg |= SPEED_GEN_2;
 	else
 		reg |= SPEED_GEN_1;
 	advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
 
 	/*
-	 * Enable link training. This is not needed in every call to this
-	 * function, just once suffices, but it does not break anything either.
+	 * Set maximal link speed value also into PCIe Link Control 2 register.
+	 * Armada 3700 Functional Specification says that default value is based
+	 * on SPEED_GEN but tests showed that default value is always 8.0 GT/s.
 	 */
+	reg = advk_readl(pcie, PCIE_CORE_PCIEXP_CAP + PCI_EXP_LNKCTL2);
+	reg &= ~PCI_EXP_LNKCTL2_TLS;
+	if (pcie->link_gen == 3)
+		reg |= PCI_EXP_LNKCTL2_TLS_8_0GT;
+	else if (pcie->link_gen == 2)
+		reg |= PCI_EXP_LNKCTL2_TLS_5_0GT;
+	else
+		reg |= PCI_EXP_LNKCTL2_TLS_2_5GT;
+	advk_writel(pcie, reg, PCIE_CORE_PCIEXP_CAP + PCI_EXP_LNKCTL2);
+
+	/* Enable link training after selecting PCIe generation */
 	reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
 	reg |= LINK_TRAINING_EN;
 	advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
 
-	/*
-	 * Start link training immediately after enabling it.
-	 * This solves problems for some buggy cards.
-	 */
-	reg = advk_readl(pcie, PCIE_CORE_PCIEXP_CAP + PCI_EXP_LNKCTL);
-	reg |= PCI_EXP_LNKCTL_RL;
-	advk_writel(pcie, reg, PCIE_CORE_PCIEXP_CAP + PCI_EXP_LNKCTL);
-
-	ret = advk_pcie_wait_for_link(pcie);
-	if (ret)
-		return ret;
-
-	reg = advk_read16(pcie, PCIE_CORE_PCIEXP_CAP + PCI_EXP_LNKSTA);
-	neg_gen = reg & PCI_EXP_LNKSTA_CLS;
-
-	return neg_gen;
-}
-
-static void advk_pcie_train_link(struct advk_pcie *pcie)
-{
-	struct device *dev = &pcie->pdev->dev;
-	int neg_gen = -1, gen;
-
 	/*
 	 * Reset PCIe card via PERST# signal. Some cards are not detected
 	 * during link training when they are in some non-initial state.
@@ -359,41 +333,18 @@ static void advk_pcie_train_link(struct advk_pcie *pcie)
 	 * PERST# signal could have been asserted by pinctrl subsystem before
 	 * probe() callback has been called or issued explicitly by reset gpio
 	 * function advk_pcie_issue_perst(), making the endpoint going into
-	 * fundamental reset. As required by PCI Express spec a delay for at
-	 * least 100ms after such a reset before link training is needed.
+	 * fundamental reset. As required by PCI Express spec (PCI Express
+	 * Base Specification, REV. 4.0 PCI Express, February 19 2014, 6.6.1
+	 * Conventional Reset) a delay for at least 100ms after such a reset
+	 * before sending a Configuration Request to the device is needed.
+	 * So wait until PCIe link is up. Function advk_pcie_wait_for_link()
+	 * waits for link at least 900ms.
 	 */
-	msleep(PCI_PM_D3COLD_WAIT);
-
-	/*
-	 * Try link training at link gen specified by device tree property
-	 * 'max-link-speed'. If this fails, iteratively train at lower gen.
-	 */
-	for (gen = pcie->link_gen; gen > 0; --gen) {
-		neg_gen = advk_pcie_train_at_gen(pcie, gen);
-		if (neg_gen > 0)
-			break;
-	}
-
-	if (neg_gen < 0)
-		goto err;
-
-	/*
-	 * After successful training if negotiated gen is lower than requested,
-	 * train again on negotiated gen. This solves some stability issues for
-	 * some buggy gen1 cards.
-	 */
-	if (neg_gen < gen) {
-		gen = neg_gen;
-		neg_gen = advk_pcie_train_at_gen(pcie, gen);
-	}
-
-	if (neg_gen == gen) {
-		dev_info(dev, "link up at gen %i\n", gen);
-		return;
-	}
-
-err:
-	dev_err(dev, "link never came up\n");
+	ret = advk_pcie_wait_for_link(pcie);
+	if (ret < 0)
+		dev_err(dev, "link never came up\n");
+	else
+		dev_info(dev, "link up\n");
 }
 
 /*

commit 6a50aee373a2d09cb920d1d53c4c3fe7f43165d6
Author: Pali Rohár <pali@kernel.org>
Date:   Thu Nov 25 00:04:53 2021 +0100

    PCI: aardvark: Fix PCIe Max Payload Size setting
    
    commit a4e17d65dafdd3513042d8f00404c9b6068a825c upstream.
    
    Change PCIe Max Payload Size setting in PCIe Device Control register to 512
    bytes to align with PCIe Link Initialization sequence as defined in Marvell
    Armada 3700 Functional Specification. According to the specification,
    maximal Max Payload Size supported by this device is 512 bytes.
    
    Without this kernel prints suspicious line:
    
        pci 0000:01:00.0: Upstream bridge's Max Payload Size set to 256 (was 16384, max 512)
    
    With this change it changes to:
    
        pci 0000:01:00.0: Upstream bridge's Max Payload Size set to 256 (was 512, max 512)
    
    Link: https://lore.kernel.org/r/20211005180952.6812-3-kabel@kernel.org
    Fixes: 8c39d710363c ("PCI: aardvark: Add Aardvark PCI host controller driver")
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Reviewed-by: Marek Behún <kabel@kernel.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index dd3bf2ece6b6..4789f4692a5f 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -452,8 +452,9 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
 	reg = advk_readl(pcie, PCIE_CORE_PCIEXP_CAP + PCI_EXP_DEVCTL);
 	reg &= ~PCI_EXP_DEVCTL_RELAX_EN;
 	reg &= ~PCI_EXP_DEVCTL_NOSNOOP_EN;
+	reg &= ~PCI_EXP_DEVCTL_PAYLOAD;
 	reg &= ~PCI_EXP_DEVCTL_READRQ;
-	reg |= PCI_EXP_DEVCTL_PAYLOAD; /* Set max payload size */
+	reg |= PCI_EXP_DEVCTL_PAYLOAD_512B;
 	reg |= PCI_EXP_DEVCTL_READRQ_512B;
 	advk_writel(pcie, reg, PCIE_CORE_PCIEXP_CAP + PCI_EXP_DEVCTL);
 

commit e7d212111df5da4ee891089b1a80c8819f3429a8
Author: Pali Rohár <pali@kernel.org>
Date:   Thu Nov 25 00:04:52 2021 +0100

    PCI: aardvark: Configure PCIe resources from 'ranges' DT property
    
    commit 64f160e19e9264a7f6d89c516baae1473b6f8359 upstream.
    
    In commit 6df6ba974a55 ("PCI: aardvark: Remove PCIe outbound window
    configuration") was removed aardvark PCIe outbound window configuration and
    commit description said that was recommended solution by HW designers.
    
    But that commit completely removed support for configuring PCIe IO
    resources without removing PCIe IO 'ranges' from DTS files. After that
    commit PCIe IO space started to be treated as PCIe MEM space and accessing
    it just caused kernel crash.
    
    Moreover implementation of PCIe outbound windows prior that commit was
    incorrect. It completely ignored offset between CPU address and PCIe bus
    address and expected that in DTS is CPU address always same as PCIe bus
    address without doing any checks. Also it completely ignored size of every
    PCIe resource specified in 'ranges' DTS property and expected that every
    PCIe resource has size 128 MB (also for PCIe IO range). Again without any
    check. Apparently none of PCIe resource has in DTS specified size of 128
    MB. So it was completely broken and thanks to how aardvark mask works,
    configuration was completely ignored.
    
    This patch reverts back support for PCIe outbound window configuration but
    implementation is a new without issues mentioned above. PCIe outbound
    window is required when DTS specify in 'ranges' property non-zero offset
    between CPU and PCIe address space. To address recommendation by HW
    designers as specified in commit description of 6df6ba974a55, set default
    outbound parameters as PCIe MEM access without translation and therefore
    for this PCIe 'ranges' it is not needed to configure PCIe outbound window.
    For PCIe IO space is needed to configure aardvark PCIe outbound window.
    
    This patch fixes kernel crash when trying to access PCIe IO space.
    
    Link: https://lore.kernel.org/r/20210624215546.4015-2-pali@kernel.org
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Cc: stable@vger.kernel.org # 6df6ba974a55 ("PCI: aardvark: Remove PCIe outbound window configuration")
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index b4b9cebf09b4..dd3bf2ece6b6 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -106,6 +106,46 @@
 #define PCIE_MSI_PAYLOAD_REG			(CONTROL_BASE_ADDR + 0x9C)
 #define     PCIE_MSI_DATA_MASK			GENMASK(15, 0)
 
+/* PCIe window configuration */
+#define OB_WIN_BASE_ADDR			0x4c00
+#define OB_WIN_BLOCK_SIZE			0x20
+#define OB_WIN_COUNT				8
+#define OB_WIN_REG_ADDR(win, offset)		(OB_WIN_BASE_ADDR + \
+						  OB_WIN_BLOCK_SIZE * (win) + \
+						  (offset))
+#define OB_WIN_MATCH_LS(win)			OB_WIN_REG_ADDR(win, 0x00)
+#define     OB_WIN_ENABLE			BIT(0)
+#define OB_WIN_MATCH_MS(win)			OB_WIN_REG_ADDR(win, 0x04)
+#define OB_WIN_REMAP_LS(win)			OB_WIN_REG_ADDR(win, 0x08)
+#define OB_WIN_REMAP_MS(win)			OB_WIN_REG_ADDR(win, 0x0c)
+#define OB_WIN_MASK_LS(win)			OB_WIN_REG_ADDR(win, 0x10)
+#define OB_WIN_MASK_MS(win)			OB_WIN_REG_ADDR(win, 0x14)
+#define OB_WIN_ACTIONS(win)			OB_WIN_REG_ADDR(win, 0x18)
+#define OB_WIN_DEFAULT_ACTIONS			(OB_WIN_ACTIONS(OB_WIN_COUNT-1) + 0x4)
+#define     OB_WIN_FUNC_NUM_MASK		GENMASK(31, 24)
+#define     OB_WIN_FUNC_NUM_SHIFT		24
+#define     OB_WIN_FUNC_NUM_ENABLE		BIT(23)
+#define     OB_WIN_BUS_NUM_BITS_MASK		GENMASK(22, 20)
+#define     OB_WIN_BUS_NUM_BITS_SHIFT		20
+#define     OB_WIN_MSG_CODE_ENABLE		BIT(22)
+#define     OB_WIN_MSG_CODE_MASK		GENMASK(21, 14)
+#define     OB_WIN_MSG_CODE_SHIFT		14
+#define     OB_WIN_MSG_PAYLOAD_LEN		BIT(12)
+#define     OB_WIN_ATTR_ENABLE			BIT(11)
+#define     OB_WIN_ATTR_TC_MASK			GENMASK(10, 8)
+#define     OB_WIN_ATTR_TC_SHIFT		8
+#define     OB_WIN_ATTR_RELAXED			BIT(7)
+#define     OB_WIN_ATTR_NOSNOOP			BIT(6)
+#define     OB_WIN_ATTR_POISON			BIT(5)
+#define     OB_WIN_ATTR_IDO			BIT(4)
+#define     OB_WIN_TYPE_MASK			GENMASK(3, 0)
+#define     OB_WIN_TYPE_SHIFT			0
+#define     OB_WIN_TYPE_MEM			0x0
+#define     OB_WIN_TYPE_IO			0x4
+#define     OB_WIN_TYPE_CONFIG_TYPE0		0x8
+#define     OB_WIN_TYPE_CONFIG_TYPE1		0x9
+#define     OB_WIN_TYPE_MSG			0xc
+
 /* LMI registers base address and register offsets */
 #define LMI_BASE_ADDR				0x6000
 #define CFG_REG					(LMI_BASE_ADDR + 0x0)
@@ -174,6 +214,13 @@ struct advk_pcie {
 	struct platform_device *pdev;
 	void __iomem *base;
 	struct list_head resources;
+	struct {
+		phys_addr_t match;
+		phys_addr_t remap;
+		phys_addr_t mask;
+		u32 actions;
+	} wins[OB_WIN_COUNT];
+	u8 wins_count;
 	struct irq_domain *irq_domain;
 	struct irq_chip irq_chip;
 	raw_spinlock_t irq_lock;
@@ -349,9 +396,39 @@ static void advk_pcie_train_link(struct advk_pcie *pcie)
 	dev_err(dev, "link never came up\n");
 }
 
+/*
+ * Set PCIe address window register which could be used for memory
+ * mapping.
+ */
+static void advk_pcie_set_ob_win(struct advk_pcie *pcie, u8 win_num,
+				 phys_addr_t match, phys_addr_t remap,
+				 phys_addr_t mask, u32 actions)
+{
+	advk_writel(pcie, OB_WIN_ENABLE |
+			  lower_32_bits(match), OB_WIN_MATCH_LS(win_num));
+	advk_writel(pcie, upper_32_bits(match), OB_WIN_MATCH_MS(win_num));
+	advk_writel(pcie, lower_32_bits(remap), OB_WIN_REMAP_LS(win_num));
+	advk_writel(pcie, upper_32_bits(remap), OB_WIN_REMAP_MS(win_num));
+	advk_writel(pcie, lower_32_bits(mask), OB_WIN_MASK_LS(win_num));
+	advk_writel(pcie, upper_32_bits(mask), OB_WIN_MASK_MS(win_num));
+	advk_writel(pcie, actions, OB_WIN_ACTIONS(win_num));
+}
+
+static void advk_pcie_disable_ob_win(struct advk_pcie *pcie, u8 win_num)
+{
+	advk_writel(pcie, 0, OB_WIN_MATCH_LS(win_num));
+	advk_writel(pcie, 0, OB_WIN_MATCH_MS(win_num));
+	advk_writel(pcie, 0, OB_WIN_REMAP_LS(win_num));
+	advk_writel(pcie, 0, OB_WIN_REMAP_MS(win_num));
+	advk_writel(pcie, 0, OB_WIN_MASK_LS(win_num));
+	advk_writel(pcie, 0, OB_WIN_MASK_MS(win_num));
+	advk_writel(pcie, 0, OB_WIN_ACTIONS(win_num));
+}
+
 static void advk_pcie_setup_hw(struct advk_pcie *pcie)
 {
 	u32 reg;
+	int i;
 
 	/* Set to Direct mode */
 	reg = advk_readl(pcie, CTRL_CONFIG_REG);
@@ -415,15 +492,51 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
 	reg = PCIE_IRQ_ALL_MASK & (~PCIE_IRQ_ENABLE_INTS_MASK);
 	advk_writel(pcie, reg, HOST_CTRL_INT_MASK_REG);
 
+	/*
+	 * Enable AXI address window location generation:
+	 * When it is enabled, the default outbound window
+	 * configurations (Default User Field: 0xD0074CFC)
+	 * are used to transparent address translation for
+	 * the outbound transactions. Thus, PCIe address
+	 * windows are not required for transparent memory
+	 * access when default outbound window configuration
+	 * is set for memory access.
+	 */
 	reg = advk_readl(pcie, PCIE_CORE_CTRL2_REG);
 	reg |= PCIE_CORE_CTRL2_OB_WIN_ENABLE;
 	advk_writel(pcie, reg, PCIE_CORE_CTRL2_REG);
 
-	/* Bypass the address window mapping for PIO */
+	/*
+	 * Set memory access in Default User Field so it
+	 * is not required to configure PCIe address for
+	 * transparent memory access.
+	 */
+	advk_writel(pcie, OB_WIN_TYPE_MEM, OB_WIN_DEFAULT_ACTIONS);
+
+	/*
+	 * Bypass the address window mapping for PIO:
+	 * Since PIO access already contains all required
+	 * info over AXI interface by PIO registers, the
+	 * address window is not required.
+	 */
 	reg = advk_readl(pcie, PIO_CTRL);
 	reg |= PIO_CTRL_ADDR_WIN_DISABLE;
 	advk_writel(pcie, reg, PIO_CTRL);
 
+	/*
+	 * Configure PCIe address windows for non-memory or
+	 * non-transparent access as by default PCIe uses
+	 * transparent memory access.
+	 */
+	for (i = 0; i < pcie->wins_count; i++)
+		advk_pcie_set_ob_win(pcie, i,
+				     pcie->wins[i].match, pcie->wins[i].remap,
+				     pcie->wins[i].mask, pcie->wins[i].actions);
+
+	/* Disable remaining PCIe outbound windows */
+	for (i = pcie->wins_count; i < OB_WIN_COUNT; i++)
+		advk_pcie_disable_ob_win(pcie, i);
+
 	advk_pcie_train_link(pcie);
 
 	reg = advk_readl(pcie, PCIE_CORE_CMD_STATUS_REG);
@@ -1038,6 +1151,7 @@ static int advk_pcie_probe(struct platform_device *pdev)
 	struct advk_pcie *pcie;
 	struct resource *res;
 	struct pci_host_bridge *bridge;
+	struct resource_entry *entry;
 	int ret, irq;
 
 	bridge = devm_pci_alloc_host_bridge(dev, sizeof(struct advk_pcie));
@@ -1067,6 +1181,80 @@ static int advk_pcie_probe(struct platform_device *pdev)
 		return ret;
 	}
 
+	resource_list_for_each_entry(entry, &pcie->resources) {
+		resource_size_t start = entry->res->start;
+		resource_size_t size = resource_size(entry->res);
+		unsigned long type = resource_type(entry->res);
+		u64 win_size;
+
+		/*
+		 * Aardvark hardware allows to configure also PCIe window
+		 * for config type 0 and type 1 mapping, but driver uses
+		 * only PIO for issuing configuration transfers which does
+		 * not use PCIe window configuration.
+		 */
+		if (type != IORESOURCE_MEM && type != IORESOURCE_MEM_64 &&
+		    type != IORESOURCE_IO)
+			continue;
+
+		/*
+		 * Skip transparent memory resources. Default outbound access
+		 * configuration is set to transparent memory access so it
+		 * does not need window configuration.
+		 */
+		if ((type == IORESOURCE_MEM || type == IORESOURCE_MEM_64) &&
+		    entry->offset == 0)
+			continue;
+
+		/*
+		 * The n-th PCIe window is configured by tuple (match, remap, mask)
+		 * and an access to address A uses this window if A matches the
+		 * match with given mask.
+		 * So every PCIe window size must be a power of two and every start
+		 * address must be aligned to window size. Minimal size is 64 KiB
+		 * because lower 16 bits of mask must be zero. Remapped address
+		 * may have set only bits from the mask.
+		 */
+		while (pcie->wins_count < OB_WIN_COUNT && size > 0) {
+			/* Calculate the largest aligned window size */
+			win_size = (1ULL << (fls64(size)-1)) |
+				   (start ? (1ULL << __ffs64(start)) : 0);
+			win_size = 1ULL << __ffs64(win_size);
+			if (win_size < 0x10000)
+				break;
+
+			dev_dbg(dev,
+				"Configuring PCIe window %d: [0x%llx-0x%llx] as %lu\n",
+				pcie->wins_count, (unsigned long long)start,
+				(unsigned long long)start + win_size, type);
+
+			if (type == IORESOURCE_IO) {
+				pcie->wins[pcie->wins_count].actions = OB_WIN_TYPE_IO;
+				pcie->wins[pcie->wins_count].match = pci_pio_to_address(start);
+			} else {
+				pcie->wins[pcie->wins_count].actions = OB_WIN_TYPE_MEM;
+				pcie->wins[pcie->wins_count].match = start;
+			}
+			pcie->wins[pcie->wins_count].remap = start - entry->offset;
+			pcie->wins[pcie->wins_count].mask = ~(win_size - 1);
+
+			if (pcie->wins[pcie->wins_count].remap & (win_size - 1))
+				break;
+
+			start += win_size;
+			size -= win_size;
+			pcie->wins_count++;
+		}
+
+		if (size > 0) {
+			dev_err(&pcie->pdev->dev,
+				"Invalid PCIe region [0x%llx-0x%llx]\n",
+				(unsigned long long)entry->res->start,
+				(unsigned long long)entry->res->end + 1);
+			return -EINVAL;
+		}
+	}
+
 	pcie->reset_gpio = devm_gpiod_get_from_of_node(dev, dev->of_node,
 						       "reset-gpios", 0,
 						       GPIOD_OUT_LOW,

commit 85ec59a6d451a580a815f7cca3cd6947a1193320
Author: Pali Rohár <pali@kernel.org>
Date:   Thu Nov 25 00:04:51 2021 +0100

    PCI: aardvark: Update comment about disabling link training
    
    commit 1d1cd163d0de22a4041a6f1aeabcf78f80076539 upstream.
    
    According to PCI Express Base Specifications (rev 4.0, 6.6.1
    "Conventional reset"), after fundamental reset a 100ms delay is needed
    prior to enabling link training.
    
    Update comment in code to reflect this requirement.
    
    Link: https://lore.kernel.org/r/20201202184659.3795-1-pali@kernel.org
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index e26abbab506c..b4b9cebf09b4 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -236,7 +236,14 @@ static void advk_pcie_issue_perst(struct advk_pcie *pcie)
 	if (!pcie->reset_gpio)
 		return;
 
-	/* PERST does not work for some cards when link training is enabled */
+	/*
+	 * As required by PCI Express spec (PCI Express Base Specification, REV.
+	 * 4.0 PCI Express, February 19 2014, 6.6.1 Conventional Reset) a delay
+	 * for at least 100ms after de-asserting PERST# signal is needed before
+	 * link training is enabled. So ensure that link training is disabled
+	 * prior de-asserting PERST# signal to fulfill that PCI Express spec
+	 * requirement.
+	 */
 	reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
 	reg &= ~LINK_TRAINING_EN;
 	advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);

commit 955528a9f2eb19b99e4511fdcf949ab2527acc39
Author: Pali Rohár <pali@kernel.org>
Date:   Thu Nov 25 00:04:50 2021 +0100

    PCI: aardvark: Move PCIe reset card code to advk_pcie_train_link()
    
    commit d0c6a3475b033960e85ae2bf176b14cab0a627d2 upstream.
    
    Move code which belongs to link training (delays and resets) into
    advk_pcie_train_link() function, so everything related to link training,
    including timings is at one place.
    
    After experiments it can be observed that link training in aardvark
    hardware is very sensitive to timings and delays, so it is a good idea to
    have this code at the same place as link training calls.
    
    This patch does not change behavior of aardvark initialization.
    
    Link: https://lore.kernel.org/r/20200907111038.5811-6-pali@kernel.org
    Tested-by: Marek Behún <marek.behun@nic.cz>
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index e79c2fd86f4e..e26abbab506c 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -229,6 +229,25 @@ static int advk_pcie_wait_for_link(struct advk_pcie *pcie)
 	return -ETIMEDOUT;
 }
 
+static void advk_pcie_issue_perst(struct advk_pcie *pcie)
+{
+	u32 reg;
+
+	if (!pcie->reset_gpio)
+		return;
+
+	/* PERST does not work for some cards when link training is enabled */
+	reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
+	reg &= ~LINK_TRAINING_EN;
+	advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
+
+	/* 10ms delay is needed for some cards */
+	dev_info(&pcie->pdev->dev, "issuing PERST via reset GPIO for 10ms\n");
+	gpiod_set_value_cansleep(pcie->reset_gpio, 1);
+	usleep_range(10000, 11000);
+	gpiod_set_value_cansleep(pcie->reset_gpio, 0);
+}
+
 static int advk_pcie_train_at_gen(struct advk_pcie *pcie, int gen)
 {
 	int ret, neg_gen;
@@ -276,6 +295,21 @@ static void advk_pcie_train_link(struct advk_pcie *pcie)
 	struct device *dev = &pcie->pdev->dev;
 	int neg_gen = -1, gen;
 
+	/*
+	 * Reset PCIe card via PERST# signal. Some cards are not detected
+	 * during link training when they are in some non-initial state.
+	 */
+	advk_pcie_issue_perst(pcie);
+
+	/*
+	 * PERST# signal could have been asserted by pinctrl subsystem before
+	 * probe() callback has been called or issued explicitly by reset gpio
+	 * function advk_pcie_issue_perst(), making the endpoint going into
+	 * fundamental reset. As required by PCI Express spec a delay for at
+	 * least 100ms after such a reset before link training is needed.
+	 */
+	msleep(PCI_PM_D3COLD_WAIT);
+
 	/*
 	 * Try link training at link gen specified by device tree property
 	 * 'max-link-speed'. If this fails, iteratively train at lower gen.
@@ -308,31 +342,10 @@ static void advk_pcie_train_link(struct advk_pcie *pcie)
 	dev_err(dev, "link never came up\n");
 }
 
-static void advk_pcie_issue_perst(struct advk_pcie *pcie)
-{
-	u32 reg;
-
-	if (!pcie->reset_gpio)
-		return;
-
-	/* PERST does not work for some cards when link training is enabled */
-	reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
-	reg &= ~LINK_TRAINING_EN;
-	advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
-
-	/* 10ms delay is needed for some cards */
-	dev_info(&pcie->pdev->dev, "issuing PERST via reset GPIO for 10ms\n");
-	gpiod_set_value_cansleep(pcie->reset_gpio, 1);
-	usleep_range(10000, 11000);
-	gpiod_set_value_cansleep(pcie->reset_gpio, 0);
-}
-
 static void advk_pcie_setup_hw(struct advk_pcie *pcie)
 {
 	u32 reg;
 
-	advk_pcie_issue_perst(pcie);
-
 	/* Set to Direct mode */
 	reg = advk_readl(pcie, CTRL_CONFIG_REG);
 	reg &= ~(CTRL_MODE_MASK << CTRL_MODE_SHIFT);
@@ -404,15 +417,6 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
 	reg |= PIO_CTRL_ADDR_WIN_DISABLE;
 	advk_writel(pcie, reg, PIO_CTRL);
 
-	/*
-	 * PERST# signal could have been asserted by pinctrl subsystem before
-	 * probe() callback has been called or issued explicitly by reset gpio
-	 * function advk_pcie_issue_perst(), making the endpoint going into
-	 * fundamental reset. As required by PCI Express spec a delay for at
-	 * least 100ms after such a reset before link training is needed.
-	 */
-	msleep(PCI_PM_D3COLD_WAIT);
-
 	advk_pcie_train_link(pcie);
 
 	reg = advk_readl(pcie, PCIE_CORE_CMD_STATUS_REG);

commit b3cdc10e2cbfa419cc394191fc4c95ddd7a1c91b
Author: Pali Rohár <pali@kernel.org>
Date:   Thu Nov 25 00:04:49 2021 +0100

    PCI: aardvark: Fix compilation on s390
    
    commit b32c012e4b98f0126aa327be2d1f409963057643 upstream.
    
    Include linux/gpio/consumer.h instead of linux/gpio.h, as is said in the
    latter file.
    
    This was reported by kernel test bot when compiling for s390.
    
      drivers/pci/controller/pci-aardvark.c:350:2: error: implicit declaration of function 'gpiod_set_value_cansleep' [-Werror,-Wimplicit-function-declaration]
      drivers/pci/controller/pci-aardvark.c:1074:21: error: implicit declaration of function 'devm_gpiod_get_from_of_node' [-Werror,-Wimplicit-function-declaration]
      drivers/pci/controller/pci-aardvark.c:1076:14: error: use of undeclared identifier 'GPIOD_OUT_LOW'
    
    Link: https://lore.kernel.org/r/202006211118.LxtENQfl%25lkp@intel.com
    Link: https://lore.kernel.org/r/20200907111038.5811-2-pali@kernel.org
    Fixes: 5169a9851daa ("PCI: aardvark: Issue PERST via GPIO")
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Reviewed-by: Marek Behún <marek.behun@nic.cz>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index d1bdd40d18fb..e79c2fd86f4e 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -9,7 +9,7 @@
  */
 
 #include <linux/delay.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/interrupt.h>
 #include <linux/irq.h>
 #include <linux/irqdomain.h>

commit 62d87e1294118812780bd07c71ecb42b104c52c4
Author: Pali Rohár <pali@kernel.org>
Date:   Thu Nov 25 00:04:48 2021 +0100

    PCI: aardvark: Don't touch PCIe registers if no card connected
    
    commit 70e380250c3621c55ff218cbaf2272830d9dbb1d upstream.
    
    When there is no PCIe card connected and advk_pcie_rd_conf() or
    advk_pcie_wr_conf() is called for PCI bus which doesn't belong to emulated
    root bridge, the aardvark driver throws the following error message:
    
      advk-pcie d0070000.pcie: config read/write timed out
    
    Obviously accessing PCIe registers of disconnected card is not possible.
    
    Extend check in advk_pcie_valid_device() function for validating
    availability of PCIe bus. If PCIe link is down, then the device is marked
    as Not Found and the driver does not try to access these registers.
    
    This is just an optimization to prevent accessing PCIe registers when card
    is disconnected. Trying to access PCIe registers of disconnected card does
    not cause any crash, kernel just needs to wait for a timeout. So if card
    disappear immediately after checking for PCIe link (before accessing PCIe
    registers), it does not cause any problems.
    
    Link: https://lore.kernel.org/r/20200702083036.12230-1-pali@kernel.org
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index 5837fff32f8e..d1bdd40d18fb 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -525,6 +525,13 @@ static bool advk_pcie_valid_device(struct advk_pcie *pcie, struct pci_bus *bus,
 	if ((bus->number == pcie->root_bus_nr) && PCI_SLOT(devfn) != 0)
 		return false;
 
+	/*
+	 * If the link goes down after we check for link-up, nothing bad
+	 * happens but the config access times out.
+	 */
+	if (bus->number != pcie->root_bus_nr && !advk_pcie_link_up(pcie))
+		return false;
+
 	return true;
 }
 

commit 26fa8b315b925d4d5554c6ba7d96e2969665e1a4
Author: Pali Rohár <pali@kernel.org>
Date:   Thu Nov 25 00:04:47 2021 +0100

    PCI: aardvark: Indicate error in 'val' when config read fails
    
    commit b1bd5714472cc72e14409f5659b154c765a76c65 upstream.
    
    Most callers of config read do not check for return value. But most of the
    ones that do, checks for error indication in 'val' variable.
    
    This patch updates error handling in advk_pcie_rd_conf() function. If PIO
    transfer fails then 'val' variable is set to 0xffffffff which indicates
    failture.
    
    Link: https://lore.kernel.org/r/20200528162604.GA323482@bjorn-Precision-5520
    Link: https://lore.kernel.org/r/20200601130315.18895-1-pali@kernel.org
    Reported-by: Bjorn Helgaas <helgaas@kernel.org>
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index aaeb1c78076c..5837fff32f8e 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -596,8 +596,10 @@ static int advk_pcie_rd_conf(struct pci_bus *bus, u32 devfn,
 	advk_writel(pcie, 1, PIO_START);
 
 	ret = advk_pcie_wait_pio(pcie);
-	if (ret < 0)
+	if (ret < 0) {
+		*val = 0xffffffff;
 		return PCIBIOS_SET_FAILED;
+	}
 
 	/* Check PIO status and get the read result */
 	ret = advk_pcie_check_pio_status(pcie, val);

commit 388ae5f8779a6be80717d9afc8456abca50a53a8
Author: Pali Rohár <pali@kernel.org>
Date:   Thu Nov 25 00:04:46 2021 +0100

    PCI: aardvark: Replace custom macros by standard linux/pci_regs.h macros
    
    commit 96be36dbffacea0aa9e6ec4839583e79faa141a1 upstream.
    
    PCI-E capability macros are already defined in linux/pci_regs.h.
    Remove their reimplementation in pcie-aardvark.
    
    Link: https://lore.kernel.org/r/20200430080625.26070-9-pali@kernel.org
    Tested-by: Tomasz Maciej Nowak <tmn505@gmail.com>
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Reviewed-by: Rob Herring <robh@kernel.org>
    Acked-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index 66dfd7523370..aaeb1c78076c 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -28,17 +28,7 @@
 #define     PCIE_CORE_CMD_IO_ACCESS_EN				BIT(0)
 #define     PCIE_CORE_CMD_MEM_ACCESS_EN				BIT(1)
 #define     PCIE_CORE_CMD_MEM_IO_REQ_EN				BIT(2)
-#define PCIE_CORE_DEV_CTRL_STATS_REG				0xc8
-#define     PCIE_CORE_DEV_CTRL_STATS_RELAX_ORDER_DISABLE	(0 << 4)
-#define     PCIE_CORE_DEV_CTRL_STATS_MAX_PAYLOAD_SZ_SHIFT	5
-#define     PCIE_CORE_DEV_CTRL_STATS_SNOOP_DISABLE		(0 << 11)
-#define     PCIE_CORE_DEV_CTRL_STATS_MAX_RD_REQ_SIZE_SHIFT	12
-#define     PCIE_CORE_DEV_CTRL_STATS_MAX_RD_REQ_SZ		0x2
-#define PCIE_CORE_LINK_CTRL_STAT_REG				0xd0
-#define     PCIE_CORE_LINK_L0S_ENTRY				BIT(0)
-#define     PCIE_CORE_LINK_TRAINING				BIT(5)
-#define     PCIE_CORE_LINK_SPEED_SHIFT				16
-#define     PCIE_CORE_LINK_WIDTH_SHIFT				20
+#define PCIE_CORE_PCIEXP_CAP					0xc0
 #define PCIE_CORE_ERR_CAPCTL_REG				0x118
 #define     PCIE_CORE_ERR_CAPCTL_ECRC_CHK_TX			BIT(5)
 #define     PCIE_CORE_ERR_CAPCTL_ECRC_CHK_TX_EN			BIT(6)
@@ -210,6 +200,11 @@ static inline u32 advk_readl(struct advk_pcie *pcie, u64 reg)
 	return readl(pcie->base + reg);
 }
 
+static inline u16 advk_read16(struct advk_pcie *pcie, u64 reg)
+{
+	return advk_readl(pcie, (reg & ~0x3)) >> ((reg & 0x3) * 8);
+}
+
 static int advk_pcie_link_up(struct advk_pcie *pcie)
 {
 	u32 val, ltssm_state;
@@ -262,16 +257,16 @@ static int advk_pcie_train_at_gen(struct advk_pcie *pcie, int gen)
 	 * Start link training immediately after enabling it.
 	 * This solves problems for some buggy cards.
 	 */
-	reg = advk_readl(pcie, PCIE_CORE_LINK_CTRL_STAT_REG);
-	reg |= PCIE_CORE_LINK_TRAINING;
-	advk_writel(pcie, reg, PCIE_CORE_LINK_CTRL_STAT_REG);
+	reg = advk_readl(pcie, PCIE_CORE_PCIEXP_CAP + PCI_EXP_LNKCTL);
+	reg |= PCI_EXP_LNKCTL_RL;
+	advk_writel(pcie, reg, PCIE_CORE_PCIEXP_CAP + PCI_EXP_LNKCTL);
 
 	ret = advk_pcie_wait_for_link(pcie);
 	if (ret)
 		return ret;
 
-	reg = advk_readl(pcie, PCIE_CORE_LINK_CTRL_STAT_REG);
-	neg_gen = (reg >> PCIE_CORE_LINK_SPEED_SHIFT) & 0xf;
+	reg = advk_read16(pcie, PCIE_CORE_PCIEXP_CAP + PCI_EXP_LNKSTA);
+	neg_gen = reg & PCI_EXP_LNKSTA_CLS;
 
 	return neg_gen;
 }
@@ -356,13 +351,14 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
 		PCIE_CORE_ERR_CAPCTL_ECRC_CHCK_RCV;
 	advk_writel(pcie, reg, PCIE_CORE_ERR_CAPCTL_REG);
 
-	/* Set PCIe Device Control and Status 1 PF0 register */
-	reg = PCIE_CORE_DEV_CTRL_STATS_RELAX_ORDER_DISABLE |
-		(7 << PCIE_CORE_DEV_CTRL_STATS_MAX_PAYLOAD_SZ_SHIFT) |
-		PCIE_CORE_DEV_CTRL_STATS_SNOOP_DISABLE |
-		(PCIE_CORE_DEV_CTRL_STATS_MAX_RD_REQ_SZ <<
-		 PCIE_CORE_DEV_CTRL_STATS_MAX_RD_REQ_SIZE_SHIFT);
-	advk_writel(pcie, reg, PCIE_CORE_DEV_CTRL_STATS_REG);
+	/* Set PCIe Device Control register */
+	reg = advk_readl(pcie, PCIE_CORE_PCIEXP_CAP + PCI_EXP_DEVCTL);
+	reg &= ~PCI_EXP_DEVCTL_RELAX_EN;
+	reg &= ~PCI_EXP_DEVCTL_NOSNOOP_EN;
+	reg &= ~PCI_EXP_DEVCTL_READRQ;
+	reg |= PCI_EXP_DEVCTL_PAYLOAD; /* Set max payload size */
+	reg |= PCI_EXP_DEVCTL_READRQ_512B;
+	advk_writel(pcie, reg, PCIE_CORE_PCIEXP_CAP + PCI_EXP_DEVCTL);
 
 	/* Program PCIe Control 2 to disable strict ordering */
 	reg = PCIE_CORE_CTRL2_RESERVED |

commit 202a82b371ed524ec493c8f424b2fb10d0c8fc11
Author: Pali Rohár <pali@kernel.org>
Date:   Thu Nov 25 00:04:45 2021 +0100

    PCI: aardvark: Issue PERST via GPIO
    
    commit 5169a9851daaa2782a7bd2bb83d5b1bd224b2879 upstream.
    
    Add support for issuing PERST via GPIO specified in 'reset-gpios'
    property (as described in PCI device tree bindings).
    
    Some buggy cards (e.g. Compex WLE900VX or WLE1216) are not detected
    after reboot when PERST is not issued during driver initialization.
    
    If bootloader already enabled link training then issuing PERST has no
    effect for some buggy cards (e.g. Compex WLE900VX) and these cards are
    not detected. We therefore clear the LINK_TRAINING_EN register before.
    
    It was observed that Compex WLE900VX card needs to be in PERST reset
    for at least 10ms if bootloader enabled link training.
    
    Tested on Turris MOX.
    
    Link: https://lore.kernel.org/r/20200430080625.26070-6-pali@kernel.org
    Tested-by: Tomasz Maciej Nowak <tmn505@gmail.com>
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Acked-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index 5dbefa20968e..66dfd7523370 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -9,6 +9,7 @@
  */
 
 #include <linux/delay.h>
+#include <linux/gpio.h>
 #include <linux/interrupt.h>
 #include <linux/irq.h>
 #include <linux/irqdomain.h>
@@ -17,6 +18,7 @@
 #include <linux/init.h>
 #include <linux/platform_device.h>
 #include <linux/of_address.h>
+#include <linux/of_gpio.h>
 #include <linux/of_pci.h>
 
 #include "../pci.h"
@@ -195,6 +197,7 @@ struct advk_pcie {
 	u16 msi_msg;
 	int root_bus_nr;
 	int link_gen;
+	struct gpio_desc *reset_gpio;
 };
 
 static inline void advk_writel(struct advk_pcie *pcie, u32 val, u64 reg)
@@ -310,10 +313,31 @@ static void advk_pcie_train_link(struct advk_pcie *pcie)
 	dev_err(dev, "link never came up\n");
 }
 
+static void advk_pcie_issue_perst(struct advk_pcie *pcie)
+{
+	u32 reg;
+
+	if (!pcie->reset_gpio)
+		return;
+
+	/* PERST does not work for some cards when link training is enabled */
+	reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
+	reg &= ~LINK_TRAINING_EN;
+	advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
+
+	/* 10ms delay is needed for some cards */
+	dev_info(&pcie->pdev->dev, "issuing PERST via reset GPIO for 10ms\n");
+	gpiod_set_value_cansleep(pcie->reset_gpio, 1);
+	usleep_range(10000, 11000);
+	gpiod_set_value_cansleep(pcie->reset_gpio, 0);
+}
+
 static void advk_pcie_setup_hw(struct advk_pcie *pcie)
 {
 	u32 reg;
 
+	advk_pcie_issue_perst(pcie);
+
 	/* Set to Direct mode */
 	reg = advk_readl(pcie, CTRL_CONFIG_REG);
 	reg &= ~(CTRL_MODE_MASK << CTRL_MODE_SHIFT);
@@ -386,7 +410,8 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
 
 	/*
 	 * PERST# signal could have been asserted by pinctrl subsystem before
-	 * probe() callback has been called, making the endpoint going into
+	 * probe() callback has been called or issued explicitly by reset gpio
+	 * function advk_pcie_issue_perst(), making the endpoint going into
 	 * fundamental reset. As required by PCI Express spec a delay for at
 	 * least 100ms after such a reset before link training is needed.
 	 */
@@ -1026,6 +1051,22 @@ static int advk_pcie_probe(struct platform_device *pdev)
 		return ret;
 	}
 
+	pcie->reset_gpio = devm_gpiod_get_from_of_node(dev, dev->of_node,
+						       "reset-gpios", 0,
+						       GPIOD_OUT_LOW,
+						       "pcie1-reset");
+	ret = PTR_ERR_OR_ZERO(pcie->reset_gpio);
+	if (ret) {
+		if (ret == -ENOENT) {
+			pcie->reset_gpio = NULL;
+		} else {
+			if (ret != -EPROBE_DEFER)
+				dev_err(dev, "Failed to get reset-gpio: %i\n",
+					ret);
+			return ret;
+		}
+	}
+
 	ret = of_pci_get_max_link_speed(dev->of_node);
 	if (ret <= 0 || ret > 3)
 		pcie->link_gen = 3;

commit 83e880682284140283f5c59f289ba2a83aed18a1
Author: Marek Behún <marek.behun@nic.cz>
Date:   Thu Nov 25 00:04:44 2021 +0100

    PCI: aardvark: Improve link training
    
    commit 43fc679ced18006b12d918d7a8a4af392b7fbfe7 upstream.
    
    Currently the aardvark driver trains link in PCIe gen2 mode. This may
    cause some buggy gen1 cards (such as Compex WLE900VX) to be unstable or
    even not detected. Moreover when ASPM code tries to retrain link second
    time, these cards may stop responding and link goes down. If gen1 is
    used this does not happen.
    
    Unconditionally forcing gen1 is not a good solution since it may have
    performance impact on gen2 cards.
    
    To overcome this, read 'max-link-speed' property (as defined in PCI
    device tree bindings) and use this as max gen mode. Then iteratively try
    link training at this mode or lower until successful. After successful
    link training choose final controller gen based on Negotiated Link Speed
    from Link Status register, which should match card speed.
    
    Link: https://lore.kernel.org/r/20200430080625.26070-5-pali@kernel.org
    Tested-by: Tomasz Maciej Nowak <tmn505@gmail.com>
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Marek Behún <marek.behun@nic.cz>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Reviewed-by: Rob Herring <robh@kernel.org>
    Acked-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index 4828d585d4b9..5dbefa20968e 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -35,6 +35,7 @@
 #define PCIE_CORE_LINK_CTRL_STAT_REG				0xd0
 #define     PCIE_CORE_LINK_L0S_ENTRY				BIT(0)
 #define     PCIE_CORE_LINK_TRAINING				BIT(5)
+#define     PCIE_CORE_LINK_SPEED_SHIFT				16
 #define     PCIE_CORE_LINK_WIDTH_SHIFT				20
 #define PCIE_CORE_ERR_CAPCTL_REG				0x118
 #define     PCIE_CORE_ERR_CAPCTL_ECRC_CHK_TX			BIT(5)
@@ -193,6 +194,7 @@ struct advk_pcie {
 	struct mutex msi_used_lock;
 	u16 msi_msg;
 	int root_bus_nr;
+	int link_gen;
 };
 
 static inline void advk_writel(struct advk_pcie *pcie, u32 val, u64 reg)
@@ -216,23 +218,98 @@ static int advk_pcie_link_up(struct advk_pcie *pcie)
 
 static int advk_pcie_wait_for_link(struct advk_pcie *pcie)
 {
-	struct device *dev = &pcie->pdev->dev;
 	int retries;
 
 	/* check if the link is up or not */
 	for (retries = 0; retries < LINK_WAIT_MAX_RETRIES; retries++) {
-		if (advk_pcie_link_up(pcie)) {
-			dev_info(dev, "link up\n");
+		if (advk_pcie_link_up(pcie))
 			return 0;
-		}
 
 		usleep_range(LINK_WAIT_USLEEP_MIN, LINK_WAIT_USLEEP_MAX);
 	}
 
-	dev_err(dev, "link never came up\n");
 	return -ETIMEDOUT;
 }
 
+static int advk_pcie_train_at_gen(struct advk_pcie *pcie, int gen)
+{
+	int ret, neg_gen;
+	u32 reg;
+
+	/* Setup link speed */
+	reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
+	reg &= ~PCIE_GEN_SEL_MSK;
+	if (gen == 3)
+		reg |= SPEED_GEN_3;
+	else if (gen == 2)
+		reg |= SPEED_GEN_2;
+	else
+		reg |= SPEED_GEN_1;
+	advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
+
+	/*
+	 * Enable link training. This is not needed in every call to this
+	 * function, just once suffices, but it does not break anything either.
+	 */
+	reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
+	reg |= LINK_TRAINING_EN;
+	advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
+
+	/*
+	 * Start link training immediately after enabling it.
+	 * This solves problems for some buggy cards.
+	 */
+	reg = advk_readl(pcie, PCIE_CORE_LINK_CTRL_STAT_REG);
+	reg |= PCIE_CORE_LINK_TRAINING;
+	advk_writel(pcie, reg, PCIE_CORE_LINK_CTRL_STAT_REG);
+
+	ret = advk_pcie_wait_for_link(pcie);
+	if (ret)
+		return ret;
+
+	reg = advk_readl(pcie, PCIE_CORE_LINK_CTRL_STAT_REG);
+	neg_gen = (reg >> PCIE_CORE_LINK_SPEED_SHIFT) & 0xf;
+
+	return neg_gen;
+}
+
+static void advk_pcie_train_link(struct advk_pcie *pcie)
+{
+	struct device *dev = &pcie->pdev->dev;
+	int neg_gen = -1, gen;
+
+	/*
+	 * Try link training at link gen specified by device tree property
+	 * 'max-link-speed'. If this fails, iteratively train at lower gen.
+	 */
+	for (gen = pcie->link_gen; gen > 0; --gen) {
+		neg_gen = advk_pcie_train_at_gen(pcie, gen);
+		if (neg_gen > 0)
+			break;
+	}
+
+	if (neg_gen < 0)
+		goto err;
+
+	/*
+	 * After successful training if negotiated gen is lower than requested,
+	 * train again on negotiated gen. This solves some stability issues for
+	 * some buggy gen1 cards.
+	 */
+	if (neg_gen < gen) {
+		gen = neg_gen;
+		neg_gen = advk_pcie_train_at_gen(pcie, gen);
+	}
+
+	if (neg_gen == gen) {
+		dev_info(dev, "link up at gen %i\n", gen);
+		return;
+	}
+
+err:
+	dev_err(dev, "link never came up\n");
+}
+
 static void advk_pcie_setup_hw(struct advk_pcie *pcie)
 {
 	u32 reg;
@@ -268,12 +345,6 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
 		PCIE_CORE_CTRL2_TD_ENABLE;
 	advk_writel(pcie, reg, PCIE_CORE_CTRL2_REG);
 
-	/* Set GEN2 */
-	reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
-	reg &= ~PCIE_GEN_SEL_MSK;
-	reg |= SPEED_GEN_2;
-	advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
-
 	/* Set lane X1 */
 	reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
 	reg &= ~LANE_CNT_MSK;
@@ -321,20 +392,7 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
 	 */
 	msleep(PCI_PM_D3COLD_WAIT);
 
-	/* Enable link training */
-	reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
-	reg |= LINK_TRAINING_EN;
-	advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
-
-	/*
-	 * Start link training immediately after enabling it.
-	 * This solves problems for some buggy cards.
-	 */
-	reg = advk_readl(pcie, PCIE_CORE_LINK_CTRL_STAT_REG);
-	reg |= PCIE_CORE_LINK_TRAINING;
-	advk_writel(pcie, reg, PCIE_CORE_LINK_CTRL_STAT_REG);
-
-	advk_pcie_wait_for_link(pcie);
+	advk_pcie_train_link(pcie);
 
 	reg = advk_readl(pcie, PCIE_CORE_CMD_STATUS_REG);
 	reg |= PCIE_CORE_CMD_MEM_ACCESS_EN |
@@ -968,6 +1026,12 @@ static int advk_pcie_probe(struct platform_device *pdev)
 		return ret;
 	}
 
+	ret = of_pci_get_max_link_speed(dev->of_node);
+	if (ret <= 0 || ret > 3)
+		pcie->link_gen = 3;
+	else
+		pcie->link_gen = ret;
+
 	advk_pcie_setup_hw(pcie);
 
 	ret = advk_pcie_init_irq_domain(pcie);

commit 0ca4db3676d5b667117bdbd4aef5c17c458bc061
Author: Pali Rohár <pali@kernel.org>
Date:   Thu Nov 25 00:04:43 2021 +0100

    PCI: aardvark: Train link immediately after enabling training
    
    commit 6964494582f56a3882c2c53b0edbfe99eb32b2e1 upstream.
    
    Adding even 100ms (PCI_PM_D3COLD_WAIT) delay between enabling link
    training and starting link training causes detection issues with some
    buggy cards (such as Compex WLE900VX).
    
    Move the code which enables link training immediately before the one
    which starts link traning.
    
    This fixes detection issues of Compex WLE900VX card on Turris MOX after
    cold boot.
    
    Link: https://lore.kernel.org/r/20200430080625.26070-2-pali@kernel.org
    Fixes: f4c7d053d7f7 ("PCI: aardvark: Wait for endpoint to be ready...")
    Tested-by: Tomasz Maciej Nowak <tmn505@gmail.com>
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Acked-by: Rob Herring <robh@kernel.org>
    Acked-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index 3449d1444805..4828d585d4b9 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -280,11 +280,6 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
 	reg |= LANE_COUNT_1;
 	advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
 
-	/* Enable link training */
-	reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
-	reg |= LINK_TRAINING_EN;
-	advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
-
 	/* Enable MSI */
 	reg = advk_readl(pcie, PCIE_CORE_CTRL2_REG);
 	reg |= PCIE_CORE_CTRL2_MSI_ENABLE;
@@ -326,7 +321,15 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
 	 */
 	msleep(PCI_PM_D3COLD_WAIT);
 
-	/* Start link training */
+	/* Enable link training */
+	reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG);
+	reg |= LINK_TRAINING_EN;
+	advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG);
+
+	/*
+	 * Start link training immediately after enabling it.
+	 * This solves problems for some buggy cards.
+	 */
 	reg = advk_readl(pcie, PCIE_CORE_LINK_CTRL_STAT_REG);
 	reg |= PCIE_CORE_LINK_TRAINING;
 	advk_writel(pcie, reg, PCIE_CORE_LINK_CTRL_STAT_REG);

commit 78c6ab8e1ceb143b1a2dfd8aed12174bcba0d781
Author: Remi Pommarel <repk@triplefau.lt>
Date:   Thu Nov 25 00:04:42 2021 +0100

    PCI: aardvark: Wait for endpoint to be ready before training link
    
    commit f4c7d053d7f77cd5c1a1ba7c7ce085ddba13d1d7 upstream.
    
    When configuring pcie reset pin from gpio (e.g. initially set by
    u-boot) to pcie function this pin goes low for a brief moment
    asserting the PERST# signal. Thus connected device enters fundamental
    reset process and link configuration can only begin after a minimal
    100ms delay (see [1]).
    
    Because the pin configuration comes from the "default" pinctrl it is
    implicitly configured before the probe callback is called:
    
    driver_probe_device()
      really_probe()
        ...
        pinctrl_bind_pins() /* Here pin goes from gpio to PCIE reset
                               function and PERST# is asserted */
        ...
        drv->probe()
    
    [1] "PCI Express Base Specification", REV. 4.0
        PCI Express, February 19 2014, 6.6.1 Conventional Reset
    
    Signed-off-by: Remi Pommarel <repk@triplefau.lt>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Acked-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index 3625d73e016a..3449d1444805 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -318,6 +318,14 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
 	reg |= PIO_CTRL_ADDR_WIN_DISABLE;
 	advk_writel(pcie, reg, PIO_CTRL);
 
+	/*
+	 * PERST# signal could have been asserted by pinctrl subsystem before
+	 * probe() callback has been called, making the endpoint going into
+	 * fundamental reset. As required by PCI Express spec a delay for at
+	 * least 100ms after such a reset before link training is needed.
+	 */
+	msleep(PCI_PM_D3COLD_WAIT);
+
 	/* Start link training */
 	reg = advk_readl(pcie, PCIE_CORE_LINK_CTRL_STAT_REG);
 	reg |= PCIE_CORE_LINK_TRAINING;

commit 53c71a91579c5ade5624cb5091a58501e7dbc218
Author: Wen Yang <wen.yang99@zte.com.cn>
Date:   Thu Nov 25 00:04:41 2021 +0100

    PCI: aardvark: Fix a leaked reference by adding missing of_node_put()
    
    commit 3842f5166bf1ef286fe7a39f262b5c9581308366 upstream.
    
    The call to of_get_next_child() returns a node pointer with refcount
    incremented thus it must be explicitly decremented after the last
    usage.
    
    irq_domain_add_linear() also calls of_node_get() to increase refcount,
    so irq_domain will not be affected when it is released.
    
    Detected by coccinelle with the following warnings:
      ./drivers/pci/controller/pci-aardvark.c:826:1-7: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 798, but without a corresponding object release within this function.
    
    Signed-off-by: Wen Yang <wen.yang99@zte.com.cn>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
    Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Cc: Bjorn Helgaas <bhelgaas@google.com>
    Cc: linux-pci@vger.kernel.org
    Cc: linux-arm-kernel@lists.infradead.org
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index 98fb3c1f45e4..3625d73e016a 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -754,6 +754,7 @@ static int advk_pcie_init_irq_domain(struct advk_pcie *pcie)
 	struct device_node *node = dev->of_node;
 	struct device_node *pcie_intc_node;
 	struct irq_chip *irq_chip;
+	int ret = 0;
 
 	raw_spin_lock_init(&pcie->irq_lock);
 
@@ -768,8 +769,8 @@ static int advk_pcie_init_irq_domain(struct advk_pcie *pcie)
 	irq_chip->name = devm_kasprintf(dev, GFP_KERNEL, "%s-irq",
 					dev_name(dev));
 	if (!irq_chip->name) {
-		of_node_put(pcie_intc_node);
-		return -ENOMEM;
+		ret = -ENOMEM;
+		goto out_put_node;
 	}
 
 	irq_chip->irq_mask = advk_pcie_irq_mask;
@@ -781,11 +782,13 @@ static int advk_pcie_init_irq_domain(struct advk_pcie *pcie)
 				      &advk_pcie_irq_domain_ops, pcie);
 	if (!pcie->irq_domain) {
 		dev_err(dev, "Failed to get a INTx IRQ domain\n");
-		of_node_put(pcie_intc_node);
-		return -ENOMEM;
+		ret = -ENOMEM;
+		goto out_put_node;
 	}
 
-	return 0;
+out_put_node:
+	of_node_put(pcie_intc_node);
+	return ret;
 }
 
 static void advk_pcie_remove_irq_domain(struct advk_pcie *pcie)

commit 9ef384ed300d1bcfb23d0ab0b487d544444d4b52
Author: David Hildenbrand <david@redhat.com>
Date:   Fri Nov 19 16:43:58 2021 -0800

    proc/vmcore: fix clearing user buffer by properly using clear_user()
    
    commit c1e63117711977cc4295b2ce73de29dd17066c82 upstream.
    
    To clear a user buffer we cannot simply use memset, we have to use
    clear_user().  With a virtio-mem device that registers a vmcore_cb and
    has some logically unplugged memory inside an added Linux memory block,
    I can easily trigger a BUG by copying the vmcore via "cp":
    
      systemd[1]: Starting Kdump Vmcore Save Service...
      kdump[420]: Kdump is using the default log level(3).
      kdump[453]: saving to /sysroot/var/crash/127.0.0.1-2021-11-11-14:59:22/
      kdump[458]: saving vmcore-dmesg.txt to /sysroot/var/crash/127.0.0.1-2021-11-11-14:59:22/
      kdump[465]: saving vmcore-dmesg.txt complete
      kdump[467]: saving vmcore
      BUG: unable to handle page fault for address: 00007f2374e01000
      #PF: supervisor write access in kernel mode
      #PF: error_code(0x0003) - permissions violation
      PGD 7a523067 P4D 7a523067 PUD 7a528067 PMD 7a525067 PTE 800000007048f867
      Oops: 0003 [#1] PREEMPT SMP NOPTI
      CPU: 0 PID: 468 Comm: cp Not tainted 5.15.0+ #6
      Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.14.0-27-g64f37cc530f1-prebuilt.qemu.org 04/01/2014
      RIP: 0010:read_from_oldmem.part.0.cold+0x1d/0x86
      Code: ff ff ff e8 05 ff fe ff e9 b9 e9 7f ff 48 89 de 48 c7 c7 38 3b 60 82 e8 f1 fe fe ff 83 fd 08 72 3c 49 8d 7d 08 4c 89 e9 89 e8 <49> c7 45 00 00 00 00 00 49 c7 44 05 f8 00 00 00 00 48 83 e7 f81
      RSP: 0018:ffffc9000073be08 EFLAGS: 00010212
      RAX: 0000000000001000 RBX: 00000000002fd000 RCX: 00007f2374e01000
      RDX: 0000000000000001 RSI: 00000000ffffdfff RDI: 00007f2374e01008
      RBP: 0000000000001000 R08: 0000000000000000 R09: ffffc9000073bc50
      R10: ffffc9000073bc48 R11: ffffffff829461a8 R12: 000000000000f000
      R13: 00007f2374e01000 R14: 0000000000000000 R15: ffff88807bd421e8
      FS:  00007f2374e12140(0000) GS:ffff88807f000000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 00007f2374e01000 CR3: 000000007a4aa000 CR4: 0000000000350eb0
      Call Trace:
       read_vmcore+0x236/0x2c0
       proc_reg_read+0x55/0xa0
       vfs_read+0x95/0x190
       ksys_read+0x4f/0xc0
       do_syscall_64+0x3b/0x90
       entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Some x86-64 CPUs have a CPU feature called "Supervisor Mode Access
    Prevention (SMAP)", which is used to detect wrong access from the kernel
    to user buffers like this: SMAP triggers a permissions violation on
    wrong access.  In the x86-64 variant of clear_user(), SMAP is properly
    handled via clac()+stac().
    
    To fix, properly use clear_user() when we're dealing with a user buffer.
    
    Link: https://lkml.kernel.org/r/20211112092750.6921-1-david@redhat.com
    Fixes: 997c136f518c ("fs/proc/vmcore.c: add hook to read_from_oldmem() to check for non-ram pages")
    Signed-off-by: David Hildenbrand <david@redhat.com>
    Acked-by: Baoquan He <bhe@redhat.com>
    Cc: Dave Young <dyoung@redhat.com>
    Cc: Baoquan He <bhe@redhat.com>
    Cc: Vivek Goyal <vgoyal@redhat.com>
    Cc: Philipp Rudo <prudo@redhat.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: David Hildenbrand <david@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c
index c4147e50af98..f5dfedc01552 100644
--- a/fs/proc/vmcore.c
+++ b/fs/proc/vmcore.c
@@ -117,14 +117,19 @@ static ssize_t read_from_oldmem(char *buf, size_t count,
 			nr_bytes = count;
 
 		/* If pfn is not ram, return zeros for sparse dump files */
-		if (pfn_is_ram(pfn) == 0)
-			memset(buf, 0, nr_bytes);
-		else {
+		if (pfn_is_ram(pfn) == 0) {
+			tmp = 0;
+			if (!userbuf)
+				memset(buf, 0, nr_bytes);
+			else if (clear_user(buf, nr_bytes))
+				tmp = -EFAULT;
+		} else {
 			tmp = copy_oldmem_page(pfn, buf, nr_bytes,
 						offset, userbuf);
-			if (tmp < 0)
-				return tmp;
 		}
+		if (tmp < 0)
+			return tmp;
+
 		*ppos += nr_bytes;
 		count -= nr_bytes;
 		buf += nr_bytes;

commit 6e6cc157fea18b65e43c147540fc39649cbc2112
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Fri Sep 24 20:29:51 2021 -0700

    xtensa: use CONFIG_USE_OF instead of CONFIG_OF
    
    commit d67ed2510d28a1eb33171010d35cf52178cfcbdd upstream.
    
    CONFIG_OF can be set by a randconfig or by a user -- without setting the
    early flattree option (OF_EARLY_FLATTREE).  This causes build errors.
    However, if randconfig or a user sets USE_OF in the Xtensa config,
    the right kconfig symbols are set to fix the build.
    
    Fixes these build errors:
    
    ../arch/xtensa/kernel/setup.c:67:19: error: ?__dtb_start??undeclared here (not in a function); did you mean ?dtb_start??
       67 | void *dtb_start = __dtb_start;
          |                   ^~~~~~~~~~~
    ../arch/xtensa/kernel/setup.c: In function 'xtensa_dt_io_area':
    ../arch/xtensa/kernel/setup.c:201:14: error: implicit declaration of function 'of_flat_dt_is_compatible'; did you mean 'of_machine_is_compatible'? [-Werror=implicit-function-declaration]
      201 |         if (!of_flat_dt_is_compatible(node, "simple-bus"))
    ../arch/xtensa/kernel/setup.c:204:18: error: implicit declaration of function 'of_get_flat_dt_prop' [-Werror=implicit-function-declaration]
      204 |         ranges = of_get_flat_dt_prop(node, "ranges", &len);
    ../arch/xtensa/kernel/setup.c:204:16: error: assignment to 'const __be32 *' {aka 'const unsigned int *'} from 'int' makes pointer from integer without a cast [-Werror=int-conversion]
      204 |         ranges = of_get_flat_dt_prop(node, "ranges", &len);
          |                ^
    ../arch/xtensa/kernel/setup.c: In function 'early_init_devtree':
    ../arch/xtensa/kernel/setup.c:228:9: error: implicit declaration of function 'early_init_dt_scan'; did you mean 'early_init_devtree'? [-Werror=implicit-function-declaration]
      228 |         early_init_dt_scan(params);
    ../arch/xtensa/kernel/setup.c:229:9: error: implicit declaration of function 'of_scan_flat_dt' [-Werror=implicit-function-declaration]
      229 |         of_scan_flat_dt(xtensa_dt_io_area, NULL);
    
    xtensa-elf-ld: arch/xtensa/mm/mmu.o:(.text+0x0): undefined reference to `xtensa_kio_paddr'
    
    Fixes: da844a81779e ("xtensa: add device trees support")
    Fixes: 6cb971114f63 ("xtensa: remap io area defined in device tree")
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/xtensa/include/asm/vectors.h b/arch/xtensa/include/asm/vectors.h
index 7111280c8842..2d3e0cca9ba0 100644
--- a/arch/xtensa/include/asm/vectors.h
+++ b/arch/xtensa/include/asm/vectors.h
@@ -31,7 +31,7 @@
 #endif
 #define XCHAL_KIO_SIZE			0x10000000
 
-#if (!XCHAL_HAVE_PTP_MMU || XCHAL_HAVE_SPANNING_WAY) && defined(CONFIG_OF)
+#if (!XCHAL_HAVE_PTP_MMU || XCHAL_HAVE_SPANNING_WAY) && defined(CONFIG_USE_OF)
 #define XCHAL_KIO_PADDR			xtensa_get_kio_paddr()
 #ifndef __ASSEMBLY__
 extern unsigned long xtensa_kio_paddr;
diff --git a/arch/xtensa/kernel/setup.c b/arch/xtensa/kernel/setup.c
index 6a0167ac803c..901990b8296c 100644
--- a/arch/xtensa/kernel/setup.c
+++ b/arch/xtensa/kernel/setup.c
@@ -65,7 +65,7 @@ int initrd_is_mapped = 0;
 extern int initrd_below_start_ok;
 #endif
 
-#ifdef CONFIG_OF
+#ifdef CONFIG_USE_OF
 void *dtb_start = __dtb_start;
 #endif
 
@@ -127,7 +127,7 @@ __tagtable(BP_TAG_INITRD, parse_tag_initrd);
 
 #endif /* CONFIG_BLK_DEV_INITRD */
 
-#ifdef CONFIG_OF
+#ifdef CONFIG_USE_OF
 
 static int __init parse_tag_fdt(const bp_tag_t *tag)
 {
@@ -137,7 +137,7 @@ static int __init parse_tag_fdt(const bp_tag_t *tag)
 
 __tagtable(BP_TAG_FDT, parse_tag_fdt);
 
-#endif /* CONFIG_OF */
+#endif /* CONFIG_USE_OF */
 
 static int __init parse_tag_cmdline(const bp_tag_t* tag)
 {
@@ -185,7 +185,7 @@ static int __init parse_bootparam(const bp_tag_t *tag)
 }
 #endif
 
-#ifdef CONFIG_OF
+#ifdef CONFIG_USE_OF
 
 #if !XCHAL_HAVE_PTP_MMU || XCHAL_HAVE_SPANNING_WAY
 unsigned long xtensa_kio_paddr = XCHAL_KIO_DEFAULT_PADDR;
@@ -234,7 +234,7 @@ void __init early_init_devtree(void *params)
 		strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
 }
 
-#endif /* CONFIG_OF */
+#endif /* CONFIG_USE_OF */
 
 /*
  * Initialize architecture. (Early stage)
@@ -255,7 +255,7 @@ void __init init_arch(bp_tag_t *bp_start)
 	if (bp_start)
 		parse_bootparam(bp_start);
 
-#ifdef CONFIG_OF
+#ifdef CONFIG_USE_OF
 	early_init_devtree(dtb_start);
 #endif
 
diff --git a/arch/xtensa/mm/mmu.c b/arch/xtensa/mm/mmu.c
index 9d1ecfc53670..470843188f2f 100644
--- a/arch/xtensa/mm/mmu.c
+++ b/arch/xtensa/mm/mmu.c
@@ -98,7 +98,7 @@ void init_mmu(void)
 
 void init_kio(void)
 {
-#if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && defined(CONFIG_OF)
+#if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && defined(CONFIG_USE_OF)
 	/*
 	 * Update the IO area mapping in case xtensa_kio_paddr has changed
 	 */

commit bbaf4fe5ec34e7931af9a03a60b4071c2bc01ae0
Author: Steven Rostedt (VMware) <rostedt@goodmis.org>
Date:   Fri Nov 26 17:34:42 2021 -0500

    tracing: Fix pid filtering when triggers are attached
    
    commit a55f224ff5f238013de8762c4287117e47b86e22 upstream.
    
    If a event is filtered by pid and a trigger that requires processing of
    the event to happen is a attached to the event, the discard portion does
    not take the pid filtering into account, and the event will then be
    recorded when it should not have been.
    
    Cc: stable@vger.kernel.org
    Fixes: 3fdaf80f4a836 ("tracing: Implement event pid filtering")
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index 2c4068d8776e..74185fb040f3 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -1365,14 +1365,26 @@ __event_trigger_test_discard(struct trace_event_file *file,
 	if (eflags & EVENT_FILE_FL_TRIGGER_COND)
 		*tt = event_triggers_call(file, entry, event);
 
-	if (test_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &file->flags) ||
-	    (unlikely(file->flags & EVENT_FILE_FL_FILTERED) &&
-	     !filter_match_preds(file->filter, entry))) {
-		__trace_event_discard_commit(buffer, event);
-		return true;
-	}
+	if (likely(!(file->flags & (EVENT_FILE_FL_SOFT_DISABLED |
+				    EVENT_FILE_FL_FILTERED |
+				    EVENT_FILE_FL_PID_FILTER))))
+		return false;
+
+	if (file->flags & EVENT_FILE_FL_SOFT_DISABLED)
+		goto discard;
+
+	if (file->flags & EVENT_FILE_FL_FILTERED &&
+	    !filter_match_preds(file->filter, entry))
+		goto discard;
+
+	if ((file->flags & EVENT_FILE_FL_PID_FILTER) &&
+	    trace_event_ignore_this_pid(file))
+		goto discard;
 
 	return false;
+ discard:
+	__trace_event_discard_commit(buffer, event);
+	return true;
 }
 
 /**

commit 8963bf33bb8f170c01baef5781c8d807770f6ecb
Author: Stefano Stabellini <stefano.stabellini@xilinx.com>
Date:   Tue Nov 23 13:07:48 2021 -0800

    xen: detect uninitialized xenbus in xenbus_init
    
    commit 36e8f60f0867d3b70d398d653c17108459a04efe upstream.
    
    If the xenstore page hasn't been allocated properly, reading the value
    of the related hvm_param (HVM_PARAM_STORE_PFN) won't actually return
    error. Instead, it will succeed and return zero. Instead of attempting
    to xen_remap a bad guest physical address, detect this condition and
    return early.
    
    Note that although a guest physical address of zero for
    HVM_PARAM_STORE_PFN is theoretically possible, it is not a good choice
    and zero has never been validly used in that capacity.
    
    Also recognize all bits set as an invalid value.
    
    For 32-bit Linux, any pfn above ULONG_MAX would get truncated. Pfns
    above ULONG_MAX should never be passed by the Xen tools to HVM guests
    anyway, so check for this condition and return early.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Stefano Stabellini <stefano.stabellini@xilinx.com>
    Reviewed-by: Juergen Gross <jgross@suse.com>
    Reviewed-by: Jan Beulich <jbeulich@suse.com>
    Link: https://lore.kernel.org/r/20211123210748.1910236-1-sstabellini@kernel.org
    Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c
index 5d5efff20650..b911a91bce6b 100644
--- a/drivers/xen/xenbus/xenbus_probe.c
+++ b/drivers/xen/xenbus/xenbus_probe.c
@@ -886,6 +886,29 @@ static int __init xenbus_init(void)
 		err = hvm_get_parameter(HVM_PARAM_STORE_PFN, &v);
 		if (err)
 			goto out_error;
+		/*
+		 * Uninitialized hvm_params are zero and return no error.
+		 * Although it is theoretically possible to have
+		 * HVM_PARAM_STORE_PFN set to zero on purpose, in reality it is
+		 * not zero when valid. If zero, it means that Xenstore hasn't
+		 * been properly initialized. Instead of attempting to map a
+		 * wrong guest physical address return error.
+		 *
+		 * Also recognize all bits set as an invalid value.
+		 */
+		if (!v || !~v) {
+			err = -ENOENT;
+			goto out_error;
+		}
+		/* Avoid truncation on 32-bit. */
+#if BITS_PER_LONG == 32
+		if (v > ULONG_MAX) {
+			pr_err("%s: cannot handle HVM_PARAM_STORE_PFN=%llx > ULONG_MAX\n",
+			       __func__, v);
+			err = -EINVAL;
+			goto out_error;
+		}
+#endif
 		xen_store_gfn = (unsigned long)v;
 		xen_store_interface =
 			xen_remap(xen_store_gfn << XEN_PAGE_SHIFT,

commit 3ce18bdaf9b3363d9b2be5f00210fb37ec8fda58
Author: Stefano Stabellini <stefano.stabellini@xilinx.com>
Date:   Mon Nov 15 14:27:19 2021 -0800

    xen: don't continue xenstore initialization in case of errors
    
    commit 08f6c2b09ebd4b326dbe96d13f94fee8f9814c78 upstream.
    
    In case of errors in xenbus_init (e.g. missing xen_store_gfn parameter),
    we goto out_error but we forget to reset xen_store_domain_type to
    XS_UNKNOWN. As a consequence xenbus_probe_initcall and other initcalls
    will still try to initialize xenstore resulting into a crash at boot.
    
    [    2.479830] Call trace:
    [    2.482314]  xb_init_comms+0x18/0x150
    [    2.486354]  xs_init+0x34/0x138
    [    2.489786]  xenbus_probe+0x4c/0x70
    [    2.498432]  xenbus_probe_initcall+0x2c/0x7c
    [    2.503944]  do_one_initcall+0x54/0x1b8
    [    2.507358]  kernel_init_freeable+0x1ac/0x210
    [    2.511617]  kernel_init+0x28/0x130
    [    2.516112]  ret_from_fork+0x10/0x20
    
    Cc: <Stable@vger.kernel.org>
    Cc: jbeulich@suse.com
    Signed-off-by: Stefano Stabellini <stefano.stabellini@xilinx.com>
    Link: https://lore.kernel.org/r/20211115222719.2558207-1-sstabellini@kernel.org
    Reviewed-by: Jan Beulich <jbeulich@suse.com>
    Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c
index 652894d61967..5d5efff20650 100644
--- a/drivers/xen/xenbus/xenbus_probe.c
+++ b/drivers/xen/xenbus/xenbus_probe.c
@@ -846,7 +846,7 @@ static struct notifier_block xenbus_resume_nb = {
 
 static int __init xenbus_init(void)
 {
-	int err = 0;
+	int err;
 	uint64_t v = 0;
 	xen_store_domain_type = XS_UNKNOWN;
 
@@ -920,8 +920,10 @@ static int __init xenbus_init(void)
 	 */
 	proc_create_mount_point("xen");
 #endif
+	return 0;
 
 out_error:
+	xen_store_domain_type = XS_UNKNOWN;
 	return err;
 }
 

commit 65f1f3eb09a3907c5f5edaff6c473b99e49e6020
Author: Miklos Szeredi <mszeredi@redhat.com>
Date:   Tue Nov 2 11:10:37 2021 +0100

    fuse: fix page stealing
    
    commit 712a951025c0667ff00b25afc360f74e639dfabe upstream.
    
    It is possible to trigger a crash by splicing anon pipe bufs to the fuse
    device.
    
    The reason for this is that anon_pipe_buf_release() will reuse buf->page if
    the refcount is 1, but that page might have already been stolen and its
    flags modified (e.g. PG_lru added).
    
    This happens in the unlikely case of fuse_dev_splice_write() getting around
    to calling pipe_buf_release() after a page has been stolen, added to the
    page cache and removed from the page cache.
    
    Fix by calling pipe_buf_release() right after the page was inserted into
    the page cache.  In this case the page has an elevated refcount so any
    release function will know that the page isn't reusable.
    
    Reported-by: Frank Dinoff <fdinoff@google.com>
    Link: https://lore.kernel.org/r/CAAmZXrsGg2xsP1CK+cbuEMumtrqdvD-NKnWzhNcvn71RV3c1yw@mail.gmail.com/
    Fixes: dd3bb14f44a6 ("fuse: support splice() writing to fuse device")
    Cc: <stable@vger.kernel.org> # v2.6.35
    Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index 8b22f8705dd4..496fad83abac 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -905,6 +905,12 @@ static int fuse_try_move_page(struct fuse_copy_state *cs, struct page **pagep)
 		goto out_put_old;
 	}
 
+	/*
+	 * Release while we have extra ref on stolen page.  Otherwise
+	 * anon_pipe_buf_release() might think the page can be reused.
+	 */
+	pipe_buf_release(cs->pipe, buf);
+
 	get_page(newpage);
 
 	if (!(buf->flags & PIPE_BUF_FLAG_LRU))
@@ -2054,8 +2060,12 @@ static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe,
 
 	pipe_lock(pipe);
 out_free:
-	for (idx = 0; idx < nbuf; idx++)
-		pipe_buf_release(pipe, &bufs[idx]);
+	for (idx = 0; idx < nbuf; idx++) {
+		struct pipe_buffer *buf = &bufs[idx];
+
+		if (buf->ops)
+			pipe_buf_release(pipe, buf);
+	}
 	pipe_unlock(pipe);
 
 	kvfree(bufs);

commit bca19bb2dc2d89ce60c4a4a6e59609d4cf2e13ef
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Wed Nov 17 10:20:16 2021 +0300

    staging: rtl8192e: Fix use after free in _rtl92e_pci_disconnect()
    
    commit b535917c51acc97fb0761b1edec85f1f3d02bda4 upstream.
    
    The free_rtllib() function frees the "dev" pointer so there is use
    after free on the next line.  Re-arrange things to avoid that.
    
    Fixes: 66898177e7e5 ("staging: rtl8192e: Fix unload/reload problem")
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Link: https://lore.kernel.org/r/20211117072016.GA5237@kili
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/staging/rtl8192e/rtl8192e/rtl_core.c b/drivers/staging/rtl8192e/rtl8192e/rtl_core.c
index 7cdced0b0581..da73998bc5f7 100644
--- a/drivers/staging/rtl8192e/rtl8192e/rtl_core.c
+++ b/drivers/staging/rtl8192e/rtl8192e/rtl_core.c
@@ -2579,13 +2579,14 @@ static void _rtl92e_pci_disconnect(struct pci_dev *pdev)
 			free_irq(dev->irq, dev);
 			priv->irq = 0;
 		}
-		free_rtllib(dev);
 
 		if (dev->mem_start != 0) {
 			iounmap((void __iomem *)dev->mem_start);
 			release_mem_region(pci_resource_start(pdev, 1),
 					pci_resource_len(pdev, 1));
 		}
+
+		free_rtllib(dev);
 	} else {
 		priv = rtllib_priv(dev);
 	}

commit 5bb5601922076551e102a456944816c926a178e3
Author: Jason Gerecke <killertofu@gmail.com>
Date:   Mon Nov 8 16:31:01 2021 -0800

    HID: wacom: Use "Confidence" flag to prevent reporting invalid contacts
    
    commit 7fb0413baa7f8a04caef0c504df9af7e0623d296 upstream.
    
    The HID descriptor of many of Wacom's touch input devices include a
    "Confidence" usage that signals if a particular touch collection contains
    useful data. The driver does not look at this flag, however, which causes
    even invalid contacts to be reported to userspace. A lucky combination of
    kernel event filtering and device behavior (specifically: contact ID 0 ==
    invalid, contact ID >0 == valid; and order all data so that all valid
    contacts are reported before any invalid contacts) spare most devices from
    any visibly-bad behavior.
    
    The DTH-2452 is one example of an unlucky device that misbehaves. It uses
    ID 0 for both the first valid contact and all invalid contacts. Because
    we report both the valid and invalid contacts, the kernel reports that
    contact 0 first goes down (valid) and then goes up (invalid) in every
    report. This causes ~100 clicks per second simply by touching the screen.
    
    This patch inroduces new `confidence` flag in our `hid_data` structure.
    The value is initially set to `true` at the start of a report and can be
    set to `false` if an invalid touch usage is seen.
    
    Link: https://github.com/linuxwacom/input-wacom/issues/270
    Fixes: f8b6a74719b5 ("HID: wacom: generic: Support multiple tools per report")
    Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com>
    Tested-by: Joshua Dickens <joshua.dickens@wacom.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Jiri Kosina <jkosina@suse.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
index 10524c93f8b6..f22f59df0260 100644
--- a/drivers/hid/wacom_wac.c
+++ b/drivers/hid/wacom_wac.c
@@ -2538,6 +2538,9 @@ static void wacom_wac_finger_event(struct hid_device *hdev,
 	struct wacom_features *features = &wacom->wacom_wac.features;
 
 	switch (equivalent_usage) {
+	case HID_DG_CONFIDENCE:
+		wacom_wac->hid_data.confidence = value;
+		break;
 	case HID_GD_X:
 		wacom_wac->hid_data.x = value;
 		break;
@@ -2568,7 +2571,8 @@ static void wacom_wac_finger_event(struct hid_device *hdev,
 
 
 	if (usage->usage_index + 1 == field->report_count) {
-		if (equivalent_usage == wacom_wac->hid_data.last_slot_field)
+		if (equivalent_usage == wacom_wac->hid_data.last_slot_field &&
+		    wacom_wac->hid_data.confidence)
 			wacom_wac_finger_slot(wacom_wac, wacom_wac->touch_input);
 	}
 }
@@ -2581,6 +2585,8 @@ static void wacom_wac_finger_pre_report(struct hid_device *hdev,
 	struct hid_data* hid_data = &wacom_wac->hid_data;
 	int i;
 
+	hid_data->confidence = true;
+
 	for (i = 0; i < report->maxfield; i++) {
 		struct hid_field *field = report->field[i];
 		int j;
diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h
index 0abed1e5b526..48ce2b0a4549 100644
--- a/drivers/hid/wacom_wac.h
+++ b/drivers/hid/wacom_wac.h
@@ -302,6 +302,7 @@ struct hid_data {
 	bool tipswitch;
 	bool barrelswitch;
 	bool barrelswitch2;
+	bool confidence;
 	int x;
 	int y;
 	int pressure;

commit e4ca6cbd5c19e7e90b6b9c114f7364e603364842
Author: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Date:   Tue Nov 2 12:24:26 2021 +0000

    media: cec: copy sequence field for the reply
    
    commit 13cbaa4c2b7bf9f8285e1164d005dbf08244ecd5 upstream.
    
    When the reply for a non-blocking transmit arrives, the sequence
    field for that reply was never filled in, so userspace would have no
    way of associating the reply to the original transmit.
    
    Copy the sequence field to ensure that this is now possible.
    
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Fixes: 0dbacebede1e ([media] cec: move the CEC framework out of staging and to media)
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/media/cec/cec-adap.c b/drivers/media/cec/cec-adap.c
index 60b20ae02b05..5eeadab15a5f 100644
--- a/drivers/media/cec/cec-adap.c
+++ b/drivers/media/cec/cec-adap.c
@@ -1146,6 +1146,7 @@ void cec_received_msg_ts(struct cec_adapter *adap,
 			if (abort)
 				dst->rx_status |= CEC_RX_STATUS_FEATURE_ABORT;
 			msg->flags = dst->flags;
+			msg->sequence = dst->sequence;
 			/* Remove it from the wait_queue */
 			list_del_init(&data->list);
 

commit de8f8b39c95fea9b0aed9c4f7b2bf2cc5ff55a67
Author: Takashi Iwai <tiwai@suse.de>
Date:   Thu Nov 18 22:57:29 2021 +0100

    ALSA: ctxfi: Fix out-of-range access
    
    commit 76c47183224c86e4011048b80f0e2d0d166f01c2 upstream.
    
    The master and next_conj of rcs_ops are used for iterating the
    resource list entries, and currently those are supposed to return the
    current value.  The problem is that next_conf may go over the last
    entry before the loop abort condition is evaluated, and it may return
    the "current" value that is beyond the array size.  It was caught
    recently as a GPF, for example.
    
    Those return values are, however, never actually evaluated, hence
    basically we don't have to consider the current value as the return at
    all.  By dropping those return values, the potential out-of-range
    access above is also fixed automatically.
    
    This patch changes the return type of master and next_conj callbacks
    to void and drop the superfluous code accordingly.
    
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=214985
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20211118215729.26257-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/pci/ctxfi/ctamixer.c b/sound/pci/ctxfi/ctamixer.c
index 5fcbb065d870..d32685ce6c05 100644
--- a/sound/pci/ctxfi/ctamixer.c
+++ b/sound/pci/ctxfi/ctamixer.c
@@ -27,16 +27,15 @@
 
 #define BLANK_SLOT		4094
 
-static int amixer_master(struct rsc *rsc)
+static void amixer_master(struct rsc *rsc)
 {
 	rsc->conj = 0;
-	return rsc->idx = container_of(rsc, struct amixer, rsc)->idx[0];
+	rsc->idx = container_of(rsc, struct amixer, rsc)->idx[0];
 }
 
-static int amixer_next_conj(struct rsc *rsc)
+static void amixer_next_conj(struct rsc *rsc)
 {
 	rsc->conj++;
-	return container_of(rsc, struct amixer, rsc)->idx[rsc->conj];
 }
 
 static int amixer_index(const struct rsc *rsc)
@@ -335,16 +334,15 @@ int amixer_mgr_destroy(struct amixer_mgr *amixer_mgr)
 
 /* SUM resource management */
 
-static int sum_master(struct rsc *rsc)
+static void sum_master(struct rsc *rsc)
 {
 	rsc->conj = 0;
-	return rsc->idx = container_of(rsc, struct sum, rsc)->idx[0];
+	rsc->idx = container_of(rsc, struct sum, rsc)->idx[0];
 }
 
-static int sum_next_conj(struct rsc *rsc)
+static void sum_next_conj(struct rsc *rsc)
 {
 	rsc->conj++;
-	return container_of(rsc, struct sum, rsc)->idx[rsc->conj];
 }
 
 static int sum_index(const struct rsc *rsc)
diff --git a/sound/pci/ctxfi/ctdaio.c b/sound/pci/ctxfi/ctdaio.c
index f35a7341e446..ed6e15d1f10f 100644
--- a/sound/pci/ctxfi/ctdaio.c
+++ b/sound/pci/ctxfi/ctdaio.c
@@ -55,12 +55,12 @@ static struct daio_rsc_idx idx_20k2[NUM_DAIOTYP] = {
 	[SPDIFIO] = {.left = 0x05, .right = 0x85},
 };
 
-static int daio_master(struct rsc *rsc)
+static void daio_master(struct rsc *rsc)
 {
 	/* Actually, this is not the resource index of DAIO.
 	 * For DAO, it is the input mapper index. And, for DAI,
 	 * it is the output time-slot index. */
-	return rsc->conj = rsc->idx;
+	rsc->conj = rsc->idx;
 }
 
 static int daio_index(const struct rsc *rsc)
@@ -68,19 +68,19 @@ static int daio_index(const struct rsc *rsc)
 	return rsc->conj;
 }
 
-static int daio_out_next_conj(struct rsc *rsc)
+static void daio_out_next_conj(struct rsc *rsc)
 {
-	return rsc->conj += 2;
+	rsc->conj += 2;
 }
 
-static int daio_in_next_conj_20k1(struct rsc *rsc)
+static void daio_in_next_conj_20k1(struct rsc *rsc)
 {
-	return rsc->conj += 0x200;
+	rsc->conj += 0x200;
 }
 
-static int daio_in_next_conj_20k2(struct rsc *rsc)
+static void daio_in_next_conj_20k2(struct rsc *rsc)
 {
-	return rsc->conj += 0x100;
+	rsc->conj += 0x100;
 }
 
 static const struct rsc_ops daio_out_rsc_ops = {
diff --git a/sound/pci/ctxfi/ctresource.c b/sound/pci/ctxfi/ctresource.c
index 80c4d84f9667..f05a09ed42b8 100644
--- a/sound/pci/ctxfi/ctresource.c
+++ b/sound/pci/ctxfi/ctresource.c
@@ -113,18 +113,17 @@ static int audio_ring_slot(const struct rsc *rsc)
     return (rsc->conj << 4) + offset_in_audio_slot_block[rsc->type];
 }
 
-static int rsc_next_conj(struct rsc *rsc)
+static void rsc_next_conj(struct rsc *rsc)
 {
 	unsigned int i;
 	for (i = 0; (i < 8) && (!(rsc->msr & (0x1 << i))); )
 		i++;
 	rsc->conj += (AUDIO_SLOT_BLOCK_NUM >> i);
-	return rsc->conj;
 }
 
-static int rsc_master(struct rsc *rsc)
+static void rsc_master(struct rsc *rsc)
 {
-	return rsc->conj = rsc->idx;
+	rsc->conj = rsc->idx;
 }
 
 static const struct rsc_ops rsc_generic_ops = {
diff --git a/sound/pci/ctxfi/ctresource.h b/sound/pci/ctxfi/ctresource.h
index 736d9f7e9e16..29b6fe6de659 100644
--- a/sound/pci/ctxfi/ctresource.h
+++ b/sound/pci/ctxfi/ctresource.h
@@ -43,8 +43,8 @@ struct rsc {
 };
 
 struct rsc_ops {
-	int (*master)(struct rsc *rsc);	/* Move to master resource */
-	int (*next_conj)(struct rsc *rsc); /* Move to next conjugate resource */
+	void (*master)(struct rsc *rsc); /* Move to master resource */
+	void (*next_conj)(struct rsc *rsc); /* Move to next conjugate resource */
 	int (*index)(const struct rsc *rsc); /* Return the index of resource */
 	/* Return the output slot number */
 	int (*output_slot)(const struct rsc *rsc);
diff --git a/sound/pci/ctxfi/ctsrc.c b/sound/pci/ctxfi/ctsrc.c
index a4fc10723fc6..660ca0272e39 100644
--- a/sound/pci/ctxfi/ctsrc.c
+++ b/sound/pci/ctxfi/ctsrc.c
@@ -594,16 +594,15 @@ int src_mgr_destroy(struct src_mgr *src_mgr)
 
 /* SRCIMP resource manager operations */
 
-static int srcimp_master(struct rsc *rsc)
+static void srcimp_master(struct rsc *rsc)
 {
 	rsc->conj = 0;
-	return rsc->idx = container_of(rsc, struct srcimp, rsc)->idx[0];
+	rsc->idx = container_of(rsc, struct srcimp, rsc)->idx[0];
 }
 
-static int srcimp_next_conj(struct rsc *rsc)
+static void srcimp_next_conj(struct rsc *rsc)
 {
 	rsc->conj++;
-	return container_of(rsc, struct srcimp, rsc)->idx[rsc->conj];
 }
 
 static int srcimp_index(const struct rsc *rsc)

commit c3b9f29fca6682550d731c80745b421415c1e0af
Author: Todd Kjos <tkjos@google.com>
Date:   Fri Nov 12 10:07:20 2021 -0800

    binder: fix test regression due to sender_euid change
    
    commit c21a80ca0684ec2910344d72556c816cb8940c01 upstream.
    
    This is a partial revert of commit
    29bc22ac5e5b ("binder: use euid from cred instead of using task").
    Setting sender_euid using proc->cred caused some Android system test
    regressions that need further investigation. It is a partial
    reversion because subsequent patches rely on proc->cred.
    
    Fixes: 29bc22ac5e5b ("binder: use euid from cred instead of using task")
    Cc: stable@vger.kernel.org # 4.4+
    Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
    Signed-off-by: Todd Kjos <tkjos@google.com>
    Change-Id: I9b1769a3510fed250bb21859ef8beebabe034c66
    Link: https://lore.kernel.org/r/20211112180720.2858135-1-tkjos@google.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/android/binder.c b/drivers/android/binder.c
index 83be89c8627b..9229c5c9ad47 100644
--- a/drivers/android/binder.c
+++ b/drivers/android/binder.c
@@ -2966,7 +2966,7 @@ static void binder_transaction(struct binder_proc *proc,
 		t->from = thread;
 	else
 		t->from = NULL;
-	t->sender_euid = proc->cred->euid;
+	t->sender_euid = task_euid(proc->tsk);
 	t->to_proc = target_proc;
 	t->to_thread = target_thread;
 	t->code = tr->code;

commit 84a43ffae04c674af5bb1eabc4c54e973b64419e
Author: Mathias Nyman <mathias.nyman@linux.intel.com>
Date:   Tue Nov 23 12:16:56 2021 +0200

    usb: hub: Fix locking issues with address0_mutex
    
    commit 6cca13de26eea6d32a98d96d916a048d16a12822 upstream.
    
    Fix the circular lock dependency and unbalanced unlock of addess0_mutex
    introduced when fixing an address0_mutex enumeration retry race in commit
    ae6dc22d2d1 ("usb: hub: Fix usb enumeration issue due to address0 race")
    
    Make sure locking order between port_dev->status_lock and address0_mutex
    is correct, and that address0_mutex is not unlocked in hub_port_connect
    "done:" codepath which may be reached without locking address0_mutex
    
    Fixes: 6ae6dc22d2d1 ("usb: hub: Fix usb enumeration issue due to address0 race")
    Cc: <stable@vger.kernel.org>
    Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>
    Tested-by: Hans de Goede <hdegoede@redhat.com>
    Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
    Acked-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Link: https://lore.kernel.org/r/20211123101656.1113518-1-mathias.nyman@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index e15cf22e970b..73ad4af48703 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -4978,6 +4978,7 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
 	struct usb_port *port_dev = hub->ports[port1 - 1];
 	struct usb_device *udev = port_dev->child;
 	static int unreliable_port = -1;
+	bool retry_locked;
 
 	/* Disconnect any existing devices under this port */
 	if (udev) {
@@ -5034,9 +5035,10 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
 
 	status = 0;
 
-	mutex_lock(hcd->address0_mutex);
-
 	for (i = 0; i < SET_CONFIG_TRIES; i++) {
+		usb_lock_port(port_dev);
+		mutex_lock(hcd->address0_mutex);
+		retry_locked = true;
 
 		/* reallocate for each attempt, since references
 		 * to the previous one can escape in various ways
@@ -5045,6 +5047,8 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
 		if (!udev) {
 			dev_err(&port_dev->dev,
 					"couldn't allocate usb_device\n");
+			mutex_unlock(hcd->address0_mutex);
+			usb_unlock_port(port_dev);
 			goto done;
 		}
 
@@ -5066,13 +5070,13 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
 		}
 
 		/* reset (non-USB 3.0 devices) and get descriptor */
-		usb_lock_port(port_dev);
 		status = hub_port_init(hub, udev, port1, i);
-		usb_unlock_port(port_dev);
 		if (status < 0)
 			goto loop;
 
 		mutex_unlock(hcd->address0_mutex);
+		usb_unlock_port(port_dev);
+		retry_locked = false;
 
 		if (udev->quirks & USB_QUIRK_DELAY_INIT)
 			msleep(2000);
@@ -5162,11 +5166,14 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
 
 loop_disable:
 		hub_port_disable(hub, port1, 1);
-		mutex_lock(hcd->address0_mutex);
 loop:
 		usb_ep0_reinit(udev);
 		release_devnum(udev);
 		hub_free_dev(udev);
+		if (retry_locked) {
+			mutex_unlock(hcd->address0_mutex);
+			usb_unlock_port(port_dev);
+		}
 		usb_put_dev(udev);
 		if ((status == -ENOTCONN) || (status == -ENOTSUPP))
 			break;
@@ -5189,8 +5196,6 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
 	}
 
 done:
-	mutex_unlock(hcd->address0_mutex);
-
 	hub_port_disable(hub, port1, 1);
 	if (hcd->driver->relinquish_port && !hub->hdev->parent) {
 		if (status != -ENOTCONN && status != -ENODEV)

commit b8416a099af73ea4770e23a0cf7c10312c45fd96
Author: Mathias Nyman <mathias.nyman@linux.intel.com>
Date:   Tue Nov 16 00:16:30 2021 +0200

    usb: hub: Fix usb enumeration issue due to address0 race
    
    commit 6ae6dc22d2d1ce6aa77a6da8a761e61aca216f8b upstream.
    
    xHC hardware can only have one slot in default state with address 0
    waiting for a unique address at a time, otherwise "undefined behavior
    may occur" according to xhci spec 5.4.3.4
    
    The address0_mutex exists to prevent this across both xhci roothubs.
    
    If hub_port_init() fails, it may unlock the mutex and exit with a xhci
    slot in default state. If the other xhci roothub calls hub_port_init()
    at this point we end up with two slots in default state.
    
    Make sure the address0_mutex protects the slot default state across
    hub_port_init() retries, until slot is addressed or disabled.
    
    Note, one known minor case is not fixed by this patch.
    If device needs to be reset during resume, but fails all hub_port_init()
    retries in usb_reset_and_verify_device(), then it's possible the slot is
    still left in default state when address0_mutex is unlocked.
    
    Cc: <stable@vger.kernel.org>
    Fixes: 638139eb95d2 ("usb: hub: allow to process more usb hub events in parallel")
    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Link: https://lore.kernel.org/r/20211115221630.871204-1-mathias.nyman@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index f1a11032a0a0..e15cf22e970b 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -4575,8 +4575,6 @@ hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1,
 	if (oldspeed == USB_SPEED_LOW)
 		delay = HUB_LONG_RESET_TIME;
 
-	mutex_lock(hcd->address0_mutex);
-
 	/* Reset the device; full speed may morph to high speed */
 	/* FIXME a USB 2.0 device may morph into SuperSpeed on reset. */
 	retval = hub_port_reset(hub, port1, udev, delay, false);
@@ -4891,7 +4889,6 @@ hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1,
 		hub_port_disable(hub, port1, 0);
 		update_devnum(udev, devnum);	/* for disconnect processing */
 	}
-	mutex_unlock(hcd->address0_mutex);
 	return retval;
 }
 
@@ -5036,6 +5033,9 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
 		unit_load = 100;
 
 	status = 0;
+
+	mutex_lock(hcd->address0_mutex);
+
 	for (i = 0; i < SET_CONFIG_TRIES; i++) {
 
 		/* reallocate for each attempt, since references
@@ -5072,6 +5072,8 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
 		if (status < 0)
 			goto loop;
 
+		mutex_unlock(hcd->address0_mutex);
+
 		if (udev->quirks & USB_QUIRK_DELAY_INIT)
 			msleep(2000);
 
@@ -5160,6 +5162,7 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
 
 loop_disable:
 		hub_port_disable(hub, port1, 1);
+		mutex_lock(hcd->address0_mutex);
 loop:
 		usb_ep0_reinit(udev);
 		release_devnum(udev);
@@ -5186,6 +5189,8 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
 	}
 
 done:
+	mutex_unlock(hcd->address0_mutex);
+
 	hub_port_disable(hub, port1, 1);
 	if (hcd->driver->relinquish_port && !hub->hdev->parent) {
 		if (status != -ENOTCONN && status != -ENODEV)
@@ -5722,6 +5727,8 @@ static int usb_reset_and_verify_device(struct usb_device *udev)
 	bos = udev->bos;
 	udev->bos = NULL;
 
+	mutex_lock(hcd->address0_mutex);
+
 	for (i = 0; i < SET_CONFIG_TRIES; ++i) {
 
 		/* ep0 maxpacket size may change; let the HCD know about it.
@@ -5731,6 +5738,7 @@ static int usb_reset_and_verify_device(struct usb_device *udev)
 		if (ret >= 0 || ret == -ENOTCONN || ret == -ENODEV)
 			break;
 	}
+	mutex_unlock(hcd->address0_mutex);
 
 	if (ret < 0)
 		goto re_enumerate;

commit c964b1bbf179a163084b1ec8ad094b8c8dce28c8
Author: Nathan Chancellor <nathan@kernel.org>
Date:   Fri Nov 5 07:58:03 2021 -0700

    usb: dwc2: hcd_queue: Fix use of floating point literal
    
    commit 310780e825f3ffd211b479b8f828885a6faedd63 upstream.
    
    A new commit in LLVM causes an error on the use of 'long double' when
    '-mno-x87' is used, which the kernel does through an alias,
    '-mno-80387' (see the LLVM commit below for more details around why it
    does this).
    
     drivers/usb/dwc2/hcd_queue.c:1744:25: error: expression requires  'long double' type support, but target 'x86_64-unknown-linux-gnu' does not support it
                             delay = ktime_set(0, DWC2_RETRY_WAIT_DELAY);
                                                 ^
     drivers/usb/dwc2/hcd_queue.c:62:34: note: expanded from macro 'DWC2_RETRY_WAIT_DELAY'
     #define DWC2_RETRY_WAIT_DELAY (1 * 1E6L)
                                     ^
     1 error generated.
    
    This happens due to the use of a 'long double' literal. The 'E6' part of
    '1E6L' causes the literal to be a 'double' then the 'L' suffix promotes
    it to 'long double'.
    
    There is no visible reason for a floating point value in this driver, as
    the value is only used as a parameter to a function that expects an
    integer type. Use NSEC_PER_MSEC, which is the same integer value as
    '1E6L', to avoid changing functionality but fix the error.
    
    Link: https://github.com/ClangBuiltLinux/linux/issues/1497
    Link: https://github.com/llvm/llvm-project/commit/a8083d42b1c346e21623a1d36d1f0cadd7801d83
    Fixes: 6ed30a7d8ec2 ("usb: dwc2: host: use hrtimer for NAK retries")
    Cc: stable <stable@vger.kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
    Reviewed-by: John Keeping <john@metanate.com>
    Acked-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Link: https://lore.kernel.org/r/20211105145802.2520658-1-nathan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/dwc2/hcd_queue.c b/drivers/usb/dwc2/hcd_queue.c
index 68bbac64b753..94af71e9856f 100644
--- a/drivers/usb/dwc2/hcd_queue.c
+++ b/drivers/usb/dwc2/hcd_queue.c
@@ -59,7 +59,7 @@
 #define DWC2_UNRESERVE_DELAY (msecs_to_jiffies(5))
 
 /* If we get a NAK, wait this long before retrying */
-#define DWC2_RETRY_WAIT_DELAY 1*1E6L
+#define DWC2_RETRY_WAIT_DELAY (1 * NSEC_PER_MSEC)
 
 /**
  * dwc2_periodic_channel_available() - Checks that a channel is available for a

commit d9de0adfc48f957380e67d721bbcb08a8b1d2e00
Author: Mingjie Zhang <superzmj@fibocom.com>
Date:   Tue Nov 23 21:37:57 2021 +0800

    USB: serial: option: add Fibocom FM101-GL variants
    
    commit 88459e3e42760abb2299bbf6cb1026491170e02a upstream.
    
    Update the USB serial option driver support for the Fibocom
    FM101-GL Cat.6
    LTE modules as there are actually several different variants.
    - VID:PID 2cb7:01a2, FM101-GL are laptop M.2 cards (with
      MBIM interfaces for /Linux/Chrome OS)
    - VID:PID 2cb7:01a4, FM101-GL for laptop debug M.2 cards(with adb
      interface for /Linux/Chrome OS)
    
    0x01a2: mbim, tty, tty, diag, gnss
    0x01a4: mbim, diag, tty, adb, gnss, gnss
    
    Here are the outputs of lsusb -v and usb-devices:
    
    T:  Bus=02 Lev=01 Prnt=01 Port=03 Cnt=01 Dev#= 86 Spd=5000 MxCh= 0
    D:  Ver= 3.20 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs=  1
    P:  Vendor=2cb7 ProdID=01a2 Rev= 5.04
    S:  Manufacturer=Fibocom Wireless Inc.
    S:  Product=Fibocom FM101-GL Module
    S:  SerialNumber=673326ce
    C:* #Ifs= 6 Cfg#= 1 Atr=a0 MxPwr=896mA
    A:  FirstIf#= 0 IfCount= 2 Cls=02(comm.) Sub=0e Prot=00
    I:* If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=0e Prot=00 Driver=cdc_mbim
    I:  If#= 1 Alt= 0 #EPs= 0 Cls=0a(data ) Sub=00 Prot=02 Driver=cdc_mbim
    I:* If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=02 Driver=cdc_mbim
    I:* If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=(none)
    I:* If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=(none)
    I:* If#= 4 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=(none)
    I:* If#= 5 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=40 Driver=(none)
    
    Bus 002 Device 084: ID 2cb7:01a2 Fibocom Wireless Inc. Fibocom FM101-GL Module
    Device Descriptor:
      bLength                18
      bDescriptorType         1
      bcdUSB               3.20
      bDeviceClass            0
      bDeviceSubClass         0
      bDeviceProtocol         0
      bMaxPacketSize0         9
      idVendor           0x2cb7
      idProduct          0x01a2
      bcdDevice            5.04
      iManufacturer           1 Fibocom Wireless Inc.
      iProduct                2 Fibocom FM101-GL Module
      iSerial                 3 673326ce
      bNumConfigurations      1
      Configuration Descriptor:
        bLength                 9
        bDescriptorType         2
        wTotalLength       0x015d
        bNumInterfaces          6
        bConfigurationValue     1
        iConfiguration          4 MBIM_DUN_DUN_DIAG_NMEA
        bmAttributes         0xa0
          (Bus Powered)
          Remote Wakeup
        MaxPower              896mA
        Interface Association:
          bLength                 8
          bDescriptorType        11
          bFirstInterface         0
          bInterfaceCount         2
          bFunctionClass          2 Communications
          bFunctionSubClass      14
          bFunctionProtocol       0
          iFunction               0
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        0
          bAlternateSetting       0
          bNumEndpoints           1
          bInterfaceClass         2 Communications
          bInterfaceSubClass     14
          bInterfaceProtocol      0
          iInterface              5 Fibocom FM101-GL LTE Modem
          CDC Header:
            bcdCDC               1.10
          CDC Union:
            bMasterInterface        0
            bSlaveInterface         1
          CDC MBIM:
            bcdMBIMVersion       1.00
            wMaxControlMessage   4096
            bNumberFilters       32
            bMaxFilterSize       128
            wMaxSegmentSize      2048
            bmNetworkCapabilities 0x20
              8-byte ntb input size
          CDC MBIM Extended:
            bcdMBIMExtendedVersion           1.00
            bMaxOutstandingCommandMessages     64
            wMTU                             1500
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x81  EP 1 IN
            bmAttributes            3
              Transfer Type            Interrupt
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0040  1x 64 bytes
            bInterval               9
            bMaxBurst               0
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        1
          bAlternateSetting       0
          bNumEndpoints           0
          bInterfaceClass        10 CDC Data
          bInterfaceSubClass      0
          bInterfaceProtocol      2
          iInterface              0
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        1
          bAlternateSetting       1
          bNumEndpoints           2
          bInterfaceClass        10 CDC Data
          bInterfaceSubClass      0
          bInterfaceProtocol      2
          iInterface              6 MBIM Data
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x8e  EP 14 IN
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               6
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x0f  EP 15 OUT
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               2
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        2
          bAlternateSetting       0
          bNumEndpoints           3
          bInterfaceClass       255 Vendor Specific Class
          bInterfaceSubClass    255 Vendor Specific Subclass
          bInterfaceProtocol     64
          iInterface              0
          ** UNRECOGNIZED:  05 24 00 10 01
          ** UNRECOGNIZED:  05 24 01 00 00
          ** UNRECOGNIZED:  04 24 02 02
          ** UNRECOGNIZED:  05 24 06 00 00
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x83  EP 3 IN
            bmAttributes            3
              Transfer Type            Interrupt
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x000a  1x 10 bytes
            bInterval               9
            bMaxBurst               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x82  EP 2 IN
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x01  EP 1 OUT
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               0
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        3
          bAlternateSetting       0
          bNumEndpoints           3
          bInterfaceClass       255 Vendor Specific Class
          bInterfaceSubClass    255 Vendor Specific Subclass
          bInterfaceProtocol     64
          iInterface              0
          ** UNRECOGNIZED:  05 24 00 10 01
          ** UNRECOGNIZED:  05 24 01 00 00
          ** UNRECOGNIZED:  04 24 02 02
          ** UNRECOGNIZED:  05 24 06 00 00
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x85  EP 5 IN
            bmAttributes            3
              Transfer Type            Interrupt
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x000a  1x 10 bytes
            bInterval               9
            bMaxBurst               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x84  EP 4 IN
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x02  EP 2 OUT
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               0
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        4
          bAlternateSetting       0
          bNumEndpoints           2
          bInterfaceClass       255 Vendor Specific Class
          bInterfaceSubClass    255 Vendor Specific Subclass
          bInterfaceProtocol     48
          iInterface              0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x03  EP 3 OUT
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x86  EP 6 IN
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               0
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        5
          bAlternateSetting       0
          bNumEndpoints           3
          bInterfaceClass       255 Vendor Specific Class
          bInterfaceSubClass      0
          bInterfaceProtocol     64
          iInterface              0
          ** UNRECOGNIZED:  05 24 00 10 01
          ** UNRECOGNIZED:  05 24 01 00 00
          ** UNRECOGNIZED:  04 24 02 02
          ** UNRECOGNIZED:  05 24 06 00 00
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x88  EP 8 IN
            bmAttributes            3
              Transfer Type            Interrupt
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x000a  1x 10 bytes
            bInterval               9
            bMaxBurst               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x87  EP 7 IN
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x04  EP 4 OUT
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               0
    
    T:  Bus=02 Lev=01 Prnt=01 Port=03 Cnt=01 Dev#= 85 Spd=5000 MxCh= 0
    D:  Ver= 3.20 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs=  1
    P:  Vendor=2cb7 ProdID=01a4 Rev= 5.04
    S:  Manufacturer=Fibocom Wireless Inc.
    S:  Product=Fibocom FM101-GL Module
    S:  SerialNumber=673326ce
    C:* #Ifs= 7 Cfg#= 1 Atr=a0 MxPwr=896mA
    A:  FirstIf#= 0 IfCount= 2 Cls=02(comm.) Sub=0e Prot=00
    I:* If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=0e Prot=00 Driver=cdc_mbim
    I:  If#= 1 Alt= 0 #EPs= 0 Cls=0a(data ) Sub=00 Prot=02 Driver=cdc_mbim
    I:* If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=02 Driver=cdc_mbim
    I:* If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=(none)
    I:* If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=(none)
    I:* If#= 4 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=42 Prot=01 Driver=(none)
    I:* If#= 5 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=40 Driver=(none)
    I:* If#= 6 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=40 Driver=(none)
    
    Bus 002 Device 085: ID 2cb7:01a4 Fibocom Wireless Inc. Fibocom FM101-GL Module
    Device Descriptor:
      bLength                18
      bDescriptorType         1
      bcdUSB               3.20
      bDeviceClass            0
      bDeviceSubClass         0
      bDeviceProtocol         0
      bMaxPacketSize0         9
      idVendor           0x2cb7
      idProduct          0x01a4
      bcdDevice            5.04
      iManufacturer           1 Fibocom Wireless Inc.
      iProduct                2 Fibocom FM101-GL Module
      iSerial                 3 673326ce
      bNumConfigurations      1
      Configuration Descriptor:
        bLength                 9
        bDescriptorType         2
        wTotalLength       0x0180
        bNumInterfaces          7
        bConfigurationValue     1
        iConfiguration          4 MBIM_DIAG_DUN_ADB_GNSS_GNSS
        bmAttributes         0xa0
          (Bus Powered)
          Remote Wakeup
        MaxPower              896mA
        Interface Association:
          bLength                 8
          bDescriptorType        11
          bFirstInterface         0
          bInterfaceCount         2
          bFunctionClass          2 Communications
          bFunctionSubClass      14
          bFunctionProtocol       0
          iFunction               0
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        0
          bAlternateSetting       0
          bNumEndpoints           1
          bInterfaceClass         2 Communications
          bInterfaceSubClass     14
          bInterfaceProtocol      0
          iInterface              5 Fibocom FM101-GL LTE Modem
          CDC Header:
            bcdCDC               1.10
          CDC Union:
            bMasterInterface        0
            bSlaveInterface         1
          CDC MBIM:
            bcdMBIMVersion       1.00
            wMaxControlMessage   4096
            bNumberFilters       32
            bMaxFilterSize       128
            wMaxSegmentSize      2048
            bmNetworkCapabilities 0x20
              8-byte ntb input size
          CDC MBIM Extended:
            bcdMBIMExtendedVersion           1.00
            bMaxOutstandingCommandMessages     64
            wMTU                             1500
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x81  EP 1 IN
            bmAttributes            3
              Transfer Type            Interrupt
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0040  1x 64 bytes
            bInterval               9
            bMaxBurst               0
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        1
          bAlternateSetting       0
          bNumEndpoints           0
          bInterfaceClass        10 CDC Data
          bInterfaceSubClass      0
          bInterfaceProtocol      2
          iInterface              0
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        1
          bAlternateSetting       1
          bNumEndpoints           2
          bInterfaceClass        10 CDC Data
          bInterfaceSubClass      0
          bInterfaceProtocol      2
          iInterface              6 MBIM Data
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x8e  EP 14 IN
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               6
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x0f  EP 15 OUT
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               2
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        2
          bAlternateSetting       0
          bNumEndpoints           2
          bInterfaceClass       255 Vendor Specific Class
          bInterfaceSubClass    255 Vendor Specific Subclass
          bInterfaceProtocol     48
          iInterface              0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x01  EP 1 OUT
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x82  EP 2 IN
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               0
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        3
          bAlternateSetting       0
          bNumEndpoints           3
          bInterfaceClass       255 Vendor Specific Class
          bInterfaceSubClass    255 Vendor Specific Subclass
          bInterfaceProtocol     64
          iInterface              0
          ** UNRECOGNIZED:  05 24 00 10 01
          ** UNRECOGNIZED:  05 24 01 00 00
          ** UNRECOGNIZED:  04 24 02 02
          ** UNRECOGNIZED:  05 24 06 00 00
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x84  EP 4 IN
            bmAttributes            3
              Transfer Type            Interrupt
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x000a  1x 10 bytes
            bInterval               9
            bMaxBurst               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x83  EP 3 IN
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x02  EP 2 OUT
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               0
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        4
          bAlternateSetting       0
          bNumEndpoints           2
          bInterfaceClass       255 Vendor Specific Class
          bInterfaceSubClass     66
          bInterfaceProtocol      1
          iInterface              8 ADB Interface
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x03  EP 3 OUT
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x85  EP 5 IN
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               0
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        5
          bAlternateSetting       0
          bNumEndpoints           3
          bInterfaceClass       255 Vendor Specific Class
          bInterfaceSubClass      0
          bInterfaceProtocol     64
          iInterface              0
          ** UNRECOGNIZED:  05 24 00 10 01
          ** UNRECOGNIZED:  05 24 01 00 00
          ** UNRECOGNIZED:  04 24 02 02
          ** UNRECOGNIZED:  05 24 06 00 00
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x87  EP 7 IN
            bmAttributes            3
              Transfer Type            Interrupt
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x000a  1x 10 bytes
            bInterval               9
            bMaxBurst               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x86  EP 6 IN
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x04  EP 4 OUT
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               0
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        6
          bAlternateSetting       0
          bNumEndpoints           3
          bInterfaceClass       255 Vendor Specific Class
          bInterfaceSubClass      0
          bInterfaceProtocol     64
          iInterface              0
          ** UNRECOGNIZED:  05 24 00 10 01
          ** UNRECOGNIZED:  05 24 01 00 00
          ** UNRECOGNIZED:  04 24 02 02
          ** UNRECOGNIZED:  05 24 06 00 00
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x89  EP 9 IN
            bmAttributes            3
              Transfer Type            Interrupt
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x000a  1x 10 bytes
            bInterval               9
            bMaxBurst               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x88  EP 8 IN
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               0
          Endpoint Descriptor:
            bLength                 7
            bDescriptorType         5
            bEndpointAddress     0x05  EP 5 OUT
            bmAttributes            2
              Transfer Type            Bulk
              Synch Type               None
              Usage Type               Data
            wMaxPacketSize     0x0400  1x 1024 bytes
            bInterval               0
            bMaxBurst               0
    
    Signed-off-by: Mingjie Zhang <superzmj@fibocom.com>
    Link: https://lore.kernel.org/r/20211123133757.37475-1-superzmj@fibocom.com
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index dafecaa92d10..818097e86cb5 100644
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -2096,6 +2096,9 @@ static const struct usb_device_id option_ids[] = {
 	{ 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 */

commit 022d16c9c56b0b2dcc9f5efaa47f9262a72ec65a
Author: Daniele Palmas <dnlplm@gmail.com>
Date:   Fri Nov 19 15:03:19 2021 +0100

    USB: serial: option: add Telit LE910S1 0x9200 composition
    
    commit e353f3e88720300c3d72f49a4bea54f42db1fa5e upstream.
    
    Add the following Telit LE910S1 composition:
    
    0x9200: tty
    
    Signed-off-by: Daniele Palmas <dnlplm@gmail.com>
    Link: https://lore.kernel.org/r/20211119140319.10448-1-dnlplm@gmail.com
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index eaf118ee2a86..dafecaa92d10 100644
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -1267,6 +1267,8 @@ static const struct usb_device_id option_ids[] = {
 	  .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_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),
 	  .driver_info = RSVD(1) },

commit 3bf28c82aea7314777f5f9674cb324c960af5235
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Fri Nov 19 12:20:53 2021 +0100

    Revert "net: sched: update default qdisc visibility after Tx queue cnt changes"
    
    This reverts commit aa90302e3189686c240ce8f62215bf593aad2cb5 which is
    commit 1e080f17750d1083e8a32f7b350584ae1cd7ff20 upstream.
    
    It breaks the current kernel abi and is not necessary for Android
    systems, so it can be safely reverted.
    
    Bug: 161946584
    Fixes: 31df731c8705 ("net: sched: update default qdisc visibility after Tx queue cnt changes")
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I9844bcc7deae772026e0dc7b1265b39e392342ec

diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
index 286bc674a6e7..d737a6a2600b 100644
--- a/include/net/sch_generic.h
+++ b/include/net/sch_generic.h
@@ -216,8 +216,6 @@ struct Qdisc_ops {
 					  struct netlink_ext_ack *extack);
 	void			(*attach)(struct Qdisc *sch);
 	int			(*change_tx_queue_len)(struct Qdisc *, unsigned int);
-	void			(*change_real_num_tx)(struct Qdisc *sch,
-						      unsigned int new_real_tx);
 
 	int			(*dump)(struct Qdisc *, struct sk_buff *);
 	int			(*dump_stats)(struct Qdisc *, struct gnet_dump *);
@@ -549,8 +547,6 @@ void qdisc_class_hash_grow(struct Qdisc *, struct Qdisc_class_hash *);
 void qdisc_class_hash_destroy(struct Qdisc_class_hash *);
 
 int dev_qdisc_change_tx_queue_len(struct net_device *dev);
-void dev_qdisc_change_real_num_tx(struct net_device *dev,
-				  unsigned int new_real_tx);
 void dev_init_scheduler(struct net_device *dev);
 void dev_shutdown(struct net_device *dev);
 void dev_activate(struct net_device *dev);
diff --git a/net/core/dev.c b/net/core/dev.c
index 2d22a1cd9c9c..bba3e54fe955 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -2648,8 +2648,6 @@ int netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq)
 		if (dev->num_tc)
 			netif_setup_tc(dev, txq);
 
-		dev_qdisc_change_real_num_tx(dev, txq);
-
 		dev->real_num_tx_queues = txq;
 
 		if (disabling) {
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
index 2128b77d5cb3..4e15913e7519 100644
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
@@ -1256,15 +1256,6 @@ static int qdisc_change_tx_queue_len(struct net_device *dev,
 	return 0;
 }
 
-void dev_qdisc_change_real_num_tx(struct net_device *dev,
-				  unsigned int new_real_tx)
-{
-	struct Qdisc *qdisc = dev->qdisc;
-
-	if (qdisc->ops->change_real_num_tx)
-		qdisc->ops->change_real_num_tx(qdisc, new_real_tx);
-}
-
 int dev_qdisc_change_tx_queue_len(struct net_device *dev)
 {
 	bool up = dev->flags & IFF_UP;
diff --git a/net/sched/sch_mq.c b/net/sched/sch_mq.c
index 699b6bb444ce..c008a316e943 100644
--- a/net/sched/sch_mq.c
+++ b/net/sched/sch_mq.c
@@ -130,29 +130,6 @@ static void mq_attach(struct Qdisc *sch)
 	priv->qdiscs = NULL;
 }
 
-static void mq_change_real_num_tx(struct Qdisc *sch, unsigned int new_real_tx)
-{
-#ifdef CONFIG_NET_SCHED
-	struct net_device *dev = qdisc_dev(sch);
-	struct Qdisc *qdisc;
-	unsigned int i;
-
-	for (i = new_real_tx; i < dev->real_num_tx_queues; i++) {
-		qdisc = netdev_get_tx_queue(dev, i)->qdisc_sleeping;
-		/* Only update the default qdiscs we created,
-		 * qdiscs with handles are always hashed.
-		 */
-		if (qdisc != &noop_qdisc && !qdisc->handle)
-			qdisc_hash_del(qdisc);
-	}
-	for (i = dev->real_num_tx_queues; i < new_real_tx; i++) {
-		qdisc = netdev_get_tx_queue(dev, i)->qdisc_sleeping;
-		if (qdisc != &noop_qdisc && !qdisc->handle)
-			qdisc_hash_add(qdisc, false);
-	}
-#endif
-}
-
 static int mq_dump(struct Qdisc *sch, struct sk_buff *skb)
 {
 	struct net_device *dev = qdisc_dev(sch);
@@ -308,7 +285,6 @@ struct Qdisc_ops mq_qdisc_ops __read_mostly = {
 	.init		= mq_init,
 	.destroy	= mq_destroy,
 	.attach		= mq_attach,
-	.change_real_num_tx = mq_change_real_num_tx,
 	.dump		= mq_dump,
 	.owner		= THIS_MODULE,
 };
diff --git a/net/sched/sch_mqprio.c b/net/sched/sch_mqprio.c
index 3fd0e5dd7ae3..fcfe41a95473 100644
--- a/net/sched/sch_mqprio.c
+++ b/net/sched/sch_mqprio.c
@@ -308,28 +308,6 @@ static void mqprio_attach(struct Qdisc *sch)
 	priv->qdiscs = NULL;
 }
 
-static void mqprio_change_real_num_tx(struct Qdisc *sch,
-				      unsigned int new_real_tx)
-{
-	struct net_device *dev = qdisc_dev(sch);
-	struct Qdisc *qdisc;
-	unsigned int i;
-
-	for (i = new_real_tx; i < dev->real_num_tx_queues; i++) {
-		qdisc = netdev_get_tx_queue(dev, i)->qdisc_sleeping;
-		/* Only update the default qdiscs we created,
-		 * qdiscs with handles are always hashed.
-		 */
-		if (qdisc != &noop_qdisc && !qdisc->handle)
-			qdisc_hash_del(qdisc);
-	}
-	for (i = dev->real_num_tx_queues; i < new_real_tx; i++) {
-		qdisc = netdev_get_tx_queue(dev, i)->qdisc_sleeping;
-		if (qdisc != &noop_qdisc && !qdisc->handle)
-			qdisc_hash_add(qdisc, false);
-	}
-}
-
 static struct netdev_queue *mqprio_queue_get(struct Qdisc *sch,
 					     unsigned long cl)
 {
@@ -654,7 +632,6 @@ static struct Qdisc_ops mqprio_qdisc_ops __read_mostly = {
 	.init		= mqprio_init,
 	.destroy	= mqprio_destroy,
 	.attach		= mqprio_attach,
-	.change_real_num_tx = mqprio_change_real_num_tx,
 	.dump		= mqprio_dump,
 	.owner		= THIS_MODULE,
 };

commit d2338b78d4e5c2c3d72176773358c5b66592947c
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Fri Nov 19 12:04:53 2021 +0100

    Revert "serial: core: Fix initializing and restoring termios speed"
    
    This reverts commit cac21c3eda6fc2940d59c1e72118cd7cde844f79 which is
    commit 027b57170bf8bb6999a28e4a5f3d78bf1db0f90c upstream.
    
    It breaks the kernel abi and is not something that is necessary in
    Android systems, so it is safe to revert.
    
    Bug: 161946584
    Fixes: e9adf72bdbd5 ("serial: core: Fix initializing and restoring termios speed")
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I158a28eb7a1ac7892c836abcdbc178129de69391

diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index 2a78c7cd5d30..d3ef0f658303 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -219,11 +219,7 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
 	if (retval == 0) {
 		if (uart_console(uport) && uport->cons->cflag) {
 			tty->termios.c_cflag = uport->cons->cflag;
-			tty->termios.c_ispeed = uport->cons->ispeed;
-			tty->termios.c_ospeed = uport->cons->ospeed;
 			uport->cons->cflag = 0;
-			uport->cons->ispeed = 0;
-			uport->cons->ospeed = 0;
 		}
 		/*
 		 * Initialise the hardware port settings.
@@ -291,11 +287,8 @@ static void uart_shutdown(struct tty_struct *tty, struct uart_state *state)
 		/*
 		 * Turn off DTR and RTS early.
 		 */
-		if (uport && uart_console(uport) && tty) {
+		if (uport && uart_console(uport) && tty)
 			uport->cons->cflag = tty->termios.c_cflag;
-			uport->cons->ispeed = tty->termios.c_ispeed;
-			uport->cons->ospeed = tty->termios.c_ospeed;
-		}
 
 		if (!tty || C_HUPCL(tty))
 			uart_port_dtr_rts(uport, 0);
@@ -2069,11 +2062,8 @@ uart_set_options(struct uart_port *port, struct console *co,
 	 * Allow the setting of the UART parameters with a NULL console
 	 * too:
 	 */
-	if (co) {
+	if (co)
 		co->cflag = termios.c_cflag;
-		co->ispeed = termios.c_ispeed;
-		co->ospeed = termios.c_ospeed;
-	}
 
 	return 0;
 }
@@ -2207,8 +2197,6 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
 		 */
 		memset(&termios, 0, sizeof(struct ktermios));
 		termios.c_cflag = uport->cons->cflag;
-		termios.c_ispeed = uport->cons->ispeed;
-		termios.c_ospeed = uport->cons->ospeed;
 
 		/*
 		 * If that's unset, use the tty termios setting.
diff --git a/include/linux/console.h b/include/linux/console.h
index 35e3cc4fb4a6..ec9bdb3d7bab 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -153,8 +153,6 @@ struct console {
 	short	flags;
 	short	index;
 	int	cflag;
-	uint	ispeed;
-	uint	ospeed;
 	void	*data;
 	struct	 console *next;
 };

commit 49cb39f8c2aba181b98fe4b92dc095ccd952557d
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Mon Nov 29 22:02:03 2021 +0800

    drm/rockchip: ebc_dev: release version v2.18
    
    EPD_AUTO mode support Y8 commit
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: I237715cacb5f0fcadda47cdb683f6ee89986231b

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index 19bfe1811bf4..d4dbb16903ed 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -21,51 +21,51 @@ __initcall_ebc_init6s:
 	.p2align 3,,7
 	.type	get_auto_image, %function
 get_auto_image:
-.LFB2814:
+.LFB2815:
 	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
-	.loc 1 458 0
+	.loc 1 525 0
 	.cfi_startproc
 .LVL0:
-	.loc 1 459 0
+	.loc 1 526 0
 	adrp	x5, .LANCHOR0
-	.loc 1 467 0
+	.loc 1 534 0
 	ldrb	w11, [x4, 48]
 .LVL1:
-	.loc 1 459 0
+	.loc 1 526 0
 	ldr	x16, [x5, #:lo12:.LANCHOR0]
-	.loc 1 471 0
+	.loc 1 538 0
 	add	x16, x16, 24
 	ldr	w18, [x16, 156]
-	.loc 1 477 0
+	.loc 1 544 0
 	ldp	w12, w17, [x16, 84]
-	.loc 1 479 0
+	.loc 1 546 0
 	str	wzr, [x4, 52]
 .LVL2:
-	.loc 1 485 0
+	.loc 1 552 0
 	cmp	w17, 0
 	ble	.L54
 	lsr	w12, w12, 3
 .LVL3:
-	.loc 1 458 0
+	.loc 1 525 0
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
 	sub	w15, w12, #1
-	.loc 1 485 0
+	.loc 1 552 0
 	mov	w14, 0
 .LVL4:
 	add	x15, x15, 1
-	.loc 1 458 0
+	.loc 1 525 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	lsl	x30, x15, 3
 	lsl	x15, x15, 2
 	stp	x19, x20, [sp, 16]
 	stp	x21, x22, [sp, 32]
-	.loc 1 497 0
+	.loc 1 564 0
 	mov	w13, 1
-	.loc 1 458 0
+	.loc 1 525 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 19, -48
 	.cfi_offset 20, -40
@@ -76,9 +76,9 @@ get_auto_image:
 .LVL5:
 	.p2align 2
 .L26:
-	.loc 1 486 0
+	.loc 1 553 0
 	cbz	w18, .L3
-	.loc 1 487 0
+	.loc 1 554 0
 	ldp	w5, w10, [x16, 84]
 .LVL6:
 	sub	w10, w10, #1
@@ -91,306 +91,306 @@ get_auto_image:
 	add	x10, x10, 2
 .LVL8:
 	add	x6, x3, 8
-	.loc 1 491 0 discriminator 1
+	.loc 1 558 0 discriminator 1
 	mov	x9, 0
 	cbz	w12, .L5
 	.p2align 2
 .L42:
-	.loc 1 494 0
+	.loc 1 561 0
 	ldr	w7, [x1, x9, lsl 2]
 .LVL9:
-	.loc 1 495 0
+	.loc 1 562 0
 	ldr	w5, [x2, x9, lsl 2]
 .LVL10:
-	.loc 1 496 0
+	.loc 1 563 0
 	cmp	w7, w5
 	beq	.L7
-	.loc 1 498 0
+	.loc 1 565 0
 	eor	w8, w7, w5
-	.loc 1 497 0
+	.loc 1 564 0
 	str	w13, [x4, 52]
-	.loc 1 493 0
+	.loc 1 560 0
 	mov	w19, 0
-	.loc 1 499 0
+	.loc 1 566 0
 	tst	x8, 15
 	beq	.L8
-	.loc 1 500 0
+	.loc 1 567 0
 	ldrb	w21, [x6, -8]
-	.loc 1 502 0
+	.loc 1 569 0
 	ubfiz	w19, w5, 8, 8
 	ldr	x22, [x4, 128]
 	add	w19, w19, w7, uxtb
-	.loc 1 504 0
+	.loc 1 571 0
 	add	w20, w21, 1
-	.loc 1 502 0
+	.loc 1 569 0
 	add	x19, x22, x19
-	.loc 1 501 0
+	.loc 1 568 0
 	lsl	w21, w21, 16
-	.loc 1 504 0
+	.loc 1 571 0
 	and	w20, w20, 255
-	.loc 1 505 0
+	.loc 1 572 0
 	cmp	w11, w20
-	.loc 1 502 0
+	.loc 1 569 0
 	ldrb	w19, [x19, w21, sxtw]
 	and	w19, w19, 3
-	.loc 1 505 0
+	.loc 1 572 0
 	beq	.L58
 .L9:
-	.loc 1 509 0
+	.loc 1 576 0
 	strb	w20, [x6, -8]
 .L8:
-	.loc 1 512 0
+	.loc 1 579 0
 	tst	w8, 240
 	beq	.L10
-	.loc 1 515 0
+	.loc 1 582 0
 	lsr	w20, w5, 4
-	.loc 1 513 0
+	.loc 1 580 0
 	ldrb	w21, [x6, -7]
-	.loc 1 515 0
+	.loc 1 582 0
 	ubfx	x22, x7, 4, 8
 	ubfiz	w20, w20, 8, 8
 	add	w20, w20, w22
 	ldr	x22, [x4, 128]
-	.loc 1 514 0
+	.loc 1 581 0
 	lsl	w23, w21, 16
-	.loc 1 517 0
+	.loc 1 584 0
 	add	w21, w21, 1
-	.loc 1 515 0
+	.loc 1 582 0
 	add	x20, x22, x20
-	.loc 1 517 0
+	.loc 1 584 0
 	and	w21, w21, 255
-	.loc 1 518 0
+	.loc 1 585 0
 	cmp	w11, w21
-	.loc 1 515 0
+	.loc 1 582 0
 	ldrb	w20, [x20, w23, sxtw]
-	.loc 1 516 0
+	.loc 1 583 0
 	ubfiz	w20, w20, 2, 2
 	orr	w19, w20, w19
-	.loc 1 518 0
+	.loc 1 585 0
 	beq	.L59
 .L11:
-	.loc 1 522 0
+	.loc 1 589 0
 	strb	w21, [x6, -7]
 .L10:
-	.loc 1 525 0
+	.loc 1 592 0
 	tst	w8, 3840
 	beq	.L12
-	.loc 1 526 0
+	.loc 1 593 0
 	ldrb	w22, [x6, -6]
-	.loc 1 528 0
+	.loc 1 595 0
 	and	w21, w5, 65280
 	ldr	x23, [x4, 128]
 	ubfx	x20, x7, 8, 8
 	orr	w20, w20, w21
-	.loc 1 530 0
+	.loc 1 597 0
 	add	w21, w22, 1
-	.loc 1 527 0
+	.loc 1 594 0
 	lsl	w22, w22, 16
-	.loc 1 530 0
+	.loc 1 597 0
 	and	w21, w21, 255
-	.loc 1 528 0
+	.loc 1 595 0
 	add	x20, x23, x20, uxth
-	.loc 1 531 0
+	.loc 1 598 0
 	cmp	w11, w21
-	.loc 1 528 0
+	.loc 1 595 0
 	ldrb	w20, [x20, w22, sxtw]
-	.loc 1 529 0
+	.loc 1 596 0
 	ubfiz	w20, w20, 4, 2
 	orr	w19, w20, w19
-	.loc 1 531 0
+	.loc 1 598 0
 	beq	.L60
 .L13:
-	.loc 1 535 0
+	.loc 1 602 0
 	strb	w21, [x6, -6]
 .L12:
-	.loc 1 538 0
+	.loc 1 605 0
 	tst	w8, 61440
 	beq	.L14
-	.loc 1 541 0
+	.loc 1 608 0
 	lsr	w20, w5, 12
-	.loc 1 539 0
+	.loc 1 606 0
 	ldrb	w21, [x6, -5]
-	.loc 1 541 0
+	.loc 1 608 0
 	ubfx	x22, x7, 12, 8
 	ubfiz	w20, w20, 8, 8
 	add	w20, w20, w22
 	ldr	x22, [x4, 128]
-	.loc 1 540 0
+	.loc 1 607 0
 	lsl	w23, w21, 16
-	.loc 1 543 0
+	.loc 1 610 0
 	add	w21, w21, 1
-	.loc 1 541 0
+	.loc 1 608 0
 	add	x20, x22, x20
-	.loc 1 543 0
+	.loc 1 610 0
 	and	w21, w21, 255
-	.loc 1 544 0
+	.loc 1 611 0
 	cmp	w11, w21
-	.loc 1 541 0
+	.loc 1 608 0
 	ldrb	w20, [x20, w23, sxtw]
-	.loc 1 542 0
+	.loc 1 609 0
 	ubfiz	w20, w20, 6, 2
 	orr	w19, w20, w19
-	.loc 1 544 0
+	.loc 1 611 0
 	beq	.L61
 .L15:
-	.loc 1 548 0
+	.loc 1 615 0
 	strb	w21, [x6, -5]
 .L14:
-	.loc 1 551 0
+	.loc 1 618 0
 	strb	w19, [x10, -2]
-	.loc 1 554 0
+	.loc 1 621 0
 	tst	w8, 983040
-	.loc 1 553 0
+	.loc 1 620 0
 	mov	w19, 0
-	.loc 1 554 0
+	.loc 1 621 0
 	beq	.L16
-	.loc 1 557 0
+	.loc 1 624 0
 	lsr	w19, w5, 16
-	.loc 1 555 0
+	.loc 1 622 0
 	ldrb	w20, [x6, -4]
-	.loc 1 557 0
+	.loc 1 624 0
 	ubfx	x21, x7, 16, 8
 	ubfiz	w19, w19, 8, 8
 	add	w19, w19, w21
 	ldr	x21, [x4, 128]
-	.loc 1 556 0
+	.loc 1 623 0
 	lsl	w22, w20, 16
-	.loc 1 559 0
+	.loc 1 626 0
 	add	w20, w20, 1
-	.loc 1 557 0
+	.loc 1 624 0
 	add	x19, x21, x19
-	.loc 1 559 0
+	.loc 1 626 0
 	and	w20, w20, 255
-	.loc 1 560 0
+	.loc 1 627 0
 	cmp	w11, w20
-	.loc 1 557 0
+	.loc 1 624 0
 	ldrb	w19, [x19, w22, sxtw]
 	and	w19, w19, 3
-	.loc 1 560 0
+	.loc 1 627 0
 	beq	.L62
 .L17:
-	.loc 1 564 0
+	.loc 1 631 0
 	strb	w20, [x6, -4]
 .L16:
-	.loc 1 567 0
+	.loc 1 634 0
 	tst	w8, 15728640
 	beq	.L18
-	.loc 1 570 0
+	.loc 1 637 0
 	lsr	w20, w5, 20
-	.loc 1 568 0
+	.loc 1 635 0
 	ldrb	w21, [x6, -3]
-	.loc 1 570 0
+	.loc 1 637 0
 	ubfx	x22, x7, 20, 8
 	ubfiz	w20, w20, 8, 8
 	add	w20, w20, w22
 	ldr	x22, [x4, 128]
-	.loc 1 569 0
+	.loc 1 636 0
 	lsl	w23, w21, 16
-	.loc 1 572 0
+	.loc 1 639 0
 	add	w21, w21, 1
-	.loc 1 570 0
+	.loc 1 637 0
 	add	x20, x22, x20
-	.loc 1 572 0
+	.loc 1 639 0
 	and	w21, w21, 255
-	.loc 1 573 0
+	.loc 1 640 0
 	cmp	w11, w21
-	.loc 1 570 0
+	.loc 1 637 0
 	ldrb	w20, [x20, w23, sxtw]
-	.loc 1 571 0
+	.loc 1 638 0
 	ubfiz	w20, w20, 2, 2
 	orr	w19, w20, w19
-	.loc 1 573 0
+	.loc 1 640 0
 	beq	.L63
 .L19:
-	.loc 1 577 0
+	.loc 1 644 0
 	strb	w21, [x6, -3]
 .L18:
-	.loc 1 580 0
+	.loc 1 647 0
 	tst	w8, 251658240
 	beq	.L20
-	.loc 1 581 0
+	.loc 1 648 0
 	ldrb	w22, [x6, -2]
-	.loc 1 583 0
+	.loc 1 650 0
 	lsr	w20, w5, 24
 	mov	w21, w20
 	lsr	w24, w7, 24
 	ldr	x23, [x4, 128]
 	add	w20, w24, w21, lsl 8
-	.loc 1 585 0
+	.loc 1 652 0
 	add	w21, w22, 1
-	.loc 1 582 0
+	.loc 1 649 0
 	lsl	w22, w22, 16
-	.loc 1 583 0
+	.loc 1 650 0
 	add	x20, x23, x20
-	.loc 1 585 0
+	.loc 1 652 0
 	and	w21, w21, 255
-	.loc 1 586 0
+	.loc 1 653 0
 	cmp	w11, w21
-	.loc 1 583 0
+	.loc 1 650 0
 	ldrb	w20, [x20, w22, sxtw]
-	.loc 1 584 0
+	.loc 1 651 0
 	ubfiz	w20, w20, 4, 2
 	orr	w19, w20, w19
-	.loc 1 586 0
+	.loc 1 653 0
 	beq	.L64
 .L21:
-	.loc 1 590 0
+	.loc 1 657 0
 	strb	w21, [x6, -2]
 .L20:
-	.loc 1 593 0
+	.loc 1 660 0
 	tst	w8, -268435456
 	beq	.L22
-	.loc 1 594 0
+	.loc 1 661 0
 	ldrb	w21, [x6, -1]
-	.loc 1 596 0
+	.loc 1 663 0
 	lsr	w8, w5, 28
 .LVL11:
 	mov	w20, w8
 	lsr	w23, w7, 28
 	ldr	x22, [x4, 128]
 	add	w8, w23, w20, lsl 8
-	.loc 1 598 0
+	.loc 1 665 0
 	add	w20, w21, 1
-	.loc 1 595 0
+	.loc 1 662 0
 	lsl	w21, w21, 16
-	.loc 1 596 0
+	.loc 1 663 0
 	add	x8, x22, x8
-	.loc 1 598 0
+	.loc 1 665 0
 	and	w20, w20, 255
-	.loc 1 599 0
+	.loc 1 666 0
 	cmp	w11, w20
-	.loc 1 596 0
+	.loc 1 663 0
 	ldrb	w8, [x8, w21, sxtw]
-	.loc 1 597 0
+	.loc 1 664 0
 	ubfiz	w8, w8, 6, 2
 	orr	w19, w8, w19
-	.loc 1 599 0
+	.loc 1 666 0
 	beq	.L65
 .L23:
-	.loc 1 603 0
+	.loc 1 670 0
 	strb	w20, [x6, -1]
 .LVL12:
 .L22:
-	.loc 1 606 0
+	.loc 1 673 0
 	str	w5, [x2, x9, lsl 2]
-	.loc 1 607 0
+	.loc 1 674 0
 	strb	w19, [x10, -1]
 .L24:
 	add	x9, x9, 1
 	add	x10, x10, 2
 	add	x6, x6, 8
-	.loc 1 491 0 discriminator 2
+	.loc 1 558 0 discriminator 2
 	cmp	w12, w9
 	bgt	.L42
 	add	x3, x3, x30
 	add	x2, x2, x15
 	add	x1, x1, x15
 .L5:
-	.loc 1 485 0 discriminator 2
+	.loc 1 552 0 discriminator 2
 	add	w14, w14, 1
 	cmp	w17, w14
 	bne	.L26
-	.loc 1 619 0
+	.loc 1 686 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
@@ -410,100 +410,100 @@ get_auto_image:
 	.p2align 3
 .L65:
 	.cfi_restore_state
-	.loc 1 601 0
+	.loc 1 668 0
 	and	w5, w5, 268435455
 .LVL14:
 	and	w7, w7, -268435456
 .LVL15:
 	orr	w5, w7, w5
 .LVL16:
-	.loc 1 600 0
+	.loc 1 667 0
 	mov	w20, 0
 	b	.L23
 .LVL17:
 	.p2align 3
 .L64:
-	.loc 1 588 0
+	.loc 1 655 0
 	and	w5, w5, -251658241
 .LVL18:
 	and	w20, w7, 251658240
 	orr	w5, w20, w5
 .LVL19:
-	.loc 1 587 0
+	.loc 1 654 0
 	mov	w21, 0
 	b	.L21
 	.p2align 3
 .L62:
-	.loc 1 562 0
+	.loc 1 629 0
 	and	w20, w7, 983040
 	and	w5, w5, -983041
 .LVL20:
 	orr	w5, w20, w5
 .LVL21:
-	.loc 1 561 0
+	.loc 1 628 0
 	mov	w20, 0
 	b	.L17
 	.p2align 3
 .L63:
-	.loc 1 575 0
+	.loc 1 642 0
 	and	w5, w5, -15728641
 .LVL22:
 	and	w20, w7, 15728640
 	orr	w5, w20, w5
 .LVL23:
-	.loc 1 574 0
+	.loc 1 641 0
 	mov	w21, 0
 	b	.L19
 	.p2align 3
 .L61:
-	.loc 1 546 0
+	.loc 1 613 0
 	and	w5, w5, -61441
 .LVL24:
 	and	w20, w7, 61440
 	orr	w5, w20, w5
 .LVL25:
-	.loc 1 545 0
+	.loc 1 612 0
 	mov	w21, 0
 	b	.L15
 	.p2align 3
 .L59:
-	.loc 1 520 0
+	.loc 1 587 0
 	and	w5, w5, -241
 .LVL26:
 	and	w20, w7, 240
 	orr	w5, w20, w5
 .LVL27:
-	.loc 1 519 0
+	.loc 1 586 0
 	mov	w21, 0
 	b	.L11
 	.p2align 3
 .L60:
-	.loc 1 533 0
+	.loc 1 600 0
 	and	w5, w5, -3841
 .LVL28:
 	and	w20, w7, 3840
 	orr	w5, w20, w5
 .LVL29:
-	.loc 1 532 0
+	.loc 1 599 0
 	mov	w21, 0
 	b	.L13
 	.p2align 3
 .L58:
-	.loc 1 507 0
+	.loc 1 574 0
 	bfi	w5, w7, 0, 4
-	.loc 1 506 0
+	.loc 1 573 0
 	mov	w20, 0
 	b	.L9
 	.p2align 3
 .L7:
-	.loc 1 610 0
+	.loc 1 677 0
 	strb	wzr, [x10, -2]
-	.loc 1 611 0
+	.loc 1 678 0
 	strb	wzr, [x10, -1]
 	b	.L24
 	.p2align 3
 .L3:
-	.loc 1 489 0
+	.loc 1 556 0
 	ldr	w10, [x16, 84]
 	mul	w10, w14, w10
 	lsr	w10, w10, 2
@@ -523,32 +523,32 @@ get_auto_image:
 	.cfi_restore 30
 	ret
 	.cfi_endproc
-.LFE2814:
+.LFE2815:
 	.size	get_auto_image, .-get_auto_image
 	.align	2
 	.p2align 3,,7
 	.type	get_overlay_image, %function
 get_overlay_image:
-.LFB2815:
-	.loc 1 623 0
+.LFB2816:
+	.loc 1 690 0
 	.cfi_startproc
 .LVL32:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
 	.cfi_offset 30, -88
-	.loc 1 624 0
+	.loc 1 691 0
 	adrp	x5, .LANCHOR0
-	.loc 1 623 0
+	.loc 1 690 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 624 0
+	.loc 1 691 0
 	ldr	x17, [x5, #:lo12:.LANCHOR0]
-	.loc 1 623 0
+	.loc 1 690 0
 	stp	x19, x20, [sp, 16]
-	.loc 1 636 0
+	.loc 1 703 0
 	add	x17, x17, 24
-	.loc 1 623 0
+	.loc 1 690 0
 	stp	x21, x22, [sp, 32]
 	stp	x23, x24, [sp, 48]
 	stp	x25, x26, [sp, 64]
@@ -562,14 +562,14 @@ get_overlay_image:
 	.cfi_offset 25, -32
 	.cfi_offset 26, -24
 	.cfi_offset 27, -16
-	.loc 1 642 0
+	.loc 1 709 0
 	ldp	w11, w18, [x17, 84]
-	.loc 1 636 0
+	.loc 1 703 0
 	ldr	w30, [x17, 156]
-	.loc 1 644 0
+	.loc 1 711 0
 	str	wzr, [x4, 52]
 .LVL33:
-	.loc 1 650 0
+	.loc 1 717 0
 	cmp	w18, 0
 	ble	.L66
 	lsr	w11, w11, 3
@@ -577,21 +577,21 @@ get_overlay_image:
 	mov	w13, 0
 .LVL35:
 	sub	w16, w11, #1
-	.loc 1 662 0
+	.loc 1 729 0
 	mov	w12, 1
 	add	x16, x16, 1
-	.loc 1 800 0
+	.loc 1 867 0
 	mov	w15, -268435456
 	lsl	x19, x16, 3
 	lsl	x16, x16, 2
-	.loc 1 782 0
+	.loc 1 849 0
 	mov	w14, 251658240
 .LVL36:
 	.p2align 2
 .L99:
-	.loc 1 651 0
+	.loc 1 718 0
 	cbz	w30, .L68
-	.loc 1 652 0
+	.loc 1 719 0
 	ldp	w5, w10, [x17, 84]
 .LVL37:
 	sub	w10, w10, #1
@@ -604,390 +604,390 @@ get_overlay_image:
 	add	x10, x10, 2
 .LVL39:
 	add	x7, x3, 8
-	.loc 1 656 0 discriminator 1
+	.loc 1 723 0 discriminator 1
 	mov	x9, 0
 	cbz	w11, .L70
 	.p2align 2
 .L131:
-	.loc 1 659 0
+	.loc 1 726 0
 	ldr	w5, [x1, x9, lsl 2]
 .LVL40:
-	.loc 1 660 0
+	.loc 1 727 0
 	ldr	w6, [x2, x9, lsl 2]
 .LVL41:
-	.loc 1 661 0
+	.loc 1 728 0
 	cmp	w5, w6
 	beq	.L72
-	.loc 1 663 0
+	.loc 1 730 0
 	eor	w8, w5, w6
-	.loc 1 662 0
+	.loc 1 729 0
 	str	w12, [x4, 52]
-	.loc 1 658 0
+	.loc 1 725 0
 	mov	w20, 0
-	.loc 1 664 0
+	.loc 1 731 0
 	tst	x8, 15
 	beq	.L73
-	.loc 1 666 0
+	.loc 1 733 0
 	ldrb	w21, [x7, -8]
-	.loc 1 668 0
+	.loc 1 735 0
 	ubfiz	w20, w6, 8, 8
 	ldr	x23, [x4, 128]
 	add	w20, w20, w5, uxtb
-	.loc 1 674 0
+	.loc 1 741 0
 	ldrb	w22, [x4, 48]
-	.loc 1 667 0
+	.loc 1 734 0
 	lsl	w25, w21, 16
-	.loc 1 668 0
+	.loc 1 735 0
 	add	x20, x23, x20
-	.loc 1 672 0
+	.loc 1 739 0
 	ldrb	w24, [x4, 49]
-	.loc 1 671 0
+	.loc 1 738 0
 	ands	w23, w5, 15
-	.loc 1 672 0
+	.loc 1 739 0
 	ccmp	w23, 15, 4, ne
-	.loc 1 670 0
+	.loc 1 737 0
 	add	w21, w21, 1
-	.loc 1 668 0
+	.loc 1 735 0
 	ldrb	w20, [x20, w25, sxtw]
-	.loc 1 670 0
+	.loc 1 737 0
 	and	w21, w21, 255
-	.loc 1 672 0
+	.loc 1 739 0
 	csel	w22, w22, w24, ne
-	.loc 1 668 0
+	.loc 1 735 0
 	and	w20, w20, 3
-	.loc 1 675 0
+	.loc 1 742 0
 	cmp	w22, w21
 	beq	.L143
 .L75:
-	.loc 1 679 0
+	.loc 1 746 0
 	strb	w21, [x7, -8]
 .L73:
-	.loc 1 682 0
+	.loc 1 749 0
 	tst	w8, 240
 	beq	.L76
-	.loc 1 684 0
+	.loc 1 751 0
 	ldrb	w22, [x7, -7]
-	.loc 1 686 0
+	.loc 1 753 0
 	lsr	w21, w6, 4
 	ubfx	x23, x5, 4, 8
 	ubfiz	w21, w21, 8, 8
 	ldr	x24, [x4, 128]
 	add	w21, w21, w23
-	.loc 1 685 0
+	.loc 1 752 0
 	lsl	w27, w22, 16
-	.loc 1 683 0
+	.loc 1 750 0
 	and	w25, w5, 240
-	.loc 1 686 0
+	.loc 1 753 0
 	add	x24, x24, x21
-	.loc 1 688 0
+	.loc 1 755 0
 	add	w21, w22, 1
-	.loc 1 692 0
+	.loc 1 759 0
 	ldrb	w23, [x4, 48]
-	.loc 1 689 0
+	.loc 1 756 0
 	cmp	w25, 240
-	.loc 1 690 0
+	.loc 1 757 0
 	ldrb	w26, [x4, 49]
 	ccmp	w25, 0, 4, ne
-	.loc 1 686 0
+	.loc 1 753 0
 	ldrb	w22, [x24, w27, sxtw]
-	.loc 1 688 0
+	.loc 1 755 0
 	and	w21, w21, 255
-	.loc 1 690 0
+	.loc 1 757 0
 	csel	w23, w23, w26, ne
-	.loc 1 693 0
+	.loc 1 760 0
 	cmp	w23, w21
-	.loc 1 687 0
+	.loc 1 754 0
 	ubfiz	w22, w22, 2, 2
 	orr	w20, w22, w20
-	.loc 1 693 0
+	.loc 1 760 0
 	beq	.L144
 .L78:
-	.loc 1 697 0
+	.loc 1 764 0
 	strb	w21, [x7, -7]
 .L76:
-	.loc 1 700 0
+	.loc 1 767 0
 	tst	w8, 3840
 	beq	.L79
-	.loc 1 702 0
+	.loc 1 769 0
 	ldrb	w21, [x7, -6]
-	.loc 1 704 0
+	.loc 1 771 0
 	and	w23, w6, 65280
 	ldr	x24, [x4, 128]
 	ubfx	x22, x5, 8, 8
 	orr	w22, w22, w23
-	.loc 1 701 0
+	.loc 1 768 0
 	and	w23, w5, 3840
-	.loc 1 703 0
+	.loc 1 770 0
 	lsl	w26, w21, 16
-	.loc 1 708 0
+	.loc 1 775 0
 	ldrb	w25, [x4, 49]
-	.loc 1 704 0
+	.loc 1 771 0
 	add	x22, x24, x22, uxth
-	.loc 1 707 0
+	.loc 1 774 0
 	cmp	w23, 3840
-	.loc 1 710 0
+	.loc 1 777 0
 	ldrb	w24, [x4, 48]
-	.loc 1 708 0
+	.loc 1 775 0
 	ccmp	w23, 0, 4, ne
-	.loc 1 706 0
+	.loc 1 773 0
 	add	w21, w21, 1
-	.loc 1 704 0
+	.loc 1 771 0
 	ldrb	w22, [x22, w26, sxtw]
-	.loc 1 706 0
+	.loc 1 773 0
 	and	w21, w21, 255
-	.loc 1 708 0
+	.loc 1 775 0
 	csel	w24, w24, w25, ne
-	.loc 1 711 0
+	.loc 1 778 0
 	cmp	w24, w21
-	.loc 1 705 0
+	.loc 1 772 0
 	ubfiz	w22, w22, 4, 2
 	orr	w20, w22, w20
-	.loc 1 711 0
+	.loc 1 778 0
 	beq	.L145
 .L81:
-	.loc 1 715 0
+	.loc 1 782 0
 	strb	w21, [x7, -6]
 .L79:
-	.loc 1 718 0
+	.loc 1 785 0
 	tst	w8, 61440
 	beq	.L82
-	.loc 1 720 0
+	.loc 1 787 0
 	ldrb	w22, [x7, -5]
-	.loc 1 722 0
+	.loc 1 789 0
 	lsr	w21, w6, 12
 	ubfx	x23, x5, 12, 8
 	ubfiz	w21, w21, 8, 8
 	ldr	x24, [x4, 128]
 	add	w21, w21, w23
-	.loc 1 721 0
+	.loc 1 788 0
 	lsl	w27, w22, 16
-	.loc 1 719 0
+	.loc 1 786 0
 	and	w25, w5, 61440
-	.loc 1 722 0
+	.loc 1 789 0
 	add	x24, x24, x21
-	.loc 1 724 0
+	.loc 1 791 0
 	add	w21, w22, 1
-	.loc 1 728 0
+	.loc 1 795 0
 	ldrb	w23, [x4, 48]
-	.loc 1 725 0
+	.loc 1 792 0
 	cmp	w25, 61440
-	.loc 1 726 0
+	.loc 1 793 0
 	ldrb	w26, [x4, 49]
 	ccmp	w25, 0, 4, ne
-	.loc 1 722 0
+	.loc 1 789 0
 	ldrb	w22, [x24, w27, sxtw]
-	.loc 1 724 0
+	.loc 1 791 0
 	and	w21, w21, 255
-	.loc 1 726 0
+	.loc 1 793 0
 	csel	w23, w23, w26, ne
-	.loc 1 729 0
+	.loc 1 796 0
 	cmp	w23, w21
-	.loc 1 723 0
+	.loc 1 790 0
 	ubfiz	w22, w22, 6, 2
 	orr	w20, w22, w20
-	.loc 1 729 0
+	.loc 1 796 0
 	beq	.L146
 .L84:
-	.loc 1 733 0
+	.loc 1 800 0
 	strb	w21, [x7, -5]
 .L82:
-	.loc 1 736 0
+	.loc 1 803 0
 	strb	w20, [x10, -2]
-	.loc 1 739 0
+	.loc 1 806 0
 	tst	w8, 983040
-	.loc 1 738 0
+	.loc 1 805 0
 	mov	w20, 0
-	.loc 1 739 0
+	.loc 1 806 0
 	beq	.L85
-	.loc 1 743 0
+	.loc 1 810 0
 	lsr	w20, w6, 16
-	.loc 1 741 0
+	.loc 1 808 0
 	ldrb	w21, [x7, -4]
-	.loc 1 743 0
+	.loc 1 810 0
 	ubfx	x22, x5, 16, 8
 	ubfiz	w20, w20, 8, 8
 	add	w20, w20, w22
 	ldr	x22, [x4, 128]
-	.loc 1 742 0
+	.loc 1 809 0
 	lsl	w25, w21, 16
-	.loc 1 740 0
+	.loc 1 807 0
 	and	w23, w5, 983040
-	.loc 1 743 0
+	.loc 1 810 0
 	add	x20, x22, x20
-	.loc 1 747 0
+	.loc 1 814 0
 	ldrb	w24, [x4, 49]
-	.loc 1 746 0
+	.loc 1 813 0
 	cmp	w23, 983040
-	.loc 1 749 0
+	.loc 1 816 0
 	ldrb	w22, [x4, 48]
-	.loc 1 747 0
+	.loc 1 814 0
 	ccmp	w23, 0, 4, ne
-	.loc 1 745 0
+	.loc 1 812 0
 	add	w21, w21, 1
-	.loc 1 743 0
+	.loc 1 810 0
 	ldrb	w20, [x20, w25, sxtw]
-	.loc 1 745 0
+	.loc 1 812 0
 	and	w21, w21, 255
-	.loc 1 747 0
+	.loc 1 814 0
 	csel	w22, w22, w24, ne
-	.loc 1 743 0
+	.loc 1 810 0
 	and	w20, w20, 3
-	.loc 1 750 0
+	.loc 1 817 0
 	cmp	w22, w21
 	beq	.L147
 .L87:
-	.loc 1 754 0
+	.loc 1 821 0
 	strb	w21, [x7, -4]
 .L85:
-	.loc 1 757 0
+	.loc 1 824 0
 	tst	w8, 15728640
 	beq	.L88
-	.loc 1 759 0
+	.loc 1 826 0
 	ldrb	w22, [x7, -3]
-	.loc 1 761 0
+	.loc 1 828 0
 	lsr	w21, w6, 20
 	ubfx	x23, x5, 20, 8
 	ubfiz	w21, w21, 8, 8
 	ldr	x24, [x4, 128]
 	add	w21, w21, w23
-	.loc 1 760 0
+	.loc 1 827 0
 	lsl	w27, w22, 16
-	.loc 1 758 0
+	.loc 1 825 0
 	and	w25, w5, 15728640
-	.loc 1 761 0
+	.loc 1 828 0
 	add	x24, x24, x21
-	.loc 1 763 0
+	.loc 1 830 0
 	add	w21, w22, 1
-	.loc 1 767 0
+	.loc 1 834 0
 	ldrb	w23, [x4, 48]
-	.loc 1 764 0
+	.loc 1 831 0
 	cmp	w25, 15728640
-	.loc 1 765 0
+	.loc 1 832 0
 	ldrb	w26, [x4, 49]
 	ccmp	w25, 0, 4, ne
-	.loc 1 761 0
+	.loc 1 828 0
 	ldrb	w22, [x24, w27, sxtw]
-	.loc 1 763 0
+	.loc 1 830 0
 	and	w21, w21, 255
-	.loc 1 765 0
+	.loc 1 832 0
 	csel	w23, w23, w26, ne
-	.loc 1 768 0
+	.loc 1 835 0
 	cmp	w23, w21
-	.loc 1 762 0
+	.loc 1 829 0
 	ubfiz	w22, w22, 2, 2
 	orr	w20, w22, w20
-	.loc 1 768 0
+	.loc 1 835 0
 	beq	.L148
 .L90:
-	.loc 1 772 0
+	.loc 1 839 0
 	strb	w21, [x7, -3]
 .L88:
-	.loc 1 775 0
+	.loc 1 842 0
 	tst	w8, 251658240
 	beq	.L91
-	.loc 1 777 0
+	.loc 1 844 0
 	ldrb	w21, [x7, -2]
-	.loc 1 779 0
+	.loc 1 846 0
 	lsr	w22, w6, 24
 	lsr	w25, w5, 24
 	mov	w23, w22
 	ldr	x24, [x4, 128]
 	add	w22, w25, w23, lsl 8
-	.loc 1 778 0
+	.loc 1 845 0
 	lsl	w26, w21, 16
-	.loc 1 785 0
+	.loc 1 852 0
 	ldrb	w23, [x4, 48]
-	.loc 1 779 0
+	.loc 1 846 0
 	add	x22, x24, x22
-	.loc 1 783 0
+	.loc 1 850 0
 	ldrb	w25, [x4, 49]
-	.loc 1 782 0
+	.loc 1 849 0
 	ands	w24, w5, 251658240
-	.loc 1 781 0
+	.loc 1 848 0
 	add	w21, w21, 1
-	.loc 1 783 0
+	.loc 1 850 0
 	ccmp	w24, w14, 4, ne
-	.loc 1 781 0
+	.loc 1 848 0
 	and	w21, w21, 255
-	.loc 1 779 0
+	.loc 1 846 0
 	ldrb	w22, [x22, w26, sxtw]
-	.loc 1 783 0
+	.loc 1 850 0
 	csel	w23, w23, w25, ne
-	.loc 1 786 0
+	.loc 1 853 0
 	cmp	w23, w21
-	.loc 1 780 0
+	.loc 1 847 0
 	ubfiz	w22, w22, 4, 2
 	orr	w20, w22, w20
-	.loc 1 786 0
+	.loc 1 853 0
 	beq	.L149
 .L93:
-	.loc 1 790 0
+	.loc 1 857 0
 	strb	w21, [x7, -2]
 .L91:
-	.loc 1 793 0
+	.loc 1 860 0
 	tst	w8, -268435456
 	beq	.L94
-	.loc 1 795 0
+	.loc 1 862 0
 	ldrb	w8, [x7, -1]
 .LVL42:
-	.loc 1 797 0
+	.loc 1 864 0
 	lsr	w22, w5, 28
 	ldr	x23, [x4, 128]
 	lsr	w21, w6, 28
 	add	w21, w22, w21, lsl 8
-	.loc 1 800 0
+	.loc 1 867 0
 	ands	w5, w5, -268435456
 .LVL43:
-	.loc 1 796 0
+	.loc 1 863 0
 	lsl	w24, w8, 16
-	.loc 1 797 0
+	.loc 1 864 0
 	add	x21, x23, x21
-	.loc 1 803 0
+	.loc 1 870 0
 	ldrb	w22, [x4, 48]
-	.loc 1 801 0
+	.loc 1 868 0
 	ccmp	w5, w15, 4, ne
 	ldrb	w23, [x4, 49]
-	.loc 1 799 0
+	.loc 1 866 0
 	add	w8, w8, 1
-	.loc 1 797 0
+	.loc 1 864 0
 	ldrb	w21, [x21, w24, sxtw]
-	.loc 1 799 0
+	.loc 1 866 0
 	and	w8, w8, 255
-	.loc 1 801 0
+	.loc 1 868 0
 	csel	w22, w22, w23, ne
-	.loc 1 804 0
+	.loc 1 871 0
 	cmp	w22, w8
-	.loc 1 798 0
+	.loc 1 865 0
 	ubfiz	w21, w21, 6, 2
 	orr	w20, w21, w20
-	.loc 1 804 0
+	.loc 1 871 0
 	beq	.L150
 .L96:
-	.loc 1 808 0
+	.loc 1 875 0
 	strb	w8, [x7, -1]
 .LVL44:
 .L94:
-	.loc 1 811 0
+	.loc 1 878 0
 	str	w6, [x2, x9, lsl 2]
-	.loc 1 812 0
+	.loc 1 879 0
 	strb	w20, [x10, -1]
 .L97:
 	add	x9, x9, 1
 	add	x10, x10, 2
 	add	x7, x7, 8
-	.loc 1 656 0 discriminator 2
+	.loc 1 723 0 discriminator 2
 	cmp	w11, w9
 	bgt	.L131
 	add	x3, x3, x19
 	add	x2, x2, x16
 	add	x1, x1, x16
 .L70:
-	.loc 1 650 0 discriminator 2
+	.loc 1 717 0 discriminator 2
 	add	w13, w13, 1
 	cmp	w18, w13
 	bne	.L99
 .L66:
-	.loc 1 824 0
+	.loc 1 891 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
@@ -1011,100 +1011,100 @@ get_overlay_image:
 	.p2align 3
 .L149:
 	.cfi_restore_state
-	.loc 1 788 0
+	.loc 1 855 0
 	and	w6, w6, -251658241
 .LVL45:
-	.loc 1 787 0
+	.loc 1 854 0
 	mov	w21, 0
-	.loc 1 788 0
+	.loc 1 855 0
 	orr	w6, w24, w6
 .LVL46:
 	b	.L93
 .LVL47:
 	.p2align 3
 .L150:
-	.loc 1 806 0
+	.loc 1 873 0
 	and	w6, w6, 268435455
 .LVL48:
-	.loc 1 805 0
+	.loc 1 872 0
 	mov	w8, 0
-	.loc 1 806 0
+	.loc 1 873 0
 	orr	w6, w5, w6
 .LVL49:
 	b	.L96
 .LVL50:
 	.p2align 3
 .L148:
-	.loc 1 770 0
+	.loc 1 837 0
 	and	w6, w6, -15728641
 .LVL51:
-	.loc 1 769 0
+	.loc 1 836 0
 	mov	w21, 0
-	.loc 1 770 0
+	.loc 1 837 0
 	orr	w6, w25, w6
 .LVL52:
 	b	.L90
 	.p2align 3
 .L146:
-	.loc 1 731 0
+	.loc 1 798 0
 	and	w6, w6, -61441
 .LVL53:
-	.loc 1 730 0
+	.loc 1 797 0
 	mov	w21, 0
-	.loc 1 731 0
+	.loc 1 798 0
 	orr	w6, w25, w6
 .LVL54:
 	b	.L84
 	.p2align 3
 .L147:
-	.loc 1 752 0
+	.loc 1 819 0
 	and	w6, w6, -983041
 .LVL55:
-	.loc 1 751 0
+	.loc 1 818 0
 	mov	w21, 0
-	.loc 1 752 0
+	.loc 1 819 0
 	orr	w6, w23, w6
 .LVL56:
 	b	.L87
 	.p2align 3
 .L145:
-	.loc 1 713 0
+	.loc 1 780 0
 	and	w6, w6, -3841
 .LVL57:
-	.loc 1 712 0
+	.loc 1 779 0
 	mov	w21, 0
-	.loc 1 713 0
+	.loc 1 780 0
 	orr	w6, w23, w6
 .LVL58:
 	b	.L81
 	.p2align 3
 .L143:
-	.loc 1 677 0
+	.loc 1 744 0
 	bfi	w6, w23, 0, 4
-	.loc 1 676 0
+	.loc 1 743 0
 	mov	w21, 0
 	b	.L75
 	.p2align 3
 .L144:
-	.loc 1 695 0
+	.loc 1 762 0
 	and	w6, w6, -241
 .LVL59:
-	.loc 1 694 0
+	.loc 1 761 0
 	mov	w21, 0
-	.loc 1 695 0
+	.loc 1 762 0
 	orr	w6, w25, w6
 .LVL60:
 	b	.L78
 	.p2align 3
 .L72:
-	.loc 1 815 0
+	.loc 1 882 0
 	strb	wzr, [x10, -2]
-	.loc 1 816 0
+	.loc 1 883 0
 	strb	wzr, [x10, -1]
 	b	.L97
 	.p2align 3
 .L68:
-	.loc 1 654 0
+	.loc 1 721 0
 	ldr	w10, [x17, 84]
 	mul	w10, w13, w10
 	lsr	w10, w10, 2
@@ -1112,62 +1112,62 @@ get_overlay_image:
 .LVL61:
 	b	.L71
 	.cfi_endproc
-.LFE2815:
+.LFE2816:
 	.size	get_overlay_image, .-get_overlay_image
 	.align	2
 	.p2align 3,,7
 	.type	waveform_open, %function
 waveform_open:
-.LFB2846:
-	.loc 1 2516 0
+.LFB2847:
+	.loc 1 2596 0
 	.cfi_startproc
 .LVL62:
-	.loc 1 2520 0
+	.loc 1 2600 0
 	mov	w0, 0
 .LVL63:
-	.loc 1 2517 0
+	.loc 1 2597 0
 	str	xzr, [x1, 104]
-	.loc 1 2520 0
+	.loc 1 2600 0
 	ret
 	.cfi_endproc
-.LFE2846:
+.LFE2847:
 	.size	waveform_open, .-waveform_open
 	.section	.exit.text,"ax",@progbits
 	.align	2
 	.type	ebc_exit, %function
 ebc_exit:
-.LFB2866:
-	.loc 1 3087 0
+.LFB2867:
+	.loc 1 3167 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3088 0
+	.loc 1 3168 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3087 0
+	.loc 1 3167 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3088 0
+	.loc 1 3168 0
 	bl	platform_driver_unregister
 .LVL64:
-	.loc 1 3089 0
+	.loc 1 3169 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2866:
+.LFE2867:
 	.size	ebc_exit, .-ebc_exit
 	.text
 	.align	2
 	.p2align 3,,7
 	.type	ebc_resume, %function
 ebc_resume:
-.LFB2864:
-	.loc 1 3049 0
+.LFB2865:
+	.loc 1 3129 0
 	.cfi_startproc
 .LVL65:
 	stp	x29, x30, [sp, -32]!
@@ -1185,7 +1185,7 @@ ebc_resume:
 	ldr	x19, [x0, 184]
 .LBE953:
 .LBE952:
-	.loc 1 3053 0
+	.loc 1 3133 0
 	ldr	x1, [x19, 16]
 .LBB954:
 .LBB955:
@@ -1198,15 +1198,15 @@ ebc_resume:
 .LVL67:
 .LBE955:
 .LBE954:
-	.loc 1 3054 0
+	.loc 1 3134 0
 	str	wzr, [x19, 804]
-	.loc 1 3055 0
+	.loc 1 3135 0
 	ldr	x0, [x19, 288]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
 .LVL68:
-	.loc 1 3058 0
+	.loc 1 3138 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -1216,27 +1216,27 @@ ebc_resume:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2864:
+.LFE2865:
 	.size	ebc_resume, .-ebc_resume
 	.align	2
 	.p2align 3,,7
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
-.LFB2839:
-	.loc 1 2173 0
+.LFB2840:
+	.loc 1 2253 0
 	.cfi_startproc
 .LVL69:
-	.loc 1 2174 0
+	.loc 1 2254 0
 	adrp	x0, .LANCHOR0
 .LVL70:
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2176 0
+	.loc 1 2256 0
 	ldr	w2, [x0, 624]
 	cbnz	w2, .L165
 	ret
 	.p2align 3
 .L165:
-	.loc 1 2173 0
+	.loc 1 2253 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -1248,10 +1248,10 @@ ebc_vdd_power_timeout:
 	add	x0, x0, 416
 .LBE957:
 .LBE956:
-	.loc 1 2173 0
+	.loc 1 2253 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2177 0
+	.loc 1 2257 0
 	str	wzr, [x0, 208]
 .LBB959:
 .LBB958:
@@ -1260,41 +1260,41 @@ ebc_vdd_power_timeout:
 .LVL71:
 .LBE958:
 .LBE959:
-	.loc 1 2182 0
+	.loc 1 2262 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2839:
+.LFE2840:
 	.size	ebc_vdd_power_timeout, .-ebc_vdd_power_timeout
 	.align	2
 	.p2align 3,,7
 	.type	ebc_remove, %function
 ebc_remove:
-.LFB2862:
-	.loc 1 3025 0
+.LFB2863:
+	.loc 1 3105 0
 	.cfi_startproc
 .LVL72:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3026 0
+	.loc 1 3106 0
 	adrp	x0, .LANCHOR1
 .LVL73:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3025 0
+	.loc 1 3105 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3026 0
+	.loc 1 3106 0
 	add	x0, x0, 224
-	.loc 1 3025 0
-	.loc 1 3026 0
+	.loc 1 3105 0
+	.loc 1 3106 0
 	bl	misc_deregister
 .LVL74:
-	.loc 1 3029 0
+	.loc 1 3109 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -1302,14 +1302,14 @@ ebc_remove:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2862:
+.LFE2863:
 	.size	ebc_remove, .-ebc_remove
 	.align	2
 	.p2align 3,,7
 	.type	ebc_mmap, %function
 ebc_mmap:
-.LFB2843:
-	.loc 1 2462 0
+.LFB2844:
+	.loc 1 2542 0
 	.cfi_startproc
 .LVL75:
 	stp	x29, x30, [sp, -32]!
@@ -1320,33 +1320,33 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2462 0
+	.loc 1 2542 0
 	mov	x19, x1
-	.loc 1 2465 0
+	.loc 1 2545 0
 	bl	ebc_phy_buf_base_get
 .LVL76:
-	.loc 1 2468 0
+	.loc 1 2548 0
 	lsr	x2, x0, 12
-	.loc 1 2466 0
+	.loc 1 2546 0
 	mov	x6, 16384
-	.loc 1 2468 0
+	.loc 1 2548 0
 	mov	x0, x19
-	.loc 1 2466 0
+	.loc 1 2546 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 2468 0
+	.loc 1 2548 0
 	ldp	x1, x3, [x19]
-	.loc 1 2466 0
+	.loc 1 2546 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 2468 0
+	.loc 1 2548 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
 .LVL77:
-	.loc 1 2471 0
+	.loc 1 2551 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 2474 0
+	.loc 1 2554 0
 	ldr	x19, [sp, 16]
 .LVL78:
 	csel	w0, w0, w1, eq
@@ -1357,54 +1357,54 @@ ebc_mmap:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2843:
+.LFE2844:
 	.size	ebc_mmap, .-ebc_mmap
 	.align	2
 	.p2align 3,,7
 	.type	waveform_mmap, %function
 waveform_mmap:
-.LFB2845:
-	.loc 1 2500 0
+.LFB2846:
+	.loc 1 2580 0
 	.cfi_startproc
 .LVL79:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2501 0
+	.loc 1 2581 0
 	adrp	x2, .LANCHOR0
-	.loc 1 2505 0
+	.loc 1 2585 0
 	mov	x7, 16384
-	.loc 1 2507 0
+	.loc 1 2587 0
 	mov	x0, x1
 .LVL80:
-	.loc 1 2500 0
+	.loc 1 2580 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2504 0
+	.loc 1 2584 0
 	ldr	x2, [x2, #:lo12:.LANCHOR0]
-	.loc 1 2505 0
+	.loc 1 2585 0
 	movk	x7, 0x404, lsl 16
 	ldp	x4, x5, [x1, 72]
-	.loc 1 2507 0
+	.loc 1 2587 0
 	ldp	x6, x3, [x1]
-	.loc 1 2505 0
+	.loc 1 2585 0
 	orr	x5, x5, x7
-	.loc 1 2504 0
+	.loc 1 2584 0
 	ldr	x2, [x2, 216]
-	.loc 1 2505 0
+	.loc 1 2585 0
 	str	x5, [x1, 80]
-	.loc 1 2507 0
+	.loc 1 2587 0
 	sub	x3, x3, x6
 	mov	x1, x6
 .LVL81:
 	lsr	x2, x2, 12
 	bl	remap_pfn_range
 .LVL82:
-	.loc 1 2510 0
+	.loc 1 2590 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 2513 0
+	.loc 1 2593 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1412,23 +1412,23 @@ waveform_mmap:
 	csel	w0, w0, w1, eq
 	ret
 	.cfi_endproc
-.LFE2845:
+.LFE2846:
 	.size	waveform_mmap, .-waveform_mmap
 	.align	2
 	.p2align 3,,7
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
-.LFB2842:
-	.loc 1 2258 0
+.LFB2843:
+	.loc 1 2338 0
 	.cfi_startproc
 .LVL83:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 2268 0
+	.loc 1 2348 0
 	cmp	w1, 28672
-	.loc 1 2258 0
+	.loc 1 2338 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -1442,15 +1442,15 @@ ebc_io_ctl:
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
 	.cfi_offset 23, -112
-	.loc 1 2258 0
+	.loc 1 2338 0
 	mov	x21, x2
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 2260 0
+	.loc 1 2340 0
 	adrp	x0, .LANCHOR0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2268 0
+	.loc 1 2348 0
 	bcc	.L177
 	mov	w0, 28675
 	cmp	w1, w0
@@ -1460,7 +1460,7 @@ ebc_io_ctl:
 	cmp	w0, 1
 	bls	.L178
 .L177:
-	.loc 1 2284 0
+	.loc 1 2364 0
 	mov	w0, 28677
 	cmp	w1, w0
 	beq	.L181
@@ -1476,13 +1476,13 @@ ebc_io_ctl:
 	mov	w0, 28683
 	cmp	w1, w0
 	bne	.L180
-	.loc 1 2439 0
+	.loc 1 2519 0
 	bl	ebc_empty_buf_get
 .LVL85:
 	mov	x23, x0
-	.loc 1 2440 0
+	.loc 1 2520 0
 	cbz	x0, .L201
-	.loc 1 2442 0
+	.loc 1 2522 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 408]
@@ -1493,7 +1493,7 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL86:
-	.loc 1 2443 0
+	.loc 1 2523 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL87:
@@ -1523,11 +1523,11 @@ ebc_io_ctl:
 .LBE962:
 .LBE961:
 .LBE960:
-	.loc 1 2445 0
+	.loc 1 2525 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 2444 0
+	.loc 1 2524 0
 	str	w0, [x29, 104]
-	.loc 1 2446 0
+	.loc 1 2526 0
 	stp	w4, w1, [x29, 112]
 .LBB991:
 .LBB988:
@@ -1556,7 +1556,7 @@ ebc_io_ctl:
 .LBE985:
 .LBE988:
 .LBE991:
-	.loc 1 2259 0
+	.loc 1 2339 0
 	mov	x0, x21
 .LVL92:
 .LBB992:
@@ -1604,36 +1604,36 @@ ebc_io_ctl:
 .LBE986:
 .LBE989:
 .LBE992:
-	.loc 1 2448 0
+	.loc 1 2528 0
 	mov	x0, x23
 .LVL97:
 	bl	ebc_buf_release
 .LVL98:
-	.loc 1 2449 0
+	.loc 1 2529 0
 	b	.L176
 .LVL99:
 	.p2align 3
 .L178:
-	.loc 1 2275 0
+	.loc 1 2355 0
 	cbnz	x21, .L177
-	.loc 1 2276 0
+	.loc 1 2356 0
 	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
 .LVL100:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC1
-	.loc 1 2277 0
+	.loc 1 2357 0
 	mov	x22, -14
-	.loc 1 2276 0
+	.loc 1 2356 0
 	bl	_dev_err
 .LVL101:
-	.loc 1 2277 0
+	.loc 1 2357 0
 	b	.L176
 .LVL102:
 	.p2align 3
 .L310:
-	.loc 1 2284 0
+	.loc 1 2364 0
 	mov	w0, 28674
 	cmp	w1, w0
 	beq	.L183
@@ -1644,23 +1644,23 @@ ebc_io_ctl:
 	mov	w0, 28676
 	cmp	w1, w0
 	bne	.L180
-	.loc 1 2370 0
+	.loc 1 2450 0
 	ldr	x0, [x20, 288]
-	.loc 1 2369 0
+	.loc 1 2449 0
 	mov	w2, 1
 	str	w2, [x20, 812]
-	.loc 1 2370 0
+	.loc 1 2450 0
 	adrp	x1, .LC2
 .LVL103:
-	.loc 1 2371 0
+	.loc 1 2451 0
 	mov	x22, 0
-	.loc 1 2370 0
+	.loc 1 2450 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
 .LVL104:
 	.p2align 2
 .L176:
-	.loc 1 2459 0
+	.loc 1 2539 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
 .LVL105:
@@ -1688,7 +1688,7 @@ ebc_io_ctl:
 	.p2align 3
 .L313:
 	.cfi_restore_state
-	.loc 1 2284 0
+	.loc 1 2364 0
 	cmp	w1, 28672
 	beq	.L185
 	mov	w0, 28673
@@ -1802,58 +1802,58 @@ ebc_io_ctl:
 .LBE995:
 .LBE994:
 .LBE993:
-	.loc 1 2324 0
+	.loc 1 2404 0
 	bl	ebc_phy_buf_base_get
 .LVL121:
 	ldrsw	x1, [x29, 104]
-	.loc 1 2325 0
+	.loc 1 2405 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
 .LVL122:
 	mov	x21, x0
 .LVL123:
-	.loc 1 2326 0
+	.loc 1 2406 0
 	cbz	x0, .L216
-	.loc 1 2327 0
+	.loc 1 2407 0
 	ldr	w1, [x29, 108]
-	.loc 1 2336 0
+	.loc 1 2416 0
 	add	x20, x20, 184
-	.loc 1 2327 0
+	.loc 1 2407 0
 	str	w1, [x21, 40]
-	.loc 1 2331 0
+	.loc 1 2411 0
 	ldp	w4, w2, [x29, 124]
 	stp	w4, w2, [x21, 48]
-	.loc 1 2330 0
+	.loc 1 2410 0
 	ldr	w3, [x29, 132]
-	.loc 1 2332 0
+	.loc 1 2412 0
 	ldr	w1, [x29, 136]
-	.loc 1 2328 0
+	.loc 1 2408 0
 	ldr	w5, [x29, 148]
-	.loc 1 2330 0
+	.loc 1 2410 0
 	str	w3, [x21, 56]
-	.loc 1 2328 0
+	.loc 1 2408 0
 	stp	w1, w5, [x21, 60]
-	.loc 1 2334 0
+	.loc 1 2414 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL124:
-	.loc 1 2336 0
+	.loc 1 2416 0
 	ldr	w0, [x20, 96]
 	cbz	w0, .L316
 .L211:
-	.loc 1 2340 0
+	.loc 1 2420 0
 	ldr	w0, [x21, 40]
 	cmp	w0, 18
 	beq	.L317
-	.loc 1 2340 0 is_stmt 0 discriminator 3
+	.loc 1 2420 0 is_stmt 0 discriminator 3
 	cmp	w0, 20
 	bne	.L216
 .L213:
-	.loc 1 2341 0 is_stmt 1
+	.loc 1 2421 0 is_stmt 1
 	mov	w0, 1
 	str	w0, [x20, 204]
 .LBB1022:
 .LBB1023:
-	.loc 1 2342 0
+	.loc 1 2422 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
@@ -1866,13 +1866,13 @@ ebc_io_ctl:
 	.p2align 3
 .L318:
 .LVL126:
-	.loc 1 2342 0 is_stmt 0 discriminator 5
+	.loc 1 2422 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L216
-	.loc 1 2342 0 discriminator 7
+	.loc 1 2422 0 discriminator 7
 	bl	schedule
 .LVL127:
 .L217:
-	.loc 1 2342 0 discriminator 9
+	.loc 1 2422 0 discriminator 9
 	add	x1, x29, 64
 	mov	w2, 1
 	mov	x0, x21
@@ -1881,7 +1881,7 @@ ebc_io_ctl:
 	ldr	w1, [x20, 204]
 	cbnz	w1, .L318
 .LBE1024:
-	.loc 1 2342 0 discriminator 4
+	.loc 1 2422 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
 	bl	finish_wait
@@ -1895,13 +1895,13 @@ ebc_io_ctl:
 .L193:
 .LBE1023:
 .LBE1022:
-	.loc 1 2426 0 is_stmt 1
+	.loc 1 2506 0 is_stmt 1
 	bl	ebc_empty_buf_get
 .LVL131:
 	mov	x23, x0
-	.loc 1 2427 0
+	.loc 1 2507 0
 	cbz	x0, .L201
-	.loc 1 2429 0
+	.loc 1 2509 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 344]
@@ -1911,7 +1911,7 @@ ebc_io_ctl:
 .LVL132:
 	.p2align 3
 .L311:
-	.loc 1 2284 0
+	.loc 1 2364 0
 	mov	w0, 28678
 	cmp	w1, w0
 	beq	.L191
@@ -2026,36 +2026,36 @@ ebc_io_ctl:
 .LBE1030:
 .LBE1029:
 .LBE1028:
-	.loc 1 2351 0
+	.loc 1 2431 0
 	bl	ebc_osd_buf_clone
 .LVL145:
 	mov	x1, x0
-	.loc 1 2352 0
+	.loc 1 2432 0
 	cbz	x0, .L216
-	.loc 1 2353 0
+	.loc 1 2433 0
 	ldr	w6, [x29, 108]
-	.loc 1 2362 0
+	.loc 1 2442 0
 	add	x20, x20, 184
-	.loc 1 2357 0
+	.loc 1 2437 0
 	ldp	w5, w3, [x29, 124]
-	.loc 1 2353 0
+	.loc 1 2433 0
 	str	w6, [x1, 40]
-	.loc 1 2358 0
+	.loc 1 2438 0
 	ldp	w4, w2, [x29, 132]
-	.loc 1 2357 0
+	.loc 1 2437 0
 	stp	w5, w3, [x1, 48]
-	.loc 1 2358 0
+	.loc 1 2438 0
 	stp	w4, w2, [x1, 56]
-	.loc 1 2360 0
+	.loc 1 2440 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL146:
-	.loc 1 2362 0
+	.loc 1 2442 0
 	ldr	w0, [x20, 96]
 	cbnz	w0, .L216
-	.loc 1 2363 0
+	.loc 1 2443 0
 	mov	w2, 1
 	str	w2, [x20, 96]
-	.loc 1 2364 0
+	.loc 1 2444 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -2128,16 +2128,16 @@ ebc_io_ctl:
 .LBE987:
 .LBE990:
 .LBE1057:
-	.loc 1 2286 0
+	.loc 1 2366 0
 	bl	ebc_osd_buf_get
 .LVL157:
-	.loc 1 2287 0
+	.loc 1 2367 0
 	cbz	x0, .L201
-	.loc 1 2290 0
+	.loc 1 2370 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL158:
-	.loc 1 2295 0
+	.loc 1 2375 0
 	ldr	w1, [x20, 176]
 .LBB1058:
 .LBB1059:
@@ -2162,19 +2162,19 @@ ebc_io_ctl:
 .LBE1060:
 .LBE1059:
 .LBE1058:
-	.loc 1 2290 0
+	.loc 1 2370 0
 	sub	w0, w22, w0
-	.loc 1 2294 0
+	.loc 1 2374 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 2295 0
+	.loc 1 2375 0
 	str	w1, [x29, 120]
-	.loc 1 2293 0
+	.loc 1 2373 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 2296 0
+	.loc 1 2376 0
 	mov	w1, 16
-	.loc 1 2292 0
+	.loc 1 2372 0
 	str	w0, [x29, 104]
-	.loc 1 2296 0
+	.loc 1 2376 0
 	str	w1, [x29, 148]
 .LBB1091:
 .LBB1088:
@@ -2299,7 +2299,7 @@ ebc_io_ctl:
 .LBE1094:
 .LBE1093:
 .LBE1092:
-	.loc 1 2378 0
+	.loc 1 2458 0
 	add	x22, x20, 248
 .LBB1127:
 .LBB1123:
@@ -2396,49 +2396,49 @@ ebc_io_ctl:
 .LBE1119:
 .LBE1123:
 .LBE1127:
-	.loc 1 2382 0
+	.loc 1 2462 0
 	add	x20, x20, 184
 	ldr	w2, [x20, 64]
 	ldr	x0, [x20, 104]
 .LVL184:
-	.loc 1 2383 0
+	.loc 1 2463 0
 	mov	x22, 0
-	.loc 1 2382 0
+	.loc 1 2462 0
 	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	_dev_info
 .LVL185:
-	.loc 1 2383 0
+	.loc 1 2463 0
 	b	.L176
 .LVL186:
 	.p2align 3
 .L181:
-	.loc 1 2375 0
+	.loc 1 2455 0
 	ldr	x0, [x20, 288]
 	adrp	x1, .LC3
 .LVL187:
-	.loc 1 2373 0
+	.loc 1 2453 0
 	str	wzr, [x20, 812]
-	.loc 1 2376 0
+	.loc 1 2456 0
 	mov	x22, 0
-	.loc 1 2374 0
+	.loc 1 2454 0
 	str	wzr, [x20, 816]
-	.loc 1 2375 0
+	.loc 1 2455 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
 .LVL188:
-	.loc 1 2376 0
+	.loc 1 2456 0
 	b	.L176
 .LVL189:
 	.p2align 3
 .L189:
-	.loc 1 2413 0
+	.loc 1 2493 0
 	bl	ebc_empty_buf_get
 .LVL190:
 	mov	x23, x0
-	.loc 1 2414 0
+	.loc 1 2494 0
 	cbz	x0, .L201
-	.loc 1 2416 0
+	.loc 1 2496 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 336]
@@ -2448,13 +2448,13 @@ ebc_io_ctl:
 .LVL191:
 	.p2align 3
 .L194:
-	.loc 1 2400 0
+	.loc 1 2480 0
 	bl	ebc_empty_buf_get
 .LVL192:
 	mov	x23, x0
-	.loc 1 2401 0
+	.loc 1 2481 0
 	cbz	x0, .L201
-	.loc 1 2403 0
+	.loc 1 2483 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 328]
@@ -2463,7 +2463,7 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL193:
-	.loc 1 2404 0
+	.loc 1 2484 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL194:
@@ -2491,11 +2491,11 @@ ebc_io_ctl:
 .LBE1130:
 .LBE1129:
 .LBE1128:
-	.loc 1 2407 0
+	.loc 1 2487 0
 	ldp	w4, w1, [x22, 84]
-	.loc 1 2405 0
+	.loc 1 2485 0
 	str	w0, [x29, 104]
-	.loc 1 2406 0
+	.loc 1 2486 0
 	stp	w1, w4, [x29, 112]
 .LBB1139:
 .LBB1138:
@@ -2516,7 +2516,7 @@ ebc_io_ctl:
 .LBE1137:
 .LBE1138:
 .LBE1139:
-	.loc 1 2389 0
+	.loc 1 2469 0
 	ldp	w1, w0, [x20, 116]
 .LVL198:
 .LBB1140:
@@ -2542,19 +2542,19 @@ ebc_io_ctl:
 .LBE1142:
 .LBE1141:
 .LBE1140:
-	.loc 1 2386 0
+	.loc 1 2466 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 2389 0
+	.loc 1 2469 0
 	stp	w1, w0, [x29, 140]
-	.loc 1 2387 0
+	.loc 1 2467 0
 	ldr	w4, [x20, 176]
-	.loc 1 2390 0
+	.loc 1 2470 0
 	mov	w0, 16
-	.loc 1 2385 0
+	.loc 1 2465 0
 	stp	w5, w6, [x29, 112]
-	.loc 1 2387 0
+	.loc 1 2467 0
 	str	w4, [x29, 120]
-	.loc 1 2390 0
+	.loc 1 2470 0
 	str	w0, [x29, 148]
 .LBB1175:
 .LBB1171:
@@ -2601,50 +2601,50 @@ ebc_io_ctl:
 .LBE1167:
 .LBE1171:
 .LBE1175:
-	.loc 1 2393 0
+	.loc 1 2473 0
 	ldr	x0, [x20, 288]
 .LVL205:
 	adrp	x1, .LC5
 .LVL206:
-	.loc 1 2394 0
+	.loc 1 2474 0
 	mov	x22, -14
-	.loc 1 2393 0
+	.loc 1 2473 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
 .LVL207:
-	.loc 1 2394 0
+	.loc 1 2474 0
 	b	.L176
 .LVL208:
 	.p2align 3
 .L180:
-	.loc 1 2454 0
+	.loc 1 2534 0
 	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
 .LVL209:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
-	.loc 1 2455 0
+	.loc 1 2535 0
 	mov	x22, 0
-	.loc 1 2454 0
+	.loc 1 2534 0
 	bl	_dev_err
 .LVL210:
-	.loc 1 2458 0
+	.loc 1 2538 0
 	b	.L176
 .LVL211:
 	.p2align 3
 .L185:
-	.loc 1 2301 0
+	.loc 1 2381 0
 	bl	ebc_empty_buf_get
 .LVL212:
 	mov	x23, x0
-	.loc 1 2302 0
+	.loc 1 2382 0
 	cbz	x0, .L201
-	.loc 1 2305 0
+	.loc 1 2385 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL213:
-	.loc 1 2310 0
+	.loc 1 2390 0
 	ldr	w1, [x20, 176]
 .LBB1176:
 .LBB1177:
@@ -2669,19 +2669,19 @@ ebc_io_ctl:
 .LBE1178:
 .LBE1177:
 .LBE1176:
-	.loc 1 2305 0
+	.loc 1 2385 0
 	sub	w0, w22, w0
-	.loc 1 2309 0
+	.loc 1 2389 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 2310 0
+	.loc 1 2390 0
 	str	w1, [x29, 120]
-	.loc 1 2308 0
+	.loc 1 2388 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 2311 0
+	.loc 1 2391 0
 	mov	w1, 16
-	.loc 1 2307 0
+	.loc 1 2387 0
 	str	w0, [x29, 104]
-	.loc 1 2311 0
+	.loc 1 2391 0
 	str	w1, [x29, 148]
 .LBB1211:
 .LBB1207:
@@ -2728,15 +2728,15 @@ ebc_io_ctl:
 .LBE1203:
 .LBE1207:
 .LBE1211:
-	.loc 1 2315 0
+	.loc 1 2395 0
 	mov	x0, x23
 .LVL220:
-	.loc 1 2316 0
+	.loc 1 2396 0
 	mov	x22, -14
-	.loc 1 2315 0
+	.loc 1 2395 0
 	bl	ebc_buf_release
 .LVL221:
-	.loc 1 2316 0
+	.loc 1 2396 0
 	b	.L176
 .LVL222:
 	.p2align 3
@@ -2759,7 +2759,7 @@ ebc_io_ctl:
 .LBE1053:
 .LBE1055:
 .LBE1212:
-	.loc 1 2259 0
+	.loc 1 2339 0
 	mov	x0, x21
 .LVL223:
 .LBB1213:
@@ -2796,7 +2796,7 @@ ebc_io_ctl:
 .LBE1018:
 .LBE1020:
 .LBE1214:
-	.loc 1 2259 0
+	.loc 1 2339 0
 	mov	x0, x21
 .LVL225:
 .LBB1215:
@@ -2834,7 +2834,7 @@ ebc_io_ctl:
 .LBE1168:
 .LBE1172:
 .LBE1216:
-	.loc 1 2259 0
+	.loc 1 2339 0
 	mov	x0, x21
 .LVL228:
 .LBB1217:
@@ -2871,7 +2871,7 @@ ebc_io_ctl:
 .LBE1120:
 .LBE1124:
 .LBE1218:
-	.loc 1 2259 0
+	.loc 1 2339 0
 	mov	x0, x21
 .LVL230:
 .LBB1219:
@@ -2909,7 +2909,7 @@ ebc_io_ctl:
 .LBE1204:
 .LBE1208:
 .LBE1220:
-	.loc 1 2259 0
+	.loc 1 2339 0
 	mov	x0, x21
 .LVL233:
 .LBB1221:
@@ -2947,7 +2947,7 @@ ebc_io_ctl:
 .LBE1086:
 .LBE1089:
 .LBE1222:
-	.loc 1 2259 0
+	.loc 1 2339 0
 	mov	x0, x21
 .LVL236:
 .LBB1223:
@@ -3022,7 +3022,7 @@ ebc_io_ctl:
 .LBE1170:
 .LBE1174:
 .LBE1224:
-	.loc 1 2392 0
+	.loc 1 2472 0
 	cbnz	x0, .L228
 .LBB1225:
 .LBB1025:
@@ -3089,7 +3089,7 @@ ebc_io_ctl:
 .LBE1206:
 .LBE1210:
 .LBE1226:
-	.loc 1 2314 0
+	.loc 1 2394 0
 	cbnz	w0, .L205
 .LBB1227:
 .LBB1026:
@@ -3100,16 +3100,16 @@ ebc_io_ctl:
 .L209:
 .LBE1026:
 .LBE1227:
-	.loc 1 2322 0
+	.loc 1 2402 0
 	mov	x22, -14
 	b	.L176
 .LVL254:
 	.p2align 3
 .L316:
-	.loc 1 2337 0
+	.loc 1 2417 0
 	mov	w2, 1
 	str	w2, [x20, 96]
-	.loc 1 2338 0
+	.loc 1 2418 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -3119,7 +3119,7 @@ ebc_io_ctl:
 	b	.L211
 	.p2align 3
 .L317:
-	.loc 1 2340 0 discriminator 1
+	.loc 1 2420 0 discriminator 1
 	ldr	w0, [x20, 616]
 	cbz	w0, .L213
 .LBB1228:
@@ -3130,7 +3130,7 @@ ebc_io_ctl:
 .L201:
 .LBE1027:
 .LBE1228:
-	.loc 1 2288 0
+	.loc 1 2368 0
 	mov	x22, -1
 	b	.L176
 .LVL257:
@@ -3153,19 +3153,19 @@ ebc_io_ctl:
 .LBE1122:
 .LBE1126:
 .LBE1229:
-	.loc 1 2379 0
+	.loc 1 2459 0
 	ldr	x0, [x20, 288]
 	adrp	x1, .LC4
-	.loc 1 2380 0
+	.loc 1 2460 0
 	mov	x22, -14
-	.loc 1 2379 0
+	.loc 1 2459 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
 .LVL262:
-	.loc 1 2380 0
+	.loc 1 2460 0
 	b	.L176
 .L314:
-	.loc 1 2459 0
+	.loc 1 2539 0
 	bl	__stack_chk_fail
 .LVL263:
 .L322:
@@ -3174,33 +3174,33 @@ ebc_io_ctl:
 .LVL264:
 	b	.L223
 	.cfi_endproc
-.LFE2842:
+.LFE2843:
 	.size	ebc_io_ctl, .-ebc_io_ctl
 	.align	2
 	.p2align 3,,7
 	.type	frame_done_callback, %function
 frame_done_callback:
-.LFB2832:
-	.loc 1 1608 0
+.LFB2833:
+	.loc 1 1675 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 1609 0
+	.loc 1 1676 0
 	adrp	x1, .LANCHOR0
-	.loc 1 1608 0
+	.loc 1 1675 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 1609 0
+	.loc 1 1676 0
 	ldr	x20, [x1, #:lo12:.LANCHOR0]
-	.loc 1 1608 0
+	.loc 1 1675 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 1612 0
+	.loc 1 1679 0
 	add	x19, x20, 184
 	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
@@ -3211,40 +3211,40 @@ frame_done_callback:
 	cmp	w0, 1
 	bls	.L327
 .L326:
-	.loc 1 1632 0
+	.loc 1 1699 0
 	ldr	w0, [x19, 56]
 	cbnz	w0, .L332
-	.loc 1 1638 0
+	.loc 1 1705 0
 	ldr	x0, [x19, 104]
-	.loc 1 1637 0
+	.loc 1 1704 0
 	mov	w20, 1
-	.loc 1 1636 0
+	.loc 1 1703 0
 	str	wzr, [x19, 44]
-	.loc 1 1638 0
+	.loc 1 1705 0
 	adrp	x1, .LC9
-	.loc 1 1637 0
+	.loc 1 1704 0
 	str	w20, [x19, 92]
-	.loc 1 1638 0
+	.loc 1 1705 0
 	add	x1, x1, :lo12:.LC9
-	.loc 1 1639 0
+	.loc 1 1706 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
-	.loc 1 1638 0
+	.loc 1 1705 0
 	bl	_dev_info
 .LVL265:
-	.loc 1 1639 0
+	.loc 1 1706 0
 	mov	w2, w20
 	add	x0, x19, 352
 	mov	w1, w20
 	bl	__wake_up_sync
 .LVL266:
-	.loc 1 1640 0
+	.loc 1 1707 0
 	mov	w2, w20
 	mov	w1, w20
 	add	x0, x19, 304
 	bl	__wake_up_sync
 .LVL267:
-	.loc 1 1644 0
+	.loc 1 1711 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -3259,15 +3259,15 @@ frame_done_callback:
 	.p2align 3
 .L327:
 	.cfi_restore_state
-	.loc 1 1617 0
+	.loc 1 1684 0
 	ldr	w0, [x19, 52]
 	cbz	w0, .L328
-	.loc 1 1618 0
+	.loc 1 1685 0
 	add	x1, x1, :lo12:.LANCHOR0
 	ldr	x0, [x1, 8]
 	bl	wake_up_process
 .LVL268:
-	.loc 1 1644 0
+	.loc 1 1711 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -3282,23 +3282,23 @@ frame_done_callback:
 	.p2align 3
 .L328:
 	.cfi_restore_state
-	.loc 1 1621 0
+	.loc 1 1688 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC8
 	add	x1, x1, :lo12:.LC8
-	.loc 1 1626 0
+	.loc 1 1693 0
 	mov	w21, 1
-	.loc 1 1621 0
+	.loc 1 1688 0
 	bl	_dev_info
 .LVL269:
-	.loc 1 1623 0
+	.loc 1 1690 0
 	ldp	w3, w2, [x20, 108]
 	mov	w1, 0
 	ldr	x0, [x19, 168]
 	mul	w2, w3, w2
 	bl	memset
 .LVL270:
-	.loc 1 1624 0
+	.loc 1 1691 0
 	adrp	x2, jiffies
 	add	x0, x20, 688
 	mov	x1, 402653184
@@ -3306,11 +3306,11 @@ frame_done_callback:
 	add	x1, x2, x1
 	bl	mod_timer
 .LVL271:
-	.loc 1 1626 0
+	.loc 1 1693 0
 	str	w21, [x19, 92]
-	.loc 1 1625 0
+	.loc 1 1692 0
 	str	wzr, [x19, 44]
-	.loc 1 1627 0
+	.loc 1 1694 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
 	mov	w2, w21
@@ -3318,13 +3318,13 @@ frame_done_callback:
 	add	x0, x19, 352
 	bl	__wake_up_sync
 .LVL272:
-	.loc 1 1628 0
+	.loc 1 1695 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x19, 304
 	bl	__wake_up_sync
 .LVL273:
-	.loc 1 1644 0
+	.loc 1 1711 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -3339,16 +3339,16 @@ frame_done_callback:
 	.p2align 3
 .L332:
 	.cfi_restore_state
-	.loc 1 1634 0
+	.loc 1 1701 0
 	add	x1, x1, :lo12:.LANCHOR0
-	.loc 1 1633 0
+	.loc 1 1700 0
 	mov	w0, 1
 	str	w0, [x19, 44]
-	.loc 1 1634 0
+	.loc 1 1701 0
 	ldr	x0, [x1, 8]
 	bl	wake_up_process
 .LVL274:
-	.loc 1 1644 0
+	.loc 1 1711 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -3360,14 +3360,14 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2832:
+.LFE2833:
 	.size	frame_done_callback, .-frame_done_callback
 	.align	2
 	.p2align 3,,7
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
-.LFB2840:
-	.loc 1 2185 0
+.LFB2841:
+	.loc 1 2265 0
 	.cfi_startproc
 .LVL275:
 	stp	x29, x30, [sp, -16]!
@@ -3376,33 +3376,33 @@ ebc_frame_timeout:
 	.cfi_offset 30, -8
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2186 0
+	.loc 1 2266 0
 	bl	frame_done_callback
 .LVL276:
-	.loc 1 2188 0
+	.loc 1 2268 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2840:
+.LFE2841:
 	.size	ebc_frame_timeout, .-ebc_frame_timeout
 	.align	2
 	.p2align 3,,7
 	.type	ebc_lut_update, %function
 ebc_lut_update:
-.LFB2833:
-	.loc 1 1647 0
+.LFB2834:
+	.loc 1 1714 0
 	.cfi_startproc
 .LVL277:
 	stp	x29, x30, [sp, -80]!
 	.cfi_def_cfa_offset 80
 	.cfi_offset 29, -80
 	.cfi_offset 30, -72
-	.loc 1 1649 0
+	.loc 1 1716 0
 	mov	w4, 25
-	.loc 1 1647 0
+	.loc 1 1714 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x21, x22, [sp, 32]
@@ -3410,26 +3410,26 @@ ebc_lut_update:
 	.cfi_offset 22, -40
 	mov	x21, x0
 	stp	x19, x20, [sp, 16]
-	.loc 1 1649 0
+	.loc 1 1716 0
 	add	x0, x29, 80
 .LVL278:
-	.loc 1 1647 0
+	.loc 1 1714 0
 	str	x23, [sp, 48]
 	.cfi_offset 19, -64
 	.cfi_offset 20, -56
 	.cfi_offset 23, -32
-	.loc 1 1647 0
+	.loc 1 1714 0
 	adrp	x19, __stack_chk_guard
 	add	x3, x19, :lo12:__stack_chk_guard
 	mov	w23, w1
-	.loc 1 1656 0
+	.loc 1 1723 0
 	ldr	x2, [x21, 16]
-	.loc 1 1647 0
+	.loc 1 1714 0
 	ldr	x1, [x3]
 	str	x1, [x29, 72]
 	mov	x1,0
 .LVL279:
-	.loc 1 1649 0
+	.loc 1 1716 0
 	str	w4, [x0, -12]!
 .LVL280:
 .LBB1230:
@@ -3443,51 +3443,51 @@ ebc_lut_update:
 	mov	w20, w0
 .LBE1231:
 .LBE1230:
-	.loc 1 1657 0
+	.loc 1 1724 0
 	cbnz	w0, .L336
 .LVL282:
-	.loc 1 1658 0
+	.loc 1 1725 0
 	ldr	w2, [x29, 68]
-	.loc 1 1659 0
+	.loc 1 1726 0
 	add	x22, x21, 184
-	.loc 1 1658 0
-	tbnz	w2, #31, .L360
-	.loc 1 1662 0
+	.loc 1 1725 0
+	tbnz	w2, #31, .L363
+	.loc 1 1729 0
 	cmp	w2, 50
-	bgt	.L361
+	bgt	.L364
 .L338:
-	.loc 1 1670 0
+	.loc 1 1737 0
 	ldr	x0, [x22, 104]
 	adrp	x1, .LC13
 	add	x1, x1, :lo12:.LC13
 	bl	_dev_info
 .LVL283:
-	.loc 1 1673 0
+	.loc 1 1740 0
 	ldr	x0, [x22, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 23
-	bls	.L362
-	.loc 1 1732 0
+	bls	.L365
+	.loc 1 1808 0
 	ldr	w2, [x29, 68]
+.L362:
 	mov	w3, w23
-.L359:
 	mov	w1, 7
 	add	x0, x21, 296
 	bl	epd_lut_get
 .LVL284:
-	cbnz	w0, .L351
+	cbnz	w0, .L354
 	.p2align 2
-.L354:
-	.loc 1 1737 0
-	cbnz	w20, .L352
+.L357:
+	.loc 1 1813 0
+	cbnz	w20, .L355
 .L335:
-	.loc 1 1743 0
+	.loc 1 1819 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	w0, w20
 	ldr	x2, [x29, 72]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L363
+	cbnz	x1, .L366
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 .LVL285:
@@ -3506,17 +3506,14 @@ ebc_lut_update:
 	ret
 .LVL287:
 	.p2align 3
-.L362:
+.L365:
 	.cfi_restore_state
-	.loc 1 1673 0
+	.loc 1 1740 0
 	adrp	x1, .L341
-	.loc 1 1675 0
-	mov	w3, w23
-	.loc 1 1673 0
-	add	x1, x1, :lo12:.L341
-	.loc 1 1675 0
+	.loc 1 1784 0
 	ldr	w2, [x29, 68]
-	.loc 1 1673 0
+	.loc 1 1740 0
+	add	x1, x1, :lo12:.L341
 	ldrb	w0, [x1,w0,uxtw]
 	adr	x1, .Lrtx341
 	add	x0, x1, w0, sxtb #2
@@ -3526,35 +3523,35 @@ ebc_lut_update:
 	.align	0
 	.align	2
 .L341:
-	.byte	(.L359 - .Lrtx341) / 4
+	.byte	(.L340 - .Lrtx341) / 4
 	.byte	(.L342 - .Lrtx341) / 4
-	.byte	(.L359 - .Lrtx341) / 4
-	.byte	(.L343 - .Lrtx341) / 4
+	.byte	(.L362 - .Lrtx341) / 4
 	.byte	(.L344 - .Lrtx341) / 4
 	.byte	(.L345 - .Lrtx341) / 4
 	.byte	(.L346 - .Lrtx341) / 4
-	.byte	(.L359 - .Lrtx341) / 4
-	.byte	(.L343 - .Lrtx341) / 4
+	.byte	(.L347 - .Lrtx341) / 4
+	.byte	(.L362 - .Lrtx341) / 4
 	.byte	(.L344 - .Lrtx341) / 4
 	.byte	(.L345 - .Lrtx341) / 4
 	.byte	(.L346 - .Lrtx341) / 4
 	.byte	(.L347 - .Lrtx341) / 4
-	.byte	(.L347 - .Lrtx341) / 4
 	.byte	(.L348 - .Lrtx341) / 4
-	.byte	(.L349 - .Lrtx341) / 4
 	.byte	(.L348 - .Lrtx341) / 4
+	.byte	(.L349 - .Lrtx341) / 4
 	.byte	(.L350 - .Lrtx341) / 4
-	.byte	(.L359 - .Lrtx341) / 4
-	.byte	(.L359 - .Lrtx341) / 4
-	.byte	(.L359 - .Lrtx341) / 4
-	.byte	(.L359 - .Lrtx341) / 4
-	.byte	(.L348 - .Lrtx341) / 4
 	.byte	(.L349 - .Lrtx341) / 4
+	.byte	(.L351 - .Lrtx341) / 4
+	.byte	(.L362 - .Lrtx341) / 4
+	.byte	(.L362 - .Lrtx341) / 4
+	.byte	(.L362 - .Lrtx341) / 4
+	.byte	(.L362 - .Lrtx341) / 4
+	.byte	(.L352 - .Lrtx341) / 4
+	.byte	(.L353 - .Lrtx341) / 4
 	.text
 .LVL288:
 	.p2align 3
 .L336:
-	.loc 1 1668 0
+	.loc 1 1735 0
 	add	x22, x21, 184
 	mov	w2, w0
 	adrp	x1, .LC12
@@ -3565,152 +3562,191 @@ ebc_lut_update:
 	ldr	w2, [x29, 68]
 	b	.L338
 	.p2align 3
-.L361:
-	.loc 1 1663 0
+.L364:
+	.loc 1 1730 0
 	ldr	x0, [x22, 104]
 	adrp	x1, .LC11
 	add	x1, x1, :lo12:.LC11
 	bl	_dev_info
 .LVL290:
-	.loc 1 1664 0
+	.loc 1 1731 0
 	mov	w2, 50
 	str	w2, [x29, 68]
 .LVL291:
 	b	.L338
 	.p2align 3
-.L350:
-	.loc 1 1675 0
+.L351:
+	.loc 1 1742 0
+	mov	w3, w23
 	mov	w1, 1
 	add	x0, x21, 296
 	bl	epd_lut_get
 .LVL292:
-	cbz	w0, .L354
+	cbz	w0, .L357
 	.p2align 2
-.L351:
-	.loc 1 1664 0
+.L354:
+	.loc 1 1731 0
 	mov	w20, -1
-.L352:
-	.loc 1 1738 0
+.L355:
+	.loc 1 1814 0
 	ldr	x0, [x22, 104]
 	adrp	x1, .LC14
 	add	x1, x1, :lo12:.LC14
 	bl	_dev_err
 .LVL293:
-	.loc 1 1739 0
+	.loc 1 1815 0
 	b	.L335
 	.p2align 3
-.L344:
-	.loc 1 1718 0
-	mov	w1, 9
+.L352:
+	.loc 1 1776 0
+	mov	w3, 16
+	mov	w1, 4
 	add	x0, x21, 296
 	bl	epd_lut_get
 .LVL294:
-	cbnz	w0, .L351
-	b	.L354
+	cbnz	w0, .L354
+	b	.L357
 	.p2align 3
 .L345:
-	.loc 1 1723 0
-	mov	w1, 10
+	.loc 1 1794 0
+	mov	w3, w23
+	mov	w1, 9
 	add	x0, x21, 296
 	bl	epd_lut_get
 .LVL295:
-	cbnz	w0, .L351
-	b	.L354
+	cbnz	w0, .L354
+	b	.L357
 	.p2align 3
-.L342:
-	.loc 1 1690 0
-	mov	w1, 5
+.L346:
+	.loc 1 1799 0
+	mov	w3, w23
+	mov	w1, 10
 	add	x0, x21, 296
 	bl	epd_lut_get
 .LVL296:
-	cbnz	w0, .L351
-	b	.L354
+	cbnz	w0, .L354
+	b	.L357
 	.p2align 3
-.L343:
-	.loc 1 1713 0
-	mov	w1, 8
+.L347:
+	.loc 1 1804 0
+	mov	w3, w23
+	mov	w1, 11
 	add	x0, x21, 296
 	bl	epd_lut_get
 .LVL297:
-	cbnz	w0, .L351
-	b	.L354
+	cbnz	w0, .L354
+	b	.L357
 	.p2align 3
-.L346:
-	.loc 1 1728 0
-	mov	w1, 11
+.L340:
+	.loc 1 1755 0
+	mov	w3, 16
+	mov	w1, 7
 	add	x0, x21, 296
 	bl	epd_lut_get
 .LVL298:
-	cbnz	w0, .L351
-	b	.L354
+	cbnz	w0, .L354
+	b	.L357
 	.p2align 3
-.L347:
-	.loc 1 1697 0
-	mov	w1, 6
+.L344:
+	.loc 1 1789 0
+	mov	w3, w23
+	mov	w1, 8
 	add	x0, x21, 296
 	bl	epd_lut_get
 .LVL299:
-	cbnz	w0, .L351
-	b	.L354
+	cbnz	w0, .L354
+	b	.L357
 	.p2align 3
-.L348:
-	.loc 1 1703 0
-	mov	w1, 4
+.L350:
+	.loc 1 1780 0
+	mov	w3, w23
+	mov	w1, 3
 	add	x0, x21, 296
 	bl	epd_lut_get
 .LVL300:
-	cbnz	w0, .L351
-	b	.L354
+	cbnz	w0, .L354
+	b	.L357
 	.p2align 3
-.L349:
-	.loc 1 1708 0
-	mov	w1, 3
+.L342:
+	.loc 1 1760 0
+	mov	w3, 16
+	mov	w1, 5
 	add	x0, x21, 296
 	bl	epd_lut_get
 .LVL301:
-	cbnz	w0, .L351
-	b	.L354
+	cbnz	w0, .L354
+	b	.L357
+	.p2align 3
+.L353:
+	.loc 1 1784 0
+	mov	w3, 16
+	mov	w1, 3
+	add	x0, x21, 296
+	bl	epd_lut_get
+.LVL302:
+	cbnz	w0, .L354
+	b	.L357
+	.p2align 3
+.L348:
+	.loc 1 1767 0
+	mov	w3, w23
+	mov	w1, 6
+	add	x0, x21, 296
+	bl	epd_lut_get
+.LVL303:
+	cbnz	w0, .L354
+	b	.L357
+	.p2align 3
+.L349:
+	.loc 1 1772 0
+	mov	w3, w23
+	mov	w1, 4
+	add	x0, x21, 296
+	bl	epd_lut_get
+.LVL304:
+	cbnz	w0, .L354
+	b	.L357
 	.p2align 3
-.L360:
-	.loc 1 1659 0
+.L363:
+	.loc 1 1726 0
 	ldr	x0, [x22, 104]
 	adrp	x1, .LC10
 	add	x1, x1, :lo12:.LC10
 	bl	_dev_info
-.LVL302:
-	.loc 1 1660 0
+.LVL305:
+	.loc 1 1727 0
 	str	wzr, [x29, 68]
 	mov	w2, 0
 	b	.L338
-.L363:
-	.loc 1 1743 0
+.L366:
+	.loc 1 1819 0
 	bl	__stack_chk_fail
-.LVL303:
+.LVL306:
 	.cfi_endproc
-.LFE2833:
+.LFE2834:
 	.size	ebc_lut_update, .-ebc_lut_update
 	.align	2
 	.p2align 3,,7
 	.type	ebc_buf_state_read, %function
 ebc_buf_state_read:
-.LFB2854:
-	.loc 1 2627 0
+.LFB2855:
+	.loc 1 2707 0
 	.cfi_startproc
-.LVL304:
+.LVL307:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2628 0
+	.loc 1 2708 0
 	mov	x0, x2
-.LVL305:
-	.loc 1 2627 0
+.LVL308:
+	.loc 1 2707 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2628 0
+	.loc 1 2708 0
 	bl	ebc_buf_state_show
-.LVL306:
-	.loc 1 2629 0
+.LVL309:
+	.loc 1 2709 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3718,39 +3754,39 @@ ebc_buf_state_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2854:
+.LFE2855:
 	.size	ebc_buf_state_read, .-ebc_buf_state_read
 	.align	2
 	.p2align 3,,7
 	.type	ebc_state_read, %function
 ebc_state_read:
-.LFB2853:
-	.loc 1 2618 0
+.LFB2854:
+	.loc 1 2698 0
 	.cfi_startproc
-.LVL307:
+.LVL310:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2619 0
+	.loc 1 2699 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2618 0
+	.loc 1 2698 0
 	mov	x0, x2
-.LVL308:
-	.loc 1 2619 0
+.LVL311:
+	.loc 1 2699 0
 	adrp	x1, .LC15
-.LVL309:
-	.loc 1 2618 0
+.LVL312:
+	.loc 1 2698 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2619 0
+	.loc 1 2699 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL310:
+.LVL313:
 	add	x1, x1, :lo12:.LC15
 	ldr	w2, [x2, 624]
 	bl	sprintf
-.LVL311:
-	.loc 1 2620 0
+.LVL314:
+	.loc 1 2700 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3758,38 +3794,38 @@ ebc_state_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2853:
+.LFE2854:
 	.size	ebc_state_read, .-ebc_state_read
 	.align	2
 	.p2align 3,,7
 	.type	ebc_version_read, %function
 ebc_version_read:
-.LFB2852:
-	.loc 1 2609 0
+.LFB2853:
+	.loc 1 2689 0
 	.cfi_startproc
-.LVL312:
+.LVL315:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mov	x0, x2
-.LVL313:
-	.loc 1 2610 0
+.LVL316:
+	.loc 1 2690 0
 	adrp	x1, .LC17
-.LVL314:
+.LVL317:
 	adrp	x2, .LC16
-.LVL315:
-	.loc 1 2609 0
+.LVL318:
+	.loc 1 2689 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2610 0
+	.loc 1 2690 0
 	add	x2, x2, :lo12:.LC16
-	.loc 1 2609 0
-	.loc 1 2610 0
+	.loc 1 2689 0
+	.loc 1 2690 0
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
-.LVL316:
-	.loc 1 2611 0
+.LVL319:
+	.loc 1 2691 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3797,56 +3833,56 @@ ebc_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2852:
+.LFE2853:
 	.size	ebc_version_read, .-ebc_version_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
-.LFB2850:
-	.loc 1 2573 0
+.LFB2851:
+	.loc 1 2653 0
 	.cfi_startproc
-.LVL317:
+.LVL320:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 2574 0
+	.loc 1 2654 0
 	adrp	x0, .LANCHOR0
-.LVL318:
-	.loc 1 2573 0
+.LVL321:
+	.loc 1 2653 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2577 0
+	.loc 1 2657 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2573 0
+	.loc 1 2653 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2573 0
+	.loc 1 2653 0
 	mov	x19, x2
-	.loc 1 2577 0
+	.loc 1 2657 0
 	ldr	x1, [x0, 16]
-.LVL319:
+.LVL322:
 .LBB1232:
 .LBB1233:
 	.loc 3 55 0
 	mov	x0, x1
 	ldr	x1, [x1, 64]
 	blr	x1
-.LVL320:
+.LVL323:
 .LBE1233:
 .LBE1232:
-	.loc 1 2579 0
+	.loc 1 2659 0
 	mov	w2, w0
 	adrp	x1, .LC15
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
-.LVL321:
-	.loc 1 2580 0
+.LVL324:
+	.loc 1 2660 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL322:
+.LVL325:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3854,48 +3890,48 @@ pmic_vcom_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2850:
+.LFE2851:
 	.size	pmic_vcom_read, .-pmic_vcom_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_temp_read, %function
 pmic_temp_read:
-.LFB2849:
-	.loc 1 2559 0
+.LFB2850:
+	.loc 1 2639 0
 	.cfi_startproc
-.LVL323:
+.LVL326:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 2560 0
+	.loc 1 2640 0
 	adrp	x0, .LANCHOR0
-.LVL324:
-	.loc 1 2559 0
+.LVL327:
+	.loc 1 2639 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2563 0
+	.loc 1 2643 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
 .LBB1234:
 .LBB1235:
 	.loc 3 50 0
 	add	x1, x29, 36
-.LVL325:
+.LVL328:
 .LBE1235:
 .LBE1234:
-	.loc 1 2559 0
+	.loc 1 2639 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 2559 0
+	.loc 1 2639 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
-.LVL326:
-	.loc 1 2563 0
+.LVL329:
+	.loc 1 2643 0
 	ldr	x2, [x0, 16]
 .LBB1237:
 .LBB1236:
@@ -3903,23 +3939,23 @@ pmic_temp_read:
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL327:
+.LVL330:
 .LBE1236:
 .LBE1237:
-	.loc 1 2565 0
+	.loc 1 2645 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC15
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
-.LVL328:
-	.loc 1 2566 0
+.LVL331:
+	.loc 1 2646 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L375
+	cbnz	x1, .L378
 	ldp	x19, x20, [sp, 16]
-.LVL329:
+.LVL332:
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -3929,46 +3965,46 @@ pmic_temp_read:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL330:
-.L375:
+.LVL333:
+.L378:
 	.cfi_restore_state
 	bl	__stack_chk_fail
-.LVL331:
+.LVL334:
 	.cfi_endproc
-.LFE2849:
+.LFE2850:
 	.size	pmic_temp_read, .-pmic_temp_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_name_read, %function
 pmic_name_read:
-.LFB2848:
-	.loc 1 2548 0
+.LFB2849:
+	.loc 1 2628 0
 	.cfi_startproc
-.LVL332:
+.LVL335:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2549 0
+	.loc 1 2629 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2548 0
+	.loc 1 2628 0
 	mov	x0, x2
-.LVL333:
-	.loc 1 2551 0
+.LVL336:
+	.loc 1 2631 0
 	adrp	x1, .LC17
-.LVL334:
-	.loc 1 2548 0
+.LVL337:
+	.loc 1 2628 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2551 0
+	.loc 1 2631 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL335:
+.LVL338:
 	add	x1, x1, :lo12:.LC17
 	ldr	x2, [x2, 16]
 	add	x2, x2, 8
 	bl	sprintf
-.LVL336:
-	.loc 1 2552 0
+.LVL339:
+	.loc 1 2632 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3976,24 +4012,24 @@ pmic_name_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2848:
+.LFE2849:
 	.size	pmic_name_read, .-pmic_name_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
-.LFB2851:
-	.loc 1 2585 0
+.LFB2852:
+	.loc 1 2665 0
 	.cfi_startproc
-.LVL337:
+.LVL340:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 2586 0
+	.loc 1 2666 0
 	adrp	x0, .LANCHOR0
-.LVL338:
-	.loc 1 2585 0
+.LVL341:
+	.loc 1 2665 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -4003,47 +4039,47 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 2585 0
+	.loc 1 2665 0
 	add	x1, x19, :lo12:__stack_chk_guard
-.LVL339:
+.LVL342:
 	mov	x21, x2
-	.loc 1 2586 0
+	.loc 1 2666 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
-.LVL340:
-	.loc 1 2585 0
+.LVL343:
+	.loc 1 2665 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
-.LVL341:
+.LVL344:
 	mov	x20, x3
-	.loc 1 2589 0
+	.loc 1 2669 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
-.LVL342:
-	.loc 1 2590 0
-	cbnz	w0, .L385
-.LVL343:
-	.loc 1 2594 0
+.LVL345:
+	.loc 1 2670 0
+	cbnz	w0, .L388
+.LVL346:
+	.loc 1 2674 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
-.LVL344:
-	.loc 1 2595 0
-	cbnz	w0, .L386
-.L378:
-	.loc 1 2601 0
+.LVL347:
+	.loc 1 2675 0
+	cbnz	w0, .L389
+.L381:
+	.loc 1 2681 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
-.LVL345:
+.LVL348:
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L387
+	cbnz	x1, .L390
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL346:
+.LVL349:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -4054,53 +4090,53 @@ pmic_vcom_write:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL347:
+.LVL350:
 	.p2align 3
-.L385:
+.L388:
 	.cfi_restore_state
-	.loc 1 2591 0
+	.loc 1 2671 0
 	ldr	x0, [x22]
 	adrp	x1, .LC18
 	mov	x2, x21
 	add	x1, x1, :lo12:.LC18
-	.loc 1 2592 0
+	.loc 1 2672 0
 	mov	x20, -1
-.LVL348:
-	.loc 1 2591 0
+.LVL351:
+	.loc 1 2671 0
 	bl	_dev_err
-.LVL349:
-	.loc 1 2592 0
-	b	.L378
-.LVL350:
+.LVL352:
+	.loc 1 2672 0
+	b	.L381
+.LVL353:
 	.p2align 3
-.L386:
-	.loc 1 2596 0
+.L389:
+	.loc 1 2676 0
 	ldr	x0, [x22]
 	adrp	x1, .LC19
-	.loc 1 2597 0
+	.loc 1 2677 0
 	mov	x20, -1
-.LVL351:
-	.loc 1 2596 0
+.LVL354:
+	.loc 1 2676 0
 	add	x1, x1, :lo12:.LC19
 	bl	_dev_err
-.LVL352:
-	.loc 1 2597 0
-	b	.L378
-.L387:
-	.loc 1 2601 0
+.LVL355:
+	.loc 1 2677 0
+	b	.L381
+.L390:
+	.loc 1 2681 0
 	bl	__stack_chk_fail
-.LVL353:
+.LVL356:
 	.cfi_endproc
-.LFE2851:
+.LFE2852:
 	.size	pmic_vcom_write, .-pmic_vcom_write
 	.align	2
 	.p2align 3,,7
 	.type	waveform_version_read, %function
 waveform_version_read:
-.LFB2847:
-	.loc 1 2537 0
+.LFB2848:
+	.loc 1 2617 0
 	.cfi_startproc
-.LVL354:
+.LVL357:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -4109,22 +4145,22 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2537 0
+	.loc 1 2617 0
 	mov	x19, x2
-	.loc 1 2538 0
+	.loc 1 2618 0
 	bl	epd_lut_get_wf_version
-.LVL355:
-	.loc 1 2540 0
+.LVL358:
+	.loc 1 2620 0
 	mov	x2, x0
 	adrp	x1, .LC17
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
-.LVL356:
-	.loc 1 2541 0
+.LVL359:
+	.loc 1 2621 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL357:
+.LVL360:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -4132,47 +4168,47 @@ waveform_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2847:
+.LFE2848:
 	.size	waveform_version_read, .-waveform_version_read
 	.section	.init.text,"ax",@progbits
 	.align	2
 	.type	ebc_init, %function
 ebc_init:
-.LFB2865:
-	.loc 1 3082 0
+.LFB2866:
+	.loc 1 3162 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3083 0
+	.loc 1 3163 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3082 0
+	.loc 1 3162 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3083 0
+	.loc 1 3163 0
 	bl	__platform_driver_register
-.LVL358:
-	.loc 1 3084 0
+.LVL361:
+	.loc 1 3164 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2865:
+.LFE2866:
 	.size	ebc_init, .-ebc_init
 	.text
 	.align	2
 	.p2align 3,,7
 	.type	direct_mode_data_change, %function
 direct_mode_data_change:
-.LFB2821:
-	.loc 1 1087 0
+.LFB2822:
+	.loc 1 1154 0
 	.cfi_startproc
-.LVL359:
+.LVL362:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
@@ -4185,202 +4221,202 @@ direct_mode_data_change:
 	.cfi_offset 20, -24
 	.cfi_offset 21, -16
 	.cfi_offset 22, -8
-	.loc 1 1088 0
+	.loc 1 1155 0
 	ldr	x4, [x3, 224]
 	ldr	w4, [x4, 64]
 	cmp	w4, 32
-	beq	.L444
-	.loc 1 1091 0
+	beq	.L447
+	.loc 1 1158 0
 	cmp	w4, 16
-	beq	.L445
-.L401:
+	beq	.L448
+.L404:
 .LBB1264:
 .LBB1265:
-	.loc 1 1017 0
+	.loc 1 1084 0
 	adrp	x6, .LANCHOR0
-	.loc 1 1023 0
+	.loc 1 1090 0
 	ldrb	w5, [x3, 48]
 	ldr	w4, [x3, 56]
-	.loc 1 1017 0
+	.loc 1 1084 0
 	ldr	x11, [x6, #:lo12:.LANCHOR0]
-	.loc 1 1024 0
+	.loc 1 1091 0
 	ldr	x3, [x3, 128]
-.LVL360:
-	.loc 1 1023 0
+.LVL363:
+	.loc 1 1090 0
 	sub	w5, w5, w4
-.LVL361:
-	.loc 1 1025 0
+.LVL364:
+	.loc 1 1092 0
 	add	x11, x11, 24
-	.loc 1 1024 0
+	.loc 1 1091 0
 	lsl	w5, w5, 16
-.LVL362:
+.LVL365:
 	add	x5, x3, x5, sxtw
-.LVL363:
-	.loc 1 1028 0
+.LVL366:
+	.loc 1 1095 0
 	ldr	w14, [x11, 88]
-	.loc 1 1027 0
+	.loc 1 1094 0
 	ldr	w3, [x11, 84]
-	.loc 1 1025 0
+	.loc 1 1092 0
 	ldr	w15, [x11, 156]
-.LVL364:
-	.loc 1 1030 0
+.LVL367:
+	.loc 1 1097 0
 	cmp	w14, 0
-	.loc 1 1027 0
+	.loc 1 1094 0
 	lsr	w13, w3, 3
-	.loc 1 1030 0
-	ble	.L392
+	.loc 1 1097 0
+	ble	.L395
 	sub	w12, w13, #1
 	mov	w10, 0
-.LVL365:
+.LVL368:
 	add	x12, x12, 1
 	lsl	x16, x12, 2
 	lsl	x12, x12, 3
-	.loc 1 1031 0
-	cbz	w15, .L418
-.LVL366:
+	.loc 1 1098 0
+	cbz	w15, .L421
+.LVL369:
 	.p2align 2
-.L446:
-	.loc 1 1032 0
+.L449:
+	.loc 1 1099 0
 	ldr	w7, [x11, 88]
-.LVL367:
+.LVL370:
 	sub	w7, w7, #1
 	sub	w7, w7, w10
 	mul	w7, w7, w3
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL368:
-.L419:
-	.loc 1 1036 0
-	cbz	w13, .L420
+.LVL371:
+.L422:
+	.loc 1 1103 0
+	cbz	w13, .L423
 	add	x9, x1, x16
 	mov	x8, x2
 	.p2align 2
-.L421:
-	.loc 1 1037 0
+.L424:
+	.loc 1 1104 0
 	ldr	w3, [x1], 4
-	.loc 1 1038 0
+	.loc 1 1105 0
 	ldr	w4, [x8], 8
-.LVL369:
-	.loc 1 1043 0
+.LVL372:
+	.loc 1 1110 0
 	and	w20, w3, 15
-	.loc 1 1036 0
+	.loc 1 1103 0
 	cmp	x1, x9
-	.loc 1 1047 0
+	.loc 1 1114 0
 	ubfx	x19, x3, 4, 4
-	.loc 1 1051 0
+	.loc 1 1118 0
 	ubfx	x18, x3, 8, 4
-	.loc 1 1047 0
+	.loc 1 1114 0
 	ubfx	x6, x4, 12, 4
-	.loc 1 1051 0
+	.loc 1 1118 0
 	ubfx	x17, x4, 20, 4
-	.loc 1 1047 0
+	.loc 1 1114 0
 	add	w6, w19, w6, lsl 8
-	.loc 1 1051 0
+	.loc 1 1118 0
 	add	w17, w18, w17, lsl 8
-	.loc 1 1055 0
+	.loc 1 1122 0
 	ubfx	x19, x3, 12, 4
-	.loc 1 1043 0
+	.loc 1 1110 0
 	ubfx	x18, x4, 4, 4
-	.loc 1 1054 0
+	.loc 1 1121 0
 	lsr	w4, w4, 28
-	.loc 1 1043 0
+	.loc 1 1110 0
 	add	w18, w20, w18, lsl 8
-	.loc 1 1055 0
+	.loc 1 1122 0
 	add	w4, w19, w4, lsl 8
-	.loc 1 1047 0
+	.loc 1 1114 0
 	ldrb	w6, [x5, w6, sxtw]
-	.loc 1 1051 0
+	.loc 1 1118 0
 	ldrb	w17, [x5, w17, sxtw]
-	.loc 1 1068 0
+	.loc 1 1135 0
 	ubfx	x22, x3, 20, 4
-	.loc 1 1043 0
+	.loc 1 1110 0
 	ldrb	w19, [x5, w18, sxtw]
-	.loc 1 1072 0
+	.loc 1 1139 0
 	ubfx	x21, x3, 24, 4
-	.loc 1 1055 0
+	.loc 1 1122 0
 	ldrb	w30, [x5, w4, sxtw]
-	.loc 1 1047 0
+	.loc 1 1114 0
 	ubfiz	w4, w6, 2, 2
-	.loc 1 1043 0
+	.loc 1 1110 0
 	and	w19, w19, 3
-	.loc 1 1051 0
+	.loc 1 1118 0
 	ubfiz	w6, w17, 4, 2
-	.loc 1 1055 0
+	.loc 1 1122 0
 	orr	w4, w4, w6
-	.loc 1 1064 0
+	.loc 1 1131 0
 	ubfx	x20, x3, 16, 4
-	.loc 1 1055 0
+	.loc 1 1122 0
 	orr	w30, w19, w30, lsl 6
-	.loc 1 1074 0
+	.loc 1 1141 0
 	lsr	w3, w3, 28
-.LVL370:
-	.loc 1 1055 0
+.LVL373:
+	.loc 1 1122 0
 	orr	w4, w4, w30
-	.loc 1 1057 0
+	.loc 1 1124 0
 	strb	w4, [x7], 2
-	.loc 1 1059 0
+	.loc 1 1126 0
 	ldr	w4, [x8, -4]
-	.loc 1 1068 0
+	.loc 1 1135 0
 	ubfx	x18, x4, 12, 4
-	.loc 1 1072 0
+	.loc 1 1139 0
 	ubfx	x17, x4, 20, 4
-	.loc 1 1068 0
+	.loc 1 1135 0
 	add	w18, w22, w18, lsl 8
-	.loc 1 1072 0
+	.loc 1 1139 0
 	add	w17, w21, w17, lsl 8
-	.loc 1 1064 0
+	.loc 1 1131 0
 	ubfx	x6, x4, 4, 4
-	.loc 1 1075 0
+	.loc 1 1142 0
 	lsr	w4, w4, 28
-	.loc 1 1076 0
+	.loc 1 1143 0
 	add	w3, w3, w4, lsl 8
-	.loc 1 1064 0
+	.loc 1 1131 0
 	add	w6, w20, w6, lsl 8
-	.loc 1 1068 0
+	.loc 1 1135 0
 	ldrb	w4, [x5, w18, sxtw]
-	.loc 1 1072 0
+	.loc 1 1139 0
 	ldrb	w18, [x5, w17, sxtw]
-	.loc 1 1064 0
+	.loc 1 1131 0
 	ldrb	w17, [x5, w6, sxtw]
-	.loc 1 1076 0
+	.loc 1 1143 0
 	ldrb	w6, [x5, w3, sxtw]
-	.loc 1 1068 0
+	.loc 1 1135 0
 	ubfiz	w3, w4, 2, 2
-	.loc 1 1072 0
+	.loc 1 1139 0
 	ubfiz	w18, w18, 4, 2
-	.loc 1 1064 0
+	.loc 1 1131 0
 	and	w4, w17, 3
-	.loc 1 1076 0
+	.loc 1 1143 0
 	orr	w3, w3, w18
 	orr	w4, w4, w6, lsl 6
 	orr	w3, w3, w4
-	.loc 1 1078 0
+	.loc 1 1145 0
 	strb	w3, [x7, -1]
-	.loc 1 1036 0
-	bne	.L421
+	.loc 1 1103 0
+	bne	.L424
 	add	x2, x2, x12
-.L420:
-	.loc 1 1030 0
+.L423:
+	.loc 1 1097 0
 	add	w10, w10, 1
 	cmp	w14, w10
-	beq	.L392
+	beq	.L395
 	ldr	w3, [x11, 84]
-	.loc 1 1031 0
-	cbnz	w15, .L446
-.L418:
-	.loc 1 1034 0
+	.loc 1 1098 0
+	cbnz	w15, .L449
+.L421:
+	.loc 1 1101 0
 	mul	w7, w10, w3
-.LVL371:
+.LVL374:
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL372:
-	b	.L419
-.LVL373:
+.LVL375:
+	b	.L422
+.LVL376:
 	.p2align 3
-.L392:
+.L395:
 .LBE1265:
 .LBE1264:
-	.loc 1 1103 0
+	.loc 1 1170 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -4393,91 +4429,91 @@ direct_mode_data_change:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL374:
-.L445:
+.LVL377:
+.L448:
 	.cfi_restore_state
-	.loc 1 1092 0
+	.loc 1 1159 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
 	cmp	w4, 16
-	bne	.L401
-	.loc 1 1093 0
+	bne	.L404
+	.loc 1 1160 0
 	ldr	w13, [x3, 88]
-.LVL375:
-	cbz	w13, .L402
+.LVL378:
+	cbz	w13, .L405
 .LBB1266:
 .LBB1267:
-	.loc 1 831 0
+	.loc 1 898 0
 	adrp	x6, .LANCHOR0
-	.loc 1 837 0
+	.loc 1 904 0
 	ldrb	w5, [x3, 48]
 	ldr	w4, [x3, 56]
-	.loc 1 831 0
+	.loc 1 898 0
 	ldr	x12, [x6, #:lo12:.LANCHOR0]
-	.loc 1 838 0
+	.loc 1 905 0
 	ldr	x3, [x3, 128]
-.LVL376:
-	.loc 1 837 0
+.LVL379:
+	.loc 1 904 0
 	sub	w5, w5, w4
-.LVL377:
-	.loc 1 839 0
+.LVL380:
+	.loc 1 906 0
 	add	x12, x12, 24
-	.loc 1 838 0
+	.loc 1 905 0
 	lsl	w5, w5, 16
-.LVL378:
+.LVL381:
 	add	x5, x3, x5, sxtw
-.LVL379:
-	.loc 1 842 0
+.LVL382:
+	.loc 1 909 0
 	ldr	w14, [x12, 88]
-	.loc 1 841 0
+	.loc 1 908 0
 	ldr	w3, [x12, 84]
-	.loc 1 839 0
+	.loc 1 906 0
 	ldr	w15, [x12, 156]
-.LVL380:
-	.loc 1 847 0
+.LVL383:
+	.loc 1 914 0
 	cmp	w14, 0
-	.loc 1 841 0
+	.loc 1 908 0
 	lsr	w13, w3, 4
-.LVL381:
-	.loc 1 847 0
-	ble	.L392
+.LVL384:
+	.loc 1 914 0
+	ble	.L395
 	sub	w11, w13, #1
 	mov	w16, 0
-.LVL382:
+.LVL385:
 	add	x11, x11, 1
 	lsl	x11, x11, 3
-	.loc 1 848 0
-	cbz	w15, .L403
-.LVL383:
-.L447:
-	.loc 1 849 0
+	.loc 1 915 0
+	cbz	w15, .L406
+.LVL386:
+.L450:
+	.loc 1 916 0
 	ldr	w6, [x12, 88]
-.LVL384:
+.LVL387:
 	sub	w6, w6, #1
 	sub	w6, w6, w16
 	mul	w6, w6, w3
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL385:
-.L404:
-	.loc 1 853 0
-	cbz	w13, .L405
+.LVL388:
+.L407:
+	.loc 1 920 0
+	cbz	w13, .L408
 	mov	x7, 0
 	.p2align 2
-.L406:
-	.loc 1 855 0
+.L409:
+	.loc 1 922 0
 	ldr	x4, [x2, x7]
-.LVL386:
+.LVL389:
 	add	x6, x6, 4
-	.loc 1 854 0
+	.loc 1 921 0
 	ldr	x3, [x1, x7]
-.LVL387:
+.LVL390:
 	add	x7, x7, 8
-	.loc 1 857 0
+	.loc 1 924 0
 	and	w9, w4, 65535
-	.loc 1 853 0
+	.loc 1 920 0
 	cmp	x11, x7
-	.loc 1 857 0
+	.loc 1 924 0
 	and	w8, w3, 65535
 .LBB1268:
 .LBB1269:
@@ -4491,7 +4527,7 @@ direct_mode_data_change:
 	add	w9, w9, w8, lsr 8
 .LBE1269:
 .LBE1268:
-	.loc 1 858 0
+	.loc 1 925 0
 	lsr	w10, w4, 16
 	lsr	w8, w3, 16
 .LBB1273:
@@ -4524,19 +4560,19 @@ direct_mode_data_change:
 	add	w10, w10, w8, lsr 8
 .LBE1276:
 .LBE1283:
-	.loc 1 859 0
+	.loc 1 926 0
 	ubfx	x9, x4, 32, 16
 	ubfx	x8, x3, 32, 16
-	.loc 1 860 0
+	.loc 1 927 0
 	lsr	x4, x4, 48
-.LVL388:
+.LVL391:
 .LBB1284:
 .LBB1272:
 	.loc 1 133 0
 	orr	w17, w19, w17, lsl 4
 .LBE1272:
 .LBE1284:
-	.loc 1 857 0
+	.loc 1 924 0
 	strb	w17, [x6, -4]
 .LBB1285:
 .LBB1286:
@@ -4568,16 +4604,16 @@ direct_mode_data_change:
 	add	w8, w9, w8, lsr 8
 .LBE1288:
 .LBE1295:
-	.loc 1 860 0
+	.loc 1 927 0
 	lsr	x3, x3, 48
-.LVL389:
+.LVL392:
 .LBB1296:
 .LBB1279:
 	.loc 1 133 0
 	orr	w9, w18, w10, lsl 4
 .LBE1279:
 .LBE1296:
-	.loc 1 858 0
+	.loc 1 925 0
 	strb	w9, [x6, -3]
 .LBB1297:
 .LBB1298:
@@ -4615,7 +4651,7 @@ direct_mode_data_change:
 	orr	w4, w17, w10, lsl 4
 .LBE1291:
 .LBE1306:
-	.loc 1 859 0
+	.loc 1 926 0
 	strb	w4, [x6, -2]
 .LBB1307:
 .LBB1301:
@@ -4626,312 +4662,312 @@ direct_mode_data_change:
 	orr	w3, w4, w3, lsl 4
 .LBE1301:
 .LBE1307:
-	.loc 1 860 0
+	.loc 1 927 0
 	strb	w3, [x6, -1]
-	.loc 1 853 0
-	bne	.L406
+	.loc 1 920 0
+	bne	.L409
 	add	x1, x1, x11
-.LVL390:
+.LVL393:
 	add	x2, x2, x11
-.LVL391:
-.L405:
-	.loc 1 847 0
+.LVL394:
+.L408:
+	.loc 1 914 0
 	add	w16, w16, 1
 	cmp	w14, w16
-	beq	.L392
+	beq	.L395
 	ldr	w3, [x12, 84]
-	.loc 1 848 0
-	cbnz	w15, .L447
-.L403:
-	.loc 1 851 0
+	.loc 1 915 0
+	cbnz	w15, .L450
+.L406:
+	.loc 1 918 0
 	mul	w6, w16, w3
-.LVL392:
+.LVL395:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL393:
-	b	.L404
-.LVL394:
-.L444:
+.LVL396:
+	b	.L407
+.LVL397:
+.L447:
 .LBE1267:
 .LBE1266:
-	.loc 1 1089 0
+	.loc 1 1156 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
 	cmp	w4, 32
-	beq	.L448
-	.loc 1 1098 0
+	beq	.L451
+	.loc 1 1165 0
 	cmp	w4, 16
-	bne	.L401
+	bne	.L404
 .LBB1308:
 .LBB1309:
-	.loc 1 947 0
+	.loc 1 1014 0
 	adrp	x6, .LANCHOR0
-	.loc 1 953 0
+	.loc 1 1020 0
 	ldrb	w5, [x3, 48]
 	ldr	w4, [x3, 56]
-	.loc 1 947 0
+	.loc 1 1014 0
 	ldr	x11, [x6, #:lo12:.LANCHOR0]
-	.loc 1 954 0
+	.loc 1 1021 0
 	ldr	x3, [x3, 128]
-.LVL395:
-	.loc 1 953 0
+.LVL398:
+	.loc 1 1020 0
 	sub	w5, w5, w4
-.LVL396:
-	.loc 1 955 0
+.LVL399:
+	.loc 1 1022 0
 	add	x11, x11, 24
-	.loc 1 954 0
+	.loc 1 1021 0
 	lsl	w5, w5, 16
-.LVL397:
+.LVL400:
 	add	x5, x3, x5, sxtw
-.LVL398:
-	.loc 1 958 0
+.LVL401:
+	.loc 1 1025 0
 	ldr	w14, [x11, 88]
-	.loc 1 957 0
+	.loc 1 1024 0
 	ldr	w3, [x11, 84]
-	.loc 1 955 0
+	.loc 1 1022 0
 	ldr	w15, [x11, 156]
-.LVL399:
-	.loc 1 960 0
+.LVL402:
+	.loc 1 1027 0
 	cmp	w14, 0
-	.loc 1 957 0
+	.loc 1 1024 0
 	lsr	w13, w3, 3
-	.loc 1 960 0
-	ble	.L392
+	.loc 1 1027 0
+	ble	.L395
 	sub	w12, w13, #1
 	mov	w10, 0
-.LVL400:
+.LVL403:
 	add	x12, x12, 1
 	lsl	x16, x12, 3
 	lsl	x12, x12, 2
-	.loc 1 961 0
-	cbz	w15, .L413
-.LVL401:
-.L449:
-	.loc 1 962 0
+	.loc 1 1028 0
+	cbz	w15, .L416
+.LVL404:
+.L452:
+	.loc 1 1029 0
 	ldr	w7, [x11, 88]
-.LVL402:
+.LVL405:
 	sub	w7, w7, #1
 	sub	w7, w7, w10
 	mul	w7, w7, w3
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL403:
-.L414:
-	.loc 1 966 0
-	cbz	w13, .L415
+.LVL406:
+.L417:
+	.loc 1 1033 0
+	cbz	w13, .L418
 	add	x9, x1, x16
 	mov	x8, x2
 	.p2align 2
-.L416:
-	.loc 1 967 0
+.L419:
+	.loc 1 1034 0
 	ldr	w6, [x1], 8
-	.loc 1 968 0
+	.loc 1 1035 0
 	ldr	w3, [x8], 4
-	.loc 1 966 0
+	.loc 1 1033 0
 	cmp	x1, x9
-.LVL404:
-	.loc 1 972 0
+.LVL407:
+	.loc 1 1039 0
 	and	w4, w3, 255
-	.loc 1 975 0
+	.loc 1 1042 0
 	lsr	w22, w6, 8
-	.loc 1 981 0
+	.loc 1 1048 0
 	lsl	w17, w3, 4
-	.loc 1 979 0
+	.loc 1 1046 0
 	lsr	w21, w6, 16
-	.loc 1 977 0
+	.loc 1 1044 0
 	and	w18, w4, 240
 	and	w22, w22, 248
-	.loc 1 983 0
+	.loc 1 1050 0
 	lsr	w20, w6, 24
-	.loc 1 977 0
+	.loc 1 1044 0
 	add	w18, w22, w18, lsl 8
-	.loc 1 985 0
+	.loc 1 1052 0
 	and	w19, w3, 61440
-	.loc 1 981 0
+	.loc 1 1048 0
 	and	w21, w21, 248
-	.loc 1 985 0
+	.loc 1 1052 0
 	and	w20, w20, 248
-	.loc 1 973 0
+	.loc 1 1040 0
 	and	w6, w6, 248
-	.loc 1 981 0
+	.loc 1 1048 0
 	and	w17, w17, 61440
-	.loc 1 973 0
+	.loc 1 1040 0
 	ubfiz	w4, w4, 12, 4
-	.loc 1 981 0
+	.loc 1 1048 0
 	add	w17, w17, w21
-	.loc 1 973 0
+	.loc 1 1040 0
 	add	w4, w4, w6
-	.loc 1 985 0
+	.loc 1 1052 0
 	add	w19, w19, w20
-	.loc 1 977 0
+	.loc 1 1044 0
 	ldrb	w20, [x5, w18, sxtw]
-	.loc 1 1002 0
+	.loc 1 1069 0
 	lsr	w22, w3, 12
-	.loc 1 998 0
+	.loc 1 1065 0
 	lsr	w18, w3, 8
-	.loc 1 985 0
+	.loc 1 1052 0
 	ldrb	w21, [x5, w4, sxtw]
-	.loc 1 1006 0
+	.loc 1 1073 0
 	lsr	w4, w3, 16
-	.loc 1 981 0
+	.loc 1 1048 0
 	ldrb	w6, [x5, w17, sxtw]
-	.loc 1 977 0
+	.loc 1 1044 0
 	lsl	w20, w20, 2
-	.loc 1 985 0
+	.loc 1 1052 0
 	ldrb	w19, [x5, w19, sxtw]
-	.loc 1 1002 0
+	.loc 1 1069 0
 	and	w17, w22, 61440
-	.loc 1 994 0
+	.loc 1 1061 0
 	lsr	w3, w3, 4
-	.loc 1 998 0
+	.loc 1 1065 0
 	and	w18, w18, 61440
-	.loc 1 985 0
+	.loc 1 1052 0
 	orr	w6, w20, w6, lsl 4
-	.loc 1 994 0
+	.loc 1 1061 0
 	and	w3, w3, 61440
-	.loc 1 985 0
+	.loc 1 1052 0
 	orr	w19, w21, w19, lsl 6
 	orr	w6, w6, w19
-	.loc 1 987 0
+	.loc 1 1054 0
 	strb	w6, [x7], 2
-	.loc 1 1006 0
+	.loc 1 1073 0
 	and	w6, w4, 61440
-	.loc 1 989 0
+	.loc 1 1056 0
 	ldr	w4, [x1, -4]
-	.loc 1 994 0
+	.loc 1 1061 0
 	and	w21, w4, 248
-	.loc 1 1000 0
+	.loc 1 1067 0
 	lsr	w20, w4, 16
-	.loc 1 996 0
+	.loc 1 1063 0
 	lsr	w19, w4, 8
-	.loc 1 1002 0
+	.loc 1 1069 0
 	and	w20, w20, 248
-	.loc 1 1004 0
+	.loc 1 1071 0
 	lsr	w4, w4, 24
-	.loc 1 998 0
+	.loc 1 1065 0
 	and	w19, w19, 248
-	.loc 1 1002 0
+	.loc 1 1069 0
 	add	w17, w17, w20
-	.loc 1 1006 0
+	.loc 1 1073 0
 	and	w4, w4, 248
-	.loc 1 998 0
+	.loc 1 1065 0
 	add	w18, w18, w19
-	.loc 1 1006 0
+	.loc 1 1073 0
 	add	w4, w6, w4
-	.loc 1 994 0
+	.loc 1 1061 0
 	add	w3, w3, w21
-	.loc 1 1002 0
+	.loc 1 1069 0
 	ldrb	w17, [x5, w17, sxtw]
-	.loc 1 998 0
+	.loc 1 1065 0
 	ldrb	w6, [x5, w18, sxtw]
-	.loc 1 1006 0
+	.loc 1 1073 0
 	ldrb	w4, [x5, w4, sxtw]
 	ldrb	w18, [x5, w3, sxtw]
-	.loc 1 1002 0
+	.loc 1 1069 0
 	lsl	w3, w17, 4
-	.loc 1 1006 0
+	.loc 1 1073 0
 	orr	w3, w3, w6, lsl 2
 	orr	w4, w18, w4, lsl 6
 	orr	w3, w3, w4
-	.loc 1 1008 0
+	.loc 1 1075 0
 	strb	w3, [x7, -1]
-	.loc 1 966 0
-	bne	.L416
+	.loc 1 1033 0
+	bne	.L419
 	add	x2, x2, x12
-.L415:
-	.loc 1 960 0
+.L418:
+	.loc 1 1027 0
 	add	w10, w10, 1
 	cmp	w14, w10
-	beq	.L392
+	beq	.L395
 	ldr	w3, [x11, 84]
-	.loc 1 961 0
-	cbnz	w15, .L449
-.L413:
-	.loc 1 964 0
+	.loc 1 1028 0
+	cbnz	w15, .L452
+.L416:
+	.loc 1 1031 0
 	mul	w7, w10, w3
-.LVL405:
+.LVL408:
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL406:
-	b	.L414
-.LVL407:
-.L402:
+.LVL409:
+	b	.L417
+.LVL410:
+.L405:
 .LBE1309:
 .LBE1308:
 .LBB1310:
 .LBB1311:
-	.loc 1 871 0
+	.loc 1 938 0
 	adrp	x5, .LANCHOR0
-	.loc 1 877 0
+	.loc 1 944 0
 	ldrb	w7, [x3, 48]
 	ldr	w4, [x3, 56]
-	.loc 1 871 0
+	.loc 1 938 0
 	ldr	x15, [x5, #:lo12:.LANCHOR0]
-	.loc 1 878 0
+	.loc 1 945 0
 	ldr	x3, [x3, 128]
-.LVL408:
-	.loc 1 877 0
+.LVL411:
+	.loc 1 944 0
 	sub	w7, w7, w4
-.LVL409:
-	.loc 1 879 0
+.LVL412:
+	.loc 1 946 0
 	add	x15, x15, 24
-	.loc 1 878 0
+	.loc 1 945 0
 	lsl	w7, w7, 16
-.LVL410:
+.LVL413:
 	add	x7, x3, x7, sxtw
-.LVL411:
-	.loc 1 882 0
+.LVL414:
+	.loc 1 949 0
 	ldr	w16, [x15, 88]
-	.loc 1 881 0
+	.loc 1 948 0
 	ldr	w3, [x15, 84]
-	.loc 1 879 0
+	.loc 1 946 0
 	ldr	w17, [x15, 156]
-.LVL412:
-	.loc 1 887 0
+.LVL415:
+	.loc 1 954 0
 	cmp	w16, 0
-	.loc 1 881 0
+	.loc 1 948 0
 	lsr	w12, w3, 3
-.LVL413:
-	.loc 1 887 0
-	ble	.L392
+.LVL416:
+	.loc 1 954 0
+	ble	.L395
 	sub	w14, w12, #1
 	add	x14, x14, 1
 	lsl	x14, x14, 2
-	.loc 1 888 0
-	cbz	w17, .L408
-.LVL414:
-.L450:
-	.loc 1 889 0
+	.loc 1 955 0
+	cbz	w17, .L411
+.LVL417:
+.L453:
+	.loc 1 956 0
 	ldr	w10, [x15, 88]
-.LVL415:
+.LVL418:
 	sub	w10, w10, #1
 	sub	w10, w10, w13
 	mul	w10, w10, w3
 	lsr	w10, w10, 2
 	add	x10, x0, x10
-.LVL416:
-.L409:
-	.loc 1 893 0
-	cbz	w12, .L410
+.LVL419:
+.L412:
+	.loc 1 960 0
+	cbz	w12, .L413
 	mov	x5, 0
 	.p2align 2
-.L411:
-	.loc 1 895 0
+.L414:
+	.loc 1 962 0
 	ldr	w3, [x2, x5, lsl 2]
-	.loc 1 894 0
+	.loc 1 961 0
 	ldr	w4, [x1, x5, lsl 2]
 	add	x5, x5, 1
-.LVL417:
+.LVL420:
 .LBB1312:
 .LBB1313:
 	.loc 1 134 0
 	and	w9, w3, 65280
 .LBE1313:
 .LBE1312:
-	.loc 1 893 0
+	.loc 1 960 0
 	cmp	w12, w5
-.LVL418:
-	.loc 1 897 0
+.LVL421:
+	.loc 1 964 0
 	and	w6, w4, 65535
 .LBB1318:
 .LBB1314:
@@ -4943,9 +4979,9 @@ direct_mode_data_change:
 	add	w6, w8, w6, uxtb
 .LBE1314:
 .LBE1318:
-	.loc 1 898 0
+	.loc 1 965 0
 	lsr	w3, w3, 16
-.LVL419:
+.LVL422:
 	lsr	w4, w4, 16
 .LBB1319:
 .LBB1320:
@@ -4983,7 +5019,7 @@ direct_mode_data_change:
 	orr	w4, w11, w9, lsl 4
 .LBE1317:
 .LBE1328:
-	.loc 1 897 0
+	.loc 1 964 0
 	strb	w4, [x10], 2
 .LBB1329:
 .LBB1323:
@@ -4994,107 +5030,107 @@ direct_mode_data_change:
 	orr	w3, w4, w3, lsl 4
 .LBE1323:
 .LBE1329:
-	.loc 1 898 0
+	.loc 1 965 0
 	strb	w3, [x10, -1]
-	.loc 1 893 0
-	bgt	.L411
+	.loc 1 960 0
+	bgt	.L414
 	add	x1, x1, x14
 	add	x2, x2, x14
-.L410:
-	.loc 1 887 0
+.L413:
+	.loc 1 954 0
 	add	w13, w13, 1
 	cmp	w16, w13
-	beq	.L392
+	beq	.L395
 	ldr	w3, [x15, 84]
-	.loc 1 888 0
-	cbnz	w17, .L450
-.L408:
-	.loc 1 891 0
+	.loc 1 955 0
+	cbnz	w17, .L453
+.L411:
+	.loc 1 958 0
 	mul	w10, w13, w3
-.LVL420:
+.LVL423:
 	lsr	w10, w10, 2
 	add	x10, x0, x10
-.LVL421:
-	b	.L409
-.LVL422:
-.L448:
+.LVL424:
+	b	.L412
+.LVL425:
+.L451:
 .LBE1311:
 .LBE1310:
 .LBB1330:
 .LBB1331:
-	.loc 1 908 0
+	.loc 1 975 0
 	adrp	x5, .LANCHOR0
-	.loc 1 914 0
+	.loc 1 981 0
 	ldrb	w8, [x3, 48]
 	ldr	w4, [x3, 56]
-	.loc 1 908 0
+	.loc 1 975 0
 	ldr	x15, [x5, #:lo12:.LANCHOR0]
-	.loc 1 915 0
+	.loc 1 982 0
 	ldr	x3, [x3, 128]
-.LVL423:
-	.loc 1 914 0
+.LVL426:
+	.loc 1 981 0
 	sub	w8, w8, w4
-.LVL424:
-	.loc 1 916 0
+.LVL427:
+	.loc 1 983 0
 	add	x15, x15, 24
-	.loc 1 915 0
+	.loc 1 982 0
 	lsl	w8, w8, 16
-.LVL425:
+.LVL428:
 	add	x8, x3, x8, sxtw
-.LVL426:
-	.loc 1 921 0
+.LVL429:
+	.loc 1 988 0
 	ldr	w16, [x15, 88]
-	.loc 1 920 0
+	.loc 1 987 0
 	ldr	w3, [x15, 84]
-	.loc 1 916 0
+	.loc 1 983 0
 	ldr	w17, [x15, 156]
-.LVL427:
-	.loc 1 926 0
+.LVL430:
+	.loc 1 993 0
 	cmp	w16, 0
-	.loc 1 920 0
+	.loc 1 987 0
 	lsr	w12, w3, 2
-.LVL428:
-	.loc 1 926 0
-	ble	.L392
+.LVL431:
+	.loc 1 993 0
+	ble	.L395
 	sub	w14, w12, #1
 	mov	w13, 0
-.LVL429:
+.LVL432:
 	add	x14, x14, 1
 	lsl	x14, x14, 2
-	.loc 1 927 0
-	cbz	w17, .L397
-.LVL430:
-.L451:
-	.loc 1 928 0
+	.loc 1 994 0
+	cbz	w17, .L400
+.LVL433:
+.L454:
+	.loc 1 995 0
 	ldr	w11, [x15, 88]
-.LVL431:
+.LVL434:
 	sub	w11, w11, #1
 	sub	w11, w11, w13
 	mul	w11, w11, w3
 	lsr	w11, w11, 2
 	add	x11, x0, x11
-.LVL432:
-.L398:
-	.loc 1 932 0
-	cbz	w12, .L399
+.LVL435:
+.L401:
+	.loc 1 999 0
+	cbz	w12, .L402
 	mov	x4, 0
 	.p2align 2
-.L400:
-	.loc 1 934 0
+.L403:
+	.loc 1 1001 0
 	ldr	w5, [x2, x4, lsl 2]
-	.loc 1 933 0
+	.loc 1 1000 0
 	ldr	w3, [x1, x4, lsl 2]
-.LVL433:
+.LVL436:
 .LBB1332:
 .LBB1333:
 	.loc 1 140 0
 	and	w9, w5, 65280
 .LBE1333:
 .LBE1332:
-	.loc 1 937 0
+	.loc 1 1004 0
 	lsr	w7, w5, 16
-.LVL434:
-	.loc 1 936 0
+.LVL437:
+	.loc 1 1003 0
 	and	w6, w3, 65535
 .LBB1338:
 .LBB1339:
@@ -5102,7 +5138,7 @@ direct_mode_data_change:
 	ubfiz	w10, w7, 8, 8
 .LBE1339:
 .LBE1338:
-	.loc 1 937 0
+	.loc 1 1004 0
 	lsr	w3, w3, 16
 .LBB1344:
 .LBB1340:
@@ -5115,7 +5151,7 @@ direct_mode_data_change:
 .LBB1345:
 .LBB1334:
 	ubfiz	w5, w5, 8, 8
-.LVL435:
+.LVL438:
 .LBE1334:
 .LBE1345:
 .LBB1346:
@@ -5152,7 +5188,7 @@ direct_mode_data_change:
 	orr	w3, w9, w3, lsl 2
 .LBE1343:
 .LBE1350:
-	.loc 1 938 0
+	.loc 1 1005 0
 	ubfiz	w3, w3, 4, 8
 .LBB1351:
 .LBB1337:
@@ -5160,44 +5196,44 @@ direct_mode_data_change:
 	orr	w5, w5, w6, lsl 2
 .LBE1337:
 .LBE1351:
-	.loc 1 938 0
+	.loc 1 1005 0
 	orr	w3, w3, w5
 	strb	w3, [x11, x4]
 	add	x4, x4, 1
-	.loc 1 932 0
+	.loc 1 999 0
 	cmp	w12, w4
-	bgt	.L400
+	bgt	.L403
 	add	x1, x1, x14
 	add	x2, x2, x14
-.L399:
-	.loc 1 926 0
+.L402:
+	.loc 1 993 0
 	add	w13, w13, 1
 	cmp	w16, w13
-	beq	.L392
+	beq	.L395
 	ldr	w3, [x15, 84]
-	.loc 1 927 0
-	cbnz	w17, .L451
-.L397:
-	.loc 1 930 0
+	.loc 1 994 0
+	cbnz	w17, .L454
+.L400:
+	.loc 1 997 0
 	mul	w11, w13, w3
-.LVL436:
+.LVL439:
 	lsr	w11, w11, 2
 	add	x11, x0, x11
-.LVL437:
-	b	.L398
+.LVL440:
+	b	.L401
 .LBE1331:
 .LBE1330:
 	.cfi_endproc
-.LFE2821:
+.LFE2822:
 	.size	direct_mode_data_change, .-direct_mode_data_change
 	.align	2
 	.p2align 3,,7
 	.type	direct_mode_data_change_part, %function
 direct_mode_data_change_part:
-.LFB2827:
-	.loc 1 1391 0
+.LFB2828:
+	.loc 1 1458 0
 	.cfi_startproc
-.LVL438:
+.LVL441:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
@@ -5218,235 +5254,235 @@ direct_mode_data_change_part:
 	.cfi_offset 25, -32
 	.cfi_offset 26, -24
 	.cfi_offset 27, -16
-	.loc 1 1392 0
+	.loc 1 1459 0
 	ldr	x4, [x3, 224]
 	ldr	w4, [x4, 64]
 	cmp	w4, 32
-	beq	.L626
-	.loc 1 1395 0
+	beq	.L629
+	.loc 1 1462 0
 	cmp	w4, 16
-	beq	.L627
-.L469:
+	beq	.L630
+.L472:
 .LBB1378:
 .LBB1379:
-	.loc 1 1314 0
+	.loc 1 1381 0
 	adrp	x5, .LANCHOR0
-	.loc 1 1320 0
+	.loc 1 1387 0
 	ldrb	w6, [x3, 48]
 	ldr	w4, [x3, 56]
-	.loc 1 1314 0
+	.loc 1 1381 0
 	ldr	x11, [x5, #:lo12:.LANCHOR0]
-	.loc 1 1321 0
+	.loc 1 1388 0
 	ldr	x3, [x3, 128]
-.LVL439:
-	.loc 1 1320 0
+.LVL442:
+	.loc 1 1387 0
 	sub	w6, w6, w4
-.LVL440:
-	.loc 1 1322 0
+.LVL443:
+	.loc 1 1389 0
 	add	x11, x11, 24
-	.loc 1 1321 0
+	.loc 1 1388 0
 	lsl	w6, w6, 16
-.LVL441:
+.LVL444:
 	add	x6, x3, x6, sxtw
-.LVL442:
-	.loc 1 1325 0
+.LVL445:
+	.loc 1 1392 0
 	ldr	w14, [x11, 88]
-	.loc 1 1324 0
+	.loc 1 1391 0
 	ldr	w3, [x11, 84]
-	.loc 1 1322 0
+	.loc 1 1389 0
 	ldr	w15, [x11, 156]
-.LVL443:
-	.loc 1 1327 0
+.LVL446:
+	.loc 1 1394 0
 	cmp	w14, 0
-	.loc 1 1324 0
+	.loc 1 1391 0
 	lsr	w13, w3, 3
-	.loc 1 1327 0
-	ble	.L452
+	.loc 1 1394 0
+	ble	.L455
 	sub	w12, w13, #1
 	mov	w10, 0
-.LVL444:
+.LVL447:
 	add	x12, x12, 1
 	lsl	x16, x12, 2
 	lsl	x12, x12, 3
-	.loc 1 1328 0
-	cbz	w15, .L528
-.LVL445:
+	.loc 1 1395 0
+	cbz	w15, .L531
+.LVL448:
 	.p2align 2
-.L628:
-	.loc 1 1329 0
+.L631:
+	.loc 1 1396 0
 	ldr	w7, [x11, 88]
-.LVL446:
+.LVL449:
 	sub	w7, w7, #1
 	sub	w7, w7, w10
 	mul	w7, w7, w3
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL447:
-.L529:
-	.loc 1 1333 0
-	cbz	w13, .L530
+.LVL450:
+.L532:
+	.loc 1 1400 0
+	cbz	w13, .L533
 	add	x9, x1, x16
 	mov	x8, x2
 	.p2align 2
-.L541:
-	.loc 1 1335 0
+.L544:
+	.loc 1 1402 0
 	ldr	w5, [x8]
-	.loc 1 1340 0
+	.loc 1 1407 0
 	mov	w3, 0
-	.loc 1 1334 0
+	.loc 1 1401 0
 	ldr	w4, [x1], 4
-	.loc 1 1339 0
+	.loc 1 1406 0
 	ubfx	x17, x5, 4, 4
-.LVL448:
-	.loc 1 1338 0
+.LVL451:
+	.loc 1 1405 0
 	and	w18, w4, 15
-	.loc 1 1340 0
+	.loc 1 1407 0
 	cmp	w18, w17
-	beq	.L531
-	.loc 1 1341 0
+	beq	.L534
+	.loc 1 1408 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w3, [x6, w17, sxtw]
 	and	w3, w3, 3
-.L531:
-	.loc 1 1343 0
+.L534:
+	.loc 1 1410 0
 	ubfx	x18, x4, 4, 4
-	.loc 1 1344 0
+	.loc 1 1411 0
 	ubfx	x17, x5, 12, 4
-	.loc 1 1345 0
+	.loc 1 1412 0
 	cmp	w18, w17
-	beq	.L532
-	.loc 1 1346 0
+	beq	.L535
+	.loc 1 1413 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w17, [x6, w17, sxtw]
 	ubfiz	w17, w17, 2, 2
 	orr	w3, w3, w17
-.L532:
-	.loc 1 1348 0
+.L535:
+	.loc 1 1415 0
 	ubfx	x18, x4, 8, 4
-	.loc 1 1349 0
+	.loc 1 1416 0
 	ubfx	x17, x5, 20, 4
-	.loc 1 1350 0
+	.loc 1 1417 0
 	cmp	w18, w17
-	beq	.L624
-	.loc 1 1351 0
+	beq	.L627
+	.loc 1 1418 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w17, [x6, w17, sxtw]
 	ubfiz	w17, w17, 4, 2
 	orr	w3, w3, w17
-.L624:
-	.loc 1 1353 0
+.L627:
+	.loc 1 1420 0
 	ubfx	x17, x4, 12, 4
-	.loc 1 1354 0
+	.loc 1 1421 0
 	lsr	w5, w5, 28
-	.loc 1 1351 0
+	.loc 1 1418 0
 	and	w3, w3, 255
-	.loc 1 1355 0
+	.loc 1 1422 0
 	cmp	w17, w5
-	beq	.L535
-	.loc 1 1356 0
+	beq	.L538
+	.loc 1 1423 0
 	add	w5, w17, w5, lsl 8
 	ldrb	w5, [x6, w5, sxtw]
 	orr	w3, w3, w5, lsl 6
 	and	w3, w3, 255
-.L535:
+.L538:
 	add	x8, x8, 8
-	.loc 1 1358 0
+	.loc 1 1425 0
 	strb	w3, [x7]
-	.loc 1 1363 0
+	.loc 1 1430 0
 	ubfx	x18, x4, 16, 4
-	.loc 1 1365 0
+	.loc 1 1432 0
 	mov	w3, 0
-	.loc 1 1360 0
+	.loc 1 1427 0
 	ldr	w5, [x8, -4]
-	.loc 1 1364 0
+	.loc 1 1431 0
 	ubfx	x17, x5, 4, 4
-	.loc 1 1365 0
+	.loc 1 1432 0
 	cmp	w18, w17
-	beq	.L536
-	.loc 1 1366 0
+	beq	.L539
+	.loc 1 1433 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w3, [x6, w17, sxtw]
 	and	w3, w3, 3
-.L536:
-	.loc 1 1368 0
+.L539:
+	.loc 1 1435 0
 	ubfx	x18, x4, 20, 4
-	.loc 1 1369 0
+	.loc 1 1436 0
 	ubfx	x17, x5, 12, 4
-	.loc 1 1370 0
+	.loc 1 1437 0
 	cmp	w18, w17
-	beq	.L537
-	.loc 1 1371 0
+	beq	.L540
+	.loc 1 1438 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w17, [x6, w17, sxtw]
 	ubfiz	w17, w17, 2, 2
 	orr	w3, w3, w17
-.L537:
-	.loc 1 1373 0
+.L540:
+	.loc 1 1440 0
 	ubfx	x18, x4, 24, 4
-	.loc 1 1374 0
+	.loc 1 1441 0
 	ubfx	x17, x5, 20, 4
-	.loc 1 1375 0
+	.loc 1 1442 0
 	cmp	w18, w17
-	beq	.L625
-	.loc 1 1376 0
+	beq	.L628
+	.loc 1 1443 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w17, [x6, w17, sxtw]
 	ubfiz	w17, w17, 4, 2
 	orr	w3, w3, w17
-.L625:
-	.loc 1 1378 0
+.L628:
+	.loc 1 1445 0
 	lsr	w4, w4, 28
-.LVL449:
-	.loc 1 1379 0
+.LVL452:
+	.loc 1 1446 0
 	lsr	w5, w5, 28
-	.loc 1 1376 0
+	.loc 1 1443 0
 	and	w3, w3, 255
-	.loc 1 1380 0
+	.loc 1 1447 0
 	cmp	w4, w5
-	beq	.L540
-	.loc 1 1381 0
+	beq	.L543
+	.loc 1 1448 0
 	add	w4, w4, w5, lsl 8
 	ldrb	w4, [x6, w4, sxtw]
 	orr	w3, w3, w4, lsl 6
 	and	w3, w3, 255
-.L540:
+.L543:
 	add	x7, x7, 2
-	.loc 1 1383 0
+	.loc 1 1450 0
 	strb	w3, [x7, -1]
-	.loc 1 1333 0
+	.loc 1 1400 0
 	cmp	x1, x9
-	bne	.L541
+	bne	.L544
 	add	x2, x2, x12
-.L530:
-	.loc 1 1327 0
+.L533:
+	.loc 1 1394 0
 	add	w10, w10, 1
 	cmp	w14, w10
-	beq	.L452
+	beq	.L455
 	ldr	w3, [x11, 84]
-	.loc 1 1328 0
-	cbnz	w15, .L628
-.L528:
-	.loc 1 1331 0
+	.loc 1 1395 0
+	cbnz	w15, .L631
+.L531:
+	.loc 1 1398 0
 	mul	w7, w10, w3
-.LVL450:
+.LVL453:
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL451:
-	b	.L529
-.LVL452:
+.LVL454:
+	b	.L532
+.LVL455:
 	.p2align 3
-.L452:
+.L455:
 .LBE1379:
 .LBE1378:
-	.loc 1 1407 0
+	.loc 1 1474 0
 	ldp	x19, x20, [sp, 16]
-.LVL453:
+.LVL456:
 	ldp	x21, x22, [sp, 32]
-.LVL454:
+.LVL457:
 	ldp	x23, x24, [sp, 48]
-.LVL455:
+.LVL458:
 	ldp	x25, x26, [sp, 64]
-.LVL456:
+.LVL459:
 	ldr	x27, [sp, 80]
 	ldp	x29, x30, [sp], 96
 	.cfi_remember_state
@@ -5462,65 +5498,65 @@ direct_mode_data_change_part:
 	.cfi_restore 19
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
-.LVL457:
+.LVL460:
 	ret
-.LVL458:
-.L627:
+.LVL461:
+.L630:
 	.cfi_restore_state
-	.loc 1 1396 0
+	.loc 1 1463 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
 	cmp	w4, 16
-	bne	.L469
-	.loc 1 1397 0
+	bne	.L472
+	.loc 1 1464 0
 	ldr	w15, [x3, 88]
 .LBB1380:
 .LBB1381:
-	.loc 1 1151 0
+	.loc 1 1218 0
 	adrp	x5, .LANCHOR0
-.LVL459:
+.LVL462:
 .LBE1381:
 .LBE1380:
-	.loc 1 1397 0
-	cbz	w15, .L470
+	.loc 1 1464 0
+	cbz	w15, .L473
 .LBB1394:
 .LBB1392:
-	.loc 1 1151 0
+	.loc 1 1218 0
 	ldr	x12, [x5, #:lo12:.LANCHOR0]
-	.loc 1 1156 0
+	.loc 1 1223 0
 	ldrb	w9, [x3, 48]
 	ldr	w4, [x3, 56]
-	.loc 1 1158 0
+	.loc 1 1225 0
 	add	x12, x12, 24
-	.loc 1 1157 0
+	.loc 1 1224 0
 	ldr	x3, [x3, 128]
-.LVL460:
-	.loc 1 1156 0
+.LVL463:
+	.loc 1 1223 0
 	sub	w9, w9, w4
-.LVL461:
-	.loc 1 1161 0
+.LVL464:
+	.loc 1 1228 0
 	ldr	w13, [x12, 88]
-	.loc 1 1157 0
+	.loc 1 1224 0
 	lsl	w9, w9, 16
-.LVL462:
-	.loc 1 1158 0
+.LVL465:
+	.loc 1 1225 0
 	ldr	w14, [x12, 156]
-	.loc 1 1157 0
+	.loc 1 1224 0
 	add	x9, x3, x9, sxtw
-.LVL463:
-	.loc 1 1160 0
+.LVL466:
+	.loc 1 1227 0
 	ldr	w3, [x12, 84]
-.LVL464:
-	.loc 1 1166 0
+.LVL467:
+	.loc 1 1233 0
 	cmp	w13, 0
-	.loc 1 1160 0
+	.loc 1 1227 0
 	lsr	w11, w3, 4
-.LVL465:
-	.loc 1 1166 0
-	ble	.L452
+.LVL468:
+	.loc 1 1233 0
+	ble	.L455
 	sub	w16, w11, #1
 	mov	w15, 0
-.LVL466:
+.LVL469:
 	add	x16, x16, 1
 .LBB1382:
 .LBB1383:
@@ -5529,49 +5565,49 @@ direct_mode_data_change_part:
 	lsl	x16, x16, 3
 .LBE1383:
 .LBE1382:
-	.loc 1 1167 0
-	cbz	w14, .L471
-.LVL467:
-.L629:
-	.loc 1 1168 0
+	.loc 1 1234 0
+	cbz	w14, .L474
+.LVL470:
+.L632:
+	.loc 1 1235 0
 	ldr	w5, [x12, 88]
-.LVL468:
+.LVL471:
 	sub	w5, w5, #1
 	sub	w5, w5, w15
 	mul	w5, w5, w3
 	lsr	w5, w5, 2
 	add	x5, x0, x5
-.LVL469:
-.L472:
-	.loc 1 1172 0
-	cbz	w11, .L473
+.LVL472:
+.L475:
+	.loc 1 1239 0
+	cbz	w11, .L476
 	add	x5, x5, 4
-.LVL470:
+.LVL473:
 	mov	x8, 0
-.LVL471:
+.LVL474:
 	.p2align 2
-.L496:
-	.loc 1 1173 0
+.L499:
+	.loc 1 1240 0
 	ldr	x3, [x1, x8, lsl 3]
-	.loc 1 1174 0
+	.loc 1 1241 0
 	ldr	x4, [x2, x8, lsl 3]
-	.loc 1 1175 0
+	.loc 1 1242 0
 	cmp	x3, x4
-	beq	.L474
-	.loc 1 1176 0
+	beq	.L477
+	.loc 1 1243 0
 	and	w17, w4, 65535
 	and	w7, w3, 65535
-.LVL472:
+.LVL475:
 .LBB1385:
 .LBB1386:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
 	cmp	w17, w7
-	beq	.L475
+	beq	.L478
 	.loc 1 146 0
 	eor	w18, w17, w7
-.LVL473:
+.LVL476:
 	.loc 1 159 0
 	ubfiz	w30, w17, 8, 8
 	.loc 1 160 0
@@ -5609,13 +5645,13 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w6, w7, w6
 	and	w6, w6, 255
-.LVL474:
-.L475:
+.LVL477:
+.L478:
 .LBE1386:
 .LBE1385:
-	.loc 1 1176 0
+	.loc 1 1243 0
 	strb	w6, [x5, -4]
-	.loc 1 1177 0
+	.loc 1 1244 0
 	lsr	w17, w4, 16
 	lsr	w7, w3, 16
 .LBB1387:
@@ -5624,10 +5660,10 @@ direct_mode_data_change_part:
 	mov	w6, 0
 	.loc 1 148 0
 	cmp	w17, w7
-	beq	.L480
+	beq	.L483
 	.loc 1 146 0
 	eor	w18, w17, w7
-.LVL475:
+.LVL478:
 	.loc 1 159 0
 	ubfiz	w30, w17, 8, 8
 	.loc 1 160 0
@@ -5665,13 +5701,13 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w6, w7, w6
 	and	w6, w6, 255
-.LVL476:
-.L480:
+.LVL479:
+.L483:
 .LBE1388:
 .LBE1387:
-	.loc 1 1177 0
+	.loc 1 1244 0
 	strb	w6, [x5, -3]
-	.loc 1 1178 0
+	.loc 1 1245 0
 	ubfx	x17, x4, 32, 16
 	ubfx	x7, x3, 32, 16
 .LBB1389:
@@ -5680,10 +5716,10 @@ direct_mode_data_change_part:
 	mov	w6, 0
 	.loc 1 148 0
 	cmp	w17, w7
-	beq	.L485
+	beq	.L488
 	.loc 1 146 0
 	eor	w18, w17, w7
-.LVL477:
+.LVL480:
 	.loc 1 159 0
 	ubfiz	w30, w17, 8, 8
 	.loc 1 160 0
@@ -5721,27 +5757,27 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w6, w7, w6
 	and	w6, w6, 255
-.LVL478:
-.L485:
+.LVL481:
+.L488:
 .LBE1390:
 .LBE1389:
-	.loc 1 1178 0
+	.loc 1 1245 0
 	strb	w6, [x5, -2]
-	.loc 1 1179 0
+	.loc 1 1246 0
 	lsr	x4, x4, 48
-.LVL479:
+.LVL482:
 	lsr	x3, x3, 48
-.LVL480:
+.LVL483:
 .LBB1391:
 .LBB1384:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
 	cmp	w4, w3
-	beq	.L490
+	beq	.L493
 	.loc 1 146 0
 	eor	w7, w4, w3
-.LVL481:
+.LVL484:
 	.loc 1 159 0
 	ubfiz	w6, w4, 8, 8
 	.loc 1 160 0
@@ -5757,7 +5793,7 @@ direct_mode_data_change_part:
 	.loc 1 153 0
 	tst	w7, 240
 	orr	w18, w4, 12
-.LVL482:
+.LVL485:
 	.loc 1 159 0
 	ldrb	w17, [x9, w6, sxtw]
 	.loc 1 153 0
@@ -5780,314 +5816,314 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w4, w6, w4
 	and	w6, w4, 255
-.LVL483:
-.L490:
+.LVL486:
+.L493:
 .LBE1384:
 .LBE1391:
-	.loc 1 1179 0
+	.loc 1 1246 0
 	strb	w6, [x5, -1]
-.LVL484:
-.L495:
+.LVL487:
+.L498:
 	add	x8, x8, 1
 	add	x5, x5, 4
-	.loc 1 1172 0
+	.loc 1 1239 0
 	cmp	w11, w8
-	bgt	.L496
+	bgt	.L499
 	add	x1, x1, x16
-.LVL485:
+.LVL488:
 	add	x2, x2, x16
-.LVL486:
-.L473:
-	.loc 1 1166 0
+.LVL489:
+.L476:
+	.loc 1 1233 0
 	add	w15, w15, 1
 	cmp	w13, w15
-	beq	.L452
+	beq	.L455
 	ldr	w3, [x12, 84]
-.LVL487:
-	.loc 1 1167 0
-	cbnz	w14, .L629
-.L471:
-	.loc 1 1170 0
+.LVL490:
+	.loc 1 1234 0
+	cbnz	w14, .L632
+.L474:
+	.loc 1 1237 0
 	mul	w5, w15, w3
-.LVL488:
+.LVL491:
 	lsr	w5, w5, 2
 	add	x5, x0, x5
-.LVL489:
-	b	.L472
-.LVL490:
-.L626:
+.LVL492:
+	b	.L475
+.LVL493:
+.L629:
 .LBE1392:
 .LBE1394:
-	.loc 1 1393 0
+	.loc 1 1460 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
 	cmp	w4, 32
-	beq	.L630
-	.loc 1 1402 0
+	beq	.L633
+	.loc 1 1469 0
 	cmp	w4, 16
-	bne	.L469
+	bne	.L472
 .LBB1395:
 .LBB1396:
-	.loc 1 1236 0
+	.loc 1 1303 0
 	adrp	x5, .LANCHOR0
-	.loc 1 1242 0
+	.loc 1 1309 0
 	ldrb	w6, [x3, 48]
 	ldr	w4, [x3, 56]
-	.loc 1 1236 0
+	.loc 1 1303 0
 	ldr	x11, [x5, #:lo12:.LANCHOR0]
-	.loc 1 1243 0
+	.loc 1 1310 0
 	ldr	x3, [x3, 128]
-.LVL491:
-	.loc 1 1242 0
+.LVL494:
+	.loc 1 1309 0
 	sub	w6, w6, w4
-.LVL492:
-	.loc 1 1244 0
+.LVL495:
+	.loc 1 1311 0
 	add	x11, x11, 24
-	.loc 1 1243 0
+	.loc 1 1310 0
 	lsl	w6, w6, 16
-.LVL493:
+.LVL496:
 	add	x6, x3, x6, sxtw
-.LVL494:
-	.loc 1 1247 0
+.LVL497:
+	.loc 1 1314 0
 	ldr	w14, [x11, 88]
-	.loc 1 1246 0
+	.loc 1 1313 0
 	ldr	w3, [x11, 84]
-	.loc 1 1244 0
+	.loc 1 1311 0
 	ldr	w15, [x11, 156]
-.LVL495:
-	.loc 1 1249 0
+.LVL498:
+	.loc 1 1316 0
 	cmp	w14, 0
-	.loc 1 1246 0
+	.loc 1 1313 0
 	lsr	w13, w3, 3
-	.loc 1 1249 0
-	ble	.L452
+	.loc 1 1316 0
+	ble	.L455
 	sub	w12, w13, #1
 	mov	w10, 0
-.LVL496:
+.LVL499:
 	add	x12, x12, 1
 	lsl	x16, x12, 3
 	lsl	x12, x12, 2
-	.loc 1 1250 0
-	cbz	w15, .L515
-.LVL497:
-.L631:
-	.loc 1 1251 0
+	.loc 1 1317 0
+	cbz	w15, .L518
+.LVL500:
+.L634:
+	.loc 1 1318 0
 	ldr	w7, [x11, 88]
-.LVL498:
+.LVL501:
 	sub	w7, w7, #1
 	sub	w7, w7, w10
 	mul	w7, w7, w3
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL499:
-.L516:
-	.loc 1 1255 0
-	cbz	w13, .L517
+.LVL502:
+.L519:
+	.loc 1 1322 0
+	cbz	w13, .L520
 	add	x9, x1, x16
 	mov	x8, x2
 	.p2align 2
-.L526:
-	.loc 1 1257 0
+.L529:
+	.loc 1 1324 0
 	ldr	w3, [x8], 4
-	.loc 1 1258 0
+	.loc 1 1325 0
 	mov	w17, 0
-	.loc 1 1256 0
+	.loc 1 1323 0
 	ldr	w4, [x1]
-.LVL500:
-	.loc 1 1261 0
+.LVL503:
+	.loc 1 1328 0
 	and	w5, w3, 255
 	ubfiz	w18, w5, 4, 4
-	.loc 1 1260 0
+	.loc 1 1327 0
 	and	w30, w4, 248
-	.loc 1 1262 0
+	.loc 1 1329 0
 	cmp	w30, w18
-	beq	.L518
-	.loc 1 1263 0
+	beq	.L521
+	.loc 1 1330 0
 	add	w18, w30, w18, lsl 8
 	ldrb	w17, [x6, w18, sxtw]
-.L518:
-	.loc 1 1265 0
+.L521:
+	.loc 1 1332 0
 	lsr	w18, w4, 8
-	.loc 1 1266 0
+	.loc 1 1333 0
 	and	w5, w5, 240
-	.loc 1 1265 0
+	.loc 1 1332 0
 	and	w18, w18, 248
-	.loc 1 1267 0
+	.loc 1 1334 0
 	cmp	w18, w5
-	beq	.L519
-	.loc 1 1268 0
+	beq	.L522
+	.loc 1 1335 0
 	add	w5, w18, w5, lsl 8
 	ldrb	w5, [x6, w5, sxtw]
 	orr	w17, w17, w5, lsl 2
 	and	w17, w17, 255
-.L519:
-	.loc 1 1270 0
+.L522:
+	.loc 1 1337 0
 	lsr	w18, w4, 16
-	.loc 1 1271 0
+	.loc 1 1338 0
 	lsr	w5, w3, 4
-	.loc 1 1270 0
+	.loc 1 1337 0
 	and	w18, w18, 248
-	.loc 1 1271 0
+	.loc 1 1338 0
 	and	w5, w5, 240
-	.loc 1 1272 0
+	.loc 1 1339 0
 	cmp	w18, w5
-	beq	.L520
-	.loc 1 1273 0
+	beq	.L523
+	.loc 1 1340 0
 	add	w5, w18, w5, lsl 8
 	ldrb	w5, [x6, w5, sxtw]
 	orr	w17, w17, w5, lsl 4
 	and	w17, w17, 255
-.L520:
-	.loc 1 1275 0
+.L523:
+	.loc 1 1342 0
 	lsr	w4, w4, 24
-	.loc 1 1276 0
+	.loc 1 1343 0
 	lsr	w5, w3, 8
-	.loc 1 1275 0
+	.loc 1 1342 0
 	and	w4, w4, 248
-	.loc 1 1276 0
+	.loc 1 1343 0
 	and	w5, w5, 240
-	.loc 1 1277 0
+	.loc 1 1344 0
 	cmp	w4, w5
-	beq	.L521
-	.loc 1 1278 0
+	beq	.L524
+	.loc 1 1345 0
 	add	w4, w4, w5, lsl 8
 	ldrb	w4, [x6, w4, sxtw]
 	orr	w17, w17, w4, lsl 6
 	and	w17, w17, 255
-.L521:
+.L524:
 	add	x1, x1, 8
-	.loc 1 1280 0
+	.loc 1 1347 0
 	strb	w17, [x7]
-	.loc 1 1286 0
+	.loc 1 1353 0
 	lsr	w5, w3, 12
-	.loc 1 1283 0
+	.loc 1 1350 0
 	mov	w17, 0
-	.loc 1 1286 0
+	.loc 1 1353 0
 	and	w5, w5, 240
-	.loc 1 1282 0
+	.loc 1 1349 0
 	ldr	w4, [x1, -4]
-	.loc 1 1285 0
+	.loc 1 1352 0
 	and	w18, w4, 248
-	.loc 1 1287 0
+	.loc 1 1354 0
 	cmp	w18, w5
-	beq	.L522
-	.loc 1 1288 0
+	beq	.L525
+	.loc 1 1355 0
 	add	w5, w18, w5, lsl 8
 	ldrb	w17, [x6, w5, sxtw]
-.L522:
-	.loc 1 1290 0
+.L525:
+	.loc 1 1357 0
 	lsr	w18, w4, 8
-	.loc 1 1291 0
+	.loc 1 1358 0
 	lsr	w5, w3, 16
-	.loc 1 1290 0
+	.loc 1 1357 0
 	and	w18, w18, 248
-	.loc 1 1291 0
+	.loc 1 1358 0
 	and	w5, w5, 240
-	.loc 1 1292 0
+	.loc 1 1359 0
 	cmp	w18, w5
-	beq	.L523
-	.loc 1 1293 0
+	beq	.L526
+	.loc 1 1360 0
 	add	w5, w18, w5, lsl 8
 	ldrb	w5, [x6, w5, sxtw]
 	orr	w17, w17, w5, lsl 2
 	and	w17, w17, 255
-.L523:
-	.loc 1 1295 0
+.L526:
+	.loc 1 1362 0
 	lsr	w18, w4, 16
-	.loc 1 1296 0
+	.loc 1 1363 0
 	lsr	w5, w3, 20
-	.loc 1 1295 0
+	.loc 1 1362 0
 	and	w18, w18, 248
-	.loc 1 1296 0
+	.loc 1 1363 0
 	and	w5, w5, 240
-	.loc 1 1297 0
+	.loc 1 1364 0
 	cmp	w18, w5
-	beq	.L524
-	.loc 1 1298 0
+	beq	.L527
+	.loc 1 1365 0
 	add	w5, w18, w5, lsl 8
 	ldrb	w5, [x6, w5, sxtw]
 	orr	w17, w17, w5, lsl 4
 	and	w17, w17, 255
-.L524:
-	.loc 1 1300 0
+.L527:
+	.loc 1 1367 0
 	lsr	w4, w4, 24
-	.loc 1 1301 0
+	.loc 1 1368 0
 	lsr	w3, w3, 24
-	.loc 1 1300 0
+	.loc 1 1367 0
 	and	w4, w4, 248
-	.loc 1 1301 0
+	.loc 1 1368 0
 	and	w3, w3, 240
-	.loc 1 1302 0
+	.loc 1 1369 0
 	cmp	w4, w3
-	beq	.L525
-	.loc 1 1303 0
+	beq	.L528
+	.loc 1 1370 0
 	add	w3, w4, w3, lsl 8
 	ldrb	w3, [x6, w3, sxtw]
 	orr	w17, w17, w3, lsl 6
 	and	w17, w17, 255
-.L525:
+.L528:
 	add	x7, x7, 2
-	.loc 1 1305 0
+	.loc 1 1372 0
 	strb	w17, [x7, -1]
-	.loc 1 1255 0
+	.loc 1 1322 0
 	cmp	x1, x9
-	bne	.L526
+	bne	.L529
 	add	x2, x2, x12
-.L517:
-	.loc 1 1249 0
+.L520:
+	.loc 1 1316 0
 	add	w10, w10, 1
 	cmp	w14, w10
-	beq	.L452
+	beq	.L455
 	ldr	w3, [x11, 84]
-	.loc 1 1250 0
-	cbnz	w15, .L631
-.L515:
-	.loc 1 1253 0
+	.loc 1 1317 0
+	cbnz	w15, .L634
+.L518:
+	.loc 1 1320 0
 	mul	w7, w10, w3
-.LVL501:
+.LVL504:
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL502:
-	b	.L516
-.LVL503:
-.L470:
+.LVL505:
+	b	.L519
+.LVL506:
+.L473:
 .LBE1396:
 .LBE1395:
 .LBB1397:
 .LBB1398:
-	.loc 1 1110 0
+	.loc 1 1177 0
 	ldr	x17, [x5, #:lo12:.LANCHOR0]
-	.loc 1 1115 0
+	.loc 1 1182 0
 	ldrb	w12, [x3, 48]
 	ldr	w4, [x3, 56]
-	.loc 1 1117 0
+	.loc 1 1184 0
 	add	x17, x17, 24
-	.loc 1 1116 0
+	.loc 1 1183 0
 	ldr	x3, [x3, 128]
-.LVL504:
-	.loc 1 1115 0
+.LVL507:
+	.loc 1 1182 0
 	sub	w12, w12, w4
-.LVL505:
-	.loc 1 1120 0
+.LVL508:
+	.loc 1 1187 0
 	ldr	w18, [x17, 88]
-	.loc 1 1116 0
+	.loc 1 1183 0
 	lsl	w12, w12, 16
-.LVL506:
-	.loc 1 1117 0
+.LVL509:
+	.loc 1 1184 0
 	ldr	w30, [x17, 156]
-	.loc 1 1116 0
+	.loc 1 1183 0
 	add	x12, x3, x12, sxtw
-.LVL507:
-	.loc 1 1119 0
+.LVL510:
+	.loc 1 1186 0
 	ldr	w3, [x17, 84]
-.LVL508:
-	.loc 1 1125 0
+.LVL511:
+	.loc 1 1192 0
 	cmp	w18, 0
-	.loc 1 1119 0
+	.loc 1 1186 0
 	lsr	w13, w3, 3
-.LVL509:
-	.loc 1 1125 0
-	ble	.L452
+.LVL512:
+	.loc 1 1192 0
+	ble	.L455
 	sub	w16, w13, #1
 .LBB1399:
 .LBB1400:
@@ -6097,28 +6133,28 @@ direct_mode_data_change_part:
 	lsl	x16, x16, 2
 .LBE1400:
 .LBE1399:
-	.loc 1 1126 0
-	cbz	w30, .L498
-.LVL510:
-.L632:
-	.loc 1 1127 0
+	.loc 1 1193 0
+	cbz	w30, .L501
+.LVL513:
+.L635:
+	.loc 1 1194 0
 	ldr	w11, [x17, 88]
-.LVL511:
+.LVL514:
 	sub	w11, w11, #1
 	sub	w11, w11, w15
 	mul	w11, w11, w3
 	lsr	w11, w11, 2
 	add	x11, x0, x11
-.LVL512:
-.L499:
-	.loc 1 1131 0
-	cbz	w13, .L500
+.LVL515:
+.L502:
+	.loc 1 1198 0
+	cbz	w13, .L503
 	add	x11, x11, 2
-.LVL513:
+.LVL516:
 	mov	x9, 0
 	.p2align 2
-.L513:
-	.loc 1 1133 0
+.L516:
+	.loc 1 1200 0
 	ldr	w5, [x2, x9, lsl 2]
 .LBB1406:
 .LBB1407:
@@ -6126,7 +6162,7 @@ direct_mode_data_change_part:
 	mov	w4, 0
 .LBE1407:
 .LBE1406:
-	.loc 1 1132 0
+	.loc 1 1199 0
 	ldr	w22, [x1, x9, lsl 2]
 .LBB1412:
 .LBB1401:
@@ -6134,7 +6170,7 @@ direct_mode_data_change_part:
 	mov	w8, 0
 .LBE1401:
 .LBE1412:
-	.loc 1 1135 0
+	.loc 1 1202 0
 	and	w25, w5, 65535
 	and	w7, w22, 65535
 .LBB1413:
@@ -6144,7 +6180,7 @@ direct_mode_data_change_part:
 	add	w6, w3, w7, lsr 8
 .LBE1408:
 .LBE1413:
-	.loc 1 1136 0
+	.loc 1 1203 0
 	lsr	w3, w5, 16
 .LBB1414:
 .LBB1402:
@@ -6152,7 +6188,7 @@ direct_mode_data_change_part:
 	ubfiz	w21, w3, 8, 8
 .LBE1402:
 .LBE1414:
-	.loc 1 1136 0
+	.loc 1 1203 0
 	and	w3, w3, 65535
 	lsr	w10, w22, 16
 .LBB1415:
@@ -6184,14 +6220,14 @@ direct_mode_data_change_part:
 	add	w19, w19, w10, lsr 8
 .LBE1404:
 .LBE1418:
-	.loc 1 1134 0
+	.loc 1 1201 0
 	cmp	w22, w5
-	beq	.L501
+	beq	.L504
 .LBB1419:
 .LBB1411:
 	.loc 1 148 0
 	cmp	w25, w7
-	beq	.L502
+	beq	.L505
 	.loc 1 145 0
 	tst	x24, 15
 	.loc 1 160 0
@@ -6220,16 +6256,16 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w4, w5, w4
 	and	w4, w4, 255
-.L502:
+.L505:
 .LBE1411:
 .LBE1419:
-	.loc 1 1135 0
+	.loc 1 1202 0
 	strb	w4, [x11, -2]
 .LBB1420:
 .LBB1405:
 	.loc 1 148 0
 	cmp	w3, w10
-	beq	.L507
+	beq	.L510
 	.loc 1 145 0
 	tst	x20, 15
 	.loc 1 159 0
@@ -6258,99 +6294,99 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w3, w4, w3
 	and	w8, w3, 255
-.L507:
+.L510:
 .LBE1405:
 .LBE1420:
-	.loc 1 1136 0
+	.loc 1 1203 0
 	strb	w8, [x11, -1]
-.L512:
+.L515:
 	add	x9, x9, 1
 	add	x11, x11, 2
-	.loc 1 1131 0
+	.loc 1 1198 0
 	cmp	w13, w9
-	bgt	.L513
+	bgt	.L516
 	add	x1, x1, x16
 	add	x2, x2, x16
-.LVL514:
-.L500:
-	.loc 1 1125 0
+.LVL517:
+.L503:
+	.loc 1 1192 0
 	add	w15, w15, 1
 	cmp	w18, w15
-	beq	.L452
+	beq	.L455
 	ldr	w3, [x17, 84]
-	.loc 1 1126 0
-	cbnz	w30, .L632
-.L498:
-	.loc 1 1129 0
+	.loc 1 1193 0
+	cbnz	w30, .L635
+.L501:
+	.loc 1 1196 0
 	mul	w11, w15, w3
-.LVL515:
+.LVL518:
 	lsr	w11, w11, 2
 	add	x11, x0, x11
-.LVL516:
-	b	.L499
-.LVL517:
+.LVL519:
+	b	.L502
+.LVL520:
 	.p2align 3
-.L474:
+.L477:
 .LBE1398:
 .LBE1397:
 .LBB1422:
 .LBB1393:
-	.loc 1 1182 0
+	.loc 1 1249 0
 	str	wzr, [x5, -4]
-	b	.L495
-.LVL518:
+	b	.L498
+.LVL521:
 	.p2align 3
-.L501:
+.L504:
 .LBE1393:
 .LBE1422:
 .LBB1423:
 .LBB1421:
-	.loc 1 1139 0
+	.loc 1 1206 0
 	strh	wzr, [x11, -2]
-	b	.L512
-.LVL519:
-.L630:
+	b	.L515
+.LVL522:
+.L633:
 .LBE1421:
 .LBE1423:
 .LBB1424:
 .LBB1425:
-	.loc 1 1194 0
+	.loc 1 1261 0
 	adrp	x5, .LANCHOR0
-	.loc 1 1199 0
+	.loc 1 1266 0
 	ldrb	w15, [x3, 48]
 	ldr	w4, [x3, 56]
-	.loc 1 1194 0
+	.loc 1 1261 0
 	ldr	x21, [x5, #:lo12:.LANCHOR0]
-	.loc 1 1200 0
+	.loc 1 1267 0
 	ldr	x3, [x3, 128]
-.LVL520:
-	.loc 1 1199 0
+.LVL523:
+	.loc 1 1266 0
 	sub	w15, w15, w4
-.LVL521:
-	.loc 1 1201 0
+.LVL524:
+	.loc 1 1268 0
 	add	x21, x21, 24
-	.loc 1 1200 0
+	.loc 1 1267 0
 	lsl	w15, w15, 16
-.LVL522:
+.LVL525:
 	add	x15, x3, x15, sxtw
-.LVL523:
-	.loc 1 1206 0
+.LVL526:
+	.loc 1 1273 0
 	ldr	w22, [x21, 88]
-	.loc 1 1205 0
+	.loc 1 1272 0
 	ldr	w3, [x21, 84]
-	.loc 1 1201 0
+	.loc 1 1268 0
 	ldr	w23, [x21, 156]
-.LVL524:
-	.loc 1 1211 0
+.LVL527:
+	.loc 1 1278 0
 	cmp	w22, 0
-	.loc 1 1205 0
+	.loc 1 1272 0
 	lsr	w17, w3, 2
-.LVL525:
-	.loc 1 1211 0
-	ble	.L452
+.LVL528:
+	.loc 1 1278 0
+	ble	.L455
 	sub	w20, w17, #1
 	mov	w19, 0
-.LVL526:
+.LVL529:
 	add	x20, x20, 1
 .LBB1426:
 .LBB1427:
@@ -6359,32 +6395,32 @@ direct_mode_data_change_part:
 	lsl	x20, x20, 2
 .LBE1427:
 .LBE1426:
-	.loc 1 1212 0
-	cbz	w23, .L457
-.LVL527:
-.L635:
-	.loc 1 1213 0
+	.loc 1 1279 0
+	cbz	w23, .L460
+.LVL530:
+.L638:
+	.loc 1 1280 0
 	ldr	w16, [x21, 88]
-.LVL528:
+.LVL531:
 	sub	w16, w16, #1
 	sub	w16, w16, w19
 	mul	w16, w16, w3
 	lsr	w16, w16, 2
 	add	x16, x0, x16
-.LVL529:
-.L458:
-	.loc 1 1217 0
-	cbz	w17, .L459
+.LVL532:
+.L461:
+	.loc 1 1284 0
+	cbz	w17, .L462
 	mov	x11, 0
-	b	.L468
-.LVL530:
+	b	.L471
+.LVL533:
 	.p2align 3
-.L634:
+.L637:
 .LBB1433:
 .LBB1434:
 	.loc 1 170 0
 	cmp	w7, w5
-	beq	.L461
+	beq	.L464
 	.loc 1 177 0
 	ldrb	w4, [x15, w8, sxtw]
 	.loc 1 167 0
@@ -6395,20 +6431,20 @@ direct_mode_data_change_part:
 	orr	w12, w4, w12, lsl 2
 	.loc 1 167 0
 	csel	w4, w18, wzr, ne
-.LVL531:
+.LVL534:
 	.loc 1 175 0
 	orr	w5, w4, 12
 	tst	w30, 65280
 	csel	w4, w5, w4, ne
 	and	w12, w12, w4
-.L461:
+.L464:
 .LBE1434:
 .LBE1433:
 .LBB1438:
 .LBB1428:
 	.loc 1 170 0
 	cmp	w3, w13
-	beq	.L464
+	beq	.L467
 	.loc 1 167 0
 	cmp	w26, 0
 	.loc 1 178 0
@@ -6417,7 +6453,7 @@ direct_mode_data_change_part:
 	ldrb	w5, [x15, w14, sxtw]
 	.loc 1 167 0
 	csel	w4, w18, wzr, ne
-.LVL532:
+.LVL535:
 	.loc 1 175 0
 	orr	w6, w4, 12
 	tst	w25, 65280
@@ -6427,28 +6463,28 @@ direct_mode_data_change_part:
 	and	w3, w3, w4
 	lsl	w3, w3, 4
 	sxtb	w10, w3
-.LVL533:
-.L464:
+.LVL536:
+.L467:
 .LBE1428:
 .LBE1438:
-	.loc 1 1223 0
+	.loc 1 1290 0
 	orr	w3, w12, w10
 	strb	w3, [x16, x11]
 	add	x11, x11, 1
-	.loc 1 1217 0
+	.loc 1 1284 0
 	cmp	w17, w11
-	ble	.L633
-.L468:
-	.loc 1 1219 0
+	ble	.L636
+.L471:
+	.loc 1 1286 0
 	ldr	w4, [x2, x11, lsl 2]
-.LVL534:
+.LVL537:
 .LBB1439:
 .LBB1435:
 	.loc 1 170 0
 	mov	w12, 0
 .LBE1435:
 .LBE1439:
-	.loc 1 1218 0
+	.loc 1 1285 0
 	ldr	w6, [x1, x11, lsl 2]
 .LBB1440:
 .LBB1429:
@@ -6456,13 +6492,13 @@ direct_mode_data_change_part:
 	mov	w10, 0
 .LBE1429:
 .LBE1440:
-	.loc 1 1221 0
+	.loc 1 1288 0
 	and	w7, w4, 65535
-	.loc 1 1222 0
+	.loc 1 1289 0
 	lsr	w3, w4, 16
-	.loc 1 1221 0
+	.loc 1 1288 0
 	and	w5, w6, 65535
-	.loc 1 1222 0
+	.loc 1 1289 0
 	lsr	w13, w6, 16
 .LBB1441:
 .LBB1430:
@@ -6470,7 +6506,7 @@ direct_mode_data_change_part:
 	ubfiz	w14, w3, 8, 8
 .LBE1430:
 .LBE1441:
-	.loc 1 1222 0
+	.loc 1 1289 0
 	and	w3, w3, 65535
 .LBB1442:
 .LBB1436:
@@ -6510,90 +6546,90 @@ direct_mode_data_change_part:
 	and	w26, w25, 255
 .LBE1432:
 .LBE1445:
-	.loc 1 1220 0
+	.loc 1 1287 0
 	cmp	w6, w4
-	bne	.L634
-	.loc 1 1226 0
+	bne	.L637
+	.loc 1 1293 0
 	strb	wzr, [x16, x11]
 	add	x11, x11, 1
-	.loc 1 1217 0
+	.loc 1 1284 0
 	cmp	w17, w11
-	bgt	.L468
-.LVL535:
-.L633:
+	bgt	.L471
+.LVL538:
+.L636:
 	add	x1, x1, x20
 	add	x2, x2, x20
-.L459:
-	.loc 1 1211 0
+.L462:
+	.loc 1 1278 0
 	add	w19, w19, 1
 	cmp	w22, w19
-	beq	.L452
+	beq	.L455
 	ldr	w3, [x21, 84]
-	.loc 1 1212 0
-	cbnz	w23, .L635
-.L457:
-	.loc 1 1215 0
+	.loc 1 1279 0
+	cbnz	w23, .L638
+.L460:
+	.loc 1 1282 0
 	mul	w16, w19, w3
-.LVL536:
+.LVL539:
 	lsr	w16, w16, 2
 	add	x16, x0, x16
-.LVL537:
-	b	.L458
+.LVL540:
+	b	.L461
 .LBE1425:
 .LBE1424:
 	.cfi_endproc
-.LFE2827:
+.LFE2828:
 	.size	direct_mode_data_change_part, .-direct_mode_data_change_part
 	.align	2
 	.p2align 3,,7
 	.type	flip.isra.11, %function
 flip.isra.11:
-.LFB2878:
-	.loc 1 1409 0
+.LFB2879:
+	.loc 1 1476 0
 	.cfi_startproc
-.LVL538:
+.LVL541:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 1413 0
+	.loc 1 1480 0
 	sxtw	x2, w1
-	.loc 1 1409 0
+	.loc 1 1476 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 1409 0
+	.loc 1 1476 0
 	mov	x20, x0
-	.loc 1 1411 0
+	.loc 1 1478 0
 	ldr	w19, [x0, 72]
-	.loc 1 1413 0
+	.loc 1 1480 0
 	ldr	x0, [x0]
-.LVL539:
+.LVL542:
 .LBB1446:
 .LBB1447:
 .LBB1448:
 .LBB1449:
 	.file 10 "./include/linux/dma-mapping.h"
 	.loc 10 266 0
-	cbz	x0, .L639
+	cbz	x0, .L642
 	ldr	x3, [x0, 648]
 	.loc 10 268 0
 	adrp	x4, dummy_dma_ops
 	add	x4, x4, :lo12:dummy_dma_ops
 	cmp	x3, 0
 	csel	x3, x4, x3, eq
-.L637:
+.L640:
 .LBE1449:
 .LBE1448:
 	.loc 10 434 0
 	ldr	x5, [x3, 88]
 	sxtw	x19, w19
-	cbz	x5, .L638
+	cbz	x5, .L641
 .LBE1447:
 .LBE1446:
-	.loc 1 1413 0
+	.loc 1 1480 0
 	add	x4, x19, x19, lsl 1
 .LBB1455:
 .LBB1452:
@@ -6601,18 +6637,18 @@ flip.isra.11:
 	mov	w3, 1
 .LBE1452:
 .LBE1455:
-	.loc 1 1413 0
+	.loc 1 1480 0
 	add	x4, x20, x4, lsl 3
 .LBB1456:
 .LBB1453:
 	.loc 10 435 0
 	ldr	x1, [x4, 32]
 	blr	x5
-.LVL540:
-.L638:
+.LVL543:
+.L641:
 .LBE1453:
 .LBE1456:
-	.loc 1 1414 0
+	.loc 1 1481 0
 	ldr	x5, [x20, 8]
 .LBB1457:
 .LBB1458:
@@ -6625,7 +6661,7 @@ flip.isra.11:
 	mov	w1, 0
 .LBE1458:
 .LBE1457:
-	.loc 1 1415 0
+	.loc 1 1482 0
 	add	x19, x19, x19, lsl 1
 .LBB1461:
 .LBB1459:
@@ -6633,16 +6669,16 @@ flip.isra.11:
 	ldr	x5, [x5, 64]
 .LBE1459:
 .LBE1461:
-	.loc 1 1415 0
+	.loc 1 1482 0
 	add	x19, x20, x19, lsl 3
 .LBB1462:
 .LBB1460:
 	.loc 11 57 0
 	blr	x5
-.LVL541:
+.LVL544:
 .LBE1460:
 .LBE1462:
-	.loc 1 1415 0
+	.loc 1 1482 0
 	ldr	x1, [x20, 8]
 .LBB1463:
 .LBB1464:
@@ -6652,10 +6688,10 @@ flip.isra.11:
 	ldr	x3, [x1, 72]
 	ldr	w1, [x19, 32]
 	blr	x3
-.LVL542:
+.LVL545:
 .LBE1464:
 .LBE1463:
-	.loc 1 1416 0
+	.loc 1 1483 0
 	ldr	x2, [x20, 8]
 .LBB1465:
 .LBB1466:
@@ -6664,17 +6700,17 @@ flip.isra.11:
 	mov	x0, x2
 	ldr	x2, [x2, 96]
 	blr	x2
-.LVL543:
+.LVL546:
 .LBE1466:
 .LBE1465:
-	.loc 1 1417 0
+	.loc 1 1484 0
 	ldr	w1, [x20, 72]
 	mov	w0, 1
 	sub	w0, w0, w1
 	str	w0, [x20, 72]
-	.loc 1 1418 0
+	.loc 1 1485 0
 	ldp	x19, x20, [sp, 16]
-.LVL544:
+.LVL547:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -6683,9 +6719,9 @@ flip.isra.11:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL545:
+.LVL548:
 	.p2align 3
-.L639:
+.L642:
 	.cfi_restore_state
 .LBB1467:
 .LBB1454:
@@ -6694,22 +6730,22 @@ flip.isra.11:
 	.loc 10 268 0
 	adrp	x3, dummy_dma_ops
 	add	x3, x3, :lo12:dummy_dma_ops
-	b	.L637
+	b	.L640
 .LBE1450:
 .LBE1451:
 .LBE1454:
 .LBE1467:
 	.cfi_endproc
-.LFE2878:
+.LFE2879:
 	.size	flip.isra.11, .-flip.isra.11
 	.align	2
 	.p2align 3,,7
 	.type	ebc_frame_start, %function
 ebc_frame_start:
-.LFB2830:
-	.loc 1 1427 0
+.LFB2831:
+	.loc 1 1494 0
 	.cfi_startproc
-.LVL546:
+.LVL549:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
@@ -6719,58 +6755,58 @@ ebc_frame_start:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 1429 0
+	.loc 1 1496 0
 	add	x19, x0, 184
-	.loc 1 1427 0
+	.loc 1 1494 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 1427 0
+	.loc 1 1494 0
 	mov	x20, x0
-	.loc 1 1428 0
+	.loc 1 1495 0
 	add	x21, x0, 24
-	.loc 1 1434 0
+	.loc 1 1501 0
 	ldr	x1, [x19, 224]
 	ldr	w0, [x1, 40]
-.LVL547:
+.LVL550:
 	cmp	w0, 16
-	bgt	.L646
+	bgt	.L649
 	cmp	w0, 7
-	bge	.L647
-	cbz	w0, .L648
+	bge	.L650
+	cbz	w0, .L651
 	cmp	w0, 1
-	bne	.L645
-	.loc 1 1436 0
+	bne	.L648
+	.loc 1 1503 0
 	ldr	x0, [x19, 184]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
 	ldr	x3, [x19, 168]
 	bl	get_overlay_image
-.LVL548:
-	.loc 1 1441 0
+.LVL551:
+	.loc 1 1508 0
 	ldr	w0, [x19, 52]
-	cbz	w0, .L650
+	cbz	w0, .L653
 .LBB1468:
 .LBB1469:
-	.loc 1 1422 0
+	.loc 1 1489 0
 	str	wzr, [x21, 72]
-	.loc 1 1423 0
+	.loc 1 1490 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
-.LVL549:
+.LVL552:
 .LBE1469:
 .LBE1468:
-	.loc 1 1443 0
+	.loc 1 1510 0
 	ldp	x1, x2, [x19, 144]
 	mov	x4, x19
 	ldr	x3, [x19, 168]
 	ldr	x0, [x19, 192]
 	bl	get_overlay_image
-.LVL550:
-	.loc 1 1511 0
+.LVL553:
+	.loc 1 1578 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL551:
+.LVL554:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -6780,47 +6816,47 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL552:
+.LVL555:
 	.p2align 3
-.L646:
+.L649:
 	.cfi_restore_state
-	.loc 1 1434 0
+	.loc 1 1501 0
 	sub	w0, w0, #22
 	cmp	w0, 1
-	bhi	.L645
-.L648:
-	.loc 1 1456 0
+	bhi	.L648
+.L651:
+	.loc 1 1523 0
 	ldr	x0, [x19, 184]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
 	ldr	x3, [x19, 168]
 	bl	get_auto_image
-.LVL553:
-	.loc 1 1461 0
+.LVL556:
+	.loc 1 1528 0
 	ldr	w0, [x19, 52]
-	cbz	w0, .L652
+	cbz	w0, .L655
 .LBB1470:
 .LBB1471:
-	.loc 1 1422 0
+	.loc 1 1489 0
 	str	wzr, [x21, 72]
-	.loc 1 1423 0
+	.loc 1 1490 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
-.LVL554:
+.LVL557:
 .LBE1471:
 .LBE1470:
-	.loc 1 1463 0
+	.loc 1 1530 0
 	ldp	x1, x2, [x19, 144]
 	mov	x4, x19
 	ldr	x3, [x19, 168]
 	ldr	x0, [x19, 192]
 	bl	get_auto_image
-.LVL555:
-	.loc 1 1511 0
+.LVL558:
+	.loc 1 1578 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL556:
+.LVL559:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -6830,53 +6866,53 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL557:
+.LVL560:
 	.p2align 3
-.L645:
+.L648:
 	.cfi_restore_state
-	.loc 1 1499 0
+	.loc 1 1566 0
 	ldr	x2, [x19, 216]
-	.loc 1 1497 0
+	.loc 1 1564 0
 	mov	x3, x19
-	.loc 1 1496 0
+	.loc 1 1563 0
 	ldrb	w0, [x19, 48]
 	str	w0, [x19, 56]
-	.loc 1 1497 0
+	.loc 1 1564 0
 	ldr	x0, [x19, 184]
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change
-.LVL558:
+.LVL561:
 .LBB1472:
 .LBB1473:
-	.loc 1 1422 0
+	.loc 1 1489 0
 	str	wzr, [x21, 72]
-	.loc 1 1423 0
+	.loc 1 1490 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
-.LVL559:
+.LVL562:
 .LBE1473:
 .LBE1472:
-	.loc 1 1502 0
+	.loc 1 1569 0
 	ldr	w0, [x19, 56]
-	.loc 1 1503 0
+	.loc 1 1570 0
 	mov	x3, x19
-	.loc 1 1504 0
+	.loc 1 1571 0
 	ldp	x2, x1, [x19, 216]
-	.loc 1 1502 0
+	.loc 1 1569 0
 	sub	w0, w0, #1
 	str	w0, [x19, 56]
-	.loc 1 1503 0
+	.loc 1 1570 0
 	ldr	x0, [x19, 192]
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
-.LVL560:
-	.loc 1 1511 0
+.LVL563:
+	.loc 1 1578 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL561:
+.LVL564:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 30
@@ -6886,53 +6922,53 @@ ebc_frame_start:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL562:
+.LVL565:
 	.p2align 3
-.L647:
+.L650:
 	.cfi_restore_state
-	.loc 1 1486 0
+	.loc 1 1553 0
 	ldr	x2, [x19, 216]
-	.loc 1 1484 0
+	.loc 1 1551 0
 	mov	x3, x19
-	.loc 1 1483 0
+	.loc 1 1550 0
 	ldrb	w0, [x19, 48]
 	str	w0, [x19, 56]
-	.loc 1 1484 0
+	.loc 1 1551 0
 	ldr	x0, [x19, 184]
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change_part
-.LVL563:
+.LVL566:
 .LBB1474:
 .LBB1475:
-	.loc 1 1422 0
+	.loc 1 1489 0
 	str	wzr, [x21, 72]
-	.loc 1 1423 0
+	.loc 1 1490 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
-.LVL564:
+.LVL567:
 .LBE1475:
 .LBE1474:
-	.loc 1 1489 0
+	.loc 1 1556 0
 	ldr	w0, [x19, 56]
-	.loc 1 1490 0
+	.loc 1 1557 0
 	mov	x3, x19
-	.loc 1 1491 0
+	.loc 1 1558 0
 	ldp	x2, x1, [x19, 216]
-	.loc 1 1489 0
+	.loc 1 1556 0
 	sub	w0, w0, #1
 	str	w0, [x19, 56]
-	.loc 1 1490 0
+	.loc 1 1557 0
 	ldr	x0, [x19, 192]
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part
-.LVL565:
-	.loc 1 1511 0
+.LVL568:
+	.loc 1 1578 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL566:
+.LVL569:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -6942,23 +6978,23 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL567:
+.LVL570:
 	.p2align 3
-.L652:
+.L655:
 	.cfi_restore_state
-	.loc 1 1469 0
+	.loc 1 1536 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	adrp	x1, .LC21
 	add	x2, x2, :lo12:.LANCHOR3
 	add	x1, x1, :lo12:.LC21
 	bl	_dev_info
-.LVL568:
-	.loc 1 1470 0
+.LVL571:
+	.loc 1 1537 0
 	str	wzr, [x19, 44]
-	.loc 1 1511 0
+	.loc 1 1578 0
 	ldp	x19, x20, [sp, 16]
-.LVL569:
+.LVL572:
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -6969,23 +7005,23 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL570:
+.LVL573:
 	.p2align 3
-.L650:
+.L653:
 	.cfi_restore_state
-	.loc 1 1449 0
+	.loc 1 1516 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	adrp	x1, .LC20
 	add	x2, x2, :lo12:.LANCHOR3
 	add	x1, x1, :lo12:.LC20
 	bl	_dev_info
-.LVL571:
-	.loc 1 1450 0
+.LVL574:
+	.loc 1 1517 0
 	str	wzr, [x19, 44]
-	.loc 1 1511 0
+	.loc 1 1578 0
 	ldp	x19, x20, [sp, 16]
-.LVL572:
+.LVL575:
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	.cfi_restore 20
@@ -6996,16 +7032,16 @@ ebc_frame_start:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2830:
+.LFE2831:
 	.size	ebc_frame_start, .-ebc_frame_start
 	.align	2
 	.p2align 3,,7
 	.type	ebc_power_set.part.13, %function
 ebc_power_set.part.13:
-.LFB2880:
+.LFB2881:
 	.loc 1 183 0
 	.cfi_startproc
-.LVL573:
+.LVL576:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -7021,15 +7057,15 @@ ebc_power_set.part.13:
 	str	w1, [x0, 384]
 	.loc 1 201 0
 	ldr	x1, [x0, 8]
-.LVL574:
+.LVL577:
 .LBB1476:
 .LBB1477:
 	.loc 11 51 0
 	mov	x0, x1
-.LVL575:
+.LVL578:
 	ldr	x1, [x1, 56]
 	blr	x1
-.LVL576:
+.LVL579:
 .LBE1477:
 .LBE1476:
 	.loc 1 202 0
@@ -7041,21 +7077,21 @@ ebc_power_set.part.13:
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL577:
+.LVL580:
 .LBE1479:
 .LBE1478:
 	.loc 1 203 0
 	ldr	w0, [x19, 624]
-	cbnz	w0, .L663
+	cbnz	w0, .L666
 	.loc 1 207 0
 	ldr	x0, [x19]
 	adrp	x1, .LC22
 	add	x1, x1, :lo12:.LC22
 	bl	_dev_info
-.LVL578:
+.LVL581:
 	.loc 1 211 0
 	ldp	x19, x20, [sp, 16]
-.LVL579:
+.LVL582:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -7064,9 +7100,9 @@ ebc_power_set.part.13:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL580:
+.LVL583:
 	.p2align 3
-.L663:
+.L666:
 	.cfi_restore_state
 	.loc 1 204 0
 	str	wzr, [x19, 624]
@@ -7075,7 +7111,7 @@ ebc_power_set.part.13:
 	.loc 4 68 0
 	add	x0, x19, 416
 	bl	__pm_relax
-.LVL581:
+.LVL584:
 .LBE1481:
 .LBE1480:
 	.loc 1 207 0
@@ -7083,10 +7119,10 @@ ebc_power_set.part.13:
 	adrp	x1, .LC22
 	add	x1, x1, :lo12:.LC22
 	bl	_dev_info
-.LVL582:
+.LVL585:
 	.loc 1 211 0
 	ldp	x19, x20, [sp, 16]
-.LVL583:
+.LVL586:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -7095,16 +7131,16 @@ ebc_power_set.part.13:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2880:
+.LFE2881:
 	.size	ebc_power_set.part.13, .-ebc_power_set.part.13
 	.align	2
 	.p2align 3,,7
 	.type	ebc_suspend, %function
 ebc_suspend:
-.LFB2863:
-	.loc 1 3032 0
+.LFB2864:
+	.loc 1 3112 0
 	.cfi_startproc
-.LVL584:
+.LVL587:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -7120,17 +7156,17 @@ ebc_suspend:
 	ldr	x20, [x0, 184]
 .LBE1483:
 .LBE1482:
-	.loc 1 3036 0
+	.loc 1 3116 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 200]
-.LVL585:
+.LVL588:
 	cmp	w0, 1
-	beq	.L667
-.L665:
-	.loc 1 3040 0
+	beq	.L670
+.L668:
+	.loc 1 3120 0
 	mov	w0, 1
 	str	w0, [x19, 620]
-	.loc 1 3042 0
+	.loc 1 3122 0
 	ldr	x1, [x20, 16]
 .LBB1484:
 .LBB1485:
@@ -7138,16 +7174,16 @@ ebc_suspend:
 	mov	x0, x1
 	ldr	x1, [x1, 40]
 	blr	x1
-.LVL586:
+.LVL589:
 .LBE1485:
 .LBE1484:
-	.loc 1 3043 0
+	.loc 1 3123 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC24
 	add	x1, x1, :lo12:.LC24
 	bl	_dev_info
-.LVL587:
-	.loc 1 3046 0
+.LVL590:
+	.loc 1 3126 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -7159,9 +7195,9 @@ ebc_suspend:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L667:
+.L670:
 	.cfi_restore_state
-	.loc 1 3037 0
+	.loc 1 3117 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
@@ -7169,103 +7205,103 @@ ebc_suspend:
 	add	x2, x2, 16
 	add	x1, x1, :lo12:.LC23
 	bl	_dev_info
-.LVL588:
+.LVL591:
 .LBB1486:
 .LBB1487:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.13
-.LVL589:
-	b	.L665
+.LVL592:
+	b	.L668
 .LBE1487:
 .LBE1486:
 	.cfi_endproc
-.LFE2863:
+.LFE2864:
 	.size	ebc_suspend, .-ebc_suspend
 	.align	2
 	.p2align 3,,7
 	.type	check_black_percent.isra.15, %function
 check_black_percent.isra.15:
-.LFB2882:
-	.loc 1 1745 0
+.LFB2883:
+	.loc 1 1821 0
 	.cfi_startproc
-	.loc 1 1755 0
+	.loc 1 1831 0
 	cmp	w1, 32
 	lsl	w3, w2, 1
 	csel	w2, w3, w2, eq
-	.loc 1 1759 0
+	.loc 1 1835 0
 	mov	w1, 26215
 	movk	w1, 0x6666, lsl 16
-	.loc 1 1760 0
+	.loc 1 1836 0
 	cmp	w2, 0
 	add	w5, w2, 7
-	.loc 1 1759 0
+	.loc 1 1835 0
 	smull	x4, w2, w1
-	.loc 1 1760 0
+	.loc 1 1836 0
 	csel	w5, w5, w2, lt
 	asr	w5, w5, 3
 	cmp	w5, 0
-	.loc 1 1759 0
+	.loc 1 1835 0
 	asr	x4, x4, 34
 	sub	w4, w4, w2, asr 31
-.LVL590:
-	.loc 1 1760 0
-	ble	.L670
+.LVL593:
+	.loc 1 1836 0
+	ble	.L673
 	mov	x1, 0
 	mov	w2, 0
-.LVL591:
-	b	.L673
+.LVL594:
+	b	.L676
 	.p2align 3
-.L681:
+.L684:
 	cmp	w5, w1
-	ble	.L670
-.L673:
-	.loc 1 1762 0
+	ble	.L673
+.L676:
+	.loc 1 1838 0
 	ldr	x3, [x0, x1, lsl 3]
 	add	x1, x1, 1
-	.loc 1 1763 0
+	.loc 1 1839 0
 	cmp	x3, 0
 	cinc	w2, w2, ne
-	.loc 1 1764 0
+	.loc 1 1840 0
 	cmp	w4, w2, lsl 3
-	bge	.L681
-	.loc 1 1765 0
+	bge	.L684
+	.loc 1 1841 0
 	mov	w0, 0
 	ret
-.L670:
-	.loc 1 1745 0
+.L673:
+	.loc 1 1821 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1768 0
+	.loc 1 1844 0
 	adrp	x0, .LC25
 	add	x0, x0, :lo12:.LC25
-	.loc 1 1745 0
+	.loc 1 1821 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1768 0
+	.loc 1 1844 0
 	bl	printk
-.LVL592:
-	.loc 1 1770 0
+.LVL595:
+	.loc 1 1846 0
 	mov	w0, 1
-	.loc 1 1771 0
+	.loc 1 1847 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2882:
+.LFE2883:
 	.size	check_black_percent.isra.15, .-check_black_percent.isra.15
 	.align	2
 	.p2align 3,,7
 	.type	ebc_probe, %function
 ebc_probe:
-.LFB2861:
-	.loc 1 2896 0
+.LFB2862:
+	.loc 1 2976 0
 	.cfi_startproc
-.LVL593:
+.LVL596:
 	stp	x29, x30, [sp, -208]!
 	.cfi_def_cfa_offset 208
 	.cfi_offset 29, -208
@@ -7277,22 +7313,22 @@ ebc_probe:
 	movk	w2, 0x60, lsl 16
 .LBE1633:
 .LBE1632:
-	.loc 1 2896 0
+	.loc 1 2976 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 2897 0
+	.loc 1 2977 0
 	add	x22, x0, 16
-	.loc 1 2896 0
+	.loc 1 2976 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
-.LVL594:
+.LVL597:
 	stp	x25, x26, [sp, 64]
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 19, -192
@@ -7301,7 +7337,7 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 2896 0
+	.loc 1 2976 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
@@ -7311,138 +7347,138 @@ ebc_probe:
 	mov	x0, x22
 	mov	x1, 824
 	bl	devm_kmalloc
-.LVL595:
+.LVL598:
 .LBE1634:
 .LBE1635:
-	.loc 1 2912 0
-	cbz	x0, .L732
-	.loc 1 2916 0
+	.loc 1 2992 0
+	cbz	x0, .L735
+	.loc 1 2996 0
 	adrp	x24, .LANCHOR0
 	mov	x20, x0
-	.loc 1 2918 0
+	.loc 1 2998 0
 	adrp	x1, .LC26
 	mov	w2, 0
-	.loc 1 2916 0
+	.loc 1 2996 0
 	str	x0, [x24, #:lo12:.LANCHOR0]
-	.loc 1 2918 0
+	.loc 1 2998 0
 	add	x1, x1, :lo12:.LC26
 	ldr	x0, [x22, 752]
-	.loc 1 2915 0
+	.loc 1 2995 0
 	str	x22, [x20]
-	.loc 1 2918 0
+	.loc 1 2998 0
 	bl	of_parse_phandle
-.LVL596:
-	.loc 1 2919 0
-	cbz	x0, .L768
-	.loc 1 2924 0
+.LVL599:
+	.loc 1 2999 0
+	cbz	x0, .L771
+	.loc 1 3004 0
 	bl	of_find_device_by_node
-.LVL597:
-	.loc 1 2926 0
-	cbz	x0, .L686
+.LVL600:
+	.loc 1 3006 0
+	cbz	x0, .L689
 .LBB1636:
 .LBB1637:
 .LBB1638:
 	.loc 2 1181 0
 	ldr	x0, [x0, 200]
-.LVL598:
+.LVL601:
 .LBE1638:
 .LBE1637:
 .LBE1636:
-	.loc 1 2929 0
+	.loc 1 3009 0
 	str	x0, [x20, 8]
-	.loc 1 2930 0
-	cbz	x0, .L686
-	.loc 1 2932 0
+	.loc 1 3010 0
+	cbz	x0, .L689
+	.loc 1 3012 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 2934 0
+	.loc 1 3014 0
 	add	x2, x29, 96
 	adrp	x1, .LC28
 	add	x1, x1, :lo12:.LC28
 	ldr	x0, [x22, 752]
 	bl	of_get_property
-.LVL599:
+.LVL602:
 	mov	x21, x0
-.LVL600:
-	.loc 1 2935 0
+.LVL603:
+	.loc 1 3015 0
 	ldrsw	x0, [x29, 96]
-.LVL601:
+.LVL604:
 	lsr	x0, x0, 2
-.LVL602:
+.LVL605:
 	str	w0, [x29, 96]
-.LVL603:
-	.loc 1 2936 0
+.LVL606:
+	.loc 1 3016 0
 	cmp	w0, 0
-	beq	.L687
-	.loc 1 2941 0 discriminator 1
+	beq	.L690
+	.loc 1 3021 0 discriminator 1
 	mov	w19, 0
-.LVL604:
-	bgt	.L755
-	b	.L689
+.LVL607:
+	bgt	.L758
+	b	.L692
 	.p2align 3
-.L690:
-	.loc 1 2949 0
+.L693:
+	.loc 1 3029 0
 	bl	of_find_i2c_device_by_node
-.LVL605:
-	.loc 1 2951 0
-	cbz	x0, .L769
+.LVL608:
+	.loc 1 3031 0
+	cbz	x0, .L772
 .LBB1639:
 .LBB1640:
 .LBB1641:
 	.loc 2 1181 0
 	ldr	x0, [x0, 216]
-.LVL606:
+.LVL609:
 .LBE1641:
 .LBE1640:
 .LBE1639:
-	.loc 1 2956 0
+	.loc 1 3036 0
 	str	x0, [x20, 16]
-	.loc 1 2957 0
-	cbnz	x0, .L770
-	.loc 1 2941 0 discriminator 2
+	.loc 1 3037 0
+	cbnz	x0, .L773
+	.loc 1 3021 0 discriminator 2
 	ldr	w0, [x29, 96]
 	add	w19, w19, 1
-.LVL607:
+.LVL610:
 	cmp	w0, w19
-	ble	.L694
-.L755:
+	ble	.L697
+.L758:
 	ldr	w0, [x21], 4
-	.loc 1 2943 0
+	.loc 1 3023 0
 	rev	w0, w0
 	bl	of_find_node_by_phandle
-.LVL608:
-	.loc 1 2944 0
-	cbnz	x0, .L690
-	.loc 1 2945 0
+.LVL611:
+	.loc 1 3024 0
+	cbnz	x0, .L693
+	.loc 1 3025 0
 	adrp	x1, .LC30
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC30
-	.loc 1 2946 0
+	.loc 1 3026 0
 	mov	w25, -19
-	.loc 1 2945 0
+	.loc 1 3025 0
 	bl	_dev_err
-.LVL609:
+.LVL612:
 	.p2align 2
-.L682:
-	.loc 1 3022 0
+.L685:
+	.loc 1 3102 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w25
-.LVL610:
+.LVL613:
 	ldr	x2, [x29, 200]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L771
+	cbnz	x1, .L774
 	ldp	x19, x20, [sp, 16]
-.LVL611:
+.LVL614:
 	ldp	x21, x22, [sp, 32]
-.LVL612:
+.LVL615:
 	ldp	x23, x24, [sp, 48]
-.LVL613:
+.LVL616:
 	ldp	x25, x26, [sp, 64]
-.LVL614:
+.LVL617:
 	ldp	x27, x28, [sp, 80]
-.LVL615:
+.LVL618:
 	ldp	x29, x30, [sp], 208
 	.cfi_remember_state
 	.cfi_restore 30
@@ -7459,28 +7495,28 @@ ebc_probe:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL616:
+.LVL619:
 	.p2align 3
-.L770:
+.L773:
 	.cfi_restore_state
-	.loc 1 2958 0
+	.loc 1 3038 0
 	adrp	x1, .LC32
 	mov	w2, w19
 	add	x1, x1, :lo12:.LC32
 	mov	x0, x22
 	bl	_dev_info
-.LVL617:
-.L689:
-	.loc 1 2963 0
+.LVL620:
+.L692:
+	.loc 1 3043 0
 	ldr	x0, [x20, 16]
-	cbz	x0, .L694
-	.loc 1 2969 0
+	cbz	x0, .L697
+	.loc 1 3049 0
 	add	x19, x20, 184
-.LVL618:
-	.loc 1 2971 0
+.LVL621:
+	.loc 1 3051 0
 	add	x21, x20, 24
-.LVL619:
-	.loc 1 2969 0
+.LVL622:
+	.loc 1 3049 0
 	str	x22, [x19, 104]
 .LBB1642:
 .LBB1643:
@@ -7495,7 +7531,7 @@ ebc_probe:
 .LBE1644:
 .LBE1643:
 .LBE1642:
-	.loc 1 2971 0
+	.loc 1 3051 0
 	str	x22, [x20, 24]
 .LBB1716:
 .LBB1713:
@@ -7509,7 +7545,7 @@ ebc_probe:
 .LBE1653:
 .LBE1713:
 .LBE1716:
-	.loc 1 2972 0
+	.loc 1 3052 0
 	ldr	x2, [x20, 8]
 .LBB1717:
 .LBB1714:
@@ -7523,7 +7559,7 @@ ebc_probe:
 .LBE1654:
 .LBE1714:
 .LBE1717:
-	.loc 1 2973 0
+	.loc 1 3053 0
 	stp	x2, x0, [x21, 8]
 .LBB1718:
 .LBB1715:
@@ -7535,9 +7571,9 @@ ebc_probe:
 	ldr	x0, [x22, 752]
 	add	x2, x20, 100
 	bl	of_property_read_variable_u32_array
-.LVL620:
+.LVL623:
 	.loc 12 501 0
-	tbnz	w0, #31, .L696
+	tbnz	w0, #31, .L699
 .LBE1649:
 .LBE1652:
 .LBE1655:
@@ -7552,9 +7588,9 @@ ebc_probe:
 	add	x2, x20, 104
 	add	x1, x1, :lo12:.LC58
 	bl	of_property_read_variable_u32_array
-.LVL621:
+.LVL624:
 	.loc 12 501 0
-	tbnz	w0, #31, .L696
+	tbnz	w0, #31, .L699
 .LBE1658:
 .LBE1657:
 .LBE1656:
@@ -7569,9 +7605,9 @@ ebc_probe:
 	add	x2, x20, 108
 	add	x1, x1, :lo12:.LC59
 	bl	of_property_read_variable_u32_array
-.LVL622:
+.LVL625:
 	.loc 12 501 0
-	tbnz	w0, #31, .L696
+	tbnz	w0, #31, .L699
 .LBE1661:
 .LBE1660:
 .LBE1659:
@@ -7586,9 +7622,9 @@ ebc_probe:
 	add	x2, x20, 112
 	add	x1, x1, :lo12:.LC60
 	bl	of_property_read_variable_u32_array
-.LVL623:
+.LVL626:
 	.loc 12 501 0
-	tbnz	w0, #31, .L696
+	tbnz	w0, #31, .L699
 .LBE1664:
 .LBE1663:
 .LBE1662:
@@ -7603,9 +7639,9 @@ ebc_probe:
 	add	x2, x20, 128
 	add	x1, x1, :lo12:.LC61
 	bl	of_property_read_variable_u32_array
-.LVL624:
+.LVL627:
 	.loc 12 501 0
-	tbnz	w0, #31, .L696
+	tbnz	w0, #31, .L699
 .LBE1667:
 .LBE1666:
 .LBE1665:
@@ -7620,9 +7656,9 @@ ebc_probe:
 	add	x2, x20, 132
 	add	x1, x1, :lo12:.LC62
 	bl	of_property_read_variable_u32_array
-.LVL625:
+.LVL628:
 	.loc 12 501 0
-	tbnz	w0, #31, .L696
+	tbnz	w0, #31, .L699
 .LBE1670:
 .LBE1669:
 .LBE1668:
@@ -7637,9 +7673,9 @@ ebc_probe:
 	add	x2, x20, 136
 	add	x1, x1, :lo12:.LC63
 	bl	of_property_read_variable_u32_array
-.LVL626:
+.LVL629:
 	.loc 12 501 0
-	tbnz	w0, #31, .L696
+	tbnz	w0, #31, .L699
 .LBE1673:
 .LBE1672:
 .LBE1671:
@@ -7654,9 +7690,9 @@ ebc_probe:
 	add	x2, x20, 140
 	add	x1, x1, :lo12:.LC64
 	bl	of_property_read_variable_u32_array
-.LVL627:
+.LVL630:
 	.loc 12 501 0
-	tbnz	w0, #31, .L696
+	tbnz	w0, #31, .L699
 .LBE1676:
 .LBE1675:
 .LBE1674:
@@ -7671,9 +7707,9 @@ ebc_probe:
 	add	x2, x20, 144
 	add	x1, x1, :lo12:.LC65
 	bl	of_property_read_variable_u32_array
-.LVL628:
+.LVL631:
 	.loc 12 501 0
-	tbnz	w0, #31, .L696
+	tbnz	w0, #31, .L699
 .LBE1679:
 .LBE1678:
 .LBE1677:
@@ -7688,9 +7724,9 @@ ebc_probe:
 	add	x2, x20, 148
 	add	x1, x1, :lo12:.LC66
 	bl	of_property_read_variable_u32_array
-.LVL629:
+.LVL632:
 	.loc 12 501 0
-	tbnz	w0, #31, .L696
+	tbnz	w0, #31, .L699
 .LBE1682:
 .LBE1681:
 .LBE1680:
@@ -7705,9 +7741,9 @@ ebc_probe:
 	add	x2, x20, 152
 	add	x1, x1, :lo12:.LC67
 	bl	of_property_read_variable_u32_array
-.LVL630:
+.LVL633:
 	.loc 12 501 0
-	tbnz	w0, #31, .L696
+	tbnz	w0, #31, .L699
 .LBE1685:
 .LBE1684:
 .LBE1683:
@@ -7722,9 +7758,9 @@ ebc_probe:
 	add	x2, x20, 156
 	add	x1, x1, :lo12:.LC68
 	bl	of_property_read_variable_u32_array
-.LVL631:
+.LVL634:
 	.loc 12 501 0
-	tbnz	w0, #31, .L696
+	tbnz	w0, #31, .L699
 .LBE1688:
 .LBE1687:
 .LBE1686:
@@ -7739,9 +7775,9 @@ ebc_probe:
 	add	x2, x20, 160
 	add	x1, x1, :lo12:.LC69
 	bl	of_property_read_variable_u32_array
-.LVL632:
+.LVL635:
 	.loc 12 501 0
-	tbnz	w0, #31, .L696
+	tbnz	w0, #31, .L699
 .LBE1691:
 .LBE1690:
 .LBE1689:
@@ -7756,9 +7792,9 @@ ebc_probe:
 	add	x2, x20, 164
 	add	x1, x1, :lo12:.LC70
 	bl	of_property_read_variable_u32_array
-.LVL633:
+.LVL636:
 	.loc 12 501 0
-	tbnz	w0, #31, .L696
+	tbnz	w0, #31, .L699
 .LBE1694:
 .LBE1693:
 .LBE1692:
@@ -7773,9 +7809,9 @@ ebc_probe:
 	add	x2, x20, 168
 	add	x1, x1, :lo12:.LC71
 	bl	of_property_read_variable_u32_array
-.LVL634:
+.LVL637:
 	.loc 12 501 0
-	tbnz	w0, #31, .L696
+	tbnz	w0, #31, .L699
 .LBE1697:
 .LBE1696:
 .LBE1695:
@@ -7790,15 +7826,15 @@ ebc_probe:
 	add	x2, x20, 172
 	add	x1, x1, :lo12:.LC72
 	bl	of_property_read_variable_u32_array
-.LVL635:
+.LVL638:
 	.loc 12 501 0
-	tbz	w0, #31, .L722
+	tbz	w0, #31, .L725
 .LBE1700:
 .LBE1699:
 .LBE1698:
-	.loc 1 2240 0
+	.loc 1 2320 0
 	str	wzr, [x21, 148]
-.L722:
+.L725:
 .LBB1701:
 .LBB1702:
 .LBB1703:
@@ -7810,15 +7846,15 @@ ebc_probe:
 	add	x2, x20, 176
 	add	x1, x1, :lo12:.LC35
 	bl	of_property_read_variable_u32_array
-.LVL636:
+.LVL639:
 	.loc 12 501 0
-	tbz	w0, #31, .L723
+	tbz	w0, #31, .L726
 .LBE1703:
 .LBE1702:
 .LBE1701:
-	.loc 1 2243 0
+	.loc 1 2323 0
 	str	wzr, [x21, 152]
-.L723:
+.L726:
 .LBB1704:
 .LBB1705:
 .LBB1706:
@@ -7830,15 +7866,15 @@ ebc_probe:
 	add	x2, x20, 180
 	add	x1, x1, :lo12:.LC36
 	bl	of_property_read_variable_u32_array
-.LVL637:
+.LVL640:
 	.loc 12 501 0
-	tbz	w0, #31, .L724
+	tbz	w0, #31, .L727
 .LBE1706:
 .LBE1705:
 .LBE1704:
-	.loc 1 2246 0
+	.loc 1 2326 0
 	str	wzr, [x21, 156]
-.L724:
+.L727:
 .LBB1707:
 .LBB1708:
 .LBB1709:
@@ -7850,15 +7886,15 @@ ebc_probe:
 	add	x2, x20, 116
 	add	x1, x1, :lo12:.LC37
 	bl	of_property_read_variable_u32_array
-.LVL638:
+.LVL641:
 	.loc 12 501 0
-	tbz	w0, #31, .L725
+	tbz	w0, #31, .L728
 .LBE1709:
 .LBE1708:
 .LBE1707:
-	.loc 1 2249 0
+	.loc 1 2329 0
 	str	wzr, [x21, 92]
-.L725:
+.L728:
 .LBB1710:
 .LBB1711:
 .LBB1712:
@@ -7870,68 +7906,68 @@ ebc_probe:
 	add	x2, x20, 120
 	add	x1, x1, :lo12:.LC38
 	bl	of_property_read_variable_u32_array
-.LVL639:
+.LVL642:
 	.loc 12 501 0
-	tbz	w0, #31, .L726
+	tbz	w0, #31, .L729
 .LBE1712:
 .LBE1711:
 .LBE1710:
-	.loc 1 2252 0
+	.loc 1 2332 0
 	str	wzr, [x21, 96]
-.L726:
+.L729:
 .LBE1715:
 .LBE1718:
-	.loc 1 2981 0
+	.loc 1 3061 0
 	ldr	w0, [x21, 88]
 .LBB1719:
 .LBB1720:
-	.loc 1 2704 0
+	.loc 1 2784 0
 	mov	w2, 0
 .LBE1720:
 .LBE1719:
-	.loc 1 2981 0
+	.loc 1 3061 0
 	str	w0, [x19, 68]
-	.loc 1 2982 0
+	.loc 1 3062 0
 	ldr	w1, [x21, 84]
 	str	w1, [x19, 72]
-	.loc 1 2985 0
+	.loc 1 3065 0
 	tst	x1, 15
-	.loc 1 2983 0
+	.loc 1 3063 0
 	mul	w0, w0, w1
-	.loc 1 2985 0
+	.loc 1 3065 0
 	cset	w1, eq
 	str	w1, [x19, 88]
 .LBB1734:
 .LBB1729:
-	.loc 1 2704 0
+	.loc 1 2784 0
 	adrp	x1, .LC39
 	add	x1, x1, :lo12:.LC39
 .LBE1729:
 .LBE1734:
-	.loc 1 2983 0
+	.loc 1 3063 0
 	lsr	w3, w0, 1
-	.loc 1 2984 0
+	.loc 1 3064 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x19, 20]
 .LBB1735:
 .LBB1730:
-	.loc 1 2695 0
+	.loc 1 2775 0
 	ldr	x26, [x20]
-.LVL640:
-	.loc 1 2704 0
+.LVL643:
+	.loc 1 2784 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL641:
-	.loc 1 2705 0
-	cbz	x0, .L733
-	.loc 1 2708 0
+.LVL644:
+	.loc 1 2785 0
+	cbz	x0, .L736
+	.loc 1 2788 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL642:
+.LVL645:
 	mov	w25, w0
-	.loc 1 2710 0
-	cbnz	w0, .L772
+	.loc 1 2790 0
+	cbnz	w0, .L775
 .LBB1721:
 .LBB1722:
 	.file 13 "./include/linux/ioport.h"
@@ -7939,9 +7975,9 @@ ebc_probe:
 	ldp	x1, x2, [x29, 104]
 .LBE1722:
 .LBE1721:
-	.loc 1 2715 0
+	.loc 1 2795 0
 	str	x1, [x20, 184]
-	.loc 1 2718 0
+	.loc 1 2798 0
 	mov	x3, 1
 	mov	x0, x26
 .LBB1724:
@@ -7951,41 +7987,41 @@ ebc_probe:
 	sub	x2, x2, x1
 .LBE1723:
 .LBE1724:
-	.loc 1 2716 0
+	.loc 1 2796 0
 	str	w2, [x19, 16]
-	.loc 1 2718 0
+	.loc 1 2798 0
 	sxtw	x2, w2
 	bl	devm_memremap
-.LVL643:
+.LVL646:
 	str	x0, [x19, 8]
-	.loc 1 2720 0
-	cbz	x0, .L704
-	.loc 1 2728 0
+	.loc 1 2800 0
+	cbz	x0, .L707
+	.loc 1 2808 0
 	mov	x1, x0
 	ldr	w2, [x19, 16]
 	ldr	x0, [x20, 184]
 	mov	w4, 4
 	mov	w3, 4194304
 	bl	ebc_buf_init
-.LVL644:
-	.loc 1 2729 0
-	cbnz	w0, .L704
-	.loc 1 2734 0
+.LVL647:
+	.loc 1 2809 0
+	cbnz	w0, .L707
+	.loc 1 2814 0
 	ldr	x1, [x19, 8]
-	.loc 1 2735 0
+	.loc 1 2815 0
 	mov	x6, 1048576
-	.loc 1 2734 0
+	.loc 1 2814 0
 	mov	x3, 20971520
-	.loc 1 2735 0
+	.loc 1 2815 0
 	str	x6, [x21, 40]
-	.loc 1 2734 0
+	.loc 1 2814 0
 	add	x8, x1, x3
 	str	x8, [x21, 24]
 	mov	x7, 22020096
 	add	x5, x1, x7
-	.loc 1 2736 0
+	.loc 1 2816 0
 	ldr	x2, [x20, 184]
-	.loc 1 2741 0
+	.loc 1 2821 0
 	mov	x4, 23068672
 	add	x4, x1, x4
 .LBB1725:
@@ -7994,33 +8030,33 @@ ebc_probe:
 	mov	x0, x26
 .LBE1726:
 .LBE1725:
-	.loc 1 2736 0
+	.loc 1 2816 0
 	add	x3, x2, x3
 	str	x3, [x21, 32]
-	.loc 1 2737 0
+	.loc 1 2817 0
 	str	x8, [x19, 184]
-	.loc 1 2736 0
+	.loc 1 2816 0
 	add	x2, x2, x7
-	.loc 1 2735 0
+	.loc 1 2815 0
 	str	x6, [x21, 64]
-	.loc 1 2736 0
+	.loc 1 2816 0
 	stp	x5, x2, [x21, 48]
-	.loc 1 2742 0
+	.loc 1 2822 0
 	mov	x2, 27262976
 	add	x2, x1, x2
 	stp	x4, x2, [x19, 144]
-	.loc 1 2743 0
+	.loc 1 2823 0
 	mov	x2, 31457280
 	add	x2, x1, x2
-	.loc 1 2737 0
+	.loc 1 2817 0
 	str	x5, [x19, 192]
-	.loc 1 2743 0
+	.loc 1 2823 0
 	str	x2, [x19, 160]
-	.loc 1 2744 0
+	.loc 1 2824 0
 	mov	x2, 35651584
 	add	x1, x1, x2
 	str	x1, [x19, 128]
-	.loc 1 2747 0
+	.loc 1 2827 0
 	ldp	w2, w1, [x21, 84]
 .LBB1728:
 .LBB1727:
@@ -8029,140 +8065,140 @@ ebc_probe:
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	bl	devm_kmalloc
-.LVL645:
+.LVL648:
 .LBE1727:
 .LBE1728:
-	.loc 1 2747 0
+	.loc 1 2827 0
 	str	x0, [x19, 168]
-	.loc 1 2748 0
-	cbz	x0, .L704
-	.loc 1 2750 0
+	.loc 1 2828 0
+	cbz	x0, .L707
+	.loc 1 2830 0
 	ldp	w2, w1, [x21, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
-.LVL646:
-	.loc 1 2751 0
+.LVL649:
+	.loc 1 2831 0
 	ldrsw	x2, [x19, 20]
 	mov	w1, 255
 	ldr	x0, [x19, 160]
 	bl	memset
-.LVL647:
+.LVL650:
 .LBE1730:
 .LBE1735:
 .LBB1736:
 .LBB1737:
-	.loc 1 2652 0
+	.loc 1 2732 0
 	ldr	x26, [x19, 104]
-.LVL648:
-	.loc 1 2658 0
+.LVL651:
+	.loc 1 2738 0
 	adrp	x1, .LC41
 	mov	w2, 0
 	add	x1, x1, :lo12:.LC41
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL649:
-	.loc 1 2659 0
-	cbz	x0, .L734
-	.loc 1 2662 0
+.LVL652:
+	.loc 1 2739 0
+	cbz	x0, .L737
+	.loc 1 2742 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL650:
+.LVL653:
 	mov	w25, w0
-	.loc 1 2664 0
-	cbz	w0, .L773
-.L705:
+	.loc 1 2744 0
+	cbz	w0, .L776
+.L708:
 .LBE1737:
 .LBE1736:
-	.loc 1 2997 0
+	.loc 1 3077 0
 	adrp	x1, .LC74
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC74
 	bl	_dev_err
-.LVL651:
-	.loc 1 2998 0
-	b	.L682
-.LVL652:
+.LVL654:
+	.loc 1 3078 0
+	b	.L685
+.LVL655:
 	.p2align 3
-.L696:
-	.loc 1 2979 0
+.L699:
+	.loc 1 3059 0
 	mov	w25, -22
-	.loc 1 2978 0
+	.loc 1 3058 0
 	adrp	x1, .LC80
 	mov	w2, w25
 	add	x1, x1, :lo12:.LC80
 	mov	x0, x22
 	bl	_dev_err
-.LVL653:
-	.loc 1 2979 0
-	b	.L682
-.LVL654:
+.LVL656:
+	.loc 1 3059 0
+	b	.L685
+.LVL657:
 	.p2align 3
-.L769:
-	.loc 1 2952 0
+.L772:
+	.loc 1 3032 0
 	adrp	x1, .LC31
 	mov	x0, x22
-.LVL655:
+.LVL658:
 	add	x1, x1, :lo12:.LC31
-	.loc 1 2953 0
+	.loc 1 3033 0
 	mov	w25, -19
-	.loc 1 2952 0
+	.loc 1 3032 0
 	bl	_dev_err
-.LVL656:
-	.loc 1 2953 0
-	b	.L682
-.LVL657:
+.LVL659:
+	.loc 1 3033 0
+	b	.L685
+.LVL660:
 	.p2align 3
-.L694:
-	.loc 1 2964 0
+.L697:
+	.loc 1 3044 0
 	adrp	x1, .LC33
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC33
-	.loc 1 2965 0
+	.loc 1 3045 0
 	mov	w25, -517
-	.loc 1 2964 0
+	.loc 1 3044 0
 	bl	_dev_err
-.LVL658:
-	.loc 1 2965 0
-	b	.L682
-.LVL659:
+.LVL661:
+	.loc 1 3045 0
+	b	.L685
+.LVL662:
 	.p2align 3
-.L772:
+.L775:
 .LBB1745:
 .LBB1731:
-	.loc 1 2711 0
+	.loc 1 2791 0
 	adrp	x1, .LC40
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC40
 	bl	_dev_err
-.LVL660:
-.L701:
+.LVL663:
+.L704:
 .LBE1731:
 .LBE1745:
-	.loc 1 2990 0
+	.loc 1 3070 0
 	adrp	x1, .LC73
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC73
 	bl	_dev_err
-.LVL661:
-	.loc 1 2991 0
-	b	.L682
-.LVL662:
-.L773:
+.LVL664:
+	.loc 1 3071 0
+	b	.L685
+.LVL665:
+.L776:
 .LBB1746:
 .LBB1742:
-	.loc 1 2673 0
+	.loc 1 2753 0
 	mov	x0, x26
 	mov	x3, 1
 .LBB1738:
 .LBB1739:
 	.loc 13 204 0
 	ldp	x1, x26, [x29, 104]
-.LVL663:
+.LVL666:
 .LBE1739:
 .LBE1738:
-	.loc 1 2670 0
+	.loc 1 2750 0
 	str	x1, [x19, 32]
 .LBB1741:
 .LBB1740:
@@ -8171,30 +8207,30 @@ ebc_probe:
 	sub	x26, x26, x1
 .LBE1740:
 .LBE1741:
-	.loc 1 2671 0
+	.loc 1 2751 0
 	str	w26, [x19, 40]
-	.loc 1 2673 0
+	.loc 1 2753 0
 	sxtw	x2, w26
 	bl	devm_memremap
-.LVL664:
+.LVL667:
 	str	x0, [x19, 208]
-	.loc 1 2675 0
-	cbz	x0, .L774
-	.loc 1 2680 0
+	.loc 1 2755 0
+	cbz	x0, .L777
+	.loc 1 2760 0
 	bl	epd_lut_from_mem_init
-.LVL665:
-	.loc 1 2681 0
-	tbnz	w0, #31, .L775
-.L707:
+.LVL668:
+	.loc 1 2761 0
+	tbnz	w0, #31, .L778
+.L710:
 .LBE1742:
 .LBE1746:
 .LBB1747:
 .LBB1748:
-	.loc 1 2760 0
+	.loc 1 2840 0
 	add	x0, x20, 752
 	mov	x1, 68719476704
 	str	x1, [x19, 560]
-	.loc 1 2764 0
+	.loc 1 2844 0
 	add	x24, x24, :lo12:.LANCHOR0
 .LBB1749:
 .LBB1750:
@@ -8209,7 +8245,7 @@ ebc_probe:
 .LBE1751:
 .LBE1750:
 .LBE1749:
-	.loc 1 2761 0
+	.loc 1 2841 0
 	adrp	x5, .LC75
 .LBB1755:
 .LBB1754:
@@ -8218,29 +8254,29 @@ ebc_probe:
 	str	x0, [x0, 8]
 .LBE1754:
 .LBE1755:
-	.loc 1 2760 0
+	.loc 1 2840 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x19, 584]
-	.loc 1 2761 0
+	.loc 1 2841 0
 	add	x5, x5, :lo12:.LC75
 	mov	w1, 14
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 1
 	movk	w1, 0xa, lsl 16
-	.loc 1 2758 0
+	.loc 1 2838 0
 	mov	w26, 99
-	.loc 1 2761 0
+	.loc 1 2841 0
 	adrp	x0, .LC76
-	.loc 1 2758 0
+	.loc 1 2838 0
 	str	w26, [x29, 104]
-	.loc 1 2761 0
+	.loc 1 2841 0
 	add	x0, x0, :lo12:.LC76
 	bl	__alloc_workqueue_key
-.LVL666:
+.LVL669:
 	str	x0, [x19, 608]
-	.loc 1 2764 0
+	.loc 1 2844 0
 	adrp	x3, .LC77
 	mov	w2, -1
 	add	x3, x3, :lo12:.LC77
@@ -8248,96 +8284,26 @@ ebc_probe:
 	adrp	x0, ebc_auto_tast_function
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
-.LVL667:
+.LVL670:
 	str	x0, [x24, 8]
-	.loc 1 2765 0
+	.loc 1 2845 0
 	cmn	x0, #4096
-	bhi	.L776
-	.loc 1 2769 0
+	bhi	.L779
+	.loc 1 2849 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
-.LVL668:
-	.loc 1 2770 0
+.LVL671:
+	.loc 1 2850 0
 	ldr	x2, [x24, 8]
 .LBB1756:
 .LBB1757:
 	.file 16 "./arch/arm64/include/asm/atomic_lse.h"
 	.loc 16 47 0
 	mov	w0, 1
-.LVL669:
-	add	x1, x2, 48
-.LVL670:
-#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
-.LVL671:
-#NO_APP
-.LBE1757:
-.LBE1756:
-.LBB1758:
-	.loc 1 2773 0
-	adrp	x3, .LC46
-	adrp	x0, ebc_thread
 .LVL672:
-	add	x3, x3, :lo12:.LC46
-	mov	w2, -1
-	add	x0, x0, :lo12:ebc_thread
-	mov	x1, x19
-.LBE1758:
-	.loc 1 2772 0
-	str	w26, [x29, 104]
-.LBB1759:
-	.loc 1 2773 0
-	bl	kthread_create_on_node
-.LVL673:
-	mov	x24, x0
-.LVL674:
-	cmn	x0, #4096
-	bhi	.L709
-	bl	wake_up_process
-.LVL675:
-.LBE1759:
-	str	x24, [x19, 136]
-	.loc 1 2778 0
-	add	x2, x29, 104
-	mov	w1, 1
-	mov	x0, x24
-	bl	sched_setscheduler_nocheck
-.LVL676:
-	.loc 1 2779 0
-	ldr	x2, [x19, 136]
-.LBB1760:
-.LBB1761:
-	.loc 16 47 0
-	mov	w0, 1
-.LVL677:
 	add	x1, x2, 48
-.LVL678:
+.LVL673:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -8365,7 +8331,77 @@ ebc_probe:
 .endif
 
 // 0 "" 2
+.LVL674:
+#NO_APP
+.LBE1757:
+.LBE1756:
+.LBB1758:
+	.loc 1 2853 0
+	adrp	x3, .LC46
+	adrp	x0, ebc_thread
+.LVL675:
+	add	x3, x3, :lo12:.LC46
+	mov	w2, -1
+	add	x0, x0, :lo12:ebc_thread
+	mov	x1, x19
+.LBE1758:
+	.loc 1 2852 0
+	str	w26, [x29, 104]
+.LBB1759:
+	.loc 1 2853 0
+	bl	kthread_create_on_node
+.LVL676:
+	mov	x24, x0
+.LVL677:
+	cmn	x0, #4096
+	bhi	.L712
+	bl	wake_up_process
+.LVL678:
+.LBE1759:
+	str	x24, [x19, 136]
+	.loc 1 2858 0
+	add	x2, x29, 104
+	mov	w1, 1
+	mov	x0, x24
+	bl	sched_setscheduler_nocheck
 .LVL679:
+	.loc 1 2859 0
+	ldr	x2, [x19, 136]
+.LBB1760:
+.LBB1761:
+	.loc 16 47 0
+	mov	w0, 1
+.LVL680:
+	add	x1, x2, 48
+.LVL681:
+#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
+.LVL682:
 #NO_APP
 .LBE1761:
 .LBE1760:
@@ -8373,20 +8409,20 @@ ebc_probe:
 .LBE1747:
 .LBB1764:
 .LBB1765:
-	.loc 1 2788 0
+	.loc 1 2868 0
 	mov	w0, -1
-.LVL680:
+.LVL683:
 	str	w0, [x19, 64]
 .LBB1766:
 .LBB1767:
 	.loc 4 39 0
 	add	x0, x20, 416
-.LVL681:
+.LVL684:
 .LBE1767:
 .LBE1766:
-	.loc 1 2792 0
+	.loc 1 2872 0
 	str	wzr, [x19, 44]
-	.loc 1 2791 0
+	.loc 1 2871 0
 	str	wzr, [x19, 96]
 .LBB1772:
 .LBB1768:
@@ -8394,7 +8430,7 @@ ebc_probe:
 	adrp	x1, .LC47
 .LBE1768:
 .LBE1772:
-	.loc 1 2787 0
+	.loc 1 2867 0
 	str	wzr, [x19, 200]
 .LBB1773:
 .LBB1769:
@@ -8402,14 +8438,14 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC47
 .LBE1769:
 .LBE1773:
-	.loc 1 2789 0
+	.loc 1 2869 0
 	str	wzr, [x19, 616]
-	.loc 1 2799 0
+	.loc 1 2879 0
 	add	x24, x20, 632
-.LVL682:
-	.loc 1 2790 0
+.LVL685:
+	.loc 1 2870 0
 	str	wzr, [x19, 620]
-	.loc 1 2800 0
+	.loc 1 2880 0
 	adrp	x26, jiffies
 .LBB1774:
 .LBB1770:
@@ -8417,7 +8453,7 @@ ebc_probe:
 	stp	xzr, xzr, [x0]
 .LBE1770:
 .LBE1774:
-	.loc 1 2800 0
+	.loc 1 2880 0
 	mov	x27, 268435455
 .LBB1775:
 .LBB1771:
@@ -8438,12 +8474,12 @@ ebc_probe:
 	str	x1, [x20, 416]
 	.loc 4 45 0
 	bl	wakeup_source_add
-.LVL683:
+.LVL686:
 .LBE1771:
 .LBE1775:
-	.loc 1 2796 0
+	.loc 1 2876 0
 	str	wzr, [x19, 440]
-	.loc 1 2799 0
+	.loc 1 2879 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -8451,17 +8487,17 @@ ebc_probe:
 	adrp	x1, ebc_vdd_power_timeout
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
-.LVL684:
-	.loc 1 2800 0
+.LVL687:
+	.loc 1 2880 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
-	.loc 1 2803 0
+	.loc 1 2883 0
 	add	x24, x20, 688
-	.loc 1 2800 0
+	.loc 1 2880 0
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL685:
-	.loc 1 2803 0
+.LVL688:
+	.loc 1 2883 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -8469,161 +8505,161 @@ ebc_probe:
 	adrp	x1, ebc_frame_timeout
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
-.LVL686:
-	.loc 1 2804 0
+.LVL689:
+	.loc 1 2884 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL687:
+.LVL690:
 .LBE1765:
 .LBE1764:
 .LBB1776:
 .LBB1777:
-	.loc 1 2814 0
+	.loc 1 2894 0
 	adrp	x0, saved_command_line
 	adrp	x1, .LC48
-	.loc 1 2811 0
+	.loc 1 2891 0
 	stp	wzr, wzr, [x29, 100]
-.LVL688:
-	.loc 1 2814 0
+.LVL691:
+	.loc 1 2894 0
 	add	x1, x1, :lo12:.LC48
 	ldr	x24, [x0, #:lo12:saved_command_line]
 	mov	x0, x24
 	bl	strstr
-.LVL689:
-	.loc 1 2815 0
+.LVL692:
+	.loc 1 2895 0
 	adrp	x1, .LC49
-	.loc 1 2814 0
+	.loc 1 2894 0
 	mov	x26, x0
-.LVL690:
-	.loc 1 2815 0
+.LVL693:
+	.loc 1 2895 0
 	add	x1, x1, :lo12:.LC49
 	mov	x0, x24
 	bl	strstr
-.LVL691:
+.LVL694:
 	mov	x28, x0
-.LVL692:
-	.loc 1 2820 0
-	cbz	x26, .L710
-	.loc 1 2821 0
+.LVL695:
+	.loc 1 2900 0
+	cbz	x26, .L713
+	.loc 1 2901 0
 	add	x2, x29, 100
 	adrp	x1, .LC50
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC50
 	bl	sscanf
-.LVL693:
-	.loc 1 2822 0
+.LVL696:
+	.loc 1 2902 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
-	bls	.L777
-.L710:
-	.loc 1 2834 0
+	bls	.L780
+.L713:
+	.loc 1 2914 0
 	mov	w24, 0
-.LVL694:
+.LVL697:
 	mov	x27, 0
-.LVL695:
-	.loc 1 2818 0
+.LVL698:
+	.loc 1 2898 0
 	mov	x26, 0
-.LVL696:
-	.loc 1 2834 0
-	cbz	x28, .L730
-.LVL697:
-.L729:
-	.loc 1 2835 0
+.LVL699:
+	.loc 1 2914 0
+	cbz	x28, .L733
+.LVL700:
+.L732:
+	.loc 1 2915 0
 	add	x2, x29, 104
 	mov	x0, x28
 	adrp	x1, .LC53
 	add	x1, x1, :lo12:.LC53
 	bl	sscanf
-.LVL698:
-	.loc 1 2813 0
+.LVL701:
+	.loc 1 2893 0
 	mov	w28, 0
-.LVL699:
-	.loc 1 2836 0
+.LVL702:
+	.loc 1 2916 0
 	ldr	w2, [x29, 104]
-	.loc 1 2818 0
+	.loc 1 2898 0
 	mov	x26, 0
-.LVL700:
-	.loc 1 2836 0
+.LVL703:
+	.loc 1 2916 0
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
-	bls	.L778
-.L714:
-	.loc 1 2848 0
-	cbnz	w24, .L713
-.LVL701:
-.L730:
-	.loc 1 2849 0
+	bls	.L781
+.L717:
+	.loc 1 2928 0
+	cbnz	w24, .L716
+.LVL704:
+.L733:
+	.loc 1 2929 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC56
 	add	x1, x1, :lo12:.LC56
 	bl	_dev_info
-.LVL702:
-	.loc 1 2850 0
+.LVL705:
+	.loc 1 2930 0
 	ldr	x0, [x20, 16]
 	bl	ebc_pmic_verity_vcom
-.LVL703:
+.LVL706:
 .LBB1778:
 .LBB1779:
-	.loc 1 2159 0
+	.loc 1 2239 0
 	bl	ebc_empty_buf_get
-.LVL704:
+.LVL707:
 	mov	x24, x0
-.LVL705:
-	.loc 1 2160 0
+.LVL708:
+	.loc 1 2240 0
 	ldp	w2, w0, [x20, 108]
 	mov	w1, 255
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memset
-.LVL706:
-	.loc 1 2163 0
+.LVL709:
+	.loc 1 2243 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2161 0
+	.loc 1 2241 0
 	mov	w0, 17
 	str	w0, [x24, 40]
-	.loc 1 2166 0
+	.loc 1 2246 0
 	mov	w2, 16
-	.loc 1 2167 0
+	.loc 1 2247 0
 	mov	x0, x24
-	.loc 1 2164 0
+	.loc 1 2244 0
 	ldr	w1, [x20, 108]
 	str	w1, [x24, 56]
-	.loc 1 2165 0
+	.loc 1 2245 0
 	ldr	w1, [x20, 112]
-	.loc 1 2166 0
+	.loc 1 2246 0
 	stp	w1, w2, [x24, 60]
-	.loc 1 2167 0
+	.loc 1 2247 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL707:
-.L716:
+.LVL710:
+.L719:
 .LBE1779:
 .LBE1778:
-	.loc 1 2868 0
-	cbnz	w28, .L779
-.L718:
-	.loc 1 2882 0
+	.loc 1 2948 0
+	cbnz	w28, .L782
+.L721:
+	.loc 1 2962 0
 	ldr	w0, [x19, 96]
 	adrp	x21, .LANCHOR1
-	cbz	w0, .L780
-.L720:
-	.loc 1 2887 0
-	cbz	x27, .L721
-	.loc 1 2888 0
+	cbz	w0, .L783
+.L723:
+	.loc 1 2967 0
+	cbz	x27, .L724
+	.loc 1 2968 0
 	mov	x0, x27
 	bl	kfree
-.LVL708:
-.L721:
-	.loc 1 2889 0
-	cbz	x26, .L712
-	.loc 1 2890 0
+.LVL711:
+.L724:
+	.loc 1 2969 0
+	cbz	x26, .L715
+	.loc 1 2970 0
 	mov	x0, x26
 	bl	kfree
-.LVL709:
-.L712:
+.LVL712:
+.L715:
 .LBE1777:
 .LBE1776:
 .LBB1789:
@@ -8636,85 +8672,85 @@ ebc_probe:
 .LBE1789:
 .LBB1792:
 .LBB1793:
-	.loc 1 2635 0
+	.loc 1 2715 0
 	add	x21, x21, :lo12:.LANCHOR1
 	add	x0, x21, 224
 	bl	misc_register
-.LVL710:
-	.loc 1 2636 0
+.LVL713:
+	.loc 1 2716 0
 	add	x0, x21, 376
 	bl	misc_register
-.LVL711:
-	.loc 1 2638 0
+.LVL714:
+	.loc 1 2718 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 456
 	bl	device_create_file
-.LVL712:
-	.loc 1 2639 0
+.LVL715:
+	.loc 1 2719 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 488
 	bl	device_create_file
-.LVL713:
-	.loc 1 2640 0
+.LVL716:
+	.loc 1 2720 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 520
 	bl	device_create_file
-.LVL714:
-	.loc 1 2641 0
+.LVL717:
+	.loc 1 2721 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 552
 	bl	device_create_file
-.LVL715:
-	.loc 1 2642 0
+.LVL718:
+	.loc 1 2722 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 584
 	bl	device_create_file
-.LVL716:
-	.loc 1 2643 0
+.LVL719:
+	.loc 1 2723 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 616
 	bl	device_create_file
-.LVL717:
-	.loc 1 2644 0
+.LVL720:
+	.loc 1 2724 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 648
 	bl	device_create_file
-.LVL718:
+.LVL721:
 .LBE1793:
 .LBE1792:
-	.loc 1 3019 0
+	.loc 1 3099 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LC16
 	adrp	x1, .LC57
 	add	x2, x2, :lo12:.LC16
 	add	x1, x1, :lo12:.LC57
 	bl	_dev_info
-.LVL719:
-	.loc 1 3021 0
-	b	.L682
-.LVL720:
-.L780:
+.LVL722:
+	.loc 1 3101 0
+	b	.L685
+.LVL723:
+.L783:
 .LBB1794:
 .LBB1786:
-	.loc 1 2883 0
+	.loc 1 2963 0
 	mov	w2, 1
 	str	w2, [x19, 96]
-	.loc 1 2884 0
+	.loc 1 2964 0
 	add	x0, x21, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL721:
-	b	.L720
-.LVL722:
-.L777:
-	.loc 1 2824 0
+.LVL724:
+	b	.L723
+.LVL725:
+.L780:
+	.loc 1 2904 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC51
 	add	x1, x1, :lo12:.LC51
 	bl	_dev_info
-.LVL723:
-	.loc 1 2825 0
+.LVL726:
+	.loc 1 2905 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
 .LBB1780:
@@ -8726,80 +8762,80 @@ ebc_probe:
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL724:
+.LVL727:
 	mov	x27, x0
-.LVL725:
+.LVL728:
 .LBE1782:
 .LBE1781:
 .LBE1780:
-	.loc 1 2826 0
-	cbz	x0, .L781
-	.loc 1 2830 0
+	.loc 1 2906 0
+	cbz	x0, .L784
+	.loc 1 2910 0
 	ldp	w2, w1, [x21, 84]
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 100]
-.LVL726:
+.LVL729:
 	sub	x1, x1, x3
-.LVL727:
+.LVL730:
 	ldr	x3, [x19, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL728:
-	.loc 1 2834 0
-	cbnz	x28, .L782
-	.loc 1 2813 0
+.LVL731:
+	.loc 1 2914 0
+	cbnz	x28, .L785
+	.loc 1 2893 0
 	mov	w28, 0
-.LVL729:
-	.loc 1 2818 0
+.LVL732:
+	.loc 1 2898 0
 	mov	x26, 0
-.LVL730:
-.L713:
-	.loc 1 2855 0
+.LVL733:
+.L716:
+	.loc 1 2935 0
 	bl	ebc_empty_buf_get
-.LVL731:
+.LVL734:
 	mov	x24, x0
-.LVL732:
-	.loc 1 2856 0
-	cbz	x0, .L716
-	.loc 1 2857 0
+.LVL735:
+	.loc 1 2936 0
+	cbz	x0, .L719
+	.loc 1 2937 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL733:
-	.loc 1 2860 0
+.LVL736:
+	.loc 1 2940 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2858 0
+	.loc 1 2938 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2863 0
+	.loc 1 2943 0
 	mov	w2, 16
-	.loc 1 2864 0
+	.loc 1 2944 0
 	mov	x0, x24
-	.loc 1 2861 0
+	.loc 1 2941 0
 	ldr	w1, [x21, 84]
 	str	w1, [x24, 56]
-	.loc 1 2862 0
+	.loc 1 2942 0
 	ldr	w1, [x21, 88]
-	.loc 1 2863 0
+	.loc 1 2943 0
 	stp	w1, w2, [x24, 60]
-	.loc 1 2864 0
+	.loc 1 2944 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL734:
-	b	.L716
-.LVL735:
-.L778:
-	.loc 1 2838 0
+.LVL737:
+	b	.L719
+.LVL738:
+.L781:
+	.loc 1 2918 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC54
 	add	x1, x1, :lo12:.LC54
 	bl	_dev_info
-.LVL736:
-	.loc 1 2839 0
+.LVL739:
+	.loc 1 2919 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
 .LBB1783:
@@ -8810,271 +8846,271 @@ ebc_probe:
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL737:
+.LVL740:
 	mov	x26, x0
 .LBE1785:
 .LBE1784:
 .LBE1783:
-	.loc 1 2840 0
-	cbz	x0, .L783
-	.loc 1 2844 0
+	.loc 1 2920 0
+	cbz	x0, .L786
+	.loc 1 2924 0
 	ldp	w2, w1, [x21, 84]
-	.loc 1 2837 0
+	.loc 1 2917 0
 	mov	w28, 1
-	.loc 1 2844 0
+	.loc 1 2924 0
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
-.LVL738:
+.LVL741:
 	sub	x1, x1, x3
-.LVL739:
+.LVL742:
 	ldr	x3, [x19, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL740:
-	b	.L714
-.LVL741:
-.L686:
+.LVL743:
+	b	.L717
+.LVL744:
+.L689:
 .LBE1786:
 .LBE1794:
-	.loc 1 2927 0
+	.loc 1 3007 0
 	mov	w25, -517
-	b	.L682
-.LVL742:
-.L779:
+	b	.L685
+.LVL745:
+.L782:
 .LBB1795:
 .LBB1787:
-	.loc 1 2869 0
+	.loc 1 2949 0
 	bl	ebc_empty_buf_get
-.LVL743:
+.LVL746:
 	mov	x24, x0
-.LVL744:
-	.loc 1 2870 0
-	cbz	x0, .L718
-	.loc 1 2871 0
+.LVL747:
+	.loc 1 2950 0
+	cbz	x0, .L721
+	.loc 1 2951 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL745:
-	.loc 1 2874 0
+.LVL748:
+	.loc 1 2954 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2872 0
+	.loc 1 2952 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2877 0
+	.loc 1 2957 0
 	mov	w1, 16
-	.loc 1 2875 0
+	.loc 1 2955 0
 	ldr	w0, [x21, 84]
 	str	w0, [x24, 56]
-	.loc 1 2876 0
+	.loc 1 2956 0
 	ldr	w0, [x21, 88]
-	.loc 1 2877 0
+	.loc 1 2957 0
 	stp	w0, w1, [x24, 60]
-	.loc 1 2878 0
+	.loc 1 2958 0
 	mov	x0, x24
 	bl	ebc_add_to_dsp_buf_list
-.LVL746:
-	b	.L718
-.LVL747:
-.L732:
+.LVL749:
+	b	.L721
+.LVL750:
+.L735:
 .LBE1787:
 .LBE1795:
-	.loc 1 2913 0
+	.loc 1 2993 0
 	mov	w25, -12
-	b	.L682
-.LVL748:
-.L687:
-	.loc 1 2937 0
+	b	.L685
+.LVL751:
+.L690:
+	.loc 1 3017 0
 	adrp	x1, .LC29
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC29
-	.loc 1 2938 0
+	.loc 1 3018 0
 	mov	w25, -22
-	.loc 1 2937 0
+	.loc 1 3017 0
 	bl	_dev_err
-.LVL749:
-	.loc 1 2938 0
-	b	.L682
-.LVL750:
-.L775:
+.LVL752:
+	.loc 1 3018 0
+	b	.L685
+.LVL753:
+.L778:
 .LBB1796:
 .LBB1743:
-	.loc 1 2682 0
+	.loc 1 2762 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC43
 	add	x1, x1, :lo12:.LC43
 	bl	_dev_err
-.LVL751:
-	.loc 1 2683 0
+.LVL754:
+	.loc 1 2763 0
 	ldr	x0, [x19, 104]
 	mov	w2, w26
 	ldr	x1, [x19, 208]
 	bl	epd_lut_from_file_init
-.LVL752:
-	.loc 1 2684 0
-	tbz	w0, #31, .L707
-	.loc 1 2685 0
+.LVL755:
+	.loc 1 2764 0
+	tbz	w0, #31, .L710
+	.loc 1 2765 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC44
-	.loc 1 2686 0
+	.loc 1 2766 0
 	mov	w25, -1
-	.loc 1 2685 0
+	.loc 1 2765 0
 	add	x1, x1, :lo12:.LC44
 	bl	_dev_err
-.LVL753:
-	b	.L705
-.LVL754:
+.LVL756:
+	b	.L708
+.LVL757:
 	.p2align 3
-.L704:
+.L707:
 .LBE1743:
 .LBE1796:
 .LBB1797:
 .LBB1732:
-	.loc 1 2721 0
+	.loc 1 2801 0
 	mov	w25, -12
-	b	.L701
-.LVL755:
-.L776:
+	b	.L704
+.LVL758:
+.L779:
 .LBE1732:
 .LBE1797:
 .LBB1798:
 .LBB1762:
-	.loc 1 2766 0
+	.loc 1 2846 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC45
 	add	x1, x1, :lo12:.LC45
 	bl	_dev_err
-.LVL756:
-.L708:
+.LVL759:
+.L711:
 .LBE1762:
 .LBE1798:
-	.loc 1 3004 0
+	.loc 1 3084 0
 	adrp	x1, .LC79
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC79
-	.loc 1 3005 0
+	.loc 1 3085 0
 	mov	w25, -1
-	.loc 1 3004 0
+	.loc 1 3084 0
 	bl	_dev_err
-.LVL757:
-	.loc 1 3005 0
-	b	.L682
-.LVL758:
-.L709:
+.LVL760:
+	.loc 1 3085 0
+	b	.L685
+.LVL761:
+.L712:
 .LBB1799:
 .LBB1763:
-	.loc 1 2775 0
+	.loc 1 2855 0
 	ldr	x0, [x19, 104]
-.LVL759:
+.LVL762:
 	adrp	x1, .LC78
-	.loc 1 2773 0
+	.loc 1 2853 0
 	str	x24, [x19, 136]
-	.loc 1 2775 0
+	.loc 1 2855 0
 	add	x1, x1, :lo12:.LC78
 	bl	_dev_err
-.LVL760:
-	b	.L708
-.LVL761:
-.L768:
+.LVL763:
+	b	.L711
+.LVL764:
+.L771:
 .LBE1763:
 .LBE1799:
-	.loc 1 2920 0
+	.loc 1 3000 0
 	adrp	x1, .LC27
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC27
-	.loc 1 2921 0
+	.loc 1 3001 0
 	mov	w25, -19
-	.loc 1 2920 0
+	.loc 1 3000 0
 	bl	_dev_err
-.LVL762:
-	.loc 1 2921 0
-	b	.L682
-.LVL763:
-.L733:
+.LVL765:
+	.loc 1 3001 0
+	b	.L685
+.LVL766:
+.L736:
 .LBB1800:
 .LBB1733:
-	.loc 1 2706 0
+	.loc 1 2786 0
 	mov	w25, -19
-	b	.L701
-.LVL764:
-.L734:
+	b	.L704
+.LVL767:
+.L737:
 .LBE1733:
 .LBE1800:
 .LBB1801:
 .LBB1744:
-	.loc 1 2660 0
+	.loc 1 2740 0
 	mov	w25, -19
-	b	.L705
-.LVL765:
-.L774:
-	.loc 1 2676 0
+	b	.L708
+.LVL768:
+.L777:
+	.loc 1 2756 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
 	adrp	x1, .LC42
-	mov	w3, 2676
+	mov	w3, 2756
 	add	x2, x2, 32
 	add	x1, x1, :lo12:.LC42
-	.loc 1 2677 0
+	.loc 1 2757 0
 	mov	w25, -12
-	.loc 1 2676 0
+	.loc 1 2756 0
 	bl	_dev_err
-.LVL766:
-	b	.L705
-.LVL767:
-.L782:
+.LVL769:
+	b	.L708
+.LVL770:
+.L785:
 .LBE1744:
 .LBE1801:
 .LBB1802:
 .LBB1788:
-	.loc 1 2823 0
+	.loc 1 2903 0
 	mov	w24, 1
-.LVL768:
-	b	.L729
-.LVL769:
-.L781:
-	.loc 1 2827 0
+.LVL771:
+	b	.L732
+.LVL772:
+.L784:
+	.loc 1 2907 0
 	ldr	x0, [x19, 104]
-.LVL770:
+.LVL773:
 	adrp	x1, .LC52
 	adrp	x21, .LANCHOR1
 	add	x1, x1, :lo12:.LC52
 	bl	_dev_err
-.LVL771:
-	b	.L712
-.LVL772:
-.L783:
-	.loc 1 2841 0
+.LVL774:
+	b	.L715
+.LVL775:
+.L786:
+	.loc 1 2921 0
 	ldr	x0, [x19, 104]
-.LVL773:
+.LVL776:
 	adrp	x1, .LC55
 	adrp	x21, .LANCHOR1
 	add	x1, x1, :lo12:.LC55
 	bl	_dev_err
-.LVL774:
-	b	.L712
-.LVL775:
-.L771:
+.LVL777:
+	b	.L715
+.LVL778:
+.L774:
 .LBE1788:
 .LBE1802:
-	.loc 1 3022 0
+	.loc 1 3102 0
 	bl	__stack_chk_fail
-.LVL776:
+.LVL779:
 	.cfi_endproc
-.LFE2861:
+.LFE2862:
 	.size	ebc_probe, .-ebc_probe
 	.align	2
 	.p2align 3,,7
 	.type	ebc_power_set.constprop.17, %function
 ebc_power_set.constprop.17:
-.LFB2886:
+.LFB2887:
 	.loc 1 183 0
 	.cfi_startproc
-.LVL777:
+.LVL780:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -9090,9 +9126,9 @@ ebc_power_set.constprop.17:
 	mov	x19, x0
 	.loc 1 189 0
 	ldr	w0, [x20, 440]
-.LVL778:
-	cbz	w0, .L787
-.L785:
+.LVL781:
+	cbz	w0, .L790
+.L788:
 	.loc 1 193 0
 	mov	w1, 1
 	str	w1, [x20, 200]
@@ -9104,7 +9140,7 @@ ebc_power_set.constprop.17:
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL779:
+.LVL782:
 .LBE1804:
 .LBE1803:
 	.loc 1 195 0
@@ -9116,7 +9152,7 @@ ebc_power_set.constprop.17:
 	mov	x0, x2
 	ldr	x2, [x2, 48]
 	blr	x2
-.LVL780:
+.LVL783:
 .LBE1806:
 .LBE1805:
 	.loc 1 196 0
@@ -9124,11 +9160,11 @@ ebc_power_set.constprop.17:
 	adrp	x1, .LC81
 	add	x1, x1, :lo12:.LC81
 	bl	_dev_info
-.LVL781:
+.LVL784:
 	.loc 1 211 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
-.LVL782:
+.LVL785:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -9137,9 +9173,9 @@ ebc_power_set.constprop.17:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL783:
+.LVL786:
 	.p2align 3
-.L787:
+.L790:
 	.cfi_restore_state
 	.loc 1 190 0
 	mov	w0, 1
@@ -9149,24 +9185,24 @@ ebc_power_set.constprop.17:
 	.loc 4 58 0
 	add	x0, x19, 416
 	bl	__pm_stay_awake
-.LVL784:
-	b	.L785
+.LVL787:
+	b	.L788
 .LBE1808:
 .LBE1807:
 	.cfi_endproc
-.LFE2886:
+.LFE2887:
 	.size	ebc_power_set.constprop.17, .-ebc_power_set.constprop.17
 	.align	2
 	.p2align 3,,7
 	.type	ebc_open, %function
 ebc_open:
-.LFB2885:
+.LFB2886:
 	.cfi_startproc
 	mov	w0, 0
 	str	xzr, [x1, 104]
 	ret
 	.cfi_endproc
-.LFE2885:
+.LFE2886:
 	.size	ebc_open, .-ebc_open
 	.align	2
 	.p2align 3,,7
@@ -9176,24 +9212,24 @@ refresh_new_image2:
 .LFB2810:
 	.loc 1 216 0
 	.cfi_startproc
-.LVL785:
+.LVL788:
 	.loc 1 223 0
 	ldp	w16, w5, [x4, 68]
-.LVL786:
+.LVL789:
 	cmp	w5, 0
 	add	w11, w5, 7
 	csel	w11, w11, w5, lt
-.LVL787:
+.LVL790:
 	.loc 1 225 0
 	cmp	w16, 0
 	.loc 1 223 0
 	asr	w11, w11, 3
-.LVL788:
+.LVL791:
 	.loc 1 225 0
-	ble	.L789
+	ble	.L792
 	sub	w14, w11, #1
 	mov	w15, 0
-.LVL789:
+.LVL792:
 	add	x14, x14, 1
 	.loc 1 270 0
 	mov	w13, 234881024
@@ -9201,92 +9237,92 @@ refresh_new_image2:
 	lsl	x14, x14, 2
 	.loc 1 276 0
 	mov	w12, -536870912
-.LVL790:
+.LVL793:
 	.p2align 2
-.L791:
+.L794:
 	.loc 1 226 0 discriminator 1
 	mov	x6, 0
 	cmp	w11, 0
-	bgt	.L812
-	b	.L809
-.LVL791:
+	bgt	.L815
+	b	.L812
+.LVL794:
 	.p2align 3
-.L792:
+.L795:
 	.loc 1 239 0
 	tst	x5, 65280
-	bne	.L793
+	bne	.L796
 	.loc 1 240 0
 	and	w10, w4, 240
 	cmp	w10, 224
-	beq	.L814
+	beq	.L817
 	.loc 1 243 0
 	orr	w7, w7, 240
-.L793:
+.L796:
 	.loc 1 245 0
 	tst	x5, 16711680
-	bne	.L795
+	bne	.L798
 	.loc 1 246 0
 	and	w10, w4, 3840
 	cmp	w10, 3584
-	beq	.L815
+	beq	.L818
 	.loc 1 249 0
 	orr	w7, w7, 3840
-.L795:
+.L798:
 	.loc 1 251 0
 	tst	x5, 4278190080
-	bne	.L797
+	bne	.L800
 	.loc 1 252 0
 	and	w10, w4, 61440
 	cmp	w10, 57344
-	beq	.L816
+	beq	.L819
 	.loc 1 255 0
 	orr	w7, w7, 61440
-.L797:
+.L800:
 	.loc 1 257 0
 	tst	x5, 1095216660480
-	bne	.L799
+	bne	.L802
 	.loc 1 258 0
 	and	w10, w4, 983040
 	cmp	w10, 917504
-	beq	.L817
+	beq	.L820
 	.loc 1 261 0
 	orr	w7, w7, 983040
-.L799:
+.L802:
 	.loc 1 263 0
 	tst	x5, 280375465082880
-	bne	.L801
+	bne	.L804
 	.loc 1 264 0
 	and	w10, w4, 15728640
 	cmp	w10, 14680064
-	beq	.L818
+	beq	.L821
 	.loc 1 267 0
 	orr	w7, w7, 15728640
-.L801:
+.L804:
 	.loc 1 269 0
 	tst	x5, 71776119061217280
-	bne	.L803
+	bne	.L806
 	.loc 1 270 0
 	and	w10, w4, 251658240
 	cmp	w10, w13
-	beq	.L819
+	beq	.L822
 	.loc 1 273 0
 	orr	w7, w7, 251658240
-.L803:
+.L806:
 	.loc 1 275 0
 	tst	x5, -72057594037927936
-	bne	.L805
+	bne	.L808
 	.loc 1 276 0
 	and	w5, w4, -268435456
-.LVL792:
+.LVL795:
 	cmp	w5, w12
-	beq	.L820
+	beq	.L823
 	.loc 1 279 0
 	orr	w7, w7, -268435456
-.LVL793:
-.L805:
+.LVL796:
+.L808:
 	.loc 1 283 0 discriminator 2
 	and	w4, w4, w9
-.LVL794:
+.LVL797:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
@@ -9295,54 +9331,54 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 226 0 discriminator 2
 	cmp	w11, w6
-	ble	.L821
-.LVL795:
-.L812:
+	ble	.L824
+.LVL798:
+.L815:
 	.loc 1 227 0
 	ldr	x5, [x3, x6, lsl 3]
 	.loc 1 231 0
 	mov	w7, 0
 	.loc 1 228 0
 	ldr	w4, [x1, x6, lsl 2]
-.LVL796:
+.LVL799:
 	.loc 1 229 0
 	ldr	w8, [x0, x6, lsl 2]
 	.loc 1 233 0
 	and	x10, x5, 255
 	.loc 1 230 0
 	ldr	w9, [x2, x6, lsl 2]
-.LVL797:
+.LVL800:
 	.loc 1 233 0
-	cbnz	x10, .L792
-.LVL798:
+	cbnz	x10, .L795
+.LVL801:
 	.loc 1 234 0
 	and	w10, w4, 15
 	.loc 1 237 0
 	mov	w7, 15
 	.loc 1 234 0
 	cmp	w10, 14
-	bne	.L792
+	bne	.L795
 	.loc 1 235 0
 	orr	w8, w8, w7
-.LVL799:
+.LVL802:
 	.loc 1 231 0
 	mov	w7, 0
-.LVL800:
-	b	.L792
+.LVL803:
+	b	.L795
 	.p2align 3
-.L819:
+.L822:
 	.loc 1 271 0
 	orr	w8, w8, 251658240
-	b	.L803
-.LVL801:
+	b	.L806
+.LVL804:
 	.p2align 3
-.L820:
+.L823:
 	.loc 1 277 0
 	orr	w8, w8, -268435456
-.LVL802:
+.LVL805:
 	.loc 1 283 0
 	and	w4, w4, w9
-.LVL803:
+.LVL806:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
@@ -9351,217 +9387,394 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 226 0
 	cmp	w11, w6
-	bgt	.L812
-.LVL804:
+	bgt	.L815
+.LVL807:
 	.p2align 2
-.L821:
+.L824:
 	add	x3, x3, x17
 	add	x1, x1, x14
 	add	x2, x2, x14
 	add	x0, x0, x14
-.LVL805:
-.L809:
+.LVL808:
+.L812:
 	.loc 1 225 0 discriminator 2
 	add	w15, w15, 1
 	cmp	w16, w15
-	bne	.L791
-.L789:
+	bne	.L794
+.L792:
 	ret
-.LVL806:
+.LVL809:
 	.p2align 3
-.L815:
+.L818:
 	.loc 1 247 0
 	orr	w8, w8, 3840
-	b	.L795
+	b	.L798
 	.p2align 3
-.L816:
+.L819:
 	.loc 1 253 0
 	orr	w8, w8, 61440
-	b	.L797
+	b	.L800
 	.p2align 3
-.L817:
+.L820:
 	.loc 1 259 0
 	orr	w8, w8, 983040
-	b	.L799
+	b	.L802
 	.p2align 3
-.L818:
+.L821:
 	.loc 1 265 0
 	orr	w8, w8, 15728640
-	b	.L801
+	b	.L804
 	.p2align 3
-.L814:
+.L817:
 	.loc 1 241 0
 	orr	w8, w8, 240
-	b	.L793
+	b	.L796
 	.cfi_endproc
 .LFE2810:
 	.size	refresh_new_image2, .-refresh_new_image2
 	.align	2
 	.p2align 3,,7
-	.global	refresh_new_image_auto
-	.type	refresh_new_image_auto, %function
-refresh_new_image_auto:
+	.global	refresh_new_image_auto_32
+	.type	refresh_new_image_auto_32, %function
+refresh_new_image_auto_32:
 .LFB2811:
 	.loc 1 291 0
 	.cfi_startproc
-.LVL807:
+.LVL810:
+	.loc 1 298 0
+	ldp	w14, w4, [x3, 68]
+	cmp	w4, 0
+	add	w10, w4, 7
+	csel	w10, w10, w4, lt
+.LVL811:
+	.loc 1 300 0
+	cmp	w14, 0
 	.loc 1 298 0
+	asr	w10, w10, 3
+.LVL812:
+	.loc 1 300 0
+	ble	.L825
+	sub	w13, w10, #1
+	mov	w11, 0
+.LVL813:
+	add	x13, x13, 1
+	lsl	x12, x13, 3
+	lsl	x13, x13, 2
+.LVL814:
+	.p2align 2
+.L827:
+	.loc 1 301 0 discriminator 1
+	mov	x8, x1
+	mov	x6, 0
+	cmp	w10, 0
+	bgt	.L840
+	b	.L838
+.LVL815:
+	.p2align 3
+.L843:
+	.loc 1 310 0
+	ubfx	x3, x7, 4, 4
+.LVL816:
+	.loc 1 309 0
+	mov	w4, 15
+.LVL817:
+.L828:
+	.loc 1 312 0
+	tst	x5, 65280
+	bne	.L829
+	.loc 1 314 0
+	lsr	w9, w7, 8
+	.loc 1 313 0
+	orr	w4, w4, 240
+	.loc 1 314 0
+	and	w9, w9, 240
+	orr	w3, w3, w9
+.L829:
+	.loc 1 316 0
+	tst	x5, 16711680
+	bne	.L830
+	.loc 1 318 0
+	lsr	w9, w7, 12
+	.loc 1 317 0
+	orr	w4, w4, 3840
+	.loc 1 318 0
+	and	w9, w9, 3840
+	orr	w3, w3, w9
+.L830:
+	.loc 1 320 0
+	tst	x5, 4278190080
+	bne	.L831
+	.loc 1 322 0
+	lsr	w7, w7, 16
+	.loc 1 321 0
+	orr	w4, w4, 61440
+	.loc 1 322 0
+	and	w7, w7, 61440
+	orr	w3, w3, w7
+.L831:
+	add	x8, x8, 8
+	.loc 1 325 0
+	tst	x5, 1095216660480
+	.loc 1 324 0
+	ldr	w7, [x8, -4]
+	.loc 1 325 0
+	bne	.L832
+	.loc 1 327 0
+	lsl	w9, w7, 12
+	.loc 1 326 0
+	orr	w4, w4, 983040
+	.loc 1 327 0
+	and	w9, w9, 983040
+	orr	w3, w3, w9
+.L832:
+	.loc 1 329 0
+	tst	x5, 280375465082880
+	bne	.L833
+	.loc 1 331 0
+	lsl	w9, w7, 8
+	.loc 1 330 0
+	orr	w4, w4, 15728640
+	.loc 1 331 0
+	and	w9, w9, 15728640
+	orr	w3, w3, w9
+.L833:
+	.loc 1 334 0
+	tst	x5, 71776119061217280
+	bne	.L834
+	.loc 1 336 0
+	lsl	w9, w7, 4
+	.loc 1 335 0
+	orr	w4, w4, 251658240
+	.loc 1 336 0
+	and	w9, w9, 251658240
+	orr	w3, w3, w9
+.L834:
+	.loc 1 338 0
+	tst	x5, -72057594037927936
+	bne	.L835
+	.loc 1 340 0
+	and	w7, w7, -268435456
+	.loc 1 339 0
+	orr	w4, w4, -268435456
+	.loc 1 340 0
+	orr	w3, w3, w7
+.L835:
+	.loc 1 342 0 discriminator 2
+	bic	w4, w15, w4
+.LVL818:
+	.loc 1 343 0 discriminator 2
+	orr	w3, w3, w4
+.LVL819:
+	.loc 1 344 0 discriminator 2
+	str	w3, [x0, x6, lsl 2]
+	add	x6, x6, 1
+	.loc 1 301 0 discriminator 2
+	cmp	w10, w6
+	ble	.L842
+.LVL820:
+.L840:
+	.loc 1 302 0
+	ldr	x5, [x2, x6, lsl 3]
+	.loc 1 304 0
+	ldr	w15, [x0, x6, lsl 2]
+	.loc 1 308 0
+	and	x3, x5, 255
+.LVL821:
+	.loc 1 303 0
+	ldr	w7, [x8]
+	.loc 1 308 0
+	cbz	x3, .L843
+	.loc 1 305 0
+	mov	w4, 0
+.LVL822:
+	.loc 1 306 0
+	mov	w3, 0
+.LVL823:
+	b	.L828
+.LVL824:
+	.p2align 3
+.L842:
+	add	x2, x2, x12
+	add	x1, x1, x12
+.LVL825:
+	add	x0, x0, x13
+.LVL826:
+.L838:
+	.loc 1 300 0 discriminator 2
+	add	w11, w11, 1
+	cmp	w14, w11
+	bne	.L827
+.L825:
+	ret
+	.cfi_endproc
+.LFE2811:
+	.size	refresh_new_image_auto_32, .-refresh_new_image_auto_32
+	.align	2
+	.p2align 3,,7
+	.global	refresh_new_image_auto
+	.type	refresh_new_image_auto, %function
+refresh_new_image_auto:
+.LFB2812:
+	.loc 1 351 0
+	.cfi_startproc
+.LVL827:
+	.loc 1 358 0
 	ldp	w13, w4, [x3, 68]
 	cmp	w4, 0
 	add	w9, w4, 7
 	csel	w9, w9, w4, lt
-.LVL808:
-	.loc 1 300 0
+.LVL828:
+	.loc 1 360 0
 	cmp	w13, 0
-	.loc 1 298 0
+	.loc 1 358 0
 	asr	w9, w9, 3
-.LVL809:
-	.loc 1 300 0
-	ble	.L822
+.LVL829:
+	.loc 1 360 0
+	ble	.L844
 	sub	w12, w9, #1
 	mov	w11, 0
-.LVL810:
+.LVL830:
 	add	x12, x12, 1
-	.loc 1 308 0
+	.loc 1 368 0
 	mov	w10, 15
 	lsl	x14, x12, 3
 	lsl	x12, x12, 2
 	.p2align 2
-.L824:
-	.loc 1 301 0 discriminator 1
+.L846:
+	.loc 1 361 0 discriminator 1
 	mov	x6, 0
 	cmp	w9, 0
-	ble	.L835
+	ble	.L857
 	.p2align 2
-.L837:
-	.loc 1 302 0
+.L859:
+	.loc 1 362 0
 	ldr	x4, [x2, x6, lsl 3]
-.LVL811:
-	.loc 1 304 0
+.LVL831:
+	.loc 1 364 0
 	ldr	w7, [x0, x6, lsl 2]
-	.loc 1 303 0
+	.loc 1 363 0
 	ldr	w3, [x1, x6, lsl 2]
-.LVL812:
-	.loc 1 307 0
+.LVL832:
+	.loc 1 367 0
 	and	x5, x4, 255
-	.loc 1 308 0
+	.loc 1 368 0
 	cmp	x5, 0
-.LVL813:
+.LVL833:
 	eor	w5, w3, w7
 	csel	w3, wzr, w10, ne
-.LVL814:
-	.loc 1 311 0
+.LVL834:
+	.loc 1 371 0
 	orr	w8, w3, 240
 	tst	x4, 65280
 	csel	w3, w8, w3, eq
-	.loc 1 314 0
+	.loc 1 374 0
 	tst	x4, 16711680
 	orr	w8, w3, 3840
 	csel	w3, w8, w3, eq
-	.loc 1 317 0
+	.loc 1 377 0
 	tst	x4, 4278190080
 	orr	w8, w3, 61440
 	csel	w3, w8, w3, eq
-	.loc 1 320 0
+	.loc 1 380 0
 	tst	x4, 1095216660480
 	orr	w8, w3, 983040
 	csel	w3, w8, w3, eq
-	.loc 1 323 0
+	.loc 1 383 0
 	tst	x4, 280375465082880
 	orr	w8, w3, 15728640
 	csel	w3, w8, w3, eq
-	.loc 1 326 0
+	.loc 1 386 0
 	tst	x4, 71776119061217280
 	orr	w8, w3, 251658240
 	csel	w3, w8, w3, eq
-	.loc 1 329 0
+	.loc 1 389 0
 	tst	x4, -72057594037927936
 	orr	w4, w3, -268435456
-.LVL815:
+.LVL835:
 	csel	w3, w4, w3, eq
 	and	w3, w5, w3
-.LVL816:
-	.loc 1 332 0
+.LVL836:
+	.loc 1 392 0
 	eor	w3, w3, w7
-	.loc 1 333 0
+	.loc 1 393 0
 	str	w3, [x0, x6, lsl 2]
 	add	x6, x6, 1
-	.loc 1 301 0
+	.loc 1 361 0
 	cmp	w9, w6
-	bgt	.L837
+	bgt	.L859
 	add	x2, x2, x14
 	add	x1, x1, x12
 	add	x0, x0, x12
-.LVL817:
-.L835:
-	.loc 1 300 0 discriminator 2
+.LVL837:
+.L857:
+	.loc 1 360 0 discriminator 2
 	add	w11, w11, 1
 	cmp	w13, w11
-	bne	.L824
-.L822:
+	bne	.L846
+.L844:
 	ret
 	.cfi_endproc
-.LFE2811:
+.LFE2812:
 	.size	refresh_new_image_auto, .-refresh_new_image_auto
 	.align	2
 	.p2align 3,,7
 	.global	new_buffer_refresh
 	.type	new_buffer_refresh, %function
 new_buffer_refresh:
-.LFB2812:
-	.loc 1 339 0
+.LFB2813:
+	.loc 1 399 0
 	.cfi_startproc
-.LVL818:
+.LVL838:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 340 0
+	.loc 1 400 0
 	adrp	x1, .LANCHOR0
-	.loc 1 339 0
+	.loc 1 399 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 343 0
+	.loc 1 403 0
 	adrp	x20, .LANCHOR1
-	.loc 1 340 0
+	.loc 1 400 0
 	ldr	x19, [x1, #:lo12:.LANCHOR0]
-.LVL819:
-	.loc 1 343 0
+.LVL839:
+	.loc 1 403 0
 	add	x0, x20, :lo12:.LANCHOR1
-.LVL820:
+.LVL840:
 	add	x0, x0, 680
 	bl	down_write
-.LVL821:
-	.loc 1 341 0
+.LVL841:
+	.loc 1 401 0
 	add	x19, x19, 184
-.LVL822:
-	.loc 1 344 0
+.LVL842:
+	.loc 1 404 0
 	ldr	x0, [x19, 224]
 	ldr	w5, [x0, 40]
-	.loc 1 345 0
+	.loc 1 405 0
 	sub	w1, w5, #22
-	.loc 1 346 0
+	.loc 1 406 0
 	cmp	w5, 0
 	ccmp	w1, 1, 0, ne
-	bls	.L843
-	.loc 1 352 0
+	bls	.L866
+	.loc 1 418 0
 	ldr	x1, [x0, 16]
 	mov	x4, x19
 	ldp	x2, x3, [x19, 160]
 	ldr	x0, [x19, 144]
 	bl	refresh_new_image2
-.LVL823:
-	.loc 1 357 0
+.LVL843:
+	.loc 1 424 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 680
 	bl	up_write
-.LVL824:
-	.loc 1 358 0
+.LVL844:
+	.loc 1 425 0
 	ldp	x19, x20, [sp, 16]
-.LVL825:
+.LVL845:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -9570,25 +9783,56 @@ new_buffer_refresh:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL826:
+.LVL846:
 	.p2align 3
-.L843:
+.L866:
 	.cfi_restore_state
-	.loc 1 347 0
-	ldr	x1, [x0, 16]
+	.loc 1 407 0
+	ldr	w1, [x0, 64]
+	.loc 1 408 0
 	mov	x3, x19
 	ldr	x2, [x19, 168]
+	.loc 1 407 0
+	cmp	w1, 32
+	.loc 1 408 0
+	ldr	x1, [x0, 16]
 	ldr	x0, [x19, 144]
+	.loc 1 407 0
+	beq	.L867
+	.loc 1 413 0
 	bl	refresh_new_image_auto
-.LVL827:
-	.loc 1 357 0
+.LVL847:
+	.loc 1 424 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 680
 	bl	up_write
-.LVL828:
-	.loc 1 358 0
+.LVL848:
+	.loc 1 425 0
 	ldp	x19, x20, [sp, 16]
-.LVL829:
+.LVL849:
+	ldp	x29, x30, [sp], 32
+	.cfi_remember_state
+	.cfi_restore 20
+	.cfi_restore 19
+	.cfi_restore 29
+	.cfi_restore 30
+	.cfi_def_cfa 31, 0
+	ret
+.LVL850:
+	.p2align 3
+.L867:
+	.cfi_restore_state
+	.loc 1 408 0
+	bl	refresh_new_image_auto_32
+.LVL851:
+	.loc 1 424 0
+	add	x0, x20, :lo12:.LANCHOR1
+	add	x0, x0, 680
+	bl	up_write
+.LVL852:
+	.loc 1 425 0
+	ldp	x19, x20, [sp, 16]
+.LVL853:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -9597,25 +9841,25 @@ new_buffer_refresh:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2812:
+.LFE2813:
 	.size	new_buffer_refresh, .-new_buffer_refresh
 	.align	2
 	.p2align 3,,7
 	.type	ebc_auto_tast_function, %function
 ebc_auto_tast_function:
-.LFB2831:
-	.loc 1 1514 0
+.LFB2832:
+	.loc 1 1581 0
 	.cfi_startproc
-.LVL830:
+.LVL854:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
 	.cfi_offset 30, -88
-	.loc 1 1515 0
+	.loc 1 1582 0
 	adrp	x1, .LANCHOR0
-	.loc 1 1514 0
+	.loc 1 1581 0
 	adrp	x0, __stack_chk_guard
-.LVL831:
+.LVL855:
 	add	x0, x0, :lo12:__stack_chk_guard
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -9624,16 +9868,16 @@ ebc_auto_tast_function:
 	.cfi_offset 20, -72
 	adrp	x20, .LANCHOR1
 	stp	x21, x22, [sp, 32]
-	.loc 1 1520 0
+	.loc 1 1587 0
 	add	x20, x20, :lo12:.LANCHOR1
 	.cfi_offset 21, -64
 	.cfi_offset 22, -56
-	.loc 1 1515 0
+	.loc 1 1582 0
 	ldr	x22, [x1, #:lo12:.LANCHOR0]
-.LVL832:
-	.loc 1 1520 0
+.LVL856:
+	.loc 1 1587 0
 	add	x20, x20, 728
-	.loc 1 1514 0
+	.loc 1 1581 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
@@ -9645,21 +9889,21 @@ ebc_auto_tast_function:
 .LBE1811:
 .LBE1810:
 .LBE1809:
-	.loc 1 1514 0
+	.loc 1 1581 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -32
 	.cfi_offset 26, -24
-	.loc 1 1516 0
+	.loc 1 1583 0
 	add	x21, x22, 24
 	adrp	x26, .LC82
-	.loc 1 1517 0
+	.loc 1 1584 0
 	add	x19, x22, 184
-	.loc 1 1514 0
+	.loc 1 1581 0
 	ldr	x1, [x0]
 	str	x1, [x29, 88]
 	mov	x1,0
 	add	x25, x22, 744
-	.loc 1 1580 0
+	.loc 1 1647 0
 	add	x26, x26, :lo12:.LC82
 .LBB1816:
 .LBB1813:
@@ -9669,26 +9913,26 @@ ebc_auto_tast_function:
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x23, sp_el0
 // 0 "" 2
-.LVL833:
+.LVL857:
 #NO_APP
-	b	.L856
+	b	.L880
 	.p2align 3
-.L853:
+.L877:
 .LBE1814:
 .LBE1813:
 .LBE1816:
-	.loc 1 1600 0
+	.loc 1 1667 0
 	mov	x0, x20
 	bl	up
-.LVL834:
-	.loc 1 1601 0
+.LVL858:
+	.loc 1 1668 0
 	bl	schedule
-.LVL835:
-.L856:
-	.loc 1 1520 0
+.LVL859:
+.L880:
+	.loc 1 1587 0
 	mov	x0, x20
 	bl	down
-.LVL836:
+.LVL860:
 .LBB1817:
 .LBB1815:
 .LBB1812:
@@ -9697,28 +9941,28 @@ ebc_auto_tast_function:
 .LBE1812:
 .LBE1815:
 .LBE1817:
-	.loc 1 1524 0
+	.loc 1 1591 0
 #APP
-// 1524 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
+// 1591 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
 	dmb ish
 // 0 "" 2
-	.loc 1 1525 0
+	.loc 1 1592 0
 #NO_APP
 	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 16
-	bgt	.L846
+	bgt	.L870
 	cmp	w0, 7
-	bge	.L847
-	cbz	w0, .L848
+	bge	.L871
+	cbz	w0, .L872
 	cmp	w0, 1
-	bne	.L845
-	.loc 1 1527 0
+	bne	.L869
+	.loc 1 1594 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
 	bl	flip.isra.11
-.LVL837:
-	.loc 1 1528 0
+.LVL861:
+	.loc 1 1595 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
@@ -9726,20 +9970,20 @@ ebc_auto_tast_function:
 	ldr	x3, [x19, 168]
 	ldr	x0, [x0, 184]
 	bl	get_overlay_image
-.LVL838:
-.L850:
-	.loc 1 1575 0
+.LVL862:
+.L874:
+	.loc 1 1642 0
 	ldr	x0, [x19, 224]
-	.loc 1 1576 0
+	.loc 1 1643 0
 	ldr	w0, [x0, 40]
 	sub	w1, w0, #22
-	.loc 1 1578 0
+	.loc 1 1645 0
 	cmp	w1, 1
 	ccmp	w0, 1, 0, hi
-	bhi	.L853
-	.loc 1 1579 0
+	bhi	.L877
+	.loc 1 1646 0
 	ldr	w0, [x19, 52]
-	cbz	w0, .L868
+	cbz	w0, .L892
 .LBB1818:
 .LBB1819:
 	.file 18 "./include/linux/workqueue.h"
@@ -9748,82 +9992,82 @@ ebc_auto_tast_function:
 	mov	x2, x25
 	mov	w0, 8
 	bl	queue_work_on
-.LVL839:
-	b	.L853
+.LVL863:
+	b	.L877
 	.p2align 3
-.L845:
+.L869:
 .LBE1819:
 .LBE1818:
-	.loc 1 1564 0
+	.loc 1 1631 0
 	ldr	w1, [x19, 56]
-	.loc 1 1565 0
+	.loc 1 1632 0
 	mov	x0, x21
-	.loc 1 1564 0
+	.loc 1 1631 0
 	sub	w1, w1, #1
 	str	w1, [x19, 56]
-	.loc 1 1565 0
+	.loc 1 1632 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.11
-.LVL840:
-	.loc 1 1566 0
+.LVL864:
+	.loc 1 1633 0
 	ldr	w0, [x19, 56]
-	cbz	w0, .L850
-	.loc 1 1568 0
+	cbz	w0, .L874
+	.loc 1 1635 0
 	ldrsw	x0, [x21, 72]
 	mov	x3, x19
-	.loc 1 1569 0
+	.loc 1 1636 0
 	ldp	x2, x1, [x19, 216]
-	.loc 1 1568 0
+	.loc 1 1635 0
 	add	x0, x19, x0, lsl 3
 	ldr	x1, [x1, 16]
 	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
-.LVL841:
-	b	.L850
+.LVL865:
+	b	.L874
 	.p2align 3
-.L847:
-	.loc 1 1554 0
+.L871:
+	.loc 1 1621 0
 	ldr	w1, [x19, 56]
-	.loc 1 1555 0
+	.loc 1 1622 0
 	mov	x0, x21
-	.loc 1 1554 0
+	.loc 1 1621 0
 	sub	w1, w1, #1
 	str	w1, [x19, 56]
-	.loc 1 1555 0
+	.loc 1 1622 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.11
-.LVL842:
-	.loc 1 1556 0
+.LVL866:
+	.loc 1 1623 0
 	ldr	w0, [x19, 56]
-	cbz	w0, .L850
-	.loc 1 1558 0
+	cbz	w0, .L874
+	.loc 1 1625 0
 	ldrsw	x0, [x21, 72]
 	mov	x3, x19
-	.loc 1 1559 0
+	.loc 1 1626 0
 	ldp	x2, x1, [x19, 216]
-	.loc 1 1558 0
+	.loc 1 1625 0
 	add	x0, x19, x0, lsl 3
 	ldr	x1, [x1, 16]
 	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part
-.LVL843:
-	.loc 1 1562 0
-	b	.L850
+.LVL867:
+	.loc 1 1629 0
+	b	.L874
 	.p2align 3
-.L846:
-	.loc 1 1525 0
+.L870:
+	.loc 1 1592 0
 	sub	w0, w0, #22
 	cmp	w0, 1
-	bhi	.L845
-.L848:
-	.loc 1 1537 0
+	bhi	.L869
+.L872:
+	.loc 1 1604 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
 	bl	flip.isra.11
-.LVL844:
-	.loc 1 1538 0
+.LVL868:
+	.loc 1 1605 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
@@ -9831,56 +10075,56 @@ ebc_auto_tast_function:
 	ldr	x3, [x19, 168]
 	ldr	x0, [x0, 184]
 	bl	get_auto_image
-.LVL845:
-	.loc 1 1543 0
-	b	.L850
-.L868:
-	.loc 1 1580 0
+.LVL869:
+	.loc 1 1610 0
+	b	.L874
+.L892:
+	.loc 1 1647 0
 	mov	x0, x26
 	bl	printk
-.LVL846:
-	.loc 1 1581 0
+.LVL870:
+	.loc 1 1648 0
 	mov	x0, x25
 	bl	new_buffer_refresh
-.LVL847:
-	.loc 1 1582 0
+.LVL871:
+	.loc 1 1649 0
 	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
-	.loc 1 1583 0
+	.loc 1 1650 0
 	ldrsw	x0, [x21, 72]
-	.loc 1 1582 0
-	beq	.L869
-	.loc 1 1589 0
+	.loc 1 1649 0
+	beq	.L893
+	.loc 1 1656 0
 	add	x0, x19, x0, lsl 3
 	ldr	x3, [x19, 168]
 	ldp	x1, x2, [x19, 144]
 	mov	x4, x19
 	ldr	x0, [x0, 184]
 	bl	get_auto_image
-.LVL848:
-	b	.L853
-.L869:
-	.loc 1 1583 0
+.LVL872:
+	b	.L877
+.L893:
+	.loc 1 1650 0
 	add	x0, x19, x0, lsl 3
 	ldr	x3, [x19, 168]
 	ldp	x1, x2, [x19, 144]
 	mov	x4, x19
 	ldr	x0, [x0, 184]
 	bl	get_overlay_image
-.LVL849:
-	b	.L853
+.LVL873:
+	b	.L877
 	.cfi_endproc
-.LFE2831:
+.LFE2832:
 	.size	ebc_auto_tast_function, .-ebc_auto_tast_function
 	.align	2
 	.p2align 3,,7
 	.type	ebc_thread, %function
 ebc_thread:
-.LFB2837:
-	.loc 1 1819 0
+.LFB2838:
+	.loc 1 1895 0
 	.cfi_startproc
-.LVL850:
+.LVL874:
 	stp	x29, x30, [sp, -240]!
 	.cfi_def_cfa_offset 240
 	.cfi_offset 29, -240
@@ -9890,21 +10134,21 @@ ebc_thread:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -208
 	.cfi_offset 22, -200
-	.loc 1 1820 0
+	.loc 1 1896 0
 	adrp	x21, .LANCHOR0
-	.loc 1 1819 0
+	.loc 1 1895 0
 	stp	x19, x20, [sp, 16]
 	adrp	x22, .LANCHOR1
 	stp	x23, x24, [sp, 48]
 .LBB1848:
 .LBB1849:
 .LBB1850:
-	.loc 1 2147 0
+	.loc 1 2227 0
 	add	x22, x22, :lo12:.LANCHOR1
 .LBE1850:
 .LBE1849:
 .LBE1848:
-	.loc 1 1819 0
+	.loc 1 1895 0
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 19, -224
 	.cfi_offset 20, -216
@@ -9916,161 +10160,161 @@ ebc_thread:
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -176
 	.cfi_offset 26, -168
-	.loc 1 1819 0
+	.loc 1 1895 0
 	add	x0, x23, :lo12:__stack_chk_guard
-.LVL851:
-	.loc 1 1820 0
+.LVL875:
+	.loc 1 1896 0
 	ldr	x20, [x21, #:lo12:.LANCHOR0]
-.LVL852:
+.LVL876:
 .LBB1855:
 .LBB1853:
 .LBB1851:
-	.loc 1 2147 0
+	.loc 1 2227 0
 	add	x19, x22, 304
 .LBE1851:
 .LBE1853:
 .LBE1855:
-	.loc 1 1819 0
+	.loc 1 1895 0
 	ldr	x1, [x0]
 	str	x1, [x29, 232]
 	mov	x1,0
-	.loc 1 1824 0
+	.loc 1 1900 0
 	str	wzr, [x29, 108]
-	.loc 1 1821 0
+	.loc 1 1897 0
 	add	x28, x20, 184
-.LVL853:
+.LVL877:
 	.p2align 2
-.L871:
-	.loc 1 1829 0
+.L895:
+	.loc 1 1905 0
 	ldr	w0, [x28, 624]
-.LVL854:
-	cbnz	w0, .L1030
-.L872:
-	.loc 1 1835 0
+.LVL878:
+	cbnz	w0, .L1055
+.L896:
+	.loc 1 1911 0
 	bl	ebc_dsp_buf_get
-.LVL855:
+.LVL879:
 	mov	x24, x0
-	.loc 1 1837 0
-	cbz	x0, .L874
-	.loc 1 1837 0 is_stmt 0 discriminator 1
+	.loc 1 1913 0
+	cbz	x0, .L898
+	.loc 1 1913 0 is_stmt 0 discriminator 1
 	ldr	x0, [x0, 8]
-	cbz	x0, .L874
-	.loc 1 1839 0 is_stmt 1
+	cbz	x0, .L898
+	.loc 1 1915 0 is_stmt 1
 	add	x0, x21, :lo12:.LANCHOR0
 	ldr	w1, [x0, 16]
-	cbz	w1, .L875
-	.loc 1 1840 0
+	cbz	w1, .L899
+	.loc 1 1916 0
 	ldr	w1, [x0, 20]
 	add	w2, w1, 1
 	str	w2, [x0, 20]
 	cmp	w1, 5
-	ble	.L876
-	.loc 1 1841 0
+	ble	.L900
+	.loc 1 1917 0
 	str	wzr, [x0, 16]
-.L876:
-	.loc 1 1842 0
+.L900:
+	.loc 1 1918 0
 	ldr	w2, [x20, 204]
 	ldr	w1, [x24, 64]
 	ldr	x0, [x24, 16]
 	bl	check_black_percent.isra.15
-.LVL856:
-	cbnz	w0, .L1022
-.L875:
-	.loc 1 1850 0
+.LVL880:
+	cbnz	w0, .L1047
+.L899:
+	.loc 1 1926 0
 	ldr	w0, [x24, 40]
 	cmp	w0, 20
-	beq	.L1031
-	.loc 1 1854 0
+	beq	.L1056
+	.loc 1 1930 0
 	ldr	x1, [x28, 616]
-	cbz	x1, .L880
-	.loc 1 1855 0
+	cbz	x1, .L904
+	.loc 1 1931 0
 	cmp	w0, 19
-	beq	.L1032
-	.loc 1 1864 0
+	beq	.L1057
+	.loc 1 1940 0
 	mov	w1, 18
 	tst	w0, w1
-	beq	.L1022
-	.loc 1 1865 0
+	beq	.L1047
+	.loc 1 1941 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC84
 	add	x1, x1, :lo12:.LC84
 	bl	_dev_info
-.LVL857:
-.L879:
-	.loc 1 1901 0
+.LVL881:
+.L903:
+	.loc 1 1977 0
 	adrp	x25, jiffies
-.LVL858:
+.LVL882:
 	mov	x1, 402653184
 	add	x0, x20, 632
 	ldr	x2, [x25, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL859:
-	.loc 1 1903 0
+.LVL883:
+	.loc 1 1979 0
 	ldr	w0, [x28, 444]
-	cbz	w0, .L891
+	cbz	w0, .L915
 	ldr	x0, [x28, 216]
-.L892:
-	.loc 1 1906 0
+.L916:
+	.loc 1 1982 0
 	ldr	w2, [x0, 40]
 	ldr	w3, [x24, 40]
 	cmp	w3, w2
-	beq	.L893
-	.loc 1 1907 0
+	beq	.L917
+	.loc 1 1983 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC86
 	add	x1, x1, :lo12:.LC86
 	bl	_dev_info
-.LVL860:
-	.loc 1 1909 0
+.LVL884:
+	.loc 1 1985 0
 	ldr	w0, [x28, 44]
 	cmp	w0, 1
-	beq	.L1033
-.L1023:
+	beq	.L1058
+.L1048:
 	ldr	w2, [x24, 40]
-.L893:
-	.loc 1 1916 0
+.L917:
+	.loc 1 1992 0
 	cmp	w2, 23
-	bls	.L1034
-	.loc 1 2095 0
+	bls	.L1059
+	.loc 1 2175 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC94
 	add	x1, x1, :lo12:.LC94
 	bl	_dev_err
-.LVL861:
-.L1022:
-	.loc 1 2096 0
+.LVL885:
+.L1047:
+	.loc 1 2176 0
 	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL862:
-	.loc 1 2097 0
+.LVL886:
+	.loc 1 2177 0
 	mov	x0, x24
 	bl	ebc_buf_release
-.LVL863:
-	.loc 1 1829 0
+.LVL887:
+	.loc 1 1905 0
 	ldr	w0, [x28, 624]
-	cbz	w0, .L872
+	cbz	w0, .L896
 	.p2align 2
-.L1030:
-	.loc 1 1830 0
+.L1055:
+	.loc 1 1906 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	beq	.L1035
-.L873:
-	.loc 1 2153 0
+	beq	.L1060
+.L897:
+	.loc 1 2233 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, 0
 	ldr	x2, [x29, 232]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L1036
+	cbnz	x1, .L1061
 	ldp	x19, x20, [sp, 16]
-.LVL864:
+.LVL888:
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
-.LVL865:
+.LVL889:
 	ldp	x25, x26, [sp, 64]
-.LVL866:
+.LVL890:
 	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 240
 	.cfi_remember_state
@@ -10088,656 +10332,683 @@ ebc_thread:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL867:
+.LVL891:
 	.p2align 3
-.L874:
+.L898:
 	.cfi_restore_state
-	.loc 1 2134 0
+	.loc 1 2214 0
 	ldr	w0, [x28, 44]
 	cmp	w0, 1
-	beq	.L1037
-	.loc 1 2143 0
+	beq	.L1062
+	.loc 1 2223 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	beq	.L1038
-.LVL868:
-.L1026:
+	beq	.L1063
+.LVL892:
+.L1051:
 	ldr	w0, [x28, 96]
-.LVL869:
-	.loc 1 2146 0
-	cbz	w0, .L1039
-.L974:
-.LVL870:
-.L964:
-	.loc 1 2148 0
+.LVL893:
+	.loc 1 2226 0
+	cbz	w0, .L1064
+.L999:
+.LVL894:
+.L989:
+	.loc 1 2228 0
 	str	wzr, [x28, 96]
-	b	.L871
-.LVL871:
+	b	.L895
+.LVL895:
 	.p2align 3
-.L1039:
+.L1064:
 .LBB1856:
 .LBB1854:
-	.loc 1 2147 0 discriminator 1
+	.loc 1 2227 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL872:
-	b	.L975
+.LVL896:
+	b	.L1000
 	.p2align 3
-.L1040:
-.LVL873:
+.L1065:
+.LVL897:
 .LBB1852:
-	.loc 1 2147 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L964
-	.loc 1 2147 0 discriminator 7
+	.loc 1 2227 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L989
+	.loc 1 2227 0 discriminator 7
 	bl	schedule
-.LVL874:
-.L975:
-	.loc 1 2147 0 discriminator 9
+.LVL898:
+.L1000:
+	.loc 1 2227 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL875:
+.LVL899:
 	ldr	w1, [x28, 96]
-	cbz	w1, .L1040
+	cbz	w1, .L1065
 .LBE1852:
-	.loc 1 2147 0 discriminator 4
+	.loc 1 2227 0 discriminator 4
 	add	x1, x29, 120
 	mov	x0, x19
 	bl	finish_wait
-.LVL876:
+.LVL900:
 .LBE1854:
 .LBE1856:
-	.loc 1 2148 0 is_stmt 1 discriminator 4
+	.loc 1 2228 0 is_stmt 1 discriminator 4
 	str	wzr, [x28, 96]
-	b	.L871
-.LVL877:
+	b	.L895
+.LVL901:
 	.p2align 3
-.L1034:
-	.loc 1 1916 0
-	adrp	x0, .L901
-	add	x0, x0, :lo12:.L901
+.L1059:
+	.loc 1 1992 0
+	adrp	x0, .L925
+	add	x0, x0, :lo12:.L925
 	ldrh	w0, [x0,w2,uxtw #1]
-	adr	x1, .Lrtx901
+	adr	x1, .Lrtx925
 	add	x0, x1, w0, sxth #2
 	br	x0
-.Lrtx901:
+.Lrtx925:
 	.section	.rodata
 	.align	0
 	.align	2
-.L901:
-	.2byte	(.L900 - .Lrtx901) / 4
-	.2byte	(.L902 - .Lrtx901) / 4
-	.2byte	(.L979 - .Lrtx901) / 4
-	.2byte	(.L979 - .Lrtx901) / 4
-	.2byte	(.L979 - .Lrtx901) / 4
-	.2byte	(.L979 - .Lrtx901) / 4
-	.2byte	(.L979 - .Lrtx901) / 4
-	.2byte	(.L904 - .Lrtx901) / 4
-	.2byte	(.L904 - .Lrtx901) / 4
-	.2byte	(.L979 - .Lrtx901) / 4
-	.2byte	(.L979 - .Lrtx901) / 4
-	.2byte	(.L904 - .Lrtx901) / 4
-	.2byte	(.L979 - .Lrtx901) / 4
-	.2byte	(.L979 - .Lrtx901) / 4
-	.2byte	(.L904 - .Lrtx901) / 4
-	.2byte	(.L904 - .Lrtx901) / 4
-	.2byte	(.L979 - .Lrtx901) / 4
-	.2byte	(.L979 - .Lrtx901) / 4
-	.2byte	(.L979 - .Lrtx901) / 4
-	.2byte	(.L979 - .Lrtx901) / 4
-	.2byte	(.L979 - .Lrtx901) / 4
-	.2byte	(.L979 - .Lrtx901) / 4
-	.2byte	(.L900 - .Lrtx901) / 4
-	.2byte	(.L900 - .Lrtx901) / 4
+.L925:
+	.2byte	(.L924 - .Lrtx925) / 4
+	.2byte	(.L926 - .Lrtx925) / 4
+	.2byte	(.L1004 - .Lrtx925) / 4
+	.2byte	(.L1004 - .Lrtx925) / 4
+	.2byte	(.L1004 - .Lrtx925) / 4
+	.2byte	(.L1004 - .Lrtx925) / 4
+	.2byte	(.L1004 - .Lrtx925) / 4
+	.2byte	(.L928 - .Lrtx925) / 4
+	.2byte	(.L928 - .Lrtx925) / 4
+	.2byte	(.L1004 - .Lrtx925) / 4
+	.2byte	(.L1004 - .Lrtx925) / 4
+	.2byte	(.L928 - .Lrtx925) / 4
+	.2byte	(.L1004 - .Lrtx925) / 4
+	.2byte	(.L1004 - .Lrtx925) / 4
+	.2byte	(.L928 - .Lrtx925) / 4
+	.2byte	(.L928 - .Lrtx925) / 4
+	.2byte	(.L1004 - .Lrtx925) / 4
+	.2byte	(.L1004 - .Lrtx925) / 4
+	.2byte	(.L1004 - .Lrtx925) / 4
+	.2byte	(.L1004 - .Lrtx925) / 4
+	.2byte	(.L1004 - .Lrtx925) / 4
+	.2byte	(.L1004 - .Lrtx925) / 4
+	.2byte	(.L924 - .Lrtx925) / 4
+	.2byte	(.L924 - .Lrtx925) / 4
 	.text
-.L979:
-	.loc 1 2021 0
+.L1004:
+	.loc 1 2101 0
 	mov	w4, 1
-.LVL878:
-.L903:
-	.loc 1 2028 0
+.LVL902:
+.L927:
+	.loc 1 2108 0
 	ldr	x26, [x28, 216]
-.LVL879:
-	.loc 1 2030 0
+.LVL903:
+	.loc 1 2110 0
 	ldr	w0, [x26, 40]
 	sub	w1, w0, #22
-	.loc 1 2032 0
+	.loc 1 2112 0
 	cmp	w1, 1
 	ccmp	w0, 1, 0, hi
-	bhi	.L945
-	.loc 1 2035 0
+	bhi	.L970
+	.loc 1 2115 0
 	add	x0, x29, 160
 	str	x0, [x28, 216]
-	.loc 1 2036 0
+	.loc 1 2116 0
 	ldr	x0, [x28, 152]
 	str	x0, [x29, 176]
-	.loc 1 2037 0
+	.loc 1 2117 0
 	mov	w0, 16
 	str	w0, [x29, 224]
-.L945:
-	.loc 1 2039 0
+.L970:
+	.loc 1 2119 0
 	str	wzr, [x28, 92]
-	.loc 1 2040 0
+	.loc 1 2120 0
 	str	x24, [x28, 224]
-	.loc 1 2043 0
+	.loc 1 2123 0
 	ldr	w0, [x24, 40]
 	sub	w0, w0, #2
-	.loc 1 2042 0
+	.loc 1 2122 0
 	cmp	w0, 14
-	bhi	.L946
-	.loc 1 2044 0
+	bhi	.L971
+	.loc 1 2124 0
 	ldr	x1, [x28, 216]
 	ldr	w0, [x24, 64]
 .LBB1857:
 .LBB1858:
-	.loc 1 1782 0
+	.loc 1 1858 0
 	ldr	w2, [x1, 64]
 	cmp	w0, w2
-	beq	.L1041
-.L946:
+	beq	.L1066
+.L971:
 .LBE1858:
 .LBE1857:
-	.loc 1 2053 0
-	cbz	w4, .L1042
-	.loc 1 2054 0
+	.loc 1 2133 0
+	cbz	w4, .L1067
+	.loc 1 2134 0
 	str	wzr, [x29, 108]
-.LVL880:
-.L952:
-	.loc 1 2065 0
+.LVL904:
+.L977:
+	.loc 1 2145 0
 	ldr	w0, [x28, 200]
-	cbz	w0, .L1043
-.L953:
-	.loc 1 2068 0
+	cbz	w0, .L1068
+.L978:
+	.loc 1 2148 0
 	ldr	x0, [x28, 224]
 	ldr	w1, [x0, 64]
-.LVL881:
+.LVL905:
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL882:
-	cbz	w0, .L954
-.L1059:
-	.loc 1 2069 0
+.LVL906:
+	cbz	w0, .L979
+.L1083:
+	.loc 1 2149 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC91
 	add	x1, x1, :lo12:.LC91
 	bl	_dev_err
-.LVL883:
-	.loc 1 2071 0
+.LVL907:
+	.loc 1 2151 0
 	str	x26, [x28, 216]
-.LVL884:
-.L916:
-	.loc 1 2106 0
+.LVL908:
+.L940:
+	.loc 1 2186 0
 	ldr	x0, [x28, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
-	beq	.L1044
-.L959:
-	.loc 1 2112 0
+	beq	.L1069
+.L984:
+	.loc 1 2192 0
 	cmp	w0, 18
-	beq	.L1045
-.L960:
-	.loc 1 2123 0
+	beq	.L1070
+.L985:
+	.loc 1 2203 0
 	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL885:
-	.loc 1 2125 0
+.LVL909:
+	.loc 1 2205 0
 	ldr	w0, [x28, 444]
-	cbnz	w0, .L1046
-.L962:
-	.loc 1 2128 0
+	cbnz	w0, .L1071
+.L987:
+	.loc 1 2208 0
 	mov	w0, 1
 	str	w0, [x28, 444]
-.L963:
-	.loc 1 2130 0
+.L988:
+	.loc 1 2210 0
 	ldr	x0, [x28, 224]
 	str	x0, [x28, 216]
-	.loc 1 2131 0
-	b	.L871
-.LVL886:
-.L902:
-	.loc 1 1918 0
+	.loc 1 2211 0
+	b	.L895
+.LVL910:
+.L926:
+	.loc 1 1994 0
 	ldr	w0, [x28, 628]
-	cbz	w0, .L905
-	.loc 1 1931 0
+	cbz	w0, .L929
+	.loc 1 2007 0
 	ldr	x2, [x28, 216]
-	.loc 1 1919 0
+	.loc 1 1995 0
 	mov	w0, 1
-	.loc 1 1929 0
+	.loc 1 2005 0
 	str	x24, [x28, 224]
-	.loc 1 1919 0
+	.loc 1 1995 0
 	str	w0, [x28, 632]
-	.loc 1 1931 0
+	.loc 1 2007 0
 	ldr	w0, [x2, 40]
-	.loc 1 1934 0
+	.loc 1 2010 0
 	cmp	w0, 1
-	.loc 1 1933 0
+	.loc 1 2009 0
 	sub	w1, w0, #22
-	.loc 1 1934 0
+	.loc 1 2010 0
 	ccmp	w1, 1, 0, hi
-	bls	.L1047
-	.loc 1 1935 0
+	bls	.L1072
+	.loc 1 2011 0
 	ldr	w0, [x2, 64]
 	cmp	w0, 32
-	beq	.L1048
-	.loc 1 1938 0
+	beq	.L1073
+	.loc 1 2014 0
 	ldr	x1, [x2, 16]
 	ldr	x0, [x28, 160]
 	ldrsw	x2, [x28, 20]
 	bl	memcpy
-.LVL887:
-.L1024:
+.LVL911:
+.L1049:
 	ldr	w2, [x28, 20]
 	ldr	x1, [x28, 160]
-.L909:
-	.loc 1 1939 0
+.L933:
+	.loc 1 2015 0
 	ldr	x0, [x28, 144]
 	sxtw	x2, w2
 	bl	memcpy
-.LVL888:
-	.loc 1 1940 0
+.LVL912:
+	.loc 1 2016 0
 	ldrsw	x2, [x28, 20]
 	ldp	x0, x1, [x28, 152]
 	bl	memcpy
-.LVL889:
+.LVL913:
 	ldr	x0, [x28, 224]
-.L911:
+.L935:
 .LBB1860:
 .LBB1861:
-	.loc 1 379 0
+	.loc 1 446 0
 	ldp	w3, w16, [x0, 48]
-	.loc 1 438 0
+	.loc 1 505 0
 	mov	w15, 234881024
-	.loc 1 380 0
+	.loc 1 447 0
 	ldp	w2, w25, [x0, 56]
-	.loc 1 377 0
+	.loc 1 444 0
 	cmp	w3, 0
-	.loc 1 382 0
+	.loc 1 449 0
 	ldr	w1, [x20, 256]
-	.loc 1 377 0
+	.loc 1 444 0
 	add	w17, w3, 7
 	csel	w17, w17, w3, lt
-	.loc 1 378 0
+	.loc 1 445 0
 	add	w10, w2, 7
 	cmp	w2, 0
-	.loc 1 382 0
+	.loc 1 449 0
 	add	w18, w1, 7
-	.loc 1 378 0
+	.loc 1 445 0
 	csel	w10, w10, w2, lt
-	.loc 1 382 0
+	.loc 1 449 0
 	cmp	w1, 0
 	csel	w18, w18, w1, lt
-	.loc 1 378 0
+	.loc 1 445 0
 	asr	w10, w10, 3
-	.loc 1 382 0
+	.loc 1 449 0
 	asr	w18, w18, 3
-.LVL890:
-	.loc 1 378 0
+.LVL914:
+	.loc 1 445 0
 	add	w10, w10, 1
-.LVL891:
+.LVL915:
 	ldr	w1, [x20, 252]
-	.loc 1 385 0
+	.loc 1 452 0
 	cmp	w10, w18
 .LBE1861:
 .LBE1860:
-	.loc 1 1947 0
+	.loc 1 2023 0
 	ldr	x13, [x0, 16]
 .LBB1866:
 .LBB1862:
-	.loc 1 385 0
+	.loc 1 452 0
 	sub	w0, w18, #1
 	csel	w10, w0, w10, ge
-.LVL892:
-	.loc 1 387 0
+.LVL916:
+	.loc 1 454 0
 	cmp	w1, w25
 	sub	w1, w1, #1
-	.loc 1 444 0
+	.loc 1 511 0
 	mov	w14, -536870912
-	.loc 1 387 0
+	.loc 1 454 0
 	csel	w25, w1, w25, le
-	.loc 1 377 0
+	.loc 1 444 0
 	asr	w17, w17, 3
-.LVL893:
+.LVL917:
 	mul	w7, w16, w18
-	.loc 1 389 0
+	.loc 1 456 0
 	cmp	w16, w25
 .LBE1862:
 .LBE1866:
-	.loc 1 1947 0
+	.loc 1 2023 0
 	ldr	x9, [x28, 144]
-	.loc 1 1948 0
+	.loc 1 2024 0
 	ldp	x12, x11, [x28, 160]
 .LBB1867:
 .LBB1863:
-	.loc 1 389 0
-	bgt	.L919
-.LVL894:
+	.loc 1 456 0
+	bgt	.L943
+.LVL918:
 	.p2align 2
-.L1000:
-	.loc 1 394 0
+.L1025:
+	.loc 1 461 0
 	mov	w5, w17
 	cmp	w17, w10
-	ble	.L1001
-	b	.L936
-.LVL895:
+	ble	.L1026
+	b	.L960
+.LVL919:
 	.p2align 3
-.L920:
-	.loc 1 407 0
+.L944:
+	.loc 1 474 0
 	tst	x2, 65280
-	bne	.L921
-	.loc 1 408 0
+	bne	.L945
+	.loc 1 475 0
 	and	w27, w0, 240
 	cmp	w27, 224
-	beq	.L1049
-	.loc 1 411 0
+	beq	.L1074
+	.loc 1 478 0
 	orr	w3, w3, 240
-.L921:
-	.loc 1 413 0
+.L945:
+	.loc 1 480 0
 	tst	x2, 16711680
-	bne	.L923
-	.loc 1 414 0
+	bne	.L947
+	.loc 1 481 0
 	and	w27, w0, 3840
 	cmp	w27, 3584
-	beq	.L1050
-	.loc 1 417 0
+	beq	.L1075
+	.loc 1 484 0
 	orr	w3, w3, 3840
-.L923:
-	.loc 1 419 0
+.L947:
+	.loc 1 486 0
 	tst	x2, 4278190080
-	bne	.L925
-	.loc 1 420 0
+	bne	.L949
+	.loc 1 487 0
 	and	w27, w0, 61440
 	cmp	w27, 57344
-	beq	.L1051
-	.loc 1 423 0
+	beq	.L1076
+	.loc 1 490 0
 	orr	w3, w3, 61440
-.L925:
-	.loc 1 425 0
+.L949:
+	.loc 1 492 0
 	tst	x2, 1095216660480
-	bne	.L927
-	.loc 1 426 0
+	bne	.L951
+	.loc 1 493 0
 	and	w27, w0, 983040
 	cmp	w27, 917504
-	beq	.L1052
-	.loc 1 429 0
+	beq	.L1077
+	.loc 1 496 0
 	orr	w3, w3, 983040
-.L927:
-	.loc 1 431 0
+.L951:
+	.loc 1 498 0
 	tst	x2, 280375465082880
-	bne	.L929
-	.loc 1 432 0
+	bne	.L953
+	.loc 1 499 0
 	and	w27, w0, 15728640
 	cmp	w27, 14680064
-	beq	.L1053
-	.loc 1 435 0
+	beq	.L1078
+	.loc 1 502 0
 	orr	w3, w3, 15728640
-.L929:
-	.loc 1 437 0
+.L953:
+	.loc 1 504 0
 	tst	x2, 71776119061217280
-	bne	.L931
-	.loc 1 438 0
+	bne	.L955
+	.loc 1 505 0
 	and	w27, w0, 251658240
 	cmp	w27, w15
-	beq	.L1054
-	.loc 1 441 0
+	beq	.L1079
+	.loc 1 508 0
 	orr	w3, w3, 251658240
-.L931:
-	.loc 1 443 0
+.L955:
+	.loc 1 510 0
 	tst	x2, -72057594037927936
-	bne	.L933
-	.loc 1 444 0
+	bne	.L957
+	.loc 1 511 0
 	and	w2, w0, -268435456
-.LVL896:
+.LVL920:
 	cmp	w2, w14
-	beq	.L1055
-	.loc 1 447 0
+	beq	.L1080
+	.loc 1 514 0
 	orr	w3, w3, -268435456
-.LVL897:
-.L933:
-	.loc 1 450 0
+.LVL921:
+.L957:
+	.loc 1 517 0
 	and	w0, w0, w26
-.LVL898:
-	.loc 1 394 0
+.LVL922:
+	.loc 1 461 0
 	add	w5, w5, 1
 	eor	w0, w0, w4
 	cmp	w5, w10
 	and	w0, w0, w3
-	.loc 1 450 0
+	.loc 1 517 0
 	eor	w0, w4, w0
-	.loc 1 451 0
+	.loc 1 518 0
 	str	w0, [x9, x1]
-	.loc 1 394 0
-	bgt	.L936
-.LVL899:
-.L1001:
-	.loc 1 395 0
+	.loc 1 461 0
+	bgt	.L960
+.LVL923:
+.L1026:
+	.loc 1 462 0
 	sxtw	x1, w5
-.LVL900:
-	.loc 1 399 0
+.LVL924:
+	.loc 1 466 0
 	mov	w3, 0
-	.loc 1 398 0
+	.loc 1 465 0
 	lsl	x0, x1, 3
-	.loc 1 395 0
+	.loc 1 462 0
 	lsl	x1, x1, 2
-.LVL901:
-	.loc 1 398 0
+.LVL925:
+	.loc 1 465 0
 	add	x0, x0, x7, sxtw 3
 	add	x1, x1, x7, sxtw 2
 	ldr	x2, [x11, x0]
-	.loc 1 395 0
+	.loc 1 462 0
 	ldr	w4, [x9, x1]
-	.loc 1 396 0
+	.loc 1 463 0
 	ldr	w0, [x13, x1]
-	.loc 1 401 0
+	.loc 1 468 0
 	and	x27, x2, 255
-	.loc 1 397 0
+	.loc 1 464 0
 	ldr	w26, [x12, x1]
-.LVL902:
-	.loc 1 401 0
-	cbnz	x27, .L920
-.LVL903:
-	.loc 1 402 0
+.LVL926:
+	.loc 1 468 0
+	cbnz	x27, .L944
+.LVL927:
+	.loc 1 469 0
 	and	w27, w0, 15
-	.loc 1 405 0
+	.loc 1 472 0
 	mov	w3, 15
-	.loc 1 402 0
+	.loc 1 469 0
 	cmp	w27, 14
-	bne	.L920
-	.loc 1 403 0
+	bne	.L944
+	.loc 1 470 0
 	orr	w4, w4, w3
-.LVL904:
-	.loc 1 399 0
+.LVL928:
+	.loc 1 466 0
 	mov	w3, 0
-.LVL905:
-	b	.L920
-.LVL906:
-.L900:
+.LVL929:
+	b	.L944
+.LVL930:
+.L924:
 .LBE1863:
 .LBE1867:
-	.loc 1 1970 0
+	.loc 1 2046 0
 	add	x0, x22, 680
 	bl	down_write
-.LVL907:
-	.loc 1 1973 0
+.LVL931:
+	.loc 1 2049 0
 	ldr	x1, [x28, 216]
-	.loc 1 1971 0
+	.loc 1 2047 0
 	str	x24, [x28, 224]
-	.loc 1 1974 0
+	.loc 1 2050 0
 	ldr	w0, [x1, 40]
 	sub	w2, w0, #22
-	.loc 1 1976 0
+	.loc 1 2052 0
 	cmp	w2, 1
 	ccmp	w0, 1, 0, hi
-	bls	.L938
-	.loc 1 1977 0
+	bls	.L962
+	.loc 1 2053 0
 	ldr	w0, [x1, 64]
 	cmp	w0, 32
-	beq	.L1056
-	.loc 1 1980 0
-	ldrsw	x2, [x28, 20]
-	ldr	x1, [x1, 16]
-	ldr	x0, [x28, 152]
-	bl	memcpy
-.LVL908:
-.L1025:
+	bne	.L963
+	.loc 1 2054 0
 	ldr	w2, [x28, 20]
+	ldr	x5, [x1, 16]
+.LBB1868:
+.LBB1869:
+	.loc 1 1883 0
+	cmp	w2, 0
+.LBE1869:
+.LBE1868:
+	.loc 1 2054 0
 	ldr	x1, [x28, 152]
-.L940:
-	.loc 1 1981 0
+.LBB1871:
+.LBB1870:
+	.loc 1 1883 0
+	ble	.L964
+	mov	x0, 0
+.LVL932:
+	.p2align 2
+.L965:
+	.loc 1 1885 0
+	ldrb	w3, [x5], 2
+	.loc 1 1887 0
+	ldrb	w4, [x5, -1]
+	and	w4, w4, -16
+	orr	w3, w4, w3, lsr 4
+	.loc 1 1888 0
+	strb	w3, [x1, x0]
+	add	x0, x0, 1
+	.loc 1 1883 0
+	cmp	w2, w0
+	bgt	.L965
+.L1050:
+	ldr	w2, [x28, 20]
+	ldr	x1, [x28, 152]
+.L964:
+.LBE1870:
+.LBE1871:
+	.loc 1 2057 0
 	ldr	x0, [x28, 144]
 	sxtw	x2, w2
 	bl	memcpy
-.LVL909:
-	b	.L942
-.L904:
-	.loc 1 1916 0
+.LVL933:
+	b	.L966
+.L928:
+	.loc 1 1992 0
 	mov	w4, 0
-.LVL910:
-	b	.L903
-.LVL911:
+.LVL934:
+	b	.L927
+.LVL935:
 	.p2align 3
-.L891:
-	.loc 1 1904 0
+.L915:
+	.loc 1 1980 0
 	mov	x0, x24
 	str	x24, [x28, 216]
-	b	.L892
-.LVL912:
+	b	.L916
+.LVL936:
 	.p2align 3
-.L880:
-	.loc 1 1874 0
+.L904:
+	.loc 1 1950 0
 	cmp	w0, 18
 	ccmp	w0, 21, 4, ne
-	bne	.L884
-	.loc 1 1875 0
+	bne	.L908
+	.loc 1 1951 0
 	str	wzr, [x28, 632]
-	b	.L879
+	b	.L903
 	.p2align 3
-.L1031:
-	.loc 1 1852 0
+.L1056:
+	.loc 1 1928 0
 	str	wzr, [x28, 628]
-	.loc 1 1851 0
+	.loc 1 1927 0
 	str	wzr, [x28, 632]
-	b	.L879
+	b	.L903
 	.p2align 3
-.L1037:
-.LBB1868:
-	.loc 1 2135 0 discriminator 1
+.L1062:
+.LBB1872:
+	.loc 1 2215 0 discriminator 1
 	ldr	w0, [x28, 96]
-	cbnz	w0, .L964
-.LBB1869:
-	.loc 1 2135 0 is_stmt 0 discriminator 3
+	cbnz	w0, .L989
+.LBB1873:
+	.loc 1 2215 0 is_stmt 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL913:
-	b	.L968
+.LVL937:
+	b	.L993
 	.p2align 3
-.L1057:
-.LBB1870:
-	.loc 1 2135 0 discriminator 7
+.L1081:
+.LBB1874:
+	.loc 1 2215 0 discriminator 7
 	ldr	w1, [x28, 96]
-	cbnz	w1, .L965
-.LVL914:
-	.loc 1 2135 0 discriminator 9
-	cbnz	x0, .L1026
-	.loc 1 2135 0 discriminator 11
+	cbnz	w1, .L990
+.LVL938:
+	.loc 1 2215 0 discriminator 9
+	cbnz	x0, .L1051
+	.loc 1 2215 0 discriminator 11
 	bl	schedule
-.LVL915:
-.L968:
-	.loc 1 2135 0 discriminator 13
+.LVL939:
+.L993:
+	.loc 1 2215 0 discriminator 13
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL916:
+.LVL940:
 	ldr	w1, [x28, 44]
-	cbnz	w1, .L1057
-.L965:
-.LBE1870:
-	.loc 1 2135 0 discriminator 8
+	cbnz	w1, .L1081
+.L990:
+.LBE1874:
+	.loc 1 2215 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL917:
+.LVL941:
 	ldr	w0, [x28, 44]
-.LBE1869:
-.LBE1868:
-	.loc 1 2138 0 is_stmt 1 discriminator 8
-	cbnz	w0, .L1026
-	.loc 1 2143 0
+.LBE1873:
+.LBE1872:
+	.loc 1 2218 0 is_stmt 1 discriminator 8
+	cbnz	w0, .L1051
+	.loc 1 2223 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	bne	.L1026
+	bne	.L1051
 	.p2align 2
-.L1038:
-.LBB1871:
-.LBB1872:
+.L1063:
+.LBB1875:
+.LBB1876:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.13
-.LVL918:
-	b	.L1026
+.LVL942:
+	b	.L1051
 	.p2align 3
-.L884:
-.LBE1872:
-.LBE1871:
-	.loc 1 1877 0
+.L908:
+.LBE1876:
+.LBE1875:
+	.loc 1 1953 0
 	ldr	w1, [x28, 632]
 	cmp	w1, 0
 	ccmp	w0, 1, 4, ne
-	beq	.L879
-	.loc 1 1878 0
+	beq	.L903
+	.loc 1 1954 0
 	add	x0, x22, 680
 	bl	down_write
-.LVL919:
-	.loc 1 1879 0
+.LVL943:
+	.loc 1 1955 0
 	ldr	w0, [x24, 64]
 	cmp	w0, 32
-	bne	.L885
-	.loc 1 1880 0
+	bne	.L909
+	.loc 1 1956 0
 	ldr	w4, [x28, 20]
-.LBB1873:
-.LBB1874:
-	.loc 1 1807 0
+.LBB1877:
+.LBB1878:
+	.loc 1 1883 0
 	mov	x0, 0
 	ldr	x3, [x24, 16]
-.LVL920:
+.LVL944:
 	cmp	w4, 0
-.LBE1874:
-.LBE1873:
-	.loc 1 1880 0
+.LBE1878:
+.LBE1877:
+	.loc 1 1956 0
 	ldr	x5, [x28, 160]
-.LBB1876:
-.LBB1875:
-	.loc 1 1807 0
-	ble	.L887
+.LBB1880:
+.LBB1879:
+	.loc 1 1883 0
+	ble	.L911
 	.p2align 2
-.L1002:
-	.loc 1 1809 0
+.L1027:
+	.loc 1 1885 0
 	ldrb	w1, [x3], 2
-	.loc 1 1811 0
+	.loc 1 1887 0
 	ldrb	w2, [x3, -1]
 	and	w2, w2, -16
 	orr	w1, w2, w1, lsr 4
-	.loc 1 1812 0
+	.loc 1 1888 0
 	strb	w1, [x5, x0]
 	add	x0, x0, 1
-	.loc 1 1807 0
-	cmp	w4, w0
-	bgt	.L1002
-.L887:
-.LBE1875:
-.LBE1876:
 	.loc 1 1883 0
+	cmp	w4, w0
+	bgt	.L1027
+.L911:
+.LBE1879:
+.LBE1880:
+	.loc 1 1959 0
 	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL921:
-	.loc 1 1884 0
+.LVL945:
+	.loc 1 1960 0
 	mov	x0, x24
 	bl	ebc_buf_release
-.LVL922:
-	.loc 1 1886 0
+.LVL946:
+	.loc 1 1962 0
 	ldr	x1, [x28, 224]
 	mov	x4, x28
 	ldr	x0, [x28, 144]
@@ -10745,720 +11016,707 @@ ebc_thread:
 	ldr	w5, [x1, 40]
 	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
-.LVL923:
-	.loc 1 1889 0
+.LVL947:
+	.loc 1 1965 0
 	add	x0, x22, 680
 	bl	up_write
-.LVL924:
-	.loc 1 1890 0
+.LVL948:
+	.loc 1 1966 0
 	ldr	w0, [x28, 44]
-	cbnz	w0, .L871
-	.loc 1 1891 0
+	cbnz	w0, .L895
+	.loc 1 1967 0
 	mov	w0, 1
 	str	w0, [x28, 44]
-	.loc 1 1893 0
+	.loc 1 1969 0
 	ldr	w0, [x28, 200]
-	.loc 1 1892 0
+	.loc 1 1968 0
 	str	wzr, [x28, 92]
-	.loc 1 1893 0
-	cbz	w0, .L1058
-.L890:
-	.loc 1 1895 0
+	.loc 1 1969 0
+	cbz	w0, .L1082
+.L914:
+	.loc 1 1971 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC85
 	ldrb	w2, [x28, 48]
 	add	x1, x1, :lo12:.LC85
 	bl	_dev_info
-.LVL925:
-	.loc 1 1896 0
+.LVL949:
+	.loc 1 1972 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL926:
-	b	.L871
-.LVL927:
+.LVL950:
+	b	.L895
+.LVL951:
 	.p2align 3
-.L1042:
-	.loc 1 2057 0
+.L1067:
+	.loc 1 2137 0
 	ldr	w0, [x28, 64]
 	cmp	w0, 0
-	ble	.L952
-	.loc 1 2058 0
+	ble	.L977
+	.loc 1 2138 0
 	ldr	w1, [x29, 108]
-.LVL928:
+.LVL952:
 	add	w1, w1, 1
 	str	w1, [x29, 108]
-	.loc 1 2059 0
+	.loc 1 2139 0
 	cmp	w0, w1
-	bgt	.L952
-	.loc 1 2060 0
+	bgt	.L977
+	.loc 1 2140 0
 	mov	w0, 2
 	str	w0, [x24, 40]
-	.loc 1 2061 0
+	.loc 1 2141 0
 	str	wzr, [x29, 108]
-	.loc 1 2065 0
+	.loc 1 2145 0
 	ldr	w0, [x28, 200]
-	cbnz	w0, .L953
-.L1043:
-	.loc 1 2066 0
+	cbnz	w0, .L978
+.L1068:
+	.loc 1 2146 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
-.LVL929:
-	.loc 1 2068 0
+.LVL953:
+	.loc 1 2148 0
 	ldr	x0, [x28, 224]
 	ldr	w1, [x0, 64]
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL930:
-	cbnz	w0, .L1059
-.L954:
-	.loc 1 2080 0
+.LVL954:
+	cbnz	w0, .L1083
+.L979:
+	.loc 1 2160 0
 	ldr	x0, [x28, 224]
 	adrp	x1, .LC93
-	.loc 1 2077 0
+	.loc 1 2157 0
 	ldr	w3, [x28, 112]
-	.loc 1 2080 0
+	.loc 1 2160 0
 	add	x1, x1, :lo12:.LC93
-	.loc 1 2077 0
+	.loc 1 2157 0
 	strb	w3, [x28, 48]
-	.loc 1 2080 0
+	.loc 1 2160 0
 	and	w3, w3, 255
 	ldr	w2, [x0, 40]
 	ldr	x0, [x28, 104]
 	bl	_dev_info
-.LVL931:
-	.loc 1 2081 0
+.LVL955:
+	.loc 1 2161 0
 	mov	w0, 1
 	str	w0, [x28, 44]
-	.loc 1 2082 0
+	.loc 1 2162 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL932:
-	.loc 1 2084 0
+.LVL956:
+	.loc 1 2164 0
 	ldr	x1, [x25, #:lo12:jiffies]
 	add	x0, x20, 688
 	str	x0, [x29, 96]
 	add	x1, x1, 900
 	bl	mod_timer
-.LVL933:
-.LBB1877:
-	.loc 1 2085 0
+.LVL957:
+.LBB1881:
+	.loc 1 2165 0
 	ldr	w0, [x28, 92]
-	cbz	w0, .L1060
-.L957:
-.LVL934:
-.L955:
-.LBE1877:
-	.loc 1 2087 0 discriminator 11
+	cbz	w0, .L1084
+.L982:
+.LVL958:
+.L980:
+.LBE1881:
+	.loc 1 2167 0 discriminator 11
 	ldr	x2, [x25, #:lo12:jiffies]
 	mov	x1, 402653184
 	ldr	x0, [x29, 96]
-.LVL935:
+.LVL959:
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL936:
-	.loc 1 2088 0 discriminator 11
+.LVL960:
+	.loc 1 2168 0 discriminator 11
 	str	wzr, [x28, 92]
-	.loc 1 2106 0 discriminator 11
+	.loc 1 2186 0 discriminator 11
 	ldr	x0, [x28, 224]
-	.loc 1 2090 0 discriminator 11
+	.loc 1 2170 0 discriminator 11
 	str	x26, [x28, 216]
-	.loc 1 2106 0 discriminator 11
+	.loc 1 2186 0 discriminator 11
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
-	bne	.L959
-.LVL937:
-.L1044:
-	.loc 1 2109 0
+	bne	.L984
+.LVL961:
+.L1069:
+	.loc 1 2189 0
 	ldr	x0, [x28, 104]
-	.loc 1 2107 0
+	.loc 1 2187 0
 	mov	w25, 1
-.LVL938:
-	.loc 1 2108 0
+.LVL962:
+	.loc 1 2188 0
 	str	wzr, [x28, 204]
-	.loc 1 2109 0
+	.loc 1 2189 0
 	adrp	x1, .LC95
-	.loc 1 2107 0
+	.loc 1 2187 0
 	str	w25, [x28, 624]
-	.loc 1 2109 0
+	.loc 1 2189 0
 	add	x1, x1, :lo12:.LC95
 	bl	_dev_info
-.LVL939:
-	.loc 1 2110 0
+.LVL963:
+	.loc 1 2190 0
 	mov	w2, w25
 	mov	w1, w25
 	add	x0, x22, 328
 	bl	__wake_up_sync
-.LVL940:
-	.loc 1 2123 0
+.LVL964:
+	.loc 1 2203 0
 	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL941:
-	.loc 1 2125 0
+.LVL965:
+	.loc 1 2205 0
 	ldr	w0, [x28, 444]
-	cbz	w0, .L962
-.LVL942:
+	cbz	w0, .L987
+.LVL966:
 	.p2align 2
-.L1046:
-	.loc 1 2126 0
+.L1071:
+	.loc 1 2206 0
 	ldr	x0, [x28, 216]
 	bl	ebc_buf_release
-.LVL943:
-	b	.L963
-.LVL944:
-.L1033:
-	.loc 1 1910 0
+.LVL967:
+	b	.L988
+.LVL968:
+.L1058:
+	.loc 1 1986 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC87
 	add	x1, x1, :lo12:.LC87
 	bl	_dev_info
-.LVL945:
-.LBB1881:
-	.loc 1 1911 0
+.LVL969:
+.LBB1885:
+	.loc 1 1987 0
 	ldr	w0, [x28, 92]
-	cbz	w0, .L1061
-.L897:
-.LVL946:
-.L895:
-.LBE1881:
-	.loc 1 1912 0 discriminator 11
+	cbz	w0, .L1085
+.L921:
+.LVL970:
+.L919:
+.LBE1885:
+	.loc 1 1988 0 discriminator 11
 	ldr	x0, [x28, 104]
-.LVL947:
+.LVL971:
 	adrp	x1, .LC88
 	add	x1, x1, :lo12:.LC88
 	bl	_dev_info
-.LVL948:
-	b	.L1023
-.L938:
-	.loc 1 1984 0
-	ldr	x1, [x24, 16]
+.LVL972:
+	b	.L1048
+.L962:
+	.loc 1 2060 0
+	ldr	w0, [x24, 64]
+	.loc 1 2061 0
 	mov	x3, x28
-	ldr	x0, [x28, 144]
+	ldr	x1, [x24, 16]
+	.loc 1 2060 0
+	cmp	w0, 32
+	.loc 1 2061 0
 	ldr	x2, [x28, 168]
+	ldr	x0, [x28, 144]
+	.loc 1 2060 0
+	beq	.L1086
+	.loc 1 2064 0
 	bl	refresh_new_image_auto
-.LVL949:
-.L942:
-	.loc 1 1987 0
+.LVL973:
+.L966:
+	.loc 1 2067 0
 	add	x0, x22, 680
 	bl	up_write
-.LVL950:
-	.loc 1 1989 0
+.LVL974:
+	.loc 1 2069 0
 	ldr	w0, [x28, 44]
-	cbnz	w0, .L916
-	.loc 1 1992 0
+	cbnz	w0, .L940
+	.loc 1 2072 0
 	ldr	w0, [x28, 200]
-	.loc 1 1990 0
+	.loc 1 2070 0
 	mov	w1, 1
-	.loc 1 1991 0
+	.loc 1 2071 0
 	str	wzr, [x28, 92]
-	.loc 1 1990 0
+	.loc 1 2070 0
 	str	w1, [x28, 44]
-	.loc 1 1992 0
-	cbz	w0, .L1062
-.L943:
-	.loc 1 1994 0
+	.loc 1 2072 0
+	cbz	w0, .L1087
+.L968:
+	.loc 1 2074 0
 	mov	w1, 16
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL951:
+.LVL975:
 	cmn	w0, #1
-	beq	.L1063
-	.loc 1 1999 0
+	beq	.L1088
+	.loc 1 2079 0
 	ldr	w3, [x28, 112]
-	.loc 1 2002 0
+	.loc 1 2082 0
 	adrp	x1, .LC92
 	ldr	x0, [x28, 104]
 	add	x1, x1, :lo12:.LC92
-	.loc 1 1999 0
+	.loc 1 2079 0
 	strb	w3, [x28, 48]
-	.loc 1 2002 0
+	.loc 1 2082 0
 	and	w2, w3, 255
-	.loc 1 2000 0
+	.loc 1 2080 0
 	lsr	w3, w3, 8
 	strb	w3, [x28, 49]
-	.loc 1 2002 0
+	.loc 1 2082 0
 	bl	_dev_info
-.LVL952:
-	.loc 1 2003 0
+.LVL976:
+	.loc 1 2083 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL953:
-	b	.L916
-.L1047:
-	.loc 1 1943 0
+.LVL977:
+	b	.L940
+.L1072:
+	.loc 1 2019 0
 	cmp	w0, 0
 	mov	x0, x24
 	ccmp	w1, 1, 0, ne
-	bhi	.L911
-	.loc 1 1944 0
+	bhi	.L935
+	.loc 1 2020 0
 	ldrsw	x2, [x28, 20]
 	ldp	x1, x0, [x28, 152]
 	bl	memcpy
-.LVL954:
+.LVL978:
 	ldr	x0, [x28, 224]
-	b	.L911
-.LVL955:
+	b	.L935
+.LVL979:
 	.p2align 3
-.L1050:
-.LBB1885:
+.L1075:
+.LBB1889:
 .LBB1864:
-	.loc 1 415 0
+	.loc 1 482 0
 	orr	w4, w4, 3840
-	b	.L923
+	b	.L947
 	.p2align 3
-.L1051:
-	.loc 1 421 0
+.L1076:
+	.loc 1 488 0
 	orr	w4, w4, 61440
-	b	.L925
+	b	.L949
 	.p2align 3
-.L1052:
-	.loc 1 427 0
+.L1077:
+	.loc 1 494 0
 	orr	w4, w4, 983040
-	b	.L927
+	b	.L951
 	.p2align 3
-.L1053:
-	.loc 1 433 0
+.L1078:
+	.loc 1 500 0
 	orr	w4, w4, 15728640
-	b	.L929
+	b	.L953
 	.p2align 3
-.L1054:
-	.loc 1 439 0
+.L1079:
+	.loc 1 506 0
 	orr	w4, w4, 251658240
-	b	.L931
-.LVL956:
+	b	.L955
+.LVL980:
 	.p2align 3
-.L1055:
-	.loc 1 445 0
+.L1080:
+	.loc 1 512 0
 	orr	w4, w4, -268435456
-.LVL957:
-	.loc 1 450 0
+.LVL981:
+	.loc 1 517 0
 	and	w0, w0, w26
-.LVL958:
+.LVL982:
 	eor	w0, w0, w4
-.LVL959:
-	.loc 1 394 0
+.LVL983:
+	.loc 1 461 0
 	add	w5, w5, 1
 	and	w0, w0, w3
 	cmp	w5, w10
-	.loc 1 450 0
+	.loc 1 517 0
 	eor	w0, w4, w0
-	.loc 1 451 0
+	.loc 1 518 0
 	str	w0, [x9, x1]
-	.loc 1 394 0
-	ble	.L1001
-.LVL960:
+	.loc 1 461 0
+	ble	.L1026
+.LVL984:
 	.p2align 2
-.L936:
-	.loc 1 389 0
+.L960:
+	.loc 1 456 0
 	add	w16, w16, 1
 	add	w7, w7, w18
 	cmp	w16, w25
-	ble	.L1000
-.L919:
+	ble	.L1025
+.L943:
 .LBE1864:
-.LBE1885:
-	.loc 1 1951 0
+.LBE1889:
+	.loc 1 2027 0
 	ldr	w0, [x28, 44]
-	cbnz	w0, .L916
-	.loc 1 1954 0
+	cbnz	w0, .L940
+	.loc 1 2030 0
 	ldr	w0, [x28, 200]
-	.loc 1 1952 0
+	.loc 1 2028 0
 	mov	w1, 1
-	.loc 1 1953 0
+	.loc 1 2029 0
 	str	wzr, [x28, 92]
-	.loc 1 1952 0
+	.loc 1 2028 0
 	str	w1, [x28, 44]
-	.loc 1 1954 0
-	cbz	w0, .L1064
-.L937:
-	.loc 1 1956 0
+	.loc 1 2030 0
+	cbz	w0, .L1089
+.L961:
+	.loc 1 2032 0
 	mov	w1, 16
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL961:
+.LVL985:
 	cmn	w0, #1
-	beq	.L916
-	.loc 1 1960 0
+	beq	.L940
+	.loc 1 2036 0
 	ldr	w2, [x28, 112]
-	.loc 1 1963 0
+	.loc 1 2039 0
 	adrp	x1, .LC90
 	ldr	x0, [x28, 104]
 	add	x1, x1, :lo12:.LC90
-	.loc 1 1960 0
+	.loc 1 2036 0
 	strb	w2, [x28, 48]
-	.loc 1 1961 0
+	.loc 1 2037 0
 	lsr	w3, w2, 8
-	.loc 1 1963 0
+	.loc 1 2039 0
 	and	w2, w2, 255
-	.loc 1 1961 0
+	.loc 1 2037 0
 	strb	w3, [x28, 49]
-	.loc 1 1963 0
+	.loc 1 2039 0
 	and	w3, w3, 255
 	bl	_dev_info
-.LVL962:
-	.loc 1 1964 0
+.LVL986:
+	.loc 1 2040 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL963:
-	b	.L916
-.LVL964:
+.LVL987:
+	b	.L940
+.LVL988:
 	.p2align 3
-.L1049:
-.LBB1886:
+.L1074:
+.LBB1890:
 .LBB1865:
-	.loc 1 409 0
+	.loc 1 476 0
 	orr	w4, w4, 240
-	b	.L921
-.LVL965:
-.L1045:
+	b	.L945
+.LVL989:
+.L1070:
 .LBE1865:
-.LBE1886:
-	.loc 1 2113 0
+.LBE1890:
+	.loc 1 2193 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC96
 	add	x1, x1, :lo12:.LC96
 	bl	_dev_info
-.LVL966:
-	.loc 1 2114 0
+.LVL990:
+	.loc 1 2194 0
 	ldr	w0, [x28, 616]
-	cbz	w0, .L1065
-.L961:
-	.loc 1 2119 0
+	cbz	w0, .L1090
+.L986:
+	.loc 1 2199 0
 	add	x0, x21, :lo12:.LANCHOR0
-	.loc 1 2117 0
+	.loc 1 2197 0
 	mov	w2, 1
-	.loc 1 2116 0
+	.loc 1 2196 0
 	str	wzr, [x28, 204]
-	.loc 1 2120 0
+	.loc 1 2200 0
 	mov	w1, w2
-	.loc 1 2117 0
+	.loc 1 2197 0
 	str	w2, [x28, 616]
-	.loc 1 2118 0
+	.loc 1 2198 0
 	str	wzr, [x28, 632]
-	.loc 1 2119 0
+	.loc 1 2199 0
 	str	wzr, [x0, 16]
-	.loc 1 2120 0
+	.loc 1 2200 0
 	add	x0, x22, 328
 	bl	__wake_up_sync
-.LVL967:
-	b	.L960
-.LVL968:
-.L905:
-	.loc 1 1922 0
+.LVL991:
+	b	.L985
+.LVL992:
+.L929:
+	.loc 1 1998 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC89
 	add	x1, x1, :lo12:.LC89
 	bl	_dev_info
-.LVL969:
-	.loc 1 1923 0
+.LVL993:
+	.loc 1 1999 0
 	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL970:
-	.loc 1 1924 0
+.LVL994:
+	.loc 1 2000 0
 	mov	x0, x24
 	bl	ebc_buf_release
-.LVL971:
-	.loc 1 1926 0
-	b	.L871
-.LVL972:
-.L1041:
-	.loc 1 2044 0
+.LVL995:
+	.loc 1 2002 0
+	b	.L895
+.LVL996:
+.L1066:
+	.loc 1 2124 0
 	ldr	w2, [x28, 20]
-.LBB1887:
+.LBB1891:
 .LBB1859:
-	.loc 1 1786 0
+	.loc 1 1862 0
 	cmp	w0, 32
-.LVL973:
+.LVL997:
 	lsl	w0, w2, 1
 	csel	w2, w0, w2, eq
-	.loc 1 1787 0
+	.loc 1 1863 0
 	cmp	w2, 0
 	add	w0, w2, 7
 	csel	w0, w0, w2, lt
-.LVL974:
+.LVL998:
 	asr	w0, w0, 3
-.LVL975:
+.LVL999:
 	cmp	w0, 0
-	ble	.L948
+	ble	.L973
 	ldr	x7, [x1, 16]
 	ldr	x5, [x24, 16]
-	.loc 1 1791 0
+	.loc 1 1867 0
 	ldr	x2, [x7]
 	ldr	x1, [x5]
 	cmp	x2, x1
-	bne	.L946
+	bne	.L971
 	sub	w1, w0, #1
 	mov	x0, 8
 	add	x1, x1, 1
 	lsl	x1, x1, 3
-	b	.L950
+	b	.L975
 	.p2align 3
-.L951:
-	.loc 1 1788 0
+.L976:
+	.loc 1 1864 0
 	ldr	x3, [x5, x0]
 	add	x0, x0, 8
-	.loc 1 1789 0
+	.loc 1 1865 0
 	add	x2, x7, x0
-	.loc 1 1791 0
+	.loc 1 1867 0
 	ldr	x2, [x2, -8]
 	cmp	x3, x2
-	bne	.L946
-.L950:
-	.loc 1 1787 0
+	bne	.L971
+.L975:
+	.loc 1 1863 0
 	cmp	x0, x1
-	bne	.L951
-.L948:
+	bne	.L976
+.L973:
 .LBE1859:
-.LBE1887:
-	.loc 1 2045 0
+.LBE1891:
+	.loc 1 2125 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC97
 	add	x1, x1, :lo12:.LC97
 	bl	_dev_info
-.LVL976:
-	.loc 1 2047 0
+.LVL1000:
+	.loc 1 2127 0
 	str	x26, [x28, 216]
-	.loc 1 2049 0
-	b	.L916
-.LVL977:
-.L1056:
-	.loc 1 1978 0
-	ldr	w2, [x28, 20]
-	ldr	x5, [x1, 16]
-.LBB1888:
-.LBB1889:
-	.loc 1 1807 0
-	cmp	w2, 0
-.LBE1889:
-.LBE1888:
-	.loc 1 1978 0
-	ldr	x1, [x28, 152]
-.LBB1891:
-.LBB1890:
-	.loc 1 1807 0
-	ble	.L940
-	mov	x0, 0
-.LVL978:
-	.p2align 2
-.L941:
-	.loc 1 1809 0
-	ldrb	w3, [x5], 2
-	.loc 1 1811 0
-	ldrb	w4, [x5, -1]
-	and	w4, w4, -16
-	orr	w3, w4, w3, lsr 4
-	.loc 1 1812 0
-	strb	w3, [x1, x0]
-	add	x0, x0, 1
-	.loc 1 1807 0
-	cmp	w2, w0
-	bgt	.L941
-	b	.L1025
-.LVL979:
-.L1065:
-.LBE1890:
-.LBE1891:
-	.loc 1 2115 0
+	.loc 1 2129 0
+	b	.L940
+.LVL1001:
+.L1090:
+	.loc 1 2195 0
 	mov	x0, 2
 	bl	ebc_notify
-.LVL980:
-	b	.L961
-.LVL981:
-.L1048:
-	.loc 1 1936 0
+.LVL1002:
+	b	.L986
+.LVL1003:
+.L1073:
+	.loc 1 2012 0
 	ldr	x5, [x2, 16]
 	ldr	w2, [x28, 20]
 	ldr	x1, [x28, 160]
 .LBB1892:
 .LBB1893:
-	.loc 1 1807 0
+	.loc 1 1883 0
 	cmp	w2, 0
-	ble	.L909
+	ble	.L933
 	mov	x0, 0
-.LVL982:
+.LVL1004:
 	.p2align 2
-.L910:
-	.loc 1 1809 0
+.L934:
+	.loc 1 1885 0
 	ldrb	w3, [x5], 2
-	.loc 1 1811 0
+	.loc 1 1887 0
 	ldrb	w4, [x5, -1]
 	and	w4, w4, -16
 	orr	w3, w4, w3, lsr 4
-	.loc 1 1812 0
+	.loc 1 1888 0
 	strb	w3, [x1, x0]
 	add	x0, x0, 1
-	.loc 1 1807 0
+	.loc 1 1883 0
 	cmp	w2, w0
-	bgt	.L910
-	b	.L1024
-.LVL983:
-.L1064:
+	bgt	.L934
+	b	.L1049
+.LVL1005:
+.L1089:
 .LBE1893:
 .LBE1892:
-	.loc 1 1955 0
+	.loc 1 2031 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
-.LVL984:
-	b	.L937
-.LVL985:
-.L1061:
+.LVL1006:
+	b	.L961
+.LVL1007:
+.L1085:
 .LBB1894:
-.LBB1882:
-.LBB1883:
-	.loc 1 1911 0 discriminator 1
+.LBB1886:
+.LBB1887:
+	.loc 1 1987 0 discriminator 1
 	add	x26, x22, 352
-.LVL986:
-.LBE1883:
+.LVL1008:
+.LBE1887:
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL987:
-	b	.L898
+.LVL1009:
+	b	.L922
 	.p2align 3
-.L1066:
-.LVL988:
-.LBB1884:
-	.loc 1 1911 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L895
-	.loc 1 1911 0 discriminator 7
+.L1091:
+.LVL1010:
+.LBB1888:
+	.loc 1 1987 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L919
+	.loc 1 1987 0 discriminator 7
 	bl	schedule
-.LVL989:
-.L898:
-	.loc 1 1911 0 discriminator 9
+.LVL1011:
+.L922:
+	.loc 1 1987 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x26
 	bl	prepare_to_wait_event
-.LVL990:
+.LVL1012:
 	ldr	w1, [x28, 92]
-	cbz	w1, .L1066
-.LBE1884:
-	.loc 1 1911 0 discriminator 4
+	cbz	w1, .L1091
+.LBE1888:
+	.loc 1 1987 0 discriminator 4
 	mov	x0, x26
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL991:
-	b	.L895
-.LVL992:
-.L1032:
-.LBE1882:
+.LVL1013:
+	b	.L919
+.LVL1014:
+.L1057:
+.LBE1886:
 .LBE1894:
-	.loc 1 1856 0 is_stmt 1
+	.loc 1 1932 0 is_stmt 1
 	str	wzr, [x28, 616]
-	.loc 1 1857 0
+	.loc 1 1933 0
 	mov	x0, 3
 	bl	ebc_notify
-.LVL993:
-	.loc 1 1858 0
+.LVL1015:
+	.loc 1 1934 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC83
 	add	x1, x1, :lo12:.LC83
 	bl	_dev_info
-.LVL994:
-	.loc 1 1861 0
+.LVL1016:
+	.loc 1 1937 0
 	ldr	w2, [x20, 204]
-	.loc 1 1859 0
+	.loc 1 1935 0
 	add	x3, x21, :lo12:.LANCHOR0
-	.loc 1 1861 0
+	.loc 1 1937 0
 	ldr	w1, [x24, 64]
-	.loc 1 1859 0
+	.loc 1 1935 0
 	mov	w4, 1
-	.loc 1 1861 0
+	.loc 1 1937 0
 	ldr	x0, [x24, 16]
-	.loc 1 1860 0
+	.loc 1 1936 0
 	stp	w4, wzr, [x3, 16]
-	.loc 1 1861 0
+	.loc 1 1937 0
 	bl	check_black_percent.isra.15
-.LVL995:
-	cbnz	w0, .L871
-	b	.L879
-.LVL996:
-.L1060:
+.LVL1017:
+	cbnz	w0, .L895
+	b	.L903
+.LVL1018:
+.L1084:
 .LBB1895:
-.LBB1878:
-.LBB1879:
-	.loc 1 2085 0 discriminator 1
+.LBB1882:
+.LBB1883:
+	.loc 1 2165 0 discriminator 1
 	add	x27, x22, 352
-.LBE1879:
+.LBE1883:
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL997:
-	b	.L958
+.LVL1019:
+	b	.L983
 	.p2align 3
-.L1067:
-.LVL998:
-.LBB1880:
-	.loc 1 2085 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L955
-	.loc 1 2085 0 discriminator 7
+.L1092:
+.LVL1020:
+.LBB1884:
+	.loc 1 2165 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L980
+	.loc 1 2165 0 discriminator 7
 	bl	schedule
-.LVL999:
-.L958:
-	.loc 1 2085 0 discriminator 9
+.LVL1021:
+.L983:
+	.loc 1 2165 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x27
 	bl	prepare_to_wait_event
-.LVL1000:
+.LVL1022:
 	ldr	w1, [x28, 92]
-	cbz	w1, .L1067
-.LBE1880:
-	.loc 1 2085 0 discriminator 4
+	cbz	w1, .L1092
+.LBE1884:
+	.loc 1 2165 0 discriminator 4
 	mov	x0, x27
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL1001:
-	b	.L955
-.LVL1002:
-.L1035:
-.LBE1878:
+.LVL1023:
+	b	.L980
+.LVL1024:
+.L1060:
+.LBE1882:
 .LBE1895:
 .LBB1896:
 .LBB1897:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.13
-.LVL1003:
-	b	.L873
-.L885:
+.LVL1025:
+	b	.L897
+.LVL1026:
+.L1086:
 .LBE1897:
 .LBE1896:
-	.loc 1 1882 0 is_stmt 1
+	.loc 1 2061 0 is_stmt 1
+	bl	refresh_new_image_auto_32
+.LVL1027:
+	b	.L966
+.LVL1028:
+.L909:
+	.loc 1 1958 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x24, 16]
 	ldr	x0, [x28, 160]
 	bl	memcpy
-.LVL1004:
-	b	.L887
-.LVL1005:
-.L1063:
-	.loc 1 1995 0
+.LVL1029:
+	b	.L911
+.LVL1030:
+.L1088:
+	.loc 1 2075 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC91
 	add	x1, x1, :lo12:.LC91
 	bl	_dev_err
-.LVL1006:
-	.loc 1 1996 0
-	b	.L916
-.L1062:
-	.loc 1 1993 0
+.LVL1031:
+	.loc 1 2076 0
+	b	.L940
+.L1087:
+	.loc 1 2073 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
-.LVL1007:
-	b	.L943
-.LVL1008:
-.L1058:
-	.loc 1 1894 0
+.LVL1032:
+	b	.L968
+.L963:
+	.loc 1 2056 0
+	ldrsw	x2, [x28, 20]
+	ldr	x1, [x1, 16]
+	ldr	x0, [x28, 152]
+	bl	memcpy
+.LVL1033:
+	b	.L1050
+.LVL1034:
+.L1082:
+	.loc 1 1970 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.17
-.LVL1009:
-	b	.L890
-.L1036:
-	.loc 1 2153 0
+.LVL1035:
+	b	.L914
+.L1061:
+	.loc 1 2233 0
 	bl	__stack_chk_fail
-.LVL1010:
+.LVL1036:
 	.cfi_endproc
-.LFE2837:
+.LFE2838:
 	.size	ebc_thread, .-ebc_thread
 	.data
 	.align	3
@@ -11608,24 +11866,24 @@ resume_frame_count:
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.35197, %object
-	.size	__func__.35197, 11
-__func__.35197:
+	.type	__func__.35218, %object
+	.size	__func__.35218, 11
+__func__.35218:
 	.string	"ebc_io_ctl"
 	.align	3
 	.set	.LANCHOR3,. + 0
-	.type	__func__.34956, %object
-	.size	__func__.34956, 16
-__func__.34956:
+	.type	__func__.34977, %object
+	.size	__func__.34977, 16
+__func__.34977:
 	.string	"ebc_frame_start"
-	.type	__func__.35507, %object
-	.size	__func__.35507, 12
-__func__.35507:
+	.type	__func__.35528, %object
+	.size	__func__.35528, 12
+__func__.35528:
 	.string	"ebc_suspend"
 	.zero	4
-	.type	__func__.35441, %object
-	.size	__func__.35441, 19
-__func__.35441:
+	.type	__func__.35462, %object
+	.size	__func__.35462, 19
+__func__.35462:
 	.string	"ebc_lut_table_init"
 	.zero	5
 	.type	ebc_match, %object
@@ -11665,9 +11923,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init3091, %object
-	.size	__addressable_ebc_init3091, 8
-__addressable_ebc_init3091:
+	.type	__addressable_ebc_init3171, %object
+	.size	__addressable_ebc_init3171, 8
+__addressable_ebc_init3171:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -11725,7 +11983,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC16:
-	.string	"2.17"
+	.string	"2.18"
 	.zero	3
 .LC17:
 	.string	"%s\n"
@@ -12187,15 +12445,15 @@ __exitcall_ebc_exit:
 	.file 214 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x1545d
+	.4byte	0x1557e
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF3338
-	.byte	0x1
 	.4byte	.LASF3339
+	.byte	0x1
 	.4byte	.LASF3340
+	.4byte	.LASF3341
 	.4byte	.Ldebug_ranges0+0x12c0
 	.8byte	0
 	.4byte	.Ldebug_line0
@@ -39906,7 +40164,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3028
 	.byte	0x1
-	.2byte	0x718
+	.2byte	0x764
 	.4byte	0xc6
 	.uleb128 0x9
 	.byte	0x3
@@ -39914,7 +40172,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3029
 	.byte	0x1
-	.2byte	0x719
+	.2byte	0x765
 	.4byte	0xc6
 	.uleb128 0x9
 	.byte	0x3
@@ -39922,7 +40180,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0x9b3
+	.2byte	0xa03
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
@@ -39930,7 +40188,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0x9bd
+	.2byte	0xa0d
 	.4byte	0xc680
 	.uleb128 0x9
 	.byte	0x3
@@ -39938,7 +40196,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0x9da
+	.2byte	0xa2a
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
@@ -39946,7 +40204,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0x9e0
+	.2byte	0xa30
 	.4byte	0xc680
 	.uleb128 0x9
 	.byte	0x3
@@ -39954,7 +40212,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0x9ef
+	.2byte	0xa3f
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -39962,7 +40220,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0x9fa
+	.2byte	0xa4a
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -39970,7 +40228,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0xa08
+	.2byte	0xa58
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -39978,7 +40236,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0xa2b
+	.2byte	0xa7b
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -39986,7 +40244,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0xa35
+	.2byte	0xa85
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -39994,7 +40252,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0xa3e
+	.2byte	0xa8e
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40002,7 +40260,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0xa47
+	.2byte	0xa97
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -40010,7 +40268,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0xbf4
+	.2byte	0xc44
 	.4byte	0xa5cc
 	.uleb128 0x9
 	.byte	0x3
@@ -40027,7 +40285,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0xbf9
+	.2byte	0xc49
 	.4byte	0xe71f
 	.uleb128 0x9
 	.byte	0x3
@@ -40035,7 +40293,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0xbff
+	.2byte	0xc4f
 	.4byte	0xd70e
 	.uleb128 0x9
 	.byte	0x3
@@ -40043,15 +40301,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0xc13
+	.2byte	0xc63
 	.4byte	0x458
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init3091
+	.8byte	__addressable_ebc_init3171
 	.uleb128 0x4d
 	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0xc14
+	.2byte	0xc64
 	.4byte	0x4ac
 	.uleb128 0x9
 	.byte	0x3
@@ -40059,79 +40317,79 @@ __exitcall_ebc_exit:
 	.uleb128 0x4e
 	.4byte	.LASF3096
 	.byte	0x1
-	.2byte	0xc0e
-	.8byte	.LFB2866
-	.8byte	.LFE2866-.LFB2866
+	.2byte	0xc5e
+	.8byte	.LFB2867
+	.8byte	.LFE2867-.LFB2867
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe7a8
 	.uleb128 0x4f
 	.8byte	.LVL64
-	.4byte	0x1512e
+	.4byte	0x1524f
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0xc09
+	.2byte	0xc59
 	.4byte	0xc6
-	.8byte	.LFB2865
-	.8byte	.LFE2865-.LFB2865
+	.8byte	.LFB2866
+	.8byte	.LFE2866-.LFB2866
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe7d8
 	.uleb128 0x4f
-	.8byte	.LVL358
-	.4byte	0x1513a
+	.8byte	.LVL361
+	.4byte	0x1525b
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0xbe8
+	.2byte	0xc38
 	.4byte	0xc6
-	.8byte	.LFB2864
-	.8byte	.LFE2864-.LFB2864
+	.8byte	.LFB2865
+	.8byte	.LFE2865-.LFB2865
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe874
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xbe8
+	.2byte	0xc38
 	.4byte	0xa5e0
 	.4byte	.LLST11
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xbea
+	.2byte	0xc3a
 	.4byte	0xe557
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xbeb
+	.2byte	0xc3b
 	.4byte	0xe874
 	.uleb128 0x54
-	.4byte	0x149f9
+	.4byte	0x14b1a
 	.8byte	.LBB952
 	.8byte	.LBE952-.LBB952
 	.byte	0x1
-	.2byte	0xbea
+	.2byte	0xc3a
 	.4byte	0xe844
 	.uleb128 0x55
-	.4byte	0x14a0a
+	.4byte	0x14b2b
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x145c1
+	.4byte	0x146e2
 	.8byte	.LBB954
 	.8byte	.LBE954-.LBB954
 	.byte	0x1
-	.2byte	0xbed
+	.2byte	0xc3d
 	.4byte	0xe866
 	.uleb128 0x55
-	.4byte	0x145ce
+	.4byte	0x146ef
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL68
-	.4byte	0x15146
+	.4byte	0x15267
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -40139,82 +40397,82 @@ __exitcall_ebc_exit:
 	.uleb128 0x51
 	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0xbd7
+	.2byte	0xc27
 	.4byte	0xc6
-	.8byte	.LFB2863
-	.8byte	.LFE2863-.LFB2863
+	.8byte	.LFB2864
+	.8byte	.LFE2864-.LFB2864
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe981
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xbd7
+	.2byte	0xc27
 	.4byte	0xa5e0
 	.4byte	.LLST192
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xbd9
+	.2byte	0xc29
 	.4byte	0xe557
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xbda
+	.2byte	0xc2a
 	.4byte	0xe874
 	.uleb128 0x56
 	.4byte	.LASF3050
 	.4byte	0xe991
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35507
+	.8byte	__func__.35528
 	.uleb128 0x54
-	.4byte	0x149f9
+	.4byte	0x14b1a
 	.8byte	.LBB1482
 	.8byte	.LBE1482-.LBB1482
 	.byte	0x1
-	.2byte	0xbd9
+	.2byte	0xc29
 	.4byte	0xe8f9
 	.uleb128 0x55
-	.4byte	0x14a0a
+	.4byte	0x14b2b
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x145db
+	.4byte	0x146fc
 	.8byte	.LBB1484
 	.8byte	.LBE1484-.LBB1484
 	.byte	0x1
-	.2byte	0xbe2
+	.2byte	0xc32
 	.4byte	0xe91b
 	.uleb128 0x55
-	.4byte	0x145e8
+	.4byte	0x14709
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14288
+	.4byte	0x143a9
 	.8byte	.LBB1486
 	.8byte	.LBE1486-.LBB1486
 	.byte	0x1
-	.2byte	0xbde
+	.2byte	0xc2e
 	.4byte	0xe966
 	.uleb128 0x55
-	.4byte	0x142a3
+	.4byte	0x143c4
 	.uleb128 0x55
-	.4byte	0x14298
+	.4byte	0x143b9
 	.uleb128 0x57
 	.8byte	.LBB1487
 	.8byte	.LBE1487-.LBB1487
 	.uleb128 0x58
-	.4byte	0x142af
+	.4byte	0x143d0
 	.uleb128 0x4f
-	.8byte	.LVL589
-	.4byte	0x14f5d
+	.8byte	.LVL592
+	.4byte	0x1507e
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL587
-	.4byte	0x15146
+	.8byte	.LVL590
+	.4byte	0x15267
 	.uleb128 0x4f
-	.8byte	.LVL588
-	.4byte	0x15146
+	.8byte	.LVL591
+	.4byte	0x15267
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
@@ -40228,163 +40486,163 @@ __exitcall_ebc_exit:
 	.uleb128 0x50
 	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0xbd0
+	.2byte	0xc20
 	.4byte	0xc6
-	.8byte	.LFB2862
-	.8byte	.LFE2862-.LFB2862
+	.8byte	.LFB2863
+	.8byte	.LFE2863-.LFB2863
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe9d6
 	.uleb128 0x59
 	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0xbd0
+	.2byte	0xc20
 	.4byte	0xd78a
 	.4byte	.LLST13
 	.uleb128 0x4f
 	.8byte	.LVL74
-	.4byte	0x15153
+	.4byte	0x15274
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0xb4f
+	.2byte	0xb9f
 	.4byte	0xc6
-	.8byte	.LFB2861
-	.8byte	.LFE2861-.LFB2861
+	.8byte	.LFB2862
+	.8byte	.LFE2862-.LFB2862
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xfdb3
 	.uleb128 0x59
 	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0xb4f
+	.2byte	0xb9f
 	.4byte	0xd78a
 	.4byte	.LLST195
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xb51
+	.2byte	0xba1
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0xb52
+	.2byte	0xba2
 	.4byte	0xb904
 	.uleb128 0x5a
 	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0xb53
+	.2byte	0xba3
 	.4byte	0xd78a
 	.4byte	.LLST196
 	.uleb128 0x48
 	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0xb54
+	.2byte	0xba4
 	.4byte	0xb904
 	.uleb128 0x5a
 	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0xb55
+	.2byte	0xba5
 	.4byte	0xc0b3
 	.4byte	.LLST197
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xb56
+	.2byte	0xba6
 	.4byte	0xe557
 	.uleb128 0x5a
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xb57
+	.2byte	0xba7
 	.4byte	0xe874
 	.4byte	.LLST198
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xb58
+	.2byte	0xba8
 	.4byte	0xe1f4
 	.uleb128 0x5a
 	.4byte	.LASF976
 	.byte	0x1
-	.2byte	0xb59
+	.2byte	0xba9
 	.4byte	0xbd30
 	.4byte	.LLST199
 	.uleb128 0x48
 	.4byte	.LASF2435
 	.byte	0x1
-	.2byte	0xb5a
+	.2byte	0xbaa
 	.4byte	0xbcd0
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xb5b
+	.2byte	0xbab
 	.4byte	0xc6
 	.uleb128 0x5a
 	.4byte	.LASF1001
 	.byte	0x1
-	.2byte	0xb5c
+	.2byte	0xbac
 	.4byte	0xc6
 	.4byte	.LLST200
 	.uleb128 0x5b
 	.string	"i"
 	.byte	0x1
-	.2byte	0xb5d
+	.2byte	0xbad
 	.4byte	0xc6
 	.4byte	.LLST201
 	.uleb128 0x5c
-	.4byte	0x14a17
+	.4byte	0x14b38
 	.8byte	.LBB1632
 	.4byte	.Ldebug_ranges0+0xcb0
 	.byte	0x1
-	.2byte	0xb5f
+	.2byte	0xbaf
 	.4byte	0xeaef
 	.uleb128 0x55
-	.4byte	0x14a40
+	.4byte	0x14b61
 	.uleb128 0x55
-	.4byte	0x14a34
+	.4byte	0x14b55
 	.uleb128 0x55
-	.4byte	0x14a28
+	.4byte	0x14b49
 	.uleb128 0x4f
-	.8byte	.LVL595
-	.4byte	0x1515f
+	.8byte	.LVL598
+	.4byte	0x15280
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x148f1
+	.4byte	0x14a12
 	.8byte	.LBB1636
 	.8byte	.LBE1636-.LBB1636
 	.byte	0x1
-	.2byte	0xb71
+	.2byte	0xbc1
 	.4byte	0xeb2e
 	.uleb128 0x55
-	.4byte	0x14901
+	.4byte	0x14a22
 	.uleb128 0x5d
-	.4byte	0x149f9
+	.4byte	0x14b1a
 	.8byte	.LBB1637
 	.8byte	.LBE1637-.LBB1637
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x55
-	.4byte	0x14a0a
+	.4byte	0x14b2b
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14914
+	.4byte	0x14a35
 	.8byte	.LBB1639
 	.8byte	.LBE1639-.LBB1639
 	.byte	0x1
-	.2byte	0xb8c
+	.2byte	0xbdc
 	.4byte	0xeb6e
 	.uleb128 0x55
-	.4byte	0x14925
+	.4byte	0x14a46
 	.uleb128 0x5e
-	.4byte	0x149f9
+	.4byte	0x14b1a
 	.8byte	.LBB1640
 	.8byte	.LBE1640-.LBB1640
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x55
-	.4byte	0x14a0a
+	.4byte	0x14b2b
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
@@ -40392,7 +40650,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1642
 	.4byte	.Ldebug_ranges0+0xce0
 	.byte	0x1
-	.2byte	0xba0
+	.2byte	0xbf0
 	.4byte	0xf543
 	.uleb128 0x55
 	.4byte	0x117cf
@@ -40401,760 +40659,760 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	0x117db
 	.uleb128 0x5c
-	.4byte	0x14938
+	.4byte	0x14a59
 	.8byte	.LBB1644
 	.4byte	.Ldebug_ranges0+0xd30
 	.byte	0x1
-	.2byte	0x892
+	.2byte	0x8e2
 	.4byte	0xebfe
 	.uleb128 0x55
-	.4byte	0x14960
+	.4byte	0x14a81
 	.uleb128 0x55
-	.4byte	0x14954
+	.4byte	0x14a75
 	.uleb128 0x55
-	.4byte	0x14949
+	.4byte	0x14a6a
 	.uleb128 0x60
-	.4byte	0x1496d
+	.4byte	0x14a8e
 	.8byte	.LBB1645
 	.4byte	.Ldebug_ranges0+0xd30
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x149a1
+	.4byte	0x14ac2
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14ab6
 	.uleb128 0x55
-	.4byte	0x14989
+	.4byte	0x14aaa
 	.uleb128 0x55
-	.4byte	0x1497e
+	.4byte	0x14a9f
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xd30
 	.uleb128 0x58
-	.4byte	0x149ac
+	.4byte	0x14acd
 	.uleb128 0x4f
-	.8byte	.LVL620
-	.4byte	0x1516c
+	.8byte	.LVL623
+	.4byte	0x1528d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14938
+	.4byte	0x14a59
 	.8byte	.LBB1656
 	.8byte	.LBE1656-.LBB1656
 	.byte	0x1
-	.2byte	0x895
+	.2byte	0x8e5
 	.4byte	0xec7b
 	.uleb128 0x55
-	.4byte	0x14960
+	.4byte	0x14a81
 	.uleb128 0x55
-	.4byte	0x14954
+	.4byte	0x14a75
 	.uleb128 0x55
-	.4byte	0x14949
+	.4byte	0x14a6a
 	.uleb128 0x5e
-	.4byte	0x1496d
+	.4byte	0x14a8e
 	.8byte	.LBB1657
 	.8byte	.LBE1657-.LBB1657
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x149a1
+	.4byte	0x14ac2
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14ab6
 	.uleb128 0x55
-	.4byte	0x14989
+	.4byte	0x14aaa
 	.uleb128 0x55
-	.4byte	0x1497e
+	.4byte	0x14a9f
 	.uleb128 0x57
 	.8byte	.LBB1658
 	.8byte	.LBE1658-.LBB1658
 	.uleb128 0x58
-	.4byte	0x149ac
+	.4byte	0x14acd
 	.uleb128 0x4f
-	.8byte	.LVL621
-	.4byte	0x1516c
+	.8byte	.LVL624
+	.4byte	0x1528d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14938
+	.4byte	0x14a59
 	.8byte	.LBB1659
 	.8byte	.LBE1659-.LBB1659
 	.byte	0x1
-	.2byte	0x898
+	.2byte	0x8e8
 	.4byte	0xecf8
 	.uleb128 0x55
-	.4byte	0x14960
+	.4byte	0x14a81
 	.uleb128 0x55
-	.4byte	0x14954
+	.4byte	0x14a75
 	.uleb128 0x55
-	.4byte	0x14949
+	.4byte	0x14a6a
 	.uleb128 0x5e
-	.4byte	0x1496d
+	.4byte	0x14a8e
 	.8byte	.LBB1660
 	.8byte	.LBE1660-.LBB1660
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x149a1
+	.4byte	0x14ac2
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14ab6
 	.uleb128 0x55
-	.4byte	0x14989
+	.4byte	0x14aaa
 	.uleb128 0x55
-	.4byte	0x1497e
+	.4byte	0x14a9f
 	.uleb128 0x57
 	.8byte	.LBB1661
 	.8byte	.LBE1661-.LBB1661
 	.uleb128 0x58
-	.4byte	0x149ac
+	.4byte	0x14acd
 	.uleb128 0x4f
-	.8byte	.LVL622
-	.4byte	0x1516c
+	.8byte	.LVL625
+	.4byte	0x1528d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14938
+	.4byte	0x14a59
 	.8byte	.LBB1662
 	.8byte	.LBE1662-.LBB1662
 	.byte	0x1
-	.2byte	0x89b
+	.2byte	0x8eb
 	.4byte	0xed75
 	.uleb128 0x55
-	.4byte	0x14960
+	.4byte	0x14a81
 	.uleb128 0x55
-	.4byte	0x14954
+	.4byte	0x14a75
 	.uleb128 0x55
-	.4byte	0x14949
+	.4byte	0x14a6a
 	.uleb128 0x5e
-	.4byte	0x1496d
+	.4byte	0x14a8e
 	.8byte	.LBB1663
 	.8byte	.LBE1663-.LBB1663
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x149a1
+	.4byte	0x14ac2
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14ab6
 	.uleb128 0x55
-	.4byte	0x14989
+	.4byte	0x14aaa
 	.uleb128 0x55
-	.4byte	0x1497e
+	.4byte	0x14a9f
 	.uleb128 0x57
 	.8byte	.LBB1664
 	.8byte	.LBE1664-.LBB1664
 	.uleb128 0x58
-	.4byte	0x149ac
+	.4byte	0x14acd
 	.uleb128 0x4f
-	.8byte	.LVL623
-	.4byte	0x1516c
+	.8byte	.LVL626
+	.4byte	0x1528d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14938
+	.4byte	0x14a59
 	.8byte	.LBB1665
 	.8byte	.LBE1665-.LBB1665
 	.byte	0x1
-	.2byte	0x89e
+	.2byte	0x8ee
 	.4byte	0xedf2
 	.uleb128 0x55
-	.4byte	0x14960
+	.4byte	0x14a81
 	.uleb128 0x55
-	.4byte	0x14954
+	.4byte	0x14a75
 	.uleb128 0x55
-	.4byte	0x14949
+	.4byte	0x14a6a
 	.uleb128 0x5e
-	.4byte	0x1496d
+	.4byte	0x14a8e
 	.8byte	.LBB1666
 	.8byte	.LBE1666-.LBB1666
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x149a1
+	.4byte	0x14ac2
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14ab6
 	.uleb128 0x55
-	.4byte	0x14989
+	.4byte	0x14aaa
 	.uleb128 0x55
-	.4byte	0x1497e
+	.4byte	0x14a9f
 	.uleb128 0x57
 	.8byte	.LBB1667
 	.8byte	.LBE1667-.LBB1667
 	.uleb128 0x58
-	.4byte	0x149ac
+	.4byte	0x14acd
 	.uleb128 0x4f
-	.8byte	.LVL624
-	.4byte	0x1516c
+	.8byte	.LVL627
+	.4byte	0x1528d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14938
+	.4byte	0x14a59
 	.8byte	.LBB1668
 	.8byte	.LBE1668-.LBB1668
 	.byte	0x1
-	.2byte	0x8a1
+	.2byte	0x8f1
 	.4byte	0xee6f
 	.uleb128 0x55
-	.4byte	0x14960
+	.4byte	0x14a81
 	.uleb128 0x55
-	.4byte	0x14954
+	.4byte	0x14a75
 	.uleb128 0x55
-	.4byte	0x14949
+	.4byte	0x14a6a
 	.uleb128 0x5e
-	.4byte	0x1496d
+	.4byte	0x14a8e
 	.8byte	.LBB1669
 	.8byte	.LBE1669-.LBB1669
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x149a1
+	.4byte	0x14ac2
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14ab6
 	.uleb128 0x55
-	.4byte	0x14989
+	.4byte	0x14aaa
 	.uleb128 0x55
-	.4byte	0x1497e
+	.4byte	0x14a9f
 	.uleb128 0x57
 	.8byte	.LBB1670
 	.8byte	.LBE1670-.LBB1670
 	.uleb128 0x58
-	.4byte	0x149ac
+	.4byte	0x14acd
 	.uleb128 0x4f
-	.8byte	.LVL625
-	.4byte	0x1516c
+	.8byte	.LVL628
+	.4byte	0x1528d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14938
+	.4byte	0x14a59
 	.8byte	.LBB1671
 	.8byte	.LBE1671-.LBB1671
 	.byte	0x1
-	.2byte	0x8a4
+	.2byte	0x8f4
 	.4byte	0xeeec
 	.uleb128 0x55
-	.4byte	0x14960
+	.4byte	0x14a81
 	.uleb128 0x55
-	.4byte	0x14954
+	.4byte	0x14a75
 	.uleb128 0x55
-	.4byte	0x14949
+	.4byte	0x14a6a
 	.uleb128 0x5e
-	.4byte	0x1496d
+	.4byte	0x14a8e
 	.8byte	.LBB1672
 	.8byte	.LBE1672-.LBB1672
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x149a1
+	.4byte	0x14ac2
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14ab6
 	.uleb128 0x55
-	.4byte	0x14989
+	.4byte	0x14aaa
 	.uleb128 0x55
-	.4byte	0x1497e
+	.4byte	0x14a9f
 	.uleb128 0x57
 	.8byte	.LBB1673
 	.8byte	.LBE1673-.LBB1673
 	.uleb128 0x58
-	.4byte	0x149ac
+	.4byte	0x14acd
 	.uleb128 0x4f
-	.8byte	.LVL626
-	.4byte	0x1516c
+	.8byte	.LVL629
+	.4byte	0x1528d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14938
+	.4byte	0x14a59
 	.8byte	.LBB1674
 	.8byte	.LBE1674-.LBB1674
 	.byte	0x1
-	.2byte	0x8a7
+	.2byte	0x8f7
 	.4byte	0xef69
 	.uleb128 0x55
-	.4byte	0x14960
+	.4byte	0x14a81
 	.uleb128 0x55
-	.4byte	0x14954
+	.4byte	0x14a75
 	.uleb128 0x55
-	.4byte	0x14949
+	.4byte	0x14a6a
 	.uleb128 0x5e
-	.4byte	0x1496d
+	.4byte	0x14a8e
 	.8byte	.LBB1675
 	.8byte	.LBE1675-.LBB1675
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x149a1
+	.4byte	0x14ac2
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14ab6
 	.uleb128 0x55
-	.4byte	0x14989
+	.4byte	0x14aaa
 	.uleb128 0x55
-	.4byte	0x1497e
+	.4byte	0x14a9f
 	.uleb128 0x57
 	.8byte	.LBB1676
 	.8byte	.LBE1676-.LBB1676
 	.uleb128 0x58
-	.4byte	0x149ac
+	.4byte	0x14acd
 	.uleb128 0x4f
-	.8byte	.LVL627
-	.4byte	0x1516c
+	.8byte	.LVL630
+	.4byte	0x1528d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14938
+	.4byte	0x14a59
 	.8byte	.LBB1677
 	.8byte	.LBE1677-.LBB1677
 	.byte	0x1
-	.2byte	0x8aa
+	.2byte	0x8fa
 	.4byte	0xefe6
 	.uleb128 0x55
-	.4byte	0x14960
+	.4byte	0x14a81
 	.uleb128 0x55
-	.4byte	0x14954
+	.4byte	0x14a75
 	.uleb128 0x55
-	.4byte	0x14949
+	.4byte	0x14a6a
 	.uleb128 0x5e
-	.4byte	0x1496d
+	.4byte	0x14a8e
 	.8byte	.LBB1678
 	.8byte	.LBE1678-.LBB1678
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x149a1
+	.4byte	0x14ac2
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14ab6
 	.uleb128 0x55
-	.4byte	0x14989
+	.4byte	0x14aaa
 	.uleb128 0x55
-	.4byte	0x1497e
+	.4byte	0x14a9f
 	.uleb128 0x57
 	.8byte	.LBB1679
 	.8byte	.LBE1679-.LBB1679
 	.uleb128 0x58
-	.4byte	0x149ac
+	.4byte	0x14acd
 	.uleb128 0x4f
-	.8byte	.LVL628
-	.4byte	0x1516c
+	.8byte	.LVL631
+	.4byte	0x1528d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14938
+	.4byte	0x14a59
 	.8byte	.LBB1680
 	.8byte	.LBE1680-.LBB1680
 	.byte	0x1
-	.2byte	0x8ad
+	.2byte	0x8fd
 	.4byte	0xf063
 	.uleb128 0x55
-	.4byte	0x14960
+	.4byte	0x14a81
 	.uleb128 0x55
-	.4byte	0x14954
+	.4byte	0x14a75
 	.uleb128 0x55
-	.4byte	0x14949
+	.4byte	0x14a6a
 	.uleb128 0x5e
-	.4byte	0x1496d
+	.4byte	0x14a8e
 	.8byte	.LBB1681
 	.8byte	.LBE1681-.LBB1681
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x149a1
+	.4byte	0x14ac2
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14ab6
 	.uleb128 0x55
-	.4byte	0x14989
+	.4byte	0x14aaa
 	.uleb128 0x55
-	.4byte	0x1497e
+	.4byte	0x14a9f
 	.uleb128 0x57
 	.8byte	.LBB1682
 	.8byte	.LBE1682-.LBB1682
 	.uleb128 0x58
-	.4byte	0x149ac
+	.4byte	0x14acd
 	.uleb128 0x4f
-	.8byte	.LVL629
-	.4byte	0x1516c
+	.8byte	.LVL632
+	.4byte	0x1528d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14938
+	.4byte	0x14a59
 	.8byte	.LBB1683
 	.8byte	.LBE1683-.LBB1683
 	.byte	0x1
-	.2byte	0x8b0
+	.2byte	0x900
 	.4byte	0xf0e0
 	.uleb128 0x55
-	.4byte	0x14960
+	.4byte	0x14a81
 	.uleb128 0x55
-	.4byte	0x14954
+	.4byte	0x14a75
 	.uleb128 0x55
-	.4byte	0x14949
+	.4byte	0x14a6a
 	.uleb128 0x5e
-	.4byte	0x1496d
+	.4byte	0x14a8e
 	.8byte	.LBB1684
 	.8byte	.LBE1684-.LBB1684
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x149a1
+	.4byte	0x14ac2
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14ab6
 	.uleb128 0x55
-	.4byte	0x14989
+	.4byte	0x14aaa
 	.uleb128 0x55
-	.4byte	0x1497e
+	.4byte	0x14a9f
 	.uleb128 0x57
 	.8byte	.LBB1685
 	.8byte	.LBE1685-.LBB1685
 	.uleb128 0x58
-	.4byte	0x149ac
+	.4byte	0x14acd
 	.uleb128 0x4f
-	.8byte	.LVL630
-	.4byte	0x1516c
+	.8byte	.LVL633
+	.4byte	0x1528d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14938
+	.4byte	0x14a59
 	.8byte	.LBB1686
 	.8byte	.LBE1686-.LBB1686
 	.byte	0x1
-	.2byte	0x8b3
+	.2byte	0x903
 	.4byte	0xf15d
 	.uleb128 0x55
-	.4byte	0x14960
+	.4byte	0x14a81
 	.uleb128 0x55
-	.4byte	0x14954
+	.4byte	0x14a75
 	.uleb128 0x55
-	.4byte	0x14949
+	.4byte	0x14a6a
 	.uleb128 0x5e
-	.4byte	0x1496d
+	.4byte	0x14a8e
 	.8byte	.LBB1687
 	.8byte	.LBE1687-.LBB1687
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x149a1
+	.4byte	0x14ac2
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14ab6
 	.uleb128 0x55
-	.4byte	0x14989
+	.4byte	0x14aaa
 	.uleb128 0x55
-	.4byte	0x1497e
+	.4byte	0x14a9f
 	.uleb128 0x57
 	.8byte	.LBB1688
 	.8byte	.LBE1688-.LBB1688
 	.uleb128 0x58
-	.4byte	0x149ac
+	.4byte	0x14acd
 	.uleb128 0x4f
-	.8byte	.LVL631
-	.4byte	0x1516c
+	.8byte	.LVL634
+	.4byte	0x1528d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14938
+	.4byte	0x14a59
 	.8byte	.LBB1689
 	.8byte	.LBE1689-.LBB1689
 	.byte	0x1
-	.2byte	0x8b6
+	.2byte	0x906
 	.4byte	0xf1da
 	.uleb128 0x55
-	.4byte	0x14960
+	.4byte	0x14a81
 	.uleb128 0x55
-	.4byte	0x14954
+	.4byte	0x14a75
 	.uleb128 0x55
-	.4byte	0x14949
+	.4byte	0x14a6a
 	.uleb128 0x5e
-	.4byte	0x1496d
+	.4byte	0x14a8e
 	.8byte	.LBB1690
 	.8byte	.LBE1690-.LBB1690
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x149a1
+	.4byte	0x14ac2
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14ab6
 	.uleb128 0x55
-	.4byte	0x14989
+	.4byte	0x14aaa
 	.uleb128 0x55
-	.4byte	0x1497e
+	.4byte	0x14a9f
 	.uleb128 0x57
 	.8byte	.LBB1691
 	.8byte	.LBE1691-.LBB1691
 	.uleb128 0x58
-	.4byte	0x149ac
+	.4byte	0x14acd
 	.uleb128 0x4f
-	.8byte	.LVL632
-	.4byte	0x1516c
+	.8byte	.LVL635
+	.4byte	0x1528d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14938
+	.4byte	0x14a59
 	.8byte	.LBB1692
 	.8byte	.LBE1692-.LBB1692
 	.byte	0x1
-	.2byte	0x8b9
+	.2byte	0x909
 	.4byte	0xf257
 	.uleb128 0x55
-	.4byte	0x14960
+	.4byte	0x14a81
 	.uleb128 0x55
-	.4byte	0x14954
+	.4byte	0x14a75
 	.uleb128 0x55
-	.4byte	0x14949
+	.4byte	0x14a6a
 	.uleb128 0x5e
-	.4byte	0x1496d
+	.4byte	0x14a8e
 	.8byte	.LBB1693
 	.8byte	.LBE1693-.LBB1693
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x149a1
+	.4byte	0x14ac2
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14ab6
 	.uleb128 0x55
-	.4byte	0x14989
+	.4byte	0x14aaa
 	.uleb128 0x55
-	.4byte	0x1497e
+	.4byte	0x14a9f
 	.uleb128 0x57
 	.8byte	.LBB1694
 	.8byte	.LBE1694-.LBB1694
 	.uleb128 0x58
-	.4byte	0x149ac
+	.4byte	0x14acd
 	.uleb128 0x4f
-	.8byte	.LVL633
-	.4byte	0x1516c
+	.8byte	.LVL636
+	.4byte	0x1528d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14938
+	.4byte	0x14a59
 	.8byte	.LBB1695
 	.8byte	.LBE1695-.LBB1695
 	.byte	0x1
-	.2byte	0x8bc
+	.2byte	0x90c
 	.4byte	0xf2d4
 	.uleb128 0x55
-	.4byte	0x14960
+	.4byte	0x14a81
 	.uleb128 0x55
-	.4byte	0x14954
+	.4byte	0x14a75
 	.uleb128 0x55
-	.4byte	0x14949
+	.4byte	0x14a6a
 	.uleb128 0x5e
-	.4byte	0x1496d
+	.4byte	0x14a8e
 	.8byte	.LBB1696
 	.8byte	.LBE1696-.LBB1696
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x149a1
+	.4byte	0x14ac2
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14ab6
 	.uleb128 0x55
-	.4byte	0x14989
+	.4byte	0x14aaa
 	.uleb128 0x55
-	.4byte	0x1497e
+	.4byte	0x14a9f
 	.uleb128 0x57
 	.8byte	.LBB1697
 	.8byte	.LBE1697-.LBB1697
 	.uleb128 0x58
-	.4byte	0x149ac
+	.4byte	0x14acd
 	.uleb128 0x4f
-	.8byte	.LVL634
-	.4byte	0x1516c
+	.8byte	.LVL637
+	.4byte	0x1528d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14938
+	.4byte	0x14a59
 	.8byte	.LBB1698
 	.8byte	.LBE1698-.LBB1698
 	.byte	0x1
-	.2byte	0x8bf
+	.2byte	0x90f
 	.4byte	0xf351
 	.uleb128 0x55
-	.4byte	0x14960
+	.4byte	0x14a81
 	.uleb128 0x55
-	.4byte	0x14954
+	.4byte	0x14a75
 	.uleb128 0x55
-	.4byte	0x14949
+	.4byte	0x14a6a
 	.uleb128 0x5e
-	.4byte	0x1496d
+	.4byte	0x14a8e
 	.8byte	.LBB1699
 	.8byte	.LBE1699-.LBB1699
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x149a1
+	.4byte	0x14ac2
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14ab6
 	.uleb128 0x55
-	.4byte	0x14989
+	.4byte	0x14aaa
 	.uleb128 0x55
-	.4byte	0x1497e
+	.4byte	0x14a9f
 	.uleb128 0x57
 	.8byte	.LBB1700
 	.8byte	.LBE1700-.LBB1700
 	.uleb128 0x58
-	.4byte	0x149ac
+	.4byte	0x14acd
 	.uleb128 0x4f
-	.8byte	.LVL635
-	.4byte	0x1516c
+	.8byte	.LVL638
+	.4byte	0x1528d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14938
+	.4byte	0x14a59
 	.8byte	.LBB1701
 	.8byte	.LBE1701-.LBB1701
 	.byte	0x1
-	.2byte	0x8c2
+	.2byte	0x912
 	.4byte	0xf3ce
 	.uleb128 0x55
-	.4byte	0x14960
+	.4byte	0x14a81
 	.uleb128 0x55
-	.4byte	0x14954
+	.4byte	0x14a75
 	.uleb128 0x55
-	.4byte	0x14949
+	.4byte	0x14a6a
 	.uleb128 0x5e
-	.4byte	0x1496d
+	.4byte	0x14a8e
 	.8byte	.LBB1702
 	.8byte	.LBE1702-.LBB1702
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x149a1
+	.4byte	0x14ac2
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14ab6
 	.uleb128 0x55
-	.4byte	0x14989
+	.4byte	0x14aaa
 	.uleb128 0x55
-	.4byte	0x1497e
+	.4byte	0x14a9f
 	.uleb128 0x57
 	.8byte	.LBB1703
 	.8byte	.LBE1703-.LBB1703
 	.uleb128 0x58
-	.4byte	0x149ac
+	.4byte	0x14acd
 	.uleb128 0x4f
-	.8byte	.LVL636
-	.4byte	0x1516c
+	.8byte	.LVL639
+	.4byte	0x1528d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14938
+	.4byte	0x14a59
 	.8byte	.LBB1704
 	.8byte	.LBE1704-.LBB1704
 	.byte	0x1
-	.2byte	0x8c5
+	.2byte	0x915
 	.4byte	0xf44b
 	.uleb128 0x55
-	.4byte	0x14960
+	.4byte	0x14a81
 	.uleb128 0x55
-	.4byte	0x14954
+	.4byte	0x14a75
 	.uleb128 0x55
-	.4byte	0x14949
+	.4byte	0x14a6a
 	.uleb128 0x5e
-	.4byte	0x1496d
+	.4byte	0x14a8e
 	.8byte	.LBB1705
 	.8byte	.LBE1705-.LBB1705
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x149a1
+	.4byte	0x14ac2
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14ab6
 	.uleb128 0x55
-	.4byte	0x14989
+	.4byte	0x14aaa
 	.uleb128 0x55
-	.4byte	0x1497e
+	.4byte	0x14a9f
 	.uleb128 0x57
 	.8byte	.LBB1706
 	.8byte	.LBE1706-.LBB1706
 	.uleb128 0x58
-	.4byte	0x149ac
+	.4byte	0x14acd
 	.uleb128 0x4f
-	.8byte	.LVL637
-	.4byte	0x1516c
+	.8byte	.LVL640
+	.4byte	0x1528d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14938
+	.4byte	0x14a59
 	.8byte	.LBB1707
 	.8byte	.LBE1707-.LBB1707
 	.byte	0x1
-	.2byte	0x8c8
+	.2byte	0x918
 	.4byte	0xf4c8
 	.uleb128 0x55
-	.4byte	0x14960
+	.4byte	0x14a81
 	.uleb128 0x55
-	.4byte	0x14954
+	.4byte	0x14a75
 	.uleb128 0x55
-	.4byte	0x14949
+	.4byte	0x14a6a
 	.uleb128 0x5e
-	.4byte	0x1496d
+	.4byte	0x14a8e
 	.8byte	.LBB1708
 	.8byte	.LBE1708-.LBB1708
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x149a1
+	.4byte	0x14ac2
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14ab6
 	.uleb128 0x55
-	.4byte	0x14989
+	.4byte	0x14aaa
 	.uleb128 0x55
-	.4byte	0x1497e
+	.4byte	0x14a9f
 	.uleb128 0x57
 	.8byte	.LBB1709
 	.8byte	.LBE1709-.LBB1709
 	.uleb128 0x58
-	.4byte	0x149ac
+	.4byte	0x14acd
 	.uleb128 0x4f
-	.8byte	.LVL638
-	.4byte	0x1516c
+	.8byte	.LVL641
+	.4byte	0x1528d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x14938
+	.4byte	0x14a59
 	.8byte	.LBB1710
 	.8byte	.LBE1710-.LBB1710
 	.byte	0x1
-	.2byte	0x8cb
+	.2byte	0x91b
 	.uleb128 0x55
-	.4byte	0x14960
+	.4byte	0x14a81
 	.uleb128 0x55
-	.4byte	0x14954
+	.4byte	0x14a75
 	.uleb128 0x55
-	.4byte	0x14949
+	.4byte	0x14a6a
 	.uleb128 0x5e
-	.4byte	0x1496d
+	.4byte	0x14a8e
 	.8byte	.LBB1711
 	.8byte	.LBE1711-.LBB1711
 	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x149a1
+	.4byte	0x14ac2
 	.uleb128 0x55
-	.4byte	0x14995
+	.4byte	0x14ab6
 	.uleb128 0x55
-	.4byte	0x14989
+	.4byte	0x14aaa
 	.uleb128 0x55
-	.4byte	0x1497e
+	.4byte	0x14a9f
 	.uleb128 0x57
 	.8byte	.LBB1712
 	.8byte	.LBE1712-.LBB1712
 	.uleb128 0x58
-	.4byte	0x149ac
+	.4byte	0x14acd
 	.uleb128 0x4f
-	.8byte	.LVL639
-	.4byte	0x1516c
+	.8byte	.LVL642
+	.4byte	0x1528d
 	.byte	0
 	.byte	0
 	.byte	0
@@ -41165,7 +41423,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1719
 	.4byte	.Ldebug_ranges0+0xd80
 	.byte	0x1
-	.2byte	0xbac
+	.2byte	0xbfc
 	.4byte	0xf645
 	.uleb128 0x55
 	.4byte	0xfeb8
@@ -41192,53 +41450,53 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	0xff16
 	.uleb128 0x5c
-	.4byte	0x14a4d
+	.4byte	0x14b6e
 	.8byte	.LBB1721
 	.4byte	.Ldebug_ranges0+0xdf0
 	.byte	0x1
-	.2byte	0xa9c
+	.2byte	0xaec
 	.4byte	0xf5b3
 	.uleb128 0x55
-	.4byte	0x14a5d
+	.4byte	0x14b7e
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14a17
+	.4byte	0x14b38
 	.8byte	.LBB1725
 	.4byte	.Ldebug_ranges0+0xe20
 	.byte	0x1
-	.2byte	0xabb
+	.2byte	0xb0b
 	.4byte	0xf5e8
 	.uleb128 0x55
-	.4byte	0x14a40
+	.4byte	0x14b61
 	.uleb128 0x55
-	.4byte	0x14a34
+	.4byte	0x14b55
 	.uleb128 0x55
-	.4byte	0x14a28
+	.4byte	0x14b49
 	.uleb128 0x4f
-	.8byte	.LVL645
-	.4byte	0x1515f
+	.8byte	.LVL648
+	.4byte	0x15280
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL641
-	.4byte	0x15179
-	.uleb128 0x4f
-	.8byte	.LVL642
-	.4byte	0x15186
-	.uleb128 0x4f
-	.8byte	.LVL643
-	.4byte	0x15192
-	.uleb128 0x4f
 	.8byte	.LVL644
-	.4byte	0x1519e
+	.4byte	0x1529a
+	.uleb128 0x4f
+	.8byte	.LVL645
+	.4byte	0x152a7
 	.uleb128 0x4f
 	.8byte	.LVL646
-	.4byte	0x151aa
+	.4byte	0x152b3
 	.uleb128 0x4f
 	.8byte	.LVL647
-	.4byte	0x151b4
+	.4byte	0x152bf
 	.uleb128 0x4f
-	.8byte	.LVL660
-	.4byte	0x151c0
+	.8byte	.LVL649
+	.4byte	0x152cb
+	.uleb128 0x4f
+	.8byte	.LVL650
+	.4byte	0x152d5
+	.uleb128 0x4f
+	.8byte	.LVL663
+	.4byte	0x152e1
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
@@ -41246,7 +41504,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1736
 	.4byte	.Ldebug_ranges0+0xe50
 	.byte	0x1
-	.2byte	0xbb3
+	.2byte	0xc03
 	.4byte	0xf71e
 	.uleb128 0x55
 	.4byte	0xff32
@@ -41272,39 +41530,39 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	0xff84
 	.uleb128 0x5c
-	.4byte	0x14a4d
+	.4byte	0x14b6e
 	.8byte	.LBB1738
 	.4byte	.Ldebug_ranges0+0xea0
 	.byte	0x1
-	.2byte	0xa6c
+	.2byte	0xabc
 	.4byte	0xf6b4
 	.uleb128 0x55
-	.4byte	0x14a5d
+	.4byte	0x14b7e
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL649
-	.4byte	0x15179
+	.8byte	.LVL652
+	.4byte	0x1529a
 	.uleb128 0x4f
-	.8byte	.LVL650
-	.4byte	0x15186
+	.8byte	.LVL653
+	.4byte	0x152a7
 	.uleb128 0x4f
-	.8byte	.LVL664
-	.4byte	0x15192
+	.8byte	.LVL667
+	.4byte	0x152b3
 	.uleb128 0x4f
-	.8byte	.LVL665
-	.4byte	0x151cd
+	.8byte	.LVL668
+	.4byte	0x152ee
 	.uleb128 0x4f
-	.8byte	.LVL751
-	.4byte	0x151c0
+	.8byte	.LVL754
+	.4byte	0x152e1
 	.uleb128 0x4f
-	.8byte	.LVL752
-	.4byte	0x151d9
+	.8byte	.LVL755
+	.4byte	0x152fa
 	.uleb128 0x4f
-	.8byte	.LVL753
-	.4byte	0x151c0
+	.8byte	.LVL756
+	.4byte	0x152e1
 	.uleb128 0x4f
-	.8byte	.LVL766
-	.4byte	0x151c0
+	.8byte	.LVL769
+	.4byte	0x152e1
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
@@ -41312,7 +41570,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1747
 	.4byte	.Ldebug_ranges0+0xed0
 	.byte	0x1
-	.2byte	0xbba
+	.2byte	0xc0a
 	.4byte	0xf8b8
 	.uleb128 0x55
 	.4byte	0xfe80
@@ -41324,53 +41582,53 @@ __exitcall_ebc_exit:
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5c
-	.4byte	0x14c12
+	.4byte	0x14d33
 	.8byte	.LBB1749
 	.4byte	.Ldebug_ranges0+0xf10
 	.byte	0x1
-	.2byte	0xac8
+	.2byte	0xb18
 	.4byte	0xf7a5
 	.uleb128 0x55
-	.4byte	0x14c1f
+	.4byte	0x14d40
 	.uleb128 0x57
 	.8byte	.LBB1751
 	.8byte	.LBE1751-.LBB1751
 	.uleb128 0x58
-	.4byte	0x14c4b
+	.4byte	0x14d6c
 	.uleb128 0x5d
-	.4byte	0x14df7
+	.4byte	0x14f18
 	.8byte	.LBB1752
 	.8byte	.LBE1752-.LBB1752
 	.byte	0xf
 	.byte	0x1c
 	.uleb128 0x55
-	.4byte	0x14e1a
+	.4byte	0x14f3b
 	.uleb128 0x55
-	.4byte	0x14e0e
+	.4byte	0x14f2f
 	.uleb128 0x55
-	.4byte	0x14e04
+	.4byte	0x14f25
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14d33
+	.4byte	0x14e54
 	.8byte	.LBB1756
 	.8byte	.LBE1756-.LBB1756
 	.byte	0x1
-	.2byte	0xad2
+	.2byte	0xb22
 	.4byte	0xf7f0
 	.uleb128 0x55
-	.4byte	0x14d49
+	.4byte	0x14e6a
 	.uleb128 0x55
-	.4byte	0x14d40
+	.4byte	0x14e61
 	.uleb128 0x57
 	.8byte	.LBB1757
 	.8byte	.LBE1757-.LBB1757
 	.uleb128 0x61
-	.4byte	0x14d52
+	.4byte	0x14e73
 	.4byte	.LLST205
 	.uleb128 0x61
-	.4byte	0x14d5c
+	.4byte	0x14e7d
 	.4byte	.LLST206
 	.byte	0
 	.byte	0
@@ -41381,52 +41639,52 @@ __exitcall_ebc_exit:
 	.4byte	0xfe99
 	.4byte	.LLST207
 	.uleb128 0x4f
-	.8byte	.LVL673
-	.4byte	0x151e5
+	.8byte	.LVL676
+	.4byte	0x15306
 	.uleb128 0x4f
-	.8byte	.LVL675
-	.4byte	0x151f1
+	.8byte	.LVL678
+	.4byte	0x15312
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14d33
+	.4byte	0x14e54
 	.8byte	.LBB1760
 	.8byte	.LBE1760-.LBB1760
 	.byte	0x1
-	.2byte	0xadb
+	.2byte	0xb2b
 	.4byte	0xf868
 	.uleb128 0x55
-	.4byte	0x14d49
+	.4byte	0x14e6a
 	.uleb128 0x55
-	.4byte	0x14d40
+	.4byte	0x14e61
 	.uleb128 0x57
 	.8byte	.LBB1761
 	.8byte	.LBE1761-.LBB1761
 	.uleb128 0x61
-	.4byte	0x14d52
+	.4byte	0x14e73
 	.4byte	.LLST208
 	.uleb128 0x61
-	.4byte	0x14d5c
+	.4byte	0x14e7d
 	.4byte	.LLST209
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL666
-	.4byte	0x151fe
+	.8byte	.LVL669
+	.4byte	0x1531f
 	.uleb128 0x4f
-	.8byte	.LVL667
-	.4byte	0x151e5
+	.8byte	.LVL670
+	.4byte	0x15306
 	.uleb128 0x4f
-	.8byte	.LVL668
-	.4byte	0x1520b
+	.8byte	.LVL671
+	.4byte	0x1532c
 	.uleb128 0x4f
-	.8byte	.LVL676
-	.4byte	0x1520b
+	.8byte	.LVL679
+	.4byte	0x1532c
 	.uleb128 0x4f
-	.8byte	.LVL756
-	.4byte	0x151c0
+	.8byte	.LVL759
+	.4byte	0x152e1
 	.uleb128 0x4f
-	.8byte	.LVL760
-	.4byte	0x151c0
+	.8byte	.LVL763
+	.4byte	0x152e1
 	.byte	0
 	.byte	0
 	.uleb128 0x54
@@ -41434,52 +41692,52 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1764
 	.8byte	.LBE1764-.LBB1764
 	.byte	0x1
-	.2byte	0xbc1
+	.2byte	0xc11
 	.4byte	0xf952
 	.uleb128 0x55
 	.4byte	0xfe62
 	.uleb128 0x5c
-	.4byte	0x14670
+	.4byte	0x14791
 	.8byte	.LBB1766
 	.4byte	.Ldebug_ranges0+0xf70
 	.byte	0x1
-	.2byte	0xaeb
+	.2byte	0xb3b
 	.4byte	0xf91d
 	.uleb128 0x55
-	.4byte	0x14695
+	.4byte	0x147b6
 	.uleb128 0x55
-	.4byte	0x14689
+	.4byte	0x147aa
 	.uleb128 0x55
-	.4byte	0x1467d
+	.4byte	0x1479e
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xf70
 	.uleb128 0x61
-	.4byte	0x146a1
+	.4byte	0x147c2
 	.4byte	.LLST210
 	.uleb128 0x4f
-	.8byte	.LVL683
-	.4byte	0x15218
+	.8byte	.LVL686
+	.4byte	0x15339
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL684
-	.4byte	0x15224
+	.8byte	.LVL687
+	.4byte	0x15345
 	.uleb128 0x4f
-	.8byte	.LVL685
-	.4byte	0x15230
+	.8byte	.LVL688
+	.4byte	0x15351
 	.uleb128 0x4f
-	.8byte	.LVL686
-	.4byte	0x15224
+	.8byte	.LVL689
+	.4byte	0x15345
 	.uleb128 0x4f
-	.8byte	.LVL687
-	.4byte	0x15230
+	.8byte	.LVL690
+	.4byte	0x15351
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xfdb3
 	.8byte	.LBB1776
 	.4byte	.Ldebug_ranges0+0xfd0
 	.byte	0x1
-	.2byte	0xbc4
+	.2byte	0xc14
 	.4byte	0xfbf5
 	.uleb128 0x55
 	.4byte	0xfdd0
@@ -41520,7 +41778,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1778
 	.8byte	.LBE1778-.LBB1778
 	.byte	0x1
-	.2byte	0xb23
+	.2byte	0xb73
 	.4byte	0xfa34
 	.uleb128 0x55
 	.4byte	0x11893
@@ -41533,154 +41791,154 @@ __exitcall_ebc_exit:
 	.4byte	0x1189f
 	.4byte	.LLST219
 	.uleb128 0x4f
-	.8byte	.LVL704
-	.4byte	0x1523c
+	.8byte	.LVL707
+	.4byte	0x1535d
 	.uleb128 0x4f
-	.8byte	.LVL706
-	.4byte	0x151b4
+	.8byte	.LVL709
+	.4byte	0x152d5
 	.uleb128 0x4f
-	.8byte	.LVL707
-	.4byte	0x15248
+	.8byte	.LVL710
+	.4byte	0x15369
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x147f7
+	.4byte	0x14918
 	.8byte	.LBB1780
 	.8byte	.LBE1780-.LBB1780
 	.byte	0x1
-	.2byte	0xb09
+	.2byte	0xb59
 	.4byte	0xfa8b
 	.uleb128 0x55
-	.4byte	0x14814
+	.4byte	0x14935
 	.uleb128 0x55
-	.4byte	0x14808
+	.4byte	0x14929
 	.uleb128 0x5e
-	.4byte	0x14821
+	.4byte	0x14942
 	.8byte	.LBB1781
 	.8byte	.LBE1781-.LBB1781
 	.byte	0x11
 	.2byte	0x2e7
 	.uleb128 0x55
-	.4byte	0x1483e
+	.4byte	0x1495f
 	.uleb128 0x55
-	.4byte	0x14832
+	.4byte	0x14953
 	.uleb128 0x4f
-	.8byte	.LVL724
-	.4byte	0x15254
+	.8byte	.LVL727
+	.4byte	0x15375
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x147f7
+	.4byte	0x14918
 	.8byte	.LBB1783
 	.8byte	.LBE1783-.LBB1783
 	.byte	0x1
-	.2byte	0xb17
+	.2byte	0xb67
 	.4byte	0xfae2
 	.uleb128 0x55
-	.4byte	0x14814
+	.4byte	0x14935
 	.uleb128 0x55
-	.4byte	0x14808
+	.4byte	0x14929
 	.uleb128 0x5e
-	.4byte	0x14821
+	.4byte	0x14942
 	.8byte	.LBB1784
 	.8byte	.LBE1784-.LBB1784
 	.byte	0x11
 	.2byte	0x2e7
 	.uleb128 0x55
-	.4byte	0x1483e
+	.4byte	0x1495f
 	.uleb128 0x55
-	.4byte	0x14832
+	.4byte	0x14953
 	.uleb128 0x4f
-	.8byte	.LVL737
-	.4byte	0x15254
+	.8byte	.LVL740
+	.4byte	0x15375
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL689
-	.4byte	0x15261
-	.uleb128 0x4f
-	.8byte	.LVL691
-	.4byte	0x15261
+	.8byte	.LVL692
+	.4byte	0x15382
 	.uleb128 0x4f
-	.8byte	.LVL693
-	.4byte	0x1526d
+	.8byte	.LVL694
+	.4byte	0x15382
 	.uleb128 0x4f
-	.8byte	.LVL698
-	.4byte	0x1526d
+	.8byte	.LVL696
+	.4byte	0x1538e
 	.uleb128 0x4f
-	.8byte	.LVL702
-	.4byte	0x15146
+	.8byte	.LVL701
+	.4byte	0x1538e
 	.uleb128 0x4f
-	.8byte	.LVL703
-	.4byte	0x1527a
+	.8byte	.LVL705
+	.4byte	0x15267
 	.uleb128 0x4f
-	.8byte	.LVL708
-	.4byte	0x15286
+	.8byte	.LVL706
+	.4byte	0x1539b
 	.uleb128 0x4f
-	.8byte	.LVL709
-	.4byte	0x15286
+	.8byte	.LVL711
+	.4byte	0x153a7
 	.uleb128 0x4f
-	.8byte	.LVL721
-	.4byte	0x15292
+	.8byte	.LVL712
+	.4byte	0x153a7
 	.uleb128 0x4f
-	.8byte	.LVL723
-	.4byte	0x15146
+	.8byte	.LVL724
+	.4byte	0x153b3
 	.uleb128 0x4f
-	.8byte	.LVL728
-	.4byte	0x1529e
+	.8byte	.LVL726
+	.4byte	0x15267
 	.uleb128 0x4f
 	.8byte	.LVL731
-	.4byte	0x1523c
-	.uleb128 0x4f
-	.8byte	.LVL733
-	.4byte	0x1529e
+	.4byte	0x153bf
 	.uleb128 0x4f
 	.8byte	.LVL734
-	.4byte	0x15248
+	.4byte	0x1535d
 	.uleb128 0x4f
 	.8byte	.LVL736
-	.4byte	0x15146
+	.4byte	0x153bf
 	.uleb128 0x4f
-	.8byte	.LVL740
-	.4byte	0x1529e
+	.8byte	.LVL737
+	.4byte	0x15369
 	.uleb128 0x4f
-	.8byte	.LVL743
-	.4byte	0x1523c
+	.8byte	.LVL739
+	.4byte	0x15267
 	.uleb128 0x4f
-	.8byte	.LVL745
-	.4byte	0x1529e
+	.8byte	.LVL743
+	.4byte	0x153bf
 	.uleb128 0x4f
 	.8byte	.LVL746
-	.4byte	0x15248
+	.4byte	0x1535d
 	.uleb128 0x4f
-	.8byte	.LVL771
-	.4byte	0x151c0
+	.8byte	.LVL748
+	.4byte	0x153bf
+	.uleb128 0x4f
+	.8byte	.LVL749
+	.4byte	0x15369
 	.uleb128 0x4f
 	.8byte	.LVL774
-	.4byte	0x151c0
+	.4byte	0x152e1
+	.uleb128 0x4f
+	.8byte	.LVL777
+	.4byte	0x152e1
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x148cb
+	.4byte	0x149ec
 	.8byte	.LBB1789
 	.8byte	.LBE1789-.LBB1789
 	.byte	0x1
-	.2byte	0xbc6
+	.2byte	0xc16
 	.4byte	0xfc3e
 	.uleb128 0x55
-	.4byte	0x148e4
+	.4byte	0x14a05
 	.uleb128 0x55
-	.4byte	0x148d8
+	.4byte	0x149f9
 	.uleb128 0x5d
-	.4byte	0x149d3
+	.4byte	0x14af4
 	.8byte	.LBB1790
 	.8byte	.LBE1790-.LBB1790
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x55
-	.4byte	0x149ec
+	.4byte	0x14b0d
 	.uleb128 0x55
-	.4byte	0x149e0
+	.4byte	0x14b01
 	.byte	0
 	.byte	0
 	.uleb128 0x54
@@ -41688,289 +41946,289 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1792
 	.8byte	.LBE1792-.LBB1792
 	.byte	0x1
-	.2byte	0xbc9
+	.2byte	0xc19
 	.4byte	0xfcd5
 	.uleb128 0x55
 	.4byte	0xffb8
 	.uleb128 0x4f
-	.8byte	.LVL710
-	.4byte	0x152a8
-	.uleb128 0x4f
-	.8byte	.LVL711
-	.4byte	0x152a8
-	.uleb128 0x4f
-	.8byte	.LVL712
-	.4byte	0x152b4
-	.uleb128 0x4f
 	.8byte	.LVL713
-	.4byte	0x152b4
+	.4byte	0x153c9
 	.uleb128 0x4f
 	.8byte	.LVL714
-	.4byte	0x152b4
+	.4byte	0x153c9
 	.uleb128 0x4f
 	.8byte	.LVL715
-	.4byte	0x152b4
+	.4byte	0x153d5
 	.uleb128 0x4f
 	.8byte	.LVL716
-	.4byte	0x152b4
+	.4byte	0x153d5
 	.uleb128 0x4f
 	.8byte	.LVL717
-	.4byte	0x152b4
+	.4byte	0x153d5
 	.uleb128 0x4f
 	.8byte	.LVL718
-	.4byte	0x152b4
-	.byte	0
+	.4byte	0x153d5
 	.uleb128 0x4f
-	.8byte	.LVL596
-	.4byte	0x15179
+	.8byte	.LVL719
+	.4byte	0x153d5
 	.uleb128 0x4f
-	.8byte	.LVL597
-	.4byte	0x152c1
+	.8byte	.LVL720
+	.4byte	0x153d5
+	.uleb128 0x4f
+	.8byte	.LVL721
+	.4byte	0x153d5
+	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL599
-	.4byte	0x152cd
+	.4byte	0x1529a
 	.uleb128 0x4f
-	.8byte	.LVL605
-	.4byte	0x152da
+	.8byte	.LVL600
+	.4byte	0x153e2
+	.uleb128 0x4f
+	.8byte	.LVL602
+	.4byte	0x153ee
 	.uleb128 0x4f
 	.8byte	.LVL608
-	.4byte	0x152e7
+	.4byte	0x153fb
 	.uleb128 0x4f
-	.8byte	.LVL609
-	.4byte	0x151c0
+	.8byte	.LVL611
+	.4byte	0x15408
 	.uleb128 0x4f
-	.8byte	.LVL617
-	.4byte	0x15146
+	.8byte	.LVL612
+	.4byte	0x152e1
 	.uleb128 0x4f
-	.8byte	.LVL651
-	.4byte	0x151c0
+	.8byte	.LVL620
+	.4byte	0x15267
 	.uleb128 0x4f
-	.8byte	.LVL653
-	.4byte	0x151c0
+	.8byte	.LVL654
+	.4byte	0x152e1
 	.uleb128 0x4f
 	.8byte	.LVL656
-	.4byte	0x151c0
+	.4byte	0x152e1
 	.uleb128 0x4f
-	.8byte	.LVL658
-	.4byte	0x151c0
+	.8byte	.LVL659
+	.4byte	0x152e1
 	.uleb128 0x4f
 	.8byte	.LVL661
-	.4byte	0x151c0
+	.4byte	0x152e1
 	.uleb128 0x4f
-	.8byte	.LVL719
-	.4byte	0x15146
+	.8byte	.LVL664
+	.4byte	0x152e1
 	.uleb128 0x4f
-	.8byte	.LVL749
-	.4byte	0x151c0
+	.8byte	.LVL722
+	.4byte	0x15267
 	.uleb128 0x4f
-	.8byte	.LVL757
-	.4byte	0x151c0
+	.8byte	.LVL752
+	.4byte	0x152e1
 	.uleb128 0x4f
-	.8byte	.LVL762
-	.4byte	0x151c0
+	.8byte	.LVL760
+	.4byte	0x152e1
 	.uleb128 0x4f
-	.8byte	.LVL776
-	.4byte	0x152f4
+	.8byte	.LVL765
+	.4byte	0x152e1
+	.uleb128 0x4f
+	.8byte	.LVL779
+	.4byte	0x15415
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0xaf7
+	.2byte	0xb47
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfe55
 	.uleb128 0x65
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xaf7
+	.2byte	0xb47
 	.4byte	0xe557
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xaf7
+	.2byte	0xb47
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xaf9
+	.2byte	0xb49
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0xafa
+	.2byte	0xb4a
 	.4byte	0x6d
 	.uleb128 0x48
 	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0xafb
+	.2byte	0xb4b
 	.4byte	0x6d
 	.uleb128 0x48
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0xafc
+	.2byte	0xb4c
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0xafd
+	.2byte	0xb4d
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0xafe
+	.2byte	0xb4e
 	.4byte	0x21e
 	.uleb128 0x48
 	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0xaff
+	.2byte	0xb4f
 	.4byte	0x21e
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xb00
+	.2byte	0xb50
 	.4byte	0xe4f2
 	.uleb128 0x48
 	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0xb01
+	.2byte	0xb51
 	.4byte	0x458
 	.uleb128 0x48
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0xb02
+	.2byte	0xb52
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0xae0
+	.2byte	0xb30
 	.byte	0x1
 	.4byte	0xfe6f
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xae0
+	.2byte	0xb30
 	.4byte	0xe874
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0xac4
+	.2byte	0xb14
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfea7
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xac4
+	.2byte	0xb14
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF2480
 	.byte	0x1
-	.2byte	0xac6
+	.2byte	0xb16
 	.4byte	0xd88a
 	.uleb128 0x68
 	.uleb128 0x53
 	.string	"__k"
 	.byte	0x1
-	.2byte	0xad5
+	.2byte	0xb25
 	.4byte	0x2f05
 	.byte	0
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0xa85
+	.2byte	0xad5
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xff21
 	.uleb128 0x65
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa85
+	.2byte	0xad5
 	.4byte	0xe557
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xa87
+	.2byte	0xad7
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xa88
+	.2byte	0xad8
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xa89
+	.2byte	0xad9
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0xa8a
+	.2byte	0xada
 	.4byte	0xb904
 	.uleb128 0x53
 	.string	"r"
 	.byte	0x1
-	.2byte	0xa8b
+	.2byte	0xadb
 	.4byte	0x97bc
 	.uleb128 0x48
 	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0xa8c
+	.2byte	0xadc
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xa8d
+	.2byte	0xadd
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0xa8d
+	.2byte	0xadd
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0xa59
+	.2byte	0xaa9
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xff92
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xa59
+	.2byte	0xaa9
 	.4byte	0xe874
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xa5b
+	.2byte	0xaab
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xa5c
+	.2byte	0xaac
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0xa5d
+	.2byte	0xaad
 	.4byte	0xb904
 	.uleb128 0x53
 	.string	"r"
 	.byte	0x1
-	.2byte	0xa5e
+	.2byte	0xaae
 	.4byte	0x97bc
 	.uleb128 0x48
 	.4byte	.LASF2982
 	.byte	0x1
-	.2byte	0xa5f
+	.2byte	0xaaf
 	.4byte	0x29
 	.uleb128 0x48
 	.4byte	.LASF2983
 	.byte	0x1
-	.2byte	0xa60
+	.2byte	0xab0
 	.4byte	0xc6
 	.uleb128 0x69
 	.4byte	.LASF3050
@@ -41989,520 +42247,520 @@ __exitcall_ebc_exit:
 	.uleb128 0x64
 	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0xa49
+	.2byte	0xa99
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xffc5
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xa49
+	.2byte	0xa99
 	.4byte	0xe874
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0xa40
+	.2byte	0xa90
 	.4byte	0x2ee
-	.8byte	.LFB2854
-	.8byte	.LFE2854-.LFB2854
+	.8byte	.LFB2855
+	.8byte	.LFE2855-.LFB2855
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x10025
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa40
+	.2byte	0xa90
 	.4byte	0xa5e0
 	.4byte	.LLST78
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa41
+	.2byte	0xa91
 	.4byte	0xb45b
 	.4byte	.LLST79
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa42
+	.2byte	0xa92
 	.4byte	0x21e
 	.4byte	.LLST80
 	.uleb128 0x4f
-	.8byte	.LVL306
-	.4byte	0x152fe
+	.8byte	.LVL309
+	.4byte	0x1541f
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0xa37
+	.2byte	0xa87
 	.4byte	0x2ee
-	.8byte	.LFB2853
-	.8byte	.LFE2853-.LFB2853
+	.8byte	.LFB2854
+	.8byte	.LFE2854-.LFB2854
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x10085
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa37
+	.2byte	0xa87
 	.4byte	0xa5e0
 	.4byte	.LLST81
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa38
+	.2byte	0xa88
 	.4byte	0xb45b
 	.4byte	.LLST82
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa39
+	.2byte	0xa89
 	.4byte	0x21e
 	.4byte	.LLST83
 	.uleb128 0x4f
-	.8byte	.LVL311
-	.4byte	0x1530a
+	.8byte	.LVL314
+	.4byte	0x1542b
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0xa2e
+	.2byte	0xa7e
 	.4byte	0x2ee
-	.8byte	.LFB2852
-	.8byte	.LFE2852-.LFB2852
+	.8byte	.LFB2853
+	.8byte	.LFE2853-.LFB2853
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x100e5
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa2e
+	.2byte	0xa7e
 	.4byte	0xa5e0
 	.4byte	.LLST84
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa2f
+	.2byte	0xa7f
 	.4byte	0xb45b
 	.4byte	.LLST85
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa30
+	.2byte	0xa80
 	.4byte	0x21e
 	.4byte	.LLST86
 	.uleb128 0x4f
-	.8byte	.LVL316
-	.4byte	0x1530a
+	.8byte	.LVL319
+	.4byte	0x1542b
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0xa16
+	.2byte	0xa66
 	.4byte	0x2ee
-	.8byte	.LFB2851
-	.8byte	.LFE2851-.LFB2851
+	.8byte	.LFB2852
+	.8byte	.LFE2852-.LFB2852
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x101b5
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa16
+	.2byte	0xa66
 	.4byte	0xa5e0
 	.4byte	.LLST96
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa17
+	.2byte	0xa67
 	.4byte	0xb45b
 	.4byte	.LLST97
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa18
+	.2byte	0xa68
 	.4byte	0x56
 	.4byte	.LLST98
 	.uleb128 0x59
 	.4byte	.LASF383
 	.byte	0x1
-	.2byte	0xa18
+	.2byte	0xa68
 	.4byte	0x2e3
 	.4byte	.LLST99
 	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa1a
+	.2byte	0xa6a
 	.4byte	0xe557
 	.4byte	.LLST100
 	.uleb128 0x5a
 	.4byte	.LASF2470
 	.byte	0x1
-	.2byte	0xa1b
+	.2byte	0xa6b
 	.4byte	0xc6
 	.4byte	.LLST101
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xa1b
+	.2byte	0xa6b
 	.4byte	0xc6
 	.uleb128 0x4f
-	.8byte	.LVL342
-	.4byte	0x15317
-	.uleb128 0x4f
-	.8byte	.LVL344
-	.4byte	0x15324
+	.8byte	.LVL345
+	.4byte	0x15438
 	.uleb128 0x4f
-	.8byte	.LVL349
-	.4byte	0x151c0
+	.8byte	.LVL347
+	.4byte	0x15445
 	.uleb128 0x4f
 	.8byte	.LVL352
-	.4byte	0x151c0
+	.4byte	0x152e1
 	.uleb128 0x4f
-	.8byte	.LVL353
-	.4byte	0x152f4
+	.8byte	.LVL355
+	.4byte	0x152e1
+	.uleb128 0x4f
+	.8byte	.LVL356
+	.4byte	0x15415
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0xa0a
+	.2byte	0xa5a
 	.4byte	0x2ee
-	.8byte	.LFB2850
-	.8byte	.LFE2850-.LFB2850
+	.8byte	.LFB2851
+	.8byte	.LFE2851-.LFB2851
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x1024f
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa0a
+	.2byte	0xa5a
 	.4byte	0xa5e0
 	.4byte	.LLST87
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa0b
+	.2byte	0xa5b
 	.4byte	0xb45b
 	.4byte	.LLST88
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa0c
+	.2byte	0xa5c
 	.4byte	0x21e
 	.4byte	.LLST89
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa0e
+	.2byte	0xa5e
 	.4byte	0xe557
 	.uleb128 0x48
 	.4byte	.LASF2470
 	.byte	0x1
-	.2byte	0xa0f
+	.2byte	0xa5f
 	.4byte	0xc6
 	.uleb128 0x54
-	.4byte	0x1457e
+	.4byte	0x1469f
 	.8byte	.LBB1232
 	.8byte	.LBE1232-.LBB1232
 	.byte	0x1
-	.2byte	0xa11
+	.2byte	0xa61
 	.4byte	0x10241
 	.uleb128 0x55
-	.4byte	0x1458e
+	.4byte	0x146af
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL321
-	.4byte	0x1530a
+	.8byte	.LVL324
+	.4byte	0x1542b
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0x9fc
+	.2byte	0xa4c
 	.4byte	0x2ee
-	.8byte	.LFB2849
-	.8byte	.LFE2849-.LFB2849
+	.8byte	.LFB2850
+	.8byte	.LFE2850-.LFB2850
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x102f8
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x9fc
+	.2byte	0xa4c
 	.4byte	0xa5e0
 	.4byte	.LLST90
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x9fd
+	.2byte	0xa4d
 	.4byte	0xb45b
 	.4byte	.LLST91
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x9fe
+	.2byte	0xa4e
 	.4byte	0x21e
 	.4byte	.LLST92
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa00
+	.2byte	0xa50
 	.4byte	0xe557
 	.uleb128 0x6a
 	.string	"t"
 	.byte	0x1
-	.2byte	0xa01
+	.2byte	0xa51
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x5c
-	.4byte	0x1459b
+	.4byte	0x146bc
 	.8byte	.LBB1234
 	.4byte	.Ldebug_ranges0+0x6a0
 	.byte	0x1
-	.2byte	0xa03
+	.2byte	0xa53
 	.4byte	0x102dd
 	.uleb128 0x55
-	.4byte	0x145b7
+	.4byte	0x146d8
 	.uleb128 0x55
-	.4byte	0x145ab
+	.4byte	0x146cc
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL328
-	.4byte	0x1530a
-	.uleb128 0x4f
 	.8byte	.LVL331
-	.4byte	0x152f4
+	.4byte	0x1542b
+	.uleb128 0x4f
+	.8byte	.LVL334
+	.4byte	0x15415
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0x9f1
+	.2byte	0xa41
 	.4byte	0x2ee
-	.8byte	.LFB2848
-	.8byte	.LFE2848-.LFB2848
+	.8byte	.LFB2849
+	.8byte	.LFE2849-.LFB2849
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x10364
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x9f1
+	.2byte	0xa41
 	.4byte	0xa5e0
 	.4byte	.LLST93
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x9f2
+	.2byte	0xa42
 	.4byte	0xb45b
 	.4byte	.LLST94
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x9f3
+	.2byte	0xa43
 	.4byte	0x21e
 	.4byte	.LLST95
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x9f5
+	.2byte	0xa45
 	.4byte	0xe557
 	.uleb128 0x4f
-	.8byte	.LVL336
-	.4byte	0x1530a
+	.8byte	.LVL339
+	.4byte	0x1542b
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0x9e6
+	.2byte	0xa36
 	.4byte	0x2ee
-	.8byte	.LFB2847
-	.8byte	.LFE2847-.LFB2847
+	.8byte	.LFB2848
+	.8byte	.LFE2848-.LFB2848
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x103dd
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x9e6
+	.2byte	0xa36
 	.4byte	0xa5e0
 	.4byte	.LLST102
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x9e7
+	.2byte	0xa37
 	.4byte	0xb45b
 	.4byte	.LLST103
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x9e8
+	.2byte	0xa38
 	.4byte	0x21e
 	.4byte	.LLST104
 	.uleb128 0x48
 	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0x9ea
+	.2byte	0xa3a
 	.4byte	0x56
 	.uleb128 0x4f
-	.8byte	.LVL355
-	.4byte	0x15330
+	.8byte	.LVL358
+	.4byte	0x15451
 	.uleb128 0x4f
-	.8byte	.LVL356
-	.4byte	0x1530a
+	.8byte	.LVL359
+	.4byte	0x1542b
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0x9d3
+	.2byte	0xa23
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x10407
 	.uleb128 0x66
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0x9d3
+	.2byte	0xa23
 	.4byte	0x1c7f
 	.uleb128 0x66
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x9d3
+	.2byte	0xa23
 	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0x9c3
+	.2byte	0xa13
 	.4byte	0xc6
-	.8byte	.LFB2845
-	.8byte	.LFE2845-.LFB2845
+	.8byte	.LFB2846
+	.8byte	.LFE2846-.LFB2846
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x1046f
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x9c3
+	.2byte	0xa13
 	.4byte	0x55cc
 	.4byte	.LLST16
 	.uleb128 0x52
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x9c3
+	.2byte	0xa13
 	.4byte	0x3d25
 	.4byte	.LLST17
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x9c5
+	.2byte	0xa15
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF898
 	.byte	0x1
-	.2byte	0x9c6
+	.2byte	0xa16
 	.4byte	0x29
 	.uleb128 0x4f
 	.8byte	.LVL82
-	.4byte	0x1533c
+	.4byte	0x1545d
 	.byte	0
 	.uleb128 0x6b
 	.4byte	.LASF3085
 	.byte	0x1
-	.2byte	0x9ac
+	.2byte	0x9fc
 	.4byte	0xc6
 	.4byte	0x10498
 	.uleb128 0x66
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0x9ac
+	.2byte	0x9fc
 	.4byte	0x1c7f
 	.uleb128 0x66
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x9ac
+	.2byte	0x9fc
 	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0x99d
+	.2byte	0x9ed
 	.4byte	0xc6
-	.8byte	.LFB2843
-	.8byte	.LFE2843-.LFB2843
+	.8byte	.LFB2844
+	.8byte	.LFE2844-.LFB2844
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x10501
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x99d
+	.2byte	0x9ed
 	.4byte	0x55cc
 	.4byte	.LLST14
 	.uleb128 0x52
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x99d
+	.2byte	0x9ed
 	.4byte	0x3d25
 	.4byte	.LLST15
 	.uleb128 0x48
 	.4byte	.LASF898
 	.byte	0x1
-	.2byte	0x99f
+	.2byte	0x9ef
 	.4byte	0x29
 	.uleb128 0x4f
 	.8byte	.LVL76
-	.4byte	0x15349
+	.4byte	0x1546a
 	.uleb128 0x4f
 	.8byte	.LVL77
-	.4byte	0x1533c
+	.4byte	0x1545d
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3087
 	.byte	0x1
-	.2byte	0x8d1
+	.2byte	0x921
 	.4byte	0x199
-	.8byte	.LFB2842
-	.8byte	.LFE2842-.LFB2842
+	.8byte	.LFB2843
+	.8byte	.LFE2843-.LFB2843
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x117a9
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x8d1
+	.2byte	0x921
 	.4byte	0x55cc
 	.4byte	.LLST18
 	.uleb128 0x52
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0x8d1
+	.2byte	0x921
 	.4byte	0x6d
 	.4byte	.LLST19
 	.uleb128 0x52
 	.string	"arg"
 	.byte	0x1
-	.2byte	0x8d1
+	.2byte	0x921
 	.4byte	0x29
 	.4byte	.LLST20
 	.uleb128 0x48
 	.4byte	.LASF3088
 	.byte	0x1
-	.2byte	0x8d3
+	.2byte	0x923
 	.4byte	0x458
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x8d4
+	.2byte	0x924
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x8d5
+	.2byte	0x925
 	.4byte	0xe874
 	.uleb128 0x4d
 	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x8d6
+	.2byte	0x926
 	.4byte	0xda8e
 	.uleb128 0x2
 	.byte	0x91
@@ -42510,48 +42768,48 @@ __exitcall_ebc_exit:
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x8d7
+	.2byte	0x927
 	.4byte	0xe4f2
 	.uleb128 0x48
 	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x8d8
+	.2byte	0x928
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x8d9
+	.2byte	0x929
 	.4byte	0x29
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x8da
+	.2byte	0x92a
 	.4byte	0xc6
 	.uleb128 0x56
 	.4byte	.LASF3050
 	.4byte	0x117b9
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35197
+	.8byte	__func__.35218
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x1a0
 	.4byte	0x1066b
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x926
+	.2byte	0x976
 	.4byte	0xc6
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1a0
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x926
+	.2byte	0x976
 	.8byte	.L216
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x926
+	.2byte	0x976
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -42559,7 +42817,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x926
+	.2byte	0x976
 	.4byte	0x199
 	.uleb128 0x6d
 	.8byte	.LBB1024
@@ -42568,71 +42826,71 @@ __exitcall_ebc_exit:
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x926
+	.2byte	0x976
 	.4byte	0x199
 	.4byte	.LLST35
 	.uleb128 0x4f
 	.8byte	.LVL127
-	.4byte	0x15355
+	.4byte	0x15476
 	.uleb128 0x4f
 	.8byte	.LVL128
-	.4byte	0x15361
+	.4byte	0x15482
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL125
-	.4byte	0x1536e
+	.4byte	0x1548f
 	.uleb128 0x4f
 	.8byte	.LVL129
-	.4byte	0x1537a
+	.4byte	0x1549b
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x146ac
+	.4byte	0x147cd
 	.8byte	.LBB960
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x98f
+	.2byte	0x9df
 	.4byte	0x1088b
 	.uleb128 0x55
-	.4byte	0x146d2
+	.4byte	0x147f3
 	.uleb128 0x55
-	.4byte	0x146c6
+	.4byte	0x147e7
 	.uleb128 0x55
-	.4byte	0x146bc
+	.4byte	0x147dd
 	.uleb128 0x6e
-	.4byte	0x1470c
+	.4byte	0x1482d
 	.8byte	.LBB961
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x14732
+	.4byte	0x14853
 	.uleb128 0x55
-	.4byte	0x14726
+	.4byte	0x14847
 	.uleb128 0x55
-	.4byte	0x1471c
+	.4byte	0x1483d
 	.uleb128 0x6f
-	.4byte	0x147ab
+	.4byte	0x148cc
 	.8byte	.LBB963
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x107c1
 	.uleb128 0x55
-	.4byte	0x147c7
+	.4byte	0x148e8
 	.uleb128 0x70
-	.4byte	0x147bb
+	.4byte	0x148dc
 	.4byte	.LLST21
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x80
 	.uleb128 0x61
-	.4byte	0x147d3
+	.4byte	0x148f4
 	.4byte	.LLST22
 	.uleb128 0x61
-	.4byte	0x147de
+	.4byte	0x148ff
 	.4byte	.LLST23
 	.uleb128 0x71
-	.4byte	0x14bf6
+	.4byte	0x14d17
 	.8byte	.LBB965
 	.8byte	.LBE965-.LBB965
 	.byte	0x6
@@ -42642,99 +42900,99 @@ __exitcall_ebc_exit:
 	.8byte	.LBB966
 	.8byte	.LBE966-.LBB966
 	.uleb128 0x61
-	.4byte	0x14c06
+	.4byte	0x14d27
 	.4byte	.LLST24
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14bc9
+	.4byte	0x14cea
 	.8byte	.LBB967
 	.8byte	.LBE967-.LBB967
 	.byte	0x6
 	.byte	0x55
 	.4byte	0x1076f
 	.uleb128 0x55
-	.4byte	0x14be3
+	.4byte	0x14d04
 	.uleb128 0x55
-	.4byte	0x14bd9
+	.4byte	0x14cfa
 	.uleb128 0x5d
-	.4byte	0x14d06
+	.4byte	0x14e27
 	.8byte	.LBB968
 	.8byte	.LBE968-.LBB968
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14d20
+	.4byte	0x14e41
 	.uleb128 0x55
-	.4byte	0x14d16
+	.4byte	0x14e37
 	.byte	0
 	.byte	0
 	.uleb128 0x57
 	.8byte	.LBB970
 	.8byte	.LBE970-.LBB970
 	.uleb128 0x58
-	.4byte	0x147ea
+	.4byte	0x1490b
 	.uleb128 0x5d
-	.4byte	0x14c7c
+	.4byte	0x14d9d
 	.8byte	.LBB971
 	.8byte	.LBE971-.LBB971
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14c98
+	.4byte	0x14db9
 	.uleb128 0x55
-	.4byte	0x14c8c
+	.4byte	0x14dad
 	.uleb128 0x57
 	.8byte	.LBB972
 	.8byte	.LBE972-.LBB972
 	.uleb128 0x58
-	.4byte	0x14ca4
+	.4byte	0x14dc5
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14777
+	.4byte	0x14898
 	.8byte	.LBB977
 	.8byte	.LBE977-.LBB977
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x1087c
 	.uleb128 0x55
-	.4byte	0x14787
+	.4byte	0x148a8
 	.uleb128 0x57
 	.8byte	.LBB978
 	.8byte	.LBE978-.LBB978
 	.uleb128 0x61
-	.4byte	0x14792
+	.4byte	0x148b3
 	.4byte	.LLST25
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0xc0
 	.4byte	0x10847
 	.uleb128 0x61
-	.4byte	0x1479e
+	.4byte	0x148bf
 	.4byte	.LLST26
 	.uleb128 0x5d
-	.4byte	0x14c7c
+	.4byte	0x14d9d
 	.8byte	.LBB980
 	.8byte	.LBE980-.LBB980
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14c98
+	.4byte	0x14db9
 	.uleb128 0x55
-	.4byte	0x14c8c
+	.4byte	0x14dad
 	.uleb128 0x57
 	.8byte	.LBB981
 	.8byte	.LBE981-.LBB981
 	.uleb128 0x58
-	.4byte	0x14ca4
+	.4byte	0x14dc5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14bf6
+	.4byte	0x14d17
 	.8byte	.LBB982
 	.8byte	.LBE982-.LBB982
 	.byte	0x6
@@ -42743,7 +43001,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB983
 	.8byte	.LBE983-.LBB983
 	.uleb128 0x61
-	.4byte	0x14c06
+	.4byte	0x14d27
 	.4byte	.LLST27
 	.byte	0
 	.byte	0
@@ -42751,60 +43009,60 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL155
-	.4byte	0x15387
+	.4byte	0x154a8
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x146dc
+	.4byte	0x147fd
 	.8byte	.LBB993
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
-	.2byte	0x911
+	.2byte	0x961
 	.4byte	0x10ab6
 	.uleb128 0x55
-	.4byte	0x14702
+	.4byte	0x14823
 	.uleb128 0x55
-	.4byte	0x146f6
+	.4byte	0x14817
 	.uleb128 0x55
-	.4byte	0x146ec
+	.4byte	0x1480d
 	.uleb128 0x6e
-	.4byte	0x1473c
+	.4byte	0x1485d
 	.8byte	.LBB994
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x14762
+	.4byte	0x14883
 	.uleb128 0x55
-	.4byte	0x14756
+	.4byte	0x14877
 	.uleb128 0x55
-	.4byte	0x1474c
+	.4byte	0x1486d
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x58
-	.4byte	0x1476b
+	.4byte	0x1488c
 	.uleb128 0x6f
-	.4byte	0x147ab
+	.4byte	0x148cc
 	.8byte	.LBB996
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x109eb
 	.uleb128 0x55
-	.4byte	0x147c7
+	.4byte	0x148e8
 	.uleb128 0x70
-	.4byte	0x147bb
+	.4byte	0x148dc
 	.4byte	.LLST28
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x130
 	.uleb128 0x61
-	.4byte	0x147d3
+	.4byte	0x148f4
 	.4byte	.LLST29
 	.uleb128 0x61
-	.4byte	0x147de
+	.4byte	0x148ff
 	.4byte	.LLST30
 	.uleb128 0x71
-	.4byte	0x14bf6
+	.4byte	0x14d17
 	.8byte	.LBB998
 	.8byte	.LBE998-.LBB998
 	.byte	0x6
@@ -42814,7 +43072,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB999
 	.8byte	.LBE999-.LBB999
 	.uleb128 0x61
-	.4byte	0x14c06
+	.4byte	0x14d27
 	.4byte	.LLST31
 	.byte	0
 	.byte	0
@@ -42823,90 +43081,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1000-.LBB1000
 	.4byte	0x109a5
 	.uleb128 0x58
-	.4byte	0x147ea
+	.4byte	0x1490b
 	.uleb128 0x5d
-	.4byte	0x14c7c
+	.4byte	0x14d9d
 	.8byte	.LBB1001
 	.8byte	.LBE1001-.LBB1001
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14c98
+	.4byte	0x14db9
 	.uleb128 0x55
-	.4byte	0x14c8c
+	.4byte	0x14dad
 	.uleb128 0x57
 	.8byte	.LBB1002
 	.8byte	.LBE1002-.LBB1002
 	.uleb128 0x58
-	.4byte	0x14ca4
+	.4byte	0x14dc5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14bc9
+	.4byte	0x14cea
 	.8byte	.LBB1003
 	.8byte	.LBE1003-.LBB1003
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14be3
+	.4byte	0x14d04
 	.uleb128 0x55
-	.4byte	0x14bd9
+	.4byte	0x14cfa
 	.uleb128 0x5d
-	.4byte	0x14d06
+	.4byte	0x14e27
 	.8byte	.LBB1004
 	.8byte	.LBE1004-.LBB1004
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14d20
+	.4byte	0x14e41
 	.uleb128 0x55
-	.4byte	0x14d16
+	.4byte	0x14e37
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14777
+	.4byte	0x14898
 	.8byte	.LBB1008
 	.8byte	.LBE1008-.LBB1008
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x10aa6
 	.uleb128 0x55
-	.4byte	0x14787
+	.4byte	0x148a8
 	.uleb128 0x57
 	.8byte	.LBB1009
 	.8byte	.LBE1009-.LBB1009
 	.uleb128 0x61
-	.4byte	0x14792
+	.4byte	0x148b3
 	.4byte	.LLST32
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x170
 	.4byte	0x10a71
 	.uleb128 0x61
-	.4byte	0x1479e
+	.4byte	0x148bf
 	.4byte	.LLST33
 	.uleb128 0x5d
-	.4byte	0x14c7c
+	.4byte	0x14d9d
 	.8byte	.LBB1011
 	.8byte	.LBE1011-.LBB1011
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14c98
+	.4byte	0x14db9
 	.uleb128 0x55
-	.4byte	0x14c8c
+	.4byte	0x14dad
 	.uleb128 0x57
 	.8byte	.LBB1012
 	.8byte	.LBE1012-.LBB1012
 	.uleb128 0x58
-	.4byte	0x14ca4
+	.4byte	0x14dc5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14bf6
+	.4byte	0x14d17
 	.8byte	.LBB1013
 	.8byte	.LBE1013-.LBB1013
 	.byte	0x6
@@ -42915,7 +43173,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1014
 	.8byte	.LBE1014-.LBB1014
 	.uleb128 0x61
-	.4byte	0x14c06
+	.4byte	0x14d27
 	.4byte	.LLST34
 	.byte	0
 	.byte	0
@@ -42923,61 +43181,61 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL120
-	.4byte	0x15394
+	.4byte	0x154b5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x146dc
+	.4byte	0x147fd
 	.8byte	.LBB1028
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
-	.2byte	0x92d
+	.2byte	0x97d
 	.4byte	0x10ce1
 	.uleb128 0x55
-	.4byte	0x14702
+	.4byte	0x14823
 	.uleb128 0x55
-	.4byte	0x146f6
+	.4byte	0x14817
 	.uleb128 0x55
-	.4byte	0x146ec
+	.4byte	0x1480d
 	.uleb128 0x6e
-	.4byte	0x1473c
+	.4byte	0x1485d
 	.8byte	.LBB1029
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x14762
+	.4byte	0x14883
 	.uleb128 0x55
-	.4byte	0x14756
+	.4byte	0x14877
 	.uleb128 0x55
-	.4byte	0x1474c
+	.4byte	0x1486d
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1f0
 	.uleb128 0x58
-	.4byte	0x1476b
+	.4byte	0x1488c
 	.uleb128 0x6f
-	.4byte	0x147ab
+	.4byte	0x148cc
 	.8byte	.LBB1031
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x10c16
 	.uleb128 0x55
-	.4byte	0x147c7
+	.4byte	0x148e8
 	.uleb128 0x70
-	.4byte	0x147bb
+	.4byte	0x148dc
 	.4byte	.LLST36
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x230
 	.uleb128 0x61
-	.4byte	0x147d3
+	.4byte	0x148f4
 	.4byte	.LLST37
 	.uleb128 0x61
-	.4byte	0x147de
+	.4byte	0x148ff
 	.4byte	.LLST38
 	.uleb128 0x71
-	.4byte	0x14bf6
+	.4byte	0x14d17
 	.8byte	.LBB1033
 	.8byte	.LBE1033-.LBB1033
 	.byte	0x6
@@ -42987,7 +43245,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1034
 	.8byte	.LBE1034-.LBB1034
 	.uleb128 0x61
-	.4byte	0x14c06
+	.4byte	0x14d27
 	.4byte	.LLST39
 	.byte	0
 	.byte	0
@@ -42996,90 +43254,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1035-.LBB1035
 	.4byte	0x10bd0
 	.uleb128 0x58
-	.4byte	0x147ea
+	.4byte	0x1490b
 	.uleb128 0x5d
-	.4byte	0x14c7c
+	.4byte	0x14d9d
 	.8byte	.LBB1036
 	.8byte	.LBE1036-.LBB1036
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14c98
+	.4byte	0x14db9
 	.uleb128 0x55
-	.4byte	0x14c8c
+	.4byte	0x14dad
 	.uleb128 0x57
 	.8byte	.LBB1037
 	.8byte	.LBE1037-.LBB1037
 	.uleb128 0x58
-	.4byte	0x14ca4
+	.4byte	0x14dc5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14bc9
+	.4byte	0x14cea
 	.8byte	.LBB1038
 	.8byte	.LBE1038-.LBB1038
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14be3
+	.4byte	0x14d04
 	.uleb128 0x55
-	.4byte	0x14bd9
+	.4byte	0x14cfa
 	.uleb128 0x5d
-	.4byte	0x14d06
+	.4byte	0x14e27
 	.8byte	.LBB1039
 	.8byte	.LBE1039-.LBB1039
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14d20
+	.4byte	0x14e41
 	.uleb128 0x55
-	.4byte	0x14d16
+	.4byte	0x14e37
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14777
+	.4byte	0x14898
 	.8byte	.LBB1043
 	.8byte	.LBE1043-.LBB1043
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x10cd1
 	.uleb128 0x55
-	.4byte	0x14787
+	.4byte	0x148a8
 	.uleb128 0x57
 	.8byte	.LBB1044
 	.8byte	.LBE1044-.LBB1044
 	.uleb128 0x61
-	.4byte	0x14792
+	.4byte	0x148b3
 	.4byte	.LLST40
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x270
 	.4byte	0x10c9c
 	.uleb128 0x61
-	.4byte	0x1479e
+	.4byte	0x148bf
 	.4byte	.LLST41
 	.uleb128 0x5d
-	.4byte	0x14c7c
+	.4byte	0x14d9d
 	.8byte	.LBB1046
 	.8byte	.LBE1046-.LBB1046
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14c98
+	.4byte	0x14db9
 	.uleb128 0x55
-	.4byte	0x14c8c
+	.4byte	0x14dad
 	.uleb128 0x57
 	.8byte	.LBB1047
 	.8byte	.LBE1047-.LBB1047
 	.uleb128 0x58
-	.4byte	0x14ca4
+	.4byte	0x14dc5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14bf6
+	.4byte	0x14d17
 	.8byte	.LBB1048
 	.8byte	.LBE1048-.LBB1048
 	.byte	0x6
@@ -43088,7 +43346,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1049
 	.8byte	.LBE1049-.LBB1049
 	.uleb128 0x61
-	.4byte	0x14c06
+	.4byte	0x14d27
 	.4byte	.LLST42
 	.byte	0
 	.byte	0
@@ -43096,57 +43354,57 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL144
-	.4byte	0x15394
+	.4byte	0x154b5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x146ac
+	.4byte	0x147cd
 	.8byte	.LBB1058
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
-	.2byte	0x8fa
+	.2byte	0x94a
 	.4byte	0x10f01
 	.uleb128 0x55
-	.4byte	0x146d2
+	.4byte	0x147f3
 	.uleb128 0x55
-	.4byte	0x146c6
+	.4byte	0x147e7
 	.uleb128 0x55
-	.4byte	0x146bc
+	.4byte	0x147dd
 	.uleb128 0x6e
-	.4byte	0x1470c
+	.4byte	0x1482d
 	.8byte	.LBB1059
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x14732
+	.4byte	0x14853
 	.uleb128 0x55
-	.4byte	0x14726
+	.4byte	0x14847
 	.uleb128 0x55
-	.4byte	0x1471c
+	.4byte	0x1483d
 	.uleb128 0x6f
-	.4byte	0x147ab
+	.4byte	0x148cc
 	.8byte	.LBB1061
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x10e37
 	.uleb128 0x55
-	.4byte	0x147c7
+	.4byte	0x148e8
 	.uleb128 0x70
-	.4byte	0x147bb
+	.4byte	0x148dc
 	.4byte	.LLST43
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x2f0
 	.uleb128 0x61
-	.4byte	0x147d3
+	.4byte	0x148f4
 	.4byte	.LLST44
 	.uleb128 0x61
-	.4byte	0x147de
+	.4byte	0x148ff
 	.4byte	.LLST45
 	.uleb128 0x71
-	.4byte	0x14bf6
+	.4byte	0x14d17
 	.8byte	.LBB1063
 	.8byte	.LBE1063-.LBB1063
 	.byte	0x6
@@ -43156,7 +43414,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1064
 	.8byte	.LBE1064-.LBB1064
 	.uleb128 0x61
-	.4byte	0x14c06
+	.4byte	0x14d27
 	.4byte	.LLST46
 	.byte	0
 	.byte	0
@@ -43165,90 +43423,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1065-.LBB1065
 	.4byte	0x10df1
 	.uleb128 0x58
-	.4byte	0x147ea
+	.4byte	0x1490b
 	.uleb128 0x5d
-	.4byte	0x14c7c
+	.4byte	0x14d9d
 	.8byte	.LBB1066
 	.8byte	.LBE1066-.LBB1066
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14c98
+	.4byte	0x14db9
 	.uleb128 0x55
-	.4byte	0x14c8c
+	.4byte	0x14dad
 	.uleb128 0x57
 	.8byte	.LBB1067
 	.8byte	.LBE1067-.LBB1067
 	.uleb128 0x58
-	.4byte	0x14ca4
+	.4byte	0x14dc5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14bc9
+	.4byte	0x14cea
 	.8byte	.LBB1068
 	.8byte	.LBE1068-.LBB1068
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14be3
+	.4byte	0x14d04
 	.uleb128 0x55
-	.4byte	0x14bd9
+	.4byte	0x14cfa
 	.uleb128 0x5d
-	.4byte	0x14d06
+	.4byte	0x14e27
 	.8byte	.LBB1069
 	.8byte	.LBE1069-.LBB1069
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14d20
+	.4byte	0x14e41
 	.uleb128 0x55
-	.4byte	0x14d16
+	.4byte	0x14e37
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14777
+	.4byte	0x14898
 	.8byte	.LBB1075
 	.8byte	.LBE1075-.LBB1075
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x10ef2
 	.uleb128 0x55
-	.4byte	0x14787
+	.4byte	0x148a8
 	.uleb128 0x57
 	.8byte	.LBB1076
 	.8byte	.LBE1076-.LBB1076
 	.uleb128 0x61
-	.4byte	0x14792
+	.4byte	0x148b3
 	.4byte	.LLST47
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x340
 	.4byte	0x10ebd
 	.uleb128 0x61
-	.4byte	0x1479e
+	.4byte	0x148bf
 	.4byte	.LLST48
 	.uleb128 0x5d
-	.4byte	0x14c7c
+	.4byte	0x14d9d
 	.8byte	.LBB1078
 	.8byte	.LBE1078-.LBB1078
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14c98
+	.4byte	0x14db9
 	.uleb128 0x55
-	.4byte	0x14c8c
+	.4byte	0x14dad
 	.uleb128 0x57
 	.8byte	.LBB1079
 	.8byte	.LBE1079-.LBB1079
 	.uleb128 0x58
-	.4byte	0x14ca4
+	.4byte	0x14dc5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14bf6
+	.4byte	0x14d17
 	.8byte	.LBB1080
 	.8byte	.LBE1080-.LBB1080
 	.byte	0x6
@@ -43257,7 +43515,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1081
 	.8byte	.LBE1081-.LBB1081
 	.uleb128 0x61
-	.4byte	0x14c06
+	.4byte	0x14d27
 	.4byte	.LLST49
 	.byte	0
 	.byte	0
@@ -43265,61 +43523,61 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL171
-	.4byte	0x15387
+	.4byte	0x154a8
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x146dc
+	.4byte	0x147fd
 	.8byte	.LBB1092
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
-	.2byte	0x94a
+	.2byte	0x99a
 	.4byte	0x1113d
 	.uleb128 0x55
-	.4byte	0x14702
+	.4byte	0x14823
 	.uleb128 0x55
-	.4byte	0x146f6
+	.4byte	0x14817
 	.uleb128 0x55
-	.4byte	0x146ec
+	.4byte	0x1480d
 	.uleb128 0x6e
-	.4byte	0x1473c
+	.4byte	0x1485d
 	.8byte	.LBB1093
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x14762
+	.4byte	0x14883
 	.uleb128 0x55
-	.4byte	0x14756
+	.4byte	0x14877
 	.uleb128 0x55
-	.4byte	0x1474c
+	.4byte	0x1486d
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x370
 	.uleb128 0x61
-	.4byte	0x1476b
+	.4byte	0x1488c
 	.4byte	.LLST50
 	.uleb128 0x6f
-	.4byte	0x147ab
+	.4byte	0x148cc
 	.8byte	.LBB1095
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x11065
 	.uleb128 0x55
-	.4byte	0x147c7
+	.4byte	0x148e8
 	.uleb128 0x70
-	.4byte	0x147bb
+	.4byte	0x148dc
 	.4byte	.LLST51
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x61
-	.4byte	0x147d3
+	.4byte	0x148f4
 	.4byte	.LLST52
 	.uleb128 0x61
-	.4byte	0x147de
+	.4byte	0x148ff
 	.4byte	.LLST53
 	.uleb128 0x71
-	.4byte	0x14bf6
+	.4byte	0x14d17
 	.8byte	.LBB1097
 	.8byte	.LBE1097-.LBB1097
 	.byte	0x6
@@ -43329,7 +43587,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1098
 	.8byte	.LBE1098-.LBB1098
 	.uleb128 0x61
-	.4byte	0x14c06
+	.4byte	0x14d27
 	.4byte	.LLST54
 	.byte	0
 	.byte	0
@@ -43338,90 +43596,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1099-.LBB1099
 	.4byte	0x1101f
 	.uleb128 0x58
-	.4byte	0x147ea
+	.4byte	0x1490b
 	.uleb128 0x5d
-	.4byte	0x14c7c
+	.4byte	0x14d9d
 	.8byte	.LBB1100
 	.8byte	.LBE1100-.LBB1100
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14c98
+	.4byte	0x14db9
 	.uleb128 0x55
-	.4byte	0x14c8c
+	.4byte	0x14dad
 	.uleb128 0x57
 	.8byte	.LBB1101
 	.8byte	.LBE1101-.LBB1101
 	.uleb128 0x58
-	.4byte	0x14ca4
+	.4byte	0x14dc5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14bc9
+	.4byte	0x14cea
 	.8byte	.LBB1102
 	.8byte	.LBE1102-.LBB1102
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14be3
+	.4byte	0x14d04
 	.uleb128 0x55
-	.4byte	0x14bd9
+	.4byte	0x14cfa
 	.uleb128 0x5d
-	.4byte	0x14d06
+	.4byte	0x14e27
 	.8byte	.LBB1103
 	.8byte	.LBE1103-.LBB1103
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14d20
+	.4byte	0x14e41
 	.uleb128 0x55
-	.4byte	0x14d16
+	.4byte	0x14e37
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14777
+	.4byte	0x14898
 	.8byte	.LBB1109
 	.8byte	.LBE1109-.LBB1109
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x11120
 	.uleb128 0x55
-	.4byte	0x14787
+	.4byte	0x148a8
 	.uleb128 0x57
 	.8byte	.LBB1110
 	.8byte	.LBE1110-.LBB1110
 	.uleb128 0x61
-	.4byte	0x14792
+	.4byte	0x148b3
 	.4byte	.LLST55
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x420
 	.4byte	0x110eb
 	.uleb128 0x61
-	.4byte	0x1479e
+	.4byte	0x148bf
 	.4byte	.LLST56
 	.uleb128 0x5d
-	.4byte	0x14c7c
+	.4byte	0x14d9d
 	.8byte	.LBB1112
 	.8byte	.LBE1112-.LBB1112
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14c98
+	.4byte	0x14db9
 	.uleb128 0x55
-	.4byte	0x14c8c
+	.4byte	0x14dad
 	.uleb128 0x57
 	.8byte	.LBB1113
 	.8byte	.LBE1113-.LBB1113
 	.uleb128 0x58
-	.4byte	0x14ca4
+	.4byte	0x14dc5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14bf6
+	.4byte	0x14d17
 	.8byte	.LBB1114
 	.8byte	.LBE1114-.LBB1114
 	.byte	0x6
@@ -43430,7 +43688,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1115
 	.8byte	.LBE1115-.LBB1115
 	.uleb128 0x61
-	.4byte	0x14c06
+	.4byte	0x14d27
 	.4byte	.LLST57
 	.byte	0
 	.byte	0
@@ -43438,59 +43696,59 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL183
-	.4byte	0x15394
+	.4byte	0x154b5
 	.uleb128 0x4f
 	.8byte	.LVL261
-	.4byte	0x151aa
+	.4byte	0x152cb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x146ac
+	.4byte	0x147cd
 	.8byte	.LBB1128
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
-	.2byte	0x968
+	.2byte	0x9b8
 	.4byte	0x111ef
 	.uleb128 0x55
-	.4byte	0x146d2
+	.4byte	0x147f3
 	.uleb128 0x55
-	.4byte	0x146c6
+	.4byte	0x147e7
 	.uleb128 0x55
-	.4byte	0x146bc
+	.4byte	0x147dd
 	.uleb128 0x6e
-	.4byte	0x1470c
+	.4byte	0x1482d
 	.8byte	.LBB1129
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x14732
+	.4byte	0x14853
 	.uleb128 0x55
-	.4byte	0x14726
+	.4byte	0x14847
 	.uleb128 0x55
-	.4byte	0x1471c
+	.4byte	0x1483d
 	.uleb128 0x6e
-	.4byte	0x147ab
+	.4byte	0x148cc
 	.8byte	.LBB1131
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x55
-	.4byte	0x147c7
+	.4byte	0x148e8
 	.uleb128 0x72
-	.4byte	0x147bb
+	.4byte	0x148dc
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x4b0
 	.uleb128 0x58
-	.4byte	0x147d3
+	.4byte	0x148f4
 	.uleb128 0x61
-	.4byte	0x147de
+	.4byte	0x148ff
 	.4byte	.LLST58
 	.uleb128 0x5d
-	.4byte	0x14bf6
+	.4byte	0x14d17
 	.8byte	.LBB1133
 	.8byte	.LBE1133-.LBB1133
 	.byte	0x6
@@ -43499,7 +43757,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1134
 	.8byte	.LBE1134-.LBB1134
 	.uleb128 0x61
-	.4byte	0x14c06
+	.4byte	0x14d27
 	.4byte	.LLST59
 	.byte	0
 	.byte	0
@@ -43508,52 +43766,52 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x146ac
+	.4byte	0x147cd
 	.8byte	.LBB1140
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
-	.2byte	0x958
+	.2byte	0x9a8
 	.4byte	0x1140f
 	.uleb128 0x55
-	.4byte	0x146d2
+	.4byte	0x147f3
 	.uleb128 0x55
-	.4byte	0x146c6
+	.4byte	0x147e7
 	.uleb128 0x55
-	.4byte	0x146bc
+	.4byte	0x147dd
 	.uleb128 0x6e
-	.4byte	0x1470c
+	.4byte	0x1482d
 	.8byte	.LBB1141
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x14732
+	.4byte	0x14853
 	.uleb128 0x55
-	.4byte	0x14726
+	.4byte	0x14847
 	.uleb128 0x55
-	.4byte	0x1471c
+	.4byte	0x1483d
 	.uleb128 0x6f
-	.4byte	0x147ab
+	.4byte	0x148cc
 	.8byte	.LBB1143
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x11345
 	.uleb128 0x55
-	.4byte	0x147c7
+	.4byte	0x148e8
 	.uleb128 0x70
-	.4byte	0x147bb
+	.4byte	0x148dc
 	.4byte	.LLST60
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x540
 	.uleb128 0x61
-	.4byte	0x147d3
+	.4byte	0x148f4
 	.4byte	.LLST61
 	.uleb128 0x61
-	.4byte	0x147de
+	.4byte	0x148ff
 	.4byte	.LLST62
 	.uleb128 0x71
-	.4byte	0x14bf6
+	.4byte	0x14d17
 	.8byte	.LBB1145
 	.8byte	.LBE1145-.LBB1145
 	.byte	0x6
@@ -43563,7 +43821,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1146
 	.8byte	.LBE1146-.LBB1146
 	.uleb128 0x61
-	.4byte	0x14c06
+	.4byte	0x14d27
 	.4byte	.LLST63
 	.byte	0
 	.byte	0
@@ -43572,90 +43830,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1147-.LBB1147
 	.4byte	0x112ff
 	.uleb128 0x58
-	.4byte	0x147ea
+	.4byte	0x1490b
 	.uleb128 0x5d
-	.4byte	0x14c7c
+	.4byte	0x14d9d
 	.8byte	.LBB1148
 	.8byte	.LBE1148-.LBB1148
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14c98
+	.4byte	0x14db9
 	.uleb128 0x55
-	.4byte	0x14c8c
+	.4byte	0x14dad
 	.uleb128 0x57
 	.8byte	.LBB1149
 	.8byte	.LBE1149-.LBB1149
 	.uleb128 0x58
-	.4byte	0x14ca4
+	.4byte	0x14dc5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14bc9
+	.4byte	0x14cea
 	.8byte	.LBB1150
 	.8byte	.LBE1150-.LBB1150
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14be3
+	.4byte	0x14d04
 	.uleb128 0x55
-	.4byte	0x14bd9
+	.4byte	0x14cfa
 	.uleb128 0x5d
-	.4byte	0x14d06
+	.4byte	0x14e27
 	.8byte	.LBB1151
 	.8byte	.LBE1151-.LBB1151
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14d20
+	.4byte	0x14e41
 	.uleb128 0x55
-	.4byte	0x14d16
+	.4byte	0x14e37
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14777
+	.4byte	0x14898
 	.8byte	.LBB1159
 	.8byte	.LBE1159-.LBB1159
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x11400
 	.uleb128 0x55
-	.4byte	0x14787
+	.4byte	0x148a8
 	.uleb128 0x57
 	.8byte	.LBB1160
 	.8byte	.LBE1160-.LBB1160
 	.uleb128 0x61
-	.4byte	0x14792
+	.4byte	0x148b3
 	.4byte	.LLST64
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x590
 	.4byte	0x113cb
 	.uleb128 0x61
-	.4byte	0x1479e
+	.4byte	0x148bf
 	.4byte	.LLST65
 	.uleb128 0x5d
-	.4byte	0x14c7c
+	.4byte	0x14d9d
 	.8byte	.LBB1162
 	.8byte	.LBE1162-.LBB1162
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14c98
+	.4byte	0x14db9
 	.uleb128 0x55
-	.4byte	0x14c8c
+	.4byte	0x14dad
 	.uleb128 0x57
 	.8byte	.LBB1163
 	.8byte	.LBE1163-.LBB1163
 	.uleb128 0x58
-	.4byte	0x14ca4
+	.4byte	0x14dc5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14bf6
+	.4byte	0x14d17
 	.8byte	.LBB1164
 	.8byte	.LBE1164-.LBB1164
 	.byte	0x6
@@ -43664,7 +43922,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1165
 	.8byte	.LBE1165-.LBB1165
 	.uleb128 0x61
-	.4byte	0x14c06
+	.4byte	0x14d27
 	.4byte	.LLST66
 	.byte	0
 	.byte	0
@@ -43672,56 +43930,56 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL244
-	.4byte	0x15387
+	.4byte	0x154a8
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x146ac
+	.4byte	0x147cd
 	.8byte	.LBB1176
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
-	.2byte	0x909
+	.2byte	0x959
 	.4byte	0x1162f
 	.uleb128 0x55
-	.4byte	0x146d2
+	.4byte	0x147f3
 	.uleb128 0x55
-	.4byte	0x146c6
+	.4byte	0x147e7
 	.uleb128 0x55
-	.4byte	0x146bc
+	.4byte	0x147dd
 	.uleb128 0x6e
-	.4byte	0x1470c
+	.4byte	0x1482d
 	.8byte	.LBB1177
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x14732
+	.4byte	0x14853
 	.uleb128 0x55
-	.4byte	0x14726
+	.4byte	0x14847
 	.uleb128 0x55
-	.4byte	0x1471c
+	.4byte	0x1483d
 	.uleb128 0x6f
-	.4byte	0x147ab
+	.4byte	0x148cc
 	.8byte	.LBB1179
 	.4byte	.Ldebug_ranges0+0x620
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x11565
 	.uleb128 0x55
-	.4byte	0x147c7
+	.4byte	0x148e8
 	.uleb128 0x70
-	.4byte	0x147bb
+	.4byte	0x148dc
 	.4byte	.LLST67
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x620
 	.uleb128 0x61
-	.4byte	0x147d3
+	.4byte	0x148f4
 	.4byte	.LLST68
 	.uleb128 0x61
-	.4byte	0x147de
+	.4byte	0x148ff
 	.4byte	.LLST69
 	.uleb128 0x71
-	.4byte	0x14bf6
+	.4byte	0x14d17
 	.8byte	.LBB1181
 	.8byte	.LBE1181-.LBB1181
 	.byte	0x6
@@ -43731,7 +43989,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1182
 	.8byte	.LBE1182-.LBB1182
 	.uleb128 0x61
-	.4byte	0x14c06
+	.4byte	0x14d27
 	.4byte	.LLST70
 	.byte	0
 	.byte	0
@@ -43740,90 +43998,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1183-.LBB1183
 	.4byte	0x1151f
 	.uleb128 0x58
-	.4byte	0x147ea
+	.4byte	0x1490b
 	.uleb128 0x5d
-	.4byte	0x14c7c
+	.4byte	0x14d9d
 	.8byte	.LBB1184
 	.8byte	.LBE1184-.LBB1184
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14c98
+	.4byte	0x14db9
 	.uleb128 0x55
-	.4byte	0x14c8c
+	.4byte	0x14dad
 	.uleb128 0x57
 	.8byte	.LBB1185
 	.8byte	.LBE1185-.LBB1185
 	.uleb128 0x58
-	.4byte	0x14ca4
+	.4byte	0x14dc5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14bc9
+	.4byte	0x14cea
 	.8byte	.LBB1186
 	.8byte	.LBE1186-.LBB1186
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14be3
+	.4byte	0x14d04
 	.uleb128 0x55
-	.4byte	0x14bd9
+	.4byte	0x14cfa
 	.uleb128 0x5d
-	.4byte	0x14d06
+	.4byte	0x14e27
 	.8byte	.LBB1187
 	.8byte	.LBE1187-.LBB1187
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14d20
+	.4byte	0x14e41
 	.uleb128 0x55
-	.4byte	0x14d16
+	.4byte	0x14e37
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14777
+	.4byte	0x14898
 	.8byte	.LBB1195
 	.8byte	.LBE1195-.LBB1195
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x11620
 	.uleb128 0x55
-	.4byte	0x14787
+	.4byte	0x148a8
 	.uleb128 0x57
 	.8byte	.LBB1196
 	.8byte	.LBE1196-.LBB1196
 	.uleb128 0x61
-	.4byte	0x14792
+	.4byte	0x148b3
 	.4byte	.LLST71
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x670
 	.4byte	0x115eb
 	.uleb128 0x61
-	.4byte	0x1479e
+	.4byte	0x148bf
 	.4byte	.LLST72
 	.uleb128 0x5d
-	.4byte	0x14c7c
+	.4byte	0x14d9d
 	.8byte	.LBB1198
 	.8byte	.LBE1198-.LBB1198
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14c98
+	.4byte	0x14db9
 	.uleb128 0x55
-	.4byte	0x14c8c
+	.4byte	0x14dad
 	.uleb128 0x57
 	.8byte	.LBB1199
 	.8byte	.LBE1199-.LBB1199
 	.uleb128 0x58
-	.4byte	0x14ca4
+	.4byte	0x14dc5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14bf6
+	.4byte	0x14d17
 	.8byte	.LBB1200
 	.8byte	.LBE1200-.LBB1200
 	.byte	0x6
@@ -43832,7 +44090,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1201
 	.8byte	.LBE1201-.LBB1201
 	.uleb128 0x61
-	.4byte	0x14c06
+	.4byte	0x14d27
 	.4byte	.LLST73
 	.byte	0
 	.byte	0
@@ -43840,96 +44098,96 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL252
-	.4byte	0x15387
+	.4byte	0x154a8
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL85
-	.4byte	0x1523c
+	.4byte	0x1535d
 	.uleb128 0x4f
 	.8byte	.LVL86
-	.4byte	0x1529e
+	.4byte	0x153bf
 	.uleb128 0x4f
 	.8byte	.LVL87
-	.4byte	0x15349
+	.4byte	0x1546a
 	.uleb128 0x4f
 	.8byte	.LVL98
-	.4byte	0x153a1
+	.4byte	0x154c2
 	.uleb128 0x4f
 	.8byte	.LVL101
-	.4byte	0x151c0
+	.4byte	0x152e1
 	.uleb128 0x4f
 	.8byte	.LVL104
-	.4byte	0x15146
+	.4byte	0x15267
 	.uleb128 0x4f
 	.8byte	.LVL121
-	.4byte	0x15349
+	.4byte	0x1546a
 	.uleb128 0x4f
 	.8byte	.LVL122
-	.4byte	0x153ad
+	.4byte	0x154ce
 	.uleb128 0x4f
 	.8byte	.LVL124
-	.4byte	0x15248
+	.4byte	0x15369
 	.uleb128 0x4f
 	.8byte	.LVL131
-	.4byte	0x1523c
+	.4byte	0x1535d
 	.uleb128 0x4f
 	.8byte	.LVL145
-	.4byte	0x153b9
+	.4byte	0x154da
 	.uleb128 0x4f
 	.8byte	.LVL146
-	.4byte	0x15248
+	.4byte	0x15369
 	.uleb128 0x4f
 	.8byte	.LVL147
-	.4byte	0x15292
+	.4byte	0x153b3
 	.uleb128 0x4f
 	.8byte	.LVL157
-	.4byte	0x153c5
+	.4byte	0x154e6
 	.uleb128 0x4f
 	.8byte	.LVL158
-	.4byte	0x15349
+	.4byte	0x1546a
 	.uleb128 0x4f
 	.8byte	.LVL185
-	.4byte	0x15146
+	.4byte	0x15267
 	.uleb128 0x4f
 	.8byte	.LVL188
-	.4byte	0x15146
+	.4byte	0x15267
 	.uleb128 0x4f
 	.8byte	.LVL190
-	.4byte	0x1523c
+	.4byte	0x1535d
 	.uleb128 0x4f
 	.8byte	.LVL192
-	.4byte	0x1523c
+	.4byte	0x1535d
 	.uleb128 0x4f
 	.8byte	.LVL193
-	.4byte	0x1529e
+	.4byte	0x153bf
 	.uleb128 0x4f
 	.8byte	.LVL194
-	.4byte	0x15349
+	.4byte	0x1546a
 	.uleb128 0x4f
 	.8byte	.LVL207
-	.4byte	0x151c0
+	.4byte	0x152e1
 	.uleb128 0x4f
 	.8byte	.LVL210
-	.4byte	0x151c0
+	.4byte	0x152e1
 	.uleb128 0x4f
 	.8byte	.LVL212
-	.4byte	0x1523c
+	.4byte	0x1535d
 	.uleb128 0x4f
 	.8byte	.LVL213
-	.4byte	0x15349
+	.4byte	0x1546a
 	.uleb128 0x4f
 	.8byte	.LVL221
-	.4byte	0x153a1
+	.4byte	0x154c2
 	.uleb128 0x4f
 	.8byte	.LVL255
-	.4byte	0x15292
+	.4byte	0x153b3
 	.uleb128 0x4f
 	.8byte	.LVL262
-	.4byte	0x151c0
+	.4byte	0x152e1
 	.uleb128 0x4f
 	.8byte	.LVL263
-	.4byte	0x152f4
+	.4byte	0x15415
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
@@ -43943,140 +44201,140 @@ __exitcall_ebc_exit:
 	.uleb128 0x64
 	.4byte	.LASF3095
 	.byte	0x1
-	.2byte	0x88e
+	.2byte	0x8de
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x117e8
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x88e
+	.2byte	0x8de
 	.4byte	0xe1f4
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x890
+	.2byte	0x8e0
 	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x888
-	.8byte	.LFB2840
-	.8byte	.LFE2840-.LFB2840
+	.2byte	0x8d8
+	.8byte	.LFB2841
+	.8byte	.LFE2841-.LFB2841
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x11822
 	.uleb128 0x52
 	.string	"t"
 	.byte	0x1
-	.2byte	0x888
+	.2byte	0x8d8
 	.4byte	0x31d2
 	.4byte	.LLST74
 	.uleb128 0x4f
 	.8byte	.LVL276
-	.4byte	0x12457
+	.4byte	0x1248b
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x87c
-	.8byte	.LFB2839
-	.8byte	.LFE2839-.LFB2839
+	.2byte	0x8cc
+	.8byte	.LFB2840
+	.8byte	.LFE2840-.LFB2840
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x11882
 	.uleb128 0x52
 	.string	"t"
 	.byte	0x1
-	.2byte	0x87c
+	.2byte	0x8cc
 	.4byte	0x31d2
 	.4byte	.LLST12
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x87e
+	.2byte	0x8ce
 	.4byte	0xe874
 	.uleb128 0x60
-	.4byte	0x14636
+	.4byte	0x14757
 	.8byte	.LBB956
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.2byte	0x882
+	.2byte	0x8d2
 	.uleb128 0x55
-	.4byte	0x14643
+	.4byte	0x14764
 	.uleb128 0x4f
 	.8byte	.LVL71
-	.4byte	0x153d1
+	.4byte	0x154f2
 	.byte	0
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x86b
+	.2byte	0x8bb
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x118ac
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x86b
+	.2byte	0x8bb
 	.4byte	0xe1f4
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x86d
+	.2byte	0x8bd
 	.4byte	0xe4f2
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x71a
+	.2byte	0x766
 	.4byte	0xc6
-	.8byte	.LFB2837
-	.8byte	.LFE2837-.LFB2837
+	.8byte	.LFB2838
+	.8byte	.LFE2838-.LFB2838
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12193
+	.4byte	0x121a0
 	.uleb128 0x52
 	.string	"ptr"
 	.byte	0x1
-	.2byte	0x71a
+	.2byte	0x766
 	.4byte	0x458
-	.4byte	.LLST235
+	.4byte	.LLST239
 	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x71c
+	.2byte	0x768
 	.4byte	0xe557
-	.4byte	.LLST236
+	.4byte	.LLST240
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x71d
+	.2byte	0x769
 	.4byte	0xe874
 	.uleb128 0x5b
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x71e
+	.2byte	0x76a
 	.4byte	0xe4f2
-	.4byte	.LLST237
+	.4byte	.LLST241
 	.uleb128 0x5a
 	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x71f
+	.2byte	0x76b
 	.4byte	0xc6
-	.4byte	.LLST238
+	.4byte	.LLST242
 	.uleb128 0x5a
 	.4byte	.LASF2989
 	.byte	0x1
-	.2byte	0x720
+	.2byte	0x76c
 	.4byte	0xc6
-	.4byte	.LLST239
+	.4byte	.LLST243
 	.uleb128 0x4d
 	.4byte	.LASF3102
 	.byte	0x1
-	.2byte	0x721
+	.2byte	0x76d
 	.4byte	0xd95c
 	.uleb128 0x3
 	.byte	0x91
@@ -44084,34 +44342,34 @@ __exitcall_ebc_exit:
 	.uleb128 0x5a
 	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x722
+	.2byte	0x76e
 	.4byte	0xe4f2
-	.4byte	.LLST240
+	.4byte	.LLST244
 	.uleb128 0x6c
 	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x839
-	.8byte	.L916
+	.2byte	0x889
+	.8byte	.L940
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1230
+	.4byte	.Ldebug_ranges0+0x1260
 	.4byte	0x119fc
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x777
+	.2byte	0x7c3
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB1882
-	.8byte	.LBE1882-.LBB1882
+	.8byte	.LBB1886
+	.8byte	.LBE1886-.LBB1886
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x777
-	.8byte	.L897
+	.2byte	0x7c3
+	.8byte	.L921
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x777
+	.2byte	0x7c3
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -44119,52 +44377,52 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x777
+	.2byte	0x7c3
 	.4byte	0x199
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1260
+	.4byte	.Ldebug_ranges0+0x1290
 	.4byte	0x119e0
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x777
+	.2byte	0x7c3
 	.4byte	0x199
-	.4byte	.LLST256
+	.4byte	.LLST261
 	.uleb128 0x4f
-	.8byte	.LVL989
-	.4byte	0x15355
+	.8byte	.LVL1011
+	.4byte	0x15476
 	.uleb128 0x4f
-	.8byte	.LVL990
-	.4byte	0x15361
+	.8byte	.LVL1012
+	.4byte	0x15482
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL987
-	.4byte	0x1536e
+	.8byte	.LVL1009
+	.4byte	0x1548f
 	.uleb128 0x4f
-	.8byte	.LVL991
-	.4byte	0x1537a
+	.8byte	.LVL1013
+	.4byte	0x1549b
 	.byte	0
 	.byte	0
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x11d0
+	.4byte	.Ldebug_ranges0+0x1200
 	.4byte	0x11a9e
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x825
+	.2byte	0x875
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB1878
-	.8byte	.LBE1878-.LBB1878
+	.8byte	.LBB1882
+	.8byte	.LBE1882-.LBB1882
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x825
-	.8byte	.L957
+	.2byte	0x875
+	.8byte	.L982
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x825
+	.2byte	0x875
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -44172,52 +44430,52 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x825
+	.2byte	0x875
 	.4byte	0x199
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1200
+	.4byte	.Ldebug_ranges0+0x1230
 	.4byte	0x11a82
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x825
+	.2byte	0x875
 	.4byte	0x199
-	.4byte	.LLST255
+	.4byte	.LLST260
 	.uleb128 0x4f
-	.8byte	.LVL999
-	.4byte	0x15355
+	.8byte	.LVL1021
+	.4byte	0x15476
 	.uleb128 0x4f
-	.8byte	.LVL1000
-	.4byte	0x15361
+	.8byte	.LVL1022
+	.4byte	0x15482
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL997
-	.4byte	0x1536e
+	.8byte	.LVL1019
+	.4byte	0x1548f
 	.uleb128 0x4f
-	.8byte	.LVL1001
-	.4byte	0x1537a
+	.8byte	.LVL1023
+	.4byte	0x1549b
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1868
-	.8byte	.LBE1868-.LBB1868
+	.8byte	.LBB1872
+	.8byte	.LBE1872-.LBB1872
 	.4byte	0x11b50
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x857
+	.2byte	0x8a7
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB1869
-	.8byte	.LBE1869-.LBB1869
+	.8byte	.LBB1873
+	.8byte	.LBE1873-.LBB1873
 	.uleb128 0x73
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x857
+	.2byte	0x8a7
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x857
+	.2byte	0x8a7
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -44225,31 +44483,31 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x857
+	.2byte	0x8a7
 	.4byte	0x199
 	.uleb128 0x6d
-	.8byte	.LBB1870
-	.8byte	.LBE1870-.LBB1870
+	.8byte	.LBB1874
+	.8byte	.LBE1874-.LBB1874
 	.4byte	0x11b34
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x857
+	.2byte	0x8a7
 	.4byte	0x199
-	.4byte	.LLST253
+	.4byte	.LLST258
 	.uleb128 0x4f
-	.8byte	.LVL915
-	.4byte	0x15355
+	.8byte	.LVL939
+	.4byte	0x15476
 	.uleb128 0x4f
-	.8byte	.LVL916
-	.4byte	0x15361
+	.8byte	.LVL940
+	.4byte	0x15482
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL913
-	.4byte	0x1536e
+	.8byte	.LVL937
+	.4byte	0x1548f
 	.uleb128 0x4f
-	.8byte	.LVL917
-	.4byte	0x1537a
+	.8byte	.LVL941
+	.4byte	0x1549b
 	.byte	0
 	.byte	0
 	.uleb128 0x63
@@ -44258,19 +44516,19 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x863
+	.2byte	0x8b3
 	.4byte	0xc6
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1090
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x863
-	.8byte	.L974
+	.2byte	0x8b3
+	.8byte	.L999
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x863
+	.2byte	0x8b3
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -44278,7 +44536,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x863
+	.2byte	0x8b3
 	.4byte	0x199
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x10d0
@@ -44286,888 +44544,900 @@ __exitcall_ebc_exit:
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x863
+	.2byte	0x8b3
 	.4byte	0x199
-	.4byte	.LLST241
+	.4byte	.LLST245
 	.uleb128 0x4f
-	.8byte	.LVL874
-	.4byte	0x15355
+	.8byte	.LVL898
+	.4byte	0x15476
 	.uleb128 0x4f
-	.8byte	.LVL875
-	.4byte	0x15361
+	.8byte	.LVL899
+	.4byte	0x15482
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL872
-	.4byte	0x1536e
+	.8byte	.LVL896
+	.4byte	0x1548f
 	.uleb128 0x4f
-	.8byte	.LVL876
-	.4byte	0x1537a
+	.8byte	.LVL900
+	.4byte	0x1549b
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x121e7
+	.4byte	0x121f4
 	.8byte	.LBB1857
 	.4byte	.Ldebug_ranges0+0x1110
 	.byte	0x1
-	.2byte	0x7fc
+	.2byte	0x84c
 	.4byte	0x11c4a
 	.uleb128 0x55
-	.4byte	0x121f8
+	.4byte	0x12205
 	.uleb128 0x55
-	.4byte	0x121f8
+	.4byte	0x12205
 	.uleb128 0x55
-	.4byte	0x12204
+	.4byte	0x12211
 	.uleb128 0x55
-	.4byte	0x12204
+	.4byte	0x12211
 	.uleb128 0x55
-	.4byte	0x12210
+	.4byte	0x1221d
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1110
 	.uleb128 0x58
-	.4byte	0x1221c
+	.4byte	0x12229
 	.uleb128 0x58
-	.4byte	0x12226
+	.4byte	0x12233
 	.uleb128 0x58
-	.4byte	0x12232
+	.4byte	0x1223f
 	.uleb128 0x58
-	.4byte	0x1223e
+	.4byte	0x1224b
 	.uleb128 0x61
-	.4byte	0x1224a
-	.4byte	.LLST242
+	.4byte	0x12257
+	.4byte	.LLST246
 	.uleb128 0x58
-	.4byte	0x12256
+	.4byte	0x12263
 	.uleb128 0x58
-	.4byte	0x12262
+	.4byte	0x1226f
 	.uleb128 0x74
-	.4byte	0x1226e
+	.4byte	0x1227b
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13f2e
+	.4byte	0x13f62
 	.8byte	.LBB1860
 	.4byte	.Ldebug_ranges0+0x1140
 	.byte	0x1
-	.2byte	0x79b
+	.2byte	0x7e7
 	.4byte	0x11d10
 	.uleb128 0x55
-	.4byte	0x13f6b
+	.4byte	0x13f9f
 	.uleb128 0x55
-	.4byte	0x13f6b
+	.4byte	0x13f9f
 	.uleb128 0x55
-	.4byte	0x13f6b
+	.4byte	0x13f9f
 	.uleb128 0x55
-	.4byte	0x13f77
+	.4byte	0x13fab
 	.uleb128 0x55
-	.4byte	0x13f5f
+	.4byte	0x13f93
 	.uleb128 0x55
-	.4byte	0x13f53
+	.4byte	0x13f87
 	.uleb128 0x55
-	.4byte	0x13f47
+	.4byte	0x13f7b
 	.uleb128 0x55
-	.4byte	0x13f3b
+	.4byte	0x13f6f
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1140
 	.uleb128 0x58
-	.4byte	0x13f83
+	.4byte	0x13fb7
 	.uleb128 0x61
-	.4byte	0x13f8f
-	.4byte	.LLST243
+	.4byte	0x13fc3
+	.4byte	.LLST247
 	.uleb128 0x58
-	.4byte	0x13f9b
+	.4byte	0x13fcf
 	.uleb128 0x61
-	.4byte	0x13fa7
-	.4byte	.LLST244
+	.4byte	0x13fdb
+	.4byte	.LLST248
 	.uleb128 0x61
-	.4byte	0x13fb3
-	.4byte	.LLST245
+	.4byte	0x13fe7
+	.4byte	.LLST249
 	.uleb128 0x58
-	.4byte	0x13fbf
+	.4byte	0x13ff3
 	.uleb128 0x58
-	.4byte	0x13fcb
+	.4byte	0x13fff
 	.uleb128 0x58
-	.4byte	0x13fd7
+	.4byte	0x1400b
 	.uleb128 0x61
-	.4byte	0x13fe3
-	.4byte	.LLST246
+	.4byte	0x14017
+	.4byte	.LLST250
 	.uleb128 0x58
-	.4byte	0x13fef
+	.4byte	0x14023
 	.uleb128 0x61
-	.4byte	0x13ffb
-	.4byte	.LLST247
+	.4byte	0x1402f
+	.4byte	.LLST251
 	.uleb128 0x62
-	.4byte	0x14007
+	.4byte	0x1403b
 	.uleb128 0x1
 	.byte	0x60
 	.uleb128 0x61
-	.4byte	0x14011
-	.4byte	.LLST248
+	.4byte	0x14045
+	.4byte	.LLST252
 	.uleb128 0x61
-	.4byte	0x1401b
-	.4byte	.LLST249
+	.4byte	0x1404f
+	.4byte	.LLST253
 	.uleb128 0x61
-	.4byte	0x14027
-	.4byte	.LLST250
+	.4byte	0x1405b
+	.4byte	.LLST254
 	.uleb128 0x61
-	.4byte	0x14033
-	.4byte	.LLST251
+	.4byte	0x14067
+	.4byte	.LLST255
 	.uleb128 0x61
-	.4byte	0x1403f
-	.4byte	.LLST252
-	.byte	0
-	.byte	0
-	.uleb128 0x54
-	.4byte	0x14288
-	.8byte	.LBB1871
-	.8byte	.LBE1871-.LBB1871
-	.byte	0x1
-	.2byte	0x860
-	.4byte	0x11d5b
-	.uleb128 0x55
-	.4byte	0x142a3
-	.uleb128 0x55
-	.4byte	0x14298
-	.uleb128 0x57
-	.8byte	.LBB1872
-	.8byte	.LBE1872-.LBB1872
-	.uleb128 0x58
-	.4byte	0x142af
-	.uleb128 0x4f
-	.8byte	.LVL918
-	.4byte	0x14f5d
+	.4byte	0x14073
+	.4byte	.LLST256
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12193
-	.8byte	.LBB1873
+	.4byte	0x121a0
+	.8byte	.LBB1868
 	.4byte	.Ldebug_ranges0+0x11a0
 	.byte	0x1
-	.2byte	0x758
-	.4byte	0x11d9c
+	.2byte	0x806
+	.4byte	0x11d51
 	.uleb128 0x55
-	.4byte	0x121b8
+	.4byte	0x121c5
 	.uleb128 0x55
-	.4byte	0x121ac
+	.4byte	0x121b9
 	.uleb128 0x70
-	.4byte	0x121a0
-	.4byte	.LLST254
+	.4byte	0x121ad
+	.4byte	.LLST257
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x11a0
 	.uleb128 0x58
-	.4byte	0x121c4
+	.4byte	0x121d1
 	.uleb128 0x58
-	.4byte	0x121ce
+	.4byte	0x121db
+	.uleb128 0x58
+	.4byte	0x121e7
+	.byte	0
+	.byte	0
+	.uleb128 0x54
+	.4byte	0x143a9
+	.8byte	.LBB1875
+	.8byte	.LBE1875-.LBB1875
+	.byte	0x1
+	.2byte	0x8b0
+	.4byte	0x11d9c
+	.uleb128 0x55
+	.4byte	0x143c4
+	.uleb128 0x55
+	.4byte	0x143b9
+	.uleb128 0x57
+	.8byte	.LBB1876
+	.8byte	.LBE1876-.LBB1876
 	.uleb128 0x58
-	.4byte	0x121da
+	.4byte	0x143d0
+	.uleb128 0x4f
+	.8byte	.LVL942
+	.4byte	0x1507e
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12193
-	.8byte	.LBB1888
-	.4byte	.Ldebug_ranges0+0x1290
+	.4byte	0x121a0
+	.8byte	.LBB1877
+	.4byte	.Ldebug_ranges0+0x11d0
 	.byte	0x1
-	.2byte	0x7ba
+	.2byte	0x7a4
 	.4byte	0x11ddd
 	.uleb128 0x55
-	.4byte	0x121b8
+	.4byte	0x121c5
 	.uleb128 0x55
-	.4byte	0x121ac
+	.4byte	0x121b9
 	.uleb128 0x70
-	.4byte	0x121a0
-	.4byte	.LLST257
+	.4byte	0x121ad
+	.4byte	.LLST259
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x1290
+	.4byte	.Ldebug_ranges0+0x11d0
 	.uleb128 0x58
-	.4byte	0x121c4
+	.4byte	0x121d1
 	.uleb128 0x58
-	.4byte	0x121ce
+	.4byte	0x121db
 	.uleb128 0x58
-	.4byte	0x121da
+	.4byte	0x121e7
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12193
+	.4byte	0x121a0
 	.8byte	.LBB1892
 	.8byte	.LBE1892-.LBB1892
 	.byte	0x1
-	.2byte	0x790
+	.2byte	0x7dc
 	.4byte	0x11e2e
 	.uleb128 0x55
-	.4byte	0x121b8
+	.4byte	0x121c5
 	.uleb128 0x55
-	.4byte	0x121ac
+	.4byte	0x121b9
 	.uleb128 0x70
-	.4byte	0x121a0
-	.4byte	.LLST258
+	.4byte	0x121ad
+	.4byte	.LLST262
 	.uleb128 0x57
 	.8byte	.LBB1893
 	.8byte	.LBE1893-.LBB1893
 	.uleb128 0x58
-	.4byte	0x121c4
+	.4byte	0x121d1
 	.uleb128 0x58
-	.4byte	0x121ce
+	.4byte	0x121db
 	.uleb128 0x58
-	.4byte	0x121da
+	.4byte	0x121e7
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14288
+	.4byte	0x143a9
 	.8byte	.LBB1896
 	.8byte	.LBE1896-.LBB1896
 	.byte	0x1
-	.2byte	0x727
+	.2byte	0x773
 	.4byte	0x11e79
 	.uleb128 0x55
-	.4byte	0x142a3
+	.4byte	0x143c4
 	.uleb128 0x55
-	.4byte	0x14298
+	.4byte	0x143b9
 	.uleb128 0x57
 	.8byte	.LBB1897
 	.8byte	.LBE1897-.LBB1897
 	.uleb128 0x58
-	.4byte	0x142af
+	.4byte	0x143d0
 	.uleb128 0x4f
-	.8byte	.LVL1003
-	.4byte	0x14f5d
+	.8byte	.LVL1025
+	.4byte	0x1507e
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL855
-	.4byte	0x153dd
-	.uleb128 0x4f
-	.8byte	.LVL856
-	.4byte	0x1501b
-	.uleb128 0x4f
-	.8byte	.LVL857
-	.4byte	0x15146
-	.uleb128 0x4f
-	.8byte	.LVL859
-	.4byte	0x15230
-	.uleb128 0x4f
-	.8byte	.LVL860
-	.4byte	0x15146
-	.uleb128 0x4f
-	.8byte	.LVL861
-	.4byte	0x151c0
-	.uleb128 0x4f
-	.8byte	.LVL862
-	.4byte	0x153e9
+	.8byte	.LVL879
+	.4byte	0x154fe
 	.uleb128 0x4f
-	.8byte	.LVL863
-	.4byte	0x153a1
+	.8byte	.LVL880
+	.4byte	0x1513c
 	.uleb128 0x4f
-	.8byte	.LVL882
-	.4byte	0x122e7
+	.8byte	.LVL881
+	.4byte	0x15267
 	.uleb128 0x4f
 	.8byte	.LVL883
-	.4byte	0x151c0
+	.4byte	0x15351
+	.uleb128 0x4f
+	.8byte	.LVL884
+	.4byte	0x15267
 	.uleb128 0x4f
 	.8byte	.LVL885
-	.4byte	0x153e9
+	.4byte	0x152e1
 	.uleb128 0x4f
-	.8byte	.LVL887
-	.4byte	0x1529e
+	.8byte	.LVL886
+	.4byte	0x1550a
 	.uleb128 0x4f
-	.8byte	.LVL888
-	.4byte	0x1529e
+	.8byte	.LVL887
+	.4byte	0x154c2
 	.uleb128 0x4f
-	.8byte	.LVL889
-	.4byte	0x1529e
+	.8byte	.LVL906
+	.4byte	0x122f4
 	.uleb128 0x4f
 	.8byte	.LVL907
-	.4byte	0x153f5
-	.uleb128 0x4f
-	.8byte	.LVL908
-	.4byte	0x1529e
+	.4byte	0x152e1
 	.uleb128 0x4f
 	.8byte	.LVL909
-	.4byte	0x1529e
-	.uleb128 0x4f
-	.8byte	.LVL919
-	.4byte	0x153f5
-	.uleb128 0x4f
-	.8byte	.LVL921
-	.4byte	0x153e9
+	.4byte	0x1550a
 	.uleb128 0x4f
-	.8byte	.LVL922
-	.4byte	0x153a1
-	.uleb128 0x4f
-	.8byte	.LVL923
-	.4byte	0x141a3
-	.uleb128 0x4f
-	.8byte	.LVL924
-	.4byte	0x15401
-	.uleb128 0x4f
-	.8byte	.LVL925
-	.4byte	0x15146
-	.uleb128 0x4f
-	.8byte	.LVL926
-	.4byte	0x12702
+	.8byte	.LVL911
+	.4byte	0x153bf
 	.uleb128 0x4f
-	.8byte	.LVL929
-	.4byte	0x1507c
+	.8byte	.LVL912
+	.4byte	0x153bf
 	.uleb128 0x4f
-	.8byte	.LVL930
-	.4byte	0x122e7
+	.8byte	.LVL913
+	.4byte	0x153bf
 	.uleb128 0x4f
 	.8byte	.LVL931
-	.4byte	0x15146
-	.uleb128 0x4f
-	.8byte	.LVL932
-	.4byte	0x12702
+	.4byte	0x15516
 	.uleb128 0x4f
 	.8byte	.LVL933
-	.4byte	0x15230
-	.uleb128 0x4f
-	.8byte	.LVL936
-	.4byte	0x15230
-	.uleb128 0x4f
-	.8byte	.LVL939
-	.4byte	0x15146
-	.uleb128 0x4f
-	.8byte	.LVL940
-	.4byte	0x15292
-	.uleb128 0x4f
-	.8byte	.LVL941
-	.4byte	0x153e9
+	.4byte	0x153bf
 	.uleb128 0x4f
 	.8byte	.LVL943
-	.4byte	0x153a1
+	.4byte	0x15516
 	.uleb128 0x4f
 	.8byte	.LVL945
-	.4byte	0x15146
+	.4byte	0x1550a
+	.uleb128 0x4f
+	.8byte	.LVL946
+	.4byte	0x154c2
+	.uleb128 0x4f
+	.8byte	.LVL947
+	.4byte	0x142c4
 	.uleb128 0x4f
 	.8byte	.LVL948
-	.4byte	0x15146
+	.4byte	0x15522
 	.uleb128 0x4f
 	.8byte	.LVL949
-	.4byte	0x140dc
+	.4byte	0x15267
 	.uleb128 0x4f
 	.8byte	.LVL950
-	.4byte	0x15401
-	.uleb128 0x4f
-	.8byte	.LVL951
-	.4byte	0x122e7
-	.uleb128 0x4f
-	.8byte	.LVL952
-	.4byte	0x15146
+	.4byte	0x12736
 	.uleb128 0x4f
 	.8byte	.LVL953
-	.4byte	0x12702
+	.4byte	0x1519d
 	.uleb128 0x4f
 	.8byte	.LVL954
-	.4byte	0x1529e
+	.4byte	0x122f4
 	.uleb128 0x4f
-	.8byte	.LVL961
-	.4byte	0x122e7
+	.8byte	.LVL955
+	.4byte	0x15267
 	.uleb128 0x4f
-	.8byte	.LVL962
-	.4byte	0x15146
+	.8byte	.LVL956
+	.4byte	0x12736
+	.uleb128 0x4f
+	.8byte	.LVL957
+	.4byte	0x15351
+	.uleb128 0x4f
+	.8byte	.LVL960
+	.4byte	0x15351
 	.uleb128 0x4f
 	.8byte	.LVL963
-	.4byte	0x12702
+	.4byte	0x15267
 	.uleb128 0x4f
-	.8byte	.LVL966
-	.4byte	0x15146
+	.8byte	.LVL964
+	.4byte	0x153b3
+	.uleb128 0x4f
+	.8byte	.LVL965
+	.4byte	0x1550a
 	.uleb128 0x4f
 	.8byte	.LVL967
-	.4byte	0x15292
+	.4byte	0x154c2
 	.uleb128 0x4f
 	.8byte	.LVL969
-	.4byte	0x15146
+	.4byte	0x15267
 	.uleb128 0x4f
-	.8byte	.LVL970
-	.4byte	0x153e9
+	.8byte	.LVL972
+	.4byte	0x15267
 	.uleb128 0x4f
-	.8byte	.LVL971
-	.4byte	0x153a1
+	.8byte	.LVL973
+	.4byte	0x1412a
+	.uleb128 0x4f
+	.8byte	.LVL974
+	.4byte	0x15522
+	.uleb128 0x4f
+	.8byte	.LVL975
+	.4byte	0x122f4
 	.uleb128 0x4f
 	.8byte	.LVL976
-	.4byte	0x15146
+	.4byte	0x15267
 	.uleb128 0x4f
-	.8byte	.LVL980
-	.4byte	0x1540d
+	.8byte	.LVL977
+	.4byte	0x12736
 	.uleb128 0x4f
-	.8byte	.LVL984
-	.4byte	0x1507c
+	.8byte	.LVL978
+	.4byte	0x153bf
+	.uleb128 0x4f
+	.8byte	.LVL985
+	.4byte	0x122f4
+	.uleb128 0x4f
+	.8byte	.LVL986
+	.4byte	0x15267
+	.uleb128 0x4f
+	.8byte	.LVL987
+	.4byte	0x12736
+	.uleb128 0x4f
+	.8byte	.LVL990
+	.4byte	0x15267
+	.uleb128 0x4f
+	.8byte	.LVL991
+	.4byte	0x153b3
 	.uleb128 0x4f
 	.8byte	.LVL993
-	.4byte	0x1540d
+	.4byte	0x15267
 	.uleb128 0x4f
 	.8byte	.LVL994
-	.4byte	0x15146
+	.4byte	0x1550a
 	.uleb128 0x4f
 	.8byte	.LVL995
-	.4byte	0x1501b
+	.4byte	0x154c2
 	.uleb128 0x4f
-	.8byte	.LVL1004
-	.4byte	0x1529e
+	.8byte	.LVL1000
+	.4byte	0x15267
+	.uleb128 0x4f
+	.8byte	.LVL1002
+	.4byte	0x1552e
 	.uleb128 0x4f
 	.8byte	.LVL1006
-	.4byte	0x151c0
+	.4byte	0x1519d
 	.uleb128 0x4f
-	.8byte	.LVL1007
-	.4byte	0x1507c
+	.8byte	.LVL1015
+	.4byte	0x1552e
 	.uleb128 0x4f
-	.8byte	.LVL1009
-	.4byte	0x1507c
+	.8byte	.LVL1016
+	.4byte	0x15267
 	.uleb128 0x4f
-	.8byte	.LVL1010
-	.4byte	0x152f4
+	.8byte	.LVL1017
+	.4byte	0x1513c
+	.uleb128 0x4f
+	.8byte	.LVL1027
+	.4byte	0x141f1
+	.uleb128 0x4f
+	.8byte	.LVL1029
+	.4byte	0x153bf
+	.uleb128 0x4f
+	.8byte	.LVL1031
+	.4byte	0x152e1
+	.uleb128 0x4f
+	.8byte	.LVL1032
+	.4byte	0x1519d
+	.uleb128 0x4f
+	.8byte	.LVL1033
+	.4byte	0x153bf
+	.uleb128 0x4f
+	.8byte	.LVL1035
+	.4byte	0x1519d
+	.uleb128 0x4f
+	.8byte	.LVL1036
+	.4byte	0x15415
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x709
+	.2byte	0x755
 	.byte	0x1
-	.4byte	0x121e7
+	.4byte	0x121f4
 	.uleb128 0x66
 	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x709
+	.2byte	0x755
 	.4byte	0xc138
 	.uleb128 0x66
 	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x709
+	.2byte	0x755
 	.4byte	0xc138
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x1
-	.2byte	0x709
+	.2byte	0x755
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x70b
+	.2byte	0x757
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x70c
+	.2byte	0x758
 	.4byte	0x110
 	.uleb128 0x48
 	.4byte	.LASF3110
 	.byte	0x1
-	.2byte	0x70d
+	.2byte	0x759
 	.4byte	0x110
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3111
 	.byte	0x1
-	.2byte	0x6ed
+	.2byte	0x739
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x12277
+	.4byte	0x12284
 	.uleb128 0x66
 	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x6ed
+	.2byte	0x739
 	.4byte	0xe4f2
 	.uleb128 0x66
 	.4byte	.LASF3113
 	.byte	0x1
-	.2byte	0x6ed
+	.2byte	0x739
 	.4byte	0xe4f2
 	.uleb128 0x66
 	.4byte	.LASF3114
 	.byte	0x1
-	.2byte	0x6ed
+	.2byte	0x739
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x6ef
+	.2byte	0x73b
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x6f0
+	.2byte	0x73c
 	.4byte	0x15a
 	.uleb128 0x48
 	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x6f0
+	.2byte	0x73c
 	.4byte	0x15a
 	.uleb128 0x48
 	.4byte	.LASF3117
 	.byte	0x1
-	.2byte	0x6f1
+	.2byte	0x73d
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x6f2
+	.2byte	0x73e
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x6f3
+	.2byte	0x73f
 	.4byte	0x46f4
 	.uleb128 0x48
 	.4byte	.LASF3120
 	.byte	0x1
-	.2byte	0x6f4
+	.2byte	0x740
 	.4byte	0x46f4
 	.uleb128 0x73
 	.4byte	.LASF3121
 	.byte	0x1
-	.2byte	0x705
+	.2byte	0x751
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3122
 	.byte	0x1
-	.2byte	0x6d1
+	.2byte	0x71d
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x122e7
+	.4byte	0x122f4
 	.uleb128 0x65
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6d1
+	.2byte	0x71d
 	.4byte	0xe4f2
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x6d1
+	.2byte	0x71d
 	.4byte	0xe874
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x6d3
+	.2byte	0x71f
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x6d4
+	.2byte	0x720
 	.4byte	0x15a
 	.uleb128 0x48
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x6d5
+	.2byte	0x721
 	.4byte	0x46f4
 	.uleb128 0x48
 	.4byte	.LASF3123
 	.byte	0x1
-	.2byte	0x6d6
+	.2byte	0x722
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3114
 	.byte	0x1
-	.2byte	0x6d7
+	.2byte	0x723
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3124
 	.byte	0x1
-	.2byte	0x6d8
+	.2byte	0x724
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3125
 	.byte	0x1
-	.2byte	0x66e
+	.2byte	0x6b1
 	.4byte	0xc6
-	.8byte	.LFB2833
-	.8byte	.LFE2833-.LFB2833
+	.8byte	.LFB2834
+	.8byte	.LFE2834-.LFB2834
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12457
+	.4byte	0x1248b
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x66e
+	.2byte	0x6b1
 	.4byte	0xe557
 	.4byte	.LLST75
 	.uleb128 0x59
 	.4byte	.LASF2887
 	.byte	0x1
-	.2byte	0x66e
+	.2byte	0x6b1
 	.4byte	0xc6
 	.4byte	.LLST76
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x670
+	.2byte	0x6b3
 	.4byte	0xe874
 	.uleb128 0x5a
 	.4byte	.LASF3126
 	.byte	0x1
-	.2byte	0x671
+	.2byte	0x6b4
 	.4byte	0xc6
 	.4byte	.LLST77
 	.uleb128 0x6a
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x672
+	.2byte	0x6b5
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x64
 	.uleb128 0x48
 	.4byte	.LASF3127
 	.byte	0x1
-	.2byte	0x673
+	.2byte	0x6b6
 	.4byte	0xd8a3
 	.uleb128 0x54
-	.4byte	0x1459b
+	.4byte	0x146bc
 	.8byte	.LBB1230
 	.8byte	.LBE1230-.LBB1230
 	.byte	0x1
-	.2byte	0x678
-	.4byte	0x12386
+	.2byte	0x6bb
+	.4byte	0x12393
 	.uleb128 0x55
-	.4byte	0x145b7
+	.4byte	0x146d8
 	.uleb128 0x55
-	.4byte	0x145ab
+	.4byte	0x146cc
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL283
-	.4byte	0x15146
+	.4byte	0x15267
 	.uleb128 0x4f
 	.8byte	.LVL284
-	.4byte	0x15419
+	.4byte	0x1553a
 	.uleb128 0x4f
 	.8byte	.LVL289
-	.4byte	0x151c0
+	.4byte	0x152e1
 	.uleb128 0x4f
 	.8byte	.LVL290
-	.4byte	0x15146
+	.4byte	0x15267
 	.uleb128 0x4f
 	.8byte	.LVL292
-	.4byte	0x15419
+	.4byte	0x1553a
 	.uleb128 0x4f
 	.8byte	.LVL293
-	.4byte	0x151c0
+	.4byte	0x152e1
 	.uleb128 0x4f
 	.8byte	.LVL294
-	.4byte	0x15419
+	.4byte	0x1553a
 	.uleb128 0x4f
 	.8byte	.LVL295
-	.4byte	0x15419
+	.4byte	0x1553a
 	.uleb128 0x4f
 	.8byte	.LVL296
-	.4byte	0x15419
+	.4byte	0x1553a
 	.uleb128 0x4f
 	.8byte	.LVL297
-	.4byte	0x15419
+	.4byte	0x1553a
 	.uleb128 0x4f
 	.8byte	.LVL298
-	.4byte	0x15419
+	.4byte	0x1553a
 	.uleb128 0x4f
 	.8byte	.LVL299
-	.4byte	0x15419
+	.4byte	0x1553a
 	.uleb128 0x4f
 	.8byte	.LVL300
-	.4byte	0x15419
+	.4byte	0x1553a
 	.uleb128 0x4f
 	.8byte	.LVL301
-	.4byte	0x15419
+	.4byte	0x1553a
 	.uleb128 0x4f
 	.8byte	.LVL302
-	.4byte	0x15146
+	.4byte	0x1553a
 	.uleb128 0x4f
 	.8byte	.LVL303
-	.4byte	0x152f4
+	.4byte	0x1553a
+	.uleb128 0x4f
+	.8byte	.LVL304
+	.4byte	0x1553a
+	.uleb128 0x4f
+	.8byte	.LVL305
+	.4byte	0x15267
+	.uleb128 0x4f
+	.8byte	.LVL306
+	.4byte	0x15415
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3128
 	.byte	0x1
-	.2byte	0x647
-	.8byte	.LFB2832
-	.8byte	.LFE2832-.LFB2832
+	.2byte	0x68a
+	.8byte	.LFB2833
+	.8byte	.LFE2833-.LFB2833
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12510
+	.4byte	0x12544
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x649
+	.2byte	0x68c
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x64a
+	.2byte	0x68d
 	.4byte	0xe1f4
 	.uleb128 0x4f
 	.8byte	.LVL265
-	.4byte	0x15146
+	.4byte	0x15267
 	.uleb128 0x4f
 	.8byte	.LVL266
-	.4byte	0x15292
+	.4byte	0x153b3
 	.uleb128 0x4f
 	.8byte	.LVL267
-	.4byte	0x15292
+	.4byte	0x153b3
 	.uleb128 0x4f
 	.8byte	.LVL268
-	.4byte	0x151f1
+	.4byte	0x15312
 	.uleb128 0x4f
 	.8byte	.LVL269
-	.4byte	0x15146
+	.4byte	0x15267
 	.uleb128 0x4f
 	.8byte	.LVL270
-	.4byte	0x151aa
+	.4byte	0x152cb
 	.uleb128 0x4f
 	.8byte	.LVL271
-	.4byte	0x15230
+	.4byte	0x15351
 	.uleb128 0x4f
 	.8byte	.LVL272
-	.4byte	0x15292
+	.4byte	0x153b3
 	.uleb128 0x4f
 	.8byte	.LVL273
-	.4byte	0x15292
+	.4byte	0x153b3
 	.uleb128 0x4f
 	.8byte	.LVL274
-	.4byte	0x151f1
+	.4byte	0x15312
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3129
 	.byte	0x1
-	.2byte	0x5e9
+	.2byte	0x62c
 	.4byte	0xc6
-	.8byte	.LFB2831
-	.8byte	.LFE2831-.LFB2831
+	.8byte	.LFB2832
+	.8byte	.LFE2832-.LFB2832
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x126f2
+	.4byte	0x12726
 	.uleb128 0x59
 	.4byte	.LASF794
 	.byte	0x1
-	.2byte	0x5e9
+	.2byte	0x62c
 	.4byte	0x458
-	.4byte	.LLST234
+	.4byte	.LLST238
 	.uleb128 0x6a
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x5eb
+	.2byte	0x62e
 	.4byte	0xe557
 	.uleb128 0x1
 	.byte	0x66
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x5ec
+	.2byte	0x62f
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x5ed
+	.2byte	0x630
 	.4byte	0xe874
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x1020
-	.4byte	0x125fa
+	.4byte	0x1262e
 	.uleb128 0x41
 	.byte	0x8
 	.byte	0x1
-	.2byte	0x5f4
-	.4byte	0x12593
+	.2byte	0x637
+	.4byte	0x125c7
 	.uleb128 0x43
 	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x5f4
+	.2byte	0x637
 	.4byte	0x1a0
 	.uleb128 0x3f
 	.string	"__c"
 	.byte	0x1
-	.2byte	0x5f4
-	.4byte	0x126f2
+	.2byte	0x637
+	.4byte	0x12726
 	.byte	0
 	.uleb128 0x53
 	.string	"__u"
 	.byte	0x1
-	.2byte	0x5f4
-	.4byte	0x12571
+	.2byte	0x637
+	.4byte	0x125a5
 	.uleb128 0x5c
-	.4byte	0x14df7
+	.4byte	0x14f18
 	.8byte	.LBB1810
 	.4byte	.Ldebug_ranges0+0x1060
 	.byte	0x1
-	.2byte	0x5f4
-	.4byte	0x125c7
+	.2byte	0x637
+	.4byte	0x125fb
 	.uleb128 0x55
-	.4byte	0x14e1a
+	.4byte	0x14f3b
 	.uleb128 0x55
-	.4byte	0x14e0e
+	.4byte	0x14f2f
 	.uleb128 0x55
-	.4byte	0x14e04
+	.4byte	0x14f25
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x14bf6
+	.4byte	0x14d17
 	.8byte	.LBB1813
 	.8byte	.LBE1813-.LBB1813
 	.byte	0x1
-	.2byte	0x5f4
+	.2byte	0x637
 	.uleb128 0x57
 	.8byte	.LBB1814
 	.8byte	.LBE1814-.LBB1814
 	.uleb128 0x62
-	.4byte	0x14c06
+	.4byte	0x14d27
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14aa2
+	.4byte	0x14bc3
 	.8byte	.LBB1818
 	.8byte	.LBE1818-.LBB1818
 	.byte	0x1
-	.2byte	0x63c
-	.4byte	0x1262e
+	.2byte	0x67f
+	.4byte	0x12662
 	.uleb128 0x55
-	.4byte	0x14abe
+	.4byte	0x14bdf
 	.uleb128 0x55
-	.4byte	0x14ab3
+	.4byte	0x14bd4
 	.uleb128 0x4f
-	.8byte	.LVL839
-	.4byte	0x15425
+	.8byte	.LVL863
+	.4byte	0x15546
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL834
-	.4byte	0x15432
+	.8byte	.LVL858
+	.4byte	0x15553
 	.uleb128 0x4f
-	.8byte	.LVL835
-	.4byte	0x15355
+	.8byte	.LVL859
+	.4byte	0x15476
 	.uleb128 0x4f
-	.8byte	.LVL836
-	.4byte	0x1543c
+	.8byte	.LVL860
+	.4byte	0x1555d
 	.uleb128 0x4f
-	.8byte	.LVL837
-	.4byte	0x14e5a
+	.8byte	.LVL861
+	.4byte	0x14f7b
 	.uleb128 0x4f
-	.8byte	.LVL838
-	.4byte	0x13c72
+	.8byte	.LVL862
+	.4byte	0x13ca6
 	.uleb128 0x4f
-	.8byte	.LVL840
-	.4byte	0x14e5a
+	.8byte	.LVL864
+	.4byte	0x14f7b
 	.uleb128 0x4f
-	.8byte	.LVL841
-	.4byte	0x13319
+	.8byte	.LVL865
+	.4byte	0x1334d
 	.uleb128 0x4f
-	.8byte	.LVL842
-	.4byte	0x14e5a
+	.8byte	.LVL866
+	.4byte	0x14f7b
 	.uleb128 0x4f
-	.8byte	.LVL843
-	.4byte	0x1290c
+	.8byte	.LVL867
+	.4byte	0x12940
 	.uleb128 0x4f
-	.8byte	.LVL844
-	.4byte	0x14e5a
+	.8byte	.LVL868
+	.4byte	0x14f7b
 	.uleb128 0x4f
-	.8byte	.LVL845
-	.4byte	0x13dd3
+	.8byte	.LVL869
+	.4byte	0x13e07
 	.uleb128 0x4f
-	.8byte	.LVL846
-	.4byte	0x15448
+	.8byte	.LVL870
+	.4byte	0x15569
 	.uleb128 0x4f
-	.8byte	.LVL847
-	.4byte	0x1404c
+	.8byte	.LVL871
+	.4byte	0x14080
 	.uleb128 0x4f
-	.8byte	.LVL848
-	.4byte	0x13dd3
+	.8byte	.LVL872
+	.4byte	0x13e07
 	.uleb128 0x4f
-	.8byte	.LVL849
-	.4byte	0x13c72
+	.8byte	.LVL873
+	.4byte	0x13ca6
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x12702
+	.4byte	0x12736
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
@@ -45175,163 +45445,163 @@ __exitcall_ebc_exit:
 	.uleb128 0x4e
 	.4byte	.LASF3131
 	.byte	0x1
-	.2byte	0x592
-	.8byte	.LFB2830
-	.8byte	.LFE2830-.LFB2830
+	.2byte	0x5d5
+	.8byte	.LFB2831
+	.8byte	.LFE2831-.LFB2831
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x128ae
+	.4byte	0x128e2
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x592
+	.2byte	0x5d5
 	.4byte	0xe557
 	.4byte	.LLST189
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x594
+	.2byte	0x5d7
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x595
+	.2byte	0x5d8
 	.4byte	0xe874
 	.uleb128 0x56
 	.4byte	.LASF3050
 	.4byte	0xb9b0
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34956
+	.8byte	__func__.34977
 	.uleb128 0x54
-	.4byte	0x128ae
+	.4byte	0x128e2
 	.8byte	.LBB1468
 	.8byte	.LBE1468-.LBB1468
 	.byte	0x1
-	.2byte	0x5a2
-	.4byte	0x1278f
+	.2byte	0x5e5
+	.4byte	0x127c3
 	.uleb128 0x55
-	.4byte	0x128c7
+	.4byte	0x128fb
 	.uleb128 0x55
-	.4byte	0x128bb
+	.4byte	0x128ef
 	.uleb128 0x4f
-	.8byte	.LVL549
-	.4byte	0x14e5a
+	.8byte	.LVL552
+	.4byte	0x14f7b
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x128ae
+	.4byte	0x128e2
 	.8byte	.LBB1470
 	.8byte	.LBE1470-.LBB1470
 	.byte	0x1
-	.2byte	0x5b6
-	.4byte	0x127c3
+	.2byte	0x5f9
+	.4byte	0x127f7
 	.uleb128 0x55
-	.4byte	0x128c7
+	.4byte	0x128fb
 	.uleb128 0x55
-	.4byte	0x128bb
+	.4byte	0x128ef
 	.uleb128 0x4f
-	.8byte	.LVL554
-	.4byte	0x14e5a
+	.8byte	.LVL557
+	.4byte	0x14f7b
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x128ae
+	.4byte	0x128e2
 	.8byte	.LBB1472
 	.8byte	.LBE1472-.LBB1472
 	.byte	0x1
-	.2byte	0x5dd
-	.4byte	0x127f7
+	.2byte	0x620
+	.4byte	0x1282b
 	.uleb128 0x55
-	.4byte	0x128c7
+	.4byte	0x128fb
 	.uleb128 0x55
-	.4byte	0x128bb
+	.4byte	0x128ef
 	.uleb128 0x4f
-	.8byte	.LVL559
-	.4byte	0x14e5a
+	.8byte	.LVL562
+	.4byte	0x14f7b
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x128ae
+	.4byte	0x128e2
 	.8byte	.LBB1474
 	.8byte	.LBE1474-.LBB1474
 	.byte	0x1
-	.2byte	0x5d0
-	.4byte	0x1282b
+	.2byte	0x613
+	.4byte	0x1285f
 	.uleb128 0x55
-	.4byte	0x128c7
+	.4byte	0x128fb
 	.uleb128 0x55
-	.4byte	0x128bb
+	.4byte	0x128ef
 	.uleb128 0x4f
-	.8byte	.LVL564
-	.4byte	0x14e5a
+	.8byte	.LVL567
+	.4byte	0x14f7b
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL548
-	.4byte	0x13c72
-	.uleb128 0x4f
-	.8byte	.LVL550
-	.4byte	0x13c72
+	.8byte	.LVL551
+	.4byte	0x13ca6
 	.uleb128 0x4f
 	.8byte	.LVL553
-	.4byte	0x13dd3
+	.4byte	0x13ca6
 	.uleb128 0x4f
-	.8byte	.LVL555
-	.4byte	0x13dd3
+	.8byte	.LVL556
+	.4byte	0x13e07
 	.uleb128 0x4f
 	.8byte	.LVL558
-	.4byte	0x13319
+	.4byte	0x13e07
 	.uleb128 0x4f
-	.8byte	.LVL560
-	.4byte	0x13319
+	.8byte	.LVL561
+	.4byte	0x1334d
 	.uleb128 0x4f
 	.8byte	.LVL563
-	.4byte	0x1290c
+	.4byte	0x1334d
 	.uleb128 0x4f
-	.8byte	.LVL565
-	.4byte	0x1290c
+	.8byte	.LVL566
+	.4byte	0x12940
 	.uleb128 0x4f
 	.8byte	.LVL568
-	.4byte	0x15146
+	.4byte	0x12940
 	.uleb128 0x4f
 	.8byte	.LVL571
-	.4byte	0x15146
+	.4byte	0x15267
+	.uleb128 0x4f
+	.8byte	.LVL574
+	.4byte	0x15267
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3132
 	.byte	0x1
-	.2byte	0x58c
+	.2byte	0x5cf
 	.byte	0x1
-	.4byte	0x128d4
+	.4byte	0x12908
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x58c
+	.2byte	0x5cf
 	.4byte	0xe1f4
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x58c
+	.2byte	0x5cf
 	.4byte	0xe874
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3133
 	.byte	0x1
-	.2byte	0x581
+	.2byte	0x5c4
 	.byte	0x1
-	.4byte	0x12906
+	.4byte	0x1293a
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x581
+	.2byte	0x5c4
 	.4byte	0xe1f4
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x581
+	.2byte	0x5c4
 	.4byte	0xe874
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x583
-	.4byte	0x12906
+	.2byte	0x5c6
+	.4byte	0x1293a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -45339,510 +45609,510 @@ __exitcall_ebc_exit:
 	.uleb128 0x4e
 	.4byte	.LASF3134
 	.byte	0x1
-	.2byte	0x56c
-	.8byte	.LFB2827
-	.8byte	.LFE2827-.LFB2827
+	.2byte	0x5af
+	.8byte	.LFB2828
+	.8byte	.LFE2828-.LFB2828
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12ebb
+	.4byte	0x12eef
 	.uleb128 0x75
 	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x56c
+	.2byte	0x5af
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x59
 	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x56d
+	.2byte	0x5b0
 	.4byte	0xac0
 	.4byte	.LLST142
 	.uleb128 0x59
 	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x56d
+	.2byte	0x5b0
 	.4byte	0xac0
 	.4byte	.LLST143
 	.uleb128 0x59
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x56e
+	.2byte	0x5b1
 	.4byte	0xe874
 	.4byte	.LLST144
 	.uleb128 0x54
-	.4byte	0x12ebb
+	.4byte	0x12eef
 	.8byte	.LBB1378
 	.8byte	.LBE1378-.LBB1378
 	.byte	0x1
-	.2byte	0x57d
-	.4byte	0x12a15
+	.2byte	0x5c0
+	.4byte	0x12a49
 	.uleb128 0x55
-	.4byte	0x12eec
+	.4byte	0x12f20
 	.uleb128 0x55
-	.4byte	0x12eec
+	.4byte	0x12f20
 	.uleb128 0x55
-	.4byte	0x12eec
+	.4byte	0x12f20
 	.uleb128 0x55
-	.4byte	0x12ee0
+	.4byte	0x12f14
 	.uleb128 0x72
-	.4byte	0x12ed4
+	.4byte	0x12f08
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x12ec8
+	.4byte	0x12efc
 	.uleb128 0x57
 	.8byte	.LBB1379
 	.8byte	.LBE1379-.LBB1379
 	.uleb128 0x58
-	.4byte	0x12ef8
+	.4byte	0x12f2c
 	.uleb128 0x61
-	.4byte	0x12f04
+	.4byte	0x12f38
 	.4byte	.LLST145
 	.uleb128 0x58
-	.4byte	0x12f10
+	.4byte	0x12f44
 	.uleb128 0x58
-	.4byte	0x12f1c
+	.4byte	0x12f50
 	.uleb128 0x58
-	.4byte	0x12f28
+	.4byte	0x12f5c
 	.uleb128 0x58
-	.4byte	0x12f34
+	.4byte	0x12f68
 	.uleb128 0x61
-	.4byte	0x12f40
+	.4byte	0x12f74
 	.4byte	.LLST146
 	.uleb128 0x61
-	.4byte	0x12f4c
+	.4byte	0x12f80
 	.4byte	.LLST147
 	.uleb128 0x58
-	.4byte	0x12f58
+	.4byte	0x12f8c
 	.uleb128 0x61
-	.4byte	0x12f64
+	.4byte	0x12f98
 	.4byte	.LLST148
 	.uleb128 0x58
-	.4byte	0x12f6e
+	.4byte	0x12fa2
 	.uleb128 0x61
-	.4byte	0x12f78
+	.4byte	0x12fac
 	.4byte	.LLST149
 	.uleb128 0x61
-	.4byte	0x12f84
+	.4byte	0x12fb8
 	.4byte	.LLST150
 	.uleb128 0x58
-	.4byte	0x12f90
+	.4byte	0x12fc4
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x1316d
+	.4byte	0x131a1
 	.8byte	.LBB1380
 	.4byte	.Ldebug_ranges0+0x9c0
 	.byte	0x1
-	.2byte	0x576
-	.4byte	0x12bd7
+	.2byte	0x5b9
+	.4byte	0x12c0b
 	.uleb128 0x55
-	.4byte	0x1319e
+	.4byte	0x131d2
 	.uleb128 0x55
-	.4byte	0x1319e
+	.4byte	0x131d2
 	.uleb128 0x55
-	.4byte	0x1319e
+	.4byte	0x131d2
 	.uleb128 0x55
-	.4byte	0x13192
+	.4byte	0x131c6
 	.uleb128 0x55
-	.4byte	0x13186
+	.4byte	0x131ba
 	.uleb128 0x55
-	.4byte	0x1317a
+	.4byte	0x131ae
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x9c0
 	.uleb128 0x58
-	.4byte	0x131aa
+	.4byte	0x131de
 	.uleb128 0x61
-	.4byte	0x131b6
+	.4byte	0x131ea
 	.4byte	.LLST151
 	.uleb128 0x61
-	.4byte	0x131c2
+	.4byte	0x131f6
 	.4byte	.LLST152
 	.uleb128 0x61
-	.4byte	0x131ce
+	.4byte	0x13202
 	.4byte	.LLST153
 	.uleb128 0x61
-	.4byte	0x131da
+	.4byte	0x1320e
 	.4byte	.LLST154
 	.uleb128 0x61
-	.4byte	0x131e6
+	.4byte	0x1321a
 	.4byte	.LLST155
 	.uleb128 0x61
-	.4byte	0x131f2
+	.4byte	0x13226
 	.4byte	.LLST156
 	.uleb128 0x61
-	.4byte	0x131fe
+	.4byte	0x13232
 	.4byte	.LLST157
 	.uleb128 0x61
-	.4byte	0x1320a
+	.4byte	0x1323e
 	.4byte	.LLST158
 	.uleb128 0x58
-	.4byte	0x13214
+	.4byte	0x13248
 	.uleb128 0x61
-	.4byte	0x1321e
+	.4byte	0x13252
 	.4byte	.LLST159
 	.uleb128 0x61
-	.4byte	0x1322a
+	.4byte	0x1325e
 	.4byte	.LLST160
 	.uleb128 0x58
-	.4byte	0x13236
+	.4byte	0x1326a
 	.uleb128 0x5c
-	.4byte	0x14306
+	.4byte	0x14427
 	.8byte	.LBB1382
 	.4byte	.Ldebug_ranges0+0xa00
 	.byte	0x1
-	.2byte	0x49b
-	.4byte	0x12af5
+	.2byte	0x4de
+	.4byte	0x12b29
 	.uleb128 0x55
-	.4byte	0x1432e
+	.4byte	0x1444f
 	.uleb128 0x55
-	.4byte	0x14322
+	.4byte	0x14443
 	.uleb128 0x55
-	.4byte	0x14316
+	.4byte	0x14437
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa00
 	.uleb128 0x58
-	.4byte	0x1433a
+	.4byte	0x1445b
 	.uleb128 0x61
-	.4byte	0x14345
+	.4byte	0x14466
 	.4byte	.LLST161
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14306
+	.4byte	0x14427
 	.8byte	.LBB1385
 	.8byte	.LBE1385-.LBB1385
 	.byte	0x1
-	.2byte	0x498
-	.4byte	0x12b41
+	.2byte	0x4db
+	.4byte	0x12b75
 	.uleb128 0x55
-	.4byte	0x1432e
+	.4byte	0x1444f
 	.uleb128 0x55
-	.4byte	0x14322
+	.4byte	0x14443
 	.uleb128 0x55
-	.4byte	0x14316
+	.4byte	0x14437
 	.uleb128 0x57
 	.8byte	.LBB1386
 	.8byte	.LBE1386-.LBB1386
 	.uleb128 0x58
-	.4byte	0x1433a
+	.4byte	0x1445b
 	.uleb128 0x61
-	.4byte	0x14345
+	.4byte	0x14466
 	.4byte	.LLST162
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14306
+	.4byte	0x14427
 	.8byte	.LBB1387
 	.8byte	.LBE1387-.LBB1387
 	.byte	0x1
-	.2byte	0x499
-	.4byte	0x12b8d
+	.2byte	0x4dc
+	.4byte	0x12bc1
 	.uleb128 0x55
-	.4byte	0x1432e
+	.4byte	0x1444f
 	.uleb128 0x55
-	.4byte	0x14322
+	.4byte	0x14443
 	.uleb128 0x55
-	.4byte	0x14316
+	.4byte	0x14437
 	.uleb128 0x57
 	.8byte	.LBB1388
 	.8byte	.LBE1388-.LBB1388
 	.uleb128 0x58
-	.4byte	0x1433a
+	.4byte	0x1445b
 	.uleb128 0x61
-	.4byte	0x14345
+	.4byte	0x14466
 	.4byte	.LLST163
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x14306
+	.4byte	0x14427
 	.8byte	.LBB1389
 	.8byte	.LBE1389-.LBB1389
 	.byte	0x1
-	.2byte	0x49a
+	.2byte	0x4dd
 	.uleb128 0x55
-	.4byte	0x1432e
+	.4byte	0x1444f
 	.uleb128 0x55
-	.4byte	0x14322
+	.4byte	0x14443
 	.uleb128 0x55
-	.4byte	0x14316
+	.4byte	0x14437
 	.uleb128 0x57
 	.8byte	.LBB1390
 	.8byte	.LBE1390-.LBB1390
 	.uleb128 0x58
-	.4byte	0x1433a
+	.4byte	0x1445b
 	.uleb128 0x61
-	.4byte	0x14345
+	.4byte	0x14466
 	.4byte	.LLST164
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12f9d
+	.4byte	0x12fd1
 	.8byte	.LBB1395
 	.8byte	.LBE1395-.LBB1395
 	.byte	0x1
-	.2byte	0x57b
-	.4byte	0x12c80
+	.2byte	0x5be
+	.4byte	0x12cb4
 	.uleb128 0x55
-	.4byte	0x12fce
+	.4byte	0x13002
 	.uleb128 0x55
-	.4byte	0x12fce
+	.4byte	0x13002
 	.uleb128 0x55
-	.4byte	0x12fce
+	.4byte	0x13002
 	.uleb128 0x55
-	.4byte	0x12fc2
+	.4byte	0x12ff6
 	.uleb128 0x72
-	.4byte	0x12fb6
+	.4byte	0x12fea
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x12faa
+	.4byte	0x12fde
 	.uleb128 0x57
 	.8byte	.LBB1396
 	.8byte	.LBE1396-.LBB1396
 	.uleb128 0x58
-	.4byte	0x12fda
+	.4byte	0x1300e
 	.uleb128 0x58
-	.4byte	0x12fe6
+	.4byte	0x1301a
 	.uleb128 0x58
-	.4byte	0x12ff2
+	.4byte	0x13026
 	.uleb128 0x58
-	.4byte	0x12ffe
+	.4byte	0x13032
 	.uleb128 0x58
-	.4byte	0x1300a
+	.4byte	0x1303e
 	.uleb128 0x58
-	.4byte	0x13016
+	.4byte	0x1304a
 	.uleb128 0x61
-	.4byte	0x13022
+	.4byte	0x13056
 	.4byte	.LLST165
 	.uleb128 0x61
-	.4byte	0x1302e
+	.4byte	0x13062
 	.4byte	.LLST166
 	.uleb128 0x58
-	.4byte	0x1303a
+	.4byte	0x1306e
 	.uleb128 0x61
-	.4byte	0x13046
+	.4byte	0x1307a
 	.4byte	.LLST167
 	.uleb128 0x58
-	.4byte	0x13050
+	.4byte	0x13084
 	.uleb128 0x61
-	.4byte	0x1305a
+	.4byte	0x1308e
 	.4byte	.LLST168
 	.uleb128 0x61
-	.4byte	0x13066
+	.4byte	0x1309a
 	.4byte	.LLST169
 	.uleb128 0x58
-	.4byte	0x13072
+	.4byte	0x130a6
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13243
+	.4byte	0x13277
 	.8byte	.LBB1397
 	.4byte	.Ldebug_ranges0+0xa30
 	.byte	0x1
-	.2byte	0x578
-	.4byte	0x12d8e
+	.2byte	0x5bb
+	.4byte	0x12dc2
 	.uleb128 0x55
-	.4byte	0x13274
+	.4byte	0x132a8
 	.uleb128 0x55
-	.4byte	0x13274
+	.4byte	0x132a8
 	.uleb128 0x55
-	.4byte	0x13274
+	.4byte	0x132a8
 	.uleb128 0x55
-	.4byte	0x13268
+	.4byte	0x1329c
 	.uleb128 0x55
-	.4byte	0x1325c
+	.4byte	0x13290
 	.uleb128 0x55
-	.4byte	0x13250
+	.4byte	0x13284
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa30
 	.uleb128 0x58
-	.4byte	0x13280
+	.4byte	0x132b4
 	.uleb128 0x58
-	.4byte	0x1328c
+	.4byte	0x132c0
 	.uleb128 0x58
-	.4byte	0x13298
+	.4byte	0x132cc
 	.uleb128 0x62
-	.4byte	0x132a4
+	.4byte	0x132d8
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x132b0
+	.4byte	0x132e4
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x132bc
+	.4byte	0x132f0
 	.4byte	.LLST170
 	.uleb128 0x61
-	.4byte	0x132c8
+	.4byte	0x132fc
 	.4byte	.LLST171
 	.uleb128 0x61
-	.4byte	0x132d4
+	.4byte	0x13308
 	.4byte	.LLST172
 	.uleb128 0x61
-	.4byte	0x132e0
+	.4byte	0x13314
 	.4byte	.LLST173
 	.uleb128 0x58
-	.4byte	0x132ea
+	.4byte	0x1331e
 	.uleb128 0x61
-	.4byte	0x132f4
+	.4byte	0x13328
 	.4byte	.LLST174
 	.uleb128 0x61
-	.4byte	0x13300
+	.4byte	0x13334
 	.4byte	.LLST175
 	.uleb128 0x58
-	.4byte	0x1330c
+	.4byte	0x13340
 	.uleb128 0x5c
-	.4byte	0x14306
+	.4byte	0x14427
 	.8byte	.LBB1399
 	.4byte	.Ldebug_ranges0+0xa60
 	.byte	0x1
-	.2byte	0x470
-	.4byte	0x12d54
+	.2byte	0x4b3
+	.4byte	0x12d88
 	.uleb128 0x55
-	.4byte	0x1432e
+	.4byte	0x1444f
 	.uleb128 0x55
-	.4byte	0x14322
+	.4byte	0x14443
 	.uleb128 0x55
-	.4byte	0x14316
+	.4byte	0x14437
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa60
 	.uleb128 0x58
-	.4byte	0x1433a
+	.4byte	0x1445b
 	.uleb128 0x61
-	.4byte	0x14345
+	.4byte	0x14466
 	.4byte	.LLST176
 	.byte	0
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x14306
+	.4byte	0x14427
 	.8byte	.LBB1406
 	.4byte	.Ldebug_ranges0+0xad0
 	.byte	0x1
-	.2byte	0x46f
+	.2byte	0x4b2
 	.uleb128 0x55
-	.4byte	0x1432e
+	.4byte	0x1444f
 	.uleb128 0x55
-	.4byte	0x14322
+	.4byte	0x14443
 	.uleb128 0x55
-	.4byte	0x14316
+	.4byte	0x14437
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xad0
 	.uleb128 0x58
-	.4byte	0x1433a
+	.4byte	0x1445b
 	.uleb128 0x61
-	.4byte	0x14345
+	.4byte	0x14466
 	.4byte	.LLST177
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x1307f
+	.4byte	0x130b3
 	.8byte	.LBB1424
 	.8byte	.LBE1424-.LBB1424
 	.byte	0x1
-	.2byte	0x572
+	.2byte	0x5b5
 	.uleb128 0x55
-	.4byte	0x130b0
+	.4byte	0x130e4
 	.uleb128 0x55
-	.4byte	0x130b0
+	.4byte	0x130e4
 	.uleb128 0x55
-	.4byte	0x130b0
+	.4byte	0x130e4
 	.uleb128 0x55
-	.4byte	0x130a4
+	.4byte	0x130d8
 	.uleb128 0x55
-	.4byte	0x13098
+	.4byte	0x130cc
 	.uleb128 0x55
-	.4byte	0x1308c
+	.4byte	0x130c0
 	.uleb128 0x57
 	.8byte	.LBB1425
 	.8byte	.LBE1425-.LBB1425
 	.uleb128 0x58
-	.4byte	0x130bc
+	.4byte	0x130f0
 	.uleb128 0x58
-	.4byte	0x130c8
+	.4byte	0x130fc
 	.uleb128 0x58
-	.4byte	0x130d4
+	.4byte	0x13108
 	.uleb128 0x62
-	.4byte	0x130e0
+	.4byte	0x13114
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x130ec
+	.4byte	0x13120
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x130f8
+	.4byte	0x1312c
 	.4byte	.LLST178
 	.uleb128 0x61
-	.4byte	0x13104
+	.4byte	0x13138
 	.4byte	.LLST179
 	.uleb128 0x61
-	.4byte	0x13110
+	.4byte	0x13144
 	.4byte	.LLST180
 	.uleb128 0x61
-	.4byte	0x1311c
+	.4byte	0x13150
 	.4byte	.LLST181
 	.uleb128 0x58
-	.4byte	0x13126
+	.4byte	0x1315a
 	.uleb128 0x61
-	.4byte	0x13130
+	.4byte	0x13164
 	.4byte	.LLST182
 	.uleb128 0x61
-	.4byte	0x1313c
+	.4byte	0x13170
 	.4byte	.LLST183
 	.uleb128 0x58
-	.4byte	0x13148
+	.4byte	0x1317c
 	.uleb128 0x58
-	.4byte	0x13154
+	.4byte	0x13188
 	.uleb128 0x58
-	.4byte	0x13160
+	.4byte	0x13194
 	.uleb128 0x5c
-	.4byte	0x142bb
+	.4byte	0x143dc
 	.8byte	.LBB1426
 	.4byte	.Ldebug_ranges0+0xb30
 	.byte	0x1
-	.2byte	0x4c6
-	.4byte	0x12e7c
+	.2byte	0x509
+	.4byte	0x12eb0
 	.uleb128 0x55
-	.4byte	0x142e3
+	.4byte	0x14404
 	.uleb128 0x55
-	.4byte	0x142d7
+	.4byte	0x143f8
 	.uleb128 0x55
-	.4byte	0x142cb
+	.4byte	0x143ec
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xb30
 	.uleb128 0x61
-	.4byte	0x142ef
+	.4byte	0x14410
 	.4byte	.LLST184
 	.uleb128 0x61
-	.4byte	0x142fa
+	.4byte	0x1441b
 	.4byte	.LLST185
 	.byte	0
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x142bb
+	.4byte	0x143dc
 	.8byte	.LBB1433
 	.4byte	.Ldebug_ranges0+0xba0
 	.byte	0x1
-	.2byte	0x4c5
+	.2byte	0x508
 	.uleb128 0x55
-	.4byte	0x142e3
+	.4byte	0x14404
 	.uleb128 0x55
-	.4byte	0x142d7
+	.4byte	0x143f8
 	.uleb128 0x55
-	.4byte	0x142cb
+	.4byte	0x143ec
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xba0
 	.uleb128 0x61
-	.4byte	0x142ef
+	.4byte	0x14410
 	.4byte	.LLST186
 	.uleb128 0x61
-	.4byte	0x142fa
+	.4byte	0x1441b
 	.4byte	.LLST187
 	.byte	0
 	.byte	0
@@ -45852,926 +46122,926 @@ __exitcall_ebc_exit:
 	.uleb128 0x67
 	.4byte	.LASF3138
 	.byte	0x1
-	.2byte	0x51e
+	.2byte	0x561
 	.byte	0x1
-	.4byte	0x12f9d
+	.4byte	0x12fd1
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x51e
+	.2byte	0x561
 	.4byte	0xc138
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x51f
+	.2byte	0x562
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x51f
+	.2byte	0x562
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x520
+	.2byte	0x563
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x522
+	.2byte	0x565
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF3139
 	.byte	0x1
-	.2byte	0x523
+	.2byte	0x566
 	.4byte	0x13f
 	.uleb128 0x48
 	.4byte	.LASF3140
 	.byte	0x1
-	.2byte	0x523
+	.2byte	0x566
 	.4byte	0x13f
 	.uleb128 0x48
 	.4byte	.LASF3141
 	.byte	0x1
-	.2byte	0x524
+	.2byte	0x567
 	.4byte	0x110
 	.uleb128 0x48
 	.4byte	.LASF3142
 	.byte	0x1
-	.2byte	0x524
+	.2byte	0x567
 	.4byte	0x110
 	.uleb128 0x48
 	.4byte	.LASF794
 	.byte	0x1
-	.2byte	0x524
+	.2byte	0x567
 	.4byte	0x110
 	.uleb128 0x48
 	.4byte	.LASF3143
 	.byte	0x1
-	.2byte	0x525
+	.2byte	0x568
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF2915
 	.byte	0x1
-	.2byte	0x526
+	.2byte	0x569
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x526
+	.2byte	0x569
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x527
+	.2byte	0x56a
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
-	.2byte	0x527
+	.2byte	0x56a
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x528
+	.2byte	0x56b
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF2871
 	.byte	0x1
-	.2byte	0x529
+	.2byte	0x56c
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x52a
+	.2byte	0x56d
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3145
 	.byte	0x1
-	.2byte	0x4d0
+	.2byte	0x513
 	.byte	0x1
-	.4byte	0x1307f
+	.4byte	0x130b3
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x4d0
+	.2byte	0x513
 	.4byte	0xc138
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x4d1
+	.2byte	0x514
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x4d1
+	.2byte	0x514
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x4d2
+	.2byte	0x515
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x4d4
+	.2byte	0x517
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF3139
 	.byte	0x1
-	.2byte	0x4d5
+	.2byte	0x518
 	.4byte	0x13f
 	.uleb128 0x48
 	.4byte	.LASF3140
 	.byte	0x1
-	.2byte	0x4d5
+	.2byte	0x518
 	.4byte	0x13f
 	.uleb128 0x48
 	.4byte	.LASF3141
 	.byte	0x1
-	.2byte	0x4d6
+	.2byte	0x519
 	.4byte	0x110
 	.uleb128 0x48
 	.4byte	.LASF3142
 	.byte	0x1
-	.2byte	0x4d6
+	.2byte	0x519
 	.4byte	0x110
 	.uleb128 0x48
 	.4byte	.LASF794
 	.byte	0x1
-	.2byte	0x4d6
+	.2byte	0x519
 	.4byte	0x110
 	.uleb128 0x48
 	.4byte	.LASF3143
 	.byte	0x1
-	.2byte	0x4d7
+	.2byte	0x51a
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF2915
 	.byte	0x1
-	.2byte	0x4d8
+	.2byte	0x51b
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x4d8
+	.2byte	0x51b
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x4d9
+	.2byte	0x51c
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
-	.2byte	0x4d9
+	.2byte	0x51c
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x4da
+	.2byte	0x51d
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF2871
 	.byte	0x1
-	.2byte	0x4db
+	.2byte	0x51e
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x4dc
+	.2byte	0x51f
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3146
 	.byte	0x1
-	.2byte	0x4a6
+	.2byte	0x4e9
 	.byte	0x1
-	.4byte	0x1316d
+	.4byte	0x131a1
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x4a6
+	.2byte	0x4e9
 	.4byte	0xc138
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x4a7
+	.2byte	0x4ea
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x4a7
+	.2byte	0x4ea
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x4a8
+	.2byte	0x4eb
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x4aa
+	.2byte	0x4ed
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF3141
 	.byte	0x1
-	.2byte	0x4ab
+	.2byte	0x4ee
 	.4byte	0x13f
 	.uleb128 0x48
 	.4byte	.LASF3142
 	.byte	0x1
-	.2byte	0x4ab
+	.2byte	0x4ee
 	.4byte	0x13f
 	.uleb128 0x48
 	.4byte	.LASF3139
 	.byte	0x1
-	.2byte	0x4ab
+	.2byte	0x4ee
 	.4byte	0xac0
 	.uleb128 0x48
 	.4byte	.LASF3140
 	.byte	0x1
-	.2byte	0x4ab
+	.2byte	0x4ee
 	.4byte	0xac0
 	.uleb128 0x48
 	.4byte	.LASF3143
 	.byte	0x1
-	.2byte	0x4ac
+	.2byte	0x4ef
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF2915
 	.byte	0x1
-	.2byte	0x4ad
+	.2byte	0x4f0
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x4ad
+	.2byte	0x4f0
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x4ae
+	.2byte	0x4f1
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
-	.2byte	0x4ae
+	.2byte	0x4f1
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x4af
+	.2byte	0x4f2
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF2871
 	.byte	0x1
-	.2byte	0x4b0
+	.2byte	0x4f3
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x4b1
+	.2byte	0x4f4
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3147
 	.byte	0x1
-	.2byte	0x4b2
+	.2byte	0x4f5
 	.4byte	0x110
 	.uleb128 0x48
 	.4byte	.LASF3148
 	.byte	0x1
-	.2byte	0x4b3
+	.2byte	0x4f6
 	.4byte	0x110
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3149
 	.byte	0x1
-	.2byte	0x47b
+	.2byte	0x4be
 	.byte	0x1
-	.4byte	0x13243
+	.4byte	0x13277
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x47b
+	.2byte	0x4be
 	.4byte	0xc138
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x47c
+	.2byte	0x4bf
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x47c
+	.2byte	0x4bf
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x47d
+	.2byte	0x4c0
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x47f
+	.2byte	0x4c2
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF3141
 	.byte	0x1
-	.2byte	0x480
+	.2byte	0x4c3
 	.4byte	0x15a
 	.uleb128 0x48
 	.4byte	.LASF3142
 	.byte	0x1
-	.2byte	0x480
+	.2byte	0x4c3
 	.4byte	0x15a
 	.uleb128 0x48
 	.4byte	.LASF3139
 	.byte	0x1
-	.2byte	0x480
+	.2byte	0x4c3
 	.4byte	0x46f4
 	.uleb128 0x48
 	.4byte	.LASF3140
 	.byte	0x1
-	.2byte	0x480
+	.2byte	0x4c3
 	.4byte	0x46f4
 	.uleb128 0x48
 	.4byte	.LASF3143
 	.byte	0x1
-	.2byte	0x481
+	.2byte	0x4c4
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF2915
 	.byte	0x1
-	.2byte	0x482
+	.2byte	0x4c5
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x482
+	.2byte	0x4c5
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x483
+	.2byte	0x4c6
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
-	.2byte	0x483
+	.2byte	0x4c6
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x484
+	.2byte	0x4c7
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF2871
 	.byte	0x1
-	.2byte	0x485
+	.2byte	0x4c8
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x486
+	.2byte	0x4c9
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3150
 	.byte	0x1
-	.2byte	0x452
+	.2byte	0x495
 	.byte	0x1
-	.4byte	0x13319
+	.4byte	0x1334d
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x452
+	.2byte	0x495
 	.4byte	0xc138
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x453
+	.2byte	0x496
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x453
+	.2byte	0x496
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x454
+	.2byte	0x497
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x456
+	.2byte	0x499
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF3141
 	.byte	0x1
-	.2byte	0x457
+	.2byte	0x49a
 	.4byte	0x13f
 	.uleb128 0x48
 	.4byte	.LASF3142
 	.byte	0x1
-	.2byte	0x457
+	.2byte	0x49a
 	.4byte	0x13f
 	.uleb128 0x48
 	.4byte	.LASF3139
 	.byte	0x1
-	.2byte	0x457
+	.2byte	0x49a
 	.4byte	0xac0
 	.uleb128 0x48
 	.4byte	.LASF3140
 	.byte	0x1
-	.2byte	0x457
+	.2byte	0x49a
 	.4byte	0xac0
 	.uleb128 0x48
 	.4byte	.LASF3143
 	.byte	0x1
-	.2byte	0x458
+	.2byte	0x49b
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF2915
 	.byte	0x1
-	.2byte	0x459
+	.2byte	0x49c
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x459
+	.2byte	0x49c
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x45a
+	.2byte	0x49d
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
-	.2byte	0x45a
+	.2byte	0x49d
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x45b
+	.2byte	0x49e
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF2871
 	.byte	0x1
-	.2byte	0x45c
+	.2byte	0x49f
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x45d
+	.2byte	0x4a0
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3151
 	.byte	0x1
-	.2byte	0x43c
-	.8byte	.LFB2821
-	.8byte	.LFE2821-.LFB2821
+	.2byte	0x47f
+	.8byte	.LFB2822
+	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13814
+	.4byte	0x13848
 	.uleb128 0x75
 	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x43c
+	.2byte	0x47f
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x59
 	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x43d
+	.2byte	0x480
 	.4byte	0xac0
 	.4byte	.LLST105
 	.uleb128 0x59
 	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x43d
+	.2byte	0x480
 	.4byte	0xac0
 	.4byte	.LLST106
 	.uleb128 0x59
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x43e
+	.2byte	0x481
 	.4byte	0xe874
 	.4byte	.LLST107
 	.uleb128 0x54
-	.4byte	0x13814
+	.4byte	0x13848
 	.8byte	.LBB1264
 	.8byte	.LBE1264-.LBB1264
 	.byte	0x1
-	.2byte	0x44d
-	.4byte	0x13422
+	.2byte	0x490
+	.4byte	0x13456
 	.uleb128 0x55
-	.4byte	0x13845
+	.4byte	0x13879
 	.uleb128 0x55
-	.4byte	0x13845
+	.4byte	0x13879
 	.uleb128 0x55
-	.4byte	0x13845
+	.4byte	0x13879
 	.uleb128 0x55
-	.4byte	0x13839
+	.4byte	0x1386d
 	.uleb128 0x72
-	.4byte	0x1382d
+	.4byte	0x13861
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x13821
+	.4byte	0x13855
 	.uleb128 0x57
 	.8byte	.LBB1265
 	.8byte	.LBE1265-.LBB1265
 	.uleb128 0x58
-	.4byte	0x13851
+	.4byte	0x13885
 	.uleb128 0x61
-	.4byte	0x1385d
+	.4byte	0x13891
 	.4byte	.LLST108
 	.uleb128 0x58
-	.4byte	0x13869
+	.4byte	0x1389d
 	.uleb128 0x58
-	.4byte	0x13875
+	.4byte	0x138a9
 	.uleb128 0x58
-	.4byte	0x13881
+	.4byte	0x138b5
 	.uleb128 0x58
-	.4byte	0x1388d
+	.4byte	0x138c1
 	.uleb128 0x61
-	.4byte	0x13899
+	.4byte	0x138cd
 	.4byte	.LLST109
 	.uleb128 0x61
-	.4byte	0x138a5
+	.4byte	0x138d9
 	.4byte	.LLST110
 	.uleb128 0x58
-	.4byte	0x138b1
+	.4byte	0x138e5
 	.uleb128 0x61
-	.4byte	0x138bd
+	.4byte	0x138f1
 	.4byte	.LLST111
 	.uleb128 0x58
-	.4byte	0x138c7
+	.4byte	0x138fb
 	.uleb128 0x61
-	.4byte	0x138d1
+	.4byte	0x13905
 	.4byte	.LLST112
 	.uleb128 0x61
-	.4byte	0x138dd
+	.4byte	0x13911
 	.4byte	.LLST113
 	.uleb128 0x58
-	.4byte	0x138e9
+	.4byte	0x1391d
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13b9c
+	.4byte	0x13bd0
 	.8byte	.LBB1266
 	.8byte	.LBE1266-.LBB1266
 	.byte	0x1
-	.2byte	0x446
-	.4byte	0x13570
+	.2byte	0x489
+	.4byte	0x135a4
 	.uleb128 0x55
-	.4byte	0x13bcd
+	.4byte	0x13c01
 	.uleb128 0x55
-	.4byte	0x13bcd
+	.4byte	0x13c01
 	.uleb128 0x55
-	.4byte	0x13bcd
+	.4byte	0x13c01
 	.uleb128 0x55
-	.4byte	0x13bc1
+	.4byte	0x13bf5
 	.uleb128 0x55
-	.4byte	0x13bb5
+	.4byte	0x13be9
 	.uleb128 0x55
-	.4byte	0x13ba9
+	.4byte	0x13bdd
 	.uleb128 0x57
 	.8byte	.LBB1267
 	.8byte	.LBE1267-.LBB1267
 	.uleb128 0x58
-	.4byte	0x13bd9
+	.4byte	0x13c0d
 	.uleb128 0x61
-	.4byte	0x13be5
+	.4byte	0x13c19
 	.4byte	.LLST114
 	.uleb128 0x58
-	.4byte	0x13bef
+	.4byte	0x13c23
 	.uleb128 0x61
-	.4byte	0x13bf9
+	.4byte	0x13c2d
 	.4byte	.LLST115
 	.uleb128 0x58
-	.4byte	0x13c05
+	.4byte	0x13c39
 	.uleb128 0x61
-	.4byte	0x13c11
+	.4byte	0x13c45
 	.4byte	.LLST116
 	.uleb128 0x61
-	.4byte	0x13c1d
+	.4byte	0x13c51
 	.4byte	.LLST117
 	.uleb128 0x61
-	.4byte	0x13c29
+	.4byte	0x13c5d
 	.4byte	.LLST118
 	.uleb128 0x61
-	.4byte	0x13c35
+	.4byte	0x13c69
 	.4byte	.LLST119
 	.uleb128 0x61
-	.4byte	0x13c41
+	.4byte	0x13c75
 	.4byte	.LLST120
 	.uleb128 0x61
-	.4byte	0x13c4d
+	.4byte	0x13c81
 	.4byte	.LLST121
 	.uleb128 0x61
-	.4byte	0x13c59
+	.4byte	0x13c8d
 	.4byte	.LLST122
 	.uleb128 0x58
-	.4byte	0x13c65
+	.4byte	0x13c99
 	.uleb128 0x5c
-	.4byte	0x14386
+	.4byte	0x144a7
 	.8byte	.LBB1268
 	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
-	.2byte	0x359
-	.4byte	0x134fa
+	.2byte	0x39c
+	.4byte	0x1352e
 	.uleb128 0x55
-	.4byte	0x143ae
+	.4byte	0x144cf
 	.uleb128 0x55
-	.4byte	0x143a2
+	.4byte	0x144c3
 	.uleb128 0x55
-	.4byte	0x14396
+	.4byte	0x144b7
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14386
+	.4byte	0x144a7
 	.8byte	.LBB1273
 	.4byte	.Ldebug_ranges0+0x720
 	.byte	0x1
-	.2byte	0x35a
-	.4byte	0x13522
+	.2byte	0x39d
+	.4byte	0x13556
 	.uleb128 0x55
-	.4byte	0x143ae
+	.4byte	0x144cf
 	.uleb128 0x55
-	.4byte	0x143a2
+	.4byte	0x144c3
 	.uleb128 0x55
-	.4byte	0x14396
+	.4byte	0x144b7
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14386
+	.4byte	0x144a7
 	.8byte	.LBB1285
 	.4byte	.Ldebug_ranges0+0x790
 	.byte	0x1
-	.2byte	0x35b
-	.4byte	0x1354a
+	.2byte	0x39e
+	.4byte	0x1357e
 	.uleb128 0x55
-	.4byte	0x143ae
+	.4byte	0x144cf
 	.uleb128 0x55
-	.4byte	0x143a2
+	.4byte	0x144c3
 	.uleb128 0x55
-	.4byte	0x14396
+	.4byte	0x144b7
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x14386
+	.4byte	0x144a7
 	.8byte	.LBB1297
 	.4byte	.Ldebug_ranges0+0x800
 	.byte	0x1
-	.2byte	0x35c
+	.2byte	0x39f
 	.uleb128 0x55
-	.4byte	0x143ae
+	.4byte	0x144cf
 	.uleb128 0x55
-	.4byte	0x143a2
+	.4byte	0x144c3
 	.uleb128 0x55
-	.4byte	0x14396
+	.4byte	0x144b7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x138f6
+	.4byte	0x1392a
 	.8byte	.LBB1308
 	.8byte	.LBE1308-.LBB1308
 	.byte	0x1
-	.2byte	0x44b
-	.4byte	0x13619
+	.2byte	0x48e
+	.4byte	0x1364d
 	.uleb128 0x55
-	.4byte	0x13927
+	.4byte	0x1395b
 	.uleb128 0x55
-	.4byte	0x13927
+	.4byte	0x1395b
 	.uleb128 0x55
-	.4byte	0x13927
+	.4byte	0x1395b
 	.uleb128 0x55
-	.4byte	0x1391b
+	.4byte	0x1394f
 	.uleb128 0x72
-	.4byte	0x1390f
+	.4byte	0x13943
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x13903
+	.4byte	0x13937
 	.uleb128 0x57
 	.8byte	.LBB1309
 	.8byte	.LBE1309-.LBB1309
 	.uleb128 0x58
-	.4byte	0x13933
+	.4byte	0x13967
 	.uleb128 0x58
-	.4byte	0x1393f
+	.4byte	0x13973
 	.uleb128 0x58
-	.4byte	0x1394b
+	.4byte	0x1397f
 	.uleb128 0x58
-	.4byte	0x13957
+	.4byte	0x1398b
 	.uleb128 0x58
-	.4byte	0x13963
+	.4byte	0x13997
 	.uleb128 0x58
-	.4byte	0x1396f
+	.4byte	0x139a3
 	.uleb128 0x61
-	.4byte	0x1397b
+	.4byte	0x139af
 	.4byte	.LLST123
 	.uleb128 0x61
-	.4byte	0x13987
+	.4byte	0x139bb
 	.4byte	.LLST124
 	.uleb128 0x58
-	.4byte	0x13993
+	.4byte	0x139c7
 	.uleb128 0x61
-	.4byte	0x1399f
+	.4byte	0x139d3
 	.4byte	.LLST125
 	.uleb128 0x58
-	.4byte	0x139a9
+	.4byte	0x139dd
 	.uleb128 0x61
-	.4byte	0x139b3
+	.4byte	0x139e7
 	.4byte	.LLST126
 	.uleb128 0x61
-	.4byte	0x139bf
+	.4byte	0x139f3
 	.4byte	.LLST127
 	.uleb128 0x58
-	.4byte	0x139cb
+	.4byte	0x139ff
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13ac6
+	.4byte	0x13afa
 	.8byte	.LBB1310
 	.8byte	.LBE1310-.LBB1310
 	.byte	0x1
-	.2byte	0x448
-	.4byte	0x13713
+	.2byte	0x48b
+	.4byte	0x13747
 	.uleb128 0x55
-	.4byte	0x13af7
+	.4byte	0x13b2b
 	.uleb128 0x55
-	.4byte	0x13af7
+	.4byte	0x13b2b
 	.uleb128 0x55
-	.4byte	0x13af7
+	.4byte	0x13b2b
 	.uleb128 0x55
-	.4byte	0x13aeb
+	.4byte	0x13b1f
 	.uleb128 0x55
-	.4byte	0x13adf
+	.4byte	0x13b13
 	.uleb128 0x55
-	.4byte	0x13ad3
+	.4byte	0x13b07
 	.uleb128 0x57
 	.8byte	.LBB1311
 	.8byte	.LBE1311-.LBB1311
 	.uleb128 0x58
-	.4byte	0x13b03
+	.4byte	0x13b37
 	.uleb128 0x61
-	.4byte	0x13b0f
+	.4byte	0x13b43
 	.4byte	.LLST128
 	.uleb128 0x58
-	.4byte	0x13b19
+	.4byte	0x13b4d
 	.uleb128 0x61
-	.4byte	0x13b23
+	.4byte	0x13b57
 	.4byte	.LLST129
 	.uleb128 0x61
-	.4byte	0x13b2f
+	.4byte	0x13b63
 	.4byte	.LLST130
 	.uleb128 0x61
-	.4byte	0x13b3b
+	.4byte	0x13b6f
 	.4byte	.LLST131
 	.uleb128 0x58
-	.4byte	0x13b47
+	.4byte	0x13b7b
 	.uleb128 0x62
-	.4byte	0x13b53
+	.4byte	0x13b87
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x13b5f
+	.4byte	0x13b93
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x13b6b
+	.4byte	0x13b9f
 	.4byte	.LLST132
 	.uleb128 0x61
-	.4byte	0x13b77
+	.4byte	0x13bab
 	.4byte	.LLST133
 	.uleb128 0x61
-	.4byte	0x13b83
+	.4byte	0x13bb7
 	.4byte	.LLST134
 	.uleb128 0x58
-	.4byte	0x13b8f
+	.4byte	0x13bc3
 	.uleb128 0x5c
-	.4byte	0x14386
+	.4byte	0x144a7
 	.8byte	.LBB1312
 	.4byte	.Ldebug_ranges0+0x850
 	.byte	0x1
-	.2byte	0x381
-	.4byte	0x136ed
+	.2byte	0x3c4
+	.4byte	0x13721
 	.uleb128 0x55
-	.4byte	0x143ae
+	.4byte	0x144cf
 	.uleb128 0x55
-	.4byte	0x143a2
+	.4byte	0x144c3
 	.uleb128 0x55
-	.4byte	0x14396
+	.4byte	0x144b7
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x14386
+	.4byte	0x144a7
 	.8byte	.LBB1319
 	.4byte	.Ldebug_ranges0+0x8b0
 	.byte	0x1
-	.2byte	0x382
+	.2byte	0x3c5
 	.uleb128 0x55
-	.4byte	0x143ae
+	.4byte	0x144cf
 	.uleb128 0x55
-	.4byte	0x143a2
+	.4byte	0x144c3
 	.uleb128 0x55
-	.4byte	0x14396
+	.4byte	0x144b7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x139d8
+	.4byte	0x13a0c
 	.8byte	.LBB1330
 	.8byte	.LBE1330-.LBB1330
 	.byte	0x1
-	.2byte	0x442
+	.2byte	0x485
 	.uleb128 0x55
-	.4byte	0x13a09
+	.4byte	0x13a3d
 	.uleb128 0x55
-	.4byte	0x13a09
+	.4byte	0x13a3d
 	.uleb128 0x55
-	.4byte	0x13a09
+	.4byte	0x13a3d
 	.uleb128 0x55
-	.4byte	0x139fd
+	.4byte	0x13a31
 	.uleb128 0x55
-	.4byte	0x139f1
+	.4byte	0x13a25
 	.uleb128 0x55
-	.4byte	0x139e5
+	.4byte	0x13a19
 	.uleb128 0x57
 	.8byte	.LBB1331
 	.8byte	.LBE1331-.LBB1331
 	.uleb128 0x58
-	.4byte	0x13a15
+	.4byte	0x13a49
 	.uleb128 0x61
-	.4byte	0x13a21
+	.4byte	0x13a55
 	.4byte	.LLST135
 	.uleb128 0x58
-	.4byte	0x13a2b
+	.4byte	0x13a5f
 	.uleb128 0x61
-	.4byte	0x13a35
+	.4byte	0x13a69
 	.4byte	.LLST136
 	.uleb128 0x61
-	.4byte	0x13a41
+	.4byte	0x13a75
 	.4byte	.LLST137
 	.uleb128 0x61
-	.4byte	0x13a4d
+	.4byte	0x13a81
 	.4byte	.LLST138
 	.uleb128 0x58
-	.4byte	0x13a59
+	.4byte	0x13a8d
 	.uleb128 0x62
-	.4byte	0x13a65
+	.4byte	0x13a99
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x13a71
+	.4byte	0x13aa5
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x13a7d
+	.4byte	0x13ab1
 	.4byte	.LLST139
 	.uleb128 0x61
-	.4byte	0x13a89
+	.4byte	0x13abd
 	.4byte	.LLST140
 	.uleb128 0x61
-	.4byte	0x13a95
+	.4byte	0x13ac9
 	.4byte	.LLST141
 	.uleb128 0x58
-	.4byte	0x13aa1
+	.4byte	0x13ad5
 	.uleb128 0x58
-	.4byte	0x13aad
+	.4byte	0x13ae1
 	.uleb128 0x58
-	.4byte	0x13ab9
+	.4byte	0x13aed
 	.uleb128 0x5c
-	.4byte	0x14351
+	.4byte	0x14472
 	.8byte	.LBB1332
 	.4byte	.Ldebug_ranges0+0x900
 	.byte	0x1
-	.2byte	0x3a8
-	.4byte	0x137ed
+	.2byte	0x3eb
+	.4byte	0x13821
 	.uleb128 0x55
-	.4byte	0x14379
+	.4byte	0x1449a
 	.uleb128 0x55
-	.4byte	0x1436d
+	.4byte	0x1448e
 	.uleb128 0x55
-	.4byte	0x14361
+	.4byte	0x14482
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x14351
+	.4byte	0x14472
 	.8byte	.LBB1338
 	.4byte	.Ldebug_ranges0+0x960
 	.byte	0x1
-	.2byte	0x3a9
+	.2byte	0x3ec
 	.uleb128 0x55
-	.4byte	0x14379
+	.4byte	0x1449a
 	.uleb128 0x55
-	.4byte	0x1436d
+	.4byte	0x1448e
 	.uleb128 0x55
-	.4byte	0x14361
+	.4byte	0x14482
 	.byte	0
 	.byte	0
 	.byte	0
@@ -46779,964 +47049,1056 @@ __exitcall_ebc_exit:
 	.uleb128 0x67
 	.4byte	.LASF3152
 	.byte	0x1
-	.2byte	0x3f5
+	.2byte	0x438
 	.byte	0x1
-	.4byte	0x138f6
+	.4byte	0x1392a
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x3f5
+	.2byte	0x438
 	.4byte	0xc138
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x3f6
+	.2byte	0x439
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x3f6
+	.2byte	0x439
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x3f7
+	.2byte	0x43a
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x3f9
+	.2byte	0x43c
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF3139
 	.byte	0x1
-	.2byte	0x3fa
+	.2byte	0x43d
 	.4byte	0x13f
 	.uleb128 0x48
 	.4byte	.LASF3140
 	.byte	0x1
-	.2byte	0x3fa
+	.2byte	0x43d
 	.4byte	0x13f
 	.uleb128 0x48
 	.4byte	.LASF3141
 	.byte	0x1
-	.2byte	0x3fb
+	.2byte	0x43e
 	.4byte	0x110
 	.uleb128 0x48
 	.4byte	.LASF3142
 	.byte	0x1
-	.2byte	0x3fb
+	.2byte	0x43e
 	.4byte	0x110
 	.uleb128 0x48
 	.4byte	.LASF794
 	.byte	0x1
-	.2byte	0x3fb
+	.2byte	0x43e
 	.4byte	0x110
 	.uleb128 0x48
 	.4byte	.LASF3143
 	.byte	0x1
-	.2byte	0x3fc
+	.2byte	0x43f
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF2915
 	.byte	0x1
-	.2byte	0x3fd
+	.2byte	0x440
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x3fd
+	.2byte	0x440
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x3fe
+	.2byte	0x441
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
-	.2byte	0x3fe
+	.2byte	0x441
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x3ff
+	.2byte	0x442
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF2871
 	.byte	0x1
-	.2byte	0x400
+	.2byte	0x443
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x401
+	.2byte	0x444
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3153
 	.byte	0x1
-	.2byte	0x3af
+	.2byte	0x3f2
 	.byte	0x1
-	.4byte	0x139d8
+	.4byte	0x13a0c
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x3af
+	.2byte	0x3f2
 	.4byte	0xc138
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x3b0
+	.2byte	0x3f3
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x3b0
+	.2byte	0x3f3
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x3b1
+	.2byte	0x3f4
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x3b3
+	.2byte	0x3f6
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF3139
 	.byte	0x1
-	.2byte	0x3b4
+	.2byte	0x3f7
 	.4byte	0x13f
 	.uleb128 0x48
 	.4byte	.LASF3140
 	.byte	0x1
-	.2byte	0x3b4
+	.2byte	0x3f7
 	.4byte	0x13f
 	.uleb128 0x48
 	.4byte	.LASF3141
 	.byte	0x1
-	.2byte	0x3b5
+	.2byte	0x3f8
 	.4byte	0x110
 	.uleb128 0x48
 	.4byte	.LASF3142
 	.byte	0x1
-	.2byte	0x3b5
+	.2byte	0x3f8
 	.4byte	0x110
 	.uleb128 0x48
 	.4byte	.LASF794
 	.byte	0x1
-	.2byte	0x3b5
+	.2byte	0x3f8
 	.4byte	0x110
 	.uleb128 0x48
 	.4byte	.LASF3143
 	.byte	0x1
-	.2byte	0x3b6
+	.2byte	0x3f9
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF2915
 	.byte	0x1
-	.2byte	0x3b7
+	.2byte	0x3fa
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x3b7
+	.2byte	0x3fa
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x3b8
+	.2byte	0x3fb
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
-	.2byte	0x3b8
+	.2byte	0x3fb
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x3b9
+	.2byte	0x3fc
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF2871
 	.byte	0x1
-	.2byte	0x3ba
+	.2byte	0x3fd
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x3bb
+	.2byte	0x3fe
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3154
 	.byte	0x1
-	.2byte	0x388
+	.2byte	0x3cb
 	.byte	0x1
-	.4byte	0x13ac6
+	.4byte	0x13afa
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x388
+	.2byte	0x3cb
 	.4byte	0xc138
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x389
+	.2byte	0x3cc
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x389
+	.2byte	0x3cc
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x38a
+	.2byte	0x3cd
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x38c
+	.2byte	0x3cf
 	.4byte	0xe1f4
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x38d
+	.2byte	0x3d0
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
-	.2byte	0x38d
+	.2byte	0x3d0
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF2915
 	.byte	0x1
-	.2byte	0x38e
+	.2byte	0x3d1
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x38f
+	.2byte	0x3d2
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3141
 	.byte	0x1
-	.2byte	0x390
+	.2byte	0x3d3
 	.4byte	0x13f
 	.uleb128 0x48
 	.4byte	.LASF3142
 	.byte	0x1
-	.2byte	0x390
+	.2byte	0x3d3
 	.4byte	0x13f
 	.uleb128 0x48
 	.4byte	.LASF3139
 	.byte	0x1
-	.2byte	0x390
+	.2byte	0x3d3
 	.4byte	0xac0
 	.uleb128 0x48
 	.4byte	.LASF3140
 	.byte	0x1
-	.2byte	0x390
+	.2byte	0x3d3
 	.4byte	0xac0
 	.uleb128 0x48
 	.4byte	.LASF3143
 	.byte	0x1
-	.2byte	0x391
+	.2byte	0x3d4
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x392
+	.2byte	0x3d5
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF2871
 	.byte	0x1
-	.2byte	0x393
+	.2byte	0x3d6
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x394
+	.2byte	0x3d7
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3147
 	.byte	0x1
-	.2byte	0x395
+	.2byte	0x3d8
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3148
 	.byte	0x1
-	.2byte	0x396
+	.2byte	0x3d9
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3155
 	.byte	0x1
-	.2byte	0x363
+	.2byte	0x3a6
 	.byte	0x1
-	.4byte	0x13b9c
+	.4byte	0x13bd0
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x363
+	.2byte	0x3a6
 	.4byte	0xc138
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x364
+	.2byte	0x3a7
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x364
+	.2byte	0x3a7
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x365
+	.2byte	0x3a8
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x367
+	.2byte	0x3aa
 	.4byte	0xe1f4
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x368
+	.2byte	0x3ab
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
-	.2byte	0x368
+	.2byte	0x3ab
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF2915
 	.byte	0x1
-	.2byte	0x369
+	.2byte	0x3ac
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x36a
+	.2byte	0x3ad
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3141
 	.byte	0x1
-	.2byte	0x36b
+	.2byte	0x3ae
 	.4byte	0x13f
 	.uleb128 0x48
 	.4byte	.LASF3142
 	.byte	0x1
-	.2byte	0x36b
+	.2byte	0x3ae
 	.4byte	0x13f
 	.uleb128 0x48
 	.4byte	.LASF3139
 	.byte	0x1
-	.2byte	0x36b
+	.2byte	0x3ae
 	.4byte	0xac0
 	.uleb128 0x48
 	.4byte	.LASF3140
 	.byte	0x1
-	.2byte	0x36b
+	.2byte	0x3ae
 	.4byte	0xac0
 	.uleb128 0x48
 	.4byte	.LASF3143
 	.byte	0x1
-	.2byte	0x36c
+	.2byte	0x3af
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x36d
+	.2byte	0x3b0
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF2871
 	.byte	0x1
-	.2byte	0x36e
+	.2byte	0x3b1
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x36f
+	.2byte	0x3b2
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3156
 	.byte	0x1
-	.2byte	0x33b
+	.2byte	0x37e
 	.byte	0x1
-	.4byte	0x13c72
+	.4byte	0x13ca6
 	.uleb128 0x66
 	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x33b
+	.2byte	0x37e
 	.4byte	0xc138
 	.uleb128 0x66
 	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x33c
+	.2byte	0x37f
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x33c
+	.2byte	0x37f
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x33d
+	.2byte	0x380
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x33f
+	.2byte	0x382
 	.4byte	0xe1f4
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x340
+	.2byte	0x383
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
-	.2byte	0x340
+	.2byte	0x383
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF2915
 	.byte	0x1
-	.2byte	0x341
+	.2byte	0x384
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x342
+	.2byte	0x385
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3141
 	.byte	0x1
-	.2byte	0x343
+	.2byte	0x386
 	.4byte	0x15a
 	.uleb128 0x48
 	.4byte	.LASF3142
 	.byte	0x1
-	.2byte	0x343
+	.2byte	0x386
 	.4byte	0x15a
 	.uleb128 0x48
 	.4byte	.LASF3139
 	.byte	0x1
-	.2byte	0x343
+	.2byte	0x386
 	.4byte	0x46f4
 	.uleb128 0x48
 	.4byte	.LASF3140
 	.byte	0x1
-	.2byte	0x343
+	.2byte	0x386
 	.4byte	0x46f4
 	.uleb128 0x48
 	.4byte	.LASF3143
 	.byte	0x1
-	.2byte	0x344
+	.2byte	0x387
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x345
+	.2byte	0x388
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF2871
 	.byte	0x1
-	.2byte	0x346
+	.2byte	0x389
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x347
+	.2byte	0x38a
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3157
 	.byte	0x1
-	.2byte	0x26d
-	.8byte	.LFB2815
-	.8byte	.LFE2815-.LFB2815
+	.2byte	0x2b0
+	.8byte	.LFB2816
+	.8byte	.LFE2816-.LFB2816
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13dd3
+	.4byte	0x13e07
 	.uleb128 0x75
 	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x26d
+	.2byte	0x2b0
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x75
 	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x26d
+	.2byte	0x2b0
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x75
 	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x26d
+	.2byte	0x2b0
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x75
 	.4byte	.LASF3158
 	.byte	0x1
-	.2byte	0x26e
+	.2byte	0x2b1
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x75
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x26e
+	.2byte	0x2b1
 	.4byte	0xe874
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x270
+	.2byte	0x2b3
 	.4byte	0xe1f4
 	.uleb128 0x6a
 	.string	"i"
 	.byte	0x1
-	.2byte	0x271
+	.2byte	0x2b4
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5d
 	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
-	.2byte	0x272
+	.2byte	0x2b5
 	.4byte	0xc6
 	.uleb128 0x4d
 	.4byte	.LASF2915
 	.byte	0x1
-	.2byte	0x273
+	.2byte	0x2b6
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x62
 	.uleb128 0x4d
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x274
+	.2byte	0x2b7
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x5a
 	.4byte	.LASF3141
 	.byte	0x1
-	.2byte	0x275
+	.2byte	0x2b8
 	.4byte	0x13f
 	.4byte	.LLST6
 	.uleb128 0x5a
 	.4byte	.LASF3142
 	.byte	0x1
-	.2byte	0x275
+	.2byte	0x2b8
 	.4byte	0x13f
 	.4byte	.LLST7
 	.uleb128 0x48
 	.4byte	.LASF3159
 	.byte	0x1
-	.2byte	0x275
+	.2byte	0x2b8
 	.4byte	0x13f
 	.uleb128 0x4d
 	.4byte	.LASF3139
 	.byte	0x1
-	.2byte	0x276
+	.2byte	0x2b9
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4d
 	.4byte	.LASF3140
 	.byte	0x1
-	.2byte	0x276
+	.2byte	0x2b9
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5a
 	.4byte	.LASF3143
 	.byte	0x1
-	.2byte	0x277
+	.2byte	0x2ba
 	.4byte	0xc138
 	.4byte	.LLST8
 	.uleb128 0x48
 	.4byte	.LASF2985
 	.byte	0x1
-	.2byte	0x278
+	.2byte	0x2bb
 	.4byte	0x110
 	.uleb128 0x4d
 	.4byte	.LASF3160
 	.byte	0x1
-	.2byte	0x279
+	.2byte	0x2bc
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x48
 	.4byte	.LASF3161
 	.byte	0x1
-	.2byte	0x27a
+	.2byte	0x2bd
 	.4byte	0x110
 	.uleb128 0x48
 	.4byte	.LASF2871
 	.byte	0x1
-	.2byte	0x27b
+	.2byte	0x2be
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x27c
+	.2byte	0x2bf
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3162
 	.byte	0x1
-	.2byte	0x27d
+	.2byte	0x2c0
 	.4byte	0x110
 	.uleb128 0x48
 	.4byte	.LASF3163
 	.byte	0x1
-	.2byte	0x27d
+	.2byte	0x2c0
 	.4byte	0x110
 	.uleb128 0x5a
 	.4byte	.LASF3164
 	.byte	0x1
-	.2byte	0x27e
+	.2byte	0x2c1
 	.4byte	0x13f
 	.4byte	.LLST9
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3165
 	.byte	0x1
-	.2byte	0x1c8
-	.8byte	.LFB2814
-	.8byte	.LFE2814-.LFB2814
+	.2byte	0x20b
+	.8byte	.LFB2815
+	.8byte	.LFE2815-.LFB2815
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13f2e
+	.4byte	0x13f62
 	.uleb128 0x75
 	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x1c8
+	.2byte	0x20b
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x75
 	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x1c8
+	.2byte	0x20b
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x75
 	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x1c8
+	.2byte	0x20b
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x75
 	.4byte	.LASF3158
 	.byte	0x1
-	.2byte	0x1c9
+	.2byte	0x20c
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x75
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x1c9
+	.2byte	0x20c
 	.4byte	0xe874
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x1cb
+	.2byte	0x20e
 	.4byte	0xe1f4
 	.uleb128 0x5b
 	.string	"i"
 	.byte	0x1
-	.2byte	0x1cc
+	.2byte	0x20f
 	.4byte	0xc6
 	.4byte	.LLST0
 	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
-	.2byte	0x1cd
+	.2byte	0x210
 	.4byte	0xc6
 	.uleb128 0x4d
 	.4byte	.LASF2915
 	.byte	0x1
-	.2byte	0x1ce
+	.2byte	0x211
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x61
 	.uleb128 0x5a
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x1cf
+	.2byte	0x212
 	.4byte	0xc6
 	.4byte	.LLST1
 	.uleb128 0x5a
 	.4byte	.LASF3141
 	.byte	0x1
-	.2byte	0x1d0
+	.2byte	0x213
 	.4byte	0x13f
 	.4byte	.LLST2
 	.uleb128 0x5a
 	.4byte	.LASF3142
 	.byte	0x1
-	.2byte	0x1d0
+	.2byte	0x213
 	.4byte	0x13f
 	.4byte	.LLST3
 	.uleb128 0x4d
 	.4byte	.LASF3139
 	.byte	0x1
-	.2byte	0x1d1
+	.2byte	0x214
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4d
 	.4byte	.LASF3140
 	.byte	0x1
-	.2byte	0x1d1
+	.2byte	0x214
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5a
 	.4byte	.LASF3143
 	.byte	0x1
-	.2byte	0x1d2
+	.2byte	0x215
 	.4byte	0xc138
 	.4byte	.LLST4
 	.uleb128 0x4d
 	.4byte	.LASF2985
 	.byte	0x1
-	.2byte	0x1d3
+	.2byte	0x216
 	.4byte	0x110
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x4d
 	.4byte	.LASF3160
 	.byte	0x1
-	.2byte	0x1d4
+	.2byte	0x217
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x48
 	.4byte	.LASF3161
 	.byte	0x1
-	.2byte	0x1d5
+	.2byte	0x218
 	.4byte	0x110
 	.uleb128 0x48
 	.4byte	.LASF2871
 	.byte	0x1
-	.2byte	0x1d6
+	.2byte	0x219
 	.4byte	0xc138
 	.uleb128 0x48
 	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x1d7
+	.2byte	0x21a
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3162
 	.byte	0x1
-	.2byte	0x1d8
+	.2byte	0x21b
 	.4byte	0x110
 	.uleb128 0x48
 	.4byte	.LASF3163
 	.byte	0x1
-	.2byte	0x1d8
+	.2byte	0x21b
 	.4byte	0x110
 	.uleb128 0x5a
 	.4byte	.LASF3164
 	.byte	0x1
-	.2byte	0x1d9
+	.2byte	0x21c
 	.4byte	0x13f
 	.4byte	.LLST5
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3166
 	.byte	0x1
-	.2byte	0x169
+	.2byte	0x1ac
 	.byte	0x1
-	.4byte	0x1404c
+	.4byte	0x14080
 	.uleb128 0x66
 	.4byte	.LASF3167
 	.byte	0x1
-	.2byte	0x169
+	.2byte	0x1ac
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF3168
 	.byte	0x1
-	.2byte	0x169
+	.2byte	0x1ac
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF3169
 	.byte	0x1
-	.2byte	0x169
+	.2byte	0x1ac
 	.4byte	0xac0
 	.uleb128 0x66
 	.4byte	.LASF3158
 	.byte	0x1
-	.2byte	0x169
+	.2byte	0x1ac
 	.4byte	0x46f4
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x16a
+	.2byte	0x1ad
 	.4byte	0xe874
 	.uleb128 0x66
 	.4byte	.LASF2882
 	.byte	0x1
-	.2byte	0x16a
+	.2byte	0x1ad
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF2915
 	.byte	0x1
-	.2byte	0x16c
+	.2byte	0x1af
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x16c
+	.2byte	0x1af
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3170
 	.byte	0x1
-	.2byte	0x16d
+	.2byte	0x1b0
 	.4byte	0x13f
 	.uleb128 0x48
 	.4byte	.LASF3171
 	.byte	0x1
-	.2byte	0x16d
+	.2byte	0x1b0
 	.4byte	0x13f
 	.uleb128 0x48
 	.4byte	.LASF3172
 	.byte	0x1
-	.2byte	0x16d
+	.2byte	0x1b0
 	.4byte	0x13f
 	.uleb128 0x48
 	.4byte	.LASF3173
 	.byte	0x1
-	.2byte	0x16e
+	.2byte	0x1b1
 	.4byte	0xac0
 	.uleb128 0x48
 	.4byte	.LASF3174
 	.byte	0x1
-	.2byte	0x16e
+	.2byte	0x1b1
 	.4byte	0xac0
 	.uleb128 0x48
 	.4byte	.LASF3175
 	.byte	0x1
-	.2byte	0x16e
+	.2byte	0x1b1
 	.4byte	0xac0
 	.uleb128 0x48
 	.4byte	.LASF3161
 	.byte	0x1
-	.2byte	0x16f
+	.2byte	0x1b2
 	.4byte	0x15a
 	.uleb128 0x48
 	.4byte	.LASF3160
 	.byte	0x1
-	.2byte	0x170
+	.2byte	0x1b3
 	.4byte	0x46f4
 	.uleb128 0x48
 	.4byte	.LASF3176
 	.byte	0x1
-	.2byte	0x171
+	.2byte	0x1b4
 	.4byte	0x13f
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x172
+	.2byte	0x1b5
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
-	.2byte	0x173
+	.2byte	0x1b6
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF2883
 	.byte	0x1
-	.2byte	0x174
+	.2byte	0x1b7
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF2885
 	.byte	0x1
-	.2byte	0x175
+	.2byte	0x1b8
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF2884
 	.byte	0x1
-	.2byte	0x176
+	.2byte	0x1b9
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF2886
 	.byte	0x1
-	.2byte	0x177
+	.2byte	0x1ba
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x76
 	.4byte	.LASF3177
 	.byte	0x1
-	.2byte	0x152
-	.8byte	.LFB2812
-	.8byte	.LFE2812-.LFB2812
+	.2byte	0x18e
+	.8byte	.LFB2813
+	.8byte	.LFE2813-.LFB2813
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x140dc
+	.4byte	0x1412a
 	.uleb128 0x59
 	.4byte	.LASF2288
 	.byte	0x1
-	.2byte	0x152
+	.2byte	0x18e
 	.4byte	0x3205
-	.4byte	.LLST231
+	.4byte	.LLST235
 	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x154
+	.2byte	0x190
 	.4byte	0xe557
-	.4byte	.LLST232
+	.4byte	.LLST236
 	.uleb128 0x5a
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x155
+	.2byte	0x191
 	.4byte	0xe874
-	.4byte	.LLST233
+	.4byte	.LLST237
 	.uleb128 0x4f
-	.8byte	.LVL821
-	.4byte	0x153f5
+	.8byte	.LVL841
+	.4byte	0x15516
 	.uleb128 0x4f
-	.8byte	.LVL823
-	.4byte	0x141a3
+	.8byte	.LVL843
+	.4byte	0x142c4
 	.uleb128 0x4f
-	.8byte	.LVL824
-	.4byte	0x15401
+	.8byte	.LVL844
+	.4byte	0x15522
 	.uleb128 0x4f
-	.8byte	.LVL827
-	.4byte	0x140dc
+	.8byte	.LVL847
+	.4byte	0x1412a
+	.uleb128 0x4f
+	.8byte	.LVL848
+	.4byte	0x15522
+	.uleb128 0x4f
+	.8byte	.LVL851
+	.4byte	0x141f1
 	.uleb128 0x4f
-	.8byte	.LVL828
-	.4byte	0x15401
+	.8byte	.LVL852
+	.4byte	0x15522
 	.byte	0
 	.uleb128 0x76
 	.4byte	.LASF3178
 	.byte	0x1
+	.2byte	0x15d
+	.8byte	.LFB2812
+	.8byte	.LFE2812-.LFB2812
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x141f1
+	.uleb128 0x75
+	.4byte	.LASF3167
+	.byte	0x1
+	.2byte	0x15d
+	.4byte	0xac0
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x75
+	.4byte	.LASF3168
+	.byte	0x1
+	.2byte	0x15d
+	.4byte	0xac0
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x75
+	.4byte	.LASF3158
+	.byte	0x1
+	.2byte	0x15d
+	.4byte	0x46f4
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x59
+	.4byte	.LASF2976
+	.byte	0x1
+	.2byte	0x15e
+	.4byte	0xe874
+	.4byte	.LLST231
+	.uleb128 0x4d
+	.4byte	.LASF2915
+	.byte	0x1
+	.2byte	0x160
+	.4byte	0xc6
+	.uleb128 0x1
+	.byte	0x5d
+	.uleb128 0x4d
+	.4byte	.LASF262
+	.byte	0x1
+	.2byte	0x160
+	.4byte	0xc6
+	.uleb128 0x1
+	.byte	0x59
+	.uleb128 0x48
+	.4byte	.LASF3170
+	.byte	0x1
+	.2byte	0x161
+	.4byte	0x13f
+	.uleb128 0x5a
+	.4byte	.LASF3171
+	.byte	0x1
+	.2byte	0x161
+	.4byte	0x13f
+	.4byte	.LLST232
+	.uleb128 0x5a
+	.4byte	.LASF3161
+	.byte	0x1
+	.2byte	0x162
+	.4byte	0x15a
+	.4byte	.LLST233
+	.uleb128 0x6a
+	.string	"i"
+	.byte	0x1
+	.2byte	0x163
+	.4byte	0xc6
+	.uleb128 0x1
+	.byte	0x5b
+	.uleb128 0x53
+	.string	"j"
+	.byte	0x1
+	.2byte	0x163
+	.4byte	0xc6
+	.uleb128 0x5a
+	.4byte	.LASF3176
+	.byte	0x1
+	.2byte	0x164
+	.4byte	0x13f
+	.4byte	.LLST234
+	.byte	0
+	.uleb128 0x76
+	.4byte	.LASF3179
+	.byte	0x1
 	.2byte	0x121
 	.8byte	.LFB2811
 	.8byte	.LFE2811-.LFB2811
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x141a3
+	.4byte	0x142c4
 	.uleb128 0x75
 	.4byte	.LASF3167
 	.byte	0x1
@@ -47744,13 +48106,12 @@ __exitcall_ebc_exit:
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
-	.uleb128 0x75
+	.uleb128 0x59
 	.4byte	.LASF3168
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0xac0
-	.uleb128 0x1
-	.byte	0x51
+	.4byte	.LLST227
 	.uleb128 0x75
 	.4byte	.LASF3158
 	.byte	0x1
@@ -47763,38 +48124,44 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x122
 	.4byte	0xe874
-	.4byte	.LLST227
+	.4byte	.LLST228
 	.uleb128 0x4d
 	.4byte	.LASF2915
 	.byte	0x1
 	.2byte	0x124
 	.4byte	0xc6
 	.uleb128 0x1
-	.byte	0x5d
+	.byte	0x5e
 	.uleb128 0x4d
 	.4byte	.LASF262
 	.byte	0x1
 	.2byte	0x124
 	.4byte	0xc6
 	.uleb128 0x1
-	.byte	0x59
+	.byte	0x5a
 	.uleb128 0x48
 	.4byte	.LASF3170
 	.byte	0x1
 	.2byte	0x125
 	.4byte	0x13f
-	.uleb128 0x5a
+	.uleb128 0x48
 	.4byte	.LASF3171
 	.byte	0x1
 	.2byte	0x125
 	.4byte	0x13f
-	.4byte	.LLST228
 	.uleb128 0x5a
+	.4byte	.LASF3174
+	.byte	0x1
+	.2byte	0x125
+	.4byte	0x13f
+	.4byte	.LLST229
+	.uleb128 0x4d
 	.4byte	.LASF3161
 	.byte	0x1
 	.2byte	0x126
 	.4byte	0x15a
-	.4byte	.LLST229
+	.uleb128 0x1
+	.byte	0x55
 	.uleb128 0x6a
 	.string	"i"
 	.byte	0x1
@@ -47815,14 +48182,14 @@ __exitcall_ebc_exit:
 	.4byte	.LLST230
 	.byte	0
 	.uleb128 0x77
-	.4byte	.LASF3179
+	.4byte	.LASF3180
 	.byte	0x1
 	.byte	0xd6
 	.8byte	.LFB2810
 	.8byte	.LFE2810-.LFB2810
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14288
+	.4byte	0x143a9
 	.uleb128 0x78
 	.4byte	.LASF3167
 	.byte	0x1
@@ -47920,19 +48287,19 @@ __exitcall_ebc_exit:
 	.4byte	.LLST226
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3180
+	.4byte	.LASF3181
 	.byte	0x1
 	.byte	0xb7
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x142bb
+	.4byte	0x143dc
 	.uleb128 0x7f
 	.string	"ebc"
 	.byte	0x1
 	.byte	0xb7
 	.4byte	0xe557
 	.uleb128 0x80
-	.4byte	.LASF3181
+	.4byte	.LASF3182
 	.byte	0x1
 	.byte	0xb7
 	.4byte	0xc6
@@ -47943,12 +48310,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe874
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3182
+	.4byte	.LASF3183
 	.byte	0x1
 	.byte	0xa5
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x14306
+	.4byte	0x14427
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
@@ -47965,7 +48332,7 @@ __exitcall_ebc_exit:
 	.byte	0xa5
 	.4byte	0x11f
 	.uleb128 0x7a
-	.4byte	.LASF3183
+	.4byte	.LASF3184
 	.byte	0x1
 	.byte	0xa7
 	.4byte	0x110
@@ -47976,12 +48343,12 @@ __exitcall_ebc_exit:
 	.4byte	0x11f
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3184
+	.4byte	.LASF3185
 	.byte	0x1
 	.byte	0x8f
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x14351
+	.4byte	0x14472
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
@@ -47998,7 +48365,7 @@ __exitcall_ebc_exit:
 	.byte	0x8f
 	.4byte	0x11f
 	.uleb128 0x7a
-	.4byte	.LASF3183
+	.4byte	.LASF3184
 	.byte	0x1
 	.byte	0x91
 	.4byte	0x110
@@ -48009,12 +48376,12 @@ __exitcall_ebc_exit:
 	.4byte	0x11f
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3185
+	.4byte	.LASF3186
 	.byte	0x1
 	.byte	0x89
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x14386
+	.4byte	0x144a7
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
@@ -48032,12 +48399,12 @@ __exitcall_ebc_exit:
 	.4byte	0x11f
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3186
+	.4byte	.LASF3187
 	.byte	0x1
 	.byte	0x83
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x143bb
+	.4byte	0x144dc
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
@@ -48055,11 +48422,11 @@ __exitcall_ebc_exit:
 	.4byte	0x11f
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3187
+	.4byte	.LASF3188
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x143e1
+	.4byte	0x14502
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
@@ -48072,65 +48439,65 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3188
+	.4byte	.LASF3189
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x14413
+	.4byte	0x14534
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0xe1b4
 	.uleb128 0x80
-	.4byte	.LASF3189
+	.4byte	.LASF3190
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13f
 	.uleb128 0x80
-	.4byte	.LASF3190
+	.4byte	.LASF3191
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3191
+	.4byte	.LASF3192
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x1445d
+	.4byte	0x1457e
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xe1b4
 	.uleb128 0x80
-	.4byte	.LASF3192
+	.4byte	.LASF3193
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xc6
 	.uleb128 0x80
-	.4byte	.LASF3193
+	.4byte	.LASF3194
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x80
-	.4byte	.LASF3194
+	.4byte	.LASF3195
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x80
-	.4byte	.LASF3195
+	.4byte	.LASF3196
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3196
+	.4byte	.LASF3197
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x14477
+	.4byte	0x14598
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
@@ -48138,12 +48505,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe1b4
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3197
+	.4byte	.LASF3198
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x144a0
+	.4byte	0x145c1
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
@@ -48156,11 +48523,11 @@ __exitcall_ebc_exit:
 	.4byte	0xe1f4
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3198
+	.4byte	.LASF3199
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x144ea
+	.4byte	0x1460b
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
@@ -48188,12 +48555,12 @@ __exitcall_ebc_exit:
 	.4byte	0xb829
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3199
+	.4byte	.LASF3200
 	.byte	0xa
 	.2byte	0x108
 	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x14508
+	.4byte	0x14629
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
@@ -48201,12 +48568,12 @@ __exitcall_ebc_exit:
 	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3200
+	.4byte	.LASF3201
 	.byte	0xc8
 	.byte	0x1d
 	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x14524
+	.4byte	0x14645
 	.uleb128 0x7f
 	.string	"bus"
 	.byte	0xc8
@@ -48214,31 +48581,31 @@ __exitcall_ebc_exit:
 	.4byte	0xae47
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3201
+	.4byte	.LASF3202
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14541
+	.4byte	0x14662
 	.uleb128 0x80
-	.4byte	.LASF3202
+	.4byte	.LASF3203
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3203
+	.4byte	.LASF3204
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x1457e
+	.4byte	0x1469f
 	.uleb128 0x7f
 	.string	"dev"
 	.byte	0xcb
 	.byte	0xa3
 	.4byte	0xa5e0
 	.uleb128 0x80
-	.4byte	.LASF3204
+	.4byte	.LASF3205
 	.byte	0xcb
 	.byte	0xa4
 	.4byte	0x325
@@ -48248,18 +48615,18 @@ __exitcall_ebc_exit:
 	.byte	0xa5
 	.4byte	0x2e3
 	.uleb128 0x80
-	.4byte	.LASF3205
+	.4byte	.LASF3206
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3206
+	.4byte	.LASF3207
 	.byte	0x3
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1459b
+	.4byte	0x146bc
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48267,12 +48634,12 @@ __exitcall_ebc_exit:
 	.4byte	0xdbb4
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3207
+	.4byte	.LASF3208
 	.byte	0x3
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x145c1
+	.4byte	0x146e2
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48285,11 +48652,11 @@ __exitcall_ebc_exit:
 	.4byte	0x46ee
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3208
+	.4byte	.LASF3209
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x145db
+	.4byte	0x146fc
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48297,11 +48664,11 @@ __exitcall_ebc_exit:
 	.4byte	0xdbb4
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3209
+	.4byte	.LASF3210
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x145f5
+	.4byte	0x14716
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48309,11 +48676,11 @@ __exitcall_ebc_exit:
 	.4byte	0xdbb4
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3210
+	.4byte	.LASF3211
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x1460f
+	.4byte	0x14730
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48321,11 +48688,11 @@ __exitcall_ebc_exit:
 	.4byte	0xdbb4
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3211
+	.4byte	.LASF3212
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x14629
+	.4byte	0x1474a
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48333,22 +48700,22 @@ __exitcall_ebc_exit:
 	.4byte	0xdbb4
 	.byte	0
 	.uleb128 0x82
-	.4byte	.LASF3341
+	.4byte	.LASF3342
 	.byte	0xc2
 	.byte	0x36
 	.4byte	0xc6
 	.byte	0x3
 	.uleb128 0x81
-	.4byte	.LASF3212
+	.4byte	.LASF3213
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x14650
+	.4byte	0x14771
 	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x14650
+	.4byte	0x14771
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -48358,24 +48725,24 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x14670
+	.4byte	0x14791
 	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x14650
+	.4byte	0x14771
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3213
+	.4byte	.LASF3214
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x146ac
+	.4byte	0x147cd
 	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x14650
+	.4byte	0x14771
 	.uleb128 0x80
 	.4byte	.LASF193
 	.byte	0x4
@@ -48393,12 +48760,12 @@ __exitcall_ebc_exit:
 	.4byte	0xad7d
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3214
+	.4byte	.LASF3215
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x146dc
+	.4byte	0x147fd
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -48416,12 +48783,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3215
+	.4byte	.LASF3216
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1470c
+	.4byte	0x1482d
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -48439,12 +48806,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3216
+	.4byte	.LASF3217
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1473c
+	.4byte	0x1485d
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -48462,12 +48829,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3217
+	.4byte	.LASF3218
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14777
+	.4byte	0x14898
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -48490,37 +48857,37 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3218
+	.4byte	.LASF3219
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x147ab
+	.4byte	0x148cc
 	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x30bc
 	.uleb128 0x7a
-	.4byte	.LASF3219
+	.4byte	.LASF3220
 	.byte	0x6
 	.byte	0xf7
 	.4byte	0x458
 	.uleb128 0x68
 	.uleb128 0x7a
-	.4byte	.LASF3220
+	.4byte	.LASF3221
 	.byte	0x6
 	.byte	0xfe
 	.4byte	0x15a
 	.byte	0
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3221
+	.4byte	.LASF3222
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x147f7
+	.4byte	0x14918
 	.uleb128 0x80
 	.4byte	.LASF1164
 	.byte	0x6
@@ -48537,25 +48904,25 @@ __exitcall_ebc_exit:
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x7a
-	.4byte	.LASF3222
+	.4byte	.LASF3223
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x68
 	.uleb128 0x7a
-	.4byte	.LASF3220
+	.4byte	.LASF3221
 	.byte	0x6
 	.byte	0x56
 	.4byte	0x15a
 	.byte	0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3223
+	.4byte	.LASF3224
 	.byte	0x11
 	.2byte	0x2e5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14821
+	.4byte	0x14942
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x11
@@ -48568,12 +48935,12 @@ __exitcall_ebc_exit:
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3224
+	.4byte	.LASF3225
 	.byte	0x11
 	.2byte	0x216
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14859
+	.4byte	0x1497a
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x11
@@ -48593,12 +48960,12 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3225
+	.4byte	.LASF3226
 	.byte	0x11
 	.2byte	0x1dd
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x1488f
+	.4byte	0x149b0
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x11
@@ -48610,18 +48977,18 @@ __exitcall_ebc_exit:
 	.2byte	0x1dd
 	.4byte	0x330
 	.uleb128 0x48
-	.4byte	.LASF3226
+	.4byte	.LASF3227
 	.byte	0x11
 	.2byte	0x1df
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3227
+	.4byte	.LASF3228
 	.byte	0x11
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x148ad
+	.4byte	0x149ce
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x11
@@ -48629,12 +48996,12 @@ __exitcall_ebc_exit:
 	.4byte	0x2e3
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3228
+	.4byte	.LASF3229
 	.byte	0x11
 	.2byte	0x13d
 	.4byte	0xd813
 	.byte	0x3
-	.4byte	0x148cb
+	.4byte	0x149ec
 	.uleb128 0x66
 	.4byte	.LASF171
 	.byte	0x11
@@ -48642,11 +49009,11 @@ __exitcall_ebc_exit:
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3229
+	.4byte	.LASF3230
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x148f1
+	.4byte	0x14a12
 	.uleb128 0x80
 	.4byte	.LASF3052
 	.byte	0xbe
@@ -48659,79 +49026,79 @@ __exitcall_ebc_exit:
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3230
+	.4byte	.LASF3231
 	.byte	0xbe
 	.byte	0xd6
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x1490e
+	.4byte	0x14a2f
 	.uleb128 0x80
 	.4byte	.LASF3052
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x1490e
+	.4byte	0x14a2f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xd6e2
 	.uleb128 0x64
-	.4byte	.LASF3231
+	.4byte	.LASF3232
 	.byte	0xa3
 	.2byte	0x164
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14932
+	.4byte	0x14a53
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x14932
+	.4byte	0x14a53
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc133
 	.uleb128 0x64
-	.4byte	.LASF3232
+	.4byte	.LASF3233
 	.byte	0xc
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1496d
+	.4byte	0x14a8e
 	.uleb128 0x65
 	.string	"np"
 	.byte	0xc
 	.2byte	0x498
 	.4byte	0xbd2a
 	.uleb128 0x66
-	.4byte	.LASF3233
+	.4byte	.LASF3234
 	.byte	0xc
 	.2byte	0x499
 	.4byte	0x56
 	.uleb128 0x66
-	.4byte	.LASF3234
+	.4byte	.LASF3235
 	.byte	0xc
 	.2byte	0x49a
 	.4byte	0xac0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3235
+	.4byte	.LASF3236
 	.byte	0xc
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x149b9
+	.4byte	0x14ada
 	.uleb128 0x65
 	.string	"np"
 	.byte	0xc
 	.2byte	0x1ef
 	.4byte	0xbd2a
 	.uleb128 0x66
-	.4byte	.LASF3233
+	.4byte	.LASF3234
 	.byte	0xc
 	.2byte	0x1f0
 	.4byte	0x56
 	.uleb128 0x66
-	.4byte	.LASF3236
+	.4byte	.LASF3237
 	.byte	0xc
 	.2byte	0x1f1
 	.4byte	0xac0
@@ -48747,11 +49114,11 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3237
+	.4byte	.LASF3238
 	.byte	0xc
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x149d3
+	.4byte	0x14af4
 	.uleb128 0x80
 	.4byte	.LASF882
 	.byte	0xc
@@ -48759,11 +49126,11 @@ __exitcall_ebc_exit:
 	.4byte	0xb904
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3238
+	.4byte	.LASF3239
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x149f9
+	.4byte	0x14b1a
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -48776,12 +49143,12 @@ __exitcall_ebc_exit:
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3239
+	.4byte	.LASF3240
 	.byte	0x2
 	.2byte	0x49b
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14a17
+	.4byte	0x14b38
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -48789,12 +49156,12 @@ __exitcall_ebc_exit:
 	.4byte	0xbb9a
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3240
+	.4byte	.LASF3241
 	.byte	0x2
 	.2byte	0x2c5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14a4d
+	.4byte	0x14b6e
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -48812,12 +49179,12 @@ __exitcall_ebc_exit:
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3241
+	.4byte	.LASF3242
 	.byte	0xd
 	.byte	0xca
 	.4byte	0x351
 	.byte	0x3
-	.4byte	0x14a69
+	.4byte	0x14b8a
 	.uleb128 0x7f
 	.string	"res"
 	.byte	0xd
@@ -48825,12 +49192,12 @@ __exitcall_ebc_exit:
 	.4byte	0xc244
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3242
+	.4byte	.LASF3243
 	.byte	0xcc
 	.byte	0x22
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x14a85
+	.4byte	0x14ba6
 	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0xcc
@@ -48838,12 +49205,12 @@ __exitcall_ebc_exit:
 	.4byte	0x30bc
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3243
+	.4byte	.LASF3244
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14aa2
+	.4byte	0x14bc3
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xcd
@@ -48851,12 +49218,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3244
+	.4byte	.LASF3245
 	.byte	0x12
 	.2byte	0x203
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x14acb
+	.4byte	0x14bec
 	.uleb128 0x65
 	.string	"wq"
 	.byte	0x12
@@ -48869,29 +49236,29 @@ __exitcall_ebc_exit:
 	.4byte	0x3205
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3245
+	.4byte	.LASF3246
 	.byte	0x12
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x14af1
+	.4byte	0x14c12
 	.uleb128 0x80
 	.4byte	.LASF2288
 	.byte	0x12
 	.byte	0xdd
 	.4byte	0x3205
 	.uleb128 0x80
-	.4byte	.LASF3246
+	.4byte	.LASF3247
 	.byte	0x12
 	.byte	0xdd
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3247
+	.4byte	.LASF3248
 	.byte	0x51
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14b0d
+	.4byte	0x14c2e
 	.uleb128 0x65
 	.string	"m"
 	.byte	0x51
@@ -48899,12 +49266,12 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3248
+	.4byte	.LASF3249
 	.byte	0x51
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14b29
+	.4byte	0x14c4a
 	.uleb128 0x65
 	.string	"m"
 	.byte	0x51
@@ -48912,24 +49279,24 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3249
+	.4byte	.LASF3250
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x14b68
+	.4byte	0x14c89
 	.uleb128 0x80
 	.4byte	.LASF1164
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x30bc
 	.uleb128 0x80
-	.4byte	.LASF3250
+	.4byte	.LASF3251
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2e3
 	.uleb128 0x80
-	.4byte	.LASF3251
+	.4byte	.LASF3252
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2b0
@@ -48940,11 +49307,11 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3252
+	.4byte	.LASF3253
 	.byte	0xca
 	.byte	0x91
 	.byte	0x3
-	.4byte	0x14b9b
+	.4byte	0x14cbc
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xca
@@ -48957,18 +49324,18 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.uleb128 0x68
 	.uleb128 0x7a
-	.4byte	.LASF3253
+	.4byte	.LASF3254
 	.byte	0xca
 	.byte	0x93
 	.4byte	0xc6
 	.byte	0
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3254
+	.4byte	.LASF3255
 	.byte	0xca
 	.byte	0x80
 	.byte	0x3
-	.4byte	0x14bc9
+	.4byte	0x14cea
 	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0xca
@@ -48980,25 +49347,25 @@ __exitcall_ebc_exit:
 	.byte	0x80
 	.4byte	0x29
 	.uleb128 0x80
-	.4byte	.LASF3255
+	.4byte	.LASF3256
 	.byte	0xca
 	.byte	0x81
 	.4byte	0x2b0
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3256
+	.4byte	.LASF3257
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14bf0
+	.4byte	0x14d11
 	.uleb128 0x7f
 	.string	"ti"
 	.byte	0xca
 	.byte	0x5f
-	.4byte	0x14bf0
+	.4byte	0x14d11
 	.uleb128 0x80
-	.4byte	.LASF3257
+	.4byte	.LASF3258
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
@@ -49007,24 +49374,24 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.4byte	0xc33
 	.uleb128 0x7e
-	.4byte	.LASF3258
+	.4byte	.LASF3259
 	.byte	0x5
 	.byte	0xf
 	.4byte	0x2f05
 	.byte	0x3
-	.4byte	0x14c12
+	.4byte	0x14d33
 	.uleb128 0x7a
-	.4byte	.LASF3259
+	.4byte	.LASF3260
 	.byte	0x5
 	.byte	0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3260
+	.4byte	.LASF3261
 	.byte	0xf
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x14c58
+	.4byte	0x14d79
 	.uleb128 0x80
 	.4byte	.LASF976
 	.byte	0xf
@@ -49035,7 +49402,7 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0xf
 	.byte	0x1c
-	.4byte	0x14c4b
+	.4byte	0x14d6c
 	.uleb128 0x22
 	.4byte	.LASF3130
 	.byte	0xf
@@ -49045,27 +49412,27 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0xf
 	.byte	0x1c
-	.4byte	0x126f2
+	.4byte	0x12726
 	.byte	0
 	.uleb128 0x7d
 	.string	"__u"
 	.byte	0xf
 	.byte	0x1c
-	.4byte	0x14c2c
+	.4byte	0x14d4d
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	.LASF3342
+	.4byte	.LASF3343
 	.byte	0x20
 	.2byte	0x126
 	.byte	0x3
 	.uleb128 0x7e
-	.4byte	.LASF3261
+	.4byte	.LASF3262
 	.byte	0xce
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14c7c
+	.4byte	0x14d9d
 	.uleb128 0x7f
 	.string	"n"
 	.byte	0xce
@@ -49073,12 +49440,12 @@ __exitcall_ebc_exit:
 	.4byte	0x15a
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3262
+	.4byte	.LASF3263
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xe2
 	.byte	0x3
-	.4byte	0x14cb0
+	.4byte	0x14dd1
 	.uleb128 0x80
 	.4byte	.LASF2470
 	.byte	0x8
@@ -49096,12 +49463,12 @@ __exitcall_ebc_exit:
 	.4byte	0x8b
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3263
+	.4byte	.LASF3264
 	.byte	0xcf
 	.byte	0x50
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x14cca
+	.4byte	0x14deb
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xcf
@@ -49109,28 +49476,28 @@ __exitcall_ebc_exit:
 	.4byte	0xbd30
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3264
+	.4byte	.LASF3265
 	.byte	0xd0
 	.byte	0xb8
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x14ce4
+	.4byte	0x14e05
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd0
 	.byte	0xb8
-	.4byte	0x14ce4
+	.4byte	0x14e05
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xdd
 	.uleb128 0x7e
-	.4byte	.LASF3265
+	.4byte	.LASF3266
 	.byte	0xd0
 	.byte	0x39
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x14d06
+	.4byte	0x14e27
 	.uleb128 0x7f
 	.string	"val"
 	.byte	0xd0
@@ -49138,12 +49505,12 @@ __exitcall_ebc_exit:
 	.4byte	0xd2
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3266
+	.4byte	.LASF3267
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14d2d
+	.4byte	0x14e4e
 	.uleb128 0x7f
 	.string	"nr"
 	.byte	0x7
@@ -49153,17 +49520,17 @@ __exitcall_ebc_exit:
 	.4byte	.LASF1164
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x14d2d
+	.4byte	0x14e4e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x3a
 	.uleb128 0x81
-	.4byte	.LASF3267
+	.4byte	.LASF3268
 	.byte	0x10
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x14d67
+	.4byte	0x14e88
 	.uleb128 0x7f
 	.string	"i"
 	.byte	0x10
@@ -49173,7 +49540,7 @@ __exitcall_ebc_exit:
 	.string	"v"
 	.byte	0x10
 	.byte	0x2f
-	.4byte	0x14d67
+	.4byte	0x14e88
 	.uleb128 0x7d
 	.string	"w0"
 	.byte	0x10
@@ -49183,18 +49550,18 @@ __exitcall_ebc_exit:
 	.string	"x1"
 	.byte	0x10
 	.byte	0x2f
-	.4byte	0x14d67
+	.4byte	0x14e88
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x37c
 	.uleb128 0x7e
-	.4byte	.LASF3268
+	.4byte	.LASF3269
 	.byte	0xd1
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14d87
+	.4byte	0x14ea8
 	.uleb128 0x7f
 	.string	"x"
 	.byte	0xd1
@@ -49202,12 +49569,12 @@ __exitcall_ebc_exit:
 	.4byte	0xf4
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3269
+	.4byte	.LASF3270
 	.byte	0xd2
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14da4
+	.4byte	0x14ec5
 	.uleb128 0x80
 	.4byte	.LASF2503
 	.byte	0xd2
@@ -49215,16 +49582,16 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3270
+	.4byte	.LASF3271
 	.byte	0xd3
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x14dc7
+	.4byte	0x14ee8
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd3
 	.byte	0xb
-	.4byte	0x14dc7
+	.4byte	0x14ee8
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xd3
@@ -49233,21 +49600,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x14dcf
+	.4byte	0x14ef0
 	.uleb128 0x84
 	.uleb128 0x3
-	.4byte	0x14dcd
+	.4byte	0x14eee
 	.uleb128 0x81
-	.4byte	.LASF3271
+	.4byte	.LASF3272
 	.byte	0xd3
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x14df7
+	.4byte	0x14f18
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd3
 	.byte	0x9
-	.4byte	0x14dc7
+	.4byte	0x14ee8
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xd3
@@ -49255,16 +49622,16 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3272
+	.4byte	.LASF3273
 	.byte	0xe
 	.2byte	0x11a
 	.byte	0x3
-	.4byte	0x14e27
+	.4byte	0x14f48
 	.uleb128 0x65
 	.string	"p"
 	.byte	0xe
 	.2byte	0x11a
-	.4byte	0x14e27
+	.4byte	0x14f48
 	.uleb128 0x65
 	.string	"res"
 	.byte	0xe
@@ -49278,14 +49645,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x14dcd
+	.4byte	0x14eee
 	.uleb128 0x85
 	.4byte	0x103dd
-	.8byte	.LFB2846
-	.8byte	.LFE2846-.LFB2846
+	.8byte	.LFB2847
+	.8byte	.LFE2847-.LFB2847
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14e5a
+	.4byte	0x14f7b
 	.uleb128 0x70
 	.4byte	0x103ee
 	.4byte	.LLST10
@@ -49295,541 +49662,541 @@ __exitcall_ebc_exit:
 	.byte	0x51
 	.byte	0
 	.uleb128 0x86
-	.4byte	0x128d4
-	.8byte	.LFB2878
-	.8byte	.LFE2878-.LFB2878
+	.4byte	0x12908
+	.8byte	.LFB2879
+	.8byte	.LFE2879-.LFB2879
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14f5d
+	.4byte	0x1507e
 	.uleb128 0x70
-	.4byte	0x128e1
+	.4byte	0x12915
 	.4byte	.LLST188
 	.uleb128 0x55
-	.4byte	0x128ed
+	.4byte	0x12921
 	.uleb128 0x58
-	.4byte	0x128f9
+	.4byte	0x1292d
 	.uleb128 0x5c
-	.4byte	0x144a0
+	.4byte	0x145c1
 	.8byte	.LBB1446
 	.4byte	.Ldebug_ranges0+0xbf0
 	.byte	0x1
-	.2byte	0x585
-	.4byte	0x14edb
+	.2byte	0x5c8
+	.4byte	0x14ffc
 	.uleb128 0x55
-	.4byte	0x144d1
+	.4byte	0x145f2
 	.uleb128 0x55
-	.4byte	0x144c5
+	.4byte	0x145e6
 	.uleb128 0x55
-	.4byte	0x144b9
+	.4byte	0x145da
 	.uleb128 0x55
-	.4byte	0x144ad
+	.4byte	0x145ce
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xbf0
 	.uleb128 0x58
-	.4byte	0x144dd
+	.4byte	0x145fe
 	.uleb128 0x60
-	.4byte	0x144ea
+	.4byte	0x1460b
 	.8byte	.LBB1448
 	.4byte	.Ldebug_ranges0+0xc40
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x55
-	.4byte	0x144fb
+	.4byte	0x1461c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14413
+	.4byte	0x14534
 	.8byte	.LBB1457
 	.4byte	.Ldebug_ranges0+0xc70
 	.byte	0x1
-	.2byte	0x586
-	.4byte	0x14f0d
+	.2byte	0x5c9
+	.4byte	0x1502e
 	.uleb128 0x55
-	.4byte	0x14450
+	.4byte	0x14571
 	.uleb128 0x55
-	.4byte	0x14444
+	.4byte	0x14565
 	.uleb128 0x55
-	.4byte	0x14438
+	.4byte	0x14559
 	.uleb128 0x55
-	.4byte	0x1442c
+	.4byte	0x1454d
 	.uleb128 0x55
-	.4byte	0x14420
+	.4byte	0x14541
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x143e1
+	.4byte	0x14502
 	.8byte	.LBB1463
 	.8byte	.LBE1463-.LBB1463
 	.byte	0x1
-	.2byte	0x587
-	.4byte	0x14f39
+	.2byte	0x5ca
+	.4byte	0x1505a
 	.uleb128 0x55
-	.4byte	0x14406
+	.4byte	0x14527
 	.uleb128 0x55
-	.4byte	0x143fa
+	.4byte	0x1451b
 	.uleb128 0x55
-	.4byte	0x143ee
+	.4byte	0x1450f
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x143bb
+	.4byte	0x144dc
 	.8byte	.LBB1465
 	.8byte	.LBE1465-.LBB1465
 	.byte	0x1
-	.2byte	0x588
+	.2byte	0x5cb
 	.uleb128 0x55
-	.4byte	0x143d4
+	.4byte	0x144f5
 	.uleb128 0x55
-	.4byte	0x143c8
+	.4byte	0x144e9
 	.byte	0
 	.byte	0
 	.uleb128 0x86
-	.4byte	0x14288
-	.8byte	.LFB2880
-	.8byte	.LFE2880-.LFB2880
+	.4byte	0x143a9
+	.8byte	.LFB2881
+	.8byte	.LFE2881-.LFB2881
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1501b
+	.4byte	0x1513c
 	.uleb128 0x70
-	.4byte	0x14298
+	.4byte	0x143b9
 	.4byte	.LLST190
 	.uleb128 0x70
-	.4byte	0x142a3
+	.4byte	0x143c4
 	.4byte	.LLST191
 	.uleb128 0x58
-	.4byte	0x142af
+	.4byte	0x143d0
 	.uleb128 0x71
-	.4byte	0x1445d
+	.4byte	0x1457e
 	.8byte	.LBB1476
 	.8byte	.LBE1476-.LBB1476
 	.byte	0x1
 	.byte	0xc9
-	.4byte	0x14fb1
+	.4byte	0x150d2
 	.uleb128 0x55
-	.4byte	0x1446a
+	.4byte	0x1458b
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x145f5
+	.4byte	0x14716
 	.8byte	.LBB1478
 	.8byte	.LBE1478-.LBB1478
 	.byte	0x1
 	.byte	0xca
-	.4byte	0x14fd2
+	.4byte	0x150f3
 	.uleb128 0x55
-	.4byte	0x14602
+	.4byte	0x14723
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14636
+	.4byte	0x14757
 	.8byte	.LBB1480
 	.8byte	.LBE1480-.LBB1480
 	.byte	0x1
 	.byte	0xcd
-	.4byte	0x15000
+	.4byte	0x15121
 	.uleb128 0x55
-	.4byte	0x14643
+	.4byte	0x14764
 	.uleb128 0x4f
-	.8byte	.LVL581
-	.4byte	0x153d1
+	.8byte	.LVL584
+	.4byte	0x154f2
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL578
-	.4byte	0x15146
+	.8byte	.LVL581
+	.4byte	0x15267
 	.uleb128 0x4f
-	.8byte	.LVL582
-	.4byte	0x15146
+	.8byte	.LVL585
+	.4byte	0x15267
 	.byte	0
 	.uleb128 0x85
-	.4byte	0x12277
-	.8byte	.LFB2882
-	.8byte	.LFE2882-.LFB2882
+	.4byte	0x12284
+	.8byte	.LFB2883
+	.8byte	.LFE2883-.LFB2883
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1507c
+	.4byte	0x1519d
 	.uleb128 0x55
-	.4byte	0x12294
+	.4byte	0x122a1
 	.uleb128 0x55
-	.4byte	0x12288
+	.4byte	0x12295
 	.uleb128 0x55
-	.4byte	0x12288
+	.4byte	0x12295
 	.uleb128 0x58
-	.4byte	0x122a0
+	.4byte	0x122ad
 	.uleb128 0x58
-	.4byte	0x122aa
+	.4byte	0x122b7
 	.uleb128 0x58
-	.4byte	0x122b6
+	.4byte	0x122c3
 	.uleb128 0x61
-	.4byte	0x122c2
+	.4byte	0x122cf
 	.4byte	.LLST193
 	.uleb128 0x62
-	.4byte	0x122ce
+	.4byte	0x122db
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x122da
+	.4byte	0x122e7
 	.4byte	.LLST194
 	.uleb128 0x4f
-	.8byte	.LVL592
-	.4byte	0x15448
+	.8byte	.LVL595
+	.4byte	0x15569
 	.byte	0
 	.uleb128 0x86
-	.4byte	0x14288
-	.8byte	.LFB2886
-	.8byte	.LFE2886-.LFB2886
+	.4byte	0x143a9
+	.8byte	.LFB2887
+	.8byte	.LFE2887-.LFB2887
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1512e
+	.4byte	0x1524f
 	.uleb128 0x70
-	.4byte	0x14298
+	.4byte	0x143b9
 	.4byte	.LLST220
 	.uleb128 0x58
-	.4byte	0x142af
+	.4byte	0x143d0
 	.uleb128 0x55
-	.4byte	0x142a3
+	.4byte	0x143c4
 	.uleb128 0x71
-	.4byte	0x1460f
+	.4byte	0x14730
 	.8byte	.LBB1803
 	.8byte	.LBE1803-.LBB1803
 	.byte	0x1
 	.byte	0xc2
-	.4byte	0x150cc
+	.4byte	0x151ed
 	.uleb128 0x55
-	.4byte	0x1461c
+	.4byte	0x1473d
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14477
+	.4byte	0x14598
 	.8byte	.LBB1805
 	.8byte	.LBE1805-.LBB1805
 	.byte	0x1
 	.byte	0xc3
-	.4byte	0x150f2
+	.4byte	0x15213
 	.uleb128 0x55
-	.4byte	0x14493
+	.4byte	0x145b4
 	.uleb128 0x55
-	.4byte	0x14487
+	.4byte	0x145a8
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14656
+	.4byte	0x14777
 	.8byte	.LBB1807
 	.8byte	.LBE1807-.LBB1807
 	.byte	0x1
 	.byte	0xbf
-	.4byte	0x15120
+	.4byte	0x15241
 	.uleb128 0x55
-	.4byte	0x14663
+	.4byte	0x14784
 	.uleb128 0x4f
-	.8byte	.LVL784
-	.4byte	0x15454
+	.8byte	.LVL787
+	.4byte	0x15575
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL781
-	.4byte	0x15146
+	.8byte	.LVL784
+	.4byte	0x15267
 	.byte	0
 	.uleb128 0x87
-	.4byte	.LASF3273
-	.4byte	.LASF3273
+	.4byte	.LASF3274
+	.4byte	.LASF3274
 	.byte	0xbe
 	.byte	0xcc
 	.uleb128 0x87
-	.4byte	.LASF3274
-	.4byte	.LASF3274
+	.4byte	.LASF3275
+	.4byte	.LASF3275
 	.byte	0xbe
 	.byte	0xca
 	.uleb128 0x88
-	.4byte	.LASF3275
-	.4byte	.LASF3275
+	.4byte	.LASF3276
+	.4byte	.LASF3276
 	.byte	0x2
 	.2byte	0x5d1
 	.uleb128 0x87
-	.4byte	.LASF3276
-	.4byte	.LASF3276
+	.4byte	.LASF3277
+	.4byte	.LASF3277
 	.byte	0xac
 	.byte	0x4f
 	.uleb128 0x88
-	.4byte	.LASF3277
-	.4byte	.LASF3277
+	.4byte	.LASF3278
+	.4byte	.LASF3278
 	.byte	0x2
 	.2byte	0x2bf
 	.uleb128 0x88
-	.4byte	.LASF3278
-	.4byte	.LASF3278
+	.4byte	.LASF3279
+	.4byte	.LASF3279
 	.byte	0xc
 	.2byte	0x149
 	.uleb128 0x88
-	.4byte	.LASF3279
-	.4byte	.LASF3279
+	.4byte	.LASF3280
+	.4byte	.LASF3280
 	.byte	0xc
 	.2byte	0x172
 	.uleb128 0x87
-	.4byte	.LASF3280
-	.4byte	.LASF3280
+	.4byte	.LASF3281
+	.4byte	.LASF3281
 	.byte	0xd4
 	.byte	0x78
 	.uleb128 0x87
-	.4byte	.LASF3281
-	.4byte	.LASF3281
+	.4byte	.LASF3282
+	.4byte	.LASF3282
 	.byte	0xaa
 	.byte	0x59
 	.uleb128 0x87
-	.4byte	.LASF3282
-	.4byte	.LASF3282
+	.4byte	.LASF3283
+	.4byte	.LASF3283
 	.byte	0xc3
 	.byte	0x31
 	.uleb128 0x89
-	.4byte	.LASF3283
-	.4byte	.LASF3283
+	.4byte	.LASF3284
+	.4byte	.LASF3284
 	.uleb128 0x87
-	.4byte	.LASF3283
-	.4byte	.LASF3283
+	.4byte	.LASF3284
+	.4byte	.LASF3284
 	.byte	0xd5
 	.byte	0x36
 	.uleb128 0x88
-	.4byte	.LASF3284
-	.4byte	.LASF3284
-	.byte	0x2
-	.2byte	0x5cb
-	.uleb128 0x87
 	.4byte	.LASF3285
 	.4byte	.LASF3285
-	.byte	0xc2
-	.byte	0x30
+	.byte	0x2
+	.2byte	0x5cb
 	.uleb128 0x87
 	.4byte	.LASF3286
 	.4byte	.LASF3286
 	.byte	0xc2
-	.byte	0x31
+	.byte	0x30
 	.uleb128 0x87
 	.4byte	.LASF3287
 	.4byte	.LASF3287
+	.byte	0xc2
+	.byte	0x31
+	.uleb128 0x87
+	.4byte	.LASF3288
+	.4byte	.LASF3288
 	.byte	0xab
 	.byte	0x9
 	.uleb128 0x88
-	.4byte	.LASF3288
-	.4byte	.LASF3288
+	.4byte	.LASF3289
+	.4byte	.LASF3289
 	.byte	0x48
 	.2byte	0x6b8
 	.uleb128 0x88
-	.4byte	.LASF3289
-	.4byte	.LASF3289
+	.4byte	.LASF3290
+	.4byte	.LASF3290
 	.byte	0x12
 	.2byte	0x190
 	.uleb128 0x88
-	.4byte	.LASF3290
-	.4byte	.LASF3290
-	.byte	0x48
-	.2byte	0x676
-	.uleb128 0x87
 	.4byte	.LASF3291
 	.4byte	.LASF3291
-	.byte	0x9c
-	.byte	0x67
+	.byte	0x48
+	.2byte	0x676
 	.uleb128 0x87
 	.4byte	.LASF3292
 	.4byte	.LASF3292
-	.byte	0x54
-	.byte	0x53
+	.byte	0x9c
+	.byte	0x67
 	.uleb128 0x87
 	.4byte	.LASF3293
 	.4byte	.LASF3293
 	.byte	0x54
-	.byte	0xa5
+	.byte	0x53
 	.uleb128 0x87
 	.4byte	.LASF3294
 	.4byte	.LASF3294
-	.byte	0xc3
-	.byte	0x2c
+	.byte	0x54
+	.byte	0xa5
 	.uleb128 0x87
 	.4byte	.LASF3295
 	.4byte	.LASF3295
 	.byte	0xc3
-	.byte	0x28
-	.uleb128 0x88
+	.byte	0x2c
+	.uleb128 0x87
 	.4byte	.LASF3296
 	.4byte	.LASF3296
+	.byte	0xc3
+	.byte	0x28
+	.uleb128 0x88
+	.4byte	.LASF3297
+	.4byte	.LASF3297
 	.byte	0x11
 	.2byte	0x184
 	.uleb128 0x87
-	.4byte	.LASF3297
-	.4byte	.LASF3297
+	.4byte	.LASF3298
+	.4byte	.LASF3298
 	.byte	0xd6
 	.byte	0x51
 	.uleb128 0x88
-	.4byte	.LASF3298
-	.4byte	.LASF3298
+	.4byte	.LASF3299
+	.4byte	.LASF3299
 	.byte	0x20
 	.2byte	0x1d9
 	.uleb128 0x87
-	.4byte	.LASF3299
-	.4byte	.LASF3299
+	.4byte	.LASF3300
+	.4byte	.LASF3300
 	.byte	0x3
 	.byte	0x3b
 	.uleb128 0x87
-	.4byte	.LASF3300
-	.4byte	.LASF3300
+	.4byte	.LASF3301
+	.4byte	.LASF3301
 	.byte	0x11
 	.byte	0xb9
 	.uleb128 0x87
-	.4byte	.LASF3301
-	.4byte	.LASF3301
+	.4byte	.LASF3302
+	.4byte	.LASF3302
 	.byte	0x3a
 	.byte	0xc2
 	.uleb128 0x89
-	.4byte	.LASF3302
-	.4byte	.LASF3302
-	.uleb128 0x87
 	.4byte	.LASF3303
 	.4byte	.LASF3303
+	.uleb128 0x87
+	.4byte	.LASF3304
+	.4byte	.LASF3304
 	.byte	0xac
 	.byte	0x4e
 	.uleb128 0x88
-	.4byte	.LASF3304
-	.4byte	.LASF3304
+	.4byte	.LASF3305
+	.4byte	.LASF3305
 	.byte	0x2
 	.2byte	0x287
 	.uleb128 0x87
-	.4byte	.LASF3305
-	.4byte	.LASF3305
+	.4byte	.LASF3306
+	.4byte	.LASF3306
 	.byte	0xbf
 	.byte	0x38
 	.uleb128 0x88
-	.4byte	.LASF3306
-	.4byte	.LASF3306
+	.4byte	.LASF3307
+	.4byte	.LASF3307
 	.byte	0xc
 	.2byte	0x165
 	.uleb128 0x88
-	.4byte	.LASF3307
-	.4byte	.LASF3307
+	.4byte	.LASF3308
+	.4byte	.LASF3308
 	.byte	0xa3
 	.2byte	0x37b
 	.uleb128 0x88
-	.4byte	.LASF3308
-	.4byte	.LASF3308
+	.4byte	.LASF3309
+	.4byte	.LASF3309
 	.byte	0xc
 	.2byte	0x125
 	.uleb128 0x89
-	.4byte	.LASF3309
-	.4byte	.LASF3309
-	.uleb128 0x87
 	.4byte	.LASF3310
 	.4byte	.LASF3310
+	.uleb128 0x87
+	.4byte	.LASF3311
+	.4byte	.LASF3311
 	.byte	0xc3
 	.byte	0x2f
 	.uleb128 0x88
-	.4byte	.LASF3311
-	.4byte	.LASF3311
+	.4byte	.LASF3312
+	.4byte	.LASF3312
 	.byte	0x20
 	.2byte	0x1c7
 	.uleb128 0x88
-	.4byte	.LASF3312
-	.4byte	.LASF3312
+	.4byte	.LASF3313
+	.4byte	.LASF3313
 	.byte	0x20
 	.2byte	0x17e
 	.uleb128 0x87
-	.4byte	.LASF3313
-	.4byte	.LASF3313
+	.4byte	.LASF3314
+	.4byte	.LASF3314
 	.byte	0x3
 	.byte	0x3a
 	.uleb128 0x87
-	.4byte	.LASF3314
-	.4byte	.LASF3314
+	.4byte	.LASF3315
+	.4byte	.LASF3315
 	.byte	0xc2
 	.byte	0x32
 	.uleb128 0x88
-	.4byte	.LASF3315
-	.4byte	.LASF3315
+	.4byte	.LASF3316
+	.4byte	.LASF3316
 	.byte	0x76
 	.2byte	0xa0a
 	.uleb128 0x87
-	.4byte	.LASF3316
-	.4byte	.LASF3316
+	.4byte	.LASF3317
+	.4byte	.LASF3317
 	.byte	0xc3
 	.byte	0x2d
 	.uleb128 0x87
-	.4byte	.LASF3317
-	.4byte	.LASF3317
+	.4byte	.LASF3318
+	.4byte	.LASF3318
 	.byte	0x48
 	.byte	0xdc
 	.uleb128 0x88
-	.4byte	.LASF3318
-	.4byte	.LASF3318
-	.byte	0x3a
-	.2byte	0x459
-	.uleb128 0x87
 	.4byte	.LASF3319
 	.4byte	.LASF3319
 	.byte	0x3a
-	.byte	0xe9
-	.uleb128 0x88
+	.2byte	0x459
+	.uleb128 0x87
 	.4byte	.LASF3320
 	.4byte	.LASF3320
 	.byte	0x3a
-	.2byte	0x45a
+	.byte	0xe9
 	.uleb128 0x88
 	.4byte	.LASF3321
 	.4byte	.LASF3321
-	.byte	0x6
-	.2byte	0x19f
+	.byte	0x3a
+	.2byte	0x45a
 	.uleb128 0x88
 	.4byte	.LASF3322
 	.4byte	.LASF3322
 	.byte	0x6
-	.2byte	0x199
-	.uleb128 0x87
+	.2byte	0x19f
+	.uleb128 0x88
 	.4byte	.LASF3323
 	.4byte	.LASF3323
-	.byte	0xc3
-	.byte	0x26
+	.byte	0x6
+	.2byte	0x199
 	.uleb128 0x87
 	.4byte	.LASF3324
 	.4byte	.LASF3324
 	.byte	0xc3
-	.byte	0x2b
+	.byte	0x26
 	.uleb128 0x87
 	.4byte	.LASF3325
 	.4byte	.LASF3325
 	.byte	0xc3
-	.byte	0x25
+	.byte	0x2b
 	.uleb128 0x87
 	.4byte	.LASF3326
 	.4byte	.LASF3326
 	.byte	0xc3
-	.byte	0x24
+	.byte	0x25
 	.uleb128 0x87
 	.4byte	.LASF3327
 	.4byte	.LASF3327
-	.byte	0x9c
-	.byte	0x73
+	.byte	0xc3
+	.byte	0x24
 	.uleb128 0x87
 	.4byte	.LASF3328
 	.4byte	.LASF3328
-	.byte	0xc3
-	.byte	0x2a
+	.byte	0x9c
+	.byte	0x73
 	.uleb128 0x87
 	.4byte	.LASF3329
 	.4byte	.LASF3329
 	.byte	0xc3
-	.byte	0x27
+	.byte	0x2a
 	.uleb128 0x87
 	.4byte	.LASF3330
 	.4byte	.LASF3330
-	.byte	0x72
-	.byte	0x88
+	.byte	0xc3
+	.byte	0x27
 	.uleb128 0x87
 	.4byte	.LASF3331
 	.4byte	.LASF3331
 	.byte	0x72
-	.byte	0x98
+	.byte	0x88
 	.uleb128 0x87
 	.4byte	.LASF3332
 	.4byte	.LASF3332
-	.byte	0xc4
-	.byte	0x6e
+	.byte	0x72
+	.byte	0x98
 	.uleb128 0x87
 	.4byte	.LASF3333
 	.4byte	.LASF3333
+	.byte	0xc4
+	.byte	0x6e
+	.uleb128 0x87
+	.4byte	.LASF3334
+	.4byte	.LASF3334
 	.byte	0xc2
 	.byte	0x33
 	.uleb128 0x88
-	.4byte	.LASF3334
-	.4byte	.LASF3334
+	.4byte	.LASF3335
+	.4byte	.LASF3335
 	.byte	0x12
 	.2byte	0x1d6
 	.uleb128 0x8a
@@ -49838,18 +50205,18 @@ __exitcall_ebc_exit:
 	.byte	0x78
 	.byte	0x2c
 	.uleb128 0x87
-	.4byte	.LASF3335
-	.4byte	.LASF3335
+	.4byte	.LASF3336
+	.4byte	.LASF3336
 	.byte	0x78
 	.byte	0x27
 	.uleb128 0x87
-	.4byte	.LASF3336
-	.4byte	.LASF3336
+	.4byte	.LASF3337
+	.4byte	.LASF3337
 	.byte	0x1e
 	.byte	0xb0
 	.uleb128 0x87
-	.4byte	.LASF3337
-	.4byte	.LASF3337
+	.4byte	.LASF3338
+	.4byte	.LASF3338
 	.byte	0x9c
 	.byte	0x71
 	.byte	0
@@ -51710,8 +52077,8 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	0
 .LLST192:
-	.8byte	.LVL584
-	.8byte	.LVL585
+	.8byte	.LVL587
+	.8byte	.LVL588
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -51724,625 +52091,621 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	0
 .LLST195:
-	.8byte	.LVL593
-	.8byte	.LVL594
+	.8byte	.LVL596
+	.8byte	.LVL597
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST196:
-	.8byte	.LVL597
-	.8byte	.LVL598
+	.8byte	.LVL600
+	.8byte	.LVL601
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL609
-	.8byte	.LVL610
+	.8byte	.LVL612
+	.8byte	.LVL613
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL741
-	.8byte	.LVL742
+	.8byte	.LVL744
+	.8byte	.LVL745
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST197:
-	.8byte	.LVL605
-	.8byte	.LVL606
+	.8byte	.LVL608
+	.8byte	.LVL609
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL654
-	.8byte	.LVL655
+	.8byte	.LVL657
+	.8byte	.LVL658
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST198:
-	.8byte	.LVL609
-	.8byte	.LVL611
+	.8byte	.LVL612
+	.8byte	.LVL614
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL618
-	.8byte	.LVL654
+	.8byte	.LVL621
+	.8byte	.LVL657
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL659
-	.8byte	.LVL741
+	.8byte	.LVL662
+	.8byte	.LVL744
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL742
-	.8byte	.LVL747
+	.8byte	.LVL745
+	.8byte	.LVL750
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL750
-	.8byte	.LVL761
+	.8byte	.LVL753
+	.8byte	.LVL764
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL763
-	.8byte	.LFE2861
+	.8byte	.LVL766
+	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
 .LLST199:
-	.8byte	.LVL600
-	.8byte	.LVL612
+	.8byte	.LVL603
+	.8byte	.LVL615
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL616
 	.8byte	.LVL619
+	.8byte	.LVL622
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL654
-	.8byte	.LVL659
+	.8byte	.LVL657
+	.8byte	.LVL662
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL748
-	.8byte	.LVL750
+	.8byte	.LVL751
+	.8byte	.LVL753
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL775
-	.8byte	.LFE2861
+	.8byte	.LVL778
+	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
 .LLST200:
-	.8byte	.LVL600
-	.8byte	.LVL601
+	.8byte	.LVL603
+	.8byte	.LVL604
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL601
-	.8byte	.LVL602
+	.8byte	.LVL604
+	.8byte	.LVL605
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL603
-	.8byte	.LVL607
+	.8byte	.LVL606
+	.8byte	.LVL610
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL607
-	.8byte	.LVL657
+	.8byte	.LVL610
+	.8byte	.LVL660
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL657
-	.8byte	.LVL741
+	.8byte	.LVL660
+	.8byte	.LVL744
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL742
-	.8byte	.LVL747
+	.8byte	.LVL745
+	.8byte	.LVL750
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL748
-	.8byte	.LVL761
+	.8byte	.LVL751
+	.8byte	.LVL764
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL763
-	.8byte	.LFE2861
+	.8byte	.LVL766
+	.8byte	.LFE2862
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
 	.8byte	0
 	.8byte	0
 .LLST201:
-	.8byte	.LVL604
-	.8byte	.LVL611
+	.8byte	.LVL607
+	.8byte	.LVL614
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL616
-	.8byte	.LVL618
+	.8byte	.LVL619
+	.8byte	.LVL621
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL654
-	.8byte	.LVL659
+	.8byte	.LVL657
+	.8byte	.LVL662
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL775
-	.8byte	.LFE2861
+	.8byte	.LVL778
+	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
 .LLST202:
-	.8byte	.LVL609
-	.8byte	.LVL614
+	.8byte	.LVL612
+	.8byte	.LVL617
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL640
-	.8byte	.LVL648
+	.8byte	.LVL643
+	.8byte	.LVL651
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL659
 	.8byte	.LVL662
+	.8byte	.LVL665
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL754
-	.8byte	.LVL755
+	.8byte	.LVL757
+	.8byte	.LVL758
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL763
-	.8byte	.LVL764
+	.8byte	.LVL766
+	.8byte	.LVL767
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL775
-	.8byte	.LFE2861
+	.8byte	.LVL778
+	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST203:
-	.8byte	.LVL609
-	.8byte	.LVL614
+.LLST203:
+	.8byte	.LVL612
+	.8byte	.LVL617
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL648
-	.8byte	.LVL652
+	.8byte	.LVL651
+	.8byte	.LVL655
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL662
-	.8byte	.LVL663
+	.8byte	.LVL665
+	.8byte	.LVL666
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL764
-	.8byte	.LVL765
+	.8byte	.LVL767
+	.8byte	.LVL768
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL775
-	.8byte	.LFE2861
+	.8byte	.LVL778
+	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
 .LLST204:
-	.8byte	.LVL663
-	.8byte	.LVL664-1
+	.8byte	.LVL666
+	.8byte	.LVL667-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST205:
-	.8byte	.LVL669
 	.8byte	.LVL672
+	.8byte	.LVL675
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST206:
-	.8byte	.LVL670
-	.8byte	.LVL671
+	.8byte	.LVL673
+	.8byte	.LVL674
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST207:
-	.8byte	.LVL609
-	.8byte	.LVL613
+	.8byte	.LVL612
+	.8byte	.LVL616
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL674
-	.8byte	.LVL682
+	.8byte	.LVL677
+	.8byte	.LVL685
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL756
-	.8byte	.LVL758
+	.8byte	.LVL759
+	.8byte	.LVL761
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL758
-	.8byte	.LVL759
+	.8byte	.LVL761
+	.8byte	.LVL762
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL759
-	.8byte	.LVL761
+	.8byte	.LVL762
+	.8byte	.LVL764
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL775
-	.8byte	.LFE2861
+	.8byte	.LVL778
+	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
 .LLST208:
-	.8byte	.LVL677
 	.8byte	.LVL680
+	.8byte	.LVL683
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST209:
-	.8byte	.LVL678
-	.8byte	.LVL679
+	.8byte	.LVL681
+	.8byte	.LVL682
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST210:
-	.8byte	.LVL681
-	.8byte	.LVL683-1
+	.8byte	.LVL684
+	.8byte	.LVL686-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST211:
-	.8byte	.LVL609
-	.8byte	.LVL616
+	.8byte	.LVL612
+	.8byte	.LVL619
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL688
-	.8byte	.LVL726
+	.8byte	.LVL691
+	.8byte	.LVL729
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL726
-	.8byte	.LVL727
+	.8byte	.LVL729
+	.8byte	.LVL730
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL730
-	.8byte	.LVL741
+	.8byte	.LVL733
+	.8byte	.LVL744
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL742
-	.8byte	.LVL747
+	.8byte	.LVL745
+	.8byte	.LVL750
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL769
-	.8byte	.LFE2861
+	.8byte	.LVL772
+	.8byte	.LFE2862
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
 	.8byte	0
 	.8byte	0
 .LLST212:
-	.8byte	.LVL609
-	.8byte	.LVL616
+	.8byte	.LVL612
+	.8byte	.LVL619
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL688
-	.8byte	.LVL738
+	.8byte	.LVL691
+	.8byte	.LVL741
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL738
-	.8byte	.LVL739
+	.8byte	.LVL741
+	.8byte	.LVL742
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL742
-	.8byte	.LVL747
+	.8byte	.LVL745
+	.8byte	.LVL750
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL767
-	.8byte	.LFE2861
+	.8byte	.LVL770
+	.8byte	.LFE2862
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
 	.8byte	0
 	.8byte	0
 .LLST213:
-	.8byte	.LVL609
-	.8byte	.LVL613
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL694
-	.8byte	.LVL705
+	.8byte	.LVL612
+	.8byte	.LVL616
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL709
-	.8byte	.LVL720
+	.8byte	.LVL697
+	.8byte	.LVL708
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL730
-	.8byte	.LVL732
+	.8byte	.LVL712
+	.8byte	.LVL723
 	.2byte	0x1
 	.byte	0x68
+	.8byte	.LVL733
 	.8byte	.LVL735
-	.8byte	.LVL741
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL768
-	.8byte	.LVL769
+	.8byte	.LVL738
+	.8byte	.LVL744
 	.2byte	0x1
 	.byte	0x68
+	.8byte	.LVL771
 	.8byte	.LVL772
-	.8byte	.LFE2861
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL775
+	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
 .LLST214:
-	.8byte	.LVL609
-	.8byte	.LVL615
+	.8byte	.LVL612
+	.8byte	.LVL618
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL699
-	.8byte	.LVL722
+	.8byte	.LVL702
+	.8byte	.LVL725
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL729
-	.8byte	.LVL741
+	.8byte	.LVL732
+	.8byte	.LVL744
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL742
-	.8byte	.LVL747
+	.8byte	.LVL745
+	.8byte	.LVL750
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL772
-	.8byte	.LFE2861
+	.8byte	.LVL775
+	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
 .LLST215:
-	.8byte	.LVL609
-	.8byte	.LVL614
+	.8byte	.LVL612
+	.8byte	.LVL617
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL690
-	.8byte	.LVL696
+	.8byte	.LVL693
+	.8byte	.LVL699
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL697
 	.8byte	.LVL700
+	.8byte	.LVL703
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL709
-	.8byte	.LVL720
+	.8byte	.LVL712
+	.8byte	.LVL723
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL722
-	.8byte	.LVL730
+	.8byte	.LVL725
+	.8byte	.LVL733
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL767
-	.8byte	.LVL772
+	.8byte	.LVL770
+	.8byte	.LVL775
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL775
-	.8byte	.LFE2861
+	.8byte	.LVL778
+	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
 .LLST216:
-	.8byte	.LVL609
-	.8byte	.LVL615
+	.8byte	.LVL612
+	.8byte	.LVL618
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL692
-	.8byte	.LVL699
+	.8byte	.LVL695
+	.8byte	.LVL702
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL701
-	.8byte	.LVL729
+	.8byte	.LVL704
+	.8byte	.LVL732
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL742
-	.8byte	.LVL747
+	.8byte	.LVL745
+	.8byte	.LVL750
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL767
-	.8byte	.LVL772
+	.8byte	.LVL770
+	.8byte	.LVL775
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL775
-	.8byte	.LFE2861
+	.8byte	.LVL778
+	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
 .LLST217:
-	.8byte	.LVL609
-	.8byte	.LVL615
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL695
-	.8byte	.LVL722
+	.8byte	.LVL612
+	.8byte	.LVL618
 	.2byte	0x1
 	.byte	0x6b
+	.8byte	.LVL698
 	.8byte	.LVL725
-	.8byte	.LVL741
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL742
-	.8byte	.LVL747
+	.8byte	.LVL728
+	.8byte	.LVL744
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL767
-	.8byte	.LVL769
+	.8byte	.LVL745
+	.8byte	.LVL750
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL769
 	.8byte	.LVL770
+	.8byte	.LVL772
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL772
+	.8byte	.LVL773
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL770
-	.8byte	.LFE2861
+	.8byte	.LVL773
+	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x6b
 	.8byte	0
 	.8byte	0
 .LLST218:
-	.8byte	.LVL609
-	.8byte	.LVL614
+	.8byte	.LVL612
+	.8byte	.LVL617
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL696
-	.8byte	.LVL722
+	.8byte	.LVL699
+	.8byte	.LVL725
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL730
-	.8byte	.LVL741
+	.8byte	.LVL733
+	.8byte	.LVL744
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL742
-	.8byte	.LVL747
+	.8byte	.LVL745
+	.8byte	.LVL750
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL772
-	.8byte	.LVL773
+	.8byte	.LVL775
+	.8byte	.LVL776
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL773
-	.8byte	.LFE2861
+	.8byte	.LVL776
+	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
 .LLST219:
-	.8byte	.LVL609
-	.8byte	.LVL613
+	.8byte	.LVL612
+	.8byte	.LVL616
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL705
-	.8byte	.LVL722
+	.8byte	.LVL708
+	.8byte	.LVL725
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL742
-	.8byte	.LVL744
+	.8byte	.LVL745
+	.8byte	.LVL747
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL775
-	.8byte	.LFE2861
+	.8byte	.LVL778
+	.8byte	.LFE2862
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
 .LLST78:
-	.8byte	.LVL304
-	.8byte	.LVL305
+	.8byte	.LVL307
+	.8byte	.LVL308
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST79:
-	.8byte	.LVL304
-	.8byte	.LVL306-1
+	.8byte	.LVL307
+	.8byte	.LVL309-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST80:
-	.8byte	.LVL304
-	.8byte	.LVL306-1
+	.8byte	.LVL307
+	.8byte	.LVL309-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST81:
-	.8byte	.LVL307
-	.8byte	.LVL308
+	.8byte	.LVL310
+	.8byte	.LVL311
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST82:
-	.8byte	.LVL307
-	.8byte	.LVL309
+	.8byte	.LVL310
+	.8byte	.LVL312
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST83:
-	.8byte	.LVL307
 	.8byte	.LVL310
+	.8byte	.LVL313
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL310
-	.8byte	.LVL311-1
+	.8byte	.LVL313
+	.8byte	.LVL314-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST84:
-	.8byte	.LVL312
-	.8byte	.LVL313
+	.8byte	.LVL315
+	.8byte	.LVL316
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST85:
-	.8byte	.LVL312
-	.8byte	.LVL314
+	.8byte	.LVL315
+	.8byte	.LVL317
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST86:
-	.8byte	.LVL312
 	.8byte	.LVL315
+	.8byte	.LVL318
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL315
-	.8byte	.LVL316-1
+	.8byte	.LVL318
+	.8byte	.LVL319-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST96:
-	.8byte	.LVL337
-	.8byte	.LVL338
+	.8byte	.LVL340
+	.8byte	.LVL341
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST97:
-	.8byte	.LVL337
-	.8byte	.LVL339
+	.8byte	.LVL340
+	.8byte	.LVL342
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST98:
-	.8byte	.LVL337
-	.8byte	.LVL341
+	.8byte	.LVL340
+	.8byte	.LVL344
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL341
-	.8byte	.LVL346
+	.8byte	.LVL344
+	.8byte	.LVL349
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL347
-	.8byte	.LFE2851
+	.8byte	.LVL350
+	.8byte	.LFE2852
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
 .LLST99:
-	.8byte	.LVL337
-	.8byte	.LVL342-1
+	.8byte	.LVL340
+	.8byte	.LVL345-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL342-1
-	.8byte	.LVL345
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL347
+	.8byte	.LVL345-1
 	.8byte	.LVL348
 	.2byte	0x1
 	.byte	0x64
@@ -52350,132 +52713,136 @@ __exitcall_ebc_exit:
 	.8byte	.LVL351
 	.2byte	0x1
 	.byte	0x64
+	.8byte	.LVL353
+	.8byte	.LVL354
+	.2byte	0x1
+	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST100:
-	.8byte	.LVL340
-	.8byte	.LVL346
+	.8byte	.LVL343
+	.8byte	.LVL349
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL347
-	.8byte	.LFE2851
+	.8byte	.LVL350
+	.8byte	.LFE2852
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
 .LLST101:
-	.8byte	.LVL343
-	.8byte	.LVL347
+	.8byte	.LVL346
+	.8byte	.LVL350
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
-	.8byte	.LVL350
-	.8byte	.LFE2851
+	.8byte	.LVL353
+	.8byte	.LFE2852
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
 	.8byte	0
 	.8byte	0
 .LLST87:
-	.8byte	.LVL317
-	.8byte	.LVL318
+	.8byte	.LVL320
+	.8byte	.LVL321
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST88:
-	.8byte	.LVL317
-	.8byte	.LVL319
+	.8byte	.LVL320
+	.8byte	.LVL322
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST89:
-	.8byte	.LVL317
-	.8byte	.LVL320-1
+	.8byte	.LVL320
+	.8byte	.LVL323-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL320-1
-	.8byte	.LVL322
+	.8byte	.LVL323-1
+	.8byte	.LVL325
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
 .LLST90:
-	.8byte	.LVL323
-	.8byte	.LVL324
+	.8byte	.LVL326
+	.8byte	.LVL327
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST91:
-	.8byte	.LVL323
-	.8byte	.LVL325
+	.8byte	.LVL326
+	.8byte	.LVL328
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST92:
-	.8byte	.LVL323
 	.8byte	.LVL326
+	.8byte	.LVL329
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL326
 	.8byte	.LVL329
+	.8byte	.LVL332
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL330
-	.8byte	.LFE2849
+	.8byte	.LVL333
+	.8byte	.LFE2850
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST93:
-	.8byte	.LVL332
-	.8byte	.LVL333
+	.8byte	.LVL335
+	.8byte	.LVL336
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST94:
-	.8byte	.LVL332
-	.8byte	.LVL334
+	.8byte	.LVL335
+	.8byte	.LVL337
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST95:
-	.8byte	.LVL332
 	.8byte	.LVL335
+	.8byte	.LVL338
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL335
-	.8byte	.LVL336-1
+	.8byte	.LVL338
+	.8byte	.LVL339-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST102:
-	.8byte	.LVL354
-	.8byte	.LVL355-1
+	.8byte	.LVL357
+	.8byte	.LVL358-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST103:
-	.8byte	.LVL354
-	.8byte	.LVL355-1
+	.8byte	.LVL357
+	.8byte	.LVL358-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST104:
-	.8byte	.LVL354
-	.8byte	.LVL355-1
+	.8byte	.LVL357
+	.8byte	.LVL358-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL355-1
-	.8byte	.LVL357
+	.8byte	.LVL358-1
+	.8byte	.LVL360
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -52596,7 +52963,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL256
-	.8byte	.LFE2842
+	.8byte	.LFE2843
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
@@ -52934,7 +53301,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL263
-	.8byte	.LFE2842
+	.8byte	.LFE2843
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -52968,7 +53335,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x53
 	.8byte	.LVL264
-	.8byte	.LFE2842
+	.8byte	.LFE2843
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
@@ -53218,514 +53585,514 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST235:
-	.8byte	.LVL850
-	.8byte	.LVL851
+.LLST239:
+	.8byte	.LVL874
+	.8byte	.LVL875
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST236:
-	.8byte	.LVL852
-	.8byte	.LVL864
+.LLST240:
+	.8byte	.LVL876
+	.8byte	.LVL888
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL867
-	.8byte	.LFE2837
+	.8byte	.LVL891
+	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST237:
-	.8byte	.LVL853
-	.8byte	.LVL865
+.LLST241:
+	.8byte	.LVL877
+	.8byte	.LVL889
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL867
-	.8byte	.LFE2837
+	.8byte	.LVL891
+	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST238:
-	.8byte	.LVL878
-	.8byte	.LVL882-1
+.LLST242:
+	.8byte	.LVL902
+	.8byte	.LVL906-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL910
-	.8byte	.LVL911
+	.8byte	.LVL934
+	.8byte	.LVL935
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL927
-	.8byte	.LVL929-1
+	.8byte	.LVL951
+	.8byte	.LVL953-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL972
-	.8byte	.LVL976-1
+	.8byte	.LVL996
+	.8byte	.LVL1000-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST239:
-	.8byte	.LVL880
-	.8byte	.LVL881
+.LLST243:
+	.8byte	.LVL904
+	.8byte	.LVL905
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL928
-	.8byte	.LVL929-1
+	.8byte	.LVL952
+	.8byte	.LVL953-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST240:
-	.8byte	.LVL853
-	.8byte	.LVL866
+.LLST244:
+	.8byte	.LVL877
+	.8byte	.LVL890
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL867
-	.8byte	.LVL895
+	.8byte	.LVL891
+	.8byte	.LVL919
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL899
-	.8byte	.LVL902
+	.8byte	.LVL923
+	.8byte	.LVL926
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL906
-	.8byte	.LVL955
+	.8byte	.LVL930
+	.8byte	.LVL979
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL960
-	.8byte	.LVL964
+	.8byte	.LVL984
+	.8byte	.LVL988
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL965
-	.8byte	.LVL986
+	.8byte	.LVL989
+	.8byte	.LVL1008
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL992
-	.8byte	.LFE2837
+	.8byte	.LVL1014
+	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST256:
-	.8byte	.LVL946
-	.8byte	.LVL947
+.LLST261:
+	.8byte	.LVL970
+	.8byte	.LVL971
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL988
-	.8byte	.LVL989-1
+	.8byte	.LVL1010
+	.8byte	.LVL1011-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST255:
-	.8byte	.LVL934
-	.8byte	.LVL935
+.LLST260:
+	.8byte	.LVL958
+	.8byte	.LVL959
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL998
-	.8byte	.LVL999-1
+	.8byte	.LVL1020
+	.8byte	.LVL1021-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST253:
-	.8byte	.LVL868
-	.8byte	.LVL869
+.LLST258:
+	.8byte	.LVL892
+	.8byte	.LVL893
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL914
-	.8byte	.LVL915-1
+	.8byte	.LVL938
+	.8byte	.LVL939-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST241:
-	.8byte	.LVL853
-	.8byte	.LVL854
+.LLST245:
+	.8byte	.LVL877
+	.8byte	.LVL878
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL870
-	.8byte	.LVL871
+	.8byte	.LVL894
+	.8byte	.LVL895
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL873
-	.8byte	.LVL874-1
+	.8byte	.LVL897
+	.8byte	.LVL898-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST242:
-	.8byte	.LVL973
-	.8byte	.LVL974
+.LLST246:
+	.8byte	.LVL997
+	.8byte	.LVL998
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL974
-	.8byte	.LVL975
+	.8byte	.LVL998
+	.8byte	.LVL999
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST243:
-	.8byte	.LVL884
-	.8byte	.LVL885-1
+.LLST247:
+	.8byte	.LVL908
+	.8byte	.LVL909-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL890
-	.8byte	.LVL906
+	.8byte	.LVL914
+	.8byte	.LVL930
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL937
-	.8byte	.LVL939-1
+	.8byte	.LVL961
+	.8byte	.LVL963-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL955
-	.8byte	.LVL961-1
+	.8byte	.LVL979
+	.8byte	.LVL985-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL964
-	.8byte	.LVL966-1
+	.8byte	.LVL988
+	.8byte	.LVL990-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL983
-	.8byte	.LVL984-1
+	.8byte	.LVL1005
+	.8byte	.LVL1006-1
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST244:
-	.8byte	.LVL895
-	.8byte	.LVL898
+.LLST248:
+	.8byte	.LVL919
+	.8byte	.LVL922
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL903
-	.8byte	.LVL906
+	.8byte	.LVL927
+	.8byte	.LVL930
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL955
-	.8byte	.LVL958
+	.8byte	.LVL979
+	.8byte	.LVL982
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL964
-	.8byte	.LVL965
+	.8byte	.LVL988
+	.8byte	.LVL989
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST245:
-	.8byte	.LVL853
-	.8byte	.LVL866
+.LLST249:
+	.8byte	.LVL877
+	.8byte	.LVL890
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL867
-	.8byte	.LVL879
+	.8byte	.LVL891
+	.8byte	.LVL903
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL884
-	.8byte	.LVL895
+	.8byte	.LVL908
+	.8byte	.LVL919
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL897
-	.8byte	.LVL902
+	.8byte	.LVL921
+	.8byte	.LVL926
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL906
-	.8byte	.LVL927
+	.8byte	.LVL930
+	.8byte	.LVL951
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL937
-	.8byte	.LVL955
+	.8byte	.LVL961
+	.8byte	.LVL979
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL957
-	.8byte	.LVL964
+	.8byte	.LVL981
+	.8byte	.LVL988
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL965
-	.8byte	.LVL972
+	.8byte	.LVL989
+	.8byte	.LVL996
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL977
-	.8byte	.LVL986
+	.8byte	.LVL1001
+	.8byte	.LVL1008
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL992
-	.8byte	.LVL996
+	.8byte	.LVL1014
+	.8byte	.LVL1018
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL1002
-	.8byte	.LFE2837
+	.8byte	.LVL1024
+	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST246:
-	.8byte	.LVL884
-	.8byte	.LVL885-1
+.LLST250:
+	.8byte	.LVL908
+	.8byte	.LVL909-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL894
-	.8byte	.LVL896
+	.8byte	.LVL918
+	.8byte	.LVL920
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL897
-	.8byte	.LVL906
+	.8byte	.LVL921
+	.8byte	.LVL930
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL937
-	.8byte	.LVL939-1
+	.8byte	.LVL961
+	.8byte	.LVL963-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL955
-	.8byte	.LVL956
+	.8byte	.LVL979
+	.8byte	.LVL980
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL960
-	.8byte	.LVL961-1
+	.8byte	.LVL984
+	.8byte	.LVL985-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL964
-	.8byte	.LVL966-1
+	.8byte	.LVL988
+	.8byte	.LVL990-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL983
-	.8byte	.LVL984-1
+	.8byte	.LVL1005
+	.8byte	.LVL1006-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST247:
-	.8byte	.LVL884
-	.8byte	.LVL885-1
+.LLST251:
+	.8byte	.LVL908
+	.8byte	.LVL909-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL894
-	.8byte	.LVL904
+	.8byte	.LVL918
+	.8byte	.LVL928
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL905
-	.8byte	.LVL906
+	.8byte	.LVL929
+	.8byte	.LVL930
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL937
-	.8byte	.LVL939-1
+	.8byte	.LVL961
+	.8byte	.LVL963-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL955
-	.8byte	.LVL961-1
+	.8byte	.LVL979
+	.8byte	.LVL985-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL964
-	.8byte	.LVL966-1
+	.8byte	.LVL988
+	.8byte	.LVL990-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL983
-	.8byte	.LVL984-1
+	.8byte	.LVL1005
+	.8byte	.LVL1006-1
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST248:
-	.8byte	.LVL884
-	.8byte	.LVL885-1
+.LLST252:
+	.8byte	.LVL908
+	.8byte	.LVL909-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL894
-	.8byte	.LVL895
+	.8byte	.LVL918
+	.8byte	.LVL919
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL898
-	.8byte	.LVL900
+	.8byte	.LVL922
+	.8byte	.LVL924
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL900
-	.8byte	.LVL901
+	.8byte	.LVL924
+	.8byte	.LVL925
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL937
-	.8byte	.LVL939-1
+	.8byte	.LVL961
+	.8byte	.LVL963-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL959
-	.8byte	.LVL961-1
+	.8byte	.LVL983
+	.8byte	.LVL985-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL965
-	.8byte	.LVL966-1
+	.8byte	.LVL989
+	.8byte	.LVL990-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL983
-	.8byte	.LVL984-1
+	.8byte	.LVL1005
+	.8byte	.LVL1006-1
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST249:
-	.8byte	.LVL884
-	.8byte	.LVL885-1
+.LLST253:
+	.8byte	.LVL908
+	.8byte	.LVL909-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL893
-	.8byte	.LVL906
+	.8byte	.LVL917
+	.8byte	.LVL930
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL937
-	.8byte	.LVL939-1
+	.8byte	.LVL961
+	.8byte	.LVL963-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL955
-	.8byte	.LVL961-1
+	.8byte	.LVL979
+	.8byte	.LVL985-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL964
-	.8byte	.LVL966-1
+	.8byte	.LVL988
+	.8byte	.LVL990-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL983
-	.8byte	.LVL984-1
+	.8byte	.LVL1005
+	.8byte	.LVL1006-1
 	.2byte	0x1
 	.byte	0x61
 	.8byte	0
 	.8byte	0
-.LLST250:
-	.8byte	.LVL884
-	.8byte	.LVL885-1
+.LLST254:
+	.8byte	.LVL908
+	.8byte	.LVL909-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL891
-	.8byte	.LVL906
+	.8byte	.LVL915
+	.8byte	.LVL930
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL937
-	.8byte	.LVL939-1
+	.8byte	.LVL961
+	.8byte	.LVL963-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL955
-	.8byte	.LVL961-1
+	.8byte	.LVL979
+	.8byte	.LVL985-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL964
-	.8byte	.LVL966-1
+	.8byte	.LVL988
+	.8byte	.LVL990-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL983
-	.8byte	.LVL984-1
+	.8byte	.LVL1005
+	.8byte	.LVL1006-1
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST251:
-	.8byte	.LVL884
-	.8byte	.LVL885-1
+.LLST255:
+	.8byte	.LVL908
+	.8byte	.LVL909-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL893
-	.8byte	.LVL906
+	.8byte	.LVL917
+	.8byte	.LVL930
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL937
-	.8byte	.LVL939-1
+	.8byte	.LVL961
+	.8byte	.LVL963-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL955
-	.8byte	.LVL961-1
+	.8byte	.LVL979
+	.8byte	.LVL985-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL964
-	.8byte	.LVL966-1
+	.8byte	.LVL988
+	.8byte	.LVL990-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL983
-	.8byte	.LVL984-1
+	.8byte	.LVL1005
+	.8byte	.LVL1006-1
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST252:
-	.8byte	.LVL853
-	.8byte	.LVL858
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL861
-	.8byte	.LVL866
+.LLST256:
+	.8byte	.LVL877
+	.8byte	.LVL882
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL867
-	.8byte	.LVL877
+	.8byte	.LVL885
+	.8byte	.LVL890
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL884
-	.8byte	.LVL886
+	.8byte	.LVL891
+	.8byte	.LVL901
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL892
-	.8byte	.LVL906
+	.8byte	.LVL908
+	.8byte	.LVL910
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL912
-	.8byte	.LVL927
+	.8byte	.LVL916
+	.8byte	.LVL930
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL937
-	.8byte	.LVL938
+	.8byte	.LVL936
+	.8byte	.LVL951
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL942
-	.8byte	.LVL944
+	.8byte	.LVL961
+	.8byte	.LVL962
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL955
+	.8byte	.LVL966
 	.8byte	.LVL968
 	.2byte	0x1
 	.byte	0x69
 	.8byte	.LVL979
-	.8byte	.LVL981
+	.8byte	.LVL992
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL983
-	.8byte	.LVL985
+	.8byte	.LVL1001
+	.8byte	.LVL1003
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL992
-	.8byte	.LVL996
+	.8byte	.LVL1005
+	.8byte	.LVL1007
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1002
-	.8byte	.LVL1005
+	.8byte	.LVL1014
+	.8byte	.LVL1018
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1008
-	.8byte	.LFE2837
+	.8byte	.LVL1024
+	.8byte	.LVL1026
 	.2byte	0x1
 	.byte	0x69
-	.8byte	0
-	.8byte	0
-.LLST254:
-	.8byte	.LVL920
-	.8byte	.LVL921-1
+	.8byte	.LVL1028
+	.8byte	.LVL1030
 	.2byte	0x1
-	.byte	0x53
+	.byte	0x69
+	.8byte	.LVL1034
+	.8byte	.LFE2838
+	.2byte	0x1
+	.byte	0x69
 	.8byte	0
 	.8byte	0
 .LLST257:
-	.8byte	.LVL908
-	.8byte	.LVL909-1
+	.8byte	.LVL932
+	.8byte	.LVL933-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL978
-	.8byte	.LVL979
+	.8byte	0
+	.8byte	0
+.LLST259:
+	.8byte	.LVL944
+	.8byte	.LVL945-1
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST258:
-	.8byte	.LVL887
-	.8byte	.LVL888-1
+.LLST262:
+	.8byte	.LVL911
+	.8byte	.LVL912-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL982
-	.8byte	.LVL983
+	.8byte	.LVL1004
+	.8byte	.LVL1005
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
@@ -53740,7 +54107,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL287
-	.8byte	.LFE2833
+	.8byte	.LFE2834
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
@@ -53755,7 +54122,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x67
 	.8byte	.LVL287
-	.8byte	.LFE2833
+	.8byte	.LFE2834
 	.2byte	0x1
 	.byte	0x67
 	.8byte	0
@@ -53777,41 +54144,37 @@ __exitcall_ebc_exit:
 	.byte	0x70
 	.sleb128 -12
 	.8byte	.LVL291
-	.8byte	.LFE2833
+	.8byte	.LFE2834
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 36
 	.8byte	0
 	.8byte	0
-.LLST234:
-	.8byte	.LVL830
-	.8byte	.LVL831
+.LLST238:
+	.8byte	.LVL854
+	.8byte	.LVL855
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST189:
-	.8byte	.LVL546
-	.8byte	.LVL547
+	.8byte	.LVL549
+	.8byte	.LVL550
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL547
-	.8byte	.LVL551
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL552
-	.8byte	.LVL556
+	.8byte	.LVL550
+	.8byte	.LVL554
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL557
-	.8byte	.LVL561
+	.8byte	.LVL555
+	.8byte	.LVL559
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL562
-	.8byte	.LVL566
+	.8byte	.LVL560
+	.8byte	.LVL564
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL567
+	.8byte	.LVL565
 	.8byte	.LVL569
 	.2byte	0x1
 	.byte	0x64
@@ -53819,1081 +54182,1085 @@ __exitcall_ebc_exit:
 	.8byte	.LVL572
 	.2byte	0x1
 	.byte	0x64
+	.8byte	.LVL573
+	.8byte	.LVL575
+	.2byte	0x1
+	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST142:
-	.8byte	.LVL438
-	.8byte	.LVL485
+	.8byte	.LVL441
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL486
-	.8byte	.LFE2827
+	.8byte	.LVL489
+	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST143:
-	.8byte	.LVL438
-	.8byte	.LVL486
+	.8byte	.LVL441
+	.8byte	.LVL489
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL486
-	.8byte	.LFE2827
+	.8byte	.LVL489
+	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST144:
-	.8byte	.LVL438
-	.8byte	.LVL439
+	.8byte	.LVL441
+	.8byte	.LVL442
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL458
-	.8byte	.LVL460
+	.8byte	.LVL461
+	.8byte	.LVL463
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL490
-	.8byte	.LVL491
+	.8byte	.LVL493
+	.8byte	.LVL494
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL503
-	.8byte	.LVL504
+	.8byte	.LVL506
+	.8byte	.LVL507
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL519
-	.8byte	.LVL520
+	.8byte	.LVL522
+	.8byte	.LVL523
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST145:
-	.8byte	.LVL448
-	.8byte	.LVL449
+	.8byte	.LVL451
+	.8byte	.LVL452
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST146:
-	.8byte	.LVL445
-	.8byte	.LVL446
+	.8byte	.LVL448
+	.8byte	.LVL449
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL447
 	.8byte	.LVL450
+	.8byte	.LVL453
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL451
-	.8byte	.LVL458
+	.8byte	.LVL454
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
 .LLST147:
-	.8byte	.LVL443
-	.8byte	.LVL458
+	.8byte	.LVL446
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
 .LLST148:
-	.8byte	.LVL444
-	.8byte	.LVL458
+	.8byte	.LVL447
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
 .LLST149:
-	.8byte	.LVL440
-	.8byte	.LVL441
+	.8byte	.LVL443
+	.8byte	.LVL444
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
 .LLST150:
-	.8byte	.LVL442
-	.8byte	.LVL458
+	.8byte	.LVL445
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
 .LLST151:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL467
-	.8byte	.LVL479
+	.8byte	.LVL470
+	.8byte	.LVL482
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL484
-	.8byte	.LVL490
+	.8byte	.LVL487
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL517
-	.8byte	.LVL518
+	.8byte	.LVL520
+	.8byte	.LVL521
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST152:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL471
-	.8byte	.LVL480
+	.8byte	.LVL474
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL484
 	.8byte	.LVL487
+	.8byte	.LVL490
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL517
-	.8byte	.LVL518
+	.8byte	.LVL520
+	.8byte	.LVL521
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST153:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL467
-	.8byte	.LVL490
+	.8byte	.LVL470
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL517
-	.8byte	.LVL518
+	.8byte	.LVL520
+	.8byte	.LVL521
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST154:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL467
-	.8byte	.LVL490
+	.8byte	.LVL470
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL517
-	.8byte	.LVL518
+	.8byte	.LVL520
+	.8byte	.LVL521
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST155:
-	.8byte	.LVL452
-	.8byte	.LVL458
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL467
-	.8byte	.LVL468
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL469
 	.8byte	.LVL470
+	.8byte	.LVL471
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL486
-	.8byte	.LVL488
+	.8byte	.LVL472
+	.8byte	.LVL473
 	.2byte	0x1
 	.byte	0x55
 	.8byte	.LVL489
-	.8byte	.LVL490
+	.8byte	.LVL491
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL492
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST156:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL464
-	.8byte	.LVL490
+	.8byte	.LVL467
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL517
-	.8byte	.LVL518
+	.8byte	.LVL520
+	.8byte	.LVL521
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
 .LLST157:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL465
-	.8byte	.LVL490
+	.8byte	.LVL468
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL517
-	.8byte	.LVL518
+	.8byte	.LVL520
+	.8byte	.LVL521
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
 	.8byte	0
 .LLST158:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL466
-	.8byte	.LVL490
+	.8byte	.LVL469
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL517
-	.8byte	.LVL518
+	.8byte	.LVL520
+	.8byte	.LVL521
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
 .LLST159:
-	.8byte	.LVL461
-	.8byte	.LVL462
+	.8byte	.LVL464
+	.8byte	.LVL465
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
 .LLST160:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL463
-	.8byte	.LVL490
+	.8byte	.LVL466
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL517
-	.8byte	.LVL518
+	.8byte	.LVL520
+	.8byte	.LVL521
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
 .LLST161:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL467
-	.8byte	.LVL472
+	.8byte	.LVL470
+	.8byte	.LVL475
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL481
-	.8byte	.LVL490
+	.8byte	.LVL484
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL517
-	.8byte	.LVL518
+	.8byte	.LVL520
+	.8byte	.LVL521
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
 .LLST162:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL467
-	.8byte	.LVL475
+	.8byte	.LVL470
+	.8byte	.LVL478
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL476
-	.8byte	.LVL477
+	.8byte	.LVL479
+	.8byte	.LVL480
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL478
-	.8byte	.LVL482
+	.8byte	.LVL481
+	.8byte	.LVL485
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL483
-	.8byte	.LVL490
+	.8byte	.LVL486
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL517
-	.8byte	.LVL518
+	.8byte	.LVL520
+	.8byte	.LVL521
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
 .LLST163:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL467
-	.8byte	.LVL473
+	.8byte	.LVL470
+	.8byte	.LVL476
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL474
 	.8byte	.LVL477
+	.8byte	.LVL480
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL478
-	.8byte	.LVL482
+	.8byte	.LVL481
+	.8byte	.LVL485
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL483
-	.8byte	.LVL490
+	.8byte	.LVL486
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL517
-	.8byte	.LVL518
+	.8byte	.LVL520
+	.8byte	.LVL521
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
 .LLST164:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL467
-	.8byte	.LVL473
+	.8byte	.LVL470
+	.8byte	.LVL476
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL474
-	.8byte	.LVL475
+	.8byte	.LVL477
+	.8byte	.LVL478
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL476
-	.8byte	.LVL482
+	.8byte	.LVL479
+	.8byte	.LVL485
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL483
-	.8byte	.LVL490
+	.8byte	.LVL486
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL517
-	.8byte	.LVL518
+	.8byte	.LVL520
+	.8byte	.LVL521
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
 .LLST165:
-	.8byte	.LVL452
-	.8byte	.LVL458
-	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL497
-	.8byte	.LVL498
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL499
+	.8byte	.LVL500
 	.8byte	.LVL501
 	.2byte	0x1
 	.byte	0x57
 	.8byte	.LVL502
-	.8byte	.LVL503
+	.8byte	.LVL504
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL505
+	.8byte	.LVL506
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
 .LLST166:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL495
-	.8byte	.LVL503
+	.8byte	.LVL498
+	.8byte	.LVL506
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
 .LLST167:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL496
-	.8byte	.LVL503
+	.8byte	.LVL499
+	.8byte	.LVL506
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
 .LLST168:
-	.8byte	.LVL492
-	.8byte	.LVL493
+	.8byte	.LVL495
+	.8byte	.LVL496
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
 .LLST169:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL494
-	.8byte	.LVL503
+	.8byte	.LVL497
+	.8byte	.LVL506
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
 .LLST170:
-	.8byte	.LVL452
-	.8byte	.LVL458
-	.2byte	0x1
-	.byte	0x5b
-	.8byte	.LVL510
-	.8byte	.LVL511
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL512
 	.8byte	.LVL513
+	.8byte	.LVL514
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL514
 	.8byte	.LVL515
+	.8byte	.LVL516
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL516
 	.8byte	.LVL517
+	.8byte	.LVL518
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL519
+	.8byte	.LVL520
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
 	.8byte	0
 .LLST171:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL508
-	.8byte	.LVL517
+	.8byte	.LVL511
+	.8byte	.LVL520
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL518
-	.8byte	.LVL519
+	.8byte	.LVL521
+	.8byte	.LVL522
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
 .LLST172:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL509
-	.8byte	.LVL517
+	.8byte	.LVL512
+	.8byte	.LVL520
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL518
-	.8byte	.LVL519
+	.8byte	.LVL521
+	.8byte	.LVL522
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
 .LLST173:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL459
-	.8byte	.LVL466
+	.8byte	.LVL462
+	.8byte	.LVL469
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL503
-	.8byte	.LVL517
+	.8byte	.LVL506
+	.8byte	.LVL520
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL518
-	.8byte	.LVL519
+	.8byte	.LVL521
+	.8byte	.LVL522
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
 .LLST174:
-	.8byte	.LVL505
-	.8byte	.LVL506
+	.8byte	.LVL508
+	.8byte	.LVL509
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
 .LLST175:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL507
-	.8byte	.LVL517
+	.8byte	.LVL510
+	.8byte	.LVL520
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL518
-	.8byte	.LVL519
+	.8byte	.LVL521
+	.8byte	.LVL522
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
 .LLST176:
-	.8byte	.LVL452
-	.8byte	.LVL453
+	.8byte	.LVL455
+	.8byte	.LVL456
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL510
-	.8byte	.LVL517
+	.8byte	.LVL513
+	.8byte	.LVL520
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL518
-	.8byte	.LVL519
+	.8byte	.LVL521
+	.8byte	.LVL522
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST177:
-	.8byte	.LVL452
 	.8byte	.LVL455
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL510
-	.8byte	.LVL517
+	.8byte	.LVL513
+	.8byte	.LVL520
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL518
-	.8byte	.LVL519
+	.8byte	.LVL521
+	.8byte	.LVL522
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
 .LLST178:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL527
-	.8byte	.LVL528
+	.8byte	.LVL530
+	.8byte	.LVL531
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL529
-	.8byte	.LVL536
+	.8byte	.LVL532
+	.8byte	.LVL539
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL537
-	.8byte	.LFE2827
+	.8byte	.LVL540
+	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST179:
-	.8byte	.LVL452
-	.8byte	.LVL454
+	.8byte	.LVL455
+	.8byte	.LVL457
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL524
-	.8byte	.LFE2827
+	.8byte	.LVL527
+	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
 .LLST180:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL525
-	.8byte	.LFE2827
+	.8byte	.LVL528
+	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x61
 	.8byte	0
 	.8byte	0
 .LLST181:
-	.8byte	.LVL452
-	.8byte	.LVL453
+	.8byte	.LVL455
+	.8byte	.LVL456
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL526
-	.8byte	.LFE2827
+	.8byte	.LVL529
+	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
 .LLST182:
-	.8byte	.LVL521
-	.8byte	.LVL522
+	.8byte	.LVL524
+	.8byte	.LVL525
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
 .LLST183:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL523
-	.8byte	.LFE2827
+	.8byte	.LVL526
+	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
 .LLST184:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL527
 	.8byte	.LVL530
+	.8byte	.LVL533
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL532
-	.8byte	.LVL534
+	.8byte	.LVL535
+	.8byte	.LVL537
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL535
-	.8byte	.LFE2827
+	.8byte	.LVL538
+	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST185:
-	.8byte	.LVL452
-	.8byte	.LVL456
+	.8byte	.LVL455
+	.8byte	.LVL459
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL527
-	.8byte	.LFE2827
+	.8byte	.LVL530
+	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
 .LLST186:
-	.8byte	.LVL452
-	.8byte	.LVL458
+	.8byte	.LVL455
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL527
 	.8byte	.LVL530
+	.8byte	.LVL533
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL531
-	.8byte	.LVL532
+	.8byte	.LVL534
+	.8byte	.LVL535
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL533
-	.8byte	.LVL534
+	.8byte	.LVL536
+	.8byte	.LVL537
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL535
-	.8byte	.LFE2827
+	.8byte	.LVL538
+	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST187:
-	.8byte	.LVL452
-	.8byte	.LVL457
+	.8byte	.LVL455
+	.8byte	.LVL460
 	.2byte	0x1
 	.byte	0x6e
-	.8byte	.LVL527
-	.8byte	.LFE2827
+	.8byte	.LVL530
+	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x6e
 	.8byte	0
 	.8byte	0
 .LLST105:
-	.8byte	.LVL359
-	.8byte	.LVL390
+	.8byte	.LVL362
+	.8byte	.LVL393
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL391
-	.8byte	.LFE2821
+	.8byte	.LVL394
+	.8byte	.LFE2822
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST106:
-	.8byte	.LVL359
-	.8byte	.LVL391
+	.8byte	.LVL362
+	.8byte	.LVL394
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL391
-	.8byte	.LFE2821
+	.8byte	.LVL394
+	.8byte	.LFE2822
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST107:
-	.8byte	.LVL359
-	.8byte	.LVL360
+	.8byte	.LVL362
+	.8byte	.LVL363
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL374
-	.8byte	.LVL376
+	.8byte	.LVL377
+	.8byte	.LVL379
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL394
-	.8byte	.LVL395
+	.8byte	.LVL397
+	.8byte	.LVL398
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL407
-	.8byte	.LVL408
+	.8byte	.LVL410
+	.8byte	.LVL411
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL422
-	.8byte	.LVL423
+	.8byte	.LVL425
+	.8byte	.LVL426
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST108:
-	.8byte	.LVL369
-	.8byte	.LVL370
+	.8byte	.LVL372
+	.8byte	.LVL373
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST109:
-	.8byte	.LVL366
-	.8byte	.LVL367
+	.8byte	.LVL369
+	.8byte	.LVL370
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL368
 	.8byte	.LVL371
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL372
-	.8byte	.LVL374
+	.8byte	.LVL375
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
 .LLST110:
-	.8byte	.LVL364
-	.8byte	.LVL374
+	.8byte	.LVL367
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
 .LLST111:
-	.8byte	.LVL365
-	.8byte	.LVL374
+	.8byte	.LVL368
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
 .LLST112:
-	.8byte	.LVL361
-	.8byte	.LVL362
+	.8byte	.LVL364
+	.8byte	.LVL365
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST113:
-	.8byte	.LVL363
-	.8byte	.LVL374
+	.8byte	.LVL366
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST114:
-	.8byte	.LVL373
-	.8byte	.LVL374
+	.8byte	.LVL376
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL382
-	.8byte	.LVL394
+	.8byte	.LVL385
+	.8byte	.LVL397
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST115:
-	.8byte	.LVL373
-	.8byte	.LVL374
+	.8byte	.LVL376
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL380
-	.8byte	.LVL394
+	.8byte	.LVL383
+	.8byte	.LVL397
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
 .LLST116:
-	.8byte	.LVL386
-	.8byte	.LVL388
+	.8byte	.LVL389
+	.8byte	.LVL391
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST117:
-	.8byte	.LVL387
-	.8byte	.LVL389
+	.8byte	.LVL390
+	.8byte	.LVL392
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST118:
-	.8byte	.LVL373
-	.8byte	.LVL374
+	.8byte	.LVL376
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL383
-	.8byte	.LVL394
+	.8byte	.LVL386
+	.8byte	.LVL397
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST119:
-	.8byte	.LVL373
-	.8byte	.LVL374
+	.8byte	.LVL376
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL383
-	.8byte	.LVL394
+	.8byte	.LVL386
+	.8byte	.LVL397
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST120:
-	.8byte	.LVL373
-	.8byte	.LVL374
+	.8byte	.LVL376
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL383
-	.8byte	.LVL384
+	.8byte	.LVL386
+	.8byte	.LVL387
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL385
-	.8byte	.LVL392
+	.8byte	.LVL388
+	.8byte	.LVL395
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL393
-	.8byte	.LVL394
+	.8byte	.LVL396
+	.8byte	.LVL397
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
 .LLST121:
-	.8byte	.LVL377
-	.8byte	.LVL378
+	.8byte	.LVL380
+	.8byte	.LVL381
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST122:
-	.8byte	.LVL373
-	.8byte	.LVL374
+	.8byte	.LVL376
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL379
-	.8byte	.LVL394
+	.8byte	.LVL382
+	.8byte	.LVL397
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST123:
-	.8byte	.LVL373
-	.8byte	.LVL374
-	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL401
-	.8byte	.LVL402
+	.8byte	.LVL376
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL403
+	.8byte	.LVL404
 	.8byte	.LVL405
 	.2byte	0x1
 	.byte	0x57
 	.8byte	.LVL406
-	.8byte	.LVL407
+	.8byte	.LVL408
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL409
+	.8byte	.LVL410
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
 .LLST124:
-	.8byte	.LVL373
-	.8byte	.LVL374
+	.8byte	.LVL376
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL399
-	.8byte	.LVL407
+	.8byte	.LVL402
+	.8byte	.LVL410
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
 .LLST125:
-	.8byte	.LVL373
-	.8byte	.LVL374
+	.8byte	.LVL376
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL400
-	.8byte	.LVL407
+	.8byte	.LVL403
+	.8byte	.LVL410
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
 .LLST126:
-	.8byte	.LVL396
-	.8byte	.LVL397
+	.8byte	.LVL399
+	.8byte	.LVL400
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST127:
-	.8byte	.LVL373
-	.8byte	.LVL374
+	.8byte	.LVL376
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL398
-	.8byte	.LVL407
+	.8byte	.LVL401
+	.8byte	.LVL410
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST128:
-	.8byte	.LVL373
-	.8byte	.LVL374
+	.8byte	.LVL376
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL375
-	.8byte	.LVL381
+	.8byte	.LVL378
+	.8byte	.LVL384
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL407
-	.8byte	.LVL422
+	.8byte	.LVL410
+	.8byte	.LVL425
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
 .LLST129:
-	.8byte	.LVL373
-	.8byte	.LVL374
+	.8byte	.LVL376
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL412
-	.8byte	.LVL422
+	.8byte	.LVL415
+	.8byte	.LVL425
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST130:
-	.8byte	.LVL373
-	.8byte	.LVL374
+	.8byte	.LVL376
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL413
-	.8byte	.LVL422
+	.8byte	.LVL416
+	.8byte	.LVL425
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
 .LLST131:
-	.8byte	.LVL417
-	.8byte	.LVL419
+	.8byte	.LVL420
+	.8byte	.LVL422
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST132:
-	.8byte	.LVL373
-	.8byte	.LVL374
+	.8byte	.LVL376
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL414
-	.8byte	.LVL415
+	.8byte	.LVL417
+	.8byte	.LVL418
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL416
-	.8byte	.LVL420
+	.8byte	.LVL419
+	.8byte	.LVL423
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL421
-	.8byte	.LVL422
+	.8byte	.LVL424
+	.8byte	.LVL425
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
 .LLST133:
-	.8byte	.LVL409
-	.8byte	.LVL410
+	.8byte	.LVL412
+	.8byte	.LVL413
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
 .LLST134:
-	.8byte	.LVL373
-	.8byte	.LVL374
+	.8byte	.LVL376
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL411
-	.8byte	.LVL422
+	.8byte	.LVL414
+	.8byte	.LVL425
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
 .LLST135:
-	.8byte	.LVL373
-	.8byte	.LVL374
+	.8byte	.LVL376
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL429
-	.8byte	.LFE2821
+	.8byte	.LVL432
+	.8byte	.LFE2822
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
 .LLST136:
-	.8byte	.LVL373
-	.8byte	.LVL374
+	.8byte	.LVL376
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL427
-	.8byte	.LFE2821
+	.8byte	.LVL430
+	.8byte	.LFE2822
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST137:
-	.8byte	.LVL373
-	.8byte	.LVL374
+	.8byte	.LVL376
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL428
-	.8byte	.LFE2821
+	.8byte	.LVL431
+	.8byte	.LFE2822
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
 .LLST138:
-	.8byte	.LVL433
-	.8byte	.LVL435
+	.8byte	.LVL436
+	.8byte	.LVL438
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST139:
-	.8byte	.LVL373
-	.8byte	.LVL374
+	.8byte	.LVL376
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL430
-	.8byte	.LVL431
+	.8byte	.LVL433
+	.8byte	.LVL434
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL432
-	.8byte	.LVL436
+	.8byte	.LVL435
+	.8byte	.LVL439
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL437
-	.8byte	.LFE2821
+	.8byte	.LVL440
+	.8byte	.LFE2822
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
 	.8byte	0
 .LLST140:
-	.8byte	.LVL424
-	.8byte	.LVL425
+	.8byte	.LVL427
+	.8byte	.LVL428
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
 .LLST141:
-	.8byte	.LVL373
-	.8byte	.LVL374
+	.8byte	.LVL376
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL426
-	.8byte	.LFE2821
+	.8byte	.LVL429
+	.8byte	.LFE2822
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
@@ -54928,7 +55295,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x56
 	.8byte	.LVL60
-	.8byte	.LFE2815
+	.8byte	.LFE2816
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
@@ -54951,7 +55318,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x55
 	.8byte	.LVL50
-	.8byte	.LFE2815
+	.8byte	.LFE2816
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
@@ -54962,7 +55329,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	.LVL61
-	.8byte	.LFE2815
+	.8byte	.LFE2816
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
@@ -54977,7 +55344,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x58
 	.8byte	.LVL50
-	.8byte	.LFE2815
+	.8byte	.LFE2816
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
@@ -55076,136 +55443,192 @@ __exitcall_ebc_exit:
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST231:
-	.8byte	.LVL818
-	.8byte	.LVL820
+.LLST235:
+	.8byte	.LVL838
+	.8byte	.LVL840
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST232:
-	.8byte	.LVL819
-	.8byte	.LVL822
+.LLST236:
+	.8byte	.LVL839
+	.8byte	.LVL842
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST233:
-	.8byte	.LVL822
-	.8byte	.LVL825
+.LLST237:
+	.8byte	.LVL842
+	.8byte	.LVL845
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL826
-	.8byte	.LVL829
+	.8byte	.LVL846
+	.8byte	.LVL849
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL850
+	.8byte	.LVL853
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST227:
-	.8byte	.LVL807
-	.8byte	.LVL812
+.LLST231:
+	.8byte	.LVL827
+	.8byte	.LVL832
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL817
-	.8byte	.LFE2811
+	.8byte	.LVL837
+	.8byte	.LFE2812
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST228:
-	.8byte	.LVL813
-	.8byte	.LVL814
+.LLST232:
+	.8byte	.LVL833
+	.8byte	.LVL834
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST229:
-	.8byte	.LVL811
-	.8byte	.LVL815
+.LLST233:
+	.8byte	.LVL831
+	.8byte	.LVL835
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST230:
-	.8byte	.LVL814
+.LLST234:
+	.8byte	.LVL834
+	.8byte	.LVL836
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST227:
+	.8byte	.LVL810
+	.8byte	.LVL820
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL820
+	.8byte	.LVL825
+	.2byte	0x1
+	.byte	0x58
+	.8byte	.LVL825
+	.8byte	.LFE2811
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST228:
+	.8byte	.LVL810
+	.8byte	.LVL815
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL820
+	.8byte	.LVL821
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL826
+	.8byte	.LFE2811
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST229:
 	.8byte	.LVL816
+	.8byte	.LVL819
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL823
+	.8byte	.LVL824
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
+.LLST230:
+	.8byte	.LVL817
+	.8byte	.LVL818
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL822
+	.8byte	.LVL824
+	.2byte	0x1
+	.byte	0x54
+	.8byte	0
+	.8byte	0
 .LLST221:
-	.8byte	.LVL785
-	.8byte	.LVL791
+	.8byte	.LVL788
+	.8byte	.LVL794
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL795
-	.8byte	.LVL796
+	.8byte	.LVL798
+	.8byte	.LVL799
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL805
-	.8byte	.LVL806
+	.8byte	.LVL808
+	.8byte	.LVL809
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST222:
-	.8byte	.LVL785
-	.8byte	.LVL786
+	.8byte	.LVL788
+	.8byte	.LVL789
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST223:
-	.8byte	.LVL791
 	.8byte	.LVL794
+	.8byte	.LVL797
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL798
-	.8byte	.LVL803
+	.8byte	.LVL801
+	.8byte	.LVL806
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL806
+	.8byte	.LVL809
 	.8byte	.LFE2810
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST224:
-	.8byte	.LVL790
-	.8byte	.LVL791
+	.8byte	.LVL793
+	.8byte	.LVL794
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL793
-	.8byte	.LVL797
+	.8byte	.LVL796
+	.8byte	.LVL800
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL802
-	.8byte	.LVL806
+	.8byte	.LVL805
+	.8byte	.LVL809
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
 .LLST225:
-	.8byte	.LVL790
-	.8byte	.LVL792
-	.2byte	0x1
-	.byte	0x55
 	.8byte	.LVL793
-	.8byte	.LVL801
+	.8byte	.LVL795
 	.2byte	0x1
 	.byte	0x55
+	.8byte	.LVL796
 	.8byte	.LVL804
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL807
 	.8byte	.LFE2810
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST226:
-	.8byte	.LVL790
-	.8byte	.LVL799
+	.8byte	.LVL793
+	.8byte	.LVL802
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL800
+	.8byte	.LVL803
 	.8byte	.LFE2810
 	.2byte	0x1
 	.byte	0x57
@@ -55219,67 +55642,67 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	0
 .LLST188:
-	.8byte	.LVL538
-	.8byte	.LVL539
+	.8byte	.LVL541
+	.8byte	.LVL542
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL539
-	.8byte	.LVL544
+	.8byte	.LVL542
+	.8byte	.LVL547
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL545
-	.8byte	.LFE2878
+	.8byte	.LVL548
+	.8byte	.LFE2879
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST190:
-	.8byte	.LVL573
-	.8byte	.LVL575
+	.8byte	.LVL576
+	.8byte	.LVL578
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL575
-	.8byte	.LVL579
+	.8byte	.LVL578
+	.8byte	.LVL582
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL580
 	.8byte	.LVL583
+	.8byte	.LVL586
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
 .LLST191:
-	.8byte	.LVL573
-	.8byte	.LVL574
+	.8byte	.LVL576
+	.8byte	.LVL577
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST193:
-	.8byte	.LVL591
-	.8byte	.LVL592-1
+	.8byte	.LVL594
+	.8byte	.LVL595-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST194:
-	.8byte	.LVL590
-	.8byte	.LVL592-1
+	.8byte	.LVL593
+	.8byte	.LVL595-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST220:
-	.8byte	.LVL777
-	.8byte	.LVL778
+	.8byte	.LVL780
+	.8byte	.LVL781
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL778
-	.8byte	.LVL782
+	.8byte	.LVL781
+	.8byte	.LVL785
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL783
-	.8byte	.LFE2886
+	.8byte	.LVL786
+	.8byte	.LFE2887
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -55294,10 +55717,10 @@ __exitcall_ebc_exit:
 	.2byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0-.Ltext0
+	.8byte	.LFB2867
+	.8byte	.LFE2867-.LFB2867
 	.8byte	.LFB2866
 	.8byte	.LFE2866-.LFB2866
-	.8byte	.LFB2865
-	.8byte	.LFE2865-.LFB2865
 	.8byte	0
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
@@ -55850,8 +56273,8 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	.LBB1857
 	.8byte	.LBE1857
-	.8byte	.LBB1887
-	.8byte	.LBE1887
+	.8byte	.LBB1891
+	.8byte	.LBE1891
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1860
@@ -55860,34 +56283,28 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1866
 	.8byte	.LBB1867
 	.8byte	.LBE1867
-	.8byte	.LBB1885
-	.8byte	.LBE1885
-	.8byte	.LBB1886
-	.8byte	.LBE1886
+	.8byte	.LBB1889
+	.8byte	.LBE1889
+	.8byte	.LBB1890
+	.8byte	.LBE1890
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1873
-	.8byte	.LBE1873
-	.8byte	.LBB1876
-	.8byte	.LBE1876
+	.8byte	.LBB1868
+	.8byte	.LBE1868
+	.8byte	.LBB1871
+	.8byte	.LBE1871
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1877
 	.8byte	.LBE1877
-	.8byte	.LBB1895
-	.8byte	.LBE1895
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1879
-	.8byte	.LBE1879
 	.8byte	.LBB1880
 	.8byte	.LBE1880
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1881
 	.8byte	.LBE1881
-	.8byte	.LBB1894
-	.8byte	.LBE1894
+	.8byte	.LBB1895
+	.8byte	.LBE1895
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1883
@@ -55896,18 +56313,24 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1884
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1885
+	.8byte	.LBE1885
+	.8byte	.LBB1894
+	.8byte	.LBE1894
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1887
+	.8byte	.LBE1887
 	.8byte	.LBB1888
 	.8byte	.LBE1888
-	.8byte	.LBB1891
-	.8byte	.LBE1891
 	.8byte	0
 	.8byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0
+	.8byte	.LFB2867
+	.8byte	.LFE2867
 	.8byte	.LFB2866
 	.8byte	.LFE2866
-	.8byte	.LFB2865
-	.8byte	.LFE2865
 	.8byte	0
 	.8byte	0
 	.section	.debug_line,"",@progbits
@@ -55989,7 +56412,7 @@ __exitcall_ebc_exit:
 	.string	"dev_kobj"
 .LASF475:
 	.string	"d_release"
-.LASF3200:
+.LASF3201:
 	.string	"get_arch_dma_ops"
 .LASF305:
 	.string	"__ctors_start"
@@ -56065,9 +56488,9 @@ __exitcall_ebc_exit:
 	.string	"gpio_desc"
 .LASF976:
 	.string	"list"
-.LASF3217:
+.LASF3218:
 	.string	"_copy_from_user"
-.LASF3243:
+.LASF3244:
 	.string	"get_order"
 .LASF959:
 	.string	"si_errno"
@@ -56127,7 +56550,7 @@ __exitcall_ebc_exit:
 	.string	"n_node"
 .LASF1638:
 	.string	"qsize_t"
-.LASF3240:
+.LASF3241:
 	.string	"devm_kzalloc"
 .LASF380:
 	.string	"sequence"
@@ -56219,7 +56642,7 @@ __exitcall_ebc_exit:
 	.string	"size_t"
 .LASF209:
 	.string	"compat_elf_hwcap"
-.LASF3318:
+.LASF3319:
 	.string	"prepare_to_wait_event"
 .LASF1124:
 	.string	"cap_permitted"
@@ -56361,7 +56784,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ION_HEAP_POOL"
 .LASF1438:
 	.string	"sysctl_protected_hardlinks"
-.LASF3322:
+.LASF3323:
 	.string	"__arch_copy_from_user"
 .LASF1191:
 	.string	"scan_objects"
@@ -56369,7 +56792,7 @@ __exitcall_ebc_exit:
 	.string	"pageset"
 .LASF1252:
 	.string	"wb_err"
-.LASF3214:
+.LASF3215:
 	.string	"copy_to_user"
 .LASF735:
 	.string	"trace_recursion"
@@ -56483,7 +56906,7 @@ __exitcall_ebc_exit:
 	.string	"pcpu_chosen_fc"
 .LASF391:
 	.string	"dentry_stat_t"
-.LASF3267:
+.LASF3268:
 	.string	"atomic_add"
 .LASF1657:
 	.string	"dqi_bgrace"
@@ -56501,7 +56924,7 @@ __exitcall_ebc_exit:
 	.string	"ctl_table"
 .LASF44:
 	.string	"uid_t"
-.LASF3297:
+.LASF3298:
 	.string	"strstr"
 .LASF2862:
 	.string	"WF_TYPE_A2"
@@ -56565,7 +56988,7 @@ __exitcall_ebc_exit:
 	.string	"pteval_t"
 .LASF430:
 	.string	"i_ino"
-.LASF3342:
+.LASF3343:
 	.string	"might_fault"
 .LASF1576:
 	.string	"compact_cached_free_pfn"
@@ -56685,7 +57108,7 @@ __exitcall_ebc_exit:
 	.string	"pidfd_fops"
 .LASF1931:
 	.string	"lm_put_owner"
-.LASF3299:
+.LASF3300:
 	.string	"ebc_pmic_verity_vcom"
 .LASF2538:
 	.string	"set_sda"
@@ -56795,7 +57218,7 @@ __exitcall_ebc_exit:
 	.string	"sysfs_dev_block_kobj"
 .LASF555:
 	.string	"upid"
-.LASF3330:
+.LASF3331:
 	.string	"down_write"
 .LASF1113:
 	.string	"completion"
@@ -56843,13 +57266,15 @@ __exitcall_ebc_exit:
 	.string	"thread_union"
 .LASF1826:
 	.string	"bd_super"
+.LASF3044:
+	.string	"__addressable_ebc_init3171"
 .LASF2723:
 	.string	"usermodehelper_table"
 .LASF160:
 	.string	"taint_flag"
 .LASF1993:
 	.string	"get_dquots"
-.LASF3308:
+.LASF3309:
 	.string	"of_find_node_by_phandle"
 .LASF2417:
 	.string	"unmap_page"
@@ -56873,7 +57298,7 @@ __exitcall_ebc_exit:
 	.string	"vm_operations_struct"
 .LASF2405:
 	.string	"hwirq_max"
-.LASF3265:
+.LASF3266:
 	.string	"__fswab32"
 .LASF2213:
 	.string	"runtime_idle"
@@ -56903,13 +57328,13 @@ __exitcall_ebc_exit:
 	.string	"RPM_SUSPENDED"
 .LASF698:
 	.string	"reclaim_state"
-.LASF3340:
+.LASF3341:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF138:
 	.string	"vendor_panic_cb"
 .LASF3098:
 	.string	"ebc_vdd_power_timeout"
-.LASF3186:
+.LASF3187:
 	.string	"ebc_get_4pix_wf"
 .LASF2813:
 	.string	"num_symtab"
@@ -56939,7 +57364,7 @@ __exitcall_ebc_exit:
 	.string	"module_alloc_base"
 .LASF1766:
 	.string	"core_kallsyms"
-.LASF3302:
+.LASF3303:
 	.string	"memcpy"
 .LASF2910:
 	.string	"EPD_FORCE_FULL"
@@ -56961,7 +57386,7 @@ __exitcall_ebc_exit:
 	.string	"gray_old"
 .LASF68:
 	.string	"hlist_node"
-.LASF3311:
+.LASF3312:
 	.string	"sprintf"
 .LASF1923:
 	.string	"fl_ops"
@@ -56973,7 +57398,7 @@ __exitcall_ebc_exit:
 	.string	"WQ_MEM_RECLAIM"
 .LASF2688:
 	.string	"COMPACTISOLATED"
-.LASF3278:
+.LASF3279:
 	.string	"of_property_read_variable_u32_array"
 .LASF328:
 	.string	"__inittext_begin"
@@ -57009,7 +57434,7 @@ __exitcall_ebc_exit:
 	.string	"DOMAIN_BUS_WAKEUP"
 .LASF1237:
 	.string	"arm64_el2_vector_last_slot"
-.LASF3334:
+.LASF3335:
 	.string	"queue_work_on"
 .LASF2350:
 	.string	"online"
@@ -57017,7 +57442,7 @@ __exitcall_ebc_exit:
 	.string	"runtime_resume"
 .LASF1222:
 	.string	"dup_xol_work"
-.LASF3207:
+.LASF3208:
 	.string	"ebc_pmic_read_temp"
 .LASF2891:
 	.string	"EPD_FULL_GC16"
@@ -57185,7 +57610,7 @@ __exitcall_ebc_exit:
 	.string	"huge_fault"
 .LASF2023:
 	.string	"kstatfs"
-.LASF3210:
+.LASF3211:
 	.string	"ebc_pmic_power_off"
 .LASF2649:
 	.string	"PGPGOUTCLEAN"
@@ -57257,7 +57682,7 @@ __exitcall_ebc_exit:
 	.string	"get_next_id"
 .LASF238:
 	.string	"rwlock_t"
-.LASF3339:
+.LASF3340:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
 .LASF855:
 	.string	"pgprot"
@@ -57285,7 +57710,7 @@ __exitcall_ebc_exit:
 	.string	"__icache_flags"
 .LASF148:
 	.string	"crash_kexec_post_notifiers"
-.LASF3195:
+.LASF3196:
 	.string	"eink_mode"
 .LASF1712:
 	.string	"rt_spc_warnlimit"
@@ -57391,7 +57816,7 @@ __exitcall_ebc_exit:
 	.string	"host"
 .LASF185:
 	.string	"uaddr"
-.LASF3329:
+.LASF3330:
 	.string	"ebc_remove_from_dsp_buf_list"
 .LASF662:
 	.string	"real_start_time"
@@ -57427,11 +57852,11 @@ __exitcall_ebc_exit:
 	.string	"devres_head"
 .LASF428:
 	.string	"i_mapping"
-.LASF3303:
+.LASF3304:
 	.string	"misc_register"
 .LASF723:
 	.string	"rseq_sig"
-.LASF3229:
+.LASF3230:
 	.string	"platform_set_drvdata"
 .LASF343:
 	.string	"cpu_context"
@@ -57439,7 +57864,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pm_domain"
 .LASF1528:
 	.string	"nr_zones"
-.LASF3251:
+.LASF3252:
 	.string	"is_source"
 .LASF1390:
 	.string	"migrate_mode"
@@ -57461,11 +57886,11 @@ __exitcall_ebc_exit:
 	.string	"d_hash"
 .LASF1090:
 	.string	"dl_bw"
-.LASF3222:
+.LASF3223:
 	.string	"limit"
 .LASF2160:
 	.string	"kobj"
-.LASF3312:
+.LASF3313:
 	.string	"kstrtouint"
 .LASF114:
 	.string	"fsync"
@@ -57475,9 +57900,9 @@ __exitcall_ebc_exit:
 	.string	"i_flags"
 .LASF2908:
 	.string	"EPD_RESUME"
-.LASF3298:
+.LASF3299:
 	.string	"sscanf"
-.LASF3294:
+.LASF3295:
 	.string	"ebc_empty_buf_get"
 .LASF1489:
 	.string	"NR_ISOLATED_ANON"
@@ -57521,7 +57946,7 @@ __exitcall_ebc_exit:
 	.string	"last_update_time"
 .LASF1152:
 	.string	"robust_list_head"
-.LASF3292:
+.LASF3293:
 	.string	"init_timer_key"
 .LASF1495:
 	.string	"NR_ANON_MAPPED"
@@ -57537,7 +57962,7 @@ __exitcall_ebc_exit:
 	.string	"srcversion"
 .LASF873:
 	.string	"pcpu_unit_offsets"
-.LASF3198:
+.LASF3199:
 	.string	"dma_sync_single_for_device"
 .LASF2974:
 	.string	"dsp_end_callback"
@@ -57603,7 +58028,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_INACTIVE_ANON"
 .LASF729:
 	.string	"nr_dirtied"
-.LASF3239:
+.LASF3240:
 	.string	"dev_get_drvdata"
 .LASF2410:
 	.string	"linear_revmap"
@@ -57647,11 +58072,11 @@ __exitcall_ebc_exit:
 	.string	"sysctl_memory_failure_early_kill"
 .LASF2775:
 	.string	"param_ops_bool_enable_only"
-.LASF3181:
+.LASF3182:
 	.string	"power_status"
 .LASF307:
 	.string	"__start_opd"
-.LASF3307:
+.LASF3308:
 	.string	"of_find_i2c_device_by_node"
 .LASF154:
 	.string	"SYSTEM_RUNNING"
@@ -57725,7 +58150,7 @@ __exitcall_ebc_exit:
 	.string	"taint_flags"
 .LASF1362:
 	.string	"membarrier_state"
-.LASF3189:
+.LASF3190:
 	.string	"pre_image_addr"
 .LASF2193:
 	.string	"suspend"
@@ -57793,7 +58218,7 @@ __exitcall_ebc_exit:
 	.string	"exit_code"
 .LASF1071:
 	.string	"exec_start"
-.LASF3336:
+.LASF3337:
 	.string	"printk"
 .LASF2396:
 	.string	"consumers"
@@ -57885,7 +58310,7 @@ __exitcall_ebc_exit:
 	.string	"optimistic_spin_queue"
 .LASF2979:
 	.string	"ebc_buffer_size"
-.LASF3313:
+.LASF3314:
 	.string	"ebc_pmic_set_vcom"
 .LASF2656:
 	.string	"ALLOCSTALL_NORMAL"
@@ -58057,13 +58482,13 @@ __exitcall_ebc_exit:
 	.string	"seq_show"
 .LASF767:
 	.string	"ate_match_dt"
-.LASF3237:
+.LASF3238:
 	.string	"of_node_put"
 .LASF1375:
 	.string	"cow_page"
 .LASF1607:
 	.string	"core_id"
-.LASF3185:
+.LASF3186:
 	.string	"ebc_get_2pix_wf_32"
 .LASF2504:
 	.string	"block"
@@ -58085,7 +58510,7 @@ __exitcall_ebc_exit:
 	.string	"gray_new_temp"
 .LASF1540:
 	.string	"kcompactd_classzone_idx"
-.LASF3227:
+.LASF3228:
 	.string	"kmalloc_index"
 .LASF884:
 	.string	"hrtimer_restart"
@@ -58195,7 +58620,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_DELAYED_BIT"
 .LASF1053:
 	.string	"nr_failed_migrations_affine"
-.LASF3242:
+.LASF3243:
 	.string	"IS_ERR"
 .LASF876:
 	.string	"PCPU_FC_EMBED"
@@ -58209,7 +58634,7 @@ __exitcall_ebc_exit:
 	.string	"pi_top_task"
 .LASF806:
 	.string	"WORK_NR_COLORS"
-.LASF3179:
+.LASF3180:
 	.string	"refresh_new_image2"
 .LASF528:
 	.string	"s_fsnotify_inode_refs"
@@ -58221,7 +58646,7 @@ __exitcall_ebc_exit:
 	.string	"uprobe"
 .LASF529:
 	.string	"s_readonly_remount"
-.LASF3270:
+.LASF3271:
 	.string	"kasan_check_write"
 .LASF378:
 	.string	"hlist_bl_node"
@@ -58247,7 +58672,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_FLAG_MASK"
 .LASF1286:
 	.string	"units"
-.LASF3285:
+.LASF3286:
 	.string	"epd_lut_from_mem_init"
 .LASF312:
 	.string	"__nosave_begin"
@@ -58267,7 +58692,7 @@ __exitcall_ebc_exit:
 	.string	"user_namespace"
 .LASF2771:
 	.string	"param_ops_ulong"
-.LASF3258:
+.LASF3259:
 	.string	"get_current"
 .LASF232:
 	.string	"raw_spinlock"
@@ -58301,9 +58726,9 @@ __exitcall_ebc_exit:
 	.string	"PGREFILL"
 .LASF2777:
 	.string	"param_ops_bint"
-.LASF3295:
+.LASF3296:
 	.string	"ebc_add_to_dsp_buf_list"
-.LASF3300:
+.LASF3301:
 	.string	"kfree"
 .LASF1817:
 	.string	"swap_deactivate"
@@ -58373,7 +58798,7 @@ __exitcall_ebc_exit:
 	.string	"boost_expires"
 .LASF2929:
 	.string	"DMA_BIDIRECTIONAL"
-.LASF3321:
+.LASF3322:
 	.string	"__arch_copy_to_user"
 .LASF236:
 	.string	"spinlock"
@@ -58415,7 +58840,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_OFFQ_POOL_BITS"
 .LASF1920:
 	.string	"fl_fasync"
-.LASF3192:
+.LASF3193:
 	.string	"update_mode"
 .LASF2956:
 	.string	"direct_mode"
@@ -58489,13 +58914,13 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_HIGH_WMARK_HIT_QUICKLY"
 .LASF3074:
 	.string	"ebc_state_read"
-.LASF3309:
+.LASF3310:
 	.string	"__stack_chk_fail"
 .LASF2927:
 	.string	"pmic_set_vcom"
 .LASF2714:
 	.string	"stack_guard_gap"
-.LASF3250:
+.LASF3251:
 	.string	"bytes"
 .LASF1753:
 	.string	"gpl_future_crcs"
@@ -58611,7 +59036,7 @@ __exitcall_ebc_exit:
 	.string	"MODULE_STATE_COMING"
 .LASF2246:
 	.string	"offline_disabled"
-.LASF3235:
+.LASF3236:
 	.string	"of_property_read_u32_array"
 .LASF2491:
 	.string	"select"
@@ -58679,7 +59104,7 @@ __exitcall_ebc_exit:
 	.string	"writeback_control"
 .LASF1919:
 	.string	"fl_end"
-.LASF3324:
+.LASF3325:
 	.string	"ebc_find_buf_by_phy_addr"
 .LASF1966:
 	.string	"super_operations"
@@ -58725,7 +59150,7 @@ __exitcall_ebc_exit:
 	.string	"enable"
 .LASF970:
 	.string	"pipe_bufs"
-.LASF3255:
+.LASF3256:
 	.string	"to_user"
 .LASF2139:
 	.string	"KOBJ_NS_TYPE_NET"
@@ -58761,9 +59186,9 @@ __exitcall_ebc_exit:
 	.string	"lookup"
 .LASF1605:
 	.string	"cpu_topology"
-.LASF3259:
+.LASF3260:
 	.string	"sp_el0"
-.LASF3328:
+.LASF3329:
 	.string	"ebc_dsp_buf_get"
 .LASF2916:
 	.string	"panel_color"
@@ -58793,7 +59218,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_AUTO"
 .LASF1242:
 	.string	"i_pages"
-.LASF3219:
+.LASF3220:
 	.string	"safe_ptr"
 .LASF377:
 	.string	"hlist_bl_head"
@@ -58833,7 +59258,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_LOW_WMARK_HIT_QUICKLY"
 .LASF1009:
 	.string	"syscfs"
-.LASF3212:
+.LASF3213:
 	.string	"wake_unlock"
 .LASF2460:
 	.string	"graph_get_port_parent"
@@ -58843,7 +59268,7 @@ __exitcall_ebc_exit:
 	.string	"UNEVICTABLE_PGRESCUED"
 .LASF2224:
 	.string	"msi_list"
-.LASF3261:
+.LASF3262:
 	.string	"__ilog2_u64"
 .LASF548:
 	.string	"compat_time_t"
@@ -58867,7 +59292,7 @@ __exitcall_ebc_exit:
 	.string	"cap_effective"
 .LASF1761:
 	.string	"taints"
-.LASF3280:
+.LASF3281:
 	.string	"of_address_to_resource"
 .LASF1027:
 	.string	"enqueued"
@@ -58895,7 +59320,7 @@ __exitcall_ebc_exit:
 	.string	"bd_private"
 .LASF1918:
 	.string	"fl_start"
-.LASF3234:
+.LASF3235:
 	.string	"out_value"
 .LASF1976:
 	.string	"freeze_fs"
@@ -58903,7 +59328,7 @@ __exitcall_ebc_exit:
 	.string	"sigset_t"
 .LASF1932:
 	.string	"lm_notify"
-.LASF3191:
+.LASF3192:
 	.string	"ebc_tcon_dsp_mode_set"
 .LASF895:
 	.string	"running"
@@ -58941,13 +59366,13 @@ __exitcall_ebc_exit:
 	.string	"copy_file_range"
 .LASF2700:
 	.string	"UNEVICTABLE_PGCLEARED"
-.LASF3314:
+.LASF3315:
 	.string	"epd_lut_get_wf_version"
 .LASF2062:
 	.string	"key_type"
 .LASF798:
 	.string	"WORK_STRUCT_LINKED_BIT"
-.LASF3252:
+.LASF3253:
 	.string	"copy_overflow"
 .LASF2456:
 	.string	"get_named_child_node"
@@ -58963,7 +59388,7 @@ __exitcall_ebc_exit:
 	.string	"module_kobject"
 .LASF3069:
 	.string	"memory"
-.LASF3226:
+.LASF3227:
 	.string	"order"
 .LASF740:
 	.string	"active_memcg"
@@ -59013,7 +59438,7 @@ __exitcall_ebc_exit:
 	.string	"arm64_ftr_reg_ctrel0"
 .LASF1259:
 	.string	"counters"
-.LASF3271:
+.LASF3272:
 	.string	"kasan_check_read"
 .LASF2074:
 	.string	"name_link"
@@ -59079,7 +59504,7 @@ __exitcall_ebc_exit:
 	.string	"nr_irqs"
 .LASF909:
 	.string	"max_hang_time"
-.LASF3215:
+.LASF3216:
 	.string	"copy_from_user"
 .LASF2482:
 	.string	"DOMAIN_BUS_ANY"
@@ -59093,7 +59518,7 @@ __exitcall_ebc_exit:
 	.string	"mmap_miss"
 .LASF1669:
 	.string	"quota_format_ops"
-.LASF3326:
+.LASF3327:
 	.string	"ebc_osd_buf_get"
 .LASF3088:
 	.string	"argp"
@@ -59133,7 +59558,7 @@ __exitcall_ebc_exit:
 	.string	"thread_keyring"
 .LASF2760:
 	.string	"kparam_array"
-.LASF3273:
+.LASF3274:
 	.string	"platform_driver_unregister"
 .LASF653:
 	.string	"utime"
@@ -59147,7 +59572,7 @@ __exitcall_ebc_exit:
 	.string	"ebc_driver"
 .LASF2620:
 	.string	"dev_page_free_t"
-.LASF3232:
+.LASF3233:
 	.string	"of_property_read_u32"
 .LASF1413:
 	.string	"guid_t"
@@ -59179,7 +59604,7 @@ __exitcall_ebc_exit:
 	.string	"cpumask_t"
 .LASF134:
 	.string	"kmsg_fops"
-.LASF3323:
+.LASF3324:
 	.string	"ebc_buf_release"
 .LASF820:
 	.string	"WORK_STRUCT_NO_POOL"
@@ -59201,7 +59626,7 @@ __exitcall_ebc_exit:
 	.string	"sched_rt_entity"
 .LASF117:
 	.string	"sendpage"
-.LASF3183:
+.LASF3184:
 	.string	"ret_val"
 .LASF881:
 	.string	"timerqueue_node"
@@ -59211,7 +59636,7 @@ __exitcall_ebc_exit:
 	.string	"mem_dqblk"
 .LASF2787:
 	.string	"plt_entry"
-.LASF3193:
+.LASF3194:
 	.string	"display_mode"
 .LASF1995:
 	.string	"nr_cached_objects"
@@ -59243,11 +59668,11 @@ __exitcall_ebc_exit:
 	.string	"fops"
 .LASF1288:
 	.string	"f_path"
-.LASF3287:
+.LASF3288:
 	.string	"kthread_create_on_node"
 .LASF712:
 	.string	"cgroups"
-.LASF3218:
+.LASF3219:
 	.string	"__uaccess_mask_ptr"
 .LASF2359:
 	.string	"probe_type"
@@ -59267,9 +59692,9 @@ __exitcall_ebc_exit:
 	.string	"userspace_clients"
 .LASF2158:
 	.string	"uevent_seqnum"
-.LASF3283:
+.LASF3284:
 	.string	"memset"
-.LASF3190:
+.LASF3191:
 	.string	"cur_image_addr"
 .LASF2159:
 	.string	"list_lock"
@@ -59317,7 +59742,7 @@ __exitcall_ebc_exit:
 	.string	"qf_fmt_id"
 .LASF1065:
 	.string	"nr_wakeups_idle"
-.LASF3331:
+.LASF3332:
 	.string	"up_write"
 .LASF1473:
 	.string	"NR_MLOCK"
@@ -59353,7 +59778,7 @@ __exitcall_ebc_exit:
 	.string	"console_printk"
 .LASF703:
 	.string	"ioac"
-.LASF3245:
+.LASF3246:
 	.string	"__init_work"
 .LASF1186:
 	.string	"nr_to_scan"
@@ -59365,7 +59790,7 @@ __exitcall_ebc_exit:
 	.string	"exec_max"
 .LASF1418:
 	.string	"uuid_index"
-.LASF3246:
+.LASF3247:
 	.string	"onstack"
 .LASF190:
 	.string	"compat_rmtp"
@@ -59377,7 +59802,7 @@ __exitcall_ebc_exit:
 	.string	"nfs_fl"
 .LASF403:
 	.string	"dentry"
-.LASF3263:
+.LASF3264:
 	.string	"__be32_to_cpup"
 .LASF2181:
 	.string	"klist_node"
@@ -59461,7 +59886,7 @@ __exitcall_ebc_exit:
 	.string	"d_rt_space"
 .LASF265:
 	.string	"name"
-.LASF3293:
+.LASF3294:
 	.string	"mod_timer"
 .LASF151:
 	.string	"early_boot_irqs_disabled"
@@ -59545,13 +59970,13 @@ __exitcall_ebc_exit:
 	.string	"ebc_wq"
 .LASF737:
 	.string	"memcg_oom_gfp_mask"
-.LASF3248:
+.LASF3249:
 	.string	"_msecs_to_jiffies"
 .LASF1698:
 	.string	"d_spc_timer"
 .LASF1774:
 	.string	"jump_entries"
-.LASF3256:
+.LASF3257:
 	.string	"test_ti_thread_flag"
 .LASF2270:
 	.string	"async_suspend"
@@ -59561,7 +59986,7 @@ __exitcall_ebc_exit:
 	.string	"read_pos"
 .LASF482:
 	.string	"super_block"
-.LASF3220:
+.LASF3221:
 	.string	"__addr"
 .LASF2337:
 	.string	"dma_coherent"
@@ -59607,11 +60032,11 @@ __exitcall_ebc_exit:
 	.string	"devkmsg_log_str"
 .LASF255:
 	.string	"FTR_HIGHER_SAFE"
-.LASF3231:
+.LASF3232:
 	.string	"i2c_get_clientdata"
-.LASF3216:
+.LASF3217:
 	.string	"_copy_to_user"
-.LASF3266:
+.LASF3267:
 	.string	"test_bit"
 .LASF249:
 	.string	"__start___jump_table"
@@ -59643,9 +60068,9 @@ __exitcall_ebc_exit:
 	.string	"futex"
 .LASF1040:
 	.string	"wait_max"
-.LASF3291:
+.LASF3292:
 	.string	"wakeup_source_add"
-.LASF3209:
+.LASF3210:
 	.string	"ebc_pmic_suspend"
 .LASF1173:
 	.string	"result_mask"
@@ -59657,9 +60082,9 @@ __exitcall_ebc_exit:
 	.string	"dquot_operations"
 .LASF1239:
 	.string	"mapping"
-.LASF3241:
+.LASF3242:
 	.string	"resource_size"
-.LASF3288:
+.LASF3289:
 	.string	"wake_up_process"
 .LASF1369:
 	.string	"kioctx_table"
@@ -59691,7 +60116,7 @@ __exitcall_ebc_exit:
 	.string	"__initdata_end"
 .LASF2516:
 	.string	"bus_lock"
-.LASF3228:
+.LASF3229:
 	.string	"kmalloc_type"
 .LASF388:
 	.string	"qstr"
@@ -59705,7 +60130,7 @@ __exitcall_ebc_exit:
 	.string	"WORKINGSET_RESTORE"
 .LASF629:
 	.string	"sched_psi_wake_requeue"
-.LASF3249:
+.LASF3250:
 	.string	"check_copy_size"
 .LASF738:
 	.string	"memcg_oom_order"
@@ -59761,7 +60186,7 @@ __exitcall_ebc_exit:
 	.string	"core_state"
 .LASF883:
 	.string	"timerqueue_head"
-.LASF3290:
+.LASF3291:
 	.string	"sched_setscheduler_nocheck"
 .LASF1306:
 	.string	"f_wb_err"
@@ -59769,7 +60194,7 @@ __exitcall_ebc_exit:
 	.string	"rt_mutex"
 .LASF1005:
 	.string	"rchar"
-.LASF3201:
+.LASF3202:
 	.string	"valid_dma_direction"
 .LASF1833:
 	.string	"bd_contains"
@@ -59885,13 +60310,13 @@ __exitcall_ebc_exit:
 	.string	"need"
 .LASF505:
 	.string	"s_encoding"
-.LASF3244:
+.LASF3245:
 	.string	"queue_work"
 .LASF1749:
 	.string	"gpl_crcs"
 .LASF1735:
 	.string	"get_state"
-.LASF3204:
+.LASF3205:
 	.string	"dma_handle"
 .LASF1374:
 	.string	"orig_pte"
@@ -59965,7 +60390,7 @@ __exitcall_ebc_exit:
 	.string	"__ctors_end"
 .LASF2281:
 	.string	"wakeup_path"
-.LASF3310:
+.LASF3311:
 	.string	"ebc_buf_state_show"
 .LASF983:
 	.string	"vm_prev"
@@ -59981,7 +60406,7 @@ __exitcall_ebc_exit:
 	.string	"__u8"
 .LASF116:
 	.string	"lock"
-.LASF3208:
+.LASF3209:
 	.string	"ebc_pmic_resume"
 .LASF1577:
 	.string	"compact_cached_migrate_pfn"
@@ -60023,7 +60448,7 @@ __exitcall_ebc_exit:
 	.string	"compact_order_failed"
 .LASF1120:
 	.string	"fsuid"
-.LASF3257:
+.LASF3258:
 	.string	"flag"
 .LASF1490:
 	.string	"NR_ISOLATED_FILE"
@@ -60035,9 +60460,9 @@ __exitcall_ebc_exit:
 	.string	"managed_pages"
 .LASF2604:
 	.string	"__tracepoint_page_ref_set"
-.LASF3197:
+.LASF3198:
 	.string	"ebc_tcon_enable"
-.LASF3338:
+.LASF3339:
 	.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"
@@ -60085,13 +60510,13 @@ __exitcall_ebc_exit:
 	.string	"s_vop"
 .LASF1665:
 	.string	"qf_owner"
-.LASF3272:
+.LASF3273:
 	.string	"__write_once_size"
 .LASF2846:
 	.string	"kmalloc_cache_type"
 .LASF575:
 	.string	"mutex"
-.LASF3236:
+.LASF3237:
 	.string	"out_values"
 .LASF854:
 	.string	"pgd_t"
@@ -60105,9 +60530,9 @@ __exitcall_ebc_exit:
 	.string	"raw_spinlock_t"
 .LASF2954:
 	.string	"vir_width"
-.LASF3341:
+.LASF3342:
 	.string	"epd_overlay_lut"
-.LASF3260:
+.LASF3261:
 	.string	"INIT_LIST_HEAD"
 .LASF1953:
 	.string	"fs_flags"
@@ -60125,7 +60550,7 @@ __exitcall_ebc_exit:
 	.string	"resume_frame_count"
 .LASF1204:
 	.string	"radix_tree_node"
-.LASF3262:
+.LASF3263:
 	.string	"sign_extend64"
 .LASF2328:
 	.string	"wake_irq"
@@ -60147,13 +60572,13 @@ __exitcall_ebc_exit:
 	.string	"ptraced"
 .LASF2766:
 	.string	"param_ops_short"
-.LASF3305:
+.LASF3306:
 	.string	"of_find_device_by_node"
 .LASF2568:
 	.string	"HRTIMER_SOFTIRQ"
 .LASF802:
 	.string	"WORK_STRUCT_DELAYED"
-.LASF3182:
+.LASF3183:
 	.string	"ebc_get_2pix_wf_part_32"
 .LASF455:
 	.string	"i_sequence"
@@ -60175,7 +60600,7 @@ __exitcall_ebc_exit:
 	.string	"addr"
 .LASF2400:
 	.string	"device_private"
-.LASF3199:
+.LASF3200:
 	.string	"get_dma_ops"
 .LASF2712:
 	.string	"watermark_scale_factor"
@@ -60191,7 +60616,7 @@ __exitcall_ebc_exit:
 	.string	"mkobj"
 .LASF2981:
 	.string	"direct_buf_real_size"
-.LASF3327:
+.LASF3328:
 	.string	"__pm_relax"
 .LASF473:
 	.string	"d_delete"
@@ -60321,7 +60746,7 @@ __exitcall_ebc_exit:
 	.string	"buffer_new"
 .LASF213:
 	.string	"user_fpsimd_state"
-.LASF3304:
+.LASF3305:
 	.string	"device_create_file"
 .LASF521:
 	.string	"s_time_gran"
@@ -60349,7 +60774,7 @@ __exitcall_ebc_exit:
 	.string	"image_new_tmp"
 .LASF1746:
 	.string	"num_kp"
-.LASF3337:
+.LASF3338:
 	.string	"__pm_stay_awake"
 .LASF2579:
 	.string	"vmap_area_list"
@@ -60397,6 +60822,8 @@ __exitcall_ebc_exit:
 	.string	"pgoff"
 .LASF2236:
 	.string	"of_node"
+.LASF3179:
+	.string	"refresh_new_image_auto_32"
 .LASF2900:
 	.string	"EPD_PART_GCC16"
 .LASF2034:
@@ -60577,7 +61004,7 @@ __exitcall_ebc_exit:
 	.string	"maj_flt"
 .LASF229:
 	.string	"arch_rwlock_t"
-.LASF3325:
+.LASF3326:
 	.string	"ebc_osd_buf_clone"
 .LASF162:
 	.string	"c_false"
@@ -60603,7 +61030,7 @@ __exitcall_ebc_exit:
 	.string	"minor"
 .LASF1713:
 	.string	"nextents"
-.LASF3202:
+.LASF3203:
 	.string	"dma_direction"
 .LASF1:
 	.string	"sizetype"
@@ -60627,7 +61054,7 @@ __exitcall_ebc_exit:
 	.string	"next_timer"
 .LASF741:
 	.string	"throttle_queue"
-.LASF3320:
+.LASF3321:
 	.string	"finish_wait"
 .LASF1494:
 	.string	"WORKINGSET_NODERECLAIM"
@@ -60639,7 +61066,7 @@ __exitcall_ebc_exit:
 	.string	"keyring_index_key"
 .LASF833:
 	.string	"__WQ_ORDERED"
-.LASF3196:
+.LASF3197:
 	.string	"ebc_tcon_disable"
 .LASF1435:
 	.string	"leases_enable"
@@ -60681,7 +61108,7 @@ __exitcall_ebc_exit:
 	.string	"num_vf"
 .LASF1549:
 	.string	"isolate_mode_t"
-.LASF3203:
+.LASF3204:
 	.string	"debug_dma_sync_single_for_device"
 .LASF99:
 	.string	"llseek"
@@ -60723,7 +61150,7 @@ __exitcall_ebc_exit:
 	.string	"target"
 .LASF2560:
 	.string	"HI_SOFTIRQ"
-.LASF3205:
+.LASF3206:
 	.string	"direction"
 .LASF3172:
 	.string	"image_bg_data"
@@ -60749,7 +61176,7 @@ __exitcall_ebc_exit:
 	.string	"i2c_bus_type"
 .LASF899:
 	.string	"hrtimer_cpu_base"
-.LASF3332:
+.LASF3333:
 	.string	"ebc_notify"
 .LASF1405:
 	.string	"cb_head"
@@ -60777,7 +61204,7 @@ __exitcall_ebc_exit:
 	.string	"cpus_requested"
 .LASF2608:
 	.string	"__tracepoint_page_ref_mod_unless"
-.LASF3213:
+.LASF3214:
 	.string	"wake_lock_init"
 .LASF1200:
 	.string	"list_lru"
@@ -60803,7 +61230,7 @@ __exitcall_ebc_exit:
 	.string	"d_iput"
 .LASF108:
 	.string	"compat_ioctl"
-.LASF3221:
+.LASF3222:
 	.string	"__range_ok"
 .LASF287:
 	.string	"__start_ro_after_init"
@@ -60811,7 +61238,7 @@ __exitcall_ebc_exit:
 	.string	"num_poisoned_pages"
 .LASF919:
 	.string	"filter"
-.LASF3206:
+.LASF3207:
 	.string	"ebc_pmic_get_vcom"
 .LASF2962:
 	.string	"ebc_tcon"
@@ -60923,11 +61350,11 @@ __exitcall_ebc_exit:
 	.string	"power"
 .LASF266:
 	.string	"strict_mask"
-.LASF3319:
+.LASF3320:
 	.string	"init_wait_entry"
 .LASF2801:
 	.string	"module_state"
-.LASF3275:
+.LASF3276:
 	.string	"_dev_info"
 .LASF417:
 	.string	"d_subdirs"
@@ -60973,9 +61400,9 @@ __exitcall_ebc_exit:
 	.string	"removed_mem"
 .LASF248:
 	.string	"jump_label_t"
-.LASF3306:
+.LASF3307:
 	.string	"of_get_property"
-.LASF3187:
+.LASF3188:
 	.string	"ebc_tcon_frame_start"
 .LASF2726:
 	.string	"Elf64_Half"
@@ -61015,11 +61442,11 @@ __exitcall_ebc_exit:
 	.string	"init_on_free"
 .LASF1166:
 	.string	"nr_pages"
-.LASF3180:
+.LASF3181:
 	.string	"ebc_power_set"
 .LASF1776:
 	.string	"num_trace_bprintk_fmt"
-.LASF3269:
+.LASF3270:
 	.string	"__fls"
 .LASF1144:
 	.string	"ioprio"
@@ -61045,9 +61472,9 @@ __exitcall_ebc_exit:
 	.string	"persistent_clock_is_local"
 .LASF2428:
 	.string	"dma_supported"
-.LASF3238:
+.LASF3239:
 	.string	"dev_set_drvdata"
-.LASF3333:
+.LASF3334:
 	.string	"epd_lut_get"
 .LASF1550:
 	.string	"per_cpu_pages"
@@ -61083,7 +61510,7 @@ __exitcall_ebc_exit:
 	.string	"BLOCK_SOFTIRQ"
 .LASF1426:
 	.string	"files_stat_struct"
-.LASF3281:
+.LASF3282:
 	.string	"devm_memremap"
 .LASF858:
 	.string	"pgtable_t"
@@ -61113,7 +61540,7 @@ __exitcall_ebc_exit:
 	.string	"WAKE_LOCK_SUSPEND"
 .LASF1792:
 	.string	"WRITE_LIFE_SHORT"
-.LASF3264:
+.LASF3265:
 	.string	"__swab32p"
 .LASF286:
 	.string	"_einittext"
@@ -61155,7 +61582,7 @@ __exitcall_ebc_exit:
 	.string	"rm_xquota"
 .LASF1099:
 	.string	"dl_timer"
-.LASF3315:
+.LASF3316:
 	.string	"remap_pfn_range"
 .LASF2390:
 	.string	"DL_DEV_NO_DRIVER"
@@ -61169,7 +61596,7 @@ __exitcall_ebc_exit:
 	.string	"watermark"
 .LASF2438:
 	.string	"deadprops"
-.LASF3277:
+.LASF3278:
 	.string	"devm_kmalloc"
 .LASF16:
 	.string	"long long unsigned int"
@@ -61305,7 +61732,7 @@ __exitcall_ebc_exit:
 	.string	"free_list"
 .LASF590:
 	.string	"prio"
-.LASF3230:
+.LASF3231:
 	.string	"platform_get_drvdata"
 .LASF2570:
 	.string	"NR_SOFTIRQS"
@@ -61327,7 +61754,7 @@ __exitcall_ebc_exit:
 	.string	"atomic_t"
 .LASF813:
 	.string	"WORK_OFFQ_FLAG_BITS"
-.LASF3188:
+.LASF3189:
 	.string	"ebc_tcon_image_addr_set"
 .LASF2546:
 	.string	"max_num_msgs"
@@ -61347,7 +61774,7 @@ __exitcall_ebc_exit:
 	.string	"scatterlist"
 .LASF1282:
 	.string	"altmap_valid"
-.LASF3335:
+.LASF3336:
 	.string	"down"
 .LASF102:
 	.string	"read_iter"
@@ -61385,7 +61812,7 @@ __exitcall_ebc_exit:
 	.string	"pm_domain_data"
 .LASF2502:
 	.string	"byte"
-.LASF3301:
+.LASF3302:
 	.string	"__wake_up_sync"
 .LASF2017:
 	.string	"poll_table_struct"
@@ -61411,7 +61838,7 @@ __exitcall_ebc_exit:
 	.string	"page_fault"
 .LASF1484:
 	.string	"NR_INACTIVE_FILE"
-.LASF3253:
+.LASF3254:
 	.string	"__ret_warn_on"
 .LASF1640:
 	.string	"kqid"
@@ -61535,7 +61962,7 @@ __exitcall_ebc_exit:
 	.string	"of_match_table"
 .LASF2593:
 	.string	"percpu_count_ptr"
-.LASF3316:
+.LASF3317:
 	.string	"ebc_phy_buf_base_get"
 .LASF2094:
 	.string	"loops_per_jiffy"
@@ -61559,7 +61986,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_INODESTEAL"
 .LASF1190:
 	.string	"count_objects"
-.LASF3268:
+.LASF3269:
 	.string	"fls64"
 .LASF936:
 	.string	"_stime"
@@ -61595,11 +62022,11 @@ __exitcall_ebc_exit:
 	.string	"sync_sg_for_device"
 .LASF1979:
 	.string	"statfs"
-.LASF3296:
+.LASF3297:
 	.string	"__kmalloc"
-.LASF3284:
+.LASF3285:
 	.string	"_dev_err"
-.LASF3274:
+.LASF3275:
 	.string	"__platform_driver_register"
 .LASF2980:
 	.string	"ebc_buf_real_size"
@@ -61699,7 +62126,7 @@ __exitcall_ebc_exit:
 	.string	"i_acl"
 .LASF1804:
 	.string	"bmap"
-.LASF3282:
+.LASF3283:
 	.string	"ebc_buf_init"
 .LASF2063:
 	.string	"key_payload"
@@ -61739,7 +62166,7 @@ __exitcall_ebc_exit:
 	.string	"fallocate"
 .LASF1722:
 	.string	"i_spc_warnlimit"
-.LASF3254:
+.LASF3255:
 	.string	"check_object_size"
 .LASF1530:
 	.string	"node_present_pages"
@@ -61789,8 +62216,6 @@ __exitcall_ebc_exit:
 	.string	"__idmap_text_start"
 .LASF1731:
 	.string	"set_info"
-.LASF3044:
-	.string	"__addressable_ebc_init3091"
 .LASF3086:
 	.string	"ebc_mmap"
 .LASF2634:
@@ -61805,7 +62230,7 @@ __exitcall_ebc_exit:
 	.string	"hiwater_vm"
 .LASF3077:
 	.string	"pmic_vcom_read"
-.LASF3276:
+.LASF3277:
 	.string	"misc_deregister"
 .LASF1263:
 	.string	"compound_head"
@@ -61825,7 +62250,7 @@ __exitcall_ebc_exit:
 	.string	"bd_write_holder"
 .LASF2209:
 	.string	"poweroff_noirq"
-.LASF3279:
+.LASF3280:
 	.string	"of_parse_phandle"
 .LASF1873:
 	.string	"rename"
@@ -61855,9 +62280,9 @@ __exitcall_ebc_exit:
 	.string	"sync_single_for_cpu"
 .LASF794:
 	.string	"data"
-.LASF3223:
+.LASF3224:
 	.string	"kzalloc"
-.LASF3247:
+.LASF3248:
 	.string	"msecs_to_jiffies"
 .LASF1934:
 	.string	"lm_break"
@@ -61893,7 +62318,7 @@ __exitcall_ebc_exit:
 	.string	"signed char"
 .LASF376:
 	.string	"rcu_scheduler_active"
-.LASF3233:
+.LASF3234:
 	.string	"propname"
 .LASF2116:
 	.string	"priv"
@@ -62009,7 +62434,7 @@ __exitcall_ebc_exit:
 	.string	"WQ_MAX_UNBOUND_PER_CPU"
 .LASF1552:
 	.string	"per_cpu_pageset"
-.LASF3289:
+.LASF3290:
 	.string	"__alloc_workqueue_key"
 .LASF760:
 	.string	"status"
@@ -62023,7 +62448,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_GCC16"
 .LASF2529:
 	.string	"i2c_lock_operations"
-.LASF3184:
+.LASF3185:
 	.string	"ebc_get_4pix_wf_part"
 .LASF1635:
 	.string	"USRQUOTA"
@@ -62071,7 +62496,7 @@ __exitcall_ebc_exit:
 	.string	"procname"
 .LASF3162:
 	.string	"point_data"
-.LASF3286:
+.LASF3287:
 	.string	"epd_lut_from_file_init"
 .LASF1684:
 	.string	"mark_dirty"
@@ -62227,7 +62652,7 @@ __exitcall_ebc_exit:
 	.string	"percpu_size"
 .LASF1338:
 	.string	"mmap_sem"
-.LASF3317:
+.LASF3318:
 	.string	"schedule"
 .LASF2457:
 	.string	"get_reference_args"
@@ -62431,7 +62856,7 @@ __exitcall_ebc_exit:
 	.string	"compound_mapcount"
 .LASF1464:
 	.string	"zone_stat_item"
-.LASF3225:
+.LASF3226:
 	.string	"kmalloc_large"
 .LASF2641:
 	.string	"PE_SIZE_PMD"
@@ -62503,7 +62928,7 @@ __exitcall_ebc_exit:
 	.string	"last_waited"
 .LASF3085:
 	.string	"ebc_open"
-.LASF3194:
+.LASF3195:
 	.string	"three_win_mode"
 .LASF2890:
 	.string	"EPD_OVERLAY"
@@ -62557,7 +62982,7 @@ __exitcall_ebc_exit:
 	.string	"timer_expires"
 .LASF2842:
 	.string	"mmlist_lock"
-.LASF3211:
+.LASF3212:
 	.string	"ebc_pmic_power_on"
 .LASF1780:
 	.string	"trace_evals"
@@ -62601,7 +63026,7 @@ __exitcall_ebc_exit:
 	.string	"relax_count"
 .LASF1428:
 	.string	"nr_free_files"
-.LASF3224:
+.LASF3225:
 	.string	"kmalloc"
 	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
 	.section	.note.GNU-stack,"",@progbits

commit 0977fab5015aac603570a2141e9532bf1b6d3639
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Tue Nov 30 17:25:09 2021 +0800

    drm/rockchip: vop2: Make sure the primary plane type is DRM_PLANE_TYPE_PRIMARY
    
    Some times we want change a overlay plane defined in vop2_reg
    to primary plane.
    
    Change-Id: I5f563fb258a66278255be762ebdfca21b51aabd1
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 4d8ab6698a3f..01da5d4ac406 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -6216,8 +6216,10 @@ static int vop2_create_crtc(struct vop2 *vop2)
 
 		if (vp->primary_plane_phy_id >= 0) {
 			win = vop2_find_win_by_phys_id(vop2, vp->primary_plane_phy_id);
-			if (win)
+			if (win) {
 				find_primary_plane = true;
+				win->type = DRM_PLANE_TYPE_PRIMARY;
+			}
 		} else {
 			while (j < vop2->registered_num_wins) {
 				be_used_for_primary_plane = false;

commit ce8d8b58872b5d624e6bfd3fc6d4fd91127df4bf
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Thu Nov 25 14:58:14 2021 +0800

    drm/rockchip: ebc_dev: release version v2.17
    
    fix check part buf size for regal mode
    support change overlay mode lut
    fix overlay refresh uncomplete
    fix overlay bw framecout
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: Icf5b5e5536e33d1225091abb3ce263be4057a6d6

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index 0ea44039e6c6..19bfe1811bf4 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -21,7 +21,7 @@ __initcall_ebc_init6s:
 	.p2align 3,,7
 	.type	get_auto_image, %function
 get_auto_image:
-.LFB2813:
+.LFB2814:
 	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
 	.loc 1 458 0
 	.cfi_startproc
@@ -523,388 +523,483 @@ get_auto_image:
 	.cfi_restore 30
 	ret
 	.cfi_endproc
-.LFE2813:
+.LFE2814:
 	.size	get_auto_image, .-get_auto_image
 	.align	2
 	.p2align 3,,7
 	.type	get_overlay_image, %function
 get_overlay_image:
-.LFB2814:
+.LFB2815:
 	.loc 1 623 0
 	.cfi_startproc
 .LVL32:
+	stp	x29, x30, [sp, -96]!
+	.cfi_def_cfa_offset 96
+	.cfi_offset 29, -96
+	.cfi_offset 30, -88
 	.loc 1 624 0
 	adrp	x5, .LANCHOR0
-	.loc 1 632 0
-	ldrb	w11, [x4, 48]
-.LVL33:
+	.loc 1 623 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
 	.loc 1 624 0
-	ldr	x16, [x5, #:lo12:.LANCHOR0]
+	ldr	x17, [x5, #:lo12:.LANCHOR0]
+	.loc 1 623 0
+	stp	x19, x20, [sp, 16]
 	.loc 1 636 0
-	add	x16, x16, 24
-	ldr	w18, [x16, 156]
+	add	x17, x17, 24
+	.loc 1 623 0
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	str	x27, [sp, 80]
+	.cfi_offset 19, -80
+	.cfi_offset 20, -72
+	.cfi_offset 21, -64
+	.cfi_offset 22, -56
+	.cfi_offset 23, -48
+	.cfi_offset 24, -40
+	.cfi_offset 25, -32
+	.cfi_offset 26, -24
+	.cfi_offset 27, -16
 	.loc 1 642 0
-	ldp	w12, w17, [x16, 84]
+	ldp	w11, w18, [x17, 84]
+	.loc 1 636 0
+	ldr	w30, [x17, 156]
 	.loc 1 644 0
 	str	wzr, [x4, 52]
-.LVL34:
+.LVL33:
 	.loc 1 650 0
-	cmp	w17, 0
-	ble	.L119
-	lsr	w12, w12, 3
+	cmp	w18, 0
+	ble	.L66
+	lsr	w11, w11, 3
+.LVL34:
+	mov	w13, 0
 .LVL35:
-	.loc 1 623 0
-	stp	x29, x30, [sp, -64]!
-	.cfi_def_cfa_offset 64
-	.cfi_offset 29, -64
-	.cfi_offset 30, -56
-	sub	w15, w12, #1
-	.loc 1 650 0
-	mov	w14, 0
-.LVL36:
-	add	x15, x15, 1
-	.loc 1 623 0
-	add	x29, sp, 0
-	.cfi_def_cfa_register 29
-	lsl	x30, x15, 3
-	lsl	x15, x15, 2
-	stp	x19, x20, [sp, 16]
-	stp	x21, x22, [sp, 32]
+	sub	w16, w11, #1
 	.loc 1 662 0
-	mov	w13, 1
-	.loc 1 623 0
-	stp	x23, x24, [sp, 48]
-	.cfi_offset 19, -48
-	.cfi_offset 20, -40
-	.cfi_offset 21, -32
-	.cfi_offset 22, -24
-	.cfi_offset 23, -16
-	.cfi_offset 24, -8
-.LVL37:
+	mov	w12, 1
+	add	x16, x16, 1
+	.loc 1 800 0
+	mov	w15, -268435456
+	lsl	x19, x16, 3
+	lsl	x16, x16, 2
+	.loc 1 782 0
+	mov	w14, 251658240
+.LVL36:
 	.p2align 2
-.L91:
+.L99:
 	.loc 1 651 0
-	cbz	w18, .L68
+	cbz	w30, .L68
 	.loc 1 652 0
-	ldp	w5, w10, [x16, 84]
-.LVL38:
+	ldp	w5, w10, [x17, 84]
+.LVL37:
 	sub	w10, w10, #1
-	sub	w10, w10, w14
+	sub	w10, w10, w13
 	mul	w10, w10, w5
 	lsr	w10, w10, 2
 	add	x10, x0, x10
-.LVL39:
+.LVL38:
 .L71:
 	add	x10, x10, 2
-.LVL40:
-	add	x6, x3, 8
+.LVL39:
+	add	x7, x3, 8
 	.loc 1 656 0 discriminator 1
 	mov	x9, 0
-	cbz	w12, .L70
+	cbz	w11, .L70
 	.p2align 2
-.L107:
+.L131:
 	.loc 1 659 0
-	ldr	w7, [x1, x9, lsl 2]
-.LVL41:
+	ldr	w5, [x1, x9, lsl 2]
+.LVL40:
 	.loc 1 660 0
-	ldr	w5, [x2, x9, lsl 2]
-.LVL42:
+	ldr	w6, [x2, x9, lsl 2]
+.LVL41:
 	.loc 1 661 0
-	cmp	w7, w5
+	cmp	w5, w6
 	beq	.L72
 	.loc 1 663 0
-	eor	w8, w7, w5
+	eor	w8, w5, w6
 	.loc 1 662 0
-	str	w13, [x4, 52]
+	str	w12, [x4, 52]
 	.loc 1 658 0
-	mov	w19, 0
+	mov	w20, 0
 	.loc 1 664 0
 	tst	x8, 15
 	beq	.L73
 	.loc 1 666 0
-	ldrb	w21, [x6, -8]
+	ldrb	w21, [x7, -8]
 	.loc 1 668 0
-	ubfiz	w19, w5, 8, 8
-	ldr	x22, [x4, 128]
-	add	w19, w19, w7, uxtb
+	ubfiz	w20, w6, 8, 8
+	ldr	x23, [x4, 128]
+	add	w20, w20, w5, uxtb
+	.loc 1 674 0
+	ldrb	w22, [x4, 48]
+	.loc 1 667 0
+	lsl	w25, w21, 16
+	.loc 1 668 0
+	add	x20, x23, x20
+	.loc 1 672 0
+	ldrb	w24, [x4, 49]
+	.loc 1 671 0
+	ands	w23, w5, 15
+	.loc 1 672 0
+	ccmp	w23, 15, 4, ne
 	.loc 1 670 0
-	add	w20, w21, 1
+	add	w21, w21, 1
 	.loc 1 668 0
-	add	x19, x22, x19
-	.loc 1 667 0
-	lsl	w21, w21, 16
+	ldrb	w20, [x20, w25, sxtw]
 	.loc 1 670 0
-	and	w20, w20, 255
-	.loc 1 675 0
-	cmp	w11, w20
+	and	w21, w21, 255
+	.loc 1 672 0
+	csel	w22, w22, w24, ne
 	.loc 1 668 0
-	ldrb	w19, [x19, w21, sxtw]
-	and	w19, w19, 3
+	and	w20, w20, 3
 	.loc 1 675 0
-	beq	.L122
-.L74:
+	cmp	w22, w21
+	beq	.L143
+.L75:
 	.loc 1 679 0
-	strb	w20, [x6, -8]
+	strb	w21, [x7, -8]
 .L73:
 	.loc 1 682 0
 	tst	w8, 240
-	beq	.L75
-	.loc 1 686 0
-	lsr	w20, w5, 4
+	beq	.L76
 	.loc 1 684 0
-	ldrb	w21, [x6, -7]
+	ldrb	w22, [x7, -7]
 	.loc 1 686 0
-	ubfx	x22, x7, 4, 8
-	ubfiz	w20, w20, 8, 8
-	add	w20, w20, w22
-	ldr	x22, [x4, 128]
+	lsr	w21, w6, 4
+	ubfx	x23, x5, 4, 8
+	ubfiz	w21, w21, 8, 8
+	ldr	x24, [x4, 128]
+	add	w21, w21, w23
 	.loc 1 685 0
-	lsl	w23, w21, 16
+	lsl	w27, w22, 16
+	.loc 1 683 0
+	and	w25, w5, 240
+	.loc 1 686 0
+	add	x24, x24, x21
 	.loc 1 688 0
-	add	w21, w21, 1
+	add	w21, w22, 1
+	.loc 1 692 0
+	ldrb	w23, [x4, 48]
+	.loc 1 689 0
+	cmp	w25, 240
+	.loc 1 690 0
+	ldrb	w26, [x4, 49]
+	ccmp	w25, 0, 4, ne
 	.loc 1 686 0
-	add	x20, x22, x20
+	ldrb	w22, [x24, w27, sxtw]
 	.loc 1 688 0
 	and	w21, w21, 255
+	.loc 1 690 0
+	csel	w23, w23, w26, ne
 	.loc 1 693 0
-	cmp	w11, w21
-	.loc 1 686 0
-	ldrb	w20, [x20, w23, sxtw]
+	cmp	w23, w21
 	.loc 1 687 0
-	ubfiz	w20, w20, 2, 2
-	orr	w19, w20, w19
+	ubfiz	w22, w22, 2, 2
+	orr	w20, w22, w20
 	.loc 1 693 0
-	beq	.L123
-.L76:
+	beq	.L144
+.L78:
 	.loc 1 697 0
-	strb	w21, [x6, -7]
-.L75:
+	strb	w21, [x7, -7]
+.L76:
 	.loc 1 700 0
 	tst	w8, 3840
-	beq	.L77
+	beq	.L79
 	.loc 1 702 0
-	ldrb	w22, [x6, -6]
+	ldrb	w21, [x7, -6]
 	.loc 1 704 0
-	and	w21, w5, 65280
-	ldr	x23, [x4, 128]
-	ubfx	x20, x7, 8, 8
-	orr	w20, w20, w21
-	.loc 1 706 0
-	add	w21, w22, 1
+	and	w23, w6, 65280
+	ldr	x24, [x4, 128]
+	ubfx	x22, x5, 8, 8
+	orr	w22, w22, w23
+	.loc 1 701 0
+	and	w23, w5, 3840
 	.loc 1 703 0
-	lsl	w22, w22, 16
+	lsl	w26, w21, 16
+	.loc 1 708 0
+	ldrb	w25, [x4, 49]
+	.loc 1 704 0
+	add	x22, x24, x22, uxth
+	.loc 1 707 0
+	cmp	w23, 3840
+	.loc 1 710 0
+	ldrb	w24, [x4, 48]
+	.loc 1 708 0
+	ccmp	w23, 0, 4, ne
 	.loc 1 706 0
-	and	w21, w21, 255
+	add	w21, w21, 1
 	.loc 1 704 0
-	add	x20, x23, x20, uxth
+	ldrb	w22, [x22, w26, sxtw]
+	.loc 1 706 0
+	and	w21, w21, 255
+	.loc 1 708 0
+	csel	w24, w24, w25, ne
 	.loc 1 711 0
-	cmp	w11, w21
-	.loc 1 704 0
-	ldrb	w20, [x20, w22, sxtw]
+	cmp	w24, w21
 	.loc 1 705 0
-	ubfiz	w20, w20, 4, 2
-	orr	w19, w20, w19
+	ubfiz	w22, w22, 4, 2
+	orr	w20, w22, w20
 	.loc 1 711 0
-	beq	.L124
-.L78:
+	beq	.L145
+.L81:
 	.loc 1 715 0
-	strb	w21, [x6, -6]
-.L77:
+	strb	w21, [x7, -6]
+.L79:
 	.loc 1 718 0
 	tst	w8, 61440
-	beq	.L79
-	.loc 1 722 0
-	lsr	w20, w5, 12
+	beq	.L82
 	.loc 1 720 0
-	ldrb	w21, [x6, -5]
+	ldrb	w22, [x7, -5]
 	.loc 1 722 0
-	ubfx	x22, x7, 12, 8
-	ubfiz	w20, w20, 8, 8
-	add	w20, w20, w22
-	ldr	x22, [x4, 128]
+	lsr	w21, w6, 12
+	ubfx	x23, x5, 12, 8
+	ubfiz	w21, w21, 8, 8
+	ldr	x24, [x4, 128]
+	add	w21, w21, w23
 	.loc 1 721 0
-	lsl	w23, w21, 16
+	lsl	w27, w22, 16
+	.loc 1 719 0
+	and	w25, w5, 61440
+	.loc 1 722 0
+	add	x24, x24, x21
 	.loc 1 724 0
-	add	w21, w21, 1
+	add	w21, w22, 1
+	.loc 1 728 0
+	ldrb	w23, [x4, 48]
+	.loc 1 725 0
+	cmp	w25, 61440
+	.loc 1 726 0
+	ldrb	w26, [x4, 49]
+	ccmp	w25, 0, 4, ne
 	.loc 1 722 0
-	add	x20, x22, x20
+	ldrb	w22, [x24, w27, sxtw]
 	.loc 1 724 0
 	and	w21, w21, 255
+	.loc 1 726 0
+	csel	w23, w23, w26, ne
 	.loc 1 729 0
-	cmp	w11, w21
-	.loc 1 722 0
-	ldrb	w20, [x20, w23, sxtw]
+	cmp	w23, w21
 	.loc 1 723 0
-	ubfiz	w20, w20, 6, 2
-	orr	w19, w20, w19
+	ubfiz	w22, w22, 6, 2
+	orr	w20, w22, w20
 	.loc 1 729 0
-	beq	.L125
-.L80:
+	beq	.L146
+.L84:
 	.loc 1 733 0
-	strb	w21, [x6, -5]
-.L79:
+	strb	w21, [x7, -5]
+.L82:
 	.loc 1 736 0
-	strb	w19, [x10, -2]
+	strb	w20, [x10, -2]
 	.loc 1 739 0
 	tst	w8, 983040
 	.loc 1 738 0
-	mov	w19, 0
+	mov	w20, 0
 	.loc 1 739 0
-	beq	.L81
+	beq	.L85
 	.loc 1 743 0
-	lsr	w19, w5, 16
+	lsr	w20, w6, 16
 	.loc 1 741 0
-	ldrb	w20, [x6, -4]
+	ldrb	w21, [x7, -4]
 	.loc 1 743 0
-	ubfx	x21, x7, 16, 8
-	ubfiz	w19, w19, 8, 8
-	add	w19, w19, w21
-	ldr	x21, [x4, 128]
+	ubfx	x22, x5, 16, 8
+	ubfiz	w20, w20, 8, 8
+	add	w20, w20, w22
+	ldr	x22, [x4, 128]
 	.loc 1 742 0
-	lsl	w22, w20, 16
+	lsl	w25, w21, 16
+	.loc 1 740 0
+	and	w23, w5, 983040
+	.loc 1 743 0
+	add	x20, x22, x20
+	.loc 1 747 0
+	ldrb	w24, [x4, 49]
+	.loc 1 746 0
+	cmp	w23, 983040
+	.loc 1 749 0
+	ldrb	w22, [x4, 48]
+	.loc 1 747 0
+	ccmp	w23, 0, 4, ne
 	.loc 1 745 0
-	add	w20, w20, 1
+	add	w21, w21, 1
 	.loc 1 743 0
-	add	x19, x21, x19
+	ldrb	w20, [x20, w25, sxtw]
 	.loc 1 745 0
-	and	w20, w20, 255
-	.loc 1 750 0
-	cmp	w11, w20
+	and	w21, w21, 255
+	.loc 1 747 0
+	csel	w22, w22, w24, ne
 	.loc 1 743 0
-	ldrb	w19, [x19, w22, sxtw]
-	and	w19, w19, 3
+	and	w20, w20, 3
 	.loc 1 750 0
-	beq	.L126
-.L82:
+	cmp	w22, w21
+	beq	.L147
+.L87:
 	.loc 1 754 0
-	strb	w20, [x6, -4]
-.L81:
+	strb	w21, [x7, -4]
+.L85:
 	.loc 1 757 0
 	tst	w8, 15728640
-	beq	.L83
-	.loc 1 761 0
-	lsr	w20, w5, 20
+	beq	.L88
 	.loc 1 759 0
-	ldrb	w21, [x6, -3]
+	ldrb	w22, [x7, -3]
 	.loc 1 761 0
-	ubfx	x22, x7, 20, 8
-	ubfiz	w20, w20, 8, 8
-	add	w20, w20, w22
-	ldr	x22, [x4, 128]
+	lsr	w21, w6, 20
+	ubfx	x23, x5, 20, 8
+	ubfiz	w21, w21, 8, 8
+	ldr	x24, [x4, 128]
+	add	w21, w21, w23
 	.loc 1 760 0
-	lsl	w23, w21, 16
+	lsl	w27, w22, 16
+	.loc 1 758 0
+	and	w25, w5, 15728640
+	.loc 1 761 0
+	add	x24, x24, x21
 	.loc 1 763 0
-	add	w21, w21, 1
+	add	w21, w22, 1
+	.loc 1 767 0
+	ldrb	w23, [x4, 48]
+	.loc 1 764 0
+	cmp	w25, 15728640
+	.loc 1 765 0
+	ldrb	w26, [x4, 49]
+	ccmp	w25, 0, 4, ne
 	.loc 1 761 0
-	add	x20, x22, x20
+	ldrb	w22, [x24, w27, sxtw]
 	.loc 1 763 0
 	and	w21, w21, 255
+	.loc 1 765 0
+	csel	w23, w23, w26, ne
 	.loc 1 768 0
-	cmp	w11, w21
-	.loc 1 761 0
-	ldrb	w20, [x20, w23, sxtw]
+	cmp	w23, w21
 	.loc 1 762 0
-	ubfiz	w20, w20, 2, 2
-	orr	w19, w20, w19
+	ubfiz	w22, w22, 2, 2
+	orr	w20, w22, w20
 	.loc 1 768 0
-	beq	.L127
-.L84:
+	beq	.L148
+.L90:
 	.loc 1 772 0
-	strb	w21, [x6, -3]
-.L83:
+	strb	w21, [x7, -3]
+.L88:
 	.loc 1 775 0
 	tst	w8, 251658240
-	beq	.L85
+	beq	.L91
 	.loc 1 777 0
-	ldrb	w22, [x6, -2]
+	ldrb	w21, [x7, -2]
 	.loc 1 779 0
-	lsr	w20, w5, 24
-	mov	w21, w20
-	lsr	w24, w7, 24
-	ldr	x23, [x4, 128]
-	add	w20, w24, w21, lsl 8
-	.loc 1 781 0
-	add	w21, w22, 1
+	lsr	w22, w6, 24
+	lsr	w25, w5, 24
+	mov	w23, w22
+	ldr	x24, [x4, 128]
+	add	w22, w25, w23, lsl 8
 	.loc 1 778 0
-	lsl	w22, w22, 16
+	lsl	w26, w21, 16
+	.loc 1 785 0
+	ldrb	w23, [x4, 48]
 	.loc 1 779 0
-	add	x20, x23, x20
+	add	x22, x24, x22
+	.loc 1 783 0
+	ldrb	w25, [x4, 49]
+	.loc 1 782 0
+	ands	w24, w5, 251658240
+	.loc 1 781 0
+	add	w21, w21, 1
+	.loc 1 783 0
+	ccmp	w24, w14, 4, ne
 	.loc 1 781 0
 	and	w21, w21, 255
-	.loc 1 786 0
-	cmp	w11, w21
 	.loc 1 779 0
-	ldrb	w20, [x20, w22, sxtw]
+	ldrb	w22, [x22, w26, sxtw]
+	.loc 1 783 0
+	csel	w23, w23, w25, ne
+	.loc 1 786 0
+	cmp	w23, w21
 	.loc 1 780 0
-	ubfiz	w20, w20, 4, 2
-	orr	w19, w20, w19
+	ubfiz	w22, w22, 4, 2
+	orr	w20, w22, w20
 	.loc 1 786 0
-	beq	.L128
-.L86:
+	beq	.L149
+.L93:
 	.loc 1 790 0
-	strb	w21, [x6, -2]
-.L85:
+	strb	w21, [x7, -2]
+.L91:
 	.loc 1 793 0
 	tst	w8, -268435456
-	beq	.L87
+	beq	.L94
 	.loc 1 795 0
-	ldrb	w21, [x6, -1]
+	ldrb	w8, [x7, -1]
+.LVL42:
 	.loc 1 797 0
-	lsr	w8, w5, 28
+	lsr	w22, w5, 28
+	ldr	x23, [x4, 128]
+	lsr	w21, w6, 28
+	add	w21, w22, w21, lsl 8
+	.loc 1 800 0
+	ands	w5, w5, -268435456
 .LVL43:
-	mov	w20, w8
-	lsr	w23, w7, 28
-	ldr	x22, [x4, 128]
-	add	w8, w23, w20, lsl 8
-	.loc 1 799 0
-	add	w20, w21, 1
 	.loc 1 796 0
-	lsl	w21, w21, 16
+	lsl	w24, w8, 16
 	.loc 1 797 0
-	add	x8, x22, x8
+	add	x21, x23, x21
+	.loc 1 803 0
+	ldrb	w22, [x4, 48]
+	.loc 1 801 0
+	ccmp	w5, w15, 4, ne
+	ldrb	w23, [x4, 49]
 	.loc 1 799 0
-	and	w20, w20, 255
-	.loc 1 804 0
-	cmp	w11, w20
+	add	w8, w8, 1
 	.loc 1 797 0
-	ldrb	w8, [x8, w21, sxtw]
+	ldrb	w21, [x21, w24, sxtw]
+	.loc 1 799 0
+	and	w8, w8, 255
+	.loc 1 801 0
+	csel	w22, w22, w23, ne
+	.loc 1 804 0
+	cmp	w22, w8
 	.loc 1 798 0
-	ubfiz	w8, w8, 6, 2
-	orr	w19, w8, w19
+	ubfiz	w21, w21, 6, 2
+	orr	w20, w21, w20
 	.loc 1 804 0
-	beq	.L129
-.L88:
+	beq	.L150
+.L96:
 	.loc 1 808 0
-	strb	w20, [x6, -1]
+	strb	w8, [x7, -1]
 .LVL44:
-.L87:
+.L94:
 	.loc 1 811 0
-	str	w5, [x2, x9, lsl 2]
+	str	w6, [x2, x9, lsl 2]
 	.loc 1 812 0
-	strb	w19, [x10, -1]
-.L89:
+	strb	w20, [x10, -1]
+.L97:
 	add	x9, x9, 1
 	add	x10, x10, 2
-	add	x6, x6, 8
+	add	x7, x7, 8
 	.loc 1 656 0 discriminator 2
-	cmp	w12, w9
-	bgt	.L107
-	add	x3, x3, x30
-	add	x2, x2, x15
-	add	x1, x1, x15
+	cmp	w11, w9
+	bgt	.L131
+	add	x3, x3, x19
+	add	x2, x2, x16
+	add	x1, x1, x16
 .L70:
 	.loc 1 650 0 discriminator 2
-	add	w14, w14, 1
-	cmp	w17, w14
-	bne	.L91
+	add	w13, w13, 1
+	cmp	w18, w13
+	bne	.L99
+.L66:
 	.loc 1 824 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
-	ldp	x29, x30, [sp], 64
+	ldp	x25, x26, [sp, 64]
+	ldr	x27, [sp, 80]
+	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
@@ -913,194 +1008,168 @@ get_overlay_image:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL45:
 	.p2align 3
-.L129:
+.L149:
 	.cfi_restore_state
-	.loc 1 806 0
-	and	w5, w5, 268435455
+	.loc 1 788 0
+	and	w6, w6, -251658241
+.LVL45:
+	.loc 1 787 0
+	mov	w21, 0
+	.loc 1 788 0
+	orr	w6, w24, w6
 .LVL46:
-	.loc 1 794 0
-	and	w7, w7, -268435456
+	b	.L93
 .LVL47:
+	.p2align 3
+.L150:
 	.loc 1 806 0
-	orr	w5, w7, w5
+	and	w6, w6, 268435455
 .LVL48:
 	.loc 1 805 0
-	mov	w20, 0
-	b	.L88
+	mov	w8, 0
+	.loc 1 806 0
+	orr	w6, w5, w6
 .LVL49:
-	.p2align 3
-.L128:
-	.loc 1 788 0
-	and	w5, w5, -251658241
+	b	.L96
 .LVL50:
-	.loc 1 776 0
-	and	w20, w7, 251658240
-	.loc 1 788 0
-	orr	w5, w20, w5
-.LVL51:
-	.loc 1 787 0
-	mov	w21, 0
-	b	.L86
-	.p2align 3
-.L126:
-	.loc 1 740 0
-	and	w20, w7, 983040
-	.loc 1 752 0
-	and	w5, w5, -983041
-.LVL52:
-	orr	w5, w20, w5
-.LVL53:
-	.loc 1 751 0
-	mov	w20, 0
-	b	.L82
 	.p2align 3
-.L127:
-	.loc 1 770 0
-	and	w5, w5, -15728641
-.LVL54:
-	.loc 1 758 0
-	and	w20, w7, 15728640
+.L148:
 	.loc 1 770 0
-	orr	w5, w20, w5
-.LVL55:
+	and	w6, w6, -15728641
+.LVL51:
 	.loc 1 769 0
 	mov	w21, 0
-	b	.L84
+	.loc 1 770 0
+	orr	w6, w25, w6
+.LVL52:
+	b	.L90
 	.p2align 3
-.L125:
-	.loc 1 731 0
-	and	w5, w5, -61441
-.LVL56:
-	.loc 1 719 0
-	and	w20, w7, 61440
+.L146:
 	.loc 1 731 0
-	orr	w5, w20, w5
-.LVL57:
+	and	w6, w6, -61441
+.LVL53:
 	.loc 1 730 0
 	mov	w21, 0
-	b	.L80
+	.loc 1 731 0
+	orr	w6, w25, w6
+.LVL54:
+	b	.L84
 	.p2align 3
-.L123:
-	.loc 1 695 0
-	and	w5, w5, -241
-.LVL58:
-	.loc 1 683 0
-	and	w20, w7, 240
-	.loc 1 695 0
-	orr	w5, w20, w5
-.LVL59:
-	.loc 1 694 0
+.L147:
+	.loc 1 752 0
+	and	w6, w6, -983041
+.LVL55:
+	.loc 1 751 0
 	mov	w21, 0
-	b	.L76
+	.loc 1 752 0
+	orr	w6, w23, w6
+.LVL56:
+	b	.L87
 	.p2align 3
-.L124:
-	.loc 1 713 0
-	and	w5, w5, -3841
-.LVL60:
-	.loc 1 701 0
-	and	w20, w7, 3840
+.L145:
 	.loc 1 713 0
-	orr	w5, w20, w5
-.LVL61:
+	and	w6, w6, -3841
+.LVL57:
 	.loc 1 712 0
 	mov	w21, 0
-	b	.L78
+	.loc 1 713 0
+	orr	w6, w23, w6
+.LVL58:
+	b	.L81
 	.p2align 3
-.L122:
+.L143:
 	.loc 1 677 0
-	bfi	w5, w7, 0, 4
+	bfi	w6, w23, 0, 4
 	.loc 1 676 0
-	mov	w20, 0
-	b	.L74
+	mov	w21, 0
+	b	.L75
+	.p2align 3
+.L144:
+	.loc 1 695 0
+	and	w6, w6, -241
+.LVL59:
+	.loc 1 694 0
+	mov	w21, 0
+	.loc 1 695 0
+	orr	w6, w25, w6
+.LVL60:
+	b	.L78
 	.p2align 3
 .L72:
 	.loc 1 815 0
 	strb	wzr, [x10, -2]
 	.loc 1 816 0
 	strb	wzr, [x10, -1]
-	b	.L89
+	b	.L97
 	.p2align 3
 .L68:
 	.loc 1 654 0
-	ldr	w10, [x16, 84]
-	mul	w10, w14, w10
+	ldr	w10, [x17, 84]
+	mul	w10, w13, w10
 	lsr	w10, w10, 2
 	add	x10, x0, x10
-.LVL62:
+.LVL61:
 	b	.L71
-.LVL63:
-.L119:
-	.cfi_def_cfa 31, 0
-	.cfi_restore 19
-	.cfi_restore 20
-	.cfi_restore 21
-	.cfi_restore 22
-	.cfi_restore 23
-	.cfi_restore 24
-	.cfi_restore 29
-	.cfi_restore 30
-	ret
 	.cfi_endproc
-.LFE2814:
+.LFE2815:
 	.size	get_overlay_image, .-get_overlay_image
 	.align	2
 	.p2align 3,,7
 	.type	waveform_open, %function
 waveform_open:
-.LFB2845:
-	.loc 1 2544 0
+.LFB2846:
+	.loc 1 2516 0
 	.cfi_startproc
-.LVL64:
-	.loc 1 2548 0
+.LVL62:
+	.loc 1 2520 0
 	mov	w0, 0
-.LVL65:
-	.loc 1 2545 0
+.LVL63:
+	.loc 1 2517 0
 	str	xzr, [x1, 104]
-	.loc 1 2548 0
+	.loc 1 2520 0
 	ret
 	.cfi_endproc
-.LFE2845:
+.LFE2846:
 	.size	waveform_open, .-waveform_open
 	.section	.exit.text,"ax",@progbits
 	.align	2
 	.type	ebc_exit, %function
 ebc_exit:
-.LFB2865:
-	.loc 1 3115 0
+.LFB2866:
+	.loc 1 3087 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3116 0
+	.loc 1 3088 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3115 0
+	.loc 1 3087 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3116 0
+	.loc 1 3088 0
 	bl	platform_driver_unregister
-.LVL66:
-	.loc 1 3117 0
+.LVL64:
+	.loc 1 3089 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2865:
+.LFE2866:
 	.size	ebc_exit, .-ebc_exit
 	.text
 	.align	2
 	.p2align 3,,7
 	.type	ebc_resume, %function
 ebc_resume:
-.LFB2863:
-	.loc 1 3077 0
+.LFB2864:
+	.loc 1 3049 0
 	.cfi_startproc
-.LVL67:
+.LVL65:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -1109,35 +1178,35 @@ ebc_resume:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-.LBB950:
-.LBB951:
+.LBB952:
+.LBB953:
 	.file 2 "./include/linux/device.h"
 	.loc 2 1181 0
 	ldr	x19, [x0, 184]
-.LBE951:
-.LBE950:
-	.loc 1 3081 0
+.LBE953:
+.LBE952:
+	.loc 1 3053 0
 	ldr	x1, [x19, 16]
-.LBB952:
-.LBB953:
+.LBB954:
+.LBB955:
 	.file 3 "drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic.h"
 	.loc 3 45 0
 	mov	x0, x1
-.LVL68:
+.LVL66:
 	ldr	x1, [x1, 48]
 	blr	x1
-.LVL69:
-.LBE953:
-.LBE952:
-	.loc 1 3082 0
+.LVL67:
+.LBE955:
+.LBE954:
+	.loc 1 3054 0
 	str	wzr, [x19, 804]
-	.loc 1 3083 0
+	.loc 1 3055 0
 	ldr	x0, [x19, 288]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
-.LVL70:
-	.loc 1 3086 0
+.LVL68:
+	.loc 1 3058 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -1147,85 +1216,85 @@ ebc_resume:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2863:
+.LFE2864:
 	.size	ebc_resume, .-ebc_resume
 	.align	2
 	.p2align 3,,7
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
-.LFB2838:
-	.loc 1 2201 0
+.LFB2839:
+	.loc 1 2173 0
 	.cfi_startproc
-.LVL71:
-	.loc 1 2202 0
+.LVL69:
+	.loc 1 2174 0
 	adrp	x0, .LANCHOR0
-.LVL72:
+.LVL70:
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2204 0
+	.loc 1 2176 0
 	ldr	w2, [x0, 624]
-	cbnz	w2, .L144
+	cbnz	w2, .L165
 	ret
 	.p2align 3
-.L144:
-	.loc 1 2201 0
+.L165:
+	.loc 1 2173 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-.LBB954:
-.LBB955:
+.LBB956:
+.LBB957:
 	.file 4 "./include/linux/wakelock.h"
 	.loc 4 68 0
 	add	x0, x0, 416
-.LBE955:
-.LBE954:
-	.loc 1 2201 0
+.LBE957:
+.LBE956:
+	.loc 1 2173 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2205 0
+	.loc 1 2177 0
 	str	wzr, [x0, 208]
-.LBB957:
-.LBB956:
+.LBB959:
+.LBB958:
 	.loc 4 68 0
 	bl	__pm_relax
-.LVL73:
-.LBE956:
-.LBE957:
-	.loc 1 2210 0
+.LVL71:
+.LBE958:
+.LBE959:
+	.loc 1 2182 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2838:
+.LFE2839:
 	.size	ebc_vdd_power_timeout, .-ebc_vdd_power_timeout
 	.align	2
 	.p2align 3,,7
 	.type	ebc_remove, %function
 ebc_remove:
-.LFB2861:
-	.loc 1 3053 0
+.LFB2862:
+	.loc 1 3025 0
 	.cfi_startproc
-.LVL74:
+.LVL72:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3054 0
+	.loc 1 3026 0
 	adrp	x0, .LANCHOR1
-.LVL75:
+.LVL73:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3053 0
+	.loc 1 3025 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3054 0
+	.loc 1 3026 0
 	add	x0, x0, 224
-	.loc 1 3053 0
-	.loc 1 3054 0
+	.loc 1 3025 0
+	.loc 1 3026 0
 	bl	misc_deregister
-.LVL76:
-	.loc 1 3057 0
+.LVL74:
+	.loc 1 3029 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -1233,16 +1302,16 @@ ebc_remove:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2861:
+.LFE2862:
 	.size	ebc_remove, .-ebc_remove
 	.align	2
 	.p2align 3,,7
 	.type	ebc_mmap, %function
 ebc_mmap:
-.LFB2842:
-	.loc 1 2490 0
+.LFB2843:
+	.loc 1 2462 0
 	.cfi_startproc
-.LVL77:
+.LVL75:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -1251,35 +1320,35 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2490 0
+	.loc 1 2462 0
 	mov	x19, x1
-	.loc 1 2493 0
+	.loc 1 2465 0
 	bl	ebc_phy_buf_base_get
-.LVL78:
-	.loc 1 2496 0
+.LVL76:
+	.loc 1 2468 0
 	lsr	x2, x0, 12
-	.loc 1 2494 0
+	.loc 1 2466 0
 	mov	x6, 16384
-	.loc 1 2496 0
+	.loc 1 2468 0
 	mov	x0, x19
-	.loc 1 2494 0
+	.loc 1 2466 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 2496 0
+	.loc 1 2468 0
 	ldp	x1, x3, [x19]
-	.loc 1 2494 0
+	.loc 1 2466 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 2496 0
+	.loc 1 2468 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
-.LVL79:
-	.loc 1 2499 0
+.LVL77:
+	.loc 1 2471 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 2502 0
+	.loc 1 2474 0
 	ldr	x19, [sp, 16]
-.LVL80:
+.LVL78:
 	csel	w0, w0, w1, eq
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
@@ -1288,54 +1357,54 @@ ebc_mmap:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2842:
+.LFE2843:
 	.size	ebc_mmap, .-ebc_mmap
 	.align	2
 	.p2align 3,,7
 	.type	waveform_mmap, %function
 waveform_mmap:
-.LFB2844:
-	.loc 1 2528 0
+.LFB2845:
+	.loc 1 2500 0
 	.cfi_startproc
-.LVL81:
+.LVL79:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2529 0
+	.loc 1 2501 0
 	adrp	x2, .LANCHOR0
-	.loc 1 2533 0
+	.loc 1 2505 0
 	mov	x7, 16384
-	.loc 1 2535 0
+	.loc 1 2507 0
 	mov	x0, x1
-.LVL82:
-	.loc 1 2528 0
+.LVL80:
+	.loc 1 2500 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2532 0
+	.loc 1 2504 0
 	ldr	x2, [x2, #:lo12:.LANCHOR0]
-	.loc 1 2533 0
+	.loc 1 2505 0
 	movk	x7, 0x404, lsl 16
 	ldp	x4, x5, [x1, 72]
-	.loc 1 2535 0
+	.loc 1 2507 0
 	ldp	x6, x3, [x1]
-	.loc 1 2533 0
+	.loc 1 2505 0
 	orr	x5, x5, x7
-	.loc 1 2532 0
+	.loc 1 2504 0
 	ldr	x2, [x2, 216]
-	.loc 1 2533 0
+	.loc 1 2505 0
 	str	x5, [x1, 80]
-	.loc 1 2535 0
+	.loc 1 2507 0
 	sub	x3, x3, x6
 	mov	x1, x6
-.LVL83:
+.LVL81:
 	lsr	x2, x2, 12
 	bl	remap_pfn_range
-.LVL84:
-	.loc 1 2538 0
+.LVL82:
+	.loc 1 2510 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 2541 0
+	.loc 1 2513 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1343,23 +1412,23 @@ waveform_mmap:
 	csel	w0, w0, w1, eq
 	ret
 	.cfi_endproc
-.LFE2844:
+.LFE2845:
 	.size	waveform_mmap, .-waveform_mmap
 	.align	2
 	.p2align 3,,7
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
-.LFB2841:
-	.loc 1 2286 0
+.LFB2842:
+	.loc 1 2258 0
 	.cfi_startproc
-.LVL85:
+.LVL83:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 2296 0
+	.loc 1 2268 0
 	cmp	w1, 28672
-	.loc 1 2286 0
+	.loc 1 2258 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -1368,151 +1437,151 @@ ebc_io_ctl:
 	adrp	x19, __stack_chk_guard
 	stp	x21, x22, [sp, 32]
 	add	x0, x19, :lo12:__stack_chk_guard
-.LVL86:
+.LVL84:
 	str	x23, [sp, 48]
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
 	.cfi_offset 23, -112
-	.loc 1 2286 0
+	.loc 1 2258 0
 	mov	x21, x2
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 2288 0
+	.loc 1 2260 0
 	adrp	x0, .LANCHOR0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2296 0
-	bcc	.L156
+	.loc 1 2268 0
+	bcc	.L177
 	mov	w0, 28675
 	cmp	w1, w0
-	bls	.L157
+	bls	.L178
 	mov	w0, -28678
 	add	w0, w1, w0
 	cmp	w0, 1
-	bls	.L157
-.L156:
-	.loc 1 2312 0
+	bls	.L178
+.L177:
+	.loc 1 2284 0
 	mov	w0, 28677
 	cmp	w1, w0
-	beq	.L160
-	bls	.L289
+	beq	.L181
+	bls	.L310
 	mov	w0, 28680
 	cmp	w1, w0
-	beq	.L168
-	bls	.L290
+	beq	.L189
+	bls	.L311
 	mov	w0, 28682
 	cmp	w1, w0
-	beq	.L172
-	bcc	.L173
+	beq	.L193
+	bcc	.L194
 	mov	w0, 28683
 	cmp	w1, w0
-	bne	.L159
-	.loc 1 2467 0
+	bne	.L180
+	.loc 1 2439 0
 	bl	ebc_empty_buf_get
-.LVL87:
+.LVL85:
 	mov	x23, x0
-	.loc 1 2468 0
-	cbz	x0, .L180
-	.loc 1 2470 0
+	.loc 1 2440 0
+	cbz	x0, .L201
+	.loc 1 2442 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 408]
 	ldr	x0, [x0, 16]
 	mul	w2, w2, w3
 	ldr	x1, [x1, 16]
-.L286:
+.L307:
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL88:
-	.loc 1 2471 0
+.LVL86:
+	.loc 1 2443 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
-.LVL89:
+.LVL87:
 	sub	w0, w20, w0
-.LBB958:
-.LBB959:
 .LBB960:
 .LBB961:
 .LBB962:
 .LBB963:
 .LBB964:
+.LBB965:
+.LBB966:
 	.file 5 "./arch/arm64/include/asm/current.h"
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL90:
+.LVL88:
 #NO_APP
-.LBE964:
-.LBE963:
+.LBE966:
+.LBE965:
 	.file 6 "./arch/arm64/include/asm/uaccess.h"
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
+.LBE964:
+.LBE963:
 .LBE962:
 .LBE961:
 .LBE960:
-.LBE959:
-.LBE958:
-	.loc 1 2473 0
+	.loc 1 2445 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 2472 0
+	.loc 1 2444 0
 	str	w0, [x29, 104]
-	.loc 1 2474 0
+	.loc 1 2446 0
 	stp	w4, w1, [x29, 112]
-.LBB989:
-.LBB986:
-.LBB983:
+.LBB991:
+.LBB988:
+.LBB985:
+.LBB975:
 .LBB973:
-.LBB971:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL91:
+.LVL89:
 	.loc 6 84 0
-	tbnz	x3, 21, .L217
-.LVL92:
-.L283:
-.LBB965:
-.LBB966:
+	tbnz	x3, 21, .L238
+.LVL90:
+.L304:
 .LBB967:
+.LBB968:
+.LBB969:
 	.file 7 "./include/asm-generic/bitops/non-atomic.h"
 	.loc 7 106 0
 	ldr	x2, [x2]
-.LVL93:
+.LVL91:
+.LBE969:
+.LBE968:
 .LBE967:
-.LBE966:
-.LBE965:
-.LBE971:
 .LBE973:
-.LBE983:
-.LBE986:
-.LBE989:
-	.loc 1 2287 0
+.LBE975:
+.LBE985:
+.LBE988:
+.LBE991:
+	.loc 1 2259 0
 	mov	x0, x21
-.LVL94:
-.LBB990:
-.LBB987:
-.LBB984:
+.LVL92:
+.LBB992:
+.LBB989:
+.LBB986:
+.LBB976:
 .LBB974:
-.LBB972:
 	.loc 6 84 0
-	tbz	x2, 26, .L218
-.LVL95:
-.L217:
-.LBB968:
-.LBB969:
+	tbz	x2, 26, .L239
+.LVL93:
+.L238:
 .LBB970:
+.LBB971:
+.LBB972:
 	.file 8 "./include/linux/bitops.h"
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL96:
-.LBE970:
-.LBE969:
+.LVL94:
+.LBE972:
+.LBE971:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL97:
-.L218:
-.LBE968:
+.LVL95:
+.L239:
+.LBE970:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1523,86 +1592,86 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL98:
+.LVL96:
 #NO_APP
-.LBE972:
 .LBE974:
+.LBE976:
 	.file 9 "./include/linux/uaccess.h"
 	.loc 9 132 0
 	mov	x22, 48
-	cbnz	x0, .L291
-.L219:
-.LBE984:
-.LBE987:
-.LBE990:
-	.loc 1 2476 0
+	cbnz	x0, .L312
+.L240:
+.LBE986:
+.LBE989:
+.LBE992:
+	.loc 1 2448 0
 	mov	x0, x23
-.LVL99:
+.LVL97:
 	bl	ebc_buf_release
-.LVL100:
-	.loc 1 2477 0
-	b	.L155
-.LVL101:
+.LVL98:
+	.loc 1 2449 0
+	b	.L176
+.LVL99:
 	.p2align 3
-.L157:
-	.loc 1 2303 0
-	cbnz	x21, .L156
-	.loc 1 2304 0
+.L178:
+	.loc 1 2275 0
+	cbnz	x21, .L177
+	.loc 1 2276 0
 	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
-.LVL102:
+.LVL100:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC1
-	.loc 1 2305 0
+	.loc 1 2277 0
 	mov	x22, -14
-	.loc 1 2304 0
+	.loc 1 2276 0
 	bl	_dev_err
-.LVL103:
-	.loc 1 2305 0
-	b	.L155
-.LVL104:
+.LVL101:
+	.loc 1 2277 0
+	b	.L176
+.LVL102:
 	.p2align 3
-.L289:
-	.loc 1 2312 0
+.L310:
+	.loc 1 2284 0
 	mov	w0, 28674
 	cmp	w1, w0
-	beq	.L162
-	bls	.L292
+	beq	.L183
+	bls	.L313
 	mov	w0, 28675
 	cmp	w1, w0
-	beq	.L166
+	beq	.L187
 	mov	w0, 28676
 	cmp	w1, w0
-	bne	.L159
-	.loc 1 2398 0
+	bne	.L180
+	.loc 1 2370 0
 	ldr	x0, [x20, 288]
-	.loc 1 2397 0
+	.loc 1 2369 0
 	mov	w2, 1
 	str	w2, [x20, 812]
-	.loc 1 2398 0
+	.loc 1 2370 0
 	adrp	x1, .LC2
-.LVL105:
-	.loc 1 2399 0
+.LVL103:
+	.loc 1 2371 0
 	mov	x22, 0
-	.loc 1 2398 0
+	.loc 1 2370 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
-.LVL106:
+.LVL104:
 	.p2align 2
-.L155:
-	.loc 1 2487 0
+.L176:
+	.loc 1 2459 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
-.LVL107:
+.LVL105:
 	ldr	x2, [x29, 152]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-.LVL108:
-	cbnz	x1, .L293
+.LVL106:
+	cbnz	x1, .L314
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL109:
+.LVL107:
 	ldr	x23, [sp, 48]
 	ldp	x29, x30, [sp], 160
 	.cfi_remember_state
@@ -1615,54 +1684,54 @@ ebc_io_ctl:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL110:
+.LVL108:
 	.p2align 3
-.L292:
+.L313:
 	.cfi_restore_state
-	.loc 1 2312 0
+	.loc 1 2284 0
 	cmp	w1, 28672
-	beq	.L164
+	beq	.L185
 	mov	w0, 28673
 	cmp	w1, w0
-	bne	.L159
-.LBB991:
-.LBB992:
+	bne	.L180
 .LBB993:
 .LBB994:
 .LBB995:
 .LBB996:
 .LBB997:
+.LBB998:
+.LBB999:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL111:
+.LVL109:
 #NO_APP
-.LBE997:
-.LBE996:
+.LBE999:
+.LBE998:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
-.LVL112:
+.LVL110:
 	.loc 6 84 0
-	tbz	x2, 21, .L294
-.LVL113:
-.L185:
-.LBB998:
-.LBB999:
+	tbz	x2, 21, .L315
+.LVL111:
+.L206:
 .LBB1000:
+.LBB1001:
+.LBB1002:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL114:
-.LBE1000:
-.LBE999:
+.LVL112:
+.LBE1002:
+.LBE1001:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL115:
-.L186:
-.LBE998:
+.LVL113:
+.L207:
+.LBE1000:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1673,39 +1742,39 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL116:
+.LVL114:
 #NO_APP
-.LBE995:
-.LBE994:
+.LBE997:
+.LBE996:
 	.loc 9 114 0
-	cbz	x0, .L188
-.LBB1006:
-.LBB1007:
+	cbz	x0, .L209
 .LBB1008:
 .LBB1009:
 .LBB1010:
+.LBB1011:
+.LBB1012:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL117:
+.LVL115:
+.LBE1012:
+.LBE1011:
 .LBE1010:
-.LBE1009:
-.LBE1008:
-.LBB1011:
-.LBB1012:
+.LBB1013:
+.LBB1014:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL118:
+.LVL116:
 #NO_APP
-.LBE1012:
-.LBE1011:
-.LBB1013:
+.LBE1014:
+.LBE1013:
+.LBB1015:
 	.loc 6 254 0
 	and	x0, x0, x21
-.LVL119:
-.LBE1013:
+.LVL117:
+.LBE1015:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1714,179 +1783,179 @@ ebc_io_ctl:
 	csel	x1, x21, xzr, eq
 
 // 0 "" 2
-.LVL120:
+.LVL118:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1007:
-.LBE1006:
+.LBE1009:
+.LBE1008:
 	.loc 9 116 0
 	mov	x2, 48
 	add	x0, x29, 104
-.LVL121:
+.LVL119:
 	bl	__arch_copy_from_user
-.LVL122:
+.LVL120:
 	.loc 9 118 0
-	cbnz	x0, .L188
+	cbnz	x0, .L209
+.LBE995:
+.LBE994:
 .LBE993:
-.LBE992:
-.LBE991:
-	.loc 1 2352 0
+	.loc 1 2324 0
 	bl	ebc_phy_buf_base_get
-.LVL123:
+.LVL121:
 	ldrsw	x1, [x29, 104]
-	.loc 1 2353 0
+	.loc 1 2325 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
-.LVL124:
+.LVL122:
 	mov	x21, x0
-.LVL125:
-	.loc 1 2354 0
-	cbz	x0, .L195
-	.loc 1 2355 0
+.LVL123:
+	.loc 1 2326 0
+	cbz	x0, .L216
+	.loc 1 2327 0
 	ldr	w1, [x29, 108]
-	.loc 1 2364 0
+	.loc 1 2336 0
 	add	x20, x20, 184
-	.loc 1 2355 0
+	.loc 1 2327 0
 	str	w1, [x21, 40]
-	.loc 1 2359 0
+	.loc 1 2331 0
 	ldp	w4, w2, [x29, 124]
 	stp	w4, w2, [x21, 48]
-	.loc 1 2358 0
+	.loc 1 2330 0
 	ldr	w3, [x29, 132]
-	.loc 1 2360 0
+	.loc 1 2332 0
 	ldr	w1, [x29, 136]
-	.loc 1 2356 0
+	.loc 1 2328 0
 	ldr	w5, [x29, 148]
-	.loc 1 2358 0
+	.loc 1 2330 0
 	str	w3, [x21, 56]
-	.loc 1 2356 0
+	.loc 1 2328 0
 	stp	w1, w5, [x21, 60]
-	.loc 1 2362 0
+	.loc 1 2334 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL126:
-	.loc 1 2364 0
+.LVL124:
+	.loc 1 2336 0
 	ldr	w0, [x20, 96]
-	cbz	w0, .L295
-.L190:
-	.loc 1 2368 0
+	cbz	w0, .L316
+.L211:
+	.loc 1 2340 0
 	ldr	w0, [x21, 40]
 	cmp	w0, 18
-	beq	.L296
-	.loc 1 2368 0 is_stmt 0 discriminator 3
+	beq	.L317
+	.loc 1 2340 0 is_stmt 0 discriminator 3
 	cmp	w0, 20
-	bne	.L195
-.L192:
-	.loc 1 2369 0 is_stmt 1
+	bne	.L216
+.L213:
+	.loc 1 2341 0 is_stmt 1
 	mov	w0, 1
 	str	w0, [x20, 204]
-.LBB1020:
-.LBB1021:
-	.loc 1 2370 0
+.LBB1022:
+.LBB1023:
+	.loc 1 2342 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
-.LVL127:
+.LVL125:
 	adrp	x0, .LANCHOR1
-.LBB1022:
+.LBB1024:
 	add	x0, x0, :lo12:.LANCHOR1
 	add	x21, x0, 328
-	b	.L196
+	b	.L217
 	.p2align 3
-.L297:
-.LVL128:
-	.loc 1 2370 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L195
-	.loc 1 2370 0 discriminator 7
+.L318:
+.LVL126:
+	.loc 1 2342 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L216
+	.loc 1 2342 0 discriminator 7
 	bl	schedule
-.LVL129:
-.L196:
-	.loc 1 2370 0 discriminator 9
+.LVL127:
+.L217:
+	.loc 1 2342 0 discriminator 9
 	add	x1, x29, 64
 	mov	w2, 1
 	mov	x0, x21
 	bl	prepare_to_wait_event
-.LVL130:
+.LVL128:
 	ldr	w1, [x20, 204]
-	cbnz	w1, .L297
-.LBE1022:
-	.loc 1 2370 0 discriminator 4
+	cbnz	w1, .L318
+.LBE1024:
+	.loc 1 2342 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
 	bl	finish_wait
-.LVL131:
+.LVL129:
 	.p2align 2
-.L195:
+.L216:
 	mov	x22, 0
-	b	.L155
-.LVL132:
+	b	.L176
+.LVL130:
 	.p2align 3
-.L172:
-.LBE1021:
-.LBE1020:
-	.loc 1 2454 0 is_stmt 1
+.L193:
+.LBE1023:
+.LBE1022:
+	.loc 1 2426 0 is_stmt 1
 	bl	ebc_empty_buf_get
-.LVL133:
+.LVL131:
 	mov	x23, x0
-	.loc 1 2455 0
-	cbz	x0, .L180
-	.loc 1 2457 0
+	.loc 1 2427 0
+	cbz	x0, .L201
+	.loc 1 2429 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 344]
 	ldr	x0, [x0, 16]
 	mul	w2, w2, w3
-	b	.L286
-.LVL134:
+	b	.L307
+.LVL132:
 	.p2align 3
-.L290:
-	.loc 1 2312 0
+.L311:
+	.loc 1 2284 0
 	mov	w0, 28678
 	cmp	w1, w0
-	beq	.L170
+	beq	.L191
 	mov	w0, 28679
 	cmp	w1, w0
-	bne	.L159
-.LBB1026:
-.LBB1027:
+	bne	.L180
 .LBB1028:
 .LBB1029:
 .LBB1030:
 .LBB1031:
 .LBB1032:
+.LBB1033:
+.LBB1034:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL135:
+.LVL133:
 #NO_APP
-.LBE1032:
-.LBE1031:
+.LBE1034:
+.LBE1033:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
-.LVL136:
+.LVL134:
 	.loc 6 84 0
-	tbz	x2, 21, .L298
-.LVL137:
-.L197:
-.LBB1033:
-.LBB1034:
+	tbz	x2, 21, .L319
+.LVL135:
+.L218:
 .LBB1035:
+.LBB1036:
+.LBB1037:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL138:
-.LBE1035:
-.LBE1034:
+.LVL136:
+.LBE1037:
+.LBE1036:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL139:
-.L198:
-.LBE1033:
+.LVL137:
+.L219:
+.LBE1035:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1897,39 +1966,39 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL140:
+.LVL138:
 #NO_APP
-.LBE1030:
-.LBE1029:
+.LBE1032:
+.LBE1031:
 	.loc 9 114 0
-	cbz	x0, .L188
-.LBB1041:
-.LBB1042:
+	cbz	x0, .L209
 .LBB1043:
 .LBB1044:
 .LBB1045:
+.LBB1046:
+.LBB1047:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL141:
+.LVL139:
+.LBE1047:
+.LBE1046:
 .LBE1045:
-.LBE1044:
-.LBE1043:
-.LBB1046:
-.LBB1047:
+.LBB1048:
+.LBB1049:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL142:
+.LVL140:
 #NO_APP
-.LBE1047:
-.LBE1046:
-.LBB1048:
+.LBE1049:
+.LBE1048:
+.LBB1050:
 	.loc 6 254 0
 	and	x0, x0, x21
-.LVL143:
-.LBE1048:
+.LVL141:
+.LBE1050:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1938,201 +2007,201 @@ ebc_io_ctl:
 	csel	x1, x21, xzr, eq
 
 // 0 "" 2
-.LVL144:
+.LVL142:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1042:
-.LBE1041:
+.LBE1044:
+.LBE1043:
 	.loc 9 116 0
 	mov	x2, 48
 	add	x0, x29, 104
-.LVL145:
+.LVL143:
 	bl	__arch_copy_from_user
-.LVL146:
+.LVL144:
 	.loc 9 118 0
-	cbnz	x0, .L188
+	cbnz	x0, .L209
+.LBE1030:
+.LBE1029:
 .LBE1028:
-.LBE1027:
-.LBE1026:
-	.loc 1 2379 0
+	.loc 1 2351 0
 	bl	ebc_osd_buf_clone
-.LVL147:
+.LVL145:
 	mov	x1, x0
-	.loc 1 2380 0
-	cbz	x0, .L195
-	.loc 1 2381 0
+	.loc 1 2352 0
+	cbz	x0, .L216
+	.loc 1 2353 0
 	ldr	w6, [x29, 108]
-	.loc 1 2390 0
+	.loc 1 2362 0
 	add	x20, x20, 184
-	.loc 1 2385 0
+	.loc 1 2357 0
 	ldp	w5, w3, [x29, 124]
-	.loc 1 2381 0
+	.loc 1 2353 0
 	str	w6, [x1, 40]
-	.loc 1 2386 0
+	.loc 1 2358 0
 	ldp	w4, w2, [x29, 132]
-	.loc 1 2385 0
+	.loc 1 2357 0
 	stp	w5, w3, [x1, 48]
-	.loc 1 2386 0
+	.loc 1 2358 0
 	stp	w4, w2, [x1, 56]
-	.loc 1 2388 0
+	.loc 1 2360 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL148:
-	.loc 1 2390 0
+.LVL146:
+	.loc 1 2362 0
 	ldr	w0, [x20, 96]
-	cbnz	w0, .L195
-	.loc 1 2391 0
+	cbnz	w0, .L216
+	.loc 1 2363 0
 	mov	w2, 1
 	str	w2, [x20, 96]
-	.loc 1 2392 0
+	.loc 1 2364 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	mov	x22, 0
 	bl	__wake_up_sync
-.LVL149:
-	b	.L155
-.LVL150:
+.LVL147:
+	b	.L176
+.LVL148:
 	.p2align 3
-.L291:
-.LBB1055:
-.LBB988:
-.LBB985:
-.LBB975:
-.LBB976:
+.L312:
+.LBB1057:
+.LBB990:
+.LBB987:
 .LBB977:
 .LBB978:
 .LBB979:
+.LBB980:
+.LBB981:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL151:
+.LVL149:
+.LBE981:
+.LBE980:
 .LBE979:
-.LBE978:
-.LBE977:
-.LBB980:
-.LBB981:
+.LBB982:
+.LBB983:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL152:
+.LVL150:
 #NO_APP
-.LBE981:
-.LBE980:
-.LBB982:
+.LBE983:
+.LBE982:
+.LBB984:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL153:
-.LBE982:
+.LVL151:
+.LBE984:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL154:
+.LVL152:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL155:
+.LVL153:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE976:
-.LBE975:
+.LBE978:
+.LBE977:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
-.LVL156:
+.LVL154:
 	bl	__arch_copy_to_user
-.LVL157:
+.LVL155:
 	sxtw	x22, w0
-	b	.L219
-.LVL158:
+	b	.L240
+.LVL156:
 	.p2align 3
-.L170:
-.LBE985:
-.LBE988:
-.LBE1055:
-	.loc 1 2314 0
+.L191:
+.LBE987:
+.LBE990:
+.LBE1057:
+	.loc 1 2286 0
 	bl	ebc_osd_buf_get
-.LVL159:
-	.loc 1 2315 0
-	cbz	x0, .L180
-	.loc 1 2318 0
+.LVL157:
+	.loc 1 2287 0
+	cbz	x0, .L201
+	.loc 1 2290 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
-.LVL160:
-	.loc 1 2323 0
+.LVL158:
+	.loc 1 2295 0
 	ldr	w1, [x20, 176]
-.LBB1056:
-.LBB1057:
 .LBB1058:
 .LBB1059:
 .LBB1060:
 .LBB1061:
 .LBB1062:
+.LBB1063:
+.LBB1064:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL161:
+.LVL159:
 #NO_APP
-.LBE1062:
-.LBE1061:
+.LBE1064:
+.LBE1063:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
+.LBE1062:
+.LBE1061:
 .LBE1060:
 .LBE1059:
 .LBE1058:
-.LBE1057:
-.LBE1056:
-	.loc 1 2318 0
+	.loc 1 2290 0
 	sub	w0, w22, w0
-	.loc 1 2322 0
+	.loc 1 2294 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 2323 0
+	.loc 1 2295 0
 	str	w1, [x29, 120]
-	.loc 1 2321 0
+	.loc 1 2293 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 2324 0
+	.loc 1 2296 0
 	mov	w1, 16
-	.loc 1 2320 0
+	.loc 1 2292 0
 	str	w0, [x29, 104]
-	.loc 1 2324 0
+	.loc 1 2296 0
 	str	w1, [x29, 148]
-.LBB1089:
-.LBB1086:
-.LBB1083:
-.LBB1072:
-.LBB1069:
+.LBB1091:
+.LBB1088:
+.LBB1085:
+.LBB1074:
+.LBB1071:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL162:
+.LVL160:
 	.loc 6 84 0
-	tbz	x3, 21, .L299
-.LVL163:
-.L176:
-.LBB1063:
-.LBB1064:
+	tbz	x3, 21, .L320
+.LVL161:
+.L197:
 .LBB1065:
+.LBB1066:
+.LBB1067:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL164:
-.LBE1065:
-.LBE1064:
+.LVL162:
+.LBE1067:
+.LBE1066:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL165:
-.L177:
-.LBE1063:
-	.loc 6 89 0
+.LVL163:
+.L198:
+.LBE1065:
+	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
 		adds	x0, x0, 48
@@ -2142,121 +2211,121 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL166:
+.LVL164:
 #NO_APP
-.LBE1069:
-.LBE1072:
+.LBE1071:
+.LBE1074:
 	.loc 9 132 0
 	mov	x22, 48
-	cbz	x0, .L155
-.LBB1073:
-.LBB1074:
+	cbz	x0, .L176
 .LBB1075:
 .LBB1076:
 .LBB1077:
+.LBB1078:
+.LBB1079:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL167:
+.LVL165:
+.LBE1079:
+.LBE1078:
 .LBE1077:
-.LBE1076:
-.LBE1075:
-.LBB1078:
-.LBB1079:
+.LBB1080:
+.LBB1081:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL168:
+.LVL166:
 #NO_APP
-.LBE1079:
-.LBE1078:
-.LBB1080:
+.LBE1081:
+.LBE1080:
+.LBB1082:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL169:
-.LBE1080:
+.LVL167:
+.LBE1082:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL170:
+.LVL168:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL171:
+.LVL169:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1074:
-.LBE1073:
+.LBE1076:
+.LBE1075:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
-.LVL172:
+.LVL170:
 	bl	__arch_copy_to_user
-.LVL173:
+.LVL171:
 	sxtw	x22, w0
-	b	.L155
-.LVL174:
+	b	.L176
+.LVL172:
 	.p2align 3
-.L166:
-.LBE1083:
-.LBE1086:
-.LBE1089:
-.LBB1090:
-.LBB1091:
+.L187:
+.LBE1085:
+.LBE1088:
+.LBE1091:
 .LBB1092:
 .LBB1093:
 .LBB1094:
 .LBB1095:
 .LBB1096:
+.LBB1097:
+.LBB1098:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL175:
+.LVL173:
 #NO_APP
-.LBE1096:
-.LBE1095:
+.LBE1098:
+.LBE1097:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
+.LBE1096:
+.LBE1095:
 .LBE1094:
 .LBE1093:
 .LBE1092:
-.LBE1091:
-.LBE1090:
-	.loc 1 2406 0
+	.loc 1 2378 0
 	add	x22, x20, 248
-.LBB1125:
-.LBB1121:
-.LBB1117:
-.LBB1106:
-.LBB1103:
+.LBB1127:
+.LBB1123:
+.LBB1119:
+.LBB1108:
+.LBB1105:
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
-.LVL176:
+.LVL174:
 	.loc 6 84 0
-	tbz	x2, 21, .L300
-.LVL177:
-.L200:
-.LBB1097:
-.LBB1098:
+	tbz	x2, 21, .L321
+.LVL175:
+.L221:
 .LBB1099:
+.LBB1100:
+.LBB1101:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL178:
-.LBE1099:
-.LBE1098:
+.LVL176:
+.LBE1101:
+.LBE1100:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL179:
-.L201:
-.LBE1097:
+.LVL177:
+.L222:
+.LBE1099:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2267,39 +2336,39 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL180:
+.LVL178:
 #NO_APP
 	mov	x3, x0
-.LBE1103:
-.LBE1106:
+.LBE1105:
+.LBE1108:
 	.loc 9 114 0
-	cbz	x0, .L229
-.LBB1107:
-.LBB1108:
+	cbz	x0, .L250
 .LBB1109:
 .LBB1110:
 .LBB1111:
+.LBB1112:
+.LBB1113:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
+.LBE1113:
+.LBE1112:
 .LBE1111:
-.LBE1110:
-.LBE1109:
-.LBB1112:
-.LBB1113:
+.LBB1114:
+.LBB1115:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL181:
+.LVL179:
 #NO_APP
-.LBE1113:
-.LBE1112:
-.LBB1114:
+.LBE1115:
+.LBE1114:
+.LBB1116:
 	.loc 6 254 0
 	and	x0, x0, x21
-.LVL182:
-.LBE1114:
+.LVL180:
+.LBE1116:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -2308,84 +2377,84 @@ ebc_io_ctl:
 	csel	x1, x21, xzr, eq
 
 // 0 "" 2
-.LVL183:
+.LVL181:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1108:
-.LBE1107:
+.LBE1110:
+.LBE1109:
 	.loc 9 116 0
 	mov	x2, 4
 	mov	x0, x22
-.LVL184:
+.LVL182:
 	bl	__arch_copy_from_user
-.LVL185:
+.LVL183:
 	.loc 9 118 0
-	cbnz	x0, .L301
-.LBE1117:
-.LBE1121:
-.LBE1125:
-	.loc 1 2410 0
+	cbnz	x0, .L322
+.LBE1119:
+.LBE1123:
+.LBE1127:
+	.loc 1 2382 0
 	add	x20, x20, 184
 	ldr	w2, [x20, 64]
 	ldr	x0, [x20, 104]
-.LVL186:
-	.loc 1 2411 0
+.LVL184:
+	.loc 1 2383 0
 	mov	x22, 0
-	.loc 1 2410 0
+	.loc 1 2382 0
 	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	_dev_info
-.LVL187:
-	.loc 1 2411 0
-	b	.L155
-.LVL188:
+.LVL185:
+	.loc 1 2383 0
+	b	.L176
+.LVL186:
 	.p2align 3
-.L160:
-	.loc 1 2403 0
+.L181:
+	.loc 1 2375 0
 	ldr	x0, [x20, 288]
 	adrp	x1, .LC3
-.LVL189:
-	.loc 1 2401 0
+.LVL187:
+	.loc 1 2373 0
 	str	wzr, [x20, 812]
-	.loc 1 2404 0
+	.loc 1 2376 0
 	mov	x22, 0
-	.loc 1 2402 0
+	.loc 1 2374 0
 	str	wzr, [x20, 816]
-	.loc 1 2403 0
+	.loc 1 2375 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
-.LVL190:
-	.loc 1 2404 0
-	b	.L155
-.LVL191:
+.LVL188:
+	.loc 1 2376 0
+	b	.L176
+.LVL189:
 	.p2align 3
-.L168:
-	.loc 1 2441 0
+.L189:
+	.loc 1 2413 0
 	bl	ebc_empty_buf_get
-.LVL192:
+.LVL190:
 	mov	x23, x0
-	.loc 1 2442 0
-	cbz	x0, .L180
-	.loc 1 2444 0
+	.loc 1 2414 0
+	cbz	x0, .L201
+	.loc 1 2416 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 336]
 	ldr	x0, [x0, 16]
 	mul	w2, w2, w3
-	b	.L286
-.LVL193:
+	b	.L307
+.LVL191:
 	.p2align 3
-.L173:
-	.loc 1 2428 0
+.L194:
+	.loc 1 2400 0
 	bl	ebc_empty_buf_get
-.LVL194:
+.LVL192:
 	mov	x23, x0
-	.loc 1 2429 0
-	cbz	x0, .L180
-	.loc 1 2431 0
+	.loc 1 2401 0
+	cbz	x0, .L201
+	.loc 1 2403 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 328]
@@ -2393,125 +2462,125 @@ ebc_io_ctl:
 	mul	w2, w2, w3
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL195:
-	.loc 1 2432 0
+.LVL193:
+	.loc 1 2404 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
-.LVL196:
+.LVL194:
 	sub	w0, w20, w0
-.LBB1126:
-.LBB1127:
 .LBB1128:
 .LBB1129:
 .LBB1130:
 .LBB1131:
 .LBB1132:
+.LBB1133:
+.LBB1134:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL197:
+.LVL195:
 #NO_APP
-.LBE1132:
-.LBE1131:
+.LBE1134:
+.LBE1133:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
+.LBE1132:
+.LBE1131:
 .LBE1130:
 .LBE1129:
 .LBE1128:
-.LBE1127:
-.LBE1126:
-	.loc 1 2435 0
+	.loc 1 2407 0
 	ldp	w4, w1, [x22, 84]
-	.loc 1 2433 0
+	.loc 1 2405 0
 	str	w0, [x29, 104]
-	.loc 1 2434 0
+	.loc 1 2406 0
 	stp	w1, w4, [x29, 112]
+.LBB1139:
+.LBB1138:
 .LBB1137:
 .LBB1136:
 .LBB1135:
-.LBB1134:
-.LBB1133:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL198:
+.LVL196:
 	.loc 6 84 0
-	tbnz	x3, 21, .L217
-	b	.L283
-.LVL199:
+	tbnz	x3, 21, .L238
+	b	.L304
+.LVL197:
 	.p2align 3
-.L162:
-.LBE1133:
-.LBE1134:
+.L183:
 .LBE1135:
 .LBE1136:
 .LBE1137:
-	.loc 1 2417 0
+.LBE1138:
+.LBE1139:
+	.loc 1 2389 0
 	ldp	w1, w0, [x20, 116]
-.LVL200:
-.LBB1138:
-.LBB1139:
+.LVL198:
 .LBB1140:
 .LBB1141:
 .LBB1142:
 .LBB1143:
 .LBB1144:
+.LBB1145:
+.LBB1146:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL201:
+.LVL199:
 #NO_APP
-.LBE1144:
-.LBE1143:
+.LBE1146:
+.LBE1145:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
+.LBE1144:
+.LBE1143:
 .LBE1142:
 .LBE1141:
 .LBE1140:
-.LBE1139:
-.LBE1138:
-	.loc 1 2414 0
+	.loc 1 2386 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 2417 0
+	.loc 1 2389 0
 	stp	w1, w0, [x29, 140]
-	.loc 1 2415 0
+	.loc 1 2387 0
 	ldr	w4, [x20, 176]
-	.loc 1 2418 0
+	.loc 1 2390 0
 	mov	w0, 16
-	.loc 1 2413 0
+	.loc 1 2385 0
 	stp	w5, w6, [x29, 112]
-	.loc 1 2415 0
+	.loc 1 2387 0
 	str	w4, [x29, 120]
-	.loc 1 2418 0
+	.loc 1 2390 0
 	str	w0, [x29, 148]
-.LBB1173:
-.LBB1169:
-.LBB1165:
-.LBB1154:
-.LBB1151:
+.LBB1175:
+.LBB1171:
+.LBB1167:
+.LBB1156:
+.LBB1153:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL202:
+.LVL200:
 	.loc 6 84 0
-	tbz	x3, 21, .L302
-.LVL203:
-.L204:
-.LBB1145:
-.LBB1146:
+	tbz	x3, 21, .L323
+.LVL201:
+.L225:
 .LBB1147:
+.LBB1148:
+.LBB1149:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL204:
-.LBE1147:
-.LBE1146:
+.LVL202:
+.LBE1149:
+.LBE1148:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL205:
-.L205:
-.LBE1145:
+.LVL203:
+.L226:
+.LBE1147:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2522,123 +2591,123 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL206:
+.LVL204:
 #NO_APP
-.LBE1151:
-.LBE1154:
+.LBE1153:
+.LBE1156:
 	.loc 9 132 0
-	cbnz	x0, .L206
-.L207:
-.LBE1165:
-.LBE1169:
-.LBE1173:
-	.loc 1 2421 0
+	cbnz	x0, .L227
+.L228:
+.LBE1167:
+.LBE1171:
+.LBE1175:
+	.loc 1 2393 0
 	ldr	x0, [x20, 288]
-.LVL207:
+.LVL205:
 	adrp	x1, .LC5
-.LVL208:
-	.loc 1 2422 0
+.LVL206:
+	.loc 1 2394 0
 	mov	x22, -14
-	.loc 1 2421 0
+	.loc 1 2393 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
-.LVL209:
-	.loc 1 2422 0
-	b	.L155
-.LVL210:
+.LVL207:
+	.loc 1 2394 0
+	b	.L176
+.LVL208:
 	.p2align 3
-.L159:
-	.loc 1 2482 0
+.L180:
+	.loc 1 2454 0
 	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
-.LVL211:
+.LVL209:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
-	.loc 1 2483 0
+	.loc 1 2455 0
 	mov	x22, 0
-	.loc 1 2482 0
+	.loc 1 2454 0
 	bl	_dev_err
-.LVL212:
-	.loc 1 2486 0
-	b	.L155
-.LVL213:
+.LVL210:
+	.loc 1 2458 0
+	b	.L176
+.LVL211:
 	.p2align 3
-.L164:
-	.loc 1 2329 0
+.L185:
+	.loc 1 2301 0
 	bl	ebc_empty_buf_get
-.LVL214:
+.LVL212:
 	mov	x23, x0
-	.loc 1 2330 0
-	cbz	x0, .L180
-	.loc 1 2333 0
+	.loc 1 2302 0
+	cbz	x0, .L201
+	.loc 1 2305 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
-.LVL215:
-	.loc 1 2338 0
+.LVL213:
+	.loc 1 2310 0
 	ldr	w1, [x20, 176]
-.LBB1174:
-.LBB1175:
 .LBB1176:
 .LBB1177:
 .LBB1178:
 .LBB1179:
 .LBB1180:
+.LBB1181:
+.LBB1182:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL216:
+.LVL214:
 #NO_APP
-.LBE1180:
-.LBE1179:
+.LBE1182:
+.LBE1181:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
+.LBE1180:
+.LBE1179:
 .LBE1178:
 .LBE1177:
 .LBE1176:
-.LBE1175:
-.LBE1174:
-	.loc 1 2333 0
+	.loc 1 2305 0
 	sub	w0, w22, w0
-	.loc 1 2337 0
+	.loc 1 2309 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 2338 0
+	.loc 1 2310 0
 	str	w1, [x29, 120]
-	.loc 1 2336 0
+	.loc 1 2308 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 2339 0
+	.loc 1 2311 0
 	mov	w1, 16
-	.loc 1 2335 0
+	.loc 1 2307 0
 	str	w0, [x29, 104]
-	.loc 1 2339 0
+	.loc 1 2311 0
 	str	w1, [x29, 148]
-.LBB1209:
-.LBB1205:
-.LBB1201:
-.LBB1190:
-.LBB1187:
+.LBB1211:
+.LBB1207:
+.LBB1203:
+.LBB1192:
+.LBB1189:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL217:
+.LVL215:
 	.loc 6 84 0
-	tbz	x3, 21, .L303
-.LVL218:
-.L181:
-.LBB1181:
-.LBB1182:
+	tbz	x3, 21, .L324
+.LVL216:
+.L202:
 .LBB1183:
+.LBB1184:
+.LBB1185:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL219:
-.LBE1183:
-.LBE1182:
+.LVL217:
+.LBE1185:
+.LBE1184:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL220:
-.L182:
-.LBE1181:
+.LVL218:
+.L203:
+.LBE1183:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2649,533 +2718,533 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL221:
+.LVL219:
 #NO_APP
-.LBE1187:
-.LBE1190:
+.LBE1189:
+.LBE1192:
 	.loc 9 132 0
-	cbnz	x0, .L183
-.L184:
-.LBE1201:
-.LBE1205:
-.LBE1209:
-	.loc 1 2343 0
+	cbnz	x0, .L204
+.L205:
+.LBE1203:
+.LBE1207:
+.LBE1211:
+	.loc 1 2315 0
 	mov	x0, x23
-.LVL222:
-	.loc 1 2344 0
+.LVL220:
+	.loc 1 2316 0
 	mov	x22, -14
-	.loc 1 2343 0
+	.loc 1 2315 0
 	bl	ebc_buf_release
-.LVL223:
-	.loc 1 2344 0
-	b	.L155
-.LVL224:
+.LVL221:
+	.loc 1 2316 0
+	b	.L176
+.LVL222:
 	.p2align 3
-.L298:
-.LBB1210:
+.L319:
+.LBB1212:
+.LBB1055:
 .LBB1053:
 .LBB1051:
-.LBB1049:
-.LBB1039:
-.LBB1036:
-.LBB1037:
+.LBB1041:
 .LBB1038:
+.LBB1039:
+.LBB1040:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1038:
-.LBE1037:
-.LBE1036:
+.LBE1040:
 .LBE1039:
-.LBE1049:
+.LBE1038:
+.LBE1041:
 .LBE1051:
 .LBE1053:
-.LBE1210:
-	.loc 1 2287 0
+.LBE1055:
+.LBE1212:
+	.loc 1 2259 0
 	mov	x0, x21
-.LVL225:
-.LBB1211:
+.LVL223:
+.LBB1213:
+.LBB1056:
 .LBB1054:
 .LBB1052:
-.LBB1050:
-.LBB1040:
+.LBB1042:
 	.loc 6 84 0
-	tbz	x2, 26, .L198
-	b	.L197
-.LVL226:
+	tbz	x2, 26, .L219
+	b	.L218
+.LVL224:
 	.p2align 3
-.L294:
-.LBE1040:
-.LBE1050:
+.L315:
+.LBE1042:
 .LBE1052:
 .LBE1054:
-.LBE1211:
-.LBB1212:
+.LBE1056:
+.LBE1213:
+.LBB1214:
+.LBB1020:
 .LBB1018:
 .LBB1016:
-.LBB1014:
-.LBB1004:
-.LBB1001:
-.LBB1002:
+.LBB1006:
 .LBB1003:
+.LBB1004:
+.LBB1005:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1003:
-.LBE1002:
-.LBE1001:
+.LBE1005:
 .LBE1004:
-.LBE1014:
+.LBE1003:
+.LBE1006:
 .LBE1016:
 .LBE1018:
-.LBE1212:
-	.loc 1 2287 0
+.LBE1020:
+.LBE1214:
+	.loc 1 2259 0
 	mov	x0, x21
-.LVL227:
-.LBB1213:
+.LVL225:
+.LBB1215:
+.LBB1021:
 .LBB1019:
 .LBB1017:
-.LBB1015:
-.LBB1005:
+.LBB1007:
 	.loc 6 84 0
-	tbz	x2, 26, .L186
-	b	.L185
-.LVL228:
+	tbz	x2, 26, .L207
+	b	.L206
+.LVL226:
 	.p2align 3
-.L302:
-.LBE1005:
-.LBE1015:
+.L323:
+.LBE1007:
 .LBE1017:
 .LBE1019:
-.LBE1213:
-.LBB1214:
-.LBB1170:
-.LBB1166:
-.LBB1155:
-.LBB1152:
-.LBB1148:
-.LBB1149:
+.LBE1021:
+.LBE1215:
+.LBB1216:
+.LBB1172:
+.LBB1168:
+.LBB1157:
+.LBB1154:
 .LBB1150:
+.LBB1151:
+.LBB1152:
 	.loc 7 106 0
 	ldr	x2, [x2]
-.LVL229:
-.LBE1150:
-.LBE1149:
-.LBE1148:
+.LVL227:
 .LBE1152:
-.LBE1155:
-.LBE1166:
-.LBE1170:
-.LBE1214:
-	.loc 1 2287 0
+.LBE1151:
+.LBE1150:
+.LBE1154:
+.LBE1157:
+.LBE1168:
+.LBE1172:
+.LBE1216:
+	.loc 1 2259 0
 	mov	x0, x21
-.LVL230:
-.LBB1215:
-.LBB1171:
-.LBB1167:
-.LBB1156:
-.LBB1153:
+.LVL228:
+.LBB1217:
+.LBB1173:
+.LBB1169:
+.LBB1158:
+.LBB1155:
 	.loc 6 84 0
-	tbz	x2, 26, .L205
-	b	.L204
-.LVL231:
+	tbz	x2, 26, .L226
+	b	.L225
+.LVL229:
 	.p2align 3
-.L300:
-.LBE1153:
-.LBE1156:
-.LBE1167:
-.LBE1171:
-.LBE1215:
-.LBB1216:
-.LBB1122:
-.LBB1118:
-.LBB1115:
-.LBB1104:
-.LBB1100:
-.LBB1101:
+.L321:
+.LBE1155:
+.LBE1158:
+.LBE1169:
+.LBE1173:
+.LBE1217:
+.LBB1218:
+.LBB1124:
+.LBB1120:
+.LBB1117:
+.LBB1106:
 .LBB1102:
+.LBB1103:
+.LBB1104:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1102:
-.LBE1101:
-.LBE1100:
 .LBE1104:
-.LBE1115:
-.LBE1118:
-.LBE1122:
-.LBE1216:
-	.loc 1 2287 0
+.LBE1103:
+.LBE1102:
+.LBE1106:
+.LBE1117:
+.LBE1120:
+.LBE1124:
+.LBE1218:
+	.loc 1 2259 0
 	mov	x0, x21
-.LVL232:
-.LBB1217:
-.LBB1123:
-.LBB1119:
-.LBB1116:
-.LBB1105:
+.LVL230:
+.LBB1219:
+.LBB1125:
+.LBB1121:
+.LBB1118:
+.LBB1107:
 	.loc 6 84 0
-	tbz	x2, 26, .L201
-	b	.L200
-.LVL233:
+	tbz	x2, 26, .L222
+	b	.L221
+.LVL231:
 	.p2align 3
-.L303:
-.LBE1105:
-.LBE1116:
-.LBE1119:
-.LBE1123:
-.LBE1217:
-.LBB1218:
-.LBB1206:
-.LBB1202:
-.LBB1191:
-.LBB1188:
-.LBB1184:
-.LBB1185:
+.L324:
+.LBE1107:
+.LBE1118:
+.LBE1121:
+.LBE1125:
+.LBE1219:
+.LBB1220:
+.LBB1208:
+.LBB1204:
+.LBB1193:
+.LBB1190:
 .LBB1186:
+.LBB1187:
+.LBB1188:
 	.loc 7 106 0
 	ldr	x2, [x2]
-.LVL234:
-.LBE1186:
-.LBE1185:
-.LBE1184:
+.LVL232:
 .LBE1188:
-.LBE1191:
-.LBE1202:
-.LBE1206:
-.LBE1218:
-	.loc 1 2287 0
+.LBE1187:
+.LBE1186:
+.LBE1190:
+.LBE1193:
+.LBE1204:
+.LBE1208:
+.LBE1220:
+	.loc 1 2259 0
 	mov	x0, x21
-.LVL235:
-.LBB1219:
-.LBB1207:
-.LBB1203:
-.LBB1192:
-.LBB1189:
+.LVL233:
+.LBB1221:
+.LBB1209:
+.LBB1205:
+.LBB1194:
+.LBB1191:
 	.loc 6 84 0
-	tbz	x2, 26, .L182
-	b	.L181
-.LVL236:
+	tbz	x2, 26, .L203
+	b	.L202
+.LVL234:
 	.p2align 3
-.L299:
-.LBE1189:
-.LBE1192:
-.LBE1203:
-.LBE1207:
-.LBE1219:
-.LBB1220:
-.LBB1087:
-.LBB1084:
-.LBB1081:
-.LBB1070:
-.LBB1066:
-.LBB1067:
+.L320:
+.LBE1191:
+.LBE1194:
+.LBE1205:
+.LBE1209:
+.LBE1221:
+.LBB1222:
+.LBB1089:
+.LBB1086:
+.LBB1083:
+.LBB1072:
 .LBB1068:
+.LBB1069:
+.LBB1070:
 	.loc 7 106 0
 	ldr	x2, [x2]
-.LVL237:
-.LBE1068:
-.LBE1067:
-.LBE1066:
+.LVL235:
 .LBE1070:
-.LBE1081:
-.LBE1084:
-.LBE1087:
-.LBE1220:
-	.loc 1 2287 0
+.LBE1069:
+.LBE1068:
+.LBE1072:
+.LBE1083:
+.LBE1086:
+.LBE1089:
+.LBE1222:
+	.loc 1 2259 0
 	mov	x0, x21
-.LVL238:
-.LBB1221:
-.LBB1088:
-.LBB1085:
-.LBB1082:
-.LBB1071:
+.LVL236:
+.LBB1223:
+.LBB1090:
+.LBB1087:
+.LBB1084:
+.LBB1073:
 	.loc 6 84 0
-	tbz	x2, 26, .L177
-	b	.L176
-.LVL239:
+	tbz	x2, 26, .L198
+	b	.L197
+.LVL237:
 	.p2align 3
-.L206:
-.LBE1071:
-.LBE1082:
-.LBE1085:
-.LBE1088:
-.LBE1221:
-.LBB1222:
-.LBB1172:
-.LBB1168:
-.LBB1157:
-.LBB1158:
+.L227:
+.LBE1073:
+.LBE1084:
+.LBE1087:
+.LBE1090:
+.LBE1223:
+.LBB1224:
+.LBB1174:
+.LBB1170:
 .LBB1159:
 .LBB1160:
 .LBB1161:
+.LBB1162:
+.LBB1163:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL240:
+.LVL238:
+.LBE1163:
+.LBE1162:
 .LBE1161:
-.LBE1160:
-.LBE1159:
-.LBB1162:
-.LBB1163:
+.LBB1164:
+.LBB1165:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL241:
+.LVL239:
 #NO_APP
-.LBE1163:
-.LBE1162:
-.LBB1164:
+.LBE1165:
+.LBE1164:
+.LBB1166:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL242:
-.LBE1164:
+.LVL240:
+.LBE1166:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL243:
+.LVL241:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL244:
+.LVL242:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1158:
-.LBE1157:
+.LBE1160:
+.LBE1159:
 	.loc 9 134 0
 	mov	x2, 48
 	add	x1, x29, 104
-.LVL245:
+.LVL243:
 	bl	__arch_copy_to_user
-.LVL246:
-.LBE1168:
-.LBE1172:
-.LBE1222:
-	.loc 1 2420 0
-	cbnz	x0, .L207
-.LBB1223:
-.LBB1023:
+.LVL244:
+.LBE1170:
+.LBE1174:
+.LBE1224:
+	.loc 1 2392 0
+	cbnz	x0, .L228
+.LBB1225:
+.LBB1025:
 	mov	x22, 0
-	b	.L155
-.LVL247:
+	b	.L176
+.LVL245:
 	.p2align 3
-.L183:
-.LBE1023:
-.LBE1223:
-.LBB1224:
-.LBB1208:
-.LBB1204:
-.LBB1193:
-.LBB1194:
+.L204:
+.LBE1025:
+.LBE1225:
+.LBB1226:
+.LBB1210:
+.LBB1206:
 .LBB1195:
 .LBB1196:
 .LBB1197:
+.LBB1198:
+.LBB1199:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL248:
+.LVL246:
+.LBE1199:
+.LBE1198:
 .LBE1197:
-.LBE1196:
-.LBE1195:
-.LBB1198:
-.LBB1199:
+.LBB1200:
+.LBB1201:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL249:
+.LVL247:
 #NO_APP
-.LBE1199:
-.LBE1198:
-.LBB1200:
+.LBE1201:
+.LBE1200:
+.LBB1202:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL250:
-.LBE1200:
+.LVL248:
+.LBE1202:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL251:
+.LVL249:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL252:
+.LVL250:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1194:
-.LBE1193:
+.LBE1196:
+.LBE1195:
 	.loc 9 134 0
 	mov	x2, 48
 	add	x1, x29, 104
-.LVL253:
+.LVL251:
 	bl	__arch_copy_to_user
-.LVL254:
-.LBE1204:
-.LBE1208:
-.LBE1224:
-	.loc 1 2342 0
-	cbnz	w0, .L184
-.LBB1225:
-.LBB1024:
+.LVL252:
+.LBE1206:
+.LBE1210:
+.LBE1226:
+	.loc 1 2314 0
+	cbnz	w0, .L205
+.LBB1227:
+.LBB1026:
 	mov	x22, 0
-	b	.L155
-.LVL255:
+	b	.L176
+.LVL253:
 	.p2align 3
-.L188:
-.LBE1024:
-.LBE1225:
-	.loc 1 2350 0
+.L209:
+.LBE1026:
+.LBE1227:
+	.loc 1 2322 0
 	mov	x22, -14
-	b	.L155
-.LVL256:
+	b	.L176
+.LVL254:
 	.p2align 3
-.L295:
-	.loc 1 2365 0
+.L316:
+	.loc 1 2337 0
 	mov	w2, 1
 	str	w2, [x20, 96]
-	.loc 1 2366 0
+	.loc 1 2338 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL257:
-	b	.L190
+.LVL255:
+	b	.L211
 	.p2align 3
-.L296:
-	.loc 1 2368 0 discriminator 1
+.L317:
+	.loc 1 2340 0 discriminator 1
 	ldr	w0, [x20, 616]
-	cbz	w0, .L192
-.LBB1226:
-.LBB1025:
+	cbz	w0, .L213
+.LBB1228:
+.LBB1027:
 	mov	x22, 0
-	b	.L155
-.LVL258:
-.L180:
-.LBE1025:
-.LBE1226:
-	.loc 1 2316 0
+	b	.L176
+.LVL256:
+.L201:
+.LBE1027:
+.LBE1228:
+	.loc 1 2288 0
 	mov	x22, -1
-	b	.L155
-.LVL259:
-.L229:
-.LBB1227:
-.LBB1124:
-.LBB1120:
+	b	.L176
+.LVL257:
+.L250:
+.LBB1229:
+.LBB1126:
+.LBB1122:
 	.loc 9 112 0
 	mov	x0, 4
-.LVL260:
-.L202:
+.LVL258:
+.L223:
 	.loc 9 119 0
 	mov	x2, x0
 	mov	w1, 0
-.LVL261:
+.LVL259:
 	add	x0, x22, x3
-.LVL262:
+.LVL260:
 	bl	memset
-.LVL263:
-.LBE1120:
-.LBE1124:
-.LBE1227:
-	.loc 1 2407 0
+.LVL261:
+.LBE1122:
+.LBE1126:
+.LBE1229:
+	.loc 1 2379 0
 	ldr	x0, [x20, 288]
 	adrp	x1, .LC4
-	.loc 1 2408 0
+	.loc 1 2380 0
 	mov	x22, -14
-	.loc 1 2407 0
+	.loc 1 2379 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
-.LVL264:
-	.loc 1 2408 0
-	b	.L155
-.L293:
-	.loc 1 2487 0
+.LVL262:
+	.loc 1 2380 0
+	b	.L176
+.L314:
+	.loc 1 2459 0
 	bl	__stack_chk_fail
-.LVL265:
-.L301:
+.LVL263:
+.L322:
 	mov	x3, 4
 	sub	x3, x3, x0
-.LVL266:
-	b	.L202
+.LVL264:
+	b	.L223
 	.cfi_endproc
-.LFE2841:
+.LFE2842:
 	.size	ebc_io_ctl, .-ebc_io_ctl
 	.align	2
 	.p2align 3,,7
 	.type	frame_done_callback, %function
 frame_done_callback:
-.LFB2831:
-	.loc 1 1643 0
+.LFB2832:
+	.loc 1 1608 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 1644 0
+	.loc 1 1609 0
 	adrp	x1, .LANCHOR0
-	.loc 1 1643 0
+	.loc 1 1608 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 1644 0
+	.loc 1 1609 0
 	ldr	x20, [x1, #:lo12:.LANCHOR0]
-	.loc 1 1643 0
+	.loc 1 1608 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 1647 0
+	.loc 1 1612 0
 	add	x19, x20, 184
 	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
-	tbnz	w0, #31, .L305
+	tbnz	w0, #31, .L326
 	cmp	w0, 1
-	ble	.L306
+	ble	.L327
 	sub	w0, w0, #22
 	cmp	w0, 1
-	bls	.L306
-.L305:
-	.loc 1 1667 0
+	bls	.L327
+.L326:
+	.loc 1 1632 0
 	ldr	w0, [x19, 56]
-	cbnz	w0, .L311
-	.loc 1 1673 0
+	cbnz	w0, .L332
+	.loc 1 1638 0
 	ldr	x0, [x19, 104]
-	.loc 1 1672 0
+	.loc 1 1637 0
 	mov	w20, 1
-	.loc 1 1671 0
+	.loc 1 1636 0
 	str	wzr, [x19, 44]
-	.loc 1 1673 0
+	.loc 1 1638 0
 	adrp	x1, .LC9
-	.loc 1 1672 0
+	.loc 1 1637 0
 	str	w20, [x19, 92]
-	.loc 1 1673 0
+	.loc 1 1638 0
 	add	x1, x1, :lo12:.LC9
-	.loc 1 1674 0
+	.loc 1 1639 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
-	.loc 1 1673 0
+	.loc 1 1638 0
 	bl	_dev_info
-.LVL267:
-	.loc 1 1674 0
+.LVL265:
+	.loc 1 1639 0
 	mov	w2, w20
 	add	x0, x19, 352
 	mov	w1, w20
 	bl	__wake_up_sync
-.LVL268:
-	.loc 1 1675 0
+.LVL266:
+	.loc 1 1640 0
 	mov	w2, w20
 	mov	w1, w20
 	add	x0, x19, 304
 	bl	__wake_up_sync
-.LVL269:
-	.loc 1 1679 0
+.LVL267:
+	.loc 1 1644 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -3188,17 +3257,17 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L306:
+.L327:
 	.cfi_restore_state
-	.loc 1 1652 0
+	.loc 1 1617 0
 	ldr	w0, [x19, 52]
-	cbz	w0, .L307
-	.loc 1 1653 0
+	cbz	w0, .L328
+	.loc 1 1618 0
 	add	x1, x1, :lo12:.LANCHOR0
 	ldr	x0, [x1, 8]
 	bl	wake_up_process
-.LVL270:
-	.loc 1 1679 0
+.LVL268:
+	.loc 1 1644 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -3211,51 +3280,51 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L307:
+.L328:
 	.cfi_restore_state
-	.loc 1 1656 0
+	.loc 1 1621 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC8
 	add	x1, x1, :lo12:.LC8
-	.loc 1 1661 0
+	.loc 1 1626 0
 	mov	w21, 1
-	.loc 1 1656 0
+	.loc 1 1621 0
 	bl	_dev_info
-.LVL271:
-	.loc 1 1658 0
+.LVL269:
+	.loc 1 1623 0
 	ldp	w3, w2, [x20, 108]
 	mov	w1, 0
 	ldr	x0, [x19, 168]
 	mul	w2, w3, w2
 	bl	memset
-.LVL272:
-	.loc 1 1659 0
+.LVL270:
+	.loc 1 1624 0
 	adrp	x2, jiffies
 	add	x0, x20, 688
 	mov	x1, 402653184
 	ldr	x2, [x2, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL273:
-	.loc 1 1661 0
+.LVL271:
+	.loc 1 1626 0
 	str	w21, [x19, 92]
-	.loc 1 1660 0
+	.loc 1 1625 0
 	str	wzr, [x19, 44]
-	.loc 1 1662 0
+	.loc 1 1627 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x19, 352
 	bl	__wake_up_sync
-.LVL274:
-	.loc 1 1663 0
+.LVL272:
+	.loc 1 1628 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x19, 304
 	bl	__wake_up_sync
-.LVL275:
-	.loc 1 1679 0
+.LVL273:
+	.loc 1 1644 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -3268,18 +3337,18 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L311:
+.L332:
 	.cfi_restore_state
-	.loc 1 1669 0
+	.loc 1 1634 0
 	add	x1, x1, :lo12:.LANCHOR0
-	.loc 1 1668 0
+	.loc 1 1633 0
 	mov	w0, 1
 	str	w0, [x19, 44]
-	.loc 1 1669 0
+	.loc 1 1634 0
 	ldr	x0, [x1, 8]
 	bl	wake_up_process
-.LVL276:
-	.loc 1 1679 0
+.LVL274:
+	.loc 1 1644 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -3291,49 +3360,49 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2831:
+.LFE2832:
 	.size	frame_done_callback, .-frame_done_callback
 	.align	2
 	.p2align 3,,7
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
-.LFB2839:
-	.loc 1 2213 0
+.LFB2840:
+	.loc 1 2185 0
 	.cfi_startproc
-.LVL277:
+.LVL275:
 	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 2214 0
+	.loc 1 2186 0
 	bl	frame_done_callback
-.LVL278:
-	.loc 1 2216 0
+.LVL276:
+	.loc 1 2188 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2839:
+.LFE2840:
 	.size	ebc_frame_timeout, .-ebc_frame_timeout
 	.align	2
 	.p2align 3,,7
 	.type	ebc_lut_update, %function
 ebc_lut_update:
-.LFB2832:
-	.loc 1 1682 0
+.LFB2833:
+	.loc 1 1647 0
 	.cfi_startproc
-.LVL279:
+.LVL277:
 	stp	x29, x30, [sp, -80]!
 	.cfi_def_cfa_offset 80
 	.cfi_offset 29, -80
 	.cfi_offset 30, -72
-	.loc 1 1684 0
+	.loc 1 1649 0
 	mov	w4, 25
-	.loc 1 1682 0
+	.loc 1 1647 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x21, x22, [sp, 32]
@@ -3341,89 +3410,89 @@ ebc_lut_update:
 	.cfi_offset 22, -40
 	mov	x21, x0
 	stp	x19, x20, [sp, 16]
-	.loc 1 1684 0
+	.loc 1 1649 0
 	add	x0, x29, 80
-.LVL280:
-	.loc 1 1682 0
+.LVL278:
+	.loc 1 1647 0
 	str	x23, [sp, 48]
 	.cfi_offset 19, -64
 	.cfi_offset 20, -56
 	.cfi_offset 23, -32
-	.loc 1 1682 0
+	.loc 1 1647 0
 	adrp	x19, __stack_chk_guard
 	add	x3, x19, :lo12:__stack_chk_guard
 	mov	w23, w1
-	.loc 1 1690 0
+	.loc 1 1656 0
 	ldr	x2, [x21, 16]
-	.loc 1 1682 0
+	.loc 1 1647 0
 	ldr	x1, [x3]
 	str	x1, [x29, 72]
 	mov	x1,0
-.LVL281:
-	.loc 1 1684 0
+.LVL279:
+	.loc 1 1649 0
 	str	w4, [x0, -12]!
-.LVL282:
-.LBB1228:
-.LBB1229:
+.LVL280:
+.LBB1230:
+.LBB1231:
 	.loc 3 50 0
 	mov	x1, x0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL283:
+.LVL281:
 	mov	w20, w0
-.LBE1229:
-.LBE1228:
-	.loc 1 1691 0
-	cbnz	w0, .L315
-.LVL284:
-	.loc 1 1692 0
+.LBE1231:
+.LBE1230:
+	.loc 1 1657 0
+	cbnz	w0, .L336
+.LVL282:
+	.loc 1 1658 0
 	ldr	w2, [x29, 68]
-	.loc 1 1693 0
+	.loc 1 1659 0
 	add	x22, x21, 184
-	.loc 1 1692 0
-	tbnz	w2, #31, .L339
-	.loc 1 1696 0
+	.loc 1 1658 0
+	tbnz	w2, #31, .L360
+	.loc 1 1662 0
 	cmp	w2, 50
-	bgt	.L340
-.L317:
-	.loc 1 1704 0
+	bgt	.L361
+.L338:
+	.loc 1 1670 0
 	ldr	x0, [x22, 104]
 	adrp	x1, .LC13
 	add	x1, x1, :lo12:.LC13
 	bl	_dev_info
-.LVL285:
-	.loc 1 1707 0
+.LVL283:
+	.loc 1 1673 0
 	ldr	x0, [x22, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 23
-	bls	.L341
-	.loc 1 1763 0
+	bls	.L362
+	.loc 1 1732 0
 	ldr	w2, [x29, 68]
 	mov	w3, w23
-.L338:
+.L359:
 	mov	w1, 7
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL286:
-	cbnz	w0, .L330
+.LVL284:
+	cbnz	w0, .L351
 	.p2align 2
-.L333:
-	.loc 1 1768 0
-	cbnz	w20, .L331
-.L314:
-	.loc 1 1774 0
+.L354:
+	.loc 1 1737 0
+	cbnz	w20, .L352
+.L335:
+	.loc 1 1743 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	w0, w20
 	ldr	x2, [x29, 72]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L342
+	cbnz	x1, .L363
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL287:
+.LVL285:
 	ldr	x23, [sp, 48]
-.LVL288:
+.LVL286:
 	ldp	x29, x30, [sp], 80
 	.cfi_remember_state
 	.cfi_restore 30
@@ -3435,213 +3504,213 @@ ebc_lut_update:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL289:
+.LVL287:
 	.p2align 3
-.L341:
+.L362:
 	.cfi_restore_state
-	.loc 1 1707 0
-	adrp	x1, .L320
-	.loc 1 1709 0
+	.loc 1 1673 0
+	adrp	x1, .L341
+	.loc 1 1675 0
 	mov	w3, w23
-	.loc 1 1707 0
-	add	x1, x1, :lo12:.L320
-	.loc 1 1709 0
+	.loc 1 1673 0
+	add	x1, x1, :lo12:.L341
+	.loc 1 1675 0
 	ldr	w2, [x29, 68]
-	.loc 1 1707 0
+	.loc 1 1673 0
 	ldrb	w0, [x1,w0,uxtw]
-	adr	x1, .Lrtx320
+	adr	x1, .Lrtx341
 	add	x0, x1, w0, sxtb #2
 	br	x0
-.Lrtx320:
+.Lrtx341:
 	.section	.rodata
 	.align	0
 	.align	2
-.L320:
-	.byte	(.L338 - .Lrtx320) / 4
-	.byte	(.L321 - .Lrtx320) / 4
-	.byte	(.L338 - .Lrtx320) / 4
-	.byte	(.L322 - .Lrtx320) / 4
-	.byte	(.L323 - .Lrtx320) / 4
-	.byte	(.L324 - .Lrtx320) / 4
-	.byte	(.L325 - .Lrtx320) / 4
-	.byte	(.L338 - .Lrtx320) / 4
-	.byte	(.L322 - .Lrtx320) / 4
-	.byte	(.L323 - .Lrtx320) / 4
-	.byte	(.L324 - .Lrtx320) / 4
-	.byte	(.L325 - .Lrtx320) / 4
-	.byte	(.L326 - .Lrtx320) / 4
-	.byte	(.L326 - .Lrtx320) / 4
-	.byte	(.L327 - .Lrtx320) / 4
-	.byte	(.L328 - .Lrtx320) / 4
-	.byte	(.L327 - .Lrtx320) / 4
-	.byte	(.L329 - .Lrtx320) / 4
-	.byte	(.L338 - .Lrtx320) / 4
-	.byte	(.L338 - .Lrtx320) / 4
-	.byte	(.L338 - .Lrtx320) / 4
-	.byte	(.L338 - .Lrtx320) / 4
-	.byte	(.L327 - .Lrtx320) / 4
-	.byte	(.L328 - .Lrtx320) / 4
+.L341:
+	.byte	(.L359 - .Lrtx341) / 4
+	.byte	(.L342 - .Lrtx341) / 4
+	.byte	(.L359 - .Lrtx341) / 4
+	.byte	(.L343 - .Lrtx341) / 4
+	.byte	(.L344 - .Lrtx341) / 4
+	.byte	(.L345 - .Lrtx341) / 4
+	.byte	(.L346 - .Lrtx341) / 4
+	.byte	(.L359 - .Lrtx341) / 4
+	.byte	(.L343 - .Lrtx341) / 4
+	.byte	(.L344 - .Lrtx341) / 4
+	.byte	(.L345 - .Lrtx341) / 4
+	.byte	(.L346 - .Lrtx341) / 4
+	.byte	(.L347 - .Lrtx341) / 4
+	.byte	(.L347 - .Lrtx341) / 4
+	.byte	(.L348 - .Lrtx341) / 4
+	.byte	(.L349 - .Lrtx341) / 4
+	.byte	(.L348 - .Lrtx341) / 4
+	.byte	(.L350 - .Lrtx341) / 4
+	.byte	(.L359 - .Lrtx341) / 4
+	.byte	(.L359 - .Lrtx341) / 4
+	.byte	(.L359 - .Lrtx341) / 4
+	.byte	(.L359 - .Lrtx341) / 4
+	.byte	(.L348 - .Lrtx341) / 4
+	.byte	(.L349 - .Lrtx341) / 4
 	.text
-.LVL290:
+.LVL288:
 	.p2align 3
-.L315:
-	.loc 1 1702 0
+.L336:
+	.loc 1 1668 0
 	add	x22, x21, 184
 	mov	w2, w0
 	adrp	x1, .LC12
 	add	x1, x1, :lo12:.LC12
 	ldr	x0, [x22, 104]
 	bl	_dev_err
-.LVL291:
+.LVL289:
 	ldr	w2, [x29, 68]
-	b	.L317
+	b	.L338
 	.p2align 3
-.L340:
-	.loc 1 1697 0
+.L361:
+	.loc 1 1663 0
 	ldr	x0, [x22, 104]
 	adrp	x1, .LC11
 	add	x1, x1, :lo12:.LC11
 	bl	_dev_info
-.LVL292:
-	.loc 1 1698 0
+.LVL290:
+	.loc 1 1664 0
 	mov	w2, 50
 	str	w2, [x29, 68]
-.LVL293:
-	b	.L317
+.LVL291:
+	b	.L338
 	.p2align 3
-.L329:
-	.loc 1 1709 0
+.L350:
+	.loc 1 1675 0
 	mov	w1, 1
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL294:
-	cbz	w0, .L333
+.LVL292:
+	cbz	w0, .L354
 	.p2align 2
-.L330:
-	.loc 1 1698 0
+.L351:
+	.loc 1 1664 0
 	mov	w20, -1
-.L331:
-	.loc 1 1769 0
+.L352:
+	.loc 1 1738 0
 	ldr	x0, [x22, 104]
 	adrp	x1, .LC14
 	add	x1, x1, :lo12:.LC14
 	bl	_dev_err
-.LVL295:
-	.loc 1 1770 0
-	b	.L314
+.LVL293:
+	.loc 1 1739 0
+	b	.L335
 	.p2align 3
-.L323:
-	.loc 1 1749 0
+.L344:
+	.loc 1 1718 0
 	mov	w1, 9
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL296:
-	cbnz	w0, .L330
-	b	.L333
+.LVL294:
+	cbnz	w0, .L351
+	b	.L354
 	.p2align 3
-.L324:
-	.loc 1 1754 0
+.L345:
+	.loc 1 1723 0
 	mov	w1, 10
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL297:
-	cbnz	w0, .L330
-	b	.L333
+.LVL295:
+	cbnz	w0, .L351
+	b	.L354
 	.p2align 3
-.L321:
-	.loc 1 1723 0
+.L342:
+	.loc 1 1690 0
 	mov	w1, 5
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL298:
-	cbnz	w0, .L330
-	b	.L333
+.LVL296:
+	cbnz	w0, .L351
+	b	.L354
 	.p2align 3
-.L322:
-	.loc 1 1744 0
+.L343:
+	.loc 1 1713 0
 	mov	w1, 8
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL299:
-	cbnz	w0, .L330
-	b	.L333
+.LVL297:
+	cbnz	w0, .L351
+	b	.L354
 	.p2align 3
-.L325:
-	.loc 1 1759 0
+.L346:
+	.loc 1 1728 0
 	mov	w1, 11
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL300:
-	cbnz	w0, .L330
-	b	.L333
+.LVL298:
+	cbnz	w0, .L351
+	b	.L354
 	.p2align 3
-.L326:
-	.loc 1 1728 0
+.L347:
+	.loc 1 1697 0
 	mov	w1, 6
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL301:
-	cbnz	w0, .L330
-	b	.L333
+.LVL299:
+	cbnz	w0, .L351
+	b	.L354
 	.p2align 3
-.L327:
-	.loc 1 1734 0
+.L348:
+	.loc 1 1703 0
 	mov	w1, 4
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL302:
-	cbnz	w0, .L330
-	b	.L333
+.LVL300:
+	cbnz	w0, .L351
+	b	.L354
 	.p2align 3
-.L328:
-	.loc 1 1739 0
+.L349:
+	.loc 1 1708 0
 	mov	w1, 3
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL303:
-	cbnz	w0, .L330
-	b	.L333
+.LVL301:
+	cbnz	w0, .L351
+	b	.L354
 	.p2align 3
-.L339:
-	.loc 1 1693 0
+.L360:
+	.loc 1 1659 0
 	ldr	x0, [x22, 104]
 	adrp	x1, .LC10
 	add	x1, x1, :lo12:.LC10
 	bl	_dev_info
-.LVL304:
-	.loc 1 1694 0
+.LVL302:
+	.loc 1 1660 0
 	str	wzr, [x29, 68]
 	mov	w2, 0
-	b	.L317
-.L342:
-	.loc 1 1774 0
+	b	.L338
+.L363:
+	.loc 1 1743 0
 	bl	__stack_chk_fail
-.LVL305:
+.LVL303:
 	.cfi_endproc
-.LFE2832:
+.LFE2833:
 	.size	ebc_lut_update, .-ebc_lut_update
 	.align	2
 	.p2align 3,,7
 	.type	ebc_buf_state_read, %function
 ebc_buf_state_read:
-.LFB2853:
-	.loc 1 2655 0
+.LFB2854:
+	.loc 1 2627 0
 	.cfi_startproc
-.LVL306:
+.LVL304:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2656 0
+	.loc 1 2628 0
 	mov	x0, x2
-.LVL307:
-	.loc 1 2655 0
+.LVL305:
+	.loc 1 2627 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2656 0
+	.loc 1 2628 0
 	bl	ebc_buf_state_show
-.LVL308:
-	.loc 1 2657 0
+.LVL306:
+	.loc 1 2629 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3649,39 +3718,39 @@ ebc_buf_state_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2853:
+.LFE2854:
 	.size	ebc_buf_state_read, .-ebc_buf_state_read
 	.align	2
 	.p2align 3,,7
 	.type	ebc_state_read, %function
 ebc_state_read:
-.LFB2852:
-	.loc 1 2646 0
+.LFB2853:
+	.loc 1 2618 0
 	.cfi_startproc
-.LVL309:
+.LVL307:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2647 0
+	.loc 1 2619 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2646 0
+	.loc 1 2618 0
 	mov	x0, x2
-.LVL310:
-	.loc 1 2647 0
+.LVL308:
+	.loc 1 2619 0
 	adrp	x1, .LC15
-.LVL311:
-	.loc 1 2646 0
+.LVL309:
+	.loc 1 2618 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2647 0
+	.loc 1 2619 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL312:
+.LVL310:
 	add	x1, x1, :lo12:.LC15
 	ldr	w2, [x2, 624]
 	bl	sprintf
-.LVL313:
-	.loc 1 2648 0
+.LVL311:
+	.loc 1 2620 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3689,38 +3758,38 @@ ebc_state_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2852:
+.LFE2853:
 	.size	ebc_state_read, .-ebc_state_read
 	.align	2
 	.p2align 3,,7
 	.type	ebc_version_read, %function
 ebc_version_read:
-.LFB2851:
-	.loc 1 2637 0
+.LFB2852:
+	.loc 1 2609 0
 	.cfi_startproc
-.LVL314:
+.LVL312:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mov	x0, x2
-.LVL315:
-	.loc 1 2638 0
+.LVL313:
+	.loc 1 2610 0
 	adrp	x1, .LC17
-.LVL316:
+.LVL314:
 	adrp	x2, .LC16
-.LVL317:
-	.loc 1 2637 0
+.LVL315:
+	.loc 1 2609 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2638 0
+	.loc 1 2610 0
 	add	x2, x2, :lo12:.LC16
-	.loc 1 2637 0
-	.loc 1 2638 0
+	.loc 1 2609 0
+	.loc 1 2610 0
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
-.LVL318:
-	.loc 1 2639 0
+.LVL316:
+	.loc 1 2611 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3728,56 +3797,56 @@ ebc_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2851:
+.LFE2852:
 	.size	ebc_version_read, .-ebc_version_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
-.LFB2849:
-	.loc 1 2601 0
+.LFB2850:
+	.loc 1 2573 0
 	.cfi_startproc
-.LVL319:
+.LVL317:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 2602 0
+	.loc 1 2574 0
 	adrp	x0, .LANCHOR0
-.LVL320:
-	.loc 1 2601 0
+.LVL318:
+	.loc 1 2573 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2605 0
+	.loc 1 2577 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2601 0
+	.loc 1 2573 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2601 0
+	.loc 1 2573 0
 	mov	x19, x2
-	.loc 1 2605 0
+	.loc 1 2577 0
 	ldr	x1, [x0, 16]
-.LVL321:
-.LBB1230:
-.LBB1231:
+.LVL319:
+.LBB1232:
+.LBB1233:
 	.loc 3 55 0
 	mov	x0, x1
 	ldr	x1, [x1, 64]
 	blr	x1
-.LVL322:
-.LBE1231:
-.LBE1230:
-	.loc 1 2607 0
+.LVL320:
+.LBE1233:
+.LBE1232:
+	.loc 1 2579 0
 	mov	w2, w0
 	adrp	x1, .LC15
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
-.LVL323:
-	.loc 1 2608 0
+.LVL321:
+	.loc 1 2580 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL324:
+.LVL322:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3785,72 +3854,72 @@ pmic_vcom_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2849:
+.LFE2850:
 	.size	pmic_vcom_read, .-pmic_vcom_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_temp_read, %function
 pmic_temp_read:
-.LFB2848:
-	.loc 1 2587 0
+.LFB2849:
+	.loc 1 2559 0
 	.cfi_startproc
-.LVL325:
+.LVL323:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 2588 0
+	.loc 1 2560 0
 	adrp	x0, .LANCHOR0
-.LVL326:
-	.loc 1 2587 0
+.LVL324:
+	.loc 1 2559 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2591 0
+	.loc 1 2563 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-.LBB1232:
-.LBB1233:
+.LBB1234:
+.LBB1235:
 	.loc 3 50 0
 	add	x1, x29, 36
-.LVL327:
-.LBE1233:
-.LBE1232:
-	.loc 1 2587 0
+.LVL325:
+.LBE1235:
+.LBE1234:
+	.loc 1 2559 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 2587 0
+	.loc 1 2559 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
-.LVL328:
-	.loc 1 2591 0
+.LVL326:
+	.loc 1 2563 0
 	ldr	x2, [x0, 16]
-.LBB1235:
-.LBB1234:
+.LBB1237:
+.LBB1236:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL329:
-.LBE1234:
-.LBE1235:
-	.loc 1 2593 0
+.LVL327:
+.LBE1236:
+.LBE1237:
+	.loc 1 2565 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC15
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
-.LVL330:
-	.loc 1 2594 0
+.LVL328:
+	.loc 1 2566 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L354
+	cbnz	x1, .L375
 	ldp	x19, x20, [sp, 16]
-.LVL331:
+.LVL329:
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -3860,46 +3929,46 @@ pmic_temp_read:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL332:
-.L354:
+.LVL330:
+.L375:
 	.cfi_restore_state
 	bl	__stack_chk_fail
-.LVL333:
+.LVL331:
 	.cfi_endproc
-.LFE2848:
+.LFE2849:
 	.size	pmic_temp_read, .-pmic_temp_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_name_read, %function
 pmic_name_read:
-.LFB2847:
-	.loc 1 2576 0
+.LFB2848:
+	.loc 1 2548 0
 	.cfi_startproc
-.LVL334:
+.LVL332:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2577 0
+	.loc 1 2549 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2576 0
+	.loc 1 2548 0
 	mov	x0, x2
-.LVL335:
-	.loc 1 2579 0
+.LVL333:
+	.loc 1 2551 0
 	adrp	x1, .LC17
-.LVL336:
-	.loc 1 2576 0
+.LVL334:
+	.loc 1 2548 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2579 0
+	.loc 1 2551 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL337:
+.LVL335:
 	add	x1, x1, :lo12:.LC17
 	ldr	x2, [x2, 16]
 	add	x2, x2, 8
 	bl	sprintf
-.LVL338:
-	.loc 1 2580 0
+.LVL336:
+	.loc 1 2552 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3907,24 +3976,24 @@ pmic_name_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2847:
+.LFE2848:
 	.size	pmic_name_read, .-pmic_name_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
-.LFB2850:
-	.loc 1 2613 0
+.LFB2851:
+	.loc 1 2585 0
 	.cfi_startproc
-.LVL339:
+.LVL337:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 2614 0
+	.loc 1 2586 0
 	adrp	x0, .LANCHOR0
-.LVL340:
-	.loc 1 2613 0
+.LVL338:
+	.loc 1 2585 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -3934,47 +4003,47 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 2613 0
+	.loc 1 2585 0
 	add	x1, x19, :lo12:__stack_chk_guard
-.LVL341:
+.LVL339:
 	mov	x21, x2
-	.loc 1 2614 0
+	.loc 1 2586 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
-.LVL342:
-	.loc 1 2613 0
+.LVL340:
+	.loc 1 2585 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
-.LVL343:
+.LVL341:
 	mov	x20, x3
-	.loc 1 2617 0
+	.loc 1 2589 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
-.LVL344:
-	.loc 1 2618 0
-	cbnz	w0, .L364
-.LVL345:
-	.loc 1 2622 0
+.LVL342:
+	.loc 1 2590 0
+	cbnz	w0, .L385
+.LVL343:
+	.loc 1 2594 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
-.LVL346:
-	.loc 1 2623 0
-	cbnz	w0, .L365
-.L357:
-	.loc 1 2629 0
+.LVL344:
+	.loc 1 2595 0
+	cbnz	w0, .L386
+.L378:
+	.loc 1 2601 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
-.LVL347:
+.LVL345:
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L366
+	cbnz	x1, .L387
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL348:
+.LVL346:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -3985,53 +4054,53 @@ pmic_vcom_write:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL349:
+.LVL347:
 	.p2align 3
-.L364:
+.L385:
 	.cfi_restore_state
-	.loc 1 2619 0
+	.loc 1 2591 0
 	ldr	x0, [x22]
 	adrp	x1, .LC18
 	mov	x2, x21
 	add	x1, x1, :lo12:.LC18
-	.loc 1 2620 0
+	.loc 1 2592 0
 	mov	x20, -1
-.LVL350:
-	.loc 1 2619 0
+.LVL348:
+	.loc 1 2591 0
 	bl	_dev_err
-.LVL351:
-	.loc 1 2620 0
-	b	.L357
-.LVL352:
+.LVL349:
+	.loc 1 2592 0
+	b	.L378
+.LVL350:
 	.p2align 3
-.L365:
-	.loc 1 2624 0
+.L386:
+	.loc 1 2596 0
 	ldr	x0, [x22]
 	adrp	x1, .LC19
-	.loc 1 2625 0
+	.loc 1 2597 0
 	mov	x20, -1
-.LVL353:
-	.loc 1 2624 0
+.LVL351:
+	.loc 1 2596 0
 	add	x1, x1, :lo12:.LC19
 	bl	_dev_err
-.LVL354:
-	.loc 1 2625 0
-	b	.L357
-.L366:
-	.loc 1 2629 0
+.LVL352:
+	.loc 1 2597 0
+	b	.L378
+.L387:
+	.loc 1 2601 0
 	bl	__stack_chk_fail
-.LVL355:
+.LVL353:
 	.cfi_endproc
-.LFE2850:
+.LFE2851:
 	.size	pmic_vcom_write, .-pmic_vcom_write
 	.align	2
 	.p2align 3,,7
 	.type	waveform_version_read, %function
 waveform_version_read:
-.LFB2846:
-	.loc 1 2565 0
+.LFB2847:
+	.loc 1 2537 0
 	.cfi_startproc
-.LVL356:
+.LVL354:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -4040,22 +4109,22 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2565 0
+	.loc 1 2537 0
 	mov	x19, x2
-	.loc 1 2566 0
+	.loc 1 2538 0
 	bl	epd_lut_get_wf_version
-.LVL357:
-	.loc 1 2568 0
+.LVL355:
+	.loc 1 2540 0
 	mov	x2, x0
 	adrp	x1, .LC17
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
-.LVL358:
-	.loc 1 2569 0
+.LVL356:
+	.loc 1 2541 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL359:
+.LVL357:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -4063,47 +4132,47 @@ waveform_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2846:
+.LFE2847:
 	.size	waveform_version_read, .-waveform_version_read
 	.section	.init.text,"ax",@progbits
 	.align	2
 	.type	ebc_init, %function
 ebc_init:
-.LFB2864:
-	.loc 1 3110 0
+.LFB2865:
+	.loc 1 3082 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3111 0
+	.loc 1 3083 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3110 0
+	.loc 1 3082 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3111 0
+	.loc 1 3083 0
 	bl	__platform_driver_register
-.LVL360:
-	.loc 1 3112 0
+.LVL358:
+	.loc 1 3084 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2864:
+.LFE2865:
 	.size	ebc_init, .-ebc_init
 	.text
 	.align	2
 	.p2align 3,,7
 	.type	direct_mode_data_change, %function
 direct_mode_data_change:
-.LFB2820:
+.LFB2821:
 	.loc 1 1087 0
 	.cfi_startproc
-.LVL361:
+.LVL359:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
@@ -4120,13 +4189,13 @@ direct_mode_data_change:
 	ldr	x4, [x3, 224]
 	ldr	w4, [x4, 64]
 	cmp	w4, 32
-	beq	.L423
+	beq	.L444
 	.loc 1 1091 0
 	cmp	w4, 16
-	beq	.L424
-.L380:
-.LBB1262:
-.LBB1263:
+	beq	.L445
+.L401:
+.LBB1264:
+.LBB1265:
 	.loc 1 1017 0
 	adrp	x6, .LANCHOR0
 	.loc 1 1023 0
@@ -4136,62 +4205,62 @@ direct_mode_data_change:
 	ldr	x11, [x6, #:lo12:.LANCHOR0]
 	.loc 1 1024 0
 	ldr	x3, [x3, 128]
-.LVL362:
+.LVL360:
 	.loc 1 1023 0
 	sub	w5, w5, w4
-.LVL363:
+.LVL361:
 	.loc 1 1025 0
 	add	x11, x11, 24
 	.loc 1 1024 0
 	lsl	w5, w5, 16
-.LVL364:
+.LVL362:
 	add	x5, x3, x5, sxtw
-.LVL365:
+.LVL363:
 	.loc 1 1028 0
 	ldr	w14, [x11, 88]
 	.loc 1 1027 0
 	ldr	w3, [x11, 84]
 	.loc 1 1025 0
 	ldr	w15, [x11, 156]
-.LVL366:
+.LVL364:
 	.loc 1 1030 0
 	cmp	w14, 0
 	.loc 1 1027 0
 	lsr	w13, w3, 3
 	.loc 1 1030 0
-	ble	.L371
+	ble	.L392
 	sub	w12, w13, #1
 	mov	w10, 0
-.LVL367:
+.LVL365:
 	add	x12, x12, 1
 	lsl	x16, x12, 2
 	lsl	x12, x12, 3
 	.loc 1 1031 0
-	cbz	w15, .L397
-.LVL368:
+	cbz	w15, .L418
+.LVL366:
 	.p2align 2
-.L425:
+.L446:
 	.loc 1 1032 0
 	ldr	w7, [x11, 88]
-.LVL369:
+.LVL367:
 	sub	w7, w7, #1
 	sub	w7, w7, w10
 	mul	w7, w7, w3
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL370:
-.L398:
+.LVL368:
+.L419:
 	.loc 1 1036 0
-	cbz	w13, .L399
+	cbz	w13, .L420
 	add	x9, x1, x16
 	mov	x8, x2
 	.p2align 2
-.L400:
+.L421:
 	.loc 1 1037 0
 	ldr	w3, [x1], 4
 	.loc 1 1038 0
 	ldr	w4, [x8], 8
-.LVL371:
+.LVL369:
 	.loc 1 1043 0
 	and	w20, w3, 15
 	.loc 1 1036 0
@@ -4244,7 +4313,7 @@ direct_mode_data_change:
 	orr	w30, w19, w30, lsl 6
 	.loc 1 1074 0
 	lsr	w3, w3, 28
-.LVL372:
+.LVL370:
 	.loc 1 1055 0
 	orr	w4, w4, w30
 	.loc 1 1057 0
@@ -4288,29 +4357,29 @@ direct_mode_data_change:
 	.loc 1 1078 0
 	strb	w3, [x7, -1]
 	.loc 1 1036 0
-	bne	.L400
+	bne	.L421
 	add	x2, x2, x12
-.L399:
+.L420:
 	.loc 1 1030 0
 	add	w10, w10, 1
 	cmp	w14, w10
-	beq	.L371
+	beq	.L392
 	ldr	w3, [x11, 84]
 	.loc 1 1031 0
-	cbnz	w15, .L425
-.L397:
+	cbnz	w15, .L446
+.L418:
 	.loc 1 1034 0
 	mul	w7, w10, w3
-.LVL373:
+.LVL371:
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL374:
-	b	.L398
-.LVL375:
+.LVL372:
+	b	.L419
+.LVL373:
 	.p2align 3
-.L371:
-.LBE1263:
-.LBE1262:
+.L392:
+.LBE1265:
+.LBE1264:
 	.loc 1 1103 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
@@ -4324,20 +4393,20 @@ direct_mode_data_change:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL376:
-.L424:
+.LVL374:
+.L445:
 	.cfi_restore_state
 	.loc 1 1092 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
 	cmp	w4, 16
-	bne	.L380
+	bne	.L401
 	.loc 1 1093 0
 	ldr	w13, [x3, 88]
-.LVL377:
-	cbz	w13, .L381
-.LBB1264:
-.LBB1265:
+.LVL375:
+	cbz	w13, .L402
+.LBB1266:
+.LBB1267:
 	.loc 1 831 0
 	adrp	x6, .LANCHOR0
 	.loc 1 837 0
@@ -4347,62 +4416,62 @@ direct_mode_data_change:
 	ldr	x12, [x6, #:lo12:.LANCHOR0]
 	.loc 1 838 0
 	ldr	x3, [x3, 128]
-.LVL378:
+.LVL376:
 	.loc 1 837 0
 	sub	w5, w5, w4
-.LVL379:
+.LVL377:
 	.loc 1 839 0
 	add	x12, x12, 24
 	.loc 1 838 0
 	lsl	w5, w5, 16
-.LVL380:
+.LVL378:
 	add	x5, x3, x5, sxtw
-.LVL381:
+.LVL379:
 	.loc 1 842 0
 	ldr	w14, [x12, 88]
 	.loc 1 841 0
 	ldr	w3, [x12, 84]
 	.loc 1 839 0
 	ldr	w15, [x12, 156]
-.LVL382:
+.LVL380:
 	.loc 1 847 0
 	cmp	w14, 0
 	.loc 1 841 0
 	lsr	w13, w3, 4
-.LVL383:
+.LVL381:
 	.loc 1 847 0
-	ble	.L371
+	ble	.L392
 	sub	w11, w13, #1
 	mov	w16, 0
-.LVL384:
+.LVL382:
 	add	x11, x11, 1
 	lsl	x11, x11, 3
 	.loc 1 848 0
-	cbz	w15, .L382
-.LVL385:
-.L426:
+	cbz	w15, .L403
+.LVL383:
+.L447:
 	.loc 1 849 0
 	ldr	w6, [x12, 88]
-.LVL386:
+.LVL384:
 	sub	w6, w6, #1
 	sub	w6, w6, w16
 	mul	w6, w6, w3
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL387:
-.L383:
+.LVL385:
+.L404:
 	.loc 1 853 0
-	cbz	w13, .L384
+	cbz	w13, .L405
 	mov	x7, 0
 	.p2align 2
-.L385:
+.L406:
 	.loc 1 855 0
 	ldr	x4, [x2, x7]
-.LVL388:
+.LVL386:
 	add	x6, x6, 4
 	.loc 1 854 0
 	ldr	x3, [x1, x7]
-.LVL389:
+.LVL387:
 	add	x7, x7, 8
 	.loc 1 857 0
 	and	w9, w4, 65535
@@ -4410,8 +4479,8 @@ direct_mode_data_change:
 	cmp	x11, x7
 	.loc 1 857 0
 	and	w8, w3, 65535
-.LBB1266:
-.LBB1267:
+.LBB1268:
+.LBB1269:
 	.loc 1 133 0
 	ubfiz	w19, w9, 8, 8
 	.loc 1 134 0
@@ -4420,181 +4489,181 @@ direct_mode_data_change:
 	add	w19, w19, w8, uxtb
 	.loc 1 134 0
 	add	w9, w9, w8, lsr 8
-.LBE1267:
-.LBE1266:
+.LBE1269:
+.LBE1268:
 	.loc 1 858 0
 	lsr	w10, w4, 16
 	lsr	w8, w3, 16
-.LBB1271:
-.LBB1272:
+.LBB1273:
+.LBB1274:
 	.loc 1 133 0
 	ubfiz	w18, w10, 8, 8
-.LBE1272:
-.LBE1271:
-.LBB1278:
-.LBB1268:
-	ldrb	w19, [x5, w19, sxtw]
-.LBE1268:
-.LBE1278:
-.LBB1279:
-.LBB1273:
-	.loc 1 134 0
-	and	w10, w10, 65280
+.LBE1274:
 .LBE1273:
-.LBE1279:
 .LBB1280:
-.LBB1269:
-	ldrb	w17, [x5, w9, sxtw]
-.LBE1269:
+.LBB1270:
+	ldrb	w19, [x5, w19, sxtw]
+.LBE1270:
 .LBE1280:
 .LBB1281:
-.LBB1274:
+.LBB1275:
+	.loc 1 134 0
+	and	w10, w10, 65280
+.LBE1275:
+.LBE1281:
+.LBB1282:
+.LBB1271:
+	ldrb	w17, [x5, w9, sxtw]
+.LBE1271:
+.LBE1282:
+.LBB1283:
+.LBB1276:
 	.loc 1 133 0
 	add	w18, w18, w8, uxtb
 	.loc 1 134 0
 	add	w10, w10, w8, lsr 8
-.LBE1274:
-.LBE1281:
+.LBE1276:
+.LBE1283:
 	.loc 1 859 0
 	ubfx	x9, x4, 32, 16
 	ubfx	x8, x3, 32, 16
 	.loc 1 860 0
 	lsr	x4, x4, 48
-.LVL390:
-.LBB1282:
-.LBB1270:
+.LVL388:
+.LBB1284:
+.LBB1272:
 	.loc 1 133 0
 	orr	w17, w19, w17, lsl 4
-.LBE1270:
-.LBE1282:
+.LBE1272:
+.LBE1284:
 	.loc 1 857 0
 	strb	w17, [x6, -4]
-.LBB1283:
-.LBB1284:
+.LBB1285:
+.LBB1286:
 	.loc 1 133 0
 	ubfiz	w17, w9, 8, 8
 	.loc 1 134 0
 	and	w9, w9, 65280
-.LBE1284:
-.LBE1283:
-.LBB1290:
-.LBB1275:
-	ldrb	w10, [x5, w10, sxtw]
-.LBE1275:
-.LBE1290:
-.LBB1291:
-.LBB1285:
-	.loc 1 133 0
-	add	w17, w17, w8, uxtb
+.LBE1286:
 .LBE1285:
-.LBE1291:
 .LBB1292:
-.LBB1276:
-	ldrb	w18, [x5, w18, sxtw]
-.LBE1276:
+.LBB1277:
+	ldrb	w10, [x5, w10, sxtw]
+.LBE1277:
 .LBE1292:
 .LBB1293:
-.LBB1286:
+.LBB1287:
+	.loc 1 133 0
+	add	w17, w17, w8, uxtb
+.LBE1287:
+.LBE1293:
+.LBB1294:
+.LBB1278:
+	ldrb	w18, [x5, w18, sxtw]
+.LBE1278:
+.LBE1294:
+.LBB1295:
+.LBB1288:
 	.loc 1 134 0
 	add	w8, w9, w8, lsr 8
-.LBE1286:
-.LBE1293:
+.LBE1288:
+.LBE1295:
 	.loc 1 860 0
 	lsr	x3, x3, 48
-.LVL391:
-.LBB1294:
-.LBB1277:
+.LVL389:
+.LBB1296:
+.LBB1279:
 	.loc 1 133 0
 	orr	w9, w18, w10, lsl 4
-.LBE1277:
-.LBE1294:
+.LBE1279:
+.LBE1296:
 	.loc 1 858 0
 	strb	w9, [x6, -3]
-.LBB1295:
-.LBB1296:
+.LBB1297:
+.LBB1298:
 	.loc 1 133 0
 	ubfiz	w9, w4, 8, 8
 	.loc 1 134 0
 	and	w4, w4, 65280
-.LBE1296:
-.LBE1295:
-.LBB1300:
-.LBB1287:
-	ldrb	w10, [x5, w8, sxtw]
-.LBE1287:
-.LBE1300:
-.LBB1301:
-.LBB1297:
-	.loc 1 133 0
-	add	w8, w9, w3, uxtb
+.LBE1298:
 .LBE1297:
-.LBE1301:
 .LBB1302:
-.LBB1288:
-	ldrb	w17, [x5, w17, sxtw]
-.LBE1288:
+.LBB1289:
+	ldrb	w10, [x5, w8, sxtw]
+.LBE1289:
 .LBE1302:
 .LBB1303:
-.LBB1298:
-	.loc 1 134 0
-	add	w3, w4, w3, lsr 8
-.LBE1298:
+.LBB1299:
+	.loc 1 133 0
+	add	w8, w9, w3, uxtb
+.LBE1299:
 .LBE1303:
 .LBB1304:
-.LBB1289:
+.LBB1290:
+	ldrb	w17, [x5, w17, sxtw]
+.LBE1290:
+.LBE1304:
+.LBB1305:
+.LBB1300:
+	.loc 1 134 0
+	add	w3, w4, w3, lsr 8
+.LBE1300:
+.LBE1305:
+.LBB1306:
+.LBB1291:
 	.loc 1 133 0
 	orr	w4, w17, w10, lsl 4
-.LBE1289:
-.LBE1304:
+.LBE1291:
+.LBE1306:
 	.loc 1 859 0
 	strb	w4, [x6, -2]
-.LBB1305:
-.LBB1299:
+.LBB1307:
+.LBB1301:
 	.loc 1 134 0
 	ldrb	w3, [x5, w3, sxtw]
 	.loc 1 133 0
 	ldrb	w4, [x5, w8, sxtw]
 	orr	w3, w4, w3, lsl 4
-.LBE1299:
-.LBE1305:
+.LBE1301:
+.LBE1307:
 	.loc 1 860 0
 	strb	w3, [x6, -1]
 	.loc 1 853 0
-	bne	.L385
+	bne	.L406
 	add	x1, x1, x11
-.LVL392:
+.LVL390:
 	add	x2, x2, x11
-.LVL393:
-.L384:
+.LVL391:
+.L405:
 	.loc 1 847 0
 	add	w16, w16, 1
 	cmp	w14, w16
-	beq	.L371
+	beq	.L392
 	ldr	w3, [x12, 84]
 	.loc 1 848 0
-	cbnz	w15, .L426
-.L382:
+	cbnz	w15, .L447
+.L403:
 	.loc 1 851 0
 	mul	w6, w16, w3
-.LVL394:
+.LVL392:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL395:
-	b	.L383
-.LVL396:
-.L423:
-.LBE1265:
-.LBE1264:
+.LVL393:
+	b	.L404
+.LVL394:
+.L444:
+.LBE1267:
+.LBE1266:
 	.loc 1 1089 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
 	cmp	w4, 32
-	beq	.L427
+	beq	.L448
 	.loc 1 1098 0
 	cmp	w4, 16
-	bne	.L380
-.LBB1306:
-.LBB1307:
+	bne	.L401
+.LBB1308:
+.LBB1309:
 	.loc 1 947 0
 	adrp	x6, .LANCHOR0
 	.loc 1 953 0
@@ -4604,63 +4673,63 @@ direct_mode_data_change:
 	ldr	x11, [x6, #:lo12:.LANCHOR0]
 	.loc 1 954 0
 	ldr	x3, [x3, 128]
-.LVL397:
+.LVL395:
 	.loc 1 953 0
 	sub	w5, w5, w4
-.LVL398:
+.LVL396:
 	.loc 1 955 0
 	add	x11, x11, 24
 	.loc 1 954 0
 	lsl	w5, w5, 16
-.LVL399:
+.LVL397:
 	add	x5, x3, x5, sxtw
-.LVL400:
+.LVL398:
 	.loc 1 958 0
 	ldr	w14, [x11, 88]
 	.loc 1 957 0
 	ldr	w3, [x11, 84]
 	.loc 1 955 0
 	ldr	w15, [x11, 156]
-.LVL401:
+.LVL399:
 	.loc 1 960 0
 	cmp	w14, 0
 	.loc 1 957 0
 	lsr	w13, w3, 3
 	.loc 1 960 0
-	ble	.L371
+	ble	.L392
 	sub	w12, w13, #1
 	mov	w10, 0
-.LVL402:
+.LVL400:
 	add	x12, x12, 1
 	lsl	x16, x12, 3
 	lsl	x12, x12, 2
 	.loc 1 961 0
-	cbz	w15, .L392
-.LVL403:
-.L428:
+	cbz	w15, .L413
+.LVL401:
+.L449:
 	.loc 1 962 0
 	ldr	w7, [x11, 88]
-.LVL404:
+.LVL402:
 	sub	w7, w7, #1
 	sub	w7, w7, w10
 	mul	w7, w7, w3
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL405:
-.L393:
+.LVL403:
+.L414:
 	.loc 1 966 0
-	cbz	w13, .L394
+	cbz	w13, .L415
 	add	x9, x1, x16
 	mov	x8, x2
 	.p2align 2
-.L395:
+.L416:
 	.loc 1 967 0
 	ldr	w6, [x1], 8
 	.loc 1 968 0
 	ldr	w3, [x8], 4
 	.loc 1 966 0
 	cmp	x1, x9
-.LVL406:
+.LVL404:
 	.loc 1 972 0
 	and	w4, w3, 255
 	.loc 1 975 0
@@ -4767,30 +4836,30 @@ direct_mode_data_change:
 	.loc 1 1008 0
 	strb	w3, [x7, -1]
 	.loc 1 966 0
-	bne	.L395
+	bne	.L416
 	add	x2, x2, x12
-.L394:
+.L415:
 	.loc 1 960 0
 	add	w10, w10, 1
 	cmp	w14, w10
-	beq	.L371
+	beq	.L392
 	ldr	w3, [x11, 84]
 	.loc 1 961 0
-	cbnz	w15, .L428
-.L392:
+	cbnz	w15, .L449
+.L413:
 	.loc 1 964 0
 	mul	w7, w10, w3
-.LVL407:
+.LVL405:
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL408:
-	b	.L393
-.LVL409:
-.L381:
-.LBE1307:
-.LBE1306:
-.LBB1308:
-.LBB1309:
+.LVL406:
+	b	.L414
+.LVL407:
+.L402:
+.LBE1309:
+.LBE1308:
+.LBB1310:
+.LBB1311:
 	.loc 1 871 0
 	adrp	x5, .LANCHOR0
 	.loc 1 877 0
@@ -4800,159 +4869,159 @@ direct_mode_data_change:
 	ldr	x15, [x5, #:lo12:.LANCHOR0]
 	.loc 1 878 0
 	ldr	x3, [x3, 128]
-.LVL410:
+.LVL408:
 	.loc 1 877 0
 	sub	w7, w7, w4
-.LVL411:
+.LVL409:
 	.loc 1 879 0
 	add	x15, x15, 24
 	.loc 1 878 0
 	lsl	w7, w7, 16
-.LVL412:
+.LVL410:
 	add	x7, x3, x7, sxtw
-.LVL413:
+.LVL411:
 	.loc 1 882 0
 	ldr	w16, [x15, 88]
 	.loc 1 881 0
 	ldr	w3, [x15, 84]
 	.loc 1 879 0
 	ldr	w17, [x15, 156]
-.LVL414:
+.LVL412:
 	.loc 1 887 0
 	cmp	w16, 0
 	.loc 1 881 0
 	lsr	w12, w3, 3
-.LVL415:
+.LVL413:
 	.loc 1 887 0
-	ble	.L371
+	ble	.L392
 	sub	w14, w12, #1
 	add	x14, x14, 1
 	lsl	x14, x14, 2
 	.loc 1 888 0
-	cbz	w17, .L387
-.LVL416:
-.L429:
+	cbz	w17, .L408
+.LVL414:
+.L450:
 	.loc 1 889 0
 	ldr	w10, [x15, 88]
-.LVL417:
+.LVL415:
 	sub	w10, w10, #1
 	sub	w10, w10, w13
 	mul	w10, w10, w3
 	lsr	w10, w10, 2
 	add	x10, x0, x10
-.LVL418:
-.L388:
+.LVL416:
+.L409:
 	.loc 1 893 0
-	cbz	w12, .L389
+	cbz	w12, .L410
 	mov	x5, 0
 	.p2align 2
-.L390:
+.L411:
 	.loc 1 895 0
 	ldr	w3, [x2, x5, lsl 2]
 	.loc 1 894 0
 	ldr	w4, [x1, x5, lsl 2]
 	add	x5, x5, 1
-.LVL419:
-.LBB1310:
-.LBB1311:
+.LVL417:
+.LBB1312:
+.LBB1313:
 	.loc 1 134 0
 	and	w9, w3, 65280
-.LBE1311:
-.LBE1310:
+.LBE1313:
+.LBE1312:
 	.loc 1 893 0
 	cmp	w12, w5
-.LVL420:
+.LVL418:
 	.loc 1 897 0
 	and	w6, w4, 65535
-.LBB1316:
-.LBB1312:
+.LBB1318:
+.LBB1314:
 	.loc 1 133 0
 	ubfiz	w8, w3, 8, 8
 	.loc 1 134 0
 	add	w9, w9, w6, lsr 8
 	.loc 1 133 0
 	add	w6, w8, w6, uxtb
-.LBE1312:
-.LBE1316:
+.LBE1314:
+.LBE1318:
 	.loc 1 898 0
 	lsr	w3, w3, 16
-.LVL421:
+.LVL419:
 	lsr	w4, w4, 16
-.LBB1317:
-.LBB1318:
+.LBB1319:
+.LBB1320:
 	.loc 1 133 0
 	ubfiz	w8, w3, 8, 8
 	.loc 1 134 0
 	and	w3, w3, 65280
-.LBE1318:
-.LBE1317:
-.LBB1322:
-.LBB1313:
+.LBE1320:
+.LBE1319:
+.LBB1324:
+.LBB1315:
 	.loc 1 133 0
 	ldrb	w11, [x7, w6, sxtw]
-.LBE1313:
-.LBE1322:
-.LBB1323:
-.LBB1319:
+.LBE1315:
+.LBE1324:
+.LBB1325:
+.LBB1321:
 	.loc 1 134 0
 	add	w3, w3, w4, lsr 8
-.LBE1319:
-.LBE1323:
-.LBB1324:
-.LBB1314:
+.LBE1321:
+.LBE1325:
+.LBB1326:
+.LBB1316:
 	ldrb	w9, [x7, w9, sxtw]
-.LBE1314:
-.LBE1324:
-.LBB1325:
-.LBB1320:
+.LBE1316:
+.LBE1326:
+.LBB1327:
+.LBB1322:
 	.loc 1 133 0
 	add	w6, w8, w4, uxtb
-.LBE1320:
-.LBE1325:
-.LBB1326:
-.LBB1315:
+.LBE1322:
+.LBE1327:
+.LBB1328:
+.LBB1317:
 	orr	w4, w11, w9, lsl 4
-.LBE1315:
-.LBE1326:
+.LBE1317:
+.LBE1328:
 	.loc 1 897 0
 	strb	w4, [x10], 2
-.LBB1327:
-.LBB1321:
+.LBB1329:
+.LBB1323:
 	.loc 1 134 0
 	ldrb	w3, [x7, w3, sxtw]
 	.loc 1 133 0
 	ldrb	w4, [x7, w6, sxtw]
 	orr	w3, w4, w3, lsl 4
-.LBE1321:
-.LBE1327:
+.LBE1323:
+.LBE1329:
 	.loc 1 898 0
 	strb	w3, [x10, -1]
 	.loc 1 893 0
-	bgt	.L390
+	bgt	.L411
 	add	x1, x1, x14
 	add	x2, x2, x14
-.L389:
+.L410:
 	.loc 1 887 0
 	add	w13, w13, 1
 	cmp	w16, w13
-	beq	.L371
+	beq	.L392
 	ldr	w3, [x15, 84]
 	.loc 1 888 0
-	cbnz	w17, .L429
-.L387:
+	cbnz	w17, .L450
+.L408:
 	.loc 1 891 0
 	mul	w10, w13, w3
-.LVL422:
+.LVL420:
 	lsr	w10, w10, 2
 	add	x10, x0, x10
-.LVL423:
-	b	.L388
-.LVL424:
-.L427:
-.LBE1309:
-.LBE1308:
-.LBB1328:
-.LBB1329:
+.LVL421:
+	b	.L409
+.LVL422:
+.L448:
+.LBE1311:
+.LBE1310:
+.LBB1330:
+.LBB1331:
 	.loc 1 908 0
 	adrp	x5, .LANCHOR0
 	.loc 1 914 0
@@ -4962,173 +5031,173 @@ direct_mode_data_change:
 	ldr	x15, [x5, #:lo12:.LANCHOR0]
 	.loc 1 915 0
 	ldr	x3, [x3, 128]
-.LVL425:
+.LVL423:
 	.loc 1 914 0
 	sub	w8, w8, w4
-.LVL426:
+.LVL424:
 	.loc 1 916 0
 	add	x15, x15, 24
 	.loc 1 915 0
 	lsl	w8, w8, 16
-.LVL427:
+.LVL425:
 	add	x8, x3, x8, sxtw
-.LVL428:
+.LVL426:
 	.loc 1 921 0
 	ldr	w16, [x15, 88]
 	.loc 1 920 0
 	ldr	w3, [x15, 84]
 	.loc 1 916 0
 	ldr	w17, [x15, 156]
-.LVL429:
+.LVL427:
 	.loc 1 926 0
 	cmp	w16, 0
 	.loc 1 920 0
 	lsr	w12, w3, 2
-.LVL430:
+.LVL428:
 	.loc 1 926 0
-	ble	.L371
+	ble	.L392
 	sub	w14, w12, #1
 	mov	w13, 0
-.LVL431:
+.LVL429:
 	add	x14, x14, 1
 	lsl	x14, x14, 2
 	.loc 1 927 0
-	cbz	w17, .L376
-.LVL432:
-.L430:
+	cbz	w17, .L397
+.LVL430:
+.L451:
 	.loc 1 928 0
 	ldr	w11, [x15, 88]
-.LVL433:
+.LVL431:
 	sub	w11, w11, #1
 	sub	w11, w11, w13
 	mul	w11, w11, w3
 	lsr	w11, w11, 2
 	add	x11, x0, x11
-.LVL434:
-.L377:
+.LVL432:
+.L398:
 	.loc 1 932 0
-	cbz	w12, .L378
+	cbz	w12, .L399
 	mov	x4, 0
 	.p2align 2
-.L379:
+.L400:
 	.loc 1 934 0
 	ldr	w5, [x2, x4, lsl 2]
 	.loc 1 933 0
 	ldr	w3, [x1, x4, lsl 2]
-.LVL435:
-.LBB1330:
-.LBB1331:
+.LVL433:
+.LBB1332:
+.LBB1333:
 	.loc 1 140 0
 	and	w9, w5, 65280
-.LBE1331:
-.LBE1330:
+.LBE1333:
+.LBE1332:
 	.loc 1 937 0
 	lsr	w7, w5, 16
-.LVL436:
+.LVL434:
 	.loc 1 936 0
 	and	w6, w3, 65535
-.LBB1336:
-.LBB1337:
+.LBB1338:
+.LBB1339:
 	.loc 1 139 0
 	ubfiz	w10, w7, 8, 8
-.LBE1337:
-.LBE1336:
+.LBE1339:
+.LBE1338:
 	.loc 1 937 0
 	lsr	w3, w3, 16
-.LBB1342:
-.LBB1338:
+.LBB1344:
+.LBB1340:
 	.loc 1 140 0
 	and	w7, w7, 65280
 	.loc 1 139 0
 	add	w10, w10, w3, uxtb
-.LBE1338:
-.LBE1342:
-.LBB1343:
-.LBB1332:
+.LBE1340:
+.LBE1344:
+.LBB1345:
+.LBB1334:
 	ubfiz	w5, w5, 8, 8
-.LVL437:
-.LBE1332:
-.LBE1343:
-.LBB1344:
-.LBB1339:
+.LVL435:
+.LBE1334:
+.LBE1345:
+.LBB1346:
+.LBB1341:
 	.loc 1 140 0
 	add	w3, w7, w3, lsr 8
-.LBE1339:
-.LBE1344:
-.LBB1345:
-.LBB1333:
+.LBE1341:
+.LBE1346:
+.LBB1347:
+.LBB1335:
 	.loc 1 139 0
 	add	w5, w5, w6, uxtb
 	.loc 1 140 0
 	add	w7, w9, w6, lsr 8
-.LBE1333:
-.LBE1345:
-.LBB1346:
-.LBB1340:
+.LBE1335:
+.LBE1347:
+.LBB1348:
+.LBB1342:
 	.loc 1 139 0
 	ldrb	w9, [x8, w10, sxtw]
 	.loc 1 140 0
 	ldrb	w3, [x8, w3, sxtw]
-.LBE1340:
-.LBE1346:
-.LBB1347:
-.LBB1334:
+.LBE1342:
+.LBE1348:
+.LBB1349:
+.LBB1336:
 	ldrb	w6, [x8, w7, sxtw]
 	.loc 1 139 0
 	ldrb	w5, [x8, w5, sxtw]
-.LBE1334:
-.LBE1347:
-.LBB1348:
-.LBB1341:
+.LBE1336:
+.LBE1349:
+.LBB1350:
+.LBB1343:
 	orr	w3, w9, w3, lsl 2
-.LBE1341:
-.LBE1348:
+.LBE1343:
+.LBE1350:
 	.loc 1 938 0
 	ubfiz	w3, w3, 4, 8
-.LBB1349:
-.LBB1335:
+.LBB1351:
+.LBB1337:
 	.loc 1 139 0
 	orr	w5, w5, w6, lsl 2
-.LBE1335:
-.LBE1349:
+.LBE1337:
+.LBE1351:
 	.loc 1 938 0
 	orr	w3, w3, w5
 	strb	w3, [x11, x4]
 	add	x4, x4, 1
 	.loc 1 932 0
 	cmp	w12, w4
-	bgt	.L379
+	bgt	.L400
 	add	x1, x1, x14
 	add	x2, x2, x14
-.L378:
+.L399:
 	.loc 1 926 0
 	add	w13, w13, 1
 	cmp	w16, w13
-	beq	.L371
+	beq	.L392
 	ldr	w3, [x15, 84]
 	.loc 1 927 0
-	cbnz	w17, .L430
-.L376:
+	cbnz	w17, .L451
+.L397:
 	.loc 1 930 0
 	mul	w11, w13, w3
-.LVL438:
+.LVL436:
 	lsr	w11, w11, 2
 	add	x11, x0, x11
-.LVL439:
-	b	.L377
-.LBE1329:
-.LBE1328:
+.LVL437:
+	b	.L398
+.LBE1331:
+.LBE1330:
 	.cfi_endproc
-.LFE2820:
+.LFE2821:
 	.size	direct_mode_data_change, .-direct_mode_data_change
 	.align	2
 	.p2align 3,,7
 	.type	direct_mode_data_change_part, %function
 direct_mode_data_change_part:
-.LFB2826:
+.LFB2827:
 	.loc 1 1391 0
 	.cfi_startproc
-.LVL440:
+.LVL438:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
@@ -5153,13 +5222,13 @@ direct_mode_data_change_part:
 	ldr	x4, [x3, 224]
 	ldr	w4, [x4, 64]
 	cmp	w4, 32
-	beq	.L605
+	beq	.L626
 	.loc 1 1395 0
 	cmp	w4, 16
-	beq	.L606
-.L448:
-.LBB1376:
-.LBB1377:
+	beq	.L627
+.L469:
+.LBB1378:
+.LBB1379:
 	.loc 1 1314 0
 	adrp	x5, .LANCHOR0
 	.loc 1 1320 0
@@ -5169,57 +5238,57 @@ direct_mode_data_change_part:
 	ldr	x11, [x5, #:lo12:.LANCHOR0]
 	.loc 1 1321 0
 	ldr	x3, [x3, 128]
-.LVL441:
+.LVL439:
 	.loc 1 1320 0
 	sub	w6, w6, w4
-.LVL442:
+.LVL440:
 	.loc 1 1322 0
 	add	x11, x11, 24
 	.loc 1 1321 0
 	lsl	w6, w6, 16
-.LVL443:
+.LVL441:
 	add	x6, x3, x6, sxtw
-.LVL444:
+.LVL442:
 	.loc 1 1325 0
 	ldr	w14, [x11, 88]
 	.loc 1 1324 0
 	ldr	w3, [x11, 84]
 	.loc 1 1322 0
 	ldr	w15, [x11, 156]
-.LVL445:
+.LVL443:
 	.loc 1 1327 0
 	cmp	w14, 0
 	.loc 1 1324 0
 	lsr	w13, w3, 3
 	.loc 1 1327 0
-	ble	.L431
+	ble	.L452
 	sub	w12, w13, #1
 	mov	w10, 0
-.LVL446:
+.LVL444:
 	add	x12, x12, 1
 	lsl	x16, x12, 2
 	lsl	x12, x12, 3
 	.loc 1 1328 0
-	cbz	w15, .L507
-.LVL447:
+	cbz	w15, .L528
+.LVL445:
 	.p2align 2
-.L607:
+.L628:
 	.loc 1 1329 0
 	ldr	w7, [x11, 88]
-.LVL448:
+.LVL446:
 	sub	w7, w7, #1
 	sub	w7, w7, w10
 	mul	w7, w7, w3
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL449:
-.L508:
+.LVL447:
+.L529:
 	.loc 1 1333 0
-	cbz	w13, .L509
+	cbz	w13, .L530
 	add	x9, x1, x16
 	mov	x8, x2
 	.p2align 2
-.L520:
+.L541:
 	.loc 1 1335 0
 	ldr	w5, [x8]
 	.loc 1 1340 0
@@ -5228,43 +5297,43 @@ direct_mode_data_change_part:
 	ldr	w4, [x1], 4
 	.loc 1 1339 0
 	ubfx	x17, x5, 4, 4
-.LVL450:
+.LVL448:
 	.loc 1 1338 0
 	and	w18, w4, 15
 	.loc 1 1340 0
 	cmp	w18, w17
-	beq	.L510
+	beq	.L531
 	.loc 1 1341 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w3, [x6, w17, sxtw]
 	and	w3, w3, 3
-.L510:
+.L531:
 	.loc 1 1343 0
 	ubfx	x18, x4, 4, 4
 	.loc 1 1344 0
 	ubfx	x17, x5, 12, 4
 	.loc 1 1345 0
 	cmp	w18, w17
-	beq	.L511
+	beq	.L532
 	.loc 1 1346 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w17, [x6, w17, sxtw]
 	ubfiz	w17, w17, 2, 2
 	orr	w3, w3, w17
-.L511:
+.L532:
 	.loc 1 1348 0
 	ubfx	x18, x4, 8, 4
 	.loc 1 1349 0
 	ubfx	x17, x5, 20, 4
 	.loc 1 1350 0
 	cmp	w18, w17
-	beq	.L603
+	beq	.L624
 	.loc 1 1351 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w17, [x6, w17, sxtw]
 	ubfiz	w17, w17, 4, 2
 	orr	w3, w3, w17
-.L603:
+.L624:
 	.loc 1 1353 0
 	ubfx	x17, x4, 12, 4
 	.loc 1 1354 0
@@ -5273,13 +5342,13 @@ direct_mode_data_change_part:
 	and	w3, w3, 255
 	.loc 1 1355 0
 	cmp	w17, w5
-	beq	.L514
+	beq	.L535
 	.loc 1 1356 0
 	add	w5, w17, w5, lsl 8
 	ldrb	w5, [x6, w5, sxtw]
 	orr	w3, w3, w5, lsl 6
 	and	w3, w3, 255
-.L514:
+.L535:
 	add	x8, x8, 8
 	.loc 1 1358 0
 	strb	w3, [x7]
@@ -5293,91 +5362,91 @@ direct_mode_data_change_part:
 	ubfx	x17, x5, 4, 4
 	.loc 1 1365 0
 	cmp	w18, w17
-	beq	.L515
+	beq	.L536
 	.loc 1 1366 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w3, [x6, w17, sxtw]
 	and	w3, w3, 3
-.L515:
+.L536:
 	.loc 1 1368 0
 	ubfx	x18, x4, 20, 4
 	.loc 1 1369 0
 	ubfx	x17, x5, 12, 4
 	.loc 1 1370 0
 	cmp	w18, w17
-	beq	.L516
+	beq	.L537
 	.loc 1 1371 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w17, [x6, w17, sxtw]
 	ubfiz	w17, w17, 2, 2
 	orr	w3, w3, w17
-.L516:
+.L537:
 	.loc 1 1373 0
 	ubfx	x18, x4, 24, 4
 	.loc 1 1374 0
 	ubfx	x17, x5, 20, 4
 	.loc 1 1375 0
 	cmp	w18, w17
-	beq	.L604
+	beq	.L625
 	.loc 1 1376 0
 	add	w17, w18, w17, lsl 8
 	ldrb	w17, [x6, w17, sxtw]
 	ubfiz	w17, w17, 4, 2
 	orr	w3, w3, w17
-.L604:
+.L625:
 	.loc 1 1378 0
 	lsr	w4, w4, 28
-.LVL451:
+.LVL449:
 	.loc 1 1379 0
 	lsr	w5, w5, 28
 	.loc 1 1376 0
 	and	w3, w3, 255
 	.loc 1 1380 0
 	cmp	w4, w5
-	beq	.L519
+	beq	.L540
 	.loc 1 1381 0
 	add	w4, w4, w5, lsl 8
 	ldrb	w4, [x6, w4, sxtw]
 	orr	w3, w3, w4, lsl 6
 	and	w3, w3, 255
-.L519:
+.L540:
 	add	x7, x7, 2
 	.loc 1 1383 0
 	strb	w3, [x7, -1]
 	.loc 1 1333 0
 	cmp	x1, x9
-	bne	.L520
+	bne	.L541
 	add	x2, x2, x12
-.L509:
+.L530:
 	.loc 1 1327 0
 	add	w10, w10, 1
 	cmp	w14, w10
-	beq	.L431
+	beq	.L452
 	ldr	w3, [x11, 84]
 	.loc 1 1328 0
-	cbnz	w15, .L607
-.L507:
+	cbnz	w15, .L628
+.L528:
 	.loc 1 1331 0
 	mul	w7, w10, w3
-.LVL452:
+.LVL450:
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL453:
-	b	.L508
-.LVL454:
+.LVL451:
+	b	.L529
+.LVL452:
 	.p2align 3
-.L431:
-.LBE1377:
-.LBE1376:
+.L452:
+.LBE1379:
+.LBE1378:
 	.loc 1 1407 0
 	ldp	x19, x20, [sp, 16]
-.LVL455:
+.LVL453:
 	ldp	x21, x22, [sp, 32]
-.LVL456:
+.LVL454:
 	ldp	x23, x24, [sp, 48]
-.LVL457:
+.LVL455:
 	ldp	x25, x26, [sp, 64]
-.LVL458:
+.LVL456:
 	ldr	x27, [sp, 80]
 	ldp	x29, x30, [sp], 96
 	.cfi_remember_state
@@ -5393,29 +5462,29 @@ direct_mode_data_change_part:
 	.cfi_restore 19
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
-.LVL459:
+.LVL457:
 	ret
-.LVL460:
-.L606:
+.LVL458:
+.L627:
 	.cfi_restore_state
 	.loc 1 1396 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
 	cmp	w4, 16
-	bne	.L448
+	bne	.L469
 	.loc 1 1397 0
 	ldr	w15, [x3, 88]
-.LBB1378:
-.LBB1379:
+.LBB1380:
+.LBB1381:
 	.loc 1 1151 0
 	adrp	x5, .LANCHOR0
-.LVL461:
-.LBE1379:
-.LBE1378:
+.LVL459:
+.LBE1381:
+.LBE1380:
 	.loc 1 1397 0
-	cbz	w15, .L449
+	cbz	w15, .L470
+.LBB1394:
 .LBB1392:
-.LBB1390:
 	.loc 1 1151 0
 	ldr	x12, [x5, #:lo12:.LANCHOR0]
 	.loc 1 1156 0
@@ -5425,84 +5494,84 @@ direct_mode_data_change_part:
 	add	x12, x12, 24
 	.loc 1 1157 0
 	ldr	x3, [x3, 128]
-.LVL462:
+.LVL460:
 	.loc 1 1156 0
 	sub	w9, w9, w4
-.LVL463:
+.LVL461:
 	.loc 1 1161 0
 	ldr	w13, [x12, 88]
 	.loc 1 1157 0
 	lsl	w9, w9, 16
-.LVL464:
+.LVL462:
 	.loc 1 1158 0
 	ldr	w14, [x12, 156]
 	.loc 1 1157 0
 	add	x9, x3, x9, sxtw
-.LVL465:
+.LVL463:
 	.loc 1 1160 0
 	ldr	w3, [x12, 84]
-.LVL466:
+.LVL464:
 	.loc 1 1166 0
 	cmp	w13, 0
 	.loc 1 1160 0
 	lsr	w11, w3, 4
-.LVL467:
+.LVL465:
 	.loc 1 1166 0
-	ble	.L431
+	ble	.L452
 	sub	w16, w11, #1
 	mov	w15, 0
-.LVL468:
+.LVL466:
 	add	x16, x16, 1
-.LBB1380:
-.LBB1381:
+.LBB1382:
+.LBB1383:
 	.loc 1 145 0
 	mov	w10, 3
 	lsl	x16, x16, 3
-.LBE1381:
-.LBE1380:
+.LBE1383:
+.LBE1382:
 	.loc 1 1167 0
-	cbz	w14, .L450
-.LVL469:
-.L608:
+	cbz	w14, .L471
+.LVL467:
+.L629:
 	.loc 1 1168 0
 	ldr	w5, [x12, 88]
-.LVL470:
+.LVL468:
 	sub	w5, w5, #1
 	sub	w5, w5, w15
 	mul	w5, w5, w3
 	lsr	w5, w5, 2
 	add	x5, x0, x5
-.LVL471:
-.L451:
+.LVL469:
+.L472:
 	.loc 1 1172 0
-	cbz	w11, .L452
+	cbz	w11, .L473
 	add	x5, x5, 4
-.LVL472:
+.LVL470:
 	mov	x8, 0
-.LVL473:
+.LVL471:
 	.p2align 2
-.L475:
+.L496:
 	.loc 1 1173 0
 	ldr	x3, [x1, x8, lsl 3]
 	.loc 1 1174 0
 	ldr	x4, [x2, x8, lsl 3]
 	.loc 1 1175 0
 	cmp	x3, x4
-	beq	.L453
+	beq	.L474
 	.loc 1 1176 0
 	and	w17, w4, 65535
 	and	w7, w3, 65535
-.LVL474:
-.LBB1383:
-.LBB1384:
+.LVL472:
+.LBB1385:
+.LBB1386:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
 	cmp	w17, w7
-	beq	.L454
+	beq	.L475
 	.loc 1 146 0
 	eor	w18, w17, w7
-.LVL475:
+.LVL473:
 	.loc 1 159 0
 	ubfiz	w30, w17, 8, 8
 	.loc 1 160 0
@@ -5540,25 +5609,25 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w6, w7, w6
 	and	w6, w6, 255
-.LVL476:
-.L454:
-.LBE1384:
-.LBE1383:
+.LVL474:
+.L475:
+.LBE1386:
+.LBE1385:
 	.loc 1 1176 0
 	strb	w6, [x5, -4]
 	.loc 1 1177 0
 	lsr	w17, w4, 16
 	lsr	w7, w3, 16
-.LBB1385:
-.LBB1386:
+.LBB1387:
+.LBB1388:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
 	cmp	w17, w7
-	beq	.L459
+	beq	.L480
 	.loc 1 146 0
 	eor	w18, w17, w7
-.LVL477:
+.LVL475:
 	.loc 1 159 0
 	ubfiz	w30, w17, 8, 8
 	.loc 1 160 0
@@ -5596,25 +5665,25 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w6, w7, w6
 	and	w6, w6, 255
-.LVL478:
-.L459:
-.LBE1386:
-.LBE1385:
+.LVL476:
+.L480:
+.LBE1388:
+.LBE1387:
 	.loc 1 1177 0
 	strb	w6, [x5, -3]
 	.loc 1 1178 0
 	ubfx	x17, x4, 32, 16
 	ubfx	x7, x3, 32, 16
-.LBB1387:
-.LBB1388:
+.LBB1389:
+.LBB1390:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
 	cmp	w17, w7
-	beq	.L464
+	beq	.L485
 	.loc 1 146 0
 	eor	w18, w17, w7
-.LVL479:
+.LVL477:
 	.loc 1 159 0
 	ubfiz	w30, w17, 8, 8
 	.loc 1 160 0
@@ -5652,27 +5721,27 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w6, w7, w6
 	and	w6, w6, 255
-.LVL480:
-.L464:
-.LBE1388:
-.LBE1387:
+.LVL478:
+.L485:
+.LBE1390:
+.LBE1389:
 	.loc 1 1178 0
 	strb	w6, [x5, -2]
 	.loc 1 1179 0
 	lsr	x4, x4, 48
-.LVL481:
+.LVL479:
 	lsr	x3, x3, 48
-.LVL482:
-.LBB1389:
-.LBB1382:
+.LVL480:
+.LBB1391:
+.LBB1384:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
 	cmp	w4, w3
-	beq	.L469
+	beq	.L490
 	.loc 1 146 0
 	eor	w7, w4, w3
-.LVL483:
+.LVL481:
 	.loc 1 159 0
 	ubfiz	w6, w4, 8, 8
 	.loc 1 160 0
@@ -5688,7 +5757,7 @@ direct_mode_data_change_part:
 	.loc 1 153 0
 	tst	w7, 240
 	orr	w18, w4, 12
-.LVL484:
+.LVL482:
 	.loc 1 159 0
 	ldrb	w17, [x9, w6, sxtw]
 	.loc 1 153 0
@@ -5711,54 +5780,54 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w4, w6, w4
 	and	w6, w4, 255
-.LVL485:
-.L469:
-.LBE1382:
-.LBE1389:
+.LVL483:
+.L490:
+.LBE1384:
+.LBE1391:
 	.loc 1 1179 0
 	strb	w6, [x5, -1]
-.LVL486:
-.L474:
+.LVL484:
+.L495:
 	add	x8, x8, 1
 	add	x5, x5, 4
 	.loc 1 1172 0
 	cmp	w11, w8
-	bgt	.L475
+	bgt	.L496
 	add	x1, x1, x16
-.LVL487:
+.LVL485:
 	add	x2, x2, x16
-.LVL488:
-.L452:
+.LVL486:
+.L473:
 	.loc 1 1166 0
 	add	w15, w15, 1
 	cmp	w13, w15
-	beq	.L431
+	beq	.L452
 	ldr	w3, [x12, 84]
-.LVL489:
+.LVL487:
 	.loc 1 1167 0
-	cbnz	w14, .L608
-.L450:
+	cbnz	w14, .L629
+.L471:
 	.loc 1 1170 0
 	mul	w5, w15, w3
-.LVL490:
+.LVL488:
 	lsr	w5, w5, 2
 	add	x5, x0, x5
-.LVL491:
-	b	.L451
-.LVL492:
-.L605:
-.LBE1390:
+.LVL489:
+	b	.L472
+.LVL490:
+.L626:
 .LBE1392:
+.LBE1394:
 	.loc 1 1393 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
 	cmp	w4, 32
-	beq	.L609
+	beq	.L630
 	.loc 1 1402 0
 	cmp	w4, 16
-	bne	.L448
-.LBB1393:
-.LBB1394:
+	bne	.L469
+.LBB1395:
+.LBB1396:
 	.loc 1 1236 0
 	adrp	x5, .LANCHOR0
 	.loc 1 1242 0
@@ -5768,63 +5837,63 @@ direct_mode_data_change_part:
 	ldr	x11, [x5, #:lo12:.LANCHOR0]
 	.loc 1 1243 0
 	ldr	x3, [x3, 128]
-.LVL493:
+.LVL491:
 	.loc 1 1242 0
 	sub	w6, w6, w4
-.LVL494:
+.LVL492:
 	.loc 1 1244 0
 	add	x11, x11, 24
 	.loc 1 1243 0
 	lsl	w6, w6, 16
-.LVL495:
+.LVL493:
 	add	x6, x3, x6, sxtw
-.LVL496:
+.LVL494:
 	.loc 1 1247 0
 	ldr	w14, [x11, 88]
 	.loc 1 1246 0
 	ldr	w3, [x11, 84]
 	.loc 1 1244 0
 	ldr	w15, [x11, 156]
-.LVL497:
+.LVL495:
 	.loc 1 1249 0
 	cmp	w14, 0
 	.loc 1 1246 0
 	lsr	w13, w3, 3
 	.loc 1 1249 0
-	ble	.L431
+	ble	.L452
 	sub	w12, w13, #1
 	mov	w10, 0
-.LVL498:
+.LVL496:
 	add	x12, x12, 1
 	lsl	x16, x12, 3
 	lsl	x12, x12, 2
 	.loc 1 1250 0
-	cbz	w15, .L494
-.LVL499:
-.L610:
+	cbz	w15, .L515
+.LVL497:
+.L631:
 	.loc 1 1251 0
 	ldr	w7, [x11, 88]
-.LVL500:
+.LVL498:
 	sub	w7, w7, #1
 	sub	w7, w7, w10
 	mul	w7, w7, w3
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL501:
-.L495:
+.LVL499:
+.L516:
 	.loc 1 1255 0
-	cbz	w13, .L496
+	cbz	w13, .L517
 	add	x9, x1, x16
 	mov	x8, x2
 	.p2align 2
-.L505:
+.L526:
 	.loc 1 1257 0
 	ldr	w3, [x8], 4
 	.loc 1 1258 0
 	mov	w17, 0
 	.loc 1 1256 0
 	ldr	w4, [x1]
-.LVL502:
+.LVL500:
 	.loc 1 1261 0
 	and	w5, w3, 255
 	ubfiz	w18, w5, 4, 4
@@ -5832,11 +5901,11 @@ direct_mode_data_change_part:
 	and	w30, w4, 248
 	.loc 1 1262 0
 	cmp	w30, w18
-	beq	.L497
+	beq	.L518
 	.loc 1 1263 0
 	add	w18, w30, w18, lsl 8
 	ldrb	w17, [x6, w18, sxtw]
-.L497:
+.L518:
 	.loc 1 1265 0
 	lsr	w18, w4, 8
 	.loc 1 1266 0
@@ -5845,13 +5914,13 @@ direct_mode_data_change_part:
 	and	w18, w18, 248
 	.loc 1 1267 0
 	cmp	w18, w5
-	beq	.L498
+	beq	.L519
 	.loc 1 1268 0
 	add	w5, w18, w5, lsl 8
 	ldrb	w5, [x6, w5, sxtw]
 	orr	w17, w17, w5, lsl 2
 	and	w17, w17, 255
-.L498:
+.L519:
 	.loc 1 1270 0
 	lsr	w18, w4, 16
 	.loc 1 1271 0
@@ -5862,13 +5931,13 @@ direct_mode_data_change_part:
 	and	w5, w5, 240
 	.loc 1 1272 0
 	cmp	w18, w5
-	beq	.L499
+	beq	.L520
 	.loc 1 1273 0
 	add	w5, w18, w5, lsl 8
 	ldrb	w5, [x6, w5, sxtw]
 	orr	w17, w17, w5, lsl 4
 	and	w17, w17, 255
-.L499:
+.L520:
 	.loc 1 1275 0
 	lsr	w4, w4, 24
 	.loc 1 1276 0
@@ -5879,13 +5948,13 @@ direct_mode_data_change_part:
 	and	w5, w5, 240
 	.loc 1 1277 0
 	cmp	w4, w5
-	beq	.L500
+	beq	.L521
 	.loc 1 1278 0
 	add	w4, w4, w5, lsl 8
 	ldrb	w4, [x6, w4, sxtw]
 	orr	w17, w17, w4, lsl 6
 	and	w17, w17, 255
-.L500:
+.L521:
 	add	x1, x1, 8
 	.loc 1 1280 0
 	strb	w17, [x7]
@@ -5901,11 +5970,11 @@ direct_mode_data_change_part:
 	and	w18, w4, 248
 	.loc 1 1287 0
 	cmp	w18, w5
-	beq	.L501
+	beq	.L522
 	.loc 1 1288 0
 	add	w5, w18, w5, lsl 8
 	ldrb	w17, [x6, w5, sxtw]
-.L501:
+.L522:
 	.loc 1 1290 0
 	lsr	w18, w4, 8
 	.loc 1 1291 0
@@ -5916,13 +5985,13 @@ direct_mode_data_change_part:
 	and	w5, w5, 240
 	.loc 1 1292 0
 	cmp	w18, w5
-	beq	.L502
+	beq	.L523
 	.loc 1 1293 0
 	add	w5, w18, w5, lsl 8
 	ldrb	w5, [x6, w5, sxtw]
 	orr	w17, w17, w5, lsl 2
 	and	w17, w17, 255
-.L502:
+.L523:
 	.loc 1 1295 0
 	lsr	w18, w4, 16
 	.loc 1 1296 0
@@ -5933,13 +6002,13 @@ direct_mode_data_change_part:
 	and	w5, w5, 240
 	.loc 1 1297 0
 	cmp	w18, w5
-	beq	.L503
+	beq	.L524
 	.loc 1 1298 0
 	add	w5, w18, w5, lsl 8
 	ldrb	w5, [x6, w5, sxtw]
 	orr	w17, w17, w5, lsl 4
 	and	w17, w17, 255
-.L503:
+.L524:
 	.loc 1 1300 0
 	lsr	w4, w4, 24
 	.loc 1 1301 0
@@ -5950,42 +6019,42 @@ direct_mode_data_change_part:
 	and	w3, w3, 240
 	.loc 1 1302 0
 	cmp	w4, w3
-	beq	.L504
+	beq	.L525
 	.loc 1 1303 0
 	add	w3, w4, w3, lsl 8
 	ldrb	w3, [x6, w3, sxtw]
 	orr	w17, w17, w3, lsl 6
 	and	w17, w17, 255
-.L504:
+.L525:
 	add	x7, x7, 2
 	.loc 1 1305 0
 	strb	w17, [x7, -1]
 	.loc 1 1255 0
 	cmp	x1, x9
-	bne	.L505
+	bne	.L526
 	add	x2, x2, x12
-.L496:
+.L517:
 	.loc 1 1249 0
 	add	w10, w10, 1
 	cmp	w14, w10
-	beq	.L431
+	beq	.L452
 	ldr	w3, [x11, 84]
 	.loc 1 1250 0
-	cbnz	w15, .L610
-.L494:
+	cbnz	w15, .L631
+.L515:
 	.loc 1 1253 0
 	mul	w7, w10, w3
-.LVL503:
+.LVL501:
 	lsr	w7, w7, 2
 	add	x7, x0, x7
-.LVL504:
-	b	.L495
-.LVL505:
-.L449:
-.LBE1394:
-.LBE1393:
-.LBB1395:
-.LBB1396:
+.LVL502:
+	b	.L516
+.LVL503:
+.L470:
+.LBE1396:
+.LBE1395:
+.LBB1397:
+.LBB1398:
 	.loc 1 1110 0
 	ldr	x17, [x5, #:lo12:.LANCHOR0]
 	.loc 1 1115 0
@@ -5995,134 +6064,134 @@ direct_mode_data_change_part:
 	add	x17, x17, 24
 	.loc 1 1116 0
 	ldr	x3, [x3, 128]
-.LVL506:
+.LVL504:
 	.loc 1 1115 0
 	sub	w12, w12, w4
-.LVL507:
+.LVL505:
 	.loc 1 1120 0
 	ldr	w18, [x17, 88]
 	.loc 1 1116 0
 	lsl	w12, w12, 16
-.LVL508:
+.LVL506:
 	.loc 1 1117 0
 	ldr	w30, [x17, 156]
 	.loc 1 1116 0
 	add	x12, x3, x12, sxtw
-.LVL509:
+.LVL507:
 	.loc 1 1119 0
 	ldr	w3, [x17, 84]
-.LVL510:
+.LVL508:
 	.loc 1 1125 0
 	cmp	w18, 0
 	.loc 1 1119 0
 	lsr	w13, w3, 3
-.LVL511:
+.LVL509:
 	.loc 1 1125 0
-	ble	.L431
+	ble	.L452
 	sub	w16, w13, #1
-.LBB1397:
-.LBB1398:
+.LBB1399:
+.LBB1400:
 	.loc 1 145 0
 	mov	w14, 3
 	add	x16, x16, 1
 	lsl	x16, x16, 2
-.LBE1398:
-.LBE1397:
+.LBE1400:
+.LBE1399:
 	.loc 1 1126 0
-	cbz	w30, .L477
-.LVL512:
-.L611:
+	cbz	w30, .L498
+.LVL510:
+.L632:
 	.loc 1 1127 0
 	ldr	w11, [x17, 88]
-.LVL513:
+.LVL511:
 	sub	w11, w11, #1
 	sub	w11, w11, w15
 	mul	w11, w11, w3
 	lsr	w11, w11, 2
 	add	x11, x0, x11
-.LVL514:
-.L478:
+.LVL512:
+.L499:
 	.loc 1 1131 0
-	cbz	w13, .L479
+	cbz	w13, .L500
 	add	x11, x11, 2
-.LVL515:
+.LVL513:
 	mov	x9, 0
 	.p2align 2
-.L492:
+.L513:
 	.loc 1 1133 0
 	ldr	w5, [x2, x9, lsl 2]
-.LBB1404:
-.LBB1405:
+.LBB1406:
+.LBB1407:
 	.loc 1 149 0
 	mov	w4, 0
-.LBE1405:
-.LBE1404:
+.LBE1407:
+.LBE1406:
 	.loc 1 1132 0
 	ldr	w22, [x1, x9, lsl 2]
-.LBB1410:
-.LBB1399:
+.LBB1412:
+.LBB1401:
 	.loc 1 149 0
 	mov	w8, 0
-.LBE1399:
-.LBE1410:
+.LBE1401:
+.LBE1412:
 	.loc 1 1135 0
 	and	w25, w5, 65535
 	and	w7, w22, 65535
-.LBB1411:
-.LBB1406:
+.LBB1413:
+.LBB1408:
 	.loc 1 160 0
 	and	w3, w25, 65280
 	add	w6, w3, w7, lsr 8
-.LBE1406:
-.LBE1411:
+.LBE1408:
+.LBE1413:
 	.loc 1 1136 0
 	lsr	w3, w5, 16
-.LBB1412:
-.LBB1400:
+.LBB1414:
+.LBB1402:
 	.loc 1 159 0
 	ubfiz	w21, w3, 8, 8
-.LBE1400:
-.LBE1412:
+.LBE1402:
+.LBE1414:
 	.loc 1 1136 0
 	and	w3, w3, 65535
 	lsr	w10, w22, 16
-.LBB1413:
-.LBB1407:
+.LBB1415:
+.LBB1409:
 	.loc 1 159 0
 	ubfiz	w23, w5, 8, 8
-.LBE1407:
-.LBE1413:
-.LBB1414:
-.LBB1401:
+.LBE1409:
+.LBE1415:
+.LBB1416:
+.LBB1403:
 	.loc 1 160 0
 	and	w19, w3, 65280
-.LBE1401:
-.LBE1414:
-.LBB1415:
-.LBB1408:
+.LBE1403:
+.LBE1416:
+.LBB1417:
+.LBB1410:
 	.loc 1 146 0
 	eor	w24, w25, w7
 	.loc 1 159 0
 	add	w23, w23, w7, uxtb
-.LBE1408:
-.LBE1415:
-.LBB1416:
-.LBB1402:
+.LBE1410:
+.LBE1417:
+.LBB1418:
+.LBB1404:
 	add	w21, w21, w10, uxtb
 	.loc 1 146 0
 	eor	w20, w3, w10
 	.loc 1 160 0
 	add	w19, w19, w10, lsr 8
-.LBE1402:
-.LBE1416:
+.LBE1404:
+.LBE1418:
 	.loc 1 1134 0
 	cmp	w22, w5
-	beq	.L480
-.LBB1417:
-.LBB1409:
+	beq	.L501
+.LBB1419:
+.LBB1411:
 	.loc 1 148 0
 	cmp	w25, w7
-	beq	.L481
+	beq	.L502
 	.loc 1 145 0
 	tst	x24, 15
 	.loc 1 160 0
@@ -6151,16 +6220,16 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w4, w5, w4
 	and	w4, w4, 255
-.L481:
-.LBE1409:
-.LBE1417:
+.L502:
+.LBE1411:
+.LBE1419:
 	.loc 1 1135 0
 	strb	w4, [x11, -2]
-.LBB1418:
-.LBB1403:
+.LBB1420:
+.LBB1405:
 	.loc 1 148 0
 	cmp	w3, w10
-	beq	.L486
+	beq	.L507
 	.loc 1 145 0
 	tst	x20, 15
 	.loc 1 159 0
@@ -6189,62 +6258,62 @@ direct_mode_data_change_part:
 	.loc 1 159 0
 	and	w3, w4, w3
 	and	w8, w3, 255
-.L486:
-.LBE1403:
-.LBE1418:
+.L507:
+.LBE1405:
+.LBE1420:
 	.loc 1 1136 0
 	strb	w8, [x11, -1]
-.L491:
+.L512:
 	add	x9, x9, 1
 	add	x11, x11, 2
 	.loc 1 1131 0
 	cmp	w13, w9
-	bgt	.L492
+	bgt	.L513
 	add	x1, x1, x16
 	add	x2, x2, x16
-.LVL516:
-.L479:
+.LVL514:
+.L500:
 	.loc 1 1125 0
 	add	w15, w15, 1
 	cmp	w18, w15
-	beq	.L431
+	beq	.L452
 	ldr	w3, [x17, 84]
 	.loc 1 1126 0
-	cbnz	w30, .L611
-.L477:
+	cbnz	w30, .L632
+.L498:
 	.loc 1 1129 0
 	mul	w11, w15, w3
-.LVL517:
+.LVL515:
 	lsr	w11, w11, 2
 	add	x11, x0, x11
-.LVL518:
-	b	.L478
-.LVL519:
+.LVL516:
+	b	.L499
+.LVL517:
 	.p2align 3
-.L453:
-.LBE1396:
-.LBE1395:
-.LBB1420:
-.LBB1391:
+.L474:
+.LBE1398:
+.LBE1397:
+.LBB1422:
+.LBB1393:
 	.loc 1 1182 0
 	str	wzr, [x5, -4]
-	b	.L474
-.LVL520:
+	b	.L495
+.LVL518:
 	.p2align 3
-.L480:
-.LBE1391:
-.LBE1420:
+.L501:
+.LBE1393:
+.LBE1422:
+.LBB1423:
 .LBB1421:
-.LBB1419:
 	.loc 1 1139 0
 	strh	wzr, [x11, -2]
-	b	.L491
-.LVL521:
-.L609:
-.LBE1419:
+	b	.L512
+.LVL519:
+.L630:
 .LBE1421:
-.LBB1422:
-.LBB1423:
+.LBE1423:
+.LBB1424:
+.LBB1425:
 	.loc 1 1194 0
 	adrp	x5, .LANCHOR0
 	.loc 1 1199 0
@@ -6254,68 +6323,68 @@ direct_mode_data_change_part:
 	ldr	x21, [x5, #:lo12:.LANCHOR0]
 	.loc 1 1200 0
 	ldr	x3, [x3, 128]
-.LVL522:
+.LVL520:
 	.loc 1 1199 0
 	sub	w15, w15, w4
-.LVL523:
+.LVL521:
 	.loc 1 1201 0
 	add	x21, x21, 24
 	.loc 1 1200 0
 	lsl	w15, w15, 16
-.LVL524:
+.LVL522:
 	add	x15, x3, x15, sxtw
-.LVL525:
+.LVL523:
 	.loc 1 1206 0
 	ldr	w22, [x21, 88]
 	.loc 1 1205 0
 	ldr	w3, [x21, 84]
 	.loc 1 1201 0
 	ldr	w23, [x21, 156]
-.LVL526:
+.LVL524:
 	.loc 1 1211 0
 	cmp	w22, 0
 	.loc 1 1205 0
 	lsr	w17, w3, 2
-.LVL527:
+.LVL525:
 	.loc 1 1211 0
-	ble	.L431
+	ble	.L452
 	sub	w20, w17, #1
 	mov	w19, 0
-.LVL528:
+.LVL526:
 	add	x20, x20, 1
-.LBB1424:
-.LBB1425:
+.LBB1426:
+.LBB1427:
 	.loc 1 167 0
 	mov	w18, 3
 	lsl	x20, x20, 2
-.LBE1425:
-.LBE1424:
+.LBE1427:
+.LBE1426:
 	.loc 1 1212 0
-	cbz	w23, .L436
-.LVL529:
-.L614:
+	cbz	w23, .L457
+.LVL527:
+.L635:
 	.loc 1 1213 0
 	ldr	w16, [x21, 88]
-.LVL530:
+.LVL528:
 	sub	w16, w16, #1
 	sub	w16, w16, w19
 	mul	w16, w16, w3
 	lsr	w16, w16, 2
 	add	x16, x0, x16
-.LVL531:
-.L437:
+.LVL529:
+.L458:
 	.loc 1 1217 0
-	cbz	w17, .L438
+	cbz	w17, .L459
 	mov	x11, 0
-	b	.L447
-.LVL532:
+	b	.L468
+.LVL530:
 	.p2align 3
-.L613:
-.LBB1431:
-.LBB1432:
+.L634:
+.LBB1433:
+.LBB1434:
 	.loc 1 170 0
 	cmp	w7, w5
-	beq	.L440
+	beq	.L461
 	.loc 1 177 0
 	ldrb	w4, [x15, w8, sxtw]
 	.loc 1 167 0
@@ -6326,20 +6395,20 @@ direct_mode_data_change_part:
 	orr	w12, w4, w12, lsl 2
 	.loc 1 167 0
 	csel	w4, w18, wzr, ne
-.LVL533:
+.LVL531:
 	.loc 1 175 0
 	orr	w5, w4, 12
 	tst	w30, 65280
 	csel	w4, w5, w4, ne
 	and	w12, w12, w4
-.L440:
-.LBE1432:
-.LBE1431:
-.LBB1436:
-.LBB1426:
+.L461:
+.LBE1434:
+.LBE1433:
+.LBB1438:
+.LBB1428:
 	.loc 1 170 0
 	cmp	w3, w13
-	beq	.L443
+	beq	.L464
 	.loc 1 167 0
 	cmp	w26, 0
 	.loc 1 178 0
@@ -6348,7 +6417,7 @@ direct_mode_data_change_part:
 	ldrb	w5, [x15, w14, sxtw]
 	.loc 1 167 0
 	csel	w4, w18, wzr, ne
-.LVL534:
+.LVL532:
 	.loc 1 175 0
 	orr	w6, w4, 12
 	tst	w25, 65280
@@ -6358,35 +6427,35 @@ direct_mode_data_change_part:
 	and	w3, w3, w4
 	lsl	w3, w3, 4
 	sxtb	w10, w3
-.LVL535:
-.L443:
-.LBE1426:
-.LBE1436:
+.LVL533:
+.L464:
+.LBE1428:
+.LBE1438:
 	.loc 1 1223 0
 	orr	w3, w12, w10
 	strb	w3, [x16, x11]
 	add	x11, x11, 1
 	.loc 1 1217 0
 	cmp	w17, w11
-	ble	.L612
-.L447:
+	ble	.L633
+.L468:
 	.loc 1 1219 0
 	ldr	w4, [x2, x11, lsl 2]
-.LVL536:
-.LBB1437:
-.LBB1433:
+.LVL534:
+.LBB1439:
+.LBB1435:
 	.loc 1 170 0
 	mov	w12, 0
-.LBE1433:
-.LBE1437:
+.LBE1435:
+.LBE1439:
 	.loc 1 1218 0
 	ldr	w6, [x1, x11, lsl 2]
-.LBB1438:
-.LBB1427:
+.LBB1440:
+.LBB1429:
 	.loc 1 170 0
 	mov	w10, 0
-.LBE1427:
-.LBE1438:
+.LBE1429:
+.LBE1440:
 	.loc 1 1221 0
 	and	w7, w4, 65535
 	.loc 1 1222 0
@@ -6395,94 +6464,94 @@ direct_mode_data_change_part:
 	and	w5, w6, 65535
 	.loc 1 1222 0
 	lsr	w13, w6, 16
-.LBB1439:
-.LBB1428:
+.LBB1441:
+.LBB1430:
 	.loc 1 177 0
 	ubfiz	w14, w3, 8, 8
-.LBE1428:
-.LBE1439:
+.LBE1430:
+.LBE1441:
 	.loc 1 1222 0
 	and	w3, w3, 65535
-.LBB1440:
-.LBB1434:
+.LBB1442:
+.LBB1436:
 	.loc 1 177 0
 	ubfiz	w8, w4, 8, 8
 	.loc 1 178 0
 	and	w9, w7, 65280
 	.loc 1 168 0
 	eor	w30, w7, w5
-.LBE1434:
-.LBE1440:
-.LBB1441:
-.LBB1429:
+.LBE1436:
+.LBE1442:
+.LBB1443:
+.LBB1431:
 	.loc 1 178 0
 	and	w24, w3, 65280
 	.loc 1 168 0
 	eor	w25, w3, w13
-.LBE1429:
-.LBE1441:
-.LBB1442:
-.LBB1435:
+.LBE1431:
+.LBE1443:
+.LBB1444:
+.LBB1437:
 	.loc 1 177 0
 	add	w8, w8, w5, uxtb
 	.loc 1 178 0
 	add	w9, w9, w5, lsr 8
 	.loc 1 172 0
 	and	w27, w30, 255
-.LBE1435:
-.LBE1442:
-.LBB1443:
-.LBB1430:
+.LBE1437:
+.LBE1444:
+.LBB1445:
+.LBB1432:
 	.loc 1 177 0
 	add	w14, w14, w13, uxtb
 	.loc 1 178 0
 	add	w24, w24, w13, lsr 8
 	.loc 1 172 0
 	and	w26, w25, 255
-.LBE1430:
-.LBE1443:
+.LBE1432:
+.LBE1445:
 	.loc 1 1220 0
 	cmp	w6, w4
-	bne	.L613
+	bne	.L634
 	.loc 1 1226 0
 	strb	wzr, [x16, x11]
 	add	x11, x11, 1
 	.loc 1 1217 0
 	cmp	w17, w11
-	bgt	.L447
-.LVL537:
-.L612:
+	bgt	.L468
+.LVL535:
+.L633:
 	add	x1, x1, x20
 	add	x2, x2, x20
-.L438:
+.L459:
 	.loc 1 1211 0
 	add	w19, w19, 1
 	cmp	w22, w19
-	beq	.L431
+	beq	.L452
 	ldr	w3, [x21, 84]
 	.loc 1 1212 0
-	cbnz	w23, .L614
-.L436:
+	cbnz	w23, .L635
+.L457:
 	.loc 1 1215 0
 	mul	w16, w19, w3
-.LVL538:
+.LVL536:
 	lsr	w16, w16, 2
 	add	x16, x0, x16
-.LVL539:
-	b	.L437
-.LBE1423:
-.LBE1422:
+.LVL537:
+	b	.L458
+.LBE1425:
+.LBE1424:
 	.cfi_endproc
-.LFE2826:
+.LFE2827:
 	.size	direct_mode_data_change_part, .-direct_mode_data_change_part
 	.align	2
 	.p2align 3,,7
 	.type	flip.isra.11, %function
 flip.isra.11:
-.LFB2877:
+.LFB2878:
 	.loc 1 1409 0
 	.cfi_startproc
-.LVL540:
+.LVL538:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -6501,52 +6570,52 @@ flip.isra.11:
 	ldr	w19, [x0, 72]
 	.loc 1 1413 0
 	ldr	x0, [x0]
-.LVL541:
-.LBB1444:
-.LBB1445:
+.LVL539:
 .LBB1446:
 .LBB1447:
+.LBB1448:
+.LBB1449:
 	.file 10 "./include/linux/dma-mapping.h"
 	.loc 10 266 0
-	cbz	x0, .L618
+	cbz	x0, .L639
 	ldr	x3, [x0, 648]
 	.loc 10 268 0
 	adrp	x4, dummy_dma_ops
 	add	x4, x4, :lo12:dummy_dma_ops
 	cmp	x3, 0
 	csel	x3, x4, x3, eq
-.L616:
-.LBE1447:
-.LBE1446:
+.L637:
+.LBE1449:
+.LBE1448:
 	.loc 10 434 0
 	ldr	x5, [x3, 88]
 	sxtw	x19, w19
-	cbz	x5, .L617
-.LBE1445:
-.LBE1444:
+	cbz	x5, .L638
+.LBE1447:
+.LBE1446:
 	.loc 1 1413 0
 	add	x4, x19, x19, lsl 1
-.LBB1453:
-.LBB1450:
+.LBB1455:
+.LBB1452:
 	.loc 10 435 0
 	mov	w3, 1
-.LBE1450:
-.LBE1453:
+.LBE1452:
+.LBE1455:
 	.loc 1 1413 0
 	add	x4, x20, x4, lsl 3
-.LBB1454:
-.LBB1451:
+.LBB1456:
+.LBB1453:
 	.loc 10 435 0
 	ldr	x1, [x4, 32]
 	blr	x5
-.LVL542:
-.L617:
-.LBE1451:
-.LBE1454:
+.LVL540:
+.L638:
+.LBE1453:
+.LBE1456:
 	.loc 1 1414 0
 	ldr	x5, [x20, 8]
-.LBB1455:
-.LBB1456:
+.LBB1457:
+.LBB1458:
 	.file 11 "drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.h"
 	.loc 11 57 0
 	mov	w4, 0
@@ -6554,50 +6623,50 @@ flip.isra.11:
 	mov	w2, 0
 	mov	x0, x5
 	mov	w1, 0
-.LBE1456:
-.LBE1455:
+.LBE1458:
+.LBE1457:
 	.loc 1 1415 0
 	add	x19, x19, x19, lsl 1
+.LBB1461:
 .LBB1459:
-.LBB1457:
 	.loc 11 57 0
 	ldr	x5, [x5, 64]
-.LBE1457:
 .LBE1459:
+.LBE1461:
 	.loc 1 1415 0
 	add	x19, x20, x19, lsl 3
+.LBB1462:
 .LBB1460:
-.LBB1458:
 	.loc 11 57 0
 	blr	x5
-.LVL543:
-.LBE1458:
+.LVL541:
 .LBE1460:
+.LBE1462:
 	.loc 1 1415 0
 	ldr	x1, [x20, 8]
-.LBB1461:
-.LBB1462:
+.LBB1463:
+.LBB1464:
 	.loc 11 62 0
 	mov	w2, 0
 	mov	x0, x1
 	ldr	x3, [x1, 72]
 	ldr	w1, [x19, 32]
 	blr	x3
-.LVL544:
-.LBE1462:
-.LBE1461:
+.LVL542:
+.LBE1464:
+.LBE1463:
 	.loc 1 1416 0
 	ldr	x2, [x20, 8]
-.LBB1463:
-.LBB1464:
+.LBB1465:
+.LBB1466:
 	.loc 11 77 0
 	mov	w1, 1
 	mov	x0, x2
 	ldr	x2, [x2, 96]
 	blr	x2
-.LVL545:
-.LBE1464:
-.LBE1463:
+.LVL543:
+.LBE1466:
+.LBE1465:
 	.loc 1 1417 0
 	ldr	w1, [x20, 72]
 	mov	w0, 1
@@ -6605,7 +6674,7 @@ flip.isra.11:
 	str	w0, [x20, 72]
 	.loc 1 1418 0
 	ldp	x19, x20, [sp, 16]
-.LVL546:
+.LVL544:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -6614,33 +6683,33 @@ flip.isra.11:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL547:
+.LVL545:
 	.p2align 3
-.L618:
+.L639:
 	.cfi_restore_state
-.LBB1465:
-.LBB1452:
-.LBB1449:
-.LBB1448:
+.LBB1467:
+.LBB1454:
+.LBB1451:
+.LBB1450:
 	.loc 10 268 0
 	adrp	x3, dummy_dma_ops
 	add	x3, x3, :lo12:dummy_dma_ops
-	b	.L616
-.LBE1448:
-.LBE1449:
-.LBE1452:
-.LBE1465:
+	b	.L637
+.LBE1450:
+.LBE1451:
+.LBE1454:
+.LBE1467:
 	.cfi_endproc
-.LFE2877:
+.LFE2878:
 	.size	flip.isra.11, .-flip.isra.11
 	.align	2
 	.p2align 3,,7
 	.type	ebc_frame_start, %function
 ebc_frame_start:
-.LFB2829:
+.LFB2830:
 	.loc 1 1427 0
 	.cfi_startproc
-.LVL548:
+.LVL546:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
@@ -6662,46 +6731,46 @@ ebc_frame_start:
 	.loc 1 1434 0
 	ldr	x1, [x19, 224]
 	ldr	w0, [x1, 40]
-.LVL549:
+.LVL547:
 	cmp	w0, 16
-	bgt	.L625
+	bgt	.L646
 	cmp	w0, 7
-	bge	.L626
-	cbz	w0, .L627
+	bge	.L647
+	cbz	w0, .L648
 	cmp	w0, 1
-	bne	.L624
+	bne	.L645
 	.loc 1 1436 0
 	ldr	x0, [x19, 184]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
 	ldr	x3, [x19, 168]
 	bl	get_overlay_image
-.LVL550:
+.LVL548:
 	.loc 1 1441 0
 	ldr	w0, [x19, 52]
-	cbz	w0, .L629
-	.loc 1 1442 0
-	ldp	x1, x2, [x19, 144]
-	mov	x4, x19
-	ldr	x3, [x19, 168]
-	ldr	x0, [x19, 192]
-	bl	get_overlay_image
-.LVL551:
-.LBB1466:
-.LBB1467:
+	cbz	w0, .L650
+.LBB1468:
+.LBB1469:
 	.loc 1 1422 0
 	str	wzr, [x21, 72]
 	.loc 1 1423 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
-.LVL552:
-.LBE1467:
-.LBE1466:
-	.loc 1 1541 0
+.LVL549:
+.LBE1469:
+.LBE1468:
+	.loc 1 1443 0
+	ldp	x1, x2, [x19, 144]
+	mov	x4, x19
+	ldr	x3, [x19, 168]
+	ldr	x0, [x19, 192]
+	bl	get_overlay_image
+.LVL550:
+	.loc 1 1511 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL553:
+.LVL551:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -6711,47 +6780,47 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL554:
+.LVL552:
 	.p2align 3
-.L625:
+.L646:
 	.cfi_restore_state
 	.loc 1 1434 0
 	sub	w0, w0, #22
 	cmp	w0, 1
-	bhi	.L624
-.L627:
+	bhi	.L645
+.L648:
 	.loc 1 1456 0
 	ldr	x0, [x19, 184]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
 	ldr	x3, [x19, 168]
 	bl	get_auto_image
-.LVL555:
+.LVL553:
 	.loc 1 1461 0
 	ldr	w0, [x19, 52]
-	cbz	w0, .L631
-	.loc 1 1462 0
-	ldp	x1, x2, [x19, 144]
-	mov	x4, x19
-	ldr	x3, [x19, 168]
-	ldr	x0, [x19, 192]
-	bl	get_auto_image
-.LVL556:
-.LBB1468:
-.LBB1469:
+	cbz	w0, .L652
+.LBB1470:
+.LBB1471:
 	.loc 1 1422 0
 	str	wzr, [x21, 72]
 	.loc 1 1423 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
-.LVL557:
-.LBE1469:
-.LBE1468:
-	.loc 1 1541 0
+.LVL554:
+.LBE1471:
+.LBE1470:
+	.loc 1 1463 0
+	ldp	x1, x2, [x19, 144]
+	mov	x4, x19
+	ldr	x3, [x19, 168]
+	ldr	x0, [x19, 192]
+	bl	get_auto_image
+.LVL555:
+	.loc 1 1511 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL558:
+.LVL556:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -6761,53 +6830,53 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL559:
+.LVL557:
 	.p2align 3
-.L624:
+.L645:
 	.cfi_restore_state
-	.loc 1 1529 0
+	.loc 1 1499 0
 	ldr	x2, [x19, 216]
-	.loc 1 1527 0
+	.loc 1 1497 0
 	mov	x3, x19
-	.loc 1 1526 0
+	.loc 1 1496 0
 	ldrb	w0, [x19, 48]
 	str	w0, [x19, 56]
-	.loc 1 1527 0
+	.loc 1 1497 0
 	ldr	x0, [x19, 184]
-	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
+	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change
-.LVL560:
-	.loc 1 1531 0
+.LVL558:
+.LBB1472:
+.LBB1473:
+	.loc 1 1422 0
+	str	wzr, [x21, 72]
+	.loc 1 1423 0
+	mov	x0, x21
+	ldr	w1, [x20, 208]
+	bl	flip.isra.11
+.LVL559:
+.LBE1473:
+.LBE1472:
+	.loc 1 1502 0
 	ldr	w0, [x19, 56]
-	.loc 1 1532 0
+	.loc 1 1503 0
 	mov	x3, x19
-	.loc 1 1533 0
+	.loc 1 1504 0
 	ldp	x2, x1, [x19, 216]
-	.loc 1 1531 0
+	.loc 1 1502 0
 	sub	w0, w0, #1
 	str	w0, [x19, 56]
-	.loc 1 1532 0
+	.loc 1 1503 0
 	ldr	x0, [x19, 192]
-	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
+	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
-.LVL561:
-.LBB1470:
-.LBB1471:
-	.loc 1 1422 0
-	str	wzr, [x21, 72]
-	.loc 1 1423 0
-	mov	x0, x21
-	ldr	w1, [x20, 208]
-	bl	flip.isra.11
-.LVL562:
-.LBE1471:
-.LBE1470:
-	.loc 1 1541 0
+.LVL560:
+	.loc 1 1511 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL563:
+.LVL561:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 30
@@ -6817,9 +6886,9 @@ ebc_frame_start:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL564:
+.LVL562:
 	.p2align 3
-.L626:
+.L647:
 	.cfi_restore_state
 	.loc 1 1486 0
 	ldr	x2, [x19, 216]
@@ -6830,40 +6899,40 @@ ebc_frame_start:
 	str	w0, [x19, 56]
 	.loc 1 1484 0
 	ldr	x0, [x19, 184]
-	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
+	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change_part
-.LVL565:
-	.loc 1 1488 0
-	ldr	w0, [x19, 56]
+.LVL563:
+.LBB1474:
+.LBB1475:
+	.loc 1 1422 0
+	str	wzr, [x21, 72]
+	.loc 1 1423 0
+	mov	x0, x21
+	ldr	w1, [x20, 208]
+	bl	flip.isra.11
+.LVL564:
+.LBE1475:
+.LBE1474:
 	.loc 1 1489 0
-	mov	x3, x19
+	ldr	w0, [x19, 56]
 	.loc 1 1490 0
+	mov	x3, x19
+	.loc 1 1491 0
 	ldp	x2, x1, [x19, 216]
-	.loc 1 1488 0
+	.loc 1 1489 0
 	sub	w0, w0, #1
 	str	w0, [x19, 56]
-	.loc 1 1489 0
+	.loc 1 1490 0
 	ldr	x0, [x19, 192]
-	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
+	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part
-.LVL566:
-.LBB1472:
-.LBB1473:
-	.loc 1 1422 0
-	str	wzr, [x21, 72]
-	.loc 1 1423 0
-	mov	x0, x21
-	ldr	w1, [x20, 208]
-	bl	flip.isra.11
-.LVL567:
-.LBE1473:
-.LBE1472:
-	.loc 1 1541 0
+.LVL565:
+	.loc 1 1511 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL568:
+.LVL566:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -6873,9 +6942,9 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL569:
+.LVL567:
 	.p2align 3
-.L631:
+.L652:
 	.cfi_restore_state
 	.loc 1 1469 0
 	ldr	x0, [x19, 104]
@@ -6884,12 +6953,12 @@ ebc_frame_start:
 	add	x2, x2, :lo12:.LANCHOR3
 	add	x1, x1, :lo12:.LC21
 	bl	_dev_info
-.LVL570:
+.LVL568:
 	.loc 1 1470 0
 	str	wzr, [x19, 44]
-	.loc 1 1541 0
+	.loc 1 1511 0
 	ldp	x19, x20, [sp, 16]
-.LVL571:
+.LVL569:
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -6900,9 +6969,9 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL572:
+.LVL570:
 	.p2align 3
-.L629:
+.L650:
 	.cfi_restore_state
 	.loc 1 1449 0
 	ldr	x0, [x19, 104]
@@ -6911,12 +6980,12 @@ ebc_frame_start:
 	add	x2, x2, :lo12:.LANCHOR3
 	add	x1, x1, :lo12:.LC20
 	bl	_dev_info
-.LVL573:
+.LVL571:
 	.loc 1 1450 0
 	str	wzr, [x19, 44]
-	.loc 1 1541 0
+	.loc 1 1511 0
 	ldp	x19, x20, [sp, 16]
-.LVL574:
+.LVL572:
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	.cfi_restore 20
@@ -6927,321 +6996,66 @@ ebc_frame_start:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2829:
+.LFE2830:
 	.size	ebc_frame_start, .-ebc_frame_start
 	.align	2
 	.p2align 3,,7
-	.type	ebc_auto_tast_function, %function
-ebc_auto_tast_function:
-.LFB2830:
-	.loc 1 1544 0
+	.type	ebc_power_set.part.13, %function
+ebc_power_set.part.13:
+.LFB2880:
+	.loc 1 183 0
 	.cfi_startproc
-.LVL575:
-	stp	x29, x30, [sp, -96]!
-	.cfi_def_cfa_offset 96
-	.cfi_offset 29, -96
-	.cfi_offset 30, -88
-	.loc 1 1545 0
-	adrp	x1, .LANCHOR0
-	.loc 1 1544 0
-	adrp	x0, __stack_chk_guard
-.LVL576:
-	add	x0, x0, :lo12:__stack_chk_guard
+.LVL573:
+	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, -80
-	.cfi_offset 20, -72
-	adrp	x20, .LANCHOR1
-	stp	x21, x22, [sp, 32]
-	.loc 1 1550 0
-	add	x20, x20, :lo12:.LANCHOR1
-	.cfi_offset 21, -64
-	.cfi_offset 22, -56
-	.loc 1 1545 0
-	ldr	x22, [x1, #:lo12:.LANCHOR0]
-.LVL577:
-	.loc 1 1550 0
-	add	x20, x20, 376
-	.loc 1 1544 0
-	stp	x23, x24, [sp, 48]
-	.cfi_offset 23, -48
-	.cfi_offset 24, -40
-.LBB1474:
-.LBB1475:
+	.cfi_offset 19, -16
+	.cfi_offset 20, -8
+	.loc 1 183 0
+	mov	x19, x0
+	.loc 1 200 0
+	str	w1, [x0, 384]
+	.loc 1 201 0
+	ldr	x1, [x0, 8]
+.LVL574:
 .LBB1476:
-	.file 12 "./include/linux/compiler.h"
-	.loc 12 288 0
-	mov	x24, 2
+.LBB1477:
+	.loc 11 51 0
+	mov	x0, x1
+.LVL575:
+	ldr	x1, [x1, 56]
+	blr	x1
+.LVL576:
+.LBE1477:
 .LBE1476:
-.LBE1475:
-.LBE1474:
-	.loc 1 1544 0
-	str	x25, [sp, 64]
-	.cfi_offset 25, -32
-	.loc 1 1546 0
-	add	x21, x22, 24
-	.loc 1 1547 0
-	add	x19, x22, 184
-	add	x25, x22, 744
-.LBB1481:
+	.loc 1 202 0
+	ldr	x2, [x19, 16]
 .LBB1478:
 .LBB1479:
-	.loc 5 19 0
-#APP
-// 19 "./arch/arm64/include/asm/current.h" 1
-	mrs x23, sp_el0
-// 0 "" 2
-.LVL578:
-#NO_APP
+	.loc 3 35 0
+	mov	w1, 0
+	mov	x0, x2
+	ldr	x2, [x2, 32]
+	blr	x2
+.LVL577:
 .LBE1479:
 .LBE1478:
-.LBE1481:
-	.loc 1 1544 0
-	ldr	x1, [x0]
-	str	x1, [x29, 88]
-	mov	x1,0
-	b	.L647
-	.p2align 3
-.L663:
-	.loc 1 1632 0
-	cmp	w0, 1
-	beq	.L662
-.L646:
-	.loc 1 1635 0
-	mov	x0, x20
-	bl	up
-.LVL579:
-	.loc 1 1636 0
-	bl	schedule
-.LVL580:
-.L647:
-	.loc 1 1550 0
-	mov	x0, x20
-	bl	down
-.LVL581:
-.LBB1482:
-.LBB1480:
-.LBB1477:
-	.loc 12 288 0
-	str	x24, [x23, 32]
-.LBE1477:
-.LBE1480:
-.LBE1482:
-	.loc 1 1554 0
-#APP
-// 1554 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
-	dmb ish
-// 0 "" 2
-	.loc 1 1555 0
-#NO_APP
-	ldr	x0, [x19, 224]
-	ldr	w0, [x0, 40]
-	cmp	w0, 16
-	bgt	.L638
-	cmp	w0, 7
-	bge	.L639
-	cbz	w0, .L640
-	cmp	w0, 1
-	bne	.L637
-	.loc 1 1557 0
-	ldr	w1, [x22, 208]
-	mov	x0, x21
-	bl	flip.isra.11
-.LVL582:
-	.loc 1 1558 0
-	ldrsw	x0, [x21, 72]
-	mov	x4, x19
-	ldp	x1, x2, [x19, 144]
-	add	x0, x19, x0, lsl 3
-	ldr	x3, [x19, 168]
-	ldr	x0, [x0, 184]
-	bl	get_overlay_image
-.LVL583:
-.L642:
-	.loc 1 1629 0
-	ldr	x0, [x19, 224]
-	ldr	w0, [x0, 40]
-	.loc 1 1630 0
-	sub	w1, w0, #22
-	.loc 1 1631 0
-	cmp	w0, 0
-	ccmp	w1, 1, 0, ne
-	bhi	.L663
-.LBB1483:
-.LBB1484:
-	.file 13 "./include/linux/workqueue.h"
-	.loc 13 518 0
-	ldr	x1, [x19, 608]
-	mov	x2, x25
-	mov	w0, 8
-	bl	queue_work_on
-.LVL584:
-	b	.L646
-	.p2align 3
-.L638:
-.LBE1484:
-.LBE1483:
-	.loc 1 1555 0
-	sub	w0, w0, #22
-	cmp	w0, 1
-	bls	.L640
-.L637:
-	.loc 1 1618 0
-	ldr	w1, [x19, 56]
-	.loc 1 1619 0
-	mov	x0, x21
-	.loc 1 1618 0
-	sub	w1, w1, #1
-	str	w1, [x19, 56]
-	.loc 1 1619 0
-	ldr	w1, [x22, 208]
-	bl	flip.isra.11
-.LVL585:
-	.loc 1 1620 0
-	ldr	w0, [x19, 56]
-	cbz	w0, .L642
-	.loc 1 1622 0
-	ldrsw	x0, [x21, 72]
-	mov	x3, x19
-	.loc 1 1623 0
-	ldp	x2, x1, [x19, 216]
-	.loc 1 1622 0
-	add	x0, x19, x0, lsl 3
-	ldr	x1, [x1, 16]
-	ldr	x0, [x0, 184]
-	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change
-.LVL586:
-	b	.L642
-	.p2align 3
-.L640:
-	.loc 1 1567 0
-	ldr	w1, [x22, 208]
-	mov	x0, x21
-	bl	flip.isra.11
-.LVL587:
-	.loc 1 1568 0
-	ldrsw	x0, [x21, 72]
-	mov	x4, x19
-	ldp	x1, x2, [x19, 144]
-	add	x0, x19, x0, lsl 3
-	ldr	x3, [x19, 168]
-	ldr	x0, [x0, 184]
-	bl	get_auto_image
-.LVL588:
-	.loc 1 1573 0
-	b	.L642
-	.p2align 3
-.L639:
-	.loc 1 1584 0
-	ldr	w1, [x19, 56]
-	.loc 1 1585 0
-	mov	x0, x21
-	.loc 1 1584 0
-	sub	w1, w1, #1
-	str	w1, [x19, 56]
-	.loc 1 1585 0
-	ldr	w1, [x22, 208]
-	bl	flip.isra.11
-.LVL589:
-	.loc 1 1586 0
-	ldr	w0, [x19, 56]
-	cbz	w0, .L642
-	.loc 1 1588 0
-	ldrsw	x0, [x21, 72]
-	mov	x3, x19
-	.loc 1 1589 0
-	ldp	x2, x1, [x19, 216]
-	.loc 1 1588 0
-	add	x0, x19, x0, lsl 3
-	ldr	x1, [x1, 16]
-	ldr	x0, [x0, 184]
-	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change_part
-.LVL590:
-	.loc 1 1592 0
-	b	.L642
-	.p2align 3
-.L662:
-	.loc 1 1632 0 discriminator 1
-	ldr	w0, [x19, 628]
-	cbz	w0, .L646
-	.loc 1 1632 0 is_stmt 0 discriminator 2
-	ldr	w0, [x19, 632]
-	cbz	w0, .L646
-.LBB1486:
-.LBB1485:
-	.loc 13 518 0 is_stmt 1
-	ldr	x1, [x19, 608]
-	mov	x2, x25
-	mov	w0, 8
-	bl	queue_work_on
-.LVL591:
-	b	.L646
-.LBE1485:
-.LBE1486:
-	.cfi_endproc
-.LFE2830:
-	.size	ebc_auto_tast_function, .-ebc_auto_tast_function
-	.align	2
-	.p2align 3,,7
-	.type	ebc_power_set.part.12, %function
-ebc_power_set.part.12:
-.LFB2878:
-	.loc 1 183 0
-	.cfi_startproc
-.LVL592:
-	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 183 0
-	mov	x19, x0
-	.loc 1 200 0
-	str	w1, [x0, 384]
-	.loc 1 201 0
-	ldr	x1, [x0, 8]
-.LVL593:
-.LBB1487:
-.LBB1488:
-	.loc 11 51 0
-	mov	x0, x1
-.LVL594:
-	ldr	x1, [x1, 56]
-	blr	x1
-.LVL595:
-.LBE1488:
-.LBE1487:
-	.loc 1 202 0
-	ldr	x2, [x19, 16]
-.LBB1489:
-.LBB1490:
-	.loc 3 35 0
-	mov	w1, 0
-	mov	x0, x2
-	ldr	x2, [x2, 32]
-	blr	x2
-.LVL596:
-.LBE1490:
-.LBE1489:
 	.loc 1 203 0
 	ldr	w0, [x19, 624]
-	cbnz	w0, .L670
+	cbnz	w0, .L663
 	.loc 1 207 0
 	ldr	x0, [x19]
 	adrp	x1, .LC22
 	add	x1, x1, :lo12:.LC22
 	bl	_dev_info
-.LVL597:
+.LVL578:
 	.loc 1 211 0
 	ldp	x19, x20, [sp, 16]
-.LVL598:
+.LVL579:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -7250,29 +7064,29 @@ ebc_power_set.part.12:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL599:
+.LVL580:
 	.p2align 3
-.L670:
+.L663:
 	.cfi_restore_state
 	.loc 1 204 0
 	str	wzr, [x19, 624]
-.LBB1491:
-.LBB1492:
+.LBB1480:
+.LBB1481:
 	.loc 4 68 0
 	add	x0, x19, 416
 	bl	__pm_relax
-.LVL600:
-.LBE1492:
-.LBE1491:
+.LVL581:
+.LBE1481:
+.LBE1480:
 	.loc 1 207 0
 	ldr	x0, [x19]
 	adrp	x1, .LC22
 	add	x1, x1, :lo12:.LC22
 	bl	_dev_info
-.LVL601:
+.LVL582:
 	.loc 1 211 0
 	ldp	x19, x20, [sp, 16]
-.LVL602:
+.LVL583:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -7281,16 +7095,16 @@ ebc_power_set.part.12:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2878:
-	.size	ebc_power_set.part.12, .-ebc_power_set.part.12
+.LFE2880:
+	.size	ebc_power_set.part.13, .-ebc_power_set.part.13
 	.align	2
 	.p2align 3,,7
 	.type	ebc_suspend, %function
 ebc_suspend:
-.LFB2862:
-	.loc 1 3060 0
+.LFB2863:
+	.loc 1 3032 0
 	.cfi_startproc
-.LVL603:
+.LVL584:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -7300,40 +7114,40 @@ ebc_suspend:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-.LBB1493:
-.LBB1494:
+.LBB1482:
+.LBB1483:
 	.loc 2 1181 0
 	ldr	x20, [x0, 184]
-.LBE1494:
-.LBE1493:
-	.loc 1 3064 0
+.LBE1483:
+.LBE1482:
+	.loc 1 3036 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 200]
-.LVL604:
+.LVL585:
 	cmp	w0, 1
-	beq	.L674
-.L672:
-	.loc 1 3068 0
+	beq	.L667
+.L665:
+	.loc 1 3040 0
 	mov	w0, 1
 	str	w0, [x19, 620]
-	.loc 1 3070 0
+	.loc 1 3042 0
 	ldr	x1, [x20, 16]
-.LBB1495:
-.LBB1496:
+.LBB1484:
+.LBB1485:
 	.loc 3 40 0
 	mov	x0, x1
 	ldr	x1, [x1, 40]
 	blr	x1
-.LVL605:
-.LBE1496:
-.LBE1495:
-	.loc 1 3071 0
+.LVL586:
+.LBE1485:
+.LBE1484:
+	.loc 1 3043 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC24
 	add	x1, x1, :lo12:.LC24
 	bl	_dev_info
-.LVL606:
-	.loc 1 3074 0
+.LVL587:
+	.loc 1 3046 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -7345,9 +7159,9 @@ ebc_suspend:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L674:
+.L667:
 	.cfi_restore_state
-	.loc 1 3065 0
+	.loc 1 3037 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
@@ -7355,130 +7169,130 @@ ebc_suspend:
 	add	x2, x2, 16
 	add	x1, x1, :lo12:.LC23
 	bl	_dev_info
-.LVL607:
-.LBB1497:
-.LBB1498:
+.LVL588:
+.LBB1486:
+.LBB1487:
 	mov	w1, 0
 	mov	x0, x20
-	bl	ebc_power_set.part.12
-.LVL608:
-	b	.L672
-.LBE1498:
-.LBE1497:
+	bl	ebc_power_set.part.13
+.LVL589:
+	b	.L665
+.LBE1487:
+.LBE1486:
 	.cfi_endproc
-.LFE2862:
+.LFE2863:
 	.size	ebc_suspend, .-ebc_suspend
 	.align	2
 	.p2align 3,,7
-	.type	check_black_percent.isra.14, %function
-check_black_percent.isra.14:
-.LFB2880:
-	.loc 1 1776 0
+	.type	check_black_percent.isra.15, %function
+check_black_percent.isra.15:
+.LFB2882:
+	.loc 1 1745 0
 	.cfi_startproc
-	.loc 1 1786 0
+	.loc 1 1755 0
 	cmp	w1, 32
 	lsl	w3, w2, 1
 	csel	w2, w3, w2, eq
-	.loc 1 1790 0
+	.loc 1 1759 0
 	mov	w1, 26215
 	movk	w1, 0x6666, lsl 16
-	.loc 1 1791 0
+	.loc 1 1760 0
 	cmp	w2, 0
 	add	w5, w2, 7
-	.loc 1 1790 0
+	.loc 1 1759 0
 	smull	x4, w2, w1
-	.loc 1 1791 0
+	.loc 1 1760 0
 	csel	w5, w5, w2, lt
 	asr	w5, w5, 3
 	cmp	w5, 0
-	.loc 1 1790 0
+	.loc 1 1759 0
 	asr	x4, x4, 34
 	sub	w4, w4, w2, asr 31
-.LVL609:
-	.loc 1 1791 0
-	ble	.L677
+.LVL590:
+	.loc 1 1760 0
+	ble	.L670
 	mov	x1, 0
 	mov	w2, 0
-.LVL610:
-	b	.L680
+.LVL591:
+	b	.L673
 	.p2align 3
-.L688:
+.L681:
 	cmp	w5, w1
-	ble	.L677
-.L680:
-	.loc 1 1793 0
+	ble	.L670
+.L673:
+	.loc 1 1762 0
 	ldr	x3, [x0, x1, lsl 3]
 	add	x1, x1, 1
-	.loc 1 1794 0
+	.loc 1 1763 0
 	cmp	x3, 0
 	cinc	w2, w2, ne
-	.loc 1 1795 0
+	.loc 1 1764 0
 	cmp	w4, w2, lsl 3
-	bge	.L688
-	.loc 1 1796 0
+	bge	.L681
+	.loc 1 1765 0
 	mov	w0, 0
 	ret
-.L677:
-	.loc 1 1776 0
+.L670:
+	.loc 1 1745 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1799 0
+	.loc 1 1768 0
 	adrp	x0, .LC25
 	add	x0, x0, :lo12:.LC25
-	.loc 1 1776 0
+	.loc 1 1745 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1799 0
+	.loc 1 1768 0
 	bl	printk
-.LVL611:
-	.loc 1 1801 0
+.LVL592:
+	.loc 1 1770 0
 	mov	w0, 1
-	.loc 1 1802 0
+	.loc 1 1771 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2880:
-	.size	check_black_percent.isra.14, .-check_black_percent.isra.14
+.LFE2882:
+	.size	check_black_percent.isra.15, .-check_black_percent.isra.15
 	.align	2
 	.p2align 3,,7
 	.type	ebc_probe, %function
 ebc_probe:
-.LFB2860:
-	.loc 1 2924 0
+.LFB2861:
+	.loc 1 2896 0
 	.cfi_startproc
-.LVL612:
+.LVL593:
 	stp	x29, x30, [sp, -208]!
 	.cfi_def_cfa_offset 208
 	.cfi_offset 29, -208
 	.cfi_offset 30, -200
-.LBB1643:
-.LBB1644:
+.LBB1632:
+.LBB1633:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
-.LBE1644:
-.LBE1643:
-	.loc 1 2924 0
+.LBE1633:
+.LBE1632:
+	.loc 1 2896 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 2925 0
+	.loc 1 2897 0
 	add	x22, x0, 16
-	.loc 1 2924 0
+	.loc 1 2896 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
-.LVL613:
+.LVL594:
 	stp	x25, x26, [sp, 64]
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 19, -192
@@ -7487,148 +7301,148 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 2924 0
+	.loc 1 2896 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
-.LBB1646:
-.LBB1645:
+.LBB1635:
+.LBB1634:
 	.loc 2 711 0
 	mov	x0, x22
 	mov	x1, 824
 	bl	devm_kmalloc
-.LVL614:
-.LBE1645:
-.LBE1646:
-	.loc 1 2940 0
-	cbz	x0, .L739
-	.loc 1 2944 0
+.LVL595:
+.LBE1634:
+.LBE1635:
+	.loc 1 2912 0
+	cbz	x0, .L732
+	.loc 1 2916 0
 	adrp	x24, .LANCHOR0
 	mov	x20, x0
-	.loc 1 2946 0
+	.loc 1 2918 0
 	adrp	x1, .LC26
 	mov	w2, 0
-	.loc 1 2944 0
+	.loc 1 2916 0
 	str	x0, [x24, #:lo12:.LANCHOR0]
-	.loc 1 2946 0
+	.loc 1 2918 0
 	add	x1, x1, :lo12:.LC26
 	ldr	x0, [x22, 752]
-	.loc 1 2943 0
+	.loc 1 2915 0
 	str	x22, [x20]
-	.loc 1 2946 0
+	.loc 1 2918 0
 	bl	of_parse_phandle
-.LVL615:
-	.loc 1 2947 0
-	cbz	x0, .L775
-	.loc 1 2952 0
+.LVL596:
+	.loc 1 2919 0
+	cbz	x0, .L768
+	.loc 1 2924 0
 	bl	of_find_device_by_node
-.LVL616:
-	.loc 1 2954 0
-	cbz	x0, .L693
-.LBB1647:
-.LBB1648:
-.LBB1649:
+.LVL597:
+	.loc 1 2926 0
+	cbz	x0, .L686
+.LBB1636:
+.LBB1637:
+.LBB1638:
 	.loc 2 1181 0
 	ldr	x0, [x0, 200]
-.LVL617:
-.LBE1649:
-.LBE1648:
-.LBE1647:
-	.loc 1 2957 0
+.LVL598:
+.LBE1638:
+.LBE1637:
+.LBE1636:
+	.loc 1 2929 0
 	str	x0, [x20, 8]
-	.loc 1 2958 0
-	cbz	x0, .L693
-	.loc 1 2960 0
+	.loc 1 2930 0
+	cbz	x0, .L686
+	.loc 1 2932 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 2962 0
+	.loc 1 2934 0
 	add	x2, x29, 96
 	adrp	x1, .LC28
 	add	x1, x1, :lo12:.LC28
 	ldr	x0, [x22, 752]
 	bl	of_get_property
-.LVL618:
+.LVL599:
 	mov	x21, x0
-.LVL619:
-	.loc 1 2963 0
+.LVL600:
+	.loc 1 2935 0
 	ldrsw	x0, [x29, 96]
-.LVL620:
+.LVL601:
 	lsr	x0, x0, 2
-.LVL621:
+.LVL602:
 	str	w0, [x29, 96]
-.LVL622:
-	.loc 1 2964 0
+.LVL603:
+	.loc 1 2936 0
 	cmp	w0, 0
-	beq	.L694
-	.loc 1 2969 0 discriminator 1
+	beq	.L687
+	.loc 1 2941 0 discriminator 1
 	mov	w19, 0
-.LVL623:
-	bgt	.L762
-	b	.L696
+.LVL604:
+	bgt	.L755
+	b	.L689
 	.p2align 3
-.L697:
-	.loc 1 2977 0
+.L690:
+	.loc 1 2949 0
 	bl	of_find_i2c_device_by_node
-.LVL624:
-	.loc 1 2979 0
-	cbz	x0, .L776
-.LBB1650:
-.LBB1651:
-.LBB1652:
+.LVL605:
+	.loc 1 2951 0
+	cbz	x0, .L769
+.LBB1639:
+.LBB1640:
+.LBB1641:
 	.loc 2 1181 0
 	ldr	x0, [x0, 216]
-.LVL625:
-.LBE1652:
-.LBE1651:
-.LBE1650:
-	.loc 1 2984 0
+.LVL606:
+.LBE1641:
+.LBE1640:
+.LBE1639:
+	.loc 1 2956 0
 	str	x0, [x20, 16]
-	.loc 1 2985 0
-	cbnz	x0, .L777
-	.loc 1 2969 0 discriminator 2
+	.loc 1 2957 0
+	cbnz	x0, .L770
+	.loc 1 2941 0 discriminator 2
 	ldr	w0, [x29, 96]
 	add	w19, w19, 1
-.LVL626:
+.LVL607:
 	cmp	w0, w19
-	ble	.L701
-.L762:
+	ble	.L694
+.L755:
 	ldr	w0, [x21], 4
-	.loc 1 2971 0
+	.loc 1 2943 0
 	rev	w0, w0
 	bl	of_find_node_by_phandle
-.LVL627:
-	.loc 1 2972 0
-	cbnz	x0, .L697
-	.loc 1 2973 0
+.LVL608:
+	.loc 1 2944 0
+	cbnz	x0, .L690
+	.loc 1 2945 0
 	adrp	x1, .LC30
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC30
-	.loc 1 2974 0
+	.loc 1 2946 0
 	mov	w25, -19
-	.loc 1 2973 0
+	.loc 1 2945 0
 	bl	_dev_err
-.LVL628:
+.LVL609:
 	.p2align 2
-.L689:
-	.loc 1 3050 0
+.L682:
+	.loc 1 3022 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w25
-.LVL629:
+.LVL610:
 	ldr	x2, [x29, 200]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L778
+	cbnz	x1, .L771
 	ldp	x19, x20, [sp, 16]
-.LVL630:
+.LVL611:
 	ldp	x21, x22, [sp, 32]
-.LVL631:
+.LVL612:
 	ldp	x23, x24, [sp, 48]
-.LVL632:
+.LVL613:
 	ldp	x25, x26, [sp, 64]
-.LVL633:
+.LVL614:
 	ldp	x27, x28, [sp, 80]
-.LVL634:
+.LVL615:
 	ldp	x29, x30, [sp], 208
 	.cfi_remember_state
 	.cfi_restore 30
@@ -7645,92 +7459,92 @@ ebc_probe:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL635:
+.LVL616:
 	.p2align 3
-.L777:
+.L770:
 	.cfi_restore_state
-	.loc 1 2986 0
+	.loc 1 2958 0
 	adrp	x1, .LC32
 	mov	w2, w19
 	add	x1, x1, :lo12:.LC32
 	mov	x0, x22
 	bl	_dev_info
-.LVL636:
-.L696:
-	.loc 1 2991 0
+.LVL617:
+.L689:
+	.loc 1 2963 0
 	ldr	x0, [x20, 16]
-	cbz	x0, .L701
-	.loc 1 2997 0
+	cbz	x0, .L694
+	.loc 1 2969 0
 	add	x19, x20, 184
-.LVL637:
-	.loc 1 2999 0
+.LVL618:
+	.loc 1 2971 0
 	add	x21, x20, 24
-.LVL638:
-	.loc 1 2997 0
+.LVL619:
+	.loc 1 2969 0
 	str	x22, [x19, 104]
-.LBB1653:
-.LBB1654:
-.LBB1655:
-.LBB1656:
-.LBB1657:
-	.file 14 "./include/linux/of.h"
-	.loc 14 499 0
+.LBB1642:
+.LBB1643:
+.LBB1644:
+.LBB1645:
+.LBB1646:
+	.file 12 "./include/linux/of.h"
+	.loc 12 499 0
 	adrp	x1, .LC34
-.LBE1657:
-.LBE1656:
-.LBE1655:
-.LBE1654:
-.LBE1653:
-	.loc 1 2999 0
+.LBE1646:
+.LBE1645:
+.LBE1644:
+.LBE1643:
+.LBE1642:
+	.loc 1 2971 0
 	str	x22, [x20, 24]
-.LBB1727:
-.LBB1724:
-.LBB1664:
-.LBB1661:
-.LBB1658:
-	.loc 14 499 0
+.LBB1716:
+.LBB1713:
+.LBB1653:
+.LBB1650:
+.LBB1647:
+	.loc 12 499 0
 	mov	x4, 0
-.LBE1658:
-.LBE1661:
-.LBE1664:
-.LBE1724:
-.LBE1727:
-	.loc 1 3000 0
+.LBE1647:
+.LBE1650:
+.LBE1653:
+.LBE1713:
+.LBE1716:
+	.loc 1 2972 0
 	ldr	x2, [x20, 8]
-.LBB1728:
-.LBB1725:
-.LBB1665:
-.LBB1662:
-.LBB1659:
-	.loc 14 499 0
+.LBB1717:
+.LBB1714:
+.LBB1654:
+.LBB1651:
+.LBB1648:
+	.loc 12 499 0
 	add	x1, x1, :lo12:.LC34
-.LBE1659:
-.LBE1662:
-.LBE1665:
-.LBE1725:
-.LBE1728:
-	.loc 1 3001 0
+.LBE1648:
+.LBE1651:
+.LBE1654:
+.LBE1714:
+.LBE1717:
+	.loc 1 2973 0
 	stp	x2, x0, [x21, 8]
-.LBB1729:
-.LBB1726:
-.LBB1666:
-.LBB1663:
-.LBB1660:
-	.loc 14 499 0
+.LBB1718:
+.LBB1715:
+.LBB1655:
+.LBB1652:
+.LBB1649:
+	.loc 12 499 0
 	mov	x3, 1
 	ldr	x0, [x22, 752]
 	add	x2, x20, 100
 	bl	of_property_read_variable_u32_array
-.LVL639:
-	.loc 14 501 0
-	tbnz	w0, #31, .L703
-.LBE1660:
-.LBE1663:
-.LBE1666:
-.LBB1667:
-.LBB1668:
-.LBB1669:
-	.loc 14 499 0
+.LVL620:
+	.loc 12 501 0
+	tbnz	w0, #31, .L696
+.LBE1649:
+.LBE1652:
+.LBE1655:
+.LBB1656:
+.LBB1657:
+.LBB1658:
+	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC58
 	mov	x4, 0
@@ -7738,16 +7552,16 @@ ebc_probe:
 	add	x2, x20, 104
 	add	x1, x1, :lo12:.LC58
 	bl	of_property_read_variable_u32_array
-.LVL640:
-	.loc 14 501 0
-	tbnz	w0, #31, .L703
-.LBE1669:
-.LBE1668:
-.LBE1667:
-.LBB1670:
-.LBB1671:
-.LBB1672:
-	.loc 14 499 0
+.LVL621:
+	.loc 12 501 0
+	tbnz	w0, #31, .L696
+.LBE1658:
+.LBE1657:
+.LBE1656:
+.LBB1659:
+.LBB1660:
+.LBB1661:
+	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC59
 	mov	x4, 0
@@ -7755,16 +7569,16 @@ ebc_probe:
 	add	x2, x20, 108
 	add	x1, x1, :lo12:.LC59
 	bl	of_property_read_variable_u32_array
-.LVL641:
-	.loc 14 501 0
-	tbnz	w0, #31, .L703
-.LBE1672:
-.LBE1671:
-.LBE1670:
-.LBB1673:
-.LBB1674:
-.LBB1675:
-	.loc 14 499 0
+.LVL622:
+	.loc 12 501 0
+	tbnz	w0, #31, .L696
+.LBE1661:
+.LBE1660:
+.LBE1659:
+.LBB1662:
+.LBB1663:
+.LBB1664:
+	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC60
 	mov	x4, 0
@@ -7772,16 +7586,16 @@ ebc_probe:
 	add	x2, x20, 112
 	add	x1, x1, :lo12:.LC60
 	bl	of_property_read_variable_u32_array
-.LVL642:
-	.loc 14 501 0
-	tbnz	w0, #31, .L703
-.LBE1675:
-.LBE1674:
-.LBE1673:
-.LBB1676:
-.LBB1677:
-.LBB1678:
-	.loc 14 499 0
+.LVL623:
+	.loc 12 501 0
+	tbnz	w0, #31, .L696
+.LBE1664:
+.LBE1663:
+.LBE1662:
+.LBB1665:
+.LBB1666:
+.LBB1667:
+	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC61
 	mov	x4, 0
@@ -7789,16 +7603,16 @@ ebc_probe:
 	add	x2, x20, 128
 	add	x1, x1, :lo12:.LC61
 	bl	of_property_read_variable_u32_array
-.LVL643:
-	.loc 14 501 0
-	tbnz	w0, #31, .L703
-.LBE1678:
-.LBE1677:
-.LBE1676:
-.LBB1679:
-.LBB1680:
-.LBB1681:
-	.loc 14 499 0
+.LVL624:
+	.loc 12 501 0
+	tbnz	w0, #31, .L696
+.LBE1667:
+.LBE1666:
+.LBE1665:
+.LBB1668:
+.LBB1669:
+.LBB1670:
+	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC62
 	mov	x4, 0
@@ -7806,16 +7620,16 @@ ebc_probe:
 	add	x2, x20, 132
 	add	x1, x1, :lo12:.LC62
 	bl	of_property_read_variable_u32_array
-.LVL644:
-	.loc 14 501 0
-	tbnz	w0, #31, .L703
-.LBE1681:
-.LBE1680:
-.LBE1679:
-.LBB1682:
-.LBB1683:
-.LBB1684:
-	.loc 14 499 0
+.LVL625:
+	.loc 12 501 0
+	tbnz	w0, #31, .L696
+.LBE1670:
+.LBE1669:
+.LBE1668:
+.LBB1671:
+.LBB1672:
+.LBB1673:
+	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC63
 	mov	x4, 0
@@ -7823,16 +7637,16 @@ ebc_probe:
 	add	x2, x20, 136
 	add	x1, x1, :lo12:.LC63
 	bl	of_property_read_variable_u32_array
-.LVL645:
-	.loc 14 501 0
-	tbnz	w0, #31, .L703
-.LBE1684:
-.LBE1683:
-.LBE1682:
-.LBB1685:
-.LBB1686:
-.LBB1687:
-	.loc 14 499 0
+.LVL626:
+	.loc 12 501 0
+	tbnz	w0, #31, .L696
+.LBE1673:
+.LBE1672:
+.LBE1671:
+.LBB1674:
+.LBB1675:
+.LBB1676:
+	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC64
 	mov	x4, 0
@@ -7840,16 +7654,16 @@ ebc_probe:
 	add	x2, x20, 140
 	add	x1, x1, :lo12:.LC64
 	bl	of_property_read_variable_u32_array
-.LVL646:
-	.loc 14 501 0
-	tbnz	w0, #31, .L703
-.LBE1687:
-.LBE1686:
-.LBE1685:
-.LBB1688:
-.LBB1689:
-.LBB1690:
-	.loc 14 499 0
+.LVL627:
+	.loc 12 501 0
+	tbnz	w0, #31, .L696
+.LBE1676:
+.LBE1675:
+.LBE1674:
+.LBB1677:
+.LBB1678:
+.LBB1679:
+	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC65
 	mov	x4, 0
@@ -7857,16 +7671,16 @@ ebc_probe:
 	add	x2, x20, 144
 	add	x1, x1, :lo12:.LC65
 	bl	of_property_read_variable_u32_array
-.LVL647:
-	.loc 14 501 0
-	tbnz	w0, #31, .L703
-.LBE1690:
-.LBE1689:
-.LBE1688:
-.LBB1691:
-.LBB1692:
-.LBB1693:
-	.loc 14 499 0
+.LVL628:
+	.loc 12 501 0
+	tbnz	w0, #31, .L696
+.LBE1679:
+.LBE1678:
+.LBE1677:
+.LBB1680:
+.LBB1681:
+.LBB1682:
+	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC66
 	mov	x4, 0
@@ -7874,16 +7688,16 @@ ebc_probe:
 	add	x2, x20, 148
 	add	x1, x1, :lo12:.LC66
 	bl	of_property_read_variable_u32_array
-.LVL648:
-	.loc 14 501 0
-	tbnz	w0, #31, .L703
-.LBE1693:
-.LBE1692:
-.LBE1691:
-.LBB1694:
-.LBB1695:
-.LBB1696:
-	.loc 14 499 0
+.LVL629:
+	.loc 12 501 0
+	tbnz	w0, #31, .L696
+.LBE1682:
+.LBE1681:
+.LBE1680:
+.LBB1683:
+.LBB1684:
+.LBB1685:
+	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC67
 	mov	x4, 0
@@ -7891,16 +7705,16 @@ ebc_probe:
 	add	x2, x20, 152
 	add	x1, x1, :lo12:.LC67
 	bl	of_property_read_variable_u32_array
-.LVL649:
-	.loc 14 501 0
-	tbnz	w0, #31, .L703
-.LBE1696:
-.LBE1695:
-.LBE1694:
-.LBB1697:
-.LBB1698:
-.LBB1699:
-	.loc 14 499 0
+.LVL630:
+	.loc 12 501 0
+	tbnz	w0, #31, .L696
+.LBE1685:
+.LBE1684:
+.LBE1683:
+.LBB1686:
+.LBB1687:
+.LBB1688:
+	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC68
 	mov	x4, 0
@@ -7908,16 +7722,16 @@ ebc_probe:
 	add	x2, x20, 156
 	add	x1, x1, :lo12:.LC68
 	bl	of_property_read_variable_u32_array
-.LVL650:
-	.loc 14 501 0
-	tbnz	w0, #31, .L703
-.LBE1699:
-.LBE1698:
-.LBE1697:
-.LBB1700:
-.LBB1701:
-.LBB1702:
-	.loc 14 499 0
+.LVL631:
+	.loc 12 501 0
+	tbnz	w0, #31, .L696
+.LBE1688:
+.LBE1687:
+.LBE1686:
+.LBB1689:
+.LBB1690:
+.LBB1691:
+	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC69
 	mov	x4, 0
@@ -7925,16 +7739,16 @@ ebc_probe:
 	add	x2, x20, 160
 	add	x1, x1, :lo12:.LC69
 	bl	of_property_read_variable_u32_array
-.LVL651:
-	.loc 14 501 0
-	tbnz	w0, #31, .L703
-.LBE1702:
-.LBE1701:
-.LBE1700:
-.LBB1703:
-.LBB1704:
-.LBB1705:
-	.loc 14 499 0
+.LVL632:
+	.loc 12 501 0
+	tbnz	w0, #31, .L696
+.LBE1691:
+.LBE1690:
+.LBE1689:
+.LBB1692:
+.LBB1693:
+.LBB1694:
+	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC70
 	mov	x4, 0
@@ -7942,16 +7756,16 @@ ebc_probe:
 	add	x2, x20, 164
 	add	x1, x1, :lo12:.LC70
 	bl	of_property_read_variable_u32_array
-.LVL652:
-	.loc 14 501 0
-	tbnz	w0, #31, .L703
-.LBE1705:
-.LBE1704:
-.LBE1703:
-.LBB1706:
-.LBB1707:
-.LBB1708:
-	.loc 14 499 0
+.LVL633:
+	.loc 12 501 0
+	tbnz	w0, #31, .L696
+.LBE1694:
+.LBE1693:
+.LBE1692:
+.LBB1695:
+.LBB1696:
+.LBB1697:
+	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC71
 	mov	x4, 0
@@ -7959,16 +7773,16 @@ ebc_probe:
 	add	x2, x20, 168
 	add	x1, x1, :lo12:.LC71
 	bl	of_property_read_variable_u32_array
-.LVL653:
-	.loc 14 501 0
-	tbnz	w0, #31, .L703
-.LBE1708:
-.LBE1707:
-.LBE1706:
-.LBB1709:
-.LBB1710:
-.LBB1711:
-	.loc 14 499 0
+.LVL634:
+	.loc 12 501 0
+	tbnz	w0, #31, .L696
+.LBE1697:
+.LBE1696:
+.LBE1695:
+.LBB1698:
+.LBB1699:
+.LBB1700:
+	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC72
 	mov	x4, 0
@@ -7976,19 +7790,19 @@ ebc_probe:
 	add	x2, x20, 172
 	add	x1, x1, :lo12:.LC72
 	bl	of_property_read_variable_u32_array
-.LVL654:
-	.loc 14 501 0
-	tbz	w0, #31, .L729
-.LBE1711:
-.LBE1710:
-.LBE1709:
-	.loc 1 2268 0
+.LVL635:
+	.loc 12 501 0
+	tbz	w0, #31, .L722
+.LBE1700:
+.LBE1699:
+.LBE1698:
+	.loc 1 2240 0
 	str	wzr, [x21, 148]
-.L729:
-.LBB1712:
-.LBB1713:
-.LBB1714:
-	.loc 14 499 0
+.L722:
+.LBB1701:
+.LBB1702:
+.LBB1703:
+	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC35
 	mov	x4, 0
@@ -7996,19 +7810,19 @@ ebc_probe:
 	add	x2, x20, 176
 	add	x1, x1, :lo12:.LC35
 	bl	of_property_read_variable_u32_array
-.LVL655:
-	.loc 14 501 0
-	tbz	w0, #31, .L730
-.LBE1714:
-.LBE1713:
-.LBE1712:
-	.loc 1 2271 0
+.LVL636:
+	.loc 12 501 0
+	tbz	w0, #31, .L723
+.LBE1703:
+.LBE1702:
+.LBE1701:
+	.loc 1 2243 0
 	str	wzr, [x21, 152]
-.L730:
-.LBB1715:
-.LBB1716:
-.LBB1717:
-	.loc 14 499 0
+.L723:
+.LBB1704:
+.LBB1705:
+.LBB1706:
+	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC36
 	mov	x4, 0
@@ -8016,19 +7830,19 @@ ebc_probe:
 	add	x2, x20, 180
 	add	x1, x1, :lo12:.LC36
 	bl	of_property_read_variable_u32_array
-.LVL656:
-	.loc 14 501 0
-	tbz	w0, #31, .L731
-.LBE1717:
-.LBE1716:
-.LBE1715:
-	.loc 1 2274 0
+.LVL637:
+	.loc 12 501 0
+	tbz	w0, #31, .L724
+.LBE1706:
+.LBE1705:
+.LBE1704:
+	.loc 1 2246 0
 	str	wzr, [x21, 156]
-.L731:
-.LBB1718:
-.LBB1719:
-.LBB1720:
-	.loc 14 499 0
+.L724:
+.LBB1707:
+.LBB1708:
+.LBB1709:
+	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC37
 	mov	x4, 0
@@ -8036,19 +7850,19 @@ ebc_probe:
 	add	x2, x20, 116
 	add	x1, x1, :lo12:.LC37
 	bl	of_property_read_variable_u32_array
-.LVL657:
-	.loc 14 501 0
-	tbz	w0, #31, .L732
-.LBE1720:
-.LBE1719:
-.LBE1718:
-	.loc 1 2277 0
+.LVL638:
+	.loc 12 501 0
+	tbz	w0, #31, .L725
+.LBE1709:
+.LBE1708:
+.LBE1707:
+	.loc 1 2249 0
 	str	wzr, [x21, 92]
-.L732:
-.LBB1721:
-.LBB1722:
-.LBB1723:
-	.loc 14 499 0
+.L725:
+.LBB1710:
+.LBB1711:
+.LBB1712:
+	.loc 12 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC38
 	mov	x4, 0
@@ -8056,376 +7870,377 @@ ebc_probe:
 	add	x2, x20, 120
 	add	x1, x1, :lo12:.LC38
 	bl	of_property_read_variable_u32_array
-.LVL658:
-	.loc 14 501 0
-	tbz	w0, #31, .L733
-.LBE1723:
-.LBE1722:
-.LBE1721:
-	.loc 1 2280 0
+.LVL639:
+	.loc 12 501 0
+	tbz	w0, #31, .L726
+.LBE1712:
+.LBE1711:
+.LBE1710:
+	.loc 1 2252 0
 	str	wzr, [x21, 96]
-.L733:
-.LBE1726:
-.LBE1729:
-	.loc 1 3009 0
+.L726:
+.LBE1715:
+.LBE1718:
+	.loc 1 2981 0
 	ldr	w0, [x21, 88]
-.LBB1730:
-.LBB1731:
-	.loc 1 2732 0
+.LBB1719:
+.LBB1720:
+	.loc 1 2704 0
 	mov	w2, 0
-.LBE1731:
-.LBE1730:
-	.loc 1 3009 0
+.LBE1720:
+.LBE1719:
+	.loc 1 2981 0
 	str	w0, [x19, 68]
-	.loc 1 3010 0
+	.loc 1 2982 0
 	ldr	w1, [x21, 84]
 	str	w1, [x19, 72]
-	.loc 1 3013 0
+	.loc 1 2985 0
 	tst	x1, 15
-	.loc 1 3011 0
+	.loc 1 2983 0
 	mul	w0, w0, w1
-	.loc 1 3013 0
+	.loc 1 2985 0
 	cset	w1, eq
 	str	w1, [x19, 88]
-.LBB1745:
-.LBB1740:
-	.loc 1 2732 0
+.LBB1734:
+.LBB1729:
+	.loc 1 2704 0
 	adrp	x1, .LC39
 	add	x1, x1, :lo12:.LC39
-.LBE1740:
-.LBE1745:
-	.loc 1 3011 0
+.LBE1729:
+.LBE1734:
+	.loc 1 2983 0
 	lsr	w3, w0, 1
-	.loc 1 3012 0
+	.loc 1 2984 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x19, 20]
-.LBB1746:
-.LBB1741:
-	.loc 1 2723 0
+.LBB1735:
+.LBB1730:
+	.loc 1 2695 0
 	ldr	x26, [x20]
-.LVL659:
-	.loc 1 2732 0
+.LVL640:
+	.loc 1 2704 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL660:
-	.loc 1 2733 0
-	cbz	x0, .L740
-	.loc 1 2736 0
+.LVL641:
+	.loc 1 2705 0
+	cbz	x0, .L733
+	.loc 1 2708 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL661:
+.LVL642:
 	mov	w25, w0
-	.loc 1 2738 0
-	cbnz	w0, .L779
-.LBB1732:
-.LBB1733:
-	.file 15 "./include/linux/ioport.h"
-	.loc 15 204 0
+	.loc 1 2710 0
+	cbnz	w0, .L772
+.LBB1721:
+.LBB1722:
+	.file 13 "./include/linux/ioport.h"
+	.loc 13 204 0
 	ldp	x1, x2, [x29, 104]
-.LBE1733:
-.LBE1732:
-	.loc 1 2743 0
+.LBE1722:
+.LBE1721:
+	.loc 1 2715 0
 	str	x1, [x20, 184]
-	.loc 1 2746 0
+	.loc 1 2718 0
 	mov	x3, 1
 	mov	x0, x26
-.LBB1735:
-.LBB1734:
-	.loc 15 204 0
+.LBB1724:
+.LBB1723:
+	.loc 13 204 0
 	add	x2, x2, 1
 	sub	x2, x2, x1
-.LBE1734:
-.LBE1735:
-	.loc 1 2744 0
+.LBE1723:
+.LBE1724:
+	.loc 1 2716 0
 	str	w2, [x19, 16]
-	.loc 1 2746 0
+	.loc 1 2718 0
 	sxtw	x2, w2
 	bl	devm_memremap
-.LVL662:
+.LVL643:
 	str	x0, [x19, 8]
-	.loc 1 2748 0
-	cbz	x0, .L711
-	.loc 1 2756 0
+	.loc 1 2720 0
+	cbz	x0, .L704
+	.loc 1 2728 0
 	mov	x1, x0
 	ldr	w2, [x19, 16]
 	ldr	x0, [x20, 184]
 	mov	w4, 4
 	mov	w3, 4194304
 	bl	ebc_buf_init
-.LVL663:
-	.loc 1 2757 0
-	cbnz	w0, .L711
-	.loc 1 2762 0
+.LVL644:
+	.loc 1 2729 0
+	cbnz	w0, .L704
+	.loc 1 2734 0
 	ldr	x1, [x19, 8]
-	.loc 1 2763 0
+	.loc 1 2735 0
 	mov	x6, 1048576
-	.loc 1 2762 0
+	.loc 1 2734 0
 	mov	x3, 20971520
-	.loc 1 2763 0
+	.loc 1 2735 0
 	str	x6, [x21, 40]
-	.loc 1 2762 0
+	.loc 1 2734 0
 	add	x8, x1, x3
 	str	x8, [x21, 24]
 	mov	x7, 22020096
 	add	x5, x1, x7
-	.loc 1 2764 0
+	.loc 1 2736 0
 	ldr	x2, [x20, 184]
-	.loc 1 2769 0
+	.loc 1 2741 0
 	mov	x4, 23068672
 	add	x4, x1, x4
-.LBB1736:
-.LBB1737:
+.LBB1725:
+.LBB1726:
 	.loc 2 711 0
 	mov	x0, x26
-.LBE1737:
-.LBE1736:
-	.loc 1 2764 0
+.LBE1726:
+.LBE1725:
+	.loc 1 2736 0
 	add	x3, x2, x3
 	str	x3, [x21, 32]
-	.loc 1 2765 0
+	.loc 1 2737 0
 	str	x8, [x19, 184]
-	.loc 1 2764 0
+	.loc 1 2736 0
 	add	x2, x2, x7
-	.loc 1 2763 0
+	.loc 1 2735 0
 	str	x6, [x21, 64]
-	.loc 1 2764 0
+	.loc 1 2736 0
 	stp	x5, x2, [x21, 48]
-	.loc 1 2770 0
+	.loc 1 2742 0
 	mov	x2, 27262976
 	add	x2, x1, x2
 	stp	x4, x2, [x19, 144]
-	.loc 1 2771 0
+	.loc 1 2743 0
 	mov	x2, 31457280
 	add	x2, x1, x2
-	.loc 1 2765 0
+	.loc 1 2737 0
 	str	x5, [x19, 192]
-	.loc 1 2771 0
+	.loc 1 2743 0
 	str	x2, [x19, 160]
-	.loc 1 2772 0
+	.loc 1 2744 0
 	mov	x2, 35651584
 	add	x1, x1, x2
 	str	x1, [x19, 128]
-	.loc 1 2775 0
+	.loc 1 2747 0
 	ldp	w2, w1, [x21, 84]
-.LBB1739:
-.LBB1738:
+.LBB1728:
+.LBB1727:
 	.loc 2 711 0
 	mul	w1, w2, w1
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	bl	devm_kmalloc
-.LVL664:
-.LBE1738:
-.LBE1739:
-	.loc 1 2775 0
+.LVL645:
+.LBE1727:
+.LBE1728:
+	.loc 1 2747 0
 	str	x0, [x19, 168]
-	.loc 1 2776 0
-	cbz	x0, .L711
-	.loc 1 2778 0
+	.loc 1 2748 0
+	cbz	x0, .L704
+	.loc 1 2750 0
 	ldp	w2, w1, [x21, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
-.LVL665:
-	.loc 1 2779 0
+.LVL646:
+	.loc 1 2751 0
 	ldrsw	x2, [x19, 20]
 	mov	w1, 255
 	ldr	x0, [x19, 160]
 	bl	memset
-.LVL666:
-.LBE1741:
-.LBE1746:
-.LBB1747:
-.LBB1748:
-	.loc 1 2680 0
+.LVL647:
+.LBE1730:
+.LBE1735:
+.LBB1736:
+.LBB1737:
+	.loc 1 2652 0
 	ldr	x26, [x19, 104]
-.LVL667:
-	.loc 1 2686 0
+.LVL648:
+	.loc 1 2658 0
 	adrp	x1, .LC41
 	mov	w2, 0
 	add	x1, x1, :lo12:.LC41
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL668:
-	.loc 1 2687 0
-	cbz	x0, .L741
-	.loc 1 2690 0
+.LVL649:
+	.loc 1 2659 0
+	cbz	x0, .L734
+	.loc 1 2662 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL669:
+.LVL650:
 	mov	w25, w0
-	.loc 1 2692 0
-	cbz	w0, .L780
-.L712:
-.LBE1748:
-.LBE1747:
-	.loc 1 3025 0
+	.loc 1 2664 0
+	cbz	w0, .L773
+.L705:
+.LBE1737:
+.LBE1736:
+	.loc 1 2997 0
 	adrp	x1, .LC74
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC74
 	bl	_dev_err
-.LVL670:
-	.loc 1 3026 0
-	b	.L689
-.LVL671:
+.LVL651:
+	.loc 1 2998 0
+	b	.L682
+.LVL652:
 	.p2align 3
-.L703:
-	.loc 1 3007 0
+.L696:
+	.loc 1 2979 0
 	mov	w25, -22
-	.loc 1 3006 0
+	.loc 1 2978 0
 	adrp	x1, .LC80
 	mov	w2, w25
 	add	x1, x1, :lo12:.LC80
 	mov	x0, x22
 	bl	_dev_err
-.LVL672:
-	.loc 1 3007 0
-	b	.L689
-.LVL673:
+.LVL653:
+	.loc 1 2979 0
+	b	.L682
+.LVL654:
 	.p2align 3
-.L776:
-	.loc 1 2980 0
+.L769:
+	.loc 1 2952 0
 	adrp	x1, .LC31
 	mov	x0, x22
-.LVL674:
+.LVL655:
 	add	x1, x1, :lo12:.LC31
-	.loc 1 2981 0
+	.loc 1 2953 0
 	mov	w25, -19
-	.loc 1 2980 0
+	.loc 1 2952 0
 	bl	_dev_err
-.LVL675:
-	.loc 1 2981 0
-	b	.L689
-.LVL676:
+.LVL656:
+	.loc 1 2953 0
+	b	.L682
+.LVL657:
 	.p2align 3
-.L701:
-	.loc 1 2992 0
+.L694:
+	.loc 1 2964 0
 	adrp	x1, .LC33
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC33
-	.loc 1 2993 0
+	.loc 1 2965 0
 	mov	w25, -517
-	.loc 1 2992 0
+	.loc 1 2964 0
 	bl	_dev_err
-.LVL677:
-	.loc 1 2993 0
-	b	.L689
-.LVL678:
+.LVL658:
+	.loc 1 2965 0
+	b	.L682
+.LVL659:
 	.p2align 3
-.L779:
-.LBB1756:
-.LBB1742:
-	.loc 1 2739 0
+.L772:
+.LBB1745:
+.LBB1731:
+	.loc 1 2711 0
 	adrp	x1, .LC40
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC40
 	bl	_dev_err
-.LVL679:
-.L708:
-.LBE1742:
-.LBE1756:
-	.loc 1 3018 0
+.LVL660:
+.L701:
+.LBE1731:
+.LBE1745:
+	.loc 1 2990 0
 	adrp	x1, .LC73
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC73
 	bl	_dev_err
-.LVL680:
-	.loc 1 3019 0
-	b	.L689
-.LVL681:
-.L780:
-.LBB1757:
-.LBB1753:
-	.loc 1 2701 0
+.LVL661:
+	.loc 1 2991 0
+	b	.L682
+.LVL662:
+.L773:
+.LBB1746:
+.LBB1742:
+	.loc 1 2673 0
 	mov	x0, x26
 	mov	x3, 1
-.LBB1749:
-.LBB1750:
-	.loc 15 204 0
+.LBB1738:
+.LBB1739:
+	.loc 13 204 0
 	ldp	x1, x26, [x29, 104]
-.LVL682:
-.LBE1750:
-.LBE1749:
-	.loc 1 2698 0
+.LVL663:
+.LBE1739:
+.LBE1738:
+	.loc 1 2670 0
 	str	x1, [x19, 32]
-.LBB1752:
-.LBB1751:
-	.loc 15 204 0
+.LBB1741:
+.LBB1740:
+	.loc 13 204 0
 	add	x26, x26, 1
 	sub	x26, x26, x1
-.LBE1751:
-.LBE1752:
-	.loc 1 2699 0
+.LBE1740:
+.LBE1741:
+	.loc 1 2671 0
 	str	w26, [x19, 40]
-	.loc 1 2701 0
+	.loc 1 2673 0
 	sxtw	x2, w26
 	bl	devm_memremap
-.LVL683:
+.LVL664:
 	str	x0, [x19, 208]
-	.loc 1 2703 0
-	cbz	x0, .L781
-	.loc 1 2708 0
+	.loc 1 2675 0
+	cbz	x0, .L774
+	.loc 1 2680 0
 	bl	epd_lut_from_mem_init
-.LVL684:
-	.loc 1 2709 0
-	tbnz	w0, #31, .L782
-.L714:
-.LBE1753:
-.LBE1757:
-.LBB1758:
-.LBB1759:
-	.loc 1 2788 0
+.LVL665:
+	.loc 1 2681 0
+	tbnz	w0, #31, .L775
+.L707:
+.LBE1742:
+.LBE1746:
+.LBB1747:
+.LBB1748:
+	.loc 1 2760 0
 	add	x0, x20, 752
 	mov	x1, 68719476704
 	str	x1, [x19, 560]
-	.loc 1 2792 0
+	.loc 1 2764 0
 	add	x24, x24, :lo12:.LANCHOR0
-.LBB1760:
-.LBB1761:
-.LBB1762:
-.LBB1763:
-.LBB1764:
-	.loc 12 288 0
+.LBB1749:
+.LBB1750:
+.LBB1751:
+.LBB1752:
+.LBB1753:
+	.file 14 "./include/linux/compiler.h"
+	.loc 14 288 0
 	str	x0, [x20, 752]
-.LBE1764:
-.LBE1763:
-.LBE1762:
-.LBE1761:
-.LBE1760:
-	.loc 1 2789 0
-	adrp	x5, .LC75
-.LBB1766:
-.LBB1765:
-	.file 16 "./include/linux/list.h"
-	.loc 16 29 0
+.LBE1753:
+.LBE1752:
+.LBE1751:
+.LBE1750:
+.LBE1749:
+	.loc 1 2761 0
+	adrp	x5, .LC75
+.LBB1755:
+.LBB1754:
+	.file 15 "./include/linux/list.h"
+	.loc 15 29 0
 	str	x0, [x0, 8]
-.LBE1765:
-.LBE1766:
-	.loc 1 2788 0
+.LBE1754:
+.LBE1755:
+	.loc 1 2760 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x19, 584]
-	.loc 1 2789 0
+	.loc 1 2761 0
 	add	x5, x5, :lo12:.LC75
 	mov	w1, 14
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 1
 	movk	w1, 0xa, lsl 16
-	.loc 1 2786 0
+	.loc 1 2758 0
 	mov	w26, 99
-	.loc 1 2789 0
+	.loc 1 2761 0
 	adrp	x0, .LC76
-	.loc 1 2786 0
+	.loc 1 2758 0
 	str	w26, [x29, 104]
-	.loc 1 2789 0
+	.loc 1 2761 0
 	add	x0, x0, :lo12:.LC76
 	bl	__alloc_workqueue_key
-.LVL685:
+.LVL666:
 	str	x0, [x19, 608]
-	.loc 1 2792 0
+	.loc 1 2764 0
 	adrp	x3, .LC77
 	mov	w2, -1
 	add	x3, x3, :lo12:.LC77
@@ -8433,26 +8248,26 @@ ebc_probe:
 	adrp	x0, ebc_auto_tast_function
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
-.LVL686:
+.LVL667:
 	str	x0, [x24, 8]
-	.loc 1 2793 0
+	.loc 1 2765 0
 	cmn	x0, #4096
-	bhi	.L783
-	.loc 1 2797 0
+	bhi	.L776
+	.loc 1 2769 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
-.LVL687:
-	.loc 1 2798 0
+.LVL668:
+	.loc 1 2770 0
 	ldr	x2, [x24, 8]
-.LBB1767:
-.LBB1768:
-	.file 17 "./arch/arm64/include/asm/atomic_lse.h"
-	.loc 17 47 0
+.LBB1756:
+.LBB1757:
+	.file 16 "./arch/arm64/include/asm/atomic_lse.h"
+	.loc 16 47 0
 	mov	w0, 1
-.LVL688:
+.LVL669:
 	add	x1, x2, 48
-.LVL689:
+.LVL670:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -8480,49 +8295,49 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL690:
+.LVL671:
 #NO_APP
-.LBE1768:
-.LBE1767:
-.LBB1769:
-	.loc 1 2801 0
+.LBE1757:
+.LBE1756:
+.LBB1758:
+	.loc 1 2773 0
 	adrp	x3, .LC46
 	adrp	x0, ebc_thread
-.LVL691:
+.LVL672:
 	add	x3, x3, :lo12:.LC46
 	mov	w2, -1
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x19
-.LBE1769:
-	.loc 1 2800 0
+.LBE1758:
+	.loc 1 2772 0
 	str	w26, [x29, 104]
-.LBB1770:
-	.loc 1 2801 0
+.LBB1759:
+	.loc 1 2773 0
 	bl	kthread_create_on_node
-.LVL692:
+.LVL673:
 	mov	x24, x0
-.LVL693:
+.LVL674:
 	cmn	x0, #4096
-	bhi	.L716
+	bhi	.L709
 	bl	wake_up_process
-.LVL694:
-.LBE1770:
+.LVL675:
+.LBE1759:
 	str	x24, [x19, 136]
-	.loc 1 2806 0
+	.loc 1 2778 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x24
 	bl	sched_setscheduler_nocheck
-.LVL695:
-	.loc 1 2807 0
+.LVL676:
+	.loc 1 2779 0
 	ldr	x2, [x19, 136]
-.LBB1771:
-.LBB1772:
-	.loc 17 47 0
+.LBB1760:
+.LBB1761:
+	.loc 16 47 0
 	mov	w0, 1
-.LVL696:
+.LVL677:
 	add	x1, x2, 48
-.LVL697:
+.LVL678:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -8550,62 +8365,62 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL698:
+.LVL679:
 #NO_APP
-.LBE1772:
-.LBE1771:
-.LBE1759:
-.LBE1758:
-.LBB1775:
-.LBB1776:
-	.loc 1 2816 0
+.LBE1761:
+.LBE1760:
+.LBE1748:
+.LBE1747:
+.LBB1764:
+.LBB1765:
+	.loc 1 2788 0
 	mov	w0, -1
-.LVL699:
+.LVL680:
 	str	w0, [x19, 64]
-.LBB1777:
-.LBB1778:
+.LBB1766:
+.LBB1767:
 	.loc 4 39 0
 	add	x0, x20, 416
-.LVL700:
-.LBE1778:
-.LBE1777:
-	.loc 1 2820 0
+.LVL681:
+.LBE1767:
+.LBE1766:
+	.loc 1 2792 0
 	str	wzr, [x19, 44]
-	.loc 1 2819 0
+	.loc 1 2791 0
 	str	wzr, [x19, 96]
-.LBB1783:
-.LBB1779:
+.LBB1772:
+.LBB1768:
 	.loc 4 43 0
 	adrp	x1, .LC47
-.LBE1779:
-.LBE1783:
-	.loc 1 2815 0
+.LBE1768:
+.LBE1772:
+	.loc 1 2787 0
 	str	wzr, [x19, 200]
-.LBB1784:
-.LBB1780:
+.LBB1773:
+.LBB1769:
 	.loc 4 43 0
 	add	x1, x1, :lo12:.LC47
-.LBE1780:
-.LBE1784:
-	.loc 1 2817 0
+.LBE1769:
+.LBE1773:
+	.loc 1 2789 0
 	str	wzr, [x19, 616]
-	.loc 1 2827 0
+	.loc 1 2799 0
 	add	x24, x20, 632
-.LVL701:
-	.loc 1 2818 0
+.LVL682:
+	.loc 1 2790 0
 	str	wzr, [x19, 620]
-	.loc 1 2828 0
+	.loc 1 2800 0
 	adrp	x26, jiffies
-.LBB1785:
-.LBB1781:
+.LBB1774:
+.LBB1770:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0]
-.LBE1781:
-.LBE1785:
-	.loc 1 2828 0
+.LBE1770:
+.LBE1774:
+	.loc 1 2800 0
 	mov	x27, 268435455
-.LBB1786:
-.LBB1782:
+.LBB1775:
+.LBB1771:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0, 16]
 	stp	xzr, xzr, [x0, 32]
@@ -8623,12 +8438,12 @@ ebc_probe:
 	str	x1, [x20, 416]
 	.loc 4 45 0
 	bl	wakeup_source_add
-.LVL702:
-.LBE1782:
-.LBE1786:
-	.loc 1 2824 0
+.LVL683:
+.LBE1771:
+.LBE1775:
+	.loc 1 2796 0
 	str	wzr, [x19, 440]
-	.loc 1 2827 0
+	.loc 1 2799 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -8636,17 +8451,17 @@ ebc_probe:
 	adrp	x1, ebc_vdd_power_timeout
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
-.LVL703:
-	.loc 1 2828 0
+.LVL684:
+	.loc 1 2800 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
-	.loc 1 2831 0
+	.loc 1 2803 0
 	add	x24, x20, 688
-	.loc 1 2828 0
+	.loc 1 2800 0
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL704:
-	.loc 1 2831 0
+.LVL685:
+	.loc 1 2803 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -8654,615 +8469,612 @@ ebc_probe:
 	adrp	x1, ebc_frame_timeout
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
-.LVL705:
-	.loc 1 2832 0
+.LVL686:
+	.loc 1 2804 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL706:
-.LBE1776:
-.LBE1775:
-.LBB1787:
-.LBB1788:
-	.loc 1 2842 0
+.LVL687:
+.LBE1765:
+.LBE1764:
+.LBB1776:
+.LBB1777:
+	.loc 1 2814 0
 	adrp	x0, saved_command_line
 	adrp	x1, .LC48
-	.loc 1 2839 0
+	.loc 1 2811 0
 	stp	wzr, wzr, [x29, 100]
-.LVL707:
-	.loc 1 2842 0
+.LVL688:
+	.loc 1 2814 0
 	add	x1, x1, :lo12:.LC48
 	ldr	x24, [x0, #:lo12:saved_command_line]
 	mov	x0, x24
 	bl	strstr
-.LVL708:
-	.loc 1 2843 0
+.LVL689:
+	.loc 1 2815 0
 	adrp	x1, .LC49
-	.loc 1 2842 0
+	.loc 1 2814 0
 	mov	x26, x0
-.LVL709:
-	.loc 1 2843 0
+.LVL690:
+	.loc 1 2815 0
 	add	x1, x1, :lo12:.LC49
 	mov	x0, x24
 	bl	strstr
-.LVL710:
+.LVL691:
 	mov	x28, x0
-.LVL711:
-	.loc 1 2848 0
-	cbz	x26, .L717
-	.loc 1 2849 0
+.LVL692:
+	.loc 1 2820 0
+	cbz	x26, .L710
+	.loc 1 2821 0
 	add	x2, x29, 100
 	adrp	x1, .LC50
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC50
 	bl	sscanf
-.LVL712:
-	.loc 1 2850 0
+.LVL693:
+	.loc 1 2822 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
-	bls	.L784
-.L717:
-	.loc 1 2862 0
+	bls	.L777
+.L710:
+	.loc 1 2834 0
 	mov	w24, 0
-.LVL713:
+.LVL694:
 	mov	x27, 0
-.LVL714:
-	.loc 1 2846 0
+.LVL695:
+	.loc 1 2818 0
 	mov	x26, 0
-.LVL715:
-	.loc 1 2862 0
-	cbz	x28, .L737
-.LVL716:
-.L736:
-	.loc 1 2863 0
+.LVL696:
+	.loc 1 2834 0
+	cbz	x28, .L730
+.LVL697:
+.L729:
+	.loc 1 2835 0
 	add	x2, x29, 104
 	mov	x0, x28
 	adrp	x1, .LC53
 	add	x1, x1, :lo12:.LC53
 	bl	sscanf
-.LVL717:
-	.loc 1 2841 0
+.LVL698:
+	.loc 1 2813 0
 	mov	w28, 0
-.LVL718:
-	.loc 1 2864 0
+.LVL699:
+	.loc 1 2836 0
 	ldr	w2, [x29, 104]
-	.loc 1 2846 0
+	.loc 1 2818 0
 	mov	x26, 0
-.LVL719:
-	.loc 1 2864 0
+.LVL700:
+	.loc 1 2836 0
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
-	bls	.L785
-.L721:
-	.loc 1 2876 0
-	cbnz	w24, .L720
-.LVL720:
-.L737:
-	.loc 1 2877 0
+	bls	.L778
+.L714:
+	.loc 1 2848 0
+	cbnz	w24, .L713
+.LVL701:
+.L730:
+	.loc 1 2849 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC56
 	add	x1, x1, :lo12:.LC56
 	bl	_dev_info
-.LVL721:
-	.loc 1 2878 0
+.LVL702:
+	.loc 1 2850 0
 	ldr	x0, [x20, 16]
 	bl	ebc_pmic_verity_vcom
-.LVL722:
-.LBB1789:
-.LBB1790:
-	.loc 1 2187 0
+.LVL703:
+.LBB1778:
+.LBB1779:
+	.loc 1 2159 0
 	bl	ebc_empty_buf_get
-.LVL723:
+.LVL704:
 	mov	x24, x0
-.LVL724:
-	.loc 1 2188 0
+.LVL705:
+	.loc 1 2160 0
 	ldp	w2, w0, [x20, 108]
 	mov	w1, 255
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memset
-.LVL725:
-	.loc 1 2191 0
+.LVL706:
+	.loc 1 2163 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2189 0
+	.loc 1 2161 0
 	mov	w0, 17
 	str	w0, [x24, 40]
-	.loc 1 2194 0
+	.loc 1 2166 0
 	mov	w2, 16
-	.loc 1 2195 0
+	.loc 1 2167 0
 	mov	x0, x24
-	.loc 1 2192 0
+	.loc 1 2164 0
 	ldr	w1, [x20, 108]
 	str	w1, [x24, 56]
-	.loc 1 2193 0
+	.loc 1 2165 0
 	ldr	w1, [x20, 112]
-	.loc 1 2194 0
+	.loc 1 2166 0
 	stp	w1, w2, [x24, 60]
-	.loc 1 2195 0
+	.loc 1 2167 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL726:
-.L723:
-.LBE1790:
-.LBE1789:
-	.loc 1 2896 0
-	cbnz	w28, .L786
-.L725:
-	.loc 1 2910 0
+.LVL707:
+.L716:
+.LBE1779:
+.LBE1778:
+	.loc 1 2868 0
+	cbnz	w28, .L779
+.L718:
+	.loc 1 2882 0
 	ldr	w0, [x19, 96]
 	adrp	x21, .LANCHOR1
-	cbz	w0, .L787
-.L727:
-	.loc 1 2915 0
-	cbz	x27, .L728
-	.loc 1 2916 0
+	cbz	w0, .L780
+.L720:
+	.loc 1 2887 0
+	cbz	x27, .L721
+	.loc 1 2888 0
 	mov	x0, x27
 	bl	kfree
-.LVL727:
-.L728:
-	.loc 1 2917 0
-	cbz	x26, .L719
-	.loc 1 2918 0
+.LVL708:
+.L721:
+	.loc 1 2889 0
+	cbz	x26, .L712
+	.loc 1 2890 0
 	mov	x0, x26
 	bl	kfree
-.LVL728:
-.L719:
-.LBE1788:
-.LBE1787:
-.LBB1800:
-.LBB1801:
-.LBB1802:
+.LVL709:
+.L712:
+.LBE1777:
+.LBE1776:
+.LBB1789:
+.LBB1790:
+.LBB1791:
 	.loc 2 1186 0
 	str	x20, [x22, 184]
-.LBE1802:
-.LBE1801:
-.LBE1800:
-.LBB1803:
-.LBB1804:
-	.loc 1 2663 0
+.LBE1791:
+.LBE1790:
+.LBE1789:
+.LBB1792:
+.LBB1793:
+	.loc 1 2635 0
 	add	x21, x21, :lo12:.LANCHOR1
 	add	x0, x21, 224
-	.loc 1 2664 0
-	add	x22, x21, 512
-	.loc 1 2663 0
 	bl	misc_register
-.LVL729:
-	.loc 1 2664 0
-	add	x0, x21, 400
+.LVL710:
+	.loc 1 2636 0
+	add	x0, x21, 376
 	bl	misc_register
-.LVL730:
-	.loc 1 2666 0
+.LVL711:
+	.loc 1 2638 0
 	ldr	x0, [x20, 288]
-	add	x1, x21, 480
+	add	x1, x21, 456
 	bl	device_create_file
-.LVL731:
-	.loc 1 2667 0
+.LVL712:
+	.loc 1 2639 0
 	ldr	x0, [x20, 288]
-	mov	x1, x22
+	add	x1, x21, 488
 	bl	device_create_file
-.LVL732:
-	.loc 1 2668 0
+.LVL713:
+	.loc 1 2640 0
 	ldr	x0, [x20, 288]
-	add	x1, x21, 544
+	add	x1, x21, 520
 	bl	device_create_file
-.LVL733:
-	.loc 1 2669 0
+.LVL714:
+	.loc 1 2641 0
 	ldr	x0, [x20, 288]
-	add	x1, x21, 576
+	add	x1, x21, 552
 	bl	device_create_file
-.LVL734:
-	.loc 1 2670 0
+.LVL715:
+	.loc 1 2642 0
 	ldr	x0, [x20, 288]
-	add	x1, x21, 608
+	add	x1, x21, 584
 	bl	device_create_file
-.LVL735:
-	.loc 1 2671 0
+.LVL716:
+	.loc 1 2643 0
 	ldr	x0, [x20, 288]
-	add	x1, x21, 640
+	add	x1, x21, 616
 	bl	device_create_file
-.LVL736:
-	.loc 1 2672 0
+.LVL717:
+	.loc 1 2644 0
 	ldr	x0, [x20, 288]
-	add	x1, x21, 672
+	add	x1, x21, 648
 	bl	device_create_file
-.LVL737:
-.LBE1804:
-.LBE1803:
-	.loc 1 3047 0
+.LVL718:
+.LBE1793:
+.LBE1792:
+	.loc 1 3019 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LC16
 	adrp	x1, .LC57
 	add	x2, x2, :lo12:.LC16
 	add	x1, x1, :lo12:.LC57
 	bl	_dev_info
-.LVL738:
-	.loc 1 3049 0
-	b	.L689
-.LVL739:
-.L787:
-.LBB1805:
-.LBB1797:
-	.loc 1 2911 0
+.LVL719:
+	.loc 1 3021 0
+	b	.L682
+.LVL720:
+.L780:
+.LBB1794:
+.LBB1786:
+	.loc 1 2883 0
 	mov	w2, 1
 	str	w2, [x19, 96]
-	.loc 1 2912 0
+	.loc 1 2884 0
 	add	x0, x21, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL740:
-	b	.L727
-.LVL741:
-.L784:
-	.loc 1 2852 0
+.LVL721:
+	b	.L720
+.LVL722:
+.L777:
+	.loc 1 2824 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC51
 	add	x1, x1, :lo12:.LC51
 	bl	_dev_info
-.LVL742:
-	.loc 1 2853 0
+.LVL723:
+	.loc 1 2825 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
-.LBB1791:
-.LBB1792:
-.LBB1793:
-	.file 18 "./include/linux/slab.h"
-	.loc 18 553 0
+.LBB1780:
+.LBB1781:
+.LBB1782:
+	.file 17 "./include/linux/slab.h"
+	.loc 17 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL743:
+.LVL724:
 	mov	x27, x0
-.LVL744:
-.LBE1793:
-.LBE1792:
-.LBE1791:
-	.loc 1 2854 0
-	cbz	x0, .L788
-	.loc 1 2858 0
+.LVL725:
+.LBE1782:
+.LBE1781:
+.LBE1780:
+	.loc 1 2826 0
+	cbz	x0, .L781
+	.loc 1 2830 0
 	ldp	w2, w1, [x21, 84]
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 100]
-.LVL745:
+.LVL726:
 	sub	x1, x1, x3
-.LVL746:
+.LVL727:
 	ldr	x3, [x19, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL747:
-	.loc 1 2862 0
-	cbnz	x28, .L789
-	.loc 1 2841 0
+.LVL728:
+	.loc 1 2834 0
+	cbnz	x28, .L782
+	.loc 1 2813 0
 	mov	w28, 0
-.LVL748:
-	.loc 1 2846 0
+.LVL729:
+	.loc 1 2818 0
 	mov	x26, 0
-.LVL749:
-.L720:
-	.loc 1 2883 0
+.LVL730:
+.L713:
+	.loc 1 2855 0
 	bl	ebc_empty_buf_get
-.LVL750:
+.LVL731:
 	mov	x24, x0
-.LVL751:
-	.loc 1 2884 0
-	cbz	x0, .L723
-	.loc 1 2885 0
+.LVL732:
+	.loc 1 2856 0
+	cbz	x0, .L716
+	.loc 1 2857 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL752:
-	.loc 1 2888 0
+.LVL733:
+	.loc 1 2860 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2886 0
+	.loc 1 2858 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2891 0
+	.loc 1 2863 0
 	mov	w2, 16
-	.loc 1 2892 0
+	.loc 1 2864 0
 	mov	x0, x24
-	.loc 1 2889 0
+	.loc 1 2861 0
 	ldr	w1, [x21, 84]
 	str	w1, [x24, 56]
-	.loc 1 2890 0
+	.loc 1 2862 0
 	ldr	w1, [x21, 88]
-	.loc 1 2891 0
+	.loc 1 2863 0
 	stp	w1, w2, [x24, 60]
-	.loc 1 2892 0
+	.loc 1 2864 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL753:
-	b	.L723
-.LVL754:
-.L785:
-	.loc 1 2866 0
+.LVL734:
+	b	.L716
+.LVL735:
+.L778:
+	.loc 1 2838 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC54
 	add	x1, x1, :lo12:.LC54
 	bl	_dev_info
-.LVL755:
-	.loc 1 2867 0
+.LVL736:
+	.loc 1 2839 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
-.LBB1794:
-.LBB1795:
-.LBB1796:
-	.loc 18 553 0
+.LBB1783:
+.LBB1784:
+.LBB1785:
+	.loc 17 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL756:
+.LVL737:
 	mov	x26, x0
-.LBE1796:
-.LBE1795:
-.LBE1794:
-	.loc 1 2868 0
-	cbz	x0, .L790
-	.loc 1 2872 0
+.LBE1785:
+.LBE1784:
+.LBE1783:
+	.loc 1 2840 0
+	cbz	x0, .L783
+	.loc 1 2844 0
 	ldp	w2, w1, [x21, 84]
-	.loc 1 2865 0
+	.loc 1 2837 0
 	mov	w28, 1
-	.loc 1 2872 0
+	.loc 1 2844 0
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
-.LVL757:
+.LVL738:
 	sub	x1, x1, x3
-.LVL758:
+.LVL739:
 	ldr	x3, [x19, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL759:
-	b	.L721
-.LVL760:
-.L693:
-.LBE1797:
-.LBE1805:
-	.loc 1 2955 0
+.LVL740:
+	b	.L714
+.LVL741:
+.L686:
+.LBE1786:
+.LBE1794:
+	.loc 1 2927 0
 	mov	w25, -517
-	b	.L689
-.LVL761:
-.L786:
-.LBB1806:
-.LBB1798:
-	.loc 1 2897 0
+	b	.L682
+.LVL742:
+.L779:
+.LBB1795:
+.LBB1787:
+	.loc 1 2869 0
 	bl	ebc_empty_buf_get
-.LVL762:
+.LVL743:
 	mov	x24, x0
-.LVL763:
-	.loc 1 2898 0
-	cbz	x0, .L725
-	.loc 1 2899 0
+.LVL744:
+	.loc 1 2870 0
+	cbz	x0, .L718
+	.loc 1 2871 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL764:
-	.loc 1 2902 0
+.LVL745:
+	.loc 1 2874 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2900 0
+	.loc 1 2872 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2905 0
+	.loc 1 2877 0
 	mov	w1, 16
-	.loc 1 2903 0
+	.loc 1 2875 0
 	ldr	w0, [x21, 84]
 	str	w0, [x24, 56]
-	.loc 1 2904 0
+	.loc 1 2876 0
 	ldr	w0, [x21, 88]
-	.loc 1 2905 0
+	.loc 1 2877 0
 	stp	w0, w1, [x24, 60]
-	.loc 1 2906 0
+	.loc 1 2878 0
 	mov	x0, x24
 	bl	ebc_add_to_dsp_buf_list
-.LVL765:
-	b	.L725
-.LVL766:
-.L739:
-.LBE1798:
-.LBE1806:
-	.loc 1 2941 0
+.LVL746:
+	b	.L718
+.LVL747:
+.L732:
+.LBE1787:
+.LBE1795:
+	.loc 1 2913 0
 	mov	w25, -12
-	b	.L689
-.LVL767:
-.L694:
-	.loc 1 2965 0
+	b	.L682
+.LVL748:
+.L687:
+	.loc 1 2937 0
 	adrp	x1, .LC29
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC29
-	.loc 1 2966 0
+	.loc 1 2938 0
 	mov	w25, -22
-	.loc 1 2965 0
+	.loc 1 2937 0
 	bl	_dev_err
-.LVL768:
-	.loc 1 2966 0
-	b	.L689
-.LVL769:
-.L782:
-.LBB1807:
-.LBB1754:
-	.loc 1 2710 0
+.LVL749:
+	.loc 1 2938 0
+	b	.L682
+.LVL750:
+.L775:
+.LBB1796:
+.LBB1743:
+	.loc 1 2682 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC43
 	add	x1, x1, :lo12:.LC43
 	bl	_dev_err
-.LVL770:
-	.loc 1 2711 0
+.LVL751:
+	.loc 1 2683 0
 	ldr	x0, [x19, 104]
 	mov	w2, w26
 	ldr	x1, [x19, 208]
 	bl	epd_lut_from_file_init
-.LVL771:
-	.loc 1 2712 0
-	tbz	w0, #31, .L714
-	.loc 1 2713 0
+.LVL752:
+	.loc 1 2684 0
+	tbz	w0, #31, .L707
+	.loc 1 2685 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC44
-	.loc 1 2714 0
+	.loc 1 2686 0
 	mov	w25, -1
-	.loc 1 2713 0
+	.loc 1 2685 0
 	add	x1, x1, :lo12:.LC44
 	bl	_dev_err
-.LVL772:
-	b	.L712
-.LVL773:
+.LVL753:
+	b	.L705
+.LVL754:
 	.p2align 3
-.L711:
-.LBE1754:
-.LBE1807:
-.LBB1808:
-.LBB1743:
-	.loc 1 2749 0
-	mov	w25, -12
-	b	.L708
-.LVL774:
-.L783:
+.L704:
 .LBE1743:
-.LBE1808:
-.LBB1809:
-.LBB1773:
-	.loc 1 2794 0
+.LBE1796:
+.LBB1797:
+.LBB1732:
+	.loc 1 2721 0
+	mov	w25, -12
+	b	.L701
+.LVL755:
+.L776:
+.LBE1732:
+.LBE1797:
+.LBB1798:
+.LBB1762:
+	.loc 1 2766 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC45
 	add	x1, x1, :lo12:.LC45
 	bl	_dev_err
-.LVL775:
-.L715:
-.LBE1773:
-.LBE1809:
-	.loc 1 3032 0
+.LVL756:
+.L708:
+.LBE1762:
+.LBE1798:
+	.loc 1 3004 0
 	adrp	x1, .LC79
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC79
-	.loc 1 3033 0
-	mov	w25, -1
-	.loc 1 3032 0
-	bl	_dev_err
-.LVL776:
-	.loc 1 3033 0
-	b	.L689
-.LVL777:
-.L716:
-.LBB1810:
-.LBB1774:
-	.loc 1 2803 0
+	.loc 1 3005 0
+	mov	w25, -1
+	.loc 1 3004 0
+	bl	_dev_err
+.LVL757:
+	.loc 1 3005 0
+	b	.L682
+.LVL758:
+.L709:
+.LBB1799:
+.LBB1763:
+	.loc 1 2775 0
 	ldr	x0, [x19, 104]
-.LVL778:
+.LVL759:
 	adrp	x1, .LC78
-	.loc 1 2801 0
+	.loc 1 2773 0
 	str	x24, [x19, 136]
-	.loc 1 2803 0
+	.loc 1 2775 0
 	add	x1, x1, :lo12:.LC78
 	bl	_dev_err
-.LVL779:
-	b	.L715
-.LVL780:
-.L775:
-.LBE1774:
-.LBE1810:
-	.loc 1 2948 0
+.LVL760:
+	b	.L708
+.LVL761:
+.L768:
+.LBE1763:
+.LBE1799:
+	.loc 1 2920 0
 	adrp	x1, .LC27
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC27
-	.loc 1 2949 0
+	.loc 1 2921 0
 	mov	w25, -19
-	.loc 1 2948 0
+	.loc 1 2920 0
 	bl	_dev_err
-.LVL781:
-	.loc 1 2949 0
-	b	.L689
-.LVL782:
-.L740:
-.LBB1811:
-.LBB1744:
-	.loc 1 2734 0
+.LVL762:
+	.loc 1 2921 0
+	b	.L682
+.LVL763:
+.L733:
+.LBB1800:
+.LBB1733:
+	.loc 1 2706 0
 	mov	w25, -19
-	b	.L708
-.LVL783:
-.L741:
-.LBE1744:
-.LBE1811:
-.LBB1812:
-.LBB1755:
-	.loc 1 2688 0
+	b	.L701
+.LVL764:
+.L734:
+.LBE1733:
+.LBE1800:
+.LBB1801:
+.LBB1744:
+	.loc 1 2660 0
 	mov	w25, -19
-	b	.L712
-.LVL784:
-.L781:
-	.loc 1 2704 0
+	b	.L705
+.LVL765:
+.L774:
+	.loc 1 2676 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
 	adrp	x1, .LC42
-	mov	w3, 2704
+	mov	w3, 2676
 	add	x2, x2, 32
 	add	x1, x1, :lo12:.LC42
-	.loc 1 2705 0
+	.loc 1 2677 0
 	mov	w25, -12
-	.loc 1 2704 0
+	.loc 1 2676 0
 	bl	_dev_err
-.LVL785:
-	b	.L712
-.LVL786:
-.L789:
-.LBE1755:
-.LBE1812:
-.LBB1813:
-.LBB1799:
-	.loc 1 2851 0
+.LVL766:
+	b	.L705
+.LVL767:
+.L782:
+.LBE1744:
+.LBE1801:
+.LBB1802:
+.LBB1788:
+	.loc 1 2823 0
 	mov	w24, 1
-.LVL787:
-	b	.L736
-.LVL788:
-.L788:
-	.loc 1 2855 0
+.LVL768:
+	b	.L729
+.LVL769:
+.L781:
+	.loc 1 2827 0
 	ldr	x0, [x19, 104]
-.LVL789:
+.LVL770:
 	adrp	x1, .LC52
 	adrp	x21, .LANCHOR1
 	add	x1, x1, :lo12:.LC52
 	bl	_dev_err
-.LVL790:
-	b	.L719
-.LVL791:
-.L790:
-	.loc 1 2869 0
+.LVL771:
+	b	.L712
+.LVL772:
+.L783:
+	.loc 1 2841 0
 	ldr	x0, [x19, 104]
-.LVL792:
+.LVL773:
 	adrp	x1, .LC55
 	adrp	x21, .LANCHOR1
 	add	x1, x1, :lo12:.LC55
 	bl	_dev_err
-.LVL793:
-	b	.L719
-.LVL794:
-.L778:
-.LBE1799:
-.LBE1813:
-	.loc 1 3050 0
+.LVL774:
+	b	.L712
+.LVL775:
+.L771:
+.LBE1788:
+.LBE1802:
+	.loc 1 3022 0
 	bl	__stack_chk_fail
-.LVL795:
+.LVL776:
 	.cfi_endproc
-.LFE2860:
+.LFE2861:
 	.size	ebc_probe, .-ebc_probe
 	.align	2
 	.p2align 3,,7
-	.type	ebc_power_set.constprop.16, %function
-ebc_power_set.constprop.16:
-.LFB2884:
+	.type	ebc_power_set.constprop.17, %function
+ebc_power_set.constprop.17:
+.LFB2886:
 	.loc 1 183 0
 	.cfi_startproc
-.LVL796:
+.LVL777:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -9278,45 +9090,45 @@ ebc_power_set.constprop.16:
 	mov	x19, x0
 	.loc 1 189 0
 	ldr	w0, [x20, 440]
-.LVL797:
-	cbz	w0, .L794
-.L792:
+.LVL778:
+	cbz	w0, .L787
+.L785:
 	.loc 1 193 0
 	mov	w1, 1
 	str	w1, [x20, 200]
 	.loc 1 194 0
 	ldr	x2, [x19, 16]
-.LBB1814:
-.LBB1815:
+.LBB1803:
+.LBB1804:
 	.loc 3 30 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL798:
-.LBE1815:
-.LBE1814:
+.LVL779:
+.LBE1804:
+.LBE1803:
 	.loc 1 195 0
 	ldr	x2, [x19, 8]
-.LBB1816:
-.LBB1817:
+.LBB1805:
+.LBB1806:
 	.loc 11 46 0
 	add	x1, x19, 24
 	mov	x0, x2
 	ldr	x2, [x2, 48]
 	blr	x2
-.LVL799:
-.LBE1817:
-.LBE1816:
+.LVL780:
+.LBE1806:
+.LBE1805:
 	.loc 1 196 0
 	ldr	x0, [x19]
 	adrp	x1, .LC81
 	add	x1, x1, :lo12:.LC81
 	bl	_dev_info
-.LVL800:
+.LVL781:
 	.loc 1 211 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
-.LVL801:
+.LVL782:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -9325,63 +9137,63 @@ ebc_power_set.constprop.16:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL802:
+.LVL783:
 	.p2align 3
-.L794:
+.L787:
 	.cfi_restore_state
 	.loc 1 190 0
 	mov	w0, 1
 	str	w0, [x20, 440]
-.LBB1818:
-.LBB1819:
+.LBB1807:
+.LBB1808:
 	.loc 4 58 0
 	add	x0, x19, 416
 	bl	__pm_stay_awake
-.LVL803:
-	b	.L792
-.LBE1819:
-.LBE1818:
+.LVL784:
+	b	.L785
+.LBE1808:
+.LBE1807:
 	.cfi_endproc
-.LFE2884:
-	.size	ebc_power_set.constprop.16, .-ebc_power_set.constprop.16
+.LFE2886:
+	.size	ebc_power_set.constprop.17, .-ebc_power_set.constprop.17
 	.align	2
 	.p2align 3,,7
 	.type	ebc_open, %function
 ebc_open:
-.LFB2883:
+.LFB2885:
 	.cfi_startproc
 	mov	w0, 0
 	str	xzr, [x1, 104]
 	ret
 	.cfi_endproc
-.LFE2883:
+.LFE2885:
 	.size	ebc_open, .-ebc_open
 	.align	2
 	.p2align 3,,7
 	.global	refresh_new_image2
 	.type	refresh_new_image2, %function
 refresh_new_image2:
-.LFB2809:
+.LFB2810:
 	.loc 1 216 0
 	.cfi_startproc
-.LVL804:
+.LVL785:
 	.loc 1 223 0
 	ldp	w16, w5, [x4, 68]
-.LVL805:
+.LVL786:
 	cmp	w5, 0
 	add	w11, w5, 7
 	csel	w11, w11, w5, lt
-.LVL806:
+.LVL787:
 	.loc 1 225 0
 	cmp	w16, 0
 	.loc 1 223 0
 	asr	w11, w11, 3
-.LVL807:
+.LVL788:
 	.loc 1 225 0
-	ble	.L796
+	ble	.L789
 	sub	w14, w11, #1
 	mov	w15, 0
-.LVL808:
+.LVL789:
 	add	x14, x14, 1
 	.loc 1 270 0
 	mov	w13, 234881024
@@ -9389,92 +9201,92 @@ refresh_new_image2:
 	lsl	x14, x14, 2
 	.loc 1 276 0
 	mov	w12, -536870912
-.LVL809:
+.LVL790:
 	.p2align 2
-.L798:
+.L791:
 	.loc 1 226 0 discriminator 1
 	mov	x6, 0
 	cmp	w11, 0
-	bgt	.L819
-	b	.L816
-.LVL810:
+	bgt	.L812
+	b	.L809
+.LVL791:
 	.p2align 3
-.L799:
+.L792:
 	.loc 1 239 0
 	tst	x5, 65280
-	bne	.L800
+	bne	.L793
 	.loc 1 240 0
 	and	w10, w4, 240
 	cmp	w10, 224
-	beq	.L821
+	beq	.L814
 	.loc 1 243 0
 	orr	w7, w7, 240
-.L800:
+.L793:
 	.loc 1 245 0
 	tst	x5, 16711680
-	bne	.L802
+	bne	.L795
 	.loc 1 246 0
 	and	w10, w4, 3840
 	cmp	w10, 3584
-	beq	.L822
+	beq	.L815
 	.loc 1 249 0
 	orr	w7, w7, 3840
-.L802:
+.L795:
 	.loc 1 251 0
 	tst	x5, 4278190080
-	bne	.L804
+	bne	.L797
 	.loc 1 252 0
 	and	w10, w4, 61440
 	cmp	w10, 57344
-	beq	.L823
+	beq	.L816
 	.loc 1 255 0
 	orr	w7, w7, 61440
-.L804:
+.L797:
 	.loc 1 257 0
 	tst	x5, 1095216660480
-	bne	.L806
+	bne	.L799
 	.loc 1 258 0
 	and	w10, w4, 983040
 	cmp	w10, 917504
-	beq	.L824
+	beq	.L817
 	.loc 1 261 0
 	orr	w7, w7, 983040
-.L806:
+.L799:
 	.loc 1 263 0
 	tst	x5, 280375465082880
-	bne	.L808
+	bne	.L801
 	.loc 1 264 0
 	and	w10, w4, 15728640
 	cmp	w10, 14680064
-	beq	.L825
+	beq	.L818
 	.loc 1 267 0
 	orr	w7, w7, 15728640
-.L808:
+.L801:
 	.loc 1 269 0
 	tst	x5, 71776119061217280
-	bne	.L810
+	bne	.L803
 	.loc 1 270 0
 	and	w10, w4, 251658240
 	cmp	w10, w13
-	beq	.L826
+	beq	.L819
 	.loc 1 273 0
 	orr	w7, w7, 251658240
-.L810:
+.L803:
 	.loc 1 275 0
 	tst	x5, -72057594037927936
-	bne	.L812
+	bne	.L805
 	.loc 1 276 0
 	and	w5, w4, -268435456
-.LVL811:
+.LVL792:
 	cmp	w5, w12
-	beq	.L827
+	beq	.L820
 	.loc 1 279 0
 	orr	w7, w7, -268435456
-.LVL812:
-.L812:
+.LVL793:
+.L805:
 	.loc 1 283 0 discriminator 2
 	and	w4, w4, w9
-.LVL813:
+.LVL794:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
@@ -9483,54 +9295,54 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 226 0 discriminator 2
 	cmp	w11, w6
-	ble	.L828
-.LVL814:
-.L819:
+	ble	.L821
+.LVL795:
+.L812:
 	.loc 1 227 0
 	ldr	x5, [x3, x6, lsl 3]
 	.loc 1 231 0
 	mov	w7, 0
 	.loc 1 228 0
 	ldr	w4, [x1, x6, lsl 2]
-.LVL815:
+.LVL796:
 	.loc 1 229 0
 	ldr	w8, [x0, x6, lsl 2]
 	.loc 1 233 0
 	and	x10, x5, 255
 	.loc 1 230 0
 	ldr	w9, [x2, x6, lsl 2]
-.LVL816:
+.LVL797:
 	.loc 1 233 0
-	cbnz	x10, .L799
-.LVL817:
+	cbnz	x10, .L792
+.LVL798:
 	.loc 1 234 0
 	and	w10, w4, 15
 	.loc 1 237 0
 	mov	w7, 15
 	.loc 1 234 0
 	cmp	w10, 14
-	bne	.L799
+	bne	.L792
 	.loc 1 235 0
 	orr	w8, w8, w7
-.LVL818:
+.LVL799:
 	.loc 1 231 0
 	mov	w7, 0
-.LVL819:
-	b	.L799
+.LVL800:
+	b	.L792
 	.p2align 3
-.L826:
+.L819:
 	.loc 1 271 0
 	orr	w8, w8, 251658240
-	b	.L810
-.LVL820:
+	b	.L803
+.LVL801:
 	.p2align 3
-.L827:
+.L820:
 	.loc 1 277 0
 	orr	w8, w8, -268435456
-.LVL821:
+.LVL802:
 	.loc 1 283 0
 	and	w4, w4, w9
-.LVL822:
+.LVL803:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
@@ -9539,105 +9351,105 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 226 0
 	cmp	w11, w6
-	bgt	.L819
-.LVL823:
+	bgt	.L812
+.LVL804:
 	.p2align 2
-.L828:
+.L821:
 	add	x3, x3, x17
 	add	x1, x1, x14
 	add	x2, x2, x14
 	add	x0, x0, x14
-.LVL824:
-.L816:
+.LVL805:
+.L809:
 	.loc 1 225 0 discriminator 2
 	add	w15, w15, 1
 	cmp	w16, w15
-	bne	.L798
-.L796:
+	bne	.L791
+.L789:
 	ret
-.LVL825:
+.LVL806:
 	.p2align 3
-.L822:
+.L815:
 	.loc 1 247 0
 	orr	w8, w8, 3840
-	b	.L802
+	b	.L795
 	.p2align 3
-.L823:
+.L816:
 	.loc 1 253 0
 	orr	w8, w8, 61440
-	b	.L804
+	b	.L797
 	.p2align 3
-.L824:
+.L817:
 	.loc 1 259 0
 	orr	w8, w8, 983040
-	b	.L806
+	b	.L799
 	.p2align 3
-.L825:
+.L818:
 	.loc 1 265 0
 	orr	w8, w8, 15728640
-	b	.L808
+	b	.L801
 	.p2align 3
-.L821:
+.L814:
 	.loc 1 241 0
 	orr	w8, w8, 240
-	b	.L800
+	b	.L793
 	.cfi_endproc
-.LFE2809:
+.LFE2810:
 	.size	refresh_new_image2, .-refresh_new_image2
 	.align	2
 	.p2align 3,,7
 	.global	refresh_new_image_auto
 	.type	refresh_new_image_auto, %function
 refresh_new_image_auto:
-.LFB2810:
+.LFB2811:
 	.loc 1 291 0
 	.cfi_startproc
-.LVL826:
+.LVL807:
 	.loc 1 298 0
 	ldp	w13, w4, [x3, 68]
 	cmp	w4, 0
 	add	w9, w4, 7
 	csel	w9, w9, w4, lt
-.LVL827:
+.LVL808:
 	.loc 1 300 0
 	cmp	w13, 0
 	.loc 1 298 0
 	asr	w9, w9, 3
-.LVL828:
+.LVL809:
 	.loc 1 300 0
-	ble	.L829
+	ble	.L822
 	sub	w12, w9, #1
 	mov	w11, 0
-.LVL829:
+.LVL810:
 	add	x12, x12, 1
 	.loc 1 308 0
 	mov	w10, 15
 	lsl	x14, x12, 3
 	lsl	x12, x12, 2
 	.p2align 2
-.L831:
+.L824:
 	.loc 1 301 0 discriminator 1
 	mov	x6, 0
 	cmp	w9, 0
-	ble	.L842
+	ble	.L835
 	.p2align 2
-.L844:
+.L837:
 	.loc 1 302 0
 	ldr	x4, [x2, x6, lsl 3]
-.LVL830:
+.LVL811:
 	.loc 1 304 0
 	ldr	w7, [x0, x6, lsl 2]
 	.loc 1 303 0
 	ldr	w3, [x1, x6, lsl 2]
-.LVL831:
+.LVL812:
 	.loc 1 307 0
 	and	x5, x4, 255
 	.loc 1 308 0
 	cmp	x5, 0
-.LVL832:
+.LVL813:
 	eor	w5, w3, w7
 	csel	w3, wzr, w10, ne
-.LVL833:
+.LVL814:
 	.loc 1 311 0
 	orr	w8, w3, 240
 	tst	x4, 65280
@@ -9665,10 +9477,10 @@ refresh_new_image_auto:
 	.loc 1 329 0
 	tst	x4, -72057594037927936
 	orr	w4, w3, -268435456
-.LVL834:
+.LVL815:
 	csel	w3, w4, w3, eq
 	and	w3, w5, w3
-.LVL835:
+.LVL816:
 	.loc 1 332 0
 	eor	w3, w3, w7
 	.loc 1 333 0
@@ -9676,30 +9488,30 @@ refresh_new_image_auto:
 	add	x6, x6, 1
 	.loc 1 301 0
 	cmp	w9, w6
-	bgt	.L844
+	bgt	.L837
 	add	x2, x2, x14
 	add	x1, x1, x12
 	add	x0, x0, x12
-.LVL836:
-.L842:
+.LVL817:
+.L835:
 	.loc 1 300 0 discriminator 2
 	add	w11, w11, 1
 	cmp	w13, w11
-	bne	.L831
-.L829:
+	bne	.L824
+.L822:
 	ret
 	.cfi_endproc
-.LFE2810:
+.LFE2811:
 	.size	refresh_new_image_auto, .-refresh_new_image_auto
 	.align	2
 	.p2align 3,,7
 	.global	new_buffer_refresh
 	.type	new_buffer_refresh, %function
 new_buffer_refresh:
-.LFB2811:
+.LFB2812:
 	.loc 1 339 0
 	.cfi_startproc
-.LVL837:
+.LVL818:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -9716,16 +9528,16 @@ new_buffer_refresh:
 	adrp	x20, .LANCHOR1
 	.loc 1 340 0
 	ldr	x19, [x1, #:lo12:.LANCHOR0]
-.LVL838:
+.LVL819:
 	.loc 1 343 0
 	add	x0, x20, :lo12:.LANCHOR1
-.LVL839:
-	add	x0, x0, 704
+.LVL820:
+	add	x0, x0, 680
 	bl	down_write
-.LVL840:
+.LVL821:
 	.loc 1 341 0
 	add	x19, x19, 184
-.LVL841:
+.LVL822:
 	.loc 1 344 0
 	ldr	x0, [x19, 224]
 	ldr	w5, [x0, 40]
@@ -9734,22 +9546,22 @@ new_buffer_refresh:
 	.loc 1 346 0
 	cmp	w5, 0
 	ccmp	w1, 1, 0, ne
-	bls	.L850
+	bls	.L843
 	.loc 1 352 0
 	ldr	x1, [x0, 16]
 	mov	x4, x19
 	ldp	x2, x3, [x19, 160]
 	ldr	x0, [x19, 144]
 	bl	refresh_new_image2
-.LVL842:
+.LVL823:
 	.loc 1 357 0
 	add	x0, x20, :lo12:.LANCHOR1
-	add	x0, x0, 704
+	add	x0, x0, 680
 	bl	up_write
-.LVL843:
+.LVL824:
 	.loc 1 358 0
 	ldp	x19, x20, [sp, 16]
-.LVL844:
+.LVL825:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -9758,9 +9570,9 @@ new_buffer_refresh:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL845:
+.LVL826:
 	.p2align 3
-.L850:
+.L843:
 	.cfi_restore_state
 	.loc 1 347 0
 	ldr	x1, [x0, 16]
@@ -9768,15 +9580,15 @@ new_buffer_refresh:
 	ldr	x2, [x19, 168]
 	ldr	x0, [x19, 144]
 	bl	refresh_new_image_auto
-.LVL846:
+.LVL827:
 	.loc 1 357 0
 	add	x0, x20, :lo12:.LANCHOR1
-	add	x0, x0, 704
+	add	x0, x0, 680
 	bl	up_write
-.LVL847:
+.LVL828:
 	.loc 1 358 0
 	ldp	x19, x20, [sp, 16]
-.LVL848:
+.LVL829:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -9785,16 +9597,290 @@ new_buffer_refresh:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2811:
+.LFE2812:
 	.size	new_buffer_refresh, .-new_buffer_refresh
 	.align	2
 	.p2align 3,,7
+	.type	ebc_auto_tast_function, %function
+ebc_auto_tast_function:
+.LFB2831:
+	.loc 1 1514 0
+	.cfi_startproc
+.LVL830:
+	stp	x29, x30, [sp, -96]!
+	.cfi_def_cfa_offset 96
+	.cfi_offset 29, -96
+	.cfi_offset 30, -88
+	.loc 1 1515 0
+	adrp	x1, .LANCHOR0
+	.loc 1 1514 0
+	adrp	x0, __stack_chk_guard
+.LVL831:
+	add	x0, x0, :lo12:__stack_chk_guard
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -80
+	.cfi_offset 20, -72
+	adrp	x20, .LANCHOR1
+	stp	x21, x22, [sp, 32]
+	.loc 1 1520 0
+	add	x20, x20, :lo12:.LANCHOR1
+	.cfi_offset 21, -64
+	.cfi_offset 22, -56
+	.loc 1 1515 0
+	ldr	x22, [x1, #:lo12:.LANCHOR0]
+.LVL832:
+	.loc 1 1520 0
+	add	x20, x20, 728
+	.loc 1 1514 0
+	stp	x23, x24, [sp, 48]
+	.cfi_offset 23, -48
+	.cfi_offset 24, -40
+.LBB1809:
+.LBB1810:
+.LBB1811:
+	.loc 14 288 0
+	mov	x24, 2
+.LBE1811:
+.LBE1810:
+.LBE1809:
+	.loc 1 1514 0
+	stp	x25, x26, [sp, 64]
+	.cfi_offset 25, -32
+	.cfi_offset 26, -24
+	.loc 1 1516 0
+	add	x21, x22, 24
+	adrp	x26, .LC82
+	.loc 1 1517 0
+	add	x19, x22, 184
+	.loc 1 1514 0
+	ldr	x1, [x0]
+	str	x1, [x29, 88]
+	mov	x1,0
+	add	x25, x22, 744
+	.loc 1 1580 0
+	add	x26, x26, :lo12:.LC82
+.LBB1816:
+.LBB1813:
+.LBB1814:
+	.loc 5 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x23, sp_el0
+// 0 "" 2
+.LVL833:
+#NO_APP
+	b	.L856
+	.p2align 3
+.L853:
+.LBE1814:
+.LBE1813:
+.LBE1816:
+	.loc 1 1600 0
+	mov	x0, x20
+	bl	up
+.LVL834:
+	.loc 1 1601 0
+	bl	schedule
+.LVL835:
+.L856:
+	.loc 1 1520 0
+	mov	x0, x20
+	bl	down
+.LVL836:
+.LBB1817:
+.LBB1815:
+.LBB1812:
+	.loc 14 288 0
+	str	x24, [x23, 32]
+.LBE1812:
+.LBE1815:
+.LBE1817:
+	.loc 1 1524 0
+#APP
+// 1524 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
+	dmb ish
+// 0 "" 2
+	.loc 1 1525 0
+#NO_APP
+	ldr	x0, [x19, 224]
+	ldr	w0, [x0, 40]
+	cmp	w0, 16
+	bgt	.L846
+	cmp	w0, 7
+	bge	.L847
+	cbz	w0, .L848
+	cmp	w0, 1
+	bne	.L845
+	.loc 1 1527 0
+	ldr	w1, [x22, 208]
+	mov	x0, x21
+	bl	flip.isra.11
+.LVL837:
+	.loc 1 1528 0
+	ldrsw	x0, [x21, 72]
+	mov	x4, x19
+	ldp	x1, x2, [x19, 144]
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 168]
+	ldr	x0, [x0, 184]
+	bl	get_overlay_image
+.LVL838:
+.L850:
+	.loc 1 1575 0
+	ldr	x0, [x19, 224]
+	.loc 1 1576 0
+	ldr	w0, [x0, 40]
+	sub	w1, w0, #22
+	.loc 1 1578 0
+	cmp	w1, 1
+	ccmp	w0, 1, 0, hi
+	bhi	.L853
+	.loc 1 1579 0
+	ldr	w0, [x19, 52]
+	cbz	w0, .L868
+.LBB1818:
+.LBB1819:
+	.file 18 "./include/linux/workqueue.h"
+	.loc 18 518 0
+	ldr	x1, [x19, 608]
+	mov	x2, x25
+	mov	w0, 8
+	bl	queue_work_on
+.LVL839:
+	b	.L853
+	.p2align 3
+.L845:
+.LBE1819:
+.LBE1818:
+	.loc 1 1564 0
+	ldr	w1, [x19, 56]
+	.loc 1 1565 0
+	mov	x0, x21
+	.loc 1 1564 0
+	sub	w1, w1, #1
+	str	w1, [x19, 56]
+	.loc 1 1565 0
+	ldr	w1, [x22, 208]
+	bl	flip.isra.11
+.LVL840:
+	.loc 1 1566 0
+	ldr	w0, [x19, 56]
+	cbz	w0, .L850
+	.loc 1 1568 0
+	ldrsw	x0, [x21, 72]
+	mov	x3, x19
+	.loc 1 1569 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1568 0
+	add	x0, x19, x0, lsl 3
+	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 184]
+	ldr	x2, [x2, 16]
+	bl	direct_mode_data_change
+.LVL841:
+	b	.L850
+	.p2align 3
+.L847:
+	.loc 1 1554 0
+	ldr	w1, [x19, 56]
+	.loc 1 1555 0
+	mov	x0, x21
+	.loc 1 1554 0
+	sub	w1, w1, #1
+	str	w1, [x19, 56]
+	.loc 1 1555 0
+	ldr	w1, [x22, 208]
+	bl	flip.isra.11
+.LVL842:
+	.loc 1 1556 0
+	ldr	w0, [x19, 56]
+	cbz	w0, .L850
+	.loc 1 1558 0
+	ldrsw	x0, [x21, 72]
+	mov	x3, x19
+	.loc 1 1559 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1558 0
+	add	x0, x19, x0, lsl 3
+	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 184]
+	ldr	x2, [x2, 16]
+	bl	direct_mode_data_change_part
+.LVL843:
+	.loc 1 1562 0
+	b	.L850
+	.p2align 3
+.L846:
+	.loc 1 1525 0
+	sub	w0, w0, #22
+	cmp	w0, 1
+	bhi	.L845
+.L848:
+	.loc 1 1537 0
+	ldr	w1, [x22, 208]
+	mov	x0, x21
+	bl	flip.isra.11
+.LVL844:
+	.loc 1 1538 0
+	ldrsw	x0, [x21, 72]
+	mov	x4, x19
+	ldp	x1, x2, [x19, 144]
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 168]
+	ldr	x0, [x0, 184]
+	bl	get_auto_image
+.LVL845:
+	.loc 1 1543 0
+	b	.L850
+.L868:
+	.loc 1 1580 0
+	mov	x0, x26
+	bl	printk
+.LVL846:
+	.loc 1 1581 0
+	mov	x0, x25
+	bl	new_buffer_refresh
+.LVL847:
+	.loc 1 1582 0
+	ldr	x0, [x19, 224]
+	ldr	w0, [x0, 40]
+	cmp	w0, 1
+	.loc 1 1583 0
+	ldrsw	x0, [x21, 72]
+	.loc 1 1582 0
+	beq	.L869
+	.loc 1 1589 0
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 168]
+	ldp	x1, x2, [x19, 144]
+	mov	x4, x19
+	ldr	x0, [x0, 184]
+	bl	get_auto_image
+.LVL848:
+	b	.L853
+.L869:
+	.loc 1 1583 0
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 168]
+	ldp	x1, x2, [x19, 144]
+	mov	x4, x19
+	ldr	x0, [x0, 184]
+	bl	get_overlay_image
+.LVL849:
+	b	.L853
+	.cfi_endproc
+.LFE2831:
+	.size	ebc_auto_tast_function, .-ebc_auto_tast_function
+	.align	2
+	.p2align 3,,7
 	.type	ebc_thread, %function
 ebc_thread:
-.LFB2836:
-	.loc 1 1845 0
+.LFB2837:
+	.loc 1 1819 0
 	.cfi_startproc
-.LVL849:
+.LVL850:
 	stp	x29, x30, [sp, -240]!
 	.cfi_def_cfa_offset 240
 	.cfi_offset 29, -240
@@ -9804,21 +9890,21 @@ ebc_thread:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -208
 	.cfi_offset 22, -200
-	.loc 1 1846 0
+	.loc 1 1820 0
 	adrp	x21, .LANCHOR0
-	.loc 1 1845 0
+	.loc 1 1819 0
 	stp	x19, x20, [sp, 16]
 	adrp	x22, .LANCHOR1
 	stp	x23, x24, [sp, 48]
 .LBB1848:
 .LBB1849:
 .LBB1850:
-	.loc 1 2175 0
+	.loc 1 2147 0
 	add	x22, x22, :lo12:.LANCHOR1
 .LBE1850:
 .LBE1849:
 .LBE1848:
-	.loc 1 1845 0
+	.loc 1 1819 0
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 19, -224
 	.cfi_offset 20, -216
@@ -9830,161 +9916,161 @@ ebc_thread:
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -176
 	.cfi_offset 26, -168
-	.loc 1 1845 0
+	.loc 1 1819 0
 	add	x0, x23, :lo12:__stack_chk_guard
-.LVL850:
-	.loc 1 1846 0
-	ldr	x20, [x21, #:lo12:.LANCHOR0]
 .LVL851:
+	.loc 1 1820 0
+	ldr	x20, [x21, #:lo12:.LANCHOR0]
+.LVL852:
 .LBB1855:
 .LBB1853:
 .LBB1851:
-	.loc 1 2175 0
+	.loc 1 2147 0
 	add	x19, x22, 304
 .LBE1851:
 .LBE1853:
 .LBE1855:
-	.loc 1 1845 0
+	.loc 1 1819 0
 	ldr	x1, [x0]
 	str	x1, [x29, 232]
 	mov	x1,0
-	.loc 1 1850 0
+	.loc 1 1824 0
 	str	wzr, [x29, 108]
-	.loc 1 1847 0
+	.loc 1 1821 0
 	add	x28, x20, 184
-.LVL852:
+.LVL853:
 	.p2align 2
-.L852:
-	.loc 1 1855 0
+.L871:
+	.loc 1 1829 0
 	ldr	w0, [x28, 624]
-.LVL853:
-	cbnz	w0, .L1011
-.L853:
-	.loc 1 1861 0
-	bl	ebc_dsp_buf_get
 .LVL854:
+	cbnz	w0, .L1030
+.L872:
+	.loc 1 1835 0
+	bl	ebc_dsp_buf_get
+.LVL855:
 	mov	x24, x0
-	.loc 1 1863 0
-	cbz	x0, .L855
-	.loc 1 1863 0 is_stmt 0 discriminator 1
+	.loc 1 1837 0
+	cbz	x0, .L874
+	.loc 1 1837 0 is_stmt 0 discriminator 1
 	ldr	x0, [x0, 8]
-	cbz	x0, .L855
-	.loc 1 1865 0 is_stmt 1
+	cbz	x0, .L874
+	.loc 1 1839 0 is_stmt 1
 	add	x0, x21, :lo12:.LANCHOR0
 	ldr	w1, [x0, 16]
-	cbz	w1, .L856
-	.loc 1 1866 0
+	cbz	w1, .L875
+	.loc 1 1840 0
 	ldr	w1, [x0, 20]
 	add	w2, w1, 1
 	str	w2, [x0, 20]
 	cmp	w1, 5
-	ble	.L857
-	.loc 1 1867 0
+	ble	.L876
+	.loc 1 1841 0
 	str	wzr, [x0, 16]
-.L857:
-	.loc 1 1868 0
+.L876:
+	.loc 1 1842 0
 	ldr	w2, [x20, 204]
 	ldr	w1, [x24, 64]
 	ldr	x0, [x24, 16]
-	bl	check_black_percent.isra.14
-.LVL855:
-	cbnz	w0, .L1002
-.L856:
-	.loc 1 1876 0
+	bl	check_black_percent.isra.15
+.LVL856:
+	cbnz	w0, .L1022
+.L875:
+	.loc 1 1850 0
 	ldr	w0, [x24, 40]
 	cmp	w0, 20
-	beq	.L1012
-	.loc 1 1880 0
+	beq	.L1031
+	.loc 1 1854 0
 	ldr	x1, [x28, 616]
-	cbz	x1, .L861
-	.loc 1 1881 0
+	cbz	x1, .L880
+	.loc 1 1855 0
 	cmp	w0, 19
-	beq	.L1013
-	.loc 1 1890 0
+	beq	.L1032
+	.loc 1 1864 0
 	mov	w1, 18
 	tst	w0, w1
-	beq	.L1002
-	.loc 1 1891 0
+	beq	.L1022
+	.loc 1 1865 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC83
-	add	x1, x1, :lo12:.LC83
+	adrp	x1, .LC84
+	add	x1, x1, :lo12:.LC84
 	bl	_dev_info
-.LVL856:
-.L860:
-	.loc 1 1927 0
-	adrp	x25, jiffies
 .LVL857:
+.L879:
+	.loc 1 1901 0
+	adrp	x25, jiffies
+.LVL858:
 	mov	x1, 402653184
 	add	x0, x20, 632
 	ldr	x2, [x25, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL858:
-	.loc 1 1929 0
+.LVL859:
+	.loc 1 1903 0
 	ldr	w0, [x28, 444]
-	cbz	w0, .L872
+	cbz	w0, .L891
 	ldr	x0, [x28, 216]
-.L873:
-	.loc 1 1932 0
+.L892:
+	.loc 1 1906 0
 	ldr	w2, [x0, 40]
 	ldr	w3, [x24, 40]
 	cmp	w3, w2
-	beq	.L874
-	.loc 1 1933 0
+	beq	.L893
+	.loc 1 1907 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC85
-	add	x1, x1, :lo12:.LC85
+	adrp	x1, .LC86
+	add	x1, x1, :lo12:.LC86
 	bl	_dev_info
-.LVL859:
-	.loc 1 1935 0
+.LVL860:
+	.loc 1 1909 0
 	ldr	w0, [x28, 44]
 	cmp	w0, 1
-	beq	.L1014
-.L1003:
+	beq	.L1033
+.L1023:
 	ldr	w2, [x24, 40]
-.L874:
-	.loc 1 1942 0
+.L893:
+	.loc 1 1916 0
 	cmp	w2, 23
-	bls	.L1015
-	.loc 1 2123 0
+	bls	.L1034
+	.loc 1 2095 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC93
-	add	x1, x1, :lo12:.LC93
+	adrp	x1, .LC94
+	add	x1, x1, :lo12:.LC94
 	bl	_dev_err
-.LVL860:
-.L1002:
-	.loc 1 2124 0
+.LVL861:
+.L1022:
+	.loc 1 2096 0
 	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL861:
-	.loc 1 2125 0
+.LVL862:
+	.loc 1 2097 0
 	mov	x0, x24
 	bl	ebc_buf_release
-.LVL862:
-	.loc 1 1855 0
+.LVL863:
+	.loc 1 1829 0
 	ldr	w0, [x28, 624]
-	cbz	w0, .L853
+	cbz	w0, .L872
 	.p2align 2
-.L1011:
-	.loc 1 1856 0
+.L1030:
+	.loc 1 1830 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	beq	.L1016
-.L854:
-	.loc 1 2181 0
+	beq	.L1035
+.L873:
+	.loc 1 2153 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, 0
 	ldr	x2, [x29, 232]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L1017
+	cbnz	x1, .L1036
 	ldp	x19, x20, [sp, 16]
-.LVL863:
+.LVL864:
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
-.LVL864:
-	ldp	x25, x26, [sp, 64]
 .LVL865:
+	ldp	x25, x26, [sp, 64]
+.LVL866:
 	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 240
 	.cfi_remember_state
@@ -10002,300 +10088,263 @@ ebc_thread:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL866:
+.LVL867:
 	.p2align 3
-.L855:
+.L874:
 	.cfi_restore_state
-	.loc 1 2162 0
+	.loc 1 2134 0
 	ldr	w0, [x28, 44]
 	cmp	w0, 1
-	beq	.L1018
-	.loc 1 2171 0
+	beq	.L1037
+	.loc 1 2143 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	beq	.L1019
-.LVL867:
-.L1007:
-	ldr	w0, [x28, 96]
+	beq	.L1038
 .LVL868:
-	.loc 1 2174 0
-	cbz	w0, .L1020
-.L954:
+.L1026:
+	ldr	w0, [x28, 96]
 .LVL869:
-.L944:
-	.loc 1 2176 0
-	str	wzr, [x28, 96]
-	b	.L852
+	.loc 1 2146 0
+	cbz	w0, .L1039
+.L974:
 .LVL870:
+.L964:
+	.loc 1 2148 0
+	str	wzr, [x28, 96]
+	b	.L871
+.LVL871:
 	.p2align 3
-.L1020:
+.L1039:
 .LBB1856:
 .LBB1854:
-	.loc 1 2175 0 discriminator 1
+	.loc 1 2147 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL871:
-	b	.L955
-	.p2align 3
-.L1021:
 .LVL872:
+	b	.L975
+	.p2align 3
+.L1040:
+.LVL873:
 .LBB1852:
-	.loc 1 2175 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L944
-	.loc 1 2175 0 discriminator 7
+	.loc 1 2147 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L964
+	.loc 1 2147 0 discriminator 7
 	bl	schedule
-.LVL873:
-.L955:
-	.loc 1 2175 0 discriminator 9
+.LVL874:
+.L975:
+	.loc 1 2147 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL874:
+.LVL875:
 	ldr	w1, [x28, 96]
-	cbz	w1, .L1021
+	cbz	w1, .L1040
 .LBE1852:
-	.loc 1 2175 0 discriminator 4
+	.loc 1 2147 0 discriminator 4
 	add	x1, x29, 120
 	mov	x0, x19
 	bl	finish_wait
-.LVL875:
+.LVL876:
 .LBE1854:
 .LBE1856:
-	.loc 1 2176 0 is_stmt 1 discriminator 4
+	.loc 1 2148 0 is_stmt 1 discriminator 4
 	str	wzr, [x28, 96]
-	b	.L852
-.LVL876:
+	b	.L871
+.LVL877:
 	.p2align 3
-.L1015:
-	.loc 1 1942 0
-	adrp	x0, .L882
-	add	x0, x0, :lo12:.L882
+.L1034:
+	.loc 1 1916 0
+	adrp	x0, .L901
+	add	x0, x0, :lo12:.L901
 	ldrh	w0, [x0,w2,uxtw #1]
-	adr	x1, .Lrtx882
+	adr	x1, .Lrtx901
 	add	x0, x1, w0, sxth #2
 	br	x0
-.Lrtx882:
+.Lrtx901:
 	.section	.rodata
 	.align	0
 	.align	2
-.L882:
-	.2byte	(.L881 - .Lrtx882) / 4
-	.2byte	(.L883 - .Lrtx882) / 4
-	.2byte	(.L959 - .Lrtx882) / 4
-	.2byte	(.L959 - .Lrtx882) / 4
-	.2byte	(.L959 - .Lrtx882) / 4
-	.2byte	(.L959 - .Lrtx882) / 4
-	.2byte	(.L959 - .Lrtx882) / 4
-	.2byte	(.L885 - .Lrtx882) / 4
-	.2byte	(.L885 - .Lrtx882) / 4
-	.2byte	(.L959 - .Lrtx882) / 4
-	.2byte	(.L959 - .Lrtx882) / 4
-	.2byte	(.L885 - .Lrtx882) / 4
-	.2byte	(.L959 - .Lrtx882) / 4
-	.2byte	(.L959 - .Lrtx882) / 4
-	.2byte	(.L885 - .Lrtx882) / 4
-	.2byte	(.L885 - .Lrtx882) / 4
-	.2byte	(.L959 - .Lrtx882) / 4
-	.2byte	(.L959 - .Lrtx882) / 4
-	.2byte	(.L959 - .Lrtx882) / 4
-	.2byte	(.L959 - .Lrtx882) / 4
-	.2byte	(.L959 - .Lrtx882) / 4
-	.2byte	(.L959 - .Lrtx882) / 4
-	.2byte	(.L881 - .Lrtx882) / 4
-	.2byte	(.L881 - .Lrtx882) / 4
+.L901:
+	.2byte	(.L900 - .Lrtx901) / 4
+	.2byte	(.L902 - .Lrtx901) / 4
+	.2byte	(.L979 - .Lrtx901) / 4
+	.2byte	(.L979 - .Lrtx901) / 4
+	.2byte	(.L979 - .Lrtx901) / 4
+	.2byte	(.L979 - .Lrtx901) / 4
+	.2byte	(.L979 - .Lrtx901) / 4
+	.2byte	(.L904 - .Lrtx901) / 4
+	.2byte	(.L904 - .Lrtx901) / 4
+	.2byte	(.L979 - .Lrtx901) / 4
+	.2byte	(.L979 - .Lrtx901) / 4
+	.2byte	(.L904 - .Lrtx901) / 4
+	.2byte	(.L979 - .Lrtx901) / 4
+	.2byte	(.L979 - .Lrtx901) / 4
+	.2byte	(.L904 - .Lrtx901) / 4
+	.2byte	(.L904 - .Lrtx901) / 4
+	.2byte	(.L979 - .Lrtx901) / 4
+	.2byte	(.L979 - .Lrtx901) / 4
+	.2byte	(.L979 - .Lrtx901) / 4
+	.2byte	(.L979 - .Lrtx901) / 4
+	.2byte	(.L979 - .Lrtx901) / 4
+	.2byte	(.L979 - .Lrtx901) / 4
+	.2byte	(.L900 - .Lrtx901) / 4
+	.2byte	(.L900 - .Lrtx901) / 4
 	.text
-.L959:
-	.loc 1 2047 0
-	mov	w7, 1
-.LVL877:
-.L884:
-	.loc 1 2054 0
-	ldr	x26, [x28, 216]
+.L979:
+	.loc 1 2021 0
+	mov	w4, 1
 .LVL878:
-	.loc 1 2056 0
+.L903:
+	.loc 1 2028 0
+	ldr	x26, [x28, 216]
+.LVL879:
+	.loc 1 2030 0
 	ldr	w0, [x26, 40]
 	sub	w1, w0, #22
-	.loc 1 2058 0
+	.loc 1 2032 0
 	cmp	w1, 1
 	ccmp	w0, 1, 0, hi
-	bhi	.L926
-	.loc 1 2061 0
+	bhi	.L945
+	.loc 1 2035 0
 	add	x0, x29, 160
 	str	x0, [x28, 216]
-	.loc 1 2062 0
+	.loc 1 2036 0
 	ldr	x0, [x28, 152]
 	str	x0, [x29, 176]
-	.loc 1 2063 0
+	.loc 1 2037 0
 	mov	w0, 16
 	str	w0, [x29, 224]
-.L926:
-	.loc 1 2065 0
+.L945:
+	.loc 1 2039 0
 	str	wzr, [x28, 92]
-	.loc 1 2066 0
+	.loc 1 2040 0
 	str	x24, [x28, 224]
-	.loc 1 2069 0
+	.loc 1 2043 0
 	ldr	w0, [x24, 40]
 	sub	w0, w0, #2
-	.loc 1 2068 0
+	.loc 1 2042 0
 	cmp	w0, 14
-	bhi	.L927
-	.loc 1 2071 0
-	ldr	x0, [x28, 216]
+	bhi	.L946
+	.loc 1 2044 0
+	ldr	x1, [x28, 216]
+	ldr	w0, [x24, 64]
 .LBB1857:
 .LBB1858:
-	.loc 1 1813 0
-	ldr	w1, [x28, 20]
+	.loc 1 1782 0
+	ldr	w2, [x1, 64]
+	cmp	w0, w2
+	beq	.L1041
+.L946:
 .LBE1858:
 .LBE1857:
-	.loc 1 2070 0
-	ldr	x4, [x24, 16]
-.LBB1861:
-.LBB1859:
-	.loc 1 1813 0
-	cmp	w1, 0
-.LBE1859:
-.LBE1861:
-	.loc 1 2071 0
-	ldr	x5, [x0, 16]
-.LBB1862:
-.LBB1860:
-	.loc 1 1813 0
-	add	w0, w1, 7
-	csel	w0, w0, w1, lt
-	asr	w0, w0, 3
-	cmp	w0, 0
-	ble	.L928
-	.loc 1 1817 0
-	ldr	x2, [x4]
-	ldr	x1, [x5]
-	cmp	x2, x1
-	bne	.L927
-	sub	w1, w0, #1
-	mov	x0, 8
-	add	x1, x1, 1
-	lsl	x1, x1, 3
-	b	.L930
-	.p2align 3
-.L931:
-	.loc 1 1814 0
-	ldr	x3, [x4, x0]
-	add	x0, x0, 8
-	.loc 1 1815 0
-	add	x2, x5, x0
-	.loc 1 1817 0
-	ldr	x2, [x2, -8]
-	cmp	x3, x2
-	bne	.L927
-.L930:
-	.loc 1 1813 0
-	cmp	x0, x1
-	bne	.L931
-.L928:
-.LBE1860:
-.LBE1862:
-	.loc 1 2073 0
+	.loc 1 2053 0
+	cbz	w4, .L1042
+	.loc 1 2054 0
+	str	wzr, [x29, 108]
+.LVL880:
+.L952:
+	.loc 1 2065 0
+	ldr	w0, [x28, 200]
+	cbz	w0, .L1043
+.L953:
+	.loc 1 2068 0
+	ldr	x0, [x28, 224]
+	ldr	w1, [x0, 64]
+.LVL881:
+	mov	x0, x20
+	bl	ebc_lut_update
+.LVL882:
+	cbz	w0, .L954
+.L1059:
+	.loc 1 2069 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC96
-	add	x1, x1, :lo12:.LC96
-	bl	_dev_info
-.LVL879:
-	.loc 1 2075 0
+	adrp	x1, .LC91
+	add	x1, x1, :lo12:.LC91
+	bl	_dev_err
+.LVL883:
+	.loc 1 2071 0
 	str	x26, [x28, 216]
-	.loc 1 2134 0
+.LVL884:
+.L916:
+	.loc 1 2106 0
 	ldr	x0, [x28, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
-	bne	.L939
-.LVL880:
-.L1034:
-	.loc 1 2137 0
-	ldr	x0, [x28, 104]
-	.loc 1 2135 0
-	mov	w25, 1
-.LVL881:
-	.loc 1 2136 0
-	str	wzr, [x28, 204]
-	.loc 1 2137 0
-	adrp	x1, .LC94
-	.loc 1 2135 0
-	str	w25, [x28, 624]
-	.loc 1 2137 0
-	add	x1, x1, :lo12:.LC94
-	bl	_dev_info
-.LVL882:
-	.loc 1 2138 0
-	mov	w2, w25
-	mov	w1, w25
-	add	x0, x22, 328
-	bl	__wake_up_sync
-.LVL883:
-	.loc 1 2151 0
+	beq	.L1044
+.L959:
+	.loc 1 2112 0
+	cmp	w0, 18
+	beq	.L1045
+.L960:
+	.loc 1 2123 0
 	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL884:
-	.loc 1 2153 0
-	ldr	w0, [x28, 444]
-	cbz	w0, .L942
 .LVL885:
-	.p2align 2
-.L1036:
-	.loc 1 2154 0
-	ldr	x0, [x28, 216]
-	bl	ebc_buf_release
+	.loc 1 2125 0
+	ldr	w0, [x28, 444]
+	cbnz	w0, .L1046
+.L962:
+	.loc 1 2128 0
+	mov	w0, 1
+	str	w0, [x28, 444]
+.L963:
+	.loc 1 2130 0
+	ldr	x0, [x28, 224]
+	str	x0, [x28, 216]
+	.loc 1 2131 0
+	b	.L871
 .LVL886:
-	b	.L943
-.LVL887:
-.L883:
-	.loc 1 1944 0
+.L902:
+	.loc 1 1918 0
 	ldr	w0, [x28, 628]
-	cbz	w0, .L886
-	.loc 1 1957 0
+	cbz	w0, .L905
+	.loc 1 1931 0
 	ldr	x2, [x28, 216]
-	.loc 1 1945 0
+	.loc 1 1919 0
 	mov	w0, 1
-	.loc 1 1955 0
+	.loc 1 1929 0
 	str	x24, [x28, 224]
-	.loc 1 1945 0
+	.loc 1 1919 0
 	str	w0, [x28, 632]
-	.loc 1 1957 0
+	.loc 1 1931 0
 	ldr	w0, [x2, 40]
-	.loc 1 1960 0
+	.loc 1 1934 0
 	cmp	w0, 1
-	.loc 1 1959 0
+	.loc 1 1933 0
 	sub	w1, w0, #22
-	.loc 1 1960 0
+	.loc 1 1934 0
 	ccmp	w1, 1, 0, hi
-	bls	.L1022
-	.loc 1 1961 0
+	bls	.L1047
+	.loc 1 1935 0
 	ldr	w0, [x2, 64]
 	cmp	w0, 32
-	beq	.L1023
-	.loc 1 1964 0
+	beq	.L1048
+	.loc 1 1938 0
 	ldr	x1, [x2, 16]
 	ldr	x0, [x28, 160]
 	ldrsw	x2, [x28, 20]
 	bl	memcpy
-.LVL888:
-.L1004:
+.LVL887:
+.L1024:
 	ldr	w2, [x28, 20]
 	ldr	x1, [x28, 160]
-.L890:
-	.loc 1 1965 0
+.L909:
+	.loc 1 1939 0
 	ldr	x0, [x28, 144]
 	sxtw	x2, w2
 	bl	memcpy
-.LVL889:
-	.loc 1 1966 0
+.LVL888:
+	.loc 1 1940 0
 	ldrsw	x2, [x28, 20]
 	ldp	x0, x1, [x28, 152]
 	bl	memcpy
-.LVL890:
+.LVL889:
 	ldr	x0, [x28, 224]
-.L892:
-.LBB1863:
-.LBB1864:
+.L911:
+.LBB1860:
+.LBB1861:
 	.loc 1 379 0
 	ldp	w3, w16, [x0, 48]
 	.loc 1 438 0
@@ -10323,23 +10372,23 @@ ebc_thread:
 	asr	w10, w10, 3
 	.loc 1 382 0
 	asr	w18, w18, 3
-.LVL891:
+.LVL890:
 	.loc 1 378 0
 	add	w10, w10, 1
-.LVL892:
+.LVL891:
 	ldr	w1, [x20, 252]
 	.loc 1 385 0
 	cmp	w10, w18
-.LBE1864:
-.LBE1863:
-	.loc 1 1973 0
+.LBE1861:
+.LBE1860:
+	.loc 1 1947 0
 	ldr	x13, [x0, 16]
-.LBB1869:
-.LBB1865:
+.LBB1866:
+.LBB1862:
 	.loc 1 385 0
 	sub	w0, w18, #1
 	csel	w10, w0, w10, ge
-.LVL893:
+.LVL892:
 	.loc 1 387 0
 	cmp	w1, w25
 	sub	w1, w1, #1
@@ -10349,106 +10398,106 @@ ebc_thread:
 	csel	w25, w1, w25, le
 	.loc 1 377 0
 	asr	w17, w17, 3
-.LVL894:
+.LVL893:
 	mul	w7, w16, w18
 	.loc 1 389 0
 	cmp	w16, w25
-.LBE1865:
-.LBE1869:
-	.loc 1 1973 0
+.LBE1862:
+.LBE1866:
+	.loc 1 1947 0
 	ldr	x9, [x28, 144]
-	.loc 1 1974 0
+	.loc 1 1948 0
 	ldp	x12, x11, [x28, 160]
-.LBB1870:
-.LBB1866:
+.LBB1867:
+.LBB1863:
 	.loc 1 389 0
-	bgt	.L900
-.LVL895:
+	bgt	.L919
+.LVL894:
 	.p2align 2
-.L980:
+.L1000:
 	.loc 1 394 0
 	mov	w5, w17
 	cmp	w17, w10
-	ble	.L981
-	b	.L917
-.LVL896:
+	ble	.L1001
+	b	.L936
+.LVL895:
 	.p2align 3
-.L901:
+.L920:
 	.loc 1 407 0
 	tst	x2, 65280
-	bne	.L902
+	bne	.L921
 	.loc 1 408 0
 	and	w27, w0, 240
 	cmp	w27, 224
-	beq	.L1024
+	beq	.L1049
 	.loc 1 411 0
 	orr	w3, w3, 240
-.L902:
+.L921:
 	.loc 1 413 0
 	tst	x2, 16711680
-	bne	.L904
+	bne	.L923
 	.loc 1 414 0
 	and	w27, w0, 3840
 	cmp	w27, 3584
-	beq	.L1025
+	beq	.L1050
 	.loc 1 417 0
 	orr	w3, w3, 3840
-.L904:
+.L923:
 	.loc 1 419 0
 	tst	x2, 4278190080
-	bne	.L906
+	bne	.L925
 	.loc 1 420 0
 	and	w27, w0, 61440
 	cmp	w27, 57344
-	beq	.L1026
+	beq	.L1051
 	.loc 1 423 0
 	orr	w3, w3, 61440
-.L906:
+.L925:
 	.loc 1 425 0
 	tst	x2, 1095216660480
-	bne	.L908
+	bne	.L927
 	.loc 1 426 0
 	and	w27, w0, 983040
 	cmp	w27, 917504
-	beq	.L1027
+	beq	.L1052
 	.loc 1 429 0
 	orr	w3, w3, 983040
-.L908:
+.L927:
 	.loc 1 431 0
 	tst	x2, 280375465082880
-	bne	.L910
+	bne	.L929
 	.loc 1 432 0
 	and	w27, w0, 15728640
 	cmp	w27, 14680064
-	beq	.L1028
+	beq	.L1053
 	.loc 1 435 0
 	orr	w3, w3, 15728640
-.L910:
+.L929:
 	.loc 1 437 0
 	tst	x2, 71776119061217280
-	bne	.L912
+	bne	.L931
 	.loc 1 438 0
 	and	w27, w0, 251658240
 	cmp	w27, w15
-	beq	.L1029
+	beq	.L1054
 	.loc 1 441 0
 	orr	w3, w3, 251658240
-.L912:
+.L931:
 	.loc 1 443 0
 	tst	x2, -72057594037927936
-	bne	.L914
+	bne	.L933
 	.loc 1 444 0
 	and	w2, w0, -268435456
-.LVL897:
+.LVL896:
 	cmp	w2, w14
-	beq	.L1030
+	beq	.L1055
 	.loc 1 447 0
 	orr	w3, w3, -268435456
-.LVL898:
-.L914:
+.LVL897:
+.L933:
 	.loc 1 450 0
 	and	w0, w0, w26
-.LVL899:
+.LVL898:
 	.loc 1 394 0
 	add	w5, w5, 1
 	eor	w0, w0, w4
@@ -10459,19 +10508,19 @@ ebc_thread:
 	.loc 1 451 0
 	str	w0, [x9, x1]
 	.loc 1 394 0
-	bgt	.L917
-.LVL900:
-.L981:
+	bgt	.L936
+.LVL899:
+.L1001:
 	.loc 1 395 0
 	sxtw	x1, w5
-.LVL901:
+.LVL900:
 	.loc 1 399 0
 	mov	w3, 0
 	.loc 1 398 0
 	lsl	x0, x1, 3
 	.loc 1 395 0
 	lsl	x1, x1, 2
-.LVL902:
+.LVL901:
 	.loc 1 398 0
 	add	x0, x0, x7, sxtw 3
 	add	x1, x1, x7, sxtw 2
@@ -10484,270 +10533,211 @@ ebc_thread:
 	and	x27, x2, 255
 	.loc 1 397 0
 	ldr	w26, [x12, x1]
-.LVL903:
+.LVL902:
 	.loc 1 401 0
-	cbnz	x27, .L901
-.LVL904:
+	cbnz	x27, .L920
+.LVL903:
 	.loc 1 402 0
 	and	w27, w0, 15
 	.loc 1 405 0
 	mov	w3, 15
 	.loc 1 402 0
 	cmp	w27, 14
-	bne	.L901
+	bne	.L920
 	.loc 1 403 0
 	orr	w4, w4, w3
-.LVL905:
+.LVL904:
 	.loc 1 399 0
 	mov	w3, 0
+.LVL905:
+	b	.L920
 .LVL906:
-	b	.L901
-.LVL907:
-.L881:
-.LBE1866:
-.LBE1870:
-	.loc 1 1996 0
-	add	x0, x22, 704
+.L900:
+.LBE1863:
+.LBE1867:
+	.loc 1 1970 0
+	add	x0, x22, 680
 	bl	down_write
-.LVL908:
-	.loc 1 1999 0
+.LVL907:
+	.loc 1 1973 0
 	ldr	x1, [x28, 216]
-	.loc 1 1997 0
+	.loc 1 1971 0
 	str	x24, [x28, 224]
-	.loc 1 2000 0
+	.loc 1 1974 0
 	ldr	w0, [x1, 40]
 	sub	w2, w0, #22
-	.loc 1 2002 0
+	.loc 1 1976 0
 	cmp	w2, 1
 	ccmp	w0, 1, 0, hi
-	bls	.L919
-	.loc 1 2003 0
+	bls	.L938
+	.loc 1 1977 0
 	ldr	w0, [x1, 64]
 	cmp	w0, 32
-	beq	.L1031
-	.loc 1 2006 0
+	beq	.L1056
+	.loc 1 1980 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x1, 16]
 	ldr	x0, [x28, 152]
 	bl	memcpy
-.LVL909:
-.L1005:
+.LVL908:
+.L1025:
 	ldr	w2, [x28, 20]
 	ldr	x1, [x28, 152]
-.L921:
-	.loc 1 2007 0
+.L940:
+	.loc 1 1981 0
 	ldr	x0, [x28, 144]
 	sxtw	x2, w2
 	bl	memcpy
+.LVL909:
+	b	.L942
+.L904:
+	.loc 1 1916 0
+	mov	w4, 0
 .LVL910:
-	b	.L923
-.L885:
-	.loc 1 1942 0
-	mov	w7, 0
+	b	.L903
 .LVL911:
-	b	.L884
-.LVL912:
 	.p2align 3
-.L872:
-	.loc 1 1930 0
+.L891:
+	.loc 1 1904 0
 	mov	x0, x24
 	str	x24, [x28, 216]
-	b	.L873
-.LVL913:
+	b	.L892
+.LVL912:
 	.p2align 3
-.L861:
-	.loc 1 1900 0
+.L880:
+	.loc 1 1874 0
 	cmp	w0, 18
 	ccmp	w0, 21, 4, ne
-	bne	.L865
-	.loc 1 1901 0
+	bne	.L884
+	.loc 1 1875 0
 	str	wzr, [x28, 632]
-	b	.L860
+	b	.L879
 	.p2align 3
-.L1012:
-	.loc 1 1878 0
+.L1031:
+	.loc 1 1852 0
 	str	wzr, [x28, 628]
-	.loc 1 1877 0
+	.loc 1 1851 0
 	str	wzr, [x28, 632]
-	b	.L860
-.LVL914:
-	.p2align 3
-.L927:
-	.loc 1 2081 0
-	cbz	w7, .L1032
-	.loc 1 2082 0
-	str	wzr, [x29, 108]
-.LVL915:
-.L932:
-	.loc 1 2093 0
-	ldr	w0, [x28, 200]
-	cbz	w0, .L1033
-.L933:
-	.loc 1 2096 0
-	ldr	x0, [x28, 224]
-	ldr	w1, [x0, 64]
-.LVL916:
-	mov	x0, x20
-	bl	ebc_lut_update
-.LVL917:
-	cbz	w0, .L934
-.L1039:
-	.loc 1 2097 0
-	ldr	x0, [x28, 104]
-	adrp	x1, .LC90
-	add	x1, x1, :lo12:.LC90
-	bl	_dev_err
-.LVL918:
-	.loc 1 2099 0
-	str	x26, [x28, 216]
-.LVL919:
-.L897:
-	.loc 1 2134 0
-	ldr	x0, [x28, 224]
-	ldr	w0, [x0, 40]
-	cmp	w0, 20
-	beq	.L1034
-.L939:
-	.loc 1 2140 0
-	cmp	w0, 18
-	beq	.L1035
-.L940:
-	.loc 1 2151 0
-	mov	x0, x24
-	bl	ebc_remove_from_dsp_buf_list
-.LVL920:
-	.loc 1 2153 0
-	ldr	w0, [x28, 444]
-	cbnz	w0, .L1036
-.L942:
-	.loc 1 2156 0
-	mov	w0, 1
-	str	w0, [x28, 444]
-.L943:
-	.loc 1 2158 0
-	ldr	x0, [x28, 224]
-	str	x0, [x28, 216]
-	.loc 1 2159 0
-	b	.L852
+	b	.L879
 	.p2align 3
-.L1018:
-.LBB1871:
-	.loc 1 2163 0 discriminator 1
+.L1037:
+.LBB1868:
+	.loc 1 2135 0 discriminator 1
 	ldr	w0, [x28, 96]
-	cbnz	w0, .L944
-.LBB1872:
-	.loc 1 2163 0 is_stmt 0 discriminator 3
+	cbnz	w0, .L964
+.LBB1869:
+	.loc 1 2135 0 is_stmt 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL921:
-	b	.L948
+.LVL913:
+	b	.L968
 	.p2align 3
-.L1037:
-.LBB1873:
-	.loc 1 2163 0 discriminator 7
+.L1057:
+.LBB1870:
+	.loc 1 2135 0 discriminator 7
 	ldr	w1, [x28, 96]
-	cbnz	w1, .L945
-.LVL922:
-	.loc 1 2163 0 discriminator 9
-	cbnz	x0, .L1007
-	.loc 1 2163 0 discriminator 11
+	cbnz	w1, .L965
+.LVL914:
+	.loc 1 2135 0 discriminator 9
+	cbnz	x0, .L1026
+	.loc 1 2135 0 discriminator 11
 	bl	schedule
-.LVL923:
-.L948:
-	.loc 1 2163 0 discriminator 13
+.LVL915:
+.L968:
+	.loc 1 2135 0 discriminator 13
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL924:
+.LVL916:
 	ldr	w1, [x28, 44]
-	cbnz	w1, .L1037
-.L945:
-.LBE1873:
-	.loc 1 2163 0 discriminator 8
+	cbnz	w1, .L1057
+.L965:
+.LBE1870:
+	.loc 1 2135 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL925:
+.LVL917:
 	ldr	w0, [x28, 44]
-.LBE1872:
-.LBE1871:
-	.loc 1 2166 0 is_stmt 1 discriminator 8
-	cbnz	w0, .L1007
-	.loc 1 2171 0
+.LBE1869:
+.LBE1868:
+	.loc 1 2138 0 is_stmt 1 discriminator 8
+	cbnz	w0, .L1026
+	.loc 1 2143 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	bne	.L1007
+	bne	.L1026
 	.p2align 2
-.L1019:
-.LBB1874:
-.LBB1875:
+.L1038:
+.LBB1871:
+.LBB1872:
 	mov	w1, 0
 	mov	x0, x20
-	bl	ebc_power_set.part.12
-.LVL926:
-	b	.L1007
+	bl	ebc_power_set.part.13
+.LVL918:
+	b	.L1026
 	.p2align 3
-.L865:
-.LBE1875:
-.LBE1874:
-	.loc 1 1903 0
+.L884:
+.LBE1872:
+.LBE1871:
+	.loc 1 1877 0
 	ldr	w1, [x28, 632]
 	cmp	w1, 0
 	ccmp	w0, 1, 4, ne
-	beq	.L860
-	.loc 1 1904 0
-	add	x0, x22, 704
+	beq	.L879
+	.loc 1 1878 0
+	add	x0, x22, 680
 	bl	down_write
-.LVL927:
-	.loc 1 1905 0
+.LVL919:
+	.loc 1 1879 0
 	ldr	w0, [x24, 64]
 	cmp	w0, 32
-	bne	.L866
-	.loc 1 1906 0
+	bne	.L885
+	.loc 1 1880 0
 	ldr	w4, [x28, 20]
-.LBB1876:
-.LBB1877:
-	.loc 1 1833 0
+.LBB1873:
+.LBB1874:
+	.loc 1 1807 0
 	mov	x0, 0
 	ldr	x3, [x24, 16]
-.LVL928:
+.LVL920:
 	cmp	w4, 0
-.LBE1877:
-.LBE1876:
-	.loc 1 1906 0
+.LBE1874:
+.LBE1873:
+	.loc 1 1880 0
 	ldr	x5, [x28, 160]
-.LBB1879:
-.LBB1878:
-	.loc 1 1833 0
-	ble	.L868
+.LBB1876:
+.LBB1875:
+	.loc 1 1807 0
+	ble	.L887
 	.p2align 2
-.L982:
-	.loc 1 1835 0
+.L1002:
+	.loc 1 1809 0
 	ldrb	w1, [x3], 2
-	.loc 1 1837 0
+	.loc 1 1811 0
 	ldrb	w2, [x3, -1]
 	and	w2, w2, -16
 	orr	w1, w2, w1, lsr 4
-	.loc 1 1838 0
+	.loc 1 1812 0
 	strb	w1, [x5, x0]
 	add	x0, x0, 1
-	.loc 1 1833 0
+	.loc 1 1807 0
 	cmp	w4, w0
-	bgt	.L982
-.L868:
-.LBE1878:
-.LBE1879:
-	.loc 1 1909 0
+	bgt	.L1002
+.L887:
+.LBE1875:
+.LBE1876:
+	.loc 1 1883 0
 	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL929:
-	.loc 1 1910 0
+.LVL921:
+	.loc 1 1884 0
 	mov	x0, x24
 	bl	ebc_buf_release
-.LVL930:
-	.loc 1 1912 0
+.LVL922:
+	.loc 1 1886 0
 	ldr	x1, [x28, 224]
 	mov	x4, x28
 	ldr	x0, [x28, 144]
@@ -10755,258 +10745,296 @@ ebc_thread:
 	ldr	w5, [x1, 40]
 	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
-.LVL931:
-	.loc 1 1915 0
-	add	x0, x22, 704
+.LVL923:
+	.loc 1 1889 0
+	add	x0, x22, 680
 	bl	up_write
-.LVL932:
-	.loc 1 1916 0
+.LVL924:
+	.loc 1 1890 0
 	ldr	w0, [x28, 44]
-	cbnz	w0, .L852
-	.loc 1 1917 0
+	cbnz	w0, .L871
+	.loc 1 1891 0
 	mov	w0, 1
 	str	w0, [x28, 44]
-	.loc 1 1919 0
+	.loc 1 1893 0
 	ldr	w0, [x28, 200]
-	.loc 1 1918 0
+	.loc 1 1892 0
 	str	wzr, [x28, 92]
-	.loc 1 1919 0
-	cbz	w0, .L1038
-.L871:
-	.loc 1 1921 0
+	.loc 1 1893 0
+	cbz	w0, .L1058
+.L890:
+	.loc 1 1895 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC84
+	adrp	x1, .LC85
 	ldrb	w2, [x28, 48]
-	add	x1, x1, :lo12:.LC84
+	add	x1, x1, :lo12:.LC85
 	bl	_dev_info
-.LVL933:
-	.loc 1 1922 0
+.LVL925:
+	.loc 1 1896 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL934:
-	b	.L852
-.LVL935:
+.LVL926:
+	b	.L871
+.LVL927:
 	.p2align 3
-.L1032:
-	.loc 1 2085 0
+.L1042:
+	.loc 1 2057 0
 	ldr	w0, [x28, 64]
 	cmp	w0, 0
-	ble	.L932
-	.loc 1 2086 0
+	ble	.L952
+	.loc 1 2058 0
 	ldr	w1, [x29, 108]
-.LVL936:
+.LVL928:
 	add	w1, w1, 1
 	str	w1, [x29, 108]
-	.loc 1 2087 0
+	.loc 1 2059 0
 	cmp	w0, w1
-	bgt	.L932
-	.loc 1 2088 0
+	bgt	.L952
+	.loc 1 2060 0
 	mov	w0, 2
 	str	w0, [x24, 40]
-	.loc 1 2089 0
+	.loc 1 2061 0
 	str	wzr, [x29, 108]
-	.loc 1 2093 0
+	.loc 1 2065 0
 	ldr	w0, [x28, 200]
-	cbnz	w0, .L933
-.L1033:
-	.loc 1 2094 0
+	cbnz	w0, .L953
+.L1043:
+	.loc 1 2066 0
 	mov	x0, x20
-	bl	ebc_power_set.constprop.16
-.LVL937:
-	.loc 1 2096 0
+	bl	ebc_power_set.constprop.17
+.LVL929:
+	.loc 1 2068 0
 	ldr	x0, [x28, 224]
 	ldr	w1, [x0, 64]
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL938:
-	cbnz	w0, .L1039
-.L934:
-	.loc 1 2108 0
+.LVL930:
+	cbnz	w0, .L1059
+.L954:
+	.loc 1 2080 0
 	ldr	x0, [x28, 224]
-	adrp	x1, .LC92
-	.loc 1 2105 0
+	adrp	x1, .LC93
+	.loc 1 2077 0
 	ldr	w3, [x28, 112]
-	.loc 1 2108 0
-	add	x1, x1, :lo12:.LC92
-	.loc 1 2105 0
+	.loc 1 2080 0
+	add	x1, x1, :lo12:.LC93
+	.loc 1 2077 0
 	strb	w3, [x28, 48]
-	.loc 1 2108 0
+	.loc 1 2080 0
 	and	w3, w3, 255
 	ldr	w2, [x0, 40]
 	ldr	x0, [x28, 104]
 	bl	_dev_info
-.LVL939:
-	.loc 1 2109 0
+.LVL931:
+	.loc 1 2081 0
 	mov	w0, 1
 	str	w0, [x28, 44]
-	.loc 1 2110 0
+	.loc 1 2082 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL940:
-	.loc 1 2112 0
+.LVL932:
+	.loc 1 2084 0
 	ldr	x1, [x25, #:lo12:jiffies]
 	add	x0, x20, 688
 	str	x0, [x29, 96]
-	add	x1, x1, 900
-	bl	mod_timer
-.LVL941:
-.LBB1880:
-	.loc 1 2113 0
+	add	x1, x1, 900
+	bl	mod_timer
+.LVL933:
+.LBB1877:
+	.loc 1 2085 0
 	ldr	w0, [x28, 92]
-	cbz	w0, .L1040
-.L937:
-.LVL942:
-.L935:
-.LBE1880:
-	.loc 1 2115 0 discriminator 11
+	cbz	w0, .L1060
+.L957:
+.LVL934:
+.L955:
+.LBE1877:
+	.loc 1 2087 0 discriminator 11
 	ldr	x2, [x25, #:lo12:jiffies]
 	mov	x1, 402653184
 	ldr	x0, [x29, 96]
-.LVL943:
+.LVL935:
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL944:
-	.loc 1 2116 0 discriminator 11
+.LVL936:
+	.loc 1 2088 0 discriminator 11
 	str	wzr, [x28, 92]
-	.loc 1 2118 0 discriminator 11
+	.loc 1 2106 0 discriminator 11
+	ldr	x0, [x28, 224]
+	.loc 1 2090 0 discriminator 11
 	str	x26, [x28, 216]
-	.loc 1 2120 0 discriminator 11
-	b	.L897
-.LVL945:
-.L1014:
-	.loc 1 1936 0
+	.loc 1 2106 0 discriminator 11
+	ldr	w0, [x0, 40]
+	cmp	w0, 20
+	bne	.L959
+.LVL937:
+.L1044:
+	.loc 1 2109 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC86
-	add	x1, x1, :lo12:.LC86
+	.loc 1 2107 0
+	mov	w25, 1
+.LVL938:
+	.loc 1 2108 0
+	str	wzr, [x28, 204]
+	.loc 1 2109 0
+	adrp	x1, .LC95
+	.loc 1 2107 0
+	str	w25, [x28, 624]
+	.loc 1 2109 0
+	add	x1, x1, :lo12:.LC95
 	bl	_dev_info
-.LVL946:
-.LBB1884:
-	.loc 1 1937 0
-	ldr	w0, [x28, 92]
-	cbz	w0, .L1041
-.L878:
-.LVL947:
-.L876:
-.LBE1884:
-	.loc 1 1938 0 discriminator 11
+.LVL939:
+	.loc 1 2110 0
+	mov	w2, w25
+	mov	w1, w25
+	add	x0, x22, 328
+	bl	__wake_up_sync
+.LVL940:
+	.loc 1 2123 0
+	mov	x0, x24
+	bl	ebc_remove_from_dsp_buf_list
+.LVL941:
+	.loc 1 2125 0
+	ldr	w0, [x28, 444]
+	cbz	w0, .L962
+.LVL942:
+	.p2align 2
+.L1046:
+	.loc 1 2126 0
+	ldr	x0, [x28, 216]
+	bl	ebc_buf_release
+.LVL943:
+	b	.L963
+.LVL944:
+.L1033:
+	.loc 1 1910 0
 	ldr	x0, [x28, 104]
-.LVL948:
 	adrp	x1, .LC87
 	add	x1, x1, :lo12:.LC87
 	bl	_dev_info
-.LVL949:
-	b	.L1003
-.L919:
-	.loc 1 2010 0
+.LVL945:
+.LBB1881:
+	.loc 1 1911 0
+	ldr	w0, [x28, 92]
+	cbz	w0, .L1061
+.L897:
+.LVL946:
+.L895:
+.LBE1881:
+	.loc 1 1912 0 discriminator 11
+	ldr	x0, [x28, 104]
+.LVL947:
+	adrp	x1, .LC88
+	add	x1, x1, :lo12:.LC88
+	bl	_dev_info
+.LVL948:
+	b	.L1023
+.L938:
+	.loc 1 1984 0
 	ldr	x1, [x24, 16]
 	mov	x3, x28
 	ldr	x0, [x28, 144]
 	ldr	x2, [x28, 168]
 	bl	refresh_new_image_auto
-.LVL950:
-.L923:
-	.loc 1 2013 0
-	add	x0, x22, 704
+.LVL949:
+.L942:
+	.loc 1 1987 0
+	add	x0, x22, 680
 	bl	up_write
-.LVL951:
-	.loc 1 2015 0
+.LVL950:
+	.loc 1 1989 0
 	ldr	w0, [x28, 44]
-	cbnz	w0, .L897
-	.loc 1 2018 0
+	cbnz	w0, .L916
+	.loc 1 1992 0
 	ldr	w0, [x28, 200]
-	.loc 1 2016 0
+	.loc 1 1990 0
 	mov	w1, 1
-	.loc 1 2017 0
+	.loc 1 1991 0
 	str	wzr, [x28, 92]
-	.loc 1 2016 0
+	.loc 1 1990 0
 	str	w1, [x28, 44]
-	.loc 1 2018 0
-	cbz	w0, .L1042
-.L924:
-	.loc 1 2020 0
+	.loc 1 1992 0
+	cbz	w0, .L1062
+.L943:
+	.loc 1 1994 0
 	mov	w1, 16
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL952:
+.LVL951:
 	cmn	w0, #1
-	beq	.L1043
-	.loc 1 2028 0
-	ldr	x0, [x28, 104]
-	adrp	x1, .LC91
-	.loc 1 2025 0
+	beq	.L1063
+	.loc 1 1999 0
 	ldr	w3, [x28, 112]
-	.loc 1 2028 0
-	add	x1, x1, :lo12:.LC91
-	.loc 1 2025 0
+	.loc 1 2002 0
+	adrp	x1, .LC92
+	ldr	x0, [x28, 104]
+	add	x1, x1, :lo12:.LC92
+	.loc 1 1999 0
 	strb	w3, [x28, 48]
-.LVL953:
-.L1006:
-	.loc 1 2028 0
+	.loc 1 2002 0
 	and	w2, w3, 255
-	.loc 1 2026 0
+	.loc 1 2000 0
 	lsr	w3, w3, 8
 	strb	w3, [x28, 49]
-	.loc 1 2028 0
+	.loc 1 2002 0
 	bl	_dev_info
-.LVL954:
-	.loc 1 2029 0
+.LVL952:
+	.loc 1 2003 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL955:
-	b	.L897
-.LVL956:
-.L1022:
-	.loc 1 1969 0
+.LVL953:
+	b	.L916
+.L1047:
+	.loc 1 1943 0
 	cmp	w0, 0
 	mov	x0, x24
 	ccmp	w1, 1, 0, ne
-	bhi	.L892
-	.loc 1 1970 0
+	bhi	.L911
+	.loc 1 1944 0
 	ldrsw	x2, [x28, 20]
 	ldp	x1, x0, [x28, 152]
 	bl	memcpy
-.LVL957:
+.LVL954:
 	ldr	x0, [x28, 224]
-	b	.L892
-.LVL958:
+	b	.L911
+.LVL955:
 	.p2align 3
-.L1025:
-.LBB1888:
-.LBB1867:
+.L1050:
+.LBB1885:
+.LBB1864:
 	.loc 1 415 0
 	orr	w4, w4, 3840
-	b	.L904
+	b	.L923
 	.p2align 3
-.L1026:
+.L1051:
 	.loc 1 421 0
 	orr	w4, w4, 61440
-	b	.L906
+	b	.L925
 	.p2align 3
-.L1027:
+.L1052:
 	.loc 1 427 0
 	orr	w4, w4, 983040
-	b	.L908
+	b	.L927
 	.p2align 3
-.L1028:
+.L1053:
 	.loc 1 433 0
 	orr	w4, w4, 15728640
-	b	.L910
+	b	.L929
 	.p2align 3
-.L1029:
+.L1054:
 	.loc 1 439 0
 	orr	w4, w4, 251658240
-	b	.L912
-.LVL959:
+	b	.L931
+.LVL956:
 	.p2align 3
-.L1030:
+.L1055:
 	.loc 1 445 0
 	orr	w4, w4, -268435456
-.LVL960:
+.LVL957:
 	.loc 1 450 0
 	and	w0, w0, w26
-.LVL961:
+.LVL958:
 	eor	w0, w0, w4
-.LVL962:
+.LVL959:
 	.loc 1 394 0
 	add	w5, w5, 1
 	and	w0, w0, w3
@@ -11016,347 +11044,421 @@ ebc_thread:
 	.loc 1 451 0
 	str	w0, [x9, x1]
 	.loc 1 394 0
-	ble	.L981
-.LVL963:
+	ble	.L1001
+.LVL960:
 	.p2align 2
-.L917:
+.L936:
 	.loc 1 389 0
 	add	w16, w16, 1
 	add	w7, w7, w18
 	cmp	w16, w25
-	ble	.L980
-.L900:
-.LBE1867:
-.LBE1888:
-	.loc 1 1977 0
+	ble	.L1000
+.L919:
+.LBE1864:
+.LBE1885:
+	.loc 1 1951 0
 	ldr	w0, [x28, 44]
-	cbnz	w0, .L897
-	.loc 1 1980 0
+	cbnz	w0, .L916
+	.loc 1 1954 0
 	ldr	w0, [x28, 200]
-	.loc 1 1978 0
+	.loc 1 1952 0
 	mov	w1, 1
-	.loc 1 1979 0
+	.loc 1 1953 0
 	str	wzr, [x28, 92]
-	.loc 1 1978 0
+	.loc 1 1952 0
 	str	w1, [x28, 44]
-	.loc 1 1980 0
-	cbz	w0, .L1044
-.L918:
-	.loc 1 1982 0
+	.loc 1 1954 0
+	cbz	w0, .L1064
+.L937:
+	.loc 1 1956 0
 	mov	w1, 16
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL964:
+.LVL961:
 	cmn	w0, #1
-	beq	.L897
-	.loc 1 1986 0
-	ldr	w3, [x28, 112]
-	.loc 1 1989 0
-	adrp	x1, .LC89
-	.loc 1 1986 0
-	strb	w3, [x28, 48]
-	.loc 1 1989 0
-	add	x1, x1, :lo12:.LC89
+	beq	.L916
+	.loc 1 1960 0
+	ldr	w2, [x28, 112]
+	.loc 1 1963 0
+	adrp	x1, .LC90
 	ldr	x0, [x28, 104]
-	b	.L1006
-.LVL965:
+	add	x1, x1, :lo12:.LC90
+	.loc 1 1960 0
+	strb	w2, [x28, 48]
+	.loc 1 1961 0
+	lsr	w3, w2, 8
+	.loc 1 1963 0
+	and	w2, w2, 255
+	.loc 1 1961 0
+	strb	w3, [x28, 49]
+	.loc 1 1963 0
+	and	w3, w3, 255
+	bl	_dev_info
+.LVL962:
+	.loc 1 1964 0
+	mov	x0, x20
+	bl	ebc_frame_start
+.LVL963:
+	b	.L916
+.LVL964:
 	.p2align 3
-.L1024:
-.LBB1889:
-.LBB1868:
+.L1049:
+.LBB1886:
+.LBB1865:
 	.loc 1 409 0
 	orr	w4, w4, 240
-	b	.L902
-.LVL966:
-.L1035:
-.LBE1868:
-.LBE1889:
-	.loc 1 2141 0
+	b	.L921
+.LVL965:
+.L1045:
+.LBE1865:
+.LBE1886:
+	.loc 1 2113 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC95
-	add	x1, x1, :lo12:.LC95
+	adrp	x1, .LC96
+	add	x1, x1, :lo12:.LC96
 	bl	_dev_info
-.LVL967:
-	.loc 1 2142 0
+.LVL966:
+	.loc 1 2114 0
 	ldr	w0, [x28, 616]
-	cbz	w0, .L1045
-.L941:
-	.loc 1 2147 0
+	cbz	w0, .L1065
+.L961:
+	.loc 1 2119 0
 	add	x0, x21, :lo12:.LANCHOR0
-	.loc 1 2145 0
+	.loc 1 2117 0
 	mov	w2, 1
-	.loc 1 2144 0
+	.loc 1 2116 0
 	str	wzr, [x28, 204]
-	.loc 1 2148 0
+	.loc 1 2120 0
 	mov	w1, w2
-	.loc 1 2145 0
+	.loc 1 2117 0
 	str	w2, [x28, 616]
-	.loc 1 2146 0
+	.loc 1 2118 0
 	str	wzr, [x28, 632]
-	.loc 1 2147 0
+	.loc 1 2119 0
 	str	wzr, [x0, 16]
-	.loc 1 2148 0
+	.loc 1 2120 0
 	add	x0, x22, 328
 	bl	__wake_up_sync
+.LVL967:
+	b	.L960
 .LVL968:
-	b	.L940
-.LVL969:
-.L886:
-	.loc 1 1948 0
+.L905:
+	.loc 1 1922 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC88
-	add	x1, x1, :lo12:.LC88
+	adrp	x1, .LC89
+	add	x1, x1, :lo12:.LC89
 	bl	_dev_info
-.LVL970:
-	.loc 1 1949 0
+.LVL969:
+	.loc 1 1923 0
 	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL971:
-	.loc 1 1950 0
+.LVL970:
+	.loc 1 1924 0
 	mov	x0, x24
 	bl	ebc_buf_release
+.LVL971:
+	.loc 1 1926 0
+	b	.L871
 .LVL972:
-	.loc 1 1952 0
-	b	.L852
-.L1031:
-	.loc 1 2004 0
+.L1041:
+	.loc 1 2044 0
+	ldr	w2, [x28, 20]
+.LBB1887:
+.LBB1859:
+	.loc 1 1786 0
+	cmp	w0, 32
+.LVL973:
+	lsl	w0, w2, 1
+	csel	w2, w0, w2, eq
+	.loc 1 1787 0
+	cmp	w2, 0
+	add	w0, w2, 7
+	csel	w0, w0, w2, lt
+.LVL974:
+	asr	w0, w0, 3
+.LVL975:
+	cmp	w0, 0
+	ble	.L948
+	ldr	x7, [x1, 16]
+	ldr	x5, [x24, 16]
+	.loc 1 1791 0
+	ldr	x2, [x7]
+	ldr	x1, [x5]
+	cmp	x2, x1
+	bne	.L946
+	sub	w1, w0, #1
+	mov	x0, 8
+	add	x1, x1, 1
+	lsl	x1, x1, 3
+	b	.L950
+	.p2align 3
+.L951:
+	.loc 1 1788 0
+	ldr	x3, [x5, x0]
+	add	x0, x0, 8
+	.loc 1 1789 0
+	add	x2, x7, x0
+	.loc 1 1791 0
+	ldr	x2, [x2, -8]
+	cmp	x3, x2
+	bne	.L946
+.L950:
+	.loc 1 1787 0
+	cmp	x0, x1
+	bne	.L951
+.L948:
+.LBE1859:
+.LBE1887:
+	.loc 1 2045 0
+	ldr	x0, [x28, 104]
+	adrp	x1, .LC97
+	add	x1, x1, :lo12:.LC97
+	bl	_dev_info
+.LVL976:
+	.loc 1 2047 0
+	str	x26, [x28, 216]
+	.loc 1 2049 0
+	b	.L916
+.LVL977:
+.L1056:
+	.loc 1 1978 0
 	ldr	w2, [x28, 20]
 	ldr	x5, [x1, 16]
-.LBB1890:
-.LBB1891:
-	.loc 1 1833 0
+.LBB1888:
+.LBB1889:
+	.loc 1 1807 0
 	cmp	w2, 0
-.LBE1891:
-.LBE1890:
-	.loc 1 2004 0
+.LBE1889:
+.LBE1888:
+	.loc 1 1978 0
 	ldr	x1, [x28, 152]
-.LBB1893:
-.LBB1892:
-	.loc 1 1833 0
-	ble	.L921
+.LBB1891:
+.LBB1890:
+	.loc 1 1807 0
+	ble	.L940
 	mov	x0, 0
-.LVL973:
+.LVL978:
 	.p2align 2
-.L922:
-	.loc 1 1835 0
+.L941:
+	.loc 1 1809 0
 	ldrb	w3, [x5], 2
-	.loc 1 1837 0
+	.loc 1 1811 0
 	ldrb	w4, [x5, -1]
 	and	w4, w4, -16
 	orr	w3, w4, w3, lsr 4
-	.loc 1 1838 0
+	.loc 1 1812 0
 	strb	w3, [x1, x0]
 	add	x0, x0, 1
-	.loc 1 1833 0
+	.loc 1 1807 0
 	cmp	w2, w0
-	bgt	.L922
-	b	.L1005
-.LVL974:
-.L1023:
-.LBE1892:
-.LBE1893:
-	.loc 1 1962 0
+	bgt	.L941
+	b	.L1025
+.LVL979:
+.L1065:
+.LBE1890:
+.LBE1891:
+	.loc 1 2115 0
+	mov	x0, 2
+	bl	ebc_notify
+.LVL980:
+	b	.L961
+.LVL981:
+.L1048:
+	.loc 1 1936 0
 	ldr	x5, [x2, 16]
 	ldr	w2, [x28, 20]
 	ldr	x1, [x28, 160]
-.LBB1894:
-.LBB1895:
-	.loc 1 1833 0
+.LBB1892:
+.LBB1893:
+	.loc 1 1807 0
 	cmp	w2, 0
-	ble	.L890
+	ble	.L909
 	mov	x0, 0
-.LVL975:
+.LVL982:
 	.p2align 2
-.L891:
-	.loc 1 1835 0
+.L910:
+	.loc 1 1809 0
 	ldrb	w3, [x5], 2
-	.loc 1 1837 0
+	.loc 1 1811 0
 	ldrb	w4, [x5, -1]
 	and	w4, w4, -16
 	orr	w3, w4, w3, lsr 4
-	.loc 1 1838 0
+	.loc 1 1812 0
 	strb	w3, [x1, x0]
 	add	x0, x0, 1
-	.loc 1 1833 0
+	.loc 1 1807 0
 	cmp	w2, w0
-	bgt	.L891
-	b	.L1004
-.LVL976:
-.L1045:
-.LBE1895:
-.LBE1894:
-	.loc 1 2143 0
-	mov	x0, 2
-	bl	ebc_notify
-.LVL977:
-	b	.L941
-.LVL978:
-.L1044:
-	.loc 1 1981 0
+	bgt	.L910
+	b	.L1024
+.LVL983:
+.L1064:
+.LBE1893:
+.LBE1892:
+	.loc 1 1955 0
 	mov	x0, x20
-	bl	ebc_power_set.constprop.16
-.LVL979:
-	b	.L918
-.LVL980:
-.L1041:
-.LBB1896:
-.LBB1885:
-.LBB1886:
-	.loc 1 1937 0 discriminator 1
+	bl	ebc_power_set.constprop.17
+.LVL984:
+	b	.L937
+.LVL985:
+.L1061:
+.LBB1894:
+.LBB1882:
+.LBB1883:
+	.loc 1 1911 0 discriminator 1
 	add	x26, x22, 352
-.LVL981:
-.LBE1886:
+.LVL986:
+.LBE1883:
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL982:
-	b	.L879
+.LVL987:
+	b	.L898
 	.p2align 3
-.L1046:
-.LVL983:
-.LBB1887:
-	.loc 1 1937 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L876
-	.loc 1 1937 0 discriminator 7
+.L1066:
+.LVL988:
+.LBB1884:
+	.loc 1 1911 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L895
+	.loc 1 1911 0 discriminator 7
 	bl	schedule
-.LVL984:
-.L879:
-	.loc 1 1937 0 discriminator 9
+.LVL989:
+.L898:
+	.loc 1 1911 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x26
 	bl	prepare_to_wait_event
-.LVL985:
+.LVL990:
 	ldr	w1, [x28, 92]
-	cbz	w1, .L1046
-.LBE1887:
-	.loc 1 1937 0 discriminator 4
+	cbz	w1, .L1066
+.LBE1884:
+	.loc 1 1911 0 discriminator 4
 	mov	x0, x26
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL986:
-	b	.L876
-.LVL987:
-.L1013:
-.LBE1885:
-.LBE1896:
-	.loc 1 1882 0 is_stmt 1
+.LVL991:
+	b	.L895
+.LVL992:
+.L1032:
+.LBE1882:
+.LBE1894:
+	.loc 1 1856 0 is_stmt 1
 	str	wzr, [x28, 616]
-	.loc 1 1883 0
+	.loc 1 1857 0
 	mov	x0, 3
 	bl	ebc_notify
-.LVL988:
-	.loc 1 1884 0
+.LVL993:
+	.loc 1 1858 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC82
-	add	x1, x1, :lo12:.LC82
+	adrp	x1, .LC83
+	add	x1, x1, :lo12:.LC83
 	bl	_dev_info
-.LVL989:
-	.loc 1 1887 0
+.LVL994:
+	.loc 1 1861 0
 	ldr	w2, [x20, 204]
-	.loc 1 1885 0
+	.loc 1 1859 0
 	add	x3, x21, :lo12:.LANCHOR0
-	.loc 1 1887 0
+	.loc 1 1861 0
 	ldr	w1, [x24, 64]
-	.loc 1 1885 0
+	.loc 1 1859 0
 	mov	w4, 1
-	.loc 1 1887 0
+	.loc 1 1861 0
 	ldr	x0, [x24, 16]
-	.loc 1 1886 0
+	.loc 1 1860 0
 	stp	w4, wzr, [x3, 16]
-	.loc 1 1887 0
-	bl	check_black_percent.isra.14
-.LVL990:
-	cbnz	w0, .L852
-	b	.L860
-.LVL991:
-.L1040:
-.LBB1897:
-.LBB1881:
-.LBB1882:
-	.loc 1 2113 0 discriminator 1
+	.loc 1 1861 0
+	bl	check_black_percent.isra.15
+.LVL995:
+	cbnz	w0, .L871
+	b	.L879
+.LVL996:
+.L1060:
+.LBB1895:
+.LBB1878:
+.LBB1879:
+	.loc 1 2085 0 discriminator 1
 	add	x27, x22, 352
-.LBE1882:
+.LBE1879:
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL992:
-	b	.L938
+.LVL997:
+	b	.L958
 	.p2align 3
-.L1047:
-.LVL993:
-.LBB1883:
-	.loc 1 2113 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L935
-	.loc 1 2113 0 discriminator 7
+.L1067:
+.LVL998:
+.LBB1880:
+	.loc 1 2085 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L955
+	.loc 1 2085 0 discriminator 7
 	bl	schedule
-.LVL994:
-.L938:
-	.loc 1 2113 0 discriminator 9
+.LVL999:
+.L958:
+	.loc 1 2085 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x27
 	bl	prepare_to_wait_event
-.LVL995:
+.LVL1000:
 	ldr	w1, [x28, 92]
-	cbz	w1, .L1047
-.LBE1883:
-	.loc 1 2113 0 discriminator 4
+	cbz	w1, .L1067
+.LBE1880:
+	.loc 1 2085 0 discriminator 4
 	mov	x0, x27
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL996:
-	b	.L935
-.LVL997:
-.L1016:
-.LBE1881:
-.LBE1897:
-.LBB1898:
-.LBB1899:
+.LVL1001:
+	b	.L955
+.LVL1002:
+.L1035:
+.LBE1878:
+.LBE1895:
+.LBB1896:
+.LBB1897:
 	mov	w1, 0
 	mov	x0, x20
-	bl	ebc_power_set.part.12
-.LVL998:
-	b	.L854
-.L866:
-.LBE1899:
-.LBE1898:
-	.loc 1 1908 0 is_stmt 1
+	bl	ebc_power_set.part.13
+.LVL1003:
+	b	.L873
+.L885:
+.LBE1897:
+.LBE1896:
+	.loc 1 1882 0 is_stmt 1
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x24, 16]
 	ldr	x0, [x28, 160]
 	bl	memcpy
-.LVL999:
-	b	.L868
-.LVL1000:
-.L1043:
-	.loc 1 2021 0
+.LVL1004:
+	b	.L887
+.LVL1005:
+.L1063:
+	.loc 1 1995 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC90
-	add	x1, x1, :lo12:.LC90
+	adrp	x1, .LC91
+	add	x1, x1, :lo12:.LC91
 	bl	_dev_err
-.LVL1001:
-	.loc 1 2022 0
-	b	.L897
-.L1042:
-	.loc 1 2019 0
+.LVL1006:
+	.loc 1 1996 0
+	b	.L916
+.L1062:
+	.loc 1 1993 0
 	mov	x0, x20
-	bl	ebc_power_set.constprop.16
-.LVL1002:
-	b	.L924
-.LVL1003:
-.L1038:
-	.loc 1 1920 0
+	bl	ebc_power_set.constprop.17
+.LVL1007:
+	b	.L943
+.LVL1008:
+.L1058:
+	.loc 1 1894 0
 	mov	x0, x20
-	bl	ebc_power_set.constprop.16
-.LVL1004:
-	b	.L871
-.L1017:
-	.loc 1 2181 0
+	bl	ebc_power_set.constprop.17
+.LVL1009:
+	b	.L890
+.L1036:
+	.loc 1 2153 0
 	bl	__stack_chk_fail
-.LVL1005:
+.LVL1010:
 	.cfi_endproc
-.LFE2836:
+.LFE2837:
 	.size	ebc_thread, .-ebc_thread
 	.data
 	.align	3
@@ -11367,7 +11469,7 @@ ebc_driver:
 	.xword	ebc_probe
 	.xword	ebc_remove
 	.zero	24
-	.xword	.LC97
+	.xword	.LC98
 	.zero	32
 	.xword	ebc_match
 	.zero	64
@@ -11403,25 +11505,18 @@ ebc_wq:
 	.zero	4
 	.xword	ebc_wq+8
 	.xword	ebc_wq+8
-	.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
 	.type	waveform_misc, %object
 	.size	waveform_misc, 80
 waveform_misc:
 	.word	244
 	.zero	4
-	.xword	.LC105
+	.xword	.LC106
 	.xword	waveform_ops
 	.zero	56
 	.type	dev_attr_waveform_version, %object
 	.size	dev_attr_waveform_version, 32
 dev_attr_waveform_version:
-	.xword	.LC104
+	.xword	.LC105
 	.hword	292
 	.zero	6
 	.xword	waveform_version_read
@@ -11429,7 +11524,7 @@ dev_attr_waveform_version:
 	.type	dev_attr_pmic_name, %object
 	.size	dev_attr_pmic_name, 32
 dev_attr_pmic_name:
-	.xword	.LC103
+	.xword	.LC104
 	.hword	292
 	.zero	6
 	.xword	pmic_name_read
@@ -11437,7 +11532,7 @@ dev_attr_pmic_name:
 	.type	dev_attr_pmic_temp, %object
 	.size	dev_attr_pmic_temp, 32
 dev_attr_pmic_temp:
-	.xword	.LC102
+	.xword	.LC103
 	.hword	292
 	.zero	6
 	.xword	pmic_temp_read
@@ -11445,7 +11540,7 @@ dev_attr_pmic_temp:
 	.type	dev_attr_pmic_vcom, %object
 	.size	dev_attr_pmic_vcom, 32
 dev_attr_pmic_vcom:
-	.xword	.LC101
+	.xword	.LC102
 	.hword	420
 	.zero	6
 	.xword	pmic_vcom_read
@@ -11453,7 +11548,7 @@ dev_attr_pmic_vcom:
 	.type	dev_attr_ebc_version, %object
 	.size	dev_attr_ebc_version, 32
 dev_attr_ebc_version:
-	.xword	.LC100
+	.xword	.LC101
 	.hword	292
 	.zero	6
 	.xword	ebc_version_read
@@ -11461,7 +11556,7 @@ dev_attr_ebc_version:
 	.type	dev_attr_ebc_state, %object
 	.size	dev_attr_ebc_state, 32
 dev_attr_ebc_state:
-	.xword	.LC99
+	.xword	.LC100
 	.hword	292
 	.zero	6
 	.xword	ebc_state_read
@@ -11469,7 +11564,7 @@ dev_attr_ebc_state:
 	.type	dev_attr_ebc_buf_state, %object
 	.size	dev_attr_ebc_buf_state, 32
 dev_attr_ebc_buf_state:
-	.xword	.LC98
+	.xword	.LC99
 	.hword	292
 	.zero	6
 	.xword	ebc_buf_state_read
@@ -11484,6 +11579,13 @@ auto_buf_sema:
 	.word	0
 	.xword	0
 	.zero	8
+	.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
@@ -11506,24 +11608,24 @@ resume_frame_count:
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.35192, %object
-	.size	__func__.35192, 11
-__func__.35192:
+	.type	__func__.35197, %object
+	.size	__func__.35197, 11
+__func__.35197:
 	.string	"ebc_io_ctl"
 	.align	3
 	.set	.LANCHOR3,. + 0
-	.type	__func__.34953, %object
-	.size	__func__.34953, 16
-__func__.34953:
+	.type	__func__.34956, %object
+	.size	__func__.34956, 16
+__func__.34956:
 	.string	"ebc_frame_start"
-	.type	__func__.35502, %object
-	.size	__func__.35502, 12
-__func__.35502:
+	.type	__func__.35507, %object
+	.size	__func__.35507, 12
+__func__.35507:
 	.string	"ebc_suspend"
 	.zero	4
-	.type	__func__.35436, %object
-	.size	__func__.35436, 19
-__func__.35436:
+	.type	__func__.35441, %object
+	.size	__func__.35441, 19
+__func__.35441:
 	.string	"ebc_lut_table_init"
 	.zero	5
 	.type	ebc_match, %object
@@ -11563,9 +11665,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init3119, %object
-	.size	__addressable_ebc_init3119, 8
-__addressable_ebc_init3119:
+	.type	__addressable_ebc_init3091, %object
+	.size	__addressable_ebc_init3091, 8
+__addressable_ebc_init3091:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -11623,7 +11725,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC16:
-	.string	"2.16"
+	.string	"2.17"
 	.zero	3
 .LC17:
 	.string	"%s\n"
@@ -11813,74 +11915,77 @@ __exitcall_ebc_exit:
 	.string	"ebc hw power on\n"
 	.zero	7
 .LC82:
+	.string	"ebc_info->auto_need_refresh == 0, check again\n"
+	.zero	1
+.LC83:
 	.string	"early resume\n"
 	.zero	2
-.LC83:
+.LC84:
 	.string	"refresh suspend logo\n"
 	.zero	2
-.LC84:
+.LC85:
 	.string	"overlay mode start, update background, frame_total=%d\n"
 	.zero	1
-.LC85:
+.LC86:
 	.string	"change display mode from %d to %d\n"
 	.zero	5
-.LC86:
+.LC87:
 	.string	"ebc is busy now, waiting prev refresh mode end...\n"
 	.zero	5
-.LC87:
+.LC88:
 	.string	"prev refresh mode end\n"
 	.zero	1
-.LC88:
+.LC89:
 	.string	"overlay disabled, drop EPD_OVERLAY frame\n"
 	.zero	6
-.LC89:
-	.string	"overlay mode start, frame_total=%d\n"
-	.zero	4
 .LC90:
+	.string	"overlay mode start, frame_total=%d, bw_frame = %d\n"
+	.zero	5
+.LC91:
 	.string	"ebc_lut_update err\n"
 	.zero	4
-.LC91:
+.LC92:
 	.string	"auto mode start, frame_total=%d\n"
 	.zero	7
-.LC92:
+.LC93:
 	.string	"frame start, mode = %d, framecount = %d\n"
 	.zero	7
-.LC93:
+.LC94:
 	.string	"ebc buffer mode %d error!!!\n"
 	.zero	3
-.LC94:
+.LC95:
 	.string	"power off\n"
 	.zero	5
-.LC95:
+.LC96:
 	.string	"early suspend\n"
 	.zero	1
-.LC96:
+.LC97:
 	.string	"check_part_mode==0, no need refresh\n"
 	.zero	3
-.LC97:
-	.string	"ebc-dev"
 .LC98:
+	.string	"ebc-dev"
+.LC99:
 	.string	"ebc_buf_state"
 	.zero	2
-.LC99:
+.LC100:
 	.string	"ebc_state"
 	.zero	6
-.LC100:
+.LC101:
 	.string	"ebc_version"
 	.zero	4
-.LC101:
+.LC102:
 	.string	"pmic_vcom"
 	.zero	6
-.LC102:
+.LC103:
 	.string	"pmic_temp"
 	.zero	6
-.LC103:
+.LC104:
 	.string	"pmic_name"
 	.zero	6
-.LC104:
+.LC105:
 	.string	"waveform_version"
 	.zero	7
-.LC105:
+.LC106:
 	.string	"waveform"
 	.text
 .Letext0:
@@ -12082,16 +12187,16 @@ __exitcall_ebc_exit:
 	.file 214 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x153e6
+	.4byte	0x1545d
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF3336
-	.byte	0x1
-	.4byte	.LASF3337
 	.4byte	.LASF3338
-	.4byte	.Ldebug_ranges0+0x1300
+	.byte	0x1
+	.4byte	.LASF3339
+	.4byte	.LASF3340
+	.4byte	.Ldebug_ranges0+0x12c0
 	.8byte	0
 	.4byte	.Ldebug_line0
 	.uleb128 0x2
@@ -18035,7 +18140,7 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.uleb128 0x8
 	.4byte	.LASF792
-	.byte	0xd
+	.byte	0x12
 	.byte	0x16
 	.4byte	0x31f4
 	.uleb128 0x7
@@ -18052,36 +18157,36 @@ __exitcall_ebc_exit:
 	.uleb128 0xd
 	.4byte	.LASF793
 	.byte	0x30
-	.byte	0xd
+	.byte	0x12
 	.byte	0x67
 	.4byte	0x3254
 	.uleb128 0xe
 	.4byte	.LASF794
-	.byte	0xd
+	.byte	0x12
 	.byte	0x68
 	.4byte	0x558
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF361
-	.byte	0xd
+	.byte	0x12
 	.byte	0x69
 	.4byte	0x3a7
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF71
-	.byte	0xd
+	.byte	0x12
 	.byte	0x6a
 	.4byte	0x31e9
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF130
-	.byte	0xd
+	.byte	0x12
 	.byte	0x6e
 	.4byte	0x15a
 	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF131
-	.byte	0xd
+	.byte	0x12
 	.byte	0x6f
 	.4byte	0x15a
 	.byte	0x28
@@ -18089,7 +18194,7 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.byte	0x8
 	.4byte	0x199
-	.byte	0xd
+	.byte	0x12
 	.byte	0x1f
 	.4byte	0x331a
 	.uleb128 0xc
@@ -18188,7 +18293,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x38
 	.byte	0x4
 	.4byte	0x6d
-	.byte	0xd
+	.byte	0x12
 	.2byte	0x13a
 	.4byte	0x3395
 	.uleb128 0xc
@@ -18236,37 +18341,37 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x15
 	.4byte	.LASF839
-	.byte	0xd
+	.byte	0x12
 	.2byte	0x187
 	.4byte	0x331f
 	.uleb128 0x15
 	.4byte	.LASF840
-	.byte	0xd
+	.byte	0x12
 	.2byte	0x188
 	.4byte	0x331f
 	.uleb128 0x15
 	.4byte	.LASF841
-	.byte	0xd
+	.byte	0x12
 	.2byte	0x189
 	.4byte	0x331f
 	.uleb128 0x15
 	.4byte	.LASF842
-	.byte	0xd
+	.byte	0x12
 	.2byte	0x18a
 	.4byte	0x331f
 	.uleb128 0x15
 	.4byte	.LASF843
-	.byte	0xd
+	.byte	0x12
 	.2byte	0x18b
 	.4byte	0x331f
 	.uleb128 0x15
 	.4byte	.LASF844
-	.byte	0xd
+	.byte	0x12
 	.2byte	0x18c
 	.4byte	0x331f
 	.uleb128 0x15
 	.4byte	.LASF845
-	.byte	0xd
+	.byte	0x12
 	.2byte	0x18d
 	.4byte	0x331f
 	.uleb128 0xd
@@ -30317,78 +30422,78 @@ __exitcall_ebc_exit:
 	.uleb128 0xd
 	.4byte	.LASF2096
 	.byte	0x60
-	.byte	0xf
+	.byte	0xd
 	.byte	0x14
 	.4byte	0x9859
 	.uleb128 0xe
 	.4byte	.LASF1895
-	.byte	0xf
+	.byte	0xd
 	.byte	0x15
 	.4byte	0x351
 	.byte	0
 	.uleb128 0x20
 	.string	"end"
-	.byte	0xf
+	.byte	0xd
 	.byte	0x16
 	.4byte	0x351
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF265
-	.byte	0xf
+	.byte	0xd
 	.byte	0x17
 	.4byte	0x56
 	.byte	0x10
 	.uleb128 0xe
 	.4byte	.LASF171
-	.byte	0xf
+	.byte	0xd
 	.byte	0x18
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF772
-	.byte	0xf
+	.byte	0xd
 	.byte	0x19
 	.4byte	0x29
 	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF640
-	.byte	0xf
+	.byte	0xd
 	.byte	0x1a
 	.4byte	0x985e
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF642
-	.byte	0xf
+	.byte	0xd
 	.byte	0x1a
 	.4byte	0x985e
 	.byte	0x30
 	.uleb128 0xe
 	.4byte	.LASF2048
-	.byte	0xf
+	.byte	0xd
 	.byte	0x1a
 	.4byte	0x985e
 	.byte	0x38
 	.uleb128 0xe
 	.4byte	.LASF130
-	.byte	0xf
+	.byte	0xd
 	.byte	0x1c
 	.4byte	0x15a
 	.byte	0x40
 	.uleb128 0xe
 	.4byte	.LASF131
-	.byte	0xf
+	.byte	0xd
 	.byte	0x1d
 	.4byte	0x15a
 	.byte	0x48
 	.uleb128 0xe
 	.4byte	.LASF132
-	.byte	0xf
+	.byte	0xd
 	.byte	0x1e
 	.4byte	0x15a
 	.byte	0x50
 	.uleb128 0xe
 	.4byte	.LASF133
-	.byte	0xf
+	.byte	0xd
 	.byte	0x1f
 	.4byte	0x15a
 	.byte	0x58
@@ -30400,12 +30505,12 @@ __exitcall_ebc_exit:
 	.4byte	0x97bc
 	.uleb128 0x19
 	.4byte	.LASF2097
-	.byte	0xf
+	.byte	0xd
 	.byte	0xaf
 	.4byte	0x97bc
 	.uleb128 0x19
 	.4byte	.LASF2098
-	.byte	0xf
+	.byte	0xd
 	.byte	0xb0
 	.4byte	0x97bc
 	.uleb128 0x32
@@ -34326,84 +34431,84 @@ __exitcall_ebc_exit:
 	.uleb128 0xd
 	.4byte	.LASF2434
 	.byte	0xf0
-	.byte	0xe
+	.byte	0xc
 	.byte	0x33
 	.4byte	0xb8ff
 	.uleb128 0xe
 	.4byte	.LASF265
-	.byte	0xe
+	.byte	0xc
 	.byte	0x34
 	.4byte	0x56
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF193
-	.byte	0xe
+	.byte	0xc
 	.byte	0x35
 	.4byte	0x56
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF2435
-	.byte	0xe
+	.byte	0xc
 	.byte	0x36
 	.4byte	0xbcd0
 	.byte	0x10
 	.uleb128 0xe
 	.4byte	.LASF2436
-	.byte	0xe
+	.byte	0xc
 	.byte	0x37
 	.4byte	0x56
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF2237
-	.byte	0xe
+	.byte	0xc
 	.byte	0x38
 	.4byte	0xb4b3
 	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF2437
-	.byte	0xe
+	.byte	0xc
 	.byte	0x3a
 	.4byte	0xbd24
 	.byte	0x58
 	.uleb128 0xe
 	.4byte	.LASF2438
-	.byte	0xe
+	.byte	0xc
 	.byte	0x3b
 	.4byte	0xbd24
 	.byte	0x60
 	.uleb128 0xe
 	.4byte	.LASF640
-	.byte	0xe
+	.byte	0xc
 	.byte	0x3c
 	.4byte	0xb904
 	.byte	0x68
 	.uleb128 0xe
 	.4byte	.LASF2048
-	.byte	0xe
+	.byte	0xc
 	.byte	0x3d
 	.4byte	0xb904
 	.byte	0x70
 	.uleb128 0xe
 	.4byte	.LASF642
-	.byte	0xe
+	.byte	0xc
 	.byte	0x3e
 	.4byte	0xb904
 	.byte	0x78
 	.uleb128 0xe
 	.4byte	.LASF2160
-	.byte	0xe
+	.byte	0xc
 	.byte	0x40
 	.4byte	0x9177
 	.byte	0x80
 	.uleb128 0xe
 	.4byte	.LASF2439
-	.byte	0xe
+	.byte	0xc
 	.byte	0x42
 	.4byte	0x29
 	.byte	0xe0
 	.uleb128 0xe
 	.4byte	.LASF794
-	.byte	0xe
+	.byte	0xc
 	.byte	0x43
 	.4byte	0x458
 	.byte	0xe8
@@ -34861,42 +34966,42 @@ __exitcall_ebc_exit:
 	.4byte	0x14a
 	.uleb128 0x8
 	.4byte	.LASF2435
-	.byte	0xe
+	.byte	0xc
 	.byte	0x1c
 	.4byte	0x13f
 	.uleb128 0xd
 	.4byte	.LASF2468
 	.byte	0x58
-	.byte	0xe
+	.byte	0xc
 	.byte	0x1f
 	.4byte	0xbd24
 	.uleb128 0xe
 	.4byte	.LASF265
-	.byte	0xe
+	.byte	0xc
 	.byte	0x20
 	.4byte	0x21e
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF2469
-	.byte	0xe
+	.byte	0xc
 	.byte	0x21
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF2470
-	.byte	0xe
+	.byte	0xc
 	.byte	0x22
 	.4byte	0x458
 	.byte	0x10
 	.uleb128 0xe
 	.4byte	.LASF64
-	.byte	0xe
+	.byte	0xc
 	.byte	0x23
 	.4byte	0xbd24
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF2129
-	.byte	0xe
+	.byte	0xc
 	.byte	0x2b
 	.4byte	0x9f8a
 	.byte	0x20
@@ -34912,37 +35017,37 @@ __exitcall_ebc_exit:
 	.4byte	0x23f
 	.uleb128 0x19
 	.4byte	.LASF2471
-	.byte	0xe
+	.byte	0xc
 	.byte	0x6a
 	.4byte	0xa152
 	.uleb128 0x19
 	.4byte	.LASF2472
-	.byte	0xe
+	.byte	0xc
 	.byte	0x6b
 	.4byte	0xbac9
 	.uleb128 0x19
 	.4byte	.LASF2473
-	.byte	0xe
+	.byte	0xc
 	.byte	0x87
 	.4byte	0xb904
 	.uleb128 0x19
 	.4byte	.LASF2474
-	.byte	0xe
+	.byte	0xc
 	.byte	0x88
 	.4byte	0xb904
 	.uleb128 0x19
 	.4byte	.LASF2475
-	.byte	0xe
+	.byte	0xc
 	.byte	0x89
 	.4byte	0xb904
 	.uleb128 0x19
 	.4byte	.LASF2476
-	.byte	0xe
+	.byte	0xc
 	.byte	0x8a
 	.4byte	0xb904
 	.uleb128 0x19
 	.4byte	.LASF2477
-	.byte	0xe
+	.byte	0xc
 	.byte	0x8b
 	.4byte	0xe33
 	.uleb128 0xd
@@ -38123,14 +38228,14 @@ __exitcall_ebc_exit:
 	.4byte	0x24a7
 	.uleb128 0x19
 	.4byte	.LASF2845
-	.byte	0x12
+	.byte	0x11
 	.byte	0x8c
 	.4byte	0x2b0
 	.uleb128 0x1e
 	.4byte	.LASF2846
 	.byte	0x4
 	.4byte	0x6d
-	.byte	0x12
+	.byte	0x11
 	.2byte	0x130
 	.4byte	0xd837
 	.uleb128 0xc
@@ -38155,7 +38260,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x15
 	.4byte	.LASF2850
-	.byte	0x12
+	.byte	0x11
 	.2byte	0x13b
 	.4byte	0xd837
 	.uleb128 0xb
@@ -39801,7 +39906,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3028
 	.byte	0x1
-	.2byte	0x732
+	.2byte	0x718
 	.4byte	0xc6
 	.uleb128 0x9
 	.byte	0x3
@@ -39809,7 +39914,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3029
 	.byte	0x1
-	.2byte	0x733
+	.2byte	0x719
 	.4byte	0xc6
 	.uleb128 0x9
 	.byte	0x3
@@ -39817,7 +39922,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0x9cf
+	.2byte	0x9b3
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
@@ -39825,7 +39930,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0x9d9
+	.2byte	0x9bd
 	.4byte	0xc680
 	.uleb128 0x9
 	.byte	0x3
@@ -39833,7 +39938,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0x9f6
+	.2byte	0x9da
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
@@ -39841,7 +39946,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0x9fc
+	.2byte	0x9e0
 	.4byte	0xc680
 	.uleb128 0x9
 	.byte	0x3
@@ -39849,7 +39954,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0xa0b
+	.2byte	0x9ef
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -39857,7 +39962,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0xa16
+	.2byte	0x9fa
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -39865,7 +39970,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0xa24
+	.2byte	0xa08
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -39873,7 +39978,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0xa47
+	.2byte	0xa2b
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -39881,7 +39986,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0xa51
+	.2byte	0xa35
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -39889,7 +39994,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0xa5a
+	.2byte	0xa3e
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -39897,7 +40002,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0xa63
+	.2byte	0xa47
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -39905,7 +40010,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0xc10
+	.2byte	0xbf4
 	.4byte	0xa5cc
 	.uleb128 0x9
 	.byte	0x3
@@ -39922,7 +40027,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0xc15
+	.2byte	0xbf9
 	.4byte	0xe71f
 	.uleb128 0x9
 	.byte	0x3
@@ -39930,7 +40035,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0xc1b
+	.2byte	0xbff
 	.4byte	0xd70e
 	.uleb128 0x9
 	.byte	0x3
@@ -39938,15 +40043,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0xc2f
+	.2byte	0xc13
 	.4byte	0x458
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init3119
+	.8byte	__addressable_ebc_init3091
 	.uleb128 0x4d
 	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0xc30
+	.2byte	0xc14
 	.4byte	0x4ac
 	.uleb128 0x9
 	.byte	0x3
@@ -39954,79 +40059,79 @@ __exitcall_ebc_exit:
 	.uleb128 0x4e
 	.4byte	.LASF3096
 	.byte	0x1
-	.2byte	0xc2a
-	.8byte	.LFB2865
-	.8byte	.LFE2865-.LFB2865
+	.2byte	0xc0e
+	.8byte	.LFB2866
+	.8byte	.LFE2866-.LFB2866
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe7a8
 	.uleb128 0x4f
-	.8byte	.LVL66
-	.4byte	0x150b7
+	.8byte	.LVL64
+	.4byte	0x1512e
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0xc25
+	.2byte	0xc09
 	.4byte	0xc6
-	.8byte	.LFB2864
-	.8byte	.LFE2864-.LFB2864
+	.8byte	.LFB2865
+	.8byte	.LFE2865-.LFB2865
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe7d8
 	.uleb128 0x4f
-	.8byte	.LVL360
-	.4byte	0x150c3
+	.8byte	.LVL358
+	.4byte	0x1513a
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0xc04
+	.2byte	0xbe8
 	.4byte	0xc6
-	.8byte	.LFB2863
-	.8byte	.LFE2863-.LFB2863
+	.8byte	.LFB2864
+	.8byte	.LFE2864-.LFB2864
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe874
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xc04
+	.2byte	0xbe8
 	.4byte	0xa5e0
-	.4byte	.LLST13
+	.4byte	.LLST11
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xc06
+	.2byte	0xbea
 	.4byte	0xe557
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xc07
+	.2byte	0xbeb
 	.4byte	0xe874
 	.uleb128 0x54
-	.4byte	0x14982
-	.8byte	.LBB950
-	.8byte	.LBE950-.LBB950
+	.4byte	0x149f9
+	.8byte	.LBB952
+	.8byte	.LBE952-.LBB952
 	.byte	0x1
-	.2byte	0xc06
+	.2byte	0xbea
 	.4byte	0xe844
 	.uleb128 0x55
-	.4byte	0x14993
+	.4byte	0x14a0a
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14557
-	.8byte	.LBB952
-	.8byte	.LBE952-.LBB952
+	.4byte	0x145c1
+	.8byte	.LBB954
+	.8byte	.LBE954-.LBB954
 	.byte	0x1
-	.2byte	0xc09
+	.2byte	0xbed
 	.4byte	0xe866
 	.uleb128 0x55
-	.4byte	0x14564
+	.4byte	0x145ce
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL70
-	.4byte	0x150cf
+	.8byte	.LVL68
+	.4byte	0x15146
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -40034,82 +40139,82 @@ __exitcall_ebc_exit:
 	.uleb128 0x51
 	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0xbf3
+	.2byte	0xbd7
 	.4byte	0xc6
-	.8byte	.LFB2862
-	.8byte	.LFE2862-.LFB2862
+	.8byte	.LFB2863
+	.8byte	.LFE2863-.LFB2863
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe981
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xbf3
+	.2byte	0xbd7
 	.4byte	0xa5e0
-	.4byte	.LLST195
+	.4byte	.LLST192
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xbf5
+	.2byte	0xbd9
 	.4byte	0xe557
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xbf6
+	.2byte	0xbda
 	.4byte	0xe874
 	.uleb128 0x56
 	.4byte	.LASF3050
 	.4byte	0xe991
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35502
+	.8byte	__func__.35507
 	.uleb128 0x54
-	.4byte	0x14982
-	.8byte	.LBB1493
-	.8byte	.LBE1493-.LBB1493
+	.4byte	0x149f9
+	.8byte	.LBB1482
+	.8byte	.LBE1482-.LBB1482
 	.byte	0x1
-	.2byte	0xbf5
+	.2byte	0xbd9
 	.4byte	0xe8f9
 	.uleb128 0x55
-	.4byte	0x14993
+	.4byte	0x14a0a
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14571
-	.8byte	.LBB1495
-	.8byte	.LBE1495-.LBB1495
+	.4byte	0x145db
+	.8byte	.LBB1484
+	.8byte	.LBE1484-.LBB1484
 	.byte	0x1
-	.2byte	0xbfe
+	.2byte	0xbe2
 	.4byte	0xe91b
 	.uleb128 0x55
-	.4byte	0x1457e
+	.4byte	0x145e8
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1421e
-	.8byte	.LBB1497
-	.8byte	.LBE1497-.LBB1497
+	.4byte	0x14288
+	.8byte	.LBB1486
+	.8byte	.LBE1486-.LBB1486
 	.byte	0x1
-	.2byte	0xbfa
+	.2byte	0xbde
 	.4byte	0xe966
 	.uleb128 0x55
-	.4byte	0x14239
+	.4byte	0x142a3
 	.uleb128 0x55
-	.4byte	0x1422e
+	.4byte	0x14298
 	.uleb128 0x57
-	.8byte	.LBB1498
-	.8byte	.LBE1498-.LBB1498
+	.8byte	.LBB1487
+	.8byte	.LBE1487-.LBB1487
 	.uleb128 0x58
-	.4byte	0x14245
+	.4byte	0x142af
 	.uleb128 0x4f
-	.8byte	.LVL608
-	.4byte	0x14ee6
+	.8byte	.LVL589
+	.4byte	0x14f5d
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL606
-	.4byte	0x150cf
+	.8byte	.LVL587
+	.4byte	0x15146
 	.uleb128 0x4f
-	.8byte	.LVL607
-	.4byte	0x150cf
+	.8byte	.LVL588
+	.4byte	0x15146
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
@@ -40123,933 +40228,933 @@ __exitcall_ebc_exit:
 	.uleb128 0x50
 	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0xbec
+	.2byte	0xbd0
 	.4byte	0xc6
-	.8byte	.LFB2861
-	.8byte	.LFE2861-.LFB2861
+	.8byte	.LFB2862
+	.8byte	.LFE2862-.LFB2862
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe9d6
 	.uleb128 0x59
 	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0xbec
+	.2byte	0xbd0
 	.4byte	0xd78a
-	.4byte	.LLST15
+	.4byte	.LLST13
 	.uleb128 0x4f
-	.8byte	.LVL76
-	.4byte	0x150dc
+	.8byte	.LVL74
+	.4byte	0x15153
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0xb6b
+	.2byte	0xb4f
 	.4byte	0xc6
-	.8byte	.LFB2860
-	.8byte	.LFE2860-.LFB2860
+	.8byte	.LFB2861
+	.8byte	.LFE2861-.LFB2861
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xfdb3
 	.uleb128 0x59
 	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0xb6b
+	.2byte	0xb4f
 	.4byte	0xd78a
-	.4byte	.LLST198
+	.4byte	.LLST195
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xb6d
+	.2byte	0xb51
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0xb6e
+	.2byte	0xb52
 	.4byte	0xb904
 	.uleb128 0x5a
 	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0xb6f
+	.2byte	0xb53
 	.4byte	0xd78a
-	.4byte	.LLST199
+	.4byte	.LLST196
 	.uleb128 0x48
 	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0xb70
+	.2byte	0xb54
 	.4byte	0xb904
 	.uleb128 0x5a
 	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0xb71
+	.2byte	0xb55
 	.4byte	0xc0b3
-	.4byte	.LLST200
+	.4byte	.LLST197
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xb72
+	.2byte	0xb56
 	.4byte	0xe557
 	.uleb128 0x5a
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xb73
+	.2byte	0xb57
 	.4byte	0xe874
-	.4byte	.LLST201
+	.4byte	.LLST198
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xb74
+	.2byte	0xb58
 	.4byte	0xe1f4
 	.uleb128 0x5a
 	.4byte	.LASF976
 	.byte	0x1
-	.2byte	0xb75
+	.2byte	0xb59
 	.4byte	0xbd30
-	.4byte	.LLST202
+	.4byte	.LLST199
 	.uleb128 0x48
 	.4byte	.LASF2435
 	.byte	0x1
-	.2byte	0xb76
+	.2byte	0xb5a
 	.4byte	0xbcd0
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xb77
+	.2byte	0xb5b
 	.4byte	0xc6
 	.uleb128 0x5a
 	.4byte	.LASF1001
 	.byte	0x1
-	.2byte	0xb78
+	.2byte	0xb5c
 	.4byte	0xc6
-	.4byte	.LLST203
+	.4byte	.LLST200
 	.uleb128 0x5b
 	.string	"i"
 	.byte	0x1
-	.2byte	0xb79
+	.2byte	0xb5d
 	.4byte	0xc6
-	.4byte	.LLST204
+	.4byte	.LLST201
 	.uleb128 0x5c
-	.4byte	0x149a0
-	.8byte	.LBB1643
-	.4byte	.Ldebug_ranges0+0xd50
+	.4byte	0x14a17
+	.8byte	.LBB1632
+	.4byte	.Ldebug_ranges0+0xcb0
 	.byte	0x1
-	.2byte	0xb7b
+	.2byte	0xb5f
 	.4byte	0xeaef
 	.uleb128 0x55
-	.4byte	0x149c9
+	.4byte	0x14a40
 	.uleb128 0x55
-	.4byte	0x149bd
+	.4byte	0x14a34
 	.uleb128 0x55
-	.4byte	0x149b1
+	.4byte	0x14a28
 	.uleb128 0x4f
-	.8byte	.LVL614
-	.4byte	0x150e8
+	.8byte	.LVL595
+	.4byte	0x1515f
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1487a
-	.8byte	.LBB1647
-	.8byte	.LBE1647-.LBB1647
+	.4byte	0x148f1
+	.8byte	.LBB1636
+	.8byte	.LBE1636-.LBB1636
 	.byte	0x1
-	.2byte	0xb8d
+	.2byte	0xb71
 	.4byte	0xeb2e
 	.uleb128 0x55
-	.4byte	0x1488a
+	.4byte	0x14901
 	.uleb128 0x5d
-	.4byte	0x14982
-	.8byte	.LBB1648
-	.8byte	.LBE1648-.LBB1648
+	.4byte	0x149f9
+	.8byte	.LBB1637
+	.8byte	.LBE1637-.LBB1637
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x55
-	.4byte	0x14993
+	.4byte	0x14a0a
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1489d
-	.8byte	.LBB1650
-	.8byte	.LBE1650-.LBB1650
+	.4byte	0x14914
+	.8byte	.LBB1639
+	.8byte	.LBE1639-.LBB1639
 	.byte	0x1
-	.2byte	0xba8
+	.2byte	0xb8c
 	.4byte	0xeb6e
 	.uleb128 0x55
-	.4byte	0x148ae
+	.4byte	0x14925
 	.uleb128 0x5e
-	.4byte	0x14982
-	.8byte	.LBB1651
-	.8byte	.LBE1651-.LBB1651
+	.4byte	0x149f9
+	.8byte	.LBB1640
+	.8byte	.LBE1640-.LBB1640
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x55
-	.4byte	0x14993
+	.4byte	0x14a0a
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0x117be
-	.8byte	.LBB1653
-	.4byte	.Ldebug_ranges0+0xd80
+	.8byte	.LBB1642
+	.4byte	.Ldebug_ranges0+0xce0
 	.byte	0x1
-	.2byte	0xbbc
+	.2byte	0xba0
 	.4byte	0xf543
 	.uleb128 0x55
 	.4byte	0x117cf
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xd80
+	.4byte	.Ldebug_ranges0+0xce0
 	.uleb128 0x58
 	.4byte	0x117db
 	.uleb128 0x5c
-	.4byte	0x148c1
-	.8byte	.LBB1655
-	.4byte	.Ldebug_ranges0+0xdd0
+	.4byte	0x14938
+	.8byte	.LBB1644
+	.4byte	.Ldebug_ranges0+0xd30
 	.byte	0x1
-	.2byte	0x8ae
+	.2byte	0x892
 	.4byte	0xebfe
 	.uleb128 0x55
-	.4byte	0x148e9
+	.4byte	0x14960
 	.uleb128 0x55
-	.4byte	0x148dd
+	.4byte	0x14954
 	.uleb128 0x55
-	.4byte	0x148d2
+	.4byte	0x14949
 	.uleb128 0x60
-	.4byte	0x148f6
-	.8byte	.LBB1656
-	.4byte	.Ldebug_ranges0+0xdd0
-	.byte	0xe
+	.4byte	0x1496d
+	.8byte	.LBB1645
+	.4byte	.Ldebug_ranges0+0xd30
+	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x1492a
+	.4byte	0x149a1
 	.uleb128 0x55
-	.4byte	0x1491e
+	.4byte	0x14995
 	.uleb128 0x55
-	.4byte	0x14912
+	.4byte	0x14989
 	.uleb128 0x55
-	.4byte	0x14907
+	.4byte	0x1497e
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xdd0
+	.4byte	.Ldebug_ranges0+0xd30
 	.uleb128 0x58
-	.4byte	0x14935
+	.4byte	0x149ac
 	.uleb128 0x4f
-	.8byte	.LVL639
-	.4byte	0x150f5
+	.8byte	.LVL620
+	.4byte	0x1516c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x148c1
-	.8byte	.LBB1667
-	.8byte	.LBE1667-.LBB1667
+	.4byte	0x14938
+	.8byte	.LBB1656
+	.8byte	.LBE1656-.LBB1656
 	.byte	0x1
-	.2byte	0x8b1
+	.2byte	0x895
 	.4byte	0xec7b
 	.uleb128 0x55
-	.4byte	0x148e9
+	.4byte	0x14960
 	.uleb128 0x55
-	.4byte	0x148dd
+	.4byte	0x14954
 	.uleb128 0x55
-	.4byte	0x148d2
+	.4byte	0x14949
 	.uleb128 0x5e
-	.4byte	0x148f6
-	.8byte	.LBB1668
-	.8byte	.LBE1668-.LBB1668
-	.byte	0xe
+	.4byte	0x1496d
+	.8byte	.LBB1657
+	.8byte	.LBE1657-.LBB1657
+	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x1492a
+	.4byte	0x149a1
 	.uleb128 0x55
-	.4byte	0x1491e
+	.4byte	0x14995
 	.uleb128 0x55
-	.4byte	0x14912
+	.4byte	0x14989
 	.uleb128 0x55
-	.4byte	0x14907
+	.4byte	0x1497e
 	.uleb128 0x57
-	.8byte	.LBB1669
-	.8byte	.LBE1669-.LBB1669
+	.8byte	.LBB1658
+	.8byte	.LBE1658-.LBB1658
 	.uleb128 0x58
-	.4byte	0x14935
+	.4byte	0x149ac
 	.uleb128 0x4f
-	.8byte	.LVL640
-	.4byte	0x150f5
+	.8byte	.LVL621
+	.4byte	0x1516c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x148c1
-	.8byte	.LBB1670
-	.8byte	.LBE1670-.LBB1670
+	.4byte	0x14938
+	.8byte	.LBB1659
+	.8byte	.LBE1659-.LBB1659
 	.byte	0x1
-	.2byte	0x8b4
+	.2byte	0x898
 	.4byte	0xecf8
 	.uleb128 0x55
-	.4byte	0x148e9
+	.4byte	0x14960
 	.uleb128 0x55
-	.4byte	0x148dd
+	.4byte	0x14954
 	.uleb128 0x55
-	.4byte	0x148d2
+	.4byte	0x14949
 	.uleb128 0x5e
-	.4byte	0x148f6
-	.8byte	.LBB1671
-	.8byte	.LBE1671-.LBB1671
-	.byte	0xe
+	.4byte	0x1496d
+	.8byte	.LBB1660
+	.8byte	.LBE1660-.LBB1660
+	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x1492a
+	.4byte	0x149a1
 	.uleb128 0x55
-	.4byte	0x1491e
+	.4byte	0x14995
 	.uleb128 0x55
-	.4byte	0x14912
+	.4byte	0x14989
 	.uleb128 0x55
-	.4byte	0x14907
+	.4byte	0x1497e
 	.uleb128 0x57
-	.8byte	.LBB1672
-	.8byte	.LBE1672-.LBB1672
+	.8byte	.LBB1661
+	.8byte	.LBE1661-.LBB1661
 	.uleb128 0x58
-	.4byte	0x14935
+	.4byte	0x149ac
 	.uleb128 0x4f
-	.8byte	.LVL641
-	.4byte	0x150f5
+	.8byte	.LVL622
+	.4byte	0x1516c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x148c1
-	.8byte	.LBB1673
-	.8byte	.LBE1673-.LBB1673
+	.4byte	0x14938
+	.8byte	.LBB1662
+	.8byte	.LBE1662-.LBB1662
 	.byte	0x1
-	.2byte	0x8b7
+	.2byte	0x89b
 	.4byte	0xed75
 	.uleb128 0x55
-	.4byte	0x148e9
+	.4byte	0x14960
 	.uleb128 0x55
-	.4byte	0x148dd
+	.4byte	0x14954
 	.uleb128 0x55
-	.4byte	0x148d2
+	.4byte	0x14949
 	.uleb128 0x5e
-	.4byte	0x148f6
-	.8byte	.LBB1674
-	.8byte	.LBE1674-.LBB1674
-	.byte	0xe
+	.4byte	0x1496d
+	.8byte	.LBB1663
+	.8byte	.LBE1663-.LBB1663
+	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x1492a
+	.4byte	0x149a1
 	.uleb128 0x55
-	.4byte	0x1491e
+	.4byte	0x14995
 	.uleb128 0x55
-	.4byte	0x14912
+	.4byte	0x14989
 	.uleb128 0x55
-	.4byte	0x14907
+	.4byte	0x1497e
 	.uleb128 0x57
-	.8byte	.LBB1675
-	.8byte	.LBE1675-.LBB1675
+	.8byte	.LBB1664
+	.8byte	.LBE1664-.LBB1664
 	.uleb128 0x58
-	.4byte	0x14935
+	.4byte	0x149ac
 	.uleb128 0x4f
-	.8byte	.LVL642
-	.4byte	0x150f5
+	.8byte	.LVL623
+	.4byte	0x1516c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x148c1
-	.8byte	.LBB1676
-	.8byte	.LBE1676-.LBB1676
+	.4byte	0x14938
+	.8byte	.LBB1665
+	.8byte	.LBE1665-.LBB1665
 	.byte	0x1
-	.2byte	0x8ba
+	.2byte	0x89e
 	.4byte	0xedf2
 	.uleb128 0x55
-	.4byte	0x148e9
+	.4byte	0x14960
 	.uleb128 0x55
-	.4byte	0x148dd
+	.4byte	0x14954
 	.uleb128 0x55
-	.4byte	0x148d2
+	.4byte	0x14949
 	.uleb128 0x5e
-	.4byte	0x148f6
-	.8byte	.LBB1677
-	.8byte	.LBE1677-.LBB1677
-	.byte	0xe
+	.4byte	0x1496d
+	.8byte	.LBB1666
+	.8byte	.LBE1666-.LBB1666
+	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x1492a
+	.4byte	0x149a1
 	.uleb128 0x55
-	.4byte	0x1491e
+	.4byte	0x14995
 	.uleb128 0x55
-	.4byte	0x14912
+	.4byte	0x14989
 	.uleb128 0x55
-	.4byte	0x14907
+	.4byte	0x1497e
 	.uleb128 0x57
-	.8byte	.LBB1678
-	.8byte	.LBE1678-.LBB1678
+	.8byte	.LBB1667
+	.8byte	.LBE1667-.LBB1667
 	.uleb128 0x58
-	.4byte	0x14935
+	.4byte	0x149ac
 	.uleb128 0x4f
-	.8byte	.LVL643
-	.4byte	0x150f5
+	.8byte	.LVL624
+	.4byte	0x1516c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x148c1
-	.8byte	.LBB1679
-	.8byte	.LBE1679-.LBB1679
+	.4byte	0x14938
+	.8byte	.LBB1668
+	.8byte	.LBE1668-.LBB1668
 	.byte	0x1
-	.2byte	0x8bd
+	.2byte	0x8a1
 	.4byte	0xee6f
 	.uleb128 0x55
-	.4byte	0x148e9
+	.4byte	0x14960
 	.uleb128 0x55
-	.4byte	0x148dd
+	.4byte	0x14954
 	.uleb128 0x55
-	.4byte	0x148d2
+	.4byte	0x14949
 	.uleb128 0x5e
-	.4byte	0x148f6
-	.8byte	.LBB1680
-	.8byte	.LBE1680-.LBB1680
-	.byte	0xe
+	.4byte	0x1496d
+	.8byte	.LBB1669
+	.8byte	.LBE1669-.LBB1669
+	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x1492a
+	.4byte	0x149a1
 	.uleb128 0x55
-	.4byte	0x1491e
+	.4byte	0x14995
 	.uleb128 0x55
-	.4byte	0x14912
+	.4byte	0x14989
 	.uleb128 0x55
-	.4byte	0x14907
+	.4byte	0x1497e
 	.uleb128 0x57
-	.8byte	.LBB1681
-	.8byte	.LBE1681-.LBB1681
+	.8byte	.LBB1670
+	.8byte	.LBE1670-.LBB1670
 	.uleb128 0x58
-	.4byte	0x14935
+	.4byte	0x149ac
 	.uleb128 0x4f
-	.8byte	.LVL644
-	.4byte	0x150f5
+	.8byte	.LVL625
+	.4byte	0x1516c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x148c1
-	.8byte	.LBB1682
-	.8byte	.LBE1682-.LBB1682
+	.4byte	0x14938
+	.8byte	.LBB1671
+	.8byte	.LBE1671-.LBB1671
 	.byte	0x1
-	.2byte	0x8c0
+	.2byte	0x8a4
 	.4byte	0xeeec
 	.uleb128 0x55
-	.4byte	0x148e9
+	.4byte	0x14960
 	.uleb128 0x55
-	.4byte	0x148dd
+	.4byte	0x14954
 	.uleb128 0x55
-	.4byte	0x148d2
+	.4byte	0x14949
 	.uleb128 0x5e
-	.4byte	0x148f6
-	.8byte	.LBB1683
-	.8byte	.LBE1683-.LBB1683
-	.byte	0xe
+	.4byte	0x1496d
+	.8byte	.LBB1672
+	.8byte	.LBE1672-.LBB1672
+	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x1492a
+	.4byte	0x149a1
 	.uleb128 0x55
-	.4byte	0x1491e
+	.4byte	0x14995
 	.uleb128 0x55
-	.4byte	0x14912
+	.4byte	0x14989
 	.uleb128 0x55
-	.4byte	0x14907
+	.4byte	0x1497e
 	.uleb128 0x57
-	.8byte	.LBB1684
-	.8byte	.LBE1684-.LBB1684
+	.8byte	.LBB1673
+	.8byte	.LBE1673-.LBB1673
 	.uleb128 0x58
-	.4byte	0x14935
+	.4byte	0x149ac
 	.uleb128 0x4f
-	.8byte	.LVL645
-	.4byte	0x150f5
+	.8byte	.LVL626
+	.4byte	0x1516c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x148c1
-	.8byte	.LBB1685
-	.8byte	.LBE1685-.LBB1685
+	.4byte	0x14938
+	.8byte	.LBB1674
+	.8byte	.LBE1674-.LBB1674
 	.byte	0x1
-	.2byte	0x8c3
+	.2byte	0x8a7
 	.4byte	0xef69
 	.uleb128 0x55
-	.4byte	0x148e9
+	.4byte	0x14960
 	.uleb128 0x55
-	.4byte	0x148dd
+	.4byte	0x14954
 	.uleb128 0x55
-	.4byte	0x148d2
+	.4byte	0x14949
 	.uleb128 0x5e
-	.4byte	0x148f6
-	.8byte	.LBB1686
-	.8byte	.LBE1686-.LBB1686
-	.byte	0xe
+	.4byte	0x1496d
+	.8byte	.LBB1675
+	.8byte	.LBE1675-.LBB1675
+	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x1492a
+	.4byte	0x149a1
 	.uleb128 0x55
-	.4byte	0x1491e
+	.4byte	0x14995
 	.uleb128 0x55
-	.4byte	0x14912
+	.4byte	0x14989
 	.uleb128 0x55
-	.4byte	0x14907
+	.4byte	0x1497e
 	.uleb128 0x57
-	.8byte	.LBB1687
-	.8byte	.LBE1687-.LBB1687
+	.8byte	.LBB1676
+	.8byte	.LBE1676-.LBB1676
 	.uleb128 0x58
-	.4byte	0x14935
+	.4byte	0x149ac
 	.uleb128 0x4f
-	.8byte	.LVL646
-	.4byte	0x150f5
+	.8byte	.LVL627
+	.4byte	0x1516c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x148c1
-	.8byte	.LBB1688
-	.8byte	.LBE1688-.LBB1688
+	.4byte	0x14938
+	.8byte	.LBB1677
+	.8byte	.LBE1677-.LBB1677
 	.byte	0x1
-	.2byte	0x8c6
+	.2byte	0x8aa
 	.4byte	0xefe6
 	.uleb128 0x55
-	.4byte	0x148e9
+	.4byte	0x14960
 	.uleb128 0x55
-	.4byte	0x148dd
+	.4byte	0x14954
 	.uleb128 0x55
-	.4byte	0x148d2
+	.4byte	0x14949
 	.uleb128 0x5e
-	.4byte	0x148f6
-	.8byte	.LBB1689
-	.8byte	.LBE1689-.LBB1689
-	.byte	0xe
+	.4byte	0x1496d
+	.8byte	.LBB1678
+	.8byte	.LBE1678-.LBB1678
+	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x1492a
+	.4byte	0x149a1
 	.uleb128 0x55
-	.4byte	0x1491e
+	.4byte	0x14995
 	.uleb128 0x55
-	.4byte	0x14912
+	.4byte	0x14989
 	.uleb128 0x55
-	.4byte	0x14907
+	.4byte	0x1497e
 	.uleb128 0x57
-	.8byte	.LBB1690
-	.8byte	.LBE1690-.LBB1690
+	.8byte	.LBB1679
+	.8byte	.LBE1679-.LBB1679
 	.uleb128 0x58
-	.4byte	0x14935
+	.4byte	0x149ac
 	.uleb128 0x4f
-	.8byte	.LVL647
-	.4byte	0x150f5
+	.8byte	.LVL628
+	.4byte	0x1516c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x148c1
-	.8byte	.LBB1691
-	.8byte	.LBE1691-.LBB1691
+	.4byte	0x14938
+	.8byte	.LBB1680
+	.8byte	.LBE1680-.LBB1680
 	.byte	0x1
-	.2byte	0x8c9
+	.2byte	0x8ad
 	.4byte	0xf063
 	.uleb128 0x55
-	.4byte	0x148e9
+	.4byte	0x14960
 	.uleb128 0x55
-	.4byte	0x148dd
+	.4byte	0x14954
 	.uleb128 0x55
-	.4byte	0x148d2
+	.4byte	0x14949
 	.uleb128 0x5e
-	.4byte	0x148f6
-	.8byte	.LBB1692
-	.8byte	.LBE1692-.LBB1692
-	.byte	0xe
+	.4byte	0x1496d
+	.8byte	.LBB1681
+	.8byte	.LBE1681-.LBB1681
+	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x1492a
+	.4byte	0x149a1
 	.uleb128 0x55
-	.4byte	0x1491e
+	.4byte	0x14995
 	.uleb128 0x55
-	.4byte	0x14912
+	.4byte	0x14989
 	.uleb128 0x55
-	.4byte	0x14907
+	.4byte	0x1497e
 	.uleb128 0x57
-	.8byte	.LBB1693
-	.8byte	.LBE1693-.LBB1693
+	.8byte	.LBB1682
+	.8byte	.LBE1682-.LBB1682
 	.uleb128 0x58
-	.4byte	0x14935
+	.4byte	0x149ac
 	.uleb128 0x4f
-	.8byte	.LVL648
-	.4byte	0x150f5
+	.8byte	.LVL629
+	.4byte	0x1516c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x148c1
-	.8byte	.LBB1694
-	.8byte	.LBE1694-.LBB1694
+	.4byte	0x14938
+	.8byte	.LBB1683
+	.8byte	.LBE1683-.LBB1683
 	.byte	0x1
-	.2byte	0x8cc
+	.2byte	0x8b0
 	.4byte	0xf0e0
 	.uleb128 0x55
-	.4byte	0x148e9
+	.4byte	0x14960
 	.uleb128 0x55
-	.4byte	0x148dd
+	.4byte	0x14954
 	.uleb128 0x55
-	.4byte	0x148d2
+	.4byte	0x14949
 	.uleb128 0x5e
-	.4byte	0x148f6
-	.8byte	.LBB1695
-	.8byte	.LBE1695-.LBB1695
-	.byte	0xe
+	.4byte	0x1496d
+	.8byte	.LBB1684
+	.8byte	.LBE1684-.LBB1684
+	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x1492a
+	.4byte	0x149a1
 	.uleb128 0x55
-	.4byte	0x1491e
+	.4byte	0x14995
 	.uleb128 0x55
-	.4byte	0x14912
+	.4byte	0x14989
 	.uleb128 0x55
-	.4byte	0x14907
+	.4byte	0x1497e
 	.uleb128 0x57
-	.8byte	.LBB1696
-	.8byte	.LBE1696-.LBB1696
+	.8byte	.LBB1685
+	.8byte	.LBE1685-.LBB1685
 	.uleb128 0x58
-	.4byte	0x14935
+	.4byte	0x149ac
 	.uleb128 0x4f
-	.8byte	.LVL649
-	.4byte	0x150f5
+	.8byte	.LVL630
+	.4byte	0x1516c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x148c1
-	.8byte	.LBB1697
-	.8byte	.LBE1697-.LBB1697
+	.4byte	0x14938
+	.8byte	.LBB1686
+	.8byte	.LBE1686-.LBB1686
 	.byte	0x1
-	.2byte	0x8cf
+	.2byte	0x8b3
 	.4byte	0xf15d
 	.uleb128 0x55
-	.4byte	0x148e9
+	.4byte	0x14960
 	.uleb128 0x55
-	.4byte	0x148dd
+	.4byte	0x14954
 	.uleb128 0x55
-	.4byte	0x148d2
+	.4byte	0x14949
 	.uleb128 0x5e
-	.4byte	0x148f6
-	.8byte	.LBB1698
-	.8byte	.LBE1698-.LBB1698
-	.byte	0xe
+	.4byte	0x1496d
+	.8byte	.LBB1687
+	.8byte	.LBE1687-.LBB1687
+	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x1492a
+	.4byte	0x149a1
 	.uleb128 0x55
-	.4byte	0x1491e
+	.4byte	0x14995
 	.uleb128 0x55
-	.4byte	0x14912
+	.4byte	0x14989
 	.uleb128 0x55
-	.4byte	0x14907
+	.4byte	0x1497e
 	.uleb128 0x57
-	.8byte	.LBB1699
-	.8byte	.LBE1699-.LBB1699
+	.8byte	.LBB1688
+	.8byte	.LBE1688-.LBB1688
 	.uleb128 0x58
-	.4byte	0x14935
+	.4byte	0x149ac
 	.uleb128 0x4f
-	.8byte	.LVL650
-	.4byte	0x150f5
+	.8byte	.LVL631
+	.4byte	0x1516c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x148c1
-	.8byte	.LBB1700
-	.8byte	.LBE1700-.LBB1700
+	.4byte	0x14938
+	.8byte	.LBB1689
+	.8byte	.LBE1689-.LBB1689
 	.byte	0x1
-	.2byte	0x8d2
+	.2byte	0x8b6
 	.4byte	0xf1da
 	.uleb128 0x55
-	.4byte	0x148e9
+	.4byte	0x14960
 	.uleb128 0x55
-	.4byte	0x148dd
+	.4byte	0x14954
 	.uleb128 0x55
-	.4byte	0x148d2
+	.4byte	0x14949
 	.uleb128 0x5e
-	.4byte	0x148f6
-	.8byte	.LBB1701
-	.8byte	.LBE1701-.LBB1701
-	.byte	0xe
+	.4byte	0x1496d
+	.8byte	.LBB1690
+	.8byte	.LBE1690-.LBB1690
+	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x1492a
+	.4byte	0x149a1
 	.uleb128 0x55
-	.4byte	0x1491e
+	.4byte	0x14995
 	.uleb128 0x55
-	.4byte	0x14912
+	.4byte	0x14989
 	.uleb128 0x55
-	.4byte	0x14907
+	.4byte	0x1497e
 	.uleb128 0x57
-	.8byte	.LBB1702
-	.8byte	.LBE1702-.LBB1702
+	.8byte	.LBB1691
+	.8byte	.LBE1691-.LBB1691
 	.uleb128 0x58
-	.4byte	0x14935
+	.4byte	0x149ac
 	.uleb128 0x4f
-	.8byte	.LVL651
-	.4byte	0x150f5
+	.8byte	.LVL632
+	.4byte	0x1516c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x148c1
-	.8byte	.LBB1703
-	.8byte	.LBE1703-.LBB1703
+	.4byte	0x14938
+	.8byte	.LBB1692
+	.8byte	.LBE1692-.LBB1692
 	.byte	0x1
-	.2byte	0x8d5
+	.2byte	0x8b9
 	.4byte	0xf257
 	.uleb128 0x55
-	.4byte	0x148e9
+	.4byte	0x14960
 	.uleb128 0x55
-	.4byte	0x148dd
+	.4byte	0x14954
 	.uleb128 0x55
-	.4byte	0x148d2
+	.4byte	0x14949
 	.uleb128 0x5e
-	.4byte	0x148f6
-	.8byte	.LBB1704
-	.8byte	.LBE1704-.LBB1704
-	.byte	0xe
+	.4byte	0x1496d
+	.8byte	.LBB1693
+	.8byte	.LBE1693-.LBB1693
+	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x1492a
+	.4byte	0x149a1
 	.uleb128 0x55
-	.4byte	0x1491e
+	.4byte	0x14995
 	.uleb128 0x55
-	.4byte	0x14912
+	.4byte	0x14989
 	.uleb128 0x55
-	.4byte	0x14907
+	.4byte	0x1497e
 	.uleb128 0x57
-	.8byte	.LBB1705
-	.8byte	.LBE1705-.LBB1705
+	.8byte	.LBB1694
+	.8byte	.LBE1694-.LBB1694
 	.uleb128 0x58
-	.4byte	0x14935
+	.4byte	0x149ac
 	.uleb128 0x4f
-	.8byte	.LVL652
-	.4byte	0x150f5
+	.8byte	.LVL633
+	.4byte	0x1516c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x148c1
-	.8byte	.LBB1706
-	.8byte	.LBE1706-.LBB1706
+	.4byte	0x14938
+	.8byte	.LBB1695
+	.8byte	.LBE1695-.LBB1695
 	.byte	0x1
-	.2byte	0x8d8
+	.2byte	0x8bc
 	.4byte	0xf2d4
 	.uleb128 0x55
-	.4byte	0x148e9
+	.4byte	0x14960
 	.uleb128 0x55
-	.4byte	0x148dd
+	.4byte	0x14954
 	.uleb128 0x55
-	.4byte	0x148d2
+	.4byte	0x14949
 	.uleb128 0x5e
-	.4byte	0x148f6
-	.8byte	.LBB1707
-	.8byte	.LBE1707-.LBB1707
-	.byte	0xe
+	.4byte	0x1496d
+	.8byte	.LBB1696
+	.8byte	.LBE1696-.LBB1696
+	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x1492a
+	.4byte	0x149a1
 	.uleb128 0x55
-	.4byte	0x1491e
+	.4byte	0x14995
 	.uleb128 0x55
-	.4byte	0x14912
+	.4byte	0x14989
 	.uleb128 0x55
-	.4byte	0x14907
+	.4byte	0x1497e
 	.uleb128 0x57
-	.8byte	.LBB1708
-	.8byte	.LBE1708-.LBB1708
+	.8byte	.LBB1697
+	.8byte	.LBE1697-.LBB1697
 	.uleb128 0x58
-	.4byte	0x14935
+	.4byte	0x149ac
 	.uleb128 0x4f
-	.8byte	.LVL653
-	.4byte	0x150f5
+	.8byte	.LVL634
+	.4byte	0x1516c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x148c1
-	.8byte	.LBB1709
-	.8byte	.LBE1709-.LBB1709
+	.4byte	0x14938
+	.8byte	.LBB1698
+	.8byte	.LBE1698-.LBB1698
 	.byte	0x1
-	.2byte	0x8db
+	.2byte	0x8bf
 	.4byte	0xf351
 	.uleb128 0x55
-	.4byte	0x148e9
+	.4byte	0x14960
 	.uleb128 0x55
-	.4byte	0x148dd
+	.4byte	0x14954
 	.uleb128 0x55
-	.4byte	0x148d2
+	.4byte	0x14949
 	.uleb128 0x5e
-	.4byte	0x148f6
-	.8byte	.LBB1710
-	.8byte	.LBE1710-.LBB1710
-	.byte	0xe
+	.4byte	0x1496d
+	.8byte	.LBB1699
+	.8byte	.LBE1699-.LBB1699
+	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x1492a
+	.4byte	0x149a1
 	.uleb128 0x55
-	.4byte	0x1491e
+	.4byte	0x14995
 	.uleb128 0x55
-	.4byte	0x14912
+	.4byte	0x14989
 	.uleb128 0x55
-	.4byte	0x14907
+	.4byte	0x1497e
 	.uleb128 0x57
-	.8byte	.LBB1711
-	.8byte	.LBE1711-.LBB1711
+	.8byte	.LBB1700
+	.8byte	.LBE1700-.LBB1700
 	.uleb128 0x58
-	.4byte	0x14935
+	.4byte	0x149ac
 	.uleb128 0x4f
-	.8byte	.LVL654
-	.4byte	0x150f5
+	.8byte	.LVL635
+	.4byte	0x1516c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x148c1
-	.8byte	.LBB1712
-	.8byte	.LBE1712-.LBB1712
+	.4byte	0x14938
+	.8byte	.LBB1701
+	.8byte	.LBE1701-.LBB1701
 	.byte	0x1
-	.2byte	0x8de
+	.2byte	0x8c2
 	.4byte	0xf3ce
 	.uleb128 0x55
-	.4byte	0x148e9
+	.4byte	0x14960
 	.uleb128 0x55
-	.4byte	0x148dd
+	.4byte	0x14954
 	.uleb128 0x55
-	.4byte	0x148d2
+	.4byte	0x14949
 	.uleb128 0x5e
-	.4byte	0x148f6
-	.8byte	.LBB1713
-	.8byte	.LBE1713-.LBB1713
-	.byte	0xe
+	.4byte	0x1496d
+	.8byte	.LBB1702
+	.8byte	.LBE1702-.LBB1702
+	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x1492a
+	.4byte	0x149a1
 	.uleb128 0x55
-	.4byte	0x1491e
+	.4byte	0x14995
 	.uleb128 0x55
-	.4byte	0x14912
+	.4byte	0x14989
 	.uleb128 0x55
-	.4byte	0x14907
+	.4byte	0x1497e
 	.uleb128 0x57
-	.8byte	.LBB1714
-	.8byte	.LBE1714-.LBB1714
+	.8byte	.LBB1703
+	.8byte	.LBE1703-.LBB1703
 	.uleb128 0x58
-	.4byte	0x14935
+	.4byte	0x149ac
 	.uleb128 0x4f
-	.8byte	.LVL655
-	.4byte	0x150f5
+	.8byte	.LVL636
+	.4byte	0x1516c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x148c1
-	.8byte	.LBB1715
-	.8byte	.LBE1715-.LBB1715
+	.4byte	0x14938
+	.8byte	.LBB1704
+	.8byte	.LBE1704-.LBB1704
 	.byte	0x1
-	.2byte	0x8e1
+	.2byte	0x8c5
 	.4byte	0xf44b
 	.uleb128 0x55
-	.4byte	0x148e9
+	.4byte	0x14960
 	.uleb128 0x55
-	.4byte	0x148dd
+	.4byte	0x14954
 	.uleb128 0x55
-	.4byte	0x148d2
+	.4byte	0x14949
 	.uleb128 0x5e
-	.4byte	0x148f6
-	.8byte	.LBB1716
-	.8byte	.LBE1716-.LBB1716
-	.byte	0xe
+	.4byte	0x1496d
+	.8byte	.LBB1705
+	.8byte	.LBE1705-.LBB1705
+	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x1492a
+	.4byte	0x149a1
 	.uleb128 0x55
-	.4byte	0x1491e
+	.4byte	0x14995
 	.uleb128 0x55
-	.4byte	0x14912
+	.4byte	0x14989
 	.uleb128 0x55
-	.4byte	0x14907
+	.4byte	0x1497e
 	.uleb128 0x57
-	.8byte	.LBB1717
-	.8byte	.LBE1717-.LBB1717
+	.8byte	.LBB1706
+	.8byte	.LBE1706-.LBB1706
 	.uleb128 0x58
-	.4byte	0x14935
+	.4byte	0x149ac
 	.uleb128 0x4f
-	.8byte	.LVL656
-	.4byte	0x150f5
+	.8byte	.LVL637
+	.4byte	0x1516c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x148c1
-	.8byte	.LBB1718
-	.8byte	.LBE1718-.LBB1718
+	.4byte	0x14938
+	.8byte	.LBB1707
+	.8byte	.LBE1707-.LBB1707
 	.byte	0x1
-	.2byte	0x8e4
+	.2byte	0x8c8
 	.4byte	0xf4c8
 	.uleb128 0x55
-	.4byte	0x148e9
+	.4byte	0x14960
 	.uleb128 0x55
-	.4byte	0x148dd
+	.4byte	0x14954
 	.uleb128 0x55
-	.4byte	0x148d2
+	.4byte	0x14949
 	.uleb128 0x5e
-	.4byte	0x148f6
-	.8byte	.LBB1719
-	.8byte	.LBE1719-.LBB1719
-	.byte	0xe
+	.4byte	0x1496d
+	.8byte	.LBB1708
+	.8byte	.LBE1708-.LBB1708
+	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x1492a
+	.4byte	0x149a1
 	.uleb128 0x55
-	.4byte	0x1491e
+	.4byte	0x14995
 	.uleb128 0x55
-	.4byte	0x14912
+	.4byte	0x14989
 	.uleb128 0x55
-	.4byte	0x14907
+	.4byte	0x1497e
 	.uleb128 0x57
-	.8byte	.LBB1720
-	.8byte	.LBE1720-.LBB1720
+	.8byte	.LBB1709
+	.8byte	.LBE1709-.LBB1709
 	.uleb128 0x58
-	.4byte	0x14935
+	.4byte	0x149ac
 	.uleb128 0x4f
-	.8byte	.LVL657
-	.4byte	0x150f5
+	.8byte	.LVL638
+	.4byte	0x1516c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x148c1
-	.8byte	.LBB1721
-	.8byte	.LBE1721-.LBB1721
+	.4byte	0x14938
+	.8byte	.LBB1710
+	.8byte	.LBE1710-.LBB1710
 	.byte	0x1
-	.2byte	0x8e7
+	.2byte	0x8cb
 	.uleb128 0x55
-	.4byte	0x148e9
+	.4byte	0x14960
 	.uleb128 0x55
-	.4byte	0x148dd
+	.4byte	0x14954
 	.uleb128 0x55
-	.4byte	0x148d2
+	.4byte	0x14949
 	.uleb128 0x5e
-	.4byte	0x148f6
-	.8byte	.LBB1722
-	.8byte	.LBE1722-.LBB1722
-	.byte	0xe
+	.4byte	0x1496d
+	.8byte	.LBB1711
+	.8byte	.LBE1711-.LBB1711
+	.byte	0xc
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x1492a
+	.4byte	0x149a1
 	.uleb128 0x55
-	.4byte	0x1491e
+	.4byte	0x14995
 	.uleb128 0x55
-	.4byte	0x14912
+	.4byte	0x14989
 	.uleb128 0x55
-	.4byte	0x14907
+	.4byte	0x1497e
 	.uleb128 0x57
-	.8byte	.LBB1723
-	.8byte	.LBE1723-.LBB1723
+	.8byte	.LBB1712
+	.8byte	.LBE1712-.LBB1712
 	.uleb128 0x58
-	.4byte	0x14935
+	.4byte	0x149ac
 	.uleb128 0x4f
-	.8byte	.LVL658
-	.4byte	0x150f5
+	.8byte	.LVL639
+	.4byte	0x1516c
 	.byte	0
 	.byte	0
 	.byte	0
@@ -41057,18 +41162,18 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xfea7
-	.8byte	.LBB1730
-	.4byte	.Ldebug_ranges0+0xe20
+	.8byte	.LBB1719
+	.4byte	.Ldebug_ranges0+0xd80
 	.byte	0x1
-	.2byte	0xbc8
+	.2byte	0xbac
 	.4byte	0xf645
 	.uleb128 0x55
 	.4byte	0xfeb8
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xe20
+	.4byte	.Ldebug_ranges0+0xd80
 	.uleb128 0x61
 	.4byte	0xfec4
-	.4byte	.LLST205
+	.4byte	.LLST202
 	.uleb128 0x58
 	.4byte	0xfed0
 	.uleb128 0x58
@@ -41087,71 +41192,71 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	0xff16
 	.uleb128 0x5c
-	.4byte	0x149d6
-	.8byte	.LBB1732
-	.4byte	.Ldebug_ranges0+0xe90
+	.4byte	0x14a4d
+	.8byte	.LBB1721
+	.4byte	.Ldebug_ranges0+0xdf0
 	.byte	0x1
-	.2byte	0xab8
+	.2byte	0xa9c
 	.4byte	0xf5b3
 	.uleb128 0x55
-	.4byte	0x149e6
+	.4byte	0x14a5d
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x149a0
-	.8byte	.LBB1736
-	.4byte	.Ldebug_ranges0+0xec0
+	.4byte	0x14a17
+	.8byte	.LBB1725
+	.4byte	.Ldebug_ranges0+0xe20
 	.byte	0x1
-	.2byte	0xad7
+	.2byte	0xabb
 	.4byte	0xf5e8
 	.uleb128 0x55
-	.4byte	0x149c9
+	.4byte	0x14a40
 	.uleb128 0x55
-	.4byte	0x149bd
+	.4byte	0x14a34
 	.uleb128 0x55
-	.4byte	0x149b1
+	.4byte	0x14a28
 	.uleb128 0x4f
-	.8byte	.LVL664
-	.4byte	0x150e8
+	.8byte	.LVL645
+	.4byte	0x1515f
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL660
-	.4byte	0x15102
+	.8byte	.LVL641
+	.4byte	0x15179
 	.uleb128 0x4f
-	.8byte	.LVL661
-	.4byte	0x1510f
+	.8byte	.LVL642
+	.4byte	0x15186
 	.uleb128 0x4f
-	.8byte	.LVL662
-	.4byte	0x1511b
+	.8byte	.LVL643
+	.4byte	0x15192
 	.uleb128 0x4f
-	.8byte	.LVL663
-	.4byte	0x15127
+	.8byte	.LVL644
+	.4byte	0x1519e
 	.uleb128 0x4f
-	.8byte	.LVL665
-	.4byte	0x15133
+	.8byte	.LVL646
+	.4byte	0x151aa
 	.uleb128 0x4f
-	.8byte	.LVL666
-	.4byte	0x1513d
+	.8byte	.LVL647
+	.4byte	0x151b4
 	.uleb128 0x4f
-	.8byte	.LVL679
-	.4byte	0x15149
+	.8byte	.LVL660
+	.4byte	0x151c0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xff21
-	.8byte	.LBB1747
-	.4byte	.Ldebug_ranges0+0xef0
+	.8byte	.LBB1736
+	.4byte	.Ldebug_ranges0+0xe50
 	.byte	0x1
-	.2byte	0xbcf
+	.2byte	0xbb3
 	.4byte	0xf71e
 	.uleb128 0x55
 	.4byte	0xff32
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xef0
+	.4byte	.Ldebug_ranges0+0xe50
 	.uleb128 0x58
 	.4byte	0xff3e
 	.uleb128 0x61
 	.4byte	0xff4a
-	.4byte	.LLST206
+	.4byte	.LLST203
 	.uleb128 0x58
 	.4byte	0xff56
 	.uleb128 0x62
@@ -41161,711 +41266,711 @@ __exitcall_ebc_exit:
 	.sleb128 -104
 	.uleb128 0x61
 	.4byte	0xff6c
-	.4byte	.LLST207
+	.4byte	.LLST204
 	.uleb128 0x58
 	.4byte	0xff78
 	.uleb128 0x58
 	.4byte	0xff84
 	.uleb128 0x5c
-	.4byte	0x149d6
-	.8byte	.LBB1749
-	.4byte	.Ldebug_ranges0+0xf40
+	.4byte	0x14a4d
+	.8byte	.LBB1738
+	.4byte	.Ldebug_ranges0+0xea0
 	.byte	0x1
-	.2byte	0xa88
+	.2byte	0xa6c
 	.4byte	0xf6b4
 	.uleb128 0x55
-	.4byte	0x149e6
+	.4byte	0x14a5d
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL668
-	.4byte	0x15102
+	.8byte	.LVL649
+	.4byte	0x15179
 	.uleb128 0x4f
-	.8byte	.LVL669
-	.4byte	0x1510f
+	.8byte	.LVL650
+	.4byte	0x15186
 	.uleb128 0x4f
-	.8byte	.LVL683
-	.4byte	0x1511b
+	.8byte	.LVL664
+	.4byte	0x15192
 	.uleb128 0x4f
-	.8byte	.LVL684
-	.4byte	0x15156
+	.8byte	.LVL665
+	.4byte	0x151cd
 	.uleb128 0x4f
-	.8byte	.LVL770
-	.4byte	0x15149
+	.8byte	.LVL751
+	.4byte	0x151c0
 	.uleb128 0x4f
-	.8byte	.LVL771
-	.4byte	0x15162
+	.8byte	.LVL752
+	.4byte	0x151d9
 	.uleb128 0x4f
-	.8byte	.LVL772
-	.4byte	0x15149
+	.8byte	.LVL753
+	.4byte	0x151c0
 	.uleb128 0x4f
-	.8byte	.LVL785
-	.4byte	0x15149
+	.8byte	.LVL766
+	.4byte	0x151c0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xfe6f
-	.8byte	.LBB1758
-	.4byte	.Ldebug_ranges0+0xf70
+	.8byte	.LBB1747
+	.4byte	.Ldebug_ranges0+0xed0
 	.byte	0x1
-	.2byte	0xbd6
+	.2byte	0xbba
 	.4byte	0xf8b8
 	.uleb128 0x55
 	.4byte	0xfe80
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xf70
+	.4byte	.Ldebug_ranges0+0xed0
 	.uleb128 0x62
 	.4byte	0xfe8c
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5c
-	.4byte	0x14b9b
-	.8byte	.LBB1760
-	.4byte	.Ldebug_ranges0+0xfb0
+	.4byte	0x14c12
+	.8byte	.LBB1749
+	.4byte	.Ldebug_ranges0+0xf10
 	.byte	0x1
-	.2byte	0xae4
+	.2byte	0xac8
 	.4byte	0xf7a5
 	.uleb128 0x55
-	.4byte	0x14ba8
+	.4byte	0x14c1f
 	.uleb128 0x57
-	.8byte	.LBB1762
-	.8byte	.LBE1762-.LBB1762
+	.8byte	.LBB1751
+	.8byte	.LBE1751-.LBB1751
 	.uleb128 0x58
-	.4byte	0x14bd4
+	.4byte	0x14c4b
 	.uleb128 0x5d
-	.4byte	0x14d80
-	.8byte	.LBB1763
-	.8byte	.LBE1763-.LBB1763
-	.byte	0x10
+	.4byte	0x14df7
+	.8byte	.LBB1752
+	.8byte	.LBE1752-.LBB1752
+	.byte	0xf
 	.byte	0x1c
 	.uleb128 0x55
-	.4byte	0x14da3
+	.4byte	0x14e1a
 	.uleb128 0x55
-	.4byte	0x14d97
+	.4byte	0x14e0e
 	.uleb128 0x55
-	.4byte	0x14d8d
+	.4byte	0x14e04
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14cbc
-	.8byte	.LBB1767
-	.8byte	.LBE1767-.LBB1767
+	.4byte	0x14d33
+	.8byte	.LBB1756
+	.8byte	.LBE1756-.LBB1756
 	.byte	0x1
-	.2byte	0xaee
+	.2byte	0xad2
 	.4byte	0xf7f0
 	.uleb128 0x55
-	.4byte	0x14cd2
+	.4byte	0x14d49
 	.uleb128 0x55
-	.4byte	0x14cc9
+	.4byte	0x14d40
 	.uleb128 0x57
-	.8byte	.LBB1768
-	.8byte	.LBE1768-.LBB1768
+	.8byte	.LBB1757
+	.8byte	.LBE1757-.LBB1757
 	.uleb128 0x61
-	.4byte	0x14cdb
-	.4byte	.LLST208
+	.4byte	0x14d52
+	.4byte	.LLST205
 	.uleb128 0x61
-	.4byte	0x14ce5
-	.4byte	.LLST209
+	.4byte	0x14d5c
+	.4byte	.LLST206
 	.byte	0
 	.byte	0
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0xfe0
+	.4byte	.Ldebug_ranges0+0xf40
 	.4byte	0xf81d
 	.uleb128 0x61
 	.4byte	0xfe99
-	.4byte	.LLST210
+	.4byte	.LLST207
 	.uleb128 0x4f
-	.8byte	.LVL692
-	.4byte	0x1516e
+	.8byte	.LVL673
+	.4byte	0x151e5
 	.uleb128 0x4f
-	.8byte	.LVL694
-	.4byte	0x1517a
+	.8byte	.LVL675
+	.4byte	0x151f1
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14cbc
-	.8byte	.LBB1771
-	.8byte	.LBE1771-.LBB1771
+	.4byte	0x14d33
+	.8byte	.LBB1760
+	.8byte	.LBE1760-.LBB1760
 	.byte	0x1
-	.2byte	0xaf7
+	.2byte	0xadb
 	.4byte	0xf868
 	.uleb128 0x55
-	.4byte	0x14cd2
+	.4byte	0x14d49
 	.uleb128 0x55
-	.4byte	0x14cc9
+	.4byte	0x14d40
 	.uleb128 0x57
-	.8byte	.LBB1772
-	.8byte	.LBE1772-.LBB1772
+	.8byte	.LBB1761
+	.8byte	.LBE1761-.LBB1761
 	.uleb128 0x61
-	.4byte	0x14cdb
-	.4byte	.LLST211
+	.4byte	0x14d52
+	.4byte	.LLST208
 	.uleb128 0x61
-	.4byte	0x14ce5
-	.4byte	.LLST212
+	.4byte	0x14d5c
+	.4byte	.LLST209
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL685
-	.4byte	0x15187
+	.8byte	.LVL666
+	.4byte	0x151fe
 	.uleb128 0x4f
-	.8byte	.LVL686
-	.4byte	0x1516e
+	.8byte	.LVL667
+	.4byte	0x151e5
 	.uleb128 0x4f
-	.8byte	.LVL687
-	.4byte	0x15194
+	.8byte	.LVL668
+	.4byte	0x1520b
 	.uleb128 0x4f
-	.8byte	.LVL695
-	.4byte	0x15194
+	.8byte	.LVL676
+	.4byte	0x1520b
 	.uleb128 0x4f
-	.8byte	.LVL775
-	.4byte	0x15149
+	.8byte	.LVL756
+	.4byte	0x151c0
 	.uleb128 0x4f
-	.8byte	.LVL779
-	.4byte	0x15149
+	.8byte	.LVL760
+	.4byte	0x151c0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0xfe55
-	.8byte	.LBB1775
-	.8byte	.LBE1775-.LBB1775
+	.8byte	.LBB1764
+	.8byte	.LBE1764-.LBB1764
 	.byte	0x1
-	.2byte	0xbdd
+	.2byte	0xbc1
 	.4byte	0xf952
 	.uleb128 0x55
 	.4byte	0xfe62
 	.uleb128 0x5c
-	.4byte	0x145f9
-	.8byte	.LBB1777
-	.4byte	.Ldebug_ranges0+0x1010
+	.4byte	0x14670
+	.8byte	.LBB1766
+	.4byte	.Ldebug_ranges0+0xf70
 	.byte	0x1
-	.2byte	0xb07
+	.2byte	0xaeb
 	.4byte	0xf91d
 	.uleb128 0x55
-	.4byte	0x1461e
+	.4byte	0x14695
 	.uleb128 0x55
-	.4byte	0x14612
+	.4byte	0x14689
 	.uleb128 0x55
-	.4byte	0x14606
+	.4byte	0x1467d
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x1010
+	.4byte	.Ldebug_ranges0+0xf70
 	.uleb128 0x61
-	.4byte	0x1462a
-	.4byte	.LLST213
+	.4byte	0x146a1
+	.4byte	.LLST210
 	.uleb128 0x4f
-	.8byte	.LVL702
-	.4byte	0x151a1
+	.8byte	.LVL683
+	.4byte	0x15218
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL703
-	.4byte	0x151ad
+	.8byte	.LVL684
+	.4byte	0x15224
 	.uleb128 0x4f
-	.8byte	.LVL704
-	.4byte	0x151b9
+	.8byte	.LVL685
+	.4byte	0x15230
 	.uleb128 0x4f
-	.8byte	.LVL705
-	.4byte	0x151ad
+	.8byte	.LVL686
+	.4byte	0x15224
 	.uleb128 0x4f
-	.8byte	.LVL706
-	.4byte	0x151b9
+	.8byte	.LVL687
+	.4byte	0x15230
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xfdb3
-	.8byte	.LBB1787
-	.4byte	.Ldebug_ranges0+0x1070
+	.8byte	.LBB1776
+	.4byte	.Ldebug_ranges0+0xfd0
 	.byte	0x1
-	.2byte	0xbe0
+	.2byte	0xbc4
 	.4byte	0xfbf5
 	.uleb128 0x55
 	.4byte	0xfdd0
 	.uleb128 0x55
 	.4byte	0xfdc4
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x1070
+	.4byte	.Ldebug_ranges0+0xfd0
 	.uleb128 0x58
 	.4byte	0xfddc
 	.uleb128 0x61
 	.4byte	0xfde8
-	.4byte	.LLST214
+	.4byte	.LLST211
 	.uleb128 0x61
 	.4byte	0xfdf4
-	.4byte	.LLST215
+	.4byte	.LLST212
 	.uleb128 0x61
 	.4byte	0xfe00
-	.4byte	.LLST216
+	.4byte	.LLST213
 	.uleb128 0x61
 	.4byte	0xfe0c
-	.4byte	.LLST217
+	.4byte	.LLST214
 	.uleb128 0x61
 	.4byte	0xfe18
-	.4byte	.LLST218
+	.4byte	.LLST215
 	.uleb128 0x61
 	.4byte	0xfe24
-	.4byte	.LLST219
+	.4byte	.LLST216
 	.uleb128 0x58
 	.4byte	0xfe30
 	.uleb128 0x61
 	.4byte	0xfe3c
-	.4byte	.LLST220
+	.4byte	.LLST217
 	.uleb128 0x61
 	.4byte	0xfe48
-	.4byte	.LLST221
+	.4byte	.LLST218
 	.uleb128 0x54
 	.4byte	0x11882
-	.8byte	.LBB1789
-	.8byte	.LBE1789-.LBB1789
+	.8byte	.LBB1778
+	.8byte	.LBE1778-.LBB1778
 	.byte	0x1
-	.2byte	0xb3f
+	.2byte	0xb23
 	.4byte	0xfa34
 	.uleb128 0x55
 	.4byte	0x11893
 	.uleb128 0x55
 	.4byte	0x11893
 	.uleb128 0x57
-	.8byte	.LBB1790
-	.8byte	.LBE1790-.LBB1790
+	.8byte	.LBB1779
+	.8byte	.LBE1779-.LBB1779
 	.uleb128 0x61
 	.4byte	0x1189f
-	.4byte	.LLST222
+	.4byte	.LLST219
 	.uleb128 0x4f
-	.8byte	.LVL723
-	.4byte	0x151c5
+	.8byte	.LVL704
+	.4byte	0x1523c
 	.uleb128 0x4f
-	.8byte	.LVL725
-	.4byte	0x1513d
+	.8byte	.LVL706
+	.4byte	0x151b4
 	.uleb128 0x4f
-	.8byte	.LVL726
-	.4byte	0x151d1
+	.8byte	.LVL707
+	.4byte	0x15248
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14780
-	.8byte	.LBB1791
-	.8byte	.LBE1791-.LBB1791
+	.4byte	0x147f7
+	.8byte	.LBB1780
+	.8byte	.LBE1780-.LBB1780
 	.byte	0x1
-	.2byte	0xb25
+	.2byte	0xb09
 	.4byte	0xfa8b
 	.uleb128 0x55
-	.4byte	0x1479d
+	.4byte	0x14814
 	.uleb128 0x55
-	.4byte	0x14791
+	.4byte	0x14808
 	.uleb128 0x5e
-	.4byte	0x147aa
-	.8byte	.LBB1792
-	.8byte	.LBE1792-.LBB1792
-	.byte	0x12
+	.4byte	0x14821
+	.8byte	.LBB1781
+	.8byte	.LBE1781-.LBB1781
+	.byte	0x11
 	.2byte	0x2e7
 	.uleb128 0x55
-	.4byte	0x147c7
+	.4byte	0x1483e
 	.uleb128 0x55
-	.4byte	0x147bb
+	.4byte	0x14832
 	.uleb128 0x4f
-	.8byte	.LVL743
-	.4byte	0x151dd
+	.8byte	.LVL724
+	.4byte	0x15254
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14780
-	.8byte	.LBB1794
-	.8byte	.LBE1794-.LBB1794
+	.4byte	0x147f7
+	.8byte	.LBB1783
+	.8byte	.LBE1783-.LBB1783
 	.byte	0x1
-	.2byte	0xb33
+	.2byte	0xb17
 	.4byte	0xfae2
 	.uleb128 0x55
-	.4byte	0x1479d
+	.4byte	0x14814
 	.uleb128 0x55
-	.4byte	0x14791
+	.4byte	0x14808
 	.uleb128 0x5e
-	.4byte	0x147aa
-	.8byte	.LBB1795
-	.8byte	.LBE1795-.LBB1795
-	.byte	0x12
+	.4byte	0x14821
+	.8byte	.LBB1784
+	.8byte	.LBE1784-.LBB1784
+	.byte	0x11
 	.2byte	0x2e7
 	.uleb128 0x55
-	.4byte	0x147c7
+	.4byte	0x1483e
 	.uleb128 0x55
-	.4byte	0x147bb
+	.4byte	0x14832
 	.uleb128 0x4f
-	.8byte	.LVL756
-	.4byte	0x151dd
+	.8byte	.LVL737
+	.4byte	0x15254
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL708
-	.4byte	0x151ea
+	.8byte	.LVL689
+	.4byte	0x15261
 	.uleb128 0x4f
-	.8byte	.LVL710
-	.4byte	0x151ea
+	.8byte	.LVL691
+	.4byte	0x15261
 	.uleb128 0x4f
-	.8byte	.LVL712
-	.4byte	0x151f6
+	.8byte	.LVL693
+	.4byte	0x1526d
 	.uleb128 0x4f
-	.8byte	.LVL717
-	.4byte	0x151f6
+	.8byte	.LVL698
+	.4byte	0x1526d
 	.uleb128 0x4f
-	.8byte	.LVL721
-	.4byte	0x150cf
+	.8byte	.LVL702
+	.4byte	0x15146
 	.uleb128 0x4f
-	.8byte	.LVL722
-	.4byte	0x15203
+	.8byte	.LVL703
+	.4byte	0x1527a
 	.uleb128 0x4f
-	.8byte	.LVL727
-	.4byte	0x1520f
+	.8byte	.LVL708
+	.4byte	0x15286
 	.uleb128 0x4f
-	.8byte	.LVL728
-	.4byte	0x1520f
+	.8byte	.LVL709
+	.4byte	0x15286
 	.uleb128 0x4f
-	.8byte	.LVL740
-	.4byte	0x1521b
+	.8byte	.LVL721
+	.4byte	0x15292
 	.uleb128 0x4f
-	.8byte	.LVL742
-	.4byte	0x150cf
+	.8byte	.LVL723
+	.4byte	0x15146
 	.uleb128 0x4f
-	.8byte	.LVL747
-	.4byte	0x15227
+	.8byte	.LVL728
+	.4byte	0x1529e
 	.uleb128 0x4f
-	.8byte	.LVL750
-	.4byte	0x151c5
+	.8byte	.LVL731
+	.4byte	0x1523c
 	.uleb128 0x4f
-	.8byte	.LVL752
-	.4byte	0x15227
+	.8byte	.LVL733
+	.4byte	0x1529e
 	.uleb128 0x4f
-	.8byte	.LVL753
-	.4byte	0x151d1
+	.8byte	.LVL734
+	.4byte	0x15248
 	.uleb128 0x4f
-	.8byte	.LVL755
-	.4byte	0x150cf
+	.8byte	.LVL736
+	.4byte	0x15146
 	.uleb128 0x4f
-	.8byte	.LVL759
-	.4byte	0x15227
+	.8byte	.LVL740
+	.4byte	0x1529e
 	.uleb128 0x4f
-	.8byte	.LVL762
-	.4byte	0x151c5
+	.8byte	.LVL743
+	.4byte	0x1523c
 	.uleb128 0x4f
-	.8byte	.LVL764
-	.4byte	0x15227
+	.8byte	.LVL745
+	.4byte	0x1529e
 	.uleb128 0x4f
-	.8byte	.LVL765
-	.4byte	0x151d1
+	.8byte	.LVL746
+	.4byte	0x15248
 	.uleb128 0x4f
-	.8byte	.LVL790
-	.4byte	0x15149
+	.8byte	.LVL771
+	.4byte	0x151c0
 	.uleb128 0x4f
-	.8byte	.LVL793
-	.4byte	0x15149
+	.8byte	.LVL774
+	.4byte	0x151c0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14854
-	.8byte	.LBB1800
-	.8byte	.LBE1800-.LBB1800
+	.4byte	0x148cb
+	.8byte	.LBB1789
+	.8byte	.LBE1789-.LBB1789
 	.byte	0x1
-	.2byte	0xbe2
+	.2byte	0xbc6
 	.4byte	0xfc3e
 	.uleb128 0x55
-	.4byte	0x1486d
+	.4byte	0x148e4
 	.uleb128 0x55
-	.4byte	0x14861
+	.4byte	0x148d8
 	.uleb128 0x5d
-	.4byte	0x1495c
-	.8byte	.LBB1801
-	.8byte	.LBE1801-.LBB1801
+	.4byte	0x149d3
+	.8byte	.LBB1790
+	.8byte	.LBE1790-.LBB1790
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x55
-	.4byte	0x14975
+	.4byte	0x149ec
 	.uleb128 0x55
-	.4byte	0x14969
+	.4byte	0x149e0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0xffa7
-	.8byte	.LBB1803
-	.8byte	.LBE1803-.LBB1803
+	.8byte	.LBB1792
+	.8byte	.LBE1792-.LBB1792
 	.byte	0x1
-	.2byte	0xbe5
+	.2byte	0xbc9
 	.4byte	0xfcd5
 	.uleb128 0x55
 	.4byte	0xffb8
 	.uleb128 0x4f
-	.8byte	.LVL729
-	.4byte	0x15231
+	.8byte	.LVL710
+	.4byte	0x152a8
 	.uleb128 0x4f
-	.8byte	.LVL730
-	.4byte	0x15231
+	.8byte	.LVL711
+	.4byte	0x152a8
 	.uleb128 0x4f
-	.8byte	.LVL731
-	.4byte	0x1523d
+	.8byte	.LVL712
+	.4byte	0x152b4
 	.uleb128 0x4f
-	.8byte	.LVL732
-	.4byte	0x1523d
+	.8byte	.LVL713
+	.4byte	0x152b4
 	.uleb128 0x4f
-	.8byte	.LVL733
-	.4byte	0x1523d
+	.8byte	.LVL714
+	.4byte	0x152b4
 	.uleb128 0x4f
-	.8byte	.LVL734
-	.4byte	0x1523d
+	.8byte	.LVL715
+	.4byte	0x152b4
 	.uleb128 0x4f
-	.8byte	.LVL735
-	.4byte	0x1523d
+	.8byte	.LVL716
+	.4byte	0x152b4
 	.uleb128 0x4f
-	.8byte	.LVL736
-	.4byte	0x1523d
+	.8byte	.LVL717
+	.4byte	0x152b4
 	.uleb128 0x4f
-	.8byte	.LVL737
-	.4byte	0x1523d
+	.8byte	.LVL718
+	.4byte	0x152b4
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL615
-	.4byte	0x15102
+	.8byte	.LVL596
+	.4byte	0x15179
 	.uleb128 0x4f
-	.8byte	.LVL616
-	.4byte	0x1524a
+	.8byte	.LVL597
+	.4byte	0x152c1
 	.uleb128 0x4f
-	.8byte	.LVL618
-	.4byte	0x15256
+	.8byte	.LVL599
+	.4byte	0x152cd
 	.uleb128 0x4f
-	.8byte	.LVL624
-	.4byte	0x15263
+	.8byte	.LVL605
+	.4byte	0x152da
 	.uleb128 0x4f
-	.8byte	.LVL627
-	.4byte	0x15270
+	.8byte	.LVL608
+	.4byte	0x152e7
 	.uleb128 0x4f
-	.8byte	.LVL628
-	.4byte	0x15149
+	.8byte	.LVL609
+	.4byte	0x151c0
 	.uleb128 0x4f
-	.8byte	.LVL636
-	.4byte	0x150cf
+	.8byte	.LVL617
+	.4byte	0x15146
 	.uleb128 0x4f
-	.8byte	.LVL670
-	.4byte	0x15149
+	.8byte	.LVL651
+	.4byte	0x151c0
 	.uleb128 0x4f
-	.8byte	.LVL672
-	.4byte	0x15149
+	.8byte	.LVL653
+	.4byte	0x151c0
 	.uleb128 0x4f
-	.8byte	.LVL675
-	.4byte	0x15149
+	.8byte	.LVL656
+	.4byte	0x151c0
 	.uleb128 0x4f
-	.8byte	.LVL677
-	.4byte	0x15149
+	.8byte	.LVL658
+	.4byte	0x151c0
 	.uleb128 0x4f
-	.8byte	.LVL680
-	.4byte	0x15149
+	.8byte	.LVL661
+	.4byte	0x151c0
 	.uleb128 0x4f
-	.8byte	.LVL738
-	.4byte	0x150cf
+	.8byte	.LVL719
+	.4byte	0x15146
 	.uleb128 0x4f
-	.8byte	.LVL768
-	.4byte	0x15149
+	.8byte	.LVL749
+	.4byte	0x151c0
 	.uleb128 0x4f
-	.8byte	.LVL776
-	.4byte	0x15149
+	.8byte	.LVL757
+	.4byte	0x151c0
 	.uleb128 0x4f
-	.8byte	.LVL781
-	.4byte	0x15149
+	.8byte	.LVL762
+	.4byte	0x151c0
 	.uleb128 0x4f
-	.8byte	.LVL795
-	.4byte	0x1527d
+	.8byte	.LVL776
+	.4byte	0x152f4
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0xb13
+	.2byte	0xaf7
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfe55
 	.uleb128 0x65
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xb13
+	.2byte	0xaf7
 	.4byte	0xe557
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xb13
+	.2byte	0xaf7
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xb15
+	.2byte	0xaf9
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0xb16
+	.2byte	0xafa
 	.4byte	0x6d
 	.uleb128 0x48
 	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0xb17
+	.2byte	0xafb
 	.4byte	0x6d
 	.uleb128 0x48
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0xb18
+	.2byte	0xafc
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0xb19
+	.2byte	0xafd
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0xb1a
+	.2byte	0xafe
 	.4byte	0x21e
 	.uleb128 0x48
 	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0xb1b
+	.2byte	0xaff
 	.4byte	0x21e
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xb1c
+	.2byte	0xb00
 	.4byte	0xe4f2
 	.uleb128 0x48
 	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0xb1d
+	.2byte	0xb01
 	.4byte	0x458
 	.uleb128 0x48
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0xb1e
+	.2byte	0xb02
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0xafc
+	.2byte	0xae0
 	.byte	0x1
 	.4byte	0xfe6f
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xafc
+	.2byte	0xae0
 	.4byte	0xe874
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0xae0
+	.2byte	0xac4
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfea7
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xae0
+	.2byte	0xac4
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF2480
 	.byte	0x1
-	.2byte	0xae2
+	.2byte	0xac6
 	.4byte	0xd88a
 	.uleb128 0x68
 	.uleb128 0x53
 	.string	"__k"
 	.byte	0x1
-	.2byte	0xaf1
+	.2byte	0xad5
 	.4byte	0x2f05
 	.byte	0
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0xaa1
+	.2byte	0xa85
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xff21
 	.uleb128 0x65
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xaa1
+	.2byte	0xa85
 	.4byte	0xe557
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xaa3
+	.2byte	0xa87
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xaa4
+	.2byte	0xa88
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xaa5
+	.2byte	0xa89
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0xaa6
+	.2byte	0xa8a
 	.4byte	0xb904
 	.uleb128 0x53
 	.string	"r"
 	.byte	0x1
-	.2byte	0xaa7
+	.2byte	0xa8b
 	.4byte	0x97bc
 	.uleb128 0x48
 	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0xaa8
+	.2byte	0xa8c
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xaa9
+	.2byte	0xa8d
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0xaa9
+	.2byte	0xa8d
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0xa75
+	.2byte	0xa59
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xff92
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xa75
+	.2byte	0xa59
 	.4byte	0xe874
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xa77
+	.2byte	0xa5b
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xa78
+	.2byte	0xa5c
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0xa79
+	.2byte	0xa5d
 	.4byte	0xb904
 	.uleb128 0x53
 	.string	"r"
 	.byte	0x1
-	.2byte	0xa7a
+	.2byte	0xa5e
 	.4byte	0x97bc
 	.uleb128 0x48
 	.4byte	.LASF2982
 	.byte	0x1
-	.2byte	0xa7b
+	.2byte	0xa5f
 	.4byte	0x29
 	.uleb128 0x48
 	.4byte	.LASF2983
 	.byte	0x1
-	.2byte	0xa7c
+	.2byte	0xa60
 	.4byte	0xc6
 	.uleb128 0x69
 	.4byte	.LASF3050
@@ -41884,520 +41989,520 @@ __exitcall_ebc_exit:
 	.uleb128 0x64
 	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0xa65
+	.2byte	0xa49
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xffc5
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xa65
+	.2byte	0xa49
 	.4byte	0xe874
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0xa5c
+	.2byte	0xa40
 	.4byte	0x2ee
-	.8byte	.LFB2853
-	.8byte	.LFE2853-.LFB2853
+	.8byte	.LFB2854
+	.8byte	.LFE2854-.LFB2854
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x10025
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa5c
+	.2byte	0xa40
 	.4byte	0xa5e0
-	.4byte	.LLST80
+	.4byte	.LLST78
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa5d
+	.2byte	0xa41
 	.4byte	0xb45b
-	.4byte	.LLST81
+	.4byte	.LLST79
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa5e
+	.2byte	0xa42
 	.4byte	0x21e
-	.4byte	.LLST82
+	.4byte	.LLST80
 	.uleb128 0x4f
-	.8byte	.LVL308
-	.4byte	0x15287
+	.8byte	.LVL306
+	.4byte	0x152fe
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0xa53
+	.2byte	0xa37
 	.4byte	0x2ee
-	.8byte	.LFB2852
-	.8byte	.LFE2852-.LFB2852
+	.8byte	.LFB2853
+	.8byte	.LFE2853-.LFB2853
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x10085
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa53
+	.2byte	0xa37
 	.4byte	0xa5e0
-	.4byte	.LLST83
+	.4byte	.LLST81
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa54
+	.2byte	0xa38
 	.4byte	0xb45b
-	.4byte	.LLST84
+	.4byte	.LLST82
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa55
+	.2byte	0xa39
 	.4byte	0x21e
-	.4byte	.LLST85
+	.4byte	.LLST83
 	.uleb128 0x4f
-	.8byte	.LVL313
-	.4byte	0x15293
+	.8byte	.LVL311
+	.4byte	0x1530a
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0xa4a
+	.2byte	0xa2e
 	.4byte	0x2ee
-	.8byte	.LFB2851
-	.8byte	.LFE2851-.LFB2851
+	.8byte	.LFB2852
+	.8byte	.LFE2852-.LFB2852
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x100e5
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa4a
+	.2byte	0xa2e
 	.4byte	0xa5e0
-	.4byte	.LLST86
+	.4byte	.LLST84
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa4b
+	.2byte	0xa2f
 	.4byte	0xb45b
-	.4byte	.LLST87
+	.4byte	.LLST85
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa4c
+	.2byte	0xa30
 	.4byte	0x21e
-	.4byte	.LLST88
+	.4byte	.LLST86
 	.uleb128 0x4f
-	.8byte	.LVL318
-	.4byte	0x15293
+	.8byte	.LVL316
+	.4byte	0x1530a
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0xa32
+	.2byte	0xa16
 	.4byte	0x2ee
-	.8byte	.LFB2850
-	.8byte	.LFE2850-.LFB2850
+	.8byte	.LFB2851
+	.8byte	.LFE2851-.LFB2851
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x101b5
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa32
+	.2byte	0xa16
 	.4byte	0xa5e0
-	.4byte	.LLST98
+	.4byte	.LLST96
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa33
+	.2byte	0xa17
 	.4byte	0xb45b
-	.4byte	.LLST99
+	.4byte	.LLST97
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa34
+	.2byte	0xa18
 	.4byte	0x56
-	.4byte	.LLST100
+	.4byte	.LLST98
 	.uleb128 0x59
 	.4byte	.LASF383
 	.byte	0x1
-	.2byte	0xa34
+	.2byte	0xa18
 	.4byte	0x2e3
-	.4byte	.LLST101
+	.4byte	.LLST99
 	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa36
+	.2byte	0xa1a
 	.4byte	0xe557
-	.4byte	.LLST102
+	.4byte	.LLST100
 	.uleb128 0x5a
 	.4byte	.LASF2470
 	.byte	0x1
-	.2byte	0xa37
+	.2byte	0xa1b
 	.4byte	0xc6
-	.4byte	.LLST103
+	.4byte	.LLST101
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xa37
+	.2byte	0xa1b
 	.4byte	0xc6
 	.uleb128 0x4f
-	.8byte	.LVL344
-	.4byte	0x152a0
+	.8byte	.LVL342
+	.4byte	0x15317
 	.uleb128 0x4f
-	.8byte	.LVL346
-	.4byte	0x152ad
+	.8byte	.LVL344
+	.4byte	0x15324
 	.uleb128 0x4f
-	.8byte	.LVL351
-	.4byte	0x15149
+	.8byte	.LVL349
+	.4byte	0x151c0
 	.uleb128 0x4f
-	.8byte	.LVL354
-	.4byte	0x15149
+	.8byte	.LVL352
+	.4byte	0x151c0
 	.uleb128 0x4f
-	.8byte	.LVL355
-	.4byte	0x1527d
+	.8byte	.LVL353
+	.4byte	0x152f4
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0xa26
+	.2byte	0xa0a
 	.4byte	0x2ee
-	.8byte	.LFB2849
-	.8byte	.LFE2849-.LFB2849
+	.8byte	.LFB2850
+	.8byte	.LFE2850-.LFB2850
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x1024f
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa26
+	.2byte	0xa0a
 	.4byte	0xa5e0
-	.4byte	.LLST89
+	.4byte	.LLST87
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa27
+	.2byte	0xa0b
 	.4byte	0xb45b
-	.4byte	.LLST90
+	.4byte	.LLST88
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa28
+	.2byte	0xa0c
 	.4byte	0x21e
-	.4byte	.LLST91
+	.4byte	.LLST89
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa2a
+	.2byte	0xa0e
 	.4byte	0xe557
 	.uleb128 0x48
 	.4byte	.LASF2470
 	.byte	0x1
-	.2byte	0xa2b
+	.2byte	0xa0f
 	.4byte	0xc6
 	.uleb128 0x54
-	.4byte	0x14514
-	.8byte	.LBB1230
-	.8byte	.LBE1230-.LBB1230
+	.4byte	0x1457e
+	.8byte	.LBB1232
+	.8byte	.LBE1232-.LBB1232
 	.byte	0x1
-	.2byte	0xa2d
+	.2byte	0xa11
 	.4byte	0x10241
 	.uleb128 0x55
-	.4byte	0x14524
+	.4byte	0x1458e
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL323
-	.4byte	0x15293
+	.8byte	.LVL321
+	.4byte	0x1530a
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0xa18
+	.2byte	0x9fc
 	.4byte	0x2ee
-	.8byte	.LFB2848
-	.8byte	.LFE2848-.LFB2848
+	.8byte	.LFB2849
+	.8byte	.LFE2849-.LFB2849
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x102f8
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa18
+	.2byte	0x9fc
 	.4byte	0xa5e0
-	.4byte	.LLST92
+	.4byte	.LLST90
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa19
+	.2byte	0x9fd
 	.4byte	0xb45b
-	.4byte	.LLST93
+	.4byte	.LLST91
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa1a
+	.2byte	0x9fe
 	.4byte	0x21e
-	.4byte	.LLST94
+	.4byte	.LLST92
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa1c
+	.2byte	0xa00
 	.4byte	0xe557
 	.uleb128 0x6a
 	.string	"t"
 	.byte	0x1
-	.2byte	0xa1d
+	.2byte	0xa01
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x5c
-	.4byte	0x14531
-	.8byte	.LBB1232
+	.4byte	0x1459b
+	.8byte	.LBB1234
 	.4byte	.Ldebug_ranges0+0x6a0
 	.byte	0x1
-	.2byte	0xa1f
+	.2byte	0xa03
 	.4byte	0x102dd
 	.uleb128 0x55
-	.4byte	0x1454d
+	.4byte	0x145b7
 	.uleb128 0x55
-	.4byte	0x14541
+	.4byte	0x145ab
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL330
-	.4byte	0x15293
+	.8byte	.LVL328
+	.4byte	0x1530a
 	.uleb128 0x4f
-	.8byte	.LVL333
-	.4byte	0x1527d
+	.8byte	.LVL331
+	.4byte	0x152f4
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0xa0d
+	.2byte	0x9f1
 	.4byte	0x2ee
-	.8byte	.LFB2847
-	.8byte	.LFE2847-.LFB2847
+	.8byte	.LFB2848
+	.8byte	.LFE2848-.LFB2848
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x10364
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa0d
+	.2byte	0x9f1
 	.4byte	0xa5e0
-	.4byte	.LLST95
+	.4byte	.LLST93
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa0e
+	.2byte	0x9f2
 	.4byte	0xb45b
-	.4byte	.LLST96
+	.4byte	.LLST94
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa0f
+	.2byte	0x9f3
 	.4byte	0x21e
-	.4byte	.LLST97
+	.4byte	.LLST95
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa11
+	.2byte	0x9f5
 	.4byte	0xe557
 	.uleb128 0x4f
-	.8byte	.LVL338
-	.4byte	0x15293
+	.8byte	.LVL336
+	.4byte	0x1530a
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0xa02
+	.2byte	0x9e6
 	.4byte	0x2ee
-	.8byte	.LFB2846
-	.8byte	.LFE2846-.LFB2846
+	.8byte	.LFB2847
+	.8byte	.LFE2847-.LFB2847
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x103dd
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa02
+	.2byte	0x9e6
 	.4byte	0xa5e0
-	.4byte	.LLST104
+	.4byte	.LLST102
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa03
+	.2byte	0x9e7
 	.4byte	0xb45b
-	.4byte	.LLST105
+	.4byte	.LLST103
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa04
+	.2byte	0x9e8
 	.4byte	0x21e
-	.4byte	.LLST106
+	.4byte	.LLST104
 	.uleb128 0x48
 	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0xa06
+	.2byte	0x9ea
 	.4byte	0x56
 	.uleb128 0x4f
-	.8byte	.LVL357
-	.4byte	0x152b9
+	.8byte	.LVL355
+	.4byte	0x15330
 	.uleb128 0x4f
-	.8byte	.LVL358
-	.4byte	0x15293
+	.8byte	.LVL356
+	.4byte	0x1530a
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0x9ef
+	.2byte	0x9d3
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x10407
 	.uleb128 0x66
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0x9ef
+	.2byte	0x9d3
 	.4byte	0x1c7f
 	.uleb128 0x66
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x9ef
+	.2byte	0x9d3
 	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0x9df
+	.2byte	0x9c3
 	.4byte	0xc6
-	.8byte	.LFB2844
-	.8byte	.LFE2844-.LFB2844
+	.8byte	.LFB2845
+	.8byte	.LFE2845-.LFB2845
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x1046f
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x9df
+	.2byte	0x9c3
 	.4byte	0x55cc
-	.4byte	.LLST18
+	.4byte	.LLST16
 	.uleb128 0x52
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x9df
+	.2byte	0x9c3
 	.4byte	0x3d25
-	.4byte	.LLST19
+	.4byte	.LLST17
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x9e1
+	.2byte	0x9c5
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF898
 	.byte	0x1
-	.2byte	0x9e2
+	.2byte	0x9c6
 	.4byte	0x29
 	.uleb128 0x4f
-	.8byte	.LVL84
-	.4byte	0x152c5
+	.8byte	.LVL82
+	.4byte	0x1533c
 	.byte	0
 	.uleb128 0x6b
 	.4byte	.LASF3085
 	.byte	0x1
-	.2byte	0x9c8
+	.2byte	0x9ac
 	.4byte	0xc6
 	.4byte	0x10498
 	.uleb128 0x66
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0x9c8
+	.2byte	0x9ac
 	.4byte	0x1c7f
 	.uleb128 0x66
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x9c8
+	.2byte	0x9ac
 	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0x9b9
+	.2byte	0x99d
 	.4byte	0xc6
-	.8byte	.LFB2842
-	.8byte	.LFE2842-.LFB2842
+	.8byte	.LFB2843
+	.8byte	.LFE2843-.LFB2843
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x10501
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x9b9
+	.2byte	0x99d
 	.4byte	0x55cc
-	.4byte	.LLST16
+	.4byte	.LLST14
 	.uleb128 0x52
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x9b9
+	.2byte	0x99d
 	.4byte	0x3d25
-	.4byte	.LLST17
+	.4byte	.LLST15
 	.uleb128 0x48
 	.4byte	.LASF898
 	.byte	0x1
-	.2byte	0x9bb
+	.2byte	0x99f
 	.4byte	0x29
 	.uleb128 0x4f
-	.8byte	.LVL78
-	.4byte	0x152d2
+	.8byte	.LVL76
+	.4byte	0x15349
 	.uleb128 0x4f
-	.8byte	.LVL79
-	.4byte	0x152c5
+	.8byte	.LVL77
+	.4byte	0x1533c
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3087
 	.byte	0x1
-	.2byte	0x8ed
+	.2byte	0x8d1
 	.4byte	0x199
-	.8byte	.LFB2841
-	.8byte	.LFE2841-.LFB2841
+	.8byte	.LFB2842
+	.8byte	.LFE2842-.LFB2842
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x117a9
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x8ed
+	.2byte	0x8d1
 	.4byte	0x55cc
-	.4byte	.LLST20
+	.4byte	.LLST18
 	.uleb128 0x52
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0x8ed
+	.2byte	0x8d1
 	.4byte	0x6d
-	.4byte	.LLST21
+	.4byte	.LLST19
 	.uleb128 0x52
 	.string	"arg"
 	.byte	0x1
-	.2byte	0x8ed
+	.2byte	0x8d1
 	.4byte	0x29
-	.4byte	.LLST22
+	.4byte	.LLST20
 	.uleb128 0x48
 	.4byte	.LASF3088
 	.byte	0x1
-	.2byte	0x8ef
+	.2byte	0x8d3
 	.4byte	0x458
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x8f0
+	.2byte	0x8d4
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x8f1
+	.2byte	0x8d5
 	.4byte	0xe874
 	.uleb128 0x4d
 	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x8f2
+	.2byte	0x8d6
 	.4byte	0xda8e
 	.uleb128 0x2
 	.byte	0x91
@@ -42405,48 +42510,48 @@ __exitcall_ebc_exit:
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x8f3
+	.2byte	0x8d7
 	.4byte	0xe4f2
 	.uleb128 0x48
 	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x8f4
+	.2byte	0x8d8
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x8f5
+	.2byte	0x8d9
 	.4byte	0x29
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x8f6
+	.2byte	0x8da
 	.4byte	0xc6
 	.uleb128 0x56
 	.4byte	.LASF3050
 	.4byte	0x117b9
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35192
+	.8byte	__func__.35197
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x1a0
 	.4byte	0x1066b
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x942
+	.2byte	0x926
 	.4byte	0xc6
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1a0
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x942
-	.8byte	.L195
+	.2byte	0x926
+	.8byte	.L216
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x942
+	.2byte	0x926
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -42454,948 +42559,948 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x942
+	.2byte	0x926
 	.4byte	0x199
 	.uleb128 0x6d
-	.8byte	.LBB1022
-	.8byte	.LBE1022-.LBB1022
+	.8byte	.LBB1024
+	.8byte	.LBE1024-.LBB1024
 	.4byte	0x1064f
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x942
+	.2byte	0x926
 	.4byte	0x199
-	.4byte	.LLST37
+	.4byte	.LLST35
 	.uleb128 0x4f
-	.8byte	.LVL129
-	.4byte	0x152de
+	.8byte	.LVL127
+	.4byte	0x15355
 	.uleb128 0x4f
-	.8byte	.LVL130
-	.4byte	0x152ea
+	.8byte	.LVL128
+	.4byte	0x15361
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL127
-	.4byte	0x152f7
+	.8byte	.LVL125
+	.4byte	0x1536e
 	.uleb128 0x4f
-	.8byte	.LVL131
-	.4byte	0x15303
+	.8byte	.LVL129
+	.4byte	0x1537a
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14635
-	.8byte	.LBB958
+	.4byte	0x146ac
+	.8byte	.LBB960
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x9ab
+	.2byte	0x98f
 	.4byte	0x1088b
 	.uleb128 0x55
-	.4byte	0x1465b
+	.4byte	0x146d2
 	.uleb128 0x55
-	.4byte	0x1464f
+	.4byte	0x146c6
 	.uleb128 0x55
-	.4byte	0x14645
+	.4byte	0x146bc
 	.uleb128 0x6e
-	.4byte	0x14695
-	.8byte	.LBB959
+	.4byte	0x1470c
+	.8byte	.LBB961
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x146bb
+	.4byte	0x14732
 	.uleb128 0x55
-	.4byte	0x146af
+	.4byte	0x14726
 	.uleb128 0x55
-	.4byte	0x146a5
+	.4byte	0x1471c
 	.uleb128 0x6f
-	.4byte	0x14734
-	.8byte	.LBB961
+	.4byte	0x147ab
+	.8byte	.LBB963
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x107c1
 	.uleb128 0x55
-	.4byte	0x14750
+	.4byte	0x147c7
 	.uleb128 0x70
-	.4byte	0x14744
-	.4byte	.LLST23
+	.4byte	0x147bb
+	.4byte	.LLST21
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x80
 	.uleb128 0x61
-	.4byte	0x1475c
-	.4byte	.LLST24
+	.4byte	0x147d3
+	.4byte	.LLST22
 	.uleb128 0x61
-	.4byte	0x14767
-	.4byte	.LLST25
+	.4byte	0x147de
+	.4byte	.LLST23
 	.uleb128 0x71
-	.4byte	0x14b7f
-	.8byte	.LBB963
-	.8byte	.LBE963-.LBB963
+	.4byte	0x14bf6
+	.8byte	.LBB965
+	.8byte	.LBE965-.LBB965
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10727
 	.uleb128 0x57
-	.8byte	.LBB964
-	.8byte	.LBE964-.LBB964
+	.8byte	.LBB966
+	.8byte	.LBE966-.LBB966
 	.uleb128 0x61
-	.4byte	0x14b8f
-	.4byte	.LLST26
+	.4byte	0x14c06
+	.4byte	.LLST24
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14b52
-	.8byte	.LBB965
-	.8byte	.LBE965-.LBB965
+	.4byte	0x14bc9
+	.8byte	.LBB967
+	.8byte	.LBE967-.LBB967
 	.byte	0x6
 	.byte	0x55
 	.4byte	0x1076f
 	.uleb128 0x55
-	.4byte	0x14b6c
+	.4byte	0x14be3
 	.uleb128 0x55
-	.4byte	0x14b62
+	.4byte	0x14bd9
 	.uleb128 0x5d
-	.4byte	0x14c8f
-	.8byte	.LBB966
-	.8byte	.LBE966-.LBB966
+	.4byte	0x14d06
+	.8byte	.LBB968
+	.8byte	.LBE968-.LBB968
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14ca9
+	.4byte	0x14d20
 	.uleb128 0x55
-	.4byte	0x14c9f
+	.4byte	0x14d16
 	.byte	0
 	.byte	0
 	.uleb128 0x57
-	.8byte	.LBB968
-	.8byte	.LBE968-.LBB968
+	.8byte	.LBB970
+	.8byte	.LBE970-.LBB970
 	.uleb128 0x58
-	.4byte	0x14773
+	.4byte	0x147ea
 	.uleb128 0x5d
-	.4byte	0x14c05
-	.8byte	.LBB969
-	.8byte	.LBE969-.LBB969
+	.4byte	0x14c7c
+	.8byte	.LBB971
+	.8byte	.LBE971-.LBB971
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14c21
+	.4byte	0x14c98
 	.uleb128 0x55
-	.4byte	0x14c15
+	.4byte	0x14c8c
 	.uleb128 0x57
-	.8byte	.LBB970
-	.8byte	.LBE970-.LBB970
+	.8byte	.LBB972
+	.8byte	.LBE972-.LBB972
 	.uleb128 0x58
-	.4byte	0x14c2d
+	.4byte	0x14ca4
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14700
-	.8byte	.LBB975
-	.8byte	.LBE975-.LBB975
+	.4byte	0x14777
+	.8byte	.LBB977
+	.8byte	.LBE977-.LBB977
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x1087c
 	.uleb128 0x55
-	.4byte	0x14710
+	.4byte	0x14787
 	.uleb128 0x57
-	.8byte	.LBB976
-	.8byte	.LBE976-.LBB976
+	.8byte	.LBB978
+	.8byte	.LBE978-.LBB978
 	.uleb128 0x61
-	.4byte	0x1471b
-	.4byte	.LLST27
+	.4byte	0x14792
+	.4byte	.LLST25
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0xc0
 	.4byte	0x10847
 	.uleb128 0x61
-	.4byte	0x14727
-	.4byte	.LLST28
+	.4byte	0x1479e
+	.4byte	.LLST26
 	.uleb128 0x5d
-	.4byte	0x14c05
-	.8byte	.LBB978
-	.8byte	.LBE978-.LBB978
+	.4byte	0x14c7c
+	.8byte	.LBB980
+	.8byte	.LBE980-.LBB980
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14c21
+	.4byte	0x14c98
 	.uleb128 0x55
-	.4byte	0x14c15
+	.4byte	0x14c8c
 	.uleb128 0x57
-	.8byte	.LBB979
-	.8byte	.LBE979-.LBB979
+	.8byte	.LBB981
+	.8byte	.LBE981-.LBB981
 	.uleb128 0x58
-	.4byte	0x14c2d
+	.4byte	0x14ca4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14b7f
-	.8byte	.LBB980
-	.8byte	.LBE980-.LBB980
+	.4byte	0x14bf6
+	.8byte	.LBB982
+	.8byte	.LBE982-.LBB982
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB981
-	.8byte	.LBE981-.LBB981
+	.8byte	.LBB983
+	.8byte	.LBE983-.LBB983
 	.uleb128 0x61
-	.4byte	0x14b8f
-	.4byte	.LLST29
+	.4byte	0x14c06
+	.4byte	.LLST27
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL157
-	.4byte	0x15310
+	.8byte	.LVL155
+	.4byte	0x15387
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14665
-	.8byte	.LBB991
+	.4byte	0x146dc
+	.8byte	.LBB993
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
-	.2byte	0x92d
+	.2byte	0x911
 	.4byte	0x10ab6
 	.uleb128 0x55
-	.4byte	0x1468b
+	.4byte	0x14702
 	.uleb128 0x55
-	.4byte	0x1467f
+	.4byte	0x146f6
 	.uleb128 0x55
-	.4byte	0x14675
+	.4byte	0x146ec
 	.uleb128 0x6e
-	.4byte	0x146c5
-	.8byte	.LBB992
+	.4byte	0x1473c
+	.8byte	.LBB994
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x146eb
+	.4byte	0x14762
 	.uleb128 0x55
-	.4byte	0x146df
+	.4byte	0x14756
 	.uleb128 0x55
-	.4byte	0x146d5
+	.4byte	0x1474c
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x58
-	.4byte	0x146f4
+	.4byte	0x1476b
 	.uleb128 0x6f
-	.4byte	0x14734
-	.8byte	.LBB994
+	.4byte	0x147ab
+	.8byte	.LBB996
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x109eb
 	.uleb128 0x55
-	.4byte	0x14750
+	.4byte	0x147c7
 	.uleb128 0x70
-	.4byte	0x14744
-	.4byte	.LLST30
+	.4byte	0x147bb
+	.4byte	.LLST28
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x130
 	.uleb128 0x61
-	.4byte	0x1475c
-	.4byte	.LLST31
+	.4byte	0x147d3
+	.4byte	.LLST29
 	.uleb128 0x61
-	.4byte	0x14767
-	.4byte	.LLST32
+	.4byte	0x147de
+	.4byte	.LLST30
 	.uleb128 0x71
-	.4byte	0x14b7f
-	.8byte	.LBB996
-	.8byte	.LBE996-.LBB996
+	.4byte	0x14bf6
+	.8byte	.LBB998
+	.8byte	.LBE998-.LBB998
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10951
 	.uleb128 0x57
-	.8byte	.LBB997
-	.8byte	.LBE997-.LBB997
+	.8byte	.LBB999
+	.8byte	.LBE999-.LBB999
 	.uleb128 0x61
-	.4byte	0x14b8f
-	.4byte	.LLST33
+	.4byte	0x14c06
+	.4byte	.LLST31
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB998
-	.8byte	.LBE998-.LBB998
+	.8byte	.LBB1000
+	.8byte	.LBE1000-.LBB1000
 	.4byte	0x109a5
 	.uleb128 0x58
-	.4byte	0x14773
+	.4byte	0x147ea
 	.uleb128 0x5d
-	.4byte	0x14c05
-	.8byte	.LBB999
-	.8byte	.LBE999-.LBB999
+	.4byte	0x14c7c
+	.8byte	.LBB1001
+	.8byte	.LBE1001-.LBB1001
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14c21
+	.4byte	0x14c98
 	.uleb128 0x55
-	.4byte	0x14c15
+	.4byte	0x14c8c
 	.uleb128 0x57
-	.8byte	.LBB1000
-	.8byte	.LBE1000-.LBB1000
+	.8byte	.LBB1002
+	.8byte	.LBE1002-.LBB1002
 	.uleb128 0x58
-	.4byte	0x14c2d
+	.4byte	0x14ca4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14b52
-	.8byte	.LBB1001
-	.8byte	.LBE1001-.LBB1001
+	.4byte	0x14bc9
+	.8byte	.LBB1003
+	.8byte	.LBE1003-.LBB1003
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14b6c
+	.4byte	0x14be3
 	.uleb128 0x55
-	.4byte	0x14b62
+	.4byte	0x14bd9
 	.uleb128 0x5d
-	.4byte	0x14c8f
-	.8byte	.LBB1002
-	.8byte	.LBE1002-.LBB1002
+	.4byte	0x14d06
+	.8byte	.LBB1004
+	.8byte	.LBE1004-.LBB1004
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14ca9
+	.4byte	0x14d20
 	.uleb128 0x55
-	.4byte	0x14c9f
+	.4byte	0x14d16
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14700
-	.8byte	.LBB1006
-	.8byte	.LBE1006-.LBB1006
+	.4byte	0x14777
+	.8byte	.LBB1008
+	.8byte	.LBE1008-.LBB1008
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x10aa6
 	.uleb128 0x55
-	.4byte	0x14710
+	.4byte	0x14787
 	.uleb128 0x57
-	.8byte	.LBB1007
-	.8byte	.LBE1007-.LBB1007
+	.8byte	.LBB1009
+	.8byte	.LBE1009-.LBB1009
 	.uleb128 0x61
-	.4byte	0x1471b
-	.4byte	.LLST34
+	.4byte	0x14792
+	.4byte	.LLST32
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x170
 	.4byte	0x10a71
 	.uleb128 0x61
-	.4byte	0x14727
-	.4byte	.LLST35
+	.4byte	0x1479e
+	.4byte	.LLST33
 	.uleb128 0x5d
-	.4byte	0x14c05
-	.8byte	.LBB1009
-	.8byte	.LBE1009-.LBB1009
+	.4byte	0x14c7c
+	.8byte	.LBB1011
+	.8byte	.LBE1011-.LBB1011
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14c21
+	.4byte	0x14c98
 	.uleb128 0x55
-	.4byte	0x14c15
+	.4byte	0x14c8c
 	.uleb128 0x57
-	.8byte	.LBB1010
-	.8byte	.LBE1010-.LBB1010
+	.8byte	.LBB1012
+	.8byte	.LBE1012-.LBB1012
 	.uleb128 0x58
-	.4byte	0x14c2d
+	.4byte	0x14ca4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14b7f
-	.8byte	.LBB1011
-	.8byte	.LBE1011-.LBB1011
+	.4byte	0x14bf6
+	.8byte	.LBB1013
+	.8byte	.LBE1013-.LBB1013
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1012
-	.8byte	.LBE1012-.LBB1012
+	.8byte	.LBB1014
+	.8byte	.LBE1014-.LBB1014
 	.uleb128 0x61
-	.4byte	0x14b8f
-	.4byte	.LLST36
+	.4byte	0x14c06
+	.4byte	.LLST34
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL122
-	.4byte	0x1531d
+	.8byte	.LVL120
+	.4byte	0x15394
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14665
-	.8byte	.LBB1026
+	.4byte	0x146dc
+	.8byte	.LBB1028
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
-	.2byte	0x949
+	.2byte	0x92d
 	.4byte	0x10ce1
 	.uleb128 0x55
-	.4byte	0x1468b
+	.4byte	0x14702
 	.uleb128 0x55
-	.4byte	0x1467f
+	.4byte	0x146f6
 	.uleb128 0x55
-	.4byte	0x14675
+	.4byte	0x146ec
 	.uleb128 0x6e
-	.4byte	0x146c5
-	.8byte	.LBB1027
+	.4byte	0x1473c
+	.8byte	.LBB1029
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x146eb
+	.4byte	0x14762
 	.uleb128 0x55
-	.4byte	0x146df
+	.4byte	0x14756
 	.uleb128 0x55
-	.4byte	0x146d5
+	.4byte	0x1474c
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1f0
 	.uleb128 0x58
-	.4byte	0x146f4
+	.4byte	0x1476b
 	.uleb128 0x6f
-	.4byte	0x14734
-	.8byte	.LBB1029
+	.4byte	0x147ab
+	.8byte	.LBB1031
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x10c16
 	.uleb128 0x55
-	.4byte	0x14750
+	.4byte	0x147c7
 	.uleb128 0x70
-	.4byte	0x14744
-	.4byte	.LLST38
+	.4byte	0x147bb
+	.4byte	.LLST36
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x230
 	.uleb128 0x61
-	.4byte	0x1475c
-	.4byte	.LLST39
+	.4byte	0x147d3
+	.4byte	.LLST37
 	.uleb128 0x61
-	.4byte	0x14767
-	.4byte	.LLST40
+	.4byte	0x147de
+	.4byte	.LLST38
 	.uleb128 0x71
-	.4byte	0x14b7f
-	.8byte	.LBB1031
-	.8byte	.LBE1031-.LBB1031
+	.4byte	0x14bf6
+	.8byte	.LBB1033
+	.8byte	.LBE1033-.LBB1033
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10b7c
 	.uleb128 0x57
-	.8byte	.LBB1032
-	.8byte	.LBE1032-.LBB1032
+	.8byte	.LBB1034
+	.8byte	.LBE1034-.LBB1034
 	.uleb128 0x61
-	.4byte	0x14b8f
-	.4byte	.LLST41
+	.4byte	0x14c06
+	.4byte	.LLST39
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1033
-	.8byte	.LBE1033-.LBB1033
+	.8byte	.LBB1035
+	.8byte	.LBE1035-.LBB1035
 	.4byte	0x10bd0
 	.uleb128 0x58
-	.4byte	0x14773
+	.4byte	0x147ea
 	.uleb128 0x5d
-	.4byte	0x14c05
-	.8byte	.LBB1034
-	.8byte	.LBE1034-.LBB1034
+	.4byte	0x14c7c
+	.8byte	.LBB1036
+	.8byte	.LBE1036-.LBB1036
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14c21
+	.4byte	0x14c98
 	.uleb128 0x55
-	.4byte	0x14c15
+	.4byte	0x14c8c
 	.uleb128 0x57
-	.8byte	.LBB1035
-	.8byte	.LBE1035-.LBB1035
+	.8byte	.LBB1037
+	.8byte	.LBE1037-.LBB1037
 	.uleb128 0x58
-	.4byte	0x14c2d
+	.4byte	0x14ca4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14b52
-	.8byte	.LBB1036
-	.8byte	.LBE1036-.LBB1036
+	.4byte	0x14bc9
+	.8byte	.LBB1038
+	.8byte	.LBE1038-.LBB1038
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14b6c
+	.4byte	0x14be3
 	.uleb128 0x55
-	.4byte	0x14b62
+	.4byte	0x14bd9
 	.uleb128 0x5d
-	.4byte	0x14c8f
-	.8byte	.LBB1037
-	.8byte	.LBE1037-.LBB1037
+	.4byte	0x14d06
+	.8byte	.LBB1039
+	.8byte	.LBE1039-.LBB1039
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14ca9
+	.4byte	0x14d20
 	.uleb128 0x55
-	.4byte	0x14c9f
+	.4byte	0x14d16
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14700
-	.8byte	.LBB1041
-	.8byte	.LBE1041-.LBB1041
+	.4byte	0x14777
+	.8byte	.LBB1043
+	.8byte	.LBE1043-.LBB1043
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x10cd1
 	.uleb128 0x55
-	.4byte	0x14710
+	.4byte	0x14787
 	.uleb128 0x57
-	.8byte	.LBB1042
-	.8byte	.LBE1042-.LBB1042
+	.8byte	.LBB1044
+	.8byte	.LBE1044-.LBB1044
 	.uleb128 0x61
-	.4byte	0x1471b
-	.4byte	.LLST42
+	.4byte	0x14792
+	.4byte	.LLST40
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x270
 	.4byte	0x10c9c
 	.uleb128 0x61
-	.4byte	0x14727
-	.4byte	.LLST43
+	.4byte	0x1479e
+	.4byte	.LLST41
 	.uleb128 0x5d
-	.4byte	0x14c05
-	.8byte	.LBB1044
-	.8byte	.LBE1044-.LBB1044
+	.4byte	0x14c7c
+	.8byte	.LBB1046
+	.8byte	.LBE1046-.LBB1046
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14c21
+	.4byte	0x14c98
 	.uleb128 0x55
-	.4byte	0x14c15
+	.4byte	0x14c8c
 	.uleb128 0x57
-	.8byte	.LBB1045
-	.8byte	.LBE1045-.LBB1045
+	.8byte	.LBB1047
+	.8byte	.LBE1047-.LBB1047
 	.uleb128 0x58
-	.4byte	0x14c2d
+	.4byte	0x14ca4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14b7f
-	.8byte	.LBB1046
-	.8byte	.LBE1046-.LBB1046
+	.4byte	0x14bf6
+	.8byte	.LBB1048
+	.8byte	.LBE1048-.LBB1048
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1047
-	.8byte	.LBE1047-.LBB1047
+	.8byte	.LBB1049
+	.8byte	.LBE1049-.LBB1049
 	.uleb128 0x61
-	.4byte	0x14b8f
-	.4byte	.LLST44
+	.4byte	0x14c06
+	.4byte	.LLST42
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL146
-	.4byte	0x1531d
+	.8byte	.LVL144
+	.4byte	0x15394
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14635
-	.8byte	.LBB1056
+	.4byte	0x146ac
+	.8byte	.LBB1058
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
-	.2byte	0x916
+	.2byte	0x8fa
 	.4byte	0x10f01
 	.uleb128 0x55
-	.4byte	0x1465b
+	.4byte	0x146d2
 	.uleb128 0x55
-	.4byte	0x1464f
+	.4byte	0x146c6
 	.uleb128 0x55
-	.4byte	0x14645
+	.4byte	0x146bc
 	.uleb128 0x6e
-	.4byte	0x14695
-	.8byte	.LBB1057
+	.4byte	0x1470c
+	.8byte	.LBB1059
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x146bb
+	.4byte	0x14732
 	.uleb128 0x55
-	.4byte	0x146af
+	.4byte	0x14726
 	.uleb128 0x55
-	.4byte	0x146a5
+	.4byte	0x1471c
 	.uleb128 0x6f
-	.4byte	0x14734
-	.8byte	.LBB1059
+	.4byte	0x147ab
+	.8byte	.LBB1061
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x10e37
 	.uleb128 0x55
-	.4byte	0x14750
+	.4byte	0x147c7
 	.uleb128 0x70
-	.4byte	0x14744
-	.4byte	.LLST45
+	.4byte	0x147bb
+	.4byte	.LLST43
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x2f0
 	.uleb128 0x61
-	.4byte	0x1475c
-	.4byte	.LLST46
+	.4byte	0x147d3
+	.4byte	.LLST44
 	.uleb128 0x61
-	.4byte	0x14767
-	.4byte	.LLST47
+	.4byte	0x147de
+	.4byte	.LLST45
 	.uleb128 0x71
-	.4byte	0x14b7f
-	.8byte	.LBB1061
-	.8byte	.LBE1061-.LBB1061
+	.4byte	0x14bf6
+	.8byte	.LBB1063
+	.8byte	.LBE1063-.LBB1063
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10d9d
 	.uleb128 0x57
-	.8byte	.LBB1062
-	.8byte	.LBE1062-.LBB1062
+	.8byte	.LBB1064
+	.8byte	.LBE1064-.LBB1064
 	.uleb128 0x61
-	.4byte	0x14b8f
-	.4byte	.LLST48
+	.4byte	0x14c06
+	.4byte	.LLST46
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1063
-	.8byte	.LBE1063-.LBB1063
+	.8byte	.LBB1065
+	.8byte	.LBE1065-.LBB1065
 	.4byte	0x10df1
 	.uleb128 0x58
-	.4byte	0x14773
+	.4byte	0x147ea
 	.uleb128 0x5d
-	.4byte	0x14c05
-	.8byte	.LBB1064
-	.8byte	.LBE1064-.LBB1064
+	.4byte	0x14c7c
+	.8byte	.LBB1066
+	.8byte	.LBE1066-.LBB1066
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14c21
+	.4byte	0x14c98
 	.uleb128 0x55
-	.4byte	0x14c15
+	.4byte	0x14c8c
 	.uleb128 0x57
-	.8byte	.LBB1065
-	.8byte	.LBE1065-.LBB1065
+	.8byte	.LBB1067
+	.8byte	.LBE1067-.LBB1067
 	.uleb128 0x58
-	.4byte	0x14c2d
+	.4byte	0x14ca4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14b52
-	.8byte	.LBB1066
-	.8byte	.LBE1066-.LBB1066
+	.4byte	0x14bc9
+	.8byte	.LBB1068
+	.8byte	.LBE1068-.LBB1068
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14b6c
+	.4byte	0x14be3
 	.uleb128 0x55
-	.4byte	0x14b62
+	.4byte	0x14bd9
 	.uleb128 0x5d
-	.4byte	0x14c8f
-	.8byte	.LBB1067
-	.8byte	.LBE1067-.LBB1067
+	.4byte	0x14d06
+	.8byte	.LBB1069
+	.8byte	.LBE1069-.LBB1069
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14ca9
+	.4byte	0x14d20
 	.uleb128 0x55
-	.4byte	0x14c9f
+	.4byte	0x14d16
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14700
-	.8byte	.LBB1073
-	.8byte	.LBE1073-.LBB1073
+	.4byte	0x14777
+	.8byte	.LBB1075
+	.8byte	.LBE1075-.LBB1075
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x10ef2
 	.uleb128 0x55
-	.4byte	0x14710
+	.4byte	0x14787
 	.uleb128 0x57
-	.8byte	.LBB1074
-	.8byte	.LBE1074-.LBB1074
+	.8byte	.LBB1076
+	.8byte	.LBE1076-.LBB1076
 	.uleb128 0x61
-	.4byte	0x1471b
-	.4byte	.LLST49
+	.4byte	0x14792
+	.4byte	.LLST47
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x340
 	.4byte	0x10ebd
 	.uleb128 0x61
-	.4byte	0x14727
-	.4byte	.LLST50
+	.4byte	0x1479e
+	.4byte	.LLST48
 	.uleb128 0x5d
-	.4byte	0x14c05
-	.8byte	.LBB1076
-	.8byte	.LBE1076-.LBB1076
+	.4byte	0x14c7c
+	.8byte	.LBB1078
+	.8byte	.LBE1078-.LBB1078
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14c21
+	.4byte	0x14c98
 	.uleb128 0x55
-	.4byte	0x14c15
+	.4byte	0x14c8c
 	.uleb128 0x57
-	.8byte	.LBB1077
-	.8byte	.LBE1077-.LBB1077
+	.8byte	.LBB1079
+	.8byte	.LBE1079-.LBB1079
 	.uleb128 0x58
-	.4byte	0x14c2d
+	.4byte	0x14ca4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14b7f
-	.8byte	.LBB1078
-	.8byte	.LBE1078-.LBB1078
+	.4byte	0x14bf6
+	.8byte	.LBB1080
+	.8byte	.LBE1080-.LBB1080
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1079
-	.8byte	.LBE1079-.LBB1079
+	.8byte	.LBB1081
+	.8byte	.LBE1081-.LBB1081
 	.uleb128 0x61
-	.4byte	0x14b8f
-	.4byte	.LLST51
+	.4byte	0x14c06
+	.4byte	.LLST49
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL173
-	.4byte	0x15310
+	.8byte	.LVL171
+	.4byte	0x15387
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14665
-	.8byte	.LBB1090
+	.4byte	0x146dc
+	.8byte	.LBB1092
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
-	.2byte	0x966
+	.2byte	0x94a
 	.4byte	0x1113d
 	.uleb128 0x55
-	.4byte	0x1468b
+	.4byte	0x14702
 	.uleb128 0x55
-	.4byte	0x1467f
+	.4byte	0x146f6
 	.uleb128 0x55
-	.4byte	0x14675
+	.4byte	0x146ec
 	.uleb128 0x6e
-	.4byte	0x146c5
-	.8byte	.LBB1091
+	.4byte	0x1473c
+	.8byte	.LBB1093
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x146eb
+	.4byte	0x14762
 	.uleb128 0x55
-	.4byte	0x146df
+	.4byte	0x14756
 	.uleb128 0x55
-	.4byte	0x146d5
+	.4byte	0x1474c
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x370
 	.uleb128 0x61
-	.4byte	0x146f4
-	.4byte	.LLST52
+	.4byte	0x1476b
+	.4byte	.LLST50
 	.uleb128 0x6f
-	.4byte	0x14734
-	.8byte	.LBB1093
+	.4byte	0x147ab
+	.8byte	.LBB1095
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x11065
 	.uleb128 0x55
-	.4byte	0x14750
+	.4byte	0x147c7
 	.uleb128 0x70
-	.4byte	0x14744
-	.4byte	.LLST53
+	.4byte	0x147bb
+	.4byte	.LLST51
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x61
-	.4byte	0x1475c
-	.4byte	.LLST54
+	.4byte	0x147d3
+	.4byte	.LLST52
 	.uleb128 0x61
-	.4byte	0x14767
-	.4byte	.LLST55
+	.4byte	0x147de
+	.4byte	.LLST53
 	.uleb128 0x71
-	.4byte	0x14b7f
-	.8byte	.LBB1095
-	.8byte	.LBE1095-.LBB1095
+	.4byte	0x14bf6
+	.8byte	.LBB1097
+	.8byte	.LBE1097-.LBB1097
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10fcb
 	.uleb128 0x57
-	.8byte	.LBB1096
-	.8byte	.LBE1096-.LBB1096
+	.8byte	.LBB1098
+	.8byte	.LBE1098-.LBB1098
 	.uleb128 0x61
-	.4byte	0x14b8f
-	.4byte	.LLST56
+	.4byte	0x14c06
+	.4byte	.LLST54
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1097
-	.8byte	.LBE1097-.LBB1097
+	.8byte	.LBB1099
+	.8byte	.LBE1099-.LBB1099
 	.4byte	0x1101f
 	.uleb128 0x58
-	.4byte	0x14773
+	.4byte	0x147ea
 	.uleb128 0x5d
-	.4byte	0x14c05
-	.8byte	.LBB1098
-	.8byte	.LBE1098-.LBB1098
+	.4byte	0x14c7c
+	.8byte	.LBB1100
+	.8byte	.LBE1100-.LBB1100
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14c21
+	.4byte	0x14c98
 	.uleb128 0x55
-	.4byte	0x14c15
+	.4byte	0x14c8c
 	.uleb128 0x57
-	.8byte	.LBB1099
-	.8byte	.LBE1099-.LBB1099
+	.8byte	.LBB1101
+	.8byte	.LBE1101-.LBB1101
 	.uleb128 0x58
-	.4byte	0x14c2d
+	.4byte	0x14ca4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14b52
-	.8byte	.LBB1100
-	.8byte	.LBE1100-.LBB1100
+	.4byte	0x14bc9
+	.8byte	.LBB1102
+	.8byte	.LBE1102-.LBB1102
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14b6c
+	.4byte	0x14be3
 	.uleb128 0x55
-	.4byte	0x14b62
+	.4byte	0x14bd9
 	.uleb128 0x5d
-	.4byte	0x14c8f
-	.8byte	.LBB1101
-	.8byte	.LBE1101-.LBB1101
+	.4byte	0x14d06
+	.8byte	.LBB1103
+	.8byte	.LBE1103-.LBB1103
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14ca9
+	.4byte	0x14d20
 	.uleb128 0x55
-	.4byte	0x14c9f
+	.4byte	0x14d16
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14700
-	.8byte	.LBB1107
-	.8byte	.LBE1107-.LBB1107
+	.4byte	0x14777
+	.8byte	.LBB1109
+	.8byte	.LBE1109-.LBB1109
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x11120
 	.uleb128 0x55
-	.4byte	0x14710
+	.4byte	0x14787
 	.uleb128 0x57
-	.8byte	.LBB1108
-	.8byte	.LBE1108-.LBB1108
+	.8byte	.LBB1110
+	.8byte	.LBE1110-.LBB1110
 	.uleb128 0x61
-	.4byte	0x1471b
-	.4byte	.LLST57
+	.4byte	0x14792
+	.4byte	.LLST55
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x420
 	.4byte	0x110eb
 	.uleb128 0x61
-	.4byte	0x14727
-	.4byte	.LLST58
+	.4byte	0x1479e
+	.4byte	.LLST56
 	.uleb128 0x5d
-	.4byte	0x14c05
-	.8byte	.LBB1110
-	.8byte	.LBE1110-.LBB1110
+	.4byte	0x14c7c
+	.8byte	.LBB1112
+	.8byte	.LBE1112-.LBB1112
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14c21
+	.4byte	0x14c98
 	.uleb128 0x55
-	.4byte	0x14c15
+	.4byte	0x14c8c
 	.uleb128 0x57
-	.8byte	.LBB1111
-	.8byte	.LBE1111-.LBB1111
+	.8byte	.LBB1113
+	.8byte	.LBE1113-.LBB1113
 	.uleb128 0x58
-	.4byte	0x14c2d
+	.4byte	0x14ca4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14b7f
-	.8byte	.LBB1112
-	.8byte	.LBE1112-.LBB1112
+	.4byte	0x14bf6
+	.8byte	.LBB1114
+	.8byte	.LBE1114-.LBB1114
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1113
-	.8byte	.LBE1113-.LBB1113
+	.8byte	.LBB1115
+	.8byte	.LBE1115-.LBB1115
 	.uleb128 0x61
-	.4byte	0x14b8f
-	.4byte	.LLST59
+	.4byte	0x14c06
+	.4byte	.LLST57
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL185
-	.4byte	0x1531d
+	.8byte	.LVL183
+	.4byte	0x15394
 	.uleb128 0x4f
-	.8byte	.LVL263
-	.4byte	0x15133
+	.8byte	.LVL261
+	.4byte	0x151aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14635
-	.8byte	.LBB1126
+	.4byte	0x146ac
+	.8byte	.LBB1128
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
-	.2byte	0x984
+	.2byte	0x968
 	.4byte	0x111ef
 	.uleb128 0x55
-	.4byte	0x1465b
+	.4byte	0x146d2
 	.uleb128 0x55
-	.4byte	0x1464f
+	.4byte	0x146c6
 	.uleb128 0x55
-	.4byte	0x14645
+	.4byte	0x146bc
 	.uleb128 0x6e
-	.4byte	0x14695
-	.8byte	.LBB1127
+	.4byte	0x1470c
+	.8byte	.LBB1129
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x146bb
+	.4byte	0x14732
 	.uleb128 0x55
-	.4byte	0x146af
+	.4byte	0x14726
 	.uleb128 0x55
-	.4byte	0x146a5
+	.4byte	0x1471c
 	.uleb128 0x6e
-	.4byte	0x14734
-	.8byte	.LBB1129
+	.4byte	0x147ab
+	.8byte	.LBB1131
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x55
-	.4byte	0x14750
+	.4byte	0x147c7
 	.uleb128 0x72
-	.4byte	0x14744
+	.4byte	0x147bb
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x4b0
 	.uleb128 0x58
-	.4byte	0x1475c
+	.4byte	0x147d3
 	.uleb128 0x61
-	.4byte	0x14767
-	.4byte	.LLST60
+	.4byte	0x147de
+	.4byte	.LLST58
 	.uleb128 0x5d
-	.4byte	0x14b7f
-	.8byte	.LBB1131
-	.8byte	.LBE1131-.LBB1131
+	.4byte	0x14bf6
+	.8byte	.LBB1133
+	.8byte	.LBE1133-.LBB1133
 	.byte	0x6
 	.byte	0x4d
 	.uleb128 0x57
-	.8byte	.LBB1132
-	.8byte	.LBE1132-.LBB1132
+	.8byte	.LBB1134
+	.8byte	.LBE1134-.LBB1134
 	.uleb128 0x61
-	.4byte	0x14b8f
-	.4byte	.LLST61
+	.4byte	0x14c06
+	.4byte	.LLST59
 	.byte	0
 	.byte	0
 	.byte	0
@@ -43403,428 +43508,428 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14635
-	.8byte	.LBB1138
+	.4byte	0x146ac
+	.8byte	.LBB1140
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
-	.2byte	0x974
+	.2byte	0x958
 	.4byte	0x1140f
 	.uleb128 0x55
-	.4byte	0x1465b
+	.4byte	0x146d2
 	.uleb128 0x55
-	.4byte	0x1464f
+	.4byte	0x146c6
 	.uleb128 0x55
-	.4byte	0x14645
+	.4byte	0x146bc
 	.uleb128 0x6e
-	.4byte	0x14695
-	.8byte	.LBB1139
+	.4byte	0x1470c
+	.8byte	.LBB1141
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x146bb
+	.4byte	0x14732
 	.uleb128 0x55
-	.4byte	0x146af
+	.4byte	0x14726
 	.uleb128 0x55
-	.4byte	0x146a5
+	.4byte	0x1471c
 	.uleb128 0x6f
-	.4byte	0x14734
-	.8byte	.LBB1141
+	.4byte	0x147ab
+	.8byte	.LBB1143
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x11345
 	.uleb128 0x55
-	.4byte	0x14750
+	.4byte	0x147c7
 	.uleb128 0x70
-	.4byte	0x14744
-	.4byte	.LLST62
+	.4byte	0x147bb
+	.4byte	.LLST60
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x540
 	.uleb128 0x61
-	.4byte	0x1475c
-	.4byte	.LLST63
+	.4byte	0x147d3
+	.4byte	.LLST61
 	.uleb128 0x61
-	.4byte	0x14767
-	.4byte	.LLST64
+	.4byte	0x147de
+	.4byte	.LLST62
 	.uleb128 0x71
-	.4byte	0x14b7f
-	.8byte	.LBB1143
-	.8byte	.LBE1143-.LBB1143
+	.4byte	0x14bf6
+	.8byte	.LBB1145
+	.8byte	.LBE1145-.LBB1145
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x112ab
 	.uleb128 0x57
-	.8byte	.LBB1144
-	.8byte	.LBE1144-.LBB1144
+	.8byte	.LBB1146
+	.8byte	.LBE1146-.LBB1146
 	.uleb128 0x61
-	.4byte	0x14b8f
-	.4byte	.LLST65
+	.4byte	0x14c06
+	.4byte	.LLST63
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1145
-	.8byte	.LBE1145-.LBB1145
+	.8byte	.LBB1147
+	.8byte	.LBE1147-.LBB1147
 	.4byte	0x112ff
 	.uleb128 0x58
-	.4byte	0x14773
+	.4byte	0x147ea
 	.uleb128 0x5d
-	.4byte	0x14c05
-	.8byte	.LBB1146
-	.8byte	.LBE1146-.LBB1146
+	.4byte	0x14c7c
+	.8byte	.LBB1148
+	.8byte	.LBE1148-.LBB1148
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14c21
+	.4byte	0x14c98
 	.uleb128 0x55
-	.4byte	0x14c15
+	.4byte	0x14c8c
 	.uleb128 0x57
-	.8byte	.LBB1147
-	.8byte	.LBE1147-.LBB1147
+	.8byte	.LBB1149
+	.8byte	.LBE1149-.LBB1149
 	.uleb128 0x58
-	.4byte	0x14c2d
+	.4byte	0x14ca4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14b52
-	.8byte	.LBB1148
-	.8byte	.LBE1148-.LBB1148
+	.4byte	0x14bc9
+	.8byte	.LBB1150
+	.8byte	.LBE1150-.LBB1150
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14b6c
+	.4byte	0x14be3
 	.uleb128 0x55
-	.4byte	0x14b62
+	.4byte	0x14bd9
 	.uleb128 0x5d
-	.4byte	0x14c8f
-	.8byte	.LBB1149
-	.8byte	.LBE1149-.LBB1149
+	.4byte	0x14d06
+	.8byte	.LBB1151
+	.8byte	.LBE1151-.LBB1151
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14ca9
+	.4byte	0x14d20
 	.uleb128 0x55
-	.4byte	0x14c9f
+	.4byte	0x14d16
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14700
-	.8byte	.LBB1157
-	.8byte	.LBE1157-.LBB1157
+	.4byte	0x14777
+	.8byte	.LBB1159
+	.8byte	.LBE1159-.LBB1159
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x11400
 	.uleb128 0x55
-	.4byte	0x14710
+	.4byte	0x14787
 	.uleb128 0x57
-	.8byte	.LBB1158
-	.8byte	.LBE1158-.LBB1158
+	.8byte	.LBB1160
+	.8byte	.LBE1160-.LBB1160
 	.uleb128 0x61
-	.4byte	0x1471b
-	.4byte	.LLST66
+	.4byte	0x14792
+	.4byte	.LLST64
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x590
 	.4byte	0x113cb
 	.uleb128 0x61
-	.4byte	0x14727
-	.4byte	.LLST67
+	.4byte	0x1479e
+	.4byte	.LLST65
 	.uleb128 0x5d
-	.4byte	0x14c05
-	.8byte	.LBB1160
-	.8byte	.LBE1160-.LBB1160
+	.4byte	0x14c7c
+	.8byte	.LBB1162
+	.8byte	.LBE1162-.LBB1162
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14c21
+	.4byte	0x14c98
 	.uleb128 0x55
-	.4byte	0x14c15
+	.4byte	0x14c8c
 	.uleb128 0x57
-	.8byte	.LBB1161
-	.8byte	.LBE1161-.LBB1161
+	.8byte	.LBB1163
+	.8byte	.LBE1163-.LBB1163
 	.uleb128 0x58
-	.4byte	0x14c2d
+	.4byte	0x14ca4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14b7f
-	.8byte	.LBB1162
-	.8byte	.LBE1162-.LBB1162
+	.4byte	0x14bf6
+	.8byte	.LBB1164
+	.8byte	.LBE1164-.LBB1164
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1163
-	.8byte	.LBE1163-.LBB1163
+	.8byte	.LBB1165
+	.8byte	.LBE1165-.LBB1165
 	.uleb128 0x61
-	.4byte	0x14b8f
-	.4byte	.LLST68
+	.4byte	0x14c06
+	.4byte	.LLST66
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL246
-	.4byte	0x15310
+	.8byte	.LVL244
+	.4byte	0x15387
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14635
-	.8byte	.LBB1174
+	.4byte	0x146ac
+	.8byte	.LBB1176
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
-	.2byte	0x925
+	.2byte	0x909
 	.4byte	0x1162f
 	.uleb128 0x55
-	.4byte	0x1465b
+	.4byte	0x146d2
 	.uleb128 0x55
-	.4byte	0x1464f
+	.4byte	0x146c6
 	.uleb128 0x55
-	.4byte	0x14645
+	.4byte	0x146bc
 	.uleb128 0x6e
-	.4byte	0x14695
-	.8byte	.LBB1175
+	.4byte	0x1470c
+	.8byte	.LBB1177
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x146bb
+	.4byte	0x14732
 	.uleb128 0x55
-	.4byte	0x146af
+	.4byte	0x14726
 	.uleb128 0x55
-	.4byte	0x146a5
+	.4byte	0x1471c
 	.uleb128 0x6f
-	.4byte	0x14734
-	.8byte	.LBB1177
+	.4byte	0x147ab
+	.8byte	.LBB1179
 	.4byte	.Ldebug_ranges0+0x620
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x11565
 	.uleb128 0x55
-	.4byte	0x14750
+	.4byte	0x147c7
 	.uleb128 0x70
-	.4byte	0x14744
-	.4byte	.LLST69
+	.4byte	0x147bb
+	.4byte	.LLST67
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x620
 	.uleb128 0x61
-	.4byte	0x1475c
-	.4byte	.LLST70
+	.4byte	0x147d3
+	.4byte	.LLST68
 	.uleb128 0x61
-	.4byte	0x14767
-	.4byte	.LLST71
+	.4byte	0x147de
+	.4byte	.LLST69
 	.uleb128 0x71
-	.4byte	0x14b7f
-	.8byte	.LBB1179
-	.8byte	.LBE1179-.LBB1179
+	.4byte	0x14bf6
+	.8byte	.LBB1181
+	.8byte	.LBE1181-.LBB1181
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x114cb
 	.uleb128 0x57
-	.8byte	.LBB1180
-	.8byte	.LBE1180-.LBB1180
+	.8byte	.LBB1182
+	.8byte	.LBE1182-.LBB1182
 	.uleb128 0x61
-	.4byte	0x14b8f
-	.4byte	.LLST72
+	.4byte	0x14c06
+	.4byte	.LLST70
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1181
-	.8byte	.LBE1181-.LBB1181
+	.8byte	.LBB1183
+	.8byte	.LBE1183-.LBB1183
 	.4byte	0x1151f
 	.uleb128 0x58
-	.4byte	0x14773
+	.4byte	0x147ea
 	.uleb128 0x5d
-	.4byte	0x14c05
-	.8byte	.LBB1182
-	.8byte	.LBE1182-.LBB1182
+	.4byte	0x14c7c
+	.8byte	.LBB1184
+	.8byte	.LBE1184-.LBB1184
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14c21
+	.4byte	0x14c98
 	.uleb128 0x55
-	.4byte	0x14c15
+	.4byte	0x14c8c
 	.uleb128 0x57
-	.8byte	.LBB1183
-	.8byte	.LBE1183-.LBB1183
+	.8byte	.LBB1185
+	.8byte	.LBE1185-.LBB1185
 	.uleb128 0x58
-	.4byte	0x14c2d
+	.4byte	0x14ca4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14b52
-	.8byte	.LBB1184
-	.8byte	.LBE1184-.LBB1184
+	.4byte	0x14bc9
+	.8byte	.LBB1186
+	.8byte	.LBE1186-.LBB1186
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14b6c
+	.4byte	0x14be3
 	.uleb128 0x55
-	.4byte	0x14b62
+	.4byte	0x14bd9
 	.uleb128 0x5d
-	.4byte	0x14c8f
-	.8byte	.LBB1185
-	.8byte	.LBE1185-.LBB1185
+	.4byte	0x14d06
+	.8byte	.LBB1187
+	.8byte	.LBE1187-.LBB1187
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14ca9
+	.4byte	0x14d20
 	.uleb128 0x55
-	.4byte	0x14c9f
+	.4byte	0x14d16
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14700
-	.8byte	.LBB1193
-	.8byte	.LBE1193-.LBB1193
+	.4byte	0x14777
+	.8byte	.LBB1195
+	.8byte	.LBE1195-.LBB1195
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x11620
 	.uleb128 0x55
-	.4byte	0x14710
+	.4byte	0x14787
 	.uleb128 0x57
-	.8byte	.LBB1194
-	.8byte	.LBE1194-.LBB1194
+	.8byte	.LBB1196
+	.8byte	.LBE1196-.LBB1196
 	.uleb128 0x61
-	.4byte	0x1471b
-	.4byte	.LLST73
+	.4byte	0x14792
+	.4byte	.LLST71
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x670
 	.4byte	0x115eb
 	.uleb128 0x61
-	.4byte	0x14727
-	.4byte	.LLST74
+	.4byte	0x1479e
+	.4byte	.LLST72
 	.uleb128 0x5d
-	.4byte	0x14c05
-	.8byte	.LBB1196
-	.8byte	.LBE1196-.LBB1196
+	.4byte	0x14c7c
+	.8byte	.LBB1198
+	.8byte	.LBE1198-.LBB1198
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14c21
+	.4byte	0x14c98
 	.uleb128 0x55
-	.4byte	0x14c15
+	.4byte	0x14c8c
 	.uleb128 0x57
-	.8byte	.LBB1197
-	.8byte	.LBE1197-.LBB1197
+	.8byte	.LBB1199
+	.8byte	.LBE1199-.LBB1199
 	.uleb128 0x58
-	.4byte	0x14c2d
+	.4byte	0x14ca4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14b7f
-	.8byte	.LBB1198
-	.8byte	.LBE1198-.LBB1198
+	.4byte	0x14bf6
+	.8byte	.LBB1200
+	.8byte	.LBE1200-.LBB1200
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1199
-	.8byte	.LBE1199-.LBB1199
+	.8byte	.LBB1201
+	.8byte	.LBE1201-.LBB1201
 	.uleb128 0x61
-	.4byte	0x14b8f
-	.4byte	.LLST75
+	.4byte	0x14c06
+	.4byte	.LLST73
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL254
-	.4byte	0x15310
+	.8byte	.LVL252
+	.4byte	0x15387
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL87
-	.4byte	0x151c5
+	.8byte	.LVL85
+	.4byte	0x1523c
 	.uleb128 0x4f
-	.8byte	.LVL88
-	.4byte	0x15227
+	.8byte	.LVL86
+	.4byte	0x1529e
 	.uleb128 0x4f
-	.8byte	.LVL89
-	.4byte	0x152d2
+	.8byte	.LVL87
+	.4byte	0x15349
 	.uleb128 0x4f
-	.8byte	.LVL100
-	.4byte	0x1532a
+	.8byte	.LVL98
+	.4byte	0x153a1
 	.uleb128 0x4f
-	.8byte	.LVL103
-	.4byte	0x15149
+	.8byte	.LVL101
+	.4byte	0x151c0
 	.uleb128 0x4f
-	.8byte	.LVL106
-	.4byte	0x150cf
+	.8byte	.LVL104
+	.4byte	0x15146
 	.uleb128 0x4f
-	.8byte	.LVL123
-	.4byte	0x152d2
+	.8byte	.LVL121
+	.4byte	0x15349
+	.uleb128 0x4f
+	.8byte	.LVL122
+	.4byte	0x153ad
 	.uleb128 0x4f
 	.8byte	.LVL124
-	.4byte	0x15336
+	.4byte	0x15248
 	.uleb128 0x4f
-	.8byte	.LVL126
-	.4byte	0x151d1
+	.8byte	.LVL131
+	.4byte	0x1523c
 	.uleb128 0x4f
-	.8byte	.LVL133
-	.4byte	0x151c5
+	.8byte	.LVL145
+	.4byte	0x153b9
 	.uleb128 0x4f
-	.8byte	.LVL147
-	.4byte	0x15342
+	.8byte	.LVL146
+	.4byte	0x15248
 	.uleb128 0x4f
-	.8byte	.LVL148
-	.4byte	0x151d1
+	.8byte	.LVL147
+	.4byte	0x15292
 	.uleb128 0x4f
-	.8byte	.LVL149
-	.4byte	0x1521b
+	.8byte	.LVL157
+	.4byte	0x153c5
 	.uleb128 0x4f
-	.8byte	.LVL159
-	.4byte	0x1534e
+	.8byte	.LVL158
+	.4byte	0x15349
 	.uleb128 0x4f
-	.8byte	.LVL160
-	.4byte	0x152d2
+	.8byte	.LVL185
+	.4byte	0x15146
 	.uleb128 0x4f
-	.8byte	.LVL187
-	.4byte	0x150cf
+	.8byte	.LVL188
+	.4byte	0x15146
 	.uleb128 0x4f
 	.8byte	.LVL190
-	.4byte	0x150cf
+	.4byte	0x1523c
 	.uleb128 0x4f
 	.8byte	.LVL192
-	.4byte	0x151c5
+	.4byte	0x1523c
 	.uleb128 0x4f
-	.8byte	.LVL194
-	.4byte	0x151c5
+	.8byte	.LVL193
+	.4byte	0x1529e
 	.uleb128 0x4f
-	.8byte	.LVL195
-	.4byte	0x15227
+	.8byte	.LVL194
+	.4byte	0x15349
 	.uleb128 0x4f
-	.8byte	.LVL196
-	.4byte	0x152d2
+	.8byte	.LVL207
+	.4byte	0x151c0
 	.uleb128 0x4f
-	.8byte	.LVL209
-	.4byte	0x15149
+	.8byte	.LVL210
+	.4byte	0x151c0
 	.uleb128 0x4f
 	.8byte	.LVL212
-	.4byte	0x15149
-	.uleb128 0x4f
-	.8byte	.LVL214
-	.4byte	0x151c5
+	.4byte	0x1523c
 	.uleb128 0x4f
-	.8byte	.LVL215
-	.4byte	0x152d2
+	.8byte	.LVL213
+	.4byte	0x15349
 	.uleb128 0x4f
-	.8byte	.LVL223
-	.4byte	0x1532a
+	.8byte	.LVL221
+	.4byte	0x153a1
 	.uleb128 0x4f
-	.8byte	.LVL257
-	.4byte	0x1521b
+	.8byte	.LVL255
+	.4byte	0x15292
 	.uleb128 0x4f
-	.8byte	.LVL264
-	.4byte	0x15149
+	.8byte	.LVL262
+	.4byte	0x151c0
 	.uleb128 0x4f
-	.8byte	.LVL265
-	.4byte	0x1527d
+	.8byte	.LVL263
+	.4byte	0x152f4
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
@@ -43838,140 +43943,140 @@ __exitcall_ebc_exit:
 	.uleb128 0x64
 	.4byte	.LASF3095
 	.byte	0x1
-	.2byte	0x8aa
+	.2byte	0x88e
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x117e8
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x8aa
+	.2byte	0x88e
 	.4byte	0xe1f4
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x8ac
+	.2byte	0x890
 	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x8a4
-	.8byte	.LFB2839
-	.8byte	.LFE2839-.LFB2839
+	.2byte	0x888
+	.8byte	.LFB2840
+	.8byte	.LFE2840-.LFB2840
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x11822
 	.uleb128 0x52
 	.string	"t"
 	.byte	0x1
-	.2byte	0x8a4
+	.2byte	0x888
 	.4byte	0x31d2
-	.4byte	.LLST76
+	.4byte	.LLST74
 	.uleb128 0x4f
-	.8byte	.LVL278
-	.4byte	0x12412
+	.8byte	.LVL276
+	.4byte	0x12457
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x898
-	.8byte	.LFB2838
-	.8byte	.LFE2838-.LFB2838
+	.2byte	0x87c
+	.8byte	.LFB2839
+	.8byte	.LFE2839-.LFB2839
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x11882
 	.uleb128 0x52
 	.string	"t"
 	.byte	0x1
-	.2byte	0x898
+	.2byte	0x87c
 	.4byte	0x31d2
-	.4byte	.LLST14
+	.4byte	.LLST12
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x89a
+	.2byte	0x87e
 	.4byte	0xe874
 	.uleb128 0x60
-	.4byte	0x145bf
-	.8byte	.LBB954
+	.4byte	0x14636
+	.8byte	.LBB956
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.2byte	0x89e
+	.2byte	0x882
 	.uleb128 0x55
-	.4byte	0x145cc
+	.4byte	0x14643
 	.uleb128 0x4f
-	.8byte	.LVL73
-	.4byte	0x1535a
+	.8byte	.LVL71
+	.4byte	0x153d1
 	.byte	0
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x887
+	.2byte	0x86b
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x118ac
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x887
+	.2byte	0x86b
 	.4byte	0xe1f4
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x889
+	.2byte	0x86d
 	.4byte	0xe4f2
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x734
+	.2byte	0x71a
 	.4byte	0xc6
-	.8byte	.LFB2836
-	.8byte	.LFE2836-.LFB2836
+	.8byte	.LFB2837
+	.8byte	.LFE2837-.LFB2837
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12166
+	.4byte	0x12193
 	.uleb128 0x52
 	.string	"ptr"
 	.byte	0x1
-	.2byte	0x734
+	.2byte	0x71a
 	.4byte	0x458
-	.4byte	.LLST237
+	.4byte	.LLST235
 	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x736
+	.2byte	0x71c
 	.4byte	0xe557
-	.4byte	.LLST238
+	.4byte	.LLST236
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x737
+	.2byte	0x71d
 	.4byte	0xe874
 	.uleb128 0x5b
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x738
+	.2byte	0x71e
 	.4byte	0xe4f2
-	.4byte	.LLST239
+	.4byte	.LLST237
 	.uleb128 0x5a
 	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x739
+	.2byte	0x71f
 	.4byte	0xc6
-	.4byte	.LLST240
+	.4byte	.LLST238
 	.uleb128 0x5a
 	.4byte	.LASF2989
 	.byte	0x1
-	.2byte	0x73a
+	.2byte	0x720
 	.4byte	0xc6
-	.4byte	.LLST241
+	.4byte	.LLST239
 	.uleb128 0x4d
 	.4byte	.LASF3102
 	.byte	0x1
-	.2byte	0x73b
+	.2byte	0x721
 	.4byte	0xd95c
 	.uleb128 0x3
 	.byte	0x91
@@ -43979,34 +44084,34 @@ __exitcall_ebc_exit:
 	.uleb128 0x5a
 	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x73c
+	.2byte	0x722
 	.4byte	0xe4f2
-	.4byte	.LLST242
+	.4byte	.LLST240
 	.uleb128 0x6c
 	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x855
-	.8byte	.L897
+	.2byte	0x839
+	.8byte	.L916
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1270
+	.4byte	.Ldebug_ranges0+0x1230
 	.4byte	0x119fc
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x791
+	.2byte	0x777
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB1885
-	.8byte	.LBE1885-.LBB1885
+	.8byte	.LBB1882
+	.8byte	.LBE1882-.LBB1882
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x791
-	.8byte	.L878
+	.2byte	0x777
+	.8byte	.L897
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x791
+	.2byte	0x777
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -44014,52 +44119,52 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x791
+	.2byte	0x777
 	.4byte	0x199
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x12a0
+	.4byte	.Ldebug_ranges0+0x1260
 	.4byte	0x119e0
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x791
+	.2byte	0x777
 	.4byte	0x199
-	.4byte	.LLST257
+	.4byte	.LLST256
 	.uleb128 0x4f
-	.8byte	.LVL984
-	.4byte	0x152de
+	.8byte	.LVL989
+	.4byte	0x15355
 	.uleb128 0x4f
-	.8byte	.LVL985
-	.4byte	0x152ea
+	.8byte	.LVL990
+	.4byte	0x15361
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL982
-	.4byte	0x152f7
+	.8byte	.LVL987
+	.4byte	0x1536e
 	.uleb128 0x4f
-	.8byte	.LVL986
-	.4byte	0x15303
+	.8byte	.LVL991
+	.4byte	0x1537a
 	.byte	0
 	.byte	0
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1210
+	.4byte	.Ldebug_ranges0+0x11d0
 	.4byte	0x11a9e
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x841
+	.2byte	0x825
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB1881
-	.8byte	.LBE1881-.LBB1881
+	.8byte	.LBB1878
+	.8byte	.LBE1878-.LBB1878
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x841
-	.8byte	.L937
+	.2byte	0x825
+	.8byte	.L957
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x841
+	.2byte	0x825
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -44067,52 +44172,52 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x841
+	.2byte	0x825
 	.4byte	0x199
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1240
+	.4byte	.Ldebug_ranges0+0x1200
 	.4byte	0x11a82
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x841
+	.2byte	0x825
 	.4byte	0x199
-	.4byte	.LLST256
+	.4byte	.LLST255
 	.uleb128 0x4f
-	.8byte	.LVL994
-	.4byte	0x152de
+	.8byte	.LVL999
+	.4byte	0x15355
 	.uleb128 0x4f
-	.8byte	.LVL995
-	.4byte	0x152ea
+	.8byte	.LVL1000
+	.4byte	0x15361
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL992
-	.4byte	0x152f7
+	.8byte	.LVL997
+	.4byte	0x1536e
 	.uleb128 0x4f
-	.8byte	.LVL996
-	.4byte	0x15303
+	.8byte	.LVL1001
+	.4byte	0x1537a
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1871
-	.8byte	.LBE1871-.LBB1871
+	.8byte	.LBB1868
+	.8byte	.LBE1868-.LBB1868
 	.4byte	0x11b50
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x873
+	.2byte	0x857
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB1872
-	.8byte	.LBE1872-.LBB1872
+	.8byte	.LBB1869
+	.8byte	.LBE1869-.LBB1869
 	.uleb128 0x73
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x873
+	.2byte	0x857
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x873
+	.2byte	0x857
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -44120,52 +44225,52 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x873
+	.2byte	0x857
 	.4byte	0x199
 	.uleb128 0x6d
-	.8byte	.LBB1873
-	.8byte	.LBE1873-.LBB1873
+	.8byte	.LBB1870
+	.8byte	.LBE1870-.LBB1870
 	.4byte	0x11b34
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x873
+	.2byte	0x857
 	.4byte	0x199
-	.4byte	.LLST254
+	.4byte	.LLST253
 	.uleb128 0x4f
-	.8byte	.LVL923
-	.4byte	0x152de
+	.8byte	.LVL915
+	.4byte	0x15355
 	.uleb128 0x4f
-	.8byte	.LVL924
-	.4byte	0x152ea
+	.8byte	.LVL916
+	.4byte	0x15361
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL921
-	.4byte	0x152f7
+	.8byte	.LVL913
+	.4byte	0x1536e
 	.uleb128 0x4f
-	.8byte	.LVL925
-	.4byte	0x15303
+	.8byte	.LVL917
+	.4byte	0x1537a
 	.byte	0
 	.byte	0
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x10c0
+	.4byte	.Ldebug_ranges0+0x1090
 	.4byte	0x11be6
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x87f
+	.2byte	0x863
 	.4byte	0xc6
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x10c0
+	.4byte	.Ldebug_ranges0+0x1090
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x87f
-	.8byte	.L954
+	.2byte	0x863
+	.8byte	.L974
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x87f
+	.2byte	0x863
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -44173,883 +44278,915 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x87f
+	.2byte	0x863
 	.4byte	0x199
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1100
+	.4byte	.Ldebug_ranges0+0x10d0
 	.4byte	0x11bca
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x87f
+	.2byte	0x863
 	.4byte	0x199
-	.4byte	.LLST243
-	.uleb128 0x4f
-	.8byte	.LVL873
-	.4byte	0x152de
+	.4byte	.LLST241
 	.uleb128 0x4f
 	.8byte	.LVL874
-	.4byte	0x152ea
+	.4byte	0x15355
+	.uleb128 0x4f
+	.8byte	.LVL875
+	.4byte	0x15361
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL871
-	.4byte	0x152f7
+	.8byte	.LVL872
+	.4byte	0x1536e
 	.uleb128 0x4f
-	.8byte	.LVL875
-	.4byte	0x15303
+	.8byte	.LVL876
+	.4byte	0x1537a
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x121ba
+	.4byte	0x121e7
 	.8byte	.LBB1857
-	.4byte	.Ldebug_ranges0+0x1140
+	.4byte	.Ldebug_ranges0+0x1110
 	.byte	0x1
-	.2byte	0x816
-	.4byte	0x11c37
+	.2byte	0x7fc
+	.4byte	0x11c4a
+	.uleb128 0x55
+	.4byte	0x121f8
 	.uleb128 0x55
-	.4byte	0x121e3
+	.4byte	0x121f8
 	.uleb128 0x55
-	.4byte	0x121d7
+	.4byte	0x12204
 	.uleb128 0x55
-	.4byte	0x121cb
+	.4byte	0x12204
+	.uleb128 0x55
+	.4byte	0x12210
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x1140
+	.4byte	.Ldebug_ranges0+0x1110
 	.uleb128 0x58
-	.4byte	0x121ef
+	.4byte	0x1221c
 	.uleb128 0x58
-	.4byte	0x121f9
+	.4byte	0x12226
 	.uleb128 0x58
-	.4byte	0x12205
+	.4byte	0x12232
 	.uleb128 0x58
-	.4byte	0x12211
+	.4byte	0x1223e
+	.uleb128 0x61
+	.4byte	0x1224a
+	.4byte	.LLST242
 	.uleb128 0x58
-	.4byte	0x1221d
+	.4byte	0x12256
 	.uleb128 0x58
-	.4byte	0x12229
+	.4byte	0x12262
 	.uleb128 0x74
-	.4byte	0x12235
+	.4byte	0x1226e
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13ec4
-	.8byte	.LBB1863
-	.4byte	.Ldebug_ranges0+0x1180
+	.4byte	0x13f2e
+	.8byte	.LBB1860
+	.4byte	.Ldebug_ranges0+0x1140
 	.byte	0x1
-	.2byte	0x7b5
-	.4byte	0x11cfd
+	.2byte	0x79b
+	.4byte	0x11d10
 	.uleb128 0x55
-	.4byte	0x13f01
+	.4byte	0x13f6b
 	.uleb128 0x55
-	.4byte	0x13f01
+	.4byte	0x13f6b
 	.uleb128 0x55
-	.4byte	0x13f01
+	.4byte	0x13f6b
 	.uleb128 0x55
-	.4byte	0x13f0d
+	.4byte	0x13f77
 	.uleb128 0x55
-	.4byte	0x13ef5
+	.4byte	0x13f5f
 	.uleb128 0x55
-	.4byte	0x13ee9
+	.4byte	0x13f53
 	.uleb128 0x55
-	.4byte	0x13edd
+	.4byte	0x13f47
 	.uleb128 0x55
-	.4byte	0x13ed1
+	.4byte	0x13f3b
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x1180
+	.4byte	.Ldebug_ranges0+0x1140
 	.uleb128 0x58
-	.4byte	0x13f19
+	.4byte	0x13f83
 	.uleb128 0x61
-	.4byte	0x13f25
-	.4byte	.LLST244
+	.4byte	0x13f8f
+	.4byte	.LLST243
 	.uleb128 0x58
-	.4byte	0x13f31
+	.4byte	0x13f9b
 	.uleb128 0x61
-	.4byte	0x13f3d
-	.4byte	.LLST245
+	.4byte	0x13fa7
+	.4byte	.LLST244
 	.uleb128 0x61
-	.4byte	0x13f49
-	.4byte	.LLST246
+	.4byte	0x13fb3
+	.4byte	.LLST245
 	.uleb128 0x58
-	.4byte	0x13f55
+	.4byte	0x13fbf
 	.uleb128 0x58
-	.4byte	0x13f61
+	.4byte	0x13fcb
 	.uleb128 0x58
-	.4byte	0x13f6d
+	.4byte	0x13fd7
 	.uleb128 0x61
-	.4byte	0x13f79
-	.4byte	.LLST247
+	.4byte	0x13fe3
+	.4byte	.LLST246
 	.uleb128 0x58
-	.4byte	0x13f85
+	.4byte	0x13fef
 	.uleb128 0x61
-	.4byte	0x13f91
-	.4byte	.LLST248
+	.4byte	0x13ffb
+	.4byte	.LLST247
 	.uleb128 0x62
-	.4byte	0x13f9d
+	.4byte	0x14007
 	.uleb128 0x1
 	.byte	0x60
 	.uleb128 0x61
-	.4byte	0x13fa7
+	.4byte	0x14011
+	.4byte	.LLST248
+	.uleb128 0x61
+	.4byte	0x1401b
 	.4byte	.LLST249
 	.uleb128 0x61
-	.4byte	0x13fb1
+	.4byte	0x14027
 	.4byte	.LLST250
 	.uleb128 0x61
-	.4byte	0x13fbd
+	.4byte	0x14033
 	.4byte	.LLST251
 	.uleb128 0x61
-	.4byte	0x13fc9
+	.4byte	0x1403f
 	.4byte	.LLST252
-	.uleb128 0x61
-	.4byte	0x13fd5
-	.4byte	.LLST253
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1421e
-	.8byte	.LBB1874
-	.8byte	.LBE1874-.LBB1874
+	.4byte	0x14288
+	.8byte	.LBB1871
+	.8byte	.LBE1871-.LBB1871
 	.byte	0x1
-	.2byte	0x87c
-	.4byte	0x11d48
+	.2byte	0x860
+	.4byte	0x11d5b
 	.uleb128 0x55
-	.4byte	0x14239
+	.4byte	0x142a3
 	.uleb128 0x55
-	.4byte	0x1422e
+	.4byte	0x14298
 	.uleb128 0x57
-	.8byte	.LBB1875
-	.8byte	.LBE1875-.LBB1875
+	.8byte	.LBB1872
+	.8byte	.LBE1872-.LBB1872
 	.uleb128 0x58
-	.4byte	0x14245
+	.4byte	0x142af
 	.uleb128 0x4f
-	.8byte	.LVL926
-	.4byte	0x14ee6
+	.8byte	.LVL918
+	.4byte	0x14f5d
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12166
-	.8byte	.LBB1876
-	.4byte	.Ldebug_ranges0+0x11e0
+	.4byte	0x12193
+	.8byte	.LBB1873
+	.4byte	.Ldebug_ranges0+0x11a0
 	.byte	0x1
-	.2byte	0x772
-	.4byte	0x11d89
+	.2byte	0x758
+	.4byte	0x11d9c
 	.uleb128 0x55
-	.4byte	0x1218b
+	.4byte	0x121b8
 	.uleb128 0x55
-	.4byte	0x1217f
+	.4byte	0x121ac
 	.uleb128 0x70
-	.4byte	0x12173
-	.4byte	.LLST255
+	.4byte	0x121a0
+	.4byte	.LLST254
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x11e0
+	.4byte	.Ldebug_ranges0+0x11a0
 	.uleb128 0x58
-	.4byte	0x12197
+	.4byte	0x121c4
 	.uleb128 0x58
-	.4byte	0x121a1
+	.4byte	0x121ce
 	.uleb128 0x58
-	.4byte	0x121ad
+	.4byte	0x121da
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12166
-	.8byte	.LBB1890
-	.4byte	.Ldebug_ranges0+0x12d0
+	.4byte	0x12193
+	.8byte	.LBB1888
+	.4byte	.Ldebug_ranges0+0x1290
 	.byte	0x1
-	.2byte	0x7d4
-	.4byte	0x11dca
+	.2byte	0x7ba
+	.4byte	0x11ddd
 	.uleb128 0x55
-	.4byte	0x1218b
+	.4byte	0x121b8
 	.uleb128 0x55
-	.4byte	0x1217f
+	.4byte	0x121ac
 	.uleb128 0x70
-	.4byte	0x12173
-	.4byte	.LLST258
+	.4byte	0x121a0
+	.4byte	.LLST257
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x12d0
+	.4byte	.Ldebug_ranges0+0x1290
 	.uleb128 0x58
-	.4byte	0x12197
+	.4byte	0x121c4
 	.uleb128 0x58
-	.4byte	0x121a1
+	.4byte	0x121ce
 	.uleb128 0x58
-	.4byte	0x121ad
+	.4byte	0x121da
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12166
-	.8byte	.LBB1894
-	.8byte	.LBE1894-.LBB1894
+	.4byte	0x12193
+	.8byte	.LBB1892
+	.8byte	.LBE1892-.LBB1892
 	.byte	0x1
-	.2byte	0x7aa
-	.4byte	0x11e1b
+	.2byte	0x790
+	.4byte	0x11e2e
 	.uleb128 0x55
-	.4byte	0x1218b
+	.4byte	0x121b8
 	.uleb128 0x55
-	.4byte	0x1217f
+	.4byte	0x121ac
 	.uleb128 0x70
-	.4byte	0x12173
-	.4byte	.LLST259
+	.4byte	0x121a0
+	.4byte	.LLST258
 	.uleb128 0x57
-	.8byte	.LBB1895
-	.8byte	.LBE1895-.LBB1895
+	.8byte	.LBB1893
+	.8byte	.LBE1893-.LBB1893
 	.uleb128 0x58
-	.4byte	0x12197
+	.4byte	0x121c4
 	.uleb128 0x58
-	.4byte	0x121a1
+	.4byte	0x121ce
 	.uleb128 0x58
-	.4byte	0x121ad
+	.4byte	0x121da
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1421e
-	.8byte	.LBB1898
-	.8byte	.LBE1898-.LBB1898
+	.4byte	0x14288
+	.8byte	.LBB1896
+	.8byte	.LBE1896-.LBB1896
 	.byte	0x1
-	.2byte	0x741
-	.4byte	0x11e66
+	.2byte	0x727
+	.4byte	0x11e79
 	.uleb128 0x55
-	.4byte	0x14239
+	.4byte	0x142a3
 	.uleb128 0x55
-	.4byte	0x1422e
+	.4byte	0x14298
 	.uleb128 0x57
-	.8byte	.LBB1899
-	.8byte	.LBE1899-.LBB1899
+	.8byte	.LBB1897
+	.8byte	.LBE1897-.LBB1897
 	.uleb128 0x58
-	.4byte	0x14245
+	.4byte	0x142af
 	.uleb128 0x4f
-	.8byte	.LVL998
-	.4byte	0x14ee6
+	.8byte	.LVL1003
+	.4byte	0x14f5d
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL854
-	.4byte	0x15366
-	.uleb128 0x4f
 	.8byte	.LVL855
-	.4byte	0x14fa4
+	.4byte	0x153dd
 	.uleb128 0x4f
 	.8byte	.LVL856
-	.4byte	0x150cf
+	.4byte	0x1501b
 	.uleb128 0x4f
-	.8byte	.LVL858
-	.4byte	0x151b9
+	.8byte	.LVL857
+	.4byte	0x15146
 	.uleb128 0x4f
 	.8byte	.LVL859
-	.4byte	0x150cf
+	.4byte	0x15230
 	.uleb128 0x4f
 	.8byte	.LVL860
-	.4byte	0x15149
+	.4byte	0x15146
 	.uleb128 0x4f
 	.8byte	.LVL861
-	.4byte	0x15372
+	.4byte	0x151c0
 	.uleb128 0x4f
 	.8byte	.LVL862
-	.4byte	0x1532a
+	.4byte	0x153e9
 	.uleb128 0x4f
-	.8byte	.LVL879
-	.4byte	0x150cf
+	.8byte	.LVL863
+	.4byte	0x153a1
 	.uleb128 0x4f
 	.8byte	.LVL882
-	.4byte	0x150cf
+	.4byte	0x122e7
 	.uleb128 0x4f
 	.8byte	.LVL883
-	.4byte	0x1521b
+	.4byte	0x151c0
 	.uleb128 0x4f
-	.8byte	.LVL884
-	.4byte	0x15372
+	.8byte	.LVL885
+	.4byte	0x153e9
 	.uleb128 0x4f
-	.8byte	.LVL886
-	.4byte	0x1532a
+	.8byte	.LVL887
+	.4byte	0x1529e
 	.uleb128 0x4f
 	.8byte	.LVL888
-	.4byte	0x15227
+	.4byte	0x1529e
 	.uleb128 0x4f
 	.8byte	.LVL889
-	.4byte	0x15227
+	.4byte	0x1529e
 	.uleb128 0x4f
-	.8byte	.LVL890
-	.4byte	0x15227
+	.8byte	.LVL907
+	.4byte	0x153f5
 	.uleb128 0x4f
 	.8byte	.LVL908
-	.4byte	0x1537e
+	.4byte	0x1529e
 	.uleb128 0x4f
 	.8byte	.LVL909
-	.4byte	0x15227
+	.4byte	0x1529e
 	.uleb128 0x4f
-	.8byte	.LVL910
-	.4byte	0x15227
+	.8byte	.LVL919
+	.4byte	0x153f5
 	.uleb128 0x4f
-	.8byte	.LVL917
-	.4byte	0x122ae
+	.8byte	.LVL921
+	.4byte	0x153e9
 	.uleb128 0x4f
-	.8byte	.LVL918
-	.4byte	0x15149
+	.8byte	.LVL922
+	.4byte	0x153a1
 	.uleb128 0x4f
-	.8byte	.LVL920
-	.4byte	0x15372
+	.8byte	.LVL923
+	.4byte	0x141a3
 	.uleb128 0x4f
-	.8byte	.LVL927
-	.4byte	0x1537e
+	.8byte	.LVL924
+	.4byte	0x15401
+	.uleb128 0x4f
+	.8byte	.LVL925
+	.4byte	0x15146
+	.uleb128 0x4f
+	.8byte	.LVL926
+	.4byte	0x12702
 	.uleb128 0x4f
 	.8byte	.LVL929
-	.4byte	0x15372
+	.4byte	0x1507c
 	.uleb128 0x4f
 	.8byte	.LVL930
-	.4byte	0x1532a
+	.4byte	0x122e7
 	.uleb128 0x4f
 	.8byte	.LVL931
-	.4byte	0x14139
+	.4byte	0x15146
 	.uleb128 0x4f
 	.8byte	.LVL932
-	.4byte	0x1538a
+	.4byte	0x12702
 	.uleb128 0x4f
 	.8byte	.LVL933
-	.4byte	0x150cf
-	.uleb128 0x4f
-	.8byte	.LVL934
-	.4byte	0x12692
-	.uleb128 0x4f
-	.8byte	.LVL937
-	.4byte	0x15005
+	.4byte	0x15230
 	.uleb128 0x4f
-	.8byte	.LVL938
-	.4byte	0x122ae
+	.8byte	.LVL936
+	.4byte	0x15230
 	.uleb128 0x4f
 	.8byte	.LVL939
-	.4byte	0x150cf
+	.4byte	0x15146
 	.uleb128 0x4f
 	.8byte	.LVL940
-	.4byte	0x12692
+	.4byte	0x15292
 	.uleb128 0x4f
 	.8byte	.LVL941
-	.4byte	0x151b9
+	.4byte	0x153e9
 	.uleb128 0x4f
-	.8byte	.LVL944
-	.4byte	0x151b9
+	.8byte	.LVL943
+	.4byte	0x153a1
 	.uleb128 0x4f
-	.8byte	.LVL946
-	.4byte	0x150cf
+	.8byte	.LVL945
+	.4byte	0x15146
+	.uleb128 0x4f
+	.8byte	.LVL948
+	.4byte	0x15146
 	.uleb128 0x4f
 	.8byte	.LVL949
-	.4byte	0x150cf
+	.4byte	0x140dc
 	.uleb128 0x4f
 	.8byte	.LVL950
-	.4byte	0x14072
+	.4byte	0x15401
 	.uleb128 0x4f
 	.8byte	.LVL951
-	.4byte	0x1538a
+	.4byte	0x122e7
 	.uleb128 0x4f
 	.8byte	.LVL952
-	.4byte	0x122ae
+	.4byte	0x15146
+	.uleb128 0x4f
+	.8byte	.LVL953
+	.4byte	0x12702
 	.uleb128 0x4f
 	.8byte	.LVL954
-	.4byte	0x150cf
+	.4byte	0x1529e
 	.uleb128 0x4f
-	.8byte	.LVL955
-	.4byte	0x12692
+	.8byte	.LVL961
+	.4byte	0x122e7
 	.uleb128 0x4f
-	.8byte	.LVL957
-	.4byte	0x15227
+	.8byte	.LVL962
+	.4byte	0x15146
 	.uleb128 0x4f
-	.8byte	.LVL964
-	.4byte	0x122ae
+	.8byte	.LVL963
+	.4byte	0x12702
+	.uleb128 0x4f
+	.8byte	.LVL966
+	.4byte	0x15146
 	.uleb128 0x4f
 	.8byte	.LVL967
-	.4byte	0x150cf
+	.4byte	0x15292
 	.uleb128 0x4f
-	.8byte	.LVL968
-	.4byte	0x1521b
+	.8byte	.LVL969
+	.4byte	0x15146
 	.uleb128 0x4f
 	.8byte	.LVL970
-	.4byte	0x150cf
+	.4byte	0x153e9
 	.uleb128 0x4f
 	.8byte	.LVL971
-	.4byte	0x15372
+	.4byte	0x153a1
 	.uleb128 0x4f
-	.8byte	.LVL972
-	.4byte	0x1532a
+	.8byte	.LVL976
+	.4byte	0x15146
 	.uleb128 0x4f
-	.8byte	.LVL977
-	.4byte	0x15396
+	.8byte	.LVL980
+	.4byte	0x1540d
 	.uleb128 0x4f
-	.8byte	.LVL979
-	.4byte	0x15005
+	.8byte	.LVL984
+	.4byte	0x1507c
 	.uleb128 0x4f
-	.8byte	.LVL988
-	.4byte	0x15396
+	.8byte	.LVL993
+	.4byte	0x1540d
 	.uleb128 0x4f
-	.8byte	.LVL989
-	.4byte	0x150cf
+	.8byte	.LVL994
+	.4byte	0x15146
 	.uleb128 0x4f
-	.8byte	.LVL990
-	.4byte	0x14fa4
+	.8byte	.LVL995
+	.4byte	0x1501b
 	.uleb128 0x4f
-	.8byte	.LVL999
-	.4byte	0x15227
+	.8byte	.LVL1004
+	.4byte	0x1529e
 	.uleb128 0x4f
-	.8byte	.LVL1001
-	.4byte	0x15149
+	.8byte	.LVL1006
+	.4byte	0x151c0
 	.uleb128 0x4f
-	.8byte	.LVL1002
-	.4byte	0x15005
+	.8byte	.LVL1007
+	.4byte	0x1507c
 	.uleb128 0x4f
-	.8byte	.LVL1004
-	.4byte	0x15005
+	.8byte	.LVL1009
+	.4byte	0x1507c
 	.uleb128 0x4f
-	.8byte	.LVL1005
-	.4byte	0x1527d
+	.8byte	.LVL1010
+	.4byte	0x152f4
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x723
+	.2byte	0x709
 	.byte	0x1
-	.4byte	0x121ba
+	.4byte	0x121e7
 	.uleb128 0x66
 	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x723
+	.2byte	0x709
 	.4byte	0xc138
 	.uleb128 0x66
 	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x723
+	.2byte	0x709
 	.4byte	0xc138
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x1
-	.2byte	0x723
+	.2byte	0x709
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x725
+	.2byte	0x70b
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x726
+	.2byte	0x70c
 	.4byte	0x110
 	.uleb128 0x48
 	.4byte	.LASF3110
 	.byte	0x1
-	.2byte	0x727
+	.2byte	0x70d
 	.4byte	0x110
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3111
 	.byte	0x1
-	.2byte	0x70c
+	.2byte	0x6ed
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1223e
+	.4byte	0x12277
 	.uleb128 0x66
 	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x70c
-	.4byte	0x46ee
+	.2byte	0x6ed
+	.4byte	0xe4f2
 	.uleb128 0x66
 	.4byte	.LASF3113
 	.byte	0x1
-	.2byte	0x70c
-	.4byte	0x46ee
+	.2byte	0x6ed
+	.4byte	0xe4f2
 	.uleb128 0x66
 	.4byte	.LASF3114
 	.byte	0x1
-	.2byte	0x70c
+	.2byte	0x6ed
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x70e
+	.2byte	0x6ef
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x70f
+	.2byte	0x6f0
 	.4byte	0x15a
 	.uleb128 0x48
 	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x70f
+	.2byte	0x6f0
 	.4byte	0x15a
 	.uleb128 0x48
 	.4byte	.LASF3117
 	.byte	0x1
-	.2byte	0x710
+	.2byte	0x6f1
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x711
-	.4byte	0x46f4
+	.2byte	0x6f2
+	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x712
+	.2byte	0x6f3
 	.4byte	0x46f4
-	.uleb128 0x73
+	.uleb128 0x48
 	.4byte	.LASF3120
 	.byte	0x1
-	.2byte	0x71f
+	.2byte	0x6f4
+	.4byte	0x46f4
+	.uleb128 0x73
+	.4byte	.LASF3121
+	.byte	0x1
+	.2byte	0x705
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3121
+	.4byte	.LASF3122
 	.byte	0x1
-	.2byte	0x6f0
+	.2byte	0x6d1
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x122ae
+	.4byte	0x122e7
 	.uleb128 0x65
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6f0
+	.2byte	0x6d1
 	.4byte	0xe4f2
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x6f0
+	.2byte	0x6d1
 	.4byte	0xe874
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x6f2
+	.2byte	0x6d3
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x6f3
+	.2byte	0x6d4
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3118
+	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x6f4
+	.2byte	0x6d5
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3122
+	.4byte	.LASF3123
 	.byte	0x1
-	.2byte	0x6f5
+	.2byte	0x6d6
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3114
 	.byte	0x1
-	.2byte	0x6f6
+	.2byte	0x6d7
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3123
+	.4byte	.LASF3124
 	.byte	0x1
-	.2byte	0x6f7
+	.2byte	0x6d8
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x51
-	.4byte	.LASF3124
+	.4byte	.LASF3125
 	.byte	0x1
-	.2byte	0x691
+	.2byte	0x66e
 	.4byte	0xc6
-	.8byte	.LFB2832
-	.8byte	.LFE2832-.LFB2832
+	.8byte	.LFB2833
+	.8byte	.LFE2833-.LFB2833
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12412
+	.4byte	0x12457
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x691
+	.2byte	0x66e
 	.4byte	0xe557
-	.4byte	.LLST77
+	.4byte	.LLST75
 	.uleb128 0x59
 	.4byte	.LASF2887
 	.byte	0x1
-	.2byte	0x691
+	.2byte	0x66e
 	.4byte	0xc6
-	.4byte	.LLST78
+	.4byte	.LLST76
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x693
+	.2byte	0x670
 	.4byte	0xe874
 	.uleb128 0x5a
-	.4byte	.LASF3125
+	.4byte	.LASF3126
 	.byte	0x1
-	.2byte	0x694
+	.2byte	0x671
 	.4byte	0xc6
-	.4byte	.LLST79
+	.4byte	.LLST77
 	.uleb128 0x6a
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x695
+	.2byte	0x672
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x64
+	.uleb128 0x48
+	.4byte	.LASF3127
+	.byte	0x1
+	.2byte	0x673
+	.4byte	0xd8a3
 	.uleb128 0x54
-	.4byte	0x14531
-	.8byte	.LBB1228
-	.8byte	.LBE1228-.LBB1228
+	.4byte	0x1459b
+	.8byte	.LBB1230
+	.8byte	.LBE1230-.LBB1230
 	.byte	0x1
-	.2byte	0x69a
-	.4byte	0x12341
+	.2byte	0x678
+	.4byte	0x12386
 	.uleb128 0x55
-	.4byte	0x1454d
+	.4byte	0x145b7
 	.uleb128 0x55
-	.4byte	0x14541
+	.4byte	0x145ab
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL285
-	.4byte	0x150cf
+	.8byte	.LVL283
+	.4byte	0x15146
 	.uleb128 0x4f
-	.8byte	.LVL286
-	.4byte	0x153a2
+	.8byte	.LVL284
+	.4byte	0x15419
 	.uleb128 0x4f
-	.8byte	.LVL291
-	.4byte	0x15149
+	.8byte	.LVL289
+	.4byte	0x151c0
+	.uleb128 0x4f
+	.8byte	.LVL290
+	.4byte	0x15146
 	.uleb128 0x4f
 	.8byte	.LVL292
-	.4byte	0x150cf
+	.4byte	0x15419
+	.uleb128 0x4f
+	.8byte	.LVL293
+	.4byte	0x151c0
 	.uleb128 0x4f
 	.8byte	.LVL294
-	.4byte	0x153a2
+	.4byte	0x15419
 	.uleb128 0x4f
 	.8byte	.LVL295
-	.4byte	0x15149
+	.4byte	0x15419
 	.uleb128 0x4f
 	.8byte	.LVL296
-	.4byte	0x153a2
+	.4byte	0x15419
 	.uleb128 0x4f
 	.8byte	.LVL297
-	.4byte	0x153a2
+	.4byte	0x15419
 	.uleb128 0x4f
 	.8byte	.LVL298
-	.4byte	0x153a2
+	.4byte	0x15419
 	.uleb128 0x4f
 	.8byte	.LVL299
-	.4byte	0x153a2
+	.4byte	0x15419
 	.uleb128 0x4f
 	.8byte	.LVL300
-	.4byte	0x153a2
+	.4byte	0x15419
 	.uleb128 0x4f
 	.8byte	.LVL301
-	.4byte	0x153a2
+	.4byte	0x15419
 	.uleb128 0x4f
 	.8byte	.LVL302
-	.4byte	0x153a2
+	.4byte	0x15146
 	.uleb128 0x4f
 	.8byte	.LVL303
-	.4byte	0x153a2
-	.uleb128 0x4f
-	.8byte	.LVL304
-	.4byte	0x150cf
-	.uleb128 0x4f
-	.8byte	.LVL305
-	.4byte	0x1527d
+	.4byte	0x152f4
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3126
+	.4byte	.LASF3128
 	.byte	0x1
-	.2byte	0x66a
-	.8byte	.LFB2831
-	.8byte	.LFE2831-.LFB2831
+	.2byte	0x647
+	.8byte	.LFB2832
+	.8byte	.LFE2832-.LFB2832
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x124cb
+	.4byte	0x12510
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x66c
+	.2byte	0x649
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x66d
+	.2byte	0x64a
 	.4byte	0xe1f4
 	.uleb128 0x4f
+	.8byte	.LVL265
+	.4byte	0x15146
+	.uleb128 0x4f
+	.8byte	.LVL266
+	.4byte	0x15292
+	.uleb128 0x4f
 	.8byte	.LVL267
-	.4byte	0x150cf
+	.4byte	0x15292
 	.uleb128 0x4f
 	.8byte	.LVL268
-	.4byte	0x1521b
+	.4byte	0x151f1
 	.uleb128 0x4f
 	.8byte	.LVL269
-	.4byte	0x1521b
+	.4byte	0x15146
 	.uleb128 0x4f
 	.8byte	.LVL270
-	.4byte	0x1517a
+	.4byte	0x151aa
 	.uleb128 0x4f
 	.8byte	.LVL271
-	.4byte	0x150cf
+	.4byte	0x15230
 	.uleb128 0x4f
 	.8byte	.LVL272
-	.4byte	0x15133
+	.4byte	0x15292
 	.uleb128 0x4f
 	.8byte	.LVL273
-	.4byte	0x151b9
+	.4byte	0x15292
 	.uleb128 0x4f
 	.8byte	.LVL274
-	.4byte	0x1521b
-	.uleb128 0x4f
-	.8byte	.LVL275
-	.4byte	0x1521b
-	.uleb128 0x4f
-	.8byte	.LVL276
-	.4byte	0x1517a
+	.4byte	0x151f1
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3127
+	.4byte	.LASF3129
 	.byte	0x1
-	.2byte	0x607
+	.2byte	0x5e9
 	.4byte	0xc6
-	.8byte	.LFB2830
-	.8byte	.LFE2830-.LFB2830
+	.8byte	.LFB2831
+	.8byte	.LFE2831-.LFB2831
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12682
+	.4byte	0x126f2
 	.uleb128 0x59
 	.4byte	.LASF794
 	.byte	0x1
-	.2byte	0x607
+	.2byte	0x5e9
 	.4byte	0x458
-	.4byte	.LLST192
+	.4byte	.LLST234
 	.uleb128 0x6a
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x609
+	.2byte	0x5eb
 	.4byte	0xe557
 	.uleb128 0x1
 	.byte	0x66
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x60a
+	.2byte	0x5ec
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x60b
+	.2byte	0x5ed
 	.4byte	0xe874
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0xcb0
-	.4byte	0x125b5
+	.4byte	.Ldebug_ranges0+0x1020
+	.4byte	0x125fa
 	.uleb128 0x41
 	.byte	0x8
 	.byte	0x1
-	.2byte	0x612
-	.4byte	0x1254e
+	.2byte	0x5f4
+	.4byte	0x12593
 	.uleb128 0x43
-	.4byte	.LASF3128
+	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x612
+	.2byte	0x5f4
 	.4byte	0x1a0
 	.uleb128 0x3f
 	.string	"__c"
 	.byte	0x1
-	.2byte	0x612
-	.4byte	0x12682
+	.2byte	0x5f4
+	.4byte	0x126f2
 	.byte	0
 	.uleb128 0x53
 	.string	"__u"
 	.byte	0x1
-	.2byte	0x612
-	.4byte	0x1252c
+	.2byte	0x5f4
+	.4byte	0x12571
 	.uleb128 0x5c
-	.4byte	0x14d80
-	.8byte	.LBB1475
-	.4byte	.Ldebug_ranges0+0xcf0
+	.4byte	0x14df7
+	.8byte	.LBB1810
+	.4byte	.Ldebug_ranges0+0x1060
 	.byte	0x1
-	.2byte	0x612
-	.4byte	0x12582
+	.2byte	0x5f4
+	.4byte	0x125c7
 	.uleb128 0x55
-	.4byte	0x14da3
+	.4byte	0x14e1a
 	.uleb128 0x55
-	.4byte	0x14d97
+	.4byte	0x14e0e
 	.uleb128 0x55
-	.4byte	0x14d8d
+	.4byte	0x14e04
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x14b7f
-	.8byte	.LBB1478
-	.8byte	.LBE1478-.LBB1478
+	.4byte	0x14bf6
+	.8byte	.LBB1813
+	.8byte	.LBE1813-.LBB1813
 	.byte	0x1
-	.2byte	0x612
+	.2byte	0x5f4
 	.uleb128 0x57
-	.8byte	.LBB1479
-	.8byte	.LBE1479-.LBB1479
+	.8byte	.LBB1814
+	.8byte	.LBE1814-.LBB1814
 	.uleb128 0x62
-	.4byte	0x14b8f
+	.4byte	0x14c06
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
-	.4byte	0x14a2b
-	.8byte	.LBB1483
-	.4byte	.Ldebug_ranges0+0xd20
+	.uleb128 0x54
+	.4byte	0x14aa2
+	.8byte	.LBB1818
+	.8byte	.LBE1818-.LBB1818
 	.byte	0x1
-	.2byte	0x661
-	.4byte	0x125f2
+	.2byte	0x63c
+	.4byte	0x1262e
 	.uleb128 0x55
-	.4byte	0x14a47
+	.4byte	0x14abe
 	.uleb128 0x55
-	.4byte	0x14a3c
-	.uleb128 0x4f
-	.8byte	.LVL584
-	.4byte	0x153ae
+	.4byte	0x14ab3
 	.uleb128 0x4f
-	.8byte	.LVL591
-	.4byte	0x153ae
+	.8byte	.LVL839
+	.4byte	0x15425
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL579
-	.4byte	0x153bb
+	.8byte	.LVL834
+	.4byte	0x15432
 	.uleb128 0x4f
-	.8byte	.LVL580
-	.4byte	0x152de
+	.8byte	.LVL835
+	.4byte	0x15355
 	.uleb128 0x4f
-	.8byte	.LVL581
-	.4byte	0x153c5
+	.8byte	.LVL836
+	.4byte	0x1543c
 	.uleb128 0x4f
-	.8byte	.LVL582
-	.4byte	0x14de3
+	.8byte	.LVL837
+	.4byte	0x14e5a
 	.uleb128 0x4f
-	.8byte	.LVL583
-	.4byte	0x13c02
+	.8byte	.LVL838
+	.4byte	0x13c72
 	.uleb128 0x4f
-	.8byte	.LVL585
-	.4byte	0x14de3
+	.8byte	.LVL840
+	.4byte	0x14e5a
 	.uleb128 0x4f
-	.8byte	.LVL586
-	.4byte	0x132a9
+	.8byte	.LVL841
+	.4byte	0x13319
 	.uleb128 0x4f
-	.8byte	.LVL587
-	.4byte	0x14de3
+	.8byte	.LVL842
+	.4byte	0x14e5a
 	.uleb128 0x4f
-	.8byte	.LVL588
-	.4byte	0x13d69
+	.8byte	.LVL843
+	.4byte	0x1290c
 	.uleb128 0x4f
-	.8byte	.LVL589
-	.4byte	0x14de3
+	.8byte	.LVL844
+	.4byte	0x14e5a
 	.uleb128 0x4f
-	.8byte	.LVL590
-	.4byte	0x1289c
+	.8byte	.LVL845
+	.4byte	0x13dd3
+	.uleb128 0x4f
+	.8byte	.LVL846
+	.4byte	0x15448
+	.uleb128 0x4f
+	.8byte	.LVL847
+	.4byte	0x1404c
+	.uleb128 0x4f
+	.8byte	.LVL848
+	.4byte	0x13dd3
+	.uleb128 0x4f
+	.8byte	.LVL849
+	.4byte	0x13c72
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x12692
+	.4byte	0x12702
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3129
+	.4byte	.LASF3131
 	.byte	0x1
 	.2byte	0x592
-	.8byte	.LFB2829
-	.8byte	.LFE2829-.LFB2829
+	.8byte	.LFB2830
+	.8byte	.LFE2830-.LFB2830
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1283e
+	.4byte	0x128ae
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x592
 	.4byte	0xe557
-	.4byte	.LLST191
+	.4byte	.LLST189
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
@@ -45065,104 +45202,104 @@ __exitcall_ebc_exit:
 	.4byte	0xb9b0
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34953
+	.8byte	__func__.34956
 	.uleb128 0x54
-	.4byte	0x1283e
-	.8byte	.LBB1466
-	.8byte	.LBE1466-.LBB1466
-	.byte	0x1
-	.2byte	0x5a7
-	.4byte	0x1271f
-	.uleb128 0x55
-	.4byte	0x12857
-	.uleb128 0x55
-	.4byte	0x1284b
-	.uleb128 0x4f
-	.8byte	.LVL552
-	.4byte	0x14de3
-	.byte	0
-	.uleb128 0x54
-	.4byte	0x1283e
+	.4byte	0x128ae
 	.8byte	.LBB1468
 	.8byte	.LBE1468-.LBB1468
 	.byte	0x1
-	.2byte	0x5bb
-	.4byte	0x12753
+	.2byte	0x5a2
+	.4byte	0x1278f
 	.uleb128 0x55
-	.4byte	0x12857
+	.4byte	0x128c7
 	.uleb128 0x55
-	.4byte	0x1284b
+	.4byte	0x128bb
 	.uleb128 0x4f
-	.8byte	.LVL557
-	.4byte	0x14de3
+	.8byte	.LVL549
+	.4byte	0x14e5a
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1283e
+	.4byte	0x128ae
 	.8byte	.LBB1470
 	.8byte	.LBE1470-.LBB1470
 	.byte	0x1
-	.2byte	0x600
-	.4byte	0x12787
+	.2byte	0x5b6
+	.4byte	0x127c3
 	.uleb128 0x55
-	.4byte	0x12857
+	.4byte	0x128c7
 	.uleb128 0x55
-	.4byte	0x1284b
+	.4byte	0x128bb
 	.uleb128 0x4f
-	.8byte	.LVL562
-	.4byte	0x14de3
+	.8byte	.LVL554
+	.4byte	0x14e5a
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1283e
+	.4byte	0x128ae
 	.8byte	.LBB1472
 	.8byte	.LBE1472-.LBB1472
 	.byte	0x1
-	.2byte	0x5d5
-	.4byte	0x127bb
+	.2byte	0x5dd
+	.4byte	0x127f7
 	.uleb128 0x55
-	.4byte	0x12857
+	.4byte	0x128c7
 	.uleb128 0x55
-	.4byte	0x1284b
+	.4byte	0x128bb
 	.uleb128 0x4f
-	.8byte	.LVL567
-	.4byte	0x14de3
+	.8byte	.LVL559
+	.4byte	0x14e5a
+	.byte	0
+	.uleb128 0x54
+	.4byte	0x128ae
+	.8byte	.LBB1474
+	.8byte	.LBE1474-.LBB1474
+	.byte	0x1
+	.2byte	0x5d0
+	.4byte	0x1282b
+	.uleb128 0x55
+	.4byte	0x128c7
+	.uleb128 0x55
+	.4byte	0x128bb
+	.uleb128 0x4f
+	.8byte	.LVL564
+	.4byte	0x14e5a
 	.byte	0
 	.uleb128 0x4f
+	.8byte	.LVL548
+	.4byte	0x13c72
+	.uleb128 0x4f
 	.8byte	.LVL550
-	.4byte	0x13c02
+	.4byte	0x13c72
 	.uleb128 0x4f
-	.8byte	.LVL551
-	.4byte	0x13c02
+	.8byte	.LVL553
+	.4byte	0x13dd3
 	.uleb128 0x4f
 	.8byte	.LVL555
-	.4byte	0x13d69
+	.4byte	0x13dd3
 	.uleb128 0x4f
-	.8byte	.LVL556
-	.4byte	0x13d69
+	.8byte	.LVL558
+	.4byte	0x13319
 	.uleb128 0x4f
 	.8byte	.LVL560
-	.4byte	0x132a9
+	.4byte	0x13319
 	.uleb128 0x4f
-	.8byte	.LVL561
-	.4byte	0x132a9
+	.8byte	.LVL563
+	.4byte	0x1290c
 	.uleb128 0x4f
 	.8byte	.LVL565
-	.4byte	0x1289c
-	.uleb128 0x4f
-	.8byte	.LVL566
-	.4byte	0x1289c
+	.4byte	0x1290c
 	.uleb128 0x4f
-	.8byte	.LVL570
-	.4byte	0x150cf
+	.8byte	.LVL568
+	.4byte	0x15146
 	.uleb128 0x4f
-	.8byte	.LVL573
-	.4byte	0x150cf
+	.8byte	.LVL571
+	.4byte	0x15146
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3130
+	.4byte	.LASF3132
 	.byte	0x1
 	.2byte	0x58c
 	.byte	0x1
-	.4byte	0x12864
+	.4byte	0x128d4
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
@@ -45175,11 +45312,11 @@ __exitcall_ebc_exit:
 	.4byte	0xe874
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3131
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x581
 	.byte	0x1
-	.4byte	0x12896
+	.4byte	0x12906
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
@@ -45194,542 +45331,542 @@ __exitcall_ebc_exit:
 	.string	"buf"
 	.byte	0x1
 	.2byte	0x583
-	.4byte	0x12896
+	.4byte	0x12906
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xdf7e
 	.uleb128 0x4e
-	.4byte	.LASF3132
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x56c
-	.8byte	.LFB2826
-	.8byte	.LFE2826-.LFB2826
+	.8byte	.LFB2827
+	.8byte	.LFE2827-.LFB2827
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12e4b
+	.4byte	0x12ebb
 	.uleb128 0x75
-	.4byte	.LASF3133
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x56c
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x59
-	.4byte	.LASF3134
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x56d
 	.4byte	0xac0
-	.4byte	.LLST144
+	.4byte	.LLST142
 	.uleb128 0x59
-	.4byte	.LASF3135
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x56d
 	.4byte	0xac0
-	.4byte	.LLST145
+	.4byte	.LLST143
 	.uleb128 0x59
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x56e
 	.4byte	0xe874
-	.4byte	.LLST146
+	.4byte	.LLST144
 	.uleb128 0x54
-	.4byte	0x12e4b
-	.8byte	.LBB1376
-	.8byte	.LBE1376-.LBB1376
+	.4byte	0x12ebb
+	.8byte	.LBB1378
+	.8byte	.LBE1378-.LBB1378
 	.byte	0x1
 	.2byte	0x57d
-	.4byte	0x129a5
+	.4byte	0x12a15
 	.uleb128 0x55
-	.4byte	0x12e7c
+	.4byte	0x12eec
 	.uleb128 0x55
-	.4byte	0x12e7c
+	.4byte	0x12eec
 	.uleb128 0x55
-	.4byte	0x12e7c
+	.4byte	0x12eec
 	.uleb128 0x55
-	.4byte	0x12e70
+	.4byte	0x12ee0
 	.uleb128 0x72
-	.4byte	0x12e64
+	.4byte	0x12ed4
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x12e58
+	.4byte	0x12ec8
 	.uleb128 0x57
-	.8byte	.LBB1377
-	.8byte	.LBE1377-.LBB1377
+	.8byte	.LBB1379
+	.8byte	.LBE1379-.LBB1379
 	.uleb128 0x58
-	.4byte	0x12e88
+	.4byte	0x12ef8
 	.uleb128 0x61
-	.4byte	0x12e94
-	.4byte	.LLST147
+	.4byte	0x12f04
+	.4byte	.LLST145
 	.uleb128 0x58
-	.4byte	0x12ea0
+	.4byte	0x12f10
 	.uleb128 0x58
-	.4byte	0x12eac
+	.4byte	0x12f1c
 	.uleb128 0x58
-	.4byte	0x12eb8
+	.4byte	0x12f28
 	.uleb128 0x58
-	.4byte	0x12ec4
+	.4byte	0x12f34
 	.uleb128 0x61
-	.4byte	0x12ed0
-	.4byte	.LLST148
+	.4byte	0x12f40
+	.4byte	.LLST146
 	.uleb128 0x61
-	.4byte	0x12edc
-	.4byte	.LLST149
+	.4byte	0x12f4c
+	.4byte	.LLST147
 	.uleb128 0x58
-	.4byte	0x12ee8
+	.4byte	0x12f58
 	.uleb128 0x61
-	.4byte	0x12ef4
-	.4byte	.LLST150
+	.4byte	0x12f64
+	.4byte	.LLST148
 	.uleb128 0x58
-	.4byte	0x12efe
+	.4byte	0x12f6e
 	.uleb128 0x61
-	.4byte	0x12f08
-	.4byte	.LLST151
+	.4byte	0x12f78
+	.4byte	.LLST149
 	.uleb128 0x61
-	.4byte	0x12f14
-	.4byte	.LLST152
+	.4byte	0x12f84
+	.4byte	.LLST150
 	.uleb128 0x58
-	.4byte	0x12f20
+	.4byte	0x12f90
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x130fd
-	.8byte	.LBB1378
+	.4byte	0x1316d
+	.8byte	.LBB1380
 	.4byte	.Ldebug_ranges0+0x9c0
 	.byte	0x1
 	.2byte	0x576
-	.4byte	0x12b67
+	.4byte	0x12bd7
 	.uleb128 0x55
-	.4byte	0x1312e
+	.4byte	0x1319e
 	.uleb128 0x55
-	.4byte	0x1312e
+	.4byte	0x1319e
 	.uleb128 0x55
-	.4byte	0x1312e
+	.4byte	0x1319e
 	.uleb128 0x55
-	.4byte	0x13122
+	.4byte	0x13192
 	.uleb128 0x55
-	.4byte	0x13116
+	.4byte	0x13186
 	.uleb128 0x55
-	.4byte	0x1310a
+	.4byte	0x1317a
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x9c0
 	.uleb128 0x58
-	.4byte	0x1313a
+	.4byte	0x131aa
 	.uleb128 0x61
-	.4byte	0x13146
+	.4byte	0x131b6
+	.4byte	.LLST151
+	.uleb128 0x61
+	.4byte	0x131c2
+	.4byte	.LLST152
+	.uleb128 0x61
+	.4byte	0x131ce
 	.4byte	.LLST153
 	.uleb128 0x61
-	.4byte	0x13152
+	.4byte	0x131da
 	.4byte	.LLST154
 	.uleb128 0x61
-	.4byte	0x1315e
+	.4byte	0x131e6
 	.4byte	.LLST155
 	.uleb128 0x61
-	.4byte	0x1316a
+	.4byte	0x131f2
 	.4byte	.LLST156
 	.uleb128 0x61
-	.4byte	0x13176
+	.4byte	0x131fe
 	.4byte	.LLST157
 	.uleb128 0x61
-	.4byte	0x13182
+	.4byte	0x1320a
 	.4byte	.LLST158
+	.uleb128 0x58
+	.4byte	0x13214
 	.uleb128 0x61
-	.4byte	0x1318e
+	.4byte	0x1321e
 	.4byte	.LLST159
 	.uleb128 0x61
-	.4byte	0x1319a
+	.4byte	0x1322a
 	.4byte	.LLST160
 	.uleb128 0x58
-	.4byte	0x131a4
-	.uleb128 0x61
-	.4byte	0x131ae
-	.4byte	.LLST161
-	.uleb128 0x61
-	.4byte	0x131ba
-	.4byte	.LLST162
-	.uleb128 0x58
-	.4byte	0x131c6
+	.4byte	0x13236
 	.uleb128 0x5c
-	.4byte	0x1429c
-	.8byte	.LBB1380
+	.4byte	0x14306
+	.8byte	.LBB1382
 	.4byte	.Ldebug_ranges0+0xa00
 	.byte	0x1
 	.2byte	0x49b
-	.4byte	0x12a85
+	.4byte	0x12af5
 	.uleb128 0x55
-	.4byte	0x142c4
+	.4byte	0x1432e
 	.uleb128 0x55
-	.4byte	0x142b8
+	.4byte	0x14322
 	.uleb128 0x55
-	.4byte	0x142ac
+	.4byte	0x14316
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa00
 	.uleb128 0x58
-	.4byte	0x142d0
+	.4byte	0x1433a
 	.uleb128 0x61
-	.4byte	0x142db
-	.4byte	.LLST163
+	.4byte	0x14345
+	.4byte	.LLST161
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1429c
-	.8byte	.LBB1383
-	.8byte	.LBE1383-.LBB1383
+	.4byte	0x14306
+	.8byte	.LBB1385
+	.8byte	.LBE1385-.LBB1385
 	.byte	0x1
 	.2byte	0x498
-	.4byte	0x12ad1
+	.4byte	0x12b41
 	.uleb128 0x55
-	.4byte	0x142c4
+	.4byte	0x1432e
 	.uleb128 0x55
-	.4byte	0x142b8
+	.4byte	0x14322
 	.uleb128 0x55
-	.4byte	0x142ac
+	.4byte	0x14316
 	.uleb128 0x57
-	.8byte	.LBB1384
-	.8byte	.LBE1384-.LBB1384
+	.8byte	.LBB1386
+	.8byte	.LBE1386-.LBB1386
 	.uleb128 0x58
-	.4byte	0x142d0
+	.4byte	0x1433a
 	.uleb128 0x61
-	.4byte	0x142db
-	.4byte	.LLST164
+	.4byte	0x14345
+	.4byte	.LLST162
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1429c
-	.8byte	.LBB1385
-	.8byte	.LBE1385-.LBB1385
+	.4byte	0x14306
+	.8byte	.LBB1387
+	.8byte	.LBE1387-.LBB1387
 	.byte	0x1
 	.2byte	0x499
-	.4byte	0x12b1d
+	.4byte	0x12b8d
 	.uleb128 0x55
-	.4byte	0x142c4
+	.4byte	0x1432e
 	.uleb128 0x55
-	.4byte	0x142b8
+	.4byte	0x14322
 	.uleb128 0x55
-	.4byte	0x142ac
+	.4byte	0x14316
 	.uleb128 0x57
-	.8byte	.LBB1386
-	.8byte	.LBE1386-.LBB1386
+	.8byte	.LBB1388
+	.8byte	.LBE1388-.LBB1388
 	.uleb128 0x58
-	.4byte	0x142d0
+	.4byte	0x1433a
 	.uleb128 0x61
-	.4byte	0x142db
-	.4byte	.LLST165
+	.4byte	0x14345
+	.4byte	.LLST163
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x1429c
-	.8byte	.LBB1387
-	.8byte	.LBE1387-.LBB1387
+	.4byte	0x14306
+	.8byte	.LBB1389
+	.8byte	.LBE1389-.LBB1389
 	.byte	0x1
 	.2byte	0x49a
 	.uleb128 0x55
-	.4byte	0x142c4
+	.4byte	0x1432e
 	.uleb128 0x55
-	.4byte	0x142b8
+	.4byte	0x14322
 	.uleb128 0x55
-	.4byte	0x142ac
+	.4byte	0x14316
 	.uleb128 0x57
-	.8byte	.LBB1388
-	.8byte	.LBE1388-.LBB1388
+	.8byte	.LBB1390
+	.8byte	.LBE1390-.LBB1390
 	.uleb128 0x58
-	.4byte	0x142d0
+	.4byte	0x1433a
 	.uleb128 0x61
-	.4byte	0x142db
-	.4byte	.LLST166
+	.4byte	0x14345
+	.4byte	.LLST164
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12f2d
-	.8byte	.LBB1393
-	.8byte	.LBE1393-.LBB1393
+	.4byte	0x12f9d
+	.8byte	.LBB1395
+	.8byte	.LBE1395-.LBB1395
 	.byte	0x1
 	.2byte	0x57b
-	.4byte	0x12c10
+	.4byte	0x12c80
 	.uleb128 0x55
-	.4byte	0x12f5e
+	.4byte	0x12fce
 	.uleb128 0x55
-	.4byte	0x12f5e
+	.4byte	0x12fce
 	.uleb128 0x55
-	.4byte	0x12f5e
+	.4byte	0x12fce
 	.uleb128 0x55
-	.4byte	0x12f52
+	.4byte	0x12fc2
 	.uleb128 0x72
-	.4byte	0x12f46
+	.4byte	0x12fb6
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x12f3a
+	.4byte	0x12faa
 	.uleb128 0x57
-	.8byte	.LBB1394
-	.8byte	.LBE1394-.LBB1394
+	.8byte	.LBB1396
+	.8byte	.LBE1396-.LBB1396
 	.uleb128 0x58
-	.4byte	0x12f6a
+	.4byte	0x12fda
 	.uleb128 0x58
-	.4byte	0x12f76
+	.4byte	0x12fe6
 	.uleb128 0x58
-	.4byte	0x12f82
+	.4byte	0x12ff2
 	.uleb128 0x58
-	.4byte	0x12f8e
+	.4byte	0x12ffe
 	.uleb128 0x58
-	.4byte	0x12f9a
+	.4byte	0x1300a
 	.uleb128 0x58
-	.4byte	0x12fa6
+	.4byte	0x13016
 	.uleb128 0x61
-	.4byte	0x12fb2
-	.4byte	.LLST167
+	.4byte	0x13022
+	.4byte	.LLST165
 	.uleb128 0x61
-	.4byte	0x12fbe
-	.4byte	.LLST168
+	.4byte	0x1302e
+	.4byte	.LLST166
 	.uleb128 0x58
-	.4byte	0x12fca
+	.4byte	0x1303a
 	.uleb128 0x61
-	.4byte	0x12fd6
-	.4byte	.LLST169
+	.4byte	0x13046
+	.4byte	.LLST167
 	.uleb128 0x58
-	.4byte	0x12fe0
+	.4byte	0x13050
 	.uleb128 0x61
-	.4byte	0x12fea
-	.4byte	.LLST170
+	.4byte	0x1305a
+	.4byte	.LLST168
 	.uleb128 0x61
-	.4byte	0x12ff6
-	.4byte	.LLST171
+	.4byte	0x13066
+	.4byte	.LLST169
 	.uleb128 0x58
-	.4byte	0x13002
+	.4byte	0x13072
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x131d3
-	.8byte	.LBB1395
+	.4byte	0x13243
+	.8byte	.LBB1397
 	.4byte	.Ldebug_ranges0+0xa30
 	.byte	0x1
 	.2byte	0x578
-	.4byte	0x12d1e
+	.4byte	0x12d8e
 	.uleb128 0x55
-	.4byte	0x13204
+	.4byte	0x13274
 	.uleb128 0x55
-	.4byte	0x13204
+	.4byte	0x13274
 	.uleb128 0x55
-	.4byte	0x13204
+	.4byte	0x13274
 	.uleb128 0x55
-	.4byte	0x131f8
+	.4byte	0x13268
 	.uleb128 0x55
-	.4byte	0x131ec
+	.4byte	0x1325c
 	.uleb128 0x55
-	.4byte	0x131e0
+	.4byte	0x13250
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa30
 	.uleb128 0x58
-	.4byte	0x13210
+	.4byte	0x13280
 	.uleb128 0x58
-	.4byte	0x1321c
+	.4byte	0x1328c
 	.uleb128 0x58
-	.4byte	0x13228
+	.4byte	0x13298
 	.uleb128 0x62
-	.4byte	0x13234
+	.4byte	0x132a4
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x13240
+	.4byte	0x132b0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x1324c
+	.4byte	0x132bc
+	.4byte	.LLST170
+	.uleb128 0x61
+	.4byte	0x132c8
+	.4byte	.LLST171
+	.uleb128 0x61
+	.4byte	0x132d4
 	.4byte	.LLST172
 	.uleb128 0x61
-	.4byte	0x13258
+	.4byte	0x132e0
 	.4byte	.LLST173
+	.uleb128 0x58
+	.4byte	0x132ea
 	.uleb128 0x61
-	.4byte	0x13264
+	.4byte	0x132f4
 	.4byte	.LLST174
 	.uleb128 0x61
-	.4byte	0x13270
+	.4byte	0x13300
 	.4byte	.LLST175
 	.uleb128 0x58
-	.4byte	0x1327a
-	.uleb128 0x61
-	.4byte	0x13284
-	.4byte	.LLST176
-	.uleb128 0x61
-	.4byte	0x13290
-	.4byte	.LLST177
-	.uleb128 0x58
-	.4byte	0x1329c
+	.4byte	0x1330c
 	.uleb128 0x5c
-	.4byte	0x1429c
-	.8byte	.LBB1397
+	.4byte	0x14306
+	.8byte	.LBB1399
 	.4byte	.Ldebug_ranges0+0xa60
 	.byte	0x1
 	.2byte	0x470
-	.4byte	0x12ce4
+	.4byte	0x12d54
 	.uleb128 0x55
-	.4byte	0x142c4
+	.4byte	0x1432e
 	.uleb128 0x55
-	.4byte	0x142b8
+	.4byte	0x14322
 	.uleb128 0x55
-	.4byte	0x142ac
+	.4byte	0x14316
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa60
 	.uleb128 0x58
-	.4byte	0x142d0
+	.4byte	0x1433a
 	.uleb128 0x61
-	.4byte	0x142db
-	.4byte	.LLST178
+	.4byte	0x14345
+	.4byte	.LLST176
 	.byte	0
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x1429c
-	.8byte	.LBB1404
+	.4byte	0x14306
+	.8byte	.LBB1406
 	.4byte	.Ldebug_ranges0+0xad0
 	.byte	0x1
 	.2byte	0x46f
 	.uleb128 0x55
-	.4byte	0x142c4
+	.4byte	0x1432e
 	.uleb128 0x55
-	.4byte	0x142b8
+	.4byte	0x14322
 	.uleb128 0x55
-	.4byte	0x142ac
+	.4byte	0x14316
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xad0
 	.uleb128 0x58
-	.4byte	0x142d0
+	.4byte	0x1433a
 	.uleb128 0x61
-	.4byte	0x142db
-	.4byte	.LLST179
+	.4byte	0x14345
+	.4byte	.LLST177
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x1300f
-	.8byte	.LBB1422
-	.8byte	.LBE1422-.LBB1422
+	.4byte	0x1307f
+	.8byte	.LBB1424
+	.8byte	.LBE1424-.LBB1424
 	.byte	0x1
 	.2byte	0x572
 	.uleb128 0x55
-	.4byte	0x13040
+	.4byte	0x130b0
 	.uleb128 0x55
-	.4byte	0x13040
+	.4byte	0x130b0
 	.uleb128 0x55
-	.4byte	0x13040
+	.4byte	0x130b0
 	.uleb128 0x55
-	.4byte	0x13034
+	.4byte	0x130a4
 	.uleb128 0x55
-	.4byte	0x13028
+	.4byte	0x13098
 	.uleb128 0x55
-	.4byte	0x1301c
+	.4byte	0x1308c
 	.uleb128 0x57
-	.8byte	.LBB1423
-	.8byte	.LBE1423-.LBB1423
+	.8byte	.LBB1425
+	.8byte	.LBE1425-.LBB1425
 	.uleb128 0x58
-	.4byte	0x1304c
+	.4byte	0x130bc
 	.uleb128 0x58
-	.4byte	0x13058
+	.4byte	0x130c8
 	.uleb128 0x58
-	.4byte	0x13064
+	.4byte	0x130d4
 	.uleb128 0x62
-	.4byte	0x13070
+	.4byte	0x130e0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x1307c
+	.4byte	0x130ec
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x13088
+	.4byte	0x130f8
+	.4byte	.LLST178
+	.uleb128 0x61
+	.4byte	0x13104
+	.4byte	.LLST179
+	.uleb128 0x61
+	.4byte	0x13110
 	.4byte	.LLST180
 	.uleb128 0x61
-	.4byte	0x13094
+	.4byte	0x1311c
 	.4byte	.LLST181
+	.uleb128 0x58
+	.4byte	0x13126
 	.uleb128 0x61
-	.4byte	0x130a0
+	.4byte	0x13130
 	.4byte	.LLST182
 	.uleb128 0x61
-	.4byte	0x130ac
+	.4byte	0x1313c
 	.4byte	.LLST183
 	.uleb128 0x58
-	.4byte	0x130b6
-	.uleb128 0x61
-	.4byte	0x130c0
-	.4byte	.LLST184
-	.uleb128 0x61
-	.4byte	0x130cc
-	.4byte	.LLST185
-	.uleb128 0x58
-	.4byte	0x130d8
+	.4byte	0x13148
 	.uleb128 0x58
-	.4byte	0x130e4
+	.4byte	0x13154
 	.uleb128 0x58
-	.4byte	0x130f0
+	.4byte	0x13160
 	.uleb128 0x5c
-	.4byte	0x14251
-	.8byte	.LBB1424
+	.4byte	0x142bb
+	.8byte	.LBB1426
 	.4byte	.Ldebug_ranges0+0xb30
 	.byte	0x1
 	.2byte	0x4c6
-	.4byte	0x12e0c
+	.4byte	0x12e7c
 	.uleb128 0x55
-	.4byte	0x14279
+	.4byte	0x142e3
 	.uleb128 0x55
-	.4byte	0x1426d
+	.4byte	0x142d7
 	.uleb128 0x55
-	.4byte	0x14261
+	.4byte	0x142cb
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xb30
 	.uleb128 0x61
-	.4byte	0x14285
-	.4byte	.LLST186
+	.4byte	0x142ef
+	.4byte	.LLST184
 	.uleb128 0x61
-	.4byte	0x14290
-	.4byte	.LLST187
+	.4byte	0x142fa
+	.4byte	.LLST185
 	.byte	0
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x14251
-	.8byte	.LBB1431
+	.4byte	0x142bb
+	.8byte	.LBB1433
 	.4byte	.Ldebug_ranges0+0xba0
 	.byte	0x1
 	.2byte	0x4c5
 	.uleb128 0x55
-	.4byte	0x14279
+	.4byte	0x142e3
 	.uleb128 0x55
-	.4byte	0x1426d
+	.4byte	0x142d7
 	.uleb128 0x55
-	.4byte	0x14261
+	.4byte	0x142cb
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xba0
 	.uleb128 0x61
-	.4byte	0x14285
-	.4byte	.LLST188
+	.4byte	0x142ef
+	.4byte	.LLST186
 	.uleb128 0x61
-	.4byte	0x14290
-	.4byte	.LLST189
+	.4byte	0x142fa
+	.4byte	.LLST187
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3136
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x51e
 	.byte	0x1
-	.4byte	0x12f2d
+	.4byte	0x12f9d
 	.uleb128 0x66
-	.4byte	.LASF3133
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x51e
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3134
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x51f
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3135
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x51f
 	.4byte	0xac0
@@ -45744,22 +45881,22 @@ __exitcall_ebc_exit:
 	.2byte	0x522
 	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3137
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x523
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3138
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x523
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3139
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x524
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x524
 	.4byte	0x110
@@ -45769,7 +45906,7 @@ __exitcall_ebc_exit:
 	.2byte	0x524
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x525
 	.4byte	0xc138
@@ -45794,7 +45931,7 @@ __exitcall_ebc_exit:
 	.2byte	0x527
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x528
 	.4byte	0xc6
@@ -45810,23 +45947,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3143
+	.4byte	.LASF3145
 	.byte	0x1
 	.2byte	0x4d0
 	.byte	0x1
-	.4byte	0x1300f
+	.4byte	0x1307f
 	.uleb128 0x66
-	.4byte	.LASF3133
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x4d0
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3134
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x4d1
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3135
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x4d1
 	.4byte	0xac0
@@ -45841,22 +45978,22 @@ __exitcall_ebc_exit:
 	.2byte	0x4d4
 	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3137
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x4d5
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3138
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x4d5
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3139
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x4d6
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x4d6
 	.4byte	0x110
@@ -45866,7 +46003,7 @@ __exitcall_ebc_exit:
 	.2byte	0x4d6
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x4d7
 	.4byte	0xc138
@@ -45891,7 +46028,7 @@ __exitcall_ebc_exit:
 	.2byte	0x4d9
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x4da
 	.4byte	0xc6
@@ -45907,23 +46044,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3144
+	.4byte	.LASF3146
 	.byte	0x1
 	.2byte	0x4a6
 	.byte	0x1
-	.4byte	0x130fd
+	.4byte	0x1316d
 	.uleb128 0x66
-	.4byte	.LASF3133
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x4a6
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3134
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x4a7
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3135
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x4a7
 	.4byte	0xac0
@@ -45938,27 +46075,27 @@ __exitcall_ebc_exit:
 	.2byte	0x4aa
 	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3139
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x4ab
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x4ab
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3137
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x4ab
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3138
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x4ab
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x4ac
 	.4byte	0xc138
@@ -45983,7 +46120,7 @@ __exitcall_ebc_exit:
 	.2byte	0x4ae
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x4af
 	.4byte	0xc6
@@ -45998,34 +46135,34 @@ __exitcall_ebc_exit:
 	.2byte	0x4b1
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3145
+	.4byte	.LASF3147
 	.byte	0x1
 	.2byte	0x4b2
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3146
+	.4byte	.LASF3148
 	.byte	0x1
 	.2byte	0x4b3
 	.4byte	0x110
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3147
+	.4byte	.LASF3149
 	.byte	0x1
 	.2byte	0x47b
 	.byte	0x1
-	.4byte	0x131d3
+	.4byte	0x13243
 	.uleb128 0x66
-	.4byte	.LASF3133
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x47b
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3134
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x47c
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3135
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x47c
 	.4byte	0xac0
@@ -46040,27 +46177,27 @@ __exitcall_ebc_exit:
 	.2byte	0x47f
 	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3139
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x480
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x480
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3137
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x480
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3138
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x480
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x481
 	.4byte	0xc138
@@ -46085,7 +46222,7 @@ __exitcall_ebc_exit:
 	.2byte	0x483
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x484
 	.4byte	0xc6
@@ -46101,23 +46238,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3148
+	.4byte	.LASF3150
 	.byte	0x1
 	.2byte	0x452
 	.byte	0x1
-	.4byte	0x132a9
+	.4byte	0x13319
 	.uleb128 0x66
-	.4byte	.LASF3133
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x452
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3134
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x453
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3135
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x453
 	.4byte	0xac0
@@ -46132,27 +46269,27 @@ __exitcall_ebc_exit:
 	.2byte	0x456
 	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3139
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x457
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x457
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3137
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x457
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3138
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x457
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x458
 	.4byte	0xc138
@@ -46177,7 +46314,7 @@ __exitcall_ebc_exit:
 	.2byte	0x45a
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x45b
 	.4byte	0xc6
@@ -46193,470 +46330,470 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3149
+	.4byte	.LASF3151
 	.byte	0x1
 	.2byte	0x43c
-	.8byte	.LFB2820
-	.8byte	.LFE2820-.LFB2820
+	.8byte	.LFB2821
+	.8byte	.LFE2821-.LFB2821
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x137a4
+	.4byte	0x13814
 	.uleb128 0x75
-	.4byte	.LASF3133
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x43c
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x59
-	.4byte	.LASF3134
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x43d
 	.4byte	0xac0
-	.4byte	.LLST107
+	.4byte	.LLST105
 	.uleb128 0x59
-	.4byte	.LASF3135
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x43d
 	.4byte	0xac0
-	.4byte	.LLST108
+	.4byte	.LLST106
 	.uleb128 0x59
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x43e
 	.4byte	0xe874
-	.4byte	.LLST109
+	.4byte	.LLST107
 	.uleb128 0x54
-	.4byte	0x137a4
-	.8byte	.LBB1262
-	.8byte	.LBE1262-.LBB1262
+	.4byte	0x13814
+	.8byte	.LBB1264
+	.8byte	.LBE1264-.LBB1264
 	.byte	0x1
 	.2byte	0x44d
-	.4byte	0x133b2
+	.4byte	0x13422
 	.uleb128 0x55
-	.4byte	0x137d5
+	.4byte	0x13845
 	.uleb128 0x55
-	.4byte	0x137d5
+	.4byte	0x13845
 	.uleb128 0x55
-	.4byte	0x137d5
+	.4byte	0x13845
 	.uleb128 0x55
-	.4byte	0x137c9
+	.4byte	0x13839
 	.uleb128 0x72
-	.4byte	0x137bd
+	.4byte	0x1382d
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x137b1
+	.4byte	0x13821
 	.uleb128 0x57
-	.8byte	.LBB1263
-	.8byte	.LBE1263-.LBB1263
+	.8byte	.LBB1265
+	.8byte	.LBE1265-.LBB1265
 	.uleb128 0x58
-	.4byte	0x137e1
+	.4byte	0x13851
 	.uleb128 0x61
-	.4byte	0x137ed
-	.4byte	.LLST110
+	.4byte	0x1385d
+	.4byte	.LLST108
 	.uleb128 0x58
-	.4byte	0x137f9
+	.4byte	0x13869
 	.uleb128 0x58
-	.4byte	0x13805
+	.4byte	0x13875
 	.uleb128 0x58
-	.4byte	0x13811
+	.4byte	0x13881
 	.uleb128 0x58
-	.4byte	0x1381d
+	.4byte	0x1388d
 	.uleb128 0x61
-	.4byte	0x13829
-	.4byte	.LLST111
+	.4byte	0x13899
+	.4byte	.LLST109
 	.uleb128 0x61
-	.4byte	0x13835
-	.4byte	.LLST112
+	.4byte	0x138a5
+	.4byte	.LLST110
 	.uleb128 0x58
-	.4byte	0x13841
+	.4byte	0x138b1
 	.uleb128 0x61
-	.4byte	0x1384d
-	.4byte	.LLST113
+	.4byte	0x138bd
+	.4byte	.LLST111
 	.uleb128 0x58
-	.4byte	0x13857
+	.4byte	0x138c7
 	.uleb128 0x61
-	.4byte	0x13861
-	.4byte	.LLST114
+	.4byte	0x138d1
+	.4byte	.LLST112
 	.uleb128 0x61
-	.4byte	0x1386d
-	.4byte	.LLST115
+	.4byte	0x138dd
+	.4byte	.LLST113
 	.uleb128 0x58
-	.4byte	0x13879
+	.4byte	0x138e9
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13b2c
-	.8byte	.LBB1264
-	.8byte	.LBE1264-.LBB1264
+	.4byte	0x13b9c
+	.8byte	.LBB1266
+	.8byte	.LBE1266-.LBB1266
 	.byte	0x1
 	.2byte	0x446
-	.4byte	0x13500
+	.4byte	0x13570
 	.uleb128 0x55
-	.4byte	0x13b5d
+	.4byte	0x13bcd
 	.uleb128 0x55
-	.4byte	0x13b5d
+	.4byte	0x13bcd
 	.uleb128 0x55
-	.4byte	0x13b5d
+	.4byte	0x13bcd
 	.uleb128 0x55
-	.4byte	0x13b51
+	.4byte	0x13bc1
 	.uleb128 0x55
-	.4byte	0x13b45
+	.4byte	0x13bb5
 	.uleb128 0x55
-	.4byte	0x13b39
+	.4byte	0x13ba9
 	.uleb128 0x57
-	.8byte	.LBB1265
-	.8byte	.LBE1265-.LBB1265
+	.8byte	.LBB1267
+	.8byte	.LBE1267-.LBB1267
 	.uleb128 0x58
-	.4byte	0x13b69
+	.4byte	0x13bd9
 	.uleb128 0x61
-	.4byte	0x13b75
-	.4byte	.LLST116
+	.4byte	0x13be5
+	.4byte	.LLST114
 	.uleb128 0x58
-	.4byte	0x13b7f
+	.4byte	0x13bef
 	.uleb128 0x61
-	.4byte	0x13b89
-	.4byte	.LLST117
+	.4byte	0x13bf9
+	.4byte	.LLST115
 	.uleb128 0x58
-	.4byte	0x13b95
+	.4byte	0x13c05
+	.uleb128 0x61
+	.4byte	0x13c11
+	.4byte	.LLST116
 	.uleb128 0x61
-	.4byte	0x13ba1
+	.4byte	0x13c1d
+	.4byte	.LLST117
+	.uleb128 0x61
+	.4byte	0x13c29
 	.4byte	.LLST118
 	.uleb128 0x61
-	.4byte	0x13bad
+	.4byte	0x13c35
 	.4byte	.LLST119
 	.uleb128 0x61
-	.4byte	0x13bb9
+	.4byte	0x13c41
 	.4byte	.LLST120
 	.uleb128 0x61
-	.4byte	0x13bc5
+	.4byte	0x13c4d
 	.4byte	.LLST121
 	.uleb128 0x61
-	.4byte	0x13bd1
+	.4byte	0x13c59
 	.4byte	.LLST122
-	.uleb128 0x61
-	.4byte	0x13bdd
-	.4byte	.LLST123
-	.uleb128 0x61
-	.4byte	0x13be9
-	.4byte	.LLST124
 	.uleb128 0x58
-	.4byte	0x13bf5
+	.4byte	0x13c65
 	.uleb128 0x5c
-	.4byte	0x1431c
-	.8byte	.LBB1266
+	.4byte	0x14386
+	.8byte	.LBB1268
 	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
 	.2byte	0x359
-	.4byte	0x1348a
+	.4byte	0x134fa
 	.uleb128 0x55
-	.4byte	0x14344
+	.4byte	0x143ae
 	.uleb128 0x55
-	.4byte	0x14338
+	.4byte	0x143a2
 	.uleb128 0x55
-	.4byte	0x1432c
+	.4byte	0x14396
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x1431c
-	.8byte	.LBB1271
+	.4byte	0x14386
+	.8byte	.LBB1273
 	.4byte	.Ldebug_ranges0+0x720
 	.byte	0x1
 	.2byte	0x35a
-	.4byte	0x134b2
+	.4byte	0x13522
 	.uleb128 0x55
-	.4byte	0x14344
+	.4byte	0x143ae
 	.uleb128 0x55
-	.4byte	0x14338
+	.4byte	0x143a2
 	.uleb128 0x55
-	.4byte	0x1432c
+	.4byte	0x14396
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x1431c
-	.8byte	.LBB1283
+	.4byte	0x14386
+	.8byte	.LBB1285
 	.4byte	.Ldebug_ranges0+0x790
 	.byte	0x1
 	.2byte	0x35b
-	.4byte	0x134da
+	.4byte	0x1354a
 	.uleb128 0x55
-	.4byte	0x14344
+	.4byte	0x143ae
 	.uleb128 0x55
-	.4byte	0x14338
+	.4byte	0x143a2
 	.uleb128 0x55
-	.4byte	0x1432c
+	.4byte	0x14396
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x1431c
-	.8byte	.LBB1295
+	.4byte	0x14386
+	.8byte	.LBB1297
 	.4byte	.Ldebug_ranges0+0x800
 	.byte	0x1
 	.2byte	0x35c
 	.uleb128 0x55
-	.4byte	0x14344
+	.4byte	0x143ae
 	.uleb128 0x55
-	.4byte	0x14338
+	.4byte	0x143a2
 	.uleb128 0x55
-	.4byte	0x1432c
+	.4byte	0x14396
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13886
-	.8byte	.LBB1306
-	.8byte	.LBE1306-.LBB1306
+	.4byte	0x138f6
+	.8byte	.LBB1308
+	.8byte	.LBE1308-.LBB1308
 	.byte	0x1
 	.2byte	0x44b
-	.4byte	0x135a9
+	.4byte	0x13619
 	.uleb128 0x55
-	.4byte	0x138b7
+	.4byte	0x13927
 	.uleb128 0x55
-	.4byte	0x138b7
+	.4byte	0x13927
 	.uleb128 0x55
-	.4byte	0x138b7
+	.4byte	0x13927
 	.uleb128 0x55
-	.4byte	0x138ab
+	.4byte	0x1391b
 	.uleb128 0x72
-	.4byte	0x1389f
+	.4byte	0x1390f
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x13893
+	.4byte	0x13903
 	.uleb128 0x57
-	.8byte	.LBB1307
-	.8byte	.LBE1307-.LBB1307
+	.8byte	.LBB1309
+	.8byte	.LBE1309-.LBB1309
 	.uleb128 0x58
-	.4byte	0x138c3
+	.4byte	0x13933
 	.uleb128 0x58
-	.4byte	0x138cf
+	.4byte	0x1393f
 	.uleb128 0x58
-	.4byte	0x138db
+	.4byte	0x1394b
 	.uleb128 0x58
-	.4byte	0x138e7
+	.4byte	0x13957
 	.uleb128 0x58
-	.4byte	0x138f3
+	.4byte	0x13963
 	.uleb128 0x58
-	.4byte	0x138ff
+	.4byte	0x1396f
 	.uleb128 0x61
-	.4byte	0x1390b
-	.4byte	.LLST125
+	.4byte	0x1397b
+	.4byte	.LLST123
 	.uleb128 0x61
-	.4byte	0x13917
-	.4byte	.LLST126
+	.4byte	0x13987
+	.4byte	.LLST124
 	.uleb128 0x58
-	.4byte	0x13923
+	.4byte	0x13993
 	.uleb128 0x61
-	.4byte	0x1392f
-	.4byte	.LLST127
+	.4byte	0x1399f
+	.4byte	.LLST125
 	.uleb128 0x58
-	.4byte	0x13939
+	.4byte	0x139a9
 	.uleb128 0x61
-	.4byte	0x13943
-	.4byte	.LLST128
+	.4byte	0x139b3
+	.4byte	.LLST126
 	.uleb128 0x61
-	.4byte	0x1394f
-	.4byte	.LLST129
+	.4byte	0x139bf
+	.4byte	.LLST127
 	.uleb128 0x58
-	.4byte	0x1395b
+	.4byte	0x139cb
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13a56
-	.8byte	.LBB1308
-	.8byte	.LBE1308-.LBB1308
+	.4byte	0x13ac6
+	.8byte	.LBB1310
+	.8byte	.LBE1310-.LBB1310
 	.byte	0x1
 	.2byte	0x448
-	.4byte	0x136a3
+	.4byte	0x13713
 	.uleb128 0x55
-	.4byte	0x13a87
+	.4byte	0x13af7
 	.uleb128 0x55
-	.4byte	0x13a87
+	.4byte	0x13af7
 	.uleb128 0x55
-	.4byte	0x13a87
+	.4byte	0x13af7
 	.uleb128 0x55
-	.4byte	0x13a7b
+	.4byte	0x13aeb
 	.uleb128 0x55
-	.4byte	0x13a6f
+	.4byte	0x13adf
 	.uleb128 0x55
-	.4byte	0x13a63
+	.4byte	0x13ad3
 	.uleb128 0x57
-	.8byte	.LBB1309
-	.8byte	.LBE1309-.LBB1309
+	.8byte	.LBB1311
+	.8byte	.LBE1311-.LBB1311
 	.uleb128 0x58
-	.4byte	0x13a93
+	.4byte	0x13b03
 	.uleb128 0x61
-	.4byte	0x13a9f
-	.4byte	.LLST130
+	.4byte	0x13b0f
+	.4byte	.LLST128
 	.uleb128 0x58
-	.4byte	0x13aa9
+	.4byte	0x13b19
 	.uleb128 0x61
-	.4byte	0x13ab3
-	.4byte	.LLST131
+	.4byte	0x13b23
+	.4byte	.LLST129
 	.uleb128 0x61
-	.4byte	0x13abf
-	.4byte	.LLST132
+	.4byte	0x13b2f
+	.4byte	.LLST130
 	.uleb128 0x61
-	.4byte	0x13acb
-	.4byte	.LLST133
+	.4byte	0x13b3b
+	.4byte	.LLST131
 	.uleb128 0x58
-	.4byte	0x13ad7
+	.4byte	0x13b47
 	.uleb128 0x62
-	.4byte	0x13ae3
+	.4byte	0x13b53
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x13aef
+	.4byte	0x13b5f
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x13afb
-	.4byte	.LLST134
+	.4byte	0x13b6b
+	.4byte	.LLST132
 	.uleb128 0x61
-	.4byte	0x13b07
-	.4byte	.LLST135
+	.4byte	0x13b77
+	.4byte	.LLST133
 	.uleb128 0x61
-	.4byte	0x13b13
-	.4byte	.LLST136
+	.4byte	0x13b83
+	.4byte	.LLST134
 	.uleb128 0x58
-	.4byte	0x13b1f
+	.4byte	0x13b8f
 	.uleb128 0x5c
-	.4byte	0x1431c
-	.8byte	.LBB1310
+	.4byte	0x14386
+	.8byte	.LBB1312
 	.4byte	.Ldebug_ranges0+0x850
 	.byte	0x1
 	.2byte	0x381
-	.4byte	0x1367d
+	.4byte	0x136ed
 	.uleb128 0x55
-	.4byte	0x14344
+	.4byte	0x143ae
 	.uleb128 0x55
-	.4byte	0x14338
+	.4byte	0x143a2
 	.uleb128 0x55
-	.4byte	0x1432c
+	.4byte	0x14396
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x1431c
-	.8byte	.LBB1317
+	.4byte	0x14386
+	.8byte	.LBB1319
 	.4byte	.Ldebug_ranges0+0x8b0
 	.byte	0x1
 	.2byte	0x382
 	.uleb128 0x55
-	.4byte	0x14344
+	.4byte	0x143ae
 	.uleb128 0x55
-	.4byte	0x14338
+	.4byte	0x143a2
 	.uleb128 0x55
-	.4byte	0x1432c
+	.4byte	0x14396
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x13968
-	.8byte	.LBB1328
-	.8byte	.LBE1328-.LBB1328
+	.4byte	0x139d8
+	.8byte	.LBB1330
+	.8byte	.LBE1330-.LBB1330
 	.byte	0x1
 	.2byte	0x442
 	.uleb128 0x55
-	.4byte	0x13999
+	.4byte	0x13a09
 	.uleb128 0x55
-	.4byte	0x13999
+	.4byte	0x13a09
 	.uleb128 0x55
-	.4byte	0x13999
+	.4byte	0x13a09
 	.uleb128 0x55
-	.4byte	0x1398d
+	.4byte	0x139fd
 	.uleb128 0x55
-	.4byte	0x13981
+	.4byte	0x139f1
 	.uleb128 0x55
-	.4byte	0x13975
+	.4byte	0x139e5
 	.uleb128 0x57
-	.8byte	.LBB1329
-	.8byte	.LBE1329-.LBB1329
+	.8byte	.LBB1331
+	.8byte	.LBE1331-.LBB1331
 	.uleb128 0x58
-	.4byte	0x139a5
+	.4byte	0x13a15
 	.uleb128 0x61
-	.4byte	0x139b1
-	.4byte	.LLST137
+	.4byte	0x13a21
+	.4byte	.LLST135
 	.uleb128 0x58
-	.4byte	0x139bb
+	.4byte	0x13a2b
 	.uleb128 0x61
-	.4byte	0x139c5
-	.4byte	.LLST138
+	.4byte	0x13a35
+	.4byte	.LLST136
 	.uleb128 0x61
-	.4byte	0x139d1
-	.4byte	.LLST139
+	.4byte	0x13a41
+	.4byte	.LLST137
 	.uleb128 0x61
-	.4byte	0x139dd
-	.4byte	.LLST140
+	.4byte	0x13a4d
+	.4byte	.LLST138
 	.uleb128 0x58
-	.4byte	0x139e9
+	.4byte	0x13a59
 	.uleb128 0x62
-	.4byte	0x139f5
+	.4byte	0x13a65
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x13a01
+	.4byte	0x13a71
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x13a0d
-	.4byte	.LLST141
+	.4byte	0x13a7d
+	.4byte	.LLST139
 	.uleb128 0x61
-	.4byte	0x13a19
-	.4byte	.LLST142
+	.4byte	0x13a89
+	.4byte	.LLST140
 	.uleb128 0x61
-	.4byte	0x13a25
-	.4byte	.LLST143
+	.4byte	0x13a95
+	.4byte	.LLST141
 	.uleb128 0x58
-	.4byte	0x13a31
+	.4byte	0x13aa1
 	.uleb128 0x58
-	.4byte	0x13a3d
+	.4byte	0x13aad
 	.uleb128 0x58
-	.4byte	0x13a49
+	.4byte	0x13ab9
 	.uleb128 0x5c
-	.4byte	0x142e7
-	.8byte	.LBB1330
+	.4byte	0x14351
+	.8byte	.LBB1332
 	.4byte	.Ldebug_ranges0+0x900
 	.byte	0x1
 	.2byte	0x3a8
-	.4byte	0x1377d
+	.4byte	0x137ed
 	.uleb128 0x55
-	.4byte	0x1430f
+	.4byte	0x14379
 	.uleb128 0x55
-	.4byte	0x14303
+	.4byte	0x1436d
 	.uleb128 0x55
-	.4byte	0x142f7
+	.4byte	0x14361
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x142e7
-	.8byte	.LBB1336
+	.4byte	0x14351
+	.8byte	.LBB1338
 	.4byte	.Ldebug_ranges0+0x960
 	.byte	0x1
 	.2byte	0x3a9
 	.uleb128 0x55
-	.4byte	0x1430f
+	.4byte	0x14379
 	.uleb128 0x55
-	.4byte	0x14303
+	.4byte	0x1436d
 	.uleb128 0x55
-	.4byte	0x142f7
+	.4byte	0x14361
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3150
+	.4byte	.LASF3152
 	.byte	0x1
 	.2byte	0x3f5
 	.byte	0x1
-	.4byte	0x13886
+	.4byte	0x138f6
 	.uleb128 0x66
-	.4byte	.LASF3133
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x3f5
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3134
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x3f6
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3135
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x3f6
 	.4byte	0xac0
@@ -46671,22 +46808,22 @@ __exitcall_ebc_exit:
 	.2byte	0x3f9
 	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3137
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x3fa
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3138
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x3fa
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3139
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x3fb
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x3fb
 	.4byte	0x110
@@ -46696,7 +46833,7 @@ __exitcall_ebc_exit:
 	.2byte	0x3fb
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x3fc
 	.4byte	0xc138
@@ -46721,7 +46858,7 @@ __exitcall_ebc_exit:
 	.2byte	0x3fe
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x3ff
 	.4byte	0xc6
@@ -46737,23 +46874,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3151
+	.4byte	.LASF3153
 	.byte	0x1
 	.2byte	0x3af
 	.byte	0x1
-	.4byte	0x13968
+	.4byte	0x139d8
 	.uleb128 0x66
-	.4byte	.LASF3133
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x3af
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3134
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x3b0
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3135
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x3b0
 	.4byte	0xac0
@@ -46768,22 +46905,22 @@ __exitcall_ebc_exit:
 	.2byte	0x3b3
 	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3137
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x3b4
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3138
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x3b4
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3139
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x3b5
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x3b5
 	.4byte	0x110
@@ -46793,7 +46930,7 @@ __exitcall_ebc_exit:
 	.2byte	0x3b5
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x3b6
 	.4byte	0xc138
@@ -46818,7 +46955,7 @@ __exitcall_ebc_exit:
 	.2byte	0x3b8
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x3b9
 	.4byte	0xc6
@@ -46834,23 +46971,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3152
+	.4byte	.LASF3154
 	.byte	0x1
 	.2byte	0x388
 	.byte	0x1
-	.4byte	0x13a56
+	.4byte	0x13ac6
 	.uleb128 0x66
-	.4byte	.LASF3133
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x388
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3134
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x389
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3135
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x389
 	.4byte	0xac0
@@ -46885,32 +47022,32 @@ __exitcall_ebc_exit:
 	.2byte	0x38f
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3139
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x390
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x390
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3137
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x390
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3138
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x390
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x391
 	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x392
 	.4byte	0xc6
@@ -46925,34 +47062,34 @@ __exitcall_ebc_exit:
 	.2byte	0x394
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3145
+	.4byte	.LASF3147
 	.byte	0x1
 	.2byte	0x395
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3146
+	.4byte	.LASF3148
 	.byte	0x1
 	.2byte	0x396
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3153
+	.4byte	.LASF3155
 	.byte	0x1
 	.2byte	0x363
 	.byte	0x1
-	.4byte	0x13b2c
+	.4byte	0x13b9c
 	.uleb128 0x66
-	.4byte	.LASF3133
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x363
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3134
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x364
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3135
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x364
 	.4byte	0xac0
@@ -46987,32 +47124,32 @@ __exitcall_ebc_exit:
 	.2byte	0x36a
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3139
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x36b
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x36b
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3137
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x36b
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3138
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x36b
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x36c
 	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x36d
 	.4byte	0xc6
@@ -47028,23 +47165,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3154
+	.4byte	.LASF3156
 	.byte	0x1
 	.2byte	0x33b
 	.byte	0x1
-	.4byte	0x13c02
+	.4byte	0x13c72
 	.uleb128 0x66
-	.4byte	.LASF3133
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x33b
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3134
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x33c
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3135
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x33c
 	.4byte	0xac0
@@ -47079,32 +47216,32 @@ __exitcall_ebc_exit:
 	.2byte	0x342
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3139
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x343
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x343
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3137
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x343
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3138
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x343
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x344
 	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x345
 	.4byte	0xc6
@@ -47120,37 +47257,37 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3155
+	.4byte	.LASF3157
 	.byte	0x1
 	.2byte	0x26d
-	.8byte	.LFB2814
-	.8byte	.LFE2814-.LFB2814
+	.8byte	.LFB2815
+	.8byte	.LFE2815-.LFB2815
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13d69
+	.4byte	0x13dd3
 	.uleb128 0x75
-	.4byte	.LASF3133
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x26d
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x75
-	.4byte	.LASF3134
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x26d
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x75
-	.4byte	.LASF3135
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x26d
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x75
-	.4byte	.LASF3156
+	.4byte	.LASF3158
 	.byte	0x1
 	.2byte	0x26e
 	.4byte	0xc138
@@ -47168,12 +47305,13 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x270
 	.4byte	0xe1f4
-	.uleb128 0x5b
+	.uleb128 0x6a
 	.string	"i"
 	.byte	0x1
 	.2byte	0x271
 	.4byte	0xc6
-	.4byte	.LLST6
+	.uleb128 0x1
+	.byte	0x5d
 	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
@@ -47185,66 +47323,65 @@ __exitcall_ebc_exit:
 	.2byte	0x273
 	.4byte	0xc6
 	.uleb128 0x1
-	.byte	0x61
-	.uleb128 0x5a
+	.byte	0x62
+	.uleb128 0x4d
 	.4byte	.LASF262
 	.byte	0x1
 	.2byte	0x274
 	.4byte	0xc6
-	.4byte	.LLST7
+	.uleb128 0x1
+	.byte	0x5b
 	.uleb128 0x5a
-	.4byte	.LASF3139
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x275
 	.4byte	0x13f
-	.4byte	.LLST8
+	.4byte	.LLST6
 	.uleb128 0x5a
-	.4byte	.LASF3140
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x275
 	.4byte	0x13f
-	.4byte	.LLST9
+	.4byte	.LLST7
 	.uleb128 0x48
-	.4byte	.LASF3157
+	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x275
 	.4byte	0x13f
 	.uleb128 0x4d
-	.4byte	.LASF3137
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x276
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4d
-	.4byte	.LASF3138
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x276
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5a
-	.4byte	.LASF3141
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x277
 	.4byte	0xc138
-	.4byte	.LLST10
-	.uleb128 0x4d
+	.4byte	.LLST8
+	.uleb128 0x48
 	.4byte	.LASF2985
 	.byte	0x1
 	.2byte	0x278
 	.4byte	0x110
-	.uleb128 0x1
-	.byte	0x5b
 	.uleb128 0x4d
-	.4byte	.LASF3158
+	.4byte	.LASF3160
 	.byte	0x1
 	.2byte	0x279
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x48
-	.4byte	.LASF3159
+	.4byte	.LASF3161
 	.byte	0x1
 	.2byte	0x27a
 	.4byte	0x110
@@ -47259,54 +47396,54 @@ __exitcall_ebc_exit:
 	.2byte	0x27c
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3160
+	.4byte	.LASF3162
 	.byte	0x1
 	.2byte	0x27d
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3161
+	.4byte	.LASF3163
 	.byte	0x1
 	.2byte	0x27d
 	.4byte	0x110
 	.uleb128 0x5a
-	.4byte	.LASF3162
+	.4byte	.LASF3164
 	.byte	0x1
 	.2byte	0x27e
 	.4byte	0x13f
-	.4byte	.LLST11
+	.4byte	.LLST9
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3163
+	.4byte	.LASF3165
 	.byte	0x1
 	.2byte	0x1c8
-	.8byte	.LFB2813
-	.8byte	.LFE2813-.LFB2813
+	.8byte	.LFB2814
+	.8byte	.LFE2814-.LFB2814
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13ec4
+	.4byte	0x13f2e
 	.uleb128 0x75
-	.4byte	.LASF3133
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x1c8
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x75
-	.4byte	.LASF3134
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x1c8
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x75
-	.4byte	.LASF3135
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x1c8
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x75
-	.4byte	.LASF3156
+	.4byte	.LASF3158
 	.byte	0x1
 	.2byte	0x1c9
 	.4byte	0xc138
@@ -47349,33 +47486,33 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.4byte	.LLST1
 	.uleb128 0x5a
-	.4byte	.LASF3139
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x1d0
 	.4byte	0x13f
 	.4byte	.LLST2
 	.uleb128 0x5a
-	.4byte	.LASF3140
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x1d0
 	.4byte	0x13f
 	.4byte	.LLST3
 	.uleb128 0x4d
-	.4byte	.LASF3137
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x1d1
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4d
-	.4byte	.LASF3138
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x1d1
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5a
-	.4byte	.LASF3141
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x1d2
 	.4byte	0xc138
@@ -47388,14 +47525,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x4d
-	.4byte	.LASF3158
+	.4byte	.LASF3160
 	.byte	0x1
 	.2byte	0x1d4
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x48
-	.4byte	.LASF3159
+	.4byte	.LASF3161
 	.byte	0x1
 	.2byte	0x1d5
 	.4byte	0x110
@@ -47410,45 +47547,45 @@ __exitcall_ebc_exit:
 	.2byte	0x1d7
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3160
+	.4byte	.LASF3162
 	.byte	0x1
 	.2byte	0x1d8
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3161
+	.4byte	.LASF3163
 	.byte	0x1
 	.2byte	0x1d8
 	.4byte	0x110
 	.uleb128 0x5a
-	.4byte	.LASF3162
+	.4byte	.LASF3164
 	.byte	0x1
 	.2byte	0x1d9
 	.4byte	0x13f
 	.4byte	.LLST5
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3164
+	.4byte	.LASF3166
 	.byte	0x1
 	.2byte	0x169
 	.byte	0x1
-	.4byte	0x13fe2
+	.4byte	0x1404c
 	.uleb128 0x66
-	.4byte	.LASF3165
+	.4byte	.LASF3167
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3166
+	.4byte	.LASF3168
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3167
+	.4byte	.LASF3169
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3156
+	.4byte	.LASF3158
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0x46f4
@@ -47473,47 +47610,47 @@ __exitcall_ebc_exit:
 	.2byte	0x16c
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3168
+	.4byte	.LASF3170
 	.byte	0x1
 	.2byte	0x16d
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3169
+	.4byte	.LASF3171
 	.byte	0x1
 	.2byte	0x16d
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3170
+	.4byte	.LASF3172
 	.byte	0x1
 	.2byte	0x16d
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3171
+	.4byte	.LASF3173
 	.byte	0x1
 	.2byte	0x16e
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3172
+	.4byte	.LASF3174
 	.byte	0x1
 	.2byte	0x16e
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3173
+	.4byte	.LASF3175
 	.byte	0x1
 	.2byte	0x16e
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3159
+	.4byte	.LASF3161
 	.byte	0x1
 	.2byte	0x16f
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3158
+	.4byte	.LASF3160
 	.byte	0x1
 	.2byte	0x170
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3174
+	.4byte	.LASF3176
 	.byte	0x1
 	.2byte	0x171
 	.4byte	0x13f
@@ -47549,73 +47686,73 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x76
-	.4byte	.LASF3175
+	.4byte	.LASF3177
 	.byte	0x1
 	.2byte	0x152
-	.8byte	.LFB2811
-	.8byte	.LFE2811-.LFB2811
+	.8byte	.LFB2812
+	.8byte	.LFE2812-.LFB2812
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14072
+	.4byte	0x140dc
 	.uleb128 0x59
 	.4byte	.LASF2288
 	.byte	0x1
 	.2byte	0x152
 	.4byte	0x3205
-	.4byte	.LLST234
+	.4byte	.LLST231
 	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x154
 	.4byte	0xe557
-	.4byte	.LLST235
+	.4byte	.LLST232
 	.uleb128 0x5a
 	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x155
 	.4byte	0xe874
-	.4byte	.LLST236
+	.4byte	.LLST233
 	.uleb128 0x4f
-	.8byte	.LVL840
-	.4byte	0x1537e
+	.8byte	.LVL821
+	.4byte	0x153f5
 	.uleb128 0x4f
-	.8byte	.LVL842
-	.4byte	0x14139
+	.8byte	.LVL823
+	.4byte	0x141a3
 	.uleb128 0x4f
-	.8byte	.LVL843
-	.4byte	0x1538a
+	.8byte	.LVL824
+	.4byte	0x15401
 	.uleb128 0x4f
-	.8byte	.LVL846
-	.4byte	0x14072
+	.8byte	.LVL827
+	.4byte	0x140dc
 	.uleb128 0x4f
-	.8byte	.LVL847
-	.4byte	0x1538a
+	.8byte	.LVL828
+	.4byte	0x15401
 	.byte	0
 	.uleb128 0x76
-	.4byte	.LASF3176
+	.4byte	.LASF3178
 	.byte	0x1
 	.2byte	0x121
-	.8byte	.LFB2810
-	.8byte	.LFE2810-.LFB2810
+	.8byte	.LFB2811
+	.8byte	.LFE2811-.LFB2811
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14139
+	.4byte	0x141a3
 	.uleb128 0x75
-	.4byte	.LASF3165
+	.4byte	.LASF3167
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x75
-	.4byte	.LASF3166
+	.4byte	.LASF3168
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x75
-	.4byte	.LASF3156
+	.4byte	.LASF3158
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0x46f4
@@ -47626,7 +47763,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x122
 	.4byte	0xe874
-	.4byte	.LLST230
+	.4byte	.LLST227
 	.uleb128 0x4d
 	.4byte	.LASF2915
 	.byte	0x1
@@ -47642,22 +47779,22 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x59
 	.uleb128 0x48
-	.4byte	.LASF3168
+	.4byte	.LASF3170
 	.byte	0x1
 	.2byte	0x125
 	.4byte	0x13f
 	.uleb128 0x5a
-	.4byte	.LASF3169
+	.4byte	.LASF3171
 	.byte	0x1
 	.2byte	0x125
 	.4byte	0x13f
-	.4byte	.LLST231
+	.4byte	.LLST228
 	.uleb128 0x5a
-	.4byte	.LASF3159
+	.4byte	.LASF3161
 	.byte	0x1
 	.2byte	0x126
 	.4byte	0x15a
-	.4byte	.LLST232
+	.4byte	.LLST229
 	.uleb128 0x6a
 	.string	"i"
 	.byte	0x1
@@ -47671,44 +47808,44 @@ __exitcall_ebc_exit:
 	.2byte	0x127
 	.4byte	0xc6
 	.uleb128 0x5a
-	.4byte	.LASF3174
+	.4byte	.LASF3176
 	.byte	0x1
 	.2byte	0x128
 	.4byte	0x13f
-	.4byte	.LLST233
+	.4byte	.LLST230
 	.byte	0
 	.uleb128 0x77
-	.4byte	.LASF3177
+	.4byte	.LASF3179
 	.byte	0x1
 	.byte	0xd6
-	.8byte	.LFB2809
-	.8byte	.LFE2809-.LFB2809
+	.8byte	.LFB2810
+	.8byte	.LFE2810-.LFB2810
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1421e
+	.4byte	0x14288
 	.uleb128 0x78
-	.4byte	.LASF3165
+	.4byte	.LASF3167
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x78
-	.4byte	.LASF3166
+	.4byte	.LASF3168
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x78
-	.4byte	.LASF3167
+	.4byte	.LASF3169
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x78
-	.4byte	.LASF3156
+	.4byte	.LASF3158
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0x46f4
@@ -47719,13 +47856,13 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0xd7
 	.4byte	0xe874
-	.4byte	.LLST224
+	.4byte	.LLST221
 	.uleb128 0x79
 	.4byte	.LASF2882
 	.byte	0x1
 	.byte	0xd7
 	.4byte	0xc6
-	.4byte	.LLST225
+	.4byte	.LLST222
 	.uleb128 0x4c
 	.4byte	.LASF2915
 	.byte	0x1
@@ -47741,28 +47878,28 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x7a
-	.4byte	.LASF3168
+	.4byte	.LASF3170
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x13f
 	.uleb128 0x7b
-	.4byte	.LASF3169
+	.4byte	.LASF3171
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x13f
-	.4byte	.LLST226
+	.4byte	.LLST223
 	.uleb128 0x7b
-	.4byte	.LASF3170
+	.4byte	.LASF3172
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x13f
-	.4byte	.LLST227
+	.4byte	.LLST224
 	.uleb128 0x7b
-	.4byte	.LASF3159
+	.4byte	.LASF3161
 	.byte	0x1
 	.byte	0xdb
 	.4byte	0x15a
-	.4byte	.LLST228
+	.4byte	.LLST225
 	.uleb128 0x7c
 	.string	"i"
 	.byte	0x1
@@ -47776,26 +47913,26 @@ __exitcall_ebc_exit:
 	.byte	0xdc
 	.4byte	0xc6
 	.uleb128 0x7b
-	.4byte	.LASF3174
+	.4byte	.LASF3176
 	.byte	0x1
 	.byte	0xdd
 	.4byte	0x13f
-	.4byte	.LLST229
+	.4byte	.LLST226
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3178
+	.4byte	.LASF3180
 	.byte	0x1
 	.byte	0xb7
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x14251
+	.4byte	0x142bb
 	.uleb128 0x7f
 	.string	"ebc"
 	.byte	0x1
 	.byte	0xb7
 	.4byte	0xe557
 	.uleb128 0x80
-	.4byte	.LASF3179
+	.4byte	.LASF3181
 	.byte	0x1
 	.byte	0xb7
 	.4byte	0xc6
@@ -47806,123 +47943,123 @@ __exitcall_ebc_exit:
 	.4byte	0xe874
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3180
+	.4byte	.LASF3182
 	.byte	0x1
 	.byte	0xa5
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x1429c
+	.4byte	0x14306
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
 	.byte	0xa5
 	.4byte	0xc138
 	.uleb128 0x80
-	.4byte	.LASF3139
+	.4byte	.LASF3141
 	.byte	0x1
 	.byte	0xa5
 	.4byte	0x11f
 	.uleb128 0x80
-	.4byte	.LASF3140
+	.4byte	.LASF3142
 	.byte	0x1
 	.byte	0xa5
 	.4byte	0x11f
 	.uleb128 0x7a
-	.4byte	.LASF3181
+	.4byte	.LASF3183
 	.byte	0x1
 	.byte	0xa7
 	.4byte	0x110
 	.uleb128 0x7a
-	.4byte	.LASF3162
+	.4byte	.LASF3164
 	.byte	0x1
 	.byte	0xa8
 	.4byte	0x11f
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3182
+	.4byte	.LASF3184
 	.byte	0x1
 	.byte	0x8f
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x142e7
+	.4byte	0x14351
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
 	.byte	0x8f
 	.4byte	0xc138
 	.uleb128 0x80
-	.4byte	.LASF3139
+	.4byte	.LASF3141
 	.byte	0x1
 	.byte	0x8f
 	.4byte	0x11f
 	.uleb128 0x80
-	.4byte	.LASF3140
+	.4byte	.LASF3142
 	.byte	0x1
 	.byte	0x8f
 	.4byte	0x11f
 	.uleb128 0x7a
-	.4byte	.LASF3181
+	.4byte	.LASF3183
 	.byte	0x1
 	.byte	0x91
 	.4byte	0x110
 	.uleb128 0x7a
-	.4byte	.LASF3162
+	.4byte	.LASF3164
 	.byte	0x1
 	.byte	0x92
 	.4byte	0x11f
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3183
+	.4byte	.LASF3185
 	.byte	0x1
 	.byte	0x89
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x1431c
+	.4byte	0x14386
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
 	.byte	0x89
 	.4byte	0xc138
 	.uleb128 0x80
-	.4byte	.LASF3139
+	.4byte	.LASF3141
 	.byte	0x1
 	.byte	0x89
 	.4byte	0x11f
 	.uleb128 0x80
-	.4byte	.LASF3140
+	.4byte	.LASF3142
 	.byte	0x1
 	.byte	0x89
 	.4byte	0x11f
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3184
+	.4byte	.LASF3186
 	.byte	0x1
 	.byte	0x83
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x14351
+	.4byte	0x143bb
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
 	.byte	0x83
 	.4byte	0xc138
 	.uleb128 0x80
-	.4byte	.LASF3139
+	.4byte	.LASF3141
 	.byte	0x1
 	.byte	0x83
 	.4byte	0x11f
 	.uleb128 0x80
-	.4byte	.LASF3140
+	.4byte	.LASF3142
 	.byte	0x1
 	.byte	0x83
 	.4byte	0x11f
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3185
+	.4byte	.LASF3187
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x14377
+	.4byte	0x143e1
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
@@ -47935,65 +48072,65 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3186
+	.4byte	.LASF3188
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x143a9
+	.4byte	0x14413
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0xe1b4
 	.uleb128 0x80
-	.4byte	.LASF3187
+	.4byte	.LASF3189
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13f
 	.uleb128 0x80
-	.4byte	.LASF3188
+	.4byte	.LASF3190
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3189
+	.4byte	.LASF3191
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x143f3
+	.4byte	0x1445d
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xe1b4
 	.uleb128 0x80
-	.4byte	.LASF3190
+	.4byte	.LASF3192
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xc6
 	.uleb128 0x80
-	.4byte	.LASF3191
+	.4byte	.LASF3193
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x80
-	.4byte	.LASF3192
+	.4byte	.LASF3194
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x80
-	.4byte	.LASF3193
+	.4byte	.LASF3195
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3194
+	.4byte	.LASF3196
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x1440d
+	.4byte	0x14477
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
@@ -48001,12 +48138,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe1b4
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3195
+	.4byte	.LASF3197
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14436
+	.4byte	0x144a0
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
@@ -48019,11 +48156,11 @@ __exitcall_ebc_exit:
 	.4byte	0xe1f4
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3196
+	.4byte	.LASF3198
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x14480
+	.4byte	0x144ea
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
@@ -48051,12 +48188,12 @@ __exitcall_ebc_exit:
 	.4byte	0xb829
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3197
+	.4byte	.LASF3199
 	.byte	0xa
 	.2byte	0x108
 	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x1449e
+	.4byte	0x14508
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
@@ -48064,12 +48201,12 @@ __exitcall_ebc_exit:
 	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3198
+	.4byte	.LASF3200
 	.byte	0xc8
 	.byte	0x1d
 	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x144ba
+	.4byte	0x14524
 	.uleb128 0x7f
 	.string	"bus"
 	.byte	0xc8
@@ -48077,31 +48214,31 @@ __exitcall_ebc_exit:
 	.4byte	0xae47
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3199
+	.4byte	.LASF3201
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x144d7
+	.4byte	0x14541
 	.uleb128 0x80
-	.4byte	.LASF3200
+	.4byte	.LASF3202
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3201
+	.4byte	.LASF3203
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x14514
+	.4byte	0x1457e
 	.uleb128 0x7f
 	.string	"dev"
 	.byte	0xcb
 	.byte	0xa3
 	.4byte	0xa5e0
 	.uleb128 0x80
-	.4byte	.LASF3202
+	.4byte	.LASF3204
 	.byte	0xcb
 	.byte	0xa4
 	.4byte	0x325
@@ -48111,18 +48248,18 @@ __exitcall_ebc_exit:
 	.byte	0xa5
 	.4byte	0x2e3
 	.uleb128 0x80
-	.4byte	.LASF3203
+	.4byte	.LASF3205
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3204
+	.4byte	.LASF3206
 	.byte	0x3
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14531
+	.4byte	0x1459b
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48130,12 +48267,12 @@ __exitcall_ebc_exit:
 	.4byte	0xdbb4
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3205
+	.4byte	.LASF3207
 	.byte	0x3
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14557
+	.4byte	0x145c1
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48148,11 +48285,11 @@ __exitcall_ebc_exit:
 	.4byte	0x46ee
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3206
+	.4byte	.LASF3208
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x14571
+	.4byte	0x145db
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48160,11 +48297,11 @@ __exitcall_ebc_exit:
 	.4byte	0xdbb4
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3207
+	.4byte	.LASF3209
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x1458b
+	.4byte	0x145f5
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48172,11 +48309,11 @@ __exitcall_ebc_exit:
 	.4byte	0xdbb4
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3208
+	.4byte	.LASF3210
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x145a5
+	.4byte	0x1460f
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -48184,28 +48321,34 @@ __exitcall_ebc_exit:
 	.4byte	0xdbb4
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3209
+	.4byte	.LASF3211
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x145bf
+	.4byte	0x14629
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
 	.byte	0x1c
 	.4byte	0xdbb4
 	.byte	0
+	.uleb128 0x82
+	.4byte	.LASF3341
+	.byte	0xc2
+	.byte	0x36
+	.4byte	0xc6
+	.byte	0x3
 	.uleb128 0x81
-	.4byte	.LASF3210
+	.4byte	.LASF3212
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x145d9
+	.4byte	0x14650
 	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x145d9
+	.4byte	0x14650
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -48215,24 +48358,24 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x145f9
+	.4byte	0x14670
 	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x145d9
+	.4byte	0x14650
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3211
+	.4byte	.LASF3213
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x14635
+	.4byte	0x146ac
 	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x145d9
+	.4byte	0x14650
 	.uleb128 0x80
 	.4byte	.LASF193
 	.byte	0x4
@@ -48250,12 +48393,12 @@ __exitcall_ebc_exit:
 	.4byte	0xad7d
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3212
+	.4byte	.LASF3214
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14665
+	.4byte	0x146dc
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -48273,12 +48416,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3213
+	.4byte	.LASF3215
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14695
+	.4byte	0x1470c
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -48296,12 +48439,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3214
+	.4byte	.LASF3216
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x146c5
+	.4byte	0x1473c
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -48319,12 +48462,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3215
+	.4byte	.LASF3217
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14700
+	.4byte	0x14777
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -48347,37 +48490,37 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3216
+	.4byte	.LASF3218
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14734
+	.4byte	0x147ab
 	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x30bc
 	.uleb128 0x7a
-	.4byte	.LASF3217
+	.4byte	.LASF3219
 	.byte	0x6
 	.byte	0xf7
 	.4byte	0x458
 	.uleb128 0x68
 	.uleb128 0x7a
-	.4byte	.LASF3218
+	.4byte	.LASF3220
 	.byte	0x6
 	.byte	0xfe
 	.4byte	0x15a
 	.byte	0
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3219
+	.4byte	.LASF3221
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14780
+	.4byte	0x147f7
 	.uleb128 0x80
 	.4byte	.LASF1164
 	.byte	0x6
@@ -48394,116 +48537,116 @@ __exitcall_ebc_exit:
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x7a
-	.4byte	.LASF3220
+	.4byte	.LASF3222
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x68
 	.uleb128 0x7a
-	.4byte	.LASF3218
+	.4byte	.LASF3220
 	.byte	0x6
 	.byte	0x56
 	.4byte	0x15a
 	.byte	0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3221
-	.byte	0x12
+	.4byte	.LASF3223
+	.byte	0x11
 	.2byte	0x2e5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x147aa
+	.4byte	0x14821
 	.uleb128 0x66
 	.4byte	.LASF1001
-	.byte	0x12
+	.byte	0x11
 	.2byte	0x2e5
 	.4byte	0x2e3
 	.uleb128 0x66
 	.4byte	.LASF171
-	.byte	0x12
+	.byte	0x11
 	.2byte	0x2e5
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3222
-	.byte	0x12
+	.4byte	.LASF3224
+	.byte	0x11
 	.2byte	0x216
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x147e2
+	.4byte	0x14859
 	.uleb128 0x66
 	.4byte	.LASF1001
-	.byte	0x12
+	.byte	0x11
 	.2byte	0x216
 	.4byte	0x2e3
 	.uleb128 0x66
 	.4byte	.LASF171
-	.byte	0x12
+	.byte	0x11
 	.2byte	0x216
 	.4byte	0x330
 	.uleb128 0x68
 	.uleb128 0x48
 	.4byte	.LASF894
-	.byte	0x12
+	.byte	0x11
 	.2byte	0x21a
 	.4byte	0x6d
 	.byte	0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3223
-	.byte	0x12
+	.4byte	.LASF3225
+	.byte	0x11
 	.2byte	0x1dd
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14818
+	.4byte	0x1488f
 	.uleb128 0x66
 	.4byte	.LASF1001
-	.byte	0x12
+	.byte	0x11
 	.2byte	0x1dd
 	.4byte	0x2e3
 	.uleb128 0x66
 	.4byte	.LASF171
-	.byte	0x12
+	.byte	0x11
 	.2byte	0x1dd
 	.4byte	0x330
 	.uleb128 0x48
-	.4byte	.LASF3224
-	.byte	0x12
+	.4byte	.LASF3226
+	.byte	0x11
 	.2byte	0x1df
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3225
-	.byte	0x12
+	.4byte	.LASF3227
+	.byte	0x11
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x14836
+	.4byte	0x148ad
 	.uleb128 0x66
 	.4byte	.LASF1001
-	.byte	0x12
+	.byte	0x11
 	.2byte	0x159
 	.4byte	0x2e3
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3226
-	.byte	0x12
+	.4byte	.LASF3228
+	.byte	0x11
 	.2byte	0x13d
 	.4byte	0xd813
 	.byte	0x3
-	.4byte	0x14854
+	.4byte	0x148cb
 	.uleb128 0x66
 	.4byte	.LASF171
-	.byte	0x12
+	.byte	0x11
 	.2byte	0x13d
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3227
+	.4byte	.LASF3229
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x1487a
+	.4byte	0x148f1
 	.uleb128 0x80
 	.4byte	.LASF3052
 	.byte	0xbe
@@ -48516,111 +48659,111 @@ __exitcall_ebc_exit:
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3228
+	.4byte	.LASF3230
 	.byte	0xbe
 	.byte	0xd6
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14897
+	.4byte	0x1490e
 	.uleb128 0x80
 	.4byte	.LASF3052
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x14897
+	.4byte	0x1490e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xd6e2
 	.uleb128 0x64
-	.4byte	.LASF3229
+	.4byte	.LASF3231
 	.byte	0xa3
 	.2byte	0x164
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x148bb
+	.4byte	0x14932
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x148bb
+	.4byte	0x14932
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc133
 	.uleb128 0x64
-	.4byte	.LASF3230
-	.byte	0xe
+	.4byte	.LASF3232
+	.byte	0xc
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x148f6
+	.4byte	0x1496d
 	.uleb128 0x65
 	.string	"np"
-	.byte	0xe
+	.byte	0xc
 	.2byte	0x498
 	.4byte	0xbd2a
 	.uleb128 0x66
-	.4byte	.LASF3231
-	.byte	0xe
+	.4byte	.LASF3233
+	.byte	0xc
 	.2byte	0x499
 	.4byte	0x56
 	.uleb128 0x66
-	.4byte	.LASF3232
-	.byte	0xe
+	.4byte	.LASF3234
+	.byte	0xc
 	.2byte	0x49a
 	.4byte	0xac0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3233
-	.byte	0xe
+	.4byte	.LASF3235
+	.byte	0xc
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14942
+	.4byte	0x149b9
 	.uleb128 0x65
 	.string	"np"
-	.byte	0xe
+	.byte	0xc
 	.2byte	0x1ef
 	.4byte	0xbd2a
 	.uleb128 0x66
-	.4byte	.LASF3231
-	.byte	0xe
+	.4byte	.LASF3233
+	.byte	0xc
 	.2byte	0x1f0
 	.4byte	0x56
 	.uleb128 0x66
-	.4byte	.LASF3234
-	.byte	0xe
+	.4byte	.LASF3236
+	.byte	0xc
 	.2byte	0x1f1
 	.4byte	0xac0
 	.uleb128 0x65
 	.string	"sz"
-	.byte	0xe
+	.byte	0xc
 	.2byte	0x1f1
 	.4byte	0x2e3
 	.uleb128 0x53
 	.string	"ret"
-	.byte	0xe
+	.byte	0xc
 	.2byte	0x1f3
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3235
-	.byte	0xe
+	.4byte	.LASF3237
+	.byte	0xc
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x1495c
+	.4byte	0x149d3
 	.uleb128 0x80
 	.4byte	.LASF882
-	.byte	0xe
+	.byte	0xc
 	.byte	0x83
 	.4byte	0xb904
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3236
+	.4byte	.LASF3238
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x14982
+	.4byte	0x149f9
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -48633,12 +48776,12 @@ __exitcall_ebc_exit:
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3237
+	.4byte	.LASF3239
 	.byte	0x2
 	.2byte	0x49b
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x149a0
+	.4byte	0x14a17
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -48646,12 +48789,12 @@ __exitcall_ebc_exit:
 	.4byte	0xbb9a
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3238
+	.4byte	.LASF3240
 	.byte	0x2
 	.2byte	0x2c5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x149d6
+	.4byte	0x14a4d
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -48669,25 +48812,25 @@ __exitcall_ebc_exit:
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3239
-	.byte	0xf
+	.4byte	.LASF3241
+	.byte	0xd
 	.byte	0xca
 	.4byte	0x351
 	.byte	0x3
-	.4byte	0x149f2
+	.4byte	0x14a69
 	.uleb128 0x7f
 	.string	"res"
-	.byte	0xf
+	.byte	0xd
 	.byte	0xca
 	.4byte	0xc244
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3240
+	.4byte	.LASF3242
 	.byte	0xcc
 	.byte	0x22
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x14a0e
+	.4byte	0x14a85
 	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0xcc
@@ -48695,12 +48838,12 @@ __exitcall_ebc_exit:
 	.4byte	0x30bc
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3241
+	.4byte	.LASF3243
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14a2b
+	.4byte	0x14aa2
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xcd
@@ -48708,47 +48851,47 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3242
-	.byte	0xd
+	.4byte	.LASF3244
+	.byte	0x12
 	.2byte	0x203
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x14a54
+	.4byte	0x14acb
 	.uleb128 0x65
 	.string	"wq"
-	.byte	0xd
+	.byte	0x12
 	.2byte	0x203
 	.4byte	0x331f
 	.uleb128 0x66
 	.4byte	.LASF2288
-	.byte	0xd
+	.byte	0x12
 	.2byte	0x204
 	.4byte	0x3205
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3243
-	.byte	0xd
+	.4byte	.LASF3245
+	.byte	0x12
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x14a7a
+	.4byte	0x14af1
 	.uleb128 0x80
 	.4byte	.LASF2288
-	.byte	0xd
+	.byte	0x12
 	.byte	0xdd
 	.4byte	0x3205
 	.uleb128 0x80
-	.4byte	.LASF3244
-	.byte	0xd
+	.4byte	.LASF3246
+	.byte	0x12
 	.byte	0xdd
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3245
+	.4byte	.LASF3247
 	.byte	0x51
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14a96
+	.4byte	0x14b0d
 	.uleb128 0x65
 	.string	"m"
 	.byte	0x51
@@ -48756,12 +48899,12 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3246
+	.4byte	.LASF3248
 	.byte	0x51
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14ab2
+	.4byte	0x14b29
 	.uleb128 0x65
 	.string	"m"
 	.byte	0x51
@@ -48769,24 +48912,24 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3247
+	.4byte	.LASF3249
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x14af1
+	.4byte	0x14b68
 	.uleb128 0x80
 	.4byte	.LASF1164
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x30bc
 	.uleb128 0x80
-	.4byte	.LASF3248
+	.4byte	.LASF3250
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2e3
 	.uleb128 0x80
-	.4byte	.LASF3249
+	.4byte	.LASF3251
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2b0
@@ -48797,11 +48940,11 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3250
+	.4byte	.LASF3252
 	.byte	0xca
 	.byte	0x91
 	.byte	0x3
-	.4byte	0x14b24
+	.4byte	0x14b9b
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xca
@@ -48814,18 +48957,18 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.uleb128 0x68
 	.uleb128 0x7a
-	.4byte	.LASF3251
+	.4byte	.LASF3253
 	.byte	0xca
 	.byte	0x93
 	.4byte	0xc6
 	.byte	0
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3252
+	.4byte	.LASF3254
 	.byte	0xca
 	.byte	0x80
 	.byte	0x3
-	.4byte	0x14b52
+	.4byte	0x14bc9
 	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0xca
@@ -48837,25 +48980,25 @@ __exitcall_ebc_exit:
 	.byte	0x80
 	.4byte	0x29
 	.uleb128 0x80
-	.4byte	.LASF3253
+	.4byte	.LASF3255
 	.byte	0xca
 	.byte	0x81
 	.4byte	0x2b0
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3254
+	.4byte	.LASF3256
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14b79
+	.4byte	0x14bf0
 	.uleb128 0x7f
 	.string	"ti"
 	.byte	0xca
 	.byte	0x5f
-	.4byte	0x14b79
+	.4byte	0x14bf0
 	.uleb128 0x80
-	.4byte	.LASF3255
+	.4byte	.LASF3257
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
@@ -48864,65 +49007,65 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.4byte	0xc33
 	.uleb128 0x7e
-	.4byte	.LASF3256
+	.4byte	.LASF3258
 	.byte	0x5
 	.byte	0xf
 	.4byte	0x2f05
 	.byte	0x3
-	.4byte	0x14b9b
+	.4byte	0x14c12
 	.uleb128 0x7a
-	.4byte	.LASF3257
+	.4byte	.LASF3259
 	.byte	0x5
 	.byte	0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3258
-	.byte	0x10
+	.4byte	.LASF3260
+	.byte	0xf
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x14be1
+	.4byte	0x14c58
 	.uleb128 0x80
 	.4byte	.LASF976
-	.byte	0x10
+	.byte	0xf
 	.byte	0x1a
 	.4byte	0x3cc
 	.uleb128 0x68
 	.uleb128 0x21
 	.byte	0x8
-	.byte	0x10
+	.byte	0xf
 	.byte	0x1c
-	.4byte	0x14bd4
+	.4byte	0x14c4b
 	.uleb128 0x22
-	.4byte	.LASF3128
-	.byte	0x10
+	.4byte	.LASF3130
+	.byte	0xf
 	.byte	0x1c
 	.4byte	0x3cc
 	.uleb128 0x28
 	.string	"__c"
-	.byte	0x10
+	.byte	0xf
 	.byte	0x1c
-	.4byte	0x12682
+	.4byte	0x126f2
 	.byte	0
 	.uleb128 0x7d
 	.string	"__u"
-	.byte	0x10
+	.byte	0xf
 	.byte	0x1c
-	.4byte	0x14bb5
+	.4byte	0x14c2c
 	.byte	0
 	.byte	0
-	.uleb128 0x82
-	.4byte	.LASF3339
+	.uleb128 0x83
+	.4byte	.LASF3342
 	.byte	0x20
 	.2byte	0x126
 	.byte	0x3
 	.uleb128 0x7e
-	.4byte	.LASF3259
+	.4byte	.LASF3261
 	.byte	0xce
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14c05
+	.4byte	0x14c7c
 	.uleb128 0x7f
 	.string	"n"
 	.byte	0xce
@@ -48930,12 +49073,12 @@ __exitcall_ebc_exit:
 	.4byte	0x15a
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3260
+	.4byte	.LASF3262
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xe2
 	.byte	0x3
-	.4byte	0x14c39
+	.4byte	0x14cb0
 	.uleb128 0x80
 	.4byte	.LASF2470
 	.byte	0x8
@@ -48953,12 +49096,12 @@ __exitcall_ebc_exit:
 	.4byte	0x8b
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3261
+	.4byte	.LASF3263
 	.byte	0xcf
 	.byte	0x50
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x14c53
+	.4byte	0x14cca
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xcf
@@ -48966,28 +49109,28 @@ __exitcall_ebc_exit:
 	.4byte	0xbd30
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3262
+	.4byte	.LASF3264
 	.byte	0xd0
 	.byte	0xb8
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x14c6d
+	.4byte	0x14ce4
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd0
 	.byte	0xb8
-	.4byte	0x14c6d
+	.4byte	0x14ce4
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xdd
 	.uleb128 0x7e
-	.4byte	.LASF3263
+	.4byte	.LASF3265
 	.byte	0xd0
 	.byte	0x39
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x14c8f
+	.4byte	0x14d06
 	.uleb128 0x7f
 	.string	"val"
 	.byte	0xd0
@@ -48995,12 +49138,12 @@ __exitcall_ebc_exit:
 	.4byte	0xd2
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3264
+	.4byte	.LASF3266
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14cb6
+	.4byte	0x14d2d
 	.uleb128 0x7f
 	.string	"nr"
 	.byte	0x7
@@ -49010,48 +49153,48 @@ __exitcall_ebc_exit:
 	.4byte	.LASF1164
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x14cb6
+	.4byte	0x14d2d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x3a
 	.uleb128 0x81
-	.4byte	.LASF3265
-	.byte	0x11
+	.4byte	.LASF3267
+	.byte	0x10
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x14cf0
+	.4byte	0x14d67
 	.uleb128 0x7f
 	.string	"i"
-	.byte	0x11
+	.byte	0x10
 	.byte	0x2f
 	.4byte	0xc6
 	.uleb128 0x7f
 	.string	"v"
-	.byte	0x11
+	.byte	0x10
 	.byte	0x2f
-	.4byte	0x14cf0
+	.4byte	0x14d67
 	.uleb128 0x7d
 	.string	"w0"
-	.byte	0x11
+	.byte	0x10
 	.byte	0x2f
 	.4byte	0xc6
 	.uleb128 0x7d
 	.string	"x1"
-	.byte	0x11
+	.byte	0x10
 	.byte	0x2f
-	.4byte	0x14cf0
+	.4byte	0x14d67
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x37c
 	.uleb128 0x7e
-	.4byte	.LASF3266
+	.4byte	.LASF3268
 	.byte	0xd1
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14d10
+	.4byte	0x14d87
 	.uleb128 0x7f
 	.string	"x"
 	.byte	0xd1
@@ -49059,12 +49202,12 @@ __exitcall_ebc_exit:
 	.4byte	0xf4
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3267
+	.4byte	.LASF3269
 	.byte	0xd2
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14d2d
+	.4byte	0x14da4
 	.uleb128 0x80
 	.4byte	.LASF2503
 	.byte	0xd2
@@ -49072,16 +49215,16 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3268
+	.4byte	.LASF3270
 	.byte	0xd3
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x14d50
+	.4byte	0x14dc7
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd3
 	.byte	0xb
-	.4byte	0x14d50
+	.4byte	0x14dc7
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xd3
@@ -49090,21 +49233,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x14d58
-	.uleb128 0x83
+	.4byte	0x14dcf
+	.uleb128 0x84
 	.uleb128 0x3
-	.4byte	0x14d56
+	.4byte	0x14dcd
 	.uleb128 0x81
-	.4byte	.LASF3269
+	.4byte	.LASF3271
 	.byte	0xd3
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x14d80
+	.4byte	0x14df7
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd3
 	.byte	0x9
-	.4byte	0x14d50
+	.4byte	0x14dc7
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xd3
@@ -49112,601 +49255,601 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3270
-	.byte	0xc
+	.4byte	.LASF3272
+	.byte	0xe
 	.2byte	0x11a
 	.byte	0x3
-	.4byte	0x14db0
+	.4byte	0x14e27
 	.uleb128 0x65
 	.string	"p"
-	.byte	0xc
+	.byte	0xe
 	.2byte	0x11a
-	.4byte	0x14db0
+	.4byte	0x14e27
 	.uleb128 0x65
 	.string	"res"
-	.byte	0xc
+	.byte	0xe
 	.2byte	0x11a
 	.4byte	0x458
 	.uleb128 0x66
 	.4byte	.LASF1001
-	.byte	0xc
+	.byte	0xe
 	.2byte	0x11a
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x14d56
-	.uleb128 0x84
+	.4byte	0x14dcd
+	.uleb128 0x85
 	.4byte	0x103dd
-	.8byte	.LFB2845
-	.8byte	.LFE2845-.LFB2845
+	.8byte	.LFB2846
+	.8byte	.LFE2846-.LFB2846
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14de3
+	.4byte	0x14e5a
 	.uleb128 0x70
 	.4byte	0x103ee
-	.4byte	.LLST12
+	.4byte	.LLST10
 	.uleb128 0x72
 	.4byte	0x103fa
 	.uleb128 0x1
 	.byte	0x51
 	.byte	0
-	.uleb128 0x85
-	.4byte	0x12864
-	.8byte	.LFB2877
-	.8byte	.LFE2877-.LFB2877
+	.uleb128 0x86
+	.4byte	0x128d4
+	.8byte	.LFB2878
+	.8byte	.LFE2878-.LFB2878
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14ee6
+	.4byte	0x14f5d
 	.uleb128 0x70
-	.4byte	0x12871
-	.4byte	.LLST190
+	.4byte	0x128e1
+	.4byte	.LLST188
 	.uleb128 0x55
-	.4byte	0x1287d
+	.4byte	0x128ed
 	.uleb128 0x58
-	.4byte	0x12889
+	.4byte	0x128f9
 	.uleb128 0x5c
-	.4byte	0x14436
-	.8byte	.LBB1444
+	.4byte	0x144a0
+	.8byte	.LBB1446
 	.4byte	.Ldebug_ranges0+0xbf0
 	.byte	0x1
 	.2byte	0x585
-	.4byte	0x14e64
+	.4byte	0x14edb
 	.uleb128 0x55
-	.4byte	0x14467
+	.4byte	0x144d1
 	.uleb128 0x55
-	.4byte	0x1445b
+	.4byte	0x144c5
 	.uleb128 0x55
-	.4byte	0x1444f
+	.4byte	0x144b9
 	.uleb128 0x55
-	.4byte	0x14443
+	.4byte	0x144ad
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xbf0
 	.uleb128 0x58
-	.4byte	0x14473
+	.4byte	0x144dd
 	.uleb128 0x60
-	.4byte	0x14480
-	.8byte	.LBB1446
+	.4byte	0x144ea
+	.8byte	.LBB1448
 	.4byte	.Ldebug_ranges0+0xc40
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x55
-	.4byte	0x14491
+	.4byte	0x144fb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x143a9
-	.8byte	.LBB1455
+	.4byte	0x14413
+	.8byte	.LBB1457
 	.4byte	.Ldebug_ranges0+0xc70
 	.byte	0x1
 	.2byte	0x586
-	.4byte	0x14e96
+	.4byte	0x14f0d
 	.uleb128 0x55
-	.4byte	0x143e6
+	.4byte	0x14450
 	.uleb128 0x55
-	.4byte	0x143da
+	.4byte	0x14444
 	.uleb128 0x55
-	.4byte	0x143ce
+	.4byte	0x14438
 	.uleb128 0x55
-	.4byte	0x143c2
+	.4byte	0x1442c
 	.uleb128 0x55
-	.4byte	0x143b6
+	.4byte	0x14420
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14377
-	.8byte	.LBB1461
-	.8byte	.LBE1461-.LBB1461
+	.4byte	0x143e1
+	.8byte	.LBB1463
+	.8byte	.LBE1463-.LBB1463
 	.byte	0x1
 	.2byte	0x587
-	.4byte	0x14ec2
+	.4byte	0x14f39
 	.uleb128 0x55
-	.4byte	0x1439c
+	.4byte	0x14406
 	.uleb128 0x55
-	.4byte	0x14390
+	.4byte	0x143fa
 	.uleb128 0x55
-	.4byte	0x14384
+	.4byte	0x143ee
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x14351
-	.8byte	.LBB1463
-	.8byte	.LBE1463-.LBB1463
+	.4byte	0x143bb
+	.8byte	.LBB1465
+	.8byte	.LBE1465-.LBB1465
 	.byte	0x1
 	.2byte	0x588
 	.uleb128 0x55
-	.4byte	0x1436a
+	.4byte	0x143d4
 	.uleb128 0x55
-	.4byte	0x1435e
+	.4byte	0x143c8
 	.byte	0
 	.byte	0
-	.uleb128 0x85
-	.4byte	0x1421e
-	.8byte	.LFB2878
-	.8byte	.LFE2878-.LFB2878
+	.uleb128 0x86
+	.4byte	0x14288
+	.8byte	.LFB2880
+	.8byte	.LFE2880-.LFB2880
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14fa4
+	.4byte	0x1501b
 	.uleb128 0x70
-	.4byte	0x1422e
-	.4byte	.LLST193
+	.4byte	0x14298
+	.4byte	.LLST190
 	.uleb128 0x70
-	.4byte	0x14239
-	.4byte	.LLST194
+	.4byte	0x142a3
+	.4byte	.LLST191
 	.uleb128 0x58
-	.4byte	0x14245
+	.4byte	0x142af
 	.uleb128 0x71
-	.4byte	0x143f3
-	.8byte	.LBB1487
-	.8byte	.LBE1487-.LBB1487
+	.4byte	0x1445d
+	.8byte	.LBB1476
+	.8byte	.LBE1476-.LBB1476
 	.byte	0x1
 	.byte	0xc9
-	.4byte	0x14f3a
+	.4byte	0x14fb1
 	.uleb128 0x55
-	.4byte	0x14400
+	.4byte	0x1446a
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x1458b
-	.8byte	.LBB1489
-	.8byte	.LBE1489-.LBB1489
+	.4byte	0x145f5
+	.8byte	.LBB1478
+	.8byte	.LBE1478-.LBB1478
 	.byte	0x1
 	.byte	0xca
-	.4byte	0x14f5b
+	.4byte	0x14fd2
 	.uleb128 0x55
-	.4byte	0x14598
+	.4byte	0x14602
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x145bf
-	.8byte	.LBB1491
-	.8byte	.LBE1491-.LBB1491
+	.4byte	0x14636
+	.8byte	.LBB1480
+	.8byte	.LBE1480-.LBB1480
 	.byte	0x1
 	.byte	0xcd
-	.4byte	0x14f89
+	.4byte	0x15000
 	.uleb128 0x55
-	.4byte	0x145cc
+	.4byte	0x14643
 	.uleb128 0x4f
-	.8byte	.LVL600
-	.4byte	0x1535a
+	.8byte	.LVL581
+	.4byte	0x153d1
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL597
-	.4byte	0x150cf
+	.8byte	.LVL578
+	.4byte	0x15146
 	.uleb128 0x4f
-	.8byte	.LVL601
-	.4byte	0x150cf
+	.8byte	.LVL582
+	.4byte	0x15146
 	.byte	0
-	.uleb128 0x84
-	.4byte	0x1223e
-	.8byte	.LFB2880
-	.8byte	.LFE2880-.LFB2880
+	.uleb128 0x85
+	.4byte	0x12277
+	.8byte	.LFB2882
+	.8byte	.LFE2882-.LFB2882
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x15005
+	.4byte	0x1507c
 	.uleb128 0x55
-	.4byte	0x1225b
+	.4byte	0x12294
 	.uleb128 0x55
-	.4byte	0x1224f
+	.4byte	0x12288
 	.uleb128 0x55
-	.4byte	0x1224f
+	.4byte	0x12288
 	.uleb128 0x58
-	.4byte	0x12267
+	.4byte	0x122a0
 	.uleb128 0x58
-	.4byte	0x12271
+	.4byte	0x122aa
 	.uleb128 0x58
-	.4byte	0x1227d
+	.4byte	0x122b6
 	.uleb128 0x61
-	.4byte	0x12289
-	.4byte	.LLST196
+	.4byte	0x122c2
+	.4byte	.LLST193
 	.uleb128 0x62
-	.4byte	0x12295
+	.4byte	0x122ce
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x122a1
-	.4byte	.LLST197
+	.4byte	0x122da
+	.4byte	.LLST194
 	.uleb128 0x4f
-	.8byte	.LVL611
-	.4byte	0x153d1
+	.8byte	.LVL592
+	.4byte	0x15448
 	.byte	0
-	.uleb128 0x85
-	.4byte	0x1421e
-	.8byte	.LFB2884
-	.8byte	.LFE2884-.LFB2884
+	.uleb128 0x86
+	.4byte	0x14288
+	.8byte	.LFB2886
+	.8byte	.LFE2886-.LFB2886
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x150b7
+	.4byte	0x1512e
 	.uleb128 0x70
-	.4byte	0x1422e
-	.4byte	.LLST223
+	.4byte	0x14298
+	.4byte	.LLST220
 	.uleb128 0x58
-	.4byte	0x14245
+	.4byte	0x142af
 	.uleb128 0x55
-	.4byte	0x14239
+	.4byte	0x142a3
 	.uleb128 0x71
-	.4byte	0x145a5
-	.8byte	.LBB1814
-	.8byte	.LBE1814-.LBB1814
+	.4byte	0x1460f
+	.8byte	.LBB1803
+	.8byte	.LBE1803-.LBB1803
 	.byte	0x1
 	.byte	0xc2
-	.4byte	0x15055
+	.4byte	0x150cc
 	.uleb128 0x55
-	.4byte	0x145b2
+	.4byte	0x1461c
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x1440d
-	.8byte	.LBB1816
-	.8byte	.LBE1816-.LBB1816
+	.4byte	0x14477
+	.8byte	.LBB1805
+	.8byte	.LBE1805-.LBB1805
 	.byte	0x1
 	.byte	0xc3
-	.4byte	0x1507b
+	.4byte	0x150f2
 	.uleb128 0x55
-	.4byte	0x14429
+	.4byte	0x14493
 	.uleb128 0x55
-	.4byte	0x1441d
+	.4byte	0x14487
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x145df
-	.8byte	.LBB1818
-	.8byte	.LBE1818-.LBB1818
+	.4byte	0x14656
+	.8byte	.LBB1807
+	.8byte	.LBE1807-.LBB1807
 	.byte	0x1
 	.byte	0xbf
-	.4byte	0x150a9
+	.4byte	0x15120
 	.uleb128 0x55
-	.4byte	0x145ec
+	.4byte	0x14663
 	.uleb128 0x4f
-	.8byte	.LVL803
-	.4byte	0x153dd
+	.8byte	.LVL784
+	.4byte	0x15454
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL800
-	.4byte	0x150cf
+	.8byte	.LVL781
+	.4byte	0x15146
 	.byte	0
-	.uleb128 0x86
-	.4byte	.LASF3271
-	.4byte	.LASF3271
-	.byte	0xbe
-	.byte	0xcc
-	.uleb128 0x86
-	.4byte	.LASF3272
-	.4byte	.LASF3272
-	.byte	0xbe
-	.byte	0xca
 	.uleb128 0x87
 	.4byte	.LASF3273
 	.4byte	.LASF3273
-	.byte	0x2
-	.2byte	0x5d1
-	.uleb128 0x86
+	.byte	0xbe
+	.byte	0xcc
+	.uleb128 0x87
 	.4byte	.LASF3274
 	.4byte	.LASF3274
-	.byte	0xac
-	.byte	0x4f
-	.uleb128 0x87
+	.byte	0xbe
+	.byte	0xca
+	.uleb128 0x88
 	.4byte	.LASF3275
 	.4byte	.LASF3275
 	.byte	0x2
-	.2byte	0x2bf
+	.2byte	0x5d1
 	.uleb128 0x87
 	.4byte	.LASF3276
 	.4byte	.LASF3276
-	.byte	0xe
-	.2byte	0x149
-	.uleb128 0x87
+	.byte	0xac
+	.byte	0x4f
+	.uleb128 0x88
 	.4byte	.LASF3277
 	.4byte	.LASF3277
-	.byte	0xe
-	.2byte	0x172
-	.uleb128 0x86
-	.4byte	.LASF3278
+	.byte	0x2
+	.2byte	0x2bf
+	.uleb128 0x88
 	.4byte	.LASF3278
-	.byte	0xd4
-	.byte	0x78
-	.uleb128 0x86
+	.4byte	.LASF3278
+	.byte	0xc
+	.2byte	0x149
+	.uleb128 0x88
 	.4byte	.LASF3279
 	.4byte	.LASF3279
-	.byte	0xaa
-	.byte	0x59
-	.uleb128 0x86
+	.byte	0xc
+	.2byte	0x172
+	.uleb128 0x87
 	.4byte	.LASF3280
 	.4byte	.LASF3280
-	.byte	0xc3
-	.byte	0x31
-	.uleb128 0x88
-	.4byte	.LASF3281
-	.4byte	.LASF3281
-	.uleb128 0x86
+	.byte	0xd4
+	.byte	0x78
+	.uleb128 0x87
 	.4byte	.LASF3281
 	.4byte	.LASF3281
-	.byte	0xd5
-	.byte	0x36
+	.byte	0xaa
+	.byte	0x59
 	.uleb128 0x87
 	.4byte	.LASF3282
 	.4byte	.LASF3282
-	.byte	0x2
-	.2byte	0x5cb
-	.uleb128 0x86
+	.byte	0xc3
+	.byte	0x31
+	.uleb128 0x89
 	.4byte	.LASF3283
 	.4byte	.LASF3283
-	.byte	0xc2
-	.byte	0x30
-	.uleb128 0x86
+	.uleb128 0x87
+	.4byte	.LASF3283
+	.4byte	.LASF3283
+	.byte	0xd5
+	.byte	0x36
+	.uleb128 0x88
 	.4byte	.LASF3284
 	.4byte	.LASF3284
-	.byte	0xc2
-	.byte	0x31
-	.uleb128 0x86
+	.byte	0x2
+	.2byte	0x5cb
+	.uleb128 0x87
 	.4byte	.LASF3285
 	.4byte	.LASF3285
-	.byte	0xab
-	.byte	0x9
+	.byte	0xc2
+	.byte	0x30
 	.uleb128 0x87
 	.4byte	.LASF3286
 	.4byte	.LASF3286
-	.byte	0x48
-	.2byte	0x6b8
+	.byte	0xc2
+	.byte	0x31
 	.uleb128 0x87
 	.4byte	.LASF3287
 	.4byte	.LASF3287
-	.byte	0xd
-	.2byte	0x190
-	.uleb128 0x87
+	.byte	0xab
+	.byte	0x9
+	.uleb128 0x88
 	.4byte	.LASF3288
 	.4byte	.LASF3288
 	.byte	0x48
-	.2byte	0x676
-	.uleb128 0x86
+	.2byte	0x6b8
+	.uleb128 0x88
 	.4byte	.LASF3289
 	.4byte	.LASF3289
-	.byte	0x9c
-	.byte	0x67
-	.uleb128 0x86
+	.byte	0x12
+	.2byte	0x190
+	.uleb128 0x88
 	.4byte	.LASF3290
 	.4byte	.LASF3290
-	.byte	0x54
-	.byte	0x53
-	.uleb128 0x86
+	.byte	0x48
+	.2byte	0x676
+	.uleb128 0x87
 	.4byte	.LASF3291
 	.4byte	.LASF3291
-	.byte	0x54
-	.byte	0xa5
-	.uleb128 0x86
+	.byte	0x9c
+	.byte	0x67
+	.uleb128 0x87
 	.4byte	.LASF3292
 	.4byte	.LASF3292
-	.byte	0xc3
-	.byte	0x2c
-	.uleb128 0x86
+	.byte	0x54
+	.byte	0x53
+	.uleb128 0x87
 	.4byte	.LASF3293
 	.4byte	.LASF3293
-	.byte	0xc3
-	.byte	0x28
+	.byte	0x54
+	.byte	0xa5
 	.uleb128 0x87
 	.4byte	.LASF3294
 	.4byte	.LASF3294
-	.byte	0x12
-	.2byte	0x184
-	.uleb128 0x86
+	.byte	0xc3
+	.byte	0x2c
+	.uleb128 0x87
 	.4byte	.LASF3295
 	.4byte	.LASF3295
-	.byte	0xd6
-	.byte	0x51
-	.uleb128 0x87
+	.byte	0xc3
+	.byte	0x28
+	.uleb128 0x88
 	.4byte	.LASF3296
 	.4byte	.LASF3296
-	.byte	0x20
-	.2byte	0x1d9
-	.uleb128 0x86
+	.byte	0x11
+	.2byte	0x184
+	.uleb128 0x87
 	.4byte	.LASF3297
 	.4byte	.LASF3297
-	.byte	0x3
-	.byte	0x3b
-	.uleb128 0x86
+	.byte	0xd6
+	.byte	0x51
+	.uleb128 0x88
 	.4byte	.LASF3298
 	.4byte	.LASF3298
-	.byte	0x12
-	.byte	0xb9
-	.uleb128 0x86
+	.byte	0x20
+	.2byte	0x1d9
+	.uleb128 0x87
 	.4byte	.LASF3299
 	.4byte	.LASF3299
-	.byte	0x3a
-	.byte	0xc2
-	.uleb128 0x88
+	.byte	0x3
+	.byte	0x3b
+	.uleb128 0x87
 	.4byte	.LASF3300
 	.4byte	.LASF3300
-	.uleb128 0x86
+	.byte	0x11
+	.byte	0xb9
+	.uleb128 0x87
 	.4byte	.LASF3301
 	.4byte	.LASF3301
-	.byte	0xac
-	.byte	0x4e
-	.uleb128 0x87
+	.byte	0x3a
+	.byte	0xc2
+	.uleb128 0x89
 	.4byte	.LASF3302
 	.4byte	.LASF3302
-	.byte	0x2
-	.2byte	0x287
-	.uleb128 0x86
+	.uleb128 0x87
 	.4byte	.LASF3303
 	.4byte	.LASF3303
-	.byte	0xbf
-	.byte	0x38
-	.uleb128 0x87
+	.byte	0xac
+	.byte	0x4e
+	.uleb128 0x88
 	.4byte	.LASF3304
 	.4byte	.LASF3304
-	.byte	0xe
-	.2byte	0x165
+	.byte	0x2
+	.2byte	0x287
 	.uleb128 0x87
 	.4byte	.LASF3305
 	.4byte	.LASF3305
-	.byte	0xa3
-	.2byte	0x37b
-	.uleb128 0x87
+	.byte	0xbf
+	.byte	0x38
+	.uleb128 0x88
 	.4byte	.LASF3306
 	.4byte	.LASF3306
-	.byte	0xe
-	.2byte	0x125
+	.byte	0xc
+	.2byte	0x165
 	.uleb128 0x88
 	.4byte	.LASF3307
 	.4byte	.LASF3307
-	.uleb128 0x86
+	.byte	0xa3
+	.2byte	0x37b
+	.uleb128 0x88
 	.4byte	.LASF3308
 	.4byte	.LASF3308
-	.byte	0xc3
-	.byte	0x2f
-	.uleb128 0x87
+	.byte	0xc
+	.2byte	0x125
+	.uleb128 0x89
 	.4byte	.LASF3309
 	.4byte	.LASF3309
-	.byte	0x20
-	.2byte	0x1c7
 	.uleb128 0x87
 	.4byte	.LASF3310
 	.4byte	.LASF3310
-	.byte	0x20
-	.2byte	0x17e
-	.uleb128 0x86
+	.byte	0xc3
+	.byte	0x2f
+	.uleb128 0x88
 	.4byte	.LASF3311
 	.4byte	.LASF3311
-	.byte	0x3
-	.byte	0x3a
-	.uleb128 0x86
+	.byte	0x20
+	.2byte	0x1c7
+	.uleb128 0x88
 	.4byte	.LASF3312
 	.4byte	.LASF3312
-	.byte	0xc2
-	.byte	0x32
+	.byte	0x20
+	.2byte	0x17e
 	.uleb128 0x87
 	.4byte	.LASF3313
 	.4byte	.LASF3313
-	.byte	0x76
-	.2byte	0xa0a
-	.uleb128 0x86
+	.byte	0x3
+	.byte	0x3a
+	.uleb128 0x87
 	.4byte	.LASF3314
 	.4byte	.LASF3314
-	.byte	0xc3
-	.byte	0x2d
-	.uleb128 0x86
+	.byte	0xc2
+	.byte	0x32
+	.uleb128 0x88
 	.4byte	.LASF3315
 	.4byte	.LASF3315
-	.byte	0x48
-	.byte	0xdc
+	.byte	0x76
+	.2byte	0xa0a
 	.uleb128 0x87
 	.4byte	.LASF3316
 	.4byte	.LASF3316
-	.byte	0x3a
-	.2byte	0x459
-	.uleb128 0x86
+	.byte	0xc3
+	.byte	0x2d
+	.uleb128 0x87
 	.4byte	.LASF3317
 	.4byte	.LASF3317
-	.byte	0x3a
-	.byte	0xe9
-	.uleb128 0x87
+	.byte	0x48
+	.byte	0xdc
+	.uleb128 0x88
 	.4byte	.LASF3318
 	.4byte	.LASF3318
 	.byte	0x3a
-	.2byte	0x45a
+	.2byte	0x459
 	.uleb128 0x87
 	.4byte	.LASF3319
 	.4byte	.LASF3319
-	.byte	0x6
-	.2byte	0x19f
-	.uleb128 0x87
+	.byte	0x3a
+	.byte	0xe9
+	.uleb128 0x88
 	.4byte	.LASF3320
 	.4byte	.LASF3320
-	.byte	0x6
-	.2byte	0x199
-	.uleb128 0x86
+	.byte	0x3a
+	.2byte	0x45a
+	.uleb128 0x88
 	.4byte	.LASF3321
 	.4byte	.LASF3321
-	.byte	0xc3
-	.byte	0x26
-	.uleb128 0x86
+	.byte	0x6
+	.2byte	0x19f
+	.uleb128 0x88
 	.4byte	.LASF3322
 	.4byte	.LASF3322
-	.byte	0xc3
-	.byte	0x2b
-	.uleb128 0x86
+	.byte	0x6
+	.2byte	0x199
+	.uleb128 0x87
 	.4byte	.LASF3323
 	.4byte	.LASF3323
 	.byte	0xc3
-	.byte	0x25
-	.uleb128 0x86
+	.byte	0x26
+	.uleb128 0x87
 	.4byte	.LASF3324
 	.4byte	.LASF3324
 	.byte	0xc3
-	.byte	0x24
-	.uleb128 0x86
+	.byte	0x2b
+	.uleb128 0x87
 	.4byte	.LASF3325
 	.4byte	.LASF3325
-	.byte	0x9c
-	.byte	0x73
-	.uleb128 0x86
+	.byte	0xc3
+	.byte	0x25
+	.uleb128 0x87
 	.4byte	.LASF3326
 	.4byte	.LASF3326
 	.byte	0xc3
-	.byte	0x2a
-	.uleb128 0x86
+	.byte	0x24
+	.uleb128 0x87
 	.4byte	.LASF3327
 	.4byte	.LASF3327
-	.byte	0xc3
-	.byte	0x27
-	.uleb128 0x86
+	.byte	0x9c
+	.byte	0x73
+	.uleb128 0x87
 	.4byte	.LASF3328
 	.4byte	.LASF3328
-	.byte	0x72
-	.byte	0x88
-	.uleb128 0x86
+	.byte	0xc3
+	.byte	0x2a
+	.uleb128 0x87
 	.4byte	.LASF3329
 	.4byte	.LASF3329
-	.byte	0x72
-	.byte	0x98
-	.uleb128 0x86
+	.byte	0xc3
+	.byte	0x27
+	.uleb128 0x87
 	.4byte	.LASF3330
 	.4byte	.LASF3330
-	.byte	0xc4
-	.byte	0x6e
-	.uleb128 0x86
+	.byte	0x72
+	.byte	0x88
+	.uleb128 0x87
 	.4byte	.LASF3331
 	.4byte	.LASF3331
-	.byte	0xc2
-	.byte	0x33
+	.byte	0x72
+	.byte	0x98
 	.uleb128 0x87
 	.4byte	.LASF3332
 	.4byte	.LASF3332
-	.byte	0xd
+	.byte	0xc4
+	.byte	0x6e
+	.uleb128 0x87
+	.4byte	.LASF3333
+	.4byte	.LASF3333
+	.byte	0xc2
+	.byte	0x33
+	.uleb128 0x88
+	.4byte	.LASF3334
+	.4byte	.LASF3334
+	.byte	0x12
 	.2byte	0x1d6
-	.uleb128 0x89
+	.uleb128 0x8a
 	.string	"up"
 	.string	"up"
 	.byte	0x78
 	.byte	0x2c
-	.uleb128 0x86
-	.4byte	.LASF3333
-	.4byte	.LASF3333
+	.uleb128 0x87
+	.4byte	.LASF3335
+	.4byte	.LASF3335
 	.byte	0x78
 	.byte	0x27
-	.uleb128 0x86
-	.4byte	.LASF3334
-	.4byte	.LASF3334
+	.uleb128 0x87
+	.4byte	.LASF3336
+	.4byte	.LASF3336
 	.byte	0x1e
 	.byte	0xb0
-	.uleb128 0x86
-	.4byte	.LASF3335
-	.4byte	.LASF3335
+	.uleb128 0x87
+	.4byte	.LASF3337
+	.4byte	.LASF3337
 	.byte	0x9c
 	.byte	0x71
 	.byte	0
@@ -51429,19 +51572,36 @@ __exitcall_ebc_exit:
 	.uleb128 0x3a
 	.uleb128 0xb
 	.uleb128 0x3b
-	.uleb128 0x5
+	.uleb128 0xb
 	.uleb128 0x27
 	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
 	.uleb128 0x20
 	.uleb128 0xb
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.uleb128 0x35
+	.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 0x84
+	.uleb128 0x35
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x85
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x31
@@ -51458,7 +51618,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x85
+	.uleb128 0x86
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x31
@@ -51475,7 +51635,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x86
+	.uleb128 0x87
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -51492,7 +51652,7 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x87
+	.uleb128 0x88
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -51509,7 +51669,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x5
 	.byte	0
 	.byte	0
-	.uleb128 0x88
+	.uleb128 0x89
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -51522,7 +51682,7 @@ __exitcall_ebc_exit:
 	.uleb128 0xe
 	.byte	0
 	.byte	0
-	.uleb128 0x89
+	.uleb128 0x8a
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -51542,2529 +51702,2544 @@ __exitcall_ebc_exit:
 	.byte	0
 	.section	.debug_loc,"",@progbits
 .Ldebug_loc0:
-.LLST13:
-	.8byte	.LVL67
-	.8byte	.LVL68
+.LLST11:
+	.8byte	.LVL65
+	.8byte	.LVL66
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST195:
-	.8byte	.LVL603
-	.8byte	.LVL604
+.LLST192:
+	.8byte	.LVL584
+	.8byte	.LVL585
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST15:
-	.8byte	.LVL74
-	.8byte	.LVL75
+.LLST13:
+	.8byte	.LVL72
+	.8byte	.LVL73
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST198:
-	.8byte	.LVL612
-	.8byte	.LVL613
+.LLST195:
+	.8byte	.LVL593
+	.8byte	.LVL594
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST199:
-	.8byte	.LVL616
-	.8byte	.LVL617
+.LLST196:
+	.8byte	.LVL597
+	.8byte	.LVL598
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL628
-	.8byte	.LVL629
+	.8byte	.LVL609
+	.8byte	.LVL610
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL760
-	.8byte	.LVL761
+	.8byte	.LVL741
+	.8byte	.LVL742
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST200:
-	.8byte	.LVL624
-	.8byte	.LVL625
+.LLST197:
+	.8byte	.LVL605
+	.8byte	.LVL606
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL673
-	.8byte	.LVL674
+	.8byte	.LVL654
+	.8byte	.LVL655
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST201:
-	.8byte	.LVL628
-	.8byte	.LVL630
+.LLST198:
+	.8byte	.LVL609
+	.8byte	.LVL611
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL637
-	.8byte	.LVL673
+	.8byte	.LVL618
+	.8byte	.LVL654
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL678
-	.8byte	.LVL760
+	.8byte	.LVL659
+	.8byte	.LVL741
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL761
-	.8byte	.LVL766
+	.8byte	.LVL742
+	.8byte	.LVL747
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL769
-	.8byte	.LVL780
+	.8byte	.LVL750
+	.8byte	.LVL761
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL782
-	.8byte	.LFE2860
+	.8byte	.LVL763
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST202:
-	.8byte	.LVL619
-	.8byte	.LVL631
+.LLST199:
+	.8byte	.LVL600
+	.8byte	.LVL612
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL635
-	.8byte	.LVL638
+	.8byte	.LVL616
+	.8byte	.LVL619
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL673
-	.8byte	.LVL678
+	.8byte	.LVL654
+	.8byte	.LVL659
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL767
-	.8byte	.LVL769
+	.8byte	.LVL748
+	.8byte	.LVL750
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL794
-	.8byte	.LFE2860
+	.8byte	.LVL775
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST203:
-	.8byte	.LVL619
-	.8byte	.LVL620
+.LLST200:
+	.8byte	.LVL600
+	.8byte	.LVL601
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL620
-	.8byte	.LVL621
+	.8byte	.LVL601
+	.8byte	.LVL602
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL622
-	.8byte	.LVL626
+	.8byte	.LVL603
+	.8byte	.LVL607
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL626
-	.8byte	.LVL676
+	.8byte	.LVL607
+	.8byte	.LVL657
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL676
-	.8byte	.LVL760
+	.8byte	.LVL657
+	.8byte	.LVL741
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL761
-	.8byte	.LVL766
+	.8byte	.LVL742
+	.8byte	.LVL747
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL767
-	.8byte	.LVL780
+	.8byte	.LVL748
+	.8byte	.LVL761
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL782
-	.8byte	.LFE2860
+	.8byte	.LVL763
+	.8byte	.LFE2861
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
 	.8byte	0
 	.8byte	0
-.LLST204:
-	.8byte	.LVL623
-	.8byte	.LVL630
+.LLST201:
+	.8byte	.LVL604
+	.8byte	.LVL611
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL635
-	.8byte	.LVL637
+	.8byte	.LVL616
+	.8byte	.LVL618
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL673
-	.8byte	.LVL678
+	.8byte	.LVL654
+	.8byte	.LVL659
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL794
-	.8byte	.LFE2860
+	.8byte	.LVL775
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST205:
-	.8byte	.LVL628
-	.8byte	.LVL633
+.LLST202:
+	.8byte	.LVL609
+	.8byte	.LVL614
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL659
-	.8byte	.LVL667
+	.8byte	.LVL640
+	.8byte	.LVL648
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL678
-	.8byte	.LVL681
+	.8byte	.LVL659
+	.8byte	.LVL662
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL773
-	.8byte	.LVL774
+	.8byte	.LVL754
+	.8byte	.LVL755
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL782
-	.8byte	.LVL783
+	.8byte	.LVL763
+	.8byte	.LVL764
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL794
-	.8byte	.LFE2860
+	.8byte	.LVL775
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST206:
-	.8byte	.LVL628
-	.8byte	.LVL633
+.LLST203:
+	.8byte	.LVL609
+	.8byte	.LVL614
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL667
-	.8byte	.LVL671
+	.8byte	.LVL648
+	.8byte	.LVL652
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL681
-	.8byte	.LVL682
+	.8byte	.LVL662
+	.8byte	.LVL663
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL783
-	.8byte	.LVL784
+	.8byte	.LVL764
+	.8byte	.LVL765
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL794
-	.8byte	.LFE2860
+	.8byte	.LVL775
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST207:
-	.8byte	.LVL682
-	.8byte	.LVL683-1
+.LLST204:
+	.8byte	.LVL663
+	.8byte	.LVL664-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST208:
-	.8byte	.LVL688
-	.8byte	.LVL691
+.LLST205:
+	.8byte	.LVL669
+	.8byte	.LVL672
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST209:
-	.8byte	.LVL689
-	.8byte	.LVL690
+.LLST206:
+	.8byte	.LVL670
+	.8byte	.LVL671
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST210:
-	.8byte	.LVL628
-	.8byte	.LVL632
+.LLST207:
+	.8byte	.LVL609
+	.8byte	.LVL613
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL693
-	.8byte	.LVL701
+	.8byte	.LVL674
+	.8byte	.LVL682
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL775
-	.8byte	.LVL777
+	.8byte	.LVL756
+	.8byte	.LVL758
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL777
-	.8byte	.LVL778
+	.8byte	.LVL758
+	.8byte	.LVL759
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL778
-	.8byte	.LVL780
+	.8byte	.LVL759
+	.8byte	.LVL761
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL794
-	.8byte	.LFE2860
+	.8byte	.LVL775
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST211:
-	.8byte	.LVL696
-	.8byte	.LVL699
+.LLST208:
+	.8byte	.LVL677
+	.8byte	.LVL680
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST212:
-	.8byte	.LVL697
-	.8byte	.LVL698
+.LLST209:
+	.8byte	.LVL678
+	.8byte	.LVL679
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST213:
-	.8byte	.LVL700
-	.8byte	.LVL702-1
+.LLST210:
+	.8byte	.LVL681
+	.8byte	.LVL683-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST214:
-	.8byte	.LVL628
-	.8byte	.LVL635
+.LLST211:
+	.8byte	.LVL609
+	.8byte	.LVL616
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL707
-	.8byte	.LVL745
+	.8byte	.LVL688
+	.8byte	.LVL726
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL745
-	.8byte	.LVL746
+	.8byte	.LVL726
+	.8byte	.LVL727
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL749
-	.8byte	.LVL760
+	.8byte	.LVL730
+	.8byte	.LVL741
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL761
-	.8byte	.LVL766
+	.8byte	.LVL742
+	.8byte	.LVL747
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL788
-	.8byte	.LFE2860
+	.8byte	.LVL769
+	.8byte	.LFE2861
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
 	.8byte	0
 	.8byte	0
-.LLST215:
-	.8byte	.LVL628
-	.8byte	.LVL635
+.LLST212:
+	.8byte	.LVL609
+	.8byte	.LVL616
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL707
-	.8byte	.LVL757
+	.8byte	.LVL688
+	.8byte	.LVL738
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL757
-	.8byte	.LVL758
+	.8byte	.LVL738
+	.8byte	.LVL739
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL761
-	.8byte	.LVL766
+	.8byte	.LVL742
+	.8byte	.LVL747
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL786
-	.8byte	.LFE2860
+	.8byte	.LVL767
+	.8byte	.LFE2861
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
 	.8byte	0
 	.8byte	0
-.LLST216:
-	.8byte	.LVL628
-	.8byte	.LVL632
+.LLST213:
+	.8byte	.LVL609
+	.8byte	.LVL613
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL713
-	.8byte	.LVL724
+	.8byte	.LVL694
+	.8byte	.LVL705
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL728
-	.8byte	.LVL739
+	.8byte	.LVL709
+	.8byte	.LVL720
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL749
-	.8byte	.LVL751
+	.8byte	.LVL730
+	.8byte	.LVL732
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL754
-	.8byte	.LVL760
+	.8byte	.LVL735
+	.8byte	.LVL741
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL787
-	.8byte	.LVL788
+	.8byte	.LVL768
+	.8byte	.LVL769
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL791
-	.8byte	.LFE2860
+	.8byte	.LVL772
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST217:
-	.8byte	.LVL628
-	.8byte	.LVL634
+.LLST214:
+	.8byte	.LVL609
+	.8byte	.LVL615
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL718
-	.8byte	.LVL741
+	.8byte	.LVL699
+	.8byte	.LVL722
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL748
-	.8byte	.LVL760
+	.8byte	.LVL729
+	.8byte	.LVL741
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL761
-	.8byte	.LVL766
+	.8byte	.LVL742
+	.8byte	.LVL747
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL791
-	.8byte	.LFE2860
+	.8byte	.LVL772
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST218:
-	.8byte	.LVL628
-	.8byte	.LVL633
+.LLST215:
+	.8byte	.LVL609
+	.8byte	.LVL614
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL709
-	.8byte	.LVL715
+	.8byte	.LVL690
+	.8byte	.LVL696
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL716
-	.8byte	.LVL719
+	.8byte	.LVL697
+	.8byte	.LVL700
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL728
-	.8byte	.LVL739
+	.8byte	.LVL709
+	.8byte	.LVL720
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL741
-	.8byte	.LVL749
+	.8byte	.LVL722
+	.8byte	.LVL730
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL786
-	.8byte	.LVL791
+	.8byte	.LVL767
+	.8byte	.LVL772
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL794
-	.8byte	.LFE2860
+	.8byte	.LVL775
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST219:
-	.8byte	.LVL628
-	.8byte	.LVL634
+.LLST216:
+	.8byte	.LVL609
+	.8byte	.LVL615
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL711
-	.8byte	.LVL718
+	.8byte	.LVL692
+	.8byte	.LVL699
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL720
-	.8byte	.LVL748
+	.8byte	.LVL701
+	.8byte	.LVL729
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL761
-	.8byte	.LVL766
+	.8byte	.LVL742
+	.8byte	.LVL747
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL786
-	.8byte	.LVL791
+	.8byte	.LVL767
+	.8byte	.LVL772
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL794
-	.8byte	.LFE2860
+	.8byte	.LVL775
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST220:
-	.8byte	.LVL628
-	.8byte	.LVL634
+.LLST217:
+	.8byte	.LVL609
+	.8byte	.LVL615
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL714
-	.8byte	.LVL741
+	.8byte	.LVL695
+	.8byte	.LVL722
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL744
-	.8byte	.LVL760
+	.8byte	.LVL725
+	.8byte	.LVL741
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL761
-	.8byte	.LVL766
+	.8byte	.LVL742
+	.8byte	.LVL747
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL786
-	.8byte	.LVL788
+	.8byte	.LVL767
+	.8byte	.LVL769
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL788
-	.8byte	.LVL789
+	.8byte	.LVL769
+	.8byte	.LVL770
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL789
-	.8byte	.LFE2860
+	.8byte	.LVL770
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x6b
 	.8byte	0
 	.8byte	0
-.LLST221:
-	.8byte	.LVL628
-	.8byte	.LVL633
+.LLST218:
+	.8byte	.LVL609
+	.8byte	.LVL614
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL715
-	.8byte	.LVL741
+	.8byte	.LVL696
+	.8byte	.LVL722
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL749
-	.8byte	.LVL760
+	.8byte	.LVL730
+	.8byte	.LVL741
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL761
-	.8byte	.LVL766
+	.8byte	.LVL742
+	.8byte	.LVL747
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL791
-	.8byte	.LVL792
+	.8byte	.LVL772
+	.8byte	.LVL773
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL792
-	.8byte	.LFE2860
+	.8byte	.LVL773
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST222:
-	.8byte	.LVL628
-	.8byte	.LVL632
+.LLST219:
+	.8byte	.LVL609
+	.8byte	.LVL613
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL724
-	.8byte	.LVL741
+	.8byte	.LVL705
+	.8byte	.LVL722
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL761
-	.8byte	.LVL763
+	.8byte	.LVL742
+	.8byte	.LVL744
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL794
-	.8byte	.LFE2860
+	.8byte	.LVL775
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST80:
-	.8byte	.LVL306
-	.8byte	.LVL307
+.LLST78:
+	.8byte	.LVL304
+	.8byte	.LVL305
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST81:
-	.8byte	.LVL306
-	.8byte	.LVL308-1
+.LLST79:
+	.8byte	.LVL304
+	.8byte	.LVL306-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST82:
-	.8byte	.LVL306
-	.8byte	.LVL308-1
+.LLST80:
+	.8byte	.LVL304
+	.8byte	.LVL306-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST83:
-	.8byte	.LVL309
-	.8byte	.LVL310
+.LLST81:
+	.8byte	.LVL307
+	.8byte	.LVL308
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST84:
+.LLST82:
+	.8byte	.LVL307
 	.8byte	.LVL309
-	.8byte	.LVL311
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST85:
-	.8byte	.LVL309
-	.8byte	.LVL312
+.LLST83:
+	.8byte	.LVL307
+	.8byte	.LVL310
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL312
-	.8byte	.LVL313-1
+	.8byte	.LVL310
+	.8byte	.LVL311-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST86:
-	.8byte	.LVL314
-	.8byte	.LVL315
+.LLST84:
+	.8byte	.LVL312
+	.8byte	.LVL313
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST87:
+.LLST85:
+	.8byte	.LVL312
 	.8byte	.LVL314
-	.8byte	.LVL316
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST88:
-	.8byte	.LVL314
-	.8byte	.LVL317
+.LLST86:
+	.8byte	.LVL312
+	.8byte	.LVL315
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL317
-	.8byte	.LVL318-1
+	.8byte	.LVL315
+	.8byte	.LVL316-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST98:
-	.8byte	.LVL339
-	.8byte	.LVL340
+.LLST96:
+	.8byte	.LVL337
+	.8byte	.LVL338
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST99:
+.LLST97:
+	.8byte	.LVL337
 	.8byte	.LVL339
-	.8byte	.LVL341
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST100:
-	.8byte	.LVL339
-	.8byte	.LVL343
+.LLST98:
+	.8byte	.LVL337
+	.8byte	.LVL341
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL343
-	.8byte	.LVL348
+	.8byte	.LVL341
+	.8byte	.LVL346
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL349
-	.8byte	.LFE2850
+	.8byte	.LVL347
+	.8byte	.LFE2851
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST101:
-	.8byte	.LVL339
-	.8byte	.LVL344-1
+.LLST99:
+	.8byte	.LVL337
+	.8byte	.LVL342-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL344-1
-	.8byte	.LVL347
+	.8byte	.LVL342-1
+	.8byte	.LVL345
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL349
-	.8byte	.LVL350
+	.8byte	.LVL347
+	.8byte	.LVL348
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL352
-	.8byte	.LVL353
+	.8byte	.LVL350
+	.8byte	.LVL351
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST102:
-	.8byte	.LVL342
-	.8byte	.LVL348
+.LLST100:
+	.8byte	.LVL340
+	.8byte	.LVL346
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL349
-	.8byte	.LFE2850
+	.8byte	.LVL347
+	.8byte	.LFE2851
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST103:
-	.8byte	.LVL345
-	.8byte	.LVL349
+.LLST101:
+	.8byte	.LVL343
+	.8byte	.LVL347
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
-	.8byte	.LVL352
-	.8byte	.LFE2850
+	.8byte	.LVL350
+	.8byte	.LFE2851
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
 	.8byte	0
 	.8byte	0
-.LLST89:
-	.8byte	.LVL319
-	.8byte	.LVL320
+.LLST87:
+	.8byte	.LVL317
+	.8byte	.LVL318
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST90:
+.LLST88:
+	.8byte	.LVL317
 	.8byte	.LVL319
-	.8byte	.LVL321
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST91:
-	.8byte	.LVL319
-	.8byte	.LVL322-1
+.LLST89:
+	.8byte	.LVL317
+	.8byte	.LVL320-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL322-1
-	.8byte	.LVL324
+	.8byte	.LVL320-1
+	.8byte	.LVL322
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST92:
-	.8byte	.LVL325
-	.8byte	.LVL326
+.LLST90:
+	.8byte	.LVL323
+	.8byte	.LVL324
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST93:
+.LLST91:
+	.8byte	.LVL323
 	.8byte	.LVL325
-	.8byte	.LVL327
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST94:
-	.8byte	.LVL325
-	.8byte	.LVL328
+.LLST92:
+	.8byte	.LVL323
+	.8byte	.LVL326
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL328
-	.8byte	.LVL331
+	.8byte	.LVL326
+	.8byte	.LVL329
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL332
-	.8byte	.LFE2848
+	.8byte	.LVL330
+	.8byte	.LFE2849
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST95:
-	.8byte	.LVL334
-	.8byte	.LVL335
+.LLST93:
+	.8byte	.LVL332
+	.8byte	.LVL333
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST96:
+.LLST94:
+	.8byte	.LVL332
 	.8byte	.LVL334
-	.8byte	.LVL336
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST97:
-	.8byte	.LVL334
-	.8byte	.LVL337
+.LLST95:
+	.8byte	.LVL332
+	.8byte	.LVL335
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL337
-	.8byte	.LVL338-1
+	.8byte	.LVL335
+	.8byte	.LVL336-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST104:
-	.8byte	.LVL356
-	.8byte	.LVL357-1
+.LLST102:
+	.8byte	.LVL354
+	.8byte	.LVL355-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST105:
-	.8byte	.LVL356
-	.8byte	.LVL357-1
+.LLST103:
+	.8byte	.LVL354
+	.8byte	.LVL355-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST106:
-	.8byte	.LVL356
-	.8byte	.LVL357-1
+.LLST104:
+	.8byte	.LVL354
+	.8byte	.LVL355-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL357-1
-	.8byte	.LVL359
+	.8byte	.LVL355-1
+	.8byte	.LVL357
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST18:
-	.8byte	.LVL81
-	.8byte	.LVL82
+.LLST16:
+	.8byte	.LVL79
+	.8byte	.LVL80
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST19:
+.LLST17:
+	.8byte	.LVL79
 	.8byte	.LVL81
-	.8byte	.LVL83
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST16:
-	.8byte	.LVL77
-	.8byte	.LVL78-1
+.LLST14:
+	.8byte	.LVL75
+	.8byte	.LVL76-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST17:
-	.8byte	.LVL77
-	.8byte	.LVL78-1
+.LLST15:
+	.8byte	.LVL75
+	.8byte	.LVL76-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL78-1
-	.8byte	.LVL80
+	.8byte	.LVL76-1
+	.8byte	.LVL78
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST20:
-	.8byte	.LVL85
-	.8byte	.LVL86
+.LLST18:
+	.8byte	.LVL83
+	.8byte	.LVL84
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST21:
-	.8byte	.LVL85
-	.8byte	.LVL87-1
+.LLST19:
+	.8byte	.LVL83
+	.8byte	.LVL85-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL101
-	.8byte	.LVL102
+	.8byte	.LVL99
+	.8byte	.LVL100
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL104
-	.8byte	.LVL105
+	.8byte	.LVL102
+	.8byte	.LVL103
 	.2byte	0x1
 	.byte	0x51
+	.8byte	.LVL108
 	.8byte	.LVL110
-	.8byte	.LVL112
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL132
-	.8byte	.LVL133-1
+	.8byte	.LVL130
+	.8byte	.LVL131-1
 	.2byte	0x1
 	.byte	0x51
+	.8byte	.LVL132
 	.8byte	.LVL134
-	.8byte	.LVL136
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL158
-	.8byte	.LVL159-1
+	.8byte	.LVL156
+	.8byte	.LVL157-1
 	.2byte	0x1
 	.byte	0x51
+	.8byte	.LVL172
 	.8byte	.LVL174
-	.8byte	.LVL176
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL188
+	.8byte	.LVL186
+	.8byte	.LVL187
+	.2byte	0x1
+	.byte	0x51
 	.8byte	.LVL189
+	.8byte	.LVL190-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	.LVL191
 	.8byte	.LVL192-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL193
-	.8byte	.LVL194-1
+	.8byte	.LVL197
+	.8byte	.LVL198
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL199
-	.8byte	.LVL200
+	.8byte	.LVL208
+	.8byte	.LVL209
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL210
 	.8byte	.LVL211
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL213
-	.8byte	.LVL214-1
+	.8byte	.LVL212-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST22:
-	.8byte	.LVL85
-	.8byte	.LVL101
+.LLST20:
+	.8byte	.LVL83
+	.8byte	.LVL99
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL101
-	.8byte	.LVL109
+	.8byte	.LVL99
+	.8byte	.LVL107
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL110
-	.8byte	.LVL125
+	.8byte	.LVL108
+	.8byte	.LVL123
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL131
-	.8byte	.LVL256
+	.8byte	.LVL129
+	.8byte	.LVL254
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL258
-	.8byte	.LFE2841
+	.8byte	.LVL256
+	.8byte	.LFE2842
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST37:
-	.8byte	.LVL106
-	.8byte	.LVL107
+.LLST35:
+	.8byte	.LVL104
+	.8byte	.LVL105
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL128
-	.8byte	.LVL129-1
+	.8byte	.LVL126
+	.8byte	.LVL127-1
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL131
-	.8byte	.LVL132
+	.8byte	.LVL129
+	.8byte	.LVL130
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST23:
+.LLST21:
+	.8byte	.LVL92
 	.8byte	.LVL94
-	.8byte	.LVL96
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL97
-	.8byte	.LVL98
+	.8byte	.LVL95
+	.8byte	.LVL96
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST24:
+.LLST22:
+	.8byte	.LVL95
 	.8byte	.LVL97
-	.8byte	.LVL99
 	.2byte	0x1
 	.byte	0x50
+	.8byte	.LVL148
 	.8byte	.LVL150
-	.8byte	.LVL152
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST25:
-	.8byte	.LVL91
-	.8byte	.LVL100-1
+.LLST23:
+	.8byte	.LVL89
+	.8byte	.LVL98-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL150
-	.8byte	.LVL151
+	.8byte	.LVL148
+	.8byte	.LVL149
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST26:
-	.8byte	.LVL90
-	.8byte	.LVL93
+.LLST24:
+	.8byte	.LVL88
+	.8byte	.LVL91
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL95
-	.8byte	.LVL100-1
+	.8byte	.LVL93
+	.8byte	.LVL98-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL150
-	.8byte	.LVL154
+	.8byte	.LVL148
+	.8byte	.LVL152
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST27:
-	.8byte	.LVL155
-	.8byte	.LVL157-1
+.LLST25:
+	.8byte	.LVL153
+	.8byte	.LVL155-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST28:
-	.8byte	.LVL153
-	.8byte	.LVL156
+.LLST26:
+	.8byte	.LVL151
+	.8byte	.LVL154
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST29:
-	.8byte	.LVL152
-	.8byte	.LVL155
+.LLST27:
+	.8byte	.LVL150
+	.8byte	.LVL153
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST30:
-	.8byte	.LVL113
-	.8byte	.LVL114
+.LLST28:
+	.8byte	.LVL111
+	.8byte	.LVL112
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL115
-	.8byte	.LVL116
+	.8byte	.LVL113
+	.8byte	.LVL114
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL227
-	.8byte	.LVL228
+	.8byte	.LVL225
+	.8byte	.LVL226
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST31:
-	.8byte	.LVL106
-	.8byte	.LVL107
+.LLST29:
+	.8byte	.LVL104
+	.8byte	.LVL105
 	.2byte	0x1
 	.byte	0x50
+	.8byte	.LVL113
 	.8byte	.LVL115
-	.8byte	.LVL117
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL255
-	.8byte	.LVL256
+	.8byte	.LVL253
+	.8byte	.LVL254
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST32:
+.LLST30:
+	.8byte	.LVL104
 	.8byte	.LVL106
-	.8byte	.LVL108
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL112
-	.8byte	.LVL118
+	.8byte	.LVL110
+	.8byte	.LVL116
 	.2byte	0x1
 	.byte	0x51
+	.8byte	.LVL224
 	.8byte	.LVL226
-	.8byte	.LVL228
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL255
-	.8byte	.LVL256
+	.8byte	.LVL253
+	.8byte	.LVL254
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST33:
-	.8byte	.LVL111
-	.8byte	.LVL114
+.LLST31:
+	.8byte	.LVL109
+	.8byte	.LVL112
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL226
-	.8byte	.LVL227
+	.8byte	.LVL224
+	.8byte	.LVL225
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST34:
-	.8byte	.LVL120
-	.8byte	.LVL122-1
+.LLST32:
+	.8byte	.LVL118
+	.8byte	.LVL120-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST35:
+.LLST33:
+	.8byte	.LVL117
 	.8byte	.LVL119
-	.8byte	.LVL121
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST36:
+.LLST34:
+	.8byte	.LVL116
 	.8byte	.LVL118
-	.8byte	.LVL120
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST38:
-	.8byte	.LVL137
-	.8byte	.LVL138
+.LLST36:
+	.8byte	.LVL135
+	.8byte	.LVL136
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL139
-	.8byte	.LVL140
+	.8byte	.LVL137
+	.8byte	.LVL138
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL225
-	.8byte	.LVL226
+	.8byte	.LVL223
+	.8byte	.LVL224
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST39:
-	.8byte	.LVL106
-	.8byte	.LVL107
+.LLST37:
+	.8byte	.LVL104
+	.8byte	.LVL105
 	.2byte	0x1
 	.byte	0x50
+	.8byte	.LVL137
 	.8byte	.LVL139
-	.8byte	.LVL141
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL255
-	.8byte	.LVL256
+	.8byte	.LVL253
+	.8byte	.LVL254
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST40:
+.LLST38:
+	.8byte	.LVL104
 	.8byte	.LVL106
-	.8byte	.LVL108
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL136
-	.8byte	.LVL142
+	.8byte	.LVL134
+	.8byte	.LVL140
 	.2byte	0x1
 	.byte	0x51
+	.8byte	.LVL222
 	.8byte	.LVL224
-	.8byte	.LVL226
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL255
-	.8byte	.LVL256
+	.8byte	.LVL253
+	.8byte	.LVL254
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST41:
-	.8byte	.LVL135
-	.8byte	.LVL138
+.LLST39:
+	.8byte	.LVL133
+	.8byte	.LVL136
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL224
-	.8byte	.LVL225
+	.8byte	.LVL222
+	.8byte	.LVL223
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST42:
-	.8byte	.LVL144
-	.8byte	.LVL146-1
+.LLST40:
+	.8byte	.LVL142
+	.8byte	.LVL144-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST43:
+.LLST41:
+	.8byte	.LVL141
 	.8byte	.LVL143
-	.8byte	.LVL145
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST44:
+.LLST42:
+	.8byte	.LVL140
 	.8byte	.LVL142
-	.8byte	.LVL144
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST45:
-	.8byte	.LVL163
-	.8byte	.LVL164
+.LLST43:
+	.8byte	.LVL161
+	.8byte	.LVL162
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL165
-	.8byte	.LVL166
+	.8byte	.LVL163
+	.8byte	.LVL164
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL238
-	.8byte	.LVL239
+	.8byte	.LVL236
+	.8byte	.LVL237
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST46:
-	.8byte	.LVL106
-	.8byte	.LVL107
+.LLST44:
+	.8byte	.LVL104
+	.8byte	.LVL105
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL165
-	.8byte	.LVL168
+	.8byte	.LVL163
+	.8byte	.LVL166
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST47:
+.LLST45:
+	.8byte	.LVL104
 	.8byte	.LVL106
-	.8byte	.LVL108
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL162
-	.8byte	.LVL167
+	.8byte	.LVL160
+	.8byte	.LVL165
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL236
-	.8byte	.LVL239
+	.8byte	.LVL234
+	.8byte	.LVL237
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST48:
+.LLST46:
+	.8byte	.LVL104
 	.8byte	.LVL106
-	.8byte	.LVL108
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL161
-	.8byte	.LVL170
+	.8byte	.LVL159
+	.8byte	.LVL168
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL236
-	.8byte	.LVL237
+	.8byte	.LVL234
+	.8byte	.LVL235
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST49:
-	.8byte	.LVL171
-	.8byte	.LVL173-1
+.LLST47:
+	.8byte	.LVL169
+	.8byte	.LVL171-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST50:
-	.8byte	.LVL169
-	.8byte	.LVL172
+.LLST48:
+	.8byte	.LVL167
+	.8byte	.LVL170
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST51:
-	.8byte	.LVL168
-	.8byte	.LVL171
+.LLST49:
+	.8byte	.LVL166
+	.8byte	.LVL169
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST52:
-	.8byte	.LVL185
-	.8byte	.LVL186
+.LLST50:
+	.8byte	.LVL183
+	.8byte	.LVL184
 	.2byte	0x1
 	.byte	0x50
+	.8byte	.LVL258
 	.8byte	.LVL260
-	.8byte	.LVL262
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL265
-	.8byte	.LFE2841
+	.8byte	.LVL263
+	.8byte	.LFE2842
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST53:
-	.8byte	.LVL177
-	.8byte	.LVL178
+.LLST51:
+	.8byte	.LVL175
+	.8byte	.LVL176
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL179
-	.8byte	.LVL180
+	.8byte	.LVL177
+	.8byte	.LVL178
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL232
-	.8byte	.LVL233
+	.8byte	.LVL230
+	.8byte	.LVL231
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST54:
-	.8byte	.LVL179
-	.8byte	.LVL185-1
+.LLST52:
+	.8byte	.LVL177
+	.8byte	.LVL183-1
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL259
-	.8byte	.LVL260
+	.8byte	.LVL257
+	.8byte	.LVL258
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL260
-	.8byte	.LVL263-1
+	.8byte	.LVL258
+	.8byte	.LVL261-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL266
-	.8byte	.LFE2841
+	.8byte	.LVL264
+	.8byte	.LFE2842
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST55:
-	.8byte	.LVL176
-	.8byte	.LVL181
+.LLST53:
+	.8byte	.LVL174
+	.8byte	.LVL179
 	.2byte	0x1
 	.byte	0x51
+	.8byte	.LVL229
 	.8byte	.LVL231
-	.8byte	.LVL233
 	.2byte	0x1
 	.byte	0x51
+	.8byte	.LVL257
 	.8byte	.LVL259
-	.8byte	.LVL261
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST56:
-	.8byte	.LVL175
-	.8byte	.LVL178
+.LLST54:
+	.8byte	.LVL173
+	.8byte	.LVL176
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL231
-	.8byte	.LVL232
+	.8byte	.LVL229
+	.8byte	.LVL230
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST57:
-	.8byte	.LVL183
-	.8byte	.LVL185-1
+.LLST55:
+	.8byte	.LVL181
+	.8byte	.LVL183-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST58:
+.LLST56:
+	.8byte	.LVL180
 	.8byte	.LVL182
-	.8byte	.LVL184
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST59:
+.LLST57:
+	.8byte	.LVL179
 	.8byte	.LVL181
-	.8byte	.LVL183
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST60:
-	.8byte	.LVL92
-	.8byte	.LVL98
+.LLST58:
+	.8byte	.LVL90
+	.8byte	.LVL96
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL198
-	.8byte	.LVL199
+	.8byte	.LVL196
+	.8byte	.LVL197
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST61:
-	.8byte	.LVL92
-	.8byte	.LVL93
+.LLST59:
+	.8byte	.LVL90
+	.8byte	.LVL91
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL95
-	.8byte	.LVL100-1
+	.8byte	.LVL93
+	.8byte	.LVL98-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL150
-	.8byte	.LVL154
+	.8byte	.LVL148
+	.8byte	.LVL152
 	.2byte	0x1
 	.byte	0x52
+	.8byte	.LVL195
 	.8byte	.LVL197
-	.8byte	.LVL199
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST62:
-	.8byte	.LVL203
-	.8byte	.LVL204
+.LLST60:
+	.8byte	.LVL201
+	.8byte	.LVL202
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL205
-	.8byte	.LVL206
+	.8byte	.LVL203
+	.8byte	.LVL204
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL230
-	.8byte	.LVL231
+	.8byte	.LVL228
+	.8byte	.LVL229
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST63:
+.LLST61:
+	.8byte	.LVL203
 	.8byte	.LVL205
-	.8byte	.LVL207
 	.2byte	0x1
 	.byte	0x50
+	.8byte	.LVL237
 	.8byte	.LVL239
-	.8byte	.LVL241
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST64:
-	.8byte	.LVL202
-	.8byte	.LVL208
+.LLST62:
+	.8byte	.LVL200
+	.8byte	.LVL206
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL228
-	.8byte	.LVL231
+	.8byte	.LVL226
+	.8byte	.LVL229
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL239
-	.8byte	.LVL240
+	.8byte	.LVL237
+	.8byte	.LVL238
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST65:
-	.8byte	.LVL201
-	.8byte	.LVL209-1
+.LLST63:
+	.8byte	.LVL199
+	.8byte	.LVL207-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL228
-	.8byte	.LVL229
+	.8byte	.LVL226
+	.8byte	.LVL227
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL239
-	.8byte	.LVL243
+	.8byte	.LVL237
+	.8byte	.LVL241
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST66:
-	.8byte	.LVL244
-	.8byte	.LVL246-1
+.LLST64:
+	.8byte	.LVL242
+	.8byte	.LVL244-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST67:
-	.8byte	.LVL242
-	.8byte	.LVL245
+.LLST65:
+	.8byte	.LVL240
+	.8byte	.LVL243
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST68:
-	.8byte	.LVL241
-	.8byte	.LVL244
+.LLST66:
+	.8byte	.LVL239
+	.8byte	.LVL242
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST69:
-	.8byte	.LVL218
-	.8byte	.LVL219
+.LLST67:
+	.8byte	.LVL216
+	.8byte	.LVL217
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL220
-	.8byte	.LVL221
+	.8byte	.LVL218
+	.8byte	.LVL219
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL235
-	.8byte	.LVL236
+	.8byte	.LVL233
+	.8byte	.LVL234
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST70:
+.LLST68:
+	.8byte	.LVL218
 	.8byte	.LVL220
-	.8byte	.LVL222
 	.2byte	0x1
 	.byte	0x50
+	.8byte	.LVL245
 	.8byte	.LVL247
-	.8byte	.LVL249
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST71:
-	.8byte	.LVL217
-	.8byte	.LVL223-1
+.LLST69:
+	.8byte	.LVL215
+	.8byte	.LVL221-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL233
-	.8byte	.LVL236
+	.8byte	.LVL231
+	.8byte	.LVL234
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL247
-	.8byte	.LVL248
+	.8byte	.LVL245
+	.8byte	.LVL246
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST72:
-	.8byte	.LVL216
-	.8byte	.LVL223-1
+.LLST70:
+	.8byte	.LVL214
+	.8byte	.LVL221-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL233
-	.8byte	.LVL234
+	.8byte	.LVL231
+	.8byte	.LVL232
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL247
-	.8byte	.LVL251
+	.8byte	.LVL245
+	.8byte	.LVL249
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST73:
-	.8byte	.LVL252
-	.8byte	.LVL254-1
+.LLST71:
+	.8byte	.LVL250
+	.8byte	.LVL252-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST74:
-	.8byte	.LVL250
-	.8byte	.LVL253
+.LLST72:
+	.8byte	.LVL248
+	.8byte	.LVL251
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST75:
-	.8byte	.LVL249
-	.8byte	.LVL252
+.LLST73:
+	.8byte	.LVL247
+	.8byte	.LVL250
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST76:
-	.8byte	.LVL277
-	.8byte	.LVL278-1
+.LLST74:
+	.8byte	.LVL275
+	.8byte	.LVL276-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST14:
-	.8byte	.LVL71
-	.8byte	.LVL72
+.LLST12:
+	.8byte	.LVL69
+	.8byte	.LVL70
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST237:
-	.8byte	.LVL849
+.LLST235:
 	.8byte	.LVL850
+	.8byte	.LVL851
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST238:
-	.8byte	.LVL851
-	.8byte	.LVL863
+.LLST236:
+	.8byte	.LVL852
+	.8byte	.LVL864
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL866
-	.8byte	.LFE2836
+	.8byte	.LVL867
+	.8byte	.LFE2837
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST239:
-	.8byte	.LVL852
-	.8byte	.LVL864
+.LLST237:
+	.8byte	.LVL853
+	.8byte	.LVL865
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL866
-	.8byte	.LFE2836
+	.8byte	.LVL867
+	.8byte	.LFE2837
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST240:
-	.8byte	.LVL877
-	.8byte	.LVL879-1
+.LLST238:
+	.8byte	.LVL878
+	.8byte	.LVL882-1
 	.2byte	0x1
-	.byte	0x57
+	.byte	0x54
+	.8byte	.LVL910
 	.8byte	.LVL911
-	.8byte	.LVL912
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL914
-	.8byte	.LVL917-1
+	.byte	0x54
+	.8byte	.LVL927
+	.8byte	.LVL929-1
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL935
-	.8byte	.LVL937-1
+	.byte	0x54
+	.8byte	.LVL972
+	.8byte	.LVL976-1
 	.2byte	0x1
-	.byte	0x57
+	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST241:
-	.8byte	.LVL915
-	.8byte	.LVL916
+.LLST239:
+	.8byte	.LVL880
+	.8byte	.LVL881
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL936
-	.8byte	.LVL937-1
+	.8byte	.LVL928
+	.8byte	.LVL929-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST242:
-	.8byte	.LVL852
-	.8byte	.LVL865
+.LLST240:
+	.8byte	.LVL853
+	.8byte	.LVL866
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL866
-	.8byte	.LVL896
+	.8byte	.LVL867
+	.8byte	.LVL895
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL900
-	.8byte	.LVL903
+	.8byte	.LVL899
+	.8byte	.LVL902
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL907
-	.8byte	.LVL958
+	.8byte	.LVL906
+	.8byte	.LVL955
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL963
-	.8byte	.LVL965
+	.8byte	.LVL960
+	.8byte	.LVL964
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL966
-	.8byte	.LVL981
+	.8byte	.LVL965
+	.8byte	.LVL986
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL987
-	.8byte	.LFE2836
+	.8byte	.LVL992
+	.8byte	.LFE2837
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST257:
+.LLST256:
+	.8byte	.LVL946
 	.8byte	.LVL947
-	.8byte	.LVL948
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL983
-	.8byte	.LVL984-1
+	.8byte	.LVL988
+	.8byte	.LVL989-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST256:
-	.8byte	.LVL942
-	.8byte	.LVL943
+.LLST255:
+	.8byte	.LVL934
+	.8byte	.LVL935
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL993
-	.8byte	.LVL994-1
+	.8byte	.LVL998
+	.8byte	.LVL999-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST254:
-	.8byte	.LVL867
+.LLST253:
 	.8byte	.LVL868
+	.8byte	.LVL869
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL922
-	.8byte	.LVL923-1
+	.8byte	.LVL914
+	.8byte	.LVL915-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST243:
-	.8byte	.LVL852
+.LLST241:
 	.8byte	.LVL853
+	.8byte	.LVL854
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL869
 	.8byte	.LVL870
+	.8byte	.LVL871
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL872
-	.8byte	.LVL873-1
+	.8byte	.LVL873
+	.8byte	.LVL874-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST244:
-	.8byte	.LVL880
-	.8byte	.LVL882-1
+.LLST242:
+	.8byte	.LVL973
+	.8byte	.LVL974
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL974
+	.8byte	.LVL975
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST243:
+	.8byte	.LVL884
+	.8byte	.LVL885-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL891
-	.8byte	.LVL907
+	.8byte	.LVL890
+	.8byte	.LVL906
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL919
-	.8byte	.LVL920-1
+	.8byte	.LVL937
+	.8byte	.LVL939-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL958
-	.8byte	.LVL964-1
+	.8byte	.LVL955
+	.8byte	.LVL961-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL965
-	.8byte	.LVL967-1
+	.8byte	.LVL964
+	.8byte	.LVL966-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL978
-	.8byte	.LVL979-1
+	.8byte	.LVL983
+	.8byte	.LVL984-1
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST245:
-	.8byte	.LVL896
-	.8byte	.LVL899
+.LLST244:
+	.8byte	.LVL895
+	.8byte	.LVL898
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL904
-	.8byte	.LVL907
+	.8byte	.LVL903
+	.8byte	.LVL906
 	.2byte	0x1
 	.byte	0x50
+	.8byte	.LVL955
 	.8byte	.LVL958
-	.8byte	.LVL961
 	.2byte	0x1
 	.byte	0x50
+	.8byte	.LVL964
 	.8byte	.LVL965
-	.8byte	.LVL966
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST246:
-	.8byte	.LVL852
-	.8byte	.LVL865
+.LLST245:
+	.8byte	.LVL853
+	.8byte	.LVL866
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL866
-	.8byte	.LVL878
+	.8byte	.LVL867
+	.8byte	.LVL879
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL880
-	.8byte	.LVL896
+	.8byte	.LVL884
+	.8byte	.LVL895
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL898
-	.8byte	.LVL903
+	.8byte	.LVL897
+	.8byte	.LVL902
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL907
-	.8byte	.LVL914
+	.8byte	.LVL906
+	.8byte	.LVL927
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL919
-	.8byte	.LVL935
+	.8byte	.LVL937
+	.8byte	.LVL955
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL945
-	.8byte	.LVL958
+	.8byte	.LVL957
+	.8byte	.LVL964
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL960
 	.8byte	.LVL965
+	.8byte	.LVL972
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL966
-	.8byte	.LVL981
+	.8byte	.LVL977
+	.8byte	.LVL986
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL987
-	.8byte	.LVL991
+	.8byte	.LVL992
+	.8byte	.LVL996
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL997
-	.8byte	.LFE2836
+	.8byte	.LVL1002
+	.8byte	.LFE2837
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST247:
-	.8byte	.LVL880
-	.8byte	.LVL882-1
+.LLST246:
+	.8byte	.LVL884
+	.8byte	.LVL885-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL895
-	.8byte	.LVL897
+	.8byte	.LVL894
+	.8byte	.LVL896
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL898
-	.8byte	.LVL907
+	.8byte	.LVL897
+	.8byte	.LVL906
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL919
-	.8byte	.LVL920-1
+	.8byte	.LVL937
+	.8byte	.LVL939-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL958
-	.8byte	.LVL959
+	.8byte	.LVL955
+	.8byte	.LVL956
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL963
-	.8byte	.LVL964-1
+	.8byte	.LVL960
+	.8byte	.LVL961-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL965
-	.8byte	.LVL967-1
+	.8byte	.LVL964
+	.8byte	.LVL966-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL978
-	.8byte	.LVL979-1
+	.8byte	.LVL983
+	.8byte	.LVL984-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST248:
-	.8byte	.LVL880
-	.8byte	.LVL882-1
+.LLST247:
+	.8byte	.LVL884
+	.8byte	.LVL885-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL895
-	.8byte	.LVL905
+	.8byte	.LVL894
+	.8byte	.LVL904
 	.2byte	0x1
 	.byte	0x53
+	.8byte	.LVL905
 	.8byte	.LVL906
-	.8byte	.LVL907
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL919
-	.8byte	.LVL920-1
+	.8byte	.LVL937
+	.8byte	.LVL939-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL958
-	.8byte	.LVL964-1
+	.8byte	.LVL955
+	.8byte	.LVL961-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL965
-	.8byte	.LVL967-1
+	.8byte	.LVL964
+	.8byte	.LVL966-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL978
-	.8byte	.LVL979-1
+	.8byte	.LVL983
+	.8byte	.LVL984-1
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST249:
-	.8byte	.LVL880
-	.8byte	.LVL882-1
+.LLST248:
+	.8byte	.LVL884
+	.8byte	.LVL885-1
 	.2byte	0x1
 	.byte	0x55
+	.8byte	.LVL894
 	.8byte	.LVL895
-	.8byte	.LVL896
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL899
-	.8byte	.LVL901
+	.8byte	.LVL898
+	.8byte	.LVL900
 	.2byte	0x1
 	.byte	0x55
+	.8byte	.LVL900
 	.8byte	.LVL901
-	.8byte	.LVL902
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL919
-	.8byte	.LVL920-1
+	.8byte	.LVL937
+	.8byte	.LVL939-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL962
-	.8byte	.LVL964-1
+	.8byte	.LVL959
+	.8byte	.LVL961-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL966
-	.8byte	.LVL967-1
+	.8byte	.LVL965
+	.8byte	.LVL966-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL978
-	.8byte	.LVL979-1
+	.8byte	.LVL983
+	.8byte	.LVL984-1
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST250:
-	.8byte	.LVL880
-	.8byte	.LVL882-1
+.LLST249:
+	.8byte	.LVL884
+	.8byte	.LVL885-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL894
-	.8byte	.LVL907
+	.8byte	.LVL893
+	.8byte	.LVL906
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL919
-	.8byte	.LVL920-1
+	.8byte	.LVL937
+	.8byte	.LVL939-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL958
-	.8byte	.LVL964-1
+	.8byte	.LVL955
+	.8byte	.LVL961-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL965
-	.8byte	.LVL967-1
+	.8byte	.LVL964
+	.8byte	.LVL966-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL978
-	.8byte	.LVL979-1
+	.8byte	.LVL983
+	.8byte	.LVL984-1
 	.2byte	0x1
 	.byte	0x61
 	.8byte	0
 	.8byte	0
-.LLST251:
-	.8byte	.LVL880
-	.8byte	.LVL882-1
+.LLST250:
+	.8byte	.LVL884
+	.8byte	.LVL885-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL892
-	.8byte	.LVL907
+	.8byte	.LVL891
+	.8byte	.LVL906
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL919
-	.8byte	.LVL920-1
+	.8byte	.LVL937
+	.8byte	.LVL939-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL958
-	.8byte	.LVL964-1
+	.8byte	.LVL955
+	.8byte	.LVL961-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL965
-	.8byte	.LVL967-1
+	.8byte	.LVL964
+	.8byte	.LVL966-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL978
-	.8byte	.LVL979-1
+	.8byte	.LVL983
+	.8byte	.LVL984-1
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST252:
-	.8byte	.LVL880
-	.8byte	.LVL882-1
+.LLST251:
+	.8byte	.LVL884
+	.8byte	.LVL885-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL894
-	.8byte	.LVL907
+	.8byte	.LVL893
+	.8byte	.LVL906
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL919
-	.8byte	.LVL920-1
+	.8byte	.LVL937
+	.8byte	.LVL939-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL958
-	.8byte	.LVL964-1
+	.8byte	.LVL955
+	.8byte	.LVL961-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL965
-	.8byte	.LVL967-1
+	.8byte	.LVL964
+	.8byte	.LVL966-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL978
-	.8byte	.LVL979-1
+	.8byte	.LVL983
+	.8byte	.LVL984-1
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST253:
-	.8byte	.LVL852
-	.8byte	.LVL857
+.LLST252:
+	.8byte	.LVL853
+	.8byte	.LVL858
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL860
-	.8byte	.LVL865
+	.8byte	.LVL861
+	.8byte	.LVL866
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL866
-	.8byte	.LVL876
+	.8byte	.LVL867
+	.8byte	.LVL877
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL880
-	.8byte	.LVL881
+	.8byte	.LVL884
+	.8byte	.LVL886
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL885
-	.8byte	.LVL887
+	.8byte	.LVL892
+	.8byte	.LVL906
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL893
-	.8byte	.LVL907
+	.8byte	.LVL912
+	.8byte	.LVL927
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL913
-	.8byte	.LVL914
+	.8byte	.LVL937
+	.8byte	.LVL938
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL919
-	.8byte	.LVL935
+	.8byte	.LVL942
+	.8byte	.LVL944
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL953
-	.8byte	.LVL956
+	.8byte	.LVL955
+	.8byte	.LVL968
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL958
-	.8byte	.LVL969
+	.8byte	.LVL979
+	.8byte	.LVL981
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL976
-	.8byte	.LVL980
+	.8byte	.LVL983
+	.8byte	.LVL985
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL987
-	.8byte	.LVL991
+	.8byte	.LVL992
+	.8byte	.LVL996
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL997
-	.8byte	.LVL1000
+	.8byte	.LVL1002
+	.8byte	.LVL1005
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1003
-	.8byte	.LFE2836
+	.8byte	.LVL1008
+	.8byte	.LFE2837
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST255:
-	.8byte	.LVL928
-	.8byte	.LVL929-1
+.LLST254:
+	.8byte	.LVL920
+	.8byte	.LVL921-1
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST258:
-	.8byte	.LVL909
-	.8byte	.LVL910-1
+.LLST257:
+	.8byte	.LVL908
+	.8byte	.LVL909-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL973
-	.8byte	.LVL974
+	.8byte	.LVL978
+	.8byte	.LVL979
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST259:
-	.8byte	.LVL888
-	.8byte	.LVL889-1
+.LLST258:
+	.8byte	.LVL887
+	.8byte	.LVL888-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL975
-	.8byte	.LVL976
+	.8byte	.LVL982
+	.8byte	.LVL983
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST77:
-	.8byte	.LVL279
-	.8byte	.LVL280
+.LLST75:
+	.8byte	.LVL277
+	.8byte	.LVL278
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL280
-	.8byte	.LVL287
+	.8byte	.LVL278
+	.8byte	.LVL285
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL289
-	.8byte	.LFE2832
+	.8byte	.LVL287
+	.8byte	.LFE2833
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST78:
+.LLST76:
+	.8byte	.LVL277
 	.8byte	.LVL279
-	.8byte	.LVL281
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL281
-	.8byte	.LVL288
+	.8byte	.LVL279
+	.8byte	.LVL286
 	.2byte	0x1
 	.byte	0x67
-	.8byte	.LVL289
-	.8byte	.LFE2832
+	.8byte	.LVL287
+	.8byte	.LFE2833
 	.2byte	0x1
 	.byte	0x67
 	.8byte	0
 	.8byte	0
-.LLST79:
+.LLST77:
+	.8byte	.LVL280
 	.8byte	.LVL282
-	.8byte	.LVL284
 	.2byte	0x2
 	.byte	0x70
 	.sleb128 -12
-	.8byte	.LVL284
-	.8byte	.LVL290
+	.8byte	.LVL282
+	.8byte	.LVL288
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 36
-	.8byte	.LVL290
-	.8byte	.LVL293
+	.8byte	.LVL288
+	.8byte	.LVL291
 	.2byte	0x2
 	.byte	0x70
 	.sleb128 -12
-	.8byte	.LVL293
-	.8byte	.LFE2832
+	.8byte	.LVL291
+	.8byte	.LFE2833
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 36
 	.8byte	0
 	.8byte	0
-.LLST192:
-	.8byte	.LVL575
-	.8byte	.LVL576
+.LLST234:
+	.8byte	.LVL830
+	.8byte	.LVL831
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST191:
-	.8byte	.LVL548
-	.8byte	.LVL549
+.LLST189:
+	.8byte	.LVL546
+	.8byte	.LVL547
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL549
-	.8byte	.LVL553
+	.8byte	.LVL547
+	.8byte	.LVL551
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL554
-	.8byte	.LVL558
+	.8byte	.LVL552
+	.8byte	.LVL556
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL559
-	.8byte	.LVL563
+	.8byte	.LVL557
+	.8byte	.LVL561
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL564
-	.8byte	.LVL568
+	.8byte	.LVL562
+	.8byte	.LVL566
 	.2byte	0x1
 	.byte	0x64
+	.8byte	.LVL567
 	.8byte	.LVL569
-	.8byte	.LVL571
 	.2byte	0x1
 	.byte	0x64
+	.8byte	.LVL570
 	.8byte	.LVL572
-	.8byte	.LVL574
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST144:
-	.8byte	.LVL440
-	.8byte	.LVL487
+.LLST142:
+	.8byte	.LVL438
+	.8byte	.LVL485
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL488
-	.8byte	.LFE2826
+	.8byte	.LVL486
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST145:
-	.8byte	.LVL440
-	.8byte	.LVL488
+.LLST143:
+	.8byte	.LVL438
+	.8byte	.LVL486
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL488
-	.8byte	.LFE2826
+	.8byte	.LVL486
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST146:
-	.8byte	.LVL440
-	.8byte	.LVL441
+.LLST144:
+	.8byte	.LVL438
+	.8byte	.LVL439
 	.2byte	0x1
 	.byte	0x53
+	.8byte	.LVL458
 	.8byte	.LVL460
-	.8byte	.LVL462
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL492
-	.8byte	.LVL493
+	.8byte	.LVL490
+	.8byte	.LVL491
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL505
-	.8byte	.LVL506
+	.8byte	.LVL503
+	.8byte	.LVL504
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL521
-	.8byte	.LVL522
+	.8byte	.LVL519
+	.8byte	.LVL520
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST147:
-	.8byte	.LVL450
-	.8byte	.LVL451
+.LLST145:
+	.8byte	.LVL448
+	.8byte	.LVL449
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST148:
-	.8byte	.LVL447
-	.8byte	.LVL448
+.LLST146:
+	.8byte	.LVL445
+	.8byte	.LVL446
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL449
-	.8byte	.LVL452
+	.8byte	.LVL447
+	.8byte	.LVL450
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL453
-	.8byte	.LVL460
+	.8byte	.LVL451
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST149:
-	.8byte	.LVL445
-	.8byte	.LVL460
+.LLST147:
+	.8byte	.LVL443
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST150:
-	.8byte	.LVL446
-	.8byte	.LVL460
+.LLST148:
+	.8byte	.LVL444
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST151:
-	.8byte	.LVL442
-	.8byte	.LVL443
+.LLST149:
+	.8byte	.LVL440
+	.8byte	.LVL441
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST152:
-	.8byte	.LVL444
-	.8byte	.LVL460
+.LLST150:
+	.8byte	.LVL442
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST153:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST151:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL469
-	.8byte	.LVL481
+	.8byte	.LVL467
+	.8byte	.LVL479
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL486
-	.8byte	.LVL492
+	.8byte	.LVL484
+	.8byte	.LVL490
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL519
-	.8byte	.LVL520
+	.8byte	.LVL517
+	.8byte	.LVL518
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST154:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST152:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL473
-	.8byte	.LVL482
+	.8byte	.LVL471
+	.8byte	.LVL480
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL486
-	.8byte	.LVL489
+	.8byte	.LVL484
+	.8byte	.LVL487
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL519
-	.8byte	.LVL520
+	.8byte	.LVL517
+	.8byte	.LVL518
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST155:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST153:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL469
-	.8byte	.LVL492
+	.8byte	.LVL467
+	.8byte	.LVL490
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL519
-	.8byte	.LVL520
+	.8byte	.LVL517
+	.8byte	.LVL518
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST156:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST154:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL469
-	.8byte	.LVL492
+	.8byte	.LVL467
+	.8byte	.LVL490
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL519
-	.8byte	.LVL520
+	.8byte	.LVL517
+	.8byte	.LVL518
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST157:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST155:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL469
-	.8byte	.LVL470
+	.8byte	.LVL467
+	.8byte	.LVL468
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL471
-	.8byte	.LVL472
+	.8byte	.LVL469
+	.8byte	.LVL470
 	.2byte	0x1
 	.byte	0x55
+	.8byte	.LVL486
 	.8byte	.LVL488
-	.8byte	.LVL490
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL491
-	.8byte	.LVL492
+	.8byte	.LVL489
+	.8byte	.LVL490
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST158:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST156:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL466
-	.8byte	.LVL492
+	.8byte	.LVL464
+	.8byte	.LVL490
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL519
-	.8byte	.LVL520
+	.8byte	.LVL517
+	.8byte	.LVL518
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
-.LLST159:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST157:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL467
-	.8byte	.LVL492
+	.8byte	.LVL465
+	.8byte	.LVL490
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL519
-	.8byte	.LVL520
+	.8byte	.LVL517
+	.8byte	.LVL518
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST160:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST158:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL468
-	.8byte	.LVL492
+	.8byte	.LVL466
+	.8byte	.LVL490
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL519
-	.8byte	.LVL520
+	.8byte	.LVL517
+	.8byte	.LVL518
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST161:
-	.8byte	.LVL463
-	.8byte	.LVL464
+.LLST159:
+	.8byte	.LVL461
+	.8byte	.LVL462
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST162:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST160:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL465
-	.8byte	.LVL492
+	.8byte	.LVL463
+	.8byte	.LVL490
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL519
-	.8byte	.LVL520
+	.8byte	.LVL517
+	.8byte	.LVL518
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST163:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST161:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL469
-	.8byte	.LVL474
+	.8byte	.LVL467
+	.8byte	.LVL472
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL483
-	.8byte	.LVL492
+	.8byte	.LVL481
+	.8byte	.LVL490
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL519
-	.8byte	.LVL520
+	.8byte	.LVL517
+	.8byte	.LVL518
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST164:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST162:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL469
-	.8byte	.LVL477
+	.8byte	.LVL467
+	.8byte	.LVL475
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL478
-	.8byte	.LVL479
+	.8byte	.LVL476
+	.8byte	.LVL477
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL480
-	.8byte	.LVL484
+	.8byte	.LVL478
+	.8byte	.LVL482
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL485
-	.8byte	.LVL492
+	.8byte	.LVL483
+	.8byte	.LVL490
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL519
-	.8byte	.LVL520
+	.8byte	.LVL517
+	.8byte	.LVL518
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST165:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST163:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL469
-	.8byte	.LVL475
+	.8byte	.LVL467
+	.8byte	.LVL473
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL476
-	.8byte	.LVL479
+	.8byte	.LVL474
+	.8byte	.LVL477
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL480
-	.8byte	.LVL484
+	.8byte	.LVL478
+	.8byte	.LVL482
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL485
-	.8byte	.LVL492
+	.8byte	.LVL483
+	.8byte	.LVL490
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL519
-	.8byte	.LVL520
+	.8byte	.LVL517
+	.8byte	.LVL518
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST166:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST164:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL469
-	.8byte	.LVL475
+	.8byte	.LVL467
+	.8byte	.LVL473
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL476
-	.8byte	.LVL477
+	.8byte	.LVL474
+	.8byte	.LVL475
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL478
-	.8byte	.LVL484
+	.8byte	.LVL476
+	.8byte	.LVL482
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL485
-	.8byte	.LVL492
+	.8byte	.LVL483
+	.8byte	.LVL490
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL519
-	.8byte	.LVL520
+	.8byte	.LVL517
+	.8byte	.LVL518
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST167:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST165:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL499
-	.8byte	.LVL500
+	.8byte	.LVL497
+	.8byte	.LVL498
 	.2byte	0x1
 	.byte	0x57
+	.8byte	.LVL499
 	.8byte	.LVL501
-	.8byte	.LVL503
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL504
-	.8byte	.LVL505
+	.8byte	.LVL502
+	.8byte	.LVL503
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST168:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST166:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL497
-	.8byte	.LVL505
+	.8byte	.LVL495
+	.8byte	.LVL503
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST169:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST167:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL498
-	.8byte	.LVL505
+	.8byte	.LVL496
+	.8byte	.LVL503
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST170:
-	.8byte	.LVL494
-	.8byte	.LVL495
+.LLST168:
+	.8byte	.LVL492
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST171:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST169:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL496
-	.8byte	.LVL505
+	.8byte	.LVL494
+	.8byte	.LVL503
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST172:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST170:
+	.8byte	.LVL452
+	.8byte	.LVL458
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL510
+	.8byte	.LVL511
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	.LVL512
@@ -54079,219 +54254,219 @@ __exitcall_ebc_exit:
 	.8byte	.LVL517
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL518
-	.8byte	.LVL519
-	.2byte	0x1
-	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST173:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST171:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL510
-	.8byte	.LVL519
+	.8byte	.LVL508
+	.8byte	.LVL517
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL520
-	.8byte	.LVL521
+	.8byte	.LVL518
+	.8byte	.LVL519
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST174:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST172:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL511
-	.8byte	.LVL519
+	.8byte	.LVL509
+	.8byte	.LVL517
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL520
-	.8byte	.LVL521
+	.8byte	.LVL518
+	.8byte	.LVL519
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
-.LLST175:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST173:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL461
-	.8byte	.LVL468
+	.8byte	.LVL459
+	.8byte	.LVL466
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL505
-	.8byte	.LVL519
+	.8byte	.LVL503
+	.8byte	.LVL517
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL520
-	.8byte	.LVL521
+	.8byte	.LVL518
+	.8byte	.LVL519
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST176:
-	.8byte	.LVL507
-	.8byte	.LVL508
+.LLST174:
+	.8byte	.LVL505
+	.8byte	.LVL506
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST177:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST175:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL509
-	.8byte	.LVL519
+	.8byte	.LVL507
+	.8byte	.LVL517
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL520
-	.8byte	.LVL521
+	.8byte	.LVL518
+	.8byte	.LVL519
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST178:
-	.8byte	.LVL454
-	.8byte	.LVL455
+.LLST176:
+	.8byte	.LVL452
+	.8byte	.LVL453
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL512
-	.8byte	.LVL519
+	.8byte	.LVL510
+	.8byte	.LVL517
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL520
-	.8byte	.LVL521
+	.8byte	.LVL518
+	.8byte	.LVL519
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST179:
-	.8byte	.LVL454
-	.8byte	.LVL457
+.LLST177:
+	.8byte	.LVL452
+	.8byte	.LVL455
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL512
-	.8byte	.LVL519
+	.8byte	.LVL510
+	.8byte	.LVL517
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL520
-	.8byte	.LVL521
+	.8byte	.LVL518
+	.8byte	.LVL519
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST180:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST178:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL529
-	.8byte	.LVL530
+	.8byte	.LVL527
+	.8byte	.LVL528
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL531
-	.8byte	.LVL538
+	.8byte	.LVL529
+	.8byte	.LVL536
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL539
-	.8byte	.LFE2826
+	.8byte	.LVL537
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST181:
+.LLST179:
+	.8byte	.LVL452
 	.8byte	.LVL454
-	.8byte	.LVL456
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL526
-	.8byte	.LFE2826
+	.8byte	.LVL524
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST182:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST180:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL527
-	.8byte	.LFE2826
+	.8byte	.LVL525
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x61
 	.8byte	0
 	.8byte	0
-.LLST183:
-	.8byte	.LVL454
-	.8byte	.LVL455
+.LLST181:
+	.8byte	.LVL452
+	.8byte	.LVL453
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL528
-	.8byte	.LFE2826
+	.8byte	.LVL526
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST184:
-	.8byte	.LVL523
-	.8byte	.LVL524
+.LLST182:
+	.8byte	.LVL521
+	.8byte	.LVL522
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST185:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST183:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL525
-	.8byte	.LFE2826
+	.8byte	.LVL523
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST186:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST184:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL529
-	.8byte	.LVL532
+	.8byte	.LVL527
+	.8byte	.LVL530
 	.2byte	0x1
 	.byte	0x54
+	.8byte	.LVL532
 	.8byte	.LVL534
-	.8byte	.LVL536
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL537
-	.8byte	.LFE2826
+	.8byte	.LVL535
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST187:
-	.8byte	.LVL454
-	.8byte	.LVL458
+.LLST185:
+	.8byte	.LVL452
+	.8byte	.LVL456
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL529
-	.8byte	.LFE2826
+	.8byte	.LVL527
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST188:
-	.8byte	.LVL454
-	.8byte	.LVL460
+.LLST186:
+	.8byte	.LVL452
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL529
+	.8byte	.LVL527
+	.8byte	.LVL530
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL531
 	.8byte	.LVL532
 	.2byte	0x1
 	.byte	0x54
@@ -54300,523 +54475,509 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x54
 	.8byte	.LVL535
-	.8byte	.LVL536
-	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL537
-	.8byte	.LFE2826
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST189:
-	.8byte	.LVL454
-	.8byte	.LVL459
+.LLST187:
+	.8byte	.LVL452
+	.8byte	.LVL457
 	.2byte	0x1
 	.byte	0x6e
-	.8byte	.LVL529
-	.8byte	.LFE2826
+	.8byte	.LVL527
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x6e
 	.8byte	0
 	.8byte	0
-.LLST107:
-	.8byte	.LVL361
-	.8byte	.LVL392
+.LLST105:
+	.8byte	.LVL359
+	.8byte	.LVL390
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL393
-	.8byte	.LFE2820
+	.8byte	.LVL391
+	.8byte	.LFE2821
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST108:
-	.8byte	.LVL361
-	.8byte	.LVL393
+.LLST106:
+	.8byte	.LVL359
+	.8byte	.LVL391
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL393
-	.8byte	.LFE2820
+	.8byte	.LVL391
+	.8byte	.LFE2821
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST109:
-	.8byte	.LVL361
-	.8byte	.LVL362
+.LLST107:
+	.8byte	.LVL359
+	.8byte	.LVL360
 	.2byte	0x1
 	.byte	0x53
+	.8byte	.LVL374
 	.8byte	.LVL376
-	.8byte	.LVL378
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL396
-	.8byte	.LVL397
+	.8byte	.LVL394
+	.8byte	.LVL395
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL409
-	.8byte	.LVL410
+	.8byte	.LVL407
+	.8byte	.LVL408
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL424
-	.8byte	.LVL425
+	.8byte	.LVL422
+	.8byte	.LVL423
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST110:
-	.8byte	.LVL371
-	.8byte	.LVL372
+.LLST108:
+	.8byte	.LVL369
+	.8byte	.LVL370
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST111:
-	.8byte	.LVL368
-	.8byte	.LVL369
+.LLST109:
+	.8byte	.LVL366
+	.8byte	.LVL367
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL370
-	.8byte	.LVL373
+	.8byte	.LVL368
+	.8byte	.LVL371
 	.2byte	0x1
 	.byte	0x57
+	.8byte	.LVL372
 	.8byte	.LVL374
-	.8byte	.LVL376
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST112:
-	.8byte	.LVL366
-	.8byte	.LVL376
+.LLST110:
+	.8byte	.LVL364
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST113:
-	.8byte	.LVL367
-	.8byte	.LVL376
+.LLST111:
+	.8byte	.LVL365
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST114:
-	.8byte	.LVL363
-	.8byte	.LVL364
+.LLST112:
+	.8byte	.LVL361
+	.8byte	.LVL362
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST115:
-	.8byte	.LVL365
-	.8byte	.LVL376
+.LLST113:
+	.8byte	.LVL363
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST116:
-	.8byte	.LVL375
-	.8byte	.LVL376
+.LLST114:
+	.8byte	.LVL373
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL384
-	.8byte	.LVL396
+	.8byte	.LVL382
+	.8byte	.LVL394
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST117:
-	.8byte	.LVL375
-	.8byte	.LVL376
+.LLST115:
+	.8byte	.LVL373
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL382
-	.8byte	.LVL396
+	.8byte	.LVL380
+	.8byte	.LVL394
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST118:
+.LLST116:
+	.8byte	.LVL386
 	.8byte	.LVL388
-	.8byte	.LVL390
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST119:
+.LLST117:
+	.8byte	.LVL387
 	.8byte	.LVL389
-	.8byte	.LVL391
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST120:
-	.8byte	.LVL375
-	.8byte	.LVL376
+.LLST118:
+	.8byte	.LVL373
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL385
-	.8byte	.LVL396
+	.8byte	.LVL383
+	.8byte	.LVL394
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST121:
-	.8byte	.LVL375
-	.8byte	.LVL376
+.LLST119:
+	.8byte	.LVL373
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL385
-	.8byte	.LVL396
+	.8byte	.LVL383
+	.8byte	.LVL394
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST122:
-	.8byte	.LVL375
-	.8byte	.LVL376
+.LLST120:
+	.8byte	.LVL373
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL385
-	.8byte	.LVL386
+	.8byte	.LVL383
+	.8byte	.LVL384
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL387
-	.8byte	.LVL394
+	.8byte	.LVL385
+	.8byte	.LVL392
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL395
-	.8byte	.LVL396
+	.8byte	.LVL393
+	.8byte	.LVL394
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST123:
-	.8byte	.LVL379
-	.8byte	.LVL380
+.LLST121:
+	.8byte	.LVL377
+	.8byte	.LVL378
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST124:
-	.8byte	.LVL375
-	.8byte	.LVL376
+.LLST122:
+	.8byte	.LVL373
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL381
-	.8byte	.LVL396
+	.8byte	.LVL379
+	.8byte	.LVL394
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST125:
-	.8byte	.LVL375
-	.8byte	.LVL376
+.LLST123:
+	.8byte	.LVL373
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL403
-	.8byte	.LVL404
+	.8byte	.LVL401
+	.8byte	.LVL402
 	.2byte	0x1
 	.byte	0x57
+	.8byte	.LVL403
 	.8byte	.LVL405
-	.8byte	.LVL407
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL408
-	.8byte	.LVL409
+	.8byte	.LVL406
+	.8byte	.LVL407
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST126:
-	.8byte	.LVL375
-	.8byte	.LVL376
+.LLST124:
+	.8byte	.LVL373
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL401
-	.8byte	.LVL409
+	.8byte	.LVL399
+	.8byte	.LVL407
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST127:
-	.8byte	.LVL375
-	.8byte	.LVL376
+.LLST125:
+	.8byte	.LVL373
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL402
-	.8byte	.LVL409
+	.8byte	.LVL400
+	.8byte	.LVL407
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST128:
-	.8byte	.LVL398
-	.8byte	.LVL399
+.LLST126:
+	.8byte	.LVL396
+	.8byte	.LVL397
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST129:
-	.8byte	.LVL375
-	.8byte	.LVL376
+.LLST127:
+	.8byte	.LVL373
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL400
-	.8byte	.LVL409
+	.8byte	.LVL398
+	.8byte	.LVL407
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST130:
-	.8byte	.LVL375
-	.8byte	.LVL376
+.LLST128:
+	.8byte	.LVL373
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL377
-	.8byte	.LVL383
+	.8byte	.LVL375
+	.8byte	.LVL381
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL409
-	.8byte	.LVL424
+	.8byte	.LVL407
+	.8byte	.LVL422
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
-.LLST131:
-	.8byte	.LVL375
-	.8byte	.LVL376
+.LLST129:
+	.8byte	.LVL373
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL414
-	.8byte	.LVL424
+	.8byte	.LVL412
+	.8byte	.LVL422
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST132:
-	.8byte	.LVL375
-	.8byte	.LVL376
+.LLST130:
+	.8byte	.LVL373
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL415
-	.8byte	.LVL424
+	.8byte	.LVL413
+	.8byte	.LVL422
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST133:
+.LLST131:
+	.8byte	.LVL417
 	.8byte	.LVL419
-	.8byte	.LVL421
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST134:
-	.8byte	.LVL375
-	.8byte	.LVL376
+.LLST132:
+	.8byte	.LVL373
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL416
-	.8byte	.LVL417
+	.8byte	.LVL414
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL418
-	.8byte	.LVL422
+	.8byte	.LVL416
+	.8byte	.LVL420
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL423
-	.8byte	.LVL424
+	.8byte	.LVL421
+	.8byte	.LVL422
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST135:
-	.8byte	.LVL411
-	.8byte	.LVL412
+.LLST133:
+	.8byte	.LVL409
+	.8byte	.LVL410
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST136:
-	.8byte	.LVL375
-	.8byte	.LVL376
+.LLST134:
+	.8byte	.LVL373
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL413
-	.8byte	.LVL424
+	.8byte	.LVL411
+	.8byte	.LVL422
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST137:
-	.8byte	.LVL375
-	.8byte	.LVL376
+.LLST135:
+	.8byte	.LVL373
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL431
-	.8byte	.LFE2820
+	.8byte	.LVL429
+	.8byte	.LFE2821
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
-.LLST138:
-	.8byte	.LVL375
-	.8byte	.LVL376
+.LLST136:
+	.8byte	.LVL373
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL429
-	.8byte	.LFE2820
+	.8byte	.LVL427
+	.8byte	.LFE2821
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST139:
-	.8byte	.LVL375
-	.8byte	.LVL376
+.LLST137:
+	.8byte	.LVL373
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL430
-	.8byte	.LFE2820
+	.8byte	.LVL428
+	.8byte	.LFE2821
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST140:
+.LLST138:
+	.8byte	.LVL433
 	.8byte	.LVL435
-	.8byte	.LVL437
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST141:
-	.8byte	.LVL375
-	.8byte	.LVL376
+.LLST139:
+	.8byte	.LVL373
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL432
-	.8byte	.LVL433
+	.8byte	.LVL430
+	.8byte	.LVL431
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL434
-	.8byte	.LVL438
+	.8byte	.LVL432
+	.8byte	.LVL436
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL439
-	.8byte	.LFE2820
+	.8byte	.LVL437
+	.8byte	.LFE2821
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST142:
-	.8byte	.LVL426
-	.8byte	.LVL427
+.LLST140:
+	.8byte	.LVL424
+	.8byte	.LVL425
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST143:
-	.8byte	.LVL375
-	.8byte	.LVL376
+.LLST141:
+	.8byte	.LVL373
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL428
-	.8byte	.LFE2820
+	.8byte	.LVL426
+	.8byte	.LFE2821
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
 .LLST6:
 	.8byte	.LVL36
-	.8byte	.LVL63
-	.2byte	0x1
-	.byte	0x5e
-	.8byte	0
-	.8byte	0
-.LLST7:
-	.8byte	.LVL35
-	.8byte	.LVL63
-	.2byte	0x1
-	.byte	0x5c
-	.8byte	0
-	.8byte	0
-.LLST8:
-	.8byte	.LVL37
-	.8byte	.LVL38
+	.8byte	.LVL45
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL39
+	.byte	0x56
 	.8byte	.LVL46
-	.2byte	0x1
-	.byte	0x55
 	.8byte	.LVL48
-	.8byte	.LVL50
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x56
+	.8byte	.LVL49
 	.8byte	.LVL51
-	.8byte	.LVL52
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x56
+	.8byte	.LVL52
 	.8byte	.LVL53
-	.8byte	.LVL54
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x56
+	.8byte	.LVL54
 	.8byte	.LVL55
-	.8byte	.LVL56
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x56
+	.8byte	.LVL56
 	.8byte	.LVL57
-	.8byte	.LVL58
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x56
+	.8byte	.LVL58
 	.8byte	.LVL59
-	.8byte	.LVL60
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL61
-	.8byte	.LVL63
+	.byte	0x56
+	.8byte	.LVL60
+	.8byte	.LFE2815
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST9:
+.LLST7:
+	.8byte	.LVL36
 	.8byte	.LVL37
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL38
+	.8byte	.LVL40
+	.2byte	0x1
+	.byte	0x55
 	.8byte	.LVL41
+	.8byte	.LVL43
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL42
+	.byte	0x55
+	.8byte	.LVL44
 	.8byte	.LVL47
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL49
-	.8byte	.LVL63
+	.byte	0x55
+	.8byte	.LVL50
+	.8byte	.LFE2815
 	.2byte	0x1
-	.byte	0x57
+	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST10:
+.LLST8:
+	.8byte	.LVL38
 	.8byte	.LVL39
-	.8byte	.LVL40
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL62
-	.8byte	.LVL63
+	.8byte	.LVL61
+	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST11:
-	.8byte	.LVL37
-	.8byte	.LVL43
+.LLST9:
+	.8byte	.LVL36
+	.8byte	.LVL42
 	.2byte	0x1
 	.byte	0x58
 	.8byte	.LVL44
-	.8byte	.LVL45
+	.8byte	.LVL47
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL49
-	.8byte	.LVL63
+	.8byte	.LVL50
+	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
@@ -54915,210 +55076,210 @@ __exitcall_ebc_exit:
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST234:
-	.8byte	.LVL837
-	.8byte	.LVL839
+.LLST231:
+	.8byte	.LVL818
+	.8byte	.LVL820
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST235:
-	.8byte	.LVL838
-	.8byte	.LVL841
+.LLST232:
+	.8byte	.LVL819
+	.8byte	.LVL822
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST236:
-	.8byte	.LVL841
-	.8byte	.LVL844
+.LLST233:
+	.8byte	.LVL822
+	.8byte	.LVL825
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL845
-	.8byte	.LVL848
+	.8byte	.LVL826
+	.8byte	.LVL829
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST230:
-	.8byte	.LVL826
-	.8byte	.LVL831
+.LLST227:
+	.8byte	.LVL807
+	.8byte	.LVL812
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL836
-	.8byte	.LFE2810
+	.8byte	.LVL817
+	.8byte	.LFE2811
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST231:
-	.8byte	.LVL832
-	.8byte	.LVL833
+.LLST228:
+	.8byte	.LVL813
+	.8byte	.LVL814
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST232:
-	.8byte	.LVL830
-	.8byte	.LVL834
+.LLST229:
+	.8byte	.LVL811
+	.8byte	.LVL815
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST233:
-	.8byte	.LVL833
-	.8byte	.LVL835
+.LLST230:
+	.8byte	.LVL814
+	.8byte	.LVL816
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST224:
-	.8byte	.LVL804
-	.8byte	.LVL810
+.LLST221:
+	.8byte	.LVL785
+	.8byte	.LVL791
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL814
-	.8byte	.LVL815
+	.8byte	.LVL795
+	.8byte	.LVL796
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL824
-	.8byte	.LVL825
+	.8byte	.LVL805
+	.8byte	.LVL806
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST225:
-	.8byte	.LVL804
-	.8byte	.LVL805
+.LLST222:
+	.8byte	.LVL785
+	.8byte	.LVL786
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST226:
-	.8byte	.LVL810
-	.8byte	.LVL813
+.LLST223:
+	.8byte	.LVL791
+	.8byte	.LVL794
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL817
-	.8byte	.LVL822
+	.8byte	.LVL798
+	.8byte	.LVL803
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL825
-	.8byte	.LFE2809
+	.8byte	.LVL806
+	.8byte	.LFE2810
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST227:
-	.8byte	.LVL809
-	.8byte	.LVL810
+.LLST224:
+	.8byte	.LVL790
+	.8byte	.LVL791
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL812
-	.8byte	.LVL816
+	.8byte	.LVL793
+	.8byte	.LVL797
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL821
-	.8byte	.LVL825
+	.8byte	.LVL802
+	.8byte	.LVL806
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST228:
-	.8byte	.LVL809
-	.8byte	.LVL811
+.LLST225:
+	.8byte	.LVL790
+	.8byte	.LVL792
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL812
-	.8byte	.LVL820
+	.8byte	.LVL793
+	.8byte	.LVL801
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL823
-	.8byte	.LFE2809
+	.8byte	.LVL804
+	.8byte	.LFE2810
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST229:
-	.8byte	.LVL809
-	.8byte	.LVL818
+.LLST226:
+	.8byte	.LVL790
+	.8byte	.LVL799
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL819
-	.8byte	.LFE2809
+	.8byte	.LVL800
+	.8byte	.LFE2810
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST12:
-	.8byte	.LVL64
-	.8byte	.LVL65
+.LLST10:
+	.8byte	.LVL62
+	.8byte	.LVL63
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST190:
-	.8byte	.LVL540
-	.8byte	.LVL541
+.LLST188:
+	.8byte	.LVL538
+	.8byte	.LVL539
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL541
-	.8byte	.LVL546
+	.8byte	.LVL539
+	.8byte	.LVL544
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL547
-	.8byte	.LFE2877
+	.8byte	.LVL545
+	.8byte	.LFE2878
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST193:
-	.8byte	.LVL592
-	.8byte	.LVL594
+.LLST190:
+	.8byte	.LVL573
+	.8byte	.LVL575
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL594
-	.8byte	.LVL598
+	.8byte	.LVL575
+	.8byte	.LVL579
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL599
-	.8byte	.LVL602
+	.8byte	.LVL580
+	.8byte	.LVL583
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST194:
-	.8byte	.LVL592
-	.8byte	.LVL593
+.LLST191:
+	.8byte	.LVL573
+	.8byte	.LVL574
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST196:
-	.8byte	.LVL610
-	.8byte	.LVL611-1
+.LLST193:
+	.8byte	.LVL591
+	.8byte	.LVL592-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST197:
-	.8byte	.LVL609
-	.8byte	.LVL611-1
+.LLST194:
+	.8byte	.LVL590
+	.8byte	.LVL592-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST223:
-	.8byte	.LVL796
-	.8byte	.LVL797
+.LLST220:
+	.8byte	.LVL777
+	.8byte	.LVL778
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL797
-	.8byte	.LVL801
+	.8byte	.LVL778
+	.8byte	.LVL782
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL802
-	.8byte	.LFE2884
+	.8byte	.LVL783
+	.8byte	.LFE2886
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -55133,350 +55294,348 @@ __exitcall_ebc_exit:
 	.2byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0-.Ltext0
+	.8byte	.LFB2866
+	.8byte	.LFE2866-.LFB2866
 	.8byte	.LFB2865
 	.8byte	.LFE2865-.LFB2865
-	.8byte	.LFB2864
-	.8byte	.LFE2864-.LFB2864
 	.8byte	0
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
 .Ldebug_ranges0:
-	.8byte	.LBB954
-	.8byte	.LBE954
-	.8byte	.LBB957
-	.8byte	.LBE957
+	.8byte	.LBB956
+	.8byte	.LBE956
+	.8byte	.LBB959
+	.8byte	.LBE959
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB958
-	.8byte	.LBE958
-	.8byte	.LBB989
-	.8byte	.LBE989
-	.8byte	.LBB990
-	.8byte	.LBE990
-	.8byte	.LBB1055
-	.8byte	.LBE1055
+	.8byte	.LBB960
+	.8byte	.LBE960
+	.8byte	.LBB991
+	.8byte	.LBE991
+	.8byte	.LBB992
+	.8byte	.LBE992
+	.8byte	.LBB1057
+	.8byte	.LBE1057
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB961
-	.8byte	.LBE961
-	.8byte	.LBB973
-	.8byte	.LBE973
-	.8byte	.LBB974
-	.8byte	.LBE974
+	.8byte	.LBB963
+	.8byte	.LBE963
+	.8byte	.LBB975
+	.8byte	.LBE975
+	.8byte	.LBB976
+	.8byte	.LBE976
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB977
-	.8byte	.LBE977
-	.8byte	.LBB982
-	.8byte	.LBE982
+	.8byte	.LBB979
+	.8byte	.LBE979
+	.8byte	.LBB984
+	.8byte	.LBE984
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB991
-	.8byte	.LBE991
-	.8byte	.LBB1212
-	.8byte	.LBE1212
-	.8byte	.LBB1213
-	.8byte	.LBE1213
+	.8byte	.LBB993
+	.8byte	.LBE993
+	.8byte	.LBB1214
+	.8byte	.LBE1214
+	.8byte	.LBB1215
+	.8byte	.LBE1215
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB994
-	.8byte	.LBE994
-	.8byte	.LBB1014
-	.8byte	.LBE1014
-	.8byte	.LBB1015
-	.8byte	.LBE1015
+	.8byte	.LBB996
+	.8byte	.LBE996
+	.8byte	.LBB1016
+	.8byte	.LBE1016
+	.8byte	.LBB1017
+	.8byte	.LBE1017
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1008
-	.8byte	.LBE1008
-	.8byte	.LBB1013
-	.8byte	.LBE1013
+	.8byte	.LBB1010
+	.8byte	.LBE1010
+	.8byte	.LBB1015
+	.8byte	.LBE1015
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1020
-	.8byte	.LBE1020
-	.8byte	.LBB1223
-	.8byte	.LBE1223
+	.8byte	.LBB1022
+	.8byte	.LBE1022
 	.8byte	.LBB1225
 	.8byte	.LBE1225
-	.8byte	.LBB1226
-	.8byte	.LBE1226
+	.8byte	.LBB1227
+	.8byte	.LBE1227
+	.8byte	.LBB1228
+	.8byte	.LBE1228
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1026
-	.8byte	.LBE1026
-	.8byte	.LBB1210
-	.8byte	.LBE1210
-	.8byte	.LBB1211
-	.8byte	.LBE1211
+	.8byte	.LBB1028
+	.8byte	.LBE1028
+	.8byte	.LBB1212
+	.8byte	.LBE1212
+	.8byte	.LBB1213
+	.8byte	.LBE1213
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1029
-	.8byte	.LBE1029
-	.8byte	.LBB1049
-	.8byte	.LBE1049
+	.8byte	.LBB1031
+	.8byte	.LBE1031
+	.8byte	.LBB1051
+	.8byte	.LBE1051
+	.8byte	.LBB1052
+	.8byte	.LBE1052
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1045
+	.8byte	.LBE1045
 	.8byte	.LBB1050
 	.8byte	.LBE1050
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1043
-	.8byte	.LBE1043
-	.8byte	.LBB1048
-	.8byte	.LBE1048
+	.8byte	.LBB1058
+	.8byte	.LBE1058
+	.8byte	.LBB1091
+	.8byte	.LBE1091
+	.8byte	.LBB1222
+	.8byte	.LBE1222
+	.8byte	.LBB1223
+	.8byte	.LBE1223
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1056
-	.8byte	.LBE1056
-	.8byte	.LBB1089
-	.8byte	.LBE1089
-	.8byte	.LBB1220
-	.8byte	.LBE1220
-	.8byte	.LBB1221
-	.8byte	.LBE1221
+	.8byte	.LBB1061
+	.8byte	.LBE1061
+	.8byte	.LBB1074
+	.8byte	.LBE1074
+	.8byte	.LBB1083
+	.8byte	.LBE1083
+	.8byte	.LBB1084
+	.8byte	.LBE1084
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1059
-	.8byte	.LBE1059
-	.8byte	.LBB1072
-	.8byte	.LBE1072
-	.8byte	.LBB1081
-	.8byte	.LBE1081
+	.8byte	.LBB1077
+	.8byte	.LBE1077
 	.8byte	.LBB1082
 	.8byte	.LBE1082
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1075
-	.8byte	.LBE1075
-	.8byte	.LBB1080
-	.8byte	.LBE1080
+	.8byte	.LBB1092
+	.8byte	.LBE1092
+	.8byte	.LBB1127
+	.8byte	.LBE1127
+	.8byte	.LBB1218
+	.8byte	.LBE1218
+	.8byte	.LBB1219
+	.8byte	.LBE1219
+	.8byte	.LBB1229
+	.8byte	.LBE1229
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1090
-	.8byte	.LBE1090
-	.8byte	.LBB1125
-	.8byte	.LBE1125
-	.8byte	.LBB1216
-	.8byte	.LBE1216
-	.8byte	.LBB1217
-	.8byte	.LBE1217
-	.8byte	.LBB1227
-	.8byte	.LBE1227
+	.8byte	.LBB1095
+	.8byte	.LBE1095
+	.8byte	.LBB1108
+	.8byte	.LBE1108
+	.8byte	.LBB1117
+	.8byte	.LBE1117
+	.8byte	.LBB1118
+	.8byte	.LBE1118
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1093
-	.8byte	.LBE1093
-	.8byte	.LBB1106
-	.8byte	.LBE1106
-	.8byte	.LBB1115
-	.8byte	.LBE1115
+	.8byte	.LBB1111
+	.8byte	.LBE1111
 	.8byte	.LBB1116
 	.8byte	.LBE1116
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1109
-	.8byte	.LBE1109
-	.8byte	.LBB1114
-	.8byte	.LBE1114
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1126
-	.8byte	.LBE1126
-	.8byte	.LBB1137
-	.8byte	.LBE1137
+	.8byte	.LBB1128
+	.8byte	.LBE1128
+	.8byte	.LBB1139
+	.8byte	.LBE1139
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1129
-	.8byte	.LBE1129
-	.8byte	.LBB1134
-	.8byte	.LBE1134
+	.8byte	.LBB1131
+	.8byte	.LBE1131
+	.8byte	.LBB1136
+	.8byte	.LBE1136
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1130
-	.8byte	.LBE1130
-	.8byte	.LBB1133
-	.8byte	.LBE1133
+	.8byte	.LBB1132
+	.8byte	.LBE1132
+	.8byte	.LBB1135
+	.8byte	.LBE1135
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1138
-	.8byte	.LBE1138
-	.8byte	.LBB1173
-	.8byte	.LBE1173
-	.8byte	.LBB1214
-	.8byte	.LBE1214
-	.8byte	.LBB1215
-	.8byte	.LBE1215
-	.8byte	.LBB1222
-	.8byte	.LBE1222
+	.8byte	.LBB1140
+	.8byte	.LBE1140
+	.8byte	.LBB1175
+	.8byte	.LBE1175
+	.8byte	.LBB1216
+	.8byte	.LBE1216
+	.8byte	.LBB1217
+	.8byte	.LBE1217
+	.8byte	.LBB1224
+	.8byte	.LBE1224
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1141
-	.8byte	.LBE1141
-	.8byte	.LBB1154
-	.8byte	.LBE1154
-	.8byte	.LBB1155
-	.8byte	.LBE1155
+	.8byte	.LBB1143
+	.8byte	.LBE1143
 	.8byte	.LBB1156
 	.8byte	.LBE1156
+	.8byte	.LBB1157
+	.8byte	.LBE1157
+	.8byte	.LBB1158
+	.8byte	.LBE1158
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1159
-	.8byte	.LBE1159
-	.8byte	.LBB1164
-	.8byte	.LBE1164
+	.8byte	.LBB1161
+	.8byte	.LBE1161
+	.8byte	.LBB1166
+	.8byte	.LBE1166
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1174
-	.8byte	.LBE1174
-	.8byte	.LBB1209
-	.8byte	.LBE1209
-	.8byte	.LBB1218
-	.8byte	.LBE1218
-	.8byte	.LBB1219
-	.8byte	.LBE1219
-	.8byte	.LBB1224
-	.8byte	.LBE1224
+	.8byte	.LBB1176
+	.8byte	.LBE1176
+	.8byte	.LBB1211
+	.8byte	.LBE1211
+	.8byte	.LBB1220
+	.8byte	.LBE1220
+	.8byte	.LBB1221
+	.8byte	.LBE1221
+	.8byte	.LBB1226
+	.8byte	.LBE1226
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1177
-	.8byte	.LBE1177
-	.8byte	.LBB1190
-	.8byte	.LBE1190
-	.8byte	.LBB1191
-	.8byte	.LBE1191
+	.8byte	.LBB1179
+	.8byte	.LBE1179
 	.8byte	.LBB1192
 	.8byte	.LBE1192
+	.8byte	.LBB1193
+	.8byte	.LBE1193
+	.8byte	.LBB1194
+	.8byte	.LBE1194
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1195
-	.8byte	.LBE1195
-	.8byte	.LBB1200
-	.8byte	.LBE1200
+	.8byte	.LBB1197
+	.8byte	.LBE1197
+	.8byte	.LBB1202
+	.8byte	.LBE1202
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1232
-	.8byte	.LBE1232
-	.8byte	.LBB1235
-	.8byte	.LBE1235
+	.8byte	.LBB1234
+	.8byte	.LBE1234
+	.8byte	.LBB1237
+	.8byte	.LBE1237
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1266
-	.8byte	.LBE1266
-	.8byte	.LBB1278
-	.8byte	.LBE1278
+	.8byte	.LBB1268
+	.8byte	.LBE1268
 	.8byte	.LBB1280
 	.8byte	.LBE1280
 	.8byte	.LBB1282
 	.8byte	.LBE1282
+	.8byte	.LBB1284
+	.8byte	.LBE1284
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1271
-	.8byte	.LBE1271
-	.8byte	.LBB1279
-	.8byte	.LBE1279
+	.8byte	.LBB1273
+	.8byte	.LBE1273
 	.8byte	.LBB1281
 	.8byte	.LBE1281
-	.8byte	.LBB1290
-	.8byte	.LBE1290
+	.8byte	.LBB1283
+	.8byte	.LBE1283
 	.8byte	.LBB1292
 	.8byte	.LBE1292
 	.8byte	.LBB1294
 	.8byte	.LBE1294
+	.8byte	.LBB1296
+	.8byte	.LBE1296
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1283
-	.8byte	.LBE1283
-	.8byte	.LBB1291
-	.8byte	.LBE1291
+	.8byte	.LBB1285
+	.8byte	.LBE1285
 	.8byte	.LBB1293
 	.8byte	.LBE1293
-	.8byte	.LBB1300
-	.8byte	.LBE1300
+	.8byte	.LBB1295
+	.8byte	.LBE1295
 	.8byte	.LBB1302
 	.8byte	.LBE1302
 	.8byte	.LBB1304
 	.8byte	.LBE1304
+	.8byte	.LBB1306
+	.8byte	.LBE1306
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1295
-	.8byte	.LBE1295
-	.8byte	.LBB1301
-	.8byte	.LBE1301
+	.8byte	.LBB1297
+	.8byte	.LBE1297
 	.8byte	.LBB1303
 	.8byte	.LBE1303
 	.8byte	.LBB1305
 	.8byte	.LBE1305
+	.8byte	.LBB1307
+	.8byte	.LBE1307
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1310
-	.8byte	.LBE1310
-	.8byte	.LBB1316
-	.8byte	.LBE1316
-	.8byte	.LBB1322
-	.8byte	.LBE1322
+	.8byte	.LBB1312
+	.8byte	.LBE1312
+	.8byte	.LBB1318
+	.8byte	.LBE1318
 	.8byte	.LBB1324
 	.8byte	.LBE1324
 	.8byte	.LBB1326
 	.8byte	.LBE1326
+	.8byte	.LBB1328
+	.8byte	.LBE1328
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1317
-	.8byte	.LBE1317
-	.8byte	.LBB1323
-	.8byte	.LBE1323
+	.8byte	.LBB1319
+	.8byte	.LBE1319
 	.8byte	.LBB1325
 	.8byte	.LBE1325
 	.8byte	.LBB1327
 	.8byte	.LBE1327
+	.8byte	.LBB1329
+	.8byte	.LBE1329
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1330
-	.8byte	.LBE1330
-	.8byte	.LBB1343
-	.8byte	.LBE1343
+	.8byte	.LBB1332
+	.8byte	.LBE1332
 	.8byte	.LBB1345
 	.8byte	.LBE1345
 	.8byte	.LBB1347
 	.8byte	.LBE1347
 	.8byte	.LBB1349
 	.8byte	.LBE1349
+	.8byte	.LBB1351
+	.8byte	.LBE1351
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1336
-	.8byte	.LBE1336
-	.8byte	.LBB1342
-	.8byte	.LBE1342
+	.8byte	.LBB1338
+	.8byte	.LBE1338
 	.8byte	.LBB1344
 	.8byte	.LBE1344
 	.8byte	.LBB1346
 	.8byte	.LBE1346
 	.8byte	.LBB1348
 	.8byte	.LBE1348
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1378
-	.8byte	.LBE1378
-	.8byte	.LBB1392
-	.8byte	.LBE1392
-	.8byte	.LBB1420
-	.8byte	.LBE1420
+	.8byte	.LBB1350
+	.8byte	.LBE1350
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1380
 	.8byte	.LBE1380
-	.8byte	.LBB1389
-	.8byte	.LBE1389
+	.8byte	.LBB1394
+	.8byte	.LBE1394
+	.8byte	.LBB1422
+	.8byte	.LBE1422
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1395
-	.8byte	.LBE1395
-	.8byte	.LBB1421
-	.8byte	.LBE1421
+	.8byte	.LBB1382
+	.8byte	.LBE1382
+	.8byte	.LBB1391
+	.8byte	.LBE1391
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1397
 	.8byte	.LBE1397
-	.8byte	.LBB1410
-	.8byte	.LBE1410
+	.8byte	.LBB1423
+	.8byte	.LBE1423
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1399
+	.8byte	.LBE1399
 	.8byte	.LBB1412
 	.8byte	.LBE1412
 	.8byte	.LBB1414
@@ -55485,196 +55644,192 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1416
 	.8byte	.LBB1418
 	.8byte	.LBE1418
+	.8byte	.LBB1420
+	.8byte	.LBE1420
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1404
-	.8byte	.LBE1404
-	.8byte	.LBB1411
-	.8byte	.LBE1411
+	.8byte	.LBB1406
+	.8byte	.LBE1406
 	.8byte	.LBB1413
 	.8byte	.LBE1413
 	.8byte	.LBB1415
 	.8byte	.LBE1415
 	.8byte	.LBB1417
 	.8byte	.LBE1417
+	.8byte	.LBB1419
+	.8byte	.LBE1419
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1424
-	.8byte	.LBE1424
-	.8byte	.LBB1436
-	.8byte	.LBE1436
+	.8byte	.LBB1426
+	.8byte	.LBE1426
 	.8byte	.LBB1438
 	.8byte	.LBE1438
-	.8byte	.LBB1439
-	.8byte	.LBE1439
+	.8byte	.LBB1440
+	.8byte	.LBE1440
 	.8byte	.LBB1441
 	.8byte	.LBE1441
 	.8byte	.LBB1443
 	.8byte	.LBE1443
+	.8byte	.LBB1445
+	.8byte	.LBE1445
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1431
-	.8byte	.LBE1431
-	.8byte	.LBB1437
-	.8byte	.LBE1437
-	.8byte	.LBB1440
-	.8byte	.LBE1440
+	.8byte	.LBB1433
+	.8byte	.LBE1433
+	.8byte	.LBB1439
+	.8byte	.LBE1439
 	.8byte	.LBB1442
 	.8byte	.LBE1442
-	.8byte	0
-	.8byte	0
 	.8byte	.LBB1444
 	.8byte	.LBE1444
-	.8byte	.LBB1453
-	.8byte	.LBE1453
-	.8byte	.LBB1454
-	.8byte	.LBE1454
-	.8byte	.LBB1465
-	.8byte	.LBE1465
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1446
 	.8byte	.LBE1446
-	.8byte	.LBB1449
-	.8byte	.LBE1449
-	.8byte	0
-	.8byte	0
 	.8byte	.LBB1455
 	.8byte	.LBE1455
-	.8byte	.LBB1459
-	.8byte	.LBE1459
-	.8byte	.LBB1460
-	.8byte	.LBE1460
+	.8byte	.LBB1456
+	.8byte	.LBE1456
+	.8byte	.LBB1467
+	.8byte	.LBE1467
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1474
-	.8byte	.LBE1474
-	.8byte	.LBB1481
-	.8byte	.LBE1481
-	.8byte	.LBB1482
-	.8byte	.LBE1482
+	.8byte	.LBB1448
+	.8byte	.LBE1448
+	.8byte	.LBB1451
+	.8byte	.LBE1451
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1475
-	.8byte	.LBE1475
-	.8byte	.LBB1480
-	.8byte	.LBE1480
+	.8byte	.LBB1457
+	.8byte	.LBE1457
+	.8byte	.LBB1461
+	.8byte	.LBE1461
+	.8byte	.LBB1462
+	.8byte	.LBE1462
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1483
-	.8byte	.LBE1483
-	.8byte	.LBB1486
-	.8byte	.LBE1486
+	.8byte	.LBB1632
+	.8byte	.LBE1632
+	.8byte	.LBB1635
+	.8byte	.LBE1635
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1643
-	.8byte	.LBE1643
-	.8byte	.LBB1646
-	.8byte	.LBE1646
+	.8byte	.LBB1642
+	.8byte	.LBE1642
+	.8byte	.LBB1716
+	.8byte	.LBE1716
+	.8byte	.LBB1717
+	.8byte	.LBE1717
+	.8byte	.LBB1718
+	.8byte	.LBE1718
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1644
+	.8byte	.LBE1644
 	.8byte	.LBB1653
 	.8byte	.LBE1653
-	.8byte	.LBB1727
-	.8byte	.LBE1727
-	.8byte	.LBB1728
-	.8byte	.LBE1728
-	.8byte	.LBB1729
-	.8byte	.LBE1729
-	.8byte	0
-	.8byte	0
+	.8byte	.LBB1654
+	.8byte	.LBE1654
 	.8byte	.LBB1655
 	.8byte	.LBE1655
-	.8byte	.LBB1664
-	.8byte	.LBE1664
-	.8byte	.LBB1665
-	.8byte	.LBE1665
-	.8byte	.LBB1666
-	.8byte	.LBE1666
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1730
-	.8byte	.LBE1730
+	.8byte	.LBB1719
+	.8byte	.LBE1719
+	.8byte	.LBB1734
+	.8byte	.LBE1734
+	.8byte	.LBB1735
+	.8byte	.LBE1735
 	.8byte	.LBB1745
 	.8byte	.LBE1745
-	.8byte	.LBB1746
-	.8byte	.LBE1746
-	.8byte	.LBB1756
-	.8byte	.LBE1756
-	.8byte	.LBB1808
-	.8byte	.LBE1808
-	.8byte	.LBB1811
-	.8byte	.LBE1811
+	.8byte	.LBB1797
+	.8byte	.LBE1797
+	.8byte	.LBB1800
+	.8byte	.LBE1800
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1732
-	.8byte	.LBE1732
-	.8byte	.LBB1735
-	.8byte	.LBE1735
+	.8byte	.LBB1721
+	.8byte	.LBE1721
+	.8byte	.LBB1724
+	.8byte	.LBE1724
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1725
+	.8byte	.LBE1725
+	.8byte	.LBB1728
+	.8byte	.LBE1728
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1736
 	.8byte	.LBE1736
-	.8byte	.LBB1739
-	.8byte	.LBE1739
+	.8byte	.LBB1746
+	.8byte	.LBE1746
+	.8byte	.LBB1796
+	.8byte	.LBE1796
+	.8byte	.LBB1801
+	.8byte	.LBE1801
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1738
+	.8byte	.LBE1738
+	.8byte	.LBB1741
+	.8byte	.LBE1741
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1747
 	.8byte	.LBE1747
-	.8byte	.LBB1757
-	.8byte	.LBE1757
-	.8byte	.LBB1807
-	.8byte	.LBE1807
-	.8byte	.LBB1812
-	.8byte	.LBE1812
+	.8byte	.LBB1798
+	.8byte	.LBE1798
+	.8byte	.LBB1799
+	.8byte	.LBE1799
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1749
 	.8byte	.LBE1749
-	.8byte	.LBB1752
-	.8byte	.LBE1752
+	.8byte	.LBB1755
+	.8byte	.LBE1755
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1758
 	.8byte	.LBE1758
-	.8byte	.LBB1809
-	.8byte	.LBE1809
-	.8byte	.LBB1810
-	.8byte	.LBE1810
+	.8byte	.LBB1759
+	.8byte	.LBE1759
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1760
-	.8byte	.LBE1760
 	.8byte	.LBB1766
 	.8byte	.LBE1766
+	.8byte	.LBB1772
+	.8byte	.LBE1772
+	.8byte	.LBB1773
+	.8byte	.LBE1773
+	.8byte	.LBB1774
+	.8byte	.LBE1774
+	.8byte	.LBB1775
+	.8byte	.LBE1775
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1769
-	.8byte	.LBE1769
-	.8byte	.LBB1770
-	.8byte	.LBE1770
+	.8byte	.LBB1776
+	.8byte	.LBE1776
+	.8byte	.LBB1794
+	.8byte	.LBE1794
+	.8byte	.LBB1795
+	.8byte	.LBE1795
+	.8byte	.LBB1802
+	.8byte	.LBE1802
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1777
-	.8byte	.LBE1777
-	.8byte	.LBB1783
-	.8byte	.LBE1783
-	.8byte	.LBB1784
-	.8byte	.LBE1784
-	.8byte	.LBB1785
-	.8byte	.LBE1785
-	.8byte	.LBB1786
-	.8byte	.LBE1786
+	.8byte	.LBB1809
+	.8byte	.LBE1809
+	.8byte	.LBB1816
+	.8byte	.LBE1816
+	.8byte	.LBB1817
+	.8byte	.LBE1817
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1787
-	.8byte	.LBE1787
-	.8byte	.LBB1805
-	.8byte	.LBE1805
-	.8byte	.LBB1806
-	.8byte	.LBE1806
-	.8byte	.LBB1813
-	.8byte	.LBE1813
+	.8byte	.LBB1810
+	.8byte	.LBE1810
+	.8byte	.LBB1815
+	.8byte	.LBE1815
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1848
@@ -55695,66 +55850,64 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	.LBB1857
 	.8byte	.LBE1857
-	.8byte	.LBB1861
-	.8byte	.LBE1861
-	.8byte	.LBB1862
-	.8byte	.LBE1862
+	.8byte	.LBB1887
+	.8byte	.LBE1887
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1863
-	.8byte	.LBE1863
-	.8byte	.LBB1869
-	.8byte	.LBE1869
-	.8byte	.LBB1870
-	.8byte	.LBE1870
-	.8byte	.LBB1888
-	.8byte	.LBE1888
-	.8byte	.LBB1889
-	.8byte	.LBE1889
+	.8byte	.LBB1860
+	.8byte	.LBE1860
+	.8byte	.LBB1866
+	.8byte	.LBE1866
+	.8byte	.LBB1867
+	.8byte	.LBE1867
+	.8byte	.LBB1885
+	.8byte	.LBE1885
+	.8byte	.LBB1886
+	.8byte	.LBE1886
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1873
+	.8byte	.LBE1873
 	.8byte	.LBB1876
 	.8byte	.LBE1876
-	.8byte	.LBB1879
-	.8byte	.LBE1879
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1877
+	.8byte	.LBE1877
+	.8byte	.LBB1895
+	.8byte	.LBE1895
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1879
+	.8byte	.LBE1879
 	.8byte	.LBB1880
 	.8byte	.LBE1880
-	.8byte	.LBB1897
-	.8byte	.LBE1897
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1882
-	.8byte	.LBE1882
-	.8byte	.LBB1883
-	.8byte	.LBE1883
+	.8byte	.LBB1881
+	.8byte	.LBE1881
+	.8byte	.LBB1894
+	.8byte	.LBE1894
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1883
+	.8byte	.LBE1883
 	.8byte	.LBB1884
 	.8byte	.LBE1884
-	.8byte	.LBB1896
-	.8byte	.LBE1896
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1886
-	.8byte	.LBE1886
-	.8byte	.LBB1887
-	.8byte	.LBE1887
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1890
-	.8byte	.LBE1890
-	.8byte	.LBB1893
-	.8byte	.LBE1893
+	.8byte	.LBB1888
+	.8byte	.LBE1888
+	.8byte	.LBB1891
+	.8byte	.LBE1891
 	.8byte	0
 	.8byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0
+	.8byte	.LFB2866
+	.8byte	.LFE2866
 	.8byte	.LFB2865
 	.8byte	.LFE2865
-	.8byte	.LFB2864
-	.8byte	.LFE2864
 	.8byte	0
 	.8byte	0
 	.section	.debug_line,"",@progbits
@@ -55836,7 +55989,7 @@ __exitcall_ebc_exit:
 	.string	"dev_kobj"
 .LASF475:
 	.string	"d_release"
-.LASF3198:
+.LASF3200:
 	.string	"get_arch_dma_ops"
 .LASF305:
 	.string	"__ctors_start"
@@ -55870,7 +56023,7 @@ __exitcall_ebc_exit:
 	.string	"si_code"
 .LASF649:
 	.string	"thread_node"
-.LASF3125:
+.LASF3126:
 	.string	"temperature"
 .LASF1316:
 	.string	"map_pages"
@@ -55912,9 +56065,9 @@ __exitcall_ebc_exit:
 	.string	"gpio_desc"
 .LASF976:
 	.string	"list"
-.LASF3215:
+.LASF3217:
 	.string	"_copy_from_user"
-.LASF3241:
+.LASF3243:
 	.string	"get_order"
 .LASF959:
 	.string	"si_errno"
@@ -55974,7 +56127,7 @@ __exitcall_ebc_exit:
 	.string	"n_node"
 .LASF1638:
 	.string	"qsize_t"
-.LASF3238:
+.LASF3240:
 	.string	"devm_kzalloc"
 .LASF380:
 	.string	"sequence"
@@ -55990,7 +56143,7 @@ __exitcall_ebc_exit:
 	.string	"s_state"
 .LASF1080:
 	.string	"run_list"
-.LASF3153:
+.LASF3155:
 	.string	"clac_full_data_align8"
 .LASF2567:
 	.string	"SCHED_SOFTIRQ"
@@ -56066,7 +56219,7 @@ __exitcall_ebc_exit:
 	.string	"size_t"
 .LASF209:
 	.string	"compat_elf_hwcap"
-.LASF3316:
+.LASF3318:
 	.string	"prepare_to_wait_event"
 .LASF1124:
 	.string	"cap_permitted"
@@ -56108,7 +56261,7 @@ __exitcall_ebc_exit:
 	.string	"__reserved"
 .LASF954:
 	.string	"_sigfault"
-.LASF3167:
+.LASF3169:
 	.string	"image_bg"
 .LASF2872:
 	.string	"ebc_buf_status"
@@ -56198,9 +56351,9 @@ __exitcall_ebc_exit:
 	.string	"irqchip_fwnode_ops"
 .LASF1628:
 	.string	"dq_id"
-.LASF3158:
+.LASF3160:
 	.string	"frame_count_tmp"
-.LASF3166:
+.LASF3168:
 	.string	"image_fb"
 .LASF1803:
 	.string	"write_end"
@@ -56208,7 +56361,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ION_HEAP_POOL"
 .LASF1438:
 	.string	"sysctl_protected_hardlinks"
-.LASF3320:
+.LASF3322:
 	.string	"__arch_copy_from_user"
 .LASF1191:
 	.string	"scan_objects"
@@ -56216,7 +56369,7 @@ __exitcall_ebc_exit:
 	.string	"pageset"
 .LASF1252:
 	.string	"wb_err"
-.LASF3212:
+.LASF3214:
 	.string	"copy_to_user"
 .LASF735:
 	.string	"trace_recursion"
@@ -56296,7 +56449,7 @@ __exitcall_ebc_exit:
 	.string	"poll"
 .LASF2458:
 	.string	"graph_get_next_endpoint"
-.LASF3150:
+.LASF3152:
 	.string	"clac_full_data_32_to_16"
 .LASF1424:
 	.string	"io_cq"
@@ -56330,7 +56483,7 @@ __exitcall_ebc_exit:
 	.string	"pcpu_chosen_fc"
 .LASF391:
 	.string	"dentry_stat_t"
-.LASF3265:
+.LASF3267:
 	.string	"atomic_add"
 .LASF1657:
 	.string	"dqi_bgrace"
@@ -56348,7 +56501,7 @@ __exitcall_ebc_exit:
 	.string	"ctl_table"
 .LASF44:
 	.string	"uid_t"
-.LASF3295:
+.LASF3297:
 	.string	"strstr"
 .LASF2862:
 	.string	"WF_TYPE_A2"
@@ -56372,7 +56525,7 @@ __exitcall_ebc_exit:
 	.string	"panel_buffer"
 .LASF317:
 	.string	"__exception_text_end"
-.LASF3143:
+.LASF3145:
 	.string	"clac_part_data_16_to_32"
 .LASF2748:
 	.string	"sh_addr"
@@ -56412,7 +56565,7 @@ __exitcall_ebc_exit:
 	.string	"pteval_t"
 .LASF430:
 	.string	"i_ino"
-.LASF3339:
+.LASF3342:
 	.string	"might_fault"
 .LASF1576:
 	.string	"compact_cached_free_pfn"
@@ -56502,7 +56655,7 @@ __exitcall_ebc_exit:
 	.string	"seq_operations"
 .LASF638:
 	.string	"stack_canary"
-.LASF3122:
+.LASF3123:
 	.string	"no_black_count"
 .LASF1175:
 	.string	"blksize"
@@ -56530,11 +56683,9 @@ __exitcall_ebc_exit:
 	.string	"bus_dma_mask"
 .LASF562:
 	.string	"pidfd_fops"
-.LASF3044:
-	.string	"__addressable_ebc_init3119"
 .LASF1931:
 	.string	"lm_put_owner"
-.LASF3297:
+.LASF3299:
 	.string	"ebc_pmic_verity_vcom"
 .LASF2538:
 	.string	"set_sda"
@@ -56558,6 +56709,8 @@ __exitcall_ebc_exit:
 	.string	"dquot"
 .LASF1087:
 	.string	"dl_runtime"
+.LASF3127:
+	.string	"lut_type"
 .LASF85:
 	.string	"initcall_debug"
 .LASF560:
@@ -56642,7 +56795,7 @@ __exitcall_ebc_exit:
 	.string	"sysfs_dev_block_kobj"
 .LASF555:
 	.string	"upid"
-.LASF3328:
+.LASF3330:
 	.string	"down_write"
 .LASF1113:
 	.string	"completion"
@@ -56696,7 +56849,7 @@ __exitcall_ebc_exit:
 	.string	"taint_flag"
 .LASF1993:
 	.string	"get_dquots"
-.LASF3306:
+.LASF3308:
 	.string	"of_find_node_by_phandle"
 .LASF2417:
 	.string	"unmap_page"
@@ -56720,7 +56873,7 @@ __exitcall_ebc_exit:
 	.string	"vm_operations_struct"
 .LASF2405:
 	.string	"hwirq_max"
-.LASF3263:
+.LASF3265:
 	.string	"__fswab32"
 .LASF2213:
 	.string	"runtime_idle"
@@ -56750,13 +56903,13 @@ __exitcall_ebc_exit:
 	.string	"RPM_SUSPENDED"
 .LASF698:
 	.string	"reclaim_state"
-.LASF3338:
+.LASF3340:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF138:
 	.string	"vendor_panic_cb"
 .LASF3098:
 	.string	"ebc_vdd_power_timeout"
-.LASF3184:
+.LASF3186:
 	.string	"ebc_get_4pix_wf"
 .LASF2813:
 	.string	"num_symtab"
@@ -56786,13 +56939,13 @@ __exitcall_ebc_exit:
 	.string	"module_alloc_base"
 .LASF1766:
 	.string	"core_kallsyms"
-.LASF3300:
+.LASF3302:
 	.string	"memcpy"
 .LASF2910:
 	.string	"EPD_FORCE_FULL"
 .LASF2415:
 	.string	"get_sgtable"
-.LASF3162:
+.LASF3164:
 	.string	"xor_val"
 .LASF2170:
 	.string	"envp_idx"
@@ -56804,11 +56957,11 @@ __exitcall_ebc_exit:
 	.string	"OOM_KILL"
 .LASF445:
 	.string	"i_hash"
-.LASF3139:
+.LASF3141:
 	.string	"gray_old"
 .LASF68:
 	.string	"hlist_node"
-.LASF3309:
+.LASF3311:
 	.string	"sprintf"
 .LASF1923:
 	.string	"fl_ops"
@@ -56820,7 +56973,7 @@ __exitcall_ebc_exit:
 	.string	"WQ_MEM_RECLAIM"
 .LASF2688:
 	.string	"COMPACTISOLATED"
-.LASF3276:
+.LASF3278:
 	.string	"of_property_read_variable_u32_array"
 .LASF328:
 	.string	"__inittext_begin"
@@ -56856,7 +57009,7 @@ __exitcall_ebc_exit:
 	.string	"DOMAIN_BUS_WAKEUP"
 .LASF1237:
 	.string	"arm64_el2_vector_last_slot"
-.LASF3332:
+.LASF3334:
 	.string	"queue_work_on"
 .LASF2350:
 	.string	"online"
@@ -56864,7 +57017,7 @@ __exitcall_ebc_exit:
 	.string	"runtime_resume"
 .LASF1222:
 	.string	"dup_xol_work"
-.LASF3205:
+.LASF3207:
 	.string	"ebc_pmic_read_temp"
 .LASF2891:
 	.string	"EPD_FULL_GC16"
@@ -56978,7 +57131,7 @@ __exitcall_ebc_exit:
 	.string	"driver"
 .LASF1559:
 	.string	"ZONE_NORMAL"
-.LASF3168:
+.LASF3170:
 	.string	"image_new_data"
 .LASF426:
 	.string	"i_op"
@@ -57032,7 +57185,7 @@ __exitcall_ebc_exit:
 	.string	"huge_fault"
 .LASF2023:
 	.string	"kstatfs"
-.LASF3208:
+.LASF3210:
 	.string	"ebc_pmic_power_off"
 .LASF2649:
 	.string	"PGPGOUTCLEAN"
@@ -57060,7 +57213,7 @@ __exitcall_ebc_exit:
 	.string	"fsnotify_mark_connector"
 .LASF956:
 	.string	"_sigsys"
-.LASF3124:
+.LASF3125:
 	.string	"ebc_lut_update"
 .LASF1936:
 	.string	"lm_setup"
@@ -57104,7 +57257,7 @@ __exitcall_ebc_exit:
 	.string	"get_next_id"
 .LASF238:
 	.string	"rwlock_t"
-.LASF3337:
+.LASF3339:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
 .LASF855:
 	.string	"pgprot"
@@ -57132,7 +57285,7 @@ __exitcall_ebc_exit:
 	.string	"__icache_flags"
 .LASF148:
 	.string	"crash_kexec_post_notifiers"
-.LASF3193:
+.LASF3195:
 	.string	"eink_mode"
 .LASF1712:
 	.string	"rt_spc_warnlimit"
@@ -57154,7 +57307,7 @@ __exitcall_ebc_exit:
 	.string	"_pid"
 .LASF1171:
 	.string	"init_stack"
-.LASF3174:
+.LASF3176:
 	.string	"dmask"
 .LASF1240:
 	.string	"address_space"
@@ -57162,7 +57315,7 @@ __exitcall_ebc_exit:
 	.string	"mm_context_t"
 .LASF1326:
 	.string	"startup"
-.LASF3144:
+.LASF3146:
 	.string	"clac_part_data_32"
 .LASF835:
 	.string	"__WQ_ORDERED_EXPLICIT"
@@ -57176,7 +57329,7 @@ __exitcall_ebc_exit:
 	.string	"i_wb"
 .LASF2101:
 	.string	"idr_next"
-.LASF3159:
+.LASF3161:
 	.string	"frame_count_data"
 .LASF2973:
 	.string	"frame_start"
@@ -57226,7 +57379,7 @@ __exitcall_ebc_exit:
 	.string	"normal_prio"
 .LASF1303:
 	.string	"f_ep_links"
-.LASF3172:
+.LASF3174:
 	.string	"image_fb_tmp"
 .LASF2309:
 	.string	"last_busy"
@@ -57238,7 +57391,7 @@ __exitcall_ebc_exit:
 	.string	"host"
 .LASF185:
 	.string	"uaddr"
-.LASF3327:
+.LASF3329:
 	.string	"ebc_remove_from_dsp_buf_list"
 .LASF662:
 	.string	"real_start_time"
@@ -57274,11 +57427,11 @@ __exitcall_ebc_exit:
 	.string	"devres_head"
 .LASF428:
 	.string	"i_mapping"
-.LASF3301:
+.LASF3303:
 	.string	"misc_register"
 .LASF723:
 	.string	"rseq_sig"
-.LASF3227:
+.LASF3229:
 	.string	"platform_set_drvdata"
 .LASF343:
 	.string	"cpu_context"
@@ -57286,7 +57439,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pm_domain"
 .LASF1528:
 	.string	"nr_zones"
-.LASF3249:
+.LASF3251:
 	.string	"is_source"
 .LASF1390:
 	.string	"migrate_mode"
@@ -57308,11 +57461,11 @@ __exitcall_ebc_exit:
 	.string	"d_hash"
 .LASF1090:
 	.string	"dl_bw"
-.LASF3220:
+.LASF3222:
 	.string	"limit"
 .LASF2160:
 	.string	"kobj"
-.LASF3310:
+.LASF3312:
 	.string	"kstrtouint"
 .LASF114:
 	.string	"fsync"
@@ -57322,9 +57475,9 @@ __exitcall_ebc_exit:
 	.string	"i_flags"
 .LASF2908:
 	.string	"EPD_RESUME"
-.LASF3296:
+.LASF3298:
 	.string	"sscanf"
-.LASF3292:
+.LASF3294:
 	.string	"ebc_empty_buf_get"
 .LASF1489:
 	.string	"NR_ISOLATED_ANON"
@@ -57338,7 +57491,7 @@ __exitcall_ebc_exit:
 	.string	"rb_node"
 .LASF614:
 	.string	"pushable_tasks"
-.LASF3173:
+.LASF3175:
 	.string	"image_bg_tmp"
 .LASF2217:
 	.string	"platform_data"
@@ -57368,7 +57521,7 @@ __exitcall_ebc_exit:
 	.string	"last_update_time"
 .LASF1152:
 	.string	"robust_list_head"
-.LASF3290:
+.LASF3292:
 	.string	"init_timer_key"
 .LASF1495:
 	.string	"NR_ANON_MAPPED"
@@ -57384,7 +57537,7 @@ __exitcall_ebc_exit:
 	.string	"srcversion"
 .LASF873:
 	.string	"pcpu_unit_offsets"
-.LASF3196:
+.LASF3198:
 	.string	"dma_sync_single_for_device"
 .LASF2974:
 	.string	"dsp_end_callback"
@@ -57450,7 +57603,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_INACTIVE_ANON"
 .LASF729:
 	.string	"nr_dirtied"
-.LASF3237:
+.LASF3239:
 	.string	"dev_get_drvdata"
 .LASF2410:
 	.string	"linear_revmap"
@@ -57494,11 +57647,11 @@ __exitcall_ebc_exit:
 	.string	"sysctl_memory_failure_early_kill"
 .LASF2775:
 	.string	"param_ops_bool_enable_only"
-.LASF3179:
+.LASF3181:
 	.string	"power_status"
 .LASF307:
 	.string	"__start_opd"
-.LASF3305:
+.LASF3307:
 	.string	"of_find_i2c_device_by_node"
 .LASF154:
 	.string	"SYSTEM_RUNNING"
@@ -57572,7 +57725,7 @@ __exitcall_ebc_exit:
 	.string	"taint_flags"
 .LASF1362:
 	.string	"membarrier_state"
-.LASF3187:
+.LASF3189:
 	.string	"pre_image_addr"
 .LASF2193:
 	.string	"suspend"
@@ -57640,7 +57793,7 @@ __exitcall_ebc_exit:
 	.string	"exit_code"
 .LASF1071:
 	.string	"exec_start"
-.LASF3334:
+.LASF3336:
 	.string	"printk"
 .LASF2396:
 	.string	"consumers"
@@ -57704,7 +57857,7 @@ __exitcall_ebc_exit:
 	.string	"timer"
 .LASF2477:
 	.string	"devtree_lock"
-.LASF3176:
+.LASF3178:
 	.string	"refresh_new_image_auto"
 .LASF3092:
 	.string	"__ret"
@@ -57732,11 +57885,11 @@ __exitcall_ebc_exit:
 	.string	"optimistic_spin_queue"
 .LASF2979:
 	.string	"ebc_buffer_size"
-.LASF3311:
+.LASF3313:
 	.string	"ebc_pmic_set_vcom"
 .LASF2656:
 	.string	"ALLOCSTALL_NORMAL"
-.LASF3141:
+.LASF3143:
 	.string	"data_buf_tmp"
 .LASF326:
 	.string	"__initdata_begin"
@@ -57904,13 +58057,13 @@ __exitcall_ebc_exit:
 	.string	"seq_show"
 .LASF767:
 	.string	"ate_match_dt"
-.LASF3235:
+.LASF3237:
 	.string	"of_node_put"
 .LASF1375:
 	.string	"cow_page"
 .LASF1607:
 	.string	"core_id"
-.LASF3183:
+.LASF3185:
 	.string	"ebc_get_2pix_wf_32"
 .LASF2504:
 	.string	"block"
@@ -57928,11 +58081,11 @@ __exitcall_ebc_exit:
 	.string	"param_ops_ushort"
 .LASF526:
 	.string	"s_shrink"
-.LASF3157:
+.LASF3159:
 	.string	"gray_new_temp"
 .LASF1540:
 	.string	"kcompactd_classzone_idx"
-.LASF3225:
+.LASF3227:
 	.string	"kmalloc_index"
 .LASF884:
 	.string	"hrtimer_restart"
@@ -58042,7 +58195,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_DELAYED_BIT"
 .LASF1053:
 	.string	"nr_failed_migrations_affine"
-.LASF3240:
+.LASF3242:
 	.string	"IS_ERR"
 .LASF876:
 	.string	"PCPU_FC_EMBED"
@@ -58056,7 +58209,7 @@ __exitcall_ebc_exit:
 	.string	"pi_top_task"
 .LASF806:
 	.string	"WORK_NR_COLORS"
-.LASF3177:
+.LASF3179:
 	.string	"refresh_new_image2"
 .LASF528:
 	.string	"s_fsnotify_inode_refs"
@@ -58068,7 +58221,7 @@ __exitcall_ebc_exit:
 	.string	"uprobe"
 .LASF529:
 	.string	"s_readonly_remount"
-.LASF3268:
+.LASF3270:
 	.string	"kasan_check_write"
 .LASF378:
 	.string	"hlist_bl_node"
@@ -58094,7 +58247,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_FLAG_MASK"
 .LASF1286:
 	.string	"units"
-.LASF3283:
+.LASF3285:
 	.string	"epd_lut_from_mem_init"
 .LASF312:
 	.string	"__nosave_begin"
@@ -58114,7 +58267,7 @@ __exitcall_ebc_exit:
 	.string	"user_namespace"
 .LASF2771:
 	.string	"param_ops_ulong"
-.LASF3256:
+.LASF3258:
 	.string	"get_current"
 .LASF232:
 	.string	"raw_spinlock"
@@ -58140,7 +58293,7 @@ __exitcall_ebc_exit:
 	.string	"dq_inuse"
 .LASF3108:
 	.string	"out_buffer"
-.LASF3132:
+.LASF3134:
 	.string	"direct_mode_data_change_part"
 .LASF1656:
 	.string	"dqi_flags"
@@ -58148,9 +58301,9 @@ __exitcall_ebc_exit:
 	.string	"PGREFILL"
 .LASF2777:
 	.string	"param_ops_bint"
-.LASF3293:
+.LASF3295:
 	.string	"ebc_add_to_dsp_buf_list"
-.LASF3298:
+.LASF3300:
 	.string	"kfree"
 .LASF1817:
 	.string	"swap_deactivate"
@@ -58220,7 +58373,7 @@ __exitcall_ebc_exit:
 	.string	"boost_expires"
 .LASF2929:
 	.string	"DMA_BIDIRECTIONAL"
-.LASF3319:
+.LASF3321:
 	.string	"__arch_copy_to_user"
 .LASF236:
 	.string	"spinlock"
@@ -58242,7 +58395,7 @@ __exitcall_ebc_exit:
 	.string	"need_refresh"
 .LASF2835:
 	.string	"platform_bus_type"
-.LASF3133:
+.LASF3135:
 	.string	"data_buf"
 .LASF3064:
 	.string	"ulogo_buf"
@@ -58262,7 +58415,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_OFFQ_POOL_BITS"
 .LASF1920:
 	.string	"fl_fasync"
-.LASF3190:
+.LASF3192:
 	.string	"update_mode"
 .LASF2956:
 	.string	"direct_mode"
@@ -58336,13 +58489,13 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_HIGH_WMARK_HIT_QUICKLY"
 .LASF3074:
 	.string	"ebc_state_read"
-.LASF3307:
+.LASF3309:
 	.string	"__stack_chk_fail"
 .LASF2927:
 	.string	"pmic_set_vcom"
 .LASF2714:
 	.string	"stack_guard_gap"
-.LASF3248:
+.LASF3250:
 	.string	"bytes"
 .LASF1753:
 	.string	"gpl_future_crcs"
@@ -58446,7 +58599,7 @@ __exitcall_ebc_exit:
 	.string	"i_mtime"
 .LASF2619:
 	.string	"dev_page_fault_t"
-.LASF3127:
+.LASF3129:
 	.string	"ebc_auto_tast_function"
 .LASF24:
 	.string	"__kernel_gid32_t"
@@ -58458,7 +58611,7 @@ __exitcall_ebc_exit:
 	.string	"MODULE_STATE_COMING"
 .LASF2246:
 	.string	"offline_disabled"
-.LASF3233:
+.LASF3235:
 	.string	"of_property_read_u32_array"
 .LASF2491:
 	.string	"select"
@@ -58504,7 +58657,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pagemap"
 .LASF2663:
 	.string	"PGDEACTIVATE"
-.LASF3138:
+.LASF3140:
 	.string	"buffer_old_tmp"
 .LASF1799:
 	.string	"writepages"
@@ -58526,7 +58679,7 @@ __exitcall_ebc_exit:
 	.string	"writeback_control"
 .LASF1919:
 	.string	"fl_end"
-.LASF3322:
+.LASF3324:
 	.string	"ebc_find_buf_by_phy_addr"
 .LASF1966:
 	.string	"super_operations"
@@ -58566,13 +58719,13 @@ __exitcall_ebc_exit:
 	.string	"core"
 .LASF1830:
 	.string	"bd_holders"
-.LASF3130:
+.LASF3132:
 	.string	"reset_and_flip"
 .LASF2967:
 	.string	"enable"
 .LASF970:
 	.string	"pipe_bufs"
-.LASF3253:
+.LASF3255:
 	.string	"to_user"
 .LASF2139:
 	.string	"KOBJ_NS_TYPE_NET"
@@ -58592,7 +58745,7 @@ __exitcall_ebc_exit:
 	.string	"__rb_parent_color"
 .LASF2239:
 	.string	"devres_lock"
-.LASF3175:
+.LASF3177:
 	.string	"new_buffer_refresh"
 .LASF366:
 	.string	"bits"
@@ -58608,9 +58761,9 @@ __exitcall_ebc_exit:
 	.string	"lookup"
 .LASF1605:
 	.string	"cpu_topology"
-.LASF3257:
+.LASF3259:
 	.string	"sp_el0"
-.LASF3326:
+.LASF3328:
 	.string	"ebc_dsp_buf_get"
 .LASF2916:
 	.string	"panel_color"
@@ -58640,7 +58793,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_AUTO"
 .LASF1242:
 	.string	"i_pages"
-.LASF3217:
+.LASF3219:
 	.string	"safe_ptr"
 .LASF377:
 	.string	"hlist_bl_head"
@@ -58680,7 +58833,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_LOW_WMARK_HIT_QUICKLY"
 .LASF1009:
 	.string	"syscfs"
-.LASF3210:
+.LASF3212:
 	.string	"wake_unlock"
 .LASF2460:
 	.string	"graph_get_port_parent"
@@ -58690,7 +58843,7 @@ __exitcall_ebc_exit:
 	.string	"UNEVICTABLE_PGRESCUED"
 .LASF2224:
 	.string	"msi_list"
-.LASF3259:
+.LASF3261:
 	.string	"__ilog2_u64"
 .LASF548:
 	.string	"compat_time_t"
@@ -58714,7 +58867,7 @@ __exitcall_ebc_exit:
 	.string	"cap_effective"
 .LASF1761:
 	.string	"taints"
-.LASF3278:
+.LASF3280:
 	.string	"of_address_to_resource"
 .LASF1027:
 	.string	"enqueued"
@@ -58742,7 +58895,7 @@ __exitcall_ebc_exit:
 	.string	"bd_private"
 .LASF1918:
 	.string	"fl_start"
-.LASF3232:
+.LASF3234:
 	.string	"out_value"
 .LASF1976:
 	.string	"freeze_fs"
@@ -58750,7 +58903,7 @@ __exitcall_ebc_exit:
 	.string	"sigset_t"
 .LASF1932:
 	.string	"lm_notify"
-.LASF3189:
+.LASF3191:
 	.string	"ebc_tcon_dsp_mode_set"
 .LASF895:
 	.string	"running"
@@ -58776,7 +58929,7 @@ __exitcall_ebc_exit:
 	.string	"d_automount"
 .LASF1280:
 	.string	"page_free"
-.LASF3128:
+.LASF3130:
 	.string	"__val"
 .LASF1496:
 	.string	"NR_FILE_MAPPED"
@@ -58788,13 +58941,13 @@ __exitcall_ebc_exit:
 	.string	"copy_file_range"
 .LASF2700:
 	.string	"UNEVICTABLE_PGCLEARED"
-.LASF3312:
+.LASF3314:
 	.string	"epd_lut_get_wf_version"
 .LASF2062:
 	.string	"key_type"
 .LASF798:
 	.string	"WORK_STRUCT_LINKED_BIT"
-.LASF3250:
+.LASF3252:
 	.string	"copy_overflow"
 .LASF2456:
 	.string	"get_named_child_node"
@@ -58810,7 +58963,7 @@ __exitcall_ebc_exit:
 	.string	"module_kobject"
 .LASF3069:
 	.string	"memory"
-.LASF3224:
+.LASF3226:
 	.string	"order"
 .LASF740:
 	.string	"active_memcg"
@@ -58860,7 +59013,7 @@ __exitcall_ebc_exit:
 	.string	"arm64_ftr_reg_ctrel0"
 .LASF1259:
 	.string	"counters"
-.LASF3269:
+.LASF3271:
 	.string	"kasan_check_read"
 .LASF2074:
 	.string	"name_link"
@@ -58926,7 +59079,7 @@ __exitcall_ebc_exit:
 	.string	"nr_irqs"
 .LASF909:
 	.string	"max_hang_time"
-.LASF3213:
+.LASF3215:
 	.string	"copy_from_user"
 .LASF2482:
 	.string	"DOMAIN_BUS_ANY"
@@ -58940,7 +59093,7 @@ __exitcall_ebc_exit:
 	.string	"mmap_miss"
 .LASF1669:
 	.string	"quota_format_ops"
-.LASF3324:
+.LASF3326:
 	.string	"ebc_osd_buf_get"
 .LASF3088:
 	.string	"argp"
@@ -58980,13 +59133,13 @@ __exitcall_ebc_exit:
 	.string	"thread_keyring"
 .LASF2760:
 	.string	"kparam_array"
-.LASF3271:
+.LASF3273:
 	.string	"platform_driver_unregister"
 .LASF653:
 	.string	"utime"
-.LASF3145:
+.LASF3147:
 	.string	"pix0"
-.LASF3146:
+.LASF3148:
 	.string	"pix1"
 .LASF1349:
 	.string	"start_code"
@@ -58994,7 +59147,7 @@ __exitcall_ebc_exit:
 	.string	"ebc_driver"
 .LASF2620:
 	.string	"dev_page_free_t"
-.LASF3230:
+.LASF3232:
 	.string	"of_property_read_u32"
 .LASF1413:
 	.string	"guid_t"
@@ -59002,7 +59155,7 @@ __exitcall_ebc_exit:
 	.string	"sysctl_panic_on_stackoverflow"
 .LASF1909:
 	.string	"fl_link"
-.LASF3121:
+.LASF3122:
 	.string	"check_black_percent"
 .LASF2264:
 	.string	"clock_list"
@@ -59016,7 +59169,7 @@ __exitcall_ebc_exit:
 	.string	"tz_minuteswest"
 .LASF2474:
 	.string	"of_chosen"
-.LASF3129:
+.LASF3131:
 	.string	"ebc_frame_start"
 .LASF349:
 	.string	"sve_state"
@@ -59026,7 +59179,7 @@ __exitcall_ebc_exit:
 	.string	"cpumask_t"
 .LASF134:
 	.string	"kmsg_fops"
-.LASF3321:
+.LASF3323:
 	.string	"ebc_buf_release"
 .LASF820:
 	.string	"WORK_STRUCT_NO_POOL"
@@ -59048,7 +59201,7 @@ __exitcall_ebc_exit:
 	.string	"sched_rt_entity"
 .LASF117:
 	.string	"sendpage"
-.LASF3181:
+.LASF3183:
 	.string	"ret_val"
 .LASF881:
 	.string	"timerqueue_node"
@@ -59058,7 +59211,7 @@ __exitcall_ebc_exit:
 	.string	"mem_dqblk"
 .LASF2787:
 	.string	"plt_entry"
-.LASF3191:
+.LASF3193:
 	.string	"display_mode"
 .LASF1995:
 	.string	"nr_cached_objects"
@@ -59090,11 +59243,11 @@ __exitcall_ebc_exit:
 	.string	"fops"
 .LASF1288:
 	.string	"f_path"
-.LASF3285:
+.LASF3287:
 	.string	"kthread_create_on_node"
 .LASF712:
 	.string	"cgroups"
-.LASF3216:
+.LASF3218:
 	.string	"__uaccess_mask_ptr"
 .LASF2359:
 	.string	"probe_type"
@@ -59114,9 +59267,9 @@ __exitcall_ebc_exit:
 	.string	"userspace_clients"
 .LASF2158:
 	.string	"uevent_seqnum"
-.LASF3281:
+.LASF3283:
 	.string	"memset"
-.LASF3188:
+.LASF3190:
 	.string	"cur_image_addr"
 .LASF2159:
 	.string	"list_lock"
@@ -59164,7 +59317,7 @@ __exitcall_ebc_exit:
 	.string	"qf_fmt_id"
 .LASF1065:
 	.string	"nr_wakeups_idle"
-.LASF3329:
+.LASF3331:
 	.string	"up_write"
 .LASF1473:
 	.string	"NR_MLOCK"
@@ -59200,7 +59353,7 @@ __exitcall_ebc_exit:
 	.string	"console_printk"
 .LASF703:
 	.string	"ioac"
-.LASF3243:
+.LASF3245:
 	.string	"__init_work"
 .LASF1186:
 	.string	"nr_to_scan"
@@ -59212,7 +59365,7 @@ __exitcall_ebc_exit:
 	.string	"exec_max"
 .LASF1418:
 	.string	"uuid_index"
-.LASF3244:
+.LASF3246:
 	.string	"onstack"
 .LASF190:
 	.string	"compat_rmtp"
@@ -59224,7 +59377,7 @@ __exitcall_ebc_exit:
 	.string	"nfs_fl"
 .LASF403:
 	.string	"dentry"
-.LASF3261:
+.LASF3263:
 	.string	"__be32_to_cpup"
 .LASF2181:
 	.string	"klist_node"
@@ -59308,7 +59461,7 @@ __exitcall_ebc_exit:
 	.string	"d_rt_space"
 .LASF265:
 	.string	"name"
-.LASF3291:
+.LASF3293:
 	.string	"mod_timer"
 .LASF151:
 	.string	"early_boot_irqs_disabled"
@@ -59334,7 +59487,7 @@ __exitcall_ebc_exit:
 	.string	"i_gid"
 .LASF1634:
 	.string	"quota_type"
-.LASF3135:
+.LASF3137:
 	.string	"buffer_old"
 .LASF1551:
 	.string	"high"
@@ -59380,7 +59533,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_WRITE_PENDING"
 .LASF1311:
 	.string	"close"
-.LASF3169:
+.LASF3171:
 	.string	"image_fb_data"
 .LASF3065:
 	.string	"klogo_buf"
@@ -59392,13 +59545,13 @@ __exitcall_ebc_exit:
 	.string	"ebc_wq"
 .LASF737:
 	.string	"memcg_oom_gfp_mask"
-.LASF3246:
+.LASF3248:
 	.string	"_msecs_to_jiffies"
 .LASF1698:
 	.string	"d_spc_timer"
 .LASF1774:
 	.string	"jump_entries"
-.LASF3254:
+.LASF3256:
 	.string	"test_ti_thread_flag"
 .LASF2270:
 	.string	"async_suspend"
@@ -59408,7 +59561,7 @@ __exitcall_ebc_exit:
 	.string	"read_pos"
 .LASF482:
 	.string	"super_block"
-.LASF3218:
+.LASF3220:
 	.string	"__addr"
 .LASF2337:
 	.string	"dma_coherent"
@@ -59454,11 +59607,11 @@ __exitcall_ebc_exit:
 	.string	"devkmsg_log_str"
 .LASF255:
 	.string	"FTR_HIGHER_SAFE"
-.LASF3229:
+.LASF3231:
 	.string	"i2c_get_clientdata"
-.LASF3214:
+.LASF3216:
 	.string	"_copy_to_user"
-.LASF3264:
+.LASF3266:
 	.string	"test_bit"
 .LASF249:
 	.string	"__start___jump_table"
@@ -59474,7 +59627,7 @@ __exitcall_ebc_exit:
 	.string	"mems_allowed_seq"
 .LASF1785:
 	.string	"refcnt"
-.LASF3118:
+.LASF3119:
 	.string	"pbuf_new"
 .LASF2196:
 	.string	"thaw"
@@ -59490,9 +59643,9 @@ __exitcall_ebc_exit:
 	.string	"futex"
 .LASF1040:
 	.string	"wait_max"
-.LASF3289:
+.LASF3291:
 	.string	"wakeup_source_add"
-.LASF3207:
+.LASF3209:
 	.string	"ebc_pmic_suspend"
 .LASF1173:
 	.string	"result_mask"
@@ -59504,15 +59657,15 @@ __exitcall_ebc_exit:
 	.string	"dquot_operations"
 .LASF1239:
 	.string	"mapping"
-.LASF3239:
+.LASF3241:
 	.string	"resource_size"
-.LASF3286:
+.LASF3288:
 	.string	"wake_up_process"
 .LASF1369:
 	.string	"kioctx_table"
 .LASF867:
 	.string	"rb_right"
-.LASF3137:
+.LASF3139:
 	.string	"buffer_new_tmp"
 .LASF993:
 	.string	"vm_file"
@@ -59538,11 +59691,11 @@ __exitcall_ebc_exit:
 	.string	"__initdata_end"
 .LASF2516:
 	.string	"bus_lock"
-.LASF3226:
+.LASF3228:
 	.string	"kmalloc_type"
 .LASF388:
 	.string	"qstr"
-.LASF3140:
+.LASF3142:
 	.string	"gray_new"
 .LASF3107:
 	.string	"in_buffer"
@@ -59552,7 +59705,7 @@ __exitcall_ebc_exit:
 	.string	"WORKINGSET_RESTORE"
 .LASF629:
 	.string	"sched_psi_wake_requeue"
-.LASF3247:
+.LASF3249:
 	.string	"check_copy_size"
 .LASF738:
 	.string	"memcg_oom_order"
@@ -59608,7 +59761,7 @@ __exitcall_ebc_exit:
 	.string	"core_state"
 .LASF883:
 	.string	"timerqueue_head"
-.LASF3288:
+.LASF3290:
 	.string	"sched_setscheduler_nocheck"
 .LASF1306:
 	.string	"f_wb_err"
@@ -59616,7 +59769,7 @@ __exitcall_ebc_exit:
 	.string	"rt_mutex"
 .LASF1005:
 	.string	"rchar"
-.LASF3199:
+.LASF3201:
 	.string	"valid_dma_direction"
 .LASF1833:
 	.string	"bd_contains"
@@ -59658,7 +59811,7 @@ __exitcall_ebc_exit:
 	.string	"epoll_watches"
 .LASF2692:
 	.string	"KCOMPACTD_WAKE"
-.LASF3164:
+.LASF3166:
 	.string	"refresh_new_image"
 .LASF2089:
 	.string	"non_rcu"
@@ -59732,13 +59885,13 @@ __exitcall_ebc_exit:
 	.string	"need"
 .LASF505:
 	.string	"s_encoding"
-.LASF3242:
+.LASF3244:
 	.string	"queue_work"
 .LASF1749:
 	.string	"gpl_crcs"
 .LASF1735:
 	.string	"get_state"
-.LASF3202:
+.LASF3204:
 	.string	"dma_handle"
 .LASF1374:
 	.string	"orig_pte"
@@ -59806,13 +59959,13 @@ __exitcall_ebc_exit:
 	.string	"NR_WRITEBACK_TEMP"
 .LASF2528:
 	.string	"functionality"
-.LASF3148:
+.LASF3150:
 	.string	"clac_part_data_align8"
 .LASF306:
 	.string	"__ctors_end"
 .LASF2281:
 	.string	"wakeup_path"
-.LASF3308:
+.LASF3310:
 	.string	"ebc_buf_state_show"
 .LASF983:
 	.string	"vm_prev"
@@ -59828,7 +59981,7 @@ __exitcall_ebc_exit:
 	.string	"__u8"
 .LASF116:
 	.string	"lock"
-.LASF3206:
+.LASF3208:
 	.string	"ebc_pmic_resume"
 .LASF1577:
 	.string	"compact_cached_migrate_pfn"
@@ -59870,7 +60023,7 @@ __exitcall_ebc_exit:
 	.string	"compact_order_failed"
 .LASF1120:
 	.string	"fsuid"
-.LASF3255:
+.LASF3257:
 	.string	"flag"
 .LASF1490:
 	.string	"NR_ISOLATED_FILE"
@@ -59882,9 +60035,9 @@ __exitcall_ebc_exit:
 	.string	"managed_pages"
 .LASF2604:
 	.string	"__tracepoint_page_ref_set"
-.LASF3195:
+.LASF3197:
 	.string	"ebc_tcon_enable"
-.LASF3336:
+.LASF3338:
 	.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"
@@ -59932,13 +60085,13 @@ __exitcall_ebc_exit:
 	.string	"s_vop"
 .LASF1665:
 	.string	"qf_owner"
-.LASF3270:
+.LASF3272:
 	.string	"__write_once_size"
 .LASF2846:
 	.string	"kmalloc_cache_type"
 .LASF575:
 	.string	"mutex"
-.LASF3234:
+.LASF3236:
 	.string	"out_values"
 .LASF854:
 	.string	"pgd_t"
@@ -59952,7 +60105,9 @@ __exitcall_ebc_exit:
 	.string	"raw_spinlock_t"
 .LASF2954:
 	.string	"vir_width"
-.LASF3258:
+.LASF3341:
+	.string	"epd_overlay_lut"
+.LASF3260:
 	.string	"INIT_LIST_HEAD"
 .LASF1953:
 	.string	"fs_flags"
@@ -59970,7 +60125,7 @@ __exitcall_ebc_exit:
 	.string	"resume_frame_count"
 .LASF1204:
 	.string	"radix_tree_node"
-.LASF3260:
+.LASF3262:
 	.string	"sign_extend64"
 .LASF2328:
 	.string	"wake_irq"
@@ -59992,13 +60147,13 @@ __exitcall_ebc_exit:
 	.string	"ptraced"
 .LASF2766:
 	.string	"param_ops_short"
-.LASF3303:
+.LASF3305:
 	.string	"of_find_device_by_node"
 .LASF2568:
 	.string	"HRTIMER_SOFTIRQ"
 .LASF802:
 	.string	"WORK_STRUCT_DELAYED"
-.LASF3180:
+.LASF3182:
 	.string	"ebc_get_2pix_wf_part_32"
 .LASF455:
 	.string	"i_sequence"
@@ -60020,7 +60175,7 @@ __exitcall_ebc_exit:
 	.string	"addr"
 .LASF2400:
 	.string	"device_private"
-.LASF3197:
+.LASF3199:
 	.string	"get_dma_ops"
 .LASF2712:
 	.string	"watermark_scale_factor"
@@ -60036,7 +60191,7 @@ __exitcall_ebc_exit:
 	.string	"mkobj"
 .LASF2981:
 	.string	"direct_buf_real_size"
-.LASF3325:
+.LASF3327:
 	.string	"__pm_relax"
 .LASF473:
 	.string	"d_delete"
@@ -60084,7 +60239,7 @@ __exitcall_ebc_exit:
 	.string	"kill"
 .LASF1044:
 	.string	"iowait_sum"
-.LASF3165:
+.LASF3167:
 	.string	"image_new"
 .LASF15:
 	.string	"__u64"
@@ -60118,7 +60273,7 @@ __exitcall_ebc_exit:
 	.string	"sum_sleep_runtime"
 .LASF3062:
 	.string	"ulogo_addr_str"
-.LASF3131:
+.LASF3133:
 	.string	"flip"
 .LASF1093:
 	.string	"deadline"
@@ -60162,11 +60317,11 @@ __exitcall_ebc_exit:
 	.string	"read_dqblk"
 .LASF1630:
 	.string	"dq_flags"
-.LASF3134:
+.LASF3136:
 	.string	"buffer_new"
 .LASF213:
 	.string	"user_fpsimd_state"
-.LASF3302:
+.LASF3304:
 	.string	"device_create_file"
 .LASF521:
 	.string	"s_time_gran"
@@ -60190,11 +60345,11 @@ __exitcall_ebc_exit:
 	.string	"s_bdi"
 .LASF2871:
 	.string	"wf_table"
-.LASF3171:
+.LASF3173:
 	.string	"image_new_tmp"
 .LASF1746:
 	.string	"num_kp"
-.LASF3335:
+.LASF3337:
 	.string	"__pm_stay_awake"
 .LASF2579:
 	.string	"vmap_area_list"
@@ -60400,7 +60555,7 @@ __exitcall_ebc_exit:
 	.string	"s_inode_list_lock"
 .LASF2614:
 	.string	"align"
-.LASF3142:
+.LASF3144:
 	.string	"frame_idx"
 .LASF204:
 	.string	"mm_segment_t"
@@ -60422,7 +60577,7 @@ __exitcall_ebc_exit:
 	.string	"maj_flt"
 .LASF229:
 	.string	"arch_rwlock_t"
-.LASF3323:
+.LASF3325:
 	.string	"ebc_osd_buf_clone"
 .LASF162:
 	.string	"c_false"
@@ -60448,7 +60603,7 @@ __exitcall_ebc_exit:
 	.string	"minor"
 .LASF1713:
 	.string	"nextents"
-.LASF3200:
+.LASF3202:
 	.string	"dma_direction"
 .LASF1:
 	.string	"sizetype"
@@ -60458,7 +60613,7 @@ __exitcall_ebc_exit:
 	.string	"arg_lock"
 .LASF1755:
 	.string	"num_exentries"
-.LASF3120:
+.LASF3121:
 	.string	"check_out"
 .LASF2623:
 	.string	"high_memory"
@@ -60472,7 +60627,7 @@ __exitcall_ebc_exit:
 	.string	"next_timer"
 .LASF741:
 	.string	"throttle_queue"
-.LASF3318:
+.LASF3320:
 	.string	"finish_wait"
 .LASF1494:
 	.string	"WORKINGSET_NODERECLAIM"
@@ -60484,7 +60639,7 @@ __exitcall_ebc_exit:
 	.string	"keyring_index_key"
 .LASF833:
 	.string	"__WQ_ORDERED"
-.LASF3194:
+.LASF3196:
 	.string	"ebc_tcon_disable"
 .LASF1435:
 	.string	"leases_enable"
@@ -60526,7 +60681,7 @@ __exitcall_ebc_exit:
 	.string	"num_vf"
 .LASF1549:
 	.string	"isolate_mode_t"
-.LASF3201:
+.LASF3203:
 	.string	"debug_dma_sync_single_for_device"
 .LASF99:
 	.string	"llseek"
@@ -60568,9 +60723,9 @@ __exitcall_ebc_exit:
 	.string	"target"
 .LASF2560:
 	.string	"HI_SOFTIRQ"
-.LASF3203:
+.LASF3205:
 	.string	"direction"
-.LASF3170:
+.LASF3172:
 	.string	"image_bg_data"
 .LASF972:
 	.string	"session_keyring"
@@ -60580,7 +60735,7 @@ __exitcall_ebc_exit:
 	.string	"key_restrict_link_func_t"
 .LASF1499:
 	.string	"NR_WRITEBACK"
-.LASF3156:
+.LASF3158:
 	.string	"frame_count"
 .LASF487:
 	.string	"s_maxbytes"
@@ -60594,7 +60749,7 @@ __exitcall_ebc_exit:
 	.string	"i2c_bus_type"
 .LASF899:
 	.string	"hrtimer_cpu_base"
-.LASF3330:
+.LASF3332:
 	.string	"ebc_notify"
 .LASF1405:
 	.string	"cb_head"
@@ -60622,7 +60777,7 @@ __exitcall_ebc_exit:
 	.string	"cpus_requested"
 .LASF2608:
 	.string	"__tracepoint_page_ref_mod_unless"
-.LASF3211:
+.LASF3213:
 	.string	"wake_lock_init"
 .LASF1200:
 	.string	"list_lru"
@@ -60648,7 +60803,7 @@ __exitcall_ebc_exit:
 	.string	"d_iput"
 .LASF108:
 	.string	"compat_ioctl"
-.LASF3219:
+.LASF3221:
 	.string	"__range_ok"
 .LASF287:
 	.string	"__start_ro_after_init"
@@ -60656,7 +60811,7 @@ __exitcall_ebc_exit:
 	.string	"num_poisoned_pages"
 .LASF919:
 	.string	"filter"
-.LASF3204:
+.LASF3206:
 	.string	"ebc_pmic_get_vcom"
 .LASF2962:
 	.string	"ebc_tcon"
@@ -60768,11 +60923,11 @@ __exitcall_ebc_exit:
 	.string	"power"
 .LASF266:
 	.string	"strict_mask"
-.LASF3317:
+.LASF3319:
 	.string	"init_wait_entry"
 .LASF2801:
 	.string	"module_state"
-.LASF3273:
+.LASF3275:
 	.string	"_dev_info"
 .LASF417:
 	.string	"d_subdirs"
@@ -60818,9 +60973,9 @@ __exitcall_ebc_exit:
 	.string	"removed_mem"
 .LASF248:
 	.string	"jump_label_t"
-.LASF3304:
+.LASF3306:
 	.string	"of_get_property"
-.LASF3185:
+.LASF3187:
 	.string	"ebc_tcon_frame_start"
 .LASF2726:
 	.string	"Elf64_Half"
@@ -60834,7 +60989,7 @@ __exitcall_ebc_exit:
 	.string	"can_wakeup"
 .LASF2561:
 	.string	"TIMER_SOFTIRQ"
-.LASF3161:
+.LASF3163:
 	.string	"temp_data"
 .LASF1229:
 	.string	"xol_area"
@@ -60860,11 +61015,11 @@ __exitcall_ebc_exit:
 	.string	"init_on_free"
 .LASF1166:
 	.string	"nr_pages"
-.LASF3178:
+.LASF3180:
 	.string	"ebc_power_set"
 .LASF1776:
 	.string	"num_trace_bprintk_fmt"
-.LASF3267:
+.LASF3269:
 	.string	"__fls"
 .LASF1144:
 	.string	"ioprio"
@@ -60890,9 +61045,9 @@ __exitcall_ebc_exit:
 	.string	"persistent_clock_is_local"
 .LASF2428:
 	.string	"dma_supported"
-.LASF3236:
+.LASF3238:
 	.string	"dev_set_drvdata"
-.LASF3331:
+.LASF3333:
 	.string	"epd_lut_get"
 .LASF1550:
 	.string	"per_cpu_pages"
@@ -60928,7 +61083,7 @@ __exitcall_ebc_exit:
 	.string	"BLOCK_SOFTIRQ"
 .LASF1426:
 	.string	"files_stat_struct"
-.LASF3279:
+.LASF3281:
 	.string	"devm_memremap"
 .LASF858:
 	.string	"pgtable_t"
@@ -60946,7 +61101,7 @@ __exitcall_ebc_exit:
 	.string	"lut_data_set"
 .LASF791:
 	.string	"sysctl_timer_migration"
-.LASF3151:
+.LASF3153:
 	.string	"clac_full_data_16_to_32"
 .LASF2932:
 	.string	"DMA_NONE"
@@ -60958,7 +61113,7 @@ __exitcall_ebc_exit:
 	.string	"WAKE_LOCK_SUSPEND"
 .LASF1792:
 	.string	"WRITE_LIFE_SHORT"
-.LASF3262:
+.LASF3264:
 	.string	"__swab32p"
 .LASF286:
 	.string	"_einittext"
@@ -61000,7 +61155,7 @@ __exitcall_ebc_exit:
 	.string	"rm_xquota"
 .LASF1099:
 	.string	"dl_timer"
-.LASF3313:
+.LASF3315:
 	.string	"remap_pfn_range"
 .LASF2390:
 	.string	"DL_DEV_NO_DRIVER"
@@ -61014,7 +61169,7 @@ __exitcall_ebc_exit:
 	.string	"watermark"
 .LASF2438:
 	.string	"deadprops"
-.LASF3275:
+.LASF3277:
 	.string	"devm_kmalloc"
 .LASF16:
 	.string	"long long unsigned int"
@@ -61150,7 +61305,7 @@ __exitcall_ebc_exit:
 	.string	"free_list"
 .LASF590:
 	.string	"prio"
-.LASF3228:
+.LASF3230:
 	.string	"platform_get_drvdata"
 .LASF2570:
 	.string	"NR_SOFTIRQS"
@@ -61172,7 +61327,7 @@ __exitcall_ebc_exit:
 	.string	"atomic_t"
 .LASF813:
 	.string	"WORK_OFFQ_FLAG_BITS"
-.LASF3186:
+.LASF3188:
 	.string	"ebc_tcon_image_addr_set"
 .LASF2546:
 	.string	"max_num_msgs"
@@ -61192,7 +61347,7 @@ __exitcall_ebc_exit:
 	.string	"scatterlist"
 .LASF1282:
 	.string	"altmap_valid"
-.LASF3333:
+.LASF3335:
 	.string	"down"
 .LASF102:
 	.string	"read_iter"
@@ -61230,7 +61385,7 @@ __exitcall_ebc_exit:
 	.string	"pm_domain_data"
 .LASF2502:
 	.string	"byte"
-.LASF3299:
+.LASF3301:
 	.string	"__wake_up_sync"
 .LASF2017:
 	.string	"poll_table_struct"
@@ -61256,7 +61411,7 @@ __exitcall_ebc_exit:
 	.string	"page_fault"
 .LASF1484:
 	.string	"NR_INACTIVE_FILE"
-.LASF3251:
+.LASF3253:
 	.string	"__ret_warn_on"
 .LASF1640:
 	.string	"kqid"
@@ -61328,7 +61483,7 @@ __exitcall_ebc_exit:
 	.string	"shift"
 .LASF1452:
 	.string	"ia_gid"
-.LASF3123:
+.LASF3124:
 	.string	"vaild_size"
 .LASF36:
 	.string	"name_offset"
@@ -61338,7 +61493,7 @@ __exitcall_ebc_exit:
 	.string	"__irqentry_text_end"
 .LASF1361:
 	.string	"context"
-.LASF3155:
+.LASF3157:
 	.string	"get_overlay_image"
 .LASF1555:
 	.string	"per_cpu_nodestat"
@@ -61380,12 +61535,14 @@ __exitcall_ebc_exit:
 	.string	"of_match_table"
 .LASF2593:
 	.string	"percpu_count_ptr"
-.LASF3314:
+.LASF3316:
 	.string	"ebc_phy_buf_base_get"
 .LASF2094:
 	.string	"loops_per_jiffy"
 .LASF2525:
 	.string	"i2c_algorithm"
+.LASF3118:
+	.string	"check_size"
 .LASF2873:
 	.string	"buf_idle"
 .LASF1414:
@@ -61402,7 +61559,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_INODESTEAL"
 .LASF1190:
 	.string	"count_objects"
-.LASF3266:
+.LASF3268:
 	.string	"fls64"
 .LASF936:
 	.string	"_stime"
@@ -61422,7 +61579,7 @@ __exitcall_ebc_exit:
 	.string	"statistics"
 .LASF2953:
 	.string	"current_buffer"
-.LASF3149:
+.LASF3151:
 	.string	"direct_mode_data_change"
 .LASF1633:
 	.string	"kprojid_t"
@@ -61438,11 +61595,11 @@ __exitcall_ebc_exit:
 	.string	"sync_sg_for_device"
 .LASF1979:
 	.string	"statfs"
-.LASF3294:
+.LASF3296:
 	.string	"__kmalloc"
-.LASF3282:
+.LASF3284:
 	.string	"_dev_err"
-.LASF3272:
+.LASF3274:
 	.string	"__platform_driver_register"
 .LASF2980:
 	.string	"ebc_buf_real_size"
@@ -61528,7 +61685,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_PENDING_BIT"
 .LASF721:
 	.string	"rseq"
-.LASF3163:
+.LASF3165:
 	.string	"get_auto_image"
 .LASF196:
 	.string	"nfds"
@@ -61542,7 +61699,7 @@ __exitcall_ebc_exit:
 	.string	"i_acl"
 .LASF1804:
 	.string	"bmap"
-.LASF3280:
+.LASF3282:
 	.string	"ebc_buf_init"
 .LASF2063:
 	.string	"key_payload"
@@ -61582,7 +61739,7 @@ __exitcall_ebc_exit:
 	.string	"fallocate"
 .LASF1722:
 	.string	"i_spc_warnlimit"
-.LASF3252:
+.LASF3254:
 	.string	"check_object_size"
 .LASF1530:
 	.string	"node_present_pages"
@@ -61632,6 +61789,8 @@ __exitcall_ebc_exit:
 	.string	"__idmap_text_start"
 .LASF1731:
 	.string	"set_info"
+.LASF3044:
+	.string	"__addressable_ebc_init3091"
 .LASF3086:
 	.string	"ebc_mmap"
 .LASF2634:
@@ -61646,7 +61805,7 @@ __exitcall_ebc_exit:
 	.string	"hiwater_vm"
 .LASF3077:
 	.string	"pmic_vcom_read"
-.LASF3274:
+.LASF3276:
 	.string	"misc_deregister"
 .LASF1263:
 	.string	"compound_head"
@@ -61666,7 +61825,7 @@ __exitcall_ebc_exit:
 	.string	"bd_write_holder"
 .LASF2209:
 	.string	"poweroff_noirq"
-.LASF3277:
+.LASF3279:
 	.string	"of_parse_phandle"
 .LASF1873:
 	.string	"rename"
@@ -61696,9 +61855,9 @@ __exitcall_ebc_exit:
 	.string	"sync_single_for_cpu"
 .LASF794:
 	.string	"data"
-.LASF3221:
+.LASF3223:
 	.string	"kzalloc"
-.LASF3245:
+.LASF3247:
 	.string	"msecs_to_jiffies"
 .LASF1934:
 	.string	"lm_break"
@@ -61734,7 +61893,7 @@ __exitcall_ebc_exit:
 	.string	"signed char"
 .LASF376:
 	.string	"rcu_scheduler_active"
-.LASF3231:
+.LASF3233:
 	.string	"propname"
 .LASF2116:
 	.string	"priv"
@@ -61850,7 +62009,7 @@ __exitcall_ebc_exit:
 	.string	"WQ_MAX_UNBOUND_PER_CPU"
 .LASF1552:
 	.string	"per_cpu_pageset"
-.LASF3287:
+.LASF3289:
 	.string	"__alloc_workqueue_key"
 .LASF760:
 	.string	"status"
@@ -61864,7 +62023,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_GCC16"
 .LASF2529:
 	.string	"i2c_lock_operations"
-.LASF3182:
+.LASF3184:
 	.string	"ebc_get_4pix_wf_part"
 .LASF1635:
 	.string	"USRQUOTA"
@@ -61910,9 +62069,9 @@ __exitcall_ebc_exit:
 	.string	"f_inode"
 .LASF2046:
 	.string	"procname"
-.LASF3160:
+.LASF3162:
 	.string	"point_data"
-.LASF3284:
+.LASF3286:
 	.string	"epd_lut_from_file_init"
 .LASF1684:
 	.string	"mark_dirty"
@@ -61942,11 +62101,11 @@ __exitcall_ebc_exit:
 	.string	"releasepage"
 .LASF1717:
 	.string	"qc_info"
-.LASF3136:
+.LASF3138:
 	.string	"clac_part_data_32_to_16"
 .LASF3100:
 	.string	"ebc_thread"
-.LASF3119:
+.LASF3120:
 	.string	"pbuf_old"
 .LASF2905:
 	.string	"EPD_A2_ENTER"
@@ -62068,7 +62227,7 @@ __exitcall_ebc_exit:
 	.string	"percpu_size"
 .LASF1338:
 	.string	"mmap_sem"
-.LASF3315:
+.LASF3317:
 	.string	"schedule"
 .LASF2457:
 	.string	"get_reference_args"
@@ -62174,7 +62333,7 @@ __exitcall_ebc_exit:
 	.string	"restore_noirq"
 .LASF1442:
 	.string	"ki_filp"
-.LASF3154:
+.LASF3156:
 	.string	"clac_full_data_align16"
 .LASF1127:
 	.string	"cap_ambient"
@@ -62196,13 +62355,13 @@ __exitcall_ebc_exit:
 	.string	"PROBE_DEFAULT_STRATEGY"
 .LASF2761:
 	.string	"elemsize"
-.LASF3147:
+.LASF3149:
 	.string	"clac_part_data_align16"
 .LASF906:
 	.string	"nr_events"
 .LASF2336:
 	.string	"iommu"
-.LASF3152:
+.LASF3154:
 	.string	"clac_full_data_32"
 .LASF360:
 	.string	"private"
@@ -62226,7 +62385,7 @@ __exitcall_ebc_exit:
 	.string	"uid_keyring"
 .LASF726:
 	.string	"splice_pipe"
-.LASF3126:
+.LASF3128:
 	.string	"frame_done_callback"
 .LASF1815:
 	.string	"error_remove_page"
@@ -62272,7 +62431,7 @@ __exitcall_ebc_exit:
 	.string	"compound_mapcount"
 .LASF1464:
 	.string	"zone_stat_item"
-.LASF3223:
+.LASF3225:
 	.string	"kmalloc_large"
 .LASF2641:
 	.string	"PE_SIZE_PMD"
@@ -62344,7 +62503,7 @@ __exitcall_ebc_exit:
 	.string	"last_waited"
 .LASF3085:
 	.string	"ebc_open"
-.LASF3192:
+.LASF3194:
 	.string	"three_win_mode"
 .LASF2890:
 	.string	"EPD_OVERLAY"
@@ -62398,7 +62557,7 @@ __exitcall_ebc_exit:
 	.string	"timer_expires"
 .LASF2842:
 	.string	"mmlist_lock"
-.LASF3209:
+.LASF3211:
 	.string	"ebc_pmic_power_on"
 .LASF1780:
 	.string	"trace_evals"
@@ -62442,7 +62601,7 @@ __exitcall_ebc_exit:
 	.string	"relax_count"
 .LASF1428:
 	.string	"nr_free_files"
-.LASF3222:
+.LASF3224:
 	.string	"kmalloc"
 	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
 	.section	.note.GNU-stack,"",@progbits
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h
index 91a99531ccff..148b67af5740 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h
+++ b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h
@@ -50,6 +50,12 @@ 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 needpic);
 
+//you can change overlay lut mode here
+static inline int epd_overlay_lut(void)
+{
+	return WF_TYPE_AUTO;
+}
+
 /*
  * PVI Waveform Interfaces
  */
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S
index 2105f05b4410..c33e6e1549e4 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S
@@ -14,7 +14,7 @@
 	.p2align 3,,7
 	.type	pvi_lut_init_wf_table, %function
 pvi_lut_init_wf_table:
-.LFB1557:
+.LFB1558:
 	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform.c"
 	.loc 1 679 0
 	.cfi_startproc
@@ -88,13 +88,13 @@ pvi_lut_init_wf_table:
 .L14:
 	ret
 	.cfi_endproc
-.LFE1557:
+.LFE1558:
 	.size	pvi_lut_init_wf_table, .-pvi_lut_init_wf_table
 	.align	2
 	.p2align 3,,7
 	.type	get_wf_mode_index, %function
 get_wf_mode_index:
-.LFB1551:
+.LFB1552:
 	.loc 1 473 0
 	.cfi_startproc
 .LVL8:
@@ -500,14 +500,14 @@ get_wf_mode_index:
 	add	x19, x19, 24
 	b	.L28
 	.cfi_endproc
-.LFE1551:
+.LFE1552:
 	.size	get_wf_mode_index, .-get_wf_mode_index
 	.align	2
 	.p2align 3,,7
 	.global	decodewaveform
 	.type	decodewaveform, %function
 decodewaveform:
-.LFB1547:
+.LFB1548:
 	.loc 1 67 0
 	.cfi_startproc
 .LVL29:
@@ -805,14 +805,14 @@ decodewaveform:
 	mov	w0, -22
 	b	.L65
 	.cfi_endproc
-.LFE1547:
+.LFE1548:
 	.size	decodewaveform, .-decodewaveform
 	.align	2
 	.p2align 3,,7
 	.global	decodewaveform_32
 	.type	decodewaveform_32, %function
 decodewaveform_32:
-.LFB1548:
+.LFB1549:
 	.loc 1 163 0
 	.cfi_startproc
 .LVL47:
@@ -1059,14 +1059,14 @@ decodewaveform_32:
 	mov	w0, -22
 	b	.L103
 	.cfi_endproc
-.LFE1548:
+.LFE1549:
 	.size	decodewaveform_32, .-decodewaveform_32
 	.align	2
 	.p2align 3,,7
 	.global	decodewaveform_auto
 	.type	decodewaveform_auto, %function
 decodewaveform_auto:
-.LFB1549:
+.LFB1550:
 	.loc 1 250 0
 	.cfi_startproc
 .LVL67:
@@ -1450,14 +1450,14 @@ decodewaveform_auto:
 	mov	w0, -22
 	b	.L129
 	.cfi_endproc
-.LFE1549:
+.LFE1550:
 	.size	decodewaveform_auto, .-decodewaveform_auto
 	.align	2
 	.p2align 3,,7
 	.global	pvi_wf_get_lut
 	.type	pvi_wf_get_lut, %function
 pvi_wf_get_lut:
-.LFB1559:
+.LFB1560:
 	.loc 1 744 0
 	.cfi_startproc
 .LVL93:
@@ -2193,14 +2193,14 @@ pvi_wf_get_lut:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE1559:
+.LFE1560:
 	.size	pvi_wf_get_lut, .-pvi_wf_get_lut
 	.align	2
 	.p2align 3,,7
 	.global	pvi_wf_input
 	.type	pvi_wf_input, %function
 pvi_wf_input:
-.LFB1560:
+.LFB1561:
 	.loc 1 806 0
 	.cfi_startproc
 .LVL160:
@@ -2295,14 +2295,14 @@ pvi_wf_input:
 	beq	.L248
 	b	.L245
 	.cfi_endproc
-.LFE1560:
+.LFE1561:
 	.size	pvi_wf_input, .-pvi_wf_input
 	.align	2
 	.p2align 3,,7
 	.global	pvi_wf_get_version
 	.type	pvi_wf_get_version, %function
 pvi_wf_get_version:
-.LFB1561:
+.LFB1562:
 	.loc 1 845 0
 	.cfi_startproc
 	.loc 1 846 0
@@ -2334,24 +2334,24 @@ pvi_wf_get_version:
 	.loc 1 859 0
 	ret
 	.cfi_endproc
-.LFE1561:
+.LFE1562:
 	.size	pvi_wf_get_version, .-pvi_wf_get_version
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.16936, %object
-	.size	__func__.16936, 18
-__func__.16936:
+	.type	__func__.16939, %object
+	.size	__func__.16939, 18
+__func__.16939:
 	.string	"get_wf_frm_num_32"
 	.zero	6
-	.type	__func__.16925, %object
-	.size	__func__.16925, 15
-__func__.16925:
+	.type	__func__.16928, %object
+	.size	__func__.16928, 15
+__func__.16928:
 	.string	"get_wf_frm_num"
 	.zero	1
-	.type	__func__.16948, %object
-	.size	__func__.16948, 20
-__func__.16948:
+	.type	__func__.16951, %object
+	.size	__func__.16951, 20
+__func__.16951:
 	.string	"get_wf_frm_num_auto"
 	.data
 	.align	2
@@ -2360,13 +2360,13 @@ __func__.16948:
 	.size	maxpic, 4
 maxpic:
 	.word	16
-	.type	sftemp.17006, %object
-	.size	sftemp.17006, 4
-sftemp.17006:
+	.type	sftemp.17009, %object
+	.size	sftemp.17009, 4
+sftemp.17009:
 	.word	-1
-	.type	stype.17005, %object
-	.size	stype.17005, 4
-stype.17005:
+	.type	stype.17008, %object
+	.size	stype.17008, 4
+stype.17008:
 	.word	12
 	.bss
 	.align	3
@@ -2375,18 +2375,18 @@ stype.17005:
 	.size	waveformdata, 8
 waveformdata:
 	.zero	8
-	.type	pvi_modes.16876, %object
-	.size	pvi_modes.16876, 36
-pvi_modes.16876:
+	.type	pvi_modes.16879, %object
+	.size	pvi_modes.16879, 36
+pvi_modes.16879:
 	.zero	36
 	.zero	4
 	.type	global_waveform, %object
 	.size	global_waveform, 8
 global_waveform:
 	.zero	8
-	.type	spi_id_buffer.17042, %object
-	.size	spi_id_buffer.17042, 32
-spi_id_buffer.17042:
+	.type	spi_id_buffer.17045, %object
+	.size	spi_id_buffer.17045, 32
+spi_id_buffer.17045:
 	.zero	32
 	.section	.rodata.str1.8,"aMS",@progbits,1
 	.align	3
@@ -14441,8 +14441,8 @@ spi_id_buffer.17042:
 	.byte	0x1
 	.2byte	0x34c
 	.4byte	0x55
-	.8byte	.LFB1561
-	.8byte	.LFE1561-.LFB1561
+	.8byte	.LFB1562
+	.8byte	.LFE1562-.LFB1562
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x6283
@@ -14460,7 +14460,7 @@ spi_id_buffer.17042:
 	.4byte	0x6283
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	spi_id_buffer.17042
+	.8byte	spi_id_buffer.17045
 	.uleb128 0x48
 	.string	"i"
 	.byte	0x1
@@ -14479,8 +14479,8 @@ spi_id_buffer.17042:
 	.byte	0x1
 	.2byte	0x325
 	.4byte	0xbb
-	.8byte	.LFB1560
-	.8byte	.LFE1560-.LFB1560
+	.8byte	.LFB1561
+	.8byte	.LFE1561-.LFB1561
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x62ec
@@ -14507,8 +14507,8 @@ spi_id_buffer.17042:
 	.byte	0x1
 	.2byte	0x2e7
 	.4byte	0xbb
-	.8byte	.LFB1559
-	.8byte	.LFE1559-.LFB1559
+	.8byte	.LFB1560
+	.8byte	.LFE1560-.LFB1560
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x6651
@@ -14543,7 +14543,7 @@ spi_id_buffer.17042:
 	.4byte	0x5fdb
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	stype.17005
+	.8byte	stype.17008
 	.uleb128 0x47
 	.4byte	.LASF1484
 	.byte	0x1
@@ -14551,7 +14551,7 @@ spi_id_buffer.17042:
 	.4byte	0xbb
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	sftemp.17006
+	.8byte	sftemp.17009
 	.uleb128 0x4a
 	.4byte	.LASF1485
 	.byte	0x1
@@ -14844,8 +14844,8 @@ spi_id_buffer.17042:
 	.4byte	.LASF1522
 	.byte	0x1
 	.2byte	0x2a6
-	.8byte	.LFB1557
-	.8byte	.LFE1557-.LFB1557
+	.8byte	.LFB1558
+	.8byte	.LFE1558-.LFB1558
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x6774
@@ -15193,8 +15193,8 @@ spi_id_buffer.17042:
 	.byte	0x1
 	.2byte	0x1d8
 	.4byte	0xbb
-	.8byte	.LFB1551
-	.8byte	.LFE1551-.LFB1551
+	.8byte	.LFB1552
+	.8byte	.LFE1552-.LFB1552
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x6aa9
@@ -15237,7 +15237,7 @@ spi_id_buffer.17042:
 	.4byte	0x6acc
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	pvi_modes.16876
+	.8byte	pvi_modes.16879
 	.uleb128 0x4b
 	.8byte	.LVL26
 	.4byte	0x6cfd
@@ -15269,7 +15269,7 @@ spi_id_buffer.17042:
 	.4byte	0x6ae3
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	pvi_modes.16876
+	.8byte	pvi_modes.16879
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xbb
@@ -15283,8 +15283,8 @@ spi_id_buffer.17042:
 	.byte	0x1
 	.byte	0xf9
 	.4byte	0xbb
-	.8byte	.LFB1549
-	.8byte	.LFE1549-.LFB1549
+	.8byte	.LFB1550
+	.8byte	.LFE1550-.LFB1550
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x6bb5
@@ -15356,8 +15356,8 @@ spi_id_buffer.17042:
 	.byte	0x1
 	.byte	0xa2
 	.4byte	0xbb
-	.8byte	.LFB1548
-	.8byte	.LFE1548-.LFB1548
+	.8byte	.LFB1549
+	.8byte	.LFE1549-.LFB1549
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x6c5b
@@ -15418,8 +15418,8 @@ spi_id_buffer.17042:
 	.byte	0x1
 	.byte	0x42
 	.4byte	0xbb
-	.8byte	.LFB1547
-	.8byte	.LFE1547-.LFB1547
+	.8byte	.LFB1548
+	.8byte	.LFE1548-.LFB1548
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x6cfd
@@ -16793,7 +16793,7 @@ spi_id_buffer.17042:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL164-.Ltext0
-	.8byte	.LFE1560-.Ltext0
+	.8byte	.LFE1561-.Ltext0
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
@@ -16855,7 +16855,7 @@ spi_id_buffer.17042:
 	.2byte	0x1
 	.byte	0x66
 	.8byte	.LVL156-.Ltext0
-	.8byte	.LFE1559-.Ltext0
+	.8byte	.LFE1560-.Ltext0
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
@@ -16882,7 +16882,7 @@ spi_id_buffer.17042:
 	.2byte	0x1
 	.byte	0x53
 	.8byte	.LVL156-.Ltext0
-	.8byte	.LFE1559-.Ltext0
+	.8byte	.LFE1560-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
@@ -16921,7 +16921,7 @@ spi_id_buffer.17042:
 	.2byte	0x1
 	.byte	0x63
 	.8byte	.LVL156-.Ltext0
-	.8byte	.LFE1559-.Ltext0
+	.8byte	.LFE1560-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
@@ -17109,7 +17109,7 @@ spi_id_buffer.17042:
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL17-.Ltext0
-	.8byte	.LFE1551-.Ltext0
+	.8byte	.LFE1552-.Ltext0
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S
index f6f7370003b3..3bed7bc5b6e3 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S
@@ -14,7 +14,7 @@
 	.p2align 3,,7
 	.type	decode_wf_data, %function
 decode_wf_data:
-.LFB1556:
+.LFB1557:
 	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform.c"
 	.loc 1 242 0
 	.cfi_startproc
@@ -87,13 +87,13 @@ decode_wf_data:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE1556:
+.LFE1557:
 	.size	decode_wf_data, .-decode_wf_data
 	.align	2
 	.p2align 3,,7
 	.type	parse_wf_gray16.isra.3, %function
 parse_wf_gray16.isra.3:
-.LFB1569:
+.LFB1570:
 	.loc 1 352 0
 	.cfi_startproc
 .LVL6:
@@ -288,14 +288,14 @@ parse_wf_gray16.isra.3:
 .LBE232:
 .LBE235:
 	.cfi_endproc
-.LFE1569:
+.LFE1570:
 	.size	parse_wf_gray16.isra.3, .-parse_wf_gray16.isra.3
 	.align	2
 	.p2align 3,,7
 	.global	rkf_wf_input
 	.type	rkf_wf_input, %function
 rkf_wf_input:
-.LFB1551:
+.LFB1552:
 	.loc 1 128 0
 	.cfi_startproc
 .LVL33:
@@ -532,14 +532,14 @@ rkf_wf_input:
 	.loc 1 138 0
 	b	.L35
 	.cfi_endproc
-.LFE1551:
+.LFE1552:
 	.size	rkf_wf_input, .-rkf_wf_input
 	.align	2
 	.p2align 3,,7
 	.global	rkf_wf_get_version
 	.type	rkf_wf_get_version, %function
 rkf_wf_get_version:
-.LFB1552:
+.LFB1553:
 	.loc 1 161 0
 	.cfi_startproc
 	.loc 1 162 0
@@ -552,14 +552,14 @@ rkf_wf_get_version:
 	csel	x0, x0, xzr, ne
 	ret
 	.cfi_endproc
-.LFE1552:
+.LFE1553:
 	.size	rkf_wf_get_version, .-rkf_wf_get_version
 	.align	2
 	.p2align 3,,7
 	.global	rkf_wf_get_lut
 	.type	rkf_wf_get_lut, %function
 rkf_wf_get_lut:
-.LFB1565:
+.LFB1566:
 	.loc 1 486 0
 	.cfi_startproc
 .LVL58:
@@ -1418,25 +1418,25 @@ rkf_wf_get_lut:
 	lsl	x0, x0, 2
 	b	.L76
 	.cfi_endproc
-.LFE1565:
+.LFE1566:
 	.size	rkf_wf_get_lut, .-rkf_wf_get_lut
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.16923, %object
-	.size	__func__.16923, 15
-__func__.16923:
+	.type	__func__.16926, %object
+	.size	__func__.16926, 15
+__func__.16926:
 	.string	"decode_wf_auto"
 	.data
 	.align	2
 	.set	.LANCHOR1,. + 0
-	.type	sftemp.16994, %object
-	.size	sftemp.16994, 4
-sftemp.16994:
+	.type	sftemp.16997, %object
+	.size	sftemp.16997, 4
+sftemp.16997:
 	.word	-1
-	.type	stype.16993, %object
-	.size	stype.16993, 4
-stype.16993:
+	.type	stype.16996, %object
+	.size	stype.16996, 4
+stype.16996:
 	.word	12
 	.bss
 	.align	3
@@ -13460,8 +13460,8 @@ crc32_table:
 	.byte	0x1
 	.2byte	0x1e5
 	.4byte	0xc0
-	.8byte	.LFB1565
-	.8byte	.LFE1565-.LFB1565
+	.8byte	.LFB1566
+	.8byte	.LFE1566-.LFB1566
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x69b6
@@ -13496,7 +13496,7 @@ crc32_table:
 	.4byte	0x5fb2
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	stype.16993
+	.8byte	stype.16996
 	.uleb128 0x48
 	.4byte	.LASF1471
 	.byte	0x1
@@ -13504,7 +13504,7 @@ crc32_table:
 	.4byte	0xc0
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	sftemp.16994
+	.8byte	sftemp.16997
 	.uleb128 0x49
 	.string	"ret"
 	.byte	0x1
@@ -14491,8 +14491,8 @@ crc32_table:
 	.byte	0x1
 	.byte	0xf0
 	.4byte	0x2d56
-	.8byte	.LFB1556
-	.8byte	.LFE1556-.LFB1556
+	.8byte	.LFB1557
+	.8byte	.LFE1557-.LFB1557
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x6dba
@@ -14665,8 +14665,8 @@ crc32_table:
 	.byte	0x1
 	.byte	0xa0
 	.4byte	0x55
-	.8byte	.LFB1552
-	.8byte	.LFE1552-.LFB1552
+	.8byte	.LFB1553
+	.8byte	.LFE1553-.LFB1553
 	.uleb128 0x1
 	.byte	0x9c
 	.uleb128 0x66
@@ -14674,8 +14674,8 @@ crc32_table:
 	.byte	0x1
 	.byte	0x7f
 	.4byte	0xc0
-	.8byte	.LFB1551
-	.8byte	.LFE1551-.LFB1551
+	.8byte	.LFB1552
+	.8byte	.LFE1552-.LFB1552
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x7049
@@ -15038,8 +15038,8 @@ crc32_table:
 	.byte	0
 	.uleb128 0x6a
 	.4byte	0x6b2c
-	.8byte	.LFB1569
-	.8byte	.LFE1569-.LFB1569
+	.8byte	.LFB1570
+	.8byte	.LFE1570-.LFB1570
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x735a
@@ -16651,7 +16651,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL133-.Ltext0
-	.8byte	.LFE1565-.Ltext0
+	.8byte	.LFE1566-.Ltext0
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -16694,7 +16694,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL146-.Ltext0
-	.8byte	.LFE1565-.Ltext0
+	.8byte	.LFE1566-.Ltext0
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
@@ -16872,7 +16872,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x52
 	.8byte	.LVL146-.Ltext0
-	.8byte	.LFE1565-.Ltext0
+	.8byte	.LFE1566-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
@@ -16883,7 +16883,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x53
 	.8byte	.LVL146-.Ltext0
-	.8byte	.LFE1565-.Ltext0
+	.8byte	.LFE1566-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
@@ -16894,7 +16894,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x55
 	.8byte	.LVL146-.Ltext0
-	.8byte	.LFE1565-.Ltext0
+	.8byte	.LFE1566-.Ltext0
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
@@ -17096,7 +17096,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL55-.Ltext0
-	.8byte	.LFE1551-.Ltext0
+	.8byte	.LFE1552-.Ltext0
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
@@ -17167,7 +17167,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x52
 	.8byte	.LVL21-.Ltext0
-	.8byte	.LFE1569-.Ltext0
+	.8byte	.LFE1570-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
@@ -17182,7 +17182,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x53
 	.8byte	.LVL21-.Ltext0
-	.8byte	.LFE1569-.Ltext0
+	.8byte	.LFE1570-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
@@ -17204,7 +17204,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL20-.Ltext0
-	.8byte	.LFE1569-.Ltext0
+	.8byte	.LFE1570-.Ltext0
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -17235,7 +17235,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x56
 	.8byte	.LVL32-.Ltext0
-	.8byte	.LFE1569-.Ltext0
+	.8byte	.LFE1570-.Ltext0
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
@@ -17266,7 +17266,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x54
 	.8byte	.LVL31-.Ltext0
-	.8byte	.LFE1569-.Ltext0
+	.8byte	.LFE1570-.Ltext0
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0

commit a0518f52346f6c31520aabae0ff023ff9835df37
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Sun Nov 21 14:52:36 2021 +0100

    ANDROID: GKI: disable CONFIG_FORTIFY_SOURCE
    
    This build option is broken for clang and upstream removed it in commit
    9000f2a528c0 ("fortify: Explicitly disable Clang support") so we have to
    also remove it for the gki defconfigs.
    
    Fixes: 9000f2a528c0 ("fortify: Explicitly disable Clang support")
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I8d4a1d38b736ee1fd4a6febfbab4d1a3c1c4d351

diff --git a/arch/arm64/configs/gki_defconfig b/arch/arm64/configs/gki_defconfig
index 83a30a47df95..a9f2f4afb940 100644
--- a/arch/arm64/configs/gki_defconfig
+++ b/arch/arm64/configs/gki_defconfig
@@ -491,7 +491,6 @@ CONFIG_SECURITY=y
 CONFIG_SECURITYFS=y
 CONFIG_SECURITY_NETWORK=y
 CONFIG_HARDENED_USERCOPY=y
-CONFIG_FORTIFY_SOURCE=y
 CONFIG_STATIC_USERMODEHELPER=y
 CONFIG_STATIC_USERMODEHELPER_PATH=""
 CONFIG_SECURITY_SELINUX=y
diff --git a/arch/x86/configs/gki_defconfig b/arch/x86/configs/gki_defconfig
index 5c7e06ef8a2f..3f3aaaf99b50 100644
--- a/arch/x86/configs/gki_defconfig
+++ b/arch/x86/configs/gki_defconfig
@@ -427,7 +427,6 @@ CONFIG_SECURITY=y
 CONFIG_SECURITYFS=y
 CONFIG_SECURITY_NETWORK=y
 CONFIG_HARDENED_USERCOPY=y
-CONFIG_FORTIFY_SOURCE=y
 CONFIG_STATIC_USERMODEHELPER=y
 CONFIG_STATIC_USERMODEHELPER_PATH=""
 CONFIG_SECURITY_SELINUX=y

commit 47e51a7a2295bd0499947450ab646ca14abbb088
Merge: 79ae2af2010a 1f244a54b39d
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Fri Nov 26 15:19:33 2021 +0100

    Merge 4.19.218 into android-4.19-stable
    
    Changes in 4.19.218
            xhci: Fix USB 3.1 enumeration issues by increasing roothub power-on-good delay
            binder: use euid from cred instead of using task
            binder: use cred instead of task for selinux checks
            Input: elantench - fix misreporting trackpoint coordinates
            Input: i8042 - Add quirk for Fujitsu Lifebook T725
            libata: fix read log timeout value
            ocfs2: fix data corruption on truncate
            mmc: dw_mmc: Dont wait for DRTO on Write RSP error
            parisc: Fix ptrace check on syscall return
            tpm: Check for integer overflow in tpm2_map_response_body()
            firmware/psci: fix application of sizeof to pointer
            crypto: s5p-sss - Add error handling in s5p_aes_probe()
            media: ite-cir: IR receiver stop working after receive overflow
            media: ir-kbd-i2c: improve responsiveness of hauppauge zilog receivers
            ALSA: hda/realtek: Add quirk for Clevo PC70HS
            ALSA: ua101: fix division by zero at probe
            ALSA: 6fire: fix control and bulk message timeouts
            ALSA: line6: fix control and interrupt message timeouts
            ALSA: usb-audio: Add registration quirk for JBL Quantum 400
            ALSA: synth: missing check for possible NULL after the call to kstrdup
            ALSA: timer: Fix use-after-free problem
            ALSA: timer: Unconditionally unlink slave instances, too
            x86/sme: Use #define USE_EARLY_PGTABLE_L5 in mem_encrypt_identity.c
            x86/irq: Ensure PI wakeup handler is unregistered before module unload
            cavium: Return negative value when pci_alloc_irq_vectors() fails
            scsi: qla2xxx: Fix unmap of already freed sgl
            cavium: Fix return values of the probe function
            sfc: Don't use netif_info before net_device setup
            hyperv/vmbus: include linux/bitops.h
            mmc: winbond: don't build on M68K
            drm: panel-orientation-quirks: Add quirk for Aya Neo 2021
            bpf: Prevent increasing bpf_jit_limit above max
            xen/netfront: stop tx queues during live migration
            spi: spl022: fix Microwire full duplex mode
            watchdog: Fix OMAP watchdog early handling
            vmxnet3: do not stop tx queues after netif_device_detach()
            btrfs: clear MISSING device status bit in btrfs_close_one_device
            btrfs: fix lost error handling when replaying directory deletes
            btrfs: call btrfs_check_rw_degradable only if there is a missing device
            ia64: kprobes: Fix to pass correct trampoline address to the handler
            hwmon: (pmbus/lm25066) Add offset coefficients
            regulator: s5m8767: do not use reset value as DVS voltage if GPIO DVS is disabled
            regulator: dt-bindings: samsung,s5m8767: correct s5m8767,pmic-buck-default-dvs-idx property
            EDAC/sb_edac: Fix top-of-high-memory value for Broadwell/Haswell
            mwifiex: fix division by zero in fw download path
            ath6kl: fix division by zero in send path
            ath6kl: fix control-message timeout
            ath10k: fix control-message timeout
            ath10k: fix division by zero in send path
            PCI: Mark Atheros QCA6174 to avoid bus reset
            rtl8187: fix control-message timeouts
            evm: mark evm_fixmode as __ro_after_init
            wcn36xx: Fix HT40 capability for 2Ghz band
            mwifiex: Read a PCI register after writing the TX ring write pointer
            libata: fix checking of DMA state
            wcn36xx: handle connection loss indication
            rsi: fix occasional initialisation failure with BT coex
            rsi: fix key enabled check causing unwanted encryption for vap_id > 0
            rsi: fix rate mask set leading to P2P failure
            rsi: Fix module dev_oper_mode parameter description
            RDMA/qedr: Fix NULL deref for query_qp on the GSI QP
            signal: Remove the bogus sigkill_pending in ptrace_stop
            signal/mips: Update (_save|_restore)_fp_context to fail with -EFAULT
            power: supply: max17042_battery: Prevent int underflow in set_soc_threshold
            power: supply: max17042_battery: use VFSOC for capacity when no rsns
            powerpc/85xx: Fix oops when mpc85xx_smp_guts_ids node cannot be found
            serial: core: Fix initializing and restoring termios speed
            ALSA: mixer: oss: Fix racy access to slots
            ALSA: mixer: fix deadlock in snd_mixer_oss_set_volume
            xen/balloon: add late_initcall_sync() for initial ballooning done
            PCI: aardvark: Do not clear status bits of masked interrupts
            PCI: aardvark: Do not unmask unused interrupts
            PCI: aardvark: Fix return value of MSI domain .alloc() method
            PCI: aardvark: Read all 16-bits from PCIE_MSI_PAYLOAD_REG
            quota: check block number when reading the block in quota file
            quota: correct error number in free_dqentry()
            pinctrl: core: fix possible memory leak in pinctrl_enable()
            iio: dac: ad5446: Fix ad5622_write() return value
            USB: serial: keyspan: fix memleak on probe errors
            USB: iowarrior: fix control-message timeouts
            drm: panel-orientation-quirks: Add quirk for KD Kurio Smart C15200 2-in-1
            Bluetooth: sco: Fix lock_sock() blockage by memcpy_from_msg()
            Bluetooth: fix use-after-free error in lock_sock_nested()
            platform/x86: wmi: do not fail if disabling fails
            MIPS: lantiq: dma: add small delay after reset
            MIPS: lantiq: dma: reset correct number of channel
            locking/lockdep: Avoid RCU-induced noinstr fail
            net: sched: update default qdisc visibility after Tx queue cnt changes
            smackfs: Fix use-after-free in netlbl_catmap_walk()
            x86: Increase exception stack sizes
            mwifiex: Run SET_BSS_MODE when changing from P2P to STATION vif-type
            mwifiex: Properly initialize private structure on interface type changes
            media: mt9p031: Fix corrupted frame after restarting stream
            media: netup_unidvb: handle interrupt properly according to the firmware
            media: uvcvideo: Set capability in s_param
            media: uvcvideo: Return -EIO for control errors
            media: s5p-mfc: fix possible null-pointer dereference in s5p_mfc_probe()
            media: s5p-mfc: Add checking to s5p_mfc_probe().
            media: mceusb: return without resubmitting URB in case of -EPROTO error.
            ia64: don't do IA64_CMPXCHG_DEBUG without CONFIG_PRINTK
            media: rcar-csi2: Add checking to rcsi2_start_receiver()
            ACPICA: Avoid evaluating methods too early during system resume
            media: usb: dvd-usb: fix uninit-value bug in dibusb_read_eeprom_byte()
            tracefs: Have tracefs directories not set OTH permission bits by default
            ath: dfs_pattern_detector: Fix possible null-pointer dereference in channel_detector_create()
            ACPI: battery: Accept charges over the design capacity as full
            leaking_addresses: Always print a trailing newline
            memstick: r592: Fix a UAF bug when removing the driver
            lib/xz: Avoid overlapping memcpy() with invalid input with in-place decompression
            lib/xz: Validate the value before assigning it to an enum variable
            workqueue: make sysfs of unbound kworker cpumask more clever
            tracing/cfi: Fix cmp_entries_* functions signature mismatch
            mwl8k: Fix use-after-free in mwl8k_fw_state_machine()
            PM: hibernate: Get block device exclusively in swsusp_check()
            iwlwifi: mvm: disable RX-diversity in powersave
            smackfs: use __GFP_NOFAIL for smk_cipso_doi()
            ARM: clang: Do not rely on lr register for stacktrace
            gre/sit: Don't generate link-local addr if addr_gen_mode is IN6_ADDR_GEN_MODE_NONE
            ARM: 9136/1: ARMv7-M uses BE-8, not BE-32
            spi: bcm-qspi: Fix missing clk_disable_unprepare() on error in bcm_qspi_probe()
            x86/hyperv: Protect set_hv_tscchange_cb() against getting preempted
            parisc: fix warning in flush_tlb_all
            task_stack: Fix end_of_stack() for architectures with upwards-growing stack
            parisc/unwind: fix unwinder when CONFIG_64BIT is enabled
            parisc/kgdb: add kgdb_roundup() to make kgdb work with idle polling
            Bluetooth: fix init and cleanup of sco_conn.timeout_work
            cgroup: Make rebind_subsystems() disable v2 controllers all at once
            net: dsa: rtl8366rb: Fix off-by-one bug
            drm/amdgpu: fix warning for overflow check
            media: em28xx: add missing em28xx_close_extension
            media: dvb-usb: fix ununit-value in az6027_rc_query
            media: mtk-vpu: Fix a resource leak in the error handling path of 'mtk_vpu_probe()'
            media: si470x: Avoid card name truncation
            media: cx23885: Fix snd_card_free call on null card pointer
            cpuidle: Fix kobject memory leaks in error paths
            media: em28xx: Don't use ops->suspend if it is NULL
            ath9k: Fix potential interrupt storm on queue reset
            media: dvb-frontends: mn88443x: Handle errors of clk_prepare_enable()
            crypto: qat - detect PFVF collision after ACK
            crypto: qat - disregard spurious PFVF interrupts
            hwrng: mtk - Force runtime pm ops for sleep ops
            b43legacy: fix a lower bounds test
            b43: fix a lower bounds test
            mmc: sdhci-omap: Fix NULL pointer exception if regulator is not configured
            memstick: avoid out-of-range warning
            memstick: jmb38x_ms: use appropriate free function in jmb38x_ms_alloc_host()
            hwmon: Fix possible memleak in __hwmon_device_register()
            hwmon: (pmbus/lm25066) Let compiler determine outer dimension of lm25066_coeff
            ath10k: fix max antenna gain unit
            drm/msm: uninitialized variable in msm_gem_import()
            net: stream: don't purge sk_error_queue in sk_stream_kill_queues()
            mmc: mxs-mmc: disable regulator on error and in the remove function
            platform/x86: thinkpad_acpi: Fix bitwise vs. logical warning
            rsi: stop thread firstly in rsi_91x_init() error handling
            mwifiex: Send DELBA requests according to spec
            phy: micrel: ksz8041nl: do not use power down mode
            nvme-rdma: fix error code in nvme_rdma_setup_ctrl
            PM: hibernate: fix sparse warnings
            clocksource/drivers/timer-ti-dm: Select TIMER_OF
            drm/msm: Fix potential NULL dereference in DPU SSPP
            smackfs: use netlbl_cfg_cipsov4_del() for deleting cipso_v4_doi
            s390/gmap: don't unconditionally call pte_unmap_unlock() in __gmap_zap()
            irq: mips: avoid nested irq_enter()
            tcp: don't free a FIN sk_buff in tcp_remove_empty_skb()
            samples/kretprobes: Fix return value if register_kretprobe() failed
            KVM: s390: Fix handle_sske page fault handling
            libertas_tf: Fix possible memory leak in probe and disconnect
            libertas: Fix possible memory leak in probe and disconnect
            wcn36xx: add proper DMA memory barriers in rx path
            net: amd-xgbe: Toggle PLL settings during rate change
            net: phylink: avoid mvneta warning when setting pause parameters
            crypto: pcrypt - Delay write to padata->info
            selftests/bpf: Fix fclose/pclose mismatch in test_progs
            ibmvnic: Process crqs after enabling interrupts
            RDMA/rxe: Fix wrong port_cap_flags
            ARM: s3c: irq-s3c24xx: Fix return value check for s3c24xx_init_intc()
            arm64: dts: rockchip: Fix GPU register width for RK3328
            RDMA/bnxt_re: Fix query SRQ failure
            ARM: dts: at91: tse850: the emac<->phy interface is rmii
            scsi: dc395: Fix error case unwinding
            MIPS: loongson64: make CPU_LOONGSON64 depends on MIPS_FP_SUPPORT
            JFS: fix memleak in jfs_mount
            ALSA: hda: Reduce udelay() at SKL+ position reporting
            arm: dts: omap3-gta04a4: accelerometer irq fix
            soc/tegra: Fix an error handling path in tegra_powergate_power_up()
            memory: fsl_ifc: fix leak of irq and nand_irq in fsl_ifc_ctrl_probe
            video: fbdev: chipsfb: use memset_io() instead of memset()
            serial: 8250_dw: Drop wrong use of ACPI_PTR()
            usb: gadget: hid: fix error code in do_config()
            power: supply: rt5033_battery: Change voltage values to µV
            scsi: csiostor: Uninitialized data in csio_ln_vnp_read_cbfn()
            RDMA/mlx4: Return missed an error if device doesn't support steering
            ASoC: cs42l42: Correct some register default values
            ASoC: cs42l42: Defer probe if request_threaded_irq() returns EPROBE_DEFER
            phy: qcom-qusb2: Fix a memory leak on probe
            serial: xilinx_uartps: Fix race condition causing stuck TX
            mips: cm: Convert to bitfield API to fix out-of-bounds access
            power: supply: bq27xxx: Fix kernel crash on IRQ handler register error
            apparmor: fix error check
            rpmsg: Fix rpmsg_create_ept return when RPMSG config is not defined
            pnfs/flexfiles: Fix misplaced barrier in nfs4_ff_layout_prepare_ds
            drm/plane-helper: fix uninitialized variable reference
            PCI: aardvark: Don't spam about PIO Response Status
            NFS: Fix deadlocks in nfs_scan_commit_list()
            fs: orangefs: fix error return code of orangefs_revalidate_lookup()
            mtd: spi-nor: hisi-sfc: Remove excessive clk_disable_unprepare()
            dmaengine: at_xdmac: fix AT_XDMAC_CC_PERID() macro
            auxdisplay: img-ascii-lcd: Fix lock-up when displaying empty string
            auxdisplay: ht16k33: Connect backlight to fbdev
            auxdisplay: ht16k33: Fix frame buffer device blanking
            netfilter: nfnetlink_queue: fix OOB when mac header was cleared
            dmaengine: dmaengine_desc_callback_valid(): Check for `callback_result`
            m68k: set a default value for MEMORY_RESERVE
            watchdog: f71808e_wdt: fix inaccurate report in WDIOC_GETTIMEOUT
            ar7: fix kernel builds for compiler test
            scsi: qla2xxx: Fix gnl list corruption
            scsi: qla2xxx: Turn off target reset during issue_lip
            i2c: xlr: Fix a resource leak in the error handling path of 'xlr_i2c_probe()'
            xen-pciback: Fix return in pm_ctrl_init()
            net: davinci_emac: Fix interrupt pacing disable
            ACPI: PMIC: Fix intel_pmic_regs_handler() read accesses
            bonding: Fix a use-after-free problem when bond_sysfs_slave_add() failed
            mm/zsmalloc.c: close race window between zs_pool_dec_isolated() and zs_unregister_migration()
            zram: off by one in read_block_state()
            llc: fix out-of-bound array index in llc_sk_dev_hash()
            nfc: pn533: Fix double free when pn533_fill_fragment_skbs() fails
            arm64: pgtable: make __pte_to_phys/__phys_to_pte_val inline functions
            vsock: prevent unnecessary refcnt inc for nonblocking connect
            cxgb4: fix eeprom len when diagnostics not implemented
            USB: chipidea: fix interrupt deadlock
            ARM: 9155/1: fix early early_iounmap()
            ARM: 9156/1: drop cc-option fallbacks for architecture selection
            f2fs: should use GFP_NOFS for directory inodes
            9p/net: fix missing error check in p9_check_errors
            powerpc/lib: Add helper to check if offset is within conditional branch range
            powerpc/bpf: Validate branch ranges
            powerpc/bpf: Fix BPF_SUB when imm == 0x80000000
            powerpc/security: Add a helper to query stf_barrier type
            powerpc/bpf: Emit stf barrier instruction sequences for BPF_NOSPEC
            mm, oom: pagefault_out_of_memory: don't force global OOM for dying tasks
            mm, oom: do not trigger out_of_memory from the #PF
            backlight: gpio-backlight: Correct initial power state handling
            video: backlight: Drop maximum brightness override for brightness zero
            s390/cio: check the subchannel validity for dev_busid
            s390/tape: fix timer initialization in tape_std_assign()
            PCI: Add PCI_EXP_DEVCTL_PAYLOAD_* macros
            fuse: truncate pagecache on atomic_o_trunc
            x86/cpu: Fix migration safety with X86_BUG_NULL_SEL
            ext4: fix lazy initialization next schedule time computation in more granular unit
            fortify: Explicitly disable Clang support
            parisc/entry: fix trace test in syscall exit path
            PCI/MSI: Destroy sysfs before freeing entries
            PCI/MSI: Deal with devices lying about their MSI mask capability
            PCI: Add MSI masking quirk for Nvidia ION AHCI
            erofs: remove the occupied parameter from z_erofs_pagevec_enqueue()
            erofs: fix unsafe pagevec reuse of hooked pclusters
            arm64: zynqmp: Do not duplicate flash partition label property
            arm64: zynqmp: Fix serial compatible string
            scsi: lpfc: Fix list_add() corruption in lpfc_drain_txq()
            arm64: dts: hisilicon: fix arm,sp805 compatible string
            usb: musb: tusb6010: check return value after calling platform_get_resource()
            usb: typec: tipd: Remove WARN_ON in tps6598x_block_read
            arm64: dts: freescale: fix arm,sp805 compatible string
            ASoC: nau8824: Add DMI quirk mechanism for active-high jack-detect
            scsi: advansys: Fix kernel pointer leak
            firmware_loader: fix pre-allocated buf built-in firmware use
            ARM: dts: omap: fix gpmc,mux-add-data type
            usb: host: ohci-tmio: check return value after calling platform_get_resource()
            ALSA: ISA: not for M68K
            tty: tty_buffer: Fix the softlockup issue in flush_to_ldisc
            MIPS: sni: Fix the build
            scsi: target: Fix ordered tag handling
            scsi: target: Fix alua_tg_pt_gps_count tracking
            powerpc/5200: dts: fix memory node unit name
            ALSA: gus: fix null pointer dereference on pointer block
            powerpc/dcr: Use cmplwi instead of 3-argument cmpli
            sh: check return code of request_irq
            maple: fix wrong return value of maple_bus_init().
            f2fs: fix up f2fs_lookup tracepoints
            sh: fix kconfig unmet dependency warning for FRAME_POINTER
            sh: define __BIG_ENDIAN for math-emu
            mips: BCM63XX: ensure that CPU_SUPPORTS_32BIT_KERNEL is set
            sched/core: Mitigate race cpus_share_cache()/update_top_cache_domain()
            drm/nouveau: hdmigv100.c: fix corrupted HDMI Vendor InfoFrame
            net: bnx2x: fix variable dereferenced before check
            iavf: check for null in iavf_fix_features
            iavf: Fix for the false positive ASQ/ARQ errors while issuing VF reset
            MIPS: generic/yamon-dt: fix uninitialized variable error
            mips: bcm63xx: add support for clk_get_parent()
            mips: lantiq: add support for clk_get_parent()
            platform/x86: hp_accel: Fix an error handling path in 'lis3lv02d_probe()'
            net: virtio_net_hdr_to_skb: count transport header in UFO
            i40e: Fix correct max_pkt_size on VF RX queue
            i40e: Fix NULL ptr dereference on VSI filter sync
            i40e: Fix changing previously set num_queue_pairs for PFs
            i40e: Fix display error code in dmesg
            NFC: reorganize the functions in nci_request
            NFC: reorder the logic in nfc_{un,}register_device
            perf/x86/intel/uncore: Fix filter_tid mask for CHA events on Skylake Server
            perf/x86/intel/uncore: Fix IIO event constraints for Skylake Server
            tun: fix bonding active backup with arp monitoring
            hexagon: export raw I/O routines for modules
            ipc: WARN if trying to remove ipc object which is absent
            mm: kmemleak: slob: respect SLAB_NOLEAKTRACE flag
            x86/hyperv: Fix NULL deref in set_hv_tscchange_cb() if Hyper-V setup fails
            udf: Fix crash after seekdir
            btrfs: fix memory ordering between normal and ordered work functions
            parisc/sticon: fix reverse colors
            cfg80211: call cfg80211_stop_ap when switch from P2P_GO type
            drm/udl: fix control-message timeout
            drm/amdgpu: fix set scaling mode Full/Full aspect/Center not works on vga and dvi connectors
            perf/core: Avoid put_page() when GUP fails
            batman-adv: mcast: fix duplicate mcast packets in BLA backbone from LAN
            batman-adv: Consider fragmentation for needed_headroom
            batman-adv: Reserve needed_*room for fragments
            batman-adv: Don't always reallocate the fragmentation skb head
            RDMA/netlink: Add __maybe_unused to static inline in C file
            ASoC: DAPM: Cover regression by kctl change notification fix
            usb: max-3421: Use driver data instead of maintaining a list of bound devices
            soc/tegra: pmc: Fix imbalanced clock disabling in error code path
            Linux 4.19.218
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I3f87fc92fe2a7a19ddddb522916f74dba7929583

commit 1f244a54b39dd02c69f79001b38e2650e96f1ea8
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Fri Nov 26 11:36:25 2021 +0100

    Linux 4.19.218
    
    Link: https://lore.kernel.org/r/20211124115718.822024889@linuxfoundation.org
    Tested-by: Hulk Robot <hulkrobot@huawei.com>
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Link: https://lore.kernel.org/r/20211125111805.368660289@linuxfoundation.org
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Link: https://lore.kernel.org/r/20211125160544.661624121@linuxfoundation.org
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index 6f983a62d1fd..455ba411998f 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 217
+SUBLEVEL = 218
 EXTRAVERSION =
 NAME = "People's Front"
 

commit f3c2df75d4ab1e92622a840cd1c90e41179285d2
Author: Dmitry Osipenko <digetx@gmail.com>
Date:   Tue Mar 2 15:24:58 2021 +0300

    soc/tegra: pmc: Fix imbalanced clock disabling in error code path
    
    commit 19221e3083020bd9537624caa0ee0145ed92ba36 upstream.
    
    The tegra_powergate_power_up() has a typo in the error code path where it
    will try to disable clocks twice, fix it. In practice that error never
    happens, so this is a minor correction.
    
    Tested-by: Peter Geis <pgwipeout@gmail.com> # Ouya T30
    Tested-by: Nicolas Chauvet <kwizart@gmail.com> # PAZ00 T20 and TK1 T124
    Tested-by: Matt Merhar <mattmerhar@protonmail.com> # Ouya T30
    Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
    Signed-off-by: Thierry Reding <treding@nvidia.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c
index 6c57e43787cb..c1880f88a22b 100644
--- a/drivers/soc/tegra/pmc.c
+++ b/drivers/soc/tegra/pmc.c
@@ -396,7 +396,7 @@ static int tegra_powergate_power_up(struct tegra_powergate *pg,
 
 	err = tegra_powergate_enable_clocks(pg);
 	if (err)
-		goto disable_clks;
+		goto powergate_off;
 
 	usleep_range(10, 20);
 

commit 62b4c59eb2726d9411d16f9ffe55131272ceb3c9
Author: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Date:   Mon Oct 18 22:40:28 2021 +0200

    usb: max-3421: Use driver data instead of maintaining a list of bound devices
    
    commit fc153aba3ef371d0d76eb88230ed4e0dee5b38f2 upstream.
    
    Instead of maintaining a single-linked list of devices that must be
    searched linearly in .remove() just use spi_set_drvdata() to remember the
    link between the spi device and the driver struct. Then the global list
    and the next member can be dropped.
    
    This simplifies the driver, reduces the memory footprint and the time to
    search the list. Also it makes obvious that there is always a corresponding
    driver struct for a given device in .remove(), so the error path for
    !max3421_hcd can be dropped, too.
    
    As a side effect this fixes a data inconsistency when .probe() races with
    itself for a second max3421 device in manipulating max3421_hcd_list. A
    similar race is fixed in .remove(), too.
    
    Fixes: 2d53139f3162 ("Add support for using a MAX3421E chip as a host driver.")
    Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
    Link: https://lore.kernel.org/r/20211018204028.2914597-1-u.kleine-koenig@pengutronix.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/host/max3421-hcd.c b/drivers/usb/host/max3421-hcd.c
index 16efe37b7558..507ef3acbf0c 100644
--- a/drivers/usb/host/max3421-hcd.c
+++ b/drivers/usb/host/max3421-hcd.c
@@ -125,8 +125,6 @@ struct max3421_hcd {
 
 	struct task_struct *spi_thread;
 
-	struct max3421_hcd *next;
-
 	enum max3421_rh_state rh_state;
 	/* lower 16 bits contain port status, upper 16 bits the change mask: */
 	u32 port_status;
@@ -174,8 +172,6 @@ struct max3421_ep {
 	u8 retransmit;			/* packet needs retransmission */
 };
 
-static struct max3421_hcd *max3421_hcd_list;
-
 #define MAX3421_FIFO_SIZE	64
 
 #define MAX3421_SPI_DIR_RD	0	/* read register from MAX3421 */
@@ -1899,9 +1895,8 @@ max3421_probe(struct spi_device *spi)
 	}
 	set_bit(HCD_FLAG_POLL_RH, &hcd->flags);
 	max3421_hcd = hcd_to_max3421(hcd);
-	max3421_hcd->next = max3421_hcd_list;
-	max3421_hcd_list = max3421_hcd;
 	INIT_LIST_HEAD(&max3421_hcd->ep_list);
+	spi_set_drvdata(spi, max3421_hcd);
 
 	max3421_hcd->tx = kmalloc(sizeof(*max3421_hcd->tx), GFP_KERNEL);
 	if (!max3421_hcd->tx)
@@ -1951,28 +1946,18 @@ max3421_probe(struct spi_device *spi)
 static int
 max3421_remove(struct spi_device *spi)
 {
-	struct max3421_hcd *max3421_hcd = NULL, **prev;
-	struct usb_hcd *hcd = NULL;
+	struct max3421_hcd *max3421_hcd;
+	struct usb_hcd *hcd;
 	unsigned long flags;
 
-	for (prev = &max3421_hcd_list; *prev; prev = &(*prev)->next) {
-		max3421_hcd = *prev;
-		hcd = max3421_to_hcd(max3421_hcd);
-		if (hcd->self.controller == &spi->dev)
-			break;
-	}
-	if (!max3421_hcd) {
-		dev_err(&spi->dev, "no MAX3421 HCD found for SPI device %p\n",
-			spi);
-		return -ENODEV;
-	}
+	max3421_hcd = spi_get_drvdata(spi);
+	hcd = max3421_to_hcd(max3421_hcd);
 
 	usb_remove_hcd(hcd);
 
 	spin_lock_irqsave(&max3421_hcd->lock, flags);
 
 	kthread_stop(max3421_hcd->spi_thread);
-	*prev = max3421_hcd->next;
 
 	spin_unlock_irqrestore(&max3421_hcd->lock, flags);
 

commit 21b693bf3be53aff4bfb227dadd01b777988b97f
Author: Takashi Iwai <tiwai@suse.de>
Date:   Fri Nov 5 10:09:25 2021 +0100

    ASoC: DAPM: Cover regression by kctl change notification fix
    
    commit 827b0913a9d9d07a0c3e559dbb20ca4d6d285a54 upstream.
    
    The recent fix for DAPM to correct the kctl change notification by the
    commit 5af82c81b2c4 ("ASoC: DAPM: Fix missing kctl change
    notifications") caused other regressions since it changed the behavior
    of snd_soc_dapm_set_pin() that is called from several API functions.
    Formerly it returned always 0 for success, but now it returns 0 or 1.
    
    This patch addresses it, restoring the old behavior of
    snd_soc_dapm_set_pin() while keeping the fix in
    snd_soc_dapm_put_pin_switch().
    
    Fixes: 5af82c81b2c4 ("ASoC: DAPM: Fix missing kctl change notifications")
    Reported-by: Yu-Hsuan Hsu <yuhsuan@chromium.org>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Link: https://lore.kernel.org/r/20211105090925.20575-1-tiwai@suse.de
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index 0f3489359d34..e04c48c67458 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -2511,8 +2511,13 @@ static struct snd_soc_dapm_widget *dapm_find_widget(
 	return NULL;
 }
 
-static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
-				const char *pin, int status)
+/*
+ * set the DAPM pin status:
+ * returns 1 when the value has been updated, 0 when unchanged, or a negative
+ * error code; called from kcontrol put callback
+ */
+static int __snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
+				  const char *pin, int status)
 {
 	struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
 	int ret = 0;
@@ -2538,6 +2543,18 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
 	return ret;
 }
 
+/*
+ * similar as __snd_soc_dapm_set_pin(), but returns 0 when successful;
+ * called from several API functions below
+ */
+static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
+				const char *pin, int status)
+{
+	int ret = __snd_soc_dapm_set_pin(dapm, pin, status);
+
+	return ret < 0 ? ret : 0;
+}
+
 /**
  * snd_soc_dapm_sync_unlocked - scan and power dapm paths
  * @dapm: DAPM context
@@ -3465,10 +3482,10 @@ int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol,
 	const char *pin = (const char *)kcontrol->private_value;
 	int ret;
 
-	if (ucontrol->value.integer.value[0])
-		ret = snd_soc_dapm_enable_pin(&card->dapm, pin);
-	else
-		ret = snd_soc_dapm_disable_pin(&card->dapm, pin);
+	mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
+	ret = __snd_soc_dapm_set_pin(&card->dapm, pin,
+				     !!ucontrol->value.integer.value[0]);
+	mutex_unlock(&card->dapm_mutex);
 
 	snd_soc_dapm_sync(&card->dapm);
 	return ret;

commit 773d50f4a91ef2d44a85180ffd19096107e9b5db
Author: Leon Romanovsky <leonro@nvidia.com>
Date:   Sun Nov 7 08:40:47 2021 +0200

    RDMA/netlink: Add __maybe_unused to static inline in C file
    
    commit 83dde7498fefeb920b1def317421262317d178e5 upstream.
    
    Like other commits in the tree add __maybe_unused to a static inline in a
    C file because some clang compilers will complain about unused code:
    
    >> drivers/infiniband/core/nldev.c:2543:1: warning: unused function '__chk_RDMA_NL_NLDEV'
       MODULE_ALIAS_RDMA_NETLINK(RDMA_NL_NLDEV, 5);
       ^
    
    Fixes: e3bf14bdc17a ("rdma: Autoload netlink client modules")
    Link: https://lore.kernel.org/r/4a8101919b765e01d7fde6f27fd572c958deeb4a.1636267207.git.leonro@nvidia.com
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/rdma/rdma_netlink.h b/include/rdma/rdma_netlink.h
index c369703fcd69..36cdc17de690 100644
--- a/include/rdma/rdma_netlink.h
+++ b/include/rdma/rdma_netlink.h
@@ -24,7 +24,7 @@ enum rdma_nl_flags {
  * constant as well and the compiler checks they are the same.
  */
 #define MODULE_ALIAS_RDMA_NETLINK(_index, _val)                                \
-	static inline void __chk_##_index(void)                                \
+	static inline void __maybe_unused __chk_##_index(void)                 \
 	{                                                                      \
 		BUILD_BUG_ON(_index != _val);                                  \
 	}                                                                      \

commit d6d73a8c00ddd90619daeebf36298fc80f7d2be3
Author: Sven Eckelmann <sven@narfation.org>
Date:   Sat Nov 20 13:40:44 2021 +0100

    batman-adv: Don't always reallocate the fragmentation skb head
    
    commit 992b03b88e36254e26e9a4977ab948683e21bd9f upstream.
    
    When a packet is fragmented by batman-adv, the original batman-adv header
    is not modified. Only a new fragmentation is inserted between the original
    one and the ethernet header. The code must therefore make sure that it has
    a writable region of this size in the skbuff head.
    
    But it is not useful to always reallocate the skbuff by this size even when
    there would be more than enough headroom still in the skb. The reallocation
    is just to costly during in this codepath.
    
    Fixes: ee75ed88879a ("batman-adv: Fragment and send skbs larger than mtu")
    Signed-off-by: Sven Eckelmann <sven@narfation.org>
    Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
    Signed-off-by: Sven Eckelmann <sven@narfation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/batman-adv/fragmentation.c b/net/batman-adv/fragmentation.c
index 2dbd870221e4..cc062b69fc8d 100644
--- a/net/batman-adv/fragmentation.c
+++ b/net/batman-adv/fragmentation.c
@@ -539,13 +539,14 @@ int batadv_frag_send_packet(struct sk_buff *skb,
 		frag_header.no++;
 	}
 
-	/* Make room for the fragment header. */
-	if (batadv_skb_head_push(skb, header_size) < 0 ||
-	    pskb_expand_head(skb, header_size + ETH_HLEN, 0, GFP_ATOMIC) < 0) {
-		ret = -ENOMEM;
+	/* make sure that there is at least enough head for the fragmentation
+	 * and ethernet headers
+	 */
+	ret = skb_cow_head(skb, ETH_HLEN + header_size);
+	if (ret < 0)
 		goto put_primary_if;
-	}
 
+	skb_push(skb, header_size);
 	memcpy(skb->data, &frag_header, header_size);
 
 	/* Send the last fragment */

commit aef9f5fca2790681b5a64326b3d3fb8e98f20b3c
Author: Sven Eckelmann <sven@narfation.org>
Date:   Sat Nov 20 13:40:43 2021 +0100

    batman-adv: Reserve needed_*room for fragments
    
    commit c5cbfc87558168ef4c3c27ce36eba6b83391db19 upstream.
    
    The batadv net_device is trying to propagate the needed_headroom and
    needed_tailroom from the lower devices. This is needed to avoid cost
    intensive reallocations using pskb_expand_head during the transmission.
    
    But the fragmentation code split the skb's without adding extra room at the
    end/beginning of the various fragments. This reduced the performance of
    transmissions over complex scenarios (batadv on vxlan on wireguard) because
    the lower devices had to perform the reallocations at least once.
    
    Fixes: ee75ed88879a ("batman-adv: Fragment and send skbs larger than mtu")
    Signed-off-by: Sven Eckelmann <sven@narfation.org>
    Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
    [ bp: 4.19 backported: adjust context. ]
    Signed-off-by: Sven Eckelmann <sven@narfation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/batman-adv/fragmentation.c b/net/batman-adv/fragmentation.c
index 5b71a289d04f..2dbd870221e4 100644
--- a/net/batman-adv/fragmentation.c
+++ b/net/batman-adv/fragmentation.c
@@ -403,6 +403,7 @@ bool batadv_frag_skb_fwd(struct sk_buff *skb,
 
 /**
  * batadv_frag_create() - create a fragment from skb
+ * @net_dev: outgoing device for fragment
  * @skb: skb to create fragment from
  * @frag_head: header to use in new fragment
  * @fragment_size: size of new fragment
@@ -413,22 +414,25 @@ bool batadv_frag_skb_fwd(struct sk_buff *skb,
  *
  * Return: the new fragment, NULL on error.
  */
-static struct sk_buff *batadv_frag_create(struct sk_buff *skb,
+static struct sk_buff *batadv_frag_create(struct net_device *net_dev,
+					  struct sk_buff *skb,
 					  struct batadv_frag_packet *frag_head,
 					  unsigned int fragment_size)
 {
+	unsigned int ll_reserved = LL_RESERVED_SPACE(net_dev);
+	unsigned int tailroom = net_dev->needed_tailroom;
 	struct sk_buff *skb_fragment;
 	unsigned int header_size = sizeof(*frag_head);
 	unsigned int mtu = fragment_size + header_size;
 
-	skb_fragment = netdev_alloc_skb(NULL, mtu + ETH_HLEN);
+	skb_fragment = dev_alloc_skb(ll_reserved + mtu + tailroom);
 	if (!skb_fragment)
 		goto err;
 
 	skb_fragment->priority = skb->priority;
 
 	/* Eat the last mtu-bytes of the skb */
-	skb_reserve(skb_fragment, header_size + ETH_HLEN);
+	skb_reserve(skb_fragment, ll_reserved + header_size);
 	skb_split(skb, skb_fragment, skb->len - fragment_size);
 
 	/* Add the header */
@@ -451,11 +455,12 @@ int batadv_frag_send_packet(struct sk_buff *skb,
 			    struct batadv_orig_node *orig_node,
 			    struct batadv_neigh_node *neigh_node)
 {
+	struct net_device *net_dev = neigh_node->if_incoming->net_dev;
 	struct batadv_priv *bat_priv;
 	struct batadv_hard_iface *primary_if = NULL;
 	struct batadv_frag_packet frag_header;
 	struct sk_buff *skb_fragment;
-	unsigned int mtu = neigh_node->if_incoming->net_dev->mtu;
+	unsigned int mtu = net_dev->mtu;
 	unsigned int header_size = sizeof(frag_header);
 	unsigned int max_fragment_size, num_fragments;
 	int ret;
@@ -515,7 +520,7 @@ int batadv_frag_send_packet(struct sk_buff *skb,
 			goto put_primary_if;
 		}
 
-		skb_fragment = batadv_frag_create(skb, &frag_header,
+		skb_fragment = batadv_frag_create(net_dev, skb, &frag_header,
 						  max_fragment_size);
 		if (!skb_fragment) {
 			ret = -ENOMEM;

commit 069e51e9a425851848aa5d2a937555a5f509ebc6
Author: Sven Eckelmann <sven@narfation.org>
Date:   Sat Nov 20 13:40:42 2021 +0100

    batman-adv: Consider fragmentation for needed_headroom
    
    commit 4ca23e2c2074465bff55ea14221175fecdf63c5f upstream.
    
    If a batman-adv packets has to be fragmented, then the original batman-adv
    packet header is not stripped away. Instead, only a new header is added in
    front of the packet after it was split.
    
    This size must be considered to avoid cost intensive reallocations during
    the transmission through the various device layers.
    
    Fixes: 7bca68c7844b ("batman-adv: Add lower layer needed_(head|tail)room to own ones")
    Reported-by: Linus Lüssing <linus.luessing@c0d3.blue>
    Signed-off-by: Sven Eckelmann <sven@narfation.org>
    Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
index c4e0435c952d..fc732b78daf7 100644
--- a/net/batman-adv/hard-interface.c
+++ b/net/batman-adv/hard-interface.c
@@ -565,6 +565,9 @@ static void batadv_hardif_recalc_extra_skbroom(struct net_device *soft_iface)
 	needed_headroom = lower_headroom + (lower_header_len - ETH_HLEN);
 	needed_headroom += batadv_max_header_len();
 
+	/* fragmentation headers don't strip the unicast/... header */
+	needed_headroom += sizeof(struct batadv_frag_packet);
+
 	soft_iface->needed_headroom = needed_headroom;
 	soft_iface->needed_tailroom = lower_tailroom;
 }

commit 68d6695c5095ea14056fc1cf035d222faf5db9c4
Author: Linus Lüssing <linus.luessing@c0d3.blue>
Date:   Sat Nov 20 13:40:41 2021 +0100

    batman-adv: mcast: fix duplicate mcast packets in BLA backbone from LAN
    
    commit 3236d215ad38a3f5372e65cd1e0a52cf93d3c6a2 upstream.
    
    Scenario:
    * Multicast frame send from a BLA backbone (multiple nodes with
      their bat0 bridged together, with BLA enabled)
    
    Issue:
    * BLA backbone nodes receive the frame multiple times on bat0
    
    For multicast frames received via batman-adv broadcast packets the
    originator of the broadcast packet is checked before decapsulating and
    forwarding the frame to bat0 (batadv_bla_is_backbone_gw()->
    batadv_recv_bcast_packet()). If it came from a node which shares the
    same BLA backbone with us then it is not forwarded to bat0 to avoid a
    loop.
    
    When sending a multicast frame in a non-4-address batman-adv unicast
    packet we are currently missing this check - and cannot do so because
    the batman-adv unicast packet has no originator address field.
    
    However, we can simply fix this on the sender side by only sending the
    multicast frame via unicasts to interested nodes which do not share the
    same BLA backbone with us. This also nicely avoids some unnecessary
    transmissions on mesh side.
    
    Note that no infinite loop was observed, probably because of dropping
    via batadv_interface_tx()->batadv_bla_tx(). However the duplicates still
    utterly confuse switches/bridges, ICMPv6 duplicate address detection and
    neighbor discovery and therefore leads to long delays before being able
    to establish TCP connections, for instance. And it also leads to the Linux
    bridge printing messages like:
    "br-lan: received packet on eth1 with own address as source address ..."
    
    Fixes: 1d8ab8d3c176 ("batman-adv: Modified forwarding behaviour for multicast packets")
    Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
    Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
    [ bp: 4.19 backport: drop usage in non-existing batadv_mcast_forw*, correct
      fixes line ]
    Signed-off-by: Sven Eckelmann <sven@narfation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/batman-adv/multicast.c b/net/batman-adv/multicast.c
index b90fe25d6b0b..9b3311dae2e4 100644
--- a/net/batman-adv/multicast.c
+++ b/net/batman-adv/multicast.c
@@ -62,10 +62,12 @@
 #include <uapi/linux/batadv_packet.h>
 #include <uapi/linux/batman_adv.h>
 
+#include "bridge_loop_avoidance.h"
 #include "hard-interface.h"
 #include "hash.h"
 #include "log.h"
 #include "netlink.h"
+#include "send.h"
 #include "soft-interface.h"
 #include "translation-table.h"
 #include "tvlv.h"
@@ -1024,6 +1026,35 @@ batadv_mcast_forw_mode(struct batadv_priv *bat_priv, struct sk_buff *skb,
 	}
 }
 
+/**
+ * batadv_mcast_forw_send_orig() - send a multicast packet to an originator
+ * @bat_priv: the bat priv with all the soft interface information
+ * @skb: the multicast packet to send
+ * @vid: the vlan identifier
+ * @orig_node: the originator to send the packet to
+ *
+ * Return: NET_XMIT_DROP in case of error or NET_XMIT_SUCCESS otherwise.
+ */
+int batadv_mcast_forw_send_orig(struct batadv_priv *bat_priv,
+				struct sk_buff *skb,
+				unsigned short vid,
+				struct batadv_orig_node *orig_node)
+{
+	/* Avoid sending multicast-in-unicast packets to other BLA
+	 * gateways - they already got the frame from the LAN side
+	 * we share with them.
+	 * TODO: Refactor to take BLA into account earlier, to avoid
+	 * reducing the mcast_fanout count.
+	 */
+	if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig, vid)) {
+		dev_kfree_skb(skb);
+		return NET_XMIT_SUCCESS;
+	}
+
+	return batadv_send_skb_unicast(bat_priv, skb, BATADV_UNICAST, 0,
+				       orig_node, vid);
+}
+
 /**
  * batadv_mcast_want_unsnoop_update() - update unsnoop counter and list
  * @bat_priv: the bat priv with all the soft interface information
diff --git a/net/batman-adv/multicast.h b/net/batman-adv/multicast.h
index 3b04ab13f0eb..6f9f3813fc59 100644
--- a/net/batman-adv/multicast.h
+++ b/net/batman-adv/multicast.h
@@ -51,6 +51,11 @@ enum batadv_forw_mode
 batadv_mcast_forw_mode(struct batadv_priv *bat_priv, struct sk_buff *skb,
 		       struct batadv_orig_node **mcast_single_orig);
 
+int batadv_mcast_forw_send_orig(struct batadv_priv *bat_priv,
+				struct sk_buff *skb,
+				unsigned short vid,
+				struct batadv_orig_node *orig_node);
+
 void batadv_mcast_init(struct batadv_priv *bat_priv);
 
 int batadv_mcast_flags_seq_print_text(struct seq_file *seq, void *offset);
@@ -78,6 +83,16 @@ static inline int batadv_mcast_init(struct batadv_priv *bat_priv)
 	return 0;
 }
 
+static inline int
+batadv_mcast_forw_send_orig(struct batadv_priv *bat_priv,
+			    struct sk_buff *skb,
+			    unsigned short vid,
+			    struct batadv_orig_node *orig_node)
+{
+	kfree_skb(skb);
+	return NET_XMIT_DROP;
+}
+
 static inline int
 batadv_mcast_mesh_info_put(struct sk_buff *msg, struct batadv_priv *bat_priv)
 {
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c
index 6ff78080ec7f..1003abb8cc35 100644
--- a/net/batman-adv/soft-interface.c
+++ b/net/batman-adv/soft-interface.c
@@ -367,9 +367,8 @@ static netdev_tx_t batadv_interface_tx(struct sk_buff *skb,
 				goto dropped;
 			ret = batadv_send_skb_via_gw(bat_priv, skb, vid);
 		} else if (mcast_single_orig) {
-			ret = batadv_send_skb_unicast(bat_priv, skb,
-						      BATADV_UNICAST, 0,
-						      mcast_single_orig, vid);
+			ret = batadv_mcast_forw_send_orig(bat_priv, skb, vid,
+							  mcast_single_orig);
 		} else {
 			if (batadv_dat_snoop_outgoing_arp_request(bat_priv,
 								  skb))

commit 2786340f4fc97d938ac775d3b6291849090f2056
Author: Greg Thelen <gthelen@google.com>
Date:   Wed Nov 10 18:18:14 2021 -0800

    perf/core: Avoid put_page() when GUP fails
    
    commit 4716023a8f6a0f4a28047f14dd7ebdc319606b84 upstream.
    
    PEBS PERF_SAMPLE_PHYS_ADDR events use perf_virt_to_phys() to convert PMU
    sampled virtual addresses to physical using get_user_page_fast_only()
    and page_to_phys().
    
    Some get_user_page_fast_only() error cases return false, indicating no
    page reference, but still initialize the output page pointer with an
    unreferenced page. In these error cases perf_virt_to_phys() calls
    put_page(). This causes page reference count underflow, which can lead
    to unintentional page sharing.
    
    Fix perf_virt_to_phys() to only put_page() if get_user_page_fast_only()
    returns a referenced page.
    
    Fixes: fc7ce9c74c3ad ("perf/core, x86: Add PERF_SAMPLE_PHYS_ADDR")
    Signed-off-by: Greg Thelen <gthelen@google.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20211111021814.757086-1-gthelen@google.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/events/core.c b/kernel/events/core.c
index 4a8c3f5313f9..e6e11b598438 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -6424,7 +6424,6 @@ void perf_output_sample(struct perf_output_handle *handle,
 static u64 perf_virt_to_phys(u64 virt)
 {
 	u64 phys_addr = 0;
-	struct page *p = NULL;
 
 	if (!virt)
 		return 0;
@@ -6443,14 +6442,15 @@ static u64 perf_virt_to_phys(u64 virt)
 		 * If failed, leave phys_addr as 0.
 		 */
 		if (current->mm != NULL) {
+			struct page *p;
+
 			pagefault_disable();
-			if (__get_user_pages_fast(virt, 1, 0, &p) == 1)
+			if (__get_user_pages_fast(virt, 1, 0, &p) == 1) {
 				phys_addr = page_to_phys(p) + virt % PAGE_SIZE;
+				put_page(p);
+			}
 			pagefault_enable();
 		}
-
-		if (p)
-			put_page(p);
 	}
 
 	return phys_addr;

commit b5a4fddb5b58aa637c7393dd2d8be00ca30f08de
Author: hongao <hongao@uniontech.com>
Date:   Thu Nov 11 11:32:07 2021 +0800

    drm/amdgpu: fix set scaling mode Full/Full aspect/Center not works on vga and dvi connectors
    
    commit bf552083916a7f8800477b5986940d1c9a31b953 upstream.
    
    amdgpu_connector_vga_get_modes missed function amdgpu_get_native_mode
    which assign amdgpu_encoder->native_mode with *preferred_mode result in
    amdgpu_encoder->native_mode.clock always be 0. That will cause
    amdgpu_connector_set_property returned early on:
    if ((rmx_type != DRM_MODE_SCALE_NONE) &&
            (amdgpu_encoder->native_mode.clock == 0))
    when we try to set scaling mode Full/Full aspect/Center.
    Add the missing function to amdgpu_connector_vga_get_mode can fix this.
    It also works on dvi connectors because
    amdgpu_connector_dvi_helper_funcs.get_mode use the same method.
    
    Signed-off-by: hongao <hongao@uniontech.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
index c15286858f0b..e1be3fd4d7a4 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
@@ -828,6 +828,7 @@ static int amdgpu_connector_vga_get_modes(struct drm_connector *connector)
 
 	amdgpu_connector_get_edid(connector);
 	ret = amdgpu_connector_ddc_get_modes(connector);
+	amdgpu_get_native_mode(connector);
 
 	return ret;
 }

commit 1c21a9b5e2679abd13015f9dc27473bfed4d4a15
Author: Johan Hovold <johan@kernel.org>
Date:   Mon Oct 25 13:53:53 2021 +0200

    drm/udl: fix control-message timeout
    
    commit 5591c8f79db1729d9c5ac7f5b4d3a5c26e262d93 upstream.
    
    USB control-message timeouts are specified in milliseconds and should
    specifically not vary with CONFIG_HZ.
    
    Fixes: 5320918b9a87 ("drm/udl: initial UDL driver (v4)")
    Cc: stable@vger.kernel.org      # 3.4
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
    Link: https://patchwork.freedesktop.org/patch/msgid/20211025115353.5089-1-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/udl/udl_connector.c b/drivers/gpu/drm/udl/udl_connector.c
index 68e88bed77ca..869bddad5f91 100644
--- a/drivers/gpu/drm/udl/udl_connector.c
+++ b/drivers/gpu/drm/udl/udl_connector.c
@@ -32,7 +32,7 @@ static bool udl_get_edid_block(struct udl_device *udl, int block_idx,
 		ret = usb_control_msg(udl->udev,
 				      usb_rcvctrlpipe(udl->udev, 0),
 					  (0x02), (0x80 | (0x02 << 5)), bval,
-					  0xA1, read_buff, 2, HZ);
+					  0xA1, read_buff, 2, 1000);
 		if (ret < 1) {
 			DRM_ERROR("Read EDID byte %d failed err %x\n", i, ret);
 			kfree(read_buff);

commit b8a045e2a9b234cfbc06cf36923886164358ddec
Author: Nguyen Dinh Phi <phind.uet@gmail.com>
Date:   Thu Oct 28 01:37:22 2021 +0800

    cfg80211: call cfg80211_stop_ap when switch from P2P_GO type
    
    commit 563fbefed46ae4c1f70cffb8eb54c02df480b2c2 upstream.
    
    If the userspace tools switch from NL80211_IFTYPE_P2P_GO to
    NL80211_IFTYPE_ADHOC via send_msg(NL80211_CMD_SET_INTERFACE), it
    does not call the cleanup cfg80211_stop_ap(), this leads to the
    initialization of in-use data. For example, this path re-init the
    sdata->assigned_chanctx_list while it is still an element of
    assigned_vifs list, and makes that linked list corrupt.
    
    Signed-off-by: Nguyen Dinh Phi <phind.uet@gmail.com>
    Reported-by: syzbot+bbf402b783eeb6d908db@syzkaller.appspotmail.com
    Link: https://lore.kernel.org/r/20211027173722.777287-1-phind.uet@gmail.com
    Cc: stable@vger.kernel.org
    Fixes: ac800140c20e ("cfg80211: .stop_ap when interface is going down")
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/wireless/util.c b/net/wireless/util.c
index e7be500b6452..82bf1339c28e 100644
--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -950,6 +950,7 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev,
 
 		switch (otype) {
 		case NL80211_IFTYPE_AP:
+		case NL80211_IFTYPE_P2P_GO:
 			cfg80211_stop_ap(rdev, dev, true);
 			break;
 		case NL80211_IFTYPE_ADHOC:

commit 4f4a15eb596e87e3a7c2c15e5f92a84ac2cd7827
Author: Sven Schnelle <svens@stackframe.org>
Date:   Sun Nov 14 17:08:17 2021 +0100

    parisc/sticon: fix reverse colors
    
    commit bec05f33ebc1006899c6d3e59a00c58881fe7626 upstream.
    
    sticon_build_attr() checked the reverse argument and flipped
    background and foreground color, but returned the non-reverse
    value afterwards. Fix this and also add two local variables
    for foreground and background color to make the code easier
    to read.
    
    Signed-off-by: Sven Schnelle <svens@stackframe.org>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Helge Deller <deller@gmx.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
index 79c9bd8d3025..559a7305cada 100644
--- a/drivers/video/console/sticon.c
+++ b/drivers/video/console/sticon.c
@@ -291,13 +291,13 @@ static unsigned long sticon_getxy(struct vc_data *conp, unsigned long pos,
 static u8 sticon_build_attr(struct vc_data *conp, u8 color, u8 intens,
 			    u8 blink, u8 underline, u8 reverse, u8 italic)
 {
-    u8 attr = ((color & 0x70) >> 1) | ((color & 7));
+	u8 fg = color & 7;
+	u8 bg = (color & 0x70) >> 4;
 
-    if (reverse) {
-	color = ((color >> 3) & 0x7) | ((color & 0x7) << 3);
-    }
-
-    return attr;
+	if (reverse)
+		return (fg << 3) | bg;
+	else
+		return (bg << 3) | fg;
 }
 
 static void sticon_invert_region(struct vc_data *conp, u16 *p, int count)

commit ed058d735a70f4b063323f1a7bb33cda0f987513
Author: Nikolay Borisov <nborisov@suse.com>
Date:   Tue Nov 2 14:49:16 2021 +0200

    btrfs: fix memory ordering between normal and ordered work functions
    
    commit 45da9c1767ac31857df572f0a909fbe88fd5a7e9 upstream.
    
    Ordered work functions aren't guaranteed to be handled by the same thread
    which executed the normal work functions. The only way execution between
    normal/ordered functions is synchronized is via the WORK_DONE_BIT,
    unfortunately the used bitops don't guarantee any ordering whatsoever.
    
    This manifested as seemingly inexplicable crashes on ARM64, where
    async_chunk::inode is seen as non-null in async_cow_submit which causes
    submit_compressed_extents to be called and crash occurs because
    async_chunk::inode suddenly became NULL. The call trace was similar to:
    
        pc : submit_compressed_extents+0x38/0x3d0
        lr : async_cow_submit+0x50/0xd0
        sp : ffff800015d4bc20
    
        <registers omitted for brevity>
    
        Call trace:
         submit_compressed_extents+0x38/0x3d0
         async_cow_submit+0x50/0xd0
         run_ordered_work+0xc8/0x280
         btrfs_work_helper+0x98/0x250
         process_one_work+0x1f0/0x4ac
         worker_thread+0x188/0x504
         kthread+0x110/0x114
         ret_from_fork+0x10/0x18
    
    Fix this by adding respective barrier calls which ensure that all
    accesses preceding setting of WORK_DONE_BIT are strictly ordered before
    setting the flag. At the same time add a read barrier after reading of
    WORK_DONE_BIT in run_ordered_work which ensures all subsequent loads
    would be strictly ordered after reading the bit. This in turn ensures
    are all accesses before WORK_DONE_BIT are going to be strictly ordered
    before any access that can occur in ordered_func.
    
    Reported-by: Chris Murphy <lists@colorremedies.com>
    Fixes: 08a9ff326418 ("btrfs: Added btrfs_workqueue_struct implemented ordered execution based on kernel workqueue")
    CC: stable@vger.kernel.org # 4.4+
    Link: https://bugzilla.redhat.com/show_bug.cgi?id=2011928
    Reviewed-by: Josef Bacik <josef@toxicpanda.com>
    Tested-by: Chris Murphy <chris@colorremedies.com>
    Signed-off-by: Nikolay Borisov <nborisov@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/btrfs/async-thread.c b/fs/btrfs/async-thread.c
index f79c0cb7697a..21f8f475c894 100644
--- a/fs/btrfs/async-thread.c
+++ b/fs/btrfs/async-thread.c
@@ -270,6 +270,13 @@ static void run_ordered_work(struct __btrfs_workqueue *wq,
 				  ordered_list);
 		if (!test_bit(WORK_DONE_BIT, &work->flags))
 			break;
+		/*
+		 * Orders all subsequent loads after reading WORK_DONE_BIT,
+		 * paired with the smp_mb__before_atomic in btrfs_work_helper
+		 * this guarantees that the ordered function will see all
+		 * updates from ordinary work function.
+		 */
+		smp_rmb();
 
 		/*
 		 * we are going to call the ordered done function, but
@@ -355,6 +362,13 @@ static void normal_work_helper(struct btrfs_work *work)
 	thresh_exec_hook(wq);
 	work->func(work);
 	if (need_order) {
+		/*
+		 * Ensures all memory accesses done in the work function are
+		 * ordered before setting the WORK_DONE_BIT. Ensuring the thread
+		 * which is going to executed the ordered work sees them.
+		 * Pairs with the smp_rmb in run_ordered_work.
+		 */
+		smp_mb__before_atomic();
 		set_bit(WORK_DONE_BIT, &work->flags);
 		run_ordered_work(wq, work);
 	}

commit 215c8ddcc49cb8f3cb439a88c0cd4a114e2bcbfe
Author: Jan Kara <jack@suse.cz>
Date:   Thu Nov 4 15:22:35 2021 +0100

    udf: Fix crash after seekdir
    
    commit a48fc69fe6588b48d878d69de223b91a386a7cb4 upstream.
    
    udf_readdir() didn't validate the directory position it should start
    reading from. Thus when user uses lseek(2) on directory file descriptor
    it can trick udf_readdir() into reading from a position in the middle of
    directory entry which then upsets directory parsing code resulting in
    errors or even possible kernel crashes. Similarly when the directory is
    modified between two readdir calls, the directory position need not be
    valid anymore.
    
    Add code to validate current offset in the directory. This is actually
    rather expensive for UDF as we need to read from the beginning of the
    directory and parse all directory entries. This is because in UDF a
    directory is just a stream of data containing directory entries and
    since file names are fully under user's control we cannot depend on
    detecting magic numbers and checksums in the header of directory entry
    as a malicious attacker could fake them. We skip this step if we detect
    that nothing changed since the last readdir call.
    
    Reported-by: Nathan Wilson <nate@chickenbrittle.com>
    CC: stable@vger.kernel.org
    Signed-off-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/udf/dir.c b/fs/udf/dir.c
index c19dba45aa20..d0f92a52e3ba 100644
--- a/fs/udf/dir.c
+++ b/fs/udf/dir.c
@@ -31,6 +31,7 @@
 #include <linux/mm.h>
 #include <linux/slab.h>
 #include <linux/bio.h>
+#include <linux/iversion.h>
 
 #include "udf_i.h"
 #include "udf_sb.h"
@@ -44,7 +45,7 @@ static int udf_readdir(struct file *file, struct dir_context *ctx)
 	struct fileIdentDesc *fi = NULL;
 	struct fileIdentDesc cfi;
 	udf_pblk_t block, iblock;
-	loff_t nf_pos;
+	loff_t nf_pos, emit_pos = 0;
 	int flen;
 	unsigned char *fname = NULL, *copy_name = NULL;
 	unsigned char *nameptr;
@@ -58,6 +59,7 @@ static int udf_readdir(struct file *file, struct dir_context *ctx)
 	int i, num, ret = 0;
 	struct extent_position epos = { NULL, 0, {0, 0} };
 	struct super_block *sb = dir->i_sb;
+	bool pos_valid = false;
 
 	if (ctx->pos == 0) {
 		if (!dir_emit_dot(file, ctx))
@@ -68,6 +70,21 @@ static int udf_readdir(struct file *file, struct dir_context *ctx)
 	if (nf_pos >= size)
 		goto out;
 
+	/*
+	 * Something changed since last readdir (either lseek was called or dir
+	 * changed)?  We need to verify the position correctly points at the
+	 * beginning of some dir entry so that the directory parsing code does
+	 * not get confused. Since UDF does not have any reliable way of
+	 * identifying beginning of dir entry (names are under user control),
+	 * we need to scan the directory from the beginning.
+	 */
+	if (!inode_eq_iversion(dir, file->f_version)) {
+		emit_pos = nf_pos;
+		nf_pos = 0;
+	} else {
+		pos_valid = true;
+	}
+
 	fname = kmalloc(UDF_NAME_LEN, GFP_NOFS);
 	if (!fname) {
 		ret = -ENOMEM;
@@ -123,13 +140,21 @@ static int udf_readdir(struct file *file, struct dir_context *ctx)
 
 	while (nf_pos < size) {
 		struct kernel_lb_addr tloc;
+		loff_t cur_pos = nf_pos;
 
-		ctx->pos = (nf_pos >> 2) + 1;
+		/* Update file position only if we got past the current one */
+		if (nf_pos >= emit_pos) {
+			ctx->pos = (nf_pos >> 2) + 1;
+			pos_valid = true;
+		}
 
 		fi = udf_fileident_read(dir, &nf_pos, &fibh, &cfi, &epos, &eloc,
 					&elen, &offset);
 		if (!fi)
 			goto out;
+		/* Still not at offset where user asked us to read from? */
+		if (cur_pos < emit_pos)
+			continue;
 
 		liu = le16_to_cpu(cfi.lengthOfImpUse);
 		lfi = cfi.lengthFileIdent;
@@ -187,8 +212,11 @@ static int udf_readdir(struct file *file, struct dir_context *ctx)
 	} /* end while */
 
 	ctx->pos = (nf_pos >> 2) + 1;
+	pos_valid = true;
 
 out:
+	if (pos_valid)
+		file->f_version = inode_query_iversion(dir);
 	if (fibh.sbh != fibh.ebh)
 		brelse(fibh.ebh);
 	brelse(fibh.sbh);
diff --git a/fs/udf/namei.c b/fs/udf/namei.c
index 9cfb555db1ad..1dfb9c36e6da 100644
--- a/fs/udf/namei.c
+++ b/fs/udf/namei.c
@@ -30,6 +30,7 @@
 #include <linux/sched.h>
 #include <linux/crc-itu-t.h>
 #include <linux/exportfs.h>
+#include <linux/iversion.h>
 
 static inline int udf_match(int len1, const unsigned char *name1, int len2,
 			    const unsigned char *name2)
@@ -135,6 +136,8 @@ int udf_write_fi(struct inode *inode, struct fileIdentDesc *cfi,
 			mark_buffer_dirty_inode(fibh->ebh, inode);
 		mark_buffer_dirty_inode(fibh->sbh, inode);
 	}
+	inode_inc_iversion(inode);
+
 	return 0;
 }
 
diff --git a/fs/udf/super.c b/fs/udf/super.c
index 9c71246e6d60..b7fb7cd35d89 100644
--- a/fs/udf/super.c
+++ b/fs/udf/super.c
@@ -57,6 +57,7 @@
 #include <linux/crc-itu-t.h>
 #include <linux/log2.h>
 #include <asm/byteorder.h>
+#include <linux/iversion.h>
 
 #include "udf_sb.h"
 #include "udf_i.h"
@@ -151,6 +152,7 @@ static struct inode *udf_alloc_inode(struct super_block *sb)
 	init_rwsem(&ei->i_data_sem);
 	ei->cached_extent.lstart = -1;
 	spin_lock_init(&ei->i_extent_cache_lock);
+	inode_set_iversion(&ei->vfs_inode, 1);
 
 	return &ei->vfs_inode;
 }

commit b20ec58f8a6f4fef32cc71480ddf824584e24743
Author: Sean Christopherson <seanjc@google.com>
Date:   Thu Nov 4 18:22:38 2021 +0000

    x86/hyperv: Fix NULL deref in set_hv_tscchange_cb() if Hyper-V setup fails
    
    commit daf972118c517b91f74ff1731417feb4270625a4 upstream.
    
    Check for a valid hv_vp_index array prior to derefencing hv_vp_index when
    setting Hyper-V's TSC change callback.  If Hyper-V setup failed in
    hyperv_init(), the kernel will still report that it's running under
    Hyper-V, but will have silently disabled nearly all functionality.
    
      BUG: kernel NULL pointer dereference, address: 0000000000000010
      #PF: supervisor read access in kernel mode
      #PF: error_code(0x0000) - not-present page
      PGD 0 P4D 0
      Oops: 0000 [#1] SMP
      CPU: 4 PID: 1 Comm: swapper/0 Not tainted 5.15.0-rc2+ #75
      Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0 02/06/2015
      RIP: 0010:set_hv_tscchange_cb+0x15/0xa0
      Code: <8b> 04 82 8b 15 12 17 85 01 48 c1 e0 20 48 0d ee 00 01 00 f6 c6 08
      ...
      Call Trace:
       kvm_arch_init+0x17c/0x280
       kvm_init+0x31/0x330
       vmx_init+0xba/0x13a
       do_one_initcall+0x41/0x1c0
       kernel_init_freeable+0x1f2/0x23b
       kernel_init+0x16/0x120
       ret_from_fork+0x22/0x30
    
    Fixes: 93286261de1b ("x86/hyperv: Reenlightenment notifications support")
    Cc: stable@vger.kernel.org
    Cc: Vitaly Kuznetsov <vkuznets@redhat.com>
    Signed-off-by: Sean Christopherson <seanjc@google.com>
    Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com>
    Link: https://lore.kernel.org/r/20211104182239.1302956-2-seanjc@google.com
    Signed-off-by: Wei Liu <wei.liu@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
index bd4b6951b148..38c31e164694 100644
--- a/arch/x86/hyperv/hv_init.c
+++ b/arch/x86/hyperv/hv_init.c
@@ -200,6 +200,9 @@ void set_hv_tscchange_cb(void (*cb)(void))
 		return;
 	}
 
+	if (!hv_vp_index)
+		return;
+
 	hv_reenlightenment_cb = cb;
 
 	/* Make sure callback is registered before we write to MSRs */

commit c52cef42f912ad74cea9e643edef9aec952b23cf
Author: Rustam Kovhaev <rkovhaev@gmail.com>
Date:   Fri Nov 19 16:43:37 2021 -0800

    mm: kmemleak: slob: respect SLAB_NOLEAKTRACE flag
    
    commit 34dbc3aaf5d9e89ba6cc5e24add9458c21ab1950 upstream.
    
    When kmemleak is enabled for SLOB, system does not boot and does not
    print anything to the console.  At the very early stage in the boot
    process we hit infinite recursion from kmemleak_init() and eventually
    kernel crashes.
    
    kmemleak_init() specifies SLAB_NOLEAKTRACE for KMEM_CACHE(), but
    kmem_cache_create_usercopy() removes it because CACHE_CREATE_MASK is not
    valid for SLOB.
    
    Let's fix CACHE_CREATE_MASK and make kmemleak work with SLOB
    
    Link: https://lkml.kernel.org/r/20211115020850.3154366-1-rkovhaev@gmail.com
    Fixes: d8843922fba4 ("slab: Ignore internal flags in cache creation")
    Signed-off-by: Rustam Kovhaev <rkovhaev@gmail.com>
    Acked-by: Vlastimil Babka <vbabka@suse.cz>
    Reviewed-by: Muchun Song <songmuchun@bytedance.com>
    Cc: Christoph Lameter <cl@linux.com>
    Cc: Pekka Enberg <penberg@kernel.org>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Glauber Costa <glommer@parallels.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/mm/slab.h b/mm/slab.h
index 9632772e14be..0ed7a463f476 100644
--- a/mm/slab.h
+++ b/mm/slab.h
@@ -148,7 +148,7 @@ static inline slab_flags_t kmem_cache_flags(unsigned int object_size,
 #define SLAB_CACHE_FLAGS (SLAB_NOLEAKTRACE | SLAB_RECLAIM_ACCOUNT | \
 			  SLAB_TEMPORARY | SLAB_ACCOUNT)
 #else
-#define SLAB_CACHE_FLAGS (0)
+#define SLAB_CACHE_FLAGS (SLAB_NOLEAKTRACE)
 #endif
 
 /* Common flags available with current configuration */

commit 766e08a7af4e61c8837ab1f41228ab5980868784
Author: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
Date:   Fri Nov 19 16:43:18 2021 -0800

    ipc: WARN if trying to remove ipc object which is absent
    
    commit 126e8bee943e9926238c891e2df5b5573aee76bc upstream.
    
    Patch series "shm: shm_rmid_forced feature fixes".
    
    Some time ago I met kernel crash after CRIU restore procedure,
    fortunately, it was CRIU restore, so, I had dump files and could do
    restore many times and crash reproduced easily.  After some
    investigation I've constructed the minimal reproducer.  It was found
    that it's use-after-free and it happens only if sysctl
    kernel.shm_rmid_forced = 1.
    
    The key of the problem is that the exit_shm() function not handles shp's
    object destroy when task->sysvshm.shm_clist contains items from
    different IPC namespaces.  In most cases this list will contain only
    items from one IPC namespace.
    
    How can this list contain object from different namespaces? The
    exit_shm() function is designed to clean up this list always when
    process leaves IPC namespace.  But we made a mistake a long time ago and
    did not add a exit_shm() call into the setns() syscall procedures.
    
    The first idea was just to add this call to setns() syscall but it
    obviously changes semantics of setns() syscall and that's
    userspace-visible change.  So, I gave up on this idea.
    
    The first real attempt to address the issue was just to omit forced
    destroy if we meet shp object not from current task IPC namespace [1].
    But that was not the best idea because task->sysvshm.shm_clist was
    protected by rwsem which belongs to current task IPC namespace.  It
    means that list corruption may occur.
    
    Second approach is just extend exit_shm() to properly handle shp's from
    different IPC namespaces [2].  This is really non-trivial thing, I've
    put a lot of effort into that but not believed that it's possible to
    make it fully safe, clean and clear.
    
    Thanks to the efforts of Manfred Spraul working an elegant solution was
    designed.  Thanks a lot, Manfred!
    
    Eric also suggested the way to address the issue in ("[RFC][PATCH] shm:
    In shm_exit destroy all created and never attached segments") Eric's
    idea was to maintain a list of shm_clists one per IPC namespace, use
    lock-less lists.  But there is some extra memory consumption-related
    concerns.
    
    An alternative solution which was suggested by me was implemented in
    ("shm: reset shm_clist on setns but omit forced shm destroy").  The idea
    is pretty simple, we add exit_shm() syscall to setns() but DO NOT
    destroy shm segments even if sysctl kernel.shm_rmid_forced = 1, we just
    clean up the task->sysvshm.shm_clist list.
    
    This chages semantics of setns() syscall a little bit but in comparision
    to the "naive" solution when we just add exit_shm() without any special
    exclusions this looks like a safer option.
    
    [1] https://lkml.org/lkml/2021/7/6/1108
    [2] https://lkml.org/lkml/2021/7/14/736
    
    This patch (of 2):
    
    Let's produce a warning if we trying to remove non-existing IPC object
    from IPC namespace kht/idr structures.
    
    This allows us to catch possible bugs when the ipc_rmid() function was
    called with inconsistent struct ipc_ids*, struct kern_ipc_perm*
    arguments.
    
    Link: https://lkml.kernel.org/r/20211027224348.611025-1-alexander.mikhalitsyn@virtuozzo.com
    Link: https://lkml.kernel.org/r/20211027224348.611025-2-alexander.mikhalitsyn@virtuozzo.com
    Co-developed-by: Manfred Spraul <manfred@colorfullife.com>
    Signed-off-by: Manfred Spraul <manfred@colorfullife.com>
    Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
    Cc: "Eric W. Biederman" <ebiederm@xmission.com>
    Cc: Davidlohr Bueso <dave@stgolabs.net>
    Cc: Greg KH <gregkh@linuxfoundation.org>
    Cc: Andrei Vagin <avagin@gmail.com>
    Cc: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
    Cc: Vasily Averin <vvs@virtuozzo.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/ipc/util.c b/ipc/util.c
index af1b572effb1..8f848378efda 100644
--- a/ipc/util.c
+++ b/ipc/util.c
@@ -417,8 +417,8 @@ static int ipcget_public(struct ipc_namespace *ns, struct ipc_ids *ids,
 static void ipc_kht_remove(struct ipc_ids *ids, struct kern_ipc_perm *ipcp)
 {
 	if (ipcp->key != IPC_PRIVATE)
-		rhashtable_remove_fast(&ids->key_ht, &ipcp->khtnode,
-				       ipc_kht_params);
+		WARN_ON_ONCE(rhashtable_remove_fast(&ids->key_ht, &ipcp->khtnode,
+				       ipc_kht_params));
 }
 
 /**
@@ -433,7 +433,7 @@ void ipc_rmid(struct ipc_ids *ids, struct kern_ipc_perm *ipcp)
 {
 	int idx = ipcid_to_idx(ipcp->id);
 
-	idr_remove(&ids->ipcs_idr, idx);
+	WARN_ON_ONCE(idr_remove(&ids->ipcs_idr, idx) != ipcp);
 	ipc_kht_remove(ids, ipcp);
 	ids->in_use--;
 	ipcp->deleted = true;

commit e3483646104c32d8f9aae7773961af41e91a8b78
Author: Nathan Chancellor <nathan@kernel.org>
Date:   Fri Nov 19 16:43:28 2021 -0800

    hexagon: export raw I/O routines for modules
    
    commit ffb92ce826fd801acb0f4e15b75e4ddf0d189bde upstream.
    
    Patch series "Fixes for ARCH=hexagon allmodconfig", v2.
    
    This series fixes some issues noticed with ARCH=hexagon allmodconfig.
    
    This patch (of 3):
    
    When building ARCH=hexagon allmodconfig, the following errors occur:
    
      ERROR: modpost: "__raw_readsl" [drivers/i3c/master/svc-i3c-master.ko] undefined!
      ERROR: modpost: "__raw_writesl" [drivers/i3c/master/dw-i3c-master.ko] undefined!
      ERROR: modpost: "__raw_readsl" [drivers/i3c/master/dw-i3c-master.ko] undefined!
      ERROR: modpost: "__raw_writesl" [drivers/i3c/master/i3c-master-cdns.ko] undefined!
      ERROR: modpost: "__raw_readsl" [drivers/i3c/master/i3c-master-cdns.ko] undefined!
    
    Export these symbols so that modules can use them without any errors.
    
    Link: https://lkml.kernel.org/r/20211115174250.1994179-1-nathan@kernel.org
    Link: https://lkml.kernel.org/r/20211115174250.1994179-2-nathan@kernel.org
    Fixes: 013bf24c3829 ("Hexagon: Provide basic implementation and/or stubs for I/O routines.")
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Acked-by: Brian Cain <bcain@codeaurora.org>
    Cc: Nick Desaulniers <ndesaulniers@google.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/hexagon/lib/io.c b/arch/hexagon/lib/io.c
index 885c9626d5e0..e5dfed1cf151 100644
--- a/arch/hexagon/lib/io.c
+++ b/arch/hexagon/lib/io.c
@@ -40,6 +40,7 @@ void __raw_readsw(const void __iomem *addr, void *data, int len)
 		*dst++ = *src;
 
 }
+EXPORT_SYMBOL(__raw_readsw);
 
 /*
  * __raw_writesw - read words a short at a time
@@ -60,6 +61,7 @@ void __raw_writesw(void __iomem *addr, const void *data, int len)
 
 
 }
+EXPORT_SYMBOL(__raw_writesw);
 
 /*  Pretty sure len is pre-adjusted for the length of the access already */
 void __raw_readsl(const void __iomem *addr, void *data, int len)
@@ -75,6 +77,7 @@ void __raw_readsl(const void __iomem *addr, void *data, int len)
 
 
 }
+EXPORT_SYMBOL(__raw_readsl);
 
 void __raw_writesl(void __iomem *addr, const void *data, int len)
 {
@@ -89,3 +92,4 @@ void __raw_writesl(void __iomem *addr, const void *data, int len)
 
 
 }
+EXPORT_SYMBOL(__raw_writesl);

commit a57c5cbfb5c4dff95797a189b4d093b6343bc6d2
Author: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Date:   Fri Nov 12 08:56:03 2021 +0100

    tun: fix bonding active backup with arp monitoring
    
    commit a31d27fbed5d518734cb60956303eb15089a7634 upstream.
    
    As stated in the bonding doc, trans_start must be set manually for drivers
    using NETIF_F_LLTX:
     Drivers that use NETIF_F_LLTX flag must also update
     netdev_queue->trans_start. If they do not, then the ARP monitor will
     immediately fail any slaves using that driver, and those slaves will stay
     down.
    
    Link: https://www.kernel.org/doc/html/v5.15/networking/bonding.html#arp-monitor-operation
    Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index 8ee2c519c9bf..d5bb972cbc9a 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -1085,6 +1085,7 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	struct tun_struct *tun = netdev_priv(dev);
 	int txq = skb->queue_mapping;
+	struct netdev_queue *queue;
 	struct tun_file *tfile;
 	int len = skb->len;
 
@@ -1131,6 +1132,10 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
 	if (ptr_ring_produce(&tfile->tx_ring, skb))
 		goto drop;
 
+	/* NETIF_F_LLTX requires to do our own update of trans_start */
+	queue = netdev_get_tx_queue(dev, txq);
+	queue->trans_start = jiffies;
+
 	/* Notify and wake up reader process */
 	if (tfile->flags & TUN_FASYNC)
 		kill_fasync(&tfile->fasync, SIGIO, POLL_IN);

commit 4c56f86ced54b7cf1727f6cf538776040e742a8a
Author: Alexander Antonov <alexander.antonov@linux.intel.com>
Date:   Mon Nov 15 12:03:33 2021 +0300

    perf/x86/intel/uncore: Fix IIO event constraints for Skylake Server
    
    [ Upstream commit 3866ae319c846a612109c008f43cba80b8c15e86 ]
    
    According to the latest uncore document, COMP_BUF_OCCUPANCY (0xd5) event
    can be collected on 2-3 counters. Update uncore IIO event constraints for
    Skylake Server.
    
    Fixes: cd34cd97b7b4 ("perf/x86/intel/uncore: Add Skylake server uncore support")
    Signed-off-by: Alexander Antonov <alexander.antonov@linux.intel.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Kan Liang <kan.liang@linux.intel.com>
    Link: https://lore.kernel.org/r/20211115090334.3789-3-alexander.antonov@linux.intel.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/x86/events/intel/uncore_snbep.c b/arch/x86/events/intel/uncore_snbep.c
index f6f5641c6299..2bf1170f7afd 100644
--- a/arch/x86/events/intel/uncore_snbep.c
+++ b/arch/x86/events/intel/uncore_snbep.c
@@ -3486,6 +3486,7 @@ static struct event_constraint skx_uncore_iio_constraints[] = {
 	UNCORE_EVENT_CONSTRAINT(0xc0, 0xc),
 	UNCORE_EVENT_CONSTRAINT(0xc5, 0xc),
 	UNCORE_EVENT_CONSTRAINT(0xd4, 0xc),
+	UNCORE_EVENT_CONSTRAINT(0xd5, 0xc),
 	EVENT_CONSTRAINT_END
 };
 

commit 1b36736c257dc5468338e43d540490274329210c
Author: Alexander Antonov <alexander.antonov@linux.intel.com>
Date:   Mon Nov 15 12:03:32 2021 +0300

    perf/x86/intel/uncore: Fix filter_tid mask for CHA events on Skylake Server
    
    [ Upstream commit e324234e0aa881b7841c7c713306403e12b069ff ]
    
    According Uncore Reference Manual: any of the CHA events may be filtered
    by Thread/Core-ID by using tid modifier in CHA Filter 0 Register.
    Update skx_cha_hw_config() to follow Uncore Guide.
    
    Fixes: cd34cd97b7b4 ("perf/x86/intel/uncore: Add Skylake server uncore support")
    Signed-off-by: Alexander Antonov <alexander.antonov@linux.intel.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Kan Liang <kan.liang@linux.intel.com>
    Link: https://lore.kernel.org/r/20211115090334.3789-2-alexander.antonov@linux.intel.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/x86/events/intel/uncore_snbep.c b/arch/x86/events/intel/uncore_snbep.c
index c06074b847fa..f6f5641c6299 100644
--- a/arch/x86/events/intel/uncore_snbep.c
+++ b/arch/x86/events/intel/uncore_snbep.c
@@ -3416,6 +3416,9 @@ static int skx_cha_hw_config(struct intel_uncore_box *box, struct perf_event *ev
 	struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
 	struct extra_reg *er;
 	int idx = 0;
+	/* Any of the CHA events may be filtered by Thread/Core-ID.*/
+	if (event->hw.config & SNBEP_CBO_PMON_CTL_TID_EN)
+		idx = SKX_CHA_MSR_PMON_BOX_FILTER_TID;
 
 	for (er = skx_uncore_cha_extra_regs; er->msr; er++) {
 		if (er->event != (event->hw.config & er->config_mask))

commit c45cea83e13699bdfd47842e04d09dd43af4c371
Author: Lin Ma <linma@zju.edu.cn>
Date:   Tue Nov 16 23:26:52 2021 +0800

    NFC: reorder the logic in nfc_{un,}register_device
    
    [ Upstream commit 3e3b5dfcd16a3e254aab61bd1e8c417dd4503102 ]
    
    There is a potential UAF between the unregistration routine and the NFC
    netlink operations.
    
    The race that cause that UAF can be shown as below:
    
     (FREE)                      |  (USE)
    nfcmrvl_nci_unregister_dev   |  nfc_genl_dev_up
      nci_close_device           |
      nci_unregister_device      |    nfc_get_device
        nfc_unregister_device    |    nfc_dev_up
          rfkill_destory         |
          device_del             |      rfkill_blocked
      ...                        |    ...
    
    The root cause for this race is concluded below:
    1. The rfkill_blocked (USE) in nfc_dev_up is supposed to be placed after
    the device_is_registered check.
    2. Since the netlink operations are possible just after the device_add
    in nfc_register_device, the nfc_dev_up() can happen anywhere during the
    rfkill creation process, which leads to data race.
    
    This patch reorder these actions to permit
    1. Once device_del is finished, the nfc_dev_up cannot dereference the
    rfkill object.
    2. The rfkill_register need to be placed after the device_add of nfc_dev
    because the parent device need to be created first. So this patch keeps
    the order but inject device_lock to prevent the data race.
    
    Signed-off-by: Lin Ma <linma@zju.edu.cn>
    Fixes: be055b2f89b5 ("NFC: RFKILL support")
    Reviewed-by: Jakub Kicinski <kuba@kernel.org>
    Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Link: https://lore.kernel.org/r/20211116152652.19217-1-linma@zju.edu.cn
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/nfc/core.c b/net/nfc/core.c
index 947a470f929d..ff646d1758d1 100644
--- a/net/nfc/core.c
+++ b/net/nfc/core.c
@@ -106,13 +106,13 @@ int nfc_dev_up(struct nfc_dev *dev)
 
 	device_lock(&dev->dev);
 
-	if (dev->rfkill && rfkill_blocked(dev->rfkill)) {
-		rc = -ERFKILL;
+	if (!device_is_registered(&dev->dev)) {
+		rc = -ENODEV;
 		goto error;
 	}
 
-	if (!device_is_registered(&dev->dev)) {
-		rc = -ENODEV;
+	if (dev->rfkill && rfkill_blocked(dev->rfkill)) {
+		rc = -ERFKILL;
 		goto error;
 	}
 
@@ -1130,11 +1130,7 @@ int nfc_register_device(struct nfc_dev *dev)
 	if (rc)
 		pr_err("Could not register llcp device\n");
 
-	rc = nfc_genl_device_added(dev);
-	if (rc)
-		pr_debug("The userspace won't be notified that the device %s was added\n",
-			 dev_name(&dev->dev));
-
+	device_lock(&dev->dev);
 	dev->rfkill = rfkill_alloc(dev_name(&dev->dev), &dev->dev,
 				   RFKILL_TYPE_NFC, &nfc_rfkill_ops, dev);
 	if (dev->rfkill) {
@@ -1143,6 +1139,12 @@ int nfc_register_device(struct nfc_dev *dev)
 			dev->rfkill = NULL;
 		}
 	}
+	device_unlock(&dev->dev);
+
+	rc = nfc_genl_device_added(dev);
+	if (rc)
+		pr_debug("The userspace won't be notified that the device %s was added\n",
+			 dev_name(&dev->dev));
 
 	return 0;
 }
@@ -1159,10 +1161,17 @@ void nfc_unregister_device(struct nfc_dev *dev)
 
 	pr_debug("dev_name=%s\n", dev_name(&dev->dev));
 
+	rc = nfc_genl_device_removed(dev);
+	if (rc)
+		pr_debug("The userspace won't be notified that the device %s "
+			 "was removed\n", dev_name(&dev->dev));
+
+	device_lock(&dev->dev);
 	if (dev->rfkill) {
 		rfkill_unregister(dev->rfkill);
 		rfkill_destroy(dev->rfkill);
 	}
+	device_unlock(&dev->dev);
 
 	if (dev->ops->check_presence) {
 		device_lock(&dev->dev);
@@ -1172,11 +1181,6 @@ void nfc_unregister_device(struct nfc_dev *dev)
 		cancel_work_sync(&dev->check_pres_work);
 	}
 
-	rc = nfc_genl_device_removed(dev);
-	if (rc)
-		pr_debug("The userspace won't be notified that the device %s "
-			 "was removed\n", dev_name(&dev->dev));
-
 	nfc_llcp_unregister_device(dev);
 
 	mutex_lock(&nfc_devlist_mutex);

commit 62be2b1e7914b7340281f09412a7bbb62e6c8b67
Author: Lin Ma <linma@zju.edu.cn>
Date:   Mon Nov 15 22:56:00 2021 +0800

    NFC: reorganize the functions in nci_request
    
    [ Upstream commit 86cdf8e38792545161dbe3350a7eced558ba4d15 ]
    
    There is a possible data race as shown below:
    
    thread-A in nci_request()       | thread-B in nci_close_device()
                                    | mutex_lock(&ndev->req_lock);
    test_bit(NCI_UP, &ndev->flags); |
    ...                             | test_and_clear_bit(NCI_UP, &ndev->flags)
    mutex_lock(&ndev->req_lock);    |
                                    |
    
    This race will allow __nci_request() to be awaked while the device is
    getting removed.
    
    Similar to commit e2cb6b891ad2 ("bluetooth: eliminate the potential race
    condition when removing the HCI controller"). this patch alters the
    function sequence in nci_request() to prevent the data races between the
    nci_close_device().
    
    Signed-off-by: Lin Ma <linma@zju.edu.cn>
    Fixes: 6a2968aaf50c ("NFC: basic NCI protocol implementation")
    Link: https://lore.kernel.org/r/20211115145600.8320-1-linma@zju.edu.cn
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/nfc/nci/core.c b/net/nfc/nci/core.c
index 33c23af6709d..1008bbbb3af9 100644
--- a/net/nfc/nci/core.c
+++ b/net/nfc/nci/core.c
@@ -156,12 +156,15 @@ inline int nci_request(struct nci_dev *ndev,
 {
 	int rc;
 
-	if (!test_bit(NCI_UP, &ndev->flags))
-		return -ENETDOWN;
-
 	/* Serialize all requests */
 	mutex_lock(&ndev->req_lock);
-	rc = __nci_request(ndev, req, opt, timeout);
+	/* check the state after obtaing the lock against any races
+	 * from nci_close_device when the device gets removed.
+	 */
+	if (test_bit(NCI_UP, &ndev->flags))
+		rc = __nci_request(ndev, req, opt, timeout);
+	else
+		rc = -ENETDOWN;
 	mutex_unlock(&ndev->req_lock);
 
 	return rc;

commit ea9864b901d7c3a911db2e7e1b52d845ba441f94
Author: Grzegorz Szczurek <grzegorzx.szczurek@intel.com>
Date:   Fri Oct 29 11:26:01 2021 +0200

    i40e: Fix display error code in dmesg
    
    [ Upstream commit 5aff430d4e33a0b48a6b3d5beb06f79da23f9916 ]
    
    Fix misleading display error in dmesg if tc filter return fail.
    Only i40e status error code should be converted to string, not linux
    error code. Otherwise, we return false information about the error.
    
    Fixes: 2f4b411a3d67 ("i40e: Enable cloud filters via tc-flower")
    Signed-off-by: Grzegorz Szczurek <grzegorzx.szczurek@intel.com>
    Signed-off-by: Mateusz Palczewski <mateusz.palczewski@intel.com>
    Tested-by: Dave Switzer <david.switzer@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 222eb82d5610..51edc7fdc9b9 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -7517,9 +7517,8 @@ static int i40e_configure_clsflower(struct i40e_vsi *vsi,
 		err = i40e_add_del_cloud_filter(vsi, filter, true);
 
 	if (err) {
-		dev_err(&pf->pdev->dev,
-			"Failed to add cloud filter, err %s\n",
-			i40e_stat_str(&pf->hw, err));
+		dev_err(&pf->pdev->dev, "Failed to add cloud filter, err %d\n",
+			err);
 		goto err;
 	}
 

commit beab6de2c185cbf9a899a873a6a2008d027b6883
Author: Eryk Rybak <eryk.roch.rybak@intel.com>
Date:   Fri Apr 23 13:43:25 2021 +0200

    i40e: Fix changing previously set num_queue_pairs for PFs
    
    [ Upstream commit d2a69fefd75683004ffe87166de5635b3267ee07 ]
    
    Currently, the i40e_vsi_setup_queue_map is basing the count of queues in
    TCs on a VSI's alloc_queue_pairs member which is not changed throughout
    any user's action (for example via ethtool's set_channels callback).
    
    This implies that vsi->tc_config.tc_info[n].qcount value that is given
    to the kernel via netdev_set_tc_queue() that notifies about the count of
    queues per particular traffic class is constant even if user has changed
    the total count of queues.
    
    This in turn caused the kernel warning after setting the queue count to
    the lower value than the initial one:
    
    $ ethtool -l ens801f0
    Channel parameters for ens801f0:
    Pre-set maximums:
    RX:             0
    TX:             0
    Other:          1
    Combined:       64
    Current hardware settings:
    RX:             0
    TX:             0
    Other:          1
    Combined:       64
    
    $ ethtool -L ens801f0 combined 40
    
    [dmesg]
    Number of in use tx queues changed invalidating tc mappings. Priority
    traffic classification disabled!
    
    Reason was that vsi->alloc_queue_pairs stayed at 64 value which was used
    to set the qcount on TC0 (by default only TC0 exists so all of the
    existing queues are assigned to TC0). we update the offset/qcount via
    netdev_set_tc_queue() back to the old value but then the
    netif_set_real_num_tx_queues() is using the vsi->num_queue_pairs as a
    value which got set to 40.
    
    Fix it by using vsi->req_queue_pairs as a queue count that will be
    distributed across TCs. Do it only for non-zero values, which implies
    that user actually requested the new count of queues.
    
    For VSIs other than main, stay with the vsi->alloc_queue_pairs as we
    only allow manipulating the queue count on main VSI.
    
    Fixes: bc6d33c8d93f ("i40e: Fix the number of queues available to be mapped for use")
    Co-developed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
    Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
    Co-developed-by: Przemyslaw Patynowski <przemyslawx.patynowski@intel.com>
    Signed-off-by: Przemyslaw Patynowski <przemyslawx.patynowski@intel.com>
    Signed-off-by: Eryk Rybak <eryk.roch.rybak@intel.com>
    Tested-by: Tony Brelinski <tony.brelinski@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index d948ca636842..222eb82d5610 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -1765,6 +1765,7 @@ static void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi,
 				     bool is_add)
 {
 	struct i40e_pf *pf = vsi->back;
+	u16 num_tc_qps = 0;
 	u16 sections = 0;
 	u8 netdev_tc = 0;
 	u16 numtc = 1;
@@ -1772,13 +1773,29 @@ static void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi,
 	u8 offset;
 	u16 qmap;
 	int i;
-	u16 num_tc_qps = 0;
 
 	sections = I40E_AQ_VSI_PROP_QUEUE_MAP_VALID;
 	offset = 0;
 
+	if (vsi->type == I40E_VSI_MAIN) {
+		/* This code helps add more queue to the VSI if we have
+		 * more cores than RSS can support, the higher cores will
+		 * be served by ATR or other filters. Furthermore, the
+		 * non-zero req_queue_pairs says that user requested a new
+		 * queue count via ethtool's set_channels, so use this
+		 * value for queues distribution across traffic classes
+		 */
+		if (vsi->req_queue_pairs > 0)
+			vsi->num_queue_pairs = vsi->req_queue_pairs;
+		else if (pf->flags & I40E_FLAG_MSIX_ENABLED)
+			vsi->num_queue_pairs = pf->num_lan_msix;
+	}
+
 	/* Number of queues per enabled TC */
-	num_tc_qps = vsi->alloc_queue_pairs;
+	if (vsi->type == I40E_VSI_MAIN)
+		num_tc_qps = vsi->num_queue_pairs;
+	else
+		num_tc_qps = vsi->alloc_queue_pairs;
 	if (enabled_tc && (vsi->back->flags & I40E_FLAG_DCB_ENABLED)) {
 		/* Find numtc from enabled TC bitmap */
 		for (i = 0, numtc = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
@@ -1856,16 +1873,10 @@ static void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi,
 		}
 		ctxt->info.tc_mapping[i] = cpu_to_le16(qmap);
 	}
-
-	/* Set actual Tx/Rx queue pairs */
-	vsi->num_queue_pairs = offset;
-	if ((vsi->type == I40E_VSI_MAIN) && (numtc == 1)) {
-		if (vsi->req_queue_pairs > 0)
-			vsi->num_queue_pairs = vsi->req_queue_pairs;
-		else if (pf->flags & I40E_FLAG_MSIX_ENABLED)
-			vsi->num_queue_pairs = pf->num_lan_msix;
-	}
-
+	/* Do not change previously set num_queue_pairs for PFs */
+	if ((vsi->type == I40E_VSI_MAIN && numtc != 1) ||
+	    vsi->type != I40E_VSI_MAIN)
+		vsi->num_queue_pairs = offset;
 	/* Scheduler section valid can only be set for ADD VSI */
 	if (is_add) {
 		sections |= I40E_AQ_VSI_PROP_SCHED_VALID;

commit 87c421ab4a43433cb009fea44bbbc77f46913e1d
Author: Michal Maloszewski <michal.maloszewski@intel.com>
Date:   Wed Feb 24 12:07:48 2021 +0000

    i40e: Fix NULL ptr dereference on VSI filter sync
    
    [ Upstream commit 37d9e304acd903a445df8208b8a13d707902dea6 ]
    
    Remove the reason of null pointer dereference in sync VSI filters.
    Added new I40E_VSI_RELEASING flag to signalize deleting and releasing
    of VSI resources to sync this thread with sync filters subtask.
    Without this patch it is possible to start update the VSI filter list
    after VSI is removed, that's causing a kernel oops.
    
    Fixes: 41c445ff0f48 ("i40e: main driver core")
    Signed-off-by: Grzegorz Szczurek <grzegorzx.szczurek@intel.com>
    Signed-off-by: Michal Maloszewski <michal.maloszewski@intel.com>
    Reviewed-by: Przemyslaw Patynowski <przemyslawx.patynowski@intel.com>
    Reviewed-by: Witold Fijalkowski <witoldx.fijalkowski@intel.com>
    Reviewed-by: Jaroslaw Gawin <jaroslawx.gawin@intel.com>
    Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
    Tested-by: Tony Brelinski <tony.brelinski@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h
index 3c921dfc2056..519b59594423 100644
--- a/drivers/net/ethernet/intel/i40e/i40e.h
+++ b/drivers/net/ethernet/intel/i40e/i40e.h
@@ -166,6 +166,7 @@ enum i40e_vsi_state_t {
 	__I40E_VSI_OVERFLOW_PROMISC,
 	__I40E_VSI_REINIT_REQUESTED,
 	__I40E_VSI_DOWN_REQUESTED,
+	__I40E_VSI_RELEASING,
 	/* This must be last as it determines the size of the BITMAP */
 	__I40E_VSI_STATE_SIZE__,
 };
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 062b94251782..d948ca636842 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -2584,7 +2584,8 @@ static void i40e_sync_filters_subtask(struct i40e_pf *pf)
 
 	for (v = 0; v < pf->num_alloc_vsi; v++) {
 		if (pf->vsi[v] &&
-		    (pf->vsi[v]->flags & I40E_VSI_FLAG_FILTER_CHANGED)) {
+		    (pf->vsi[v]->flags & I40E_VSI_FLAG_FILTER_CHANGED) &&
+		    !test_bit(__I40E_VSI_RELEASING, pf->vsi[v]->state)) {
 			int ret = i40e_sync_vsi_filters(pf->vsi[v]);
 
 			if (ret) {
@@ -12444,7 +12445,7 @@ int i40e_vsi_release(struct i40e_vsi *vsi)
 		dev_info(&pf->pdev->dev, "Can't remove PF VSI\n");
 		return -ENODEV;
 	}
-
+	set_bit(__I40E_VSI_RELEASING, vsi->state);
 	uplink_seid = vsi->uplink_seid;
 	if (vsi->type != I40E_VSI_SRIOV) {
 		if (vsi->netdev_registered) {

commit 86ae0dfff1a7163c15c61badbf0360495c7fe9d4
Author: Eryk Rybak <eryk.roch.rybak@intel.com>
Date:   Thu Jan 21 16:17:22 2021 +0000

    i40e: Fix correct max_pkt_size on VF RX queue
    
    [ Upstream commit 6afbd7b3c53cb7417189f476e99d431daccb85b0 ]
    
    Setting VLAN port increasing RX queue max_pkt_size
    by 4 bytes to take VLAN tag into account.
    Trigger the VF reset when setting port VLAN for
    VF to renegotiate its capabilities and reinitialize.
    
    Fixes: ba4e003d29c1 ("i40e: don't hold spinlock while resetting VF")
    Signed-off-by: Sylwester Dziedziuch <sylwesterx.dziedziuch@intel.com>
    Signed-off-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
    Signed-off-by: Eryk Rybak <eryk.roch.rybak@intel.com>
    Tested-by: Konrad Jankowski <konrad0.jankowski@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
index 3c1533c627fd..02d245970d7f 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
@@ -621,14 +621,13 @@ static int i40e_config_vsi_rx_queue(struct i40e_vf *vf, u16 vsi_id,
 				    u16 vsi_queue_id,
 				    struct virtchnl_rxq_info *info)
 {
+	u16 pf_queue_id = i40e_vc_get_pf_queue_id(vf, vsi_id, vsi_queue_id);
 	struct i40e_pf *pf = vf->pf;
+	struct i40e_vsi *vsi = pf->vsi[vf->lan_vsi_idx];
 	struct i40e_hw *hw = &pf->hw;
 	struct i40e_hmc_obj_rxq rx_ctx;
-	u16 pf_queue_id;
 	int ret = 0;
 
-	pf_queue_id = i40e_vc_get_pf_queue_id(vf, vsi_id, vsi_queue_id);
-
 	/* clear the context structure first */
 	memset(&rx_ctx, 0, sizeof(struct i40e_hmc_obj_rxq));
 
@@ -666,6 +665,10 @@ static int i40e_config_vsi_rx_queue(struct i40e_vf *vf, u16 vsi_id,
 	}
 	rx_ctx.rxmax = info->max_pkt_size;
 
+	/* if port VLAN is configured increase the max packet size */
+	if (vsi->info.pvid)
+		rx_ctx.rxmax += VLAN_HLEN;
+
 	/* enable 32bytes desc always */
 	rx_ctx.dsize = 1;
 
@@ -3927,34 +3930,6 @@ int i40e_ndo_set_vf_mac(struct net_device *netdev, int vf_id, u8 *mac)
 	return ret;
 }
 
-/**
- * i40e_vsi_has_vlans - True if VSI has configured VLANs
- * @vsi: pointer to the vsi
- *
- * Check if a VSI has configured any VLANs. False if we have a port VLAN or if
- * we have no configured VLANs. Do not call while holding the
- * mac_filter_hash_lock.
- */
-static bool i40e_vsi_has_vlans(struct i40e_vsi *vsi)
-{
-	bool have_vlans;
-
-	/* If we have a port VLAN, then the VSI cannot have any VLANs
-	 * configured, as all MAC/VLAN filters will be assigned to the PVID.
-	 */
-	if (vsi->info.pvid)
-		return false;
-
-	/* Since we don't have a PVID, we know that if the device is in VLAN
-	 * mode it must be because of a VLAN filter configured on this VSI.
-	 */
-	spin_lock_bh(&vsi->mac_filter_hash_lock);
-	have_vlans = i40e_is_vsi_in_vlan(vsi);
-	spin_unlock_bh(&vsi->mac_filter_hash_lock);
-
-	return have_vlans;
-}
-
 /**
  * i40e_ndo_set_vf_port_vlan
  * @netdev: network interface device structure
@@ -4007,19 +3982,9 @@ int i40e_ndo_set_vf_port_vlan(struct net_device *netdev, int vf_id,
 		/* duplicate request, so just return success */
 		goto error_pvid;
 
-	if (i40e_vsi_has_vlans(vsi)) {
-		dev_err(&pf->pdev->dev,
-			"VF %d has already configured VLAN filters and the administrator is requesting a port VLAN override.\nPlease unload and reload the VF driver for this change to take effect.\n",
-			vf_id);
-		/* Administrator Error - knock the VF offline until he does
-		 * the right thing by reconfiguring his network correctly
-		 * and then reloading the VF driver.
-		 */
-		i40e_vc_disable_vf(vf);
-		/* During reset the VF got a new VSI, so refresh the pointer. */
-		vsi = pf->vsi[vf->lan_vsi_idx];
-	}
-
+	i40e_vc_disable_vf(vf);
+	/* During reset the VF got a new VSI, so refresh a pointer. */
+	vsi = pf->vsi[vf->lan_vsi_idx];
 	/* Locked once because multiple functions below iterate list */
 	spin_lock_bh(&vsi->mac_filter_hash_lock);
 

commit 960b360ca7463921c1a6b72e7066a706d6406223
Author: Jonathan Davies <jonathan.davies@nutanix.com>
Date:   Tue Nov 16 17:42:42 2021 +0000

    net: virtio_net_hdr_to_skb: count transport header in UFO
    
    [ Upstream commit cf9acc90c80ecbee00334aa85d92f4e74014bcff ]
    
    virtio_net_hdr_to_skb does not set the skb's gso_size and gso_type
    correctly for UFO packets received via virtio-net that are a little over
    the GSO size. This can lead to problems elsewhere in the networking
    stack, e.g. ovs_vport_send dropping over-sized packets if gso_size is
    not set.
    
    This is due to the comparison
    
      if (skb->len - p_off > gso_size)
    
    not properly accounting for the transport layer header.
    
    p_off includes the size of the transport layer header (thlen), so
    skb->len - p_off is the size of the TCP/UDP payload.
    
    gso_size is read from the virtio-net header. For UFO, fragmentation
    happens at the IP level so does not need to include the UDP header.
    
    Hence the calculation could be comparing a TCP/UDP payload length with
    an IP payload length, causing legitimate virtio-net packets to have
    lack gso_type/gso_size information.
    
    Example: a UDP packet with payload size 1473 has IP payload size 1481.
    If the guest used UFO, it is not fragmented and the virtio-net header's
    flags indicate that it is a GSO frame (VIRTIO_NET_HDR_GSO_UDP), with
    gso_size = 1480 for an MTU of 1500.  skb->len will be 1515 and p_off
    will be 42, so skb->len - p_off = 1473.  Hence the comparison fails, and
    shinfo->gso_size and gso_type are not set as they should be.
    
    Instead, add the UDP header length before comparing to gso_size when
    using UFO. In this way, it is the size of the IP payload that is
    compared to gso_size.
    
    Fixes: 6dd912f82680 ("net: check untrusted gso_size at kernel entry")
    Signed-off-by: Jonathan Davies <jonathan.davies@nutanix.com>
    Reviewed-by: Willem de Bruijn <willemb@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/virtio_net.h b/include/linux/virtio_net.h
index 8f48264f5dab..e7330a9a7d7d 100644
--- a/include/linux/virtio_net.h
+++ b/include/linux/virtio_net.h
@@ -120,10 +120,15 @@ static inline int virtio_net_hdr_to_skb(struct sk_buff *skb,
 
 	if (hdr->gso_type != VIRTIO_NET_HDR_GSO_NONE) {
 		u16 gso_size = __virtio16_to_cpu(little_endian, hdr->gso_size);
+		unsigned int nh_off = p_off;
 		struct skb_shared_info *shinfo = skb_shinfo(skb);
 
+		/* UFO may not include transport header in gso_size. */
+		if (gso_type & SKB_GSO_UDP)
+			nh_off -= thlen;
+
 		/* Too small packets are not really GSO ones. */
-		if (skb->len - p_off > gso_size) {
+		if (skb->len - nh_off > gso_size) {
 			shinfo->gso_size = gso_size;
 			shinfo->gso_type = gso_type;
 

commit 337f79a1c64ed2006a6882c535ed5468270abe74
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Sun Nov 7 20:57:07 2021 +0100

    platform/x86: hp_accel: Fix an error handling path in 'lis3lv02d_probe()'
    
    [ Upstream commit c961a7d2aa23ae19e0099fbcdf1040fb760eea83 ]
    
    If 'led_classdev_register()' fails, some additional resources should be
    released.
    
    Add the missing 'i8042_remove_filter()' and 'lis3lv02d_remove_fs()' calls
    that are already in the remove function but are missing here.
    
    Fixes: a4c724d0723b ("platform: hp_accel: add a i8042 filter to remove HPQ6000 data from kb bus stream")
    Fixes: 9e0c79782143 ("lis3lv02d: merge with leds hp disk")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Link: https://lore.kernel.org/r/5a4f218f8f16d2e3a7906b7ca3654ffa946895f8.1636314074.git.christophe.jaillet@wanadoo.fr
    Reviewed-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/platform/x86/hp_accel.c b/drivers/platform/x86/hp_accel.c
index 9c3c83ef445b..075332c6890d 100644
--- a/drivers/platform/x86/hp_accel.c
+++ b/drivers/platform/x86/hp_accel.c
@@ -383,9 +383,11 @@ static int lis3lv02d_add(struct acpi_device *device)
 	INIT_WORK(&hpled_led.work, delayed_set_status_worker);
 	ret = led_classdev_register(NULL, &hpled_led.led_classdev);
 	if (ret) {
+		i8042_remove_filter(hp_accel_i8042_filter);
 		lis3lv02d_joystick_disable(&lis3_dev);
 		lis3lv02d_poweroff(&lis3_dev);
 		flush_work(&hpled_led.work);
+		lis3lv02d_remove_fs(&lis3_dev);
 		return ret;
 	}
 

commit bd444e993e1221d502ed2a02d65dd3af10e27484
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Sun Nov 14 17:20:51 2021 -0800

    mips: lantiq: add support for clk_get_parent()
    
    [ Upstream commit fc1aabb088860d6cf9dd03612b7a6f0de91ccac2 ]
    
    Provide a simple implementation of clk_get_parent() in the
    lantiq subarch so that callers of it will build without errors.
    
    Fixes this build error:
    ERROR: modpost: "clk_get_parent" [drivers/iio/adc/ingenic-adc.ko] undefined!
    
    Fixes: 171bb2f19ed6 ("MIPS: Lantiq: Add initial support for Lantiq SoCs")
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Suggested-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Cc: linux-mips@vger.kernel.org
    Cc: John Crispin <john@phrozen.org>
    Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Cc: Jonathan Cameron <jic23@kernel.org>
    Cc: linux-iio@vger.kernel.org
    Cc: Russell King <linux@armlinux.org.uk>
    Cc: Andy Shevchenko <andy.shevchenko@gmail.com>
    Acked-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Acked-by: John Crispin <john@phrozen.org>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/lantiq/clk.c b/arch/mips/lantiq/clk.c
index a263d1b751ff..a8e309dcd38d 100644
--- a/arch/mips/lantiq/clk.c
+++ b/arch/mips/lantiq/clk.c
@@ -160,6 +160,12 @@ void clk_deactivate(struct clk *clk)
 }
 EXPORT_SYMBOL(clk_deactivate);
 
+struct clk *clk_get_parent(struct clk *clk)
+{
+	return NULL;
+}
+EXPORT_SYMBOL(clk_get_parent);
+
 static inline u32 get_counter_resolution(void)
 {
 	u32 res;

commit 1f6fc1250ea904afebb720b54450a9e199d9c676
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Sun Nov 14 16:42:18 2021 -0800

    mips: bcm63xx: add support for clk_get_parent()
    
    [ Upstream commit e8f67482e5a4bc8d0b65d606d08cb60ee123b468 ]
    
    BCM63XX selects HAVE_LEGACY_CLK but does not provide/support
    clk_get_parent(), so add a simple implementation of that
    function so that callers of it will build without errors.
    
    Fixes these build errors:
    
    mips-linux-ld: drivers/iio/adc/ingenic-adc.o: in function `jz4770_adc_init_clk_div':
    ingenic-adc.c:(.text+0xe4): undefined reference to `clk_get_parent'
    mips-linux-ld: drivers/iio/adc/ingenic-adc.o: in function `jz4725b_adc_init_clk_div':
    ingenic-adc.c:(.text+0x1b8): undefined reference to `clk_get_parent'
    
    Fixes: e7300d04bd08 ("MIPS: BCM63xx: Add support for the Broadcom BCM63xx family of SOCs." )
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Reported-by: kernel test robot <lkp@intel.com>
    Suggested-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Cc: Artur Rojek <contact@artur-rojek.eu>
    Cc: Paul Cercueil <paul@crapouillou.net>
    Cc: linux-mips@vger.kernel.org
    Cc: Jonathan Cameron <jic23@kernel.org>
    Cc: Lars-Peter Clausen <lars@metafoo.de>
    Cc: linux-iio@vger.kernel.org
    Cc: Florian Fainelli <f.fainelli@gmail.com>
    Cc: Andy Shevchenko <andy.shevchenko@gmail.com>
    Cc: Russell King <linux@armlinux.org.uk>
    Cc: bcm-kernel-feedback-list@broadcom.com
    Cc: Jonas Gorski <jonas.gorski@gmail.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Acked-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Acked-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Acked-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/bcm63xx/clk.c b/arch/mips/bcm63xx/clk.c
index 164115944a7f..aba6e2d6a736 100644
--- a/arch/mips/bcm63xx/clk.c
+++ b/arch/mips/bcm63xx/clk.c
@@ -381,6 +381,12 @@ void clk_disable(struct clk *clk)
 
 EXPORT_SYMBOL(clk_disable);
 
+struct clk *clk_get_parent(struct clk *clk)
+{
+	return NULL;
+}
+EXPORT_SYMBOL(clk_get_parent);
+
 unsigned long clk_get_rate(struct clk *clk)
 {
 	if (!clk)

commit 96088a6e3df98ad4ba28a1fcb5ac93ff04c0cca0
Author: Colin Ian King <colin.i.king@googlemail.com>
Date:   Wed Nov 10 23:28:24 2021 +0000

    MIPS: generic/yamon-dt: fix uninitialized variable error
    
    [ Upstream commit 255e51da15baed47531beefd02f222e4dc01f1c1 ]
    
    In the case where fw_getenv returns an error when fetching values
    for ememsizea and memsize then variable phys_memsize is not assigned
    a variable and will be uninitialized on a zero check of phys_memsize.
    Fix this by initializing phys_memsize to zero.
    
    Cleans up cppcheck error:
    arch/mips/generic/yamon-dt.c:100:7: error: Uninitialized variable: phys_memsize [uninitvar]
    
    Fixes: f41d2430bbd6 ("MIPS: generic/yamon-dt: Support > 256MB of RAM")
    Signed-off-by: Colin Ian King <colin.i.king@gmail.com>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/generic/yamon-dt.c b/arch/mips/generic/yamon-dt.c
index 7ba4ad5cc1d6..7b7ba0f76c60 100644
--- a/arch/mips/generic/yamon-dt.c
+++ b/arch/mips/generic/yamon-dt.c
@@ -79,7 +79,7 @@ static unsigned int __init gen_fdt_mem_array(
 __init int yamon_dt_append_memory(void *fdt,
 				  const struct yamon_mem_region *regions)
 {
-	unsigned long phys_memsize, memsize;
+	unsigned long phys_memsize = 0, memsize;
 	__be32 mem_array[2 * MAX_MEM_ARRAY_ENTRIES];
 	unsigned int mem_entries;
 	int i, err, mem_off;

commit 5472e54214314e3860da059af0feabfe852a1931
Author: Surabhi Boob <surabhi.boob@intel.com>
Date:   Fri Jun 4 09:48:59 2021 -0700

    iavf: Fix for the false positive ASQ/ARQ errors while issuing VF reset
    
    [ Upstream commit 321421b57a12e933f92b228e0e6d0b2c6541f41d ]
    
    While issuing VF Reset from the guest OS, the VF driver prints
    logs about critical / Overflow error detection. This is not an
    actual error since the VF_MBX_ARQLEN register is set to all FF's
    for a short period of time and the VF would catch the bits set if
    it was reading the register during that spike of time.
    This patch introduces an additional check to ignore this condition
    since the VF is in reset.
    
    Fixes: 19b73d8efaa4 ("i40evf: Add additional check for reset")
    Signed-off-by: Surabhi Boob <surabhi.boob@intel.com>
    Tested-by: Tony Brelinski <tony.brelinski@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_main.c b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
index 1fd8cc5ac306..5a6e579e9e65 100644
--- a/drivers/net/ethernet/intel/i40evf/i40evf_main.c
+++ b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
@@ -2058,7 +2058,7 @@ static void i40evf_adminq_task(struct work_struct *work)
 
 	/* check for error indications */
 	val = rd32(hw, hw->aq.arq.len);
-	if (val == 0xdeadbeef) /* indicates device in reset */
+	if (val == 0xdeadbeef || val == 0xffffffff) /* device in reset */
 		goto freedom;
 	oldval = val;
 	if (val & I40E_VF_ARQLEN1_ARQVFE_MASK) {

commit 6b9906ece87cbbcac213bddcbbeb74dff7b5748b
Author: Nicholas Nunley <nicholas.d.nunley@intel.com>
Date:   Fri Jun 4 09:48:53 2021 -0700

    iavf: check for null in iavf_fix_features
    
    [ Upstream commit 8a4a126f4be88eb8b5f00a165ab58c35edf4ef76 ]
    
    If the driver has lost contact with the PF then it enters a disabled state
    and frees adapter->vf_res. However, ndo_fix_features can still be called on
    the interface, so we need to check for this condition first. Since we have
    no information on the features at this time simply leave them unmodified
    and return.
    
    Fixes: c4445aedfe09 ("i40evf: Fix VLAN features")
    Signed-off-by: Nicholas Nunley <nicholas.d.nunley@intel.com>
    Tested-by: Tony Brelinski <tony.brelinski@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_main.c b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
index ac5709624c7a..1fd8cc5ac306 100644
--- a/drivers/net/ethernet/intel/i40evf/i40evf_main.c
+++ b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
@@ -3185,7 +3185,8 @@ static netdev_features_t i40evf_fix_features(struct net_device *netdev,
 {
 	struct i40evf_adapter *adapter = netdev_priv(netdev);
 
-	if (!(adapter->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN))
+	if (adapter->vf_res &&
+	    !(adapter->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN))
 		features &= ~(NETIF_F_HW_VLAN_CTAG_TX |
 			      NETIF_F_HW_VLAN_CTAG_RX |
 			      NETIF_F_HW_VLAN_CTAG_FILTER);

commit ae1114c08c13e9ac8a0fc7927adc2827548910c1
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Sun Nov 14 01:36:36 2021 +0300

    net: bnx2x: fix variable dereferenced before check
    
    [ Upstream commit f8885ac89ce310570e5391fe0bf0ec9c7c9b4fdc ]
    
    Smatch says:
            bnx2x_init_ops.h:640 bnx2x_ilt_client_mem_op()
            warn: variable dereferenced before check 'ilt' (see line 638)
    
    Move ilt_cli variable initialization _after_ ilt validation, because
    it's unsafe to deref the pointer before validation check.
    
    Fixes: 523224a3b3cd ("bnx2x, cnic, bnx2i: use new FW/HSI")
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h
index 1835d2e451c0..fc7fce642666 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h
@@ -635,11 +635,13 @@ static int bnx2x_ilt_client_mem_op(struct bnx2x *bp, int cli_num,
 {
 	int i, rc;
 	struct bnx2x_ilt *ilt = BP_ILT(bp);
-	struct ilt_client_info *ilt_cli = &ilt->clients[cli_num];
+	struct ilt_client_info *ilt_cli;
 
 	if (!ilt || !ilt->lines)
 		return -1;
 
+	ilt_cli = &ilt->clients[cli_num];
+
 	if (ilt_cli->flags & (ILT_CLIENT_SKIP_INIT | ILT_CLIENT_SKIP_MEM))
 		return 0;
 

commit b9fe36fe4d287faca8f501f68a50f055369c3f0e
Author: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Date:   Wed Nov 10 16:36:04 2021 +0100

    drm/nouveau: hdmigv100.c: fix corrupted HDMI Vendor InfoFrame
    
    [ Upstream commit 3cc1ae1fa70ab369e4645e38ce335a19438093ad ]
    
    gv100_hdmi_ctrl() writes vendor_infoframe.subpack0_high to 0x6f0110, and
    then overwrites it with 0. Just drop the overwrite with 0, that's clearly
    a mistake.
    
    Because of this issue the HDMI VIC is 0 instead of 1 in the HDMI Vendor
    InfoFrame when transmitting 4kp30.
    
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Fixes: 290ffeafcc1a ("drm/nouveau/disp/gv100: initial support")
    Reviewed-by: Ben Skeggs <bskeggs@redhat.com>
    Signed-off-by: Karol Herbst <kherbst@redhat.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/3d3bd0f7-c150-2479-9350-35d394ee772d@xs4all.nl
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigv100.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigv100.c
index 6e3c450eaace..3ff49344abc7 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigv100.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigv100.c
@@ -62,7 +62,6 @@ gv100_hdmi_ctrl(struct nvkm_ior *ior, int head, bool enable, u8 max_ac_packet,
 		nvkm_wr32(device, 0x6f0108 + hdmi, vendor_infoframe.header);
 		nvkm_wr32(device, 0x6f010c + hdmi, vendor_infoframe.subpack0_low);
 		nvkm_wr32(device, 0x6f0110 + hdmi, vendor_infoframe.subpack0_high);
-		nvkm_wr32(device, 0x6f0110 + hdmi, 0x00000000);
 		nvkm_wr32(device, 0x6f0114 + hdmi, 0x00000000);
 		nvkm_wr32(device, 0x6f0118 + hdmi, 0x00000000);
 		nvkm_wr32(device, 0x6f011c + hdmi, 0x00000000);

commit 71731e0d68f4dd352a958942d6d0e39cb0f0fa58
Author: Vincent Donnefort <vincent.donnefort@arm.com>
Date:   Thu Nov 4 17:51:20 2021 +0000

    sched/core: Mitigate race cpus_share_cache()/update_top_cache_domain()
    
    [ Upstream commit 42dc938a590c96eeb429e1830123fef2366d9c80 ]
    
    Nothing protects the access to the per_cpu variable sd_llc_id. When testing
    the same CPU (i.e. this_cpu == that_cpu), a race condition exists with
    update_top_cache_domain(). One scenario being:
    
                  CPU1                            CPU2
      ==================================================================
    
      per_cpu(sd_llc_id, CPUX) => 0
                                        partition_sched_domains_locked()
                                          detach_destroy_domains()
      cpus_share_cache(CPUX, CPUX)          update_top_cache_domain(CPUX)
        per_cpu(sd_llc_id, CPUX) => 0
                                              per_cpu(sd_llc_id, CPUX) = CPUX
        per_cpu(sd_llc_id, CPUX) => CPUX
        return false
    
    ttwu_queue_cond() wouldn't catch smp_processor_id() == cpu and the result
    is a warning triggered from ttwu_queue_wakelist().
    
    Avoid a such race in cpus_share_cache() by always returning true when
    this_cpu == that_cpu.
    
    Fixes: 518cd6234178 ("sched: Only queue remote wakeups when crossing cache boundaries")
    Reported-by: Jing-Ting Wu <jing-ting.wu@mediatek.com>
    Signed-off-by: Vincent Donnefort <vincent.donnefort@arm.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Valentin Schneider <valentin.schneider@arm.com>
    Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org>
    Link: https://lore.kernel.org/r/20211104175120.857087-1-vincent.donnefort@arm.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 013b1c6cb4ed..32af895bd86b 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -1821,6 +1821,9 @@ void wake_up_if_idle(int cpu)
 
 bool cpus_share_cache(int this_cpu, int that_cpu)
 {
+	if (this_cpu == that_cpu)
+		return true;
+
 	return per_cpu(sd_llc_id, this_cpu) == per_cpu(sd_llc_id, that_cpu);
 }
 #endif /* CONFIG_SMP */

commit 59056c185730e819a5da81a32629cc729fa9cb13
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Sat Nov 6 08:49:11 2021 -0700

    mips: BCM63XX: ensure that CPU_SUPPORTS_32BIT_KERNEL is set
    
    [ Upstream commit 5eeaafc8d69373c095e461bdb39e5c9b62228ac5 ]
    
    Several header files need info on CONFIG_32BIT or CONFIG_64BIT,
    but kconfig symbol BCM63XX does not provide that info. This leads
    to many build errors, e.g.:
    
       arch/mips/include/asm/page.h:196:13: error: use of undeclared identifier 'CAC_BASE'
               return x - PAGE_OFFSET + PHYS_OFFSET;
       arch/mips/include/asm/mach-generic/spaces.h:91:23: note: expanded from macro 'PAGE_OFFSET'
       #define PAGE_OFFSET             (CAC_BASE + PHYS_OFFSET)
       arch/mips/include/asm/io.h:134:28: error: use of undeclared identifier 'CAC_BASE'
               return (void *)(address + PAGE_OFFSET - PHYS_OFFSET);
       arch/mips/include/asm/mach-generic/spaces.h:91:23: note: expanded from macro 'PAGE_OFFSET'
       #define PAGE_OFFSET             (CAC_BASE + PHYS_OFFSET)
    
    arch/mips/include/asm/uaccess.h:82:10: error: use of undeclared identifier '__UA_LIMIT'
               return (__UA_LIMIT & (addr | (addr + size) | __ua_size(size))) == 0;
    
    Selecting the SYS_HAS_CPU_BMIPS* symbols causes SYS_HAS_CPU_BMIPS to be
    set, which then selects CPU_SUPPORT_32BIT_KERNEL, which causes
    CONFIG_32BIT to be set. (a bit more indirect than v1 [RFC].)
    
    Fixes: e7300d04bd08 ("MIPS: BCM63xx: Add support for the Broadcom BCM63xx family of SOCs.")
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Reported-by: kernel test robot <lkp@intel.com>
    Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Cc: Florian Fainelli <f.fainelli@gmail.com>
    Cc: bcm-kernel-feedback-list@broadcom.com
    Cc: linux-mips@vger.kernel.org
    Cc: Paul Burton <paulburton@kernel.org>
    Cc: Maxime Bizon <mbizon@freebox.fr>
    Cc: Ralf Baechle <ralf@linux-mips.org>
    Suggested-by: Florian Fainelli <f.fainelli@gmail.com>
    Acked-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index fb8554c41e80..e513528be3ad 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -285,6 +285,9 @@ config BCM63XX
 	select SYS_SUPPORTS_32BIT_KERNEL
 	select SYS_SUPPORTS_BIG_ENDIAN
 	select SYS_HAS_EARLY_PRINTK
+	select SYS_HAS_CPU_BMIPS32_3300
+	select SYS_HAS_CPU_BMIPS4350
+	select SYS_HAS_CPU_BMIPS4380
 	select SWAP_IO_SPACE
 	select GPIOLIB
 	select HAVE_CLK

commit 0a294c3a766df19e2dfe2788afac084c47c70b56
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Mon Oct 4 17:19:13 2021 -0700

    sh: define __BIG_ENDIAN for math-emu
    
    [ Upstream commit b929926f01f2d14635345d22eafcf60feed1085e ]
    
    Fix this by defining both ENDIAN macros in
    <asm/sfp-machine.h> so that they can be utilized in
    <math-emu/soft-fp.h> according to the latter's comment:
    /* Allow sfp-machine to have its own byte order definitions. */
    
    (This is what is done in arch/nds32/include/asm/sfp-machine.h.)
    
    This placates these build warnings:
    
    In file included from ../arch/sh/math-emu/math.c:23:
    .../include/math-emu/single.h:50:21: warning: "__BIG_ENDIAN" is not defined, evaluates to 0 [-Wundef]
       50 | #if __BYTE_ORDER == __BIG_ENDIAN
    In file included from ../arch/sh/math-emu/math.c:24:
    .../include/math-emu/double.h:59:21: warning: "__BIG_ENDIAN" is not defined, evaluates to 0 [-Wundef]
       59 | #if __BYTE_ORDER == __BIG_ENDIAN
    
    Fixes: 4b565680d163 ("sh: math-emu support")
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
    Cc: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
    Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
    Tested-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
    Signed-off-by: Rich Felker <dalias@libc.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/sh/include/asm/sfp-machine.h b/arch/sh/include/asm/sfp-machine.h
index d3c548443f2a..dd195c6f3b9d 100644
--- a/arch/sh/include/asm/sfp-machine.h
+++ b/arch/sh/include/asm/sfp-machine.h
@@ -25,6 +25,14 @@
 #ifndef _SFP_MACHINE_H
 #define _SFP_MACHINE_H
 
+#ifdef __BIG_ENDIAN__
+#define __BYTE_ORDER __BIG_ENDIAN
+#define __LITTLE_ENDIAN 0
+#else
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define __BIG_ENDIAN 0
+#endif
+
 #define _FP_W_TYPE_SIZE		32
 #define _FP_W_TYPE		unsigned long
 #define _FP_WS_TYPE		signed long

commit 713e2c327aead0e6996c26ddf9144ce3e8c32bc3
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Mon Oct 4 17:19:10 2021 -0700

    sh: fix kconfig unmet dependency warning for FRAME_POINTER
    
    [ Upstream commit fda1bc533094a7db68b11e7503d2c6c73993d12a ]
    
    FRAME_POINTER depends on DEBUG_KERNEL so DWARF_UNWINDER should
    depend on DEBUG_KERNEL before selecting FRAME_POINTER.
    
    WARNING: unmet direct dependencies detected for FRAME_POINTER
      Depends on [n]: DEBUG_KERNEL [=n] && (M68K || UML || SUPERH [=y]) || ARCH_WANT_FRAME_POINTERS [=n]
      Selected by [y]:
      - DWARF_UNWINDER [=y]
    
    Fixes: bd353861c735 ("sh: dwarf unwinder support.")
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Cc: Matt Fleming <matt@console-pimps.org>
    Cc: Matt Fleming <matt@codeblueprint.co.uk>
    Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
    Cc: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
    Cc: Geert Uytterhoeven <geert+renesas@glider.be>
    Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
    Tested-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
    Signed-off-by: Rich Felker <dalias@libc.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/sh/Kconfig.debug b/arch/sh/Kconfig.debug
index 010b6c33bbba..71acd3d9b9e8 100644
--- a/arch/sh/Kconfig.debug
+++ b/arch/sh/Kconfig.debug
@@ -58,6 +58,7 @@ config DUMP_CODE
 
 config DWARF_UNWINDER
 	bool "Enable the DWARF unwinder for stacktraces"
+	depends on DEBUG_KERNEL
 	select FRAME_POINTER
 	depends on SUPERH32
 	default n

commit d3930ec1e4da2135d1cd9c751e8cf14b3313ba78
Author: Gao Xiang <hsiangkao@linux.alibaba.com>
Date:   Tue Sep 21 22:37:30 2021 +0800

    f2fs: fix up f2fs_lookup tracepoints
    
    [ Upstream commit 70a9ac36ffd807ac506ed0b849f3e8ce3c6623f2 ]
    
    Fix up a misuse that the filename pointer isn't always valid in
    the ring buffer, and we should copy the content instead.
    
    Fixes: 0c5e36db17f5 ("f2fs: trace f2fs_lookup")
    Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
    Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h
index 795698925d20..52e6456bdb92 100644
--- a/include/trace/events/f2fs.h
+++ b/include/trace/events/f2fs.h
@@ -751,20 +751,20 @@ TRACE_EVENT(f2fs_lookup_start,
 	TP_STRUCT__entry(
 		__field(dev_t,	dev)
 		__field(ino_t,	ino)
-		__field(const char *,	name)
+		__string(name,	dentry->d_name.name)
 		__field(unsigned int, flags)
 	),
 
 	TP_fast_assign(
 		__entry->dev	= dir->i_sb->s_dev;
 		__entry->ino	= dir->i_ino;
-		__entry->name	= dentry->d_name.name;
+		__assign_str(name, dentry->d_name.name);
 		__entry->flags	= flags;
 	),
 
 	TP_printk("dev = (%d,%d), pino = %lu, name:%s, flags:%u",
 		show_dev_ino(__entry),
-		__entry->name,
+		__get_str(name),
 		__entry->flags)
 );
 
@@ -778,7 +778,7 @@ TRACE_EVENT(f2fs_lookup_end,
 	TP_STRUCT__entry(
 		__field(dev_t,	dev)
 		__field(ino_t,	ino)
-		__field(const char *,	name)
+		__string(name,	dentry->d_name.name)
 		__field(nid_t,	cino)
 		__field(int,	err)
 	),
@@ -786,14 +786,14 @@ TRACE_EVENT(f2fs_lookup_end,
 	TP_fast_assign(
 		__entry->dev	= dir->i_sb->s_dev;
 		__entry->ino	= dir->i_ino;
-		__entry->name	= dentry->d_name.name;
+		__assign_str(name, dentry->d_name.name);
 		__entry->cino	= ino;
 		__entry->err	= err;
 	),
 
 	TP_printk("dev = (%d,%d), pino = %lu, name:%s, ino:%u, err:%d",
 		show_dev_ino(__entry),
-		__entry->name,
+		__get_str(name),
 		__entry->cino,
 		__entry->err)
 );

commit 041fd676937df0b77cc6d08a7d1129638149aa1b
Author: Lu Wei <luwei32@huawei.com>
Date:   Thu Nov 26 10:43:11 2020 +0800

    maple: fix wrong return value of maple_bus_init().
    
    [ Upstream commit bde82ee391fa6d3ad054313c4aa7b726d32515ce ]
    
    If KMEM_CACHE or maple_alloc_dev failed, the maple_bus_init() will return 0
    rather than error, because the retval is not changed after KMEM_CACHE or
    maple_alloc_dev failed.
    
    Fixes: 17be2d2b1c33 ("sh: Add maple bus support for the SEGA Dreamcast.")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Lu Wei <luwei32@huawei.com>
    Acked-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
    Signed-off-by: Rich Felker <dalias@libc.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/sh/maple/maple.c b/drivers/sh/maple/maple.c
index e5d7fb81ad66..44a931d41a13 100644
--- a/drivers/sh/maple/maple.c
+++ b/drivers/sh/maple/maple.c
@@ -835,8 +835,10 @@ static int __init maple_bus_init(void)
 
 	maple_queue_cache = KMEM_CACHE(maple_buffer, SLAB_HWCACHE_ALIGN);
 
-	if (!maple_queue_cache)
+	if (!maple_queue_cache) {
+		retval = -ENOMEM;
 		goto cleanup_bothirqs;
+	}
 
 	INIT_LIST_HEAD(&maple_waitq);
 	INIT_LIST_HEAD(&maple_sentq);
@@ -849,6 +851,7 @@ static int __init maple_bus_init(void)
 		if (!mdev[i]) {
 			while (i-- > 0)
 				maple_free_dev(mdev[i]);
+			retval = -ENOMEM;
 			goto cleanup_cache;
 		}
 		baseunits[i] = mdev[i];

commit ab16c0dc7693be43d17dd491438f3dfac86bbb69
Author: Nick Desaulniers <ndesaulniers@google.com>
Date:   Tue Dec 22 12:54:01 2020 -0800

    sh: check return code of request_irq
    
    [ Upstream commit 0e38225c92c7964482a8bb6b3e37fde4319e965c ]
    
    request_irq is marked __must_check, but the call in shx3_prepare_cpus
    has a void return type, so it can't propagate failure to the caller.
    Follow cues from hexagon and just print an error.
    
    Fixes: c7936b9abcf5 ("sh: smp: Hook in to the generic IPI handler for SH-X3 SMP.")
    Cc: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
    Cc: Paul Mundt <lethal@linux-sh.org>
    Reported-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
    Tested-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
    Reviewed-by: Miguel Ojeda <ojeda@kernel.org>
    Signed-off-by: Rich Felker <dalias@libc.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/sh/kernel/cpu/sh4a/smp-shx3.c b/arch/sh/kernel/cpu/sh4a/smp-shx3.c
index 0d3637c494bf..c1f66c35e0c1 100644
--- a/arch/sh/kernel/cpu/sh4a/smp-shx3.c
+++ b/arch/sh/kernel/cpu/sh4a/smp-shx3.c
@@ -76,8 +76,9 @@ static void shx3_prepare_cpus(unsigned int max_cpus)
 	BUILD_BUG_ON(SMP_MSG_NR >= 8);
 
 	for (i = 0; i < SMP_MSG_NR; i++)
-		request_irq(104 + i, ipi_interrupt_handler,
-			    IRQF_PERCPU, "IPI", (void *)(long)i);
+		if (request_irq(104 + i, ipi_interrupt_handler,
+			    IRQF_PERCPU, "IPI", (void *)(long)i))
+			pr_err("Failed to request irq %d\n", i);
 
 	for (i = 0; i < max_cpus; i++)
 		set_cpu_present(i, true);

commit e7e70b55af866430efbba64d3450ea060ae45a58
Author: Michael Ellerman <mpe@ellerman.id.au>
Date:   Thu Oct 14 13:44:24 2021 +1100

    powerpc/dcr: Use cmplwi instead of 3-argument cmpli
    
    [ Upstream commit fef071be57dc43679a32d5b0e6ee176d6f12e9f2 ]
    
    In dcr-low.S we use cmpli with three arguments, instead of four
    arguments as defined in the ISA:
    
            cmpli   cr0,r3,1024
    
    This appears to be a PPC440-ism, looking at the "PPC440x5 CPU Core
    User?s Manual" it shows cmpli having no L field, but implied to be 0 due
    to the core being 32-bit. It mentions that the ISA defines four
    arguments and recommends using cmplwi.
    
    It also corresponds to the old POWER instruction set, which had no L
    field there, a reserved bit instead.
    
    dcr-low.S is only built 32-bit, because it is only built when
    DCR_NATIVE=y, which is only selected by 40x and 44x. Looking at the
    generated code (with gcc/gas) we see cmplwi as expected.
    
    Although gas is happy with the 3-argument version when building for
    32-bit, the LLVM assembler is not and errors out with:
    
      arch/powerpc/sysdev/dcr-low.S:27:10: error: invalid operand for instruction
       cmpli 0,%r3,1024; ...
               ^
    
    Switch to the cmplwi extended opcode, which avoids any confusion when
    reading the ISA, fixes the issue with the LLVM assembler, and also means
    the code could be built 64-bit in future (though that's very unlikely).
    
    Reported-by: Nick Desaulniers <ndesaulniers@google.com>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    BugLink: https://github.com/ClangBuiltLinux/linux/issues/1419
    Link: https://lore.kernel.org/r/20211014024424.528848-1-mpe@ellerman.id.au
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/powerpc/sysdev/dcr-low.S b/arch/powerpc/sysdev/dcr-low.S
index e687bb2003ff..5589fbe48bbd 100644
--- a/arch/powerpc/sysdev/dcr-low.S
+++ b/arch/powerpc/sysdev/dcr-low.S
@@ -15,7 +15,7 @@
 #include <asm/export.h>
 
 #define DCR_ACCESS_PROLOG(table) \
-	cmpli	cr0,r3,1024;	 \
+	cmplwi	cr0,r3,1024;	 \
 	rlwinm  r3,r3,4,18,27;   \
 	lis     r5,table@h;      \
 	ori     r5,r5,table@l;   \

commit ab4c1ebc40f699f48346f634d7b72b9c5193f315
Author: Chengfeng Ye <cyeaa@connect.ust.hk>
Date:   Sun Oct 24 03:46:11 2021 -0700

    ALSA: gus: fix null pointer dereference on pointer block
    
    [ Upstream commit a0d21bb3279476c777434c40d969ea88ca64f9aa ]
    
    The pointer block return from snd_gf1_dma_next_block could be
    null, so there is a potential null pointer dereference issue.
    Fix this by adding a null check before dereference.
    
    Signed-off-by: Chengfeng Ye <cyeaa@connect.ust.hk>
    Link: https://lore.kernel.org/r/20211024104611.9919-1-cyeaa@connect.ust.hk
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/isa/gus/gus_dma.c b/sound/isa/gus/gus_dma.c
index 7f95f452f106..48e76b8fede4 100644
--- a/sound/isa/gus/gus_dma.c
+++ b/sound/isa/gus/gus_dma.c
@@ -141,6 +141,8 @@ static void snd_gf1_dma_interrupt(struct snd_gus_card * gus)
 	}
 	block = snd_gf1_dma_next_block(gus);
 	spin_unlock(&gus->dma_lock);
+	if (!block)
+		return;
 	snd_gf1_dma_program(gus, block->addr, block->buf_addr, block->count, (unsigned short) block->cmd);
 	kfree(block);
 #if 0

commit 30b87dae35ea162b92166236389a64f381d969b5
Author: Anatolij Gustschin <agust@denx.de>
Date:   Thu Oct 14 00:05:31 2021 +0200

    powerpc/5200: dts: fix memory node unit name
    
    [ Upstream commit aed2886a5e9ffc8269a4220bff1e9e030d3d2eb1 ]
    
    Fixes build warnings:
    Warning (unit_address_vs_reg): /memory: node has a reg or ranges property, but no unit name
    
    Signed-off-by: Anatolij Gustschin <agust@denx.de>
    Reviewed-by: Rob Herring <robh@kernel.org>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20211013220532.24759-4-agust@denx.de
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/powerpc/boot/dts/charon.dts b/arch/powerpc/boot/dts/charon.dts
index 0e00e508eaa6..1c8fe20752e6 100644
--- a/arch/powerpc/boot/dts/charon.dts
+++ b/arch/powerpc/boot/dts/charon.dts
@@ -39,7 +39,7 @@
 		};
 	};
 
-	memory {
+	memory@0 {
 		device_type = "memory";
 		reg = <0x00000000 0x08000000>;	// 128MB
 	};
diff --git a/arch/powerpc/boot/dts/digsy_mtc.dts b/arch/powerpc/boot/dts/digsy_mtc.dts
index c3922fc03e0b..1a002cc487d5 100644
--- a/arch/powerpc/boot/dts/digsy_mtc.dts
+++ b/arch/powerpc/boot/dts/digsy_mtc.dts
@@ -20,7 +20,7 @@
 	model = "intercontrol,digsy-mtc";
 	compatible = "intercontrol,digsy-mtc";
 
-	memory {
+	memory@0 {
 		reg = <0x00000000 0x02000000>;	// 32MB
 	};
 
diff --git a/arch/powerpc/boot/dts/lite5200.dts b/arch/powerpc/boot/dts/lite5200.dts
index 179a1785d645..18d137a3393f 100644
--- a/arch/powerpc/boot/dts/lite5200.dts
+++ b/arch/powerpc/boot/dts/lite5200.dts
@@ -36,7 +36,7 @@
 		};
 	};
 
-	memory {
+	memory@0 {
 		device_type = "memory";
 		reg = <0x00000000 0x04000000>;	// 64MB
 	};
diff --git a/arch/powerpc/boot/dts/lite5200b.dts b/arch/powerpc/boot/dts/lite5200b.dts
index 5abb46c5cc95..29419cf81e04 100644
--- a/arch/powerpc/boot/dts/lite5200b.dts
+++ b/arch/powerpc/boot/dts/lite5200b.dts
@@ -35,7 +35,7 @@
 		led4 { gpios = <&gpio_simple 2 1>; };
 	};
 
-	memory {
+	memory@0 {
 		reg = <0x00000000 0x10000000>;	// 256MB
 	};
 
diff --git a/arch/powerpc/boot/dts/media5200.dts b/arch/powerpc/boot/dts/media5200.dts
index 843f156a49c4..3ae4432165f7 100644
--- a/arch/powerpc/boot/dts/media5200.dts
+++ b/arch/powerpc/boot/dts/media5200.dts
@@ -36,7 +36,7 @@
 		};
 	};
 
-	memory {
+	memory@0 {
 		reg = <0x00000000 0x08000000>;	// 128MB RAM
 	};
 
diff --git a/arch/powerpc/boot/dts/mpc5200b.dtsi b/arch/powerpc/boot/dts/mpc5200b.dtsi
index 969b2200b2f9..ecfba675b561 100644
--- a/arch/powerpc/boot/dts/mpc5200b.dtsi
+++ b/arch/powerpc/boot/dts/mpc5200b.dtsi
@@ -37,7 +37,7 @@
 		};
 	};
 
-	memory: memory {
+	memory: memory@0 {
 		device_type = "memory";
 		reg = <0x00000000 0x04000000>;	// 64MB
 	};
diff --git a/arch/powerpc/boot/dts/o2d.dts b/arch/powerpc/boot/dts/o2d.dts
index 9f6dd4d889b3..5a676e8141ca 100644
--- a/arch/powerpc/boot/dts/o2d.dts
+++ b/arch/powerpc/boot/dts/o2d.dts
@@ -16,7 +16,7 @@
 	model = "ifm,o2d";
 	compatible = "ifm,o2d";
 
-	memory {
+	memory@0 {
 		reg = <0x00000000 0x08000000>;  // 128MB
 	};
 
diff --git a/arch/powerpc/boot/dts/o2d.dtsi b/arch/powerpc/boot/dts/o2d.dtsi
index cf073e693f24..1b4df5f64b58 100644
--- a/arch/powerpc/boot/dts/o2d.dtsi
+++ b/arch/powerpc/boot/dts/o2d.dtsi
@@ -23,7 +23,7 @@
 	model = "ifm,o2d";
 	compatible = "ifm,o2d";
 
-	memory {
+	memory@0 {
 		reg = <0x00000000 0x04000000>;	// 64MB
 	};
 
diff --git a/arch/powerpc/boot/dts/o2dnt2.dts b/arch/powerpc/boot/dts/o2dnt2.dts
index a0f5b97a4f06..5184c461a205 100644
--- a/arch/powerpc/boot/dts/o2dnt2.dts
+++ b/arch/powerpc/boot/dts/o2dnt2.dts
@@ -16,7 +16,7 @@
 	model = "ifm,o2dnt2";
 	compatible = "ifm,o2d";
 
-	memory {
+	memory@0 {
 		reg = <0x00000000 0x08000000>;  // 128MB
 	};
 
diff --git a/arch/powerpc/boot/dts/o3dnt.dts b/arch/powerpc/boot/dts/o3dnt.dts
index acce49326491..045b90171924 100644
--- a/arch/powerpc/boot/dts/o3dnt.dts
+++ b/arch/powerpc/boot/dts/o3dnt.dts
@@ -16,7 +16,7 @@
 	model = "ifm,o3dnt";
 	compatible = "ifm,o2d";
 
-	memory {
+	memory@0 {
 		reg = <0x00000000 0x04000000>;  // 64MB
 	};
 
diff --git a/arch/powerpc/boot/dts/pcm032.dts b/arch/powerpc/boot/dts/pcm032.dts
index 576249bf2fb9..637e14286dde 100644
--- a/arch/powerpc/boot/dts/pcm032.dts
+++ b/arch/powerpc/boot/dts/pcm032.dts
@@ -26,7 +26,7 @@
 	model = "phytec,pcm032";
 	compatible = "phytec,pcm032";
 
-	memory {
+	memory@0 {
 		reg = <0x00000000 0x08000000>;	// 128MB
 	};
 
diff --git a/arch/powerpc/boot/dts/tqm5200.dts b/arch/powerpc/boot/dts/tqm5200.dts
index 1db07f6cf133..68b9e8240fb5 100644
--- a/arch/powerpc/boot/dts/tqm5200.dts
+++ b/arch/powerpc/boot/dts/tqm5200.dts
@@ -36,7 +36,7 @@
 		};
 	};
 
-	memory {
+	memory@0 {
 		device_type = "memory";
 		reg = <0x00000000 0x04000000>;	// 64MB
 	};

commit 213d7617ae66ba8d14ddaf9f096daecf4b32d18b
Author: Mike Christie <michael.christie@oracle.com>
Date:   Wed Sep 29 21:04:20 2021 -0500

    scsi: target: Fix alua_tg_pt_gps_count tracking
    
    [ Upstream commit 1283c0d1a32bb924324481586b5d6e8e76f676ba ]
    
    We can't free the tg_pt_gp in core_alua_set_tg_pt_gp_id() because it's
    still accessed via configfs. Its release must go through the normal
    configfs/refcount process.
    
    The max alua_tg_pt_gps_count check should probably have been done in
    core_alua_allocate_tg_pt_gp(), but with the current code userspace could
    have created 0x0000ffff + 1 groups, but only set the id for 0x0000ffff.
    Then it could have deleted a group with an ID set, and then set the ID for
    that extra group and it would work ok.
    
    It's unlikely, but just in case this patch continues to allow that type of
    behavior, and just fixes the kfree() while in use bug.
    
    Link: https://lore.kernel.org/r/20210930020422.92578-4-michael.christie@oracle.com
    Signed-off-by: Mike Christie <michael.christie@oracle.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c
index e46ca968009c..804956c712a5 100644
--- a/drivers/target/target_core_alua.c
+++ b/drivers/target/target_core_alua.c
@@ -1716,7 +1716,6 @@ int core_alua_set_tg_pt_gp_id(
 		pr_err("Maximum ALUA alua_tg_pt_gps_count:"
 			" 0x0000ffff reached\n");
 		spin_unlock(&dev->t10_alua.tg_pt_gps_lock);
-		kmem_cache_free(t10_alua_tg_pt_gp_cache, tg_pt_gp);
 		return -ENOSPC;
 	}
 again:

commit 9815434e46ee27060e9724fc463820f609a4b3c2
Author: Mike Christie <michael.christie@oracle.com>
Date:   Wed Sep 29 21:04:19 2021 -0500

    scsi: target: Fix ordered tag handling
    
    [ Upstream commit ed1227e080990ffec5bf39006ec8a57358e6689a ]
    
    This patch fixes the following bugs:
    
    1. If there are multiple ordered cmds queued and multiple simple cmds
       completing, target_restart_delayed_cmds() could be called on different
       CPUs and each instance could start a ordered cmd. They could then run in
       different orders than they were queued.
    
    2. target_restart_delayed_cmds() and target_handle_task_attr() can race
       where:
    
       1. target_handle_task_attr() has passed the simple_cmds == 0 check.
    
       2. transport_complete_task_attr() then decrements simple_cmds to 0.
    
       3. transport_complete_task_attr() runs target_restart_delayed_cmds() and
          it does not see any cmds on the delayed_cmd_list.
    
       4. target_handle_task_attr() adds the cmd to the delayed_cmd_list.
    
       The cmd will then end up timing out.
    
    3. If we are sent > 1 ordered cmds and simple_cmds == 0, we can execute
       them out of order, because target_handle_task_attr() will hit that
       simple_cmds check first and return false for all ordered cmds sent.
    
    4. We run target_restart_delayed_cmds() after every cmd completion, so if
       there is more than 1 simple cmd running, we start executing ordered cmds
       after that first cmd instead of waiting for all of them to complete.
    
    5. Ordered cmds are not supposed to start until HEAD OF QUEUE and all older
       cmds have completed, and not just simple.
    
    6. It's not a bug but it doesn't make sense to take the delayed_cmd_lock
       for every cmd completion when ordered cmds are almost never used. Just
       replacing that lock with an atomic increases IOPs by up to 10% when
       completions are spread over multiple CPUs and there are multiple
       sessions/ mqs/thread accessing the same device.
    
    This patch moves the queued delayed handling to a per device work to
    serialze the cmd executions for each device and adds a new counter to track
    HEAD_OF_QUEUE and SIMPLE cmds. We can then check the new counter to
    determine when to run the work on the completion path.
    
    Link: https://lore.kernel.org/r/20210930020422.92578-3-michael.christie@oracle.com
    Signed-off-by: Mike Christie <michael.christie@oracle.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c
index 22e97a93728d..1b381519c164 100644
--- a/drivers/target/target_core_device.c
+++ b/drivers/target/target_core_device.c
@@ -790,6 +790,8 @@ struct se_device *target_alloc_device(struct se_hba *hba, const char *name)
 	INIT_LIST_HEAD(&dev->t10_alua.lba_map_list);
 	spin_lock_init(&dev->t10_alua.lba_map_lock);
 
+	INIT_WORK(&dev->delayed_cmd_work, target_do_delayed_work);
+
 	dev->t10_wwn.t10_dev = dev;
 	dev->t10_alua.t10_dev = dev;
 
diff --git a/drivers/target/target_core_internal.h b/drivers/target/target_core_internal.h
index 0c6635587930..c7e1fadcc5cc 100644
--- a/drivers/target/target_core_internal.h
+++ b/drivers/target/target_core_internal.h
@@ -151,6 +151,7 @@ void	transport_clear_lun_ref(struct se_lun *);
 void	transport_send_task_abort(struct se_cmd *);
 sense_reason_t	target_cmd_size_check(struct se_cmd *cmd, unsigned int size);
 void	target_qf_do_work(struct work_struct *work);
+void	target_do_delayed_work(struct work_struct *work);
 bool	target_check_wce(struct se_device *dev);
 bool	target_check_fua(struct se_device *dev);
 void	__target_execute_cmd(struct se_cmd *, bool);
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index 9c60a090cfd1..64481a3a34d4 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -1990,32 +1990,35 @@ static bool target_handle_task_attr(struct se_cmd *cmd)
 	 */
 	switch (cmd->sam_task_attr) {
 	case TCM_HEAD_TAG:
+		atomic_inc_mb(&dev->non_ordered);
 		pr_debug("Added HEAD_OF_QUEUE for CDB: 0x%02x\n",
 			 cmd->t_task_cdb[0]);
 		return false;
 	case TCM_ORDERED_TAG:
-		atomic_inc_mb(&dev->dev_ordered_sync);
+		atomic_inc_mb(&dev->delayed_cmd_count);
 
 		pr_debug("Added ORDERED for CDB: 0x%02x to ordered list\n",
 			 cmd->t_task_cdb[0]);
-
-		/*
-		 * Execute an ORDERED command if no other older commands
-		 * exist that need to be completed first.
-		 */
-		if (!atomic_read(&dev->simple_cmds))
-			return false;
 		break;
 	default:
 		/*
 		 * For SIMPLE and UNTAGGED Task Attribute commands
 		 */
-		atomic_inc_mb(&dev->simple_cmds);
+		atomic_inc_mb(&dev->non_ordered);
+
+		if (atomic_read(&dev->delayed_cmd_count) == 0)
+			return false;
 		break;
 	}
 
-	if (atomic_read(&dev->dev_ordered_sync) == 0)
-		return false;
+	if (cmd->sam_task_attr != TCM_ORDERED_TAG) {
+		atomic_inc_mb(&dev->delayed_cmd_count);
+		/*
+		 * We will account for this when we dequeue from the delayed
+		 * list.
+		 */
+		atomic_dec_mb(&dev->non_ordered);
+	}
 
 	spin_lock(&dev->delayed_cmd_lock);
 	list_add_tail(&cmd->se_delayed_node, &dev->delayed_cmd_list);
@@ -2023,6 +2026,12 @@ static bool target_handle_task_attr(struct se_cmd *cmd)
 
 	pr_debug("Added CDB: 0x%02x Task Attr: 0x%02x to delayed CMD listn",
 		cmd->t_task_cdb[0], cmd->sam_task_attr);
+	/*
+	 * We may have no non ordered cmds when this function started or we
+	 * could have raced with the last simple/head cmd completing, so kick
+	 * the delayed handler here.
+	 */
+	schedule_work(&dev->delayed_cmd_work);
 	return true;
 }
 
@@ -2073,29 +2082,48 @@ EXPORT_SYMBOL(target_execute_cmd);
  * Process all commands up to the last received ORDERED task attribute which
  * requires another blocking boundary
  */
-static void target_restart_delayed_cmds(struct se_device *dev)
+void target_do_delayed_work(struct work_struct *work)
 {
-	for (;;) {
+	struct se_device *dev = container_of(work, struct se_device,
+					     delayed_cmd_work);
+
+	spin_lock(&dev->delayed_cmd_lock);
+	while (!dev->ordered_sync_in_progress) {
 		struct se_cmd *cmd;
 
-		spin_lock(&dev->delayed_cmd_lock);
-		if (list_empty(&dev->delayed_cmd_list)) {
-			spin_unlock(&dev->delayed_cmd_lock);
+		if (list_empty(&dev->delayed_cmd_list))
 			break;
-		}
 
 		cmd = list_entry(dev->delayed_cmd_list.next,
 				 struct se_cmd, se_delayed_node);
+
+		if (cmd->sam_task_attr == TCM_ORDERED_TAG) {
+			/*
+			 * Check if we started with:
+			 * [ordered] [simple] [ordered]
+			 * and we are now at the last ordered so we have to wait
+			 * for the simple cmd.
+			 */
+			if (atomic_read(&dev->non_ordered) > 0)
+				break;
+
+			dev->ordered_sync_in_progress = true;
+		}
+
 		list_del(&cmd->se_delayed_node);
+		atomic_dec_mb(&dev->delayed_cmd_count);
 		spin_unlock(&dev->delayed_cmd_lock);
 
+		if (cmd->sam_task_attr != TCM_ORDERED_TAG)
+			atomic_inc_mb(&dev->non_ordered);
+
 		cmd->transport_state |= CMD_T_SENT;
 
 		__target_execute_cmd(cmd, true);
 
-		if (cmd->sam_task_attr == TCM_ORDERED_TAG)
-			break;
+		spin_lock(&dev->delayed_cmd_lock);
 	}
+	spin_unlock(&dev->delayed_cmd_lock);
 }
 
 /*
@@ -2113,14 +2141,17 @@ static void transport_complete_task_attr(struct se_cmd *cmd)
 		goto restart;
 
 	if (cmd->sam_task_attr == TCM_SIMPLE_TAG) {
-		atomic_dec_mb(&dev->simple_cmds);
+		atomic_dec_mb(&dev->non_ordered);
 		dev->dev_cur_ordered_id++;
 	} else if (cmd->sam_task_attr == TCM_HEAD_TAG) {
+		atomic_dec_mb(&dev->non_ordered);
 		dev->dev_cur_ordered_id++;
 		pr_debug("Incremented dev_cur_ordered_id: %u for HEAD_OF_QUEUE\n",
 			 dev->dev_cur_ordered_id);
 	} else if (cmd->sam_task_attr == TCM_ORDERED_TAG) {
-		atomic_dec_mb(&dev->dev_ordered_sync);
+		spin_lock(&dev->delayed_cmd_lock);
+		dev->ordered_sync_in_progress = false;
+		spin_unlock(&dev->delayed_cmd_lock);
 
 		dev->dev_cur_ordered_id++;
 		pr_debug("Incremented dev_cur_ordered_id: %u for ORDERED\n",
@@ -2129,7 +2160,8 @@ static void transport_complete_task_attr(struct se_cmd *cmd)
 	cmd->se_cmd_flags &= ~SCF_TASK_ATTR_SET;
 
 restart:
-	target_restart_delayed_cmds(dev);
+	if (atomic_read(&dev->delayed_cmd_count) > 0)
+		schedule_work(&dev->delayed_cmd_work);
 }
 
 static void transport_complete_qf(struct se_cmd *cmd)
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
index 2cfd3b4573b0..ac59a03d0d00 100644
--- a/include/target/target_core_base.h
+++ b/include/target/target_core_base.h
@@ -774,8 +774,9 @@ struct se_device {
 	atomic_long_t		read_bytes;
 	atomic_long_t		write_bytes;
 	/* Active commands on this virtual SE device */
-	atomic_t		simple_cmds;
-	atomic_t		dev_ordered_sync;
+	atomic_t		non_ordered;
+	bool			ordered_sync_in_progress;
+	atomic_t		delayed_cmd_count;
 	atomic_t		dev_qf_count;
 	u32			export_count;
 	spinlock_t		delayed_cmd_lock;
@@ -798,6 +799,7 @@ struct se_device {
 	struct list_head	dev_tmr_list;
 	struct workqueue_struct *tmr_wq;
 	struct work_struct	qf_work_queue;
+	struct work_struct	delayed_cmd_work;
 	struct list_head	delayed_cmd_list;
 	struct list_head	state_list;
 	struct list_head	qf_cmd_list;

commit f1da51c26330f5b9f5f6b00f750bd03ee31d7dbe
Author: Bart Van Assche <bvanassche@acm.org>
Date:   Tue Oct 12 15:23:12 2021 -0700

    MIPS: sni: Fix the build
    
    [ Upstream commit c91cf42f61dc77b289784ea7b15a8531defa41c0 ]
    
    This patch fixes the following gcc 10 build error:
    
    arch/mips/sni/time.c: In function ?a20r_set_periodic??
    arch/mips/sni/time.c:15:26: error: unsigned conversion from ?int??to ?u8??{aka ?volatile unsigned char?} changes value from ??76??to ??4??[-Werror=overflow]
       15 | #define SNI_COUNTER0_DIV ((SNI_CLOCK_TICK_RATE / SNI_COUNTER2_DIV) / HZ)
          |                          ^
    arch/mips/sni/time.c:21:45: note: in expansion of macro ?SNI_COUNTER0_DIV??       21 |  *(volatile u8 *)(A20R_PT_CLOCK_BASE + 0) = SNI_COUNTER0_DIV;
          |                                             ^~~~~~~~~~~~~~~~
    
    Cc: linux-mips@vger.kernel.org
    Signed-off-by: Bart Van Assche <bvanassche@acm.org>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/sni/time.c b/arch/mips/sni/time.c
index dbace1f3e1a9..745ceb945fc5 100644
--- a/arch/mips/sni/time.c
+++ b/arch/mips/sni/time.c
@@ -18,14 +18,14 @@ static int a20r_set_periodic(struct clock_event_device *evt)
 {
 	*(volatile u8 *)(A20R_PT_CLOCK_BASE + 12) = 0x34;
 	wmb();
-	*(volatile u8 *)(A20R_PT_CLOCK_BASE + 0) = SNI_COUNTER0_DIV;
+	*(volatile u8 *)(A20R_PT_CLOCK_BASE + 0) = SNI_COUNTER0_DIV & 0xff;
 	wmb();
 	*(volatile u8 *)(A20R_PT_CLOCK_BASE + 0) = SNI_COUNTER0_DIV >> 8;
 	wmb();
 
 	*(volatile u8 *)(A20R_PT_CLOCK_BASE + 12) = 0xb4;
 	wmb();
-	*(volatile u8 *)(A20R_PT_CLOCK_BASE + 8) = SNI_COUNTER2_DIV;
+	*(volatile u8 *)(A20R_PT_CLOCK_BASE + 8) = SNI_COUNTER2_DIV & 0xff;
 	wmb();
 	*(volatile u8 *)(A20R_PT_CLOCK_BASE + 8) = SNI_COUNTER2_DIV >> 8;
 	wmb();

commit 4f300f47dbcf9c3d4b2ea76c8554c8f360400725
Author: Guanghui Feng <guanghuifeng@linux.alibaba.com>
Date:   Mon Oct 11 22:08:24 2021 +0800

    tty: tty_buffer: Fix the softlockup issue in flush_to_ldisc
    
    [ Upstream commit 3968ddcf05fb4b9409cd1859feb06a5b0550a1c1 ]
    
    When running ltp testcase(ltp/testcases/kernel/pty/pty04.c) with arm64, there is a soft lockup,
    which look like this one:
    
      Workqueue: events_unbound flush_to_ldisc
      Call trace:
       dump_backtrace+0x0/0x1ec
       show_stack+0x24/0x30
       dump_stack+0xd0/0x128
       panic+0x15c/0x374
       watchdog_timer_fn+0x2b8/0x304
       __run_hrtimer+0x88/0x2c0
       __hrtimer_run_queues+0xa4/0x120
       hrtimer_interrupt+0xfc/0x270
       arch_timer_handler_phys+0x40/0x50
       handle_percpu_devid_irq+0x94/0x220
       __handle_domain_irq+0x88/0xf0
       gic_handle_irq+0x84/0xfc
       el1_irq+0xc8/0x180
       slip_unesc+0x80/0x214 [slip]
       tty_ldisc_receive_buf+0x64/0x80
       tty_port_default_receive_buf+0x50/0x90
       flush_to_ldisc+0xbc/0x110
       process_one_work+0x1d4/0x4b0
       worker_thread+0x180/0x430
       kthread+0x11c/0x120
    
    In the testcase pty04, The first process call the write syscall to send
    data to the pty master. At the same time, the workqueue will do the
    flush_to_ldisc to pop data in a loop until there is no more data left.
    When the sender and workqueue running in different core, the sender sends
    data fastly in full time which will result in workqueue doing work in loop
    for a long time and occuring softlockup in flush_to_ldisc with kernel
    configured without preempt. So I add need_resched check and cond_resched
    in the flush_to_ldisc loop to avoid it.
    
    Signed-off-by: Guanghui Feng <guanghuifeng@linux.alibaba.com>
    Link: https://lore.kernel.org/r/1633961304-24759-1-git-send-email-guanghuifeng@linux.alibaba.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c
index ee3aa57bc0e7..6b0cb633679d 100644
--- a/drivers/tty/tty_buffer.c
+++ b/drivers/tty/tty_buffer.c
@@ -529,6 +529,9 @@ static void flush_to_ldisc(struct work_struct *work)
 		if (!count)
 			break;
 		head->read += count;
+
+		if (need_resched())
+			cond_resched();
 	}
 
 	mutex_unlock(&buf->lock);

commit 905136247c9c1983209c60251679c007416207a3
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Fri Oct 15 23:26:02 2021 -0700

    ALSA: ISA: not for M68K
    
    [ Upstream commit 3c05f1477e62ea5a0a8797ba6a545b1dc751fb31 ]
    
    On m68k, compiling drivers under SND_ISA causes build errors:
    
    ../sound/core/isadma.c: In function 'snd_dma_program':
    ../sound/core/isadma.c:33:17: error: implicit declaration of function 'claim_dma_lock' [-Werror=implicit-function-declaration]
       33 |         flags = claim_dma_lock();
          |                 ^~~~~~~~~~~~~~
    ../sound/core/isadma.c:41:9: error: implicit declaration of function 'release_dma_lock' [-Werror=implicit-function-declaration]
       41 |         release_dma_lock(flags);
          |         ^~~~~~~~~~~~~~~~
    
    ../sound/isa/sb/sb16_main.c: In function 'snd_sb16_playback_prepare':
    ../sound/isa/sb/sb16_main.c:253:72: error: 'DMA_AUTOINIT' undeclared (first use in this function)
      253 |         snd_dma_program(dma, runtime->dma_addr, size, DMA_MODE_WRITE | DMA_AUTOINIT);
          |                                                                        ^~~~~~~~~~~~
    ../sound/isa/sb/sb16_main.c:253:72: note: each undeclared identifier is reported only once for each function it appears in
    ../sound/isa/sb/sb16_main.c: In function 'snd_sb16_capture_prepare':
    ../sound/isa/sb/sb16_main.c:322:71: error: 'DMA_AUTOINIT' undeclared (first use in this function)
      322 |         snd_dma_program(dma, runtime->dma_addr, size, DMA_MODE_READ | DMA_AUTOINIT);
          |                                                                       ^~~~~~~~~~~~
    
    and more...
    
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Cc: Jaroslav Kysela <perex@perex.cz>
    Cc: Takashi Iwai <tiwai@suse.com>
    Cc: alsa-devel@alsa-project.org
    Cc: linux-m68k@lists.linux-m68k.org
    Cc: Geert Uytterhoeven <geert@linux-m68k.org>
    Link: https://lore.kernel.org/r/20211016062602.3588-1-rdunlap@infradead.org
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/core/Makefile b/sound/core/Makefile
index ee4a4a6b99ba..d123587c0fd8 100644
--- a/sound/core/Makefile
+++ b/sound/core/Makefile
@@ -9,7 +9,9 @@ ifneq ($(CONFIG_SND_PROC_FS),)
 snd-y += info.o
 snd-$(CONFIG_SND_OSSEMUL) += info_oss.o
 endif
+ifneq ($(CONFIG_M68K),y)
 snd-$(CONFIG_ISA_DMA_API) += isadma.o
+endif
 snd-$(CONFIG_SND_OSSEMUL) += sound_oss.o
 snd-$(CONFIG_SND_VMASTER) += vmaster.o
 snd-$(CONFIG_SND_JACK)	  += ctljack.o jack.o
diff --git a/sound/isa/Kconfig b/sound/isa/Kconfig
index d7db1eeebc84..f8f3433925bb 100644
--- a/sound/isa/Kconfig
+++ b/sound/isa/Kconfig
@@ -21,7 +21,7 @@ config SND_SB16_DSP
 menuconfig SND_ISA
 	bool "ISA sound devices"
 	depends on ISA || COMPILE_TEST
-	depends on ISA_DMA_API
+	depends on ISA_DMA_API && !M68K
 	default y
 	help
 	  Support for sound devices connected via the ISA bus.
diff --git a/sound/pci/Kconfig b/sound/pci/Kconfig
index 4105d9f653d9..bbaf46dc3f80 100644
--- a/sound/pci/Kconfig
+++ b/sound/pci/Kconfig
@@ -278,6 +278,7 @@ config SND_CS46XX_NEW_DSP
 config SND_CS5530
 	tristate "CS5530 Audio"
 	depends on ISA_DMA_API && (X86_32 || COMPILE_TEST)
+	depends on !M68K
 	select SND_SB16_DSP
 	help
 	  Say Y here to include support for audio on Cyrix/NatSemi CS5530 chips.

commit 951b8239fd24678b56c995c5c0456ab12e059d19
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Mon Oct 11 21:49:20 2021 +0800

    usb: host: ohci-tmio: check return value after calling platform_get_resource()
    
    [ Upstream commit 9eff2b2e59fda25051ab36cd1cb5014661df657b ]
    
    It will cause null-ptr-deref if platform_get_resource() returns NULL,
    we need check the return value.
    
    Acked-by: Alan Stern <stern@rowland.harvard.edu>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Link: https://lore.kernel.org/r/20211011134920.118477-1-yangyingliang@huawei.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/host/ohci-tmio.c b/drivers/usb/host/ohci-tmio.c
index 983a00e2988d..702d78e0d903 100644
--- a/drivers/usb/host/ohci-tmio.c
+++ b/drivers/usb/host/ohci-tmio.c
@@ -196,7 +196,7 @@ static int ohci_hcd_tmio_drv_probe(struct platform_device *dev)
 	if (usb_disabled())
 		return -ENODEV;
 
-	if (!cell)
+	if (!cell || !regs || !config || !sram)
 		return -EINVAL;
 
 	if (irq < 0)

commit 2c5733077b2efab02d188358bf60727c33c4528a
Author: Roger Quadros <rogerq@kernel.org>
Date:   Thu Oct 7 15:08:30 2021 +0300

    ARM: dts: omap: fix gpmc,mux-add-data type
    
    [ Upstream commit 51b9e22ffd3c4c56cbb7caae9750f70e55ffa603 ]
    
    gpmc,mux-add-data is not boolean.
    
    Fixes the below errors flagged by dtbs_check.
    
    "ethernet@4,0:gpmc,mux-add-data: True is not of type 'array'"
    
    Signed-off-by: Roger Quadros <rogerq@kernel.org>
    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/omap-gpmc-smsc9221.dtsi b/arch/arm/boot/dts/omap-gpmc-smsc9221.dtsi
index 7f6aefd13451..e7534fe9c53c 100644
--- a/arch/arm/boot/dts/omap-gpmc-smsc9221.dtsi
+++ b/arch/arm/boot/dts/omap-gpmc-smsc9221.dtsi
@@ -29,7 +29,7 @@
 		compatible = "smsc,lan9221","smsc,lan9115";
 		bank-width = <2>;
 
-		gpmc,mux-add-data;
+		gpmc,mux-add-data = <0>;
 		gpmc,cs-on-ns = <0>;
 		gpmc,cs-rd-off-ns = <42>;
 		gpmc,cs-wr-off-ns = <36>;
diff --git a/arch/arm/boot/dts/omap3-overo-tobiduo-common.dtsi b/arch/arm/boot/dts/omap3-overo-tobiduo-common.dtsi
index 82e98ee3023a..3dbeb7a6c569 100644
--- a/arch/arm/boot/dts/omap3-overo-tobiduo-common.dtsi
+++ b/arch/arm/boot/dts/omap3-overo-tobiduo-common.dtsi
@@ -25,7 +25,7 @@
 		compatible = "smsc,lan9221","smsc,lan9115";
 		bank-width = <2>;
 
-		gpmc,mux-add-data;
+		gpmc,mux-add-data = <0>;
 		gpmc,cs-on-ns = <0>;
 		gpmc,cs-rd-off-ns = <42>;
 		gpmc,cs-wr-off-ns = <36>;

commit f2d22b13baa6d61d28788a5754a12e0c08ff213d
Author: Luis Chamberlain <mcgrof@kernel.org>
Date:   Fri Sep 17 11:22:13 2021 -0700

    firmware_loader: fix pre-allocated buf built-in firmware use
    
    [ Upstream commit f7a07f7b96033df7709042ff38e998720a3f7119 ]
    
    The firmware_loader can be used with a pre-allocated buffer
    through the use of the API calls:
    
      o request_firmware_into_buf()
      o request_partial_firmware_into_buf()
    
    If the firmware was built-in and present, our current check
    for if the built-in firmware fits into the pre-allocated buffer
    does not return any errors, and we proceed to tell the caller
    that everything worked fine. It's a lie and no firmware would
    end up being copied into the pre-allocated buffer. So if the
    caller trust the result it may end up writing a bunch of 0's
    to a device!
    
    Fix this by making the function that checks for the pre-allocated
    buffer return non-void. Since the typical use case is when no
    pre-allocated buffer is provided make this return successfully
    for that case. If the built-in firmware does *not* fit into the
    pre-allocated buffer size return a failure as we should have
    been doing before.
    
    I'm not aware of users of the built-in firmware using the API
    calls with a pre-allocated buffer, as such I doubt this fixes
    any real life issue. But you never know... perhaps some oddball
    private tree might use it.
    
    In so far as upstream is concerned this just fixes our code for
    correctness.
    
    Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
    Link: https://lore.kernel.org/r/20210917182226.3532898-2-mcgrof@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/base/firmware_loader/main.c b/drivers/base/firmware_loader/main.c
index 24410a0d6df0..cfa5e598a0dc 100644
--- a/drivers/base/firmware_loader/main.c
+++ b/drivers/base/firmware_loader/main.c
@@ -97,12 +97,15 @@ static struct firmware_cache fw_cache;
 extern struct builtin_fw __start_builtin_fw[];
 extern struct builtin_fw __end_builtin_fw[];
 
-static void fw_copy_to_prealloc_buf(struct firmware *fw,
+static bool fw_copy_to_prealloc_buf(struct firmware *fw,
 				    void *buf, size_t size)
 {
-	if (!buf || size < fw->size)
-		return;
+	if (!buf)
+		return true;
+	if (size < fw->size)
+		return false;
 	memcpy(buf, fw->data, fw->size);
+	return true;
 }
 
 static bool fw_get_builtin_firmware(struct firmware *fw, const char *name,
@@ -114,9 +117,7 @@ static bool fw_get_builtin_firmware(struct firmware *fw, const char *name,
 		if (strcmp(name, b_fw->name) == 0) {
 			fw->size = b_fw->size;
 			fw->data = b_fw->data;
-			fw_copy_to_prealloc_buf(fw, buf, size);
-
-			return true;
+			return fw_copy_to_prealloc_buf(fw, buf, size);
 		}
 	}
 

commit f5a0ba4a9b5e70e7b2f767636d26523f9d1ac59d
Author: Guo Zhi <qtxuning1999@sjtu.edu.cn>
Date:   Wed Sep 29 20:25:37 2021 +0800

    scsi: advansys: Fix kernel pointer leak
    
    [ Upstream commit d4996c6eac4c81b8872043e9391563f67f13e406 ]
    
    Pointers should be printed with %p or %px rather than cast to 'unsigned
    long' and printed with %lx.
    
    Change %lx to %p to print the hashed pointer.
    
    Link: https://lore.kernel.org/r/20210929122538.1158235-1-qtxuning1999@sjtu.edu.cn
    Signed-off-by: Guo Zhi <qtxuning1999@sjtu.edu.cn>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c
index 713f69033f20..2856b0ce7ab9 100644
--- a/drivers/scsi/advansys.c
+++ b/drivers/scsi/advansys.c
@@ -3370,8 +3370,8 @@ static void asc_prt_adv_board_info(struct seq_file *m, struct Scsi_Host *shost)
 		   shost->host_no);
 
 	seq_printf(m,
-		   " iop_base 0x%lx, cable_detect: %X, err_code %u\n",
-		   (unsigned long)v->iop_base,
+		   " iop_base 0x%p, cable_detect: %X, err_code %u\n",
+		   v->iop_base,
 		   AdvReadWordRegister(iop_base,IOPW_SCSI_CFG1) & CABLE_DETECT,
 		   v->err_code);
 

commit 836d89d174aa5c0c30e07ecb8ab6cfd759fdc912
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Sat Oct 2 23:14:57 2021 +0200

    ASoC: nau8824: Add DMI quirk mechanism for active-high jack-detect
    
    [ Upstream commit 92d3360108f1839ca40451bad20ff67dd24a1964 ]
    
    Add a quirk mechanism to allow specifying that active-high jack-detection
    should be used on platforms where this info is not available in devicetree.
    
    And add an entry for the Cyberbook T116 tablet to the DMI table, so that
    jack-detection will work properly on this tablet.
    
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Link: https://lore.kernel.org/r/20211002211459.110124-2-hdegoede@redhat.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/codecs/nau8824.c b/sound/soc/codecs/nau8824.c
index 663a208c2f78..4af87340b165 100644
--- a/sound/soc/codecs/nau8824.c
+++ b/sound/soc/codecs/nau8824.c
@@ -11,6 +11,7 @@
 
 #include <linux/module.h>
 #include <linux/delay.h>
+#include <linux/dmi.h>
 #include <linux/init.h>
 #include <linux/i2c.h>
 #include <linux/regmap.h>
@@ -30,6 +31,12 @@
 
 #include "nau8824.h"
 
+#define NAU8824_JD_ACTIVE_HIGH			BIT(0)
+
+static int nau8824_quirk;
+static int quirk_override = -1;
+module_param_named(quirk, quirk_override, uint, 0444);
+MODULE_PARM_DESC(quirk, "Board-specific quirk override");
 
 static int nau8824_config_sysclk(struct nau8824 *nau8824,
 	int clk_id, unsigned int freq);
@@ -1878,6 +1885,34 @@ static int nau8824_read_device_properties(struct device *dev,
 	return 0;
 }
 
+/* Please keep this list alphabetically sorted */
+static const struct dmi_system_id nau8824_quirk_table[] = {
+	{
+		/* Cyberbook T116 rugged tablet */
+		.matches = {
+			DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Default string"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"),
+			DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "20170531"),
+		},
+		.driver_data = (void *)(NAU8824_JD_ACTIVE_HIGH),
+	},
+	{}
+};
+
+static void nau8824_check_quirks(void)
+{
+	const struct dmi_system_id *dmi_id;
+
+	if (quirk_override != -1) {
+		nau8824_quirk = quirk_override;
+		return;
+	}
+
+	dmi_id = dmi_first_match(nau8824_quirk_table);
+	if (dmi_id)
+		nau8824_quirk = (unsigned long)dmi_id->driver_data;
+}
+
 static int nau8824_i2c_probe(struct i2c_client *i2c,
 	const struct i2c_device_id *id)
 {
@@ -1902,6 +1937,11 @@ static int nau8824_i2c_probe(struct i2c_client *i2c,
 	nau8824->irq = i2c->irq;
 	sema_init(&nau8824->jd_sem, 1);
 
+	nau8824_check_quirks();
+
+	if (nau8824_quirk & NAU8824_JD_ACTIVE_HIGH)
+		nau8824->jkdet_polarity = 0;
+
 	nau8824_print_device_properties(nau8824);
 
 	ret = regmap_read(nau8824->regmap, NAU8824_REG_I2C_DEVICE_ID, &value);

commit 8a6d22adee758543a9c708032f2c180459cf3500
Author: Michael Walle <michael@walle.cc>
Date:   Thu Aug 26 14:35:28 2021 +0200

    arm64: dts: freescale: fix arm,sp805 compatible string
    
    [ Upstream commit 99a7cacc66cae92db40139b57689be2af75fc6b8 ]
    
    According to Documentation/devicetree/bindings/watchdog/arm,sp805.yaml
    the compatible is:
      compatible = "arm,sp805", "arm,primecell";
    
    The current compatible string doesn't exist at all. Fix it.
    
    Signed-off-by: Michael Walle <michael@walle.cc>
    Signed-off-by: Shawn Guo <shawnguo@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
index a07f612ab56b..b3b87c4c738e 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
@@ -584,56 +584,56 @@
 		};
 
 		cluster1_core0_watchdog: wdt@c000000 {
-			compatible = "arm,sp805-wdt", "arm,primecell";
+			compatible = "arm,sp805", "arm,primecell";
 			reg = <0x0 0xc000000 0x0 0x1000>;
 			clocks = <&clockgen 4 3>, <&clockgen 4 3>;
 			clock-names = "apb_pclk", "wdog_clk";
 		};
 
 		cluster1_core1_watchdog: wdt@c010000 {
-			compatible = "arm,sp805-wdt", "arm,primecell";
+			compatible = "arm,sp805", "arm,primecell";
 			reg = <0x0 0xc010000 0x0 0x1000>;
 			clocks = <&clockgen 4 3>, <&clockgen 4 3>;
 			clock-names = "apb_pclk", "wdog_clk";
 		};
 
 		cluster1_core2_watchdog: wdt@c020000 {
-			compatible = "arm,sp805-wdt", "arm,primecell";
+			compatible = "arm,sp805", "arm,primecell";
 			reg = <0x0 0xc020000 0x0 0x1000>;
 			clocks = <&clockgen 4 3>, <&clockgen 4 3>;
 			clock-names = "apb_pclk", "wdog_clk";
 		};
 
 		cluster1_core3_watchdog: wdt@c030000 {
-			compatible = "arm,sp805-wdt", "arm,primecell";
+			compatible = "arm,sp805", "arm,primecell";
 			reg = <0x0 0xc030000 0x0 0x1000>;
 			clocks = <&clockgen 4 3>, <&clockgen 4 3>;
 			clock-names = "apb_pclk", "wdog_clk";
 		};
 
 		cluster2_core0_watchdog: wdt@c100000 {
-			compatible = "arm,sp805-wdt", "arm,primecell";
+			compatible = "arm,sp805", "arm,primecell";
 			reg = <0x0 0xc100000 0x0 0x1000>;
 			clocks = <&clockgen 4 3>, <&clockgen 4 3>;
 			clock-names = "apb_pclk", "wdog_clk";
 		};
 
 		cluster2_core1_watchdog: wdt@c110000 {
-			compatible = "arm,sp805-wdt", "arm,primecell";
+			compatible = "arm,sp805", "arm,primecell";
 			reg = <0x0 0xc110000 0x0 0x1000>;
 			clocks = <&clockgen 4 3>, <&clockgen 4 3>;
 			clock-names = "apb_pclk", "wdog_clk";
 		};
 
 		cluster2_core2_watchdog: wdt@c120000 {
-			compatible = "arm,sp805-wdt", "arm,primecell";
+			compatible = "arm,sp805", "arm,primecell";
 			reg = <0x0 0xc120000 0x0 0x1000>;
 			clocks = <&clockgen 4 3>, <&clockgen 4 3>;
 			clock-names = "apb_pclk", "wdog_clk";
 		};
 
 		cluster2_core3_watchdog: wdt@c130000 {
-			compatible = "arm,sp805-wdt", "arm,primecell";
+			compatible = "arm,sp805", "arm,primecell";
 			reg = <0x0 0xc130000 0x0 0x1000>;
 			clocks = <&clockgen 4 3>, <&clockgen 4 3>;
 			clock-names = "apb_pclk", "wdog_clk";
diff --git a/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
index 8c22ce904e65..73a60fd516e0 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
+++ b/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
@@ -222,56 +222,56 @@
 		};
 
 		cluster1_core0_watchdog: wdt@c000000 {
-			compatible = "arm,sp805-wdt", "arm,primecell";
+			compatible = "arm,sp805", "arm,primecell";
 			reg = <0x0 0xc000000 0x0 0x1000>;
 			clocks = <&clockgen 4 3>, <&clockgen 4 3>;
 			clock-names = "apb_pclk", "wdog_clk";
 		};
 
 		cluster1_core1_watchdog: wdt@c010000 {
-			compatible = "arm,sp805-wdt", "arm,primecell";
+			compatible = "arm,sp805", "arm,primecell";
 			reg = <0x0 0xc010000 0x0 0x1000>;
 			clocks = <&clockgen 4 3>, <&clockgen 4 3>;
 			clock-names = "apb_pclk", "wdog_clk";
 		};
 
 		cluster2_core0_watchdog: wdt@c100000 {
-			compatible = "arm,sp805-wdt", "arm,primecell";
+			compatible = "arm,sp805", "arm,primecell";
 			reg = <0x0 0xc100000 0x0 0x1000>;
 			clocks = <&clockgen 4 3>, <&clockgen 4 3>;
 			clock-names = "apb_pclk", "wdog_clk";
 		};
 
 		cluster2_core1_watchdog: wdt@c110000 {
-			compatible = "arm,sp805-wdt", "arm,primecell";
+			compatible = "arm,sp805", "arm,primecell";
 			reg = <0x0 0xc110000 0x0 0x1000>;
 			clocks = <&clockgen 4 3>, <&clockgen 4 3>;
 			clock-names = "apb_pclk", "wdog_clk";
 		};
 
 		cluster3_core0_watchdog: wdt@c200000 {
-			compatible = "arm,sp805-wdt", "arm,primecell";
+			compatible = "arm,sp805", "arm,primecell";
 			reg = <0x0 0xc200000 0x0 0x1000>;
 			clocks = <&clockgen 4 3>, <&clockgen 4 3>;
 			clock-names = "apb_pclk", "wdog_clk";
 		};
 
 		cluster3_core1_watchdog: wdt@c210000 {
-			compatible = "arm,sp805-wdt", "arm,primecell";
+			compatible = "arm,sp805", "arm,primecell";
 			reg = <0x0 0xc210000 0x0 0x1000>;
 			clocks = <&clockgen 4 3>, <&clockgen 4 3>;
 			clock-names = "apb_pclk", "wdog_clk";
 		};
 
 		cluster4_core0_watchdog: wdt@c300000 {
-			compatible = "arm,sp805-wdt", "arm,primecell";
+			compatible = "arm,sp805", "arm,primecell";
 			reg = <0x0 0xc300000 0x0 0x1000>;
 			clocks = <&clockgen 4 3>, <&clockgen 4 3>;
 			clock-names = "apb_pclk", "wdog_clk";
 		};
 
 		cluster4_core1_watchdog: wdt@c310000 {
-			compatible = "arm,sp805-wdt", "arm,primecell";
+			compatible = "arm,sp805", "arm,primecell";
 			reg = <0x0 0xc310000 0x0 0x1000>;
 			clocks = <&clockgen 4 3>, <&clockgen 4 3>;
 			clock-names = "apb_pclk", "wdog_clk";

commit 2a897d384513ba7f7ef05611338b9a6ec6aeac00
Author: Sven Peter <sven@svenpeter.dev>
Date:   Tue Sep 14 16:02:35 2021 +0200

    usb: typec: tipd: Remove WARN_ON in tps6598x_block_read
    
    [ Upstream commit b7a0a63f3fed57d413bb857de164ea9c3984bc4e ]
    
    Calling tps6598x_block_read with a higher than allowed len can be
    handled by just returning an error. There's no need to crash systems
    with panic-on-warn enabled.
    
    Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
    Signed-off-by: Sven Peter <sven@svenpeter.dev>
    Link: https://lore.kernel.org/r/20210914140235.65955-3-sven@svenpeter.dev
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/typec/tps6598x.c b/drivers/usb/typec/tps6598x.c
index 987b8fcfb2aa..a4dd23a8f195 100644
--- a/drivers/usb/typec/tps6598x.c
+++ b/drivers/usb/typec/tps6598x.c
@@ -93,7 +93,7 @@ tps6598x_block_read(struct tps6598x *tps, u8 reg, void *val, size_t len)
 	u8 data[TPS_MAX_LEN + 1];
 	int ret;
 
-	if (WARN_ON(len + 1 > sizeof(data)))
+	if (len + 1 > sizeof(data))
 		return -EINVAL;
 
 	if (!tps->i2c_protocol)

commit f87a79c04a33ab4e5be598c7b0867e6ef193d702
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Wed Sep 15 11:49:25 2021 +0800

    usb: musb: tusb6010: check return value after calling platform_get_resource()
    
    [ Upstream commit 14651496a3de6807a17c310f63c894ea0c5d858e ]
    
    It will cause null-ptr-deref if platform_get_resource() returns NULL,
    we need check the return value.
    
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Link: https://lore.kernel.org/r/20210915034925.2399823-1-yangyingliang@huawei.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c
index 4ecfbf6bb1fa..902507da8aa8 100644
--- a/drivers/usb/musb/tusb6010.c
+++ b/drivers/usb/musb/tusb6010.c
@@ -1103,6 +1103,11 @@ static int tusb_musb_init(struct musb *musb)
 
 	/* dma address for async dma */
 	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!mem) {
+		pr_debug("no async dma resource?\n");
+		ret = -ENODEV;
+		goto done;
+	}
 	musb->async = mem->start;
 
 	/* dma address for sync dma */

commit b0729a186362c4e44cf3ea3fdc872b40e9c9641b
Author: Michael Walle <michael@walle.cc>
Date:   Mon Aug 30 18:51:13 2021 +0200

    arm64: dts: hisilicon: fix arm,sp805 compatible string
    
    [ Upstream commit 894d4f1f77d0e88f1f81af2e1e37333c1c41b631 ]
    
    According to Documentation/devicetree/bindings/watchdog/arm,sp805.yaml
    the compatible is:
      compatible = "arm,sp805", "arm,primecell";
    
    The current compatible string doesn't exist at all. Fix it.
    
    Signed-off-by: Michael Walle <michael@walle.cc>
    Signed-off-by: Wei Xu <xuwei5@hisilicon.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm64/boot/dts/hisilicon/hi3660.dtsi b/arch/arm64/boot/dts/hisilicon/hi3660.dtsi
index f432b0a88c65..6d4dee3cac16 100644
--- a/arch/arm64/boot/dts/hisilicon/hi3660.dtsi
+++ b/arch/arm64/boot/dts/hisilicon/hi3660.dtsi
@@ -1062,7 +1062,7 @@
 		};
 
 		watchdog0: watchdog@e8a06000 {
-			compatible = "arm,sp805-wdt", "arm,primecell";
+			compatible = "arm,sp805", "arm,primecell";
 			reg = <0x0 0xe8a06000 0x0 0x1000>;
 			interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
 			clocks = <&crg_ctrl HI3660_OSC32K>;
@@ -1070,7 +1070,7 @@
 		};
 
 		watchdog1: watchdog@e8a07000 {
-			compatible = "arm,sp805-wdt", "arm,primecell";
+			compatible = "arm,sp805", "arm,primecell";
 			reg = <0x0 0xe8a07000 0x0 0x1000>;
 			interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
 			clocks = <&crg_ctrl HI3660_OSC32K>;
diff --git a/arch/arm64/boot/dts/hisilicon/hi6220.dtsi b/arch/arm64/boot/dts/hisilicon/hi6220.dtsi
index 247024df714f..5e9ae262caf3 100644
--- a/arch/arm64/boot/dts/hisilicon/hi6220.dtsi
+++ b/arch/arm64/boot/dts/hisilicon/hi6220.dtsi
@@ -830,7 +830,7 @@
 		};
 
 		watchdog0: watchdog@f8005000 {
-			compatible = "arm,sp805-wdt", "arm,primecell";
+			compatible = "arm,sp805", "arm,primecell";
 			reg = <0x0 0xf8005000 0x0 0x1000>;
 			interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
 			clocks = <&ao_ctrl HI6220_WDT0_PCLK>;

commit b291d147d0268e93ad866f8bc820ea14497abc9b
Author: James Smart <jsmart2021@gmail.com>
Date:   Fri Sep 10 16:31:46 2021 -0700

    scsi: lpfc: Fix list_add() corruption in lpfc_drain_txq()
    
    [ Upstream commit 99154581b05c8fb22607afb7c3d66c1bace6aa5d ]
    
    When parsing the txq list in lpfc_drain_txq(), the driver attempts to pass
    the requests to the adapter. If such an attempt fails, a local "fail_msg"
    string is set and a log message output.  The job is then added to a
    completions list for cancellation.
    
    Processing of any further jobs from the txq list continues, but since
    "fail_msg" remains set, jobs are added to the completions list regardless
    of whether a wqe was passed to the adapter.  If successfully added to
    txcmplq, jobs are added to both lists resulting in list corruption.
    
    Fix by clearing the fail_msg string after adding a job to the completions
    list. This stops the subsequent jobs from being added to the completions
    list unless they had an appropriate failure.
    
    Link: https://lore.kernel.org/r/20210910233159.115896-2-jsmart2021@gmail.com
    Co-developed-by: Justin Tee <justin.tee@broadcom.com>
    Signed-off-by: Justin Tee <justin.tee@broadcom.com>
    Signed-off-by: James Smart <jsmart2021@gmail.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
index 40d6537e64dd..e72fc88aeb40 100644
--- a/drivers/scsi/lpfc/lpfc_sli.c
+++ b/drivers/scsi/lpfc/lpfc_sli.c
@@ -19171,6 +19171,7 @@ lpfc_drain_txq(struct lpfc_hba *phba)
 					fail_msg,
 					piocbq->iotag, piocbq->sli4_xritag);
 			list_add_tail(&piocbq->list, &completions);
+			fail_msg = NULL;
 		}
 		spin_unlock_irqrestore(&pring->ring_lock, iflags);
 	}

commit b8194644ee70d5b2a759feed3ec1e2a0227dfe0d
Author: Michal Simek <michal.simek@xilinx.com>
Date:   Fri Aug 6 10:58:29 2021 +0200

    arm64: zynqmp: Fix serial compatible string
    
    [ Upstream commit 812fa2f0e9d33564bd0131a69750e0d165f4c82a ]
    
    Based on commit 65a2c14d4f00 ("dt-bindings: serial: convert Cadence UART
    bindings to YAML") compatible string should look like differently that's
    why fix it to be aligned with dt binding.
    
    Signed-off-by: Michal Simek <michal.simek@xilinx.com>
    Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
    Link: https://lore.kernel.org/r/89b36e0a6187cc6b05b27a035efdf79173bd4486.1628240307.git.michal.simek@xilinx.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm64/boot/dts/xilinx/zynqmp.dtsi b/arch/arm64/boot/dts/xilinx/zynqmp.dtsi
index 8a885ae647b7..6478bca01819 100644
--- a/arch/arm64/boot/dts/xilinx/zynqmp.dtsi
+++ b/arch/arm64/boot/dts/xilinx/zynqmp.dtsi
@@ -574,7 +574,7 @@
 		};
 
 		uart0: serial@ff000000 {
-			compatible = "cdns,uart-r1p12", "xlnx,xuartps";
+			compatible = "xlnx,zynqmp-uart", "cdns,uart-r1p12";
 			status = "disabled";
 			interrupt-parent = <&gic>;
 			interrupts = <0 21 4>;
@@ -583,7 +583,7 @@
 		};
 
 		uart1: serial@ff010000 {
-			compatible = "cdns,uart-r1p12", "xlnx,xuartps";
+			compatible = "xlnx,zynqmp-uart", "cdns,uart-r1p12";
 			status = "disabled";
 			interrupt-parent = <&gic>;
 			interrupts = <0 22 4>;

commit 19c61385bb58468a83578f254464a9fea02ec055
Author: Amit Kumar Mahapatra <amit.kumar-mahapatra@xilinx.com>
Date:   Mon Jun 14 17:25:10 2021 +0200

    arm64: zynqmp: Do not duplicate flash partition label property
    
    [ Upstream commit 167721a5909f867f8c18c8e78ea58e705ad9bbd4 ]
    
    In kernel 5.4, support has been added for reading MTD devices via the nvmem
    API.
    For this the mtd devices are registered as read-only NVMEM providers under
    sysfs with the same name as the flash partition label property.
    
    So if flash partition label property of multiple flash devices are
    identical then the second mtd device fails to get registered as a NVMEM
    provider.
    
    This patch fixes the issue by having different label property for different
    flashes.
    
    Signed-off-by: Amit Kumar Mahapatra <amit.kumar-mahapatra@xilinx.com>
    Signed-off-by: Michal Simek <michal.simek@xilinx.com>
    Link: https://lore.kernel.org/r/6c4b9b9232b93d9e316a63c086540fd5bf6b8687.1623684253.git.michal.simek@xilinx.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm016-dc2.dts b/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm016-dc2.dts
index 11cc67184fa9..f1edd7fcef76 100644
--- a/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm016-dc2.dts
+++ b/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm016-dc2.dts
@@ -130,7 +130,7 @@
 		reg = <0>;
 
 		partition@0 {
-			label = "data";
+			label = "spi0-data";
 			reg = <0x0 0x100000>;
 		};
 	};
@@ -148,7 +148,7 @@
 		reg = <0>;
 
 		partition@0 {
-			label = "data";
+			label = "spi1-data";
 			reg = <0x0 0x84000>;
 		};
 	};

commit 80a939805f225ee03b81e963c2edd4ebbef58327
Author: Gao Xiang <hsiangkao@linux.alibaba.com>
Date:   Tue Nov 16 10:41:53 2021 +0800

    erofs: fix unsafe pagevec reuse of hooked pclusters
    
    commit 86432a6dca9bed79111990851df5756d3eb5f57c upstream.
    
    There are pclusters in runtime marked with Z_EROFS_PCLUSTER_TAIL
    before actual I/O submission. Thus, the decompression chain can be
    extended if the following pcluster chain hooks such tail pcluster.
    
    As the related comment mentioned, if some page is made of a hooked
    pcluster and another followed pcluster, it can be reused for in-place
    I/O (since I/O should be submitted anyway):
     _______________________________________________________________
    |  tail (partial) page |          head (partial) page           |
    |_____PRIMARY_HOOKED___|____________PRIMARY_FOLLOWED____________|
    
    However, it's by no means safe to reuse as pagevec since if such
    PRIMARY_HOOKED pclusters finally move into bypass chain without I/O
    submission. It's somewhat hard to reproduce with LZ4 and I just found
    it (general protection fault) by ro_fsstressing a LZMA image for long
    time.
    
    I'm going to actively clean up related code together with multi-page
    folio adaption in the next few months. Let's address it directly for
    easier backporting for now.
    
    Call trace for reference:
      z_erofs_decompress_pcluster+0x10a/0x8a0 [erofs]
      z_erofs_decompress_queue.isra.36+0x3c/0x60 [erofs]
      z_erofs_runqueue+0x5f3/0x840 [erofs]
      z_erofs_readahead+0x1e8/0x320 [erofs]
      read_pages+0x91/0x270
      page_cache_ra_unbounded+0x18b/0x240
      filemap_get_pages+0x10a/0x5f0
      filemap_read+0xa9/0x330
      new_sync_read+0x11b/0x1a0
      vfs_read+0xf1/0x190
    
    Link: https://lore.kernel.org/r/20211103182006.4040-1-xiang@kernel.org
    Fixes: 3883a79abd02 ("staging: erofs: introduce VLE decompression support")
    Cc: <stable@vger.kernel.org> # 4.19+
    Reviewed-by: Chao Yu <chao@kernel.org>
    Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/staging/erofs/unzip_pagevec.h b/drivers/staging/erofs/unzip_pagevec.h
index 64724dd1e04e..efbf541e11bb 100644
--- a/drivers/staging/erofs/unzip_pagevec.h
+++ b/drivers/staging/erofs/unzip_pagevec.h
@@ -117,11 +117,18 @@ static inline void z_erofs_pagevec_ctor_init(struct z_erofs_pagevec_ctor *ctor,
 static inline bool
 z_erofs_pagevec_ctor_enqueue(struct z_erofs_pagevec_ctor *ctor,
 			     struct page *page,
-			     enum z_erofs_page_type type)
+			     enum z_erofs_page_type type,
+			     bool pvec_safereuse)
 {
-	if (unlikely(ctor->next == NULL && type))
-		if (ctor->index + 1 == ctor->nr)
+	if (!ctor->next) {
+		/* some pages cannot be reused as pvec safely without I/O */
+		if (type == Z_EROFS_PAGE_TYPE_EXCLUSIVE && !pvec_safereuse)
+			type = Z_EROFS_VLE_PAGE_TYPE_TAIL_SHARED;
+
+		if (type != Z_EROFS_PAGE_TYPE_EXCLUSIVE &&
+		    ctor->index + 1 == ctor->nr)
 			return false;
+	}
 
 	if (unlikely(ctor->index >= ctor->nr))
 		z_erofs_pagevec_ctor_pagedown(ctor, false);
diff --git a/drivers/staging/erofs/unzip_vle.c b/drivers/staging/erofs/unzip_vle.c
index 48c21a4d5dc8..83e4d9384bd2 100644
--- a/drivers/staging/erofs/unzip_vle.c
+++ b/drivers/staging/erofs/unzip_vle.c
@@ -228,10 +228,10 @@ static inline bool try_to_reuse_as_compressed_page(
 }
 
 /* callers must be with work->lock held */
-static int z_erofs_vle_work_add_page(
-	struct z_erofs_vle_work_builder *builder,
-	struct page *page,
-	enum z_erofs_page_type type)
+static int z_erofs_vle_work_add_page(struct z_erofs_vle_work_builder *builder,
+				     struct page *page,
+				     enum z_erofs_page_type type,
+				     bool pvec_safereuse)
 {
 	int ret;
 
@@ -241,9 +241,9 @@ static int z_erofs_vle_work_add_page(
 		try_to_reuse_as_compressed_page(builder, page))
 		return 0;
 
-	ret = z_erofs_pagevec_ctor_enqueue(&builder->vector, page, type);
+	ret = z_erofs_pagevec_ctor_enqueue(&builder->vector, page, type,
+					   pvec_safereuse);
 	builder->work->vcnt += (unsigned)ret;
-
 	return ret ? 0 : -EAGAIN;
 }
 
@@ -688,14 +688,15 @@ static int z_erofs_do_read_page(struct z_erofs_vle_frontend *fe,
 		tight &= builder_is_followed(builder);
 
 retry:
-	err = z_erofs_vle_work_add_page(builder, page, page_type);
+	err = z_erofs_vle_work_add_page(builder, page, page_type,
+					builder_is_followed(builder));
 	/* should allocate an additional staging page for pagevec */
 	if (err == -EAGAIN) {
 		struct page *const newpage =
 			__stagingpage_alloc(page_pool, GFP_NOFS);
 
 		err = z_erofs_vle_work_add_page(builder,
-			newpage, Z_EROFS_PAGE_TYPE_EXCLUSIVE);
+			newpage, Z_EROFS_PAGE_TYPE_EXCLUSIVE, true);
 		if (likely(!err))
 			goto retry;
 	}

commit b59f23ad89ea0ae594da59c8a07dd2e09fa3a282
Author: Yue Hu <huyue2@yulong.com>
Date:   Tue Nov 16 10:41:52 2021 +0800

    erofs: remove the occupied parameter from z_erofs_pagevec_enqueue()
    
    commit 7dea3de7d384f4c8156e8bd93112ba6db1eb276c upstream.
    
    No any behavior to variable occupied in z_erofs_attach_page() which
    is only caller to z_erofs_pagevec_enqueue().
    
    Link: https://lore.kernel.org/r/20210419102623.2015-1-zbestahu@gmail.com
    Signed-off-by: Yue Hu <huyue2@yulong.com>
    Reviewed-by: Gao Xiang <xiang@kernel.org>
    Signed-off-by: Gao Xiang <xiang@kernel.org>
    [ Gao Xiang: handle 4.19 codebase conflicts manually. ]
    Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/staging/erofs/unzip_pagevec.h b/drivers/staging/erofs/unzip_pagevec.h
index 23856ba2742d..64724dd1e04e 100644
--- a/drivers/staging/erofs/unzip_pagevec.h
+++ b/drivers/staging/erofs/unzip_pagevec.h
@@ -117,10 +117,8 @@ static inline void z_erofs_pagevec_ctor_init(struct z_erofs_pagevec_ctor *ctor,
 static inline bool
 z_erofs_pagevec_ctor_enqueue(struct z_erofs_pagevec_ctor *ctor,
 			     struct page *page,
-			     enum z_erofs_page_type type,
-			     bool *occupied)
+			     enum z_erofs_page_type type)
 {
-	*occupied = false;
 	if (unlikely(ctor->next == NULL && type))
 		if (ctor->index + 1 == ctor->nr)
 			return false;
@@ -135,7 +133,6 @@ z_erofs_pagevec_ctor_enqueue(struct z_erofs_pagevec_ctor *ctor,
 	/* should remind that collector->next never equal to 1, 2 */
 	if (type == (uintptr_t)ctor->next) {
 		ctor->next = page;
-		*occupied = true;
 	}
 
 	ctor->pages[ctor->index++] =
diff --git a/drivers/staging/erofs/unzip_vle.c b/drivers/staging/erofs/unzip_vle.c
index 0f1558c6747e..48c21a4d5dc8 100644
--- a/drivers/staging/erofs/unzip_vle.c
+++ b/drivers/staging/erofs/unzip_vle.c
@@ -234,7 +234,6 @@ static int z_erofs_vle_work_add_page(
 	enum z_erofs_page_type type)
 {
 	int ret;
-	bool occupied;
 
 	/* give priority for the compressed data storage */
 	if (builder->role >= Z_EROFS_VLE_WORK_PRIMARY &&
@@ -242,8 +241,7 @@ static int z_erofs_vle_work_add_page(
 		try_to_reuse_as_compressed_page(builder, page))
 		return 0;
 
-	ret = z_erofs_pagevec_ctor_enqueue(&builder->vector,
-		page, type, &occupied);
+	ret = z_erofs_pagevec_ctor_enqueue(&builder->vector, page, type);
 	builder->work->vcnt += (unsigned)ret;
 
 	return ret ? 0 : -EAGAIN;

commit 3391fa278c6df4dc9c9ea1eb5f102f4570c68ddb
Author: Marc Zyngier <maz@kernel.org>
Date:   Thu Nov 4 18:01:30 2021 +0000

    PCI: Add MSI masking quirk for Nvidia ION AHCI
    
    commit f21082fb20dbfb3e42b769b59ef21c2a7f2c7c1f upstream.
    
    The ION AHCI device pretends that MSI masking isn't a thing, while it
    actually implements it and needs MSIs to be unmasked to work. Add a quirk
    to that effect.
    
    Reported-by: Rui Salvaterra <rsalvaterra@gmail.com>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Rui Salvaterra <rsalvaterra@gmail.com>
    Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
    Cc: Bjorn Helgaas <helgaas@kernel.org>
    Link: https://lore.kernel.org/r/CALjTZvbzYfBuLB+H=fj2J+9=DxjQ2Uqcy0if_PvmJ-nU-qEgkg@mail.gmail.com
    Link: https://lore.kernel.org/r/20211104180130.3825416-3-maz@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index a10471ff765a..315e96ba651a 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -5579,3 +5579,9 @@ static void apex_pci_fixup_class(struct pci_dev *pdev)
 }
 DECLARE_PCI_FIXUP_CLASS_HEADER(0x1ac1, 0x089a,
 			       PCI_CLASS_NOT_DEFINED, 8, apex_pci_fixup_class);
+
+static void nvidia_ion_ahci_fixup(struct pci_dev *pdev)
+{
+	pdev->dev_flags |= PCI_DEV_FLAGS_HAS_MSI_MASKING;
+}
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, 0x0ab8, nvidia_ion_ahci_fixup);

commit a632cb0b4013ff9ba8ce5f062a45e5652975a68b
Author: Marc Zyngier <maz@kernel.org>
Date:   Thu Nov 4 18:01:29 2021 +0000

    PCI/MSI: Deal with devices lying about their MSI mask capability
    
    commit 2226667a145db2e1f314d7f57fd644fe69863ab9 upstream.
    
    It appears that some devices are lying about their mask capability,
    pretending that they don't have it, while they actually do.
    The net result is that now that we don't enable MSIs on such
    endpoint.
    
    Add a new per-device flag to deal with this. Further patches will
    make use of it, sadly.
    
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
    Link: https://lore.kernel.org/r/20211104180130.3825416-2-maz@kernel.org
    Cc: Bjorn Helgaas <helgaas@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index c824764f44ff..d42c84a2d2eb 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -569,6 +569,9 @@ msi_setup_entry(struct pci_dev *dev, int nvec, const struct irq_affinity *affd)
 		goto out;
 
 	pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control);
+	/* Lies, damned lies, and MSIs */
+	if (dev->dev_flags & PCI_DEV_FLAGS_HAS_MSI_MASKING)
+		control |= PCI_MSI_FLAGS_MASKBIT;
 
 	entry->msi_attrib.is_msix	= 0;
 	entry->msi_attrib.is_64		= !!(control & PCI_MSI_FLAGS_64BIT);
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 6f9ca2f278b3..a4bbce871e08 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -205,6 +205,8 @@ enum pci_dev_flags {
 	PCI_DEV_FLAGS_NO_FLR_RESET = (__force pci_dev_flags_t) (1 << 10),
 	/* Don't use Relaxed Ordering for TLPs directed at this device */
 	PCI_DEV_FLAGS_NO_RELAXED_ORDERING = (__force pci_dev_flags_t) (1 << 11),
+	/* Device does honor MSI masking despite saying otherwise */
+	PCI_DEV_FLAGS_HAS_MSI_MASKING = (__force pci_dev_flags_t) (1 << 12),
 };
 
 enum pci_irq_reroute_variant {

commit d8ea896354e3177316a24e2fd379785082d1a2fb
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Tue Nov 9 14:53:57 2021 +0100

    PCI/MSI: Destroy sysfs before freeing entries
    
    commit 3735459037114d31e5acd9894fad9aed104231a0 upstream.
    
    free_msi_irqs() frees the MSI entries before destroying the sysfs entries
    which are exposing them. Nothing prevents a concurrent free while a sysfs
    file is read and accesses the possibly freed entry.
    
    Move the sysfs release ahead of freeing the entries.
    
    Fixes: 1c51b50c2995 ("PCI/MSI: Export MSI mode using attributes, not kobjects")
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Bjorn Helgaas <helgaas@kernel.org>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/87sfw5305m.ffs@tglx
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index f65800d63856..c824764f44ff 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -372,18 +372,6 @@ static void free_msi_irqs(struct pci_dev *dev)
 			for (i = 0; i < entry->nvec_used; i++)
 				BUG_ON(irq_has_action(entry->irq + i));
 
-	pci_msi_teardown_msi_irqs(dev);
-
-	list_for_each_entry_safe(entry, tmp, msi_list, list) {
-		if (entry->msi_attrib.is_msix) {
-			if (list_is_last(&entry->list, msi_list))
-				iounmap(entry->mask_base);
-		}
-
-		list_del(&entry->list);
-		free_msi_entry(entry);
-	}
-
 	if (dev->msi_irq_groups) {
 		sysfs_remove_groups(&dev->dev.kobj, dev->msi_irq_groups);
 		msi_attrs = dev->msi_irq_groups[0]->attrs;
@@ -399,6 +387,18 @@ static void free_msi_irqs(struct pci_dev *dev)
 		kfree(dev->msi_irq_groups);
 		dev->msi_irq_groups = NULL;
 	}
+
+	pci_msi_teardown_msi_irqs(dev);
+
+	list_for_each_entry_safe(entry, tmp, msi_list, list) {
+		if (entry->msi_attrib.is_msix) {
+			if (list_is_last(&entry->list, msi_list))
+				iounmap(entry->mask_base);
+		}
+
+		list_del(&entry->list);
+		free_msi_entry(entry);
+	}
 }
 
 static void pci_intx_for_msi(struct pci_dev *dev, int enable)

commit bb07fc138e61cef1640fdd136272febc7453b428
Author: Sven Schnelle <svens@stackframe.org>
Date:   Sat Nov 13 20:41:17 2021 +0100

    parisc/entry: fix trace test in syscall exit path
    
    commit 3ec18fc7831e7d79e2d536dd1f3bc0d3ba425e8a upstream.
    
    commit 8779e05ba8aa ("parisc: Fix ptrace check on syscall return")
    fixed testing of TI_FLAGS. This uncovered a bug in the test mask.
    syscall_restore_rfi is only used when the kernel needs to exit to
    usespace with single or block stepping and the recovery counter
    enabled. The test however used _TIF_SYSCALL_TRACE_MASK, which
    includes a lot of bits that shouldn't be tested here.
    
    Fix this by using TIF_SINGLESTEP and TIF_BLOCKSTEP directly.
    
    I encountered this bug by enabling syscall tracepoints. Both in qemu and
    on real hardware. As soon as i enabled the tracepoint (sys_exit_read,
    but i guess it doesn't really matter which one), i got random page
    faults in userspace almost immediately.
    
    Signed-off-by: Sven Schnelle <svens@stackframe.org>
    Signed-off-by: Helge Deller <deller@gmx.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S
index f7e09fbf78f5..e8b503cd54f5 100644
--- a/arch/parisc/kernel/entry.S
+++ b/arch/parisc/kernel/entry.S
@@ -1852,7 +1852,7 @@ syscall_restore:
 
 	/* Are we being ptraced? */
 	LDREG	TI_FLAGS-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r19
-	ldi	_TIF_SYSCALL_TRACE_MASK,%r2
+	ldi	_TIF_SINGLESTEP|_TIF_BLOCKSTEP,%r2
 	and,COND(=)	%r19,%r2,%r0
 	b,n	syscall_restore_rfi
 

commit 9000f2a528c0b58deea62a911454323090a67492
Author: Kees Cook <keescook@chromium.org>
Date:   Wed May 12 21:51:10 2021 -0700

    fortify: Explicitly disable Clang support
    
    commit a52f8a59aef46b59753e583bf4b28fccb069ce64 upstream.
    
    Clang has never correctly compiled the FORTIFY_SOURCE defenses due to
    a couple bugs:
    
            Eliding inlines with matching __builtin_* names
            https://bugs.llvm.org/show_bug.cgi?id=50322
    
            Incorrect __builtin_constant_p() of some globals
            https://bugs.llvm.org/show_bug.cgi?id=41459
    
    In the process of making improvements to the FORTIFY_SOURCE defenses, the
    first (silent) bug (coincidentally) becomes worked around, but exposes
    the latter which breaks the build. As such, Clang must not be used with
    CONFIG_FORTIFY_SOURCE until at least latter bug is fixed (in Clang 13),
    and the fortify routines have been rearranged.
    
    Update the Kconfig to reflect the reality of the current situation.
    
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Acked-by: Nick Desaulniers <ndesaulniers@google.com>
    Link: https://lore.kernel.org/lkml/CAKwvOd=A+ueGV2ihdy5GtgR2fQbcXjjAtVxv3=cPjffpebZB7A@mail.gmail.com
    Cc: Nathan Chancellor <nathan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/security/Kconfig b/security/Kconfig
index d9aa521b5206..27e73c3b4392 100644
--- a/security/Kconfig
+++ b/security/Kconfig
@@ -191,6 +191,9 @@ config HARDENED_USERCOPY_PAGESPAN
 config FORTIFY_SOURCE
 	bool "Harden common str/mem functions against buffer overflows"
 	depends on ARCH_HAS_FORTIFY_SOURCE
+	# https://bugs.llvm.org/show_bug.cgi?id=50322
+	# https://bugs.llvm.org/show_bug.cgi?id=41459
+	depends on !CC_IS_CLANG
 	help
 	  Detect overflows of buffers in common string and memory functions
 	  where the compiler can determine and validate the buffer sizes.

commit 0898c7a70aae87eeec6b00f03e0bb592fefd295f
Author: Shaoying Xu <shaoyi@amazon.com>
Date:   Thu Sep 2 16:44:12 2021 +0000

    ext4: fix lazy initialization next schedule time computation in more granular unit
    
    commit 39fec6889d15a658c3a3ebb06fd69d3584ddffd3 upstream.
    
    Ext4 file system has default lazy inode table initialization setup once
    it is mounted. However, it has issue on computing the next schedule time
    that makes the timeout same amount in jiffies but different real time in
    secs if with various HZ values. Therefore, fix by measuring the current
    time in a more granular unit nanoseconds and make the next schedule time
    independent of the HZ value.
    
    Fixes: bfff68738f1c ("ext4: add support for lazy inode table initialization")
    Signed-off-by: Shaoying Xu <shaoyi@amazon.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Link: https://lore.kernel.org/r/20210902164412.9994-2-shaoyi@amazon.com
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 9ae3b6dd72fe..fab2092856a2 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -3026,8 +3026,8 @@ static int ext4_run_li_request(struct ext4_li_request *elr)
 	struct ext4_group_desc *gdp = NULL;
 	ext4_group_t group, ngroups;
 	struct super_block *sb;
-	unsigned long timeout = 0;
 	int ret = 0;
+	u64 start_time;
 
 	sb = elr->lr_super;
 	ngroups = EXT4_SB(sb)->s_groups_count;
@@ -3047,13 +3047,12 @@ static int ext4_run_li_request(struct ext4_li_request *elr)
 		ret = 1;
 
 	if (!ret) {
-		timeout = jiffies;
+		start_time = ktime_get_real_ns();
 		ret = ext4_init_inode_table(sb, group,
 					    elr->lr_timeout ? 0 : 1);
 		if (elr->lr_timeout == 0) {
-			timeout = (jiffies - timeout) *
-				  elr->lr_sbi->s_li_wait_mult;
-			elr->lr_timeout = timeout;
+			elr->lr_timeout = nsecs_to_jiffies((ktime_get_real_ns() - start_time) *
+				  elr->lr_sbi->s_li_wait_mult);
 		}
 		elr->lr_next_sched = jiffies + elr->lr_timeout;
 		elr->lr_next_group = group + 1;

commit a57977b0b8d963a92d482ea25ad85fe6369071ad
Author: Jane Malalane <jane.malalane@citrix.com>
Date:   Thu Oct 21 11:47:44 2021 +0100

    x86/cpu: Fix migration safety with X86_BUG_NULL_SEL
    
    commit 415de44076640483648d6c0f6d645a9ee61328ad upstream.
    
    Currently, Linux probes for X86_BUG_NULL_SEL unconditionally which
    makes it unsafe to migrate in a virtualised environment as the
    properties across the migration pool might differ.
    
    To be specific, the case which goes wrong is:
    
    1. Zen1 (or earlier) and Zen2 (or later) in a migration pool
    2. Linux boots on Zen2, probes and finds the absence of X86_BUG_NULL_SEL
    3. Linux is then migrated to Zen1
    
    Linux is now running on a X86_BUG_NULL_SEL-impacted CPU while believing
    that the bug is fixed.
    
    The only way to address the problem is to fully trust the "no longer
    affected" CPUID bit when virtualised, because in the above case it would
    be clear deliberately to indicate the fact "you might migrate to
    somewhere which has this behaviour".
    
    Zen3 adds the NullSelectorClearsBase CPUID bit to indicate that loading
    a NULL segment selector zeroes the base and limit fields, as well as
    just attributes. Zen2 also has this behaviour but doesn't have the NSCB
    bit.
    
     [ bp: Minor touchups. ]
    
    Signed-off-by: Jane Malalane <jane.malalane@citrix.com>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    CC: <stable@vger.kernel.org>
    Link: https://lkml.kernel.org/r/20211021104744.24126-1-jane.malalane@citrix.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index de69090ca142..98c23126f751 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -993,6 +993,8 @@ static void init_amd(struct cpuinfo_x86 *c)
 	if (cpu_has(c, X86_FEATURE_IRPERF) &&
 	    !cpu_has_amd_erratum(c, amd_erratum_1054))
 		msr_set_bit(MSR_K7_HWCR, MSR_K7_HWCR_IRPERF_EN_BIT);
+
+	check_null_seg_clears_base(c);
 }
 
 #ifdef CONFIG_X86_32
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 2058e8c0e61d..7e7400af7797 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -1254,9 +1254,8 @@ void __init early_cpu_init(void)
 	early_identify_cpu(&boot_cpu_data);
 }
 
-static void detect_null_seg_behavior(struct cpuinfo_x86 *c)
+static bool detect_null_seg_behavior(void)
 {
-#ifdef CONFIG_X86_64
 	/*
 	 * Empirically, writing zero to a segment selector on AMD does
 	 * not clear the base, whereas writing zero to a segment
@@ -1277,10 +1276,43 @@ static void detect_null_seg_behavior(struct cpuinfo_x86 *c)
 	wrmsrl(MSR_FS_BASE, 1);
 	loadsegment(fs, 0);
 	rdmsrl(MSR_FS_BASE, tmp);
-	if (tmp != 0)
-		set_cpu_bug(c, X86_BUG_NULL_SEG);
 	wrmsrl(MSR_FS_BASE, old_base);
-#endif
+	return tmp == 0;
+}
+
+void check_null_seg_clears_base(struct cpuinfo_x86 *c)
+{
+	/* BUG_NULL_SEG is only relevant with 64bit userspace */
+	if (!IS_ENABLED(CONFIG_X86_64))
+		return;
+
+	/* Zen3 CPUs advertise Null Selector Clears Base in CPUID. */
+	if (c->extended_cpuid_level >= 0x80000021 &&
+	    cpuid_eax(0x80000021) & BIT(6))
+		return;
+
+	/*
+	 * CPUID bit above wasn't set. If this kernel is still running
+	 * as a HV guest, then the HV has decided not to advertize
+	 * that CPUID bit for whatever reason.	For example, one
+	 * member of the migration pool might be vulnerable.  Which
+	 * means, the bug is present: set the BUG flag and return.
+	 */
+	if (cpu_has(c, X86_FEATURE_HYPERVISOR)) {
+		set_cpu_bug(c, X86_BUG_NULL_SEG);
+		return;
+	}
+
+	/*
+	 * Zen2 CPUs also have this behaviour, but no CPUID bit.
+	 * 0x18 is the respective family for Hygon.
+	 */
+	if ((c->x86 == 0x17 || c->x86 == 0x18) &&
+	    detect_null_seg_behavior())
+		return;
+
+	/* All the remaining ones are affected */
+	set_cpu_bug(c, X86_BUG_NULL_SEG);
 }
 
 static void generic_identify(struct cpuinfo_x86 *c)
@@ -1316,8 +1348,6 @@ static void generic_identify(struct cpuinfo_x86 *c)
 
 	get_model_name(c); /* Default name */
 
-	detect_null_seg_behavior(c);
-
 	/*
 	 * ESPFIX is a strange bug.  All real CPUs have it.  Paravirt
 	 * systems that run Linux at CPL > 0 may or may not have the
diff --git a/arch/x86/kernel/cpu/cpu.h b/arch/x86/kernel/cpu/cpu.h
index e89602d2aff5..4eb9bf68b122 100644
--- a/arch/x86/kernel/cpu/cpu.h
+++ b/arch/x86/kernel/cpu/cpu.h
@@ -76,6 +76,7 @@ extern int detect_extended_topology_early(struct cpuinfo_x86 *c);
 extern int detect_extended_topology(struct cpuinfo_x86 *c);
 extern int detect_ht_early(struct cpuinfo_x86 *c);
 extern void detect_ht(struct cpuinfo_x86 *c);
+extern void check_null_seg_clears_base(struct cpuinfo_x86 *c);
 
 unsigned int aperfmperf_get_khz(int cpu);
 

commit 515df9b954af92e1286354d2b8033e5a0b8ba374
Author: Miklos Szeredi <mszeredi@redhat.com>
Date:   Tue Aug 17 21:05:16 2021 +0200

    fuse: truncate pagecache on atomic_o_trunc
    
    commit 76224355db7570cbe6b6f75c8929a1558828dd55 upstream.
    
    fuse_finish_open() will be called with FUSE_NOWRITE in case of atomic
    O_TRUNC.  This can deadlock with fuse_wait_on_page_writeback() in
    fuse_launder_page() triggered by invalidate_inode_pages2().
    
    Fix by replacing invalidate_inode_pages2() in fuse_finish_open() with a
    truncate_pagecache() call.  This makes sense regardless of FOPEN_KEEP_CACHE
    or fc->writeback cache, so do it unconditionally.
    
    Reported-by: Xie Yongji <xieyongji@bytedance.com>
    Reported-and-tested-by: syzbot+bea44a5189836d956894@syzkaller.appspotmail.com
    Fixes: e4648309b85a ("fuse: truncate pending writes on O_TRUNC")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 6a3d89672ff7..13371a40f7a1 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -178,12 +178,11 @@ void fuse_finish_open(struct inode *inode, struct file *file)
 
 	if (ff->open_flags & FOPEN_DIRECT_IO)
 		file->f_op = &fuse_direct_io_file_operations;
-	if (!(ff->open_flags & FOPEN_KEEP_CACHE))
-		invalidate_inode_pages2(inode->i_mapping);
 	if (ff->open_flags & FOPEN_STREAM)
 		stream_open(inode, file);
 	else if (ff->open_flags & FOPEN_NONSEEKABLE)
 		nonseekable_open(inode, file);
+
 	if (fc->atomic_o_trunc && (file->f_flags & O_TRUNC)) {
 		struct fuse_inode *fi = get_fuse_inode(inode);
 
@@ -191,10 +190,14 @@ void fuse_finish_open(struct inode *inode, struct file *file)
 		fi->attr_version = ++fc->attr_version;
 		i_size_write(inode, 0);
 		spin_unlock(&fc->lock);
+		truncate_pagecache(inode, 0);
 		fuse_invalidate_attr(inode);
 		if (fc->writeback_cache)
 			file_update_time(file);
+	} else if (!(ff->open_flags & FOPEN_KEEP_CACHE)) {
+		invalidate_inode_pages2(inode->i_mapping);
 	}
+
 	if ((file->f_mode & FMODE_WRITE) && fc->writeback_cache)
 		fuse_link_write_file(file);
 }

commit a5153fb8baa29202227a4f809eaec3c4203ebcf5
Author: Pali Rohár <pali@kernel.org>
Date:   Tue Oct 5 20:09:40 2021 +0200

    PCI: Add PCI_EXP_DEVCTL_PAYLOAD_* macros
    
    commit 460275f124fb072dca218a6b43b6370eebbab20d upstream.
    
    Define a macro PCI_EXP_DEVCTL_PAYLOAD_* for every possible Max Payload
    Size in linux/pci_regs.h, in the same style as PCI_EXP_DEVCTL_READRQ_*.
    
    Link: https://lore.kernel.org/r/20211005180952.6812-2-kabel@kernel.org
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Reviewed-by: Marek Behún <kabel@kernel.org>
    Reviewed-by: Bjorn Helgaas <bhelgaas@google.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/uapi/linux/pci_regs.h b/include/uapi/linux/pci_regs.h
index ee556ccc93f4..8d2767140798 100644
--- a/include/uapi/linux/pci_regs.h
+++ b/include/uapi/linux/pci_regs.h
@@ -497,6 +497,12 @@
 #define  PCI_EXP_DEVCTL_URRE	0x0008	/* Unsupported Request Reporting En. */
 #define  PCI_EXP_DEVCTL_RELAX_EN 0x0010 /* Enable relaxed ordering */
 #define  PCI_EXP_DEVCTL_PAYLOAD	0x00e0	/* Max_Payload_Size */
+#define  PCI_EXP_DEVCTL_PAYLOAD_128B 0x0000 /* 128 Bytes */
+#define  PCI_EXP_DEVCTL_PAYLOAD_256B 0x0020 /* 256 Bytes */
+#define  PCI_EXP_DEVCTL_PAYLOAD_512B 0x0040 /* 512 Bytes */
+#define  PCI_EXP_DEVCTL_PAYLOAD_1024B 0x0060 /* 1024 Bytes */
+#define  PCI_EXP_DEVCTL_PAYLOAD_2048B 0x0080 /* 2048 Bytes */
+#define  PCI_EXP_DEVCTL_PAYLOAD_4096B 0x00a0 /* 4096 Bytes */
 #define  PCI_EXP_DEVCTL_EXT_TAG	0x0100	/* Extended Tag Field Enable */
 #define  PCI_EXP_DEVCTL_PHANTOM	0x0200	/* Phantom Functions Enable */
 #define  PCI_EXP_DEVCTL_AUX_PME	0x0400	/* Auxiliary Power PM Enable */

commit 3edf40b5e75a2b69d6e88022a87b9a4aeb29c1d3
Author: Sven Schnelle <svens@linux.ibm.com>
Date:   Tue Nov 2 10:55:30 2021 +0100

    s390/tape: fix timer initialization in tape_std_assign()
    
    commit 213fca9e23b59581c573d558aa477556f00b8198 upstream.
    
    commit 9c6c273aa424 ("timer: Remove init_timer_on_stack() in favor
    of timer_setup_on_stack()") changed the timer setup from
    init_timer_on_stack(() to timer_setup(), but missed to change the
    mod_timer() call. And while at it, use msecs_to_jiffies() instead
    of the open coded timeout calculation.
    
    Cc: stable@vger.kernel.org
    Fixes: 9c6c273aa424 ("timer: Remove init_timer_on_stack() in favor of timer_setup_on_stack()")
    Signed-off-by: Sven Schnelle <svens@linux.ibm.com>
    Reviewed-by: Vasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/s390/char/tape_std.c b/drivers/s390/char/tape_std.c
index 1f5fab617b67..f7e75d9fedf6 100644
--- a/drivers/s390/char/tape_std.c
+++ b/drivers/s390/char/tape_std.c
@@ -53,7 +53,6 @@ int
 tape_std_assign(struct tape_device *device)
 {
 	int                  rc;
-	struct timer_list    timeout;
 	struct tape_request *request;
 
 	request = tape_alloc_request(2, 11);
@@ -70,7 +69,7 @@ tape_std_assign(struct tape_device *device)
 	 * So we set up a timeout for this call.
 	 */
 	timer_setup(&request->timer, tape_std_assign_timeout, 0);
-	mod_timer(&timeout, jiffies + 2 * HZ);
+	mod_timer(&request->timer, jiffies + msecs_to_jiffies(2000));
 
 	rc = tape_do_io_interruptible(device, request);
 

commit d73ae146255f655d70395aca427c3b362da90adc
Author: Vineeth Vijayan <vneethv@linux.ibm.com>
Date:   Fri Nov 5 16:44:51 2021 +0100

    s390/cio: check the subchannel validity for dev_busid
    
    commit a4751f157c194431fae9e9c493f456df8272b871 upstream.
    
    Check the validity of subchanel before reading other fields in
    the schib.
    
    Fixes: d3683c055212 ("s390/cio: add dev_busid sysfs entry for each subchannel")
    CC: <stable@vger.kernel.org>
    Reported-by: Cornelia Huck <cohuck@redhat.com>
    Signed-off-by: Vineeth Vijayan <vneethv@linux.ibm.com>
    Reviewed-by: Cornelia Huck <cohuck@redhat.com>
    Link: https://lore.kernel.org/r/20211105154451.847288-1-vneethv@linux.ibm.com
    Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c
index 6efe50d70c4b..10e8b3b156f0 100644
--- a/drivers/s390/cio/css.c
+++ b/drivers/s390/cio/css.c
@@ -371,8 +371,8 @@ static ssize_t dev_busid_show(struct device *dev,
 	struct subchannel *sch = to_subchannel(dev);
 	struct pmcw *pmcw = &sch->schib.pmcw;
 
-	if ((pmcw->st == SUBCHANNEL_TYPE_IO ||
-	     pmcw->st == SUBCHANNEL_TYPE_MSG) && pmcw->dnv)
+	if ((pmcw->st == SUBCHANNEL_TYPE_IO && pmcw->dnv) ||
+	    (pmcw->st == SUBCHANNEL_TYPE_MSG && pmcw->w))
 		return sysfs_emit(buf, "0.%x.%04x\n", sch->schid.ssid,
 				  pmcw->dev);
 	else

commit 1711b877ab37a5ae3ff81d8b1f69ccc040187d56
Author: Marek Vasut <marex@denx.de>
Date:   Tue Sep 21 19:35:06 2021 +0200

    video: backlight: Drop maximum brightness override for brightness zero
    
    commit 33a5471f8da976bf271a1ebbd6b9d163cb0cb6aa upstream.
    
    The note in c2adda27d202f ("video: backlight: Add of_find_backlight helper
    in backlight.c") says that gpio-backlight uses brightness as power state.
    This has been fixed since in ec665b756e6f7 ("backlight: gpio-backlight:
    Correct initial power state handling") and other backlight drivers do not
    require this workaround. Drop the workaround.
    
    This fixes the case where e.g. pwm-backlight can perfectly well be set to
    brightness 0 on boot in DT, which without this patch leads to the display
    brightness to be max instead of off.
    
    Fixes: c2adda27d202f ("video: backlight: Add of_find_backlight helper in backlight.c")
    Cc: <stable@vger.kernel.org> # 5.4+
    Cc: <stable@vger.kernel.org> # 4.19.x: ec665b756e6f7: backlight: gpio-backlight: Correct initial power state handling
    Signed-off-by: Marek Vasut <marex@denx.de>
    Acked-by: Noralf Trønnes <noralf@tronnes.org>
    Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org>
    Signed-off-by: Lee Jones <lee.jones@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c
index deb824bef6e2..e2caea41c627 100644
--- a/drivers/video/backlight/backlight.c
+++ b/drivers/video/backlight/backlight.c
@@ -610,12 +610,6 @@ struct backlight_device *of_find_backlight(struct device *dev)
 			of_node_put(np);
 			if (!bd)
 				return ERR_PTR(-EPROBE_DEFER);
-			/*
-			 * Note: gpio_backlight uses brightness as
-			 * power state during probe
-			 */
-			if (!bd->props.brightness)
-				bd->props.brightness = bd->props.max_brightness;
 		}
 	}
 

commit f928dae977fdf58d8e6c8fa470ffd4926bfb48ae
Author: Peter Ujfalusi <peter.ujfalusi@ti.com>
Date:   Wed Jul 31 11:40:18 2019 +0300

    backlight: gpio-backlight: Correct initial power state handling
    
    commit ec665b756e6f79c60078b00dbdabea3aa8a4b787 upstream.
    
    The default-on property - or the def_value via legacy pdata) should be
    handled as:
    if it is 1, the backlight must be enabled (kept enabled)
    if it is 0, the backlight must be disabled (kept disabled)
    
    This only works for the case when default-on is set. If it is not set then
    the brightness of the backlight is set to 0. Now if the backlight is
    enabled by external driver (graphics) the backlight will stay disabled since
    the brightness is configured as 0. The backlight will not turn on.
    
    In order to minimize screen flickering during device boot:
    
    The initial brightness should be set to 1.
    
    If booted in non DT mode or no phandle link to the backlight node:
    follow the def_value/default-on to select UNBLANK or POWERDOWN
    
    If in DT boot we have phandle link then leave the GPIO in a state which the
    bootloader left it and let the user of the backlight to configure it
    further.
    
    Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
    Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org>
    Signed-off-by: Lee Jones <lee.jones@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/video/backlight/gpio_backlight.c b/drivers/video/backlight/gpio_backlight.c
index e470da95d806..51c49f03ed83 100644
--- a/drivers/video/backlight/gpio_backlight.c
+++ b/drivers/video/backlight/gpio_backlight.c
@@ -62,13 +62,11 @@ static int gpio_backlight_probe_dt(struct platform_device *pdev,
 {
 	struct device *dev = &pdev->dev;
 	struct device_node *np = dev->of_node;
-	enum gpiod_flags flags;
 	int ret;
 
 	gbl->def_value = of_property_read_bool(np, "default-on");
-	flags = gbl->def_value ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW;
 
-	gbl->gpiod = devm_gpiod_get(dev, NULL, flags);
+	gbl->gpiod = devm_gpiod_get(dev, NULL, GPIOD_ASIS);
 	if (IS_ERR(gbl->gpiod)) {
 		ret = PTR_ERR(gbl->gpiod);
 
@@ -82,6 +80,22 @@ static int gpio_backlight_probe_dt(struct platform_device *pdev,
 	return 0;
 }
 
+static int gpio_backlight_initial_power_state(struct gpio_backlight *gbl)
+{
+	struct device_node *node = gbl->dev->of_node;
+
+	/* Not booted with device tree or no phandle link to the node */
+	if (!node || !node->phandle)
+		return gbl->def_value ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN;
+
+	/* if the enable GPIO is disabled, do not enable the backlight */
+	if (gpiod_get_value_cansleep(gbl->gpiod) == 0)
+		return FB_BLANK_POWERDOWN;
+
+	return FB_BLANK_UNBLANK;
+}
+
+
 static int gpio_backlight_probe(struct platform_device *pdev)
 {
 	struct gpio_backlight_platform_data *pdata =
@@ -142,7 +156,9 @@ static int gpio_backlight_probe(struct platform_device *pdev)
 		return PTR_ERR(bl);
 	}
 
-	bl->props.brightness = gbl->def_value;
+	bl->props.power = gpio_backlight_initial_power_state(gbl);
+	bl->props.brightness = 1;
+
 	backlight_update_status(bl);
 
 	platform_set_drvdata(pdev, bl);

commit d508b70eaa8d6d994c289b757c0ca0355d4dbe29
Author: Michal Hocko <mhocko@suse.com>
Date:   Fri Nov 5 13:38:06 2021 -0700

    mm, oom: do not trigger out_of_memory from the #PF
    
    commit 60e2793d440a3ec95abb5d6d4fc034a4b480472d upstream.
    
    Any allocation failure during the #PF path will return with VM_FAULT_OOM
    which in turn results in pagefault_out_of_memory.  This can happen for 2
    different reasons.  a) Memcg is out of memory and we rely on
    mem_cgroup_oom_synchronize to perform the memcg OOM handling or b)
    normal allocation fails.
    
    The latter is quite problematic because allocation paths already trigger
    out_of_memory and the page allocator tries really hard to not fail
    allocations.  Anyway, if the OOM killer has been already invoked there
    is no reason to invoke it again from the #PF path.  Especially when the
    OOM condition might be gone by that time and we have no way to find out
    other than allocate.
    
    Moreover if the allocation failed and the OOM killer hasn't been invoked
    then we are unlikely to do the right thing from the #PF context because
    we have already lost the allocation context and restictions and
    therefore might oom kill a task from a different NUMA domain.
    
    This all suggests that there is no legitimate reason to trigger
    out_of_memory from pagefault_out_of_memory so drop it.  Just to be sure
    that no #PF path returns with VM_FAULT_OOM without allocation print a
    warning that this is happening before we restart the #PF.
    
    [VvS: #PF allocation can hit into limit of cgroup v1 kmem controller.
    This is a local problem related to memcg, however, it causes unnecessary
    global OOM kills that are repeated over and over again and escalate into a
    real disaster.  This has been broken since kmem accounting has been
    introduced for cgroup v1 (3.8).  There was no kmem specific reclaim for
    the separate limit so the only way to handle kmem hard limit was to return
    with ENOMEM.  In upstream the problem will be fixed by removing the
    outdated kmem limit, however stable and LTS kernels cannot do it and are
    still affected.  This patch fixes the problem and should be backported
    into stable/LTS.]
    
    Link: https://lkml.kernel.org/r/f5fd8dd8-0ad4-c524-5f65-920b01972a42@virtuozzo.com
    Signed-off-by: Michal Hocko <mhocko@suse.com>
    Signed-off-by: Vasily Averin <vvs@virtuozzo.com>
    Acked-by: Michal Hocko <mhocko@suse.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Cc: Roman Gushchin <guro@fb.com>
    Cc: Shakeel Butt <shakeelb@google.com>
    Cc: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
    Cc: Uladzislau Rezki <urezki@gmail.com>
    Cc: Vladimir Davydov <vdavydov.dev@gmail.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/mm/oom_kill.c b/mm/oom_kill.c
index f54a3be3f30e..3f5a60a5a5e6 100644
--- a/mm/oom_kill.c
+++ b/mm/oom_kill.c
@@ -1135,19 +1135,15 @@ bool out_of_memory(struct oom_control *oc)
 }
 
 /*
- * The pagefault handler calls here because it is out of memory, so kill a
- * memory-hogging task. If oom_lock is held by somebody else, a parallel oom
- * killing is already in progress so do nothing.
+ * The pagefault handler calls here because some allocation has failed. We have
+ * to take care of the memcg OOM here because this is the only safe context without
+ * any locks held but let the oom killer triggered from the allocation context care
+ * about the global OOM.
  */
 void pagefault_out_of_memory(void)
 {
-	struct oom_control oc = {
-		.zonelist = NULL,
-		.nodemask = NULL,
-		.memcg = NULL,
-		.gfp_mask = 0,
-		.order = 0,
-	};
+	static DEFINE_RATELIMIT_STATE(pfoom_rs, DEFAULT_RATELIMIT_INTERVAL,
+				      DEFAULT_RATELIMIT_BURST);
 
 	if (mem_cgroup_oom_synchronize(true))
 		return;
@@ -1155,8 +1151,6 @@ void pagefault_out_of_memory(void)
 	if (fatal_signal_pending(current))
 		return;
 
-	if (!mutex_trylock(&oom_lock))
-		return;
-	out_of_memory(&oc);
-	mutex_unlock(&oom_lock);
+	if (__ratelimit(&pfoom_rs))
+		pr_warn("Huh VM_FAULT_OOM leaked out to the #PF handler. Retrying PF\n");
 }

commit 213739de40a2c173505b3f2ebbcda3dfbee3a690
Author: Vasily Averin <vvs@virtuozzo.com>
Date:   Fri Nov 5 13:38:02 2021 -0700

    mm, oom: pagefault_out_of_memory: don't force global OOM for dying tasks
    
    commit 0b28179a6138a5edd9d82ad2687c05b3773c387b upstream.
    
    Patch series "memcg: prohibit unconditional exceeding the limit of dying tasks", v3.
    
    Memory cgroup charging allows killed or exiting tasks to exceed the hard
    limit.  It can be misused and allowed to trigger global OOM from inside
    a memcg-limited container.  On the other hand if memcg fails allocation,
    called from inside #PF handler it triggers global OOM from inside
    pagefault_out_of_memory().
    
    To prevent these problems this patchset:
     (a) removes execution of out_of_memory() from
         pagefault_out_of_memory(), becasue nobody can explain why it is
         necessary.
     (b) allow memcg to fail allocation of dying/killed tasks.
    
    This patch (of 3):
    
    Any allocation failure during the #PF path will return with VM_FAULT_OOM
    which in turn results in pagefault_out_of_memory which in turn executes
    out_out_memory() and can kill a random task.
    
    An allocation might fail when the current task is the oom victim and
    there are no memory reserves left.  The OOM killer is already handled at
    the page allocator level for the global OOM and at the charging level
    for the memcg one.  Both have much more information about the scope of
    allocation/charge request.  This means that either the OOM killer has
    been invoked properly and didn't lead to the allocation success or it
    has been skipped because it couldn't have been invoked.  In both cases
    triggering it from here is pointless and even harmful.
    
    It makes much more sense to let the killed task die rather than to wake
    up an eternally hungry oom-killer and send him to choose a fatter victim
    for breakfast.
    
    Link: https://lkml.kernel.org/r/0828a149-786e-7c06-b70a-52d086818ea3@virtuozzo.com
    Signed-off-by: Vasily Averin <vvs@virtuozzo.com>
    Suggested-by: Michal Hocko <mhocko@suse.com>
    Acked-by: Michal Hocko <mhocko@suse.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Cc: Roman Gushchin <guro@fb.com>
    Cc: Shakeel Butt <shakeelb@google.com>
    Cc: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
    Cc: Uladzislau Rezki <urezki@gmail.com>
    Cc: Vladimir Davydov <vdavydov.dev@gmail.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/mm/oom_kill.c b/mm/oom_kill.c
index 928b3b5e24e6..f54a3be3f30e 100644
--- a/mm/oom_kill.c
+++ b/mm/oom_kill.c
@@ -1152,6 +1152,9 @@ void pagefault_out_of_memory(void)
 	if (mem_cgroup_oom_synchronize(true))
 		return;
 
+	if (fatal_signal_pending(current))
+		return;
+
 	if (!mutex_trylock(&oom_lock))
 		return;
 	out_of_memory(&oc);

commit aa634dbbee4858adc4a8783a77a5a9c94ee949a8
Author: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Date:   Mon Nov 15 16:35:32 2021 +0530

    powerpc/bpf: Emit stf barrier instruction sequences for BPF_NOSPEC
    
    upstream commit b7540d62509453263604a155bf2d5f0ed450cba2
    
    Emit similar instruction sequences to commit a048a07d7f4535
    ("powerpc/64s: Add support for a store forwarding barrier at kernel
    entry/exit") when encountering BPF_NOSPEC.
    
    Mitigations are enabled depending on what the firmware advertises. In
    particular, we do not gate these mitigations based on current settings,
    just like in x86. Due to this, we don't need to take any action if
    mitigations are enabled or disabled at runtime.
    
    Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/956570cbc191cd41f8274bed48ee757a86dac62a.1633464148.git.naveen.n.rao@linux.vnet.ibm.com
    [adjust macros to account for commits 0654186510a40e, 3a181237916310 and ef909ba954145e.
    adjust security feature checks to account for commit 84ed26fd00c514]
    Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/powerpc/net/bpf_jit64.h b/arch/powerpc/net/bpf_jit64.h
index 47f441f351a6..61ed9a4b283c 100644
--- a/arch/powerpc/net/bpf_jit64.h
+++ b/arch/powerpc/net/bpf_jit64.h
@@ -20,18 +20,18 @@
  * with our redzone usage.
  *
  *		[	prev sp		] <-------------
- *		[   nv gpr save area	] 6*8		|
+ *		[   nv gpr save area	] 5*8		|
  *		[    tail_call_cnt	] 8		|
- *		[    local_tmp_var	] 8		|
+ *		[    local_tmp_var	] 16		|
  * fp (r31) -->	[   ebpf stack space	] upto 512	|
  *		[     frame header	] 32/112	|
  * sp (r1) --->	[    stack pointer	] --------------
  */
 
 /* for gpr non volatile registers BPG_REG_6 to 10 */
-#define BPF_PPC_STACK_SAVE	(6*8)
+#define BPF_PPC_STACK_SAVE	(5*8)
 /* for bpf JIT code internal usage */
-#define BPF_PPC_STACK_LOCALS	16
+#define BPF_PPC_STACK_LOCALS	24
 /* stack frame excluding BPF stack, ensure this is quadword aligned */
 #define BPF_PPC_STACKFRAME	(STACK_FRAME_MIN_SIZE + \
 				 BPF_PPC_STACK_LOCALS + BPF_PPC_STACK_SAVE)
diff --git a/arch/powerpc/net/bpf_jit_comp64.c b/arch/powerpc/net/bpf_jit_comp64.c
index 9cec2744f411..7b1fdcd4d96b 100644
--- a/arch/powerpc/net/bpf_jit_comp64.c
+++ b/arch/powerpc/net/bpf_jit_comp64.c
@@ -19,6 +19,7 @@
 #include <linux/if_vlan.h>
 #include <asm/kprobes.h>
 #include <linux/bpf.h>
+#include <asm/security_features.h>
 
 #include "bpf_jit64.h"
 
@@ -60,9 +61,9 @@ static inline bool bpf_has_stack_frame(struct codegen_context *ctx)
  *		[	prev sp		] <-------------
  *		[	  ...       	] 		|
  * sp (r1) --->	[    stack pointer	] --------------
- *		[   nv gpr save area	] 6*8
+ *		[   nv gpr save area	] 5*8
  *		[    tail_call_cnt	] 8
- *		[    local_tmp_var	] 8
+ *		[    local_tmp_var	] 16
  *		[   unused red zone	] 208 bytes protected
  */
 static int bpf_jit_stack_local(struct codegen_context *ctx)
@@ -70,12 +71,12 @@ static int bpf_jit_stack_local(struct codegen_context *ctx)
 	if (bpf_has_stack_frame(ctx))
 		return STACK_FRAME_MIN_SIZE + ctx->stack_size;
 	else
-		return -(BPF_PPC_STACK_SAVE + 16);
+		return -(BPF_PPC_STACK_SAVE + 24);
 }
 
 static int bpf_jit_stack_tailcallcnt(struct codegen_context *ctx)
 {
-	return bpf_jit_stack_local(ctx) + 8;
+	return bpf_jit_stack_local(ctx) + 16;
 }
 
 static int bpf_jit_stack_offsetof(struct codegen_context *ctx, int reg)
@@ -268,11 +269,34 @@ static int bpf_jit_emit_tail_call(u32 *image, struct codegen_context *ctx, u32 o
 	return 0;
 }
 
+/*
+ * We spill into the redzone always, even if the bpf program has its own stackframe.
+ * Offsets hardcoded based on BPF_PPC_STACK_SAVE -- see bpf_jit_stack_local()
+ */
+void bpf_stf_barrier(void);
+
+asm (
+"		.global bpf_stf_barrier		;"
+"	bpf_stf_barrier:			;"
+"		std	21,-64(1)		;"
+"		std	22,-56(1)		;"
+"		sync				;"
+"		ld	21,-64(1)		;"
+"		ld	22,-56(1)		;"
+"		ori	31,31,0			;"
+"		.rept 14			;"
+"		b	1f			;"
+"	1:					;"
+"		.endr				;"
+"		blr				;"
+);
+
 /* Assemble the body code between the prologue & epilogue */
 static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
 			      struct codegen_context *ctx,
 			      u32 *addrs, bool extra_pass)
 {
+	enum stf_barrier_type stf_barrier = stf_barrier_type_get();
 	const struct bpf_insn *insn = fp->insnsi;
 	int flen = fp->len;
 	int i, ret;
@@ -615,6 +639,30 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
 		 * BPF_ST NOSPEC (speculation barrier)
 		 */
 		case BPF_ST | BPF_NOSPEC:
+			if (!security_ftr_enabled(SEC_FTR_FAVOUR_SECURITY) ||
+					(!security_ftr_enabled(SEC_FTR_L1D_FLUSH_PR) &&
+					(!security_ftr_enabled(SEC_FTR_L1D_FLUSH_HV) || !cpu_has_feature(CPU_FTR_HVMODE))))
+				break;
+
+			switch (stf_barrier) {
+			case STF_BARRIER_EIEIO:
+				EMIT(0x7c0006ac | 0x02000000);
+				break;
+			case STF_BARRIER_SYNC_ORI:
+				EMIT(PPC_INST_SYNC);
+				PPC_LD(b2p[TMP_REG_1], 13, 0);
+				PPC_ORI(31, 31, 0);
+				break;
+			case STF_BARRIER_FALLBACK:
+				EMIT(PPC_INST_MFLR | ___PPC_RT(b2p[TMP_REG_1]));
+				PPC_LI64(12, dereference_kernel_function_descriptor(bpf_stf_barrier));
+				PPC_MTCTR(12);
+				EMIT(PPC_INST_BCTR | 0x1);
+				PPC_MTLR(b2p[TMP_REG_1]);
+				break;
+			case STF_BARRIER_NONE:
+				break;
+			}
 			break;
 
 		/*

commit 600ab456aaf6292580e18f68d6ed23d5d1e48943
Author: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Date:   Mon Nov 15 16:35:31 2021 +0530

    powerpc/security: Add a helper to query stf_barrier type
    
    upstream commit 030905920f32e91a52794937f67434ac0b3ea41a
    
    Add a helper to return the stf_barrier type for the current processor.
    
    Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/3bd5d7f96ea1547991ac2ce3137dc2b220bae285.1633464148.git.naveen.n.rao@linux.vnet.ibm.com
    Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/powerpc/include/asm/security_features.h b/arch/powerpc/include/asm/security_features.h
index 3b45a64e491e..a673416da388 100644
--- a/arch/powerpc/include/asm/security_features.h
+++ b/arch/powerpc/include/asm/security_features.h
@@ -39,6 +39,11 @@ static inline bool security_ftr_enabled(unsigned long feature)
 	return !!(powerpc_security_features & feature);
 }
 
+#ifdef CONFIG_PPC_BOOK3S_64
+enum stf_barrier_type stf_barrier_type_get(void);
+#else
+static inline enum stf_barrier_type stf_barrier_type_get(void) { return STF_BARRIER_NONE; }
+#endif
 
 // Features indicating support for Spectre/Meltdown mitigations
 
diff --git a/arch/powerpc/kernel/security.c b/arch/powerpc/kernel/security.c
index 6a3dde9587cc..48985a1fd34d 100644
--- a/arch/powerpc/kernel/security.c
+++ b/arch/powerpc/kernel/security.c
@@ -248,6 +248,11 @@ static int __init handle_no_stf_barrier(char *p)
 
 early_param("no_stf_barrier", handle_no_stf_barrier);
 
+enum stf_barrier_type stf_barrier_type_get(void)
+{
+	return stf_enabled_flush_types;
+}
+
 /* This is the generic flag used by other architectures */
 static int __init handle_ssbd(char *p)
 {

commit 7eea943306f63b54f406335a01b06d34bd10a305
Author: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Date:   Mon Nov 15 16:35:30 2021 +0530

    powerpc/bpf: Fix BPF_SUB when imm == 0x80000000
    
    upstream commit 5855c4c1f415ca3ba1046e77c0b3d3dfc96c9025
    
    We aren't handling subtraction involving an immediate value of
    0x80000000 properly. Fix the same.
    
    Fixes: 156d0e290e969c ("powerpc/ebpf/jit: Implement JIT compiler for extended BPF")
    Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu>
    [mpe: Fold in fix from Naveen to use imm <= 32768]
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/fc4b1276eb10761fd7ce0814c8dd089da2815251.1633464148.git.naveen.n.rao@linux.vnet.ibm.com
    [adjust macros to account for commits 0654186510a40e and 3a181237916310]
    Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/powerpc/net/bpf_jit_comp64.c b/arch/powerpc/net/bpf_jit_comp64.c
index b0abf59cc6a2..9cec2744f411 100644
--- a/arch/powerpc/net/bpf_jit_comp64.c
+++ b/arch/powerpc/net/bpf_jit_comp64.c
@@ -326,18 +326,25 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
 			PPC_SUB(dst_reg, dst_reg, src_reg);
 			goto bpf_alu32_trunc;
 		case BPF_ALU | BPF_ADD | BPF_K: /* (u32) dst += (u32) imm */
-		case BPF_ALU | BPF_SUB | BPF_K: /* (u32) dst -= (u32) imm */
 		case BPF_ALU64 | BPF_ADD | BPF_K: /* dst += imm */
+			if (!imm) {
+				goto bpf_alu32_trunc;
+			} else if (imm >= -32768 && imm < 32768) {
+				PPC_ADDI(dst_reg, dst_reg, IMM_L(imm));
+			} else {
+				PPC_LI32(b2p[TMP_REG_1], imm);
+				PPC_ADD(dst_reg, dst_reg, b2p[TMP_REG_1]);
+			}
+			goto bpf_alu32_trunc;
+		case BPF_ALU | BPF_SUB | BPF_K: /* (u32) dst -= (u32) imm */
 		case BPF_ALU64 | BPF_SUB | BPF_K: /* dst -= imm */
-			if (BPF_OP(code) == BPF_SUB)
-				imm = -imm;
-			if (imm) {
-				if (imm >= -32768 && imm < 32768)
-					PPC_ADDI(dst_reg, dst_reg, IMM_L(imm));
-				else {
-					PPC_LI32(b2p[TMP_REG_1], imm);
-					PPC_ADD(dst_reg, dst_reg, b2p[TMP_REG_1]);
-				}
+			if (!imm) {
+				goto bpf_alu32_trunc;
+			} else if (imm > -32768 && imm <= 32768) {
+				PPC_ADDI(dst_reg, dst_reg, IMM_L(-imm));
+			} else {
+				PPC_LI32(b2p[TMP_REG_1], imm);
+				PPC_SUB(dst_reg, dst_reg, b2p[TMP_REG_1]);
 			}
 			goto bpf_alu32_trunc;
 		case BPF_ALU | BPF_MUL | BPF_X: /* (u32) dst *= (u32) src */

commit 1c16fd57a9ca2af3b37608011c18ac2ba547d83c
Author: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Date:   Mon Nov 15 16:35:29 2021 +0530

    powerpc/bpf: Validate branch ranges
    
    upstream commit 3832ba4e283d7052b783dab8311df7e3590fed93
    
    Add checks to ensure that we never emit branch instructions with
    truncated branch offsets.
    
    Suggested-by: Michael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Tested-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
    Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu>
    Acked-by: Song Liu <songliubraving@fb.com>
    Acked-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/71d33a6b7603ec1013c9734dd8bdd4ff5e929142.1633464148.git.naveen.n.rao@linux.vnet.ibm.com
    [include header, drop ppc32 changes]
    Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/powerpc/net/bpf_jit.h b/arch/powerpc/net/bpf_jit.h
index d2bf99183aab..5a0af7d8d224 100644
--- a/arch/powerpc/net/bpf_jit.h
+++ b/arch/powerpc/net/bpf_jit.h
@@ -15,6 +15,7 @@
 #ifndef __ASSEMBLY__
 
 #include <asm/types.h>
+#include <asm/code-patching.h>
 
 #ifdef PPC64_ELF_ABI_v1
 #define FUNCTION_DESCR_SIZE	24
@@ -176,13 +177,26 @@
 #define PPC_NEG(d, a)		EMIT(PPC_INST_NEG | ___PPC_RT(d) | ___PPC_RA(a))
 
 /* Long jump; (unconditional 'branch') */
-#define PPC_JMP(dest)		EMIT(PPC_INST_BRANCH |			      \
-				     (((dest) - (ctx->idx * 4)) & 0x03fffffc))
+#define PPC_JMP(dest)							      \
+	do {								      \
+		long offset = (long)(dest) - (ctx->idx * 4);		      \
+		if (!is_offset_in_branch_range(offset)) {		      \
+			pr_err_ratelimited("Branch offset 0x%lx (@%u) out of range\n", offset, ctx->idx);			\
+			return -ERANGE;					      \
+		}							      \
+		EMIT(PPC_INST_BRANCH | (offset & 0x03fffffc));		      \
+	} while (0)
 /* "cond" here covers BO:BI fields. */
-#define PPC_BCC_SHORT(cond, dest)	EMIT(PPC_INST_BRANCH_COND |	      \
-					     (((cond) & 0x3ff) << 16) |	      \
-					     (((dest) - (ctx->idx * 4)) &     \
-					      0xfffc))
+#define PPC_BCC_SHORT(cond, dest)					      \
+	do {								      \
+		long offset = (long)(dest) - (ctx->idx * 4);		      \
+		if (!is_offset_in_cond_branch_range(offset)) {		      \
+			pr_err_ratelimited("Conditional branch offset 0x%lx (@%u) out of range\n", offset, ctx->idx);		\
+			return -ERANGE;					      \
+		}							      \
+		EMIT(PPC_INST_BRANCH_COND | (((cond) & 0x3ff) << 16) | (offset & 0xfffc));					\
+	} while (0)
+
 /* Sign-extended 32-bit immediate load */
 #define PPC_LI32(d, i)		do {					      \
 		if ((int)(uintptr_t)(i) >= -32768 &&			      \
diff --git a/arch/powerpc/net/bpf_jit_comp64.c b/arch/powerpc/net/bpf_jit_comp64.c
index 87213a1bb14c..b0abf59cc6a2 100644
--- a/arch/powerpc/net/bpf_jit_comp64.c
+++ b/arch/powerpc/net/bpf_jit_comp64.c
@@ -202,7 +202,7 @@ static void bpf_jit_emit_func_call(u32 *image, struct codegen_context *ctx, u64
 	PPC_BLRL();
 }
 
-static void bpf_jit_emit_tail_call(u32 *image, struct codegen_context *ctx, u32 out)
+static int bpf_jit_emit_tail_call(u32 *image, struct codegen_context *ctx, u32 out)
 {
 	/*
 	 * By now, the eBPF program has already setup parameters in r3, r4 and r5
@@ -263,7 +263,9 @@ static void bpf_jit_emit_tail_call(u32 *image, struct codegen_context *ctx, u32
 	bpf_jit_emit_common_epilogue(image, ctx);
 
 	PPC_BCTR();
+
 	/* out: */
+	return 0;
 }
 
 /* Assemble the body code between the prologue & epilogue */
@@ -273,7 +275,7 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
 {
 	const struct bpf_insn *insn = fp->insnsi;
 	int flen = fp->len;
-	int i;
+	int i, ret;
 
 	/* Start of epilogue code - will only be valid 2nd pass onwards */
 	u32 exit_addr = addrs[flen];
@@ -863,7 +865,9 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
 		 */
 		case BPF_JMP | BPF_TAIL_CALL:
 			ctx->seen |= SEEN_TAILCALL;
-			bpf_jit_emit_tail_call(image, ctx, addrs[i + 1]);
+			ret = bpf_jit_emit_tail_call(image, ctx, addrs[i + 1]);
+			if (ret < 0)
+				return ret;
 			break;
 
 		default:

commit 807e3f7ec0d845e039269452ef3ee9f8be654cbd
Author: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Date:   Mon Nov 15 16:35:28 2021 +0530

    powerpc/lib: Add helper to check if offset is within conditional branch range
    
    upstream commit 4549c3ea3160fa8b3f37dfe2f957657bb265eda9
    
    Add a helper to check if a given offset is within the branch range for a
    powerpc conditional branch instruction, and update some sites to use the
    new helper.
    
    Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu>
    Acked-by: Song Liu <songliubraving@fb.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/442b69a34ced32ca346a0d9a855f3f6cfdbbbd41.1633464148.git.naveen.n.rao@linux.vnet.ibm.com
    Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/powerpc/include/asm/code-patching.h b/arch/powerpc/include/asm/code-patching.h
index 4cd6e19ee90f..537d94fabbd0 100644
--- a/arch/powerpc/include/asm/code-patching.h
+++ b/arch/powerpc/include/asm/code-patching.h
@@ -26,6 +26,7 @@
 #define BRANCH_ABSOLUTE	0x2
 
 bool is_offset_in_branch_range(long offset);
+bool is_offset_in_cond_branch_range(long offset);
 unsigned int create_branch(const unsigned int *addr,
 			   unsigned long target, int flags);
 unsigned int create_cond_branch(const unsigned int *addr,
diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/code-patching.c
index 5ffee298745f..bb245dbf6c57 100644
--- a/arch/powerpc/lib/code-patching.c
+++ b/arch/powerpc/lib/code-patching.c
@@ -243,6 +243,11 @@ bool is_offset_in_branch_range(long offset)
 	return (offset >= -0x2000000 && offset <= 0x1fffffc && !(offset & 0x3));
 }
 
+bool is_offset_in_cond_branch_range(long offset)
+{
+	return offset >= -0x8000 && offset <= 0x7fff && !(offset & 0x3);
+}
+
 /*
  * Helper to check if a given instruction is a conditional branch
  * Derived from the conditional checks in analyse_instr()
@@ -296,7 +301,7 @@ unsigned int create_cond_branch(const unsigned int *addr,
 		offset = offset - (unsigned long)addr;
 
 	/* Check we can represent the target in the instruction format */
-	if (offset < -0x8000 || offset > 0x7FFF || offset & 0x3)
+	if (!is_offset_in_cond_branch_range(offset))
 		return 0;
 
 	/* Mask out the flags and target, so they don't step on each other. */
diff --git a/arch/powerpc/net/bpf_jit.h b/arch/powerpc/net/bpf_jit.h
index e5c1d30ee968..d2bf99183aab 100644
--- a/arch/powerpc/net/bpf_jit.h
+++ b/arch/powerpc/net/bpf_jit.h
@@ -221,11 +221,6 @@
 #define PPC_FUNC_ADDR(d,i) do { PPC_LI32(d, i); } while(0)
 #endif
 
-static inline bool is_nearbranch(int offset)
-{
-	return (offset < 32768) && (offset >= -32768);
-}
-
 /*
  * The fly in the ointment of code size changing from pass to pass is
  * avoided by padding the short branch case with a NOP.	 If code size differs
@@ -234,7 +229,7 @@ static inline bool is_nearbranch(int offset)
  * state.
  */
 #define PPC_BCC(cond, dest)	do {					      \
-		if (is_nearbranch((dest) - (ctx->idx * 4))) {		      \
+		if (is_offset_in_cond_branch_range((long)(dest) - (ctx->idx * 4))) {	\
 			PPC_BCC_SHORT(cond, dest);			      \
 			PPC_NOP();					      \
 		} else {						      \

commit 272717a19a1325b8b446bb0bdb74a53a685bf626
Author: Dominique Martinet <asmadeus@codewreck.org>
Date:   Tue Nov 2 19:47:47 2021 +0900

    9p/net: fix missing error check in p9_check_errors
    
    commit 27eb4c3144f7a5ebef3c9a261d80cb3e1fa784dc upstream.
    
    Link: https://lkml.kernel.org/r/99338965-d36c-886e-cd0e-1d8fff2b4746@gmail.com
    Reported-by: syzbot+06472778c97ed94af66d@syzkaller.appspotmail.com
    Cc: stable@vger.kernel.org
    Signed-off-by: Dominique Martinet <asmadeus@codewreck.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/9p/client.c b/net/9p/client.c
index d62f83f93d7b..bb0a43b8a6b0 100644
--- a/net/9p/client.c
+++ b/net/9p/client.c
@@ -553,6 +553,8 @@ static int p9_check_errors(struct p9_client *c, struct p9_req_t *req)
 		kfree(ename);
 	} else {
 		err = p9pdu_readf(&req->rc, c->proto_version, "d", &ecode);
+		if (err)
+			goto out_err;
 		err = -ecode;
 
 		p9_debug(P9_DEBUG_9P, "<<< RLERROR (%d)\n", -ecode);

commit 83def4345440d49dfa90ebd51ba3e87f4dd608cd
Author: Jaegeuk Kim <jaegeuk@kernel.org>
Date:   Tue Sep 7 10:24:21 2021 -0700

    f2fs: should use GFP_NOFS for directory inodes
    
    commit 92d602bc7177325e7453189a22e0c8764ed3453e upstream.
    
    We use inline_dentry which requires to allocate dentry page when adding a link.
    If we allow to reclaim memory from filesystem, we do down_read(&sbi->cp_rwsem)
    twice by f2fs_lock_op(). I think this should be okay, but how about stopping
    the lockdep complaint [1]?
    
    f2fs_create()
     - f2fs_lock_op()
     - f2fs_do_add_link()
      - __f2fs_find_entry
       - f2fs_get_read_data_page()
       -> kswapd
        - shrink_node
         - f2fs_evict_inode
          - f2fs_lock_op()
    
    [1]
    
    fs_reclaim
    ){+.+.}-{0:0}
    :
    kswapd0:        lock_acquire+0x114/0x394
    kswapd0:        __fs_reclaim_acquire+0x40/0x50
    kswapd0:        prepare_alloc_pages+0x94/0x1ec
    kswapd0:        __alloc_pages_nodemask+0x78/0x1b0
    kswapd0:        pagecache_get_page+0x2e0/0x57c
    kswapd0:        f2fs_get_read_data_page+0xc0/0x394
    kswapd0:        f2fs_find_data_page+0xa4/0x23c
    kswapd0:        find_in_level+0x1a8/0x36c
    kswapd0:        __f2fs_find_entry+0x70/0x100
    kswapd0:        f2fs_do_add_link+0x84/0x1ec
    kswapd0:        f2fs_mkdir+0xe4/0x1e4
    kswapd0:        vfs_mkdir+0x110/0x1c0
    kswapd0:        do_mkdirat+0xa4/0x160
    kswapd0:        __arm64_sys_mkdirat+0x24/0x34
    kswapd0:        el0_svc_common.llvm.17258447499513131576+0xc4/0x1e8
    kswapd0:        do_el0_svc+0x28/0xa0
    kswapd0:        el0_svc+0x24/0x38
    kswapd0:        el0_sync_handler+0x88/0xec
    kswapd0:        el0_sync+0x1c0/0x200
    kswapd0:
    -> #1
    (
    &sbi->cp_rwsem
    ){++++}-{3:3}
    :
    kswapd0:        lock_acquire+0x114/0x394
    kswapd0:        down_read+0x7c/0x98
    kswapd0:        f2fs_do_truncate_blocks+0x78/0x3dc
    kswapd0:        f2fs_truncate+0xc8/0x128
    kswapd0:        f2fs_evict_inode+0x2b8/0x8b8
    kswapd0:        evict+0xd4/0x2f8
    kswapd0:        iput+0x1c0/0x258
    kswapd0:        do_unlinkat+0x170/0x2a0
    kswapd0:        __arm64_sys_unlinkat+0x4c/0x68
    kswapd0:        el0_svc_common.llvm.17258447499513131576+0xc4/0x1e8
    kswapd0:        do_el0_svc+0x28/0xa0
    kswapd0:        el0_svc+0x24/0x38
    kswapd0:        el0_sync_handler+0x88/0xec
    kswapd0:        el0_sync+0x1c0/0x200
    
    Cc: stable@vger.kernel.org
    Fixes: bdbc90fa55af ("f2fs: don't put dentry page in pagecache into highmem")
    Reviewed-by: Chao Yu <chao@kernel.org>
    Reviewed-by: Stanley Chu <stanley.chu@mediatek.com>
    Reviewed-by: Light Hsieh <light.hsieh@mediatek.com>
    Tested-by: Light Hsieh <light.hsieh@mediatek.com>
    Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c
index a01be7d8db86..15ff5d9b8c05 100644
--- a/fs/f2fs/inode.c
+++ b/fs/f2fs/inode.c
@@ -454,7 +454,7 @@ struct inode *f2fs_iget(struct super_block *sb, unsigned long ino)
 		inode->i_op = &f2fs_dir_inode_operations;
 		inode->i_fop = &f2fs_dir_operations;
 		inode->i_mapping->a_ops = &f2fs_dblock_aops;
-		inode_nohighmem(inode);
+		mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS);
 	} else if (S_ISLNK(inode->i_mode)) {
 		if (f2fs_encrypted_inode(inode))
 			inode->i_op = &f2fs_encrypted_symlink_inode_operations;
diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c
index edc80855974a..9e4c38481830 100644
--- a/fs/f2fs/namei.c
+++ b/fs/f2fs/namei.c
@@ -656,7 +656,7 @@ static int f2fs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
 	inode->i_op = &f2fs_dir_inode_operations;
 	inode->i_fop = &f2fs_dir_operations;
 	inode->i_mapping->a_ops = &f2fs_dblock_aops;
-	inode_nohighmem(inode);
+	mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS);
 
 	set_inode_flag(inode, FI_INC_LINK);
 	f2fs_lock_op(sbi);

commit 26c68b8da3b159e57c2dda0dae1ecf92054837df
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Sat Nov 6 19:42:29 2021 +0100

    ARM: 9156/1: drop cc-option fallbacks for architecture selection
    
    commit 418ace9992a7647c446ed3186df40cf165b67298 upstream.
    
    Naresh and Antonio ran into a build failure with latest Debian
    armhf compilers, with lots of output like
    
     tmp/ccY3nOAs.s:2215: Error: selected processor does not support `cpsid i' in ARM mode
    
    As it turns out, $(cc-option) fails early here when the FPU is not
    selected before CPU architecture is selected, as the compiler
    option check runs before enabling -msoft-float, which causes
    a problem when testing a target architecture level without an FPU:
    
    cc1: error: '-mfloat-abi=hard': selected architecture lacks an FPU
    
    Passing e.g. -march=armv6k+fp in place of -march=armv6k would avoid this
    issue, but the fallback logic is already broken because all supported
    compilers (gcc-5 and higher) are much more recent than these options,
    and building with -march=armv5t as a fallback no longer works.
    
    The best way forward that I see is to just remove all the checks, which
    also has the nice side-effect of slightly improving the startup time for
    'make'.
    
    The -mtune=marvell-f option was apparently never supported by any mainline
    compiler, and the custom Codesourcery gcc build that did support is
    now too old to build kernels, so just use -mtune=xscale unconditionally
    for those.
    
    This should be safe to apply on all stable kernels, and will be required
    in order to keep building them with gcc-11 and higher.
    
    Link: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=996419
    
    Reported-by: Antonio Terceiro <antonio.terceiro@linaro.org>
    Reported-by: Naresh Kamboju <naresh.kamboju@linaro.org>
    Reported-by: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
    Tested-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Tested-by: Klaus Kudielka <klaus.kudielka@gmail.com>
    Cc: Matthias Klose <doko@debian.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 658896a7d30d..ae1c85a81b1f 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -63,15 +63,15 @@ KBUILD_CFLAGS	+= $(call cc-option,-fno-ipa-sra)
 # Note that GCC does not numerically define an architecture version
 # macro, but instead defines a whole series of macros which makes
 # testing for a specific architecture or later rather impossible.
-arch-$(CONFIG_CPU_32v7M)	=-D__LINUX_ARM_ARCH__=7 -march=armv7-m -Wa,-march=armv7-m
-arch-$(CONFIG_CPU_32v7)		=-D__LINUX_ARM_ARCH__=7 $(call cc-option,-march=armv7-a,-march=armv5t -Wa$(comma)-march=armv7-a)
-arch-$(CONFIG_CPU_32v6)		=-D__LINUX_ARM_ARCH__=6 $(call cc-option,-march=armv6,-march=armv5t -Wa$(comma)-march=armv6)
+arch-$(CONFIG_CPU_32v7M)	=-D__LINUX_ARM_ARCH__=7 -march=armv7-m
+arch-$(CONFIG_CPU_32v7)		=-D__LINUX_ARM_ARCH__=7 -march=armv7-a
+arch-$(CONFIG_CPU_32v6)		=-D__LINUX_ARM_ARCH__=6 -march=armv6
 # Only override the compiler option if ARMv6. The ARMv6K extensions are
 # always available in ARMv7
 ifeq ($(CONFIG_CPU_32v6),y)
-arch-$(CONFIG_CPU_32v6K)	=-D__LINUX_ARM_ARCH__=6 $(call cc-option,-march=armv6k,-march=armv5t -Wa$(comma)-march=armv6k)
+arch-$(CONFIG_CPU_32v6K)	=-D__LINUX_ARM_ARCH__=6 -march=armv6k
 endif
-arch-$(CONFIG_CPU_32v5)		=-D__LINUX_ARM_ARCH__=5 $(call cc-option,-march=armv5te,-march=armv4t)
+arch-$(CONFIG_CPU_32v5)		=-D__LINUX_ARM_ARCH__=5 -march=armv5te
 arch-$(CONFIG_CPU_32v4T)	=-D__LINUX_ARM_ARCH__=4 -march=armv4t
 arch-$(CONFIG_CPU_32v4)		=-D__LINUX_ARM_ARCH__=4 -march=armv4
 arch-$(CONFIG_CPU_32v3)		=-D__LINUX_ARM_ARCH__=3 -march=armv3
@@ -85,7 +85,7 @@ tune-$(CONFIG_CPU_ARM720T)	=-mtune=arm7tdmi
 tune-$(CONFIG_CPU_ARM740T)	=-mtune=arm7tdmi
 tune-$(CONFIG_CPU_ARM9TDMI)	=-mtune=arm9tdmi
 tune-$(CONFIG_CPU_ARM940T)	=-mtune=arm9tdmi
-tune-$(CONFIG_CPU_ARM946E)	=$(call cc-option,-mtune=arm9e,-mtune=arm9tdmi)
+tune-$(CONFIG_CPU_ARM946E)	=-mtune=arm9e
 tune-$(CONFIG_CPU_ARM920T)	=-mtune=arm9tdmi
 tune-$(CONFIG_CPU_ARM922T)	=-mtune=arm9tdmi
 tune-$(CONFIG_CPU_ARM925T)	=-mtune=arm9tdmi
@@ -93,11 +93,11 @@ tune-$(CONFIG_CPU_ARM926T)	=-mtune=arm9tdmi
 tune-$(CONFIG_CPU_FA526)	=-mtune=arm9tdmi
 tune-$(CONFIG_CPU_SA110)	=-mtune=strongarm110
 tune-$(CONFIG_CPU_SA1100)	=-mtune=strongarm1100
-tune-$(CONFIG_CPU_XSCALE)	=$(call cc-option,-mtune=xscale,-mtune=strongarm110) -Wa,-mcpu=xscale
-tune-$(CONFIG_CPU_XSC3)		=$(call cc-option,-mtune=xscale,-mtune=strongarm110) -Wa,-mcpu=xscale
-tune-$(CONFIG_CPU_FEROCEON)	=$(call cc-option,-mtune=marvell-f,-mtune=xscale)
-tune-$(CONFIG_CPU_V6)		=$(call cc-option,-mtune=arm1136j-s,-mtune=strongarm)
-tune-$(CONFIG_CPU_V6K)		=$(call cc-option,-mtune=arm1136j-s,-mtune=strongarm)
+tune-$(CONFIG_CPU_XSCALE)	=-mtune=xscale
+tune-$(CONFIG_CPU_XSC3)		=-mtune=xscale
+tune-$(CONFIG_CPU_FEROCEON)	=-mtune=xscale
+tune-$(CONFIG_CPU_V6)		=-mtune=arm1136j-s
+tune-$(CONFIG_CPU_V6K)		=-mtune=arm1136j-s
 
 # Evaluate tune cc-option calls now
 tune-y := $(tune-y)

commit 562a43597fade52c05601acad805127dd0ad0b83
Author: Micha? Miros?aw <mirq-linux@rere.qmqm.pl>
Date:   Thu Nov 4 17:28:28 2021 +0100

    ARM: 9155/1: fix early early_iounmap()
    
    commit 0d08e7bf0d0d1a29aff7b16ef516f7415eb1aa05 upstream.
    
    Currently __set_fixmap() bails out with a warning when called in early boot
    from early_iounmap(). Fix it, and while at it, make the comment a bit easier
    to understand.
    
    Cc: <stable@vger.kernel.org>
    Fixes: b089c31c519c ("ARM: 8667/3: Fix memory attribute inconsistencies when using fixmap")
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Micha? Miros?aw <mirq-linux@rere.qmqm.pl>
    Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
index d8cbe772f690..4c417f3cbfd5 100644
--- a/arch/arm/mm/mmu.c
+++ b/arch/arm/mm/mmu.c
@@ -416,9 +416,9 @@ void __set_fixmap(enum fixed_addresses idx, phys_addr_t phys, pgprot_t prot)
 		     FIXADDR_END);
 	BUG_ON(idx >= __end_of_fixed_addresses);
 
-	/* we only support device mappings until pgprot_kernel has been set */
+	/* We support only device mappings before pgprot_kernel is set. */
 	if (WARN_ON(pgprot_val(prot) != pgprot_val(FIXMAP_PAGE_IO) &&
-		    pgprot_val(pgprot_kernel) == 0))
+		    pgprot_val(prot) && pgprot_val(pgprot_kernel) == 0))
 		return;
 
 	if (pgprot_val(prot))

commit cd558849a9e0335968f906d82a7dc58bea56b600
Author: Johan Hovold <johan@kernel.org>
Date:   Thu Oct 21 10:34:47 2021 +0200

    USB: chipidea: fix interrupt deadlock
    
    commit 9aaa81c3366e8393a62374e3a1c67c69edc07b8a upstream.
    
    Chipidea core was calling the interrupt handler from non-IRQ context
    with interrupts enabled, something which can lead to a deadlock if
    there's an actual interrupt trying to take a lock that's already held
    (e.g. the controller lock in udc_irq()).
    
    Add a wrapper that can be used to fake interrupts instead of calling the
    handler directly.
    
    Fixes: 3ecb3e09b042 ("usb: chipidea: Use extcon framework for VBUS and ID detect")
    Fixes: 876d4e1e8298 ("usb: chipidea: core: add wakeup support for extcon")
    Cc: Peter Chen <peter.chen@kernel.org>
    Cc: stable@vger.kernel.org      # 4.4
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20211021083447.20078-1-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
index befd9235bcad..c13f9a153a5c 100644
--- a/drivers/usb/chipidea/core.c
+++ b/drivers/usb/chipidea/core.c
@@ -532,7 +532,7 @@ int hw_device_reset(struct ci_hdrc *ci)
 	return 0;
 }
 
-static irqreturn_t ci_irq(int irq, void *data)
+static irqreturn_t ci_irq_handler(int irq, void *data)
 {
 	struct ci_hdrc *ci = data;
 	irqreturn_t ret = IRQ_NONE;
@@ -585,6 +585,15 @@ static irqreturn_t ci_irq(int irq, void *data)
 	return ret;
 }
 
+static void ci_irq(struct ci_hdrc *ci)
+{
+	unsigned long flags;
+
+	local_irq_save(flags);
+	ci_irq_handler(ci->irq, ci);
+	local_irq_restore(flags);
+}
+
 static int ci_cable_notifier(struct notifier_block *nb, unsigned long event,
 			     void *ptr)
 {
@@ -594,7 +603,7 @@ static int ci_cable_notifier(struct notifier_block *nb, unsigned long event,
 	cbl->connected = event;
 	cbl->changed = true;
 
-	ci_irq(ci->irq, ci);
+	ci_irq(ci);
 	return NOTIFY_DONE;
 }
 
@@ -1048,7 +1057,7 @@ static int ci_hdrc_probe(struct platform_device *pdev)
 		}
 	}
 
-	ret = devm_request_irq(dev, ci->irq, ci_irq, IRQF_SHARED,
+	ret = devm_request_irq(dev, ci->irq, ci_irq_handler, IRQF_SHARED,
 			ci->platdata->name, ci);
 	if (ret)
 		goto stop;
@@ -1170,11 +1179,11 @@ static void ci_extcon_wakeup_int(struct ci_hdrc *ci)
 
 	if (!IS_ERR(cable_id->edev) && ci->is_otg &&
 		(otgsc & OTGSC_IDIE) && (otgsc & OTGSC_IDIS))
-		ci_irq(ci->irq, ci);
+		ci_irq(ci);
 
 	if (!IS_ERR(cable_vbus->edev) && ci->is_otg &&
 		(otgsc & OTGSC_BSVIE) && (otgsc & OTGSC_BSVIS))
-		ci_irq(ci->irq, ci);
+		ci_irq(ci);
 }
 
 static int ci_controller_resume(struct device *dev)

commit 2703a866736dd08a5361007223c30f433e8c5064
Author: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Date:   Thu Nov 11 15:55:16 2021 +0530

    cxgb4: fix eeprom len when diagnostics not implemented
    
    [ Upstream commit 4ca110bf8d9b31a60f8f8ff6706ea147d38ad97c ]
    
    Ensure diagnostics monitoring support is implemented for the SFF 8472
    compliant port module and set the correct length for ethtool port
    module eeprom read.
    
    Fixes: f56ec6766dcf ("cxgb4: Add support for ethtool i2c dump")
    Signed-off-by: Manoj Malviya <manojmalviya@chelsio.com>
    Signed-off-by: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_ethtool.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_ethtool.c
index d07230c892a5..db0248ab7fe4 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_ethtool.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_ethtool.c
@@ -1304,12 +1304,15 @@ static int cxgb4_get_module_info(struct net_device *dev,
 		if (ret)
 			return ret;
 
-		if (!sff8472_comp || (sff_diag_type & 4)) {
+		if (!sff8472_comp || (sff_diag_type & SFP_DIAG_ADDRMODE)) {
 			modinfo->type = ETH_MODULE_SFF_8079;
 			modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN;
 		} else {
 			modinfo->type = ETH_MODULE_SFF_8472;
-			modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN;
+			if (sff_diag_type & SFP_DIAG_IMPLEMENTED)
+				modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN;
+			else
+				modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN / 2;
 		}
 		break;
 
diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.h b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.h
index 361d5032c288..91603639ac42 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.h
+++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.h
@@ -292,6 +292,8 @@ enum {
 #define I2C_PAGE_SIZE		0x100
 #define SFP_DIAG_TYPE_ADDR	0x5c
 #define SFP_DIAG_TYPE_LEN	0x1
+#define SFP_DIAG_ADDRMODE	BIT(2)
+#define SFP_DIAG_IMPLEMENTED	BIT(6)
 #define SFF_8472_COMP_ADDR	0x5e
 #define SFF_8472_COMP_LEN	0x1
 #define SFF_REV_ADDR		0x1

commit 0608664fb50441224458e944efec167869b3f8a1
Author: Eiichi Tsukata <eiichi.tsukata@nutanix.com>
Date:   Tue Nov 9 00:15:02 2021 +0000

    vsock: prevent unnecessary refcnt inc for nonblocking connect
    
    [ Upstream commit c7cd82b90599fa10915f41e3dd9098a77d0aa7b6 ]
    
    Currently vosck_connect() increments sock refcount for nonblocking
    socket each time it's called, which can lead to memory leak if
    it's called multiple times because connect timeout function decrements
    sock refcount only once.
    
    Fixes it by making vsock_connect() return -EALREADY immediately when
    sock state is already SS_CONNECTING.
    
    Fixes: d021c344051a ("VSOCK: Introduce VM Sockets")
    Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
    Signed-off-by: Eiichi Tsukata <eiichi.tsukata@nutanix.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
index 2d31fce5c218..37329e11dc3c 100644
--- a/net/vmw_vsock/af_vsock.c
+++ b/net/vmw_vsock/af_vsock.c
@@ -1159,6 +1159,8 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr,
 		 * non-blocking call.
 		 */
 		err = -EALREADY;
+		if (flags & O_NONBLOCK)
+			goto out;
 		break;
 	default:
 		if ((sk->sk_state == TCP_LISTEN) ||

commit 5b4bf87e96f2eb319bd6830935becea4a94e17ec
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Fri Nov 5 08:54:03 2021 +0100

    arm64: pgtable: make __pte_to_phys/__phys_to_pte_val inline functions
    
    [ Upstream commit c7c386fbc20262c1d911c615c65db6a58667d92c ]
    
    gcc warns about undefined behavior the vmalloc code when building
    with CONFIG_ARM64_PA_BITS_52, when the 'idx++' in the argument to
    __phys_to_pte_val() is evaluated twice:
    
    mm/vmalloc.c: In function 'vmap_pfn_apply':
    mm/vmalloc.c:2800:58: error: operation on 'data->idx' may be undefined [-Werror=sequence-point]
     2800 |         *pte = pte_mkspecial(pfn_pte(data->pfns[data->idx++], data->prot));
          |                                                 ~~~~~~~~~^~
    arch/arm64/include/asm/pgtable-types.h:25:37: note: in definition of macro '__pte'
       25 | #define __pte(x)        ((pte_t) { (x) } )
          |                                     ^
    arch/arm64/include/asm/pgtable.h:80:15: note: in expansion of macro '__phys_to_pte_val'
       80 |         __pte(__phys_to_pte_val((phys_addr_t)(pfn) << PAGE_SHIFT) | pgprot_val(prot))
          |               ^~~~~~~~~~~~~~~~~
    mm/vmalloc.c:2800:30: note: in expansion of macro 'pfn_pte'
     2800 |         *pte = pte_mkspecial(pfn_pte(data->pfns[data->idx++], data->prot));
          |                              ^~~~~~~
    
    I have no idea why this never showed up earlier, but the safest
    workaround appears to be changing those macros into inline functions
    so the arguments get evaluated only once.
    
    Cc: Matthew Wilcox <willy@infradead.org>
    Fixes: 75387b92635e ("arm64: handle 52-bit physical addresses in page table entries")
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Link: https://lore.kernel.org/r/20211105075414.2553155-1-arnd@kernel.org
    Signed-off-by: Will Deacon <will@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h
index f43519b71061..71a73ca1e2b0 100644
--- a/arch/arm64/include/asm/pgtable.h
+++ b/arch/arm64/include/asm/pgtable.h
@@ -64,9 +64,15 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];
  * page table entry, taking care of 52-bit addresses.
  */
 #ifdef CONFIG_ARM64_PA_BITS_52
-#define __pte_to_phys(pte)	\
-	((pte_val(pte) & PTE_ADDR_LOW) | ((pte_val(pte) & PTE_ADDR_HIGH) << 36))
-#define __phys_to_pte_val(phys)	(((phys) | ((phys) >> 36)) & PTE_ADDR_MASK)
+static inline phys_addr_t __pte_to_phys(pte_t pte)
+{
+	return (pte_val(pte) & PTE_ADDR_LOW) |
+		((pte_val(pte) & PTE_ADDR_HIGH) << 36);
+}
+static inline pteval_t __phys_to_pte_val(phys_addr_t phys)
+{
+	return (phys | (phys >> 36)) & PTE_ADDR_MASK;
+}
 #else
 #define __pte_to_phys(pte)	(pte_val(pte) & PTE_ADDR_MASK)
 #define __phys_to_pte_val(phys)	(phys)

commit 2c5a51f91f970b824970d0f127e0ff0bd14427e9
Author: Chengfeng Ye <cyeaa@connect.ust.hk>
Date:   Fri Nov 5 06:36:36 2021 -0700

    nfc: pn533: Fix double free when pn533_fill_fragment_skbs() fails
    
    [ Upstream commit 9fec40f850658e00a14a7dd9e06f7fbc7e59cc4a ]
    
    skb is already freed by dev_kfree_skb in pn533_fill_fragment_skbs,
    but follow error handler branch when pn533_fill_fragment_skbs()
    fails, skb is freed again, results in double free issue. Fix this
    by not free skb in error path of pn533_fill_fragment_skbs.
    
    Fixes: 963a82e07d4e ("NFC: pn533: Split large Tx frames in chunks")
    Fixes: 93ad42020c2d ("NFC: pn533: Target mode Tx fragmentation support")
    Signed-off-by: Chengfeng Ye <cyeaa@connect.ust.hk>
    Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com>
    Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/nfc/pn533/pn533.c b/drivers/nfc/pn533/pn533.c
index 01da9331f4cb..79bf8e1bd39c 100644
--- a/drivers/nfc/pn533/pn533.c
+++ b/drivers/nfc/pn533/pn533.c
@@ -2084,7 +2084,7 @@ static int pn533_fill_fragment_skbs(struct pn533 *dev, struct sk_buff *skb)
 		frag = pn533_alloc_skb(dev, frag_size);
 		if (!frag) {
 			skb_queue_purge(&dev->fragment_skb);
-			break;
+			return -ENOMEM;
 		}
 
 		if (!dev->tgt_mode) {
@@ -2154,7 +2154,7 @@ static int pn533_transceive(struct nfc_dev *nfc_dev,
 		/* jumbo frame ? */
 		if (skb->len > PN533_CMD_DATAEXCH_DATA_MAXLEN) {
 			rc = pn533_fill_fragment_skbs(dev, skb);
-			if (rc <= 0)
+			if (rc < 0)
 				goto error;
 
 			skb = skb_dequeue(&dev->fragment_skb);
@@ -2226,7 +2226,7 @@ static int pn533_tm_send(struct nfc_dev *nfc_dev, struct sk_buff *skb)
 	/* let's split in multiple chunks if size's too big */
 	if (skb->len > PN533_CMD_DATAEXCH_DATA_MAXLEN) {
 		rc = pn533_fill_fragment_skbs(dev, skb);
-		if (rc <= 0)
+		if (rc < 0)
 			goto error;
 
 		/* get the first skb */

commit 0c727425668ddc43bcf1a19c77bad215de966e65
Author: Eric Dumazet <edumazet@google.com>
Date:   Fri Nov 5 14:42:14 2021 -0700

    llc: fix out-of-bound array index in llc_sk_dev_hash()
    
    [ Upstream commit 8ac9dfd58b138f7e82098a4e0a0d46858b12215b ]
    
    Both ifindex and LLC_SK_DEV_HASH_ENTRIES are signed.
    
    This means that (ifindex % LLC_SK_DEV_HASH_ENTRIES) is negative
    if @ifindex is negative.
    
    We could simply make LLC_SK_DEV_HASH_ENTRIES unsigned.
    
    In this patch I chose to use hash_32() to get more entropy
    from @ifindex, like llc_sk_laddr_hashfn().
    
    UBSAN: array-index-out-of-bounds in ./include/net/llc.h:75:26
    index -43 is out of range for type 'hlist_head [64]'
    CPU: 1 PID: 20999 Comm: syz-executor.3 Not tainted 5.15.0-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    Call Trace:
     <TASK>
     __dump_stack lib/dump_stack.c:88 [inline]
     dump_stack_lvl+0xcd/0x134 lib/dump_stack.c:106
     ubsan_epilogue+0xb/0x5a lib/ubsan.c:151
     __ubsan_handle_out_of_bounds.cold+0x62/0x6c lib/ubsan.c:291
     llc_sk_dev_hash include/net/llc.h:75 [inline]
     llc_sap_add_socket+0x49c/0x520 net/llc/llc_conn.c:697
     llc_ui_bind+0x680/0xd70 net/llc/af_llc.c:404
     __sys_bind+0x1e9/0x250 net/socket.c:1693
     __do_sys_bind net/socket.c:1704 [inline]
     __se_sys_bind net/socket.c:1702 [inline]
     __x64_sys_bind+0x6f/0xb0 net/socket.c:1702
     do_syscall_x64 arch/x86/entry/common.c:50 [inline]
     do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    RIP: 0033:0x7fa503407ae9
    
    Fixes: 6d2e3ea28446 ("llc: use a device based hash table to speed up multicast delivery")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/net/llc.h b/include/net/llc.h
index df282d9b4017..9c10b121b49b 100644
--- a/include/net/llc.h
+++ b/include/net/llc.h
@@ -72,7 +72,9 @@ struct llc_sap {
 static inline
 struct hlist_head *llc_sk_dev_hash(struct llc_sap *sap, int ifindex)
 {
-	return &sap->sk_dev_hash[ifindex % LLC_SK_DEV_HASH_ENTRIES];
+	u32 bucket = hash_32(ifindex, LLC_SK_DEV_HASH_BITS);
+
+	return &sap->sk_dev_hash[bucket];
 }
 
 static inline

commit 26df52b3e8168a736b6f463b2f6f46c93c4e0c1a
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Fri Nov 5 13:45:12 2021 -0700

    zram: off by one in read_block_state()
    
    [ Upstream commit a88e03cf3d190cf46bc4063a9b7efe87590de5f4 ]
    
    snprintf() returns the number of bytes it would have printed if there
    were space.  But it does not count the NUL terminator.  So that means
    that if "count == copied" then this has already overflowed by one
    character.
    
    This bug likely isn't super harmful in real life.
    
    Link: https://lkml.kernel.org/r/20210916130404.GA25094@kili
    Fixes: c0265342bff4 ("zram: introduce zram memory tracking")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
index 104206a79501..5e05bfcecd7b 100644
--- a/drivers/block/zram/zram_drv.c
+++ b/drivers/block/zram/zram_drv.c
@@ -699,7 +699,7 @@ static ssize_t read_block_state(struct file *file, char __user *buf,
 			zram_test_flag(zram, index, ZRAM_WB) ? 'w' : '.',
 			zram_test_flag(zram, index, ZRAM_HUGE) ? 'h' : '.');
 
-		if (count < copied) {
+		if (count <= copied) {
 			zram_slot_unlock(zram, index);
 			break;
 		}

commit b19675b6a046da6b4e160a78eedb3dd2584aa889
Author: Miaohe Lin <linmiaohe@huawei.com>
Date:   Fri Nov 5 13:45:03 2021 -0700

    mm/zsmalloc.c: close race window between zs_pool_dec_isolated() and zs_unregister_migration()
    
    [ Upstream commit afe8605ca45424629fdddfd85984b442c763dc47 ]
    
    There is one possible race window between zs_pool_dec_isolated() and
    zs_unregister_migration() because wait_for_isolated_drain() checks the
    isolated count without holding class->lock and there is no order inside
    zs_pool_dec_isolated().  Thus the below race window could be possible:
    
      zs_pool_dec_isolated          zs_unregister_migration
        check pool->destroying != 0
                                      pool->destroying = true;
                                      smp_mb();
                                      wait_for_isolated_drain()
                                        wait for pool->isolated_pages == 0
        atomic_long_dec(&pool->isolated_pages);
        atomic_long_read(&pool->isolated_pages) == 0
    
    Since we observe the pool->destroying (false) before atomic_long_dec()
    for pool->isolated_pages, waking pool->migration_wait up is missed.
    
    Fix this by ensure checking pool->destroying happens after the
    atomic_long_dec(&pool->isolated_pages).
    
    Link: https://lkml.kernel.org/r/20210708115027.7557-1-linmiaohe@huawei.com
    Fixes: 701d678599d0 ("mm/zsmalloc.c: fix race condition in zs_destroy_pool")
    Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
    Cc: Henry Burns <henryburns@google.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c
index d52c005a060f..11e81b3ff0cf 100644
--- a/mm/zsmalloc.c
+++ b/mm/zsmalloc.c
@@ -1904,10 +1904,11 @@ static inline void zs_pool_dec_isolated(struct zs_pool *pool)
 	VM_BUG_ON(atomic_long_read(&pool->isolated_pages) <= 0);
 	atomic_long_dec(&pool->isolated_pages);
 	/*
-	 * There's no possibility of racing, since wait_for_isolated_drain()
-	 * checks the isolated count under &class->lock after enqueuing
-	 * on migration_wait.
+	 * Checking pool->destroying must happen after atomic_long_dec()
+	 * for pool->isolated_pages above. Paired with the smp_mb() in
+	 * zs_unregister_migration().
 	 */
+	smp_mb__after_atomic();
 	if (atomic_long_read(&pool->isolated_pages) == 0 && pool->destroying)
 		wake_up_all(&pool->migration_wait);
 }

commit 6abf177202ab5266b55ce298f5766f6bec8ee804
Author: Huang Guobin <huangguobin4@huawei.com>
Date:   Tue Nov 2 17:37:33 2021 +0800

    bonding: Fix a use-after-free problem when bond_sysfs_slave_add() failed
    
    [ Upstream commit b93c6a911a3fe926b00add28f3b932007827c4ca ]
    
    When I do fuzz test for bonding device interface, I got the following
    use-after-free Calltrace:
    
    ==================================================================
    BUG: KASAN: use-after-free in bond_enslave+0x1521/0x24f0
    Read of size 8 at addr ffff88825bc11c00 by task ifenslave/7365
    
    CPU: 5 PID: 7365 Comm: ifenslave Tainted: G            E     5.15.0-rc1+ #13
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1 04/01/2014
    Call Trace:
     dump_stack_lvl+0x6c/0x8b
     print_address_description.constprop.0+0x48/0x70
     kasan_report.cold+0x82/0xdb
     __asan_load8+0x69/0x90
     bond_enslave+0x1521/0x24f0
     bond_do_ioctl+0x3e0/0x450
     dev_ifsioc+0x2ba/0x970
     dev_ioctl+0x112/0x710
     sock_do_ioctl+0x118/0x1b0
     sock_ioctl+0x2e0/0x490
     __x64_sys_ioctl+0x118/0x150
     do_syscall_64+0x35/0xb0
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    RIP: 0033:0x7f19159cf577
    Code: b3 66 90 48 8b 05 11 89 2c 00 64 c7 00 26 00 00 00 48 c7 c0 ff ff ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 b8 10 00 00 00 0f 05 <48> 3d 01 f0 ff ff 78
    RSP: 002b:00007ffeb3083c78 EFLAGS: 00000246 ORIG_RAX: 0000000000000010
    RAX: ffffffffffffffda RBX: 00007ffeb3084bca RCX: 00007f19159cf577
    RDX: 00007ffeb3083ce0 RSI: 0000000000008990 RDI: 0000000000000003
    RBP: 00007ffeb3084bc4 R08: 0000000000000040 R09: 0000000000000000
    R10: 00007ffeb3084bc0 R11: 0000000000000246 R12: 00007ffeb3083ce0
    R13: 0000000000000000 R14: 0000000000000000 R15: 00007ffeb3083cb0
    
    Allocated by task 7365:
     kasan_save_stack+0x23/0x50
     __kasan_kmalloc+0x83/0xa0
     kmem_cache_alloc_trace+0x22e/0x470
     bond_enslave+0x2e1/0x24f0
     bond_do_ioctl+0x3e0/0x450
     dev_ifsioc+0x2ba/0x970
     dev_ioctl+0x112/0x710
     sock_do_ioctl+0x118/0x1b0
     sock_ioctl+0x2e0/0x490
     __x64_sys_ioctl+0x118/0x150
     do_syscall_64+0x35/0xb0
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Freed by task 7365:
     kasan_save_stack+0x23/0x50
     kasan_set_track+0x20/0x30
     kasan_set_free_info+0x24/0x40
     __kasan_slab_free+0xf2/0x130
     kfree+0xd1/0x5c0
     slave_kobj_release+0x61/0x90
     kobject_put+0x102/0x180
     bond_sysfs_slave_add+0x7a/0xa0
     bond_enslave+0x11b6/0x24f0
     bond_do_ioctl+0x3e0/0x450
     dev_ifsioc+0x2ba/0x970
     dev_ioctl+0x112/0x710
     sock_do_ioctl+0x118/0x1b0
     sock_ioctl+0x2e0/0x490
     __x64_sys_ioctl+0x118/0x150
     do_syscall_64+0x35/0xb0
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Last potentially related work creation:
     kasan_save_stack+0x23/0x50
     kasan_record_aux_stack+0xb7/0xd0
     insert_work+0x43/0x190
     __queue_work+0x2e3/0x970
     delayed_work_timer_fn+0x3e/0x50
     call_timer_fn+0x148/0x470
     run_timer_softirq+0x8a8/0xc50
     __do_softirq+0x107/0x55f
    
    Second to last potentially related work creation:
     kasan_save_stack+0x23/0x50
     kasan_record_aux_stack+0xb7/0xd0
     insert_work+0x43/0x190
     __queue_work+0x2e3/0x970
     __queue_delayed_work+0x130/0x180
     queue_delayed_work_on+0xa7/0xb0
     bond_enslave+0xe25/0x24f0
     bond_do_ioctl+0x3e0/0x450
     dev_ifsioc+0x2ba/0x970
     dev_ioctl+0x112/0x710
     sock_do_ioctl+0x118/0x1b0
     sock_ioctl+0x2e0/0x490
     __x64_sys_ioctl+0x118/0x150
     do_syscall_64+0x35/0xb0
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    The buggy address belongs to the object at ffff88825bc11c00
     which belongs to the cache kmalloc-1k of size 1024
    The buggy address is located 0 bytes inside of
     1024-byte region [ffff88825bc11c00, ffff88825bc12000)
    The buggy address belongs to the page:
    page:ffffea00096f0400 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x25bc10
    head:ffffea00096f0400 order:3 compound_mapcount:0 compound_pincount:0
    flags: 0x57ff00000010200(slab|head|node=1|zone=2|lastcpupid=0x7ff)
    raw: 057ff00000010200 ffffea0009a71c08 ffff888240001968 ffff88810004dbc0
    raw: 0000000000000000 00000000000a000a 00000001ffffffff 0000000000000000
    page dumped because: kasan: bad access detected
    
    Memory state around the buggy address:
     ffff88825bc11b00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
     ffff88825bc11b80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    >ffff88825bc11c00: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
                       ^
     ffff88825bc11c80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
     ffff88825bc11d00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    ==================================================================
    
    Put new_slave in bond_sysfs_slave_add() will cause use-after-free problems
    when new_slave is accessed in the subsequent error handling process. Since
    new_slave will be put in the subsequent error handling process, remove the
    unnecessary put to fix it.
    In addition, when sysfs_create_file() fails, if some files have been crea-
    ted successfully, we need to call sysfs_remove_file() to remove them.
    Since there are sysfs_create_files() & sysfs_remove_files() can be used,
    use these two functions instead.
    
    Fixes: 7afcaec49696 (bonding: use kobject_put instead of _del after kobject_add)
    Signed-off-by: Huang Guobin <huangguobin4@huawei.com>
    Reviewed-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/bonding/bond_sysfs_slave.c b/drivers/net/bonding/bond_sysfs_slave.c
index 9ec0498d7d54..1bc20de8e57b 100644
--- a/drivers/net/bonding/bond_sysfs_slave.c
+++ b/drivers/net/bonding/bond_sysfs_slave.c
@@ -112,15 +112,15 @@ static ssize_t ad_partner_oper_port_state_show(struct slave *slave, char *buf)
 }
 static SLAVE_ATTR_RO(ad_partner_oper_port_state);
 
-static const struct slave_attribute *slave_attrs[] = {
-	&slave_attr_state,
-	&slave_attr_mii_status,
-	&slave_attr_link_failure_count,
-	&slave_attr_perm_hwaddr,
-	&slave_attr_queue_id,
-	&slave_attr_ad_aggregator_id,
-	&slave_attr_ad_actor_oper_port_state,
-	&slave_attr_ad_partner_oper_port_state,
+static const struct attribute *slave_attrs[] = {
+	&slave_attr_state.attr,
+	&slave_attr_mii_status.attr,
+	&slave_attr_link_failure_count.attr,
+	&slave_attr_perm_hwaddr.attr,
+	&slave_attr_queue_id.attr,
+	&slave_attr_ad_aggregator_id.attr,
+	&slave_attr_ad_actor_oper_port_state.attr,
+	&slave_attr_ad_partner_oper_port_state.attr,
 	NULL
 };
 
@@ -141,24 +141,10 @@ const struct sysfs_ops slave_sysfs_ops = {
 
 int bond_sysfs_slave_add(struct slave *slave)
 {
-	const struct slave_attribute **a;
-	int err;
-
-	for (a = slave_attrs; *a; ++a) {
-		err = sysfs_create_file(&slave->kobj, &((*a)->attr));
-		if (err) {
-			kobject_put(&slave->kobj);
-			return err;
-		}
-	}
-
-	return 0;
+	return sysfs_create_files(&slave->kobj, slave_attrs);
 }
 
 void bond_sysfs_slave_del(struct slave *slave)
 {
-	const struct slave_attribute **a;
-
-	for (a = slave_attrs; *a; ++a)
-		sysfs_remove_file(&slave->kobj, &((*a)->attr));
+	sysfs_remove_files(&slave->kobj, slave_attrs);
 }

commit b2cd0ae61f35212dd79addfe7b119ca966a27fa1
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Sun Oct 31 16:31:35 2021 +0100

    ACPI: PMIC: Fix intel_pmic_regs_handler() read accesses
    
    [ Upstream commit 009a789443fe4c8e6b1ecb7c16b4865c026184cd ]
    
    The handling of PMIC register reads through writing 0 to address 4
    of the OpRegion is wrong. Instead of returning the read value
    through the value64, which is a no-op for function == ACPI_WRITE calls,
    store the value and then on a subsequent function == ACPI_READ with
    address == 3 (the address for the value field of the OpRegion)
    return the stored value.
    
    This has been tested on a Xiaomi Mi Pad 2 and makes the ACPI battery dev
    there mostly functional (unfortunately there are still other issues).
    
    Here are the SET() / GET() functions of the PMIC ACPI device,
    which use this OpRegion, which clearly show the new behavior to
    be correct:
    
    OperationRegion (REGS, 0x8F, Zero, 0x50)
    Field (REGS, ByteAcc, NoLock, Preserve)
    {
        CLNT,   8,
        SA,     8,
        OFF,    8,
        VAL,    8,
        RWM,    8
    }
    
    Method (GET, 3, Serialized)
    {
        If ((AVBE == One))
        {
            CLNT = Arg0
            SA = Arg1
            OFF = Arg2
            RWM = Zero
            If ((AVBG == One))
            {
                GPRW = Zero
            }
        }
    
        Return (VAL) /* \_SB_.PCI0.I2C7.PMI5.VAL_ */
    }
    
    Method (SET, 4, Serialized)
    {
        If ((AVBE == One))
        {
            CLNT = Arg0
            SA = Arg1
            OFF = Arg2
            VAL = Arg3
            RWM = One
            If ((AVBG == One))
            {
                GPRW = One
            }
        }
    }
    
    Fixes: 0afa877a5650 ("ACPI / PMIC: intel: add REGS operation region support")
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/acpi/pmic/intel_pmic.c b/drivers/acpi/pmic/intel_pmic.c
index ca18e0d23df9..db63d3463617 100644
--- a/drivers/acpi/pmic/intel_pmic.c
+++ b/drivers/acpi/pmic/intel_pmic.c
@@ -216,31 +216,36 @@ static acpi_status intel_pmic_regs_handler(u32 function,
 		void *handler_context, void *region_context)
 {
 	struct intel_pmic_opregion *opregion = region_context;
-	int result = 0;
+	int result = -EINVAL;
+
+	if (function == ACPI_WRITE) {
+		switch (address) {
+		case 0:
+			return AE_OK;
+		case 1:
+			opregion->ctx.addr |= (*value64 & 0xff) << 8;
+			return AE_OK;
+		case 2:
+			opregion->ctx.addr |= *value64 & 0xff;
+			return AE_OK;
+		case 3:
+			opregion->ctx.val = *value64 & 0xff;
+			return AE_OK;
+		case 4:
+			if (*value64) {
+				result = regmap_write(opregion->regmap, opregion->ctx.addr,
+						      opregion->ctx.val);
+			} else {
+				result = regmap_read(opregion->regmap, opregion->ctx.addr,
+						     &opregion->ctx.val);
+			}
+			opregion->ctx.addr = 0;
+		}
+	}
 
-	switch (address) {
-	case 0:
-		return AE_OK;
-	case 1:
-		opregion->ctx.addr |= (*value64 & 0xff) << 8;
+	if (function == ACPI_READ && address == 3) {
+		*value64 = opregion->ctx.val;
 		return AE_OK;
-	case 2:
-		opregion->ctx.addr |= *value64 & 0xff;
-		return AE_OK;
-	case 3:
-		opregion->ctx.val = *value64 & 0xff;
-		return AE_OK;
-	case 4:
-		if (*value64) {
-			result = regmap_write(opregion->regmap, opregion->ctx.addr,
-					      opregion->ctx.val);
-		} else {
-			result = regmap_read(opregion->regmap, opregion->ctx.addr,
-					     &opregion->ctx.val);
-			if (result == 0)
-				*value64 = opregion->ctx.val;
-		}
-		memset(&opregion->ctx, 0x00, sizeof(opregion->ctx));
 	}
 
 	if (result < 0) {

commit 10139767fe5e8b45743712f86d44c7a77dc18eed
Author: Maxim Kiselev <bigunclemax@gmail.com>
Date:   Mon Nov 1 18:23:41 2021 +0300

    net: davinci_emac: Fix interrupt pacing disable
    
    [ Upstream commit d52bcb47bdf971a59a2467975d2405fcfcb2fa19 ]
    
    This patch allows to use 0 for `coal->rx_coalesce_usecs` param to
    disable rx irq coalescing.
    
    Previously we could enable rx irq coalescing via ethtool
    (For ex: `ethtool -C eth0 rx-usecs 2000`) but we couldn't disable
    it because this part rejects 0 value:
    
           if (!coal->rx_coalesce_usecs)
                   return -EINVAL;
    
    Fixes: 84da2658a619 ("TI DaVinci EMAC : Implement interrupt pacing functionality.")
    Signed-off-by: Maxim Kiselev <bigunclemax@gmail.com>
    Reviewed-by: Grygorii Strashko <grygorii.strashko@ti.com>
    Link: https://lore.kernel.org/r/20211101152343.4193233-1-bigunclemax@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/ti/davinci_emac.c b/drivers/net/ethernet/ti/davinci_emac.c
index 56130cf293f3..566da1e3cfbc 100644
--- a/drivers/net/ethernet/ti/davinci_emac.c
+++ b/drivers/net/ethernet/ti/davinci_emac.c
@@ -426,8 +426,20 @@ static int emac_set_coalesce(struct net_device *ndev,
 	u32 int_ctrl, num_interrupts = 0;
 	u32 prescale = 0, addnl_dvdr = 1, coal_intvl = 0;
 
-	if (!coal->rx_coalesce_usecs)
-		return -EINVAL;
+	if (!coal->rx_coalesce_usecs) {
+		priv->coal_intvl = 0;
+
+		switch (priv->version) {
+		case EMAC_VERSION_2:
+			emac_ctrl_write(EMAC_DM646X_CMINTCTRL, 0);
+			break;
+		default:
+			emac_ctrl_write(EMAC_CTRL_EWINTTCNT, 0);
+			break;
+		}
+
+		return 0;
+	}
 
 	coal_intvl = coal->rx_coalesce_usecs;
 

commit e89391c7392688b21cb0d0ef6da20b7c07dc0ab1
Author: YueHaibing <yuehaibing@huawei.com>
Date:   Fri Oct 8 15:44:17 2021 +0800

    xen-pciback: Fix return in pm_ctrl_init()
    
    [ Upstream commit 4745ea2628bb43a7ec34b71763b5a56407b33990 ]
    
    Return NULL instead of passing to ERR_PTR while err is zero,
    this fix smatch warnings:
    drivers/xen/xen-pciback/conf_space_capability.c:163
     pm_ctrl_init() warn: passing zero to 'ERR_PTR'
    
    Fixes: a92336a1176b ("xen/pciback: Drop two backends, squash and cleanup some code.")
    Signed-off-by: YueHaibing <yuehaibing@huawei.com>
    Reviewed-by: Juergen Gross <jgross@suse.com>
    Link: https://lore.kernel.org/r/20211008074417.8260-1-yuehaibing@huawei.com
    Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/xen/xen-pciback/conf_space_capability.c b/drivers/xen/xen-pciback/conf_space_capability.c
index e5694133ebe5..42f0f64fcba4 100644
--- a/drivers/xen/xen-pciback/conf_space_capability.c
+++ b/drivers/xen/xen-pciback/conf_space_capability.c
@@ -160,7 +160,7 @@ static void *pm_ctrl_init(struct pci_dev *dev, int offset)
 	}
 
 out:
-	return ERR_PTR(err);
+	return err ? ERR_PTR(err) : NULL;
 }
 
 static const struct config_field caplist_pm[] = {

commit f66cb91cd726f3d78d74b1b7fbc20eea1eeed815
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Thu Aug 19 22:48:08 2021 +0200

    i2c: xlr: Fix a resource leak in the error handling path of 'xlr_i2c_probe()'
    
    [ Upstream commit 7f98960c046ee1136e7096aee168eda03aef8a5d ]
    
    A successful 'clk_prepare()' call should be balanced by a corresponding
    'clk_unprepare()' call in the error handling path of the probe, as already
    done in the remove function.
    
    More specifically, 'clk_prepare_enable()' is used, but 'clk_disable()' is
    also already called. So just the unprepare step has still to be done.
    
    Update the error handling path accordingly.
    
    Fixes: 75d31c2372e4 ("i2c: xlr: add support for Sigma Designs controller variant")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/i2c/busses/i2c-xlr.c b/drivers/i2c/busses/i2c-xlr.c
index 34cd4b308540..dda6cb848405 100644
--- a/drivers/i2c/busses/i2c-xlr.c
+++ b/drivers/i2c/busses/i2c-xlr.c
@@ -433,11 +433,15 @@ static int xlr_i2c_probe(struct platform_device *pdev)
 	i2c_set_adapdata(&priv->adap, priv);
 	ret = i2c_add_numbered_adapter(&priv->adap);
 	if (ret < 0)
-		return ret;
+		goto err_unprepare_clk;
 
 	platform_set_drvdata(pdev, priv);
 	dev_info(&priv->adap.dev, "Added I2C Bus.\n");
 	return 0;
+
+err_unprepare_clk:
+	clk_unprepare(clk);
+	return ret;
 }
 
 static int xlr_i2c_remove(struct platform_device *pdev)

commit f793824ca36b3b8e526bfab5e82514d9e7b88ee5
Author: Quinn Tran <qutran@marvell.com>
Date:   Tue Oct 26 04:54:02 2021 -0700

    scsi: qla2xxx: Turn off target reset during issue_lip
    
    [ Upstream commit 0b7a9fd934a68ebfc1019811b7bdc1742072ad7b ]
    
    When user uses issue_lip to do link bounce, driver sends additional target
    reset to remote device before resetting the link. The target reset would
    affect other paths with active I/Os. This patch will remove the unnecessary
    target reset.
    
    Link: https://lore.kernel.org/r/20211026115412.27691-4-njavali@marvell.com
    Fixes: 5854771e314e ("[SCSI] qla2xxx: Add ISPFX00 specific bus reset routine")
    Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
    Signed-off-by: Quinn Tran <qutran@marvell.com>
    Signed-off-by: Nilesh Javali <njavali@marvell.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index b8e4abe804d5..5b98a00bfc17 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -144,7 +144,6 @@ extern int ql2xasynctmfenable;
 extern int ql2xgffidenable;
 extern int ql2xenabledif;
 extern int ql2xenablehba_err_chk;
-extern int ql2xtargetreset;
 extern int ql2xdontresethba;
 extern uint64_t ql2xmaxlun;
 extern int ql2xmdcapmask;
@@ -754,7 +753,6 @@ extern void qlafx00_abort_iocb(srb_t *, struct abort_iocb_entry_fx00 *);
 extern void qlafx00_fxdisc_iocb(srb_t *, struct fxdisc_entry_fx00 *);
 extern void qlafx00_timer_routine(scsi_qla_host_t *);
 extern int qlafx00_rescan_isp(scsi_qla_host_t *);
-extern int qlafx00_loop_reset(scsi_qla_host_t *vha);
 
 /* qla82xx related functions */
 
diff --git a/drivers/scsi/qla2xxx/qla_mr.c b/drivers/scsi/qla2xxx/qla_mr.c
index 521a51370554..0c00aaea9768 100644
--- a/drivers/scsi/qla2xxx/qla_mr.c
+++ b/drivers/scsi/qla2xxx/qla_mr.c
@@ -739,29 +739,6 @@ qlafx00_lun_reset(fc_port_t *fcport, uint64_t l, int tag)
 	return qla2x00_async_tm_cmd(fcport, TCF_LUN_RESET, l, tag);
 }
 
-int
-qlafx00_loop_reset(scsi_qla_host_t *vha)
-{
-	int ret;
-	struct fc_port *fcport;
-	struct qla_hw_data *ha = vha->hw;
-
-	if (ql2xtargetreset) {
-		list_for_each_entry(fcport, &vha->vp_fcports, list) {
-			if (fcport->port_type != FCT_TARGET)
-				continue;
-
-			ret = ha->isp_ops->target_reset(fcport, 0, 0);
-			if (ret != QLA_SUCCESS) {
-				ql_dbg(ql_dbg_taskm, vha, 0x803d,
-				    "Bus Reset failed: Reset=%d "
-				    "d_id=%x.\n", ret, fcport->d_id.b24);
-			}
-		}
-	}
-	return QLA_SUCCESS;
-}
-
 int
 qlafx00_iospace_config(struct qla_hw_data *ha)
 {
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 7cbdd32a238d..207af1d5ed29 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -188,12 +188,6 @@ MODULE_PARM_DESC(ql2xdbwr,
 		" 0 -- Regular doorbell.\n"
 		" 1 -- CAMRAM doorbell (faster).\n");
 
-int ql2xtargetreset = 1;
-module_param(ql2xtargetreset, int, S_IRUGO);
-MODULE_PARM_DESC(ql2xtargetreset,
-		 "Enable target reset."
-		 "Default is 1 - use hw defaults.");
-
 int ql2xgffidenable;
 module_param(ql2xgffidenable, int, S_IRUGO);
 MODULE_PARM_DESC(ql2xgffidenable,
@@ -1662,27 +1656,10 @@ int
 qla2x00_loop_reset(scsi_qla_host_t *vha)
 {
 	int ret;
-	struct fc_port *fcport;
 	struct qla_hw_data *ha = vha->hw;
 
-	if (IS_QLAFX00(ha)) {
-		return qlafx00_loop_reset(vha);
-	}
-
-	if (ql2xtargetreset == 1 && ha->flags.enable_target_reset) {
-		list_for_each_entry(fcport, &vha->vp_fcports, list) {
-			if (fcport->port_type != FCT_TARGET)
-				continue;
-
-			ret = ha->isp_ops->target_reset(fcport, 0, 0);
-			if (ret != QLA_SUCCESS) {
-				ql_dbg(ql_dbg_taskm, vha, 0x802c,
-				    "Bus Reset failed: Reset=%d "
-				    "d_id=%x.\n", ret, fcport->d_id.b24);
-			}
-		}
-	}
-
+	if (IS_QLAFX00(ha))
+		return QLA_SUCCESS;
 
 	if (ha->flags.enable_lip_full_login && !IS_CNA_CAPABLE(ha)) {
 		atomic_set(&vha->loop_state, LOOP_DOWN);

commit 084292de352061a43be5c3f97c2d39fea8da969f
Author: Quinn Tran <qutran@marvell.com>
Date:   Tue Oct 26 04:54:01 2021 -0700

    scsi: qla2xxx: Fix gnl list corruption
    
    [ Upstream commit c98c5daaa24b583cba1369b7d167f93c6ae7299c ]
    
    Current code does list element deletion and addition in and out of lock
    protection. This patch moves deletion behind lock.
    
    list_add double add: new=ffff9130b5eb89f8, prev=ffff9130b5eb89f8,
        next=ffff9130c6a715f0.
     ------------[ cut here ]------------
     kernel BUG at lib/list_debug.c:31!
     invalid opcode: 0000 [#1] SMP PTI
     CPU: 1 PID: 182395 Comm: kworker/1:37 Kdump: loaded Tainted: G W  OE
     --------- -  - 4.18.0-193.el8.x86_64 #1
     Hardware name: HP ProLiant DL160 Gen8, BIOS J03 02/10/2014
     Workqueue: qla2xxx_wq qla2x00_iocb_work_fn [qla2xxx]
     RIP: 0010:__list_add_valid+0x41/0x50
     Code: 85 94 00 00 00 48 39 c7 74 0b 48 39 d7 74 06 b8 01 00 00 00 c3 48 89 f2
     4c 89 c1 48 89 fe 48 c7 c7 60 83 ad 97 e8 4d bd ce ff <0f> 0b 0f 1f 00 66 2e
     0f 1f 84 00 00 00 00 00 48 8b 07 48 8b 57 08
     RSP: 0018:ffffaba306f47d68 EFLAGS: 00010046
     RAX: 0000000000000058 RBX: ffff9130b5eb8800 RCX: 0000000000000006
     RDX: 0000000000000000 RSI: 0000000000000096 RDI: ffff9130b7456a00
     RBP: ffff9130c6a70a58 R08: 000000000008d7be R09: 0000000000000001
     R10: 0000000000000000 R11: 0000000000000001 R12: ffff9130c6a715f0
     R13: ffff9130b5eb8824 R14: ffff9130b5eb89f8 R15: ffff9130b5eb89f8
     FS:  0000000000000000(0000) GS:ffff9130b7440000(0000) knlGS:0000000000000000
     CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
     CR2: 00007efcaaef11a0 CR3: 000000005200a002 CR4: 00000000000606e0
     Call Trace:
      qla24xx_async_gnl+0x113/0x3c0 [qla2xxx]
      ? qla2x00_iocb_work_fn+0x53/0x80 [qla2xxx]
      ? process_one_work+0x1a7/0x3b0
      ? worker_thread+0x30/0x390
      ? create_worker+0x1a0/0x1a0
      ? kthread+0x112/0x130
    
    Link: https://lore.kernel.org/r/20211026115412.27691-3-njavali@marvell.com
    Fixes: 726b85487067 ("qla2xxx: Add framework for async fabric discovery")
    Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
    Signed-off-by: Quinn Tran <qutran@marvell.com>
    Signed-off-by: Nilesh Javali <njavali@marvell.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 2ebf4e4e0234..613e5467b4bc 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -797,8 +797,6 @@ qla24xx_async_gnl_sp_done(void *s, int res)
 	    sp->name, res, sp->u.iocb_cmd.u.mbx.in_mb[1],
 	    sp->u.iocb_cmd.u.mbx.in_mb[2]);
 
-	if (res == QLA_FUNCTION_TIMEOUT)
-		return;
 
 	sp->fcport->flags &= ~(FCF_ASYNC_SENT|FCF_ASYNC_ACTIVE);
 	memset(&ea, 0, sizeof(ea));
@@ -837,8 +835,8 @@ qla24xx_async_gnl_sp_done(void *s, int res)
 	spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
 
 	list_for_each_entry_safe(fcport, tf, &h, gnl_entry) {
-		list_del_init(&fcport->gnl_entry);
 		spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
+		list_del_init(&fcport->gnl_entry);
 		fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
 		spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
 		ea.fcport = fcport;

commit dcf53641d60b25e847a4d353b5e3ab2c78d833a0
Author: Jackie Liu <liuyun01@kylinos.cn>
Date:   Tue Sep 7 10:49:04 2021 +0800

    ar7: fix kernel builds for compiler test
    
    [ Upstream commit 28b7ee33a2122569ac065cad578bf23f50cc65c3 ]
    
    TI AR7 Watchdog Timer is only build for 32bit.
    
    Avoid error like:
    In file included from drivers/watchdog/ar7_wdt.c:29:
    ./arch/mips/include/asm/mach-ar7/ar7.h: In function ?ar7_is_titan??
    ./arch/mips/include/asm/mach-ar7/ar7.h:111:24: error: implicit declaration of function ?KSEG1ADDR?? did you mean ?CKSEG1ADDR?? [-Werror=implicit-function-declaration]
      111 |  return (readl((void *)KSEG1ADDR(AR7_REGS_GPIO + 0x24)) & 0xffff) ==
          |                        ^~~~~~~~~
          |                        CKSEG1ADDR
    
    Fixes: da2a68b3eb47 ("watchdog: Enable COMPILE_TEST where possible")
    Signed-off-by: Jackie Liu <liuyun01@kylinos.cn>
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    Link: https://lore.kernel.org/r/20210907024904.4127611-1-liu.yun@linux.dev
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
index fa7f4c61524d..92fdc7dc2ede 100644
--- a/drivers/watchdog/Kconfig
+++ b/drivers/watchdog/Kconfig
@@ -1524,7 +1524,7 @@ config SIBYTE_WDOG
 
 config AR7_WDT
 	tristate "TI AR7 Watchdog Timer"
-	depends on AR7 || (MIPS && COMPILE_TEST)
+	depends on AR7 || (MIPS && 32BIT && COMPILE_TEST)
 	help
 	  Hardware driver for the TI AR7 Watchdog Timer.
 

commit 5c910175347430a942a73ae230406da7a9c6d8dd
Author: Ahmad Fatoum <a.fatoum@pengutronix.de>
Date:   Mon Aug 9 18:20:31 2021 +0200

    watchdog: f71808e_wdt: fix inaccurate report in WDIOC_GETTIMEOUT
    
    [ Upstream commit 164483c735190775f29d0dcbac0363adc51a068d ]
    
    The fintek watchdog timer can configure timeouts of second granularity
    only up to 255 seconds. Beyond that, the timeout needs to be configured
    with minute granularity. WDIOC_GETTIMEOUT should report the actual
    timeout configured, not just echo back the timeout configured by the
    user. Do so.
    
    Fixes: 96cb4eb019ce ("watchdog: f71808e_wdt: new watchdog driver for Fintek F71808E and F71882FG")
    Suggested-by: Guenter Roeck <linux@roeck-us.net>
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
    Link: https://lore.kernel.org/r/5e17960fe8cc0e3cb2ba53de4730b75d9a0f33d5.1628525954.git-series.a.fatoum@pengutronix.de
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/watchdog/f71808e_wdt.c b/drivers/watchdog/f71808e_wdt.c
index 5d0ea419070d..6b751d1aab08 100644
--- a/drivers/watchdog/f71808e_wdt.c
+++ b/drivers/watchdog/f71808e_wdt.c
@@ -237,15 +237,17 @@ static int watchdog_set_timeout(int timeout)
 
 	mutex_lock(&watchdog.lock);
 
-	watchdog.timeout = timeout;
 	if (timeout > 0xff) {
 		watchdog.timer_val = DIV_ROUND_UP(timeout, 60);
 		watchdog.minutes_mode = true;
+		timeout = watchdog.timer_val * 60;
 	} else {
 		watchdog.timer_val = timeout;
 		watchdog.minutes_mode = false;
 	}
 
+	watchdog.timeout = timeout;
+
 	mutex_unlock(&watchdog.lock);
 
 	return 0;

commit 3d11c0e2ef46b04dce9615a2e71c7d0303265948
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Sat Oct 2 17:02:23 2021 -0700

    m68k: set a default value for MEMORY_RESERVE
    
    [ Upstream commit 1aaa557b2db95c9506ed0981bc34505c32d6b62b ]
    
    'make randconfig' can produce a .config file with
    "CONFIG_MEMORY_RESERVE=" (no value) since it has no default.
    When a subsequent 'make all' is done, kconfig restarts the config
    and prompts for a value for MEMORY_RESERVE. This breaks
    scripting/automation where there is no interactive user input.
    
    Add a default value for MEMORY_RESERVE. (Any integer value will
    work here for kconfig.)
    
    Fixes a kconfig warning:
    
    .config:214:warning: symbol value '' invalid for MEMORY_RESERVE
    * Restart config...
    Memory reservation (MiB) (MEMORY_RESERVE) [] (NEW)
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") # from beginning of git history
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
    Cc: Greg Ungerer <gerg@linux-m68k.org>
    Cc: linux-m68k@lists.linux-m68k.org
    Signed-off-by: Greg Ungerer <gerg@linux-m68k.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/m68k/Kconfig.machine b/arch/m68k/Kconfig.machine
index 64a641467736..0c451081432a 100644
--- a/arch/m68k/Kconfig.machine
+++ b/arch/m68k/Kconfig.machine
@@ -185,6 +185,7 @@ config INIT_LCD
 config MEMORY_RESERVE
 	int "Memory reservation (MiB)"
 	depends on (UCSIMM || UCDIMM)
+	default 0
 	help
 	  Reserve certain memory regions on 68x328 based boards.
 

commit aa4de56beeed5d28f647c981b284b1775d9a99d1
Author: Lars-Peter Clausen <lars@metafoo.de>
Date:   Sat Oct 23 15:41:01 2021 +0200

    dmaengine: dmaengine_desc_callback_valid(): Check for `callback_result`
    
    [ Upstream commit e7e1e880b114ca640a2f280b0d5d38aed98f98c6 ]
    
    Before the `callback_result` callback was introduced drivers coded their
    invocation to the callback in a similar way to:
    
            if (cb->callback) {
                    spin_unlock(&dma->lock);
                    cb->callback(cb->callback_param);
                    spin_lock(&dma->lock);
            }
    
    With the introduction of `callback_result` two helpers where introduced to
    transparently handle both types of callbacks. And drivers where updated to
    look like this:
    
            if (dmaengine_desc_callback_valid(cb)) {
                    spin_unlock(&dma->lock);
                    dmaengine_desc_callback_invoke(cb, ...);
                    spin_lock(&dma->lock);
            }
    
    dmaengine_desc_callback_invoke() correctly handles both `callback_result`
    and `callback`. But we forgot to update the dmaengine_desc_callback_valid()
    function to check for `callback_result`. As a result DMA descriptors that
    use the `callback_result` rather than `callback` don't have their callback
    invoked by drivers that follow the pattern above.
    
    Fix this by checking for both `callback` and `callback_result` in
    dmaengine_desc_callback_valid().
    
    Fixes: f067025bc676 ("dmaengine: add support to provide error result from a DMA transation")
    Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
    Acked-by: Dave Jiang <dave.jiang@intel.com>
    Link: https://lore.kernel.org/r/20211023134101.28042-1-lars@metafoo.de
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/dma/dmaengine.h b/drivers/dma/dmaengine.h
index 501c0b063f85..302f13efd35d 100644
--- a/drivers/dma/dmaengine.h
+++ b/drivers/dma/dmaengine.h
@@ -168,7 +168,7 @@ dmaengine_desc_get_callback_invoke(struct dma_async_tx_descriptor *tx,
 static inline bool
 dmaengine_desc_callback_valid(struct dmaengine_desc_callback *cb)
 {
-	return (cb->callback) ? true : false;
+	return cb->callback || cb->callback_result;
 }
 
 #endif

commit 779e36a18ecca58ad1637680feb7ca431458506b
Author: Florian Westphal <fw@strlen.de>
Date:   Wed Oct 20 18:08:10 2021 +0200

    netfilter: nfnetlink_queue: fix OOB when mac header was cleared
    
    [ Upstream commit 5648b5e1169ff1d6d6a46c35c0b5fbebd2a5cbb2 ]
    
    On 64bit platforms the MAC header is set to 0xffff on allocation and
    also when a helper like skb_unset_mac_header() is called.
    
    dev_parse_header may call skb_mac_header() which assumes valid mac offset:
    
     BUG: KASAN: use-after-free in eth_header_parse+0x75/0x90
     Read of size 6 at addr ffff8881075a5c05 by task nf-queue/1364
     Call Trace:
      memcpy+0x20/0x60
      eth_header_parse+0x75/0x90
      __nfqnl_enqueue_packet+0x1a61/0x3380
      __nf_queue+0x597/0x1300
      nf_queue+0xf/0x40
      nf_hook_slow+0xed/0x190
      nf_hook+0x184/0x440
      ip_output+0x1c0/0x2a0
      nf_reinject+0x26f/0x700
      nfqnl_recv_verdict+0xa16/0x18b0
      nfnetlink_rcv_msg+0x506/0xe70
    
    The existing code only works if the skb has a mac header.
    
    Fixes: 2c38de4c1f8da7 ("netfilter: fix looped (broad|multi)cast's MAC handling")
    Signed-off-by: Florian Westphal <fw@strlen.de>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c
index f81a3ce0fe48..eb5a052d3b25 100644
--- a/net/netfilter/nfnetlink_queue.c
+++ b/net/netfilter/nfnetlink_queue.c
@@ -566,7 +566,7 @@ nfqnl_build_packet_message(struct net *net, struct nfqnl_instance *queue,
 		goto nla_put_failure;
 
 	if (indev && entskb->dev &&
-	    entskb->mac_header != entskb->network_header) {
+	    skb_mac_header_was_set(entskb)) {
 		struct nfqnl_msg_packet_hw phw;
 		int len;
 

commit b7ca0f280dadbe551b43471b165bfd750a2929ad
Author: Geert Uytterhoeven <geert@linux-m68k.org>
Date:   Tue Oct 19 16:45:09 2021 +0200

    auxdisplay: ht16k33: Fix frame buffer device blanking
    
    [ Upstream commit 840fe258332544aa7321921e1723d37b772af7a9 ]
    
    As the ht16k33 frame buffer sub-driver does not register an
    fb_ops.fb_blank() handler, blanking does not work:
    
        $ echo 1 > /sys/class/graphics/fb0/blank
        sh: write error: Invalid argument
    
    Fix this by providing a handler that always returns zero, to make sure
    blank events will be sent to the actual device handling the backlight.
    
    Reported-by: Robin van der Gracht <robin@protonic.nl>
    Suggested-by: Robin van der Gracht <robin@protonic.nl>
    Fixes: 8992da44c6805d53 ("auxdisplay: ht16k33: Driver for LED controller")
    Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
    Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/auxdisplay/ht16k33.c b/drivers/auxdisplay/ht16k33.c
index f6927871fa4e..03a87dd1f625 100644
--- a/drivers/auxdisplay/ht16k33.c
+++ b/drivers/auxdisplay/ht16k33.c
@@ -219,6 +219,15 @@ static const struct backlight_ops ht16k33_bl_ops = {
 	.check_fb	= ht16k33_bl_check_fb,
 };
 
+/*
+ * Blank events will be passed to the actual device handling the backlight when
+ * we return zero here.
+ */
+static int ht16k33_blank(int blank, struct fb_info *info)
+{
+	return 0;
+}
+
 static int ht16k33_mmap(struct fb_info *info, struct vm_area_struct *vma)
 {
 	struct ht16k33_priv *priv = info->par;
@@ -231,6 +240,7 @@ static struct fb_ops ht16k33_fb_ops = {
 	.owner = THIS_MODULE,
 	.fb_read = fb_sys_read,
 	.fb_write = fb_sys_write,
+	.fb_blank = ht16k33_blank,
 	.fb_fillrect = sys_fillrect,
 	.fb_copyarea = sys_copyarea,
 	.fb_imageblit = sys_imageblit,

commit 84ed9845017877a0c7d0e271c2164a7b7c35daea
Author: Geert Uytterhoeven <geert@linux-m68k.org>
Date:   Tue Oct 19 16:45:08 2021 +0200

    auxdisplay: ht16k33: Connect backlight to fbdev
    
    [ Upstream commit 80f9eb70fd9276938f0a131f76d438021bfd8b34 ]
    
    Currently /sys/class/graphics/fb0/bl_curve is not accessible (-ENODEV),
    as the driver does not connect the backlight to the frame buffer device.
    Fix this moving backlight initialization up, and filling in
    fb_info.bl_dev.
    
    Fixes: 8992da44c6805d53 ("auxdisplay: ht16k33: Driver for LED controller")
    Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
    Reviewed-by: Robin van der Gracht <robin@protonic.nl>
    Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/auxdisplay/ht16k33.c b/drivers/auxdisplay/ht16k33.c
index 194370ae37dd..f6927871fa4e 100644
--- a/drivers/auxdisplay/ht16k33.c
+++ b/drivers/auxdisplay/ht16k33.c
@@ -418,6 +418,33 @@ static int ht16k33_probe(struct i2c_client *client,
 	if (err)
 		return err;
 
+	/* Backlight */
+	memset(&bl_props, 0, sizeof(struct backlight_properties));
+	bl_props.type = BACKLIGHT_RAW;
+	bl_props.max_brightness = MAX_BRIGHTNESS;
+
+	bl = devm_backlight_device_register(&client->dev, DRIVER_NAME"-bl",
+					    &client->dev, priv,
+					    &ht16k33_bl_ops, &bl_props);
+	if (IS_ERR(bl)) {
+		dev_err(&client->dev, "failed to register backlight\n");
+		return PTR_ERR(bl);
+	}
+
+	err = of_property_read_u32(node, "default-brightness-level",
+				   &dft_brightness);
+	if (err) {
+		dft_brightness = MAX_BRIGHTNESS;
+	} else if (dft_brightness > MAX_BRIGHTNESS) {
+		dev_warn(&client->dev,
+			 "invalid default brightness level: %u, using %u\n",
+			 dft_brightness, MAX_BRIGHTNESS);
+		dft_brightness = MAX_BRIGHTNESS;
+	}
+
+	bl->props.brightness = dft_brightness;
+	ht16k33_bl_update_status(bl);
+
 	/* Framebuffer (2 bytes per column) */
 	BUILD_BUG_ON(PAGE_SIZE < HT16K33_FB_SIZE);
 	fbdev->buffer = (unsigned char *) get_zeroed_page(GFP_KERNEL);
@@ -450,6 +477,7 @@ static int ht16k33_probe(struct i2c_client *client,
 	fbdev->info->screen_size = HT16K33_FB_SIZE;
 	fbdev->info->fix = ht16k33_fb_fix;
 	fbdev->info->var = ht16k33_fb_var;
+	fbdev->info->bl_dev = bl;
 	fbdev->info->pseudo_palette = NULL;
 	fbdev->info->flags = FBINFO_FLAG_DEFAULT;
 	fbdev->info->par = priv;
@@ -462,34 +490,6 @@ static int ht16k33_probe(struct i2c_client *client,
 	if (err)
 		goto err_fbdev_unregister;
 
-	/* Backlight */
-	memset(&bl_props, 0, sizeof(struct backlight_properties));
-	bl_props.type = BACKLIGHT_RAW;
-	bl_props.max_brightness = MAX_BRIGHTNESS;
-
-	bl = devm_backlight_device_register(&client->dev, DRIVER_NAME"-bl",
-					    &client->dev, priv,
-					    &ht16k33_bl_ops, &bl_props);
-	if (IS_ERR(bl)) {
-		dev_err(&client->dev, "failed to register backlight\n");
-		err = PTR_ERR(bl);
-		goto err_fbdev_unregister;
-	}
-
-	err = of_property_read_u32(node, "default-brightness-level",
-				   &dft_brightness);
-	if (err) {
-		dft_brightness = MAX_BRIGHTNESS;
-	} else if (dft_brightness > MAX_BRIGHTNESS) {
-		dev_warn(&client->dev,
-			 "invalid default brightness level: %u, using %u\n",
-			 dft_brightness, MAX_BRIGHTNESS);
-		dft_brightness = MAX_BRIGHTNESS;
-	}
-
-	bl->props.brightness = dft_brightness;
-	ht16k33_bl_update_status(bl);
-
 	ht16k33_fb_queue(priv);
 	return 0;
 

commit 3d887dc577be9782a468c6727d961a177eda42f3
Author: Geert Uytterhoeven <geert@linux-m68k.org>
Date:   Tue Oct 19 16:45:02 2021 +0200

    auxdisplay: img-ascii-lcd: Fix lock-up when displaying empty string
    
    [ Upstream commit afcb5a811ff3ab3969f09666535eb6018a160358 ]
    
    While writing an empty string to a device attribute is a no-op, and thus
    does not need explicit safeguards, the user can still write a single
    newline to an attribute file:
    
        echo > .../message
    
    If that happens, img_ascii_lcd_display() trims the newline, yielding an
    empty string, and causing an infinite loop in img_ascii_lcd_scroll().
    
    Fix this by adding a check for empty strings.  Clear the display in case
    one is encountered.
    
    Fixes: 0cad855fbd083ee5 ("auxdisplay: img-ascii-lcd: driver for simple ASCII LCD displays")
    Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
    Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/auxdisplay/img-ascii-lcd.c b/drivers/auxdisplay/img-ascii-lcd.c
index 834509506ef6..c4bc6723acfa 100644
--- a/drivers/auxdisplay/img-ascii-lcd.c
+++ b/drivers/auxdisplay/img-ascii-lcd.c
@@ -284,6 +284,16 @@ static int img_ascii_lcd_display(struct img_ascii_lcd_ctx *ctx,
 	if (msg[count - 1] == '\n')
 		count--;
 
+	if (!count) {
+		/* clear the LCD */
+		devm_kfree(&ctx->pdev->dev, ctx->message);
+		ctx->message = NULL;
+		ctx->message_len = 0;
+		memset(ctx->curr, ' ', ctx->cfg->num_chars);
+		ctx->cfg->update(ctx);
+		return 0;
+	}
+
 	new_msg = devm_kmalloc(&ctx->pdev->dev, count + 1, GFP_KERNEL);
 	if (!new_msg)
 		return -ENOMEM;

commit 8995f55de52e855c6b5a55e28528d80b951e591a
Author: Claudiu Beznea <claudiu.beznea@microchip.com>
Date:   Thu Oct 7 14:12:28 2021 +0300

    dmaengine: at_xdmac: fix AT_XDMAC_CC_PERID() macro
    
    [ Upstream commit 320c88a3104dc955f928a1eecebd551ff89530c0 ]
    
    AT_XDMAC_CC_PERID() should be used to setup bits 24..30 of XDMAC_CC
    register. Using it without parenthesis around 0x7f & (i) will lead to
    setting all the time zero for bits 24..30 of XDMAC_CC as the << operator
    has higher precedence over bitwise &. Thus, add paranthesis around
    0x7f & (i).
    
    Fixes: 15a03850ab8f ("dmaengine: at_xdmac: fix macro typo")
    Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com>
    Reviewed-by: Tudor Ambarus <tudor.ambarus@microchip.com>
    Link: https://lore.kernel.org/r/20211007111230.2331837-3-claudiu.beznea@microchip.com
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/dma/at_xdmac.c b/drivers/dma/at_xdmac.c
index 7db66f974041..1624eee76f96 100644
--- a/drivers/dma/at_xdmac.c
+++ b/drivers/dma/at_xdmac.c
@@ -156,7 +156,7 @@
 #define		AT_XDMAC_CC_WRIP	(0x1 << 23)	/* Write in Progress (read only) */
 #define			AT_XDMAC_CC_WRIP_DONE		(0x0 << 23)
 #define			AT_XDMAC_CC_WRIP_IN_PROGRESS	(0x1 << 23)
-#define		AT_XDMAC_CC_PERID(i)	(0x7f & (i) << 24)	/* Channel Peripheral Identifier */
+#define		AT_XDMAC_CC_PERID(i)	((0x7f & (i)) << 24)	/* Channel Peripheral Identifier */
 #define AT_XDMAC_CDS_MSP	0x2C	/* Channel Data Stride Memory Set Pattern */
 #define AT_XDMAC_CSUS		0x30	/* Channel Source Microblock Stride */
 #define AT_XDMAC_CDUS		0x34	/* Channel Destination Microblock Stride */

commit edc5525473f93c3be43df72ca82fda82c29e2aaf
Author: Evgeny Novikov <novikov@ispras.ru>
Date:   Fri Jul 9 17:45:29 2021 +0300

    mtd: spi-nor: hisi-sfc: Remove excessive clk_disable_unprepare()
    
    [ Upstream commit 78e4d342187625585932bb437ec26e1060f7fc6f ]
    
    hisi_spi_nor_probe() invokes clk_disable_unprepare() on all paths after
    successful call of clk_prepare_enable(). Besides, the clock is enabled by
    hispi_spi_nor_prep() and disabled by hispi_spi_nor_unprep(). So at remove
    time it is not possible to have the clock enabled. The patch removes
    excessive clk_disable_unprepare() from hisi_spi_nor_remove().
    
    Found by Linux Driver Verification project (linuxtesting.org).
    
    Fixes: e523f11141bd ("mtd: spi-nor: add hisilicon spi-nor flash controller driver")
    Signed-off-by: Evgeny Novikov <novikov@ispras.ru>
    Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>
    Reviewed-by: Pratyush Yadav <p.yadav@ti.com>
    Link: https://lore.kernel.org/r/20210709144529.31379-1-novikov@ispras.ru
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mtd/spi-nor/hisi-sfc.c b/drivers/mtd/spi-nor/hisi-sfc.c
index 184ba5069ac5..36d2eb0918d9 100644
--- a/drivers/mtd/spi-nor/hisi-sfc.c
+++ b/drivers/mtd/spi-nor/hisi-sfc.c
@@ -485,7 +485,6 @@ static int hisi_spi_nor_remove(struct platform_device *pdev)
 
 	hisi_spi_nor_unregister_all(host);
 	mutex_destroy(&host->lock);
-	clk_disable_unprepare(host->clk);
 	return 0;
 }
 

commit f6c91946c2326f8d5c4b4bcbe58c42ef4bd46cae
Author: Jia-Ju Bai <baijiaju1990@gmail.com>
Date:   Tue Mar 9 00:00:20 2021 -0800

    fs: orangefs: fix error return code of orangefs_revalidate_lookup()
    
    [ Upstream commit 4c2b46c824a78fc8190d8eafaaea5a9078fe7479 ]
    
    When op_alloc() returns NULL to new_op, no error return code of
    orangefs_revalidate_lookup() is assigned.
    To fix this bug, ret is assigned with -ENOMEM in this case.
    
    Fixes: 8bb8aefd5afb ("OrangeFS: Change almost all instances of the string PVFS2 to OrangeFS.")
    Reported-by: TOTE Robot <oslab@tsinghua.edu.cn>
    Signed-off-by: Jia-Ju Bai <baijiaju1990@gmail.com>
    Signed-off-by: Mike Marshall <hubcap@omnibond.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/orangefs/dcache.c b/fs/orangefs/dcache.c
index fe484cf93e5c..8bbe9486e3a6 100644
--- a/fs/orangefs/dcache.c
+++ b/fs/orangefs/dcache.c
@@ -26,8 +26,10 @@ static int orangefs_revalidate_lookup(struct dentry *dentry)
 	gossip_debug(GOSSIP_DCACHE_DEBUG, "%s: attempting lookup.\n", __func__);
 
 	new_op = op_alloc(ORANGEFS_VFS_OP_LOOKUP);
-	if (!new_op)
+	if (!new_op) {
+		ret = -ENOMEM;
 		goto out_put_parent;
+	}
 
 	new_op->upcall.req.lookup.sym_follow = ORANGEFS_LOOKUP_LINK_NO_FOLLOW;
 	new_op->upcall.req.lookup.parent_refn = parent->refn;

commit cc806af48ba4aa0e8641268cac95557f85a64c90
Author: Trond Myklebust <trond.myklebust@hammerspace.com>
Date:   Mon Oct 4 15:44:16 2021 -0400

    NFS: Fix deadlocks in nfs_scan_commit_list()
    
    [ Upstream commit 64a93dbf25d3a1368bb58ddf0f61d0a92d7479e3 ]
    
    Partially revert commit 2ce209c42c01 ("NFS: Wait for requests that are
    locked on the commit list"), since it can lead to deadlocks between
    commit requests and nfs_join_page_group().
    For now we should assume that any locked requests on the commit list are
    either about to be removed and committed by another task, or the writes
    they describe are about to be retransmitted. In either case, we should
    not need to worry.
    
    Fixes: 2ce209c42c01 ("NFS: Wait for requests that are locked on the commit list")
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index d419d89b91f7..ec0fd6b3d185 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -1045,25 +1045,11 @@ nfs_scan_commit_list(struct list_head *src, struct list_head *dst,
 	struct nfs_page *req, *tmp;
 	int ret = 0;
 
-restart:
 	list_for_each_entry_safe(req, tmp, src, wb_list) {
 		kref_get(&req->wb_kref);
 		if (!nfs_lock_request(req)) {
-			int status;
-
-			/* Prevent deadlock with nfs_lock_and_join_requests */
-			if (!list_empty(dst)) {
-				nfs_release_request(req);
-				continue;
-			}
-			/* Ensure we make progress to prevent livelock */
-			mutex_unlock(&NFS_I(cinfo->inode)->commit_mutex);
-			status = nfs_wait_on_request(req);
 			nfs_release_request(req);
-			mutex_lock(&NFS_I(cinfo->inode)->commit_mutex);
-			if (status < 0)
-				break;
-			goto restart;
+			continue;
 		}
 		nfs_request_remove_commit_list(req, cinfo);
 		clear_bit(PG_COMMIT_TO_DS, &req->wb_flags);
@@ -1911,6 +1897,7 @@ static int __nfs_commit_inode(struct inode *inode, int how,
 	int may_wait = how & FLUSH_SYNC;
 	int ret, nscan;
 
+	how &= ~FLUSH_SYNC;
 	nfs_init_cinfo_from_inode(&cinfo, inode);
 	nfs_commit_begin(cinfo.mds);
 	for (;;) {

commit cf835a3352ff9c37f4599fa969a1387354d343e8
Author: Marek Behún <kabel@kernel.org>
Date:   Tue Oct 5 20:09:42 2021 +0200

    PCI: aardvark: Don't spam about PIO Response Status
    
    [ Upstream commit 464de7e7fff767e87429cd7be09c4f2cb50a6ccb ]
    
    Use dev_dbg() instead of dev_err() in advk_pcie_check_pio_status().
    
    For example CRS is not an error status, it just says that the request
    should be retried.
    
    Link: https://lore.kernel.org/r/20211005180952.6812-4-kabel@kernel.org
    Fixes: 8c39d710363c1 ("PCI: aardvark: Add Aardvark PCI host controller driver")
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index e5ac846e2a20..98fb3c1f45e4 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -404,7 +404,7 @@ static int advk_pcie_check_pio_status(struct advk_pcie *pcie, u32 *val)
 	else
 		str_posted = "Posted";
 
-	dev_err(dev, "%s PIO Response Status: %s, %#x @ %#x\n",
+	dev_dbg(dev, "%s PIO Response Status: %s, %#x @ %#x\n",
 		str_posted, strcomp_status, reg, advk_readl(pcie, PIO_ADDR_LS));
 
 	return -EFAULT;

commit c488e6a5bfe177b81068eee41a051544de5d588f
Author: Alex Xu (Hello71) <alex_y_xu@yahoo.ca>
Date:   Thu Oct 7 02:37:06 2021 -0400

    drm/plane-helper: fix uninitialized variable reference
    
    [ Upstream commit 7be28bd73f23e53d6e7f5fe891ba9503fc0c7210 ]
    
    drivers/gpu/drm/drm_plane_helper.c: In function 'drm_primary_helper_update':
    drivers/gpu/drm/drm_plane_helper.c:113:32: error: 'visible' is used uninitialized [-Werror=uninitialized]
      113 |         struct drm_plane_state plane_state = {
          |                                ^~~~~~~~~~~
    drivers/gpu/drm/drm_plane_helper.c:178:14: note: 'visible' was declared here
      178 |         bool visible;
          |              ^~~~~~~
    cc1: all warnings being treated as errors
    
    visible is an output, not an input. in practice this use might turn out
    OK but it's still UB.
    
    Fixes: df86af9133b4 ("drm/plane-helper: Add drm_plane_helper_check_state()")
    Reviewed-by: Simon Ser <contact@emersion.fr>
    Signed-off-by: Alex Xu (Hello71) <alex_y_xu@yahoo.ca>
    Signed-off-by: Simon Ser <contact@emersion.fr>
    Link: https://patchwork.freedesktop.org/patch/msgid/20211007063706.305984-1-alex_y_xu@yahoo.ca
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/drm_plane_helper.c b/drivers/gpu/drm/drm_plane_helper.c
index 621f17643bb0..1f3362ce47ae 100644
--- a/drivers/gpu/drm/drm_plane_helper.c
+++ b/drivers/gpu/drm/drm_plane_helper.c
@@ -150,7 +150,6 @@ int drm_plane_helper_check_update(struct drm_plane *plane,
 		.crtc_w = drm_rect_width(dst),
 		.crtc_h = drm_rect_height(dst),
 		.rotation = rotation,
-		.visible = *visible,
 	};
 	struct drm_crtc_state crtc_state = {
 		.crtc = crtc,

commit e311fcf4d408e8318cb3367042ec17580690dd88
Author: Baptiste Lepers <baptiste.lepers@gmail.com>
Date:   Mon Sep 6 11:59:24 2021 +1000

    pnfs/flexfiles: Fix misplaced barrier in nfs4_ff_layout_prepare_ds
    
    [ Upstream commit a2915fa06227b056a8f9b0d79b61dca08ad5cfc6 ]
    
    _nfs4_pnfs_v3/v4_ds_connect do
       some work
       smp_wmb
       ds->ds_clp = clp;
    
    And nfs4_ff_layout_prepare_ds currently does
       smp_rmb
       if(ds->ds_clp)
          ...
    
    This patch places the smp_rmb after the if. This ensures that following
    reads only happen once nfs4_ff_layout_prepare_ds has checked that data
    has been properly initialized.
    
    Fixes: d67ae825a59d6 ("pnfs/flexfiles: Add the FlexFile Layout Driver")
    Signed-off-by: Baptiste Lepers <baptiste.lepers@gmail.com>
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/nfs/flexfilelayout/flexfilelayoutdev.c b/fs/nfs/flexfilelayout/flexfilelayoutdev.c
index 8da239b6cc16..f1f0519f1ece 100644
--- a/fs/nfs/flexfilelayout/flexfilelayoutdev.c
+++ b/fs/nfs/flexfilelayout/flexfilelayoutdev.c
@@ -429,10 +429,10 @@ nfs4_ff_layout_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx,
 		goto out_fail;
 
 	ds = mirror->mirror_ds->ds;
+	if (READ_ONCE(ds->ds_clp))
+		goto out;
 	/* matching smp_wmb() in _nfs4_pnfs_v3/4_ds_connect */
 	smp_rmb();
-	if (ds->ds_clp)
-		goto out;
 
 	/* FIXME: For now we assume the server sent only one version of NFS
 	 * to use for the DS.
diff --git a/fs/nfs/pnfs_nfs.c b/fs/nfs/pnfs_nfs.c
index 3f0c2436254a..bd6190d794c4 100644
--- a/fs/nfs/pnfs_nfs.c
+++ b/fs/nfs/pnfs_nfs.c
@@ -635,7 +635,7 @@ static int _nfs4_pnfs_v3_ds_connect(struct nfs_server *mds_srv,
 	}
 
 	smp_wmb();
-	ds->ds_clp = clp;
+	WRITE_ONCE(ds->ds_clp, clp);
 	dprintk("%s [new] addr: %s\n", __func__, ds->ds_remotestr);
 out:
 	return status;
@@ -708,7 +708,7 @@ static int _nfs4_pnfs_v4_ds_connect(struct nfs_server *mds_srv,
 	}
 
 	smp_wmb();
-	ds->ds_clp = clp;
+	WRITE_ONCE(ds->ds_clp, clp);
 	dprintk("%s [new] addr: %s\n", __func__, ds->ds_remotestr);
 out:
 	return status;

commit 7e2638ddb7a50dc5acd1fa98a9042bf019a3a7aa
Author: Arnaud Pouliquen <arnaud.pouliquen@foss.st.com>
Date:   Mon Jul 12 14:39:12 2021 +0200

    rpmsg: Fix rpmsg_create_ept return when RPMSG config is not defined
    
    [ Upstream commit 537d3af1bee8ad1415fda9b622d1ea6d1ae76dfa ]
    
    According to the description of the rpmsg_create_ept in rpmsg_core.c
    the function should return NULL on error.
    
    Fixes: 2c8a57088045 ("rpmsg: Provide function stubs for API")
    Signed-off-by: Arnaud Pouliquen <arnaud.pouliquen@foss.st.com>
    Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
    Link: https://lore.kernel.org/r/20210712123912.10672-1-arnaud.pouliquen@foss.st.com
    Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/rpmsg.h b/include/linux/rpmsg.h
index 9fe156d1c018..a68972b097b7 100644
--- a/include/linux/rpmsg.h
+++ b/include/linux/rpmsg.h
@@ -177,7 +177,7 @@ static inline struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_device *rpdev
 	/* This shouldn't be possible */
 	WARN_ON(1);
 
-	return ERR_PTR(-ENXIO);
+	return NULL;
 }
 
 static inline int rpmsg_send(struct rpmsg_endpoint *ept, void *data, int len)

commit 9f3eb0a8a5c401f2c29aa2b3b979bbaae5401190
Author: Tom Rix <trix@redhat.com>
Date:   Sun Oct 4 07:24:22 2020 -0700

    apparmor: fix error check
    
    [ Upstream commit d108370c644b153382632b3e5511ade575c91c86 ]
    
    clang static analysis reports this representative problem:
    
    label.c:1463:16: warning: Assigned value is garbage or undefined
            label->hname = name;
                         ^ ~~~~
    
    In aa_update_label_name(), this the problem block of code
    
            if (aa_label_acntsxprint(&name, ...) == -1)
                    return res;
    
    On failure, aa_label_acntsxprint() has a more complicated return
    that just -1.  So check for a negative return.
    
    It was also noted that the aa_label_acntsxprint() main comment refers
    to a nonexistent parameter, so clean up the comment.
    
    Fixes: f1bd904175e8 ("apparmor: add the base fns() for domain labels")
    Signed-off-by: Tom Rix <trix@redhat.com>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
    Signed-off-by: John Johansen <john.johansen@canonical.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/security/apparmor/label.c b/security/apparmor/label.c
index 6727e6fb69df..5a80a16a7f75 100644
--- a/security/apparmor/label.c
+++ b/security/apparmor/label.c
@@ -1463,7 +1463,7 @@ bool aa_update_label_name(struct aa_ns *ns, struct aa_label *label, gfp_t gfp)
 	if (label->hname || labels_ns(label) != ns)
 		return res;
 
-	if (aa_label_acntsxprint(&name, ns, label, FLAGS_NONE, gfp) == -1)
+	if (aa_label_acntsxprint(&name, ns, label, FLAGS_NONE, gfp) < 0)
 		return res;
 
 	ls = labels_set(label);
@@ -1713,7 +1713,7 @@ int aa_label_asxprint(char **strp, struct aa_ns *ns, struct aa_label *label,
 
 /**
  * aa_label_acntsxprint - allocate a __counted string buffer and print label
- * @strp: buffer to write to. (MAY BE NULL if @size == 0)
+ * @strp: buffer to write to.
  * @ns: namespace profile is being viewed from
  * @label: label to view (NOT NULL)
  * @flags: flags controlling what label info is printed

commit 00ea79181f53d649c21d272e50eaeea524ae631e
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Sun Oct 31 16:25:22 2021 +0100

    power: supply: bq27xxx: Fix kernel crash on IRQ handler register error
    
    [ Upstream commit cdf10ffe8f626d8a2edc354abf063df0078b2d71 ]
    
    When registering the IRQ handler fails, do not just return the error code,
    this will free the devm_kzalloc()-ed data struct while leaving the queued
    work queued and the registered power_supply registered with both of them
    now pointing to free-ed memory, resulting in various kernel crashes
    soon afterwards.
    
    Instead properly tear-down things on IRQ handler register errors.
    
    Fixes: 703df6c09795 ("power: bq27xxx_battery: Reorganize I2C into a module")
    Cc: Andrew F. Davis <afd@ti.com>
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/power/supply/bq27xxx_battery_i2c.c b/drivers/power/supply/bq27xxx_battery_i2c.c
index 40069128ad44..06dd5077104c 100644
--- a/drivers/power/supply/bq27xxx_battery_i2c.c
+++ b/drivers/power/supply/bq27xxx_battery_i2c.c
@@ -195,7 +195,8 @@ static int bq27xxx_battery_i2c_probe(struct i2c_client *client,
 			dev_err(&client->dev,
 				"Unable to register IRQ %d error %d\n",
 				client->irq, ret);
-			return ret;
+			bq27xxx_battery_teardown(di);
+			goto err_failed;
 		}
 	}
 

commit 96be0f7cadae2478dcd4ffa851a98928d45347bf
Author: Geert Uytterhoeven <geert+renesas@glider.be>
Date:   Fri Oct 29 11:58:16 2021 +0200

    mips: cm: Convert to bitfield API to fix out-of-bounds access
    
    [ Upstream commit 18b8f5b6fc53d097cadb94a93d8d6566ba88e389 ]
    
    mips_cm_error_report() extracts the cause and other cause from the error
    register using shifts.  This works fine for the former, as it is stored
    in the top bits, and the shift will thus remove all non-related bits.
    However, the latter is stored in the bottom bits, hence thus needs masking
    to get rid of non-related bits.  Without such masking, using it as an
    index into the cm2_causes[] array will lead to an out-of-bounds access,
    probably causing a crash.
    
    Fix this by using FIELD_GET() instead.  Bite the bullet and convert all
    MIPS CM handling to the bitfield API, to improve readability and safety.
    
    Fixes: 3885c2b463f6a236 ("MIPS: CM: Add support for reporting CM cache errors")
    Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
    Reviewed-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/include/asm/mips-cm.h b/arch/mips/include/asm/mips-cm.h
index 8bc5df49b0e1..890e51b159e0 100644
--- a/arch/mips/include/asm/mips-cm.h
+++ b/arch/mips/include/asm/mips-cm.h
@@ -15,6 +15,7 @@
 #ifndef __MIPS_ASM_MIPS_CM_H__
 #define __MIPS_ASM_MIPS_CM_H__
 
+#include <linux/bitfield.h>
 #include <linux/bitops.h>
 #include <linux/errno.h>
 
@@ -157,8 +158,8 @@ GCR_ACCESSOR_RO(32, 0x030, rev)
 #define CM_GCR_REV_MINOR			GENMASK(7, 0)
 
 #define CM_ENCODE_REV(major, minor) \
-		(((major) << __ffs(CM_GCR_REV_MAJOR)) | \
-		 ((minor) << __ffs(CM_GCR_REV_MINOR)))
+		(FIELD_PREP(CM_GCR_REV_MAJOR, major) | \
+		 FIELD_PREP(CM_GCR_REV_MINOR, minor))
 
 #define CM_REV_CM2				CM_ENCODE_REV(6, 0)
 #define CM_REV_CM2_5				CM_ENCODE_REV(7, 0)
@@ -366,10 +367,10 @@ static inline int mips_cm_revision(void)
 static inline unsigned int mips_cm_max_vp_width(void)
 {
 	extern int smp_num_siblings;
-	uint32_t cfg;
 
 	if (mips_cm_revision() >= CM_REV_CM3)
-		return read_gcr_sys_config2() & CM_GCR_SYS_CONFIG2_MAXVPW;
+		return FIELD_GET(CM_GCR_SYS_CONFIG2_MAXVPW,
+				 read_gcr_sys_config2());
 
 	if (mips_cm_present()) {
 		/*
@@ -377,8 +378,7 @@ static inline unsigned int mips_cm_max_vp_width(void)
 		 * number of VP(E)s, and if that ever changes then this will
 		 * need revisiting.
 		 */
-		cfg = read_gcr_cl_config() & CM_GCR_Cx_CONFIG_PVPE;
-		return (cfg >> __ffs(CM_GCR_Cx_CONFIG_PVPE)) + 1;
+		return FIELD_GET(CM_GCR_Cx_CONFIG_PVPE, read_gcr_cl_config()) + 1;
 	}
 
 	if (IS_ENABLED(CONFIG_SMP))
diff --git a/arch/mips/kernel/mips-cm.c b/arch/mips/kernel/mips-cm.c
index 50d3d74001cb..51cfcb44e670 100644
--- a/arch/mips/kernel/mips-cm.c
+++ b/arch/mips/kernel/mips-cm.c
@@ -183,8 +183,7 @@ static void mips_cm_probe_l2sync(void)
 	phys_addr_t addr;
 
 	/* L2-only sync was introduced with CM major revision 6 */
-	major_rev = (read_gcr_rev() & CM_GCR_REV_MAJOR) >>
-		__ffs(CM_GCR_REV_MAJOR);
+	major_rev = FIELD_GET(CM_GCR_REV_MAJOR, read_gcr_rev());
 	if (major_rev < 6)
 		return;
 
@@ -267,13 +266,13 @@ void mips_cm_lock_other(unsigned int cluster, unsigned int core,
 	preempt_disable();
 
 	if (cm_rev >= CM_REV_CM3) {
-		val = core << __ffs(CM3_GCR_Cx_OTHER_CORE);
-		val |= vp << __ffs(CM3_GCR_Cx_OTHER_VP);
+		val = FIELD_PREP(CM3_GCR_Cx_OTHER_CORE, core) |
+		      FIELD_PREP(CM3_GCR_Cx_OTHER_VP, vp);
 
 		if (cm_rev >= CM_REV_CM3_5) {
 			val |= CM_GCR_Cx_OTHER_CLUSTER_EN;
-			val |= cluster << __ffs(CM_GCR_Cx_OTHER_CLUSTER);
-			val |= block << __ffs(CM_GCR_Cx_OTHER_BLOCK);
+			val |= FIELD_PREP(CM_GCR_Cx_OTHER_CLUSTER, cluster);
+			val |= FIELD_PREP(CM_GCR_Cx_OTHER_BLOCK, block);
 		} else {
 			WARN_ON(cluster != 0);
 			WARN_ON(block != CM_GCR_Cx_OTHER_BLOCK_LOCAL);
@@ -303,7 +302,7 @@ void mips_cm_lock_other(unsigned int cluster, unsigned int core,
 		spin_lock_irqsave(&per_cpu(cm_core_lock, curr_core),
 				  per_cpu(cm_core_lock_flags, curr_core));
 
-		val = core << __ffs(CM_GCR_Cx_OTHER_CORENUM);
+		val = FIELD_PREP(CM_GCR_Cx_OTHER_CORENUM, core);
 	}
 
 	write_gcr_cl_other(val);
@@ -347,8 +346,8 @@ void mips_cm_error_report(void)
 	cm_other = read_gcr_error_mult();
 
 	if (revision < CM_REV_CM3) { /* CM2 */
-		cause = cm_error >> __ffs(CM_GCR_ERROR_CAUSE_ERRTYPE);
-		ocause = cm_other >> __ffs(CM_GCR_ERROR_MULT_ERR2ND);
+		cause = FIELD_GET(CM_GCR_ERROR_CAUSE_ERRTYPE, cm_error);
+		ocause = FIELD_GET(CM_GCR_ERROR_MULT_ERR2ND, cm_other);
 
 		if (!cause)
 			return;
@@ -390,8 +389,8 @@ void mips_cm_error_report(void)
 		ulong core_id_bits, vp_id_bits, cmd_bits, cmd_group_bits;
 		ulong cm3_cca_bits, mcp_bits, cm3_tr_bits, sched_bit;
 
-		cause = cm_error >> __ffs64(CM3_GCR_ERROR_CAUSE_ERRTYPE);
-		ocause = cm_other >> __ffs(CM_GCR_ERROR_MULT_ERR2ND);
+		cause = FIELD_GET(CM3_GCR_ERROR_CAUSE_ERRTYPE, cm_error);
+		ocause = FIELD_GET(CM_GCR_ERROR_MULT_ERR2ND, cm_other);
 
 		if (!cause)
 			return;

commit da942ccbc00d848a0505d564a1bd43bb0ec5fe11
Author: Anssi Hannula <anssi.hannula@bitwise.fi>
Date:   Tue Oct 26 13:27:41 2021 +0300

    serial: xilinx_uartps: Fix race condition causing stuck TX
    
    [ Upstream commit 88b20f84f0fe47409342669caf3e58a3fc64c316 ]
    
    xilinx_uartps .start_tx() clears TXEMPTY when enabling TXEMPTY to avoid
    any previous TXEVENT event asserting the UART interrupt. This clear
    operation is done immediately after filling the TX FIFO.
    
    However, if the bytes inserted by cdns_uart_handle_tx() are consumed by
    the UART before the TXEMPTY is cleared, the clear operation eats the new
    TXEMPTY event as well, causing cdns_uart_isr() to never receive the
    TXEMPTY event. If there are bytes still queued in circbuf, TX will get
    stuck as they will never get transferred to FIFO (unless new bytes are
    queued to circbuf in which case .start_tx() is called again).
    
    While the racy missed TXEMPTY occurs fairly often with short data
    sequences (e.g. write 1 byte), in those cases circbuf is usually empty
    so no action on TXEMPTY would have been needed anyway. On the other
    hand, longer data sequences make the race much more unlikely as UART
    takes longer to consume the TX FIFO. Therefore it is rare for this race
    to cause visible issues in general.
    
    Fix the race by clearing the TXEMPTY bit in ISR *before* filling the
    FIFO.
    
    The TXEMPTY bit in ISR will only get asserted at the exact moment the
    TX FIFO *becomes* empty, so clearing the bit before filling FIFO does
    not cause an extra immediate assertion even if the FIFO is initially
    empty.
    
    This is hard to reproduce directly on a normal system, but inserting
    e.g. udelay(200) after cdns_uart_handle_tx(port), setting 4000000 baud,
    and then running "dd if=/dev/zero bs=128 of=/dev/ttyPS0 count=50"
    reliably reproduces the issue on my ZynqMP test system unless this fix
    is applied.
    
    Fixes: 85baf542d54e ("tty: xuartps: support 64 byte FIFO size")
    Signed-off-by: Anssi Hannula <anssi.hannula@bitwise.fi>
    Link: https://lore.kernel.org/r/20211026102741.2910441-1-anssi.hannula@bitwise.fi
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
index 23f9b0cdff08..c22bd40fc6f0 100644
--- a/drivers/tty/serial/xilinx_uartps.c
+++ b/drivers/tty/serial/xilinx_uartps.c
@@ -591,9 +591,10 @@ static void cdns_uart_start_tx(struct uart_port *port)
 	if (uart_circ_empty(&port->state->xmit))
 		return;
 
+	writel(CDNS_UART_IXR_TXEMPTY, port->membase + CDNS_UART_ISR);
+
 	cdns_uart_handle_tx(port);
 
-	writel(CDNS_UART_IXR_TXEMPTY, port->membase + CDNS_UART_ISR);
 	/* Enable the TX Empty interrupt */
 	writel(CDNS_UART_IXR_TXEMPTY, port->membase + CDNS_UART_IER);
 }

commit 470bc57fa228e667271a48668510ab54abe5c691
Author: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
Date:   Thu Sep 23 02:35:48 2021 +0300

    phy: qcom-qusb2: Fix a memory leak on probe
    
    [ Upstream commit bf7ffcd0069d30e2e7ba2b827f08c89f471cd1f3 ]
    
    On success nvmem_cell_read() returns a pointer to a dynamically allocated
    buffer, and therefore it shall be freed after usage.
    
    The issue is reported by kmemleak:
    
      # cat /sys/kernel/debug/kmemleak
      unreferenced object 0xffff3b3803e4b280 (size 128):
        comm "kworker/u16:1", pid 107, jiffies 4294892861 (age 94.120s)
        hex dump (first 32 bytes):
          00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
          00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        backtrace:
          [<000000007739afdc>] __kmalloc+0x27c/0x41c
          [<0000000071c0fbf8>] nvmem_cell_read+0x40/0xe0
          [<00000000e803ef1f>] qusb2_phy_init+0x258/0x5bc
          [<00000000fc81fcfa>] phy_init+0x70/0x110
          [<00000000e3d48a57>] dwc3_core_soft_reset+0x4c/0x234
          [<0000000027d1dbd4>] dwc3_core_init+0x68/0x990
          [<000000001965faf9>] dwc3_probe+0x4f4/0x730
          [<000000002f7617ca>] platform_probe+0x74/0xf0
          [<00000000a2576cac>] really_probe+0xc4/0x470
          [<00000000bc77f2c5>] __driver_probe_device+0x11c/0x190
          [<00000000130db71f>] driver_probe_device+0x48/0x110
          [<0000000019f36c2b>] __device_attach_driver+0xa4/0x140
          [<00000000e5812ff7>]  bus_for_each_drv+0x84/0xe0
          [<00000000f4bac574>] __device_attach+0xe4/0x1c0
          [<00000000d3beb631>] device_initial_probe+0x20/0x30
          [<000000008019b9db>] bus_probe_device+0xa4/0xb0
    
    Fixes: ca04d9d3e1b1 ("phy: qcom-qusb2: New driver for QUSB2 PHY on Qcom chips")
    Signed-off-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
    Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
    Link: https://lore.kernel.org/r/20210922233548.2150244-1-vladimir.zapolskiy@linaro.org
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/phy/qualcomm/phy-qcom-qusb2.c b/drivers/phy/qualcomm/phy-qcom-qusb2.c
index 9b7ae93e9df1..901f525c86e2 100644
--- a/drivers/phy/qualcomm/phy-qcom-qusb2.c
+++ b/drivers/phy/qualcomm/phy-qcom-qusb2.c
@@ -395,7 +395,7 @@ static void qusb2_phy_set_tune2_param(struct qusb2_phy *qphy)
 {
 	struct device *dev = &qphy->phy->dev;
 	const struct qusb2_phy_cfg *cfg = qphy->cfg;
-	u8 *val;
+	u8 *val, hstx_trim;
 
 	/* efuse register is optional */
 	if (!qphy->cell)
@@ -409,7 +409,13 @@ static void qusb2_phy_set_tune2_param(struct qusb2_phy *qphy)
 	 * set while configuring the phy.
 	 */
 	val = nvmem_cell_read(qphy->cell, NULL);
-	if (IS_ERR(val) || !val[0]) {
+	if (IS_ERR(val)) {
+		dev_dbg(dev, "failed to read a valid hs-tx trim value\n");
+		return;
+	}
+	hstx_trim = val[0];
+	kfree(val);
+	if (!hstx_trim) {
 		dev_dbg(dev, "failed to read a valid hs-tx trim value\n");
 		return;
 	}
@@ -417,12 +423,10 @@ static void qusb2_phy_set_tune2_param(struct qusb2_phy *qphy)
 	/* Fused TUNE1/2 value is the higher nibble only */
 	if (cfg->update_tune1_with_efuse)
 		qusb2_write_mask(qphy->base, cfg->regs[QUSB2PHY_PORT_TUNE1],
-				 val[0] << HSTX_TRIM_SHIFT,
-				 HSTX_TRIM_MASK);
+				 hstx_trim << HSTX_TRIM_SHIFT, HSTX_TRIM_MASK);
 	else
 		qusb2_write_mask(qphy->base, cfg->regs[QUSB2PHY_PORT_TUNE2],
-				 val[0] << HSTX_TRIM_SHIFT,
-				 HSTX_TRIM_MASK);
+				 hstx_trim << HSTX_TRIM_SHIFT, HSTX_TRIM_MASK);
 }
 
 static int qusb2_phy_set_mode(struct phy *phy, enum phy_mode mode)

commit e4a22aeaadf556afa6622a0e17c657b880221288
Author: Richard Fitzgerald <rf@opensource.cirrus.com>
Date:   Fri Oct 15 14:36:08 2021 +0100

    ASoC: cs42l42: Defer probe if request_threaded_irq() returns EPROBE_DEFER
    
    [ Upstream commit 0306988789d9d91a18ff70bd2bf165d3ae0ef1dd ]
    
    The driver can run without an interrupt so if devm_request_threaded_irq()
    failed, the probe() just carried on. But if this was EPROBE_DEFER the
    driver would continue without an interrupt instead of deferring to wait
    for the interrupt to become available.
    
    Fixes: 2c394ca79604 ("ASoC: Add support for CS42L42 codec")
    Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
    Link: https://lore.kernel.org/r/20211015133619.4698-6-rf@opensource.cirrus.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/codecs/cs42l42.c b/sound/soc/codecs/cs42l42.c
index f9d6534d4632..9471ba17e371 100644
--- a/sound/soc/codecs/cs42l42.c
+++ b/sound/soc/codecs/cs42l42.c
@@ -1799,8 +1799,9 @@ static int cs42l42_i2c_probe(struct i2c_client *i2c_client,
 			NULL, cs42l42_irq_thread,
 			IRQF_ONESHOT | IRQF_TRIGGER_LOW,
 			"cs42l42", cs42l42);
-
-	if (ret != 0)
+	if (ret == -EPROBE_DEFER)
+		goto err_disable;
+	else if (ret != 0)
 		dev_err(&i2c_client->dev,
 			"Failed to request IRQ: %d\n", ret);
 

commit 699758d0cad92189579349f658d469a205032556
Author: Richard Fitzgerald <rf@opensource.cirrus.com>
Date:   Fri Oct 15 14:36:06 2021 +0100

    ASoC: cs42l42: Correct some register default values
    
    [ Upstream commit d591d4b32aa9552af14a0c7c586a2d3fe9ecc6e0 ]
    
    Some registers had wrong default values in cs42l42_reg_defaults[].
    
    Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
    Fixes: 2c394ca79604 ("ASoC: Add support for CS42L42 codec")
    Link: https://lore.kernel.org/r/20211015133619.4698-4-rf@opensource.cirrus.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/codecs/cs42l42.c b/sound/soc/codecs/cs42l42.c
index 4cb3e11c66af..f9d6534d4632 100644
--- a/sound/soc/codecs/cs42l42.c
+++ b/sound/soc/codecs/cs42l42.c
@@ -95,7 +95,7 @@ static const struct reg_default cs42l42_reg_defaults[] = {
 	{ CS42L42_ASP_RX_INT_MASK,		0x1F },
 	{ CS42L42_ASP_TX_INT_MASK,		0x0F },
 	{ CS42L42_CODEC_INT_MASK,		0x03 },
-	{ CS42L42_SRCPL_INT_MASK,		0xFF },
+	{ CS42L42_SRCPL_INT_MASK,		0x7F },
 	{ CS42L42_VPMON_INT_MASK,		0x01 },
 	{ CS42L42_PLL_LOCK_INT_MASK,		0x01 },
 	{ CS42L42_TSRS_PLUG_INT_MASK,		0x0F },
@@ -132,7 +132,7 @@ static const struct reg_default cs42l42_reg_defaults[] = {
 	{ CS42L42_MIXER_CHA_VOL,		0x3F },
 	{ CS42L42_MIXER_ADC_VOL,		0x3F },
 	{ CS42L42_MIXER_CHB_VOL,		0x3F },
-	{ CS42L42_EQ_COEF_IN0,			0x22 },
+	{ CS42L42_EQ_COEF_IN0,			0x00 },
 	{ CS42L42_EQ_COEF_IN1,			0x00 },
 	{ CS42L42_EQ_COEF_IN2,			0x00 },
 	{ CS42L42_EQ_COEF_IN3,			0x00 },

commit 84f332e7d006a5dd7a0b6e98d9abda060f17eb53
Author: Leon Romanovsky <leonro@nvidia.com>
Date:   Tue Oct 12 10:28:43 2021 +0300

    RDMA/mlx4: Return missed an error if device doesn't support steering
    
    [ Upstream commit f4e56ec4452f48b8292dcf0e1c4bdac83506fb8b ]
    
    The error flow fixed in this patch is not possible because all kernel
    users of create QP interface check that device supports steering before
    set IB_QP_CREATE_NETIF_QP flag.
    
    Fixes: c1c98501121e ("IB/mlx4: Add support for steerable IB UD QPs")
    Link: https://lore.kernel.org/r/91c61f6e60eb0240f8bbc321fda7a1d2986dd03c.1634023677.git.leonro@nvidia.com
    Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c
index 73bd35d34a25..7209b8a9b0dd 100644
--- a/drivers/infiniband/hw/mlx4/qp.c
+++ b/drivers/infiniband/hw/mlx4/qp.c
@@ -1057,8 +1057,10 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd,
 			if (dev->steering_support ==
 			    MLX4_STEERING_MODE_DEVICE_MANAGED)
 				qp->flags |= MLX4_IB_QP_NETIF;
-			else
+			else {
+				err = -EINVAL;
 				goto err;
+			}
 		}
 
 		err = set_kernel_sq_size(dev, &init_attr->cap, qp_type, qp);

commit b459cb94329e1739c403227b7a91c08cc9af224c
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Wed Oct 6 10:32:43 2021 +0300

    scsi: csiostor: Uninitialized data in csio_ln_vnp_read_cbfn()
    
    [ Upstream commit f4875d509a0a78ad294a1a538d534b5ba94e685a ]
    
    This variable is just a temporary variable, used to do an endian
    conversion.  The problem is that the last byte is not initialized.  After
    the conversion is completely done, the last byte is discarded so it doesn't
    cause a problem.  But static checkers and the KMSan runtime checker can
    detect the uninitialized read and will complain about it.
    
    Link: https://lore.kernel.org/r/20211006073242.GA8404@kili
    Fixes: 5036f0a0ecd3 ("[SCSI] csiostor: Fix sparse warnings.")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/csiostor/csio_lnode.c b/drivers/scsi/csiostor/csio_lnode.c
index a8e29e3d3572..98944fb3f0b8 100644
--- a/drivers/scsi/csiostor/csio_lnode.c
+++ b/drivers/scsi/csiostor/csio_lnode.c
@@ -619,7 +619,7 @@ csio_ln_vnp_read_cbfn(struct csio_hw *hw, struct csio_mb *mbp)
 	struct fc_els_csp *csp;
 	struct fc_els_cssp *clsp;
 	enum fw_retval retval;
-	__be32 nport_id;
+	__be32 nport_id = 0;
 
 	retval = FW_CMD_RETVAL_G(ntohl(rsp->alloc_to_len16));
 	if (retval != FW_SUCCESS) {

commit 7f5c2c6e8ee0cc16be4e2fae26d3293591f48266
Author: Jakob Hauser <jahau@rocketmail.com>
Date:   Fri Oct 8 10:32:45 2021 +0200

    power: supply: rt5033_battery: Change voltage values to µV
    
    [ Upstream commit bf895295e9a73411889816f1a0c1f4f1a2d9c678 ]
    
    Currently the rt5033_battery driver provides voltage values in mV. It
    should be µV as stated in Documentation/power/power_supply_class.rst.
    
    Fixes: b847dd96e659 ("power: rt5033_battery: Add RT5033 Fuel gauge device driver")
    Cc: Beomho Seo <beomho.seo@samsung.com>
    Cc: Chanwoo Choi <cw00.choi@samsung.com>
    Signed-off-by: Jakob Hauser <jahau@rocketmail.com>
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/power/supply/rt5033_battery.c b/drivers/power/supply/rt5033_battery.c
index 9310b85f3405..7eec7014086d 100644
--- a/drivers/power/supply/rt5033_battery.c
+++ b/drivers/power/supply/rt5033_battery.c
@@ -63,7 +63,7 @@ static int rt5033_battery_get_watt_prop(struct i2c_client *client,
 	regmap_read(battery->regmap, regh, &msb);
 	regmap_read(battery->regmap, regl, &lsb);
 
-	ret = ((msb << 4) + (lsb >> 4)) * 1250 / 1000;
+	ret = ((msb << 4) + (lsb >> 4)) * 1250;
 
 	return ret;
 }

commit c318dc98e019c5addea1eea6388d6f0c81226ac4
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Mon Oct 11 15:37:39 2021 +0300

    usb: gadget: hid: fix error code in do_config()
    
    [ Upstream commit 68e7c510fdf4f6167404609da52e1979165649f6 ]
    
    Return an error code if usb_get_function() fails.  Don't return success.
    
    Fixes: 4bc8a33f2407 ("usb: gadget: hid: convert to new interface of f_hid")
    Acked-by: Felipe Balbi <balbi@kernel.org>
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Link: https://lore.kernel.org/r/20211011123739.GC15188@kili
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/legacy/hid.c b/drivers/usb/gadget/legacy/hid.c
index 5b27d289443f..3912cc805f3a 100644
--- a/drivers/usb/gadget/legacy/hid.c
+++ b/drivers/usb/gadget/legacy/hid.c
@@ -99,8 +99,10 @@ static int do_config(struct usb_configuration *c)
 
 	list_for_each_entry(e, &hidg_func_list, node) {
 		e->f = usb_get_function(e->fi);
-		if (IS_ERR(e->f))
+		if (IS_ERR(e->f)) {
+			status = PTR_ERR(e->f);
 			goto put;
+		}
 		status = usb_add_function(c, e->f);
 		if (status < 0) {
 			usb_put_function(e->f);

commit 7dcbeeda147dfabd02b272fc569e8646ff7d4ee1
Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date:   Tue Oct 5 16:45:16 2021 +0300

    serial: 8250_dw: Drop wrong use of ACPI_PTR()
    
    [ Upstream commit ebabb77a2a115b6c5e68f7364b598310b5f61fb2 ]
    
    ACPI_PTR() is more harmful than helpful. For example, in this case
    if CONFIG_ACPI=n, the ID table left unused which is not what we want.
    
    Instead of adding ifdeffery here and there, drop ACPI_PTR().
    
    Fixes: 6a7320c4669f ("serial: 8250_dw: Add ACPI 5.0 support")
    Reported-by: Daniel Palmer <daniel@0x0f.com>
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Link: https://lore.kernel.org/r/20211005134516.23218-1-andriy.shevchenko@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c
index 284e8d052fc3..c73d0eddd9b8 100644
--- a/drivers/tty/serial/8250/8250_dw.c
+++ b/drivers/tty/serial/8250/8250_dw.c
@@ -769,7 +769,7 @@ static struct platform_driver dw8250_platform_driver = {
 		.name		= "dw-apb-uart",
 		.pm		= &dw8250_pm_ops,
 		.of_match_table	= dw8250_of_match,
-		.acpi_match_table = ACPI_PTR(dw8250_acpi_match),
+		.acpi_match_table = dw8250_acpi_match,
 	},
 	.probe			= dw8250_probe,
 	.remove			= dw8250_remove,

commit c0a88a2b68ce12a1bcd25ad2e0656a4dc747e944
Author: Christophe Leroy <christophe.leroy@csgroup.eu>
Date:   Wed Sep 15 15:34:35 2021 +0200

    video: fbdev: chipsfb: use memset_io() instead of memset()
    
    [ Upstream commit f2719b26ae27282c145202ffd656d5ff1fe737cc ]
    
    While investigating a lockup at startup on Powerbook 3400C, it was
    identified that the fbdev driver generates alignment exception at
    startup:
    
      --- interrupt: 600 at memset+0x60/0xc0
      NIP:  c0021414 LR: c03fc49c CTR: 00007fff
      REGS: ca021c10 TRAP: 0600   Tainted: G        W          (5.14.2-pmac-00727-g12a41fa69492)
      MSR:  00009032 <EE,ME,IR,DR,RI>  CR: 44008442  XER: 20000100
      DAR: cab80020 DSISR: 00017c07
      GPR00: 00000007 ca021cd0 c14412e0 cab80000 00000000 00100000 cab8001c 00000004
      GPR08: 00100000 00007fff 00000000 00000000 84008442 00000000 c0006fb4 00000000
      GPR16: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00100000
      GPR24: 00000000 81800000 00000320 c15fa400 c14d1878 00000000 c14d1800 c094e19c
      NIP [c0021414] memset+0x60/0xc0
      LR [c03fc49c] chipsfb_pci_init+0x160/0x580
      --- interrupt: 600
      [ca021cd0] [c03fc46c] chipsfb_pci_init+0x130/0x580 (unreliable)
      [ca021d20] [c03a3a70] pci_device_probe+0xf8/0x1b8
      [ca021d50] [c043d584] really_probe.part.0+0xac/0x388
      [ca021d70] [c043d914] __driver_probe_device+0xb4/0x170
      [ca021d90] [c043da18] driver_probe_device+0x48/0x144
      [ca021dc0] [c043e318] __driver_attach+0x11c/0x1c4
      [ca021de0] [c043ad30] bus_for_each_dev+0x88/0xf0
      [ca021e10] [c043c724] bus_add_driver+0x190/0x22c
      [ca021e40] [c043ee94] driver_register+0x9c/0x170
      [ca021e60] [c0006c28] do_one_initcall+0x54/0x1ec
      [ca021ed0] [c08246e4] kernel_init_freeable+0x1c0/0x270
      [ca021f10] [c0006fdc] kernel_init+0x28/0x11c
      [ca021f30] [c0017148] ret_from_kernel_thread+0x14/0x1c
      Instruction dump:
      7d4601a4 39490777 7d4701a4 39490888 7d4801a4 39490999 7d4901a4 39290aaa
      7d2a01a4 4c00012c 4bfffe88 0fe00000 <4bfffe80> 9421fff0 38210010 48001970
    
    This is due to 'dcbz' instruction being used on non-cached memory.
    'dcbz' instruction is used by memset() to zeroize a complete
    cacheline at once, and memset() is not expected to be used on non
    cached memory.
    
    When performing a 'sparse' check on fbdev driver, it also appears
    that the use of memset() is unexpected:
    
      drivers/video/fbdev/chipsfb.c:334:17: warning: incorrect type in argument 1 (different address spaces)
      drivers/video/fbdev/chipsfb.c:334:17:    expected void *
      drivers/video/fbdev/chipsfb.c:334:17:    got char [noderef] __iomem *screen_base
      drivers/video/fbdev/chipsfb.c:334:15: warning: memset with byte count of 1048576
    
    Use fb_memset() instead of memset(). fb_memset() is defined as
    memset_io() for powerpc.
    
    Fixes: 8c8709334cec ("[PATCH] ppc32: Remove CONFIG_PMAC_PBOOK")
    Reported-by: Stan Johnson <userm57@yahoo.com>
    Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/884a54f1e5cb774c1d9b4db780209bee5d4f6718.1631712563.git.christophe.leroy@csgroup.eu
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/video/fbdev/chipsfb.c b/drivers/video/fbdev/chipsfb.c
index f9b366d17587..413b465e69d8 100644
--- a/drivers/video/fbdev/chipsfb.c
+++ b/drivers/video/fbdev/chipsfb.c
@@ -332,7 +332,7 @@ static const struct fb_var_screeninfo chipsfb_var = {
 
 static void init_chips(struct fb_info *p, unsigned long addr)
 {
-	memset(p->screen_base, 0, 0x100000);
+	fb_memset(p->screen_base, 0, 0x100000);
 
 	p->fix = chipsfb_fix;
 	p->fix.smem_start = addr;

commit 07d98e866a8bd9daa1afd2d1dece93f838947404
Author: Dongliang Mu <mudongliangabcd@gmail.com>
Date:   Sat Sep 25 23:14:32 2021 +0800

    memory: fsl_ifc: fix leak of irq and nand_irq in fsl_ifc_ctrl_probe
    
    [ Upstream commit 4ed2f3545c2e5acfbccd7f85fea5b1a82e9862d7 ]
    
    The error handling code of fsl_ifc_ctrl_probe is problematic. When
    fsl_ifc_ctrl_init fails or request_irq of fsl_ifc_ctrl_dev->irq fails,
    it forgets to free the irq and nand_irq. Meanwhile, if request_irq of
    fsl_ifc_ctrl_dev->nand_irq fails, it will still free nand_irq even if
    the request_irq is not successful.
    
    Fix this by refactoring the error handling code.
    
    Fixes: d2ae2e20fbdd ("driver/memory:Move Freescale IFC driver to a common driver")
    Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Link: https://lore.kernel.org/r/20210925151434.8170-1-mudongliangabcd@gmail.com
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/memory/fsl_ifc.c b/drivers/memory/fsl_ifc.c
index 38b945eb410f..9c0e70b047c3 100644
--- a/drivers/memory/fsl_ifc.c
+++ b/drivers/memory/fsl_ifc.c
@@ -276,7 +276,7 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
 
 	ret = fsl_ifc_ctrl_init(fsl_ifc_ctrl_dev);
 	if (ret < 0)
-		goto err;
+		goto err_unmap_nandirq;
 
 	init_waitqueue_head(&fsl_ifc_ctrl_dev->nand_wait);
 
@@ -285,7 +285,7 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
 	if (ret != 0) {
 		dev_err(&dev->dev, "failed to install irq (%d)\n",
 			fsl_ifc_ctrl_dev->irq);
-		goto err_irq;
+		goto err_unmap_nandirq;
 	}
 
 	if (fsl_ifc_ctrl_dev->nand_irq) {
@@ -294,17 +294,16 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
 		if (ret != 0) {
 			dev_err(&dev->dev, "failed to install irq (%d)\n",
 				fsl_ifc_ctrl_dev->nand_irq);
-			goto err_nandirq;
+			goto err_free_irq;
 		}
 	}
 
 	return 0;
 
-err_nandirq:
-	free_irq(fsl_ifc_ctrl_dev->nand_irq, fsl_ifc_ctrl_dev);
-	irq_dispose_mapping(fsl_ifc_ctrl_dev->nand_irq);
-err_irq:
+err_free_irq:
 	free_irq(fsl_ifc_ctrl_dev->irq, fsl_ifc_ctrl_dev);
+err_unmap_nandirq:
+	irq_dispose_mapping(fsl_ifc_ctrl_dev->nand_irq);
 	irq_dispose_mapping(fsl_ifc_ctrl_dev->irq);
 err:
 	iounmap(fsl_ifc_ctrl_dev->gregs);

commit 82d6011a26758a9cde896f1ed9b5de36f885872e
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Sun Jun 27 17:54:31 2021 +0200

    soc/tegra: Fix an error handling path in tegra_powergate_power_up()
    
    [ Upstream commit 986b5094708e508baa452a23ffe809870934a7df ]
    
    If an error occurs after a successful tegra_powergate_enable_clocks()
    call, it must be undone by a tegra_powergate_disable_clocks() call, as
    already done in the below and above error handling paths of this function.
    
    Update the 'goto' to branch at the correct place of the error handling
    path.
    
    Fixes: a38045121bf4 ("soc/tegra: pmc: Add generic PM domain support")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Reviewed-by: Jon Hunter <jonathanh@nvidia.com>
    Signed-off-by: Thierry Reding <treding@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c
index f17a67815404..6c57e43787cb 100644
--- a/drivers/soc/tegra/pmc.c
+++ b/drivers/soc/tegra/pmc.c
@@ -408,7 +408,7 @@ static int tegra_powergate_power_up(struct tegra_powergate *pg,
 
 	err = reset_control_deassert(pg->reset);
 	if (err)
-		goto powergate_off;
+		goto disable_clks;
 
 	usleep_range(10, 20);
 

commit a3ea303e4a921cb3d1e81f280c6965638970823f
Author: Andreas Kemnade <andreas@kemnade.info>
Date:   Fri Oct 1 09:34:15 2021 +0200

    arm: dts: omap3-gta04a4: accelerometer irq fix
    
    [ Upstream commit 884ea75d79a36faf3731ad9d6b9c29f58697638d ]
    
    Fix typo in pinctrl. It did only work because the bootloader
    seems to have initialized it.
    
    Fixes: ee327111953b ("ARM: dts: omap3-gta04: Define and use bma180 irq pin")
    Signed-off-by: Andreas Kemnade <andreas@kemnade.info>
    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/omap3-gta04.dtsi b/arch/arm/boot/dts/omap3-gta04.dtsi
index 0c39a2340030..a5aed92ab54b 100644
--- a/arch/arm/boot/dts/omap3-gta04.dtsi
+++ b/arch/arm/boot/dts/omap3-gta04.dtsi
@@ -364,7 +364,7 @@
 		compatible = "bosch,bma180";
 		reg = <0x41>;
 		pinctrl-names = "default";
-		pintcrl-0 = <&bma180_pins>;
+		pinctrl-0 = <&bma180_pins>;
 		interrupt-parent = <&gpio4>;
 		interrupts = <19 IRQ_TYPE_LEVEL_HIGH>; /* GPIO_115 */
 	};

commit 7c37a45df40fc51adaf024f4fbc0e862613a6120
Author: Takashi Iwai <tiwai@suse.de>
Date:   Wed Sep 29 09:29:33 2021 +0200

    ALSA: hda: Reduce udelay() at SKL+ position reporting
    
    [ Upstream commit 46243b85b0ec5d2cee7545e5ce18c015ce91957e ]
    
    The position reporting on Intel Skylake and later chips via
    azx_get_pos_skl() contains a udelay(20) call for the capture streams.
    A call for this alone doesn't sound too harmful.  However, as the
    pointer PCM ops is one of the hottest path in the PCM operations --
    especially for the timer-scheduled operations like PulseAudio -- such
    a delay hogs CPU usage significantly in the total performance.
    
    The code there was taken from the original code in ASoC SST Skylake
    driver blindly.  The udelay() is a workaround for the case where the
    reported position is behind the period boundary at the timing
    triggered from interrupts; applications often expect that the full
    data is available for the whole period when returned (and also that's
    the definition of the ALSA PCM period).
    
    OTOH, HD-audio (legacy) driver has already some workarounds for the
    delayed position reporting due to its relatively large FIFO, such as
    the BDL position adjustment and the delayed period-elapsed call in the
    work.  That said, the udelay() is almost superfluous for HD-audio
    driver unlike SST, and we can drop the udelay().
    
    Though, the current code doesn't guarantee the full period readiness
    as mentioned in the above, but rather it checks the wallclock and
    detects the unexpected jump.  That's one missing piece, and the drop
    of udelay() needs a bit more sanity checks for the delayed handling.
    
    This patch implements those: the drop of udelay() call in
    azx_get_pos_skl() and the more proper check of hwptr in
    azx_position_ok().  The latter change is applied only for the case
    where the stream is running in the normal mode without
    no_period_wakeup flag.  When no_period_wakeup is set, it essentially
    ignores the period handling and rather concentrates only on the
    current position; which implies that we don't need to care about the
    period boundary at all.
    
    Fixes: f87e7f25893d ("ALSA: hda - Improved position reporting on SKL+")
    Reported-by: Jens Axboe <axboe@kernel.dk>
    Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Link: https://lore.kernel.org/r/20210929072934.6809-2-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index 2cd8bfd5293b..7d4b6c31dfe7 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -743,13 +743,17 @@ static int azx_intel_link_power(struct azx *chip, bool enable)
  * the update-IRQ timing.  The IRQ is issued before actually the
  * data is processed.  So, we need to process it afterwords in a
  * workqueue.
+ *
+ * Returns 1 if OK to proceed, 0 for delay handling, -1 for skipping update
  */
 static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev)
 {
 	struct snd_pcm_substream *substream = azx_dev->core.substream;
+	struct snd_pcm_runtime *runtime = substream->runtime;
 	int stream = substream->stream;
 	u32 wallclk;
 	unsigned int pos;
+	snd_pcm_uframes_t hwptr, target;
 
 	wallclk = azx_readl(chip, WALLCLK) - azx_dev->core.start_wallclk;
 	if (wallclk < (azx_dev->core.period_wallclk * 2) / 3)
@@ -786,6 +790,24 @@ static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev)
 		/* NG - it's below the first next period boundary */
 		return chip->bdl_pos_adj ? 0 : -1;
 	azx_dev->core.start_wallclk += wallclk;
+
+	if (azx_dev->core.no_period_wakeup)
+		return 1; /* OK, no need to check period boundary */
+
+	if (runtime->hw_ptr_base != runtime->hw_ptr_interrupt)
+		return 1; /* OK, already in hwptr updating process */
+
+	/* check whether the period gets really elapsed */
+	pos = bytes_to_frames(runtime, pos);
+	hwptr = runtime->hw_ptr_base + pos;
+	if (hwptr < runtime->status->hw_ptr)
+		hwptr += runtime->buffer_size;
+	target = runtime->hw_ptr_interrupt + runtime->period_size;
+	if (hwptr < target) {
+		/* too early wakeup, process it later */
+		return chip->bdl_pos_adj ? 0 : -1;
+	}
+
 	return 1; /* OK, it's fine */
 }
 
@@ -983,11 +1005,7 @@ static unsigned int azx_get_pos_skl(struct azx *chip, struct azx_dev *azx_dev)
 	if (azx_dev->core.substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
 		return azx_skl_get_dpib_pos(chip, azx_dev);
 
-	/* For capture, we need to read posbuf, but it requires a delay
-	 * for the possible boundary overlap; the read of DPIB fetches the
-	 * actual posbuf
-	 */
-	udelay(20);
+	/* read of DPIB fetches the actual posbuf */
 	azx_skl_get_dpib_pos(chip, azx_dev);
 	return azx_get_pos_posbuf(chip, azx_dev);
 }

commit a30503f74353ca48c02963437679537a96271bdc
Author: Dongliang Mu <mudongliangabcd@gmail.com>
Date:   Sat Sep 4 10:37:41 2021 +0800

    JFS: fix memleak in jfs_mount
    
    [ Upstream commit c48a14dca2cb57527dde6b960adbe69953935f10 ]
    
    In jfs_mount, when diMount(ipaimap2) fails, it goes to errout35. However,
    the following code does not free ipaimap2 allocated by diReadSpecial.
    
    Fix this by refactoring the error handling code of jfs_mount. To be
    specific, modify the lable name and free ipaimap2 when the above error
    ocurrs.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/jfs/jfs_mount.c b/fs/jfs/jfs_mount.c
index b5214c9ac47a..f1a705d15904 100644
--- a/fs/jfs/jfs_mount.c
+++ b/fs/jfs/jfs_mount.c
@@ -93,14 +93,14 @@ int jfs_mount(struct super_block *sb)
 	 * (initialize mount inode from the superblock)
 	 */
 	if ((rc = chkSuper(sb))) {
-		goto errout20;
+		goto out;
 	}
 
 	ipaimap = diReadSpecial(sb, AGGREGATE_I, 0);
 	if (ipaimap == NULL) {
 		jfs_err("jfs_mount: Failed to read AGGREGATE_I");
 		rc = -EIO;
-		goto errout20;
+		goto out;
 	}
 	sbi->ipaimap = ipaimap;
 
@@ -111,7 +111,7 @@ int jfs_mount(struct super_block *sb)
 	 */
 	if ((rc = diMount(ipaimap))) {
 		jfs_err("jfs_mount: diMount(ipaimap) failed w/rc = %d", rc);
-		goto errout21;
+		goto err_ipaimap;
 	}
 
 	/*
@@ -120,7 +120,7 @@ int jfs_mount(struct super_block *sb)
 	ipbmap = diReadSpecial(sb, BMAP_I, 0);
 	if (ipbmap == NULL) {
 		rc = -EIO;
-		goto errout22;
+		goto err_umount_ipaimap;
 	}
 
 	jfs_info("jfs_mount: ipbmap:0x%p", ipbmap);
@@ -132,7 +132,7 @@ int jfs_mount(struct super_block *sb)
 	 */
 	if ((rc = dbMount(ipbmap))) {
 		jfs_err("jfs_mount: dbMount failed w/rc = %d", rc);
-		goto errout22;
+		goto err_ipbmap;
 	}
 
 	/*
@@ -151,7 +151,7 @@ int jfs_mount(struct super_block *sb)
 		if (!ipaimap2) {
 			jfs_err("jfs_mount: Failed to read AGGREGATE_I");
 			rc = -EIO;
-			goto errout35;
+			goto err_umount_ipbmap;
 		}
 		sbi->ipaimap2 = ipaimap2;
 
@@ -163,7 +163,7 @@ int jfs_mount(struct super_block *sb)
 		if ((rc = diMount(ipaimap2))) {
 			jfs_err("jfs_mount: diMount(ipaimap2) failed, rc = %d",
 				rc);
-			goto errout35;
+			goto err_ipaimap2;
 		}
 	} else
 		/* Secondary aggregate inode table is not valid */
@@ -180,7 +180,7 @@ int jfs_mount(struct super_block *sb)
 		jfs_err("jfs_mount: Failed to read FILESYSTEM_I");
 		/* open fileset secondary inode allocation map */
 		rc = -EIO;
-		goto errout40;
+		goto err_umount_ipaimap2;
 	}
 	jfs_info("jfs_mount: ipimap:0x%p", ipimap);
 
@@ -190,41 +190,34 @@ int jfs_mount(struct super_block *sb)
 	/* initialize fileset inode allocation map */
 	if ((rc = diMount(ipimap))) {
 		jfs_err("jfs_mount: diMount failed w/rc = %d", rc);
-		goto errout41;
+		goto err_ipimap;
 	}
 
-	goto out;
+	return rc;
 
 	/*
 	 *	unwind on error
 	 */
-      errout41:		/* close fileset inode allocation map inode */
+err_ipimap:
+	/* close fileset inode allocation map inode */
 	diFreeSpecial(ipimap);
-
-      errout40:		/* fileset closed */
-
+err_umount_ipaimap2:
 	/* close secondary aggregate inode allocation map */
-	if (ipaimap2) {
+	if (ipaimap2)
 		diUnmount(ipaimap2, 1);
+err_ipaimap2:
+	/* close aggregate inodes */
+	if (ipaimap2)
 		diFreeSpecial(ipaimap2);
-	}
-
-      errout35:
-
-	/* close aggregate block allocation map */
+err_umount_ipbmap:	/* close aggregate block allocation map */
 	dbUnmount(ipbmap, 1);
+err_ipbmap:		/* close aggregate inodes */
 	diFreeSpecial(ipbmap);
-
-      errout22:		/* close aggregate inode allocation map */
-
+err_umount_ipaimap:	/* close aggregate inode allocation map */
 	diUnmount(ipaimap, 1);
-
-      errout21:		/* close aggregate inodes */
+err_ipaimap:		/* close aggregate inodes */
 	diFreeSpecial(ipaimap);
-      errout20:		/* aggregate closed */
-
-      out:
-
+out:
 	if (rc)
 		jfs_err("Mount JFS Failure: %d", rc);
 

commit f046b1493e4cb597a176f4e06168ca389353ee89
Author: Jackie Liu <liuyun01@kylinos.cn>
Date:   Mon Sep 13 14:19:08 2021 +0800

    MIPS: loongson64: make CPU_LOONGSON64 depends on MIPS_FP_SUPPORT
    
    [ Upstream commit 7f3b3c2bfa9c93ab9b5595543496f570983dc330 ]
    
    mach/loongson64 fails to build when the FPU support is disabled:
    
    arch/mips/loongson64/cop2-ex.c:45:15: error: implicit declaration of function ?__is_fpu_owner?? did you mean ?is_fpu_owner?? [-Werror=implicit-function-declaration]
    arch/mips/loongson64/cop2-ex.c:98:30: error: ?struct thread_struct??has no member named ?fpu??    arch/mips/loongson64/cop2-ex.c:99:30: error: ?struct thread_struct??has no member named ?fpu??    arch/mips/loongson64/cop2-ex.c:131:43: error: ?struct thread_struct??has no member named ?fpu??    arch/mips/loongson64/cop2-ex.c:137:38: error: ?struct thread_struct??has no member named ?fpu??    arch/mips/loongson64/cop2-ex.c:203:30: error: ?struct thread_struct??has no member named ?fpu??    arch/mips/loongson64/cop2-ex.c:219:30: error: ?struct thread_struct??has no member named ?fpu??    arch/mips/loongson64/cop2-ex.c:283:38: error: ?struct thread_struct??has no member named ?fpu??    arch/mips/loongson64/cop2-ex.c:301:38: error: ?struct thread_struct??has no member named ?fpu??    
    Fixes: ef2f826c8f2f ("MIPS: Loongson-3: Enable the COP2 usage")
    Suggested-by: Huacai Chen <chenhuacai@kernel.org>
    Reviewed-by: Huacai Chen <chenhuacai@kernel.org>
    Reported-by: k2ci robot <kernel-bot@kylinos.cn>
    Signed-off-by: Jackie Liu <liuyun01@kylinos.cn>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index cc8c8d22afaf..fb8554c41e80 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -1375,6 +1375,7 @@ config CPU_LOONGSON3
 	select WEAK_REORDERING_BEYOND_LLSC
 	select MIPS_PGD_C0_CONTEXT
 	select MIPS_L1_CACHE_SHIFT_6
+	select MIPS_FP_SUPPORT
 	select GPIOLIB
 	select SWIOTLB
 	help

commit ddb0de839c3477c8c014c461c26a36261319f93c
Author: Tong Zhang <ztong0001@gmail.com>
Date:   Mon Sep 6 21:07:02 2021 -0700

    scsi: dc395: Fix error case unwinding
    
    [ Upstream commit cbd9a3347c757383f3d2b50cf7cfd03eb479c481 ]
    
    dc395x_init_one()->adapter_init() might fail. In this case, the acb is
    already cleaned up by adapter_init(), no need to do that in
    adapter_uninit(acb) again.
    
    [    1.252251] dc395x: adapter init failed
    [    1.254900] RIP: 0010:adapter_uninit+0x94/0x170 [dc395x]
    [    1.260307] Call Trace:
    [    1.260442]  dc395x_init_one.cold+0x72a/0x9bb [dc395x]
    
    Link: https://lore.kernel.org/r/20210907040702.1846409-1-ztong0001@gmail.com
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reviewed-by: Finn Thain <fthain@linux-m68k.org>
    Signed-off-by: Tong Zhang <ztong0001@gmail.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/dc395x.c b/drivers/scsi/dc395x.c
index 3943347ec3c7..16b9dc2fff6b 100644
--- a/drivers/scsi/dc395x.c
+++ b/drivers/scsi/dc395x.c
@@ -4805,6 +4805,7 @@ static int dc395x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 	/* initialise the adapter and everything we need */
  	if (adapter_init(acb, io_port_base, io_port_len, irq)) {
 		dprintkl(KERN_INFO, "adapter init failed\n");
+		acb = NULL;
 		goto fail;
 	}
 

commit 55a263f43316302636f45bf9338df5f433ec485c
Author: Peter Rosin <peda@axentia.se>
Date:   Mon Sep 20 22:37:38 2021 +0200

    ARM: dts: at91: tse850: the emac<->phy interface is rmii
    
    [ Upstream commit dcdbc335a91a26e022a803e1a6b837266989c032 ]
    
    This went unnoticed until commit 7897b071ac3b ("net: macb: convert
    to phylink") which tickled the problem. The sama5d3 emac has never
    been capable of rgmii, and it all just happened to work before that
    commit.
    
    Fixes: 21dd0ece34c2 ("ARM: dts: at91: add devicetree for the Axentia TSE-850")
    Signed-off-by: Peter Rosin <peda@axentia.se>
    Signed-off-by: Nicolas Ferre <nicolas.ferre@microchip.com>
    Link: https://lore.kernel.org/r/ea781f5e-422f-6cbf-3cf4-d5a7bac9392d@axentia.se
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/at91-tse850-3.dts b/arch/arm/boot/dts/at91-tse850-3.dts
index 2fbec69d9cd6..6b2be520066e 100644
--- a/arch/arm/boot/dts/at91-tse850-3.dts
+++ b/arch/arm/boot/dts/at91-tse850-3.dts
@@ -269,7 +269,7 @@
 &macb1 {
 	status = "okay";
 
-	phy-mode = "rgmii";
+	phy-mode = "rmii";
 
 	#address-cells = <1>;
 	#size-cells = <0>;

commit aae9beb26b0c998aaad624f903af07d5f717c1eb
Author: Selvin Xavier <selvin.xavier@broadcom.com>
Date:   Wed Sep 15 05:32:38 2021 -0700

    RDMA/bnxt_re: Fix query SRQ failure
    
    [ Upstream commit 598d16fa1bf93431ad35bbab3ed1affe4fb7b562 ]
    
    Fill the missing parameters for the FW command while querying SRQ.
    
    Fixes: 37cb11acf1f7 ("RDMA/bnxt_re: Add SRQ support for Broadcom adapters")
    Link: https://lore.kernel.org/r/1631709163-2287-8-git-send-email-selvin.xavier@broadcom.com
    Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
    Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.c b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
index 60f2fb7e7dbf..d52ae7259e62 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_fp.c
+++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
@@ -637,12 +637,13 @@ int bnxt_qplib_query_srq(struct bnxt_qplib_res *res,
 	int rc = 0;
 
 	RCFW_CMD_PREP(req, QUERY_SRQ, cmd_flags);
-	req.srq_cid = cpu_to_le32(srq->id);
 
 	/* Configure the request */
 	sbuf = bnxt_qplib_rcfw_alloc_sbuf(rcfw, sizeof(*sb));
 	if (!sbuf)
 		return -ENOMEM;
+	req.resp_size = sizeof(*sb) / BNXT_QPLIB_CMDQE_UNITS;
+	req.srq_cid = cpu_to_le32(srq->id);
 	sb = sbuf->sb;
 	rc = bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, (void *)&resp,
 					  (void *)sbuf, 0);

commit f7130d0266c3ad591c5a40be466c60cc7d98647a
Author: Alex Bee <knaerzche@gmail.com>
Date:   Wed Jun 23 13:59:26 2021 +0200

    arm64: dts: rockchip: Fix GPU register width for RK3328
    
    [ Upstream commit 932b4610f55b49f3a158b0db451137bab7ed0e1f ]
    
    As can be seen in RK3328's TRM the register range for the GPU is
    0xff300000 to 0xff330000.
    It would (and does in vendor kernel) overlap with the registers of
    the HEVC encoder (node/driver do not exist yet in upstream kernel).
    See already existing h265e_mmu node.
    
    Fixes: 752fbc0c8da7 ("arm64: dts: rockchip: add rk3328 mali gpu node")
    Signed-off-by: Alex Bee <knaerzche@gmail.com>
    Link: https://lore.kernel.org/r/20210623115926.164861-1-knaerzche@gmail.com
    Signed-off-by: Heiko Stuebner <heiko@sntech.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
index 05fa0dcb4c69..f6931f8d36f6 100644
--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
@@ -536,7 +536,7 @@
 
 	gpu: gpu@ff300000 {
 		compatible = "rockchip,rk3328-mali", "arm,mali-450";
-		reg = <0x0 0xff300000 0x0 0x40000>;
+		reg = <0x0 0xff300000 0x0 0x30000>;
 		interrupts = <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>,
 			     <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>,
 			     <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>,

commit f8bd641977b7462741d43cd0e181a31030837f23
Author: Jackie Liu <liuyun01@kylinos.cn>
Date:   Wed Sep 1 20:35:57 2021 +0800

    ARM: s3c: irq-s3c24xx: Fix return value check for s3c24xx_init_intc()
    
    [ Upstream commit 2aa717473ce96c93ae43a5dc8c23cedc8ce7dd9f ]
    
    The s3c24xx_init_intc() returns an error pointer upon failure, not NULL.
    let's add an error pointer check in s3c24xx_handle_irq.
    
    s3c_intc[0] is not NULL or ERR, we can simplify the code.
    
    Fixes: 1f629b7a3ced ("ARM: S3C24XX: transform irq handling into a declarative form")
    Signed-off-by: Jackie Liu <liuyun01@kylinos.cn>
    Link: https://lore.kernel.org/r/20210901123557.1043953-1-liu.yun@linux.dev
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/irqchip/irq-s3c24xx.c b/drivers/irqchip/irq-s3c24xx.c
index c19766fe8a1a..c11fbd8f1225 100644
--- a/drivers/irqchip/irq-s3c24xx.c
+++ b/drivers/irqchip/irq-s3c24xx.c
@@ -368,11 +368,25 @@ static inline int s3c24xx_handle_intc(struct s3c_irq_intc *intc,
 asmlinkage void __exception_irq_entry s3c24xx_handle_irq(struct pt_regs *regs)
 {
 	do {
-		if (likely(s3c_intc[0]))
-			if (s3c24xx_handle_intc(s3c_intc[0], regs, 0))
-				continue;
+		/*
+		 * For platform based machines, neither ERR nor NULL can happen here.
+		 * The s3c24xx_handle_irq() will be set as IRQ handler iff this succeeds:
+		 *
+		 *    s3c_intc[0] = s3c24xx_init_intc()
+		 *
+		 * If this fails, the next calls to s3c24xx_init_intc() won't be executed.
+		 *
+		 * For DT machine, s3c_init_intc_of() could set the IRQ handler without
+		 * setting s3c_intc[0] only if it was called with num_ctrl=0. There is no
+		 * such code path, so again the s3c_intc[0] will have a valid pointer if
+		 * set_handle_irq() is called.
+		 *
+		 * Therefore in s3c24xx_handle_irq(), the s3c_intc[0] is always something.
+		 */
+		if (s3c24xx_handle_intc(s3c_intc[0], regs, 0))
+			continue;
 
-		if (s3c_intc[2])
+		if (!IS_ERR_OR_NULL(s3c_intc[2]))
 			if (s3c24xx_handle_intc(s3c_intc[2], regs, 64))
 				continue;
 

commit 113ab66698efad3b1217ac47e393ad2a5f4f1c58
Author: Junji Wei <weijunji@bytedance.com>
Date:   Tue Aug 31 16:32:23 2021 +0800

    RDMA/rxe: Fix wrong port_cap_flags
    
    [ Upstream commit dcd3f985b20ffcc375f82ca0ca9f241c7025eb5e ]
    
    The port->attr.port_cap_flags should be set to enum
    ib_port_capability_mask_bits in ib_mad.h, not
    RDMA_CORE_CAP_PROT_ROCE_UDP_ENCAP.
    
    Fixes: 8700e3e7c485 ("Soft RoCE driver")
    Link: https://lore.kernel.org/r/20210831083223.65797-1-weijunji@bytedance.com
    Signed-off-by: Junji Wei <weijunji@bytedance.com>
    Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/infiniband/sw/rxe/rxe_param.h b/drivers/infiniband/sw/rxe/rxe_param.h
index 4555510d86c4..154c92c0e0cd 100644
--- a/drivers/infiniband/sw/rxe/rxe_param.h
+++ b/drivers/infiniband/sw/rxe/rxe_param.h
@@ -143,7 +143,7 @@ enum rxe_port_param {
 	RXE_PORT_MAX_MTU		= IB_MTU_4096,
 	RXE_PORT_ACTIVE_MTU		= IB_MTU_256,
 	RXE_PORT_GID_TBL_LEN		= 1024,
-	RXE_PORT_PORT_CAP_FLAGS		= RDMA_CORE_CAP_PROT_ROCE_UDP_ENCAP,
+	RXE_PORT_PORT_CAP_FLAGS		= IB_PORT_CM_SUP,
 	RXE_PORT_MAX_MSG_SZ		= 0x800000,
 	RXE_PORT_BAD_PKEY_CNTR		= 0,
 	RXE_PORT_QKEY_VIOL_CNTR		= 0,

commit 3d7a5f29423ad420b338f1ae77eaca03ac0ff435
Author: Sukadev Bhattiprolu <sukadev@linux.ibm.com>
Date:   Fri Oct 29 15:03:15 2021 -0700

    ibmvnic: Process crqs after enabling interrupts
    
    [ Upstream commit 6e20d00158f31f7631d68b86996b7e951c4451c8 ]
    
    Soon after registering a CRQ it is possible that we get a fail over or
    maybe a CRQ_INIT from the VIOS while interrupts were disabled.
    
    Look for any such CRQs after enabling interrupts.
    
    Otherwise we can intermittently fail to bring up ibmvnic adapters during
    boot, specially in kexec/kdump kernels.
    
    Fixes: 032c5e82847a ("Driver for IBM System i/p VNIC protocol")
    Reported-by: Vaishnavi Bhat <vaish123@in.ibm.com>
    Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.ibm.com>
    Reviewed-by: Dany Madden <drt@linux.ibm.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index d97641b9928b..c52c26fc44e5 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -4603,6 +4603,9 @@ static int init_crq_queue(struct ibmvnic_adapter *adapter)
 	crq->cur = 0;
 	spin_lock_init(&crq->lock);
 
+	/* process any CRQs that were queued before we enabled interrupts */
+	tasklet_schedule(&adapter->tasklet);
+
 	return retrc;
 
 req_irq_failed:

commit 9762b7c9d938559db3a901ffbeb5c7009c52fd47
Author: Andrea Righi <andrea.righi@canonical.com>
Date:   Tue Oct 26 16:34:09 2021 +0200

    selftests/bpf: Fix fclose/pclose mismatch in test_progs
    
    [ Upstream commit f48ad69097fe79d1de13c4d8fef556d4c11c5e68 ]
    
    Make sure to use pclose() to properly close the pipe opened by popen().
    
    Fixes: 81f77fd0deeb ("bpf: add selftest for stackmap with BPF_F_STACK_BUILD_ID")
    Signed-off-by: Andrea Righi <andrea.righi@canonical.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: Shuah Khan <skhan@linuxfoundation.org>
    Acked-by: Martin KaFai Lau <kafai@fb.com>
    Link: https://lore.kernel.org/bpf/20211026143409.42666-1-andrea.righi@canonical.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c
index bad3505d66e0..0fcd38ffcc24 100644
--- a/tools/testing/selftests/bpf/test_progs.c
+++ b/tools/testing/selftests/bpf/test_progs.c
@@ -1112,7 +1112,7 @@ static int extract_build_id(char *build_id, size_t size)
 
 	if (getline(&line, &len, fp) == -1)
 		goto err;
-	fclose(fp);
+	pclose(fp);
 
 	if (len > size)
 		len = size;
@@ -1121,7 +1121,7 @@ static int extract_build_id(char *build_id, size_t size)
 	free(line);
 	return 0;
 err:
-	fclose(fp);
+	pclose(fp);
 	return -1;
 }
 

commit fca288ae3d058a4b795bdc5bb154b8ae5566636d
Author: Daniel Jordan <daniel.m.jordan@oracle.com>
Date:   Thu Oct 21 14:30:28 2021 -0400

    crypto: pcrypt - Delay write to padata->info
    
    [ Upstream commit 68b6dea802cea0dbdd8bd7ccc60716b5a32a5d8a ]
    
    These three events can race when pcrypt is used multiple times in a
    template ("pcrypt(pcrypt(...))"):
    
      1.  [taskA] The caller makes the crypto request via crypto_aead_encrypt()
      2.  [kworkerB] padata serializes the inner pcrypt request
      3.  [kworkerC] padata serializes the outer pcrypt request
    
    3 might finish before the call to crypto_aead_encrypt() returns in 1,
    resulting in two possible issues.
    
    First, a use-after-free of the crypto request's memory when, for
    example, taskA writes to the outer pcrypt request's padata->info in
    pcrypt_aead_enc() after kworkerC completes the request.
    
    Second, the outer pcrypt request overwrites the inner pcrypt request's
    return code with -EINPROGRESS, making a successful request appear to
    fail.  For instance, kworkerB writes the outer pcrypt request's
    padata->info in pcrypt_aead_done() and then taskA overwrites it
    in pcrypt_aead_enc().
    
    Avoid both situations by delaying the write of padata->info until after
    the inner crypto request's return code is checked.  This prevents the
    use-after-free by not touching the crypto request's memory after the
    next-inner crypto request is made, and stops padata->info from being
    overwritten.
    
    Fixes: 5068c7a883d16 ("crypto: pcrypt - Add pcrypt crypto parallelization wrapper")
    Reported-by: syzbot+b187b77c8474f9648fae@syzkaller.appspotmail.com
    Signed-off-by: Daniel Jordan <daniel.m.jordan@oracle.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/crypto/pcrypt.c b/crypto/pcrypt.c
index 85082574c515..62e11835f220 100644
--- a/crypto/pcrypt.c
+++ b/crypto/pcrypt.c
@@ -138,12 +138,14 @@ static void pcrypt_aead_enc(struct padata_priv *padata)
 {
 	struct pcrypt_request *preq = pcrypt_padata_request(padata);
 	struct aead_request *req = pcrypt_request_ctx(preq);
+	int ret;
 
-	padata->info = crypto_aead_encrypt(req);
+	ret = crypto_aead_encrypt(req);
 
-	if (padata->info == -EINPROGRESS)
+	if (ret == -EINPROGRESS)
 		return;
 
+	padata->info = ret;
 	padata_do_serial(padata);
 }
 
@@ -180,12 +182,14 @@ static void pcrypt_aead_dec(struct padata_priv *padata)
 {
 	struct pcrypt_request *preq = pcrypt_padata_request(padata);
 	struct aead_request *req = pcrypt_request_ctx(preq);
+	int ret;
 
-	padata->info = crypto_aead_decrypt(req);
+	ret = crypto_aead_decrypt(req);
 
-	if (padata->info == -EINPROGRESS)
+	if (ret == -EINPROGRESS)
 		return;
 
+	padata->info = ret;
 	padata_do_serial(padata);
 }
 

commit d9a5f6a33cd29df9bf8aceda839bdbc4ba3e1152
Author: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Date:   Thu Oct 28 15:55:34 2021 +0100

    net: phylink: avoid mvneta warning when setting pause parameters
    
    [ Upstream commit fd8d9731bcdfb22d28e45bce789bcb211c868c78 ]
    
    mvneta does not support asymetric pause modes, and it flags this by the
    lack of AsymPause in the supported field. When setting pause modes, we
    check that pause->rx_pause == pause->tx_pause, but only when pause
    autoneg is enabled. When pause autoneg is disabled, we still allow
    pause->rx_pause != pause->tx_pause, which is incorrect when the MAC
    does not support asymetric pause, and causes mvneta to issue a warning.
    
    Fix this by removing the test for pause->autoneg, so we always check
    that pause->rx_pause == pause->tx_pause for network devices that do not
    support AsymPause.
    
    Fixes: 9525ae83959b ("phylink: add phylink infrastructure")
    Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c
index 723611ac9102..e808efd76212 100644
--- a/drivers/net/phy/phylink.c
+++ b/drivers/net/phy/phylink.c
@@ -1259,7 +1259,7 @@ int phylink_ethtool_set_pauseparam(struct phylink *pl,
 		return -EOPNOTSUPP;
 
 	if (!phylink_test(pl->supported, Asym_Pause) &&
-	    !pause->autoneg && pause->rx_pause != pause->tx_pause)
+	    pause->rx_pause != pause->tx_pause)
 		return -EINVAL;
 
 	config->pause &= ~(MLO_PAUSE_AN | MLO_PAUSE_TXRX_MASK);

commit 4123195a567a0372535ae973c97fa7cefb523e62
Author: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
Date:   Wed Oct 27 15:27:27 2021 +0530

    net: amd-xgbe: Toggle PLL settings during rate change
    
    [ Upstream commit daf182d360e509a494db18666799f4e85d83dda0 ]
    
    For each rate change command submission, the FW has to do a phy
    power off sequence internally. For this to happen correctly, the
    PLL re-initialization control setting has to be turned off before
    sending mailbox commands and re-enabled once the command submission
    is complete.
    
    Without the PLL control setting, the link up takes longer time in a
    fixed phy configuration.
    
    Fixes: 47f164deab22 ("amd-xgbe: Add PCI device support")
    Co-developed-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
    Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
    Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
    Acked-by: Tom Lendacky <thomas.lendacky@amd.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-common.h b/drivers/net/ethernet/amd/xgbe/xgbe-common.h
index b2cd3bdba9f8..533b8519ec35 100644
--- a/drivers/net/ethernet/amd/xgbe/xgbe-common.h
+++ b/drivers/net/ethernet/amd/xgbe/xgbe-common.h
@@ -1331,6 +1331,10 @@
 #define MDIO_VEND2_PMA_CDR_CONTROL	0x8056
 #endif
 
+#ifndef MDIO_VEND2_PMA_MISC_CTRL0
+#define MDIO_VEND2_PMA_MISC_CTRL0	0x8090
+#endif
+
 #ifndef MDIO_CTRL1_SPEED1G
 #define MDIO_CTRL1_SPEED1G		(MDIO_CTRL1_SPEED10G & ~BMCR_SPEED100)
 #endif
@@ -1389,6 +1393,10 @@
 #define XGBE_PMA_RX_RST_0_RESET_ON	0x10
 #define XGBE_PMA_RX_RST_0_RESET_OFF	0x00
 
+#define XGBE_PMA_PLL_CTRL_MASK		BIT(15)
+#define XGBE_PMA_PLL_CTRL_ENABLE	BIT(15)
+#define XGBE_PMA_PLL_CTRL_DISABLE	0x0000
+
 /* Bit setting and getting macros
  *  The get macro will extract the current bit field value from within
  *  the variable
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
index 54753c8a6a9d..714aead72c57 100644
--- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
+++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
@@ -1966,12 +1966,26 @@ static void xgbe_phy_rx_reset(struct xgbe_prv_data *pdata)
 	}
 }
 
+static void xgbe_phy_pll_ctrl(struct xgbe_prv_data *pdata, bool enable)
+{
+	XMDIO_WRITE_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_VEND2_PMA_MISC_CTRL0,
+			 XGBE_PMA_PLL_CTRL_MASK,
+			 enable ? XGBE_PMA_PLL_CTRL_ENABLE
+				: XGBE_PMA_PLL_CTRL_DISABLE);
+
+	/* Wait for command to complete */
+	usleep_range(100, 200);
+}
+
 static void xgbe_phy_perform_ratechange(struct xgbe_prv_data *pdata,
 					unsigned int cmd, unsigned int sub_cmd)
 {
 	unsigned int s0 = 0;
 	unsigned int wait;
 
+	/* Disable PLL re-initialization during FW command processing */
+	xgbe_phy_pll_ctrl(pdata, false);
+
 	/* Log if a previous command did not complete */
 	if (XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS)) {
 		netif_dbg(pdata, link, pdata->netdev,
@@ -1992,7 +2006,7 @@ static void xgbe_phy_perform_ratechange(struct xgbe_prv_data *pdata,
 	wait = XGBE_RATECHANGE_COUNT;
 	while (wait--) {
 		if (!XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS))
-			return;
+			goto reenable_pll;
 
 		usleep_range(1000, 2000);
 	}
@@ -2002,6 +2016,10 @@ static void xgbe_phy_perform_ratechange(struct xgbe_prv_data *pdata,
 
 	/* Reset on error */
 	xgbe_phy_rx_reset(pdata);
+
+reenable_pll:
+	/* Enable PLL re-initialization */
+	xgbe_phy_pll_ctrl(pdata, true);
 }
 
 static void xgbe_phy_rrc(struct xgbe_prv_data *pdata)

commit 2070e5a78b59e02ed3b3a89948bfdfd171314831
Author: Benjamin Li <benl@squareup.com>
Date:   Fri Oct 22 17:15:28 2021 -0700

    wcn36xx: add proper DMA memory barriers in rx path
    
    [ Upstream commit 9bfe38e064af5decba2ffce66a2958ab8b10eaa4 ]
    
    This is essentially exactly following the dma_wmb()/dma_rmb() usage
    instructions in Documentation/memory-barriers.txt.
    
    The theoretical races here are:
    
    1. DXE (the DMA Transfer Engine in the Wi-Fi subsystem) seeing the
    dxe->ctrl & WCN36xx_DXE_CTRL_VLD write before the dxe->dst_addr_l
    write, thus performing DMA into the wrong address.
    
    2. CPU reading dxe->dst_addr_l before DXE unsets dxe->ctrl &
    WCN36xx_DXE_CTRL_VLD. This should generally be harmless since DXE
    doesn't write dxe->dst_addr_l (no risk of freeing the wrong skb).
    
    Fixes: 8e84c2582169 ("wcn36xx: mac80211 driver for Qualcomm WCN3660/WCN3680 hardware")
    Signed-off-by: Benjamin Li <benl@squareup.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20211023001528.3077822-1-benl@squareup.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/ath/wcn36xx/dxe.c b/drivers/net/wireless/ath/wcn36xx/dxe.c
index 06cfe8d311f3..657525988d1e 100644
--- a/drivers/net/wireless/ath/wcn36xx/dxe.c
+++ b/drivers/net/wireless/ath/wcn36xx/dxe.c
@@ -565,6 +565,10 @@ static int wcn36xx_rx_handle_packets(struct wcn36xx *wcn,
 	dxe = ctl->desc;
 
 	while (!(READ_ONCE(dxe->ctrl) & WCN36xx_DXE_CTRL_VLD)) {
+		/* do not read until we own DMA descriptor */
+		dma_rmb();
+
+		/* read/modify DMA descriptor */
 		skb = ctl->skb;
 		dma_addr = dxe->dst_addr_l;
 		ret = wcn36xx_dxe_fill_skb(wcn->dev, ctl, GFP_ATOMIC);
@@ -575,9 +579,15 @@ static int wcn36xx_rx_handle_packets(struct wcn36xx *wcn,
 			dma_unmap_single(wcn->dev, dma_addr, WCN36XX_PKT_SIZE,
 					DMA_FROM_DEVICE);
 			wcn36xx_rx_skb(wcn, skb);
-		} /* else keep old skb not submitted and use it for rx DMA */
+		}
+		/* else keep old skb not submitted and reuse it for rx DMA
+		 * (dropping the packet that it contained)
+		 */
 
+		/* flush descriptor changes before re-marking as valid */
+		dma_wmb();
 		dxe->ctrl = ctrl;
+
 		ctl = ctl->next;
 		dxe = ctl->desc;
 	}

commit efd2fc0587c5f3be0a2e1a877149db33cc56aea4
Author: Wang Hai <wanghai38@huawei.com>
Date:   Wed Oct 20 20:03:45 2021 +0800

    libertas: Fix possible memory leak in probe and disconnect
    
    [ Upstream commit 9692151e2fe7a326bafe99836fd1f20a2cc3a049 ]
    
    I got memory leak as follows when doing fault injection test:
    
    unreferenced object 0xffff88812c7d7400 (size 512):
      comm "kworker/6:1", pid 176, jiffies 4295003332 (age 822.830s)
      hex dump (first 32 bytes):
        00 68 1e 04 81 88 ff ff 01 00 00 00 00 00 00 00  .h..............
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<ffffffff8167939c>] slab_post_alloc_hook+0x9c/0x490
        [<ffffffff8167f627>] kmem_cache_alloc_trace+0x1f7/0x470
        [<ffffffffa02c9873>] if_usb_probe+0x63/0x446 [usb8xxx]
        [<ffffffffa022668a>] usb_probe_interface+0x1aa/0x3c0 [usbcore]
        [<ffffffff82b59630>] really_probe+0x190/0x480
        [<ffffffff82b59a19>] __driver_probe_device+0xf9/0x180
        [<ffffffff82b59af3>] driver_probe_device+0x53/0x130
        [<ffffffff82b5a075>] __device_attach_driver+0x105/0x130
        [<ffffffff82b55949>] bus_for_each_drv+0x129/0x190
        [<ffffffff82b593c9>] __device_attach+0x1c9/0x270
        [<ffffffff82b5a250>] device_initial_probe+0x20/0x30
        [<ffffffff82b579c2>] bus_probe_device+0x142/0x160
        [<ffffffff82b52e49>] device_add+0x829/0x1300
        [<ffffffffa02229b1>] usb_set_configuration+0xb01/0xcc0 [usbcore]
        [<ffffffffa0235c4e>] usb_generic_driver_probe+0x6e/0x90 [usbcore]
        [<ffffffffa022641f>] usb_probe_device+0x6f/0x130 [usbcore]
    
    cardp is missing being freed in the error handling path of the probe
    and the path of the disconnect, which will cause memory leak.
    
    This patch adds the missing kfree().
    
    Fixes: 876c9d3aeb98 ("[PATCH] Marvell Libertas 8388 802.11b/g USB driver")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Wang Hai <wanghai38@huawei.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20211020120345.2016045-3-wanghai38@huawei.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/marvell/libertas/if_usb.c b/drivers/net/wireless/marvell/libertas/if_usb.c
index 9e82ec12564b..f29a154d995c 100644
--- a/drivers/net/wireless/marvell/libertas/if_usb.c
+++ b/drivers/net/wireless/marvell/libertas/if_usb.c
@@ -288,6 +288,7 @@ static int if_usb_probe(struct usb_interface *intf,
 	if_usb_reset_device(cardp);
 dealloc:
 	if_usb_free(cardp);
+	kfree(cardp);
 
 error:
 	return r;
@@ -312,6 +313,7 @@ static void if_usb_disconnect(struct usb_interface *intf)
 
 	/* Unlink and free urb */
 	if_usb_free(cardp);
+	kfree(cardp);
 
 	usb_set_intfdata(intf, NULL);
 	usb_put_dev(interface_to_usbdev(intf));

commit 71118a24a43092b994dbc49e471c02ef22195c81
Author: Wang Hai <wanghai38@huawei.com>
Date:   Wed Oct 20 20:03:44 2021 +0800

    libertas_tf: Fix possible memory leak in probe and disconnect
    
    [ Upstream commit d549107305b4634c81223a853701c06bcf657bc3 ]
    
    I got memory leak as follows when doing fault injection test:
    
    unreferenced object 0xffff88810a2ddc00 (size 512):
      comm "kworker/6:1", pid 176, jiffies 4295009893 (age 757.220s)
      hex dump (first 32 bytes):
        00 50 05 18 81 88 ff ff 00 00 00 00 00 00 00 00  .P..............
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<ffffffff8167939c>] slab_post_alloc_hook+0x9c/0x490
        [<ffffffff8167f627>] kmem_cache_alloc_trace+0x1f7/0x470
        [<ffffffffa02a1530>] if_usb_probe+0x60/0x37c [libertas_tf_usb]
        [<ffffffffa022668a>] usb_probe_interface+0x1aa/0x3c0 [usbcore]
        [<ffffffff82b59630>] really_probe+0x190/0x480
        [<ffffffff82b59a19>] __driver_probe_device+0xf9/0x180
        [<ffffffff82b59af3>] driver_probe_device+0x53/0x130
        [<ffffffff82b5a075>] __device_attach_driver+0x105/0x130
        [<ffffffff82b55949>] bus_for_each_drv+0x129/0x190
        [<ffffffff82b593c9>] __device_attach+0x1c9/0x270
        [<ffffffff82b5a250>] device_initial_probe+0x20/0x30
        [<ffffffff82b579c2>] bus_probe_device+0x142/0x160
        [<ffffffff82b52e49>] device_add+0x829/0x1300
        [<ffffffffa02229b1>] usb_set_configuration+0xb01/0xcc0 [usbcore]
        [<ffffffffa0235c4e>] usb_generic_driver_probe+0x6e/0x90 [usbcore]
        [<ffffffffa022641f>] usb_probe_device+0x6f/0x130 [usbcore]
    
    cardp is missing being freed in the error handling path of the probe
    and the path of the disconnect, which will cause memory leak.
    
    This patch adds the missing kfree().
    
    Fixes: c305a19a0d0a ("libertas_tf: usb specific functions")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Wang Hai <wanghai38@huawei.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20211020120345.2016045-2-wanghai38@huawei.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/marvell/libertas_tf/if_usb.c b/drivers/net/wireless/marvell/libertas_tf/if_usb.c
index 6ede6168bd85..60941c319b42 100644
--- a/drivers/net/wireless/marvell/libertas_tf/if_usb.c
+++ b/drivers/net/wireless/marvell/libertas_tf/if_usb.c
@@ -234,6 +234,7 @@ static int if_usb_probe(struct usb_interface *intf,
 
 dealloc:
 	if_usb_free(cardp);
+	kfree(cardp);
 error:
 lbtf_deb_leave(LBTF_DEB_MAIN);
 	return -ENOMEM;
@@ -258,6 +259,7 @@ static void if_usb_disconnect(struct usb_interface *intf)
 
 	/* Unlink and free urb */
 	if_usb_free(cardp);
+	kfree(cardp);
 
 	usb_set_intfdata(intf, NULL);
 	usb_put_dev(interface_to_usbdev(intf));

commit faf09fe23fa30b48d11e31544ec4f76647861bf9
Author: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
Date:   Fri Oct 22 17:26:48 2021 +0200

    KVM: s390: Fix handle_sske page fault handling
    
    [ Upstream commit 85f517b29418158d3e6e90c3f0fc01b306d2f1a1 ]
    
    If handle_sske cannot set the storage key, because there is no
    page table entry or no present large page entry, it calls
    fixup_user_fault.
    However, currently, if the call succeeds, handle_sske returns
    -EAGAIN, without having set the storage key.
    Instead, retry by continue'ing the loop without incrementing the
    address.
    The same issue in handle_pfmf was fixed by
    a11bdb1a6b78 ("KVM: s390: Fix pfmf and conditional skey emulation").
    
    Fixes: bd096f644319 ("KVM: s390: Add skey emulation fault handling")
    Signed-off-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
    Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
    Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
    Link: https://lore.kernel.org/r/20211022152648.26536-1-scgl@linux.ibm.com
    Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c
index 8679bd74d337..9abdfb8b1a1e 100644
--- a/arch/s390/kvm/priv.c
+++ b/arch/s390/kvm/priv.c
@@ -397,6 +397,8 @@ static int handle_sske(struct kvm_vcpu *vcpu)
 		up_read(&current->mm->mmap_sem);
 		if (rc == -EFAULT)
 			return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
+		if (rc == -EAGAIN)
+			continue;
 		if (rc < 0)
 			return rc;
 		start += PAGE_SIZE;

commit 1e47f3466fc2efd47bfeeae4fdb749e9e696f2f5
Author: Tiezhu Yang <yangtiezhu@loongson.cn>
Date:   Tue Oct 26 09:51:28 2021 +0800

    samples/kretprobes: Fix return value if register_kretprobe() failed
    
    [ Upstream commit f76fbbbb5061fe14824ba5807c44bd7400a6b4e1 ]
    
    Use the actual return value instead of always -1 if register_kretprobe()
    failed.
    
    E.g. without this patch:
    
     # insmod samples/kprobes/kretprobe_example.ko func=no_such_func
     insmod: ERROR: could not insert module samples/kprobes/kretprobe_example.ko: Operation not permitted
    
    With this patch:
    
     # insmod samples/kprobes/kretprobe_example.ko func=no_such_func
     insmod: ERROR: could not insert module samples/kprobes/kretprobe_example.ko: Unknown symbol in module
    
    Link: https://lkml.kernel.org/r/1635213091-24387-2-git-send-email-yangtiezhu@loongson.cn
    
    Fixes: 804defea1c02 ("Kprobes: move kprobe examples to samples/")
    Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
    Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/samples/kprobes/kretprobe_example.c b/samples/kprobes/kretprobe_example.c
index 7f9060f435cd..da6de5e78e1d 100644
--- a/samples/kprobes/kretprobe_example.c
+++ b/samples/kprobes/kretprobe_example.c
@@ -83,7 +83,7 @@ static int __init kretprobe_init(void)
 	ret = register_kretprobe(&my_kretprobe);
 	if (ret < 0) {
 		pr_err("register_kretprobe failed, returned %d\n", ret);
-		return -1;
+		return ret;
 	}
 	pr_info("Planted return probe at %s: %p\n",
 			my_kretprobe.kp.symbol_name, my_kretprobe.kp.addr);

commit b4d407a6467f854c1efb0713b68180192d93e3e8
Author: Jon Maxwell <jmaxwell37@gmail.com>
Date:   Mon Oct 25 10:59:03 2021 +1100

    tcp: don't free a FIN sk_buff in tcp_remove_empty_skb()
    
    [ Upstream commit cf12e6f9124629b18a6182deefc0315f0a73a199 ]
    
    v1: Implement a more general statement as recommended by Eric Dumazet. The
    sequence number will be advanced, so this check will fix the FIN case and
    other cases.
    
    A customer reported sockets stuck in the CLOSING state. A Vmcore revealed that
    the write_queue was not empty as determined by tcp_write_queue_empty() but the
    sk_buff containing the FIN flag had been freed and the socket was zombied in
    that state. Corresponding pcaps show no FIN from the Linux kernel on the wire.
    
    Some instrumentation was added to the kernel and it was found that there is a
    timing window where tcp_sendmsg() can run after tcp_send_fin().
    
    tcp_sendmsg() will hit an error, for example:
    
    1269 ??      if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN))??    1270 ??      ??      goto do_error;??    
    tcp_remove_empty_skb() will then free the FIN sk_buff as "skb->len == 0". The
    TCP socket is now wedged in the FIN-WAIT-1 state because the FIN is never sent.
    
    If the other side sends a FIN packet the socket will transition to CLOSING and
    remain that way until the system is rebooted.
    
    Fix this by checking for the FIN flag in the sk_buff and don't free it if that
    is the case. Testing confirmed that fixed the issue.
    
    Fixes: fdfc5c8594c2 ("tcp: remove empty skb from write queue in error cases")
    Signed-off-by: Jon Maxwell <jmaxwell37@gmail.com>
    Reported-by: Monir Zouaoui <Monir.Zouaoui@mail.schwarz>
    Reported-by: Simon Stier <simon.stier@mail.schwarz>
    Reviewed-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 769e1f683471..4dce1b418acc 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -952,7 +952,7 @@ static int tcp_send_mss(struct sock *sk, int *size_goal, int flags)
  */
 static void tcp_remove_empty_skb(struct sock *sk, struct sk_buff *skb)
 {
-	if (skb && !skb->len) {
+	if (skb && TCP_SKB_CB(skb)->seq == TCP_SKB_CB(skb)->end_seq) {
 		tcp_unlink_write_queue(skb, sk);
 		if (tcp_write_queue_empty(sk))
 			tcp_chrono_stop(sk, TCP_CHRONO_BUSY);

commit 2e3f45eb9791555c9706a06b606b9151e6f42028
Author: Mark Rutland <mark.rutland@arm.com>
Date:   Wed Oct 20 17:25:22 2021 +0100

    irq: mips: avoid nested irq_enter()
    
    [ Upstream commit c65b52d02f6c1a06ddb20cba175ad49eccd6410d ]
    
    As bcm6345_l1_irq_handle() is a chained irqchip handler, it will be
    invoked within the context of the root irqchip handler, which must have
    entered IRQ context already.
    
    When bcm6345_l1_irq_handle() calls arch/mips's do_IRQ() , this will nest
    another call to irq_enter(), and the resulting nested increment to
    `rcu_data.dynticks_nmi_nesting` will cause rcu_is_cpu_rrupt_from_idle()
    to fail to identify wakeups from idle, resulting in failure to preempt,
    and RCU stalls.
    
    Chained irqchip handlers must invoke IRQ handlers by way of thee core
    irqchip code, i.e. generic_handle_irq() or generic_handle_domain_irq()
    and should not call do_IRQ(), which is intended only for root irqchip
    handlers.
    
    Fix bcm6345_l1_irq_handle() by calling generic_handle_irq() directly.
    
    Fixes: c7c42ec2baa1de7a ("irqchips/bmips: Add bcm6345-l1 interrupt controller")
    Signed-off-by: Mark Rutland <mark.rutland@arm.com>
    Reviewed-by: Marc Zyngier <maz@kernel.org>
    Acked-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/irqchip/irq-bcm6345-l1.c b/drivers/irqchip/irq-bcm6345-l1.c
index 43f8abe40878..31ea6332ecb8 100644
--- a/drivers/irqchip/irq-bcm6345-l1.c
+++ b/drivers/irqchip/irq-bcm6345-l1.c
@@ -143,7 +143,7 @@ static void bcm6345_l1_irq_handle(struct irq_desc *desc)
 		for_each_set_bit(hwirq, &pending, IRQS_PER_WORD) {
 			irq = irq_linear_revmap(intc->domain, base + hwirq);
 			if (irq)
-				do_IRQ(irq);
+				generic_handle_irq(irq);
 			else
 				spurious_interrupt();
 		}

commit 3ad30172906bbbbe00701a2d361a40c2357905e5
Author: David Hildenbrand <david@redhat.com>
Date:   Thu Sep 9 18:22:41 2021 +0200

    s390/gmap: don't unconditionally call pte_unmap_unlock() in __gmap_zap()
    
    [ Upstream commit b159f94c86b43cf7e73e654bc527255b1f4eafc4 ]
    
    ... otherwise we will try unlocking a spinlock that was never locked via a
    garbage pointer.
    
    At the time we reach this code path, we usually successfully looked up
    a PGSTE already; however, evil user space could have manipulated the VMA
    layout in the meantime and triggered removal of the page table.
    
    Fixes: 1e133ab296f3 ("s390/mm: split arch/s390/mm/pgtable.c")
    Signed-off-by: David Hildenbrand <david@redhat.com>
    Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
    Acked-by: Heiko Carstens <hca@linux.ibm.com>
    Link: https://lore.kernel.org/r/20210909162248.14969-3-david@redhat.com
    Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/s390/mm/gmap.c b/arch/s390/mm/gmap.c
index 7cde0f2f52e1..65ccb9d79727 100644
--- a/arch/s390/mm/gmap.c
+++ b/arch/s390/mm/gmap.c
@@ -684,9 +684,10 @@ void __gmap_zap(struct gmap *gmap, unsigned long gaddr)
 		vmaddr |= gaddr & ~PMD_MASK;
 		/* Get pointer to the page table entry */
 		ptep = get_locked_pte(gmap->mm, vmaddr, &ptl);
-		if (likely(ptep))
+		if (likely(ptep)) {
 			ptep_zap_unused(gmap->mm, vmaddr, ptep, 0);
-		pte_unmap_unlock(ptep, ptl);
+			pte_unmap_unlock(ptep, ptl);
+		}
 	}
 }
 EXPORT_SYMBOL_GPL(__gmap_zap);

commit f85450ca01ee6a4bd9c6fe4f10656661e931d241
Author: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Date:   Tue Oct 19 20:27:26 2021 +0900

    smackfs: use netlbl_cfg_cipsov4_del() for deleting cipso_v4_doi
    
    [ Upstream commit 0934ad42bb2c5df90a1b9de690f93de735b622fe ]
    
    syzbot is reporting UAF at cipso_v4_doi_search() [1], for smk_cipso_doi()
    is calling kfree() without removing from the cipso_v4_doi_list list after
    netlbl_cfg_cipsov4_map_add() returned an error. We need to use
    netlbl_cfg_cipsov4_del() in order to remove from the list and wait for
    RCU grace period before kfree().
    
    Link: https://syzkaller.appspot.com/bug?extid=93dba5b91f0fed312cbd [1]
    Reported-by: syzbot <syzbot+93dba5b91f0fed312cbd@syzkaller.appspotmail.com>
    Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Fixes: 6c2e8ac0953fccdd ("netlabel: Update kernel configuration API")
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c
index 9fdf404a318f..a9c516362170 100644
--- a/security/smack/smackfs.c
+++ b/security/smack/smackfs.c
@@ -740,7 +740,7 @@ static void smk_cipso_doi(void)
 	if (rc != 0) {
 		printk(KERN_WARNING "%s:%d map add rc = %d\n",
 		       __func__, __LINE__, rc);
-		kfree(doip);
+		netlbl_cfg_cipsov4_del(doip->doi, &nai);
 		return;
 	}
 }

commit 46401b30903580be94258f415a9b4d692c336ad2
Author: Jessica Zhang <jesszhan@codeaurora.org>
Date:   Wed Oct 20 10:57:33 2021 -0700

    drm/msm: Fix potential NULL dereference in DPU SSPP
    
    [ Upstream commit 8bf71a5719b6cc5b6ba358096081e5d50ea23ab6 ]
    
    Move initialization of sblk in _sspp_subblk_offset() after NULL check to
    avoid potential NULL pointer dereference.
    
    Fixes: 25fdd5933e4c ("drm/msm: Add SDM845 DPU support")
    Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Jessica Zhang <jesszhan@codeaurora.org>
    Link: https://lore.kernel.org/r/20211020175733.3379-1-jesszhan@codeaurora.org
    Signed-off-by: Rob Clark <robdclark@chromium.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
index c25b52a6b219..7db24e9df4b9 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c
@@ -146,11 +146,13 @@ static inline int _sspp_subblk_offset(struct dpu_hw_pipe *ctx,
 		u32 *idx)
 {
 	int rc = 0;
-	const struct dpu_sspp_sub_blks *sblk = ctx->cap->sblk;
+	const struct dpu_sspp_sub_blks *sblk;
 
-	if (!ctx)
+	if (!ctx || !ctx->cap || !ctx->cap->sblk)
 		return -EINVAL;
 
+	sblk = ctx->cap->sblk;
+
 	switch (s_id) {
 	case DPU_SSPP_SRC:
 		*idx = sblk->src_blk.base;
@@ -413,7 +415,7 @@ static void _dpu_hw_sspp_setup_scaler3(struct dpu_hw_pipe *ctx,
 
 	(void)pe;
 	if (_sspp_subblk_offset(ctx, DPU_SSPP_SCALER_QSEED3, &idx) || !sspp
-		|| !scaler3_cfg || !ctx || !ctx->cap || !ctx->cap->sblk)
+		|| !scaler3_cfg)
 		return;
 
 	dpu_hw_setup_scaler3(&ctx->hw, scaler3_cfg, idx,

commit 2eb813cbcbddafaeb3af08d49b1d7d01bd138184
Author: Kees Cook <keescook@chromium.org>
Date:   Sat Aug 28 10:57:47 2021 -0700

    clocksource/drivers/timer-ti-dm: Select TIMER_OF
    
    [ Upstream commit eda9a4f7af6ee47e9e131f20e4f8a41a97379293 ]
    
    When building OMAP_DM_TIMER without TIMER_OF, there are orphan sections
    due to the use of TIMER_OF_DELCARE() without CONFIG_TIMER_OF. Select
    CONFIG_TIMER_OF when enaling OMAP_DM_TIMER:
    
    arm-linux-gnueabi-ld: warning: orphan section `__timer_of_table' from `drivers/clocksource/timer-ti-dm-systimer.o' being placed in section `__timer_of_table'
    
    Reported-by: kernel test robot <lkp@intel.com>
    Link: https://lore.kernel.org/lkml/202108282255.tkdt4ani-lkp@intel.com/
    Cc: Tony Lindgren <tony@atomide.com>
    Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
    Cc: Keerthy <j-keerthy@ti.com>
    Cc: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
    Cc: Ladislav Michl <ladis@linux-mips.org>
    Cc: Grygorii Strashko <grygorii.strashko@ti.com>
    Cc: linux-omap@vger.kernel.org
    Fixes: 52762fbd1c47 ("clocksource/drivers/timer-ti-dm: Add clockevent and clocksource support")
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Acked-by: Tony Lindgren <tony@atomide.com>
    Link: https://lore.kernel.org/r/20210828175747.3777891-1-keescook@chromium.org
    Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index 4d37f018d846..06504384c376 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -23,6 +23,7 @@ config I8253_LOCK
 
 config OMAP_DM_TIMER
 	bool
+	select TIMER_OF
 
 config CLKBLD_I8253
 	def_bool y if CLKSRC_I8253 || CLKEVT_I8253 || I8253_LOCK

commit 108e5a384eec7c1398dc37e3ffbcf5d94d746809
Author: Anders Roxell <anders.roxell@linaro.org>
Date:   Thu Oct 7 21:13:37 2021 +0200

    PM: hibernate: fix sparse warnings
    
    [ Upstream commit 01de5fcd8b1ac0ca28d2bb0921226a54fdd62684 ]
    
    When building the kernel with sparse enabled 'C=1' the following
    warnings shows up:
    
    kernel/power/swap.c:390:29: warning: incorrect type in assignment (different base types)
    kernel/power/swap.c:390:29:    expected int ret
    kernel/power/swap.c:390:29:    got restricted blk_status_t
    
    This is due to function hib_wait_io() returns a 'blk_status_t' which is
    a bitwise u8. Commit 5416da01ff6e ("PM: hibernate: Remove
    blk_status_to_errno in hib_wait_io") seemed to have mixed up the return
    type. However, the 4e4cbee93d56 ("block: switch bios to blk_status_t")
    actually broke the behaviour by returning the wrong type.
    
    Rework so function hib_wait_io() returns a 'int' instead of
    'blk_status_t' and make sure to call function
    blk_status_to_errno(hb->error)' when returning from function
    hib_wait_io() a int gets returned.
    
    Fixes: 4e4cbee93d56 ("block: switch bios to blk_status_t")
    Fixes: 5416da01ff6e ("PM: hibernate: Remove blk_status_to_errno in hib_wait_io")
    Signed-off-by: Anders Roxell <anders.roxell@linaro.org>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/power/swap.c b/kernel/power/swap.c
index b5b97df142d2..9db7f2f93fae 100644
--- a/kernel/power/swap.c
+++ b/kernel/power/swap.c
@@ -294,7 +294,7 @@ static int hib_submit_io(int op, int op_flags, pgoff_t page_off, void *addr,
 	return error;
 }
 
-static blk_status_t hib_wait_io(struct hib_bio_batch *hb)
+static int hib_wait_io(struct hib_bio_batch *hb)
 {
 	wait_event(hb->wait, atomic_read(&hb->count) == 0);
 	return blk_status_to_errno(hb->error);

commit 66c0727e94b82792967a709643133fa21e458d9a
Author: Max Gurtovoy <mgurtovoy@nvidia.com>
Date:   Sun Oct 17 11:58:16 2021 +0300

    nvme-rdma: fix error code in nvme_rdma_setup_ctrl
    
    [ Upstream commit 09748122009aed7bfaa7acc33c10c083a4758322 ]
    
    In case that icdoff is not zero or mandatory keyed sgls are not
    supported by the NVMe/RDMA target, we'll go to error flow but we'll
    return 0 to the caller. Fix it by returning an appropriate error code.
    
    Fixes: c66e2998c8ca ("nvme-rdma: centralize controller setup sequence")
    Signed-off-by: Max Gurtovoy <mgurtovoy@nvidia.com>
    Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c
index ffd6a7204509..1f41cf80f827 100644
--- a/drivers/nvme/host/rdma.c
+++ b/drivers/nvme/host/rdma.c
@@ -967,11 +967,13 @@ static int nvme_rdma_setup_ctrl(struct nvme_rdma_ctrl *ctrl, bool new)
 		return ret;
 
 	if (ctrl->ctrl.icdoff) {
+		ret = -EOPNOTSUPP;
 		dev_err(ctrl->ctrl.device, "icdoff is not supported!\n");
 		goto destroy_admin;
 	}
 
 	if (!(ctrl->ctrl.sgls & (1 << 2))) {
+		ret = -EOPNOTSUPP;
 		dev_err(ctrl->ctrl.device,
 			"Mandatory keyed sgls are not supported!\n");
 		goto destroy_admin;

commit 456d6b503e1c2bb69f178d28070b58e4e4b01de3
Author: Stefan Agner <stefan@agner.ch>
Date:   Tue Oct 19 21:16:47 2021 +0200

    phy: micrel: ksz8041nl: do not use power down mode
    
    [ Upstream commit 2641b62d2fab52648e34cdc6994b2eacde2d27c1 ]
    
    Some Micrel KSZ8041NL PHY chips exhibit continuous RX errors after using
    the power down mode bit (0.11). If the PHY is taken out of power down
    mode in a certain temperature range, the PHY enters a weird state which
    leads to continuously reporting RX errors. In that state, the MAC is not
    able to receive or send any Ethernet frames and the activity LED is
    constantly blinking. Since Linux is using the suspend callback when the
    interface is taken down, ending up in that state can easily happen
    during a normal startup.
    
    Micrel confirmed the issue in errata DS80000700A [*], caused by abnormal
    clock recovery when using power down mode. Even the latest revision (A4,
    Revision ID 0x1513) seems to suffer that problem, and according to the
    errata is not going to be fixed.
    
    Remove the suspend/resume callback to avoid using the power down mode
    completely.
    
    [*] https://ww1.microchip.com/downloads/en/DeviceDoc/80000700A.pdf
    
    Fixes: 1a5465f5d6a2 ("phy/micrel: Add suspend/resume support to Micrel PHYs")
    Signed-off-by: Stefan Agner <stefan@agner.ch>
    Acked-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
    Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c
index 55caaaf969da..013590330059 100644
--- a/drivers/net/phy/micrel.c
+++ b/drivers/net/phy/micrel.c
@@ -880,8 +880,9 @@ static struct phy_driver ksphy_driver[] = {
 	.get_sset_count = kszphy_get_sset_count,
 	.get_strings	= kszphy_get_strings,
 	.get_stats	= kszphy_get_stats,
-	.suspend	= genphy_suspend,
-	.resume		= genphy_resume,
+	/* No suspend/resume callbacks because of errata DS80000700A,
+	 * receiver error following software power down.
+	 */
 }, {
 	.phy_id		= PHY_ID_KSZ8041RNLI,
 	.phy_id_mask	= MICREL_PHY_ID_MASK,

commit 9f050af3da4ee8172cd1961db5b561f6cfdd7d86
Author: Jonas Dre?ler <verdre@v0yd.nl>
Date:   Sat Oct 16 17:32:43 2021 +0200

    mwifiex: Send DELBA requests according to spec
    
    [ Upstream commit cc8a8bc37466f79b24d972555237f3d591150602 ]
    
    While looking at on-air packets using Wireshark, I noticed we're never
    setting the initiator bit when sending DELBA requests to the AP: While
    we set the bit on our del_ba_param_set bitmask, we forget to actually
    copy that bitmask over to the command struct, which means we never
    actually set the initiator bit.
    
    Fix that and copy the bitmask over to the host_cmd_ds_11n_delba command
    struct.
    
    Fixes: 5e6e3a92b9a4 ("wireless: mwifiex: initial commit for Marvell mwifiex driver")
    Signed-off-by: Jonas Dre?ler <verdre@v0yd.nl>
    Acked-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20211016153244.24353-5-verdre@v0yd.nl
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/marvell/mwifiex/11n.c b/drivers/net/wireless/marvell/mwifiex/11n.c
index 5d75c971004b..5dcc305cc812 100644
--- a/drivers/net/wireless/marvell/mwifiex/11n.c
+++ b/drivers/net/wireless/marvell/mwifiex/11n.c
@@ -664,14 +664,15 @@ int mwifiex_send_delba(struct mwifiex_private *priv, int tid, u8 *peer_mac,
 	uint16_t del_ba_param_set;
 
 	memset(&delba, 0, sizeof(delba));
-	delba.del_ba_param_set = cpu_to_le16(tid << DELBA_TID_POS);
 
-	del_ba_param_set = le16_to_cpu(delba.del_ba_param_set);
+	del_ba_param_set = tid << DELBA_TID_POS;
+
 	if (initiator)
 		del_ba_param_set |= IEEE80211_DELBA_PARAM_INITIATOR_MASK;
 	else
 		del_ba_param_set &= ~IEEE80211_DELBA_PARAM_INITIATOR_MASK;
 
+	delba.del_ba_param_set = cpu_to_le16(del_ba_param_set);
 	memcpy(&delba.peer_mac_addr, peer_mac, ETH_ALEN);
 
 	/* We don't wait for the response of this command */

commit 2001c1f0a19ee38446c971f7eaa2907ebe12d44a
Author: Ziyang Xuan <william.xuanziyang@huawei.com>
Date:   Fri Oct 15 12:03:35 2021 +0800

    rsi: stop thread firstly in rsi_91x_init() error handling
    
    [ Upstream commit 515e7184bdf0a3ebf1757cc77fb046b4fe282189 ]
    
    When fail to init coex module, free 'common' and 'adapter' directly, but
    common->tx_thread which will access 'common' and 'adapter' is running at
    the same time. That will trigger the UAF bug.
    
    ==================================================================
    BUG: KASAN: use-after-free in rsi_tx_scheduler_thread+0x50f/0x520 [rsi_91x]
    Read of size 8 at addr ffff8880076dc000 by task Tx-Thread/124777
    CPU: 0 PID: 124777 Comm: Tx-Thread Not tainted 5.15.0-rc5+ #19
    Call Trace:
     dump_stack_lvl+0xe2/0x152
     print_address_description.constprop.0+0x21/0x140
     ? rsi_tx_scheduler_thread+0x50f/0x520
     kasan_report.cold+0x7f/0x11b
     ? rsi_tx_scheduler_thread+0x50f/0x520
     rsi_tx_scheduler_thread+0x50f/0x520
    ...
    
    Freed by task 111873:
     kasan_save_stack+0x1b/0x40
     kasan_set_track+0x1c/0x30
     kasan_set_free_info+0x20/0x30
     __kasan_slab_free+0x109/0x140
     kfree+0x117/0x4c0
     rsi_91x_init+0x741/0x8a0 [rsi_91x]
     rsi_probe+0x9f/0x1750 [rsi_usb]
    
    Stop thread before free 'common' and 'adapter' to fix it.
    
    Fixes: 2108df3c4b18 ("rsi: add coex support")
    Signed-off-by: Ziyang Xuan <william.xuanziyang@huawei.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20211015040335.1021546-1-william.xuanziyang@huawei.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c b/drivers/net/wireless/rsi/rsi_91x_main.c
index a376d3d78e42..d90d8ab56fa2 100644
--- a/drivers/net/wireless/rsi/rsi_91x_main.c
+++ b/drivers/net/wireless/rsi/rsi_91x_main.c
@@ -373,6 +373,7 @@ struct rsi_hw *rsi_91x_init(u16 oper_mode)
 	if (common->coex_mode > 1) {
 		if (rsi_coex_attach(common)) {
 			rsi_dbg(ERR_ZONE, "Failed to init coex module\n");
+			rsi_kill_thread(&common->tx_thread);
 			goto err;
 		}
 	}

commit 12927fb3444d10874f41c67684a29e08d08dfc82
Author: Nathan Chancellor <nathan@kernel.org>
Date:   Mon Oct 18 11:25:37 2021 -0700

    platform/x86: thinkpad_acpi: Fix bitwise vs. logical warning
    
    [ Upstream commit fd96e35ea7b95f1e216277805be89d66e4ae962d ]
    
    A new warning in clang points out a use of bitwise OR with boolean
    expressions in this driver:
    
    drivers/platform/x86/thinkpad_acpi.c:9061:11: error: use of bitwise '|' with boolean operands [-Werror,-Wbitwise-instead-of-logical]
            else if ((strlencmp(cmd, "level disengaged") == 0) |
                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                                               ||
    drivers/platform/x86/thinkpad_acpi.c:9061:11: note: cast one or both operands to int to silence this warning
    1 error generated.
    
    This should clearly be a logical OR so change it to fix the warning.
    
    Fixes: fe98a52ce754 ("ACPI: thinkpad-acpi: add sysfs support to fan subdriver")
    Link: https://github.com/ClangBuiltLinux/linux/issues/1476
    Reported-by: Tor Vic <torvic9@mailbox.org>
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
    Link: https://lore.kernel.org/r/20211018182537.2316800-1-nathan@kernel.org
    Reviewed-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
index 35c7d3185fea..fa8bcbe3d276 100644
--- a/drivers/platform/x86/thinkpad_acpi.c
+++ b/drivers/platform/x86/thinkpad_acpi.c
@@ -9124,7 +9124,7 @@ static int fan_write_cmd_level(const char *cmd, int *rc)
 
 	if (strlencmp(cmd, "level auto") == 0)
 		level = TP_EC_FAN_AUTO;
-	else if ((strlencmp(cmd, "level disengaged") == 0) |
+	else if ((strlencmp(cmd, "level disengaged") == 0) ||
 			(strlencmp(cmd, "level full-speed") == 0))
 		level = TP_EC_FAN_FULLSPEED;
 	else if (sscanf(cmd, "level %d", &level) != 1)

commit ba409ba8f40a66473b8f17e09175cfc71c4e8d25
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Sat Oct 16 08:21:44 2021 +0200

    mmc: mxs-mmc: disable regulator on error and in the remove function
    
    [ Upstream commit ce5f6c2c9b0fcb4094f8e162cfd37fb4294204f7 ]
    
    The 'reg_vmmc' regulator is enabled in the probe. It is never disabled.
    Neither in the error handling path of the probe nor in the remove
    function.
    
    Register a devm_action to disable it when needed.
    
    Fixes: 4dc5a79f1350 ("mmc: mxs-mmc: enable regulator for mmc slot")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Link: https://lore.kernel.org/r/4aadb3c97835f7b80f00819c3d549e6130384e67.1634365151.git.christophe.jaillet@wanadoo.fr
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mmc/host/mxs-mmc.c b/drivers/mmc/host/mxs-mmc.c
index 7125687faf76..d7601dc5e85d 100644
--- a/drivers/mmc/host/mxs-mmc.c
+++ b/drivers/mmc/host/mxs-mmc.c
@@ -579,6 +579,11 @@ static const struct of_device_id mxs_mmc_dt_ids[] = {
 };
 MODULE_DEVICE_TABLE(of, mxs_mmc_dt_ids);
 
+static void mxs_mmc_regulator_disable(void *regulator)
+{
+	regulator_disable(regulator);
+}
+
 static int mxs_mmc_probe(struct platform_device *pdev)
 {
 	const struct of_device_id *of_id =
@@ -622,6 +627,11 @@ static int mxs_mmc_probe(struct platform_device *pdev)
 				"Failed to enable vmmc regulator: %d\n", ret);
 			goto out_mmc_free;
 		}
+
+		ret = devm_add_action_or_reset(&pdev->dev, mxs_mmc_regulator_disable,
+					       reg_vmmc);
+		if (ret)
+			goto out_mmc_free;
 	}
 
 	ssp->clk = devm_clk_get(&pdev->dev, NULL);

commit 8b8b3d738e450d2c2ccdc75f0ab5a951746c2a96
Author: Jakub Kicinski <kuba@kernel.org>
Date:   Fri Oct 15 06:37:39 2021 -0700

    net: stream: don't purge sk_error_queue in sk_stream_kill_queues()
    
    [ Upstream commit 24bcbe1cc69fa52dc4f7b5b2456678ed464724d8 ]
    
    sk_stream_kill_queues() can be called on close when there are
    still outstanding skbs to transmit. Those skbs may try to queue
    notifications to the error queue (e.g. timestamps).
    If sk_stream_kill_queues() purges the queue without taking
    its lock the queue may get corrupted, and skbs leaked.
    
    This shows up as a warning about an rmem leak:
    
    WARNING: CPU: 24 PID: 0 at net/ipv4/af_inet.c:154 inet_sock_destruct+0x...
    
    The leak is always a multiple of 0x300 bytes (the value is in
    %rax on my builds, so RAX: 0000000000000300). 0x300 is truesize of
    an empty sk_buff. Indeed if we dump the socket state at the time
    of the warning the sk_error_queue is often (but not always)
    corrupted. The ->next pointer points back at the list head,
    but not the ->prev pointer. Indeed we can find the leaked skb
    by scanning the kernel memory for something that looks like
    an skb with ->sk = socket in question, and ->truesize = 0x300.
    The contents of ->cb[] of the skb confirms the suspicion that
    it is indeed a timestamp notification (as generated in
    __skb_complete_tx_timestamp()).
    
    Removing purging of sk_error_queue should be okay, since
    inet_sock_destruct() does it again once all socket refs
    are gone. Eric suggests this may cause sockets that go
    thru disconnect() to maintain notifications from the
    previous incarnations of the socket, but that should be
    okay since the race was there anyway, and disconnect()
    is not exactly dependable.
    
    Thanks to Jonathan Lemon and Omar Sandoval for help at various
    stages of tracing the issue.
    
    Fixes: cb9eff097831 ("net: new user space API for time stamping of incoming and outgoing packets")
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Reviewed-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/core/stream.c b/net/core/stream.c
index 7f5eaa95a675..3d98774cf128 100644
--- a/net/core/stream.c
+++ b/net/core/stream.c
@@ -195,9 +195,6 @@ void sk_stream_kill_queues(struct sock *sk)
 	/* First the read buffer. */
 	__skb_queue_purge(&sk->sk_receive_queue);
 
-	/* Next, the error queue. */
-	__skb_queue_purge(&sk->sk_error_queue);
-
 	/* Next, the write queue. */
 	WARN_ON(!skb_queue_empty(&sk->sk_write_queue));
 

commit 9557d1174cb16de95ee544e82b0f4a0ea1417ad0
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Wed Oct 13 11:13:15 2021 +0300

    drm/msm: uninitialized variable in msm_gem_import()
    
    [ Upstream commit 2203bd0e5c12ffc53ffdd4fbd7b12d6ba27e0424 ]
    
    The msm_gem_new_impl() function cleans up after itself so there is no
    need to call drm_gem_object_put().  Conceptually, it does not make sense
    to call a kref_put() function until after the reference counting has
    been initialized which happens immediately after this call in the
    drm_gem_(private_)object_init() functions.
    
    In the msm_gem_import() function the "obj" pointer is uninitialized, so
    it will lead to a crash.
    
    Fixes: 05b849111c07 ("drm/msm: prime support")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Link: https://lore.kernel.org/r/20211013081315.GG6010@kili
    Signed-off-by: Rob Clark <robdclark@chromium.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
index 7c0b30c955c3..c551d8444497 100644
--- a/drivers/gpu/drm/msm/msm_gem.c
+++ b/drivers/gpu/drm/msm/msm_gem.c
@@ -965,7 +965,7 @@ static struct drm_gem_object *_msm_gem_new(struct drm_device *dev,
 
 	ret = msm_gem_new_impl(dev, size, flags, NULL, &obj, struct_mutex_locked);
 	if (ret)
-		goto fail;
+		return ERR_PTR(ret);
 
 	if (use_vram) {
 		struct msm_gem_vma *vma;
@@ -1035,7 +1035,7 @@ struct drm_gem_object *msm_gem_import(struct drm_device *dev,
 
 	ret = msm_gem_new_impl(dev, size, MSM_BO_WC, dmabuf->resv, &obj, false);
 	if (ret)
-		goto fail;
+		return ERR_PTR(ret);
 
 	drm_gem_private_object_init(dev, obj, size);
 

commit 8572ec276673ae83fa4212005529273206e15242
Author: Sven Eckelmann <seckelmann@datto.com>
Date:   Tue Jun 11 19:21:31 2019 +0200

    ath10k: fix max antenna gain unit
    
    [ Upstream commit 0a491167fe0cf9f26062462de2a8688b96125d48 ]
    
    Most of the txpower for the ath10k firmware is stored as twicepower (0.5 dB
    steps). This isn't the case for max_antenna_gain - which is still expected
    by the firmware as dB.
    
    The firmware is converting it from dB to the internal (twicepower)
    representation when it calculates the limits of a channel. This can be seen
    in tpc_stats when configuring "12" as max_antenna_gain. Instead of the
    expected 12 (6 dB), the tpc_stats shows 24 (12 dB).
    
    Tested on QCA9888 and IPQ4019 with firmware 10.4-3.5.3-00057.
    
    Fixes: 02256930d9b8 ("ath10k: use proper tx power unit")
    Signed-off-by: Sven Eckelmann <seckelmann@datto.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20190611172131.6064-1-sven@narfation.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 8102d684be59..6e4096fd6633 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -1003,7 +1003,7 @@ static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
 	arg.channel.min_power = 0;
 	arg.channel.max_power = channel->max_power * 2;
 	arg.channel.max_reg_power = channel->max_reg_power * 2;
-	arg.channel.max_antenna_gain = channel->max_antenna_gain * 2;
+	arg.channel.max_antenna_gain = channel->max_antenna_gain;
 
 	reinit_completion(&ar->vdev_setup_done);
 
@@ -1445,7 +1445,7 @@ static int ath10k_vdev_start_restart(struct ath10k_vif *arvif,
 	arg.channel.min_power = 0;
 	arg.channel.max_power = chandef->chan->max_power * 2;
 	arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
-	arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain * 2;
+	arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain;
 
 	if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
 		arg.ssid = arvif->u.ap.ssid;
@@ -3104,7 +3104,7 @@ static int ath10k_update_channel_list(struct ath10k *ar)
 			ch->min_power = 0;
 			ch->max_power = channel->max_power * 2;
 			ch->max_reg_power = channel->max_reg_power * 2;
-			ch->max_antenna_gain = channel->max_antenna_gain * 2;
+			ch->max_antenna_gain = channel->max_antenna_gain;
 			ch->reg_class_id = 0; /* FIXME */
 
 			/* FIXME: why use only legacy modes, why not any
diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h
index 6bd63d1cd039..1292f3235e32 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.h
+++ b/drivers/net/wireless/ath/ath10k/wmi.h
@@ -1988,7 +1988,9 @@ struct wmi_channel {
 	union {
 		__le32 reginfo1;
 		struct {
+			/* note: power unit is 1 dBm */
 			u8 antenna_max;
+			/* note: power unit is 0.5 dBm */
 			u8 max_tx_power;
 		} __packed;
 	} __packed;
@@ -2008,6 +2010,7 @@ struct wmi_channel_arg {
 	u32 min_power;
 	u32 max_power;
 	u32 max_reg_power;
+	/* note: power unit is 1 dBm */
 	u32 max_antenna_gain;
 	u32 reg_class_id;
 	enum wmi_phy_mode mode;

commit f7ab93180ff88ca4630a4d96a2908b378bbe6ef9
Author: Zev Weiss <zev@bewilderbeest.net>
Date:   Tue Sep 28 02:22:38 2021 -0700

    hwmon: (pmbus/lm25066) Let compiler determine outer dimension of lm25066_coeff
    
    [ Upstream commit b7931a7b0e0df4d2a25fedd895ad32c746b77bc1 ]
    
    Maintaining this manually is error prone (there are currently only
    five chips supported, not six); gcc can do it for us automatically.
    
    Signed-off-by: Zev Weiss <zev@bewilderbeest.net>
    Fixes: 666c14906b49 ("hwmon: (pmbus/lm25066) Drop support for LM25063")
    Link: https://lore.kernel.org/r/20210928092242.30036-5-zev@bewilderbeest.net
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hwmon/pmbus/lm25066.c b/drivers/hwmon/pmbus/lm25066.c
index 6eafcbb75dcd..e25b80149086 100644
--- a/drivers/hwmon/pmbus/lm25066.c
+++ b/drivers/hwmon/pmbus/lm25066.c
@@ -60,7 +60,7 @@ struct __coeff {
 #define PSC_CURRENT_IN_L	(PSC_NUM_CLASSES)
 #define PSC_POWER_L		(PSC_NUM_CLASSES + 1)
 
-static struct __coeff lm25066_coeff[6][PSC_NUM_CLASSES + 2] = {
+static struct __coeff lm25066_coeff[][PSC_NUM_CLASSES + 2] = {
 	[lm25056] = {
 		[PSC_VOLTAGE_IN] = {
 			.m = 16296,

commit b43da4121715fac042de0733ffa97dbfab198069
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Tue Oct 12 19:27:58 2021 +0800

    hwmon: Fix possible memleak in __hwmon_device_register()
    
    [ Upstream commit ada61aa0b1184a8fda1a89a340c7d6cc4e59aee5 ]
    
    I got memory leak as follows when doing fault injection test:
    
    unreferenced object 0xffff888102740438 (size 8):
      comm "27", pid 859, jiffies 4295031351 (age 143.992s)
      hex dump (first 8 bytes):
        68 77 6d 6f 6e 30 00 00                          hwmon0..
      backtrace:
        [<00000000544b5996>] __kmalloc_track_caller+0x1a6/0x300
        [<00000000df0d62b9>] kvasprintf+0xad/0x140
        [<00000000d3d2a3da>] kvasprintf_const+0x62/0x190
        [<000000005f8f0f29>] kobject_set_name_vargs+0x56/0x140
        [<00000000b739e4b9>] dev_set_name+0xb0/0xe0
        [<0000000095b69c25>] __hwmon_device_register+0xf19/0x1e50 [hwmon]
        [<00000000a7e65b52>] hwmon_device_register_with_info+0xcb/0x110 [hwmon]
        [<000000006f181e86>] devm_hwmon_device_register_with_info+0x85/0x100 [hwmon]
        [<0000000081bdc567>] tmp421_probe+0x2d2/0x465 [tmp421]
        [<00000000502cc3f8>] i2c_device_probe+0x4e1/0xbb0
        [<00000000f90bda3b>] really_probe+0x285/0xc30
        [<000000007eac7b77>] __driver_probe_device+0x35f/0x4f0
        [<000000004953d43d>] driver_probe_device+0x4f/0x140
        [<000000002ada2d41>] __device_attach_driver+0x24c/0x330
        [<00000000b3977977>] bus_for_each_drv+0x15d/0x1e0
        [<000000005bf2a8e3>] __device_attach+0x267/0x410
    
    When device_register() returns an error, the name allocated in
    dev_set_name() will be leaked, the put_device() should be used
    instead of calling hwmon_dev_release() to give up the device
    reference, then the name will be freed in kobject_cleanup().
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Fixes: bab2243ce189 ("hwmon: Introduce hwmon_device_register_with_groups")
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Link: https://lore.kernel.org/r/20211012112758.2681084-1-yangyingliang@huawei.com
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hwmon/hwmon.c b/drivers/hwmon/hwmon.c
index d34de21d43ad..c4051a3e63c2 100644
--- a/drivers/hwmon/hwmon.c
+++ b/drivers/hwmon/hwmon.c
@@ -631,8 +631,10 @@ __hwmon_device_register(struct device *dev, const char *name, void *drvdata,
 	dev_set_drvdata(hdev, drvdata);
 	dev_set_name(hdev, HWMON_ID_FORMAT, id);
 	err = device_register(hdev);
-	if (err)
-		goto free_hwmon;
+	if (err) {
+		put_device(hdev);
+		goto ida_remove;
+	}
 
 	if (dev && dev->of_node && chip && chip->ops->read &&
 	    chip->info[0]->type == hwmon_chip &&

commit 3339c3bf3d779cc9de21bd9501d08ac651b22dc1
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Mon Oct 11 15:39:12 2021 +0300

    memstick: jmb38x_ms: use appropriate free function in jmb38x_ms_alloc_host()
    
    [ Upstream commit beae4a6258e64af609ad5995cc6b6056eb0d898e ]
    
    The "msh" pointer is device managed, meaning that memstick_alloc_host()
    calls device_initialize() on it.  That means that it can't be free
    using kfree() but must instead be freed with memstick_free_host().
    Otherwise it leads to a tiny memory leak of device resources.
    
    Fixes: 60fdd931d577 ("memstick: add support for JMicron jmb38x MemoryStick host controller")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Link: https://lore.kernel.org/r/20211011123912.GD15188@kili
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/memstick/host/jmb38x_ms.c b/drivers/memstick/host/jmb38x_ms.c
index 29f5021d21ea..0610d3c9f131 100644
--- a/drivers/memstick/host/jmb38x_ms.c
+++ b/drivers/memstick/host/jmb38x_ms.c
@@ -907,7 +907,7 @@ static struct memstick_host *jmb38x_ms_alloc_host(struct jmb38x_ms *jm, int cnt)
 
 	iounmap(host->addr);
 err_out_free:
-	kfree(msh);
+	memstick_free_host(msh);
 	return NULL;
 }
 

commit d9c74d3fe297a9b056e1fe6a60c78578296cdb0e
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Mon Sep 27 11:44:47 2021 +0200

    memstick: avoid out-of-range warning
    
    [ Upstream commit 4853396f03c3019eccf5cd113e464231e9ddf0b3 ]
    
    clang-14 complains about a sanity check that always passes when the
    page size is 64KB or larger:
    
    drivers/memstick/core/ms_block.c:1739:21: error: result of comparison of constant 65536 with expression of type 'unsigned short' is always false [-Werror,-Wtautological-constant-out-of-range-compare]
            if (msb->page_size > PAGE_SIZE) {
                ~~~~~~~~~~~~~~ ^ ~~~~~~~~~
    
    This is fine, it will still work on all architectures, so just shut
    up that warning with a cast.
    
    Fixes: 0ab30494bc4f ("memstick: add support for legacy memorysticks")
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Link: https://lore.kernel.org/r/20210927094520.696665-1-arnd@kernel.org
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/memstick/core/ms_block.c b/drivers/memstick/core/ms_block.c
index 8a02f11076f9..7aab26128f6d 100644
--- a/drivers/memstick/core/ms_block.c
+++ b/drivers/memstick/core/ms_block.c
@@ -1731,7 +1731,7 @@ static int msb_init_card(struct memstick_dev *card)
 	msb->pages_in_block = boot_block->attr.block_size * 2;
 	msb->block_size = msb->page_size * msb->pages_in_block;
 
-	if (msb->page_size > PAGE_SIZE) {
+	if ((size_t)msb->page_size > PAGE_SIZE) {
 		/* this isn't supported by linux at all, anyway*/
 		dbg("device page %d size isn't supported", msb->page_size);
 		return -EINVAL;

commit ebe430f845e2187513d7d3bc9ce9de0ceb73f9dd
Author: Tony Lindgren <tony@atomide.com>
Date:   Tue Sep 21 14:00:25 2021 +0300

    mmc: sdhci-omap: Fix NULL pointer exception if regulator is not configured
    
    [ Upstream commit 8e0e7bd38b1ec7f9e5d18725ad41828be4e09859 ]
    
    If sdhci-omap is configured for an unused device instance and the device
    is not set as disabled, we can get a NULL pointer dereference:
    
    Unable to handle kernel NULL pointer dereference at virtual address
    00000045
    ...
    (regulator_set_voltage) from [<c07d7008>] (mmc_regulator_set_ocr+0x44/0xd0)
    (mmc_regulator_set_ocr) from [<c07e2d80>] (sdhci_set_ios+0xa4/0x490)
    (sdhci_set_ios) from [<c07ea690>] (sdhci_omap_set_ios+0x124/0x160)
    (sdhci_omap_set_ios) from [<c07c8e94>] (mmc_power_up.part.0+0x3c/0x154)
    (mmc_power_up.part.0) from [<c07c9d20>] (mmc_start_host+0x88/0x9c)
    (mmc_start_host) from [<c07cad34>] (mmc_add_host+0x58/0x7c)
    (mmc_add_host) from [<c07e2574>] (__sdhci_add_host+0xf0/0x22c)
    (__sdhci_add_host) from [<c07eaf68>] (sdhci_omap_probe+0x318/0x72c)
    (sdhci_omap_probe) from [<c06a39d8>] (platform_probe+0x58/0xb8)
    
    AFAIK we are not seeing this with the devices configured in the mainline
    kernel but this can cause issues for folks bringing up their boards.
    
    Fixes: 7d326930d352 ("mmc: sdhci-omap: Add OMAP SDHCI driver")
    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Link: https://lore.kernel.org/r/20210921110029.21944-2-tony@atomide.com
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mmc/host/sdhci-omap.c b/drivers/mmc/host/sdhci-omap.c
index 05ade7a2dd24..f5bff9e710fb 100644
--- a/drivers/mmc/host/sdhci-omap.c
+++ b/drivers/mmc/host/sdhci-omap.c
@@ -690,7 +690,8 @@ static void sdhci_omap_set_power(struct sdhci_host *host, unsigned char mode,
 {
 	struct mmc_host *mmc = host->mmc;
 
-	mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd);
+	if (!IS_ERR(mmc->supply.vmmc))
+		mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd);
 }
 
 static int sdhci_omap_enable_dma(struct sdhci_host *host)

commit 4e7f92a40ce51da1b9e8814db122509dbfcd3583
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Wed Oct 6 10:36:22 2021 +0300

    b43: fix a lower bounds test
    
    [ Upstream commit 9b793db5fca44d01f72d3564a168171acf7c4076 ]
    
    The problem is that "channel" is an unsigned int, when it's less 5 the
    value of "channel - 5" is not a negative number as one would expect but
    is very high positive value instead.
    
    This means that "start" becomes a very high positive value.  The result
    of that is that we never enter the "for (i = start; i <= end; i++) {"
    loop.  Instead of storing the result from b43legacy_radio_aci_detect()
    it just uses zero.
    
    Fixes: ef1a628d83fc ("b43: Implement dynamic PHY API")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Acked-by: Michael Büsch <m@bues.ch>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20211006073621.GE8404@kili
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/broadcom/b43/phy_g.c b/drivers/net/wireless/broadcom/b43/phy_g.c
index f59c02166462..40e10d0b7cd7 100644
--- a/drivers/net/wireless/broadcom/b43/phy_g.c
+++ b/drivers/net/wireless/broadcom/b43/phy_g.c
@@ -2310,7 +2310,7 @@ static u8 b43_gphy_aci_scan(struct b43_wldev *dev)
 	b43_phy_mask(dev, B43_PHY_G_CRS, 0x7FFF);
 	b43_set_all_gains(dev, 3, 8, 1);
 
-	start = (channel - 5 > 0) ? channel - 5 : 1;
+	start = (channel > 5) ? channel - 5 : 1;
 	end = (channel + 5 < 14) ? channel + 5 : 13;
 
 	for (i = start; i <= end; i++) {

commit 0366277e42404d4a4c371682252bb73817e35699
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Wed Oct 6 10:35:42 2021 +0300

    b43legacy: fix a lower bounds test
    
    [ Upstream commit c1c8380b0320ab757e60ed90efc8b1992a943256 ]
    
    The problem is that "channel" is an unsigned int, when it's less 5 the
    value of "channel - 5" is not a negative number as one would expect but
    is very high positive value instead.
    
    This means that "start" becomes a very high positive value.  The result
    of that is that we never enter the "for (i = start; i <= end; i++) {"
    loop.  Instead of storing the result from b43legacy_radio_aci_detect()
    it just uses zero.
    
    Fixes: 75388acd0cd8 ("[B43LEGACY]: add mac80211-based driver for legacy BCM43xx devices")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Acked-by: Michael Büsch <m@bues.ch>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20211006073542.GD8404@kili
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/broadcom/b43legacy/radio.c b/drivers/net/wireless/broadcom/b43legacy/radio.c
index eab1c9387846..8f845db23766 100644
--- a/drivers/net/wireless/broadcom/b43legacy/radio.c
+++ b/drivers/net/wireless/broadcom/b43legacy/radio.c
@@ -299,7 +299,7 @@ u8 b43legacy_radio_aci_scan(struct b43legacy_wldev *dev)
 			    & 0x7FFF);
 	b43legacy_set_all_gains(dev, 3, 8, 1);
 
-	start = (channel - 5 > 0) ? channel - 5 : 1;
+	start = (channel > 5) ? channel - 5 : 1;
 	end = (channel + 5 < 14) ? channel + 5 : 13;
 
 	for (i = start; i <= end; i++) {

commit a6243a391cb980f8ea6928d7a5164230a9478141
Author: Markus Schneider-Pargmann <msp@baylibre.com>
Date:   Thu Sep 30 21:12:42 2021 +0200

    hwrng: mtk - Force runtime pm ops for sleep ops
    
    [ Upstream commit b6f5f0c8f72d348b2d07b20d7b680ef13a7ffe98 ]
    
    Currently mtk_rng_runtime_suspend/resume is called for both runtime pm
    and system sleep operations.
    
    This is wrong as these should only be runtime ops as the name already
    suggests. Currently freezing the system will lead to a call to
    mtk_rng_runtime_suspend even if the device currently isn't active. This
    leads to a clock warning because it is disabled/unprepared although it
    isn't enabled/prepared currently.
    
    This patch fixes this by only setting the runtime pm ops and forces to
    call the runtime pm ops from the system sleep ops as well if active but
    not otherwise.
    
    Fixes: 81d2b34508c6 ("hwrng: mtk - add runtime PM support")
    Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/char/hw_random/mtk-rng.c b/drivers/char/hw_random/mtk-rng.c
index 7f99cd52b40e..8dc256c76113 100644
--- a/drivers/char/hw_random/mtk-rng.c
+++ b/drivers/char/hw_random/mtk-rng.c
@@ -182,8 +182,13 @@ static int mtk_rng_runtime_resume(struct device *dev)
 	return mtk_rng_init(&priv->rng);
 }
 
-static UNIVERSAL_DEV_PM_OPS(mtk_rng_pm_ops, mtk_rng_runtime_suspend,
-			    mtk_rng_runtime_resume, NULL);
+static const struct dev_pm_ops mtk_rng_pm_ops = {
+	SET_RUNTIME_PM_OPS(mtk_rng_runtime_suspend,
+			   mtk_rng_runtime_resume, NULL)
+	SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
+				pm_runtime_force_resume)
+};
+
 #define MTK_RNG_PM_OPS (&mtk_rng_pm_ops)
 #else	/* CONFIG_PM */
 #define MTK_RNG_PM_OPS NULL

commit 17132c4206d59ba02b703bea052583cbf27fe076
Author: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Date:   Tue Sep 28 12:44:30 2021 +0100

    crypto: qat - disregard spurious PFVF interrupts
    
    [ Upstream commit 18fcba469ba5359c1de7e3fb16f7b9e8cd1b8e02 ]
    
    Upon receiving a PFVF message, check if the interrupt bit is set in the
    message. If it is not, that means that the interrupt was probably
    triggered by a collision. In this case, disregard the message and
    re-enable the interrupts.
    
    Fixes: ed8ccaef52fa ("crypto: qat - Add support for SRIOV")
    Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
    Reviewed-by: Marco Chiappero <marco.chiappero@intel.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
index 72fd2bbbe704..180016e15777 100644
--- a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
+++ b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
@@ -250,6 +250,11 @@ void adf_vf2pf_req_hndl(struct adf_accel_vf_info *vf_info)
 
 	/* Read message from the VF */
 	msg = ADF_CSR_RD(pmisc_addr, hw_data->get_pf2vf_offset(vf_nr));
+	if (!(msg & ADF_VF2PF_INT)) {
+		dev_info(&GET_DEV(accel_dev),
+			 "Spurious VF2PF interrupt, msg %X. Ignored\n", msg);
+		goto out;
+	}
 
 	/* To ACK, clear the VF2PFINT bit */
 	msg &= ~ADF_VF2PF_INT;
@@ -333,6 +338,7 @@ void adf_vf2pf_req_hndl(struct adf_accel_vf_info *vf_info)
 	if (resp && adf_iov_putmsg(accel_dev, resp, vf_nr))
 		dev_err(&GET_DEV(accel_dev), "Failed to send response to VF\n");
 
+out:
 	/* re-enable interrupt on PF from this VF */
 	adf_enable_vf2pf_interrupts(accel_dev, (1 << vf_nr));
 	return;
diff --git a/drivers/crypto/qat/qat_common/adf_vf_isr.c b/drivers/crypto/qat/qat_common/adf_vf_isr.c
index ef90902c8200..86274e3c6781 100644
--- a/drivers/crypto/qat/qat_common/adf_vf_isr.c
+++ b/drivers/crypto/qat/qat_common/adf_vf_isr.c
@@ -123,6 +123,11 @@ static void adf_pf2vf_bh_handler(void *data)
 
 	/* Read the message from PF */
 	msg = ADF_CSR_RD(pmisc_bar_addr, hw_data->get_pf2vf_offset(0));
+	if (!(msg & ADF_PF2VF_INT)) {
+		dev_info(&GET_DEV(accel_dev),
+			 "Spurious PF2VF interrupt, msg %X. Ignored\n", msg);
+		goto out;
+	}
 
 	if (!(msg & ADF_PF2VF_MSGORIGIN_SYSTEM))
 		/* Ignore legacy non-system (non-kernel) PF2VF messages */
@@ -171,6 +176,7 @@ static void adf_pf2vf_bh_handler(void *data)
 	msg &= ~ADF_PF2VF_INT;
 	ADF_CSR_WR(pmisc_bar_addr, hw_data->get_pf2vf_offset(0), msg);
 
+out:
 	/* Re-enable PF2VF interrupts */
 	adf_enable_pf2vf_interrupts(accel_dev);
 	return;

commit 2eed601f3d4ce9d5a58f18554c20202e3410f2c5
Author: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Date:   Tue Sep 28 12:44:29 2021 +0100

    crypto: qat - detect PFVF collision after ACK
    
    [ Upstream commit 9b768e8a3909ac1ab39ed44a3933716da7761a6f ]
    
    Detect a PFVF collision between the local and the remote function by
    checking if the message on the PFVF CSR has been overwritten.
    This is done after the remote function confirms that the message has
    been received, by clearing the interrupt bit, or the maximum number of
    attempts (ADF_IOV_MSG_ACK_MAX_RETRY) to check the CSR has been exceeded.
    
    Fixes: ed8ccaef52fa ("crypto: qat - Add support for SRIOV")
    Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
    Co-developed-by: Marco Chiappero <marco.chiappero@intel.com>
    Signed-off-by: Marco Chiappero <marco.chiappero@intel.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
index c64481160b71..72fd2bbbe704 100644
--- a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
+++ b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
@@ -195,6 +195,13 @@ static int __adf_iov_putmsg(struct adf_accel_dev *accel_dev, u32 msg, u8 vf_nr)
 		val = ADF_CSR_RD(pmisc_bar_addr, pf2vf_offset);
 	} while ((val & int_bit) && (count++ < ADF_IOV_MSG_ACK_MAX_RETRY));
 
+	if (val != msg) {
+		dev_dbg(&GET_DEV(accel_dev),
+			"Collision - PFVF CSR overwritten by remote function\n");
+		ret = -EIO;
+		goto out;
+	}
+
 	if (val & int_bit) {
 		dev_dbg(&GET_DEV(accel_dev), "ACK not received from remote\n");
 		val &= ~int_bit;

commit 25be1102d501764dd0b972e9dd59f1cc12fd1e92
Author: Evgeny Novikov <novikov@ispras.ru>
Date:   Sun Aug 22 11:48:03 2021 +0200

    media: dvb-frontends: mn88443x: Handle errors of clk_prepare_enable()
    
    [ Upstream commit 69a10678e2fba3d182e78ea041f2d1b1a6058764 ]
    
    mn88443x_cmn_power_on() did not handle possible errors of
    clk_prepare_enable() and always finished successfully so that its caller
    mn88443x_probe() did not care about failed preparing/enabling of clocks
    as well.
    
    Add missed error handling in both mn88443x_cmn_power_on() and
    mn88443x_probe(). This required to change the return value of the former
    from "void" to "int".
    
    Found by Linux Driver Verification project (linuxtesting.org).
    
    Fixes: 0f408ce8941f ("media: dvb-frontends: add Socionext MN88443x ISDB-S/T demodulator driver")
    Signed-off-by: Evgeny Novikov <novikov@ispras.ru>
    Co-developed-by: Kirill Shilimanov <kirill.shilimanov@huawei.com>
    Signed-off-by: Kirill Shilimanov <kirill.shilimanov@huawei.com>
    Signed-off-by: Sean Young <sean@mess.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/dvb-frontends/mn88443x.c b/drivers/media/dvb-frontends/mn88443x.c
index 9ec1aeef03d5..53981ff9422e 100644
--- a/drivers/media/dvb-frontends/mn88443x.c
+++ b/drivers/media/dvb-frontends/mn88443x.c
@@ -204,11 +204,18 @@ struct mn88443x_priv {
 	struct regmap *regmap_t;
 };
 
-static void mn88443x_cmn_power_on(struct mn88443x_priv *chip)
+static int mn88443x_cmn_power_on(struct mn88443x_priv *chip)
 {
+	struct device *dev = &chip->client_s->dev;
 	struct regmap *r_t = chip->regmap_t;
+	int ret;
 
-	clk_prepare_enable(chip->mclk);
+	ret = clk_prepare_enable(chip->mclk);
+	if (ret) {
+		dev_err(dev, "Failed to prepare and enable mclk: %d\n",
+			ret);
+		return ret;
+	}
 
 	gpiod_set_value_cansleep(chip->reset_gpio, 1);
 	usleep_range(100, 1000);
@@ -222,6 +229,8 @@ static void mn88443x_cmn_power_on(struct mn88443x_priv *chip)
 	} else {
 		regmap_write(r_t, HIZSET3, 0x8f);
 	}
+
+	return 0;
 }
 
 static void mn88443x_cmn_power_off(struct mn88443x_priv *chip)
@@ -738,7 +747,10 @@ static int mn88443x_probe(struct i2c_client *client,
 	chip->fe.demodulator_priv = chip;
 	i2c_set_clientdata(client, chip);
 
-	mn88443x_cmn_power_on(chip);
+	ret = mn88443x_cmn_power_on(chip);
+	if (ret)
+		goto err_i2c_t;
+
 	mn88443x_s_sleep(chip);
 	mn88443x_t_sleep(chip);
 

commit 0211410aada90cfc15fc322f9e490bd07f1635f7
Author: Linus Lüssing <ll@simonwunderlich.de>
Date:   Tue Oct 5 16:55:53 2021 +0300

    ath9k: Fix potential interrupt storm on queue reset
    
    [ Upstream commit 4925642d541278575ad1948c5924d71ffd57ef14 ]
    
    In tests with two Lima boards from 8devices (QCA4531 based) on OpenWrt
    19.07 we could force a silent restart of a device with no serial
    output when we were sending a high amount of UDP traffic (iperf3 at 80
    MBit/s in both directions from external hosts, saturating the wifi and
    causing a load of about 4.5 to 6) and were then triggering an
    ath9k_queue_reset().
    
    Further debugging showed that the restart was caused by the ath79
    watchdog. With disabled watchdog we could observe that the device was
    constantly going into ath_isr() interrupt handler and was returning
    early after the ATH_OP_HW_RESET flag test, without clearing any
    interrupts. Even though ath9k_queue_reset() calls
    ath9k_hw_kill_interrupts().
    
    With JTAG we could observe the following race condition:
    
    1) ath9k_queue_reset()
       ...
       -> ath9k_hw_kill_interrupts()
       -> set_bit(ATH_OP_HW_RESET, &common->op_flags);
       ...
       <- returns
    
          2) ath9k_tasklet()
             ...
             -> ath9k_hw_resume_interrupts()
             ...
             <- returns
    
                     3) loops around:
                        ...
                        handle_int()
                        -> ath_isr()
                           ...
                           -> if (test_bit(ATH_OP_HW_RESET,
                                           &common->op_flags))
                                return IRQ_HANDLED;
    
                        x) ath_reset_internal():
                           => never reached <=
    
    And in ath_isr() we would typically see the following interrupts /
    interrupt causes:
    
    * status: 0x00111030 or 0x00110030
    * async_cause: 2 (AR_INTR_MAC_IPQ)
    * sync_cause: 0
    
    So the ath9k_tasklet() reenables the ath9k interrupts
    through ath9k_hw_resume_interrupts() which ath9k_queue_reset() had just
    disabled. And ath_isr() then keeps firing because it returns IRQ_HANDLED
    without actually clearing the interrupt.
    
    To fix this IRQ storm also clear/disable the interrupts again when we
    are in reset state.
    
    Cc: Sven Eckelmann <sven@narfation.org>
    Cc: Simon Wunderlich <sw@simonwunderlich.de>
    Cc: Linus Lüssing <linus.luessing@c0d3.blue>
    Fixes: 872b5d814f99 ("ath9k: do not access hardware on IRQs during reset")
    Signed-off-by: Linus Lüssing <ll@simonwunderlich.de>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210914192515.9273-3-linus.luessing@c0d3.blue
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index a0097bebcba3..ee1b9c39bad7 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -530,8 +530,10 @@ irqreturn_t ath_isr(int irq, void *dev)
 	ath9k_debug_sync_cause(sc, sync_cause);
 	status &= ah->imask;	/* discard unasked-for bits */
 
-	if (test_bit(ATH_OP_HW_RESET, &common->op_flags))
+	if (test_bit(ATH_OP_HW_RESET, &common->op_flags)) {
+		ath9k_hw_kill_interrupts(sc->sc_ah);
 		return IRQ_HANDLED;
+	}
 
 	/*
 	 * If there are no status bits set, then this interrupt was not

commit e8bde27b97a345878c2a3d6446373601a7260705
Author: Colin Ian King <colin.king@canonical.com>
Date:   Fri Sep 17 18:07:02 2021 +0200

    media: em28xx: Don't use ops->suspend if it is NULL
    
    [ Upstream commit 51fa3b70d27342baf1ea8aaab3e96e5f4f26d5b2 ]
    
    The call to ops->suspend for the dev->dev_next case can currently
    trigger a call on a null function pointer if ops->suspend is null.
    Skip over the use of function ops->suspend if it is null.
    
    Addresses-Coverity: ("Dereference after null check")
    
    Fixes: be7fd3c3a8c5 ("media: em28xx: Hauppauge DualHD second tuner functionality")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/usb/em28xx/em28xx-core.c b/drivers/media/usb/em28xx/em28xx-core.c
index d0f95a5cb4d2..437651307056 100644
--- a/drivers/media/usb/em28xx/em28xx-core.c
+++ b/drivers/media/usb/em28xx/em28xx-core.c
@@ -1151,8 +1151,9 @@ int em28xx_suspend_extension(struct em28xx *dev)
 	dev_info(&dev->intf->dev, "Suspending extensions\n");
 	mutex_lock(&em28xx_devlist_mutex);
 	list_for_each_entry(ops, &em28xx_extension_devlist, next) {
-		if (ops->suspend)
-			ops->suspend(dev);
+		if (!ops->suspend)
+			continue;
+		ops->suspend(dev);
 		if (dev->dev_next)
 			ops->suspend(dev->dev_next);
 	}

commit 22d44652b6d6404b96a40bb051d1046e6c005ae5
Author: Anel Orazgaliyeva <anelkz@amazon.de>
Date:   Mon Sep 6 18:34:40 2021 +0000

    cpuidle: Fix kobject memory leaks in error paths
    
    [ Upstream commit e5f5a66c9aa9c331da5527c2e3fd9394e7091e01 ]
    
    Commit c343bf1ba5ef ("cpuidle: Fix three reference count leaks")
    fixes the cleanup of kobjects; however, it removes kfree() calls
    altogether, leading to memory leaks.
    
    Fix those and also defer the initialization of dev->kobj_dev until
    after the error check, so that we do not end up with a dangling
    pointer.
    
    Fixes: c343bf1ba5ef ("cpuidle: Fix three reference count leaks")
    Signed-off-by: Anel Orazgaliyeva <anelkz@amazon.de>
    Suggested-by: Aman Priyadarshi <apeureka@amazon.de>
    [ rjw: Subject edits ]
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/cpuidle/sysfs.c b/drivers/cpuidle/sysfs.c
index 66979dc33680..d9b917529aba 100644
--- a/drivers/cpuidle/sysfs.c
+++ b/drivers/cpuidle/sysfs.c
@@ -468,6 +468,7 @@ static int cpuidle_add_state_sysfs(struct cpuidle_device *device)
 					   &kdev->kobj, "state%d", i);
 		if (ret) {
 			kobject_put(&kobj->kobj);
+			kfree(kobj);
 			goto error_state;
 		}
 		cpuidle_add_s2idle_attr_group(kobj);
@@ -599,6 +600,7 @@ static int cpuidle_add_driver_sysfs(struct cpuidle_device *dev)
 				   &kdev->kobj, "driver");
 	if (ret) {
 		kobject_put(&kdrv->kobj);
+		kfree(kdrv);
 		return ret;
 	}
 
@@ -685,7 +687,6 @@ int cpuidle_add_sysfs(struct cpuidle_device *dev)
 	if (!kdev)
 		return -ENOMEM;
 	kdev->dev = dev;
-	dev->kobj_dev = kdev;
 
 	init_completion(&kdev->kobj_unregister);
 
@@ -693,9 +694,11 @@ int cpuidle_add_sysfs(struct cpuidle_device *dev)
 				   "cpuidle");
 	if (error) {
 		kobject_put(&kdev->kobj);
+		kfree(kdev);
 		return error;
 	}
 
+	dev->kobj_dev = kdev;
 	kobject_uevent(&kdev->kobj, KOBJ_ADD);
 
 	return 0;

commit 3b19077c7e1e81e5e0a0cb04a881151b3d0713e1
Author: Colin Ian King <colin.king@canonical.com>
Date:   Wed Aug 4 10:50:10 2021 +0200

    media: cx23885: Fix snd_card_free call on null card pointer
    
    [ Upstream commit 7266dda2f1dfe151b12ef0c14eb4d4e622fb211c ]
    
    Currently a call to snd_card_new that fails will set card with a NULL
    pointer, this causes a null pointer dereference on the error cleanup
    path when card it passed to snd_card_free. Fix this by adding a new
    error exit path that does not call snd_card_free and exiting via this
    new path.
    
    Addresses-Coverity: ("Explicit null dereference")
    
    Fixes: 9e44d63246a9 ("[media] cx23885: Add ALSA support")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/pci/cx23885/cx23885-alsa.c b/drivers/media/pci/cx23885/cx23885-alsa.c
index db1e8ff35474..150106eb3605 100644
--- a/drivers/media/pci/cx23885/cx23885-alsa.c
+++ b/drivers/media/pci/cx23885/cx23885-alsa.c
@@ -559,7 +559,7 @@ struct cx23885_audio_dev *cx23885_audio_register(struct cx23885_dev *dev)
 			   SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
 			THIS_MODULE, sizeof(struct cx23885_audio_dev), &card);
 	if (err < 0)
-		goto error;
+		goto error_msg;
 
 	chip = (struct cx23885_audio_dev *) card->private_data;
 	chip->dev = dev;
@@ -585,6 +585,7 @@ struct cx23885_audio_dev *cx23885_audio_register(struct cx23885_dev *dev)
 
 error:
 	snd_card_free(card);
+error_msg:
 	pr_err("%s(): Failed to register analog audio adapter\n",
 	       __func__);
 

commit 6f5e867d08ecdf34181d828bbdbb2c8ddaf3526e
Author: Kees Cook <keescook@chromium.org>
Date:   Tue Aug 3 21:46:09 2021 +0200

    media: si470x: Avoid card name truncation
    
    [ Upstream commit 2908249f3878a591f7918368fdf0b7b0a6c3158c ]
    
    The "card" string only holds 31 characters (and the terminating NUL).
    In order to avoid truncation, use a shorter card description instead of
    the current result, "Silicon Labs Si470x FM Radio Re".
    
    Suggested-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Fixes: 78656acdcf48 ("V4L/DVB (7038): USB radio driver for Silicon Labs Si470x FM Radio Receivers")
    Fixes: cc35bbddfe10 ("V4L/DVB (12416): radio-si470x: add i2c driver for si470x")
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/radio/si470x/radio-si470x-i2c.c b/drivers/media/radio/si470x/radio-si470x-i2c.c
index aa12fd266389..cc68bdac0c36 100644
--- a/drivers/media/radio/si470x/radio-si470x-i2c.c
+++ b/drivers/media/radio/si470x/radio-si470x-i2c.c
@@ -20,7 +20,7 @@
 
 /* driver definitions */
 #define DRIVER_AUTHOR "Joonyoung Shim <jy0922.shim@samsung.com>";
-#define DRIVER_CARD "Silicon Labs Si470x FM Radio Receiver"
+#define DRIVER_CARD "Silicon Labs Si470x FM Radio"
 #define DRIVER_DESC "I2C radio driver for Si470x FM Radio Receivers"
 #define DRIVER_VERSION "1.0.2"
 
diff --git a/drivers/media/radio/si470x/radio-si470x-usb.c b/drivers/media/radio/si470x/radio-si470x-usb.c
index 19e381dd5808..ba43a727c0b9 100644
--- a/drivers/media/radio/si470x/radio-si470x-usb.c
+++ b/drivers/media/radio/si470x/radio-si470x-usb.c
@@ -25,7 +25,7 @@
 
 /* driver definitions */
 #define DRIVER_AUTHOR "Tobias Lorenz <tobias.lorenz@gmx.net>"
-#define DRIVER_CARD "Silicon Labs Si470x FM Radio Receiver"
+#define DRIVER_CARD "Silicon Labs Si470x FM Radio"
 #define DRIVER_DESC "USB radio driver for Si470x FM Radio Receivers"
 #define DRIVER_VERSION "1.0.10"
 

commit 91d1f8aed63f5d1943c384ee24188ed4b66446e6
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Thu Aug 19 22:21:25 2021 +0200

    media: mtk-vpu: Fix a resource leak in the error handling path of 'mtk_vpu_probe()'
    
    [ Upstream commit 2143ad413c05c7be24c3a92760e367b7f6aaac92 ]
    
    A successful 'clk_prepare()' call should be balanced by a corresponding
    'clk_unprepare()' call in the error handling path of the probe, as already
    done in the remove function.
    
    Update the error handling path accordingly.
    
    Fixes: 3003a180ef6b ("[media] VPU: mediatek: support Mediatek VPU")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Reviewed-by: Houlong Wei <houlong.wei@mediatek.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/platform/mtk-vpu/mtk_vpu.c b/drivers/media/platform/mtk-vpu/mtk_vpu.c
index f8d35e3ac1dc..9b57fb285728 100644
--- a/drivers/media/platform/mtk-vpu/mtk_vpu.c
+++ b/drivers/media/platform/mtk-vpu/mtk_vpu.c
@@ -818,7 +818,8 @@ static int mtk_vpu_probe(struct platform_device *pdev)
 	vpu->wdt.wq = create_singlethread_workqueue("vpu_wdt");
 	if (!vpu->wdt.wq) {
 		dev_err(dev, "initialize wdt workqueue failed\n");
-		return -ENOMEM;
+		ret = -ENOMEM;
+		goto clk_unprepare;
 	}
 	INIT_WORK(&vpu->wdt.ws, vpu_wdt_reset_func);
 	mutex_init(&vpu->vpu_mutex);
@@ -917,6 +918,8 @@ static int mtk_vpu_probe(struct platform_device *pdev)
 	vpu_clock_disable(vpu);
 workqueue_destroy:
 	destroy_workqueue(vpu->wdt.wq);
+clk_unprepare:
+	clk_unprepare(vpu->clk);
 
 	return ret;
 }

commit caacdefcf80fd0f50fa3019a1ff842fdffa0b2f7
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Fri Aug 13 16:34:20 2021 +0200

    media: dvb-usb: fix ununit-value in az6027_rc_query
    
    [ Upstream commit afae4ef7d5ad913cab1316137854a36bea6268a5 ]
    
    Syzbot reported ununit-value bug in az6027_rc_query(). The problem was
    in missing state pointer initialization. Since this function does nothing
    we can simply initialize state to REMOTE_NO_KEY_PRESSED.
    
    Reported-and-tested-by: syzbot+2cd8c5db4a85f0a04142@syzkaller.appspotmail.com
    
    Fixes: 76f9a820c867 ("V4L/DVB: AZ6027: Initial import of the driver")
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: Sean Young <sean@mess.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/usb/dvb-usb/az6027.c b/drivers/media/usb/dvb-usb/az6027.c
index 6321b8e30261..990719727dc3 100644
--- a/drivers/media/usb/dvb-usb/az6027.c
+++ b/drivers/media/usb/dvb-usb/az6027.c
@@ -394,6 +394,7 @@ static struct rc_map_table rc_map_az6027_table[] = {
 /* remote control stuff (does not work with my box) */
 static int az6027_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
 {
+	*state = REMOTE_NO_KEY_PRESSED;
 	return 0;
 }
 

commit 7374ddadbb3a1a9bab1c36629879d73f1e671bb0
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Thu Jul 29 22:23:33 2021 +0200

    media: em28xx: add missing em28xx_close_extension
    
    [ Upstream commit 2c98b8a3458df03abdc6945bbef67ef91d181938 ]
    
    If em28xx dev has ->dev_next pointer, we need to delete ->dev_next list
    node from em28xx_extension_devlist on disconnect to avoid UAF bugs and
    corrupted list bugs, since driver frees this pointer on disconnect.
    
    Reported-and-tested-by: syzbot+a6969ef522a36d3344c9@syzkaller.appspotmail.com
    
    Fixes: 1a23f81b7dc3 ("V4L/DVB (9979): em28xx: move usb probe code to a proper place")
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/usb/em28xx/em28xx-cards.c b/drivers/media/usb/em28xx/em28xx-cards.c
index 3f59a98dbf9a..ec608f60d2c7 100644
--- a/drivers/media/usb/em28xx/em28xx-cards.c
+++ b/drivers/media/usb/em28xx/em28xx-cards.c
@@ -4030,8 +4030,11 @@ static void em28xx_usb_disconnect(struct usb_interface *intf)
 
 	em28xx_close_extension(dev);
 
-	if (dev->dev_next)
+	if (dev->dev_next) {
+		em28xx_close_extension(dev->dev_next);
 		em28xx_release_resources(dev->dev_next);
+	}
+
 	em28xx_release_resources(dev);
 
 	if (dev->dev_next) {

commit f6b4bda818b4851ce97c2057dac15e6864349c9b
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Mon Sep 27 14:58:10 2021 +0200

    drm/amdgpu: fix warning for overflow check
    
    [ Upstream commit 335aea75b0d95518951cad7c4c676e6f1c02c150 ]
    
    The overflow check in amdgpu_bo_list_create() causes a warning with
    clang-14 on 64-bit architectures, since the limit can never be
    exceeded.
    
    drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c:74:18: error: result of comparison of constant 256204778801521549 with expression of type 'unsigned int' is always false [-Werror,-Wtautological-constant-out-of-range-compare]
            if (num_entries > (SIZE_MAX - sizeof(struct amdgpu_bo_list))
                ~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    The check remains useful for 32-bit architectures, so just avoid the
    warning by using size_t as the type for the count.
    
    Fixes: 920990cb080a ("drm/amdgpu: allocate the bo_list array after the list")
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
index ce7f18c5ccb2..fda8d68a87fd 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
@@ -57,7 +57,7 @@ static void amdgpu_bo_list_free(struct kref *ref)
 
 int amdgpu_bo_list_create(struct amdgpu_device *adev, struct drm_file *filp,
 			  struct drm_amdgpu_bo_list_entry *info,
-			  unsigned num_entries, struct amdgpu_bo_list **result)
+			  size_t num_entries, struct amdgpu_bo_list **result)
 {
 	unsigned last_entry = 0, first_userptr = num_entries;
 	struct amdgpu_bo_list_entry *array;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h
index 61b089768e1c..64c8195426ac 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h
@@ -61,7 +61,7 @@ int amdgpu_bo_create_list_entry_array(struct drm_amdgpu_bo_list_in *in,
 int amdgpu_bo_list_create(struct amdgpu_device *adev,
 				 struct drm_file *filp,
 				 struct drm_amdgpu_bo_list_entry *info,
-				 unsigned num_entries,
+				 size_t num_entries,
 				 struct amdgpu_bo_list **list);
 
 static inline struct amdgpu_bo_list_entry *

commit 867462fd3d8359562f7391776d7ac3cac155537f
Author: Linus Walleij <linus.walleij@linaro.org>
Date:   Sun Sep 26 00:59:27 2021 +0200

    net: dsa: rtl8366rb: Fix off-by-one bug
    
    [ Upstream commit 5f5f12f5d4b108399130bb5c11f07765851d9cdb ]
    
    The max VLAN number with non-4K VLAN activated is 15, and the
    range is 0..15. Not 16.
    
    The impact should be low since we by default have 4K VLAN and
    thus have 4095 VLANs to play with in this switch. There will
    not be a problem unless the code is rewritten to only use
    16 VLANs.
    
    Fixes: d8652956cf37 ("net: dsa: realtek-smi: Add Realtek SMI driver")
    Cc: Mauri Sandberg <sandberg@mailfence.com>
    Cc: DENG Qingfang <dqfext@gmail.com>
    Cc: Florian Fainelli <f.fainelli@gmail.com>
    Reviewed-by: Alvin ?ipraga <alsi@bang-olufsen.dk>
    Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/dsa/rtl8366rb.c b/drivers/net/dsa/rtl8366rb.c
index 5aefd7a4696a..87832e36c3d5 100644
--- a/drivers/net/dsa/rtl8366rb.c
+++ b/drivers/net/dsa/rtl8366rb.c
@@ -1265,7 +1265,7 @@ static int rtl8366rb_set_mc_index(struct realtek_smi *smi, int port, int index)
 
 static bool rtl8366rb_is_vlan_valid(struct realtek_smi *smi, unsigned int vlan)
 {
-	unsigned int max = RTL8366RB_NUM_VLANS;
+	unsigned int max = RTL8366RB_NUM_VLANS - 1;
 
 	if (smi->vlan4k_enabled)
 		max = RTL8366RB_NUM_VIDS - 1;

commit 7b170c73cc9604508bffbb03e5cc22fa3f815eb3
Author: Waiman Long <longman@redhat.com>
Date:   Sat Sep 18 18:53:08 2021 -0400

    cgroup: Make rebind_subsystems() disable v2 controllers all at once
    
    [ Upstream commit 7ee285395b211cad474b2b989db52666e0430daf ]
    
    It was found that the following warning was displayed when remounting
    controllers from cgroup v2 to v1:
    
    [ 8042.997778] WARNING: CPU: 88 PID: 80682 at kernel/cgroup/cgroup.c:3130 cgroup_apply_control_disable+0x158/0x190
       :
    [ 8043.091109] RIP: 0010:cgroup_apply_control_disable+0x158/0x190
    [ 8043.096946] Code: ff f6 45 54 01 74 39 48 8d 7d 10 48 c7 c6 e0 46 5a a4 e8 7b 67 33 00 e9 41 ff ff ff 49 8b 84 24 e8 01 00 00 0f b7 40 08 eb 95 <0f> 0b e9 5f ff ff ff 48 83 c4 08 5b 5d 41 5c 41 5d 41 5e 41 5f c3
    [ 8043.115692] RSP: 0018:ffffba8a47c23d28 EFLAGS: 00010202
    [ 8043.120916] RAX: 0000000000000036 RBX: ffffffffa624ce40 RCX: 000000000000181a
    [ 8043.128047] RDX: ffffffffa63c43e0 RSI: ffffffffa63c43e0 RDI: ffff9d7284ee1000
    [ 8043.135180] RBP: ffff9d72874c5800 R08: ffffffffa624b090 R09: 0000000000000004
    [ 8043.142314] R10: ffffffffa624b080 R11: 0000000000002000 R12: ffff9d7284ee1000
    [ 8043.149447] R13: ffff9d7284ee1000 R14: ffffffffa624ce70 R15: ffffffffa6269e20
    [ 8043.156576] FS:  00007f7747cff740(0000) GS:ffff9d7a5fc00000(0000) knlGS:0000000000000000
    [ 8043.164663] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 8043.170409] CR2: 00007f7747e96680 CR3: 0000000887d60001 CR4: 00000000007706e0
    [ 8043.177539] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    [ 8043.184673] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    [ 8043.191804] PKRU: 55555554
    [ 8043.194517] Call Trace:
    [ 8043.196970]  rebind_subsystems+0x18c/0x470
    [ 8043.201070]  cgroup_setup_root+0x16c/0x2f0
    [ 8043.205177]  cgroup1_root_to_use+0x204/0x2a0
    [ 8043.209456]  cgroup1_get_tree+0x3e/0x120
    [ 8043.213384]  vfs_get_tree+0x22/0xb0
    [ 8043.216883]  do_new_mount+0x176/0x2d0
    [ 8043.220550]  __x64_sys_mount+0x103/0x140
    [ 8043.224474]  do_syscall_64+0x38/0x90
    [ 8043.228063]  entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    It was caused by the fact that rebind_subsystem() disables
    controllers to be rebound one by one. If more than one disabled
    controllers are originally from the default hierarchy, it means that
    cgroup_apply_control_disable() will be called multiple times for the
    same default hierarchy. A controller may be killed by css_kill() in
    the first round. In the second round, the killed controller may not be
    completely dead yet leading to the warning.
    
    To avoid this problem, we collect all the ssid's of controllers that
    needed to be disabled from the default hierarchy and then disable them
    in one go instead of one by one.
    
    Fixes: 334c3679ec4b ("cgroup: reimplement rebind_subsystems() using cgroup_apply_control() and friends")
    Signed-off-by: Waiman Long <longman@redhat.com>
    Signed-off-by: Tejun Heo <tj@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index a74549693e7f..63eff85f251f 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -1650,6 +1650,7 @@ int rebind_subsystems(struct cgroup_root *dst_root, u16 ss_mask)
 	struct cgroup *dcgrp = &dst_root->cgrp;
 	struct cgroup_subsys *ss;
 	int ssid, i, ret;
+	u16 dfl_disable_ss_mask = 0;
 
 	lockdep_assert_held(&cgroup_mutex);
 
@@ -1666,8 +1667,28 @@ int rebind_subsystems(struct cgroup_root *dst_root, u16 ss_mask)
 		/* can't move between two non-dummy roots either */
 		if (ss->root != &cgrp_dfl_root && dst_root != &cgrp_dfl_root)
 			return -EBUSY;
+
+		/*
+		 * Collect ssid's that need to be disabled from default
+		 * hierarchy.
+		 */
+		if (ss->root == &cgrp_dfl_root)
+			dfl_disable_ss_mask |= 1 << ssid;
+
 	} while_each_subsys_mask();
 
+	if (dfl_disable_ss_mask) {
+		struct cgroup *scgrp = &cgrp_dfl_root.cgrp;
+
+		/*
+		 * Controllers from default hierarchy that need to be rebound
+		 * are all disabled together in one go.
+		 */
+		cgrp_dfl_root.subsys_mask &= ~dfl_disable_ss_mask;
+		WARN_ON(cgroup_apply_control(scgrp));
+		cgroup_finalize_control(scgrp, 0);
+	}
+
 	do_each_subsys_mask(ss, ssid, ss_mask) {
 		struct cgroup_root *src_root = ss->root;
 		struct cgroup *scgrp = &src_root->cgrp;
@@ -1676,10 +1697,12 @@ int rebind_subsystems(struct cgroup_root *dst_root, u16 ss_mask)
 
 		WARN_ON(!css || cgroup_css(dcgrp, ss));
 
-		/* disable from the source */
-		src_root->subsys_mask &= ~(1 << ssid);
-		WARN_ON(cgroup_apply_control(scgrp));
-		cgroup_finalize_control(scgrp, 0);
+		if (src_root != &cgrp_dfl_root) {
+			/* disable from the source */
+			src_root->subsys_mask &= ~(1 << ssid);
+			WARN_ON(cgroup_apply_control(scgrp));
+			cgroup_finalize_control(scgrp, 0);
+		}
 
 		/* rebind */
 		RCU_INIT_POINTER(scgrp->subsys[ssid], NULL);

commit 728ff4b213cb6d66505e545ab820f3de5be1662a
Author: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
Date:   Thu Sep 2 23:13:06 2021 -0400

    Bluetooth: fix init and cleanup of sco_conn.timeout_work
    
    [ Upstream commit 49d8a5606428ca0962d09050a5af81461ff90fbb ]
    
    Before freeing struct sco_conn, all delayed timeout work should be
    cancelled. Otherwise, sco_sock_timeout could potentially use the
    sco_conn after it has been freed.
    
    Additionally, sco_conn.timeout_work should be initialized when the
    connection is allocated, not when the channel is added. This is
    because an sco_conn can create channels with multiple sockets over its
    lifetime, which happens if sockets are released but the connection
    isn't deleted.
    
    Fixes: ba316be1b6a0 ("Bluetooth: schedule SCO timeouts with delayed_work")
    Signed-off-by: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
    Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
index d052b454dc4e..1e0a1c0a56b5 100644
--- a/net/bluetooth/sco.c
+++ b/net/bluetooth/sco.c
@@ -133,6 +133,7 @@ static struct sco_conn *sco_conn_add(struct hci_conn *hcon)
 		return NULL;
 
 	spin_lock_init(&conn->lock);
+	INIT_DELAYED_WORK(&conn->timeout_work, sco_sock_timeout);
 
 	hcon->sco_data = conn;
 	conn->hcon = hcon;
@@ -196,11 +197,11 @@ static void sco_conn_del(struct hci_conn *hcon, int err)
 		sco_chan_del(sk, err);
 		bh_unlock_sock(sk);
 		sock_put(sk);
-
-		/* Ensure no more work items will run before freeing conn. */
-		cancel_delayed_work_sync(&conn->timeout_work);
 	}
 
+	/* Ensure no more work items will run before freeing conn. */
+	cancel_delayed_work_sync(&conn->timeout_work);
+
 	hcon->sco_data = NULL;
 	kfree(conn);
 }
@@ -213,8 +214,6 @@ static void __sco_chan_add(struct sco_conn *conn, struct sock *sk,
 	sco_pi(sk)->conn = conn;
 	conn->sk = sk;
 
-	INIT_DELAYED_WORK(&conn->timeout_work, sco_sock_timeout);
-
 	if (parent)
 		bt_accept_enqueue(parent, sk, true);
 }

commit 007466218935c54404db3e2851c117da335f7da4
Author: Sven Schnelle <svens@stackframe.org>
Date:   Fri Oct 15 21:49:23 2021 +0200

    parisc/kgdb: add kgdb_roundup() to make kgdb work with idle polling
    
    [ Upstream commit 66e29fcda1824f0427966fbee2bd2c85bf362c82 ]
    
    With idle polling, IPIs are not sent when a CPU idle, but queued
    and run later from do_idle(). The default kgdb_call_nmi_hook()
    implementation gets the pointer to struct pt_regs from get_irq_reqs(),
    which doesn't work in that case because it was not called from the
    IPI interrupt handler. Fix it by defining our own kgdb_roundup()
    function which sents an IPI_ENTER_KGDB. When that IPI is received
    on the target CPU kgdb_nmicallback() is called.
    
    Signed-off-by: Sven Schnelle <svens@stackframe.org>
    Signed-off-by: Helge Deller <deller@gmx.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c
index 5e26dbede5fc..ae4fc8769c38 100644
--- a/arch/parisc/kernel/smp.c
+++ b/arch/parisc/kernel/smp.c
@@ -32,6 +32,7 @@
 #include <linux/bitops.h>
 #include <linux/ftrace.h>
 #include <linux/cpu.h>
+#include <linux/kgdb.h>
 
 #include <linux/atomic.h>
 #include <asm/current.h>
@@ -74,7 +75,10 @@ enum ipi_message_type {
 	IPI_CALL_FUNC,
 	IPI_CPU_START,
 	IPI_CPU_STOP,
-	IPI_CPU_TEST
+	IPI_CPU_TEST,
+#ifdef CONFIG_KGDB
+	IPI_ENTER_KGDB,
+#endif
 };
 
 
@@ -170,7 +174,12 @@ ipi_interrupt(int irq, void *dev_id)
 			case IPI_CPU_TEST:
 				smp_debug(100, KERN_DEBUG "CPU%d is alive!\n", this_cpu);
 				break;
-
+#ifdef CONFIG_KGDB
+			case IPI_ENTER_KGDB:
+				smp_debug(100, KERN_DEBUG "CPU%d ENTER_KGDB\n", this_cpu);
+				kgdb_nmicallback(raw_smp_processor_id(), get_irq_regs());
+				break;
+#endif
 			default:
 				printk(KERN_CRIT "Unknown IPI num on CPU%d: %lu\n",
 					this_cpu, which);
@@ -226,6 +235,12 @@ send_IPI_allbutself(enum ipi_message_type op)
 	}
 }
 
+#ifdef CONFIG_KGDB
+void kgdb_roundup_cpus(void)
+{
+	send_IPI_allbutself(IPI_ENTER_KGDB);
+}
+#endif
 
 inline void 
 smp_send_stop(void)	{ send_IPI_allbutself(IPI_CPU_STOP); }

commit 4847dcb44233beb8a73a35709f1a5296b25e72a1
Author: Sven Schnelle <svens@stackframe.org>
Date:   Sat Oct 9 23:15:17 2021 +0200

    parisc/unwind: fix unwinder when CONFIG_64BIT is enabled
    
    [ Upstream commit 8e0ba125c2bf1030af3267058019ba86da96863f ]
    
    With 64 bit kernels unwind_special() is not working because
    it compares the pc to the address of the function descriptor.
    Add a helper function that compares pc with the dereferenced
    address. This fixes all of the backtraces on my c8000. Without
    this changes, a lot of backtraces are missing in kdb or the
    show-all-tasks command from /proc/sysrq-trigger.
    
    Signed-off-by: Sven Schnelle <svens@stackframe.org>
    Signed-off-by: Helge Deller <deller@gmx.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/parisc/kernel/unwind.c b/arch/parisc/kernel/unwind.c
index 2d14f17838d2..fa52c939e8a3 100644
--- a/arch/parisc/kernel/unwind.c
+++ b/arch/parisc/kernel/unwind.c
@@ -21,6 +21,8 @@
 #include <asm/ptrace.h>
 
 #include <asm/unwind.h>
+#include <asm/switch_to.h>
+#include <asm/sections.h>
 
 /* #define DEBUG 1 */
 #ifdef DEBUG
@@ -203,6 +205,11 @@ int __init unwind_init(void)
 	return 0;
 }
 
+static bool pc_is_kernel_fn(unsigned long pc, void *fn)
+{
+	return (unsigned long)dereference_kernel_function_descriptor(fn) == pc;
+}
+
 static int unwind_special(struct unwind_frame_info *info, unsigned long pc, int frame_size)
 {
 	/*
@@ -221,7 +228,7 @@ static int unwind_special(struct unwind_frame_info *info, unsigned long pc, int
 	extern void * const _call_on_stack;
 #endif /* CONFIG_IRQSTACKS */
 
-	if (pc == (unsigned long) &handle_interruption) {
+	if (pc_is_kernel_fn(pc, handle_interruption)) {
 		struct pt_regs *regs = (struct pt_regs *)(info->sp - frame_size - PT_SZ_ALGN);
 		dbg("Unwinding through handle_interruption()\n");
 		info->prev_sp = regs->gr[30];
@@ -229,13 +236,13 @@ static int unwind_special(struct unwind_frame_info *info, unsigned long pc, int
 		return 1;
 	}
 
-	if (pc == (unsigned long) &ret_from_kernel_thread ||
-	    pc == (unsigned long) &syscall_exit) {
+	if (pc_is_kernel_fn(pc, ret_from_kernel_thread) ||
+	    pc_is_kernel_fn(pc, syscall_exit)) {
 		info->prev_sp = info->prev_ip = 0;
 		return 1;
 	}
 
-	if (pc == (unsigned long) &intr_return) {
+	if (pc_is_kernel_fn(pc, intr_return)) {
 		struct pt_regs *regs;
 
 		dbg("Found intr_return()\n");
@@ -246,20 +253,20 @@ static int unwind_special(struct unwind_frame_info *info, unsigned long pc, int
 		return 1;
 	}
 
-	if (pc == (unsigned long) &_switch_to_ret) {
+	if (pc_is_kernel_fn(pc, _switch_to) ||
+	    pc_is_kernel_fn(pc, _switch_to_ret)) {
 		info->prev_sp = info->sp - CALLEE_SAVE_FRAME_SIZE;
 		info->prev_ip = *(unsigned long *)(info->prev_sp - RP_OFFSET);
 		return 1;
 	}
 
 #ifdef CONFIG_IRQSTACKS
-	if (pc == (unsigned long) &_call_on_stack) {
+	if (pc_is_kernel_fn(pc, _call_on_stack)) {
 		info->prev_sp = *(unsigned long *)(info->sp - FRAME_SIZE - REG_SZ);
 		info->prev_ip = *(unsigned long *)(info->sp - FRAME_SIZE - RP_OFFSET);
 		return 1;
 	}
 #endif
-
 	return 0;
 }
 

commit ca6b1b3e032cf6ae2a61303eba04848b10bd6efc
Author: Helge Deller <deller@gmx.de>
Date:   Tue Oct 5 00:05:43 2021 +0200

    task_stack: Fix end_of_stack() for architectures with upwards-growing stack
    
    [ Upstream commit 9cc2fa4f4a92ccc6760d764e7341be46ee8aaaa1 ]
    
    The function end_of_stack() returns a pointer to the last entry of a
    stack. For architectures like parisc where the stack grows upwards
    return the pointer to the highest address in the stack.
    
    Without this change I faced a crash on parisc, because the stackleak
    functionality wrote STACKLEAK_POISON to the lowest address and thus
    overwrote the first 4 bytes of the task_struct which included the
    TIF_FLAGS.
    
    Signed-off-by: Helge Deller <deller@gmx.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/sched/task_stack.h b/include/linux/sched/task_stack.h
index 6a841929073f..4f099d3fed3a 100644
--- a/include/linux/sched/task_stack.h
+++ b/include/linux/sched/task_stack.h
@@ -25,7 +25,11 @@ static inline void *task_stack_page(const struct task_struct *task)
 
 static inline unsigned long *end_of_stack(const struct task_struct *task)
 {
+#ifdef CONFIG_STACK_GROWSUP
+	return (unsigned long *)((unsigned long)task->stack + THREAD_SIZE) - 1;
+#else
 	return task->stack;
+#endif
 }
 
 #elif !defined(__HAVE_THREAD_FUNCTIONS)

commit c248047badb5b27a85384b7468b2e22c1045713d
Author: Sven Schnelle <svens@stackframe.org>
Date:   Sat Oct 9 20:24:39 2021 +0200

    parisc: fix warning in flush_tlb_all
    
    [ Upstream commit 1030d681319b43869e0d5b568b9d0226652d1a6f ]
    
    I've got the following splat after enabling preemption:
    
    [    3.724721] BUG: using __this_cpu_add() in preemptible [00000000] code: swapper/0/1
    [    3.734630] caller is __this_cpu_preempt_check+0x38/0x50
    [    3.740635] CPU: 1 PID: 1 Comm: swapper/0 Not tainted 5.15.0-rc4-64bit+ #324
    [    3.744605] Hardware name: 9000/785/C8000
    [    3.744605] Backtrace:
    [    3.744605]  [<00000000401d9d58>] show_stack+0x74/0xb0
    [    3.744605]  [<0000000040c27bd4>] dump_stack_lvl+0x10c/0x188
    [    3.744605]  [<0000000040c27c84>] dump_stack+0x34/0x48
    [    3.744605]  [<0000000040c33438>] check_preemption_disabled+0x178/0x1b0
    [    3.744605]  [<0000000040c334f8>] __this_cpu_preempt_check+0x38/0x50
    [    3.744605]  [<00000000401d632c>] flush_tlb_all+0x58/0x2e0
    [    3.744605]  [<00000000401075c0>] 0x401075c0
    [    3.744605]  [<000000004010b8fc>] 0x4010b8fc
    [    3.744605]  [<00000000401080fc>] 0x401080fc
    [    3.744605]  [<00000000401d5224>] do_one_initcall+0x128/0x378
    [    3.744605]  [<0000000040102de8>] 0x40102de8
    [    3.744605]  [<0000000040c33864>] kernel_init+0x60/0x3a8
    [    3.744605]  [<00000000401d1020>] ret_from_kernel_thread+0x20/0x28
    [    3.744605]
    
    Fix this by moving the __inc_irq_stat() into the locked section.
    
    Signed-off-by: Sven Schnelle <svens@stackframe.org>
    Signed-off-by: Helge Deller <deller@gmx.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c
index 10a52664e29f..038fcb6c76dc 100644
--- a/arch/parisc/mm/init.c
+++ b/arch/parisc/mm/init.c
@@ -895,9 +895,9 @@ void flush_tlb_all(void)
 {
 	int do_recycle;
 
-	__inc_irq_stat(irq_tlb_count);
 	do_recycle = 0;
 	spin_lock(&sid_lock);
+	__inc_irq_stat(irq_tlb_count);
 	if (dirty_space_ids > RECYCLE_THRESHOLD) {
 	    BUG_ON(recycle_inuse);  /* FIXME: Use a semaphore/wait queue here */
 	    get_dirty_sids(&recycle_ndirty,recycle_dirty_array);
@@ -916,8 +916,8 @@ void flush_tlb_all(void)
 #else
 void flush_tlb_all(void)
 {
-	__inc_irq_stat(irq_tlb_count);
 	spin_lock(&sid_lock);
+	__inc_irq_stat(irq_tlb_count);
 	flush_tlb_all_local(NULL);
 	recycle_sids();
 	spin_unlock(&sid_lock);

commit e63c00f18dba88605c00815f76b0a867e9d37c88
Author: Vitaly Kuznetsov <vkuznets@redhat.com>
Date:   Tue Oct 12 17:50:05 2021 +0200

    x86/hyperv: Protect set_hv_tscchange_cb() against getting preempted
    
    [ Upstream commit 285f68afa8b20f752b0b7194d54980b5e0e27b75 ]
    
    The following issue is observed with CONFIG_DEBUG_PREEMPT when KVM loads:
    
     KVM: vmx: using Hyper-V Enlightened VMCS
     BUG: using smp_processor_id() in preemptible [00000000] code: systemd-udevd/488
     caller is set_hv_tscchange_cb+0x16/0x80
     CPU: 1 PID: 488 Comm: systemd-udevd Not tainted 5.15.0-rc5+ #396
     Hardware name: Microsoft Corporation Virtual Machine/Virtual Machine, BIOS Hyper-V UEFI Release v4.0 12/17/2019
     Call Trace:
      dump_stack_lvl+0x6a/0x9a
      check_preemption_disabled+0xde/0xe0
      ? kvm_gen_update_masterclock+0xd0/0xd0 [kvm]
      set_hv_tscchange_cb+0x16/0x80
      kvm_arch_init+0x23f/0x290 [kvm]
      kvm_init+0x30/0x310 [kvm]
      vmx_init+0xaf/0x134 [kvm_intel]
      ...
    
    set_hv_tscchange_cb() can get preempted in between acquiring
    smp_processor_id() and writing to HV_X64_MSR_REENLIGHTENMENT_CONTROL. This
    is not an issue by itself: HV_X64_MSR_REENLIGHTENMENT_CONTROL is a
    partition-wide MSR and it doesn't matter which particular CPU will be
    used to receive reenlightenment notifications. The only real problem can
    (in theory) be observed if the CPU whose id was acquired with
    smp_processor_id() goes offline before we manage to write to the MSR,
    the logic in hv_cpu_die() won't be able to reassign it correctly.
    
    Reported-by: Michael Kelley <mikelley@microsoft.com>
    Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
    Link: https://lore.kernel.org/r/20211012155005.1613352-1-vkuznets@redhat.com
    Signed-off-by: Wei Liu <wei.liu@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
index 1663ad84778b..bd4b6951b148 100644
--- a/arch/x86/hyperv/hv_init.c
+++ b/arch/x86/hyperv/hv_init.c
@@ -192,7 +192,6 @@ void set_hv_tscchange_cb(void (*cb)(void))
 	struct hv_reenlightenment_control re_ctrl = {
 		.vector = HYPERV_REENLIGHTENMENT_VECTOR,
 		.enabled = 1,
-		.target_vp = hv_vp_index[smp_processor_id()]
 	};
 	struct hv_tsc_emulation_control emu_ctrl = {.enabled = 1};
 
@@ -206,8 +205,12 @@ void set_hv_tscchange_cb(void (*cb)(void))
 	/* Make sure callback is registered before we write to MSRs */
 	wmb();
 
+	re_ctrl.target_vp = hv_vp_index[get_cpu()];
+
 	wrmsrl(HV_X64_MSR_REENLIGHTENMENT_CONTROL, *((u64 *)&re_ctrl));
 	wrmsrl(HV_X64_MSR_TSC_EMULATION_CONTROL, *((u64 *)&emu_ctrl));
+
+	put_cpu();
 }
 EXPORT_SYMBOL_GPL(set_hv_tscchange_cb);
 

commit 03979b573a7cd74cfc96f098debfd84e556f998a
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Mon Oct 18 15:34:13 2021 +0800

    spi: bcm-qspi: Fix missing clk_disable_unprepare() on error in bcm_qspi_probe()
    
    [ Upstream commit ca9b8f56ec089d3a436050afefd17b7237301f47 ]
    
    Fix the missing clk_disable_unprepare() before return
    from bcm_qspi_probe() in the error handling case.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Link: https://lore.kernel.org/r/20211018073413.2029081-1-yangyingliang@huawei.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/spi/spi-bcm-qspi.c b/drivers/spi/spi-bcm-qspi.c
index 4ee92f7ca20b..b2fd7a369196 100644
--- a/drivers/spi/spi-bcm-qspi.c
+++ b/drivers/spi/spi-bcm-qspi.c
@@ -1305,7 +1305,7 @@ int bcm_qspi_probe(struct platform_device *pdev,
 					       &qspi->dev_ids[val]);
 			if (ret < 0) {
 				dev_err(&pdev->dev, "IRQ %s not found\n", name);
-				goto qspi_probe_err;
+				goto qspi_unprepare_err;
 			}
 
 			qspi->dev_ids[val].dev = qspi;
@@ -1320,7 +1320,7 @@ int bcm_qspi_probe(struct platform_device *pdev,
 	if (!num_ints) {
 		dev_err(&pdev->dev, "no IRQs registered, cannot init driver\n");
 		ret = -EINVAL;
-		goto qspi_probe_err;
+		goto qspi_unprepare_err;
 	}
 
 	/*
@@ -1371,6 +1371,7 @@ int bcm_qspi_probe(struct platform_device *pdev,
 
 qspi_reg_err:
 	bcm_qspi_hw_uninit(qspi);
+qspi_unprepare_err:
 	clk_disable_unprepare(qspi->clk);
 qspi_probe_err:
 	kfree(qspi->dev_ids);

commit 89d7c841fa3d74f7e21ad8c578c2101a2b3f6f43
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Mon Oct 18 15:30:06 2021 +0100

    ARM: 9136/1: ARMv7-M uses BE-8, not BE-32
    
    [ Upstream commit 345dac33f58894a56d17b92a41be10e16585ceff ]
    
    When configuring the kernel for big-endian, we set either BE-8 or BE-32
    based on the CPU architecture level. Until linux-4.4, we did not have
    any ARMv7-M platform allowing big-endian builds, but now i.MX/Vybrid
    is in that category, adn we get a build error because of this:
    
    arch/arm/kernel/module-plts.c: In function 'get_module_plt':
    arch/arm/kernel/module-plts.c:60:46: error: implicit declaration of function '__opcode_to_mem_thumb32' [-Werror=implicit-function-declaration]
    
    This comes down to picking the wrong default, ARMv7-M uses BE8
    like ARMv7-A does. Changing the default gets the kernel to compile
    and presumably works.
    
    https://lore.kernel.org/all/1455804123-2526139-2-git-send-email-arnd@arndb.de/
    
    Tested-by: Vladimir Murzin <vladimir.murzin@arm.com>
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig
index b169e580bf82..9738c1f9737c 100644
--- a/arch/arm/mm/Kconfig
+++ b/arch/arm/mm/Kconfig
@@ -751,7 +751,7 @@ config CPU_BIG_ENDIAN
 config CPU_ENDIAN_BE8
 	bool
 	depends on CPU_BIG_ENDIAN
-	default CPU_V6 || CPU_V6K || CPU_V7
+	default CPU_V6 || CPU_V6K || CPU_V7 || CPU_V7M
 	help
 	  Support for the BE-8 (big-endian) mode on ARMv6 and ARMv7 processors.
 

commit 5cc5784a9a0330e599311f77278e129f352f57cd
Author: Stephen Suryaputra <ssuryaextr@gmail.com>
Date:   Wed Oct 20 16:06:18 2021 -0400

    gre/sit: Don't generate link-local addr if addr_gen_mode is IN6_ADDR_GEN_MODE_NONE
    
    [ Upstream commit 61e18ce7348bfefb5688a8bcd4b4d6b37c0f9b2a ]
    
    When addr_gen_mode is set to IN6_ADDR_GEN_MODE_NONE, the link-local addr
    should not be generated. But it isn't the case for GRE (as well as GRE6)
    and SIT tunnels. Make it so that tunnels consider the addr_gen_mode,
    especially for IN6_ADDR_GEN_MODE_NONE.
    
    Do this in add_v4_addrs() to cover both GRE and SIT only if the addr
    scope is link.
    
    Signed-off-by: Stephen Suryaputra <ssuryaextr@gmail.com>
    Acked-by: Antonio Quartulli <a@unstable.cc>
    Link: https://lore.kernel.org/r/20211020200618.467342-1-ssuryaextr@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 76c097552ea7..9d8b791f63ef 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -3054,6 +3054,9 @@ static void sit_add_v4_addrs(struct inet6_dev *idev)
 	memcpy(&addr.s6_addr32[3], idev->dev->dev_addr, 4);
 
 	if (idev->dev->flags&IFF_POINTOPOINT) {
+		if (idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_NONE)
+			return;
+
 		addr.s6_addr32[0] = htonl(0xfe800000);
 		scope = IFA_LINK;
 		plen = 64;

commit 8c434fa86d32ce65e5734c7eca61e0a524512d27
Author: Masami Hiramatsu <mhiramat@kernel.org>
Date:   Thu Oct 21 09:55:17 2021 +0900

    ARM: clang: Do not rely on lr register for stacktrace
    
    [ Upstream commit b3ea5d56f212ad81328c82454829a736197ebccc ]
    
    Currently the stacktrace on clang compiled arm kernel uses the 'lr'
    register to find the first frame address from pt_regs. However, that
    is wrong after calling another function, because the 'lr' register
    is used by 'bl' instruction and never be recovered.
    
    As same as gcc arm kernel, directly use the frame pointer (r11) of
    the pt_regs to find the first frame address.
    
    Note that this fixes kretprobe stacktrace issue only with
    CONFIG_UNWINDER_FRAME_POINTER=y. For the CONFIG_UNWINDER_ARM,
    we need another fix.
    
    Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/kernel/stacktrace.c b/arch/arm/kernel/stacktrace.c
index d23ab9ec130a..a452b859f485 100644
--- a/arch/arm/kernel/stacktrace.c
+++ b/arch/arm/kernel/stacktrace.c
@@ -53,8 +53,7 @@ int notrace unwind_frame(struct stackframe *frame)
 
 	frame->sp = frame->fp;
 	frame->fp = *(unsigned long *)(fp);
-	frame->pc = frame->lr;
-	frame->lr = *(unsigned long *)(fp + 4);
+	frame->pc = *(unsigned long *)(fp + 4);
 #else
 	/* check current frame pointer is within bounds */
 	if (fp < low + 12 || fp > high - 4)

commit 11eab4ec7012474cbd4cd5ddc5eabad3e5e0bc64
Author: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Date:   Tue Oct 19 20:54:31 2021 +0900

    smackfs: use __GFP_NOFAIL for smk_cipso_doi()
    
    [ Upstream commit f91488ee15bd3cac467e2d6a361fc2d34d1052ae ]
    
    syzbot is reporting kernel panic at smk_cipso_doi() due to memory
    allocation fault injection [1]. The reason for need to use panic() was
    not explained. But since no fix was proposed for 18 months, for now
    let's use __GFP_NOFAIL for utilizing syzbot resource on other bugs.
    
    Link: https://syzkaller.appspot.com/bug?extid=89731ccb6fec15ce1c22 [1]
    Reported-by: syzbot <syzbot+89731ccb6fec15ce1c22@syzkaller.appspotmail.com>
    Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c
index 25705a72d31b..9fdf404a318f 100644
--- a/security/smack/smackfs.c
+++ b/security/smack/smackfs.c
@@ -721,9 +721,7 @@ static void smk_cipso_doi(void)
 		printk(KERN_WARNING "%s:%d remove rc = %d\n",
 		       __func__, __LINE__, rc);
 
-	doip = kmalloc(sizeof(struct cipso_v4_doi), GFP_KERNEL);
-	if (doip == NULL)
-		panic("smack:  Failed to initialize cipso DOI.\n");
+	doip = kmalloc(sizeof(struct cipso_v4_doi), GFP_KERNEL | __GFP_NOFAIL);
 	doip->map.std = NULL;
 	doip->doi = smk_cipso_doi_value;
 	doip->type = CIPSO_V4_MAP_PASS;

commit 525165eb76b9dda39c60e2e8d718b1d7292494be
Author: Johannes Berg <johannes.berg@intel.com>
Date:   Sun Oct 17 11:43:40 2021 +0300

    iwlwifi: mvm: disable RX-diversity in powersave
    
    [ Upstream commit e5322b9ab5f63536c41301150b7ce64605ce52cc ]
    
    Just like we have default SMPS mode as dynamic in powersave,
    we should not enable RX-diversity in powersave, to reduce
    power consumption when connected to a non-MIMO AP.
    
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
    Link: https://lore.kernel.org/r/iwlwifi.20211017113927.fc896bc5cdaa.I1d11da71b8a5cbe921a37058d5f578f1b14a2023@changeid
    Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/utils.c b/drivers/net/wireless/intel/iwlwifi/mvm/utils.c
index 00712205c05f..bc3f67e0bf33 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/utils.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/utils.c
@@ -1018,6 +1018,9 @@ bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm)
 
 	lockdep_assert_held(&mvm->mutex);
 
+	if (iwlmvm_mod_params.power_scheme != IWL_POWER_SCHEME_CAM)
+		return false;
+
 	if (num_of_ant(iwl_mvm_get_valid_rx_ant(mvm)) == 1)
 		return false;
 

commit d72c254889cce2ae884b8fc9d6ac1c4d9df68413
Author: Ye Bin <yebin10@huawei.com>
Date:   Wed Oct 13 20:19:14 2021 +0800

    PM: hibernate: Get block device exclusively in swsusp_check()
    
    [ Upstream commit 39fbef4b0f77f9c89c8f014749ca533643a37c9f ]
    
    The following kernel crash can be triggered:
    
    [   89.266592] ------------[ cut here ]------------
    [   89.267427] kernel BUG at fs/buffer.c:3020!
    [   89.268264] invalid opcode: 0000 [#1] SMP KASAN PTI
    [   89.269116] CPU: 7 PID: 1750 Comm: kmmpd-loop0 Not tainted 5.10.0-862.14.0.6.x86_64-08610-gc932cda3cef4-dirty #20
    [   89.273169] RIP: 0010:submit_bh_wbc.isra.0+0x538/0x6d0
    [   89.277157] RSP: 0018:ffff888105ddfd08 EFLAGS: 00010246
    [   89.278093] RAX: 0000000000000005 RBX: ffff888124231498 RCX: ffffffffb2772612
    [   89.279332] RDX: 1ffff11024846293 RSI: 0000000000000008 RDI: ffff888124231498
    [   89.280591] RBP: ffff8881248cc000 R08: 0000000000000001 R09: ffffed1024846294
    [   89.281851] R10: ffff88812423149f R11: ffffed1024846293 R12: 0000000000003800
    [   89.283095] R13: 0000000000000001 R14: 0000000000000000 R15: ffff8881161f7000
    [   89.284342] FS:  0000000000000000(0000) GS:ffff88839b5c0000(0000) knlGS:0000000000000000
    [   89.285711] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [   89.286701] CR2: 00007f166ebc01a0 CR3: 0000000435c0e000 CR4: 00000000000006e0
    [   89.287919] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    [   89.289138] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    [   89.290368] Call Trace:
    [   89.290842]  write_mmp_block+0x2ca/0x510
    [   89.292218]  kmmpd+0x433/0x9a0
    [   89.294902]  kthread+0x2dd/0x3e0
    [   89.296268]  ret_from_fork+0x22/0x30
    [   89.296906] Modules linked in:
    
    by running the following commands:
    
     1. mkfs.ext4 -O mmp  /dev/sda -b 1024
     2. mount /dev/sda /home/test
     3. echo "/dev/sda" > /sys/power/resume
    
    That happens because swsusp_check() calls set_blocksize() on the
    target partition which confuses the file system:
    
           Thread1                       Thread2
    mount /dev/sda /home/test
    get s_mmp_bh  --> has mapped flag
    start kmmpd thread
                                    echo "/dev/sda" > /sys/power/resume
                                      resume_store
                                        software_resume
                                          swsusp_check
                                            set_blocksize
                                              truncate_inode_pages_range
                                                truncate_cleanup_page
                                                  block_invalidatepage
                                                    discard_buffer --> clean mapped flag
    write_mmp_block
      submit_bh
        submit_bh_wbc
          BUG_ON(!buffer_mapped(bh))
    
    To address this issue, modify swsusp_check() to open the target block
    device with exclusive access.
    
    Signed-off-by: Ye Bin <yebin10@huawei.com>
    [ rjw: Subject and changelog edits ]
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/power/swap.c b/kernel/power/swap.c
index e9494c29f1ca..b5b97df142d2 100644
--- a/kernel/power/swap.c
+++ b/kernel/power/swap.c
@@ -1512,9 +1512,10 @@ int swsusp_read(unsigned int *flags_p)
 int swsusp_check(void)
 {
 	int error;
+	void *holder;
 
 	hib_resume_bdev = blkdev_get_by_dev(swsusp_resume_device,
-					    FMODE_READ, NULL);
+					    FMODE_READ | FMODE_EXCL, &holder);
 	if (!IS_ERR(hib_resume_bdev)) {
 		set_blocksize(hib_resume_bdev, PAGE_SIZE);
 		clear_page(swsusp_header);
@@ -1536,7 +1537,7 @@ int swsusp_check(void)
 
 put:
 		if (error)
-			blkdev_put(hib_resume_bdev, FMODE_READ);
+			blkdev_put(hib_resume_bdev, FMODE_READ | FMODE_EXCL);
 		else
 			pr_debug("Image signature found, resuming\n");
 	} else {

commit d883967ec2e97add1b7733480a6719e0f4d5dd6b
Author: Zheyu Ma <zheyuma97@gmail.com>
Date:   Sat Oct 16 04:02:59 2021 +0000

    mwl8k: Fix use-after-free in mwl8k_fw_state_machine()
    
    [ Upstream commit 257051a235c17e33782b6e24a4b17f2d7915aaec ]
    
    When the driver fails to request the firmware, it calls its error
    handler. In the error handler, the driver detaches device from driver
    first before releasing the firmware, which can cause a use-after-free bug.
    
    Fix this by releasing firmware first.
    
    The following log reveals it:
    
    [    9.007301 ] BUG: KASAN: use-after-free in mwl8k_fw_state_machine+0x320/0xba0
    [    9.010143 ] Workqueue: events request_firmware_work_func
    [    9.010830 ] Call Trace:
    [    9.010830 ]  dump_stack_lvl+0xa8/0xd1
    [    9.010830 ]  print_address_description+0x87/0x3b0
    [    9.010830 ]  kasan_report+0x172/0x1c0
    [    9.010830 ]  ? mutex_unlock+0xd/0x10
    [    9.010830 ]  ? mwl8k_fw_state_machine+0x320/0xba0
    [    9.010830 ]  ? mwl8k_fw_state_machine+0x320/0xba0
    [    9.010830 ]  __asan_report_load8_noabort+0x14/0x20
    [    9.010830 ]  mwl8k_fw_state_machine+0x320/0xba0
    [    9.010830 ]  ? mwl8k_load_firmware+0x5f0/0x5f0
    [    9.010830 ]  request_firmware_work_func+0x172/0x250
    [    9.010830 ]  ? read_lock_is_recursive+0x20/0x20
    [    9.010830 ]  ? process_one_work+0x7a1/0x1100
    [    9.010830 ]  ? request_firmware_nowait+0x460/0x460
    [    9.010830 ]  ? __this_cpu_preempt_check+0x13/0x20
    [    9.010830 ]  process_one_work+0x9bb/0x1100
    
    Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/1634356979-6211-1-git-send-email-zheyuma97@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/marvell/mwl8k.c b/drivers/net/wireless/marvell/mwl8k.c
index 6769b0c5a5cd..ee842797570b 100644
--- a/drivers/net/wireless/marvell/mwl8k.c
+++ b/drivers/net/wireless/marvell/mwl8k.c
@@ -5793,8 +5793,8 @@ static void mwl8k_fw_state_machine(const struct firmware *fw, void *context)
 fail:
 	priv->fw_state = FW_STATE_ERROR;
 	complete(&priv->firmware_loading_complete);
-	device_release_driver(&priv->pdev->dev);
 	mwl8k_release_firmware(priv);
+	device_release_driver(&priv->pdev->dev);
 }
 
 #define MAX_RESTART_ATTEMPTS 1

commit 4d8a391e0aaf6cf2ba05dc8a9181f5d26c7e80db
Author: Kalesh Singh <kaleshsingh@google.com>
Date:   Wed Oct 13 21:52:17 2021 -0700

    tracing/cfi: Fix cmp_entries_* functions signature mismatch
    
    [ Upstream commit 7ce1bb83a14019f8c396d57ec704d19478747716 ]
    
    If CONFIG_CFI_CLANG=y, attempting to read an event histogram will cause
    the kernel to panic due to failed CFI check.
    
        1. echo 'hist:keys=common_pid' >> events/sched/sched_switch/trigger
        2. cat events/sched/sched_switch/hist
        3. kernel panics on attempting to read hist
    
    This happens because the sort() function expects a generic
    int (*)(const void *, const void *) pointer for the compare function.
    To prevent this CFI failure, change tracing map cmp_entries_* function
    signatures to match this.
    
    Also, fix the build error reported by the kernel test robot [1].
    
    [1] https://lore.kernel.org/r/202110141140.zzi4dRh4-lkp@intel.com/
    
    Link: https://lkml.kernel.org/r/20211014045217.3265162-1-kaleshsingh@google.com
    
    Signed-off-by: Kalesh Singh <kaleshsingh@google.com>
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/trace/tracing_map.c b/kernel/trace/tracing_map.c
index 9e31bfc818ff..10657b8dc2c2 100644
--- a/kernel/trace/tracing_map.c
+++ b/kernel/trace/tracing_map.c
@@ -834,29 +834,35 @@ int tracing_map_init(struct tracing_map *map)
 	return err;
 }
 
-static int cmp_entries_dup(const struct tracing_map_sort_entry **a,
-			   const struct tracing_map_sort_entry **b)
+static int cmp_entries_dup(const void *A, const void *B)
 {
+	const struct tracing_map_sort_entry *a, *b;
 	int ret = 0;
 
-	if (memcmp((*a)->key, (*b)->key, (*a)->elt->map->key_size))
+	a = *(const struct tracing_map_sort_entry **)A;
+	b = *(const struct tracing_map_sort_entry **)B;
+
+	if (memcmp(a->key, b->key, a->elt->map->key_size))
 		ret = 1;
 
 	return ret;
 }
 
-static int cmp_entries_sum(const struct tracing_map_sort_entry **a,
-			   const struct tracing_map_sort_entry **b)
+static int cmp_entries_sum(const void *A, const void *B)
 {
 	const struct tracing_map_elt *elt_a, *elt_b;
+	const struct tracing_map_sort_entry *a, *b;
 	struct tracing_map_sort_key *sort_key;
 	struct tracing_map_field *field;
 	tracing_map_cmp_fn_t cmp_fn;
 	void *val_a, *val_b;
 	int ret = 0;
 
-	elt_a = (*a)->elt;
-	elt_b = (*b)->elt;
+	a = *(const struct tracing_map_sort_entry **)A;
+	b = *(const struct tracing_map_sort_entry **)B;
+
+	elt_a = a->elt;
+	elt_b = b->elt;
 
 	sort_key = &elt_a->map->sort_key;
 
@@ -873,18 +879,21 @@ static int cmp_entries_sum(const struct tracing_map_sort_entry **a,
 	return ret;
 }
 
-static int cmp_entries_key(const struct tracing_map_sort_entry **a,
-			   const struct tracing_map_sort_entry **b)
+static int cmp_entries_key(const void *A, const void *B)
 {
 	const struct tracing_map_elt *elt_a, *elt_b;
+	const struct tracing_map_sort_entry *a, *b;
 	struct tracing_map_sort_key *sort_key;
 	struct tracing_map_field *field;
 	tracing_map_cmp_fn_t cmp_fn;
 	void *val_a, *val_b;
 	int ret = 0;
 
-	elt_a = (*a)->elt;
-	elt_b = (*b)->elt;
+	a = *(const struct tracing_map_sort_entry **)A;
+	b = *(const struct tracing_map_sort_entry **)B;
+
+	elt_a = a->elt;
+	elt_b = b->elt;
 
 	sort_key = &elt_a->map->sort_key;
 
@@ -989,10 +998,8 @@ static void sort_secondary(struct tracing_map *map,
 			   struct tracing_map_sort_key *primary_key,
 			   struct tracing_map_sort_key *secondary_key)
 {
-	int (*primary_fn)(const struct tracing_map_sort_entry **,
-			  const struct tracing_map_sort_entry **);
-	int (*secondary_fn)(const struct tracing_map_sort_entry **,
-			    const struct tracing_map_sort_entry **);
+	int (*primary_fn)(const void *, const void *);
+	int (*secondary_fn)(const void *, const void *);
 	unsigned i, start = 0, n_sub = 1;
 
 	if (is_key(map, primary_key->field_idx))
@@ -1061,8 +1068,7 @@ int tracing_map_sort_entries(struct tracing_map *map,
 			     unsigned int n_sort_keys,
 			     struct tracing_map_sort_entry ***sort_entries)
 {
-	int (*cmp_entries_fn)(const struct tracing_map_sort_entry **,
-			      const struct tracing_map_sort_entry **);
+	int (*cmp_entries_fn)(const void *, const void *);
 	struct tracing_map_sort_entry *sort_entry, **entries;
 	int i, n_entries, ret;
 

commit 015497752e286ab9a653e8a306872e5b240d77ef
Author: Menglong Dong <imagedong@tencent.com>
Date:   Sun Oct 17 20:04:02 2021 +0800

    workqueue: make sysfs of unbound kworker cpumask more clever
    
    [ Upstream commit d25302e46592c97d29f70ccb1be558df31a9a360 ]
    
    Some unfriendly component, such as dpdk, write the same mask to
    unbound kworker cpumask again and again. Every time it write to
    this interface some work is queue to cpu, even though the mask
    is same with the original mask.
    
    So, fix it by return success and do nothing if the cpumask is
    equal with the old one.
    
    Signed-off-by: Mengen Sun <mengensun@tencent.com>
    Signed-off-by: Menglong Dong <imagedong@tencent.com>
    Signed-off-by: Tejun Heo <tj@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 1573d1bf6300..b1bb6cb5802e 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -5125,9 +5125,6 @@ int workqueue_set_unbound_cpumask(cpumask_var_t cpumask)
 	int ret = -EINVAL;
 	cpumask_var_t saved_cpumask;
 
-	if (!zalloc_cpumask_var(&saved_cpumask, GFP_KERNEL))
-		return -ENOMEM;
-
 	/*
 	 * Not excluding isolated cpus on purpose.
 	 * If the user wishes to include them, we allow that.
@@ -5135,6 +5132,15 @@ int workqueue_set_unbound_cpumask(cpumask_var_t cpumask)
 	cpumask_and(cpumask, cpumask, cpu_possible_mask);
 	if (!cpumask_empty(cpumask)) {
 		apply_wqattrs_lock();
+		if (cpumask_equal(cpumask, wq_unbound_cpumask)) {
+			ret = 0;
+			goto out_unlock;
+		}
+
+		if (!zalloc_cpumask_var(&saved_cpumask, GFP_KERNEL)) {
+			ret = -ENOMEM;
+			goto out_unlock;
+		}
 
 		/* save the old wq_unbound_cpumask. */
 		cpumask_copy(saved_cpumask, wq_unbound_cpumask);
@@ -5147,10 +5153,11 @@ int workqueue_set_unbound_cpumask(cpumask_var_t cpumask)
 		if (ret < 0)
 			cpumask_copy(wq_unbound_cpumask, saved_cpumask);
 
+		free_cpumask_var(saved_cpumask);
+out_unlock:
 		apply_wqattrs_unlock();
 	}
 
-	free_cpumask_var(saved_cpumask);
 	return ret;
 }
 

commit fd6979aff272ff28db52b7dae648ecd151d9d553
Author: Lasse Collin <lasse.collin@tukaani.org>
Date:   Mon Oct 11 05:31:40 2021 +0800

    lib/xz: Validate the value before assigning it to an enum variable
    
    [ Upstream commit 4f8d7abaa413c34da9d751289849dbfb7c977d05 ]
    
    This might matter, for example, if the underlying type of enum xz_check
    was a signed char. In such a case the validation wouldn't have caught an
    unsupported header. I don't know if this problem can occur in the kernel
    on any arch but it's still good to fix it because some people might copy
    the XZ code to their own projects from Linux instead of the upstream
    XZ Embedded repository.
    
    This change may increase the code size by a few bytes. An alternative
    would have been to use an unsigned int instead of enum xz_check but
    using an enumeration looks cleaner.
    
    Link: https://lore.kernel.org/r/20211010213145.17462-3-xiang@kernel.org
    Signed-off-by: Lasse Collin <lasse.collin@tukaani.org>
    Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/lib/xz/xz_dec_stream.c b/lib/xz/xz_dec_stream.c
index bd1d182419d7..0b161f90d8d8 100644
--- a/lib/xz/xz_dec_stream.c
+++ b/lib/xz/xz_dec_stream.c
@@ -402,12 +402,12 @@ static enum xz_ret dec_stream_header(struct xz_dec *s)
 	 * we will accept other check types too, but then the check won't
 	 * be verified and a warning (XZ_UNSUPPORTED_CHECK) will be given.
 	 */
+	if (s->temp.buf[HEADER_MAGIC_SIZE + 1] > XZ_CHECK_MAX)
+		return XZ_OPTIONS_ERROR;
+
 	s->check_type = s->temp.buf[HEADER_MAGIC_SIZE + 1];
 
 #ifdef XZ_DEC_ANY_CHECK
-	if (s->check_type > XZ_CHECK_MAX)
-		return XZ_OPTIONS_ERROR;
-
 	if (s->check_type > XZ_CHECK_CRC32)
 		return XZ_UNSUPPORTED_CHECK;
 #else

commit 543d8854c4bf2f77b1ede6a0c319a5b5c4fd8c4e
Author: Lasse Collin <lasse.collin@tukaani.org>
Date:   Mon Oct 11 05:31:39 2021 +0800

    lib/xz: Avoid overlapping memcpy() with invalid input with in-place decompression
    
    [ Upstream commit 83d3c4f22a36d005b55f44628f46cc0d319a75e8 ]
    
    With valid files, the safety margin described in lib/decompress_unxz.c
    ensures that these buffers cannot overlap. But if the uncompressed size
    of the input is larger than the caller thought, which is possible when
    the input file is invalid/corrupt, the buffers can overlap. Obviously
    the result will then be garbage (and usually the decoder will return
    an error too) but no other harm will happen when such an over-run occurs.
    
    This change only affects uncompressed LZMA2 chunks and so this
    should have no effect on performance.
    
    Link: https://lore.kernel.org/r/20211010213145.17462-2-xiang@kernel.org
    Signed-off-by: Lasse Collin <lasse.collin@tukaani.org>
    Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/lib/decompress_unxz.c b/lib/decompress_unxz.c
index 25d59a95bd66..abea25310ac7 100644
--- a/lib/decompress_unxz.c
+++ b/lib/decompress_unxz.c
@@ -167,7 +167,7 @@
  * memeq and memzero are not used much and any remotely sane implementation
  * is fast enough. memcpy/memmove speed matters in multi-call mode, but
  * the kernel image is decompressed in single-call mode, in which only
- * memcpy speed can matter and only if there is a lot of uncompressible data
+ * memmove speed can matter and only if there is a lot of uncompressible data
  * (LZMA2 stores uncompressible chunks in uncompressed form). Thus, the
  * functions below should just be kept small; it's probably not worth
  * optimizing for speed.
diff --git a/lib/xz/xz_dec_lzma2.c b/lib/xz/xz_dec_lzma2.c
index 08c3c8049998..2c5197d6b944 100644
--- a/lib/xz/xz_dec_lzma2.c
+++ b/lib/xz/xz_dec_lzma2.c
@@ -387,7 +387,14 @@ static void dict_uncompressed(struct dictionary *dict, struct xz_buf *b,
 
 		*left -= copy_size;
 
-		memcpy(dict->buf + dict->pos, b->in + b->in_pos, copy_size);
+		/*
+		 * If doing in-place decompression in single-call mode and the
+		 * uncompressed size of the file is larger than the caller
+		 * thought (i.e. it is invalid input!), the buffers below may
+		 * overlap and cause undefined behavior with memcpy().
+		 * With valid inputs memcpy() would be fine here.
+		 */
+		memmove(dict->buf + dict->pos, b->in + b->in_pos, copy_size);
 		dict->pos += copy_size;
 
 		if (dict->full < dict->pos)
@@ -397,7 +404,11 @@ static void dict_uncompressed(struct dictionary *dict, struct xz_buf *b,
 			if (dict->pos == dict->end)
 				dict->pos = 0;
 
-			memcpy(b->out + b->out_pos, b->in + b->in_pos,
+			/*
+			 * Like above but for multi-call mode: use memmove()
+			 * to avoid undefined behavior with invalid input.
+			 */
+			memmove(b->out + b->out_pos, b->in + b->in_pos,
 					copy_size);
 		}
 
@@ -421,6 +432,12 @@ static uint32_t dict_flush(struct dictionary *dict, struct xz_buf *b)
 		if (dict->pos == dict->end)
 			dict->pos = 0;
 
+		/*
+		 * These buffers cannot overlap even if doing in-place
+		 * decompression because in multi-call mode dict->buf
+		 * has been allocated by us in this file; it's not
+		 * provided by the caller like in single-call mode.
+		 */
 		memcpy(b->out + b->out_pos, dict->buf + dict->start,
 				copy_size);
 	}

commit dbbc06f0c10361d555c507ab4cff99450b0a1678
Author: Zheyu Ma <zheyuma97@gmail.com>
Date:   Sat Oct 16 11:26:21 2021 +0000

    memstick: r592: Fix a UAF bug when removing the driver
    
    [ Upstream commit 738216c1953e802aa9f930c5d15b8f9092c847ff ]
    
    In r592_remove(), the driver will free dma after freeing the host, which
    may cause a UAF bug.
    
    The following log reveals it:
    
    [   45.361796 ] BUG: KASAN: use-after-free in r592_remove+0x269/0x350 [r592]
    [   45.364286 ] Call Trace:
    [   45.364472 ]  dump_stack_lvl+0xa8/0xd1
    [   45.364751 ]  print_address_description+0x87/0x3b0
    [   45.365137 ]  kasan_report+0x172/0x1c0
    [   45.365415 ]  ? r592_remove+0x269/0x350 [r592]
    [   45.365834 ]  ? r592_remove+0x269/0x350 [r592]
    [   45.366168 ]  __asan_report_load8_noabort+0x14/0x20
    [   45.366531 ]  r592_remove+0x269/0x350 [r592]
    [   45.378785 ]
    [   45.378903 ] Allocated by task 4674:
    [   45.379162 ]  ____kasan_kmalloc+0xb5/0xe0
    [   45.379455 ]  __kasan_kmalloc+0x9/0x10
    [   45.379730 ]  __kmalloc+0x150/0x280
    [   45.379984 ]  memstick_alloc_host+0x2a/0x190
    [   45.380664 ]
    [   45.380781 ] Freed by task 5509:
    [   45.381014 ]  kasan_set_track+0x3d/0x70
    [   45.381293 ]  kasan_set_free_info+0x23/0x40
    [   45.381635 ]  ____kasan_slab_free+0x10b/0x140
    [   45.381950 ]  __kasan_slab_free+0x11/0x20
    [   45.382241 ]  slab_free_freelist_hook+0x81/0x150
    [   45.382575 ]  kfree+0x13e/0x290
    [   45.382805 ]  memstick_free+0x1c/0x20
    [   45.383070 ]  device_release+0x9c/0x1d0
    [   45.383349 ]  kobject_put+0x2ef/0x4c0
    [   45.383616 ]  put_device+0x1f/0x30
    [   45.383865 ]  memstick_free_host+0x24/0x30
    [   45.384162 ]  r592_remove+0x242/0x350 [r592]
    [   45.384473 ]  pci_device_remove+0xa9/0x250
    
    Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
    Link: https://lore.kernel.org/r/1634383581-11055-1-git-send-email-zheyuma97@gmail.com
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/memstick/host/r592.c b/drivers/memstick/host/r592.c
index 4559593ecd5a..4728a42d54b8 100644
--- a/drivers/memstick/host/r592.c
+++ b/drivers/memstick/host/r592.c
@@ -840,15 +840,15 @@ static void r592_remove(struct pci_dev *pdev)
 	}
 	memstick_remove_host(dev->host);
 
+	if (dev->dummy_dma_page)
+		dma_free_coherent(&pdev->dev, PAGE_SIZE, dev->dummy_dma_page,
+			dev->dummy_dma_page_physical_address);
+
 	free_irq(dev->irq, dev);
 	iounmap(dev->mmio);
 	pci_release_regions(pdev);
 	pci_disable_device(pdev);
 	memstick_free_host(dev->host);
-
-	if (dev->dummy_dma_page)
-		dma_free_coherent(&pdev->dev, PAGE_SIZE, dev->dummy_dma_page,
-			dev->dummy_dma_page_physical_address);
 }
 
 #ifdef CONFIG_PM_SLEEP

commit 6193591e95c37f427357492fde009c3bf3b0f093
Author: Kees Cook <keescook@chromium.org>
Date:   Wed Sep 29 15:02:18 2021 -0700

    leaking_addresses: Always print a trailing newline
    
    [ Upstream commit cf2a85efdade117e2169d6e26641016cbbf03ef0 ]
    
    For files that lack trailing newlines and match a leaking address (e.g.
    wchan[1]), the leaking_addresses.pl report would run together with the
    next line, making things look corrupted.
    
    Unconditionally remove the newline on input, and write it back out on
    output.
    
    [1] https://lore.kernel.org/all/20210103142726.GC30643@xsang-OptiPlex-9020/
    
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20211008111626.151570317@infradead.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/scripts/leaking_addresses.pl b/scripts/leaking_addresses.pl
index 6a897788f5a7..6e4b0f7ae38c 100755
--- a/scripts/leaking_addresses.pl
+++ b/scripts/leaking_addresses.pl
@@ -456,8 +456,9 @@ sub parse_file
 
 	open my $fh, "<", $file or return;
 	while ( <$fh> ) {
+		chomp;
 		if (may_leak_address($_)) {
-			print $file . ': ' . $_;
+			printf("$file: $_\n");
 		}
 	}
 	close $fh;

commit ab363b3734fb9545d1b0bf9997e3f8329fc37ad1
Author: André Almeida <andrealmeid@collabora.com>
Date:   Fri Oct 8 00:05:29 2021 -0300

    ACPI: battery: Accept charges over the design capacity as full
    
    [ Upstream commit 2835f327bd1240508db2c89fe94a056faa53c49a ]
    
    Some buggy firmware and/or brand new batteries can support a charge that's
    slightly over the reported design capacity. In such cases, the kernel will
    report to userspace that the charging state of the battery is "Unknown",
    when in reality the battery charge is "Full", at least from the design
    capacity point of view. Make the fallback condition accepts capacities
    over the designed capacity so userspace knows that is full.
    
    Signed-off-by: André Almeida <andrealmeid@collabora.com>
    Reviewed-by: Hans de Goede <hdegoede@redhat.com>
    Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
index 674a0e92b798..0bbf8b453ebf 100644
--- a/drivers/acpi/battery.c
+++ b/drivers/acpi/battery.c
@@ -198,7 +198,7 @@ static int acpi_battery_is_charged(struct acpi_battery *battery)
 		return 1;
 
 	/* fallback to using design values for broken batteries */
-	if (battery->design_capacity == battery->capacity_now)
+	if (battery->design_capacity <= battery->capacity_now)
 		return 1;
 
 	/* we don't do any sort of metric based on percentages */

commit c677ab783de80a5d6d7f67737a3a62d4c2f23762
Author: Tuo Li <islituo@gmail.com>
Date:   Thu Aug 5 08:38:53 2021 -0700

    ath: dfs_pattern_detector: Fix possible null-pointer dereference in channel_detector_create()
    
    [ Upstream commit 4b6012a7830b813799a7faf40daa02a837e0fd5b ]
    
    kzalloc() is used to allocate memory for cd->detectors, and if it fails,
    channel_detector_exit() behind the label fail will be called:
      channel_detector_exit(dpd, cd);
    
    In channel_detector_exit(), cd->detectors is dereferenced through:
      struct pri_detector *de = cd->detectors[i];
    
    To fix this possible null-pointer dereference, check cd->detectors before
    the for loop to dereference cd->detectors.
    
    Reported-by: TOTE Robot <oslab@tsinghua.edu.cn>
    Signed-off-by: Tuo Li <islituo@gmail.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210805153854.154066-1-islituo@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/ath/dfs_pattern_detector.c b/drivers/net/wireless/ath/dfs_pattern_detector.c
index a274eb0d1968..a0ad6e48a35b 100644
--- a/drivers/net/wireless/ath/dfs_pattern_detector.c
+++ b/drivers/net/wireless/ath/dfs_pattern_detector.c
@@ -182,10 +182,12 @@ static void channel_detector_exit(struct dfs_pattern_detector *dpd,
 	if (cd == NULL)
 		return;
 	list_del(&cd->head);
-	for (i = 0; i < dpd->num_radar_types; i++) {
-		struct pri_detector *de = cd->detectors[i];
-		if (de != NULL)
-			de->exit(de);
+	if (cd->detectors) {
+		for (i = 0; i < dpd->num_radar_types; i++) {
+			struct pri_detector *de = cd->detectors[i];
+			if (de != NULL)
+				de->exit(de);
+		}
 	}
 	kfree(cd->detectors);
 	kfree(cd);

commit 367fabbaf716de49972344028eb160c640ccc6ec
Author: Steven Rostedt (VMware) <rostedt@goodmis.org>
Date:   Wed Aug 18 11:24:50 2021 -0400

    tracefs: Have tracefs directories not set OTH permission bits by default
    
    [ Upstream commit 49d67e445742bbcb03106b735b2ab39f6e5c56bc ]
    
    The tracefs file system is by default mounted such that only root user can
    access it. But there are legitimate reasons to create a group and allow
    those added to the group to have access to tracing. By changing the
    permissions of the tracefs mount point to allow access, it will allow
    group access to the tracefs directory.
    
    There should not be any real reason to allow all access to the tracefs
    directory as it contains sensitive information. Have the default
    permission of directories being created not have any OTH (other) bits set,
    such that an admin that wants to give permission to a group has to first
    disable all OTH bits in the file system.
    
    Link: https://lkml.kernel.org/r/20210818153038.664127804@goodmis.org
    
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/tracefs/inode.c b/fs/tracefs/inode.c
index 7098c49f3693..990f794b1dd0 100644
--- a/fs/tracefs/inode.c
+++ b/fs/tracefs/inode.c
@@ -427,7 +427,8 @@ static struct dentry *__create_dir(const char *name, struct dentry *parent,
 	if (unlikely(!inode))
 		return failed_creating(dentry);
 
-	inode->i_mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO;
+	/* Do not set bits for OTH */
+	inode->i_mode = S_IFDIR | S_IRWXU | S_IRUSR| S_IRGRP | S_IXUSR | S_IXGRP;
 	inode->i_op = ops;
 	inode->i_fop = &simple_dir_operations;
 

commit 5c217fa1c1ab36f49e1fc5c5659bbc0d6817e36a
Author: Anant Thazhemadam <anant.thazhemadam@gmail.com>
Date:   Mon Dec 7 07:16:06 2020 +0100

    media: usb: dvd-usb: fix uninit-value bug in dibusb_read_eeprom_byte()
    
    [ Upstream commit 899a61a3305d49e8a712e9ab20d0db94bde5929f ]
    
    In dibusb_read_eeprom_byte(), if dibusb_i2c_msg() fails, val gets
    assigned an value that's not properly initialized.
    Using kzalloc() in place of kmalloc() for the buffer fixes this issue,
    as the val can now be set to 0 in the event dibusb_i2c_msg() fails.
    
    Reported-by: syzbot+e27b4fd589762b0b9329@syzkaller.appspotmail.com
    Tested-by: syzbot+e27b4fd589762b0b9329@syzkaller.appspotmail.com
    Signed-off-by: Anant Thazhemadam <anant.thazhemadam@gmail.com>
    Signed-off-by: Sean Young <sean@mess.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/usb/dvb-usb/dibusb-common.c b/drivers/media/usb/dvb-usb/dibusb-common.c
index fb1b4f2d5f9d..85b7838b3ede 100644
--- a/drivers/media/usb/dvb-usb/dibusb-common.c
+++ b/drivers/media/usb/dvb-usb/dibusb-common.c
@@ -226,7 +226,7 @@ int dibusb_read_eeprom_byte(struct dvb_usb_device *d, u8 offs, u8 *val)
 	u8 *buf;
 	int rc;
 
-	buf = kmalloc(2, GFP_KERNEL);
+	buf = kzalloc(2, GFP_KERNEL);
 	if (!buf)
 		return -ENOMEM;
 

commit 69aee3a2b407081e6ae25dfffa29ab166792bf3a
Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Date:   Wed Sep 29 18:31:25 2021 +0200

    ACPICA: Avoid evaluating methods too early during system resume
    
    [ Upstream commit d3c4b6f64ad356c0d9ddbcf73fa471e6a841cc5c ]
    
    ACPICA commit 0762982923f95eb652cf7ded27356b247c9774de
    
    During wakeup from system-wide sleep states, acpi_get_sleep_type_data()
    is called and it tries to get memory from the slab allocator in order
    to evaluate a control method, but if KFENCE is enabled in the kernel,
    the memory allocation attempt causes an IRQ work to be queued and a
    self-IPI to be sent to the CPU running the code which requires the
    memory controller to be ready, so if that happens too early in the
    wakeup path, it doesn't work.
    
    Prevent that from taking place by calling acpi_get_sleep_type_data()
    for S0 upfront, when preparing to enter a given sleep state, and
    saving the data obtained by it for later use during system wakeup.
    
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=214271
    Reported-by: Reik Keutterling <spielkind@gmail.com>
    Tested-by: Reik Keutterling <spielkind@gmail.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/acpi/acpica/acglobal.h b/drivers/acpi/acpica/acglobal.h
index 1e6204518496..38712fa4dd9d 100644
--- a/drivers/acpi/acpica/acglobal.h
+++ b/drivers/acpi/acpica/acglobal.h
@@ -224,6 +224,8 @@ extern struct acpi_bit_register_info
     acpi_gbl_bit_register_info[ACPI_NUM_BITREG];
 ACPI_GLOBAL(u8, acpi_gbl_sleep_type_a);
 ACPI_GLOBAL(u8, acpi_gbl_sleep_type_b);
+ACPI_GLOBAL(u8, acpi_gbl_sleep_type_a_s0);
+ACPI_GLOBAL(u8, acpi_gbl_sleep_type_b_s0);
 
 /*****************************************************************************
  *
diff --git a/drivers/acpi/acpica/hwesleep.c b/drivers/acpi/acpica/hwesleep.c
index e0ad3f11142e..9516966124ae 100644
--- a/drivers/acpi/acpica/hwesleep.c
+++ b/drivers/acpi/acpica/hwesleep.c
@@ -147,17 +147,13 @@ acpi_status acpi_hw_extended_sleep(u8 sleep_state)
 
 acpi_status acpi_hw_extended_wake_prep(u8 sleep_state)
 {
-	acpi_status status;
 	u8 sleep_type_value;
 
 	ACPI_FUNCTION_TRACE(hw_extended_wake_prep);
 
-	status = acpi_get_sleep_type_data(ACPI_STATE_S0,
-					  &acpi_gbl_sleep_type_a,
-					  &acpi_gbl_sleep_type_b);
-	if (ACPI_SUCCESS(status)) {
+	if (acpi_gbl_sleep_type_a_s0 != ACPI_SLEEP_TYPE_INVALID) {
 		sleep_type_value =
-		    ((acpi_gbl_sleep_type_a << ACPI_X_SLEEP_TYPE_POSITION) &
+		    ((acpi_gbl_sleep_type_a_s0 << ACPI_X_SLEEP_TYPE_POSITION) &
 		     ACPI_X_SLEEP_TYPE_MASK);
 
 		(void)acpi_write((u64)(sleep_type_value | ACPI_X_SLEEP_ENABLE),
diff --git a/drivers/acpi/acpica/hwsleep.c b/drivers/acpi/acpica/hwsleep.c
index d8b8fc2ff563..f4282370947c 100644
--- a/drivers/acpi/acpica/hwsleep.c
+++ b/drivers/acpi/acpica/hwsleep.c
@@ -179,7 +179,7 @@ acpi_status acpi_hw_legacy_sleep(u8 sleep_state)
 
 acpi_status acpi_hw_legacy_wake_prep(u8 sleep_state)
 {
-	acpi_status status;
+	acpi_status status = AE_OK;
 	struct acpi_bit_register_info *sleep_type_reg_info;
 	struct acpi_bit_register_info *sleep_enable_reg_info;
 	u32 pm1a_control;
@@ -192,10 +192,7 @@ acpi_status acpi_hw_legacy_wake_prep(u8 sleep_state)
 	 * This is unclear from the ACPI Spec, but it is required
 	 * by some machines.
 	 */
-	status = acpi_get_sleep_type_data(ACPI_STATE_S0,
-					  &acpi_gbl_sleep_type_a,
-					  &acpi_gbl_sleep_type_b);
-	if (ACPI_SUCCESS(status)) {
+	if (acpi_gbl_sleep_type_a_s0 != ACPI_SLEEP_TYPE_INVALID) {
 		sleep_type_reg_info =
 		    acpi_hw_get_bit_register_info(ACPI_BITREG_SLEEP_TYPE);
 		sleep_enable_reg_info =
@@ -216,9 +213,9 @@ acpi_status acpi_hw_legacy_wake_prep(u8 sleep_state)
 
 			/* Insert the SLP_TYP bits */
 
-			pm1a_control |= (acpi_gbl_sleep_type_a <<
+			pm1a_control |= (acpi_gbl_sleep_type_a_s0 <<
 					 sleep_type_reg_info->bit_position);
-			pm1b_control |= (acpi_gbl_sleep_type_b <<
+			pm1b_control |= (acpi_gbl_sleep_type_b_s0 <<
 					 sleep_type_reg_info->bit_position);
 
 			/* Write the control registers and ignore any errors */
diff --git a/drivers/acpi/acpica/hwxfsleep.c b/drivers/acpi/acpica/hwxfsleep.c
index 3f22f7dd4556..dc1e44ccaae2 100644
--- a/drivers/acpi/acpica/hwxfsleep.c
+++ b/drivers/acpi/acpica/hwxfsleep.c
@@ -288,6 +288,13 @@ acpi_status acpi_enter_sleep_state_prep(u8 sleep_state)
 		return_ACPI_STATUS(status);
 	}
 
+	status = acpi_get_sleep_type_data(ACPI_STATE_S0,
+					  &acpi_gbl_sleep_type_a_s0,
+					  &acpi_gbl_sleep_type_b_s0);
+	if (ACPI_FAILURE(status)) {
+		acpi_gbl_sleep_type_a_s0 = ACPI_SLEEP_TYPE_INVALID;
+	}
+
 	/* Execute the _PTS method (Prepare To Sleep) */
 
 	arg_list.count = 1;

commit 605ed7145b5a397a31ca10ca9deea59954f9796c
Author: Nadezda Lutovinova <lutovinova@ispras.ru>
Date:   Wed Aug 11 19:18:16 2021 +0200

    media: rcar-csi2: Add checking to rcsi2_start_receiver()
    
    [ Upstream commit fc41665498332ad394b7db37f23e9394096ddc71 ]
    
    If rcsi2_code_to_fmt() return NULL, then null pointer dereference occurs
    in the next cycle. That should not be possible now but adding checking
    protects from future bugs.
    The patch adds checking if format is NULL.
    
    Found by Linux Driver Verification project (linuxtesting.org).
    
    Signed-off-by: Nadezda Lutovinova <lutovinova@ispras.ru>
    Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
    Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/platform/rcar-vin/rcar-csi2.c b/drivers/media/platform/rcar-vin/rcar-csi2.c
index dc5ae8025832..23f55514b002 100644
--- a/drivers/media/platform/rcar-vin/rcar-csi2.c
+++ b/drivers/media/platform/rcar-vin/rcar-csi2.c
@@ -474,6 +474,8 @@ static int rcsi2_start(struct rcar_csi2 *priv)
 
 	/* Code is validated in set_fmt. */
 	format = rcsi2_code_to_fmt(priv->mf.code);
+	if (!format)
+		return -EINVAL;
 
 	/*
 	 * Enable all Virtual Channels.

commit 8f55f852b46e8dc0875885399642a8ad5b59e546
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Sun Sep 26 10:12:24 2021 -0700

    ia64: don't do IA64_CMPXCHG_DEBUG without CONFIG_PRINTK
    
    [ Upstream commit c15b5fc054c3d6c97e953617605235c5cb8ce979 ]
    
    When CONFIG_PRINTK is not set, the CMPXCHG_BUGCHECK() macro calls
    _printk(), but _printk() is a static inline function, not available
    as an extern.
    Since the purpose of the macro is to print the BUGCHECK info,
    make this config option depend on PRINTK.
    
    Fixes multiple occurrences of this build error:
    
    ../include/linux/printk.h:208:5: error: static declaration of '_printk' follows non-static declaration
      208 | int _printk(const char *s, ...)
          |     ^~~~~~~
    In file included from ../arch/ia64/include/asm/cmpxchg.h:5,
    ../arch/ia64/include/uapi/asm/cmpxchg.h:146:28: note: previous declaration of '_printk' with type 'int(const char *, ...)'
      146 |                 extern int _printk(const char *fmt, ...);
    
    Cc: linux-ia64@vger.kernel.org
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Tony Luck <tony.luck@intel.com>
    Cc: Chris Down <chris@chrisdown.name>
    Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
    Cc: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Signed-off-by: Petr Mladek <pmladek@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/ia64/Kconfig.debug b/arch/ia64/Kconfig.debug
index 1371efc9b005..637ac79c29b6 100644
--- a/arch/ia64/Kconfig.debug
+++ b/arch/ia64/Kconfig.debug
@@ -39,7 +39,7 @@ config DISABLE_VHPT
 
 config IA64_DEBUG_CMPXCHG
 	bool "Turn on compare-and-exchange bug checking (slow!)"
-	depends on DEBUG_KERNEL
+	depends on DEBUG_KERNEL && PRINTK
 	help
 	  Selecting this option turns on bug checking for the IA-64
 	  compare-and-exchange instructions.  This is slow!  Itaniums

commit 9dbf2cf7136c9b5e4bad7cd0451ffd8be9bbbcf1
Author: Rajat Asthana <rajatasthana4@gmail.com>
Date:   Wed Aug 18 22:31:10 2021 +0200

    media: mceusb: return without resubmitting URB in case of -EPROTO error.
    
    [ Upstream commit 476db72e521983ecb847e4013b263072bb1110fc ]
    
    Syzkaller reported a warning called "rcu detected stall in dummy_timer".
    
    The error seems to be an error in mceusb_dev_recv(). In the case of
    -EPROTO error, the routine immediately resubmits the URB. Instead it
    should return without resubmitting URB.
    
    Reported-by: syzbot+4d3749e9612c2cfab956@syzkaller.appspotmail.com
    Signed-off-by: Rajat Asthana <rajatasthana4@gmail.com>
    Signed-off-by: Sean Young <sean@mess.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/rc/mceusb.c b/drivers/media/rc/mceusb.c
index 845583e2af4d..cf4bcf7c62f2 100644
--- a/drivers/media/rc/mceusb.c
+++ b/drivers/media/rc/mceusb.c
@@ -1323,6 +1323,7 @@ static void mceusb_dev_recv(struct urb *urb)
 	case -ECONNRESET:
 	case -ENOENT:
 	case -EILSEQ:
+	case -EPROTO:
 	case -ESHUTDOWN:
 		usb_unlink_urb(urb);
 		return;

commit ee322875f9587769a9b305a5b3a30f64aa3e03f1
Author: Nadezda Lutovinova <lutovinova@ispras.ru>
Date:   Wed Aug 11 15:32:28 2021 +0200

    media: s5p-mfc: Add checking to s5p_mfc_probe().
    
    [ Upstream commit cdfaf4752e6915a4b455ad4400133e540e4dc965 ]
    
    If of_device_get_match_data() return NULL,
    then null pointer dereference occurs in  s5p_mfc_init_pm().
    The patch adds checking if dev->variant is NULL.
    
    Found by Linux Driver Verification project (linuxtesting.org).
    
    Signed-off-by: Nadezda Lutovinova <lutovinova@ispras.ru>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc.c b/drivers/media/platform/s5p-mfc/s5p_mfc.c
index 80bb58d31c3f..0fc101bc58d6 100644
--- a/drivers/media/platform/s5p-mfc/s5p_mfc.c
+++ b/drivers/media/platform/s5p-mfc/s5p_mfc.c
@@ -1281,6 +1281,10 @@ static int s5p_mfc_probe(struct platform_device *pdev)
 	}
 
 	dev->variant = of_device_get_match_data(&pdev->dev);
+	if (!dev->variant) {
+		dev_err(&pdev->dev, "Failed to get device MFC hardware variant information\n");
+		return -ENOENT;
+	}
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	dev->regs_base = devm_ioremap_resource(&pdev->dev, res);

commit 558d70c9130aba7c7d83d53fb3c5077622e57e2d
Author: Tuo Li <islituo@gmail.com>
Date:   Thu Aug 5 09:55:35 2021 +0200

    media: s5p-mfc: fix possible null-pointer dereference in s5p_mfc_probe()
    
    [ Upstream commit 8515965e5e33f4feb56134348c95953f3eadfb26 ]
    
    The variable pdev is assigned to dev->plat_dev, and dev->plat_dev is
    checked in:
      if (!dev->plat_dev)
    
    This indicates both dev->plat_dev and pdev can be NULL. If so, the
    function dev_err() is called to print error information.
      dev_err(&pdev->dev, "No platform data specified\n");
    
    However, &pdev->dev is an illegal address, and it is dereferenced in
    dev_err().
    
    To fix this possible null-pointer dereference, replace dev_err() with
    mfc_err().
    
    Reported-by: TOTE Robot <oslab@tsinghua.edu.cn>
    Signed-off-by: Tuo Li <islituo@gmail.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc.c b/drivers/media/platform/s5p-mfc/s5p_mfc.c
index 4b8516c35bc2..80bb58d31c3f 100644
--- a/drivers/media/platform/s5p-mfc/s5p_mfc.c
+++ b/drivers/media/platform/s5p-mfc/s5p_mfc.c
@@ -1276,7 +1276,7 @@ static int s5p_mfc_probe(struct platform_device *pdev)
 	spin_lock_init(&dev->condlock);
 	dev->plat_dev = pdev;
 	if (!dev->plat_dev) {
-		dev_err(&pdev->dev, "No platform data specified\n");
+		mfc_err("No platform data specified\n");
 		return -ENODEV;
 	}
 

commit 6cffd197d153c5d21da78f0379a6681c08737fe1
Author: Ricardo Ribalda <ribalda@chromium.org>
Date:   Fri Jun 18 14:29:09 2021 +0200

    media: uvcvideo: Return -EIO for control errors
    
    [ Upstream commit ffccdde5f0e17d2f0d788a9d831a027187890eaa ]
    
    The device is doing something unexpected with the control. Either because
    the protocol is not properly implemented or there has been a HW error.
    
    Fixes v4l2-compliance:
    
    Control ioctls (Input 0):
                    fail: v4l2-test-controls.cpp(448): s_ctrl returned an error (22)
            test VIDIOC_G/S_CTRL: FAIL
                    fail: v4l2-test-controls.cpp(698): s_ext_ctrls returned an error (22)
            test VIDIOC_G/S/TRY_EXT_CTRLS: FAIL
    
    Reviewed-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
    Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c
index 56b058d60a0d..9c26e586bb01 100644
--- a/drivers/media/usb/uvc/uvc_video.c
+++ b/drivers/media/usb/uvc/uvc_video.c
@@ -117,6 +117,11 @@ int uvc_query_ctrl(struct uvc_device *dev, u8 query, u8 unit,
 	case 5: /* Invalid unit */
 	case 6: /* Invalid control */
 	case 7: /* Invalid Request */
+		/*
+		 * The firmware has not properly implemented
+		 * the control or there has been a HW error.
+		 */
+		return -EIO;
 	case 8: /* Invalid value within range */
 		return -EINVAL;
 	default: /* reserved or unknown */

commit c81522f4980c7d0bbefe12ed2dbc3504047881a7
Author: Ricardo Ribalda <ribalda@chromium.org>
Date:   Fri Jun 18 14:29:08 2021 +0200

    media: uvcvideo: Set capability in s_param
    
    [ Upstream commit 97a2777a96070afb7da5d587834086c0b586c8cc ]
    
    Fixes v4l2-compliance:
    
    Format ioctls (Input 0):
                    warn: v4l2-test-formats.cpp(1339): S_PARM is supported but doesn't report V4L2_CAP_TIMEPERFRAME
                    fail: v4l2-test-formats.cpp(1241): node->has_frmintervals && !cap->capability
    
    Reviewed-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
    Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c
index 2ca1e8ce6159..e858f4f189ed 100644
--- a/drivers/media/usb/uvc/uvc_v4l2.c
+++ b/drivers/media/usb/uvc/uvc_v4l2.c
@@ -474,10 +474,13 @@ static int uvc_v4l2_set_streamparm(struct uvc_streaming *stream,
 	uvc_simplify_fraction(&timeperframe.numerator,
 		&timeperframe.denominator, 8, 333);
 
-	if (parm->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
+	if (parm->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
 		parm->parm.capture.timeperframe = timeperframe;
-	else
+		parm->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
+	} else {
 		parm->parm.output.timeperframe = timeperframe;
+		parm->parm.output.capability = V4L2_CAP_TIMEPERFRAME;
+	}
 
 	return 0;
 }

commit b73ecce5b5a8cf764233a5d141af91b054370ba4
Author: Zheyu Ma <zheyuma97@gmail.com>
Date:   Wed Jun 23 08:01:05 2021 +0200

    media: netup_unidvb: handle interrupt properly according to the firmware
    
    [ Upstream commit dbb4cfea6efe979ed153bd59a6a527a90d3d0ab3 ]
    
    The interrupt handling should be related to the firmware version. If
    the driver matches an old firmware, then the driver should not handle
    interrupt such as i2c or dma, otherwise it will cause some errors.
    
    This log reveals it:
    
    [   27.708641] INFO: trying to register non-static key.
    [   27.710851] The code is fine but needs lockdep annotation, or maybe
    [   27.712010] you didn't initialize this object before use?
    [   27.712396] turning off the locking correctness validator.
    [   27.712787] CPU: 2 PID: 0 Comm: swapper/2 Not tainted 5.12.4-g70e7f0549188-dirty #169
    [   27.713349] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.12.0-59-gc9ba5276e321-prebuilt.qemu.org 04/01/2014
    [   27.714149] Call Trace:
    [   27.714329]  <IRQ>
    [   27.714480]  dump_stack+0xba/0xf5
    [   27.714737]  register_lock_class+0x873/0x8f0
    [   27.715052]  ? __lock_acquire+0x323/0x1930
    [   27.715353]  __lock_acquire+0x75/0x1930
    [   27.715636]  lock_acquire+0x1dd/0x3e0
    [   27.715905]  ? netup_i2c_interrupt+0x19/0x310
    [   27.716226]  _raw_spin_lock_irqsave+0x4b/0x60
    [   27.716544]  ? netup_i2c_interrupt+0x19/0x310
    [   27.716863]  netup_i2c_interrupt+0x19/0x310
    [   27.717178]  netup_unidvb_isr+0xd3/0x160
    [   27.717467]  __handle_irq_event_percpu+0x53/0x3e0
    [   27.717808]  handle_irq_event_percpu+0x35/0x90
    [   27.718129]  handle_irq_event+0x39/0x60
    [   27.718409]  handle_fasteoi_irq+0xc2/0x1d0
    [   27.718707]  __common_interrupt+0x7f/0x150
    [   27.719008]  common_interrupt+0xb4/0xd0
    [   27.719289]  </IRQ>
    [   27.719446]  asm_common_interrupt+0x1e/0x40
    [   27.719747] RIP: 0010:native_safe_halt+0x17/0x20
    [   27.720084] Code: 07 0f 00 2d 8b ee 4c 00 f4 5d c3 0f 1f 84 00 00 00 00 00 8b 05 72 95 17 02 55 48 89 e5 85 c0 7e 07 0f 00 2d 6b ee 4c 00 fb f4 <5d> c3 cc cc cc cc cc cc cc 55 48 89 e5 e8 67 53 ff ff 8b 0d 29 f6
    [   27.721386] RSP: 0018:ffffc9000008fe90 EFLAGS: 00000246
    [   27.721758] RAX: 0000000000000000 RBX: 0000000000000002 RCX: 0000000000000000
    [   27.722262] RDX: 0000000000000000 RSI: ffffffff85f7c054 RDI: ffffffff85ded4e6
    [   27.722770] RBP: ffffc9000008fe90 R08: 0000000000000001 R09: 0000000000000001
    [   27.723277] R10: 0000000000000000 R11: 0000000000000001 R12: ffffffff86a75408
    [   27.723781] R13: 0000000000000000 R14: 0000000000000000 R15: ffff888100260000
    [   27.724289]  default_idle+0x9/0x10
    [   27.724537]  arch_cpu_idle+0xa/0x10
    [   27.724791]  default_idle_call+0x6e/0x250
    [   27.725082]  do_idle+0x1f0/0x2d0
    [   27.725326]  cpu_startup_entry+0x18/0x20
    [   27.725613]  start_secondary+0x11f/0x160
    [   27.725902]  secondary_startup_64_no_verify+0xb0/0xbb
    [   27.726272] BUG: kernel NULL pointer dereference, address: 0000000000000002
    [   27.726768] #PF: supervisor read access in kernel mode
    [   27.727138] #PF: error_code(0x0000) - not-present page
    [   27.727507] PGD 8000000118688067 P4D 8000000118688067 PUD 10feab067 PMD 0
    [   27.727999] Oops: 0000 [#1] PREEMPT SMP PTI
    [   27.728302] CPU: 2 PID: 0 Comm: swapper/2 Not tainted 5.12.4-g70e7f0549188-dirty #169
    [   27.728861] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.12.0-59-gc9ba5276e321-prebuilt.qemu.org 04/01/2014
    [   27.729660] RIP: 0010:netup_i2c_interrupt+0x23/0x310
    [   27.730019] Code: 0f 1f 80 00 00 00 00 55 48 89 e5 41 55 41 54 53 48 89 fb e8 af 6e 95 fd 48 89 df e8 e7 9f 1c 01 49 89 c5 48 8b 83 48 08 00 00 <66> 44 8b 60 02 44 89 e0 48 8b 93 48 08 00 00 83 e0 f8 66 89 42 02
    [   27.731339] RSP: 0018:ffffc90000118e90 EFLAGS: 00010046
    [   27.731716] RAX: 0000000000000000 RBX: ffff88810803c4d8 RCX: 0000000000000000
    [   27.732223] RDX: 0000000000000001 RSI: ffffffff85d37b94 RDI: ffff88810803c4d8
    [   27.732727] RBP: ffffc90000118ea8 R08: 0000000000000000 R09: 0000000000000001
    [   27.733239] R10: ffff88810803c4f0 R11: 61646e6f63657320 R12: 0000000000000000
    [   27.733745] R13: 0000000000000046 R14: ffff888101041000 R15: ffff8881081b2400
    [   27.734251] FS:  0000000000000000(0000) GS:ffff88817bc80000(0000) knlGS:0000000000000000
    [   27.734821] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [   27.735228] CR2: 0000000000000002 CR3: 0000000108194000 CR4: 00000000000006e0
    [   27.735735] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    [   27.736241] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    [   27.736744] Call Trace:
    [   27.736924]  <IRQ>
    [   27.737074]  netup_unidvb_isr+0xd3/0x160
    [   27.737363]  __handle_irq_event_percpu+0x53/0x3e0
    [   27.737706]  handle_irq_event_percpu+0x35/0x90
    [   27.738028]  handle_irq_event+0x39/0x60
    [   27.738306]  handle_fasteoi_irq+0xc2/0x1d0
    [   27.738602]  __common_interrupt+0x7f/0x150
    [   27.738899]  common_interrupt+0xb4/0xd0
    [   27.739176]  </IRQ>
    [   27.739331]  asm_common_interrupt+0x1e/0x40
    [   27.739633] RIP: 0010:native_safe_halt+0x17/0x20
    [   27.739967] Code: 07 0f 00 2d 8b ee 4c 00 f4 5d c3 0f 1f 84 00 00 00 00 00 8b 05 72 95 17 02 55 48 89 e5 85 c0 7e 07 0f 00 2d 6b ee 4c 00 fb f4 <5d> c3 cc cc cc cc cc cc cc 55 48 89 e5 e8 67 53 ff ff 8b 0d 29 f6
    [   27.741275] RSP: 0018:ffffc9000008fe90 EFLAGS: 00000246
    [   27.741647] RAX: 0000000000000000 RBX: 0000000000000002 RCX: 0000000000000000
    [   27.742148] RDX: 0000000000000000 RSI: ffffffff85f7c054 RDI: ffffffff85ded4e6
    [   27.742652] RBP: ffffc9000008fe90 R08: 0000000000000001 R09: 0000000000000001
    [   27.743154] R10: 0000000000000000 R11: 0000000000000001 R12: ffffffff86a75408
    [   27.743652] R13: 0000000000000000 R14: 0000000000000000 R15: ffff888100260000
    [   27.744157]  default_idle+0x9/0x10
    [   27.744405]  arch_cpu_idle+0xa/0x10
    [   27.744658]  default_idle_call+0x6e/0x250
    [   27.744948]  do_idle+0x1f0/0x2d0
    [   27.745190]  cpu_startup_entry+0x18/0x20
    [   27.745475]  start_secondary+0x11f/0x160
    [   27.745761]  secondary_startup_64_no_verify+0xb0/0xbb
    [   27.746123] Modules linked in:
    [   27.746348] Dumping ftrace buffer:
    [   27.746596]    (ftrace buffer empty)
    [   27.746852] CR2: 0000000000000002
    [   27.747094] ---[ end trace ebafd46f83ab946d ]---
    [   27.747424] RIP: 0010:netup_i2c_interrupt+0x23/0x310
    [   27.747778] Code: 0f 1f 80 00 00 00 00 55 48 89 e5 41 55 41 54 53 48 89 fb e8 af 6e 95 fd 48 89 df e8 e7 9f 1c 01 49 89 c5 48 8b 83 48 08 00 00 <66> 44 8b 60 02 44 89 e0 48 8b 93 48 08 00 00 83 e0 f8 66 89 42 02
    [   27.749082] RSP: 0018:ffffc90000118e90 EFLAGS: 00010046
    [   27.749461] RAX: 0000000000000000 RBX: ffff88810803c4d8 RCX: 0000000000000000
    [   27.749966] RDX: 0000000000000001 RSI: ffffffff85d37b94 RDI: ffff88810803c4d8
    [   27.750471] RBP: ffffc90000118ea8 R08: 0000000000000000 R09: 0000000000000001
    [   27.750976] R10: ffff88810803c4f0 R11: 61646e6f63657320 R12: 0000000000000000
    [   27.751480] R13: 0000000000000046 R14: ffff888101041000 R15: ffff8881081b2400
    [   27.751986] FS:  0000000000000000(0000) GS:ffff88817bc80000(0000) knlGS:0000000000000000
    [   27.752560] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [   27.752970] CR2: 0000000000000002 CR3: 0000000108194000 CR4: 00000000000006e0
    [   27.753481] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    [   27.753984] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    [   27.754487] Kernel panic - not syncing: Fatal exception in interrupt
    [   27.755033] Dumping ftrace buffer:
    [   27.755279]    (ftrace buffer empty)
    [   27.755534] Kernel Offset: disabled
    [   27.755785] Rebooting in 1 seconds..
    
    Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
    Signed-off-by: Sean Young <sean@mess.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/pci/netup_unidvb/netup_unidvb_core.c b/drivers/media/pci/netup_unidvb/netup_unidvb_core.c
index ead59fabd15f..de3fc62810e6 100644
--- a/drivers/media/pci/netup_unidvb/netup_unidvb_core.c
+++ b/drivers/media/pci/netup_unidvb/netup_unidvb_core.c
@@ -267,19 +267,24 @@ static irqreturn_t netup_unidvb_isr(int irq, void *dev_id)
 	if ((reg40 & AVL_IRQ_ASSERTED) != 0) {
 		/* IRQ is being signaled */
 		reg_isr = readw(ndev->bmmio0 + REG_ISR);
-		if (reg_isr & NETUP_UNIDVB_IRQ_I2C0) {
-			iret = netup_i2c_interrupt(&ndev->i2c[0]);
-		} else if (reg_isr & NETUP_UNIDVB_IRQ_I2C1) {
-			iret = netup_i2c_interrupt(&ndev->i2c[1]);
-		} else if (reg_isr & NETUP_UNIDVB_IRQ_SPI) {
+		if (reg_isr & NETUP_UNIDVB_IRQ_SPI)
 			iret = netup_spi_interrupt(ndev->spi);
-		} else if (reg_isr & NETUP_UNIDVB_IRQ_DMA1) {
-			iret = netup_dma_interrupt(&ndev->dma[0]);
-		} else if (reg_isr & NETUP_UNIDVB_IRQ_DMA2) {
-			iret = netup_dma_interrupt(&ndev->dma[1]);
-		} else if (reg_isr & NETUP_UNIDVB_IRQ_CI) {
-			iret = netup_ci_interrupt(ndev);
+		else if (!ndev->old_fw) {
+			if (reg_isr & NETUP_UNIDVB_IRQ_I2C0) {
+				iret = netup_i2c_interrupt(&ndev->i2c[0]);
+			} else if (reg_isr & NETUP_UNIDVB_IRQ_I2C1) {
+				iret = netup_i2c_interrupt(&ndev->i2c[1]);
+			} else if (reg_isr & NETUP_UNIDVB_IRQ_DMA1) {
+				iret = netup_dma_interrupt(&ndev->dma[0]);
+			} else if (reg_isr & NETUP_UNIDVB_IRQ_DMA2) {
+				iret = netup_dma_interrupt(&ndev->dma[1]);
+			} else if (reg_isr & NETUP_UNIDVB_IRQ_CI) {
+				iret = netup_ci_interrupt(ndev);
+			} else {
+				goto err;
+			}
 		} else {
+err:
 			dev_err(&pci_dev->dev,
 				"%s(): unknown interrupt 0x%x\n",
 				__func__, reg_isr);

commit 2d6f69a54a39a647df235606aa69af57e3f0703f
Author: Dirk Bender <d.bender@phytec.de>
Date:   Mon Jul 26 09:35:15 2021 +0200

    media: mt9p031: Fix corrupted frame after restarting stream
    
    [ Upstream commit 0961ba6dd211a4a52d1dd4c2d59be60ac2dc08c7 ]
    
    To prevent corrupted frames after starting and stopping the sensor its
    datasheet specifies a specific pause sequence to follow:
    
    Stopping:
            Set Pause_Restart Bit -> Set Restart Bit -> Set Chip_Enable Off
    
    Restarting:
            Set Chip_Enable On -> Clear Pause_Restart Bit
    
    The Restart Bit is cleared automatically and must not be cleared
    manually as this would cause undefined behavior.
    
    Signed-off-by: Dirk Bender <d.bender@phytec.de>
    Signed-off-by: Stefan Riedmueller <s.riedmueller@phytec.de>
    Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/i2c/mt9p031.c b/drivers/media/i2c/mt9p031.c
index 715be3632b01..eb08acf43e3a 100644
--- a/drivers/media/i2c/mt9p031.c
+++ b/drivers/media/i2c/mt9p031.c
@@ -81,7 +81,9 @@
 #define		MT9P031_PIXEL_CLOCK_INVERT		(1 << 15)
 #define		MT9P031_PIXEL_CLOCK_SHIFT(n)		((n) << 8)
 #define		MT9P031_PIXEL_CLOCK_DIVIDE(n)		((n) << 0)
-#define MT9P031_FRAME_RESTART				0x0b
+#define MT9P031_RESTART					0x0b
+#define		MT9P031_FRAME_PAUSE_RESTART		(1 << 1)
+#define		MT9P031_FRAME_RESTART			(1 << 0)
 #define MT9P031_SHUTTER_DELAY				0x0c
 #define MT9P031_RST					0x0d
 #define		MT9P031_RST_ENABLE			1
@@ -448,9 +450,23 @@ static int mt9p031_set_params(struct mt9p031 *mt9p031)
 static int mt9p031_s_stream(struct v4l2_subdev *subdev, int enable)
 {
 	struct mt9p031 *mt9p031 = to_mt9p031(subdev);
+	struct i2c_client *client = v4l2_get_subdevdata(subdev);
+	int val;
 	int ret;
 
 	if (!enable) {
+		/* enable pause restart */
+		val = MT9P031_FRAME_PAUSE_RESTART;
+		ret = mt9p031_write(client, MT9P031_RESTART, val);
+		if (ret < 0)
+			return ret;
+
+		/* enable restart + keep pause restart set */
+		val |= MT9P031_FRAME_RESTART;
+		ret = mt9p031_write(client, MT9P031_RESTART, val);
+		if (ret < 0)
+			return ret;
+
 		/* Stop sensor readout */
 		ret = mt9p031_set_output_control(mt9p031,
 						 MT9P031_OUTPUT_CONTROL_CEN, 0);
@@ -470,6 +486,16 @@ static int mt9p031_s_stream(struct v4l2_subdev *subdev, int enable)
 	if (ret < 0)
 		return ret;
 
+	/*
+	 * - clear pause restart
+	 * - don't clear restart as clearing restart manually can cause
+	 *   undefined behavior
+	 */
+	val = MT9P031_FRAME_RESTART;
+	ret = mt9p031_write(client, MT9P031_RESTART, val);
+	if (ret < 0)
+		return ret;
+
 	return mt9p031_pll_enable(mt9p031);
 }
 

commit 89d75fc9752b9871069cad162a92a2bdc2df8759
Author: Jonas Dre?ler <verdre@v0yd.nl>
Date:   Tue Sep 14 21:59:08 2021 +0200

    mwifiex: Properly initialize private structure on interface type changes
    
    [ Upstream commit c606008b70627a2fc485732a53cc22f0f66d0981 ]
    
    When creating a new virtual interface in mwifiex_add_virtual_intf(), we
    update our internal driver states like bss_type, bss_priority, bss_role
    and bss_mode to reflect the mode the firmware will be set to.
    
    When switching virtual interface mode using
    mwifiex_init_new_priv_params() though, we currently only update bss_mode
    and bss_role. In order for the interface mode switch to actually work,
    we also need to update bss_type to its proper value, so do that.
    
    This fixes a crash of the firmware (because the driver tries to execute
    commands that are invalid in AP mode) when switching from station mode
    to AP mode.
    
    Signed-off-by: Jonas Dre?ler <verdre@v0yd.nl>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210914195909.36035-9-verdre@v0yd.nl
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
index becde7c254de..892247145f42 100644
--- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
+++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
@@ -912,16 +912,20 @@ mwifiex_init_new_priv_params(struct mwifiex_private *priv,
 	switch (type) {
 	case NL80211_IFTYPE_STATION:
 	case NL80211_IFTYPE_ADHOC:
-		priv->bss_role =  MWIFIEX_BSS_ROLE_STA;
+		priv->bss_role = MWIFIEX_BSS_ROLE_STA;
+		priv->bss_type = MWIFIEX_BSS_TYPE_STA;
 		break;
 	case NL80211_IFTYPE_P2P_CLIENT:
-		priv->bss_role =  MWIFIEX_BSS_ROLE_STA;
+		priv->bss_role = MWIFIEX_BSS_ROLE_STA;
+		priv->bss_type = MWIFIEX_BSS_TYPE_P2P;
 		break;
 	case NL80211_IFTYPE_P2P_GO:
-		priv->bss_role =  MWIFIEX_BSS_ROLE_UAP;
+		priv->bss_role = MWIFIEX_BSS_ROLE_UAP;
+		priv->bss_type = MWIFIEX_BSS_TYPE_P2P;
 		break;
 	case NL80211_IFTYPE_AP:
 		priv->bss_role = MWIFIEX_BSS_ROLE_UAP;
+		priv->bss_type = MWIFIEX_BSS_TYPE_UAP;
 		break;
 	default:
 		mwifiex_dbg(adapter, ERROR,

commit dcfa20ad148979fd167cdc7e4e213fa1cc81d328
Author: Jonas Dre?ler <verdre@v0yd.nl>
Date:   Tue Sep 14 21:59:03 2021 +0200

    mwifiex: Run SET_BSS_MODE when changing from P2P to STATION vif-type
    
    [ Upstream commit c2e9666cdffd347460a2b17988db4cfaf2a68fb9 ]
    
    We currently handle changing from the P2P to the STATION virtual
    interface type slightly different than changing from P2P to ADHOC: When
    changing to STATION, we don't send the SET_BSS_MODE command. We do send
    that command on all other type-changes though, and it probably makes
    sense to send the command since after all we just changed our BSS_MODE.
    Looking at prior changes to this part of the code, it seems that this is
    simply a leftover from old refactorings.
    
    Since sending the SET_BSS_MODE command is the only difference between
    mwifiex_change_vif_to_sta_adhoc() and the current code, we can now use
    mwifiex_change_vif_to_sta_adhoc() for both switching to ADHOC and
    STATION interface type.
    
    This does not fix any particular bug and just "looked right", so there's
    a small chance it might be a regression.
    
    Signed-off-by: Jonas Dre?ler <verdre@v0yd.nl>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210914195909.36035-4-verdre@v0yd.nl
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
index 650191db25cb..becde7c254de 100644
--- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
+++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
@@ -1233,29 +1233,15 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
 		break;
 	case NL80211_IFTYPE_P2P_CLIENT:
 	case NL80211_IFTYPE_P2P_GO:
+		if (mwifiex_cfg80211_deinit_p2p(priv))
+			return -EFAULT;
+
 		switch (type) {
-		case NL80211_IFTYPE_STATION:
-			if (mwifiex_cfg80211_deinit_p2p(priv))
-				return -EFAULT;
-			priv->adapter->curr_iface_comb.p2p_intf--;
-			priv->adapter->curr_iface_comb.sta_intf++;
-			dev->ieee80211_ptr->iftype = type;
-			if (mwifiex_deinit_priv_params(priv))
-				return -1;
-			if (mwifiex_init_new_priv_params(priv, dev, type))
-				return -1;
-			if (mwifiex_sta_init_cmd(priv, false, false))
-				return -1;
-			break;
 		case NL80211_IFTYPE_ADHOC:
-			if (mwifiex_cfg80211_deinit_p2p(priv))
-				return -EFAULT;
+		case NL80211_IFTYPE_STATION:
 			return mwifiex_change_vif_to_sta_adhoc(dev, curr_iftype,
 							       type, params);
-			break;
 		case NL80211_IFTYPE_AP:
-			if (mwifiex_cfg80211_deinit_p2p(priv))
-				return -EFAULT;
 			return mwifiex_change_vif_to_ap(dev, curr_iftype, type,
 							params);
 		case NL80211_IFTYPE_UNSPECIFIED:

commit 5180dff7527bbae3f1e423644a2f9ecc3ab81e9d
Author: Peter Zijlstra <peterz@infradead.org>
Date:   Wed Sep 15 16:19:46 2021 +0200

    x86: Increase exception stack sizes
    
    [ Upstream commit 7fae4c24a2b84a66c7be399727aca11e7a888462 ]
    
    It turns out that a single page of stack is trivial to overflow with
    all the tracing gunk enabled. Raise the exception stacks to 2 pages,
    which is still half the interrupt stacks, which are at 4 pages.
    
    Reported-by: Michael Wang <yun.wang@linux.alibaba.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/YUIO9Ye98S5Eb68w@hirez.programming.kicks-ass.net
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/x86/include/asm/page_64_types.h b/arch/x86/include/asm/page_64_types.h
index 0b6352aabbd3..b16fb3e18513 100644
--- a/arch/x86/include/asm/page_64_types.h
+++ b/arch/x86/include/asm/page_64_types.h
@@ -20,7 +20,7 @@
 #define THREAD_SIZE  (PAGE_SIZE << THREAD_SIZE_ORDER)
 #define CURRENT_MASK (~(THREAD_SIZE - 1))
 
-#define EXCEPTION_STACK_ORDER (0 + KASAN_STACK_ORDER)
+#define EXCEPTION_STACK_ORDER (1 + KASAN_STACK_ORDER)
 #define EXCEPTION_STKSZ (PAGE_SIZE << EXCEPTION_STACK_ORDER)
 
 #define DEBUG_STACK_ORDER (EXCEPTION_STACK_ORDER + 1)

commit 28fab448b2a5fb46727771a8a2dce607cd363649
Author: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
Date:   Sat Aug 28 23:41:40 2021 -0700

    smackfs: Fix use-after-free in netlbl_catmap_walk()
    
    [ Upstream commit 0817534ff9ea809fac1322c5c8c574be8483ea57 ]
    
    Syzkaller reported use-after-free bug as described in [1]. The bug is
    triggered when smk_set_cipso() tries to free stale category bitmaps
    while there are concurrent reader(s) using the same bitmaps.
    
    Wait for RCU grace period to finish before freeing the category bitmaps
    in smk_set_cipso(). This makes sure that there are no more readers using
    the stale bitmaps and freeing them should be safe.
    
    [1] https://lore.kernel.org/netdev/000000000000a814c505ca657a4e@google.com/
    
    Reported-by: syzbot+3f91de0b813cc3d19a80@syzkaller.appspotmail.com
    Signed-off-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c
index 009e83ee2d00..25705a72d31b 100644
--- a/security/smack/smackfs.c
+++ b/security/smack/smackfs.c
@@ -859,6 +859,7 @@ static int smk_open_cipso(struct inode *inode, struct file *file)
 static ssize_t smk_set_cipso(struct file *file, const char __user *buf,
 				size_t count, loff_t *ppos, int format)
 {
+	struct netlbl_lsm_catmap *old_cat;
 	struct smack_known *skp;
 	struct netlbl_lsm_secattr ncats;
 	char mapcatset[SMK_CIPSOLEN];
@@ -948,9 +949,11 @@ static ssize_t smk_set_cipso(struct file *file, const char __user *buf,
 
 	rc = smk_netlbl_mls(maplevel, mapcatset, &ncats, SMK_CIPSOLEN);
 	if (rc >= 0) {
-		netlbl_catmap_free(skp->smk_netlabel.attr.mls.cat);
+		old_cat = skp->smk_netlabel.attr.mls.cat;
 		skp->smk_netlabel.attr.mls.cat = ncats.attr.mls.cat;
 		skp->smk_netlabel.attr.mls.lvl = ncats.attr.mls.lvl;
+		synchronize_rcu();
+		netlbl_catmap_free(old_cat);
 		rc = count;
 	}
 

commit aa90302e3189686c240ce8f62215bf593aad2cb5
Author: Jakub Kicinski <kuba@kernel.org>
Date:   Mon Sep 13 15:53:30 2021 -0700

    net: sched: update default qdisc visibility after Tx queue cnt changes
    
    [ Upstream commit 1e080f17750d1083e8a32f7b350584ae1cd7ff20 ]
    
    mq / mqprio make the default child qdiscs visible. They only do
    so for the qdiscs which are within real_num_tx_queues when the
    device is registered. Depending on order of calls in the driver,
    or if user space changes config via ethtool -L the number of
    qdiscs visible under tc qdisc show will differ from the number
    of queues. This is confusing to users and potentially to system
    configuration scripts which try to make sure qdiscs have the
    right parameters.
    
    Add a new Qdisc_ops callback and make relevant qdiscs TTRT.
    
    Note that this uncovers the "shortcut" created by
    commit 1f27cde313d7 ("net: sched: use pfifo_fast for non real queues")
    The default child qdiscs beyond initial real_num_tx are always
    pfifo_fast, no matter what the sysfs setting is. Fixing this
    gets a little tricky because we'd need to keep a reference
    on whatever the default qdisc was at the time of creation.
    In practice this is likely an non-issue the qdiscs likely have
    to be configured to non-default settings, so whatever user space
    is doing such configuration can replace the pfifos... now that
    it will see them.
    
    Reported-by: Matthew Massey <matthewmassey@fb.com>
    Reviewed-by: Dave Taht <dave.taht@gmail.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
index d737a6a2600b..286bc674a6e7 100644
--- a/include/net/sch_generic.h
+++ b/include/net/sch_generic.h
@@ -216,6 +216,8 @@ struct Qdisc_ops {
 					  struct netlink_ext_ack *extack);
 	void			(*attach)(struct Qdisc *sch);
 	int			(*change_tx_queue_len)(struct Qdisc *, unsigned int);
+	void			(*change_real_num_tx)(struct Qdisc *sch,
+						      unsigned int new_real_tx);
 
 	int			(*dump)(struct Qdisc *, struct sk_buff *);
 	int			(*dump_stats)(struct Qdisc *, struct gnet_dump *);
@@ -547,6 +549,8 @@ void qdisc_class_hash_grow(struct Qdisc *, struct Qdisc_class_hash *);
 void qdisc_class_hash_destroy(struct Qdisc_class_hash *);
 
 int dev_qdisc_change_tx_queue_len(struct net_device *dev);
+void dev_qdisc_change_real_num_tx(struct net_device *dev,
+				  unsigned int new_real_tx);
 void dev_init_scheduler(struct net_device *dev);
 void dev_shutdown(struct net_device *dev);
 void dev_activate(struct net_device *dev);
diff --git a/net/core/dev.c b/net/core/dev.c
index 397bc2f50de0..2519a90a1482 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -2648,6 +2648,8 @@ int netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq)
 		if (dev->num_tc)
 			netif_setup_tc(dev, txq);
 
+		dev_qdisc_change_real_num_tx(dev, txq);
+
 		dev->real_num_tx_queues = txq;
 
 		if (disabling) {
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
index 4e15913e7519..2128b77d5cb3 100644
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
@@ -1256,6 +1256,15 @@ static int qdisc_change_tx_queue_len(struct net_device *dev,
 	return 0;
 }
 
+void dev_qdisc_change_real_num_tx(struct net_device *dev,
+				  unsigned int new_real_tx)
+{
+	struct Qdisc *qdisc = dev->qdisc;
+
+	if (qdisc->ops->change_real_num_tx)
+		qdisc->ops->change_real_num_tx(qdisc, new_real_tx);
+}
+
 int dev_qdisc_change_tx_queue_len(struct net_device *dev)
 {
 	bool up = dev->flags & IFF_UP;
diff --git a/net/sched/sch_mq.c b/net/sched/sch_mq.c
index c008a316e943..699b6bb444ce 100644
--- a/net/sched/sch_mq.c
+++ b/net/sched/sch_mq.c
@@ -130,6 +130,29 @@ static void mq_attach(struct Qdisc *sch)
 	priv->qdiscs = NULL;
 }
 
+static void mq_change_real_num_tx(struct Qdisc *sch, unsigned int new_real_tx)
+{
+#ifdef CONFIG_NET_SCHED
+	struct net_device *dev = qdisc_dev(sch);
+	struct Qdisc *qdisc;
+	unsigned int i;
+
+	for (i = new_real_tx; i < dev->real_num_tx_queues; i++) {
+		qdisc = netdev_get_tx_queue(dev, i)->qdisc_sleeping;
+		/* Only update the default qdiscs we created,
+		 * qdiscs with handles are always hashed.
+		 */
+		if (qdisc != &noop_qdisc && !qdisc->handle)
+			qdisc_hash_del(qdisc);
+	}
+	for (i = dev->real_num_tx_queues; i < new_real_tx; i++) {
+		qdisc = netdev_get_tx_queue(dev, i)->qdisc_sleeping;
+		if (qdisc != &noop_qdisc && !qdisc->handle)
+			qdisc_hash_add(qdisc, false);
+	}
+#endif
+}
+
 static int mq_dump(struct Qdisc *sch, struct sk_buff *skb)
 {
 	struct net_device *dev = qdisc_dev(sch);
@@ -285,6 +308,7 @@ struct Qdisc_ops mq_qdisc_ops __read_mostly = {
 	.init		= mq_init,
 	.destroy	= mq_destroy,
 	.attach		= mq_attach,
+	.change_real_num_tx = mq_change_real_num_tx,
 	.dump		= mq_dump,
 	.owner		= THIS_MODULE,
 };
diff --git a/net/sched/sch_mqprio.c b/net/sched/sch_mqprio.c
index fcfe41a95473..3fd0e5dd7ae3 100644
--- a/net/sched/sch_mqprio.c
+++ b/net/sched/sch_mqprio.c
@@ -308,6 +308,28 @@ static void mqprio_attach(struct Qdisc *sch)
 	priv->qdiscs = NULL;
 }
 
+static void mqprio_change_real_num_tx(struct Qdisc *sch,
+				      unsigned int new_real_tx)
+{
+	struct net_device *dev = qdisc_dev(sch);
+	struct Qdisc *qdisc;
+	unsigned int i;
+
+	for (i = new_real_tx; i < dev->real_num_tx_queues; i++) {
+		qdisc = netdev_get_tx_queue(dev, i)->qdisc_sleeping;
+		/* Only update the default qdiscs we created,
+		 * qdiscs with handles are always hashed.
+		 */
+		if (qdisc != &noop_qdisc && !qdisc->handle)
+			qdisc_hash_del(qdisc);
+	}
+	for (i = dev->real_num_tx_queues; i < new_real_tx; i++) {
+		qdisc = netdev_get_tx_queue(dev, i)->qdisc_sleeping;
+		if (qdisc != &noop_qdisc && !qdisc->handle)
+			qdisc_hash_add(qdisc, false);
+	}
+}
+
 static struct netdev_queue *mqprio_queue_get(struct Qdisc *sch,
 					     unsigned long cl)
 {
@@ -632,6 +654,7 @@ static struct Qdisc_ops mqprio_qdisc_ops __read_mostly = {
 	.init		= mqprio_init,
 	.destroy	= mqprio_destroy,
 	.attach		= mqprio_attach,
+	.change_real_num_tx = mqprio_change_real_num_tx,
 	.dump		= mqprio_dump,
 	.owner		= THIS_MODULE,
 };

commit b92ad7afb83545076c60a21efcf3c6b3e463b790
Author: Peter Zijlstra <peterz@infradead.org>
Date:   Thu Jun 24 11:41:10 2021 +0200

    locking/lockdep: Avoid RCU-induced noinstr fail
    
    [ Upstream commit ce0b9c805dd66d5e49fd53ec5415ae398f4c56e6 ]
    
    vmlinux.o: warning: objtool: look_up_lock_class()+0xc7: call to rcu_read_lock_any_held() leaves .noinstr.text section
    
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lore.kernel.org/r/20210624095148.311980536@infradead.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
index 126c6d524a0f..4dc79f57af82 100644
--- a/kernel/locking/lockdep.c
+++ b/kernel/locking/lockdep.c
@@ -689,7 +689,7 @@ look_up_lock_class(const struct lockdep_map *lock, unsigned int subclass)
 	if (DEBUG_LOCKS_WARN_ON(!irqs_disabled()))
 		return NULL;
 
-	hlist_for_each_entry_rcu(class, hash_head, hash_entry) {
+	hlist_for_each_entry_rcu_notrace(class, hash_head, hash_entry) {
 		if (class->key == key) {
 			/*
 			 * Huh! same key, different name? Did someone trample

commit 1874eb640a68c2d1d62a7369f457ef6bd9f2dbd1
Author: Aleksander Jan Bajkowski <olek2@wp.pl>
Date:   Tue Sep 14 23:20:59 2021 +0200

    MIPS: lantiq: dma: reset correct number of channel
    
    [ Upstream commit 5ca9ce2ba4d5884cd94d1a856c675ab1242cd242 ]
    
    Different SoCs have a different number of channels, e.g .:
    * amazon-se has 10 channels,
    * danube+ar9 have 20 channels,
    * vr9 has 28 channels,
    * ar10 has 24 channels.
    
    We can read the ID register and, depending on the reported
    number of channels, reset the appropriate number of channels.
    
    Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/lantiq/xway/dma.c b/arch/mips/lantiq/xway/dma.c
index 45a622b72cd1..efee1c538a51 100644
--- a/arch/mips/lantiq/xway/dma.c
+++ b/arch/mips/lantiq/xway/dma.c
@@ -41,6 +41,7 @@
 #define LTQ_DMA_PCTRL		0x44
 #define LTQ_DMA_IRNEN		0xf4
 
+#define DMA_ID_CHNR		GENMASK(26, 20)	/* channel number */
 #define DMA_DESCPT		BIT(3)		/* descriptor complete irq */
 #define DMA_TX			BIT(8)		/* TX channel direction */
 #define DMA_CHAN_ON		BIT(0)		/* channel on / off bit */
@@ -51,7 +52,6 @@
 #define DMA_POLL		BIT(31)		/* turn on channel polling */
 #define DMA_CLK_DIV4		BIT(6)		/* polling clock divider */
 #define DMA_2W_BURST		BIT(1)		/* 2 word burst length */
-#define DMA_MAX_CHANNEL		20		/* the soc has 20 channels */
 #define DMA_ETOP_ENDIANNESS	(0xf << 8) /* endianness swap etop channels */
 #define DMA_WEIGHT	(BIT(17) | BIT(16))	/* default channel wheight */
 
@@ -218,7 +218,7 @@ ltq_dma_init(struct platform_device *pdev)
 {
 	struct clk *clk;
 	struct resource *res;
-	unsigned id;
+	unsigned int id, nchannels;
 	int i;
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -240,17 +240,18 @@ ltq_dma_init(struct platform_device *pdev)
 	ltq_dma_w32(0, LTQ_DMA_IRNEN);
 
 	/* reset/configure each channel */
-	for (i = 0; i < DMA_MAX_CHANNEL; i++) {
+	id = ltq_dma_r32(LTQ_DMA_ID);
+	nchannels = ((id & DMA_ID_CHNR) >> 20);
+	for (i = 0; i < nchannels; i++) {
 		ltq_dma_w32(i, LTQ_DMA_CS);
 		ltq_dma_w32(DMA_CHAN_RST, LTQ_DMA_CCTRL);
 		ltq_dma_w32(DMA_POLL | DMA_CLK_DIV4, LTQ_DMA_CPOLL);
 		ltq_dma_w32_mask(DMA_CHAN_ON, 0, LTQ_DMA_CCTRL);
 	}
 
-	id = ltq_dma_r32(LTQ_DMA_ID);
 	dev_info(&pdev->dev,
 		"Init done - hw rev: %X, ports: %d, channels: %d\n",
-		id & 0x1f, (id >> 16) & 0xf, id >> 20);
+		id & 0x1f, (id >> 16) & 0xf, nchannels);
 
 	return 0;
 }

commit 9b872fdecc2d0ae42638062e68e406e3b25090a6
Author: Aleksander Jan Bajkowski <olek2@wp.pl>
Date:   Tue Sep 14 23:20:58 2021 +0200

    MIPS: lantiq: dma: add small delay after reset
    
    [ Upstream commit c12aa581f6d5e80c3c3675ab26a52c2b3b62f76e ]
    
    Reading the DMA registers immediately after the reset causes
    Data Bus Error. Adding a small delay fixes this issue.
    
    Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/lantiq/xway/dma.c b/arch/mips/lantiq/xway/dma.c
index 664f2f7f55c1..45a622b72cd1 100644
--- a/arch/mips/lantiq/xway/dma.c
+++ b/arch/mips/lantiq/xway/dma.c
@@ -22,6 +22,7 @@
 #include <linux/export.h>
 #include <linux/spinlock.h>
 #include <linux/clk.h>
+#include <linux/delay.h>
 #include <linux/err.h>
 
 #include <lantiq_soc.h>
@@ -233,6 +234,8 @@ ltq_dma_init(struct platform_device *pdev)
 	clk_enable(clk);
 	ltq_dma_w32_mask(0, DMA_RESET, LTQ_DMA_CTRL);
 
+	usleep_range(1, 10);
+
 	/* disable all interrupts */
 	ltq_dma_w32(0, LTQ_DMA_IRNEN);
 

commit ac414eb5670e343c8792911d1cb0f9559d8aa924
Author: Barnabás P?cze <pobrn@protonmail.com>
Date:   Sat Sep 4 17:56:26 2021 +0000

    platform/x86: wmi: do not fail if disabling fails
    
    [ Upstream commit 1975718c488a39128f1f515b23ae61a5a214cc3d ]
    
    Previously, `__query_block()` would fail if the
    second WCxx method call failed. However, the
    WQxx method might have succeeded, and potentially
    allocated memory for the result. Instead of
    throwing away the result and potentially
    leaking memory, ignore the result of
    the second WCxx call.
    
    Signed-off-by: Barnabás P?cze <pobrn@protonmail.com>
    Link: https://lore.kernel.org/r/20210904175450.156801-25-pobrn@protonmail.com
    Reviewed-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c
index 35cdc3998eb5..387358af685c 100644
--- a/drivers/platform/x86/wmi.c
+++ b/drivers/platform/x86/wmi.c
@@ -350,7 +350,14 @@ static acpi_status __query_block(struct wmi_block *wblock, u8 instance,
 	 * the WQxx method failed - we should disable collection anyway.
 	 */
 	if ((block->flags & ACPI_WMI_EXPENSIVE) && ACPI_SUCCESS(wc_status)) {
-		status = acpi_execute_simple_method(handle, wc_method, 0);
+		/*
+		 * Ignore whether this WCxx call succeeds or not since
+		 * the previously executed WQxx method call might have
+		 * succeeded, and returning the failing status code
+		 * of this call would throw away the result of the WQxx
+		 * call, potentially leaking memory.
+		 */
+		acpi_execute_simple_method(handle, wc_method, 0);
 	}
 
 	return status;

commit 72bb30165337b7bce77578ad151fbfab6c8e693c
Author: Wang ShaoBo <bobo.shaobowang@huawei.com>
Date:   Tue Aug 31 17:35:37 2021 -0700

    Bluetooth: fix use-after-free error in lock_sock_nested()
    
    [ Upstream commit 1bff51ea59a9afb67d2dd78518ab0582a54a472c ]
    
    use-after-free error in lock_sock_nested is reported:
    
    [  179.140137][ T3731] =====================================================
    [  179.142675][ T3731] BUG: KMSAN: use-after-free in lock_sock_nested+0x280/0x2c0
    [  179.145494][ T3731] CPU: 4 PID: 3731 Comm: kworker/4:2 Not tainted 5.12.0-rc6+ #54
    [  179.148432][ T3731] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014
    [  179.151806][ T3731] Workqueue: events l2cap_chan_timeout
    [  179.152730][ T3731] Call Trace:
    [  179.153301][ T3731]  dump_stack+0x24c/0x2e0
    [  179.154063][ T3731]  kmsan_report+0xfb/0x1e0
    [  179.154855][ T3731]  __msan_warning+0x5c/0xa0
    [  179.155579][ T3731]  lock_sock_nested+0x280/0x2c0
    [  179.156436][ T3731]  ? kmsan_get_metadata+0x116/0x180
    [  179.157257][ T3731]  l2cap_sock_teardown_cb+0xb8/0x890
    [  179.158154][ T3731]  ? __msan_metadata_ptr_for_load_8+0x10/0x20
    [  179.159141][ T3731]  ? kmsan_get_metadata+0x116/0x180
    [  179.159994][ T3731]  ? kmsan_get_shadow_origin_ptr+0x84/0xb0
    [  179.160959][ T3731]  ? l2cap_sock_recv_cb+0x420/0x420
    [  179.161834][ T3731]  l2cap_chan_del+0x3e1/0x1d50
    [  179.162608][ T3731]  ? kmsan_get_metadata+0x116/0x180
    [  179.163435][ T3731]  ? kmsan_get_shadow_origin_ptr+0x84/0xb0
    [  179.164406][ T3731]  l2cap_chan_close+0xeea/0x1050
    [  179.165189][ T3731]  ? kmsan_internal_unpoison_shadow+0x42/0x70
    [  179.166180][ T3731]  l2cap_chan_timeout+0x1da/0x590
    [  179.167066][ T3731]  ? __msan_metadata_ptr_for_load_8+0x10/0x20
    [  179.168023][ T3731]  ? l2cap_chan_create+0x560/0x560
    [  179.168818][ T3731]  process_one_work+0x121d/0x1ff0
    [  179.169598][ T3731]  worker_thread+0x121b/0x2370
    [  179.170346][ T3731]  kthread+0x4ef/0x610
    [  179.171010][ T3731]  ? process_one_work+0x1ff0/0x1ff0
    [  179.171828][ T3731]  ? kthread_blkcg+0x110/0x110
    [  179.172587][ T3731]  ret_from_fork+0x1f/0x30
    [  179.173348][ T3731]
    [  179.173752][ T3731] Uninit was created at:
    [  179.174409][ T3731]  kmsan_internal_poison_shadow+0x5c/0xf0
    [  179.175373][ T3731]  kmsan_slab_free+0x76/0xc0
    [  179.176060][ T3731]  kfree+0x3a5/0x1180
    [  179.176664][ T3731]  __sk_destruct+0x8af/0xb80
    [  179.177375][ T3731]  __sk_free+0x812/0x8c0
    [  179.178032][ T3731]  sk_free+0x97/0x130
    [  179.178686][ T3731]  l2cap_sock_release+0x3d5/0x4d0
    [  179.179457][ T3731]  sock_close+0x150/0x450
    [  179.180117][ T3731]  __fput+0x6bd/0xf00
    [  179.180787][ T3731]  ____fput+0x37/0x40
    [  179.181481][ T3731]  task_work_run+0x140/0x280
    [  179.182219][ T3731]  do_exit+0xe51/0x3e60
    [  179.182930][ T3731]  do_group_exit+0x20e/0x450
    [  179.183656][ T3731]  get_signal+0x2dfb/0x38f0
    [  179.184344][ T3731]  arch_do_signal_or_restart+0xaa/0xe10
    [  179.185266][ T3731]  exit_to_user_mode_prepare+0x2d2/0x560
    [  179.186136][ T3731]  syscall_exit_to_user_mode+0x35/0x60
    [  179.186984][ T3731]  do_syscall_64+0xc5/0x140
    [  179.187681][ T3731]  entry_SYSCALL_64_after_hwframe+0x44/0xae
    [  179.188604][ T3731] =====================================================
    
    In our case, there are two Thread A and B:
    
    Context: Thread A:              Context: Thread B:
    
    l2cap_chan_timeout()            __se_sys_shutdown()
      l2cap_chan_close()              l2cap_sock_shutdown()
        l2cap_chan_del()                l2cap_chan_close()
          l2cap_sock_teardown_cb()        l2cap_sock_teardown_cb()
    
    Once l2cap_sock_teardown_cb() excuted, this sock will be marked as SOCK_ZAPPED,
    and can be treated as killable in l2cap_sock_kill() if sock_orphan() has
    excuted, at this time we close sock through sock_close() which end to call
    l2cap_sock_kill() like Thread C:
    
    Context: Thread C:
    
    sock_close()
      l2cap_sock_release()
        sock_orphan()
        l2cap_sock_kill()  #free sock if refcnt is 1
    
    If C completed, Once A or B reaches l2cap_sock_teardown_cb() again,
    use-after-free happened.
    
    We should set chan->data to NULL if sock is destructed, for telling teardown
    operation is not allowed in l2cap_sock_teardown_cb(), and also we should
    avoid killing an already killed socket in l2cap_sock_close_cb().
    
    Signed-off-by: Wang ShaoBo <bobo.shaobowang@huawei.com>
    Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
index 967a9bb14415..d938311c58a8 100644
--- a/net/bluetooth/l2cap_sock.c
+++ b/net/bluetooth/l2cap_sock.c
@@ -1328,6 +1328,9 @@ static void l2cap_sock_close_cb(struct l2cap_chan *chan)
 {
 	struct sock *sk = chan->data;
 
+	if (!sk)
+		return;
+
 	l2cap_sock_kill(sk);
 }
 
@@ -1336,6 +1339,9 @@ static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err)
 	struct sock *sk = chan->data;
 	struct sock *parent;
 
+	if (!sk)
+		return;
+
 	BT_DBG("chan %p state %s", chan, state_to_string(chan->state));
 
 	/* This callback can be called both for server (BT_LISTEN)
@@ -1519,8 +1525,10 @@ static void l2cap_sock_destruct(struct sock *sk)
 {
 	BT_DBG("sk %p", sk);
 
-	if (l2cap_pi(sk)->chan)
+	if (l2cap_pi(sk)->chan) {
+		l2cap_pi(sk)->chan->data = NULL;
 		l2cap_chan_put(l2cap_pi(sk)->chan);
+	}
 
 	if (l2cap_pi(sk)->rx_busy_skb) {
 		kfree_skb(l2cap_pi(sk)->rx_busy_skb);

commit c1c913f797f3d2441310182ad75b7bd855a327ff
Author: Takashi Iwai <tiwai@suse.de>
Date:   Sat Aug 28 18:18:18 2021 +0200

    Bluetooth: sco: Fix lock_sock() blockage by memcpy_from_msg()
    
    [ Upstream commit 99c23da0eed4fd20cae8243f2b51e10e66aa0951 ]
    
    The sco_send_frame() also takes lock_sock() during memcpy_from_msg()
    call that may be endlessly blocked by a task with userfaultd
    technique, and this will result in a hung task watchdog trigger.
    
    Just like the similar fix for hci_sock_sendmsg() in commit
    92c685dc5de0 ("Bluetooth: reorganize functions..."), this patch moves
    the  memcpy_from_msg() out of lock_sock() for addressing the hang.
    
    This should be the last piece for fixing CVE-2021-3640 after a few
    already queued fixes.
    
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
index 007a01b08dbe..d052b454dc4e 100644
--- a/net/bluetooth/sco.c
+++ b/net/bluetooth/sco.c
@@ -280,7 +280,8 @@ static int sco_connect(struct hci_dev *hdev, struct sock *sk)
 	return err;
 }
 
-static int sco_send_frame(struct sock *sk, struct msghdr *msg, int len)
+static int sco_send_frame(struct sock *sk, void *buf, int len,
+			  unsigned int msg_flags)
 {
 	struct sco_conn *conn = sco_pi(sk)->conn;
 	struct sk_buff *skb;
@@ -292,15 +293,11 @@ static int sco_send_frame(struct sock *sk, struct msghdr *msg, int len)
 
 	BT_DBG("sk %p len %d", sk, len);
 
-	skb = bt_skb_send_alloc(sk, len, msg->msg_flags & MSG_DONTWAIT, &err);
+	skb = bt_skb_send_alloc(sk, len, msg_flags & MSG_DONTWAIT, &err);
 	if (!skb)
 		return err;
 
-	if (memcpy_from_msg(skb_put(skb, len), msg, len)) {
-		kfree_skb(skb);
-		return -EFAULT;
-	}
-
+	memcpy(skb_put(skb, len), buf, len);
 	hci_send_sco(conn->hcon, skb);
 
 	return len;
@@ -714,6 +711,7 @@ static int sco_sock_sendmsg(struct socket *sock, struct msghdr *msg,
 			    size_t len)
 {
 	struct sock *sk = sock->sk;
+	void *buf;
 	int err;
 
 	BT_DBG("sock %p, sk %p", sock, sk);
@@ -725,14 +723,24 @@ static int sco_sock_sendmsg(struct socket *sock, struct msghdr *msg,
 	if (msg->msg_flags & MSG_OOB)
 		return -EOPNOTSUPP;
 
+	buf = kmalloc(len, GFP_KERNEL);
+	if (!buf)
+		return -ENOMEM;
+
+	if (memcpy_from_msg(buf, msg, len)) {
+		kfree(buf);
+		return -EFAULT;
+	}
+
 	lock_sock(sk);
 
 	if (sk->sk_state == BT_CONNECTED)
-		err = sco_send_frame(sk, msg, len);
+		err = sco_send_frame(sk, buf, len, msg->msg_flags);
 	else
 		err = -ENOTCONN;
 
 	release_sock(sk);
+	kfree(buf);
 	return err;
 }
 

commit 7d2eea140d33d7611118ad6f67fe0782daee8a3d
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Sun May 30 13:04:26 2021 +0200

    drm: panel-orientation-quirks: Add quirk for KD Kurio Smart C15200 2-in-1
    
    [ Upstream commit a53f1dd3ab9fec715c6c2e8e01bf4d3c07eef8e5 ]
    
    The KD Kurio Smart C15200 2-in-1 uses  a panel which has been mounted 90
    degrees rotated. Add a quirk for this.
    
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Acked-by: Simon Ser <contact@emersion.fr>
    Link: https://patchwork.freedesktop.org/patch/msgid/20210530110428.12994-3-hdegoede@redhat.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/drm_panel_orientation_quirks.c b/drivers/gpu/drm/drm_panel_orientation_quirks.c
index 48be8590ebe8..3b70a338e5b4 100644
--- a/drivers/gpu/drm/drm_panel_orientation_quirks.c
+++ b/drivers/gpu/drm/drm_panel_orientation_quirks.c
@@ -170,6 +170,13 @@ static const struct dmi_system_id orientation_data[] = {
 		  DMI_EXACT_MATCH(DMI_BOARD_NAME, "TW891"),
 		},
 		.driver_data = (void *)&itworks_tw891,
+	}, {	/* KD Kurio Smart C15200 2-in-1 */
+		.matches = {
+		  DMI_EXACT_MATCH(DMI_SYS_VENDOR, "KD Interactive"),
+		  DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Kurio Smart"),
+		  DMI_EXACT_MATCH(DMI_BOARD_NAME, "KDM960BCP"),
+		},
+		.driver_data = (void *)&lcd800x1280_rightside_up,
 	}, {	/*
 		 * Lenovo Ideapad Miix 310 laptop, only some production batches
 		 * have a portrait screen, the resolution checks makes the quirk

commit 73f9415a1a2962571b1d6ccba404f5ab0a0cb01d
Author: Johan Hovold <johan@kernel.org>
Date:   Mon Oct 25 13:51:59 2021 +0200

    USB: iowarrior: fix control-message timeouts
    
    commit 79a4479a17b83310deb0b1a2a274fe5be12d2318 upstream.
    
    USB control-message timeouts are specified in milliseconds and should
    specifically not vary with CONFIG_HZ.
    
    Use the common control-message timeout define for the five-second
    timeout and drop the driver-specific one.
    
    Fixes: 946b960d13c1 ("USB: add driver for iowarrior devices.")
    Cc: stable@vger.kernel.org      # 2.6.21
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20211025115159.4954-3-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c
index 9c1ca20d4139..07d6bc63be96 100644
--- a/drivers/usb/misc/iowarrior.c
+++ b/drivers/usb/misc/iowarrior.c
@@ -103,10 +103,6 @@ struct iowarrior {
 /*    globals   */
 /*--------------*/
 
-/*
- *  USB spec identifies 5 second timeouts.
- */
-#define GET_TIMEOUT 5
 #define USB_REQ_GET_REPORT  0x01
 //#if 0
 static int usb_get_report(struct usb_device *dev,
@@ -118,7 +114,7 @@ static int usb_get_report(struct usb_device *dev,
 			       USB_DIR_IN | USB_TYPE_CLASS |
 			       USB_RECIP_INTERFACE, (type << 8) + id,
 			       inter->desc.bInterfaceNumber, buf, size,
-			       GET_TIMEOUT*HZ);
+			       USB_CTRL_GET_TIMEOUT);
 }
 //#endif
 
@@ -133,7 +129,7 @@ static int usb_set_report(struct usb_interface *intf, unsigned char type,
 			       USB_TYPE_CLASS | USB_RECIP_INTERFACE,
 			       (type << 8) + id,
 			       intf->cur_altsetting->desc.bInterfaceNumber, buf,
-			       size, HZ);
+			       size, 1000);
 }
 
 /*---------------------*/

commit 69d388236b5b255829bf90f51631aa4a81cff574
Author: Wang Hai <wanghai38@huawei.com>
Date:   Fri Oct 15 16:55:43 2021 +0800

    USB: serial: keyspan: fix memleak on probe errors
    
    commit 910c996335c37552ee30fcb837375b808bb4f33b upstream.
    
    I got memory leak as follows when doing fault injection test:
    
    unreferenced object 0xffff888258228440 (size 64):
      comm "kworker/7:2", pid 2005, jiffies 4294989509 (age 824.540s)
      hex dump (first 32 bytes):
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<ffffffff8167939c>] slab_post_alloc_hook+0x9c/0x490
        [<ffffffff8167f627>] kmem_cache_alloc_trace+0x1f7/0x470
        [<ffffffffa02ac0e4>] keyspan_port_probe+0xa4/0x5d0 [keyspan]
        [<ffffffffa0294c07>] usb_serial_device_probe+0x97/0x1d0 [usbserial]
        [<ffffffff82b50ca7>] really_probe+0x167/0x460
        [<ffffffff82b51099>] __driver_probe_device+0xf9/0x180
        [<ffffffff82b51173>] driver_probe_device+0x53/0x130
        [<ffffffff82b516f5>] __device_attach_driver+0x105/0x130
        [<ffffffff82b4cfe9>] bus_for_each_drv+0x129/0x190
        [<ffffffff82b50a69>] __device_attach+0x1c9/0x270
        [<ffffffff82b518d0>] device_initial_probe+0x20/0x30
        [<ffffffff82b4f062>] bus_probe_device+0x142/0x160
        [<ffffffff82b4a4e9>] device_add+0x829/0x1300
        [<ffffffffa0295fda>] usb_serial_probe.cold+0xc9b/0x14ac [usbserial]
        [<ffffffffa02266aa>] usb_probe_interface+0x1aa/0x3c0 [usbcore]
        [<ffffffff82b50ca7>] really_probe+0x167/0x460
    
    If keyspan_port_probe() fails to allocate memory for an out_buffer[i] or
    in_buffer[i], the previously allocated memory for out_buffer or
    in_buffer needs to be freed on the error handling path, otherwise a
    memory leak will result.
    
    Fixes: bad41a5bf177 ("USB: keyspan: fix port DMA-buffer allocations")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Wang Hai <wanghai38@huawei.com>
    Link: https://lore.kernel.org/r/20211015085543.1203011-1-wanghai38@huawei.com
    Cc: stable@vger.kernel.org      # 3.12
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c
index aa3dbce22cfb..451759f38b57 100644
--- a/drivers/usb/serial/keyspan.c
+++ b/drivers/usb/serial/keyspan.c
@@ -2910,22 +2910,22 @@ static int keyspan_port_probe(struct usb_serial_port *port)
 	for (i = 0; i < ARRAY_SIZE(p_priv->in_buffer); ++i) {
 		p_priv->in_buffer[i] = kzalloc(IN_BUFLEN, GFP_KERNEL);
 		if (!p_priv->in_buffer[i])
-			goto err_in_buffer;
+			goto err_free_in_buffer;
 	}
 
 	for (i = 0; i < ARRAY_SIZE(p_priv->out_buffer); ++i) {
 		p_priv->out_buffer[i] = kzalloc(OUT_BUFLEN, GFP_KERNEL);
 		if (!p_priv->out_buffer[i])
-			goto err_out_buffer;
+			goto err_free_out_buffer;
 	}
 
 	p_priv->inack_buffer = kzalloc(INACK_BUFLEN, GFP_KERNEL);
 	if (!p_priv->inack_buffer)
-		goto err_inack_buffer;
+		goto err_free_out_buffer;
 
 	p_priv->outcont_buffer = kzalloc(OUTCONT_BUFLEN, GFP_KERNEL);
 	if (!p_priv->outcont_buffer)
-		goto err_outcont_buffer;
+		goto err_free_inack_buffer;
 
 	p_priv->device_details = d_details;
 
@@ -2971,15 +2971,14 @@ static int keyspan_port_probe(struct usb_serial_port *port)
 
 	return 0;
 
-err_outcont_buffer:
+err_free_inack_buffer:
 	kfree(p_priv->inack_buffer);
-err_inack_buffer:
+err_free_out_buffer:
 	for (i = 0; i < ARRAY_SIZE(p_priv->out_buffer); ++i)
 		kfree(p_priv->out_buffer[i]);
-err_out_buffer:
+err_free_in_buffer:
 	for (i = 0; i < ARRAY_SIZE(p_priv->in_buffer); ++i)
 		kfree(p_priv->in_buffer[i]);
-err_in_buffer:
 	kfree(p_priv);
 
 	return -ENOMEM;

commit b8366d877fb9ecca90ac07774c6cc56438a0fa30
Author: Pekka Korpinen <pekka.korpinen@iki.fi>
Date:   Wed Sep 29 21:57:55 2021 +0300

    iio: dac: ad5446: Fix ad5622_write() return value
    
    commit 558df982d4ead9cac628153d0d7b60feae05ddc8 upstream.
    
    On success i2c_master_send() returns the number of bytes written. The
    call from iio_write_channel_info(), however, expects the return value to
    be zero on success.
    
    This bug causes incorrect consumption of the sysfs buffer in
    iio_write_channel_info(). When writing more than two characters to
    out_voltage0_raw, the ad5446 write handler is called multiple times
    causing unexpected behavior.
    
    Fixes: 3ec36a2cf0d5 ("iio:ad5446: Add support for I2C based DACs")
    Signed-off-by: Pekka Korpinen <pekka.korpinen@iki.fi>
    Link: https://lore.kernel.org/r/20210929185755.2384-1-pekka.korpinen@iki.fi
    Cc: <Stable@vger.kernel.org>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iio/dac/ad5446.c b/drivers/iio/dac/ad5446.c
index d3ce5def4f65..f540c0f11c13 100644
--- a/drivers/iio/dac/ad5446.c
+++ b/drivers/iio/dac/ad5446.c
@@ -528,8 +528,15 @@ static int ad5622_write(struct ad5446_state *st, unsigned val)
 {
 	struct i2c_client *client = to_i2c_client(st->dev);
 	__be16 data = cpu_to_be16(val);
+	int ret;
+
+	ret = i2c_master_send(client, (char *)&data, sizeof(data));
+	if (ret < 0)
+		return ret;
+	if (ret != sizeof(data))
+		return -EIO;
 
-	return i2c_master_send(client, (char *)&data, sizeof(data));
+	return 0;
 }
 
 /**

commit d8c2aa207554b0caacf030b37da545ced5dd350d
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Fri Oct 22 09:43:23 2021 +0800

    pinctrl: core: fix possible memory leak in pinctrl_enable()
    
    commit c7892ae13e461ed20154321eb792e07ebe38f5b3 upstream.
    
    I got memory leak as follows when doing fault injection test:
    
    unreferenced object 0xffff888020a7a680 (size 64):
      comm "i2c-mcp23018-41", pid 23090, jiffies 4295160544 (age 8.680s)
      hex dump (first 32 bytes):
        00 48 d3 1e 80 88 ff ff 00 1a 56 c1 ff ff ff ff  .H........V.....
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<0000000083c79b35>] kmem_cache_alloc_trace+0x16d/0x360
        [<0000000051803c95>] pinctrl_init_controller+0x6ed/0xb70
        [<0000000064346707>] pinctrl_register+0x27/0x80
        [<0000000029b0e186>] devm_pinctrl_register+0x5b/0xe0
        [<00000000391f5a3e>] mcp23s08_probe_one+0x968/0x118a [pinctrl_mcp23s08]
        [<000000006112c039>] mcp230xx_probe+0x266/0x560 [pinctrl_mcp23s08_i2c]
    
    If pinctrl_claim_hogs() fails, the 'pindesc' allocated in pinctrl_register_one_pin()
    need be freed.
    
    Cc: stable@vger.kernel.org
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Fixes: 950b0d91dc10 ("pinctrl: core: Fix regression caused by delayed work for hogs")
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Link: https://lore.kernel.org/r/20211022014323.1156924-1-yangyingliang@huawei.com
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c
index 76638dee65d9..a8148460f99f 100644
--- a/drivers/pinctrl/core.c
+++ b/drivers/pinctrl/core.c
@@ -2038,6 +2038,8 @@ int pinctrl_enable(struct pinctrl_dev *pctldev)
 	if (error) {
 		dev_err(pctldev->dev, "could not claim hogs: %i\n",
 			error);
+		pinctrl_free_pindescs(pctldev, pctldev->desc->pins,
+				      pctldev->desc->npins);
 		mutex_destroy(&pctldev->mutex);
 		kfree(pctldev);
 

commit 2c1a3b29580bd6fc31a0d70ab96ff542d8a5e207
Author: Zhang Yi <yi.zhang@huawei.com>
Date:   Fri Oct 8 17:38:21 2021 +0800

    quota: correct error number in free_dqentry()
    
    commit d0e36a62bd4c60c09acc40e06ba4831a4d0bc75b upstream.
    
    Fix the error path in free_dqentry(), pass out the error number if the
    block to free is not correct.
    
    Fixes: 1ccd14b9c271 ("quota: Split off quota tree handling into a separate file")
    Link: https://lore.kernel.org/r/20211008093821.1001186-3-yi.zhang@huawei.com
    Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
    Cc: stable@kernel.org
    Signed-off-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/quota/quota_tree.c b/fs/quota/quota_tree.c
index fe5fe9551910..833cd3e3758b 100644
--- a/fs/quota/quota_tree.c
+++ b/fs/quota/quota_tree.c
@@ -422,6 +422,7 @@ static int free_dqentry(struct qtree_mem_dqinfo *info, struct dquot *dquot,
 		quota_error(dquot->dq_sb, "Quota structure has offset to "
 			"other block (%u) than it should (%u)", blk,
 			(uint)(dquot->dq_off >> info->dqi_blocksize_bits));
+		ret = -EIO;
 		goto out_buf;
 	}
 	ret = read_blk(info, blk, buf);

commit e5222c87dc441dcc8a66e93cb3fd34dfff03d3ec
Author: Zhang Yi <yi.zhang@huawei.com>
Date:   Fri Oct 8 17:38:20 2021 +0800

    quota: check block number when reading the block in quota file
    
    commit 9bf3d20331295b1ecb81f4ed9ef358c51699a050 upstream.
    
    The block number in the quota tree on disk should be smaller than the
    v2_disk_dqinfo.dqi_blocks. If the quota file was corrupted, we may be
    allocating an 'allocated' block and that would lead to a loop in a tree,
    which will probably trigger oops later. This patch adds a check for the
    block number in the quota tree to prevent such potential issue.
    
    Link: https://lore.kernel.org/r/20211008093821.1001186-2-yi.zhang@huawei.com
    Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
    Cc: stable@kernel.org
    Signed-off-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/quota/quota_tree.c b/fs/quota/quota_tree.c
index 656f9ff63edd..fe5fe9551910 100644
--- a/fs/quota/quota_tree.c
+++ b/fs/quota/quota_tree.c
@@ -487,6 +487,13 @@ static int remove_tree(struct qtree_mem_dqinfo *info, struct dquot *dquot,
 		goto out_buf;
 	}
 	newblk = le32_to_cpu(ref[get_index(info, dquot->dq_id, depth)]);
+	if (newblk < QT_TREEOFF || newblk >= info->dqi_blocks) {
+		quota_error(dquot->dq_sb, "Getting block too big (%u >= %u)",
+			    newblk, info->dqi_blocks);
+		ret = -EUCLEAN;
+		goto out_buf;
+	}
+
 	if (depth == info->dqi_qtree_depth - 1) {
 		ret = free_dqentry(info, dquot, newblk);
 		newblk = 0;
@@ -586,6 +593,13 @@ static loff_t find_tree_dqentry(struct qtree_mem_dqinfo *info,
 	blk = le32_to_cpu(ref[get_index(info, dquot->dq_id, depth)]);
 	if (!blk)	/* No reference? */
 		goto out_buf;
+	if (blk < QT_TREEOFF || blk >= info->dqi_blocks) {
+		quota_error(dquot->dq_sb, "Getting block too big (%u >= %u)",
+			    blk, info->dqi_blocks);
+		ret = -EUCLEAN;
+		goto out_buf;
+	}
+
 	if (depth < info->dqi_qtree_depth - 1)
 		ret = find_tree_dqentry(info, dquot, blk, depth+1);
 	else

commit c49c974429c965586451d039d266290c2ac39996
Author: Marek Behún <kabel@kernel.org>
Date:   Thu Oct 28 20:56:55 2021 +0200

    PCI: aardvark: Read all 16-bits from PCIE_MSI_PAYLOAD_REG
    
    commit 95997723b6402cd6c53e0f9e7ac640ec64eaaff8 upstream.
    
    The PCIE_MSI_PAYLOAD_REG contains 16-bit MSI number, not only lower
    8 bits. Fix reading content of this register and add a comment
    describing the access to this register.
    
    Link: https://lore.kernel.org/r/20211028185659.20329-4-kabel@kernel.org
    Fixes: 8c39d710363c ("PCI: aardvark: Add Aardvark PCI host controller driver")
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index 1a0f4dcfb328..e5ac846e2a20 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -111,6 +111,7 @@
 #define PCIE_MSI_STATUS_REG			(CONTROL_BASE_ADDR + 0x58)
 #define PCIE_MSI_MASK_REG			(CONTROL_BASE_ADDR + 0x5C)
 #define PCIE_MSI_PAYLOAD_REG			(CONTROL_BASE_ADDR + 0x9C)
+#define     PCIE_MSI_DATA_MASK			GENMASK(15, 0)
 
 /* LMI registers base address and register offsets */
 #define LMI_BASE_ADDR				0x6000
@@ -805,8 +806,12 @@ static void advk_pcie_handle_msi(struct advk_pcie *pcie)
 		if (!(BIT(msi_idx) & msi_status))
 			continue;
 
+		/*
+		 * msi_idx contains bits [4:0] of the msi_data and msi_data
+		 * contains 16bit MSI interrupt number
+		 */
 		advk_writel(pcie, BIT(msi_idx), PCIE_MSI_STATUS_REG);
-		msi_data = advk_readl(pcie, PCIE_MSI_PAYLOAD_REG) & 0xFF;
+		msi_data = advk_readl(pcie, PCIE_MSI_PAYLOAD_REG) & PCIE_MSI_DATA_MASK;
 		generic_handle_irq(msi_data);
 	}
 

commit b06cbe5a28ae66dd719c59833bad8ec85a38a52b
Author: Marek Behún <kabel@kernel.org>
Date:   Thu Oct 28 20:56:54 2021 +0200

    PCI: aardvark: Fix return value of MSI domain .alloc() method
    
    commit e4313be1599d397625c14fb7826996813622decf upstream.
    
    MSI domain callback .alloc() (implemented by advk_msi_irq_domain_alloc()
    function) should return zero on success, since non-zero value indicates
    failure.
    
    When the driver was converted to generic MSI API in commit f21a8b1b6837
    ("PCI: aardvark: Move to MSI handling using generic MSI support"), it
    was converted so that it returns hwirq number.
    
    Fix this.
    
    Link: https://lore.kernel.org/r/20211028185659.20329-3-kabel@kernel.org
    Fixes: f21a8b1b6837 ("PCI: aardvark: Move to MSI handling using generic MSI support")
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index 34b5f28c748d..1a0f4dcfb328 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -627,7 +627,7 @@ static int advk_msi_irq_domain_alloc(struct irq_domain *domain,
 				    domain->host_data, handle_simple_irq,
 				    NULL, NULL);
 
-	return hwirq;
+	return 0;
 }
 
 static void advk_msi_irq_domain_free(struct irq_domain *domain,

commit 82b46cba9c6fccadbf10769ac0c4ce22e1c2cb04
Author: Pali Rohár <pali@kernel.org>
Date:   Tue Oct 5 20:09:46 2021 +0200

    PCI: aardvark: Do not unmask unused interrupts
    
    commit 1fb95d7d3c7a926b002fe8a6bd27a1cb428b46dc upstream.
    
    There are lot of undocumented interrupt bits. To prevent unwanted
    spurious interrupts, fix all *_ALL_MASK macros to define all interrupt
    bits, so that driver can properly mask all interrupts, including those
    which are undocumented.
    
    Link: https://lore.kernel.org/r/20211005180952.6812-8-kabel@kernel.org
    Fixes: 8c39d710363c ("PCI: aardvark: Add Aardvark PCI host controller driver")
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Reviewed-by: Marek Behún <kabel@kernel.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index 6bba534beaed..34b5f28c748d 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -99,13 +99,13 @@
 #define     PCIE_ISR0_MSI_INT_PENDING		BIT(24)
 #define     PCIE_ISR0_INTX_ASSERT(val)		BIT(16 + (val))
 #define     PCIE_ISR0_INTX_DEASSERT(val)	BIT(20 + (val))
-#define	    PCIE_ISR0_ALL_MASK			GENMASK(26, 0)
+#define     PCIE_ISR0_ALL_MASK			GENMASK(31, 0)
 #define PCIE_ISR1_REG				(CONTROL_BASE_ADDR + 0x48)
 #define PCIE_ISR1_MASK_REG			(CONTROL_BASE_ADDR + 0x4C)
 #define     PCIE_ISR1_POWER_STATE_CHANGE	BIT(4)
 #define     PCIE_ISR1_FLUSH			BIT(5)
 #define     PCIE_ISR1_INTX_ASSERT(val)		BIT(8 + (val))
-#define     PCIE_ISR1_ALL_MASK			GENMASK(11, 4)
+#define     PCIE_ISR1_ALL_MASK			GENMASK(31, 0)
 #define PCIE_MSI_ADDR_LOW_REG			(CONTROL_BASE_ADDR + 0x50)
 #define PCIE_MSI_ADDR_HIGH_REG			(CONTROL_BASE_ADDR + 0x54)
 #define PCIE_MSI_STATUS_REG			(CONTROL_BASE_ADDR + 0x58)
@@ -150,7 +150,7 @@
 #define     PCIE_IRQ_MSI_INT2_DET		BIT(21)
 #define     PCIE_IRQ_RC_DBELL_DET		BIT(22)
 #define     PCIE_IRQ_EP_STATUS			BIT(23)
-#define     PCIE_IRQ_ALL_MASK			0xfff0fb
+#define     PCIE_IRQ_ALL_MASK			GENMASK(31, 0)
 #define     PCIE_IRQ_ENABLE_INTS_MASK		PCIE_IRQ_CORE_INT
 
 /* Transaction types */

commit 8753b5a686c1ba6a7b18e2e2cb41ccddf2aecee7
Author: Pali Rohár <pali@kernel.org>
Date:   Tue Oct 5 20:09:45 2021 +0200

    PCI: aardvark: Do not clear status bits of masked interrupts
    
    commit a7ca6d7fa3c02c032db5440ff392d96c04684c21 upstream.
    
    The PCIE_ISR1_REG says which interrupts are currently set / active,
    including those which are masked.
    
    The driver currently reads this register and looks if some unmasked
    interrupts are active, and if not, it clears status bits of _all_
    interrupts, including the masked ones.
    
    This is incorrect, since, for example, some drivers may poll these bits.
    
    Remove this clearing, and also remove this early return statement
    completely, since it does not change functionality in any way.
    
    Link: https://lore.kernel.org/r/20211005180952.6812-7-kabel@kernel.org
    Fixes: 8c39d710363c ("PCI: aardvark: Add Aardvark PCI host controller driver")
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Reviewed-by: Marek Behún <kabel@kernel.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index 68afd4fa7ec9..6bba534beaed 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -828,12 +828,6 @@ static void advk_pcie_handle_int(struct advk_pcie *pcie)
 	isr1_mask = advk_readl(pcie, PCIE_ISR1_MASK_REG);
 	isr1_status = isr1_val & ((~isr1_mask) & PCIE_ISR1_ALL_MASK);
 
-	if (!isr0_status && !isr1_status) {
-		advk_writel(pcie, isr0_val, PCIE_ISR0_REG);
-		advk_writel(pcie, isr1_val, PCIE_ISR1_REG);
-		return;
-	}
-
 	/* Process MSI interrupts */
 	if (isr0_status & PCIE_ISR0_MSI_INT_PENDING)
 		advk_pcie_handle_msi(pcie);

commit f53f35a99e49445ea58ed30663d99dba4e0efa3d
Author: Juergen Gross <jgross@suse.com>
Date:   Tue Nov 2 10:19:44 2021 +0100

    xen/balloon: add late_initcall_sync() for initial ballooning done
    
    commit 40fdea0284bb20814399da0484a658a96c735d90 upstream.
    
    When running as PVH or HVM guest with actual memory < max memory the
    hypervisor is using "populate on demand" in order to allow the guest
    to balloon down from its maximum memory size. For this to work
    correctly the guest must not touch more memory pages than its target
    memory size as otherwise the PoD cache will be exhausted and the guest
    is crashed as a result of that.
    
    In extreme cases ballooning down might not be finished today before
    the init process is started, which can consume lots of memory.
    
    In order to avoid random boot crashes in such cases, add a late init
    call to wait for ballooning down having finished for PVH/HVM guests.
    
    Warn on console if initial ballooning fails, panic() after stalling
    for more than 3 minutes per default. Add a module parameter for
    changing this timeout.
    
    [boris: replaced pr_info() with pr_notice()]
    
    Cc: <stable@vger.kernel.org>
    Reported-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Link: https://lore.kernel.org/r/20211102091944.17487-1-jgross@suse.com
    Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 6795e9d187d0..f179e20eb8a0 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -5284,6 +5284,13 @@
 			with /sys/devices/system/xen_memory/xen_memory0/scrub_pages.
 			Default value controlled with CONFIG_XEN_SCRUB_PAGES_DEFAULT.
 
+	xen.balloon_boot_timeout= [XEN]
+			The time (in seconds) to wait before giving up to boot
+			in case initial ballooning fails to free enough memory.
+			Applies only when running as HVM or PVH guest and
+			started with less memory configured than allowed at
+			max. Default is 180.
+
 	xen.event_eoi_delay=	[XEN]
 			How long to delay EOI handling in case of event
 			storms (jiffies). Default is 10.
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
index 19906020eb14..4f4a47ae72b1 100644
--- a/drivers/xen/balloon.c
+++ b/drivers/xen/balloon.c
@@ -58,6 +58,7 @@
 #include <linux/percpu-defs.h>
 #include <linux/slab.h>
 #include <linux/sysctl.h>
+#include <linux/moduleparam.h>
 
 #include <asm/page.h>
 #include <asm/pgalloc.h>
@@ -75,6 +76,12 @@
 #include <xen/page.h>
 #include <xen/mem-reservation.h>
 
+#undef MODULE_PARAM_PREFIX
+#define MODULE_PARAM_PREFIX "xen."
+
+static uint __read_mostly balloon_boot_timeout = 180;
+module_param(balloon_boot_timeout, uint, 0444);
+
 static int xen_hotplug_unpopulated;
 
 #ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG
@@ -130,12 +137,12 @@ static struct ctl_table xen_root[] = {
  * BP_ECANCELED: error, balloon operation canceled.
  */
 
-enum bp_state {
+static enum bp_state {
 	BP_DONE,
 	BP_WAIT,
 	BP_EAGAIN,
 	BP_ECANCELED
-};
+} balloon_state = BP_DONE;
 
 /* Main waiting point for xen-balloon thread. */
 static DECLARE_WAIT_QUEUE_HEAD(balloon_thread_wq);
@@ -206,18 +213,15 @@ static struct page *balloon_next_page(struct page *page)
 	return list_entry(next, struct page, lru);
 }
 
-static enum bp_state update_schedule(enum bp_state state)
+static void update_schedule(void)
 {
-	if (state == BP_WAIT)
-		return BP_WAIT;
-
-	if (state == BP_ECANCELED)
-		return BP_ECANCELED;
+	if (balloon_state == BP_WAIT || balloon_state == BP_ECANCELED)
+		return;
 
-	if (state == BP_DONE) {
+	if (balloon_state == BP_DONE) {
 		balloon_stats.schedule_delay = 1;
 		balloon_stats.retry_count = 1;
-		return BP_DONE;
+		return;
 	}
 
 	++balloon_stats.retry_count;
@@ -226,7 +230,8 @@ static enum bp_state update_schedule(enum bp_state state)
 			balloon_stats.retry_count > balloon_stats.max_retry_count) {
 		balloon_stats.schedule_delay = 1;
 		balloon_stats.retry_count = 1;
-		return BP_ECANCELED;
+		balloon_state = BP_ECANCELED;
+		return;
 	}
 
 	balloon_stats.schedule_delay <<= 1;
@@ -234,7 +239,7 @@ static enum bp_state update_schedule(enum bp_state state)
 	if (balloon_stats.schedule_delay > balloon_stats.max_schedule_delay)
 		balloon_stats.schedule_delay = balloon_stats.max_schedule_delay;
 
-	return BP_EAGAIN;
+	balloon_state = BP_EAGAIN;
 }
 
 #ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG
@@ -511,9 +516,9 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp)
  * Stop waiting if either state is BP_DONE and ballooning action is
  * needed, or if the credit has changed while state is not BP_DONE.
  */
-static bool balloon_thread_cond(enum bp_state state, long credit)
+static bool balloon_thread_cond(long credit)
 {
-	if (state == BP_DONE)
+	if (balloon_state == BP_DONE)
 		credit = 0;
 
 	return current_credit() != credit || kthread_should_stop();
@@ -527,13 +532,12 @@ static bool balloon_thread_cond(enum bp_state state, long credit)
  */
 static int balloon_thread(void *unused)
 {
-	enum bp_state state = BP_DONE;
 	long credit;
 	unsigned long timeout;
 
 	set_freezable();
 	for (;;) {
-		switch (state) {
+		switch (balloon_state) {
 		case BP_DONE:
 		case BP_ECANCELED:
 			timeout = 3600 * HZ;
@@ -549,7 +553,7 @@ static int balloon_thread(void *unused)
 		credit = current_credit();
 
 		wait_event_freezable_timeout(balloon_thread_wq,
-			balloon_thread_cond(state, credit), timeout);
+			balloon_thread_cond(credit), timeout);
 
 		if (kthread_should_stop())
 			return 0;
@@ -560,22 +564,23 @@ static int balloon_thread(void *unused)
 
 		if (credit > 0) {
 			if (balloon_is_inflated())
-				state = increase_reservation(credit);
+				balloon_state = increase_reservation(credit);
 			else
-				state = reserve_additional_memory();
+				balloon_state = reserve_additional_memory();
 		}
 
 		if (credit < 0) {
 			long n_pages;
 
 			n_pages = min(-credit, si_mem_available());
-			state = decrease_reservation(n_pages, GFP_BALLOON);
-			if (state == BP_DONE && n_pages != -credit &&
+			balloon_state = decrease_reservation(n_pages,
+							     GFP_BALLOON);
+			if (balloon_state == BP_DONE && n_pages != -credit &&
 			    n_pages < totalreserve_pages)
-				state = BP_EAGAIN;
+				balloon_state = BP_EAGAIN;
 		}
 
-		state = update_schedule(state);
+		update_schedule();
 
 		mutex_unlock(&balloon_mutex);
 
@@ -784,3 +789,38 @@ static int __init balloon_init(void)
 	return 0;
 }
 subsys_initcall(balloon_init);
+
+static int __init balloon_wait_finish(void)
+{
+	long credit, last_credit = 0;
+	unsigned long last_changed = 0;
+
+	if (!xen_domain())
+		return -ENODEV;
+
+	/* PV guests don't need to wait. */
+	if (xen_pv_domain() || !current_credit())
+		return 0;
+
+	pr_notice("Waiting for initial ballooning down having finished.\n");
+
+	while ((credit = current_credit()) < 0) {
+		if (credit != last_credit) {
+			last_changed = jiffies;
+			last_credit = credit;
+		}
+		if (balloon_state == BP_ECANCELED) {
+			pr_warn_once("Initial ballooning failed, %ld pages need to be freed.\n",
+				     -credit);
+			if (jiffies - last_changed >= HZ * balloon_boot_timeout)
+				panic("Initial ballooning failed!\n");
+		}
+
+		schedule_timeout_interruptible(HZ / 10);
+	}
+
+	pr_notice("Initial ballooning down finished.\n");
+
+	return 0;
+}
+late_initcall_sync(balloon_wait_finish);

commit 5ea60baad37de09f7d37df2a2f12265c11aa3422
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Sun Oct 24 17:03:15 2021 +0300

    ALSA: mixer: fix deadlock in snd_mixer_oss_set_volume
    
    commit 3ab7992018455ac63c33e9b3eaa7264e293e40f4 upstream.
    
    In commit 411cef6adfb3 ("ALSA: mixer: oss: Fix racy access to slots")
    added mutex protection in snd_mixer_oss_set_volume(). Second
    mutex_lock() in same function looks like typo, fix it.
    
    Reported-by: syzbot+ace149a75a9a0a399ac7@syzkaller.appspotmail.com
    Fixes: 411cef6adfb3 ("ALSA: mixer: oss: Fix racy access to slots")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Link: https://lore.kernel.org/r/20211024140315.16704-1-paskripkin@gmail.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/core/oss/mixer_oss.c b/sound/core/oss/mixer_oss.c
index dc82ed34f7c0..cb27bbe75e61 100644
--- a/sound/core/oss/mixer_oss.c
+++ b/sound/core/oss/mixer_oss.c
@@ -328,7 +328,7 @@ static int snd_mixer_oss_set_volume(struct snd_mixer_oss_file *fmixer,
 	pslot->volume[1] = right;
 	result = (left & 0xff) | ((right & 0xff) << 8);
  unlock:
-	mutex_lock(&mixer->reg_mutex);
+	mutex_unlock(&mixer->reg_mutex);
 	return result;
 }
 

commit 09933eef561d730dc94aba534184fd085a483230
Author: Takashi Iwai <tiwai@suse.de>
Date:   Wed Oct 20 18:48:46 2021 +0200

    ALSA: mixer: oss: Fix racy access to slots
    
    commit 411cef6adfb38a5bb6bd9af3941b28198e7fb680 upstream.
    
    The OSS mixer can reassign the mapping slots dynamically via proc
    file.  Although the addition and deletion of those slots are protected
    by mixer->reg_mutex, the access to slots aren't, hence this may cause
    UAF when the slots in use are deleted concurrently.
    
    This patch applies the mixer->reg_mutex in all appropriate code paths
    (i.e. the ioctl functions) that may access slots.
    
    Reported-by: syzbot+9988f17cf72a1045a189@syzkaller.appspotmail.com
    Reviewed-by: Jaroslav Kysela <perex@perex.cz>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/00000000000036adc005ceca9175@google.com
    Link: https://lore.kernel.org/r/20211020164846.922-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/core/oss/mixer_oss.c b/sound/core/oss/mixer_oss.c
index 64d904bee8bb..dc82ed34f7c0 100644
--- a/sound/core/oss/mixer_oss.c
+++ b/sound/core/oss/mixer_oss.c
@@ -145,11 +145,13 @@ static int snd_mixer_oss_devmask(struct snd_mixer_oss_file *fmixer)
 
 	if (mixer == NULL)
 		return -EIO;
+	mutex_lock(&mixer->reg_mutex);
 	for (chn = 0; chn < 31; chn++) {
 		pslot = &mixer->slots[chn];
 		if (pslot->put_volume || pslot->put_recsrc)
 			result |= 1 << chn;
 	}
+	mutex_unlock(&mixer->reg_mutex);
 	return result;
 }
 
@@ -161,11 +163,13 @@ static int snd_mixer_oss_stereodevs(struct snd_mixer_oss_file *fmixer)
 
 	if (mixer == NULL)
 		return -EIO;
+	mutex_lock(&mixer->reg_mutex);
 	for (chn = 0; chn < 31; chn++) {
 		pslot = &mixer->slots[chn];
 		if (pslot->put_volume && pslot->stereo)
 			result |= 1 << chn;
 	}
+	mutex_unlock(&mixer->reg_mutex);
 	return result;
 }
 
@@ -176,6 +180,7 @@ static int snd_mixer_oss_recmask(struct snd_mixer_oss_file *fmixer)
 
 	if (mixer == NULL)
 		return -EIO;
+	mutex_lock(&mixer->reg_mutex);
 	if (mixer->put_recsrc && mixer->get_recsrc) {	/* exclusive */
 		result = mixer->mask_recsrc;
 	} else {
@@ -187,6 +192,7 @@ static int snd_mixer_oss_recmask(struct snd_mixer_oss_file *fmixer)
 				result |= 1 << chn;
 		}
 	}
+	mutex_unlock(&mixer->reg_mutex);
 	return result;
 }
 
@@ -197,11 +203,12 @@ static int snd_mixer_oss_get_recsrc(struct snd_mixer_oss_file *fmixer)
 
 	if (mixer == NULL)
 		return -EIO;
+	mutex_lock(&mixer->reg_mutex);
 	if (mixer->put_recsrc && mixer->get_recsrc) {	/* exclusive */
-		int err;
 		unsigned int index;
-		if ((err = mixer->get_recsrc(fmixer, &index)) < 0)
-			return err;
+		result = mixer->get_recsrc(fmixer, &index);
+		if (result < 0)
+			goto unlock;
 		result = 1 << index;
 	} else {
 		struct snd_mixer_oss_slot *pslot;
@@ -216,7 +223,10 @@ static int snd_mixer_oss_get_recsrc(struct snd_mixer_oss_file *fmixer)
 			}
 		}
 	}
-	return mixer->oss_recsrc = result;
+	mixer->oss_recsrc = result;
+ unlock:
+	mutex_unlock(&mixer->reg_mutex);
+	return result;
 }
 
 static int snd_mixer_oss_set_recsrc(struct snd_mixer_oss_file *fmixer, int recsrc)
@@ -229,6 +239,7 @@ static int snd_mixer_oss_set_recsrc(struct snd_mixer_oss_file *fmixer, int recsr
 
 	if (mixer == NULL)
 		return -EIO;
+	mutex_lock(&mixer->reg_mutex);
 	if (mixer->get_recsrc && mixer->put_recsrc) {	/* exclusive input */
 		if (recsrc & ~mixer->oss_recsrc)
 			recsrc &= ~mixer->oss_recsrc;
@@ -254,6 +265,7 @@ static int snd_mixer_oss_set_recsrc(struct snd_mixer_oss_file *fmixer, int recsr
 			}
 		}
 	}
+	mutex_unlock(&mixer->reg_mutex);
 	return result;
 }
 
@@ -265,6 +277,7 @@ static int snd_mixer_oss_get_volume(struct snd_mixer_oss_file *fmixer, int slot)
 
 	if (mixer == NULL || slot > 30)
 		return -EIO;
+	mutex_lock(&mixer->reg_mutex);
 	pslot = &mixer->slots[slot];
 	left = pslot->volume[0];
 	right = pslot->volume[1];
@@ -272,15 +285,21 @@ static int snd_mixer_oss_get_volume(struct snd_mixer_oss_file *fmixer, int slot)
 		result = pslot->get_volume(fmixer, pslot, &left, &right);
 	if (!pslot->stereo)
 		right = left;
-	if (snd_BUG_ON(left < 0 || left > 100))
-		return -EIO;
-	if (snd_BUG_ON(right < 0 || right > 100))
-		return -EIO;
+	if (snd_BUG_ON(left < 0 || left > 100)) {
+		result = -EIO;
+		goto unlock;
+	}
+	if (snd_BUG_ON(right < 0 || right > 100)) {
+		result = -EIO;
+		goto unlock;
+	}
 	if (result >= 0) {
 		pslot->volume[0] = left;
 		pslot->volume[1] = right;
 	 	result = (left & 0xff) | ((right & 0xff) << 8);
 	}
+ unlock:
+	mutex_unlock(&mixer->reg_mutex);
 	return result;
 }
 
@@ -293,6 +312,7 @@ static int snd_mixer_oss_set_volume(struct snd_mixer_oss_file *fmixer,
 
 	if (mixer == NULL || slot > 30)
 		return -EIO;
+	mutex_lock(&mixer->reg_mutex);
 	pslot = &mixer->slots[slot];
 	if (left > 100)
 		left = 100;
@@ -303,10 +323,13 @@ static int snd_mixer_oss_set_volume(struct snd_mixer_oss_file *fmixer,
 	if (pslot->put_volume)
 		result = pslot->put_volume(fmixer, pslot, left, right);
 	if (result < 0)
-		return result;
+		goto unlock;
 	pslot->volume[0] = left;
 	pslot->volume[1] = right;
- 	return (left & 0xff) | ((right & 0xff) << 8);
+	result = (left & 0xff) | ((right & 0xff) << 8);
+ unlock:
+	mutex_lock(&mixer->reg_mutex);
+	return result;
 }
 
 static int snd_mixer_oss_ioctl1(struct snd_mixer_oss_file *fmixer, unsigned int cmd, unsigned long arg)

commit cac21c3eda6fc2940d59c1e72118cd7cde844f79
Author: Pali Rohár <pali@kernel.org>
Date:   Sat Oct 2 15:09:00 2021 +0200

    serial: core: Fix initializing and restoring termios speed
    
    commit 027b57170bf8bb6999a28e4a5f3d78bf1db0f90c upstream.
    
    Since commit edc6afc54968 ("tty: switch to ktermios and new framework")
    termios speed is no longer stored only in c_cflag member but also in new
    additional c_ispeed and c_ospeed members. If BOTHER flag is set in c_cflag
    then termios speed is stored only in these new members.
    
    Therefore to correctly restore termios speed it is required to store also
    ispeed and ospeed members, not only cflag member.
    
    In case only cflag member with BOTHER flag is restored then functions
    tty_termios_baud_rate() and tty_termios_input_baud_rate() returns baudrate
    stored in c_ospeed / c_ispeed member, which is zero as it was not restored
    too. If reported baudrate is invalid (e.g. zero) then serial core functions
    report fallback baudrate value 9600. So it means that in this case original
    baudrate is lost and kernel changes it to value 9600.
    
    Simple reproducer of this issue is to boot kernel with following command
    line argument: "console=ttyXXX,86400" (where ttyXXX is the device name).
    For speed 86400 there is no Bnnn constant and therefore kernel has to
    represent this speed via BOTHER c_cflag. Which means that speed is stored
    only in c_ospeed and c_ispeed members, not in c_cflag anymore.
    
    If bootloader correctly configures serial device to speed 86400 then kernel
    prints boot log to early console at speed speed 86400 without any issue.
    But after kernel starts initializing real console device ttyXXX then speed
    is changed to fallback value 9600 because information about speed was lost.
    
    This patch fixes above issue by storing and restoring also ispeed and
    ospeed members, which are required for BOTHER flag.
    
    Fixes: edc6afc54968 ("[PATCH] tty: switch to ktermios and new framework")
    Cc: stable@vger.kernel.org
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Link: https://lore.kernel.org/r/20211002130900.9518-1-pali@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index 80fa06b16d9d..5ed1327d284f 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -219,7 +219,11 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
 	if (retval == 0) {
 		if (uart_console(uport) && uport->cons->cflag) {
 			tty->termios.c_cflag = uport->cons->cflag;
+			tty->termios.c_ispeed = uport->cons->ispeed;
+			tty->termios.c_ospeed = uport->cons->ospeed;
 			uport->cons->cflag = 0;
+			uport->cons->ispeed = 0;
+			uport->cons->ospeed = 0;
 		}
 		/*
 		 * Initialise the hardware port settings.
@@ -287,8 +291,11 @@ static void uart_shutdown(struct tty_struct *tty, struct uart_state *state)
 		/*
 		 * Turn off DTR and RTS early.
 		 */
-		if (uport && uart_console(uport) && tty)
+		if (uport && uart_console(uport) && tty) {
 			uport->cons->cflag = tty->termios.c_cflag;
+			uport->cons->ispeed = tty->termios.c_ispeed;
+			uport->cons->ospeed = tty->termios.c_ospeed;
+		}
 
 		if (!tty || C_HUPCL(tty))
 			uart_port_dtr_rts(uport, 0);
@@ -2062,8 +2069,11 @@ uart_set_options(struct uart_port *port, struct console *co,
 	 * Allow the setting of the UART parameters with a NULL console
 	 * too:
 	 */
-	if (co)
+	if (co) {
 		co->cflag = termios.c_cflag;
+		co->ispeed = termios.c_ispeed;
+		co->ospeed = termios.c_ospeed;
+	}
 
 	return 0;
 }
@@ -2197,6 +2207,8 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
 		 */
 		memset(&termios, 0, sizeof(struct ktermios));
 		termios.c_cflag = uport->cons->cflag;
+		termios.c_ispeed = uport->cons->ispeed;
+		termios.c_ospeed = uport->cons->ospeed;
 
 		/*
 		 * If that's unset, use the tty termios setting.
diff --git a/include/linux/console.h b/include/linux/console.h
index ec9bdb3d7bab..35e3cc4fb4a6 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -153,6 +153,8 @@ struct console {
 	short	flags;
 	short	index;
 	int	cflag;
+	uint	ispeed;
+	uint	ospeed;
 	void	*data;
 	struct	 console *next;
 };

commit c6c329a8ea6d984686272412caf29c9e14c8eeec
Author: Xiaoming Ni <nixiaoming@huawei.com>
Date:   Wed Sep 29 11:36:45 2021 +0800

    powerpc/85xx: Fix oops when mpc85xx_smp_guts_ids node cannot be found
    
    commit 3c2172c1c47b4079c29f0e6637d764a99355ebcd upstream.
    
    When the field described in mpc85xx_smp_guts_ids[] is not configured in
    dtb, the mpc85xx_setup_pmc() does not assign a value to the "guts"
    variable. As a result, the oops is triggered when
    mpc85xx_freeze_time_base() is executed.
    
    Fixes: 56f1ba280719 ("powerpc/mpc85xx: refactor the PM operations")
    Cc: stable@vger.kernel.org # v4.6+
    Signed-off-by: Xiaoming Ni <nixiaoming@huawei.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210929033646.39630-2-nixiaoming@huawei.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/powerpc/platforms/85xx/mpc85xx_pm_ops.c b/arch/powerpc/platforms/85xx/mpc85xx_pm_ops.c
index f05325f0cc03..ddd2953965aa 100644
--- a/arch/powerpc/platforms/85xx/mpc85xx_pm_ops.c
+++ b/arch/powerpc/platforms/85xx/mpc85xx_pm_ops.c
@@ -98,9 +98,8 @@ int __init mpc85xx_setup_pmc(void)
 			pr_err("Could not map guts node address\n");
 			return -ENOMEM;
 		}
+		qoriq_pm_ops = &mpc85xx_pm_ops;
 	}
 
-	qoriq_pm_ops = &mpc85xx_pm_ops;
-
 	return 0;
 }

commit 0e6111832d11546be8edf3819408f847a05ccb9d
Author: Henrik Grimler <henrik@grimler.se>
Date:   Wed Sep 29 20:14:17 2021 +0200

    power: supply: max17042_battery: use VFSOC for capacity when no rsns
    
    commit 223a3b82834f036a62aa831f67cbf1f1d644c6e2 upstream.
    
    On Galaxy S3 (i9300/i9305), which has the max17047 fuel gauge and no
    current sense resistor (rsns), the RepSOC register does not provide an
    accurate state of charge value. The reported value is wrong, and does
    not change over time. VFSOC however, which uses the voltage fuel gauge
    to determine the state of charge, always shows an accurate value.
    
    For devices without current sense, VFSOC is already used for the
    soc-alert (0x0003 is written to MiscCFG register), so with this change
    the source of the alert and the PROP_CAPACITY value match.
    
    Fixes: 359ab9f5b154 ("power_supply: Add MAX17042 Fuel Gauge Driver")
    Cc: <stable@vger.kernel.org>
    Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Suggested-by: Wolfgang Wiedmeyer <wolfgit@wiedmeyer.de>
    Signed-off-by: Henrik Grimler <henrik@grimler.se>
    Reviewed-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply/max17042_battery.c
index 4c6db10da2bb..33fbb0fc952b 100644
--- a/drivers/power/supply/max17042_battery.c
+++ b/drivers/power/supply/max17042_battery.c
@@ -326,7 +326,10 @@ static int max17042_get_property(struct power_supply *psy,
 		val->intval = data * 625 / 8;
 		break;
 	case POWER_SUPPLY_PROP_CAPACITY:
-		ret = regmap_read(map, MAX17042_RepSOC, &data);
+		if (chip->pdata->enable_current_sense)
+			ret = regmap_read(map, MAX17042_RepSOC, &data);
+		else
+			ret = regmap_read(map, MAX17042_VFSOC, &data);
 		if (ret < 0)
 			return ret;
 

commit 28518c91c4a9d9b0c0b1224ed3df311011156b5d
Author: Sebastian Krzyszkowiak <sebastian.krzyszkowiak@puri.sm>
Date:   Tue Sep 14 14:18:06 2021 +0200

    power: supply: max17042_battery: Prevent int underflow in set_soc_threshold
    
    commit e660dbb68c6b3f7b9eb8b9775846a44f9798b719 upstream.
    
    max17042_set_soc_threshold gets called with offset set to 1, which means
    that minimum threshold value would underflow once SOC got down to 0,
    causing invalid alerts from the gauge.
    
    Fixes: e5f3872d2044 ("max17042: Add support for signalling change in SOC")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Sebastian Krzyszkowiak <sebastian.krzyszkowiak@puri.sm>
    Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply/max17042_battery.c
index a1518eb6f6c0..4c6db10da2bb 100644
--- a/drivers/power/supply/max17042_battery.c
+++ b/drivers/power/supply/max17042_battery.c
@@ -848,7 +848,8 @@ static void max17042_set_soc_threshold(struct max17042_chip *chip, u16 off)
 	regmap_read(map, MAX17042_RepSOC, &soc);
 	soc >>= 8;
 	soc_tr = (soc + off) << 8;
-	soc_tr |= (soc - off);
+	if (off < soc)
+		soc_tr |= soc - off;
 	regmap_write(map, MAX17042_SALRT_Th, soc_tr);
 }
 

commit ba3f578bd07d3e568fdeb103a534cee84d68338e
Author: Eric W. Biederman <ebiederm@xmission.com>
Date:   Wed Oct 20 12:43:51 2021 -0500

    signal/mips: Update (_save|_restore)_fp_context to fail with -EFAULT
    
    commit 95bf9d646c3c3f95cb0be7e703b371db8da5be68 upstream.
    
    When an instruction to save or restore a register from the stack fails
    in _save_fp_context or _restore_fp_context return with -EFAULT.  This
    change was made to r2300_fpu.S[1] but it looks like it got lost with
    the introduction of EX2[2].  This is also what the other implementation
    of _save_fp_context and _restore_fp_context in r4k_fpu.S does, and
    what is needed for the callers to be able to handle the error.
    
    Furthermore calling do_exit(SIGSEGV) from bad_stack is wrong because
    it does not terminate the entire process it just terminates a single
    thread.
    
    As the changed code was the only caller of arch/mips/kernel/syscall.c:bad_stack
    remove the problematic and now unused helper function.
    
    Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Cc: Maciej Rozycki <macro@orcam.me.uk>
    Cc: linux-mips@vger.kernel.org
    [1] 35938a00ba86 ("MIPS: Fix ISA I FP sigcontext access violation handling")
    [2] f92722dc4545 ("MIPS: Correct MIPS I FP sigcontext layout")
    Cc: stable@vger.kernel.org
    Fixes: f92722dc4545 ("MIPS: Correct MIPS I FP sigcontext layout")
    Acked-by: Maciej W. Rozycki <macro@orcam.me.uk>
    Acked-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Link: https://lkml.kernel.org/r/20211020174406.17889-5-ebiederm@xmission.com
    Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/mips/kernel/r2300_fpu.S b/arch/mips/kernel/r2300_fpu.S
index 3062ba66c563..f7ce7b3971a4 100644
--- a/arch/mips/kernel/r2300_fpu.S
+++ b/arch/mips/kernel/r2300_fpu.S
@@ -29,8 +29,8 @@
 #define EX2(a,b)						\
 9:	a,##b;							\
 	.section __ex_table,"a";				\
-	PTR	9b,bad_stack;					\
-	PTR	9b+4,bad_stack;					\
+	PTR	9b,fault;					\
+	PTR	9b+4,fault;					\
 	.previous
 
 	.set	mips1
diff --git a/arch/mips/kernel/syscall.c b/arch/mips/kernel/syscall.c
index 69c17b549fd3..721e652bebc6 100644
--- a/arch/mips/kernel/syscall.c
+++ b/arch/mips/kernel/syscall.c
@@ -235,12 +235,3 @@ SYSCALL_DEFINE3(cachectl, char *, addr, int, nbytes, int, op)
 {
 	return -ENOSYS;
 }
-
-/*
- * If we ever come here the user sp is bad.  Zap the process right away.
- * Due to the bad stack signaling wouldn't work.
- */
-asmlinkage void bad_stack(void)
-{
-	do_exit(SIGSEGV);
-}

commit 09cdce82d6a8653f22b6c71f7b1529dc0415678b
Author: Eric W. Biederman <ebiederm@xmission.com>
Date:   Wed Sep 1 13:21:34 2021 -0500

    signal: Remove the bogus sigkill_pending in ptrace_stop
    
    commit 7d613f9f72ec8f90ddefcae038fdae5adb8404b3 upstream.
    
    The existence of sigkill_pending is a little silly as it is
    functionally a duplicate of fatal_signal_pending that is used in
    exactly one place.
    
    Checking for pending fatal signals and returning early in ptrace_stop
    is actively harmful.  It casues the ptrace_stop called by
    ptrace_signal to return early before setting current->exit_code.
    Later when ptrace_signal reads the signal number from
    current->exit_code is undefined, making it unpredictable what will
    happen.
    
    Instead rely on the fact that schedule will not sleep if there is a
    pending signal that can awaken a task.
    
    Removing the explict sigkill_pending test fixes fixes ptrace_signal
    when ptrace_stop does not stop because current->exit_code is always
    set to to signr.
    
    Cc: stable@vger.kernel.org
    Fixes: 3d749b9e676b ("ptrace: simplify ptrace_stop()->sigkill_pending() path")
    Fixes: 1a669c2f16d4 ("Add arch_ptrace_stop")
    Link: https://lkml.kernel.org/r/87pmsyx29t.fsf@disp2133
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/signal.c b/kernel/signal.c
index a02a25acf205..4cc3f3ba13a9 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -2003,15 +2003,6 @@ static inline bool may_ptrace_stop(void)
 	return true;
 }
 
-/*
- * Return non-zero if there is a SIGKILL that should be waking us up.
- * Called with the siglock held.
- */
-static bool sigkill_pending(struct task_struct *tsk)
-{
-	return sigismember(&tsk->pending.signal, SIGKILL) ||
-	       sigismember(&tsk->signal->shared_pending.signal, SIGKILL);
-}
 
 /*
  * This must be called with current->sighand->siglock held.
@@ -2038,17 +2029,16 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info)
 		 * calling arch_ptrace_stop, so we must release it now.
 		 * To preserve proper semantics, we must do this before
 		 * any signal bookkeeping like checking group_stop_count.
-		 * Meanwhile, a SIGKILL could come in before we retake the
-		 * siglock.  That must prevent us from sleeping in TASK_TRACED.
-		 * So after regaining the lock, we must check for SIGKILL.
 		 */
 		spin_unlock_irq(&current->sighand->siglock);
 		arch_ptrace_stop(exit_code, info);
 		spin_lock_irq(&current->sighand->siglock);
-		if (sigkill_pending(current))
-			return;
 	}
 
+	/*
+	 * schedule() will not sleep if there is a pending signal that
+	 * can awaken the task.
+	 */
 	set_special_state(TASK_TRACED);
 
 	/*

commit 051ee719d9d9e70033c49cfe97855ec6574583ec
Author: Alok Prasad <palok@marvell.com>
Date:   Wed Oct 27 18:43:29 2021 +0000

    RDMA/qedr: Fix NULL deref for query_qp on the GSI QP
    
    commit 4f960393a0ee9a39469ceb7c8077ae8db665cc12 upstream.
    
    This patch fixes a crash caused by querying the QP via netlink, and
    corrects the state of GSI qp. GSI qp's have a NULL qed_qp.
    
    The call trace is generated by:
     $ rdma res show
    
     BUG: kernel NULL pointer dereference, address: 0000000000000034
     Hardware name: Dell Inc. PowerEdge R720/0M1GCR, BIOS 1.2.6 05/10/2012
     RIP: 0010:qed_rdma_query_qp+0x33/0x1a0 [qed]
     RSP: 0018:ffffba560a08f580 EFLAGS: 00010206
     RAX: 0000000200000000 RBX: ffffba560a08f5b8 RCX: 0000000000000000
     RDX: ffffba560a08f5b8 RSI: 0000000000000000 RDI: ffff9807ee458090
     RBP: ffffba560a08f5a0 R08: 0000000000000000 R09: ffff9807890e7048
     R10: ffffba560a08f658 R11: 0000000000000000 R12: 0000000000000000
     R13: ffff9807ee458090 R14: ffff9807f0afb000 R15: ffffba560a08f7ec
     FS:  00007fbbf8bfe740(0000) GS:ffff980aafa00000(0000) knlGS:0000000000000000
     CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
     CR2: 0000000000000034 CR3: 00000001720ba001 CR4: 00000000000606f0
     Call Trace:
      qedr_query_qp+0x82/0x360 [qedr]
      ib_query_qp+0x34/0x40 [ib_core]
      ? ib_query_qp+0x34/0x40 [ib_core]
      fill_res_qp_entry_query.isra.26+0x47/0x1d0 [ib_core]
      ? __nla_put+0x20/0x30
      ? nla_put+0x33/0x40
      fill_res_qp_entry+0xe3/0x120 [ib_core]
      res_get_common_dumpit+0x3f8/0x5d0 [ib_core]
      ? fill_res_cm_id_entry+0x1f0/0x1f0 [ib_core]
      nldev_res_get_qp_dumpit+0x1a/0x20 [ib_core]
      netlink_dump+0x156/0x2f0
      __netlink_dump_start+0x1ab/0x260
      rdma_nl_rcv+0x1de/0x330 [ib_core]
      ? nldev_res_get_cm_id_dumpit+0x20/0x20 [ib_core]
      netlink_unicast+0x1b8/0x270
      netlink_sendmsg+0x33e/0x470
      sock_sendmsg+0x63/0x70
      __sys_sendto+0x13f/0x180
      ? setup_sgl.isra.12+0x70/0xc0
      __x64_sys_sendto+0x28/0x30
      do_syscall_64+0x3a/0xb0
      entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Cc: stable@vger.kernel.org
    Fixes: cecbcddf6461 ("qedr: Add support for QP verbs")
    Link: https://lore.kernel.org/r/20211027184329.18454-1-palok@marvell.com
    Signed-off-by: Ariel Elior <aelior@marvell.com>
    Signed-off-by: Shai Malin <smalin@marvell.com>
    Signed-off-by: Prabhakar Kushwaha <pkushwaha@marvell.com>
    Signed-off-by: Alok Prasad <palok@marvell.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/infiniband/hw/qedr/verbs.c b/drivers/infiniband/hw/qedr/verbs.c
index f847f0a9f204..7dd6ca11f706 100644
--- a/drivers/infiniband/hw/qedr/verbs.c
+++ b/drivers/infiniband/hw/qedr/verbs.c
@@ -2500,15 +2500,18 @@ int qedr_query_qp(struct ib_qp *ibqp,
 	int rc = 0;
 
 	memset(&params, 0, sizeof(params));
-
-	rc = dev->ops->rdma_query_qp(dev->rdma_ctx, qp->qed_qp, &params);
-	if (rc)
-		goto err;
-
 	memset(qp_attr, 0, sizeof(*qp_attr));
 	memset(qp_init_attr, 0, sizeof(*qp_init_attr));
 
-	qp_attr->qp_state = qedr_get_ibqp_state(params.state);
+	if (qp->qp_type != IB_QPT_GSI) {
+		rc = dev->ops->rdma_query_qp(dev->rdma_ctx, qp->qed_qp, &params);
+		if (rc)
+			goto err;
+		qp_attr->qp_state = qedr_get_ibqp_state(params.state);
+	} else {
+		qp_attr->qp_state = qedr_get_ibqp_state(QED_ROCE_QP_STATE_RTS);
+	}
+
 	qp_attr->cur_qp_state = qedr_get_ibqp_state(params.state);
 	qp_attr->path_mtu = ib_mtu_int_to_enum(params.mtu);
 	qp_attr->path_mig_state = IB_MIG_MIGRATED;

commit c67be4be2ca195518f5c3c9d66d03ecbc813a8ec
Author: Marek Vasut <marex@denx.de>
Date:   Thu Sep 16 16:42:45 2021 +0200

    rsi: Fix module dev_oper_mode parameter description
    
    commit 31f97cf9f0c31143a2a6fcc89c4a1286ce20157e upstream.
    
    The module parameters are missing dev_oper_mode 12, BT classic alone,
    add it. Moreover, the parameters encode newlines, which ends up being
    printed malformed e.g. by modinfo, so fix that too.
    
    However, the module parameter string is duplicated in both USB and SDIO
    modules and the dev_oper_mode mode enumeration in those module parameters
    is a duplicate of macros used by the driver. Furthermore, the enumeration
    is confusing.
    
    So, deduplicate the module parameter string and use __stringify() to
    encode the correct mode enumeration values into the module parameter
    string. Finally, replace 'Wi-Fi' with 'Wi-Fi alone' and 'BT' with
    'BT classic alone' to clarify what those modes really mean.
    
    Fixes: 898b255339310 ("rsi: add module parameter operating mode")
    Signed-off-by: Marek Vasut <marex@denx.de>
    Cc: Amitkumar Karwar <amit.karwar@redpinesignals.com>
    Cc: Angus Ainslie <angus@akkea.ca>
    Cc: David S. Miller <davem@davemloft.net>
    Cc: Jakub Kicinski <kuba@kernel.org>
    Cc: Kalle Valo <kvalo@codeaurora.org>
    Cc: Karun Eagalapati <karun256@gmail.com>
    Cc: Martin Fuzzey <martin.fuzzey@flowbird.group>
    Cc: Martin Kepplinger <martink@posteo.de>
    Cc: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
    Cc: Sebastian Krzyszkowiak <sebastian.krzyszkowiak@puri.sm>
    Cc: Siva Rebbagondla <siva8118@gmail.com>
    Cc: netdev@vger.kernel.org
    Cc: <stable@vger.kernel.org> # 4.17+
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210916144245.10181-1-marex@denx.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index 609cd07eeafc..48efe83c58d8 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -24,10 +24,7 @@
 /* Default operating mode is wlan STA + BT */
 static u16 dev_oper_mode = DEV_OPMODE_STA_BT_DUAL;
 module_param(dev_oper_mode, ushort, 0444);
-MODULE_PARM_DESC(dev_oper_mode,
-		 "1[Wi-Fi], 4[BT], 8[BT LE], 5[Wi-Fi STA + BT classic]\n"
-		 "9[Wi-Fi STA + BT LE], 13[Wi-Fi STA + BT classic + BT LE]\n"
-		 "6[AP + BT classic], 14[AP + BT classic + BT LE]");
+MODULE_PARM_DESC(dev_oper_mode, DEV_OPMODE_PARAM_DESC);
 
 /**
  * rsi_sdio_set_cmd52_arg() - This function prepares cmd 52 read/write arg.
diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c
index 17e50eba780d..984f99ad4096 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
@@ -25,10 +25,7 @@
 /* Default operating mode is wlan STA + BT */
 static u16 dev_oper_mode = DEV_OPMODE_STA_BT_DUAL;
 module_param(dev_oper_mode, ushort, 0444);
-MODULE_PARM_DESC(dev_oper_mode,
-		 "1[Wi-Fi], 4[BT], 8[BT LE], 5[Wi-Fi STA + BT classic]\n"
-		 "9[Wi-Fi STA + BT LE], 13[Wi-Fi STA + BT classic + BT LE]\n"
-		 "6[AP + BT classic], 14[AP + BT classic + BT LE]");
+MODULE_PARM_DESC(dev_oper_mode, DEV_OPMODE_PARAM_DESC);
 
 static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num, gfp_t flags);
 
diff --git a/drivers/net/wireless/rsi/rsi_hal.h b/drivers/net/wireless/rsi/rsi_hal.h
index 327638cdd30b..5f52ba8458be 100644
--- a/drivers/net/wireless/rsi/rsi_hal.h
+++ b/drivers/net/wireless/rsi/rsi_hal.h
@@ -28,6 +28,17 @@
 #define DEV_OPMODE_AP_BT		6
 #define DEV_OPMODE_AP_BT_DUAL		14
 
+#define DEV_OPMODE_PARAM_DESC		\
+	__stringify(DEV_OPMODE_WIFI_ALONE)	"[Wi-Fi alone], "	\
+	__stringify(DEV_OPMODE_BT_ALONE)	"[BT classic alone], "	\
+	__stringify(DEV_OPMODE_BT_LE_ALONE)	"[BT LE alone], "	\
+	__stringify(DEV_OPMODE_BT_DUAL)		"[BT classic + BT LE alone], " \
+	__stringify(DEV_OPMODE_STA_BT)		"[Wi-Fi STA + BT classic], " \
+	__stringify(DEV_OPMODE_STA_BT_LE)	"[Wi-Fi STA + BT LE], "	\
+	__stringify(DEV_OPMODE_STA_BT_DUAL)	"[Wi-Fi STA + BT classic + BT LE], " \
+	__stringify(DEV_OPMODE_AP_BT)		"[Wi-Fi AP + BT classic], "	\
+	__stringify(DEV_OPMODE_AP_BT_DUAL)	"[Wi-Fi AP + BT classic + BT LE]"
+
 #define FLASH_WRITE_CHUNK_SIZE		(4 * 1024)
 #define FLASH_SECTOR_SIZE		(4 * 1024)
 

commit 79a84f35ced5086746bd432886b7c37750f5b71c
Author: Martin Fuzzey <martin.fuzzey@flowbird.group>
Date:   Mon Aug 30 17:26:46 2021 +0200

    rsi: fix rate mask set leading to P2P failure
    
    commit b515d097053a71d624e0c5840b42cd4caa653941 upstream.
    
    P2P client mode was only working the first time.
    On subsequent connection attempts the group was successfully created but
    no data was sent (no transmitted data packets were seen with a sniffer).
    
    The reason for this was that the hardware was being configured in fixed
    rate mode with rate RSI_RATE_1 (1Mbps) which is not valid in the 5GHz band.
    
    In P2P mode wpa_supplicant uses NL80211_CMD_SET_TX_BITRATE_MASK to disallow
    the 11b rates in the 2.4GHz band which updated common->fixedrate_mask.
    
    rsi_set_min_rate() then used the fixedrate_mask to calculate the minimum
    allowed rate, or 0xffff = auto if none was found.
    However that calculation did not account for the different rate sets
    allowed in the different bands leading to the error.
    
    Fixing set_min_rate() would result in 6Mb/s being used all the time
    which is not what we want either.
    
    The reason the problem did not occur on the first connection is that
    rsi_mac80211_set_rate_mask() only updated the fixedrate_mask for
    the *current* band. When it was called that was still 2.4GHz as the
    switch is done later. So the when set_min_rate() was subsequently
    called after the switch to 5GHz it still had a mask of zero, leading
    to defaulting to auto mode.
    
    Fix this by differentiating the case of a single rate being
    requested, in which case the hardware will be used in fixed rate
    mode with just that rate, and multiple rates being requested,
    in which case we remain in auto mode but the firmware rate selection
    algorithm is configured with a restricted set of rates.
    
    Fixes: dad0d04fa7ba ("rsi: Add RS9113 wireless driver")
    Signed-off-by: Martin Fuzzey <martin.fuzzey@flowbird.group>
    CC: stable@vger.kernel.org
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/1630337206-12410-4-git-send-email-martin.fuzzey@flowbird.group
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c b/drivers/net/wireless/rsi/rsi_91x_hal.c
index 19baa09dd1ea..2cb7cca4ec2d 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -204,15 +204,17 @@ int rsi_prepare_data_desc(struct rsi_common *common, struct sk_buff *skb)
 			RSI_WIFI_DATA_Q);
 	data_desc->header_len = ieee80211_size;
 
-	if (common->min_rate != RSI_RATE_AUTO) {
+	if (common->rate_config[common->band].fixed_enabled) {
 		/* Send fixed rate */
+		u16 fixed_rate = common->rate_config[common->band].fixed_hw_rate;
+
 		data_desc->frame_info = cpu_to_le16(RATE_INFO_ENABLE);
-		data_desc->rate_info = cpu_to_le16(common->min_rate);
+		data_desc->rate_info = cpu_to_le16(fixed_rate);
 
 		if (conf_is_ht40(&common->priv->hw->conf))
 			data_desc->bbp_info = cpu_to_le16(FULL40M_ENABLE);
 
-		if ((common->vif_info[0].sgi) && (common->min_rate & 0x100)) {
+		if (common->vif_info[0].sgi && (fixed_rate & 0x100)) {
 		       /* Only MCS rates */
 			data_desc->rate_info |=
 				cpu_to_le16(ENABLE_SHORTGI_RATE);
diff --git a/drivers/net/wireless/rsi/rsi_91x_mac80211.c b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
index bf52091b7918..69cd2c2c30ef 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mac80211.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
@@ -443,7 +443,6 @@ static int rsi_mac80211_add_interface(struct ieee80211_hw *hw,
 	if ((vif->type == NL80211_IFTYPE_AP) ||
 	    (vif->type == NL80211_IFTYPE_P2P_GO)) {
 		rsi_send_rx_filter_frame(common, DISALLOW_BEACONS);
-		common->min_rate = RSI_RATE_AUTO;
 		for (i = 0; i < common->max_stations; i++)
 			common->stations[i].sta = NULL;
 	}
@@ -1143,20 +1142,32 @@ static int rsi_mac80211_set_rate_mask(struct ieee80211_hw *hw,
 				      struct ieee80211_vif *vif,
 				      const struct cfg80211_bitrate_mask *mask)
 {
+	const unsigned int mcs_offset = ARRAY_SIZE(rsi_rates);
 	struct rsi_hw *adapter = hw->priv;
 	struct rsi_common *common = adapter->priv;
-	enum nl80211_band band = hw->conf.chandef.chan->band;
+	int i;
 
 	mutex_lock(&common->mutex);
-	common->fixedrate_mask[band] = 0;
 
-	if (mask->control[band].legacy == 0xfff) {
-		common->fixedrate_mask[band] =
-			(mask->control[band].ht_mcs[0] << 12);
-	} else {
-		common->fixedrate_mask[band] =
-			mask->control[band].legacy;
+	for (i = 0; i < ARRAY_SIZE(common->rate_config); i++) {
+		struct rsi_rate_config *cfg = &common->rate_config[i];
+		u32 bm;
+
+		bm = mask->control[i].legacy | (mask->control[i].ht_mcs[0] << mcs_offset);
+		if (hweight32(bm) == 1) { /* single rate */
+			int rate_index = ffs(bm) - 1;
+
+			if (rate_index < mcs_offset)
+				cfg->fixed_hw_rate = rsi_rates[rate_index].hw_value;
+			else
+				cfg->fixed_hw_rate = rsi_mcsrates[rate_index - mcs_offset];
+			cfg->fixed_enabled = true;
+		} else {
+			cfg->configured_mask = bm;
+			cfg->fixed_enabled = false;
+		}
 	}
+
 	mutex_unlock(&common->mutex);
 
 	return 0;
@@ -1292,46 +1303,6 @@ void rsi_indicate_pkt_to_os(struct rsi_common *common,
 	ieee80211_rx_irqsafe(hw, skb);
 }
 
-static void rsi_set_min_rate(struct ieee80211_hw *hw,
-			     struct ieee80211_sta *sta,
-			     struct rsi_common *common)
-{
-	u8 band = hw->conf.chandef.chan->band;
-	u8 ii;
-	u32 rate_bitmap;
-	bool matched = false;
-
-	common->bitrate_mask[band] = sta->supp_rates[band];
-
-	rate_bitmap = (common->fixedrate_mask[band] & sta->supp_rates[band]);
-
-	if (rate_bitmap & 0xfff) {
-		/* Find out the min rate */
-		for (ii = 0; ii < ARRAY_SIZE(rsi_rates); ii++) {
-			if (rate_bitmap & BIT(ii)) {
-				common->min_rate = rsi_rates[ii].hw_value;
-				matched = true;
-				break;
-			}
-		}
-	}
-
-	common->vif_info[0].is_ht = sta->ht_cap.ht_supported;
-
-	if ((common->vif_info[0].is_ht) && (rate_bitmap >> 12)) {
-		for (ii = 0; ii < ARRAY_SIZE(rsi_mcsrates); ii++) {
-			if ((rate_bitmap >> 12) & BIT(ii)) {
-				common->min_rate = rsi_mcsrates[ii];
-				matched = true;
-				break;
-			}
-		}
-	}
-
-	if (!matched)
-		common->min_rate = 0xffff;
-}
-
 /**
  * rsi_mac80211_sta_add() - This function notifies driver about a peer getting
  *			    connected.
@@ -1430,9 +1401,9 @@ static int rsi_mac80211_sta_add(struct ieee80211_hw *hw,
 
 	if ((vif->type == NL80211_IFTYPE_STATION) ||
 	    (vif->type == NL80211_IFTYPE_P2P_CLIENT)) {
-		rsi_set_min_rate(hw, sta, common);
+		common->bitrate_mask[common->band] = sta->supp_rates[common->band];
+		common->vif_info[0].is_ht = sta->ht_cap.ht_supported;
 		if (sta->ht_cap.ht_supported) {
-			common->vif_info[0].is_ht = true;
 			common->bitrate_mask[NL80211_BAND_2GHZ] =
 					sta->supp_rates[NL80211_BAND_2GHZ];
 			if ((sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ||
@@ -1506,7 +1477,6 @@ static int rsi_mac80211_sta_remove(struct ieee80211_hw *hw,
 		bss->qos = sta->wme;
 		common->bitrate_mask[NL80211_BAND_2GHZ] = 0;
 		common->bitrate_mask[NL80211_BAND_5GHZ] = 0;
-		common->min_rate = 0xffff;
 		common->vif_info[0].is_ht = false;
 		common->vif_info[0].sgi = false;
 		common->vif_info[0].seq_start = 0;
diff --git a/drivers/net/wireless/rsi/rsi_91x_mgmt.c b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
index 894a49dcba4d..4e6acffe1f12 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mgmt.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
@@ -222,7 +222,7 @@ static void rsi_set_default_parameters(struct rsi_common *common)
 	common->channel_width = BW_20MHZ;
 	common->rts_threshold = IEEE80211_MAX_RTS_THRESHOLD;
 	common->channel = 1;
-	common->min_rate = 0xffff;
+	memset(&common->rate_config, 0, sizeof(common->rate_config));
 	common->fsm_state = FSM_CARD_NOT_READY;
 	common->iface_down = true;
 	common->endpoint = EP_2GHZ_20MHZ;
@@ -1172,7 +1172,7 @@ static int rsi_send_auto_rate_request(struct rsi_common *common,
 	u8 band = hw->conf.chandef.chan->band;
 	u8 num_supported_rates = 0;
 	u8 rate_table_offset, rate_offset = 0;
-	u32 rate_bitmap;
+	u32 rate_bitmap, configured_rates;
 	u16 *selected_rates, min_rate;
 	bool is_ht = false, is_sgi = false;
 	u16 frame_len = sizeof(struct rsi_auto_rate);
@@ -1222,6 +1222,10 @@ static int rsi_send_auto_rate_request(struct rsi_common *common,
 			is_sgi = true;
 	}
 
+	/* Limit to any rates administratively configured by cfg80211 */
+	configured_rates = common->rate_config[band].configured_mask ?: 0xffffffff;
+	rate_bitmap &= configured_rates;
+
 	if (band == NL80211_BAND_2GHZ) {
 		if ((rate_bitmap == 0) && (is_ht))
 			min_rate = RSI_RATE_MCS0;
@@ -1247,10 +1251,13 @@ static int rsi_send_auto_rate_request(struct rsi_common *common,
 	num_supported_rates = jj;
 
 	if (is_ht) {
-		for (ii = 0; ii < ARRAY_SIZE(mcs); ii++)
-			selected_rates[jj++] = mcs[ii];
-		num_supported_rates += ARRAY_SIZE(mcs);
-		rate_offset += ARRAY_SIZE(mcs);
+		for (ii = 0; ii < ARRAY_SIZE(mcs); ii++) {
+			if (configured_rates & BIT(ii + ARRAY_SIZE(rsi_rates))) {
+				selected_rates[jj++] = mcs[ii];
+				num_supported_rates++;
+				rate_offset++;
+			}
+		}
 	}
 
 	sort(selected_rates, jj, sizeof(u16), &rsi_compare, NULL);
@@ -1335,7 +1342,7 @@ void rsi_inform_bss_status(struct rsi_common *common,
 					      qos_enable,
 					      aid, sta_id,
 					      vif);
-		if (common->min_rate == 0xffff)
+		if (!common->rate_config[common->band].fixed_enabled)
 			rsi_send_auto_rate_request(common, sta, sta_id, vif);
 		if (opmode == RSI_OPMODE_STA &&
 		    !(assoc_cap & WLAN_CAPABILITY_PRIVACY) &&
diff --git a/drivers/net/wireless/rsi/rsi_main.h b/drivers/net/wireless/rsi/rsi_main.h
index e637ab37749f..88523940da11 100644
--- a/drivers/net/wireless/rsi/rsi_main.h
+++ b/drivers/net/wireless/rsi/rsi_main.h
@@ -61,6 +61,7 @@ enum RSI_FSM_STATES {
 extern u32 rsi_zone_enabled;
 extern __printf(2, 3) void rsi_dbg(u32 zone, const char *fmt, ...);
 
+#define RSI_MAX_BANDS			2
 #define RSI_MAX_VIFS                    3
 #define NUM_EDCA_QUEUES                 4
 #define IEEE80211_ADDR_LEN              6
@@ -197,6 +198,12 @@ enum rsi_dfs_regions {
 	RSI_REGION_WORLD
 };
 
+struct rsi_rate_config {
+	u32 configured_mask;	/* configured by mac80211 bits 0-11=legacy 12+ mcs */
+	u16 fixed_hw_rate;
+	bool fixed_enabled;
+};
+
 struct rsi_common {
 	struct rsi_hw *priv;
 	struct vif_priv vif_info[RSI_MAX_VIFS];
@@ -222,8 +229,8 @@ struct rsi_common {
 	u8 channel_width;
 
 	u16 rts_threshold;
-	u16 bitrate_mask[2];
-	u32 fixedrate_mask[2];
+	u32 bitrate_mask[RSI_MAX_BANDS];
+	struct rsi_rate_config rate_config[RSI_MAX_BANDS];
 
 	u8 rf_reset;
 	struct transmit_q_stats tx_stats;
@@ -244,7 +251,6 @@ struct rsi_common {
 	u8 mac_id;
 	u8 radio_id;
 	u16 rate_pwr[20];
-	u16 min_rate;
 
 	/* WMM algo related */
 	u8 selected_qnum;

commit 8b69819f8b388b7b79e1b198f14ce409b0d44f3f
Author: Martin Fuzzey <martin.fuzzey@flowbird.group>
Date:   Mon Aug 30 17:26:45 2021 +0200

    rsi: fix key enabled check causing unwanted encryption for vap_id > 0
    
    commit 99ac6018821253ec67f466086afb63fc18ea48e2 upstream.
    
    My previous patch checked if encryption should be enabled by directly
    checking info->control.hw_key (like the downstream driver).
    However that missed that the control and driver_info members of
    struct ieee80211_tx_info are union fields.
    
    Due to this when rsi_core_xmit() updates fields in "tx_params"
    (driver_info) it can overwrite the control.hw_key, causing the result
    of the later test to be incorrect.
    
    With the current structure layout the first byte of control.hw_key is
    overlayed with the vap_id so, since we only test if control.hw_key is
    NULL / non NULL, a non zero vap_id will incorrectly enable encryption.
    
    In basic STA and AP modes the vap_id is always zero so it works but in
    P2P client mode a second VIF is created causing vap_id to be non zero
    and hence encryption to be enabled before keys have been set.
    
    Fix this by extracting the key presence flag to a new field in the driver
    private tx_params structure and populating it first.
    
    Fixes: 314538041b56 ("rsi: fix AP mode with WPA failure due to encrypted EAPOL")
    Signed-off-by: Martin Fuzzey <martin.fuzzey@flowbird.group>
    CC: stable@vger.kernel.org
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/1630337206-12410-3-git-send-email-martin.fuzzey@flowbird.group
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/rsi/rsi_91x_core.c b/drivers/net/wireless/rsi/rsi_91x_core.c
index 3644d7d99463..c6c29034b2ea 100644
--- a/drivers/net/wireless/rsi/rsi_91x_core.c
+++ b/drivers/net/wireless/rsi/rsi_91x_core.c
@@ -400,6 +400,8 @@ void rsi_core_xmit(struct rsi_common *common, struct sk_buff *skb)
 
 	info = IEEE80211_SKB_CB(skb);
 	tx_params = (struct skb_info *)info->driver_data;
+	/* info->driver_data and info->control part of union so make copy */
+	tx_params->have_key = !!info->control.hw_key;
 	wh = (struct ieee80211_hdr *)&skb->data[0];
 	tx_params->sta_id = 0;
 
diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c b/drivers/net/wireless/rsi/rsi_91x_hal.c
index c0301cd10209..19baa09dd1ea 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -193,7 +193,7 @@ int rsi_prepare_data_desc(struct rsi_common *common, struct sk_buff *skb)
 		wh->frame_control |= cpu_to_le16(RSI_SET_PS_ENABLE);
 
 	if ((!(info->flags & IEEE80211_TX_INTFL_DONT_ENCRYPT)) &&
-	    info->control.hw_key) {
+	    tx_params->have_key) {
 		if (rsi_is_cipher_wep(common))
 			ieee80211_size += 4;
 		else
diff --git a/drivers/net/wireless/rsi/rsi_main.h b/drivers/net/wireless/rsi/rsi_main.h
index 6db6d99c3d51..e637ab37749f 100644
--- a/drivers/net/wireless/rsi/rsi_main.h
+++ b/drivers/net/wireless/rsi/rsi_main.h
@@ -135,6 +135,7 @@ struct skb_info {
 	u8 internal_hdr_size;
 	struct ieee80211_vif *vif;
 	u8 vap_id;
+	bool have_key;
 };
 
 enum edca_queue {

commit d2079f39cafbee733a4e5a79d02635b6c7402fef
Author: Martin Fuzzey <martin.fuzzey@flowbird.group>
Date:   Mon Aug 30 17:26:44 2021 +0200

    rsi: fix occasional initialisation failure with BT coex
    
    commit 9b14ed6e11b72dd4806535449ca6c6962cb2369d upstream.
    
    When BT coexistence is enabled (eg oper mode 13, which is the default)
    the initialisation on startup sometimes silently fails.
    
    In a normal initialisation we see
            usb 1-1.3: Product: Wireless USB Network Module
            usb 1-1.3: Manufacturer: Redpine Signals, Inc.
            usb 1-1.3: SerialNumber: 000000000001
            rsi_91x: rsi_probe: Initialized os intf ops
            rsi_91x: rsi_load_9116_firmware: Loading chunk 0
            rsi_91x: rsi_load_9116_firmware: Loading chunk 1
            rsi_91x: rsi_load_9116_firmware: Loading chunk 2
            rsi_91x: Max Stations Allowed = 1
    
    But sometimes the last log is missing and the wlan net device is
    not created.
    
    Running a userspace loop that resets the hardware via a GPIO shows the
    problem occurring ~5/100 resets.
    
    The problem does not occur in oper mode 1 (wifi only).
    
    Adding logs shows that the initialisation state machine requests a MAC
    reset via rsi_send_reset_mac() but the firmware does not reply, leading
    to the initialisation sequence being incomplete.
    
    Fix this by delaying attaching the BT adapter until the wifi
    initialisation has completed.
    
    With this applied I have done > 300 reset loops with no errors.
    
    Fixes: 716b840c7641 ("rsi: handle BT traffic in driver")
    Signed-off-by: Martin Fuzzey <martin.fuzzey@flowbird.group>
    CC: stable@vger.kernel.org
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/1630337206-12410-2-git-send-email-martin.fuzzey@flowbird.group
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c b/drivers/net/wireless/rsi/rsi_91x_main.c
index 01d99ed985ee..a376d3d78e42 100644
--- a/drivers/net/wireless/rsi/rsi_91x_main.c
+++ b/drivers/net/wireless/rsi/rsi_91x_main.c
@@ -216,9 +216,10 @@ int rsi_read_pkt(struct rsi_common *common, u8 *rx_pkt, s32 rcv_pkt_len)
 			bt_pkt_type = frame_desc[offset + BT_RX_PKT_TYPE_OFST];
 			if (bt_pkt_type == BT_CARD_READY_IND) {
 				rsi_dbg(INFO_ZONE, "BT Card ready recvd\n");
-				if (rsi_bt_ops.attach(common, &g_proto_ops))
-					rsi_dbg(ERR_ZONE,
-						"Failed to attach BT module\n");
+				if (common->fsm_state == FSM_MAC_INIT_DONE)
+					rsi_attach_bt(common);
+				else
+					common->bt_defer_attach = true;
 			} else {
 				if (common->bt_adapter)
 					rsi_bt_ops.recv_pkt(common->bt_adapter,
@@ -283,6 +284,15 @@ void rsi_set_bt_context(void *priv, void *bt_context)
 }
 #endif
 
+void rsi_attach_bt(struct rsi_common *common)
+{
+#ifdef CONFIG_RSI_COEX
+	if (rsi_bt_ops.attach(common, &g_proto_ops))
+		rsi_dbg(ERR_ZONE,
+			"Failed to attach BT module\n");
+#endif
+}
+
 /**
  * rsi_91x_init() - This function initializes os interface operations.
  * @void: Void.
diff --git a/drivers/net/wireless/rsi/rsi_91x_mgmt.c b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
index 934550a66732..894a49dcba4d 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mgmt.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
@@ -1761,6 +1761,9 @@ static int rsi_handle_ta_confirm_type(struct rsi_common *common,
 				if (common->reinit_hw) {
 					complete(&common->wlan_init_completion);
 				} else {
+					if (common->bt_defer_attach)
+						rsi_attach_bt(common);
+
 					return rsi_mac80211_attach(common);
 				}
 			}
diff --git a/drivers/net/wireless/rsi/rsi_main.h b/drivers/net/wireless/rsi/rsi_main.h
index a245559abe7c..6db6d99c3d51 100644
--- a/drivers/net/wireless/rsi/rsi_main.h
+++ b/drivers/net/wireless/rsi/rsi_main.h
@@ -287,6 +287,7 @@ struct rsi_common {
 	struct ieee80211_vif *roc_vif;
 
 	bool eapol4_confirm;
+	bool bt_defer_attach;
 	void *bt_adapter;
 };
 
@@ -361,5 +362,6 @@ struct rsi_host_intf_ops {
 
 enum rsi_host_intf rsi_get_host_intf(void *priv);
 void rsi_set_bt_context(void *priv, void *bt_context);
+void rsi_attach_bt(struct rsi_common *common);
 
 #endif

commit f0be5d2959ec6f570952815df728b46c2e5f4280
Author: Benjamin Li <benl@squareup.com>
Date:   Wed Sep 1 11:06:05 2021 -0700

    wcn36xx: handle connection loss indication
    
    commit d6dbce453b19c64b96f3e927b10230f9a704b504 upstream.
    
    Firmware sends delete_sta_context_ind when it detects the AP has gone
    away in STA mode. Right now the handler for that indication only handles
    AP mode; fix it to also handle STA mode.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Benjamin Li <benl@squareup.com>
    Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
    Reviewed-by: Loic Poulain <loic.poulain@linaro.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210901180606.11686-1-benl@squareup.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c
index 6cd113b3b3e4..e75c1cfd85e6 100644
--- a/drivers/net/wireless/ath/wcn36xx/smd.c
+++ b/drivers/net/wireless/ath/wcn36xx/smd.c
@@ -2340,30 +2340,52 @@ static int wcn36xx_smd_delete_sta_context_ind(struct wcn36xx *wcn,
 					      size_t len)
 {
 	struct wcn36xx_hal_delete_sta_context_ind_msg *rsp = buf;
-	struct wcn36xx_vif *tmp;
+	struct wcn36xx_vif *vif_priv;
+	struct ieee80211_vif *vif;
+	struct ieee80211_bss_conf *bss_conf;
 	struct ieee80211_sta *sta;
+	bool found = false;
 
 	if (len != sizeof(*rsp)) {
 		wcn36xx_warn("Corrupted delete sta indication\n");
 		return -EIO;
 	}
 
-	wcn36xx_dbg(WCN36XX_DBG_HAL, "delete station indication %pM index %d\n",
-		    rsp->addr2, rsp->sta_id);
+	wcn36xx_dbg(WCN36XX_DBG_HAL,
+		    "delete station indication %pM index %d reason %d\n",
+		    rsp->addr2, rsp->sta_id, rsp->reason_code);
 
-	list_for_each_entry(tmp, &wcn->vif_list, list) {
+	list_for_each_entry(vif_priv, &wcn->vif_list, list) {
 		rcu_read_lock();
-		sta = ieee80211_find_sta(wcn36xx_priv_to_vif(tmp), rsp->addr2);
-		if (sta)
-			ieee80211_report_low_ack(sta, 0);
+		vif = wcn36xx_priv_to_vif(vif_priv);
+
+		if (vif->type == NL80211_IFTYPE_STATION) {
+			/* We could call ieee80211_find_sta too, but checking
+			 * bss_conf is clearer.
+			 */
+			bss_conf = &vif->bss_conf;
+			if (vif_priv->sta_assoc &&
+			    !memcmp(bss_conf->bssid, rsp->addr2, ETH_ALEN)) {
+				found = true;
+				wcn36xx_dbg(WCN36XX_DBG_HAL,
+					    "connection loss bss_index %d\n",
+					    vif_priv->bss_index);
+				ieee80211_connection_loss(vif);
+			}
+		} else {
+			sta = ieee80211_find_sta(vif, rsp->addr2);
+			if (sta) {
+				found = true;
+				ieee80211_report_low_ack(sta, 0);
+			}
+		}
+
 		rcu_read_unlock();
-		if (sta)
+		if (found)
 			return 0;
 	}
 
-	wcn36xx_warn("STA with addr %pM and index %d not found\n",
-		     rsp->addr2,
-		     rsp->sta_id);
+	wcn36xx_warn("BSS or STA with addr %pM not found\n", rsp->addr2);
 	return -ENOENT;
 }
 

commit 30ac5bf460d4c9b72f8204c24ee11ef49d985d7c
Author: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
Date:   Tue Oct 12 08:27:44 2021 +0200

    libata: fix checking of DMA state
    
    commit f971a85439bd25dc7b4d597cf5e4e8dc7ffc884b upstream.
    
    Checking if DMA is enabled should be done via the
    ata_dma_enabled helper function, since the init state
    0xff indicates disabled.
    This meant that ATA_CMD_READ_LOG_DMA_EXT was used and probed
    for before DMA was enabled, which caused hangs for some combinations
    of controllers and devices.
    It might also have caused it to be incorrectly disabled as broken,
    but there have been no reports of that.
    
    Cc: stable@vger.kernel.org
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=195895
    Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
    Tested-by: Paul Menzel <pmenzel@molgen.mpg.de>
    Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 897360a56fdd..766ebab2f011 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -2073,7 +2073,7 @@ unsigned int ata_read_log_page(struct ata_device *dev, u8 log,
 
 retry:
 	ata_tf_init(dev, &tf);
-	if (dev->dma_mode && ata_id_has_read_log_dma_ext(dev->id) &&
+	if (ata_dma_enabled(dev) && ata_id_has_read_log_dma_ext(dev->id) &&
 	    !(dev->horkage & ATA_HORKAGE_NO_DMA_LOG)) {
 		tf.command = ATA_CMD_READ_LOG_DMA_EXT;
 		tf.protocol = ATA_PROT_DMA;

commit 921971413478451bf946fbacd297940d9415a206
Author: Jonas Dre?ler <verdre@v0yd.nl>
Date:   Mon Oct 11 15:32:23 2021 +0200

    mwifiex: Read a PCI register after writing the TX ring write pointer
    
    commit e5f4eb8223aa740237cd463246a7debcddf4eda1 upstream.
    
    On the 88W8897 PCIe+USB card the firmware randomly crashes after setting
    the TX ring write pointer. The issue is present in the latest firmware
    version 15.68.19.p21 of the PCIe+USB card.
    
    Those firmware crashes can be worked around by reading any PCI register
    of the card after setting that register, so read the PCI_VENDOR_ID
    register here. The reason this works is probably because we keep the bus
    from entering an ASPM state for a bit longer, because that's what causes
    the cards firmware to crash.
    
    This fixes a bug where during RX/TX traffic and with ASPM L1 substates
    enabled (the specific substates where the issue happens appear to be
    platform dependent), the firmware crashes and eventually a command
    timeout appears in the logs.
    
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=109681
    Cc: stable@vger.kernel.org
    Signed-off-by: Jonas Dre?ler <verdre@v0yd.nl>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20211011133224.15561-2-verdre@v0yd.nl
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c
index 2f0141c964e2..aea79fd54c31 100644
--- a/drivers/net/wireless/marvell/mwifiex/pcie.c
+++ b/drivers/net/wireless/marvell/mwifiex/pcie.c
@@ -1330,6 +1330,14 @@ mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb,
 			ret = -1;
 			goto done_unmap;
 		}
+
+		/* The firmware (latest version 15.68.19.p21) of the 88W8897 PCIe+USB card
+		 * seems to crash randomly after setting the TX ring write pointer when
+		 * ASPM powersaving is enabled. A workaround seems to be keeping the bus
+		 * busy by reading a random register afterwards.
+		 */
+		mwifiex_read_reg(adapter, PCI_VENDOR_ID, &rx_val);
+
 		if ((mwifiex_pcie_txbd_not_full(card)) &&
 		    tx_param->next_pkt_len) {
 			/* have more packets and TxBD still can hold more */

commit 95668be4c9de4a1f6468ea8ce80490839acf6dfd
Author: Loic Poulain <loic.poulain@linaro.org>
Date:   Wed Oct 20 15:38:53 2021 +0200

    wcn36xx: Fix HT40 capability for 2Ghz band
    
    commit 960ae77f25631bbe4e3aafefe209b52e044baf31 upstream.
    
    All wcn36xx controllers are supposed to support HT40 (and SGI40),
    This doubles the maximum bitrate/throughput with compatible APs.
    
    Tested with wcn3620 & wcn3680B.
    
    Cc: stable@vger.kernel.org
    Fixes: 8e84c2582169 ("wcn36xx: mac80211 driver for Qualcomm WCN3660/WCN3680 hardware")
    Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/1634737133-22336-1-git-send-email-loic.poulain@linaro.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c
index 556ba3c6c5d8..eb5d08bf2503 100644
--- a/drivers/net/wireless/ath/wcn36xx/main.c
+++ b/drivers/net/wireless/ath/wcn36xx/main.c
@@ -134,7 +134,9 @@ static struct ieee80211_supported_band wcn_band_2ghz = {
 		.cap =	IEEE80211_HT_CAP_GRN_FLD |
 			IEEE80211_HT_CAP_SGI_20 |
 			IEEE80211_HT_CAP_DSSSCCK40 |
-			IEEE80211_HT_CAP_LSIG_TXOP_PROT,
+			IEEE80211_HT_CAP_LSIG_TXOP_PROT |
+			IEEE80211_HT_CAP_SGI_40 |
+			IEEE80211_HT_CAP_SUP_WIDTH_20_40,
 		.ht_supported = true,
 		.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K,
 		.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,

commit e3c5b28c28960afe708e40dbf66e2117a2c3e8ae
Author: Austin Kim <austin.kim@lge.com>
Date:   Thu Oct 28 12:26:42 2021 +0100

    evm: mark evm_fixmode as __ro_after_init
    
    commit 32ba540f3c2a7ef61ed5a577ce25069a3d714fc9 upstream.
    
    The evm_fixmode is only configurable by command-line option and it is never
    modified outside initcalls, so declaring it with __ro_after_init is better.
    
    Signed-off-by: Austin Kim <austin.kim@lge.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Mimi Zohar <zohar@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/security/integrity/evm/evm_main.c b/security/integrity/evm/evm_main.c
index d11a61f7b200..6d1efe1359f1 100644
--- a/security/integrity/evm/evm_main.c
+++ b/security/integrity/evm/evm_main.c
@@ -59,7 +59,7 @@ static struct xattr_list evm_config_default_xattrnames[] = {
 
 LIST_HEAD(evm_config_xattrnames);
 
-static int evm_fixmode;
+static int evm_fixmode __ro_after_init;
 static int __init evm_set_fixmode(char *str)
 {
 	if (strncmp(str, "fix", 3) == 0)

commit 7dc56c24a0aefd67232f139c25b0958b592f5bb1
Author: Johan Hovold <johan@kernel.org>
Date:   Mon Oct 25 14:05:21 2021 +0200

    rtl8187: fix control-message timeouts
    
    commit 2e9be536a213e838daed6ba42024dd68954ac061 upstream.
    
    USB control-message timeouts are specified in milliseconds and should
    specifically not vary with CONFIG_HZ.
    
    Fixes: 605bebe23bf6 ("[PATCH] Add rtl8187 wireless driver")
    Cc: stable@vger.kernel.org      # 2.6.23
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20211025120522.6045-4-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/realtek/rtl818x/rtl8187/rtl8225.c b/drivers/net/wireless/realtek/rtl818x/rtl8187/rtl8225.c
index ff0971f1e2c8..8ef6c2f97027 100644
--- a/drivers/net/wireless/realtek/rtl818x/rtl8187/rtl8225.c
+++ b/drivers/net/wireless/realtek/rtl818x/rtl8187/rtl8225.c
@@ -31,7 +31,7 @@ u8 rtl818x_ioread8_idx(struct rtl8187_priv *priv,
 	usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0),
 			RTL8187_REQ_GET_REG, RTL8187_REQT_READ,
 			(unsigned long)addr, idx & 0x03,
-			&priv->io_dmabuf->bits8, sizeof(val), HZ / 2);
+			&priv->io_dmabuf->bits8, sizeof(val), 500);
 
 	val = priv->io_dmabuf->bits8;
 	mutex_unlock(&priv->io_mutex);
@@ -48,7 +48,7 @@ u16 rtl818x_ioread16_idx(struct rtl8187_priv *priv,
 	usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0),
 			RTL8187_REQ_GET_REG, RTL8187_REQT_READ,
 			(unsigned long)addr, idx & 0x03,
-			&priv->io_dmabuf->bits16, sizeof(val), HZ / 2);
+			&priv->io_dmabuf->bits16, sizeof(val), 500);
 
 	val = priv->io_dmabuf->bits16;
 	mutex_unlock(&priv->io_mutex);
@@ -65,7 +65,7 @@ u32 rtl818x_ioread32_idx(struct rtl8187_priv *priv,
 	usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0),
 			RTL8187_REQ_GET_REG, RTL8187_REQT_READ,
 			(unsigned long)addr, idx & 0x03,
-			&priv->io_dmabuf->bits32, sizeof(val), HZ / 2);
+			&priv->io_dmabuf->bits32, sizeof(val), 500);
 
 	val = priv->io_dmabuf->bits32;
 	mutex_unlock(&priv->io_mutex);
@@ -82,7 +82,7 @@ void rtl818x_iowrite8_idx(struct rtl8187_priv *priv,
 	usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0),
 			RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE,
 			(unsigned long)addr, idx & 0x03,
-			&priv->io_dmabuf->bits8, sizeof(val), HZ / 2);
+			&priv->io_dmabuf->bits8, sizeof(val), 500);
 
 	mutex_unlock(&priv->io_mutex);
 }
@@ -96,7 +96,7 @@ void rtl818x_iowrite16_idx(struct rtl8187_priv *priv,
 	usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0),
 			RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE,
 			(unsigned long)addr, idx & 0x03,
-			&priv->io_dmabuf->bits16, sizeof(val), HZ / 2);
+			&priv->io_dmabuf->bits16, sizeof(val), 500);
 
 	mutex_unlock(&priv->io_mutex);
 }
@@ -110,7 +110,7 @@ void rtl818x_iowrite32_idx(struct rtl8187_priv *priv,
 	usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0),
 			RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE,
 			(unsigned long)addr, idx & 0x03,
-			&priv->io_dmabuf->bits32, sizeof(val), HZ / 2);
+			&priv->io_dmabuf->bits32, sizeof(val), 500);
 
 	mutex_unlock(&priv->io_mutex);
 }
@@ -186,7 +186,7 @@ static void rtl8225_write_8051(struct ieee80211_hw *dev, u8 addr, __le16 data)
 	usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0),
 			RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE,
 			addr, 0x8225, &priv->io_dmabuf->bits16, sizeof(data),
-			HZ / 2);
+			500);
 
 	mutex_unlock(&priv->io_mutex);
 

commit 617d8bc3c2d649f3fb16e8f0a7a76111f5b8cc5f
Author: Ingmar Klein <ingmar_klein@web.de>
Date:   Fri Apr 9 11:26:33 2021 +0200

    PCI: Mark Atheros QCA6174 to avoid bus reset
    
    commit e3f4bd3462f6f796594ecc0dda7144ed2d1e5a26 upstream.
    
    When passing the Atheros QCA6174 through to a virtual machine, the VM hangs
    at the point where the ath10k driver loads.
    
    Add a quirk to avoid bus resets on this device, which avoids the hang.
    
    [bhelgaas: commit log]
    Link: https://lore.kernel.org/r/08982e05-b6e8-5a8d-24ab-da1488ee50a8@web.de
    Signed-off-by: Ingmar Klein <ingmar_klein@web.de>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Pali Rohár <pali@kernel.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 4eb8900b9a5c..a10471ff765a 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -3490,6 +3490,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0032, quirk_no_bus_reset);
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x003c, quirk_no_bus_reset);
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0033, quirk_no_bus_reset);
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0034, quirk_no_bus_reset);
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x003e, quirk_no_bus_reset);
 
 /*
  * Root port on some Cavium CN8xxx chips do not successfully complete a bus

commit a1b9c0fdebf940145fde0b8fdf42dbf10a20e84d
Author: Johan Hovold <johan@kernel.org>
Date:   Wed Oct 27 10:08:17 2021 +0200

    ath10k: fix division by zero in send path
    
    commit a006acb931317aad3a8dd41333ebb0453caf49b8 upstream.
    
    Add the missing endpoint max-packet sanity check to probe() to avoid
    division by zero in ath10k_usb_hif_tx_sg() in case a malicious device
    has broken descriptors (or when doing descriptor fuzz testing).
    
    Note that USB core will reject URBs submitted for endpoints with zero
    wMaxPacketSize but that drivers doing packet-size calculations still
    need to handle this (cf. commit 2548288b4fb0 ("USB: Fix: Don't skip
    endpoint descriptors with maxpacket=0")).
    
    Fixes: 4db66499df91 ("ath10k: add initial USB support")
    Cc: stable@vger.kernel.org      # 4.14
    Cc: Erik Stromdahl <erik.stromdahl@gmail.com>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20211027080819.6675-2-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/ath/ath10k/usb.c b/drivers/net/wireless/ath/ath10k/usb.c
index 69dc656e9dd1..0a76991d0c6c 100644
--- a/drivers/net/wireless/ath/ath10k/usb.c
+++ b/drivers/net/wireless/ath/ath10k/usb.c
@@ -875,6 +875,11 @@ static int ath10k_usb_setup_pipe_resources(struct ath10k *ar,
 				   le16_to_cpu(endpoint->wMaxPacketSize),
 				   endpoint->bInterval);
 		}
+
+		/* Ignore broken descriptors. */
+		if (usb_endpoint_maxp(endpoint) == 0)
+			continue;
+
 		urbcount = 0;
 
 		pipe_num =

commit 42ab3580e9febf1907c28726b2c12389ac7380c8
Author: Johan Hovold <johan@kernel.org>
Date:   Mon Oct 25 14:05:19 2021 +0200

    ath10k: fix control-message timeout
    
    commit 5286132324230168d3fab6ffc16bfd7de85bdfb4 upstream.
    
    USB control-message timeouts are specified in milliseconds and should
    specifically not vary with CONFIG_HZ.
    
    Fixes: 4db66499df91 ("ath10k: add initial USB support")
    Cc: stable@vger.kernel.org      # 4.14
    Cc: Erik Stromdahl <erik.stromdahl@gmail.com>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20211025120522.6045-2-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/ath/ath10k/usb.c b/drivers/net/wireless/ath/ath10k/usb.c
index 16d5fe6d1e2e..69dc656e9dd1 100644
--- a/drivers/net/wireless/ath/ath10k/usb.c
+++ b/drivers/net/wireless/ath/ath10k/usb.c
@@ -536,7 +536,7 @@ static int ath10k_usb_submit_ctrl_in(struct ath10k *ar,
 			      req,
 			      USB_DIR_IN | USB_TYPE_VENDOR |
 			      USB_RECIP_DEVICE, value, index, buf,
-			      size, 2 * HZ);
+			      size, 2000);
 
 	if (ret < 0) {
 		ath10k_warn(ar, "Failed to read usb control message: %d\n",

commit d181cb169bb1b8aec5f3b7eb5639ad8eb03cd6ac
Author: Johan Hovold <johan@kernel.org>
Date:   Mon Oct 25 14:05:20 2021 +0200

    ath6kl: fix control-message timeout
    
    commit a066d28a7e729f808a3e6eff22e70c003091544e upstream.
    
    USB control-message timeouts are specified in milliseconds and should
    specifically not vary with CONFIG_HZ.
    
    Fixes: 241b128b6b69 ("ath6kl: add back beginnings of USB support")
    Cc: stable@vger.kernel.org      # 3.4
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20211025120522.6045-3-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/ath/ath6kl/usb.c b/drivers/net/wireless/ath/ath6kl/usb.c
index 760d0975b5cc..8b24964304b1 100644
--- a/drivers/net/wireless/ath/ath6kl/usb.c
+++ b/drivers/net/wireless/ath/ath6kl/usb.c
@@ -912,7 +912,7 @@ static int ath6kl_usb_submit_ctrl_in(struct ath6kl_usb *ar_usb,
 				 req,
 				 USB_DIR_IN | USB_TYPE_VENDOR |
 				 USB_RECIP_DEVICE, value, index, buf,
-				 size, 2 * HZ);
+				 size, 2000);
 
 	if (ret < 0) {
 		ath6kl_warn("Failed to read usb control message: %d\n", ret);

commit 0ff28b43bd3ea22184a6047e6c636dd3edb15faa
Author: Johan Hovold <johan@kernel.org>
Date:   Wed Oct 27 10:08:18 2021 +0200

    ath6kl: fix division by zero in send path
    
    commit c1b9ca365deae667192be9fe24db244919971234 upstream.
    
    Add the missing endpoint max-packet sanity check to probe() to avoid
    division by zero in ath10k_usb_hif_tx_sg() in case a malicious device
    has broken descriptors (or when doing descriptor fuzz testing).
    
    Note that USB core will reject URBs submitted for endpoints with zero
    wMaxPacketSize but that drivers doing packet-size calculations still
    need to handle this (cf. commit 2548288b4fb0 ("USB: Fix: Don't skip
    endpoint descriptors with maxpacket=0")).
    
    Fixes: 9cbee358687e ("ath6kl: add full USB support")
    Cc: stable@vger.kernel.org      # 3.5
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20211027080819.6675-3-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/ath/ath6kl/usb.c b/drivers/net/wireless/ath/ath6kl/usb.c
index 53b66e9434c9..760d0975b5cc 100644
--- a/drivers/net/wireless/ath/ath6kl/usb.c
+++ b/drivers/net/wireless/ath/ath6kl/usb.c
@@ -340,6 +340,11 @@ static int ath6kl_usb_setup_pipe_resources(struct ath6kl_usb *ar_usb)
 				   le16_to_cpu(endpoint->wMaxPacketSize),
 				   endpoint->bInterval);
 		}
+
+		/* Ignore broken descriptors. */
+		if (usb_endpoint_maxp(endpoint) == 0)
+			continue;
+
 		urbcount = 0;
 
 		pipe_num =

commit 0b9fc2763bc479f148fa0e07c5d61168e6bdb15d
Author: Johan Hovold <johan@kernel.org>
Date:   Wed Oct 27 10:08:19 2021 +0200

    mwifiex: fix division by zero in fw download path
    
    commit 89f8765a11d8df49296d92c404067f9b5c58ee26 upstream.
    
    Add the missing endpoint sanity checks to probe() to avoid division by
    zero in mwifiex_write_data_sync() in case a malicious device has broken
    descriptors (or when doing descriptor fuzz testing).
    
    Only add checks for the firmware-download boot stage, which require both
    command endpoints, for now. The driver looks like it will handle a
    missing endpoint during normal operation without oopsing, albeit not
    very gracefully as it will try to submit URBs to the default pipe and
    fail.
    
    Note that USB core will reject URBs submitted for endpoints with zero
    wMaxPacketSize but that drivers doing packet-size calculations still
    need to handle this (cf. commit 2548288b4fb0 ("USB: Fix: Don't skip
    endpoint descriptors with maxpacket=0")).
    
    Fixes: 4daffe354366 ("mwifiex: add support for Marvell USB8797 chipset")
    Cc: stable@vger.kernel.org      # 3.5
    Cc: Amitkumar Karwar <akarwar@marvell.com>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Reviewed-by: Brian Norris <briannorris@chromium.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20211027080819.6675-4-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/marvell/mwifiex/usb.c b/drivers/net/wireless/marvell/mwifiex/usb.c
index 2a8d40ce463d..e6234b53a5ca 100644
--- a/drivers/net/wireless/marvell/mwifiex/usb.c
+++ b/drivers/net/wireless/marvell/mwifiex/usb.c
@@ -505,6 +505,22 @@ static int mwifiex_usb_probe(struct usb_interface *intf,
 		}
 	}
 
+	switch (card->usb_boot_state) {
+	case USB8XXX_FW_DNLD:
+		/* Reject broken descriptors. */
+		if (!card->rx_cmd_ep || !card->tx_cmd_ep)
+			return -ENODEV;
+		if (card->bulk_out_maxpktsize == 0)
+			return -ENODEV;
+		break;
+	case USB8XXX_FW_READY:
+		/* Assume the driver can handle missing endpoints for now. */
+		break;
+	default:
+		WARN_ON(1);
+		return -ENODEV;
+	}
+
 	usb_set_intfdata(intf, card);
 
 	ret = mwifiex_add_card(card, &card->fw_done, &usb_ops,

commit 8dd84556d572a052f767acd3d33b2f3cb04acb85
Author: Eric Badger <ebadger@purestorage.com>
Date:   Sun Oct 10 10:06:56 2021 -0700

    EDAC/sb_edac: Fix top-of-high-memory value for Broadwell/Haswell
    
    commit 537bddd069c743759addf422d0b8f028ff0f8dbc upstream.
    
    The computation of TOHM is off by one bit. This missed bit results in
    too low a value for TOHM, which can cause errors in regular memory to
    incorrectly report:
    
      EDAC MC0: 1 CE Error at MMIOH area, on addr 0x000000207fffa680 on any memory
    
    Fixes: 50d1bb93672f ("sb_edac: add support for Haswell based systems")
    Cc: stable@vger.kernel.org
    Reported-by: Meeta Saggi <msaggi@purestorage.com>
    Signed-off-by: Eric Badger <ebadger@purestorage.com>
    Signed-off-by: Tony Luck <tony.luck@intel.com>
    Link: https://lore.kernel.org/r/20211010170127.848113-1-ebadger@purestorage.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c
index 53074ad361e5..f90feb0c496c 100644
--- a/drivers/edac/sb_edac.c
+++ b/drivers/edac/sb_edac.c
@@ -1021,7 +1021,7 @@ static u64 haswell_get_tohm(struct sbridge_pvt *pvt)
 	pci_read_config_dword(pvt->info.pci_vtd, HASWELL_TOHM_1, &reg);
 	rc = ((reg << 6) | rc) << 26;
 
-	return rc | 0x1ffffff;
+	return rc | 0x3ffffff;
 }
 
 static u64 knl_get_tolm(struct sbridge_pvt *pvt)

commit 26762fe6d926abc4fabd33e43ff5b791a117b5ce
Author: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Date:   Fri Oct 8 13:37:14 2021 +0200

    regulator: dt-bindings: samsung,s5m8767: correct s5m8767,pmic-buck-default-dvs-idx property
    
    commit a7fda04bc9b6ad9da8e19c9e6e3b1dab773d068a upstream.
    
    The driver was always parsing "s5m8767,pmic-buck-default-dvs-idx", not
    "s5m8767,pmic-buck234-default-dvs-idx".
    
    Cc: <stable@vger.kernel.org>
    Fixes: 26aec009f6b6 ("regulator: add device tree support for s5m8767")
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Acked-by: Rob Herring <robh@kernel.org>
    Message-Id: <20211008113723.134648-3-krzysztof.kozlowski@canonical.com>
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Documentation/devicetree/bindings/regulator/samsung,s5m8767.txt b/Documentation/devicetree/bindings/regulator/samsung,s5m8767.txt
index d9cff1614f7a..6cd83d920155 100644
--- a/Documentation/devicetree/bindings/regulator/samsung,s5m8767.txt
+++ b/Documentation/devicetree/bindings/regulator/samsung,s5m8767.txt
@@ -39,7 +39,7 @@ Optional properties of the main device node (the parent!):
 
 Additional properties required if either of the optional properties are used:
 
- - s5m8767,pmic-buck234-default-dvs-idx: Default voltage setting selected from
+ - s5m8767,pmic-buck-default-dvs-idx: Default voltage setting selected from
    the possible 8 options selectable by the dvs gpios. The value of this
    property should be between 0 and 7. If not specified or if out of range, the
    default value of this property is set to 0.

commit 112f3dc4465bf89b594b72170dac0c0169a1d69a
Author: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Date:   Fri Oct 8 13:37:13 2021 +0200

    regulator: s5m8767: do not use reset value as DVS voltage if GPIO DVS is disabled
    
    commit b16bef60a9112b1e6daf3afd16484eb06e7ce792 upstream.
    
    The driver and its bindings, before commit 04f9f068a619 ("regulator:
    s5m8767: Modify parsing method of the voltage table of buck2/3/4") were
    requiring to provide at least one safe/default voltage for DVS registers
    if DVS GPIO is not being enabled.
    
    IOW, if s5m8767,pmic-buck2-uses-gpio-dvs is missing, the
    s5m8767,pmic-buck2-dvs-voltage should still be present and contain one
    voltage.
    
    This requirement was coming from driver behavior matching this condition
    (none of DVS GPIO is enabled): it was always initializing the DVS
    selector pins to 0 and keeping the DVS enable setting at reset value
    (enabled).  Therefore if none of DVS GPIO is enabled in devicetree,
    driver was configuring the first DVS voltage for buck[234].
    
    Mentioned commit 04f9f068a619 ("regulator: s5m8767: Modify parsing
    method of the voltage table of buck2/3/4") broke it because DVS voltage
    won't be parsed from devicetree if DVS GPIO is not enabled.  After the
    change, driver will configure bucks to use the register reset value as
    voltage which might have unpleasant effects.
    
    Fix this by relaxing the bindings constrain: if DVS GPIO is not enabled
    in devicetree (therefore DVS voltage is also not parsed), explicitly
    disable it.
    
    Cc: <stable@vger.kernel.org>
    Fixes: 04f9f068a619 ("regulator: s5m8767: Modify parsing method of the voltage table of buck2/3/4")
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Acked-by: Rob Herring <robh@kernel.org>
    Message-Id: <20211008113723.134648-2-krzysztof.kozlowski@canonical.com>
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Documentation/devicetree/bindings/regulator/samsung,s5m8767.txt b/Documentation/devicetree/bindings/regulator/samsung,s5m8767.txt
index 093edda0c8df..d9cff1614f7a 100644
--- a/Documentation/devicetree/bindings/regulator/samsung,s5m8767.txt
+++ b/Documentation/devicetree/bindings/regulator/samsung,s5m8767.txt
@@ -13,6 +13,14 @@ common regulator binding documented in:
 
 
 Required properties of the main device node (the parent!):
+ - s5m8767,pmic-buck-ds-gpios: GPIO specifiers for three host gpio's used
+   for selecting GPIO DVS lines. It is one-to-one mapped to dvs gpio lines.
+
+ [1] If either of the 's5m8767,pmic-buck[2/3/4]-uses-gpio-dvs' optional
+     property is specified, then all the eight voltage values for the
+     's5m8767,pmic-buck[2/3/4]-dvs-voltage' should be specified.
+
+Optional properties of the main device node (the parent!):
  - s5m8767,pmic-buck2-dvs-voltage: A set of 8 voltage values in micro-volt (uV)
    units for buck2 when changing voltage using gpio dvs. Refer to [1] below
    for additional information.
@@ -25,19 +33,6 @@ Required properties of the main device node (the parent!):
    units for buck4 when changing voltage using gpio dvs. Refer to [1] below
    for additional information.
 
- - s5m8767,pmic-buck-ds-gpios: GPIO specifiers for three host gpio's used
-   for selecting GPIO DVS lines. It is one-to-one mapped to dvs gpio lines.
-
- [1] If none of the 's5m8767,pmic-buck[2/3/4]-uses-gpio-dvs' optional
-     property is specified, the 's5m8767,pmic-buck[2/3/4]-dvs-voltage'
-     property should specify atleast one voltage level (which would be a
-     safe operating voltage).
-
-     If either of the 's5m8767,pmic-buck[2/3/4]-uses-gpio-dvs' optional
-     property is specified, then all the eight voltage values for the
-     's5m8767,pmic-buck[2/3/4]-dvs-voltage' should be specified.
-
-Optional properties of the main device node (the parent!):
  - s5m8767,pmic-buck2-uses-gpio-dvs: 'buck2' can be controlled by gpio dvs.
  - s5m8767,pmic-buck3-uses-gpio-dvs: 'buck3' can be controlled by gpio dvs.
  - s5m8767,pmic-buck4-uses-gpio-dvs: 'buck4' can be controlled by gpio dvs.
diff --git a/drivers/regulator/s5m8767.c b/drivers/regulator/s5m8767.c
index 7ff94695eee7..4818df3f8ec9 100644
--- a/drivers/regulator/s5m8767.c
+++ b/drivers/regulator/s5m8767.c
@@ -849,18 +849,15 @@ static int s5m8767_pmic_probe(struct platform_device *pdev)
 	/* DS4 GPIO */
 	gpio_direction_output(pdata->buck_ds[2], 0x0);
 
-	if (pdata->buck2_gpiodvs || pdata->buck3_gpiodvs ||
-	   pdata->buck4_gpiodvs) {
-		regmap_update_bits(s5m8767->iodev->regmap_pmic,
-				S5M8767_REG_BUCK2CTRL, 1 << 1,
-				(pdata->buck2_gpiodvs) ? (1 << 1) : (0 << 1));
-		regmap_update_bits(s5m8767->iodev->regmap_pmic,
-				S5M8767_REG_BUCK3CTRL, 1 << 1,
-				(pdata->buck3_gpiodvs) ? (1 << 1) : (0 << 1));
-		regmap_update_bits(s5m8767->iodev->regmap_pmic,
-				S5M8767_REG_BUCK4CTRL, 1 << 1,
-				(pdata->buck4_gpiodvs) ? (1 << 1) : (0 << 1));
-	}
+	regmap_update_bits(s5m8767->iodev->regmap_pmic,
+			   S5M8767_REG_BUCK2CTRL, 1 << 1,
+			   (pdata->buck2_gpiodvs) ? (1 << 1) : (0 << 1));
+	regmap_update_bits(s5m8767->iodev->regmap_pmic,
+			   S5M8767_REG_BUCK3CTRL, 1 << 1,
+			   (pdata->buck3_gpiodvs) ? (1 << 1) : (0 << 1));
+	regmap_update_bits(s5m8767->iodev->regmap_pmic,
+			   S5M8767_REG_BUCK4CTRL, 1 << 1,
+			   (pdata->buck4_gpiodvs) ? (1 << 1) : (0 << 1));
 
 	/* Initialize GPIO DVS registers */
 	for (i = 0; i < 8; i++) {

commit 9ac24e34588d7fd7f94a31648cd1be6140bb7c7e
Author: Zev Weiss <zev@bewilderbeest.net>
Date:   Tue Sep 28 02:22:35 2021 -0700

    hwmon: (pmbus/lm25066) Add offset coefficients
    
    commit ae59dc455a78fb73034dd1fbb337d7e59c27cbd8 upstream.
    
    With the exception of the lm5066i, all the devices handled by this
    driver had been missing their offset ('b') coefficients for direct
    format readings.
    
    Cc: stable@vger.kernel.org
    Fixes: 58615a94f6a1 ("hwmon: (pmbus/lm25066) Add support for LM25056")
    Fixes: e53e6497fc9f ("hwmon: (pmbus/lm25066) Refactor device specific coefficients")
    Signed-off-by: Zev Weiss <zev@bewilderbeest.net>
    Link: https://lore.kernel.org/r/20210928092242.30036-2-zev@bewilderbeest.net
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/hwmon/pmbus/lm25066.c b/drivers/hwmon/pmbus/lm25066.c
index 53db78753a0d..6eafcbb75dcd 100644
--- a/drivers/hwmon/pmbus/lm25066.c
+++ b/drivers/hwmon/pmbus/lm25066.c
@@ -64,22 +64,27 @@ static struct __coeff lm25066_coeff[6][PSC_NUM_CLASSES + 2] = {
 	[lm25056] = {
 		[PSC_VOLTAGE_IN] = {
 			.m = 16296,
+			.b = 1343,
 			.R = -2,
 		},
 		[PSC_CURRENT_IN] = {
 			.m = 13797,
+			.b = -1833,
 			.R = -2,
 		},
 		[PSC_CURRENT_IN_L] = {
 			.m = 6726,
+			.b = -537,
 			.R = -2,
 		},
 		[PSC_POWER] = {
 			.m = 5501,
+			.b = -2908,
 			.R = -3,
 		},
 		[PSC_POWER_L] = {
 			.m = 26882,
+			.b = -5646,
 			.R = -4,
 		},
 		[PSC_TEMPERATURE] = {
@@ -91,26 +96,32 @@ static struct __coeff lm25066_coeff[6][PSC_NUM_CLASSES + 2] = {
 	[lm25066] = {
 		[PSC_VOLTAGE_IN] = {
 			.m = 22070,
+			.b = -1800,
 			.R = -2,
 		},
 		[PSC_VOLTAGE_OUT] = {
 			.m = 22070,
+			.b = -1800,
 			.R = -2,
 		},
 		[PSC_CURRENT_IN] = {
 			.m = 13661,
+			.b = -5200,
 			.R = -2,
 		},
 		[PSC_CURRENT_IN_L] = {
 			.m = 6852,
+			.b = -3100,
 			.R = -2,
 		},
 		[PSC_POWER] = {
 			.m = 736,
+			.b = -3300,
 			.R = -2,
 		},
 		[PSC_POWER_L] = {
 			.m = 369,
+			.b = -1900,
 			.R = -2,
 		},
 		[PSC_TEMPERATURE] = {
@@ -120,26 +131,32 @@ static struct __coeff lm25066_coeff[6][PSC_NUM_CLASSES + 2] = {
 	[lm5064] = {
 		[PSC_VOLTAGE_IN] = {
 			.m = 4611,
+			.b = -642,
 			.R = -2,
 		},
 		[PSC_VOLTAGE_OUT] = {
 			.m = 4621,
+			.b = 423,
 			.R = -2,
 		},
 		[PSC_CURRENT_IN] = {
 			.m = 10742,
+			.b = 1552,
 			.R = -2,
 		},
 		[PSC_CURRENT_IN_L] = {
 			.m = 5456,
+			.b = 2118,
 			.R = -2,
 		},
 		[PSC_POWER] = {
 			.m = 1204,
+			.b = 8524,
 			.R = -3,
 		},
 		[PSC_POWER_L] = {
 			.m = 612,
+			.b = 11202,
 			.R = -3,
 		},
 		[PSC_TEMPERATURE] = {
@@ -149,26 +166,32 @@ static struct __coeff lm25066_coeff[6][PSC_NUM_CLASSES + 2] = {
 	[lm5066] = {
 		[PSC_VOLTAGE_IN] = {
 			.m = 4587,
+			.b = -1200,
 			.R = -2,
 		},
 		[PSC_VOLTAGE_OUT] = {
 			.m = 4587,
+			.b = -2400,
 			.R = -2,
 		},
 		[PSC_CURRENT_IN] = {
 			.m = 10753,
+			.b = -1200,
 			.R = -2,
 		},
 		[PSC_CURRENT_IN_L] = {
 			.m = 5405,
+			.b = -600,
 			.R = -2,
 		},
 		[PSC_POWER] = {
 			.m = 1204,
+			.b = -6000,
 			.R = -3,
 		},
 		[PSC_POWER_L] = {
 			.m = 605,
+			.b = -8000,
 			.R = -3,
 		},
 		[PSC_TEMPERATURE] = {

commit f5f96e3643dc33d6117cf7047e73512046e4858b
Author: Masami Hiramatsu <mhiramat@kernel.org>
Date:   Tue Sep 14 23:40:27 2021 +0900

    ia64: kprobes: Fix to pass correct trampoline address to the handler
    
    commit a7fe2378454cf46cd5e2776d05e72bbe8f0a468c upstream.
    
    The following commit:
    
       Commit e792ff804f49 ("ia64: kprobes: Use generic kretprobe trampoline handler")
    
    Passed the wrong trampoline address to __kretprobe_trampoline_handler(): it
    passes the descriptor address instead of function entry address.
    
    Pass the right parameter.
    
    Also use correct symbol dereference function to get the function address
    from 'kretprobe_trampoline' - an IA64 special.
    
    Link: https://lkml.kernel.org/r/163163042696.489837.12551102356265354730.stgit@devnote2
    
    Fixes: e792ff804f49 ("ia64: kprobes: Use generic kretprobe trampoline handler")
    Cc: Josh Poimboeuf <jpoimboe@redhat.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: X86 ML <x86@kernel.org>
    Cc: Daniel Xu <dxu@dxuuu.xyz>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Abhishek Sagar <sagar.abhishek@gmail.com>
    Cc: Andrii Nakryiko <andrii.nakryiko@gmail.com>
    Cc: Paul McKenney <paulmck@kernel.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/ia64/kernel/kprobes.c b/arch/ia64/kernel/kprobes.c
index 8207b897b49d..9cfd3ac027b7 100644
--- a/arch/ia64/kernel/kprobes.c
+++ b/arch/ia64/kernel/kprobes.c
@@ -411,7 +411,8 @@ static void kretprobe_trampoline(void)
 
 int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
 {
-	regs->cr_iip = __kretprobe_trampoline_handler(regs, kretprobe_trampoline, NULL);
+	regs->cr_iip = __kretprobe_trampoline_handler(regs,
+		dereference_function_descriptor(kretprobe_trampoline), NULL);
 	/*
 	 * By returning a non-zero value, we are telling
 	 * kprobe_handler() that we don't want the post_handler
@@ -427,7 +428,7 @@ void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri,
 	ri->fp = NULL;
 
 	/* Replace the return addr with trampoline addr */
-	regs->b0 = ((struct fnptr *)kretprobe_trampoline)->ip;
+	regs->b0 = (unsigned long)dereference_function_descriptor(kretprobe_trampoline);
 }
 
 /* Check the instruction in the slot is break */
@@ -957,14 +958,14 @@ static struct kprobe trampoline_p = {
 int __init arch_init_kprobes(void)
 {
 	trampoline_p.addr =
-		(kprobe_opcode_t *)((struct fnptr *)kretprobe_trampoline)->ip;
+		dereference_function_descriptor(kretprobe_trampoline);
 	return register_kprobe(&trampoline_p);
 }
 
 int __kprobes arch_trampoline_kprobe(struct kprobe *p)
 {
 	if (p->addr ==
-		(kprobe_opcode_t *)((struct fnptr *)kretprobe_trampoline)->ip)
+		dereference_function_descriptor(kretprobe_trampoline))
 		return 1;
 
 	return 0;

commit 0b818a93414b7b6ea171fdb1c73ccff6f570bf7a
Author: Anand Jain <anand.jain@oracle.com>
Date:   Tue Oct 19 18:43:38 2021 +0800

    btrfs: call btrfs_check_rw_degradable only if there is a missing device
    
    commit 5c78a5e7aa835c4f08a7c90fe02d19f95a776f29 upstream.
    
    In open_ctree() in btrfs_check_rw_degradable() [1], we check each block
    group individually if at least the minimum number of devices is available
    for that profile. If all the devices are available, then we don't have to
    check degradable.
    
    [1]
    open_ctree()
    ::
    3559 if (!sb_rdonly(sb) && !btrfs_check_rw_degradable(fs_info, NULL)) {
    
    Also before calling btrfs_check_rw_degradable() in open_ctee() at the
    line number shown below [2] we call btrfs_read_chunk_tree() and down to
    add_missing_dev() to record number of missing devices.
    
    [2]
    open_ctree()
    ::
    3454         ret = btrfs_read_chunk_tree(fs_info);
    
    btrfs_read_chunk_tree()
      read_one_chunk() / read_one_dev()
        add_missing_dev()
    
    So, check if there is any missing device before btrfs_check_rw_degradable()
    in open_ctree().
    
    Also, with this the mount command could save ~16ms.[3] in the most
    common case, that is no device is missing.
    
    [3]
     1) * 16934.96 us | btrfs_check_rw_degradable [btrfs]();
    
    CC: stable@vger.kernel.org # 4.19+
    Reviewed-by: Josef Bacik <josef@toxicpanda.com>
    Signed-off-by: Anand Jain <anand.jain@oracle.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index cb21ffd3bba7..c326535d5a80 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -3095,7 +3095,8 @@ int open_ctree(struct super_block *sb,
 		goto fail_sysfs;
 	}
 
-	if (!sb_rdonly(sb) && !btrfs_check_rw_degradable(fs_info, NULL)) {
+	if (!sb_rdonly(sb) && fs_info->fs_devices->missing_devices &&
+	    !btrfs_check_rw_degradable(fs_info, NULL)) {
 		btrfs_warn(fs_info,
 		"writeable mount is not allowed due to too many missing devices");
 		goto fail_sysfs;

commit ed0231340a9431e514a6876494640556e0defc49
Author: Filipe Manana <fdmanana@suse.com>
Date:   Thu Oct 14 17:26:04 2021 +0100

    btrfs: fix lost error handling when replaying directory deletes
    
    commit 10adb1152d957a4d570ad630f93a88bb961616c1 upstream.
    
    At replay_dir_deletes(), if find_dir_range() returns an error we break out
    of the main while loop and then assign a value of 0 (success) to the 'ret'
    variable, resulting in completely ignoring that an error happened. Fix
    that by jumping to the 'out' label when find_dir_range() returns an error
    (negative value).
    
    CC: stable@vger.kernel.org # 4.4+
    Reviewed-by: Josef Bacik <josef@toxicpanda.com>
    Signed-off-by: Filipe Manana <fdmanana@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index c856c32cc926..1f5facdd19dc 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -2412,7 +2412,9 @@ static noinline int replay_dir_deletes(struct btrfs_trans_handle *trans,
 		else {
 			ret = find_dir_range(log, path, dirid, key_type,
 					     &range_start, &range_end);
-			if (ret != 0)
+			if (ret < 0)
+				goto out;
+			else if (ret > 0)
 				break;
 		}
 

commit 9d985857a73c3431b0cb6faf0e16906cf974fb89
Author: Li Zhang <zhanglikernel@gmail.com>
Date:   Tue Oct 5 01:15:33 2021 +0800

    btrfs: clear MISSING device status bit in btrfs_close_one_device
    
    commit 5d03dbebba2594d2e6fbf3b5dd9060c5a835de3b upstream.
    
    Reported bug: https://github.com/kdave/btrfs-progs/issues/389
    
    There's a problem with scrub reporting aborted status but returning
    error code 0, on a filesystem with missing and readded device.
    
    Roughly these steps:
    
    - mkfs -d raid1 dev1 dev2
    - fill with data
    - unmount
    - make dev1 disappear
    - mount -o degraded
    - copy more data
    - make dev1 appear again
    
    Running scrub afterwards reports that the command was aborted, but the
    system log message says the exit code was 0.
    
    It seems that the cause of the error is decrementing
    fs_devices->missing_devices but not clearing device->dev_state.  Every
    time we umount filesystem, it would call close_ctree, And it would
    eventually involve btrfs_close_one_device to close the device, but it
    only decrements fs_devices->missing_devices but does not clear the
    device BTRFS_DEV_STATE_MISSING bit. Worse, this bug will cause Integer
    Overflow, because every time umount, fs_devices->missing_devices will
    decrease. If?fs_devices->missing_devices value hit 0, it would overflow.
    
    With added debugging:
    
       loop1: detected capacity change from 0 to 20971520
       BTRFS: device fsid 56ad51f1-5523-463b-8547-c19486c51ebb devid 1 transid 21 /dev/loop1 scanned by systemd-udevd (2311)
       loop2: detected capacity change from 0 to 20971520
       BTRFS: device fsid 56ad51f1-5523-463b-8547-c19486c51ebb devid 2 transid 17 /dev/loop2 scanned by systemd-udevd (2313)
       BTRFS info (device loop1): flagging fs with big metadata feature
       BTRFS info (device loop1): allowing degraded mounts
       BTRFS info (device loop1): using free space tree
       BTRFS info (device loop1): has skinny extents
       BTRFS info (device loop1):  before clear_missing.00000000f706684d /dev/loop1 0
       BTRFS warning (device loop1): devid 2 uuid 6635ac31-56dd-4852-873b-c60f5e2d53d2 is missing
       BTRFS info (device loop1):  before clear_missing.0000000000000000 /dev/loop2 1
       BTRFS info (device loop1): flagging fs with big metadata feature
       BTRFS info (device loop1): allowing degraded mounts
       BTRFS info (device loop1): using free space tree
       BTRFS info (device loop1): has skinny extents
       BTRFS info (device loop1):  before clear_missing.00000000f706684d /dev/loop1 0
       BTRFS warning (device loop1): devid 2 uuid 6635ac31-56dd-4852-873b-c60f5e2d53d2 is missing
       BTRFS info (device loop1):  before clear_missing.0000000000000000 /dev/loop2 0
       BTRFS info (device loop1): flagging fs with big metadata feature
       BTRFS info (device loop1): allowing degraded mounts
       BTRFS info (device loop1): using free space tree
       BTRFS info (device loop1): has skinny extents
       BTRFS info (device loop1):  before clear_missing.00000000f706684d /dev/loop1 18446744073709551615
       BTRFS warning (device loop1): devid 2 uuid 6635ac31-56dd-4852-873b-c60f5e2d53d2 is missing
       BTRFS info (device loop1):  before clear_missing.0000000000000000 /dev/loop2 18446744073709551615
    
    If fs_devices->missing_devices is 0, next time it would be 18446744073709551615
    
    After apply this patch, the fs_devices->missing_devices seems to be
    right:
    
      $ truncate -s 10g test1
      $ truncate -s 10g test2
      $ losetup /dev/loop1 test1
      $ losetup /dev/loop2 test2
      $ mkfs.btrfs -draid1 -mraid1 /dev/loop1 /dev/loop2 -f
      $ losetup -d /dev/loop2
      $ mount -o degraded /dev/loop1 /mnt/1
      $ umount /mnt/1
      $ mount -o degraded /dev/loop1 /mnt/1
      $ umount /mnt/1
      $ mount -o degraded /dev/loop1 /mnt/1
      $ umount /mnt/1
      $ dmesg
    
       loop1: detected capacity change from 0 to 20971520
       loop2: detected capacity change from 0 to 20971520
       BTRFS: device fsid 15aa1203-98d3-4a66-bcae-ca82f629c2cd devid 1 transid 5 /dev/loop1 scanned by mkfs.btrfs (1863)
       BTRFS: device fsid 15aa1203-98d3-4a66-bcae-ca82f629c2cd devid 2 transid 5 /dev/loop2 scanned by mkfs.btrfs (1863)
       BTRFS info (device loop1): flagging fs with big metadata feature
       BTRFS info (device loop1): allowing degraded mounts
       BTRFS info (device loop1): disk space caching is enabled
       BTRFS info (device loop1): has skinny extents
       BTRFS info (device loop1):  before clear_missing.00000000975bd577 /dev/loop1 0
       BTRFS warning (device loop1): devid 2 uuid 8b333791-0b3f-4f57-b449-1c1ab6b51f38 is missing
       BTRFS info (device loop1):  before clear_missing.0000000000000000 /dev/loop2 1
       BTRFS info (device loop1): checking UUID tree
       BTRFS info (device loop1): flagging fs with big metadata feature
       BTRFS info (device loop1): allowing degraded mounts
       BTRFS info (device loop1): disk space caching is enabled
       BTRFS info (device loop1): has skinny extents
       BTRFS info (device loop1):  before clear_missing.00000000975bd577 /dev/loop1 0
       BTRFS warning (device loop1): devid 2 uuid 8b333791-0b3f-4f57-b449-1c1ab6b51f38 is missing
       BTRFS info (device loop1):  before clear_missing.0000000000000000 /dev/loop2 1
       BTRFS info (device loop1): flagging fs with big metadata feature
       BTRFS info (device loop1): allowing degraded mounts
       BTRFS info (device loop1): disk space caching is enabled
       BTRFS info (device loop1): has skinny extents
       BTRFS info (device loop1):  before clear_missing.00000000975bd577 /dev/loop1 0
       BTRFS warning (device loop1): devid 2 uuid 8b333791-0b3f-4f57-b449-1c1ab6b51f38 is missing
       BTRFS info (device loop1):  before clear_missing.0000000000000000 /dev/loop2 1
    
    CC: stable@vger.kernel.org # 4.19+
    Signed-off-by: Li Zhang <zhanglikernel@gmail.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 6cb489625610..8f05e6a472c3 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -1051,8 +1051,10 @@ static void btrfs_close_one_device(struct btrfs_device *device)
 	if (device->devid == BTRFS_DEV_REPLACE_DEVID)
 		clear_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state);
 
-	if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state))
+	if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state)) {
+		clear_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state);
 		fs_devices->missing_devices--;
+	}
 
 	btrfs_close_bdev(device);
 

commit 4204182fd504968b5be596c8ac377dfba2c0effd
Author: Dongli Zhang <dongli.zhang@oracle.com>
Date:   Tue Oct 26 14:50:31 2021 -0700

    vmxnet3: do not stop tx queues after netif_device_detach()
    
    [ Upstream commit 9159f102402a64ac85e676b75cc1f9c62c5b4b73 ]
    
    The netif_device_detach() conditionally stops all tx queues if the queues
    are running. There is no need to call netif_tx_stop_all_queues() again.
    
    Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c
index e454dfc9ad8f..c004819bebe3 100644
--- a/drivers/net/vmxnet3/vmxnet3_drv.c
+++ b/drivers/net/vmxnet3/vmxnet3_drv.c
@@ -3634,7 +3634,6 @@ vmxnet3_suspend(struct device *device)
 	vmxnet3_free_intr_resources(adapter);
 
 	netif_device_detach(netdev);
-	netif_tx_stop_all_queues(netdev);
 
 	/* Create wake-up filters. */
 	pmConf = adapter->pm_conf;

commit 1864ca9a443483bf65656b3415b0114eb5bd60ab
Author: Walter Stoll <walter.stoll@duagon.com>
Date:   Thu Oct 14 12:22:29 2021 +0200

    watchdog: Fix OMAP watchdog early handling
    
    [ Upstream commit cd004d8299f1dc6cfa6a4eea8f94cb45eaedf070 ]
    
    TI's implementation does not service the watchdog even if the kernel
    command line parameter omap_wdt.early_enable is set to 1. This patch
    fixes the issue.
    
    Signed-off-by: Walter Stoll <walter.stoll@duagon.com>
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    Link: https://lore.kernel.org/r/88a8fe5229cd68fa0f1fd22f5d66666c1b7057a0.camel@duagon.com
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/watchdog/omap_wdt.c b/drivers/watchdog/omap_wdt.c
index cbd752f9ac56..7376ba56cdf2 100644
--- a/drivers/watchdog/omap_wdt.c
+++ b/drivers/watchdog/omap_wdt.c
@@ -272,8 +272,12 @@ static int omap_wdt_probe(struct platform_device *pdev)
 			wdev->wdog.bootstatus = WDIOF_CARDRESET;
 	}
 
-	if (!early_enable)
+	if (early_enable) {
+		omap_wdt_start(&wdev->wdog);
+		set_bit(WDOG_HW_RUNNING, &wdev->wdog.status);
+	} else {
 		omap_wdt_disable(wdev);
+	}
 
 	ret = watchdog_register_device(&wdev->wdog);
 	if (ret) {

commit 8d66989707573c2811f8aac6d89c3773eb0135d2
Author: Thomas Perrot <thomas.perrot@bootlin.com>
Date:   Fri Oct 22 16:21:04 2021 +0200

    spi: spl022: fix Microwire full duplex mode
    
    [ Upstream commit d81d0e41ed5fe7229a2c9a29d13bad288c7cf2d2 ]
    
    There are missing braces in the function that verify controller parameters,
    then an error is always returned when the parameter to select Microwire
    frames operation is used on devices allowing it.
    
    Signed-off-by: Thomas Perrot <thomas.perrot@bootlin.com>
    Link: https://lore.kernel.org/r/20211022142104.1386379-1-thomas.perrot@bootlin.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/spi/spi-pl022.c b/drivers/spi/spi-pl022.c
index 1af8c96b940e..aa04ff6e01b9 100644
--- a/drivers/spi/spi-pl022.c
+++ b/drivers/spi/spi-pl022.c
@@ -1703,12 +1703,13 @@ static int verify_controller_parameters(struct pl022 *pl022,
 				return -EINVAL;
 			}
 		} else {
-			if (chip_info->duplex != SSP_MICROWIRE_CHANNEL_FULL_DUPLEX)
+			if (chip_info->duplex != SSP_MICROWIRE_CHANNEL_FULL_DUPLEX) {
 				dev_err(&pl022->adev->dev,
 					"Microwire half duplex mode requested,"
 					" but this is only available in the"
 					" ST version of PL022\n");
-			return -EINVAL;
+				return -EINVAL;
+			}
 		}
 	}
 	return 0;

commit 274c04221d91f0de0eb25287a80ac5146d1dcf96
Author: Dongli Zhang <dongli.zhang@oracle.com>
Date:   Fri Oct 22 16:31:39 2021 -0700

    xen/netfront: stop tx queues during live migration
    
    [ Upstream commit 042b2046d0f05cf8124c26ff65dbb6148a4404fb ]
    
    The tx queues are not stopped during the live migration. As a result, the
    ndo_start_xmit() may access netfront_info->queues which is freed by
    talk_to_netback()->xennet_destroy_queues().
    
    This patch is to netif_device_detach() at the beginning of xen-netfront
    resuming, and netif_device_attach() at the end of resuming.
    
         CPU A                                CPU B
    
     talk_to_netback()
     -> if (info->queues)
            xennet_destroy_queues(info);
        to free netfront_info->queues
    
                                            xennet_start_xmit()
                                            to access netfront_info->queues
    
      -> err = xennet_create_queues(info, &num_queues);
    
    The idea is borrowed from virtio-net.
    
    Cc: Joe Jin <joe.jin@oracle.com>
    Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index c8e84276e639..a1c828ffac8b 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -1442,6 +1442,10 @@ static int netfront_resume(struct xenbus_device *dev)
 
 	dev_dbg(&dev->dev, "%s\n", dev->nodename);
 
+	netif_tx_lock_bh(info->netdev);
+	netif_device_detach(info->netdev);
+	netif_tx_unlock_bh(info->netdev);
+
 	xennet_disconnect_backend(info);
 	return 0;
 }
@@ -1990,6 +1994,10 @@ static int xennet_connect(struct net_device *dev)
 	 * domain a kick because we've probably just requeued some
 	 * packets.
 	 */
+	netif_tx_lock_bh(np->netdev);
+	netif_device_attach(np->netdev);
+	netif_tx_unlock_bh(np->netdev);
+
 	netif_carrier_on(np->netdev);
 	for (j = 0; j < num_queues; ++j) {
 		queue = &np->queues[j];

commit 5c6fb0e0c73b4b45b15e4c6089ca5ef03197e246
Author: Lorenz Bauer <lmb@cloudflare.com>
Date:   Thu Oct 14 15:25:53 2021 +0100

    bpf: Prevent increasing bpf_jit_limit above max
    
    [ Upstream commit fadb7ff1a6c2c565af56b4aacdd086b067eed440 ]
    
    Restrict bpf_jit_limit to the maximum supported by the arch's JIT.
    
    Signed-off-by: Lorenz Bauer <lmb@cloudflare.com>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Link: https://lore.kernel.org/bpf/20211014142554.53120-4-lmb@cloudflare.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/filter.h b/include/linux/filter.h
index e981bd92a4e3..89a6ef659b4c 100644
--- a/include/linux/filter.h
+++ b/include/linux/filter.h
@@ -877,6 +877,7 @@ extern int bpf_jit_enable;
 extern int bpf_jit_harden;
 extern int bpf_jit_kallsyms;
 extern long bpf_jit_limit;
+extern long bpf_jit_limit_max;
 
 typedef void (*bpf_jit_fill_hole_t)(void *area, unsigned int size);
 
diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
index 341402bc1202..4e5b5ae05406 100644
--- a/kernel/bpf/core.c
+++ b/kernel/bpf/core.c
@@ -372,6 +372,7 @@ int bpf_jit_enable   __read_mostly = IS_BUILTIN(CONFIG_BPF_JIT_ALWAYS_ON);
 int bpf_jit_harden   __read_mostly;
 int bpf_jit_kallsyms __read_mostly;
 long bpf_jit_limit   __read_mostly;
+long bpf_jit_limit_max __read_mostly;
 
 static __always_inline void
 bpf_get_prog_addr_region(const struct bpf_prog *prog,
@@ -598,7 +599,8 @@ u64 __weak bpf_jit_alloc_exec_limit(void)
 static int __init bpf_jit_charge_init(void)
 {
 	/* Only used as heuristic here to derive limit. */
-	bpf_jit_limit = min_t(u64, round_up(bpf_jit_alloc_exec_limit() >> 2,
+	bpf_jit_limit_max = bpf_jit_alloc_exec_limit();
+	bpf_jit_limit = min_t(u64, round_up(bpf_jit_limit_max >> 2,
 					    PAGE_SIZE), LONG_MAX);
 	return 0;
 }
diff --git a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c
index 2597449ae9b4..0a0bf8062365 100644
--- a/net/core/sysctl_net_core.c
+++ b/net/core/sysctl_net_core.c
@@ -417,7 +417,7 @@ static struct ctl_table net_core_table[] = {
 		.mode		= 0600,
 		.proc_handler	= proc_dolongvec_minmax_bpf_restricted,
 		.extra1		= &long_one,
-		.extra2		= &long_max,
+		.extra2		= &bpf_jit_limit_max,
 	},
 #endif
 	{

commit 0e7e6e04ee8338997a7c37ba80b3835a9fbcfe5d
Author: Bryant Mairs <bryant@mai.rs>
Date:   Tue Oct 19 09:24:33 2021 -0500

    drm: panel-orientation-quirks: Add quirk for Aya Neo 2021
    
    [ Upstream commit def0c3697287f6e85d5ac68b21302966c95474f9 ]
    
    Fixes screen orientation for the Aya Neo 2021 handheld gaming console.
    
    Signed-off-by: Bryant Mairs <bryant@mai.rs>
    Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20211019142433.4295-1-bryant@mai.rs
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/drm_panel_orientation_quirks.c b/drivers/gpu/drm/drm_panel_orientation_quirks.c
index 652de972c3ae..48be8590ebe8 100644
--- a/drivers/gpu/drm/drm_panel_orientation_quirks.c
+++ b/drivers/gpu/drm/drm_panel_orientation_quirks.c
@@ -113,6 +113,12 @@ static const struct dmi_system_id orientation_data[] = {
 		  DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T103HAF"),
 		},
 		.driver_data = (void *)&lcd800x1280_rightside_up,
+	}, {	/* AYA NEO 2021 */
+		.matches = {
+		  DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYADEVICE"),
+		  DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "AYA NEO 2021"),
+		},
+		.driver_data = (void *)&lcd800x1280_rightside_up,
 	}, {	/* GPD MicroPC (generic strings, also match on bios date) */
 		.matches = {
 		  DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Default string"),

commit c516ab632cd840b4eb27d85a76d817203f1081a8
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Sun Oct 17 10:59:49 2021 -0700

    mmc: winbond: don't build on M68K
    
    [ Upstream commit 162079f2dccd02cb4b6654defd32ca387dd6d4d4 ]
    
    The Winbond MMC driver fails to build on ARCH=m68k so prevent
    that build config. Silences these build errors:
    
    ../drivers/mmc/host/wbsd.c: In function 'wbsd_request_end':
    ../drivers/mmc/host/wbsd.c:212:28: error: implicit declaration of function 'claim_dma_lock' [-Werror=implicit-function-declaration]
      212 |                 dmaflags = claim_dma_lock();
    ../drivers/mmc/host/wbsd.c:215:17: error: implicit declaration of function 'release_dma_lock'; did you mean 'release_task'? [-Werror=implicit-function-declaration]
      215 |                 release_dma_lock(dmaflags);
    
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Cc: Pierre Ossman <pierre@ossman.eu>
    Cc: Geert Uytterhoeven <geert@linux-m68k.org>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Link: https://lore.kernel.org/r/20211017175949.23838-1-rdunlap@infradead.org
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
index b7f809aa40c2..2c11944686cf 100644
--- a/drivers/mmc/host/Kconfig
+++ b/drivers/mmc/host/Kconfig
@@ -421,7 +421,7 @@ config MMC_OMAP_HS
 
 config MMC_WBSD
 	tristate "Winbond W83L51xD SD/MMC Card Interface support"
-	depends on ISA_DMA_API
+	depends on ISA_DMA_API && !M68K
 	help
 	  This selects the Winbond(R) W83L51xD Secure digital and
           Multimedia card Interface.

commit 1672beef56184da5ac42619e22f3b930279847d1
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Mon Oct 18 15:19:08 2021 +0200

    hyperv/vmbus: include linux/bitops.h
    
    [ Upstream commit 8017c99680fa65e1e8d999df1583de476a187830 ]
    
    On arm64 randconfig builds, hyperv sometimes fails with this
    error:
    
    In file included from drivers/hv/hv_trace.c:3:
    In file included from drivers/hv/hyperv_vmbus.h:16:
    In file included from arch/arm64/include/asm/sync_bitops.h:5:
    arch/arm64/include/asm/bitops.h:11:2: error: only <linux/bitops.h> can be included directly
    In file included from include/asm-generic/bitops/hweight.h:5:
    include/asm-generic/bitops/arch_hweight.h:9:9: error: implicit declaration of function '__sw_hweight32' [-Werror,-Wimplicit-function-declaration]
    include/asm-generic/bitops/atomic.h:17:7: error: implicit declaration of function 'BIT_WORD' [-Werror,-Wimplicit-function-declaration]
    
    Include the correct header first.
    
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Link: https://lore.kernel.org/r/20211018131929.2260087-1-arnd@kernel.org
    Signed-off-by: Wei Liu <wei.liu@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h
index 87d3d7da78f8..7e7c8debbd28 100644
--- a/drivers/hv/hyperv_vmbus.h
+++ b/drivers/hv/hyperv_vmbus.h
@@ -26,6 +26,7 @@
 #define _HYPERV_VMBUS_H
 
 #include <linux/list.h>
+#include <linux/bitops.h>
 #include <asm/sync_bitops.h>
 #include <asm/hyperv-tlfs.h>
 #include <linux/atomic.h>

commit 1260aa493cb54e5141feedd1be5b2384c5e75e1d
Author: Erik Ekman <erik@kryo.se>
Date:   Wed Oct 20 00:40:16 2021 +0200

    sfc: Don't use netif_info before net_device setup
    
    [ Upstream commit bf6abf345dfa77786aca554bc58c64bd428ecb1d ]
    
    Use pci_info instead to avoid unnamed/uninitialized noise:
    
    [197088.688729] sfc 0000:01:00.0: Solarflare NIC detected
    [197088.690333] sfc 0000:01:00.0: Part Number : SFN5122F
    [197088.729061] sfc 0000:01:00.0 (unnamed net_device) (uninitialized): no SR-IOV VFs probed
    [197088.729071] sfc 0000:01:00.0 (unnamed net_device) (uninitialized): no PTP support
    
    Inspired by fa44821a4ddd ("sfc: don't use netif_info et al before
    net_device is registered") from Heiner Kallweit.
    
    Signed-off-by: Erik Ekman <erik@kryo.se>
    Acked-by: Martin Habets <habetsm.xilinx@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/sfc/ptp.c b/drivers/net/ethernet/sfc/ptp.c
index d47151dbe804..c0a810f74034 100644
--- a/drivers/net/ethernet/sfc/ptp.c
+++ b/drivers/net/ethernet/sfc/ptp.c
@@ -651,7 +651,7 @@ static int efx_ptp_get_attributes(struct efx_nic *efx)
 	} else if (rc == -EINVAL) {
 		fmt = MC_CMD_PTP_OUT_GET_ATTRIBUTES_SECONDS_NANOSECONDS;
 	} else if (rc == -EPERM) {
-		netif_info(efx, probe, efx->net_dev, "no PTP support\n");
+		pci_info(efx->pci_dev, "no PTP support\n");
 		return rc;
 	} else {
 		efx_mcdi_display_error(efx, MC_CMD_PTP, sizeof(inbuf),
@@ -827,7 +827,7 @@ static int efx_ptp_disable(struct efx_nic *efx)
 	 * should only have been called during probe.
 	 */
 	if (rc == -ENOSYS || rc == -EPERM)
-		netif_info(efx, probe, efx->net_dev, "no PTP support\n");
+		pci_info(efx->pci_dev, "no PTP support\n");
 	else if (rc)
 		efx_mcdi_display_error(efx, MC_CMD_PTP,
 				       MC_CMD_PTP_IN_DISABLE_LEN,
diff --git a/drivers/net/ethernet/sfc/siena_sriov.c b/drivers/net/ethernet/sfc/siena_sriov.c
index da7b94f34604..30d58f72725d 100644
--- a/drivers/net/ethernet/sfc/siena_sriov.c
+++ b/drivers/net/ethernet/sfc/siena_sriov.c
@@ -1059,7 +1059,7 @@ void efx_siena_sriov_probe(struct efx_nic *efx)
 		return;
 
 	if (efx_siena_sriov_cmd(efx, false, &efx->vi_scale, &count)) {
-		netif_info(efx, probe, efx->net_dev, "no SR-IOV VFs probed\n");
+		pci_info(efx->pci_dev, "no SR-IOV VFs probed\n");
 		return;
 	}
 	if (count > 0 && count > max_vfs)

commit 7509c60b3babcc76ae9b53567cb8d2895ebb3d67
Author: Zheyu Ma <zheyuma97@gmail.com>
Date:   Mon Oct 18 14:32:57 2021 +0000

    cavium: Fix return values of the probe function
    
    [ Upstream commit c69b2f46876825c726bd8a97c7fa852d8932bc32 ]
    
    During the process of driver probing, the probe function should return < 0
    for failure, otherwise, the kernel will treat value > 0 as success.
    
    Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index 99eea9e6a8ea..0fbb0dee2dcf 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -1223,7 +1223,7 @@ static int nicvf_register_misc_interrupt(struct nicvf *nic)
 	if (ret < 0) {
 		netdev_err(nic->netdev,
 			   "Req for #%d msix vectors failed\n", nic->num_vec);
-		return 1;
+		return ret;
 	}
 
 	sprintf(nic->irq_name[irq], "%s Mbox", "NICVF");
@@ -1242,7 +1242,7 @@ static int nicvf_register_misc_interrupt(struct nicvf *nic)
 	if (!nicvf_check_pf_ready(nic)) {
 		nicvf_disable_intr(nic, NICVF_INTR_MBOX, 0);
 		nicvf_unregister_interrupts(nic);
-		return 1;
+		return -EIO;
 	}
 
 	return 0;

commit 908f6c2ebc027ea5371e4b4759fa354a45f6af5a
Author: Dmitry Bogdanov <d.bogdanov@yadro.com>
Date:   Mon Oct 18 15:26:50 2021 +0300

    scsi: qla2xxx: Fix unmap of already freed sgl
    
    [ Upstream commit 4a8f71014b4d56c4fb287607e844c0a9f68f46d9 ]
    
    The sgl is freed in the target stack in target_release_cmd_kref() before
    calling qlt_free_cmd() but there is an unmap of sgl in qlt_free_cmd() that
    causes a panic if sgl is not yet DMA unmapped:
    
    NIP dma_direct_unmap_sg+0xdc/0x180
    LR  dma_direct_unmap_sg+0xc8/0x180
    Call Trace:
     ql_dbg_prefix+0x68/0xc0 [qla2xxx] (unreliable)
     dma_unmap_sg_attrs+0x54/0xf0
     qlt_unmap_sg.part.19+0x54/0x1c0 [qla2xxx]
     qlt_free_cmd+0x124/0x1d0 [qla2xxx]
     tcm_qla2xxx_release_cmd+0x4c/0xa0 [tcm_qla2xxx]
     target_put_sess_cmd+0x198/0x370 [target_core_mod]
     transport_generic_free_cmd+0x6c/0x1b0 [target_core_mod]
     tcm_qla2xxx_complete_free+0x6c/0x90 [tcm_qla2xxx]
    
    The sgl may be left unmapped in error cases of response sending.  For
    instance, qlt_rdy_to_xfer() maps sgl and exits when session is being
    deleted keeping the sgl mapped.
    
    This patch removes use-after-free of the sgl and ensures that the sgl is
    unmapped for any command that was not sent to firmware.
    
    Link: https://lore.kernel.org/r/20211018122650.11846-1-d.bogdanov@yadro.com
    Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
    Signed-off-by: Dmitry Bogdanov <d.bogdanov@yadro.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
index ec54c8f34bc8..5fbac85d7adf 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -3216,8 +3216,7 @@ int qlt_xmit_response(struct qla_tgt_cmd *cmd, int xmit_type,
 			"RESET-RSP online/active/old-count/new-count = %d/%d/%d/%d.\n",
 			vha->flags.online, qla2x00_reset_active(vha),
 			cmd->reset_count, qpair->chip_reset);
-		spin_unlock_irqrestore(qpair->qp_lock_ptr, flags);
-		return 0;
+		goto out_unmap_unlock;
 	}
 
 	/* Does F/W have an IOCBs for this request */
@@ -3339,10 +3338,6 @@ int qlt_rdy_to_xfer(struct qla_tgt_cmd *cmd)
 	prm.sg = NULL;
 	prm.req_cnt = 1;
 
-	/* Calculate number of entries and segments required */
-	if (qlt_pci_map_calc_cnt(&prm) != 0)
-		return -EAGAIN;
-
 	if (!qpair->fw_started || (cmd->reset_count != qpair->chip_reset) ||
 	    (cmd->sess && cmd->sess->deleted)) {
 		/*
@@ -3358,6 +3353,10 @@ int qlt_rdy_to_xfer(struct qla_tgt_cmd *cmd)
 		return 0;
 	}
 
+	/* Calculate number of entries and segments required */
+	if (qlt_pci_map_calc_cnt(&prm) != 0)
+		return -EAGAIN;
+
 	spin_lock_irqsave(qpair->qp_lock_ptr, flags);
 	/* Does F/W have an IOCBs for this request */
 	res = qlt_check_reserve_free_req(qpair, prm.req_cnt);
@@ -3785,9 +3784,6 @@ void qlt_free_cmd(struct qla_tgt_cmd *cmd)
 
 	BUG_ON(cmd->cmd_in_wq);
 
-	if (cmd->sg_mapped)
-		qlt_unmap_sg(cmd->vha, cmd);
-
 	if (!cmd->q_full)
 		qlt_decr_num_pend_cmds(cmd->vha);
 

commit fb7b83dac1e0652a3ed37176cc354cc18eccb645
Author: Zheyu Ma <zheyuma97@gmail.com>
Date:   Mon Oct 18 02:16:22 2021 +0000

    cavium: Return negative value when pci_alloc_irq_vectors() fails
    
    [ Upstream commit b2cddb44bddc1a9c5949a978bb454bba863264db ]
    
    During the process of driver probing, the probe function should return < 0
    for failure, otherwise, the kernel will treat value > 0 as success.
    
    Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c b/drivers/net/ethernet/cavium/thunder/nic_main.c
index 90497a27df18..7c0a67f1f43f 100644
--- a/drivers/net/ethernet/cavium/thunder/nic_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nic_main.c
@@ -1175,7 +1175,7 @@ static int nic_register_interrupts(struct nicpf *nic)
 		dev_err(&nic->pdev->dev,
 			"Request for #%d msix vectors failed, returned %d\n",
 			   nic->num_vec, ret);
-		return 1;
+		return ret;
 	}
 
 	/* Register mailbox interrupt handler */

commit fad1e9cadc26f1560c31f4251248d3e05dde73e8
Author: Sean Christopherson <seanjc@google.com>
Date:   Fri Oct 8 17:11:04 2021 -0700

    x86/irq: Ensure PI wakeup handler is unregistered before module unload
    
    commit 6ff53f6a438f72998f56e82e76694a1df9d1ea2c upstream.
    
    Add a synchronize_rcu() after clearing the posted interrupt wakeup handler
    to ensure all readers, i.e. in-flight IRQ handlers, see the new handler
    before returning to the caller.  If the caller is an exiting module and
    is unregistering its handler, failure to wait could result in the IRQ
    handler jumping into an unloaded module.
    
    The registration path doesn't require synchronization, as it's the
    caller's responsibility to not generate interrupts it cares about until
    after its handler is registered.
    
    Fixes: f6b3c72c2366 ("x86/irq: Define a global vector for VT-d Posted-Interrupts")
    Cc: stable@vger.kernel.org
    Signed-off-by: Sean Christopherson <seanjc@google.com>
    Message-Id: <20211009001107.3936588-2-seanjc@google.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
index a975246074b5..ef3317c6d6d1 100644
--- a/arch/x86/kernel/irq.c
+++ b/arch/x86/kernel/irq.c
@@ -290,8 +290,10 @@ void kvm_set_posted_intr_wakeup_handler(void (*handler)(void))
 {
 	if (handler)
 		kvm_posted_intr_wakeup_handler = handler;
-	else
+	else {
 		kvm_posted_intr_wakeup_handler = dummy_handler;
+		synchronize_rcu();
+	}
 }
 EXPORT_SYMBOL_GPL(kvm_set_posted_intr_wakeup_handler);
 

commit 9a8dd3aedd0dea69b61b3d853a15f1306d9bed6a
Author: Tom Lendacky <thomas.lendacky@amd.com>
Date:   Fri Oct 15 12:24:16 2021 -0500

    x86/sme: Use #define USE_EARLY_PGTABLE_L5 in mem_encrypt_identity.c
    
    commit e7d445ab26db833d6640d4c9a08bee176777cc82 upstream.
    
    When runtime support for converting between 4-level and 5-level pagetables
    was added to the kernel, the SME code that built pagetables was updated
    to use the pagetable functions, e.g. p4d_offset(), etc., in order to
    simplify the code. However, the use of the pagetable functions in early
    boot code requires the use of the USE_EARLY_PGTABLE_L5 #define in order to
    ensure that the proper definition of pgtable_l5_enabled() is used.
    
    Without the #define, pgtable_l5_enabled() is #defined as
    cpu_feature_enabled(X86_FEATURE_LA57). In early boot, the CPU features
    have not yet been discovered and populated, so pgtable_l5_enabled() will
    return false even when 5-level paging is enabled. This causes the SME code
    to always build 4-level pagetables to perform the in-place encryption.
    If 5-level paging is enabled, switching to the SME pagetables results in
    a page-fault that kills the boot.
    
    Adding the #define results in pgtable_l5_enabled() using the
    __pgtable_l5_enabled variable set in early boot and the SME code building
    pagetables for the proper paging level.
    
    Fixes: aad983913d77 ("x86/mm/encrypt: Simplify sme_populate_pgd() and sme_populate_pgd_large()")
    Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: <stable@vger.kernel.org> # 4.18.x
    Link: https://lkml.kernel.org/r/2cb8329655f5c753905812d951e212022a480475.1634318656.git.thomas.lendacky@amd.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/mm/mem_encrypt_identity.c b/arch/x86/mm/mem_encrypt_identity.c
index 1f25201de0af..650d5a6cafc7 100644
--- a/arch/x86/mm/mem_encrypt_identity.c
+++ b/arch/x86/mm/mem_encrypt_identity.c
@@ -29,6 +29,15 @@
 #undef CONFIG_PARAVIRT
 #undef CONFIG_PARAVIRT_SPINLOCKS
 
+/*
+ * This code runs before CPU feature bits are set. By default, the
+ * pgtable_l5_enabled() function uses bit X86_FEATURE_LA57 to determine if
+ * 5-level paging is active, so that won't work here. USE_EARLY_PGTABLE_L5
+ * is provided to handle this situation and, instead, use a variable that
+ * has been set by the early boot code.
+ */
+#define USE_EARLY_PGTABLE_L5
+
 #include <linux/kernel.h>
 #include <linux/mm.h>
 #include <linux/mem_encrypt.h>

commit bf2a56e40a3d30a15a516d262f9380174abb29d7
Author: Takashi Iwai <tiwai@suse.de>
Date:   Fri Nov 5 10:15:17 2021 +0100

    ALSA: timer: Unconditionally unlink slave instances, too
    
    commit ffdd98277f0a1d15a67a74ae09bee713df4c0dbc upstream.
    
    Like the previous fix (commit c0317c0e8709 "ALSA: timer: Fix
    use-after-free problem"), we have to unlink slave timer instances
    immediately at snd_timer_stop(), too.  Otherwise it may leave a stale
    entry in the list if the slave instance is freed before actually
    running.
    
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20211105091517.21733-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/core/timer.c b/sound/core/timer.c
index 2c16ead14129..4920ec4f4594 100644
--- a/sound/core/timer.c
+++ b/sound/core/timer.c
@@ -634,23 +634,22 @@ static int snd_timer_stop1(struct snd_timer_instance *timeri, bool stop)
 static int snd_timer_stop_slave(struct snd_timer_instance *timeri, bool stop)
 {
 	unsigned long flags;
+	bool running;
 
 	spin_lock_irqsave(&slave_active_lock, flags);
-	if (!(timeri->flags & SNDRV_TIMER_IFLG_RUNNING)) {
-		spin_unlock_irqrestore(&slave_active_lock, flags);
-		return -EBUSY;
-	}
+	running = timeri->flags & SNDRV_TIMER_IFLG_RUNNING;
 	timeri->flags &= ~SNDRV_TIMER_IFLG_RUNNING;
 	if (timeri->timer) {
 		spin_lock(&timeri->timer->lock);
 		list_del_init(&timeri->ack_list);
 		list_del_init(&timeri->active_list);
-		snd_timer_notify1(timeri, stop ? SNDRV_TIMER_EVENT_STOP :
-				  SNDRV_TIMER_EVENT_PAUSE);
+		if (running)
+			snd_timer_notify1(timeri, stop ? SNDRV_TIMER_EVENT_STOP :
+					  SNDRV_TIMER_EVENT_PAUSE);
 		spin_unlock(&timeri->timer->lock);
 	}
 	spin_unlock_irqrestore(&slave_active_lock, flags);
-	return 0;
+	return running ? 0 : -EBUSY;
 }
 
 /*

commit 2fd555848ef81a2858dcbba9d6ec30ad398db428
Author: Wang Wensheng <wangwensheng4@huawei.com>
Date:   Wed Nov 3 03:35:17 2021 +0000

    ALSA: timer: Fix use-after-free problem
    
    commit c0317c0e87094f5b5782b6fdef5ae0a4b150496c upstream.
    
    When the timer instance was add into ack_list but was not currently in
    process, the user could stop it via snd_timer_stop1() without delete it
    from the ack_list. Then the user could free the timer instance and when
    it was actually processed UAF occurred.
    
    This issue could be reproduced via testcase snd_timer01 in ltp - running
    several instances of that testcase at the same time.
    
    What I actually met was that the ack_list of the timer broken and the
    kernel went into deadloop with irqoff. That could be detected by
    hardlockup detector on board or when we run it on qemu, we could use gdb
    to dump the ack_list when the console has no response.
    
    To fix this issue, we delete the timer instance from ack_list and
    active_list unconditionally in snd_timer_stop1().
    
    Signed-off-by: Wang Wensheng <wangwensheng4@huawei.com>
    Suggested-by: Takashi Iwai <tiwai@suse.de>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20211103033517.80531-1-wangwensheng4@huawei.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/core/timer.c b/sound/core/timer.c
index b4fe1324b56c..2c16ead14129 100644
--- a/sound/core/timer.c
+++ b/sound/core/timer.c
@@ -593,13 +593,13 @@ static int snd_timer_stop1(struct snd_timer_instance *timeri, bool stop)
 	if (!timer)
 		return -EINVAL;
 	spin_lock_irqsave(&timer->lock, flags);
+	list_del_init(&timeri->ack_list);
+	list_del_init(&timeri->active_list);
 	if (!(timeri->flags & (SNDRV_TIMER_IFLG_RUNNING |
 			       SNDRV_TIMER_IFLG_START))) {
 		result = -EBUSY;
 		goto unlock;
 	}
-	list_del_init(&timeri->ack_list);
-	list_del_init(&timeri->active_list);
 	if (timer->card && timer->card->shutdown)
 		goto unlock;
 	if (stop) {

commit e053651f048d826a80c883cfe80200387bbdc5c5
Author: Austin Kim <austin.kim@lge.com>
Date:   Tue Nov 9 00:37:42 2021 +0000

    ALSA: synth: missing check for possible NULL after the call to kstrdup
    
    commit d159037abbe3412285c271bdfb9cdf19e62678ff upstream.
    
    If kcalloc() return NULL due to memory starvation, it is possible for
    kstrdup() to return NULL in similar case. So add null check after the call
    to kstrdup() is made.
    
    [ minor coding-style fix by tiwai ]
    
    Signed-off-by: Austin Kim <austin.kim@lge.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20211109003742.GA5423@raspberrypi
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/synth/emux/emux.c b/sound/synth/emux/emux.c
index 64f3141a3e1b..d8140ad98d5f 100644
--- a/sound/synth/emux/emux.c
+++ b/sound/synth/emux/emux.c
@@ -101,7 +101,7 @@ int snd_emux_register(struct snd_emux *emu, struct snd_card *card, int index, ch
 	emu->name = kstrdup(name, GFP_KERNEL);
 	emu->voices = kcalloc(emu->max_voices, sizeof(struct snd_emux_voice),
 			      GFP_KERNEL);
-	if (emu->voices == NULL)
+	if (emu->name == NULL || emu->voices == NULL)
 		return -ENOMEM;
 
 	/* create soundfont list */

commit 76711240dc51b637a5b54b25767f69a4d07c3806
Author: Alexander Tsoy <alexander@tsoy.me>
Date:   Sat Oct 30 20:43:08 2021 +0300

    ALSA: usb-audio: Add registration quirk for JBL Quantum 400
    
    commit 763d92ed5dece7d439fc28a88b2d2728d525ffd9 upstream.
    
    Add another device ID for JBL Quantum 400. It requires the same quirk as
    other JBL Quantum devices.
    
    Signed-off-by: Alexander Tsoy <alexander@tsoy.me>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20211030174308.1011825-1-alexander@tsoy.me
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
index f4bdcff82f5c..b1bd63a9fc6d 100644
--- a/sound/usb/quirks.c
+++ b/sound/usb/quirks.c
@@ -1555,6 +1555,7 @@ static const struct registration_quirk registration_quirks[] = {
 	REG_QUIRK_ENTRY(0x0951, 0x16ea, 2),	/* Kingston HyperX Cloud Flight S */
 	REG_QUIRK_ENTRY(0x0ecb, 0x1f46, 2),	/* JBL Quantum 600 */
 	REG_QUIRK_ENTRY(0x0ecb, 0x1f47, 2),	/* JBL Quantum 800 */
+	REG_QUIRK_ENTRY(0x0ecb, 0x1f4c, 2),	/* JBL Quantum 400 */
 	REG_QUIRK_ENTRY(0x0ecb, 0x2039, 2),	/* JBL Quantum 400 */
 	REG_QUIRK_ENTRY(0x0ecb, 0x203c, 2),	/* JBL Quantum 600 */
 	REG_QUIRK_ENTRY(0x0ecb, 0x203e, 2),	/* JBL Quantum 800 */

commit ade3c629a012812372ba33dba2e1ac593e115f2e
Author: Johan Hovold <johan@kernel.org>
Date:   Mon Oct 25 14:11:42 2021 +0200

    ALSA: line6: fix control and interrupt message timeouts
    
    commit f4000b58b64344871d7b27c05e73932f137cfef6 upstream.
    
    USB control and interrupt message timeouts are specified in milliseconds
    and should specifically not vary with CONFIG_HZ.
    
    Fixes: 705ececd1c60 ("Staging: add line6 usb driver")
    Cc: stable@vger.kernel.org      # 2.6.30
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20211025121142.6531-3-johan@kernel.org
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/usb/line6/driver.c b/sound/usb/line6/driver.c
index 2163fd6dce66..67d74218d861 100644
--- a/sound/usb/line6/driver.c
+++ b/sound/usb/line6/driver.c
@@ -117,12 +117,12 @@ static int line6_send_raw_message(struct usb_line6 *line6, const char *buffer,
 			retval = usb_interrupt_msg(line6->usbdev,
 						usb_sndintpipe(line6->usbdev, properties->ep_ctrl_w),
 						(char *)frag_buf, frag_size,
-						&partial, LINE6_TIMEOUT * HZ);
+						&partial, LINE6_TIMEOUT);
 		} else {
 			retval = usb_bulk_msg(line6->usbdev,
 						usb_sndbulkpipe(line6->usbdev, properties->ep_ctrl_w),
 						(char *)frag_buf, frag_size,
-						&partial, LINE6_TIMEOUT * HZ);
+						&partial, LINE6_TIMEOUT);
 		}
 
 		if (retval) {
@@ -365,7 +365,7 @@ int line6_read_data(struct usb_line6 *line6, unsigned address, void *data,
 	ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67,
 			      USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
 			      (datalen << 8) | 0x21, address,
-			      NULL, 0, LINE6_TIMEOUT * HZ);
+			      NULL, 0, LINE6_TIMEOUT);
 
 	if (ret < 0) {
 		dev_err(line6->ifcdev, "read request failed (error %d)\n", ret);
@@ -380,7 +380,7 @@ int line6_read_data(struct usb_line6 *line6, unsigned address, void *data,
 				      USB_TYPE_VENDOR | USB_RECIP_DEVICE |
 				      USB_DIR_IN,
 				      0x0012, 0x0000, len, 1,
-				      LINE6_TIMEOUT * HZ);
+				      LINE6_TIMEOUT);
 		if (ret < 0) {
 			dev_err(line6->ifcdev,
 				"receive length failed (error %d)\n", ret);
@@ -408,7 +408,7 @@ int line6_read_data(struct usb_line6 *line6, unsigned address, void *data,
 	ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), 0x67,
 			      USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
 			      0x0013, 0x0000, data, datalen,
-			      LINE6_TIMEOUT * HZ);
+			      LINE6_TIMEOUT);
 
 	if (ret < 0)
 		dev_err(line6->ifcdev, "read failed (error %d)\n", ret);
@@ -440,7 +440,7 @@ int line6_write_data(struct usb_line6 *line6, unsigned address, void *data,
 	ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67,
 			      USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
 			      0x0022, address, data, datalen,
-			      LINE6_TIMEOUT * HZ);
+			      LINE6_TIMEOUT);
 
 	if (ret < 0) {
 		dev_err(line6->ifcdev,
@@ -456,7 +456,7 @@ int line6_write_data(struct usb_line6 *line6, unsigned address, void *data,
 				      USB_TYPE_VENDOR | USB_RECIP_DEVICE |
 				      USB_DIR_IN,
 				      0x0012, 0x0000,
-				      status, 1, LINE6_TIMEOUT * HZ);
+				      status, 1, LINE6_TIMEOUT);
 
 		if (ret < 0) {
 			dev_err(line6->ifcdev,
diff --git a/sound/usb/line6/driver.h b/sound/usb/line6/driver.h
index 650d909c9c4f..d2d786eadfde 100644
--- a/sound/usb/line6/driver.h
+++ b/sound/usb/line6/driver.h
@@ -31,7 +31,7 @@
 #define LINE6_FALLBACK_INTERVAL 10
 #define LINE6_FALLBACK_MAXPACKETSIZE 16
 
-#define LINE6_TIMEOUT 1
+#define LINE6_TIMEOUT 1000
 #define LINE6_BUFSIZE_LISTEN 64
 #define LINE6_MIDI_MESSAGE_MAXLEN 256
 
diff --git a/sound/usb/line6/podhd.c b/sound/usb/line6/podhd.c
index da627b015b32..2806808d8108 100644
--- a/sound/usb/line6/podhd.c
+++ b/sound/usb/line6/podhd.c
@@ -236,7 +236,7 @@ static int podhd_dev_start(struct usb_line6_podhd *pod)
 	ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0),
 					0x67, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
 					0x11, 0,
-					NULL, 0, LINE6_TIMEOUT * HZ);
+					NULL, 0, LINE6_TIMEOUT);
 	if (ret < 0) {
 		dev_err(pod->line6.ifcdev, "read request failed (error %d)\n", ret);
 		goto exit;
@@ -246,7 +246,7 @@ static int podhd_dev_start(struct usb_line6_podhd *pod)
 	ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), 0x67,
 					USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
 					0x11, 0x0,
-					init_bytes, 3, LINE6_TIMEOUT * HZ);
+					init_bytes, 3, LINE6_TIMEOUT);
 	if (ret < 0) {
 		dev_err(pod->line6.ifcdev,
 			"receive length failed (error %d)\n", ret);
@@ -266,7 +266,7 @@ static int podhd_dev_start(struct usb_line6_podhd *pod)
 					USB_REQ_SET_FEATURE,
 					USB_TYPE_STANDARD | USB_RECIP_DEVICE | USB_DIR_OUT,
 					1, 0,
-					NULL, 0, LINE6_TIMEOUT * HZ);
+					NULL, 0, LINE6_TIMEOUT);
 exit:
 	kfree(init_bytes);
 	return ret;
diff --git a/sound/usb/line6/toneport.c b/sound/usb/line6/toneport.c
index 7e39083f8f76..cbb2e66be32f 100644
--- a/sound/usb/line6/toneport.c
+++ b/sound/usb/line6/toneport.c
@@ -130,7 +130,7 @@ static int toneport_send_cmd(struct usb_device *usbdev, int cmd1, int cmd2)
 
 	ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67,
 			      USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
-			      cmd1, cmd2, NULL, 0, LINE6_TIMEOUT * HZ);
+			      cmd1, cmd2, NULL, 0, LINE6_TIMEOUT);
 
 	if (ret < 0) {
 		dev_err(&usbdev->dev, "send failed (error %d)\n", ret);

commit 72048125f2f25e18000a222cf226e758232d0d96
Author: Johan Hovold <johan@kernel.org>
Date:   Mon Oct 25 14:11:41 2021 +0200

    ALSA: 6fire: fix control and bulk message timeouts
    
    commit 9b371c6cc37f954360989eec41c2ddc5a6b83917 upstream.
    
    USB control and bulk message timeouts are specified in milliseconds and
    should specifically not vary with CONFIG_HZ.
    
    Fixes: c6d43ba816d1 ("ALSA: usb/6fire - Driver for TerraTec DMX 6Fire USB")
    Cc: stable@vger.kernel.org      # 2.6.39
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20211025121142.6531-2-johan@kernel.org
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/usb/6fire/comm.c b/sound/usb/6fire/comm.c
index 161215d78d95..f29c115b9d56 100644
--- a/sound/usb/6fire/comm.c
+++ b/sound/usb/6fire/comm.c
@@ -99,7 +99,7 @@ static int usb6fire_comm_send_buffer(u8 *buffer, struct usb_device *dev)
 	int actual_len;
 
 	ret = usb_interrupt_msg(dev, usb_sndintpipe(dev, COMM_EP),
-			buffer, buffer[1] + 2, &actual_len, HZ);
+			buffer, buffer[1] + 2, &actual_len, 1000);
 	if (ret < 0)
 		return ret;
 	else if (actual_len != buffer[1] + 2)
diff --git a/sound/usb/6fire/firmware.c b/sound/usb/6fire/firmware.c
index 9520b4cd7038..7a89111041ed 100644
--- a/sound/usb/6fire/firmware.c
+++ b/sound/usb/6fire/firmware.c
@@ -166,7 +166,7 @@ static int usb6fire_fw_ezusb_write(struct usb_device *device,
 
 	ret = usb_control_msg(device, usb_sndctrlpipe(device, 0), type,
 			USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
-			value, 0, data, len, HZ);
+			value, 0, data, len, 1000);
 	if (ret < 0)
 		return ret;
 	else if (ret != len)
@@ -179,7 +179,7 @@ static int usb6fire_fw_ezusb_read(struct usb_device *device,
 {
 	int ret = usb_control_msg(device, usb_rcvctrlpipe(device, 0), type,
 			USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, value,
-			0, data, len, HZ);
+			0, data, len, 1000);
 	if (ret < 0)
 		return ret;
 	else if (ret != len)
@@ -194,7 +194,7 @@ static int usb6fire_fw_fpga_write(struct usb_device *device,
 	int ret;
 
 	ret = usb_bulk_msg(device, usb_sndbulkpipe(device, FPGA_EP), data, len,
-			&actual_len, HZ);
+			&actual_len, 1000);
 	if (ret < 0)
 		return ret;
 	else if (actual_len != len)

commit 278150c45e09dca85575b75ef86b071c911b1102
Author: Johan Hovold <johan@kernel.org>
Date:   Tue Oct 26 11:54:01 2021 +0200

    ALSA: ua101: fix division by zero at probe
    
    commit 55f261b73a7e1cb254577c3536cef8f415de220a upstream.
    
    Add the missing endpoint max-packet sanity check to probe() to avoid
    division by zero in alloc_stream_buffers() in case a malicious device
    has broken descriptors (or when doing descriptor fuzz testing).
    
    Note that USB core will reject URBs submitted for endpoints with zero
    wMaxPacketSize but that drivers doing packet-size calculations still
    need to handle this (cf. commit 2548288b4fb0 ("USB: Fix: Don't skip
    endpoint descriptors with maxpacket=0")).
    
    Fixes: 63978ab3e3e9 ("sound: add Edirol UA-101 support")
    Cc: stable@vger.kernel.org      # 2.6.34
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20211026095401.26522-1-johan@kernel.org
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/usb/misc/ua101.c b/sound/usb/misc/ua101.c
index a0b6d039017f..5e94b6b4b905 100644
--- a/sound/usb/misc/ua101.c
+++ b/sound/usb/misc/ua101.c
@@ -1030,7 +1030,7 @@ static int detect_usb_format(struct ua101 *ua)
 		fmt_playback->bSubframeSize * ua->playback.channels;
 
 	epd = &ua->intf[INTF_CAPTURE]->altsetting[1].endpoint[0].desc;
-	if (!usb_endpoint_is_isoc_in(epd)) {
+	if (!usb_endpoint_is_isoc_in(epd) || usb_endpoint_maxp(epd) == 0) {
 		dev_err(&ua->dev->dev, "invalid capture endpoint\n");
 		return -ENXIO;
 	}
@@ -1038,7 +1038,7 @@ static int detect_usb_format(struct ua101 *ua)
 	ua->capture.max_packet_bytes = usb_endpoint_maxp(epd);
 
 	epd = &ua->intf[INTF_PLAYBACK]->altsetting[1].endpoint[0].desc;
-	if (!usb_endpoint_is_isoc_out(epd)) {
+	if (!usb_endpoint_is_isoc_out(epd) || usb_endpoint_maxp(epd) == 0) {
 		dev_err(&ua->dev->dev, "invalid playback endpoint\n");
 		return -ENXIO;
 	}

commit 2db57b5d78723e5f2f9671c4828c255d978cfd0f
Author: Tim Crawford <tcrawford@system76.com>
Date:   Mon Nov 1 10:21:34 2021 -0600

    ALSA: hda/realtek: Add quirk for Clevo PC70HS
    
    commit dbfe83507cf4ea66ce4efee2ac14c5ad420e31d3 upstream.
    
    Apply the PB51ED PCI quirk to the Clevo PC70HS. Fixes audio output from
    the internal speakers.
    
    Signed-off-by: Tim Crawford <tcrawford@system76.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20211101162134.5336-1-tcrawford@system76.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 2161c57d26c5..56d87e53346f 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -2525,6 +2525,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
+	SND_PCI_QUIRK(0x1558, 0x67f1, "Clevo PC70H[PRS]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170SM", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x7715, "Clevo X170KM-G", ALC1220_FIXUP_CLEVO_PB51ED),

commit 25e90be93b99f213fbfc8a2edce08656d832a29b
Author: Sean Young <sean@mess.org>
Date:   Wed Sep 15 18:14:07 2021 +0200

    media: ir-kbd-i2c: improve responsiveness of hauppauge zilog receivers
    
    commit c73ba202a851c0b611ef2c25e568fadeff5e667f upstream.
    
    The IR receiver has two issues:
    
     - Sometimes there is no response to a button press
     - Sometimes a button press is repeated when it should not have been
    
    Hanging the polling interval fixes this behaviour.
    
    Link: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=994050
    
    Cc: stable@vger.kernel.org
    Suggested-by: Joaquín Alberto Calderón Pozo <kini_calderon@hotmail.com>
    Signed-off-by: Sean Young <sean@mess.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/media/i2c/ir-kbd-i2c.c b/drivers/media/i2c/ir-kbd-i2c.c
index 19ff9cb08e88..933ddfcc50a1 100644
--- a/drivers/media/i2c/ir-kbd-i2c.c
+++ b/drivers/media/i2c/ir-kbd-i2c.c
@@ -801,6 +801,7 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id)
 		rc_proto    = RC_PROTO_BIT_RC5 | RC_PROTO_BIT_RC6_MCE |
 							RC_PROTO_BIT_RC6_6A_32;
 		ir_codes    = RC_MAP_HAUPPAUGE;
+		ir->polling_interval = 125;
 		probe_tx = true;
 		break;
 	}

commit 6340df3ec4dfa1a7435eb9109ed6518e155453a0
Author: Sean Young <sean@mess.org>
Date:   Sun Oct 17 13:01:15 2021 +0100

    media: ite-cir: IR receiver stop working after receive overflow
    
    commit fdc881783099c6343921ff017450831c8766d12a upstream.
    
    On an Intel NUC6iSYK, no IR is reported after a receive overflow.
    
    When a receiver overflow occurs, this condition is only cleared by
    reading the fifo. Make sure we read anything in the fifo.
    
    Fixes: 28c7afb07ccf ("media: ite-cir: check for receive overflow")
    Suggested-by: Bryan Pass <bryan.pass@gmail.com>
    Tested-by: Bryan Pass <bryan.pass@gmail.com>
    Cc: stable@vger.kernel.org>
    Signed-off-by: Sean Young <sean@mess.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/media/rc/ite-cir.c b/drivers/media/rc/ite-cir.c
index 18f3718315a8..679dd78382d7 100644
--- a/drivers/media/rc/ite-cir.c
+++ b/drivers/media/rc/ite-cir.c
@@ -292,7 +292,7 @@ static irqreturn_t ite_cir_isr(int irq, void *data)
 	}
 
 	/* check for the receive interrupt */
-	if (iflags & ITE_IRQ_RX_FIFO) {
+	if (iflags & (ITE_IRQ_RX_FIFO | ITE_IRQ_RX_FIFO_OVERRUN)) {
 		/* read the FIFO bytes */
 		rx_bytes =
 			dev->params.get_rx_bytes(dev, rx_buf,

commit 1955e6f3d4526b13ea9984834ea972fd3e54dfc6
Author: Tang Bin <tangbin@cmss.chinamobile.com>
Date:   Thu Oct 21 09:34:22 2021 +0800

    crypto: s5p-sss - Add error handling in s5p_aes_probe()
    
    commit a472cc0dde3eb057db71c80f102556eeced03805 upstream.
    
    The function s5p_aes_probe() does not perform sufficient error
    checking after executing platform_get_resource(), thus fix it.
    
    Fixes: c2afad6c6105 ("crypto: s5p-sss - Add HASH support for Exynos")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Tang Bin <tangbin@cmss.chinamobile.com>
    Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/crypto/s5p-sss.c b/drivers/crypto/s5p-sss.c
index b7216935236f..078f904b68cd 100644
--- a/drivers/crypto/s5p-sss.c
+++ b/drivers/crypto/s5p-sss.c
@@ -2166,6 +2166,8 @@ static int s5p_aes_probe(struct platform_device *pdev)
 
 	variant = find_s5p_sss_version(pdev);
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res)
+		return -EINVAL;
 
 	/*
 	 * Note: HASH and PRNG uses the same registers in secss, avoid

commit 68f5f8e20be75e86e85bc347c6679591dbcad3af
Author: jing yangyang <cgel.zte@gmail.com>
Date:   Thu Aug 19 19:30:16 2021 -0700

    firmware/psci: fix application of sizeof to pointer
    
    commit 2ac5fb35cd520ab1851c9a4816c523b65276052f upstream.
    
    sizeof when applied to a pointer typed expression gives the size of
    the pointer.
    
    ./drivers/firmware/psci/psci_checker.c:158:41-47: ERROR application of sizeof to pointer
    
    This issue was detected with the help of Coccinelle.
    
    Fixes: 7401056de5f8 ("drivers/firmware: psci_checker: stash and use topology_core_cpumask for hotplug tests")
    Cc: stable@vger.kernel.org
    Reported-by: Zeal Robot <zealci@zte.com.cn>
    Acked-by: Mark Rutland <mark.rutland@arm.com>
    Reviewed-by: Gustavo A. R. Silva <gustavoars@kernel.org>
    Signed-off-by: jing yangyang <jing.yangyang@zte.com.cn>
    Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/firmware/psci_checker.c b/drivers/firmware/psci_checker.c
index 9f1a913933d5..49b6a7be3a82 100644
--- a/drivers/firmware/psci_checker.c
+++ b/drivers/firmware/psci_checker.c
@@ -162,7 +162,7 @@ static int alloc_init_cpu_groups(cpumask_var_t **pcpu_groups)
 	if (!alloc_cpumask_var(&tmp, GFP_KERNEL))
 		return -ENOMEM;
 
-	cpu_groups = kcalloc(nb_available_cpus, sizeof(cpu_groups),
+	cpu_groups = kcalloc(nb_available_cpus, sizeof(*cpu_groups),
 			     GFP_KERNEL);
 	if (!cpu_groups) {
 		free_cpumask_var(tmp);

commit bf3a1a8c9120f0cc55dc65993674bc1ac1f2968a
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Wed Sep 8 08:33:57 2021 +0300

    tpm: Check for integer overflow in tpm2_map_response_body()
    
    commit a0bcce2b2a169e10eb265c8f0ebdd5ae4c875670 upstream.
    
    The "4 * be32_to_cpu(data->count)" multiplication can potentially
    overflow which would lead to memory corruption.  Add a check for that.
    
    Cc: stable@vger.kernel.org
    Fixes: 745b361e989a ("tpm: infrastructure for TPM spaces")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
    Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/char/tpm/tpm2-space.c b/drivers/char/tpm/tpm2-space.c
index 9f4e22dcde27..205d930d7ea6 100644
--- a/drivers/char/tpm/tpm2-space.c
+++ b/drivers/char/tpm/tpm2-space.c
@@ -419,6 +419,9 @@ static int tpm2_map_response_body(struct tpm_chip *chip, u32 cc, u8 *rsp,
 	if (be32_to_cpu(data->capability) != TPM2_CAP_HANDLES)
 		return 0;
 
+	if (be32_to_cpu(data->count) > (UINT_MAX - TPM_HEADER_SIZE - 9) / 4)
+		return -EFAULT;
+
 	if (len != TPM_HEADER_SIZE + 9 + 4 * be32_to_cpu(data->count))
 		return -EFAULT;
 

commit 380a415cecb66d69d33900577af1ee09330de37a
Author: Helge Deller <deller@gmx.de>
Date:   Tue Oct 5 00:27:49 2021 +0200

    parisc: Fix ptrace check on syscall return
    
    commit 8779e05ba8aaffec1829872ef9774a71f44f6580 upstream.
    
    The TIF_XXX flags are stored in the flags field in the thread_info
    struct (TI_FLAGS), not in the flags field of the task_struct structure
    (TASK_FLAGS).
    
    It seems this bug didn't generate any important side-effects, otherwise it
    wouldn't have went unnoticed for 12 years (since v2.6.32).
    
    Signed-off-by: Helge Deller <deller@gmx.de>
    Fixes: ecd3d4bc06e48 ("parisc: stop using task->ptrace for {single,block}step flags")
    Cc: Kyle McMartin <kyle@mcmartin.ca>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S
index d2f92273fe37..f7e09fbf78f5 100644
--- a/arch/parisc/kernel/entry.S
+++ b/arch/parisc/kernel/entry.S
@@ -1851,7 +1851,7 @@ syscall_restore:
 	LDREG	TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1
 
 	/* Are we being ptraced? */
-	ldw	TASK_FLAGS(%r1),%r19
+	LDREG	TI_FLAGS-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r19
 	ldi	_TIF_SYSCALL_TRACE_MASK,%r2
 	and,COND(=)	%r19,%r2,%r0
 	b,n	syscall_restore_rfi

commit 7c1c6160376bd62f29bcca0d87f17033a523e454
Author: Christian Löhle <CLoehle@hyperstone.com>
Date:   Thu Sep 16 05:59:19 2021 +0000

    mmc: dw_mmc: Dont wait for DRTO on Write RSP error
    
    commit 43592c8736e84025d7a45e61a46c3fa40536a364 upstream.
    
    Only wait for DRTO on reads, otherwise the driver hangs.
    
    The driver prevents sending CMD12 on response errors like CRCs. According
    to the comment this is because some cards have problems with this during
    the UHS tuning sequence. Unfortunately this workaround currently also
    applies for any command with data. On reads this will set the drto timer,
    which then triggers after a while. On writes this will not set any timer
    and the tasklet will not be scheduled again.
    
    I cannot test for the UHS workarounds need, but even if so, it should at
    most apply to reads. I have observed many hangs when CMD25 response
    contained a CRC error. This patch fixes this without touching the actual
    UHS tuning workaround.
    
    Signed-off-by: Christian Loehle <cloehle@hyperstone.com>
    Reviewed-by: Jaehoon Chung <jh80.chung@samsung.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/af8f8b8674ba4fcc9a781019e4aeb72c@hyperstone.com
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
index e3991df078ef..8570068c2be4 100644
--- a/drivers/mmc/host/dw_mmc.c
+++ b/drivers/mmc/host/dw_mmc.c
@@ -2039,7 +2039,8 @@ static void dw_mci_tasklet_func(unsigned long priv)
 				 * delayed. Allowing the transfer to take place
 				 * avoids races and keeps things simple.
 				 */
-				if (err != -ETIMEDOUT) {
+				if (err != -ETIMEDOUT &&
+				    host->dir_status == DW_MCI_RECV_STATUS) {
 					state = STATE_SENDING_DATA;
 					continue;
 				}

commit f625641fa13fb19f4052c4d7e8bfd7eafc0c8376
Author: Jan Kara <jack@suse.cz>
Date:   Fri Nov 5 13:34:55 2021 -0700

    ocfs2: fix data corruption on truncate
    
    commit 839b63860eb3835da165642923120d305925561d upstream.
    
    Patch series "ocfs2: Truncate data corruption fix".
    
    As further testing has shown, commit 5314454ea3f ("ocfs2: fix data
    corruption after conversion from inline format") didn't fix all the data
    corruption issues the customer started observing after 6dbf7bb55598
    ("fs: Don't invalidate page buffers in block_write_full_page()") This
    time I have tracked them down to two bugs in ocfs2 truncation code.
    
    One bug (truncating page cache before clearing tail cluster and setting
    i_size) could cause data corruption even before 6dbf7bb55598, but before
    that commit it needed a race with page fault, after 6dbf7bb55598 it
    started to be pretty deterministic.
    
    Another bug (zeroing pages beyond old i_size) used to be harmless
    inefficiency before commit 6dbf7bb55598.  But after commit 6dbf7bb55598
    in combination with the first bug it resulted in deterministic data
    corruption.
    
    Although fixing only the first problem is needed to stop data
    corruption, I've fixed both issues to make the code more robust.
    
    This patch (of 2):
    
    ocfs2_truncate_file() did unmap invalidate page cache pages before
    zeroing partial tail cluster and setting i_size.  Thus some pages could
    be left (and likely have left if the cluster zeroing happened) in the
    page cache beyond i_size after truncate finished letting user possibly
    see stale data once the file was extended again.  Also the tail cluster
    zeroing was not guaranteed to finish before truncate finished causing
    possible stale data exposure.  The problem started to be particularly
    easy to hit after commit 6dbf7bb55598 "fs: Don't invalidate page buffers
    in block_write_full_page()" stopped invalidation of pages beyond i_size
    from page writeback path.
    
    Fix these problems by unmapping and invalidating pages in the page cache
    after the i_size is reduced and tail cluster is zeroed out.
    
    Link: https://lkml.kernel.org/r/20211025150008.29002-1-jack@suse.cz
    Link: https://lkml.kernel.org/r/20211025151332.11301-1-jack@suse.cz
    Fixes: ccd979bdbce9 ("[PATCH] OCFS2: The Second Oracle Cluster Filesystem")
    Signed-off-by: Jan Kara <jack@suse.cz>
    Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
    Cc: Mark Fasheh <mark@fasheh.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Cc: Junxiao Bi <junxiao.bi@oracle.com>
    Cc: Changwei Ge <gechangwei@live.cn>
    Cc: Gang He <ghe@suse.com>
    Cc: Jun Piao <piaojun@huawei.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
index 6ca4dc57f70b..0141298bb2e5 100644
--- a/fs/ocfs2/file.c
+++ b/fs/ocfs2/file.c
@@ -492,10 +492,11 @@ int ocfs2_truncate_file(struct inode *inode,
 	 * greater than page size, so we have to truncate them
 	 * anyway.
 	 */
-	unmap_mapping_range(inode->i_mapping, new_i_size + PAGE_SIZE - 1, 0, 1);
-	truncate_inode_pages(inode->i_mapping, new_i_size);
 
 	if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) {
+		unmap_mapping_range(inode->i_mapping,
+				    new_i_size + PAGE_SIZE - 1, 0, 1);
+		truncate_inode_pages(inode->i_mapping, new_i_size);
 		status = ocfs2_truncate_inline(inode, di_bh, new_i_size,
 					       i_size_read(inode), 1);
 		if (status)
@@ -514,6 +515,9 @@ int ocfs2_truncate_file(struct inode *inode,
 		goto bail_unlock_sem;
 	}
 
+	unmap_mapping_range(inode->i_mapping, new_i_size + PAGE_SIZE - 1, 0, 1);
+	truncate_inode_pages(inode->i_mapping, new_i_size);
+
 	status = ocfs2_commit_truncate(osb, inode, di_bh);
 	if (status < 0) {
 		mlog_errno(status);

commit bf18a04bd0c55528f089d8eb4bfee2681fa3a9be
Author: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Date:   Thu Nov 4 17:31:58 2021 +0900

    libata: fix read log timeout value
    
    commit 68dbbe7d5b4fde736d104cbbc9a2fce875562012 upstream.
    
    Some ATA drives are very slow to respond to READ_LOG_EXT and
    READ_LOG_DMA_EXT commands issued from ata_dev_configure() when the
    device is revalidated right after resuming a system or inserting the
    ATA adapter driver (e.g. ahci). The default 5s timeout
    (ATA_EH_CMD_DFL_TIMEOUT) used for these commands is too short, causing
    errors during the device configuration. Ex:
    
    ...
    ata9: SATA max UDMA/133 abar m524288@0x9d200000 port 0x9d200400 irq 209
    ata9: SATA link up 6.0 Gbps (SStatus 133 SControl 300)
    ata9.00: ATA-9: XXX  XXXXXXXXXXXXXXX, XXXXXXXX, max UDMA/133
    ata9.00: qc timeout (cmd 0x2f)
    ata9.00: Read log page 0x00 failed, Emask 0x4
    ata9.00: Read log page 0x00 failed, Emask 0x40
    ata9.00: NCQ Send/Recv Log not supported
    ata9.00: Read log page 0x08 failed, Emask 0x40
    ata9.00: 27344764928 sectors, multi 16: LBA48 NCQ (depth 32), AA
    ata9.00: Read log page 0x00 failed, Emask 0x40
    ata9.00: ATA Identify Device Log not supported
    ata9.00: failed to set xfermode (err_mask=0x40)
    ata9: SATA link up 6.0 Gbps (SStatus 133 SControl 300)
    ata9.00: configured for UDMA/133
    ...
    
    The timeout error causes a soft reset of the drive link, followed in
    most cases by a successful revalidation as that give enough time to the
    drive to become fully ready to quickly process the read log commands.
    However, in some cases, this also fails resulting in the device being
    dropped.
    
    Fix this by using adding the ata_eh_revalidate_timeouts entries for the
    READ_LOG_EXT and READ_LOG_DMA_EXT commands. This defines a timeout
    increased to 15s, retriable one time.
    
    Reported-by: Geert Uytterhoeven <geert@linux-m68k.org>
    Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
    Cc: stable@vger.kernel.org
    Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index ccc80ff57eb2..096f29a2f710 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -114,6 +114,12 @@ static const unsigned long ata_eh_identify_timeouts[] = {
 	ULONG_MAX,
 };
 
+static const unsigned long ata_eh_revalidate_timeouts[] = {
+	15000,	/* Some drives are slow to read log pages when waking-up */
+	15000,  /* combined time till here is enough even for media access */
+	ULONG_MAX,
+};
+
 static const unsigned long ata_eh_flush_timeouts[] = {
 	15000,	/* be generous with flush */
 	15000,  /* ditto */
@@ -150,6 +156,8 @@ static const struct ata_eh_cmd_timeout_ent
 ata_eh_cmd_timeout_table[ATA_EH_CMD_TIMEOUT_TABLE_SIZE] = {
 	{ .commands = CMDS(ATA_CMD_ID_ATA, ATA_CMD_ID_ATAPI),
 	  .timeouts = ata_eh_identify_timeouts, },
+	{ .commands = CMDS(ATA_CMD_READ_LOG_EXT, ATA_CMD_READ_LOG_DMA_EXT),
+	  .timeouts = ata_eh_revalidate_timeouts, },
 	{ .commands = CMDS(ATA_CMD_READ_NATIVE_MAX, ATA_CMD_READ_NATIVE_MAX_EXT),
 	  .timeouts = ata_eh_other_timeouts, },
 	{ .commands = CMDS(ATA_CMD_SET_MAX, ATA_CMD_SET_MAX_EXT),
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 6d9194fb38df..73cd0182452c 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -408,7 +408,7 @@ enum {
 	/* This should match the actual table size of
 	 * ata_eh_cmd_timeout_table in libata-eh.c.
 	 */
-	ATA_EH_CMD_TIMEOUT_TABLE_SIZE = 6,
+	ATA_EH_CMD_TIMEOUT_TABLE_SIZE = 7,
 
 	/* Horkage types. May be set by libata or controller on drives
 	   (some horkage may be drive/controller pair dependent */

commit af1c9bd81ad148d5307cdbc32ff1dc1c2d0d4893
Author: Takashi Iwai <tiwai@suse.de>
Date:   Wed Nov 3 08:00:19 2021 +0100

    Input: i8042 - Add quirk for Fujitsu Lifebook T725
    
    commit 16e28abb7290c4ca3b3a0f333ba067f34bb18c86 upstream.
    
    Fujitsu Lifebook T725 laptop requires, like a few other similar
    models, the nomux and notimeout options to probe the touchpad
    properly.  This patch adds the corresponding quirk entries.
    
    BugLink: https://bugzilla.suse.com/show_bug.cgi?id=1191980
    Tested-by: Neal Gompa <ngompa13@gmail.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Link: https://lore.kernel.org/r/20211103070019.13374-1-tiwai@suse.de
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
index f20e54f41dde..c218e107c0c8 100644
--- a/drivers/input/serio/i8042-x86ia64io.h
+++ b/drivers/input/serio/i8042-x86ia64io.h
@@ -276,6 +276,13 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = {
 			DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S6230"),
 		},
 	},
+	{
+		/* Fujitsu Lifebook T725 laptop */
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T725"),
+		},
+	},
 	{
 		/* Fujitsu Lifebook U745 */
 		.matches = {
@@ -844,6 +851,13 @@ static const struct dmi_system_id __initconst i8042_dmi_notimeout_table[] = {
 			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK AH544"),
 		},
 	},
+	{
+		/* Fujitsu Lifebook T725 laptop */
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T725"),
+		},
+	},
 	{
 		/* Fujitsu U574 laptop */
 		/* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */

commit 5b533364ed2882fa281bc470b740397d5e344b1e
Author: Phoenix Huang <phoenix@emc.com.tw>
Date:   Sun Nov 7 22:00:03 2021 -0800

    Input: elantench - fix misreporting trackpoint coordinates
    
    commit be896bd3b72b44126c55768f14c22a8729b0992e upstream.
    
    Some firmwares occasionally report bogus data from trackpoint, with X or Y
    displacement being too large (outside of [-127, 127] range). Let's drop such
    packets so that we do not generate jumps.
    
    Signed-off-by: Phoenix Huang <phoenix@emc.com.tw>
    Tested-by: Yufei Du <yufeidu@cs.unc.edu>
    Link: https://lore.kernel.org/r/20210729010940.5752-1-phoenix@emc.com.tw
    Cc: stable@vger.kernel.org
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
index 530142b5a115..a18d17f7ef38 100644
--- a/drivers/input/mouse/elantech.c
+++ b/drivers/input/mouse/elantech.c
@@ -433,6 +433,19 @@ static void elantech_report_trackpoint(struct psmouse *psmouse,
 	case 0x16008020U:
 	case 0x26800010U:
 	case 0x36808000U:
+
+		/*
+		 * This firmware misreport coordinates for trackpoint
+		 * occasionally. Discard packets outside of [-127, 127] range
+		 * to prevent cursor jumps.
+		 */
+		if (packet[4] == 0x80 || packet[5] == 0x80 ||
+		    packet[1] >> 7 == packet[4] >> 7 ||
+		    packet[2] >> 7 == packet[5] >> 7) {
+			elantech_debug("discarding packet [%6ph]\n", packet);
+			break;
+
+		}
 		x = packet[4] - (int)((packet[1]^0x80) << 1);
 		y = (int)((packet[2]^0x80) << 1) - packet[5];
 

commit e82f3f9638f17d58e9a217bce127e2376aefcb9d
Author: Todd Kjos <tkjos@google.com>
Date:   Tue Oct 12 09:56:13 2021 -0700

    binder: use cred instead of task for selinux checks
    
    commit 52f88693378a58094c538662ba652aff0253c4fe upstream.
    
    Since binder was integrated with selinux, it has passed
    'struct task_struct' associated with the binder_proc
    to represent the source and target of transactions.
    The conversion of task to SID was then done in the hook
    implementations. It turns out that there are race conditions
    which can result in an incorrect security context being used.
    
    Fix by using the 'struct cred' saved during binder_open and pass
    it to the selinux subsystem.
    
    Cc: stable@vger.kernel.org # 5.14 (need backport for earlier stables)
    Fixes: 79af73079d75 ("Add security hooks to binder and implement the hooks for SELinux.")
    Suggested-by: Jann Horn <jannh@google.com>
    Signed-off-by: Todd Kjos <tkjos@google.com>
    Acked-by: Casey Schaufler <casey@schaufler-ca.com>
    Signed-off-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/android/binder.c b/drivers/android/binder.c
index 58e497db26b4..83be89c8627b 100644
--- a/drivers/android/binder.c
+++ b/drivers/android/binder.c
@@ -2337,7 +2337,7 @@ static int binder_translate_binder(struct flat_binder_object *fp,
 		ret = -EINVAL;
 		goto done;
 	}
-	if (security_binder_transfer_binder(proc->tsk, target_proc->tsk)) {
+	if (security_binder_transfer_binder(proc->cred, target_proc->cred)) {
 		ret = -EPERM;
 		goto done;
 	}
@@ -2383,7 +2383,7 @@ static int binder_translate_handle(struct flat_binder_object *fp,
 				  proc->pid, thread->pid, fp->handle);
 		return -EINVAL;
 	}
-	if (security_binder_transfer_binder(proc->tsk, target_proc->tsk)) {
+	if (security_binder_transfer_binder(proc->cred, target_proc->cred)) {
 		ret = -EPERM;
 		goto done;
 	}
@@ -2467,7 +2467,7 @@ static int binder_translate_fd(int fd,
 		ret = -EBADF;
 		goto err_fget;
 	}
-	ret = security_binder_transfer_file(proc->tsk, target_proc->tsk, file);
+	ret = security_binder_transfer_file(proc->cred, target_proc->cred, file);
 	if (ret < 0) {
 		ret = -EPERM;
 		goto err_security;
@@ -2851,8 +2851,8 @@ static void binder_transaction(struct binder_proc *proc,
 			return_error_line = __LINE__;
 			goto err_invalid_target_handle;
 		}
-		if (security_binder_transaction(proc->tsk,
-						target_proc->tsk) < 0) {
+		if (security_binder_transaction(proc->cred,
+						target_proc->cred) < 0) {
 			return_error = BR_FAILED_REPLY;
 			return_error_param = -EPERM;
 			return_error_line = __LINE__;
@@ -4549,7 +4549,7 @@ static int binder_ioctl_set_ctx_mgr(struct file *filp)
 		ret = -EBUSY;
 		goto out;
 	}
-	ret = security_binder_set_context_mgr(proc->tsk);
+	ret = security_binder_set_context_mgr(proc->cred);
 	if (ret < 0)
 		goto out;
 	if (uid_valid(context->binder_context_mgr_uid)) {
diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h
index 3833c871fd45..e65dace667d3 100644
--- a/include/linux/lsm_hooks.h
+++ b/include/linux/lsm_hooks.h
@@ -1211,22 +1211,22 @@
  *
  * @binder_set_context_mgr:
  *	Check whether @mgr is allowed to be the binder context manager.
- *	@mgr contains the task_struct for the task being registered.
+ *	@mgr contains the struct cred for the current binder process.
  *	Return 0 if permission is granted.
  * @binder_transaction:
  *	Check whether @from is allowed to invoke a binder transaction call
  *	to @to.
- *	@from contains the task_struct for the sending task.
- *	@to contains the task_struct for the receiving task.
+ *	@from contains the struct cred for the sending process.
+ *	@to contains the struct cred for the receiving process.
  * @binder_transfer_binder:
  *	Check whether @from is allowed to transfer a binder reference to @to.
- *	@from contains the task_struct for the sending task.
- *	@to contains the task_struct for the receiving task.
+ *	@from contains the struct cred for the sending process.
+ *	@to contains the struct cred for the receiving process.
  * @binder_transfer_file:
  *	Check whether @from is allowed to transfer @file to @to.
- *	@from contains the task_struct for the sending task.
+ *	@from contains the struct cred for the sending process.
  *	@file contains the struct file being transferred.
- *	@to contains the task_struct for the receiving task.
+ *	@to contains the struct cred for the receiving process.
  *
  * @ptrace_access_check:
  *	Check permission before allowing the current process to trace the
@@ -1428,13 +1428,13 @@
  *
  */
 union security_list_options {
-	int (*binder_set_context_mgr)(struct task_struct *mgr);
-	int (*binder_transaction)(struct task_struct *from,
-					struct task_struct *to);
-	int (*binder_transfer_binder)(struct task_struct *from,
-					struct task_struct *to);
-	int (*binder_transfer_file)(struct task_struct *from,
-					struct task_struct *to,
+	int (*binder_set_context_mgr)(const struct cred *mgr);
+	int (*binder_transaction)(const struct cred *from,
+					const struct cred *to);
+	int (*binder_transfer_binder)(const struct cred *from,
+					const struct cred *to);
+	int (*binder_transfer_file)(const struct cred *from,
+					const struct cred *to,
 					struct file *file);
 
 	int (*ptrace_access_check)(struct task_struct *child,
diff --git a/include/linux/security.h b/include/linux/security.h
index 454cc963d145..273877cf47bf 100644
--- a/include/linux/security.h
+++ b/include/linux/security.h
@@ -219,13 +219,13 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)
 extern int security_init(void);
 
 /* Security operations */
-int security_binder_set_context_mgr(struct task_struct *mgr);
-int security_binder_transaction(struct task_struct *from,
-				struct task_struct *to);
-int security_binder_transfer_binder(struct task_struct *from,
-				    struct task_struct *to);
-int security_binder_transfer_file(struct task_struct *from,
-				  struct task_struct *to, struct file *file);
+int security_binder_set_context_mgr(const struct cred *mgr);
+int security_binder_transaction(const struct cred *from,
+				const struct cred *to);
+int security_binder_transfer_binder(const struct cred *from,
+				    const struct cred *to);
+int security_binder_transfer_file(const struct cred *from,
+				  const struct cred *to, struct file *file);
 int security_ptrace_access_check(struct task_struct *child, unsigned int mode);
 int security_ptrace_traceme(struct task_struct *parent);
 int security_capget(struct task_struct *target,
@@ -442,25 +442,25 @@ static inline int security_init(void)
 	return 0;
 }
 
-static inline int security_binder_set_context_mgr(struct task_struct *mgr)
+static inline int security_binder_set_context_mgr(const struct cred *mgr)
 {
 	return 0;
 }
 
-static inline int security_binder_transaction(struct task_struct *from,
-					      struct task_struct *to)
+static inline int security_binder_transaction(const struct cred *from,
+					      const struct cred *to)
 {
 	return 0;
 }
 
-static inline int security_binder_transfer_binder(struct task_struct *from,
-						  struct task_struct *to)
+static inline int security_binder_transfer_binder(const struct cred *from,
+						  const struct cred *to)
 {
 	return 0;
 }
 
-static inline int security_binder_transfer_file(struct task_struct *from,
-						struct task_struct *to,
+static inline int security_binder_transfer_file(const struct cred *from,
+						const struct cred *to,
 						struct file *file)
 {
 	return 0;
diff --git a/security/security.c b/security/security.c
index 9478444bf93f..fc1410550b79 100644
--- a/security/security.c
+++ b/security/security.c
@@ -232,25 +232,25 @@ EXPORT_SYMBOL(unregister_lsm_notifier);
 
 /* Security operations */
 
-int security_binder_set_context_mgr(struct task_struct *mgr)
+int security_binder_set_context_mgr(const struct cred *mgr)
 {
 	return call_int_hook(binder_set_context_mgr, 0, mgr);
 }
 
-int security_binder_transaction(struct task_struct *from,
-				struct task_struct *to)
+int security_binder_transaction(const struct cred *from,
+				const struct cred *to)
 {
 	return call_int_hook(binder_transaction, 0, from, to);
 }
 
-int security_binder_transfer_binder(struct task_struct *from,
-				    struct task_struct *to)
+int security_binder_transfer_binder(const struct cred *from,
+				    const struct cred *to)
 {
 	return call_int_hook(binder_transfer_binder, 0, from, to);
 }
 
-int security_binder_transfer_file(struct task_struct *from,
-				  struct task_struct *to, struct file *file)
+int security_binder_transfer_file(const struct cred *from,
+				  const struct cred *to, struct file *file)
 {
 	return call_int_hook(binder_transfer_file, 0, from, to, file);
 }
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index 08833bbb97aa..89dfdbb13129 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -2218,22 +2218,19 @@ static inline u32 open_file_to_av(struct file *file)
 
 /* Hook functions begin here. */
 
-static int selinux_binder_set_context_mgr(struct task_struct *mgr)
+static int selinux_binder_set_context_mgr(const struct cred *mgr)
 {
-	u32 mysid = current_sid();
-	u32 mgrsid = task_sid(mgr);
-
 	return avc_has_perm(&selinux_state,
-			    mysid, mgrsid, SECCLASS_BINDER,
+			    current_sid(), cred_sid(mgr), SECCLASS_BINDER,
 			    BINDER__SET_CONTEXT_MGR, NULL);
 }
 
-static int selinux_binder_transaction(struct task_struct *from,
-				      struct task_struct *to)
+static int selinux_binder_transaction(const struct cred *from,
+				      const struct cred *to)
 {
 	u32 mysid = current_sid();
-	u32 fromsid = task_sid(from);
-	u32 tosid = task_sid(to);
+	u32 fromsid = cred_sid(from);
+	u32 tosid = cred_sid(to);
 	int rc;
 
 	if (mysid != fromsid) {
@@ -2244,27 +2241,24 @@ static int selinux_binder_transaction(struct task_struct *from,
 			return rc;
 	}
 
-	return avc_has_perm(&selinux_state,
-			    fromsid, tosid, SECCLASS_BINDER, BINDER__CALL,
-			    NULL);
+	return avc_has_perm(&selinux_state, fromsid, tosid,
+			    SECCLASS_BINDER, BINDER__CALL, NULL);
 }
 
-static int selinux_binder_transfer_binder(struct task_struct *from,
-					  struct task_struct *to)
+static int selinux_binder_transfer_binder(const struct cred *from,
+					  const struct cred *to)
 {
-	u32 fromsid = task_sid(from);
-	u32 tosid = task_sid(to);
-
 	return avc_has_perm(&selinux_state,
-			    fromsid, tosid, SECCLASS_BINDER, BINDER__TRANSFER,
+			    cred_sid(from), cred_sid(to),
+			    SECCLASS_BINDER, BINDER__TRANSFER,
 			    NULL);
 }
 
-static int selinux_binder_transfer_file(struct task_struct *from,
-					struct task_struct *to,
+static int selinux_binder_transfer_file(const struct cred *from,
+					const struct cred *to,
 					struct file *file)
 {
-	u32 sid = task_sid(to);
+	u32 sid = cred_sid(to);
 	struct file_security_struct *fsec = file->f_security;
 	struct dentry *dentry = file->f_path.dentry;
 	struct inode_security_struct *isec;

commit 5d40061285b81a7e213dc9b37acc4a0545eedf32
Author: Todd Kjos <tkjos@google.com>
Date:   Tue Oct 12 09:56:12 2021 -0700

    binder: use euid from cred instead of using task
    
    commit 29bc22ac5e5bc63275e850f0c8fc549e3d0e306b upstream.
    
    Save the 'struct cred' associated with a binder process
    at initial open to avoid potential race conditions
    when converting to an euid.
    
    Set a transaction's sender_euid from the 'struct cred'
    saved at binder_open() instead of looking up the euid
    from the binder proc's 'struct task'. This ensures
    the euid is associated with the security context that
    of the task that opened binder.
    
    Cc: stable@vger.kernel.org # 4.4+
    Fixes: 457b9a6f09f0 ("Staging: android: add binder driver")
    Signed-off-by: Todd Kjos <tkjos@google.com>
    Suggested-by: Stephen Smalley <stephen.smalley.work@gmail.com>
    Suggested-by: Jann Horn <jannh@google.com>
    Acked-by: Casey Schaufler <casey@schaufler-ca.com>
    Signed-off-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/android/binder.c b/drivers/android/binder.c
index cda4f7eb58ea..58e497db26b4 100644
--- a/drivers/android/binder.c
+++ b/drivers/android/binder.c
@@ -483,6 +483,9 @@ enum binder_deferred_state {
  * @files                 files_struct for process
  *                        (protected by @files_lock)
  * @files_lock            mutex to protect @files
+ * @cred                  struct cred associated with the `struct file`
+ *                        in binder_open()
+ *                        (invariant after initialized)
  * @deferred_work_node:   element for binder_deferred_list
  *                        (protected by binder_deferred_lock)
  * @deferred_work:        bitmap of deferred work to perform
@@ -529,6 +532,7 @@ struct binder_proc {
 	struct task_struct *tsk;
 	struct files_struct *files;
 	struct mutex files_lock;
+	const struct cred *cred;
 	struct hlist_node deferred_work_node;
 	int deferred_work;
 	bool is_dead;
@@ -2962,7 +2966,7 @@ static void binder_transaction(struct binder_proc *proc,
 		t->from = thread;
 	else
 		t->from = NULL;
-	t->sender_euid = task_euid(proc->tsk);
+	t->sender_euid = proc->cred->euid;
 	t->to_proc = target_proc;
 	t->to_thread = target_thread;
 	t->code = tr->code;
@@ -4341,6 +4345,7 @@ static void binder_free_proc(struct binder_proc *proc)
 	BUG_ON(!list_empty(&proc->delivered_death));
 	binder_alloc_deferred_release(&proc->alloc);
 	put_task_struct(proc->tsk);
+	put_cred(proc->cred);
 	binder_stats_deleted(BINDER_STAT_PROC);
 	kfree(proc);
 }
@@ -4799,6 +4804,7 @@ static int binder_open(struct inode *nodp, struct file *filp)
 	get_task_struct(current->group_leader);
 	proc->tsk = current->group_leader;
 	mutex_init(&proc->files_lock);
+	proc->cred = get_cred(filp->f_cred);
 	INIT_LIST_HEAD(&proc->todo);
 	proc->default_priority = task_nice(current);
 	binder_dev = container_of(filp->private_data, struct binder_device,

commit cb4a7f2739fd2dabfb94045963d8309c06f5e97d
Author: Mathias Nyman <mathias.nyman@linux.intel.com>
Date:   Fri Nov 5 18:00:36 2021 +0200

    xhci: Fix USB 3.1 enumeration issues by increasing roothub power-on-good delay
    
    commit e1959faf085b004e6c3afaaaa743381f00e7c015 upstream.
    
    Some USB 3.1 enumeration issues were reported after the hub driver removed
    the minimum 100ms limit for the power-on-good delay.
    
    Since commit 90d28fb53d4a ("usb: core: reduce power-on-good delay time of
    root hub") the hub driver sets the power-on-delay based on the
    bPwrOn2PwrGood value in the hub descriptor.
    
    xhci driver has a 20ms bPwrOn2PwrGood value for both roothubs based
    on xhci spec section 5.4.8, but it's clearly not enough for the
    USB 3.1 devices, causing enumeration issues.
    
    Tests indicate full 100ms delay is needed.
    
    Reported-by: Walt Jr. Brake <mr.yming81@gmail.com>
    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Fixes: 90d28fb53d4a ("usb: core: reduce power-on-good delay time of root hub")
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20211105160036.549516-1-mathias.nyman@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
index 9143e74b7051..224d0bdda82f 100644
--- a/drivers/usb/host/xhci-hub.c
+++ b/drivers/usb/host/xhci-hub.c
@@ -171,7 +171,6 @@ static void xhci_common_hub_descriptor(struct xhci_hcd *xhci,
 {
 	u16 temp;
 
-	desc->bPwrOn2PwrGood = 10;	/* xhci section 5.4.9 says 20ms max */
 	desc->bHubContrCurrent = 0;
 
 	desc->bNbrPorts = ports;
@@ -206,6 +205,7 @@ static void xhci_usb2_hub_descriptor(struct usb_hcd *hcd, struct xhci_hcd *xhci,
 	desc->bDescriptorType = USB_DT_HUB;
 	temp = 1 + (ports / 8);
 	desc->bDescLength = USB_DT_HUB_NONVAR_SIZE + 2 * temp;
+	desc->bPwrOn2PwrGood = 10;	/* xhci section 5.4.8 says 20ms */
 
 	/* The Device Removable bits are reported on a byte granularity.
 	 * If the port doesn't exist within that byte, the bit is set to 0.
@@ -258,6 +258,7 @@ static void xhci_usb3_hub_descriptor(struct usb_hcd *hcd, struct xhci_hcd *xhci,
 	xhci_common_hub_descriptor(xhci, desc, ports);
 	desc->bDescriptorType = USB_DT_SS_HUB;
 	desc->bDescLength = USB_DT_SS_HUB_SIZE;
+	desc->bPwrOn2PwrGood = 50;	/* usb 3.1 may fail if less than 100ms */
 
 	/* header decode latency should be zero for roothubs,
 	 * see section 4.23.5.2.

commit 4b382d7e3f500108b78e048281af56a4c507e3e1
Author: Herman Chen <herman.chen@rock-chips.com>
Date:   Fri Nov 26 16:56:48 2021 +0800

    video: rockchip: mpp: rkvdec2: setup link mode clk
    
    rk3568 rkvdec2 link mode should setup clock to max frequency on power on
    stage and keep the frequency unchanged until power off.
    
    Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
    Change-Id: I2a69f6d8b0a50c399f408320ca2b9bc4539b768a

diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c
index 1c0b0d9540d2..2bdeb9274236 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c
@@ -1030,6 +1030,11 @@ static void rkvdec2_link_power_on(struct mpp_dev *mpp)
 			enable_irq(mpp->irq);
 			link_dec->irq_enabled = 1;
 		}
+
+		mpp_clk_set_rate(&dec->aclk_info, CLK_MODE_ADVANCED);
+		mpp_clk_set_rate(&dec->core_clk_info, CLK_MODE_ADVANCED);
+		mpp_clk_set_rate(&dec->cabac_clk_info, CLK_MODE_ADVANCED);
+		mpp_clk_set_rate(&dec->hevc_cabac_clk_info, CLK_MODE_ADVANCED);
 	}
 }
 

commit 79ae2af2010acdbcb54b5a2cba6e05c8a8017966
Author: Lee Jones <lee.jones@linaro.org>
Date:   Thu Nov 25 11:52:14 2021 +0000

    ANDROID: usb: gadget: f_accessory: Mitgate handling of non-existent USB request
    
    Prevents mishandling USB requests that are no longer present.
    
    Bug: 161010552
    Fixes: 483cb5629ea78 ("ANDROID: usb: gadget: f_accessory: Add Android Accessory function")
    Signed-off-by: Lee Jones <lee.jones@linaro.org>
    Change-Id: I8ff24d6d49214c3bd10a1b5d5e72814ec2a91c61

diff --git a/drivers/usb/gadget/function/f_accessory.c b/drivers/usb/gadget/function/f_accessory.c
index 718e01e3190f..b6adf7d803ef 100644
--- a/drivers/usb/gadget/function/f_accessory.c
+++ b/drivers/usb/gadget/function/f_accessory.c
@@ -601,8 +601,11 @@ static int create_bulk_endpoints(struct acc_dev *dev,
 	pr_err("acc_bind() could not allocate requests\n");
 	while ((req = req_get(dev, &dev->tx_idle)))
 		acc_request_free(req, dev->ep_in);
-	for (i = 0; i < RX_REQ_MAX; i++)
+	for (i = 0; i < RX_REQ_MAX; i++) {
 		acc_request_free(dev->rx_req[i], dev->ep_out);
+		dev->rx_req[i] = NULL;
+	}
+
 	return -1;
 }
 
@@ -634,6 +637,12 @@ static ssize_t acc_read(struct file *fp, char __user *buf,
 		goto done;
 	}
 
+	if (!dev->rx_req[0]) {
+		pr_warn("acc_read: USB request already handled/freed");
+		r = -EINVAL;
+		goto done;
+	}
+
 	/*
 	 * Calculate the data length by considering termination character.
 	 * Then compansite the difference of rounding up to
@@ -1098,8 +1107,10 @@ acc_function_unbind(struct usb_configuration *c, struct usb_function *f)
 
 	while ((req = req_get(dev, &dev->tx_idle)))
 		acc_request_free(req, dev->ep_in);
-	for (i = 0; i < RX_REQ_MAX; i++)
+	for (i = 0; i < RX_REQ_MAX; i++) {
 		acc_request_free(dev->rx_req[i], dev->ep_out);
+		dev->rx_req[i] = NULL;
+	}
 
 	acc_hid_unbind(dev);
 }

commit 0a6cc0bb2f0c4b8077396b5fb0858c28784f0b52
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Wed Nov 24 21:05:09 2021 +0800

    drm/rockchip: ebc_dev: release version v2.16
    
    fix overlay mode err when system is 8bit buf
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: I7867b05b9321ce300433b9c656cf3384de7afb4d

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index 340bd54bfdea..0ea44039e6c6 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -1049,56 +1049,56 @@ get_overlay_image:
 	.p2align 3,,7
 	.type	waveform_open, %function
 waveform_open:
-.LFB2844:
-	.loc 1 2527 0
+.LFB2845:
+	.loc 1 2544 0
 	.cfi_startproc
 .LVL64:
-	.loc 1 2531 0
+	.loc 1 2548 0
 	mov	w0, 0
 .LVL65:
-	.loc 1 2528 0
+	.loc 1 2545 0
 	str	xzr, [x1, 104]
-	.loc 1 2531 0
+	.loc 1 2548 0
 	ret
 	.cfi_endproc
-.LFE2844:
+.LFE2845:
 	.size	waveform_open, .-waveform_open
 	.section	.exit.text,"ax",@progbits
 	.align	2
 	.type	ebc_exit, %function
 ebc_exit:
-.LFB2864:
-	.loc 1 3098 0
+.LFB2865:
+	.loc 1 3115 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3099 0
+	.loc 1 3116 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3098 0
+	.loc 1 3115 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3099 0
+	.loc 1 3116 0
 	bl	platform_driver_unregister
 .LVL66:
-	.loc 1 3100 0
+	.loc 1 3117 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2864:
+.LFE2865:
 	.size	ebc_exit, .-ebc_exit
 	.text
 	.align	2
 	.p2align 3,,7
 	.type	ebc_resume, %function
 ebc_resume:
-.LFB2862:
-	.loc 1 3060 0
+.LFB2863:
+	.loc 1 3077 0
 	.cfi_startproc
 .LVL67:
 	stp	x29, x30, [sp, -32]!
@@ -1109,17 +1109,17 @@ ebc_resume:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-.LBB944:
-.LBB945:
+.LBB950:
+.LBB951:
 	.file 2 "./include/linux/device.h"
 	.loc 2 1181 0
 	ldr	x19, [x0, 184]
-.LBE945:
-.LBE944:
-	.loc 1 3064 0
+.LBE951:
+.LBE950:
+	.loc 1 3081 0
 	ldr	x1, [x19, 16]
-.LBB946:
-.LBB947:
+.LBB952:
+.LBB953:
 	.file 3 "drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic.h"
 	.loc 3 45 0
 	mov	x0, x1
@@ -1127,17 +1127,17 @@ ebc_resume:
 	ldr	x1, [x1, 48]
 	blr	x1
 .LVL69:
-.LBE947:
-.LBE946:
-	.loc 1 3065 0
+.LBE953:
+.LBE952:
+	.loc 1 3082 0
 	str	wzr, [x19, 804]
-	.loc 1 3066 0
+	.loc 1 3083 0
 	ldr	x0, [x19, 288]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
 .LVL70:
-	.loc 1 3069 0
+	.loc 1 3086 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -1147,85 +1147,85 @@ ebc_resume:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2862:
+.LFE2863:
 	.size	ebc_resume, .-ebc_resume
 	.align	2
 	.p2align 3,,7
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
-.LFB2837:
-	.loc 1 2184 0
+.LFB2838:
+	.loc 1 2201 0
 	.cfi_startproc
 .LVL71:
-	.loc 1 2185 0
+	.loc 1 2202 0
 	adrp	x0, .LANCHOR0
 .LVL72:
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2187 0
+	.loc 1 2204 0
 	ldr	w2, [x0, 624]
 	cbnz	w2, .L144
 	ret
 	.p2align 3
 .L144:
-	.loc 1 2184 0
+	.loc 1 2201 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-.LBB948:
-.LBB949:
+.LBB954:
+.LBB955:
 	.file 4 "./include/linux/wakelock.h"
 	.loc 4 68 0
 	add	x0, x0, 416
-.LBE949:
-.LBE948:
-	.loc 1 2184 0
+.LBE955:
+.LBE954:
+	.loc 1 2201 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2188 0
+	.loc 1 2205 0
 	str	wzr, [x0, 208]
-.LBB951:
-.LBB950:
+.LBB957:
+.LBB956:
 	.loc 4 68 0
 	bl	__pm_relax
 .LVL73:
-.LBE950:
-.LBE951:
-	.loc 1 2193 0
+.LBE956:
+.LBE957:
+	.loc 1 2210 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2837:
+.LFE2838:
 	.size	ebc_vdd_power_timeout, .-ebc_vdd_power_timeout
 	.align	2
 	.p2align 3,,7
 	.type	ebc_remove, %function
 ebc_remove:
-.LFB2860:
-	.loc 1 3036 0
+.LFB2861:
+	.loc 1 3053 0
 	.cfi_startproc
 .LVL74:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3037 0
+	.loc 1 3054 0
 	adrp	x0, .LANCHOR1
 .LVL75:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3036 0
+	.loc 1 3053 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3037 0
+	.loc 1 3054 0
 	add	x0, x0, 224
-	.loc 1 3036 0
-	.loc 1 3037 0
+	.loc 1 3053 0
+	.loc 1 3054 0
 	bl	misc_deregister
 .LVL76:
-	.loc 1 3040 0
+	.loc 1 3057 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -1233,14 +1233,14 @@ ebc_remove:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2860:
+.LFE2861:
 	.size	ebc_remove, .-ebc_remove
 	.align	2
 	.p2align 3,,7
 	.type	ebc_mmap, %function
 ebc_mmap:
-.LFB2841:
-	.loc 1 2473 0
+.LFB2842:
+	.loc 1 2490 0
 	.cfi_startproc
 .LVL77:
 	stp	x29, x30, [sp, -32]!
@@ -1251,33 +1251,33 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2473 0
+	.loc 1 2490 0
 	mov	x19, x1
-	.loc 1 2476 0
+	.loc 1 2493 0
 	bl	ebc_phy_buf_base_get
 .LVL78:
-	.loc 1 2479 0
+	.loc 1 2496 0
 	lsr	x2, x0, 12
-	.loc 1 2477 0
+	.loc 1 2494 0
 	mov	x6, 16384
-	.loc 1 2479 0
+	.loc 1 2496 0
 	mov	x0, x19
-	.loc 1 2477 0
+	.loc 1 2494 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 2479 0
+	.loc 1 2496 0
 	ldp	x1, x3, [x19]
-	.loc 1 2477 0
+	.loc 1 2494 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 2479 0
+	.loc 1 2496 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
 .LVL79:
-	.loc 1 2482 0
+	.loc 1 2499 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 2485 0
+	.loc 1 2502 0
 	ldr	x19, [sp, 16]
 .LVL80:
 	csel	w0, w0, w1, eq
@@ -1288,54 +1288,54 @@ ebc_mmap:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2841:
+.LFE2842:
 	.size	ebc_mmap, .-ebc_mmap
 	.align	2
 	.p2align 3,,7
 	.type	waveform_mmap, %function
 waveform_mmap:
-.LFB2843:
-	.loc 1 2511 0
+.LFB2844:
+	.loc 1 2528 0
 	.cfi_startproc
 .LVL81:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2512 0
+	.loc 1 2529 0
 	adrp	x2, .LANCHOR0
-	.loc 1 2516 0
+	.loc 1 2533 0
 	mov	x7, 16384
-	.loc 1 2518 0
+	.loc 1 2535 0
 	mov	x0, x1
 .LVL82:
-	.loc 1 2511 0
+	.loc 1 2528 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2515 0
+	.loc 1 2532 0
 	ldr	x2, [x2, #:lo12:.LANCHOR0]
-	.loc 1 2516 0
+	.loc 1 2533 0
 	movk	x7, 0x404, lsl 16
 	ldp	x4, x5, [x1, 72]
-	.loc 1 2518 0
+	.loc 1 2535 0
 	ldp	x6, x3, [x1]
-	.loc 1 2516 0
+	.loc 1 2533 0
 	orr	x5, x5, x7
-	.loc 1 2515 0
+	.loc 1 2532 0
 	ldr	x2, [x2, 216]
-	.loc 1 2516 0
+	.loc 1 2533 0
 	str	x5, [x1, 80]
-	.loc 1 2518 0
+	.loc 1 2535 0
 	sub	x3, x3, x6
 	mov	x1, x6
 .LVL83:
 	lsr	x2, x2, 12
 	bl	remap_pfn_range
 .LVL84:
-	.loc 1 2521 0
+	.loc 1 2538 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 2524 0
+	.loc 1 2541 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1343,23 +1343,23 @@ waveform_mmap:
 	csel	w0, w0, w1, eq
 	ret
 	.cfi_endproc
-.LFE2843:
+.LFE2844:
 	.size	waveform_mmap, .-waveform_mmap
 	.align	2
 	.p2align 3,,7
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
-.LFB2840:
-	.loc 1 2269 0
+.LFB2841:
+	.loc 1 2286 0
 	.cfi_startproc
 .LVL85:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 2279 0
+	.loc 1 2296 0
 	cmp	w1, 28672
-	.loc 1 2269 0
+	.loc 1 2286 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -1373,15 +1373,15 @@ ebc_io_ctl:
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
 	.cfi_offset 23, -112
-	.loc 1 2269 0
+	.loc 1 2286 0
 	mov	x21, x2
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 2271 0
+	.loc 1 2288 0
 	adrp	x0, .LANCHOR0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2279 0
+	.loc 1 2296 0
 	bcc	.L156
 	mov	w0, 28675
 	cmp	w1, w0
@@ -1391,7 +1391,7 @@ ebc_io_ctl:
 	cmp	w0, 1
 	bls	.L157
 .L156:
-	.loc 1 2295 0
+	.loc 1 2312 0
 	mov	w0, 28677
 	cmp	w1, w0
 	beq	.L160
@@ -1407,13 +1407,13 @@ ebc_io_ctl:
 	mov	w0, 28683
 	cmp	w1, w0
 	bne	.L159
-	.loc 1 2450 0
+	.loc 1 2467 0
 	bl	ebc_empty_buf_get
 .LVL87:
 	mov	x23, x0
-	.loc 1 2451 0
+	.loc 1 2468 0
 	cbz	x0, .L180
-	.loc 1 2453 0
+	.loc 1 2470 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 408]
@@ -1424,18 +1424,18 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL88:
-	.loc 1 2454 0
+	.loc 1 2471 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL89:
 	sub	w0, w20, w0
-.LBB952:
-.LBB953:
-.LBB954:
-.LBB955:
-.LBB956:
-.LBB957:
 .LBB958:
+.LBB959:
+.LBB960:
+.LBB961:
+.LBB962:
+.LBB963:
+.LBB964:
 	.file 5 "./arch/arm64/include/asm/current.h"
 	.loc 5 19 0
 #APP
@@ -1444,27 +1444,27 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL90:
 #NO_APP
-.LBE958:
-.LBE957:
+.LBE964:
+.LBE963:
 	.file 6 "./arch/arm64/include/asm/uaccess.h"
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE956:
-.LBE955:
-.LBE954:
-.LBE953:
-.LBE952:
-	.loc 1 2456 0
+.LBE962:
+.LBE961:
+.LBE960:
+.LBE959:
+.LBE958:
+	.loc 1 2473 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 2455 0
+	.loc 1 2472 0
 	str	w0, [x29, 104]
-	.loc 1 2457 0
+	.loc 1 2474 0
 	stp	w4, w1, [x29, 112]
+.LBB989:
+.LBB986:
 .LBB983:
-.LBB980:
-.LBB977:
-.LBB967:
-.LBB965:
+.LBB973:
+.LBB971:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL91:
@@ -1472,47 +1472,47 @@ ebc_io_ctl:
 	tbnz	x3, 21, .L217
 .LVL92:
 .L283:
-.LBB959:
-.LBB960:
-.LBB961:
+.LBB965:
+.LBB966:
+.LBB967:
 	.file 7 "./include/asm-generic/bitops/non-atomic.h"
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL93:
-.LBE961:
-.LBE960:
-.LBE959:
-.LBE965:
 .LBE967:
-.LBE977:
-.LBE980:
+.LBE966:
+.LBE965:
+.LBE971:
+.LBE973:
 .LBE983:
-	.loc 1 2270 0
+.LBE986:
+.LBE989:
+	.loc 1 2287 0
 	mov	x0, x21
 .LVL94:
+.LBB990:
+.LBB987:
 .LBB984:
-.LBB981:
-.LBB978:
-.LBB968:
-.LBB966:
+.LBB974:
+.LBB972:
 	.loc 6 84 0
 	tbz	x2, 26, .L218
 .LVL95:
 .L217:
-.LBB962:
-.LBB963:
-.LBB964:
+.LBB968:
+.LBB969:
+.LBB970:
 	.file 8 "./include/linux/bitops.h"
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL96:
-.LBE964:
-.LBE963:
+.LBE970:
+.LBE969:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL97:
 .L218:
-.LBE962:
+.LBE968:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1525,46 +1525,46 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL98:
 #NO_APP
-.LBE966:
-.LBE968:
+.LBE972:
+.LBE974:
 	.file 9 "./include/linux/uaccess.h"
 	.loc 9 132 0
 	mov	x22, 48
 	cbnz	x0, .L291
 .L219:
-.LBE978:
-.LBE981:
 .LBE984:
-	.loc 1 2459 0
+.LBE987:
+.LBE990:
+	.loc 1 2476 0
 	mov	x0, x23
 .LVL99:
 	bl	ebc_buf_release
 .LVL100:
-	.loc 1 2460 0
+	.loc 1 2477 0
 	b	.L155
 .LVL101:
 	.p2align 3
 .L157:
-	.loc 1 2286 0
+	.loc 1 2303 0
 	cbnz	x21, .L156
-	.loc 1 2287 0
+	.loc 1 2304 0
 	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
 .LVL102:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC1
-	.loc 1 2288 0
+	.loc 1 2305 0
 	mov	x22, -14
-	.loc 1 2287 0
+	.loc 1 2304 0
 	bl	_dev_err
 .LVL103:
-	.loc 1 2288 0
+	.loc 1 2305 0
 	b	.L155
 .LVL104:
 	.p2align 3
 .L289:
-	.loc 1 2295 0
+	.loc 1 2312 0
 	mov	w0, 28674
 	cmp	w1, w0
 	beq	.L162
@@ -1575,23 +1575,23 @@ ebc_io_ctl:
 	mov	w0, 28676
 	cmp	w1, w0
 	bne	.L159
-	.loc 1 2381 0
+	.loc 1 2398 0
 	ldr	x0, [x20, 288]
-	.loc 1 2380 0
+	.loc 1 2397 0
 	mov	w2, 1
 	str	w2, [x20, 812]
-	.loc 1 2381 0
+	.loc 1 2398 0
 	adrp	x1, .LC2
 .LVL105:
-	.loc 1 2382 0
+	.loc 1 2399 0
 	mov	x22, 0
-	.loc 1 2381 0
+	.loc 1 2398 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
 .LVL106:
 	.p2align 2
 .L155:
-	.loc 1 2470 0
+	.loc 1 2487 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
 .LVL107:
@@ -1619,19 +1619,19 @@ ebc_io_ctl:
 	.p2align 3
 .L292:
 	.cfi_restore_state
-	.loc 1 2295 0
+	.loc 1 2312 0
 	cmp	w1, 28672
 	beq	.L164
 	mov	w0, 28673
 	cmp	w1, w0
 	bne	.L159
-.LBB985:
-.LBB986:
-.LBB987:
-.LBB988:
-.LBB989:
-.LBB990:
 .LBB991:
+.LBB992:
+.LBB993:
+.LBB994:
+.LBB995:
+.LBB996:
+.LBB997:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1639,8 +1639,8 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL111:
 #NO_APP
-.LBE991:
-.LBE990:
+.LBE997:
+.LBE996:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
@@ -1650,19 +1650,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L294
 .LVL113:
 .L185:
-.LBB992:
-.LBB993:
-.LBB994:
+.LBB998:
+.LBB999:
+.LBB1000:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL114:
-.LBE994:
-.LBE993:
+.LBE1000:
+.LBE999:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL115:
 .L186:
-.LBE992:
+.LBE998:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1675,23 +1675,23 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL116:
 #NO_APP
-.LBE989:
-.LBE988:
+.LBE995:
+.LBE994:
 	.loc 9 114 0
 	cbz	x0, .L188
-.LBB1000:
-.LBB1001:
-.LBB1002:
-.LBB1003:
-.LBB1004:
+.LBB1006:
+.LBB1007:
+.LBB1008:
+.LBB1009:
+.LBB1010:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL117:
-.LBE1004:
-.LBE1003:
-.LBE1002:
-.LBB1005:
-.LBB1006:
+.LBE1010:
+.LBE1009:
+.LBE1008:
+.LBB1011:
+.LBB1012:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1699,13 +1699,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL118:
 #NO_APP
-.LBE1006:
-.LBE1005:
-.LBB1007:
+.LBE1012:
+.LBE1011:
+.LBB1013:
 	.loc 6 254 0
 	and	x0, x0, x21
 .LVL119:
-.LBE1007:
+.LBE1013:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1720,8 +1720,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1001:
-.LBE1000:
+.LBE1007:
+.LBE1006:
 	.loc 9 116 0
 	mov	x2, 48
 	add	x0, x29, 104
@@ -1730,80 +1730,80 @@ ebc_io_ctl:
 .LVL122:
 	.loc 9 118 0
 	cbnz	x0, .L188
-.LBE987:
-.LBE986:
-.LBE985:
-	.loc 1 2335 0
+.LBE993:
+.LBE992:
+.LBE991:
+	.loc 1 2352 0
 	bl	ebc_phy_buf_base_get
 .LVL123:
 	ldrsw	x1, [x29, 104]
-	.loc 1 2336 0
+	.loc 1 2353 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
 .LVL124:
 	mov	x21, x0
 .LVL125:
-	.loc 1 2337 0
+	.loc 1 2354 0
 	cbz	x0, .L195
-	.loc 1 2338 0
+	.loc 1 2355 0
 	ldr	w1, [x29, 108]
-	.loc 1 2347 0
+	.loc 1 2364 0
 	add	x20, x20, 184
-	.loc 1 2338 0
+	.loc 1 2355 0
 	str	w1, [x21, 40]
-	.loc 1 2342 0
+	.loc 1 2359 0
 	ldp	w4, w2, [x29, 124]
 	stp	w4, w2, [x21, 48]
-	.loc 1 2341 0
+	.loc 1 2358 0
 	ldr	w3, [x29, 132]
-	.loc 1 2343 0
+	.loc 1 2360 0
 	ldr	w1, [x29, 136]
-	.loc 1 2339 0
+	.loc 1 2356 0
 	ldr	w5, [x29, 148]
-	.loc 1 2341 0
+	.loc 1 2358 0
 	str	w3, [x21, 56]
-	.loc 1 2339 0
+	.loc 1 2356 0
 	stp	w1, w5, [x21, 60]
-	.loc 1 2345 0
+	.loc 1 2362 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL126:
-	.loc 1 2347 0
+	.loc 1 2364 0
 	ldr	w0, [x20, 96]
 	cbz	w0, .L295
 .L190:
-	.loc 1 2351 0
+	.loc 1 2368 0
 	ldr	w0, [x21, 40]
 	cmp	w0, 18
 	beq	.L296
-	.loc 1 2351 0 is_stmt 0 discriminator 3
+	.loc 1 2368 0 is_stmt 0 discriminator 3
 	cmp	w0, 20
 	bne	.L195
 .L192:
-	.loc 1 2352 0 is_stmt 1
+	.loc 1 2369 0 is_stmt 1
 	mov	w0, 1
 	str	w0, [x20, 204]
-.LBB1014:
-.LBB1015:
-	.loc 1 2353 0
+.LBB1020:
+.LBB1021:
+	.loc 1 2370 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
 .LVL127:
 	adrp	x0, .LANCHOR1
-.LBB1016:
+.LBB1022:
 	add	x0, x0, :lo12:.LANCHOR1
 	add	x21, x0, 328
 	b	.L196
 	.p2align 3
 .L297:
 .LVL128:
-	.loc 1 2353 0 is_stmt 0 discriminator 5
+	.loc 1 2370 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L195
-	.loc 1 2353 0 discriminator 7
+	.loc 1 2370 0 discriminator 7
 	bl	schedule
 .LVL129:
 .L196:
-	.loc 1 2353 0 discriminator 9
+	.loc 1 2370 0 discriminator 9
 	add	x1, x29, 64
 	mov	w2, 1
 	mov	x0, x21
@@ -1811,8 +1811,8 @@ ebc_io_ctl:
 .LVL130:
 	ldr	w1, [x20, 204]
 	cbnz	w1, .L297
-.LBE1016:
-	.loc 1 2353 0 discriminator 4
+.LBE1022:
+	.loc 1 2370 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
 	bl	finish_wait
@@ -1824,15 +1824,15 @@ ebc_io_ctl:
 .LVL132:
 	.p2align 3
 .L172:
-.LBE1015:
-.LBE1014:
-	.loc 1 2437 0 is_stmt 1
+.LBE1021:
+.LBE1020:
+	.loc 1 2454 0 is_stmt 1
 	bl	ebc_empty_buf_get
 .LVL133:
 	mov	x23, x0
-	.loc 1 2438 0
+	.loc 1 2455 0
 	cbz	x0, .L180
-	.loc 1 2440 0
+	.loc 1 2457 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 344]
@@ -1842,20 +1842,20 @@ ebc_io_ctl:
 .LVL134:
 	.p2align 3
 .L290:
-	.loc 1 2295 0
+	.loc 1 2312 0
 	mov	w0, 28678
 	cmp	w1, w0
 	beq	.L170
 	mov	w0, 28679
 	cmp	w1, w0
 	bne	.L159
-.LBB1020:
-.LBB1021:
-.LBB1022:
-.LBB1023:
-.LBB1024:
-.LBB1025:
 .LBB1026:
+.LBB1027:
+.LBB1028:
+.LBB1029:
+.LBB1030:
+.LBB1031:
+.LBB1032:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1863,8 +1863,8 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL135:
 #NO_APP
-.LBE1026:
-.LBE1025:
+.LBE1032:
+.LBE1031:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
@@ -1874,19 +1874,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L298
 .LVL137:
 .L197:
-.LBB1027:
-.LBB1028:
-.LBB1029:
+.LBB1033:
+.LBB1034:
+.LBB1035:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL138:
-.LBE1029:
-.LBE1028:
+.LBE1035:
+.LBE1034:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL139:
 .L198:
-.LBE1027:
+.LBE1033:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1899,23 +1899,23 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL140:
 #NO_APP
-.LBE1024:
-.LBE1023:
+.LBE1030:
+.LBE1029:
 	.loc 9 114 0
 	cbz	x0, .L188
-.LBB1035:
-.LBB1036:
-.LBB1037:
-.LBB1038:
-.LBB1039:
+.LBB1041:
+.LBB1042:
+.LBB1043:
+.LBB1044:
+.LBB1045:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL141:
-.LBE1039:
-.LBE1038:
-.LBE1037:
-.LBB1040:
-.LBB1041:
+.LBE1045:
+.LBE1044:
+.LBE1043:
+.LBB1046:
+.LBB1047:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1923,13 +1923,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL142:
 #NO_APP
-.LBE1041:
-.LBE1040:
-.LBB1042:
+.LBE1047:
+.LBE1046:
+.LBB1048:
 	.loc 6 254 0
 	and	x0, x0, x21
 .LVL143:
-.LBE1042:
+.LBE1048:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1944,8 +1944,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1036:
-.LBE1035:
+.LBE1042:
+.LBE1041:
 	.loc 9 116 0
 	mov	x2, 48
 	add	x0, x29, 104
@@ -1954,39 +1954,39 @@ ebc_io_ctl:
 .LVL146:
 	.loc 9 118 0
 	cbnz	x0, .L188
-.LBE1022:
-.LBE1021:
-.LBE1020:
-	.loc 1 2362 0
+.LBE1028:
+.LBE1027:
+.LBE1026:
+	.loc 1 2379 0
 	bl	ebc_osd_buf_clone
 .LVL147:
 	mov	x1, x0
-	.loc 1 2363 0
+	.loc 1 2380 0
 	cbz	x0, .L195
-	.loc 1 2364 0
+	.loc 1 2381 0
 	ldr	w6, [x29, 108]
-	.loc 1 2373 0
+	.loc 1 2390 0
 	add	x20, x20, 184
-	.loc 1 2368 0
+	.loc 1 2385 0
 	ldp	w5, w3, [x29, 124]
-	.loc 1 2364 0
+	.loc 1 2381 0
 	str	w6, [x1, 40]
-	.loc 1 2369 0
+	.loc 1 2386 0
 	ldp	w4, w2, [x29, 132]
-	.loc 1 2368 0
+	.loc 1 2385 0
 	stp	w5, w3, [x1, 48]
-	.loc 1 2369 0
+	.loc 1 2386 0
 	stp	w4, w2, [x1, 56]
-	.loc 1 2371 0
+	.loc 1 2388 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL148:
-	.loc 1 2373 0
+	.loc 1 2390 0
 	ldr	w0, [x20, 96]
 	cbnz	w0, .L195
-	.loc 1 2374 0
+	.loc 1 2391 0
 	mov	w2, 1
 	str	w2, [x20, 96]
-	.loc 1 2375 0
+	.loc 1 2392 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -1998,22 +1998,22 @@ ebc_io_ctl:
 .LVL150:
 	.p2align 3
 .L291:
-.LBB1049:
-.LBB982:
+.LBB1055:
+.LBB988:
+.LBB985:
+.LBB975:
+.LBB976:
+.LBB977:
+.LBB978:
 .LBB979:
-.LBB969:
-.LBB970:
-.LBB971:
-.LBB972:
-.LBB973:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL151:
-.LBE973:
-.LBE972:
-.LBE971:
-.LBB974:
-.LBB975:
+.LBE979:
+.LBE978:
+.LBE977:
+.LBB980:
+.LBB981:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2021,13 +2021,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL152:
 #NO_APP
-.LBE975:
-.LBE974:
-.LBB976:
+.LBE981:
+.LBE980:
+.LBB982:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL153:
-.LBE976:
+.LBE982:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL154:
@@ -2043,8 +2043,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE970:
-.LBE969:
+.LBE976:
+.LBE975:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
@@ -2056,27 +2056,27 @@ ebc_io_ctl:
 .LVL158:
 	.p2align 3
 .L170:
-.LBE979:
-.LBE982:
-.LBE1049:
-	.loc 1 2297 0
+.LBE985:
+.LBE988:
+.LBE1055:
+	.loc 1 2314 0
 	bl	ebc_osd_buf_get
 .LVL159:
-	.loc 1 2298 0
+	.loc 1 2315 0
 	cbz	x0, .L180
-	.loc 1 2301 0
+	.loc 1 2318 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL160:
-	.loc 1 2306 0
+	.loc 1 2323 0
 	ldr	w1, [x20, 176]
-.LBB1050:
-.LBB1051:
-.LBB1052:
-.LBB1053:
-.LBB1054:
-.LBB1055:
 .LBB1056:
+.LBB1057:
+.LBB1058:
+.LBB1059:
+.LBB1060:
+.LBB1061:
+.LBB1062:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2084,34 +2084,34 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL161:
 #NO_APP
-.LBE1056:
-.LBE1055:
+.LBE1062:
+.LBE1061:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1054:
-.LBE1053:
-.LBE1052:
-.LBE1051:
-.LBE1050:
-	.loc 1 2301 0
+.LBE1060:
+.LBE1059:
+.LBE1058:
+.LBE1057:
+.LBE1056:
+	.loc 1 2318 0
 	sub	w0, w22, w0
-	.loc 1 2305 0
+	.loc 1 2322 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 2306 0
+	.loc 1 2323 0
 	str	w1, [x29, 120]
-	.loc 1 2304 0
+	.loc 1 2321 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 2307 0
+	.loc 1 2324 0
 	mov	w1, 16
-	.loc 1 2303 0
+	.loc 1 2320 0
 	str	w0, [x29, 104]
-	.loc 1 2307 0
+	.loc 1 2324 0
 	str	w1, [x29, 148]
+.LBB1089:
+.LBB1086:
 .LBB1083:
-.LBB1080:
-.LBB1077:
-.LBB1066:
-.LBB1063:
+.LBB1072:
+.LBB1069:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL162:
@@ -2119,19 +2119,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L299
 .LVL163:
 .L176:
-.LBB1057:
-.LBB1058:
-.LBB1059:
+.LBB1063:
+.LBB1064:
+.LBB1065:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL164:
-.LBE1059:
-.LBE1058:
+.LBE1065:
+.LBE1064:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL165:
 .L177:
-.LBE1057:
+.LBE1063:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2144,24 +2144,24 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL166:
 #NO_APP
-.LBE1063:
-.LBE1066:
+.LBE1069:
+.LBE1072:
 	.loc 9 132 0
 	mov	x22, 48
 	cbz	x0, .L155
-.LBB1067:
-.LBB1068:
-.LBB1069:
-.LBB1070:
-.LBB1071:
+.LBB1073:
+.LBB1074:
+.LBB1075:
+.LBB1076:
+.LBB1077:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL167:
-.LBE1071:
-.LBE1070:
-.LBE1069:
-.LBB1072:
-.LBB1073:
+.LBE1077:
+.LBE1076:
+.LBE1075:
+.LBB1078:
+.LBB1079:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2169,13 +2169,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL168:
 #NO_APP
-.LBE1073:
-.LBE1072:
-.LBB1074:
+.LBE1079:
+.LBE1078:
+.LBB1080:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL169:
-.LBE1074:
+.LBE1080:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL170:
@@ -2191,8 +2191,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1068:
-.LBE1067:
+.LBE1074:
+.LBE1073:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
@@ -2204,39 +2204,39 @@ ebc_io_ctl:
 .LVL174:
 	.p2align 3
 .L166:
-.LBE1077:
-.LBE1080:
 .LBE1083:
-.LBB1084:
-.LBB1085:
-.LBB1086:
-.LBB1087:
-.LBB1088:
-.LBB1089:
+.LBE1086:
+.LBE1089:
 .LBB1090:
-	.loc 5 19 0
-#APP
-// 19 "./arch/arm64/include/asm/current.h" 1
-	mrs x0, sp_el0
-// 0 "" 2
+.LBB1091:
+.LBB1092:
+.LBB1093:
+.LBB1094:
+.LBB1095:
+.LBB1096:
+	.loc 5 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x0, sp_el0
+// 0 "" 2
 .LVL175:
 #NO_APP
-.LBE1090:
-.LBE1089:
+.LBE1096:
+.LBE1095:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
-.LBE1088:
-.LBE1087:
-.LBE1086:
-.LBE1085:
-.LBE1084:
-	.loc 1 2389 0
+.LBE1094:
+.LBE1093:
+.LBE1092:
+.LBE1091:
+.LBE1090:
+	.loc 1 2406 0
 	add	x22, x20, 248
-.LBB1119:
-.LBB1115:
-.LBB1111:
-.LBB1100:
-.LBB1097:
+.LBB1125:
+.LBB1121:
+.LBB1117:
+.LBB1106:
+.LBB1103:
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
 .LVL176:
@@ -2244,19 +2244,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L300
 .LVL177:
 .L200:
-.LBB1091:
-.LBB1092:
-.LBB1093:
+.LBB1097:
+.LBB1098:
+.LBB1099:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL178:
-.LBE1093:
-.LBE1092:
+.LBE1099:
+.LBE1098:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL179:
 .L201:
-.LBE1091:
+.LBE1097:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2270,22 +2270,22 @@ ebc_io_ctl:
 .LVL180:
 #NO_APP
 	mov	x3, x0
-.LBE1097:
-.LBE1100:
+.LBE1103:
+.LBE1106:
 	.loc 9 114 0
 	cbz	x0, .L229
-.LBB1101:
-.LBB1102:
-.LBB1103:
-.LBB1104:
-.LBB1105:
+.LBB1107:
+.LBB1108:
+.LBB1109:
+.LBB1110:
+.LBB1111:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LBE1105:
-.LBE1104:
-.LBE1103:
-.LBB1106:
-.LBB1107:
+.LBE1111:
+.LBE1110:
+.LBE1109:
+.LBB1112:
+.LBB1113:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2293,13 +2293,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL181:
 #NO_APP
-.LBE1107:
-.LBE1106:
-.LBB1108:
+.LBE1113:
+.LBE1112:
+.LBB1114:
 	.loc 6 254 0
 	and	x0, x0, x21
 .LVL182:
-.LBE1108:
+.LBE1114:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -2314,8 +2314,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1102:
-.LBE1101:
+.LBE1108:
+.LBE1107:
 	.loc 9 116 0
 	mov	x2, 4
 	mov	x0, x22
@@ -2324,52 +2324,52 @@ ebc_io_ctl:
 .LVL185:
 	.loc 9 118 0
 	cbnz	x0, .L301
-.LBE1111:
-.LBE1115:
-.LBE1119:
-	.loc 1 2393 0
+.LBE1117:
+.LBE1121:
+.LBE1125:
+	.loc 1 2410 0
 	add	x20, x20, 184
 	ldr	w2, [x20, 64]
 	ldr	x0, [x20, 104]
 .LVL186:
-	.loc 1 2394 0
+	.loc 1 2411 0
 	mov	x22, 0
-	.loc 1 2393 0
+	.loc 1 2410 0
 	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	_dev_info
 .LVL187:
-	.loc 1 2394 0
+	.loc 1 2411 0
 	b	.L155
 .LVL188:
 	.p2align 3
 .L160:
-	.loc 1 2386 0
+	.loc 1 2403 0
 	ldr	x0, [x20, 288]
 	adrp	x1, .LC3
 .LVL189:
-	.loc 1 2384 0
+	.loc 1 2401 0
 	str	wzr, [x20, 812]
-	.loc 1 2387 0
+	.loc 1 2404 0
 	mov	x22, 0
-	.loc 1 2385 0
+	.loc 1 2402 0
 	str	wzr, [x20, 816]
-	.loc 1 2386 0
+	.loc 1 2403 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
 .LVL190:
-	.loc 1 2387 0
+	.loc 1 2404 0
 	b	.L155
 .LVL191:
 	.p2align 3
 .L168:
-	.loc 1 2424 0
+	.loc 1 2441 0
 	bl	ebc_empty_buf_get
 .LVL192:
 	mov	x23, x0
-	.loc 1 2425 0
+	.loc 1 2442 0
 	cbz	x0, .L180
-	.loc 1 2427 0
+	.loc 1 2444 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 336]
@@ -2379,13 +2379,13 @@ ebc_io_ctl:
 .LVL193:
 	.p2align 3
 .L173:
-	.loc 1 2411 0
+	.loc 1 2428 0
 	bl	ebc_empty_buf_get
 .LVL194:
 	mov	x23, x0
-	.loc 1 2412 0
+	.loc 1 2429 0
 	cbz	x0, .L180
-	.loc 1 2414 0
+	.loc 1 2431 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 328]
@@ -2394,18 +2394,18 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL195:
-	.loc 1 2415 0
+	.loc 1 2432 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL196:
 	sub	w0, w20, w0
-.LBB1120:
-.LBB1121:
-.LBB1122:
-.LBB1123:
-.LBB1124:
-.LBB1125:
 .LBB1126:
+.LBB1127:
+.LBB1128:
+.LBB1129:
+.LBB1130:
+.LBB1131:
+.LBB1132:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2413,26 +2413,26 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL197:
 #NO_APP
-.LBE1126:
-.LBE1125:
+.LBE1132:
+.LBE1131:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1124:
-.LBE1123:
-.LBE1122:
-.LBE1121:
-.LBE1120:
-	.loc 1 2418 0
+.LBE1130:
+.LBE1129:
+.LBE1128:
+.LBE1127:
+.LBE1126:
+	.loc 1 2435 0
 	ldp	w4, w1, [x22, 84]
-	.loc 1 2416 0
+	.loc 1 2433 0
 	str	w0, [x29, 104]
-	.loc 1 2417 0
+	.loc 1 2434 0
 	stp	w1, w4, [x29, 112]
-.LBB1131:
-.LBB1130:
-.LBB1129:
-.LBB1128:
-.LBB1127:
+.LBB1137:
+.LBB1136:
+.LBB1135:
+.LBB1134:
+.LBB1133:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL198:
@@ -2442,21 +2442,21 @@ ebc_io_ctl:
 .LVL199:
 	.p2align 3
 .L162:
-.LBE1127:
-.LBE1128:
-.LBE1129:
-.LBE1130:
-.LBE1131:
-	.loc 1 2400 0
+.LBE1133:
+.LBE1134:
+.LBE1135:
+.LBE1136:
+.LBE1137:
+	.loc 1 2417 0
 	ldp	w1, w0, [x20, 116]
 .LVL200:
-.LBB1132:
-.LBB1133:
-.LBB1134:
-.LBB1135:
-.LBB1136:
-.LBB1137:
 .LBB1138:
+.LBB1139:
+.LBB1140:
+.LBB1141:
+.LBB1142:
+.LBB1143:
+.LBB1144:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2464,34 +2464,34 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL201:
 #NO_APP
-.LBE1138:
-.LBE1137:
+.LBE1144:
+.LBE1143:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1136:
-.LBE1135:
-.LBE1134:
-.LBE1133:
-.LBE1132:
-	.loc 1 2397 0
+.LBE1142:
+.LBE1141:
+.LBE1140:
+.LBE1139:
+.LBE1138:
+	.loc 1 2414 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 2400 0
+	.loc 1 2417 0
 	stp	w1, w0, [x29, 140]
-	.loc 1 2398 0
+	.loc 1 2415 0
 	ldr	w4, [x20, 176]
-	.loc 1 2401 0
+	.loc 1 2418 0
 	mov	w0, 16
-	.loc 1 2396 0
+	.loc 1 2413 0
 	stp	w5, w6, [x29, 112]
-	.loc 1 2398 0
+	.loc 1 2415 0
 	str	w4, [x29, 120]
-	.loc 1 2401 0
+	.loc 1 2418 0
 	str	w0, [x29, 148]
-.LBB1167:
-.LBB1163:
-.LBB1159:
-.LBB1148:
-.LBB1145:
+.LBB1173:
+.LBB1169:
+.LBB1165:
+.LBB1154:
+.LBB1151:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL202:
@@ -2499,19 +2499,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L302
 .LVL203:
 .L204:
-.LBB1139:
-.LBB1140:
-.LBB1141:
+.LBB1145:
+.LBB1146:
+.LBB1147:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL204:
-.LBE1141:
-.LBE1140:
+.LBE1147:
+.LBE1146:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL205:
 .L205:
-.LBE1139:
+.LBE1145:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2524,66 +2524,66 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL206:
 #NO_APP
-.LBE1145:
-.LBE1148:
+.LBE1151:
+.LBE1154:
 	.loc 9 132 0
 	cbnz	x0, .L206
 .L207:
-.LBE1159:
-.LBE1163:
-.LBE1167:
-	.loc 1 2404 0
+.LBE1165:
+.LBE1169:
+.LBE1173:
+	.loc 1 2421 0
 	ldr	x0, [x20, 288]
 .LVL207:
 	adrp	x1, .LC5
 .LVL208:
-	.loc 1 2405 0
+	.loc 1 2422 0
 	mov	x22, -14
-	.loc 1 2404 0
+	.loc 1 2421 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
 .LVL209:
-	.loc 1 2405 0
+	.loc 1 2422 0
 	b	.L155
 .LVL210:
 	.p2align 3
 .L159:
-	.loc 1 2465 0
+	.loc 1 2482 0
 	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
 .LVL211:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
-	.loc 1 2466 0
+	.loc 1 2483 0
 	mov	x22, 0
-	.loc 1 2465 0
+	.loc 1 2482 0
 	bl	_dev_err
 .LVL212:
-	.loc 1 2469 0
+	.loc 1 2486 0
 	b	.L155
 .LVL213:
 	.p2align 3
 .L164:
-	.loc 1 2312 0
+	.loc 1 2329 0
 	bl	ebc_empty_buf_get
 .LVL214:
 	mov	x23, x0
-	.loc 1 2313 0
+	.loc 1 2330 0
 	cbz	x0, .L180
-	.loc 1 2316 0
+	.loc 1 2333 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL215:
-	.loc 1 2321 0
+	.loc 1 2338 0
 	ldr	w1, [x20, 176]
-.LBB1168:
-.LBB1169:
-.LBB1170:
-.LBB1171:
-.LBB1172:
-.LBB1173:
 .LBB1174:
+.LBB1175:
+.LBB1176:
+.LBB1177:
+.LBB1178:
+.LBB1179:
+.LBB1180:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2591,34 +2591,34 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL216:
 #NO_APP
-.LBE1174:
-.LBE1173:
+.LBE1180:
+.LBE1179:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1172:
-.LBE1171:
-.LBE1170:
-.LBE1169:
-.LBE1168:
-	.loc 1 2316 0
+.LBE1178:
+.LBE1177:
+.LBE1176:
+.LBE1175:
+.LBE1174:
+	.loc 1 2333 0
 	sub	w0, w22, w0
-	.loc 1 2320 0
+	.loc 1 2337 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 2321 0
+	.loc 1 2338 0
 	str	w1, [x29, 120]
-	.loc 1 2319 0
+	.loc 1 2336 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 2322 0
+	.loc 1 2339 0
 	mov	w1, 16
-	.loc 1 2318 0
+	.loc 1 2335 0
 	str	w0, [x29, 104]
-	.loc 1 2322 0
+	.loc 1 2339 0
 	str	w1, [x29, 148]
-.LBB1203:
-.LBB1199:
-.LBB1195:
-.LBB1184:
-.LBB1181:
+.LBB1209:
+.LBB1205:
+.LBB1201:
+.LBB1190:
+.LBB1187:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL217:
@@ -2626,19 +2626,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L303
 .LVL218:
 .L181:
-.LBB1175:
-.LBB1176:
-.LBB1177:
+.LBB1181:
+.LBB1182:
+.LBB1183:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL219:
-.LBE1177:
-.LBE1176:
+.LBE1183:
+.LBE1182:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL220:
 .L182:
-.LBE1175:
+.LBE1181:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2651,268 +2651,268 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL221:
 #NO_APP
-.LBE1181:
-.LBE1184:
+.LBE1187:
+.LBE1190:
 	.loc 9 132 0
 	cbnz	x0, .L183
 .L184:
-.LBE1195:
-.LBE1199:
-.LBE1203:
-	.loc 1 2326 0
+.LBE1201:
+.LBE1205:
+.LBE1209:
+	.loc 1 2343 0
 	mov	x0, x23
 .LVL222:
-	.loc 1 2327 0
+	.loc 1 2344 0
 	mov	x22, -14
-	.loc 1 2326 0
+	.loc 1 2343 0
 	bl	ebc_buf_release
 .LVL223:
-	.loc 1 2327 0
+	.loc 1 2344 0
 	b	.L155
 .LVL224:
 	.p2align 3
 .L298:
-.LBB1204:
-.LBB1047:
-.LBB1045:
-.LBB1043:
-.LBB1033:
-.LBB1030:
-.LBB1031:
-.LBB1032:
+.LBB1210:
+.LBB1053:
+.LBB1051:
+.LBB1049:
+.LBB1039:
+.LBB1036:
+.LBB1037:
+.LBB1038:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1032:
-.LBE1031:
-.LBE1030:
-.LBE1033:
-.LBE1043:
-.LBE1045:
-.LBE1047:
-.LBE1204:
-	.loc 1 2270 0
+.LBE1038:
+.LBE1037:
+.LBE1036:
+.LBE1039:
+.LBE1049:
+.LBE1051:
+.LBE1053:
+.LBE1210:
+	.loc 1 2287 0
 	mov	x0, x21
 .LVL225:
-.LBB1205:
-.LBB1048:
-.LBB1046:
-.LBB1044:
-.LBB1034:
+.LBB1211:
+.LBB1054:
+.LBB1052:
+.LBB1050:
+.LBB1040:
 	.loc 6 84 0
 	tbz	x2, 26, .L198
 	b	.L197
 .LVL226:
 	.p2align 3
 .L294:
-.LBE1034:
-.LBE1044:
-.LBE1046:
-.LBE1048:
-.LBE1205:
-.LBB1206:
-.LBB1012:
-.LBB1010:
-.LBB1008:
-.LBB998:
-.LBB995:
-.LBB996:
-.LBB997:
+.LBE1040:
+.LBE1050:
+.LBE1052:
+.LBE1054:
+.LBE1211:
+.LBB1212:
+.LBB1018:
+.LBB1016:
+.LBB1014:
+.LBB1004:
+.LBB1001:
+.LBB1002:
+.LBB1003:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE997:
-.LBE996:
-.LBE995:
-.LBE998:
-.LBE1008:
-.LBE1010:
-.LBE1012:
-.LBE1206:
-	.loc 1 2270 0
+.LBE1003:
+.LBE1002:
+.LBE1001:
+.LBE1004:
+.LBE1014:
+.LBE1016:
+.LBE1018:
+.LBE1212:
+	.loc 1 2287 0
 	mov	x0, x21
 .LVL227:
-.LBB1207:
-.LBB1013:
-.LBB1011:
-.LBB1009:
-.LBB999:
+.LBB1213:
+.LBB1019:
+.LBB1017:
+.LBB1015:
+.LBB1005:
 	.loc 6 84 0
 	tbz	x2, 26, .L186
 	b	.L185
 .LVL228:
 	.p2align 3
 .L302:
-.LBE999:
-.LBE1009:
-.LBE1011:
-.LBE1013:
-.LBE1207:
-.LBB1208:
-.LBB1164:
-.LBB1160:
+.LBE1005:
+.LBE1015:
+.LBE1017:
+.LBE1019:
+.LBE1213:
+.LBB1214:
+.LBB1170:
+.LBB1166:
+.LBB1155:
+.LBB1152:
+.LBB1148:
 .LBB1149:
-.LBB1146:
-.LBB1142:
-.LBB1143:
-.LBB1144:
+.LBB1150:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL229:
-.LBE1144:
-.LBE1143:
-.LBE1142:
-.LBE1146:
+.LBE1150:
 .LBE1149:
-.LBE1160:
-.LBE1164:
-.LBE1208:
-	.loc 1 2270 0
+.LBE1148:
+.LBE1152:
+.LBE1155:
+.LBE1166:
+.LBE1170:
+.LBE1214:
+	.loc 1 2287 0
 	mov	x0, x21
 .LVL230:
-.LBB1209:
-.LBB1165:
-.LBB1161:
-.LBB1150:
-.LBB1147:
+.LBB1215:
+.LBB1171:
+.LBB1167:
+.LBB1156:
+.LBB1153:
 	.loc 6 84 0
 	tbz	x2, 26, .L205
 	b	.L204
 .LVL231:
 	.p2align 3
 .L300:
-.LBE1147:
-.LBE1150:
-.LBE1161:
-.LBE1165:
-.LBE1209:
-.LBB1210:
-.LBB1116:
-.LBB1112:
-.LBB1109:
-.LBB1098:
-.LBB1094:
-.LBB1095:
-.LBB1096:
+.LBE1153:
+.LBE1156:
+.LBE1167:
+.LBE1171:
+.LBE1215:
+.LBB1216:
+.LBB1122:
+.LBB1118:
+.LBB1115:
+.LBB1104:
+.LBB1100:
+.LBB1101:
+.LBB1102:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1096:
-.LBE1095:
-.LBE1094:
-.LBE1098:
-.LBE1109:
-.LBE1112:
-.LBE1116:
-.LBE1210:
-	.loc 1 2270 0
+.LBE1102:
+.LBE1101:
+.LBE1100:
+.LBE1104:
+.LBE1115:
+.LBE1118:
+.LBE1122:
+.LBE1216:
+	.loc 1 2287 0
 	mov	x0, x21
 .LVL232:
-.LBB1211:
-.LBB1117:
-.LBB1113:
-.LBB1110:
-.LBB1099:
+.LBB1217:
+.LBB1123:
+.LBB1119:
+.LBB1116:
+.LBB1105:
 	.loc 6 84 0
 	tbz	x2, 26, .L201
 	b	.L200
 .LVL233:
 	.p2align 3
 .L303:
-.LBE1099:
-.LBE1110:
-.LBE1113:
-.LBE1117:
-.LBE1211:
-.LBB1212:
-.LBB1200:
-.LBB1196:
+.LBE1105:
+.LBE1116:
+.LBE1119:
+.LBE1123:
+.LBE1217:
+.LBB1218:
+.LBB1206:
+.LBB1202:
+.LBB1191:
+.LBB1188:
+.LBB1184:
 .LBB1185:
-.LBB1182:
-.LBB1178:
-.LBB1179:
-.LBB1180:
+.LBB1186:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL234:
-.LBE1180:
-.LBE1179:
-.LBE1178:
-.LBE1182:
+.LBE1186:
 .LBE1185:
-.LBE1196:
-.LBE1200:
-.LBE1212:
-	.loc 1 2270 0
+.LBE1184:
+.LBE1188:
+.LBE1191:
+.LBE1202:
+.LBE1206:
+.LBE1218:
+	.loc 1 2287 0
 	mov	x0, x21
 .LVL235:
-.LBB1213:
-.LBB1201:
-.LBB1197:
-.LBB1186:
-.LBB1183:
+.LBB1219:
+.LBB1207:
+.LBB1203:
+.LBB1192:
+.LBB1189:
 	.loc 6 84 0
 	tbz	x2, 26, .L182
 	b	.L181
 .LVL236:
 	.p2align 3
 .L299:
-.LBE1183:
-.LBE1186:
-.LBE1197:
-.LBE1201:
-.LBE1213:
-.LBB1214:
+.LBE1189:
+.LBE1192:
+.LBE1203:
+.LBE1207:
+.LBE1219:
+.LBB1220:
+.LBB1087:
+.LBB1084:
 .LBB1081:
-.LBB1078:
-.LBB1075:
-.LBB1064:
-.LBB1060:
-.LBB1061:
-.LBB1062:
+.LBB1070:
+.LBB1066:
+.LBB1067:
+.LBB1068:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL237:
-.LBE1062:
-.LBE1061:
-.LBE1060:
-.LBE1064:
-.LBE1075:
-.LBE1078:
+.LBE1068:
+.LBE1067:
+.LBE1066:
+.LBE1070:
 .LBE1081:
-.LBE1214:
-	.loc 1 2270 0
+.LBE1084:
+.LBE1087:
+.LBE1220:
+	.loc 1 2287 0
 	mov	x0, x21
 .LVL238:
-.LBB1215:
+.LBB1221:
+.LBB1088:
+.LBB1085:
 .LBB1082:
-.LBB1079:
-.LBB1076:
-.LBB1065:
+.LBB1071:
 	.loc 6 84 0
 	tbz	x2, 26, .L177
 	b	.L176
 .LVL239:
 	.p2align 3
 .L206:
-.LBE1065:
-.LBE1076:
-.LBE1079:
+.LBE1071:
 .LBE1082:
-.LBE1215:
-.LBB1216:
-.LBB1166:
-.LBB1162:
-.LBB1151:
-.LBB1152:
-.LBB1153:
-.LBB1154:
-.LBB1155:
+.LBE1085:
+.LBE1088:
+.LBE1221:
+.LBB1222:
+.LBB1172:
+.LBB1168:
+.LBB1157:
+.LBB1158:
+.LBB1159:
+.LBB1160:
+.LBB1161:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL240:
-.LBE1155:
-.LBE1154:
-.LBE1153:
-.LBB1156:
-.LBB1157:
+.LBE1161:
+.LBE1160:
+.LBE1159:
+.LBB1162:
+.LBB1163:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2920,13 +2920,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL241:
 #NO_APP
-.LBE1157:
-.LBE1156:
-.LBB1158:
+.LBE1163:
+.LBE1162:
+.LBB1164:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL242:
-.LBE1158:
+.LBE1164:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL243:
@@ -2942,44 +2942,44 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1152:
-.LBE1151:
+.LBE1158:
+.LBE1157:
 	.loc 9 134 0
 	mov	x2, 48
 	add	x1, x29, 104
 .LVL245:
 	bl	__arch_copy_to_user
 .LVL246:
-.LBE1162:
-.LBE1166:
-.LBE1216:
-	.loc 1 2403 0
+.LBE1168:
+.LBE1172:
+.LBE1222:
+	.loc 1 2420 0
 	cbnz	x0, .L207
-.LBB1217:
-.LBB1017:
+.LBB1223:
+.LBB1023:
 	mov	x22, 0
 	b	.L155
 .LVL247:
 	.p2align 3
 .L183:
-.LBE1017:
-.LBE1217:
-.LBB1218:
-.LBB1202:
-.LBB1198:
-.LBB1187:
-.LBB1188:
-.LBB1189:
-.LBB1190:
-.LBB1191:
+.LBE1023:
+.LBE1223:
+.LBB1224:
+.LBB1208:
+.LBB1204:
+.LBB1193:
+.LBB1194:
+.LBB1195:
+.LBB1196:
+.LBB1197:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL248:
-.LBE1191:
-.LBE1190:
-.LBE1189:
-.LBB1192:
-.LBB1193:
+.LBE1197:
+.LBE1196:
+.LBE1195:
+.LBB1198:
+.LBB1199:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2987,13 +2987,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL249:
 #NO_APP
-.LBE1193:
-.LBE1192:
-.LBB1194:
+.LBE1199:
+.LBE1198:
+.LBB1200:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL250:
-.LBE1194:
+.LBE1200:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL251:
@@ -3009,38 +3009,38 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1188:
-.LBE1187:
+.LBE1194:
+.LBE1193:
 	.loc 9 134 0
 	mov	x2, 48
 	add	x1, x29, 104
 .LVL253:
 	bl	__arch_copy_to_user
 .LVL254:
-.LBE1198:
-.LBE1202:
-.LBE1218:
-	.loc 1 2325 0
+.LBE1204:
+.LBE1208:
+.LBE1224:
+	.loc 1 2342 0
 	cbnz	w0, .L184
-.LBB1219:
-.LBB1018:
+.LBB1225:
+.LBB1024:
 	mov	x22, 0
 	b	.L155
 .LVL255:
 	.p2align 3
 .L188:
-.LBE1018:
-.LBE1219:
-	.loc 1 2333 0
+.LBE1024:
+.LBE1225:
+	.loc 1 2350 0
 	mov	x22, -14
 	b	.L155
 .LVL256:
 	.p2align 3
 .L295:
-	.loc 1 2348 0
+	.loc 1 2365 0
 	mov	w2, 1
 	str	w2, [x20, 96]
-	.loc 1 2349 0
+	.loc 1 2366 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -3050,25 +3050,25 @@ ebc_io_ctl:
 	b	.L190
 	.p2align 3
 .L296:
-	.loc 1 2351 0 discriminator 1
+	.loc 1 2368 0 discriminator 1
 	ldr	w0, [x20, 616]
 	cbz	w0, .L192
-.LBB1220:
-.LBB1019:
+.LBB1226:
+.LBB1025:
 	mov	x22, 0
 	b	.L155
 .LVL258:
 .L180:
-.LBE1019:
-.LBE1220:
-	.loc 1 2299 0
+.LBE1025:
+.LBE1226:
+	.loc 1 2316 0
 	mov	x22, -1
 	b	.L155
 .LVL259:
 .L229:
-.LBB1221:
-.LBB1118:
-.LBB1114:
+.LBB1227:
+.LBB1124:
+.LBB1120:
 	.loc 9 112 0
 	mov	x0, 4
 .LVL260:
@@ -3081,22 +3081,22 @@ ebc_io_ctl:
 .LVL262:
 	bl	memset
 .LVL263:
-.LBE1114:
-.LBE1118:
-.LBE1221:
-	.loc 1 2390 0
+.LBE1120:
+.LBE1124:
+.LBE1227:
+	.loc 1 2407 0
 	ldr	x0, [x20, 288]
 	adrp	x1, .LC4
-	.loc 1 2391 0
+	.loc 1 2408 0
 	mov	x22, -14
-	.loc 1 2390 0
+	.loc 1 2407 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
 .LVL264:
-	.loc 1 2391 0
+	.loc 1 2408 0
 	b	.L155
 .L293:
-	.loc 1 2470 0
+	.loc 1 2487 0
 	bl	__stack_chk_fail
 .LVL265:
 .L301:
@@ -3105,7 +3105,7 @@ ebc_io_ctl:
 .LVL266:
 	b	.L202
 	.cfi_endproc
-.LFE2840:
+.LFE2841:
 	.size	ebc_io_ctl, .-ebc_io_ctl
 	.align	2
 	.p2align 3,,7
@@ -3297,8 +3297,8 @@ frame_done_callback:
 	.p2align 3,,7
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
-.LFB2838:
-	.loc 1 2196 0
+.LFB2839:
+	.loc 1 2213 0
 	.cfi_startproc
 .LVL277:
 	stp	x29, x30, [sp, -16]!
@@ -3307,17 +3307,17 @@ ebc_frame_timeout:
 	.cfi_offset 30, -8
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2197 0
+	.loc 1 2214 0
 	bl	frame_done_callback
 .LVL278:
-	.loc 1 2199 0
+	.loc 1 2216 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2838:
+.LFE2839:
 	.size	ebc_frame_timeout, .-ebc_frame_timeout
 	.align	2
 	.p2align 3,,7
@@ -3363,8 +3363,8 @@ ebc_lut_update:
 	.loc 1 1684 0
 	str	w4, [x0, -12]!
 .LVL282:
-.LBB1222:
-.LBB1223:
+.LBB1228:
+.LBB1229:
 	.loc 3 50 0
 	mov	x1, x0
 	mov	x0, x2
@@ -3372,8 +3372,8 @@ ebc_lut_update:
 	blr	x2
 .LVL283:
 	mov	w20, w0
-.LBE1223:
-.LBE1222:
+.LBE1229:
+.LBE1228:
 	.loc 1 1691 0
 	cbnz	w0, .L315
 .LVL284:
@@ -3624,24 +3624,24 @@ ebc_lut_update:
 	.p2align 3,,7
 	.type	ebc_buf_state_read, %function
 ebc_buf_state_read:
-.LFB2852:
-	.loc 1 2638 0
+.LFB2853:
+	.loc 1 2655 0
 	.cfi_startproc
 .LVL306:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2639 0
+	.loc 1 2656 0
 	mov	x0, x2
 .LVL307:
-	.loc 1 2638 0
+	.loc 1 2655 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2639 0
+	.loc 1 2656 0
 	bl	ebc_buf_state_show
 .LVL308:
-	.loc 1 2640 0
+	.loc 1 2657 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3649,39 +3649,39 @@ ebc_buf_state_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2852:
+.LFE2853:
 	.size	ebc_buf_state_read, .-ebc_buf_state_read
 	.align	2
 	.p2align 3,,7
 	.type	ebc_state_read, %function
 ebc_state_read:
-.LFB2851:
-	.loc 1 2629 0
+.LFB2852:
+	.loc 1 2646 0
 	.cfi_startproc
 .LVL309:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2630 0
+	.loc 1 2647 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2629 0
+	.loc 1 2646 0
 	mov	x0, x2
 .LVL310:
-	.loc 1 2630 0
+	.loc 1 2647 0
 	adrp	x1, .LC15
 .LVL311:
-	.loc 1 2629 0
+	.loc 1 2646 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2630 0
+	.loc 1 2647 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL312:
 	add	x1, x1, :lo12:.LC15
 	ldr	w2, [x2, 624]
 	bl	sprintf
 .LVL313:
-	.loc 1 2631 0
+	.loc 1 2648 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3689,14 +3689,14 @@ ebc_state_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2851:
+.LFE2852:
 	.size	ebc_state_read, .-ebc_state_read
 	.align	2
 	.p2align 3,,7
 	.type	ebc_version_read, %function
 ebc_version_read:
-.LFB2850:
-	.loc 1 2620 0
+.LFB2851:
+	.loc 1 2637 0
 	.cfi_startproc
 .LVL314:
 	stp	x29, x30, [sp, -16]!
@@ -3705,22 +3705,22 @@ ebc_version_read:
 	.cfi_offset 30, -8
 	mov	x0, x2
 .LVL315:
-	.loc 1 2621 0
+	.loc 1 2638 0
 	adrp	x1, .LC17
 .LVL316:
 	adrp	x2, .LC16
 .LVL317:
-	.loc 1 2620 0
+	.loc 1 2637 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2621 0
+	.loc 1 2638 0
 	add	x2, x2, :lo12:.LC16
-	.loc 1 2620 0
-	.loc 1 2621 0
+	.loc 1 2637 0
+	.loc 1 2638 0
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
 .LVL318:
-	.loc 1 2622 0
+	.loc 1 2639 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3728,53 +3728,53 @@ ebc_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2850:
+.LFE2851:
 	.size	ebc_version_read, .-ebc_version_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
-.LFB2848:
-	.loc 1 2584 0
+.LFB2849:
+	.loc 1 2601 0
 	.cfi_startproc
 .LVL319:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 2585 0
+	.loc 1 2602 0
 	adrp	x0, .LANCHOR0
 .LVL320:
-	.loc 1 2584 0
+	.loc 1 2601 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2588 0
+	.loc 1 2605 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2584 0
+	.loc 1 2601 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2584 0
+	.loc 1 2601 0
 	mov	x19, x2
-	.loc 1 2588 0
+	.loc 1 2605 0
 	ldr	x1, [x0, 16]
 .LVL321:
-.LBB1224:
-.LBB1225:
+.LBB1230:
+.LBB1231:
 	.loc 3 55 0
 	mov	x0, x1
 	ldr	x1, [x1, 64]
 	blr	x1
 .LVL322:
-.LBE1225:
-.LBE1224:
-	.loc 1 2590 0
+.LBE1231:
+.LBE1230:
+	.loc 1 2607 0
 	mov	w2, w0
 	adrp	x1, .LC15
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
 .LVL323:
-	.loc 1 2591 0
+	.loc 1 2608 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL324:
@@ -3785,40 +3785,40 @@ pmic_vcom_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2848:
+.LFE2849:
 	.size	pmic_vcom_read, .-pmic_vcom_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_temp_read, %function
 pmic_temp_read:
-.LFB2847:
-	.loc 1 2570 0
+.LFB2848:
+	.loc 1 2587 0
 	.cfi_startproc
 .LVL325:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 2571 0
+	.loc 1 2588 0
 	adrp	x0, .LANCHOR0
 .LVL326:
-	.loc 1 2570 0
+	.loc 1 2587 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2574 0
+	.loc 1 2591 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-.LBB1226:
-.LBB1227:
+.LBB1232:
+.LBB1233:
 	.loc 3 50 0
 	add	x1, x29, 36
 .LVL327:
-.LBE1227:
-.LBE1226:
-	.loc 1 2570 0
+.LBE1233:
+.LBE1232:
+	.loc 1 2587 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 2570 0
+	.loc 1 2587 0
 	adrp	x19, __stack_chk_guard
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x20, x2
@@ -3826,25 +3826,25 @@ pmic_temp_read:
 	str	x2, [x29, 40]
 	mov	x2,0
 .LVL328:
-	.loc 1 2574 0
+	.loc 1 2591 0
 	ldr	x2, [x0, 16]
-.LBB1229:
-.LBB1228:
+.LBB1235:
+.LBB1234:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
 .LVL329:
-.LBE1228:
-.LBE1229:
-	.loc 1 2576 0
+.LBE1234:
+.LBE1235:
+	.loc 1 2593 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC15
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
 .LVL330:
-	.loc 1 2577 0
+	.loc 1 2594 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
@@ -3866,32 +3866,32 @@ pmic_temp_read:
 	bl	__stack_chk_fail
 .LVL333:
 	.cfi_endproc
-.LFE2847:
+.LFE2848:
 	.size	pmic_temp_read, .-pmic_temp_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_name_read, %function
 pmic_name_read:
-.LFB2846:
-	.loc 1 2559 0
+.LFB2847:
+	.loc 1 2576 0
 	.cfi_startproc
 .LVL334:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2560 0
+	.loc 1 2577 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2559 0
+	.loc 1 2576 0
 	mov	x0, x2
 .LVL335:
-	.loc 1 2562 0
+	.loc 1 2579 0
 	adrp	x1, .LC17
 .LVL336:
-	.loc 1 2559 0
+	.loc 1 2576 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2562 0
+	.loc 1 2579 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL337:
 	add	x1, x1, :lo12:.LC17
@@ -3899,7 +3899,7 @@ pmic_name_read:
 	add	x2, x2, 8
 	bl	sprintf
 .LVL338:
-	.loc 1 2563 0
+	.loc 1 2580 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3907,24 +3907,24 @@ pmic_name_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2846:
+.LFE2847:
 	.size	pmic_name_read, .-pmic_name_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
-.LFB2849:
-	.loc 1 2596 0
+.LFB2850:
+	.loc 1 2613 0
 	.cfi_startproc
 .LVL339:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 2597 0
+	.loc 1 2614 0
 	adrp	x0, .LANCHOR0
 .LVL340:
-	.loc 1 2596 0
+	.loc 1 2613 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -3934,37 +3934,37 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 2596 0
+	.loc 1 2613 0
 	add	x1, x19, :lo12:__stack_chk_guard
 .LVL341:
 	mov	x21, x2
-	.loc 1 2597 0
+	.loc 1 2614 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
 .LVL342:
-	.loc 1 2596 0
+	.loc 1 2613 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
 .LVL343:
 	mov	x20, x3
-	.loc 1 2600 0
+	.loc 1 2617 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
 .LVL344:
-	.loc 1 2601 0
+	.loc 1 2618 0
 	cbnz	w0, .L364
 .LVL345:
-	.loc 1 2605 0
+	.loc 1 2622 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
 .LVL346:
-	.loc 1 2606 0
+	.loc 1 2623 0
 	cbnz	w0, .L365
 .L357:
-	.loc 1 2612 0
+	.loc 1 2629 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
 .LVL347:
@@ -3989,47 +3989,47 @@ pmic_vcom_write:
 	.p2align 3
 .L364:
 	.cfi_restore_state
-	.loc 1 2602 0
+	.loc 1 2619 0
 	ldr	x0, [x22]
 	adrp	x1, .LC18
 	mov	x2, x21
 	add	x1, x1, :lo12:.LC18
-	.loc 1 2603 0
+	.loc 1 2620 0
 	mov	x20, -1
 .LVL350:
-	.loc 1 2602 0
+	.loc 1 2619 0
 	bl	_dev_err
 .LVL351:
-	.loc 1 2603 0
+	.loc 1 2620 0
 	b	.L357
 .LVL352:
 	.p2align 3
 .L365:
-	.loc 1 2607 0
+	.loc 1 2624 0
 	ldr	x0, [x22]
 	adrp	x1, .LC19
-	.loc 1 2608 0
+	.loc 1 2625 0
 	mov	x20, -1
 .LVL353:
-	.loc 1 2607 0
+	.loc 1 2624 0
 	add	x1, x1, :lo12:.LC19
 	bl	_dev_err
 .LVL354:
-	.loc 1 2608 0
+	.loc 1 2625 0
 	b	.L357
 .L366:
-	.loc 1 2612 0
+	.loc 1 2629 0
 	bl	__stack_chk_fail
 .LVL355:
 	.cfi_endproc
-.LFE2849:
+.LFE2850:
 	.size	pmic_vcom_write, .-pmic_vcom_write
 	.align	2
 	.p2align 3,,7
 	.type	waveform_version_read, %function
 waveform_version_read:
-.LFB2845:
-	.loc 1 2548 0
+.LFB2846:
+	.loc 1 2565 0
 	.cfi_startproc
 .LVL356:
 	stp	x29, x30, [sp, -32]!
@@ -4040,19 +4040,19 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2548 0
+	.loc 1 2565 0
 	mov	x19, x2
-	.loc 1 2549 0
+	.loc 1 2566 0
 	bl	epd_lut_get_wf_version
 .LVL357:
-	.loc 1 2551 0
+	.loc 1 2568 0
 	mov	x2, x0
 	adrp	x1, .LC17
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
 .LVL358:
-	.loc 1 2552 0
+	.loc 1 2569 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL359:
@@ -4063,37 +4063,37 @@ waveform_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2845:
+.LFE2846:
 	.size	waveform_version_read, .-waveform_version_read
 	.section	.init.text,"ax",@progbits
 	.align	2
 	.type	ebc_init, %function
 ebc_init:
-.LFB2863:
-	.loc 1 3093 0
+.LFB2864:
+	.loc 1 3110 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3094 0
+	.loc 1 3111 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3093 0
+	.loc 1 3110 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3094 0
+	.loc 1 3111 0
 	bl	__platform_driver_register
 .LVL360:
-	.loc 1 3095 0
+	.loc 1 3112 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2863:
+.LFE2864:
 	.size	ebc_init, .-ebc_init
 	.text
 	.align	2
@@ -4125,8 +4125,8 @@ direct_mode_data_change:
 	cmp	w4, 16
 	beq	.L424
 .L380:
-.LBB1256:
-.LBB1257:
+.LBB1262:
+.LBB1263:
 	.loc 1 1017 0
 	adrp	x6, .LANCHOR0
 	.loc 1 1023 0
@@ -4309,8 +4309,8 @@ direct_mode_data_change:
 .LVL375:
 	.p2align 3
 .L371:
-.LBE1257:
-.LBE1256:
+.LBE1263:
+.LBE1262:
 	.loc 1 1103 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
@@ -4336,8 +4336,8 @@ direct_mode_data_change:
 	ldr	w13, [x3, 88]
 .LVL377:
 	cbz	w13, .L381
-.LBB1258:
-.LBB1259:
+.LBB1264:
+.LBB1265:
 	.loc 1 831 0
 	adrp	x6, .LANCHOR0
 	.loc 1 837 0
@@ -4410,8 +4410,8 @@ direct_mode_data_change:
 	cmp	x11, x7
 	.loc 1 857 0
 	and	w8, w3, 65535
-.LBB1260:
-.LBB1261:
+.LBB1266:
+.LBB1267:
 	.loc 1 133 0
 	ubfiz	w19, w9, 8, 8
 	.loc 1 134 0
@@ -4420,143 +4420,143 @@ direct_mode_data_change:
 	add	w19, w19, w8, uxtb
 	.loc 1 134 0
 	add	w9, w9, w8, lsr 8
-.LBE1261:
-.LBE1260:
+.LBE1267:
+.LBE1266:
 	.loc 1 858 0
 	lsr	w10, w4, 16
 	lsr	w8, w3, 16
-.LBB1265:
-.LBB1266:
+.LBB1271:
+.LBB1272:
 	.loc 1 133 0
 	ubfiz	w18, w10, 8, 8
-.LBE1266:
-.LBE1265:
-.LBB1272:
-.LBB1262:
-	ldrb	w19, [x5, w19, sxtw]
-.LBE1262:
 .LBE1272:
+.LBE1271:
+.LBB1278:
+.LBB1268:
+	ldrb	w19, [x5, w19, sxtw]
+.LBE1268:
+.LBE1278:
+.LBB1279:
 .LBB1273:
-.LBB1267:
 	.loc 1 134 0
 	and	w10, w10, 65280
-.LBE1267:
 .LBE1273:
-.LBB1274:
-.LBB1263:
+.LBE1279:
+.LBB1280:
+.LBB1269:
 	ldrb	w17, [x5, w9, sxtw]
-.LBE1263:
-.LBE1274:
-.LBB1275:
-.LBB1268:
+.LBE1269:
+.LBE1280:
+.LBB1281:
+.LBB1274:
 	.loc 1 133 0
 	add	w18, w18, w8, uxtb
 	.loc 1 134 0
 	add	w10, w10, w8, lsr 8
-.LBE1268:
-.LBE1275:
+.LBE1274:
+.LBE1281:
 	.loc 1 859 0
 	ubfx	x9, x4, 32, 16
 	ubfx	x8, x3, 32, 16
 	.loc 1 860 0
 	lsr	x4, x4, 48
 .LVL390:
-.LBB1276:
-.LBB1264:
+.LBB1282:
+.LBB1270:
 	.loc 1 133 0
 	orr	w17, w19, w17, lsl 4
-.LBE1264:
-.LBE1276:
+.LBE1270:
+.LBE1282:
 	.loc 1 857 0
 	strb	w17, [x6, -4]
-.LBB1277:
-.LBB1278:
+.LBB1283:
+.LBB1284:
 	.loc 1 133 0
 	ubfiz	w17, w9, 8, 8
 	.loc 1 134 0
 	and	w9, w9, 65280
-.LBE1278:
-.LBE1277:
-.LBB1284:
-.LBB1269:
-	ldrb	w10, [x5, w10, sxtw]
-.LBE1269:
 .LBE1284:
+.LBE1283:
+.LBB1290:
+.LBB1275:
+	ldrb	w10, [x5, w10, sxtw]
+.LBE1275:
+.LBE1290:
+.LBB1291:
 .LBB1285:
-.LBB1279:
 	.loc 1 133 0
 	add	w17, w17, w8, uxtb
-.LBE1279:
 .LBE1285:
-.LBB1286:
-.LBB1270:
+.LBE1291:
+.LBB1292:
+.LBB1276:
 	ldrb	w18, [x5, w18, sxtw]
-.LBE1270:
-.LBE1286:
-.LBB1287:
-.LBB1280:
+.LBE1276:
+.LBE1292:
+.LBB1293:
+.LBB1286:
 	.loc 1 134 0
 	add	w8, w9, w8, lsr 8
-.LBE1280:
-.LBE1287:
+.LBE1286:
+.LBE1293:
 	.loc 1 860 0
 	lsr	x3, x3, 48
 .LVL391:
-.LBB1288:
-.LBB1271:
+.LBB1294:
+.LBB1277:
 	.loc 1 133 0
 	orr	w9, w18, w10, lsl 4
-.LBE1271:
-.LBE1288:
+.LBE1277:
+.LBE1294:
 	.loc 1 858 0
 	strb	w9, [x6, -3]
-.LBB1289:
-.LBB1290:
+.LBB1295:
+.LBB1296:
 	.loc 1 133 0
 	ubfiz	w9, w4, 8, 8
 	.loc 1 134 0
 	and	w4, w4, 65280
-.LBE1290:
-.LBE1289:
-.LBB1294:
-.LBB1281:
+.LBE1296:
+.LBE1295:
+.LBB1300:
+.LBB1287:
 	ldrb	w10, [x5, w8, sxtw]
-.LBE1281:
-.LBE1294:
-.LBB1295:
-.LBB1291:
+.LBE1287:
+.LBE1300:
+.LBB1301:
+.LBB1297:
 	.loc 1 133 0
 	add	w8, w9, w3, uxtb
-.LBE1291:
-.LBE1295:
-.LBB1296:
-.LBB1282:
+.LBE1297:
+.LBE1301:
+.LBB1302:
+.LBB1288:
 	ldrb	w17, [x5, w17, sxtw]
-.LBE1282:
-.LBE1296:
-.LBB1297:
-.LBB1292:
+.LBE1288:
+.LBE1302:
+.LBB1303:
+.LBB1298:
 	.loc 1 134 0
 	add	w3, w4, w3, lsr 8
-.LBE1292:
-.LBE1297:
-.LBB1298:
-.LBB1283:
+.LBE1298:
+.LBE1303:
+.LBB1304:
+.LBB1289:
 	.loc 1 133 0
 	orr	w4, w17, w10, lsl 4
-.LBE1283:
-.LBE1298:
+.LBE1289:
+.LBE1304:
 	.loc 1 859 0
 	strb	w4, [x6, -2]
+.LBB1305:
 .LBB1299:
-.LBB1293:
 	.loc 1 134 0
 	ldrb	w3, [x5, w3, sxtw]
 	.loc 1 133 0
 	ldrb	w4, [x5, w8, sxtw]
 	orr	w3, w4, w3, lsl 4
-.LBE1293:
 .LBE1299:
+.LBE1305:
 	.loc 1 860 0
 	strb	w3, [x6, -1]
 	.loc 1 853 0
@@ -4583,8 +4583,8 @@ direct_mode_data_change:
 	b	.L383
 .LVL396:
 .L423:
-.LBE1259:
-.LBE1258:
+.LBE1265:
+.LBE1264:
 	.loc 1 1089 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
@@ -4593,8 +4593,8 @@ direct_mode_data_change:
 	.loc 1 1098 0
 	cmp	w4, 16
 	bne	.L380
-.LBB1300:
-.LBB1301:
+.LBB1306:
+.LBB1307:
 	.loc 1 947 0
 	adrp	x6, .LANCHOR0
 	.loc 1 953 0
@@ -4787,10 +4787,10 @@ direct_mode_data_change:
 	b	.L393
 .LVL409:
 .L381:
-.LBE1301:
-.LBE1300:
-.LBB1302:
-.LBB1303:
+.LBE1307:
+.LBE1306:
+.LBB1308:
+.LBB1309:
 	.loc 1 871 0
 	adrp	x5, .LANCHOR0
 	.loc 1 877 0
@@ -4853,78 +4853,78 @@ direct_mode_data_change:
 	ldr	w4, [x1, x5, lsl 2]
 	add	x5, x5, 1
 .LVL419:
-.LBB1304:
-.LBB1305:
+.LBB1310:
+.LBB1311:
 	.loc 1 134 0
 	and	w9, w3, 65280
-.LBE1305:
-.LBE1304:
+.LBE1311:
+.LBE1310:
 	.loc 1 893 0
 	cmp	w12, w5
 .LVL420:
 	.loc 1 897 0
 	and	w6, w4, 65535
-.LBB1310:
-.LBB1306:
+.LBB1316:
+.LBB1312:
 	.loc 1 133 0
 	ubfiz	w8, w3, 8, 8
 	.loc 1 134 0
 	add	w9, w9, w6, lsr 8
 	.loc 1 133 0
 	add	w6, w8, w6, uxtb
-.LBE1306:
-.LBE1310:
+.LBE1312:
+.LBE1316:
 	.loc 1 898 0
 	lsr	w3, w3, 16
 .LVL421:
 	lsr	w4, w4, 16
-.LBB1311:
-.LBB1312:
+.LBB1317:
+.LBB1318:
 	.loc 1 133 0
 	ubfiz	w8, w3, 8, 8
 	.loc 1 134 0
 	and	w3, w3, 65280
-.LBE1312:
-.LBE1311:
-.LBB1316:
-.LBB1307:
+.LBE1318:
+.LBE1317:
+.LBB1322:
+.LBB1313:
 	.loc 1 133 0
 	ldrb	w11, [x7, w6, sxtw]
-.LBE1307:
-.LBE1316:
-.LBB1317:
-.LBB1313:
-	.loc 1 134 0
-	add	w3, w3, w4, lsr 8
 .LBE1313:
-.LBE1317:
-.LBB1318:
-.LBB1308:
-	ldrb	w9, [x7, w9, sxtw]
-.LBE1308:
-.LBE1318:
+.LBE1322:
+.LBB1323:
 .LBB1319:
+	.loc 1 134 0
+	add	w3, w3, w4, lsr 8
+.LBE1319:
+.LBE1323:
+.LBB1324:
 .LBB1314:
-	.loc 1 133 0
-	add	w6, w8, w4, uxtb
+	ldrb	w9, [x7, w9, sxtw]
 .LBE1314:
-.LBE1319:
+.LBE1324:
+.LBB1325:
 .LBB1320:
-.LBB1309:
-	orr	w4, w11, w9, lsl 4
-.LBE1309:
+	.loc 1 133 0
+	add	w6, w8, w4, uxtb
 .LBE1320:
+.LBE1325:
+.LBB1326:
+.LBB1315:
+	orr	w4, w11, w9, lsl 4
+.LBE1315:
+.LBE1326:
 	.loc 1 897 0
 	strb	w4, [x10], 2
+.LBB1327:
 .LBB1321:
-.LBB1315:
 	.loc 1 134 0
 	ldrb	w3, [x7, w3, sxtw]
 	.loc 1 133 0
 	ldrb	w4, [x7, w6, sxtw]
 	orr	w3, w4, w3, lsl 4
-.LBE1315:
 .LBE1321:
+.LBE1327:
 	.loc 1 898 0
 	strb	w3, [x10, -1]
 	.loc 1 893 0
@@ -4949,10 +4949,10 @@ direct_mode_data_change:
 	b	.L388
 .LVL424:
 .L427:
-.LBE1303:
-.LBE1302:
-.LBB1322:
-.LBB1323:
+.LBE1309:
+.LBE1308:
+.LBB1328:
+.LBB1329:
 	.loc 1 908 0
 	adrp	x5, .LANCHOR0
 	.loc 1 914 0
@@ -5016,81 +5016,81 @@ direct_mode_data_change:
 	.loc 1 933 0
 	ldr	w3, [x1, x4, lsl 2]
 .LVL435:
-.LBB1324:
-.LBB1325:
+.LBB1330:
+.LBB1331:
 	.loc 1 140 0
 	and	w9, w5, 65280
-.LBE1325:
-.LBE1324:
+.LBE1331:
+.LBE1330:
 	.loc 1 937 0
 	lsr	w7, w5, 16
 .LVL436:
 	.loc 1 936 0
 	and	w6, w3, 65535
-.LBB1330:
-.LBB1331:
+.LBB1336:
+.LBB1337:
 	.loc 1 139 0
 	ubfiz	w10, w7, 8, 8
-.LBE1331:
-.LBE1330:
+.LBE1337:
+.LBE1336:
 	.loc 1 937 0
 	lsr	w3, w3, 16
-.LBB1336:
-.LBB1332:
+.LBB1342:
+.LBB1338:
 	.loc 1 140 0
 	and	w7, w7, 65280
 	.loc 1 139 0
 	add	w10, w10, w3, uxtb
-.LBE1332:
-.LBE1336:
-.LBB1337:
-.LBB1326:
+.LBE1338:
+.LBE1342:
+.LBB1343:
+.LBB1332:
 	ubfiz	w5, w5, 8, 8
 .LVL437:
-.LBE1326:
-.LBE1337:
-.LBB1338:
-.LBB1333:
+.LBE1332:
+.LBE1343:
+.LBB1344:
+.LBB1339:
 	.loc 1 140 0
 	add	w3, w7, w3, lsr 8
-.LBE1333:
-.LBE1338:
-.LBB1339:
-.LBB1327:
+.LBE1339:
+.LBE1344:
+.LBB1345:
+.LBB1333:
 	.loc 1 139 0
 	add	w5, w5, w6, uxtb
 	.loc 1 140 0
 	add	w7, w9, w6, lsr 8
-.LBE1327:
-.LBE1339:
+.LBE1333:
+.LBE1345:
+.LBB1346:
 .LBB1340:
-.LBB1334:
 	.loc 1 139 0
 	ldrb	w9, [x8, w10, sxtw]
 	.loc 1 140 0
 	ldrb	w3, [x8, w3, sxtw]
-.LBE1334:
 .LBE1340:
-.LBB1341:
-.LBB1328:
+.LBE1346:
+.LBB1347:
+.LBB1334:
 	ldrb	w6, [x8, w7, sxtw]
 	.loc 1 139 0
 	ldrb	w5, [x8, w5, sxtw]
-.LBE1328:
-.LBE1341:
-.LBB1342:
-.LBB1335:
+.LBE1334:
+.LBE1347:
+.LBB1348:
+.LBB1341:
 	orr	w3, w9, w3, lsl 2
-.LBE1335:
-.LBE1342:
+.LBE1341:
+.LBE1348:
 	.loc 1 938 0
 	ubfiz	w3, w3, 4, 8
-.LBB1343:
-.LBB1329:
+.LBB1349:
+.LBB1335:
 	.loc 1 139 0
 	orr	w5, w5, w6, lsl 2
-.LBE1329:
-.LBE1343:
+.LBE1335:
+.LBE1349:
 	.loc 1 938 0
 	orr	w3, w3, w5
 	strb	w3, [x11, x4]
@@ -5116,8 +5116,8 @@ direct_mode_data_change:
 	add	x11, x0, x11
 .LVL439:
 	b	.L377
-.LBE1323:
-.LBE1322:
+.LBE1329:
+.LBE1328:
 	.cfi_endproc
 .LFE2820:
 	.size	direct_mode_data_change, .-direct_mode_data_change
@@ -5158,8 +5158,8 @@ direct_mode_data_change_part:
 	cmp	w4, 16
 	beq	.L606
 .L448:
-.LBB1370:
-.LBB1371:
+.LBB1376:
+.LBB1377:
 	.loc 1 1314 0
 	adrp	x5, .LANCHOR0
 	.loc 1 1320 0
@@ -5367,8 +5367,8 @@ direct_mode_data_change_part:
 .LVL454:
 	.p2align 3
 .L431:
-.LBE1371:
-.LBE1370:
+.LBE1377:
+.LBE1376:
 	.loc 1 1407 0
 	ldp	x19, x20, [sp, 16]
 .LVL455:
@@ -5405,17 +5405,17 @@ direct_mode_data_change_part:
 	bne	.L448
 	.loc 1 1397 0
 	ldr	w15, [x3, 88]
-.LBB1372:
-.LBB1373:
+.LBB1378:
+.LBB1379:
 	.loc 1 1151 0
 	adrp	x5, .LANCHOR0
 .LVL461:
-.LBE1373:
-.LBE1372:
+.LBE1379:
+.LBE1378:
 	.loc 1 1397 0
 	cbz	w15, .L449
-.LBB1386:
-.LBB1384:
+.LBB1392:
+.LBB1390:
 	.loc 1 1151 0
 	ldr	x12, [x5, #:lo12:.LANCHOR0]
 	.loc 1 1156 0
@@ -5453,13 +5453,13 @@ direct_mode_data_change_part:
 	mov	w15, 0
 .LVL468:
 	add	x16, x16, 1
-.LBB1374:
-.LBB1375:
+.LBB1380:
+.LBB1381:
 	.loc 1 145 0
 	mov	w10, 3
 	lsl	x16, x16, 3
-.LBE1375:
-.LBE1374:
+.LBE1381:
+.LBE1380:
 	.loc 1 1167 0
 	cbz	w14, .L450
 .LVL469:
@@ -5493,8 +5493,8 @@ direct_mode_data_change_part:
 	and	w17, w4, 65535
 	and	w7, w3, 65535
 .LVL474:
-.LBB1377:
-.LBB1378:
+.LBB1383:
+.LBB1384:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
@@ -5542,15 +5542,15 @@ direct_mode_data_change_part:
 	and	w6, w6, 255
 .LVL476:
 .L454:
-.LBE1378:
-.LBE1377:
+.LBE1384:
+.LBE1383:
 	.loc 1 1176 0
 	strb	w6, [x5, -4]
 	.loc 1 1177 0
 	lsr	w17, w4, 16
 	lsr	w7, w3, 16
-.LBB1379:
-.LBB1380:
+.LBB1385:
+.LBB1386:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
@@ -5598,15 +5598,15 @@ direct_mode_data_change_part:
 	and	w6, w6, 255
 .LVL478:
 .L459:
-.LBE1380:
-.LBE1379:
+.LBE1386:
+.LBE1385:
 	.loc 1 1177 0
 	strb	w6, [x5, -3]
 	.loc 1 1178 0
 	ubfx	x17, x4, 32, 16
 	ubfx	x7, x3, 32, 16
-.LBB1381:
-.LBB1382:
+.LBB1387:
+.LBB1388:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
@@ -5654,8 +5654,8 @@ direct_mode_data_change_part:
 	and	w6, w6, 255
 .LVL480:
 .L464:
-.LBE1382:
-.LBE1381:
+.LBE1388:
+.LBE1387:
 	.loc 1 1178 0
 	strb	w6, [x5, -2]
 	.loc 1 1179 0
@@ -5663,8 +5663,8 @@ direct_mode_data_change_part:
 .LVL481:
 	lsr	x3, x3, 48
 .LVL482:
-.LBB1383:
-.LBB1376:
+.LBB1389:
+.LBB1382:
 	.loc 1 149 0
 	mov	w6, 0
 	.loc 1 148 0
@@ -5713,8 +5713,8 @@ direct_mode_data_change_part:
 	and	w6, w4, 255
 .LVL485:
 .L469:
-.LBE1376:
-.LBE1383:
+.LBE1382:
+.LBE1389:
 	.loc 1 1179 0
 	strb	w6, [x5, -1]
 .LVL486:
@@ -5747,8 +5747,8 @@ direct_mode_data_change_part:
 	b	.L451
 .LVL492:
 .L605:
-.LBE1384:
-.LBE1386:
+.LBE1390:
+.LBE1392:
 	.loc 1 1393 0
 	ldr	x4, [x3, 216]
 	ldr	w4, [x4, 64]
@@ -5757,8 +5757,8 @@ direct_mode_data_change_part:
 	.loc 1 1402 0
 	cmp	w4, 16
 	bne	.L448
-.LBB1387:
-.LBB1388:
+.LBB1393:
+.LBB1394:
 	.loc 1 1236 0
 	adrp	x5, .LANCHOR0
 	.loc 1 1242 0
@@ -5982,10 +5982,10 @@ direct_mode_data_change_part:
 	b	.L495
 .LVL505:
 .L449:
-.LBE1388:
-.LBE1387:
-.LBB1389:
-.LBB1390:
+.LBE1394:
+.LBE1393:
+.LBB1395:
+.LBB1396:
 	.loc 1 1110 0
 	ldr	x17, [x5, #:lo12:.LANCHOR0]
 	.loc 1 1115 0
@@ -6020,14 +6020,14 @@ direct_mode_data_change_part:
 	.loc 1 1125 0
 	ble	.L431
 	sub	w16, w13, #1
-.LBB1391:
-.LBB1392:
+.LBB1397:
+.LBB1398:
 	.loc 1 145 0
 	mov	w14, 3
 	add	x16, x16, 1
 	lsl	x16, x16, 2
-.LBE1392:
-.LBE1391:
+.LBE1398:
+.LBE1397:
 	.loc 1 1126 0
 	cbz	w30, .L477
 .LVL512:
@@ -6051,75 +6051,75 @@ direct_mode_data_change_part:
 .L492:
 	.loc 1 1133 0
 	ldr	w5, [x2, x9, lsl 2]
-.LBB1398:
-.LBB1399:
+.LBB1404:
+.LBB1405:
 	.loc 1 149 0
 	mov	w4, 0
-.LBE1399:
-.LBE1398:
+.LBE1405:
+.LBE1404:
 	.loc 1 1132 0
 	ldr	w22, [x1, x9, lsl 2]
-.LBB1404:
-.LBB1393:
+.LBB1410:
+.LBB1399:
 	.loc 1 149 0
 	mov	w8, 0
-.LBE1393:
-.LBE1404:
+.LBE1399:
+.LBE1410:
 	.loc 1 1135 0
 	and	w25, w5, 65535
 	and	w7, w22, 65535
-.LBB1405:
-.LBB1400:
+.LBB1411:
+.LBB1406:
 	.loc 1 160 0
 	and	w3, w25, 65280
 	add	w6, w3, w7, lsr 8
-.LBE1400:
-.LBE1405:
+.LBE1406:
+.LBE1411:
 	.loc 1 1136 0
 	lsr	w3, w5, 16
-.LBB1406:
-.LBB1394:
+.LBB1412:
+.LBB1400:
 	.loc 1 159 0
 	ubfiz	w21, w3, 8, 8
-.LBE1394:
-.LBE1406:
+.LBE1400:
+.LBE1412:
 	.loc 1 1136 0
 	and	w3, w3, 65535
 	lsr	w10, w22, 16
+.LBB1413:
 .LBB1407:
-.LBB1401:
 	.loc 1 159 0
 	ubfiz	w23, w5, 8, 8
-.LBE1401:
 .LBE1407:
-.LBB1408:
-.LBB1395:
+.LBE1413:
+.LBB1414:
+.LBB1401:
 	.loc 1 160 0
 	and	w19, w3, 65280
-.LBE1395:
-.LBE1408:
-.LBB1409:
-.LBB1402:
+.LBE1401:
+.LBE1414:
+.LBB1415:
+.LBB1408:
 	.loc 1 146 0
 	eor	w24, w25, w7
 	.loc 1 159 0
 	add	w23, w23, w7, uxtb
-.LBE1402:
-.LBE1409:
-.LBB1410:
-.LBB1396:
+.LBE1408:
+.LBE1415:
+.LBB1416:
+.LBB1402:
 	add	w21, w21, w10, uxtb
 	.loc 1 146 0
 	eor	w20, w3, w10
 	.loc 1 160 0
 	add	w19, w19, w10, lsr 8
-.LBE1396:
-.LBE1410:
+.LBE1402:
+.LBE1416:
 	.loc 1 1134 0
 	cmp	w22, w5
 	beq	.L480
-.LBB1411:
-.LBB1403:
+.LBB1417:
+.LBB1409:
 	.loc 1 148 0
 	cmp	w25, w7
 	beq	.L481
@@ -6152,12 +6152,12 @@ direct_mode_data_change_part:
 	and	w4, w5, w4
 	and	w4, w4, 255
 .L481:
-.LBE1403:
-.LBE1411:
+.LBE1409:
+.LBE1417:
 	.loc 1 1135 0
 	strb	w4, [x11, -2]
-.LBB1412:
-.LBB1397:
+.LBB1418:
+.LBB1403:
 	.loc 1 148 0
 	cmp	w3, w10
 	beq	.L486
@@ -6190,8 +6190,8 @@ direct_mode_data_change_part:
 	and	w3, w4, w3
 	and	w8, w3, 255
 .L486:
-.LBE1397:
-.LBE1412:
+.LBE1403:
+.LBE1418:
 	.loc 1 1136 0
 	strb	w8, [x11, -1]
 .L491:
@@ -6222,29 +6222,29 @@ direct_mode_data_change_part:
 .LVL519:
 	.p2align 3
 .L453:
-.LBE1390:
-.LBE1389:
-.LBB1414:
-.LBB1385:
+.LBE1396:
+.LBE1395:
+.LBB1420:
+.LBB1391:
 	.loc 1 1182 0
 	str	wzr, [x5, -4]
 	b	.L474
 .LVL520:
 	.p2align 3
 .L480:
-.LBE1385:
-.LBE1414:
-.LBB1415:
-.LBB1413:
+.LBE1391:
+.LBE1420:
+.LBB1421:
+.LBB1419:
 	.loc 1 1139 0
 	strh	wzr, [x11, -2]
 	b	.L491
 .LVL521:
 .L609:
-.LBE1413:
-.LBE1415:
-.LBB1416:
-.LBB1417:
+.LBE1419:
+.LBE1421:
+.LBB1422:
+.LBB1423:
 	.loc 1 1194 0
 	adrp	x5, .LANCHOR0
 	.loc 1 1199 0
@@ -6283,13 +6283,13 @@ direct_mode_data_change_part:
 	mov	w19, 0
 .LVL528:
 	add	x20, x20, 1
-.LBB1418:
-.LBB1419:
+.LBB1424:
+.LBB1425:
 	.loc 1 167 0
 	mov	w18, 3
 	lsl	x20, x20, 2
-.LBE1419:
-.LBE1418:
+.LBE1425:
+.LBE1424:
 	.loc 1 1212 0
 	cbz	w23, .L436
 .LVL529:
@@ -6311,8 +6311,8 @@ direct_mode_data_change_part:
 .LVL532:
 	.p2align 3
 .L613:
-.LBB1425:
-.LBB1426:
+.LBB1431:
+.LBB1432:
 	.loc 1 170 0
 	cmp	w7, w5
 	beq	.L440
@@ -6333,10 +6333,10 @@ direct_mode_data_change_part:
 	csel	w4, w5, w4, ne
 	and	w12, w12, w4
 .L440:
-.LBE1426:
-.LBE1425:
-.LBB1430:
-.LBB1420:
+.LBE1432:
+.LBE1431:
+.LBB1436:
+.LBB1426:
 	.loc 1 170 0
 	cmp	w3, w13
 	beq	.L443
@@ -6360,8 +6360,8 @@ direct_mode_data_change_part:
 	sxtb	w10, w3
 .LVL535:
 .L443:
-.LBE1420:
-.LBE1430:
+.LBE1426:
+.LBE1436:
 	.loc 1 1223 0
 	orr	w3, w12, w10
 	strb	w3, [x16, x11]
@@ -6373,20 +6373,20 @@ direct_mode_data_change_part:
 	.loc 1 1219 0
 	ldr	w4, [x2, x11, lsl 2]
 .LVL536:
-.LBB1431:
-.LBB1427:
+.LBB1437:
+.LBB1433:
 	.loc 1 170 0
 	mov	w12, 0
-.LBE1427:
-.LBE1431:
+.LBE1433:
+.LBE1437:
 	.loc 1 1218 0
 	ldr	w6, [x1, x11, lsl 2]
-.LBB1432:
-.LBB1421:
+.LBB1438:
+.LBB1427:
 	.loc 1 170 0
 	mov	w10, 0
-.LBE1421:
-.LBE1432:
+.LBE1427:
+.LBE1438:
 	.loc 1 1221 0
 	and	w7, w4, 65535
 	.loc 1 1222 0
@@ -6395,52 +6395,52 @@ direct_mode_data_change_part:
 	and	w5, w6, 65535
 	.loc 1 1222 0
 	lsr	w13, w6, 16
-.LBB1433:
-.LBB1422:
+.LBB1439:
+.LBB1428:
 	.loc 1 177 0
 	ubfiz	w14, w3, 8, 8
-.LBE1422:
-.LBE1433:
+.LBE1428:
+.LBE1439:
 	.loc 1 1222 0
 	and	w3, w3, 65535
+.LBB1440:
 .LBB1434:
-.LBB1428:
 	.loc 1 177 0
 	ubfiz	w8, w4, 8, 8
 	.loc 1 178 0
 	and	w9, w7, 65280
 	.loc 1 168 0
 	eor	w30, w7, w5
-.LBE1428:
 .LBE1434:
-.LBB1435:
-.LBB1423:
+.LBE1440:
+.LBB1441:
+.LBB1429:
 	.loc 1 178 0
 	and	w24, w3, 65280
 	.loc 1 168 0
 	eor	w25, w3, w13
-.LBE1423:
-.LBE1435:
-.LBB1436:
-.LBB1429:
+.LBE1429:
+.LBE1441:
+.LBB1442:
+.LBB1435:
 	.loc 1 177 0
 	add	w8, w8, w5, uxtb
 	.loc 1 178 0
 	add	w9, w9, w5, lsr 8
 	.loc 1 172 0
 	and	w27, w30, 255
-.LBE1429:
-.LBE1436:
-.LBB1437:
-.LBB1424:
+.LBE1435:
+.LBE1442:
+.LBB1443:
+.LBB1430:
 	.loc 1 177 0
 	add	w14, w14, w13, uxtb
 	.loc 1 178 0
 	add	w24, w24, w13, lsr 8
 	.loc 1 172 0
 	and	w26, w25, 255
-.LBE1424:
-.LBE1437:
+.LBE1430:
+.LBE1443:
 	.loc 1 1220 0
 	cmp	w6, w4
 	bne	.L613
@@ -6470,8 +6470,8 @@ direct_mode_data_change_part:
 	add	x16, x0, x16
 .LVL539:
 	b	.L437
-.LBE1417:
-.LBE1416:
+.LBE1423:
+.LBE1422:
 	.cfi_endproc
 .LFE2826:
 	.size	direct_mode_data_change_part, .-direct_mode_data_change_part
@@ -6479,7 +6479,7 @@ direct_mode_data_change_part:
 	.p2align 3,,7
 	.type	flip.isra.11, %function
 flip.isra.11:
-.LFB2876:
+.LFB2877:
 	.loc 1 1409 0
 	.cfi_startproc
 .LVL540:
@@ -6502,10 +6502,10 @@ flip.isra.11:
 	.loc 1 1413 0
 	ldr	x0, [x0]
 .LVL541:
-.LBB1438:
-.LBB1439:
-.LBB1440:
-.LBB1441:
+.LBB1444:
+.LBB1445:
+.LBB1446:
+.LBB1447:
 	.file 10 "./include/linux/dma-mapping.h"
 	.loc 10 266 0
 	cbz	x0, .L618
@@ -6516,37 +6516,37 @@ flip.isra.11:
 	cmp	x3, 0
 	csel	x3, x4, x3, eq
 .L616:
-.LBE1441:
-.LBE1440:
+.LBE1447:
+.LBE1446:
 	.loc 10 434 0
 	ldr	x5, [x3, 88]
 	sxtw	x19, w19
 	cbz	x5, .L617
-.LBE1439:
-.LBE1438:
+.LBE1445:
+.LBE1444:
 	.loc 1 1413 0
 	add	x4, x19, x19, lsl 1
-.LBB1447:
-.LBB1444:
+.LBB1453:
+.LBB1450:
 	.loc 10 435 0
 	mov	w3, 1
-.LBE1444:
-.LBE1447:
+.LBE1450:
+.LBE1453:
 	.loc 1 1413 0
 	add	x4, x20, x4, lsl 3
-.LBB1448:
-.LBB1445:
+.LBB1454:
+.LBB1451:
 	.loc 10 435 0
 	ldr	x1, [x4, 32]
 	blr	x5
 .LVL542:
 .L617:
-.LBE1445:
-.LBE1448:
+.LBE1451:
+.LBE1454:
 	.loc 1 1414 0
 	ldr	x5, [x20, 8]
-.LBB1449:
-.LBB1450:
+.LBB1455:
+.LBB1456:
 	.file 11 "drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.h"
 	.loc 11 57 0
 	mov	w4, 0
@@ -6554,29 +6554,29 @@ flip.isra.11:
 	mov	w2, 0
 	mov	x0, x5
 	mov	w1, 0
-.LBE1450:
-.LBE1449:
+.LBE1456:
+.LBE1455:
 	.loc 1 1415 0
 	add	x19, x19, x19, lsl 1
-.LBB1453:
-.LBB1451:
+.LBB1459:
+.LBB1457:
 	.loc 11 57 0
 	ldr	x5, [x5, 64]
-.LBE1451:
-.LBE1453:
+.LBE1457:
+.LBE1459:
 	.loc 1 1415 0
 	add	x19, x20, x19, lsl 3
-.LBB1454:
-.LBB1452:
+.LBB1460:
+.LBB1458:
 	.loc 11 57 0
 	blr	x5
 .LVL543:
-.LBE1452:
-.LBE1454:
+.LBE1458:
+.LBE1460:
 	.loc 1 1415 0
 	ldr	x1, [x20, 8]
-.LBB1455:
-.LBB1456:
+.LBB1461:
+.LBB1462:
 	.loc 11 62 0
 	mov	w2, 0
 	mov	x0, x1
@@ -6584,20 +6584,20 @@ flip.isra.11:
 	ldr	w1, [x19, 32]
 	blr	x3
 .LVL544:
-.LBE1456:
-.LBE1455:
+.LBE1462:
+.LBE1461:
 	.loc 1 1416 0
 	ldr	x2, [x20, 8]
-.LBB1457:
-.LBB1458:
+.LBB1463:
+.LBB1464:
 	.loc 11 77 0
 	mov	w1, 1
 	mov	x0, x2
 	ldr	x2, [x2, 96]
 	blr	x2
 .LVL545:
-.LBE1458:
-.LBE1457:
+.LBE1464:
+.LBE1463:
 	.loc 1 1417 0
 	ldr	w1, [x20, 72]
 	mov	w0, 1
@@ -6618,20 +6618,20 @@ flip.isra.11:
 	.p2align 3
 .L618:
 	.cfi_restore_state
-.LBB1459:
-.LBB1446:
-.LBB1443:
-.LBB1442:
+.LBB1465:
+.LBB1452:
+.LBB1449:
+.LBB1448:
 	.loc 10 268 0
 	adrp	x3, dummy_dma_ops
 	add	x3, x3, :lo12:dummy_dma_ops
 	b	.L616
-.LBE1442:
-.LBE1443:
-.LBE1446:
-.LBE1459:
+.LBE1448:
+.LBE1449:
+.LBE1452:
+.LBE1465:
 	.cfi_endproc
-.LFE2876:
+.LFE2877:
 	.size	flip.isra.11, .-flip.isra.11
 	.align	2
 	.p2align 3,,7
@@ -6687,8 +6687,8 @@ ebc_frame_start:
 	ldr	x0, [x19, 192]
 	bl	get_overlay_image
 .LVL551:
-.LBB1460:
-.LBB1461:
+.LBB1466:
+.LBB1467:
 	.loc 1 1422 0
 	str	wzr, [x21, 72]
 	.loc 1 1423 0
@@ -6696,8 +6696,8 @@ ebc_frame_start:
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
 .LVL552:
-.LBE1461:
-.LBE1460:
+.LBE1467:
+.LBE1466:
 	.loc 1 1541 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
@@ -6737,8 +6737,8 @@ ebc_frame_start:
 	ldr	x0, [x19, 192]
 	bl	get_auto_image
 .LVL556:
-.LBB1462:
-.LBB1463:
+.LBB1468:
+.LBB1469:
 	.loc 1 1422 0
 	str	wzr, [x21, 72]
 	.loc 1 1423 0
@@ -6746,8 +6746,8 @@ ebc_frame_start:
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
 .LVL557:
-.LBE1463:
-.LBE1462:
+.LBE1469:
+.LBE1468:
 	.loc 1 1541 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
@@ -6793,8 +6793,8 @@ ebc_frame_start:
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change
 .LVL561:
-.LBB1464:
-.LBB1465:
+.LBB1470:
+.LBB1471:
 	.loc 1 1422 0
 	str	wzr, [x21, 72]
 	.loc 1 1423 0
@@ -6802,8 +6802,8 @@ ebc_frame_start:
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
 .LVL562:
-.LBE1465:
-.LBE1464:
+.LBE1471:
+.LBE1470:
 	.loc 1 1541 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
@@ -6849,8 +6849,8 @@ ebc_frame_start:
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change_part
 .LVL566:
-.LBB1466:
-.LBB1467:
+.LBB1472:
+.LBB1473:
 	.loc 1 1422 0
 	str	wzr, [x21, 72]
 	.loc 1 1423 0
@@ -6858,8 +6858,8 @@ ebc_frame_start:
 	ldr	w1, [x20, 208]
 	bl	flip.isra.11
 .LVL567:
-.LBE1467:
-.LBE1466:
+.LBE1473:
+.LBE1472:
 	.loc 1 1541 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
@@ -6967,15 +6967,15 @@ ebc_auto_tast_function:
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
-.LBB1468:
-.LBB1469:
-.LBB1470:
+.LBB1474:
+.LBB1475:
+.LBB1476:
 	.file 12 "./include/linux/compiler.h"
 	.loc 12 288 0
 	mov	x24, 2
-.LBE1470:
-.LBE1469:
-.LBE1468:
+.LBE1476:
+.LBE1475:
+.LBE1474:
 	.loc 1 1544 0
 	str	x25, [sp, 64]
 	.cfi_offset 25, -32
@@ -6984,9 +6984,9 @@ ebc_auto_tast_function:
 	.loc 1 1547 0
 	add	x19, x22, 184
 	add	x25, x22, 744
-.LBB1475:
-.LBB1472:
-.LBB1473:
+.LBB1481:
+.LBB1478:
+.LBB1479:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -6994,9 +6994,9 @@ ebc_auto_tast_function:
 // 0 "" 2
 .LVL578:
 #NO_APP
-.LBE1473:
-.LBE1472:
-.LBE1475:
+.LBE1479:
+.LBE1478:
+.LBE1481:
 	.loc 1 1544 0
 	ldr	x1, [x0]
 	str	x1, [x29, 88]
@@ -7020,14 +7020,14 @@ ebc_auto_tast_function:
 	mov	x0, x20
 	bl	down
 .LVL581:
-.LBB1476:
-.LBB1474:
-.LBB1471:
+.LBB1482:
+.LBB1480:
+.LBB1477:
 	.loc 12 288 0
 	str	x24, [x23, 32]
-.LBE1471:
-.LBE1474:
-.LBE1476:
+.LBE1477:
+.LBE1480:
+.LBE1482:
 	.loc 1 1554 0
 #APP
 // 1554 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
@@ -7068,8 +7068,8 @@ ebc_auto_tast_function:
 	cmp	w0, 0
 	ccmp	w1, 1, 0, ne
 	bhi	.L663
-.LBB1477:
-.LBB1478:
+.LBB1483:
+.LBB1484:
 	.file 13 "./include/linux/workqueue.h"
 	.loc 13 518 0
 	ldr	x1, [x19, 608]
@@ -7080,8 +7080,8 @@ ebc_auto_tast_function:
 	b	.L646
 	.p2align 3
 .L638:
-.LBE1478:
-.LBE1477:
+.LBE1484:
+.LBE1483:
 	.loc 1 1555 0
 	sub	w0, w0, #22
 	cmp	w0, 1
@@ -7170,8 +7170,8 @@ ebc_auto_tast_function:
 	.loc 1 1632 0 is_stmt 0 discriminator 2
 	ldr	w0, [x19, 632]
 	cbz	w0, .L646
-.LBB1480:
-.LBB1479:
+.LBB1486:
+.LBB1485:
 	.loc 13 518 0 is_stmt 1
 	ldr	x1, [x19, 608]
 	mov	x2, x25
@@ -7179,8 +7179,8 @@ ebc_auto_tast_function:
 	bl	queue_work_on
 .LVL591:
 	b	.L646
-.LBE1479:
-.LBE1480:
+.LBE1485:
+.LBE1486:
 	.cfi_endproc
 .LFE2830:
 	.size	ebc_auto_tast_function, .-ebc_auto_tast_function
@@ -7188,7 +7188,7 @@ ebc_auto_tast_function:
 	.p2align 3,,7
 	.type	ebc_power_set.part.12, %function
 ebc_power_set.part.12:
-.LFB2877:
+.LFB2878:
 	.loc 1 183 0
 	.cfi_startproc
 .LVL592:
@@ -7208,28 +7208,28 @@ ebc_power_set.part.12:
 	.loc 1 201 0
 	ldr	x1, [x0, 8]
 .LVL593:
-.LBB1481:
-.LBB1482:
+.LBB1487:
+.LBB1488:
 	.loc 11 51 0
 	mov	x0, x1
 .LVL594:
 	ldr	x1, [x1, 56]
 	blr	x1
 .LVL595:
-.LBE1482:
-.LBE1481:
+.LBE1488:
+.LBE1487:
 	.loc 1 202 0
 	ldr	x2, [x19, 16]
-.LBB1483:
-.LBB1484:
+.LBB1489:
+.LBB1490:
 	.loc 3 35 0
 	mov	w1, 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
 .LVL596:
-.LBE1484:
-.LBE1483:
+.LBE1490:
+.LBE1489:
 	.loc 1 203 0
 	ldr	w0, [x19, 624]
 	cbnz	w0, .L670
@@ -7256,14 +7256,14 @@ ebc_power_set.part.12:
 	.cfi_restore_state
 	.loc 1 204 0
 	str	wzr, [x19, 624]
-.LBB1485:
-.LBB1486:
+.LBB1491:
+.LBB1492:
 	.loc 4 68 0
 	add	x0, x19, 416
 	bl	__pm_relax
 .LVL600:
-.LBE1486:
-.LBE1485:
+.LBE1492:
+.LBE1491:
 	.loc 1 207 0
 	ldr	x0, [x19]
 	adrp	x1, .LC22
@@ -7281,14 +7281,14 @@ ebc_power_set.part.12:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2877:
+.LFE2878:
 	.size	ebc_power_set.part.12, .-ebc_power_set.part.12
 	.align	2
 	.p2align 3,,7
 	.type	ebc_suspend, %function
 ebc_suspend:
-.LFB2861:
-	.loc 1 3043 0
+.LFB2862:
+	.loc 1 3060 0
 	.cfi_startproc
 .LVL603:
 	stp	x29, x30, [sp, -32]!
@@ -7300,40 +7300,40 @@ ebc_suspend:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-.LBB1487:
-.LBB1488:
+.LBB1493:
+.LBB1494:
 	.loc 2 1181 0
 	ldr	x20, [x0, 184]
-.LBE1488:
-.LBE1487:
-	.loc 1 3047 0
+.LBE1494:
+.LBE1493:
+	.loc 1 3064 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 200]
 .LVL604:
 	cmp	w0, 1
 	beq	.L674
 .L672:
-	.loc 1 3051 0
+	.loc 1 3068 0
 	mov	w0, 1
 	str	w0, [x19, 620]
-	.loc 1 3053 0
+	.loc 1 3070 0
 	ldr	x1, [x20, 16]
-.LBB1489:
-.LBB1490:
+.LBB1495:
+.LBB1496:
 	.loc 3 40 0
 	mov	x0, x1
 	ldr	x1, [x1, 40]
 	blr	x1
 .LVL605:
-.LBE1490:
-.LBE1489:
-	.loc 1 3054 0
+.LBE1496:
+.LBE1495:
+	.loc 1 3071 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC24
 	add	x1, x1, :lo12:.LC24
 	bl	_dev_info
 .LVL606:
-	.loc 1 3057 0
+	.loc 1 3074 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -7347,7 +7347,7 @@ ebc_suspend:
 	.p2align 3
 .L674:
 	.cfi_restore_state
-	.loc 1 3048 0
+	.loc 1 3065 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
@@ -7356,23 +7356,23 @@ ebc_suspend:
 	add	x1, x1, :lo12:.LC23
 	bl	_dev_info
 .LVL607:
-.LBB1491:
-.LBB1492:
+.LBB1497:
+.LBB1498:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.12
 .LVL608:
 	b	.L672
-.LBE1492:
-.LBE1491:
+.LBE1498:
+.LBE1497:
 	.cfi_endproc
-.LFE2861:
+.LFE2862:
 	.size	ebc_suspend, .-ebc_suspend
 	.align	2
 	.p2align 3,,7
 	.type	check_black_percent.isra.14, %function
 check_black_percent.isra.14:
-.LFB2879:
+.LFB2880:
 	.loc 1 1776 0
 	.cfi_startproc
 	.loc 1 1786 0
@@ -7442,36 +7442,36 @@ check_black_percent.isra.14:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2879:
+.LFE2880:
 	.size	check_black_percent.isra.14, .-check_black_percent.isra.14
 	.align	2
 	.p2align 3,,7
 	.type	ebc_probe, %function
 ebc_probe:
-.LFB2859:
-	.loc 1 2907 0
+.LFB2860:
+	.loc 1 2924 0
 	.cfi_startproc
 .LVL612:
 	stp	x29, x30, [sp, -208]!
 	.cfi_def_cfa_offset 208
 	.cfi_offset 29, -208
 	.cfi_offset 30, -200
-.LBB1637:
-.LBB1638:
+.LBB1643:
+.LBB1644:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
-.LBE1638:
-.LBE1637:
-	.loc 1 2907 0
+.LBE1644:
+.LBE1643:
+	.loc 1 2924 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 2908 0
+	.loc 1 2925 0
 	add	x22, x0, 16
-	.loc 1 2907 0
+	.loc 1 2924 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -160
 	.cfi_offset 24, -152
@@ -7487,62 +7487,62 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 2907 0
+	.loc 1 2924 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
-.LBB1640:
-.LBB1639:
+.LBB1646:
+.LBB1645:
 	.loc 2 711 0
 	mov	x0, x22
 	mov	x1, 824
 	bl	devm_kmalloc
 .LVL614:
-.LBE1639:
-.LBE1640:
-	.loc 1 2923 0
+.LBE1645:
+.LBE1646:
+	.loc 1 2940 0
 	cbz	x0, .L739
-	.loc 1 2927 0
+	.loc 1 2944 0
 	adrp	x24, .LANCHOR0
 	mov	x20, x0
-	.loc 1 2929 0
+	.loc 1 2946 0
 	adrp	x1, .LC26
 	mov	w2, 0
-	.loc 1 2927 0
+	.loc 1 2944 0
 	str	x0, [x24, #:lo12:.LANCHOR0]
-	.loc 1 2929 0
+	.loc 1 2946 0
 	add	x1, x1, :lo12:.LC26
 	ldr	x0, [x22, 752]
-	.loc 1 2926 0
+	.loc 1 2943 0
 	str	x22, [x20]
-	.loc 1 2929 0
+	.loc 1 2946 0
 	bl	of_parse_phandle
 .LVL615:
-	.loc 1 2930 0
+	.loc 1 2947 0
 	cbz	x0, .L775
-	.loc 1 2935 0
+	.loc 1 2952 0
 	bl	of_find_device_by_node
 .LVL616:
-	.loc 1 2937 0
+	.loc 1 2954 0
 	cbz	x0, .L693
-.LBB1641:
-.LBB1642:
-.LBB1643:
+.LBB1647:
+.LBB1648:
+.LBB1649:
 	.loc 2 1181 0
 	ldr	x0, [x0, 200]
 .LVL617:
-.LBE1643:
-.LBE1642:
-.LBE1641:
-	.loc 1 2940 0
+.LBE1649:
+.LBE1648:
+.LBE1647:
+	.loc 1 2957 0
 	str	x0, [x20, 8]
-	.loc 1 2941 0
+	.loc 1 2958 0
 	cbz	x0, .L693
-	.loc 1 2943 0
+	.loc 1 2960 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 2945 0
+	.loc 1 2962 0
 	add	x2, x29, 96
 	adrp	x1, .LC28
 	add	x1, x1, :lo12:.LC28
@@ -7551,42 +7551,42 @@ ebc_probe:
 .LVL618:
 	mov	x21, x0
 .LVL619:
-	.loc 1 2946 0
+	.loc 1 2963 0
 	ldrsw	x0, [x29, 96]
 .LVL620:
 	lsr	x0, x0, 2
 .LVL621:
 	str	w0, [x29, 96]
 .LVL622:
-	.loc 1 2947 0
+	.loc 1 2964 0
 	cmp	w0, 0
 	beq	.L694
-	.loc 1 2952 0 discriminator 1
+	.loc 1 2969 0 discriminator 1
 	mov	w19, 0
 .LVL623:
 	bgt	.L762
 	b	.L696
 	.p2align 3
 .L697:
-	.loc 1 2960 0
+	.loc 1 2977 0
 	bl	of_find_i2c_device_by_node
 .LVL624:
-	.loc 1 2962 0
+	.loc 1 2979 0
 	cbz	x0, .L776
-.LBB1644:
-.LBB1645:
-.LBB1646:
+.LBB1650:
+.LBB1651:
+.LBB1652:
 	.loc 2 1181 0
 	ldr	x0, [x0, 216]
 .LVL625:
-.LBE1646:
-.LBE1645:
-.LBE1644:
-	.loc 1 2967 0
+.LBE1652:
+.LBE1651:
+.LBE1650:
+	.loc 1 2984 0
 	str	x0, [x20, 16]
-	.loc 1 2968 0
+	.loc 1 2985 0
 	cbnz	x0, .L777
-	.loc 1 2952 0 discriminator 2
+	.loc 1 2969 0 discriminator 2
 	ldr	w0, [x29, 96]
 	add	w19, w19, 1
 .LVL626:
@@ -7594,24 +7594,24 @@ ebc_probe:
 	ble	.L701
 .L762:
 	ldr	w0, [x21], 4
-	.loc 1 2954 0
+	.loc 1 2971 0
 	rev	w0, w0
 	bl	of_find_node_by_phandle
 .LVL627:
-	.loc 1 2955 0
+	.loc 1 2972 0
 	cbnz	x0, .L697
-	.loc 1 2956 0
+	.loc 1 2973 0
 	adrp	x1, .LC30
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC30
-	.loc 1 2957 0
+	.loc 1 2974 0
 	mov	w25, -19
-	.loc 1 2956 0
+	.loc 1 2973 0
 	bl	_dev_err
 .LVL628:
 	.p2align 2
 .L689:
-	.loc 1 3033 0
+	.loc 1 3050 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w25
 .LVL629:
@@ -7649,7 +7649,7 @@ ebc_probe:
 	.p2align 3
 .L777:
 	.cfi_restore_state
-	.loc 1 2969 0
+	.loc 1 2986 0
 	adrp	x1, .LC32
 	mov	w2, w19
 	add	x1, x1, :lo12:.LC32
@@ -7657,65 +7657,65 @@ ebc_probe:
 	bl	_dev_info
 .LVL636:
 .L696:
-	.loc 1 2974 0
+	.loc 1 2991 0
 	ldr	x0, [x20, 16]
 	cbz	x0, .L701
-	.loc 1 2980 0
+	.loc 1 2997 0
 	add	x19, x20, 184
 .LVL637:
-	.loc 1 2982 0
+	.loc 1 2999 0
 	add	x21, x20, 24
 .LVL638:
-	.loc 1 2980 0
+	.loc 1 2997 0
 	str	x22, [x19, 104]
-.LBB1647:
-.LBB1648:
-.LBB1649:
-.LBB1650:
-.LBB1651:
+.LBB1653:
+.LBB1654:
+.LBB1655:
+.LBB1656:
+.LBB1657:
 	.file 14 "./include/linux/of.h"
 	.loc 14 499 0
 	adrp	x1, .LC34
-.LBE1651:
-.LBE1650:
-.LBE1649:
-.LBE1648:
-.LBE1647:
-	.loc 1 2982 0
+.LBE1657:
+.LBE1656:
+.LBE1655:
+.LBE1654:
+.LBE1653:
+	.loc 1 2999 0
 	str	x22, [x20, 24]
-.LBB1721:
-.LBB1718:
+.LBB1727:
+.LBB1724:
+.LBB1664:
+.LBB1661:
 .LBB1658:
-.LBB1655:
-.LBB1652:
 	.loc 14 499 0
 	mov	x4, 0
-.LBE1652:
-.LBE1655:
 .LBE1658:
-.LBE1718:
-.LBE1721:
-	.loc 1 2983 0
+.LBE1661:
+.LBE1664:
+.LBE1724:
+.LBE1727:
+	.loc 1 3000 0
 	ldr	x2, [x20, 8]
-.LBB1722:
-.LBB1719:
+.LBB1728:
+.LBB1725:
+.LBB1665:
+.LBB1662:
 .LBB1659:
-.LBB1656:
-.LBB1653:
 	.loc 14 499 0
 	add	x1, x1, :lo12:.LC34
-.LBE1653:
-.LBE1656:
 .LBE1659:
-.LBE1719:
-.LBE1722:
-	.loc 1 2984 0
+.LBE1662:
+.LBE1665:
+.LBE1725:
+.LBE1728:
+	.loc 1 3001 0
 	stp	x2, x0, [x21, 8]
-.LBB1723:
-.LBB1720:
+.LBB1729:
+.LBB1726:
+.LBB1666:
+.LBB1663:
 .LBB1660:
-.LBB1657:
-.LBB1654:
 	.loc 14 499 0
 	mov	x3, 1
 	ldr	x0, [x22, 752]
@@ -7724,55 +7724,21 @@ ebc_probe:
 .LVL639:
 	.loc 14 501 0
 	tbnz	w0, #31, .L703
-.LBE1654:
-.LBE1657:
 .LBE1660:
-.LBB1661:
-.LBB1662:
-.LBB1663:
-	.loc 14 499 0
-	ldr	x0, [x22, 752]
-	adrp	x1, .LC58
-	mov	x4, 0
-	mov	x3, 1
-	add	x2, x20, 104
-	add	x1, x1, :lo12:.LC58
-	bl	of_property_read_variable_u32_array
-.LVL640:
-	.loc 14 501 0
-	tbnz	w0, #31, .L703
 .LBE1663:
-.LBE1662:
-.LBE1661:
-.LBB1664:
-.LBB1665:
-.LBB1666:
-	.loc 14 499 0
-	ldr	x0, [x22, 752]
-	adrp	x1, .LC59
-	mov	x4, 0
-	mov	x3, 1
-	add	x2, x20, 108
-	add	x1, x1, :lo12:.LC59
-	bl	of_property_read_variable_u32_array
-.LVL641:
-	.loc 14 501 0
-	tbnz	w0, #31, .L703
 .LBE1666:
-.LBE1665:
-.LBE1664:
 .LBB1667:
 .LBB1668:
 .LBB1669:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC60
+	adrp	x1, .LC58
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x20, 112
-	add	x1, x1, :lo12:.LC60
+	add	x2, x20, 104
+	add	x1, x1, :lo12:.LC58
 	bl	of_property_read_variable_u32_array
-.LVL642:
+.LVL640:
 	.loc 14 501 0
 	tbnz	w0, #31, .L703
 .LBE1669:
@@ -7783,13 +7749,13 @@ ebc_probe:
 .LBB1672:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC61
+	adrp	x1, .LC59
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x20, 128
-	add	x1, x1, :lo12:.LC61
+	add	x2, x20, 108
+	add	x1, x1, :lo12:.LC59
 	bl	of_property_read_variable_u32_array
-.LVL643:
+.LVL641:
 	.loc 14 501 0
 	tbnz	w0, #31, .L703
 .LBE1672:
@@ -7800,13 +7766,13 @@ ebc_probe:
 .LBB1675:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC62
+	adrp	x1, .LC60
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x20, 132
-	add	x1, x1, :lo12:.LC62
+	add	x2, x20, 112
+	add	x1, x1, :lo12:.LC60
 	bl	of_property_read_variable_u32_array
-.LVL644:
+.LVL642:
 	.loc 14 501 0
 	tbnz	w0, #31, .L703
 .LBE1675:
@@ -7817,13 +7783,13 @@ ebc_probe:
 .LBB1678:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC63
+	adrp	x1, .LC61
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x20, 136
-	add	x1, x1, :lo12:.LC63
+	add	x2, x20, 128
+	add	x1, x1, :lo12:.LC61
 	bl	of_property_read_variable_u32_array
-.LVL645:
+.LVL643:
 	.loc 14 501 0
 	tbnz	w0, #31, .L703
 .LBE1678:
@@ -7834,13 +7800,13 @@ ebc_probe:
 .LBB1681:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC64
+	adrp	x1, .LC62
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x20, 140
-	add	x1, x1, :lo12:.LC64
+	add	x2, x20, 132
+	add	x1, x1, :lo12:.LC62
 	bl	of_property_read_variable_u32_array
-.LVL646:
+.LVL644:
 	.loc 14 501 0
 	tbnz	w0, #31, .L703
 .LBE1681:
@@ -7851,13 +7817,13 @@ ebc_probe:
 .LBB1684:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC65
+	adrp	x1, .LC63
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x20, 144
-	add	x1, x1, :lo12:.LC65
+	add	x2, x20, 136
+	add	x1, x1, :lo12:.LC63
 	bl	of_property_read_variable_u32_array
-.LVL647:
+.LVL645:
 	.loc 14 501 0
 	tbnz	w0, #31, .L703
 .LBE1684:
@@ -7868,13 +7834,13 @@ ebc_probe:
 .LBB1687:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC66
+	adrp	x1, .LC64
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x20, 148
-	add	x1, x1, :lo12:.LC66
+	add	x2, x20, 140
+	add	x1, x1, :lo12:.LC64
 	bl	of_property_read_variable_u32_array
-.LVL648:
+.LVL646:
 	.loc 14 501 0
 	tbnz	w0, #31, .L703
 .LBE1687:
@@ -7885,13 +7851,13 @@ ebc_probe:
 .LBB1690:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC67
+	adrp	x1, .LC65
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x20, 152
-	add	x1, x1, :lo12:.LC67
+	add	x2, x20, 144
+	add	x1, x1, :lo12:.LC65
 	bl	of_property_read_variable_u32_array
-.LVL649:
+.LVL647:
 	.loc 14 501 0
 	tbnz	w0, #31, .L703
 .LBE1690:
@@ -7902,13 +7868,13 @@ ebc_probe:
 .LBB1693:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC68
+	adrp	x1, .LC66
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x20, 156
-	add	x1, x1, :lo12:.LC68
+	add	x2, x20, 148
+	add	x1, x1, :lo12:.LC66
 	bl	of_property_read_variable_u32_array
-.LVL650:
+.LVL648:
 	.loc 14 501 0
 	tbnz	w0, #31, .L703
 .LBE1693:
@@ -7919,13 +7885,13 @@ ebc_probe:
 .LBB1696:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC69
+	adrp	x1, .LC67
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x20, 160
-	add	x1, x1, :lo12:.LC69
+	add	x2, x20, 152
+	add	x1, x1, :lo12:.LC67
 	bl	of_property_read_variable_u32_array
-.LVL651:
+.LVL649:
 	.loc 14 501 0
 	tbnz	w0, #31, .L703
 .LBE1696:
@@ -7936,13 +7902,13 @@ ebc_probe:
 .LBB1699:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC70
+	adrp	x1, .LC68
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x20, 164
-	add	x1, x1, :lo12:.LC70
+	add	x2, x20, 156
+	add	x1, x1, :lo12:.LC68
 	bl	of_property_read_variable_u32_array
-.LVL652:
+.LVL650:
 	.loc 14 501 0
 	tbnz	w0, #31, .L703
 .LBE1699:
@@ -7953,13 +7919,13 @@ ebc_probe:
 .LBB1702:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC71
+	adrp	x1, .LC69
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x20, 168
-	add	x1, x1, :lo12:.LC71
+	add	x2, x20, 160
+	add	x1, x1, :lo12:.LC69
 	bl	of_property_read_variable_u32_array
-.LVL653:
+.LVL651:
 	.loc 14 501 0
 	tbnz	w0, #31, .L703
 .LBE1702:
@@ -7968,6 +7934,40 @@ ebc_probe:
 .LBB1703:
 .LBB1704:
 .LBB1705:
+	.loc 14 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC70
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 164
+	add	x1, x1, :lo12:.LC70
+	bl	of_property_read_variable_u32_array
+.LVL652:
+	.loc 14 501 0
+	tbnz	w0, #31, .L703
+.LBE1705:
+.LBE1704:
+.LBE1703:
+.LBB1706:
+.LBB1707:
+.LBB1708:
+	.loc 14 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC71
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 168
+	add	x1, x1, :lo12:.LC71
+	bl	of_property_read_variable_u32_array
+.LVL653:
+	.loc 14 501 0
+	tbnz	w0, #31, .L703
+.LBE1708:
+.LBE1707:
+.LBE1706:
+.LBB1709:
+.LBB1710:
+.LBB1711:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC72
@@ -7979,15 +7979,15 @@ ebc_probe:
 .LVL654:
 	.loc 14 501 0
 	tbz	w0, #31, .L729
-.LBE1705:
-.LBE1704:
-.LBE1703:
-	.loc 1 2251 0
+.LBE1711:
+.LBE1710:
+.LBE1709:
+	.loc 1 2268 0
 	str	wzr, [x21, 148]
 .L729:
-.LBB1706:
-.LBB1707:
-.LBB1708:
+.LBB1712:
+.LBB1713:
+.LBB1714:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC35
@@ -7999,15 +7999,15 @@ ebc_probe:
 .LVL655:
 	.loc 14 501 0
 	tbz	w0, #31, .L730
-.LBE1708:
-.LBE1707:
-.LBE1706:
-	.loc 1 2254 0
+.LBE1714:
+.LBE1713:
+.LBE1712:
+	.loc 1 2271 0
 	str	wzr, [x21, 152]
 .L730:
-.LBB1709:
-.LBB1710:
-.LBB1711:
+.LBB1715:
+.LBB1716:
+.LBB1717:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC36
@@ -8019,15 +8019,15 @@ ebc_probe:
 .LVL656:
 	.loc 14 501 0
 	tbz	w0, #31, .L731
-.LBE1711:
-.LBE1710:
-.LBE1709:
-	.loc 1 2257 0
+.LBE1717:
+.LBE1716:
+.LBE1715:
+	.loc 1 2274 0
 	str	wzr, [x21, 156]
 .L731:
-.LBB1712:
-.LBB1713:
-.LBB1714:
+.LBB1718:
+.LBB1719:
+.LBB1720:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC37
@@ -8039,15 +8039,15 @@ ebc_probe:
 .LVL657:
 	.loc 14 501 0
 	tbz	w0, #31, .L732
-.LBE1714:
-.LBE1713:
-.LBE1712:
-	.loc 1 2260 0
+.LBE1720:
+.LBE1719:
+.LBE1718:
+	.loc 1 2277 0
 	str	wzr, [x21, 92]
 .L732:
-.LBB1715:
-.LBB1716:
-.LBB1717:
+.LBB1721:
+.LBB1722:
+.LBB1723:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC38
@@ -8059,94 +8059,94 @@ ebc_probe:
 .LVL658:
 	.loc 14 501 0
 	tbz	w0, #31, .L733
-.LBE1717:
-.LBE1716:
-.LBE1715:
-	.loc 1 2263 0
+.LBE1723:
+.LBE1722:
+.LBE1721:
+	.loc 1 2280 0
 	str	wzr, [x21, 96]
 .L733:
-.LBE1720:
-.LBE1723:
-	.loc 1 2992 0
+.LBE1726:
+.LBE1729:
+	.loc 1 3009 0
 	ldr	w0, [x21, 88]
-.LBB1724:
-.LBB1725:
-	.loc 1 2715 0
+.LBB1730:
+.LBB1731:
+	.loc 1 2732 0
 	mov	w2, 0
-.LBE1725:
-.LBE1724:
-	.loc 1 2992 0
+.LBE1731:
+.LBE1730:
+	.loc 1 3009 0
 	str	w0, [x19, 68]
-	.loc 1 2993 0
+	.loc 1 3010 0
 	ldr	w1, [x21, 84]
 	str	w1, [x19, 72]
-	.loc 1 2996 0
+	.loc 1 3013 0
 	tst	x1, 15
-	.loc 1 2994 0
+	.loc 1 3011 0
 	mul	w0, w0, w1
-	.loc 1 2996 0
+	.loc 1 3013 0
 	cset	w1, eq
 	str	w1, [x19, 88]
-.LBB1739:
-.LBB1734:
-	.loc 1 2715 0
+.LBB1745:
+.LBB1740:
+	.loc 1 2732 0
 	adrp	x1, .LC39
 	add	x1, x1, :lo12:.LC39
-.LBE1734:
-.LBE1739:
-	.loc 1 2994 0
+.LBE1740:
+.LBE1745:
+	.loc 1 3011 0
 	lsr	w3, w0, 1
-	.loc 1 2995 0
+	.loc 1 3012 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x19, 20]
-.LBB1740:
-.LBB1735:
-	.loc 1 2706 0
+.LBB1746:
+.LBB1741:
+	.loc 1 2723 0
 	ldr	x26, [x20]
 .LVL659:
-	.loc 1 2715 0
+	.loc 1 2732 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL660:
-	.loc 1 2716 0
+	.loc 1 2733 0
 	cbz	x0, .L740
-	.loc 1 2719 0
+	.loc 1 2736 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL661:
 	mov	w25, w0
-	.loc 1 2721 0
+	.loc 1 2738 0
 	cbnz	w0, .L779
-.LBB1726:
-.LBB1727:
+.LBB1732:
+.LBB1733:
 	.file 15 "./include/linux/ioport.h"
 	.loc 15 204 0
 	ldp	x1, x2, [x29, 104]
-.LBE1727:
-.LBE1726:
-	.loc 1 2726 0
+.LBE1733:
+.LBE1732:
+	.loc 1 2743 0
 	str	x1, [x20, 184]
-	.loc 1 2729 0
+	.loc 1 2746 0
 	mov	x3, 1
 	mov	x0, x26
-.LBB1729:
-.LBB1728:
+.LBB1735:
+.LBB1734:
 	.loc 15 204 0
 	add	x2, x2, 1
 	sub	x2, x2, x1
-.LBE1728:
-.LBE1729:
-	.loc 1 2727 0
+.LBE1734:
+.LBE1735:
+	.loc 1 2744 0
 	str	w2, [x19, 16]
-	.loc 1 2729 0
+	.loc 1 2746 0
 	sxtw	x2, w2
 	bl	devm_memremap
 .LVL662:
 	str	x0, [x19, 8]
-	.loc 1 2731 0
+	.loc 1 2748 0
 	cbz	x0, .L711
-	.loc 1 2739 0
+	.loc 1 2756 0
 	mov	x1, x0
 	ldr	w2, [x19, 16]
 	ldr	x0, [x20, 184]
@@ -8154,278 +8154,278 @@ ebc_probe:
 	mov	w3, 4194304
 	bl	ebc_buf_init
 .LVL663:
-	.loc 1 2740 0
+	.loc 1 2757 0
 	cbnz	w0, .L711
-	.loc 1 2745 0
+	.loc 1 2762 0
 	ldr	x1, [x19, 8]
-	.loc 1 2746 0
+	.loc 1 2763 0
 	mov	x6, 1048576
-	.loc 1 2745 0
+	.loc 1 2762 0
 	mov	x3, 20971520
-	.loc 1 2746 0
+	.loc 1 2763 0
 	str	x6, [x21, 40]
-	.loc 1 2745 0
+	.loc 1 2762 0
 	add	x8, x1, x3
 	str	x8, [x21, 24]
 	mov	x7, 22020096
 	add	x5, x1, x7
-	.loc 1 2747 0
+	.loc 1 2764 0
 	ldr	x2, [x20, 184]
-	.loc 1 2752 0
+	.loc 1 2769 0
 	mov	x4, 23068672
 	add	x4, x1, x4
-.LBB1730:
-.LBB1731:
+.LBB1736:
+.LBB1737:
 	.loc 2 711 0
 	mov	x0, x26
-.LBE1731:
-.LBE1730:
-	.loc 1 2747 0
+.LBE1737:
+.LBE1736:
+	.loc 1 2764 0
 	add	x3, x2, x3
 	str	x3, [x21, 32]
-	.loc 1 2748 0
+	.loc 1 2765 0
 	str	x8, [x19, 184]
-	.loc 1 2747 0
+	.loc 1 2764 0
 	add	x2, x2, x7
-	.loc 1 2746 0
+	.loc 1 2763 0
 	str	x6, [x21, 64]
-	.loc 1 2747 0
+	.loc 1 2764 0
 	stp	x5, x2, [x21, 48]
-	.loc 1 2753 0
+	.loc 1 2770 0
 	mov	x2, 27262976
 	add	x2, x1, x2
 	stp	x4, x2, [x19, 144]
-	.loc 1 2754 0
+	.loc 1 2771 0
 	mov	x2, 31457280
 	add	x2, x1, x2
-	.loc 1 2748 0
+	.loc 1 2765 0
 	str	x5, [x19, 192]
-	.loc 1 2754 0
+	.loc 1 2771 0
 	str	x2, [x19, 160]
-	.loc 1 2755 0
+	.loc 1 2772 0
 	mov	x2, 35651584
 	add	x1, x1, x2
 	str	x1, [x19, 128]
-	.loc 1 2758 0
+	.loc 1 2775 0
 	ldp	w2, w1, [x21, 84]
-.LBB1733:
-.LBB1732:
+.LBB1739:
+.LBB1738:
 	.loc 2 711 0
 	mul	w1, w2, w1
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	bl	devm_kmalloc
 .LVL664:
-.LBE1732:
-.LBE1733:
-	.loc 1 2758 0
+.LBE1738:
+.LBE1739:
+	.loc 1 2775 0
 	str	x0, [x19, 168]
-	.loc 1 2759 0
+	.loc 1 2776 0
 	cbz	x0, .L711
-	.loc 1 2761 0
+	.loc 1 2778 0
 	ldp	w2, w1, [x21, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
 .LVL665:
-	.loc 1 2762 0
+	.loc 1 2779 0
 	ldrsw	x2, [x19, 20]
 	mov	w1, 255
 	ldr	x0, [x19, 160]
 	bl	memset
 .LVL666:
-.LBE1735:
-.LBE1740:
-.LBB1741:
-.LBB1742:
-	.loc 1 2663 0
+.LBE1741:
+.LBE1746:
+.LBB1747:
+.LBB1748:
+	.loc 1 2680 0
 	ldr	x26, [x19, 104]
 .LVL667:
-	.loc 1 2669 0
+	.loc 1 2686 0
 	adrp	x1, .LC41
 	mov	w2, 0
 	add	x1, x1, :lo12:.LC41
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL668:
-	.loc 1 2670 0
+	.loc 1 2687 0
 	cbz	x0, .L741
-	.loc 1 2673 0
+	.loc 1 2690 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL669:
 	mov	w25, w0
-	.loc 1 2675 0
+	.loc 1 2692 0
 	cbz	w0, .L780
 .L712:
-.LBE1742:
-.LBE1741:
-	.loc 1 3008 0
+.LBE1748:
+.LBE1747:
+	.loc 1 3025 0
 	adrp	x1, .LC74
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC74
 	bl	_dev_err
 .LVL670:
-	.loc 1 3009 0
+	.loc 1 3026 0
 	b	.L689
 .LVL671:
 	.p2align 3
 .L703:
-	.loc 1 2990 0
+	.loc 1 3007 0
 	mov	w25, -22
-	.loc 1 2989 0
+	.loc 1 3006 0
 	adrp	x1, .LC80
 	mov	w2, w25
 	add	x1, x1, :lo12:.LC80
 	mov	x0, x22
 	bl	_dev_err
 .LVL672:
-	.loc 1 2990 0
+	.loc 1 3007 0
 	b	.L689
 .LVL673:
 	.p2align 3
 .L776:
-	.loc 1 2963 0
+	.loc 1 2980 0
 	adrp	x1, .LC31
 	mov	x0, x22
 .LVL674:
 	add	x1, x1, :lo12:.LC31
-	.loc 1 2964 0
+	.loc 1 2981 0
 	mov	w25, -19
-	.loc 1 2963 0
+	.loc 1 2980 0
 	bl	_dev_err
 .LVL675:
-	.loc 1 2964 0
+	.loc 1 2981 0
 	b	.L689
 .LVL676:
 	.p2align 3
 .L701:
-	.loc 1 2975 0
+	.loc 1 2992 0
 	adrp	x1, .LC33
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC33
-	.loc 1 2976 0
+	.loc 1 2993 0
 	mov	w25, -517
-	.loc 1 2975 0
+	.loc 1 2992 0
 	bl	_dev_err
 .LVL677:
-	.loc 1 2976 0
+	.loc 1 2993 0
 	b	.L689
 .LVL678:
 	.p2align 3
 .L779:
-.LBB1750:
-.LBB1736:
-	.loc 1 2722 0
+.LBB1756:
+.LBB1742:
+	.loc 1 2739 0
 	adrp	x1, .LC40
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC40
 	bl	_dev_err
 .LVL679:
 .L708:
-.LBE1736:
-.LBE1750:
-	.loc 1 3001 0
+.LBE1742:
+.LBE1756:
+	.loc 1 3018 0
 	adrp	x1, .LC73
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC73
 	bl	_dev_err
 .LVL680:
-	.loc 1 3002 0
+	.loc 1 3019 0
 	b	.L689
 .LVL681:
 .L780:
-.LBB1751:
-.LBB1747:
-	.loc 1 2684 0
+.LBB1757:
+.LBB1753:
+	.loc 1 2701 0
 	mov	x0, x26
 	mov	x3, 1
-.LBB1743:
-.LBB1744:
+.LBB1749:
+.LBB1750:
 	.loc 15 204 0
 	ldp	x1, x26, [x29, 104]
 .LVL682:
-.LBE1744:
-.LBE1743:
-	.loc 1 2681 0
+.LBE1750:
+.LBE1749:
+	.loc 1 2698 0
 	str	x1, [x19, 32]
-.LBB1746:
-.LBB1745:
+.LBB1752:
+.LBB1751:
 	.loc 15 204 0
 	add	x26, x26, 1
 	sub	x26, x26, x1
-.LBE1745:
-.LBE1746:
-	.loc 1 2682 0
+.LBE1751:
+.LBE1752:
+	.loc 1 2699 0
 	str	w26, [x19, 40]
-	.loc 1 2684 0
+	.loc 1 2701 0
 	sxtw	x2, w26
 	bl	devm_memremap
 .LVL683:
 	str	x0, [x19, 208]
-	.loc 1 2686 0
+	.loc 1 2703 0
 	cbz	x0, .L781
-	.loc 1 2691 0
+	.loc 1 2708 0
 	bl	epd_lut_from_mem_init
 .LVL684:
-	.loc 1 2692 0
+	.loc 1 2709 0
 	tbnz	w0, #31, .L782
 .L714:
-.LBE1747:
-.LBE1751:
-.LBB1752:
-.LBB1753:
-	.loc 1 2771 0
+.LBE1753:
+.LBE1757:
+.LBB1758:
+.LBB1759:
+	.loc 1 2788 0
 	add	x0, x20, 752
 	mov	x1, 68719476704
 	str	x1, [x19, 560]
-	.loc 1 2775 0
+	.loc 1 2792 0
 	add	x24, x24, :lo12:.LANCHOR0
-.LBB1754:
-.LBB1755:
-.LBB1756:
-.LBB1757:
-.LBB1758:
+.LBB1760:
+.LBB1761:
+.LBB1762:
+.LBB1763:
+.LBB1764:
 	.loc 12 288 0
 	str	x0, [x20, 752]
-.LBE1758:
-.LBE1757:
-.LBE1756:
-.LBE1755:
-.LBE1754:
-	.loc 1 2772 0
+.LBE1764:
+.LBE1763:
+.LBE1762:
+.LBE1761:
+.LBE1760:
+	.loc 1 2789 0
 	adrp	x5, .LC75
-.LBB1760:
-.LBB1759:
+.LBB1766:
+.LBB1765:
 	.file 16 "./include/linux/list.h"
 	.loc 16 29 0
 	str	x0, [x0, 8]
-.LBE1759:
-.LBE1760:
-	.loc 1 2771 0
+.LBE1765:
+.LBE1766:
+	.loc 1 2788 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x19, 584]
-	.loc 1 2772 0
+	.loc 1 2789 0
 	add	x5, x5, :lo12:.LC75
 	mov	w1, 14
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 1
 	movk	w1, 0xa, lsl 16
-	.loc 1 2769 0
+	.loc 1 2786 0
 	mov	w26, 99
-	.loc 1 2772 0
+	.loc 1 2789 0
 	adrp	x0, .LC76
-	.loc 1 2769 0
+	.loc 1 2786 0
 	str	w26, [x29, 104]
-	.loc 1 2772 0
+	.loc 1 2789 0
 	add	x0, x0, :lo12:.LC76
 	bl	__alloc_workqueue_key
 .LVL685:
 	str	x0, [x19, 608]
-	.loc 1 2775 0
+	.loc 1 2792 0
 	adrp	x3, .LC77
 	mov	w2, -1
 	add	x3, x3, :lo12:.LC77
@@ -8435,18 +8435,18 @@ ebc_probe:
 	bl	kthread_create_on_node
 .LVL686:
 	str	x0, [x24, 8]
-	.loc 1 2776 0
+	.loc 1 2793 0
 	cmn	x0, #4096
 	bhi	.L783
-	.loc 1 2780 0
+	.loc 1 2797 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
 .LVL687:
-	.loc 1 2781 0
+	.loc 1 2798 0
 	ldr	x2, [x24, 8]
-.LBB1761:
-.LBB1762:
+.LBB1767:
+.LBB1768:
 	.file 17 "./arch/arm64/include/asm/atomic_lse.h"
 	.loc 17 47 0
 	mov	w0, 1
@@ -8482,10 +8482,10 @@ ebc_probe:
 // 0 "" 2
 .LVL690:
 #NO_APP
-.LBE1762:
-.LBE1761:
-.LBB1763:
-	.loc 1 2784 0
+.LBE1768:
+.LBE1767:
+.LBB1769:
+	.loc 1 2801 0
 	adrp	x3, .LC46
 	adrp	x0, ebc_thread
 .LVL691:
@@ -8493,11 +8493,11 @@ ebc_probe:
 	mov	w2, -1
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x19
-.LBE1763:
-	.loc 1 2783 0
+.LBE1769:
+	.loc 1 2800 0
 	str	w26, [x29, 104]
-.LBB1764:
-	.loc 1 2784 0
+.LBB1770:
+	.loc 1 2801 0
 	bl	kthread_create_on_node
 .LVL692:
 	mov	x24, x0
@@ -8506,18 +8506,18 @@ ebc_probe:
 	bhi	.L716
 	bl	wake_up_process
 .LVL694:
-.LBE1764:
+.LBE1770:
 	str	x24, [x19, 136]
-	.loc 1 2789 0
+	.loc 1 2806 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x24
 	bl	sched_setscheduler_nocheck
 .LVL695:
-	.loc 1 2790 0
+	.loc 1 2807 0
 	ldr	x2, [x19, 136]
-.LBB1765:
-.LBB1766:
+.LBB1771:
+.LBB1772:
 	.loc 17 47 0
 	mov	w0, 1
 .LVL696:
@@ -8552,60 +8552,60 @@ ebc_probe:
 // 0 "" 2
 .LVL698:
 #NO_APP
-.LBE1766:
-.LBE1765:
-.LBE1753:
-.LBE1752:
-.LBB1769:
-.LBB1770:
-	.loc 1 2799 0
+.LBE1772:
+.LBE1771:
+.LBE1759:
+.LBE1758:
+.LBB1775:
+.LBB1776:
+	.loc 1 2816 0
 	mov	w0, -1
 .LVL699:
 	str	w0, [x19, 64]
-.LBB1771:
-.LBB1772:
+.LBB1777:
+.LBB1778:
 	.loc 4 39 0
 	add	x0, x20, 416
 .LVL700:
-.LBE1772:
-.LBE1771:
-	.loc 1 2803 0
+.LBE1778:
+.LBE1777:
+	.loc 1 2820 0
 	str	wzr, [x19, 44]
-	.loc 1 2802 0
+	.loc 1 2819 0
 	str	wzr, [x19, 96]
-.LBB1777:
-.LBB1773:
+.LBB1783:
+.LBB1779:
 	.loc 4 43 0
 	adrp	x1, .LC47
-.LBE1773:
-.LBE1777:
-	.loc 1 2798 0
+.LBE1779:
+.LBE1783:
+	.loc 1 2815 0
 	str	wzr, [x19, 200]
-.LBB1778:
-.LBB1774:
+.LBB1784:
+.LBB1780:
 	.loc 4 43 0
 	add	x1, x1, :lo12:.LC47
-.LBE1774:
-.LBE1778:
-	.loc 1 2800 0
+.LBE1780:
+.LBE1784:
+	.loc 1 2817 0
 	str	wzr, [x19, 616]
-	.loc 1 2810 0
+	.loc 1 2827 0
 	add	x24, x20, 632
 .LVL701:
-	.loc 1 2801 0
+	.loc 1 2818 0
 	str	wzr, [x19, 620]
-	.loc 1 2811 0
+	.loc 1 2828 0
 	adrp	x26, jiffies
-.LBB1779:
-.LBB1775:
+.LBB1785:
+.LBB1781:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0]
-.LBE1775:
-.LBE1779:
-	.loc 1 2811 0
+.LBE1781:
+.LBE1785:
+	.loc 1 2828 0
 	mov	x27, 268435455
-.LBB1780:
-.LBB1776:
+.LBB1786:
+.LBB1782:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0, 16]
 	stp	xzr, xzr, [x0, 32]
@@ -8624,11 +8624,11 @@ ebc_probe:
 	.loc 4 45 0
 	bl	wakeup_source_add
 .LVL702:
-.LBE1776:
-.LBE1780:
-	.loc 1 2807 0
+.LBE1782:
+.LBE1786:
+	.loc 1 2824 0
 	str	wzr, [x19, 440]
-	.loc 1 2810 0
+	.loc 1 2827 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -8637,16 +8637,16 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
 .LVL703:
-	.loc 1 2811 0
+	.loc 1 2828 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
-	.loc 1 2814 0
+	.loc 1 2831 0
 	add	x24, x20, 688
-	.loc 1 2811 0
+	.loc 1 2828 0
 	add	x1, x1, x27
 	bl	mod_timer
 .LVL704:
-	.loc 1 2814 0
+	.loc 1 2831 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -8655,109 +8655,109 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
 .LVL705:
-	.loc 1 2815 0
+	.loc 1 2832 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
 	add	x1, x1, x27
 	bl	mod_timer
 .LVL706:
-.LBE1770:
-.LBE1769:
-.LBB1781:
-.LBB1782:
-	.loc 1 2825 0
+.LBE1776:
+.LBE1775:
+.LBB1787:
+.LBB1788:
+	.loc 1 2842 0
 	adrp	x0, saved_command_line
 	adrp	x1, .LC48
-	.loc 1 2822 0
+	.loc 1 2839 0
 	stp	wzr, wzr, [x29, 100]
 .LVL707:
-	.loc 1 2825 0
+	.loc 1 2842 0
 	add	x1, x1, :lo12:.LC48
 	ldr	x24, [x0, #:lo12:saved_command_line]
 	mov	x0, x24
 	bl	strstr
 .LVL708:
-	.loc 1 2826 0
+	.loc 1 2843 0
 	adrp	x1, .LC49
-	.loc 1 2825 0
+	.loc 1 2842 0
 	mov	x26, x0
 .LVL709:
-	.loc 1 2826 0
+	.loc 1 2843 0
 	add	x1, x1, :lo12:.LC49
 	mov	x0, x24
 	bl	strstr
 .LVL710:
 	mov	x28, x0
 .LVL711:
-	.loc 1 2831 0
+	.loc 1 2848 0
 	cbz	x26, .L717
-	.loc 1 2832 0
+	.loc 1 2849 0
 	add	x2, x29, 100
 	adrp	x1, .LC50
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC50
 	bl	sscanf
 .LVL712:
-	.loc 1 2833 0
+	.loc 1 2850 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
 	bls	.L784
 .L717:
-	.loc 1 2845 0
+	.loc 1 2862 0
 	mov	w24, 0
 .LVL713:
 	mov	x27, 0
 .LVL714:
-	.loc 1 2829 0
+	.loc 1 2846 0
 	mov	x26, 0
 .LVL715:
-	.loc 1 2845 0
+	.loc 1 2862 0
 	cbz	x28, .L737
 .LVL716:
 .L736:
-	.loc 1 2846 0
+	.loc 1 2863 0
 	add	x2, x29, 104
 	mov	x0, x28
 	adrp	x1, .LC53
 	add	x1, x1, :lo12:.LC53
 	bl	sscanf
 .LVL717:
-	.loc 1 2824 0
+	.loc 1 2841 0
 	mov	w28, 0
 .LVL718:
-	.loc 1 2847 0
+	.loc 1 2864 0
 	ldr	w2, [x29, 104]
-	.loc 1 2829 0
+	.loc 1 2846 0
 	mov	x26, 0
 .LVL719:
-	.loc 1 2847 0
+	.loc 1 2864 0
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
 	bls	.L785
 .L721:
-	.loc 1 2859 0
+	.loc 1 2876 0
 	cbnz	w24, .L720
 .LVL720:
 .L737:
-	.loc 1 2860 0
+	.loc 1 2877 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC56
 	add	x1, x1, :lo12:.LC56
 	bl	_dev_info
 .LVL721:
-	.loc 1 2861 0
+	.loc 1 2878 0
 	ldr	x0, [x20, 16]
 	bl	ebc_pmic_verity_vcom
 .LVL722:
-.LBB1783:
-.LBB1784:
-	.loc 1 2170 0
+.LBB1789:
+.LBB1790:
+	.loc 1 2187 0
 	bl	ebc_empty_buf_get
 .LVL723:
 	mov	x24, x0
 .LVL724:
-	.loc 1 2171 0
+	.loc 1 2188 0
 	ldp	w2, w0, [x20, 108]
 	mov	w1, 255
 	mul	w2, w2, w0
@@ -8765,112 +8765,112 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memset
 .LVL725:
-	.loc 1 2174 0
+	.loc 1 2191 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2172 0
+	.loc 1 2189 0
 	mov	w0, 17
 	str	w0, [x24, 40]
-	.loc 1 2177 0
+	.loc 1 2194 0
 	mov	w2, 16
-	.loc 1 2178 0
+	.loc 1 2195 0
 	mov	x0, x24
-	.loc 1 2175 0
+	.loc 1 2192 0
 	ldr	w1, [x20, 108]
 	str	w1, [x24, 56]
-	.loc 1 2176 0
+	.loc 1 2193 0
 	ldr	w1, [x20, 112]
-	.loc 1 2177 0
+	.loc 1 2194 0
 	stp	w1, w2, [x24, 60]
-	.loc 1 2178 0
+	.loc 1 2195 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL726:
 .L723:
-.LBE1784:
-.LBE1783:
-	.loc 1 2879 0
+.LBE1790:
+.LBE1789:
+	.loc 1 2896 0
 	cbnz	w28, .L786
 .L725:
-	.loc 1 2893 0
+	.loc 1 2910 0
 	ldr	w0, [x19, 96]
 	adrp	x21, .LANCHOR1
 	cbz	w0, .L787
 .L727:
-	.loc 1 2898 0
+	.loc 1 2915 0
 	cbz	x27, .L728
-	.loc 1 2899 0
+	.loc 1 2916 0
 	mov	x0, x27
 	bl	kfree
 .LVL727:
 .L728:
-	.loc 1 2900 0
+	.loc 1 2917 0
 	cbz	x26, .L719
-	.loc 1 2901 0
+	.loc 1 2918 0
 	mov	x0, x26
 	bl	kfree
 .LVL728:
 .L719:
-.LBE1782:
-.LBE1781:
-.LBB1794:
-.LBB1795:
-.LBB1796:
+.LBE1788:
+.LBE1787:
+.LBB1800:
+.LBB1801:
+.LBB1802:
 	.loc 2 1186 0
 	str	x20, [x22, 184]
-.LBE1796:
-.LBE1795:
-.LBE1794:
-.LBB1797:
-.LBB1798:
-	.loc 1 2646 0
+.LBE1802:
+.LBE1801:
+.LBE1800:
+.LBB1803:
+.LBB1804:
+	.loc 1 2663 0
 	add	x21, x21, :lo12:.LANCHOR1
 	add	x0, x21, 224
-	.loc 1 2647 0
+	.loc 1 2664 0
 	add	x22, x21, 512
-	.loc 1 2646 0
+	.loc 1 2663 0
 	bl	misc_register
 .LVL729:
-	.loc 1 2647 0
+	.loc 1 2664 0
 	add	x0, x21, 400
 	bl	misc_register
 .LVL730:
-	.loc 1 2649 0
+	.loc 1 2666 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 480
 	bl	device_create_file
 .LVL731:
-	.loc 1 2650 0
+	.loc 1 2667 0
 	ldr	x0, [x20, 288]
 	mov	x1, x22
 	bl	device_create_file
 .LVL732:
-	.loc 1 2651 0
+	.loc 1 2668 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 544
 	bl	device_create_file
 .LVL733:
-	.loc 1 2652 0
+	.loc 1 2669 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 576
 	bl	device_create_file
 .LVL734:
-	.loc 1 2653 0
+	.loc 1 2670 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 608
 	bl	device_create_file
 .LVL735:
-	.loc 1 2654 0
+	.loc 1 2671 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 640
 	bl	device_create_file
 .LVL736:
-	.loc 1 2655 0
+	.loc 1 2672 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 672
 	bl	device_create_file
 .LVL737:
-.LBE1798:
-.LBE1797:
-	.loc 1 3030 0
+.LBE1804:
+.LBE1803:
+	.loc 1 3047 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LC16
 	adrp	x1, .LC57
@@ -8878,16 +8878,16 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC57
 	bl	_dev_info
 .LVL738:
-	.loc 1 3032 0
+	.loc 1 3049 0
 	b	.L689
 .LVL739:
 .L787:
-.LBB1799:
-.LBB1791:
-	.loc 1 2894 0
+.LBB1805:
+.LBB1797:
+	.loc 1 2911 0
 	mov	w2, 1
 	str	w2, [x19, 96]
-	.loc 1 2895 0
+	.loc 1 2912 0
 	add	x0, x21, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
@@ -8896,18 +8896,18 @@ ebc_probe:
 	b	.L727
 .LVL741:
 .L784:
-	.loc 1 2835 0
+	.loc 1 2852 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC51
 	add	x1, x1, :lo12:.LC51
 	bl	_dev_info
 .LVL742:
-	.loc 1 2836 0
+	.loc 1 2853 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
-.LBB1785:
-.LBB1786:
-.LBB1787:
+.LBB1791:
+.LBB1792:
+.LBB1793:
 	.file 18 "./include/linux/slab.h"
 	.loc 18 553 0
 	mov	w1, 32960
@@ -8917,12 +8917,12 @@ ebc_probe:
 .LVL743:
 	mov	x27, x0
 .LVL744:
-.LBE1787:
-.LBE1786:
-.LBE1785:
-	.loc 1 2837 0
+.LBE1793:
+.LBE1792:
+.LBE1791:
+	.loc 1 2854 0
 	cbz	x0, .L788
-	.loc 1 2841 0
+	.loc 1 2858 0
 	ldp	w2, w1, [x21, 84]
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
@@ -8935,23 +8935,23 @@ ebc_probe:
 	add	x1, x3, x1
 	bl	memcpy
 .LVL747:
-	.loc 1 2845 0
+	.loc 1 2862 0
 	cbnz	x28, .L789
-	.loc 1 2824 0
+	.loc 1 2841 0
 	mov	w28, 0
 .LVL748:
-	.loc 1 2829 0
+	.loc 1 2846 0
 	mov	x26, 0
 .LVL749:
 .L720:
-	.loc 1 2866 0
+	.loc 1 2883 0
 	bl	ebc_empty_buf_get
 .LVL750:
 	mov	x24, x0
 .LVL751:
-	.loc 1 2867 0
+	.loc 1 2884 0
 	cbz	x0, .L723
-	.loc 1 2868 0
+	.loc 1 2885 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
@@ -8959,40 +8959,40 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL752:
-	.loc 1 2871 0
+	.loc 1 2888 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2869 0
+	.loc 1 2886 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2874 0
+	.loc 1 2891 0
 	mov	w2, 16
-	.loc 1 2875 0
+	.loc 1 2892 0
 	mov	x0, x24
-	.loc 1 2872 0
+	.loc 1 2889 0
 	ldr	w1, [x21, 84]
 	str	w1, [x24, 56]
-	.loc 1 2873 0
+	.loc 1 2890 0
 	ldr	w1, [x21, 88]
-	.loc 1 2874 0
+	.loc 1 2891 0
 	stp	w1, w2, [x24, 60]
-	.loc 1 2875 0
+	.loc 1 2892 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL753:
 	b	.L723
 .LVL754:
 .L785:
-	.loc 1 2849 0
+	.loc 1 2866 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC54
 	add	x1, x1, :lo12:.LC54
 	bl	_dev_info
 .LVL755:
-	.loc 1 2850 0
+	.loc 1 2867 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
-.LBB1788:
-.LBB1789:
-.LBB1790:
+.LBB1794:
+.LBB1795:
+.LBB1796:
 	.loc 18 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
@@ -9000,16 +9000,16 @@ ebc_probe:
 	bl	__kmalloc
 .LVL756:
 	mov	x26, x0
-.LBE1790:
-.LBE1789:
-.LBE1788:
-	.loc 1 2851 0
+.LBE1796:
+.LBE1795:
+.LBE1794:
+	.loc 1 2868 0
 	cbz	x0, .L790
-	.loc 1 2855 0
+	.loc 1 2872 0
 	ldp	w2, w1, [x21, 84]
-	.loc 1 2848 0
+	.loc 1 2865 0
 	mov	w28, 1
-	.loc 1 2855 0
+	.loc 1 2872 0
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
@@ -9024,23 +9024,23 @@ ebc_probe:
 	b	.L721
 .LVL760:
 .L693:
-.LBE1791:
-.LBE1799:
-	.loc 1 2938 0
+.LBE1797:
+.LBE1805:
+	.loc 1 2955 0
 	mov	w25, -517
 	b	.L689
 .LVL761:
 .L786:
-.LBB1800:
-.LBB1792:
-	.loc 1 2880 0
+.LBB1806:
+.LBB1798:
+	.loc 1 2897 0
 	bl	ebc_empty_buf_get
 .LVL762:
 	mov	x24, x0
 .LVL763:
-	.loc 1 2881 0
+	.loc 1 2898 0
 	cbz	x0, .L725
-	.loc 1 2882 0
+	.loc 1 2899 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
@@ -9048,69 +9048,69 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL764:
-	.loc 1 2885 0
+	.loc 1 2902 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2883 0
+	.loc 1 2900 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2888 0
+	.loc 1 2905 0
 	mov	w1, 16
-	.loc 1 2886 0
+	.loc 1 2903 0
 	ldr	w0, [x21, 84]
 	str	w0, [x24, 56]
-	.loc 1 2887 0
+	.loc 1 2904 0
 	ldr	w0, [x21, 88]
-	.loc 1 2888 0
+	.loc 1 2905 0
 	stp	w0, w1, [x24, 60]
-	.loc 1 2889 0
+	.loc 1 2906 0
 	mov	x0, x24
 	bl	ebc_add_to_dsp_buf_list
 .LVL765:
 	b	.L725
 .LVL766:
 .L739:
-.LBE1792:
-.LBE1800:
-	.loc 1 2924 0
+.LBE1798:
+.LBE1806:
+	.loc 1 2941 0
 	mov	w25, -12
 	b	.L689
 .LVL767:
 .L694:
-	.loc 1 2948 0
+	.loc 1 2965 0
 	adrp	x1, .LC29
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC29
-	.loc 1 2949 0
+	.loc 1 2966 0
 	mov	w25, -22
-	.loc 1 2948 0
+	.loc 1 2965 0
 	bl	_dev_err
 .LVL768:
-	.loc 1 2949 0
+	.loc 1 2966 0
 	b	.L689
 .LVL769:
 .L782:
-.LBB1801:
-.LBB1748:
-	.loc 1 2693 0
+.LBB1807:
+.LBB1754:
+	.loc 1 2710 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC43
 	add	x1, x1, :lo12:.LC43
 	bl	_dev_err
 .LVL770:
-	.loc 1 2694 0
+	.loc 1 2711 0
 	ldr	x0, [x19, 104]
 	mov	w2, w26
 	ldr	x1, [x19, 208]
 	bl	epd_lut_from_file_init
 .LVL771:
-	.loc 1 2695 0
+	.loc 1 2712 0
 	tbz	w0, #31, .L714
-	.loc 1 2696 0
+	.loc 1 2713 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC44
-	.loc 1 2697 0
+	.loc 1 2714 0
 	mov	w25, -1
-	.loc 1 2696 0
+	.loc 1 2713 0
 	add	x1, x1, :lo12:.LC44
 	bl	_dev_err
 .LVL772:
@@ -9118,114 +9118,114 @@ ebc_probe:
 .LVL773:
 	.p2align 3
 .L711:
-.LBE1748:
-.LBE1801:
-.LBB1802:
-.LBB1737:
-	.loc 1 2732 0
+.LBE1754:
+.LBE1807:
+.LBB1808:
+.LBB1743:
+	.loc 1 2749 0
 	mov	w25, -12
 	b	.L708
 .LVL774:
 .L783:
-.LBE1737:
-.LBE1802:
-.LBB1803:
-.LBB1767:
-	.loc 1 2777 0
+.LBE1743:
+.LBE1808:
+.LBB1809:
+.LBB1773:
+	.loc 1 2794 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC45
 	add	x1, x1, :lo12:.LC45
 	bl	_dev_err
 .LVL775:
 .L715:
-.LBE1767:
-.LBE1803:
-	.loc 1 3015 0
+.LBE1773:
+.LBE1809:
+	.loc 1 3032 0
 	adrp	x1, .LC79
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC79
-	.loc 1 3016 0
+	.loc 1 3033 0
 	mov	w25, -1
-	.loc 1 3015 0
+	.loc 1 3032 0
 	bl	_dev_err
 .LVL776:
-	.loc 1 3016 0
+	.loc 1 3033 0
 	b	.L689
 .LVL777:
 .L716:
-.LBB1804:
-.LBB1768:
-	.loc 1 2786 0
+.LBB1810:
+.LBB1774:
+	.loc 1 2803 0
 	ldr	x0, [x19, 104]
 .LVL778:
 	adrp	x1, .LC78
-	.loc 1 2784 0
+	.loc 1 2801 0
 	str	x24, [x19, 136]
-	.loc 1 2786 0
+	.loc 1 2803 0
 	add	x1, x1, :lo12:.LC78
 	bl	_dev_err
 .LVL779:
 	b	.L715
 .LVL780:
 .L775:
-.LBE1768:
-.LBE1804:
-	.loc 1 2931 0
+.LBE1774:
+.LBE1810:
+	.loc 1 2948 0
 	adrp	x1, .LC27
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC27
-	.loc 1 2932 0
+	.loc 1 2949 0
 	mov	w25, -19
-	.loc 1 2931 0
+	.loc 1 2948 0
 	bl	_dev_err
 .LVL781:
-	.loc 1 2932 0
+	.loc 1 2949 0
 	b	.L689
 .LVL782:
 .L740:
-.LBB1805:
-.LBB1738:
-	.loc 1 2717 0
+.LBB1811:
+.LBB1744:
+	.loc 1 2734 0
 	mov	w25, -19
 	b	.L708
 .LVL783:
 .L741:
-.LBE1738:
-.LBE1805:
-.LBB1806:
-.LBB1749:
-	.loc 1 2671 0
+.LBE1744:
+.LBE1811:
+.LBB1812:
+.LBB1755:
+	.loc 1 2688 0
 	mov	w25, -19
 	b	.L712
 .LVL784:
 .L781:
-	.loc 1 2687 0
+	.loc 1 2704 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
 	adrp	x1, .LC42
-	mov	w3, 2687
+	mov	w3, 2704
 	add	x2, x2, 32
 	add	x1, x1, :lo12:.LC42
-	.loc 1 2688 0
+	.loc 1 2705 0
 	mov	w25, -12
-	.loc 1 2687 0
+	.loc 1 2704 0
 	bl	_dev_err
 .LVL785:
 	b	.L712
 .LVL786:
 .L789:
-.LBE1749:
-.LBE1806:
-.LBB1807:
-.LBB1793:
-	.loc 1 2834 0
+.LBE1755:
+.LBE1812:
+.LBB1813:
+.LBB1799:
+	.loc 1 2851 0
 	mov	w24, 1
 .LVL787:
 	b	.L736
 .LVL788:
 .L788:
-	.loc 1 2838 0
+	.loc 1 2855 0
 	ldr	x0, [x19, 104]
 .LVL789:
 	adrp	x1, .LC52
@@ -9236,7 +9236,7 @@ ebc_probe:
 	b	.L719
 .LVL791:
 .L790:
-	.loc 1 2852 0
+	.loc 1 2869 0
 	ldr	x0, [x19, 104]
 .LVL792:
 	adrp	x1, .LC55
@@ -9247,19 +9247,19 @@ ebc_probe:
 	b	.L719
 .LVL794:
 .L778:
-.LBE1793:
-.LBE1807:
-	.loc 1 3033 0
+.LBE1799:
+.LBE1813:
+	.loc 1 3050 0
 	bl	__stack_chk_fail
 .LVL795:
 	.cfi_endproc
-.LFE2859:
+.LFE2860:
 	.size	ebc_probe, .-ebc_probe
 	.align	2
 	.p2align 3,,7
 	.type	ebc_power_set.constprop.16, %function
 ebc_power_set.constprop.16:
-.LFB2883:
+.LFB2884:
 	.loc 1 183 0
 	.cfi_startproc
 .LVL796:
@@ -9286,27 +9286,27 @@ ebc_power_set.constprop.16:
 	str	w1, [x20, 200]
 	.loc 1 194 0
 	ldr	x2, [x19, 16]
-.LBB1808:
-.LBB1809:
+.LBB1814:
+.LBB1815:
 	.loc 3 30 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
 .LVL798:
-.LBE1809:
-.LBE1808:
+.LBE1815:
+.LBE1814:
 	.loc 1 195 0
 	ldr	x2, [x19, 8]
-.LBB1810:
-.LBB1811:
+.LBB1816:
+.LBB1817:
 	.loc 11 46 0
 	add	x1, x19, 24
 	mov	x0, x2
 	ldr	x2, [x2, 48]
 	blr	x2
 .LVL799:
-.LBE1811:
-.LBE1810:
+.LBE1817:
+.LBE1816:
 	.loc 1 196 0
 	ldr	x0, [x19]
 	adrp	x1, .LC81
@@ -9332,29 +9332,29 @@ ebc_power_set.constprop.16:
 	.loc 1 190 0
 	mov	w0, 1
 	str	w0, [x20, 440]
-.LBB1812:
-.LBB1813:
+.LBB1818:
+.LBB1819:
 	.loc 4 58 0
 	add	x0, x19, 416
 	bl	__pm_stay_awake
 .LVL803:
 	b	.L792
-.LBE1813:
-.LBE1812:
+.LBE1819:
+.LBE1818:
 	.cfi_endproc
-.LFE2883:
+.LFE2884:
 	.size	ebc_power_set.constprop.16, .-ebc_power_set.constprop.16
 	.align	2
 	.p2align 3,,7
 	.type	ebc_open, %function
 ebc_open:
-.LFB2882:
+.LFB2883:
 	.cfi_startproc
 	mov	w0, 0
 	str	xzr, [x1, 104]
 	ret
 	.cfi_endproc
-.LFE2882:
+.LFE2883:
 	.size	ebc_open, .-ebc_open
 	.align	2
 	.p2align 3,,7
@@ -9791,8 +9791,8 @@ new_buffer_refresh:
 	.p2align 3,,7
 	.type	ebc_thread, %function
 ebc_thread:
-.LFB2835:
-	.loc 1 1830 0
+.LFB2836:
+	.loc 1 1845 0
 	.cfi_startproc
 .LVL849:
 	stp	x29, x30, [sp, -240]!
@@ -9804,21 +9804,21 @@ ebc_thread:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -208
 	.cfi_offset 22, -200
-	.loc 1 1831 0
+	.loc 1 1846 0
 	adrp	x21, .LANCHOR0
-	.loc 1 1830 0
+	.loc 1 1845 0
 	stp	x19, x20, [sp, 16]
 	adrp	x22, .LANCHOR1
 	stp	x23, x24, [sp, 48]
-.LBB1836:
-.LBB1837:
-.LBB1838:
-	.loc 1 2158 0
+.LBB1848:
+.LBB1849:
+.LBB1850:
+	.loc 1 2175 0
 	add	x22, x22, :lo12:.LANCHOR1
-.LBE1838:
-.LBE1837:
-.LBE1836:
-	.loc 1 1830 0
+.LBE1850:
+.LBE1849:
+.LBE1848:
+	.loc 1 1845 0
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 19, -224
 	.cfi_offset 20, -216
@@ -9830,88 +9830,88 @@ ebc_thread:
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -176
 	.cfi_offset 26, -168
-	.loc 1 1830 0
+	.loc 1 1845 0
 	add	x0, x23, :lo12:__stack_chk_guard
 .LVL850:
-	.loc 1 1831 0
+	.loc 1 1846 0
 	ldr	x20, [x21, #:lo12:.LANCHOR0]
 .LVL851:
-.LBB1843:
-.LBB1841:
-.LBB1839:
-	.loc 1 2158 0
+.LBB1855:
+.LBB1853:
+.LBB1851:
+	.loc 1 2175 0
 	add	x19, x22, 304
-.LBE1839:
-.LBE1841:
-.LBE1843:
-	.loc 1 1830 0
+.LBE1851:
+.LBE1853:
+.LBE1855:
+	.loc 1 1845 0
 	ldr	x1, [x0]
 	str	x1, [x29, 232]
 	mov	x1,0
-	.loc 1 1835 0
+	.loc 1 1850 0
 	str	wzr, [x29, 108]
-	.loc 1 1832 0
+	.loc 1 1847 0
 	add	x28, x20, 184
 .LVL852:
 	.p2align 2
 .L852:
-	.loc 1 1840 0
+	.loc 1 1855 0
 	ldr	w0, [x28, 624]
 .LVL853:
-	cbnz	w0, .L997
+	cbnz	w0, .L1011
 .L853:
-	.loc 1 1846 0
+	.loc 1 1861 0
 	bl	ebc_dsp_buf_get
 .LVL854:
 	mov	x24, x0
-	.loc 1 1848 0
+	.loc 1 1863 0
 	cbz	x0, .L855
-	.loc 1 1848 0 is_stmt 0 discriminator 1
+	.loc 1 1863 0 is_stmt 0 discriminator 1
 	ldr	x0, [x0, 8]
 	cbz	x0, .L855
-	.loc 1 1850 0 is_stmt 1
+	.loc 1 1865 0 is_stmt 1
 	add	x0, x21, :lo12:.LANCHOR0
 	ldr	w1, [x0, 16]
 	cbz	w1, .L856
-	.loc 1 1851 0
+	.loc 1 1866 0
 	ldr	w1, [x0, 20]
 	add	w2, w1, 1
 	str	w2, [x0, 20]
 	cmp	w1, 5
 	ble	.L857
-	.loc 1 1852 0
+	.loc 1 1867 0
 	str	wzr, [x0, 16]
 .L857:
-	.loc 1 1853 0
+	.loc 1 1868 0
 	ldr	w2, [x20, 204]
 	ldr	w1, [x24, 64]
 	ldr	x0, [x24, 16]
 	bl	check_black_percent.isra.14
 .LVL855:
-	cbnz	w0, .L990
+	cbnz	w0, .L1002
 .L856:
-	.loc 1 1861 0
+	.loc 1 1876 0
 	ldr	w0, [x24, 40]
 	cmp	w0, 20
-	beq	.L998
-	.loc 1 1865 0
+	beq	.L1012
+	.loc 1 1880 0
 	ldr	x1, [x28, 616]
 	cbz	x1, .L861
-	.loc 1 1866 0
+	.loc 1 1881 0
 	cmp	w0, 19
-	beq	.L999
-	.loc 1 1875 0
+	beq	.L1013
+	.loc 1 1890 0
 	mov	w1, 18
 	tst	w0, w1
-	beq	.L990
-	.loc 1 1876 0
+	beq	.L1002
+	.loc 1 1891 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC83
 	add	x1, x1, :lo12:.LC83
 	bl	_dev_info
 .LVL856:
 .L860:
-	.loc 1 1916 0
+	.loc 1 1927 0
 	adrp	x25, jiffies
 .LVL857:
 	mov	x1, 402653184
@@ -9920,64 +9920,64 @@ ebc_thread:
 	add	x1, x2, x1
 	bl	mod_timer
 .LVL858:
-	.loc 1 1918 0
+	.loc 1 1929 0
 	ldr	w0, [x28, 444]
-	cbz	w0, .L868
+	cbz	w0, .L872
 	ldr	x0, [x28, 216]
-.L869:
-	.loc 1 1921 0
+.L873:
+	.loc 1 1932 0
 	ldr	w2, [x0, 40]
 	ldr	w3, [x24, 40]
 	cmp	w3, w2
-	beq	.L870
-	.loc 1 1922 0
+	beq	.L874
+	.loc 1 1933 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC86
-	add	x1, x1, :lo12:.LC86
+	adrp	x1, .LC85
+	add	x1, x1, :lo12:.LC85
 	bl	_dev_info
 .LVL859:
-	.loc 1 1924 0
+	.loc 1 1935 0
 	ldr	w0, [x28, 44]
 	cmp	w0, 1
-	beq	.L1000
-.L991:
+	beq	.L1014
+.L1003:
 	ldr	w2, [x24, 40]
-.L870:
-	.loc 1 1931 0
+.L874:
+	.loc 1 1942 0
 	cmp	w2, 23
-	bls	.L1001
-	.loc 1 2106 0
+	bls	.L1015
+	.loc 1 2123 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC94
-	add	x1, x1, :lo12:.LC94
+	adrp	x1, .LC93
+	add	x1, x1, :lo12:.LC93
 	bl	_dev_err
 .LVL860:
-.L990:
-	.loc 1 1938 0
+.L1002:
+	.loc 1 2124 0
 	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
 .LVL861:
-	.loc 1 1939 0
+	.loc 1 2125 0
 	mov	x0, x24
 	bl	ebc_buf_release
 .LVL862:
-	.loc 1 1840 0
+	.loc 1 1855 0
 	ldr	w0, [x28, 624]
 	cbz	w0, .L853
 	.p2align 2
-.L997:
-	.loc 1 1841 0
+.L1011:
+	.loc 1 1856 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	beq	.L1002
+	beq	.L1016
 .L854:
-	.loc 1 2164 0
+	.loc 1 2181 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, 0
 	ldr	x2, [x29, 232]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L1003
+	cbnz	x1, .L1017
 	ldp	x19, x20, [sp, 16]
 .LVL863:
 	ldp	x21, x22, [sp, 32]
@@ -10006,180 +10006,179 @@ ebc_thread:
 	.p2align 3
 .L855:
 	.cfi_restore_state
-	.loc 1 2145 0
+	.loc 1 2162 0
 	ldr	w0, [x28, 44]
 	cmp	w0, 1
-	beq	.L1004
-	.loc 1 2154 0
+	beq	.L1018
+	.loc 1 2171 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	beq	.L1005
+	beq	.L1019
 .LVL867:
-.L993:
+.L1007:
 	ldr	w0, [x28, 96]
 .LVL868:
-	.loc 1 2157 0
-	cbz	w0, .L1006
-.L944:
+	.loc 1 2174 0
+	cbz	w0, .L1020
+.L954:
 .LVL869:
-.L934:
-	.loc 1 2159 0
+.L944:
+	.loc 1 2176 0
 	str	wzr, [x28, 96]
 	b	.L852
 .LVL870:
 	.p2align 3
-.L1006:
-.LBB1844:
-.LBB1842:
-	.loc 1 2158 0 discriminator 1
+.L1020:
+.LBB1856:
+.LBB1854:
+	.loc 1 2175 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
 .LVL871:
-	b	.L945
+	b	.L955
 	.p2align 3
-.L1007:
+.L1021:
 .LVL872:
-.LBB1840:
-	.loc 1 2158 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L934
-	.loc 1 2158 0 discriminator 7
+.LBB1852:
+	.loc 1 2175 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L944
+	.loc 1 2175 0 discriminator 7
 	bl	schedule
 .LVL873:
-.L945:
-	.loc 1 2158 0 discriminator 9
+.L955:
+	.loc 1 2175 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
 .LVL874:
 	ldr	w1, [x28, 96]
-	cbz	w1, .L1007
-.LBE1840:
-	.loc 1 2158 0 discriminator 4
+	cbz	w1, .L1021
+.LBE1852:
+	.loc 1 2175 0 discriminator 4
 	add	x1, x29, 120
 	mov	x0, x19
 	bl	finish_wait
 .LVL875:
-.LBE1842:
-.LBE1844:
-	.loc 1 2159 0 is_stmt 1 discriminator 4
+.LBE1854:
+.LBE1856:
+	.loc 1 2176 0 is_stmt 1 discriminator 4
 	str	wzr, [x28, 96]
 	b	.L852
 .LVL876:
 	.p2align 3
-.L1001:
-	.loc 1 1931 0
-	adrp	x0, .L878
-	add	x0, x0, :lo12:.L878
+.L1015:
+	.loc 1 1942 0
+	adrp	x0, .L882
+	add	x0, x0, :lo12:.L882
 	ldrh	w0, [x0,w2,uxtw #1]
-	adr	x1, .Lrtx878
+	adr	x1, .Lrtx882
 	add	x0, x1, w0, sxth #2
 	br	x0
-.Lrtx878:
+.Lrtx882:
 	.section	.rodata
 	.align	0
 	.align	2
-.L878:
-	.2byte	(.L877 - .Lrtx878) / 4
-	.2byte	(.L879 - .Lrtx878) / 4
-	.2byte	(.L949 - .Lrtx878) / 4
-	.2byte	(.L949 - .Lrtx878) / 4
-	.2byte	(.L949 - .Lrtx878) / 4
-	.2byte	(.L949 - .Lrtx878) / 4
-	.2byte	(.L949 - .Lrtx878) / 4
-	.2byte	(.L881 - .Lrtx878) / 4
-	.2byte	(.L881 - .Lrtx878) / 4
-	.2byte	(.L949 - .Lrtx878) / 4
-	.2byte	(.L949 - .Lrtx878) / 4
-	.2byte	(.L881 - .Lrtx878) / 4
-	.2byte	(.L949 - .Lrtx878) / 4
-	.2byte	(.L949 - .Lrtx878) / 4
-	.2byte	(.L881 - .Lrtx878) / 4
-	.2byte	(.L881 - .Lrtx878) / 4
-	.2byte	(.L949 - .Lrtx878) / 4
-	.2byte	(.L949 - .Lrtx878) / 4
-	.2byte	(.L949 - .Lrtx878) / 4
-	.2byte	(.L949 - .Lrtx878) / 4
-	.2byte	(.L949 - .Lrtx878) / 4
-	.2byte	(.L949 - .Lrtx878) / 4
-	.2byte	(.L877 - .Lrtx878) / 4
-	.2byte	(.L877 - .Lrtx878) / 4
+.L882:
+	.2byte	(.L881 - .Lrtx882) / 4
+	.2byte	(.L883 - .Lrtx882) / 4
+	.2byte	(.L959 - .Lrtx882) / 4
+	.2byte	(.L959 - .Lrtx882) / 4
+	.2byte	(.L959 - .Lrtx882) / 4
+	.2byte	(.L959 - .Lrtx882) / 4
+	.2byte	(.L959 - .Lrtx882) / 4
+	.2byte	(.L885 - .Lrtx882) / 4
+	.2byte	(.L885 - .Lrtx882) / 4
+	.2byte	(.L959 - .Lrtx882) / 4
+	.2byte	(.L959 - .Lrtx882) / 4
+	.2byte	(.L885 - .Lrtx882) / 4
+	.2byte	(.L959 - .Lrtx882) / 4
+	.2byte	(.L959 - .Lrtx882) / 4
+	.2byte	(.L885 - .Lrtx882) / 4
+	.2byte	(.L885 - .Lrtx882) / 4
+	.2byte	(.L959 - .Lrtx882) / 4
+	.2byte	(.L959 - .Lrtx882) / 4
+	.2byte	(.L959 - .Lrtx882) / 4
+	.2byte	(.L959 - .Lrtx882) / 4
+	.2byte	(.L959 - .Lrtx882) / 4
+	.2byte	(.L959 - .Lrtx882) / 4
+	.2byte	(.L881 - .Lrtx882) / 4
+	.2byte	(.L881 - .Lrtx882) / 4
 	.text
-	.p2align 3
-.L949:
-	.loc 1 2030 0
+.L959:
+	.loc 1 2047 0
 	mov	w7, 1
 .LVL877:
-.L880:
-	.loc 1 2037 0
+.L884:
+	.loc 1 2054 0
 	ldr	x26, [x28, 216]
 .LVL878:
-	.loc 1 2039 0
+	.loc 1 2056 0
 	ldr	w0, [x26, 40]
 	sub	w1, w0, #22
-	.loc 1 2041 0
+	.loc 1 2058 0
 	cmp	w1, 1
 	ccmp	w0, 1, 0, hi
-	bhi	.L916
-	.loc 1 2044 0
+	bhi	.L926
+	.loc 1 2061 0
 	add	x0, x29, 160
 	str	x0, [x28, 216]
-	.loc 1 2045 0
+	.loc 1 2062 0
 	ldr	x0, [x28, 152]
 	str	x0, [x29, 176]
-	.loc 1 2046 0
+	.loc 1 2063 0
 	mov	w0, 16
 	str	w0, [x29, 224]
-.L916:
-	.loc 1 2048 0
+.L926:
+	.loc 1 2065 0
 	str	wzr, [x28, 92]
-	.loc 1 2049 0
+	.loc 1 2066 0
 	str	x24, [x28, 224]
-	.loc 1 2052 0
+	.loc 1 2069 0
 	ldr	w0, [x24, 40]
 	sub	w0, w0, #2
-	.loc 1 2051 0
+	.loc 1 2068 0
 	cmp	w0, 14
-	bhi	.L917
-	.loc 1 2054 0
+	bhi	.L927
+	.loc 1 2071 0
 	ldr	x0, [x28, 216]
-.LBB1845:
-.LBB1846:
+.LBB1857:
+.LBB1858:
 	.loc 1 1813 0
 	ldr	w1, [x28, 20]
-.LBE1846:
-.LBE1845:
-	.loc 1 2053 0
+.LBE1858:
+.LBE1857:
+	.loc 1 2070 0
 	ldr	x4, [x24, 16]
-.LBB1849:
-.LBB1847:
+.LBB1861:
+.LBB1859:
 	.loc 1 1813 0
 	cmp	w1, 0
-.LBE1847:
-.LBE1849:
-	.loc 1 2054 0
+.LBE1859:
+.LBE1861:
+	.loc 1 2071 0
 	ldr	x5, [x0, 16]
-.LBB1850:
-.LBB1848:
+.LBB1862:
+.LBB1860:
 	.loc 1 1813 0
 	add	w0, w1, 7
 	csel	w0, w0, w1, lt
 	asr	w0, w0, 3
 	cmp	w0, 0
-	ble	.L918
+	ble	.L928
 	.loc 1 1817 0
 	ldr	x2, [x4]
 	ldr	x1, [x5]
 	cmp	x2, x1
-	bne	.L917
+	bne	.L927
 	sub	w1, w0, #1
 	mov	x0, 8
 	add	x1, x1, 1
 	lsl	x1, x1, 3
-	b	.L920
+	b	.L930
 	.p2align 3
-.L921:
+.L931:
 	.loc 1 1814 0
 	ldr	x3, [x4, x0]
 	add	x0, x0, 8
@@ -10188,114 +10187,115 @@ ebc_thread:
 	.loc 1 1817 0
 	ldr	x2, [x2, -8]
 	cmp	x3, x2
-	bne	.L917
-.L920:
+	bne	.L927
+.L930:
 	.loc 1 1813 0
-	cmp	x1, x0
-	bne	.L921
-.L918:
-.LBE1848:
-.LBE1850:
-	.loc 1 2056 0
+	cmp	x0, x1
+	bne	.L931
+.L928:
+.LBE1860:
+.LBE1862:
+	.loc 1 2073 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC97
-	add	x1, x1, :lo12:.LC97
+	adrp	x1, .LC96
+	add	x1, x1, :lo12:.LC96
 	bl	_dev_info
 .LVL879:
-	.loc 1 2058 0
+	.loc 1 2075 0
 	str	x26, [x28, 216]
-	.loc 1 2117 0
+	.loc 1 2134 0
 	ldr	x0, [x28, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
-	bne	.L929
+	bne	.L939
 .LVL880:
-.L1018:
-	.loc 1 2120 0
+.L1034:
+	.loc 1 2137 0
 	ldr	x0, [x28, 104]
-	.loc 1 2118 0
+	.loc 1 2135 0
 	mov	w25, 1
 .LVL881:
-	.loc 1 2119 0
+	.loc 1 2136 0
 	str	wzr, [x28, 204]
-	.loc 1 2120 0
-	adrp	x1, .LC95
-	.loc 1 2118 0
+	.loc 1 2137 0
+	adrp	x1, .LC94
+	.loc 1 2135 0
 	str	w25, [x28, 624]
-	.loc 1 2120 0
-	add	x1, x1, :lo12:.LC95
+	.loc 1 2137 0
+	add	x1, x1, :lo12:.LC94
 	bl	_dev_info
 .LVL882:
-	.loc 1 2121 0
+	.loc 1 2138 0
 	mov	w2, w25
 	mov	w1, w25
 	add	x0, x22, 328
 	bl	__wake_up_sync
 .LVL883:
-	.loc 1 2134 0
+	.loc 1 2151 0
 	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
 .LVL884:
-	.loc 1 2136 0
+	.loc 1 2153 0
 	ldr	w0, [x28, 444]
-	cbz	w0, .L932
+	cbz	w0, .L942
 .LVL885:
 	.p2align 2
-.L1020:
-	.loc 1 2137 0
+.L1036:
+	.loc 1 2154 0
 	ldr	x0, [x28, 216]
 	bl	ebc_buf_release
 .LVL886:
-	b	.L933
+	b	.L943
 .LVL887:
-	.p2align 3
-.L879:
-	.loc 1 1933 0
+.L883:
+	.loc 1 1944 0
 	ldr	w0, [x28, 628]
-	cbz	w0, .L882
-	.loc 1 1934 0
+	cbz	w0, .L886
+	.loc 1 1957 0
+	ldr	x2, [x28, 216]
+	.loc 1 1945 0
 	mov	w0, 1
-	str	w0, [x28, 632]
-	.loc 1 1943 0
-	add	x0, x22, 704
-	bl	down_write
-.LVL888:
-	.loc 1 1944 0
+	.loc 1 1955 0
 	str	x24, [x28, 224]
-	.loc 1 1946 0
-	ldr	x2, [x28, 216]
+	.loc 1 1945 0
+	str	w0, [x28, 632]
+	.loc 1 1957 0
 	ldr	w0, [x2, 40]
-	.loc 1 1949 0
+	.loc 1 1960 0
 	cmp	w0, 1
-	.loc 1 1948 0
+	.loc 1 1959 0
 	sub	w1, w0, #22
-	.loc 1 1949 0
+	.loc 1 1960 0
 	ccmp	w1, 1, 0, hi
-	bls	.L1008
-	.loc 1 1950 0
+	bls	.L1022
+	.loc 1 1961 0
+	ldr	w0, [x2, 64]
+	cmp	w0, 32
+	beq	.L1023
+	.loc 1 1964 0
 	ldr	x1, [x2, 16]
-	ldr	x0, [x28, 144]
+	ldr	x0, [x28, 160]
 	ldrsw	x2, [x28, 20]
 	bl	memcpy
+.LVL888:
+.L1004:
+	ldr	w2, [x28, 20]
+	ldr	x1, [x28, 160]
+.L890:
+	.loc 1 1965 0
+	ldr	x0, [x28, 144]
+	sxtw	x2, w2
+	bl	memcpy
 .LVL889:
-	.loc 1 1951 0
-	ldr	x0, [x28, 216]
+	.loc 1 1966 0
 	ldrsw	x2, [x28, 20]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x28, 152]
+	ldp	x0, x1, [x28, 152]
 	bl	memcpy
 .LVL890:
-	.loc 1 1952 0
-	ldr	x0, [x28, 216]
-	ldrsw	x2, [x28, 20]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x28, 160]
-	bl	memcpy
-.LVL891:
 	ldr	x0, [x28, 224]
-.L885:
-.LBB1851:
-.LBB1852:
+.L892:
+.LBB1863:
+.LBB1864:
 	.loc 1 379 0
 	ldp	w3, w16, [x0, 48]
 	.loc 1 438 0
@@ -10323,23 +10323,23 @@ ebc_thread:
 	asr	w10, w10, 3
 	.loc 1 382 0
 	asr	w18, w18, 3
-.LVL892:
+.LVL891:
 	.loc 1 378 0
 	add	w10, w10, 1
-.LVL893:
+.LVL892:
 	ldr	w1, [x20, 252]
 	.loc 1 385 0
 	cmp	w10, w18
-.LBE1852:
-.LBE1851:
-	.loc 1 1959 0
+.LBE1864:
+.LBE1863:
+	.loc 1 1973 0
 	ldr	x13, [x0, 16]
-.LBB1857:
-.LBB1853:
+.LBB1869:
+.LBB1865:
 	.loc 1 385 0
 	sub	w0, w18, #1
 	csel	w10, w0, w10, ge
-.LVL894:
+.LVL893:
 	.loc 1 387 0
 	cmp	w1, w25
 	sub	w1, w1, #1
@@ -10349,106 +10349,106 @@ ebc_thread:
 	csel	w25, w1, w25, le
 	.loc 1 377 0
 	asr	w17, w17, 3
-.LVL895:
+.LVL894:
 	mul	w7, w16, w18
 	.loc 1 389 0
 	cmp	w16, w25
-.LBE1853:
-.LBE1857:
-	.loc 1 1959 0
+.LBE1865:
+.LBE1869:
+	.loc 1 1973 0
 	ldr	x9, [x28, 144]
-	.loc 1 1960 0
+	.loc 1 1974 0
 	ldp	x12, x11, [x28, 160]
-.LBB1858:
-.LBB1854:
+.LBB1870:
+.LBB1866:
 	.loc 1 389 0
-	bgt	.L893
-.LVL896:
+	bgt	.L900
+.LVL895:
 	.p2align 2
-.L970:
+.L980:
 	.loc 1 394 0
 	mov	w5, w17
 	cmp	w17, w10
-	ble	.L971
-	b	.L910
-.LVL897:
+	ble	.L981
+	b	.L917
+.LVL896:
 	.p2align 3
-.L894:
+.L901:
 	.loc 1 407 0
 	tst	x2, 65280
-	bne	.L895
+	bne	.L902
 	.loc 1 408 0
 	and	w27, w0, 240
 	cmp	w27, 224
-	beq	.L1009
+	beq	.L1024
 	.loc 1 411 0
 	orr	w3, w3, 240
-.L895:
+.L902:
 	.loc 1 413 0
 	tst	x2, 16711680
-	bne	.L897
+	bne	.L904
 	.loc 1 414 0
 	and	w27, w0, 3840
 	cmp	w27, 3584
-	beq	.L1010
+	beq	.L1025
 	.loc 1 417 0
 	orr	w3, w3, 3840
-.L897:
+.L904:
 	.loc 1 419 0
 	tst	x2, 4278190080
-	bne	.L899
+	bne	.L906
 	.loc 1 420 0
 	and	w27, w0, 61440
 	cmp	w27, 57344
-	beq	.L1011
+	beq	.L1026
 	.loc 1 423 0
 	orr	w3, w3, 61440
-.L899:
+.L906:
 	.loc 1 425 0
 	tst	x2, 1095216660480
-	bne	.L901
+	bne	.L908
 	.loc 1 426 0
 	and	w27, w0, 983040
 	cmp	w27, 917504
-	beq	.L1012
+	beq	.L1027
 	.loc 1 429 0
 	orr	w3, w3, 983040
-.L901:
+.L908:
 	.loc 1 431 0
 	tst	x2, 280375465082880
-	bne	.L903
+	bne	.L910
 	.loc 1 432 0
 	and	w27, w0, 15728640
 	cmp	w27, 14680064
-	beq	.L1013
+	beq	.L1028
 	.loc 1 435 0
 	orr	w3, w3, 15728640
-.L903:
+.L910:
 	.loc 1 437 0
 	tst	x2, 71776119061217280
-	bne	.L905
+	bne	.L912
 	.loc 1 438 0
 	and	w27, w0, 251658240
 	cmp	w27, w15
-	beq	.L1014
+	beq	.L1029
 	.loc 1 441 0
 	orr	w3, w3, 251658240
-.L905:
+.L912:
 	.loc 1 443 0
 	tst	x2, -72057594037927936
-	bne	.L907
+	bne	.L914
 	.loc 1 444 0
 	and	w2, w0, -268435456
-.LVL898:
+.LVL897:
 	cmp	w2, w14
-	beq	.L1015
+	beq	.L1030
 	.loc 1 447 0
 	orr	w3, w3, -268435456
-.LVL899:
-.L907:
+.LVL898:
+.L914:
 	.loc 1 450 0
 	and	w0, w0, w26
-.LVL900:
+.LVL899:
 	.loc 1 394 0
 	add	w5, w5, 1
 	eor	w0, w0, w4
@@ -10459,19 +10459,19 @@ ebc_thread:
 	.loc 1 451 0
 	str	w0, [x9, x1]
 	.loc 1 394 0
-	bgt	.L910
-.LVL901:
-.L971:
+	bgt	.L917
+.LVL900:
+.L981:
 	.loc 1 395 0
 	sxtw	x1, w5
-.LVL902:
+.LVL901:
 	.loc 1 399 0
 	mov	w3, 0
 	.loc 1 398 0
 	lsl	x0, x1, 3
 	.loc 1 395 0
 	lsl	x1, x1, 2
-.LVL903:
+.LVL902:
 	.loc 1 398 0
 	add	x0, x0, x7, sxtw 3
 	add	x1, x1, x7, sxtw 2
@@ -10484,246 +10484,270 @@ ebc_thread:
 	and	x27, x2, 255
 	.loc 1 397 0
 	ldr	w26, [x12, x1]
-.LVL904:
+.LVL903:
 	.loc 1 401 0
-	cbnz	x27, .L894
-.LVL905:
+	cbnz	x27, .L901
+.LVL904:
 	.loc 1 402 0
-	and	w3, w0, 15
-.LVL906:
-	cmp	w3, 14
+	and	w27, w0, 15
 	.loc 1 405 0
 	mov	w3, 15
-.LVL907:
 	.loc 1 402 0
-	bne	.L894
+	cmp	w27, 14
+	bne	.L901
 	.loc 1 403 0
 	orr	w4, w4, w3
-.LVL908:
+.LVL905:
 	.loc 1 399 0
 	mov	w3, 0
-.LVL909:
-	b	.L894
-.LVL910:
-	.p2align 3
-.L877:
-.LBE1854:
-.LBE1858:
-	.loc 1 1982 0
+.LVL906:
+	b	.L901
+.LVL907:
+.L881:
+.LBE1866:
+.LBE1870:
+	.loc 1 1996 0
 	add	x0, x22, 704
 	bl	down_write
-.LVL911:
-	.loc 1 1985 0
-	ldr	x0, [x28, 216]
-	.loc 1 1983 0
+.LVL908:
+	.loc 1 1999 0
+	ldr	x1, [x28, 216]
+	.loc 1 1997 0
 	str	x24, [x28, 224]
-	.loc 1 1986 0
-	ldr	w0, [x0, 40]
-	sub	w1, w0, #22
-	.loc 1 1988 0
-	cmp	w1, 1
+	.loc 1 2000 0
+	ldr	w0, [x1, 40]
+	sub	w2, w0, #22
+	.loc 1 2002 0
+	cmp	w2, 1
 	ccmp	w0, 1, 0, hi
-	bls	.L912
-	.loc 1 1989 0
-	ldr	w2, [x28, 20]
-	ldr	x1, [x24, 16]
-	ldr	x0, [x28, 144]
-	lsl	w2, w2, 1
-	sxtw	x2, w2
+	bls	.L919
+	.loc 1 2003 0
+	ldr	w0, [x1, 64]
+	cmp	w0, 32
+	beq	.L1031
+	.loc 1 2006 0
+	ldrsw	x2, [x28, 20]
+	ldr	x1, [x1, 16]
+	ldr	x0, [x28, 152]
 	bl	memcpy
-.LVL912:
-	.loc 1 1990 0
-	ldr	x0, [x28, 216]
+.LVL909:
+.L1005:
 	ldr	w2, [x28, 20]
-	ldr	x1, [x0, 16]
-	lsl	w2, w2, 1
-	ldr	x0, [x28, 152]
+	ldr	x1, [x28, 152]
+.L921:
+	.loc 1 2007 0
+	ldr	x0, [x28, 144]
 	sxtw	x2, w2
 	bl	memcpy
-.LVL913:
-	b	.L913
-	.p2align 3
-.L881:
-	.loc 1 1931 0
+.LVL910:
+	b	.L923
+.L885:
+	.loc 1 1942 0
 	mov	w7, 0
-.LVL914:
-	b	.L880
-.LVL915:
+.LVL911:
+	b	.L884
+.LVL912:
 	.p2align 3
-.L868:
-	.loc 1 1919 0
+.L872:
+	.loc 1 1930 0
 	mov	x0, x24
 	str	x24, [x28, 216]
-	b	.L869
-.LVL916:
+	b	.L873
+.LVL913:
 	.p2align 3
 .L861:
-	.loc 1 1885 0
+	.loc 1 1900 0
 	cmp	w0, 18
 	ccmp	w0, 21, 4, ne
 	bne	.L865
-	.loc 1 1886 0
+	.loc 1 1901 0
 	str	wzr, [x28, 632]
 	b	.L860
 	.p2align 3
-.L998:
-	.loc 1 1863 0
+.L1012:
+	.loc 1 1878 0
 	str	wzr, [x28, 628]
-	.loc 1 1862 0
+	.loc 1 1877 0
 	str	wzr, [x28, 632]
 	b	.L860
-.LVL917:
+.LVL914:
 	.p2align 3
-.L917:
-	.loc 1 2064 0
-	cbz	w7, .L1016
-	.loc 1 2065 0
+.L927:
+	.loc 1 2081 0
+	cbz	w7, .L1032
+	.loc 1 2082 0
 	str	wzr, [x29, 108]
-.LVL918:
-.L922:
-	.loc 1 2076 0
+.LVL915:
+.L932:
+	.loc 1 2093 0
 	ldr	w0, [x28, 200]
-	cbz	w0, .L1017
-.L923:
-	.loc 1 2079 0
+	cbz	w0, .L1033
+.L933:
+	.loc 1 2096 0
 	ldr	x0, [x28, 224]
 	ldr	w1, [x0, 64]
-.LVL919:
+.LVL916:
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL920:
-	cbz	w0, .L924
-.L1024:
-	.loc 1 2080 0
+.LVL917:
+	cbz	w0, .L934
+.L1039:
+	.loc 1 2097 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC91
-	add	x1, x1, :lo12:.LC91
+	adrp	x1, .LC90
+	add	x1, x1, :lo12:.LC90
 	bl	_dev_err
-.LVL921:
-	.loc 1 2082 0
+.LVL918:
+	.loc 1 2099 0
 	str	x26, [x28, 216]
-.LVL922:
-.L890:
-	.loc 1 2117 0
+.LVL919:
+.L897:
+	.loc 1 2134 0
 	ldr	x0, [x28, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
-	beq	.L1018
-.L929:
-	.loc 1 2123 0
+	beq	.L1034
+.L939:
+	.loc 1 2140 0
 	cmp	w0, 18
-	beq	.L1019
-.L930:
-	.loc 1 2134 0
+	beq	.L1035
+.L940:
+	.loc 1 2151 0
 	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL923:
-	.loc 1 2136 0
+.LVL920:
+	.loc 1 2153 0
 	ldr	w0, [x28, 444]
-	cbnz	w0, .L1020
-.L932:
-	.loc 1 2139 0
+	cbnz	w0, .L1036
+.L942:
+	.loc 1 2156 0
 	mov	w0, 1
 	str	w0, [x28, 444]
-.L933:
-	.loc 1 2141 0
+.L943:
+	.loc 1 2158 0
 	ldr	x0, [x28, 224]
 	str	x0, [x28, 216]
-	.loc 1 2142 0
+	.loc 1 2159 0
 	b	.L852
 	.p2align 3
-.L1004:
-.LBB1859:
-	.loc 1 2146 0 discriminator 1
+.L1018:
+.LBB1871:
+	.loc 1 2163 0 discriminator 1
 	ldr	w0, [x28, 96]
-	cbnz	w0, .L934
-.LBB1860:
-	.loc 1 2146 0 is_stmt 0 discriminator 3
+	cbnz	w0, .L944
+.LBB1872:
+	.loc 1 2163 0 is_stmt 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL924:
-	b	.L938
+.LVL921:
+	b	.L948
 	.p2align 3
-.L1021:
-.LBB1861:
-	.loc 1 2146 0 discriminator 7
+.L1037:
+.LBB1873:
+	.loc 1 2163 0 discriminator 7
 	ldr	w1, [x28, 96]
-	cbnz	w1, .L935
-.LVL925:
-	.loc 1 2146 0 discriminator 9
-	cbnz	x0, .L993
-	.loc 1 2146 0 discriminator 11
+	cbnz	w1, .L945
+.LVL922:
+	.loc 1 2163 0 discriminator 9
+	cbnz	x0, .L1007
+	.loc 1 2163 0 discriminator 11
 	bl	schedule
-.LVL926:
-.L938:
-	.loc 1 2146 0 discriminator 13
+.LVL923:
+.L948:
+	.loc 1 2163 0 discriminator 13
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL927:
+.LVL924:
 	ldr	w1, [x28, 44]
-	cbnz	w1, .L1021
-.L935:
-.LBE1861:
-	.loc 1 2146 0 discriminator 8
+	cbnz	w1, .L1037
+.L945:
+.LBE1873:
+	.loc 1 2163 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL928:
+.LVL925:
 	ldr	w0, [x28, 44]
-.LBE1860:
-.LBE1859:
-	.loc 1 2149 0 is_stmt 1 discriminator 8
-	cbnz	w0, .L993
-	.loc 1 2154 0
+.LBE1872:
+.LBE1871:
+	.loc 1 2166 0 is_stmt 1 discriminator 8
+	cbnz	w0, .L1007
+	.loc 1 2171 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	bne	.L993
+	bne	.L1007
 	.p2align 2
-.L1005:
-.LBB1862:
-.LBB1863:
+.L1019:
+.LBB1874:
+.LBB1875:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.12
-.LVL929:
-	b	.L993
+.LVL926:
+	b	.L1007
 	.p2align 3
 .L865:
-.LBE1863:
-.LBE1862:
-	.loc 1 1888 0
+.LBE1875:
+.LBE1874:
+	.loc 1 1903 0
 	ldr	w1, [x28, 632]
 	cmp	w1, 0
 	ccmp	w0, 1, 4, ne
 	beq	.L860
-	.loc 1 1889 0
+	.loc 1 1904 0
+	add	x0, x22, 704
+	bl	down_write
+.LVL927:
+	.loc 1 1905 0
 	ldr	w0, [x24, 64]
 	cmp	w0, 32
-	beq	.L1022
-	.loc 1 1896 0
-	add	x25, x22, 704
-.LVL930:
-	mov	x0, x25
-	bl	down_write
-.LVL931:
-	.loc 1 1897 0
-	ldrsw	x2, [x28, 20]
-	ldr	x1, [x24, 16]
-	ldr	x0, [x28, 160]
-	bl	memcpy
-.LVL932:
-	.loc 1 1898 0
+	bne	.L866
+	.loc 1 1906 0
+	ldr	w4, [x28, 20]
+.LBB1876:
+.LBB1877:
+	.loc 1 1833 0
+	mov	x0, 0
+	ldr	x3, [x24, 16]
+.LVL928:
+	cmp	w4, 0
+.LBE1877:
+.LBE1876:
+	.loc 1 1906 0
+	ldr	x5, [x28, 160]
+.LBB1879:
+.LBB1878:
+	.loc 1 1833 0
+	ble	.L868
+	.p2align 2
+.L982:
+	.loc 1 1835 0
+	ldrb	w1, [x3], 2
+	.loc 1 1837 0
+	ldrb	w2, [x3, -1]
+	and	w2, w2, -16
+	orr	w1, w2, w1, lsr 4
+	.loc 1 1838 0
+	strb	w1, [x5, x0]
+	add	x0, x0, 1
+	.loc 1 1833 0
+	cmp	w4, w0
+	bgt	.L982
+.L868:
+.LBE1878:
+.LBE1879:
+	.loc 1 1909 0
 	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL933:
-	.loc 1 1899 0
+.LVL929:
+	.loc 1 1910 0
 	mov	x0, x24
 	bl	ebc_buf_release
-.LVL934:
-	.loc 1 1901 0
+.LVL930:
+	.loc 1 1912 0
 	ldr	x1, [x28, 224]
 	mov	x4, x28
 	ldr	x0, [x28, 144]
@@ -10731,228 +10755,258 @@ ebc_thread:
 	ldr	w5, [x1, 40]
 	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
-.LVL935:
-	.loc 1 1904 0
-	mov	x0, x25
+.LVL931:
+	.loc 1 1915 0
+	add	x0, x22, 704
 	bl	up_write
-.LVL936:
-	.loc 1 1905 0
+.LVL932:
+	.loc 1 1916 0
 	ldr	w0, [x28, 44]
 	cbnz	w0, .L852
-	.loc 1 1906 0
+	.loc 1 1917 0
 	mov	w0, 1
 	str	w0, [x28, 44]
-	.loc 1 1908 0
+	.loc 1 1919 0
 	ldr	w0, [x28, 200]
-	.loc 1 1907 0
+	.loc 1 1918 0
 	str	wzr, [x28, 92]
-	.loc 1 1908 0
-	cbz	w0, .L1023
-.L867:
-	.loc 1 1910 0
+	.loc 1 1919 0
+	cbz	w0, .L1038
+.L871:
+	.loc 1 1921 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC85
+	adrp	x1, .LC84
 	ldrb	w2, [x28, 48]
-	add	x1, x1, :lo12:.LC85
+	add	x1, x1, :lo12:.LC84
 	bl	_dev_info
-.LVL937:
-	.loc 1 1911 0
+.LVL933:
+	.loc 1 1922 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL938:
+.LVL934:
 	b	.L852
-.LVL939:
+.LVL935:
 	.p2align 3
-.L1016:
-	.loc 1 2068 0
+.L1032:
+	.loc 1 2085 0
 	ldr	w0, [x28, 64]
 	cmp	w0, 0
-	ble	.L922
-	.loc 1 2069 0
+	ble	.L932
+	.loc 1 2086 0
 	ldr	w1, [x29, 108]
-.LVL940:
+.LVL936:
 	add	w1, w1, 1
 	str	w1, [x29, 108]
-	.loc 1 2070 0
+	.loc 1 2087 0
 	cmp	w0, w1
-	bgt	.L922
-	.loc 1 2071 0
+	bgt	.L932
+	.loc 1 2088 0
 	mov	w0, 2
 	str	w0, [x24, 40]
-	.loc 1 2072 0
+	.loc 1 2089 0
 	str	wzr, [x29, 108]
-	.loc 1 2076 0
+	.loc 1 2093 0
 	ldr	w0, [x28, 200]
-	cbnz	w0, .L923
-.L1017:
-	.loc 1 2077 0
+	cbnz	w0, .L933
+.L1033:
+	.loc 1 2094 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.16
-.LVL941:
-	.loc 1 2079 0
+.LVL937:
+	.loc 1 2096 0
 	ldr	x0, [x28, 224]
 	ldr	w1, [x0, 64]
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL942:
-	cbnz	w0, .L1024
-.L924:
-	.loc 1 2091 0
+.LVL938:
+	cbnz	w0, .L1039
+.L934:
+	.loc 1 2108 0
 	ldr	x0, [x28, 224]
-	adrp	x1, .LC93
-	.loc 1 2088 0
+	adrp	x1, .LC92
+	.loc 1 2105 0
 	ldr	w3, [x28, 112]
-	.loc 1 2091 0
-	add	x1, x1, :lo12:.LC93
-	.loc 1 2088 0
+	.loc 1 2108 0
+	add	x1, x1, :lo12:.LC92
+	.loc 1 2105 0
 	strb	w3, [x28, 48]
-	.loc 1 2091 0
+	.loc 1 2108 0
 	and	w3, w3, 255
 	ldr	w2, [x0, 40]
 	ldr	x0, [x28, 104]
 	bl	_dev_info
-.LVL943:
-	.loc 1 2092 0
+.LVL939:
+	.loc 1 2109 0
 	mov	w0, 1
 	str	w0, [x28, 44]
-	.loc 1 2093 0
+	.loc 1 2110 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL944:
-	.loc 1 2095 0
+.LVL940:
+	.loc 1 2112 0
 	ldr	x1, [x25, #:lo12:jiffies]
 	add	x0, x20, 688
 	str	x0, [x29, 96]
 	add	x1, x1, 900
 	bl	mod_timer
-.LVL945:
-.LBB1864:
-	.loc 1 2096 0
+.LVL941:
+.LBB1880:
+	.loc 1 2113 0
 	ldr	w0, [x28, 92]
-	cbz	w0, .L1025
-.L927:
-.LVL946:
-.L925:
-.LBE1864:
-	.loc 1 2098 0 discriminator 11
+	cbz	w0, .L1040
+.L937:
+.LVL942:
+.L935:
+.LBE1880:
+	.loc 1 2115 0 discriminator 11
 	ldr	x2, [x25, #:lo12:jiffies]
 	mov	x1, 402653184
 	ldr	x0, [x29, 96]
-.LVL947:
+.LVL943:
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL948:
-	.loc 1 2099 0 discriminator 11
+.LVL944:
+	.loc 1 2116 0 discriminator 11
 	str	wzr, [x28, 92]
-	.loc 1 2101 0 discriminator 11
+	.loc 1 2118 0 discriminator 11
 	str	x26, [x28, 216]
-	.loc 1 2103 0 discriminator 11
-	b	.L890
-.LVL949:
-.L882:
+	.loc 1 2120 0 discriminator 11
+	b	.L897
+.LVL945:
+.L1014:
+	.loc 1 1936 0
+	ldr	x0, [x28, 104]
+	adrp	x1, .LC86
+	add	x1, x1, :lo12:.LC86
+	bl	_dev_info
+.LVL946:
+.LBB1884:
 	.loc 1 1937 0
+	ldr	w0, [x28, 92]
+	cbz	w0, .L1041
+.L878:
+.LVL947:
+.L876:
+.LBE1884:
+	.loc 1 1938 0 discriminator 11
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC89
-	add	x1, x1, :lo12:.LC89
+.LVL948:
+	adrp	x1, .LC87
+	add	x1, x1, :lo12:.LC87
 	bl	_dev_info
-.LVL950:
-	b	.L990
-.L912:
-	.loc 1 1993 0
+.LVL949:
+	b	.L1003
+.L919:
+	.loc 1 2010 0
 	ldr	x1, [x24, 16]
 	mov	x3, x28
 	ldr	x0, [x28, 144]
 	ldr	x2, [x28, 168]
 	bl	refresh_new_image_auto
-.LVL951:
-.L913:
-	.loc 1 1996 0
+.LVL950:
+.L923:
+	.loc 1 2013 0
 	add	x0, x22, 704
 	bl	up_write
-.LVL952:
-	.loc 1 1998 0
+.LVL951:
+	.loc 1 2015 0
 	ldr	w0, [x28, 44]
-	cbnz	w0, .L890
-	.loc 1 2001 0
+	cbnz	w0, .L897
+	.loc 1 2018 0
 	ldr	w0, [x28, 200]
-	.loc 1 1999 0
+	.loc 1 2016 0
 	mov	w1, 1
-	.loc 1 2000 0
+	.loc 1 2017 0
 	str	wzr, [x28, 92]
-	.loc 1 1999 0
+	.loc 1 2016 0
 	str	w1, [x28, 44]
-	.loc 1 2001 0
-	cbz	w0, .L1026
-.L914:
-	.loc 1 2003 0
+	.loc 1 2018 0
+	cbz	w0, .L1042
+.L924:
+	.loc 1 2020 0
 	mov	w1, 16
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL953:
+.LVL952:
 	cmn	w0, #1
-	beq	.L1027
-	.loc 1 2011 0
+	beq	.L1043
+	.loc 1 2028 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC92
-	.loc 1 2008 0
+	adrp	x1, .LC91
+	.loc 1 2025 0
 	ldr	w3, [x28, 112]
-	.loc 1 2011 0
-	add	x1, x1, :lo12:.LC92
-	.loc 1 2008 0
+	.loc 1 2028 0
+	add	x1, x1, :lo12:.LC91
+	.loc 1 2025 0
 	strb	w3, [x28, 48]
-.LVL954:
-.L992:
-	.loc 1 2011 0
+.LVL953:
+.L1006:
+	.loc 1 2028 0
 	and	w2, w3, 255
-	.loc 1 2009 0
+	.loc 1 2026 0
 	lsr	w3, w3, 8
 	strb	w3, [x28, 49]
-	.loc 1 2011 0
+	.loc 1 2028 0
 	bl	_dev_info
-.LVL955:
-	.loc 1 2012 0
+.LVL954:
+	.loc 1 2029 0
 	mov	x0, x20
 	bl	ebc_frame_start
+.LVL955:
+	b	.L897
 .LVL956:
-	b	.L890
-.LVL957:
-.L1008:
-	.loc 1 1955 0
+.L1022:
+	.loc 1 1969 0
 	cmp	w0, 0
 	mov	x0, x24
 	ccmp	w1, 1, 0, ne
-	bhi	.L885
-	.loc 1 1956 0
+	bhi	.L892
+	.loc 1 1970 0
 	ldrsw	x2, [x28, 20]
 	ldp	x1, x0, [x28, 152]
 	bl	memcpy
-.LVL958:
+.LVL957:
 	ldr	x0, [x28, 224]
-	b	.L885
-.LVL959:
+	b	.L892
+.LVL958:
 	.p2align 3
-.L1013:
-.LBB1868:
-.LBB1855:
+.L1025:
+.LBB1888:
+.LBB1867:
+	.loc 1 415 0
+	orr	w4, w4, 3840
+	b	.L904
+	.p2align 3
+.L1026:
+	.loc 1 421 0
+	orr	w4, w4, 61440
+	b	.L906
+	.p2align 3
+.L1027:
+	.loc 1 427 0
+	orr	w4, w4, 983040
+	b	.L908
+	.p2align 3
+.L1028:
 	.loc 1 433 0
 	orr	w4, w4, 15728640
-	b	.L903
+	b	.L910
 	.p2align 3
-.L1014:
+.L1029:
 	.loc 1 439 0
 	orr	w4, w4, 251658240
-	b	.L905
-.LVL960:
+	b	.L912
+.LVL959:
 	.p2align 3
-.L1015:
+.L1030:
 	.loc 1 445 0
 	orr	w4, w4, -268435456
-.LVL961:
+.LVL960:
 	.loc 1 450 0
 	and	w0, w0, w26
-.LVL962:
+.LVL961:
 	eor	w0, w0, w4
-.LVL963:
+.LVL962:
 	.loc 1 394 0
 	add	w5, w5, 1
 	and	w0, w0, w3
@@ -10962,306 +11016,347 @@ ebc_thread:
 	.loc 1 451 0
 	str	w0, [x9, x1]
 	.loc 1 394 0
-	ble	.L971
-.LVL964:
+	ble	.L981
+.LVL963:
 	.p2align 2
-.L910:
+.L917:
 	.loc 1 389 0
 	add	w16, w16, 1
 	add	w7, w7, w18
 	cmp	w16, w25
-	ble	.L970
-.L893:
-.LBE1855:
-.LBE1868:
-	.loc 1 1962 0
-	add	x0, x22, 704
-	bl	up_write
-.LVL965:
-	.loc 1 1963 0
+	ble	.L980
+.L900:
+.LBE1867:
+.LBE1888:
+	.loc 1 1977 0
 	ldr	w0, [x28, 44]
-	cbnz	w0, .L890
-	.loc 1 1966 0
+	cbnz	w0, .L897
+	.loc 1 1980 0
 	ldr	w0, [x28, 200]
-	.loc 1 1964 0
+	.loc 1 1978 0
 	mov	w1, 1
-	.loc 1 1965 0
+	.loc 1 1979 0
 	str	wzr, [x28, 92]
-	.loc 1 1964 0
+	.loc 1 1978 0
 	str	w1, [x28, 44]
-	.loc 1 1966 0
-	cbz	w0, .L1028
-.L911:
-	.loc 1 1968 0
+	.loc 1 1980 0
+	cbz	w0, .L1044
+.L918:
+	.loc 1 1982 0
 	mov	w1, 16
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL966:
+.LVL964:
 	cmn	w0, #1
-	beq	.L890
-	.loc 1 1972 0
+	beq	.L897
+	.loc 1 1986 0
 	ldr	w3, [x28, 112]
-	.loc 1 1975 0
-	adrp	x1, .LC90
-	.loc 1 1972 0
+	.loc 1 1989 0
+	adrp	x1, .LC89
+	.loc 1 1986 0
 	strb	w3, [x28, 48]
-	.loc 1 1975 0
-	add	x1, x1, :lo12:.LC90
+	.loc 1 1989 0
+	add	x1, x1, :lo12:.LC89
 	ldr	x0, [x28, 104]
-	b	.L992
-.LVL967:
+	b	.L1006
+.LVL965:
 	.p2align 3
-.L1009:
-.LBB1869:
-.LBB1856:
+.L1024:
+.LBB1889:
+.LBB1868:
 	.loc 1 409 0
 	orr	w4, w4, 240
-	b	.L895
-	.p2align 3
-.L1010:
-	.loc 1 415 0
-	orr	w4, w4, 3840
-	b	.L897
-	.p2align 3
-.L1011:
-	.loc 1 421 0
-	orr	w4, w4, 61440
-	b	.L899
-	.p2align 3
-.L1012:
-	.loc 1 427 0
-	orr	w4, w4, 983040
-	b	.L901
-.LVL968:
-.L1019:
-.LBE1856:
-.LBE1869:
-	.loc 1 2124 0
+	b	.L902
+.LVL966:
+.L1035:
+.LBE1868:
+.LBE1889:
+	.loc 1 2141 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC96
-	add	x1, x1, :lo12:.LC96
+	adrp	x1, .LC95
+	add	x1, x1, :lo12:.LC95
 	bl	_dev_info
-.LVL969:
-	.loc 1 2125 0
+.LVL967:
+	.loc 1 2142 0
 	ldr	w0, [x28, 616]
-	cbz	w0, .L1029
-.L931:
-	.loc 1 2130 0
+	cbz	w0, .L1045
+.L941:
+	.loc 1 2147 0
 	add	x0, x21, :lo12:.LANCHOR0
-	.loc 1 2128 0
+	.loc 1 2145 0
 	mov	w2, 1
-	.loc 1 2127 0
+	.loc 1 2144 0
 	str	wzr, [x28, 204]
-	.loc 1 2131 0
+	.loc 1 2148 0
 	mov	w1, w2
-	.loc 1 2128 0
+	.loc 1 2145 0
 	str	w2, [x28, 616]
-	.loc 1 2129 0
+	.loc 1 2146 0
 	str	wzr, [x28, 632]
-	.loc 1 2130 0
+	.loc 1 2147 0
 	str	wzr, [x0, 16]
-	.loc 1 2131 0
+	.loc 1 2148 0
 	add	x0, x22, 328
 	bl	__wake_up_sync
-.LVL970:
-	b	.L930
-.LVL971:
-.L1000:
-	.loc 1 1925 0
+.LVL968:
+	b	.L940
+.LVL969:
+.L886:
+	.loc 1 1948 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC87
-	add	x1, x1, :lo12:.LC87
+	adrp	x1, .LC88
+	add	x1, x1, :lo12:.LC88
 	bl	_dev_info
+.LVL970:
+	.loc 1 1949 0
+	mov	x0, x24
+	bl	ebc_remove_from_dsp_buf_list
+.LVL971:
+	.loc 1 1950 0
+	mov	x0, x24
+	bl	ebc_buf_release
 .LVL972:
-.LBB1870:
-	.loc 1 1926 0
-	ldr	w0, [x28, 92]
-	cbz	w0, .L1030
-.L874:
+	.loc 1 1952 0
+	b	.L852
+.L1031:
+	.loc 1 2004 0
+	ldr	w2, [x28, 20]
+	ldr	x5, [x1, 16]
+.LBB1890:
+.LBB1891:
+	.loc 1 1833 0
+	cmp	w2, 0
+.LBE1891:
+.LBE1890:
+	.loc 1 2004 0
+	ldr	x1, [x28, 152]
+.LBB1893:
+.LBB1892:
+	.loc 1 1833 0
+	ble	.L921
+	mov	x0, 0
 .LVL973:
-.L872:
-.LBE1870:
-	.loc 1 1927 0 discriminator 11
-	ldr	x0, [x28, 104]
+	.p2align 2
+.L922:
+	.loc 1 1835 0
+	ldrb	w3, [x5], 2
+	.loc 1 1837 0
+	ldrb	w4, [x5, -1]
+	and	w4, w4, -16
+	orr	w3, w4, w3, lsr 4
+	.loc 1 1838 0
+	strb	w3, [x1, x0]
+	add	x0, x0, 1
+	.loc 1 1833 0
+	cmp	w2, w0
+	bgt	.L922
+	b	.L1005
 .LVL974:
-	adrp	x1, .LC88
-	add	x1, x1, :lo12:.LC88
-	bl	_dev_info
+.L1023:
+.LBE1892:
+.LBE1893:
+	.loc 1 1962 0
+	ldr	x5, [x2, 16]
+	ldr	w2, [x28, 20]
+	ldr	x1, [x28, 160]
+.LBB1894:
+.LBB1895:
+	.loc 1 1833 0
+	cmp	w2, 0
+	ble	.L890
+	mov	x0, 0
 .LVL975:
-	b	.L991
-.L1026:
-	.loc 1 2002 0
-	mov	x0, x20
-	bl	ebc_power_set.constprop.16
+	.p2align 2
+.L891:
+	.loc 1 1835 0
+	ldrb	w3, [x5], 2
+	.loc 1 1837 0
+	ldrb	w4, [x5, -1]
+	and	w4, w4, -16
+	orr	w3, w4, w3, lsr 4
+	.loc 1 1838 0
+	strb	w3, [x1, x0]
+	add	x0, x0, 1
+	.loc 1 1833 0
+	cmp	w2, w0
+	bgt	.L891
+	b	.L1004
 .LVL976:
-	b	.L914
-.LVL977:
-.L1029:
-	.loc 1 2126 0
+.L1045:
+.LBE1895:
+.LBE1894:
+	.loc 1 2143 0
 	mov	x0, 2
 	bl	ebc_notify
+.LVL977:
+	b	.L941
 .LVL978:
-	b	.L931
-.L1022:
-	.loc 1 1890 0
-	ldr	x0, [x28, 104]
-	adrp	x1, .LC84
-	add	x1, x1, :lo12:.LC84
-	.loc 1 1937 0
-	bl	_dev_info
+.L1044:
+	.loc 1 1981 0
+	mov	x0, x20
+	bl	ebc_power_set.constprop.16
 .LVL979:
-	b	.L990
-.L999:
-	.loc 1 1867 0
+	b	.L918
+.LVL980:
+.L1041:
+.LBB1896:
+.LBB1885:
+.LBB1886:
+	.loc 1 1937 0 discriminator 1
+	add	x26, x22, 352
+.LVL981:
+.LBE1886:
+	mov	w1, 0
+	add	x0, x29, 120
+	bl	init_wait_entry
+.LVL982:
+	b	.L879
+	.p2align 3
+.L1046:
+.LVL983:
+.LBB1887:
+	.loc 1 1937 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L876
+	.loc 1 1937 0 discriminator 7
+	bl	schedule
+.LVL984:
+.L879:
+	.loc 1 1937 0 discriminator 9
+	add	x1, x29, 120
+	mov	w2, 1
+	mov	x0, x26
+	bl	prepare_to_wait_event
+.LVL985:
+	ldr	w1, [x28, 92]
+	cbz	w1, .L1046
+.LBE1887:
+	.loc 1 1937 0 discriminator 4
+	mov	x0, x26
+	add	x1, x29, 120
+	bl	finish_wait
+.LVL986:
+	b	.L876
+.LVL987:
+.L1013:
+.LBE1885:
+.LBE1896:
+	.loc 1 1882 0 is_stmt 1
 	str	wzr, [x28, 616]
-	.loc 1 1868 0
+	.loc 1 1883 0
 	mov	x0, 3
 	bl	ebc_notify
-.LVL980:
-	.loc 1 1869 0
+.LVL988:
+	.loc 1 1884 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC82
 	add	x1, x1, :lo12:.LC82
 	bl	_dev_info
-.LVL981:
-	.loc 1 1872 0
+.LVL989:
+	.loc 1 1887 0
 	ldr	w2, [x20, 204]
-	.loc 1 1870 0
+	.loc 1 1885 0
 	add	x3, x21, :lo12:.LANCHOR0
-	.loc 1 1872 0
+	.loc 1 1887 0
 	ldr	w1, [x24, 64]
-	.loc 1 1870 0
+	.loc 1 1885 0
 	mov	w4, 1
-	.loc 1 1872 0
+	.loc 1 1887 0
 	ldr	x0, [x24, 16]
-	.loc 1 1871 0
+	.loc 1 1886 0
 	stp	w4, wzr, [x3, 16]
-	.loc 1 1872 0
+	.loc 1 1887 0
 	bl	check_black_percent.isra.14
-.LVL982:
+.LVL990:
 	cbnz	w0, .L852
 	b	.L860
-.L1002:
-.LBB1874:
-.LBB1875:
-	mov	w1, 0
-	mov	x0, x20
-	bl	ebc_power_set.part.12
-.LVL983:
-	b	.L854
-.LVL984:
-.L1025:
-.LBE1875:
-.LBE1874:
-.LBB1876:
-.LBB1865:
-.LBB1866:
-	.loc 1 2096 0 discriminator 1
+.LVL991:
+.L1040:
+.LBB1897:
+.LBB1881:
+.LBB1882:
+	.loc 1 2113 0 discriminator 1
 	add	x27, x22, 352
-.LBE1866:
+.LBE1882:
 	mov	w1, 0
 	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL985:
-	b	.L928
+.LVL992:
+	b	.L938
 	.p2align 3
-.L1031:
-.LVL986:
-.LBB1867:
-	.loc 1 2096 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L925
-	.loc 1 2096 0 discriminator 7
+.L1047:
+.LVL993:
+.LBB1883:
+	.loc 1 2113 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L935
+	.loc 1 2113 0 discriminator 7
 	bl	schedule
-.LVL987:
-.L928:
-	.loc 1 2096 0 discriminator 9
+.LVL994:
+.L938:
+	.loc 1 2113 0 discriminator 9
 	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x27
 	bl	prepare_to_wait_event
-.LVL988:
+.LVL995:
 	ldr	w1, [x28, 92]
-	cbz	w1, .L1031
-.LBE1867:
-	.loc 1 2096 0 discriminator 4
+	cbz	w1, .L1047
+.LBE1883:
+	.loc 1 2113 0 discriminator 4
 	mov	x0, x27
 	add	x1, x29, 120
 	bl	finish_wait
-.LVL989:
-	b	.L925
-.LVL990:
-.L1027:
-.LBE1865:
-.LBE1876:
-	.loc 1 2004 0 is_stmt 1
-	ldr	x0, [x28, 104]
-	adrp	x1, .LC91
-	add	x1, x1, :lo12:.LC91
-	bl	_dev_err
-.LVL991:
-	.loc 1 2005 0
-	b	.L890
-.L1030:
-.LBB1877:
-.LBB1871:
-.LBB1872:
-	.loc 1 1926 0 discriminator 1
-	add	x26, x22, 352
-.LVL992:
-.LBE1872:
-	mov	w1, 0
-	add	x0, x29, 120
-	bl	init_wait_entry
-.LVL993:
-	b	.L875
-	.p2align 3
-.L1032:
-.LVL994:
-.LBB1873:
-	.loc 1 1926 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L872
-	.loc 1 1926 0 discriminator 7
-	bl	schedule
-.LVL995:
-.L875:
-	.loc 1 1926 0 discriminator 9
-	add	x1, x29, 120
-	mov	w2, 1
-	mov	x0, x26
-	bl	prepare_to_wait_event
 .LVL996:
-	ldr	w1, [x28, 92]
-	cbz	w1, .L1032
-.LBE1873:
-	.loc 1 1926 0 discriminator 4
-	mov	x0, x26
-	add	x1, x29, 120
-	bl	finish_wait
+	b	.L935
 .LVL997:
-	b	.L872
-.LVL998:
-.L1028:
-.LBE1871:
-.LBE1877:
-	.loc 1 1967 0 is_stmt 1
+.L1016:
+.LBE1881:
+.LBE1897:
+.LBB1898:
+.LBB1899:
+	mov	w1, 0
 	mov	x0, x20
-	bl	ebc_power_set.constprop.16
+	bl	ebc_power_set.part.12
+.LVL998:
+	b	.L854
+.L866:
+.LBE1899:
+.LBE1898:
+	.loc 1 1908 0 is_stmt 1
+	ldrsw	x2, [x28, 20]
+	ldr	x1, [x24, 16]
+	ldr	x0, [x28, 160]
+	bl	memcpy
 .LVL999:
-	b	.L911
+	b	.L868
 .LVL1000:
-.L1023:
-	.loc 1 1909 0
+.L1043:
+	.loc 1 2021 0
+	ldr	x0, [x28, 104]
+	adrp	x1, .LC90
+	add	x1, x1, :lo12:.LC90
+	bl	_dev_err
+.LVL1001:
+	.loc 1 2022 0
+	b	.L897
+.L1042:
+	.loc 1 2019 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.16
-.LVL1001:
-	b	.L867
 .LVL1002:
-.L1003:
-	.loc 1 2164 0
-	bl	__stack_chk_fail
+	b	.L924
 .LVL1003:
+.L1038:
+	.loc 1 1920 0
+	mov	x0, x20
+	bl	ebc_power_set.constprop.16
+.LVL1004:
+	b	.L871
+.L1017:
+	.loc 1 2181 0
+	bl	__stack_chk_fail
+.LVL1005:
 	.cfi_endproc
-.LFE2835:
+.LFE2836:
 	.size	ebc_thread, .-ebc_thread
 	.data
 	.align	3
@@ -11272,7 +11367,7 @@ ebc_driver:
 	.xword	ebc_probe
 	.xword	ebc_remove
 	.zero	24
-	.xword	.LC98
+	.xword	.LC97
 	.zero	32
 	.xword	ebc_match
 	.zero	64
@@ -11320,13 +11415,13 @@ ebc_auto_thread_sem:
 waveform_misc:
 	.word	244
 	.zero	4
-	.xword	.LC106
+	.xword	.LC105
 	.xword	waveform_ops
 	.zero	56
 	.type	dev_attr_waveform_version, %object
 	.size	dev_attr_waveform_version, 32
 dev_attr_waveform_version:
-	.xword	.LC105
+	.xword	.LC104
 	.hword	292
 	.zero	6
 	.xword	waveform_version_read
@@ -11334,7 +11429,7 @@ dev_attr_waveform_version:
 	.type	dev_attr_pmic_name, %object
 	.size	dev_attr_pmic_name, 32
 dev_attr_pmic_name:
-	.xword	.LC104
+	.xword	.LC103
 	.hword	292
 	.zero	6
 	.xword	pmic_name_read
@@ -11342,7 +11437,7 @@ dev_attr_pmic_name:
 	.type	dev_attr_pmic_temp, %object
 	.size	dev_attr_pmic_temp, 32
 dev_attr_pmic_temp:
-	.xword	.LC103
+	.xword	.LC102
 	.hword	292
 	.zero	6
 	.xword	pmic_temp_read
@@ -11350,7 +11445,7 @@ dev_attr_pmic_temp:
 	.type	dev_attr_pmic_vcom, %object
 	.size	dev_attr_pmic_vcom, 32
 dev_attr_pmic_vcom:
-	.xword	.LC102
+	.xword	.LC101
 	.hword	420
 	.zero	6
 	.xword	pmic_vcom_read
@@ -11358,7 +11453,7 @@ dev_attr_pmic_vcom:
 	.type	dev_attr_ebc_version, %object
 	.size	dev_attr_ebc_version, 32
 dev_attr_ebc_version:
-	.xword	.LC101
+	.xword	.LC100
 	.hword	292
 	.zero	6
 	.xword	ebc_version_read
@@ -11366,7 +11461,7 @@ dev_attr_ebc_version:
 	.type	dev_attr_ebc_state, %object
 	.size	dev_attr_ebc_state, 32
 dev_attr_ebc_state:
-	.xword	.LC100
+	.xword	.LC99
 	.hword	292
 	.zero	6
 	.xword	ebc_state_read
@@ -11374,7 +11469,7 @@ dev_attr_ebc_state:
 	.type	dev_attr_ebc_buf_state, %object
 	.size	dev_attr_ebc_buf_state, 32
 dev_attr_ebc_buf_state:
-	.xword	.LC99
+	.xword	.LC98
 	.hword	292
 	.zero	6
 	.xword	ebc_buf_state_read
@@ -11411,9 +11506,9 @@ resume_frame_count:
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.35181, %object
-	.size	__func__.35181, 11
-__func__.35181:
+	.type	__func__.35192, %object
+	.size	__func__.35192, 11
+__func__.35192:
 	.string	"ebc_io_ctl"
 	.align	3
 	.set	.LANCHOR3,. + 0
@@ -11421,14 +11516,14 @@ __func__.35181:
 	.size	__func__.34953, 16
 __func__.34953:
 	.string	"ebc_frame_start"
-	.type	__func__.35491, %object
-	.size	__func__.35491, 12
-__func__.35491:
+	.type	__func__.35502, %object
+	.size	__func__.35502, 12
+__func__.35502:
 	.string	"ebc_suspend"
 	.zero	4
-	.type	__func__.35425, %object
-	.size	__func__.35425, 19
-__func__.35425:
+	.type	__func__.35436, %object
+	.size	__func__.35436, 19
+__func__.35436:
 	.string	"ebc_lut_table_init"
 	.zero	5
 	.type	ebc_match, %object
@@ -11468,9 +11563,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init3102, %object
-	.size	__addressable_ebc_init3102, 8
-__addressable_ebc_init3102:
+	.type	__addressable_ebc_init3119, %object
+	.size	__addressable_ebc_init3119, 8
+__addressable_ebc_init3119:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -11528,7 +11623,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC16:
-	.string	"2.15"
+	.string	"2.16"
 	.zero	3
 .LC17:
 	.string	"%s\n"
@@ -11724,71 +11819,68 @@ __exitcall_ebc_exit:
 	.string	"refresh suspend logo\n"
 	.zero	2
 .LC84:
-	.string	"overlay mode not support 8bit background\n"
-	.zero	6
-.LC85:
 	.string	"overlay mode start, update background, frame_total=%d\n"
 	.zero	1
-.LC86:
+.LC85:
 	.string	"change display mode from %d to %d\n"
 	.zero	5
-.LC87:
+.LC86:
 	.string	"ebc is busy now, waiting prev refresh mode end...\n"
 	.zero	5
-.LC88:
+.LC87:
 	.string	"prev refresh mode end\n"
 	.zero	1
-.LC89:
+.LC88:
 	.string	"overlay disabled, drop EPD_OVERLAY frame\n"
 	.zero	6
-.LC90:
+.LC89:
 	.string	"overlay mode start, frame_total=%d\n"
 	.zero	4
-.LC91:
+.LC90:
 	.string	"ebc_lut_update err\n"
 	.zero	4
-.LC92:
+.LC91:
 	.string	"auto mode start, frame_total=%d\n"
 	.zero	7
-.LC93:
+.LC92:
 	.string	"frame start, mode = %d, framecount = %d\n"
 	.zero	7
-.LC94:
+.LC93:
 	.string	"ebc buffer mode %d error!!!\n"
 	.zero	3
-.LC95:
+.LC94:
 	.string	"power off\n"
 	.zero	5
-.LC96:
+.LC95:
 	.string	"early suspend\n"
 	.zero	1
-.LC97:
+.LC96:
 	.string	"check_part_mode==0, no need refresh\n"
 	.zero	3
-.LC98:
+.LC97:
 	.string	"ebc-dev"
-.LC99:
+.LC98:
 	.string	"ebc_buf_state"
 	.zero	2
-.LC100:
+.LC99:
 	.string	"ebc_state"
 	.zero	6
-.LC101:
+.LC100:
 	.string	"ebc_version"
 	.zero	4
-.LC102:
+.LC101:
 	.string	"pmic_vcom"
 	.zero	6
-.LC103:
+.LC102:
 	.string	"pmic_temp"
 	.zero	6
-.LC104:
+.LC103:
 	.string	"pmic_name"
 	.zero	6
-.LC105:
+.LC104:
 	.string	"waveform_version"
 	.zero	7
-.LC106:
+.LC105:
 	.string	"waveform"
 	.text
 .Letext0:
@@ -11990,16 +12082,16 @@ __exitcall_ebc_exit:
 	.file 214 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x152cc
+	.4byte	0x153e6
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF3331
+	.4byte	.LASF3336
 	.byte	0x1
-	.4byte	.LASF3332
-	.4byte	.LASF3333
-	.4byte	.Ldebug_ranges0+0x12a0
+	.4byte	.LASF3337
+	.4byte	.LASF3338
+	.4byte	.Ldebug_ranges0+0x1300
 	.8byte	0
 	.4byte	.Ldebug_line0
 	.uleb128 0x2
@@ -39709,7 +39801,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3028
 	.byte	0x1
-	.2byte	0x723
+	.2byte	0x732
 	.4byte	0xc6
 	.uleb128 0x9
 	.byte	0x3
@@ -39717,7 +39809,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3029
 	.byte	0x1
-	.2byte	0x724
+	.2byte	0x733
 	.4byte	0xc6
 	.uleb128 0x9
 	.byte	0x3
@@ -39725,7 +39817,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0x9be
+	.2byte	0x9cf
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
@@ -39733,7 +39825,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0x9c8
+	.2byte	0x9d9
 	.4byte	0xc680
 	.uleb128 0x9
 	.byte	0x3
@@ -39741,7 +39833,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0x9e5
+	.2byte	0x9f6
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
@@ -39749,7 +39841,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0x9eb
+	.2byte	0x9fc
 	.4byte	0xc680
 	.uleb128 0x9
 	.byte	0x3
@@ -39757,7 +39849,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0x9fa
+	.2byte	0xa0b
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -39765,7 +39857,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0xa05
+	.2byte	0xa16
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -39773,7 +39865,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0xa13
+	.2byte	0xa24
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -39781,7 +39873,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0xa36
+	.2byte	0xa47
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -39789,7 +39881,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0xa40
+	.2byte	0xa51
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -39797,7 +39889,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0xa49
+	.2byte	0xa5a
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -39805,7 +39897,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0xa52
+	.2byte	0xa63
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
@@ -39813,7 +39905,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0xbff
+	.2byte	0xc10
 	.4byte	0xa5cc
 	.uleb128 0x9
 	.byte	0x3
@@ -39830,7 +39922,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0xc04
+	.2byte	0xc15
 	.4byte	0xe71f
 	.uleb128 0x9
 	.byte	0x3
@@ -39838,7 +39930,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0xc0a
+	.2byte	0xc1b
 	.4byte	0xd70e
 	.uleb128 0x9
 	.byte	0x3
@@ -39846,15 +39938,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0xc1e
+	.2byte	0xc2f
 	.4byte	0x458
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init3102
+	.8byte	__addressable_ebc_init3119
 	.uleb128 0x4d
 	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0xc1f
+	.2byte	0xc30
 	.4byte	0x4ac
 	.uleb128 0x9
 	.byte	0x3
@@ -39862,79 +39954,79 @@ __exitcall_ebc_exit:
 	.uleb128 0x4e
 	.4byte	.LASF3096
 	.byte	0x1
-	.2byte	0xc19
-	.8byte	.LFB2864
-	.8byte	.LFE2864-.LFB2864
+	.2byte	0xc2a
+	.8byte	.LFB2865
+	.8byte	.LFE2865-.LFB2865
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe7a8
 	.uleb128 0x4f
 	.8byte	.LVL66
-	.4byte	0x14f9d
+	.4byte	0x150b7
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0xc14
+	.2byte	0xc25
 	.4byte	0xc6
-	.8byte	.LFB2863
-	.8byte	.LFE2863-.LFB2863
+	.8byte	.LFB2864
+	.8byte	.LFE2864-.LFB2864
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe7d8
 	.uleb128 0x4f
 	.8byte	.LVL360
-	.4byte	0x14fa9
+	.4byte	0x150c3
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0xbf3
+	.2byte	0xc04
 	.4byte	0xc6
-	.8byte	.LFB2862
-	.8byte	.LFE2862-.LFB2862
+	.8byte	.LFB2863
+	.8byte	.LFE2863-.LFB2863
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe874
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xbf3
+	.2byte	0xc04
 	.4byte	0xa5e0
 	.4byte	.LLST13
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xbf5
+	.2byte	0xc06
 	.4byte	0xe557
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xbf6
+	.2byte	0xc07
 	.4byte	0xe874
 	.uleb128 0x54
-	.4byte	0x14868
-	.8byte	.LBB944
-	.8byte	.LBE944-.LBB944
+	.4byte	0x14982
+	.8byte	.LBB950
+	.8byte	.LBE950-.LBB950
 	.byte	0x1
-	.2byte	0xbf5
+	.2byte	0xc06
 	.4byte	0xe844
 	.uleb128 0x55
-	.4byte	0x14879
+	.4byte	0x14993
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1443d
-	.8byte	.LBB946
-	.8byte	.LBE946-.LBB946
+	.4byte	0x14557
+	.8byte	.LBB952
+	.8byte	.LBE952-.LBB952
 	.byte	0x1
-	.2byte	0xbf8
+	.2byte	0xc09
 	.4byte	0xe866
 	.uleb128 0x55
-	.4byte	0x1444a
+	.4byte	0x14564
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL70
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -39942,82 +40034,82 @@ __exitcall_ebc_exit:
 	.uleb128 0x51
 	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0xbe2
+	.2byte	0xbf3
 	.4byte	0xc6
-	.8byte	.LFB2861
-	.8byte	.LFE2861-.LFB2861
+	.8byte	.LFB2862
+	.8byte	.LFE2862-.LFB2862
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe981
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xbe2
+	.2byte	0xbf3
 	.4byte	0xa5e0
 	.4byte	.LLST195
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xbe4
+	.2byte	0xbf5
 	.4byte	0xe557
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xbe5
+	.2byte	0xbf6
 	.4byte	0xe874
 	.uleb128 0x56
 	.4byte	.LASF3050
 	.4byte	0xe991
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35491
+	.8byte	__func__.35502
 	.uleb128 0x54
-	.4byte	0x14868
-	.8byte	.LBB1487
-	.8byte	.LBE1487-.LBB1487
+	.4byte	0x14982
+	.8byte	.LBB1493
+	.8byte	.LBE1493-.LBB1493
 	.byte	0x1
-	.2byte	0xbe4
+	.2byte	0xbf5
 	.4byte	0xe8f9
 	.uleb128 0x55
-	.4byte	0x14879
+	.4byte	0x14993
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14457
-	.8byte	.LBB1489
-	.8byte	.LBE1489-.LBB1489
+	.4byte	0x14571
+	.8byte	.LBB1495
+	.8byte	.LBE1495-.LBB1495
 	.byte	0x1
-	.2byte	0xbed
+	.2byte	0xbfe
 	.4byte	0xe91b
 	.uleb128 0x55
-	.4byte	0x14464
+	.4byte	0x1457e
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14104
-	.8byte	.LBB1491
-	.8byte	.LBE1491-.LBB1491
+	.4byte	0x1421e
+	.8byte	.LBB1497
+	.8byte	.LBE1497-.LBB1497
 	.byte	0x1
-	.2byte	0xbe9
+	.2byte	0xbfa
 	.4byte	0xe966
 	.uleb128 0x55
-	.4byte	0x1411f
+	.4byte	0x14239
 	.uleb128 0x55
-	.4byte	0x14114
+	.4byte	0x1422e
 	.uleb128 0x57
-	.8byte	.LBB1492
-	.8byte	.LBE1492-.LBB1492
+	.8byte	.LBB1498
+	.8byte	.LBE1498-.LBB1498
 	.uleb128 0x58
-	.4byte	0x1412b
+	.4byte	0x14245
 	.uleb128 0x4f
 	.8byte	.LVL608
-	.4byte	0x14dcc
+	.4byte	0x14ee6
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL606
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL607
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
@@ -40031,171 +40123,171 @@ __exitcall_ebc_exit:
 	.uleb128 0x50
 	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0xbdb
+	.2byte	0xbec
 	.4byte	0xc6
-	.8byte	.LFB2860
-	.8byte	.LFE2860-.LFB2860
+	.8byte	.LFB2861
+	.8byte	.LFE2861-.LFB2861
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe9d6
 	.uleb128 0x59
 	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0xbdb
+	.2byte	0xbec
 	.4byte	0xd78a
 	.4byte	.LLST15
 	.uleb128 0x4f
 	.8byte	.LVL76
-	.4byte	0x14fc2
+	.4byte	0x150dc
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0xb5a
+	.2byte	0xb6b
 	.4byte	0xc6
-	.8byte	.LFB2859
-	.8byte	.LFE2859-.LFB2859
+	.8byte	.LFB2860
+	.8byte	.LFE2860-.LFB2860
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xfdb3
 	.uleb128 0x59
 	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0xb5a
+	.2byte	0xb6b
 	.4byte	0xd78a
 	.4byte	.LLST198
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xb5c
+	.2byte	0xb6d
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0xb5d
+	.2byte	0xb6e
 	.4byte	0xb904
 	.uleb128 0x5a
 	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0xb5e
+	.2byte	0xb6f
 	.4byte	0xd78a
 	.4byte	.LLST199
 	.uleb128 0x48
 	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0xb5f
+	.2byte	0xb70
 	.4byte	0xb904
 	.uleb128 0x5a
 	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0xb60
+	.2byte	0xb71
 	.4byte	0xc0b3
 	.4byte	.LLST200
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xb61
+	.2byte	0xb72
 	.4byte	0xe557
 	.uleb128 0x5a
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xb62
+	.2byte	0xb73
 	.4byte	0xe874
 	.4byte	.LLST201
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xb63
+	.2byte	0xb74
 	.4byte	0xe1f4
 	.uleb128 0x5a
 	.4byte	.LASF976
 	.byte	0x1
-	.2byte	0xb64
+	.2byte	0xb75
 	.4byte	0xbd30
 	.4byte	.LLST202
 	.uleb128 0x48
 	.4byte	.LASF2435
 	.byte	0x1
-	.2byte	0xb65
+	.2byte	0xb76
 	.4byte	0xbcd0
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xb66
+	.2byte	0xb77
 	.4byte	0xc6
 	.uleb128 0x5a
 	.4byte	.LASF1001
 	.byte	0x1
-	.2byte	0xb67
+	.2byte	0xb78
 	.4byte	0xc6
 	.4byte	.LLST203
 	.uleb128 0x5b
 	.string	"i"
 	.byte	0x1
-	.2byte	0xb68
+	.2byte	0xb79
 	.4byte	0xc6
 	.4byte	.LLST204
 	.uleb128 0x5c
-	.4byte	0x14886
-	.8byte	.LBB1637
+	.4byte	0x149a0
+	.8byte	.LBB1643
 	.4byte	.Ldebug_ranges0+0xd50
 	.byte	0x1
-	.2byte	0xb6a
+	.2byte	0xb7b
 	.4byte	0xeaef
 	.uleb128 0x55
-	.4byte	0x148af
+	.4byte	0x149c9
 	.uleb128 0x55
-	.4byte	0x148a3
+	.4byte	0x149bd
 	.uleb128 0x55
-	.4byte	0x14897
+	.4byte	0x149b1
 	.uleb128 0x4f
 	.8byte	.LVL614
-	.4byte	0x14fce
+	.4byte	0x150e8
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14760
-	.8byte	.LBB1641
-	.8byte	.LBE1641-.LBB1641
+	.4byte	0x1487a
+	.8byte	.LBB1647
+	.8byte	.LBE1647-.LBB1647
 	.byte	0x1
-	.2byte	0xb7c
+	.2byte	0xb8d
 	.4byte	0xeb2e
 	.uleb128 0x55
-	.4byte	0x14770
+	.4byte	0x1488a
 	.uleb128 0x5d
-	.4byte	0x14868
-	.8byte	.LBB1642
-	.8byte	.LBE1642-.LBB1642
+	.4byte	0x14982
+	.8byte	.LBB1648
+	.8byte	.LBE1648-.LBB1648
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x55
-	.4byte	0x14879
+	.4byte	0x14993
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14783
-	.8byte	.LBB1644
-	.8byte	.LBE1644-.LBB1644
+	.4byte	0x1489d
+	.8byte	.LBB1650
+	.8byte	.LBE1650-.LBB1650
 	.byte	0x1
-	.2byte	0xb97
+	.2byte	0xba8
 	.4byte	0xeb6e
 	.uleb128 0x55
-	.4byte	0x14794
+	.4byte	0x148ae
 	.uleb128 0x5e
-	.4byte	0x14868
-	.8byte	.LBB1645
-	.8byte	.LBE1645-.LBB1645
+	.4byte	0x14982
+	.8byte	.LBB1651
+	.8byte	.LBE1651-.LBB1651
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x55
-	.4byte	0x14879
+	.4byte	0x14993
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0x117be
-	.8byte	.LBB1647
+	.8byte	.LBB1653
 	.4byte	.Ldebug_ranges0+0xd80
 	.byte	0x1
-	.2byte	0xbab
+	.2byte	0xbbc
 	.4byte	0xf543
 	.uleb128 0x55
 	.4byte	0x117cf
@@ -40204,760 +40296,760 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	0x117db
 	.uleb128 0x5c
-	.4byte	0x147a7
-	.8byte	.LBB1649
+	.4byte	0x148c1
+	.8byte	.LBB1655
 	.4byte	.Ldebug_ranges0+0xdd0
 	.byte	0x1
-	.2byte	0x89d
+	.2byte	0x8ae
 	.4byte	0xebfe
 	.uleb128 0x55
-	.4byte	0x147cf
+	.4byte	0x148e9
 	.uleb128 0x55
-	.4byte	0x147c3
+	.4byte	0x148dd
 	.uleb128 0x55
-	.4byte	0x147b8
+	.4byte	0x148d2
 	.uleb128 0x60
-	.4byte	0x147dc
-	.8byte	.LBB1650
+	.4byte	0x148f6
+	.8byte	.LBB1656
 	.4byte	.Ldebug_ranges0+0xdd0
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14810
+	.4byte	0x1492a
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x1491e
 	.uleb128 0x55
-	.4byte	0x147f8
+	.4byte	0x14912
 	.uleb128 0x55
-	.4byte	0x147ed
+	.4byte	0x14907
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xdd0
 	.uleb128 0x58
-	.4byte	0x1481b
+	.4byte	0x14935
 	.uleb128 0x4f
 	.8byte	.LVL639
-	.4byte	0x14fdb
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x54
-	.4byte	0x147a7
-	.8byte	.LBB1661
-	.8byte	.LBE1661-.LBB1661
-	.byte	0x1
-	.2byte	0x8a0
-	.4byte	0xec7b
-	.uleb128 0x55
-	.4byte	0x147cf
-	.uleb128 0x55
-	.4byte	0x147c3
-	.uleb128 0x55
-	.4byte	0x147b8
-	.uleb128 0x5e
-	.4byte	0x147dc
-	.8byte	.LBB1662
-	.8byte	.LBE1662-.LBB1662
-	.byte	0xe
-	.2byte	0x49c
-	.uleb128 0x55
-	.4byte	0x14810
-	.uleb128 0x55
-	.4byte	0x14804
-	.uleb128 0x55
-	.4byte	0x147f8
-	.uleb128 0x55
-	.4byte	0x147ed
-	.uleb128 0x57
-	.8byte	.LBB1663
-	.8byte	.LBE1663-.LBB1663
-	.uleb128 0x58
-	.4byte	0x1481b
-	.uleb128 0x4f
-	.8byte	.LVL640
-	.4byte	0x14fdb
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x54
-	.4byte	0x147a7
-	.8byte	.LBB1664
-	.8byte	.LBE1664-.LBB1664
-	.byte	0x1
-	.2byte	0x8a3
-	.4byte	0xecf8
-	.uleb128 0x55
-	.4byte	0x147cf
-	.uleb128 0x55
-	.4byte	0x147c3
-	.uleb128 0x55
-	.4byte	0x147b8
-	.uleb128 0x5e
-	.4byte	0x147dc
-	.8byte	.LBB1665
-	.8byte	.LBE1665-.LBB1665
-	.byte	0xe
-	.2byte	0x49c
-	.uleb128 0x55
-	.4byte	0x14810
-	.uleb128 0x55
-	.4byte	0x14804
-	.uleb128 0x55
-	.4byte	0x147f8
-	.uleb128 0x55
-	.4byte	0x147ed
-	.uleb128 0x57
-	.8byte	.LBB1666
-	.8byte	.LBE1666-.LBB1666
-	.uleb128 0x58
-	.4byte	0x1481b
-	.uleb128 0x4f
-	.8byte	.LVL641
-	.4byte	0x14fdb
+	.4byte	0x150f5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x147a7
+	.4byte	0x148c1
 	.8byte	.LBB1667
 	.8byte	.LBE1667-.LBB1667
 	.byte	0x1
-	.2byte	0x8a6
-	.4byte	0xed75
+	.2byte	0x8b1
+	.4byte	0xec7b
 	.uleb128 0x55
-	.4byte	0x147cf
+	.4byte	0x148e9
 	.uleb128 0x55
-	.4byte	0x147c3
+	.4byte	0x148dd
 	.uleb128 0x55
-	.4byte	0x147b8
+	.4byte	0x148d2
 	.uleb128 0x5e
-	.4byte	0x147dc
+	.4byte	0x148f6
 	.8byte	.LBB1668
 	.8byte	.LBE1668-.LBB1668
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14810
+	.4byte	0x1492a
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x1491e
 	.uleb128 0x55
-	.4byte	0x147f8
+	.4byte	0x14912
 	.uleb128 0x55
-	.4byte	0x147ed
+	.4byte	0x14907
 	.uleb128 0x57
 	.8byte	.LBB1669
 	.8byte	.LBE1669-.LBB1669
 	.uleb128 0x58
-	.4byte	0x1481b
+	.4byte	0x14935
 	.uleb128 0x4f
-	.8byte	.LVL642
-	.4byte	0x14fdb
+	.8byte	.LVL640
+	.4byte	0x150f5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x147a7
+	.4byte	0x148c1
 	.8byte	.LBB1670
 	.8byte	.LBE1670-.LBB1670
 	.byte	0x1
-	.2byte	0x8a9
-	.4byte	0xedf2
+	.2byte	0x8b4
+	.4byte	0xecf8
 	.uleb128 0x55
-	.4byte	0x147cf
+	.4byte	0x148e9
 	.uleb128 0x55
-	.4byte	0x147c3
+	.4byte	0x148dd
 	.uleb128 0x55
-	.4byte	0x147b8
+	.4byte	0x148d2
 	.uleb128 0x5e
-	.4byte	0x147dc
+	.4byte	0x148f6
 	.8byte	.LBB1671
 	.8byte	.LBE1671-.LBB1671
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14810
+	.4byte	0x1492a
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x1491e
 	.uleb128 0x55
-	.4byte	0x147f8
+	.4byte	0x14912
 	.uleb128 0x55
-	.4byte	0x147ed
+	.4byte	0x14907
 	.uleb128 0x57
 	.8byte	.LBB1672
 	.8byte	.LBE1672-.LBB1672
 	.uleb128 0x58
-	.4byte	0x1481b
+	.4byte	0x14935
 	.uleb128 0x4f
-	.8byte	.LVL643
-	.4byte	0x14fdb
+	.8byte	.LVL641
+	.4byte	0x150f5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x147a7
+	.4byte	0x148c1
 	.8byte	.LBB1673
 	.8byte	.LBE1673-.LBB1673
 	.byte	0x1
-	.2byte	0x8ac
-	.4byte	0xee6f
+	.2byte	0x8b7
+	.4byte	0xed75
 	.uleb128 0x55
-	.4byte	0x147cf
+	.4byte	0x148e9
 	.uleb128 0x55
-	.4byte	0x147c3
+	.4byte	0x148dd
 	.uleb128 0x55
-	.4byte	0x147b8
+	.4byte	0x148d2
 	.uleb128 0x5e
-	.4byte	0x147dc
+	.4byte	0x148f6
 	.8byte	.LBB1674
 	.8byte	.LBE1674-.LBB1674
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14810
+	.4byte	0x1492a
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x1491e
 	.uleb128 0x55
-	.4byte	0x147f8
+	.4byte	0x14912
 	.uleb128 0x55
-	.4byte	0x147ed
+	.4byte	0x14907
 	.uleb128 0x57
 	.8byte	.LBB1675
 	.8byte	.LBE1675-.LBB1675
 	.uleb128 0x58
-	.4byte	0x1481b
+	.4byte	0x14935
 	.uleb128 0x4f
-	.8byte	.LVL644
-	.4byte	0x14fdb
+	.8byte	.LVL642
+	.4byte	0x150f5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x147a7
+	.4byte	0x148c1
 	.8byte	.LBB1676
 	.8byte	.LBE1676-.LBB1676
 	.byte	0x1
-	.2byte	0x8af
-	.4byte	0xeeec
+	.2byte	0x8ba
+	.4byte	0xedf2
 	.uleb128 0x55
-	.4byte	0x147cf
+	.4byte	0x148e9
 	.uleb128 0x55
-	.4byte	0x147c3
+	.4byte	0x148dd
 	.uleb128 0x55
-	.4byte	0x147b8
+	.4byte	0x148d2
 	.uleb128 0x5e
-	.4byte	0x147dc
+	.4byte	0x148f6
 	.8byte	.LBB1677
 	.8byte	.LBE1677-.LBB1677
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14810
+	.4byte	0x1492a
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x1491e
 	.uleb128 0x55
-	.4byte	0x147f8
+	.4byte	0x14912
 	.uleb128 0x55
-	.4byte	0x147ed
+	.4byte	0x14907
 	.uleb128 0x57
 	.8byte	.LBB1678
 	.8byte	.LBE1678-.LBB1678
 	.uleb128 0x58
-	.4byte	0x1481b
+	.4byte	0x14935
 	.uleb128 0x4f
-	.8byte	.LVL645
-	.4byte	0x14fdb
+	.8byte	.LVL643
+	.4byte	0x150f5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x147a7
+	.4byte	0x148c1
 	.8byte	.LBB1679
 	.8byte	.LBE1679-.LBB1679
 	.byte	0x1
-	.2byte	0x8b2
-	.4byte	0xef69
+	.2byte	0x8bd
+	.4byte	0xee6f
 	.uleb128 0x55
-	.4byte	0x147cf
+	.4byte	0x148e9
 	.uleb128 0x55
-	.4byte	0x147c3
+	.4byte	0x148dd
 	.uleb128 0x55
-	.4byte	0x147b8
+	.4byte	0x148d2
 	.uleb128 0x5e
-	.4byte	0x147dc
+	.4byte	0x148f6
 	.8byte	.LBB1680
 	.8byte	.LBE1680-.LBB1680
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14810
+	.4byte	0x1492a
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x1491e
 	.uleb128 0x55
-	.4byte	0x147f8
+	.4byte	0x14912
 	.uleb128 0x55
-	.4byte	0x147ed
+	.4byte	0x14907
 	.uleb128 0x57
 	.8byte	.LBB1681
 	.8byte	.LBE1681-.LBB1681
 	.uleb128 0x58
-	.4byte	0x1481b
+	.4byte	0x14935
 	.uleb128 0x4f
-	.8byte	.LVL646
-	.4byte	0x14fdb
+	.8byte	.LVL644
+	.4byte	0x150f5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x147a7
+	.4byte	0x148c1
 	.8byte	.LBB1682
 	.8byte	.LBE1682-.LBB1682
 	.byte	0x1
-	.2byte	0x8b5
-	.4byte	0xefe6
+	.2byte	0x8c0
+	.4byte	0xeeec
 	.uleb128 0x55
-	.4byte	0x147cf
+	.4byte	0x148e9
 	.uleb128 0x55
-	.4byte	0x147c3
+	.4byte	0x148dd
 	.uleb128 0x55
-	.4byte	0x147b8
+	.4byte	0x148d2
 	.uleb128 0x5e
-	.4byte	0x147dc
+	.4byte	0x148f6
 	.8byte	.LBB1683
 	.8byte	.LBE1683-.LBB1683
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14810
+	.4byte	0x1492a
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x1491e
 	.uleb128 0x55
-	.4byte	0x147f8
+	.4byte	0x14912
 	.uleb128 0x55
-	.4byte	0x147ed
+	.4byte	0x14907
 	.uleb128 0x57
 	.8byte	.LBB1684
 	.8byte	.LBE1684-.LBB1684
 	.uleb128 0x58
-	.4byte	0x1481b
+	.4byte	0x14935
 	.uleb128 0x4f
-	.8byte	.LVL647
-	.4byte	0x14fdb
+	.8byte	.LVL645
+	.4byte	0x150f5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x147a7
+	.4byte	0x148c1
 	.8byte	.LBB1685
 	.8byte	.LBE1685-.LBB1685
 	.byte	0x1
-	.2byte	0x8b8
-	.4byte	0xf063
+	.2byte	0x8c3
+	.4byte	0xef69
 	.uleb128 0x55
-	.4byte	0x147cf
+	.4byte	0x148e9
 	.uleb128 0x55
-	.4byte	0x147c3
+	.4byte	0x148dd
 	.uleb128 0x55
-	.4byte	0x147b8
+	.4byte	0x148d2
 	.uleb128 0x5e
-	.4byte	0x147dc
+	.4byte	0x148f6
 	.8byte	.LBB1686
 	.8byte	.LBE1686-.LBB1686
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14810
+	.4byte	0x1492a
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x1491e
 	.uleb128 0x55
-	.4byte	0x147f8
+	.4byte	0x14912
 	.uleb128 0x55
-	.4byte	0x147ed
+	.4byte	0x14907
 	.uleb128 0x57
 	.8byte	.LBB1687
 	.8byte	.LBE1687-.LBB1687
 	.uleb128 0x58
-	.4byte	0x1481b
+	.4byte	0x14935
 	.uleb128 0x4f
-	.8byte	.LVL648
-	.4byte	0x14fdb
+	.8byte	.LVL646
+	.4byte	0x150f5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x147a7
+	.4byte	0x148c1
 	.8byte	.LBB1688
 	.8byte	.LBE1688-.LBB1688
 	.byte	0x1
-	.2byte	0x8bb
-	.4byte	0xf0e0
+	.2byte	0x8c6
+	.4byte	0xefe6
 	.uleb128 0x55
-	.4byte	0x147cf
+	.4byte	0x148e9
 	.uleb128 0x55
-	.4byte	0x147c3
+	.4byte	0x148dd
 	.uleb128 0x55
-	.4byte	0x147b8
+	.4byte	0x148d2
 	.uleb128 0x5e
-	.4byte	0x147dc
+	.4byte	0x148f6
 	.8byte	.LBB1689
 	.8byte	.LBE1689-.LBB1689
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14810
+	.4byte	0x1492a
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x1491e
 	.uleb128 0x55
-	.4byte	0x147f8
+	.4byte	0x14912
 	.uleb128 0x55
-	.4byte	0x147ed
+	.4byte	0x14907
 	.uleb128 0x57
 	.8byte	.LBB1690
 	.8byte	.LBE1690-.LBB1690
 	.uleb128 0x58
-	.4byte	0x1481b
+	.4byte	0x14935
 	.uleb128 0x4f
-	.8byte	.LVL649
-	.4byte	0x14fdb
+	.8byte	.LVL647
+	.4byte	0x150f5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x147a7
+	.4byte	0x148c1
 	.8byte	.LBB1691
 	.8byte	.LBE1691-.LBB1691
 	.byte	0x1
-	.2byte	0x8be
-	.4byte	0xf15d
+	.2byte	0x8c9
+	.4byte	0xf063
 	.uleb128 0x55
-	.4byte	0x147cf
+	.4byte	0x148e9
 	.uleb128 0x55
-	.4byte	0x147c3
+	.4byte	0x148dd
 	.uleb128 0x55
-	.4byte	0x147b8
+	.4byte	0x148d2
 	.uleb128 0x5e
-	.4byte	0x147dc
+	.4byte	0x148f6
 	.8byte	.LBB1692
 	.8byte	.LBE1692-.LBB1692
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14810
+	.4byte	0x1492a
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x1491e
 	.uleb128 0x55
-	.4byte	0x147f8
+	.4byte	0x14912
 	.uleb128 0x55
-	.4byte	0x147ed
+	.4byte	0x14907
 	.uleb128 0x57
 	.8byte	.LBB1693
 	.8byte	.LBE1693-.LBB1693
 	.uleb128 0x58
-	.4byte	0x1481b
+	.4byte	0x14935
 	.uleb128 0x4f
-	.8byte	.LVL650
-	.4byte	0x14fdb
+	.8byte	.LVL648
+	.4byte	0x150f5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x147a7
+	.4byte	0x148c1
 	.8byte	.LBB1694
 	.8byte	.LBE1694-.LBB1694
 	.byte	0x1
-	.2byte	0x8c1
-	.4byte	0xf1da
+	.2byte	0x8cc
+	.4byte	0xf0e0
 	.uleb128 0x55
-	.4byte	0x147cf
+	.4byte	0x148e9
 	.uleb128 0x55
-	.4byte	0x147c3
+	.4byte	0x148dd
 	.uleb128 0x55
-	.4byte	0x147b8
+	.4byte	0x148d2
 	.uleb128 0x5e
-	.4byte	0x147dc
+	.4byte	0x148f6
 	.8byte	.LBB1695
 	.8byte	.LBE1695-.LBB1695
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14810
+	.4byte	0x1492a
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x1491e
 	.uleb128 0x55
-	.4byte	0x147f8
+	.4byte	0x14912
 	.uleb128 0x55
-	.4byte	0x147ed
+	.4byte	0x14907
 	.uleb128 0x57
 	.8byte	.LBB1696
 	.8byte	.LBE1696-.LBB1696
 	.uleb128 0x58
-	.4byte	0x1481b
+	.4byte	0x14935
 	.uleb128 0x4f
-	.8byte	.LVL651
-	.4byte	0x14fdb
+	.8byte	.LVL649
+	.4byte	0x150f5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x147a7
+	.4byte	0x148c1
 	.8byte	.LBB1697
 	.8byte	.LBE1697-.LBB1697
 	.byte	0x1
-	.2byte	0x8c4
-	.4byte	0xf257
+	.2byte	0x8cf
+	.4byte	0xf15d
 	.uleb128 0x55
-	.4byte	0x147cf
+	.4byte	0x148e9
 	.uleb128 0x55
-	.4byte	0x147c3
+	.4byte	0x148dd
 	.uleb128 0x55
-	.4byte	0x147b8
+	.4byte	0x148d2
 	.uleb128 0x5e
-	.4byte	0x147dc
+	.4byte	0x148f6
 	.8byte	.LBB1698
 	.8byte	.LBE1698-.LBB1698
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14810
+	.4byte	0x1492a
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x1491e
 	.uleb128 0x55
-	.4byte	0x147f8
+	.4byte	0x14912
 	.uleb128 0x55
-	.4byte	0x147ed
+	.4byte	0x14907
 	.uleb128 0x57
 	.8byte	.LBB1699
 	.8byte	.LBE1699-.LBB1699
 	.uleb128 0x58
-	.4byte	0x1481b
+	.4byte	0x14935
 	.uleb128 0x4f
-	.8byte	.LVL652
-	.4byte	0x14fdb
+	.8byte	.LVL650
+	.4byte	0x150f5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x147a7
+	.4byte	0x148c1
 	.8byte	.LBB1700
 	.8byte	.LBE1700-.LBB1700
 	.byte	0x1
-	.2byte	0x8c7
-	.4byte	0xf2d4
+	.2byte	0x8d2
+	.4byte	0xf1da
 	.uleb128 0x55
-	.4byte	0x147cf
+	.4byte	0x148e9
 	.uleb128 0x55
-	.4byte	0x147c3
+	.4byte	0x148dd
 	.uleb128 0x55
-	.4byte	0x147b8
+	.4byte	0x148d2
 	.uleb128 0x5e
-	.4byte	0x147dc
+	.4byte	0x148f6
 	.8byte	.LBB1701
 	.8byte	.LBE1701-.LBB1701
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14810
+	.4byte	0x1492a
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x1491e
 	.uleb128 0x55
-	.4byte	0x147f8
+	.4byte	0x14912
 	.uleb128 0x55
-	.4byte	0x147ed
+	.4byte	0x14907
 	.uleb128 0x57
 	.8byte	.LBB1702
 	.8byte	.LBE1702-.LBB1702
 	.uleb128 0x58
-	.4byte	0x1481b
+	.4byte	0x14935
 	.uleb128 0x4f
-	.8byte	.LVL653
-	.4byte	0x14fdb
+	.8byte	.LVL651
+	.4byte	0x150f5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x147a7
+	.4byte	0x148c1
 	.8byte	.LBB1703
 	.8byte	.LBE1703-.LBB1703
 	.byte	0x1
-	.2byte	0x8ca
-	.4byte	0xf351
+	.2byte	0x8d5
+	.4byte	0xf257
 	.uleb128 0x55
-	.4byte	0x147cf
+	.4byte	0x148e9
 	.uleb128 0x55
-	.4byte	0x147c3
+	.4byte	0x148dd
 	.uleb128 0x55
-	.4byte	0x147b8
+	.4byte	0x148d2
 	.uleb128 0x5e
-	.4byte	0x147dc
+	.4byte	0x148f6
 	.8byte	.LBB1704
 	.8byte	.LBE1704-.LBB1704
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14810
+	.4byte	0x1492a
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x1491e
 	.uleb128 0x55
-	.4byte	0x147f8
+	.4byte	0x14912
 	.uleb128 0x55
-	.4byte	0x147ed
+	.4byte	0x14907
 	.uleb128 0x57
 	.8byte	.LBB1705
 	.8byte	.LBE1705-.LBB1705
 	.uleb128 0x58
-	.4byte	0x1481b
+	.4byte	0x14935
 	.uleb128 0x4f
-	.8byte	.LVL654
-	.4byte	0x14fdb
+	.8byte	.LVL652
+	.4byte	0x150f5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x147a7
+	.4byte	0x148c1
 	.8byte	.LBB1706
 	.8byte	.LBE1706-.LBB1706
 	.byte	0x1
-	.2byte	0x8cd
-	.4byte	0xf3ce
+	.2byte	0x8d8
+	.4byte	0xf2d4
 	.uleb128 0x55
-	.4byte	0x147cf
+	.4byte	0x148e9
 	.uleb128 0x55
-	.4byte	0x147c3
+	.4byte	0x148dd
 	.uleb128 0x55
-	.4byte	0x147b8
+	.4byte	0x148d2
 	.uleb128 0x5e
-	.4byte	0x147dc
+	.4byte	0x148f6
 	.8byte	.LBB1707
 	.8byte	.LBE1707-.LBB1707
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14810
+	.4byte	0x1492a
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x1491e
 	.uleb128 0x55
-	.4byte	0x147f8
+	.4byte	0x14912
 	.uleb128 0x55
-	.4byte	0x147ed
+	.4byte	0x14907
 	.uleb128 0x57
 	.8byte	.LBB1708
 	.8byte	.LBE1708-.LBB1708
 	.uleb128 0x58
-	.4byte	0x1481b
+	.4byte	0x14935
 	.uleb128 0x4f
-	.8byte	.LVL655
-	.4byte	0x14fdb
+	.8byte	.LVL653
+	.4byte	0x150f5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x147a7
+	.4byte	0x148c1
 	.8byte	.LBB1709
 	.8byte	.LBE1709-.LBB1709
 	.byte	0x1
-	.2byte	0x8d0
-	.4byte	0xf44b
+	.2byte	0x8db
+	.4byte	0xf351
 	.uleb128 0x55
-	.4byte	0x147cf
+	.4byte	0x148e9
 	.uleb128 0x55
-	.4byte	0x147c3
+	.4byte	0x148dd
 	.uleb128 0x55
-	.4byte	0x147b8
+	.4byte	0x148d2
 	.uleb128 0x5e
-	.4byte	0x147dc
+	.4byte	0x148f6
 	.8byte	.LBB1710
 	.8byte	.LBE1710-.LBB1710
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14810
+	.4byte	0x1492a
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x1491e
 	.uleb128 0x55
-	.4byte	0x147f8
+	.4byte	0x14912
 	.uleb128 0x55
-	.4byte	0x147ed
+	.4byte	0x14907
 	.uleb128 0x57
 	.8byte	.LBB1711
 	.8byte	.LBE1711-.LBB1711
 	.uleb128 0x58
-	.4byte	0x1481b
+	.4byte	0x14935
 	.uleb128 0x4f
-	.8byte	.LVL656
-	.4byte	0x14fdb
+	.8byte	.LVL654
+	.4byte	0x150f5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x147a7
+	.4byte	0x148c1
 	.8byte	.LBB1712
 	.8byte	.LBE1712-.LBB1712
 	.byte	0x1
-	.2byte	0x8d3
-	.4byte	0xf4c8
+	.2byte	0x8de
+	.4byte	0xf3ce
 	.uleb128 0x55
-	.4byte	0x147cf
+	.4byte	0x148e9
 	.uleb128 0x55
-	.4byte	0x147c3
+	.4byte	0x148dd
 	.uleb128 0x55
-	.4byte	0x147b8
+	.4byte	0x148d2
 	.uleb128 0x5e
-	.4byte	0x147dc
+	.4byte	0x148f6
 	.8byte	.LBB1713
 	.8byte	.LBE1713-.LBB1713
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14810
+	.4byte	0x1492a
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x1491e
 	.uleb128 0x55
-	.4byte	0x147f8
+	.4byte	0x14912
 	.uleb128 0x55
-	.4byte	0x147ed
+	.4byte	0x14907
 	.uleb128 0x57
 	.8byte	.LBB1714
 	.8byte	.LBE1714-.LBB1714
 	.uleb128 0x58
-	.4byte	0x1481b
+	.4byte	0x14935
 	.uleb128 0x4f
-	.8byte	.LVL657
-	.4byte	0x14fdb
+	.8byte	.LVL655
+	.4byte	0x150f5
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5e
-	.4byte	0x147a7
+	.uleb128 0x54
+	.4byte	0x148c1
 	.8byte	.LBB1715
 	.8byte	.LBE1715-.LBB1715
 	.byte	0x1
-	.2byte	0x8d6
+	.2byte	0x8e1
+	.4byte	0xf44b
 	.uleb128 0x55
-	.4byte	0x147cf
+	.4byte	0x148e9
 	.uleb128 0x55
-	.4byte	0x147c3
+	.4byte	0x148dd
 	.uleb128 0x55
-	.4byte	0x147b8
+	.4byte	0x148d2
 	.uleb128 0x5e
-	.4byte	0x147dc
+	.4byte	0x148f6
 	.8byte	.LBB1716
 	.8byte	.LBE1716-.LBB1716
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x14810
+	.4byte	0x1492a
 	.uleb128 0x55
-	.4byte	0x14804
+	.4byte	0x1491e
 	.uleb128 0x55
-	.4byte	0x147f8
+	.4byte	0x14912
 	.uleb128 0x55
-	.4byte	0x147ed
+	.4byte	0x14907
 	.uleb128 0x57
 	.8byte	.LBB1717
 	.8byte	.LBE1717-.LBB1717
 	.uleb128 0x58
-	.4byte	0x1481b
+	.4byte	0x14935
+	.uleb128 0x4f
+	.8byte	.LVL656
+	.4byte	0x150f5
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x54
+	.4byte	0x148c1
+	.8byte	.LBB1718
+	.8byte	.LBE1718-.LBB1718
+	.byte	0x1
+	.2byte	0x8e4
+	.4byte	0xf4c8
+	.uleb128 0x55
+	.4byte	0x148e9
+	.uleb128 0x55
+	.4byte	0x148dd
+	.uleb128 0x55
+	.4byte	0x148d2
+	.uleb128 0x5e
+	.4byte	0x148f6
+	.8byte	.LBB1719
+	.8byte	.LBE1719-.LBB1719
+	.byte	0xe
+	.2byte	0x49c
+	.uleb128 0x55
+	.4byte	0x1492a
+	.uleb128 0x55
+	.4byte	0x1491e
+	.uleb128 0x55
+	.4byte	0x14912
+	.uleb128 0x55
+	.4byte	0x14907
+	.uleb128 0x57
+	.8byte	.LBB1720
+	.8byte	.LBE1720-.LBB1720
+	.uleb128 0x58
+	.4byte	0x14935
+	.uleb128 0x4f
+	.8byte	.LVL657
+	.4byte	0x150f5
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x5e
+	.4byte	0x148c1
+	.8byte	.LBB1721
+	.8byte	.LBE1721-.LBB1721
+	.byte	0x1
+	.2byte	0x8e7
+	.uleb128 0x55
+	.4byte	0x148e9
+	.uleb128 0x55
+	.4byte	0x148dd
+	.uleb128 0x55
+	.4byte	0x148d2
+	.uleb128 0x5e
+	.4byte	0x148f6
+	.8byte	.LBB1722
+	.8byte	.LBE1722-.LBB1722
+	.byte	0xe
+	.2byte	0x49c
+	.uleb128 0x55
+	.4byte	0x1492a
+	.uleb128 0x55
+	.4byte	0x1491e
+	.uleb128 0x55
+	.4byte	0x14912
+	.uleb128 0x55
+	.4byte	0x14907
+	.uleb128 0x57
+	.8byte	.LBB1723
+	.8byte	.LBE1723-.LBB1723
+	.uleb128 0x58
+	.4byte	0x14935
 	.uleb128 0x4f
 	.8byte	.LVL658
-	.4byte	0x14fdb
+	.4byte	0x150f5
 	.byte	0
 	.byte	0
 	.byte	0
@@ -40965,10 +41057,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xfea7
-	.8byte	.LBB1724
+	.8byte	.LBB1730
 	.4byte	.Ldebug_ranges0+0xe20
 	.byte	0x1
-	.2byte	0xbb7
+	.2byte	0xbc8
 	.4byte	0xf645
 	.uleb128 0x55
 	.4byte	0xfeb8
@@ -40995,61 +41087,61 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	0xff16
 	.uleb128 0x5c
-	.4byte	0x148bc
-	.8byte	.LBB1726
+	.4byte	0x149d6
+	.8byte	.LBB1732
 	.4byte	.Ldebug_ranges0+0xe90
 	.byte	0x1
-	.2byte	0xaa7
+	.2byte	0xab8
 	.4byte	0xf5b3
 	.uleb128 0x55
-	.4byte	0x148cc
+	.4byte	0x149e6
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14886
-	.8byte	.LBB1730
+	.4byte	0x149a0
+	.8byte	.LBB1736
 	.4byte	.Ldebug_ranges0+0xec0
 	.byte	0x1
-	.2byte	0xac6
+	.2byte	0xad7
 	.4byte	0xf5e8
 	.uleb128 0x55
-	.4byte	0x148af
+	.4byte	0x149c9
 	.uleb128 0x55
-	.4byte	0x148a3
+	.4byte	0x149bd
 	.uleb128 0x55
-	.4byte	0x14897
+	.4byte	0x149b1
 	.uleb128 0x4f
 	.8byte	.LVL664
-	.4byte	0x14fce
+	.4byte	0x150e8
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL660
-	.4byte	0x14fe8
+	.4byte	0x15102
 	.uleb128 0x4f
 	.8byte	.LVL661
-	.4byte	0x14ff5
+	.4byte	0x1510f
 	.uleb128 0x4f
 	.8byte	.LVL662
-	.4byte	0x15001
+	.4byte	0x1511b
 	.uleb128 0x4f
 	.8byte	.LVL663
-	.4byte	0x1500d
+	.4byte	0x15127
 	.uleb128 0x4f
 	.8byte	.LVL665
-	.4byte	0x15019
+	.4byte	0x15133
 	.uleb128 0x4f
 	.8byte	.LVL666
-	.4byte	0x15023
+	.4byte	0x1513d
 	.uleb128 0x4f
 	.8byte	.LVL679
-	.4byte	0x1502f
+	.4byte	0x15149
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xff21
-	.8byte	.LBB1741
+	.8byte	.LBB1747
 	.4byte	.Ldebug_ranges0+0xef0
 	.byte	0x1
-	.2byte	0xbbe
+	.2byte	0xbcf
 	.4byte	0xf71e
 	.uleb128 0x55
 	.4byte	0xff32
@@ -41075,47 +41167,47 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	0xff84
 	.uleb128 0x5c
-	.4byte	0x148bc
-	.8byte	.LBB1743
+	.4byte	0x149d6
+	.8byte	.LBB1749
 	.4byte	.Ldebug_ranges0+0xf40
 	.byte	0x1
-	.2byte	0xa77
+	.2byte	0xa88
 	.4byte	0xf6b4
 	.uleb128 0x55
-	.4byte	0x148cc
+	.4byte	0x149e6
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL668
-	.4byte	0x14fe8
+	.4byte	0x15102
 	.uleb128 0x4f
 	.8byte	.LVL669
-	.4byte	0x14ff5
+	.4byte	0x1510f
 	.uleb128 0x4f
 	.8byte	.LVL683
-	.4byte	0x15001
+	.4byte	0x1511b
 	.uleb128 0x4f
 	.8byte	.LVL684
-	.4byte	0x1503c
+	.4byte	0x15156
 	.uleb128 0x4f
 	.8byte	.LVL770
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL771
-	.4byte	0x15048
+	.4byte	0x15162
 	.uleb128 0x4f
 	.8byte	.LVL772
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL785
-	.4byte	0x1502f
+	.4byte	0x15149
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xfe6f
-	.8byte	.LBB1752
+	.8byte	.LBB1758
 	.4byte	.Ldebug_ranges0+0xf70
 	.byte	0x1
-	.2byte	0xbc5
+	.2byte	0xbd6
 	.4byte	0xf8b8
 	.uleb128 0x55
 	.4byte	0xfe80
@@ -41127,53 +41219,53 @@ __exitcall_ebc_exit:
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5c
-	.4byte	0x14a81
-	.8byte	.LBB1754
+	.4byte	0x14b9b
+	.8byte	.LBB1760
 	.4byte	.Ldebug_ranges0+0xfb0
 	.byte	0x1
-	.2byte	0xad3
+	.2byte	0xae4
 	.4byte	0xf7a5
 	.uleb128 0x55
-	.4byte	0x14a8e
+	.4byte	0x14ba8
 	.uleb128 0x57
-	.8byte	.LBB1756
-	.8byte	.LBE1756-.LBB1756
+	.8byte	.LBB1762
+	.8byte	.LBE1762-.LBB1762
 	.uleb128 0x58
-	.4byte	0x14aba
+	.4byte	0x14bd4
 	.uleb128 0x5d
-	.4byte	0x14c66
-	.8byte	.LBB1757
-	.8byte	.LBE1757-.LBB1757
+	.4byte	0x14d80
+	.8byte	.LBB1763
+	.8byte	.LBE1763-.LBB1763
 	.byte	0x10
 	.byte	0x1c
 	.uleb128 0x55
-	.4byte	0x14c89
+	.4byte	0x14da3
 	.uleb128 0x55
-	.4byte	0x14c7d
+	.4byte	0x14d97
 	.uleb128 0x55
-	.4byte	0x14c73
+	.4byte	0x14d8d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14ba2
-	.8byte	.LBB1761
-	.8byte	.LBE1761-.LBB1761
+	.4byte	0x14cbc
+	.8byte	.LBB1767
+	.8byte	.LBE1767-.LBB1767
 	.byte	0x1
-	.2byte	0xadd
+	.2byte	0xaee
 	.4byte	0xf7f0
 	.uleb128 0x55
-	.4byte	0x14bb8
+	.4byte	0x14cd2
 	.uleb128 0x55
-	.4byte	0x14baf
+	.4byte	0x14cc9
 	.uleb128 0x57
-	.8byte	.LBB1762
-	.8byte	.LBE1762-.LBB1762
+	.8byte	.LBB1768
+	.8byte	.LBE1768-.LBB1768
 	.uleb128 0x61
-	.4byte	0x14bc1
+	.4byte	0x14cdb
 	.4byte	.LLST208
 	.uleb128 0x61
-	.4byte	0x14bcb
+	.4byte	0x14ce5
 	.4byte	.LLST209
 	.byte	0
 	.byte	0
@@ -41185,104 +41277,104 @@ __exitcall_ebc_exit:
 	.4byte	.LLST210
 	.uleb128 0x4f
 	.8byte	.LVL692
-	.4byte	0x15054
+	.4byte	0x1516e
 	.uleb128 0x4f
 	.8byte	.LVL694
-	.4byte	0x15060
+	.4byte	0x1517a
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14ba2
-	.8byte	.LBB1765
-	.8byte	.LBE1765-.LBB1765
+	.4byte	0x14cbc
+	.8byte	.LBB1771
+	.8byte	.LBE1771-.LBB1771
 	.byte	0x1
-	.2byte	0xae6
+	.2byte	0xaf7
 	.4byte	0xf868
 	.uleb128 0x55
-	.4byte	0x14bb8
+	.4byte	0x14cd2
 	.uleb128 0x55
-	.4byte	0x14baf
+	.4byte	0x14cc9
 	.uleb128 0x57
-	.8byte	.LBB1766
-	.8byte	.LBE1766-.LBB1766
+	.8byte	.LBB1772
+	.8byte	.LBE1772-.LBB1772
 	.uleb128 0x61
-	.4byte	0x14bc1
+	.4byte	0x14cdb
 	.4byte	.LLST211
 	.uleb128 0x61
-	.4byte	0x14bcb
+	.4byte	0x14ce5
 	.4byte	.LLST212
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL685
-	.4byte	0x1506d
+	.4byte	0x15187
 	.uleb128 0x4f
 	.8byte	.LVL686
-	.4byte	0x15054
+	.4byte	0x1516e
 	.uleb128 0x4f
 	.8byte	.LVL687
-	.4byte	0x1507a
+	.4byte	0x15194
 	.uleb128 0x4f
 	.8byte	.LVL695
-	.4byte	0x1507a
+	.4byte	0x15194
 	.uleb128 0x4f
 	.8byte	.LVL775
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL779
-	.4byte	0x1502f
+	.4byte	0x15149
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0xfe55
-	.8byte	.LBB1769
-	.8byte	.LBE1769-.LBB1769
+	.8byte	.LBB1775
+	.8byte	.LBE1775-.LBB1775
 	.byte	0x1
-	.2byte	0xbcc
+	.2byte	0xbdd
 	.4byte	0xf952
 	.uleb128 0x55
 	.4byte	0xfe62
 	.uleb128 0x5c
-	.4byte	0x144df
-	.8byte	.LBB1771
+	.4byte	0x145f9
+	.8byte	.LBB1777
 	.4byte	.Ldebug_ranges0+0x1010
 	.byte	0x1
-	.2byte	0xaf6
+	.2byte	0xb07
 	.4byte	0xf91d
 	.uleb128 0x55
-	.4byte	0x14504
+	.4byte	0x1461e
 	.uleb128 0x55
-	.4byte	0x144f8
+	.4byte	0x14612
 	.uleb128 0x55
-	.4byte	0x144ec
+	.4byte	0x14606
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1010
 	.uleb128 0x61
-	.4byte	0x14510
+	.4byte	0x1462a
 	.4byte	.LLST213
 	.uleb128 0x4f
 	.8byte	.LVL702
-	.4byte	0x15087
+	.4byte	0x151a1
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL703
-	.4byte	0x15093
+	.4byte	0x151ad
 	.uleb128 0x4f
 	.8byte	.LVL704
-	.4byte	0x1509f
+	.4byte	0x151b9
 	.uleb128 0x4f
 	.8byte	.LVL705
-	.4byte	0x15093
+	.4byte	0x151ad
 	.uleb128 0x4f
 	.8byte	.LVL706
-	.4byte	0x1509f
+	.4byte	0x151b9
 	.byte	0
 	.uleb128 0x5c
 	.4byte	0xfdb3
-	.8byte	.LBB1781
+	.8byte	.LBB1787
 	.4byte	.Ldebug_ranges0+0x1070
 	.byte	0x1
-	.2byte	0xbcf
+	.2byte	0xbe0
 	.4byte	0xfbf5
 	.uleb128 0x55
 	.4byte	0xfdd0
@@ -41320,460 +41412,460 @@ __exitcall_ebc_exit:
 	.4byte	.LLST221
 	.uleb128 0x54
 	.4byte	0x11882
-	.8byte	.LBB1783
-	.8byte	.LBE1783-.LBB1783
+	.8byte	.LBB1789
+	.8byte	.LBE1789-.LBB1789
 	.byte	0x1
-	.2byte	0xb2e
+	.2byte	0xb3f
 	.4byte	0xfa34
 	.uleb128 0x55
 	.4byte	0x11893
 	.uleb128 0x55
 	.4byte	0x11893
 	.uleb128 0x57
-	.8byte	.LBB1784
-	.8byte	.LBE1784-.LBB1784
+	.8byte	.LBB1790
+	.8byte	.LBE1790-.LBB1790
 	.uleb128 0x61
 	.4byte	0x1189f
 	.4byte	.LLST222
 	.uleb128 0x4f
 	.8byte	.LVL723
-	.4byte	0x150ab
+	.4byte	0x151c5
 	.uleb128 0x4f
 	.8byte	.LVL725
-	.4byte	0x15023
+	.4byte	0x1513d
 	.uleb128 0x4f
 	.8byte	.LVL726
-	.4byte	0x150b7
+	.4byte	0x151d1
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14666
-	.8byte	.LBB1785
-	.8byte	.LBE1785-.LBB1785
+	.4byte	0x14780
+	.8byte	.LBB1791
+	.8byte	.LBE1791-.LBB1791
 	.byte	0x1
-	.2byte	0xb14
+	.2byte	0xb25
 	.4byte	0xfa8b
 	.uleb128 0x55
-	.4byte	0x14683
+	.4byte	0x1479d
 	.uleb128 0x55
-	.4byte	0x14677
+	.4byte	0x14791
 	.uleb128 0x5e
-	.4byte	0x14690
-	.8byte	.LBB1786
-	.8byte	.LBE1786-.LBB1786
+	.4byte	0x147aa
+	.8byte	.LBB1792
+	.8byte	.LBE1792-.LBB1792
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x55
-	.4byte	0x146ad
+	.4byte	0x147c7
 	.uleb128 0x55
-	.4byte	0x146a1
+	.4byte	0x147bb
 	.uleb128 0x4f
 	.8byte	.LVL743
-	.4byte	0x150c3
+	.4byte	0x151dd
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14666
-	.8byte	.LBB1788
-	.8byte	.LBE1788-.LBB1788
+	.4byte	0x14780
+	.8byte	.LBB1794
+	.8byte	.LBE1794-.LBB1794
 	.byte	0x1
-	.2byte	0xb22
+	.2byte	0xb33
 	.4byte	0xfae2
 	.uleb128 0x55
-	.4byte	0x14683
+	.4byte	0x1479d
 	.uleb128 0x55
-	.4byte	0x14677
+	.4byte	0x14791
 	.uleb128 0x5e
-	.4byte	0x14690
-	.8byte	.LBB1789
-	.8byte	.LBE1789-.LBB1789
+	.4byte	0x147aa
+	.8byte	.LBB1795
+	.8byte	.LBE1795-.LBB1795
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x55
-	.4byte	0x146ad
+	.4byte	0x147c7
 	.uleb128 0x55
-	.4byte	0x146a1
+	.4byte	0x147bb
 	.uleb128 0x4f
 	.8byte	.LVL756
-	.4byte	0x150c3
+	.4byte	0x151dd
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL708
-	.4byte	0x150d0
+	.4byte	0x151ea
 	.uleb128 0x4f
 	.8byte	.LVL710
-	.4byte	0x150d0
+	.4byte	0x151ea
 	.uleb128 0x4f
 	.8byte	.LVL712
-	.4byte	0x150dc
+	.4byte	0x151f6
 	.uleb128 0x4f
 	.8byte	.LVL717
-	.4byte	0x150dc
+	.4byte	0x151f6
 	.uleb128 0x4f
 	.8byte	.LVL721
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL722
-	.4byte	0x150e9
+	.4byte	0x15203
 	.uleb128 0x4f
 	.8byte	.LVL727
-	.4byte	0x150f5
+	.4byte	0x1520f
 	.uleb128 0x4f
 	.8byte	.LVL728
-	.4byte	0x150f5
+	.4byte	0x1520f
 	.uleb128 0x4f
 	.8byte	.LVL740
-	.4byte	0x15101
+	.4byte	0x1521b
 	.uleb128 0x4f
 	.8byte	.LVL742
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL747
-	.4byte	0x1510d
+	.4byte	0x15227
 	.uleb128 0x4f
 	.8byte	.LVL750
-	.4byte	0x150ab
+	.4byte	0x151c5
 	.uleb128 0x4f
 	.8byte	.LVL752
-	.4byte	0x1510d
+	.4byte	0x15227
 	.uleb128 0x4f
 	.8byte	.LVL753
-	.4byte	0x150b7
+	.4byte	0x151d1
 	.uleb128 0x4f
 	.8byte	.LVL755
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL759
-	.4byte	0x1510d
+	.4byte	0x15227
 	.uleb128 0x4f
 	.8byte	.LVL762
-	.4byte	0x150ab
+	.4byte	0x151c5
 	.uleb128 0x4f
 	.8byte	.LVL764
-	.4byte	0x1510d
+	.4byte	0x15227
 	.uleb128 0x4f
 	.8byte	.LVL765
-	.4byte	0x150b7
+	.4byte	0x151d1
 	.uleb128 0x4f
 	.8byte	.LVL790
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL793
-	.4byte	0x1502f
+	.4byte	0x15149
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1473a
-	.8byte	.LBB1794
-	.8byte	.LBE1794-.LBB1794
+	.4byte	0x14854
+	.8byte	.LBB1800
+	.8byte	.LBE1800-.LBB1800
 	.byte	0x1
-	.2byte	0xbd1
+	.2byte	0xbe2
 	.4byte	0xfc3e
 	.uleb128 0x55
-	.4byte	0x14753
+	.4byte	0x1486d
 	.uleb128 0x55
-	.4byte	0x14747
+	.4byte	0x14861
 	.uleb128 0x5d
-	.4byte	0x14842
-	.8byte	.LBB1795
-	.8byte	.LBE1795-.LBB1795
+	.4byte	0x1495c
+	.8byte	.LBB1801
+	.8byte	.LBE1801-.LBB1801
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x55
-	.4byte	0x1485b
+	.4byte	0x14975
 	.uleb128 0x55
-	.4byte	0x1484f
+	.4byte	0x14969
 	.byte	0
 	.byte	0
 	.uleb128 0x54
 	.4byte	0xffa7
-	.8byte	.LBB1797
-	.8byte	.LBE1797-.LBB1797
+	.8byte	.LBB1803
+	.8byte	.LBE1803-.LBB1803
 	.byte	0x1
-	.2byte	0xbd4
+	.2byte	0xbe5
 	.4byte	0xfcd5
 	.uleb128 0x55
 	.4byte	0xffb8
 	.uleb128 0x4f
 	.8byte	.LVL729
-	.4byte	0x15117
+	.4byte	0x15231
 	.uleb128 0x4f
 	.8byte	.LVL730
-	.4byte	0x15117
+	.4byte	0x15231
 	.uleb128 0x4f
 	.8byte	.LVL731
-	.4byte	0x15123
+	.4byte	0x1523d
 	.uleb128 0x4f
 	.8byte	.LVL732
-	.4byte	0x15123
+	.4byte	0x1523d
 	.uleb128 0x4f
 	.8byte	.LVL733
-	.4byte	0x15123
+	.4byte	0x1523d
 	.uleb128 0x4f
 	.8byte	.LVL734
-	.4byte	0x15123
+	.4byte	0x1523d
 	.uleb128 0x4f
 	.8byte	.LVL735
-	.4byte	0x15123
+	.4byte	0x1523d
 	.uleb128 0x4f
 	.8byte	.LVL736
-	.4byte	0x15123
+	.4byte	0x1523d
 	.uleb128 0x4f
 	.8byte	.LVL737
-	.4byte	0x15123
+	.4byte	0x1523d
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL615
-	.4byte	0x14fe8
+	.4byte	0x15102
 	.uleb128 0x4f
 	.8byte	.LVL616
-	.4byte	0x15130
+	.4byte	0x1524a
 	.uleb128 0x4f
 	.8byte	.LVL618
-	.4byte	0x1513c
+	.4byte	0x15256
 	.uleb128 0x4f
 	.8byte	.LVL624
-	.4byte	0x15149
+	.4byte	0x15263
 	.uleb128 0x4f
 	.8byte	.LVL627
-	.4byte	0x15156
+	.4byte	0x15270
 	.uleb128 0x4f
 	.8byte	.LVL628
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL636
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL670
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL672
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL675
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL677
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL680
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL738
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL768
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL776
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL781
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL795
-	.4byte	0x15163
+	.4byte	0x1527d
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0xb02
+	.2byte	0xb13
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfe55
 	.uleb128 0x65
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xb02
+	.2byte	0xb13
 	.4byte	0xe557
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xb02
+	.2byte	0xb13
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xb04
+	.2byte	0xb15
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0xb05
+	.2byte	0xb16
 	.4byte	0x6d
 	.uleb128 0x48
 	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0xb06
+	.2byte	0xb17
 	.4byte	0x6d
 	.uleb128 0x48
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0xb07
+	.2byte	0xb18
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0xb08
+	.2byte	0xb19
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0xb09
+	.2byte	0xb1a
 	.4byte	0x21e
 	.uleb128 0x48
 	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0xb0a
+	.2byte	0xb1b
 	.4byte	0x21e
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xb0b
+	.2byte	0xb1c
 	.4byte	0xe4f2
 	.uleb128 0x48
 	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0xb0c
+	.2byte	0xb1d
 	.4byte	0x458
 	.uleb128 0x48
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0xb0d
+	.2byte	0xb1e
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x67
 	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0xaeb
+	.2byte	0xafc
 	.byte	0x1
 	.4byte	0xfe6f
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xaeb
+	.2byte	0xafc
 	.4byte	0xe874
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0xacf
+	.2byte	0xae0
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfea7
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xacf
+	.2byte	0xae0
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF2480
 	.byte	0x1
-	.2byte	0xad1
+	.2byte	0xae2
 	.4byte	0xd88a
 	.uleb128 0x68
 	.uleb128 0x53
 	.string	"__k"
 	.byte	0x1
-	.2byte	0xae0
+	.2byte	0xaf1
 	.4byte	0x2f05
 	.byte	0
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0xa90
+	.2byte	0xaa1
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xff21
 	.uleb128 0x65
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa90
+	.2byte	0xaa1
 	.4byte	0xe557
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xa92
+	.2byte	0xaa3
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xa93
+	.2byte	0xaa4
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xa94
+	.2byte	0xaa5
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0xa95
+	.2byte	0xaa6
 	.4byte	0xb904
 	.uleb128 0x53
 	.string	"r"
 	.byte	0x1
-	.2byte	0xa96
+	.2byte	0xaa7
 	.4byte	0x97bc
 	.uleb128 0x48
 	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0xa97
+	.2byte	0xaa8
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xa98
+	.2byte	0xaa9
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0xa98
+	.2byte	0xaa9
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0xa64
+	.2byte	0xa75
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xff92
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xa64
+	.2byte	0xa75
 	.4byte	0xe874
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xa66
+	.2byte	0xa77
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xa67
+	.2byte	0xa78
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0xa68
+	.2byte	0xa79
 	.4byte	0xb904
 	.uleb128 0x53
 	.string	"r"
 	.byte	0x1
-	.2byte	0xa69
+	.2byte	0xa7a
 	.4byte	0x97bc
 	.uleb128 0x48
 	.4byte	.LASF2982
 	.byte	0x1
-	.2byte	0xa6a
+	.2byte	0xa7b
 	.4byte	0x29
 	.uleb128 0x48
 	.4byte	.LASF2983
 	.byte	0x1
-	.2byte	0xa6b
+	.2byte	0xa7c
 	.4byte	0xc6
 	.uleb128 0x69
 	.4byte	.LASF3050
@@ -41792,520 +41884,520 @@ __exitcall_ebc_exit:
 	.uleb128 0x64
 	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0xa54
+	.2byte	0xa65
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xffc5
 	.uleb128 0x66
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xa54
+	.2byte	0xa65
 	.4byte	0xe874
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0xa4b
+	.2byte	0xa5c
 	.4byte	0x2ee
-	.8byte	.LFB2852
-	.8byte	.LFE2852-.LFB2852
+	.8byte	.LFB2853
+	.8byte	.LFE2853-.LFB2853
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x10025
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa4b
+	.2byte	0xa5c
 	.4byte	0xa5e0
 	.4byte	.LLST80
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa4c
+	.2byte	0xa5d
 	.4byte	0xb45b
 	.4byte	.LLST81
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa4d
+	.2byte	0xa5e
 	.4byte	0x21e
 	.4byte	.LLST82
 	.uleb128 0x4f
 	.8byte	.LVL308
-	.4byte	0x1516d
+	.4byte	0x15287
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0xa42
+	.2byte	0xa53
 	.4byte	0x2ee
-	.8byte	.LFB2851
-	.8byte	.LFE2851-.LFB2851
+	.8byte	.LFB2852
+	.8byte	.LFE2852-.LFB2852
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x10085
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa42
+	.2byte	0xa53
 	.4byte	0xa5e0
 	.4byte	.LLST83
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa43
+	.2byte	0xa54
 	.4byte	0xb45b
 	.4byte	.LLST84
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa44
+	.2byte	0xa55
 	.4byte	0x21e
 	.4byte	.LLST85
 	.uleb128 0x4f
 	.8byte	.LVL313
-	.4byte	0x15179
+	.4byte	0x15293
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0xa39
+	.2byte	0xa4a
 	.4byte	0x2ee
-	.8byte	.LFB2850
-	.8byte	.LFE2850-.LFB2850
+	.8byte	.LFB2851
+	.8byte	.LFE2851-.LFB2851
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x100e5
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa39
+	.2byte	0xa4a
 	.4byte	0xa5e0
 	.4byte	.LLST86
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa3a
+	.2byte	0xa4b
 	.4byte	0xb45b
 	.4byte	.LLST87
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa3b
+	.2byte	0xa4c
 	.4byte	0x21e
 	.4byte	.LLST88
 	.uleb128 0x4f
 	.8byte	.LVL318
-	.4byte	0x15179
+	.4byte	0x15293
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0xa21
+	.2byte	0xa32
 	.4byte	0x2ee
-	.8byte	.LFB2849
-	.8byte	.LFE2849-.LFB2849
+	.8byte	.LFB2850
+	.8byte	.LFE2850-.LFB2850
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x101b5
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa21
+	.2byte	0xa32
 	.4byte	0xa5e0
 	.4byte	.LLST98
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa22
+	.2byte	0xa33
 	.4byte	0xb45b
 	.4byte	.LLST99
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa23
+	.2byte	0xa34
 	.4byte	0x56
 	.4byte	.LLST100
 	.uleb128 0x59
 	.4byte	.LASF383
 	.byte	0x1
-	.2byte	0xa23
+	.2byte	0xa34
 	.4byte	0x2e3
 	.4byte	.LLST101
 	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa25
+	.2byte	0xa36
 	.4byte	0xe557
 	.4byte	.LLST102
 	.uleb128 0x5a
 	.4byte	.LASF2470
 	.byte	0x1
-	.2byte	0xa26
+	.2byte	0xa37
 	.4byte	0xc6
 	.4byte	.LLST103
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xa26
+	.2byte	0xa37
 	.4byte	0xc6
 	.uleb128 0x4f
 	.8byte	.LVL344
-	.4byte	0x15186
+	.4byte	0x152a0
 	.uleb128 0x4f
 	.8byte	.LVL346
-	.4byte	0x15193
+	.4byte	0x152ad
 	.uleb128 0x4f
 	.8byte	.LVL351
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL354
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL355
-	.4byte	0x15163
+	.4byte	0x1527d
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0xa15
+	.2byte	0xa26
 	.4byte	0x2ee
-	.8byte	.LFB2848
-	.8byte	.LFE2848-.LFB2848
+	.8byte	.LFB2849
+	.8byte	.LFE2849-.LFB2849
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x1024f
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa15
+	.2byte	0xa26
 	.4byte	0xa5e0
 	.4byte	.LLST89
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa16
+	.2byte	0xa27
 	.4byte	0xb45b
 	.4byte	.LLST90
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa17
+	.2byte	0xa28
 	.4byte	0x21e
 	.4byte	.LLST91
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa19
+	.2byte	0xa2a
 	.4byte	0xe557
 	.uleb128 0x48
 	.4byte	.LASF2470
 	.byte	0x1
-	.2byte	0xa1a
+	.2byte	0xa2b
 	.4byte	0xc6
 	.uleb128 0x54
-	.4byte	0x143fa
-	.8byte	.LBB1224
-	.8byte	.LBE1224-.LBB1224
+	.4byte	0x14514
+	.8byte	.LBB1230
+	.8byte	.LBE1230-.LBB1230
 	.byte	0x1
-	.2byte	0xa1c
+	.2byte	0xa2d
 	.4byte	0x10241
 	.uleb128 0x55
-	.4byte	0x1440a
+	.4byte	0x14524
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL323
-	.4byte	0x15179
+	.4byte	0x15293
 	.byte	0
 	.uleb128 0x51
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0xa07
+	.2byte	0xa18
 	.4byte	0x2ee
-	.8byte	.LFB2847
-	.8byte	.LFE2847-.LFB2847
+	.8byte	.LFB2848
+	.8byte	.LFE2848-.LFB2848
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x102f8
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0xa07
+	.2byte	0xa18
 	.4byte	0xa5e0
 	.4byte	.LLST92
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0xa08
+	.2byte	0xa19
 	.4byte	0xb45b
 	.4byte	.LLST93
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xa09
+	.2byte	0xa1a
 	.4byte	0x21e
 	.4byte	.LLST94
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa0b
+	.2byte	0xa1c
 	.4byte	0xe557
 	.uleb128 0x6a
 	.string	"t"
 	.byte	0x1
-	.2byte	0xa0c
+	.2byte	0xa1d
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x5c
-	.4byte	0x14417
-	.8byte	.LBB1226
+	.4byte	0x14531
+	.8byte	.LBB1232
 	.4byte	.Ldebug_ranges0+0x6a0
 	.byte	0x1
-	.2byte	0xa0e
+	.2byte	0xa1f
 	.4byte	0x102dd
 	.uleb128 0x55
-	.4byte	0x14433
+	.4byte	0x1454d
 	.uleb128 0x55
-	.4byte	0x14427
+	.4byte	0x14541
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL330
-	.4byte	0x15179
+	.4byte	0x15293
 	.uleb128 0x4f
 	.8byte	.LVL333
-	.4byte	0x15163
+	.4byte	0x1527d
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0x9fc
+	.2byte	0xa0d
 	.4byte	0x2ee
-	.8byte	.LFB2846
-	.8byte	.LFE2846-.LFB2846
+	.8byte	.LFB2847
+	.8byte	.LFE2847-.LFB2847
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x10364
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x9fc
+	.2byte	0xa0d
 	.4byte	0xa5e0
 	.4byte	.LLST95
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x9fd
+	.2byte	0xa0e
 	.4byte	0xb45b
 	.4byte	.LLST96
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x9fe
+	.2byte	0xa0f
 	.4byte	0x21e
 	.4byte	.LLST97
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa00
+	.2byte	0xa11
 	.4byte	0xe557
 	.uleb128 0x4f
 	.8byte	.LVL338
-	.4byte	0x15179
+	.4byte	0x15293
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0x9f1
+	.2byte	0xa02
 	.4byte	0x2ee
-	.8byte	.LFB2845
-	.8byte	.LFE2845-.LFB2845
+	.8byte	.LFB2846
+	.8byte	.LFE2846-.LFB2846
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x103dd
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x9f1
+	.2byte	0xa02
 	.4byte	0xa5e0
 	.4byte	.LLST104
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x9f2
+	.2byte	0xa03
 	.4byte	0xb45b
 	.4byte	.LLST105
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x9f3
+	.2byte	0xa04
 	.4byte	0x21e
 	.4byte	.LLST106
 	.uleb128 0x48
 	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0x9f5
+	.2byte	0xa06
 	.4byte	0x56
 	.uleb128 0x4f
 	.8byte	.LVL357
-	.4byte	0x1519f
+	.4byte	0x152b9
 	.uleb128 0x4f
 	.8byte	.LVL358
-	.4byte	0x15179
+	.4byte	0x15293
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0x9de
+	.2byte	0x9ef
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x10407
 	.uleb128 0x66
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0x9de
+	.2byte	0x9ef
 	.4byte	0x1c7f
 	.uleb128 0x66
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x9de
+	.2byte	0x9ef
 	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0x9ce
+	.2byte	0x9df
 	.4byte	0xc6
-	.8byte	.LFB2843
-	.8byte	.LFE2843-.LFB2843
+	.8byte	.LFB2844
+	.8byte	.LFE2844-.LFB2844
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x1046f
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x9ce
+	.2byte	0x9df
 	.4byte	0x55cc
 	.4byte	.LLST18
 	.uleb128 0x52
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x9ce
+	.2byte	0x9df
 	.4byte	0x3d25
 	.4byte	.LLST19
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x9d0
+	.2byte	0x9e1
 	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF898
 	.byte	0x1
-	.2byte	0x9d1
+	.2byte	0x9e2
 	.4byte	0x29
 	.uleb128 0x4f
 	.8byte	.LVL84
-	.4byte	0x151ab
+	.4byte	0x152c5
 	.byte	0
 	.uleb128 0x6b
 	.4byte	.LASF3085
 	.byte	0x1
-	.2byte	0x9b7
+	.2byte	0x9c8
 	.4byte	0xc6
 	.4byte	0x10498
 	.uleb128 0x66
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0x9b7
+	.2byte	0x9c8
 	.4byte	0x1c7f
 	.uleb128 0x66
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x9b7
+	.2byte	0x9c8
 	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0x9a8
+	.2byte	0x9b9
 	.4byte	0xc6
-	.8byte	.LFB2841
-	.8byte	.LFE2841-.LFB2841
+	.8byte	.LFB2842
+	.8byte	.LFE2842-.LFB2842
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x10501
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x9a8
+	.2byte	0x9b9
 	.4byte	0x55cc
 	.4byte	.LLST16
 	.uleb128 0x52
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x9a8
+	.2byte	0x9b9
 	.4byte	0x3d25
 	.4byte	.LLST17
 	.uleb128 0x48
 	.4byte	.LASF898
 	.byte	0x1
-	.2byte	0x9aa
+	.2byte	0x9bb
 	.4byte	0x29
 	.uleb128 0x4f
 	.8byte	.LVL78
-	.4byte	0x151b8
+	.4byte	0x152d2
 	.uleb128 0x4f
 	.8byte	.LVL79
-	.4byte	0x151ab
+	.4byte	0x152c5
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3087
 	.byte	0x1
-	.2byte	0x8dc
+	.2byte	0x8ed
 	.4byte	0x199
-	.8byte	.LFB2840
-	.8byte	.LFE2840-.LFB2840
+	.8byte	.LFB2841
+	.8byte	.LFE2841-.LFB2841
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x117a9
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x8dc
+	.2byte	0x8ed
 	.4byte	0x55cc
 	.4byte	.LLST20
 	.uleb128 0x52
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0x8dc
+	.2byte	0x8ed
 	.4byte	0x6d
 	.4byte	.LLST21
 	.uleb128 0x52
 	.string	"arg"
 	.byte	0x1
-	.2byte	0x8dc
+	.2byte	0x8ed
 	.4byte	0x29
 	.4byte	.LLST22
 	.uleb128 0x48
 	.4byte	.LASF3088
 	.byte	0x1
-	.2byte	0x8de
+	.2byte	0x8ef
 	.4byte	0x458
 	.uleb128 0x48
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x8df
+	.2byte	0x8f0
 	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x8e0
+	.2byte	0x8f1
 	.4byte	0xe874
 	.uleb128 0x4d
 	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x8e1
+	.2byte	0x8f2
 	.4byte	0xda8e
 	.uleb128 0x2
 	.byte	0x91
@@ -42313,48 +42405,48 @@ __exitcall_ebc_exit:
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x8e2
+	.2byte	0x8f3
 	.4byte	0xe4f2
 	.uleb128 0x48
 	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x8e3
+	.2byte	0x8f4
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x8e4
+	.2byte	0x8f5
 	.4byte	0x29
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x8e5
+	.2byte	0x8f6
 	.4byte	0xc6
 	.uleb128 0x56
 	.4byte	.LASF3050
 	.4byte	0x117b9
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35181
+	.8byte	__func__.35192
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x1a0
 	.4byte	0x1066b
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x931
+	.2byte	0x942
 	.4byte	0xc6
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1a0
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x931
+	.2byte	0x942
 	.8byte	.L195
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x931
+	.2byte	0x942
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -42362,191 +42454,191 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x931
+	.2byte	0x942
 	.4byte	0x199
 	.uleb128 0x6d
-	.8byte	.LBB1016
-	.8byte	.LBE1016-.LBB1016
+	.8byte	.LBB1022
+	.8byte	.LBE1022-.LBB1022
 	.4byte	0x1064f
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x931
+	.2byte	0x942
 	.4byte	0x199
 	.4byte	.LLST37
 	.uleb128 0x4f
 	.8byte	.LVL129
-	.4byte	0x151c4
+	.4byte	0x152de
 	.uleb128 0x4f
 	.8byte	.LVL130
-	.4byte	0x151d0
+	.4byte	0x152ea
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL127
-	.4byte	0x151dd
+	.4byte	0x152f7
 	.uleb128 0x4f
 	.8byte	.LVL131
-	.4byte	0x151e9
+	.4byte	0x15303
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x1451b
-	.8byte	.LBB952
+	.4byte	0x14635
+	.8byte	.LBB958
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x99a
+	.2byte	0x9ab
 	.4byte	0x1088b
 	.uleb128 0x55
-	.4byte	0x14541
+	.4byte	0x1465b
 	.uleb128 0x55
-	.4byte	0x14535
+	.4byte	0x1464f
 	.uleb128 0x55
-	.4byte	0x1452b
+	.4byte	0x14645
 	.uleb128 0x6e
-	.4byte	0x1457b
-	.8byte	.LBB953
+	.4byte	0x14695
+	.8byte	.LBB959
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x145a1
+	.4byte	0x146bb
 	.uleb128 0x55
-	.4byte	0x14595
+	.4byte	0x146af
 	.uleb128 0x55
-	.4byte	0x1458b
+	.4byte	0x146a5
 	.uleb128 0x6f
-	.4byte	0x1461a
-	.8byte	.LBB955
+	.4byte	0x14734
+	.8byte	.LBB961
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x107c1
 	.uleb128 0x55
-	.4byte	0x14636
+	.4byte	0x14750
 	.uleb128 0x70
-	.4byte	0x1462a
+	.4byte	0x14744
 	.4byte	.LLST23
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x80
 	.uleb128 0x61
-	.4byte	0x14642
+	.4byte	0x1475c
 	.4byte	.LLST24
 	.uleb128 0x61
-	.4byte	0x1464d
+	.4byte	0x14767
 	.4byte	.LLST25
 	.uleb128 0x71
-	.4byte	0x14a65
-	.8byte	.LBB957
-	.8byte	.LBE957-.LBB957
+	.4byte	0x14b7f
+	.8byte	.LBB963
+	.8byte	.LBE963-.LBB963
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10727
 	.uleb128 0x57
-	.8byte	.LBB958
-	.8byte	.LBE958-.LBB958
+	.8byte	.LBB964
+	.8byte	.LBE964-.LBB964
 	.uleb128 0x61
-	.4byte	0x14a75
+	.4byte	0x14b8f
 	.4byte	.LLST26
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14a38
-	.8byte	.LBB959
-	.8byte	.LBE959-.LBB959
+	.4byte	0x14b52
+	.8byte	.LBB965
+	.8byte	.LBE965-.LBB965
 	.byte	0x6
 	.byte	0x55
 	.4byte	0x1076f
 	.uleb128 0x55
-	.4byte	0x14a52
+	.4byte	0x14b6c
 	.uleb128 0x55
-	.4byte	0x14a48
+	.4byte	0x14b62
 	.uleb128 0x5d
-	.4byte	0x14b75
-	.8byte	.LBB960
-	.8byte	.LBE960-.LBB960
+	.4byte	0x14c8f
+	.8byte	.LBB966
+	.8byte	.LBE966-.LBB966
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14b8f
+	.4byte	0x14ca9
 	.uleb128 0x55
-	.4byte	0x14b85
+	.4byte	0x14c9f
 	.byte	0
 	.byte	0
 	.uleb128 0x57
-	.8byte	.LBB962
-	.8byte	.LBE962-.LBB962
+	.8byte	.LBB968
+	.8byte	.LBE968-.LBB968
 	.uleb128 0x58
-	.4byte	0x14659
+	.4byte	0x14773
 	.uleb128 0x5d
-	.4byte	0x14aeb
-	.8byte	.LBB963
-	.8byte	.LBE963-.LBB963
+	.4byte	0x14c05
+	.8byte	.LBB969
+	.8byte	.LBE969-.LBB969
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14b07
+	.4byte	0x14c21
 	.uleb128 0x55
-	.4byte	0x14afb
+	.4byte	0x14c15
 	.uleb128 0x57
-	.8byte	.LBB964
-	.8byte	.LBE964-.LBB964
+	.8byte	.LBB970
+	.8byte	.LBE970-.LBB970
 	.uleb128 0x58
-	.4byte	0x14b13
+	.4byte	0x14c2d
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x145e6
-	.8byte	.LBB969
-	.8byte	.LBE969-.LBB969
+	.4byte	0x14700
+	.8byte	.LBB975
+	.8byte	.LBE975-.LBB975
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x1087c
 	.uleb128 0x55
-	.4byte	0x145f6
+	.4byte	0x14710
 	.uleb128 0x57
-	.8byte	.LBB970
-	.8byte	.LBE970-.LBB970
+	.8byte	.LBB976
+	.8byte	.LBE976-.LBB976
 	.uleb128 0x61
-	.4byte	0x14601
+	.4byte	0x1471b
 	.4byte	.LLST27
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0xc0
 	.4byte	0x10847
 	.uleb128 0x61
-	.4byte	0x1460d
+	.4byte	0x14727
 	.4byte	.LLST28
 	.uleb128 0x5d
-	.4byte	0x14aeb
-	.8byte	.LBB972
-	.8byte	.LBE972-.LBB972
+	.4byte	0x14c05
+	.8byte	.LBB978
+	.8byte	.LBE978-.LBB978
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14b07
+	.4byte	0x14c21
 	.uleb128 0x55
-	.4byte	0x14afb
+	.4byte	0x14c15
 	.uleb128 0x57
-	.8byte	.LBB973
-	.8byte	.LBE973-.LBB973
+	.8byte	.LBB979
+	.8byte	.LBE979-.LBB979
 	.uleb128 0x58
-	.4byte	0x14b13
+	.4byte	0x14c2d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14a65
-	.8byte	.LBB974
-	.8byte	.LBE974-.LBB974
+	.4byte	0x14b7f
+	.8byte	.LBB980
+	.8byte	.LBE980-.LBB980
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB975
-	.8byte	.LBE975-.LBB975
+	.8byte	.LBB981
+	.8byte	.LBE981-.LBB981
 	.uleb128 0x61
-	.4byte	0x14a75
+	.4byte	0x14b8f
 	.4byte	.LLST29
 	.byte	0
 	.byte	0
@@ -42554,171 +42646,171 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL157
-	.4byte	0x151f6
+	.4byte	0x15310
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x1454b
-	.8byte	.LBB985
+	.4byte	0x14665
+	.8byte	.LBB991
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
-	.2byte	0x91c
+	.2byte	0x92d
 	.4byte	0x10ab6
 	.uleb128 0x55
-	.4byte	0x14571
+	.4byte	0x1468b
 	.uleb128 0x55
-	.4byte	0x14565
+	.4byte	0x1467f
 	.uleb128 0x55
-	.4byte	0x1455b
+	.4byte	0x14675
 	.uleb128 0x6e
-	.4byte	0x145ab
-	.8byte	.LBB986
+	.4byte	0x146c5
+	.8byte	.LBB992
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x145d1
+	.4byte	0x146eb
 	.uleb128 0x55
-	.4byte	0x145c5
+	.4byte	0x146df
 	.uleb128 0x55
-	.4byte	0x145bb
+	.4byte	0x146d5
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x58
-	.4byte	0x145da
+	.4byte	0x146f4
 	.uleb128 0x6f
-	.4byte	0x1461a
-	.8byte	.LBB988
+	.4byte	0x14734
+	.8byte	.LBB994
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x109eb
 	.uleb128 0x55
-	.4byte	0x14636
+	.4byte	0x14750
 	.uleb128 0x70
-	.4byte	0x1462a
+	.4byte	0x14744
 	.4byte	.LLST30
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x130
 	.uleb128 0x61
-	.4byte	0x14642
+	.4byte	0x1475c
 	.4byte	.LLST31
 	.uleb128 0x61
-	.4byte	0x1464d
+	.4byte	0x14767
 	.4byte	.LLST32
 	.uleb128 0x71
-	.4byte	0x14a65
-	.8byte	.LBB990
-	.8byte	.LBE990-.LBB990
+	.4byte	0x14b7f
+	.8byte	.LBB996
+	.8byte	.LBE996-.LBB996
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10951
 	.uleb128 0x57
-	.8byte	.LBB991
-	.8byte	.LBE991-.LBB991
+	.8byte	.LBB997
+	.8byte	.LBE997-.LBB997
 	.uleb128 0x61
-	.4byte	0x14a75
+	.4byte	0x14b8f
 	.4byte	.LLST33
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB992
-	.8byte	.LBE992-.LBB992
+	.8byte	.LBB998
+	.8byte	.LBE998-.LBB998
 	.4byte	0x109a5
 	.uleb128 0x58
-	.4byte	0x14659
+	.4byte	0x14773
 	.uleb128 0x5d
-	.4byte	0x14aeb
-	.8byte	.LBB993
-	.8byte	.LBE993-.LBB993
+	.4byte	0x14c05
+	.8byte	.LBB999
+	.8byte	.LBE999-.LBB999
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14b07
+	.4byte	0x14c21
 	.uleb128 0x55
-	.4byte	0x14afb
+	.4byte	0x14c15
 	.uleb128 0x57
-	.8byte	.LBB994
-	.8byte	.LBE994-.LBB994
+	.8byte	.LBB1000
+	.8byte	.LBE1000-.LBB1000
 	.uleb128 0x58
-	.4byte	0x14b13
+	.4byte	0x14c2d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14a38
-	.8byte	.LBB995
-	.8byte	.LBE995-.LBB995
+	.4byte	0x14b52
+	.8byte	.LBB1001
+	.8byte	.LBE1001-.LBB1001
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14a52
+	.4byte	0x14b6c
 	.uleb128 0x55
-	.4byte	0x14a48
+	.4byte	0x14b62
 	.uleb128 0x5d
-	.4byte	0x14b75
-	.8byte	.LBB996
-	.8byte	.LBE996-.LBB996
+	.4byte	0x14c8f
+	.8byte	.LBB1002
+	.8byte	.LBE1002-.LBB1002
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14b8f
+	.4byte	0x14ca9
 	.uleb128 0x55
-	.4byte	0x14b85
+	.4byte	0x14c9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x145e6
-	.8byte	.LBB1000
-	.8byte	.LBE1000-.LBB1000
+	.4byte	0x14700
+	.8byte	.LBB1006
+	.8byte	.LBE1006-.LBB1006
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x10aa6
 	.uleb128 0x55
-	.4byte	0x145f6
+	.4byte	0x14710
 	.uleb128 0x57
-	.8byte	.LBB1001
-	.8byte	.LBE1001-.LBB1001
+	.8byte	.LBB1007
+	.8byte	.LBE1007-.LBB1007
 	.uleb128 0x61
-	.4byte	0x14601
+	.4byte	0x1471b
 	.4byte	.LLST34
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x170
 	.4byte	0x10a71
 	.uleb128 0x61
-	.4byte	0x1460d
+	.4byte	0x14727
 	.4byte	.LLST35
 	.uleb128 0x5d
-	.4byte	0x14aeb
-	.8byte	.LBB1003
-	.8byte	.LBE1003-.LBB1003
+	.4byte	0x14c05
+	.8byte	.LBB1009
+	.8byte	.LBE1009-.LBB1009
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14b07
+	.4byte	0x14c21
 	.uleb128 0x55
-	.4byte	0x14afb
+	.4byte	0x14c15
 	.uleb128 0x57
-	.8byte	.LBB1004
-	.8byte	.LBE1004-.LBB1004
+	.8byte	.LBB1010
+	.8byte	.LBE1010-.LBB1010
 	.uleb128 0x58
-	.4byte	0x14b13
+	.4byte	0x14c2d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14a65
-	.8byte	.LBB1005
-	.8byte	.LBE1005-.LBB1005
+	.4byte	0x14b7f
+	.8byte	.LBB1011
+	.8byte	.LBE1011-.LBB1011
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1006
-	.8byte	.LBE1006-.LBB1006
+	.8byte	.LBB1012
+	.8byte	.LBE1012-.LBB1012
 	.uleb128 0x61
-	.4byte	0x14a75
+	.4byte	0x14b8f
 	.4byte	.LLST36
 	.byte	0
 	.byte	0
@@ -42726,172 +42818,172 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL122
-	.4byte	0x15203
+	.4byte	0x1531d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x1454b
-	.8byte	.LBB1020
+	.4byte	0x14665
+	.8byte	.LBB1026
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
-	.2byte	0x938
+	.2byte	0x949
 	.4byte	0x10ce1
 	.uleb128 0x55
-	.4byte	0x14571
+	.4byte	0x1468b
 	.uleb128 0x55
-	.4byte	0x14565
+	.4byte	0x1467f
 	.uleb128 0x55
-	.4byte	0x1455b
+	.4byte	0x14675
 	.uleb128 0x6e
-	.4byte	0x145ab
-	.8byte	.LBB1021
+	.4byte	0x146c5
+	.8byte	.LBB1027
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x145d1
+	.4byte	0x146eb
 	.uleb128 0x55
-	.4byte	0x145c5
+	.4byte	0x146df
 	.uleb128 0x55
-	.4byte	0x145bb
+	.4byte	0x146d5
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1f0
 	.uleb128 0x58
-	.4byte	0x145da
+	.4byte	0x146f4
 	.uleb128 0x6f
-	.4byte	0x1461a
-	.8byte	.LBB1023
+	.4byte	0x14734
+	.8byte	.LBB1029
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x10c16
 	.uleb128 0x55
-	.4byte	0x14636
+	.4byte	0x14750
 	.uleb128 0x70
-	.4byte	0x1462a
+	.4byte	0x14744
 	.4byte	.LLST38
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x230
 	.uleb128 0x61
-	.4byte	0x14642
+	.4byte	0x1475c
 	.4byte	.LLST39
 	.uleb128 0x61
-	.4byte	0x1464d
+	.4byte	0x14767
 	.4byte	.LLST40
 	.uleb128 0x71
-	.4byte	0x14a65
-	.8byte	.LBB1025
-	.8byte	.LBE1025-.LBB1025
+	.4byte	0x14b7f
+	.8byte	.LBB1031
+	.8byte	.LBE1031-.LBB1031
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10b7c
 	.uleb128 0x57
-	.8byte	.LBB1026
-	.8byte	.LBE1026-.LBB1026
+	.8byte	.LBB1032
+	.8byte	.LBE1032-.LBB1032
 	.uleb128 0x61
-	.4byte	0x14a75
+	.4byte	0x14b8f
 	.4byte	.LLST41
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1027
-	.8byte	.LBE1027-.LBB1027
+	.8byte	.LBB1033
+	.8byte	.LBE1033-.LBB1033
 	.4byte	0x10bd0
 	.uleb128 0x58
-	.4byte	0x14659
+	.4byte	0x14773
 	.uleb128 0x5d
-	.4byte	0x14aeb
-	.8byte	.LBB1028
-	.8byte	.LBE1028-.LBB1028
+	.4byte	0x14c05
+	.8byte	.LBB1034
+	.8byte	.LBE1034-.LBB1034
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14b07
+	.4byte	0x14c21
 	.uleb128 0x55
-	.4byte	0x14afb
+	.4byte	0x14c15
 	.uleb128 0x57
-	.8byte	.LBB1029
-	.8byte	.LBE1029-.LBB1029
+	.8byte	.LBB1035
+	.8byte	.LBE1035-.LBB1035
 	.uleb128 0x58
-	.4byte	0x14b13
+	.4byte	0x14c2d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14a38
-	.8byte	.LBB1030
-	.8byte	.LBE1030-.LBB1030
+	.4byte	0x14b52
+	.8byte	.LBB1036
+	.8byte	.LBE1036-.LBB1036
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14a52
+	.4byte	0x14b6c
 	.uleb128 0x55
-	.4byte	0x14a48
+	.4byte	0x14b62
 	.uleb128 0x5d
-	.4byte	0x14b75
-	.8byte	.LBB1031
-	.8byte	.LBE1031-.LBB1031
+	.4byte	0x14c8f
+	.8byte	.LBB1037
+	.8byte	.LBE1037-.LBB1037
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14b8f
+	.4byte	0x14ca9
 	.uleb128 0x55
-	.4byte	0x14b85
+	.4byte	0x14c9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x145e6
-	.8byte	.LBB1035
-	.8byte	.LBE1035-.LBB1035
+	.4byte	0x14700
+	.8byte	.LBB1041
+	.8byte	.LBE1041-.LBB1041
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x10cd1
 	.uleb128 0x55
-	.4byte	0x145f6
+	.4byte	0x14710
 	.uleb128 0x57
-	.8byte	.LBB1036
-	.8byte	.LBE1036-.LBB1036
+	.8byte	.LBB1042
+	.8byte	.LBE1042-.LBB1042
 	.uleb128 0x61
-	.4byte	0x14601
+	.4byte	0x1471b
 	.4byte	.LLST42
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x270
 	.4byte	0x10c9c
 	.uleb128 0x61
-	.4byte	0x1460d
+	.4byte	0x14727
 	.4byte	.LLST43
 	.uleb128 0x5d
-	.4byte	0x14aeb
-	.8byte	.LBB1038
-	.8byte	.LBE1038-.LBB1038
+	.4byte	0x14c05
+	.8byte	.LBB1044
+	.8byte	.LBE1044-.LBB1044
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14b07
+	.4byte	0x14c21
 	.uleb128 0x55
-	.4byte	0x14afb
+	.4byte	0x14c15
 	.uleb128 0x57
-	.8byte	.LBB1039
-	.8byte	.LBE1039-.LBB1039
+	.8byte	.LBB1045
+	.8byte	.LBE1045-.LBB1045
 	.uleb128 0x58
-	.4byte	0x14b13
+	.4byte	0x14c2d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14a65
-	.8byte	.LBB1040
-	.8byte	.LBE1040-.LBB1040
+	.4byte	0x14b7f
+	.8byte	.LBB1046
+	.8byte	.LBE1046-.LBB1046
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1041
-	.8byte	.LBE1041-.LBB1041
+	.8byte	.LBB1047
+	.8byte	.LBE1047-.LBB1047
 	.uleb128 0x61
-	.4byte	0x14a75
+	.4byte	0x14b8f
 	.4byte	.LLST44
 	.byte	0
 	.byte	0
@@ -42899,168 +42991,168 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL146
-	.4byte	0x15203
+	.4byte	0x1531d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x1451b
-	.8byte	.LBB1050
+	.4byte	0x14635
+	.8byte	.LBB1056
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
-	.2byte	0x905
+	.2byte	0x916
 	.4byte	0x10f01
 	.uleb128 0x55
-	.4byte	0x14541
+	.4byte	0x1465b
 	.uleb128 0x55
-	.4byte	0x14535
+	.4byte	0x1464f
 	.uleb128 0x55
-	.4byte	0x1452b
+	.4byte	0x14645
 	.uleb128 0x6e
-	.4byte	0x1457b
-	.8byte	.LBB1051
+	.4byte	0x14695
+	.8byte	.LBB1057
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x145a1
+	.4byte	0x146bb
 	.uleb128 0x55
-	.4byte	0x14595
+	.4byte	0x146af
 	.uleb128 0x55
-	.4byte	0x1458b
+	.4byte	0x146a5
 	.uleb128 0x6f
-	.4byte	0x1461a
-	.8byte	.LBB1053
+	.4byte	0x14734
+	.8byte	.LBB1059
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x10e37
 	.uleb128 0x55
-	.4byte	0x14636
+	.4byte	0x14750
 	.uleb128 0x70
-	.4byte	0x1462a
+	.4byte	0x14744
 	.4byte	.LLST45
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x2f0
 	.uleb128 0x61
-	.4byte	0x14642
+	.4byte	0x1475c
 	.4byte	.LLST46
 	.uleb128 0x61
-	.4byte	0x1464d
+	.4byte	0x14767
 	.4byte	.LLST47
 	.uleb128 0x71
-	.4byte	0x14a65
-	.8byte	.LBB1055
-	.8byte	.LBE1055-.LBB1055
+	.4byte	0x14b7f
+	.8byte	.LBB1061
+	.8byte	.LBE1061-.LBB1061
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10d9d
 	.uleb128 0x57
-	.8byte	.LBB1056
-	.8byte	.LBE1056-.LBB1056
+	.8byte	.LBB1062
+	.8byte	.LBE1062-.LBB1062
 	.uleb128 0x61
-	.4byte	0x14a75
+	.4byte	0x14b8f
 	.4byte	.LLST48
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1057
-	.8byte	.LBE1057-.LBB1057
+	.8byte	.LBB1063
+	.8byte	.LBE1063-.LBB1063
 	.4byte	0x10df1
 	.uleb128 0x58
-	.4byte	0x14659
+	.4byte	0x14773
 	.uleb128 0x5d
-	.4byte	0x14aeb
-	.8byte	.LBB1058
-	.8byte	.LBE1058-.LBB1058
+	.4byte	0x14c05
+	.8byte	.LBB1064
+	.8byte	.LBE1064-.LBB1064
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14b07
+	.4byte	0x14c21
 	.uleb128 0x55
-	.4byte	0x14afb
+	.4byte	0x14c15
 	.uleb128 0x57
-	.8byte	.LBB1059
-	.8byte	.LBE1059-.LBB1059
+	.8byte	.LBB1065
+	.8byte	.LBE1065-.LBB1065
 	.uleb128 0x58
-	.4byte	0x14b13
+	.4byte	0x14c2d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14a38
-	.8byte	.LBB1060
-	.8byte	.LBE1060-.LBB1060
+	.4byte	0x14b52
+	.8byte	.LBB1066
+	.8byte	.LBE1066-.LBB1066
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14a52
+	.4byte	0x14b6c
 	.uleb128 0x55
-	.4byte	0x14a48
+	.4byte	0x14b62
 	.uleb128 0x5d
-	.4byte	0x14b75
-	.8byte	.LBB1061
-	.8byte	.LBE1061-.LBB1061
+	.4byte	0x14c8f
+	.8byte	.LBB1067
+	.8byte	.LBE1067-.LBB1067
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14b8f
+	.4byte	0x14ca9
 	.uleb128 0x55
-	.4byte	0x14b85
+	.4byte	0x14c9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x145e6
-	.8byte	.LBB1067
-	.8byte	.LBE1067-.LBB1067
+	.4byte	0x14700
+	.8byte	.LBB1073
+	.8byte	.LBE1073-.LBB1073
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x10ef2
 	.uleb128 0x55
-	.4byte	0x145f6
+	.4byte	0x14710
 	.uleb128 0x57
-	.8byte	.LBB1068
-	.8byte	.LBE1068-.LBB1068
+	.8byte	.LBB1074
+	.8byte	.LBE1074-.LBB1074
 	.uleb128 0x61
-	.4byte	0x14601
+	.4byte	0x1471b
 	.4byte	.LLST49
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x340
 	.4byte	0x10ebd
 	.uleb128 0x61
-	.4byte	0x1460d
+	.4byte	0x14727
 	.4byte	.LLST50
 	.uleb128 0x5d
-	.4byte	0x14aeb
-	.8byte	.LBB1070
-	.8byte	.LBE1070-.LBB1070
+	.4byte	0x14c05
+	.8byte	.LBB1076
+	.8byte	.LBE1076-.LBB1076
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14b07
+	.4byte	0x14c21
 	.uleb128 0x55
-	.4byte	0x14afb
+	.4byte	0x14c15
 	.uleb128 0x57
-	.8byte	.LBB1071
-	.8byte	.LBE1071-.LBB1071
+	.8byte	.LBB1077
+	.8byte	.LBE1077-.LBB1077
 	.uleb128 0x58
-	.4byte	0x14b13
+	.4byte	0x14c2d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14a65
-	.8byte	.LBB1072
-	.8byte	.LBE1072-.LBB1072
+	.4byte	0x14b7f
+	.8byte	.LBB1078
+	.8byte	.LBE1078-.LBB1078
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1073
-	.8byte	.LBE1073-.LBB1073
+	.8byte	.LBB1079
+	.8byte	.LBE1079-.LBB1079
 	.uleb128 0x61
-	.4byte	0x14a75
+	.4byte	0x14b8f
 	.4byte	.LLST51
 	.byte	0
 	.byte	0
@@ -43068,172 +43160,172 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL173
-	.4byte	0x151f6
+	.4byte	0x15310
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x1454b
-	.8byte	.LBB1084
+	.4byte	0x14665
+	.8byte	.LBB1090
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
-	.2byte	0x955
+	.2byte	0x966
 	.4byte	0x1113d
 	.uleb128 0x55
-	.4byte	0x14571
+	.4byte	0x1468b
 	.uleb128 0x55
-	.4byte	0x14565
+	.4byte	0x1467f
 	.uleb128 0x55
-	.4byte	0x1455b
+	.4byte	0x14675
 	.uleb128 0x6e
-	.4byte	0x145ab
-	.8byte	.LBB1085
+	.4byte	0x146c5
+	.8byte	.LBB1091
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x145d1
+	.4byte	0x146eb
 	.uleb128 0x55
-	.4byte	0x145c5
+	.4byte	0x146df
 	.uleb128 0x55
-	.4byte	0x145bb
+	.4byte	0x146d5
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x370
 	.uleb128 0x61
-	.4byte	0x145da
+	.4byte	0x146f4
 	.4byte	.LLST52
 	.uleb128 0x6f
-	.4byte	0x1461a
-	.8byte	.LBB1087
+	.4byte	0x14734
+	.8byte	.LBB1093
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x11065
 	.uleb128 0x55
-	.4byte	0x14636
+	.4byte	0x14750
 	.uleb128 0x70
-	.4byte	0x1462a
+	.4byte	0x14744
 	.4byte	.LLST53
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x61
-	.4byte	0x14642
+	.4byte	0x1475c
 	.4byte	.LLST54
 	.uleb128 0x61
-	.4byte	0x1464d
+	.4byte	0x14767
 	.4byte	.LLST55
 	.uleb128 0x71
-	.4byte	0x14a65
-	.8byte	.LBB1089
-	.8byte	.LBE1089-.LBB1089
+	.4byte	0x14b7f
+	.8byte	.LBB1095
+	.8byte	.LBE1095-.LBB1095
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10fcb
 	.uleb128 0x57
-	.8byte	.LBB1090
-	.8byte	.LBE1090-.LBB1090
+	.8byte	.LBB1096
+	.8byte	.LBE1096-.LBB1096
 	.uleb128 0x61
-	.4byte	0x14a75
+	.4byte	0x14b8f
 	.4byte	.LLST56
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1091
-	.8byte	.LBE1091-.LBB1091
+	.8byte	.LBB1097
+	.8byte	.LBE1097-.LBB1097
 	.4byte	0x1101f
 	.uleb128 0x58
-	.4byte	0x14659
+	.4byte	0x14773
 	.uleb128 0x5d
-	.4byte	0x14aeb
-	.8byte	.LBB1092
-	.8byte	.LBE1092-.LBB1092
+	.4byte	0x14c05
+	.8byte	.LBB1098
+	.8byte	.LBE1098-.LBB1098
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14b07
+	.4byte	0x14c21
 	.uleb128 0x55
-	.4byte	0x14afb
+	.4byte	0x14c15
 	.uleb128 0x57
-	.8byte	.LBB1093
-	.8byte	.LBE1093-.LBB1093
+	.8byte	.LBB1099
+	.8byte	.LBE1099-.LBB1099
 	.uleb128 0x58
-	.4byte	0x14b13
+	.4byte	0x14c2d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14a38
-	.8byte	.LBB1094
-	.8byte	.LBE1094-.LBB1094
+	.4byte	0x14b52
+	.8byte	.LBB1100
+	.8byte	.LBE1100-.LBB1100
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14a52
+	.4byte	0x14b6c
 	.uleb128 0x55
-	.4byte	0x14a48
+	.4byte	0x14b62
 	.uleb128 0x5d
-	.4byte	0x14b75
-	.8byte	.LBB1095
-	.8byte	.LBE1095-.LBB1095
+	.4byte	0x14c8f
+	.8byte	.LBB1101
+	.8byte	.LBE1101-.LBB1101
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14b8f
+	.4byte	0x14ca9
 	.uleb128 0x55
-	.4byte	0x14b85
+	.4byte	0x14c9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x145e6
-	.8byte	.LBB1101
-	.8byte	.LBE1101-.LBB1101
+	.4byte	0x14700
+	.8byte	.LBB1107
+	.8byte	.LBE1107-.LBB1107
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x11120
 	.uleb128 0x55
-	.4byte	0x145f6
+	.4byte	0x14710
 	.uleb128 0x57
-	.8byte	.LBB1102
-	.8byte	.LBE1102-.LBB1102
+	.8byte	.LBB1108
+	.8byte	.LBE1108-.LBB1108
 	.uleb128 0x61
-	.4byte	0x14601
+	.4byte	0x1471b
 	.4byte	.LLST57
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x420
 	.4byte	0x110eb
 	.uleb128 0x61
-	.4byte	0x1460d
+	.4byte	0x14727
 	.4byte	.LLST58
 	.uleb128 0x5d
-	.4byte	0x14aeb
-	.8byte	.LBB1104
-	.8byte	.LBE1104-.LBB1104
+	.4byte	0x14c05
+	.8byte	.LBB1110
+	.8byte	.LBE1110-.LBB1110
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14b07
+	.4byte	0x14c21
 	.uleb128 0x55
-	.4byte	0x14afb
+	.4byte	0x14c15
 	.uleb128 0x57
-	.8byte	.LBB1105
-	.8byte	.LBE1105-.LBB1105
+	.8byte	.LBB1111
+	.8byte	.LBE1111-.LBB1111
 	.uleb128 0x58
-	.4byte	0x14b13
+	.4byte	0x14c2d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14a65
-	.8byte	.LBB1106
-	.8byte	.LBE1106-.LBB1106
+	.4byte	0x14b7f
+	.8byte	.LBB1112
+	.8byte	.LBE1112-.LBB1112
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1107
-	.8byte	.LBE1107-.LBB1107
+	.8byte	.LBB1113
+	.8byte	.LBE1113-.LBB1113
 	.uleb128 0x61
-	.4byte	0x14a75
+	.4byte	0x14b8f
 	.4byte	.LLST59
 	.byte	0
 	.byte	0
@@ -43241,68 +43333,68 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL185
-	.4byte	0x15203
+	.4byte	0x1531d
 	.uleb128 0x4f
 	.8byte	.LVL263
-	.4byte	0x15019
+	.4byte	0x15133
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x1451b
-	.8byte	.LBB1120
+	.4byte	0x14635
+	.8byte	.LBB1126
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
-	.2byte	0x973
+	.2byte	0x984
 	.4byte	0x111ef
 	.uleb128 0x55
-	.4byte	0x14541
+	.4byte	0x1465b
 	.uleb128 0x55
-	.4byte	0x14535
+	.4byte	0x1464f
 	.uleb128 0x55
-	.4byte	0x1452b
+	.4byte	0x14645
 	.uleb128 0x6e
-	.4byte	0x1457b
-	.8byte	.LBB1121
+	.4byte	0x14695
+	.8byte	.LBB1127
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x145a1
+	.4byte	0x146bb
 	.uleb128 0x55
-	.4byte	0x14595
+	.4byte	0x146af
 	.uleb128 0x55
-	.4byte	0x1458b
+	.4byte	0x146a5
 	.uleb128 0x6e
-	.4byte	0x1461a
-	.8byte	.LBB1123
+	.4byte	0x14734
+	.8byte	.LBB1129
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x55
-	.4byte	0x14636
+	.4byte	0x14750
 	.uleb128 0x72
-	.4byte	0x1462a
+	.4byte	0x14744
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x4b0
 	.uleb128 0x58
-	.4byte	0x14642
+	.4byte	0x1475c
 	.uleb128 0x61
-	.4byte	0x1464d
+	.4byte	0x14767
 	.4byte	.LLST60
 	.uleb128 0x5d
-	.4byte	0x14a65
-	.8byte	.LBB1125
-	.8byte	.LBE1125-.LBB1125
+	.4byte	0x14b7f
+	.8byte	.LBB1131
+	.8byte	.LBE1131-.LBB1131
 	.byte	0x6
 	.byte	0x4d
 	.uleb128 0x57
-	.8byte	.LBB1126
-	.8byte	.LBE1126-.LBB1126
+	.8byte	.LBB1132
+	.8byte	.LBE1132-.LBB1132
 	.uleb128 0x61
-	.4byte	0x14a75
+	.4byte	0x14b8f
 	.4byte	.LLST61
 	.byte	0
 	.byte	0
@@ -43311,163 +43403,163 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x1451b
-	.8byte	.LBB1132
+	.4byte	0x14635
+	.8byte	.LBB1138
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
-	.2byte	0x963
+	.2byte	0x974
 	.4byte	0x1140f
 	.uleb128 0x55
-	.4byte	0x14541
+	.4byte	0x1465b
 	.uleb128 0x55
-	.4byte	0x14535
+	.4byte	0x1464f
 	.uleb128 0x55
-	.4byte	0x1452b
+	.4byte	0x14645
 	.uleb128 0x6e
-	.4byte	0x1457b
-	.8byte	.LBB1133
+	.4byte	0x14695
+	.8byte	.LBB1139
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x145a1
+	.4byte	0x146bb
 	.uleb128 0x55
-	.4byte	0x14595
+	.4byte	0x146af
 	.uleb128 0x55
-	.4byte	0x1458b
+	.4byte	0x146a5
 	.uleb128 0x6f
-	.4byte	0x1461a
-	.8byte	.LBB1135
+	.4byte	0x14734
+	.8byte	.LBB1141
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x11345
 	.uleb128 0x55
-	.4byte	0x14636
+	.4byte	0x14750
 	.uleb128 0x70
-	.4byte	0x1462a
+	.4byte	0x14744
 	.4byte	.LLST62
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x540
 	.uleb128 0x61
-	.4byte	0x14642
+	.4byte	0x1475c
 	.4byte	.LLST63
 	.uleb128 0x61
-	.4byte	0x1464d
+	.4byte	0x14767
 	.4byte	.LLST64
 	.uleb128 0x71
-	.4byte	0x14a65
-	.8byte	.LBB1137
-	.8byte	.LBE1137-.LBB1137
+	.4byte	0x14b7f
+	.8byte	.LBB1143
+	.8byte	.LBE1143-.LBB1143
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x112ab
 	.uleb128 0x57
-	.8byte	.LBB1138
-	.8byte	.LBE1138-.LBB1138
+	.8byte	.LBB1144
+	.8byte	.LBE1144-.LBB1144
 	.uleb128 0x61
-	.4byte	0x14a75
+	.4byte	0x14b8f
 	.4byte	.LLST65
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1139
-	.8byte	.LBE1139-.LBB1139
+	.8byte	.LBB1145
+	.8byte	.LBE1145-.LBB1145
 	.4byte	0x112ff
 	.uleb128 0x58
-	.4byte	0x14659
+	.4byte	0x14773
 	.uleb128 0x5d
-	.4byte	0x14aeb
-	.8byte	.LBB1140
-	.8byte	.LBE1140-.LBB1140
+	.4byte	0x14c05
+	.8byte	.LBB1146
+	.8byte	.LBE1146-.LBB1146
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14b07
+	.4byte	0x14c21
 	.uleb128 0x55
-	.4byte	0x14afb
+	.4byte	0x14c15
 	.uleb128 0x57
-	.8byte	.LBB1141
-	.8byte	.LBE1141-.LBB1141
+	.8byte	.LBB1147
+	.8byte	.LBE1147-.LBB1147
 	.uleb128 0x58
-	.4byte	0x14b13
+	.4byte	0x14c2d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14a38
-	.8byte	.LBB1142
-	.8byte	.LBE1142-.LBB1142
+	.4byte	0x14b52
+	.8byte	.LBB1148
+	.8byte	.LBE1148-.LBB1148
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14a52
+	.4byte	0x14b6c
 	.uleb128 0x55
-	.4byte	0x14a48
+	.4byte	0x14b62
 	.uleb128 0x5d
-	.4byte	0x14b75
-	.8byte	.LBB1143
-	.8byte	.LBE1143-.LBB1143
+	.4byte	0x14c8f
+	.8byte	.LBB1149
+	.8byte	.LBE1149-.LBB1149
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14b8f
+	.4byte	0x14ca9
 	.uleb128 0x55
-	.4byte	0x14b85
+	.4byte	0x14c9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x145e6
-	.8byte	.LBB1151
-	.8byte	.LBE1151-.LBB1151
+	.4byte	0x14700
+	.8byte	.LBB1157
+	.8byte	.LBE1157-.LBB1157
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x11400
 	.uleb128 0x55
-	.4byte	0x145f6
+	.4byte	0x14710
 	.uleb128 0x57
-	.8byte	.LBB1152
-	.8byte	.LBE1152-.LBB1152
+	.8byte	.LBB1158
+	.8byte	.LBE1158-.LBB1158
 	.uleb128 0x61
-	.4byte	0x14601
+	.4byte	0x1471b
 	.4byte	.LLST66
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x590
 	.4byte	0x113cb
 	.uleb128 0x61
-	.4byte	0x1460d
+	.4byte	0x14727
 	.4byte	.LLST67
 	.uleb128 0x5d
-	.4byte	0x14aeb
-	.8byte	.LBB1154
-	.8byte	.LBE1154-.LBB1154
+	.4byte	0x14c05
+	.8byte	.LBB1160
+	.8byte	.LBE1160-.LBB1160
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14b07
+	.4byte	0x14c21
 	.uleb128 0x55
-	.4byte	0x14afb
+	.4byte	0x14c15
 	.uleb128 0x57
-	.8byte	.LBB1155
-	.8byte	.LBE1155-.LBB1155
+	.8byte	.LBB1161
+	.8byte	.LBE1161-.LBB1161
 	.uleb128 0x58
-	.4byte	0x14b13
+	.4byte	0x14c2d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14a65
-	.8byte	.LBB1156
-	.8byte	.LBE1156-.LBB1156
+	.4byte	0x14b7f
+	.8byte	.LBB1162
+	.8byte	.LBE1162-.LBB1162
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1157
-	.8byte	.LBE1157-.LBB1157
+	.8byte	.LBB1163
+	.8byte	.LBE1163-.LBB1163
 	.uleb128 0x61
-	.4byte	0x14a75
+	.4byte	0x14b8f
 	.4byte	.LLST68
 	.byte	0
 	.byte	0
@@ -43475,167 +43567,167 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL246
-	.4byte	0x151f6
+	.4byte	0x15310
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x1451b
-	.8byte	.LBB1168
+	.4byte	0x14635
+	.8byte	.LBB1174
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
-	.2byte	0x914
+	.2byte	0x925
 	.4byte	0x1162f
 	.uleb128 0x55
-	.4byte	0x14541
+	.4byte	0x1465b
 	.uleb128 0x55
-	.4byte	0x14535
+	.4byte	0x1464f
 	.uleb128 0x55
-	.4byte	0x1452b
+	.4byte	0x14645
 	.uleb128 0x6e
-	.4byte	0x1457b
-	.8byte	.LBB1169
+	.4byte	0x14695
+	.8byte	.LBB1175
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x145a1
+	.4byte	0x146bb
 	.uleb128 0x55
-	.4byte	0x14595
+	.4byte	0x146af
 	.uleb128 0x55
-	.4byte	0x1458b
+	.4byte	0x146a5
 	.uleb128 0x6f
-	.4byte	0x1461a
-	.8byte	.LBB1171
+	.4byte	0x14734
+	.8byte	.LBB1177
 	.4byte	.Ldebug_ranges0+0x620
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x11565
 	.uleb128 0x55
-	.4byte	0x14636
+	.4byte	0x14750
 	.uleb128 0x70
-	.4byte	0x1462a
+	.4byte	0x14744
 	.4byte	.LLST69
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x620
 	.uleb128 0x61
-	.4byte	0x14642
+	.4byte	0x1475c
 	.4byte	.LLST70
 	.uleb128 0x61
-	.4byte	0x1464d
+	.4byte	0x14767
 	.4byte	.LLST71
 	.uleb128 0x71
-	.4byte	0x14a65
-	.8byte	.LBB1173
-	.8byte	.LBE1173-.LBB1173
+	.4byte	0x14b7f
+	.8byte	.LBB1179
+	.8byte	.LBE1179-.LBB1179
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x114cb
 	.uleb128 0x57
-	.8byte	.LBB1174
-	.8byte	.LBE1174-.LBB1174
+	.8byte	.LBB1180
+	.8byte	.LBE1180-.LBB1180
 	.uleb128 0x61
-	.4byte	0x14a75
+	.4byte	0x14b8f
 	.4byte	.LLST72
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1175
-	.8byte	.LBE1175-.LBB1175
+	.8byte	.LBB1181
+	.8byte	.LBE1181-.LBB1181
 	.4byte	0x1151f
 	.uleb128 0x58
-	.4byte	0x14659
+	.4byte	0x14773
 	.uleb128 0x5d
-	.4byte	0x14aeb
-	.8byte	.LBB1176
-	.8byte	.LBE1176-.LBB1176
+	.4byte	0x14c05
+	.8byte	.LBB1182
+	.8byte	.LBE1182-.LBB1182
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x14b07
+	.4byte	0x14c21
 	.uleb128 0x55
-	.4byte	0x14afb
+	.4byte	0x14c15
 	.uleb128 0x57
-	.8byte	.LBB1177
-	.8byte	.LBE1177-.LBB1177
+	.8byte	.LBB1183
+	.8byte	.LBE1183-.LBB1183
 	.uleb128 0x58
-	.4byte	0x14b13
+	.4byte	0x14c2d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14a38
-	.8byte	.LBB1178
-	.8byte	.LBE1178-.LBB1178
+	.4byte	0x14b52
+	.8byte	.LBB1184
+	.8byte	.LBE1184-.LBB1184
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x14a52
+	.4byte	0x14b6c
 	.uleb128 0x55
-	.4byte	0x14a48
+	.4byte	0x14b62
 	.uleb128 0x5d
-	.4byte	0x14b75
-	.8byte	.LBB1179
-	.8byte	.LBE1179-.LBB1179
+	.4byte	0x14c8f
+	.8byte	.LBB1185
+	.8byte	.LBE1185-.LBB1185
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x14b8f
+	.4byte	0x14ca9
 	.uleb128 0x55
-	.4byte	0x14b85
+	.4byte	0x14c9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x145e6
-	.8byte	.LBB1187
-	.8byte	.LBE1187-.LBB1187
+	.4byte	0x14700
+	.8byte	.LBB1193
+	.8byte	.LBE1193-.LBB1193
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x11620
 	.uleb128 0x55
-	.4byte	0x145f6
+	.4byte	0x14710
 	.uleb128 0x57
-	.8byte	.LBB1188
-	.8byte	.LBE1188-.LBB1188
+	.8byte	.LBB1194
+	.8byte	.LBE1194-.LBB1194
 	.uleb128 0x61
-	.4byte	0x14601
+	.4byte	0x1471b
 	.4byte	.LLST73
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x670
 	.4byte	0x115eb
 	.uleb128 0x61
-	.4byte	0x1460d
+	.4byte	0x14727
 	.4byte	.LLST74
 	.uleb128 0x5d
-	.4byte	0x14aeb
-	.8byte	.LBB1190
-	.8byte	.LBE1190-.LBB1190
+	.4byte	0x14c05
+	.8byte	.LBB1196
+	.8byte	.LBE1196-.LBB1196
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x14b07
+	.4byte	0x14c21
 	.uleb128 0x55
-	.4byte	0x14afb
+	.4byte	0x14c15
 	.uleb128 0x57
-	.8byte	.LBB1191
-	.8byte	.LBE1191-.LBB1191
+	.8byte	.LBB1197
+	.8byte	.LBE1197-.LBB1197
 	.uleb128 0x58
-	.4byte	0x14b13
+	.4byte	0x14c2d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x14a65
-	.8byte	.LBB1192
-	.8byte	.LBE1192-.LBB1192
+	.4byte	0x14b7f
+	.8byte	.LBB1198
+	.8byte	.LBE1198-.LBB1198
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1193
-	.8byte	.LBE1193-.LBB1193
+	.8byte	.LBB1199
+	.8byte	.LBE1199-.LBB1199
 	.uleb128 0x61
-	.4byte	0x14a75
+	.4byte	0x14b8f
 	.4byte	.LLST75
 	.byte	0
 	.byte	0
@@ -43643,96 +43735,96 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL254
-	.4byte	0x151f6
+	.4byte	0x15310
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL87
-	.4byte	0x150ab
+	.4byte	0x151c5
 	.uleb128 0x4f
 	.8byte	.LVL88
-	.4byte	0x1510d
+	.4byte	0x15227
 	.uleb128 0x4f
 	.8byte	.LVL89
-	.4byte	0x151b8
+	.4byte	0x152d2
 	.uleb128 0x4f
 	.8byte	.LVL100
-	.4byte	0x15210
+	.4byte	0x1532a
 	.uleb128 0x4f
 	.8byte	.LVL103
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL106
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL123
-	.4byte	0x151b8
+	.4byte	0x152d2
 	.uleb128 0x4f
 	.8byte	.LVL124
-	.4byte	0x1521c
+	.4byte	0x15336
 	.uleb128 0x4f
 	.8byte	.LVL126
-	.4byte	0x150b7
+	.4byte	0x151d1
 	.uleb128 0x4f
 	.8byte	.LVL133
-	.4byte	0x150ab
+	.4byte	0x151c5
 	.uleb128 0x4f
 	.8byte	.LVL147
-	.4byte	0x15228
+	.4byte	0x15342
 	.uleb128 0x4f
 	.8byte	.LVL148
-	.4byte	0x150b7
+	.4byte	0x151d1
 	.uleb128 0x4f
 	.8byte	.LVL149
-	.4byte	0x15101
+	.4byte	0x1521b
 	.uleb128 0x4f
 	.8byte	.LVL159
-	.4byte	0x15234
+	.4byte	0x1534e
 	.uleb128 0x4f
 	.8byte	.LVL160
-	.4byte	0x151b8
+	.4byte	0x152d2
 	.uleb128 0x4f
 	.8byte	.LVL187
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL190
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL192
-	.4byte	0x150ab
+	.4byte	0x151c5
 	.uleb128 0x4f
 	.8byte	.LVL194
-	.4byte	0x150ab
+	.4byte	0x151c5
 	.uleb128 0x4f
 	.8byte	.LVL195
-	.4byte	0x1510d
+	.4byte	0x15227
 	.uleb128 0x4f
 	.8byte	.LVL196
-	.4byte	0x151b8
+	.4byte	0x152d2
 	.uleb128 0x4f
 	.8byte	.LVL209
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL212
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL214
-	.4byte	0x150ab
+	.4byte	0x151c5
 	.uleb128 0x4f
 	.8byte	.LVL215
-	.4byte	0x151b8
+	.4byte	0x152d2
 	.uleb128 0x4f
 	.8byte	.LVL223
-	.4byte	0x15210
+	.4byte	0x1532a
 	.uleb128 0x4f
 	.8byte	.LVL257
-	.4byte	0x15101
+	.4byte	0x1521b
 	.uleb128 0x4f
 	.8byte	.LVL264
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL265
-	.4byte	0x15163
+	.4byte	0x1527d
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
@@ -43746,140 +43838,140 @@ __exitcall_ebc_exit:
 	.uleb128 0x64
 	.4byte	.LASF3095
 	.byte	0x1
-	.2byte	0x899
+	.2byte	0x8aa
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x117e8
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x899
+	.2byte	0x8aa
 	.4byte	0xe1f4
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x89b
+	.2byte	0x8ac
 	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x893
-	.8byte	.LFB2838
-	.8byte	.LFE2838-.LFB2838
+	.2byte	0x8a4
+	.8byte	.LFB2839
+	.8byte	.LFE2839-.LFB2839
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x11822
 	.uleb128 0x52
 	.string	"t"
 	.byte	0x1
-	.2byte	0x893
+	.2byte	0x8a4
 	.4byte	0x31d2
 	.4byte	.LLST76
 	.uleb128 0x4f
 	.8byte	.LVL278
-	.4byte	0x122f8
+	.4byte	0x12412
 	.byte	0
 	.uleb128 0x4e
 	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x887
-	.8byte	.LFB2837
-	.8byte	.LFE2837-.LFB2837
+	.2byte	0x898
+	.8byte	.LFB2838
+	.8byte	.LFE2838-.LFB2838
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x11882
 	.uleb128 0x52
 	.string	"t"
 	.byte	0x1
-	.2byte	0x887
+	.2byte	0x898
 	.4byte	0x31d2
 	.4byte	.LLST14
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x889
+	.2byte	0x89a
 	.4byte	0xe874
 	.uleb128 0x60
-	.4byte	0x144a5
-	.8byte	.LBB948
+	.4byte	0x145bf
+	.8byte	.LBB954
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.2byte	0x88d
+	.2byte	0x89e
 	.uleb128 0x55
-	.4byte	0x144b2
+	.4byte	0x145cc
 	.uleb128 0x4f
 	.8byte	.LVL73
-	.4byte	0x15240
+	.4byte	0x1535a
 	.byte	0
 	.byte	0
 	.uleb128 0x64
 	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x876
+	.2byte	0x887
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x118ac
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x876
+	.2byte	0x887
 	.4byte	0xe1f4
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x878
+	.2byte	0x889
 	.4byte	0xe4f2
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x725
+	.2byte	0x734
 	.4byte	0xc6
-	.8byte	.LFB2835
-	.8byte	.LFE2835-.LFB2835
+	.8byte	.LFB2836
+	.8byte	.LFE2836-.LFB2836
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x120a0
+	.4byte	0x12166
 	.uleb128 0x52
 	.string	"ptr"
 	.byte	0x1
-	.2byte	0x725
+	.2byte	0x734
 	.4byte	0x458
 	.4byte	.LLST237
 	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x727
+	.2byte	0x736
 	.4byte	0xe557
 	.4byte	.LLST238
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x728
+	.2byte	0x737
 	.4byte	0xe874
 	.uleb128 0x5b
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x729
+	.2byte	0x738
 	.4byte	0xe4f2
 	.4byte	.LLST239
 	.uleb128 0x5a
 	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x72a
+	.2byte	0x739
 	.4byte	0xc6
 	.4byte	.LLST240
 	.uleb128 0x5a
 	.4byte	.LASF2989
 	.byte	0x1
-	.2byte	0x72b
+	.2byte	0x73a
 	.4byte	0xc6
 	.4byte	.LLST241
 	.uleb128 0x4d
 	.4byte	.LASF3102
 	.byte	0x1
-	.2byte	0x72c
+	.2byte	0x73b
 	.4byte	0xd95c
 	.uleb128 0x3
 	.byte	0x91
@@ -43887,34 +43979,34 @@ __exitcall_ebc_exit:
 	.uleb128 0x5a
 	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x72d
+	.2byte	0x73c
 	.4byte	0xe4f2
 	.4byte	.LLST242
 	.uleb128 0x6c
 	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x844
-	.8byte	.L890
+	.2byte	0x855
+	.8byte	.L897
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1240
+	.4byte	.Ldebug_ranges0+0x1270
 	.4byte	0x119fc
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x786
+	.2byte	0x791
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB1871
-	.8byte	.LBE1871-.LBB1871
+	.8byte	.LBB1885
+	.8byte	.LBE1885-.LBB1885
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x786
-	.8byte	.L874
+	.2byte	0x791
+	.8byte	.L878
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x786
+	.2byte	0x791
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -43922,52 +44014,52 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x786
+	.2byte	0x791
 	.4byte	0x199
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1270
+	.4byte	.Ldebug_ranges0+0x12a0
 	.4byte	0x119e0
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x786
+	.2byte	0x791
 	.4byte	0x199
-	.4byte	.LLST256
+	.4byte	.LLST257
 	.uleb128 0x4f
-	.8byte	.LVL995
-	.4byte	0x151c4
+	.8byte	.LVL984
+	.4byte	0x152de
 	.uleb128 0x4f
-	.8byte	.LVL996
-	.4byte	0x151d0
+	.8byte	.LVL985
+	.4byte	0x152ea
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL993
-	.4byte	0x151dd
+	.8byte	.LVL982
+	.4byte	0x152f7
 	.uleb128 0x4f
-	.8byte	.LVL997
-	.4byte	0x151e9
+	.8byte	.LVL986
+	.4byte	0x15303
 	.byte	0
 	.byte	0
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x11e0
+	.4byte	.Ldebug_ranges0+0x1210
 	.4byte	0x11a9e
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x830
+	.2byte	0x841
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB1865
-	.8byte	.LBE1865-.LBB1865
+	.8byte	.LBB1881
+	.8byte	.LBE1881-.LBB1881
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x830
-	.8byte	.L927
+	.2byte	0x841
+	.8byte	.L937
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x830
+	.2byte	0x841
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -43975,52 +44067,52 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x830
+	.2byte	0x841
 	.4byte	0x199
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1210
+	.4byte	.Ldebug_ranges0+0x1240
 	.4byte	0x11a82
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x830
+	.2byte	0x841
 	.4byte	0x199
-	.4byte	.LLST255
+	.4byte	.LLST256
 	.uleb128 0x4f
-	.8byte	.LVL987
-	.4byte	0x151c4
+	.8byte	.LVL994
+	.4byte	0x152de
 	.uleb128 0x4f
-	.8byte	.LVL988
-	.4byte	0x151d0
+	.8byte	.LVL995
+	.4byte	0x152ea
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL985
-	.4byte	0x151dd
+	.8byte	.LVL992
+	.4byte	0x152f7
 	.uleb128 0x4f
-	.8byte	.LVL989
-	.4byte	0x151e9
+	.8byte	.LVL996
+	.4byte	0x15303
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1859
-	.8byte	.LBE1859-.LBB1859
+	.8byte	.LBB1871
+	.8byte	.LBE1871-.LBB1871
 	.4byte	0x11b50
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x862
+	.2byte	0x873
 	.4byte	0xc6
 	.uleb128 0x57
-	.8byte	.LBB1860
-	.8byte	.LBE1860-.LBB1860
+	.8byte	.LBB1872
+	.8byte	.LBE1872-.LBB1872
 	.uleb128 0x73
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x862
+	.2byte	0x873
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x862
+	.2byte	0x873
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -44028,31 +44120,31 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x862
+	.2byte	0x873
 	.4byte	0x199
 	.uleb128 0x6d
-	.8byte	.LBB1861
-	.8byte	.LBE1861-.LBB1861
+	.8byte	.LBB1873
+	.8byte	.LBE1873-.LBB1873
 	.4byte	0x11b34
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x862
+	.2byte	0x873
 	.4byte	0x199
 	.4byte	.LLST254
 	.uleb128 0x4f
-	.8byte	.LVL926
-	.4byte	0x151c4
+	.8byte	.LVL923
+	.4byte	0x152de
 	.uleb128 0x4f
-	.8byte	.LVL927
-	.4byte	0x151d0
+	.8byte	.LVL924
+	.4byte	0x152ea
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL924
-	.4byte	0x151dd
+	.8byte	.LVL921
+	.4byte	0x152f7
 	.uleb128 0x4f
-	.8byte	.LVL928
-	.4byte	0x151e9
+	.8byte	.LVL925
+	.4byte	0x15303
 	.byte	0
 	.byte	0
 	.uleb128 0x63
@@ -44061,19 +44153,19 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x86e
+	.2byte	0x87f
 	.4byte	0xc6
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x10c0
 	.uleb128 0x6c
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x86e
-	.8byte	.L944
+	.2byte	0x87f
+	.8byte	.L954
 	.uleb128 0x4d
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x86e
+	.2byte	0x87f
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
@@ -44081,7 +44173,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x48
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x86e
+	.2byte	0x87f
 	.4byte	0x199
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x1100
@@ -44089,370 +44181,477 @@ __exitcall_ebc_exit:
 	.uleb128 0x5a
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x86e
+	.2byte	0x87f
 	.4byte	0x199
 	.4byte	.LLST243
 	.uleb128 0x4f
 	.8byte	.LVL873
-	.4byte	0x151c4
+	.4byte	0x152de
 	.uleb128 0x4f
 	.8byte	.LVL874
-	.4byte	0x151d0
+	.4byte	0x152ea
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL871
-	.4byte	0x151dd
+	.4byte	0x152f7
 	.uleb128 0x4f
 	.8byte	.LVL875
-	.4byte	0x151e9
+	.4byte	0x15303
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x120a0
-	.8byte	.LBB1845
+	.4byte	0x121ba
+	.8byte	.LBB1857
 	.4byte	.Ldebug_ranges0+0x1140
 	.byte	0x1
-	.2byte	0x805
+	.2byte	0x816
 	.4byte	0x11c37
 	.uleb128 0x55
-	.4byte	0x120c9
+	.4byte	0x121e3
 	.uleb128 0x55
-	.4byte	0x120bd
+	.4byte	0x121d7
 	.uleb128 0x55
-	.4byte	0x120b1
+	.4byte	0x121cb
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1140
 	.uleb128 0x58
-	.4byte	0x120d5
+	.4byte	0x121ef
 	.uleb128 0x58
-	.4byte	0x120df
+	.4byte	0x121f9
 	.uleb128 0x58
-	.4byte	0x120eb
+	.4byte	0x12205
 	.uleb128 0x58
-	.4byte	0x120f7
+	.4byte	0x12211
 	.uleb128 0x58
-	.4byte	0x12103
+	.4byte	0x1221d
 	.uleb128 0x58
-	.4byte	0x1210f
+	.4byte	0x12229
 	.uleb128 0x74
-	.4byte	0x1211b
+	.4byte	0x12235
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13daa
-	.8byte	.LBB1851
+	.4byte	0x13ec4
+	.8byte	.LBB1863
 	.4byte	.Ldebug_ranges0+0x1180
 	.byte	0x1
-	.2byte	0x7a7
+	.2byte	0x7b5
 	.4byte	0x11cfd
 	.uleb128 0x55
-	.4byte	0x13de7
+	.4byte	0x13f01
 	.uleb128 0x55
-	.4byte	0x13de7
+	.4byte	0x13f01
 	.uleb128 0x55
-	.4byte	0x13de7
+	.4byte	0x13f01
 	.uleb128 0x55
-	.4byte	0x13df3
+	.4byte	0x13f0d
 	.uleb128 0x55
-	.4byte	0x13ddb
+	.4byte	0x13ef5
 	.uleb128 0x55
-	.4byte	0x13dcf
+	.4byte	0x13ee9
 	.uleb128 0x55
-	.4byte	0x13dc3
+	.4byte	0x13edd
 	.uleb128 0x55
-	.4byte	0x13db7
+	.4byte	0x13ed1
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1180
 	.uleb128 0x58
-	.4byte	0x13dff
+	.4byte	0x13f19
 	.uleb128 0x61
-	.4byte	0x13e0b
+	.4byte	0x13f25
 	.4byte	.LLST244
 	.uleb128 0x58
-	.4byte	0x13e17
+	.4byte	0x13f31
 	.uleb128 0x61
-	.4byte	0x13e23
+	.4byte	0x13f3d
 	.4byte	.LLST245
 	.uleb128 0x61
-	.4byte	0x13e2f
+	.4byte	0x13f49
 	.4byte	.LLST246
 	.uleb128 0x58
-	.4byte	0x13e3b
+	.4byte	0x13f55
 	.uleb128 0x58
-	.4byte	0x13e47
+	.4byte	0x13f61
 	.uleb128 0x58
-	.4byte	0x13e53
+	.4byte	0x13f6d
 	.uleb128 0x61
-	.4byte	0x13e5f
+	.4byte	0x13f79
 	.4byte	.LLST247
 	.uleb128 0x58
-	.4byte	0x13e6b
+	.4byte	0x13f85
 	.uleb128 0x61
-	.4byte	0x13e77
+	.4byte	0x13f91
 	.4byte	.LLST248
 	.uleb128 0x62
-	.4byte	0x13e83
+	.4byte	0x13f9d
 	.uleb128 0x1
 	.byte	0x60
 	.uleb128 0x61
-	.4byte	0x13e8d
+	.4byte	0x13fa7
 	.4byte	.LLST249
 	.uleb128 0x61
-	.4byte	0x13e97
+	.4byte	0x13fb1
 	.4byte	.LLST250
 	.uleb128 0x61
-	.4byte	0x13ea3
+	.4byte	0x13fbd
 	.4byte	.LLST251
 	.uleb128 0x61
-	.4byte	0x13eaf
+	.4byte	0x13fc9
 	.4byte	.LLST252
 	.uleb128 0x61
-	.4byte	0x13ebb
+	.4byte	0x13fd5
 	.4byte	.LLST253
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14104
-	.8byte	.LBB1862
-	.8byte	.LBE1862-.LBB1862
+	.4byte	0x1421e
+	.8byte	.LBB1874
+	.8byte	.LBE1874-.LBB1874
 	.byte	0x1
-	.2byte	0x86b
+	.2byte	0x87c
 	.4byte	0x11d48
 	.uleb128 0x55
-	.4byte	0x1411f
+	.4byte	0x14239
 	.uleb128 0x55
-	.4byte	0x14114
+	.4byte	0x1422e
 	.uleb128 0x57
-	.8byte	.LBB1863
-	.8byte	.LBE1863-.LBB1863
+	.8byte	.LBB1875
+	.8byte	.LBE1875-.LBB1875
 	.uleb128 0x58
-	.4byte	0x1412b
+	.4byte	0x14245
 	.uleb128 0x4f
-	.8byte	.LVL929
-	.4byte	0x14dcc
+	.8byte	.LVL926
+	.4byte	0x14ee6
+	.byte	0
+	.byte	0
+	.uleb128 0x5c
+	.4byte	0x12166
+	.8byte	.LBB1876
+	.4byte	.Ldebug_ranges0+0x11e0
+	.byte	0x1
+	.2byte	0x772
+	.4byte	0x11d89
+	.uleb128 0x55
+	.4byte	0x1218b
+	.uleb128 0x55
+	.4byte	0x1217f
+	.uleb128 0x70
+	.4byte	0x12173
+	.4byte	.LLST255
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0x11e0
+	.uleb128 0x58
+	.4byte	0x12197
+	.uleb128 0x58
+	.4byte	0x121a1
+	.uleb128 0x58
+	.4byte	0x121ad
+	.byte	0
+	.byte	0
+	.uleb128 0x5c
+	.4byte	0x12166
+	.8byte	.LBB1890
+	.4byte	.Ldebug_ranges0+0x12d0
+	.byte	0x1
+	.2byte	0x7d4
+	.4byte	0x11dca
+	.uleb128 0x55
+	.4byte	0x1218b
+	.uleb128 0x55
+	.4byte	0x1217f
+	.uleb128 0x70
+	.4byte	0x12173
+	.4byte	.LLST258
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0x12d0
+	.uleb128 0x58
+	.4byte	0x12197
+	.uleb128 0x58
+	.4byte	0x121a1
+	.uleb128 0x58
+	.4byte	0x121ad
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14104
-	.8byte	.LBB1874
-	.8byte	.LBE1874-.LBB1874
+	.4byte	0x12166
+	.8byte	.LBB1894
+	.8byte	.LBE1894-.LBB1894
 	.byte	0x1
-	.2byte	0x732
-	.4byte	0x11d93
+	.2byte	0x7aa
+	.4byte	0x11e1b
 	.uleb128 0x55
-	.4byte	0x1411f
+	.4byte	0x1218b
 	.uleb128 0x55
-	.4byte	0x14114
+	.4byte	0x1217f
+	.uleb128 0x70
+	.4byte	0x12173
+	.4byte	.LLST259
 	.uleb128 0x57
-	.8byte	.LBB1875
-	.8byte	.LBE1875-.LBB1875
+	.8byte	.LBB1895
+	.8byte	.LBE1895-.LBB1895
+	.uleb128 0x58
+	.4byte	0x12197
 	.uleb128 0x58
-	.4byte	0x1412b
+	.4byte	0x121a1
+	.uleb128 0x58
+	.4byte	0x121ad
+	.byte	0
+	.byte	0
+	.uleb128 0x54
+	.4byte	0x1421e
+	.8byte	.LBB1898
+	.8byte	.LBE1898-.LBB1898
+	.byte	0x1
+	.2byte	0x741
+	.4byte	0x11e66
+	.uleb128 0x55
+	.4byte	0x14239
+	.uleb128 0x55
+	.4byte	0x1422e
+	.uleb128 0x57
+	.8byte	.LBB1899
+	.8byte	.LBE1899-.LBB1899
+	.uleb128 0x58
+	.4byte	0x14245
 	.uleb128 0x4f
-	.8byte	.LVL983
-	.4byte	0x14dcc
+	.8byte	.LVL998
+	.4byte	0x14ee6
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL854
-	.4byte	0x1524c
+	.4byte	0x15366
 	.uleb128 0x4f
 	.8byte	.LVL855
-	.4byte	0x14e8a
+	.4byte	0x14fa4
 	.uleb128 0x4f
 	.8byte	.LVL856
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL858
-	.4byte	0x1509f
+	.4byte	0x151b9
 	.uleb128 0x4f
 	.8byte	.LVL859
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL860
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL861
-	.4byte	0x15258
+	.4byte	0x15372
 	.uleb128 0x4f
 	.8byte	.LVL862
-	.4byte	0x15210
+	.4byte	0x1532a
 	.uleb128 0x4f
 	.8byte	.LVL879
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL882
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL883
-	.4byte	0x15101
+	.4byte	0x1521b
 	.uleb128 0x4f
 	.8byte	.LVL884
-	.4byte	0x15258
+	.4byte	0x15372
 	.uleb128 0x4f
 	.8byte	.LVL886
-	.4byte	0x15210
+	.4byte	0x1532a
 	.uleb128 0x4f
 	.8byte	.LVL888
-	.4byte	0x15264
+	.4byte	0x15227
 	.uleb128 0x4f
 	.8byte	.LVL889
-	.4byte	0x1510d
+	.4byte	0x15227
 	.uleb128 0x4f
 	.8byte	.LVL890
-	.4byte	0x1510d
+	.4byte	0x15227
 	.uleb128 0x4f
-	.8byte	.LVL891
-	.4byte	0x1510d
+	.8byte	.LVL908
+	.4byte	0x1537e
 	.uleb128 0x4f
-	.8byte	.LVL911
-	.4byte	0x15264
+	.8byte	.LVL909
+	.4byte	0x15227
 	.uleb128 0x4f
-	.8byte	.LVL912
-	.4byte	0x1510d
+	.8byte	.LVL910
+	.4byte	0x15227
 	.uleb128 0x4f
-	.8byte	.LVL913
-	.4byte	0x1510d
+	.8byte	.LVL917
+	.4byte	0x122ae
+	.uleb128 0x4f
+	.8byte	.LVL918
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL920
-	.4byte	0x12194
+	.4byte	0x15372
 	.uleb128 0x4f
-	.8byte	.LVL921
-	.4byte	0x1502f
+	.8byte	.LVL927
+	.4byte	0x1537e
 	.uleb128 0x4f
-	.8byte	.LVL923
-	.4byte	0x15258
+	.8byte	.LVL929
+	.4byte	0x15372
+	.uleb128 0x4f
+	.8byte	.LVL930
+	.4byte	0x1532a
 	.uleb128 0x4f
 	.8byte	.LVL931
-	.4byte	0x15264
+	.4byte	0x14139
 	.uleb128 0x4f
 	.8byte	.LVL932
-	.4byte	0x1510d
+	.4byte	0x1538a
 	.uleb128 0x4f
 	.8byte	.LVL933
-	.4byte	0x15258
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL934
-	.4byte	0x15210
-	.uleb128 0x4f
-	.8byte	.LVL935
-	.4byte	0x1401f
-	.uleb128 0x4f
-	.8byte	.LVL936
-	.4byte	0x15270
+	.4byte	0x12692
 	.uleb128 0x4f
 	.8byte	.LVL937
-	.4byte	0x14fb5
+	.4byte	0x15005
 	.uleb128 0x4f
 	.8byte	.LVL938
-	.4byte	0x12578
+	.4byte	0x122ae
 	.uleb128 0x4f
-	.8byte	.LVL941
-	.4byte	0x14eeb
+	.8byte	.LVL939
+	.4byte	0x150cf
 	.uleb128 0x4f
-	.8byte	.LVL942
-	.4byte	0x12194
+	.8byte	.LVL940
+	.4byte	0x12692
 	.uleb128 0x4f
-	.8byte	.LVL943
-	.4byte	0x14fb5
+	.8byte	.LVL941
+	.4byte	0x151b9
 	.uleb128 0x4f
 	.8byte	.LVL944
-	.4byte	0x12578
+	.4byte	0x151b9
 	.uleb128 0x4f
-	.8byte	.LVL945
-	.4byte	0x1509f
+	.8byte	.LVL946
+	.4byte	0x150cf
 	.uleb128 0x4f
-	.8byte	.LVL948
-	.4byte	0x1509f
+	.8byte	.LVL949
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL950
-	.4byte	0x14fb5
+	.4byte	0x14072
 	.uleb128 0x4f
 	.8byte	.LVL951
-	.4byte	0x13f58
+	.4byte	0x1538a
 	.uleb128 0x4f
 	.8byte	.LVL952
-	.4byte	0x15270
+	.4byte	0x122ae
 	.uleb128 0x4f
-	.8byte	.LVL953
-	.4byte	0x12194
+	.8byte	.LVL954
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL955
-	.4byte	0x14fb5
-	.uleb128 0x4f
-	.8byte	.LVL956
-	.4byte	0x12578
+	.4byte	0x12692
 	.uleb128 0x4f
-	.8byte	.LVL958
-	.4byte	0x1510d
+	.8byte	.LVL957
+	.4byte	0x15227
 	.uleb128 0x4f
-	.8byte	.LVL965
-	.4byte	0x15270
+	.8byte	.LVL964
+	.4byte	0x122ae
 	.uleb128 0x4f
-	.8byte	.LVL966
-	.4byte	0x12194
+	.8byte	.LVL967
+	.4byte	0x150cf
 	.uleb128 0x4f
-	.8byte	.LVL969
-	.4byte	0x14fb5
+	.8byte	.LVL968
+	.4byte	0x1521b
 	.uleb128 0x4f
 	.8byte	.LVL970
-	.4byte	0x15101
-	.uleb128 0x4f
-	.8byte	.LVL972
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.uleb128 0x4f
-	.8byte	.LVL975
-	.4byte	0x14fb5
+	.8byte	.LVL971
+	.4byte	0x15372
 	.uleb128 0x4f
-	.8byte	.LVL976
-	.4byte	0x14eeb
+	.8byte	.LVL972
+	.4byte	0x1532a
 	.uleb128 0x4f
-	.8byte	.LVL978
-	.4byte	0x1527c
+	.8byte	.LVL977
+	.4byte	0x15396
 	.uleb128 0x4f
 	.8byte	.LVL979
-	.4byte	0x14fb5
-	.uleb128 0x4f
-	.8byte	.LVL980
-	.4byte	0x1527c
+	.4byte	0x15005
 	.uleb128 0x4f
-	.8byte	.LVL981
-	.4byte	0x14fb5
+	.8byte	.LVL988
+	.4byte	0x15396
 	.uleb128 0x4f
-	.8byte	.LVL982
-	.4byte	0x14e8a
+	.8byte	.LVL989
+	.4byte	0x150cf
 	.uleb128 0x4f
-	.8byte	.LVL991
-	.4byte	0x1502f
+	.8byte	.LVL990
+	.4byte	0x14fa4
 	.uleb128 0x4f
 	.8byte	.LVL999
-	.4byte	0x14eeb
+	.4byte	0x15227
 	.uleb128 0x4f
 	.8byte	.LVL1001
-	.4byte	0x14eeb
+	.4byte	0x15149
 	.uleb128 0x4f
-	.8byte	.LVL1003
-	.4byte	0x15163
+	.8byte	.LVL1002
+	.4byte	0x15005
+	.uleb128 0x4f
+	.8byte	.LVL1004
+	.4byte	0x15005
+	.uleb128 0x4f
+	.8byte	.LVL1005
+	.4byte	0x1527d
 	.byte	0
-	.uleb128 0x64
+	.uleb128 0x67
 	.4byte	.LASF3106
 	.byte	0x1
+	.2byte	0x723
+	.byte	0x1
+	.4byte	0x121ba
+	.uleb128 0x66
+	.4byte	.LASF3107
+	.byte	0x1
+	.2byte	0x723
+	.4byte	0xc138
+	.uleb128 0x66
+	.4byte	.LASF3108
+	.byte	0x1
+	.2byte	0x723
+	.4byte	0xc138
+	.uleb128 0x66
+	.4byte	.LASF1001
+	.byte	0x1
+	.2byte	0x723
+	.4byte	0xc6
+	.uleb128 0x53
+	.string	"i"
+	.byte	0x1
+	.2byte	0x725
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF3109
+	.byte	0x1
+	.2byte	0x726
+	.4byte	0x110
+	.uleb128 0x48
+	.4byte	.LASF3110
+	.byte	0x1
+	.2byte	0x727
+	.4byte	0x110
+	.byte	0
+	.uleb128 0x64
+	.4byte	.LASF3111
+	.byte	0x1
 	.2byte	0x70c
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x12124
+	.4byte	0x1223e
 	.uleb128 0x66
-	.4byte	.LASF3107
+	.4byte	.LASF3112
 	.byte	0x1
 	.2byte	0x70c
 	.4byte	0x46ee
 	.uleb128 0x66
-	.4byte	.LASF3108
+	.4byte	.LASF3113
 	.byte	0x1
 	.2byte	0x70c
 	.4byte	0x46ee
 	.uleb128 0x66
-	.4byte	.LASF3109
+	.4byte	.LASF3114
 	.byte	0x1
 	.2byte	0x70c
 	.4byte	0xc6
@@ -44462,42 +44661,42 @@ __exitcall_ebc_exit:
 	.2byte	0x70e
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3110
+	.4byte	.LASF3115
 	.byte	0x1
 	.2byte	0x70f
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3111
+	.4byte	.LASF3116
 	.byte	0x1
 	.2byte	0x70f
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3112
+	.4byte	.LASF3117
 	.byte	0x1
 	.2byte	0x710
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3113
+	.4byte	.LASF3118
 	.byte	0x1
 	.2byte	0x711
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3114
+	.4byte	.LASF3119
 	.byte	0x1
 	.2byte	0x712
 	.4byte	0x46f4
 	.uleb128 0x73
-	.4byte	.LASF3115
+	.4byte	.LASF3120
 	.byte	0x1
 	.2byte	0x71f
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3116
+	.4byte	.LASF3121
 	.byte	0x1
 	.2byte	0x6f0
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x12194
+	.4byte	0x122ae
 	.uleb128 0x65
 	.string	"buf"
 	.byte	0x1
@@ -44514,33 +44713,33 @@ __exitcall_ebc_exit:
 	.2byte	0x6f2
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3110
+	.4byte	.LASF3115
 	.byte	0x1
 	.2byte	0x6f3
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3113
+	.4byte	.LASF3118
 	.byte	0x1
 	.2byte	0x6f4
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3117
+	.4byte	.LASF3122
 	.byte	0x1
 	.2byte	0x6f5
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3109
+	.4byte	.LASF3114
 	.byte	0x1
 	.2byte	0x6f6
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3118
+	.4byte	.LASF3123
 	.byte	0x1
 	.2byte	0x6f7
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x51
-	.4byte	.LASF3119
+	.4byte	.LASF3124
 	.byte	0x1
 	.2byte	0x691
 	.4byte	0xc6
@@ -44548,7 +44747,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2832-.LFB2832
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x122f8
+	.4byte	0x12412
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
@@ -44567,7 +44766,7 @@ __exitcall_ebc_exit:
 	.2byte	0x693
 	.4byte	0xe874
 	.uleb128 0x5a
-	.4byte	.LASF3120
+	.4byte	.LASF3125
 	.byte	0x1
 	.2byte	0x694
 	.4byte	0xc6
@@ -44580,75 +44779,75 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x64
 	.uleb128 0x54
-	.4byte	0x14417
-	.8byte	.LBB1222
-	.8byte	.LBE1222-.LBB1222
+	.4byte	0x14531
+	.8byte	.LBB1228
+	.8byte	.LBE1228-.LBB1228
 	.byte	0x1
 	.2byte	0x69a
-	.4byte	0x12227
+	.4byte	0x12341
 	.uleb128 0x55
-	.4byte	0x14433
+	.4byte	0x1454d
 	.uleb128 0x55
-	.4byte	0x14427
+	.4byte	0x14541
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL285
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL286
-	.4byte	0x15288
+	.4byte	0x153a2
 	.uleb128 0x4f
 	.8byte	.LVL291
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL292
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL294
-	.4byte	0x15288
+	.4byte	0x153a2
 	.uleb128 0x4f
 	.8byte	.LVL295
-	.4byte	0x1502f
+	.4byte	0x15149
 	.uleb128 0x4f
 	.8byte	.LVL296
-	.4byte	0x15288
+	.4byte	0x153a2
 	.uleb128 0x4f
 	.8byte	.LVL297
-	.4byte	0x15288
+	.4byte	0x153a2
 	.uleb128 0x4f
 	.8byte	.LVL298
-	.4byte	0x15288
+	.4byte	0x153a2
 	.uleb128 0x4f
 	.8byte	.LVL299
-	.4byte	0x15288
+	.4byte	0x153a2
 	.uleb128 0x4f
 	.8byte	.LVL300
-	.4byte	0x15288
+	.4byte	0x153a2
 	.uleb128 0x4f
 	.8byte	.LVL301
-	.4byte	0x15288
+	.4byte	0x153a2
 	.uleb128 0x4f
 	.8byte	.LVL302
-	.4byte	0x15288
+	.4byte	0x153a2
 	.uleb128 0x4f
 	.8byte	.LVL303
-	.4byte	0x15288
+	.4byte	0x153a2
 	.uleb128 0x4f
 	.8byte	.LVL304
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL305
-	.4byte	0x15163
+	.4byte	0x1527d
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3121
+	.4byte	.LASF3126
 	.byte	0x1
 	.2byte	0x66a
 	.8byte	.LFB2831
 	.8byte	.LFE2831-.LFB2831
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x123b1
+	.4byte	0x124cb
 	.uleb128 0x48
 	.4byte	.LASF2976
 	.byte	0x1
@@ -44661,37 +44860,37 @@ __exitcall_ebc_exit:
 	.4byte	0xe1f4
 	.uleb128 0x4f
 	.8byte	.LVL267
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL268
-	.4byte	0x15101
+	.4byte	0x1521b
 	.uleb128 0x4f
 	.8byte	.LVL269
-	.4byte	0x15101
+	.4byte	0x1521b
 	.uleb128 0x4f
 	.8byte	.LVL270
-	.4byte	0x15060
+	.4byte	0x1517a
 	.uleb128 0x4f
 	.8byte	.LVL271
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL272
-	.4byte	0x15019
+	.4byte	0x15133
 	.uleb128 0x4f
 	.8byte	.LVL273
-	.4byte	0x1509f
+	.4byte	0x151b9
 	.uleb128 0x4f
 	.8byte	.LVL274
-	.4byte	0x15101
+	.4byte	0x1521b
 	.uleb128 0x4f
 	.8byte	.LVL275
-	.4byte	0x15101
+	.4byte	0x1521b
 	.uleb128 0x4f
 	.8byte	.LVL276
-	.4byte	0x15060
+	.4byte	0x1517a
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3122
+	.4byte	.LASF3127
 	.byte	0x1
 	.2byte	0x607
 	.4byte	0xc6
@@ -44699,7 +44898,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2830-.LFB2830
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12568
+	.4byte	0x12682
 	.uleb128 0x59
 	.4byte	.LASF794
 	.byte	0x1
@@ -44725,14 +44924,14 @@ __exitcall_ebc_exit:
 	.4byte	0xe874
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0xcb0
-	.4byte	0x1249b
+	.4byte	0x125b5
 	.uleb128 0x41
 	.byte	0x8
 	.byte	0x1
 	.2byte	0x612
-	.4byte	0x12434
+	.4byte	0x1254e
 	.uleb128 0x43
-	.4byte	.LASF3123
+	.4byte	.LASF3128
 	.byte	0x1
 	.2byte	0x612
 	.4byte	0x1a0
@@ -44740,111 +44939,111 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x1
 	.2byte	0x612
-	.4byte	0x12568
+	.4byte	0x12682
 	.byte	0
 	.uleb128 0x53
 	.string	"__u"
 	.byte	0x1
 	.2byte	0x612
-	.4byte	0x12412
+	.4byte	0x1252c
 	.uleb128 0x5c
-	.4byte	0x14c66
-	.8byte	.LBB1469
+	.4byte	0x14d80
+	.8byte	.LBB1475
 	.4byte	.Ldebug_ranges0+0xcf0
 	.byte	0x1
 	.2byte	0x612
-	.4byte	0x12468
+	.4byte	0x12582
 	.uleb128 0x55
-	.4byte	0x14c89
+	.4byte	0x14da3
 	.uleb128 0x55
-	.4byte	0x14c7d
+	.4byte	0x14d97
 	.uleb128 0x55
-	.4byte	0x14c73
+	.4byte	0x14d8d
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x14a65
-	.8byte	.LBB1472
-	.8byte	.LBE1472-.LBB1472
+	.4byte	0x14b7f
+	.8byte	.LBB1478
+	.8byte	.LBE1478-.LBB1478
 	.byte	0x1
 	.2byte	0x612
 	.uleb128 0x57
-	.8byte	.LBB1473
-	.8byte	.LBE1473-.LBB1473
+	.8byte	.LBB1479
+	.8byte	.LBE1479-.LBB1479
 	.uleb128 0x62
-	.4byte	0x14a75
+	.4byte	0x14b8f
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14911
-	.8byte	.LBB1477
+	.4byte	0x14a2b
+	.8byte	.LBB1483
 	.4byte	.Ldebug_ranges0+0xd20
 	.byte	0x1
 	.2byte	0x661
-	.4byte	0x124d8
+	.4byte	0x125f2
 	.uleb128 0x55
-	.4byte	0x1492d
+	.4byte	0x14a47
 	.uleb128 0x55
-	.4byte	0x14922
+	.4byte	0x14a3c
 	.uleb128 0x4f
 	.8byte	.LVL584
-	.4byte	0x15294
+	.4byte	0x153ae
 	.uleb128 0x4f
 	.8byte	.LVL591
-	.4byte	0x15294
+	.4byte	0x153ae
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL579
-	.4byte	0x152a1
+	.4byte	0x153bb
 	.uleb128 0x4f
 	.8byte	.LVL580
-	.4byte	0x151c4
+	.4byte	0x152de
 	.uleb128 0x4f
 	.8byte	.LVL581
-	.4byte	0x152ab
+	.4byte	0x153c5
 	.uleb128 0x4f
 	.8byte	.LVL582
-	.4byte	0x14cc9
+	.4byte	0x14de3
 	.uleb128 0x4f
 	.8byte	.LVL583
-	.4byte	0x13ae8
+	.4byte	0x13c02
 	.uleb128 0x4f
 	.8byte	.LVL585
-	.4byte	0x14cc9
+	.4byte	0x14de3
 	.uleb128 0x4f
 	.8byte	.LVL586
-	.4byte	0x1318f
+	.4byte	0x132a9
 	.uleb128 0x4f
 	.8byte	.LVL587
-	.4byte	0x14cc9
+	.4byte	0x14de3
 	.uleb128 0x4f
 	.8byte	.LVL588
-	.4byte	0x13c4f
+	.4byte	0x13d69
 	.uleb128 0x4f
 	.8byte	.LVL589
-	.4byte	0x14cc9
+	.4byte	0x14de3
 	.uleb128 0x4f
 	.8byte	.LVL590
-	.4byte	0x12782
+	.4byte	0x1289c
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x12578
+	.4byte	0x12692
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3124
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x592
 	.8byte	.LFB2829
 	.8byte	.LFE2829-.LFB2829
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12724
+	.4byte	0x1283e
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
@@ -44868,102 +45067,102 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	__func__.34953
 	.uleb128 0x54
-	.4byte	0x12724
-	.8byte	.LBB1460
-	.8byte	.LBE1460-.LBB1460
+	.4byte	0x1283e
+	.8byte	.LBB1466
+	.8byte	.LBE1466-.LBB1466
 	.byte	0x1
 	.2byte	0x5a7
-	.4byte	0x12605
+	.4byte	0x1271f
 	.uleb128 0x55
-	.4byte	0x1273d
+	.4byte	0x12857
 	.uleb128 0x55
-	.4byte	0x12731
+	.4byte	0x1284b
 	.uleb128 0x4f
 	.8byte	.LVL552
-	.4byte	0x14cc9
+	.4byte	0x14de3
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12724
-	.8byte	.LBB1462
-	.8byte	.LBE1462-.LBB1462
+	.4byte	0x1283e
+	.8byte	.LBB1468
+	.8byte	.LBE1468-.LBB1468
 	.byte	0x1
 	.2byte	0x5bb
-	.4byte	0x12639
+	.4byte	0x12753
 	.uleb128 0x55
-	.4byte	0x1273d
+	.4byte	0x12857
 	.uleb128 0x55
-	.4byte	0x12731
+	.4byte	0x1284b
 	.uleb128 0x4f
 	.8byte	.LVL557
-	.4byte	0x14cc9
+	.4byte	0x14de3
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12724
-	.8byte	.LBB1464
-	.8byte	.LBE1464-.LBB1464
+	.4byte	0x1283e
+	.8byte	.LBB1470
+	.8byte	.LBE1470-.LBB1470
 	.byte	0x1
 	.2byte	0x600
-	.4byte	0x1266d
+	.4byte	0x12787
 	.uleb128 0x55
-	.4byte	0x1273d
+	.4byte	0x12857
 	.uleb128 0x55
-	.4byte	0x12731
+	.4byte	0x1284b
 	.uleb128 0x4f
 	.8byte	.LVL562
-	.4byte	0x14cc9
+	.4byte	0x14de3
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12724
-	.8byte	.LBB1466
-	.8byte	.LBE1466-.LBB1466
+	.4byte	0x1283e
+	.8byte	.LBB1472
+	.8byte	.LBE1472-.LBB1472
 	.byte	0x1
 	.2byte	0x5d5
-	.4byte	0x126a1
+	.4byte	0x127bb
 	.uleb128 0x55
-	.4byte	0x1273d
+	.4byte	0x12857
 	.uleb128 0x55
-	.4byte	0x12731
+	.4byte	0x1284b
 	.uleb128 0x4f
 	.8byte	.LVL567
-	.4byte	0x14cc9
+	.4byte	0x14de3
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL550
-	.4byte	0x13ae8
+	.4byte	0x13c02
 	.uleb128 0x4f
 	.8byte	.LVL551
-	.4byte	0x13ae8
+	.4byte	0x13c02
 	.uleb128 0x4f
 	.8byte	.LVL555
-	.4byte	0x13c4f
+	.4byte	0x13d69
 	.uleb128 0x4f
 	.8byte	.LVL556
-	.4byte	0x13c4f
+	.4byte	0x13d69
 	.uleb128 0x4f
 	.8byte	.LVL560
-	.4byte	0x1318f
+	.4byte	0x132a9
 	.uleb128 0x4f
 	.8byte	.LVL561
-	.4byte	0x1318f
+	.4byte	0x132a9
 	.uleb128 0x4f
 	.8byte	.LVL565
-	.4byte	0x12782
+	.4byte	0x1289c
 	.uleb128 0x4f
 	.8byte	.LVL566
-	.4byte	0x12782
+	.4byte	0x1289c
 	.uleb128 0x4f
 	.8byte	.LVL570
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL573
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3125
+	.4byte	.LASF3130
 	.byte	0x1
 	.2byte	0x58c
 	.byte	0x1
-	.4byte	0x1274a
+	.4byte	0x12864
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
@@ -44976,11 +45175,11 @@ __exitcall_ebc_exit:
 	.4byte	0xe874
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3126
+	.4byte	.LASF3131
 	.byte	0x1
 	.2byte	0x581
 	.byte	0x1
-	.4byte	0x1277c
+	.4byte	0x12896
 	.uleb128 0x66
 	.4byte	.LASF3020
 	.byte	0x1
@@ -44995,35 +45194,35 @@ __exitcall_ebc_exit:
 	.string	"buf"
 	.byte	0x1
 	.2byte	0x583
-	.4byte	0x1277c
+	.4byte	0x12896
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xdf7e
 	.uleb128 0x4e
-	.4byte	.LASF3127
+	.4byte	.LASF3132
 	.byte	0x1
 	.2byte	0x56c
 	.8byte	.LFB2826
 	.8byte	.LFE2826-.LFB2826
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12d31
+	.4byte	0x12e4b
 	.uleb128 0x75
-	.4byte	.LASF3128
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x56c
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x59
-	.4byte	.LASF3129
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x56d
 	.4byte	0xac0
 	.4byte	.LLST144
 	.uleb128 0x59
-	.4byte	.LASF3130
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x56d
 	.4byte	0xac0
@@ -45035,478 +45234,478 @@ __exitcall_ebc_exit:
 	.4byte	0xe874
 	.4byte	.LLST146
 	.uleb128 0x54
-	.4byte	0x12d31
-	.8byte	.LBB1370
-	.8byte	.LBE1370-.LBB1370
+	.4byte	0x12e4b
+	.8byte	.LBB1376
+	.8byte	.LBE1376-.LBB1376
 	.byte	0x1
 	.2byte	0x57d
-	.4byte	0x1288b
+	.4byte	0x129a5
 	.uleb128 0x55
-	.4byte	0x12d62
+	.4byte	0x12e7c
 	.uleb128 0x55
-	.4byte	0x12d62
+	.4byte	0x12e7c
 	.uleb128 0x55
-	.4byte	0x12d62
+	.4byte	0x12e7c
 	.uleb128 0x55
-	.4byte	0x12d56
+	.4byte	0x12e70
 	.uleb128 0x72
-	.4byte	0x12d4a
+	.4byte	0x12e64
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x12d3e
+	.4byte	0x12e58
 	.uleb128 0x57
-	.8byte	.LBB1371
-	.8byte	.LBE1371-.LBB1371
+	.8byte	.LBB1377
+	.8byte	.LBE1377-.LBB1377
 	.uleb128 0x58
-	.4byte	0x12d6e
+	.4byte	0x12e88
 	.uleb128 0x61
-	.4byte	0x12d7a
+	.4byte	0x12e94
 	.4byte	.LLST147
 	.uleb128 0x58
-	.4byte	0x12d86
+	.4byte	0x12ea0
 	.uleb128 0x58
-	.4byte	0x12d92
+	.4byte	0x12eac
 	.uleb128 0x58
-	.4byte	0x12d9e
+	.4byte	0x12eb8
 	.uleb128 0x58
-	.4byte	0x12daa
+	.4byte	0x12ec4
 	.uleb128 0x61
-	.4byte	0x12db6
+	.4byte	0x12ed0
 	.4byte	.LLST148
 	.uleb128 0x61
-	.4byte	0x12dc2
+	.4byte	0x12edc
 	.4byte	.LLST149
 	.uleb128 0x58
-	.4byte	0x12dce
+	.4byte	0x12ee8
 	.uleb128 0x61
-	.4byte	0x12dda
+	.4byte	0x12ef4
 	.4byte	.LLST150
 	.uleb128 0x58
-	.4byte	0x12de4
+	.4byte	0x12efe
 	.uleb128 0x61
-	.4byte	0x12dee
+	.4byte	0x12f08
 	.4byte	.LLST151
 	.uleb128 0x61
-	.4byte	0x12dfa
+	.4byte	0x12f14
 	.4byte	.LLST152
 	.uleb128 0x58
-	.4byte	0x12e06
+	.4byte	0x12f20
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12fe3
-	.8byte	.LBB1372
+	.4byte	0x130fd
+	.8byte	.LBB1378
 	.4byte	.Ldebug_ranges0+0x9c0
 	.byte	0x1
 	.2byte	0x576
-	.4byte	0x12a4d
+	.4byte	0x12b67
 	.uleb128 0x55
-	.4byte	0x13014
+	.4byte	0x1312e
 	.uleb128 0x55
-	.4byte	0x13014
+	.4byte	0x1312e
 	.uleb128 0x55
-	.4byte	0x13014
+	.4byte	0x1312e
 	.uleb128 0x55
-	.4byte	0x13008
+	.4byte	0x13122
 	.uleb128 0x55
-	.4byte	0x12ffc
+	.4byte	0x13116
 	.uleb128 0x55
-	.4byte	0x12ff0
+	.4byte	0x1310a
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x9c0
 	.uleb128 0x58
-	.4byte	0x13020
+	.4byte	0x1313a
 	.uleb128 0x61
-	.4byte	0x1302c
+	.4byte	0x13146
 	.4byte	.LLST153
 	.uleb128 0x61
-	.4byte	0x13038
+	.4byte	0x13152
 	.4byte	.LLST154
 	.uleb128 0x61
-	.4byte	0x13044
+	.4byte	0x1315e
 	.4byte	.LLST155
 	.uleb128 0x61
-	.4byte	0x13050
+	.4byte	0x1316a
 	.4byte	.LLST156
 	.uleb128 0x61
-	.4byte	0x1305c
+	.4byte	0x13176
 	.4byte	.LLST157
 	.uleb128 0x61
-	.4byte	0x13068
+	.4byte	0x13182
 	.4byte	.LLST158
 	.uleb128 0x61
-	.4byte	0x13074
+	.4byte	0x1318e
 	.4byte	.LLST159
 	.uleb128 0x61
-	.4byte	0x13080
+	.4byte	0x1319a
 	.4byte	.LLST160
 	.uleb128 0x58
-	.4byte	0x1308a
+	.4byte	0x131a4
 	.uleb128 0x61
-	.4byte	0x13094
+	.4byte	0x131ae
 	.4byte	.LLST161
 	.uleb128 0x61
-	.4byte	0x130a0
+	.4byte	0x131ba
 	.4byte	.LLST162
 	.uleb128 0x58
-	.4byte	0x130ac
+	.4byte	0x131c6
 	.uleb128 0x5c
-	.4byte	0x14182
-	.8byte	.LBB1374
+	.4byte	0x1429c
+	.8byte	.LBB1380
 	.4byte	.Ldebug_ranges0+0xa00
 	.byte	0x1
 	.2byte	0x49b
-	.4byte	0x1296b
+	.4byte	0x12a85
 	.uleb128 0x55
-	.4byte	0x141aa
+	.4byte	0x142c4
 	.uleb128 0x55
-	.4byte	0x1419e
+	.4byte	0x142b8
 	.uleb128 0x55
-	.4byte	0x14192
+	.4byte	0x142ac
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa00
 	.uleb128 0x58
-	.4byte	0x141b6
+	.4byte	0x142d0
 	.uleb128 0x61
-	.4byte	0x141c1
+	.4byte	0x142db
 	.4byte	.LLST163
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14182
-	.8byte	.LBB1377
-	.8byte	.LBE1377-.LBB1377
+	.4byte	0x1429c
+	.8byte	.LBB1383
+	.8byte	.LBE1383-.LBB1383
 	.byte	0x1
 	.2byte	0x498
-	.4byte	0x129b7
+	.4byte	0x12ad1
 	.uleb128 0x55
-	.4byte	0x141aa
+	.4byte	0x142c4
 	.uleb128 0x55
-	.4byte	0x1419e
+	.4byte	0x142b8
 	.uleb128 0x55
-	.4byte	0x14192
+	.4byte	0x142ac
 	.uleb128 0x57
-	.8byte	.LBB1378
-	.8byte	.LBE1378-.LBB1378
+	.8byte	.LBB1384
+	.8byte	.LBE1384-.LBB1384
 	.uleb128 0x58
-	.4byte	0x141b6
+	.4byte	0x142d0
 	.uleb128 0x61
-	.4byte	0x141c1
+	.4byte	0x142db
 	.4byte	.LLST164
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x14182
-	.8byte	.LBB1379
-	.8byte	.LBE1379-.LBB1379
+	.4byte	0x1429c
+	.8byte	.LBB1385
+	.8byte	.LBE1385-.LBB1385
 	.byte	0x1
 	.2byte	0x499
-	.4byte	0x12a03
+	.4byte	0x12b1d
 	.uleb128 0x55
-	.4byte	0x141aa
+	.4byte	0x142c4
 	.uleb128 0x55
-	.4byte	0x1419e
+	.4byte	0x142b8
 	.uleb128 0x55
-	.4byte	0x14192
+	.4byte	0x142ac
 	.uleb128 0x57
-	.8byte	.LBB1380
-	.8byte	.LBE1380-.LBB1380
+	.8byte	.LBB1386
+	.8byte	.LBE1386-.LBB1386
 	.uleb128 0x58
-	.4byte	0x141b6
+	.4byte	0x142d0
 	.uleb128 0x61
-	.4byte	0x141c1
+	.4byte	0x142db
 	.4byte	.LLST165
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x14182
-	.8byte	.LBB1381
-	.8byte	.LBE1381-.LBB1381
+	.4byte	0x1429c
+	.8byte	.LBB1387
+	.8byte	.LBE1387-.LBB1387
 	.byte	0x1
 	.2byte	0x49a
 	.uleb128 0x55
-	.4byte	0x141aa
+	.4byte	0x142c4
 	.uleb128 0x55
-	.4byte	0x1419e
+	.4byte	0x142b8
 	.uleb128 0x55
-	.4byte	0x14192
+	.4byte	0x142ac
 	.uleb128 0x57
-	.8byte	.LBB1382
-	.8byte	.LBE1382-.LBB1382
+	.8byte	.LBB1388
+	.8byte	.LBE1388-.LBB1388
 	.uleb128 0x58
-	.4byte	0x141b6
+	.4byte	0x142d0
 	.uleb128 0x61
-	.4byte	0x141c1
+	.4byte	0x142db
 	.4byte	.LLST166
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12e13
-	.8byte	.LBB1387
-	.8byte	.LBE1387-.LBB1387
+	.4byte	0x12f2d
+	.8byte	.LBB1393
+	.8byte	.LBE1393-.LBB1393
 	.byte	0x1
 	.2byte	0x57b
-	.4byte	0x12af6
+	.4byte	0x12c10
 	.uleb128 0x55
-	.4byte	0x12e44
+	.4byte	0x12f5e
 	.uleb128 0x55
-	.4byte	0x12e44
+	.4byte	0x12f5e
 	.uleb128 0x55
-	.4byte	0x12e44
+	.4byte	0x12f5e
 	.uleb128 0x55
-	.4byte	0x12e38
+	.4byte	0x12f52
 	.uleb128 0x72
-	.4byte	0x12e2c
+	.4byte	0x12f46
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x12e20
+	.4byte	0x12f3a
 	.uleb128 0x57
-	.8byte	.LBB1388
-	.8byte	.LBE1388-.LBB1388
+	.8byte	.LBB1394
+	.8byte	.LBE1394-.LBB1394
 	.uleb128 0x58
-	.4byte	0x12e50
+	.4byte	0x12f6a
 	.uleb128 0x58
-	.4byte	0x12e5c
+	.4byte	0x12f76
 	.uleb128 0x58
-	.4byte	0x12e68
+	.4byte	0x12f82
 	.uleb128 0x58
-	.4byte	0x12e74
+	.4byte	0x12f8e
 	.uleb128 0x58
-	.4byte	0x12e80
+	.4byte	0x12f9a
 	.uleb128 0x58
-	.4byte	0x12e8c
+	.4byte	0x12fa6
 	.uleb128 0x61
-	.4byte	0x12e98
+	.4byte	0x12fb2
 	.4byte	.LLST167
 	.uleb128 0x61
-	.4byte	0x12ea4
+	.4byte	0x12fbe
 	.4byte	.LLST168
 	.uleb128 0x58
-	.4byte	0x12eb0
+	.4byte	0x12fca
 	.uleb128 0x61
-	.4byte	0x12ebc
+	.4byte	0x12fd6
 	.4byte	.LLST169
 	.uleb128 0x58
-	.4byte	0x12ec6
+	.4byte	0x12fe0
 	.uleb128 0x61
-	.4byte	0x12ed0
+	.4byte	0x12fea
 	.4byte	.LLST170
 	.uleb128 0x61
-	.4byte	0x12edc
+	.4byte	0x12ff6
 	.4byte	.LLST171
 	.uleb128 0x58
-	.4byte	0x12ee8
+	.4byte	0x13002
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x130b9
-	.8byte	.LBB1389
+	.4byte	0x131d3
+	.8byte	.LBB1395
 	.4byte	.Ldebug_ranges0+0xa30
 	.byte	0x1
 	.2byte	0x578
-	.4byte	0x12c04
+	.4byte	0x12d1e
 	.uleb128 0x55
-	.4byte	0x130ea
+	.4byte	0x13204
 	.uleb128 0x55
-	.4byte	0x130ea
+	.4byte	0x13204
 	.uleb128 0x55
-	.4byte	0x130ea
+	.4byte	0x13204
 	.uleb128 0x55
-	.4byte	0x130de
+	.4byte	0x131f8
 	.uleb128 0x55
-	.4byte	0x130d2
+	.4byte	0x131ec
 	.uleb128 0x55
-	.4byte	0x130c6
+	.4byte	0x131e0
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa30
 	.uleb128 0x58
-	.4byte	0x130f6
+	.4byte	0x13210
 	.uleb128 0x58
-	.4byte	0x13102
+	.4byte	0x1321c
 	.uleb128 0x58
-	.4byte	0x1310e
+	.4byte	0x13228
 	.uleb128 0x62
-	.4byte	0x1311a
+	.4byte	0x13234
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x13126
+	.4byte	0x13240
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x13132
+	.4byte	0x1324c
 	.4byte	.LLST172
 	.uleb128 0x61
-	.4byte	0x1313e
+	.4byte	0x13258
 	.4byte	.LLST173
 	.uleb128 0x61
-	.4byte	0x1314a
+	.4byte	0x13264
 	.4byte	.LLST174
 	.uleb128 0x61
-	.4byte	0x13156
+	.4byte	0x13270
 	.4byte	.LLST175
 	.uleb128 0x58
-	.4byte	0x13160
+	.4byte	0x1327a
 	.uleb128 0x61
-	.4byte	0x1316a
+	.4byte	0x13284
 	.4byte	.LLST176
 	.uleb128 0x61
-	.4byte	0x13176
+	.4byte	0x13290
 	.4byte	.LLST177
 	.uleb128 0x58
-	.4byte	0x13182
+	.4byte	0x1329c
 	.uleb128 0x5c
-	.4byte	0x14182
-	.8byte	.LBB1391
+	.4byte	0x1429c
+	.8byte	.LBB1397
 	.4byte	.Ldebug_ranges0+0xa60
 	.byte	0x1
 	.2byte	0x470
-	.4byte	0x12bca
+	.4byte	0x12ce4
 	.uleb128 0x55
-	.4byte	0x141aa
+	.4byte	0x142c4
 	.uleb128 0x55
-	.4byte	0x1419e
+	.4byte	0x142b8
 	.uleb128 0x55
-	.4byte	0x14192
+	.4byte	0x142ac
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa60
 	.uleb128 0x58
-	.4byte	0x141b6
+	.4byte	0x142d0
 	.uleb128 0x61
-	.4byte	0x141c1
+	.4byte	0x142db
 	.4byte	.LLST178
 	.byte	0
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x14182
-	.8byte	.LBB1398
+	.4byte	0x1429c
+	.8byte	.LBB1404
 	.4byte	.Ldebug_ranges0+0xad0
 	.byte	0x1
 	.2byte	0x46f
 	.uleb128 0x55
-	.4byte	0x141aa
+	.4byte	0x142c4
 	.uleb128 0x55
-	.4byte	0x1419e
+	.4byte	0x142b8
 	.uleb128 0x55
-	.4byte	0x14192
+	.4byte	0x142ac
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xad0
 	.uleb128 0x58
-	.4byte	0x141b6
+	.4byte	0x142d0
 	.uleb128 0x61
-	.4byte	0x141c1
+	.4byte	0x142db
 	.4byte	.LLST179
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x12ef5
-	.8byte	.LBB1416
-	.8byte	.LBE1416-.LBB1416
+	.4byte	0x1300f
+	.8byte	.LBB1422
+	.8byte	.LBE1422-.LBB1422
 	.byte	0x1
 	.2byte	0x572
 	.uleb128 0x55
-	.4byte	0x12f26
+	.4byte	0x13040
 	.uleb128 0x55
-	.4byte	0x12f26
+	.4byte	0x13040
 	.uleb128 0x55
-	.4byte	0x12f26
+	.4byte	0x13040
 	.uleb128 0x55
-	.4byte	0x12f1a
+	.4byte	0x13034
 	.uleb128 0x55
-	.4byte	0x12f0e
+	.4byte	0x13028
 	.uleb128 0x55
-	.4byte	0x12f02
+	.4byte	0x1301c
 	.uleb128 0x57
-	.8byte	.LBB1417
-	.8byte	.LBE1417-.LBB1417
+	.8byte	.LBB1423
+	.8byte	.LBE1423-.LBB1423
 	.uleb128 0x58
-	.4byte	0x12f32
+	.4byte	0x1304c
 	.uleb128 0x58
-	.4byte	0x12f3e
+	.4byte	0x13058
 	.uleb128 0x58
-	.4byte	0x12f4a
+	.4byte	0x13064
 	.uleb128 0x62
-	.4byte	0x12f56
+	.4byte	0x13070
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x12f62
+	.4byte	0x1307c
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x12f6e
+	.4byte	0x13088
 	.4byte	.LLST180
 	.uleb128 0x61
-	.4byte	0x12f7a
+	.4byte	0x13094
 	.4byte	.LLST181
 	.uleb128 0x61
-	.4byte	0x12f86
+	.4byte	0x130a0
 	.4byte	.LLST182
 	.uleb128 0x61
-	.4byte	0x12f92
+	.4byte	0x130ac
 	.4byte	.LLST183
 	.uleb128 0x58
-	.4byte	0x12f9c
+	.4byte	0x130b6
 	.uleb128 0x61
-	.4byte	0x12fa6
+	.4byte	0x130c0
 	.4byte	.LLST184
 	.uleb128 0x61
-	.4byte	0x12fb2
+	.4byte	0x130cc
 	.4byte	.LLST185
 	.uleb128 0x58
-	.4byte	0x12fbe
+	.4byte	0x130d8
 	.uleb128 0x58
-	.4byte	0x12fca
+	.4byte	0x130e4
 	.uleb128 0x58
-	.4byte	0x12fd6
+	.4byte	0x130f0
 	.uleb128 0x5c
-	.4byte	0x14137
-	.8byte	.LBB1418
+	.4byte	0x14251
+	.8byte	.LBB1424
 	.4byte	.Ldebug_ranges0+0xb30
 	.byte	0x1
 	.2byte	0x4c6
-	.4byte	0x12cf2
+	.4byte	0x12e0c
 	.uleb128 0x55
-	.4byte	0x1415f
+	.4byte	0x14279
 	.uleb128 0x55
-	.4byte	0x14153
+	.4byte	0x1426d
 	.uleb128 0x55
-	.4byte	0x14147
+	.4byte	0x14261
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xb30
 	.uleb128 0x61
-	.4byte	0x1416b
+	.4byte	0x14285
 	.4byte	.LLST186
 	.uleb128 0x61
-	.4byte	0x14176
+	.4byte	0x14290
 	.4byte	.LLST187
 	.byte	0
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x14137
-	.8byte	.LBB1425
+	.4byte	0x14251
+	.8byte	.LBB1431
 	.4byte	.Ldebug_ranges0+0xba0
 	.byte	0x1
 	.2byte	0x4c5
 	.uleb128 0x55
-	.4byte	0x1415f
+	.4byte	0x14279
 	.uleb128 0x55
-	.4byte	0x14153
+	.4byte	0x1426d
 	.uleb128 0x55
-	.4byte	0x14147
+	.4byte	0x14261
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xba0
 	.uleb128 0x61
-	.4byte	0x1416b
+	.4byte	0x14285
 	.4byte	.LLST188
 	.uleb128 0x61
-	.4byte	0x14176
+	.4byte	0x14290
 	.4byte	.LLST189
 	.byte	0
 	.byte	0
@@ -45514,23 +45713,23 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3131
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x51e
 	.byte	0x1
-	.4byte	0x12e13
+	.4byte	0x12f2d
 	.uleb128 0x66
-	.4byte	.LASF3128
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x51e
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3129
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x51f
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3130
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x51f
 	.4byte	0xac0
@@ -45545,22 +45744,22 @@ __exitcall_ebc_exit:
 	.2byte	0x522
 	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3132
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x523
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3133
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x523
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3134
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x524
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3135
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x524
 	.4byte	0x110
@@ -45570,7 +45769,7 @@ __exitcall_ebc_exit:
 	.2byte	0x524
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3136
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x525
 	.4byte	0xc138
@@ -45595,7 +45794,7 @@ __exitcall_ebc_exit:
 	.2byte	0x527
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3137
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x528
 	.4byte	0xc6
@@ -45611,23 +45810,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3138
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x4d0
 	.byte	0x1
-	.4byte	0x12ef5
+	.4byte	0x1300f
 	.uleb128 0x66
-	.4byte	.LASF3128
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x4d0
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3129
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x4d1
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3130
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x4d1
 	.4byte	0xac0
@@ -45642,22 +45841,22 @@ __exitcall_ebc_exit:
 	.2byte	0x4d4
 	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3132
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x4d5
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3133
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x4d5
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3134
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x4d6
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3135
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x4d6
 	.4byte	0x110
@@ -45667,7 +45866,7 @@ __exitcall_ebc_exit:
 	.2byte	0x4d6
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3136
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x4d7
 	.4byte	0xc138
@@ -45692,7 +45891,7 @@ __exitcall_ebc_exit:
 	.2byte	0x4d9
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3137
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x4da
 	.4byte	0xc6
@@ -45708,23 +45907,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3139
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x4a6
 	.byte	0x1
-	.4byte	0x12fe3
+	.4byte	0x130fd
 	.uleb128 0x66
-	.4byte	.LASF3128
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x4a6
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3129
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x4a7
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3130
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x4a7
 	.4byte	0xac0
@@ -45739,27 +45938,27 @@ __exitcall_ebc_exit:
 	.2byte	0x4aa
 	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3134
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x4ab
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3135
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x4ab
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3132
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x4ab
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3133
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x4ab
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3136
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x4ac
 	.4byte	0xc138
@@ -45784,7 +45983,7 @@ __exitcall_ebc_exit:
 	.2byte	0x4ae
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3137
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x4af
 	.4byte	0xc6
@@ -45799,34 +45998,34 @@ __exitcall_ebc_exit:
 	.2byte	0x4b1
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3145
 	.byte	0x1
 	.2byte	0x4b2
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3146
 	.byte	0x1
 	.2byte	0x4b3
 	.4byte	0x110
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3142
+	.4byte	.LASF3147
 	.byte	0x1
 	.2byte	0x47b
 	.byte	0x1
-	.4byte	0x130b9
+	.4byte	0x131d3
 	.uleb128 0x66
-	.4byte	.LASF3128
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x47b
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3129
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x47c
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3130
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x47c
 	.4byte	0xac0
@@ -45841,27 +46040,27 @@ __exitcall_ebc_exit:
 	.2byte	0x47f
 	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3134
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x480
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3135
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x480
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3132
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x480
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3133
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x480
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3136
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x481
 	.4byte	0xc138
@@ -45886,7 +46085,7 @@ __exitcall_ebc_exit:
 	.2byte	0x483
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3137
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x484
 	.4byte	0xc6
@@ -45902,23 +46101,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3143
+	.4byte	.LASF3148
 	.byte	0x1
 	.2byte	0x452
 	.byte	0x1
-	.4byte	0x1318f
+	.4byte	0x132a9
 	.uleb128 0x66
-	.4byte	.LASF3128
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x452
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3129
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x453
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3130
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x453
 	.4byte	0xac0
@@ -45933,27 +46132,27 @@ __exitcall_ebc_exit:
 	.2byte	0x456
 	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3134
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x457
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3135
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x457
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3132
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x457
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3133
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x457
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3136
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x458
 	.4byte	0xc138
@@ -45978,7 +46177,7 @@ __exitcall_ebc_exit:
 	.2byte	0x45a
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3137
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x45b
 	.4byte	0xc6
@@ -45994,29 +46193,29 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3144
+	.4byte	.LASF3149
 	.byte	0x1
 	.2byte	0x43c
 	.8byte	.LFB2820
 	.8byte	.LFE2820-.LFB2820
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1368a
+	.4byte	0x137a4
 	.uleb128 0x75
-	.4byte	.LASF3128
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x43c
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x59
-	.4byte	.LASF3129
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x43d
 	.4byte	0xac0
 	.4byte	.LLST107
 	.uleb128 0x59
-	.4byte	.LASF3130
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x43d
 	.4byte	0xac0
@@ -46028,436 +46227,436 @@ __exitcall_ebc_exit:
 	.4byte	0xe874
 	.4byte	.LLST109
 	.uleb128 0x54
-	.4byte	0x1368a
-	.8byte	.LBB1256
-	.8byte	.LBE1256-.LBB1256
+	.4byte	0x137a4
+	.8byte	.LBB1262
+	.8byte	.LBE1262-.LBB1262
 	.byte	0x1
 	.2byte	0x44d
-	.4byte	0x13298
+	.4byte	0x133b2
 	.uleb128 0x55
-	.4byte	0x136bb
+	.4byte	0x137d5
 	.uleb128 0x55
-	.4byte	0x136bb
+	.4byte	0x137d5
 	.uleb128 0x55
-	.4byte	0x136bb
+	.4byte	0x137d5
 	.uleb128 0x55
-	.4byte	0x136af
+	.4byte	0x137c9
 	.uleb128 0x72
-	.4byte	0x136a3
+	.4byte	0x137bd
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x13697
+	.4byte	0x137b1
 	.uleb128 0x57
-	.8byte	.LBB1257
-	.8byte	.LBE1257-.LBB1257
+	.8byte	.LBB1263
+	.8byte	.LBE1263-.LBB1263
 	.uleb128 0x58
-	.4byte	0x136c7
+	.4byte	0x137e1
 	.uleb128 0x61
-	.4byte	0x136d3
+	.4byte	0x137ed
 	.4byte	.LLST110
 	.uleb128 0x58
-	.4byte	0x136df
+	.4byte	0x137f9
 	.uleb128 0x58
-	.4byte	0x136eb
+	.4byte	0x13805
 	.uleb128 0x58
-	.4byte	0x136f7
+	.4byte	0x13811
 	.uleb128 0x58
-	.4byte	0x13703
+	.4byte	0x1381d
 	.uleb128 0x61
-	.4byte	0x1370f
+	.4byte	0x13829
 	.4byte	.LLST111
 	.uleb128 0x61
-	.4byte	0x1371b
+	.4byte	0x13835
 	.4byte	.LLST112
 	.uleb128 0x58
-	.4byte	0x13727
+	.4byte	0x13841
 	.uleb128 0x61
-	.4byte	0x13733
+	.4byte	0x1384d
 	.4byte	.LLST113
 	.uleb128 0x58
-	.4byte	0x1373d
+	.4byte	0x13857
 	.uleb128 0x61
-	.4byte	0x13747
+	.4byte	0x13861
 	.4byte	.LLST114
 	.uleb128 0x61
-	.4byte	0x13753
+	.4byte	0x1386d
 	.4byte	.LLST115
 	.uleb128 0x58
-	.4byte	0x1375f
+	.4byte	0x13879
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13a12
-	.8byte	.LBB1258
-	.8byte	.LBE1258-.LBB1258
+	.4byte	0x13b2c
+	.8byte	.LBB1264
+	.8byte	.LBE1264-.LBB1264
 	.byte	0x1
 	.2byte	0x446
-	.4byte	0x133e6
+	.4byte	0x13500
 	.uleb128 0x55
-	.4byte	0x13a43
+	.4byte	0x13b5d
 	.uleb128 0x55
-	.4byte	0x13a43
+	.4byte	0x13b5d
 	.uleb128 0x55
-	.4byte	0x13a43
+	.4byte	0x13b5d
 	.uleb128 0x55
-	.4byte	0x13a37
+	.4byte	0x13b51
 	.uleb128 0x55
-	.4byte	0x13a2b
+	.4byte	0x13b45
 	.uleb128 0x55
-	.4byte	0x13a1f
+	.4byte	0x13b39
 	.uleb128 0x57
-	.8byte	.LBB1259
-	.8byte	.LBE1259-.LBB1259
+	.8byte	.LBB1265
+	.8byte	.LBE1265-.LBB1265
 	.uleb128 0x58
-	.4byte	0x13a4f
+	.4byte	0x13b69
 	.uleb128 0x61
-	.4byte	0x13a5b
+	.4byte	0x13b75
 	.4byte	.LLST116
 	.uleb128 0x58
-	.4byte	0x13a65
+	.4byte	0x13b7f
 	.uleb128 0x61
-	.4byte	0x13a6f
+	.4byte	0x13b89
 	.4byte	.LLST117
 	.uleb128 0x58
-	.4byte	0x13a7b
+	.4byte	0x13b95
 	.uleb128 0x61
-	.4byte	0x13a87
+	.4byte	0x13ba1
 	.4byte	.LLST118
 	.uleb128 0x61
-	.4byte	0x13a93
+	.4byte	0x13bad
 	.4byte	.LLST119
 	.uleb128 0x61
-	.4byte	0x13a9f
+	.4byte	0x13bb9
 	.4byte	.LLST120
 	.uleb128 0x61
-	.4byte	0x13aab
+	.4byte	0x13bc5
 	.4byte	.LLST121
 	.uleb128 0x61
-	.4byte	0x13ab7
+	.4byte	0x13bd1
 	.4byte	.LLST122
 	.uleb128 0x61
-	.4byte	0x13ac3
+	.4byte	0x13bdd
 	.4byte	.LLST123
 	.uleb128 0x61
-	.4byte	0x13acf
+	.4byte	0x13be9
 	.4byte	.LLST124
 	.uleb128 0x58
-	.4byte	0x13adb
+	.4byte	0x13bf5
 	.uleb128 0x5c
-	.4byte	0x14202
-	.8byte	.LBB1260
+	.4byte	0x1431c
+	.8byte	.LBB1266
 	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
 	.2byte	0x359
-	.4byte	0x13370
+	.4byte	0x1348a
 	.uleb128 0x55
-	.4byte	0x1422a
+	.4byte	0x14344
 	.uleb128 0x55
-	.4byte	0x1421e
+	.4byte	0x14338
 	.uleb128 0x55
-	.4byte	0x14212
+	.4byte	0x1432c
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14202
-	.8byte	.LBB1265
+	.4byte	0x1431c
+	.8byte	.LBB1271
 	.4byte	.Ldebug_ranges0+0x720
 	.byte	0x1
 	.2byte	0x35a
-	.4byte	0x13398
+	.4byte	0x134b2
 	.uleb128 0x55
-	.4byte	0x1422a
+	.4byte	0x14344
 	.uleb128 0x55
-	.4byte	0x1421e
+	.4byte	0x14338
 	.uleb128 0x55
-	.4byte	0x14212
+	.4byte	0x1432c
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x14202
-	.8byte	.LBB1277
+	.4byte	0x1431c
+	.8byte	.LBB1283
 	.4byte	.Ldebug_ranges0+0x790
 	.byte	0x1
 	.2byte	0x35b
-	.4byte	0x133c0
+	.4byte	0x134da
 	.uleb128 0x55
-	.4byte	0x1422a
+	.4byte	0x14344
 	.uleb128 0x55
-	.4byte	0x1421e
+	.4byte	0x14338
 	.uleb128 0x55
-	.4byte	0x14212
+	.4byte	0x1432c
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x14202
-	.8byte	.LBB1289
+	.4byte	0x1431c
+	.8byte	.LBB1295
 	.4byte	.Ldebug_ranges0+0x800
 	.byte	0x1
 	.2byte	0x35c
 	.uleb128 0x55
-	.4byte	0x1422a
+	.4byte	0x14344
 	.uleb128 0x55
-	.4byte	0x1421e
+	.4byte	0x14338
 	.uleb128 0x55
-	.4byte	0x14212
+	.4byte	0x1432c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1376c
-	.8byte	.LBB1300
-	.8byte	.LBE1300-.LBB1300
+	.4byte	0x13886
+	.8byte	.LBB1306
+	.8byte	.LBE1306-.LBB1306
 	.byte	0x1
 	.2byte	0x44b
-	.4byte	0x1348f
+	.4byte	0x135a9
 	.uleb128 0x55
-	.4byte	0x1379d
+	.4byte	0x138b7
 	.uleb128 0x55
-	.4byte	0x1379d
+	.4byte	0x138b7
 	.uleb128 0x55
-	.4byte	0x1379d
+	.4byte	0x138b7
 	.uleb128 0x55
-	.4byte	0x13791
+	.4byte	0x138ab
 	.uleb128 0x72
-	.4byte	0x13785
+	.4byte	0x1389f
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x55
-	.4byte	0x13779
+	.4byte	0x13893
 	.uleb128 0x57
-	.8byte	.LBB1301
-	.8byte	.LBE1301-.LBB1301
+	.8byte	.LBB1307
+	.8byte	.LBE1307-.LBB1307
 	.uleb128 0x58
-	.4byte	0x137a9
+	.4byte	0x138c3
 	.uleb128 0x58
-	.4byte	0x137b5
+	.4byte	0x138cf
 	.uleb128 0x58
-	.4byte	0x137c1
+	.4byte	0x138db
 	.uleb128 0x58
-	.4byte	0x137cd
+	.4byte	0x138e7
 	.uleb128 0x58
-	.4byte	0x137d9
+	.4byte	0x138f3
 	.uleb128 0x58
-	.4byte	0x137e5
+	.4byte	0x138ff
 	.uleb128 0x61
-	.4byte	0x137f1
+	.4byte	0x1390b
 	.4byte	.LLST125
 	.uleb128 0x61
-	.4byte	0x137fd
+	.4byte	0x13917
 	.4byte	.LLST126
 	.uleb128 0x58
-	.4byte	0x13809
+	.4byte	0x13923
 	.uleb128 0x61
-	.4byte	0x13815
+	.4byte	0x1392f
 	.4byte	.LLST127
 	.uleb128 0x58
-	.4byte	0x1381f
+	.4byte	0x13939
 	.uleb128 0x61
-	.4byte	0x13829
+	.4byte	0x13943
 	.4byte	.LLST128
 	.uleb128 0x61
-	.4byte	0x13835
+	.4byte	0x1394f
 	.4byte	.LLST129
 	.uleb128 0x58
-	.4byte	0x13841
+	.4byte	0x1395b
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1393c
-	.8byte	.LBB1302
-	.8byte	.LBE1302-.LBB1302
+	.4byte	0x13a56
+	.8byte	.LBB1308
+	.8byte	.LBE1308-.LBB1308
 	.byte	0x1
 	.2byte	0x448
-	.4byte	0x13589
+	.4byte	0x136a3
 	.uleb128 0x55
-	.4byte	0x1396d
+	.4byte	0x13a87
 	.uleb128 0x55
-	.4byte	0x1396d
+	.4byte	0x13a87
 	.uleb128 0x55
-	.4byte	0x1396d
+	.4byte	0x13a87
 	.uleb128 0x55
-	.4byte	0x13961
+	.4byte	0x13a7b
 	.uleb128 0x55
-	.4byte	0x13955
+	.4byte	0x13a6f
 	.uleb128 0x55
-	.4byte	0x13949
+	.4byte	0x13a63
 	.uleb128 0x57
-	.8byte	.LBB1303
-	.8byte	.LBE1303-.LBB1303
+	.8byte	.LBB1309
+	.8byte	.LBE1309-.LBB1309
 	.uleb128 0x58
-	.4byte	0x13979
+	.4byte	0x13a93
 	.uleb128 0x61
-	.4byte	0x13985
+	.4byte	0x13a9f
 	.4byte	.LLST130
 	.uleb128 0x58
-	.4byte	0x1398f
+	.4byte	0x13aa9
 	.uleb128 0x61
-	.4byte	0x13999
+	.4byte	0x13ab3
 	.4byte	.LLST131
 	.uleb128 0x61
-	.4byte	0x139a5
+	.4byte	0x13abf
 	.4byte	.LLST132
 	.uleb128 0x61
-	.4byte	0x139b1
+	.4byte	0x13acb
 	.4byte	.LLST133
 	.uleb128 0x58
-	.4byte	0x139bd
+	.4byte	0x13ad7
 	.uleb128 0x62
-	.4byte	0x139c9
+	.4byte	0x13ae3
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x139d5
+	.4byte	0x13aef
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x139e1
+	.4byte	0x13afb
 	.4byte	.LLST134
 	.uleb128 0x61
-	.4byte	0x139ed
+	.4byte	0x13b07
 	.4byte	.LLST135
 	.uleb128 0x61
-	.4byte	0x139f9
+	.4byte	0x13b13
 	.4byte	.LLST136
 	.uleb128 0x58
-	.4byte	0x13a05
+	.4byte	0x13b1f
 	.uleb128 0x5c
-	.4byte	0x14202
-	.8byte	.LBB1304
+	.4byte	0x1431c
+	.8byte	.LBB1310
 	.4byte	.Ldebug_ranges0+0x850
 	.byte	0x1
 	.2byte	0x381
-	.4byte	0x13563
+	.4byte	0x1367d
 	.uleb128 0x55
-	.4byte	0x1422a
+	.4byte	0x14344
 	.uleb128 0x55
-	.4byte	0x1421e
+	.4byte	0x14338
 	.uleb128 0x55
-	.4byte	0x14212
+	.4byte	0x1432c
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x14202
-	.8byte	.LBB1311
+	.4byte	0x1431c
+	.8byte	.LBB1317
 	.4byte	.Ldebug_ranges0+0x8b0
 	.byte	0x1
 	.2byte	0x382
 	.uleb128 0x55
-	.4byte	0x1422a
+	.4byte	0x14344
 	.uleb128 0x55
-	.4byte	0x1421e
+	.4byte	0x14338
 	.uleb128 0x55
-	.4byte	0x14212
+	.4byte	0x1432c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x1384e
-	.8byte	.LBB1322
-	.8byte	.LBE1322-.LBB1322
+	.4byte	0x13968
+	.8byte	.LBB1328
+	.8byte	.LBE1328-.LBB1328
 	.byte	0x1
 	.2byte	0x442
 	.uleb128 0x55
-	.4byte	0x1387f
+	.4byte	0x13999
 	.uleb128 0x55
-	.4byte	0x1387f
+	.4byte	0x13999
 	.uleb128 0x55
-	.4byte	0x1387f
+	.4byte	0x13999
 	.uleb128 0x55
-	.4byte	0x13873
+	.4byte	0x1398d
 	.uleb128 0x55
-	.4byte	0x13867
+	.4byte	0x13981
 	.uleb128 0x55
-	.4byte	0x1385b
+	.4byte	0x13975
 	.uleb128 0x57
-	.8byte	.LBB1323
-	.8byte	.LBE1323-.LBB1323
+	.8byte	.LBB1329
+	.8byte	.LBE1329-.LBB1329
 	.uleb128 0x58
-	.4byte	0x1388b
+	.4byte	0x139a5
 	.uleb128 0x61
-	.4byte	0x13897
+	.4byte	0x139b1
 	.4byte	.LLST137
 	.uleb128 0x58
-	.4byte	0x138a1
+	.4byte	0x139bb
 	.uleb128 0x61
-	.4byte	0x138ab
+	.4byte	0x139c5
 	.4byte	.LLST138
 	.uleb128 0x61
-	.4byte	0x138b7
+	.4byte	0x139d1
 	.4byte	.LLST139
 	.uleb128 0x61
-	.4byte	0x138c3
+	.4byte	0x139dd
 	.4byte	.LLST140
 	.uleb128 0x58
-	.4byte	0x138cf
+	.4byte	0x139e9
 	.uleb128 0x62
-	.4byte	0x138db
+	.4byte	0x139f5
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x138e7
+	.4byte	0x13a01
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x138f3
+	.4byte	0x13a0d
 	.4byte	.LLST141
 	.uleb128 0x61
-	.4byte	0x138ff
+	.4byte	0x13a19
 	.4byte	.LLST142
 	.uleb128 0x61
-	.4byte	0x1390b
+	.4byte	0x13a25
 	.4byte	.LLST143
 	.uleb128 0x58
-	.4byte	0x13917
+	.4byte	0x13a31
 	.uleb128 0x58
-	.4byte	0x13923
+	.4byte	0x13a3d
 	.uleb128 0x58
-	.4byte	0x1392f
+	.4byte	0x13a49
 	.uleb128 0x5c
-	.4byte	0x141cd
-	.8byte	.LBB1324
+	.4byte	0x142e7
+	.8byte	.LBB1330
 	.4byte	.Ldebug_ranges0+0x900
 	.byte	0x1
 	.2byte	0x3a8
-	.4byte	0x13663
+	.4byte	0x1377d
 	.uleb128 0x55
-	.4byte	0x141f5
+	.4byte	0x1430f
 	.uleb128 0x55
-	.4byte	0x141e9
+	.4byte	0x14303
 	.uleb128 0x55
-	.4byte	0x141dd
+	.4byte	0x142f7
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x141cd
-	.8byte	.LBB1330
+	.4byte	0x142e7
+	.8byte	.LBB1336
 	.4byte	.Ldebug_ranges0+0x960
 	.byte	0x1
 	.2byte	0x3a9
 	.uleb128 0x55
-	.4byte	0x141f5
+	.4byte	0x1430f
 	.uleb128 0x55
-	.4byte	0x141e9
+	.4byte	0x14303
 	.uleb128 0x55
-	.4byte	0x141dd
+	.4byte	0x142f7
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3145
+	.4byte	.LASF3150
 	.byte	0x1
 	.2byte	0x3f5
 	.byte	0x1
-	.4byte	0x1376c
+	.4byte	0x13886
 	.uleb128 0x66
-	.4byte	.LASF3128
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x3f5
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3129
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x3f6
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3130
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x3f6
 	.4byte	0xac0
@@ -46472,22 +46671,22 @@ __exitcall_ebc_exit:
 	.2byte	0x3f9
 	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3132
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x3fa
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3133
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x3fa
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3134
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x3fb
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3135
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x3fb
 	.4byte	0x110
@@ -46497,7 +46696,7 @@ __exitcall_ebc_exit:
 	.2byte	0x3fb
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3136
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x3fc
 	.4byte	0xc138
@@ -46522,7 +46721,7 @@ __exitcall_ebc_exit:
 	.2byte	0x3fe
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3137
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x3ff
 	.4byte	0xc6
@@ -46538,23 +46737,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3146
+	.4byte	.LASF3151
 	.byte	0x1
 	.2byte	0x3af
 	.byte	0x1
-	.4byte	0x1384e
+	.4byte	0x13968
 	.uleb128 0x66
-	.4byte	.LASF3128
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x3af
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3129
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x3b0
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3130
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x3b0
 	.4byte	0xac0
@@ -46569,22 +46768,22 @@ __exitcall_ebc_exit:
 	.2byte	0x3b3
 	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3132
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x3b4
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3133
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x3b4
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3134
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x3b5
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3135
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x3b5
 	.4byte	0x110
@@ -46594,7 +46793,7 @@ __exitcall_ebc_exit:
 	.2byte	0x3b5
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3136
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x3b6
 	.4byte	0xc138
@@ -46619,7 +46818,7 @@ __exitcall_ebc_exit:
 	.2byte	0x3b8
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3137
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x3b9
 	.4byte	0xc6
@@ -46635,23 +46834,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3147
+	.4byte	.LASF3152
 	.byte	0x1
 	.2byte	0x388
 	.byte	0x1
-	.4byte	0x1393c
+	.4byte	0x13a56
 	.uleb128 0x66
-	.4byte	.LASF3128
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x388
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3129
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x389
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3130
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x389
 	.4byte	0xac0
@@ -46686,32 +46885,32 @@ __exitcall_ebc_exit:
 	.2byte	0x38f
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3134
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x390
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3135
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x390
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3132
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x390
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3133
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x390
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3136
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x391
 	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF3137
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x392
 	.4byte	0xc6
@@ -46726,34 +46925,34 @@ __exitcall_ebc_exit:
 	.2byte	0x394
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3145
 	.byte	0x1
 	.2byte	0x395
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3146
 	.byte	0x1
 	.2byte	0x396
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3148
+	.4byte	.LASF3153
 	.byte	0x1
 	.2byte	0x363
 	.byte	0x1
-	.4byte	0x13a12
+	.4byte	0x13b2c
 	.uleb128 0x66
-	.4byte	.LASF3128
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x363
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3129
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x364
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3130
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x364
 	.4byte	0xac0
@@ -46788,32 +46987,32 @@ __exitcall_ebc_exit:
 	.2byte	0x36a
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3134
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x36b
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3135
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x36b
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3132
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x36b
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3133
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x36b
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3136
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x36c
 	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF3137
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x36d
 	.4byte	0xc6
@@ -46829,23 +47028,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3149
+	.4byte	.LASF3154
 	.byte	0x1
 	.2byte	0x33b
 	.byte	0x1
-	.4byte	0x13ae8
+	.4byte	0x13c02
 	.uleb128 0x66
-	.4byte	.LASF3128
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x33b
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3129
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x33c
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3130
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x33c
 	.4byte	0xac0
@@ -46880,32 +47079,32 @@ __exitcall_ebc_exit:
 	.2byte	0x342
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3134
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x343
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3135
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x343
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3132
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x343
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3133
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x343
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3136
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x344
 	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF3137
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x345
 	.4byte	0xc6
@@ -46921,37 +47120,37 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3150
+	.4byte	.LASF3155
 	.byte	0x1
 	.2byte	0x26d
 	.8byte	.LFB2814
 	.8byte	.LFE2814-.LFB2814
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13c4f
+	.4byte	0x13d69
 	.uleb128 0x75
-	.4byte	.LASF3128
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x26d
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x75
-	.4byte	.LASF3129
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x26d
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x75
-	.4byte	.LASF3130
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x26d
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x75
-	.4byte	.LASF3151
+	.4byte	.LASF3156
 	.byte	0x1
 	.2byte	0x26e
 	.4byte	0xc138
@@ -46994,38 +47193,38 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.4byte	.LLST7
 	.uleb128 0x5a
-	.4byte	.LASF3134
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x275
 	.4byte	0x13f
 	.4byte	.LLST8
 	.uleb128 0x5a
-	.4byte	.LASF3135
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x275
 	.4byte	0x13f
 	.4byte	.LLST9
 	.uleb128 0x48
-	.4byte	.LASF3152
+	.4byte	.LASF3157
 	.byte	0x1
 	.2byte	0x275
 	.4byte	0x13f
 	.uleb128 0x4d
-	.4byte	.LASF3132
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x276
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4d
-	.4byte	.LASF3133
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x276
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5a
-	.4byte	.LASF3136
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x277
 	.4byte	0xc138
@@ -47038,14 +47237,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x4d
-	.4byte	.LASF3153
+	.4byte	.LASF3158
 	.byte	0x1
 	.2byte	0x279
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x48
-	.4byte	.LASF3154
+	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x27a
 	.4byte	0x110
@@ -47060,54 +47259,54 @@ __exitcall_ebc_exit:
 	.2byte	0x27c
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3155
+	.4byte	.LASF3160
 	.byte	0x1
 	.2byte	0x27d
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3156
+	.4byte	.LASF3161
 	.byte	0x1
 	.2byte	0x27d
 	.4byte	0x110
 	.uleb128 0x5a
-	.4byte	.LASF3157
+	.4byte	.LASF3162
 	.byte	0x1
 	.2byte	0x27e
 	.4byte	0x13f
 	.4byte	.LLST11
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3158
+	.4byte	.LASF3163
 	.byte	0x1
 	.2byte	0x1c8
 	.8byte	.LFB2813
 	.8byte	.LFE2813-.LFB2813
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13daa
+	.4byte	0x13ec4
 	.uleb128 0x75
-	.4byte	.LASF3128
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x1c8
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x75
-	.4byte	.LASF3129
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x1c8
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x75
-	.4byte	.LASF3130
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x1c8
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x75
-	.4byte	.LASF3151
+	.4byte	.LASF3156
 	.byte	0x1
 	.2byte	0x1c9
 	.4byte	0xc138
@@ -47150,33 +47349,33 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.4byte	.LLST1
 	.uleb128 0x5a
-	.4byte	.LASF3134
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x1d0
 	.4byte	0x13f
 	.4byte	.LLST2
 	.uleb128 0x5a
-	.4byte	.LASF3135
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x1d0
 	.4byte	0x13f
 	.4byte	.LLST3
 	.uleb128 0x4d
-	.4byte	.LASF3132
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x1d1
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4d
-	.4byte	.LASF3133
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x1d1
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5a
-	.4byte	.LASF3136
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x1d2
 	.4byte	0xc138
@@ -47189,14 +47388,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x4d
-	.4byte	.LASF3153
+	.4byte	.LASF3158
 	.byte	0x1
 	.2byte	0x1d4
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x48
-	.4byte	.LASF3154
+	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x1d5
 	.4byte	0x110
@@ -47211,45 +47410,45 @@ __exitcall_ebc_exit:
 	.2byte	0x1d7
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3155
+	.4byte	.LASF3160
 	.byte	0x1
 	.2byte	0x1d8
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3156
+	.4byte	.LASF3161
 	.byte	0x1
 	.2byte	0x1d8
 	.4byte	0x110
 	.uleb128 0x5a
-	.4byte	.LASF3157
+	.4byte	.LASF3162
 	.byte	0x1
 	.2byte	0x1d9
 	.4byte	0x13f
 	.4byte	.LLST5
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3159
+	.4byte	.LASF3164
 	.byte	0x1
 	.2byte	0x169
 	.byte	0x1
-	.4byte	0x13ec8
+	.4byte	0x13fe2
 	.uleb128 0x66
-	.4byte	.LASF3160
+	.4byte	.LASF3165
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3161
+	.4byte	.LASF3166
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3162
+	.4byte	.LASF3167
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3151
+	.4byte	.LASF3156
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0x46f4
@@ -47274,47 +47473,47 @@ __exitcall_ebc_exit:
 	.2byte	0x16c
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3163
+	.4byte	.LASF3168
 	.byte	0x1
 	.2byte	0x16d
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3164
+	.4byte	.LASF3169
 	.byte	0x1
 	.2byte	0x16d
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3165
+	.4byte	.LASF3170
 	.byte	0x1
 	.2byte	0x16d
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3166
+	.4byte	.LASF3171
 	.byte	0x1
 	.2byte	0x16e
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3167
+	.4byte	.LASF3172
 	.byte	0x1
 	.2byte	0x16e
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3168
+	.4byte	.LASF3173
 	.byte	0x1
 	.2byte	0x16e
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3154
+	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x16f
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3153
+	.4byte	.LASF3158
 	.byte	0x1
 	.2byte	0x170
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3169
+	.4byte	.LASF3174
 	.byte	0x1
 	.2byte	0x171
 	.4byte	0x13f
@@ -47350,14 +47549,14 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x76
-	.4byte	.LASF3170
+	.4byte	.LASF3175
 	.byte	0x1
 	.2byte	0x152
 	.8byte	.LFB2811
 	.8byte	.LFE2811-.LFB2811
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13f58
+	.4byte	0x14072
 	.uleb128 0x59
 	.4byte	.LASF2288
 	.byte	0x1
@@ -47378,45 +47577,45 @@ __exitcall_ebc_exit:
 	.4byte	.LLST236
 	.uleb128 0x4f
 	.8byte	.LVL840
-	.4byte	0x15264
+	.4byte	0x1537e
 	.uleb128 0x4f
 	.8byte	.LVL842
-	.4byte	0x1401f
+	.4byte	0x14139
 	.uleb128 0x4f
 	.8byte	.LVL843
-	.4byte	0x15270
+	.4byte	0x1538a
 	.uleb128 0x4f
 	.8byte	.LVL846
-	.4byte	0x13f58
+	.4byte	0x14072
 	.uleb128 0x4f
 	.8byte	.LVL847
-	.4byte	0x15270
+	.4byte	0x1538a
 	.byte	0
 	.uleb128 0x76
-	.4byte	.LASF3171
+	.4byte	.LASF3176
 	.byte	0x1
 	.2byte	0x121
 	.8byte	.LFB2810
 	.8byte	.LFE2810-.LFB2810
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1401f
+	.4byte	0x14139
 	.uleb128 0x75
-	.4byte	.LASF3160
+	.4byte	.LASF3165
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x75
-	.4byte	.LASF3161
+	.4byte	.LASF3166
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x75
-	.4byte	.LASF3151
+	.4byte	.LASF3156
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0x46f4
@@ -47443,18 +47642,18 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x59
 	.uleb128 0x48
-	.4byte	.LASF3163
+	.4byte	.LASF3168
 	.byte	0x1
 	.2byte	0x125
 	.4byte	0x13f
 	.uleb128 0x5a
-	.4byte	.LASF3164
+	.4byte	.LASF3169
 	.byte	0x1
 	.2byte	0x125
 	.4byte	0x13f
 	.4byte	.LLST231
 	.uleb128 0x5a
-	.4byte	.LASF3154
+	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x126
 	.4byte	0x15a
@@ -47472,44 +47671,44 @@ __exitcall_ebc_exit:
 	.2byte	0x127
 	.4byte	0xc6
 	.uleb128 0x5a
-	.4byte	.LASF3169
+	.4byte	.LASF3174
 	.byte	0x1
 	.2byte	0x128
 	.4byte	0x13f
 	.4byte	.LLST233
 	.byte	0
 	.uleb128 0x77
-	.4byte	.LASF3172
+	.4byte	.LASF3177
 	.byte	0x1
 	.byte	0xd6
 	.8byte	.LFB2809
 	.8byte	.LFE2809-.LFB2809
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14104
+	.4byte	0x1421e
 	.uleb128 0x78
-	.4byte	.LASF3160
+	.4byte	.LASF3165
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x78
-	.4byte	.LASF3161
+	.4byte	.LASF3166
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x78
-	.4byte	.LASF3162
+	.4byte	.LASF3167
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x78
-	.4byte	.LASF3151
+	.4byte	.LASF3156
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0x46f4
@@ -47542,24 +47741,24 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x7a
-	.4byte	.LASF3163
+	.4byte	.LASF3168
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x13f
 	.uleb128 0x7b
-	.4byte	.LASF3164
+	.4byte	.LASF3169
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x13f
 	.4byte	.LLST226
 	.uleb128 0x7b
-	.4byte	.LASF3165
+	.4byte	.LASF3170
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x13f
 	.4byte	.LLST227
 	.uleb128 0x7b
-	.4byte	.LASF3154
+	.4byte	.LASF3159
 	.byte	0x1
 	.byte	0xdb
 	.4byte	0x15a
@@ -47577,26 +47776,26 @@ __exitcall_ebc_exit:
 	.byte	0xdc
 	.4byte	0xc6
 	.uleb128 0x7b
-	.4byte	.LASF3169
+	.4byte	.LASF3174
 	.byte	0x1
 	.byte	0xdd
 	.4byte	0x13f
 	.4byte	.LLST229
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3173
+	.4byte	.LASF3178
 	.byte	0x1
 	.byte	0xb7
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x14137
+	.4byte	0x14251
 	.uleb128 0x7f
 	.string	"ebc"
 	.byte	0x1
 	.byte	0xb7
 	.4byte	0xe557
 	.uleb128 0x80
-	.4byte	.LASF3174
+	.4byte	.LASF3179
 	.byte	0x1
 	.byte	0xb7
 	.4byte	0xc6
@@ -47607,123 +47806,123 @@ __exitcall_ebc_exit:
 	.4byte	0xe874
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3175
+	.4byte	.LASF3180
 	.byte	0x1
 	.byte	0xa5
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x14182
+	.4byte	0x1429c
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
 	.byte	0xa5
 	.4byte	0xc138
 	.uleb128 0x80
-	.4byte	.LASF3134
+	.4byte	.LASF3139
 	.byte	0x1
 	.byte	0xa5
 	.4byte	0x11f
 	.uleb128 0x80
-	.4byte	.LASF3135
+	.4byte	.LASF3140
 	.byte	0x1
 	.byte	0xa5
 	.4byte	0x11f
 	.uleb128 0x7a
-	.4byte	.LASF3176
+	.4byte	.LASF3181
 	.byte	0x1
 	.byte	0xa7
 	.4byte	0x110
 	.uleb128 0x7a
-	.4byte	.LASF3157
+	.4byte	.LASF3162
 	.byte	0x1
 	.byte	0xa8
 	.4byte	0x11f
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3177
+	.4byte	.LASF3182
 	.byte	0x1
 	.byte	0x8f
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x141cd
+	.4byte	0x142e7
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
 	.byte	0x8f
 	.4byte	0xc138
 	.uleb128 0x80
-	.4byte	.LASF3134
+	.4byte	.LASF3139
 	.byte	0x1
 	.byte	0x8f
 	.4byte	0x11f
 	.uleb128 0x80
-	.4byte	.LASF3135
+	.4byte	.LASF3140
 	.byte	0x1
 	.byte	0x8f
 	.4byte	0x11f
 	.uleb128 0x7a
-	.4byte	.LASF3176
+	.4byte	.LASF3181
 	.byte	0x1
 	.byte	0x91
 	.4byte	0x110
 	.uleb128 0x7a
-	.4byte	.LASF3157
+	.4byte	.LASF3162
 	.byte	0x1
 	.byte	0x92
 	.4byte	0x11f
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3178
+	.4byte	.LASF3183
 	.byte	0x1
 	.byte	0x89
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x14202
+	.4byte	0x1431c
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
 	.byte	0x89
 	.4byte	0xc138
 	.uleb128 0x80
-	.4byte	.LASF3134
+	.4byte	.LASF3139
 	.byte	0x1
 	.byte	0x89
 	.4byte	0x11f
 	.uleb128 0x80
-	.4byte	.LASF3135
+	.4byte	.LASF3140
 	.byte	0x1
 	.byte	0x89
 	.4byte	0x11f
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3179
+	.4byte	.LASF3184
 	.byte	0x1
 	.byte	0x83
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x14237
+	.4byte	0x14351
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
 	.byte	0x83
 	.4byte	0xc138
 	.uleb128 0x80
-	.4byte	.LASF3134
+	.4byte	.LASF3139
 	.byte	0x1
 	.byte	0x83
 	.4byte	0x11f
 	.uleb128 0x80
-	.4byte	.LASF3135
+	.4byte	.LASF3140
 	.byte	0x1
 	.byte	0x83
 	.4byte	0x11f
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3180
+	.4byte	.LASF3185
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x1425d
+	.4byte	0x14377
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
@@ -47736,65 +47935,65 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3181
+	.4byte	.LASF3186
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x1428f
+	.4byte	0x143a9
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0xe1b4
 	.uleb128 0x80
-	.4byte	.LASF3182
+	.4byte	.LASF3187
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13f
 	.uleb128 0x80
-	.4byte	.LASF3183
+	.4byte	.LASF3188
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3184
+	.4byte	.LASF3189
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x142d9
+	.4byte	0x143f3
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xe1b4
 	.uleb128 0x80
-	.4byte	.LASF3185
+	.4byte	.LASF3190
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xc6
 	.uleb128 0x80
-	.4byte	.LASF3186
+	.4byte	.LASF3191
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x80
-	.4byte	.LASF3187
+	.4byte	.LASF3192
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x80
-	.4byte	.LASF3188
+	.4byte	.LASF3193
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3189
+	.4byte	.LASF3194
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x142f3
+	.4byte	0x1440d
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
@@ -47802,12 +48001,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe1b4
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3190
+	.4byte	.LASF3195
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1431c
+	.4byte	0x14436
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0xb
@@ -47820,11 +48019,11 @@ __exitcall_ebc_exit:
 	.4byte	0xe1f4
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3191
+	.4byte	.LASF3196
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x14366
+	.4byte	0x14480
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
@@ -47852,12 +48051,12 @@ __exitcall_ebc_exit:
 	.4byte	0xb829
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3192
+	.4byte	.LASF3197
 	.byte	0xa
 	.2byte	0x108
 	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x14384
+	.4byte	0x1449e
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
@@ -47865,12 +48064,12 @@ __exitcall_ebc_exit:
 	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3193
+	.4byte	.LASF3198
 	.byte	0xc8
 	.byte	0x1d
 	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x143a0
+	.4byte	0x144ba
 	.uleb128 0x7f
 	.string	"bus"
 	.byte	0xc8
@@ -47878,31 +48077,31 @@ __exitcall_ebc_exit:
 	.4byte	0xae47
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3194
+	.4byte	.LASF3199
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x143bd
+	.4byte	0x144d7
 	.uleb128 0x80
-	.4byte	.LASF3195
+	.4byte	.LASF3200
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3196
+	.4byte	.LASF3201
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x143fa
+	.4byte	0x14514
 	.uleb128 0x7f
 	.string	"dev"
 	.byte	0xcb
 	.byte	0xa3
 	.4byte	0xa5e0
 	.uleb128 0x80
-	.4byte	.LASF3197
+	.4byte	.LASF3202
 	.byte	0xcb
 	.byte	0xa4
 	.4byte	0x325
@@ -47912,18 +48111,18 @@ __exitcall_ebc_exit:
 	.byte	0xa5
 	.4byte	0x2e3
 	.uleb128 0x80
-	.4byte	.LASF3198
+	.4byte	.LASF3203
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3199
+	.4byte	.LASF3204
 	.byte	0x3
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14417
+	.4byte	0x14531
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -47931,12 +48130,12 @@ __exitcall_ebc_exit:
 	.4byte	0xdbb4
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3200
+	.4byte	.LASF3205
 	.byte	0x3
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1443d
+	.4byte	0x14557
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -47949,11 +48148,11 @@ __exitcall_ebc_exit:
 	.4byte	0x46ee
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3201
+	.4byte	.LASF3206
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x14457
+	.4byte	0x14571
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -47961,11 +48160,11 @@ __exitcall_ebc_exit:
 	.4byte	0xdbb4
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3202
+	.4byte	.LASF3207
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x14471
+	.4byte	0x1458b
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -47973,11 +48172,11 @@ __exitcall_ebc_exit:
 	.4byte	0xdbb4
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3203
+	.4byte	.LASF3208
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x1448b
+	.4byte	0x145a5
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -47985,11 +48184,11 @@ __exitcall_ebc_exit:
 	.4byte	0xdbb4
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3204
+	.4byte	.LASF3209
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x144a5
+	.4byte	0x145bf
 	.uleb128 0x80
 	.4byte	.LASF2952
 	.byte	0x3
@@ -47997,16 +48196,16 @@ __exitcall_ebc_exit:
 	.4byte	0xdbb4
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3205
+	.4byte	.LASF3210
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x144bf
+	.4byte	0x145d9
 	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x144bf
+	.4byte	0x145d9
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -48016,24 +48215,24 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x144df
+	.4byte	0x145f9
 	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x144bf
+	.4byte	0x145d9
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3206
+	.4byte	.LASF3211
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x1451b
+	.4byte	0x14635
 	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x144bf
+	.4byte	0x145d9
 	.uleb128 0x80
 	.4byte	.LASF193
 	.byte	0x4
@@ -48051,12 +48250,12 @@ __exitcall_ebc_exit:
 	.4byte	0xad7d
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3207
+	.4byte	.LASF3212
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1454b
+	.4byte	0x14665
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -48074,12 +48273,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3208
+	.4byte	.LASF3213
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1457b
+	.4byte	0x14695
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -48097,12 +48296,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3209
+	.4byte	.LASF3214
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x145ab
+	.4byte	0x146c5
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -48120,12 +48319,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3210
+	.4byte	.LASF3215
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x145e6
+	.4byte	0x14700
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -48148,37 +48347,37 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3211
+	.4byte	.LASF3216
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x1461a
+	.4byte	0x14734
 	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x30bc
 	.uleb128 0x7a
-	.4byte	.LASF3212
+	.4byte	.LASF3217
 	.byte	0x6
 	.byte	0xf7
 	.4byte	0x458
 	.uleb128 0x68
 	.uleb128 0x7a
-	.4byte	.LASF3213
+	.4byte	.LASF3218
 	.byte	0x6
 	.byte	0xfe
 	.4byte	0x15a
 	.byte	0
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3214
+	.4byte	.LASF3219
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14666
+	.4byte	0x14780
 	.uleb128 0x80
 	.4byte	.LASF1164
 	.byte	0x6
@@ -48195,25 +48394,25 @@ __exitcall_ebc_exit:
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x7a
-	.4byte	.LASF3215
+	.4byte	.LASF3220
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x68
 	.uleb128 0x7a
-	.4byte	.LASF3213
+	.4byte	.LASF3218
 	.byte	0x6
 	.byte	0x56
 	.4byte	0x15a
 	.byte	0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3216
+	.4byte	.LASF3221
 	.byte	0x12
 	.2byte	0x2e5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14690
+	.4byte	0x147aa
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x12
@@ -48226,12 +48425,12 @@ __exitcall_ebc_exit:
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3217
+	.4byte	.LASF3222
 	.byte	0x12
 	.2byte	0x216
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x146c8
+	.4byte	0x147e2
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x12
@@ -48251,12 +48450,12 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3218
+	.4byte	.LASF3223
 	.byte	0x12
 	.2byte	0x1dd
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x146fe
+	.4byte	0x14818
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x12
@@ -48268,18 +48467,18 @@ __exitcall_ebc_exit:
 	.2byte	0x1dd
 	.4byte	0x330
 	.uleb128 0x48
-	.4byte	.LASF3219
+	.4byte	.LASF3224
 	.byte	0x12
 	.2byte	0x1df
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3220
+	.4byte	.LASF3225
 	.byte	0x12
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x1471c
+	.4byte	0x14836
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x12
@@ -48287,12 +48486,12 @@ __exitcall_ebc_exit:
 	.4byte	0x2e3
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3221
+	.4byte	.LASF3226
 	.byte	0x12
 	.2byte	0x13d
 	.4byte	0xd813
 	.byte	0x3
-	.4byte	0x1473a
+	.4byte	0x14854
 	.uleb128 0x66
 	.4byte	.LASF171
 	.byte	0x12
@@ -48300,11 +48499,11 @@ __exitcall_ebc_exit:
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3222
+	.4byte	.LASF3227
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x14760
+	.4byte	0x1487a
 	.uleb128 0x80
 	.4byte	.LASF3052
 	.byte	0xbe
@@ -48317,79 +48516,79 @@ __exitcall_ebc_exit:
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3223
+	.4byte	.LASF3228
 	.byte	0xbe
 	.byte	0xd6
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x1477d
+	.4byte	0x14897
 	.uleb128 0x80
 	.4byte	.LASF3052
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x1477d
+	.4byte	0x14897
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xd6e2
 	.uleb128 0x64
-	.4byte	.LASF3224
+	.4byte	.LASF3229
 	.byte	0xa3
 	.2byte	0x164
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x147a1
+	.4byte	0x148bb
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x147a1
+	.4byte	0x148bb
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc133
 	.uleb128 0x64
-	.4byte	.LASF3225
+	.4byte	.LASF3230
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x147dc
+	.4byte	0x148f6
 	.uleb128 0x65
 	.string	"np"
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xbd2a
 	.uleb128 0x66
-	.4byte	.LASF3226
+	.4byte	.LASF3231
 	.byte	0xe
 	.2byte	0x499
 	.4byte	0x56
 	.uleb128 0x66
-	.4byte	.LASF3227
+	.4byte	.LASF3232
 	.byte	0xe
 	.2byte	0x49a
 	.4byte	0xac0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3228
+	.4byte	.LASF3233
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14828
+	.4byte	0x14942
 	.uleb128 0x65
 	.string	"np"
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xbd2a
 	.uleb128 0x66
-	.4byte	.LASF3226
+	.4byte	.LASF3231
 	.byte	0xe
 	.2byte	0x1f0
 	.4byte	0x56
 	.uleb128 0x66
-	.4byte	.LASF3229
+	.4byte	.LASF3234
 	.byte	0xe
 	.2byte	0x1f1
 	.4byte	0xac0
@@ -48405,11 +48604,11 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3230
+	.4byte	.LASF3235
 	.byte	0xe
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x14842
+	.4byte	0x1495c
 	.uleb128 0x80
 	.4byte	.LASF882
 	.byte	0xe
@@ -48417,11 +48616,11 @@ __exitcall_ebc_exit:
 	.4byte	0xb904
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3231
+	.4byte	.LASF3236
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x14868
+	.4byte	0x14982
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -48434,12 +48633,12 @@ __exitcall_ebc_exit:
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3232
+	.4byte	.LASF3237
 	.byte	0x2
 	.2byte	0x49b
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x14886
+	.4byte	0x149a0
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -48447,12 +48646,12 @@ __exitcall_ebc_exit:
 	.4byte	0xbb9a
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3233
+	.4byte	.LASF3238
 	.byte	0x2
 	.2byte	0x2c5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x148bc
+	.4byte	0x149d6
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -48470,12 +48669,12 @@ __exitcall_ebc_exit:
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3234
+	.4byte	.LASF3239
 	.byte	0xf
 	.byte	0xca
 	.4byte	0x351
 	.byte	0x3
-	.4byte	0x148d8
+	.4byte	0x149f2
 	.uleb128 0x7f
 	.string	"res"
 	.byte	0xf
@@ -48483,12 +48682,12 @@ __exitcall_ebc_exit:
 	.4byte	0xc244
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3235
+	.4byte	.LASF3240
 	.byte	0xcc
 	.byte	0x22
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x148f4
+	.4byte	0x14a0e
 	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0xcc
@@ -48496,12 +48695,12 @@ __exitcall_ebc_exit:
 	.4byte	0x30bc
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3236
+	.4byte	.LASF3241
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14911
+	.4byte	0x14a2b
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xcd
@@ -48509,12 +48708,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3237
+	.4byte	.LASF3242
 	.byte	0xd
 	.2byte	0x203
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x1493a
+	.4byte	0x14a54
 	.uleb128 0x65
 	.string	"wq"
 	.byte	0xd
@@ -48527,29 +48726,29 @@ __exitcall_ebc_exit:
 	.4byte	0x3205
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3238
+	.4byte	.LASF3243
 	.byte	0xd
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x14960
+	.4byte	0x14a7a
 	.uleb128 0x80
 	.4byte	.LASF2288
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0x3205
 	.uleb128 0x80
-	.4byte	.LASF3239
+	.4byte	.LASF3244
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3240
+	.4byte	.LASF3245
 	.byte	0x51
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1497c
+	.4byte	0x14a96
 	.uleb128 0x65
 	.string	"m"
 	.byte	0x51
@@ -48557,12 +48756,12 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3241
+	.4byte	.LASF3246
 	.byte	0x51
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14998
+	.4byte	0x14ab2
 	.uleb128 0x65
 	.string	"m"
 	.byte	0x51
@@ -48570,24 +48769,24 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3242
+	.4byte	.LASF3247
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x149d7
+	.4byte	0x14af1
 	.uleb128 0x80
 	.4byte	.LASF1164
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x30bc
 	.uleb128 0x80
-	.4byte	.LASF3243
+	.4byte	.LASF3248
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2e3
 	.uleb128 0x80
-	.4byte	.LASF3244
+	.4byte	.LASF3249
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2b0
@@ -48598,11 +48797,11 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3245
+	.4byte	.LASF3250
 	.byte	0xca
 	.byte	0x91
 	.byte	0x3
-	.4byte	0x14a0a
+	.4byte	0x14b24
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xca
@@ -48615,18 +48814,18 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.uleb128 0x68
 	.uleb128 0x7a
-	.4byte	.LASF3246
+	.4byte	.LASF3251
 	.byte	0xca
 	.byte	0x93
 	.4byte	0xc6
 	.byte	0
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3247
+	.4byte	.LASF3252
 	.byte	0xca
 	.byte	0x80
 	.byte	0x3
-	.4byte	0x14a38
+	.4byte	0x14b52
 	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0xca
@@ -48638,25 +48837,25 @@ __exitcall_ebc_exit:
 	.byte	0x80
 	.4byte	0x29
 	.uleb128 0x80
-	.4byte	.LASF3248
+	.4byte	.LASF3253
 	.byte	0xca
 	.byte	0x81
 	.4byte	0x2b0
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3249
+	.4byte	.LASF3254
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14a5f
+	.4byte	0x14b79
 	.uleb128 0x7f
 	.string	"ti"
 	.byte	0xca
 	.byte	0x5f
-	.4byte	0x14a5f
+	.4byte	0x14b79
 	.uleb128 0x80
-	.4byte	.LASF3250
+	.4byte	.LASF3255
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
@@ -48665,24 +48864,24 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.4byte	0xc33
 	.uleb128 0x7e
-	.4byte	.LASF3251
+	.4byte	.LASF3256
 	.byte	0x5
 	.byte	0xf
 	.4byte	0x2f05
 	.byte	0x3
-	.4byte	0x14a81
+	.4byte	0x14b9b
 	.uleb128 0x7a
-	.4byte	.LASF3252
+	.4byte	.LASF3257
 	.byte	0x5
 	.byte	0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3253
+	.4byte	.LASF3258
 	.byte	0x10
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x14ac7
+	.4byte	0x14be1
 	.uleb128 0x80
 	.4byte	.LASF976
 	.byte	0x10
@@ -48693,9 +48892,9 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x14aba
+	.4byte	0x14bd4
 	.uleb128 0x22
-	.4byte	.LASF3123
+	.4byte	.LASF3128
 	.byte	0x10
 	.byte	0x1c
 	.4byte	0x3cc
@@ -48703,27 +48902,27 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x12568
+	.4byte	0x12682
 	.byte	0
 	.uleb128 0x7d
 	.string	"__u"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x14a9b
+	.4byte	0x14bb5
 	.byte	0
 	.byte	0
 	.uleb128 0x82
-	.4byte	.LASF3334
+	.4byte	.LASF3339
 	.byte	0x20
 	.2byte	0x126
 	.byte	0x3
 	.uleb128 0x7e
-	.4byte	.LASF3254
+	.4byte	.LASF3259
 	.byte	0xce
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14aeb
+	.4byte	0x14c05
 	.uleb128 0x7f
 	.string	"n"
 	.byte	0xce
@@ -48731,12 +48930,12 @@ __exitcall_ebc_exit:
 	.4byte	0x15a
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3255
+	.4byte	.LASF3260
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xe2
 	.byte	0x3
-	.4byte	0x14b1f
+	.4byte	0x14c39
 	.uleb128 0x80
 	.4byte	.LASF2470
 	.byte	0x8
@@ -48754,12 +48953,12 @@ __exitcall_ebc_exit:
 	.4byte	0x8b
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3256
+	.4byte	.LASF3261
 	.byte	0xcf
 	.byte	0x50
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x14b39
+	.4byte	0x14c53
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xcf
@@ -48767,28 +48966,28 @@ __exitcall_ebc_exit:
 	.4byte	0xbd30
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3257
+	.4byte	.LASF3262
 	.byte	0xd0
 	.byte	0xb8
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x14b53
+	.4byte	0x14c6d
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd0
 	.byte	0xb8
-	.4byte	0x14b53
+	.4byte	0x14c6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xdd
 	.uleb128 0x7e
-	.4byte	.LASF3258
+	.4byte	.LASF3263
 	.byte	0xd0
 	.byte	0x39
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x14b75
+	.4byte	0x14c8f
 	.uleb128 0x7f
 	.string	"val"
 	.byte	0xd0
@@ -48796,12 +48995,12 @@ __exitcall_ebc_exit:
 	.4byte	0xd2
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3259
+	.4byte	.LASF3264
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14b9c
+	.4byte	0x14cb6
 	.uleb128 0x7f
 	.string	"nr"
 	.byte	0x7
@@ -48811,17 +49010,17 @@ __exitcall_ebc_exit:
 	.4byte	.LASF1164
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x14b9c
+	.4byte	0x14cb6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x3a
 	.uleb128 0x81
-	.4byte	.LASF3260
+	.4byte	.LASF3265
 	.byte	0x11
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x14bd6
+	.4byte	0x14cf0
 	.uleb128 0x7f
 	.string	"i"
 	.byte	0x11
@@ -48831,7 +49030,7 @@ __exitcall_ebc_exit:
 	.string	"v"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x14bd6
+	.4byte	0x14cf0
 	.uleb128 0x7d
 	.string	"w0"
 	.byte	0x11
@@ -48841,18 +49040,18 @@ __exitcall_ebc_exit:
 	.string	"x1"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x14bd6
+	.4byte	0x14cf0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x37c
 	.uleb128 0x7e
-	.4byte	.LASF3261
+	.4byte	.LASF3266
 	.byte	0xd1
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x14bf6
+	.4byte	0x14d10
 	.uleb128 0x7f
 	.string	"x"
 	.byte	0xd1
@@ -48860,12 +49059,12 @@ __exitcall_ebc_exit:
 	.4byte	0xf4
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3262
+	.4byte	.LASF3267
 	.byte	0xd2
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x14c13
+	.4byte	0x14d2d
 	.uleb128 0x80
 	.4byte	.LASF2503
 	.byte	0xd2
@@ -48873,16 +49072,16 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3263
+	.4byte	.LASF3268
 	.byte	0xd3
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x14c36
+	.4byte	0x14d50
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd3
 	.byte	0xb
-	.4byte	0x14c36
+	.4byte	0x14d50
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xd3
@@ -48891,21 +49090,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x14c3e
+	.4byte	0x14d58
 	.uleb128 0x83
 	.uleb128 0x3
-	.4byte	0x14c3c
+	.4byte	0x14d56
 	.uleb128 0x81
-	.4byte	.LASF3264
+	.4byte	.LASF3269
 	.byte	0xd3
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x14c66
+	.4byte	0x14d80
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd3
 	.byte	0x9
-	.4byte	0x14c36
+	.4byte	0x14d50
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xd3
@@ -48913,16 +49112,16 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3265
+	.4byte	.LASF3270
 	.byte	0xc
 	.2byte	0x11a
 	.byte	0x3
-	.4byte	0x14c96
+	.4byte	0x14db0
 	.uleb128 0x65
 	.string	"p"
 	.byte	0xc
 	.2byte	0x11a
-	.4byte	0x14c96
+	.4byte	0x14db0
 	.uleb128 0x65
 	.string	"res"
 	.byte	0xc
@@ -48936,14 +49135,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x14c3c
+	.4byte	0x14d56
 	.uleb128 0x84
 	.4byte	0x103dd
-	.8byte	.LFB2844
-	.8byte	.LFE2844-.LFB2844
+	.8byte	.LFB2845
+	.8byte	.LFE2845-.LFB2845
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14cc9
+	.4byte	0x14de3
 	.uleb128 0x70
 	.4byte	0x103ee
 	.4byte	.LLST12
@@ -48953,541 +49152,541 @@ __exitcall_ebc_exit:
 	.byte	0x51
 	.byte	0
 	.uleb128 0x85
-	.4byte	0x1274a
-	.8byte	.LFB2876
-	.8byte	.LFE2876-.LFB2876
+	.4byte	0x12864
+	.8byte	.LFB2877
+	.8byte	.LFE2877-.LFB2877
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14dcc
+	.4byte	0x14ee6
 	.uleb128 0x70
-	.4byte	0x12757
+	.4byte	0x12871
 	.4byte	.LLST190
 	.uleb128 0x55
-	.4byte	0x12763
+	.4byte	0x1287d
 	.uleb128 0x58
-	.4byte	0x1276f
+	.4byte	0x12889
 	.uleb128 0x5c
-	.4byte	0x1431c
-	.8byte	.LBB1438
+	.4byte	0x14436
+	.8byte	.LBB1444
 	.4byte	.Ldebug_ranges0+0xbf0
 	.byte	0x1
 	.2byte	0x585
-	.4byte	0x14d4a
+	.4byte	0x14e64
 	.uleb128 0x55
-	.4byte	0x1434d
+	.4byte	0x14467
 	.uleb128 0x55
-	.4byte	0x14341
+	.4byte	0x1445b
 	.uleb128 0x55
-	.4byte	0x14335
+	.4byte	0x1444f
 	.uleb128 0x55
-	.4byte	0x14329
+	.4byte	0x14443
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xbf0
 	.uleb128 0x58
-	.4byte	0x14359
+	.4byte	0x14473
 	.uleb128 0x60
-	.4byte	0x14366
-	.8byte	.LBB1440
+	.4byte	0x14480
+	.8byte	.LBB1446
 	.4byte	.Ldebug_ranges0+0xc40
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x55
-	.4byte	0x14377
+	.4byte	0x14491
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x1428f
-	.8byte	.LBB1449
+	.4byte	0x143a9
+	.8byte	.LBB1455
 	.4byte	.Ldebug_ranges0+0xc70
 	.byte	0x1
 	.2byte	0x586
-	.4byte	0x14d7c
+	.4byte	0x14e96
 	.uleb128 0x55
-	.4byte	0x142cc
+	.4byte	0x143e6
 	.uleb128 0x55
-	.4byte	0x142c0
+	.4byte	0x143da
 	.uleb128 0x55
-	.4byte	0x142b4
+	.4byte	0x143ce
 	.uleb128 0x55
-	.4byte	0x142a8
+	.4byte	0x143c2
 	.uleb128 0x55
-	.4byte	0x1429c
+	.4byte	0x143b6
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1425d
-	.8byte	.LBB1455
-	.8byte	.LBE1455-.LBB1455
+	.4byte	0x14377
+	.8byte	.LBB1461
+	.8byte	.LBE1461-.LBB1461
 	.byte	0x1
 	.2byte	0x587
-	.4byte	0x14da8
+	.4byte	0x14ec2
 	.uleb128 0x55
-	.4byte	0x14282
+	.4byte	0x1439c
 	.uleb128 0x55
-	.4byte	0x14276
+	.4byte	0x14390
 	.uleb128 0x55
-	.4byte	0x1426a
+	.4byte	0x14384
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x14237
-	.8byte	.LBB1457
-	.8byte	.LBE1457-.LBB1457
+	.4byte	0x14351
+	.8byte	.LBB1463
+	.8byte	.LBE1463-.LBB1463
 	.byte	0x1
 	.2byte	0x588
 	.uleb128 0x55
-	.4byte	0x14250
+	.4byte	0x1436a
 	.uleb128 0x55
-	.4byte	0x14244
+	.4byte	0x1435e
 	.byte	0
 	.byte	0
 	.uleb128 0x85
-	.4byte	0x14104
-	.8byte	.LFB2877
-	.8byte	.LFE2877-.LFB2877
+	.4byte	0x1421e
+	.8byte	.LFB2878
+	.8byte	.LFE2878-.LFB2878
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14e8a
+	.4byte	0x14fa4
 	.uleb128 0x70
-	.4byte	0x14114
+	.4byte	0x1422e
 	.4byte	.LLST193
 	.uleb128 0x70
-	.4byte	0x1411f
+	.4byte	0x14239
 	.4byte	.LLST194
 	.uleb128 0x58
-	.4byte	0x1412b
+	.4byte	0x14245
 	.uleb128 0x71
-	.4byte	0x142d9
-	.8byte	.LBB1481
-	.8byte	.LBE1481-.LBB1481
+	.4byte	0x143f3
+	.8byte	.LBB1487
+	.8byte	.LBE1487-.LBB1487
 	.byte	0x1
 	.byte	0xc9
-	.4byte	0x14e20
+	.4byte	0x14f3a
 	.uleb128 0x55
-	.4byte	0x142e6
+	.4byte	0x14400
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x14471
-	.8byte	.LBB1483
-	.8byte	.LBE1483-.LBB1483
+	.4byte	0x1458b
+	.8byte	.LBB1489
+	.8byte	.LBE1489-.LBB1489
 	.byte	0x1
 	.byte	0xca
-	.4byte	0x14e41
+	.4byte	0x14f5b
 	.uleb128 0x55
-	.4byte	0x1447e
+	.4byte	0x14598
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x144a5
-	.8byte	.LBB1485
-	.8byte	.LBE1485-.LBB1485
+	.4byte	0x145bf
+	.8byte	.LBB1491
+	.8byte	.LBE1491-.LBB1491
 	.byte	0x1
 	.byte	0xcd
-	.4byte	0x14e6f
+	.4byte	0x14f89
 	.uleb128 0x55
-	.4byte	0x144b2
+	.4byte	0x145cc
 	.uleb128 0x4f
 	.8byte	.LVL600
-	.4byte	0x15240
+	.4byte	0x1535a
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL597
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.uleb128 0x4f
 	.8byte	.LVL601
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.byte	0
 	.uleb128 0x84
-	.4byte	0x12124
-	.8byte	.LFB2879
-	.8byte	.LFE2879-.LFB2879
+	.4byte	0x1223e
+	.8byte	.LFB2880
+	.8byte	.LFE2880-.LFB2880
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14eeb
+	.4byte	0x15005
 	.uleb128 0x55
-	.4byte	0x12141
+	.4byte	0x1225b
 	.uleb128 0x55
-	.4byte	0x12135
+	.4byte	0x1224f
 	.uleb128 0x55
-	.4byte	0x12135
+	.4byte	0x1224f
 	.uleb128 0x58
-	.4byte	0x1214d
+	.4byte	0x12267
 	.uleb128 0x58
-	.4byte	0x12157
+	.4byte	0x12271
 	.uleb128 0x58
-	.4byte	0x12163
+	.4byte	0x1227d
 	.uleb128 0x61
-	.4byte	0x1216f
+	.4byte	0x12289
 	.4byte	.LLST196
 	.uleb128 0x62
-	.4byte	0x1217b
+	.4byte	0x12295
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x12187
+	.4byte	0x122a1
 	.4byte	.LLST197
 	.uleb128 0x4f
 	.8byte	.LVL611
-	.4byte	0x152b7
+	.4byte	0x153d1
 	.byte	0
 	.uleb128 0x85
-	.4byte	0x14104
-	.8byte	.LFB2883
-	.8byte	.LFE2883-.LFB2883
+	.4byte	0x1421e
+	.8byte	.LFB2884
+	.8byte	.LFE2884-.LFB2884
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14f9d
+	.4byte	0x150b7
 	.uleb128 0x70
-	.4byte	0x14114
+	.4byte	0x1422e
 	.4byte	.LLST223
 	.uleb128 0x58
-	.4byte	0x1412b
+	.4byte	0x14245
 	.uleb128 0x55
-	.4byte	0x1411f
+	.4byte	0x14239
 	.uleb128 0x71
-	.4byte	0x1448b
-	.8byte	.LBB1808
-	.8byte	.LBE1808-.LBB1808
+	.4byte	0x145a5
+	.8byte	.LBB1814
+	.8byte	.LBE1814-.LBB1814
 	.byte	0x1
 	.byte	0xc2
-	.4byte	0x14f3b
+	.4byte	0x15055
 	.uleb128 0x55
-	.4byte	0x14498
+	.4byte	0x145b2
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x142f3
-	.8byte	.LBB1810
-	.8byte	.LBE1810-.LBB1810
+	.4byte	0x1440d
+	.8byte	.LBB1816
+	.8byte	.LBE1816-.LBB1816
 	.byte	0x1
 	.byte	0xc3
-	.4byte	0x14f61
+	.4byte	0x1507b
 	.uleb128 0x55
-	.4byte	0x1430f
+	.4byte	0x14429
 	.uleb128 0x55
-	.4byte	0x14303
+	.4byte	0x1441d
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x144c5
-	.8byte	.LBB1812
-	.8byte	.LBE1812-.LBB1812
+	.4byte	0x145df
+	.8byte	.LBB1818
+	.8byte	.LBE1818-.LBB1818
 	.byte	0x1
 	.byte	0xbf
-	.4byte	0x14f8f
+	.4byte	0x150a9
 	.uleb128 0x55
-	.4byte	0x144d2
+	.4byte	0x145ec
 	.uleb128 0x4f
 	.8byte	.LVL803
-	.4byte	0x152c3
+	.4byte	0x153dd
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL800
-	.4byte	0x14fb5
+	.4byte	0x150cf
 	.byte	0
 	.uleb128 0x86
-	.4byte	.LASF3266
-	.4byte	.LASF3266
+	.4byte	.LASF3271
+	.4byte	.LASF3271
 	.byte	0xbe
 	.byte	0xcc
 	.uleb128 0x86
-	.4byte	.LASF3267
-	.4byte	.LASF3267
+	.4byte	.LASF3272
+	.4byte	.LASF3272
 	.byte	0xbe
 	.byte	0xca
 	.uleb128 0x87
-	.4byte	.LASF3268
-	.4byte	.LASF3268
+	.4byte	.LASF3273
+	.4byte	.LASF3273
 	.byte	0x2
 	.2byte	0x5d1
 	.uleb128 0x86
-	.4byte	.LASF3269
-	.4byte	.LASF3269
+	.4byte	.LASF3274
+	.4byte	.LASF3274
 	.byte	0xac
 	.byte	0x4f
 	.uleb128 0x87
-	.4byte	.LASF3270
-	.4byte	.LASF3270
+	.4byte	.LASF3275
+	.4byte	.LASF3275
 	.byte	0x2
 	.2byte	0x2bf
 	.uleb128 0x87
-	.4byte	.LASF3271
-	.4byte	.LASF3271
+	.4byte	.LASF3276
+	.4byte	.LASF3276
 	.byte	0xe
 	.2byte	0x149
 	.uleb128 0x87
-	.4byte	.LASF3272
-	.4byte	.LASF3272
+	.4byte	.LASF3277
+	.4byte	.LASF3277
 	.byte	0xe
 	.2byte	0x172
 	.uleb128 0x86
-	.4byte	.LASF3273
-	.4byte	.LASF3273
+	.4byte	.LASF3278
+	.4byte	.LASF3278
 	.byte	0xd4
 	.byte	0x78
 	.uleb128 0x86
-	.4byte	.LASF3274
-	.4byte	.LASF3274
+	.4byte	.LASF3279
+	.4byte	.LASF3279
 	.byte	0xaa
 	.byte	0x59
 	.uleb128 0x86
-	.4byte	.LASF3275
-	.4byte	.LASF3275
+	.4byte	.LASF3280
+	.4byte	.LASF3280
 	.byte	0xc3
 	.byte	0x31
 	.uleb128 0x88
-	.4byte	.LASF3276
-	.4byte	.LASF3276
+	.4byte	.LASF3281
+	.4byte	.LASF3281
 	.uleb128 0x86
-	.4byte	.LASF3276
-	.4byte	.LASF3276
+	.4byte	.LASF3281
+	.4byte	.LASF3281
 	.byte	0xd5
 	.byte	0x36
 	.uleb128 0x87
-	.4byte	.LASF3277
-	.4byte	.LASF3277
+	.4byte	.LASF3282
+	.4byte	.LASF3282
 	.byte	0x2
 	.2byte	0x5cb
 	.uleb128 0x86
-	.4byte	.LASF3278
-	.4byte	.LASF3278
+	.4byte	.LASF3283
+	.4byte	.LASF3283
 	.byte	0xc2
 	.byte	0x30
 	.uleb128 0x86
-	.4byte	.LASF3279
-	.4byte	.LASF3279
+	.4byte	.LASF3284
+	.4byte	.LASF3284
 	.byte	0xc2
 	.byte	0x31
 	.uleb128 0x86
-	.4byte	.LASF3280
-	.4byte	.LASF3280
+	.4byte	.LASF3285
+	.4byte	.LASF3285
 	.byte	0xab
 	.byte	0x9
 	.uleb128 0x87
-	.4byte	.LASF3281
-	.4byte	.LASF3281
+	.4byte	.LASF3286
+	.4byte	.LASF3286
 	.byte	0x48
 	.2byte	0x6b8
 	.uleb128 0x87
-	.4byte	.LASF3282
-	.4byte	.LASF3282
+	.4byte	.LASF3287
+	.4byte	.LASF3287
 	.byte	0xd
 	.2byte	0x190
 	.uleb128 0x87
-	.4byte	.LASF3283
-	.4byte	.LASF3283
+	.4byte	.LASF3288
+	.4byte	.LASF3288
 	.byte	0x48
 	.2byte	0x676
 	.uleb128 0x86
-	.4byte	.LASF3284
-	.4byte	.LASF3284
+	.4byte	.LASF3289
+	.4byte	.LASF3289
 	.byte	0x9c
 	.byte	0x67
 	.uleb128 0x86
-	.4byte	.LASF3285
-	.4byte	.LASF3285
+	.4byte	.LASF3290
+	.4byte	.LASF3290
 	.byte	0x54
 	.byte	0x53
 	.uleb128 0x86
-	.4byte	.LASF3286
-	.4byte	.LASF3286
+	.4byte	.LASF3291
+	.4byte	.LASF3291
 	.byte	0x54
 	.byte	0xa5
 	.uleb128 0x86
-	.4byte	.LASF3287
-	.4byte	.LASF3287
+	.4byte	.LASF3292
+	.4byte	.LASF3292
 	.byte	0xc3
 	.byte	0x2c
 	.uleb128 0x86
-	.4byte	.LASF3288
-	.4byte	.LASF3288
+	.4byte	.LASF3293
+	.4byte	.LASF3293
 	.byte	0xc3
 	.byte	0x28
 	.uleb128 0x87
-	.4byte	.LASF3289
-	.4byte	.LASF3289
+	.4byte	.LASF3294
+	.4byte	.LASF3294
 	.byte	0x12
 	.2byte	0x184
 	.uleb128 0x86
-	.4byte	.LASF3290
-	.4byte	.LASF3290
+	.4byte	.LASF3295
+	.4byte	.LASF3295
 	.byte	0xd6
 	.byte	0x51
 	.uleb128 0x87
-	.4byte	.LASF3291
-	.4byte	.LASF3291
+	.4byte	.LASF3296
+	.4byte	.LASF3296
 	.byte	0x20
 	.2byte	0x1d9
 	.uleb128 0x86
-	.4byte	.LASF3292
-	.4byte	.LASF3292
+	.4byte	.LASF3297
+	.4byte	.LASF3297
 	.byte	0x3
 	.byte	0x3b
 	.uleb128 0x86
-	.4byte	.LASF3293
-	.4byte	.LASF3293
+	.4byte	.LASF3298
+	.4byte	.LASF3298
 	.byte	0x12
 	.byte	0xb9
 	.uleb128 0x86
-	.4byte	.LASF3294
-	.4byte	.LASF3294
+	.4byte	.LASF3299
+	.4byte	.LASF3299
 	.byte	0x3a
 	.byte	0xc2
 	.uleb128 0x88
-	.4byte	.LASF3295
-	.4byte	.LASF3295
+	.4byte	.LASF3300
+	.4byte	.LASF3300
 	.uleb128 0x86
-	.4byte	.LASF3296
-	.4byte	.LASF3296
+	.4byte	.LASF3301
+	.4byte	.LASF3301
 	.byte	0xac
 	.byte	0x4e
 	.uleb128 0x87
-	.4byte	.LASF3297
-	.4byte	.LASF3297
+	.4byte	.LASF3302
+	.4byte	.LASF3302
 	.byte	0x2
 	.2byte	0x287
 	.uleb128 0x86
-	.4byte	.LASF3298
-	.4byte	.LASF3298
+	.4byte	.LASF3303
+	.4byte	.LASF3303
 	.byte	0xbf
 	.byte	0x38
 	.uleb128 0x87
-	.4byte	.LASF3299
-	.4byte	.LASF3299
+	.4byte	.LASF3304
+	.4byte	.LASF3304
 	.byte	0xe
 	.2byte	0x165
 	.uleb128 0x87
-	.4byte	.LASF3300
-	.4byte	.LASF3300
+	.4byte	.LASF3305
+	.4byte	.LASF3305
 	.byte	0xa3
 	.2byte	0x37b
 	.uleb128 0x87
-	.4byte	.LASF3301
-	.4byte	.LASF3301
+	.4byte	.LASF3306
+	.4byte	.LASF3306
 	.byte	0xe
 	.2byte	0x125
 	.uleb128 0x88
-	.4byte	.LASF3302
-	.4byte	.LASF3302
+	.4byte	.LASF3307
+	.4byte	.LASF3307
 	.uleb128 0x86
-	.4byte	.LASF3303
-	.4byte	.LASF3303
+	.4byte	.LASF3308
+	.4byte	.LASF3308
 	.byte	0xc3
 	.byte	0x2f
 	.uleb128 0x87
-	.4byte	.LASF3304
-	.4byte	.LASF3304
+	.4byte	.LASF3309
+	.4byte	.LASF3309
 	.byte	0x20
 	.2byte	0x1c7
 	.uleb128 0x87
-	.4byte	.LASF3305
-	.4byte	.LASF3305
+	.4byte	.LASF3310
+	.4byte	.LASF3310
 	.byte	0x20
 	.2byte	0x17e
 	.uleb128 0x86
-	.4byte	.LASF3306
-	.4byte	.LASF3306
+	.4byte	.LASF3311
+	.4byte	.LASF3311
 	.byte	0x3
 	.byte	0x3a
 	.uleb128 0x86
-	.4byte	.LASF3307
-	.4byte	.LASF3307
+	.4byte	.LASF3312
+	.4byte	.LASF3312
 	.byte	0xc2
 	.byte	0x32
 	.uleb128 0x87
-	.4byte	.LASF3308
-	.4byte	.LASF3308
+	.4byte	.LASF3313
+	.4byte	.LASF3313
 	.byte	0x76
 	.2byte	0xa0a
 	.uleb128 0x86
-	.4byte	.LASF3309
-	.4byte	.LASF3309
+	.4byte	.LASF3314
+	.4byte	.LASF3314
 	.byte	0xc3
 	.byte	0x2d
 	.uleb128 0x86
-	.4byte	.LASF3310
-	.4byte	.LASF3310
+	.4byte	.LASF3315
+	.4byte	.LASF3315
 	.byte	0x48
 	.byte	0xdc
 	.uleb128 0x87
-	.4byte	.LASF3311
-	.4byte	.LASF3311
+	.4byte	.LASF3316
+	.4byte	.LASF3316
 	.byte	0x3a
 	.2byte	0x459
 	.uleb128 0x86
-	.4byte	.LASF3312
-	.4byte	.LASF3312
+	.4byte	.LASF3317
+	.4byte	.LASF3317
 	.byte	0x3a
 	.byte	0xe9
 	.uleb128 0x87
-	.4byte	.LASF3313
-	.4byte	.LASF3313
+	.4byte	.LASF3318
+	.4byte	.LASF3318
 	.byte	0x3a
 	.2byte	0x45a
 	.uleb128 0x87
-	.4byte	.LASF3314
-	.4byte	.LASF3314
+	.4byte	.LASF3319
+	.4byte	.LASF3319
 	.byte	0x6
 	.2byte	0x19f
 	.uleb128 0x87
-	.4byte	.LASF3315
-	.4byte	.LASF3315
+	.4byte	.LASF3320
+	.4byte	.LASF3320
 	.byte	0x6
 	.2byte	0x199
 	.uleb128 0x86
-	.4byte	.LASF3316
-	.4byte	.LASF3316
+	.4byte	.LASF3321
+	.4byte	.LASF3321
 	.byte	0xc3
 	.byte	0x26
 	.uleb128 0x86
-	.4byte	.LASF3317
-	.4byte	.LASF3317
+	.4byte	.LASF3322
+	.4byte	.LASF3322
 	.byte	0xc3
 	.byte	0x2b
 	.uleb128 0x86
-	.4byte	.LASF3318
-	.4byte	.LASF3318
+	.4byte	.LASF3323
+	.4byte	.LASF3323
 	.byte	0xc3
 	.byte	0x25
 	.uleb128 0x86
-	.4byte	.LASF3319
-	.4byte	.LASF3319
+	.4byte	.LASF3324
+	.4byte	.LASF3324
 	.byte	0xc3
 	.byte	0x24
 	.uleb128 0x86
-	.4byte	.LASF3320
-	.4byte	.LASF3320
+	.4byte	.LASF3325
+	.4byte	.LASF3325
 	.byte	0x9c
 	.byte	0x73
 	.uleb128 0x86
-	.4byte	.LASF3321
-	.4byte	.LASF3321
+	.4byte	.LASF3326
+	.4byte	.LASF3326
 	.byte	0xc3
 	.byte	0x2a
 	.uleb128 0x86
-	.4byte	.LASF3322
-	.4byte	.LASF3322
+	.4byte	.LASF3327
+	.4byte	.LASF3327
 	.byte	0xc3
 	.byte	0x27
 	.uleb128 0x86
-	.4byte	.LASF3323
-	.4byte	.LASF3323
+	.4byte	.LASF3328
+	.4byte	.LASF3328
 	.byte	0x72
 	.byte	0x88
 	.uleb128 0x86
-	.4byte	.LASF3324
-	.4byte	.LASF3324
+	.4byte	.LASF3329
+	.4byte	.LASF3329
 	.byte	0x72
 	.byte	0x98
 	.uleb128 0x86
-	.4byte	.LASF3325
-	.4byte	.LASF3325
+	.4byte	.LASF3330
+	.4byte	.LASF3330
 	.byte	0xc4
 	.byte	0x6e
 	.uleb128 0x86
-	.4byte	.LASF3326
-	.4byte	.LASF3326
+	.4byte	.LASF3331
+	.4byte	.LASF3331
 	.byte	0xc2
 	.byte	0x33
 	.uleb128 0x87
-	.4byte	.LASF3327
-	.4byte	.LASF3327
+	.4byte	.LASF3332
+	.4byte	.LASF3332
 	.byte	0xd
 	.2byte	0x1d6
 	.uleb128 0x89
@@ -49496,18 +49695,18 @@ __exitcall_ebc_exit:
 	.byte	0x78
 	.byte	0x2c
 	.uleb128 0x86
-	.4byte	.LASF3328
-	.4byte	.LASF3328
+	.4byte	.LASF3333
+	.4byte	.LASF3333
 	.byte	0x78
 	.byte	0x27
 	.uleb128 0x86
-	.4byte	.LASF3329
-	.4byte	.LASF3329
+	.4byte	.LASF3334
+	.4byte	.LASF3334
 	.byte	0x1e
 	.byte	0xb0
 	.uleb128 0x86
-	.4byte	.LASF3330
-	.4byte	.LASF3330
+	.4byte	.LASF3335
+	.4byte	.LASF3335
 	.byte	0x9c
 	.byte	0x71
 	.byte	0
@@ -51419,7 +51618,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x63
 	.8byte	.LVL782
-	.8byte	.LFE2859
+	.8byte	.LFE2860
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -51442,7 +51641,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL794
-	.8byte	.LFE2859
+	.8byte	.LFE2860
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
@@ -51482,7 +51681,7 @@ __exitcall_ebc_exit:
 	.byte	0x91
 	.sleb128 -32
 	.8byte	.LVL782
-	.8byte	.LFE2859
+	.8byte	.LFE2860
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
@@ -51502,7 +51701,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x63
 	.8byte	.LVL794
-	.8byte	.LFE2859
+	.8byte	.LFE2860
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -51529,7 +51728,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	.LVL794
-	.8byte	.LFE2859
+	.8byte	.LFE2860
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
@@ -51552,7 +51751,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	.LVL794
-	.8byte	.LFE2859
+	.8byte	.LFE2860
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
@@ -51600,7 +51799,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x68
 	.8byte	.LVL794
-	.8byte	.LFE2859
+	.8byte	.LFE2860
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
@@ -51652,7 +51851,7 @@ __exitcall_ebc_exit:
 	.byte	0x91
 	.sleb128 -28
 	.8byte	.LVL788
-	.8byte	.LFE2859
+	.8byte	.LFE2860
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
@@ -51679,7 +51878,7 @@ __exitcall_ebc_exit:
 	.byte	0x91
 	.sleb128 -24
 	.8byte	.LVL786
-	.8byte	.LFE2859
+	.8byte	.LFE2860
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
@@ -51711,7 +51910,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x68
 	.8byte	.LVL791
-	.8byte	.LFE2859
+	.8byte	.LFE2860
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
@@ -51734,7 +51933,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	.LVL791
-	.8byte	.LFE2859
+	.8byte	.LFE2860
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
@@ -51765,7 +51964,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	.LVL794
-	.8byte	.LFE2859
+	.8byte	.LFE2860
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
@@ -51792,7 +51991,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	.LVL794
-	.8byte	.LFE2859
+	.8byte	.LFE2860
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
@@ -51823,7 +52022,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL789
-	.8byte	.LFE2859
+	.8byte	.LFE2860
 	.2byte	0x1
 	.byte	0x6b
 	.8byte	0
@@ -51850,7 +52049,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL792
-	.8byte	.LFE2859
+	.8byte	.LFE2860
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
@@ -51869,7 +52068,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x68
 	.8byte	.LVL794
-	.8byte	.LFE2859
+	.8byte	.LFE2860
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
@@ -51969,7 +52168,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL349
-	.8byte	.LFE2849
+	.8byte	.LFE2850
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
@@ -51999,7 +52198,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x66
 	.8byte	.LVL349
-	.8byte	.LFE2849
+	.8byte	.LFE2850
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
@@ -52011,7 +52210,7 @@ __exitcall_ebc_exit:
 	.byte	0x91
 	.sleb128 20
 	.8byte	.LVL352
-	.8byte	.LFE2849
+	.8byte	.LFE2850
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
@@ -52066,7 +52265,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL332
-	.8byte	.LFE2847
+	.8byte	.LFE2848
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
@@ -52237,7 +52436,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL258
-	.8byte	.LFE2840
+	.8byte	.LFE2841
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
@@ -52575,7 +52774,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL265
-	.8byte	.LFE2840
+	.8byte	.LFE2841
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -52609,7 +52808,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x53
 	.8byte	.LVL266
-	.8byte	.LFE2840
+	.8byte	.LFE2841
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
@@ -52872,7 +53071,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL866
-	.8byte	.LFE2835
+	.8byte	.LFE2836
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
@@ -52883,7 +53082,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x68
 	.8byte	.LVL866
-	.8byte	.LFE2835
+	.8byte	.LFE2836
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
@@ -52893,27 +53092,27 @@ __exitcall_ebc_exit:
 	.8byte	.LVL879-1
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL914
-	.8byte	.LVL915
+	.8byte	.LVL911
+	.8byte	.LVL912
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL917
-	.8byte	.LVL920-1
+	.8byte	.LVL914
+	.8byte	.LVL917-1
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL939
-	.8byte	.LVL941-1
+	.8byte	.LVL935
+	.8byte	.LVL937-1
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
 .LLST241:
-	.8byte	.LVL918
-	.8byte	.LVL919
+	.8byte	.LVL915
+	.8byte	.LVL916
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL940
-	.8byte	.LVL941-1
+	.8byte	.LVL936
+	.8byte	.LVL937-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
@@ -52924,49 +53123,49 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	.LVL866
-	.8byte	.LVL897
+	.8byte	.LVL896
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL901
-	.8byte	.LVL904
+	.8byte	.LVL900
+	.8byte	.LVL903
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL910
-	.8byte	.LVL959
+	.8byte	.LVL907
+	.8byte	.LVL958
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL964
-	.8byte	.LVL967
+	.8byte	.LVL963
+	.8byte	.LVL965
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL968
-	.8byte	.LVL992
+	.8byte	.LVL966
+	.8byte	.LVL981
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL998
-	.8byte	.LFE2835
+	.8byte	.LVL987
+	.8byte	.LFE2836
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST256:
-	.8byte	.LVL973
-	.8byte	.LVL974
+.LLST257:
+	.8byte	.LVL947
+	.8byte	.LVL948
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL994
-	.8byte	.LVL995-1
+	.8byte	.LVL983
+	.8byte	.LVL984-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST255:
-	.8byte	.LVL946
-	.8byte	.LVL947
+.LLST256:
+	.8byte	.LVL942
+	.8byte	.LVL943
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL986
-	.8byte	.LVL987-1
+	.8byte	.LVL993
+	.8byte	.LVL994-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -52976,8 +53175,8 @@ __exitcall_ebc_exit:
 	.8byte	.LVL868
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL925
-	.8byte	.LVL926-1
+	.8byte	.LVL922
+	.8byte	.LVL923-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -52998,35 +53197,47 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	0
 .LLST244:
-	.8byte	.LVL892
-	.8byte	.LVL910
+	.8byte	.LVL880
+	.8byte	.LVL882-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL959
-	.8byte	.LVL965-1
+	.8byte	.LVL891
+	.8byte	.LVL907
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL967
-	.8byte	.LVL968
+	.8byte	.LVL919
+	.8byte	.LVL920-1
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL958
+	.8byte	.LVL964-1
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL965
+	.8byte	.LVL967-1
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL978
+	.8byte	.LVL979-1
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
 .LLST245:
-	.8byte	.LVL897
-	.8byte	.LVL900
+	.8byte	.LVL896
+	.8byte	.LVL899
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL905
-	.8byte	.LVL910
+	.8byte	.LVL904
+	.8byte	.LVL907
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL959
-	.8byte	.LVL962
+	.8byte	.LVL958
+	.8byte	.LVL961
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL967
-	.8byte	.LVL968
+	.8byte	.LVL965
+	.8byte	.LVL966
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -53041,149 +53252,221 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	.LVL880
-	.8byte	.LVL897
+	.8byte	.LVL896
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL899
-	.8byte	.LVL904
+	.8byte	.LVL898
+	.8byte	.LVL903
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL910
-	.8byte	.LVL917
+	.8byte	.LVL907
+	.8byte	.LVL914
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL922
-	.8byte	.LVL939
+	.8byte	.LVL919
+	.8byte	.LVL935
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL949
-	.8byte	.LVL959
+	.8byte	.LVL945
+	.8byte	.LVL958
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL961
-	.8byte	.LVL967
+	.8byte	.LVL960
+	.8byte	.LVL965
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL968
-	.8byte	.LVL984
+	.8byte	.LVL966
+	.8byte	.LVL981
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL990
-	.8byte	.LVL992
+	.8byte	.LVL987
+	.8byte	.LVL991
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL998
-	.8byte	.LFE2835
+	.8byte	.LVL997
+	.8byte	.LFE2836
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
 .LLST247:
-	.8byte	.LVL896
+	.8byte	.LVL880
+	.8byte	.LVL882-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL895
+	.8byte	.LVL897
+	.2byte	0x1
+	.byte	0x52
 	.8byte	.LVL898
+	.8byte	.LVL907
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL899
-	.8byte	.LVL910
+	.8byte	.LVL919
+	.8byte	.LVL920-1
 	.2byte	0x1
 	.byte	0x52
+	.8byte	.LVL958
 	.8byte	.LVL959
-	.8byte	.LVL960
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL964
-	.8byte	.LVL965-1
+	.8byte	.LVL963
+	.8byte	.LVL964-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL967
-	.8byte	.LVL968
+	.8byte	.LVL965
+	.8byte	.LVL967-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL978
+	.8byte	.LVL979-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST248:
-	.8byte	.LVL896
-	.8byte	.LVL906
+	.8byte	.LVL880
+	.8byte	.LVL882-1
 	.2byte	0x1
 	.byte	0x53
+	.8byte	.LVL895
+	.8byte	.LVL905
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL906
 	.8byte	.LVL907
-	.8byte	.LVL908
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL909
-	.8byte	.LVL910
+	.8byte	.LVL919
+	.8byte	.LVL920-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL959
-	.8byte	.LVL965-1
+	.8byte	.LVL958
+	.8byte	.LVL964-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL967
-	.8byte	.LVL968
+	.8byte	.LVL965
+	.8byte	.LVL967-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL978
+	.8byte	.LVL979-1
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST249:
+	.8byte	.LVL880
+	.8byte	.LVL882-1
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL895
 	.8byte	.LVL896
-	.8byte	.LVL897
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL900
-	.8byte	.LVL902
+	.8byte	.LVL899
+	.8byte	.LVL901
 	.2byte	0x1
 	.byte	0x55
+	.8byte	.LVL901
 	.8byte	.LVL902
-	.8byte	.LVL903
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL963
-	.8byte	.LVL965-1
+	.8byte	.LVL919
+	.8byte	.LVL920-1
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL962
+	.8byte	.LVL964-1
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL966
+	.8byte	.LVL967-1
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL978
+	.8byte	.LVL979-1
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST250:
-	.8byte	.LVL895
-	.8byte	.LVL910
+	.8byte	.LVL880
+	.8byte	.LVL882-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL959
-	.8byte	.LVL965-1
+	.8byte	.LVL894
+	.8byte	.LVL907
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL967
-	.8byte	.LVL968
+	.8byte	.LVL919
+	.8byte	.LVL920-1
+	.2byte	0x1
+	.byte	0x61
+	.8byte	.LVL958
+	.8byte	.LVL964-1
+	.2byte	0x1
+	.byte	0x61
+	.8byte	.LVL965
+	.8byte	.LVL967-1
+	.2byte	0x1
+	.byte	0x61
+	.8byte	.LVL978
+	.8byte	.LVL979-1
 	.2byte	0x1
 	.byte	0x61
 	.8byte	0
 	.8byte	0
 .LLST251:
-	.8byte	.LVL893
-	.8byte	.LVL910
+	.8byte	.LVL880
+	.8byte	.LVL882-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL959
-	.8byte	.LVL965-1
+	.8byte	.LVL892
+	.8byte	.LVL907
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL967
-	.8byte	.LVL968
+	.8byte	.LVL919
+	.8byte	.LVL920-1
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL958
+	.8byte	.LVL964-1
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL965
+	.8byte	.LVL967-1
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL978
+	.8byte	.LVL979-1
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
 .LLST252:
-	.8byte	.LVL895
-	.8byte	.LVL910
+	.8byte	.LVL880
+	.8byte	.LVL882-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL959
-	.8byte	.LVL965-1
+	.8byte	.LVL894
+	.8byte	.LVL907
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL967
-	.8byte	.LVL968
+	.8byte	.LVL919
+	.8byte	.LVL920-1
+	.2byte	0x1
+	.byte	0x60
+	.8byte	.LVL958
+	.8byte	.LVL964-1
+	.2byte	0x1
+	.byte	0x60
+	.8byte	.LVL965
+	.8byte	.LVL967-1
+	.2byte	0x1
+	.byte	0x60
+	.8byte	.LVL978
+	.8byte	.LVL979-1
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
@@ -53209,40 +53492,73 @@ __exitcall_ebc_exit:
 	.8byte	.LVL887
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL894
-	.8byte	.LVL910
+	.8byte	.LVL893
+	.8byte	.LVL907
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL916
-	.8byte	.LVL917
+	.8byte	.LVL913
+	.8byte	.LVL914
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL922
-	.8byte	.LVL930
+	.8byte	.LVL919
+	.8byte	.LVL935
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL954
-	.8byte	.LVL957
+	.8byte	.LVL953
+	.8byte	.LVL956
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL959
-	.8byte	.LVL971
+	.8byte	.LVL958
+	.8byte	.LVL969
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL977
-	.8byte	.LVL984
+	.8byte	.LVL976
+	.8byte	.LVL980
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL998
+	.8byte	.LVL987
+	.8byte	.LVL991
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL997
 	.8byte	.LVL1000
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1002
-	.8byte	.LFE2835
+	.8byte	.LVL1003
+	.8byte	.LFE2836
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
+.LLST255:
+	.8byte	.LVL928
+	.8byte	.LVL929-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST258:
+	.8byte	.LVL909
+	.8byte	.LVL910-1
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL973
+	.8byte	.LVL974
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST259:
+	.8byte	.LVL888
+	.8byte	.LVL889-1
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL975
+	.8byte	.LVL976
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
 .LLST77:
 	.8byte	.LVL279
 	.8byte	.LVL280
@@ -54751,7 +55067,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL547
-	.8byte	.LFE2876
+	.8byte	.LFE2877
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
@@ -54802,7 +55118,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x63
 	.8byte	.LVL802
-	.8byte	.LFE2883
+	.8byte	.LFE2884
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -54817,616 +55133,628 @@ __exitcall_ebc_exit:
 	.2byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0-.Ltext0
+	.8byte	.LFB2865
+	.8byte	.LFE2865-.LFB2865
 	.8byte	.LFB2864
 	.8byte	.LFE2864-.LFB2864
-	.8byte	.LFB2863
-	.8byte	.LFE2863-.LFB2863
 	.8byte	0
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
 .Ldebug_ranges0:
-	.8byte	.LBB948
-	.8byte	.LBE948
-	.8byte	.LBB951
-	.8byte	.LBE951
+	.8byte	.LBB954
+	.8byte	.LBE954
+	.8byte	.LBB957
+	.8byte	.LBE957
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB952
-	.8byte	.LBE952
-	.8byte	.LBB983
-	.8byte	.LBE983
-	.8byte	.LBB984
-	.8byte	.LBE984
-	.8byte	.LBB1049
-	.8byte	.LBE1049
+	.8byte	.LBB958
+	.8byte	.LBE958
+	.8byte	.LBB989
+	.8byte	.LBE989
+	.8byte	.LBB990
+	.8byte	.LBE990
+	.8byte	.LBB1055
+	.8byte	.LBE1055
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB955
-	.8byte	.LBE955
-	.8byte	.LBB967
-	.8byte	.LBE967
-	.8byte	.LBB968
-	.8byte	.LBE968
+	.8byte	.LBB961
+	.8byte	.LBE961
+	.8byte	.LBB973
+	.8byte	.LBE973
+	.8byte	.LBB974
+	.8byte	.LBE974
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB971
-	.8byte	.LBE971
-	.8byte	.LBB976
-	.8byte	.LBE976
+	.8byte	.LBB977
+	.8byte	.LBE977
+	.8byte	.LBB982
+	.8byte	.LBE982
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB985
-	.8byte	.LBE985
-	.8byte	.LBB1206
-	.8byte	.LBE1206
-	.8byte	.LBB1207
-	.8byte	.LBE1207
+	.8byte	.LBB991
+	.8byte	.LBE991
+	.8byte	.LBB1212
+	.8byte	.LBE1212
+	.8byte	.LBB1213
+	.8byte	.LBE1213
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB994
+	.8byte	.LBE994
+	.8byte	.LBB1014
+	.8byte	.LBE1014
+	.8byte	.LBB1015
+	.8byte	.LBE1015
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB988
-	.8byte	.LBE988
 	.8byte	.LBB1008
 	.8byte	.LBE1008
-	.8byte	.LBB1009
-	.8byte	.LBE1009
+	.8byte	.LBB1013
+	.8byte	.LBE1013
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1002
-	.8byte	.LBE1002
-	.8byte	.LBB1007
-	.8byte	.LBE1007
+	.8byte	.LBB1020
+	.8byte	.LBE1020
+	.8byte	.LBB1223
+	.8byte	.LBE1223
+	.8byte	.LBB1225
+	.8byte	.LBE1225
+	.8byte	.LBB1226
+	.8byte	.LBE1226
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1014
-	.8byte	.LBE1014
-	.8byte	.LBB1217
-	.8byte	.LBE1217
-	.8byte	.LBB1219
-	.8byte	.LBE1219
-	.8byte	.LBB1220
-	.8byte	.LBE1220
+	.8byte	.LBB1026
+	.8byte	.LBE1026
+	.8byte	.LBB1210
+	.8byte	.LBE1210
+	.8byte	.LBB1211
+	.8byte	.LBE1211
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1020
-	.8byte	.LBE1020
-	.8byte	.LBB1204
-	.8byte	.LBE1204
-	.8byte	.LBB1205
-	.8byte	.LBE1205
+	.8byte	.LBB1029
+	.8byte	.LBE1029
+	.8byte	.LBB1049
+	.8byte	.LBE1049
+	.8byte	.LBB1050
+	.8byte	.LBE1050
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1023
-	.8byte	.LBE1023
 	.8byte	.LBB1043
 	.8byte	.LBE1043
-	.8byte	.LBB1044
-	.8byte	.LBE1044
+	.8byte	.LBB1048
+	.8byte	.LBE1048
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1037
-	.8byte	.LBE1037
-	.8byte	.LBB1042
-	.8byte	.LBE1042
+	.8byte	.LBB1056
+	.8byte	.LBE1056
+	.8byte	.LBB1089
+	.8byte	.LBE1089
+	.8byte	.LBB1220
+	.8byte	.LBE1220
+	.8byte	.LBB1221
+	.8byte	.LBE1221
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1050
-	.8byte	.LBE1050
-	.8byte	.LBB1083
-	.8byte	.LBE1083
-	.8byte	.LBB1214
-	.8byte	.LBE1214
-	.8byte	.LBB1215
-	.8byte	.LBE1215
+	.8byte	.LBB1059
+	.8byte	.LBE1059
+	.8byte	.LBB1072
+	.8byte	.LBE1072
+	.8byte	.LBB1081
+	.8byte	.LBE1081
+	.8byte	.LBB1082
+	.8byte	.LBE1082
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1053
-	.8byte	.LBE1053
-	.8byte	.LBB1066
-	.8byte	.LBE1066
 	.8byte	.LBB1075
 	.8byte	.LBE1075
-	.8byte	.LBB1076
-	.8byte	.LBE1076
+	.8byte	.LBB1080
+	.8byte	.LBE1080
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1069
-	.8byte	.LBE1069
-	.8byte	.LBB1074
-	.8byte	.LBE1074
+	.8byte	.LBB1090
+	.8byte	.LBE1090
+	.8byte	.LBB1125
+	.8byte	.LBE1125
+	.8byte	.LBB1216
+	.8byte	.LBE1216
+	.8byte	.LBB1217
+	.8byte	.LBE1217
+	.8byte	.LBB1227
+	.8byte	.LBE1227
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1084
-	.8byte	.LBE1084
-	.8byte	.LBB1119
-	.8byte	.LBE1119
-	.8byte	.LBB1210
-	.8byte	.LBE1210
-	.8byte	.LBB1211
-	.8byte	.LBE1211
-	.8byte	.LBB1221
-	.8byte	.LBE1221
+	.8byte	.LBB1093
+	.8byte	.LBE1093
+	.8byte	.LBB1106
+	.8byte	.LBE1106
+	.8byte	.LBB1115
+	.8byte	.LBE1115
+	.8byte	.LBB1116
+	.8byte	.LBE1116
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1087
-	.8byte	.LBE1087
-	.8byte	.LBB1100
-	.8byte	.LBE1100
 	.8byte	.LBB1109
 	.8byte	.LBE1109
-	.8byte	.LBB1110
-	.8byte	.LBE1110
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1103
-	.8byte	.LBE1103
-	.8byte	.LBB1108
-	.8byte	.LBE1108
+	.8byte	.LBB1114
+	.8byte	.LBE1114
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1120
-	.8byte	.LBE1120
-	.8byte	.LBB1131
-	.8byte	.LBE1131
+	.8byte	.LBB1126
+	.8byte	.LBE1126
+	.8byte	.LBB1137
+	.8byte	.LBE1137
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1123
-	.8byte	.LBE1123
-	.8byte	.LBB1128
-	.8byte	.LBE1128
+	.8byte	.LBB1129
+	.8byte	.LBE1129
+	.8byte	.LBB1134
+	.8byte	.LBE1134
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1124
-	.8byte	.LBE1124
-	.8byte	.LBB1127
-	.8byte	.LBE1127
+	.8byte	.LBB1130
+	.8byte	.LBE1130
+	.8byte	.LBB1133
+	.8byte	.LBE1133
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1132
-	.8byte	.LBE1132
-	.8byte	.LBB1167
-	.8byte	.LBE1167
-	.8byte	.LBB1208
-	.8byte	.LBE1208
-	.8byte	.LBB1209
-	.8byte	.LBE1209
-	.8byte	.LBB1216
-	.8byte	.LBE1216
+	.8byte	.LBB1138
+	.8byte	.LBE1138
+	.8byte	.LBB1173
+	.8byte	.LBE1173
+	.8byte	.LBB1214
+	.8byte	.LBE1214
+	.8byte	.LBB1215
+	.8byte	.LBE1215
+	.8byte	.LBB1222
+	.8byte	.LBE1222
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1135
-	.8byte	.LBE1135
-	.8byte	.LBB1148
-	.8byte	.LBE1148
-	.8byte	.LBB1149
-	.8byte	.LBE1149
-	.8byte	.LBB1150
-	.8byte	.LBE1150
+	.8byte	.LBB1141
+	.8byte	.LBE1141
+	.8byte	.LBB1154
+	.8byte	.LBE1154
+	.8byte	.LBB1155
+	.8byte	.LBE1155
+	.8byte	.LBB1156
+	.8byte	.LBE1156
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1153
-	.8byte	.LBE1153
-	.8byte	.LBB1158
-	.8byte	.LBE1158
+	.8byte	.LBB1159
+	.8byte	.LBE1159
+	.8byte	.LBB1164
+	.8byte	.LBE1164
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1168
-	.8byte	.LBE1168
-	.8byte	.LBB1203
-	.8byte	.LBE1203
-	.8byte	.LBB1212
-	.8byte	.LBE1212
-	.8byte	.LBB1213
-	.8byte	.LBE1213
+	.8byte	.LBB1174
+	.8byte	.LBE1174
+	.8byte	.LBB1209
+	.8byte	.LBE1209
 	.8byte	.LBB1218
 	.8byte	.LBE1218
+	.8byte	.LBB1219
+	.8byte	.LBE1219
+	.8byte	.LBB1224
+	.8byte	.LBE1224
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1171
-	.8byte	.LBE1171
-	.8byte	.LBB1184
-	.8byte	.LBE1184
-	.8byte	.LBB1185
-	.8byte	.LBE1185
-	.8byte	.LBB1186
-	.8byte	.LBE1186
+	.8byte	.LBB1177
+	.8byte	.LBE1177
+	.8byte	.LBB1190
+	.8byte	.LBE1190
+	.8byte	.LBB1191
+	.8byte	.LBE1191
+	.8byte	.LBB1192
+	.8byte	.LBE1192
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1189
-	.8byte	.LBE1189
-	.8byte	.LBB1194
-	.8byte	.LBE1194
+	.8byte	.LBB1195
+	.8byte	.LBE1195
+	.8byte	.LBB1200
+	.8byte	.LBE1200
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1226
-	.8byte	.LBE1226
-	.8byte	.LBB1229
-	.8byte	.LBE1229
+	.8byte	.LBB1232
+	.8byte	.LBE1232
+	.8byte	.LBB1235
+	.8byte	.LBE1235
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1260
-	.8byte	.LBE1260
-	.8byte	.LBB1272
-	.8byte	.LBE1272
-	.8byte	.LBB1274
-	.8byte	.LBE1274
-	.8byte	.LBB1276
-	.8byte	.LBE1276
+	.8byte	.LBB1266
+	.8byte	.LBE1266
+	.8byte	.LBB1278
+	.8byte	.LBE1278
+	.8byte	.LBB1280
+	.8byte	.LBE1280
+	.8byte	.LBB1282
+	.8byte	.LBE1282
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1265
-	.8byte	.LBE1265
-	.8byte	.LBB1273
-	.8byte	.LBE1273
-	.8byte	.LBB1275
-	.8byte	.LBE1275
-	.8byte	.LBB1284
-	.8byte	.LBE1284
-	.8byte	.LBB1286
-	.8byte	.LBE1286
-	.8byte	.LBB1288
-	.8byte	.LBE1288
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1277
-	.8byte	.LBE1277
-	.8byte	.LBB1285
-	.8byte	.LBE1285
-	.8byte	.LBB1287
-	.8byte	.LBE1287
+	.8byte	.LBB1271
+	.8byte	.LBE1271
+	.8byte	.LBB1279
+	.8byte	.LBE1279
+	.8byte	.LBB1281
+	.8byte	.LBE1281
+	.8byte	.LBB1290
+	.8byte	.LBE1290
+	.8byte	.LBB1292
+	.8byte	.LBE1292
 	.8byte	.LBB1294
 	.8byte	.LBE1294
-	.8byte	.LBB1296
-	.8byte	.LBE1296
-	.8byte	.LBB1298
-	.8byte	.LBE1298
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1289
-	.8byte	.LBE1289
+	.8byte	.LBB1283
+	.8byte	.LBE1283
+	.8byte	.LBB1291
+	.8byte	.LBE1291
+	.8byte	.LBB1293
+	.8byte	.LBE1293
+	.8byte	.LBB1300
+	.8byte	.LBE1300
+	.8byte	.LBB1302
+	.8byte	.LBE1302
+	.8byte	.LBB1304
+	.8byte	.LBE1304
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB1295
 	.8byte	.LBE1295
-	.8byte	.LBB1297
-	.8byte	.LBE1297
-	.8byte	.LBB1299
-	.8byte	.LBE1299
+	.8byte	.LBB1301
+	.8byte	.LBE1301
+	.8byte	.LBB1303
+	.8byte	.LBE1303
+	.8byte	.LBB1305
+	.8byte	.LBE1305
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1304
-	.8byte	.LBE1304
 	.8byte	.LBB1310
 	.8byte	.LBE1310
 	.8byte	.LBB1316
 	.8byte	.LBE1316
-	.8byte	.LBB1318
-	.8byte	.LBE1318
-	.8byte	.LBB1320
-	.8byte	.LBE1320
+	.8byte	.LBB1322
+	.8byte	.LBE1322
+	.8byte	.LBB1324
+	.8byte	.LBE1324
+	.8byte	.LBB1326
+	.8byte	.LBE1326
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1311
-	.8byte	.LBE1311
 	.8byte	.LBB1317
 	.8byte	.LBE1317
-	.8byte	.LBB1319
-	.8byte	.LBE1319
-	.8byte	.LBB1321
-	.8byte	.LBE1321
+	.8byte	.LBB1323
+	.8byte	.LBE1323
+	.8byte	.LBB1325
+	.8byte	.LBE1325
+	.8byte	.LBB1327
+	.8byte	.LBE1327
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1324
-	.8byte	.LBE1324
-	.8byte	.LBB1337
-	.8byte	.LBE1337
-	.8byte	.LBB1339
-	.8byte	.LBE1339
-	.8byte	.LBB1341
-	.8byte	.LBE1341
+	.8byte	.LBB1330
+	.8byte	.LBE1330
 	.8byte	.LBB1343
 	.8byte	.LBE1343
+	.8byte	.LBB1345
+	.8byte	.LBE1345
+	.8byte	.LBB1347
+	.8byte	.LBE1347
+	.8byte	.LBB1349
+	.8byte	.LBE1349
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1330
-	.8byte	.LBE1330
 	.8byte	.LBB1336
 	.8byte	.LBE1336
-	.8byte	.LBB1338
-	.8byte	.LBE1338
-	.8byte	.LBB1340
-	.8byte	.LBE1340
 	.8byte	.LBB1342
 	.8byte	.LBE1342
+	.8byte	.LBB1344
+	.8byte	.LBE1344
+	.8byte	.LBB1346
+	.8byte	.LBE1346
+	.8byte	.LBB1348
+	.8byte	.LBE1348
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1372
-	.8byte	.LBE1372
-	.8byte	.LBB1386
-	.8byte	.LBE1386
-	.8byte	.LBB1414
-	.8byte	.LBE1414
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1374
-	.8byte	.LBE1374
-	.8byte	.LBB1383
-	.8byte	.LBE1383
+	.8byte	.LBB1378
+	.8byte	.LBE1378
+	.8byte	.LBB1392
+	.8byte	.LBE1392
+	.8byte	.LBB1420
+	.8byte	.LBE1420
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1380
+	.8byte	.LBE1380
 	.8byte	.LBB1389
 	.8byte	.LBE1389
-	.8byte	.LBB1415
-	.8byte	.LBE1415
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1391
-	.8byte	.LBE1391
-	.8byte	.LBB1404
-	.8byte	.LBE1404
-	.8byte	.LBB1406
-	.8byte	.LBE1406
-	.8byte	.LBB1408
-	.8byte	.LBE1408
+	.8byte	.LBB1395
+	.8byte	.LBE1395
+	.8byte	.LBB1421
+	.8byte	.LBE1421
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1397
+	.8byte	.LBE1397
 	.8byte	.LBB1410
 	.8byte	.LBE1410
 	.8byte	.LBB1412
 	.8byte	.LBE1412
+	.8byte	.LBB1414
+	.8byte	.LBE1414
+	.8byte	.LBB1416
+	.8byte	.LBE1416
+	.8byte	.LBB1418
+	.8byte	.LBE1418
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1398
-	.8byte	.LBE1398
-	.8byte	.LBB1405
-	.8byte	.LBE1405
-	.8byte	.LBB1407
-	.8byte	.LBE1407
-	.8byte	.LBB1409
-	.8byte	.LBE1409
+	.8byte	.LBB1404
+	.8byte	.LBE1404
 	.8byte	.LBB1411
 	.8byte	.LBE1411
+	.8byte	.LBB1413
+	.8byte	.LBE1413
+	.8byte	.LBB1415
+	.8byte	.LBE1415
+	.8byte	.LBB1417
+	.8byte	.LBE1417
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1418
-	.8byte	.LBE1418
-	.8byte	.LBB1430
-	.8byte	.LBE1430
-	.8byte	.LBB1432
-	.8byte	.LBE1432
-	.8byte	.LBB1433
-	.8byte	.LBE1433
-	.8byte	.LBB1435
-	.8byte	.LBE1435
-	.8byte	.LBB1437
-	.8byte	.LBE1437
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1425
-	.8byte	.LBE1425
-	.8byte	.LBB1431
-	.8byte	.LBE1431
-	.8byte	.LBB1434
-	.8byte	.LBE1434
+	.8byte	.LBB1424
+	.8byte	.LBE1424
 	.8byte	.LBB1436
 	.8byte	.LBE1436
-	.8byte	0
-	.8byte	0
 	.8byte	.LBB1438
 	.8byte	.LBE1438
-	.8byte	.LBB1447
-	.8byte	.LBE1447
-	.8byte	.LBB1448
-	.8byte	.LBE1448
-	.8byte	.LBB1459
-	.8byte	.LBE1459
+	.8byte	.LBB1439
+	.8byte	.LBE1439
+	.8byte	.LBB1441
+	.8byte	.LBE1441
+	.8byte	.LBB1443
+	.8byte	.LBE1443
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1431
+	.8byte	.LBE1431
+	.8byte	.LBB1437
+	.8byte	.LBE1437
 	.8byte	.LBB1440
 	.8byte	.LBE1440
-	.8byte	.LBB1443
-	.8byte	.LBE1443
+	.8byte	.LBB1442
+	.8byte	.LBE1442
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1449
-	.8byte	.LBE1449
+	.8byte	.LBB1444
+	.8byte	.LBE1444
 	.8byte	.LBB1453
 	.8byte	.LBE1453
 	.8byte	.LBB1454
 	.8byte	.LBE1454
+	.8byte	.LBB1465
+	.8byte	.LBE1465
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1468
-	.8byte	.LBE1468
-	.8byte	.LBB1475
-	.8byte	.LBE1475
-	.8byte	.LBB1476
-	.8byte	.LBE1476
+	.8byte	.LBB1446
+	.8byte	.LBE1446
+	.8byte	.LBB1449
+	.8byte	.LBE1449
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1455
+	.8byte	.LBE1455
+	.8byte	.LBB1459
+	.8byte	.LBE1459
+	.8byte	.LBB1460
+	.8byte	.LBE1460
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1469
-	.8byte	.LBE1469
 	.8byte	.LBB1474
 	.8byte	.LBE1474
+	.8byte	.LBB1481
+	.8byte	.LBE1481
+	.8byte	.LBB1482
+	.8byte	.LBE1482
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1477
-	.8byte	.LBE1477
+	.8byte	.LBB1475
+	.8byte	.LBE1475
 	.8byte	.LBB1480
 	.8byte	.LBE1480
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1637
-	.8byte	.LBE1637
-	.8byte	.LBB1640
-	.8byte	.LBE1640
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1647
-	.8byte	.LBE1647
-	.8byte	.LBB1721
-	.8byte	.LBE1721
-	.8byte	.LBB1722
-	.8byte	.LBE1722
-	.8byte	.LBB1723
-	.8byte	.LBE1723
+	.8byte	.LBB1483
+	.8byte	.LBE1483
+	.8byte	.LBB1486
+	.8byte	.LBE1486
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1649
-	.8byte	.LBE1649
-	.8byte	.LBB1658
-	.8byte	.LBE1658
-	.8byte	.LBB1659
-	.8byte	.LBE1659
-	.8byte	.LBB1660
-	.8byte	.LBE1660
+	.8byte	.LBB1643
+	.8byte	.LBE1643
+	.8byte	.LBB1646
+	.8byte	.LBE1646
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1724
-	.8byte	.LBE1724
-	.8byte	.LBB1739
-	.8byte	.LBE1739
-	.8byte	.LBB1740
-	.8byte	.LBE1740
-	.8byte	.LBB1750
-	.8byte	.LBE1750
-	.8byte	.LBB1802
-	.8byte	.LBE1802
-	.8byte	.LBB1805
-	.8byte	.LBE1805
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1726
-	.8byte	.LBE1726
+	.8byte	.LBB1653
+	.8byte	.LBE1653
+	.8byte	.LBB1727
+	.8byte	.LBE1727
+	.8byte	.LBB1728
+	.8byte	.LBE1728
 	.8byte	.LBB1729
 	.8byte	.LBE1729
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1655
+	.8byte	.LBE1655
+	.8byte	.LBB1664
+	.8byte	.LBE1664
+	.8byte	.LBB1665
+	.8byte	.LBE1665
+	.8byte	.LBB1666
+	.8byte	.LBE1666
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB1730
 	.8byte	.LBE1730
-	.8byte	.LBB1733
-	.8byte	.LBE1733
+	.8byte	.LBB1745
+	.8byte	.LBE1745
+	.8byte	.LBB1746
+	.8byte	.LBE1746
+	.8byte	.LBB1756
+	.8byte	.LBE1756
+	.8byte	.LBB1808
+	.8byte	.LBE1808
+	.8byte	.LBB1811
+	.8byte	.LBE1811
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1741
-	.8byte	.LBE1741
-	.8byte	.LBB1751
-	.8byte	.LBE1751
-	.8byte	.LBB1801
-	.8byte	.LBE1801
-	.8byte	.LBB1806
-	.8byte	.LBE1806
+	.8byte	.LBB1732
+	.8byte	.LBE1732
+	.8byte	.LBB1735
+	.8byte	.LBE1735
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1743
-	.8byte	.LBE1743
-	.8byte	.LBB1746
-	.8byte	.LBE1746
+	.8byte	.LBB1736
+	.8byte	.LBE1736
+	.8byte	.LBB1739
+	.8byte	.LBE1739
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1747
+	.8byte	.LBE1747
+	.8byte	.LBB1757
+	.8byte	.LBE1757
+	.8byte	.LBB1807
+	.8byte	.LBE1807
+	.8byte	.LBB1812
+	.8byte	.LBE1812
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1749
+	.8byte	.LBE1749
 	.8byte	.LBB1752
 	.8byte	.LBE1752
-	.8byte	.LBB1803
-	.8byte	.LBE1803
-	.8byte	.LBB1804
-	.8byte	.LBE1804
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1754
-	.8byte	.LBE1754
+	.8byte	.LBB1758
+	.8byte	.LBE1758
+	.8byte	.LBB1809
+	.8byte	.LBE1809
+	.8byte	.LBB1810
+	.8byte	.LBE1810
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB1760
 	.8byte	.LBE1760
+	.8byte	.LBB1766
+	.8byte	.LBE1766
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1763
-	.8byte	.LBE1763
-	.8byte	.LBB1764
-	.8byte	.LBE1764
+	.8byte	.LBB1769
+	.8byte	.LBE1769
+	.8byte	.LBB1770
+	.8byte	.LBE1770
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1771
-	.8byte	.LBE1771
 	.8byte	.LBB1777
 	.8byte	.LBE1777
-	.8byte	.LBB1778
-	.8byte	.LBE1778
-	.8byte	.LBB1779
-	.8byte	.LBE1779
-	.8byte	.LBB1780
-	.8byte	.LBE1780
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1781
-	.8byte	.LBE1781
-	.8byte	.LBB1799
-	.8byte	.LBE1799
-	.8byte	.LBB1800
-	.8byte	.LBE1800
-	.8byte	.LBB1807
-	.8byte	.LBE1807
+	.8byte	.LBB1783
+	.8byte	.LBE1783
+	.8byte	.LBB1784
+	.8byte	.LBE1784
+	.8byte	.LBB1785
+	.8byte	.LBE1785
+	.8byte	.LBB1786
+	.8byte	.LBE1786
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1836
-	.8byte	.LBE1836
-	.8byte	.LBB1843
-	.8byte	.LBE1843
-	.8byte	.LBB1844
-	.8byte	.LBE1844
+	.8byte	.LBB1787
+	.8byte	.LBE1787
+	.8byte	.LBB1805
+	.8byte	.LBE1805
+	.8byte	.LBB1806
+	.8byte	.LBE1806
+	.8byte	.LBB1813
+	.8byte	.LBE1813
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1838
-	.8byte	.LBE1838
-	.8byte	.LBB1839
-	.8byte	.LBE1839
-	.8byte	.LBB1840
-	.8byte	.LBE1840
+	.8byte	.LBB1848
+	.8byte	.LBE1848
+	.8byte	.LBB1855
+	.8byte	.LBE1855
+	.8byte	.LBB1856
+	.8byte	.LBE1856
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1845
-	.8byte	.LBE1845
-	.8byte	.LBB1849
-	.8byte	.LBE1849
 	.8byte	.LBB1850
 	.8byte	.LBE1850
-	.8byte	0
-	.8byte	0
 	.8byte	.LBB1851
 	.8byte	.LBE1851
+	.8byte	.LBB1852
+	.8byte	.LBE1852
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB1857
 	.8byte	.LBE1857
-	.8byte	.LBB1858
-	.8byte	.LBE1858
-	.8byte	.LBB1868
-	.8byte	.LBE1868
+	.8byte	.LBB1861
+	.8byte	.LBE1861
+	.8byte	.LBB1862
+	.8byte	.LBE1862
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1863
+	.8byte	.LBE1863
 	.8byte	.LBB1869
 	.8byte	.LBE1869
+	.8byte	.LBB1870
+	.8byte	.LBE1870
+	.8byte	.LBB1888
+	.8byte	.LBE1888
+	.8byte	.LBB1889
+	.8byte	.LBE1889
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1864
-	.8byte	.LBE1864
 	.8byte	.LBB1876
 	.8byte	.LBE1876
+	.8byte	.LBB1879
+	.8byte	.LBE1879
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1866
-	.8byte	.LBE1866
-	.8byte	.LBB1867
-	.8byte	.LBE1867
+	.8byte	.LBB1880
+	.8byte	.LBE1880
+	.8byte	.LBB1897
+	.8byte	.LBE1897
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1870
-	.8byte	.LBE1870
-	.8byte	.LBB1877
-	.8byte	.LBE1877
+	.8byte	.LBB1882
+	.8byte	.LBE1882
+	.8byte	.LBB1883
+	.8byte	.LBE1883
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1872
-	.8byte	.LBE1872
-	.8byte	.LBB1873
-	.8byte	.LBE1873
+	.8byte	.LBB1884
+	.8byte	.LBE1884
+	.8byte	.LBB1896
+	.8byte	.LBE1896
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1886
+	.8byte	.LBE1886
+	.8byte	.LBB1887
+	.8byte	.LBE1887
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1890
+	.8byte	.LBE1890
+	.8byte	.LBB1893
+	.8byte	.LBE1893
 	.8byte	0
 	.8byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0
+	.8byte	.LFB2865
+	.8byte	.LFE2865
 	.8byte	.LFB2864
 	.8byte	.LFE2864
-	.8byte	.LFB2863
-	.8byte	.LFE2863
 	.8byte	0
 	.8byte	0
 	.section	.debug_line,"",@progbits
@@ -55508,7 +55836,7 @@ __exitcall_ebc_exit:
 	.string	"dev_kobj"
 .LASF475:
 	.string	"d_release"
-.LASF3193:
+.LASF3198:
 	.string	"get_arch_dma_ops"
 .LASF305:
 	.string	"__ctors_start"
@@ -55542,7 +55870,7 @@ __exitcall_ebc_exit:
 	.string	"si_code"
 .LASF649:
 	.string	"thread_node"
-.LASF3120:
+.LASF3125:
 	.string	"temperature"
 .LASF1316:
 	.string	"map_pages"
@@ -55584,9 +55912,9 @@ __exitcall_ebc_exit:
 	.string	"gpio_desc"
 .LASF976:
 	.string	"list"
-.LASF3210:
+.LASF3215:
 	.string	"_copy_from_user"
-.LASF3236:
+.LASF3241:
 	.string	"get_order"
 .LASF959:
 	.string	"si_errno"
@@ -55646,7 +55974,7 @@ __exitcall_ebc_exit:
 	.string	"n_node"
 .LASF1638:
 	.string	"qsize_t"
-.LASF3233:
+.LASF3238:
 	.string	"devm_kzalloc"
 .LASF380:
 	.string	"sequence"
@@ -55662,7 +55990,7 @@ __exitcall_ebc_exit:
 	.string	"s_state"
 .LASF1080:
 	.string	"run_list"
-.LASF3148:
+.LASF3153:
 	.string	"clac_full_data_align8"
 .LASF2567:
 	.string	"SCHED_SOFTIRQ"
@@ -55700,6 +56028,8 @@ __exitcall_ebc_exit:
 	.string	"contig_page_data"
 .LASF2308:
 	.string	"autosuspend_delay"
+.LASF3109:
+	.string	"buffer_in"
 .LASF3:
 	.string	"unsigned int"
 .LASF943:
@@ -55736,7 +56066,7 @@ __exitcall_ebc_exit:
 	.string	"size_t"
 .LASF209:
 	.string	"compat_elf_hwcap"
-.LASF3311:
+.LASF3316:
 	.string	"prepare_to_wait_event"
 .LASF1124:
 	.string	"cap_permitted"
@@ -55778,7 +56108,7 @@ __exitcall_ebc_exit:
 	.string	"__reserved"
 .LASF954:
 	.string	"_sigfault"
-.LASF3162:
+.LASF3167:
 	.string	"image_bg"
 .LASF2872:
 	.string	"ebc_buf_status"
@@ -55868,9 +56198,9 @@ __exitcall_ebc_exit:
 	.string	"irqchip_fwnode_ops"
 .LASF1628:
 	.string	"dq_id"
-.LASF3153:
+.LASF3158:
 	.string	"frame_count_tmp"
-.LASF3161:
+.LASF3166:
 	.string	"image_fb"
 .LASF1803:
 	.string	"write_end"
@@ -55878,7 +56208,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ION_HEAP_POOL"
 .LASF1438:
 	.string	"sysctl_protected_hardlinks"
-.LASF3315:
+.LASF3320:
 	.string	"__arch_copy_from_user"
 .LASF1191:
 	.string	"scan_objects"
@@ -55886,7 +56216,7 @@ __exitcall_ebc_exit:
 	.string	"pageset"
 .LASF1252:
 	.string	"wb_err"
-.LASF3207:
+.LASF3212:
 	.string	"copy_to_user"
 .LASF735:
 	.string	"trace_recursion"
@@ -55966,7 +56296,7 @@ __exitcall_ebc_exit:
 	.string	"poll"
 .LASF2458:
 	.string	"graph_get_next_endpoint"
-.LASF3145:
+.LASF3150:
 	.string	"clac_full_data_32_to_16"
 .LASF1424:
 	.string	"io_cq"
@@ -56000,7 +56330,7 @@ __exitcall_ebc_exit:
 	.string	"pcpu_chosen_fc"
 .LASF391:
 	.string	"dentry_stat_t"
-.LASF3260:
+.LASF3265:
 	.string	"atomic_add"
 .LASF1657:
 	.string	"dqi_bgrace"
@@ -56018,7 +56348,7 @@ __exitcall_ebc_exit:
 	.string	"ctl_table"
 .LASF44:
 	.string	"uid_t"
-.LASF3290:
+.LASF3295:
 	.string	"strstr"
 .LASF2862:
 	.string	"WF_TYPE_A2"
@@ -56042,7 +56372,7 @@ __exitcall_ebc_exit:
 	.string	"panel_buffer"
 .LASF317:
 	.string	"__exception_text_end"
-.LASF3138:
+.LASF3143:
 	.string	"clac_part_data_16_to_32"
 .LASF2748:
 	.string	"sh_addr"
@@ -56082,7 +56412,7 @@ __exitcall_ebc_exit:
 	.string	"pteval_t"
 .LASF430:
 	.string	"i_ino"
-.LASF3334:
+.LASF3339:
 	.string	"might_fault"
 .LASF1576:
 	.string	"compact_cached_free_pfn"
@@ -56172,9 +56502,7 @@ __exitcall_ebc_exit:
 	.string	"seq_operations"
 .LASF638:
 	.string	"stack_canary"
-.LASF3044:
-	.string	"__addressable_ebc_init3102"
-.LASF3117:
+.LASF3122:
 	.string	"no_black_count"
 .LASF1175:
 	.string	"blksize"
@@ -56202,9 +56530,11 @@ __exitcall_ebc_exit:
 	.string	"bus_dma_mask"
 .LASF562:
 	.string	"pidfd_fops"
+.LASF3044:
+	.string	"__addressable_ebc_init3119"
 .LASF1931:
 	.string	"lm_put_owner"
-.LASF3292:
+.LASF3297:
 	.string	"ebc_pmic_verity_vcom"
 .LASF2538:
 	.string	"set_sda"
@@ -56312,7 +56642,7 @@ __exitcall_ebc_exit:
 	.string	"sysfs_dev_block_kobj"
 .LASF555:
 	.string	"upid"
-.LASF3323:
+.LASF3328:
 	.string	"down_write"
 .LASF1113:
 	.string	"completion"
@@ -56366,7 +56696,7 @@ __exitcall_ebc_exit:
 	.string	"taint_flag"
 .LASF1993:
 	.string	"get_dquots"
-.LASF3301:
+.LASF3306:
 	.string	"of_find_node_by_phandle"
 .LASF2417:
 	.string	"unmap_page"
@@ -56390,7 +56720,7 @@ __exitcall_ebc_exit:
 	.string	"vm_operations_struct"
 .LASF2405:
 	.string	"hwirq_max"
-.LASF3258:
+.LASF3263:
 	.string	"__fswab32"
 .LASF2213:
 	.string	"runtime_idle"
@@ -56420,13 +56750,13 @@ __exitcall_ebc_exit:
 	.string	"RPM_SUSPENDED"
 .LASF698:
 	.string	"reclaim_state"
-.LASF3333:
+.LASF3338:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF138:
 	.string	"vendor_panic_cb"
 .LASF3098:
 	.string	"ebc_vdd_power_timeout"
-.LASF3179:
+.LASF3184:
 	.string	"ebc_get_4pix_wf"
 .LASF2813:
 	.string	"num_symtab"
@@ -56456,13 +56786,13 @@ __exitcall_ebc_exit:
 	.string	"module_alloc_base"
 .LASF1766:
 	.string	"core_kallsyms"
-.LASF3295:
+.LASF3300:
 	.string	"memcpy"
 .LASF2910:
 	.string	"EPD_FORCE_FULL"
 .LASF2415:
 	.string	"get_sgtable"
-.LASF3157:
+.LASF3162:
 	.string	"xor_val"
 .LASF2170:
 	.string	"envp_idx"
@@ -56474,11 +56804,11 @@ __exitcall_ebc_exit:
 	.string	"OOM_KILL"
 .LASF445:
 	.string	"i_hash"
-.LASF3134:
+.LASF3139:
 	.string	"gray_old"
 .LASF68:
 	.string	"hlist_node"
-.LASF3304:
+.LASF3309:
 	.string	"sprintf"
 .LASF1923:
 	.string	"fl_ops"
@@ -56490,7 +56820,7 @@ __exitcall_ebc_exit:
 	.string	"WQ_MEM_RECLAIM"
 .LASF2688:
 	.string	"COMPACTISOLATED"
-.LASF3271:
+.LASF3276:
 	.string	"of_property_read_variable_u32_array"
 .LASF328:
 	.string	"__inittext_begin"
@@ -56526,7 +56856,7 @@ __exitcall_ebc_exit:
 	.string	"DOMAIN_BUS_WAKEUP"
 .LASF1237:
 	.string	"arm64_el2_vector_last_slot"
-.LASF3327:
+.LASF3332:
 	.string	"queue_work_on"
 .LASF2350:
 	.string	"online"
@@ -56534,7 +56864,7 @@ __exitcall_ebc_exit:
 	.string	"runtime_resume"
 .LASF1222:
 	.string	"dup_xol_work"
-.LASF3200:
+.LASF3205:
 	.string	"ebc_pmic_read_temp"
 .LASF2891:
 	.string	"EPD_FULL_GC16"
@@ -56648,7 +56978,7 @@ __exitcall_ebc_exit:
 	.string	"driver"
 .LASF1559:
 	.string	"ZONE_NORMAL"
-.LASF3163:
+.LASF3168:
 	.string	"image_new_data"
 .LASF426:
 	.string	"i_op"
@@ -56702,7 +57032,7 @@ __exitcall_ebc_exit:
 	.string	"huge_fault"
 .LASF2023:
 	.string	"kstatfs"
-.LASF3203:
+.LASF3208:
 	.string	"ebc_pmic_power_off"
 .LASF2649:
 	.string	"PGPGOUTCLEAN"
@@ -56730,7 +57060,7 @@ __exitcall_ebc_exit:
 	.string	"fsnotify_mark_connector"
 .LASF956:
 	.string	"_sigsys"
-.LASF3119:
+.LASF3124:
 	.string	"ebc_lut_update"
 .LASF1936:
 	.string	"lm_setup"
@@ -56774,7 +57104,7 @@ __exitcall_ebc_exit:
 	.string	"get_next_id"
 .LASF238:
 	.string	"rwlock_t"
-.LASF3332:
+.LASF3337:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
 .LASF855:
 	.string	"pgprot"
@@ -56802,7 +57132,7 @@ __exitcall_ebc_exit:
 	.string	"__icache_flags"
 .LASF148:
 	.string	"crash_kexec_post_notifiers"
-.LASF3188:
+.LASF3193:
 	.string	"eink_mode"
 .LASF1712:
 	.string	"rt_spc_warnlimit"
@@ -56824,7 +57154,7 @@ __exitcall_ebc_exit:
 	.string	"_pid"
 .LASF1171:
 	.string	"init_stack"
-.LASF3169:
+.LASF3174:
 	.string	"dmask"
 .LASF1240:
 	.string	"address_space"
@@ -56832,7 +57162,7 @@ __exitcall_ebc_exit:
 	.string	"mm_context_t"
 .LASF1326:
 	.string	"startup"
-.LASF3139:
+.LASF3144:
 	.string	"clac_part_data_32"
 .LASF835:
 	.string	"__WQ_ORDERED_EXPLICIT"
@@ -56846,7 +57176,7 @@ __exitcall_ebc_exit:
 	.string	"i_wb"
 .LASF2101:
 	.string	"idr_next"
-.LASF3154:
+.LASF3159:
 	.string	"frame_count_data"
 .LASF2973:
 	.string	"frame_start"
@@ -56896,7 +57226,7 @@ __exitcall_ebc_exit:
 	.string	"normal_prio"
 .LASF1303:
 	.string	"f_ep_links"
-.LASF3167:
+.LASF3172:
 	.string	"image_fb_tmp"
 .LASF2309:
 	.string	"last_busy"
@@ -56908,7 +57238,7 @@ __exitcall_ebc_exit:
 	.string	"host"
 .LASF185:
 	.string	"uaddr"
-.LASF3322:
+.LASF3327:
 	.string	"ebc_remove_from_dsp_buf_list"
 .LASF662:
 	.string	"real_start_time"
@@ -56944,11 +57274,11 @@ __exitcall_ebc_exit:
 	.string	"devres_head"
 .LASF428:
 	.string	"i_mapping"
-.LASF3296:
+.LASF3301:
 	.string	"misc_register"
 .LASF723:
 	.string	"rseq_sig"
-.LASF3222:
+.LASF3227:
 	.string	"platform_set_drvdata"
 .LASF343:
 	.string	"cpu_context"
@@ -56956,7 +57286,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pm_domain"
 .LASF1528:
 	.string	"nr_zones"
-.LASF3244:
+.LASF3249:
 	.string	"is_source"
 .LASF1390:
 	.string	"migrate_mode"
@@ -56978,11 +57308,11 @@ __exitcall_ebc_exit:
 	.string	"d_hash"
 .LASF1090:
 	.string	"dl_bw"
-.LASF3215:
+.LASF3220:
 	.string	"limit"
 .LASF2160:
 	.string	"kobj"
-.LASF3305:
+.LASF3310:
 	.string	"kstrtouint"
 .LASF114:
 	.string	"fsync"
@@ -56992,9 +57322,9 @@ __exitcall_ebc_exit:
 	.string	"i_flags"
 .LASF2908:
 	.string	"EPD_RESUME"
-.LASF3291:
+.LASF3296:
 	.string	"sscanf"
-.LASF3287:
+.LASF3292:
 	.string	"ebc_empty_buf_get"
 .LASF1489:
 	.string	"NR_ISOLATED_ANON"
@@ -57008,7 +57338,7 @@ __exitcall_ebc_exit:
 	.string	"rb_node"
 .LASF614:
 	.string	"pushable_tasks"
-.LASF3168:
+.LASF3173:
 	.string	"image_bg_tmp"
 .LASF2217:
 	.string	"platform_data"
@@ -57038,7 +57368,7 @@ __exitcall_ebc_exit:
 	.string	"last_update_time"
 .LASF1152:
 	.string	"robust_list_head"
-.LASF3285:
+.LASF3290:
 	.string	"init_timer_key"
 .LASF1495:
 	.string	"NR_ANON_MAPPED"
@@ -57054,7 +57384,7 @@ __exitcall_ebc_exit:
 	.string	"srcversion"
 .LASF873:
 	.string	"pcpu_unit_offsets"
-.LASF3191:
+.LASF3196:
 	.string	"dma_sync_single_for_device"
 .LASF2974:
 	.string	"dsp_end_callback"
@@ -57120,7 +57450,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_INACTIVE_ANON"
 .LASF729:
 	.string	"nr_dirtied"
-.LASF3232:
+.LASF3237:
 	.string	"dev_get_drvdata"
 .LASF2410:
 	.string	"linear_revmap"
@@ -57164,11 +57494,11 @@ __exitcall_ebc_exit:
 	.string	"sysctl_memory_failure_early_kill"
 .LASF2775:
 	.string	"param_ops_bool_enable_only"
-.LASF3174:
+.LASF3179:
 	.string	"power_status"
 .LASF307:
 	.string	"__start_opd"
-.LASF3300:
+.LASF3305:
 	.string	"of_find_i2c_device_by_node"
 .LASF154:
 	.string	"SYSTEM_RUNNING"
@@ -57208,7 +57538,7 @@ __exitcall_ebc_exit:
 	.string	"panel"
 .LASF2447:
 	.string	"irq_data"
-.LASF3111:
+.LASF3116:
 	.string	"old_buffer_temp"
 .LASF2720:
 	.string	"sysctl_memory_failure_recovery"
@@ -57242,7 +57572,7 @@ __exitcall_ebc_exit:
 	.string	"taint_flags"
 .LASF1362:
 	.string	"membarrier_state"
-.LASF3182:
+.LASF3187:
 	.string	"pre_image_addr"
 .LASF2193:
 	.string	"suspend"
@@ -57310,7 +57640,7 @@ __exitcall_ebc_exit:
 	.string	"exit_code"
 .LASF1071:
 	.string	"exec_start"
-.LASF3329:
+.LASF3334:
 	.string	"printk"
 .LASF2396:
 	.string	"consumers"
@@ -57374,7 +57704,7 @@ __exitcall_ebc_exit:
 	.string	"timer"
 .LASF2477:
 	.string	"devtree_lock"
-.LASF3171:
+.LASF3176:
 	.string	"refresh_new_image_auto"
 .LASF3092:
 	.string	"__ret"
@@ -57402,11 +57732,11 @@ __exitcall_ebc_exit:
 	.string	"optimistic_spin_queue"
 .LASF2979:
 	.string	"ebc_buffer_size"
-.LASF3306:
+.LASF3311:
 	.string	"ebc_pmic_set_vcom"
 .LASF2656:
 	.string	"ALLOCSTALL_NORMAL"
-.LASF3136:
+.LASF3141:
 	.string	"data_buf_tmp"
 .LASF326:
 	.string	"__initdata_begin"
@@ -57574,13 +57904,13 @@ __exitcall_ebc_exit:
 	.string	"seq_show"
 .LASF767:
 	.string	"ate_match_dt"
-.LASF3230:
+.LASF3235:
 	.string	"of_node_put"
 .LASF1375:
 	.string	"cow_page"
 .LASF1607:
 	.string	"core_id"
-.LASF3178:
+.LASF3183:
 	.string	"ebc_get_2pix_wf_32"
 .LASF2504:
 	.string	"block"
@@ -57598,11 +57928,11 @@ __exitcall_ebc_exit:
 	.string	"param_ops_ushort"
 .LASF526:
 	.string	"s_shrink"
-.LASF3152:
+.LASF3157:
 	.string	"gray_new_temp"
 .LASF1540:
 	.string	"kcompactd_classzone_idx"
-.LASF3220:
+.LASF3225:
 	.string	"kmalloc_index"
 .LASF884:
 	.string	"hrtimer_restart"
@@ -57712,7 +58042,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_DELAYED_BIT"
 .LASF1053:
 	.string	"nr_failed_migrations_affine"
-.LASF3235:
+.LASF3240:
 	.string	"IS_ERR"
 .LASF876:
 	.string	"PCPU_FC_EMBED"
@@ -57726,7 +58056,7 @@ __exitcall_ebc_exit:
 	.string	"pi_top_task"
 .LASF806:
 	.string	"WORK_NR_COLORS"
-.LASF3172:
+.LASF3177:
 	.string	"refresh_new_image2"
 .LASF528:
 	.string	"s_fsnotify_inode_refs"
@@ -57738,7 +58068,7 @@ __exitcall_ebc_exit:
 	.string	"uprobe"
 .LASF529:
 	.string	"s_readonly_remount"
-.LASF3263:
+.LASF3268:
 	.string	"kasan_check_write"
 .LASF378:
 	.string	"hlist_bl_node"
@@ -57764,7 +58094,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_FLAG_MASK"
 .LASF1286:
 	.string	"units"
-.LASF3278:
+.LASF3283:
 	.string	"epd_lut_from_mem_init"
 .LASF312:
 	.string	"__nosave_begin"
@@ -57784,7 +58114,7 @@ __exitcall_ebc_exit:
 	.string	"user_namespace"
 .LASF2771:
 	.string	"param_ops_ulong"
-.LASF3251:
+.LASF3256:
 	.string	"get_current"
 .LASF232:
 	.string	"raw_spinlock"
@@ -57808,7 +58138,9 @@ __exitcall_ebc_exit:
 	.string	"fault_address"
 .LASF1621:
 	.string	"dq_inuse"
-.LASF3127:
+.LASF3108:
+	.string	"out_buffer"
+.LASF3132:
 	.string	"direct_mode_data_change_part"
 .LASF1656:
 	.string	"dqi_flags"
@@ -57816,9 +58148,9 @@ __exitcall_ebc_exit:
 	.string	"PGREFILL"
 .LASF2777:
 	.string	"param_ops_bint"
-.LASF3288:
-	.string	"ebc_add_to_dsp_buf_list"
 .LASF3293:
+	.string	"ebc_add_to_dsp_buf_list"
+.LASF3298:
 	.string	"kfree"
 .LASF1817:
 	.string	"swap_deactivate"
@@ -57888,7 +58220,7 @@ __exitcall_ebc_exit:
 	.string	"boost_expires"
 .LASF2929:
 	.string	"DMA_BIDIRECTIONAL"
-.LASF3314:
+.LASF3319:
 	.string	"__arch_copy_to_user"
 .LASF236:
 	.string	"spinlock"
@@ -57906,11 +58238,11 @@ __exitcall_ebc_exit:
 	.string	"d_compare"
 .LASF986:
 	.string	"vm_mm"
-.LASF3112:
+.LASF3117:
 	.string	"need_refresh"
 .LASF2835:
 	.string	"platform_bus_type"
-.LASF3128:
+.LASF3133:
 	.string	"data_buf"
 .LASF3064:
 	.string	"ulogo_buf"
@@ -57930,7 +58262,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_OFFQ_POOL_BITS"
 .LASF1920:
 	.string	"fl_fasync"
-.LASF3185:
+.LASF3190:
 	.string	"update_mode"
 .LASF2956:
 	.string	"direct_mode"
@@ -58004,13 +58336,13 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_HIGH_WMARK_HIT_QUICKLY"
 .LASF3074:
 	.string	"ebc_state_read"
-.LASF3302:
+.LASF3307:
 	.string	"__stack_chk_fail"
 .LASF2927:
 	.string	"pmic_set_vcom"
 .LASF2714:
 	.string	"stack_guard_gap"
-.LASF3243:
+.LASF3248:
 	.string	"bytes"
 .LASF1753:
 	.string	"gpl_future_crcs"
@@ -58114,7 +58446,7 @@ __exitcall_ebc_exit:
 	.string	"i_mtime"
 .LASF2619:
 	.string	"dev_page_fault_t"
-.LASF3122:
+.LASF3127:
 	.string	"ebc_auto_tast_function"
 .LASF24:
 	.string	"__kernel_gid32_t"
@@ -58126,7 +58458,7 @@ __exitcall_ebc_exit:
 	.string	"MODULE_STATE_COMING"
 .LASF2246:
 	.string	"offline_disabled"
-.LASF3228:
+.LASF3233:
 	.string	"of_property_read_u32_array"
 .LASF2491:
 	.string	"select"
@@ -58172,7 +58504,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pagemap"
 .LASF2663:
 	.string	"PGDEACTIVATE"
-.LASF3133:
+.LASF3138:
 	.string	"buffer_old_tmp"
 .LASF1799:
 	.string	"writepages"
@@ -58194,7 +58526,7 @@ __exitcall_ebc_exit:
 	.string	"writeback_control"
 .LASF1919:
 	.string	"fl_end"
-.LASF3317:
+.LASF3322:
 	.string	"ebc_find_buf_by_phy_addr"
 .LASF1966:
 	.string	"super_operations"
@@ -58234,13 +58566,13 @@ __exitcall_ebc_exit:
 	.string	"core"
 .LASF1830:
 	.string	"bd_holders"
-.LASF3125:
+.LASF3130:
 	.string	"reset_and_flip"
 .LASF2967:
 	.string	"enable"
 .LASF970:
 	.string	"pipe_bufs"
-.LASF3248:
+.LASF3253:
 	.string	"to_user"
 .LASF2139:
 	.string	"KOBJ_NS_TYPE_NET"
@@ -58260,7 +58592,7 @@ __exitcall_ebc_exit:
 	.string	"__rb_parent_color"
 .LASF2239:
 	.string	"devres_lock"
-.LASF3170:
+.LASF3175:
 	.string	"new_buffer_refresh"
 .LASF366:
 	.string	"bits"
@@ -58276,9 +58608,9 @@ __exitcall_ebc_exit:
 	.string	"lookup"
 .LASF1605:
 	.string	"cpu_topology"
-.LASF3252:
+.LASF3257:
 	.string	"sp_el0"
-.LASF3321:
+.LASF3326:
 	.string	"ebc_dsp_buf_get"
 .LASF2916:
 	.string	"panel_color"
@@ -58308,7 +58640,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_AUTO"
 .LASF1242:
 	.string	"i_pages"
-.LASF3212:
+.LASF3217:
 	.string	"safe_ptr"
 .LASF377:
 	.string	"hlist_bl_head"
@@ -58340,7 +58672,7 @@ __exitcall_ebc_exit:
 	.string	"holders_dir"
 .LASF3093:
 	.string	"__wq_entry"
-.LASF3107:
+.LASF3112:
 	.string	"new_buffer"
 .LASF464:
 	.string	"i_fsnotify_mask"
@@ -58348,7 +58680,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_LOW_WMARK_HIT_QUICKLY"
 .LASF1009:
 	.string	"syscfs"
-.LASF3205:
+.LASF3210:
 	.string	"wake_unlock"
 .LASF2460:
 	.string	"graph_get_port_parent"
@@ -58358,7 +58690,7 @@ __exitcall_ebc_exit:
 	.string	"UNEVICTABLE_PGRESCUED"
 .LASF2224:
 	.string	"msi_list"
-.LASF3254:
+.LASF3259:
 	.string	"__ilog2_u64"
 .LASF548:
 	.string	"compat_time_t"
@@ -58382,7 +58714,7 @@ __exitcall_ebc_exit:
 	.string	"cap_effective"
 .LASF1761:
 	.string	"taints"
-.LASF3273:
+.LASF3278:
 	.string	"of_address_to_resource"
 .LASF1027:
 	.string	"enqueued"
@@ -58410,7 +58742,7 @@ __exitcall_ebc_exit:
 	.string	"bd_private"
 .LASF1918:
 	.string	"fl_start"
-.LASF3227:
+.LASF3232:
 	.string	"out_value"
 .LASF1976:
 	.string	"freeze_fs"
@@ -58418,7 +58750,7 @@ __exitcall_ebc_exit:
 	.string	"sigset_t"
 .LASF1932:
 	.string	"lm_notify"
-.LASF3184:
+.LASF3189:
 	.string	"ebc_tcon_dsp_mode_set"
 .LASF895:
 	.string	"running"
@@ -58444,7 +58776,7 @@ __exitcall_ebc_exit:
 	.string	"d_automount"
 .LASF1280:
 	.string	"page_free"
-.LASF3123:
+.LASF3128:
 	.string	"__val"
 .LASF1496:
 	.string	"NR_FILE_MAPPED"
@@ -58456,13 +58788,13 @@ __exitcall_ebc_exit:
 	.string	"copy_file_range"
 .LASF2700:
 	.string	"UNEVICTABLE_PGCLEARED"
-.LASF3307:
+.LASF3312:
 	.string	"epd_lut_get_wf_version"
 .LASF2062:
 	.string	"key_type"
 .LASF798:
 	.string	"WORK_STRUCT_LINKED_BIT"
-.LASF3245:
+.LASF3250:
 	.string	"copy_overflow"
 .LASF2456:
 	.string	"get_named_child_node"
@@ -58478,7 +58810,7 @@ __exitcall_ebc_exit:
 	.string	"module_kobject"
 .LASF3069:
 	.string	"memory"
-.LASF3219:
+.LASF3224:
 	.string	"order"
 .LASF740:
 	.string	"active_memcg"
@@ -58514,7 +58846,7 @@ __exitcall_ebc_exit:
 	.string	"EPD_A2"
 .LASF2117:
 	.string	"kernfs_elem_attr"
-.LASF3110:
+.LASF3115:
 	.string	"new_buffer_temp"
 .LASF2314:
 	.string	"set_latency_tolerance"
@@ -58528,7 +58860,7 @@ __exitcall_ebc_exit:
 	.string	"arm64_ftr_reg_ctrel0"
 .LASF1259:
 	.string	"counters"
-.LASF3264:
+.LASF3269:
 	.string	"kasan_check_read"
 .LASF2074:
 	.string	"name_link"
@@ -58584,6 +58916,8 @@ __exitcall_ebc_exit:
 	.string	"WQ_CPU_INTENSIVE"
 .LASF3054:
 	.string	"ebc_tcon_node"
+.LASF3106:
+	.string	"change_8bit_to_4bit"
 .LASF2832:
 	.string	"id_entry"
 .LASF1811:
@@ -58592,7 +58926,7 @@ __exitcall_ebc_exit:
 	.string	"nr_irqs"
 .LASF909:
 	.string	"max_hang_time"
-.LASF3208:
+.LASF3213:
 	.string	"copy_from_user"
 .LASF2482:
 	.string	"DOMAIN_BUS_ANY"
@@ -58606,7 +58940,7 @@ __exitcall_ebc_exit:
 	.string	"mmap_miss"
 .LASF1669:
 	.string	"quota_format_ops"
-.LASF3319:
+.LASF3324:
 	.string	"ebc_osd_buf_get"
 .LASF3088:
 	.string	"argp"
@@ -58646,13 +58980,13 @@ __exitcall_ebc_exit:
 	.string	"thread_keyring"
 .LASF2760:
 	.string	"kparam_array"
-.LASF3266:
+.LASF3271:
 	.string	"platform_driver_unregister"
 .LASF653:
 	.string	"utime"
-.LASF3140:
+.LASF3145:
 	.string	"pix0"
-.LASF3141:
+.LASF3146:
 	.string	"pix1"
 .LASF1349:
 	.string	"start_code"
@@ -58660,7 +58994,7 @@ __exitcall_ebc_exit:
 	.string	"ebc_driver"
 .LASF2620:
 	.string	"dev_page_free_t"
-.LASF3225:
+.LASF3230:
 	.string	"of_property_read_u32"
 .LASF1413:
 	.string	"guid_t"
@@ -58668,7 +59002,7 @@ __exitcall_ebc_exit:
 	.string	"sysctl_panic_on_stackoverflow"
 .LASF1909:
 	.string	"fl_link"
-.LASF3116:
+.LASF3121:
 	.string	"check_black_percent"
 .LASF2264:
 	.string	"clock_list"
@@ -58682,7 +59016,7 @@ __exitcall_ebc_exit:
 	.string	"tz_minuteswest"
 .LASF2474:
 	.string	"of_chosen"
-.LASF3124:
+.LASF3129:
 	.string	"ebc_frame_start"
 .LASF349:
 	.string	"sve_state"
@@ -58692,7 +59026,7 @@ __exitcall_ebc_exit:
 	.string	"cpumask_t"
 .LASF134:
 	.string	"kmsg_fops"
-.LASF3316:
+.LASF3321:
 	.string	"ebc_buf_release"
 .LASF820:
 	.string	"WORK_STRUCT_NO_POOL"
@@ -58714,7 +59048,7 @@ __exitcall_ebc_exit:
 	.string	"sched_rt_entity"
 .LASF117:
 	.string	"sendpage"
-.LASF3176:
+.LASF3181:
 	.string	"ret_val"
 .LASF881:
 	.string	"timerqueue_node"
@@ -58724,7 +59058,7 @@ __exitcall_ebc_exit:
 	.string	"mem_dqblk"
 .LASF2787:
 	.string	"plt_entry"
-.LASF3186:
+.LASF3191:
 	.string	"display_mode"
 .LASF1995:
 	.string	"nr_cached_objects"
@@ -58756,11 +59090,11 @@ __exitcall_ebc_exit:
 	.string	"fops"
 .LASF1288:
 	.string	"f_path"
-.LASF3280:
+.LASF3285:
 	.string	"kthread_create_on_node"
 .LASF712:
 	.string	"cgroups"
-.LASF3211:
+.LASF3216:
 	.string	"__uaccess_mask_ptr"
 .LASF2359:
 	.string	"probe_type"
@@ -58780,9 +59114,9 @@ __exitcall_ebc_exit:
 	.string	"userspace_clients"
 .LASF2158:
 	.string	"uevent_seqnum"
-.LASF3276:
+.LASF3281:
 	.string	"memset"
-.LASF3183:
+.LASF3188:
 	.string	"cur_image_addr"
 .LASF2159:
 	.string	"list_lock"
@@ -58830,7 +59164,7 @@ __exitcall_ebc_exit:
 	.string	"qf_fmt_id"
 .LASF1065:
 	.string	"nr_wakeups_idle"
-.LASF3324:
+.LASF3329:
 	.string	"up_write"
 .LASF1473:
 	.string	"NR_MLOCK"
@@ -58866,7 +59200,7 @@ __exitcall_ebc_exit:
 	.string	"console_printk"
 .LASF703:
 	.string	"ioac"
-.LASF3238:
+.LASF3243:
 	.string	"__init_work"
 .LASF1186:
 	.string	"nr_to_scan"
@@ -58878,7 +59212,7 @@ __exitcall_ebc_exit:
 	.string	"exec_max"
 .LASF1418:
 	.string	"uuid_index"
-.LASF3239:
+.LASF3244:
 	.string	"onstack"
 .LASF190:
 	.string	"compat_rmtp"
@@ -58890,7 +59224,7 @@ __exitcall_ebc_exit:
 	.string	"nfs_fl"
 .LASF403:
 	.string	"dentry"
-.LASF3256:
+.LASF3261:
 	.string	"__be32_to_cpup"
 .LASF2181:
 	.string	"klist_node"
@@ -58974,7 +59308,7 @@ __exitcall_ebc_exit:
 	.string	"d_rt_space"
 .LASF265:
 	.string	"name"
-.LASF3286:
+.LASF3291:
 	.string	"mod_timer"
 .LASF151:
 	.string	"early_boot_irqs_disabled"
@@ -59000,7 +59334,7 @@ __exitcall_ebc_exit:
 	.string	"i_gid"
 .LASF1634:
 	.string	"quota_type"
-.LASF3130:
+.LASF3135:
 	.string	"buffer_old"
 .LASF1551:
 	.string	"high"
@@ -59046,7 +59380,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_WRITE_PENDING"
 .LASF1311:
 	.string	"close"
-.LASF3164:
+.LASF3169:
 	.string	"image_fb_data"
 .LASF3065:
 	.string	"klogo_buf"
@@ -59058,13 +59392,13 @@ __exitcall_ebc_exit:
 	.string	"ebc_wq"
 .LASF737:
 	.string	"memcg_oom_gfp_mask"
-.LASF3241:
+.LASF3246:
 	.string	"_msecs_to_jiffies"
 .LASF1698:
 	.string	"d_spc_timer"
 .LASF1774:
 	.string	"jump_entries"
-.LASF3249:
+.LASF3254:
 	.string	"test_ti_thread_flag"
 .LASF2270:
 	.string	"async_suspend"
@@ -59074,7 +59408,7 @@ __exitcall_ebc_exit:
 	.string	"read_pos"
 .LASF482:
 	.string	"super_block"
-.LASF3213:
+.LASF3218:
 	.string	"__addr"
 .LASF2337:
 	.string	"dma_coherent"
@@ -59120,11 +59454,11 @@ __exitcall_ebc_exit:
 	.string	"devkmsg_log_str"
 .LASF255:
 	.string	"FTR_HIGHER_SAFE"
-.LASF3224:
+.LASF3229:
 	.string	"i2c_get_clientdata"
-.LASF3209:
+.LASF3214:
 	.string	"_copy_to_user"
-.LASF3259:
+.LASF3264:
 	.string	"test_bit"
 .LASF249:
 	.string	"__start___jump_table"
@@ -59140,7 +59474,7 @@ __exitcall_ebc_exit:
 	.string	"mems_allowed_seq"
 .LASF1785:
 	.string	"refcnt"
-.LASF3113:
+.LASF3118:
 	.string	"pbuf_new"
 .LASF2196:
 	.string	"thaw"
@@ -59156,9 +59490,9 @@ __exitcall_ebc_exit:
 	.string	"futex"
 .LASF1040:
 	.string	"wait_max"
-.LASF3284:
+.LASF3289:
 	.string	"wakeup_source_add"
-.LASF3202:
+.LASF3207:
 	.string	"ebc_pmic_suspend"
 .LASF1173:
 	.string	"result_mask"
@@ -59170,15 +59504,15 @@ __exitcall_ebc_exit:
 	.string	"dquot_operations"
 .LASF1239:
 	.string	"mapping"
-.LASF3234:
+.LASF3239:
 	.string	"resource_size"
-.LASF3281:
+.LASF3286:
 	.string	"wake_up_process"
 .LASF1369:
 	.string	"kioctx_table"
 .LASF867:
 	.string	"rb_right"
-.LASF3132:
+.LASF3137:
 	.string	"buffer_new_tmp"
 .LASF993:
 	.string	"vm_file"
@@ -59204,19 +59538,21 @@ __exitcall_ebc_exit:
 	.string	"__initdata_end"
 .LASF2516:
 	.string	"bus_lock"
-.LASF3221:
+.LASF3226:
 	.string	"kmalloc_type"
 .LASF388:
 	.string	"qstr"
-.LASF3135:
+.LASF3140:
 	.string	"gray_new"
+.LASF3107:
+	.string	"in_buffer"
 .LASF1107:
 	.string	"futex_state"
 .LASF1493:
 	.string	"WORKINGSET_RESTORE"
 .LASF629:
 	.string	"sched_psi_wake_requeue"
-.LASF3242:
+.LASF3247:
 	.string	"check_copy_size"
 .LASF738:
 	.string	"memcg_oom_order"
@@ -59272,7 +59608,7 @@ __exitcall_ebc_exit:
 	.string	"core_state"
 .LASF883:
 	.string	"timerqueue_head"
-.LASF3283:
+.LASF3288:
 	.string	"sched_setscheduler_nocheck"
 .LASF1306:
 	.string	"f_wb_err"
@@ -59280,7 +59616,7 @@ __exitcall_ebc_exit:
 	.string	"rt_mutex"
 .LASF1005:
 	.string	"rchar"
-.LASF3194:
+.LASF3199:
 	.string	"valid_dma_direction"
 .LASF1833:
 	.string	"bd_contains"
@@ -59322,7 +59658,7 @@ __exitcall_ebc_exit:
 	.string	"epoll_watches"
 .LASF2692:
 	.string	"KCOMPACTD_WAKE"
-.LASF3159:
+.LASF3164:
 	.string	"refresh_new_image"
 .LASF2089:
 	.string	"non_rcu"
@@ -59396,13 +59732,13 @@ __exitcall_ebc_exit:
 	.string	"need"
 .LASF505:
 	.string	"s_encoding"
-.LASF3237:
+.LASF3242:
 	.string	"queue_work"
 .LASF1749:
 	.string	"gpl_crcs"
 .LASF1735:
 	.string	"get_state"
-.LASF3197:
+.LASF3202:
 	.string	"dma_handle"
 .LASF1374:
 	.string	"orig_pte"
@@ -59470,13 +59806,13 @@ __exitcall_ebc_exit:
 	.string	"NR_WRITEBACK_TEMP"
 .LASF2528:
 	.string	"functionality"
-.LASF3143:
+.LASF3148:
 	.string	"clac_part_data_align8"
 .LASF306:
 	.string	"__ctors_end"
 .LASF2281:
 	.string	"wakeup_path"
-.LASF3303:
+.LASF3308:
 	.string	"ebc_buf_state_show"
 .LASF983:
 	.string	"vm_prev"
@@ -59492,7 +59828,7 @@ __exitcall_ebc_exit:
 	.string	"__u8"
 .LASF116:
 	.string	"lock"
-.LASF3201:
+.LASF3206:
 	.string	"ebc_pmic_resume"
 .LASF1577:
 	.string	"compact_cached_migrate_pfn"
@@ -59534,7 +59870,7 @@ __exitcall_ebc_exit:
 	.string	"compact_order_failed"
 .LASF1120:
 	.string	"fsuid"
-.LASF3250:
+.LASF3255:
 	.string	"flag"
 .LASF1490:
 	.string	"NR_ISOLATED_FILE"
@@ -59546,9 +59882,9 @@ __exitcall_ebc_exit:
 	.string	"managed_pages"
 .LASF2604:
 	.string	"__tracepoint_page_ref_set"
-.LASF3190:
+.LASF3195:
 	.string	"ebc_tcon_enable"
-.LASF3331:
+.LASF3336:
 	.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"
@@ -59596,13 +59932,13 @@ __exitcall_ebc_exit:
 	.string	"s_vop"
 .LASF1665:
 	.string	"qf_owner"
-.LASF3265:
+.LASF3270:
 	.string	"__write_once_size"
 .LASF2846:
 	.string	"kmalloc_cache_type"
 .LASF575:
 	.string	"mutex"
-.LASF3229:
+.LASF3234:
 	.string	"out_values"
 .LASF854:
 	.string	"pgd_t"
@@ -59616,7 +59952,7 @@ __exitcall_ebc_exit:
 	.string	"raw_spinlock_t"
 .LASF2954:
 	.string	"vir_width"
-.LASF3253:
+.LASF3258:
 	.string	"INIT_LIST_HEAD"
 .LASF1953:
 	.string	"fs_flags"
@@ -59634,7 +59970,7 @@ __exitcall_ebc_exit:
 	.string	"resume_frame_count"
 .LASF1204:
 	.string	"radix_tree_node"
-.LASF3255:
+.LASF3260:
 	.string	"sign_extend64"
 .LASF2328:
 	.string	"wake_irq"
@@ -59656,13 +59992,13 @@ __exitcall_ebc_exit:
 	.string	"ptraced"
 .LASF2766:
 	.string	"param_ops_short"
-.LASF3298:
+.LASF3303:
 	.string	"of_find_device_by_node"
 .LASF2568:
 	.string	"HRTIMER_SOFTIRQ"
 .LASF802:
 	.string	"WORK_STRUCT_DELAYED"
-.LASF3175:
+.LASF3180:
 	.string	"ebc_get_2pix_wf_part_32"
 .LASF455:
 	.string	"i_sequence"
@@ -59684,7 +60020,7 @@ __exitcall_ebc_exit:
 	.string	"addr"
 .LASF2400:
 	.string	"device_private"
-.LASF3192:
+.LASF3197:
 	.string	"get_dma_ops"
 .LASF2712:
 	.string	"watermark_scale_factor"
@@ -59700,7 +60036,7 @@ __exitcall_ebc_exit:
 	.string	"mkobj"
 .LASF2981:
 	.string	"direct_buf_real_size"
-.LASF3320:
+.LASF3325:
 	.string	"__pm_relax"
 .LASF473:
 	.string	"d_delete"
@@ -59748,7 +60084,7 @@ __exitcall_ebc_exit:
 	.string	"kill"
 .LASF1044:
 	.string	"iowait_sum"
-.LASF3160:
+.LASF3165:
 	.string	"image_new"
 .LASF15:
 	.string	"__u64"
@@ -59782,7 +60118,7 @@ __exitcall_ebc_exit:
 	.string	"sum_sleep_runtime"
 .LASF3062:
 	.string	"ulogo_addr_str"
-.LASF3126:
+.LASF3131:
 	.string	"flip"
 .LASF1093:
 	.string	"deadline"
@@ -59826,11 +60162,11 @@ __exitcall_ebc_exit:
 	.string	"read_dqblk"
 .LASF1630:
 	.string	"dq_flags"
-.LASF3129:
+.LASF3134:
 	.string	"buffer_new"
 .LASF213:
 	.string	"user_fpsimd_state"
-.LASF3297:
+.LASF3302:
 	.string	"device_create_file"
 .LASF521:
 	.string	"s_time_gran"
@@ -59854,11 +60190,11 @@ __exitcall_ebc_exit:
 	.string	"s_bdi"
 .LASF2871:
 	.string	"wf_table"
-.LASF3166:
+.LASF3171:
 	.string	"image_new_tmp"
 .LASF1746:
 	.string	"num_kp"
-.LASF3330:
+.LASF3335:
 	.string	"__pm_stay_awake"
 .LASF2579:
 	.string	"vmap_area_list"
@@ -60064,7 +60400,7 @@ __exitcall_ebc_exit:
 	.string	"s_inode_list_lock"
 .LASF2614:
 	.string	"align"
-.LASF3137:
+.LASF3142:
 	.string	"frame_idx"
 .LASF204:
 	.string	"mm_segment_t"
@@ -60086,7 +60422,7 @@ __exitcall_ebc_exit:
 	.string	"maj_flt"
 .LASF229:
 	.string	"arch_rwlock_t"
-.LASF3318:
+.LASF3323:
 	.string	"ebc_osd_buf_clone"
 .LASF162:
 	.string	"c_false"
@@ -60112,7 +60448,7 @@ __exitcall_ebc_exit:
 	.string	"minor"
 .LASF1713:
 	.string	"nextents"
-.LASF3195:
+.LASF3200:
 	.string	"dma_direction"
 .LASF1:
 	.string	"sizetype"
@@ -60122,7 +60458,7 @@ __exitcall_ebc_exit:
 	.string	"arg_lock"
 .LASF1755:
 	.string	"num_exentries"
-.LASF3115:
+.LASF3120:
 	.string	"check_out"
 .LASF2623:
 	.string	"high_memory"
@@ -60136,7 +60472,7 @@ __exitcall_ebc_exit:
 	.string	"next_timer"
 .LASF741:
 	.string	"throttle_queue"
-.LASF3313:
+.LASF3318:
 	.string	"finish_wait"
 .LASF1494:
 	.string	"WORKINGSET_NODERECLAIM"
@@ -60148,7 +60484,7 @@ __exitcall_ebc_exit:
 	.string	"keyring_index_key"
 .LASF833:
 	.string	"__WQ_ORDERED"
-.LASF3189:
+.LASF3194:
 	.string	"ebc_tcon_disable"
 .LASF1435:
 	.string	"leases_enable"
@@ -60190,7 +60526,7 @@ __exitcall_ebc_exit:
 	.string	"num_vf"
 .LASF1549:
 	.string	"isolate_mode_t"
-.LASF3196:
+.LASF3201:
 	.string	"debug_dma_sync_single_for_device"
 .LASF99:
 	.string	"llseek"
@@ -60232,9 +60568,9 @@ __exitcall_ebc_exit:
 	.string	"target"
 .LASF2560:
 	.string	"HI_SOFTIRQ"
-.LASF3198:
+.LASF3203:
 	.string	"direction"
-.LASF3165:
+.LASF3170:
 	.string	"image_bg_data"
 .LASF972:
 	.string	"session_keyring"
@@ -60244,7 +60580,7 @@ __exitcall_ebc_exit:
 	.string	"key_restrict_link_func_t"
 .LASF1499:
 	.string	"NR_WRITEBACK"
-.LASF3151:
+.LASF3156:
 	.string	"frame_count"
 .LASF487:
 	.string	"s_maxbytes"
@@ -60258,7 +60594,7 @@ __exitcall_ebc_exit:
 	.string	"i2c_bus_type"
 .LASF899:
 	.string	"hrtimer_cpu_base"
-.LASF3325:
+.LASF3330:
 	.string	"ebc_notify"
 .LASF1405:
 	.string	"cb_head"
@@ -60286,7 +60622,7 @@ __exitcall_ebc_exit:
 	.string	"cpus_requested"
 .LASF2608:
 	.string	"__tracepoint_page_ref_mod_unless"
-.LASF3206:
+.LASF3211:
 	.string	"wake_lock_init"
 .LASF1200:
 	.string	"list_lru"
@@ -60312,7 +60648,7 @@ __exitcall_ebc_exit:
 	.string	"d_iput"
 .LASF108:
 	.string	"compat_ioctl"
-.LASF3214:
+.LASF3219:
 	.string	"__range_ok"
 .LASF287:
 	.string	"__start_ro_after_init"
@@ -60320,7 +60656,7 @@ __exitcall_ebc_exit:
 	.string	"num_poisoned_pages"
 .LASF919:
 	.string	"filter"
-.LASF3199:
+.LASF3204:
 	.string	"ebc_pmic_get_vcom"
 .LASF2962:
 	.string	"ebc_tcon"
@@ -60432,11 +60768,11 @@ __exitcall_ebc_exit:
 	.string	"power"
 .LASF266:
 	.string	"strict_mask"
-.LASF3312:
+.LASF3317:
 	.string	"init_wait_entry"
 .LASF2801:
 	.string	"module_state"
-.LASF3268:
+.LASF3273:
 	.string	"_dev_info"
 .LASF417:
 	.string	"d_subdirs"
@@ -60482,9 +60818,9 @@ __exitcall_ebc_exit:
 	.string	"removed_mem"
 .LASF248:
 	.string	"jump_label_t"
-.LASF3299:
+.LASF3304:
 	.string	"of_get_property"
-.LASF3180:
+.LASF3185:
 	.string	"ebc_tcon_frame_start"
 .LASF2726:
 	.string	"Elf64_Half"
@@ -60498,7 +60834,7 @@ __exitcall_ebc_exit:
 	.string	"can_wakeup"
 .LASF2561:
 	.string	"TIMER_SOFTIRQ"
-.LASF3156:
+.LASF3161:
 	.string	"temp_data"
 .LASF1229:
 	.string	"xol_area"
@@ -60524,11 +60860,11 @@ __exitcall_ebc_exit:
 	.string	"init_on_free"
 .LASF1166:
 	.string	"nr_pages"
-.LASF3173:
+.LASF3178:
 	.string	"ebc_power_set"
 .LASF1776:
 	.string	"num_trace_bprintk_fmt"
-.LASF3262:
+.LASF3267:
 	.string	"__fls"
 .LASF1144:
 	.string	"ioprio"
@@ -60554,9 +60890,9 @@ __exitcall_ebc_exit:
 	.string	"persistent_clock_is_local"
 .LASF2428:
 	.string	"dma_supported"
-.LASF3231:
+.LASF3236:
 	.string	"dev_set_drvdata"
-.LASF3326:
+.LASF3331:
 	.string	"epd_lut_get"
 .LASF1550:
 	.string	"per_cpu_pages"
@@ -60592,7 +60928,7 @@ __exitcall_ebc_exit:
 	.string	"BLOCK_SOFTIRQ"
 .LASF1426:
 	.string	"files_stat_struct"
-.LASF3274:
+.LASF3279:
 	.string	"devm_memremap"
 .LASF858:
 	.string	"pgtable_t"
@@ -60604,13 +60940,13 @@ __exitcall_ebc_exit:
 	.string	"symlink"
 .LASF1589:
 	.string	"mem_map"
-.LASF3108:
+.LASF3113:
 	.string	"old_buffer"
 .LASF2972:
 	.string	"lut_data_set"
 .LASF791:
 	.string	"sysctl_timer_migration"
-.LASF3146:
+.LASF3151:
 	.string	"clac_full_data_16_to_32"
 .LASF2932:
 	.string	"DMA_NONE"
@@ -60622,7 +60958,7 @@ __exitcall_ebc_exit:
 	.string	"WAKE_LOCK_SUSPEND"
 .LASF1792:
 	.string	"WRITE_LIFE_SHORT"
-.LASF3257:
+.LASF3262:
 	.string	"__swab32p"
 .LASF286:
 	.string	"_einittext"
@@ -60664,7 +61000,7 @@ __exitcall_ebc_exit:
 	.string	"rm_xquota"
 .LASF1099:
 	.string	"dl_timer"
-.LASF3308:
+.LASF3313:
 	.string	"remap_pfn_range"
 .LASF2390:
 	.string	"DL_DEV_NO_DRIVER"
@@ -60678,7 +61014,7 @@ __exitcall_ebc_exit:
 	.string	"watermark"
 .LASF2438:
 	.string	"deadprops"
-.LASF3270:
+.LASF3275:
 	.string	"devm_kmalloc"
 .LASF16:
 	.string	"long long unsigned int"
@@ -60814,7 +61150,7 @@ __exitcall_ebc_exit:
 	.string	"free_list"
 .LASF590:
 	.string	"prio"
-.LASF3223:
+.LASF3228:
 	.string	"platform_get_drvdata"
 .LASF2570:
 	.string	"NR_SOFTIRQS"
@@ -60836,7 +61172,7 @@ __exitcall_ebc_exit:
 	.string	"atomic_t"
 .LASF813:
 	.string	"WORK_OFFQ_FLAG_BITS"
-.LASF3181:
+.LASF3186:
 	.string	"ebc_tcon_image_addr_set"
 .LASF2546:
 	.string	"max_num_msgs"
@@ -60856,7 +61192,7 @@ __exitcall_ebc_exit:
 	.string	"scatterlist"
 .LASF1282:
 	.string	"altmap_valid"
-.LASF3328:
+.LASF3333:
 	.string	"down"
 .LASF102:
 	.string	"read_iter"
@@ -60894,7 +61230,7 @@ __exitcall_ebc_exit:
 	.string	"pm_domain_data"
 .LASF2502:
 	.string	"byte"
-.LASF3294:
+.LASF3299:
 	.string	"__wake_up_sync"
 .LASF2017:
 	.string	"poll_table_struct"
@@ -60920,7 +61256,7 @@ __exitcall_ebc_exit:
 	.string	"page_fault"
 .LASF1484:
 	.string	"NR_INACTIVE_FILE"
-.LASF3246:
+.LASF3251:
 	.string	"__ret_warn_on"
 .LASF1640:
 	.string	"kqid"
@@ -60992,7 +61328,7 @@ __exitcall_ebc_exit:
 	.string	"shift"
 .LASF1452:
 	.string	"ia_gid"
-.LASF3118:
+.LASF3123:
 	.string	"vaild_size"
 .LASF36:
 	.string	"name_offset"
@@ -61002,7 +61338,7 @@ __exitcall_ebc_exit:
 	.string	"__irqentry_text_end"
 .LASF1361:
 	.string	"context"
-.LASF3150:
+.LASF3155:
 	.string	"get_overlay_image"
 .LASF1555:
 	.string	"per_cpu_nodestat"
@@ -61044,7 +61380,7 @@ __exitcall_ebc_exit:
 	.string	"of_match_table"
 .LASF2593:
 	.string	"percpu_count_ptr"
-.LASF3309:
+.LASF3314:
 	.string	"ebc_phy_buf_base_get"
 .LASF2094:
 	.string	"loops_per_jiffy"
@@ -61066,7 +61402,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_INODESTEAL"
 .LASF1190:
 	.string	"count_objects"
-.LASF3261:
+.LASF3266:
 	.string	"fls64"
 .LASF936:
 	.string	"_stime"
@@ -61086,7 +61422,7 @@ __exitcall_ebc_exit:
 	.string	"statistics"
 .LASF2953:
 	.string	"current_buffer"
-.LASF3144:
+.LASF3149:
 	.string	"direct_mode_data_change"
 .LASF1633:
 	.string	"kprojid_t"
@@ -61102,11 +61438,11 @@ __exitcall_ebc_exit:
 	.string	"sync_sg_for_device"
 .LASF1979:
 	.string	"statfs"
-.LASF3289:
+.LASF3294:
 	.string	"__kmalloc"
-.LASF3277:
+.LASF3282:
 	.string	"_dev_err"
-.LASF3267:
+.LASF3272:
 	.string	"__platform_driver_register"
 .LASF2980:
 	.string	"ebc_buf_real_size"
@@ -61192,7 +61528,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_PENDING_BIT"
 .LASF721:
 	.string	"rseq"
-.LASF3158:
+.LASF3163:
 	.string	"get_auto_image"
 .LASF196:
 	.string	"nfds"
@@ -61206,7 +61542,7 @@ __exitcall_ebc_exit:
 	.string	"i_acl"
 .LASF1804:
 	.string	"bmap"
-.LASF3275:
+.LASF3280:
 	.string	"ebc_buf_init"
 .LASF2063:
 	.string	"key_payload"
@@ -61246,7 +61582,7 @@ __exitcall_ebc_exit:
 	.string	"fallocate"
 .LASF1722:
 	.string	"i_spc_warnlimit"
-.LASF3247:
+.LASF3252:
 	.string	"check_object_size"
 .LASF1530:
 	.string	"node_present_pages"
@@ -61310,7 +61646,7 @@ __exitcall_ebc_exit:
 	.string	"hiwater_vm"
 .LASF3077:
 	.string	"pmic_vcom_read"
-.LASF3269:
+.LASF3274:
 	.string	"misc_deregister"
 .LASF1263:
 	.string	"compound_head"
@@ -61330,7 +61666,7 @@ __exitcall_ebc_exit:
 	.string	"bd_write_holder"
 .LASF2209:
 	.string	"poweroff_noirq"
-.LASF3272:
+.LASF3277:
 	.string	"of_parse_phandle"
 .LASF1873:
 	.string	"rename"
@@ -61360,9 +61696,9 @@ __exitcall_ebc_exit:
 	.string	"sync_single_for_cpu"
 .LASF794:
 	.string	"data"
-.LASF3216:
+.LASF3221:
 	.string	"kzalloc"
-.LASF3240:
+.LASF3245:
 	.string	"msecs_to_jiffies"
 .LASF1934:
 	.string	"lm_break"
@@ -61398,7 +61734,7 @@ __exitcall_ebc_exit:
 	.string	"signed char"
 .LASF376:
 	.string	"rcu_scheduler_active"
-.LASF3226:
+.LASF3231:
 	.string	"propname"
 .LASF2116:
 	.string	"priv"
@@ -61514,7 +61850,7 @@ __exitcall_ebc_exit:
 	.string	"WQ_MAX_UNBOUND_PER_CPU"
 .LASF1552:
 	.string	"per_cpu_pageset"
-.LASF3282:
+.LASF3287:
 	.string	"__alloc_workqueue_key"
 .LASF760:
 	.string	"status"
@@ -61528,7 +61864,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_GCC16"
 .LASF2529:
 	.string	"i2c_lock_operations"
-.LASF3177:
+.LASF3182:
 	.string	"ebc_get_4pix_wf_part"
 .LASF1635:
 	.string	"USRQUOTA"
@@ -61574,9 +61910,9 @@ __exitcall_ebc_exit:
 	.string	"f_inode"
 .LASF2046:
 	.string	"procname"
-.LASF3155:
+.LASF3160:
 	.string	"point_data"
-.LASF3279:
+.LASF3284:
 	.string	"epd_lut_from_file_init"
 .LASF1684:
 	.string	"mark_dirty"
@@ -61606,11 +61942,11 @@ __exitcall_ebc_exit:
 	.string	"releasepage"
 .LASF1717:
 	.string	"qc_info"
-.LASF3131:
+.LASF3136:
 	.string	"clac_part_data_32_to_16"
 .LASF3100:
 	.string	"ebc_thread"
-.LASF3114:
+.LASF3119:
 	.string	"pbuf_old"
 .LASF2905:
 	.string	"EPD_A2_ENTER"
@@ -61628,7 +61964,7 @@ __exitcall_ebc_exit:
 	.string	"win_y1"
 .LASF2886:
 	.string	"win_y2"
-.LASF3109:
+.LASF3114:
 	.string	"buf_size"
 .LASF2103:
 	.string	"bitmap"
@@ -61732,7 +62068,7 @@ __exitcall_ebc_exit:
 	.string	"percpu_size"
 .LASF1338:
 	.string	"mmap_sem"
-.LASF3310:
+.LASF3315:
 	.string	"schedule"
 .LASF2457:
 	.string	"get_reference_args"
@@ -61838,7 +62174,7 @@ __exitcall_ebc_exit:
 	.string	"restore_noirq"
 .LASF1442:
 	.string	"ki_filp"
-.LASF3149:
+.LASF3154:
 	.string	"clac_full_data_align16"
 .LASF1127:
 	.string	"cap_ambient"
@@ -61860,13 +62196,13 @@ __exitcall_ebc_exit:
 	.string	"PROBE_DEFAULT_STRATEGY"
 .LASF2761:
 	.string	"elemsize"
-.LASF3142:
+.LASF3147:
 	.string	"clac_part_data_align16"
 .LASF906:
 	.string	"nr_events"
 .LASF2336:
 	.string	"iommu"
-.LASF3147:
+.LASF3152:
 	.string	"clac_full_data_32"
 .LASF360:
 	.string	"private"
@@ -61890,7 +62226,7 @@ __exitcall_ebc_exit:
 	.string	"uid_keyring"
 .LASF726:
 	.string	"splice_pipe"
-.LASF3121:
+.LASF3126:
 	.string	"frame_done_callback"
 .LASF1815:
 	.string	"error_remove_page"
@@ -61936,7 +62272,7 @@ __exitcall_ebc_exit:
 	.string	"compound_mapcount"
 .LASF1464:
 	.string	"zone_stat_item"
-.LASF3218:
+.LASF3223:
 	.string	"kmalloc_large"
 .LASF2641:
 	.string	"PE_SIZE_PMD"
@@ -61974,7 +62310,7 @@ __exitcall_ebc_exit:
 	.string	"gp_count"
 .LASF2066:
 	.string	"key_restriction"
-.LASF3106:
+.LASF3111:
 	.string	"check_part_mode"
 .LASF619:
 	.string	"exit_state"
@@ -62008,7 +62344,7 @@ __exitcall_ebc_exit:
 	.string	"last_waited"
 .LASF3085:
 	.string	"ebc_open"
-.LASF3187:
+.LASF3192:
 	.string	"three_win_mode"
 .LASF2890:
 	.string	"EPD_OVERLAY"
@@ -62032,6 +62368,8 @@ __exitcall_ebc_exit:
 	.string	"notifier_block"
 .LASF2311:
 	.string	"suspended_jiffies"
+.LASF3110:
+	.string	"buffer_out"
 .LASF2177:
 	.string	"mm_kobj"
 .LASF2759:
@@ -62060,7 +62398,7 @@ __exitcall_ebc_exit:
 	.string	"timer_expires"
 .LASF2842:
 	.string	"mmlist_lock"
-.LASF3204:
+.LASF3209:
 	.string	"ebc_pmic_power_on"
 .LASF1780:
 	.string	"trace_evals"
@@ -62104,7 +62442,7 @@ __exitcall_ebc_exit:
 	.string	"relax_count"
 .LASF1428:
 	.string	"nr_free_files"
-.LASF3217:
+.LASF3222:
 	.string	"kmalloc"
 	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
 	.section	.note.GNU-stack,"",@progbits
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S
index b5473ad96cf4..2105f05b4410 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S
@@ -12,13 +12,92 @@
 	.cfi_sections	.debug_frame
 	.align	2
 	.p2align 3,,7
-	.type	get_wf_mode_index, %function
-get_wf_mode_index:
-.LFB1550:
+	.type	pvi_lut_init_wf_table, %function
+pvi_lut_init_wf_table:
+.LFB1557:
 	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform.c"
-	.loc 1 349 0
+	.loc 1 679 0
 	.cfi_startproc
 .LVL0:
+	.loc 1 683 0
+	cmp	w1, 0
+	ble	.L14
+	adrp	x2, .LANCHOR0
+	mov	w13, 0
+.LVL1:
+	ldr	x6, [x2, #:lo12:.LANCHOR0]
+.LVL2:
+.L6:
+	lsl	w12, w13, 10
+	lsl	w10, w13, 16
+	mov	w11, 0
+	.p2align 2
+.L4:
+	ubfiz	w9, w11, 5, 4
+	and	w8, w11, 240
+	add	w9, w9, w12
+	add	w8, w12, w8, lsl 1
+	.loc 1 679 0
+	mov	x4, 0
+	.p2align 2
+.L3:
+	and	w2, w4, 65535
+.LVL3:
+.LBB4:
+	.loc 1 692 0 discriminator 3
+	add	w7, w10, w4
+	.loc 1 691 0 discriminator 3
+	add	w3, w8, w2, lsr 4
+	.loc 1 690 0 discriminator 3
+	and	w2, w2, 15
+.LVL4:
+	add	w2, w2, w9
+	add	x4, x4, 1
+.LBE4:
+	.loc 1 685 0 discriminator 3
+	cmp	x4, 256
+.LBB5:
+	.loc 1 691 0 discriminator 3
+	ldrb	w3, [x6, w3, sxtw]
+	.loc 1 690 0 discriminator 3
+	ldrb	w5, [x6, w2, sxtw]
+	.loc 1 692 0 discriminator 3
+	ubfiz	w2, w3, 2, 2
+	.loc 1 690 0 discriminator 3
+	and	w3, w5, 3
+	.loc 1 692 0 discriminator 3
+	orr	w2, w2, w3
+	strb	w2, [x0, w7, sxtw]
+.LBE5:
+	.loc 1 685 0 discriminator 3
+	bne	.L3
+	.loc 1 684 0 discriminator 2
+	add	w11, w11, 1
+.LVL5:
+	add	w10, w10, 256
+	and	w11, w11, 65535
+.LVL6:
+	cmp	w11, 256
+	bne	.L4
+	.loc 1 683 0 discriminator 2
+	add	w13, w13, 1
+	cmp	w1, w13
+	bne	.L6
+	ret
+.LVL7:
+.L14:
+	ret
+	.cfi_endproc
+.LFE1557:
+	.size	pvi_lut_init_wf_table, .-pvi_lut_init_wf_table
+	.align	2
+	.p2align 3,,7
+	.type	get_wf_mode_index, %function
+get_wf_mode_index:
+.LFB1551:
+	.loc 1 473 0
+	.cfi_startproc
+.LVL8:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -28,70 +107,70 @@ get_wf_mode_index:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-	.loc 1 350 0
+	.loc 1 474 0
 	adrp	x19, .LANCHOR0
 	add	x1, x19, :lo12:.LANCHOR0
-	.loc 1 349 0
+	.loc 1 473 0
 	mov	w20, w0
-	.loc 1 350 0
-	ldr	x3, [x1, 40]
-.LVL1:
-.LBB6:
-.LBB7:
-	.loc 1 250 0
+	.loc 1 474 0
+	ldr	x3, [x1, 48]
+.LVL9:
+.LBB8:
+.LBB9:
+	.loc 1 374 0
 	ldrb	w0, [x3, 16]
-.LVL2:
+.LVL10:
 	cmp	w0, 25
-	beq	.L3
-	bhi	.L4
+	beq	.L17
+	bhi	.L18
 	cmp	w0, 18
-	beq	.L5
-	bls	.L47
+	beq	.L19
+	bls	.L60
 	cmp	w0, 22
-	bne	.L48
-	.loc 1 264 0
-	mov	w2, 1
-	.loc 1 268 0
-	mov	w0, 4
-	.loc 1 266 0
-	mov	w6, 2
-	.loc 1 267 0
-	mov	w5, 3
-	.loc 1 270 0
-	mov	w4, 5
-	.loc 1 271 0
-	mov	w3, 6
-.LVL3:
-	.loc 1 263 0
-	str	wzr, [x19, #:lo12:.LANCHOR0]
-.LBE7:
-.LBE6:
-	.loc 1 356 0
-	cmp	w20, 5
-.LBB12:
-.LBB8:
-	.loc 1 265 0
-	stp	w2, w2, [x1, 4]
-	.loc 1 267 0
-	stp	w6, w5, [x1, 12]
-	.loc 1 269 0
-	stp	w0, w0, [x1, 20]
-	.loc 1 270 0
-	stp	w3, w4, [x1, 28]
+	bne	.L61
+	.loc 1 388 0
+	mov	w3, 1
+.LVL11:
+	.loc 1 392 0
+	mov	w2, 4
+	.loc 1 390 0
+	mov	w7, 2
+	.loc 1 391 0
+	mov	w6, 3
+	.loc 1 394 0
+	mov	w5, 5
+	.loc 1 395 0
+	mov	w4, 6
+	.loc 1 388 0
+	stp	wzr, w3, [x1, 8]
+.LBE9:
 .LBE8:
-.LBE12:
-	.loc 1 356 0
-	bne	.L49
+	.loc 1 480 0
+	cmp	w20, 5
+.LBB14:
+.LBB10:
+	.loc 1 390 0
+	stp	w3, w7, [x1, 16]
+	.loc 1 392 0
+	stp	w6, w2, [x1, 24]
+	.loc 1 395 0
+	stp	w2, w4, [x1, 32]
+	.loc 1 394 0
+	str	w5, [x1, 40]
+.LBE10:
+.LBE14:
+	.loc 1 480 0
+	bne	.L62
 	.p2align 2
-.L28:
+.L42:
 	add	x19, x19, :lo12:.LANCHOR0
-	add	x19, x19, 12
-.L14:
-	.loc 1 395 0
+	add	x19, x19, 20
+.L28:
+	.loc 1 519 0
 	ldr	w0, [x19]
-	.loc 1 396 0
+	.loc 1 520 0
 	ldp	x19, x20, [sp, 16]
-.LVL4:
+.LVL12:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -100,78 +179,78 @@ get_wf_mode_index:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL5:
+.LVL13:
 	.p2align 3
-.L4:
+.L18:
 	.cfi_restore_state
-.LBB13:
-.LBB9:
-	.loc 1 250 0
+.LBB15:
+.LBB11:
+	.loc 1 374 0
 	cmp	w0, 35
-	beq	.L10
-	bls	.L50
+	beq	.L24
+	bls	.L63
 	cmp	w0, 67
-	beq	.L3
+	beq	.L17
 	cmp	w0, 84
-	bne	.L2
-	.loc 1 291 0
-	mov	w0, 4
-	.loc 1 287 0
-	mov	w2, 1
-	.loc 1 289 0
-	mov	w5, 2
-	.loc 1 290 0
-	mov	w4, 3
-	.loc 1 293 0
-	mov	w3, 5
-.LVL6:
-	.loc 1 286 0
-	str	wzr, [x19, #:lo12:.LANCHOR0]
-	.loc 1 288 0
-	stp	w2, w2, [x1, 4]
-	.loc 1 290 0
-	stp	w5, w4, [x1, 12]
-	.loc 1 292 0
-	stp	w0, w0, [x1, 20]
-	.loc 1 294 0
-	stp	w3, w0, [x1, 28]
+	bne	.L16
+	.loc 1 415 0
+	mov	w2, 4
+	.loc 1 411 0
+	mov	w3, 1
+.LVL14:
+	.loc 1 413 0
+	mov	w6, 2
+	.loc 1 414 0
+	mov	w5, 3
+	.loc 1 417 0
+	mov	w4, 5
+	.loc 1 411 0
+	stp	wzr, w3, [x1, 8]
+	.loc 1 413 0
+	stp	w3, w6, [x1, 16]
+	.loc 1 415 0
+	stp	w5, w2, [x1, 24]
+	.loc 1 417 0
+	stp	w2, w4, [x1, 32]
+	.loc 1 418 0
+	str	w2, [x1, 40]
 	.p2align 2
-.L13:
-.LBE9:
-.LBE13:
-	.loc 1 356 0
+.L27:
+.LBE11:
+.LBE15:
+	.loc 1 480 0
 	cmp	w20, 5
-	beq	.L28
-.L49:
-	.loc 1 359 0
+	beq	.L42
+.L62:
+	.loc 1 483 0
 	cmp	w20, 2
-	beq	.L28
-	.loc 1 362 0
+	beq	.L42
+	.loc 1 486 0
 	cmp	w20, 7
-	beq	.L28
-	.loc 1 377 0
+	beq	.L42
+	.loc 1 501 0
 	add	x19, x19, :lo12:.LANCHOR0
-	.loc 1 362 0
-	bhi	.L17
+	.loc 1 486 0
+	bhi	.L31
 	cmp	w20, 3
-	beq	.L18
-	bls	.L51
+	beq	.L32
+	bls	.L64
 	cmp	w20, 4
-	beq	.L21
+	beq	.L35
 	cmp	w20, 6
-	add	x19, x19, 28
-	beq	.L14
-.L15:
-	.loc 1 391 0
+	add	x19, x19, 36
+	beq	.L28
+.L29:
+	.loc 1 515 0
 	adrp	x0, .LC1
 	add	x0, x0, :lo12:.LC1
 	bl	printk
-.LVL7:
-	.loc 1 392 0
+.LVL15:
+	.loc 1 516 0
 	mov	w0, -1
-	.loc 1 396 0
+	.loc 1 520 0
 	ldp	x19, x20, [sp, 16]
-.LVL8:
+.LVL16:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 20
@@ -180,243 +259,248 @@ get_wf_mode_index:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL9:
+.LVL17:
 	.p2align 3
-.L5:
+.L19:
 	.cfi_restore_state
-.LBB14:
-.LBB10:
-	.loc 1 314 0
-	mov	w0, 5
-	.loc 1 312 0
-	mov	w2, 3
-	.loc 1 310 0
-	mov	w6, 1
-	.loc 1 311 0
-	mov	w5, 7
-	.loc 1 315 0
-	mov	w4, 6
-	.loc 1 316 0
-	mov	w3, 4
-.LVL10:
-	.loc 1 309 0
-	str	wzr, [x19, #:lo12:.LANCHOR0]
-	.loc 1 311 0
-	stp	w6, w5, [x1, 4]
-	.loc 1 313 0
-	stp	w2, w2, [x1, 12]
-	.loc 1 315 0
-	stp	w0, w4, [x1, 20]
-	.loc 1 317 0
-	stp	w3, w0, [x1, 28]
-	b	.L13
-.LVL11:
+.LBB16:
+.LBB12:
+	.loc 1 436 0
+	mov	w3, 3
+.LVL18:
+	.loc 1 438 0
+	mov	w2, 5
+	.loc 1 434 0
+	mov	w7, 1
+	.loc 1 435 0
+	mov	w6, 7
+	.loc 1 439 0
+	mov	w5, 6
+	.loc 1 440 0
+	mov	w4, 4
+	.loc 1 434 0
+	stp	wzr, w7, [x1, 8]
+	.loc 1 436 0
+	stp	w6, w3, [x1, 16]
+	.loc 1 438 0
+	stp	w3, w2, [x1, 24]
+	.loc 1 440 0
+	stp	w5, w4, [x1, 32]
+	.loc 1 441 0
+	str	w2, [x1, 40]
+	b	.L27
+.LVL19:
 	.p2align 3
-.L48:
-	.loc 1 250 0
+.L61:
+	.loc 1 374 0
 	cmp	w0, 24
-	bne	.L2
-.L9:
-	.loc 1 275 0
-	add	x0, x19, :lo12:.LANCHOR0
-	.loc 1 280 0
-	mov	w1, 4
-	.loc 1 276 0
-	mov	w2, 1
-	.loc 1 278 0
-	mov	w6, 2
-	.loc 1 279 0
-	mov	w5, 3
-	.loc 1 281 0
-	mov	w4, 5
-	.loc 1 282 0
-	mov	w3, 6
-.LVL12:
-	.loc 1 275 0
-	str	wzr, [x19, #:lo12:.LANCHOR0]
-	.loc 1 277 0
-	stp	w2, w2, [x0, 4]
-	.loc 1 279 0
-	stp	w6, w5, [x0, 12]
-	.loc 1 281 0
-	stp	w1, w4, [x0, 20]
-	.loc 1 283 0
-	stp	w3, w1, [x0, 28]
-	b	.L13
-.LVL13:
+	bne	.L16
+.L23:
+	.loc 1 399 0
+	add	x1, x19, :lo12:.LANCHOR0
+	.loc 1 400 0
+	mov	w3, 1
+.LVL20:
+	.loc 1 404 0
+	mov	w2, 4
+	.loc 1 402 0
+	mov	w7, 2
+	.loc 1 403 0
+	mov	w6, 3
+	.loc 1 405 0
+	mov	w5, 5
+	.loc 1 406 0
+	mov	w4, 6
+	.loc 1 400 0
+	stp	wzr, w3, [x1, 8]
+	.loc 1 402 0
+	stp	w3, w7, [x1, 16]
+	.loc 1 404 0
+	stp	w6, w2, [x1, 24]
+	.loc 1 406 0
+	stp	w5, w4, [x1, 32]
+	.loc 1 407 0
+	str	w2, [x1, 40]
+	b	.L27
+.LVL21:
 	.p2align 3
-.L3:
-	.loc 1 298 0
-	add	x0, x19, :lo12:.LANCHOR0
-	.loc 1 303 0
-	mov	w1, 4
-	.loc 1 299 0
+.L17:
+	.loc 1 422 0
+	add	x1, x19, :lo12:.LANCHOR0
+	.loc 1 427 0
+	mov	w2, 4
+	.loc 1 422 0
+	add	x0, x1, 8
+	.loc 1 423 0
 	mov	w7, 1
-	.loc 1 300 0
+	.loc 1 424 0
 	mov	w6, 7
-	.loc 1 301 0
+	.loc 1 425 0
 	mov	w5, 2
-	.loc 1 302 0
+	.loc 1 426 0
 	mov	w4, 3
-	.loc 1 304 0
+	.loc 1 428 0
 	mov	w3, 5
-.LVL14:
-	.loc 1 305 0
-	mov	w2, 6
-	.loc 1 298 0
-	str	wzr, [x19, #:lo12:.LANCHOR0]
-	.loc 1 300 0
-	stp	w7, w6, [x0, 4]
-	.loc 1 302 0
-	stp	w5, w4, [x0, 12]
-	.loc 1 304 0
-	stp	w1, w3, [x0, 20]
-	.loc 1 306 0
-	stp	w2, w1, [x0, 28]
-	b	.L13
+.LVL22:
+	.loc 1 423 0
+	stp	wzr, w7, [x1, 8]
+	.loc 1 429 0
+	mov	w1, 6
+	.loc 1 425 0
+	stp	w6, w5, [x0, 8]
+	.loc 1 427 0
+	stp	w4, w2, [x0, 16]
+	.loc 1 428 0
+	str	w3, [x0, 24]
+	.loc 1 430 0
+	str	w2, [x0, 32]
+	.loc 1 429 0
+	str	w1, [x0, 28]
+	b	.L27
 	.p2align 3
-.L17:
-.LBE10:
-.LBE14:
-	.loc 1 362 0
+.L31:
+.LBE12:
+.LBE16:
+	.loc 1 486 0
 	cmp	w20, 9
-	beq	.L23
-	bcc	.L29
+	beq	.L37
+	bcc	.L43
 	cmp	w20, 10
-	beq	.L24
+	beq	.L38
 	cmp	w20, 11
-	.loc 1 383 0
-	add	x19, x19, 32
-	.loc 1 362 0
-	beq	.L14
-	b	.L15
-.LVL15:
+	.loc 1 507 0
+	add	x19, x19, 40
+	.loc 1 486 0
+	beq	.L28
+	b	.L29
+.LVL23:
 	.p2align 3
-.L47:
-.LBB15:
-.LBB11:
-	.loc 1 250 0
+.L60:
+.LBB17:
+.LBB13:
+	.loc 1 374 0
 	cmp	w0, 9
-	bne	.L2
-	.loc 1 256 0
-	mov	w0, 3
-	.loc 1 253 0
-	mov	w2, 1
-	.loc 1 255 0
-	mov	w4, 2
-	.loc 1 260 0
-	mov	w3, 4
-.LVL16:
-	.loc 1 252 0
-	str	wzr, [x19, #:lo12:.LANCHOR0]
-	.loc 1 254 0
-	stp	w2, w2, [x1, 4]
-	.loc 1 256 0
-	stp	w4, w0, [x1, 12]
-	.loc 1 258 0
-	stp	w0, w0, [x1, 20]
-	.loc 1 259 0
-	stp	w3, w0, [x1, 28]
-	b	.L13
-.LVL17:
+	bne	.L16
+	.loc 1 380 0
+	mov	w2, 3
+	.loc 1 377 0
+	mov	w3, 1
+.LVL24:
+	.loc 1 379 0
+	mov	w5, 2
+	.loc 1 384 0
+	mov	w4, 4
+	.loc 1 377 0
+	stp	wzr, w3, [x1, 8]
+	.loc 1 379 0
+	stp	w3, w5, [x1, 16]
+	.loc 1 381 0
+	stp	w2, w2, [x1, 24]
+	.loc 1 384 0
+	stp	w2, w4, [x1, 32]
+	.loc 1 383 0
+	str	w2, [x1, 40]
+	b	.L27
+.LVL25:
 	.p2align 3
-.L50:
-	.loc 1 250 0
+.L63:
+	.loc 1 374 0
 	cmp	w0, 32
-	beq	.L9
-.L2:
-	.loc 1 331 0
-	add	x0, x19, :lo12:.LANCHOR0
-	.loc 1 336 0
-	mov	w1, 4
-	.loc 1 332 0
-	mov	w2, 1
-	.loc 1 331 0
-	str	wzr, [x19, #:lo12:.LANCHOR0]
-	.loc 1 334 0
-	mov	w5, 2
-	.loc 1 335 0
-	mov	w4, 3
-	.loc 1 333 0
-	stp	w2, w2, [x0, 4]
-	.loc 1 337 0
+	beq	.L23
+.L16:
+	.loc 1 455 0
+	add	x1, x19, :lo12:.LANCHOR0
+	.loc 1 460 0
+	mov	w2, 4
+	.loc 1 455 0
+	add	x0, x1, 8
+	.loc 1 456 0
+	mov	w4, 1
+	.loc 1 458 0
+	mov	w6, 2
+	.loc 1 459 0
+	mov	w5, 3
+	.loc 1 456 0
+	stp	wzr, w4, [x1, 8]
+	.loc 1 460 0
+	stp	w5, w2, [x1, 24]
+	.loc 1 458 0
+	stp	w4, w6, [x1, 16]
+	.loc 1 463 0
+	str	w2, [x1, 40]
+	.loc 1 461 0
 	mov	w2, 5
-	.loc 1 335 0
-	stp	w5, w4, [x0, 12]
-	.loc 1 336 0
-	str	w1, [x0, 20]
-	.loc 1 339 0
-	str	w1, [x0, 32]
-	.loc 1 338 0
+	.loc 1 462 0
 	mov	w1, 6
 	stp	w2, w1, [x0, 24]
-	.loc 1 340 0
+	.loc 1 464 0
 	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	ldrb	w2, [x3, 22]
 	ldrb	w1, [x3, 16]
 	bl	printk
-.LVL18:
-	b	.L13
-.LVL19:
-	.p2align 3
-.L10:
-	.loc 1 324 0
-	mov	w0, 3
-	.loc 1 321 0
-	mov	w5, 1
-	.loc 1 322 0
-	mov	w4, 5
-	.loc 1 323 0
-	mov	w3, 2
-.LVL20:
-	.loc 1 327 0
-	mov	w2, 4
-	.loc 1 320 0
-	str	wzr, [x19, #:lo12:.LANCHOR0]
-	.loc 1 322 0
-	stp	w5, w4, [x1, 4]
-	.loc 1 324 0
-	stp	w3, w0, [x1, 12]
-	.loc 1 326 0
-	stp	w0, w0, [x1, 20]
-	.loc 1 328 0
-	stp	w2, w0, [x1, 28]
-	b	.L13
+.LVL26:
+	b	.L27
+.LVL27:
 	.p2align 3
 .L24:
-.LBE11:
-.LBE15:
-	.loc 1 380 0
-	add	x19, x19, 24
-	b	.L14
+	.loc 1 448 0
+	mov	w2, 3
+	.loc 1 445 0
+	mov	w6, 1
+	.loc 1 446 0
+	mov	w5, 5
+	.loc 1 447 0
+	mov	w4, 2
+	.loc 1 451 0
+	mov	w3, 4
+.LVL28:
+	.loc 1 445 0
+	stp	wzr, w6, [x1, 8]
+	.loc 1 447 0
+	stp	w5, w4, [x1, 16]
+	.loc 1 449 0
+	stp	w2, w2, [x1, 24]
+	.loc 1 451 0
+	stp	w2, w3, [x1, 32]
+	.loc 1 452 0
+	str	w2, [x1, 40]
+	b	.L27
 	.p2align 3
-.L23:
-	.loc 1 377 0
-	add	x19, x19, 20
-	b	.L14
+.L38:
+.LBE13:
+.LBE17:
+	.loc 1 504 0
+	add	x19, x19, 32
+	b	.L28
 	.p2align 3
-.L18:
-	.loc 1 386 0
-	add	x19, x19, 8
-	b	.L14
+.L37:
+	.loc 1 501 0
+	add	x19, x19, 28
+	b	.L28
+	.p2align 3
+.L32:
+	.loc 1 510 0
+	add	x19, x19, 16
+	b	.L28
 	.p2align 3
-.L21:
-	.loc 1 389 0
-	add	x19, x19, 4
-	b	.L14
+.L35:
+	.loc 1 513 0
+	add	x19, x19, 12
+	b	.L28
 	.p2align 3
-.L51:
-	.loc 1 362 0
+.L64:
+	.loc 1 486 0
 	cmp	w20, 1
-	beq	.L14
-	b	.L15
+	add	x19, x19, 8
+	beq	.L28
+	b	.L29
 	.p2align 3
-.L29:
-	add	x19, x19, 16
-	b	.L14
+.L43:
+	add	x19, x19, 24
+	b	.L28
 	.cfi_endproc
-.LFE1550:
+.LFE1551:
 	.size	get_wf_mode_index, .-get_wf_mode_index
 	.align	2
 	.p2align 3,,7
@@ -426,49 +510,48 @@ decodewaveform:
 .LFB1547:
 	.loc 1 67 0
 	.cfi_startproc
-.LVL21:
+.LVL29:
 	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
+	str	x21, [sp, 32]
+	.cfi_offset 21, -16
+	.loc 1 75 0
+	adrp	x21, .LANCHOR0
+	.loc 1 67 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
 	.loc 1 75 0
-	adrp	x20, .LANCHOR0
-	add	x1, x20, :lo12:.LANCHOR0
-	.loc 1 67 0
-	str	x21, [sp, 32]
-	.cfi_offset 21, -16
-	.loc 1 75 0
-	ldr	x4, [x1, 48]
-	cbz	x4, .L88
+	ldr	x4, [x21, #:lo12:.LANCHOR0]
+	cbz	x4, .L101
 	.loc 1 137 0
-	adrp	x21, .LANCHOR1
+	adrp	x20, .LANCHOR1
 	mov	w6, 1
-.LVL22:
+.LVL30:
 	mov	w15, 0
 	mov	w19, 0
-.LVL23:
-	ldr	w14, [x21, #:lo12:.LANCHOR1]
+.LVL31:
+	ldr	w14, [x20, #:lo12:.LANCHOR1]
 	mov	w5, 0
 	mov	w2, 0
 	.p2align 2
-.L55:
+.L68:
 	.loc 1 86 0
 	ldrb	w1, [x0, w15, uxtw]
 	cmp	w1, 255
-	beq	.L58
+	beq	.L71
 	.loc 1 91 0
 	cmp	w1, 252
-	beq	.L89
-.L59:
+	beq	.L102
+.L72:
 	.loc 1 98 0
 	lsl	w3, w19, 10
 	.loc 1 96 0
-	cbz	w6, .L60
+	cbz	w6, .L73
 	.loc 1 98 0
 	add	w9, w3, w2, lsl 5
 	add	w8, w2, 1
@@ -479,7 +562,7 @@ decodewaveform:
 	add	w8, w3, w8, lsl 5
 	.loc 1 100 0
 	add	w6, w2, 3
-.LVL24:
+.LVL32:
 	add	w7, w3, w7, lsl 5
 	.loc 1 98 0
 	and	w10, w1, 3
@@ -501,25 +584,25 @@ decodewaveform:
 	add	w1, w15, 1
 	.loc 1 104 0
 	cmp	w14, w2
-	bhi	.L61
+	bhi	.L74
 	.loc 1 106 0
 	add	w5, w5, 1
 	.loc 1 105 0
 	mov	w2, 0
 	.loc 1 106 0
 	cmp	w14, w5
-	bhi	.L61
+	bhi	.L74
 	.loc 1 108 0
 	add	w19, w19, 1
 	.loc 1 107 0
 	mov	w5, 0
-.L61:
+.L74:
 	.loc 1 112 0
 	ldrb	w3, [x0, w1, uxtw]
 	.loc 1 113 0
-	cbz	w3, .L62
+	cbz	w3, .L75
 	.p2align 2
-.L64:
+.L77:
 	.loc 1 114 0
 	lsl	w1, w19, 10
 	add	w8, w2, 1
@@ -549,49 +632,49 @@ decodewaveform:
 	.loc 1 117 0
 	strb	w13, [x4, w1, uxtw]
 	.loc 1 118 0
-	bhi	.L63
+	bhi	.L76
 	.loc 1 120 0
 	add	w5, w5, 1
 	.loc 1 119 0
 	mov	w2, 0
 	.loc 1 120 0
 	cmp	w14, w5
-	bhi	.L63
+	bhi	.L76
 	.loc 1 122 0
 	add	w19, w19, 1
 	.loc 1 121 0
 	mov	w5, 0
-.L63:
+.L76:
 	.loc 1 113 0
 	ands	w3, w3, 255
-	bne	.L64
-.L62:
+	bne	.L77
+.L75:
 	.loc 1 127 0
 	add	w15, w15, 2
 	mov	w6, 1
-.LVL25:
-.L65:
+.LVL33:
+.L78:
 	.loc 1 81 0
 	cmp	w19, 149
-	bls	.L55
+	bls	.L68
 	.loc 1 82 0
 	adrp	x0, .LC3
-.LVL26:
+.LVL34:
 	add	x0, x0, :lo12:.LC3
 	bl	printk
-.LVL27:
+.LVL35:
 	.loc 1 147 0
-	ldr	w0, [x21, #:lo12:.LANCHOR1]
+	ldr	w0, [x20, #:lo12:.LANCHOR1]
 	cmp	w0, 32
-	beq	.L56
-.LVL28:
-.L57:
+	beq	.L69
+.LVL36:
+.L70:
 	.loc 1 159 0
 	mov	w0, w19
-.L52:
+.L65:
 	.loc 1 160 0
 	ldp	x19, x20, [sp, 16]
-.LVL29:
+.LVL37:
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -602,9 +685,9 @@ decodewaveform:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL30:
+.LVL38:
 	.p2align 3
-.L60:
+.L73:
 	.cfi_restore_state
 	.loc 1 131 0
 	add	w10, w3, w2, lsl 5
@@ -637,57 +720,56 @@ decodewaveform:
 	add	w15, w15, 1
 	.loc 1 137 0
 	cmp	w2, w14
-	bcc	.L65
+	bcc	.L78
 	.loc 1 139 0
 	add	w5, w5, 1
 	.loc 1 138 0
 	mov	w2, 0
 	.loc 1 139 0
 	cmp	w14, w5
-	bhi	.L65
+	bhi	.L78
 	.loc 1 141 0
 	add	w19, w19, 1
 	.loc 1 140 0
 	mov	w5, 0
 	.loc 1 138 0
 	mov	w2, w6
-	b	.L65
-.L89:
+	b	.L78
+.L102:
 	.loc 1 93 0
 	add	w15, w15, 1
 	.loc 1 92 0
 	eor	w6, w6, 1
 	ldrb	w1, [x0, w15, uxtw]
-	b	.L59
-.L58:
+	b	.L72
+.L71:
 	.loc 1 147 0
-	ldr	w0, [x21, #:lo12:.LANCHOR1]
-.LVL31:
+	ldr	w0, [x20, #:lo12:.LANCHOR1]
+.LVL39:
 	cmp	w0, 32
-	bne	.L57
+	bne	.L70
 	.loc 1 149 0 discriminator 1
-	cbz	w19, .L57
-.L56:
-	add	x20, x20, :lo12:.LANCHOR0
+	cbz	w19, .L70
+.L69:
+	ldr	x1, [x21, #:lo12:.LANCHOR0]
 	.loc 1 119 0
 	mov	w8, 0
-	ldr	x1, [x20, 48]
-.LVL32:
-.L70:
+.LVL40:
+.L83:
 	lsl	w7, w8, 10
 	mov	w6, 0
-.LVL33:
+.LVL41:
 	mov	w5, w7
 	.p2align 2
-.L68:
+.L81:
 	lsr	w4, w6, 1
 	mov	w0, 0
 	add	w4, w7, w4, lsl 5
 	.p2align 2
-.L67:
+.L80:
 	.loc 1 152 0 discriminator 3
 	add	w3, w0, w5
-.LVL34:
+.LVL42:
 	.loc 1 153 0 discriminator 3
 	add	w2, w4, w0, lsr 1
 	.loc 1 151 0 discriminator 3
@@ -695,198 +777,88 @@ decodewaveform:
 	cmp	w0, 32
 	.loc 1 152 0 discriminator 3
 	ldrb	w3, [x1, w3, uxtw]
-.LVL35:
+.LVL43:
 	.loc 1 153 0 discriminator 3
 	strb	w3, [x1, w2, uxtw]
 	.loc 1 151 0 discriminator 3
-	bne	.L67
+	bne	.L80
 	.loc 1 150 0 discriminator 2
 	add	w6, w6, 2
 	add	w5, w5, 64
 	cmp	w6, 32
-	bne	.L68
+	bne	.L81
 	.loc 1 149 0 discriminator 2
 	add	w8, w8, 1
 	and	w8, w8, 255
 	cmp	w8, w19
-	bcc	.L70
-	b	.L57
-.LVL36:
-.L88:
+	bcc	.L83
+	b	.L70
+.LVL44:
+.L101:
 	.loc 1 76 0
 	adrp	x0, .LC2
-.LVL37:
+.LVL45:
 	add	x0, x0, :lo12:.LC2
 	bl	printk
-.LVL38:
+.LVL46:
 	.loc 1 77 0
 	mov	w0, -22
-	b	.L52
+	b	.L65
 	.cfi_endproc
 .LFE1547:
 	.size	decodewaveform, .-decodewaveform
 	.align	2
 	.p2align 3,,7
-	.type	get_wf_frm_num, %function
-get_wf_frm_num:
-.LFB1552:
-	.loc 1 419 0
-	.cfi_startproc
-.LVL39:
-	stp	x29, x30, [sp, -16]!
-	.cfi_def_cfa_offset 16
-	.cfi_offset 29, -16
-	.cfi_offset 30, -8
-	.loc 1 420 0
-	adrp	x2, .LANCHOR0+40
-	.loc 1 419 0
-	add	x29, sp, 0
-	.cfi_def_cfa_register 29
-	.loc 1 420 0
-	ldr	x2, [x2, #:lo12:.LANCHOR0+40]
-.LVL40:
-	.loc 1 424 0
-	ldrb	w3, [x2, 32]
-	add	w0, w3, w0, lsl 2
-.LVL41:
-	.loc 1 427 0
-	add	x4, x2, x0, sxtw
-	.loc 1 426 0
-	ldrb	w5, [x2, w0, sxtw]
-	.loc 1 428 0
-	ldrb	w3, [x4, 2]
-	.loc 1 427 0
-	ldrb	w0, [x4, 1]
-	.loc 1 429 0
-	ldrb	w6, [x4, 3]
-	.loc 1 430 0
-	add	w4, w0, w3
-	add	w4, w4, w5
-	cmp	w6, w4, uxtb
-	bne	.L95
-	.loc 1 435 0
-	lsl	w3, w3, 16
-	orr	w0, w3, w0, lsl 8
-	orr	w0, w0, w5
-	.loc 1 437 0
-	add	w0, w0, w1, lsl 2
-	.loc 1 440 0
-	add	x3, x2, x0, sxtw
-	.loc 1 439 0
-	ldrb	w4, [x2, w0, sxtw]
-	.loc 1 441 0
-	ldrb	w1, [x3, 2]
-.LVL42:
-	.loc 1 440 0
-	ldrb	w0, [x3, 1]
-	.loc 1 442 0
-	ldrb	w5, [x3, 3]
-	.loc 1 444 0
-	add	w3, w0, w1
-	add	w3, w3, w4
-	cmp	w5, w3, uxtb
-	bne	.L96
-	.loc 1 449 0
-	lsl	w1, w1, 16
-	orr	w0, w1, w0, lsl 8
-	orr	w0, w0, w4
-	.loc 1 451 0
-	add	x0, x2, x0
-	bl	decodewaveform
-.LVL43:
-.L90:
-	.loc 1 452 0
-	ldp	x29, x30, [sp], 16
-	.cfi_remember_state
-	.cfi_restore 30
-	.cfi_restore 29
-	.cfi_def_cfa 31, 0
-	ret
-.LVL44:
-.L95:
-	.cfi_restore_state
-	.loc 1 431 0
-	adrp	x1, .LANCHOR2
-.LVL45:
-	adrp	x0, .LC4
-	mov	w2, 431
-.LVL46:
-	add	x1, x1, :lo12:.LANCHOR2
-	add	x0, x0, :lo12:.LC4
-	bl	printk
-.LVL47:
-	.loc 1 432 0
-	mov	w0, -22
-	b	.L90
-.LVL48:
-.L96:
-	.loc 1 445 0
-	adrp	x1, .LANCHOR2
-	adrp	x0, .LC4
-	mov	w2, 445
-.LVL49:
-	add	x1, x1, :lo12:.LANCHOR2
-	add	x0, x0, :lo12:.LC4
-	bl	printk
-.LVL50:
-	.loc 1 446 0
-	mov	w0, -22
-	b	.L90
-	.cfi_endproc
-.LFE1552:
-	.size	get_wf_frm_num, .-get_wf_frm_num
-	.align	2
-	.p2align 3,,7
 	.global	decodewaveform_32
 	.type	decodewaveform_32, %function
 decodewaveform_32:
 .LFB1548:
 	.loc 1 163 0
 	.cfi_startproc
-.LVL51:
+.LVL47:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
 	.loc 1 171 0
-	adrp	x1, .LANCHOR0+48
+	adrp	x1, .LANCHOR0
 	.loc 1 163 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	.loc 1 171 0
-	ldr	x4, [x1, #:lo12:.LANCHOR0+48]
+	ldr	x4, [x1, #:lo12:.LANCHOR0]
 	.loc 1 163 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
 	.loc 1 171 0
-	cbz	x4, .L121
+	cbz	x4, .L127
 	.loc 1 233 0
 	adrp	x1, .LANCHOR1
 	mov	w6, 1
-.LVL52:
+.LVL48:
 	mov	w15, 0
 	mov	w19, 0
-.LVL53:
+.LVL49:
 	ldr	w14, [x1, #:lo12:.LANCHOR1]
 	mov	w5, 0
-.LVL54:
+.LVL50:
 	mov	w1, 0
-.LVL55:
+.LVL51:
 	.p2align 2
-.L100:
+.L106:
 	.loc 1 182 0
 	ldrb	w2, [x0, w15, uxtw]
 	cmp	w2, 255
-	beq	.L101
+	beq	.L107
 	.loc 1 187 0
 	cmp	w2, 252
-	beq	.L122
-.L102:
+	beq	.L128
+.L108:
 	.loc 1 194 0
 	lsl	w3, w19, 10
-.LVL56:
+.LVL52:
 	.loc 1 192 0
-	cbz	w6, .L103
+	cbz	w6, .L109
 	.loc 1 194 0
 	add	w9, w3, w1, lsl 5
 	add	w8, w1, 1
@@ -897,7 +869,7 @@ decodewaveform_32:
 	add	w8, w3, w8, lsl 5
 	.loc 1 196 0
 	add	w6, w1, 3
-.LVL57:
+.LVL53:
 	add	w7, w3, w7, lsl 5
 	.loc 1 194 0
 	and	w10, w2, 3
@@ -919,26 +891,26 @@ decodewaveform_32:
 	add	w2, w15, 1
 	.loc 1 200 0
 	cmp	w14, w1
-	bhi	.L104
+	bhi	.L110
 	.loc 1 202 0
 	add	w5, w5, 1
 	.loc 1 201 0
 	mov	w1, 0
 	.loc 1 202 0
 	cmp	w14, w5
-	bhi	.L104
+	bhi	.L110
 	.loc 1 204 0
 	add	w19, w19, 1
 	.loc 1 203 0
 	mov	w5, 0
-.L104:
+.L110:
 	.loc 1 208 0
 	ldrb	w3, [x0, w2, uxtw]
-.LVL58:
+.LVL54:
 	.loc 1 209 0
-	cbz	w3, .L105
+	cbz	w3, .L111
 	.p2align 2
-.L107:
+.L113:
 	.loc 1 210 0
 	lsl	w2, w19, 10
 	add	w8, w1, 1
@@ -961,7 +933,7 @@ decodewaveform_32:
 	strb	w11, [x4, w8, uxtw]
 	.loc 1 209 0
 	sub	w3, w3, #1
-.LVL59:
+.LVL55:
 	.loc 1 212 0
 	strb	w12, [x4, w7, uxtw]
 	.loc 1 214 0
@@ -969,46 +941,46 @@ decodewaveform_32:
 	.loc 1 213 0
 	strb	w13, [x4, w2, uxtw]
 	.loc 1 214 0
-	bhi	.L106
+	bhi	.L112
 	.loc 1 216 0
 	add	w5, w5, 1
 	.loc 1 215 0
 	mov	w1, 0
 	.loc 1 216 0
 	cmp	w14, w5
-	bhi	.L106
+	bhi	.L112
 	.loc 1 218 0
 	add	w19, w19, 1
 	.loc 1 217 0
 	mov	w5, 0
-.L106:
+.L112:
 	.loc 1 209 0
 	ands	w3, w3, 255
-.LVL60:
-	bne	.L107
-.L105:
+.LVL56:
+	bne	.L113
+.L111:
 	.loc 1 223 0
 	add	w15, w15, 2
 	mov	w6, 1
-.LVL61:
-.L108:
+.LVL57:
+.L114:
 	.loc 1 177 0
 	cmp	w19, 149
-	bls	.L100
+	bls	.L106
 	.loc 1 178 0
 	adrp	x0, .LC3
-.LVL62:
+.LVL58:
 	add	x0, x0, :lo12:.LC3
 	bl	printk
-.LVL63:
-.L101:
+.LVL59:
+.L107:
 	.loc 1 243 0
 	mov	w0, w19
-.LVL64:
-.L97:
+.LVL60:
+.L103:
 	.loc 1 244 0
 	ldr	x19, [sp, 16]
-.LVL65:
+.LVL61:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -1016,9 +988,9 @@ decodewaveform_32:
 	.cfi_restore 19
 	.cfi_def_cfa 31, 0
 	ret
-.LVL66:
+.LVL62:
 	.p2align 3
-.L103:
+.L109:
 	.cfi_restore_state
 	.loc 1 227 0
 	add	w10, w3, w1, lsl 5
@@ -1051,94 +1023,485 @@ decodewaveform_32:
 	add	w15, w15, 1
 	.loc 1 233 0
 	cmp	w1, w14
-	bcc	.L108
+	bcc	.L114
 	.loc 1 235 0
 	add	w5, w5, 1
 	.loc 1 234 0
 	mov	w1, 0
 	.loc 1 235 0
 	cmp	w14, w5
-	bhi	.L108
+	bhi	.L114
 	.loc 1 237 0
 	add	w19, w19, 1
 	.loc 1 236 0
 	mov	w5, 0
 	.loc 1 234 0
 	mov	w1, w6
-	b	.L108
-.LVL67:
+	b	.L114
+.LVL63:
 	.p2align 3
-.L122:
+.L128:
 	.loc 1 189 0
 	add	w15, w15, 1
 	.loc 1 188 0
 	eor	w6, w6, 1
 	ldrb	w2, [x0, w15, uxtw]
-	b	.L102
-.LVL68:
-.L121:
+	b	.L108
+.LVL64:
+.L127:
 	.loc 1 172 0
 	adrp	x0, .LC2
-.LVL69:
+.LVL65:
 	add	x0, x0, :lo12:.LC2
 	bl	printk
-.LVL70:
+.LVL66:
 	.loc 1 173 0
 	mov	w0, -22
-	b	.L97
+	b	.L103
 	.cfi_endproc
 .LFE1548:
 	.size	decodewaveform_32, .-decodewaveform_32
 	.align	2
 	.p2align 3,,7
-	.global	pvi_wf_get_lut
-	.type	pvi_wf_get_lut, %function
-pvi_wf_get_lut:
-.LFB1557:
-	.loc 1 585 0
+	.global	decodewaveform_auto
+	.type	decodewaveform_auto, %function
+decodewaveform_auto:
+.LFB1549:
+	.loc 1 250 0
 	.cfi_startproc
-.LVL71:
-	stp	x29, x30, [sp, -80]!
-	.cfi_def_cfa_offset 80
-	.cfi_offset 29, -80
-	.cfi_offset 30, -72
+.LVL67:
+	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	x23, x24, [sp, 48]
-	.cfi_offset 23, -32
-	.cfi_offset 24, -24
-	.loc 1 592 0
-	adrp	x23, .LANCHOR0
-	add	x4, x23, :lo12:.LANCHOR0
-	.loc 1 585 0
 	stp	x19, x20, [sp, 16]
-	stp	x21, x22, [sp, 32]
-	str	x25, [sp, 64]
-	.cfi_offset 19, -64
+	.cfi_offset 19, -32
+	.cfi_offset 20, -24
+	.loc 1 259 0
+	adrp	x20, .LANCHOR0
+	.loc 1 250 0
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 21, -16
+	.cfi_offset 22, -8
+	.loc 1 259 0
+	ldr	x9, [x20, #:lo12:.LANCHOR0]
+	cbz	x9, .L179
+	.loc 1 264 0
+	adrp	x21, .LANCHOR1
+	.loc 1 257 0
+	mov	w3, 15
+	mov	w22, w1
+	mov	w12, 30
+	.loc 1 264 0
+	ldr	w11, [x21, #:lo12:.LANCHOR1]
+	mov	w2, 1
+.LVL68:
+	mov	w13, 0
+	mov	w19, 0
+.LVL69:
+	.loc 1 257 0
+	cmp	w11, 32
+	mov	w4, 0
+	csel	w12, w12, w3, eq
+.LVL70:
+	mov	w3, 0
+	.p2align 2
+.L133:
+	.loc 1 273 0
+	ldrb	w10, [x0, w13, uxtw]
+	cmp	w10, 255
+	beq	.L134
+	.loc 1 278 0
+	cmp	w10, 252
+	beq	.L180
+.L135:
+	.loc 1 285 0
+	cmp	w4, 0
+	ccmp	w12, w4, 4, ne
+	.loc 1 283 0
+	cbz	w2, .L136
+	.loc 1 285 0
+	bne	.L137
+	.loc 1 286 0
+	lsl	w2, w19, 10
+.LVL71:
+	add	w7, w3, 1
+	add	w8, w2, w3, lsl 5
+	add	w2, w2, w4
+	add	w8, w8, w4
+	.loc 1 287 0
+	add	w6, w3, 2
+	add	w7, w2, w7, lsl 5
+	.loc 1 288 0
+	add	w5, w3, 3
+	add	w6, w2, w6, lsl 5
+	.loc 1 286 0
+	and	w14, w10, 3
+	.loc 1 289 0
+	add	w2, w2, w5, lsl 5
+	.loc 1 286 0
+	strb	w14, [x9, w8, uxtw]
+	.loc 1 287 0
+	ubfx	x5, x10, 2, 2
+	strb	w5, [x9, w7, uxtw]
+	.loc 1 289 0
+	add	w3, w3, 4
+	.loc 1 288 0
+	ubfx	x5, x10, 4, 2
+	strb	w5, [x9, w6, uxtw]
+	.loc 1 289 0
+	lsr	w5, w10, 6
+	strb	w5, [x9, w2, uxtw]
+.LVL72:
+.L138:
+	.loc 1 293 0
+	add	w2, w13, 1
+.LVL73:
+	.loc 1 295 0
+	cmp	w3, w11
+	bcc	.L139
+	.loc 1 297 0
+	add	w4, w4, 1
+	.loc 1 296 0
+	mov	w3, 0
+	.loc 1 297 0
+	cmp	w11, w4
+	bhi	.L139
+	.loc 1 299 0
+	add	w19, w19, 1
+	.loc 1 298 0
+	mov	w4, 0
+.L139:
+	.loc 1 303 0
+	ldrb	w17, [x0, w2, uxtw]
+	.loc 1 304 0
+	cbz	w17, .L140
+	.loc 1 307 0
+	ubfx	x16, x10, 2, 2
+	.loc 1 308 0
+	ubfx	x15, x10, 4, 2
+	.loc 1 309 0
+	lsr	w14, w10, 6
+	.loc 1 306 0
+	and	w10, w10, 3
+	b	.L144
+	.p2align 3
+.L181:
+	strb	w10, [x9, w8, uxtw]
+	.loc 1 309 0
+	add	w3, w3, 4
+	.loc 1 307 0
+	strb	w16, [x9, w7, uxtw]
+	.loc 1 308 0
+	strb	w15, [x9, w6, uxtw]
+	.loc 1 309 0
+	strb	w14, [x9, w2, uxtw]
+.L142:
+	.loc 1 304 0
+	sub	w2, w17, #1
+	.loc 1 313 0
+	cmp	w3, w11
+	bcc	.L143
+	.loc 1 315 0
+	add	w4, w4, 1
+	.loc 1 314 0
+	mov	w3, 0
+	.loc 1 315 0
+	cmp	w11, w4
+	bhi	.L143
+	.loc 1 317 0
+	add	w19, w19, 1
+	.loc 1 316 0
+	mov	w4, 0
+.L143:
+	.loc 1 304 0
+	ands	w17, w2, 255
+	beq	.L140
+.L144:
+	.loc 1 306 0
+	lsl	w2, w19, 10
+	add	w5, w3, 1
+	add	w6, w2, w3, lsl 5
+	add	w2, w2, w4
+	.loc 1 307 0
+	add	w7, w2, w5, lsl 5
+	.loc 1 306 0
+	add	w8, w6, w4
+	.loc 1 308 0
+	add	w5, w3, 3
+	.loc 1 307 0
+	add	w6, w3, 2
+	.loc 1 305 0
+	cmp	w4, 0
+	.loc 1 308 0
+	add	w6, w2, w6, lsl 5
+	.loc 1 305 0
+	ccmp	w12, w4, 4, ne
+	.loc 1 309 0
+	add	w2, w2, w5, lsl 5
+	.loc 1 305 0
+	beq	.L181
+	.loc 1 311 0
+	add	w3, w3, 4
+	b	.L142
+	.p2align 3
+.L140:
+	.loc 1 322 0
+	add	w13, w13, 2
+	mov	w2, 1
+.LVL74:
+.L145:
+	.loc 1 268 0
+	cmp	w19, 149
+	bls	.L133
+	.loc 1 269 0
+	adrp	x0, .LC3
+.LVL75:
+	add	x0, x0, :lo12:.LC3
+	bl	printk
+.LVL76:
+.L134:
+	.loc 1 346 0
+	ldr	w0, [x21, #:lo12:.LANCHOR1]
+.LVL77:
+	cmp	w0, 32
+	beq	.L148
+.LVL78:
+.L156:
+	.loc 1 359 0
+	and	w0, w19, 255
+	and	w5, w19, 255
+	cmp	w0, w22
+	bge	.L150
+	ldr	x2, [x20, #:lo12:.LANCHOR0]
+.LVL79:
+	.p2align 2
+.L158:
+	lsl	w0, w0, 10
+	add	w4, w0, 512
+.LVL80:
+	.p2align 2
+.L157:
+	.loc 1 362 0
+	add	w3, w0, 15
+	strb	wzr, [x2, w0, uxtw]
+	add	w0, w0, 32
+	.loc 1 360 0
+	cmp	w4, w0
+	.loc 1 362 0
+	strb	wzr, [x2, w3, uxtw]
+	.loc 1 360 0
+	bne	.L157
+	.loc 1 359 0 discriminator 2
+	add	w5, w5, 1
+	and	w5, w5, 255
+	mov	w0, w5
+	cmp	w22, w5
+	bgt	.L158
+.LVL81:
+.L150:
+	.loc 1 367 0
+	mov	w0, w19
+.L129:
+	.loc 1 368 0
+	ldp	x19, x20, [sp, 16]
+.LVL82:
+	ldp	x21, x22, [sp, 32]
+.LVL83:
+	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
+.LVL84:
+	.p2align 3
+.L136:
+	.cfi_restore_state
+	.loc 1 326 0
+	bne	.L146
+	.loc 1 327 0
+	lsl	w5, w19, 10
+	add	w8, w3, 1
+	add	w14, w5, w3, lsl 5
+	add	w5, w5, w4
+	add	w14, w14, w4
+	.loc 1 328 0
+	add	w7, w3, 2
+	add	w8, w5, w8, lsl 5
+	.loc 1 329 0
+	add	w6, w3, 3
+	add	w7, w5, w7, lsl 5
+	.loc 1 327 0
+	and	w15, w10, 3
+	.loc 1 330 0
+	add	w5, w5, w6, lsl 5
+	.loc 1 327 0
+	strb	w15, [x9, w14, uxtw]
+	.loc 1 328 0
+	ubfx	x6, x10, 2, 2
+	strb	w6, [x9, w8, uxtw]
+	.loc 1 330 0
+	add	w3, w3, 4
+	.loc 1 329 0
+	ubfx	x6, x10, 4, 2
+	strb	w6, [x9, w7, uxtw]
+	.loc 1 330 0
+	lsr	w10, w10, 6
+	strb	w10, [x9, w5, uxtw]
+.L147:
+	.loc 1 334 0
+	add	w13, w13, 1
+	.loc 1 336 0
+	cmp	w3, w11
+	bcc	.L145
+	.loc 1 338 0
+	add	w4, w4, 1
+	.loc 1 337 0
+	mov	w3, 0
+	.loc 1 338 0
+	cmp	w11, w4
+	bhi	.L145
+	.loc 1 340 0
+	add	w19, w19, 1
+	.loc 1 339 0
+	mov	w4, 0
+	b	.L145
+.L180:
+	.loc 1 280 0
+	add	w13, w13, 1
+	.loc 1 279 0
+	eor	w2, w2, 1
+	ldrb	w10, [x0, w13, uxtw]
+	b	.L135
+.L137:
+	.loc 1 291 0
+	add	w3, w3, 4
+	b	.L138
+.L146:
+	.loc 1 332 0
+	add	w3, w3, 4
+	b	.L147
+.LVL85:
+.L148:
+	.loc 1 348 0 discriminator 1
+	cmp	w22, 0
+	ble	.L150
+	ldr	x2, [x20, #:lo12:.LANCHOR0]
+.LVL86:
+	.loc 1 348 0 is_stmt 0
+	mov	w8, 0
+	mov	w9, 0
+.LVL87:
+.L155:
+	lsl	w8, w8, 10
+	mov	w7, 0
+	mov	w6, w8
+	.p2align 2
+.L153:
+	lsr	w5, w7, 1
+	.loc 1 314 0 is_stmt 1
+	mov	w0, 0
+	add	w5, w8, w5, lsl 5
+	.p2align 2
+.L152:
+	.loc 1 351 0 discriminator 3
+	add	w4, w6, w0
+.LVL88:
+	.loc 1 352 0 discriminator 3
+	add	w3, w5, w0, lsr 1
+	.loc 1 350 0 discriminator 3
+	add	w0, w0, 2
+	cmp	w0, 32
+	.loc 1 351 0 discriminator 3
+	ldrb	w4, [x2, w4, uxtw]
+.LVL89:
+	.loc 1 352 0 discriminator 3
+	strb	w4, [x2, w3, uxtw]
+	.loc 1 350 0 discriminator 3
+	bne	.L152
+	.loc 1 349 0 discriminator 2
+	add	w7, w7, 2
+	add	w6, w6, 64
+	cmp	w7, 32
+	bne	.L153
+	.loc 1 348 0 discriminator 2
+	add	w9, w9, 1
+	and	w9, w9, 255
+	mov	w8, w9
+	cmp	w9, w22
+	blt	.L155
+	b	.L156
+.LVL90:
+.L179:
+	.loc 1 260 0
+	adrp	x0, .LC2
+.LVL91:
+	add	x0, x0, :lo12:.LC2
+	bl	printk
+.LVL92:
+	.loc 1 261 0
+	mov	w0, -22
+	b	.L129
+	.cfi_endproc
+.LFE1549:
+	.size	decodewaveform_auto, .-decodewaveform_auto
+	.align	2
+	.p2align 3,,7
+	.global	pvi_wf_get_lut
+	.type	pvi_wf_get_lut, %function
+pvi_wf_get_lut:
+.LFB1559:
+	.loc 1 744 0
+	.cfi_startproc
+.LVL93:
+	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	x23, x24, [sp, 48]
+	.cfi_offset 23, -32
+	.cfi_offset 24, -24
+	.loc 1 751 0
+	adrp	x23, .LANCHOR0
+	add	x4, x23, :lo12:.LANCHOR0
+	.loc 1 744 0
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
+	str	x25, [sp, 64]
+	.cfi_offset 19, -64
 	.cfi_offset 20, -56
 	.cfi_offset 21, -48
 	.cfi_offset 22, -40
 	.cfi_offset 25, -16
-	.loc 1 592 0
-	ldr	x4, [x4, 40]
-	cbz	x4, .L156
-	.loc 1 595 0
-	cbz	x0, .L179
-.L125:
-	mov	x19, x0
-	.loc 1 598 0
+	.loc 1 751 0
+	ldr	x4, [x4, 48]
+	cbz	x4, .L215
+	.loc 1 754 0
+	cbz	x0, .L232
+.L184:
+	mov	x21, x0
+	.loc 1 757 0
 	adrp	x0, .LANCHOR1
-.LVL72:
-	mov	w24, w3
+.LVL94:
+	mov	w19, w3
 	mov	w3, w2
-.LVL73:
+.LVL95:
 	ldr	w2, [x0, #:lo12:.LANCHOR1]
-.LVL74:
-	mov	w20, w1
+.LVL96:
+	mov	w22, w1
 	add	x6, x0, :lo12:.LANCHOR1
-	cmp	w2, w24
-	blt	.L180
-	.loc 1 605 0
+	cmp	w2, w19
+	blt	.L233
+	.loc 1 764 0
 	ldr	w5, [x6, 4]
 	mov	w1, 21846
 	movk	w1, 0x5555, lsl 16
@@ -1149,200 +1512,173 @@ pvi_wf_get_lut:
 	sub	w2, w2, w3, asr 31
 	sub	w1, w1, w5, asr 31
 	cmp	w2, w1
-	beq	.L181
-.L127:
-	.loc 1 608 0
+	beq	.L234
+.L186:
+	.loc 1 767 0
 	add	x0, x0, :lo12:.LANCHOR1
-.LBB28:
-.LBB29:
-	.loc 1 401 0
-	ldrb	w1, [x4, 38]
-.LVL75:
-.LBE29:
-.LBE28:
-	.loc 1 609 0
-	stp	w3, w20, [x0, 4]
+.LBB31:
 .LBB32:
-.LBB30:
-	.loc 1 405 0
-	cbz	w1, .L128
-	.loc 1 406 0
+	.loc 1 525 0
+	ldrb	w1, [x4, 38]
+.LVL97:
+.LBE32:
+.LBE31:
+	.loc 1 768 0
+	stp	w3, w22, [x0, 4]
+.LBB35:
+.LBB33:
+	.loc 1 529 0
+	cbz	w1, .L187
+	.loc 1 530 0
 	ldrb	w0, [x4, 48]
 	cmp	w3, w0
-	blt	.L158
-	mov	w25, 0
-.LVL76:
-	b	.L130
-	.p2align 3
-.L131:
+	blt	.L217
+	mov	w20, 0
+.LVL98:
+	b	.L189
+.L190:
 	ldrb	w2, [x4, w2, sxtw]
 	cmp	w3, w2
-	blt	.L155
-	mov	w25, w0
-.L130:
-	.loc 1 405 0
-	add	w0, w25, 1
-	.loc 1 406 0
-	add	w2, w25, 49
-	.loc 1 405 0
+	blt	.L214
+	mov	w20, w0
+.L189:
+	.loc 1 529 0
+	add	w0, w20, 1
+	.loc 1 530 0
+	add	w2, w20, 49
+	.loc 1 529 0
 	cmp	w1, w0
-	bne	.L131
-.L128:
-	.loc 1 413 0
-	sub	w25, w1, #1
-.L155:
-.LBE30:
-.LBE32:
-	.loc 1 613 0
-	add	x21, x23, :lo12:.LANCHOR0
-	ldr	x0, [x19, 16]
-	.loc 1 616 0
-	sub	w1, w20, #1
-.LVL77:
-	.loc 1 613 0
-	add	x0, x0, 9764864
-	.loc 1 616 0
+	bne	.L190
+.L187:
+	.loc 1 537 0
+	sub	w20, w1, #1
+.L214:
+.LBE33:
+.LBE35:
+	.loc 1 772 0
+	ldr	x0, [x21, 16]
+	.loc 1 775 0
+	sub	w1, w22, #1
+.LVL99:
+	.loc 1 772 0
+	add	x25, x23, :lo12:.LANCHOR0
+	.loc 1 775 0
 	cmp	w1, 10
-	.loc 1 613 0
-	str	x0, [x21, 48]
-	.loc 1 616 0
-	bhi	.L132
-.LBB33:
-.LBB34:
-	.loc 1 555 0
-	mov	w0, w20
-	bl	get_wf_mode_index
-.LVL78:
-	.loc 1 556 0
-	cmp	w24, 32
-	.loc 1 555 0
-	mov	w1, w0
-	.loc 1 556 0
-	beq	.L182
-	.loc 1 559 0
-	mov	w1, w25
-	bl	get_wf_frm_num
-.LVL79:
-	mov	w21, w0
-.LVL80:
-.L138:
-	.loc 1 560 0
-	tbnz	w21, #31, .L136
-	.loc 1 564 0
-	str	w21, [x19]
-	.loc 1 553 0
-	mov	w22, 0
-.LVL81:
-	.loc 1 566 0
-	cmp	w20, 5
-	beq	.L183
-.L140:
-	.loc 1 573 0
-	cmp	w24, 32
-	beq	.L184
-	.loc 1 576 0
-	ldr	x9, [x19, 16]
-.LBB35:
+	.loc 1 772 0
+	add	x0, x0, 9764864
+	str	x0, [x23, #:lo12:.LANCHOR0]
+	.loc 1 775 0
+	bhi	.L191
 .LBB36:
-	.loc 1 523 0
-	cbz	w21, .L149
-	add	x23, x23, :lo12:.LANCHOR0
-	mov	w12, 0
-.LVL82:
-	ldr	x4, [x23, 48]
-.LVL83:
-.L154:
-	lsl	w11, w12, 10
-	lsl	w8, w12, 16
-	mov	w10, 0
-	.p2align 2
-.L152:
-	ubfiz	w7, w10, 5, 4
-	and	w6, w10, 240
-	add	w7, w7, w11
-	add	w6, w11, w6, lsl 1
-.LBE36:
-.LBE35:
+.LBB37:
+	.loc 1 715 0
+	mov	w0, w22
+	bl	get_wf_mode_index
+.LVL100:
+.LBB38:
+.LBB39:
+	.loc 1 580 0
+	ldr	x2, [x25, 48]
+.LVL101:
+.LBE39:
+.LBE38:
+	.loc 1 716 0
+	cmp	w19, 32
+	cset	w24, eq
+	cmp	w22, 5
+	cset	w1, eq
+	orr	w24, w24, w1
+.LBB44:
 .LBB40:
+	.loc 1 584 0
+	ldrb	w1, [x2, 32]
+	add	w1, w1, w0, lsl 2
+	.loc 1 587 0
+	add	x3, x2, x1, sxtw
+	.loc 1 586 0
+	ldrb	w4, [x2, w1, sxtw]
+	.loc 1 588 0
+	ldrb	w0, [x3, 2]
+	.loc 1 587 0
+	ldrb	w1, [x3, 1]
+	.loc 1 589 0
+	ldrb	w5, [x3, 3]
+	.loc 1 590 0
+	add	w3, w1, w0
+	add	w3, w3, w4
+	cmp	w5, w3, uxtb
+.LBE40:
+.LBE44:
+	.loc 1 716 0
+	cbz	w24, .L193
+.LBB45:
 .LBB41:
-	.loc 1 495 0
-	mov	x2, 0
-	.p2align 2
-.L151:
-	and	w0, w2, 65535
-.LVL84:
+	.loc 1 590 0
+	bne	.L235
+	.loc 1 595 0
+	lsl	w0, w0, 16
+	.loc 1 597 0
+	lsl	w20, w20, 2
+.LVL102:
+	.loc 1 595 0
+	orr	w1, w0, w1, lsl 8
+	orr	w1, w1, w4
+	.loc 1 597 0
+	add	w1, w20, w1
+	.loc 1 600 0
+	add	x3, x2, x1, sxtw
+	.loc 1 599 0
+	ldrb	w4, [x2, w1, sxtw]
+	.loc 1 601 0
+	ldrb	w0, [x3, 2]
+	.loc 1 600 0
+	ldrb	w1, [x3, 1]
+	.loc 1 602 0
+	ldrb	w5, [x3, 3]
+	.loc 1 604 0
+	add	w3, w1, w0
+	add	w3, w3, w4
+	cmp	w5, w3, uxtb
+	bne	.L236
+	.loc 1 609 0
+	lsl	w0, w0, 16
+	orr	w0, w0, w1, lsl 8
+	orr	w0, w0, w4
+	.loc 1 611 0
+	add	x0, x2, x0
+	bl	decodewaveform_32
+.LVL103:
+	mov	w19, w0
+.LVL104:
+.L197:
 .LBE41:
-.LBE40:
-.LBB46:
-.LBB39:
-.LBB37:
-	.loc 1 532 0
-	add	w5, w8, w2
-	.loc 1 531 0
-	add	w1, w6, w0, lsr 4
-	.loc 1 530 0
-	and	w0, w0, 15
-.LVL85:
-	add	w0, w0, w7
-	add	x2, x2, 1
+.LBE45:
+	.loc 1 720 0
+	tbnz	w19, #31, .L195
+	.loc 1 724 0
+	str	w19, [x21]
+	.loc 1 726 0
+	cmp	w22, 5
+	beq	.L237
+	.loc 1 734 0
+	cbnz	w24, .L238
+	.loc 1 737 0
+	ldr	x0, [x21, 16]
+	mov	w1, w19
+	bl	pvi_lut_init_wf_table
+.LVL105:
+.L230:
 .LBE37:
-	.loc 1 525 0
-	cmp	x2, 256
-.LBB38:
-	.loc 1 531 0
-	ldrb	w1, [x4, w1, sxtw]
-	.loc 1 530 0
-	ldrb	w3, [x4, w0, sxtw]
-	.loc 1 532 0
-	ubfiz	w0, w1, 2, 2
-	.loc 1 530 0
-	and	w1, w3, 3
-	.loc 1 532 0
-	orr	w0, w0, w1
-	strb	w0, [x9, w5, sxtw]
-.LBE38:
-	.loc 1 525 0
-	bne	.L151
-	.loc 1 524 0
-	add	w10, w10, 1
-.LVL86:
-	add	w8, w8, 256
-	and	w10, w10, 65535
-.LVL87:
-	cmp	w10, 256
-	bne	.L152
-	.loc 1 523 0
-	add	w12, w12, 1
-	cmp	w21, w12
-	bne	.L154
-.LVL88:
-.L149:
-.LBE39:
-.LBE46:
-	.loc 1 578 0
-	cmp	w20, 5
-	beq	.L185
-.LVL89:
-.L144:
-.LBE34:
-.LBE33:
-	.loc 1 606 0
+.LBE36:
+	.loc 1 796 0
 	mov	w0, 0
-	b	.L123
-.LVL90:
-.L156:
-	.loc 1 593 0
-	mov	w0, -19
-.LVL91:
-.L123:
-	.loc 1 638 0
+	.loc 1 797 0
+	ldr	x25, [sp, 64]
 	ldp	x19, x20, [sp, 16]
-.LVL92:
+.LVL106:
 	ldp	x21, x22, [sp, 32]
-.LVL93:
+.LVL107:
 	ldp	x23, x24, [sp, 48]
-	ldr	x25, [sp, 64]
-.LVL94:
 	ldp	x29, x30, [sp], 80
 	.cfi_remember_state
 	.cfi_restore 30
@@ -1356,279 +1692,518 @@ pvi_wf_get_lut:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL95:
-.L184:
+.LVL108:
+.L236:
+	.cfi_restore_state
+.LBB73:
+.LBB68:
+.LBB46:
+.LBB42:
+	.loc 1 605 0
+	adrp	x1, .LANCHOR2
+	adrp	x0, .LC5
+	mov	w2, 605
+.LVL109:
+	add	x1, x1, :lo12:.LANCHOR2
+	add	x0, x0, :lo12:.LC5
+	bl	printk
+.LVL110:
+.L195:
+.LBE42:
+.LBE46:
+	.loc 1 721 0
+	adrp	x0, .LC6
+	add	x0, x0, :lo12:.LC6
+	bl	printk
+.LVL111:
+.LBE68:
+.LBE73:
+	.loc 1 797 0
+	ldr	x25, [sp, 64]
+	.loc 1 789 0
+	mov	w0, -1
+	.loc 1 797 0
+	ldp	x19, x20, [sp, 16]
+.LVL112:
+	ldp	x21, x22, [sp, 32]
+.LVL113:
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 80
+	.cfi_remember_state
+	.cfi_restore 20
+	.cfi_restore 19
+	.cfi_restore 22
+	.cfi_restore 21
+	.cfi_restore 24
+	.cfi_restore 23
+	.cfi_restore 25
+	.cfi_restore 29
+	.cfi_restore 30
+	.cfi_def_cfa 31, 0
+	ret
+.LVL114:
+.L235:
+	.cfi_restore_state
+.LBB74:
+.LBB69:
+.LBB47:
+.LBB43:
+	.loc 1 591 0
+	adrp	x1, .LANCHOR2
+	adrp	x0, .LC5
+	mov	w2, 591
+.LVL115:
+	add	x1, x1, :lo12:.LANCHOR2
+	add	x0, x0, :lo12:.LC5
+	bl	printk
+.LVL116:
+	b	.L195
+.LVL117:
+.L237:
+.LBE43:
+.LBE47:
+.LBB48:
+.LBB49:
+	.loc 1 616 0
+	add	x23, x23, :lo12:.LANCHOR0
+.LBE49:
+.LBE48:
+	.loc 1 727 0
+	mov	w0, 4
+	bl	get_wf_mode_index
+.LVL118:
+.LBB54:
+.LBB50:
+	.loc 1 616 0
+	ldr	x2, [x23, 48]
+.LVL119:
+	.loc 1 620 0
+	ldrb	w1, [x2, 32]
+	add	w0, w1, w0, lsl 2
+	.loc 1 623 0
+	add	x3, x2, x0, sxtw
+	.loc 1 622 0
+	ldrb	w4, [x2, w0, sxtw]
+	.loc 1 624 0
+	ldrb	w1, [x3, 2]
+	.loc 1 623 0
+	ldrb	w0, [x3, 1]
+	.loc 1 625 0
+	ldrb	w5, [x3, 3]
+	.loc 1 626 0
+	add	w3, w0, w1
+	add	w3, w3, w4
+	cmp	w5, w3, uxtb
+	bne	.L239
+	.loc 1 631 0
+	lsl	w1, w1, 16
+	orr	w0, w1, w0, lsl 8
+	orr	w0, w0, w4
+	.loc 1 633 0
+	add	w20, w20, w0
+	.loc 1 636 0
+	add	x3, x2, x20, sxtw
+	.loc 1 635 0
+	ldrb	w4, [x2, w20, sxtw]
+	.loc 1 636 0
+	ldrb	w0, [x3, 1]
+	.loc 1 637 0
+	ldrb	w1, [x3, 2]
+	.loc 1 638 0
+	ldrb	w5, [x3, 3]
+	.loc 1 640 0
+	add	w3, w0, w1
+	add	w3, w3, w4
+	cmp	w5, w3, uxtb
+	bne	.L240
+	.loc 1 645 0
+	lsl	w3, w1, 16
+	.loc 1 647 0
+	mov	w1, w19
+	.loc 1 645 0
+	orr	w0, w3, w0, lsl 8
+	orr	w0, w0, w4
+	.loc 1 647 0
+	add	x0, x2, x0
+	bl	decodewaveform_auto
+.LVL120:
+	lsl	w20, w0, 8
+.LBE50:
+.LBE54:
+	.loc 1 729 0
+	cmp	w0, 0
+	ble	.L203
+.L206:
+	.loc 1 731 0
+	ldr	x0, [x21, 16]
+	mov	w1, w19
+	bl	pvi_lut_init_wf_table
+.LVL121:
+	.loc 1 732 0
+	ldr	w1, [x21]
+.LBE69:
+.LBE74:
+	.loc 1 796 0
+	mov	w0, 0
+.LBB75:
+.LBB70:
+	.loc 1 732 0
+	orr	w20, w1, w20
+	str	w20, [x21]
+.LBE70:
+.LBE75:
+	.loc 1 797 0
+	ldp	x19, x20, [sp, 16]
+.LVL122:
+	ldp	x21, x22, [sp, 32]
+.LVL123:
+	ldp	x23, x24, [sp, 48]
+	ldr	x25, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	.cfi_remember_state
+	.cfi_restore 20
+	.cfi_restore 19
+	.cfi_restore 22
+	.cfi_restore 21
+	.cfi_restore 24
+	.cfi_restore 23
+	.cfi_restore 25
+	.cfi_restore 29
+	.cfi_restore 30
+	.cfi_def_cfa 31, 0
+	ret
+.LVL124:
+.L238:
 	.cfi_restore_state
-.LBB59:
+.LBB76:
+.LBB71:
+	.loc 1 735 0
+	ldr	x6, [x21, 16]
 .LBB55:
-	.loc 1 574 0
-	ldr	x6, [x19, 16]
-.LBB47:
-.LBB44:
-	.loc 1 495 0
-	cbz	w21, .L149
-	add	x23, x23, :lo12:.LANCHOR0
-	mov	w8, 0
-.LVL96:
-	ldr	x5, [x23, 48]
-.LVL97:
-.L148:
-	lsl	w9, w8, 10
-	lsl	w4, w8, 16
+.LBB56:
+	.loc 1 655 0
+	cbz	w19, .L230
+	ldr	x5, [x23, #:lo12:.LANCHOR0]
+	mov	w9, 0
+.LVL125:
+.L213:
+	lsl	w8, w9, 10
+	lsl	w4, w9, 16
 	mov	w7, 0
-.L146:
+	.p2align 2
+.L211:
 	lsr	w3, w7, 3
-.LBE44:
-.LBE47:
-	.loc 1 553 0
+.LBE56:
+.LBE55:
+.LBB60:
+.LBB51:
+	.loc 1 641 0
 	mov	x0, 0
-	add	w3, w9, w3, lsl 5
+	add	w3, w8, w3, lsl 5
 	.p2align 2
-.L145:
-.LBB48:
-.LBB45:
-.LBB42:
-	.loc 1 500 0
+.L210:
+.LBE51:
+.LBE60:
+.LBB61:
+.LBB59:
+.LBB57:
+	.loc 1 660 0
 	ubfx	x1, x0, 3, 13
-	.loc 1 501 0
+	.loc 1 661 0
 	add	w2, w4, w0
-	.loc 1 500 0
+	.loc 1 660 0
 	add	w1, w1, w3
 	add	x0, x0, 1
-.LBE42:
-	.loc 1 497 0
+.LBE57:
+	.loc 1 657 0
 	cmp	x0, 256
-.LBB43:
-	.loc 1 500 0
+.LBB58:
+	.loc 1 660 0
 	ldrb	w1, [x5, w1, sxtw]
 	and	w1, w1, 3
-	.loc 1 501 0
+	.loc 1 661 0
 	strb	w1, [x6, w2, sxtw]
-.LBE43:
-	.loc 1 497 0
-	bne	.L145
-	.loc 1 496 0
+.LBE58:
+	.loc 1 657 0
+	bne	.L210
+	.loc 1 656 0
 	add	w7, w7, 1
-.LVL98:
+.LVL126:
 	add	w4, w4, 256
 	and	w7, w7, 65535
-.LVL99:
+.LVL127:
 	cmp	w7, 256
-	bne	.L146
-	.loc 1 495 0
-	add	w8, w8, 1
-	cmp	w21, w8
-	bne	.L148
-	b	.L149
-.LVL100:
-.L183:
-.LBE45:
-.LBE48:
-	.loc 1 567 0
-	mov	w0, 4
-	bl	get_wf_mode_index
-.LVL101:
-	.loc 1 568 0
-	mov	w1, w25
-	bl	get_wf_frm_num
-.LVL102:
-	mov	w22, w0
-.LVL103:
-	.loc 1 569 0
-	cmp	w0, 0
-	bgt	.L140
-	.loc 1 570 0
-	adrp	x0, .LC7
-	add	x0, x0, :lo12:.LC7
-	bl	printk
-.LVL104:
-	b	.L140
-.LVL105:
-.L185:
-	.loc 1 579 0
-	ldr	w1, [x19]
-.LBE55:
+	bne	.L211
+	.loc 1 655 0
+	add	w9, w9, 1
+	cmp	w19, w9
+	bne	.L213
+	b	.L230
+.LVL128:
+.L239:
 .LBE59:
-	.loc 1 637 0
-	mov	w0, 0
-.LBB60:
-.LBB56:
-	.loc 1 579 0
-	orr	w22, w1, w22, lsl 8
-.LVL106:
-	str	w22, [x19]
-	b	.L123
-.LVL107:
-.L186:
-.LBB49:
-.LBB50:
-	.loc 1 467 0
+.LBE61:
+.LBB62:
+.LBB52:
+	.loc 1 627 0
 	adrp	x1, .LANCHOR2
 	add	x1, x1, :lo12:.LANCHOR2
-	adrp	x0, .LC4
-	mov	w2, 467
-.LVL108:
-	add	x1, x1, 16
-	add	x0, x0, :lo12:.LC4
+	adrp	x0, .LC5
+	mov	w2, 627
+.LVL129:
+	add	x1, x1, 40
+	add	x0, x0, :lo12:.LC5
+	mov	w20, -5632
 	bl	printk
-.LVL109:
-.L136:
-.LBE50:
-.LBE49:
-	.loc 1 561 0
-	adrp	x0, .LC6
-	add	x0, x0, :lo12:.LC6
+.LVL130:
+.L203:
+.LBE52:
+.LBE62:
+	.loc 1 730 0
+	adrp	x0, .LC7
+	add	x0, x0, :lo12:.LC7
 	bl	printk
-.LVL110:
-.LBE56:
-.LBE60:
-	.loc 1 630 0
-	mov	w0, -1
-	b	.L123
-.LVL111:
-.L182:
-.LBB61:
-.LBB57:
+.LVL131:
+	b	.L206
+.LVL132:
+.L240:
+.LBB63:
 .LBB53:
-.LBB51:
-	.loc 1 456 0
-	ldr	x2, [x21, 40]
-.LVL112:
-	.loc 1 460 0
-	ldrb	w0, [x2, 32]
-	add	w0, w0, w1, lsl 2
-	.loc 1 463 0
-	add	x3, x2, x0, sxtw
-	.loc 1 462 0
-	ldrb	w4, [x2, w0, sxtw]
-	.loc 1 463 0
-	ldrb	w1, [x3, 1]
-	.loc 1 464 0
-	ldrb	w0, [x3, 2]
-	.loc 1 465 0
-	ldrb	w5, [x3, 3]
-	.loc 1 466 0
-	add	w3, w1, w0
-	add	w3, w3, w4
-	cmp	w5, w3, uxtb
-	bne	.L186
-	.loc 1 471 0
+	.loc 1 641 0
+	adrp	x1, .LANCHOR2
+	add	x1, x1, :lo12:.LANCHOR2
+	adrp	x0, .LC5
+	mov	w2, 641
+.LVL133:
+	add	x1, x1, 40
+	mov	w20, -5632
+	add	x0, x0, :lo12:.LC5
+	bl	printk
+.LVL134:
+	b	.L203
+.LVL135:
+.L193:
+.LBE53:
+.LBE63:
+.LBB64:
+.LBB65:
+	.loc 1 554 0
+	bne	.L241
+	.loc 1 559 0
 	lsl	w0, w0, 16
+	.loc 1 561 0
+	lsl	w20, w20, 2
+.LVL136:
+	.loc 1 559 0
 	orr	w1, w0, w1, lsl 8
 	orr	w1, w1, w4
-	.loc 1 473 0
-	add	w1, w1, w25, lsl 2
-	.loc 1 476 0
+	.loc 1 561 0
+	add	w1, w20, w1
+.LVL137:
+	.loc 1 564 0
 	add	x3, x2, x1, sxtw
-	.loc 1 475 0
+	.loc 1 563 0
 	ldrb	w4, [x2, w1, sxtw]
-	.loc 1 477 0
+	.loc 1 565 0
 	ldrb	w0, [x3, 2]
-	.loc 1 476 0
+	.loc 1 564 0
 	ldrb	w1, [x3, 1]
-	.loc 1 478 0
+	.loc 1 566 0
 	ldrb	w5, [x3, 3]
-	.loc 1 480 0
+	.loc 1 568 0
 	add	w3, w1, w0
 	add	w3, w3, w4
 	cmp	w5, w3, uxtb
-	bne	.L187
-	.loc 1 485 0
+	bne	.L242
+	.loc 1 573 0
 	lsl	w0, w0, 16
 	orr	w0, w0, w1, lsl 8
 	orr	w0, w0, w4
-	.loc 1 487 0
+	.loc 1 575 0
 	add	x0, x2, x0
-	bl	decodewaveform_32
-.LVL113:
-	mov	w21, w0
-.LVL114:
-	b	.L138
-.LVL115:
-.L132:
-.LBE51:
-.LBE53:
-.LBE57:
-.LBE61:
-	.loc 1 633 0
+	bl	decodewaveform
+.LVL138:
+	mov	w19, w0
+.LVL139:
+	b	.L197
+.LVL140:
+.L191:
+.LBE65:
+.LBE64:
+.LBE71:
+.LBE76:
+	.loc 1 792 0
+	mov	w1, w22
 	adrp	x0, .LC8
-	mov	w1, w20
 	add	x0, x0, :lo12:.LC8
 	bl	printk
-.LVL116:
-	.loc 1 634 0
+.LVL141:
+	.loc 1 793 0
 	mov	w0, -1
-	b	.L123
-.LVL117:
-.L158:
-.LBB62:
-.LBB31:
-	.loc 1 406 0
-	mov	w25, -1
-.LVL118:
-	b	.L155
-.LVL119:
-.L187:
-.LBE31:
-.LBE62:
-.LBB63:
-.LBB58:
-.LBB54:
-.LBB52:
-	.loc 1 481 0
+	.loc 1 797 0
+	ldr	x25, [sp, 64]
+	ldp	x19, x20, [sp, 16]
+.LVL142:
+	ldp	x21, x22, [sp, 32]
+.LVL143:
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 80
+	.cfi_remember_state
+	.cfi_restore 20
+	.cfi_restore 19
+	.cfi_restore 22
+	.cfi_restore 21
+	.cfi_restore 24
+	.cfi_restore 23
+	.cfi_restore 25
+	.cfi_restore 29
+	.cfi_restore 30
+	.cfi_def_cfa 31, 0
+	ret
+.LVL144:
+.L242:
+	.cfi_restore_state
+.LBB77:
+.LBB72:
+.LBB67:
+.LBB66:
+	.loc 1 569 0
 	adrp	x1, .LANCHOR2
 	add	x1, x1, :lo12:.LANCHOR2
-	adrp	x0, .LC4
-	mov	w2, 481
-.LVL120:
-	add	x1, x1, 16
-	add	x0, x0, :lo12:.LC4
+	adrp	x0, .LC5
+	mov	w2, 569
+.LVL145:
+	add	x1, x1, 24
+	add	x0, x0, :lo12:.LC5
 	bl	printk
-.LVL121:
-	b	.L136
-.LVL122:
-.L181:
-.LBE52:
-.LBE54:
-.LBE58:
-.LBE63:
-	.loc 1 605 0 discriminator 1
-	ldr	w1, [x6, 8]
-	cmp	w1, w20
-	ccmn	w24, #1, 0, eq
-	bne	.L127
-	b	.L144
-.L180:
-	.loc 1 599 0
+.LVL146:
+	b	.L195
+.LVL147:
+.L241:
+	.loc 1 555 0
+	adrp	x1, .LANCHOR2
+	add	x1, x1, :lo12:.LANCHOR2
 	adrp	x0, .LC5
-	mov	w1, w24
+	mov	w2, 555
+.LVL148:
+	add	x1, x1, 24
 	add	x0, x0, :lo12:.LC5
 	bl	printk
-.LVL123:
-	.loc 1 600 0
+.LVL149:
+	b	.L195
+.LVL150:
+.L217:
+.LBE66:
+.LBE67:
+.LBE72:
+.LBE77:
+.LBB78:
+.LBB34:
+	.loc 1 530 0
+	mov	w20, -1
+.LVL151:
+	b	.L214
+.LVL152:
+.L234:
+.LBE34:
+.LBE78:
+	.loc 1 764 0 discriminator 1
+	ldr	w1, [x6, 8]
+	cmp	w1, w22
+	ccmn	w19, #1, 0, eq
+	bne	.L186
+	b	.L230
+.L233:
+	.loc 1 758 0
+	mov	w1, w19
+	adrp	x0, .LC4
+	add	x0, x0, :lo12:.LC4
+	bl	printk
+.LVL153:
+	.loc 1 759 0
 	mov	w0, -22
-	b	.L123
-.LVL124:
-.L179:
-	.loc 1 595 0 discriminator 1
+	.loc 1 797 0
+	ldr	x25, [sp, 64]
+	ldp	x19, x20, [sp, 16]
+.LVL154:
+	ldp	x21, x22, [sp, 32]
+.LVL155:
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 80
+	.cfi_remember_state
+	.cfi_restore 20
+	.cfi_restore 19
+	.cfi_restore 22
+	.cfi_restore 21
+	.cfi_restore 24
+	.cfi_restore 23
+	.cfi_restore 25
+	.cfi_restore 29
+	.cfi_restore 30
+	.cfi_def_cfa 31, 0
+	ret
+.LVL156:
+.L232:
+	.cfi_restore_state
+	.loc 1 754 0 discriminator 1
 	ldr	x5, [x0, 16]
-	cbnz	x5, .L125
-	.loc 1 596 0
+	cbnz	x5, .L184
+	.loc 1 755 0
 	mov	w0, -22
-.LVL125:
-	b	.L123
+.LVL157:
+	.loc 1 797 0
+	ldr	x25, [sp, 64]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 80
+	.cfi_remember_state
+	.cfi_restore 20
+	.cfi_restore 19
+	.cfi_restore 22
+	.cfi_restore 21
+	.cfi_restore 24
+	.cfi_restore 23
+	.cfi_restore 25
+	.cfi_restore 29
+	.cfi_restore 30
+	.cfi_def_cfa 31, 0
+	ret
+.LVL158:
+.L215:
+	.cfi_restore_state
+	.loc 1 752 0
+	mov	w0, -19
+.LVL159:
+	.loc 1 797 0
+	ldr	x25, [sp, 64]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 80
+	.cfi_restore 20
+	.cfi_restore 19
+	.cfi_restore 22
+	.cfi_restore 21
+	.cfi_restore 24
+	.cfi_restore 23
+	.cfi_restore 25
+	.cfi_restore 29
+	.cfi_restore 30
+	.cfi_def_cfa 31, 0
+	ret
 	.cfi_endproc
-.LFE1557:
+.LFE1559:
 	.size	pvi_wf_get_lut, .-pvi_wf_get_lut
 	.align	2
 	.p2align 3,,7
 	.global	pvi_wf_input
 	.type	pvi_wf_input, %function
 pvi_wf_input:
-.LFB1558:
-	.loc 1 647 0
+.LFB1560:
+	.loc 1 806 0
 	.cfi_startproc
-.LVL126:
+.LVL160:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -1638,18 +2213,18 @@ pvi_wf_input:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-	.loc 1 650 0
+	.loc 1 809 0
 	adrp	x19, .LANCHOR0
 	add	x1, x19, :lo12:.LANCHOR0
-	ldr	x1, [x1, 40]
-	cbz	x1, .L218
-	.loc 1 651 0
+	ldr	x1, [x1, 48]
+	cbz	x1, .L273
+	.loc 1 810 0
 	mov	w0, -16
-.LVL127:
-.L188:
-	.loc 1 677 0
+.LVL161:
+.L243:
+	.loc 1 836 0
 	ldp	x19, x20, [sp, 16]
-.LVL128:
+.LVL162:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -1658,121 +2233,126 @@ pvi_wf_input:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL129:
-.L218:
+.LVL163:
+.L273:
 	.cfi_restore_state
-	.loc 1 653 0
+	.loc 1 812 0
 	ldrb	w1, [x0, 16]
 	mov	x20, x0
 	adrp	x0, .LC9
-.LVL130:
+.LVL164:
 	add	x0, x0, :lo12:.LC9
 	bl	printk
-.LVL131:
-	.loc 1 656 0
+.LVL165:
+	.loc 1 815 0
 	ldrb	w1, [x20, 16]
 	cmp	w1, 25
-	bhi	.L191
+	bhi	.L246
 	cmp	w1, 24
-	bcs	.L192
+	bcs	.L247
 	cmp	w1, 18
-	beq	.L193
+	beq	.L248
 	cmp	w1, 22
-	beq	.L192
+	beq	.L247
 	cmp	w1, 9
-	beq	.L193
-.L190:
-	.loc 1 669 0
+	beq	.L248
+.L245:
+	.loc 1 828 0
 	ldrb	w2, [x20, 22]
 	adrp	x0, .LC10
 	add	x0, x0, :lo12:.LC10
 	bl	printk
-.LVL132:
-	.loc 1 671 0
+.LVL166:
+	.loc 1 830 0
 	mov	w0, -8
-	b	.L188
-.L219:
-	.loc 1 656 0
+	b	.L243
+.L274:
+	.loc 1 815 0
 	cmp	w1, 32
-	bne	.L190
-.L192:
-	.loc 1 662 0
+	bne	.L245
+.L247:
+	.loc 1 821 0
 	adrp	x0, .LANCHOR1
 	mov	w1, 32
 	str	w1, [x0, #:lo12:.LANCHOR1]
-.L193:
-	.loc 1 674 0
+.L248:
+	.loc 1 833 0
 	add	x19, x19, :lo12:.LANCHOR0
-	.loc 1 676 0
+	.loc 1 835 0
 	mov	w0, 0
-	.loc 1 674 0
-	str	x20, [x19, 40]
-	.loc 1 676 0
-	b	.L188
-.L191:
-	.loc 1 656 0
+	.loc 1 833 0
+	str	x20, [x19, 48]
+	.loc 1 835 0
+	b	.L243
+.L246:
+	.loc 1 815 0
 	cmp	w1, 35
-	beq	.L193
-	bls	.L219
+	beq	.L248
+	bls	.L274
 	cmp	w1, 67
-	beq	.L192
+	beq	.L247
 	cmp	w1, 84
-	beq	.L193
-	b	.L190
+	beq	.L248
+	b	.L245
 	.cfi_endproc
-.LFE1558:
+.LFE1560:
 	.size	pvi_wf_input, .-pvi_wf_input
 	.align	2
 	.p2align 3,,7
 	.global	pvi_wf_get_version
 	.type	pvi_wf_get_version, %function
 pvi_wf_get_version:
-.LFB1559:
-	.loc 1 686 0
+.LFB1561:
+	.loc 1 845 0
 	.cfi_startproc
-	.loc 1 687 0
+	.loc 1 846 0
 	adrp	x0, .LANCHOR0
 	add	x0, x0, :lo12:.LANCHOR0
-	ldr	x3, [x0, 40]
-.LVL133:
-	.loc 1 691 0
-	cbz	x3, .L223
-	.loc 1 695 0 discriminator 3
+	ldr	x3, [x0, 48]
+.LVL167:
+	.loc 1 850 0
+	cbz	x3, .L278
+	.loc 1 854 0 discriminator 3
 	add	x0, x0, 56
 	mov	x1, 0
 	.p2align 2
-.L222:
+.L277:
 	add	x2, x3, x1
 	ldrb	w2, [x2, 65]
 	strb	w2, [x1, x0]
 	add	x1, x1, 1
-	.loc 1 694 0 discriminator 3
+	.loc 1 853 0 discriminator 3
 	cmp	x1, 31
-	bne	.L222
-	.loc 1 697 0
+	bne	.L277
+	.loc 1 856 0
 	strb	wzr, [x0, 31]
-	.loc 1 699 0
+	.loc 1 858 0
 	ret
-.L223:
-	.loc 1 692 0
+.L278:
+	.loc 1 851 0
 	mov	x0, 0
-	.loc 1 700 0
+	.loc 1 859 0
 	ret
 	.cfi_endproc
-.LFE1559:
+.LFE1561:
 	.size	pvi_wf_get_version, .-pvi_wf_get_version
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.16890, %object
-	.size	__func__.16890, 15
-__func__.16890:
+	.type	__func__.16936, %object
+	.size	__func__.16936, 18
+__func__.16936:
+	.string	"get_wf_frm_num_32"
+	.zero	6
+	.type	__func__.16925, %object
+	.size	__func__.16925, 15
+__func__.16925:
 	.string	"get_wf_frm_num"
 	.zero	1
-	.type	__func__.16901, %object
-	.size	__func__.16901, 18
-__func__.16901:
-	.string	"get_wf_frm_num_32"
+	.type	__func__.16948, %object
+	.size	__func__.16948, 20
+__func__.16948:
+	.string	"get_wf_frm_num_auto"
 	.data
 	.align	2
 	.set	.LANCHOR1,. + 0
@@ -1780,33 +2360,33 @@ __func__.16901:
 	.size	maxpic, 4
 maxpic:
 	.word	16
-	.type	sftemp.16959, %object
-	.size	sftemp.16959, 4
-sftemp.16959:
+	.type	sftemp.17006, %object
+	.size	sftemp.17006, 4
+sftemp.17006:
 	.word	-1
-	.type	stype.16958, %object
-	.size	stype.16958, 4
-stype.16958:
+	.type	stype.17005, %object
+	.size	stype.17005, 4
+stype.17005:
 	.word	12
 	.bss
 	.align	3
 	.set	.LANCHOR0,. + 0
-	.type	pvi_modes.16841, %object
-	.size	pvi_modes.16841, 36
-pvi_modes.16841:
+	.type	waveformdata, %object
+	.size	waveformdata, 8
+waveformdata:
+	.zero	8
+	.type	pvi_modes.16876, %object
+	.size	pvi_modes.16876, 36
+pvi_modes.16876:
 	.zero	36
 	.zero	4
 	.type	global_waveform, %object
 	.size	global_waveform, 8
 global_waveform:
 	.zero	8
-	.type	waveformdata, %object
-	.size	waveformdata, 8
-waveformdata:
-	.zero	8
-	.type	spi_id_buffer.16995, %object
-	.size	spi_id_buffer.16995, 32
-spi_id_buffer.16995:
+	.type	spi_id_buffer.17042, %object
+	.size	spi_id_buffer.17042, 32
+spi_id_buffer.17042:
 	.zero	32
 	.section	.rodata.str1.8,"aMS",@progbits,1
 	.align	3
@@ -1821,10 +2401,10 @@ spi_id_buffer.16995:
 .LC3:
 	.string	"pvi: decodec waveform 19 error\n"
 .LC4:
-	.string	"pvi: %s %d check error\n"
-.LC5:
 	.string	"pvi: unsupport, needpic = %d, maxpic = %d\n"
 	.zero	5
+.LC5:
+	.string	"pvi: %s %d check error\n"
 .LC6:
 	.string	"pvi waveform get frame number failed\n"
 	.zero	2
@@ -1938,7 +2518,7 @@ spi_id_buffer.16995:
 	.file 96 "drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x6b3e
+	.4byte	0x6d05
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
@@ -13859,32 +14439,32 @@ spi_id_buffer.16995:
 	.uleb128 0x46
 	.4byte	.LASF1474
 	.byte	0x1
-	.2byte	0x2ad
+	.2byte	0x34c
 	.4byte	0x55
-	.8byte	.LFB1559
-	.8byte	.LFE1559-.LFB1559
+	.8byte	.LFB1561
+	.8byte	.LFE1561-.LFB1561
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x6283
 	.uleb128 0x47
 	.4byte	.LASF1472
 	.byte	0x1
-	.2byte	0x2af
+	.2byte	0x34e
 	.4byte	0x55
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x47
 	.4byte	.LASF1473
 	.byte	0x1
-	.2byte	0x2b0
+	.2byte	0x34f
 	.4byte	0x6283
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	spi_id_buffer.16995
+	.8byte	spi_id_buffer.17042
 	.uleb128 0x48
 	.string	"i"
 	.byte	0x1
-	.2byte	0x2b1
+	.2byte	0x350
 	.4byte	0xbb
 	.byte	0
 	.uleb128 0x5
@@ -13897,736 +14477,909 @@ spi_id_buffer.16995:
 	.uleb128 0x46
 	.4byte	.LASF1475
 	.byte	0x1
-	.2byte	0x286
+	.2byte	0x325
 	.4byte	0xbb
-	.8byte	.LFB1558
-	.8byte	.LFE1558-.LFB1558
+	.8byte	.LFB1560
+	.8byte	.LFE1560-.LFB1560
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x62ec
 	.uleb128 0x49
 	.4byte	.LASF1478
 	.byte	0x1
-	.2byte	0x286
+	.2byte	0x325
 	.4byte	0x45b
-	.4byte	.LLST28
+	.4byte	.LLST32
 	.uleb128 0x4a
 	.4byte	.LASF1476
 	.byte	0x1
-	.2byte	0x288
+	.2byte	0x327
 	.4byte	0x622c
 	.uleb128 0x4b
-	.8byte	.LVL131
-	.4byte	0x6b36
+	.8byte	.LVL165
+	.4byte	0x6cfd
 	.uleb128 0x4b
-	.8byte	.LVL132
-	.4byte	0x6b36
+	.8byte	.LVL166
+	.4byte	0x6cfd
 	.byte	0
 	.uleb128 0x46
 	.4byte	.LASF1477
 	.byte	0x1
-	.2byte	0x248
+	.2byte	0x2e7
 	.4byte	0xbb
-	.8byte	.LFB1557
-	.8byte	.LFE1557-.LFB1557
+	.8byte	.LFB1559
+	.8byte	.LFE1559-.LFB1559
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x65ca
+	.4byte	0x6651
 	.uleb128 0x49
 	.4byte	.LASF1479
 	.byte	0x1
-	.2byte	0x248
-	.4byte	0x65ca
-	.4byte	.LLST14
+	.2byte	0x2e7
+	.4byte	0x6651
+	.4byte	.LLST20
 	.uleb128 0x49
 	.4byte	.LASF1480
 	.byte	0x1
-	.2byte	0x248
+	.2byte	0x2e7
 	.4byte	0x5fdb
-	.4byte	.LLST15
+	.4byte	.LLST21
 	.uleb128 0x49
 	.4byte	.LASF1481
 	.byte	0x1
-	.2byte	0x248
+	.2byte	0x2e7
 	.4byte	0xbb
-	.4byte	.LLST16
+	.4byte	.LLST22
 	.uleb128 0x49
 	.4byte	.LASF1482
 	.byte	0x1
-	.2byte	0x248
+	.2byte	0x2e7
 	.4byte	0xbb
-	.4byte	.LLST17
+	.4byte	.LLST23
 	.uleb128 0x47
 	.4byte	.LASF1483
 	.byte	0x1
-	.2byte	0x24a
+	.2byte	0x2e9
 	.4byte	0x5fdb
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	stype.16958
+	.8byte	stype.17005
 	.uleb128 0x47
 	.4byte	.LASF1484
 	.byte	0x1
-	.2byte	0x24b
+	.2byte	0x2ea
 	.4byte	0xbb
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	sftemp.16959
+	.8byte	sftemp.17006
 	.uleb128 0x4a
 	.4byte	.LASF1485
 	.byte	0x1
-	.2byte	0x24c
+	.2byte	0x2eb
 	.4byte	0xbb
 	.uleb128 0x48
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x24d
+	.2byte	0x2ec
 	.4byte	0xbb
 	.uleb128 0x48
 	.string	"pic"
 	.byte	0x1
-	.2byte	0x24e
+	.2byte	0x2ed
 	.4byte	0xbb
 	.uleb128 0x4c
-	.4byte	0x68ae
-	.8byte	.LBB28
-	.4byte	.Ldebug_ranges0+0x60
+	.4byte	0x69b0
+	.8byte	.LBB31
+	.4byte	.Ldebug_ranges0+0x90
 	.byte	0x1
-	.2byte	0x264
+	.2byte	0x303
 	.4byte	0x63de
 	.uleb128 0x4d
-	.4byte	0x68bf
+	.4byte	0x69c1
 	.uleb128 0x4e
-	.4byte	.Ldebug_ranges0+0x60
+	.4byte	.Ldebug_ranges0+0x90
 	.uleb128 0x4f
-	.4byte	0x68cb
+	.4byte	0x69cd
 	.uleb128 0x50
-	.4byte	0x68d7
-	.4byte	.LLST18
+	.4byte	0x69d9
+	.4byte	.LLST24
 	.uleb128 0x50
-	.4byte	0x68e3
-	.4byte	.LLST19
+	.4byte	0x69e5
+	.4byte	.LLST25
 	.uleb128 0x4f
-	.4byte	0x68ef
+	.4byte	0x69f1
 	.byte	0
 	.byte	0
 	.uleb128 0x4c
-	.4byte	0x65d0
-	.8byte	.LBB33
-	.4byte	.Ldebug_ranges0+0xa0
+	.4byte	0x6657
+	.8byte	.LBB36
+	.4byte	.Ldebug_ranges0+0xd0
 	.byte	0x1
-	.2byte	0x274
-	.4byte	0x65af
+	.2byte	0x313
+	.4byte	0x6636
 	.uleb128 0x4d
-	.4byte	0x65e1
+	.4byte	0x6668
 	.uleb128 0x4d
-	.4byte	0x65e1
+	.4byte	0x6668
 	.uleb128 0x4d
-	.4byte	0x6605
+	.4byte	0x668c
 	.uleb128 0x4d
-	.4byte	0x65f9
+	.4byte	0x6680
 	.uleb128 0x4d
-	.4byte	0x65ed
+	.4byte	0x6674
 	.uleb128 0x4e
-	.4byte	.Ldebug_ranges0+0xa0
+	.4byte	.Ldebug_ranges0+0xd0
 	.uleb128 0x4f
-	.4byte	0x6611
+	.4byte	0x6698
 	.uleb128 0x50
-	.4byte	0x661d
-	.4byte	.LLST20
-	.uleb128 0x50
-	.4byte	0x6629
-	.4byte	.LLST21
+	.4byte	0x66a4
+	.4byte	.LLST26
+	.uleb128 0x4f
+	.4byte	0x66b0
 	.uleb128 0x4c
-	.4byte	0x6636
-	.8byte	.LBB35
-	.4byte	.Ldebug_ranges0+0x100
+	.4byte	0x6888
+	.8byte	.LBB38
+	.4byte	.Ldebug_ranges0+0x140
 	.byte	0x1
-	.2byte	0x240
-	.4byte	0x6493
+	.2byte	0x2cd
+	.4byte	0x649e
 	.uleb128 0x4d
-	.4byte	0x664f
+	.4byte	0x68a5
 	.uleb128 0x4d
-	.4byte	0x6643
+	.4byte	0x6899
 	.uleb128 0x4e
-	.4byte	.Ldebug_ranges0+0x100
-	.uleb128 0x50
-	.4byte	0x665b
-	.4byte	.LLST22
-	.uleb128 0x50
-	.4byte	0x6665
-	.4byte	.LLST23
+	.4byte	.Ldebug_ranges0+0x140
 	.uleb128 0x50
-	.4byte	0x6671
-	.4byte	.LLST24
-	.uleb128 0x4e
-	.4byte	.Ldebug_ranges0+0x130
+	.4byte	0x68b1
+	.4byte	.LLST27
 	.uleb128 0x4f
-	.4byte	0x667e
+	.4byte	0x68bd
 	.uleb128 0x4f
-	.4byte	0x668a
+	.4byte	0x68c9
 	.uleb128 0x4f
-	.4byte	0x6696
+	.4byte	0x68d5
 	.uleb128 0x4f
-	.4byte	0x66a2
+	.4byte	0x68e1
 	.uleb128 0x4f
-	.4byte	0x66ae
+	.4byte	0x68ed
 	.uleb128 0x4f
-	.4byte	0x66ba
+	.4byte	0x68f9
+	.uleb128 0x4b
+	.8byte	.LVL103
+	.4byte	0x6bb5
+	.uleb128 0x4b
+	.8byte	.LVL110
+	.4byte	0x6cfd
+	.uleb128 0x4b
+	.8byte	.LVL116
+	.4byte	0x6cfd
 	.byte	0
 	.byte	0
+	.uleb128 0x4c
+	.4byte	0x67e2
+	.8byte	.LBB48
+	.4byte	.Ldebug_ranges0+0x1a0
+	.byte	0x1
+	.2byte	0x2d8
+	.4byte	0x651a
+	.uleb128 0x4d
+	.4byte	0x680b
+	.uleb128 0x4d
+	.4byte	0x67ff
+	.uleb128 0x4d
+	.4byte	0x67f3
+	.uleb128 0x4e
+	.4byte	.Ldebug_ranges0+0x1a0
+	.uleb128 0x50
+	.4byte	0x6817
+	.4byte	.LLST28
+	.uleb128 0x4f
+	.4byte	0x6823
+	.uleb128 0x4f
+	.4byte	0x682f
+	.uleb128 0x4f
+	.4byte	0x683b
+	.uleb128 0x4f
+	.4byte	0x6847
+	.uleb128 0x4f
+	.4byte	0x6853
+	.uleb128 0x4f
+	.4byte	0x685f
+	.uleb128 0x4b
+	.8byte	.LVL120
+	.4byte	0x6af3
+	.uleb128 0x4b
+	.8byte	.LVL130
+	.4byte	0x6cfd
+	.uleb128 0x4b
+	.8byte	.LVL134
+	.4byte	0x6cfd
+	.byte	0
 	.byte	0
 	.uleb128 0x4c
-	.4byte	0x66c8
-	.8byte	.LBB40
-	.4byte	.Ldebug_ranges0+0x160
+	.4byte	0x6774
+	.8byte	.LBB55
+	.4byte	.Ldebug_ranges0+0x200
 	.byte	0x1
-	.2byte	0x23e
-	.4byte	0x64e8
+	.2byte	0x2df
+	.4byte	0x656f
 	.uleb128 0x4d
-	.4byte	0x66e1
+	.4byte	0x678d
 	.uleb128 0x4d
-	.4byte	0x66d5
+	.4byte	0x6781
 	.uleb128 0x4e
-	.4byte	.Ldebug_ranges0+0x160
+	.4byte	.Ldebug_ranges0+0x200
 	.uleb128 0x50
-	.4byte	0x66ed
-	.4byte	.LLST25
+	.4byte	0x6799
+	.4byte	.LLST29
 	.uleb128 0x50
-	.4byte	0x66f7
-	.4byte	.LLST26
+	.4byte	0x67a3
+	.4byte	.LLST30
 	.uleb128 0x4f
-	.4byte	0x6703
+	.4byte	0x67af
 	.uleb128 0x4e
-	.4byte	.Ldebug_ranges0+0x1a0
+	.4byte	.Ldebug_ranges0+0x230
 	.uleb128 0x4f
-	.4byte	0x6710
+	.4byte	0x67bc
 	.uleb128 0x4f
-	.4byte	0x671c
+	.4byte	0x67c8
 	.uleb128 0x4f
-	.4byte	0x6728
+	.4byte	0x67d4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4c
-	.4byte	0x6736
-	.8byte	.LBB49
-	.4byte	.Ldebug_ranges0+0x1d0
+	.4byte	0x691c
+	.8byte	.LBB64
+	.4byte	.Ldebug_ranges0+0x260
 	.byte	0x1
-	.2byte	0x22d
-	.4byte	0x655f
+	.2byte	0x2cf
+	.4byte	0x65e6
 	.uleb128 0x4d
-	.4byte	0x6753
+	.4byte	0x6939
 	.uleb128 0x4d
-	.4byte	0x6747
+	.4byte	0x692d
 	.uleb128 0x4e
-	.4byte	.Ldebug_ranges0+0x1d0
+	.4byte	.Ldebug_ranges0+0x260
 	.uleb128 0x50
-	.4byte	0x675f
-	.4byte	.LLST27
+	.4byte	0x6945
+	.4byte	.LLST31
 	.uleb128 0x4f
-	.4byte	0x676b
+	.4byte	0x6951
 	.uleb128 0x4f
-	.4byte	0x6777
+	.4byte	0x695d
 	.uleb128 0x4f
-	.4byte	0x6783
+	.4byte	0x6969
 	.uleb128 0x4f
-	.4byte	0x678f
+	.4byte	0x6975
 	.uleb128 0x4f
-	.4byte	0x679b
+	.4byte	0x6981
 	.uleb128 0x4f
-	.4byte	0x67a7
+	.4byte	0x698d
 	.uleb128 0x4b
-	.8byte	.LVL109
-	.4byte	0x6b36
+	.8byte	.LVL138
+	.4byte	0x6c5b
 	.uleb128 0x4b
-	.8byte	.LVL113
-	.4byte	0x69ee
+	.8byte	.LVL146
+	.4byte	0x6cfd
 	.uleb128 0x4b
-	.8byte	.LVL121
-	.4byte	0x6b36
+	.8byte	.LVL149
+	.4byte	0x6cfd
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL78
-	.4byte	0x68fa
+	.8byte	.LVL100
+	.4byte	0x69fc
 	.uleb128 0x4b
-	.8byte	.LVL79
-	.4byte	0x67d0
+	.8byte	.LVL105
+	.4byte	0x66bd
 	.uleb128 0x4b
-	.8byte	.LVL101
-	.4byte	0x68fa
+	.8byte	.LVL111
+	.4byte	0x6cfd
 	.uleb128 0x4b
-	.8byte	.LVL102
-	.4byte	0x67d0
+	.8byte	.LVL118
+	.4byte	0x69fc
 	.uleb128 0x4b
-	.8byte	.LVL104
-	.4byte	0x6b36
+	.8byte	.LVL121
+	.4byte	0x66bd
 	.uleb128 0x4b
-	.8byte	.LVL110
-	.4byte	0x6b36
+	.8byte	.LVL131
+	.4byte	0x6cfd
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL116
-	.4byte	0x6b36
+	.8byte	.LVL141
+	.4byte	0x6cfd
 	.uleb128 0x4b
-	.8byte	.LVL123
-	.4byte	0x6b36
+	.8byte	.LVL153
+	.4byte	0x6cfd
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x6081
 	.uleb128 0x51
-	.4byte	.LASF1498
+	.4byte	.LASF1496
 	.byte	0x1
-	.2byte	0x225
+	.2byte	0x2c5
 	.4byte	0xbb
 	.byte	0x1
-	.4byte	0x6636
+	.4byte	0x66bd
 	.uleb128 0x52
 	.4byte	.LASF1479
 	.byte	0x1
-	.2byte	0x225
-	.4byte	0x65ca
+	.2byte	0x2c5
+	.4byte	0x6651
 	.uleb128 0x52
 	.4byte	.LASF1485
 	.byte	0x1
-	.2byte	0x225
+	.2byte	0x2c5
 	.4byte	0xbb
 	.uleb128 0x52
 	.4byte	.LASF150
 	.byte	0x1
-	.2byte	0x225
+	.2byte	0x2c5
 	.4byte	0x5fdb
 	.uleb128 0x52
 	.4byte	.LASF1482
 	.byte	0x1
-	.2byte	0x225
+	.2byte	0x2c5
 	.4byte	0xbb
 	.uleb128 0x4a
 	.4byte	.LASF1486
 	.byte	0x1
-	.2byte	0x227
+	.2byte	0x2c7
 	.4byte	0xbb
 	.uleb128 0x4a
 	.4byte	.LASF1445
 	.byte	0x1
-	.2byte	0x228
+	.2byte	0x2c8
 	.4byte	0xbb
 	.uleb128 0x4a
 	.4byte	.LASF1487
 	.byte	0x1
-	.2byte	0x229
+	.2byte	0x2c9
 	.4byte	0xbb
 	.byte	0
 	.uleb128 0x53
-	.4byte	.LASF1496
-	.byte	0x1
-	.2byte	0x206
+	.4byte	.LASF1522
 	.byte	0x1
-	.4byte	0x66c8
-	.uleb128 0x52
+	.2byte	0x2a6
+	.8byte	.LFB1557
+	.8byte	.LFE1557-.LFB1557
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x6774
+	.uleb128 0x54
 	.4byte	.LASF1446
 	.byte	0x1
-	.2byte	0x206
+	.2byte	0x2a6
 	.4byte	0x60b2
-	.uleb128 0x52
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x54
 	.4byte	.LASF1445
 	.byte	0x1
-	.2byte	0x206
+	.2byte	0x2a6
 	.4byte	0xbb
-	.uleb128 0x48
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x55
 	.string	"i"
 	.byte	0x1
-	.2byte	0x208
+	.2byte	0x2a8
 	.4byte	0xbb
-	.uleb128 0x4a
+	.4byte	.LLST0
+	.uleb128 0x56
 	.4byte	.LASF1488
 	.byte	0x1
-	.2byte	0x209
+	.2byte	0x2a9
 	.4byte	0x10a
-	.uleb128 0x4a
+	.4byte	.LLST1
+	.uleb128 0x56
 	.4byte	.LASF1489
 	.byte	0x1
-	.2byte	0x209
+	.2byte	0x2a9
 	.4byte	0x10a
-	.uleb128 0x54
+	.4byte	.LLST2
+	.uleb128 0x4e
+	.4byte	.Ldebug_ranges0+0
 	.uleb128 0x4a
 	.4byte	.LASF1490
 	.byte	0x1
-	.2byte	0x20e
+	.2byte	0x2ae
 	.4byte	0x10a
 	.uleb128 0x4a
 	.4byte	.LASF1491
 	.byte	0x1
-	.2byte	0x20f
+	.2byte	0x2af
 	.4byte	0x10a
 	.uleb128 0x4a
 	.4byte	.LASF1492
 	.byte	0x1
-	.2byte	0x210
+	.2byte	0x2b0
 	.4byte	0x10a
 	.uleb128 0x4a
 	.4byte	.LASF1493
 	.byte	0x1
-	.2byte	0x211
+	.2byte	0x2b1
 	.4byte	0x10a
 	.uleb128 0x4a
 	.4byte	.LASF1494
 	.byte	0x1
-	.2byte	0x212
+	.2byte	0x2b2
 	.4byte	0x100
 	.uleb128 0x4a
 	.4byte	.LASF1495
 	.byte	0x1
-	.2byte	0x213
+	.2byte	0x2b3
 	.4byte	0x100
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	.LASF1497
+	.uleb128 0x57
+	.4byte	.LASF1523
 	.byte	0x1
-	.2byte	0x1ea
+	.2byte	0x28a
 	.byte	0x1
-	.4byte	0x6736
+	.4byte	0x67e2
 	.uleb128 0x52
 	.4byte	.LASF1446
 	.byte	0x1
-	.2byte	0x1ea
+	.2byte	0x28a
 	.4byte	0x60b2
 	.uleb128 0x52
-	.4byte	.LASF1445
+	.4byte	.LASF1445
+	.byte	0x1
+	.2byte	0x28a
+	.4byte	0xbb
+	.uleb128 0x48
+	.string	"i"
+	.byte	0x1
+	.2byte	0x28c
+	.4byte	0xbb
+	.uleb128 0x4a
+	.4byte	.LASF1488
+	.byte	0x1
+	.2byte	0x28d
+	.4byte	0x10a
+	.uleb128 0x4a
+	.4byte	.LASF1489
+	.byte	0x1
+	.2byte	0x28d
+	.4byte	0x10a
+	.uleb128 0x58
+	.uleb128 0x4a
+	.4byte	.LASF1490
+	.byte	0x1
+	.2byte	0x292
+	.4byte	0x10a
+	.uleb128 0x4a
+	.4byte	.LASF1491
+	.byte	0x1
+	.2byte	0x293
+	.4byte	0x10a
+	.uleb128 0x4a
+	.4byte	.LASF1494
+	.byte	0x1
+	.2byte	0x294
+	.4byte	0x100
+	.byte	0
+	.byte	0
+	.uleb128 0x51
+	.4byte	.LASF1497
+	.byte	0x1
+	.2byte	0x266
+	.4byte	0xbb
+	.byte	0x1
+	.4byte	0x686d
+	.uleb128 0x52
+	.4byte	.LASF824
+	.byte	0x1
+	.2byte	0x266
+	.4byte	0xbb
+	.uleb128 0x52
+	.4byte	.LASF1485
 	.byte	0x1
-	.2byte	0x1ea
+	.2byte	0x266
 	.4byte	0xbb
-	.uleb128 0x48
-	.string	"i"
+	.uleb128 0x52
+	.4byte	.LASF1498
 	.byte	0x1
-	.2byte	0x1ec
+	.2byte	0x266
 	.4byte	0xbb
 	.uleb128 0x4a
-	.4byte	.LASF1488
+	.4byte	.LASF1472
 	.byte	0x1
-	.2byte	0x1ed
-	.4byte	0x10a
+	.2byte	0x268
+	.4byte	0x686d
 	.uleb128 0x4a
-	.4byte	.LASF1489
+	.4byte	.LASF1499
 	.byte	0x1
-	.2byte	0x1ed
-	.4byte	0x10a
-	.uleb128 0x54
+	.2byte	0x269
+	.4byte	0x6c
 	.uleb128 0x4a
-	.4byte	.LASF1490
+	.4byte	.LASF1500
 	.byte	0x1
-	.2byte	0x1f2
-	.4byte	0x10a
+	.2byte	0x269
+	.4byte	0x6c
 	.uleb128 0x4a
-	.4byte	.LASF1491
+	.4byte	.LASF1501
 	.byte	0x1
-	.2byte	0x1f3
-	.4byte	0x10a
+	.2byte	0x269
+	.4byte	0x6c
 	.uleb128 0x4a
-	.4byte	.LASF1494
+	.4byte	.LASF1502
 	.byte	0x1
-	.2byte	0x1f4
-	.4byte	0x100
+	.2byte	0x269
+	.4byte	0x6c
+	.uleb128 0x4a
+	.4byte	.LASF503
+	.byte	0x1
+	.2byte	0x26a
+	.4byte	0xbb
+	.uleb128 0x59
+	.4byte	.LASF1503
+	.4byte	0x6883
+	.4byte	.LASF1497
 	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x90
+	.uleb128 0x5
+	.4byte	0x67
+	.4byte	0x6883
+	.uleb128 0x6
+	.4byte	0x4e
+	.byte	0x13
 	.byte	0
+	.uleb128 0x3
+	.4byte	0x6873
 	.uleb128 0x51
-	.4byte	.LASF1499
+	.4byte	.LASF1504
 	.byte	0x1
-	.2byte	0x1c6
+	.2byte	0x242
 	.4byte	0xbb
 	.byte	0x1
-	.4byte	0x67b5
+	.4byte	0x6907
 	.uleb128 0x52
 	.4byte	.LASF824
 	.byte	0x1
-	.2byte	0x1c6
+	.2byte	0x242
 	.4byte	0xbb
 	.uleb128 0x52
 	.4byte	.LASF1485
 	.byte	0x1
-	.2byte	0x1c6
+	.2byte	0x242
 	.4byte	0xbb
 	.uleb128 0x4a
 	.4byte	.LASF1472
 	.byte	0x1
-	.2byte	0x1c8
-	.4byte	0x67b5
+	.2byte	0x244
+	.4byte	0x686d
 	.uleb128 0x4a
-	.4byte	.LASF1500
+	.4byte	.LASF1499
 	.byte	0x1
-	.2byte	0x1c9
+	.2byte	0x245
 	.4byte	0x6c
 	.uleb128 0x4a
-	.4byte	.LASF1501
+	.4byte	.LASF1500
 	.byte	0x1
-	.2byte	0x1c9
+	.2byte	0x245
 	.4byte	0x6c
 	.uleb128 0x4a
-	.4byte	.LASF1502
+	.4byte	.LASF1501
 	.byte	0x1
-	.2byte	0x1c9
+	.2byte	0x245
 	.4byte	0x6c
 	.uleb128 0x4a
-	.4byte	.LASF1503
+	.4byte	.LASF1502
 	.byte	0x1
-	.2byte	0x1c9
+	.2byte	0x245
 	.4byte	0x6c
 	.uleb128 0x4a
 	.4byte	.LASF503
 	.byte	0x1
-	.2byte	0x1ca
+	.2byte	0x246
 	.4byte	0xbb
-	.uleb128 0x55
+	.uleb128 0x59
+	.4byte	.LASF1503
+	.4byte	0x6917
 	.4byte	.LASF1504
-	.4byte	0x67cb
-	.4byte	.LASF1499
 	.byte	0
-	.uleb128 0x7
-	.byte	0x8
-	.4byte	0x90
 	.uleb128 0x5
 	.4byte	0x67
-	.4byte	0x67cb
+	.4byte	0x6917
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x11
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x67bb
-	.uleb128 0x56
-	.4byte	.LASF1507
+	.4byte	0x6907
+	.uleb128 0x51
+	.4byte	.LASF1505
 	.byte	0x1
-	.2byte	0x1a2
+	.2byte	0x21e
 	.4byte	0xbb
-	.8byte	.LFB1552
-	.8byte	.LFE1552-.LFB1552
-	.uleb128 0x1
-	.byte	0x9c
-	.4byte	0x6899
-	.uleb128 0x49
+	.byte	0x1
+	.4byte	0x699b
+	.uleb128 0x52
 	.4byte	.LASF824
 	.byte	0x1
-	.2byte	0x1a2
+	.2byte	0x21e
 	.4byte	0xbb
-	.4byte	.LLST6
-	.uleb128 0x49
+	.uleb128 0x52
 	.4byte	.LASF1485
 	.byte	0x1
-	.2byte	0x1a2
+	.2byte	0x21e
 	.4byte	0xbb
-	.4byte	.LLST7
-	.uleb128 0x57
+	.uleb128 0x4a
 	.4byte	.LASF1472
 	.byte	0x1
-	.2byte	0x1a4
-	.4byte	0x67b5
-	.4byte	.LLST8
+	.2byte	0x220
+	.4byte	0x686d
 	.uleb128 0x4a
-	.4byte	.LASF1500
+	.4byte	.LASF1499
 	.byte	0x1
-	.2byte	0x1a5
+	.2byte	0x221
 	.4byte	0x6c
 	.uleb128 0x4a
-	.4byte	.LASF1501
+	.4byte	.LASF1500
 	.byte	0x1
-	.2byte	0x1a5
+	.2byte	0x221
 	.4byte	0x6c
 	.uleb128 0x4a
-	.4byte	.LASF1502
+	.4byte	.LASF1501
 	.byte	0x1
-	.2byte	0x1a5
+	.2byte	0x221
 	.4byte	0x6c
 	.uleb128 0x4a
-	.4byte	.LASF1503
+	.4byte	.LASF1502
 	.byte	0x1
-	.2byte	0x1a5
+	.2byte	0x221
 	.4byte	0x6c
 	.uleb128 0x4a
 	.4byte	.LASF503
 	.byte	0x1
-	.2byte	0x1a6
+	.2byte	0x222
 	.4byte	0xbb
-	.uleb128 0x58
-	.4byte	.LASF1504
-	.4byte	0x68a9
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	__func__.16890
-	.uleb128 0x4b
-	.8byte	.LVL43
-	.4byte	0x6a94
-	.uleb128 0x4b
-	.8byte	.LVL47
-	.4byte	0x6b36
-	.uleb128 0x4b
-	.8byte	.LVL50
-	.4byte	0x6b36
+	.uleb128 0x59
+	.4byte	.LASF1503
+	.4byte	0x69ab
+	.4byte	.LASF1505
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x67
-	.4byte	0x68a9
+	.4byte	0x69ab
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0xe
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x6899
+	.4byte	0x699b
 	.uleb128 0x51
-	.4byte	.LASF1505
+	.4byte	.LASF1506
 	.byte	0x1
-	.2byte	0x18e
+	.2byte	0x20a
 	.4byte	0xbb
 	.byte	0x1
-	.4byte	0x68fa
+	.4byte	0x69fc
 	.uleb128 0x52
 	.4byte	.LASF1481
 	.byte	0x1
-	.2byte	0x18e
+	.2byte	0x20a
 	.4byte	0xbb
 	.uleb128 0x4a
 	.4byte	.LASF1472
 	.byte	0x1
-	.2byte	0x190
-	.4byte	0x67b5
+	.2byte	0x20c
+	.4byte	0x686d
 	.uleb128 0x4a
-	.4byte	.LASF1506
+	.4byte	.LASF1507
 	.byte	0x1
-	.2byte	0x191
+	.2byte	0x20d
 	.4byte	0xbb
 	.uleb128 0x4a
 	.4byte	.LASF886
 	.byte	0x1
-	.2byte	0x192
+	.2byte	0x20e
 	.4byte	0xbb
 	.uleb128 0x48
 	.string	"i"
 	.byte	0x1
-	.2byte	0x193
+	.2byte	0x20f
 	.4byte	0xbb
 	.byte	0
-	.uleb128 0x56
-	.4byte	.LASF1508
+	.uleb128 0x5a
+	.4byte	.LASF1524
 	.byte	0x1
-	.2byte	0x15c
+	.2byte	0x1d8
 	.4byte	0xbb
-	.8byte	.LFB1550
-	.8byte	.LFE1550-.LFB1550
+	.8byte	.LFB1551
+	.8byte	.LFE1551-.LFB1551
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x69a7
+	.4byte	0x6aa9
 	.uleb128 0x49
 	.4byte	.LASF1480
 	.byte	0x1
-	.2byte	0x15c
+	.2byte	0x1d8
 	.4byte	0x5fdb
-	.4byte	.LLST0
-	.uleb128 0x57
+	.4byte	.LLST3
+	.uleb128 0x56
 	.4byte	.LASF1472
 	.byte	0x1
-	.2byte	0x15e
+	.2byte	0x1da
 	.4byte	0x622c
-	.4byte	.LLST1
+	.4byte	.LLST4
 	.uleb128 0x4a
-	.4byte	.LASF1509
+	.4byte	.LASF1508
 	.byte	0x1
-	.2byte	0x15f
-	.4byte	0x69a7
+	.2byte	0x1db
+	.4byte	0x6aa9
 	.uleb128 0x4a
 	.4byte	.LASF824
 	.byte	0x1
-	.2byte	0x160
+	.2byte	0x1dc
 	.4byte	0xbb
 	.uleb128 0x4c
-	.4byte	0x69ad
-	.8byte	.LBB6
-	.4byte	.Ldebug_ranges0+0
+	.4byte	0x6aaf
+	.8byte	.LBB8
+	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x162
-	.4byte	0x6999
+	.2byte	0x1de
+	.4byte	0x6a9b
 	.uleb128 0x4d
-	.4byte	0x69bd
+	.4byte	0x6ac0
 	.uleb128 0x4d
-	.4byte	0x69bd
+	.4byte	0x6ac0
 	.uleb128 0x4e
-	.4byte	.Ldebug_ranges0+0
-	.uleb128 0x59
-	.4byte	0x69c8
+	.4byte	.Ldebug_ranges0+0x30
+	.uleb128 0x5b
+	.4byte	0x6acc
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	pvi_modes.16841
+	.8byte	pvi_modes.16876
 	.uleb128 0x4b
-	.8byte	.LVL18
-	.4byte	0x6b36
+	.8byte	.LVL26
+	.4byte	0x6cfd
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL7
-	.4byte	0x6b36
+	.8byte	.LVL15
+	.4byte	0x6cfd
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc2
-	.uleb128 0x5a
-	.4byte	.LASF1510
+	.uleb128 0x51
+	.4byte	.LASF1509
 	.byte	0x1
-	.byte	0xf6
-	.4byte	0x69a7
+	.2byte	0x172
+	.4byte	0x6aa9
 	.byte	0x1
-	.4byte	0x69de
-	.uleb128 0x5b
+	.4byte	0x6ae3
+	.uleb128 0x52
 	.4byte	.LASF1472
 	.byte	0x1
-	.byte	0xf6
+	.2byte	0x172
 	.4byte	0x622c
-	.uleb128 0x45
-	.4byte	.LASF1509
+	.uleb128 0x47
+	.4byte	.LASF1508
 	.byte	0x1
-	.byte	0xf8
-	.4byte	0x69de
+	.2byte	0x174
+	.4byte	0x6ae3
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	pvi_modes.16841
+	.8byte	pvi_modes.16876
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xbb
-	.4byte	0x69ee
+	.4byte	0x6af3
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x8
 	.byte	0
 	.uleb128 0x5c
+	.4byte	.LASF1510
+	.byte	0x1
+	.byte	0xf9
+	.4byte	0xbb
+	.8byte	.LFB1549
+	.8byte	.LFE1549-.LFB1549
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x6bb5
+	.uleb128 0x5d
+	.4byte	.LASF741
+	.byte	0x1
+	.byte	0xf9
+	.4byte	0x686d
+	.4byte	.LLST14
+	.uleb128 0x5d
+	.4byte	.LASF1498
+	.byte	0x1
+	.byte	0xf9
+	.4byte	0xbb
+	.4byte	.LLST15
+	.uleb128 0x5e
 	.4byte	.LASF1511
 	.byte	0x1
+	.byte	0xfb
+	.4byte	0x6c
+	.uleb128 0x5e
+	.4byte	.LASF1512
+	.byte	0x1
+	.byte	0xfb
+	.4byte	0x6c
+	.uleb128 0x5f
+	.4byte	.LASF1513
+	.byte	0x1
+	.byte	0xfc
+	.4byte	0x6c
+	.4byte	.LLST16
+	.uleb128 0x5e
+	.4byte	.LASF503
+	.byte	0x1
+	.byte	0xfd
+	.4byte	0x6c
+	.uleb128 0x5f
+	.4byte	.LASF1514
+	.byte	0x1
+	.byte	0xfe
+	.4byte	0x90
+	.4byte	.LLST17
+	.uleb128 0x60
+	.string	"i"
+	.byte	0x1
+	.byte	0xff
+	.4byte	0x90
+	.uleb128 0x56
+	.4byte	.LASF1515
+	.byte	0x1
+	.2byte	0x100
+	.4byte	0x247
+	.4byte	.LLST18
+	.uleb128 0x56
+	.4byte	.LASF1482
+	.byte	0x1
+	.2byte	0x101
+	.4byte	0xbb
+	.4byte	.LLST19
+	.uleb128 0x4b
+	.8byte	.LVL76
+	.4byte	0x6cfd
+	.uleb128 0x4b
+	.8byte	.LVL92
+	.4byte	0x6cfd
+	.byte	0
+	.uleb128 0x5c
+	.4byte	.LASF1516
+	.byte	0x1
 	.byte	0xa2
 	.4byte	0xbb
 	.8byte	.LFB1548
 	.8byte	.LFE1548-.LFB1548
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6a94
+	.4byte	0x6c5b
 	.uleb128 0x5d
 	.4byte	.LASF741
 	.byte	0x1
 	.byte	0xa2
-	.4byte	0x67b5
+	.4byte	0x686d
 	.4byte	.LLST9
 	.uleb128 0x5e
-	.4byte	.LASF1512
+	.4byte	.LASF1511
 	.byte	0x1
 	.byte	0xa4
 	.4byte	0x6c
 	.uleb128 0x5f
-	.4byte	.LASF1513
+	.4byte	.LASF1512
 	.byte	0x1
 	.byte	0xa4
 	.4byte	0x6c
 	.4byte	.LLST10
 	.uleb128 0x5f
-	.4byte	.LASF1514
+	.4byte	.LASF1513
 	.byte	0x1
 	.byte	0xa5
 	.4byte	0x6c
@@ -14637,28 +15390,28 @@ spi_id_buffer.16995:
 	.byte	0xa6
 	.4byte	0x6c
 	.uleb128 0x5e
-	.4byte	.LASF1515
+	.4byte	.LASF1514
 	.byte	0x1
 	.byte	0xa7
 	.4byte	0x90
-	.uleb128 0x60
+	.uleb128 0x61
 	.string	"i"
 	.byte	0x1
 	.byte	0xa8
 	.4byte	0x90
 	.4byte	.LLST12
 	.uleb128 0x5f
-	.4byte	.LASF1516
+	.4byte	.LASF1515
 	.byte	0x1
 	.byte	0xa9
 	.4byte	0x247
 	.4byte	.LLST13
 	.uleb128 0x4b
-	.8byte	.LVL63
-	.4byte	0x6b36
+	.8byte	.LVL59
+	.4byte	0x6cfd
 	.uleb128 0x4b
-	.8byte	.LVL70
-	.4byte	0x6b36
+	.8byte	.LVL66
+	.4byte	0x6cfd
 	.byte	0
 	.uleb128 0x5c
 	.4byte	.LASF1517
@@ -14669,61 +15422,61 @@ spi_id_buffer.16995:
 	.8byte	.LFE1547-.LFB1547
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6b36
+	.4byte	0x6cfd
 	.uleb128 0x5d
 	.4byte	.LASF741
 	.byte	0x1
 	.byte	0x42
-	.4byte	0x67b5
-	.4byte	.LLST2
+	.4byte	0x686d
+	.4byte	.LLST5
 	.uleb128 0x5e
-	.4byte	.LASF1512
+	.4byte	.LASF1511
 	.byte	0x1
 	.byte	0x44
 	.4byte	0x6c
 	.uleb128 0x5e
-	.4byte	.LASF1513
+	.4byte	.LASF1512
 	.byte	0x1
 	.byte	0x44
 	.4byte	0x6c
 	.uleb128 0x5f
-	.4byte	.LASF1514
+	.4byte	.LASF1513
 	.byte	0x1
 	.byte	0x45
 	.4byte	0x6c
-	.4byte	.LLST3
+	.4byte	.LLST6
 	.uleb128 0x5e
 	.4byte	.LASF503
 	.byte	0x1
 	.byte	0x46
 	.4byte	0x6c
 	.uleb128 0x5f
-	.4byte	.LASF1515
+	.4byte	.LASF1514
 	.byte	0x1
 	.byte	0x47
 	.4byte	0x90
-	.4byte	.LLST4
-	.uleb128 0x61
+	.4byte	.LLST7
+	.uleb128 0x60
 	.string	"i"
 	.byte	0x1
 	.byte	0x48
 	.4byte	0x90
 	.uleb128 0x5f
-	.4byte	.LASF1516
+	.4byte	.LASF1515
 	.byte	0x1
 	.byte	0x49
 	.4byte	0x247
-	.4byte	.LLST5
+	.4byte	.LLST8
 	.uleb128 0x4b
-	.8byte	.LVL27
-	.4byte	0x6b36
+	.8byte	.LVL35
+	.4byte	0x6cfd
 	.uleb128 0x4b
-	.8byte	.LVL38
-	.4byte	0x6b36
+	.8byte	.LVL46
+	.4byte	0x6cfd
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF1522
-	.4byte	.LASF1522
+	.4byte	.LASF1525
+	.4byte	.LASF1525
 	.byte	0xd
 	.byte	0xb0
 	.byte	0
@@ -15782,71 +16535,86 @@ spi_id_buffer.16995:
 	.uleb128 0x5
 	.uleb128 0x27
 	.uleb128 0x19
-	.uleb128 0x20
-	.uleb128 0xb
+	.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 0x54
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
 	.uleb128 0xb
-	.byte	0x1
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
 	.byte	0
 	.byte	0
 	.uleb128 0x55
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
-	.uleb128 0xe
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
 	.uleb128 0x49
 	.uleb128 0x13
-	.uleb128 0x34
-	.uleb128 0x19
-	.uleb128 0x1c
-	.uleb128 0xe
+	.uleb128 0x2
+	.uleb128 0x17
 	.byte	0
 	.byte	0
 	.uleb128 0x56
-	.uleb128 0x2e
-	.byte	0x1
+	.uleb128 0x34
+	.byte	0
 	.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
+	.uleb128 0x2
+	.uleb128 0x17
 	.byte	0
 	.byte	0
 	.uleb128 0x57
-	.uleb128 0x34
-	.byte	0
+	.uleb128 0x2e
+	.byte	0x1
 	.uleb128 0x3
 	.uleb128 0xe
 	.uleb128 0x3a
 	.uleb128 0xb
 	.uleb128 0x3b
 	.uleb128 0x5
-	.uleb128 0x49
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x20
+	.uleb128 0xb
+	.uleb128 0x1
 	.uleb128 0x13
-	.uleb128 0x2
-	.uleb128 0x17
 	.byte	0
 	.byte	0
 	.uleb128 0x58
+	.uleb128 0xb
+	.byte	0x1
+	.byte	0
+	.byte	0
+	.uleb128 0x59
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -15855,17 +16623,8 @@ spi_id_buffer.16995:
 	.uleb128 0x13
 	.uleb128 0x34
 	.uleb128 0x19
-	.uleb128 0x2
-	.uleb128 0x18
-	.byte	0
-	.byte	0
-	.uleb128 0x59
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x31
-	.uleb128 0x13
-	.uleb128 0x2
-	.uleb128 0x18
+	.uleb128 0x1c
+	.uleb128 0xe
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
@@ -15876,28 +16635,30 @@ spi_id_buffer.16995:
 	.uleb128 0x3a
 	.uleb128 0xb
 	.uleb128 0x3b
-	.uleb128 0xb
+	.uleb128 0x5
 	.uleb128 0x27
 	.uleb128 0x19
 	.uleb128 0x49
 	.uleb128 0x13
-	.uleb128 0x20
-	.uleb128 0xb
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
 	.uleb128 0x1
 	.uleb128 0x13
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.uleb128 0x5
+	.uleb128 0x34
 	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
-	.uleb128 0xb
-	.uleb128 0x3b
-	.uleb128 0xb
-	.uleb128 0x49
+	.uleb128 0x31
 	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
@@ -15981,8 +16742,6 @@ spi_id_buffer.16995:
 	.uleb128 0xb
 	.uleb128 0x49
 	.uleb128 0x13
-	.uleb128 0x2
-	.uleb128 0x17
 	.byte	0
 	.byte	0
 	.uleb128 0x61
@@ -15996,6 +16755,8 @@ spi_id_buffer.16995:
 	.uleb128 0xb
 	.uleb128 0x49
 	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
 	.byte	0
 	.byte	0
 	.uleb128 0x62
@@ -16018,513 +16779,609 @@ spi_id_buffer.16995:
 	.byte	0
 	.section	.debug_loc,"",@progbits
 .Ldebug_loc0:
-.LLST28:
-	.8byte	.LVL126-.Ltext0
-	.8byte	.LVL127-.Ltext0
+.LLST32:
+	.8byte	.LVL160-.Ltext0
+	.8byte	.LVL161-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL127-.Ltext0
-	.8byte	.LVL128-.Ltext0
+	.8byte	.LVL161-.Ltext0
+	.8byte	.LVL162-.Ltext0
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL129-.Ltext0
-	.8byte	.LVL130-.Ltext0
+	.8byte	.LVL163-.Ltext0
+	.8byte	.LVL164-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL130-.Ltext0
-	.8byte	.LFE1558-.Ltext0
+	.8byte	.LVL164-.Ltext0
+	.8byte	.LFE1560-.Ltext0
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST14:
-	.8byte	.LVL71-.Ltext0
-	.8byte	.LVL72-.Ltext0
+.LLST20:
+	.8byte	.LVL93-.Ltext0
+	.8byte	.LVL94-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL72-.Ltext0
-	.8byte	.LVL90-.Ltext0
+	.8byte	.LVL94-.Ltext0
+	.8byte	.LVL107-.Ltext0
 	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL90-.Ltext0
-	.8byte	.LVL91-.Ltext0
+	.byte	0x65
+	.8byte	.LVL108-.Ltext0
+	.8byte	.LVL113-.Ltext0
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL91-.Ltext0
-	.8byte	.LVL92-.Ltext0
+	.byte	0x65
+	.8byte	.LVL114-.Ltext0
+	.8byte	.LVL123-.Ltext0
 	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL95-.Ltext0
+	.byte	0x65
 	.8byte	.LVL124-.Ltext0
+	.8byte	.LVL143-.Ltext0
 	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL124-.Ltext0
-	.8byte	.LVL125-.Ltext0
+	.byte	0x65
+	.8byte	.LVL144-.Ltext0
+	.8byte	.LVL155-.Ltext0
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL156-.Ltext0
+	.8byte	.LVL157-.Ltext0
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL158-.Ltext0
+	.8byte	.LVL159-.Ltext0
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST15:
-	.8byte	.LVL71-.Ltext0
-	.8byte	.LVL95-.Ltext0
+.LLST21:
+	.8byte	.LVL93-.Ltext0
+	.8byte	.LVL107-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL95-.Ltext0
-	.8byte	.LVL124-.Ltext0
+	.8byte	.LVL108-.Ltext0
+	.8byte	.LVL113-.Ltext0
 	.2byte	0x1
-	.byte	0x64
+	.byte	0x66
+	.8byte	.LVL114-.Ltext0
+	.8byte	.LVL123-.Ltext0
+	.2byte	0x1
+	.byte	0x66
 	.8byte	.LVL124-.Ltext0
-	.8byte	.LFE1557-.Ltext0
+	.8byte	.LVL143-.Ltext0
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL144-.Ltext0
+	.8byte	.LVL155-.Ltext0
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL156-.Ltext0
+	.8byte	.LFE1559-.Ltext0
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST16:
-	.8byte	.LVL71-.Ltext0
-	.8byte	.LVL74-.Ltext0
+.LLST22:
+	.8byte	.LVL93-.Ltext0
+	.8byte	.LVL96-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL74-.Ltext0
-	.8byte	.LVL78-1-.Ltext0
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL89-.Ltext0
-	.8byte	.LVL90-.Ltext0
+	.8byte	.LVL96-.Ltext0
+	.8byte	.LVL100-1-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL90-.Ltext0
-	.8byte	.LVL95-.Ltext0
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL115-.Ltext0
-	.8byte	.LVL116-1-.Ltext0
+	.8byte	.LVL105-.Ltext0
+	.8byte	.LVL108-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL117-.Ltext0
-	.8byte	.LVL119-.Ltext0
+	.8byte	.LVL140-.Ltext0
+	.8byte	.LVL141-1-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL122-.Ltext0
-	.8byte	.LVL123-1-.Ltext0
+	.8byte	.LVL150-.Ltext0
+	.8byte	.LVL153-1-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL124-.Ltext0
-	.8byte	.LFE1557-.Ltext0
+	.8byte	.LVL156-.Ltext0
+	.8byte	.LFE1559-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST17:
-	.8byte	.LVL71-.Ltext0
-	.8byte	.LVL73-.Ltext0
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL73-.Ltext0
-	.8byte	.LVL90-.Ltext0
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL90-.Ltext0
+.LLST23:
+	.8byte	.LVL93-.Ltext0
 	.8byte	.LVL95-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	.LVL95-.Ltext0
-	.8byte	.LVL124-.Ltext0
+	.8byte	.LVL104-.Ltext0
 	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL124-.Ltext0
-	.8byte	.LFE1557-.Ltext0
+	.byte	0x63
+	.8byte	.LVL105-.Ltext0
+	.8byte	.LVL106-.Ltext0
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL108-.Ltext0
+	.8byte	.LVL112-.Ltext0
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL114-.Ltext0
+	.8byte	.LVL117-.Ltext0
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL135-.Ltext0
+	.8byte	.LVL139-.Ltext0
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL140-.Ltext0
+	.8byte	.LVL142-.Ltext0
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL144-.Ltext0
+	.8byte	.LVL154-.Ltext0
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL156-.Ltext0
+	.8byte	.LFE1559-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST18:
-	.8byte	.LVL75-.Ltext0
-	.8byte	.LVL77-.Ltext0
+.LLST24:
+	.8byte	.LVL97-.Ltext0
+	.8byte	.LVL99-.Ltext0
 	.2byte	0x1
 	.byte	0x51
+	.8byte	.LVL150-.Ltext0
+	.8byte	.LVL152-.Ltext0
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST25:
+	.8byte	.LVL98-.Ltext0
+	.8byte	.LVL102-.Ltext0
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL110-.Ltext0
+	.8byte	.LVL112-.Ltext0
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL114-.Ltext0
 	.8byte	.LVL117-.Ltext0
-	.8byte	.LVL119-.Ltext0
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x64
+	.8byte	.LVL135-.Ltext0
+	.8byte	.LVL136-.Ltext0
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL140-.Ltext0
+	.8byte	.LVL142-.Ltext0
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL147-.Ltext0
+	.8byte	.LVL150-.Ltext0
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL151-.Ltext0
+	.8byte	.LVL152-.Ltext0
+	.2byte	0x1
+	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST19:
-	.8byte	.LVL76-.Ltext0
-	.8byte	.LVL90-.Ltext0
+.LLST26:
+	.8byte	.LVL104-.Ltext0
+	.8byte	.LVL106-.Ltext0
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL91-.Ltext0
-	.8byte	.LVL94-.Ltext0
+	.byte	0x63
+	.8byte	.LVL110-.Ltext0
+	.8byte	.LVL112-.Ltext0
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL95-.Ltext0
+	.byte	0x63
 	.8byte	.LVL117-.Ltext0
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL118-.Ltext0
 	.8byte	.LVL122-.Ltext0
 	.2byte	0x1
-	.byte	0x69
-	.8byte	0
-	.8byte	0
-.LLST20:
-	.8byte	.LVL80-.Ltext0
-	.8byte	.LVL90-.Ltext0
+	.byte	0x63
+	.8byte	.LVL124-.Ltext0
+	.8byte	.LVL135-.Ltext0
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL91-.Ltext0
-	.8byte	.LVL93-.Ltext0
+	.byte	0x63
+	.8byte	.LVL139-.Ltext0
+	.8byte	.LVL140-.Ltext0
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL95-.Ltext0
-	.8byte	.LVL107-.Ltext0
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST27:
+	.8byte	.LVL101-.Ltext0
+	.8byte	.LVL103-1-.Ltext0
 	.2byte	0x1
-	.byte	0x65
+	.byte	0x52
+	.8byte	.LVL108-.Ltext0
 	.8byte	.LVL109-.Ltext0
-	.8byte	.LVL111-.Ltext0
 	.2byte	0x1
-	.byte	0x65
+	.byte	0x52
 	.8byte	.LVL114-.Ltext0
 	.8byte	.LVL115-.Ltext0
 	.2byte	0x1
-	.byte	0x65
+	.byte	0x52
+	.8byte	.LVL135-.Ltext0
+	.8byte	.LVL138-1-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL144-.Ltext0
+	.8byte	.LVL145-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL147-.Ltext0
+	.8byte	.LVL148-.Ltext0
+	.2byte	0x1
+	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST21:
-	.8byte	.LVL81-.Ltext0
-	.8byte	.LVL90-.Ltext0
+.LLST28:
+	.8byte	.LVL119-.Ltext0
+	.8byte	.LVL120-1-.Ltext0
 	.2byte	0x1
-	.byte	0x66
-	.8byte	.LVL91-.Ltext0
-	.8byte	.LVL93-.Ltext0
+	.byte	0x52
+	.8byte	.LVL128-.Ltext0
+	.8byte	.LVL129-.Ltext0
 	.2byte	0x1
-	.byte	0x66
-	.8byte	.LVL95-.Ltext0
-	.8byte	.LVL103-.Ltext0
+	.byte	0x52
+	.8byte	.LVL132-.Ltext0
+	.8byte	.LVL133-.Ltext0
 	.2byte	0x1
-	.byte	0x66
-	.8byte	.LVL103-.Ltext0
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST29:
 	.8byte	.LVL105-.Ltext0
+	.8byte	.LVL108-.Ltext0
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL105-.Ltext0
-	.8byte	.LVL106-.Ltext0
+	.byte	0x59
+	.8byte	.LVL125-.Ltext0
+	.8byte	.LVL128-.Ltext0
 	.2byte	0x1
-	.byte	0x66
+	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST22:
-	.8byte	.LVL82-.Ltext0
-	.8byte	.LVL90-.Ltext0
+.LLST30:
+	.8byte	.LVL105-.Ltext0
+	.8byte	.LVL108-.Ltext0
 	.2byte	0x1
-	.byte	0x5c
-	.8byte	.LVL91-.Ltext0
-	.8byte	.LVL95-.Ltext0
+	.byte	0x57
+	.8byte	.LVL125-.Ltext0
+	.8byte	.LVL126-.Ltext0
 	.2byte	0x1
-	.byte	0x5c
-	.8byte	.LVL105-.Ltext0
-	.8byte	.LVL107-.Ltext0
+	.byte	0x57
+	.8byte	.LVL127-.Ltext0
+	.8byte	.LVL128-.Ltext0
 	.2byte	0x1
-	.byte	0x5c
+	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST23:
-	.8byte	.LVL83-.Ltext0
-	.8byte	.LVL86-.Ltext0
+.LLST31:
+	.8byte	.LVL137-.Ltext0
+	.8byte	.LVL138-1-.Ltext0
 	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL87-.Ltext0
-	.8byte	.LVL90-.Ltext0
+	.byte	0x52
+	.8byte	.LVL144-.Ltext0
+	.8byte	.LVL145-.Ltext0
 	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL91-.Ltext0
-	.8byte	.LVL95-.Ltext0
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST0:
+	.8byte	.LVL1-.Ltext0
+	.8byte	.LVL7-.Ltext0
 	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL105-.Ltext0
-	.8byte	.LVL107-.Ltext0
+	.byte	0x5d
+	.8byte	0
+	.8byte	0
+.LLST1:
+	.8byte	.LVL2-.Ltext0
+	.8byte	.LVL5-.Ltext0
 	.2byte	0x1
-	.byte	0x5a
+	.byte	0x5b
+	.8byte	.LVL6-.Ltext0
+	.8byte	.LVL7-.Ltext0
+	.2byte	0x1
+	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST24:
-	.8byte	.LVL84-.Ltext0
-	.8byte	.LVL85-.Ltext0
+.LLST2:
+	.8byte	.LVL3-.Ltext0
+	.8byte	.LVL4-.Ltext0
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST25:
-	.8byte	.LVL88-.Ltext0
-	.8byte	.LVL90-.Ltext0
+.LLST3:
+	.8byte	.LVL8-.Ltext0
+	.8byte	.LVL10-.Ltext0
 	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL91-.Ltext0
-	.8byte	.LVL95-.Ltext0
+	.byte	0x50
+	.8byte	.LVL10-.Ltext0
+	.8byte	.LVL12-.Ltext0
 	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL96-.Ltext0
-	.8byte	.LVL100-.Ltext0
+	.byte	0x64
+	.8byte	.LVL13-.Ltext0
+	.8byte	.LVL16-.Ltext0
 	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL105-.Ltext0
-	.8byte	.LVL107-.Ltext0
+	.byte	0x64
+	.8byte	.LVL17-.Ltext0
+	.8byte	.LFE1551-.Ltext0
 	.2byte	0x1
-	.byte	0x58
+	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST26:
-	.8byte	.LVL88-.Ltext0
-	.8byte	.LVL90-.Ltext0
+.LLST4:
+	.8byte	.LVL9-.Ltext0
+	.8byte	.LVL11-.Ltext0
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL91-.Ltext0
-	.8byte	.LVL95-.Ltext0
+	.byte	0x53
+	.8byte	.LVL13-.Ltext0
+	.8byte	.LVL14-.Ltext0
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL97-.Ltext0
-	.8byte	.LVL98-.Ltext0
+	.byte	0x53
+	.8byte	.LVL17-.Ltext0
+	.8byte	.LVL18-.Ltext0
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL99-.Ltext0
-	.8byte	.LVL100-.Ltext0
+	.byte	0x53
+	.8byte	.LVL19-.Ltext0
+	.8byte	.LVL20-.Ltext0
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL105-.Ltext0
-	.8byte	.LVL107-.Ltext0
+	.byte	0x53
+	.8byte	.LVL21-.Ltext0
+	.8byte	.LVL22-.Ltext0
 	.2byte	0x1
-	.byte	0x57
-	.8byte	0
-	.8byte	0
-.LLST27:
-	.8byte	.LVL107-.Ltext0
-	.8byte	.LVL108-.Ltext0
+	.byte	0x53
+	.8byte	.LVL23-.Ltext0
+	.8byte	.LVL24-.Ltext0
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL112-.Ltext0
-	.8byte	.LVL113-1-.Ltext0
+	.byte	0x53
+	.8byte	.LVL25-.Ltext0
+	.8byte	.LVL26-1-.Ltext0
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL119-.Ltext0
-	.8byte	.LVL120-.Ltext0
+	.byte	0x53
+	.8byte	.LVL27-.Ltext0
+	.8byte	.LVL28-.Ltext0
 	.2byte	0x1
-	.byte	0x52
+	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST6:
-	.8byte	.LVL39-.Ltext0
-	.8byte	.LVL41-.Ltext0
+.LLST14:
+	.8byte	.LVL67-.Ltext0
+	.8byte	.LVL75-.Ltext0
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL76-.Ltext0
+	.8byte	.LVL77-.Ltext0
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL84-.Ltext0
+	.8byte	.LVL85-.Ltext0
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL90-.Ltext0
+	.8byte	.LVL91-.Ltext0
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST7:
-	.8byte	.LVL39-.Ltext0
-	.8byte	.LVL42-.Ltext0
+.LLST15:
+	.8byte	.LVL67-.Ltext0
+	.8byte	.LVL76-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL44-.Ltext0
-	.8byte	.LVL45-.Ltext0
+	.8byte	.LVL76-.Ltext0
+	.8byte	.LVL83-.Ltext0
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL83-.Ltext0
+	.8byte	.LVL84-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST8:
-	.8byte	.LVL40-.Ltext0
-	.8byte	.LVL43-1-.Ltext0
+	.8byte	.LVL84-.Ltext0
+	.8byte	.LVL90-.Ltext0
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL44-.Ltext0
-	.8byte	.LVL46-.Ltext0
+	.byte	0x66
+	.8byte	.LVL90-.Ltext0
+	.8byte	.LVL92-1-.Ltext0
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST16:
+	.8byte	.LVL69-.Ltext0
+	.8byte	.LVL82-.Ltext0
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL48-.Ltext0
-	.8byte	.LVL49-.Ltext0
+	.byte	0x63
+	.8byte	.LVL84-.Ltext0
+	.8byte	.LVL90-.Ltext0
 	.2byte	0x1
-	.byte	0x52
+	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST0:
-	.8byte	.LVL0-.Ltext0
-	.8byte	.LVL2-.Ltext0
+.LLST17:
+	.8byte	.LVL78-.Ltext0
+	.8byte	.LVL80-.Ltext0
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL2-.Ltext0
-	.8byte	.LVL4-.Ltext0
+	.byte	0x54
+	.8byte	.LVL81-.Ltext0
+	.8byte	.LVL84-.Ltext0
 	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL5-.Ltext0
-	.8byte	.LVL8-.Ltext0
+	.byte	0x54
+	.8byte	.LVL87-.Ltext0
+	.8byte	.LVL88-.Ltext0
 	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL9-.Ltext0
-	.8byte	.LFE1550-.Ltext0
+	.byte	0x54
+	.8byte	.LVL89-.Ltext0
+	.8byte	.LVL90-.Ltext0
 	.2byte	0x1
-	.byte	0x64
+	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST1:
-	.8byte	.LVL1-.Ltext0
-	.8byte	.LVL3-.Ltext0
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL5-.Ltext0
-	.8byte	.LVL6-.Ltext0
+.LLST18:
+	.8byte	.LVL68-.Ltext0
+	.8byte	.LVL71-.Ltext0
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL9-.Ltext0
-	.8byte	.LVL10-.Ltext0
+	.byte	0x52
+	.8byte	.LVL72-.Ltext0
+	.8byte	.LVL73-.Ltext0
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL11-.Ltext0
-	.8byte	.LVL12-.Ltext0
+	.byte	0x52
+	.8byte	.LVL74-.Ltext0
+	.8byte	.LVL76-1-.Ltext0
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL13-.Ltext0
-	.8byte	.LVL14-.Ltext0
+	.byte	0x52
+	.8byte	.LVL76-.Ltext0
+	.8byte	.LVL79-.Ltext0
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL15-.Ltext0
-	.8byte	.LVL16-.Ltext0
+	.byte	0x52
+	.8byte	.LVL81-.Ltext0
+	.8byte	.LVL86-.Ltext0
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL17-.Ltext0
-	.8byte	.LVL18-1-.Ltext0
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST19:
+	.8byte	.LVL70-.Ltext0
+	.8byte	.LVL76-1-.Ltext0
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL19-.Ltext0
-	.8byte	.LVL20-.Ltext0
+	.byte	0x5c
+	.8byte	.LVL76-.Ltext0
+	.8byte	.LVL90-.Ltext0
 	.2byte	0x1
-	.byte	0x53
+	.byte	0x5c
 	.8byte	0
 	.8byte	0
 .LLST9:
-	.8byte	.LVL51-.Ltext0
-	.8byte	.LVL62-.Ltext0
+	.8byte	.LVL47-.Ltext0
+	.8byte	.LVL58-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL63-.Ltext0
-	.8byte	.LVL64-.Ltext0
+	.8byte	.LVL59-.Ltext0
+	.8byte	.LVL60-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL66-.Ltext0
-	.8byte	.LVL69-.Ltext0
+	.8byte	.LVL62-.Ltext0
+	.8byte	.LVL65-.Ltext0
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST10:
-	.8byte	.LVL54-.Ltext0
-	.8byte	.LVL63-1-.Ltext0
+	.8byte	.LVL50-.Ltext0
+	.8byte	.LVL59-1-.Ltext0
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL63-.Ltext0
-	.8byte	.LVL68-.Ltext0
+	.8byte	.LVL59-.Ltext0
+	.8byte	.LVL64-.Ltext0
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST11:
-	.8byte	.LVL53-.Ltext0
-	.8byte	.LVL65-.Ltext0
+	.8byte	.LVL49-.Ltext0
+	.8byte	.LVL61-.Ltext0
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL66-.Ltext0
-	.8byte	.LVL68-.Ltext0
+	.8byte	.LVL62-.Ltext0
+	.8byte	.LVL64-.Ltext0
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
 .LLST12:
-	.8byte	.LVL55-.Ltext0
-	.8byte	.LVL56-.Ltext0
+	.8byte	.LVL51-.Ltext0
+	.8byte	.LVL52-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL58-.Ltext0
-	.8byte	.LVL59-.Ltext0
+	.8byte	.LVL54-.Ltext0
+	.8byte	.LVL55-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL60-.Ltext0
-	.8byte	.LVL63-1-.Ltext0
+	.8byte	.LVL56-.Ltext0
+	.8byte	.LVL59-1-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL63-.Ltext0
-	.8byte	.LVL66-.Ltext0
+	.8byte	.LVL59-.Ltext0
+	.8byte	.LVL62-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL67-.Ltext0
-	.8byte	.LVL68-.Ltext0
+	.8byte	.LVL63-.Ltext0
+	.8byte	.LVL64-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST13:
-	.8byte	.LVL52-.Ltext0
-	.8byte	.LVL57-.Ltext0
+	.8byte	.LVL48-.Ltext0
+	.8byte	.LVL53-.Ltext0
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL61-.Ltext0
-	.8byte	.LVL63-1-.Ltext0
+	.8byte	.LVL57-.Ltext0
+	.8byte	.LVL59-1-.Ltext0
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL63-.Ltext0
-	.8byte	.LVL68-.Ltext0
+	.8byte	.LVL59-.Ltext0
+	.8byte	.LVL64-.Ltext0
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST2:
-	.8byte	.LVL21-.Ltext0
-	.8byte	.LVL26-.Ltext0
+.LLST5:
+	.8byte	.LVL29-.Ltext0
+	.8byte	.LVL34-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL30-.Ltext0
-	.8byte	.LVL31-.Ltext0
+	.8byte	.LVL38-.Ltext0
+	.8byte	.LVL39-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL36-.Ltext0
-	.8byte	.LVL37-.Ltext0
+	.8byte	.LVL44-.Ltext0
+	.8byte	.LVL45-.Ltext0
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST3:
-	.8byte	.LVL23-.Ltext0
-	.8byte	.LVL29-.Ltext0
+.LLST6:
+	.8byte	.LVL31-.Ltext0
+	.8byte	.LVL37-.Ltext0
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL30-.Ltext0
-	.8byte	.LVL36-.Ltext0
+	.8byte	.LVL38-.Ltext0
+	.8byte	.LVL44-.Ltext0
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST4:
-	.8byte	.LVL28-.Ltext0
-	.8byte	.LVL30-.Ltext0
+.LLST7:
+	.8byte	.LVL36-.Ltext0
+	.8byte	.LVL38-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL32-.Ltext0
-	.8byte	.LVL34-.Ltext0
+	.8byte	.LVL40-.Ltext0
+	.8byte	.LVL42-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL35-.Ltext0
-	.8byte	.LVL36-.Ltext0
+	.8byte	.LVL43-.Ltext0
+	.8byte	.LVL44-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST5:
-	.8byte	.LVL22-.Ltext0
-	.8byte	.LVL24-.Ltext0
+.LLST8:
+	.8byte	.LVL30-.Ltext0
+	.8byte	.LVL32-.Ltext0
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL25-.Ltext0
-	.8byte	.LVL27-1-.Ltext0
+	.8byte	.LVL33-.Ltext0
+	.8byte	.LVL35-1-.Ltext0
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL28-.Ltext0
-	.8byte	.LVL33-.Ltext0
+	.8byte	.LVL36-.Ltext0
+	.8byte	.LVL41-.Ltext0
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
@@ -16543,70 +17400,86 @@ spi_id_buffer.16995:
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
 .Ldebug_ranges0:
-	.8byte	.LBB6-.Ltext0
-	.8byte	.LBE6-.Ltext0
-	.8byte	.LBB12-.Ltext0
-	.8byte	.LBE12-.Ltext0
-	.8byte	.LBB13-.Ltext0
-	.8byte	.LBE13-.Ltext0
+	.8byte	.LBB4-.Ltext0
+	.8byte	.LBE4-.Ltext0
+	.8byte	.LBB5-.Ltext0
+	.8byte	.LBE5-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB8-.Ltext0
+	.8byte	.LBE8-.Ltext0
 	.8byte	.LBB14-.Ltext0
 	.8byte	.LBE14-.Ltext0
 	.8byte	.LBB15-.Ltext0
 	.8byte	.LBE15-.Ltext0
+	.8byte	.LBB16-.Ltext0
+	.8byte	.LBE16-.Ltext0
+	.8byte	.LBB17-.Ltext0
+	.8byte	.LBE17-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB28-.Ltext0
-	.8byte	.LBE28-.Ltext0
-	.8byte	.LBB32-.Ltext0
-	.8byte	.LBE32-.Ltext0
-	.8byte	.LBB62-.Ltext0
-	.8byte	.LBE62-.Ltext0
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB33-.Ltext0
-	.8byte	.LBE33-.Ltext0
-	.8byte	.LBB59-.Ltext0
-	.8byte	.LBE59-.Ltext0
-	.8byte	.LBB60-.Ltext0
-	.8byte	.LBE60-.Ltext0
-	.8byte	.LBB61-.Ltext0
-	.8byte	.LBE61-.Ltext0
-	.8byte	.LBB63-.Ltext0
-	.8byte	.LBE63-.Ltext0
-	.8byte	0
-	.8byte	0
+	.8byte	.LBB31-.Ltext0
+	.8byte	.LBE31-.Ltext0
 	.8byte	.LBB35-.Ltext0
 	.8byte	.LBE35-.Ltext0
-	.8byte	.LBB46-.Ltext0
-	.8byte	.LBE46-.Ltext0
+	.8byte	.LBB78-.Ltext0
+	.8byte	.LBE78-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB37-.Ltext0
-	.8byte	.LBE37-.Ltext0
-	.8byte	.LBB38-.Ltext0
-	.8byte	.LBE38-.Ltext0
+	.8byte	.LBB36-.Ltext0
+	.8byte	.LBE36-.Ltext0
+	.8byte	.LBB73-.Ltext0
+	.8byte	.LBE73-.Ltext0
+	.8byte	.LBB74-.Ltext0
+	.8byte	.LBE74-.Ltext0
+	.8byte	.LBB75-.Ltext0
+	.8byte	.LBE75-.Ltext0
+	.8byte	.LBB76-.Ltext0
+	.8byte	.LBE76-.Ltext0
+	.8byte	.LBB77-.Ltext0
+	.8byte	.LBE77-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB40-.Ltext0
-	.8byte	.LBE40-.Ltext0
+	.8byte	.LBB38-.Ltext0
+	.8byte	.LBE38-.Ltext0
+	.8byte	.LBB44-.Ltext0
+	.8byte	.LBE44-.Ltext0
+	.8byte	.LBB45-.Ltext0
+	.8byte	.LBE45-.Ltext0
+	.8byte	.LBB46-.Ltext0
+	.8byte	.LBE46-.Ltext0
 	.8byte	.LBB47-.Ltext0
 	.8byte	.LBE47-.Ltext0
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB48-.Ltext0
 	.8byte	.LBE48-.Ltext0
+	.8byte	.LBB54-.Ltext0
+	.8byte	.LBE54-.Ltext0
+	.8byte	.LBB60-.Ltext0
+	.8byte	.LBE60-.Ltext0
+	.8byte	.LBB62-.Ltext0
+	.8byte	.LBE62-.Ltext0
+	.8byte	.LBB63-.Ltext0
+	.8byte	.LBE63-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB55-.Ltext0
+	.8byte	.LBE55-.Ltext0
+	.8byte	.LBB61-.Ltext0
+	.8byte	.LBE61-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB42-.Ltext0
-	.8byte	.LBE42-.Ltext0
-	.8byte	.LBB43-.Ltext0
-	.8byte	.LBE43-.Ltext0
+	.8byte	.LBB57-.Ltext0
+	.8byte	.LBE57-.Ltext0
+	.8byte	.LBB58-.Ltext0
+	.8byte	.LBE58-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB49-.Ltext0
-	.8byte	.LBE49-.Ltext0
-	.8byte	.LBB53-.Ltext0
-	.8byte	.LBE53-.Ltext0
-	.8byte	.LBB54-.Ltext0
-	.8byte	.LBE54-.Ltext0
+	.8byte	.LBB64-.Ltext0
+	.8byte	.LBE64-.Ltext0
+	.8byte	.LBB67-.Ltext0
+	.8byte	.LBE67-.Ltext0
 	.8byte	0
 	.8byte	0
 	.section	.debug_line,"",@progbits
@@ -16650,7 +17523,7 @@ spi_id_buffer.16995:
 	.string	"runnable_weight"
 .LASF323:
 	.string	"pushable_dl_tasks"
-.LASF1504:
+.LASF1503:
 	.string	"__func__"
 .LASF703:
 	.string	"cpu_number"
@@ -16680,7 +17553,7 @@ spi_id_buffer.16995:
 	.string	"entry"
 .LASF1447:
 	.string	"pvi_waveform"
-.LASF1512:
+.LASF1511:
 	.string	"oldpic"
 .LASF547:
 	.string	"MIGRATE_PCPTYPES"
@@ -16882,13 +17755,13 @@ spi_id_buffer.16995:
 	.string	"perf_event_mutex"
 .LASF1382:
 	.string	"dev_uevent"
-.LASF1506:
+.LASF1507:
 	.string	"temp_num"
 .LASF1008:
 	.string	"cancelled_write_bytes"
 .LASF1078:
 	.string	"my_q"
-.LASF1496:
+.LASF1522:
 	.string	"pvi_lut_init_wf_table"
 .LASF269:
 	.string	"sve_vl"
@@ -17012,6 +17885,8 @@ spi_id_buffer.16995:
 	.string	"per_cpu_nodestats"
 .LASF1063:
 	.string	"nr_wakeups_affine_attempts"
+.LASF1497:
+	.string	"get_wf_frm_num_auto"
 .LASF480:
 	.string	"has_timeout"
 .LASF680:
@@ -17292,7 +18167,7 @@ spi_id_buffer.16995:
 	.string	"last_arrival"
 .LASF752:
 	.string	"wait"
-.LASF1497:
+.LASF1523:
 	.string	"pvi_lut_init_wf_table_32"
 .LASF998:
 	.string	"lock_class_key"
@@ -17414,11 +18289,11 @@ spi_id_buffer.16995:
 	.string	"WF_TYPE_GLD16"
 .LASF1037:
 	.string	"util_avg"
-.LASF1502:
+.LASF1501:
 	.string	"temp3"
 .LASF850:
 	.string	"rmdir"
-.LASF1503:
+.LASF1502:
 	.string	"temp4"
 .LASF184:
 	.string	"cpu_hwcap_keys"
@@ -17496,7 +18371,7 @@ spi_id_buffer.16995:
 	.string	"_etext"
 .LASF1175:
 	.string	"kset_uevent_ops"
-.LASF1498:
+.LASF1496:
 	.string	"parse_wf_direct"
 .LASF856:
 	.string	"prealloc_mutex"
@@ -17580,7 +18455,7 @@ spi_id_buffer.16995:
 	.string	"radix_tree_root"
 .LASF240:
 	.string	"__idmap_text_start"
-.LASF1511:
+.LASF1516:
 	.string	"decodewaveform_32"
 .LASF783:
 	.string	"core_sibling"
@@ -17794,6 +18669,8 @@ spi_id_buffer.16995:
 	.string	"temperaturenumber"
 .LASF1306:
 	.string	"links_count"
+.LASF1498:
+	.string	"gray16_frame"
 .LASF725:
 	.string	"clock_event_device"
 .LASF545:
@@ -18186,7 +19063,7 @@ spi_id_buffer.16995:
 	.string	"node_present_pages"
 .LASF1433:
 	.string	"pvi_wf_mode"
-.LASF1507:
+.LASF1505:
 	.string	"get_wf_frm_num"
 .LASF327:
 	.string	"exit_state"
@@ -18308,13 +19185,15 @@ spi_id_buffer.16995:
 	.string	"kmsg_fops"
 .LASF445:
 	.string	"memcg_oom_order"
+.LASF1510:
+	.string	"decodewaveform_auto"
 .LASF341:
 	.string	"memcg_kmem_skip_account"
 .LASF1019:
 	.string	"pcount"
 .LASF1148:
 	.string	"kref"
-.LASF1513:
+.LASF1512:
 	.string	"newpic"
 .LASF436:
 	.string	"nr_dirtied"
@@ -18454,7 +19333,7 @@ spi_id_buffer.16995:
 	.string	"pm_message_t"
 .LASF1429:
 	.string	"WF_TYPE_GLR16"
-.LASF1515:
+.LASF1514:
 	.string	"tempdata"
 .LASF230:
 	.string	"__alt_instructions"
@@ -18686,7 +19565,7 @@ spi_id_buffer.16995:
 	.string	"zoneref"
 .LASF825:
 	.string	"iattr"
-.LASF1514:
+.LASF1513:
 	.string	"frame_tmp"
 .LASF1051:
 	.string	"slice_max"
@@ -18704,7 +19583,7 @@ spi_id_buffer.16995:
 	.string	"self_exec_id"
 .LASF1041:
 	.string	"wait_count"
-.LASF1508:
+.LASF1524:
 	.string	"get_wf_mode_index"
 .LASF1335:
 	.string	"sync"
@@ -18822,7 +19701,7 @@ spi_id_buffer.16995:
 	.string	"wait_sum"
 .LASF305:
 	.string	"boost_expires"
-.LASF1499:
+.LASF1504:
 	.string	"get_wf_frm_num_32"
 .LASF334:
 	.string	"sched_contributes_to_load"
@@ -18866,9 +19745,9 @@ spi_id_buffer.16995:
 	.string	"bps_disabled"
 .LASF755:
 	.string	"notifier_call"
-.LASF1500:
+.LASF1499:
 	.string	"temp1"
-.LASF1501:
+.LASF1500:
 	.string	"temp2"
 .LASF1479:
 	.string	"output"
@@ -19032,7 +19911,7 @@ spi_id_buffer.16995:
 	.string	"device_node"
 .LASF732:
 	.string	"ktime_t"
-.LASF1522:
+.LASF1525:
 	.string	"printk"
 .LASF741:
 	.string	"data"
@@ -19226,7 +20105,7 @@ spi_id_buffer.16995:
 	.string	"fpsimd_cpu"
 .LASF1262:
 	.string	"RPM_REQ_SUSPEND"
-.LASF1516:
+.LASF1515:
 	.string	"israr"
 .LASF360:
 	.string	"utime"
@@ -19262,7 +20141,7 @@ spi_id_buffer.16995:
 	.string	"static_key_mod"
 .LASF543:
 	.string	"MIGRATE_UNMOVABLE"
-.LASF1509:
+.LASF1508:
 	.string	"pvi_modes"
 .LASF959:
 	.string	"_stime"
@@ -19342,7 +20221,7 @@ spi_id_buffer.16995:
 	.string	"namespace"
 .LASF1278:
 	.string	"no_pm"
-.LASF1505:
+.LASF1506:
 	.string	"get_wf_temp_index"
 .LASF14:
 	.string	"long long int"
@@ -19630,7 +20509,7 @@ spi_id_buffer.16995:
 	.string	"serial"
 .LASF398:
 	.string	"wake_q"
-.LASF1510:
+.LASF1509:
 	.string	"parse_mode_version"
 .LASF598:
 	.string	"NR_UNSTABLE_NFS"
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S
index 016a123e1984..f6f7370003b3 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S
@@ -30,41 +30,41 @@ decode_wf_data:
 	.cfi_offset 20, -24
 	.loc 1 245 0
 	uxtw	x20, w1
+.LBB203:
+.LBB204:
 .LBB205:
-.LBB206:
-.LBB207:
 	.file 2 "./include/linux/slab.h"
 	.loc 2 553 0
 	mov	w1, 32960
 .LVL1:
-.LBE207:
-.LBE206:
 .LBE205:
+.LBE204:
+.LBE203:
 	.loc 1 242 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-.LBB212:
 .LBB210:
 .LBB208:
+.LBB206:
 	.loc 2 553 0
 	movk	w1, 0x60, lsl 16
+.LBE206:
 .LBE208:
 .LBE210:
-.LBE212:
 	.loc 1 242 0
 	mov	x21, x0
-.LBB213:
 .LBB211:
 .LBB209:
+.LBB207:
 	.loc 2 553 0
 	mov	x0, x20
 .LVL2:
 	bl	__kmalloc
 .LVL3:
 	mov	x19, x0
+.LBE207:
 .LBE209:
 .LBE211:
-.LBE213:
 	.loc 1 246 0
 	cbz	x0, .L2
 	.loc 1 249 0
@@ -94,36 +94,36 @@ decode_wf_data:
 	.type	parse_wf_gray16.isra.3, %function
 parse_wf_gray16.isra.3:
 .LFB1569:
-	.loc 1 342 0
+	.loc 1 352 0
 	.cfi_startproc
 .LVL6:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-.LBB222:
-.LBB223:
+.LBB220:
+.LBB221:
 	.loc 1 188 0
 	adrp	x4, .LANCHOR0
-.LBE223:
-.LBE222:
-	.loc 1 342 0
+.LBE221:
+.LBE220:
+	.loc 1 352 0
 	mov	x5, x0
-.LBB235:
-.LBB232:
+.LBB233:
+.LBB230:
 	.loc 1 195 0
 	cmp	w3, 3
-.LBE232:
-.LBE235:
-	.loc 1 342 0
+.LBE230:
+.LBE233:
+	.loc 1 352 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 342 0
+	.loc 1 352 0
 	mov	x19, x1
-.LBB236:
-.LBB233:
+.LBB234:
+.LBB231:
 	.loc 1 188 0
 	ldr	x0, [x4, #:lo12:.LANCHOR0]
 .LVL7:
@@ -161,23 +161,23 @@ parse_wf_gray16.isra.3:
 	.loc 1 195 0
 	bhi	.L33
 .L18:
+.LBB222:
+.LBB223:
 .LBB224:
-.LBB225:
-.LBB226:
 	.loc 1 173 0
 	cmp	w2, 0
-.LBE226:
-.LBB227:
+.LBE224:
+.LBB225:
 	.loc 1 174 0
 	mov	w3, 50
 .LVL14:
-.LBE227:
-.LBB228:
+.LBE225:
+.LBB226:
 	.loc 1 173 0
 	csel	w2, w2, wzr, ge
 .LVL15:
-.LBE228:
-.LBB229:
+.LBE226:
+.LBB227:
 	.loc 1 174 0
 	mov	x1, 0
 	cmp	w2, w3
@@ -186,7 +186,7 @@ parse_wf_gray16.isra.3:
 	.p2align 3
 .L19:
 	add	x1, x1, 1
-.LBE229:
+.LBE227:
 	.loc 1 176 0
 	cmp	x1, 50
 	beq	.L34
@@ -197,30 +197,30 @@ parse_wf_gray16.isra.3:
 	bge	.L19
 	lsl	x1, x1, 2
 .L20:
-.LBE225:
-.LBE224:
+.LBE223:
+.LBE222:
 	.loc 1 230 0
 	ldr	w1, [x6, x1]
 	add	x0, x0, x1
 .LVL16:
 .L9:
-.LBE233:
-.LBE236:
-	.loc 1 350 0
+.LBE231:
+.LBE234:
+	.loc 1 360 0
 	ldrb	w1, [x0]
 .LVL17:
-	.loc 1 352 0
+	.loc 1 362 0
 	str	w1, [x5]
-	.loc 1 356 0
+	.loc 1 366 0
 	lsl	w1, w1, 6
 .LVL18:
 	bl	decode_wf_data
 .LVL19:
 	str	x0, [x19]
-	.loc 1 358 0
+	.loc 1 368 0
 	cmp	x0, 0
 	mov	w0, -22
-	.loc 1 361 0
+	.loc 1 371 0
 	csel	w0, w0, wzr, eq
 	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -234,17 +234,17 @@ parse_wf_gray16.isra.3:
 	.p2align 3
 .L34:
 	.cfi_restore_state
-.LBB237:
-.LBB234:
-.LBB231:
-.LBB230:
+.LBB235:
+.LBB232:
+.LBB229:
+.LBB228:
 	.loc 1 176 0
 	mov	x1, 0
 	b	.L20
 .LVL21:
 .L16:
-.LBE230:
-.LBE231:
+.LBE228:
+.LBE229:
 	.loc 1 213 0
 	add	x4, x0, 340
 .LVL22:
@@ -285,8 +285,8 @@ parse_wf_gray16.isra.3:
 	add	x6, x0, 1108
 .LVL32:
 	b	.L18
-.LBE234:
-.LBE237:
+.LBE232:
+.LBE235:
 	.cfi_endproc
 .LFE1569:
 	.size	parse_wf_gray16.isra.3, .-parse_wf_gray16.isra.3
@@ -325,8 +325,8 @@ rkf_wf_input:
 	.loc 1 132 0
 	cbnz	x1, .L35
 	mov	x21, x0
-.LBB246:
-.LBB247:
+.LBB244:
+.LBB245:
 	.loc 1 93 0
 	adrp	x1, .LC0
 	mov	x2, 12
@@ -337,10 +337,10 @@ rkf_wf_input:
 .LVL35:
 	mov	w19, w0
 	cbnz	w0, .L55
-.LBE247:
-.LBE246:
-.LBB249:
-.LBB250:
+.LBE245:
+.LBE244:
+.LBB247:
+.LBB248:
 	.loc 1 106 0
 	ldr	w22, [x21]
 	cmp	w22, 262144
@@ -348,8 +348,8 @@ rkf_wf_input:
 	add	x20, x23, :lo12:.LANCHOR0
 	.loc 1 109 0
 	ldr	w24, [x21, w22, sxtw]
-.LBB251:
-.LBB252:
+.LBB249:
+.LBB250:
 	.loc 1 83 0
 	add	x20, x20, 8
 	mov	x2, 1024
@@ -357,30 +357,30 @@ rkf_wf_input:
 	mov	x0, x20
 	bl	memset
 .LVL36:
-.LBB253:
-.LBB254:
+.LBB251:
+.LBB252:
 	.loc 1 69 0
 	mov	w5, 3511
 	.loc 1 74 0
 	mov	x7, x20
-.LBE254:
-.LBE253:
+.LBE252:
+.LBE251:
 	.loc 1 83 0
 	mov	x6, 0
-.LBB257:
 .LBB255:
+.LBB253:
 	.loc 1 69 0
 	movk	w5, 0x4c1, lsl 16
 .LVL37:
 	.p2align 2
 .L41:
 	lsl	w1, w6, 22
+.LBE253:
 .LBE255:
-.LBE257:
 	.loc 1 83 0
 	mov	w2, 8
-.LBB258:
 .LBB256:
+.LBB254:
 	.loc 1 66 0
 	mov	w0, 0
 	.p2align 2
@@ -405,8 +405,8 @@ rkf_wf_input:
 	.loc 1 64 0
 	cmp	x6, 1024
 	bne	.L41
+.LBE254:
 .LBE256:
-.LBE258:
 	.loc 1 85 0
 	cbz	w22, .L42
 	.loc 1 86 0
@@ -431,13 +431,13 @@ rkf_wf_input:
 	bhi	.L43
 .LVL42:
 .L42:
-.LBE252:
-.LBE251:
+.LBE250:
+.LBE249:
 	.loc 1 112 0
 	cmp	w24, w2
 	bne	.L56
-.LBE250:
-.LBE249:
+.LBE248:
+.LBE247:
 	.loc 1 147 0
 	adrp	x0, .LC5
 .LVL43:
@@ -471,8 +471,8 @@ rkf_wf_input:
 .LVL48:
 .L56:
 	.cfi_restore_state
-.LBB260:
-.LBB259:
+.LBB258:
+.LBB257:
 	.loc 1 113 0
 	adrp	x0, .LC3
 .LVL49:
@@ -482,8 +482,8 @@ rkf_wf_input:
 	bl	printk
 .LVL51:
 .L45:
-.LBE259:
-.LBE260:
+.LBE257:
+.LBE258:
 	.loc 1 144 0
 	mov	w19, -1
 	.loc 1 143 0
@@ -513,15 +513,15 @@ rkf_wf_input:
 .LVL55:
 .L55:
 	.cfi_restore_state
-.LBB261:
-.LBB248:
+.LBB259:
+.LBB246:
 	.loc 1 96 0
 	adrp	x0, .LC1
 	add	x0, x0, :lo12:.LC1
 	bl	printk
 .LVL56:
-.LBE248:
-.LBE261:
+.LBE246:
+.LBE259:
 	.loc 1 138 0
 	mov	w19, -1
 	.loc 1 137 0
@@ -560,7 +560,7 @@ rkf_wf_get_version:
 	.type	rkf_wf_get_lut, %function
 rkf_wf_get_lut:
 .LFB1565:
-	.loc 1 476 0
+	.loc 1 486 0
 	.cfi_startproc
 .LVL58:
 	stp	x29, x30, [sp, -48]!
@@ -572,19 +572,19 @@ rkf_wf_get_lut:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -16
 	.cfi_offset 22, -8
-	.loc 1 481 0
+	.loc 1 491 0
 	adrp	x22, .LANCHOR0
-	.loc 1 476 0
+	.loc 1 486 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 481 0
+	.loc 1 491 0
 	ldr	x3, [x22, #:lo12:.LANCHOR0]
 .LVL59:
-	cbz	x3, .L109
-	.loc 1 484 0
-	cbz	x0, .L110
-	.loc 1 489 0
+	cbz	x3, .L111
+	.loc 1 494 0
+	cbz	x0, .L112
+	.loc 1 499 0
 	adrp	x21, .LANCHOR1
 	mov	w3, 26215
 	movk	w3, 0x6666, lsl 16
@@ -597,133 +597,133 @@ rkf_wf_get_lut:
 	asr	x3, x3, 33
 	sub	w3, w3, w5, asr 31
 	cmp	w4, w3
-	beq	.L160
+	beq	.L162
 .L62:
 	mov	w20, w1
-	.loc 1 492 0
+	.loc 1 502 0
 	add	x1, x21, :lo12:.LANCHOR1
 .LVL60:
 	mov	x19, x0
-	.loc 1 496 0
+	.loc 1 506 0
 	ldr	x0, [x0, 8]
 .LVL61:
-	.loc 1 492 0
+	.loc 1 502 0
 	str	w2, [x21, #:lo12:.LANCHOR1]
-	.loc 1 493 0
+	.loc 1 503 0
 	str	w20, [x1, 4]
-	.loc 1 496 0
+	.loc 1 506 0
 	cbz	x0, .L63
-	.loc 1 497 0
+	.loc 1 507 0
 	bl	kfree
 .LVL62:
-	.loc 1 498 0
+	.loc 1 508 0
 	str	xzr, [x19, 8]
 .LVL63:
 .L63:
-	.loc 1 501 0
+	.loc 1 511 0
 	cmp	w20, 2
 	beq	.L68
-	.loc 1 504 0
+	.loc 1 514 0
 	cmp	w20, 11
 	beq	.L65
-	.loc 1 508 0
+	.loc 1 518 0
 	cmp	w20, 6
 	beq	.L66
 	bhi	.L67
 	cmp	w20, 3
 	beq	.L68
-	bls	.L161
+	bls	.L163
 	cmp	w20, 4
 	beq	.L71
 	cmp	w20, 5
-	bne	.L158
+	bne	.L93
+.LBB330:
+.LBB331:
 .LBB332:
 .LBB333:
 .LBB334:
 .LBB335:
 .LBB336:
-.LBB337:
-.LBB338:
 	.loc 1 173 0
 	ldr	w20, [x21, #:lo12:.LANCHOR1]
 .LVL64:
-.LBE338:
-.LBB339:
+.LBE336:
+.LBB337:
 	.loc 1 174 0
 	mov	w3, 50
-.LBE339:
 .LBE337:
-.LBE336:
+.LBE335:
+.LBE334:
 	.loc 1 188 0
 	ldr	x1, [x22, #:lo12:.LANCHOR0]
 .LVL65:
-.LBB347:
-.LBB344:
-.LBB340:
+.LBB345:
+.LBB342:
+.LBB338:
 	.loc 1 174 0
 	mov	x0, 0
-.LBE340:
-.LBB341:
+.LBE338:
+.LBB339:
 	.loc 1 173 0
 	cmp	w20, 0
 	csel	w20, w20, wzr, ge
-.LBE341:
-.LBE344:
-.LBE347:
+.LBE339:
+.LBE342:
+.LBE345:
 	.loc 1 205 0
 	add	x4, x1, 212
 .LVL66:
-.LBB348:
-.LBB345:
-.LBB342:
+.LBB346:
+.LBB343:
+.LBB340:
 	.loc 1 174 0
 	cmp	w20, w3
-.LBE342:
-.LBE345:
-.LBE348:
+.LBE340:
+.LBE343:
+.LBE346:
 	.loc 1 206 0
 	add	x2, x1, 852
 .LVL67:
-.LBB349:
-.LBB346:
-.LBB343:
+.LBB347:
+.LBB344:
+.LBB341:
 	.loc 1 174 0
 	csel	w20, w20, w3, le
 .L92:
-.LBE343:
+.LBE341:
 	.loc 1 177 0
 	ldrb	w3, [x4, x0]
 	cmp	w20, w3
-	blt	.L162
+	blt	.L164
 	add	x0, x0, 1
 	.loc 1 176 0
 	cmp	x0, 50
 	bne	.L92
 	mov	x0, 0
 .L91:
-.LBE346:
-.LBE349:
+.LBE344:
+.LBE347:
 	.loc 1 230 0
 	ldr	w2, [x2, x0]
 .LVL68:
-.LBE335:
-.LBE334:
-	.loc 1 399 0
+.LBE333:
+.LBE332:
+	.loc 1 409 0
 	add	x0, x1, x2
-	.loc 1 393 0
+	.loc 1 403 0
 	ldrb	w1, [x1, x2]
 .LVL69:
-	.loc 1 395 0
+	.loc 1 405 0
 	str	w1, [x19]
-	.loc 1 399 0
+	.loc 1 409 0
 	lsl	w1, w1, 6
 	bl	decode_wf_data
 .LVL70:
 	str	x0, [x19, 8]
-	.loc 1 400 0
-	cbz	x0, .L158
-.LBB350:
-.LBB351:
+	.loc 1 410 0
+	cbz	x0, .L93
+.LBB348:
+.LBB349:
 	.loc 1 188 0
 	ldr	x1, [x22, #:lo12:.LANCHOR0]
 .LVL71:
@@ -735,186 +735,195 @@ rkf_wf_get_lut:
 	.loc 1 202 0
 	add	x2, x1, 1876
 .LVL73:
-.L95:
-.LBB352:
-.LBB353:
+.L96:
+.LBB350:
+.LBB351:
 	.loc 1 177 0
 	ldrb	w4, [x3, x0]
 	cmp	w20, w4
-	blt	.L163
+	blt	.L165
 	add	x0, x0, 1
 	.loc 1 176 0
 	cmp	x0, 50
-	bne	.L95
+	bne	.L96
 	mov	x0, 0
-.L94:
-.LBE353:
-.LBE352:
+.L95:
+.LBE351:
+.LBE350:
 	.loc 1 230 0
 	ldr	w3, [x2, x0]
 .LVL74:
-.LBE351:
-.LBE350:
-	.loc 1 408 0
+.LBE349:
+.LBE348:
+	.loc 1 418 0
 	ldr	w2, [x19]
 .LVL75:
-	.loc 1 413 0
+	.loc 1 423 0
 	add	x0, x1, x3
-.LBB354:
-.LBB355:
+.LBB352:
+.LBB353:
 	.loc 1 237 0
 	ldrb	w20, [x1, x3]
-.LBE355:
-.LBE354:
-	.loc 1 408 0
+.LBE353:
+.LBE352:
+	.loc 1 418 0
 	orr	w1, w2, w20, lsl 8
 .LVL76:
 	str	w1, [x19]
-	.loc 1 413 0
+	.loc 1 423 0
 	lsl	w1, w20, 6
 	bl	decode_wf_data
 .LVL77:
-	.loc 1 414 0
-	cbz	x0, .L158
-.LBB356:
-.LBB357:
-	.loc 1 297 0
-	mov	x5, x0
+	mov	x21, x0
+	.loc 1 424 0
+	cbz	x0, .L93
+.LBB354:
+.LBB355:
+	.loc 1 293 0
+	ldrb	w3, [x19]
 .LVL78:
-	mov	w4, 0
+	.loc 1 295 0
+	cmp	w20, w3
+	bhi	.L166
+	.loc 1 303 0
+	mov	x4, x0
 .LVL79:
-	ldr	x3, [x19, 8]
+	mov	w3, 0
 .LVL80:
-	cbz	w20, .L156
-.L132:
-	mov	x1, 0
-.L97:
-	.loc 1 299 0
-	ldr	w2, [x5, x1]
 	.loc 1 301 0
-	ldr	w6, [x3, x1]
-	.loc 1 300 0
-	and	w2, w2, -1073741821
-	.loc 1 302 0
-	and	w6, w6, 1073741820
-	.loc 1 304 0
-	orr	w2, w2, w6
-	str	w2, [x3, x1]
-	add	x1, x1, 4
-	.loc 1 298 0
-	cmp	x1, 64
-	bne	.L97
-	.loc 1 297 0
-	add	w4, w4, 1
-	add	x5, x5, 64
-	add	x3, x3, 64
-	cmp	w4, w20
-	bne	.L132
+	ldr	x2, [x19, 8]
 .LVL81:
-.L156:
-.LBE357:
-.LBE356:
-.LBE333:
-.LBE332:
-.LBB358:
+	.loc 1 303 0
+	cbz	w20, .L159
+.L134:
+	mov	x0, 0
+.L100:
+	.loc 1 306 0
+	ldr	w1, [x4, x0]
+	.loc 1 312 0
+	ldr	w5, [x2, x0]
+	.loc 1 307 0
+	and	w1, w1, -1073741821
+	.loc 1 313 0
+	and	w5, w5, 1073741820
+	.loc 1 315 0
+	orr	w1, w1, w5
+	str	w1, [x2, x0]
+	add	x0, x0, 4
+	.loc 1 304 0
+	cmp	x0, 64
+	bne	.L100
+	.loc 1 303 0
+	add	w3, w3, 1
+	add	x4, x4, 64
+	add	x2, x2, 64
+	cmp	w3, w20
+	bne	.L134
+.LVL82:
+.L159:
+.LBE355:
+.LBE354:
+.LBE331:
+.LBE330:
 .LBB359:
-	.loc 1 338 0
+.LBB360:
+	.loc 1 348 0
+	mov	x0, x21
 	bl	kfree
-.LVL82:
-	ldr	w20, [x19]
 .LVL83:
+	ldr	w20, [x19]
+.LVL84:
 .L86:
+.LBE360:
 .LBE359:
-.LBE358:
-.LBB384:
 .LBB385:
-	.loc 1 449 0
-	and	w20, w20, 255
-.LVL84:
-	.loc 1 451 0
-	mov	w12, 0
-	lsl	w14, w20, 16
-	mov	x13, 0
-	cbz	w20, .L111
-.LVL85:
-.L131:
 .LBB386:
-	.loc 1 452 0
-	ldr	x11, [x19, 8]
+	.loc 1 461 0
+	ands	w12, w20, 255
+.LVL85:
+	beq	.L106
+	lsl	w12, w12, 16
 .LVL86:
-	mov	w9, w12
-	.loc 1 453 0
-	mov	w10, 0
-	.loc 1 452 0
-	add	x11, x11, x13
+	mov	w13, 0
+	mov	x14, 0
 .LVL87:
+.L110:
+.LBB387:
+	.loc 1 462 0
+	ldr	x11, [x19, 8]
+.LVL88:
+	mov	w9, w13
+	.loc 1 463 0
+	mov	w10, 0
+	.loc 1 462 0
+	add	x11, x11, x14
+.LVL89:
 	.p2align 2
-.L104:
+.L107:
 	ubfiz	x8, x10, 2, 4
 	lsr	w7, w10, 4
 	add	x8, x11, x8
 	add	x7, x11, x7, lsl 2
-.LBE386:
-	.loc 1 451 0
+.LBE387:
+	.loc 1 461 0
 	mov	w1, 0
 	.p2align 2
-.L105:
-.LBB389:
-.LBB387:
-	.loc 1 456 0
+.L108:
+.LBB390:
+.LBB388:
+	.loc 1 466 0
 	lsr	w3, w1, 3
 	ldr	w0, [x7]
-	.loc 1 455 0
+	.loc 1 465 0
 	ldr	w2, [x8]
-	.loc 1 456 0
+	.loc 1 466 0
 	and	w3, w3, 30
-	.loc 1 457 0
+	.loc 1 467 0
 	ldr	x4, [x19, 16]
 	add	w5, w9, w1
-	.loc 1 455 0
+	.loc 1 465 0
 	ubfiz	w6, w1, 1, 4
-	.loc 1 456 0
+	.loc 1 466 0
 	lsr	w0, w0, w3
-	.loc 1 457 0
+	.loc 1 467 0
 	ubfiz	w0, w0, 2, 2
-.LBE387:
-	.loc 1 454 0
+.LBE388:
+	.loc 1 464 0
 	add	w1, w1, 1
-.LBB388:
-	.loc 1 455 0
+.LBB389:
+	.loc 1 465 0
 	lsr	w2, w2, w6
 	and	w2, w2, 3
-	.loc 1 457 0
+	.loc 1 467 0
 	orr	w0, w0, w2
 	strb	w0, [x4, w5, uxtw]
-.LBE388:
-	.loc 1 454 0
+.LBE389:
+	.loc 1 464 0
 	cmp	w1, 256
-	bne	.L105
-	.loc 1 453 0
+	bne	.L108
+	.loc 1 463 0
 	add	w10, w10, 1
 	add	w9, w9, 256
 	cmp	w10, 256
-	bne	.L104
-	add	w12, w12, 65536
-	add	x13, x13, 64
-.LBE389:
-	.loc 1 451 0
-	cmp	w14, w12
-	bne	.L131
-.LVL88:
-.L111:
+	bne	.L107
+	add	w13, w13, 65536
+	add	x14, x14, 64
+.LBE390:
+	.loc 1 461 0
+	cmp	w12, w13
+	bne	.L110
+.LVL90:
+.L106:
+.LBE386:
 .LBE385:
-.LBE384:
-	.loc 1 490 0
+	.loc 1 500 0
 	mov	w0, 0
-.LVL89:
 .L60:
-	.loc 1 570 0
+	.loc 1 580 0
 	ldp	x19, x20, [sp, 16]
-.LVL90:
-	ldp	x21, x22, [sp, 32]
 .LVL91:
+	ldp	x21, x22, [sp, 32]
+.LVL92:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 30
@@ -925,254 +934,282 @@ rkf_wf_get_lut:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL92:
-.L160:
+.LVL93:
+.L162:
 	.cfi_restore_state
-	.loc 1 489 0 discriminator 1
+	.loc 1 499 0 discriminator 1
 	ldr	w3, [x6, 4]
 	cmp	w3, w1
 	bne	.L62
-	b	.L111
-.LVL93:
-.L163:
-	lsl	x0, x0, 2
-	b	.L94
+	b	.L106
 .LVL94:
-.L162:
+.L165:
 	lsl	x0, x0, 2
-	b	.L91
+	b	.L95
 .LVL95:
-.L79:
-.LBB390:
-.LBB382:
-	.loc 1 332 0
-	str	xzr, [x19, 8]
-	.loc 1 334 0
-	mov	x0, x21
-	bl	kfree
+.L166:
+.LBB391:
+.LBB358:
+.LBB357:
+.LBB356:
+	.loc 1 296 0
+	adrp	x1, .LANCHOR2
+	adrp	x0, .LC6
+	mov	w2, w20
+	add	x1, x1, :lo12:.LANCHOR2
+	add	x0, x0, :lo12:.LC6
+	bl	printk
 .LVL96:
-.L158:
-.LBE382:
-.LBE390:
-	.loc 1 512 0
+	b	.L159
+.LVL97:
+.L164:
+	lsl	x0, x0, 2
+	b	.L91
+.LVL98:
+.L67:
+.LBE356:
+.LBE357:
+.LBE358:
+.LBE391:
+	.loc 1 518 0
+	cmp	w20, 8
+	beq	.L73
+	bcc	.L68
+	cmp	w20, 9
+	beq	.L65
+	cmp	w20, 10
+	bne	.L93
+	.loc 1 544 0
+	ldr	w2, [x21, #:lo12:.LANCHOR1]
+.LVL99:
+	mov	w3, 5
+	add	x1, x19, 8
+	mov	x0, x19
+	bl	parse_wf_gray16.isra.3
+.LVL100:
+	.loc 1 545 0
+	cbz	w0, .L160
+.LVL101:
+.L93:
+	.loc 1 564 0
 	mov	w0, -1
 	b	.L60
-.LVL97:
+.LVL102:
 .L71:
-.LBB391:
 .LBB392:
 .LBB393:
 .LBB394:
 .LBB395:
 .LBB396:
 .LBB397:
+.LBB398:
 	.loc 1 173 0
 	ldr	w1, [x21, #:lo12:.LANCHOR1]
-.LBE397:
-.LBB398:
+.LBE398:
+.LBB399:
 	.loc 1 174 0
 	mov	w4, 50
-.LBE398:
+.LBE399:
+.LBE397:
 .LBE396:
-.LBE395:
 	.loc 1 188 0
 	ldr	x2, [x22, #:lo12:.LANCHOR0]
-.LVL98:
-.LBB406:
-.LBB403:
-.LBB399:
+.LVL103:
+.LBB407:
+.LBB404:
+.LBB400:
 	.loc 1 174 0
 	mov	x0, 0
-.LBE399:
-.LBB400:
+.LBE400:
+.LBB401:
 	.loc 1 173 0
 	cmp	w1, 0
 	csel	w1, w1, wzr, ge
-.LBE400:
-.LBE403:
-.LBE406:
-	.loc 1 201 0
-	add	x5, x2, 468
-.LVL99:
-.LBB407:
-.LBB404:
-.LBB401:
-	.loc 1 174 0
-	cmp	w1, w4
 .LBE401:
 .LBE404:
 .LBE407:
-	.loc 1 202 0
-	add	x3, x2, 1876
-.LVL100:
+	.loc 1 201 0
+	add	x5, x2, 468
+.LVL104:
 .LBB408:
 .LBB405:
 .LBB402:
+	.loc 1 174 0
+	cmp	w1, w4
+.LBE402:
+.LBE405:
+.LBE408:
+	.loc 1 202 0
+	add	x3, x2, 1876
+.LVL105:
+.LBB409:
+.LBB406:
+.LBB403:
 	.loc 1 174 0
 	csel	w1, w1, w4, le
 .L89:
-.LBE402:
+.LBE403:
 	.loc 1 177 0
 	ldrb	w4, [x5, x0]
 	cmp	w1, w4
-	blt	.L164
+	blt	.L167
 	add	x0, x0, 1
 	.loc 1 176 0
 	cmp	x0, 50
 	bne	.L89
 	mov	x0, 0
 .L88:
-.LBE405:
-.LBE408:
+.LBE406:
+.LBE409:
 	.loc 1 230 0
 	ldr	w1, [x3, x0]
+.LBE395:
 .LBE394:
-.LBE393:
-	.loc 1 375 0
+	.loc 1 385 0
 	add	x0, x2, x1
-	.loc 1 371 0
+	.loc 1 381 0
 	ldrb	w20, [x2, x1]
-.LVL101:
-	.loc 1 375 0
+.LVL106:
+	.loc 1 385 0
 	lsl	w1, w20, 6
 	bl	decode_wf_data
-.LVL102:
+.LVL107:
 	str	x0, [x19, 8]
-	.loc 1 376 0
-	cbz	x0, .L158
-	.loc 1 379 0
+	.loc 1 386 0
+	cbz	x0, .L93
+	.loc 1 389 0
 	str	w20, [x19]
 	b	.L86
-.LVL103:
-.L161:
+.LVL108:
+.L163:
+.LBE393:
 .LBE392:
-.LBE391:
-	.loc 1 508 0
+	.loc 1 518 0
 	cmp	w20, 1
-	bne	.L158
-.LBB409:
+	bne	.L93
+.LBB410:
 .LBB383:
-.LBB360:
 .LBB361:
 .LBB362:
 .LBB363:
 .LBB364:
+.LBB365:
 	.loc 1 173 0
 	ldr	w1, [x21, #:lo12:.LANCHOR1]
-.LBE364:
-.LBB365:
+.LBE365:
+.LBB366:
 	.loc 1 174 0
 	mov	w4, 50
-.LBE365:
+.LBE366:
+.LBE364:
 .LBE363:
-.LBE362:
 	.loc 1 188 0
 	ldr	x2, [x22, #:lo12:.LANCHOR0]
-.LVL104:
-.LBB373:
-.LBB370:
-.LBB366:
+.LVL109:
+.LBB374:
+.LBB371:
+.LBB367:
 	.loc 1 174 0
 	mov	x0, 0
-.LBE366:
-.LBB367:
+.LBE367:
+.LBB368:
 	.loc 1 173 0
 	cmp	w1, 0
 	csel	w1, w1, wzr, ge
-.LBE367:
-.LBE370:
-.LBE373:
-	.loc 1 197 0
-	add	x5, x2, 148
-.LVL105:
-.LBB374:
-.LBB371:
-.LBB368:
-	.loc 1 174 0
-	cmp	w1, w4
 .LBE368:
 .LBE371:
 .LBE374:
-	.loc 1 198 0
-	add	x3, x2, 596
-.LVL106:
+	.loc 1 197 0
+	add	x5, x2, 148
+.LVL110:
 .LBB375:
 .LBB372:
 .LBB369:
+	.loc 1 174 0
+	cmp	w1, w4
+.LBE369:
+.LBE372:
+.LBE375:
+	.loc 1 198 0
+	add	x3, x2, 596
+.LVL111:
+.LBB376:
+.LBB373:
+.LBB370:
 	.loc 1 174 0
 	csel	w1, w1, w4, le
 .L77:
-.LBE369:
+.LBE370:
 	.loc 1 177 0
 	ldrb	w4, [x5, x0]
 	cmp	w1, w4
-	blt	.L165
+	blt	.L168
 	add	x0, x0, 1
 	.loc 1 176 0
 	cmp	x0, 50
 	bne	.L77
 	mov	x0, 0
 .L76:
-.LBE372:
-.LBE375:
+.LBE373:
+.LBE376:
 	.loc 1 230 0
 	ldr	w1, [x3, x0]
+.LBE362:
 .LBE361:
-.LBE360:
-	.loc 1 324 0
+	.loc 1 334 0
 	add	x0, x2, x1
-	.loc 1 320 0
+	.loc 1 330 0
 	ldrb	w22, [x2, x1]
-.LVL107:
-	.loc 1 323 0
+.LVL112:
+	.loc 1 333 0
 	add	w20, w22, 15
-.LVL108:
+.LVL113:
 	lsr	w20, w20, 4
-	.loc 1 324 0
+	.loc 1 334 0
 	lsl	w1, w20, 2
 	bl	decode_wf_data
-.LVL109:
+.LVL114:
 	mov	x21, x0
-	.loc 1 325 0
-	cbz	x0, .L158
-	.loc 1 329 0
+	.loc 1 335 0
+	cbz	x0, .L93
+	.loc 1 339 0
 	str	w22, [x19]
-.LBB376:
 .LBB377:
+.LBB378:
 	.loc 1 265 0
 	lsl	w0, w20, 10
-.LBB378:
 .LBB379:
 .LBB380:
+.LBB381:
 	.loc 2 553 0
 	mov	w1, 32960
 	sxtw	x0, w0
 	movk	w1, 0x60, lsl 16
 	bl	__kmalloc
-.LVL110:
+.LVL115:
+.LBE381:
 .LBE380:
 .LBE379:
-.LBE378:
 	.loc 1 266 0
 	cbz	x0, .L79
 	.loc 1 269 0
 	cbz	w20, .L80
 	mov	x4, 0
-.LVL111:
+.LVL116:
 .L84:
 	.loc 1 270 0
 	ldr	w8, [x21, x4, lsl 2]
-.LVL112:
+.LVL117:
 	lsl	w1, w4, 8
 	mov	w6, 0
-.LVL113:
+.LVL118:
 .L83:
-.LBB381:
+.LBB382:
 	.loc 1 272 0
 	asr	w5, w8, w6
-.LVL114:
+.LVL119:
 	and	w5, w5, 3
-.LVL115:
+.LVL120:
 	.loc 1 273 0
 	mov	w3, w5
 	.loc 1 272 0
@@ -1194,7 +1231,7 @@ rkf_wf_get_lut:
 	cmp	w1, w2
 	bne	.L82
 	add	w6, w6, 2
-.LBE381:
+.LBE382:
 	.loc 1 271 0
 	cmp	w6, 32
 	bne	.L83
@@ -1203,204 +1240,203 @@ rkf_wf_get_lut:
 	cmp	w20, w4
 	bgt	.L84
 .L80:
+.LBE378:
 .LBE377:
-.LBE376:
-	.loc 1 332 0
+	.loc 1 342 0
 	str	x0, [x19, 8]
-	.loc 1 338 0
-	mov	x0, x21
-	b	.L156
-.LVL116:
-.L164:
+	b	.L159
+.LVL121:
+.L167:
 	lsl	x0, x0, 2
 	b	.L88
-.LVL117:
+.LVL122:
 .L65:
 .LBE383:
-.LBE409:
-	.loc 1 528 0
+.LBE410:
+	.loc 1 538 0
 	ldr	w2, [x21, #:lo12:.LANCHOR1]
-.LVL118:
+.LVL123:
 	mov	w3, 4
 	add	x1, x19, 8
 	mov	x0, x19
 	bl	parse_wf_gray16.isra.3
-.LVL119:
-	.loc 1 529 0
-	cbnz	w0, .L158
-.L157:
+.LVL124:
+	.loc 1 539 0
+	cbnz	w0, .L93
+.L160:
 	ldr	w20, [x19]
-.LVL120:
+.LVL125:
 	b	.L86
-.LVL121:
+.LVL126:
 .L68:
-	.loc 1 540 0
+	.loc 1 550 0
 	ldr	w2, [x21, #:lo12:.LANCHOR1]
-.LVL122:
+.LVL127:
 	mov	w3, 2
 	add	x1, x19, 8
 	mov	x0, x19
 	bl	parse_wf_gray16.isra.3
-.LVL123:
-	.loc 1 541 0
-	cbz	w0, .L157
-	b	.L158
-.LVL124:
-.L110:
-	.loc 1 485 0
-	mov	w0, -22
-.LVL125:
-	b	.L60
-.LVL126:
-.L109:
-	.loc 1 482 0
-	mov	w0, -19
-.LVL127:
-	b	.L60
 .LVL128:
-.L67:
-	.loc 1 508 0
-	cmp	w20, 8
-	beq	.L73
-	bcc	.L68
-	cmp	w20, 9
-	beq	.L65
-	cmp	w20, 10
-	bne	.L158
-	.loc 1 534 0
-	ldr	w2, [x21, #:lo12:.LANCHOR1]
+	.loc 1 551 0
+	cbz	w0, .L160
+	b	.L93
 .LVL129:
-	mov	w3, 5
-	add	x1, x19, 8
-	mov	x0, x19
-	bl	parse_wf_gray16.isra.3
+.L112:
+	.loc 1 495 0
+	mov	w0, -22
 .LVL130:
-	.loc 1 535 0
-	cbz	w0, .L157
-	b	.L158
+	b	.L60
 .LVL131:
+.L111:
+	.loc 1 492 0
+	mov	w0, -19
+.LVL132:
+	b	.L60
+.LVL133:
 .L66:
-.LBB410:
 .LBB411:
 .LBB412:
 .LBB413:
 .LBB414:
 .LBB415:
 .LBB416:
+.LBB417:
 	.loc 1 173 0
 	ldr	w1, [x21, #:lo12:.LANCHOR1]
-.LBE416:
-.LBB417:
+.LBE417:
+.LBB418:
 	.loc 1 174 0
 	mov	w4, 50
-.LBE417:
+.LBE418:
+.LBE416:
 .LBE415:
-.LBE414:
 	.loc 1 188 0
 	ldr	x2, [x22, #:lo12:.LANCHOR0]
-.LVL132:
-.LBB425:
-.LBB422:
-.LBB418:
+.LVL134:
+.LBB426:
+.LBB423:
+.LBB419:
 	.loc 1 174 0
 	mov	x0, 0
-.LBE418:
-.LBB419:
+.LBE419:
+.LBB420:
 	.loc 1 173 0
 	cmp	w1, 0
 	csel	w1, w1, wzr, ge
-.LBE419:
-.LBE422:
-.LBE425:
-	.loc 1 221 0
-	add	x5, x2, 532
-.LVL133:
-.LBB426:
-.LBB423:
-.LBB420:
-	.loc 1 174 0
-	cmp	w1, w4
 .LBE420:
 .LBE423:
 .LBE426:
-	.loc 1 222 0
-	add	x3, x2, 2132
-.LVL134:
+	.loc 1 221 0
+	add	x5, x2, 532
+.LVL135:
 .LBB427:
 .LBB424:
 .LBB421:
 	.loc 1 174 0
-	csel	w1, w1, w4, le
-.L102:
+	cmp	w1, w4
 .LBE421:
+.LBE424:
+.LBE427:
+	.loc 1 222 0
+	add	x3, x2, 2132
+.LVL136:
+.LBB428:
+.LBB425:
+.LBB422:
+	.loc 1 174 0
+	csel	w1, w1, w4, le
+.L105:
+.LBE422:
 	.loc 1 177 0
 	ldrb	w4, [x5, x0]
 	cmp	w1, w4
-	blt	.L166
+	blt	.L169
 	add	x0, x0, 1
 	.loc 1 176 0
 	cmp	x0, 50
-	bne	.L102
+	bne	.L105
 	mov	x0, 0
-.L101:
-.LBE424:
-.LBE427:
+.L104:
+.LBE425:
+.LBE428:
 	.loc 1 230 0
 	ldr	w1, [x3, x0]
+.LBE414:
 .LBE413:
-.LBE412:
-	.loc 1 438 0
+	.loc 1 448 0
 	add	x0, x2, x1
-	.loc 1 432 0
+	.loc 1 442 0
 	ldrb	w1, [x2, x1]
-.LVL135:
-	.loc 1 434 0
+.LVL137:
+	.loc 1 444 0
 	str	w1, [x19]
-	.loc 1 438 0
+	.loc 1 448 0
 	lsl	w1, w1, 6
-.LVL136:
+.LVL138:
 	bl	decode_wf_data
-.LVL137:
+.LVL139:
 	str	x0, [x19, 8]
-	.loc 1 439 0
-	cbnz	x0, .L157
-	b	.L158
-.LVL138:
+	.loc 1 449 0
+	cbnz	x0, .L160
+	b	.L93
+.LVL140:
 .L73:
+.LBE412:
 .LBE411:
-.LBE410:
-	.loc 1 522 0
+	.loc 1 532 0
 	ldr	w2, [x21, #:lo12:.LANCHOR1]
-.LVL139:
+.LVL141:
 	mov	w3, 3
 	add	x1, x19, 8
 	mov	x0, x19
 	bl	parse_wf_gray16.isra.3
-.LVL140:
-	.loc 1 523 0
-	cbz	w0, .L157
-	b	.L158
-.LVL141:
-.L166:
-	lsl	x0, x0, 2
-	b	.L101
 .LVL142:
-.L165:
+	.loc 1 533 0
+	cbz	w0, .L160
+	b	.L93
+.LVL143:
+.L169:
+	lsl	x0, x0, 2
+	b	.L104
+.LVL144:
+.L79:
+.LBB429:
+.LBB384:
+	.loc 1 342 0
+	str	xzr, [x19, 8]
+	.loc 1 344 0
+	mov	x0, x21
+	bl	kfree
+.LVL145:
+.LBE384:
+.LBE429:
+	.loc 1 522 0
+	mov	w0, -1
+	b	.L60
+.LVL146:
+.L168:
 	lsl	x0, x0, 2
 	b	.L76
 	.cfi_endproc
 .LFE1565:
 	.size	rkf_wf_get_lut, .-rkf_wf_get_lut
+	.section	.rodata
+	.align	3
+	.set	.LANCHOR2,. + 0
+	.type	__func__.16923, %object
+	.size	__func__.16923, 15
+__func__.16923:
+	.string	"decode_wf_auto"
 	.data
 	.align	2
 	.set	.LANCHOR1,. + 0
-	.type	sftemp.16992, %object
-	.size	sftemp.16992, 4
-sftemp.16992:
+	.type	sftemp.16994, %object
+	.size	sftemp.16994, 4
+sftemp.16994:
 	.word	-1
-	.type	stype.16991, %object
-	.size	stype.16991, 4
-stype.16991:
+	.type	stype.16993, %object
+	.size	stype.16993, 4
+stype.16993:
 	.word	12
 	.bss
 	.align	3
@@ -1432,6 +1468,9 @@ crc32_table:
 	.zero	1
 .LC5:
 	.string	"rkf file version: %s\n"
+	.zero	2
+.LC6:
+	.string	"%s: frame_num err, du frame = %d, gc16 frame = %d\n"
 	.text
 .Letext0:
 	.file 3 "./include/uapi/asm-generic/int-ll64.h"
@@ -1534,15 +1573,15 @@ crc32_table:
 	.file 100 "./arch/arm64/include/asm/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x7368
+	.4byte	0x7396
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF1535
-	.byte	0x1
 	.4byte	.LASF1536
+	.byte	0x1
 	.4byte	.LASF1537
+	.4byte	.LASF1538
 	.8byte	.Ltext0
 	.8byte	.Letext0-.Ltext0
 	.4byte	.Ldebug_line0
@@ -9992,7 +10031,7 @@ crc32_table:
 	.2byte	0x510
 	.4byte	0x45f3
 	.uleb128 0x40
-	.4byte	.LASF1538
+	.4byte	.LASF1539
 	.byte	0x22
 	.2byte	0x510
 	.4byte	0x6c
@@ -13417,9 +13456,9 @@ crc32_table:
 	.byte	0x3
 	.8byte	crc32_table
 	.uleb128 0x46
-	.4byte	.LASF1502
+	.4byte	.LASF1503
 	.byte	0x1
-	.2byte	0x1db
+	.2byte	0x1e5
 	.4byte	0xc0
 	.8byte	.LFB1565
 	.8byte	.LFE1565-.LFB1565
@@ -13429,62 +13468,61 @@ crc32_table:
 	.uleb128 0x47
 	.4byte	.LASF1466
 	.byte	0x1
-	.2byte	0x1db
+	.2byte	0x1e5
 	.4byte	0x69b6
 	.4byte	.LLST13
 	.uleb128 0x47
 	.4byte	.LASF1467
 	.byte	0x1
-	.2byte	0x1db
+	.2byte	0x1e5
 	.4byte	0x5fb2
 	.4byte	.LLST14
 	.uleb128 0x47
 	.4byte	.LASF1468
 	.byte	0x1
-	.2byte	0x1db
+	.2byte	0x1e5
 	.4byte	0xc0
 	.4byte	.LLST15
 	.uleb128 0x47
 	.4byte	.LASF1469
 	.byte	0x1
-	.2byte	0x1db
+	.2byte	0x1e5
 	.4byte	0xc0
 	.4byte	.LLST16
 	.uleb128 0x48
 	.4byte	.LASF1470
 	.byte	0x1
-	.2byte	0x1dd
+	.2byte	0x1e7
 	.4byte	0x5fb2
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	stype.16991
+	.8byte	stype.16993
 	.uleb128 0x48
 	.4byte	.LASF1471
 	.byte	0x1
-	.2byte	0x1de
+	.2byte	0x1e8
 	.4byte	0xc0
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	sftemp.16992
+	.8byte	sftemp.16994
 	.uleb128 0x49
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x1df
+	.2byte	0x1e9
 	.4byte	0xc0
 	.uleb128 0x4a
 	.4byte	0x6a84
-	.8byte	.LBB332
-	.8byte	.LBE332-.LBB332
+	.8byte	.LBB330
+	.4byte	.Ldebug_ranges0+0x1c0
 	.byte	0x1
-	.2byte	0x228
+	.2byte	0x232
 	.4byte	0x64d4
 	.uleb128 0x4b
 	.4byte	0x6aa1
 	.uleb128 0x4b
 	.4byte	0x6a95
 	.uleb128 0x4c
-	.8byte	.LBB333
-	.8byte	.LBE333-.LBB333
+	.4byte	.Ldebug_ranges0+0x1c0
 	.uleb128 0x4d
 	.4byte	0x6aad
 	.uleb128 0x4d
@@ -13493,136 +13531,136 @@ crc32_table:
 	.4byte	0x6ac5
 	.uleb128 0x4d
 	.4byte	0x6ad1
-	.uleb128 0x4a
-	.4byte	0x6dae
-	.8byte	.LBB334
-	.8byte	.LBE334-.LBB334
+	.uleb128 0x4e
+	.4byte	0x6ddc
+	.8byte	.LBB332
+	.8byte	.LBE332-.LBB332
 	.byte	0x1
-	.2byte	0x188
-	.4byte	0x638d
+	.2byte	0x192
+	.4byte	0x637d
 	.uleb128 0x4b
-	.4byte	0x6dc9
+	.4byte	0x6df7
 	.uleb128 0x4b
-	.4byte	0x6dbe
-	.uleb128 0x4c
-	.8byte	.LBB335
-	.8byte	.LBE335-.LBB335
-	.uleb128 0x4e
-	.4byte	0x6dd4
+	.4byte	0x6dec
+	.uleb128 0x4f
+	.8byte	.LBB333
+	.8byte	.LBE333-.LBB333
+	.uleb128 0x50
+	.4byte	0x6e02
 	.4byte	.LLST17
-	.uleb128 0x4e
-	.4byte	0x6ddf
+	.uleb128 0x50
+	.4byte	0x6e0d
 	.4byte	.LLST18
-	.uleb128 0x4e
-	.4byte	0x6dea
+	.uleb128 0x50
+	.4byte	0x6e18
 	.4byte	.LLST19
 	.uleb128 0x4d
-	.4byte	0x6df5
+	.4byte	0x6e23
 	.uleb128 0x4d
-	.4byte	0x6e00
+	.4byte	0x6e2e
 	.uleb128 0x4d
-	.4byte	0x6e0a
-	.uleb128 0x4f
-	.4byte	0x6e16
-	.8byte	.LBB336
-	.4byte	.Ldebug_ranges0+0x1c0
+	.4byte	0x6e38
+	.uleb128 0x51
+	.4byte	0x6e44
+	.8byte	.LBB334
+	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
 	.byte	0xe4
 	.uleb128 0x4b
-	.4byte	0x6e31
+	.4byte	0x6e5f
 	.uleb128 0x4b
-	.4byte	0x6e26
-	.uleb128 0x50
-	.4byte	.Ldebug_ranges0+0x1c0
+	.4byte	0x6e54
+	.uleb128 0x4c
+	.4byte	.Ldebug_ranges0+0x1f0
 	.uleb128 0x4d
-	.4byte	0x6e3c
+	.4byte	0x6e6a
 	.uleb128 0x4d
-	.4byte	0x6e47
-	.uleb128 0x51
-	.4byte	.Ldebug_ranges0+0x210
-	.4byte	0x6379
+	.4byte	0x6e75
+	.uleb128 0x52
+	.4byte	.Ldebug_ranges0+0x240
+	.4byte	0x6369
 	.uleb128 0x4d
-	.4byte	0x6e55
+	.4byte	0x6e83
 	.uleb128 0x4d
-	.4byte	0x6e60
+	.4byte	0x6e8e
 	.byte	0
-	.uleb128 0x50
-	.4byte	.Ldebug_ranges0+0x240
+	.uleb128 0x4c
+	.4byte	.Ldebug_ranges0+0x270
 	.uleb128 0x4d
-	.4byte	0x6e6d
+	.4byte	0x6e9b
 	.uleb128 0x4d
-	.4byte	0x6e78
+	.4byte	0x6ea6
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x4a
-	.4byte	0x6dae
-	.8byte	.LBB350
-	.8byte	.LBE350-.LBB350
+	.uleb128 0x4e
+	.4byte	0x6ddc
+	.8byte	.LBB348
+	.8byte	.LBE348-.LBB348
 	.byte	0x1
-	.2byte	0x195
-	.4byte	0x642e
+	.2byte	0x19f
+	.4byte	0x641e
 	.uleb128 0x4b
-	.4byte	0x6dc9
+	.4byte	0x6df7
 	.uleb128 0x4b
-	.4byte	0x6dbe
-	.uleb128 0x4c
-	.8byte	.LBB351
-	.8byte	.LBE351-.LBB351
-	.uleb128 0x4e
-	.4byte	0x6dd4
+	.4byte	0x6dec
+	.uleb128 0x4f
+	.8byte	.LBB349
+	.8byte	.LBE349-.LBB349
+	.uleb128 0x50
+	.4byte	0x6e02
 	.4byte	.LLST20
-	.uleb128 0x4e
-	.4byte	0x6ddf
+	.uleb128 0x50
+	.4byte	0x6e0d
 	.4byte	.LLST21
-	.uleb128 0x4e
-	.4byte	0x6dea
+	.uleb128 0x50
+	.4byte	0x6e18
 	.4byte	.LLST22
 	.uleb128 0x4d
-	.4byte	0x6df5
+	.4byte	0x6e23
 	.uleb128 0x4d
-	.4byte	0x6e00
+	.4byte	0x6e2e
 	.uleb128 0x4d
-	.4byte	0x6e0a
-	.uleb128 0x52
-	.4byte	0x6e16
-	.8byte	.LBB352
-	.8byte	.LBE352-.LBB352
+	.4byte	0x6e38
+	.uleb128 0x53
+	.4byte	0x6e44
+	.8byte	.LBB350
+	.8byte	.LBE350-.LBB350
 	.byte	0x1
 	.byte	0xe4
 	.uleb128 0x4b
-	.4byte	0x6e31
+	.4byte	0x6e5f
 	.uleb128 0x4b
-	.4byte	0x6e26
-	.uleb128 0x4c
-	.8byte	.LBB353
-	.8byte	.LBE353-.LBB353
+	.4byte	0x6e54
+	.uleb128 0x4f
+	.8byte	.LBB351
+	.8byte	.LBE351-.LBB351
 	.uleb128 0x4d
-	.4byte	0x6e3c
+	.4byte	0x6e6a
 	.uleb128 0x4d
-	.4byte	0x6e47
+	.4byte	0x6e75
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x4a
-	.4byte	0x6d92
-	.8byte	.LBB354
-	.8byte	.LBE354-.LBB354
+	.uleb128 0x4e
+	.4byte	0x6dc0
+	.8byte	.LBB352
+	.8byte	.LBE352-.LBB352
 	.byte	0x1
-	.2byte	0x196
-	.4byte	0x6450
+	.2byte	0x1a0
+	.4byte	0x6440
 	.uleb128 0x4b
-	.4byte	0x6da2
+	.4byte	0x6dd0
 	.byte	0
 	.uleb128 0x4a
 	.4byte	0x6be0
-	.8byte	.LBB356
-	.8byte	.LBE356-.LBB356
+	.8byte	.LBB354
+	.4byte	.Ldebug_ranges0+0x2c0
 	.byte	0x1
-	.2byte	0x1a2
+	.2byte	0x1ac
 	.4byte	0x64b8
 	.uleb128 0x4b
 	.4byte	0x6bed
@@ -13630,40 +13668,49 @@ crc32_table:
 	.4byte	0x6bed
 	.uleb128 0x4b
 	.4byte	0x6bf9
+	.uleb128 0x4b
+	.4byte	0x6bf9
 	.uleb128 0x4c
-	.8byte	.LBB357
-	.8byte	.LBE357-.LBB357
+	.4byte	.Ldebug_ranges0+0x2c0
 	.uleb128 0x4d
 	.4byte	0x6c05
-	.uleb128 0x4e
+	.uleb128 0x50
 	.4byte	0x6c11
 	.4byte	.LLST23
-	.uleb128 0x4e
+	.uleb128 0x50
 	.4byte	0x6c1d
 	.4byte	.LLST24
 	.uleb128 0x4d
 	.4byte	0x6c29
 	.uleb128 0x4d
 	.4byte	0x6c35
-	.uleb128 0x4e
+	.uleb128 0x50
 	.4byte	0x6c41
 	.4byte	.LLST25
+	.uleb128 0x50
+	.4byte	0x6c4b
+	.4byte	.LLST26
+	.uleb128 0x4d
+	.4byte	0x6c57
+	.uleb128 0x54
+	.8byte	.LVL96
+	.4byte	0x735a
 	.byte	0
 	.byte	0
-	.uleb128 0x53
+	.uleb128 0x54
 	.8byte	.LVL70
-	.4byte	0x6ce6
-	.uleb128 0x53
+	.4byte	0x6d14
+	.uleb128 0x54
 	.8byte	.LVL77
-	.4byte	0x6ce6
+	.4byte	0x6d14
 	.byte	0
 	.byte	0
-	.uleb128 0x54
+	.uleb128 0x4a
 	.4byte	0x6b86
-	.8byte	.LBB358
-	.4byte	.Ldebug_ranges0+0x290
+	.8byte	.LBB359
+	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x1
-	.2byte	0x1fe
+	.2byte	0x208
 	.4byte	0x66db
 	.uleb128 0x4b
 	.4byte	0x6b97
@@ -13671,193 +13718,193 @@ crc32_table:
 	.4byte	0x6b97
 	.uleb128 0x4b
 	.4byte	0x6ba3
-	.uleb128 0x50
-	.4byte	.Ldebug_ranges0+0x290
+	.uleb128 0x4c
+	.4byte	.Ldebug_ranges0+0x2f0
 	.uleb128 0x4d
 	.4byte	0x6baf
 	.uleb128 0x4d
 	.4byte	0x6bbb
-	.uleb128 0x4e
+	.uleb128 0x50
 	.4byte	0x6bc7
-	.4byte	.LLST26
+	.4byte	.LLST27
 	.uleb128 0x4d
 	.4byte	0x6bd3
-	.uleb128 0x4a
-	.4byte	0x6dae
-	.8byte	.LBB360
-	.8byte	.LBE360-.LBB360
+	.uleb128 0x4e
+	.4byte	0x6ddc
+	.8byte	.LBB361
+	.8byte	.LBE361-.LBB361
 	.byte	0x1
-	.2byte	0x13f
+	.2byte	0x149
 	.4byte	0x65cd
 	.uleb128 0x4b
-	.4byte	0x6dc9
+	.4byte	0x6df7
 	.uleb128 0x4b
-	.4byte	0x6dbe
-	.uleb128 0x4c
-	.8byte	.LBB361
-	.8byte	.LBE361-.LBB361
-	.uleb128 0x4e
-	.4byte	0x6dd4
-	.4byte	.LLST27
-	.uleb128 0x4e
-	.4byte	0x6ddf
+	.4byte	0x6dec
+	.uleb128 0x4f
+	.8byte	.LBB362
+	.8byte	.LBE362-.LBB362
+	.uleb128 0x50
+	.4byte	0x6e02
 	.4byte	.LLST28
-	.uleb128 0x4e
-	.4byte	0x6dea
+	.uleb128 0x50
+	.4byte	0x6e0d
 	.4byte	.LLST29
+	.uleb128 0x50
+	.4byte	0x6e18
+	.4byte	.LLST30
 	.uleb128 0x4d
-	.4byte	0x6df5
+	.4byte	0x6e23
 	.uleb128 0x4d
-	.4byte	0x6e00
+	.4byte	0x6e2e
 	.uleb128 0x4d
-	.4byte	0x6e0a
-	.uleb128 0x4f
-	.4byte	0x6e16
-	.8byte	.LBB362
-	.4byte	.Ldebug_ranges0+0x2d0
+	.4byte	0x6e38
+	.uleb128 0x51
+	.4byte	0x6e44
+	.8byte	.LBB363
+	.4byte	.Ldebug_ranges0+0x330
 	.byte	0x1
 	.byte	0xe4
 	.uleb128 0x4b
-	.4byte	0x6e31
+	.4byte	0x6e5f
 	.uleb128 0x4b
-	.4byte	0x6e26
-	.uleb128 0x50
-	.4byte	.Ldebug_ranges0+0x2d0
+	.4byte	0x6e54
+	.uleb128 0x4c
+	.4byte	.Ldebug_ranges0+0x330
 	.uleb128 0x4d
-	.4byte	0x6e3c
+	.4byte	0x6e6a
 	.uleb128 0x4d
-	.4byte	0x6e47
-	.uleb128 0x51
-	.4byte	.Ldebug_ranges0+0x320
+	.4byte	0x6e75
+	.uleb128 0x52
+	.4byte	.Ldebug_ranges0+0x380
 	.4byte	0x65b9
 	.uleb128 0x4d
-	.4byte	0x6e55
+	.4byte	0x6e83
 	.uleb128 0x4d
-	.4byte	0x6e60
+	.4byte	0x6e8e
 	.byte	0
-	.uleb128 0x50
-	.4byte	.Ldebug_ranges0+0x350
+	.uleb128 0x4c
+	.4byte	.Ldebug_ranges0+0x3b0
 	.uleb128 0x4d
-	.4byte	0x6e6d
+	.4byte	0x6e9b
 	.uleb128 0x4d
-	.4byte	0x6e78
+	.4byte	0x6ea6
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x4a
-	.4byte	0x6c4c
-	.8byte	.LBB376
-	.8byte	.LBE376-.LBB376
+	.uleb128 0x4e
+	.4byte	0x6c7a
+	.8byte	.LBB377
+	.8byte	.LBE377-.LBB377
 	.byte	0x1
-	.2byte	0x14c
+	.2byte	0x156
 	.4byte	0x66b2
 	.uleb128 0x4b
-	.4byte	0x6c5c
+	.4byte	0x6c8a
 	.uleb128 0x4b
-	.4byte	0x6c5c
-	.uleb128 0x4c
-	.8byte	.LBB377
-	.8byte	.LBE377-.LBB377
+	.4byte	0x6c8a
+	.uleb128 0x4f
+	.8byte	.LBB378
+	.8byte	.LBE378-.LBB378
 	.uleb128 0x4d
-	.4byte	0x6c67
+	.4byte	0x6c95
 	.uleb128 0x4d
-	.4byte	0x6c73
+	.4byte	0x6ca1
 	.uleb128 0x4d
-	.4byte	0x6c7f
+	.4byte	0x6cad
 	.uleb128 0x4d
-	.4byte	0x6c89
+	.4byte	0x6cb7
 	.uleb128 0x4d
-	.4byte	0x6c93
+	.4byte	0x6cc1
 	.uleb128 0x4d
-	.4byte	0x6c9d
-	.uleb128 0x4e
-	.4byte	0x6ca7
-	.4byte	.LLST30
+	.4byte	0x6ccb
+	.uleb128 0x50
+	.4byte	0x6cd5
+	.4byte	.LLST31
 	.uleb128 0x4d
-	.4byte	0x6cb3
+	.4byte	0x6ce1
 	.uleb128 0x4d
-	.4byte	0x6cbf
-	.uleb128 0x4a
-	.4byte	0x70ef
-	.8byte	.LBB378
-	.8byte	.LBE378-.LBB378
+	.4byte	0x6ced
+	.uleb128 0x4e
+	.4byte	0x711d
+	.8byte	.LBB379
+	.8byte	.LBE379-.LBB379
 	.byte	0x1
 	.2byte	0x109
 	.4byte	0x668c
 	.uleb128 0x4b
-	.4byte	0x710c
+	.4byte	0x713a
 	.uleb128 0x4b
-	.4byte	0x7100
+	.4byte	0x712e
 	.uleb128 0x55
-	.4byte	0x7119
-	.8byte	.LBB379
-	.8byte	.LBE379-.LBB379
+	.4byte	0x7147
+	.8byte	.LBB380
+	.8byte	.LBE380-.LBB380
 	.byte	0x2
 	.2byte	0x2e7
 	.uleb128 0x4b
-	.4byte	0x7136
+	.4byte	0x7164
 	.uleb128 0x4b
-	.4byte	0x712a
-	.uleb128 0x53
-	.8byte	.LVL110
-	.4byte	0x732c
+	.4byte	0x7158
+	.uleb128 0x54
+	.8byte	.LVL115
+	.4byte	0x7365
 	.byte	0
 	.byte	0
-	.uleb128 0x4c
-	.8byte	.LBB381
-	.8byte	.LBE381-.LBB381
-	.uleb128 0x4e
-	.4byte	0x6ccc
-	.4byte	.LLST31
-	.uleb128 0x4e
-	.4byte	0x6cd8
+	.uleb128 0x4f
+	.8byte	.LBB382
+	.8byte	.LBE382-.LBB382
+	.uleb128 0x50
+	.4byte	0x6cfa
 	.4byte	.LLST32
+	.uleb128 0x50
+	.4byte	0x6d06
+	.4byte	.LLST33
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.8byte	.LVL82
-	.4byte	0x7338
-	.uleb128 0x53
-	.8byte	.LVL96
-	.4byte	0x7338
-	.uleb128 0x53
-	.8byte	.LVL109
-	.4byte	0x6ce6
+	.uleb128 0x54
+	.8byte	.LVL83
+	.4byte	0x7371
+	.uleb128 0x54
+	.8byte	.LVL114
+	.4byte	0x6d14
+	.uleb128 0x54
+	.8byte	.LVL145
+	.4byte	0x7371
 	.byte	0
 	.byte	0
-	.uleb128 0x4a
+	.uleb128 0x4e
 	.4byte	0x69bc
-	.8byte	.LBB384
-	.8byte	.LBE384-.LBB384
+	.8byte	.LBB385
+	.8byte	.LBE385-.LBB385
 	.byte	0x1
-	.2byte	0x237
+	.2byte	0x241
 	.4byte	0x674e
 	.uleb128 0x4b
 	.4byte	0x69cd
-	.uleb128 0x4c
-	.8byte	.LBB385
-	.8byte	.LBE385-.LBB385
+	.uleb128 0x4f
+	.8byte	.LBB386
+	.8byte	.LBE386-.LBB386
 	.uleb128 0x4d
 	.4byte	0x69d9
-	.uleb128 0x4e
+	.uleb128 0x50
 	.4byte	0x69e3
-	.4byte	.LLST33
-	.uleb128 0x4e
-	.4byte	0x69ef
 	.4byte	.LLST34
-	.uleb128 0x4e
-	.4byte	0x69fb
+	.uleb128 0x50
+	.4byte	0x69ef
 	.4byte	.LLST35
 	.uleb128 0x50
-	.4byte	.Ldebug_ranges0+0x3a0
-	.uleb128 0x4e
-	.4byte	0x6a08
+	.4byte	0x69fb
 	.4byte	.LLST36
+	.uleb128 0x4c
+	.4byte	.Ldebug_ranges0+0x400
 	.uleb128 0x50
-	.4byte	.Ldebug_ranges0+0x3d0
+	.4byte	0x6a08
+	.4byte	.LLST37
+	.uleb128 0x4c
+	.4byte	.Ldebug_ranges0+0x430
 	.uleb128 0x4d
 	.4byte	0x6a15
 	.uleb128 0x4d
@@ -13866,12 +13913,12 @@ crc32_table:
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x4a
+	.uleb128 0x4e
 	.4byte	0x6ade
-	.8byte	.LBB391
-	.8byte	.LBE391-.LBB391
+	.8byte	.LBB392
+	.8byte	.LBE392-.LBB392
 	.byte	0x1
-	.2byte	0x222
+	.2byte	0x22c
 	.4byte	0x6861
 	.uleb128 0x4b
 	.4byte	0x6aef
@@ -13879,91 +13926,91 @@ crc32_table:
 	.4byte	0x6aef
 	.uleb128 0x4b
 	.4byte	0x6afb
-	.uleb128 0x4c
-	.8byte	.LBB392
-	.8byte	.LBE392-.LBB392
+	.uleb128 0x4f
+	.8byte	.LBB393
+	.8byte	.LBE393-.LBB393
 	.uleb128 0x4d
 	.4byte	0x6b07
-	.uleb128 0x4e
+	.uleb128 0x50
 	.4byte	0x6b13
-	.4byte	.LLST37
+	.4byte	.LLST38
 	.uleb128 0x4d
 	.4byte	0x6b1f
-	.uleb128 0x4a
-	.4byte	0x6dae
-	.8byte	.LBB393
-	.8byte	.LBE393-.LBB393
+	.uleb128 0x4e
+	.4byte	0x6ddc
+	.8byte	.LBB394
+	.8byte	.LBE394-.LBB394
 	.byte	0x1
-	.2byte	0x172
+	.2byte	0x17c
 	.4byte	0x6852
 	.uleb128 0x4b
-	.4byte	0x6dc9
+	.4byte	0x6df7
 	.uleb128 0x4b
-	.4byte	0x6dbe
-	.uleb128 0x4c
-	.8byte	.LBB394
-	.8byte	.LBE394-.LBB394
-	.uleb128 0x4e
-	.4byte	0x6dd4
-	.4byte	.LLST38
-	.uleb128 0x4e
-	.4byte	0x6ddf
+	.4byte	0x6dec
+	.uleb128 0x4f
+	.8byte	.LBB395
+	.8byte	.LBE395-.LBB395
+	.uleb128 0x50
+	.4byte	0x6e02
 	.4byte	.LLST39
-	.uleb128 0x4e
-	.4byte	0x6dea
+	.uleb128 0x50
+	.4byte	0x6e0d
 	.4byte	.LLST40
+	.uleb128 0x50
+	.4byte	0x6e18
+	.4byte	.LLST41
 	.uleb128 0x4d
-	.4byte	0x6df5
+	.4byte	0x6e23
 	.uleb128 0x4d
-	.4byte	0x6e00
+	.4byte	0x6e2e
 	.uleb128 0x4d
-	.4byte	0x6e0a
-	.uleb128 0x4f
-	.4byte	0x6e16
-	.8byte	.LBB395
-	.4byte	.Ldebug_ranges0+0x400
+	.4byte	0x6e38
+	.uleb128 0x51
+	.4byte	0x6e44
+	.8byte	.LBB396
+	.4byte	.Ldebug_ranges0+0x460
 	.byte	0x1
 	.byte	0xe4
 	.uleb128 0x4b
-	.4byte	0x6e31
+	.4byte	0x6e5f
 	.uleb128 0x4b
-	.4byte	0x6e26
-	.uleb128 0x50
-	.4byte	.Ldebug_ranges0+0x400
+	.4byte	0x6e54
+	.uleb128 0x4c
+	.4byte	.Ldebug_ranges0+0x460
 	.uleb128 0x4d
-	.4byte	0x6e3c
+	.4byte	0x6e6a
 	.uleb128 0x4d
-	.4byte	0x6e47
-	.uleb128 0x51
-	.4byte	.Ldebug_ranges0+0x450
+	.4byte	0x6e75
+	.uleb128 0x52
+	.4byte	.Ldebug_ranges0+0x4b0
 	.4byte	0x683e
 	.uleb128 0x4d
-	.4byte	0x6e55
+	.4byte	0x6e83
 	.uleb128 0x4d
-	.4byte	0x6e60
+	.4byte	0x6e8e
 	.byte	0
-	.uleb128 0x50
-	.4byte	.Ldebug_ranges0+0x480
+	.uleb128 0x4c
+	.4byte	.Ldebug_ranges0+0x4e0
 	.uleb128 0x4d
-	.4byte	0x6e6d
+	.4byte	0x6e9b
 	.uleb128 0x4d
-	.4byte	0x6e78
+	.4byte	0x6ea6
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.8byte	.LVL102
-	.4byte	0x6ce6
+	.uleb128 0x54
+	.8byte	.LVL107
+	.4byte	0x6d14
 	.byte	0
 	.byte	0
-	.uleb128 0x4a
+	.uleb128 0x4e
 	.4byte	0x6a30
-	.8byte	.LBB410
-	.8byte	.LBE410-.LBB410
+	.8byte	.LBB411
+	.8byte	.LBE411-.LBB411
 	.byte	0x1
-	.2byte	0x22e
+	.2byte	0x238
 	.4byte	0x6974
 	.uleb128 0x4b
 	.4byte	0x6a41
@@ -13971,100 +14018,100 @@ crc32_table:
 	.4byte	0x6a41
 	.uleb128 0x4b
 	.4byte	0x6a4d
-	.uleb128 0x4c
-	.8byte	.LBB411
-	.8byte	.LBE411-.LBB411
+	.uleb128 0x4f
+	.8byte	.LBB412
+	.8byte	.LBE412-.LBB412
 	.uleb128 0x4d
 	.4byte	0x6a59
-	.uleb128 0x4e
+	.uleb128 0x50
 	.4byte	0x6a65
-	.4byte	.LLST41
+	.4byte	.LLST42
 	.uleb128 0x4d
 	.4byte	0x6a71
-	.uleb128 0x4a
-	.4byte	0x6dae
-	.8byte	.LBB412
-	.8byte	.LBE412-.LBB412
+	.uleb128 0x4e
+	.4byte	0x6ddc
+	.8byte	.LBB413
+	.8byte	.LBE413-.LBB413
 	.byte	0x1
-	.2byte	0x1af
+	.2byte	0x1b9
 	.4byte	0x6965
 	.uleb128 0x4b
-	.4byte	0x6dc9
+	.4byte	0x6df7
 	.uleb128 0x4b
-	.4byte	0x6dbe
-	.uleb128 0x4c
-	.8byte	.LBB413
-	.8byte	.LBE413-.LBB413
-	.uleb128 0x4e
-	.4byte	0x6dd4
-	.4byte	.LLST42
-	.uleb128 0x4e
-	.4byte	0x6ddf
+	.4byte	0x6dec
+	.uleb128 0x4f
+	.8byte	.LBB414
+	.8byte	.LBE414-.LBB414
+	.uleb128 0x50
+	.4byte	0x6e02
 	.4byte	.LLST43
-	.uleb128 0x4e
-	.4byte	0x6dea
+	.uleb128 0x50
+	.4byte	0x6e0d
 	.4byte	.LLST44
+	.uleb128 0x50
+	.4byte	0x6e18
+	.4byte	.LLST45
 	.uleb128 0x4d
-	.4byte	0x6df5
+	.4byte	0x6e23
 	.uleb128 0x4d
-	.4byte	0x6e00
+	.4byte	0x6e2e
 	.uleb128 0x4d
-	.4byte	0x6e0a
-	.uleb128 0x4f
-	.4byte	0x6e16
-	.8byte	.LBB414
-	.4byte	.Ldebug_ranges0+0x4d0
+	.4byte	0x6e38
+	.uleb128 0x51
+	.4byte	0x6e44
+	.8byte	.LBB415
+	.4byte	.Ldebug_ranges0+0x530
 	.byte	0x1
 	.byte	0xe4
 	.uleb128 0x4b
-	.4byte	0x6e31
+	.4byte	0x6e5f
 	.uleb128 0x4b
-	.4byte	0x6e26
-	.uleb128 0x50
-	.4byte	.Ldebug_ranges0+0x4d0
+	.4byte	0x6e54
+	.uleb128 0x4c
+	.4byte	.Ldebug_ranges0+0x530
 	.uleb128 0x4d
-	.4byte	0x6e3c
+	.4byte	0x6e6a
 	.uleb128 0x4d
-	.4byte	0x6e47
-	.uleb128 0x51
-	.4byte	.Ldebug_ranges0+0x520
+	.4byte	0x6e75
+	.uleb128 0x52
+	.4byte	.Ldebug_ranges0+0x580
 	.4byte	0x6951
 	.uleb128 0x4d
-	.4byte	0x6e55
+	.4byte	0x6e83
 	.uleb128 0x4d
-	.4byte	0x6e60
+	.4byte	0x6e8e
 	.byte	0
-	.uleb128 0x50
-	.4byte	.Ldebug_ranges0+0x550
+	.uleb128 0x4c
+	.4byte	.Ldebug_ranges0+0x5b0
 	.uleb128 0x4d
-	.4byte	0x6e6d
+	.4byte	0x6e9b
 	.uleb128 0x4d
-	.4byte	0x6e78
+	.4byte	0x6ea6
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.8byte	.LVL137
-	.4byte	0x6ce6
+	.uleb128 0x54
+	.8byte	.LVL139
+	.4byte	0x6d14
 	.byte	0
 	.byte	0
-	.uleb128 0x53
+	.uleb128 0x54
 	.8byte	.LVL62
-	.4byte	0x7338
-	.uleb128 0x53
-	.8byte	.LVL119
-	.4byte	0x722f
-	.uleb128 0x53
-	.8byte	.LVL123
-	.4byte	0x722f
-	.uleb128 0x53
-	.8byte	.LVL130
-	.4byte	0x722f
-	.uleb128 0x53
-	.8byte	.LVL140
-	.4byte	0x722f
+	.4byte	0x7371
+	.uleb128 0x54
+	.8byte	.LVL100
+	.4byte	0x725d
+	.uleb128 0x54
+	.8byte	.LVL124
+	.4byte	0x725d
+	.uleb128 0x54
+	.8byte	.LVL128
+	.4byte	0x725d
+	.uleb128 0x54
+	.8byte	.LVL142
+	.4byte	0x725d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -14072,51 +14119,51 @@ crc32_table:
 	.uleb128 0x56
 	.4byte	.LASF1477
 	.byte	0x1
-	.2byte	0x1bd
+	.2byte	0x1c7
 	.4byte	0xc0
 	.byte	0x1
 	.4byte	0x6a30
 	.uleb128 0x57
 	.4byte	.LASF739
 	.byte	0x1
-	.2byte	0x1bd
+	.2byte	0x1c7
 	.4byte	0x69b6
 	.uleb128 0x49
 	.string	"i"
 	.byte	0x1
-	.2byte	0x1be
+	.2byte	0x1c8
 	.4byte	0xc0
 	.uleb128 0x58
 	.4byte	.LASF1472
 	.byte	0x1
-	.2byte	0x1bf
+	.2byte	0x1c9
 	.4byte	0x120
 	.uleb128 0x58
 	.4byte	.LASF1473
 	.byte	0x1
-	.2byte	0x1bf
+	.2byte	0x1c9
 	.4byte	0x120
 	.uleb128 0x58
 	.4byte	.LASF1432
 	.byte	0x1
-	.2byte	0x1c1
+	.2byte	0x1cb
 	.4byte	0xc0
 	.uleb128 0x59
 	.uleb128 0x58
 	.4byte	.LASF1474
 	.byte	0x1
-	.2byte	0x1c4
+	.2byte	0x1ce
 	.4byte	0x2d56
 	.uleb128 0x59
 	.uleb128 0x58
 	.4byte	.LASF1475
 	.byte	0x1
-	.2byte	0x1c7
+	.2byte	0x1d1
 	.4byte	0x100
 	.uleb128 0x58
 	.4byte	.LASF1476
 	.byte	0x1
-	.2byte	0x1c8
+	.2byte	0x1d2
 	.4byte	0x100
 	.byte	0
 	.byte	0
@@ -14124,34 +14171,34 @@ crc32_table:
 	.uleb128 0x56
 	.4byte	.LASF1478
 	.byte	0x1
-	.2byte	0x1a9
+	.2byte	0x1b3
 	.4byte	0xc0
 	.byte	0x1
 	.4byte	0x6a7e
 	.uleb128 0x57
 	.4byte	.LASF1466
 	.byte	0x1
-	.2byte	0x1a9
+	.2byte	0x1b3
 	.4byte	0x69b6
 	.uleb128 0x57
 	.4byte	.LASF1479
 	.byte	0x1
-	.2byte	0x1a9
+	.2byte	0x1b3
 	.4byte	0xc0
 	.uleb128 0x58
 	.4byte	.LASF1480
 	.byte	0x1
-	.2byte	0x1ab
+	.2byte	0x1b5
 	.4byte	0x6a7e
 	.uleb128 0x58
 	.4byte	.LASF1432
 	.byte	0x1
-	.2byte	0x1ac
+	.2byte	0x1b6
 	.4byte	0x6c
 	.uleb128 0x58
 	.4byte	.LASF1443
 	.byte	0x1
-	.2byte	0x1ad
+	.2byte	0x1b7
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x7
@@ -14160,156 +14207,156 @@ crc32_table:
 	.uleb128 0x56
 	.4byte	.LASF1481
 	.byte	0x1
-	.2byte	0x180
+	.2byte	0x18a
 	.4byte	0xc0
 	.byte	0x1
 	.4byte	0x6ade
 	.uleb128 0x57
 	.4byte	.LASF1466
 	.byte	0x1
-	.2byte	0x180
+	.2byte	0x18a
 	.4byte	0x69b6
 	.uleb128 0x57
 	.4byte	.LASF1479
 	.byte	0x1
-	.2byte	0x180
+	.2byte	0x18a
 	.4byte	0xc0
 	.uleb128 0x58
 	.4byte	.LASF1482
 	.byte	0x1
-	.2byte	0x182
+	.2byte	0x18c
 	.4byte	0x600b
 	.uleb128 0x58
 	.4byte	.LASF1480
 	.byte	0x1
-	.2byte	0x183
+	.2byte	0x18d
 	.4byte	0x6a7e
 	.uleb128 0x58
 	.4byte	.LASF1432
 	.byte	0x1
-	.2byte	0x184
+	.2byte	0x18e
 	.4byte	0x6c
 	.uleb128 0x58
 	.4byte	.LASF1443
 	.byte	0x1
-	.2byte	0x185
+	.2byte	0x18f
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x56
 	.4byte	.LASF1483
 	.byte	0x1
-	.2byte	0x16b
+	.2byte	0x175
 	.4byte	0xc0
 	.byte	0x1
 	.4byte	0x6b2c
 	.uleb128 0x57
 	.4byte	.LASF1466
 	.byte	0x1
-	.2byte	0x16b
+	.2byte	0x175
 	.4byte	0x69b6
 	.uleb128 0x57
 	.4byte	.LASF1479
 	.byte	0x1
-	.2byte	0x16b
+	.2byte	0x175
 	.4byte	0xc0
 	.uleb128 0x58
 	.4byte	.LASF1480
 	.byte	0x1
-	.2byte	0x16d
+	.2byte	0x177
 	.4byte	0x6a7e
 	.uleb128 0x58
 	.4byte	.LASF1432
 	.byte	0x1
-	.2byte	0x16e
+	.2byte	0x178
 	.4byte	0x6c
 	.uleb128 0x58
 	.4byte	.LASF1443
 	.byte	0x1
-	.2byte	0x16f
+	.2byte	0x179
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x56
 	.4byte	.LASF1484
 	.byte	0x1
-	.2byte	0x156
+	.2byte	0x160
 	.4byte	0xc0
 	.byte	0x1
 	.4byte	0x6b86
 	.uleb128 0x57
 	.4byte	.LASF1466
 	.byte	0x1
-	.2byte	0x156
+	.2byte	0x160
 	.4byte	0x69b6
 	.uleb128 0x57
 	.4byte	.LASF1479
 	.byte	0x1
-	.2byte	0x156
+	.2byte	0x160
 	.4byte	0xc0
 	.uleb128 0x57
 	.4byte	.LASF1467
 	.byte	0x1
-	.2byte	0x156
+	.2byte	0x160
 	.4byte	0x6042
 	.uleb128 0x58
 	.4byte	.LASF1480
 	.byte	0x1
-	.2byte	0x158
+	.2byte	0x162
 	.4byte	0x6a7e
 	.uleb128 0x58
 	.4byte	.LASF1432
 	.byte	0x1
-	.2byte	0x159
+	.2byte	0x163
 	.4byte	0x6c
 	.uleb128 0x58
 	.4byte	.LASF1443
 	.byte	0x1
-	.2byte	0x15a
+	.2byte	0x164
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x56
 	.4byte	.LASF1485
 	.byte	0x1
-	.2byte	0x137
+	.2byte	0x141
 	.4byte	0xc0
 	.byte	0x1
 	.4byte	0x6be0
 	.uleb128 0x57
 	.4byte	.LASF1466
 	.byte	0x1
-	.2byte	0x137
+	.2byte	0x141
 	.4byte	0x69b6
 	.uleb128 0x57
 	.4byte	.LASF1479
 	.byte	0x1
-	.2byte	0x137
+	.2byte	0x141
 	.4byte	0xc0
 	.uleb128 0x58
 	.4byte	.LASF1482
 	.byte	0x1
-	.2byte	0x139
+	.2byte	0x143
 	.4byte	0x600b
 	.uleb128 0x58
 	.4byte	.LASF1480
 	.byte	0x1
-	.2byte	0x13a
+	.2byte	0x144
 	.4byte	0x6a7e
 	.uleb128 0x58
 	.4byte	.LASF1432
 	.byte	0x1
-	.2byte	0x13b
+	.2byte	0x145
 	.4byte	0x6c
 	.uleb128 0x58
 	.4byte	.LASF1443
 	.byte	0x1
-	.2byte	0x13c
+	.2byte	0x146
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x5a
-	.4byte	.LASF1513
+	.4byte	.LASF1514
 	.byte	0x1
 	.2byte	0x11e
 	.byte	0x1
-	.4byte	0x6c4c
+	.4byte	0x6c65
 	.uleb128 0x57
 	.4byte	.LASF1482
 	.byte	0x1
@@ -14350,15 +14397,33 @@ crc32_table:
 	.byte	0x1
 	.2byte	0x124
 	.4byte	0xc0
-	.byte	0
+	.uleb128 0x58
+	.4byte	.LASF1432
+	.byte	0x1
+	.2byte	0x125
+	.4byte	0xc0
 	.uleb128 0x5b
 	.4byte	.LASF1490
+	.4byte	0x6c75
+	.4byte	.LASF1514
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x67
+	.4byte	0x6c75
+	.uleb128 0x6
+	.4byte	0x4e
+	.byte	0xe
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x6c65
+	.uleb128 0x5c
+	.4byte	.LASF1491
 	.byte	0x1
 	.byte	0xfe
 	.4byte	0x2d56
 	.byte	0x1
-	.4byte	0x6ce6
-	.uleb128 0x5c
+	.4byte	0x6d14
+	.uleb128 0x5d
 	.4byte	.LASF1482
 	.byte	0x1
 	.byte	0xfe
@@ -14394,7 +14459,7 @@ crc32_table:
 	.2byte	0x101
 	.4byte	0xc0
 	.uleb128 0x58
-	.4byte	.LASF1491
+	.4byte	.LASF1492
 	.byte	0x1
 	.2byte	0x102
 	.4byte	0xc0
@@ -14421,8 +14486,8 @@ crc32_table:
 	.4byte	0xc0
 	.byte	0
 	.byte	0
-	.uleb128 0x5d
-	.4byte	.LASF1539
+	.uleb128 0x5e
+	.4byte	.LASF1540
 	.byte	0x1
 	.byte	0xf0
 	.4byte	0x2d56
@@ -14430,173 +14495,173 @@ crc32_table:
 	.8byte	.LFE1556-.LFB1556
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6d8c
-	.uleb128 0x5e
+	.4byte	0x6dba
+	.uleb128 0x5f
 	.4byte	.LASF1480
 	.byte	0x1
 	.byte	0xf0
 	.4byte	0x6a7e
 	.4byte	.LLST0
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.4byte	.LASF1443
 	.byte	0x1
 	.byte	0xf1
 	.4byte	0x6c
 	.4byte	.LLST1
-	.uleb128 0x5f
+	.uleb128 0x60
 	.string	"out"
 	.byte	0x1
 	.byte	0xf3
-	.4byte	0x6d8c
-	.uleb128 0x60
-	.4byte	0x70ef
-	.8byte	.LBB205
+	.4byte	0x6dba
+	.uleb128 0x61
+	.4byte	0x711d
+	.8byte	.LBB203
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
 	.byte	0xf5
-	.4byte	0x6d7e
+	.4byte	0x6dac
 	.uleb128 0x4b
-	.4byte	0x710c
+	.4byte	0x713a
 	.uleb128 0x4b
-	.4byte	0x7100
-	.uleb128 0x61
-	.4byte	0x7119
-	.8byte	.LBB206
+	.4byte	0x712e
+	.uleb128 0x62
+	.4byte	0x7147
+	.8byte	.LBB204
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x2
 	.2byte	0x2e7
 	.uleb128 0x4b
-	.4byte	0x7136
+	.4byte	0x7164
 	.uleb128 0x4b
-	.4byte	0x712a
-	.uleb128 0x53
+	.4byte	0x7158
+	.uleb128 0x54
 	.8byte	.LVL3
-	.4byte	0x732c
+	.4byte	0x7365
 	.byte	0
 	.byte	0
-	.uleb128 0x53
+	.uleb128 0x54
 	.8byte	.LVL4
-	.4byte	0x7343
+	.4byte	0x737c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x90
-	.uleb128 0x5b
-	.4byte	.LASF1492
+	.uleb128 0x5c
+	.4byte	.LASF1493
 	.byte	0x1
 	.byte	0xeb
 	.4byte	0x90
 	.byte	0x3
-	.4byte	0x6dae
-	.uleb128 0x5c
+	.4byte	0x6ddc
+	.uleb128 0x5d
 	.4byte	.LASF1480
 	.byte	0x1
 	.byte	0xeb
 	.4byte	0x6a7e
 	.byte	0
-	.uleb128 0x5b
-	.4byte	.LASF1493
+	.uleb128 0x5c
+	.4byte	.LASF1494
 	.byte	0x1
 	.byte	0xba
 	.4byte	0x6a7e
 	.byte	0x1
-	.4byte	0x6e16
-	.uleb128 0x5c
+	.4byte	0x6e44
+	.uleb128 0x5d
 	.4byte	.LASF1479
 	.byte	0x1
 	.byte	0xba
 	.4byte	0xc0
-	.uleb128 0x5c
+	.uleb128 0x5d
 	.4byte	.LASF822
 	.byte	0x1
 	.byte	0xba
 	.4byte	0xc0
-	.uleb128 0x62
-	.4byte	.LASF1494
+	.uleb128 0x63
+	.4byte	.LASF1495
 	.byte	0x1
 	.byte	0xbc
 	.4byte	0x61c8
-	.uleb128 0x62
+	.uleb128 0x63
 	.4byte	.LASF856
 	.byte	0x1
 	.byte	0xbd
 	.4byte	0x2d56
-	.uleb128 0x62
-	.4byte	.LASF1495
+	.uleb128 0x63
+	.4byte	.LASF1496
 	.byte	0x1
 	.byte	0xbe
 	.4byte	0x1e1
-	.uleb128 0x62
-	.4byte	.LASF1496
+	.uleb128 0x63
+	.4byte	.LASF1497
 	.byte	0x1
 	.byte	0xbf
 	.4byte	0x6c
-	.uleb128 0x5f
+	.uleb128 0x60
 	.string	"pt"
 	.byte	0x1
 	.byte	0xc0
 	.4byte	0x6c
-	.uleb128 0x62
+	.uleb128 0x63
 	.4byte	.LASF1480
 	.byte	0x1
 	.byte	0xc1
 	.4byte	0x442
 	.byte	0
-	.uleb128 0x5b
-	.4byte	.LASF1497
+	.uleb128 0x5c
+	.4byte	.LASF1498
 	.byte	0x1
 	.byte	0xa8
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6e85
-	.uleb128 0x5c
+	.4byte	0x6eb3
+	.uleb128 0x5d
 	.4byte	.LASF856
 	.byte	0x1
 	.byte	0xa8
 	.4byte	0x1e1
-	.uleb128 0x5c
+	.uleb128 0x5d
 	.4byte	.LASF1479
 	.byte	0x1
 	.byte	0xa8
 	.4byte	0xc0
-	.uleb128 0x62
+	.uleb128 0x63
 	.4byte	.LASF884
 	.byte	0x1
 	.byte	0xaa
 	.4byte	0xc0
-	.uleb128 0x5f
+	.uleb128 0x60
 	.string	"i"
 	.byte	0x1
 	.byte	0xab
 	.4byte	0xc0
+	.uleb128 0x64
+	.4byte	0x6e9a
 	.uleb128 0x63
-	.4byte	0x6e6c
-	.uleb128 0x62
-	.4byte	.LASF1498
+	.4byte	.LASF1499
 	.byte	0x1
 	.byte	0xad
 	.4byte	0xc0
-	.uleb128 0x62
-	.4byte	.LASF1499
+	.uleb128 0x63
+	.4byte	.LASF1500
 	.byte	0x1
 	.byte	0xad
 	.4byte	0xc0
 	.byte	0
 	.uleb128 0x59
-	.uleb128 0x62
-	.4byte	.LASF1500
+	.uleb128 0x63
+	.4byte	.LASF1501
 	.byte	0x1
 	.byte	0xae
 	.4byte	0xc0
-	.uleb128 0x62
-	.4byte	.LASF1501
+	.uleb128 0x63
+	.4byte	.LASF1502
 	.byte	0x1
 	.byte	0xae
 	.4byte	0xc0
 	.byte	0
 	.byte	0
-	.uleb128 0x64
-	.4byte	.LASF1540
+	.uleb128 0x65
+	.4byte	.LASF1541
 	.byte	0x1
 	.byte	0xa0
 	.4byte	0x55
@@ -14604,8 +14669,8 @@ crc32_table:
 	.8byte	.LFE1552-.LFB1552
 	.uleb128 0x1
 	.byte	0x9c
-	.uleb128 0x65
-	.4byte	.LASF1503
+	.uleb128 0x66
+	.4byte	.LASF1504
 	.byte	0x1
 	.byte	0x7f
 	.4byte	0xc0
@@ -14613,227 +14678,227 @@ crc32_table:
 	.8byte	.LFE1551-.LFB1551
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x701b
-	.uleb128 0x5e
-	.4byte	.LASF1504
+	.4byte	0x7049
+	.uleb128 0x5f
+	.4byte	.LASF1505
 	.byte	0x1
 	.byte	0x7f
 	.4byte	0x442
 	.4byte	.LLST8
-	.uleb128 0x5f
+	.uleb128 0x60
 	.string	"ret"
 	.byte	0x1
 	.byte	0x81
 	.4byte	0xc0
-	.uleb128 0x5f
+	.uleb128 0x60
 	.string	"wf"
 	.byte	0x1
 	.byte	0x82
 	.4byte	0x61c8
-	.uleb128 0x60
-	.4byte	0x704d
-	.8byte	.LBB246
+	.uleb128 0x61
+	.4byte	0x707b
+	.8byte	.LBB244
 	.4byte	.Ldebug_ranges0+0x120
 	.byte	0x1
 	.byte	0x87
-	.4byte	0x6f1e
+	.4byte	0x6f4c
 	.uleb128 0x4b
-	.4byte	0x705d
-	.uleb128 0x53
+	.4byte	0x708b
+	.uleb128 0x54
 	.8byte	.LVL35
-	.4byte	0x734c
-	.uleb128 0x53
+	.4byte	0x7385
+	.uleb128 0x54
 	.8byte	.LVL56
-	.4byte	0x7357
+	.4byte	0x735a
 	.byte	0
-	.uleb128 0x60
-	.4byte	0x701b
-	.8byte	.LBB249
+	.uleb128 0x61
+	.4byte	0x7049
+	.8byte	.LBB247
 	.4byte	.Ldebug_ranges0+0x150
 	.byte	0x1
 	.byte	0x8d
-	.4byte	0x6ff3
+	.4byte	0x7021
 	.uleb128 0x4b
-	.4byte	0x702b
-	.uleb128 0x50
+	.4byte	0x7059
+	.uleb128 0x4c
 	.4byte	.Ldebug_ranges0+0x150
 	.uleb128 0x4d
-	.4byte	0x7036
-	.uleb128 0x4e
-	.4byte	0x7041
+	.4byte	0x7064
+	.uleb128 0x50
+	.4byte	0x706f
 	.4byte	.LLST9
-	.uleb128 0x66
-	.4byte	0x7069
-	.8byte	.LBB251
-	.8byte	.LBE251-.LBB251
+	.uleb128 0x67
+	.4byte	0x7097
+	.8byte	.LBB249
+	.8byte	.LBE249-.LBB249
 	.byte	0x1
 	.byte	0x6e
-	.4byte	0x6fe4
+	.4byte	0x7012
 	.uleb128 0x4b
-	.4byte	0x7084
+	.4byte	0x70b2
 	.uleb128 0x4b
-	.4byte	0x7079
-	.uleb128 0x4c
-	.8byte	.LBB252
-	.8byte	.LBE252-.LBB252
+	.4byte	0x70a7
+	.uleb128 0x4f
+	.8byte	.LBB250
+	.8byte	.LBE250-.LBB250
 	.uleb128 0x4d
-	.4byte	0x708f
-	.uleb128 0x4e
-	.4byte	0x7098
+	.4byte	0x70bd
+	.uleb128 0x50
+	.4byte	0x70c6
 	.4byte	.LLST10
-	.uleb128 0x60
-	.4byte	0x70a4
-	.8byte	.LBB253
+	.uleb128 0x61
+	.4byte	0x70d2
+	.8byte	.LBB251
 	.4byte	.Ldebug_ranges0+0x180
 	.byte	0x1
 	.byte	0x54
-	.4byte	0x6fd5
+	.4byte	0x7003
 	.uleb128 0x4b
-	.4byte	0x70bb
+	.4byte	0x70e9
 	.uleb128 0x4b
-	.4byte	0x70b0
-	.uleb128 0x50
+	.4byte	0x70de
+	.uleb128 0x4c
 	.4byte	.Ldebug_ranges0+0x180
 	.uleb128 0x4d
-	.4byte	0x70c6
+	.4byte	0x70f4
 	.uleb128 0x4d
-	.4byte	0x70cf
-	.uleb128 0x4e
-	.4byte	0x70d8
+	.4byte	0x70fd
+	.uleb128 0x50
+	.4byte	0x7106
 	.4byte	.LLST11
-	.uleb128 0x4e
-	.4byte	0x70e3
+	.uleb128 0x50
+	.4byte	0x7111
 	.4byte	.LLST12
 	.byte	0
 	.byte	0
-	.uleb128 0x53
+	.uleb128 0x54
 	.8byte	.LVL36
-	.4byte	0x7362
+	.4byte	0x7390
 	.byte	0
 	.byte	0
-	.uleb128 0x53
+	.uleb128 0x54
 	.8byte	.LVL51
-	.4byte	0x7357
+	.4byte	0x735a
 	.byte	0
 	.byte	0
-	.uleb128 0x53
+	.uleb128 0x54
 	.8byte	.LVL45
-	.4byte	0x7357
-	.uleb128 0x53
+	.4byte	0x735a
+	.uleb128 0x54
 	.8byte	.LVL52
-	.4byte	0x7357
-	.uleb128 0x53
+	.4byte	0x735a
+	.uleb128 0x54
 	.8byte	.LVL57
-	.4byte	0x7357
+	.4byte	0x735a
 	.byte	0
-	.uleb128 0x5b
-	.4byte	.LASF1505
+	.uleb128 0x5c
+	.4byte	.LASF1506
 	.byte	0x1
 	.byte	0x65
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x704d
-	.uleb128 0x5c
-	.4byte	.LASF1494
+	.4byte	0x707b
+	.uleb128 0x5d
+	.4byte	.LASF1495
 	.byte	0x1
 	.byte	0x65
 	.4byte	0x61c8
-	.uleb128 0x62
-	.4byte	.LASF1506
+	.uleb128 0x63
+	.4byte	.LASF1507
 	.byte	0x1
 	.byte	0x67
 	.4byte	0x120
-	.uleb128 0x62
-	.4byte	.LASF1507
+	.uleb128 0x63
+	.4byte	.LASF1508
 	.byte	0x1
 	.byte	0x68
 	.4byte	0x120
 	.byte	0
-	.uleb128 0x5b
-	.4byte	.LASF1508
+	.uleb128 0x5c
+	.4byte	.LASF1509
 	.byte	0x1
 	.byte	0x5b
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x7069
-	.uleb128 0x67
+	.4byte	0x7097
+	.uleb128 0x68
 	.string	"buf"
 	.byte	0x1
 	.byte	0x5b
 	.4byte	0x603c
 	.byte	0
-	.uleb128 0x5b
-	.4byte	.LASF1509
+	.uleb128 0x5c
+	.4byte	.LASF1510
 	.byte	0x1
 	.byte	0x4e
 	.4byte	0x6c
 	.byte	0x1
-	.4byte	0x70a4
-	.uleb128 0x5c
-	.4byte	.LASF1510
+	.4byte	0x70d2
+	.uleb128 0x5d
+	.4byte	.LASF1511
 	.byte	0x1
 	.byte	0x4e
-	.4byte	0x6d8c
-	.uleb128 0x5c
-	.4byte	.LASF1511
+	.4byte	0x6dba
+	.uleb128 0x5d
+	.4byte	.LASF1512
 	.byte	0x1
 	.byte	0x4e
 	.4byte	0x6c
-	.uleb128 0x5f
+	.uleb128 0x60
 	.string	"i"
 	.byte	0x1
 	.byte	0x50
 	.4byte	0x6c
-	.uleb128 0x62
-	.4byte	.LASF1512
+	.uleb128 0x63
+	.4byte	.LASF1513
 	.byte	0x1
 	.byte	0x51
 	.4byte	0x6c
 	.byte	0
-	.uleb128 0x68
-	.4byte	.LASF1514
+	.uleb128 0x69
+	.4byte	.LASF1515
 	.byte	0x1
 	.byte	0x3a
 	.byte	0x1
-	.4byte	0x70ef
-	.uleb128 0x5c
-	.4byte	.LASF1515
+	.4byte	0x711d
+	.uleb128 0x5d
+	.4byte	.LASF1516
 	.byte	0x1
 	.byte	0x3a
 	.4byte	0x6c
-	.uleb128 0x5c
-	.4byte	.LASF1516
+	.uleb128 0x5d
+	.4byte	.LASF1517
 	.byte	0x1
 	.byte	0x3a
 	.4byte	0x2d56
-	.uleb128 0x5f
+	.uleb128 0x60
 	.string	"i"
 	.byte	0x1
 	.byte	0x3c
 	.4byte	0x6c
-	.uleb128 0x5f
+	.uleb128 0x60
 	.string	"j"
 	.byte	0x1
 	.byte	0x3c
 	.4byte	0x6c
-	.uleb128 0x62
-	.4byte	.LASF1517
+	.uleb128 0x63
+	.4byte	.LASF1518
 	.byte	0x1
 	.byte	0x3d
 	.4byte	0x6c
-	.uleb128 0x62
-	.4byte	.LASF1512
+	.uleb128 0x63
+	.4byte	.LASF1513
 	.byte	0x1
 	.byte	0x3e
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1518
+	.4byte	.LASF1519
 	.byte	0x2
 	.2byte	0x2e5
 	.4byte	0x442
 	.byte	0x3
-	.4byte	0x7119
+	.4byte	0x7147
 	.uleb128 0x57
 	.4byte	.LASF826
 	.byte	0x2
@@ -14846,12 +14911,12 @@ crc32_table:
 	.4byte	0x277
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1519
+	.4byte	.LASF1520
 	.byte	0x2
 	.2byte	0x216
 	.4byte	0x442
 	.byte	0x3
-	.4byte	0x7151
+	.4byte	0x717f
 	.uleb128 0x57
 	.4byte	.LASF826
 	.byte	0x2
@@ -14871,12 +14936,12 @@ crc32_table:
 	.byte	0
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1520
+	.4byte	.LASF1521
 	.byte	0x2
 	.2byte	0x1dd
 	.4byte	0x442
 	.byte	0x3
-	.4byte	0x7187
+	.4byte	0x71b5
 	.uleb128 0x57
 	.4byte	.LASF826
 	.byte	0x2
@@ -14888,18 +14953,18 @@ crc32_table:
 	.2byte	0x1dd
 	.4byte	0x277
 	.uleb128 0x58
-	.4byte	.LASF1521
+	.4byte	.LASF1522
 	.byte	0x2
 	.2byte	0x1df
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1522
+	.4byte	.LASF1523
 	.byte	0x2
 	.2byte	0x159
 	.4byte	0x6c
 	.byte	0x3
-	.4byte	0x71a5
+	.4byte	0x71d3
 	.uleb128 0x57
 	.4byte	.LASF826
 	.byte	0x2
@@ -14907,81 +14972,81 @@ crc32_table:
 	.4byte	0x261
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1523
+	.4byte	.LASF1524
 	.byte	0x2
 	.2byte	0x13d
 	.4byte	0x5f61
 	.byte	0x3
-	.4byte	0x71c3
+	.4byte	0x71f1
 	.uleb128 0x57
 	.4byte	.LASF61
 	.byte	0x2
 	.2byte	0x13d
 	.4byte	0x277
 	.byte	0
-	.uleb128 0x5b
-	.4byte	.LASF1524
+	.uleb128 0x5c
+	.4byte	.LASF1525
 	.byte	0x60
 	.byte	0x1d
 	.4byte	0xc0
 	.byte	0x3
-	.4byte	0x71df
-	.uleb128 0x5c
+	.4byte	0x720d
+	.uleb128 0x5d
 	.4byte	.LASF826
 	.byte	0x60
 	.byte	0x1d
 	.4byte	0x2d
 	.byte	0
-	.uleb128 0x5b
-	.4byte	.LASF1525
+	.uleb128 0x5c
+	.4byte	.LASF1526
 	.byte	0x61
 	.byte	0x22
 	.4byte	0xc0
 	.byte	0x3
-	.4byte	0x71f9
-	.uleb128 0x67
+	.4byte	0x7227
+	.uleb128 0x68
 	.string	"n"
 	.byte	0x61
 	.byte	0x22
 	.4byte	0x136
 	.byte	0
-	.uleb128 0x5b
-	.4byte	.LASF1526
+	.uleb128 0x5c
+	.4byte	.LASF1527
 	.byte	0x62
 	.byte	0x1b
 	.4byte	0xc0
 	.byte	0x3
-	.4byte	0x7213
-	.uleb128 0x67
+	.4byte	0x7241
+	.uleb128 0x68
 	.string	"x"
 	.byte	0x62
 	.byte	0x1b
 	.4byte	0xe4
 	.byte	0
-	.uleb128 0x5b
-	.4byte	.LASF1527
+	.uleb128 0x5c
+	.4byte	.LASF1528
 	.byte	0x63
 	.byte	0xb
 	.4byte	0x2d
 	.byte	0x3
-	.4byte	0x722f
-	.uleb128 0x5c
-	.4byte	.LASF1528
+	.4byte	0x725d
+	.uleb128 0x5d
+	.4byte	.LASF1529
 	.byte	0x63
 	.byte	0xb
 	.4byte	0x2d
 	.byte	0
-	.uleb128 0x69
+	.uleb128 0x6a
 	.4byte	0x6b2c
 	.8byte	.LFB1569
 	.8byte	.LFE1569-.LFB1569
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x732c
-	.uleb128 0x6a
+	.4byte	0x735a
+	.uleb128 0x6b
 	.4byte	0x6b49
 	.4byte	.LLST2
-	.uleb128 0x6a
+	.uleb128 0x6b
 	.4byte	0x6b55
 	.4byte	.LLST3
 	.uleb128 0x4b
@@ -14990,104 +15055,104 @@ crc32_table:
 	.4byte	0x6b3d
 	.uleb128 0x4d
 	.4byte	0x6b61
-	.uleb128 0x4e
+	.uleb128 0x50
 	.4byte	0x6b6d
 	.4byte	.LLST4
 	.uleb128 0x4d
 	.4byte	0x6b79
-	.uleb128 0x54
-	.4byte	0x6dae
-	.8byte	.LBB222
+	.uleb128 0x4a
+	.4byte	0x6ddc
+	.8byte	.LBB220
 	.4byte	.Ldebug_ranges0+0x40
 	.byte	0x1
-	.2byte	0x15d
-	.4byte	0x731e
+	.2byte	0x167
+	.4byte	0x734c
 	.uleb128 0x4b
-	.4byte	0x6dc9
+	.4byte	0x6df7
 	.uleb128 0x4b
-	.4byte	0x6dbe
-	.uleb128 0x50
+	.4byte	0x6dec
+	.uleb128 0x4c
 	.4byte	.Ldebug_ranges0+0x40
-	.uleb128 0x4e
-	.4byte	0x6dd4
+	.uleb128 0x50
+	.4byte	0x6e02
 	.4byte	.LLST5
-	.uleb128 0x4e
-	.4byte	0x6ddf
+	.uleb128 0x50
+	.4byte	0x6e0d
 	.4byte	.LLST6
-	.uleb128 0x4e
-	.4byte	0x6dea
+	.uleb128 0x50
+	.4byte	0x6e18
 	.4byte	.LLST7
 	.uleb128 0x4d
-	.4byte	0x6df5
+	.4byte	0x6e23
 	.uleb128 0x4d
-	.4byte	0x6e00
+	.4byte	0x6e2e
 	.uleb128 0x4d
-	.4byte	0x6e0a
-	.uleb128 0x4f
-	.4byte	0x6e16
-	.8byte	.LBB224
+	.4byte	0x6e38
+	.uleb128 0x51
+	.4byte	0x6e44
+	.8byte	.LBB222
 	.4byte	.Ldebug_ranges0+0x90
 	.byte	0x1
 	.byte	0xe4
 	.uleb128 0x4b
-	.4byte	0x6e31
+	.4byte	0x6e5f
 	.uleb128 0x4b
-	.4byte	0x6e26
-	.uleb128 0x50
+	.4byte	0x6e54
+	.uleb128 0x4c
 	.4byte	.Ldebug_ranges0+0x90
 	.uleb128 0x4d
-	.4byte	0x6e3c
+	.4byte	0x6e6a
 	.uleb128 0x4d
-	.4byte	0x6e47
-	.uleb128 0x51
+	.4byte	0x6e75
+	.uleb128 0x52
 	.4byte	.Ldebug_ranges0+0xc0
-	.4byte	0x730a
+	.4byte	0x7338
 	.uleb128 0x4d
-	.4byte	0x6e55
+	.4byte	0x6e83
 	.uleb128 0x4d
-	.4byte	0x6e60
+	.4byte	0x6e8e
 	.byte	0
-	.uleb128 0x50
+	.uleb128 0x4c
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x4d
-	.4byte	0x6e6d
+	.4byte	0x6e9b
 	.uleb128 0x4d
-	.4byte	0x6e78
+	.4byte	0x6ea6
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
+	.uleb128 0x54
 	.8byte	.LVL19
-	.4byte	0x6ce6
+	.4byte	0x6d14
 	.byte	0
-	.uleb128 0x6b
-	.4byte	.LASF1529
-	.4byte	.LASF1529
-	.byte	0x2
-	.2byte	0x184
 	.uleb128 0x6c
 	.4byte	.LASF1530
 	.4byte	.LASF1530
-	.byte	0x2
-	.byte	0xb9
+	.byte	0xe
+	.byte	0xb0
 	.uleb128 0x6d
-	.4byte	.LASF1533
-	.4byte	.LASF1533
-	.uleb128 0x6c
 	.4byte	.LASF1531
 	.4byte	.LASF1531
-	.byte	0x64
-	.byte	0x1e
+	.byte	0x2
+	.2byte	0x184
 	.uleb128 0x6c
 	.4byte	.LASF1532
 	.4byte	.LASF1532
-	.byte	0xe
-	.byte	0xb0
-	.uleb128 0x6d
+	.byte	0x2
+	.byte	0xb9
+	.uleb128 0x6e
 	.4byte	.LASF1534
 	.4byte	.LASF1534
+	.uleb128 0x6c
+	.4byte	.LASF1533
+	.4byte	.LASF1533
+	.byte	0x64
+	.byte	0x1e
+	.uleb128 0x6e
+	.4byte	.LASF1535
+	.4byte	.LASF1535
 	.byte	0
 	.section	.debug_abbrev,"",@progbits
 .Ldebug_abbrev0:
@@ -16037,10 +16102,10 @@ crc32_table:
 	.byte	0x1
 	.uleb128 0x31
 	.uleb128 0x13
-	.uleb128 0x11
+	.uleb128 0x52
 	.uleb128 0x1
-	.uleb128 0x12
-	.uleb128 0x7
+	.uleb128 0x55
+	.uleb128 0x17
 	.uleb128 0x58
 	.uleb128 0xb
 	.uleb128 0x59
@@ -16056,7 +16121,38 @@ crc32_table:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x4c
+	.uleb128 0x4c
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x55
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x4d
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x4e
+	.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 0x4f
 	.uleb128 0xb
 	.byte	0x1
 	.uleb128 0x11
@@ -16065,14 +16161,7 @@ crc32_table:
 	.uleb128 0x7
 	.byte	0
 	.byte	0
-	.uleb128 0x4d
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x31
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x50
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x31
@@ -16081,7 +16170,7 @@ crc32_table:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x4f
+	.uleb128 0x51
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -16096,14 +16185,7 @@ crc32_table:
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x50
-	.uleb128 0xb
-	.byte	0x1
-	.uleb128 0x55
-	.uleb128 0x17
-	.byte	0
-	.byte	0
-	.uleb128 0x51
+	.uleb128 0x52
 	.uleb128 0xb
 	.byte	0x1
 	.uleb128 0x55
@@ -16112,7 +16194,7 @@ crc32_table:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x52
+	.uleb128 0x53
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -16127,7 +16209,7 @@ crc32_table:
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x53
+	.uleb128 0x54
 	.uleb128 0x4109
 	.byte	0
 	.uleb128 0x11
@@ -16136,23 +16218,6 @@ crc32_table:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x54
-	.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 0x55
 	.uleb128 0x1d
 	.byte	0x1
@@ -16236,6 +16301,19 @@ crc32_table:
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
+	.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 0x5c
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -16254,7 +16332,7 @@ crc32_table:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
+	.uleb128 0x5d
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -16267,7 +16345,7 @@ crc32_table:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x5d
+	.uleb128 0x5e
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -16292,7 +16370,7 @@ crc32_table:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -16307,7 +16385,7 @@ crc32_table:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x5f
+	.uleb128 0x60
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -16320,7 +16398,7 @@ crc32_table:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x60
+	.uleb128 0x61
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -16337,7 +16415,7 @@ crc32_table:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x61
+	.uleb128 0x62
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -16352,7 +16430,7 @@ crc32_table:
 	.uleb128 0x5
 	.byte	0
 	.byte	0
-	.uleb128 0x62
+	.uleb128 0x63
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -16365,14 +16443,14 @@ crc32_table:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x63
+	.uleb128 0x64
 	.uleb128 0xb
 	.byte	0x1
 	.uleb128 0x1
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x64
+	.uleb128 0x65
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -16397,7 +16475,7 @@ crc32_table:
 	.uleb128 0x19
 	.byte	0
 	.byte	0
-	.uleb128 0x65
+	.uleb128 0x66
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3f
@@ -16424,7 +16502,7 @@ crc32_table:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x66
+	.uleb128 0x67
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -16441,7 +16519,7 @@ crc32_table:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x67
+	.uleb128 0x68
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -16454,7 +16532,7 @@ crc32_table:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x68
+	.uleb128 0x69
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -16471,7 +16549,7 @@ crc32_table:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x69
+	.uleb128 0x6a
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x31
@@ -16488,7 +16566,7 @@ crc32_table:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x6a
+	.uleb128 0x6b
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x31
@@ -16497,7 +16575,7 @@ crc32_table:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x6b
+	.uleb128 0x6c
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -16511,10 +16589,10 @@ crc32_table:
 	.uleb128 0x3a
 	.uleb128 0xb
 	.uleb128 0x3b
-	.uleb128 0x5
+	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x6c
+	.uleb128 0x6d
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -16528,10 +16606,10 @@ crc32_table:
 	.uleb128 0x3a
 	.uleb128 0xb
 	.uleb128 0x3b
-	.uleb128 0xb
+	.uleb128 0x5
 	.byte	0
 	.byte	0
-	.uleb128 0x6d
+	.uleb128 0x6e
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -16553,26 +16631,26 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL61-.Ltext0
-	.8byte	.LVL90-.Ltext0
+	.8byte	.LVL91-.Ltext0
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL92-.Ltext0
 	.8byte	.LVL93-.Ltext0
+	.8byte	.LVL94-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL93-.Ltext0
-	.8byte	.LVL124-.Ltext0
+	.8byte	.LVL94-.Ltext0
+	.8byte	.LVL129-.Ltext0
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL124-.Ltext0
-	.8byte	.LVL125-.Ltext0
+	.8byte	.LVL129-.Ltext0
+	.8byte	.LVL130-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL126-.Ltext0
-	.8byte	.LVL127-.Ltext0
+	.8byte	.LVL131-.Ltext0
+	.8byte	.LVL132-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL128-.Ltext0
+	.8byte	.LVL133-.Ltext0
 	.8byte	.LFE1565-.Ltext0
 	.2byte	0x1
 	.byte	0x63
@@ -16587,31 +16665,35 @@ crc32_table:
 	.8byte	.LVL64-.Ltext0
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL88-.Ltext0
-	.8byte	.LVL93-.Ltext0
+	.8byte	.LVL90-.Ltext0
+	.8byte	.LVL94-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL96-.Ltext0
-	.8byte	.LVL101-.Ltext0
+	.8byte	.LVL98-.Ltext0
+	.8byte	.LVL106-.Ltext0
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL103-.Ltext0
 	.8byte	.LVL108-.Ltext0
+	.8byte	.LVL113-.Ltext0
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL116-.Ltext0
-	.8byte	.LVL120-.Ltext0
+	.8byte	.LVL121-.Ltext0
+	.8byte	.LVL125-.Ltext0
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL121-.Ltext0
-	.8byte	.LVL124-.Ltext0
+	.8byte	.LVL126-.Ltext0
+	.8byte	.LVL129-.Ltext0
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL124-.Ltext0
-	.8byte	.LVL128-.Ltext0
+	.8byte	.LVL129-.Ltext0
+	.8byte	.LVL133-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL128-.Ltext0
+	.8byte	.LVL133-.Ltext0
+	.8byte	.LVL144-.Ltext0
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL146-.Ltext0
 	.8byte	.LFE1565-.Ltext0
 	.2byte	0x1
 	.byte	0x64
@@ -16626,36 +16708,36 @@ crc32_table:
 	.8byte	.LVL67-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL88-.Ltext0
-	.8byte	.LVL93-.Ltext0
+	.8byte	.LVL90-.Ltext0
+	.8byte	.LVL94-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL96-.Ltext0
 	.8byte	.LVL98-.Ltext0
+	.8byte	.LVL99-.Ltext0
 	.2byte	0x1
 	.byte	0x52
+	.8byte	.LVL101-.Ltext0
 	.8byte	.LVL103-.Ltext0
-	.8byte	.LVL104-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL117-.Ltext0
-	.8byte	.LVL118-.Ltext0
+	.8byte	.LVL108-.Ltext0
+	.8byte	.LVL109-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL121-.Ltext0
 	.8byte	.LVL122-.Ltext0
+	.8byte	.LVL123-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL124-.Ltext0
-	.8byte	.LVL129-.Ltext0
+	.8byte	.LVL126-.Ltext0
+	.8byte	.LVL127-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL131-.Ltext0
-	.8byte	.LVL132-.Ltext0
+	.8byte	.LVL129-.Ltext0
+	.8byte	.LVL134-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL138-.Ltext0
-	.8byte	.LVL139-.Ltext0
+	.8byte	.LVL140-.Ltext0
+	.8byte	.LVL141-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
@@ -16672,8 +16754,8 @@ crc32_table:
 	.8byte	.LVL69-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL94-.Ltext0
-	.8byte	.LVL95-.Ltext0
+	.8byte	.LVL97-.Ltext0
+	.8byte	.LVL98-.Ltext0
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
@@ -16683,8 +16765,8 @@ crc32_table:
 	.8byte	.LVL68-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL94-.Ltext0
-	.8byte	.LVL95-.Ltext0
+	.8byte	.LVL97-.Ltext0
+	.8byte	.LVL98-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
@@ -16694,8 +16776,8 @@ crc32_table:
 	.8byte	.LVL70-1-.Ltext0
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL94-.Ltext0
-	.8byte	.LVL95-.Ltext0
+	.8byte	.LVL97-.Ltext0
+	.8byte	.LVL98-.Ltext0
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
@@ -16705,8 +16787,8 @@ crc32_table:
 	.8byte	.LVL76-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL93-.Ltext0
 	.8byte	.LVL94-.Ltext0
+	.8byte	.LVL95-.Ltext0
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
@@ -16716,8 +16798,8 @@ crc32_table:
 	.8byte	.LVL75-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL93-.Ltext0
 	.8byte	.LVL94-.Ltext0
+	.8byte	.LVL95-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
@@ -16727,242 +16809,257 @@ crc32_table:
 	.8byte	.LVL74-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL93-.Ltext0
 	.8byte	.LVL94-.Ltext0
+	.8byte	.LVL95-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST23:
-	.8byte	.LVL78-.Ltext0
-	.8byte	.LVL82-1-.Ltext0
+	.8byte	.LVL79-.Ltext0
+	.8byte	.LVL83-1-.Ltext0
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST24:
-	.8byte	.LVL80-.Ltext0
-	.8byte	.LVL82-1-.Ltext0
+	.8byte	.LVL81-.Ltext0
+	.8byte	.LVL83-1-.Ltext0
 	.2byte	0x1
-	.byte	0x53
+	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST25:
-	.8byte	.LVL79-.Ltext0
-	.8byte	.LVL82-1-.Ltext0
+	.8byte	.LVL80-.Ltext0
+	.8byte	.LVL83-1-.Ltext0
 	.2byte	0x1
-	.byte	0x54
+	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST26:
-	.8byte	.LVL81-.Ltext0
-	.8byte	.LVL91-.Ltext0
+	.8byte	.LVL78-.Ltext0
+	.8byte	.LVL80-.Ltext0
 	.2byte	0x1
-	.byte	0x66
+	.byte	0x53
 	.8byte	.LVL95-.Ltext0
-	.8byte	.LVL97-.Ltext0
+	.8byte	.LVL96-1-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST27:
+	.8byte	.LVL82-.Ltext0
+	.8byte	.LVL92-.Ltext0
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL107-.Ltext0
-	.8byte	.LVL116-.Ltext0
+	.8byte	.LVL101-.Ltext0
+	.8byte	.LVL102-.Ltext0
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL112-.Ltext0
+	.8byte	.LVL121-.Ltext0
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL144-.Ltext0
+	.8byte	.LVL146-.Ltext0
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST27:
-	.8byte	.LVL104-.Ltext0
-	.8byte	.LVL109-1-.Ltext0
+.LLST28:
+	.8byte	.LVL109-.Ltext0
+	.8byte	.LVL114-1-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL142-.Ltext0
+	.8byte	.LVL146-.Ltext0
 	.8byte	.LFE1565-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST28:
-	.8byte	.LVL106-.Ltext0
-	.8byte	.LVL109-1-.Ltext0
+.LLST29:
+	.8byte	.LVL111-.Ltext0
+	.8byte	.LVL114-1-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL142-.Ltext0
+	.8byte	.LVL146-.Ltext0
 	.8byte	.LFE1565-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST29:
-	.8byte	.LVL105-.Ltext0
-	.8byte	.LVL109-1-.Ltext0
+.LLST30:
+	.8byte	.LVL110-.Ltext0
+	.8byte	.LVL114-1-.Ltext0
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL142-.Ltext0
+	.8byte	.LVL146-.Ltext0
 	.8byte	.LFE1565-.Ltext0
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST30:
-	.8byte	.LVL81-.Ltext0
-	.8byte	.LVL82-1-.Ltext0
+.LLST31:
+	.8byte	.LVL82-.Ltext0
+	.8byte	.LVL83-1-.Ltext0
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL111-.Ltext0
-	.8byte	.LVL112-.Ltext0
+	.8byte	.LVL116-.Ltext0
+	.8byte	.LVL117-.Ltext0
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL113-.Ltext0
-	.8byte	.LVL116-.Ltext0
+	.8byte	.LVL118-.Ltext0
+	.8byte	.LVL121-.Ltext0
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST31:
-	.8byte	.LVL81-.Ltext0
-	.8byte	.LVL82-1-.Ltext0
+.LLST32:
+	.8byte	.LVL82-.Ltext0
+	.8byte	.LVL83-1-.Ltext0
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL111-.Ltext0
-	.8byte	.LVL114-.Ltext0
+	.8byte	.LVL116-.Ltext0
+	.8byte	.LVL119-.Ltext0
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL115-.Ltext0
-	.8byte	.LVL116-.Ltext0
+	.8byte	.LVL120-.Ltext0
+	.8byte	.LVL121-.Ltext0
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST32:
-	.8byte	.LVL81-.Ltext0
-	.8byte	.LVL82-1-.Ltext0
+.LLST33:
+	.8byte	.LVL82-.Ltext0
+	.8byte	.LVL83-1-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL111-.Ltext0
 	.8byte	.LVL116-.Ltext0
+	.8byte	.LVL121-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST33:
-	.8byte	.LVL85-.Ltext0
-	.8byte	.LVL92-.Ltext0
-	.2byte	0x1
-	.byte	0x5a
-	.8byte	0
-	.8byte	0
 .LLST34:
-	.8byte	.LVL85-.Ltext0
-	.8byte	.LVL92-.Ltext0
+	.8byte	.LVL87-.Ltext0
+	.8byte	.LVL93-.Ltext0
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x5a
 	.8byte	0
 	.8byte	0
 .LLST35:
-	.8byte	.LVL84-.Ltext0
-	.8byte	.LVL90-.Ltext0
+	.8byte	.LVL87-.Ltext0
+	.8byte	.LVL93-.Ltext0
 	.2byte	0x1
-	.byte	0x64
+	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST36:
 	.8byte	.LVL85-.Ltext0
 	.8byte	.LVL86-.Ltext0
 	.2byte	0x1
-	.byte	0x5b
-	.8byte	.LVL87-.Ltext0
-	.8byte	.LVL92-.Ltext0
+	.byte	0x5c
+	.8byte	.LVL90-.Ltext0
+	.8byte	.LVL93-.Ltext0
 	.2byte	0x1
-	.byte	0x5b
+	.byte	0x5c
 	.8byte	0
 	.8byte	0
 .LLST37:
-	.8byte	.LVL83-.Ltext0
-	.8byte	.LVL84-.Ltext0
+	.8byte	.LVL87-.Ltext0
+	.8byte	.LVL88-.Ltext0
 	.2byte	0x1
-	.byte	0x64
+	.byte	0x5b
 	.8byte	.LVL89-.Ltext0
-	.8byte	.LVL90-.Ltext0
+	.8byte	.LVL93-.Ltext0
 	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL96-.Ltext0
-	.8byte	.LVL97-.Ltext0
+	.byte	0x5b
+	.8byte	0
+	.8byte	0
+.LLST38:
+	.8byte	.LVL84-.Ltext0
+	.8byte	.LVL91-.Ltext0
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL101-.Ltext0
-	.8byte	.LVL103-.Ltext0
+	.8byte	.LVL102-.Ltext0
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL106-.Ltext0
+	.8byte	.LVL108-.Ltext0
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST38:
-	.8byte	.LVL98-.Ltext0
-	.8byte	.LVL102-1-.Ltext0
+.LLST39:
+	.8byte	.LVL103-.Ltext0
+	.8byte	.LVL107-1-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL116-.Ltext0
-	.8byte	.LVL117-.Ltext0
+	.8byte	.LVL121-.Ltext0
+	.8byte	.LVL122-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST39:
-	.8byte	.LVL100-.Ltext0
-	.8byte	.LVL102-1-.Ltext0
+.LLST40:
+	.8byte	.LVL105-.Ltext0
+	.8byte	.LVL107-1-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL116-.Ltext0
-	.8byte	.LVL117-.Ltext0
+	.8byte	.LVL121-.Ltext0
+	.8byte	.LVL122-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST40:
-	.8byte	.LVL99-.Ltext0
-	.8byte	.LVL102-1-.Ltext0
+.LLST41:
+	.8byte	.LVL104-.Ltext0
+	.8byte	.LVL107-1-.Ltext0
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL116-.Ltext0
-	.8byte	.LVL117-.Ltext0
+	.8byte	.LVL121-.Ltext0
+	.8byte	.LVL122-.Ltext0
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST41:
-	.8byte	.LVL135-.Ltext0
-	.8byte	.LVL136-.Ltext0
+.LLST42:
+	.8byte	.LVL137-.Ltext0
+	.8byte	.LVL138-.Ltext0
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST42:
-	.8byte	.LVL132-.Ltext0
-	.8byte	.LVL137-1-.Ltext0
+.LLST43:
+	.8byte	.LVL134-.Ltext0
+	.8byte	.LVL139-1-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL141-.Ltext0
-	.8byte	.LVL142-.Ltext0
+	.8byte	.LVL143-.Ltext0
+	.8byte	.LVL144-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST43:
-	.8byte	.LVL134-.Ltext0
-	.8byte	.LVL137-1-.Ltext0
+.LLST44:
+	.8byte	.LVL136-.Ltext0
+	.8byte	.LVL139-1-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL141-.Ltext0
-	.8byte	.LVL142-.Ltext0
+	.8byte	.LVL143-.Ltext0
+	.8byte	.LVL144-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST44:
-	.8byte	.LVL133-.Ltext0
-	.8byte	.LVL137-1-.Ltext0
+.LLST45:
+	.8byte	.LVL135-.Ltext0
+	.8byte	.LVL139-1-.Ltext0
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL141-.Ltext0
-	.8byte	.LVL142-.Ltext0
+	.8byte	.LVL143-.Ltext0
+	.8byte	.LVL144-.Ltext0
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
@@ -17188,184 +17285,196 @@ crc32_table:
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
 .Ldebug_ranges0:
-	.8byte	.LBB205-.Ltext0
-	.8byte	.LBE205-.Ltext0
-	.8byte	.LBB212-.Ltext0
-	.8byte	.LBE212-.Ltext0
-	.8byte	.LBB213-.Ltext0
-	.8byte	.LBE213-.Ltext0
+	.8byte	.LBB203-.Ltext0
+	.8byte	.LBE203-.Ltext0
+	.8byte	.LBB210-.Ltext0
+	.8byte	.LBE210-.Ltext0
+	.8byte	.LBB211-.Ltext0
+	.8byte	.LBE211-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB222-.Ltext0
-	.8byte	.LBE222-.Ltext0
+	.8byte	.LBB220-.Ltext0
+	.8byte	.LBE220-.Ltext0
+	.8byte	.LBB233-.Ltext0
+	.8byte	.LBE233-.Ltext0
+	.8byte	.LBB234-.Ltext0
+	.8byte	.LBE234-.Ltext0
 	.8byte	.LBB235-.Ltext0
 	.8byte	.LBE235-.Ltext0
-	.8byte	.LBB236-.Ltext0
-	.8byte	.LBE236-.Ltext0
-	.8byte	.LBB237-.Ltext0
-	.8byte	.LBE237-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB224-.Ltext0
-	.8byte	.LBE224-.Ltext0
-	.8byte	.LBB231-.Ltext0
-	.8byte	.LBE231-.Ltext0
+	.8byte	.LBB222-.Ltext0
+	.8byte	.LBE222-.Ltext0
+	.8byte	.LBB229-.Ltext0
+	.8byte	.LBE229-.Ltext0
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB224-.Ltext0
+	.8byte	.LBE224-.Ltext0
 	.8byte	.LBB226-.Ltext0
 	.8byte	.LBE226-.Ltext0
-	.8byte	.LBB228-.Ltext0
-	.8byte	.LBE228-.Ltext0
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB225-.Ltext0
+	.8byte	.LBE225-.Ltext0
 	.8byte	.LBB227-.Ltext0
 	.8byte	.LBE227-.Ltext0
-	.8byte	.LBB229-.Ltext0
-	.8byte	.LBE229-.Ltext0
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB246-.Ltext0
-	.8byte	.LBE246-.Ltext0
-	.8byte	.LBB261-.Ltext0
-	.8byte	.LBE261-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB249-.Ltext0
-	.8byte	.LBE249-.Ltext0
-	.8byte	.LBB260-.Ltext0
-	.8byte	.LBE260-.Ltext0
+	.8byte	.LBB244-.Ltext0
+	.8byte	.LBE244-.Ltext0
+	.8byte	.LBB259-.Ltext0
+	.8byte	.LBE259-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB253-.Ltext0
-	.8byte	.LBE253-.Ltext0
-	.8byte	.LBB257-.Ltext0
-	.8byte	.LBE257-.Ltext0
+	.8byte	.LBB247-.Ltext0
+	.8byte	.LBE247-.Ltext0
 	.8byte	.LBB258-.Ltext0
 	.8byte	.LBE258-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB336-.Ltext0
-	.8byte	.LBE336-.Ltext0
+	.8byte	.LBB251-.Ltext0
+	.8byte	.LBE251-.Ltext0
+	.8byte	.LBB255-.Ltext0
+	.8byte	.LBE255-.Ltext0
+	.8byte	.LBB256-.Ltext0
+	.8byte	.LBE256-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB330-.Ltext0
+	.8byte	.LBE330-.Ltext0
+	.8byte	.LBB391-.Ltext0
+	.8byte	.LBE391-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB334-.Ltext0
+	.8byte	.LBE334-.Ltext0
+	.8byte	.LBB345-.Ltext0
+	.8byte	.LBE345-.Ltext0
+	.8byte	.LBB346-.Ltext0
+	.8byte	.LBE346-.Ltext0
 	.8byte	.LBB347-.Ltext0
 	.8byte	.LBE347-.Ltext0
-	.8byte	.LBB348-.Ltext0
-	.8byte	.LBE348-.Ltext0
-	.8byte	.LBB349-.Ltext0
-	.8byte	.LBE349-.Ltext0
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB336-.Ltext0
+	.8byte	.LBE336-.Ltext0
+	.8byte	.LBB339-.Ltext0
+	.8byte	.LBE339-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB337-.Ltext0
+	.8byte	.LBE337-.Ltext0
 	.8byte	.LBB338-.Ltext0
 	.8byte	.LBE338-.Ltext0
+	.8byte	.LBB340-.Ltext0
+	.8byte	.LBE340-.Ltext0
 	.8byte	.LBB341-.Ltext0
 	.8byte	.LBE341-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB339-.Ltext0
-	.8byte	.LBE339-.Ltext0
-	.8byte	.LBB340-.Ltext0
-	.8byte	.LBE340-.Ltext0
-	.8byte	.LBB342-.Ltext0
-	.8byte	.LBE342-.Ltext0
-	.8byte	.LBB343-.Ltext0
-	.8byte	.LBE343-.Ltext0
+	.8byte	.LBB354-.Ltext0
+	.8byte	.LBE354-.Ltext0
+	.8byte	.LBB357-.Ltext0
+	.8byte	.LBE357-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB358-.Ltext0
-	.8byte	.LBE358-.Ltext0
-	.8byte	.LBB390-.Ltext0
-	.8byte	.LBE390-.Ltext0
-	.8byte	.LBB409-.Ltext0
-	.8byte	.LBE409-.Ltext0
+	.8byte	.LBB359-.Ltext0
+	.8byte	.LBE359-.Ltext0
+	.8byte	.LBB410-.Ltext0
+	.8byte	.LBE410-.Ltext0
+	.8byte	.LBB429-.Ltext0
+	.8byte	.LBE429-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB362-.Ltext0
-	.8byte	.LBE362-.Ltext0
-	.8byte	.LBB373-.Ltext0
-	.8byte	.LBE373-.Ltext0
+	.8byte	.LBB363-.Ltext0
+	.8byte	.LBE363-.Ltext0
 	.8byte	.LBB374-.Ltext0
 	.8byte	.LBE374-.Ltext0
 	.8byte	.LBB375-.Ltext0
 	.8byte	.LBE375-.Ltext0
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB364-.Ltext0
-	.8byte	.LBE364-.Ltext0
-	.8byte	.LBB367-.Ltext0
-	.8byte	.LBE367-.Ltext0
+	.8byte	.LBB376-.Ltext0
+	.8byte	.LBE376-.Ltext0
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB365-.Ltext0
 	.8byte	.LBE365-.Ltext0
-	.8byte	.LBB366-.Ltext0
-	.8byte	.LBE366-.Ltext0
 	.8byte	.LBB368-.Ltext0
 	.8byte	.LBE368-.Ltext0
-	.8byte	.LBB369-.Ltext0
-	.8byte	.LBE369-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB386-.Ltext0
-	.8byte	.LBE386-.Ltext0
-	.8byte	.LBB389-.Ltext0
-	.8byte	.LBE389-.Ltext0
+	.8byte	.LBB366-.Ltext0
+	.8byte	.LBE366-.Ltext0
+	.8byte	.LBB367-.Ltext0
+	.8byte	.LBE367-.Ltext0
+	.8byte	.LBB369-.Ltext0
+	.8byte	.LBE369-.Ltext0
+	.8byte	.LBB370-.Ltext0
+	.8byte	.LBE370-.Ltext0
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB387-.Ltext0
 	.8byte	.LBE387-.Ltext0
+	.8byte	.LBB390-.Ltext0
+	.8byte	.LBE390-.Ltext0
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB388-.Ltext0
 	.8byte	.LBE388-.Ltext0
+	.8byte	.LBB389-.Ltext0
+	.8byte	.LBE389-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB395-.Ltext0
-	.8byte	.LBE395-.Ltext0
-	.8byte	.LBB406-.Ltext0
-	.8byte	.LBE406-.Ltext0
+	.8byte	.LBB396-.Ltext0
+	.8byte	.LBE396-.Ltext0
 	.8byte	.LBB407-.Ltext0
 	.8byte	.LBE407-.Ltext0
 	.8byte	.LBB408-.Ltext0
 	.8byte	.LBE408-.Ltext0
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB397-.Ltext0
-	.8byte	.LBE397-.Ltext0
-	.8byte	.LBB400-.Ltext0
-	.8byte	.LBE400-.Ltext0
+	.8byte	.LBB409-.Ltext0
+	.8byte	.LBE409-.Ltext0
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB398-.Ltext0
 	.8byte	.LBE398-.Ltext0
-	.8byte	.LBB399-.Ltext0
-	.8byte	.LBE399-.Ltext0
 	.8byte	.LBB401-.Ltext0
 	.8byte	.LBE401-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB399-.Ltext0
+	.8byte	.LBE399-.Ltext0
+	.8byte	.LBB400-.Ltext0
+	.8byte	.LBE400-.Ltext0
 	.8byte	.LBB402-.Ltext0
 	.8byte	.LBE402-.Ltext0
+	.8byte	.LBB403-.Ltext0
+	.8byte	.LBE403-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB414-.Ltext0
-	.8byte	.LBE414-.Ltext0
-	.8byte	.LBB425-.Ltext0
-	.8byte	.LBE425-.Ltext0
+	.8byte	.LBB415-.Ltext0
+	.8byte	.LBE415-.Ltext0
 	.8byte	.LBB426-.Ltext0
 	.8byte	.LBE426-.Ltext0
 	.8byte	.LBB427-.Ltext0
 	.8byte	.LBE427-.Ltext0
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB416-.Ltext0
-	.8byte	.LBE416-.Ltext0
-	.8byte	.LBB419-.Ltext0
-	.8byte	.LBE419-.Ltext0
+	.8byte	.LBB428-.Ltext0
+	.8byte	.LBE428-.Ltext0
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB417-.Ltext0
 	.8byte	.LBE417-.Ltext0
-	.8byte	.LBB418-.Ltext0
-	.8byte	.LBE418-.Ltext0
 	.8byte	.LBB420-.Ltext0
 	.8byte	.LBE420-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB418-.Ltext0
+	.8byte	.LBE418-.Ltext0
+	.8byte	.LBB419-.Ltext0
+	.8byte	.LBE419-.Ltext0
 	.8byte	.LBB421-.Ltext0
 	.8byte	.LBE421-.Ltext0
+	.8byte	.LBB422-.Ltext0
+	.8byte	.LBE422-.Ltext0
 	.8byte	0
 	.8byte	0
 	.section	.debug_line,"",@progbits
@@ -17405,13 +17514,15 @@ crc32_table:
 	.string	"runnable_weight"
 .LASF321:
 	.string	"pushable_dl_tasks"
+.LASF1490:
+	.string	"__func__"
 .LASF701:
 	.string	"cpu_number"
 .LASF132:
 	.string	"locked_pending"
 .LASF345:
 	.string	"stack_canary"
-.LASF1507:
+.LASF1508:
 	.string	"readcrc"
 .LASF326:
 	.string	"exit_code"
@@ -17447,7 +17558,7 @@ crc32_table:
 	.string	"need_parent_lock"
 .LASF847:
 	.string	"mkdir"
-.LASF1502:
+.LASF1503:
 	.string	"rkf_wf_get_lut"
 .LASF37:
 	.string	"_Bool"
@@ -17665,7 +17776,7 @@ crc32_table:
 	.string	"__rb_parent_color"
 .LASF241:
 	.string	"__initdata_end"
-.LASF1527:
+.LASF1528:
 	.string	"__fls"
 .LASF980:
 	.string	"si_errno"
@@ -17685,7 +17796,7 @@ crc32_table:
 	.string	"subsys_private"
 .LASF875:
 	.string	"compat_time_t"
-.LASF1503:
+.LASF1504:
 	.string	"rkf_wf_input"
 .LASF1278:
 	.string	"direct_complete"
@@ -17909,7 +18020,7 @@ crc32_table:
 	.string	"runnable_load_sum"
 .LASF407:
 	.string	"last_siginfo"
-.LASF1523:
+.LASF1524:
 	.string	"kmalloc_type"
 .LASF146:
 	.string	"elf_hwcap"
@@ -17937,9 +18048,9 @@ crc32_table:
 	.string	"pending"
 .LASF522:
 	.string	"N_ONLINE"
-.LASF1490:
-	.string	"decode_wf_reset"
 .LASF1491:
+	.string	"decode_wf_reset"
+.LASF1492:
 	.string	"temp_data"
 .LASF1113:
 	.string	"mm_struct"
@@ -17953,7 +18064,7 @@ crc32_table:
 	.string	"remove"
 .LASF276:
 	.string	"debug_locks_silent"
-.LASF1526:
+.LASF1527:
 	.string	"fls64"
 .LASF1103:
 	.string	"perf_invalid_context"
@@ -18093,7 +18204,7 @@ crc32_table:
 	.string	"MIGRATE_TYPES"
 .LASF25:
 	.string	"__kernel_loff_t"
-.LASF1514:
+.LASF1515:
 	.string	"crc_build_table32"
 .LASF180:
 	.string	"arm64_ftr_reg_ctrel0"
@@ -18101,7 +18212,7 @@ crc32_table:
 	.string	"PIDTYPE_TGID"
 .LASF1161:
 	.string	"kobj"
-.LASF1495:
+.LASF1496:
 	.string	"templist"
 .LASF165:
 	.string	"FTR_HIGHER_SAFE"
@@ -18223,7 +18334,7 @@ crc32_table:
 	.string	"NR_KMALLOC_TYPES"
 .LASF1293:
 	.string	"disable_depth"
-.LASF1531:
+.LASF1533:
 	.string	"strncmp"
 .LASF867:
 	.string	"KOBJ_NS_TYPES"
@@ -18255,7 +18366,7 @@ crc32_table:
 	.string	"cpu_bit_bitmap"
 .LASF1079:
 	.string	"timeout"
-.LASF1530:
+.LASF1532:
 	.string	"kfree"
 .LASF587:
 	.string	"NR_FILE_MAPPED"
@@ -18283,7 +18394,7 @@ crc32_table:
 	.string	"stat_threshold"
 .LASF1118:
 	.string	"rt_mutex_waiter"
-.LASF1537:
+.LASF1538:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF703:
 	.string	"secondary_data"
@@ -18343,7 +18454,7 @@ crc32_table:
 	.string	"wake_irq"
 .LASF825:
 	.string	"open"
-.LASF1511:
+.LASF1512:
 	.string	"a_size"
 .LASF507:
 	.string	"radix_tree_root"
@@ -18369,7 +18480,7 @@ crc32_table:
 	.string	"WF_TYPE_GRAY16"
 .LASF455:
 	.string	"android_kabi_reserved8"
-.LASF1533:
+.LASF1534:
 	.string	"memcpy"
 .LASF271:
 	.string	"debug"
@@ -18391,7 +18502,7 @@ crc32_table:
 	.string	"attribute_group"
 .LASF104:
 	.string	"panic_timeout"
-.LASF1500:
+.LASF1501:
 	.string	"__UNIQUE_ID___x55"
 .LASF791:
 	.string	"bitmap"
@@ -18403,9 +18514,9 @@ crc32_table:
 	.string	"dl_density"
 .LASF1262:
 	.string	"RPM_REQ_RESUME"
-.LASF1536:
+.LASF1537:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform.c"
-.LASF1538:
+.LASF1539:
 	.string	"frozen"
 .LASF190:
 	.string	"_text"
@@ -18421,7 +18532,7 @@ crc32_table:
 	.string	"mutex"
 .LASF826:
 	.string	"size"
-.LASF1522:
+.LASF1523:
 	.string	"kmalloc_index"
 .LASF1115:
 	.string	"files_struct"
@@ -18463,7 +18574,7 @@ crc32_table:
 	.string	"io_context"
 .LASF702:
 	.string	"__smp_cross_call"
-.LASF1493:
+.LASF1494:
 	.string	"get_wf_buf"
 .LASF1069:
 	.string	"exec_start"
@@ -18599,7 +18710,7 @@ crc32_table:
 	.string	"init_user_ns"
 .LASF1102:
 	.string	"perf_event_task_context"
-.LASF1504:
+.LASF1505:
 	.string	"waveform_file"
 .LASF1389:
 	.string	"segment_boundary_mask"
@@ -18621,7 +18732,7 @@ crc32_table:
 	.string	"archdata"
 .LASF27:
 	.string	"__kernel_clock_t"
-.LASF1520:
+.LASF1521:
 	.string	"kmalloc_large"
 .LASF1244:
 	.string	"iommu_group"
@@ -18639,7 +18750,7 @@ crc32_table:
 	.string	"__s32"
 .LASF435:
 	.string	"nr_dirtied_pause"
-.LASF1510:
+.LASF1511:
 	.string	"a_data"
 .LASF218:
 	.string	"__start_once"
@@ -18671,9 +18782,9 @@ crc32_table:
 	.string	"kimage_vaddr"
 .LASF1340:
 	.string	"begin"
-.LASF1499:
+.LASF1500:
 	.string	"__UNIQUE_ID___y54"
-.LASF1501:
+.LASF1502:
 	.string	"__UNIQUE_ID___y56"
 .LASF1376:
 	.string	"acpi_device_id"
@@ -18737,7 +18848,7 @@ crc32_table:
 	.string	"autosuspend_delay"
 .LASF1305:
 	.string	"request"
-.LASF1539:
+.LASF1540:
 	.string	"decode_wf_data"
 .LASF761:
 	.string	"contig_page_data"
@@ -18797,7 +18908,7 @@ crc32_table:
 	.string	"__cpu_present_mask"
 .LASF1186:
 	.string	"pm_power_off_prepare"
-.LASF1496:
+.LASF1497:
 	.string	"wf_offset"
 .LASF1162:
 	.string	"uevent_ops"
@@ -18851,7 +18962,7 @@ crc32_table:
 	.string	"system_highpri_wq"
 .LASF1018:
 	.string	"run_delay"
-.LASF1508:
+.LASF1509:
 	.string	"check_wf_format"
 .LASF1112:
 	.string	"rcu_node"
@@ -18871,7 +18982,7 @@ crc32_table:
 	.string	"drv_groups"
 .LASF112:
 	.string	"panic_cpu"
-.LASF1534:
+.LASF1535:
 	.string	"memset"
 .LASF1403:
 	.string	"irq_domain"
@@ -18959,13 +19070,13 @@ crc32_table:
 	.string	"HRTIMER_RESTART"
 .LASF1434:
 	.string	"rkf_waveform_type"
-.LASF1518:
+.LASF1519:
 	.string	"kzalloc"
 .LASF1267:
 	.string	"dev_pm_info"
 .LASF628:
 	.string	"node_present_pages"
-.LASF1492:
+.LASF1493:
 	.string	"get_wf_frm_num"
 .LASF325:
 	.string	"exit_state"
@@ -19087,7 +19198,7 @@ crc32_table:
 	.string	"N_POSSIBLE"
 .LASF96:
 	.string	"kmsg_fops"
-.LASF1505:
+.LASF1506:
 	.string	"check_wf_crc"
 .LASF443:
 	.string	"memcg_oom_order"
@@ -19159,7 +19270,7 @@ crc32_table:
 	.string	"last_switch_count"
 .LASF908:
 	.string	"cpu_base"
-.LASF1524:
+.LASF1525:
 	.string	"get_order"
 .LASF126:
 	.string	"module"
@@ -19175,7 +19286,7 @@ crc32_table:
 	.string	"pstate_check_t"
 .LASF954:
 	.string	"_sys_private"
-.LASF1513:
+.LASF1514:
 	.string	"decode_wf_auto"
 .LASF462:
 	.string	"tz_dsttime"
@@ -19189,7 +19300,7 @@ crc32_table:
 	.string	"util_est"
 .LASF270:
 	.string	"fault_code"
-.LASF1529:
+.LASF1531:
 	.string	"__kmalloc"
 .LASF88:
 	.string	"linux_banner"
@@ -19567,11 +19678,11 @@ crc32_table:
 	.string	"tick_usec"
 .LASF1300:
 	.string	"irq_safe"
-.LASF1498:
+.LASF1499:
 	.string	"__UNIQUE_ID___x53"
 .LASF982:
 	.string	"_sifields"
-.LASF1528:
+.LASF1529:
 	.string	"word"
 .LASF35:
 	.string	"clockid_t"
@@ -19679,7 +19790,7 @@ crc32_table:
 	.string	"wakeup_source"
 .LASF1202:
 	.string	"thaw_early"
-.LASF1525:
+.LASF1526:
 	.string	"__ilog2_u64"
 .LASF301:
 	.string	"boost"
@@ -19733,7 +19844,7 @@ crc32_table:
 	.string	"system_long_wq"
 .LASF430:
 	.string	"tlb_ubc"
-.LASF1517:
+.LASF1518:
 	.string	"n_data"
 .LASF1073:
 	.string	"statistics"
@@ -19813,7 +19924,7 @@ crc32_table:
 	.string	"device_node"
 .LASF730:
 	.string	"ktime_t"
-.LASF1532:
+.LASF1530:
 	.string	"printk"
 .LASF739:
 	.string	"data"
@@ -19855,7 +19966,7 @@ crc32_table:
 	.string	"SYSTEM_POWER_OFF"
 .LASF482:
 	.string	"poll"
-.LASF1509:
+.LASF1510:
 	.string	"crc_32"
 .LASF144:
 	.string	"compat_elf_hwcap"
@@ -19987,7 +20098,7 @@ crc32_table:
 	.string	"load_avg"
 .LASF530:
 	.string	"FDPIC_FUNCPTRS"
-.LASF1494:
+.LASF1495:
 	.string	"waveform"
 .LASF776:
 	.string	"thread_id"
@@ -20017,7 +20128,7 @@ crc32_table:
 	.string	"__nosave_begin"
 .LASF965:
 	.string	"_addr_pkey"
-.LASF1535:
+.LASF1536:
 	.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"
@@ -20069,7 +20180,7 @@ crc32_table:
 	.string	"syscore"
 .LASF873:
 	.string	"drop_ns"
-.LASF1515:
+.LASF1516:
 	.string	"a_poly"
 .LASF262:
 	.string	"tp2_value"
@@ -20097,7 +20208,7 @@ crc32_table:
 	.string	"bio_list"
 .LASF1382:
 	.string	"dev_release"
-.LASF1516:
+.LASF1517:
 	.string	"crc_table"
 .LASF844:
 	.string	"kernfs_syscall_ops"
@@ -20195,7 +20306,7 @@ crc32_table:
 	.string	"refaults"
 .LASF1000:
 	.string	"wchar"
-.LASF1506:
+.LASF1507:
 	.string	"crccheck"
 .LASF242:
 	.string	"__inittext_begin"
@@ -20223,7 +20334,7 @@ crc32_table:
 	.string	"sched_statistics"
 .LASF704:
 	.string	"task"
-.LASF1497:
+.LASF1498:
 	.string	"get_wf_level"
 .LASF578:
 	.string	"NR_SLAB_RECLAIMABLE"
@@ -20277,7 +20388,7 @@ crc32_table:
 	.string	"class_release"
 .LASF1010:
 	.string	"RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE_BIT"
-.LASF1512:
+.LASF1513:
 	.string	"n_accum"
 .LASF989:
 	.string	"MM_SWAPENTS"
@@ -20309,7 +20420,7 @@ crc32_table:
 	.string	"on_list"
 .LASF317:
 	.string	"rcu_tasks_holdout_list"
-.LASF1540:
+.LASF1541:
 	.string	"rkf_wf_get_version"
 .LASF404:
 	.string	"backing_dev_info"
@@ -20347,7 +20458,7 @@ crc32_table:
 	.string	"uevent_helper"
 .LASF1423:
 	.string	"WF_TYPE_AUTO"
-.LASF1519:
+.LASF1520:
 	.string	"kmalloc"
 .LASF994:
 	.string	"events"
@@ -20355,7 +20466,7 @@ crc32_table:
 	.string	"user_mask"
 .LASF113:
 	.string	"root_mountflags"
-.LASF1521:
+.LASF1522:
 	.string	"order"
 .LASF3:
 	.string	"unsigned int"

commit c5fc8738578d3a96f6044d87139da8a36bf2a81b
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Tue Nov 23 17:57:17 2021 +0800

    arm64: dts: rockchip: rk3566-eink: reserve ebc framebuff size 44M
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: Ic6be7988d78de4231f7325f67a55162cb15c65cc

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi
index 3e8c8295e5b6..c8686892d112 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi
@@ -14,7 +14,7 @@
 		};
 
 		display_reserved: framebuffer@10900000 {
-			reg = <0x0 0x10900000 0x0 0x2000000>;
+			reg = <0x0 0x10900000 0x0 0x2c00000>;
 		};
 	};
 

commit d91d0c5c66c66524cbd539d72c65c340bd19482b
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Tue Nov 23 11:09:44 2021 +0800

    drm/rockchip: ebc_dev: release version v2.15
    
    support 5bit waveform and ebc buf for regal mode
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: Icdb2874ac062d548dc9534383f25d03e67a2b720

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c b/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
index 32f3d1ccf5a3..5e824bcda91f 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
+++ b/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
@@ -69,56 +69,62 @@ int ebc_remove_from_dsp_buf_list(struct ebc_buf_s *remove_buf)
 	return BUF_SUCCESS;
 }
 
-int ebc_add_to_dsp_buf_list(struct ebc_buf_s *dsp_buf)
+static void do_dsp_buf_list(struct ebc_buf_s *dsp_buf)
 {
 	struct ebc_buf_s *temp_buf;
 	int temp_pos;
 	int is_full_mode = 0;
 
-	mutex_lock(&ebc_buf_info.dsp_buf_lock);
-	if (ebc_buf_info.dsp_buf_list) {
-		switch (dsp_buf->buf_mode) {
-		case EPD_OVERLAY:
+	switch (dsp_buf->buf_mode) {
+	case EPD_OVERLAY:
+		break;
+	case EPD_A2_ENTER:
+	case EPD_SUSPEND:
+	case EPD_RESUME:
+	case EPD_POWER_OFF:
+	case EPD_RESET:
+	case EPD_FORCE_FULL:
+		/*
+		 * add system display buf to dsp buf list directly when dsp buf list is not full,
+		 * otherwise, we need to remove some bufs from dsp buf list.
+		 */
+		if (ebc_buf_info.dsp_buf_list->nb_elt < ebc_buf_info.dsp_buf_list->maxelements)
 			break;
-		case EPD_A2_ENTER:
-		case EPD_SUSPEND:
-		case EPD_RESUME:
-		case EPD_POWER_OFF:
-		case EPD_RESET:
-		case EPD_FORCE_FULL:
-			/*
-			 * add system display buf to dsp buf list directly when dsp buf list is not full,
-			 * otherwise, we need to remove some bufs from dsp buf list.
-			 */
-			if (ebc_buf_info.dsp_buf_list->nb_elt < ebc_buf_info.dsp_buf_list->maxelements)
-				break;
-			/* fallthrough */
-		default:
-			if (ebc_buf_info.dsp_buf_list->nb_elt > 1) {
-				temp_pos = ebc_buf_info.dsp_buf_list->nb_elt;
-				while (--temp_pos) {
-					temp_buf = (struct ebc_buf_s *)buf_list_get(ebc_buf_info.dsp_buf_list, temp_pos);
-					if (temp_buf->buf_mode == EPD_OVERLAY) {
-						continue;
-					} else if (((temp_buf->buf_mode >= EPD_FULL_GC16) && (temp_buf->buf_mode <= EPD_DU4))
-						|| (temp_buf->buf_mode == EPD_AUTO)
-						|| (temp_buf->buf_mode == EPD_AUTO_DU)
-						|| (temp_buf->buf_mode == EPD_AUTO_DU4)) {
-						buf_list_remove(ebc_buf_info.dsp_buf_list, temp_pos);
-						ebc_buf_release(temp_buf);
-					} else if ((1 == is_full_mode)
-							&& (temp_buf->buf_mode != EPD_SUSPEND)
-							&& (temp_buf->buf_mode != EPD_RESUME)
-							&& (temp_buf->buf_mode != EPD_POWER_OFF)) {
-						buf_list_remove(ebc_buf_info.dsp_buf_list, temp_pos);
-						ebc_buf_release(temp_buf);
-					} else {
-						is_full_mode = 1;
-					}
+		/* fallthrough */
+	default:
+		if (ebc_buf_info.dsp_buf_list->nb_elt > 1) {
+			temp_pos = ebc_buf_info.dsp_buf_list->nb_elt;
+			while (--temp_pos) {
+				temp_buf = (struct ebc_buf_s *)buf_list_get(ebc_buf_info.dsp_buf_list, temp_pos);
+				if ((temp_buf->buf_mode == EPD_OVERLAY) || (temp_buf->needpic == WF_5BIT)) {
+					continue;
+				} else if (((temp_buf->buf_mode >= EPD_FULL_GC16) && (temp_buf->buf_mode <= EPD_DU4))
+					|| (temp_buf->buf_mode == EPD_AUTO)
+					|| (temp_buf->buf_mode == EPD_AUTO_DU)
+					|| (temp_buf->buf_mode == EPD_AUTO_DU4)) {
+					buf_list_remove(ebc_buf_info.dsp_buf_list, temp_pos);
+					ebc_buf_release(temp_buf);
+				} else if ((1 == is_full_mode)
+						&& (temp_buf->buf_mode != EPD_SUSPEND)
+						&& (temp_buf->buf_mode != EPD_RESUME)
+						&& (temp_buf->buf_mode != EPD_POWER_OFF)) {
+					buf_list_remove(ebc_buf_info.dsp_buf_list, temp_pos);
+					ebc_buf_release(temp_buf);
+				} else {
+					is_full_mode = 1;
 				}
 			}
-			break;
 		}
+		break;
+	}
+}
+
+int ebc_add_to_dsp_buf_list(struct ebc_buf_s *dsp_buf)
+{
+	mutex_lock(&ebc_buf_info.dsp_buf_lock);
+	if (ebc_buf_info.dsp_buf_list) {
+		if (dsp_buf->needpic != WF_5BIT)
+			do_dsp_buf_list(dsp_buf);
 
 		if (-1 == buf_list_add(ebc_buf_info.dsp_buf_list, (int *)dsp_buf, -1)) {
 			ebc_buf_release(dsp_buf);
@@ -128,7 +134,6 @@ int ebc_add_to_dsp_buf_list(struct ebc_buf_s *dsp_buf)
 
 		if (dsp_buf->status != buf_osd)
 			dsp_buf->status = buf_dsp;
-
 	}
 	mutex_unlock(&ebc_buf_info.dsp_buf_lock);
 
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h b/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h
index 695e64645b76..773619ee4a6c 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h
+++ b/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h
@@ -30,6 +30,7 @@ struct ebc_buf_s {
 	int win_y1;
 	int win_x2;
 	int win_y2;
+	int needpic;
 };
 
 struct ebc_buf_s *ebc_osd_buf_get(void);
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
index c745dc16d4ea..bbcc38215287 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
@@ -25,6 +25,9 @@
 #define EBC_SUCCESS		(0)
 #define EBC_ERROR		(-1)
 
+#define WF_4BIT		16
+#define WF_5BIT		32
+
 /*
  * ebc status notify
  */
@@ -98,6 +101,7 @@ struct ebc_buf_info {
 	int win_y2;
 	int width_mm;
 	int height_mm;
+	int needpic;
 };
 
 #if IS_ENABLED(CONFIG_ROCKCHIP_EBC_DEV)
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index 704816983942..340bd54bfdea 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -21,7 +21,7 @@ __initcall_ebc_init6s:
 	.p2align 3,,7
 	.type	get_auto_image, %function
 get_auto_image:
-.LFB2812:
+.LFB2813:
 	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
 	.loc 1 458 0
 	.cfi_startproc
@@ -523,483 +523,388 @@ get_auto_image:
 	.cfi_restore 30
 	ret
 	.cfi_endproc
-.LFE2812:
+.LFE2813:
 	.size	get_auto_image, .-get_auto_image
 	.align	2
 	.p2align 3,,7
 	.type	get_overlay_image, %function
 get_overlay_image:
-.LFB2813:
+.LFB2814:
 	.loc 1 623 0
 	.cfi_startproc
 .LVL32:
-	stp	x29, x30, [sp, -96]!
-	.cfi_def_cfa_offset 96
-	.cfi_offset 29, -96
-	.cfi_offset 30, -88
 	.loc 1 624 0
 	adrp	x5, .LANCHOR0
-	.loc 1 623 0
-	add	x29, sp, 0
-	.cfi_def_cfa_register 29
+	.loc 1 632 0
+	ldrb	w11, [x4, 48]
+.LVL33:
 	.loc 1 624 0
-	ldr	x17, [x5, #:lo12:.LANCHOR0]
-	.loc 1 623 0
-	stp	x19, x20, [sp, 16]
+	ldr	x16, [x5, #:lo12:.LANCHOR0]
 	.loc 1 636 0
-	add	x17, x17, 24
-	.loc 1 623 0
-	stp	x21, x22, [sp, 32]
-	stp	x23, x24, [sp, 48]
-	stp	x25, x26, [sp, 64]
-	str	x27, [sp, 80]
-	.cfi_offset 19, -80
-	.cfi_offset 20, -72
-	.cfi_offset 21, -64
-	.cfi_offset 22, -56
-	.cfi_offset 23, -48
-	.cfi_offset 24, -40
-	.cfi_offset 25, -32
-	.cfi_offset 26, -24
-	.cfi_offset 27, -16
+	add	x16, x16, 24
+	ldr	w18, [x16, 156]
 	.loc 1 642 0
-	ldp	w11, w18, [x17, 84]
-	.loc 1 636 0
-	ldr	w30, [x17, 156]
+	ldp	w12, w17, [x16, 84]
 	.loc 1 644 0
 	str	wzr, [x4, 52]
-.LVL33:
-	.loc 1 650 0
-	cmp	w18, 0
-	ble	.L66
-	lsr	w11, w11, 3
 .LVL34:
-	mov	w13, 0
+	.loc 1 650 0
+	cmp	w17, 0
+	ble	.L119
+	lsr	w12, w12, 3
 .LVL35:
-	sub	w16, w11, #1
-	.loc 1 662 0
-	mov	w12, 1
-	add	x16, x16, 1
-	.loc 1 800 0
-	mov	w15, -268435456
-	lsl	x19, x16, 3
-	lsl	x16, x16, 2
-	.loc 1 782 0
-	mov	w14, 251658240
+	.loc 1 623 0
+	stp	x29, x30, [sp, -64]!
+	.cfi_def_cfa_offset 64
+	.cfi_offset 29, -64
+	.cfi_offset 30, -56
+	sub	w15, w12, #1
+	.loc 1 650 0
+	mov	w14, 0
 .LVL36:
+	add	x15, x15, 1
+	.loc 1 623 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	lsl	x30, x15, 3
+	lsl	x15, x15, 2
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
+	.loc 1 662 0
+	mov	w13, 1
+	.loc 1 623 0
+	stp	x23, x24, [sp, 48]
+	.cfi_offset 19, -48
+	.cfi_offset 20, -40
+	.cfi_offset 21, -32
+	.cfi_offset 22, -24
+	.cfi_offset 23, -16
+	.cfi_offset 24, -8
+.LVL37:
 	.p2align 2
-.L99:
+.L91:
 	.loc 1 651 0
-	cbz	w30, .L68
+	cbz	w18, .L68
 	.loc 1 652 0
-	ldp	w5, w10, [x17, 84]
-.LVL37:
+	ldp	w5, w10, [x16, 84]
+.LVL38:
 	sub	w10, w10, #1
-	sub	w10, w10, w13
+	sub	w10, w10, w14
 	mul	w10, w10, w5
 	lsr	w10, w10, 2
 	add	x10, x0, x10
-.LVL38:
+.LVL39:
 .L71:
 	add	x10, x10, 2
-.LVL39:
-	add	x7, x3, 8
+.LVL40:
+	add	x6, x3, 8
 	.loc 1 656 0 discriminator 1
 	mov	x9, 0
-	cbz	w11, .L70
+	cbz	w12, .L70
 	.p2align 2
-.L131:
+.L107:
 	.loc 1 659 0
-	ldr	w5, [x1, x9, lsl 2]
-.LVL40:
-	.loc 1 660 0
-	ldr	w6, [x2, x9, lsl 2]
+	ldr	w7, [x1, x9, lsl 2]
 .LVL41:
+	.loc 1 660 0
+	ldr	w5, [x2, x9, lsl 2]
+.LVL42:
 	.loc 1 661 0
-	cmp	w5, w6
+	cmp	w7, w5
 	beq	.L72
 	.loc 1 663 0
-	eor	w8, w5, w6
+	eor	w8, w7, w5
 	.loc 1 662 0
-	str	w12, [x4, 52]
+	str	w13, [x4, 52]
 	.loc 1 658 0
-	mov	w20, 0
+	mov	w19, 0
 	.loc 1 664 0
 	tst	x8, 15
 	beq	.L73
 	.loc 1 666 0
-	ldrb	w21, [x7, -8]
-	.loc 1 668 0
-	ubfiz	w20, w6, 8, 8
-	ldr	x23, [x4, 128]
-	add	w20, w20, w5, uxtb
-	.loc 1 674 0
-	ldrb	w22, [x4, 48]
-	.loc 1 667 0
-	lsl	w25, w21, 16
+	ldrb	w21, [x6, -8]
 	.loc 1 668 0
-	add	x20, x23, x20
-	.loc 1 672 0
-	ldrb	w24, [x4, 49]
-	.loc 1 671 0
-	ands	w23, w5, 15
-	.loc 1 672 0
-	ccmp	w23, 15, 4, ne
+	ubfiz	w19, w5, 8, 8
+	ldr	x22, [x4, 128]
+	add	w19, w19, w7, uxtb
 	.loc 1 670 0
-	add	w21, w21, 1
+	add	w20, w21, 1
 	.loc 1 668 0
-	ldrb	w20, [x20, w25, sxtw]
+	add	x19, x22, x19
+	.loc 1 667 0
+	lsl	w21, w21, 16
 	.loc 1 670 0
-	and	w21, w21, 255
-	.loc 1 672 0
-	csel	w22, w22, w24, ne
+	and	w20, w20, 255
+	.loc 1 675 0
+	cmp	w11, w20
 	.loc 1 668 0
-	and	w20, w20, 3
+	ldrb	w19, [x19, w21, sxtw]
+	and	w19, w19, 3
 	.loc 1 675 0
-	cmp	w22, w21
-	beq	.L143
-.L75:
+	beq	.L122
+.L74:
 	.loc 1 679 0
-	strb	w21, [x7, -8]
+	strb	w20, [x6, -8]
 .L73:
 	.loc 1 682 0
 	tst	w8, 240
-	beq	.L76
+	beq	.L75
+	.loc 1 686 0
+	lsr	w20, w5, 4
 	.loc 1 684 0
-	ldrb	w22, [x7, -7]
+	ldrb	w21, [x6, -7]
 	.loc 1 686 0
-	lsr	w21, w6, 4
-	ubfx	x23, x5, 4, 8
-	ubfiz	w21, w21, 8, 8
-	ldr	x24, [x4, 128]
-	add	w21, w21, w23
+	ubfx	x22, x7, 4, 8
+	ubfiz	w20, w20, 8, 8
+	add	w20, w20, w22
+	ldr	x22, [x4, 128]
 	.loc 1 685 0
-	lsl	w27, w22, 16
-	.loc 1 683 0
-	and	w25, w5, 240
-	.loc 1 686 0
-	add	x24, x24, x21
+	lsl	w23, w21, 16
 	.loc 1 688 0
-	add	w21, w22, 1
-	.loc 1 692 0
-	ldrb	w23, [x4, 48]
-	.loc 1 689 0
-	cmp	w25, 240
-	.loc 1 690 0
-	ldrb	w26, [x4, 49]
-	ccmp	w25, 0, 4, ne
+	add	w21, w21, 1
 	.loc 1 686 0
-	ldrb	w22, [x24, w27, sxtw]
+	add	x20, x22, x20
 	.loc 1 688 0
 	and	w21, w21, 255
-	.loc 1 690 0
-	csel	w23, w23, w26, ne
 	.loc 1 693 0
-	cmp	w23, w21
+	cmp	w11, w21
+	.loc 1 686 0
+	ldrb	w20, [x20, w23, sxtw]
 	.loc 1 687 0
-	ubfiz	w22, w22, 2, 2
-	orr	w20, w22, w20
+	ubfiz	w20, w20, 2, 2
+	orr	w19, w20, w19
 	.loc 1 693 0
-	beq	.L144
-.L78:
-	.loc 1 697 0
-	strb	w21, [x7, -7]
+	beq	.L123
 .L76:
+	.loc 1 697 0
+	strb	w21, [x6, -7]
+.L75:
 	.loc 1 700 0
 	tst	w8, 3840
-	beq	.L79
+	beq	.L77
 	.loc 1 702 0
-	ldrb	w21, [x7, -6]
-	.loc 1 704 0
-	and	w23, w6, 65280
-	ldr	x24, [x4, 128]
-	ubfx	x22, x5, 8, 8
-	orr	w22, w22, w23
-	.loc 1 701 0
-	and	w23, w5, 3840
-	.loc 1 703 0
-	lsl	w26, w21, 16
-	.loc 1 708 0
-	ldrb	w25, [x4, 49]
+	ldrb	w22, [x6, -6]
 	.loc 1 704 0
-	add	x22, x24, x22, uxth
-	.loc 1 707 0
-	cmp	w23, 3840
-	.loc 1 710 0
-	ldrb	w24, [x4, 48]
-	.loc 1 708 0
-	ccmp	w23, 0, 4, ne
+	and	w21, w5, 65280
+	ldr	x23, [x4, 128]
+	ubfx	x20, x7, 8, 8
+	orr	w20, w20, w21
 	.loc 1 706 0
-	add	w21, w21, 1
-	.loc 1 704 0
-	ldrb	w22, [x22, w26, sxtw]
+	add	w21, w22, 1
+	.loc 1 703 0
+	lsl	w22, w22, 16
 	.loc 1 706 0
 	and	w21, w21, 255
-	.loc 1 708 0
-	csel	w24, w24, w25, ne
+	.loc 1 704 0
+	add	x20, x23, x20, uxth
 	.loc 1 711 0
-	cmp	w24, w21
+	cmp	w11, w21
+	.loc 1 704 0
+	ldrb	w20, [x20, w22, sxtw]
 	.loc 1 705 0
-	ubfiz	w22, w22, 4, 2
-	orr	w20, w22, w20
+	ubfiz	w20, w20, 4, 2
+	orr	w19, w20, w19
 	.loc 1 711 0
-	beq	.L145
-.L81:
+	beq	.L124
+.L78:
 	.loc 1 715 0
-	strb	w21, [x7, -6]
-.L79:
+	strb	w21, [x6, -6]
+.L77:
 	.loc 1 718 0
 	tst	w8, 61440
-	beq	.L82
+	beq	.L79
+	.loc 1 722 0
+	lsr	w20, w5, 12
 	.loc 1 720 0
-	ldrb	w22, [x7, -5]
+	ldrb	w21, [x6, -5]
 	.loc 1 722 0
-	lsr	w21, w6, 12
-	ubfx	x23, x5, 12, 8
-	ubfiz	w21, w21, 8, 8
-	ldr	x24, [x4, 128]
-	add	w21, w21, w23
+	ubfx	x22, x7, 12, 8
+	ubfiz	w20, w20, 8, 8
+	add	w20, w20, w22
+	ldr	x22, [x4, 128]
 	.loc 1 721 0
-	lsl	w27, w22, 16
-	.loc 1 719 0
-	and	w25, w5, 61440
-	.loc 1 722 0
-	add	x24, x24, x21
+	lsl	w23, w21, 16
 	.loc 1 724 0
-	add	w21, w22, 1
-	.loc 1 728 0
-	ldrb	w23, [x4, 48]
-	.loc 1 725 0
-	cmp	w25, 61440
-	.loc 1 726 0
-	ldrb	w26, [x4, 49]
-	ccmp	w25, 0, 4, ne
+	add	w21, w21, 1
 	.loc 1 722 0
-	ldrb	w22, [x24, w27, sxtw]
+	add	x20, x22, x20
 	.loc 1 724 0
 	and	w21, w21, 255
-	.loc 1 726 0
-	csel	w23, w23, w26, ne
 	.loc 1 729 0
-	cmp	w23, w21
+	cmp	w11, w21
+	.loc 1 722 0
+	ldrb	w20, [x20, w23, sxtw]
 	.loc 1 723 0
-	ubfiz	w22, w22, 6, 2
-	orr	w20, w22, w20
+	ubfiz	w20, w20, 6, 2
+	orr	w19, w20, w19
 	.loc 1 729 0
-	beq	.L146
-.L84:
+	beq	.L125
+.L80:
 	.loc 1 733 0
-	strb	w21, [x7, -5]
-.L82:
+	strb	w21, [x6, -5]
+.L79:
 	.loc 1 736 0
-	strb	w20, [x10, -2]
+	strb	w19, [x10, -2]
 	.loc 1 739 0
 	tst	w8, 983040
 	.loc 1 738 0
-	mov	w20, 0
+	mov	w19, 0
 	.loc 1 739 0
-	beq	.L85
+	beq	.L81
 	.loc 1 743 0
-	lsr	w20, w6, 16
+	lsr	w19, w5, 16
 	.loc 1 741 0
-	ldrb	w21, [x7, -4]
+	ldrb	w20, [x6, -4]
 	.loc 1 743 0
-	ubfx	x22, x5, 16, 8
-	ubfiz	w20, w20, 8, 8
-	add	w20, w20, w22
-	ldr	x22, [x4, 128]
+	ubfx	x21, x7, 16, 8
+	ubfiz	w19, w19, 8, 8
+	add	w19, w19, w21
+	ldr	x21, [x4, 128]
 	.loc 1 742 0
-	lsl	w25, w21, 16
-	.loc 1 740 0
-	and	w23, w5, 983040
-	.loc 1 743 0
-	add	x20, x22, x20
-	.loc 1 747 0
-	ldrb	w24, [x4, 49]
-	.loc 1 746 0
-	cmp	w23, 983040
-	.loc 1 749 0
-	ldrb	w22, [x4, 48]
-	.loc 1 747 0
-	ccmp	w23, 0, 4, ne
+	lsl	w22, w20, 16
 	.loc 1 745 0
-	add	w21, w21, 1
+	add	w20, w20, 1
 	.loc 1 743 0
-	ldrb	w20, [x20, w25, sxtw]
+	add	x19, x21, x19
 	.loc 1 745 0
-	and	w21, w21, 255
-	.loc 1 747 0
-	csel	w22, w22, w24, ne
+	and	w20, w20, 255
+	.loc 1 750 0
+	cmp	w11, w20
 	.loc 1 743 0
-	and	w20, w20, 3
+	ldrb	w19, [x19, w22, sxtw]
+	and	w19, w19, 3
 	.loc 1 750 0
-	cmp	w22, w21
-	beq	.L147
-.L87:
+	beq	.L126
+.L82:
 	.loc 1 754 0
-	strb	w21, [x7, -4]
-.L85:
+	strb	w20, [x6, -4]
+.L81:
 	.loc 1 757 0
 	tst	w8, 15728640
-	beq	.L88
+	beq	.L83
+	.loc 1 761 0
+	lsr	w20, w5, 20
 	.loc 1 759 0
-	ldrb	w22, [x7, -3]
+	ldrb	w21, [x6, -3]
 	.loc 1 761 0
-	lsr	w21, w6, 20
-	ubfx	x23, x5, 20, 8
-	ubfiz	w21, w21, 8, 8
-	ldr	x24, [x4, 128]
-	add	w21, w21, w23
+	ubfx	x22, x7, 20, 8
+	ubfiz	w20, w20, 8, 8
+	add	w20, w20, w22
+	ldr	x22, [x4, 128]
 	.loc 1 760 0
-	lsl	w27, w22, 16
-	.loc 1 758 0
-	and	w25, w5, 15728640
-	.loc 1 761 0
-	add	x24, x24, x21
+	lsl	w23, w21, 16
 	.loc 1 763 0
-	add	w21, w22, 1
-	.loc 1 767 0
-	ldrb	w23, [x4, 48]
-	.loc 1 764 0
-	cmp	w25, 15728640
-	.loc 1 765 0
-	ldrb	w26, [x4, 49]
-	ccmp	w25, 0, 4, ne
+	add	w21, w21, 1
 	.loc 1 761 0
-	ldrb	w22, [x24, w27, sxtw]
+	add	x20, x22, x20
 	.loc 1 763 0
 	and	w21, w21, 255
-	.loc 1 765 0
-	csel	w23, w23, w26, ne
 	.loc 1 768 0
-	cmp	w23, w21
+	cmp	w11, w21
+	.loc 1 761 0
+	ldrb	w20, [x20, w23, sxtw]
 	.loc 1 762 0
-	ubfiz	w22, w22, 2, 2
-	orr	w20, w22, w20
+	ubfiz	w20, w20, 2, 2
+	orr	w19, w20, w19
 	.loc 1 768 0
-	beq	.L148
-.L90:
+	beq	.L127
+.L84:
 	.loc 1 772 0
-	strb	w21, [x7, -3]
-.L88:
+	strb	w21, [x6, -3]
+.L83:
 	.loc 1 775 0
 	tst	w8, 251658240
-	beq	.L91
+	beq	.L85
 	.loc 1 777 0
-	ldrb	w21, [x7, -2]
+	ldrb	w22, [x6, -2]
 	.loc 1 779 0
-	lsr	w22, w6, 24
-	lsr	w25, w5, 24
-	mov	w23, w22
-	ldr	x24, [x4, 128]
-	add	w22, w25, w23, lsl 8
+	lsr	w20, w5, 24
+	mov	w21, w20
+	lsr	w24, w7, 24
+	ldr	x23, [x4, 128]
+	add	w20, w24, w21, lsl 8
+	.loc 1 781 0
+	add	w21, w22, 1
 	.loc 1 778 0
-	lsl	w26, w21, 16
-	.loc 1 785 0
-	ldrb	w23, [x4, 48]
+	lsl	w22, w22, 16
 	.loc 1 779 0
-	add	x22, x24, x22
-	.loc 1 783 0
-	ldrb	w25, [x4, 49]
-	.loc 1 782 0
-	ands	w24, w5, 251658240
-	.loc 1 781 0
-	add	w21, w21, 1
-	.loc 1 783 0
-	ccmp	w24, w14, 4, ne
+	add	x20, x23, x20
 	.loc 1 781 0
 	and	w21, w21, 255
-	.loc 1 779 0
-	ldrb	w22, [x22, w26, sxtw]
-	.loc 1 783 0
-	csel	w23, w23, w25, ne
 	.loc 1 786 0
-	cmp	w23, w21
+	cmp	w11, w21
+	.loc 1 779 0
+	ldrb	w20, [x20, w22, sxtw]
 	.loc 1 780 0
-	ubfiz	w22, w22, 4, 2
-	orr	w20, w22, w20
+	ubfiz	w20, w20, 4, 2
+	orr	w19, w20, w19
 	.loc 1 786 0
-	beq	.L149
-.L93:
+	beq	.L128
+.L86:
 	.loc 1 790 0
-	strb	w21, [x7, -2]
-.L91:
+	strb	w21, [x6, -2]
+.L85:
 	.loc 1 793 0
 	tst	w8, -268435456
-	beq	.L94
+	beq	.L87
 	.loc 1 795 0
-	ldrb	w8, [x7, -1]
-.LVL42:
+	ldrb	w21, [x6, -1]
 	.loc 1 797 0
-	lsr	w22, w5, 28
-	ldr	x23, [x4, 128]
-	lsr	w21, w6, 28
-	add	w21, w22, w21, lsl 8
-	.loc 1 800 0
-	ands	w5, w5, -268435456
+	lsr	w8, w5, 28
 .LVL43:
-	.loc 1 796 0
-	lsl	w24, w8, 16
-	.loc 1 797 0
-	add	x21, x23, x21
-	.loc 1 803 0
-	ldrb	w22, [x4, 48]
-	.loc 1 801 0
-	ccmp	w5, w15, 4, ne
-	ldrb	w23, [x4, 49]
+	mov	w20, w8
+	lsr	w23, w7, 28
+	ldr	x22, [x4, 128]
+	add	w8, w23, w20, lsl 8
 	.loc 1 799 0
-	add	w8, w8, 1
+	add	w20, w21, 1
+	.loc 1 796 0
+	lsl	w21, w21, 16
 	.loc 1 797 0
-	ldrb	w21, [x21, w24, sxtw]
+	add	x8, x22, x8
 	.loc 1 799 0
-	and	w8, w8, 255
-	.loc 1 801 0
-	csel	w22, w22, w23, ne
+	and	w20, w20, 255
 	.loc 1 804 0
-	cmp	w22, w8
+	cmp	w11, w20
+	.loc 1 797 0
+	ldrb	w8, [x8, w21, sxtw]
 	.loc 1 798 0
-	ubfiz	w21, w21, 6, 2
-	orr	w20, w21, w20
+	ubfiz	w8, w8, 6, 2
+	orr	w19, w8, w19
 	.loc 1 804 0
-	beq	.L150
-.L96:
+	beq	.L129
+.L88:
 	.loc 1 808 0
-	strb	w8, [x7, -1]
+	strb	w20, [x6, -1]
 .LVL44:
-.L94:
+.L87:
 	.loc 1 811 0
-	str	w6, [x2, x9, lsl 2]
+	str	w5, [x2, x9, lsl 2]
 	.loc 1 812 0
-	strb	w20, [x10, -1]
-.L97:
+	strb	w19, [x10, -1]
+.L89:
 	add	x9, x9, 1
 	add	x10, x10, 2
-	add	x7, x7, 8
+	add	x6, x6, 8
 	.loc 1 656 0 discriminator 2
-	cmp	w11, w9
-	bgt	.L131
-	add	x3, x3, x19
-	add	x2, x2, x16
-	add	x1, x1, x16
+	cmp	w12, w9
+	bgt	.L107
+	add	x3, x3, x30
+	add	x2, x2, x15
+	add	x1, x1, x15
 .L70:
 	.loc 1 650 0 discriminator 2
-	add	w13, w13, 1
-	cmp	w18, w13
-	bne	.L99
-.L66:
+	add	w14, w14, 1
+	cmp	w17, w14
+	bne	.L91
 	.loc 1 824 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
-	ldp	x25, x26, [sp, 64]
-	ldr	x27, [sp, 80]
-	ldp	x29, x30, [sp], 96
+	ldp	x29, x30, [sp], 64
 	.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
@@ -1008,168 +913,194 @@ get_overlay_image:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
+.LVL45:
 	.p2align 3
-.L149:
+.L129:
 	.cfi_restore_state
-	.loc 1 788 0
-	and	w6, w6, -251658241
-.LVL45:
-	.loc 1 787 0
-	mov	w21, 0
-	.loc 1 788 0
-	orr	w6, w24, w6
+	.loc 1 806 0
+	and	w5, w5, 268435455
 .LVL46:
-	b	.L93
+	.loc 1 794 0
+	and	w7, w7, -268435456
 .LVL47:
-	.p2align 3
-.L150:
 	.loc 1 806 0
-	and	w6, w6, 268435455
+	orr	w5, w7, w5
 .LVL48:
 	.loc 1 805 0
-	mov	w8, 0
-	.loc 1 806 0
-	orr	w6, w5, w6
+	mov	w20, 0
+	b	.L88
 .LVL49:
-	b	.L96
-.LVL50:
 	.p2align 3
-.L148:
-	.loc 1 770 0
-	and	w6, w6, -15728641
+.L128:
+	.loc 1 788 0
+	and	w5, w5, -251658241
+.LVL50:
+	.loc 1 776 0
+	and	w20, w7, 251658240
+	.loc 1 788 0
+	orr	w5, w20, w5
 .LVL51:
-	.loc 1 769 0
+	.loc 1 787 0
 	mov	w21, 0
-	.loc 1 770 0
-	orr	w6, w25, w6
-.LVL52:
-	b	.L90
+	b	.L86
 	.p2align 3
-.L146:
-	.loc 1 731 0
-	and	w6, w6, -61441
+.L126:
+	.loc 1 740 0
+	and	w20, w7, 983040
+	.loc 1 752 0
+	and	w5, w5, -983041
+.LVL52:
+	orr	w5, w20, w5
 .LVL53:
-	.loc 1 730 0
-	mov	w21, 0
-	.loc 1 731 0
-	orr	w6, w25, w6
-.LVL54:
-	b	.L84
+	.loc 1 751 0
+	mov	w20, 0
+	b	.L82
 	.p2align 3
-.L147:
-	.loc 1 752 0
-	and	w6, w6, -983041
+.L127:
+	.loc 1 770 0
+	and	w5, w5, -15728641
+.LVL54:
+	.loc 1 758 0
+	and	w20, w7, 15728640
+	.loc 1 770 0
+	orr	w5, w20, w5
 .LVL55:
-	.loc 1 751 0
+	.loc 1 769 0
 	mov	w21, 0
-	.loc 1 752 0
-	orr	w6, w23, w6
-.LVL56:
-	b	.L87
+	b	.L84
 	.p2align 3
-.L145:
-	.loc 1 713 0
-	and	w6, w6, -3841
+.L125:
+	.loc 1 731 0
+	and	w5, w5, -61441
+.LVL56:
+	.loc 1 719 0
+	and	w20, w7, 61440
+	.loc 1 731 0
+	orr	w5, w20, w5
 .LVL57:
-	.loc 1 712 0
-	mov	w21, 0
-	.loc 1 713 0
-	orr	w6, w23, w6
-.LVL58:
-	b	.L81
-	.p2align 3
-.L143:
-	.loc 1 677 0
-	bfi	w6, w23, 0, 4
-	.loc 1 676 0
+	.loc 1 730 0
 	mov	w21, 0
-	b	.L75
+	b	.L80
 	.p2align 3
-.L144:
+.L123:
+	.loc 1 695 0
+	and	w5, w5, -241
+.LVL58:
+	.loc 1 683 0
+	and	w20, w7, 240
 	.loc 1 695 0
-	and	w6, w6, -241
+	orr	w5, w20, w5
 .LVL59:
 	.loc 1 694 0
 	mov	w21, 0
-	.loc 1 695 0
-	orr	w6, w25, w6
+	b	.L76
+	.p2align 3
+.L124:
+	.loc 1 713 0
+	and	w5, w5, -3841
 .LVL60:
+	.loc 1 701 0
+	and	w20, w7, 3840
+	.loc 1 713 0
+	orr	w5, w20, w5
+.LVL61:
+	.loc 1 712 0
+	mov	w21, 0
 	b	.L78
 	.p2align 3
+.L122:
+	.loc 1 677 0
+	bfi	w5, w7, 0, 4
+	.loc 1 676 0
+	mov	w20, 0
+	b	.L74
+	.p2align 3
 .L72:
 	.loc 1 815 0
 	strb	wzr, [x10, -2]
 	.loc 1 816 0
 	strb	wzr, [x10, -1]
-	b	.L97
+	b	.L89
 	.p2align 3
 .L68:
 	.loc 1 654 0
-	ldr	w10, [x17, 84]
-	mul	w10, w13, w10
+	ldr	w10, [x16, 84]
+	mul	w10, w14, w10
 	lsr	w10, w10, 2
 	add	x10, x0, x10
-.LVL61:
+.LVL62:
 	b	.L71
+.LVL63:
+.L119:
+	.cfi_def_cfa 31, 0
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 29
+	.cfi_restore 30
+	ret
 	.cfi_endproc
-.LFE2813:
+.LFE2814:
 	.size	get_overlay_image, .-get_overlay_image
 	.align	2
 	.p2align 3,,7
 	.type	waveform_open, %function
 waveform_open:
-.LFB2837:
-	.loc 1 2053 0
+.LFB2844:
+	.loc 1 2527 0
 	.cfi_startproc
-.LVL62:
-	.loc 1 2057 0
+.LVL64:
+	.loc 1 2531 0
 	mov	w0, 0
-.LVL63:
-	.loc 1 2054 0
+.LVL65:
+	.loc 1 2528 0
 	str	xzr, [x1, 104]
-	.loc 1 2057 0
+	.loc 1 2531 0
 	ret
 	.cfi_endproc
-.LFE2837:
+.LFE2844:
 	.size	waveform_open, .-waveform_open
 	.section	.exit.text,"ax",@progbits
 	.align	2
 	.type	ebc_exit, %function
 ebc_exit:
-.LFB2857:
-	.loc 1 2632 0
+.LFB2864:
+	.loc 1 3098 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2633 0
+	.loc 1 3099 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2632 0
+	.loc 1 3098 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2633 0
+	.loc 1 3099 0
 	bl	platform_driver_unregister
-.LVL64:
-	.loc 1 2634 0
+.LVL66:
+	.loc 1 3100 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2857:
+.LFE2864:
 	.size	ebc_exit, .-ebc_exit
 	.text
 	.align	2
 	.p2align 3,,7
 	.type	ebc_resume, %function
 ebc_resume:
-.LFB2855:
-	.loc 1 2594 0
+.LFB2862:
+	.loc 1 3060 0
 	.cfi_startproc
-.LVL65:
+.LVL67:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -1178,35 +1109,35 @@ ebc_resume:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-.LBB934:
-.LBB935:
+.LBB944:
+.LBB945:
 	.file 2 "./include/linux/device.h"
 	.loc 2 1181 0
 	ldr	x19, [x0, 184]
-.LBE935:
-.LBE934:
-	.loc 1 2598 0
+.LBE945:
+.LBE944:
+	.loc 1 3064 0
 	ldr	x1, [x19, 16]
-.LBB936:
-.LBB937:
+.LBB946:
+.LBB947:
 	.file 3 "drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic.h"
 	.loc 3 45 0
 	mov	x0, x1
-.LVL66:
+.LVL68:
 	ldr	x1, [x1, 48]
 	blr	x1
-.LVL67:
-.LBE937:
-.LBE936:
-	.loc 1 2599 0
+.LVL69:
+.LBE947:
+.LBE946:
+	.loc 1 3065 0
 	str	wzr, [x19, 804]
-	.loc 1 2600 0
+	.loc 1 3066 0
 	ldr	x0, [x19, 288]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
-.LVL68:
-	.loc 1 2603 0
+.LVL70:
+	.loc 1 3069 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -1216,85 +1147,85 @@ ebc_resume:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2855:
+.LFE2862:
 	.size	ebc_resume, .-ebc_resume
 	.align	2
 	.p2align 3,,7
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
-.LFB2830:
-	.loc 1 1713 0
+.LFB2837:
+	.loc 1 2184 0
 	.cfi_startproc
-.LVL69:
-	.loc 1 1714 0
+.LVL71:
+	.loc 1 2185 0
 	adrp	x0, .LANCHOR0
-.LVL70:
+.LVL72:
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1716 0
+	.loc 1 2187 0
 	ldr	w2, [x0, 624]
-	cbnz	w2, .L165
+	cbnz	w2, .L144
 	ret
 	.p2align 3
-.L165:
-	.loc 1 1713 0
+.L144:
+	.loc 1 2184 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-.LBB938:
-.LBB939:
+.LBB948:
+.LBB949:
 	.file 4 "./include/linux/wakelock.h"
 	.loc 4 68 0
 	add	x0, x0, 416
-.LBE939:
-.LBE938:
-	.loc 1 1713 0
+.LBE949:
+.LBE948:
+	.loc 1 2184 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1717 0
+	.loc 1 2188 0
 	str	wzr, [x0, 208]
-.LBB941:
-.LBB940:
+.LBB951:
+.LBB950:
 	.loc 4 68 0
 	bl	__pm_relax
-.LVL71:
-.LBE940:
-.LBE941:
-	.loc 1 1722 0
+.LVL73:
+.LBE950:
+.LBE951:
+	.loc 1 2193 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2830:
+.LFE2837:
 	.size	ebc_vdd_power_timeout, .-ebc_vdd_power_timeout
 	.align	2
 	.p2align 3,,7
 	.type	ebc_remove, %function
 ebc_remove:
-.LFB2853:
-	.loc 1 2570 0
+.LFB2860:
+	.loc 1 3036 0
 	.cfi_startproc
-.LVL72:
+.LVL74:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2571 0
+	.loc 1 3037 0
 	adrp	x0, .LANCHOR1
-.LVL73:
+.LVL75:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2570 0
+	.loc 1 3036 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2571 0
+	.loc 1 3037 0
 	add	x0, x0, 224
-	.loc 1 2570 0
-	.loc 1 2571 0
+	.loc 1 3036 0
+	.loc 1 3037 0
 	bl	misc_deregister
-.LVL74:
-	.loc 1 2574 0
+.LVL76:
+	.loc 1 3040 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -1302,16 +1233,16 @@ ebc_remove:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2853:
+.LFE2860:
 	.size	ebc_remove, .-ebc_remove
 	.align	2
 	.p2align 3,,7
 	.type	ebc_mmap, %function
 ebc_mmap:
-.LFB2834:
-	.loc 1 1999 0
+.LFB2841:
+	.loc 1 2473 0
 	.cfi_startproc
-.LVL75:
+.LVL77:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -1320,35 +1251,35 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1999 0
+	.loc 1 2473 0
 	mov	x19, x1
-	.loc 1 2002 0
+	.loc 1 2476 0
 	bl	ebc_phy_buf_base_get
-.LVL76:
-	.loc 1 2005 0
+.LVL78:
+	.loc 1 2479 0
 	lsr	x2, x0, 12
-	.loc 1 2003 0
+	.loc 1 2477 0
 	mov	x6, 16384
-	.loc 1 2005 0
+	.loc 1 2479 0
 	mov	x0, x19
-	.loc 1 2003 0
+	.loc 1 2477 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 2005 0
+	.loc 1 2479 0
 	ldp	x1, x3, [x19]
-	.loc 1 2003 0
+	.loc 1 2477 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 2005 0
+	.loc 1 2479 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
-.LVL77:
-	.loc 1 2008 0
+.LVL79:
+	.loc 1 2482 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 2011 0
+	.loc 1 2485 0
 	ldr	x19, [sp, 16]
-.LVL78:
+.LVL80:
 	csel	w0, w0, w1, eq
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
@@ -1357,54 +1288,54 @@ ebc_mmap:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2834:
+.LFE2841:
 	.size	ebc_mmap, .-ebc_mmap
 	.align	2
 	.p2align 3,,7
 	.type	waveform_mmap, %function
 waveform_mmap:
-.LFB2836:
-	.loc 1 2037 0
+.LFB2843:
+	.loc 1 2511 0
 	.cfi_startproc
-.LVL79:
+.LVL81:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2038 0
+	.loc 1 2512 0
 	adrp	x2, .LANCHOR0
-	.loc 1 2042 0
+	.loc 1 2516 0
 	mov	x7, 16384
-	.loc 1 2044 0
+	.loc 1 2518 0
 	mov	x0, x1
-.LVL80:
-	.loc 1 2037 0
+.LVL82:
+	.loc 1 2511 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2041 0
+	.loc 1 2515 0
 	ldr	x2, [x2, #:lo12:.LANCHOR0]
-	.loc 1 2042 0
+	.loc 1 2516 0
 	movk	x7, 0x404, lsl 16
 	ldp	x4, x5, [x1, 72]
-	.loc 1 2044 0
+	.loc 1 2518 0
 	ldp	x6, x3, [x1]
-	.loc 1 2042 0
+	.loc 1 2516 0
 	orr	x5, x5, x7
-	.loc 1 2041 0
+	.loc 1 2515 0
 	ldr	x2, [x2, 216]
-	.loc 1 2042 0
+	.loc 1 2516 0
 	str	x5, [x1, 80]
-	.loc 1 2044 0
+	.loc 1 2518 0
 	sub	x3, x3, x6
 	mov	x1, x6
-.LVL81:
+.LVL83:
 	lsr	x2, x2, 12
 	bl	remap_pfn_range
-.LVL82:
-	.loc 1 2047 0
+.LVL84:
+	.loc 1 2521 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 2050 0
+	.loc 1 2524 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1412,23 +1343,23 @@ waveform_mmap:
 	csel	w0, w0, w1, eq
 	ret
 	.cfi_endproc
-.LFE2836:
+.LFE2843:
 	.size	waveform_mmap, .-waveform_mmap
 	.align	2
 	.p2align 3,,7
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
-.LFB2833:
-	.loc 1 1798 0
+.LFB2840:
+	.loc 1 2269 0
 	.cfi_startproc
-.LVL83:
+.LVL85:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 1808 0
+	.loc 1 2279 0
 	cmp	w1, 28672
-	.loc 1 1798 0
+	.loc 1 2269 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -1437,241 +1368,241 @@ ebc_io_ctl:
 	adrp	x19, __stack_chk_guard
 	stp	x21, x22, [sp, 32]
 	add	x0, x19, :lo12:__stack_chk_guard
-.LVL84:
+.LVL86:
 	str	x23, [sp, 48]
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
 	.cfi_offset 23, -112
-	.loc 1 1798 0
+	.loc 1 2269 0
 	mov	x21, x2
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 1800 0
+	.loc 1 2271 0
 	adrp	x0, .LANCHOR0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1808 0
-	bcc	.L177
+	.loc 1 2279 0
+	bcc	.L156
 	mov	w0, 28675
 	cmp	w1, w0
-	bls	.L178
+	bls	.L157
 	mov	w0, -28678
 	add	w0, w1, w0
 	cmp	w0, 1
-	bls	.L178
-.L177:
-	.loc 1 1824 0
+	bls	.L157
+.L156:
+	.loc 1 2295 0
 	mov	w0, 28677
 	cmp	w1, w0
-	beq	.L181
-	bls	.L310
+	beq	.L160
+	bls	.L289
 	mov	w0, 28680
 	cmp	w1, w0
-	beq	.L189
-	bls	.L311
+	beq	.L168
+	bls	.L290
 	mov	w0, 28682
 	cmp	w1, w0
-	beq	.L193
-	bcc	.L194
+	beq	.L172
+	bcc	.L173
 	mov	w0, 28683
 	cmp	w1, w0
-	bne	.L180
-	.loc 1 1976 0
+	bne	.L159
+	.loc 1 2450 0
 	bl	ebc_empty_buf_get
-.LVL85:
+.LVL87:
 	mov	x23, x0
-	.loc 1 1977 0
-	cbz	x0, .L201
-	.loc 1 1979 0
+	.loc 1 2451 0
+	cbz	x0, .L180
+	.loc 1 2453 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 408]
 	ldr	x0, [x0, 16]
 	mul	w2, w2, w3
 	ldr	x1, [x1, 16]
-.L307:
+.L286:
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL86:
-	.loc 1 1980 0
+.LVL88:
+	.loc 1 2454 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
-.LVL87:
+.LVL89:
 	sub	w0, w20, w0
-.LBB942:
-.LBB943:
-.LBB944:
-.LBB945:
-.LBB946:
-.LBB947:
-.LBB948:
+.LBB952:
+.LBB953:
+.LBB954:
+.LBB955:
+.LBB956:
+.LBB957:
+.LBB958:
 	.file 5 "./arch/arm64/include/asm/current.h"
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL88:
+.LVL90:
 #NO_APP
-.LBE948:
-.LBE947:
+.LBE958:
+.LBE957:
 	.file 6 "./arch/arm64/include/asm/uaccess.h"
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE946:
-.LBE945:
-.LBE944:
-.LBE943:
-.LBE942:
-	.loc 1 1982 0
+.LBE956:
+.LBE955:
+.LBE954:
+.LBE953:
+.LBE952:
+	.loc 1 2456 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 1981 0
+	.loc 1 2455 0
 	str	w0, [x29, 104]
-	.loc 1 1983 0
+	.loc 1 2457 0
 	stp	w4, w1, [x29, 112]
-.LBB973:
-.LBB970:
+.LBB983:
+.LBB980:
+.LBB977:
 .LBB967:
-.LBB957:
-.LBB955:
+.LBB965:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL89:
+.LVL91:
 	.loc 6 84 0
-	tbnz	x3, 21, .L238
-.LVL90:
-.L304:
-.LBB949:
-.LBB950:
-.LBB951:
+	tbnz	x3, 21, .L217
+.LVL92:
+.L283:
+.LBB959:
+.LBB960:
+.LBB961:
 	.file 7 "./include/asm-generic/bitops/non-atomic.h"
 	.loc 7 106 0
 	ldr	x2, [x2]
-.LVL91:
-.LBE951:
-.LBE950:
-.LBE949:
-.LBE955:
-.LBE957:
+.LVL93:
+.LBE961:
+.LBE960:
+.LBE959:
+.LBE965:
 .LBE967:
-.LBE970:
-.LBE973:
-	.loc 1 1799 0
+.LBE977:
+.LBE980:
+.LBE983:
+	.loc 1 2270 0
 	mov	x0, x21
-.LVL92:
-.LBB974:
-.LBB971:
+.LVL94:
+.LBB984:
+.LBB981:
+.LBB978:
 .LBB968:
-.LBB958:
-.LBB956:
+.LBB966:
 	.loc 6 84 0
-	tbz	x2, 26, .L239
-.LVL93:
-.L238:
-.LBB952:
-.LBB953:
-.LBB954:
+	tbz	x2, 26, .L218
+.LVL95:
+.L217:
+.LBB962:
+.LBB963:
+.LBB964:
 	.file 8 "./include/linux/bitops.h"
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL94:
-.LBE954:
-.LBE953:
+.LVL96:
+.LBE964:
+.LBE963:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL95:
-.L239:
-.LBE952:
+.LVL97:
+.L218:
+.LBE962:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
-		adds	x0, x0, 44
+		adds	x0, x0, 48
 	csel	x1, xzr, x1, hi
 	csinv	x0, x0, xzr, cc
 	sbcs	xzr, x0, x1
 	cset	x0, ls
 
 // 0 "" 2
-.LVL96:
+.LVL98:
 #NO_APP
-.LBE956:
-.LBE958:
+.LBE966:
+.LBE968:
 	.file 9 "./include/linux/uaccess.h"
 	.loc 9 132 0
-	mov	x22, 44
-	cbnz	x0, .L312
-.L240:
-.LBE968:
-.LBE971:
-.LBE974:
-	.loc 1 1985 0
+	mov	x22, 48
+	cbnz	x0, .L291
+.L219:
+.LBE978:
+.LBE981:
+.LBE984:
+	.loc 1 2459 0
 	mov	x0, x23
-.LVL97:
-	bl	ebc_buf_release
-.LVL98:
-	.loc 1 1986 0
-	b	.L176
 .LVL99:
+	bl	ebc_buf_release
+.LVL100:
+	.loc 1 2460 0
+	b	.L155
+.LVL101:
 	.p2align 3
-.L178:
-	.loc 1 1815 0
-	cbnz	x21, .L177
-	.loc 1 1816 0
+.L157:
+	.loc 1 2286 0
+	cbnz	x21, .L156
+	.loc 1 2287 0
 	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
-.LVL100:
+.LVL102:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC1
-	.loc 1 1817 0
+	.loc 1 2288 0
 	mov	x22, -14
-	.loc 1 1816 0
+	.loc 1 2287 0
 	bl	_dev_err
-.LVL101:
-	.loc 1 1817 0
-	b	.L176
-.LVL102:
+.LVL103:
+	.loc 1 2288 0
+	b	.L155
+.LVL104:
 	.p2align 3
-.L310:
-	.loc 1 1824 0
+.L289:
+	.loc 1 2295 0
 	mov	w0, 28674
 	cmp	w1, w0
-	beq	.L183
-	bls	.L313
+	beq	.L162
+	bls	.L292
 	mov	w0, 28675
 	cmp	w1, w0
-	beq	.L187
+	beq	.L166
 	mov	w0, 28676
 	cmp	w1, w0
-	bne	.L180
-	.loc 1 1908 0
+	bne	.L159
+	.loc 1 2381 0
 	ldr	x0, [x20, 288]
-	.loc 1 1907 0
+	.loc 1 2380 0
 	mov	w2, 1
 	str	w2, [x20, 812]
-	.loc 1 1908 0
+	.loc 1 2381 0
 	adrp	x1, .LC2
-.LVL103:
-	.loc 1 1909 0
+.LVL105:
+	.loc 1 2382 0
 	mov	x22, 0
-	.loc 1 1908 0
+	.loc 1 2381 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
-.LVL104:
+.LVL106:
 	.p2align 2
-.L176:
-	.loc 1 1996 0
+.L155:
+	.loc 1 2470 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
-.LVL105:
+.LVL107:
 	ldr	x2, [x29, 152]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-.LVL106:
-	cbnz	x1, .L314
+.LVL108:
+	cbnz	x1, .L293
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL107:
+.LVL109:
 	ldr	x23, [sp, 48]
 	ldp	x29, x30, [sp], 160
 	.cfi_remember_state
@@ -1684,97 +1615,97 @@ ebc_io_ctl:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL108:
+.LVL110:
 	.p2align 3
-.L313:
+.L292:
 	.cfi_restore_state
-	.loc 1 1824 0
+	.loc 1 2295 0
 	cmp	w1, 28672
-	beq	.L185
+	beq	.L164
 	mov	w0, 28673
 	cmp	w1, w0
-	bne	.L180
-.LBB975:
-.LBB976:
-.LBB977:
-.LBB978:
-.LBB979:
-.LBB980:
-.LBB981:
+	bne	.L159
+.LBB985:
+.LBB986:
+.LBB987:
+.LBB988:
+.LBB989:
+.LBB990:
+.LBB991:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL109:
+.LVL111:
 #NO_APP
-.LBE981:
-.LBE980:
+.LBE991:
+.LBE990:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
-.LVL110:
+.LVL112:
 	.loc 6 84 0
-	tbz	x2, 21, .L315
-.LVL111:
-.L206:
-.LBB982:
-.LBB983:
-.LBB984:
+	tbz	x2, 21, .L294
+.LVL113:
+.L185:
+.LBB992:
+.LBB993:
+.LBB994:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL112:
-.LBE984:
-.LBE983:
+.LVL114:
+.LBE994:
+.LBE993:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL113:
-.L207:
-.LBE982:
+.LVL115:
+.L186:
+.LBE992:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
-		adds	x0, x0, 44
+		adds	x0, x0, 48
 	csel	x1, xzr, x1, hi
 	csinv	x0, x0, xzr, cc
 	sbcs	xzr, x0, x1
 	cset	x0, ls
 
 // 0 "" 2
-.LVL114:
+.LVL116:
 #NO_APP
-.LBE979:
-.LBE978:
+.LBE989:
+.LBE988:
 	.loc 9 114 0
-	cbz	x0, .L209
-.LBB990:
-.LBB991:
-.LBB992:
-.LBB993:
-.LBB994:
+	cbz	x0, .L188
+.LBB1000:
+.LBB1001:
+.LBB1002:
+.LBB1003:
+.LBB1004:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL115:
-.LBE994:
-.LBE993:
-.LBE992:
-.LBB995:
-.LBB996:
+.LVL117:
+.LBE1004:
+.LBE1003:
+.LBE1002:
+.LBB1005:
+.LBB1006:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL116:
+.LVL118:
 #NO_APP
-.LBE996:
-.LBE995:
-.LBB997:
+.LBE1006:
+.LBE1005:
+.LBB1007:
 	.loc 6 254 0
 	and	x0, x0, x21
-.LVL117:
-.LBE997:
+.LVL119:
+.LBE1007:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1783,217 +1714,222 @@ ebc_io_ctl:
 	csel	x1, x21, xzr, eq
 
 // 0 "" 2
-.LVL118:
+.LVL120:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE991:
-.LBE990:
+.LBE1001:
+.LBE1000:
 	.loc 9 116 0
-	mov	x2, 44
+	mov	x2, 48
 	add	x0, x29, 104
-.LVL119:
+.LVL121:
 	bl	__arch_copy_from_user
-.LVL120:
+.LVL122:
 	.loc 9 118 0
-	cbnz	x0, .L209
-.LBE977:
-.LBE976:
-.LBE975:
-	.loc 1 1862 0
+	cbnz	x0, .L188
+.LBE987:
+.LBE986:
+.LBE985:
+	.loc 1 2335 0
 	bl	ebc_phy_buf_base_get
-.LVL121:
+.LVL123:
 	ldrsw	x1, [x29, 104]
-	.loc 1 1863 0
+	.loc 1 2336 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
-.LVL122:
+.LVL124:
 	mov	x21, x0
-.LVL123:
-	.loc 1 1864 0
-	cbz	x0, .L216
-	.loc 1 1865 0
-	ldr	w5, [x29, 108]
-	.loc 1 1874 0
+.LVL125:
+	.loc 1 2337 0
+	cbz	x0, .L195
+	.loc 1 2338 0
+	ldr	w1, [x29, 108]
+	.loc 1 2347 0
 	add	x20, x20, 184
-	.loc 1 1869 0
+	.loc 1 2338 0
+	str	w1, [x21, 40]
+	.loc 1 2342 0
 	ldp	w4, w2, [x29, 124]
-	.loc 1 1865 0
-	str	w5, [x21, 40]
-	.loc 1 1870 0
-	ldp	w3, w1, [x29, 132]
-	.loc 1 1869 0
 	stp	w4, w2, [x21, 48]
-	.loc 1 1870 0
-	stp	w3, w1, [x21, 56]
-	.loc 1 1872 0
+	.loc 1 2341 0
+	ldr	w3, [x29, 132]
+	.loc 1 2343 0
+	ldr	w1, [x29, 136]
+	.loc 1 2339 0
+	ldr	w5, [x29, 148]
+	.loc 1 2341 0
+	str	w3, [x21, 56]
+	.loc 1 2339 0
+	stp	w1, w5, [x21, 60]
+	.loc 1 2345 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL124:
-	.loc 1 1874 0
+.LVL126:
+	.loc 1 2347 0
 	ldr	w0, [x20, 96]
-	cbz	w0, .L316
-.L211:
-	.loc 1 1878 0
+	cbz	w0, .L295
+.L190:
+	.loc 1 2351 0
 	ldr	w0, [x21, 40]
 	cmp	w0, 18
-	beq	.L317
-	.loc 1 1878 0 is_stmt 0 discriminator 3
+	beq	.L296
+	.loc 1 2351 0 is_stmt 0 discriminator 3
 	cmp	w0, 20
-	bne	.L216
-.L213:
-	.loc 1 1879 0 is_stmt 1
+	bne	.L195
+.L192:
+	.loc 1 2352 0 is_stmt 1
 	mov	w0, 1
 	str	w0, [x20, 204]
-.LBB1004:
-.LBB1005:
-	.loc 1 1880 0
+.LBB1014:
+.LBB1015:
+	.loc 1 2353 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
-.LVL125:
+.LVL127:
 	adrp	x0, .LANCHOR1
-.LBB1006:
+.LBB1016:
 	add	x0, x0, :lo12:.LANCHOR1
 	add	x21, x0, 328
-	b	.L217
+	b	.L196
 	.p2align 3
-.L318:
-.LVL126:
-	.loc 1 1880 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L216
-	.loc 1 1880 0 discriminator 7
+.L297:
+.LVL128:
+	.loc 1 2353 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L195
+	.loc 1 2353 0 discriminator 7
 	bl	schedule
-.LVL127:
-.L217:
-	.loc 1 1880 0 discriminator 9
+.LVL129:
+.L196:
+	.loc 1 2353 0 discriminator 9
 	add	x1, x29, 64
 	mov	w2, 1
 	mov	x0, x21
 	bl	prepare_to_wait_event
-.LVL128:
+.LVL130:
 	ldr	w1, [x20, 204]
-	cbnz	w1, .L318
-.LBE1006:
-	.loc 1 1880 0 discriminator 4
+	cbnz	w1, .L297
+.LBE1016:
+	.loc 1 2353 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
 	bl	finish_wait
-.LVL129:
+.LVL131:
 	.p2align 2
-.L216:
+.L195:
 	mov	x22, 0
-	b	.L176
-.LVL130:
+	b	.L155
+.LVL132:
 	.p2align 3
-.L193:
-.LBE1005:
-.LBE1004:
-	.loc 1 1963 0 is_stmt 1
+.L172:
+.LBE1015:
+.LBE1014:
+	.loc 1 2437 0 is_stmt 1
 	bl	ebc_empty_buf_get
-.LVL131:
+.LVL133:
 	mov	x23, x0
-	.loc 1 1964 0
-	cbz	x0, .L201
-	.loc 1 1966 0
+	.loc 1 2438 0
+	cbz	x0, .L180
+	.loc 1 2440 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 344]
 	ldr	x0, [x0, 16]
 	mul	w2, w2, w3
-	b	.L307
-.LVL132:
+	b	.L286
+.LVL134:
 	.p2align 3
-.L311:
-	.loc 1 1824 0
+.L290:
+	.loc 1 2295 0
 	mov	w0, 28678
 	cmp	w1, w0
-	beq	.L191
+	beq	.L170
 	mov	w0, 28679
 	cmp	w1, w0
-	bne	.L180
-.LBB1010:
-.LBB1011:
-.LBB1012:
-.LBB1013:
-.LBB1014:
-.LBB1015:
-.LBB1016:
+	bne	.L159
+.LBB1020:
+.LBB1021:
+.LBB1022:
+.LBB1023:
+.LBB1024:
+.LBB1025:
+.LBB1026:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL133:
+.LVL135:
 #NO_APP
-.LBE1016:
-.LBE1015:
+.LBE1026:
+.LBE1025:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
-.LVL134:
+.LVL136:
 	.loc 6 84 0
-	tbz	x2, 21, .L319
-.LVL135:
-.L218:
-.LBB1017:
-.LBB1018:
-.LBB1019:
+	tbz	x2, 21, .L298
+.LVL137:
+.L197:
+.LBB1027:
+.LBB1028:
+.LBB1029:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL136:
-.LBE1019:
-.LBE1018:
+.LVL138:
+.LBE1029:
+.LBE1028:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL137:
-.L219:
-.LBE1017:
+.LVL139:
+.L198:
+.LBE1027:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
-		adds	x0, x0, 44
+		adds	x0, x0, 48
 	csel	x1, xzr, x1, hi
 	csinv	x0, x0, xzr, cc
 	sbcs	xzr, x0, x1
 	cset	x0, ls
 
 // 0 "" 2
-.LVL138:
+.LVL140:
 #NO_APP
-.LBE1014:
-.LBE1013:
+.LBE1024:
+.LBE1023:
 	.loc 9 114 0
-	cbz	x0, .L209
-.LBB1025:
-.LBB1026:
-.LBB1027:
-.LBB1028:
-.LBB1029:
+	cbz	x0, .L188
+.LBB1035:
+.LBB1036:
+.LBB1037:
+.LBB1038:
+.LBB1039:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL139:
-.LBE1029:
-.LBE1028:
-.LBE1027:
-.LBB1030:
-.LBB1031:
+.LVL141:
+.LBE1039:
+.LBE1038:
+.LBE1037:
+.LBB1040:
+.LBB1041:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL140:
+.LVL142:
 #NO_APP
-.LBE1031:
-.LBE1030:
-.LBB1032:
+.LBE1041:
+.LBE1040:
+.LBB1042:
 	.loc 6 254 0
 	and	x0, x0, x21
-.LVL141:
-.LBE1032:
+.LVL143:
+.LBE1042:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -2002,321 +1938,325 @@ ebc_io_ctl:
 	csel	x1, x21, xzr, eq
 
 // 0 "" 2
-.LVL142:
+.LVL144:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1026:
-.LBE1025:
+.LBE1036:
+.LBE1035:
 	.loc 9 116 0
-	mov	x2, 44
+	mov	x2, 48
 	add	x0, x29, 104
-.LVL143:
+.LVL145:
 	bl	__arch_copy_from_user
-.LVL144:
+.LVL146:
 	.loc 9 118 0
-	cbnz	x0, .L209
-.LBE1012:
-.LBE1011:
-.LBE1010:
-	.loc 1 1889 0
+	cbnz	x0, .L188
+.LBE1022:
+.LBE1021:
+.LBE1020:
+	.loc 1 2362 0
 	bl	ebc_osd_buf_clone
-.LVL145:
+.LVL147:
 	mov	x1, x0
-	.loc 1 1890 0
-	cbz	x0, .L216
-	.loc 1 1891 0
+	.loc 1 2363 0
+	cbz	x0, .L195
+	.loc 1 2364 0
 	ldr	w6, [x29, 108]
-	.loc 1 1900 0
+	.loc 1 2373 0
 	add	x20, x20, 184
-	.loc 1 1895 0
+	.loc 1 2368 0
 	ldp	w5, w3, [x29, 124]
-	.loc 1 1891 0
+	.loc 1 2364 0
 	str	w6, [x1, 40]
-	.loc 1 1896 0
+	.loc 1 2369 0
 	ldp	w4, w2, [x29, 132]
-	.loc 1 1895 0
+	.loc 1 2368 0
 	stp	w5, w3, [x1, 48]
-	.loc 1 1896 0
+	.loc 1 2369 0
 	stp	w4, w2, [x1, 56]
-	.loc 1 1898 0
+	.loc 1 2371 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL146:
-	.loc 1 1900 0
+.LVL148:
+	.loc 1 2373 0
 	ldr	w0, [x20, 96]
-	cbnz	w0, .L216
-	.loc 1 1901 0
+	cbnz	w0, .L195
+	.loc 1 2374 0
 	mov	w2, 1
 	str	w2, [x20, 96]
-	.loc 1 1902 0
+	.loc 1 2375 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	mov	x22, 0
 	bl	__wake_up_sync
-.LVL147:
-	b	.L176
-.LVL148:
+.LVL149:
+	b	.L155
+.LVL150:
 	.p2align 3
-.L312:
-.LBB1039:
-.LBB972:
+.L291:
+.LBB1049:
+.LBB982:
+.LBB979:
 .LBB969:
-.LBB959:
-.LBB960:
-.LBB961:
-.LBB962:
-.LBB963:
+.LBB970:
+.LBB971:
+.LBB972:
+.LBB973:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL149:
-.LBE963:
-.LBE962:
-.LBE961:
-.LBB964:
-.LBB965:
+.LVL151:
+.LBE973:
+.LBE972:
+.LBE971:
+.LBB974:
+.LBB975:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL150:
+.LVL152:
 #NO_APP
-.LBE965:
-.LBE964:
-.LBB966:
+.LBE975:
+.LBE974:
+.LBB976:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL151:
-.LBE966:
+.LVL153:
+.LBE976:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL152:
+.LVL154:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL153:
+.LVL155:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE960:
-.LBE959:
+.LBE970:
+.LBE969:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
-.LVL154:
+.LVL156:
 	bl	__arch_copy_to_user
-.LVL155:
+.LVL157:
 	sxtw	x22, w0
-	b	.L240
-.LVL156:
+	b	.L219
+.LVL158:
 	.p2align 3
-.L191:
-.LBE969:
-.LBE972:
-.LBE1039:
-	.loc 1 1826 0
+.L170:
+.LBE979:
+.LBE982:
+.LBE1049:
+	.loc 1 2297 0
 	bl	ebc_osd_buf_get
-.LVL157:
-	.loc 1 1827 0
-	cbz	x0, .L201
-	.loc 1 1830 0
+.LVL159:
+	.loc 1 2298 0
+	cbz	x0, .L180
+	.loc 1 2301 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
-.LVL158:
-.LBB1040:
-.LBB1041:
-.LBB1042:
-.LBB1043:
-.LBB1044:
-.LBB1045:
-.LBB1046:
+.LVL160:
+	.loc 1 2306 0
+	ldr	w1, [x20, 176]
+.LBB1050:
+.LBB1051:
+.LBB1052:
+.LBB1053:
+.LBB1054:
+.LBB1055:
+.LBB1056:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL159:
+.LVL161:
 #NO_APP
-.LBE1046:
-.LBE1045:
+.LBE1056:
+.LBE1055:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1044:
-.LBE1043:
-.LBE1042:
-.LBE1041:
-.LBE1040:
-	.loc 1 1830 0
+.LBE1054:
+.LBE1053:
+.LBE1052:
+.LBE1051:
+.LBE1050:
+	.loc 1 2301 0
 	sub	w0, w22, w0
-	.loc 1 1835 0
-	ldr	w1, [x20, 176]
-	.loc 1 1834 0
+	.loc 1 2305 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1833 0
-	stp	w4, w5, [x29, 112]
-	.loc 1 1835 0
+	.loc 1 2306 0
 	str	w1, [x29, 120]
-	.loc 1 1832 0
+	.loc 1 2304 0
+	stp	w4, w5, [x29, 112]
+	.loc 1 2307 0
+	mov	w1, 16
+	.loc 1 2303 0
 	str	w0, [x29, 104]
-.LBB1073:
-.LBB1070:
-.LBB1067:
-.LBB1056:
-.LBB1053:
+	.loc 1 2307 0
+	str	w1, [x29, 148]
+.LBB1083:
+.LBB1080:
+.LBB1077:
+.LBB1066:
+.LBB1063:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL160:
+.LVL162:
 	.loc 6 84 0
-	tbz	x3, 21, .L320
-.LVL161:
-.L197:
-.LBB1047:
-.LBB1048:
-.LBB1049:
+	tbz	x3, 21, .L299
+.LVL163:
+.L176:
+.LBB1057:
+.LBB1058:
+.LBB1059:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL162:
-.LBE1049:
-.LBE1048:
+.LVL164:
+.LBE1059:
+.LBE1058:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL163:
-.L198:
-.LBE1047:
+.LVL165:
+.L177:
+.LBE1057:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
-		adds	x0, x0, 44
+		adds	x0, x0, 48
 	csel	x1, xzr, x1, hi
 	csinv	x0, x0, xzr, cc
 	sbcs	xzr, x0, x1
 	cset	x0, ls
 
 // 0 "" 2
-.LVL164:
+.LVL166:
 #NO_APP
-.LBE1053:
-.LBE1056:
+.LBE1063:
+.LBE1066:
 	.loc 9 132 0
-	mov	x22, 44
-	cbz	x0, .L176
-.LBB1057:
-.LBB1058:
-.LBB1059:
-.LBB1060:
-.LBB1061:
+	mov	x22, 48
+	cbz	x0, .L155
+.LBB1067:
+.LBB1068:
+.LBB1069:
+.LBB1070:
+.LBB1071:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL165:
-.LBE1061:
-.LBE1060:
-.LBE1059:
-.LBB1062:
-.LBB1063:
+.LVL167:
+.LBE1071:
+.LBE1070:
+.LBE1069:
+.LBB1072:
+.LBB1073:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL166:
+.LVL168:
 #NO_APP
-.LBE1063:
-.LBE1062:
-.LBB1064:
+.LBE1073:
+.LBE1072:
+.LBB1074:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL167:
-.LBE1064:
+.LVL169:
+.LBE1074:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL168:
+.LVL170:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL169:
+.LVL171:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1058:
-.LBE1057:
+.LBE1068:
+.LBE1067:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
-.LVL170:
+.LVL172:
 	bl	__arch_copy_to_user
-.LVL171:
+.LVL173:
 	sxtw	x22, w0
-	b	.L176
-.LVL172:
+	b	.L155
+.LVL174:
 	.p2align 3
-.L187:
-.LBE1067:
-.LBE1070:
-.LBE1073:
-.LBB1074:
-.LBB1075:
-.LBB1076:
-.LBB1077:
-.LBB1078:
-.LBB1079:
-.LBB1080:
+.L166:
+.LBE1077:
+.LBE1080:
+.LBE1083:
+.LBB1084:
+.LBB1085:
+.LBB1086:
+.LBB1087:
+.LBB1088:
+.LBB1089:
+.LBB1090:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL173:
+.LVL175:
 #NO_APP
-.LBE1080:
-.LBE1079:
+.LBE1090:
+.LBE1089:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
-.LBE1078:
-.LBE1077:
-.LBE1076:
-.LBE1075:
-.LBE1074:
-	.loc 1 1916 0
+.LBE1088:
+.LBE1087:
+.LBE1086:
+.LBE1085:
+.LBE1084:
+	.loc 1 2389 0
 	add	x22, x20, 248
-.LBB1109:
-.LBB1105:
-.LBB1101:
-.LBB1090:
-.LBB1087:
+.LBB1119:
+.LBB1115:
+.LBB1111:
+.LBB1100:
+.LBB1097:
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
-.LVL174:
+.LVL176:
 	.loc 6 84 0
-	tbz	x2, 21, .L321
-.LVL175:
-.L221:
-.LBB1081:
-.LBB1082:
-.LBB1083:
+	tbz	x2, 21, .L300
+.LVL177:
+.L200:
+.LBB1091:
+.LBB1092:
+.LBB1093:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL176:
-.LBE1083:
-.LBE1082:
+.LVL178:
+.LBE1093:
+.LBE1092:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL177:
-.L222:
-.LBE1081:
+.LVL179:
+.L201:
+.LBE1091:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2327,39 +2267,39 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL178:
+.LVL180:
 #NO_APP
 	mov	x3, x0
-.LBE1087:
-.LBE1090:
+.LBE1097:
+.LBE1100:
 	.loc 9 114 0
-	cbz	x0, .L250
-.LBB1091:
-.LBB1092:
-.LBB1093:
-.LBB1094:
-.LBB1095:
+	cbz	x0, .L229
+.LBB1101:
+.LBB1102:
+.LBB1103:
+.LBB1104:
+.LBB1105:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LBE1095:
-.LBE1094:
-.LBE1093:
-.LBB1096:
-.LBB1097:
+.LBE1105:
+.LBE1104:
+.LBE1103:
+.LBB1106:
+.LBB1107:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL179:
+.LVL181:
 #NO_APP
-.LBE1097:
-.LBE1096:
-.LBB1098:
+.LBE1107:
+.LBE1106:
+.LBB1108:
 	.loc 6 254 0
 	and	x0, x0, x21
-.LVL180:
-.LBE1098:
+.LVL182:
+.LBE1108:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -2368,84 +2308,84 @@ ebc_io_ctl:
 	csel	x1, x21, xzr, eq
 
 // 0 "" 2
-.LVL181:
+.LVL183:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1092:
-.LBE1091:
+.LBE1102:
+.LBE1101:
 	.loc 9 116 0
 	mov	x2, 4
 	mov	x0, x22
-.LVL182:
+.LVL184:
 	bl	__arch_copy_from_user
-.LVL183:
+.LVL185:
 	.loc 9 118 0
-	cbnz	x0, .L322
-.LBE1101:
-.LBE1105:
-.LBE1109:
-	.loc 1 1920 0
+	cbnz	x0, .L301
+.LBE1111:
+.LBE1115:
+.LBE1119:
+	.loc 1 2393 0
 	add	x20, x20, 184
 	ldr	w2, [x20, 64]
 	ldr	x0, [x20, 104]
-.LVL184:
-	.loc 1 1921 0
+.LVL186:
+	.loc 1 2394 0
 	mov	x22, 0
-	.loc 1 1920 0
+	.loc 1 2393 0
 	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	_dev_info
-.LVL185:
-	.loc 1 1921 0
-	b	.L176
-.LVL186:
+.LVL187:
+	.loc 1 2394 0
+	b	.L155
+.LVL188:
 	.p2align 3
-.L181:
-	.loc 1 1913 0
+.L160:
+	.loc 1 2386 0
 	ldr	x0, [x20, 288]
 	adrp	x1, .LC3
-.LVL187:
-	.loc 1 1911 0
+.LVL189:
+	.loc 1 2384 0
 	str	wzr, [x20, 812]
-	.loc 1 1914 0
+	.loc 1 2387 0
 	mov	x22, 0
-	.loc 1 1912 0
+	.loc 1 2385 0
 	str	wzr, [x20, 816]
-	.loc 1 1913 0
+	.loc 1 2386 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
-.LVL188:
-	.loc 1 1914 0
-	b	.L176
-.LVL189:
+.LVL190:
+	.loc 1 2387 0
+	b	.L155
+.LVL191:
 	.p2align 3
-.L189:
-	.loc 1 1950 0
+.L168:
+	.loc 1 2424 0
 	bl	ebc_empty_buf_get
-.LVL190:
+.LVL192:
 	mov	x23, x0
-	.loc 1 1951 0
-	cbz	x0, .L201
-	.loc 1 1953 0
+	.loc 1 2425 0
+	cbz	x0, .L180
+	.loc 1 2427 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 336]
 	ldr	x0, [x0, 16]
 	mul	w2, w2, w3
-	b	.L307
-.LVL191:
+	b	.L286
+.LVL193:
 	.p2align 3
-.L194:
-	.loc 1 1937 0
+.L173:
+	.loc 1 2411 0
 	bl	ebc_empty_buf_get
-.LVL192:
+.LVL194:
 	mov	x23, x0
-	.loc 1 1938 0
-	cbz	x0, .L201
-	.loc 1 1940 0
+	.loc 1 2412 0
+	cbz	x0, .L180
+	.loc 1 2414 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 328]
@@ -2453,779 +2393,789 @@ ebc_io_ctl:
 	mul	w2, w2, w3
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL193:
-	.loc 1 1941 0
+.LVL195:
+	.loc 1 2415 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
-.LVL194:
+.LVL196:
 	sub	w0, w20, w0
-.LBB1110:
-.LBB1111:
-.LBB1112:
-.LBB1113:
-.LBB1114:
-.LBB1115:
-.LBB1116:
+.LBB1120:
+.LBB1121:
+.LBB1122:
+.LBB1123:
+.LBB1124:
+.LBB1125:
+.LBB1126:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL195:
+.LVL197:
 #NO_APP
-.LBE1116:
-.LBE1115:
+.LBE1126:
+.LBE1125:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1114:
-.LBE1113:
-.LBE1112:
-.LBE1111:
-.LBE1110:
-	.loc 1 1944 0
+.LBE1124:
+.LBE1123:
+.LBE1122:
+.LBE1121:
+.LBE1120:
+	.loc 1 2418 0
 	ldp	w4, w1, [x22, 84]
-	.loc 1 1942 0
+	.loc 1 2416 0
 	str	w0, [x29, 104]
-	.loc 1 1943 0
+	.loc 1 2417 0
 	stp	w1, w4, [x29, 112]
-.LBB1121:
-.LBB1120:
-.LBB1119:
-.LBB1118:
-.LBB1117:
+.LBB1131:
+.LBB1130:
+.LBB1129:
+.LBB1128:
+.LBB1127:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL196:
+.LVL198:
 	.loc 6 84 0
-	tbnz	x3, 21, .L238
-	b	.L304
-.LVL197:
+	tbnz	x3, 21, .L217
+	b	.L283
+.LVL199:
 	.p2align 3
-.L183:
-.LBE1117:
-.LBE1118:
-.LBE1119:
-.LBE1120:
-.LBE1121:
-.LBB1122:
-.LBB1123:
-.LBB1124:
-.LBB1125:
-.LBB1126:
-.LBB1127:
-.LBB1128:
+.L162:
+.LBE1127:
+.LBE1128:
+.LBE1129:
+.LBE1130:
+.LBE1131:
+	.loc 1 2400 0
+	ldp	w1, w0, [x20, 116]
+.LVL200:
+.LBB1132:
+.LBB1133:
+.LBB1134:
+.LBB1135:
+.LBB1136:
+.LBB1137:
+.LBB1138:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL198:
+.LVL201:
 #NO_APP
-.LBE1128:
-.LBE1127:
+.LBE1138:
+.LBE1137:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1126:
-.LBE1125:
-.LBE1124:
-.LBE1123:
-.LBE1122:
-	.loc 1 1927 0
-	ldp	w1, w0, [x20, 116]
-.LVL199:
-	stp	w1, w0, [x29, 140]
-	.loc 1 1924 0
+.LBE1136:
+.LBE1135:
+.LBE1134:
+.LBE1133:
+.LBE1132:
+	.loc 1 2397 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 1923 0
-	stp	w5, w6, [x29, 112]
-	.loc 1 1925 0
+	.loc 1 2400 0
+	stp	w1, w0, [x29, 140]
+	.loc 1 2398 0
 	ldr	w4, [x20, 176]
+	.loc 1 2401 0
+	mov	w0, 16
+	.loc 1 2396 0
+	stp	w5, w6, [x29, 112]
+	.loc 1 2398 0
 	str	w4, [x29, 120]
-.LBB1157:
-.LBB1153:
-.LBB1149:
-.LBB1138:
-.LBB1135:
+	.loc 1 2401 0
+	str	w0, [x29, 148]
+.LBB1167:
+.LBB1163:
+.LBB1159:
+.LBB1148:
+.LBB1145:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL200:
+.LVL202:
 	.loc 6 84 0
-	tbz	x3, 21, .L323
-.LVL201:
-.L225:
-.LBB1129:
-.LBB1130:
-.LBB1131:
+	tbz	x3, 21, .L302
+.LVL203:
+.L204:
+.LBB1139:
+.LBB1140:
+.LBB1141:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL202:
-.LBE1131:
-.LBE1130:
+.LVL204:
+.LBE1141:
+.LBE1140:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL203:
-.L226:
-.LBE1129:
+.LVL205:
+.L205:
+.LBE1139:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
-		adds	x0, x0, 44
+		adds	x0, x0, 48
 	csel	x1, xzr, x1, hi
 	csinv	x0, x0, xzr, cc
 	sbcs	xzr, x0, x1
 	cset	x0, ls
 
 // 0 "" 2
-.LVL204:
+.LVL206:
 #NO_APP
-.LBE1135:
-.LBE1138:
+.LBE1145:
+.LBE1148:
 	.loc 9 132 0
-	cbnz	x0, .L227
-.L228:
-.LBE1149:
-.LBE1153:
-.LBE1157:
-	.loc 1 1930 0
+	cbnz	x0, .L206
+.L207:
+.LBE1159:
+.LBE1163:
+.LBE1167:
+	.loc 1 2404 0
 	ldr	x0, [x20, 288]
-.LVL205:
+.LVL207:
 	adrp	x1, .LC5
-.LVL206:
-	.loc 1 1931 0
+.LVL208:
+	.loc 1 2405 0
 	mov	x22, -14
-	.loc 1 1930 0
+	.loc 1 2404 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
-.LVL207:
-	.loc 1 1931 0
-	b	.L176
-.LVL208:
+.LVL209:
+	.loc 1 2405 0
+	b	.L155
+.LVL210:
 	.p2align 3
-.L180:
-	.loc 1 1991 0
+.L159:
+	.loc 1 2465 0
 	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
-.LVL209:
+.LVL211:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
-	.loc 1 1992 0
+	.loc 1 2466 0
 	mov	x22, 0
-	.loc 1 1991 0
+	.loc 1 2465 0
 	bl	_dev_err
-.LVL210:
-	.loc 1 1995 0
-	b	.L176
-.LVL211:
+.LVL212:
+	.loc 1 2469 0
+	b	.L155
+.LVL213:
 	.p2align 3
-.L185:
-	.loc 1 1840 0
+.L164:
+	.loc 1 2312 0
 	bl	ebc_empty_buf_get
-.LVL212:
+.LVL214:
 	mov	x23, x0
-	.loc 1 1841 0
-	cbz	x0, .L201
-	.loc 1 1844 0
+	.loc 1 2313 0
+	cbz	x0, .L180
+	.loc 1 2316 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
-.LVL213:
-.LBB1158:
-.LBB1159:
-.LBB1160:
-.LBB1161:
-.LBB1162:
-.LBB1163:
-.LBB1164:
+.LVL215:
+	.loc 1 2321 0
+	ldr	w1, [x20, 176]
+.LBB1168:
+.LBB1169:
+.LBB1170:
+.LBB1171:
+.LBB1172:
+.LBB1173:
+.LBB1174:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL214:
+.LVL216:
 #NO_APP
-.LBE1164:
-.LBE1163:
+.LBE1174:
+.LBE1173:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1162:
-.LBE1161:
-.LBE1160:
-.LBE1159:
-.LBE1158:
-	.loc 1 1844 0
+.LBE1172:
+.LBE1171:
+.LBE1170:
+.LBE1169:
+.LBE1168:
+	.loc 1 2316 0
 	sub	w0, w22, w0
-	.loc 1 1849 0
-	ldr	w1, [x20, 176]
-	.loc 1 1848 0
+	.loc 1 2320 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1847 0
-	stp	w4, w5, [x29, 112]
-	.loc 1 1849 0
+	.loc 1 2321 0
 	str	w1, [x29, 120]
-	.loc 1 1846 0
+	.loc 1 2319 0
+	stp	w4, w5, [x29, 112]
+	.loc 1 2322 0
+	mov	w1, 16
+	.loc 1 2318 0
 	str	w0, [x29, 104]
-.LBB1193:
-.LBB1189:
-.LBB1185:
-.LBB1174:
-.LBB1171:
+	.loc 1 2322 0
+	str	w1, [x29, 148]
+.LBB1203:
+.LBB1199:
+.LBB1195:
+.LBB1184:
+.LBB1181:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL215:
+.LVL217:
 	.loc 6 84 0
-	tbz	x3, 21, .L324
-.LVL216:
-.L202:
-.LBB1165:
-.LBB1166:
-.LBB1167:
+	tbz	x3, 21, .L303
+.LVL218:
+.L181:
+.LBB1175:
+.LBB1176:
+.LBB1177:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL217:
-.LBE1167:
-.LBE1166:
+.LVL219:
+.LBE1177:
+.LBE1176:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL218:
-.L203:
-.LBE1165:
+.LVL220:
+.L182:
+.LBE1175:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
-		adds	x0, x0, 44
+		adds	x0, x0, 48
 	csel	x1, xzr, x1, hi
 	csinv	x0, x0, xzr, cc
 	sbcs	xzr, x0, x1
 	cset	x0, ls
 
 // 0 "" 2
-.LVL219:
+.LVL221:
 #NO_APP
-.LBE1171:
-.LBE1174:
+.LBE1181:
+.LBE1184:
 	.loc 9 132 0
-	cbnz	x0, .L204
-.L205:
-.LBE1185:
-.LBE1189:
-.LBE1193:
-	.loc 1 1853 0
+	cbnz	x0, .L183
+.L184:
+.LBE1195:
+.LBE1199:
+.LBE1203:
+	.loc 1 2326 0
 	mov	x0, x23
-.LVL220:
-	.loc 1 1854 0
+.LVL222:
+	.loc 1 2327 0
 	mov	x22, -14
-	.loc 1 1853 0
+	.loc 1 2326 0
 	bl	ebc_buf_release
-.LVL221:
-	.loc 1 1854 0
-	b	.L176
-.LVL222:
+.LVL223:
+	.loc 1 2327 0
+	b	.L155
+.LVL224:
 	.p2align 3
-.L319:
-.LBB1194:
-.LBB1037:
-.LBB1035:
+.L298:
+.LBB1204:
+.LBB1047:
+.LBB1045:
+.LBB1043:
 .LBB1033:
-.LBB1023:
-.LBB1020:
-.LBB1021:
-.LBB1022:
+.LBB1030:
+.LBB1031:
+.LBB1032:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1022:
-.LBE1021:
-.LBE1020:
-.LBE1023:
+.LBE1032:
+.LBE1031:
+.LBE1030:
 .LBE1033:
-.LBE1035:
-.LBE1037:
-.LBE1194:
-	.loc 1 1799 0
+.LBE1043:
+.LBE1045:
+.LBE1047:
+.LBE1204:
+	.loc 1 2270 0
 	mov	x0, x21
-.LVL223:
-.LBB1195:
-.LBB1038:
-.LBB1036:
+.LVL225:
+.LBB1205:
+.LBB1048:
+.LBB1046:
+.LBB1044:
 .LBB1034:
-.LBB1024:
 	.loc 6 84 0
-	tbz	x2, 26, .L219
-	b	.L218
-.LVL224:
+	tbz	x2, 26, .L198
+	b	.L197
+.LVL226:
 	.p2align 3
-.L315:
-.LBE1024:
+.L294:
 .LBE1034:
-.LBE1036:
-.LBE1038:
-.LBE1195:
-.LBB1196:
-.LBB1002:
-.LBB1000:
+.LBE1044:
+.LBE1046:
+.LBE1048:
+.LBE1205:
+.LBB1206:
+.LBB1012:
+.LBB1010:
+.LBB1008:
 .LBB998:
-.LBB988:
-.LBB985:
-.LBB986:
-.LBB987:
+.LBB995:
+.LBB996:
+.LBB997:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE987:
-.LBE986:
-.LBE985:
-.LBE988:
+.LBE997:
+.LBE996:
+.LBE995:
 .LBE998:
-.LBE1000:
-.LBE1002:
-.LBE1196:
-	.loc 1 1799 0
+.LBE1008:
+.LBE1010:
+.LBE1012:
+.LBE1206:
+	.loc 1 2270 0
 	mov	x0, x21
-.LVL225:
-.LBB1197:
-.LBB1003:
-.LBB1001:
+.LVL227:
+.LBB1207:
+.LBB1013:
+.LBB1011:
+.LBB1009:
 .LBB999:
-.LBB989:
 	.loc 6 84 0
-	tbz	x2, 26, .L207
-	b	.L206
-.LVL226:
+	tbz	x2, 26, .L186
+	b	.L185
+.LVL228:
 	.p2align 3
-.L323:
-.LBE989:
+.L302:
 .LBE999:
-.LBE1001:
-.LBE1003:
-.LBE1197:
-.LBB1198:
-.LBB1154:
-.LBB1150:
-.LBB1139:
-.LBB1136:
-.LBB1132:
-.LBB1133:
-.LBB1134:
+.LBE1009:
+.LBE1011:
+.LBE1013:
+.LBE1207:
+.LBB1208:
+.LBB1164:
+.LBB1160:
+.LBB1149:
+.LBB1146:
+.LBB1142:
+.LBB1143:
+.LBB1144:
 	.loc 7 106 0
 	ldr	x2, [x2]
-.LVL227:
-.LBE1134:
-.LBE1133:
-.LBE1132:
-.LBE1136:
-.LBE1139:
-.LBE1150:
-.LBE1154:
-.LBE1198:
-	.loc 1 1799 0
+.LVL229:
+.LBE1144:
+.LBE1143:
+.LBE1142:
+.LBE1146:
+.LBE1149:
+.LBE1160:
+.LBE1164:
+.LBE1208:
+	.loc 1 2270 0
 	mov	x0, x21
-.LVL228:
-.LBB1199:
-.LBB1155:
-.LBB1151:
-.LBB1140:
-.LBB1137:
+.LVL230:
+.LBB1209:
+.LBB1165:
+.LBB1161:
+.LBB1150:
+.LBB1147:
 	.loc 6 84 0
-	tbz	x2, 26, .L226
-	b	.L225
-.LVL229:
+	tbz	x2, 26, .L205
+	b	.L204
+.LVL231:
 	.p2align 3
-.L321:
-.LBE1137:
-.LBE1140:
-.LBE1151:
-.LBE1155:
-.LBE1199:
-.LBB1200:
-.LBB1106:
-.LBB1102:
-.LBB1099:
-.LBB1088:
-.LBB1084:
-.LBB1085:
-.LBB1086:
+.L300:
+.LBE1147:
+.LBE1150:
+.LBE1161:
+.LBE1165:
+.LBE1209:
+.LBB1210:
+.LBB1116:
+.LBB1112:
+.LBB1109:
+.LBB1098:
+.LBB1094:
+.LBB1095:
+.LBB1096:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1086:
-.LBE1085:
-.LBE1084:
-.LBE1088:
-.LBE1099:
-.LBE1102:
-.LBE1106:
-.LBE1200:
-	.loc 1 1799 0
+.LBE1096:
+.LBE1095:
+.LBE1094:
+.LBE1098:
+.LBE1109:
+.LBE1112:
+.LBE1116:
+.LBE1210:
+	.loc 1 2270 0
 	mov	x0, x21
-.LVL230:
-.LBB1201:
-.LBB1107:
-.LBB1103:
-.LBB1100:
-.LBB1089:
+.LVL232:
+.LBB1211:
+.LBB1117:
+.LBB1113:
+.LBB1110:
+.LBB1099:
 	.loc 6 84 0
-	tbz	x2, 26, .L222
-	b	.L221
-.LVL231:
+	tbz	x2, 26, .L201
+	b	.L200
+.LVL233:
 	.p2align 3
-.L324:
-.LBE1089:
-.LBE1100:
-.LBE1103:
-.LBE1107:
-.LBE1201:
-.LBB1202:
-.LBB1190:
-.LBB1186:
-.LBB1175:
-.LBB1172:
-.LBB1168:
-.LBB1169:
-.LBB1170:
+.L303:
+.LBE1099:
+.LBE1110:
+.LBE1113:
+.LBE1117:
+.LBE1211:
+.LBB1212:
+.LBB1200:
+.LBB1196:
+.LBB1185:
+.LBB1182:
+.LBB1178:
+.LBB1179:
+.LBB1180:
 	.loc 7 106 0
 	ldr	x2, [x2]
-.LVL232:
-.LBE1170:
-.LBE1169:
-.LBE1168:
-.LBE1172:
-.LBE1175:
-.LBE1186:
-.LBE1190:
-.LBE1202:
-	.loc 1 1799 0
+.LVL234:
+.LBE1180:
+.LBE1179:
+.LBE1178:
+.LBE1182:
+.LBE1185:
+.LBE1196:
+.LBE1200:
+.LBE1212:
+	.loc 1 2270 0
 	mov	x0, x21
-.LVL233:
-.LBB1203:
-.LBB1191:
-.LBB1187:
-.LBB1176:
-.LBB1173:
+.LVL235:
+.LBB1213:
+.LBB1201:
+.LBB1197:
+.LBB1186:
+.LBB1183:
 	.loc 6 84 0
-	tbz	x2, 26, .L203
-	b	.L202
-.LVL234:
+	tbz	x2, 26, .L182
+	b	.L181
+.LVL236:
 	.p2align 3
-.L320:
-.LBE1173:
-.LBE1176:
-.LBE1187:
-.LBE1191:
-.LBE1203:
-.LBB1204:
-.LBB1071:
-.LBB1068:
-.LBB1065:
-.LBB1054:
-.LBB1050:
-.LBB1051:
-.LBB1052:
+.L299:
+.LBE1183:
+.LBE1186:
+.LBE1197:
+.LBE1201:
+.LBE1213:
+.LBB1214:
+.LBB1081:
+.LBB1078:
+.LBB1075:
+.LBB1064:
+.LBB1060:
+.LBB1061:
+.LBB1062:
 	.loc 7 106 0
 	ldr	x2, [x2]
-.LVL235:
-.LBE1052:
-.LBE1051:
-.LBE1050:
-.LBE1054:
-.LBE1065:
-.LBE1068:
-.LBE1071:
-.LBE1204:
-	.loc 1 1799 0
+.LVL237:
+.LBE1062:
+.LBE1061:
+.LBE1060:
+.LBE1064:
+.LBE1075:
+.LBE1078:
+.LBE1081:
+.LBE1214:
+	.loc 1 2270 0
 	mov	x0, x21
-.LVL236:
-.LBB1205:
-.LBB1072:
-.LBB1069:
-.LBB1066:
-.LBB1055:
+.LVL238:
+.LBB1215:
+.LBB1082:
+.LBB1079:
+.LBB1076:
+.LBB1065:
 	.loc 6 84 0
-	tbz	x2, 26, .L198
-	b	.L197
-.LVL237:
+	tbz	x2, 26, .L177
+	b	.L176
+.LVL239:
 	.p2align 3
-.L227:
-.LBE1055:
-.LBE1066:
-.LBE1069:
-.LBE1072:
-.LBE1205:
-.LBB1206:
-.LBB1156:
+.L206:
+.LBE1065:
+.LBE1076:
+.LBE1079:
+.LBE1082:
+.LBE1215:
+.LBB1216:
+.LBB1166:
+.LBB1162:
+.LBB1151:
 .LBB1152:
-.LBB1141:
-.LBB1142:
-.LBB1143:
-.LBB1144:
-.LBB1145:
+.LBB1153:
+.LBB1154:
+.LBB1155:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL238:
-.LBE1145:
-.LBE1144:
-.LBE1143:
-.LBB1146:
-.LBB1147:
+.LVL240:
+.LBE1155:
+.LBE1154:
+.LBE1153:
+.LBB1156:
+.LBB1157:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL239:
+.LVL241:
 #NO_APP
-.LBE1147:
-.LBE1146:
-.LBB1148:
+.LBE1157:
+.LBE1156:
+.LBB1158:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL240:
-.LBE1148:
+.LVL242:
+.LBE1158:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL241:
+.LVL243:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL242:
+.LVL244:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1142:
-.LBE1141:
+.LBE1152:
+.LBE1151:
 	.loc 9 134 0
-	mov	x2, 44
+	mov	x2, 48
 	add	x1, x29, 104
-.LVL243:
+.LVL245:
 	bl	__arch_copy_to_user
-.LVL244:
-.LBE1152:
-.LBE1156:
-.LBE1206:
-	.loc 1 1929 0
-	cbnz	x0, .L228
-.LBB1207:
-.LBB1007:
+.LVL246:
+.LBE1162:
+.LBE1166:
+.LBE1216:
+	.loc 1 2403 0
+	cbnz	x0, .L207
+.LBB1217:
+.LBB1017:
 	mov	x22, 0
-	b	.L176
-.LVL245:
+	b	.L155
+.LVL247:
 	.p2align 3
-.L204:
-.LBE1007:
-.LBE1207:
-.LBB1208:
-.LBB1192:
+.L183:
+.LBE1017:
+.LBE1217:
+.LBB1218:
+.LBB1202:
+.LBB1198:
+.LBB1187:
 .LBB1188:
-.LBB1177:
-.LBB1178:
-.LBB1179:
-.LBB1180:
-.LBB1181:
+.LBB1189:
+.LBB1190:
+.LBB1191:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL246:
-.LBE1181:
-.LBE1180:
-.LBE1179:
-.LBB1182:
-.LBB1183:
+.LVL248:
+.LBE1191:
+.LBE1190:
+.LBE1189:
+.LBB1192:
+.LBB1193:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL247:
+.LVL249:
 #NO_APP
-.LBE1183:
-.LBE1182:
-.LBB1184:
+.LBE1193:
+.LBE1192:
+.LBB1194:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL248:
-.LBE1184:
+.LVL250:
+.LBE1194:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL249:
+.LVL251:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL250:
+.LVL252:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1178:
-.LBE1177:
+.LBE1188:
+.LBE1187:
 	.loc 9 134 0
-	mov	x2, 44
+	mov	x2, 48
 	add	x1, x29, 104
-.LVL251:
+.LVL253:
 	bl	__arch_copy_to_user
-.LVL252:
-.LBE1188:
-.LBE1192:
-.LBE1208:
-	.loc 1 1852 0
-	cbnz	w0, .L205
-.LBB1209:
-.LBB1008:
+.LVL254:
+.LBE1198:
+.LBE1202:
+.LBE1218:
+	.loc 1 2325 0
+	cbnz	w0, .L184
+.LBB1219:
+.LBB1018:
 	mov	x22, 0
-	b	.L176
-.LVL253:
+	b	.L155
+.LVL255:
 	.p2align 3
-.L209:
-.LBE1008:
-.LBE1209:
-	.loc 1 1860 0
+.L188:
+.LBE1018:
+.LBE1219:
+	.loc 1 2333 0
 	mov	x22, -14
-	b	.L176
-.LVL254:
+	b	.L155
+.LVL256:
 	.p2align 3
-.L316:
-	.loc 1 1875 0
+.L295:
+	.loc 1 2348 0
 	mov	w2, 1
 	str	w2, [x20, 96]
-	.loc 1 1876 0
+	.loc 1 2349 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL255:
-	b	.L211
+.LVL257:
+	b	.L190
 	.p2align 3
-.L317:
-	.loc 1 1878 0 discriminator 1
+.L296:
+	.loc 1 2351 0 discriminator 1
 	ldr	w0, [x20, 616]
-	cbz	w0, .L213
-.LBB1210:
-.LBB1009:
+	cbz	w0, .L192
+.LBB1220:
+.LBB1019:
 	mov	x22, 0
-	b	.L176
-.LVL256:
-.L201:
-.LBE1009:
-.LBE1210:
-	.loc 1 1828 0
+	b	.L155
+.LVL258:
+.L180:
+.LBE1019:
+.LBE1220:
+	.loc 1 2299 0
 	mov	x22, -1
-	b	.L176
-.LVL257:
-.L250:
-.LBB1211:
-.LBB1108:
-.LBB1104:
+	b	.L155
+.LVL259:
+.L229:
+.LBB1221:
+.LBB1118:
+.LBB1114:
 	.loc 9 112 0
 	mov	x0, 4
-.LVL258:
-.L223:
+.LVL260:
+.L202:
 	.loc 9 119 0
 	mov	x2, x0
 	mov	w1, 0
-.LVL259:
+.LVL261:
 	add	x0, x22, x3
-.LVL260:
+.LVL262:
 	bl	memset
-.LVL261:
-.LBE1104:
-.LBE1108:
-.LBE1211:
-	.loc 1 1917 0
+.LVL263:
+.LBE1114:
+.LBE1118:
+.LBE1221:
+	.loc 1 2390 0
 	ldr	x0, [x20, 288]
 	adrp	x1, .LC4
-	.loc 1 1918 0
+	.loc 1 2391 0
 	mov	x22, -14
-	.loc 1 1917 0
+	.loc 1 2390 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
-.LVL262:
-	.loc 1 1918 0
-	b	.L176
-.L314:
-	.loc 1 1996 0
+.LVL264:
+	.loc 1 2391 0
+	b	.L155
+.L293:
+	.loc 1 2470 0
 	bl	__stack_chk_fail
-.LVL263:
-.L322:
+.LVL265:
+.L301:
 	mov	x3, 4
 	sub	x3, x3, x0
-.LVL264:
-	b	.L223
+.LVL266:
+	b	.L202
 	.cfi_endproc
-.LFE2833:
+.LFE2840:
 	.size	ebc_io_ctl, .-ebc_io_ctl
 	.align	2
 	.p2align 3,,7
 	.type	frame_done_callback, %function
 frame_done_callback:
-.LFB2824:
-	.loc 1 1184 0
+.LFB2831:
+	.loc 1 1643 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 1185 0
+	.loc 1 1644 0
 	adrp	x1, .LANCHOR0
-	.loc 1 1184 0
+	.loc 1 1643 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 1185 0
+	.loc 1 1644 0
 	ldr	x20, [x1, #:lo12:.LANCHOR0]
-	.loc 1 1184 0
+	.loc 1 1643 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 1188 0
+	.loc 1 1647 0
 	add	x19, x20, 184
 	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
-	tbnz	w0, #31, .L326
+	tbnz	w0, #31, .L305
 	cmp	w0, 1
-	ble	.L327
+	ble	.L306
 	sub	w0, w0, #22
 	cmp	w0, 1
-	bls	.L327
-.L326:
-	.loc 1 1208 0
+	bls	.L306
+.L305:
+	.loc 1 1667 0
 	ldr	w0, [x19, 56]
-	cbnz	w0, .L332
-	.loc 1 1214 0
+	cbnz	w0, .L311
+	.loc 1 1673 0
 	ldr	x0, [x19, 104]
-	.loc 1 1213 0
+	.loc 1 1672 0
 	mov	w20, 1
-	.loc 1 1212 0
+	.loc 1 1671 0
 	str	wzr, [x19, 44]
-	.loc 1 1214 0
+	.loc 1 1673 0
 	adrp	x1, .LC9
-	.loc 1 1213 0
+	.loc 1 1672 0
 	str	w20, [x19, 92]
-	.loc 1 1214 0
+	.loc 1 1673 0
 	add	x1, x1, :lo12:.LC9
-	.loc 1 1215 0
+	.loc 1 1674 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
-	.loc 1 1214 0
+	.loc 1 1673 0
 	bl	_dev_info
-.LVL265:
-	.loc 1 1215 0
+.LVL267:
+	.loc 1 1674 0
 	mov	w2, w20
 	add	x0, x19, 352
 	mov	w1, w20
 	bl	__wake_up_sync
-.LVL266:
-	.loc 1 1216 0
+.LVL268:
+	.loc 1 1675 0
 	mov	w2, w20
 	mov	w1, w20
 	add	x0, x19, 304
 	bl	__wake_up_sync
-.LVL267:
-	.loc 1 1220 0
+.LVL269:
+	.loc 1 1679 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -3238,17 +3188,17 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L327:
+.L306:
 	.cfi_restore_state
-	.loc 1 1193 0
+	.loc 1 1652 0
 	ldr	w0, [x19, 52]
-	cbz	w0, .L328
-	.loc 1 1194 0
+	cbz	w0, .L307
+	.loc 1 1653 0
 	add	x1, x1, :lo12:.LANCHOR0
 	ldr	x0, [x1, 8]
 	bl	wake_up_process
-.LVL268:
-	.loc 1 1220 0
+.LVL270:
+	.loc 1 1679 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -3261,51 +3211,51 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L328:
+.L307:
 	.cfi_restore_state
-	.loc 1 1197 0
+	.loc 1 1656 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC8
 	add	x1, x1, :lo12:.LC8
-	.loc 1 1202 0
+	.loc 1 1661 0
 	mov	w21, 1
-	.loc 1 1197 0
+	.loc 1 1656 0
 	bl	_dev_info
-.LVL269:
-	.loc 1 1199 0
+.LVL271:
+	.loc 1 1658 0
 	ldp	w3, w2, [x20, 108]
 	mov	w1, 0
 	ldr	x0, [x19, 168]
 	mul	w2, w3, w2
 	bl	memset
-.LVL270:
-	.loc 1 1200 0
+.LVL272:
+	.loc 1 1659 0
 	adrp	x2, jiffies
 	add	x0, x20, 688
 	mov	x1, 402653184
 	ldr	x2, [x2, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL271:
-	.loc 1 1202 0
+.LVL273:
+	.loc 1 1661 0
 	str	w21, [x19, 92]
-	.loc 1 1201 0
+	.loc 1 1660 0
 	str	wzr, [x19, 44]
-	.loc 1 1203 0
+	.loc 1 1662 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x19, 352
 	bl	__wake_up_sync
-.LVL272:
-	.loc 1 1204 0
+.LVL274:
+	.loc 1 1663 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x19, 304
 	bl	__wake_up_sync
-.LVL273:
-	.loc 1 1220 0
+.LVL275:
+	.loc 1 1679 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -3318,18 +3268,18 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L332:
+.L311:
 	.cfi_restore_state
-	.loc 1 1210 0
+	.loc 1 1669 0
 	add	x1, x1, :lo12:.LANCHOR0
-	.loc 1 1209 0
+	.loc 1 1668 0
 	mov	w0, 1
 	str	w0, [x19, 44]
-	.loc 1 1210 0
+	.loc 1 1669 0
 	ldr	x0, [x1, 8]
 	bl	wake_up_process
-.LVL274:
-	.loc 1 1220 0
+.LVL276:
+	.loc 1 1679 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -3341,426 +3291,357 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2824:
+.LFE2831:
 	.size	frame_done_callback, .-frame_done_callback
 	.align	2
 	.p2align 3,,7
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
-.LFB2831:
-	.loc 1 1725 0
+.LFB2838:
+	.loc 1 2196 0
 	.cfi_startproc
-.LVL275:
+.LVL277:
 	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 1726 0
+	.loc 1 2197 0
 	bl	frame_done_callback
-.LVL276:
-	.loc 1 1728 0
-	ldp	x29, x30, [sp], 16
-	.cfi_restore 30
-	.cfi_restore 29
-	.cfi_def_cfa 31, 0
-	ret
-	.cfi_endproc
-.LFE2831:
-	.size	ebc_frame_timeout, .-ebc_frame_timeout
-	.align	2
-	.p2align 3,,7
-	.type	check_black_percent, %function
-check_black_percent:
-.LFB2826:
-	.loc 1 1316 0
-	.cfi_startproc
-.LVL277:
-	.loc 1 1321 0
-	mov	w2, 26215
-	.loc 1 1323 0
-	cmp	w1, 0
-	.loc 1 1321 0
-	movk	w2, 0x6666, lsl 16
-	.loc 1 1323 0
-	add	w5, w1, 7
-	csel	w5, w5, w1, lt
 .LVL278:
-	.loc 1 1321 0
-	smull	x4, w1, w2
-	.loc 1 1323 0
-	asr	w5, w5, 3
-.LVL279:
-	cmp	w5, 0
-	.loc 1 1321 0
-	asr	x4, x4, 34
-	sub	w4, w4, w1, asr 31
-.LVL280:
-	.loc 1 1323 0
-	ble	.L336
-	mov	x1, 0
-.LVL281:
-	mov	w2, 0
-.LVL282:
-	b	.L339
-	.p2align 3
-.L347:
-	.loc 1 1323 0 is_stmt 0 discriminator 2
-	cmp	w5, w1
-	ble	.L336
-.L339:
-	.loc 1 1325 0 is_stmt 1
-	ldr	x3, [x0, x1, lsl 3]
-	add	x1, x1, 1
-	.loc 1 1326 0
-	cmp	x3, 0
-	cinc	w2, w2, ne
-	.loc 1 1327 0
-	cmp	w4, w2, lsl 3
-	bge	.L347
-	.loc 1 1328 0
-	mov	w0, 0
-.LVL283:
-	ret
-.LVL284:
-.L336:
-	.loc 1 1316 0
-	stp	x29, x30, [sp, -16]!
-	.cfi_def_cfa_offset 16
-	.cfi_offset 29, -16
-	.cfi_offset 30, -8
-	.loc 1 1331 0
-	adrp	x0, .LC10
-.LVL285:
-	add	x0, x0, :lo12:.LC10
-	.loc 1 1316 0
-	add	x29, sp, 0
-	.cfi_def_cfa_register 29
-	.loc 1 1331 0
-	bl	printk
-.LVL286:
-	.loc 1 1333 0
-	mov	w0, 1
-	.loc 1 1334 0
+	.loc 1 2199 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2826:
-	.size	check_black_percent, .-check_black_percent
+.LFE2838:
+	.size	ebc_frame_timeout, .-ebc_frame_timeout
 	.align	2
 	.p2align 3,,7
 	.type	ebc_lut_update, %function
 ebc_lut_update:
-.LFB2825:
-	.loc 1 1223 0
+.LFB2832:
+	.loc 1 1682 0
 	.cfi_startproc
-.LVL287:
-	stp	x29, x30, [sp, -64]!
-	.cfi_def_cfa_offset 64
-	.cfi_offset 29, -64
-	.cfi_offset 30, -56
-	.loc 1 1225 0
-	mov	w3, 25
-	.loc 1 1223 0
+.LVL279:
+	stp	x29, x30, [sp, -80]!
+	.cfi_def_cfa_offset 80
+	.cfi_offset 29, -80
+	.cfi_offset 30, -72
+	.loc 1 1684 0
+	mov	w4, 25
+	.loc 1 1682 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x21, x22, [sp, 32]
-	.cfi_offset 21, -32
-	.cfi_offset 22, -24
+	.cfi_offset 21, -48
+	.cfi_offset 22, -40
 	mov	x21, x0
 	stp	x19, x20, [sp, 16]
-	.cfi_offset 19, -48
-	.cfi_offset 20, -40
-	.loc 1 1225 0
-	add	x1, x29, 64
-	.loc 1 1223 0
+	.loc 1 1684 0
+	add	x0, x29, 80
+.LVL280:
+	.loc 1 1682 0
+	str	x23, [sp, 48]
+	.cfi_offset 19, -64
+	.cfi_offset 20, -56
+	.cfi_offset 23, -32
+	.loc 1 1682 0
 	adrp	x19, __stack_chk_guard
-	add	x0, x19, :lo12:__stack_chk_guard
-.LVL288:
-	.loc 1 1229 0
+	add	x3, x19, :lo12:__stack_chk_guard
+	mov	w23, w1
+	.loc 1 1690 0
 	ldr	x2, [x21, 16]
-	.loc 1 1225 0
-	str	w3, [x1, -12]!
-.LVL289:
-	.loc 1 1223 0
-	ldr	x3, [x0]
-	str	x3, [x29, 56]
-	mov	x3,0
-.LBB1212:
-.LBB1213:
+	.loc 1 1682 0
+	ldr	x1, [x3]
+	str	x1, [x29, 72]
+	mov	x1,0
+.LVL281:
+	.loc 1 1684 0
+	str	w4, [x0, -12]!
+.LVL282:
+.LBB1222:
+.LBB1223:
 	.loc 3 50 0
+	mov	x1, x0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL290:
+.LVL283:
 	mov	w20, w0
-.LBE1213:
-.LBE1212:
-	.loc 1 1230 0
-	cbnz	w0, .L349
-.LVL291:
-	.loc 1 1231 0
-	ldr	w2, [x29, 52]
-	.loc 1 1232 0
+.LBE1223:
+.LBE1222:
+	.loc 1 1691 0
+	cbnz	w0, .L315
+.LVL284:
+	.loc 1 1692 0
+	ldr	w2, [x29, 68]
+	.loc 1 1693 0
 	add	x22, x21, 184
-	.loc 1 1231 0
-	tbnz	w2, #31, .L373
-	.loc 1 1235 0
+	.loc 1 1692 0
+	tbnz	w2, #31, .L339
+	.loc 1 1696 0
 	cmp	w2, 50
-	bgt	.L374
-.L351:
-	.loc 1 1243 0
+	bgt	.L340
+.L317:
+	.loc 1 1704 0
 	ldr	x0, [x22, 104]
-	adrp	x1, .LC14
-	add	x1, x1, :lo12:.LC14
+	adrp	x1, .LC13
+	add	x1, x1, :lo12:.LC13
 	bl	_dev_info
-.LVL292:
-	.loc 1 1246 0
+.LVL285:
+	.loc 1 1707 0
 	ldr	x0, [x22, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 23
-	bls	.L375
-	.loc 1 1302 0
-	ldr	w2, [x29, 52]
-.L372:
+	bls	.L341
+	.loc 1 1763 0
+	ldr	w2, [x29, 68]
+	mov	w3, w23
+.L338:
 	mov	w1, 7
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL293:
-	cbnz	w0, .L364
+.LVL286:
+	cbnz	w0, .L330
 	.p2align 2
-.L367:
-	.loc 1 1307 0
-	cbnz	w20, .L365
-.L348:
-	.loc 1 1313 0
+.L333:
+	.loc 1 1768 0
+	cbnz	w20, .L331
+.L314:
+	.loc 1 1774 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	w0, w20
-	ldr	x2, [x29, 56]
+	ldr	x2, [x29, 72]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L376
+	cbnz	x1, .L342
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL294:
-	ldp	x29, x30, [sp], 64
+.LVL287:
+	ldr	x23, [sp, 48]
+.LVL288:
+	ldp	x29, x30, [sp], 80
 	.cfi_remember_state
 	.cfi_restore 30
 	.cfi_restore 29
+	.cfi_restore 23
 	.cfi_restore 21
 	.cfi_restore 22
 	.cfi_restore 19
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL295:
+.LVL289:
 	.p2align 3
-.L375:
+.L341:
 	.cfi_restore_state
-	.loc 1 1246 0
-	adrp	x1, .L354
-	.loc 1 1248 0
-	ldr	w2, [x29, 52]
-	.loc 1 1246 0
-	add	x1, x1, :lo12:.L354
+	.loc 1 1707 0
+	adrp	x1, .L320
+	.loc 1 1709 0
+	mov	w3, w23
+	.loc 1 1707 0
+	add	x1, x1, :lo12:.L320
+	.loc 1 1709 0
+	ldr	w2, [x29, 68]
+	.loc 1 1707 0
 	ldrb	w0, [x1,w0,uxtw]
-	adr	x1, .Lrtx354
+	adr	x1, .Lrtx320
 	add	x0, x1, w0, sxtb #2
 	br	x0
-.Lrtx354:
+.Lrtx320:
 	.section	.rodata
 	.align	0
 	.align	2
-.L354:
-	.byte	(.L372 - .Lrtx354) / 4
-	.byte	(.L355 - .Lrtx354) / 4
-	.byte	(.L372 - .Lrtx354) / 4
-	.byte	(.L356 - .Lrtx354) / 4
-	.byte	(.L357 - .Lrtx354) / 4
-	.byte	(.L358 - .Lrtx354) / 4
-	.byte	(.L359 - .Lrtx354) / 4
-	.byte	(.L372 - .Lrtx354) / 4
-	.byte	(.L356 - .Lrtx354) / 4
-	.byte	(.L357 - .Lrtx354) / 4
-	.byte	(.L358 - .Lrtx354) / 4
-	.byte	(.L359 - .Lrtx354) / 4
-	.byte	(.L360 - .Lrtx354) / 4
-	.byte	(.L360 - .Lrtx354) / 4
-	.byte	(.L361 - .Lrtx354) / 4
-	.byte	(.L362 - .Lrtx354) / 4
-	.byte	(.L361 - .Lrtx354) / 4
-	.byte	(.L363 - .Lrtx354) / 4
-	.byte	(.L372 - .Lrtx354) / 4
-	.byte	(.L372 - .Lrtx354) / 4
-	.byte	(.L372 - .Lrtx354) / 4
-	.byte	(.L372 - .Lrtx354) / 4
-	.byte	(.L361 - .Lrtx354) / 4
-	.byte	(.L362 - .Lrtx354) / 4
+.L320:
+	.byte	(.L338 - .Lrtx320) / 4
+	.byte	(.L321 - .Lrtx320) / 4
+	.byte	(.L338 - .Lrtx320) / 4
+	.byte	(.L322 - .Lrtx320) / 4
+	.byte	(.L323 - .Lrtx320) / 4
+	.byte	(.L324 - .Lrtx320) / 4
+	.byte	(.L325 - .Lrtx320) / 4
+	.byte	(.L338 - .Lrtx320) / 4
+	.byte	(.L322 - .Lrtx320) / 4
+	.byte	(.L323 - .Lrtx320) / 4
+	.byte	(.L324 - .Lrtx320) / 4
+	.byte	(.L325 - .Lrtx320) / 4
+	.byte	(.L326 - .Lrtx320) / 4
+	.byte	(.L326 - .Lrtx320) / 4
+	.byte	(.L327 - .Lrtx320) / 4
+	.byte	(.L328 - .Lrtx320) / 4
+	.byte	(.L327 - .Lrtx320) / 4
+	.byte	(.L329 - .Lrtx320) / 4
+	.byte	(.L338 - .Lrtx320) / 4
+	.byte	(.L338 - .Lrtx320) / 4
+	.byte	(.L338 - .Lrtx320) / 4
+	.byte	(.L338 - .Lrtx320) / 4
+	.byte	(.L327 - .Lrtx320) / 4
+	.byte	(.L328 - .Lrtx320) / 4
 	.text
-.LVL296:
+.LVL290:
 	.p2align 3
-.L349:
-	.loc 1 1241 0
+.L315:
+	.loc 1 1702 0
 	add	x22, x21, 184
 	mov	w2, w0
-	adrp	x1, .LC13
-	add	x1, x1, :lo12:.LC13
+	adrp	x1, .LC12
+	add	x1, x1, :lo12:.LC12
 	ldr	x0, [x22, 104]
 	bl	_dev_err
-.LVL297:
-	ldr	w2, [x29, 52]
-	b	.L351
+.LVL291:
+	ldr	w2, [x29, 68]
+	b	.L317
 	.p2align 3
-.L374:
-	.loc 1 1236 0
+.L340:
+	.loc 1 1697 0
 	ldr	x0, [x22, 104]
-	adrp	x1, .LC12
-	add	x1, x1, :lo12:.LC12
+	adrp	x1, .LC11
+	add	x1, x1, :lo12:.LC11
 	bl	_dev_info
-.LVL298:
-	.loc 1 1237 0
+.LVL292:
+	.loc 1 1698 0
 	mov	w2, 50
-	str	w2, [x29, 52]
-.LVL299:
-	b	.L351
+	str	w2, [x29, 68]
+.LVL293:
+	b	.L317
 	.p2align 3
-.L363:
-	.loc 1 1248 0
+.L329:
+	.loc 1 1709 0
 	mov	w1, 1
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL300:
-	cbz	w0, .L367
+.LVL294:
+	cbz	w0, .L333
 	.p2align 2
-.L364:
-	.loc 1 1237 0
+.L330:
+	.loc 1 1698 0
 	mov	w20, -1
-.L365:
-	.loc 1 1308 0
+.L331:
+	.loc 1 1769 0
 	ldr	x0, [x22, 104]
-	adrp	x1, .LC15
-	add	x1, x1, :lo12:.LC15
+	adrp	x1, .LC14
+	add	x1, x1, :lo12:.LC14
 	bl	_dev_err
-.LVL301:
-	.loc 1 1309 0
-	b	.L348
+.LVL295:
+	.loc 1 1770 0
+	b	.L314
 	.p2align 3
-.L357:
-	.loc 1 1288 0
+.L323:
+	.loc 1 1749 0
 	mov	w1, 9
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL302:
-	cbnz	w0, .L364
-	b	.L367
+.LVL296:
+	cbnz	w0, .L330
+	b	.L333
 	.p2align 3
-.L358:
-	.loc 1 1293 0
+.L324:
+	.loc 1 1754 0
 	mov	w1, 10
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL303:
-	cbnz	w0, .L364
-	b	.L367
+.LVL297:
+	cbnz	w0, .L330
+	b	.L333
 	.p2align 3
-.L355:
-	.loc 1 1262 0
+.L321:
+	.loc 1 1723 0
 	mov	w1, 5
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL304:
-	cbnz	w0, .L364
-	b	.L367
+.LVL298:
+	cbnz	w0, .L330
+	b	.L333
 	.p2align 3
-.L356:
-	.loc 1 1283 0
+.L322:
+	.loc 1 1744 0
 	mov	w1, 8
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL305:
-	cbnz	w0, .L364
-	b	.L367
+.LVL299:
+	cbnz	w0, .L330
+	b	.L333
 	.p2align 3
-.L359:
-	.loc 1 1298 0
+.L325:
+	.loc 1 1759 0
 	mov	w1, 11
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL306:
-	cbnz	w0, .L364
-	b	.L367
+.LVL300:
+	cbnz	w0, .L330
+	b	.L333
 	.p2align 3
-.L360:
-	.loc 1 1267 0
+.L326:
+	.loc 1 1728 0
 	mov	w1, 6
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL307:
-	cbnz	w0, .L364
-	b	.L367
+.LVL301:
+	cbnz	w0, .L330
+	b	.L333
 	.p2align 3
-.L361:
-	.loc 1 1273 0
+.L327:
+	.loc 1 1734 0
 	mov	w1, 4
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL308:
-	cbnz	w0, .L364
-	b	.L367
+.LVL302:
+	cbnz	w0, .L330
+	b	.L333
 	.p2align 3
-.L362:
-	.loc 1 1278 0
+.L328:
+	.loc 1 1739 0
 	mov	w1, 3
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL309:
-	cbnz	w0, .L364
-	b	.L367
+.LVL303:
+	cbnz	w0, .L330
+	b	.L333
 	.p2align 3
-.L373:
-	.loc 1 1232 0
+.L339:
+	.loc 1 1693 0
 	ldr	x0, [x22, 104]
-	adrp	x1, .LC11
-	add	x1, x1, :lo12:.LC11
+	adrp	x1, .LC10
+	add	x1, x1, :lo12:.LC10
 	bl	_dev_info
-.LVL310:
-	.loc 1 1233 0
-	str	wzr, [x29, 52]
+.LVL304:
+	.loc 1 1694 0
+	str	wzr, [x29, 68]
 	mov	w2, 0
-	b	.L351
-.L376:
-	.loc 1 1313 0
+	b	.L317
+.L342:
+	.loc 1 1774 0
 	bl	__stack_chk_fail
-.LVL311:
+.LVL305:
 	.cfi_endproc
-.LFE2825:
+.LFE2832:
 	.size	ebc_lut_update, .-ebc_lut_update
 	.align	2
 	.p2align 3,,7
 	.type	ebc_buf_state_read, %function
 ebc_buf_state_read:
-.LFB2845:
-	.loc 1 2164 0
+.LFB2852:
+	.loc 1 2638 0
 	.cfi_startproc
-.LVL312:
+.LVL306:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2165 0
+	.loc 1 2639 0
 	mov	x0, x2
-.LVL313:
-	.loc 1 2164 0
+.LVL307:
+	.loc 1 2638 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2165 0
+	.loc 1 2639 0
 	bl	ebc_buf_state_show
-.LVL314:
-	.loc 1 2166 0
+.LVL308:
+	.loc 1 2640 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3768,39 +3649,39 @@ ebc_buf_state_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2845:
+.LFE2852:
 	.size	ebc_buf_state_read, .-ebc_buf_state_read
 	.align	2
 	.p2align 3,,7
 	.type	ebc_state_read, %function
 ebc_state_read:
-.LFB2844:
-	.loc 1 2155 0
+.LFB2851:
+	.loc 1 2629 0
 	.cfi_startproc
-.LVL315:
+.LVL309:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2156 0
+	.loc 1 2630 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2155 0
+	.loc 1 2629 0
 	mov	x0, x2
-.LVL316:
-	.loc 1 2156 0
-	adrp	x1, .LC16
-.LVL317:
-	.loc 1 2155 0
+.LVL310:
+	.loc 1 2630 0
+	adrp	x1, .LC15
+.LVL311:
+	.loc 1 2629 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2156 0
+	.loc 1 2630 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL318:
-	add	x1, x1, :lo12:.LC16
+.LVL312:
+	add	x1, x1, :lo12:.LC15
 	ldr	w2, [x2, 624]
 	bl	sprintf
-.LVL319:
-	.loc 1 2157 0
+.LVL313:
+	.loc 1 2631 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3808,38 +3689,38 @@ ebc_state_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2844:
+.LFE2851:
 	.size	ebc_state_read, .-ebc_state_read
 	.align	2
 	.p2align 3,,7
 	.type	ebc_version_read, %function
 ebc_version_read:
-.LFB2843:
-	.loc 1 2146 0
+.LFB2850:
+	.loc 1 2620 0
 	.cfi_startproc
-.LVL320:
+.LVL314:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mov	x0, x2
-.LVL321:
-	.loc 1 2147 0
-	adrp	x1, .LC18
-.LVL322:
-	adrp	x2, .LC17
-.LVL323:
-	.loc 1 2146 0
+.LVL315:
+	.loc 1 2621 0
+	adrp	x1, .LC17
+.LVL316:
+	adrp	x2, .LC16
+.LVL317:
+	.loc 1 2620 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2147 0
-	add	x2, x2, :lo12:.LC17
-	.loc 1 2146 0
-	.loc 1 2147 0
-	add	x1, x1, :lo12:.LC18
+	.loc 1 2621 0
+	add	x2, x2, :lo12:.LC16
+	.loc 1 2620 0
+	.loc 1 2621 0
+	add	x1, x1, :lo12:.LC17
 	bl	sprintf
-.LVL324:
-	.loc 1 2148 0
+.LVL318:
+	.loc 1 2622 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3847,56 +3728,56 @@ ebc_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2843:
+.LFE2850:
 	.size	ebc_version_read, .-ebc_version_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
-.LFB2841:
-	.loc 1 2110 0
+.LFB2848:
+	.loc 1 2584 0
 	.cfi_startproc
-.LVL325:
+.LVL319:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 2111 0
+	.loc 1 2585 0
 	adrp	x0, .LANCHOR0
-.LVL326:
-	.loc 1 2110 0
+.LVL320:
+	.loc 1 2584 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2114 0
+	.loc 1 2588 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2110 0
+	.loc 1 2584 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2110 0
+	.loc 1 2584 0
 	mov	x19, x2
-	.loc 1 2114 0
+	.loc 1 2588 0
 	ldr	x1, [x0, 16]
-.LVL327:
-.LBB1214:
-.LBB1215:
+.LVL321:
+.LBB1224:
+.LBB1225:
 	.loc 3 55 0
 	mov	x0, x1
 	ldr	x1, [x1, 64]
 	blr	x1
-.LVL328:
-.LBE1215:
-.LBE1214:
-	.loc 1 2116 0
+.LVL322:
+.LBE1225:
+.LBE1224:
+	.loc 1 2590 0
 	mov	w2, w0
-	adrp	x1, .LC16
+	adrp	x1, .LC15
 	mov	x0, x19
-	add	x1, x1, :lo12:.LC16
+	add	x1, x1, :lo12:.LC15
 	bl	sprintf
-.LVL329:
-	.loc 1 2117 0
+.LVL323:
+	.loc 1 2591 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL330:
+.LVL324:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3904,72 +3785,72 @@ pmic_vcom_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2841:
+.LFE2848:
 	.size	pmic_vcom_read, .-pmic_vcom_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_temp_read, %function
 pmic_temp_read:
-.LFB2840:
-	.loc 1 2096 0
+.LFB2847:
+	.loc 1 2570 0
 	.cfi_startproc
-.LVL331:
+.LVL325:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 2097 0
+	.loc 1 2571 0
 	adrp	x0, .LANCHOR0
-.LVL332:
-	.loc 1 2096 0
+.LVL326:
+	.loc 1 2570 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2100 0
+	.loc 1 2574 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-.LBB1216:
-.LBB1217:
+.LBB1226:
+.LBB1227:
 	.loc 3 50 0
 	add	x1, x29, 36
-.LVL333:
-.LBE1217:
-.LBE1216:
-	.loc 1 2096 0
+.LVL327:
+.LBE1227:
+.LBE1226:
+	.loc 1 2570 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 2096 0
+	.loc 1 2570 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
-.LVL334:
-	.loc 1 2100 0
+.LVL328:
+	.loc 1 2574 0
 	ldr	x2, [x0, 16]
-.LBB1219:
-.LBB1218:
+.LBB1229:
+.LBB1228:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL335:
-.LBE1218:
-.LBE1219:
-	.loc 1 2102 0
+.LVL329:
+.LBE1228:
+.LBE1229:
+	.loc 1 2576 0
 	ldr	w2, [x29, 36]
-	adrp	x1, .LC16
+	adrp	x1, .LC15
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC16
+	add	x1, x1, :lo12:.LC15
 	bl	sprintf
-.LVL336:
-	.loc 1 2103 0
+.LVL330:
+	.loc 1 2577 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L388
+	cbnz	x1, .L354
 	ldp	x19, x20, [sp, 16]
-.LVL337:
+.LVL331:
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -3979,46 +3860,46 @@ pmic_temp_read:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL338:
-.L388:
+.LVL332:
+.L354:
 	.cfi_restore_state
 	bl	__stack_chk_fail
-.LVL339:
+.LVL333:
 	.cfi_endproc
-.LFE2840:
+.LFE2847:
 	.size	pmic_temp_read, .-pmic_temp_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_name_read, %function
 pmic_name_read:
-.LFB2839:
-	.loc 1 2085 0
+.LFB2846:
+	.loc 1 2559 0
 	.cfi_startproc
-.LVL340:
+.LVL334:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2086 0
+	.loc 1 2560 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2085 0
+	.loc 1 2559 0
 	mov	x0, x2
-.LVL341:
-	.loc 1 2088 0
-	adrp	x1, .LC18
-.LVL342:
-	.loc 1 2085 0
+.LVL335:
+	.loc 1 2562 0
+	adrp	x1, .LC17
+.LVL336:
+	.loc 1 2559 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2088 0
+	.loc 1 2562 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL343:
-	add	x1, x1, :lo12:.LC18
+.LVL337:
+	add	x1, x1, :lo12:.LC17
 	ldr	x2, [x2, 16]
 	add	x2, x2, 8
 	bl	sprintf
-.LVL344:
-	.loc 1 2089 0
+.LVL338:
+	.loc 1 2563 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -4026,24 +3907,24 @@ pmic_name_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2839:
+.LFE2846:
 	.size	pmic_name_read, .-pmic_name_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
-.LFB2842:
-	.loc 1 2122 0
+.LFB2849:
+	.loc 1 2596 0
 	.cfi_startproc
-.LVL345:
+.LVL339:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 2123 0
+	.loc 1 2597 0
 	adrp	x0, .LANCHOR0
-.LVL346:
-	.loc 1 2122 0
+.LVL340:
+	.loc 1 2596 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -4053,47 +3934,47 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 2122 0
+	.loc 1 2596 0
 	add	x1, x19, :lo12:__stack_chk_guard
-.LVL347:
+.LVL341:
 	mov	x21, x2
-	.loc 1 2123 0
+	.loc 1 2597 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
-.LVL348:
-	.loc 1 2122 0
+.LVL342:
+	.loc 1 2596 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
-.LVL349:
+.LVL343:
 	mov	x20, x3
-	.loc 1 2126 0
+	.loc 1 2600 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
-.LVL350:
-	.loc 1 2127 0
-	cbnz	w0, .L398
-.LVL351:
-	.loc 1 2131 0
+.LVL344:
+	.loc 1 2601 0
+	cbnz	w0, .L364
+.LVL345:
+	.loc 1 2605 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
-.LVL352:
-	.loc 1 2132 0
-	cbnz	w0, .L399
-.L391:
-	.loc 1 2138 0
+.LVL346:
+	.loc 1 2606 0
+	cbnz	w0, .L365
+.L357:
+	.loc 1 2612 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
-.LVL353:
+.LVL347:
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L400
+	cbnz	x1, .L366
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL354:
+.LVL348:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -4104,53 +3985,53 @@ pmic_vcom_write:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL355:
+.LVL349:
 	.p2align 3
-.L398:
+.L364:
 	.cfi_restore_state
-	.loc 1 2128 0
+	.loc 1 2602 0
 	ldr	x0, [x22]
-	adrp	x1, .LC19
+	adrp	x1, .LC18
 	mov	x2, x21
-	add	x1, x1, :lo12:.LC19
-	.loc 1 2129 0
+	add	x1, x1, :lo12:.LC18
+	.loc 1 2603 0
 	mov	x20, -1
-.LVL356:
-	.loc 1 2128 0
+.LVL350:
+	.loc 1 2602 0
 	bl	_dev_err
-.LVL357:
-	.loc 1 2129 0
-	b	.L391
-.LVL358:
+.LVL351:
+	.loc 1 2603 0
+	b	.L357
+.LVL352:
 	.p2align 3
-.L399:
-	.loc 1 2133 0
+.L365:
+	.loc 1 2607 0
 	ldr	x0, [x22]
-	adrp	x1, .LC20
-	.loc 1 2134 0
+	adrp	x1, .LC19
+	.loc 1 2608 0
 	mov	x20, -1
-.LVL359:
-	.loc 1 2133 0
-	add	x1, x1, :lo12:.LC20
+.LVL353:
+	.loc 1 2607 0
+	add	x1, x1, :lo12:.LC19
 	bl	_dev_err
-.LVL360:
-	.loc 1 2134 0
-	b	.L391
-.L400:
-	.loc 1 2138 0
+.LVL354:
+	.loc 1 2608 0
+	b	.L357
+.L366:
+	.loc 1 2612 0
 	bl	__stack_chk_fail
-.LVL361:
+.LVL355:
 	.cfi_endproc
-.LFE2842:
+.LFE2849:
 	.size	pmic_vcom_write, .-pmic_vcom_write
 	.align	2
 	.p2align 3,,7
 	.type	waveform_version_read, %function
 waveform_version_read:
-.LFB2838:
-	.loc 1 2074 0
+.LFB2845:
+	.loc 1 2548 0
 	.cfi_startproc
-.LVL362:
+.LVL356:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -4159,22 +4040,22 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2074 0
+	.loc 1 2548 0
 	mov	x19, x2
-	.loc 1 2075 0
+	.loc 1 2549 0
 	bl	epd_lut_get_wf_version
-.LVL363:
-	.loc 1 2077 0
+.LVL357:
+	.loc 1 2551 0
 	mov	x2, x0
-	adrp	x1, .LC18
+	adrp	x1, .LC17
 	mov	x0, x19
-	add	x1, x1, :lo12:.LC18
+	add	x1, x1, :lo12:.LC17
 	bl	sprintf
-.LVL364:
-	.loc 1 2078 0
+.LVL358:
+	.loc 1 2552 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL365:
+.LVL359:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -4182,841 +4063,1329 @@ waveform_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2838:
+.LFE2845:
 	.size	waveform_version_read, .-waveform_version_read
 	.section	.init.text,"ax",@progbits
 	.align	2
 	.type	ebc_init, %function
 ebc_init:
-.LFB2856:
-	.loc 1 2627 0
+.LFB2863:
+	.loc 1 3093 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2628 0
+	.loc 1 3094 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2627 0
+	.loc 1 3093 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2628 0
+	.loc 1 3094 0
 	bl	__platform_driver_register
-.LVL366:
-	.loc 1 2629 0
+.LVL360:
+	.loc 1 3095 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2856:
+.LFE2863:
 	.size	ebc_init, .-ebc_init
 	.text
 	.align	2
 	.p2align 3,,7
 	.type	direct_mode_data_change, %function
 direct_mode_data_change:
-.LFB2816:
-	.loc 1 905 0
+.LFB2820:
+	.loc 1 1087 0
 	.cfi_startproc
-.LVL367:
-	.loc 1 906 0
-	ldr	w13, [x3, 88]
-.LVL368:
-	cbnz	w13, .L439
-.LBB1238:
-.LBB1239:
-	.loc 1 870 0
-	adrp	x5, .LANCHOR0
-	.loc 1 876 0
-	ldrb	w7, [x3, 48]
+.LVL361:
+	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
+	.loc 1 1088 0
+	ldr	x4, [x3, 224]
+	ldr	w4, [x4, 64]
+	cmp	w4, 32
+	beq	.L423
+	.loc 1 1091 0
+	cmp	w4, 16
+	beq	.L424
+.L380:
+.LBB1256:
+.LBB1257:
+	.loc 1 1017 0
+	adrp	x6, .LANCHOR0
+	.loc 1 1023 0
+	ldrb	w5, [x3, 48]
 	ldr	w4, [x3, 56]
-	.loc 1 870 0
-	ldr	x15, [x5, #:lo12:.LANCHOR0]
-	.loc 1 877 0
+	.loc 1 1017 0
+	ldr	x11, [x6, #:lo12:.LANCHOR0]
+	.loc 1 1024 0
 	ldr	x3, [x3, 128]
+.LVL362:
+	.loc 1 1023 0
+	sub	w5, w5, w4
+.LVL363:
+	.loc 1 1025 0
+	add	x11, x11, 24
+	.loc 1 1024 0
+	lsl	w5, w5, 16
+.LVL364:
+	add	x5, x3, x5, sxtw
+.LVL365:
+	.loc 1 1028 0
+	ldr	w14, [x11, 88]
+	.loc 1 1027 0
+	ldr	w3, [x11, 84]
+	.loc 1 1025 0
+	ldr	w15, [x11, 156]
+.LVL366:
+	.loc 1 1030 0
+	cmp	w14, 0
+	.loc 1 1027 0
+	lsr	w13, w3, 3
+	.loc 1 1030 0
+	ble	.L371
+	sub	w12, w13, #1
+	mov	w10, 0
+.LVL367:
+	add	x12, x12, 1
+	lsl	x16, x12, 2
+	lsl	x12, x12, 3
+	.loc 1 1031 0
+	cbz	w15, .L397
+.LVL368:
+	.p2align 2
+.L425:
+	.loc 1 1032 0
+	ldr	w7, [x11, 88]
 .LVL369:
-	.loc 1 876 0
-	sub	w7, w7, w4
+	sub	w7, w7, #1
+	sub	w7, w7, w10
+	mul	w7, w7, w3
+	lsr	w7, w7, 2
+	add	x7, x0, x7
 .LVL370:
-	.loc 1 878 0
-	add	x15, x15, 24
-	.loc 1 877 0
-	lsl	w7, w7, 16
+.L398:
+	.loc 1 1036 0
+	cbz	w13, .L399
+	add	x9, x1, x16
+	mov	x8, x2
+	.p2align 2
+.L400:
+	.loc 1 1037 0
+	ldr	w3, [x1], 4
+	.loc 1 1038 0
+	ldr	w4, [x8], 8
 .LVL371:
-	add	x7, x3, x7, sxtw
+	.loc 1 1043 0
+	and	w20, w3, 15
+	.loc 1 1036 0
+	cmp	x1, x9
+	.loc 1 1047 0
+	ubfx	x19, x3, 4, 4
+	.loc 1 1051 0
+	ubfx	x18, x3, 8, 4
+	.loc 1 1047 0
+	ubfx	x6, x4, 12, 4
+	.loc 1 1051 0
+	ubfx	x17, x4, 20, 4
+	.loc 1 1047 0
+	add	w6, w19, w6, lsl 8
+	.loc 1 1051 0
+	add	w17, w18, w17, lsl 8
+	.loc 1 1055 0
+	ubfx	x19, x3, 12, 4
+	.loc 1 1043 0
+	ubfx	x18, x4, 4, 4
+	.loc 1 1054 0
+	lsr	w4, w4, 28
+	.loc 1 1043 0
+	add	w18, w20, w18, lsl 8
+	.loc 1 1055 0
+	add	w4, w19, w4, lsl 8
+	.loc 1 1047 0
+	ldrb	w6, [x5, w6, sxtw]
+	.loc 1 1051 0
+	ldrb	w17, [x5, w17, sxtw]
+	.loc 1 1068 0
+	ubfx	x22, x3, 20, 4
+	.loc 1 1043 0
+	ldrb	w19, [x5, w18, sxtw]
+	.loc 1 1072 0
+	ubfx	x21, x3, 24, 4
+	.loc 1 1055 0
+	ldrb	w30, [x5, w4, sxtw]
+	.loc 1 1047 0
+	ubfiz	w4, w6, 2, 2
+	.loc 1 1043 0
+	and	w19, w19, 3
+	.loc 1 1051 0
+	ubfiz	w6, w17, 4, 2
+	.loc 1 1055 0
+	orr	w4, w4, w6
+	.loc 1 1064 0
+	ubfx	x20, x3, 16, 4
+	.loc 1 1055 0
+	orr	w30, w19, w30, lsl 6
+	.loc 1 1074 0
+	lsr	w3, w3, 28
 .LVL372:
-	.loc 1 881 0
-	ldr	w16, [x15, 88]
-	.loc 1 880 0
-	ldr	w3, [x15, 84]
-	.loc 1 878 0
-	ldr	w17, [x15, 156]
+	.loc 1 1055 0
+	orr	w4, w4, w30
+	.loc 1 1057 0
+	strb	w4, [x7], 2
+	.loc 1 1059 0
+	ldr	w4, [x8, -4]
+	.loc 1 1068 0
+	ubfx	x18, x4, 12, 4
+	.loc 1 1072 0
+	ubfx	x17, x4, 20, 4
+	.loc 1 1068 0
+	add	w18, w22, w18, lsl 8
+	.loc 1 1072 0
+	add	w17, w21, w17, lsl 8
+	.loc 1 1064 0
+	ubfx	x6, x4, 4, 4
+	.loc 1 1075 0
+	lsr	w4, w4, 28
+	.loc 1 1076 0
+	add	w3, w3, w4, lsl 8
+	.loc 1 1064 0
+	add	w6, w20, w6, lsl 8
+	.loc 1 1068 0
+	ldrb	w4, [x5, w18, sxtw]
+	.loc 1 1072 0
+	ldrb	w18, [x5, w17, sxtw]
+	.loc 1 1064 0
+	ldrb	w17, [x5, w6, sxtw]
+	.loc 1 1076 0
+	ldrb	w6, [x5, w3, sxtw]
+	.loc 1 1068 0
+	ubfiz	w3, w4, 2, 2
+	.loc 1 1072 0
+	ubfiz	w18, w18, 4, 2
+	.loc 1 1064 0
+	and	w4, w17, 3
+	.loc 1 1076 0
+	orr	w3, w3, w18
+	orr	w4, w4, w6, lsl 6
+	orr	w3, w3, w4
+	.loc 1 1078 0
+	strb	w3, [x7, -1]
+	.loc 1 1036 0
+	bne	.L400
+	add	x2, x2, x12
+.L399:
+	.loc 1 1030 0
+	add	w10, w10, 1
+	cmp	w14, w10
+	beq	.L371
+	ldr	w3, [x11, 84]
+	.loc 1 1031 0
+	cbnz	w15, .L425
+.L397:
+	.loc 1 1034 0
+	mul	w7, w10, w3
 .LVL373:
-	.loc 1 886 0
-	cmp	w16, 0
-	.loc 1 880 0
-	lsr	w12, w3, 3
+	lsr	w7, w7, 2
+	add	x7, x0, x7
 .LVL374:
-	.loc 1 886 0
-	ble	.L427
-	sub	w14, w12, #1
-	add	x14, x14, 1
-	lsl	x14, x14, 2
-	.loc 1 887 0
-	cbz	w17, .L413
+	b	.L398
 .LVL375:
-	.p2align 2
-.L440:
-	.loc 1 888 0
-	ldr	w10, [x15, 88]
+	.p2align 3
+.L371:
+.LBE1257:
+.LBE1256:
+	.loc 1 1103 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	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
 .LVL376:
-	sub	w10, w10, #1
-	sub	w10, w10, w13
-	mul	w10, w10, w3
-	lsr	w10, w10, 2
-	add	x10, x0, x10
+.L424:
+	.cfi_restore_state
+	.loc 1 1092 0
+	ldr	x4, [x3, 216]
+	ldr	w4, [x4, 64]
+	cmp	w4, 16
+	bne	.L380
+	.loc 1 1093 0
+	ldr	w13, [x3, 88]
 .LVL377:
-.L414:
-	.loc 1 892 0
-	cbz	w12, .L415
-	mov	x5, 0
-	.p2align 2
-.L416:
-	.loc 1 894 0
-	ldr	w3, [x2, x5, lsl 2]
-	.loc 1 893 0
-	ldr	w4, [x1, x5, lsl 2]
-	add	x5, x5, 1
-.LVL378:
-.LBB1240:
-.LBB1241:
-	.loc 1 134 0
-	and	w9, w3, 65280
-.LBE1241:
-.LBE1240:
-	.loc 1 892 0
-	cmp	w12, w5
-.LVL379:
-	.loc 1 896 0
-	and	w6, w4, 65535
-.LBB1246:
-.LBB1242:
-	.loc 1 133 0
-	ubfiz	w8, w3, 8, 8
-	.loc 1 134 0
-	add	w9, w9, w6, lsr 8
-	.loc 1 133 0
-	add	w6, w8, w6, uxtb
-.LBE1242:
-.LBE1246:
-	.loc 1 897 0
-	lsr	w3, w3, 16
-.LVL380:
-	lsr	w4, w4, 16
-.LBB1247:
-.LBB1248:
-	.loc 1 133 0
-	ubfiz	w8, w3, 8, 8
-	.loc 1 134 0
-	and	w3, w3, 65280
-.LBE1248:
-.LBE1247:
-.LBB1252:
-.LBB1243:
-	.loc 1 133 0
-	ldrb	w11, [x7, w6, sxtw]
-.LBE1243:
-.LBE1252:
-.LBB1253:
-.LBB1249:
-	.loc 1 134 0
-	add	w3, w3, w4, lsr 8
-.LBE1249:
-.LBE1253:
-.LBB1254:
-.LBB1244:
-	ldrb	w9, [x7, w9, sxtw]
-.LBE1244:
-.LBE1254:
-.LBB1255:
-.LBB1250:
-	.loc 1 133 0
-	add	w6, w8, w4, uxtb
-.LBE1250:
-.LBE1255:
-.LBB1256:
-.LBB1245:
-	orr	w4, w11, w9, lsl 4
-.LBE1245:
-.LBE1256:
-	.loc 1 896 0
-	strb	w4, [x10], 2
-.LBB1257:
-.LBB1251:
-	.loc 1 134 0
-	ldrb	w3, [x7, w3, sxtw]
-	.loc 1 133 0
-	ldrb	w4, [x7, w6, sxtw]
-	orr	w3, w4, w3, lsl 4
-.LBE1251:
-.LBE1257:
-	.loc 1 897 0
-	strb	w3, [x10, -1]
-	.loc 1 892 0
-	bgt	.L416
-	add	x1, x1, x14
-	add	x2, x2, x14
-.L415:
-	.loc 1 886 0
-	add	w13, w13, 1
-	cmp	w16, w13
-	beq	.L427
-	ldr	w3, [x15, 84]
-	.loc 1 887 0
-	cbnz	w17, .L440
-.L413:
-	.loc 1 890 0
-	mul	w10, w13, w3
-.LVL381:
-	lsr	w10, w10, 2
-	add	x10, x0, x10
-.LVL382:
-	b	.L414
-.LVL383:
-.L439:
-.LBE1239:
-.LBE1238:
+	cbz	w13, .L381
 .LBB1258:
 .LBB1259:
-.LBB1260:
 	.loc 1 831 0
-	adrp	x7, .LANCHOR0
+	adrp	x6, .LANCHOR0
 	.loc 1 837 0
-	ldrb	w4, [x3, 48]
-	ldr	w6, [x3, 56]
+	ldrb	w5, [x3, 48]
+	ldr	w4, [x3, 56]
 	.loc 1 831 0
-	ldr	x13, [x7, #:lo12:.LANCHOR0]
-.LVL384:
+	ldr	x12, [x6, #:lo12:.LANCHOR0]
 	.loc 1 838 0
-	ldr	x5, [x3, 128]
+	ldr	x3, [x3, 128]
+.LVL378:
 	.loc 1 837 0
-	sub	w3, w4, w6
-.LVL385:
+	sub	w5, w5, w4
+.LVL379:
 	.loc 1 839 0
-	add	x13, x13, 24
+	add	x12, x12, 24
 	.loc 1 838 0
-	lsl	w3, w3, 16
-.LVL386:
-	add	x3, x5, x3, sxtw
-.LVL387:
+	lsl	w5, w5, 16
+.LVL380:
+	add	x5, x3, x5, sxtw
+.LVL381:
 	.loc 1 842 0
-	ldr	w15, [x13, 88]
+	ldr	w14, [x12, 88]
 	.loc 1 841 0
-	ldr	w5, [x13, 84]
+	ldr	w3, [x12, 84]
 	.loc 1 839 0
-	ldr	w16, [x13, 156]
-.LVL388:
+	ldr	w15, [x12, 156]
+.LVL382:
 	.loc 1 847 0
-	cmp	w15, 0
+	cmp	w14, 0
 	.loc 1 841 0
-	lsr	w14, w5, 4
+	lsr	w13, w3, 4
+.LVL383:
 	.loc 1 847 0
-	ble	.L427
-	sub	w11, w14, #1
-	mov	x10, x2
-.LVL389:
+	ble	.L371
+	sub	w11, w13, #1
+	mov	w16, 0
+.LVL384:
 	add	x11, x11, 1
-	mov	x9, x1
-.LVL390:
 	lsl	x11, x11, 3
-	mov	w12, 0
-.LVL391:
 	.loc 1 848 0
-	cbz	w16, .L430
-.LVL392:
-.L443:
+	cbz	w15, .L382
+.LVL385:
+.L426:
 	.loc 1 849 0
-	ldr	w4, [x13, 88]
-.LVL393:
-	sub	w4, w4, #1
-	sub	w4, w4, w12
-	mul	w4, w4, w5
-	lsr	w4, w4, 2
-	add	x4, x0, x4
-.LVL394:
-.L431:
-	.loc 1 853 0
-	cbz	w14, .L441
-.LBE1260:
-.LBE1259:
-.LBE1258:
-	.loc 1 905 0
-	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
-	.p2align 2
-.L432:
-.LBB1305:
-.LBB1303:
-.LBB1301:
+	ldr	w6, [x12, 88]
+.LVL386:
+	sub	w6, w6, #1
+	sub	w6, w6, w16
+	mul	w6, w6, w3
+	lsr	w6, w6, 2
+	add	x6, x0, x6
+.LVL387:
+.L383:
 	.loc 1 853 0
-	mov	x5, 0
+	cbz	w13, .L384
+	mov	x7, 0
 	.p2align 2
-.L412:
+.L385:
 	.loc 1 855 0
-	ldr	x2, [x10, x5]
-.LVL395:
-	add	x4, x4, 4
+	ldr	x4, [x2, x7]
+.LVL388:
+	add	x6, x6, 4
 	.loc 1 854 0
-	ldr	x1, [x9, x5]
-.LVL396:
-	add	x5, x5, 8
+	ldr	x3, [x1, x7]
+.LVL389:
+	add	x7, x7, 8
 	.loc 1 857 0
-	and	w7, w2, 65535
+	and	w9, w4, 65535
 	.loc 1 853 0
-	cmp	x11, x5
+	cmp	x11, x7
 	.loc 1 857 0
-	and	w6, w1, 65535
+	and	w8, w3, 65535
+.LBB1260:
 .LBB1261:
-.LBB1262:
 	.loc 1 133 0
-	ubfiz	w30, w7, 8, 8
+	ubfiz	w19, w9, 8, 8
 	.loc 1 134 0
-	and	w7, w7, 65280
+	and	w9, w9, 65280
 	.loc 1 133 0
-	add	w30, w30, w6, uxtb
+	add	w19, w19, w8, uxtb
 	.loc 1 134 0
-	add	w7, w7, w6, lsr 8
-.LBE1262:
+	add	w9, w9, w8, lsr 8
 .LBE1261:
+.LBE1260:
 	.loc 1 858 0
-	lsr	w8, w2, 16
-	lsr	w6, w1, 16
+	lsr	w10, w4, 16
+	lsr	w8, w3, 16
+.LBB1265:
 .LBB1266:
-.LBB1267:
 	.loc 1 133 0
-	ubfiz	w18, w8, 8, 8
-.LBE1267:
+	ubfiz	w18, w10, 8, 8
 .LBE1266:
+.LBE1265:
+.LBB1272:
+.LBB1262:
+	ldrb	w19, [x5, w19, sxtw]
+.LBE1262:
+.LBE1272:
 .LBB1273:
-.LBB1263:
-	ldrb	w30, [x3, w30, sxtw]
-.LBE1263:
+.LBB1267:
+	.loc 1 134 0
+	and	w10, w10, 65280
+.LBE1267:
 .LBE1273:
 .LBB1274:
-.LBB1268:
-	.loc 1 134 0
-	and	w8, w8, 65280
-.LBE1268:
+.LBB1263:
+	ldrb	w17, [x5, w9, sxtw]
+.LBE1263:
 .LBE1274:
 .LBB1275:
-.LBB1264:
-	ldrb	w17, [x3, w7, sxtw]
-.LBE1264:
-.LBE1275:
-.LBB1276:
-.LBB1269:
+.LBB1268:
 	.loc 1 133 0
-	add	w18, w18, w6, uxtb
+	add	w18, w18, w8, uxtb
 	.loc 1 134 0
-	add	w8, w8, w6, lsr 8
-.LBE1269:
-.LBE1276:
+	add	w10, w10, w8, lsr 8
+.LBE1268:
+.LBE1275:
 	.loc 1 859 0
-	ubfx	x7, x2, 32, 16
-	ubfx	x6, x1, 32, 16
+	ubfx	x9, x4, 32, 16
+	ubfx	x8, x3, 32, 16
 	.loc 1 860 0
-	lsr	x2, x2, 48
-.LVL397:
-.LBB1277:
-.LBB1265:
+	lsr	x4, x4, 48
+.LVL390:
+.LBB1276:
+.LBB1264:
 	.loc 1 133 0
-	orr	w17, w30, w17, lsl 4
-.LBE1265:
-.LBE1277:
+	orr	w17, w19, w17, lsl 4
+.LBE1264:
+.LBE1276:
 	.loc 1 857 0
-	strb	w17, [x4, -4]
+	strb	w17, [x6, -4]
+.LBB1277:
 .LBB1278:
-.LBB1279:
 	.loc 1 133 0
-	ubfiz	w17, w7, 8, 8
+	ubfiz	w17, w9, 8, 8
 	.loc 1 134 0
-	and	w7, w7, 65280
-.LBE1279:
+	and	w9, w9, 65280
 .LBE1278:
+.LBE1277:
+.LBB1284:
+.LBB1269:
+	ldrb	w10, [x5, w10, sxtw]
+.LBE1269:
+.LBE1284:
 .LBB1285:
-.LBB1270:
-	ldrb	w8, [x3, w8, sxtw]
-.LBE1270:
+.LBB1279:
+	.loc 1 133 0
+	add	w17, w17, w8, uxtb
+.LBE1279:
 .LBE1285:
 .LBB1286:
-.LBB1280:
-	.loc 1 133 0
-	add	w17, w17, w6, uxtb
-.LBE1280:
+.LBB1270:
+	ldrb	w18, [x5, w18, sxtw]
+.LBE1270:
 .LBE1286:
 .LBB1287:
-.LBB1271:
-	ldrb	w18, [x3, w18, sxtw]
-.LBE1271:
-.LBE1287:
-.LBB1288:
-.LBB1281:
+.LBB1280:
 	.loc 1 134 0
-	add	w6, w7, w6, lsr 8
-.LBE1281:
-.LBE1288:
+	add	w8, w9, w8, lsr 8
+.LBE1280:
+.LBE1287:
 	.loc 1 860 0
-	lsr	x1, x1, 48
-.LVL398:
-.LBB1289:
-.LBB1272:
+	lsr	x3, x3, 48
+.LVL391:
+.LBB1288:
+.LBB1271:
 	.loc 1 133 0
-	orr	w7, w18, w8, lsl 4
-.LBE1272:
-.LBE1289:
+	orr	w9, w18, w10, lsl 4
+.LBE1271:
+.LBE1288:
 	.loc 1 858 0
-	strb	w7, [x4, -3]
+	strb	w9, [x6, -3]
+.LBB1289:
 .LBB1290:
-.LBB1291:
 	.loc 1 133 0
-	ubfiz	w7, w2, 8, 8
+	ubfiz	w9, w4, 8, 8
 	.loc 1 134 0
-	and	w2, w2, 65280
-.LBE1291:
+	and	w4, w4, 65280
 .LBE1290:
+.LBE1289:
+.LBB1294:
+.LBB1281:
+	ldrb	w10, [x5, w8, sxtw]
+.LBE1281:
+.LBE1294:
 .LBB1295:
-.LBB1282:
-	ldrb	w8, [x3, w6, sxtw]
-.LBE1282:
+.LBB1291:
+	.loc 1 133 0
+	add	w8, w9, w3, uxtb
+.LBE1291:
 .LBE1295:
 .LBB1296:
-.LBB1292:
-	.loc 1 133 0
-	add	w6, w7, w1, uxtb
-.LBE1292:
+.LBB1282:
+	ldrb	w17, [x5, w17, sxtw]
+.LBE1282:
 .LBE1296:
 .LBB1297:
-.LBB1283:
-	ldrb	w17, [x3, w17, sxtw]
-.LBE1283:
+.LBB1292:
+	.loc 1 134 0
+	add	w3, w4, w3, lsr 8
+.LBE1292:
 .LBE1297:
 .LBB1298:
-.LBB1293:
-	.loc 1 134 0
-	add	w1, w2, w1, lsr 8
-.LBE1293:
-.LBE1298:
-.LBB1299:
-.LBB1284:
+.LBB1283:
 	.loc 1 133 0
-	orr	w2, w17, w8, lsl 4
-.LBE1284:
-.LBE1299:
+	orr	w4, w17, w10, lsl 4
+.LBE1283:
+.LBE1298:
 	.loc 1 859 0
-	strb	w2, [x4, -2]
-.LBB1300:
-.LBB1294:
+	strb	w4, [x6, -2]
+.LBB1299:
+.LBB1293:
 	.loc 1 134 0
-	ldrb	w1, [x3, w1, sxtw]
+	ldrb	w3, [x5, w3, sxtw]
 	.loc 1 133 0
-	ldrb	w2, [x3, w6, sxtw]
-	orr	w1, w2, w1, lsl 4
-.LBE1294:
-.LBE1300:
+	ldrb	w4, [x5, w8, sxtw]
+	orr	w3, w4, w3, lsl 4
+.LBE1293:
+.LBE1299:
 	.loc 1 860 0
-	strb	w1, [x4, -1]
+	strb	w3, [x6, -1]
 	.loc 1 853 0
-	bne	.L412
+	bne	.L385
+	add	x1, x1, x11
+.LVL392:
+	add	x2, x2, x11
+.LVL393:
+.L384:
 	.loc 1 847 0
-	add	w12, w12, 1
-	add	x9, x9, x11
-	add	x10, x10, x11
-	cmp	w15, w12
-	beq	.L405
-.L442:
-	ldr	w5, [x13, 84]
+	add	w16, w16, 1
+	cmp	w14, w16
+	beq	.L371
+	ldr	w3, [x12, 84]
 	.loc 1 848 0
-	cbz	w16, .L409
-	.loc 1 849 0
-	ldr	w4, [x13, 88]
+	cbnz	w15, .L426
+.L382:
+	.loc 1 851 0
+	mul	w6, w16, w3
+.LVL394:
+	lsr	w6, w6, 2
+	add	x6, x0, x6
+.LVL395:
+	b	.L383
+.LVL396:
+.L423:
+.LBE1259:
+.LBE1258:
+	.loc 1 1089 0
+	ldr	x4, [x3, 216]
+	ldr	w4, [x4, 64]
+	cmp	w4, 32
+	beq	.L427
+	.loc 1 1098 0
+	cmp	w4, 16
+	bne	.L380
+.LBB1300:
+.LBB1301:
+	.loc 1 947 0
+	adrp	x6, .LANCHOR0
+	.loc 1 953 0
+	ldrb	w5, [x3, 48]
+	ldr	w4, [x3, 56]
+	.loc 1 947 0
+	ldr	x11, [x6, #:lo12:.LANCHOR0]
+	.loc 1 954 0
+	ldr	x3, [x3, 128]
+.LVL397:
+	.loc 1 953 0
+	sub	w5, w5, w4
+.LVL398:
+	.loc 1 955 0
+	add	x11, x11, 24
+	.loc 1 954 0
+	lsl	w5, w5, 16
 .LVL399:
-	sub	w4, w4, #1
-	sub	w4, w4, w12
-	mul	w4, w4, w5
-	lsr	w4, w4, 2
-	add	x4, x0, x4
+	add	x5, x3, x5, sxtw
 .LVL400:
-	.loc 1 853 0
-	cbnz	w14, .L432
-.L438:
-	.loc 1 847 0
-	add	w12, w12, 1
-	cmp	w15, w12
-	bne	.L442
-.L405:
-.LBE1301:
-.LBE1303:
-.LBE1305:
-	.loc 1 910 0
-	ldp	x29, x30, [sp], 16
-	.cfi_restore 30
-	.cfi_restore 29
-	.cfi_def_cfa 31, 0
-	ret
+	.loc 1 958 0
+	ldr	w14, [x11, 88]
+	.loc 1 957 0
+	ldr	w3, [x11, 84]
+	.loc 1 955 0
+	ldr	w15, [x11, 156]
 .LVL401:
-.L430:
-.LBB1306:
-.LBB1304:
-.LBB1302:
-	.loc 1 851 0
-	mul	w4, w12, w5
+	.loc 1 960 0
+	cmp	w14, 0
+	.loc 1 957 0
+	lsr	w13, w3, 3
+	.loc 1 960 0
+	ble	.L371
+	sub	w12, w13, #1
+	mov	w10, 0
 .LVL402:
-	lsr	w4, w4, 2
-	add	x4, x0, x4
+	add	x12, x12, 1
+	lsl	x16, x12, 3
+	lsl	x12, x12, 2
+	.loc 1 961 0
+	cbz	w15, .L392
 .LVL403:
-	b	.L431
+.L428:
+	.loc 1 962 0
+	ldr	w7, [x11, 88]
 .LVL404:
-	.p2align 3
-.L409:
-	.cfi_def_cfa 29, 16
-	.cfi_offset 29, -16
-	.cfi_offset 30, -8
-	mul	w4, w12, w5
+	sub	w7, w7, #1
+	sub	w7, w7, w10
+	mul	w7, w7, w3
+	lsr	w7, w7, 2
+	add	x7, x0, x7
 .LVL405:
-	lsr	w4, w4, 2
-	add	x4, x0, x4
+.L393:
+	.loc 1 966 0
+	cbz	w13, .L394
+	add	x9, x1, x16
+	mov	x8, x2
+	.p2align 2
+.L395:
+	.loc 1 967 0
+	ldr	w6, [x1], 8
+	.loc 1 968 0
+	ldr	w3, [x8], 4
+	.loc 1 966 0
+	cmp	x1, x9
 .LVL406:
-	.loc 1 853 0
-	cbnz	w14, .L432
-	b	.L438
-.LVL407:
-.L441:
-	.cfi_def_cfa 31, 0
-	.cfi_restore 29
-	.cfi_restore 30
-	.loc 1 847 0
-	add	w12, w12, 1
-	cmp	w15, w12
-	beq	.L427
-	ldr	w5, [x13, 84]
-	.loc 1 848 0
-	cbz	w16, .L430
-	b	.L443
-.LVL408:
-	.p2align 3
-.L427:
-	ret
-.LBE1302:
-.LBE1304:
-.LBE1306:
-	.cfi_endproc
-.LFE2816:
-	.size	direct_mode_data_change, .-direct_mode_data_change
-	.align	2
-	.p2align 3,,7
-	.type	direct_mode_data_change_part, %function
-direct_mode_data_change_part:
-.LFB2819:
-	.loc 1 999 0
-	.cfi_startproc
-.LVL409:
-	stp	x29, x30, [sp, -80]!
-	.cfi_def_cfa_offset 80
-	.cfi_offset 29, -80
-	.cfi_offset 30, -72
-.LBB1325:
-.LBB1326:
-.LBB1327:
-	.loc 1 958 0
-	adrp	x5, .LANCHOR0
-.LBE1327:
-.LBE1326:
-.LBE1325:
-	.loc 1 999 0
-	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 972 0
+	and	w4, w3, 255
+	.loc 1 975 0
+	lsr	w22, w6, 8
+	.loc 1 981 0
+	lsl	w17, w3, 4
+	.loc 1 979 0
+	lsr	w21, w6, 16
+	.loc 1 977 0
+	and	w18, w4, 240
+	and	w22, w22, 248
+	.loc 1 983 0
+	lsr	w20, w6, 24
+	.loc 1 977 0
+	add	w18, w22, w18, lsl 8
+	.loc 1 985 0
+	and	w19, w3, 61440
+	.loc 1 981 0
+	and	w21, w21, 248
+	.loc 1 985 0
+	and	w20, w20, 248
+	.loc 1 973 0
+	and	w6, w6, 248
+	.loc 1 981 0
+	and	w17, w17, 61440
+	.loc 1 973 0
+	ubfiz	w4, w4, 12, 4
+	.loc 1 981 0
+	add	w17, w17, w21
+	.loc 1 973 0
+	add	w4, w4, w6
+	.loc 1 985 0
+	add	w19, w19, w20
+	.loc 1 977 0
+	ldrb	w20, [x5, w18, sxtw]
+	.loc 1 1002 0
+	lsr	w22, w3, 12
+	.loc 1 998 0
+	lsr	w18, w3, 8
+	.loc 1 985 0
+	ldrb	w21, [x5, w4, sxtw]
+	.loc 1 1006 0
+	lsr	w4, w3, 16
+	.loc 1 981 0
+	ldrb	w6, [x5, w17, sxtw]
+	.loc 1 977 0
+	lsl	w20, w20, 2
+	.loc 1 985 0
+	ldrb	w19, [x5, w19, sxtw]
+	.loc 1 1002 0
+	and	w17, w22, 61440
+	.loc 1 994 0
+	lsr	w3, w3, 4
+	.loc 1 998 0
+	and	w18, w18, 61440
+	.loc 1 985 0
+	orr	w6, w20, w6, lsl 4
+	.loc 1 994 0
+	and	w3, w3, 61440
+	.loc 1 985 0
+	orr	w19, w21, w19, lsl 6
+	orr	w6, w6, w19
+	.loc 1 987 0
+	strb	w6, [x7], 2
+	.loc 1 1006 0
+	and	w6, w4, 61440
+	.loc 1 989 0
+	ldr	w4, [x1, -4]
+	.loc 1 994 0
+	and	w21, w4, 248
 	.loc 1 1000 0
-	ldr	w16, [x3, 88]
-.LVL410:
-	cbnz	w16, .L548
-.LBB1340:
-.LBB1341:
-	.loc 1 917 0
-	ldr	x18, [x5, #:lo12:.LANCHOR0]
-	.loc 1 922 0
-	ldrb	w14, [x3, 48]
+	lsr	w20, w4, 16
+	.loc 1 996 0
+	lsr	w19, w4, 8
+	.loc 1 1002 0
+	and	w20, w20, 248
+	.loc 1 1004 0
+	lsr	w4, w4, 24
+	.loc 1 998 0
+	and	w19, w19, 248
+	.loc 1 1002 0
+	add	w17, w17, w20
+	.loc 1 1006 0
+	and	w4, w4, 248
+	.loc 1 998 0
+	add	w18, w18, w19
+	.loc 1 1006 0
+	add	w4, w6, w4
+	.loc 1 994 0
+	add	w3, w3, w21
+	.loc 1 1002 0
+	ldrb	w17, [x5, w17, sxtw]
+	.loc 1 998 0
+	ldrb	w6, [x5, w18, sxtw]
+	.loc 1 1006 0
+	ldrb	w4, [x5, w4, sxtw]
+	ldrb	w18, [x5, w3, sxtw]
+	.loc 1 1002 0
+	lsl	w3, w17, 4
+	.loc 1 1006 0
+	orr	w3, w3, w6, lsl 2
+	orr	w4, w18, w4, lsl 6
+	orr	w3, w3, w4
+	.loc 1 1008 0
+	strb	w3, [x7, -1]
+	.loc 1 966 0
+	bne	.L395
+	add	x2, x2, x12
+.L394:
+	.loc 1 960 0
+	add	w10, w10, 1
+	cmp	w14, w10
+	beq	.L371
+	ldr	w3, [x11, 84]
+	.loc 1 961 0
+	cbnz	w15, .L428
+.L392:
+	.loc 1 964 0
+	mul	w7, w10, w3
+.LVL407:
+	lsr	w7, w7, 2
+	add	x7, x0, x7
+.LVL408:
+	b	.L393
+.LVL409:
+.L381:
+.LBE1301:
+.LBE1300:
+.LBB1302:
+.LBB1303:
+	.loc 1 871 0
+	adrp	x5, .LANCHOR0
+	.loc 1 877 0
+	ldrb	w7, [x3, 48]
 	ldr	w4, [x3, 56]
-	.loc 1 924 0
-	add	x18, x18, 24
-	.loc 1 923 0
+	.loc 1 871 0
+	ldr	x15, [x5, #:lo12:.LANCHOR0]
+	.loc 1 878 0
 	ldr	x3, [x3, 128]
+.LVL410:
+	.loc 1 877 0
+	sub	w7, w7, w4
 .LVL411:
-	.loc 1 922 0
-	sub	w14, w14, w4
+	.loc 1 879 0
+	add	x15, x15, 24
+	.loc 1 878 0
+	lsl	w7, w7, 16
 .LVL412:
-	.loc 1 927 0
-	ldr	w30, [x18, 88]
-	.loc 1 923 0
-	lsl	w14, w14, 16
+	add	x7, x3, x7, sxtw
 .LVL413:
-	.loc 1 924 0
-	ldr	w19, [x18, 156]
-	.loc 1 923 0
-	add	x14, x3, x14, sxtw
+	.loc 1 882 0
+	ldr	w16, [x15, 88]
+	.loc 1 881 0
+	ldr	w3, [x15, 84]
+	.loc 1 879 0
+	ldr	w17, [x15, 156]
 .LVL414:
-	.loc 1 926 0
-	ldr	w3, [x18, 84]
+	.loc 1 887 0
+	cmp	w16, 0
+	.loc 1 881 0
+	lsr	w12, w3, 3
 .LVL415:
-	.loc 1 932 0
-	cmp	w30, 0
-	.loc 1 926 0
-	lsr	w9, w3, 3
+	.loc 1 887 0
+	ble	.L371
+	sub	w14, w12, #1
+	add	x14, x14, 1
+	lsl	x14, x14, 2
+	.loc 1 888 0
+	cbz	w17, .L387
 .LVL416:
-	.loc 1 932 0
-	ble	.L444
-	sub	w17, w9, #1
-.LBB1342:
-.LBB1343:
-	.loc 1 139 0
-	mov	w15, 3
-	add	x17, x17, 1
-	lsl	x17, x17, 2
-.LBE1343:
-.LBE1342:
-	.loc 1 933 0
-	cbz	w19, .L474
+.L429:
+	.loc 1 889 0
+	ldr	w10, [x15, 88]
 .LVL417:
-	.p2align 2
-.L549:
-	.loc 1 934 0
-	ldr	w13, [x18, 88]
+	sub	w10, w10, #1
+	sub	w10, w10, w13
+	mul	w10, w10, w3
+	lsr	w10, w10, 2
+	add	x10, x0, x10
 .LVL418:
-	sub	w13, w13, #1
-	sub	w13, w13, w16
-	mul	w13, w13, w3
-	lsr	w13, w13, 2
-	add	x13, x0, x13
+.L388:
+	.loc 1 893 0
+	cbz	w12, .L389
+	mov	x5, 0
+	.p2align 2
+.L390:
+	.loc 1 895 0
+	ldr	w3, [x2, x5, lsl 2]
+	.loc 1 894 0
+	ldr	w4, [x1, x5, lsl 2]
+	add	x5, x5, 1
 .LVL419:
-.L475:
-	.loc 1 938 0
-	cbz	w9, .L476
-	add	x13, x13, 2
+.LBB1304:
+.LBB1305:
+	.loc 1 134 0
+	and	w9, w3, 65280
+.LBE1305:
+.LBE1304:
+	.loc 1 893 0
+	cmp	w12, w5
 .LVL420:
-	mov	x10, 0
+	.loc 1 897 0
+	and	w6, w4, 65535
+.LBB1310:
+.LBB1306:
+	.loc 1 133 0
+	ubfiz	w8, w3, 8, 8
+	.loc 1 134 0
+	add	w9, w9, w6, lsr 8
+	.loc 1 133 0
+	add	w6, w8, w6, uxtb
+.LBE1306:
+.LBE1310:
+	.loc 1 898 0
+	lsr	w3, w3, 16
+.LVL421:
+	lsr	w4, w4, 16
+.LBB1311:
+.LBB1312:
+	.loc 1 133 0
+	ubfiz	w8, w3, 8, 8
+	.loc 1 134 0
+	and	w3, w3, 65280
+.LBE1312:
+.LBE1311:
+.LBB1316:
+.LBB1307:
+	.loc 1 133 0
+	ldrb	w11, [x7, w6, sxtw]
+.LBE1307:
+.LBE1316:
+.LBB1317:
+.LBB1313:
+	.loc 1 134 0
+	add	w3, w3, w4, lsr 8
+.LBE1313:
+.LBE1317:
+.LBB1318:
+.LBB1308:
+	ldrb	w9, [x7, w9, sxtw]
+.LBE1308:
+.LBE1318:
+.LBB1319:
+.LBB1314:
+	.loc 1 133 0
+	add	w6, w8, w4, uxtb
+.LBE1314:
+.LBE1319:
+.LBB1320:
+.LBB1309:
+	orr	w4, w11, w9, lsl 4
+.LBE1309:
+.LBE1320:
+	.loc 1 897 0
+	strb	w4, [x10], 2
+.LBB1321:
+.LBB1315:
+	.loc 1 134 0
+	ldrb	w3, [x7, w3, sxtw]
+	.loc 1 133 0
+	ldrb	w4, [x7, w6, sxtw]
+	orr	w3, w4, w3, lsl 4
+.LBE1315:
+.LBE1321:
+	.loc 1 898 0
+	strb	w3, [x10, -1]
+	.loc 1 893 0
+	bgt	.L390
+	add	x1, x1, x14
+	add	x2, x2, x14
+.L389:
+	.loc 1 887 0
+	add	w13, w13, 1
+	cmp	w16, w13
+	beq	.L371
+	ldr	w3, [x15, 84]
+	.loc 1 888 0
+	cbnz	w17, .L429
+.L387:
+	.loc 1 891 0
+	mul	w10, w13, w3
+.LVL422:
+	lsr	w10, w10, 2
+	add	x10, x0, x10
+.LVL423:
+	b	.L388
+.LVL424:
+.L427:
+.LBE1303:
+.LBE1302:
+.LBB1322:
+.LBB1323:
+	.loc 1 908 0
+	adrp	x5, .LANCHOR0
+	.loc 1 914 0
+	ldrb	w8, [x3, 48]
+	ldr	w4, [x3, 56]
+	.loc 1 908 0
+	ldr	x15, [x5, #:lo12:.LANCHOR0]
+	.loc 1 915 0
+	ldr	x3, [x3, 128]
+.LVL425:
+	.loc 1 914 0
+	sub	w8, w8, w4
+.LVL426:
+	.loc 1 916 0
+	add	x15, x15, 24
+	.loc 1 915 0
+	lsl	w8, w8, 16
+.LVL427:
+	add	x8, x3, x8, sxtw
+.LVL428:
+	.loc 1 921 0
+	ldr	w16, [x15, 88]
+	.loc 1 920 0
+	ldr	w3, [x15, 84]
+	.loc 1 916 0
+	ldr	w17, [x15, 156]
+.LVL429:
+	.loc 1 926 0
+	cmp	w16, 0
+	.loc 1 920 0
+	lsr	w12, w3, 2
+.LVL430:
+	.loc 1 926 0
+	ble	.L371
+	sub	w14, w12, #1
+	mov	w13, 0
+.LVL431:
+	add	x14, x14, 1
+	lsl	x14, x14, 2
+	.loc 1 927 0
+	cbz	w17, .L376
+.LVL432:
+.L430:
+	.loc 1 928 0
+	ldr	w11, [x15, 88]
+.LVL433:
+	sub	w11, w11, #1
+	sub	w11, w11, w13
+	mul	w11, w11, w3
+	lsr	w11, w11, 2
+	add	x11, x0, x11
+.LVL434:
+.L377:
+	.loc 1 932 0
+	cbz	w12, .L378
+	mov	x4, 0
 	.p2align 2
-.L489:
-	.loc 1 940 0
-	ldr	w6, [x2, x10, lsl 2]
-.LBB1349:
-.LBB1350:
-	.loc 1 143 0
-	mov	w4, 0
-.LBE1350:
-.LBE1349:
-	.loc 1 939 0
-	ldr	w7, [x1, x10, lsl 2]
-.LBB1355:
-.LBB1344:
-	.loc 1 143 0
-	mov	w5, 0
-.LBE1344:
-.LBE1355:
-	.loc 1 942 0
-	and	w20, w6, 65535
-	and	w12, w7, 65535
-.LBB1356:
-.LBB1351:
-	.loc 1 154 0
-	and	w3, w20, 65280
-	add	w8, w3, w12, lsr 8
-.LBE1351:
-.LBE1356:
-	.loc 1 943 0
-	lsr	w3, w6, 16
-.LBB1357:
-.LBB1345:
-	.loc 1 153 0
-	ubfiz	w23, w3, 8, 8
-.LBE1345:
-.LBE1357:
-	.loc 1 943 0
-	and	w3, w3, 65535
-	lsr	w11, w7, 16
-.LBB1358:
-.LBB1352:
-	.loc 1 153 0
-	ubfiz	w24, w6, 8, 8
-.LBE1352:
-.LBE1358:
-.LBB1359:
-.LBB1346:
-	.loc 1 154 0
-	and	w21, w3, 65280
-.LBE1346:
-.LBE1359:
-.LBB1360:
-.LBB1353:
+.L379:
+	.loc 1 934 0
+	ldr	w5, [x2, x4, lsl 2]
+	.loc 1 933 0
+	ldr	w3, [x1, x4, lsl 2]
+.LVL435:
+.LBB1324:
+.LBB1325:
 	.loc 1 140 0
-	eor	w25, w20, w12
-	.loc 1 153 0
-	add	w24, w24, w12, uxtb
-.LBE1353:
-.LBE1360:
-.LBB1361:
-.LBB1347:
-	add	w23, w23, w11, uxtb
+	and	w9, w5, 65280
+.LBE1325:
+.LBE1324:
+	.loc 1 937 0
+	lsr	w7, w5, 16
+.LVL436:
+	.loc 1 936 0
+	and	w6, w3, 65535
+.LBB1330:
+.LBB1331:
+	.loc 1 139 0
+	ubfiz	w10, w7, 8, 8
+.LBE1331:
+.LBE1330:
+	.loc 1 937 0
+	lsr	w3, w3, 16
+.LBB1336:
+.LBB1332:
 	.loc 1 140 0
-	eor	w22, w3, w11
-	.loc 1 154 0
-	add	w21, w21, w11, lsr 8
-.LBE1347:
-.LBE1361:
-	.loc 1 941 0
-	cmp	w7, w6
-	beq	.L477
-.LBB1362:
-.LBB1354:
-	.loc 1 142 0
-	cmp	w20, w12
-	beq	.L478
+	and	w7, w7, 65280
 	.loc 1 139 0
-	tst	x25, 15
-	.loc 1 154 0
-	ldrb	w6, [x14, w8, sxtw]
+	add	w10, w10, w3, uxtb
+.LBE1332:
+.LBE1336:
+.LBB1337:
+.LBB1326:
+	ubfiz	w5, w5, 8, 8
+.LVL437:
+.LBE1326:
+.LBE1337:
+.LBB1338:
+.LBB1333:
+	.loc 1 140 0
+	add	w3, w7, w3, lsr 8
+.LBE1333:
+.LBE1338:
+.LBB1339:
+.LBB1327:
 	.loc 1 139 0
-	csel	w4, w15, wzr, ne
-	.loc 1 147 0
-	tst	w25, 240
-	orr	w7, w4, 12
-	.loc 1 153 0
-	ldrb	w8, [x14, w24, sxtw]
-	.loc 1 147 0
-	csel	w4, w7, w4, ne
-	.loc 1 149 0
-	tst	w25, 3840
-	orr	w7, w4, 48
-	csel	w4, w7, w4, ne
-	.loc 1 151 0
-	tst	w25, 61440
-	orr	w7, w4, -64
-	.loc 1 153 0
-	orr	w6, w8, w6, lsl 4
-	.loc 1 151 0
-	and	w7, w7, 255
-	csel	w4, w7, w4, ne
-	.loc 1 153 0
-	and	w4, w6, w4
-	and	w4, w4, 255
-.L478:
-.LBE1354:
-.LBE1362:
-	.loc 1 942 0
-	strb	w4, [x13, -2]
-.LBB1363:
-.LBB1348:
-	.loc 1 142 0
-	cmp	w3, w11
-	beq	.L483
+	add	w5, w5, w6, uxtb
+	.loc 1 140 0
+	add	w7, w9, w6, lsr 8
+.LBE1327:
+.LBE1339:
+.LBB1340:
+.LBB1334:
 	.loc 1 139 0
-	tst	x22, 15
-	.loc 1 153 0
-	ldrb	w6, [x14, w23, sxtw]
+	ldrb	w9, [x8, w10, sxtw]
+	.loc 1 140 0
+	ldrb	w3, [x8, w3, sxtw]
+.LBE1334:
+.LBE1340:
+.LBB1341:
+.LBB1328:
+	ldrb	w6, [x8, w7, sxtw]
 	.loc 1 139 0
-	csel	w3, w15, wzr, ne
-	.loc 1 147 0
-	tst	w22, 240
-	orr	w4, w3, 12
-	.loc 1 154 0
-	ldrb	w5, [x14, w21, sxtw]
-	.loc 1 147 0
-	csel	w3, w4, w3, ne
-	.loc 1 149 0
-	tst	w22, 3840
-	orr	w4, w3, 48
-	csel	w3, w4, w3, ne
-	.loc 1 151 0
-	tst	w22, 61440
-	orr	w4, w3, -64
-	.loc 1 153 0
-	orr	w5, w6, w5, lsl 4
-	.loc 1 151 0
-	and	w4, w4, 255
-	csel	w3, w4, w3, ne
-	.loc 1 153 0
-	and	w3, w5, w3
-	and	w5, w3, 255
-.L483:
-.LBE1348:
-.LBE1363:
-	.loc 1 943 0
-	strb	w5, [x13, -1]
-.L488:
-	add	x10, x10, 1
-	add	x13, x13, 2
+	ldrb	w5, [x8, w5, sxtw]
+.LBE1328:
+.LBE1341:
+.LBB1342:
+.LBB1335:
+	orr	w3, w9, w3, lsl 2
+.LBE1335:
+.LBE1342:
 	.loc 1 938 0
-	cmp	w9, w10
-	bgt	.L489
-	add	x1, x1, x17
-	add	x2, x2, x17
-.LVL421:
-.L476:
+	ubfiz	w3, w3, 4, 8
+.LBB1343:
+.LBB1329:
+	.loc 1 139 0
+	orr	w5, w5, w6, lsl 2
+.LBE1329:
+.LBE1343:
+	.loc 1 938 0
+	orr	w3, w3, w5
+	strb	w3, [x11, x4]
+	add	x4, x4, 1
 	.loc 1 932 0
-	add	w16, w16, 1
-	cmp	w30, w16
-	beq	.L444
-	ldr	w3, [x18, 84]
-	.loc 1 933 0
-	cbnz	w19, .L549
-.L474:
-	.loc 1 936 0
-	mul	w13, w16, w3
-.LVL422:
-	lsr	w13, w13, 2
-	add	x13, x0, x13
-.LVL423:
-	b	.L475
-.LVL424:
-	.p2align 3
-.L477:
-	.loc 1 946 0
-	strh	wzr, [x13, -2]
-	b	.L488
-.LVL425:
+	cmp	w12, w4
+	bgt	.L379
+	add	x1, x1, x14
+	add	x2, x2, x14
+.L378:
+	.loc 1 926 0
+	add	w13, w13, 1
+	cmp	w16, w13
+	beq	.L371
+	ldr	w3, [x15, 84]
+	.loc 1 927 0
+	cbnz	w17, .L430
+.L376:
+	.loc 1 930 0
+	mul	w11, w13, w3
+.LVL438:
+	lsr	w11, w11, 2
+	add	x11, x0, x11
+.LVL439:
+	b	.L377
+.LBE1323:
+.LBE1322:
+	.cfi_endproc
+.LFE2820:
+	.size	direct_mode_data_change, .-direct_mode_data_change
+	.align	2
+	.p2align 3,,7
+	.type	direct_mode_data_change_part, %function
+direct_mode_data_change_part:
+.LFB2826:
+	.loc 1 1391 0
+	.cfi_startproc
+.LVL440:
+	stp	x29, x30, [sp, -96]!
+	.cfi_def_cfa_offset 96
+	.cfi_offset 29, -96
+	.cfi_offset 30, -88
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	str	x27, [sp, 80]
+	.cfi_offset 19, -80
+	.cfi_offset 20, -72
+	.cfi_offset 21, -64
+	.cfi_offset 22, -56
+	.cfi_offset 23, -48
+	.cfi_offset 24, -40
+	.cfi_offset 25, -32
+	.cfi_offset 26, -24
+	.cfi_offset 27, -16
+	.loc 1 1392 0
+	ldr	x4, [x3, 224]
+	ldr	w4, [x4, 64]
+	cmp	w4, 32
+	beq	.L605
+	.loc 1 1395 0
+	cmp	w4, 16
+	beq	.L606
+.L448:
+.LBB1370:
+.LBB1371:
+	.loc 1 1314 0
+	adrp	x5, .LANCHOR0
+	.loc 1 1320 0
+	ldrb	w6, [x3, 48]
+	ldr	w4, [x3, 56]
+	.loc 1 1314 0
+	ldr	x11, [x5, #:lo12:.LANCHOR0]
+	.loc 1 1321 0
+	ldr	x3, [x3, 128]
+.LVL441:
+	.loc 1 1320 0
+	sub	w6, w6, w4
+.LVL442:
+	.loc 1 1322 0
+	add	x11, x11, 24
+	.loc 1 1321 0
+	lsl	w6, w6, 16
+.LVL443:
+	add	x6, x3, x6, sxtw
+.LVL444:
+	.loc 1 1325 0
+	ldr	w14, [x11, 88]
+	.loc 1 1324 0
+	ldr	w3, [x11, 84]
+	.loc 1 1322 0
+	ldr	w15, [x11, 156]
+.LVL445:
+	.loc 1 1327 0
+	cmp	w14, 0
+	.loc 1 1324 0
+	lsr	w13, w3, 3
+	.loc 1 1327 0
+	ble	.L431
+	sub	w12, w13, #1
+	mov	w10, 0
+.LVL446:
+	add	x12, x12, 1
+	lsl	x16, x12, 2
+	lsl	x12, x12, 3
+	.loc 1 1328 0
+	cbz	w15, .L507
+.LVL447:
+	.p2align 2
+.L607:
+	.loc 1 1329 0
+	ldr	w7, [x11, 88]
+.LVL448:
+	sub	w7, w7, #1
+	sub	w7, w7, w10
+	mul	w7, w7, w3
+	lsr	w7, w7, 2
+	add	x7, x0, x7
+.LVL449:
+.L508:
+	.loc 1 1333 0
+	cbz	w13, .L509
+	add	x9, x1, x16
+	mov	x8, x2
+	.p2align 2
+.L520:
+	.loc 1 1335 0
+	ldr	w5, [x8]
+	.loc 1 1340 0
+	mov	w3, 0
+	.loc 1 1334 0
+	ldr	w4, [x1], 4
+	.loc 1 1339 0
+	ubfx	x17, x5, 4, 4
+.LVL450:
+	.loc 1 1338 0
+	and	w18, w4, 15
+	.loc 1 1340 0
+	cmp	w18, w17
+	beq	.L510
+	.loc 1 1341 0
+	add	w17, w18, w17, lsl 8
+	ldrb	w3, [x6, w17, sxtw]
+	and	w3, w3, 3
+.L510:
+	.loc 1 1343 0
+	ubfx	x18, x4, 4, 4
+	.loc 1 1344 0
+	ubfx	x17, x5, 12, 4
+	.loc 1 1345 0
+	cmp	w18, w17
+	beq	.L511
+	.loc 1 1346 0
+	add	w17, w18, w17, lsl 8
+	ldrb	w17, [x6, w17, sxtw]
+	ubfiz	w17, w17, 2, 2
+	orr	w3, w3, w17
+.L511:
+	.loc 1 1348 0
+	ubfx	x18, x4, 8, 4
+	.loc 1 1349 0
+	ubfx	x17, x5, 20, 4
+	.loc 1 1350 0
+	cmp	w18, w17
+	beq	.L603
+	.loc 1 1351 0
+	add	w17, w18, w17, lsl 8
+	ldrb	w17, [x6, w17, sxtw]
+	ubfiz	w17, w17, 4, 2
+	orr	w3, w3, w17
+.L603:
+	.loc 1 1353 0
+	ubfx	x17, x4, 12, 4
+	.loc 1 1354 0
+	lsr	w5, w5, 28
+	.loc 1 1351 0
+	and	w3, w3, 255
+	.loc 1 1355 0
+	cmp	w17, w5
+	beq	.L514
+	.loc 1 1356 0
+	add	w5, w17, w5, lsl 8
+	ldrb	w5, [x6, w5, sxtw]
+	orr	w3, w3, w5, lsl 6
+	and	w3, w3, 255
+.L514:
+	add	x8, x8, 8
+	.loc 1 1358 0
+	strb	w3, [x7]
+	.loc 1 1363 0
+	ubfx	x18, x4, 16, 4
+	.loc 1 1365 0
+	mov	w3, 0
+	.loc 1 1360 0
+	ldr	w5, [x8, -4]
+	.loc 1 1364 0
+	ubfx	x17, x5, 4, 4
+	.loc 1 1365 0
+	cmp	w18, w17
+	beq	.L515
+	.loc 1 1366 0
+	add	w17, w18, w17, lsl 8
+	ldrb	w3, [x6, w17, sxtw]
+	and	w3, w3, 3
+.L515:
+	.loc 1 1368 0
+	ubfx	x18, x4, 20, 4
+	.loc 1 1369 0
+	ubfx	x17, x5, 12, 4
+	.loc 1 1370 0
+	cmp	w18, w17
+	beq	.L516
+	.loc 1 1371 0
+	add	w17, w18, w17, lsl 8
+	ldrb	w17, [x6, w17, sxtw]
+	ubfiz	w17, w17, 2, 2
+	orr	w3, w3, w17
+.L516:
+	.loc 1 1373 0
+	ubfx	x18, x4, 24, 4
+	.loc 1 1374 0
+	ubfx	x17, x5, 20, 4
+	.loc 1 1375 0
+	cmp	w18, w17
+	beq	.L604
+	.loc 1 1376 0
+	add	w17, w18, w17, lsl 8
+	ldrb	w17, [x6, w17, sxtw]
+	ubfiz	w17, w17, 4, 2
+	orr	w3, w3, w17
+.L604:
+	.loc 1 1378 0
+	lsr	w4, w4, 28
+.LVL451:
+	.loc 1 1379 0
+	lsr	w5, w5, 28
+	.loc 1 1376 0
+	and	w3, w3, 255
+	.loc 1 1380 0
+	cmp	w4, w5
+	beq	.L519
+	.loc 1 1381 0
+	add	w4, w4, w5, lsl 8
+	ldrb	w4, [x6, w4, sxtw]
+	orr	w3, w3, w4, lsl 6
+	and	w3, w3, 255
+.L519:
+	add	x7, x7, 2
+	.loc 1 1383 0
+	strb	w3, [x7, -1]
+	.loc 1 1333 0
+	cmp	x1, x9
+	bne	.L520
+	add	x2, x2, x12
+.L509:
+	.loc 1 1327 0
+	add	w10, w10, 1
+	cmp	w14, w10
+	beq	.L431
+	ldr	w3, [x11, 84]
+	.loc 1 1328 0
+	cbnz	w15, .L607
+.L507:
+	.loc 1 1331 0
+	mul	w7, w10, w3
+.LVL452:
+	lsr	w7, w7, 2
+	add	x7, x0, x7
+.LVL453:
+	b	.L508
+.LVL454:
 	.p2align 3
-.L444:
-.LBE1341:
-.LBE1340:
-	.loc 1 1004 0
+.L431:
+.LBE1371:
+.LBE1370:
+	.loc 1 1407 0
 	ldp	x19, x20, [sp, 16]
+.LVL455:
 	ldp	x21, x22, [sp, 32]
-.LVL426:
+.LVL456:
 	ldp	x23, x24, [sp, 48]
-	ldr	x25, [sp, 64]
-.LVL427:
-	ldp	x29, x30, [sp], 80
+.LVL457:
+	ldp	x25, x26, [sp, 64]
+.LVL458:
+	ldr	x27, [sp, 80]
+	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
@@ -5024,432 +5393,1160 @@ direct_mode_data_change_part:
 	.cfi_restore 19
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
-.LVL428:
+.LVL459:
 	ret
-.LVL429:
-.L548:
+.LVL460:
+.L606:
 	.cfi_restore_state
-.LBB1364:
-.LBB1339:
-.LBB1338:
-	.loc 1 958 0
-	ldr	x14, [x5, #:lo12:.LANCHOR0]
-	.loc 1 963 0
-	ldrb	w7, [x3, 48]
+	.loc 1 1396 0
+	ldr	x4, [x3, 216]
+	ldr	w4, [x4, 64]
+	cmp	w4, 16
+	bne	.L448
+	.loc 1 1397 0
+	ldr	w15, [x3, 88]
+.LBB1372:
+.LBB1373:
+	.loc 1 1151 0
+	adrp	x5, .LANCHOR0
+.LVL461:
+.LBE1373:
+.LBE1372:
+	.loc 1 1397 0
+	cbz	w15, .L449
+.LBB1386:
+.LBB1384:
+	.loc 1 1151 0
+	ldr	x12, [x5, #:lo12:.LANCHOR0]
+	.loc 1 1156 0
+	ldrb	w9, [x3, 48]
 	ldr	w4, [x3, 56]
-	.loc 1 965 0
-	add	x14, x14, 24
-	.loc 1 964 0
+	.loc 1 1158 0
+	add	x12, x12, 24
+	.loc 1 1157 0
 	ldr	x3, [x3, 128]
-.LVL430:
-	.loc 1 963 0
-	sub	w7, w7, w4
-.LVL431:
-	.loc 1 968 0
-	ldr	w15, [x14, 88]
-	.loc 1 964 0
-	lsl	w7, w7, 16
-.LVL432:
-	.loc 1 965 0
-	ldr	w16, [x14, 156]
-.LVL433:
-	.loc 1 964 0
-	add	x7, x3, x7, sxtw
-.LVL434:
-	.loc 1 967 0
-	ldr	w3, [x14, 84]
-.LVL435:
-	.loc 1 973 0
-	cmp	w15, 0
-	.loc 1 967 0
+.LVL462:
+	.loc 1 1156 0
+	sub	w9, w9, w4
+.LVL463:
+	.loc 1 1161 0
+	ldr	w13, [x12, 88]
+	.loc 1 1157 0
+	lsl	w9, w9, 16
+.LVL464:
+	.loc 1 1158 0
+	ldr	w14, [x12, 156]
+	.loc 1 1157 0
+	add	x9, x3, x9, sxtw
+.LVL465:
+	.loc 1 1160 0
+	ldr	w3, [x12, 84]
+.LVL466:
+	.loc 1 1166 0
+	cmp	w13, 0
+	.loc 1 1160 0
 	lsr	w11, w3, 4
-.LVL436:
-	.loc 1 973 0
-	ble	.L444
-	sub	w13, w11, #1
-	mov	x9, x2
-.LVL437:
-	add	x13, x13, 1
-	mov	x8, x1
-.LVL438:
-	lsl	x13, x13, 3
-	mov	w12, 0
-.LVL439:
-.LBB1328:
-.LBB1329:
-	.loc 1 139 0
+.LVL467:
+	.loc 1 1166 0
+	ble	.L431
+	sub	w16, w11, #1
+	mov	w15, 0
+.LVL468:
+	add	x16, x16, 1
+.LBB1374:
+.LBB1375:
+	.loc 1 145 0
 	mov	w10, 3
-.LBE1329:
-.LBE1328:
-	.loc 1 974 0
-	cbz	w16, .L448
-.LVL440:
-	.p2align 2
-.L550:
-	.loc 1 975 0
-	ldr	w1, [x14, 88]
-.LVL441:
-	sub	w1, w1, #1
-	sub	w1, w1, w12
-	mul	w3, w1, w3
-	lsr	w3, w3, 2
-	add	x3, x0, x3
-.LVL442:
-.L449:
-	.loc 1 979 0
-	cbz	w11, .L450
-	add	x3, x3, 4
-.LVL443:
-	mov	x5, 0
+	lsl	x16, x16, 3
+.LBE1375:
+.LBE1374:
+	.loc 1 1167 0
+	cbz	w14, .L450
+.LVL469:
+.L608:
+	.loc 1 1168 0
+	ldr	w5, [x12, 88]
+.LVL470:
+	sub	w5, w5, #1
+	sub	w5, w5, w15
+	mul	w5, w5, w3
+	lsr	w5, w5, 2
+	add	x5, x0, x5
+.LVL471:
+.L451:
+	.loc 1 1172 0
+	cbz	w11, .L452
+	add	x5, x5, 4
+.LVL472:
+	mov	x8, 0
+.LVL473:
 	.p2align 2
-.L473:
-	.loc 1 980 0
-	ldr	x1, [x8, x5, lsl 3]
-.LVL444:
-	.loc 1 981 0
-	ldr	x2, [x9, x5, lsl 3]
-.LVL445:
-	.loc 1 982 0
-	cmp	x1, x2
-	beq	.L451
-	.loc 1 983 0
-	and	w17, w2, 65535
-	and	w6, w1, 65535
-.LVL446:
-.LBB1331:
-.LBB1332:
-	.loc 1 143 0
-	mov	w4, 0
-	.loc 1 142 0
-	cmp	w17, w6
-	beq	.L452
-	.loc 1 140 0
-	eor	w18, w17, w6
-.LVL447:
-	.loc 1 153 0
-	ubfiz	w19, w17, 8, 8
-	.loc 1 154 0
+.L475:
+	.loc 1 1173 0
+	ldr	x3, [x1, x8, lsl 3]
+	.loc 1 1174 0
+	ldr	x4, [x2, x8, lsl 3]
+	.loc 1 1175 0
+	cmp	x3, x4
+	beq	.L453
+	.loc 1 1176 0
+	and	w17, w4, 65535
+	and	w7, w3, 65535
+.LVL474:
+.LBB1377:
+.LBB1378:
+	.loc 1 149 0
+	mov	w6, 0
+	.loc 1 148 0
+	cmp	w17, w7
+	beq	.L454
+	.loc 1 146 0
+	eor	w18, w17, w7
+.LVL475:
+	.loc 1 159 0
+	ubfiz	w30, w17, 8, 8
+	.loc 1 160 0
 	and	w17, w17, 65280
-	.loc 1 153 0
-	add	w19, w19, w6, uxtb
-	.loc 1 139 0
+	.loc 1 159 0
+	add	w30, w30, w7, uxtb
+	.loc 1 145 0
 	tst	x18, 15
-	.loc 1 154 0
-	add	w6, w17, w6, lsr 8
-	.loc 1 139 0
-	csel	w4, w10, wzr, ne
-	.loc 1 147 0
+	.loc 1 160 0
+	add	w7, w17, w7, lsr 8
+	.loc 1 145 0
+	csel	w6, w10, wzr, ne
+	.loc 1 153 0
 	tst	w18, 240
-	orr	w17, w4, 12
+	orr	w17, w6, 12
+	.loc 1 159 0
+	ldrb	w19, [x9, w30, sxtw]
 	.loc 1 153 0
-	ldrb	w19, [x7, w19, sxtw]
-	.loc 1 147 0
-	csel	w4, w17, w4, ne
-	.loc 1 149 0
+	csel	w6, w17, w6, ne
+	.loc 1 155 0
 	tst	w18, 3840
-	orr	w17, w4, 48
-	.loc 1 154 0
-	ldrb	w6, [x7, w6, sxtw]
-	.loc 1 149 0
-	csel	w4, w17, w4, ne
-	.loc 1 151 0
+	orr	w17, w6, 48
+	.loc 1 160 0
+	ldrb	w7, [x9, w7, sxtw]
+	.loc 1 155 0
+	csel	w6, w17, w6, ne
+	.loc 1 157 0
 	tst	w18, 61440
-	orr	w17, w4, -64
+	orr	w17, w6, -64
 	and	w17, w17, 255
-	.loc 1 153 0
-	orr	w6, w19, w6, lsl 4
-	.loc 1 151 0
-	csel	w4, w17, w4, ne
-	.loc 1 153 0
-	and	w4, w6, w4
-	and	w4, w4, 255
-.LVL448:
-.L452:
-.LBE1332:
-.LBE1331:
-	.loc 1 983 0
-	strb	w4, [x3, -4]
-	.loc 1 984 0
-	lsr	w17, w2, 16
-	lsr	w6, w1, 16
-.LBB1333:
-.LBB1334:
-	.loc 1 143 0
-	mov	w4, 0
-	.loc 1 142 0
-	cmp	w17, w6
-	beq	.L457
-	.loc 1 140 0
-	eor	w18, w17, w6
-.LVL449:
-	.loc 1 153 0
-	ubfiz	w19, w17, 8, 8
-	.loc 1 154 0
+	.loc 1 159 0
+	orr	w7, w19, w7, lsl 4
+	.loc 1 157 0
+	csel	w6, w17, w6, ne
+	.loc 1 159 0
+	and	w6, w7, w6
+	and	w6, w6, 255
+.LVL476:
+.L454:
+.LBE1378:
+.LBE1377:
+	.loc 1 1176 0
+	strb	w6, [x5, -4]
+	.loc 1 1177 0
+	lsr	w17, w4, 16
+	lsr	w7, w3, 16
+.LBB1379:
+.LBB1380:
+	.loc 1 149 0
+	mov	w6, 0
+	.loc 1 148 0
+	cmp	w17, w7
+	beq	.L459
+	.loc 1 146 0
+	eor	w18, w17, w7
+.LVL477:
+	.loc 1 159 0
+	ubfiz	w30, w17, 8, 8
+	.loc 1 160 0
 	and	w17, w17, 65280
-	.loc 1 153 0
-	add	w19, w19, w6, uxtb
-	.loc 1 139 0
+	.loc 1 159 0
+	add	w30, w30, w7, uxtb
+	.loc 1 145 0
 	tst	x18, 15
-	.loc 1 154 0
-	add	w6, w17, w6, lsr 8
-	.loc 1 139 0
-	csel	w4, w10, wzr, ne
-	.loc 1 147 0
+	.loc 1 160 0
+	add	w7, w17, w7, lsr 8
+	.loc 1 145 0
+	csel	w6, w10, wzr, ne
+	.loc 1 153 0
 	tst	w18, 240
-	orr	w17, w4, 12
+	orr	w17, w6, 12
+	.loc 1 159 0
+	ldrb	w19, [x9, w30, sxtw]
 	.loc 1 153 0
-	ldrb	w19, [x7, w19, sxtw]
-	.loc 1 147 0
-	csel	w4, w17, w4, ne
-	.loc 1 149 0
+	csel	w6, w17, w6, ne
+	.loc 1 155 0
 	tst	w18, 3840
-	orr	w17, w4, 48
-	.loc 1 154 0
-	ldrb	w6, [x7, w6, sxtw]
-	.loc 1 149 0
-	csel	w4, w17, w4, ne
-	.loc 1 151 0
+	orr	w17, w6, 48
+	.loc 1 160 0
+	ldrb	w7, [x9, w7, sxtw]
+	.loc 1 155 0
+	csel	w6, w17, w6, ne
+	.loc 1 157 0
 	tst	w18, 61440
-	orr	w17, w4, -64
+	orr	w17, w6, -64
 	and	w17, w17, 255
-	.loc 1 153 0
-	orr	w6, w19, w6, lsl 4
-	.loc 1 151 0
-	csel	w4, w17, w4, ne
-	.loc 1 153 0
-	and	w4, w6, w4
-	and	w4, w4, 255
-.LVL450:
-.L457:
-.LBE1334:
-.LBE1333:
-	.loc 1 984 0
-	strb	w4, [x3, -3]
-	.loc 1 985 0
-	ubfx	x17, x2, 32, 16
-	ubfx	x6, x1, 32, 16
-.LBB1335:
-.LBB1336:
-	.loc 1 143 0
-	mov	w4, 0
-	.loc 1 142 0
-	cmp	w17, w6
-	beq	.L462
-	.loc 1 140 0
-	eor	w18, w17, w6
-.LVL451:
-	.loc 1 153 0
-	ubfiz	w19, w17, 8, 8
-	.loc 1 154 0
+	.loc 1 159 0
+	orr	w7, w19, w7, lsl 4
+	.loc 1 157 0
+	csel	w6, w17, w6, ne
+	.loc 1 159 0
+	and	w6, w7, w6
+	and	w6, w6, 255
+.LVL478:
+.L459:
+.LBE1380:
+.LBE1379:
+	.loc 1 1177 0
+	strb	w6, [x5, -3]
+	.loc 1 1178 0
+	ubfx	x17, x4, 32, 16
+	ubfx	x7, x3, 32, 16
+.LBB1381:
+.LBB1382:
+	.loc 1 149 0
+	mov	w6, 0
+	.loc 1 148 0
+	cmp	w17, w7
+	beq	.L464
+	.loc 1 146 0
+	eor	w18, w17, w7
+.LVL479:
+	.loc 1 159 0
+	ubfiz	w30, w17, 8, 8
+	.loc 1 160 0
 	and	w17, w17, 65280
-	.loc 1 153 0
-	add	w19, w19, w6, uxtb
-	.loc 1 139 0
+	.loc 1 159 0
+	add	w30, w30, w7, uxtb
+	.loc 1 145 0
 	tst	x18, 15
-	.loc 1 154 0
-	add	w6, w17, w6, lsr 8
-	.loc 1 139 0
-	csel	w4, w10, wzr, ne
-	.loc 1 147 0
+	.loc 1 160 0
+	add	w7, w17, w7, lsr 8
+	.loc 1 145 0
+	csel	w6, w10, wzr, ne
+	.loc 1 153 0
 	tst	w18, 240
-	orr	w17, w4, 12
+	orr	w17, w6, 12
+	.loc 1 159 0
+	ldrb	w19, [x9, w30, sxtw]
 	.loc 1 153 0
-	ldrb	w19, [x7, w19, sxtw]
-	.loc 1 147 0
-	csel	w4, w17, w4, ne
-	.loc 1 149 0
+	csel	w6, w17, w6, ne
+	.loc 1 155 0
 	tst	w18, 3840
-	orr	w17, w4, 48
-	.loc 1 154 0
-	ldrb	w6, [x7, w6, sxtw]
-	.loc 1 149 0
-	csel	w4, w17, w4, ne
-	.loc 1 151 0
+	orr	w17, w6, 48
+	.loc 1 160 0
+	ldrb	w7, [x9, w7, sxtw]
+	.loc 1 155 0
+	csel	w6, w17, w6, ne
+	.loc 1 157 0
 	tst	w18, 61440
-	orr	w17, w4, -64
+	orr	w17, w6, -64
 	and	w17, w17, 255
+	.loc 1 159 0
+	orr	w7, w19, w7, lsl 4
+	.loc 1 157 0
+	csel	w6, w17, w6, ne
+	.loc 1 159 0
+	and	w6, w7, w6
+	and	w6, w6, 255
+.LVL480:
+.L464:
+.LBE1382:
+.LBE1381:
+	.loc 1 1178 0
+	strb	w6, [x5, -2]
+	.loc 1 1179 0
+	lsr	x4, x4, 48
+.LVL481:
+	lsr	x3, x3, 48
+.LVL482:
+.LBB1383:
+.LBB1376:
+	.loc 1 149 0
+	mov	w6, 0
+	.loc 1 148 0
+	cmp	w4, w3
+	beq	.L469
+	.loc 1 146 0
+	eor	w7, w4, w3
+.LVL483:
+	.loc 1 159 0
+	ubfiz	w6, w4, 8, 8
+	.loc 1 160 0
+	and	w4, w4, 65280
+	.loc 1 159 0
+	add	w6, w6, w3, uxtb
+	.loc 1 145 0
+	tst	x7, 15
+	.loc 1 160 0
+	add	w3, w4, w3, lsr 8
+	.loc 1 145 0
+	csel	w4, w10, wzr, ne
 	.loc 1 153 0
-	orr	w6, w19, w6, lsl 4
-	.loc 1 151 0
-	csel	w4, w17, w4, ne
+	tst	w7, 240
+	orr	w18, w4, 12
+.LVL484:
+	.loc 1 159 0
+	ldrb	w17, [x9, w6, sxtw]
 	.loc 1 153 0
+	csel	w4, w18, w4, ne
+	.loc 1 155 0
+	tst	w7, 3840
+	orr	w18, w4, 48
+	.loc 1 160 0
+	ldrb	w6, [x9, w3, sxtw]
+	.loc 1 155 0
+	csel	w4, w18, w4, ne
+	.loc 1 157 0
+	tst	w7, 61440
+	orr	w3, w4, -64
+	and	w3, w3, 255
+	.loc 1 159 0
+	orr	w6, w17, w6, lsl 4
+	.loc 1 157 0
+	csel	w4, w3, w4, ne
+	.loc 1 159 0
 	and	w4, w6, w4
-	and	w4, w4, 255
-.LVL452:
-.L462:
-.LBE1336:
-.LBE1335:
-	.loc 1 985 0
-	strb	w4, [x3, -2]
-	.loc 1 986 0
-	lsr	x2, x2, 48
-.LVL453:
-	lsr	x1, x1, 48
-.LVL454:
-.LBB1337:
-.LBB1330:
-	.loc 1 143 0
-	mov	w4, 0
-	.loc 1 142 0
-	cmp	w2, w1
-	beq	.L467
-	.loc 1 140 0
-	eor	w6, w2, w1
-.LVL455:
-	.loc 1 153 0
-	ubfiz	w4, w2, 8, 8
-	.loc 1 154 0
-	and	w2, w2, 65280
-	.loc 1 153 0
-	add	w4, w4, w1, uxtb
-	.loc 1 139 0
-	tst	x6, 15
-	.loc 1 154 0
-	add	w1, w2, w1, lsr 8
-	.loc 1 139 0
-	csel	w2, w10, wzr, ne
-	.loc 1 147 0
-	tst	w6, 240
-	orr	w18, w2, 12
-.LVL456:
-	.loc 1 153 0
-	ldrb	w17, [x7, w4, sxtw]
-	.loc 1 147 0
-	csel	w2, w18, w2, ne
+	and	w6, w4, 255
+.LVL485:
+.L469:
+.LBE1376:
+.LBE1383:
+	.loc 1 1179 0
+	strb	w6, [x5, -1]
+.LVL486:
+.L474:
+	add	x8, x8, 1
+	add	x5, x5, 4
+	.loc 1 1172 0
+	cmp	w11, w8
+	bgt	.L475
+	add	x1, x1, x16
+.LVL487:
+	add	x2, x2, x16
+.LVL488:
+.L452:
+	.loc 1 1166 0
+	add	w15, w15, 1
+	cmp	w13, w15
+	beq	.L431
+	ldr	w3, [x12, 84]
+.LVL489:
+	.loc 1 1167 0
+	cbnz	w14, .L608
+.L450:
+	.loc 1 1170 0
+	mul	w5, w15, w3
+.LVL490:
+	lsr	w5, w5, 2
+	add	x5, x0, x5
+.LVL491:
+	b	.L451
+.LVL492:
+.L605:
+.LBE1384:
+.LBE1386:
+	.loc 1 1393 0
+	ldr	x4, [x3, 216]
+	ldr	w4, [x4, 64]
+	cmp	w4, 32
+	beq	.L609
+	.loc 1 1402 0
+	cmp	w4, 16
+	bne	.L448
+.LBB1387:
+.LBB1388:
+	.loc 1 1236 0
+	adrp	x5, .LANCHOR0
+	.loc 1 1242 0
+	ldrb	w6, [x3, 48]
+	ldr	w4, [x3, 56]
+	.loc 1 1236 0
+	ldr	x11, [x5, #:lo12:.LANCHOR0]
+	.loc 1 1243 0
+	ldr	x3, [x3, 128]
+.LVL493:
+	.loc 1 1242 0
+	sub	w6, w6, w4
+.LVL494:
+	.loc 1 1244 0
+	add	x11, x11, 24
+	.loc 1 1243 0
+	lsl	w6, w6, 16
+.LVL495:
+	add	x6, x3, x6, sxtw
+.LVL496:
+	.loc 1 1247 0
+	ldr	w14, [x11, 88]
+	.loc 1 1246 0
+	ldr	w3, [x11, 84]
+	.loc 1 1244 0
+	ldr	w15, [x11, 156]
+.LVL497:
+	.loc 1 1249 0
+	cmp	w14, 0
+	.loc 1 1246 0
+	lsr	w13, w3, 3
+	.loc 1 1249 0
+	ble	.L431
+	sub	w12, w13, #1
+	mov	w10, 0
+.LVL498:
+	add	x12, x12, 1
+	lsl	x16, x12, 3
+	lsl	x12, x12, 2
+	.loc 1 1250 0
+	cbz	w15, .L494
+.LVL499:
+.L610:
+	.loc 1 1251 0
+	ldr	w7, [x11, 88]
+.LVL500:
+	sub	w7, w7, #1
+	sub	w7, w7, w10
+	mul	w7, w7, w3
+	lsr	w7, w7, 2
+	add	x7, x0, x7
+.LVL501:
+.L495:
+	.loc 1 1255 0
+	cbz	w13, .L496
+	add	x9, x1, x16
+	mov	x8, x2
+	.p2align 2
+.L505:
+	.loc 1 1257 0
+	ldr	w3, [x8], 4
+	.loc 1 1258 0
+	mov	w17, 0
+	.loc 1 1256 0
+	ldr	w4, [x1]
+.LVL502:
+	.loc 1 1261 0
+	and	w5, w3, 255
+	ubfiz	w18, w5, 4, 4
+	.loc 1 1260 0
+	and	w30, w4, 248
+	.loc 1 1262 0
+	cmp	w30, w18
+	beq	.L497
+	.loc 1 1263 0
+	add	w18, w30, w18, lsl 8
+	ldrb	w17, [x6, w18, sxtw]
+.L497:
+	.loc 1 1265 0
+	lsr	w18, w4, 8
+	.loc 1 1266 0
+	and	w5, w5, 240
+	.loc 1 1265 0
+	and	w18, w18, 248
+	.loc 1 1267 0
+	cmp	w18, w5
+	beq	.L498
+	.loc 1 1268 0
+	add	w5, w18, w5, lsl 8
+	ldrb	w5, [x6, w5, sxtw]
+	orr	w17, w17, w5, lsl 2
+	and	w17, w17, 255
+.L498:
+	.loc 1 1270 0
+	lsr	w18, w4, 16
+	.loc 1 1271 0
+	lsr	w5, w3, 4
+	.loc 1 1270 0
+	and	w18, w18, 248
+	.loc 1 1271 0
+	and	w5, w5, 240
+	.loc 1 1272 0
+	cmp	w18, w5
+	beq	.L499
+	.loc 1 1273 0
+	add	w5, w18, w5, lsl 8
+	ldrb	w5, [x6, w5, sxtw]
+	orr	w17, w17, w5, lsl 4
+	and	w17, w17, 255
+.L499:
+	.loc 1 1275 0
+	lsr	w4, w4, 24
+	.loc 1 1276 0
+	lsr	w5, w3, 8
+	.loc 1 1275 0
+	and	w4, w4, 248
+	.loc 1 1276 0
+	and	w5, w5, 240
+	.loc 1 1277 0
+	cmp	w4, w5
+	beq	.L500
+	.loc 1 1278 0
+	add	w4, w4, w5, lsl 8
+	ldrb	w4, [x6, w4, sxtw]
+	orr	w17, w17, w4, lsl 6
+	and	w17, w17, 255
+.L500:
+	add	x1, x1, 8
+	.loc 1 1280 0
+	strb	w17, [x7]
+	.loc 1 1286 0
+	lsr	w5, w3, 12
+	.loc 1 1283 0
+	mov	w17, 0
+	.loc 1 1286 0
+	and	w5, w5, 240
+	.loc 1 1282 0
+	ldr	w4, [x1, -4]
+	.loc 1 1285 0
+	and	w18, w4, 248
+	.loc 1 1287 0
+	cmp	w18, w5
+	beq	.L501
+	.loc 1 1288 0
+	add	w5, w18, w5, lsl 8
+	ldrb	w17, [x6, w5, sxtw]
+.L501:
+	.loc 1 1290 0
+	lsr	w18, w4, 8
+	.loc 1 1291 0
+	lsr	w5, w3, 16
+	.loc 1 1290 0
+	and	w18, w18, 248
+	.loc 1 1291 0
+	and	w5, w5, 240
+	.loc 1 1292 0
+	cmp	w18, w5
+	beq	.L502
+	.loc 1 1293 0
+	add	w5, w18, w5, lsl 8
+	ldrb	w5, [x6, w5, sxtw]
+	orr	w17, w17, w5, lsl 2
+	and	w17, w17, 255
+.L502:
+	.loc 1 1295 0
+	lsr	w18, w4, 16
+	.loc 1 1296 0
+	lsr	w5, w3, 20
+	.loc 1 1295 0
+	and	w18, w18, 248
+	.loc 1 1296 0
+	and	w5, w5, 240
+	.loc 1 1297 0
+	cmp	w18, w5
+	beq	.L503
+	.loc 1 1298 0
+	add	w5, w18, w5, lsl 8
+	ldrb	w5, [x6, w5, sxtw]
+	orr	w17, w17, w5, lsl 4
+	and	w17, w17, 255
+.L503:
+	.loc 1 1300 0
+	lsr	w4, w4, 24
+	.loc 1 1301 0
+	lsr	w3, w3, 24
+	.loc 1 1300 0
+	and	w4, w4, 248
+	.loc 1 1301 0
+	and	w3, w3, 240
+	.loc 1 1302 0
+	cmp	w4, w3
+	beq	.L504
+	.loc 1 1303 0
+	add	w3, w4, w3, lsl 8
+	ldrb	w3, [x6, w3, sxtw]
+	orr	w17, w17, w3, lsl 6
+	and	w17, w17, 255
+.L504:
+	add	x7, x7, 2
+	.loc 1 1305 0
+	strb	w17, [x7, -1]
+	.loc 1 1255 0
+	cmp	x1, x9
+	bne	.L505
+	add	x2, x2, x12
+.L496:
+	.loc 1 1249 0
+	add	w10, w10, 1
+	cmp	w14, w10
+	beq	.L431
+	ldr	w3, [x11, 84]
+	.loc 1 1250 0
+	cbnz	w15, .L610
+.L494:
+	.loc 1 1253 0
+	mul	w7, w10, w3
+.LVL503:
+	lsr	w7, w7, 2
+	add	x7, x0, x7
+.LVL504:
+	b	.L495
+.LVL505:
+.L449:
+.LBE1388:
+.LBE1387:
+.LBB1389:
+.LBB1390:
+	.loc 1 1110 0
+	ldr	x17, [x5, #:lo12:.LANCHOR0]
+	.loc 1 1115 0
+	ldrb	w12, [x3, 48]
+	ldr	w4, [x3, 56]
+	.loc 1 1117 0
+	add	x17, x17, 24
+	.loc 1 1116 0
+	ldr	x3, [x3, 128]
+.LVL506:
+	.loc 1 1115 0
+	sub	w12, w12, w4
+.LVL507:
+	.loc 1 1120 0
+	ldr	w18, [x17, 88]
+	.loc 1 1116 0
+	lsl	w12, w12, 16
+.LVL508:
+	.loc 1 1117 0
+	ldr	w30, [x17, 156]
+	.loc 1 1116 0
+	add	x12, x3, x12, sxtw
+.LVL509:
+	.loc 1 1119 0
+	ldr	w3, [x17, 84]
+.LVL510:
+	.loc 1 1125 0
+	cmp	w18, 0
+	.loc 1 1119 0
+	lsr	w13, w3, 3
+.LVL511:
+	.loc 1 1125 0
+	ble	.L431
+	sub	w16, w13, #1
+.LBB1391:
+.LBB1392:
+	.loc 1 145 0
+	mov	w14, 3
+	add	x16, x16, 1
+	lsl	x16, x16, 2
+.LBE1392:
+.LBE1391:
+	.loc 1 1126 0
+	cbz	w30, .L477
+.LVL512:
+.L611:
+	.loc 1 1127 0
+	ldr	w11, [x17, 88]
+.LVL513:
+	sub	w11, w11, #1
+	sub	w11, w11, w15
+	mul	w11, w11, w3
+	lsr	w11, w11, 2
+	add	x11, x0, x11
+.LVL514:
+.L478:
+	.loc 1 1131 0
+	cbz	w13, .L479
+	add	x11, x11, 2
+.LVL515:
+	mov	x9, 0
+	.p2align 2
+.L492:
+	.loc 1 1133 0
+	ldr	w5, [x2, x9, lsl 2]
+.LBB1398:
+.LBB1399:
 	.loc 1 149 0
-	tst	w6, 3840
-	orr	w18, w2, 48
-	.loc 1 154 0
-	ldrb	w4, [x7, w1, sxtw]
+	mov	w4, 0
+.LBE1399:
+.LBE1398:
+	.loc 1 1132 0
+	ldr	w22, [x1, x9, lsl 2]
+.LBB1404:
+.LBB1393:
 	.loc 1 149 0
-	csel	w2, w18, w2, ne
-	.loc 1 151 0
-	tst	w6, 61440
-	orr	w1, w2, -64
-	and	w1, w1, 255
+	mov	w8, 0
+.LBE1393:
+.LBE1404:
+	.loc 1 1135 0
+	and	w25, w5, 65535
+	and	w7, w22, 65535
+.LBB1405:
+.LBB1400:
+	.loc 1 160 0
+	and	w3, w25, 65280
+	add	w6, w3, w7, lsr 8
+.LBE1400:
+.LBE1405:
+	.loc 1 1136 0
+	lsr	w3, w5, 16
+.LBB1406:
+.LBB1394:
+	.loc 1 159 0
+	ubfiz	w21, w3, 8, 8
+.LBE1394:
+.LBE1406:
+	.loc 1 1136 0
+	and	w3, w3, 65535
+	lsr	w10, w22, 16
+.LBB1407:
+.LBB1401:
+	.loc 1 159 0
+	ubfiz	w23, w5, 8, 8
+.LBE1401:
+.LBE1407:
+.LBB1408:
+.LBB1395:
+	.loc 1 160 0
+	and	w19, w3, 65280
+.LBE1395:
+.LBE1408:
+.LBB1409:
+.LBB1402:
+	.loc 1 146 0
+	eor	w24, w25, w7
+	.loc 1 159 0
+	add	w23, w23, w7, uxtb
+.LBE1402:
+.LBE1409:
+.LBB1410:
+.LBB1396:
+	add	w21, w21, w10, uxtb
+	.loc 1 146 0
+	eor	w20, w3, w10
+	.loc 1 160 0
+	add	w19, w19, w10, lsr 8
+.LBE1396:
+.LBE1410:
+	.loc 1 1134 0
+	cmp	w22, w5
+	beq	.L480
+.LBB1411:
+.LBB1403:
+	.loc 1 148 0
+	cmp	w25, w7
+	beq	.L481
+	.loc 1 145 0
+	tst	x24, 15
+	.loc 1 160 0
+	ldrb	w5, [x12, w6, sxtw]
+	.loc 1 145 0
+	csel	w4, w14, wzr, ne
 	.loc 1 153 0
-	orr	w4, w17, w4, lsl 4
-	.loc 1 151 0
-	csel	w2, w1, w2, ne
+	tst	w24, 240
+	orr	w6, w4, 12
+	.loc 1 159 0
+	ldrb	w7, [x12, w23, sxtw]
 	.loc 1 153 0
-	and	w2, w4, w2
-	and	w4, w2, 255
-.LVL457:
-.L467:
-.LBE1330:
-.LBE1337:
-	.loc 1 986 0
-	strb	w4, [x3, -1]
-.LVL458:
-.L472:
-	add	x5, x5, 1
-	add	x3, x3, 4
-	.loc 1 979 0
-	cmp	w11, w5
-	bgt	.L473
-	add	x8, x8, x13
-	add	x9, x9, x13
-.LVL459:
-.L450:
-	.loc 1 973 0
-	add	w12, w12, 1
-	cmp	w15, w12
-	beq	.L444
-	ldr	w3, [x14, 84]
-.LVL460:
-	.loc 1 974 0
-	cbnz	w16, .L550
-.L448:
-	.loc 1 977 0
-	mul	w3, w12, w3
-	lsr	w3, w3, 2
-	add	x3, x0, x3
-.LVL461:
-	b	.L449
-.LVL462:
+	csel	w4, w6, w4, ne
+	.loc 1 155 0
+	tst	w24, 3840
+	orr	w6, w4, 48
+	csel	w4, w6, w4, ne
+	.loc 1 157 0
+	tst	w24, 61440
+	orr	w6, w4, -64
+	.loc 1 159 0
+	orr	w5, w7, w5, lsl 4
+	.loc 1 157 0
+	and	w6, w6, 255
+	csel	w4, w6, w4, ne
+	.loc 1 159 0
+	and	w4, w5, w4
+	and	w4, w4, 255
+.L481:
+.LBE1403:
+.LBE1411:
+	.loc 1 1135 0
+	strb	w4, [x11, -2]
+.LBB1412:
+.LBB1397:
+	.loc 1 148 0
+	cmp	w3, w10
+	beq	.L486
+	.loc 1 145 0
+	tst	x20, 15
+	.loc 1 159 0
+	ldrb	w6, [x12, w21, sxtw]
+	.loc 1 145 0
+	csel	w3, w14, wzr, ne
+	.loc 1 153 0
+	tst	w20, 240
+	orr	w5, w3, 12
+	.loc 1 160 0
+	ldrb	w4, [x12, w19, sxtw]
+	.loc 1 153 0
+	csel	w3, w5, w3, ne
+	.loc 1 155 0
+	tst	w20, 3840
+	orr	w5, w3, 48
+	csel	w3, w5, w3, ne
+	.loc 1 157 0
+	tst	w20, 61440
+	orr	w5, w3, -64
+	.loc 1 159 0
+	orr	w4, w6, w4, lsl 4
+	.loc 1 157 0
+	and	w5, w5, 255
+	csel	w3, w5, w3, ne
+	.loc 1 159 0
+	and	w3, w4, w3
+	and	w8, w3, 255
+.L486:
+.LBE1397:
+.LBE1412:
+	.loc 1 1136 0
+	strb	w8, [x11, -1]
+.L491:
+	add	x9, x9, 1
+	add	x11, x11, 2
+	.loc 1 1131 0
+	cmp	w13, w9
+	bgt	.L492
+	add	x1, x1, x16
+	add	x2, x2, x16
+.LVL516:
+.L479:
+	.loc 1 1125 0
+	add	w15, w15, 1
+	cmp	w18, w15
+	beq	.L431
+	ldr	w3, [x17, 84]
+	.loc 1 1126 0
+	cbnz	w30, .L611
+.L477:
+	.loc 1 1129 0
+	mul	w11, w15, w3
+.LVL517:
+	lsr	w11, w11, 2
+	add	x11, x0, x11
+.LVL518:
+	b	.L478
+.LVL519:
 	.p2align 3
-.L451:
-	.loc 1 989 0
-	str	wzr, [x3, -4]
-	b	.L472
-.LBE1338:
-.LBE1339:
-.LBE1364:
+.L453:
+.LBE1390:
+.LBE1389:
+.LBB1414:
+.LBB1385:
+	.loc 1 1182 0
+	str	wzr, [x5, -4]
+	b	.L474
+.LVL520:
+	.p2align 3
+.L480:
+.LBE1385:
+.LBE1414:
+.LBB1415:
+.LBB1413:
+	.loc 1 1139 0
+	strh	wzr, [x11, -2]
+	b	.L491
+.LVL521:
+.L609:
+.LBE1413:
+.LBE1415:
+.LBB1416:
+.LBB1417:
+	.loc 1 1194 0
+	adrp	x5, .LANCHOR0
+	.loc 1 1199 0
+	ldrb	w15, [x3, 48]
+	ldr	w4, [x3, 56]
+	.loc 1 1194 0
+	ldr	x21, [x5, #:lo12:.LANCHOR0]
+	.loc 1 1200 0
+	ldr	x3, [x3, 128]
+.LVL522:
+	.loc 1 1199 0
+	sub	w15, w15, w4
+.LVL523:
+	.loc 1 1201 0
+	add	x21, x21, 24
+	.loc 1 1200 0
+	lsl	w15, w15, 16
+.LVL524:
+	add	x15, x3, x15, sxtw
+.LVL525:
+	.loc 1 1206 0
+	ldr	w22, [x21, 88]
+	.loc 1 1205 0
+	ldr	w3, [x21, 84]
+	.loc 1 1201 0
+	ldr	w23, [x21, 156]
+.LVL526:
+	.loc 1 1211 0
+	cmp	w22, 0
+	.loc 1 1205 0
+	lsr	w17, w3, 2
+.LVL527:
+	.loc 1 1211 0
+	ble	.L431
+	sub	w20, w17, #1
+	mov	w19, 0
+.LVL528:
+	add	x20, x20, 1
+.LBB1418:
+.LBB1419:
+	.loc 1 167 0
+	mov	w18, 3
+	lsl	x20, x20, 2
+.LBE1419:
+.LBE1418:
+	.loc 1 1212 0
+	cbz	w23, .L436
+.LVL529:
+.L614:
+	.loc 1 1213 0
+	ldr	w16, [x21, 88]
+.LVL530:
+	sub	w16, w16, #1
+	sub	w16, w16, w19
+	mul	w16, w16, w3
+	lsr	w16, w16, 2
+	add	x16, x0, x16
+.LVL531:
+.L437:
+	.loc 1 1217 0
+	cbz	w17, .L438
+	mov	x11, 0
+	b	.L447
+.LVL532:
+	.p2align 3
+.L613:
+.LBB1425:
+.LBB1426:
+	.loc 1 170 0
+	cmp	w7, w5
+	beq	.L440
+	.loc 1 177 0
+	ldrb	w4, [x15, w8, sxtw]
+	.loc 1 167 0
+	cmp	w27, 0
+	.loc 1 178 0
+	ldrb	w12, [x15, w9, sxtw]
+	.loc 1 177 0
+	orr	w12, w4, w12, lsl 2
+	.loc 1 167 0
+	csel	w4, w18, wzr, ne
+.LVL533:
+	.loc 1 175 0
+	orr	w5, w4, 12
+	tst	w30, 65280
+	csel	w4, w5, w4, ne
+	and	w12, w12, w4
+.L440:
+.LBE1426:
+.LBE1425:
+.LBB1430:
+.LBB1420:
+	.loc 1 170 0
+	cmp	w3, w13
+	beq	.L443
+	.loc 1 167 0
+	cmp	w26, 0
+	.loc 1 178 0
+	ldrb	w3, [x15, w24, sxtw]
+	.loc 1 177 0
+	ldrb	w5, [x15, w14, sxtw]
+	.loc 1 167 0
+	csel	w4, w18, wzr, ne
+.LVL534:
+	.loc 1 175 0
+	orr	w6, w4, 12
+	tst	w25, 65280
+	csel	w4, w6, w4, ne
+	.loc 1 177 0
+	orr	w3, w5, w3, lsl 2
+	and	w3, w3, w4
+	lsl	w3, w3, 4
+	sxtb	w10, w3
+.LVL535:
+.L443:
+.LBE1420:
+.LBE1430:
+	.loc 1 1223 0
+	orr	w3, w12, w10
+	strb	w3, [x16, x11]
+	add	x11, x11, 1
+	.loc 1 1217 0
+	cmp	w17, w11
+	ble	.L612
+.L447:
+	.loc 1 1219 0
+	ldr	w4, [x2, x11, lsl 2]
+.LVL536:
+.LBB1431:
+.LBB1427:
+	.loc 1 170 0
+	mov	w12, 0
+.LBE1427:
+.LBE1431:
+	.loc 1 1218 0
+	ldr	w6, [x1, x11, lsl 2]
+.LBB1432:
+.LBB1421:
+	.loc 1 170 0
+	mov	w10, 0
+.LBE1421:
+.LBE1432:
+	.loc 1 1221 0
+	and	w7, w4, 65535
+	.loc 1 1222 0
+	lsr	w3, w4, 16
+	.loc 1 1221 0
+	and	w5, w6, 65535
+	.loc 1 1222 0
+	lsr	w13, w6, 16
+.LBB1433:
+.LBB1422:
+	.loc 1 177 0
+	ubfiz	w14, w3, 8, 8
+.LBE1422:
+.LBE1433:
+	.loc 1 1222 0
+	and	w3, w3, 65535
+.LBB1434:
+.LBB1428:
+	.loc 1 177 0
+	ubfiz	w8, w4, 8, 8
+	.loc 1 178 0
+	and	w9, w7, 65280
+	.loc 1 168 0
+	eor	w30, w7, w5
+.LBE1428:
+.LBE1434:
+.LBB1435:
+.LBB1423:
+	.loc 1 178 0
+	and	w24, w3, 65280
+	.loc 1 168 0
+	eor	w25, w3, w13
+.LBE1423:
+.LBE1435:
+.LBB1436:
+.LBB1429:
+	.loc 1 177 0
+	add	w8, w8, w5, uxtb
+	.loc 1 178 0
+	add	w9, w9, w5, lsr 8
+	.loc 1 172 0
+	and	w27, w30, 255
+.LBE1429:
+.LBE1436:
+.LBB1437:
+.LBB1424:
+	.loc 1 177 0
+	add	w14, w14, w13, uxtb
+	.loc 1 178 0
+	add	w24, w24, w13, lsr 8
+	.loc 1 172 0
+	and	w26, w25, 255
+.LBE1424:
+.LBE1437:
+	.loc 1 1220 0
+	cmp	w6, w4
+	bne	.L613
+	.loc 1 1226 0
+	strb	wzr, [x16, x11]
+	add	x11, x11, 1
+	.loc 1 1217 0
+	cmp	w17, w11
+	bgt	.L447
+.LVL537:
+.L612:
+	add	x1, x1, x20
+	add	x2, x2, x20
+.L438:
+	.loc 1 1211 0
+	add	w19, w19, 1
+	cmp	w22, w19
+	beq	.L431
+	ldr	w3, [x21, 84]
+	.loc 1 1212 0
+	cbnz	w23, .L614
+.L436:
+	.loc 1 1215 0
+	mul	w16, w19, w3
+.LVL538:
+	lsr	w16, w16, 2
+	add	x16, x0, x16
+.LVL539:
+	b	.L437
+.LBE1417:
+.LBE1416:
 	.cfi_endproc
-.LFE2819:
+.LFE2826:
 	.size	direct_mode_data_change_part, .-direct_mode_data_change_part
 	.align	2
 	.p2align 3,,7
-	.type	flip.isra.7, %function
-flip.isra.7:
-.LFB2865:
-	.loc 1 1006 0
+	.type	flip.isra.11, %function
+flip.isra.11:
+.LFB2876:
+	.loc 1 1409 0
 	.cfi_startproc
-.LVL463:
+.LVL540:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 1010 0
+	.loc 1 1413 0
 	sxtw	x2, w1
-	.loc 1 1006 0
+	.loc 1 1409 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 1006 0
+	.loc 1 1409 0
 	mov	x20, x0
-	.loc 1 1008 0
+	.loc 1 1411 0
 	ldr	w19, [x0, 72]
-	.loc 1 1010 0
+	.loc 1 1413 0
 	ldr	x0, [x0]
-.LVL464:
-.LBB1365:
-.LBB1366:
-.LBB1367:
-.LBB1368:
+.LVL541:
+.LBB1438:
+.LBB1439:
+.LBB1440:
+.LBB1441:
 	.file 10 "./include/linux/dma-mapping.h"
 	.loc 10 266 0
-	cbz	x0, .L554
+	cbz	x0, .L618
 	ldr	x3, [x0, 648]
 	.loc 10 268 0
 	adrp	x4, dummy_dma_ops
 	add	x4, x4, :lo12:dummy_dma_ops
 	cmp	x3, 0
 	csel	x3, x4, x3, eq
-.L552:
-.LBE1368:
-.LBE1367:
+.L616:
+.LBE1441:
+.LBE1440:
 	.loc 10 434 0
 	ldr	x5, [x3, 88]
 	sxtw	x19, w19
-	cbz	x5, .L553
-.LBE1366:
-.LBE1365:
-	.loc 1 1010 0
+	cbz	x5, .L617
+.LBE1439:
+.LBE1438:
+	.loc 1 1413 0
 	add	x4, x19, x19, lsl 1
-.LBB1374:
-.LBB1371:
+.LBB1447:
+.LBB1444:
 	.loc 10 435 0
 	mov	w3, 1
-.LBE1371:
-.LBE1374:
-	.loc 1 1010 0
+.LBE1444:
+.LBE1447:
+	.loc 1 1413 0
 	add	x4, x20, x4, lsl 3
-.LBB1375:
-.LBB1372:
+.LBB1448:
+.LBB1445:
 	.loc 10 435 0
 	ldr	x1, [x4, 32]
 	blr	x5
-.LVL465:
-.L553:
-.LBE1372:
-.LBE1375:
-	.loc 1 1011 0
+.LVL542:
+.L617:
+.LBE1445:
+.LBE1448:
+	.loc 1 1414 0
 	ldr	x5, [x20, 8]
-.LBB1376:
-.LBB1377:
+.LBB1449:
+.LBB1450:
 	.file 11 "drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.h"
 	.loc 11 57 0
 	mov	w4, 0
@@ -5457,58 +6554,58 @@ flip.isra.7:
 	mov	w2, 0
 	mov	x0, x5
 	mov	w1, 0
-.LBE1377:
-.LBE1376:
-	.loc 1 1012 0
+.LBE1450:
+.LBE1449:
+	.loc 1 1415 0
 	add	x19, x19, x19, lsl 1
-.LBB1380:
-.LBB1378:
+.LBB1453:
+.LBB1451:
 	.loc 11 57 0
 	ldr	x5, [x5, 64]
-.LBE1378:
-.LBE1380:
-	.loc 1 1012 0
+.LBE1451:
+.LBE1453:
+	.loc 1 1415 0
 	add	x19, x20, x19, lsl 3
-.LBB1381:
-.LBB1379:
+.LBB1454:
+.LBB1452:
 	.loc 11 57 0
 	blr	x5
-.LVL466:
-.LBE1379:
-.LBE1381:
-	.loc 1 1012 0
+.LVL543:
+.LBE1452:
+.LBE1454:
+	.loc 1 1415 0
 	ldr	x1, [x20, 8]
-.LBB1382:
-.LBB1383:
+.LBB1455:
+.LBB1456:
 	.loc 11 62 0
 	mov	w2, 0
 	mov	x0, x1
 	ldr	x3, [x1, 72]
 	ldr	w1, [x19, 32]
 	blr	x3
-.LVL467:
-.LBE1383:
-.LBE1382:
-	.loc 1 1013 0
+.LVL544:
+.LBE1456:
+.LBE1455:
+	.loc 1 1416 0
 	ldr	x2, [x20, 8]
-.LBB1384:
-.LBB1385:
+.LBB1457:
+.LBB1458:
 	.loc 11 77 0
 	mov	w1, 1
 	mov	x0, x2
 	ldr	x2, [x2, 96]
 	blr	x2
-.LVL468:
-.LBE1385:
-.LBE1384:
-	.loc 1 1014 0
+.LVL545:
+.LBE1458:
+.LBE1457:
+	.loc 1 1417 0
 	ldr	w1, [x20, 72]
 	mov	w0, 1
 	sub	w0, w0, w1
 	str	w0, [x20, 72]
-	.loc 1 1015 0
+	.loc 1 1418 0
 	ldp	x19, x20, [sp, 16]
-.LVL469:
+.LVL546:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -5517,33 +6614,33 @@ flip.isra.7:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL470:
+.LVL547:
 	.p2align 3
-.L554:
+.L618:
 	.cfi_restore_state
-.LBB1386:
-.LBB1373:
-.LBB1370:
-.LBB1369:
+.LBB1459:
+.LBB1446:
+.LBB1443:
+.LBB1442:
 	.loc 10 268 0
 	adrp	x3, dummy_dma_ops
 	add	x3, x3, :lo12:dummy_dma_ops
-	b	.L552
-.LBE1369:
-.LBE1370:
-.LBE1373:
-.LBE1386:
+	b	.L616
+.LBE1442:
+.LBE1443:
+.LBE1446:
+.LBE1459:
 	.cfi_endproc
-.LFE2865:
-	.size	flip.isra.7, .-flip.isra.7
+.LFE2876:
+	.size	flip.isra.11, .-flip.isra.11
 	.align	2
 	.p2align 3,,7
 	.type	ebc_frame_start, %function
 ebc_frame_start:
-.LFB2822:
-	.loc 1 1024 0
+.LFB2829:
+	.loc 1 1427 0
 	.cfi_startproc
-.LVL471:
+.LVL548:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
@@ -5553,58 +6650,58 @@ ebc_frame_start:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 1026 0
+	.loc 1 1429 0
 	add	x19, x0, 184
-	.loc 1 1024 0
+	.loc 1 1427 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 1024 0
+	.loc 1 1427 0
 	mov	x20, x0
-	.loc 1 1025 0
+	.loc 1 1428 0
 	add	x21, x0, 24
-	.loc 1 1028 0
+	.loc 1 1434 0
 	ldr	x1, [x19, 224]
 	ldr	w0, [x1, 40]
-.LVL472:
+.LVL549:
 	cmp	w0, 16
-	bgt	.L561
+	bgt	.L625
 	cmp	w0, 7
-	bge	.L562
-	cbz	w0, .L563
+	bge	.L626
+	cbz	w0, .L627
 	cmp	w0, 1
-	bne	.L560
-	.loc 1 1030 0
+	bne	.L624
+	.loc 1 1436 0
 	ldr	x0, [x19, 184]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
 	ldr	x3, [x19, 168]
 	bl	get_overlay_image
-.LVL473:
-	.loc 1 1035 0
+.LVL550:
+	.loc 1 1441 0
 	ldr	w0, [x19, 52]
-	cbz	w0, .L565
-.LBB1387:
-.LBB1388:
-	.loc 1 1019 0
-	str	wzr, [x21, 72]
-	.loc 1 1020 0
-	mov	x0, x21
-	ldr	w1, [x20, 208]
-	bl	flip.isra.7
-.LVL474:
-.LBE1388:
-.LBE1387:
-	.loc 1 1037 0
+	cbz	w0, .L629
+	.loc 1 1442 0
 	ldp	x1, x2, [x19, 144]
 	mov	x4, x19
 	ldr	x3, [x19, 168]
 	ldr	x0, [x19, 192]
 	bl	get_overlay_image
-.LVL475:
-	.loc 1 1105 0
+.LVL551:
+.LBB1460:
+.LBB1461:
+	.loc 1 1422 0
+	str	wzr, [x21, 72]
+	.loc 1 1423 0
+	mov	x0, x21
+	ldr	w1, [x20, 208]
+	bl	flip.isra.11
+.LVL552:
+.LBE1461:
+.LBE1460:
+	.loc 1 1541 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL476:
+.LVL553:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -5614,47 +6711,47 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL477:
+.LVL554:
 	.p2align 3
-.L561:
+.L625:
 	.cfi_restore_state
-	.loc 1 1028 0
+	.loc 1 1434 0
 	sub	w0, w0, #22
 	cmp	w0, 1
-	bhi	.L560
-.L563:
-	.loc 1 1050 0
+	bhi	.L624
+.L627:
+	.loc 1 1456 0
 	ldr	x0, [x19, 184]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
 	ldr	x3, [x19, 168]
 	bl	get_auto_image
-.LVL478:
-	.loc 1 1055 0
+.LVL555:
+	.loc 1 1461 0
 	ldr	w0, [x19, 52]
-	cbz	w0, .L567
-.LBB1389:
-.LBB1390:
-	.loc 1 1019 0
-	str	wzr, [x21, 72]
-	.loc 1 1020 0
-	mov	x0, x21
-	ldr	w1, [x20, 208]
-	bl	flip.isra.7
-.LVL479:
-.LBE1390:
-.LBE1389:
-	.loc 1 1057 0
+	cbz	w0, .L631
+	.loc 1 1462 0
 	ldp	x1, x2, [x19, 144]
 	mov	x4, x19
 	ldr	x3, [x19, 168]
 	ldr	x0, [x19, 192]
 	bl	get_auto_image
-.LVL480:
-	.loc 1 1105 0
+.LVL556:
+.LBB1462:
+.LBB1463:
+	.loc 1 1422 0
+	str	wzr, [x21, 72]
+	.loc 1 1423 0
+	mov	x0, x21
+	ldr	w1, [x20, 208]
+	bl	flip.isra.11
+.LVL557:
+.LBE1463:
+.LBE1462:
+	.loc 1 1541 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL481:
+.LVL558:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -5664,53 +6761,53 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL482:
+.LVL559:
 	.p2align 3
-.L560:
+.L624:
 	.cfi_restore_state
-	.loc 1 1093 0
+	.loc 1 1529 0
 	ldr	x2, [x19, 216]
-	.loc 1 1091 0
+	.loc 1 1527 0
 	mov	x3, x19
-	.loc 1 1090 0
+	.loc 1 1526 0
 	ldrb	w0, [x19, 48]
 	str	w0, [x19, 56]
-	.loc 1 1091 0
+	.loc 1 1527 0
 	ldr	x0, [x19, 184]
-	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
+	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
-.LVL483:
-.LBB1391:
-.LBB1392:
-	.loc 1 1019 0
-	str	wzr, [x21, 72]
-	.loc 1 1020 0
-	mov	x0, x21
-	ldr	w1, [x20, 208]
-	bl	flip.isra.7
-.LVL484:
-.LBE1392:
-.LBE1391:
-	.loc 1 1096 0
+.LVL560:
+	.loc 1 1531 0
 	ldr	w0, [x19, 56]
-	.loc 1 1097 0
+	.loc 1 1532 0
 	mov	x3, x19
-	.loc 1 1098 0
+	.loc 1 1533 0
 	ldp	x2, x1, [x19, 216]
-	.loc 1 1096 0
+	.loc 1 1531 0
 	sub	w0, w0, #1
 	str	w0, [x19, 56]
-	.loc 1 1097 0
+	.loc 1 1532 0
 	ldr	x0, [x19, 192]
-	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
+	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change
-.LVL485:
-	.loc 1 1105 0
+.LVL561:
+.LBB1464:
+.LBB1465:
+	.loc 1 1422 0
+	str	wzr, [x21, 72]
+	.loc 1 1423 0
+	mov	x0, x21
+	ldr	w1, [x20, 208]
+	bl	flip.isra.11
+.LVL562:
+.LBE1465:
+.LBE1464:
+	.loc 1 1541 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL486:
+.LVL563:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 30
@@ -5720,53 +6817,53 @@ ebc_frame_start:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL487:
+.LVL564:
 	.p2align 3
-.L562:
+.L626:
 	.cfi_restore_state
-	.loc 1 1080 0
+	.loc 1 1486 0
 	ldr	x2, [x19, 216]
-	.loc 1 1078 0
+	.loc 1 1484 0
 	mov	x3, x19
-	.loc 1 1077 0
+	.loc 1 1483 0
 	ldrb	w0, [x19, 48]
 	str	w0, [x19, 56]
-	.loc 1 1078 0
+	.loc 1 1484 0
 	ldr	x0, [x19, 184]
-	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
+	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part
-.LVL488:
-.LBB1393:
-.LBB1394:
-	.loc 1 1019 0
-	str	wzr, [x21, 72]
-	.loc 1 1020 0
-	mov	x0, x21
-	ldr	w1, [x20, 208]
-	bl	flip.isra.7
-.LVL489:
-.LBE1394:
-.LBE1393:
-	.loc 1 1083 0
+.LVL565:
+	.loc 1 1488 0
 	ldr	w0, [x19, 56]
-	.loc 1 1084 0
+	.loc 1 1489 0
 	mov	x3, x19
-	.loc 1 1085 0
+	.loc 1 1490 0
 	ldp	x2, x1, [x19, 216]
-	.loc 1 1083 0
+	.loc 1 1488 0
 	sub	w0, w0, #1
 	str	w0, [x19, 56]
-	.loc 1 1084 0
+	.loc 1 1489 0
 	ldr	x0, [x19, 192]
-	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
+	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change_part
-.LVL490:
-	.loc 1 1105 0
+.LVL566:
+.LBB1466:
+.LBB1467:
+	.loc 1 1422 0
+	str	wzr, [x21, 72]
+	.loc 1 1423 0
+	mov	x0, x21
+	ldr	w1, [x20, 208]
+	bl	flip.isra.11
+.LVL567:
+.LBE1467:
+.LBE1466:
+	.loc 1 1541 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL491:
+.LVL568:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -5776,23 +6873,23 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL492:
+.LVL569:
 	.p2align 3
-.L567:
+.L631:
 	.cfi_restore_state
-	.loc 1 1063 0
+	.loc 1 1469 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
-	adrp	x1, .LC22
+	adrp	x1, .LC21
 	add	x2, x2, :lo12:.LANCHOR3
-	add	x1, x1, :lo12:.LC22
+	add	x1, x1, :lo12:.LC21
 	bl	_dev_info
-.LVL493:
-	.loc 1 1064 0
+.LVL570:
+	.loc 1 1470 0
 	str	wzr, [x19, 44]
-	.loc 1 1105 0
+	.loc 1 1541 0
 	ldp	x19, x20, [sp, 16]
-.LVL494:
+.LVL571:
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -5803,23 +6900,23 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL495:
+.LVL572:
 	.p2align 3
-.L565:
+.L629:
 	.cfi_restore_state
-	.loc 1 1043 0
+	.loc 1 1449 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
-	adrp	x1, .LC21
+	adrp	x1, .LC20
 	add	x2, x2, :lo12:.LANCHOR3
-	add	x1, x1, :lo12:.LC21
+	add	x1, x1, :lo12:.LC20
 	bl	_dev_info
-.LVL496:
-	.loc 1 1044 0
+.LVL573:
+	.loc 1 1450 0
 	str	wzr, [x19, 44]
-	.loc 1 1105 0
+	.loc 1 1541 0
 	ldp	x19, x20, [sp, 16]
-.LVL497:
+.LVL574:
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	.cfi_restore 20
@@ -5830,25 +6927,25 @@ ebc_frame_start:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2822:
+.LFE2829:
 	.size	ebc_frame_start, .-ebc_frame_start
 	.align	2
 	.p2align 3,,7
 	.type	ebc_auto_tast_function, %function
 ebc_auto_tast_function:
-.LFB2823:
-	.loc 1 1108 0
+.LFB2830:
+	.loc 1 1544 0
 	.cfi_startproc
-.LVL498:
+.LVL575:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
 	.cfi_offset 30, -88
-	.loc 1 1109 0
+	.loc 1 1545 0
 	adrp	x1, .LANCHOR0
-	.loc 1 1108 0
+	.loc 1 1544 0
 	adrp	x0, __stack_chk_guard
-.LVL499:
+.LVL576:
 	add	x0, x0, :lo12:__stack_chk_guard
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -5857,102 +6954,102 @@ ebc_auto_tast_function:
 	.cfi_offset 20, -72
 	adrp	x20, .LANCHOR1
 	stp	x21, x22, [sp, 32]
-	.loc 1 1114 0
+	.loc 1 1550 0
 	add	x20, x20, :lo12:.LANCHOR1
 	.cfi_offset 21, -64
 	.cfi_offset 22, -56
-	.loc 1 1109 0
+	.loc 1 1545 0
 	ldr	x22, [x1, #:lo12:.LANCHOR0]
-.LVL500:
-	.loc 1 1114 0
+.LVL577:
+	.loc 1 1550 0
 	add	x20, x20, 376
-	.loc 1 1108 0
+	.loc 1 1544 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
-.LBB1395:
-.LBB1396:
-.LBB1397:
+.LBB1468:
+.LBB1469:
+.LBB1470:
 	.file 12 "./include/linux/compiler.h"
 	.loc 12 288 0
 	mov	x24, 2
-.LBE1397:
-.LBE1396:
-.LBE1395:
-	.loc 1 1108 0
+.LBE1470:
+.LBE1469:
+.LBE1468:
+	.loc 1 1544 0
 	str	x25, [sp, 64]
 	.cfi_offset 25, -32
-	.loc 1 1110 0
+	.loc 1 1546 0
 	add	x21, x22, 24
-	.loc 1 1111 0
+	.loc 1 1547 0
 	add	x19, x22, 184
 	add	x25, x22, 744
-.LBB1402:
-.LBB1399:
-.LBB1400:
+.LBB1475:
+.LBB1472:
+.LBB1473:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x23, sp_el0
 // 0 "" 2
-.LVL501:
+.LVL578:
 #NO_APP
-.LBE1400:
-.LBE1399:
-.LBE1402:
-	.loc 1 1108 0
+.LBE1473:
+.LBE1472:
+.LBE1475:
+	.loc 1 1544 0
 	ldr	x1, [x0]
 	str	x1, [x29, 88]
 	mov	x1,0
-	b	.L583
+	b	.L647
 	.p2align 3
-.L599:
-	.loc 1 1173 0
+.L663:
+	.loc 1 1632 0
 	cmp	w0, 1
-	beq	.L598
-.L582:
-	.loc 1 1176 0
+	beq	.L662
+.L646:
+	.loc 1 1635 0
 	mov	x0, x20
 	bl	up
-.LVL502:
-	.loc 1 1177 0
+.LVL579:
+	.loc 1 1636 0
 	bl	schedule
-.LVL503:
-.L583:
-	.loc 1 1114 0
+.LVL580:
+.L647:
+	.loc 1 1550 0
 	mov	x0, x20
 	bl	down
-.LVL504:
-.LBB1403:
-.LBB1401:
-.LBB1398:
+.LVL581:
+.LBB1476:
+.LBB1474:
+.LBB1471:
 	.loc 12 288 0
 	str	x24, [x23, 32]
-.LBE1398:
-.LBE1401:
-.LBE1403:
-	.loc 1 1118 0
+.LBE1471:
+.LBE1474:
+.LBE1476:
+	.loc 1 1554 0
 #APP
-// 1118 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
+// 1554 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
 	dmb ish
 // 0 "" 2
-	.loc 1 1119 0
+	.loc 1 1555 0
 #NO_APP
 	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 16
-	bgt	.L574
+	bgt	.L638
 	cmp	w0, 7
-	bge	.L575
-	cbz	w0, .L576
+	bge	.L639
+	cbz	w0, .L640
 	cmp	w0, 1
-	bne	.L573
-	.loc 1 1121 0
+	bne	.L637
+	.loc 1 1557 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
-	bl	flip.isra.7
-.LVL505:
-	.loc 1 1122 0
+	bl	flip.isra.11
+.LVL582:
+	.loc 1 1558 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
@@ -5960,72 +7057,71 @@ ebc_auto_tast_function:
 	ldr	x3, [x19, 168]
 	ldr	x0, [x0, 184]
 	bl	get_overlay_image
-.LVL506:
-.L578:
-	.loc 1 1170 0
+.LVL583:
+.L642:
+	.loc 1 1629 0
 	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
-	.loc 1 1171 0
+	.loc 1 1630 0
 	sub	w1, w0, #22
-	.loc 1 1172 0
+	.loc 1 1631 0
 	cmp	w0, 0
 	ccmp	w1, 1, 0, ne
-	bhi	.L599
-.LBB1404:
-.LBB1405:
+	bhi	.L663
+.LBB1477:
+.LBB1478:
 	.file 13 "./include/linux/workqueue.h"
 	.loc 13 518 0
 	ldr	x1, [x19, 608]
 	mov	x2, x25
 	mov	w0, 8
 	bl	queue_work_on
-.LVL507:
-	b	.L582
+.LVL584:
+	b	.L646
 	.p2align 3
-.L574:
-.LBE1405:
-.LBE1404:
-	.loc 1 1119 0
+.L638:
+.LBE1478:
+.LBE1477:
+	.loc 1 1555 0
 	sub	w0, w0, #22
 	cmp	w0, 1
-	bls	.L576
-.L573:
-	.loc 1 1158 0
+	bls	.L640
+.L637:
+	.loc 1 1618 0
 	ldr	w1, [x19, 56]
-	.loc 1 1159 0
+	.loc 1 1619 0
 	mov	x0, x21
-	.loc 1 1158 0
+	.loc 1 1618 0
 	sub	w1, w1, #1
 	str	w1, [x19, 56]
-	.loc 1 1159 0
+	.loc 1 1619 0
 	ldr	w1, [x22, 208]
-	bl	flip.isra.7
-.LVL508:
-	.loc 1 1160 0
+	bl	flip.isra.11
+.LVL585:
+	.loc 1 1620 0
 	ldr	w0, [x19, 56]
-	cbz	w0, .L578
-	.loc 1 1162 0
+	cbz	w0, .L642
+	.loc 1 1622 0
 	ldrsw	x0, [x21, 72]
 	mov	x3, x19
-	.loc 1 1163 0
+	.loc 1 1623 0
 	ldp	x2, x1, [x19, 216]
-	.loc 1 1162 0
+	.loc 1 1622 0
 	add	x0, x19, x0, lsl 3
 	ldr	x1, [x1, 16]
 	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
-.LVL509:
-	.loc 1 1166 0
-	b	.L578
+.LVL586:
+	b	.L642
 	.p2align 3
-.L576:
-	.loc 1 1131 0
+.L640:
+	.loc 1 1567 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
-	bl	flip.isra.7
-.LVL510:
-	.loc 1 1132 0
+	bl	flip.isra.11
+.LVL587:
+	.loc 1 1568 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
@@ -6033,69 +7129,69 @@ ebc_auto_tast_function:
 	ldr	x3, [x19, 168]
 	ldr	x0, [x0, 184]
 	bl	get_auto_image
-.LVL511:
-	.loc 1 1137 0
-	b	.L578
+.LVL588:
+	.loc 1 1573 0
+	b	.L642
 	.p2align 3
-.L575:
-	.loc 1 1148 0
+.L639:
+	.loc 1 1584 0
 	ldr	w1, [x19, 56]
-	.loc 1 1149 0
+	.loc 1 1585 0
 	mov	x0, x21
-	.loc 1 1148 0
+	.loc 1 1584 0
 	sub	w1, w1, #1
 	str	w1, [x19, 56]
-	.loc 1 1149 0
+	.loc 1 1585 0
 	ldr	w1, [x22, 208]
-	bl	flip.isra.7
-.LVL512:
-	.loc 1 1150 0
+	bl	flip.isra.11
+.LVL589:
+	.loc 1 1586 0
 	ldr	w0, [x19, 56]
-	cbz	w0, .L578
-	.loc 1 1152 0
+	cbz	w0, .L642
+	.loc 1 1588 0
 	ldrsw	x0, [x21, 72]
 	mov	x3, x19
-	.loc 1 1153 0
+	.loc 1 1589 0
 	ldp	x2, x1, [x19, 216]
-	.loc 1 1152 0
+	.loc 1 1588 0
 	add	x0, x19, x0, lsl 3
 	ldr	x1, [x1, 16]
 	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part
-.LVL513:
-	.loc 1 1156 0
-	b	.L578
+.LVL590:
+	.loc 1 1592 0
+	b	.L642
 	.p2align 3
-.L598:
-	.loc 1 1173 0 discriminator 1
+.L662:
+	.loc 1 1632 0 discriminator 1
 	ldr	w0, [x19, 628]
-	cbz	w0, .L582
-	.loc 1 1173 0 is_stmt 0 discriminator 2
+	cbz	w0, .L646
+	.loc 1 1632 0 is_stmt 0 discriminator 2
 	ldr	w0, [x19, 632]
-	cbz	w0, .L582
-.LBB1407:
-.LBB1406:
+	cbz	w0, .L646
+.LBB1480:
+.LBB1479:
 	.loc 13 518 0 is_stmt 1
 	ldr	x1, [x19, 608]
 	mov	x2, x25
 	mov	w0, 8
 	bl	queue_work_on
-.LVL514:
-	b	.L582
-.LBE1406:
-.LBE1407:
+.LVL591:
+	b	.L646
+.LBE1479:
+.LBE1480:
 	.cfi_endproc
-.LFE2823:
+.LFE2830:
 	.size	ebc_auto_tast_function, .-ebc_auto_tast_function
 	.align	2
 	.p2align 3,,7
-	.type	ebc_power_set.part.8, %function
-ebc_power_set.part.8:
-.LFB2866:
+	.type	ebc_power_set.part.12, %function
+ebc_power_set.part.12:
+.LFB2877:
 	.loc 1 183 0
 	.cfi_startproc
-.LVL515:
+.LVL592:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -6111,41 +7207,41 @@ ebc_power_set.part.8:
 	str	w1, [x0, 384]
 	.loc 1 201 0
 	ldr	x1, [x0, 8]
-.LVL516:
-.LBB1408:
-.LBB1409:
+.LVL593:
+.LBB1481:
+.LBB1482:
 	.loc 11 51 0
 	mov	x0, x1
-.LVL517:
+.LVL594:
 	ldr	x1, [x1, 56]
 	blr	x1
-.LVL518:
-.LBE1409:
-.LBE1408:
+.LVL595:
+.LBE1482:
+.LBE1481:
 	.loc 1 202 0
 	ldr	x2, [x19, 16]
-.LBB1410:
-.LBB1411:
+.LBB1483:
+.LBB1484:
 	.loc 3 35 0
 	mov	w1, 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL519:
-.LBE1411:
-.LBE1410:
+.LVL596:
+.LBE1484:
+.LBE1483:
 	.loc 1 203 0
 	ldr	w0, [x19, 624]
-	cbnz	w0, .L606
+	cbnz	w0, .L670
 	.loc 1 207 0
 	ldr	x0, [x19]
-	adrp	x1, .LC23
-	add	x1, x1, :lo12:.LC23
+	adrp	x1, .LC22
+	add	x1, x1, :lo12:.LC22
 	bl	_dev_info
-.LVL520:
+.LVL597:
 	.loc 1 211 0
 	ldp	x19, x20, [sp, 16]
-.LVL521:
+.LVL598:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -6154,29 +7250,29 @@ ebc_power_set.part.8:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL522:
+.LVL599:
 	.p2align 3
-.L606:
+.L670:
 	.cfi_restore_state
 	.loc 1 204 0
 	str	wzr, [x19, 624]
-.LBB1412:
-.LBB1413:
+.LBB1485:
+.LBB1486:
 	.loc 4 68 0
 	add	x0, x19, 416
 	bl	__pm_relax
-.LVL523:
-.LBE1413:
-.LBE1412:
+.LVL600:
+.LBE1486:
+.LBE1485:
 	.loc 1 207 0
 	ldr	x0, [x19]
-	adrp	x1, .LC23
-	add	x1, x1, :lo12:.LC23
+	adrp	x1, .LC22
+	add	x1, x1, :lo12:.LC22
 	bl	_dev_info
-.LVL524:
+.LVL601:
 	.loc 1 211 0
 	ldp	x19, x20, [sp, 16]
-.LVL525:
+.LVL602:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -6185,16 +7281,16 @@ ebc_power_set.part.8:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2866:
-	.size	ebc_power_set.part.8, .-ebc_power_set.part.8
+.LFE2877:
+	.size	ebc_power_set.part.12, .-ebc_power_set.part.12
 	.align	2
 	.p2align 3,,7
 	.type	ebc_suspend, %function
 ebc_suspend:
-.LFB2854:
-	.loc 1 2577 0
+.LFB2861:
+	.loc 1 3043 0
 	.cfi_startproc
-.LVL526:
+.LVL603:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -6204,109 +7300,185 @@ ebc_suspend:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-.LBB1414:
-.LBB1415:
+.LBB1487:
+.LBB1488:
 	.loc 2 1181 0
 	ldr	x20, [x0, 184]
-.LBE1415:
-.LBE1414:
-	.loc 1 2581 0
+.LBE1488:
+.LBE1487:
+	.loc 1 3047 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 200]
-.LVL527:
+.LVL604:
 	cmp	w0, 1
-	beq	.L610
-.L608:
-	.loc 1 2585 0
+	beq	.L674
+.L672:
+	.loc 1 3051 0
 	mov	w0, 1
 	str	w0, [x19, 620]
-	.loc 1 2587 0
+	.loc 1 3053 0
 	ldr	x1, [x20, 16]
-.LBB1416:
-.LBB1417:
+.LBB1489:
+.LBB1490:
 	.loc 3 40 0
 	mov	x0, x1
 	ldr	x1, [x1, 40]
 	blr	x1
-.LVL528:
-.LBE1417:
-.LBE1416:
-	.loc 1 2588 0
+.LVL605:
+.LBE1490:
+.LBE1489:
+	.loc 1 3054 0
 	ldr	x0, [x19, 104]
-	adrp	x1, .LC25
-	add	x1, x1, :lo12:.LC25
+	adrp	x1, .LC24
+	add	x1, x1, :lo12:.LC24
 	bl	_dev_info
-.LVL529:
-	.loc 1 2591 0
+.LVL606:
+	.loc 1 3057 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
+.L674:
+	.cfi_restore_state
+	.loc 1 3048 0
+	ldr	x0, [x19, 104]
+	adrp	x2, .LANCHOR3
+	add	x2, x2, :lo12:.LANCHOR3
+	adrp	x1, .LC23
+	add	x2, x2, 16
+	add	x1, x1, :lo12:.LC23
+	bl	_dev_info
+.LVL607:
+.LBB1491:
+.LBB1492:
+	mov	w1, 0
+	mov	x0, x20
+	bl	ebc_power_set.part.12
+.LVL608:
+	b	.L672
+.LBE1492:
+.LBE1491:
+	.cfi_endproc
+.LFE2861:
+	.size	ebc_suspend, .-ebc_suspend
+	.align	2
+	.p2align 3,,7
+	.type	check_black_percent.isra.14, %function
+check_black_percent.isra.14:
+.LFB2879:
+	.loc 1 1776 0
+	.cfi_startproc
+	.loc 1 1786 0
+	cmp	w1, 32
+	lsl	w3, w2, 1
+	csel	w2, w3, w2, eq
+	.loc 1 1790 0
+	mov	w1, 26215
+	movk	w1, 0x6666, lsl 16
+	.loc 1 1791 0
+	cmp	w2, 0
+	add	w5, w2, 7
+	.loc 1 1790 0
+	smull	x4, w2, w1
+	.loc 1 1791 0
+	csel	w5, w5, w2, lt
+	asr	w5, w5, 3
+	cmp	w5, 0
+	.loc 1 1790 0
+	asr	x4, x4, 34
+	sub	w4, w4, w2, asr 31
+.LVL609:
+	.loc 1 1791 0
+	ble	.L677
+	mov	x1, 0
+	mov	w2, 0
+.LVL610:
+	b	.L680
+	.p2align 3
+.L688:
+	cmp	w5, w1
+	ble	.L677
+.L680:
+	.loc 1 1793 0
+	ldr	x3, [x0, x1, lsl 3]
+	add	x1, x1, 1
+	.loc 1 1794 0
+	cmp	x3, 0
+	cinc	w2, w2, ne
+	.loc 1 1795 0
+	cmp	w4, w2, lsl 3
+	bge	.L688
+	.loc 1 1796 0
 	mov	w0, 0
-	ldp	x19, x20, [sp, 16]
-	ldp	x29, x30, [sp], 32
-	.cfi_remember_state
+	ret
+.L677:
+	.loc 1 1776 0
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	.loc 1 1799 0
+	adrp	x0, .LC25
+	add	x0, x0, :lo12:.LC25
+	.loc 1 1776 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 1799 0
+	bl	printk
+.LVL611:
+	.loc 1 1801 0
+	mov	w0, 1
+	.loc 1 1802 0
+	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
-	.cfi_restore 19
-	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-	.p2align 3
-.L610:
-	.cfi_restore_state
-	.loc 1 2582 0
-	ldr	x0, [x19, 104]
-	adrp	x2, .LANCHOR3
-	add	x2, x2, :lo12:.LANCHOR3
-	adrp	x1, .LC24
-	add	x2, x2, 16
-	add	x1, x1, :lo12:.LC24
-	bl	_dev_info
-.LVL530:
-.LBB1418:
-.LBB1419:
-	mov	w1, 0
-	mov	x0, x20
-	bl	ebc_power_set.part.8
-.LVL531:
-	b	.L608
-.LBE1419:
-.LBE1418:
 	.cfi_endproc
-.LFE2854:
-	.size	ebc_suspend, .-ebc_suspend
+.LFE2879:
+	.size	check_black_percent.isra.14, .-check_black_percent.isra.14
 	.align	2
 	.p2align 3,,7
 	.type	ebc_probe, %function
 ebc_probe:
-.LFB2852:
-	.loc 1 2441 0
+.LFB2859:
+	.loc 1 2907 0
 	.cfi_startproc
-.LVL532:
+.LVL612:
 	stp	x29, x30, [sp, -208]!
 	.cfi_def_cfa_offset 208
 	.cfi_offset 29, -208
 	.cfi_offset 30, -200
-.LBB1570:
-.LBB1571:
+.LBB1637:
+.LBB1638:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
-.LBE1571:
-.LBE1570:
-	.loc 1 2441 0
+.LBE1638:
+.LBE1637:
+	.loc 1 2907 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 2442 0
+	.loc 1 2908 0
 	add	x22, x0, 16
-	.loc 1 2441 0
+	.loc 1 2907 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
-.LVL533:
+.LVL613:
 	stp	x25, x26, [sp, 64]
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 19, -192
@@ -6315,148 +7487,148 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 2441 0
+	.loc 1 2907 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
-.LBB1573:
-.LBB1572:
+.LBB1640:
+.LBB1639:
 	.loc 2 711 0
 	mov	x0, x22
 	mov	x1, 824
 	bl	devm_kmalloc
-.LVL534:
-.LBE1572:
-.LBE1573:
-	.loc 1 2457 0
-	cbz	x0, .L661
-	.loc 1 2461 0
+.LVL614:
+.LBE1639:
+.LBE1640:
+	.loc 1 2923 0
+	cbz	x0, .L739
+	.loc 1 2927 0
 	adrp	x24, .LANCHOR0
 	mov	x20, x0
-	.loc 1 2463 0
+	.loc 1 2929 0
 	adrp	x1, .LC26
 	mov	w2, 0
-	.loc 1 2461 0
+	.loc 1 2927 0
 	str	x0, [x24, #:lo12:.LANCHOR0]
-	.loc 1 2463 0
+	.loc 1 2929 0
 	add	x1, x1, :lo12:.LC26
 	ldr	x0, [x22, 752]
-	.loc 1 2460 0
+	.loc 1 2926 0
 	str	x22, [x20]
-	.loc 1 2463 0
+	.loc 1 2929 0
 	bl	of_parse_phandle
-.LVL535:
-	.loc 1 2464 0
-	cbz	x0, .L706
-	.loc 1 2469 0
+.LVL615:
+	.loc 1 2930 0
+	cbz	x0, .L775
+	.loc 1 2935 0
 	bl	of_find_device_by_node
-.LVL536:
-	.loc 1 2471 0
-	cbz	x0, .L615
-.LBB1574:
-.LBB1575:
-.LBB1576:
+.LVL616:
+	.loc 1 2937 0
+	cbz	x0, .L693
+.LBB1641:
+.LBB1642:
+.LBB1643:
 	.loc 2 1181 0
 	ldr	x0, [x0, 200]
-.LVL537:
-.LBE1576:
-.LBE1575:
-.LBE1574:
-	.loc 1 2474 0
+.LVL617:
+.LBE1643:
+.LBE1642:
+.LBE1641:
+	.loc 1 2940 0
 	str	x0, [x20, 8]
-	.loc 1 2475 0
-	cbz	x0, .L615
-	.loc 1 2477 0
+	.loc 1 2941 0
+	cbz	x0, .L693
+	.loc 1 2943 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 2479 0
+	.loc 1 2945 0
 	add	x2, x29, 96
 	adrp	x1, .LC28
 	add	x1, x1, :lo12:.LC28
 	ldr	x0, [x22, 752]
 	bl	of_get_property
-.LVL538:
+.LVL618:
 	mov	x21, x0
-.LVL539:
-	.loc 1 2480 0
+.LVL619:
+	.loc 1 2946 0
 	ldrsw	x0, [x29, 96]
-.LVL540:
+.LVL620:
 	lsr	x0, x0, 2
-.LVL541:
+.LVL621:
 	str	w0, [x29, 96]
-.LVL542:
-	.loc 1 2481 0
+.LVL622:
+	.loc 1 2947 0
 	cmp	w0, 0
-	beq	.L616
-	.loc 1 2486 0 discriminator 1
+	beq	.L694
+	.loc 1 2952 0 discriminator 1
 	mov	w19, 0
-.LVL543:
-	bgt	.L690
-	b	.L618
+.LVL623:
+	bgt	.L762
+	b	.L696
 	.p2align 3
-.L619:
-	.loc 1 2494 0
+.L697:
+	.loc 1 2960 0
 	bl	of_find_i2c_device_by_node
-.LVL544:
-	.loc 1 2496 0
-	cbz	x0, .L707
-.LBB1577:
-.LBB1578:
-.LBB1579:
+.LVL624:
+	.loc 1 2962 0
+	cbz	x0, .L776
+.LBB1644:
+.LBB1645:
+.LBB1646:
 	.loc 2 1181 0
 	ldr	x0, [x0, 216]
-.LVL545:
-.LBE1579:
-.LBE1578:
-.LBE1577:
-	.loc 1 2501 0
+.LVL625:
+.LBE1646:
+.LBE1645:
+.LBE1644:
+	.loc 1 2967 0
 	str	x0, [x20, 16]
-	.loc 1 2502 0
-	cbnz	x0, .L708
-	.loc 1 2486 0 discriminator 2
+	.loc 1 2968 0
+	cbnz	x0, .L777
+	.loc 1 2952 0 discriminator 2
 	ldr	w0, [x29, 96]
 	add	w19, w19, 1
-.LVL546:
+.LVL626:
 	cmp	w0, w19
-	ble	.L623
-.L690:
+	ble	.L701
+.L762:
 	ldr	w0, [x21], 4
-	.loc 1 2488 0
+	.loc 1 2954 0
 	rev	w0, w0
 	bl	of_find_node_by_phandle
-.LVL547:
-	.loc 1 2489 0
-	cbnz	x0, .L619
-	.loc 1 2490 0
+.LVL627:
+	.loc 1 2955 0
+	cbnz	x0, .L697
+	.loc 1 2956 0
 	adrp	x1, .LC30
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC30
-	.loc 1 2491 0
+	.loc 1 2957 0
 	mov	w25, -19
-	.loc 1 2490 0
+	.loc 1 2956 0
 	bl	_dev_err
-.LVL548:
+.LVL628:
 	.p2align 2
-.L611:
-	.loc 1 2567 0
+.L689:
+	.loc 1 3033 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w25
-.LVL549:
+.LVL629:
 	ldr	x2, [x29, 200]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L709
+	cbnz	x1, .L778
 	ldp	x19, x20, [sp, 16]
-.LVL550:
+.LVL630:
 	ldp	x21, x22, [sp, 32]
-.LVL551:
+.LVL631:
 	ldp	x23, x24, [sp, 48]
-.LVL552:
+.LVL632:
 	ldp	x25, x26, [sp, 64]
-.LVL553:
+.LVL633:
 	ldp	x27, x28, [sp, 80]
-.LVL554:
+.LVL634:
 	ldp	x29, x30, [sp], 208
 	.cfi_remember_state
 	.cfi_restore 30
@@ -6473,91 +7645,91 @@ ebc_probe:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL555:
+.LVL635:
 	.p2align 3
-.L708:
+.L777:
 	.cfi_restore_state
-	.loc 1 2503 0
+	.loc 1 2969 0
 	adrp	x1, .LC32
 	mov	w2, w19
 	add	x1, x1, :lo12:.LC32
 	mov	x0, x22
 	bl	_dev_info
-.LVL556:
-.L618:
-	.loc 1 2508 0
+.LVL636:
+.L696:
+	.loc 1 2974 0
 	ldr	x0, [x20, 16]
-	cbz	x0, .L623
-	.loc 1 2514 0
+	cbz	x0, .L701
+	.loc 1 2980 0
 	add	x19, x20, 184
-.LVL557:
-	.loc 1 2516 0
+.LVL637:
+	.loc 1 2982 0
 	add	x21, x20, 24
-.LVL558:
-	.loc 1 2514 0
+.LVL638:
+	.loc 1 2980 0
 	str	x22, [x19, 104]
-.LBB1580:
-.LBB1581:
-.LBB1582:
-.LBB1583:
-.LBB1584:
+.LBB1647:
+.LBB1648:
+.LBB1649:
+.LBB1650:
+.LBB1651:
 	.file 14 "./include/linux/of.h"
 	.loc 14 499 0
 	adrp	x1, .LC34
-.LBE1584:
-.LBE1583:
-.LBE1582:
-.LBE1581:
-.LBE1580:
-	.loc 1 2516 0
-	str	x22, [x20, 24]
-.LBB1654:
-.LBB1651:
-.LBB1591:
-.LBB1588:
-.LBB1585:
-	.loc 14 499 0
-	mov	x4, 0
-.LBE1585:
-.LBE1588:
-.LBE1591:
 .LBE1651:
-.LBE1654:
-	.loc 1 2517 0
-	ldr	x2, [x20, 8]
+.LBE1650:
+.LBE1649:
+.LBE1648:
+.LBE1647:
+	.loc 1 2982 0
+	str	x22, [x20, 24]
+.LBB1721:
+.LBB1718:
+.LBB1658:
 .LBB1655:
 .LBB1652:
-.LBB1592:
-.LBB1589:
-.LBB1586:
 	.loc 14 499 0
-	add	x1, x1, :lo12:.LC34
-.LBE1586:
-.LBE1589:
-.LBE1592:
+	mov	x4, 0
 .LBE1652:
 .LBE1655:
-	.loc 1 2518 0
-	stp	x2, x0, [x21, 8]
+.LBE1658:
+.LBE1718:
+.LBE1721:
+	.loc 1 2983 0
+	ldr	x2, [x20, 8]
+.LBB1722:
+.LBB1719:
+.LBB1659:
 .LBB1656:
 .LBB1653:
-.LBB1593:
-.LBB1590:
-.LBB1587:
+	.loc 14 499 0
+	add	x1, x1, :lo12:.LC34
+.LBE1653:
+.LBE1656:
+.LBE1659:
+.LBE1719:
+.LBE1722:
+	.loc 1 2984 0
+	stp	x2, x0, [x21, 8]
+.LBB1723:
+.LBB1720:
+.LBB1660:
+.LBB1657:
+.LBB1654:
 	.loc 14 499 0
 	mov	x3, 1
 	ldr	x0, [x22, 752]
 	add	x2, x20, 100
 	bl	of_property_read_variable_u32_array
-.LVL559:
+.LVL639:
 	.loc 14 501 0
-	tbnz	w0, #31, .L625
-.LBE1587:
-.LBE1590:
-.LBE1593:
-.LBB1594:
-.LBB1595:
-.LBB1596:
+	tbnz	w0, #31, .L703
+.LBE1654:
+.LBE1657:
+.LBE1660:
+.LBB1661:
+.LBB1662:
+.LBB1663:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC58
@@ -6566,15 +7738,15 @@ ebc_probe:
 	add	x2, x20, 104
 	add	x1, x1, :lo12:.LC58
 	bl	of_property_read_variable_u32_array
-.LVL560:
+.LVL640:
 	.loc 14 501 0
-	tbnz	w0, #31, .L625
-.LBE1596:
-.LBE1595:
-.LBE1594:
-.LBB1597:
-.LBB1598:
-.LBB1599:
+	tbnz	w0, #31, .L703
+.LBE1663:
+.LBE1662:
+.LBE1661:
+.LBB1664:
+.LBB1665:
+.LBB1666:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC59
@@ -6583,15 +7755,15 @@ ebc_probe:
 	add	x2, x20, 108
 	add	x1, x1, :lo12:.LC59
 	bl	of_property_read_variable_u32_array
-.LVL561:
+.LVL641:
 	.loc 14 501 0
-	tbnz	w0, #31, .L625
-.LBE1599:
-.LBE1598:
-.LBE1597:
-.LBB1600:
-.LBB1601:
-.LBB1602:
+	tbnz	w0, #31, .L703
+.LBE1666:
+.LBE1665:
+.LBE1664:
+.LBB1667:
+.LBB1668:
+.LBB1669:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC60
@@ -6600,15 +7772,15 @@ ebc_probe:
 	add	x2, x20, 112
 	add	x1, x1, :lo12:.LC60
 	bl	of_property_read_variable_u32_array
-.LVL562:
+.LVL642:
 	.loc 14 501 0
-	tbnz	w0, #31, .L625
-.LBE1602:
-.LBE1601:
-.LBE1600:
-.LBB1603:
-.LBB1604:
-.LBB1605:
+	tbnz	w0, #31, .L703
+.LBE1669:
+.LBE1668:
+.LBE1667:
+.LBB1670:
+.LBB1671:
+.LBB1672:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC61
@@ -6617,15 +7789,15 @@ ebc_probe:
 	add	x2, x20, 128
 	add	x1, x1, :lo12:.LC61
 	bl	of_property_read_variable_u32_array
-.LVL563:
+.LVL643:
 	.loc 14 501 0
-	tbnz	w0, #31, .L625
-.LBE1605:
-.LBE1604:
-.LBE1603:
-.LBB1606:
-.LBB1607:
-.LBB1608:
+	tbnz	w0, #31, .L703
+.LBE1672:
+.LBE1671:
+.LBE1670:
+.LBB1673:
+.LBB1674:
+.LBB1675:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC62
@@ -6634,15 +7806,15 @@ ebc_probe:
 	add	x2, x20, 132
 	add	x1, x1, :lo12:.LC62
 	bl	of_property_read_variable_u32_array
-.LVL564:
+.LVL644:
 	.loc 14 501 0
-	tbnz	w0, #31, .L625
-.LBE1608:
-.LBE1607:
-.LBE1606:
-.LBB1609:
-.LBB1610:
-.LBB1611:
+	tbnz	w0, #31, .L703
+.LBE1675:
+.LBE1674:
+.LBE1673:
+.LBB1676:
+.LBB1677:
+.LBB1678:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC63
@@ -6651,15 +7823,15 @@ ebc_probe:
 	add	x2, x20, 136
 	add	x1, x1, :lo12:.LC63
 	bl	of_property_read_variable_u32_array
-.LVL565:
+.LVL645:
 	.loc 14 501 0
-	tbnz	w0, #31, .L625
-.LBE1611:
-.LBE1610:
-.LBE1609:
-.LBB1612:
-.LBB1613:
-.LBB1614:
+	tbnz	w0, #31, .L703
+.LBE1678:
+.LBE1677:
+.LBE1676:
+.LBB1679:
+.LBB1680:
+.LBB1681:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC64
@@ -6668,15 +7840,15 @@ ebc_probe:
 	add	x2, x20, 140
 	add	x1, x1, :lo12:.LC64
 	bl	of_property_read_variable_u32_array
-.LVL566:
+.LVL646:
 	.loc 14 501 0
-	tbnz	w0, #31, .L625
-.LBE1614:
-.LBE1613:
-.LBE1612:
-.LBB1615:
-.LBB1616:
-.LBB1617:
+	tbnz	w0, #31, .L703
+.LBE1681:
+.LBE1680:
+.LBE1679:
+.LBB1682:
+.LBB1683:
+.LBB1684:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC65
@@ -6685,15 +7857,15 @@ ebc_probe:
 	add	x2, x20, 144
 	add	x1, x1, :lo12:.LC65
 	bl	of_property_read_variable_u32_array
-.LVL567:
+.LVL647:
 	.loc 14 501 0
-	tbnz	w0, #31, .L625
-.LBE1617:
-.LBE1616:
-.LBE1615:
-.LBB1618:
-.LBB1619:
-.LBB1620:
+	tbnz	w0, #31, .L703
+.LBE1684:
+.LBE1683:
+.LBE1682:
+.LBB1685:
+.LBB1686:
+.LBB1687:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC66
@@ -6702,15 +7874,15 @@ ebc_probe:
 	add	x2, x20, 148
 	add	x1, x1, :lo12:.LC66
 	bl	of_property_read_variable_u32_array
-.LVL568:
+.LVL648:
 	.loc 14 501 0
-	tbnz	w0, #31, .L625
-.LBE1620:
-.LBE1619:
-.LBE1618:
-.LBB1621:
-.LBB1622:
-.LBB1623:
+	tbnz	w0, #31, .L703
+.LBE1687:
+.LBE1686:
+.LBE1685:
+.LBB1688:
+.LBB1689:
+.LBB1690:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC67
@@ -6719,15 +7891,15 @@ ebc_probe:
 	add	x2, x20, 152
 	add	x1, x1, :lo12:.LC67
 	bl	of_property_read_variable_u32_array
-.LVL569:
+.LVL649:
 	.loc 14 501 0
-	tbnz	w0, #31, .L625
-.LBE1623:
-.LBE1622:
-.LBE1621:
-.LBB1624:
-.LBB1625:
-.LBB1626:
+	tbnz	w0, #31, .L703
+.LBE1690:
+.LBE1689:
+.LBE1688:
+.LBB1691:
+.LBB1692:
+.LBB1693:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC68
@@ -6736,15 +7908,15 @@ ebc_probe:
 	add	x2, x20, 156
 	add	x1, x1, :lo12:.LC68
 	bl	of_property_read_variable_u32_array
-.LVL570:
+.LVL650:
 	.loc 14 501 0
-	tbnz	w0, #31, .L625
-.LBE1626:
-.LBE1625:
-.LBE1624:
-.LBB1627:
-.LBB1628:
-.LBB1629:
+	tbnz	w0, #31, .L703
+.LBE1693:
+.LBE1692:
+.LBE1691:
+.LBB1694:
+.LBB1695:
+.LBB1696:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC69
@@ -6753,15 +7925,15 @@ ebc_probe:
 	add	x2, x20, 160
 	add	x1, x1, :lo12:.LC69
 	bl	of_property_read_variable_u32_array
-.LVL571:
+.LVL651:
 	.loc 14 501 0
-	tbnz	w0, #31, .L625
-.LBE1629:
-.LBE1628:
-.LBE1627:
-.LBB1630:
-.LBB1631:
-.LBB1632:
+	tbnz	w0, #31, .L703
+.LBE1696:
+.LBE1695:
+.LBE1694:
+.LBB1697:
+.LBB1698:
+.LBB1699:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC70
@@ -6770,15 +7942,15 @@ ebc_probe:
 	add	x2, x20, 164
 	add	x1, x1, :lo12:.LC70
 	bl	of_property_read_variable_u32_array
-.LVL572:
+.LVL652:
 	.loc 14 501 0
-	tbnz	w0, #31, .L625
-.LBE1632:
-.LBE1631:
-.LBE1630:
-.LBB1633:
-.LBB1634:
-.LBB1635:
+	tbnz	w0, #31, .L703
+.LBE1699:
+.LBE1698:
+.LBE1697:
+.LBB1700:
+.LBB1701:
+.LBB1702:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC71
@@ -6787,15 +7959,15 @@ ebc_probe:
 	add	x2, x20, 168
 	add	x1, x1, :lo12:.LC71
 	bl	of_property_read_variable_u32_array
-.LVL573:
+.LVL653:
 	.loc 14 501 0
-	tbnz	w0, #31, .L625
-.LBE1635:
-.LBE1634:
-.LBE1633:
-.LBB1636:
-.LBB1637:
-.LBB1638:
+	tbnz	w0, #31, .L703
+.LBE1702:
+.LBE1701:
+.LBE1700:
+.LBB1703:
+.LBB1704:
+.LBB1705:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC72
@@ -6804,18 +7976,18 @@ ebc_probe:
 	add	x2, x20, 172
 	add	x1, x1, :lo12:.LC72
 	bl	of_property_read_variable_u32_array
-.LVL574:
+.LVL654:
 	.loc 14 501 0
-	tbz	w0, #31, .L651
-.LBE1638:
-.LBE1637:
-.LBE1636:
-	.loc 1 1780 0
+	tbz	w0, #31, .L729
+.LBE1705:
+.LBE1704:
+.LBE1703:
+	.loc 1 2251 0
 	str	wzr, [x21, 148]
-.L651:
-.LBB1639:
-.LBB1640:
-.LBB1641:
+.L729:
+.LBB1706:
+.LBB1707:
+.LBB1708:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC35
@@ -6824,18 +7996,18 @@ ebc_probe:
 	add	x2, x20, 176
 	add	x1, x1, :lo12:.LC35
 	bl	of_property_read_variable_u32_array
-.LVL575:
+.LVL655:
 	.loc 14 501 0
-	tbz	w0, #31, .L652
-.LBE1641:
-.LBE1640:
-.LBE1639:
-	.loc 1 1783 0
+	tbz	w0, #31, .L730
+.LBE1708:
+.LBE1707:
+.LBE1706:
+	.loc 1 2254 0
 	str	wzr, [x21, 152]
-.L652:
-.LBB1642:
-.LBB1643:
-.LBB1644:
+.L730:
+.LBB1709:
+.LBB1710:
+.LBB1711:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC36
@@ -6844,18 +8016,18 @@ ebc_probe:
 	add	x2, x20, 180
 	add	x1, x1, :lo12:.LC36
 	bl	of_property_read_variable_u32_array
-.LVL576:
+.LVL656:
 	.loc 14 501 0
-	tbz	w0, #31, .L653
-.LBE1644:
-.LBE1643:
-.LBE1642:
-	.loc 1 1786 0
+	tbz	w0, #31, .L731
+.LBE1711:
+.LBE1710:
+.LBE1709:
+	.loc 1 2257 0
 	str	wzr, [x21, 156]
-.L653:
-.LBB1645:
-.LBB1646:
-.LBB1647:
+.L731:
+.LBB1712:
+.LBB1713:
+.LBB1714:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC37
@@ -6864,18 +8036,18 @@ ebc_probe:
 	add	x2, x20, 116
 	add	x1, x1, :lo12:.LC37
 	bl	of_property_read_variable_u32_array
-.LVL577:
+.LVL657:
 	.loc 14 501 0
-	tbz	w0, #31, .L654
-.LBE1647:
-.LBE1646:
-.LBE1645:
-	.loc 1 1789 0
+	tbz	w0, #31, .L732
+.LBE1714:
+.LBE1713:
+.LBE1712:
+	.loc 1 2260 0
 	str	wzr, [x21, 92]
-.L654:
-.LBB1648:
-.LBB1649:
-.LBB1650:
+.L732:
+.LBB1715:
+.LBB1716:
+.LBB1717:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC38
@@ -6884,415 +8056,376 @@ ebc_probe:
 	add	x2, x20, 120
 	add	x1, x1, :lo12:.LC38
 	bl	of_property_read_variable_u32_array
-.LVL578:
+.LVL658:
 	.loc 14 501 0
-	tbz	w0, #31, .L655
-.LBE1650:
-.LBE1649:
-.LBE1648:
-	.loc 1 1792 0
+	tbz	w0, #31, .L733
+.LBE1717:
+.LBE1716:
+.LBE1715:
+	.loc 1 2263 0
 	str	wzr, [x21, 96]
-.L655:
-.LBE1653:
-.LBE1656:
-	.loc 1 2526 0
+.L733:
+.LBE1720:
+.LBE1723:
+	.loc 1 2992 0
 	ldr	w0, [x21, 88]
-.LBB1657:
-.LBB1658:
-	.loc 1 2241 0
+.LBB1724:
+.LBB1725:
+	.loc 1 2715 0
 	mov	w2, 0
-.LBE1658:
-.LBE1657:
-	.loc 1 2526 0
+.LBE1725:
+.LBE1724:
+	.loc 1 2992 0
 	str	w0, [x19, 68]
-	.loc 1 2527 0
+	.loc 1 2993 0
 	ldr	w1, [x21, 84]
 	str	w1, [x19, 72]
-	.loc 1 2530 0
+	.loc 1 2996 0
 	tst	x1, 15
-	.loc 1 2528 0
+	.loc 1 2994 0
 	mul	w0, w0, w1
-	.loc 1 2530 0
+	.loc 1 2996 0
 	cset	w1, eq
 	str	w1, [x19, 88]
-.LBB1682:
-.LBB1677:
-	.loc 1 2241 0
+.LBB1739:
+.LBB1734:
+	.loc 1 2715 0
 	adrp	x1, .LC39
 	add	x1, x1, :lo12:.LC39
-.LBE1677:
-.LBE1682:
-	.loc 1 2528 0
+.LBE1734:
+.LBE1739:
+	.loc 1 2994 0
 	lsr	w3, w0, 1
-	.loc 1 2529 0
+	.loc 1 2995 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x19, 20]
-.LBB1683:
-.LBB1678:
-	.loc 1 2232 0
+.LBB1740:
+.LBB1735:
+	.loc 1 2706 0
 	ldr	x26, [x20]
-.LVL579:
-	.loc 1 2241 0
+.LVL659:
+	.loc 1 2715 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL580:
-	.loc 1 2242 0
-	cbz	x0, .L662
-	.loc 1 2245 0
+.LVL660:
+	.loc 1 2716 0
+	cbz	x0, .L740
+	.loc 1 2719 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL581:
+.LVL661:
 	mov	w25, w0
-	.loc 1 2247 0
-	cbnz	w0, .L710
-.LBB1659:
-.LBB1660:
+	.loc 1 2721 0
+	cbnz	w0, .L779
+.LBB1726:
+.LBB1727:
 	.file 15 "./include/linux/ioport.h"
 	.loc 15 204 0
 	ldp	x1, x2, [x29, 104]
-.LBE1660:
-.LBE1659:
-	.loc 1 2252 0
+.LBE1727:
+.LBE1726:
+	.loc 1 2726 0
 	str	x1, [x20, 184]
-	.loc 1 2255 0
+	.loc 1 2729 0
 	mov	x3, 1
 	mov	x0, x26
-.LBB1662:
-.LBB1661:
+.LBB1729:
+.LBB1728:
 	.loc 15 204 0
 	add	x2, x2, 1
 	sub	x2, x2, x1
-.LBE1661:
-.LBE1662:
-	.loc 1 2253 0
+.LBE1728:
+.LBE1729:
+	.loc 1 2727 0
 	str	w2, [x19, 16]
-	.loc 1 2255 0
+	.loc 1 2729 0
 	sxtw	x2, w2
 	bl	devm_memremap
-.LVL582:
+.LVL662:
 	str	x0, [x19, 8]
-	.loc 1 2257 0
-	cbz	x0, .L633
-	.loc 1 2265 0
+	.loc 1 2731 0
+	cbz	x0, .L711
+	.loc 1 2739 0
 	mov	x1, x0
 	ldr	w2, [x19, 16]
 	ldr	x0, [x20, 184]
 	mov	w4, 4
-	mov	w3, 2097152
+	mov	w3, 4194304
 	bl	ebc_buf_init
-.LVL583:
-	.loc 1 2266 0
-	cbnz	w0, .L633
-	.loc 1 2271 0
-	ldr	x0, [x19, 8]
-	.loc 1 2272 0
-	mov	x5, 1048576
-	str	x5, [x21, 40]
-.LBB1663:
-.LBB1664:
-	.loc 2 711 0
-	mov	w2, 32960
-.LBE1664:
-.LBE1663:
-	.loc 1 2271 0
-	add	x6, x0, 10485760
-	str	x6, [x21, 24]
-	add	x4, x0, 11534336
-	.loc 1 2277 0
-	add	x1, x0, 12582912
-	.loc 1 2273 0
-	ldr	x3, [x20, 184]
-.LBB1668:
-.LBB1665:
+.LVL663:
+	.loc 1 2740 0
+	cbnz	w0, .L711
+	.loc 1 2745 0
+	ldr	x1, [x19, 8]
+	.loc 1 2746 0
+	mov	x6, 1048576
+	.loc 1 2745 0
+	mov	x3, 20971520
+	.loc 1 2746 0
+	str	x6, [x21, 40]
+	.loc 1 2745 0
+	add	x8, x1, x3
+	str	x8, [x21, 24]
+	mov	x7, 22020096
+	add	x5, x1, x7
+	.loc 1 2747 0
+	ldr	x2, [x20, 184]
+	.loc 1 2752 0
+	mov	x4, 23068672
+	add	x4, x1, x4
+.LBB1730:
+.LBB1731:
 	.loc 2 711 0
-	movk	w2, 0x60, lsl 16
 	mov	x0, x26
-.LBE1665:
-.LBE1668:
-	.loc 1 2273 0
-	add	x7, x3, 10485760
-	str	x7, [x21, 32]
-	.loc 1 2274 0
-	str	x6, [x19, 184]
-	.loc 1 2273 0
-	add	x3, x3, 11534336
-	.loc 1 2272 0
-	str	x5, [x21, 64]
-	.loc 1 2273 0
-	stp	x4, x3, [x21, 48]
-	.loc 1 2277 0
+.LBE1731:
+.LBE1730:
+	.loc 1 2747 0
+	add	x3, x2, x3
+	str	x3, [x21, 32]
+	.loc 1 2748 0
+	str	x8, [x19, 184]
+	.loc 1 2747 0
+	add	x2, x2, x7
+	.loc 1 2746 0
+	str	x6, [x21, 64]
+	.loc 1 2747 0
+	stp	x5, x2, [x21, 48]
+	.loc 1 2753 0
+	mov	x2, 27262976
+	add	x2, x1, x2
+	stp	x4, x2, [x19, 144]
+	.loc 1 2754 0
+	mov	x2, 31457280
+	add	x2, x1, x2
+	.loc 1 2748 0
+	str	x5, [x19, 192]
+	.loc 1 2754 0
+	str	x2, [x19, 160]
+	.loc 1 2755 0
+	mov	x2, 35651584
+	add	x1, x1, x2
 	str	x1, [x19, 128]
-.LBB1669:
-.LBB1666:
-	.loc 2 711 0
-	ldrsw	x1, [x19, 20]
-.LBE1666:
-.LBE1669:
-	.loc 1 2274 0
-	str	x4, [x19, 192]
-.LBB1670:
-.LBB1667:
-	.loc 2 711 0
-	bl	devm_kmalloc
-.LVL584:
-.LBE1667:
-.LBE1670:
-	.loc 1 2280 0
-	str	x0, [x19, 144]
-	.loc 1 2281 0
-	cbz	x0, .L633
-.LBB1671:
-.LBB1672:
-	.loc 2 711 0
-	ldrsw	x1, [x19, 20]
-	mov	w2, 32960
-	movk	w2, 0x60, lsl 16
-	mov	x0, x26
-	bl	devm_kmalloc
-.LVL585:
-.LBE1672:
-.LBE1671:
-	.loc 1 2283 0
-	str	x0, [x19, 152]
-	.loc 1 2284 0
-	cbz	x0, .L633
-.LBB1673:
-.LBB1674:
-	.loc 2 711 0
-	ldrsw	x1, [x19, 20]
-	mov	w2, 32960
-	movk	w2, 0x60, lsl 16
-	mov	x0, x26
-	bl	devm_kmalloc
-.LVL586:
-.LBE1674:
-.LBE1673:
-	.loc 1 2286 0
-	str	x0, [x19, 160]
-	.loc 1 2287 0
-	cbz	x0, .L633
-	.loc 1 2294 0
-	ldp	w1, w0, [x21, 84]
-.LBB1675:
-.LBB1676:
+	.loc 1 2758 0
+	ldp	w2, w1, [x21, 84]
+.LBB1733:
+.LBB1732:
 	.loc 2 711 0
+	mul	w1, w2, w1
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
-	mul	w1, w1, w0
-	mov	x0, x26
 	bl	devm_kmalloc
-.LVL587:
-.LBE1676:
-.LBE1675:
-	.loc 1 2294 0
+.LVL664:
+.LBE1732:
+.LBE1733:
+	.loc 1 2758 0
 	str	x0, [x19, 168]
-	.loc 1 2295 0
-	cbz	x0, .L633
-	.loc 1 2297 0
+	.loc 1 2759 0
+	cbz	x0, .L711
+	.loc 1 2761 0
 	ldp	w2, w1, [x21, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
-.LVL588:
-	.loc 1 2298 0
+.LVL665:
+	.loc 1 2762 0
 	ldrsw	x2, [x19, 20]
 	mov	w1, 255
 	ldr	x0, [x19, 160]
 	bl	memset
-.LVL589:
-.LBE1678:
-.LBE1683:
-.LBB1684:
-.LBB1685:
-	.loc 1 2189 0
+.LVL666:
+.LBE1735:
+.LBE1740:
+.LBB1741:
+.LBB1742:
+	.loc 1 2663 0
 	ldr	x26, [x19, 104]
-.LVL590:
-	.loc 1 2195 0
+.LVL667:
+	.loc 1 2669 0
 	adrp	x1, .LC41
 	mov	w2, 0
 	add	x1, x1, :lo12:.LC41
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL591:
-	.loc 1 2196 0
-	cbz	x0, .L663
-	.loc 1 2199 0
+.LVL668:
+	.loc 1 2670 0
+	cbz	x0, .L741
+	.loc 1 2673 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL592:
+.LVL669:
 	mov	w25, w0
-	.loc 1 2201 0
-	cbz	w0, .L711
-.L634:
-.LBE1685:
-.LBE1684:
-	.loc 1 2542 0
+	.loc 1 2675 0
+	cbz	w0, .L780
+.L712:
+.LBE1742:
+.LBE1741:
+	.loc 1 3008 0
 	adrp	x1, .LC74
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC74
 	bl	_dev_err
-.LVL593:
-	.loc 1 2543 0
-	b	.L611
-.LVL594:
+.LVL670:
+	.loc 1 3009 0
+	b	.L689
+.LVL671:
 	.p2align 3
-.L625:
-	.loc 1 2524 0
+.L703:
+	.loc 1 2990 0
 	mov	w25, -22
-	.loc 1 2523 0
+	.loc 1 2989 0
 	adrp	x1, .LC80
 	mov	w2, w25
 	add	x1, x1, :lo12:.LC80
 	mov	x0, x22
 	bl	_dev_err
-.LVL595:
-	.loc 1 2524 0
-	b	.L611
-.LVL596:
+.LVL672:
+	.loc 1 2990 0
+	b	.L689
+.LVL673:
 	.p2align 3
-.L707:
-	.loc 1 2497 0
+.L776:
+	.loc 1 2963 0
 	adrp	x1, .LC31
 	mov	x0, x22
-.LVL597:
+.LVL674:
 	add	x1, x1, :lo12:.LC31
-	.loc 1 2498 0
+	.loc 1 2964 0
 	mov	w25, -19
-	.loc 1 2497 0
+	.loc 1 2963 0
 	bl	_dev_err
-.LVL598:
-	.loc 1 2498 0
-	b	.L611
-.LVL599:
+.LVL675:
+	.loc 1 2964 0
+	b	.L689
+.LVL676:
 	.p2align 3
-.L623:
-	.loc 1 2509 0
+.L701:
+	.loc 1 2975 0
 	adrp	x1, .LC33
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC33
-	.loc 1 2510 0
+	.loc 1 2976 0
 	mov	w25, -517
-	.loc 1 2509 0
+	.loc 1 2975 0
 	bl	_dev_err
-.LVL600:
-	.loc 1 2510 0
-	b	.L611
-.LVL601:
+.LVL677:
+	.loc 1 2976 0
+	b	.L689
+.LVL678:
 	.p2align 3
-.L710:
-.LBB1694:
-.LBB1679:
-	.loc 1 2248 0
+.L779:
+.LBB1750:
+.LBB1736:
+	.loc 1 2722 0
 	adrp	x1, .LC40
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC40
 	bl	_dev_err
-.LVL602:
-.L630:
-.LBE1679:
-.LBE1694:
-	.loc 1 2535 0
+.LVL679:
+.L708:
+.LBE1736:
+.LBE1750:
+	.loc 1 3001 0
 	adrp	x1, .LC73
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC73
 	bl	_dev_err
-.LVL603:
-	.loc 1 2536 0
-	b	.L611
-.LVL604:
-.L711:
-.LBB1695:
-.LBB1690:
-	.loc 1 2210 0
+.LVL680:
+	.loc 1 3002 0
+	b	.L689
+.LVL681:
+.L780:
+.LBB1751:
+.LBB1747:
+	.loc 1 2684 0
 	mov	x0, x26
 	mov	x3, 1
-.LBB1686:
-.LBB1687:
+.LBB1743:
+.LBB1744:
 	.loc 15 204 0
 	ldp	x1, x26, [x29, 104]
-.LVL605:
-.LBE1687:
-.LBE1686:
-	.loc 1 2207 0
+.LVL682:
+.LBE1744:
+.LBE1743:
+	.loc 1 2681 0
 	str	x1, [x19, 32]
-.LBB1689:
-.LBB1688:
+.LBB1746:
+.LBB1745:
 	.loc 15 204 0
 	add	x26, x26, 1
 	sub	x26, x26, x1
-.LBE1688:
-.LBE1689:
-	.loc 1 2208 0
+.LBE1745:
+.LBE1746:
+	.loc 1 2682 0
 	str	w26, [x19, 40]
-	.loc 1 2210 0
+	.loc 1 2684 0
 	sxtw	x2, w26
 	bl	devm_memremap
-.LVL606:
+.LVL683:
 	str	x0, [x19, 208]
-	.loc 1 2212 0
-	cbz	x0, .L712
-	.loc 1 2217 0
+	.loc 1 2686 0
+	cbz	x0, .L781
+	.loc 1 2691 0
 	bl	epd_lut_from_mem_init
-.LVL607:
-	.loc 1 2218 0
-	tbnz	w0, #31, .L713
-.L636:
-.LBE1690:
-.LBE1695:
-.LBB1696:
-.LBB1697:
-	.loc 1 2307 0
+.LVL684:
+	.loc 1 2692 0
+	tbnz	w0, #31, .L782
+.L714:
+.LBE1747:
+.LBE1751:
+.LBB1752:
+.LBB1753:
+	.loc 1 2771 0
 	add	x0, x20, 752
 	mov	x1, 68719476704
 	str	x1, [x19, 560]
-	.loc 1 2311 0
+	.loc 1 2775 0
 	add	x24, x24, :lo12:.LANCHOR0
-.LBB1698:
-.LBB1699:
-.LBB1700:
-.LBB1701:
-.LBB1702:
+.LBB1754:
+.LBB1755:
+.LBB1756:
+.LBB1757:
+.LBB1758:
 	.loc 12 288 0
 	str	x0, [x20, 752]
-.LBE1702:
-.LBE1701:
-.LBE1700:
-.LBE1699:
-.LBE1698:
-	.loc 1 2308 0
+.LBE1758:
+.LBE1757:
+.LBE1756:
+.LBE1755:
+.LBE1754:
+	.loc 1 2772 0
 	adrp	x5, .LC75
-.LBB1704:
-.LBB1703:
+.LBB1760:
+.LBB1759:
 	.file 16 "./include/linux/list.h"
 	.loc 16 29 0
 	str	x0, [x0, 8]
-.LBE1703:
-.LBE1704:
-	.loc 1 2307 0
+.LBE1759:
+.LBE1760:
+	.loc 1 2771 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x19, 584]
-	.loc 1 2308 0
+	.loc 1 2772 0
 	add	x5, x5, :lo12:.LC75
 	mov	w1, 14
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 1
 	movk	w1, 0xa, lsl 16
-	.loc 1 2305 0
+	.loc 1 2769 0
 	mov	w26, 99
-	.loc 1 2308 0
+	.loc 1 2772 0
 	adrp	x0, .LC76
-	.loc 1 2305 0
+	.loc 1 2769 0
 	str	w26, [x29, 104]
-	.loc 1 2308 0
+	.loc 1 2772 0
 	add	x0, x0, :lo12:.LC76
 	bl	__alloc_workqueue_key
-.LVL608:
+.LVL685:
 	str	x0, [x19, 608]
-	.loc 1 2311 0
+	.loc 1 2775 0
 	adrp	x3, .LC77
 	mov	w2, -1
 	add	x3, x3, :lo12:.LC77
@@ -7300,26 +8433,26 @@ ebc_probe:
 	adrp	x0, ebc_auto_tast_function
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
-.LVL609:
+.LVL686:
 	str	x0, [x24, 8]
-	.loc 1 2312 0
+	.loc 1 2776 0
 	cmn	x0, #4096
-	bhi	.L714
-	.loc 1 2316 0
+	bhi	.L783
+	.loc 1 2780 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
-.LVL610:
-	.loc 1 2317 0
+.LVL687:
+	.loc 1 2781 0
 	ldr	x2, [x24, 8]
-.LBB1705:
-.LBB1706:
+.LBB1761:
+.LBB1762:
 	.file 17 "./arch/arm64/include/asm/atomic_lse.h"
 	.loc 17 47 0
 	mov	w0, 1
-.LVL611:
+.LVL688:
 	add	x1, x2, 48
-.LVL612:
+.LVL689:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -7347,49 +8480,49 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL613:
+.LVL690:
 #NO_APP
-.LBE1706:
-.LBE1705:
-.LBB1707:
-	.loc 1 2320 0
+.LBE1762:
+.LBE1761:
+.LBB1763:
+	.loc 1 2784 0
 	adrp	x3, .LC46
 	adrp	x0, ebc_thread
-.LVL614:
+.LVL691:
 	add	x3, x3, :lo12:.LC46
 	mov	w2, -1
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x19
-.LBE1707:
-	.loc 1 2319 0
+.LBE1763:
+	.loc 1 2783 0
 	str	w26, [x29, 104]
-.LBB1708:
-	.loc 1 2320 0
+.LBB1764:
+	.loc 1 2784 0
 	bl	kthread_create_on_node
-.LVL615:
+.LVL692:
 	mov	x24, x0
-.LVL616:
+.LVL693:
 	cmn	x0, #4096
-	bhi	.L638
+	bhi	.L716
 	bl	wake_up_process
-.LVL617:
-.LBE1708:
+.LVL694:
+.LBE1764:
 	str	x24, [x19, 136]
-	.loc 1 2325 0
+	.loc 1 2789 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x24
 	bl	sched_setscheduler_nocheck
-.LVL618:
-	.loc 1 2326 0
+.LVL695:
+	.loc 1 2790 0
 	ldr	x2, [x19, 136]
-.LBB1709:
-.LBB1710:
+.LBB1765:
+.LBB1766:
 	.loc 17 47 0
 	mov	w0, 1
-.LVL619:
+.LVL696:
 	add	x1, x2, 48
-.LVL620:
+.LVL697:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -7417,62 +8550,62 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL621:
+.LVL698:
 #NO_APP
-.LBE1710:
-.LBE1709:
-.LBE1697:
-.LBE1696:
-.LBB1713:
-.LBB1714:
-	.loc 1 2335 0
+.LBE1766:
+.LBE1765:
+.LBE1753:
+.LBE1752:
+.LBB1769:
+.LBB1770:
+	.loc 1 2799 0
 	mov	w0, -1
-.LVL622:
+.LVL699:
 	str	w0, [x19, 64]
-.LBB1715:
-.LBB1716:
+.LBB1771:
+.LBB1772:
 	.loc 4 39 0
 	add	x0, x20, 416
-.LVL623:
-.LBE1716:
-.LBE1715:
-	.loc 1 2339 0
+.LVL700:
+.LBE1772:
+.LBE1771:
+	.loc 1 2803 0
 	str	wzr, [x19, 44]
-	.loc 1 2338 0
+	.loc 1 2802 0
 	str	wzr, [x19, 96]
-.LBB1721:
-.LBB1717:
+.LBB1777:
+.LBB1773:
 	.loc 4 43 0
 	adrp	x1, .LC47
-.LBE1717:
-.LBE1721:
-	.loc 1 2334 0
+.LBE1773:
+.LBE1777:
+	.loc 1 2798 0
 	str	wzr, [x19, 200]
-.LBB1722:
-.LBB1718:
+.LBB1778:
+.LBB1774:
 	.loc 4 43 0
 	add	x1, x1, :lo12:.LC47
-.LBE1718:
-.LBE1722:
-	.loc 1 2336 0
+.LBE1774:
+.LBE1778:
+	.loc 1 2800 0
 	str	wzr, [x19, 616]
-	.loc 1 2346 0
+	.loc 1 2810 0
 	add	x24, x20, 632
-.LVL624:
-	.loc 1 2337 0
+.LVL701:
+	.loc 1 2801 0
 	str	wzr, [x19, 620]
-	.loc 1 2347 0
+	.loc 1 2811 0
 	adrp	x26, jiffies
-.LBB1723:
-.LBB1719:
+.LBB1779:
+.LBB1775:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0]
-.LBE1719:
-.LBE1723:
-	.loc 1 2347 0
+.LBE1775:
+.LBE1779:
+	.loc 1 2811 0
 	mov	x27, 268435455
-.LBB1724:
-.LBB1720:
+.LBB1780:
+.LBB1776:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0, 16]
 	stp	xzr, xzr, [x0, 32]
@@ -7490,12 +8623,12 @@ ebc_probe:
 	str	x1, [x20, 416]
 	.loc 4 45 0
 	bl	wakeup_source_add
-.LVL625:
-.LBE1720:
-.LBE1724:
-	.loc 1 2343 0
+.LVL702:
+.LBE1776:
+.LBE1780:
+	.loc 1 2807 0
 	str	wzr, [x19, 440]
-	.loc 1 2346 0
+	.loc 1 2810 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -7503,17 +8636,17 @@ ebc_probe:
 	adrp	x1, ebc_vdd_power_timeout
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
-.LVL626:
-	.loc 1 2347 0
+.LVL703:
+	.loc 1 2811 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
-	.loc 1 2350 0
+	.loc 1 2814 0
 	add	x24, x20, 688
-	.loc 1 2347 0
+	.loc 1 2811 0
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL627:
-	.loc 1 2350 0
+.LVL704:
+	.loc 1 2814 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -7521,613 +8654,615 @@ ebc_probe:
 	adrp	x1, ebc_frame_timeout
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
-.LVL628:
-	.loc 1 2351 0
+.LVL705:
+	.loc 1 2815 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL629:
-.LBE1714:
-.LBE1713:
-.LBB1725:
-.LBB1726:
-	.loc 1 2361 0
+.LVL706:
+.LBE1770:
+.LBE1769:
+.LBB1781:
+.LBB1782:
+	.loc 1 2825 0
 	adrp	x0, saved_command_line
 	adrp	x1, .LC48
-	.loc 1 2358 0
+	.loc 1 2822 0
 	stp	wzr, wzr, [x29, 100]
-.LVL630:
-	.loc 1 2361 0
+.LVL707:
+	.loc 1 2825 0
 	add	x1, x1, :lo12:.LC48
 	ldr	x24, [x0, #:lo12:saved_command_line]
 	mov	x0, x24
 	bl	strstr
-.LVL631:
-	.loc 1 2362 0
+.LVL708:
+	.loc 1 2826 0
 	adrp	x1, .LC49
-	.loc 1 2361 0
+	.loc 1 2825 0
 	mov	x26, x0
-.LVL632:
-	.loc 1 2362 0
+.LVL709:
+	.loc 1 2826 0
 	add	x1, x1, :lo12:.LC49
 	mov	x0, x24
 	bl	strstr
-.LVL633:
+.LVL710:
 	mov	x28, x0
-.LVL634:
-	.loc 1 2367 0
-	cbz	x26, .L639
-	.loc 1 2368 0
+.LVL711:
+	.loc 1 2831 0
+	cbz	x26, .L717
+	.loc 1 2832 0
 	add	x2, x29, 100
 	adrp	x1, .LC50
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC50
 	bl	sscanf
-.LVL635:
-	.loc 1 2369 0
+.LVL712:
+	.loc 1 2833 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
-	bls	.L715
-.L639:
-	.loc 1 2381 0
+	bls	.L784
+.L717:
+	.loc 1 2845 0
 	mov	w24, 0
-.LVL636:
+.LVL713:
 	mov	x27, 0
-.LVL637:
-	.loc 1 2365 0
+.LVL714:
+	.loc 1 2829 0
 	mov	x26, 0
-.LVL638:
-	.loc 1 2381 0
-	cbz	x28, .L659
-.LVL639:
-.L658:
-	.loc 1 2382 0
+.LVL715:
+	.loc 1 2845 0
+	cbz	x28, .L737
+.LVL716:
+.L736:
+	.loc 1 2846 0
 	add	x2, x29, 104
 	mov	x0, x28
 	adrp	x1, .LC53
 	add	x1, x1, :lo12:.LC53
 	bl	sscanf
-.LVL640:
-	.loc 1 2360 0
+.LVL717:
+	.loc 1 2824 0
 	mov	w28, 0
-.LVL641:
-	.loc 1 2383 0
+.LVL718:
+	.loc 1 2847 0
 	ldr	w2, [x29, 104]
-	.loc 1 2365 0
+	.loc 1 2829 0
 	mov	x26, 0
-.LVL642:
-	.loc 1 2383 0
+.LVL719:
+	.loc 1 2847 0
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
-	bls	.L716
-.L643:
-	.loc 1 2395 0
-	cbnz	w24, .L642
-.LVL643:
-.L659:
-	.loc 1 2396 0
+	bls	.L785
+.L721:
+	.loc 1 2859 0
+	cbnz	w24, .L720
+.LVL720:
+.L737:
+	.loc 1 2860 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC56
 	add	x1, x1, :lo12:.LC56
 	bl	_dev_info
-.LVL644:
-	.loc 1 2397 0
+.LVL721:
+	.loc 1 2861 0
 	ldr	x0, [x20, 16]
 	bl	ebc_pmic_verity_vcom
-.LVL645:
-.LBB1727:
-.LBB1728:
-	.loc 1 1700 0
+.LVL722:
+.LBB1783:
+.LBB1784:
+	.loc 1 2170 0
 	bl	ebc_empty_buf_get
-.LVL646:
+.LVL723:
 	mov	x24, x0
-.LVL647:
-	.loc 1 1701 0
+.LVL724:
+	.loc 1 2171 0
 	ldp	w2, w0, [x20, 108]
 	mov	w1, 255
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memset
-.LVL648:
-	.loc 1 1704 0
+.LVL725:
+	.loc 1 2174 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 1702 0
+	.loc 1 2172 0
 	mov	w0, 17
 	str	w0, [x24, 40]
-	.loc 1 1707 0
+	.loc 1 2177 0
+	mov	w2, 16
+	.loc 1 2178 0
 	mov	x0, x24
-	.loc 1 1705 0
+	.loc 1 2175 0
 	ldr	w1, [x20, 108]
 	str	w1, [x24, 56]
-	.loc 1 1706 0
+	.loc 1 2176 0
 	ldr	w1, [x20, 112]
-	str	w1, [x24, 60]
-	.loc 1 1707 0
+	.loc 1 2177 0
+	stp	w1, w2, [x24, 60]
+	.loc 1 2178 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL649:
-.L645:
-.LBE1728:
-.LBE1727:
-	.loc 1 2414 0
-	cbnz	w28, .L717
-.L647:
-	.loc 1 2427 0
+.LVL726:
+.L723:
+.LBE1784:
+.LBE1783:
+	.loc 1 2879 0
+	cbnz	w28, .L786
+.L725:
+	.loc 1 2893 0
 	ldr	w0, [x19, 96]
 	adrp	x21, .LANCHOR1
-	cbz	w0, .L718
-.L649:
-	.loc 1 2432 0
-	cbz	x27, .L650
-	.loc 1 2433 0
+	cbz	w0, .L787
+.L727:
+	.loc 1 2898 0
+	cbz	x27, .L728
+	.loc 1 2899 0
 	mov	x0, x27
 	bl	kfree
-.LVL650:
-.L650:
-	.loc 1 2434 0
-	cbz	x26, .L641
-	.loc 1 2435 0
+.LVL727:
+.L728:
+	.loc 1 2900 0
+	cbz	x26, .L719
+	.loc 1 2901 0
 	mov	x0, x26
 	bl	kfree
-.LVL651:
-.L641:
-.LBE1726:
-.LBE1725:
-.LBB1739:
-.LBB1740:
-.LBB1741:
+.LVL728:
+.L719:
+.LBE1782:
+.LBE1781:
+.LBB1794:
+.LBB1795:
+.LBB1796:
 	.loc 2 1186 0
 	str	x20, [x22, 184]
-.LBE1741:
-.LBE1740:
-.LBE1739:
-.LBB1742:
-.LBB1743:
-	.loc 1 2172 0
+.LBE1796:
+.LBE1795:
+.LBE1794:
+.LBB1797:
+.LBB1798:
+	.loc 1 2646 0
 	add	x21, x21, :lo12:.LANCHOR1
 	add	x0, x21, 224
-	.loc 1 2173 0
+	.loc 1 2647 0
 	add	x22, x21, 512
-	.loc 1 2172 0
+	.loc 1 2646 0
 	bl	misc_register
-.LVL652:
-	.loc 1 2173 0
+.LVL729:
+	.loc 1 2647 0
 	add	x0, x21, 400
 	bl	misc_register
-.LVL653:
-	.loc 1 2175 0
+.LVL730:
+	.loc 1 2649 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 480
 	bl	device_create_file
-.LVL654:
-	.loc 1 2176 0
+.LVL731:
+	.loc 1 2650 0
 	ldr	x0, [x20, 288]
 	mov	x1, x22
 	bl	device_create_file
-.LVL655:
-	.loc 1 2177 0
+.LVL732:
+	.loc 1 2651 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 544
 	bl	device_create_file
-.LVL656:
-	.loc 1 2178 0
+.LVL733:
+	.loc 1 2652 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 576
 	bl	device_create_file
-.LVL657:
-	.loc 1 2179 0
+.LVL734:
+	.loc 1 2653 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 608
 	bl	device_create_file
-.LVL658:
-	.loc 1 2180 0
+.LVL735:
+	.loc 1 2654 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 640
 	bl	device_create_file
-.LVL659:
-	.loc 1 2181 0
+.LVL736:
+	.loc 1 2655 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 672
 	bl	device_create_file
-.LVL660:
-.LBE1743:
-.LBE1742:
-	.loc 1 2564 0
+.LVL737:
+.LBE1798:
+.LBE1797:
+	.loc 1 3030 0
 	ldr	x0, [x19, 104]
-	adrp	x2, .LC17
+	adrp	x2, .LC16
 	adrp	x1, .LC57
-	add	x2, x2, :lo12:.LC17
+	add	x2, x2, :lo12:.LC16
 	add	x1, x1, :lo12:.LC57
 	bl	_dev_info
-.LVL661:
-	.loc 1 2566 0
-	b	.L611
-.LVL662:
-.L718:
-.LBB1744:
-.LBB1735:
-	.loc 1 2428 0
+.LVL738:
+	.loc 1 3032 0
+	b	.L689
+.LVL739:
+.L787:
+.LBB1799:
+.LBB1791:
+	.loc 1 2894 0
 	mov	w2, 1
 	str	w2, [x19, 96]
-	.loc 1 2429 0
+	.loc 1 2895 0
 	add	x0, x21, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL663:
-	b	.L649
-.LVL664:
-.L715:
-	.loc 1 2371 0
+.LVL740:
+	b	.L727
+.LVL741:
+.L784:
+	.loc 1 2835 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC51
 	add	x1, x1, :lo12:.LC51
 	bl	_dev_info
-.LVL665:
-	.loc 1 2372 0
+.LVL742:
+	.loc 1 2836 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
-.LBB1729:
-.LBB1730:
-.LBB1731:
+.LBB1785:
+.LBB1786:
+.LBB1787:
 	.file 18 "./include/linux/slab.h"
 	.loc 18 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL666:
+.LVL743:
 	mov	x27, x0
-.LVL667:
-.LBE1731:
-.LBE1730:
-.LBE1729:
-	.loc 1 2373 0
-	cbz	x0, .L719
-	.loc 1 2377 0
+.LVL744:
+.LBE1787:
+.LBE1786:
+.LBE1785:
+	.loc 1 2837 0
+	cbz	x0, .L788
+	.loc 1 2841 0
 	ldp	w2, w1, [x21, 84]
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 100]
-.LVL668:
+.LVL745:
 	sub	x1, x1, x3
-.LVL669:
+.LVL746:
 	ldr	x3, [x19, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL670:
-	.loc 1 2381 0
-	cbnz	x28, .L720
-	.loc 1 2360 0
+.LVL747:
+	.loc 1 2845 0
+	cbnz	x28, .L789
+	.loc 1 2824 0
 	mov	w28, 0
-.LVL671:
-	.loc 1 2365 0
+.LVL748:
+	.loc 1 2829 0
 	mov	x26, 0
-.LVL672:
-.L642:
-	.loc 1 2402 0
+.LVL749:
+.L720:
+	.loc 1 2866 0
 	bl	ebc_empty_buf_get
-.LVL673:
+.LVL750:
 	mov	x24, x0
-.LVL674:
-	.loc 1 2403 0
-	cbz	x0, .L645
-	.loc 1 2404 0
+.LVL751:
+	.loc 1 2867 0
+	cbz	x0, .L723
+	.loc 1 2868 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL675:
-	.loc 1 2407 0
+.LVL752:
+	.loc 1 2871 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2405 0
+	.loc 1 2869 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2410 0
+	.loc 1 2874 0
+	mov	w2, 16
+	.loc 1 2875 0
 	mov	x0, x24
-	.loc 1 2408 0
+	.loc 1 2872 0
 	ldr	w1, [x21, 84]
 	str	w1, [x24, 56]
-	.loc 1 2409 0
+	.loc 1 2873 0
 	ldr	w1, [x21, 88]
-	str	w1, [x24, 60]
-	.loc 1 2410 0
+	.loc 1 2874 0
+	stp	w1, w2, [x24, 60]
+	.loc 1 2875 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL676:
-	b	.L645
-.LVL677:
-.L716:
-	.loc 1 2385 0
+.LVL753:
+	b	.L723
+.LVL754:
+.L785:
+	.loc 1 2849 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC54
 	add	x1, x1, :lo12:.LC54
 	bl	_dev_info
-.LVL678:
-	.loc 1 2386 0
+.LVL755:
+	.loc 1 2850 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
-.LBB1732:
-.LBB1733:
-.LBB1734:
+.LBB1788:
+.LBB1789:
+.LBB1790:
 	.loc 18 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL679:
+.LVL756:
 	mov	x26, x0
-.LBE1734:
-.LBE1733:
-.LBE1732:
-	.loc 1 2387 0
-	cbz	x0, .L721
-	.loc 1 2391 0
+.LBE1790:
+.LBE1789:
+.LBE1788:
+	.loc 1 2851 0
+	cbz	x0, .L790
+	.loc 1 2855 0
 	ldp	w2, w1, [x21, 84]
-	.loc 1 2384 0
+	.loc 1 2848 0
 	mov	w28, 1
-	.loc 1 2391 0
+	.loc 1 2855 0
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
-.LVL680:
+.LVL757:
 	sub	x1, x1, x3
-.LVL681:
+.LVL758:
 	ldr	x3, [x19, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL682:
-	b	.L643
-.LVL683:
-.L615:
-.LBE1735:
-.LBE1744:
-	.loc 1 2472 0
+.LVL759:
+	b	.L721
+.LVL760:
+.L693:
+.LBE1791:
+.LBE1799:
+	.loc 1 2938 0
 	mov	w25, -517
-	b	.L611
-.LVL684:
-.L633:
-.LBB1745:
-.LBB1680:
-	.loc 1 2258 0
-	mov	w25, -12
-	b	.L630
-.LVL685:
-.L717:
-.LBE1680:
-.LBE1745:
-.LBB1746:
-.LBB1736:
-	.loc 1 2415 0
+	b	.L689
+.LVL761:
+.L786:
+.LBB1800:
+.LBB1792:
+	.loc 1 2880 0
 	bl	ebc_empty_buf_get
-.LVL686:
+.LVL762:
 	mov	x24, x0
-.LVL687:
-	.loc 1 2416 0
-	cbz	x0, .L647
-	.loc 1 2417 0
+.LVL763:
+	.loc 1 2881 0
+	cbz	x0, .L725
+	.loc 1 2882 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL688:
-	.loc 1 2420 0
+.LVL764:
+	.loc 1 2885 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2418 0
+	.loc 1 2883 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2421 0
+	.loc 1 2888 0
+	mov	w1, 16
+	.loc 1 2886 0
 	ldr	w0, [x21, 84]
 	str	w0, [x24, 56]
-	.loc 1 2423 0
+	.loc 1 2887 0
+	ldr	w0, [x21, 88]
+	.loc 1 2888 0
+	stp	w0, w1, [x24, 60]
+	.loc 1 2889 0
 	mov	x0, x24
-	.loc 1 2422 0
-	ldr	w1, [x21, 88]
-	str	w1, [x24, 60]
-	.loc 1 2423 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL689:
-	b	.L647
-.LVL690:
-.L661:
-.LBE1736:
-.LBE1746:
-	.loc 1 2458 0
+.LVL765:
+	b	.L725
+.LVL766:
+.L739:
+.LBE1792:
+.LBE1800:
+	.loc 1 2924 0
 	mov	w25, -12
-	b	.L611
-.LVL691:
-.L616:
-	.loc 1 2482 0
+	b	.L689
+.LVL767:
+.L694:
+	.loc 1 2948 0
 	adrp	x1, .LC29
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC29
-	.loc 1 2483 0
+	.loc 1 2949 0
 	mov	w25, -22
-	.loc 1 2482 0
+	.loc 1 2948 0
 	bl	_dev_err
-.LVL692:
-	.loc 1 2483 0
-	b	.L611
-.LVL693:
-.L713:
-.LBB1747:
-.LBB1691:
-	.loc 1 2219 0
+.LVL768:
+	.loc 1 2949 0
+	b	.L689
+.LVL769:
+.L782:
+.LBB1801:
+.LBB1748:
+	.loc 1 2693 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC43
 	add	x1, x1, :lo12:.LC43
 	bl	_dev_err
-.LVL694:
-	.loc 1 2220 0
+.LVL770:
+	.loc 1 2694 0
 	ldr	x0, [x19, 104]
 	mov	w2, w26
 	ldr	x1, [x19, 208]
 	bl	epd_lut_from_file_init
-.LVL695:
-	.loc 1 2221 0
-	tbz	w0, #31, .L636
-	.loc 1 2222 0
+.LVL771:
+	.loc 1 2695 0
+	tbz	w0, #31, .L714
+	.loc 1 2696 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC44
-	.loc 1 2223 0
+	.loc 1 2697 0
 	mov	w25, -1
-	.loc 1 2222 0
+	.loc 1 2696 0
 	add	x1, x1, :lo12:.LC44
 	bl	_dev_err
-.LVL696:
-	b	.L634
+.LVL772:
+	b	.L712
+.LVL773:
 	.p2align 3
-.L714:
-.LBE1691:
-.LBE1747:
-.LBB1748:
-.LBB1711:
-	.loc 1 2313 0
-	ldr	x0, [x19, 104]
-	adrp	x1, .LC45
-	add	x1, x1, :lo12:.LC45
-	bl	_dev_err
-.LVL697:
-.L637:
-.LBE1711:
+.L711:
 .LBE1748:
-	.loc 1 2549 0
+.LBE1801:
+.LBB1802:
+.LBB1737:
+	.loc 1 2732 0
+	mov	w25, -12
+	b	.L708
+.LVL774:
+.L783:
+.LBE1737:
+.LBE1802:
+.LBB1803:
+.LBB1767:
+	.loc 1 2777 0
+	ldr	x0, [x19, 104]
+	adrp	x1, .LC45
+	add	x1, x1, :lo12:.LC45
+	bl	_dev_err
+.LVL775:
+.L715:
+.LBE1767:
+.LBE1803:
+	.loc 1 3015 0
 	adrp	x1, .LC79
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC79
-	.loc 1 2550 0
+	.loc 1 3016 0
 	mov	w25, -1
-	.loc 1 2549 0
+	.loc 1 3015 0
 	bl	_dev_err
-.LVL698:
-	.loc 1 2550 0
-	b	.L611
-.LVL699:
-.L638:
-.LBB1749:
-.LBB1712:
-	.loc 1 2322 0
+.LVL776:
+	.loc 1 3016 0
+	b	.L689
+.LVL777:
+.L716:
+.LBB1804:
+.LBB1768:
+	.loc 1 2786 0
 	ldr	x0, [x19, 104]
-.LVL700:
+.LVL778:
 	adrp	x1, .LC78
-	.loc 1 2320 0
+	.loc 1 2784 0
 	str	x24, [x19, 136]
-	.loc 1 2322 0
+	.loc 1 2786 0
 	add	x1, x1, :lo12:.LC78
 	bl	_dev_err
-.LVL701:
-	b	.L637
-.LVL702:
-.L706:
-.LBE1712:
-.LBE1749:
-	.loc 1 2465 0
+.LVL779:
+	b	.L715
+.LVL780:
+.L775:
+.LBE1768:
+.LBE1804:
+	.loc 1 2931 0
 	adrp	x1, .LC27
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC27
-	.loc 1 2466 0
+	.loc 1 2932 0
 	mov	w25, -19
-	.loc 1 2465 0
+	.loc 1 2931 0
 	bl	_dev_err
-.LVL703:
-	.loc 1 2466 0
-	b	.L611
-.LVL704:
-.L662:
-.LBB1750:
-.LBB1681:
-	.loc 1 2243 0
+.LVL781:
+	.loc 1 2932 0
+	b	.L689
+.LVL782:
+.L740:
+.LBB1805:
+.LBB1738:
+	.loc 1 2717 0
 	mov	w25, -19
-	b	.L630
-.LVL705:
-.L663:
-.LBE1681:
-.LBE1750:
-.LBB1751:
-.LBB1692:
-	.loc 1 2197 0
+	b	.L708
+.LVL783:
+.L741:
+.LBE1738:
+.LBE1805:
+.LBB1806:
+.LBB1749:
+	.loc 1 2671 0
 	mov	w25, -19
-	b	.L634
-.LVL706:
-.L721:
-.LBE1692:
-.LBE1751:
-.LBB1752:
-.LBB1737:
-	.loc 1 2388 0
-	ldr	x0, [x19, 104]
-.LVL707:
-	adrp	x1, .LC55
-	adrp	x21, .LANCHOR1
-	add	x1, x1, :lo12:.LC55
-	bl	_dev_err
-.LVL708:
-	b	.L641
-.LVL709:
-.L712:
-.LBE1737:
-.LBE1752:
-.LBB1753:
-.LBB1693:
-	.loc 1 2213 0
+	b	.L712
+.LVL784:
+.L781:
+	.loc 1 2687 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
 	adrp	x1, .LC42
-	mov	w3, 2213
+	mov	w3, 2687
 	add	x2, x2, 32
 	add	x1, x1, :lo12:.LC42
-	.loc 1 2214 0
+	.loc 1 2688 0
 	mov	w25, -12
-	.loc 1 2213 0
+	.loc 1 2687 0
 	bl	_dev_err
-.LVL710:
-	b	.L634
-.LVL711:
-.L709:
-.LBE1693:
-.LBE1753:
-	.loc 1 2567 0
-	bl	__stack_chk_fail
-.LVL712:
-.L720:
-.LBB1754:
-.LBB1738:
-	.loc 1 2370 0
+.LVL785:
+	b	.L712
+.LVL786:
+.L789:
+.LBE1749:
+.LBE1806:
+.LBB1807:
+.LBB1793:
+	.loc 1 2834 0
 	mov	w24, 1
-.LVL713:
-	b	.L658
-.LVL714:
-.L719:
-	.loc 1 2374 0
+.LVL787:
+	b	.L736
+.LVL788:
+.L788:
+	.loc 1 2838 0
 	ldr	x0, [x19, 104]
-.LVL715:
+.LVL789:
 	adrp	x1, .LC52
 	adrp	x21, .LANCHOR1
 	add	x1, x1, :lo12:.LC52
 	bl	_dev_err
-.LVL716:
-	b	.L641
-.LBE1738:
-.LBE1754:
+.LVL790:
+	b	.L719
+.LVL791:
+.L790:
+	.loc 1 2852 0
+	ldr	x0, [x19, 104]
+.LVL792:
+	adrp	x1, .LC55
+	adrp	x21, .LANCHOR1
+	add	x1, x1, :lo12:.LC55
+	bl	_dev_err
+.LVL793:
+	b	.L719
+.LVL794:
+.L778:
+.LBE1793:
+.LBE1807:
+	.loc 1 3033 0
+	bl	__stack_chk_fail
+.LVL795:
 	.cfi_endproc
-.LFE2852:
+.LFE2859:
 	.size	ebc_probe, .-ebc_probe
 	.align	2
 	.p2align 3,,7
-	.type	ebc_power_set.constprop.11, %function
-ebc_power_set.constprop.11:
-.LFB2871:
+	.type	ebc_power_set.constprop.16, %function
+ebc_power_set.constprop.16:
+.LFB2883:
 	.loc 1 183 0
 	.cfi_startproc
-.LVL717:
+.LVL796:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -8143,45 +9278,45 @@ ebc_power_set.constprop.11:
 	mov	x19, x0
 	.loc 1 189 0
 	ldr	w0, [x20, 440]
-.LVL718:
-	cbz	w0, .L725
-.L723:
+.LVL797:
+	cbz	w0, .L794
+.L792:
 	.loc 1 193 0
 	mov	w1, 1
 	str	w1, [x20, 200]
 	.loc 1 194 0
 	ldr	x2, [x19, 16]
-.LBB1755:
-.LBB1756:
+.LBB1808:
+.LBB1809:
 	.loc 3 30 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL719:
-.LBE1756:
-.LBE1755:
+.LVL798:
+.LBE1809:
+.LBE1808:
 	.loc 1 195 0
 	ldr	x2, [x19, 8]
-.LBB1757:
-.LBB1758:
+.LBB1810:
+.LBB1811:
 	.loc 11 46 0
 	add	x1, x19, 24
 	mov	x0, x2
 	ldr	x2, [x2, 48]
 	blr	x2
-.LVL720:
-.LBE1758:
-.LBE1757:
+.LVL799:
+.LBE1811:
+.LBE1810:
 	.loc 1 196 0
 	ldr	x0, [x19]
 	adrp	x1, .LC81
 	add	x1, x1, :lo12:.LC81
 	bl	_dev_info
-.LVL721:
+.LVL800:
 	.loc 1 211 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
-.LVL722:
+.LVL801:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -8190,63 +9325,63 @@ ebc_power_set.constprop.11:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL723:
+.LVL802:
 	.p2align 3
-.L725:
+.L794:
 	.cfi_restore_state
 	.loc 1 190 0
 	mov	w0, 1
 	str	w0, [x20, 440]
-.LBB1759:
-.LBB1760:
+.LBB1812:
+.LBB1813:
 	.loc 4 58 0
 	add	x0, x19, 416
 	bl	__pm_stay_awake
-.LVL724:
-	b	.L723
-.LBE1760:
-.LBE1759:
+.LVL803:
+	b	.L792
+.LBE1813:
+.LBE1812:
 	.cfi_endproc
-.LFE2871:
-	.size	ebc_power_set.constprop.11, .-ebc_power_set.constprop.11
+.LFE2883:
+	.size	ebc_power_set.constprop.16, .-ebc_power_set.constprop.16
 	.align	2
 	.p2align 3,,7
 	.type	ebc_open, %function
 ebc_open:
-.LFB2870:
+.LFB2882:
 	.cfi_startproc
 	mov	w0, 0
 	str	xzr, [x1, 104]
 	ret
 	.cfi_endproc
-.LFE2870:
+.LFE2882:
 	.size	ebc_open, .-ebc_open
 	.align	2
 	.p2align 3,,7
 	.global	refresh_new_image2
 	.type	refresh_new_image2, %function
 refresh_new_image2:
-.LFB2808:
+.LFB2809:
 	.loc 1 216 0
 	.cfi_startproc
-.LVL725:
+.LVL804:
 	.loc 1 223 0
 	ldp	w16, w5, [x4, 68]
-.LVL726:
+.LVL805:
 	cmp	w5, 0
 	add	w11, w5, 7
 	csel	w11, w11, w5, lt
-.LVL727:
+.LVL806:
 	.loc 1 225 0
 	cmp	w16, 0
 	.loc 1 223 0
 	asr	w11, w11, 3
-.LVL728:
+.LVL807:
 	.loc 1 225 0
-	ble	.L727
+	ble	.L796
 	sub	w14, w11, #1
 	mov	w15, 0
-.LVL729:
+.LVL808:
 	add	x14, x14, 1
 	.loc 1 270 0
 	mov	w13, 234881024
@@ -8254,92 +9389,92 @@ refresh_new_image2:
 	lsl	x14, x14, 2
 	.loc 1 276 0
 	mov	w12, -536870912
-.LVL730:
+.LVL809:
 	.p2align 2
-.L729:
+.L798:
 	.loc 1 226 0 discriminator 1
 	mov	x6, 0
 	cmp	w11, 0
-	bgt	.L750
-	b	.L747
-.LVL731:
+	bgt	.L819
+	b	.L816
+.LVL810:
 	.p2align 3
-.L730:
+.L799:
 	.loc 1 239 0
 	tst	x5, 65280
-	bne	.L731
+	bne	.L800
 	.loc 1 240 0
 	and	w10, w4, 240
 	cmp	w10, 224
-	beq	.L752
+	beq	.L821
 	.loc 1 243 0
 	orr	w7, w7, 240
-.L731:
+.L800:
 	.loc 1 245 0
 	tst	x5, 16711680
-	bne	.L733
+	bne	.L802
 	.loc 1 246 0
 	and	w10, w4, 3840
 	cmp	w10, 3584
-	beq	.L753
+	beq	.L822
 	.loc 1 249 0
 	orr	w7, w7, 3840
-.L733:
+.L802:
 	.loc 1 251 0
 	tst	x5, 4278190080
-	bne	.L735
+	bne	.L804
 	.loc 1 252 0
 	and	w10, w4, 61440
 	cmp	w10, 57344
-	beq	.L754
+	beq	.L823
 	.loc 1 255 0
 	orr	w7, w7, 61440
-.L735:
+.L804:
 	.loc 1 257 0
 	tst	x5, 1095216660480
-	bne	.L737
+	bne	.L806
 	.loc 1 258 0
 	and	w10, w4, 983040
 	cmp	w10, 917504
-	beq	.L755
+	beq	.L824
 	.loc 1 261 0
 	orr	w7, w7, 983040
-.L737:
+.L806:
 	.loc 1 263 0
 	tst	x5, 280375465082880
-	bne	.L739
+	bne	.L808
 	.loc 1 264 0
 	and	w10, w4, 15728640
 	cmp	w10, 14680064
-	beq	.L756
+	beq	.L825
 	.loc 1 267 0
 	orr	w7, w7, 15728640
-.L739:
+.L808:
 	.loc 1 269 0
 	tst	x5, 71776119061217280
-	bne	.L741
+	bne	.L810
 	.loc 1 270 0
 	and	w10, w4, 251658240
 	cmp	w10, w13
-	beq	.L757
+	beq	.L826
 	.loc 1 273 0
 	orr	w7, w7, 251658240
-.L741:
+.L810:
 	.loc 1 275 0
 	tst	x5, -72057594037927936
-	bne	.L743
+	bne	.L812
 	.loc 1 276 0
 	and	w5, w4, -268435456
-.LVL732:
+.LVL811:
 	cmp	w5, w12
-	beq	.L758
+	beq	.L827
 	.loc 1 279 0
 	orr	w7, w7, -268435456
-.LVL733:
-.L743:
+.LVL812:
+.L812:
 	.loc 1 283 0 discriminator 2
 	and	w4, w4, w9
-.LVL734:
+.LVL813:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
@@ -8348,54 +9483,54 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 226 0 discriminator 2
 	cmp	w11, w6
-	ble	.L759
-.LVL735:
-.L750:
+	ble	.L828
+.LVL814:
+.L819:
 	.loc 1 227 0
 	ldr	x5, [x3, x6, lsl 3]
 	.loc 1 231 0
 	mov	w7, 0
 	.loc 1 228 0
 	ldr	w4, [x1, x6, lsl 2]
-.LVL736:
+.LVL815:
 	.loc 1 229 0
 	ldr	w8, [x0, x6, lsl 2]
 	.loc 1 233 0
 	and	x10, x5, 255
 	.loc 1 230 0
 	ldr	w9, [x2, x6, lsl 2]
-.LVL737:
+.LVL816:
 	.loc 1 233 0
-	cbnz	x10, .L730
-.LVL738:
+	cbnz	x10, .L799
+.LVL817:
 	.loc 1 234 0
 	and	w10, w4, 15
 	.loc 1 237 0
 	mov	w7, 15
 	.loc 1 234 0
 	cmp	w10, 14
-	bne	.L730
+	bne	.L799
 	.loc 1 235 0
 	orr	w8, w8, w7
-.LVL739:
+.LVL818:
 	.loc 1 231 0
 	mov	w7, 0
-.LVL740:
-	b	.L730
+.LVL819:
+	b	.L799
 	.p2align 3
-.L757:
+.L826:
 	.loc 1 271 0
 	orr	w8, w8, 251658240
-	b	.L741
-.LVL741:
+	b	.L810
+.LVL820:
 	.p2align 3
-.L758:
+.L827:
 	.loc 1 277 0
 	orr	w8, w8, -268435456
-.LVL742:
+.LVL821:
 	.loc 1 283 0
 	and	w4, w4, w9
-.LVL743:
+.LVL822:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
@@ -8404,105 +9539,105 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 226 0
 	cmp	w11, w6
-	bgt	.L750
-.LVL744:
+	bgt	.L819
+.LVL823:
 	.p2align 2
-.L759:
+.L828:
 	add	x3, x3, x17
 	add	x1, x1, x14
 	add	x2, x2, x14
 	add	x0, x0, x14
-.LVL745:
-.L747:
+.LVL824:
+.L816:
 	.loc 1 225 0 discriminator 2
 	add	w15, w15, 1
 	cmp	w16, w15
-	bne	.L729
-.L727:
+	bne	.L798
+.L796:
 	ret
-.LVL746:
+.LVL825:
 	.p2align 3
-.L753:
+.L822:
 	.loc 1 247 0
 	orr	w8, w8, 3840
-	b	.L733
+	b	.L802
 	.p2align 3
-.L754:
+.L823:
 	.loc 1 253 0
 	orr	w8, w8, 61440
-	b	.L735
+	b	.L804
 	.p2align 3
-.L755:
+.L824:
 	.loc 1 259 0
 	orr	w8, w8, 983040
-	b	.L737
+	b	.L806
 	.p2align 3
-.L756:
+.L825:
 	.loc 1 265 0
 	orr	w8, w8, 15728640
-	b	.L739
+	b	.L808
 	.p2align 3
-.L752:
+.L821:
 	.loc 1 241 0
 	orr	w8, w8, 240
-	b	.L731
+	b	.L800
 	.cfi_endproc
-.LFE2808:
+.LFE2809:
 	.size	refresh_new_image2, .-refresh_new_image2
 	.align	2
 	.p2align 3,,7
 	.global	refresh_new_image_auto
 	.type	refresh_new_image_auto, %function
 refresh_new_image_auto:
-.LFB2809:
+.LFB2810:
 	.loc 1 291 0
 	.cfi_startproc
-.LVL747:
+.LVL826:
 	.loc 1 298 0
 	ldp	w13, w4, [x3, 68]
 	cmp	w4, 0
 	add	w9, w4, 7
 	csel	w9, w9, w4, lt
-.LVL748:
+.LVL827:
 	.loc 1 300 0
 	cmp	w13, 0
 	.loc 1 298 0
 	asr	w9, w9, 3
-.LVL749:
+.LVL828:
 	.loc 1 300 0
-	ble	.L760
+	ble	.L829
 	sub	w12, w9, #1
 	mov	w11, 0
-.LVL750:
+.LVL829:
 	add	x12, x12, 1
 	.loc 1 308 0
 	mov	w10, 15
 	lsl	x14, x12, 3
 	lsl	x12, x12, 2
 	.p2align 2
-.L762:
+.L831:
 	.loc 1 301 0 discriminator 1
 	mov	x6, 0
 	cmp	w9, 0
-	ble	.L773
+	ble	.L842
 	.p2align 2
-.L775:
+.L844:
 	.loc 1 302 0
 	ldr	x4, [x2, x6, lsl 3]
-.LVL751:
+.LVL830:
 	.loc 1 304 0
 	ldr	w7, [x0, x6, lsl 2]
 	.loc 1 303 0
 	ldr	w3, [x1, x6, lsl 2]
-.LVL752:
+.LVL831:
 	.loc 1 307 0
 	and	x5, x4, 255
 	.loc 1 308 0
 	cmp	x5, 0
-.LVL753:
+.LVL832:
 	eor	w5, w3, w7
 	csel	w3, wzr, w10, ne
-.LVL754:
+.LVL833:
 	.loc 1 311 0
 	orr	w8, w3, 240
 	tst	x4, 65280
@@ -8530,10 +9665,10 @@ refresh_new_image_auto:
 	.loc 1 329 0
 	tst	x4, -72057594037927936
 	orr	w4, w3, -268435456
-.LVL755:
+.LVL834:
 	csel	w3, w4, w3, eq
 	and	w3, w5, w3
-.LVL756:
+.LVL835:
 	.loc 1 332 0
 	eor	w3, w3, w7
 	.loc 1 333 0
@@ -8541,30 +9676,30 @@ refresh_new_image_auto:
 	add	x6, x6, 1
 	.loc 1 301 0
 	cmp	w9, w6
-	bgt	.L775
+	bgt	.L844
 	add	x2, x2, x14
 	add	x1, x1, x12
 	add	x0, x0, x12
-.LVL757:
-.L773:
+.LVL836:
+.L842:
 	.loc 1 300 0 discriminator 2
 	add	w11, w11, 1
 	cmp	w13, w11
-	bne	.L762
-.L760:
+	bne	.L831
+.L829:
 	ret
 	.cfi_endproc
-.LFE2809:
+.LFE2810:
 	.size	refresh_new_image_auto, .-refresh_new_image_auto
 	.align	2
 	.p2align 3,,7
 	.global	new_buffer_refresh
 	.type	new_buffer_refresh, %function
 new_buffer_refresh:
-.LFB2810:
+.LFB2811:
 	.loc 1 339 0
 	.cfi_startproc
-.LVL758:
+.LVL837:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -8581,16 +9716,16 @@ new_buffer_refresh:
 	adrp	x20, .LANCHOR1
 	.loc 1 340 0
 	ldr	x19, [x1, #:lo12:.LANCHOR0]
-.LVL759:
+.LVL838:
 	.loc 1 343 0
 	add	x0, x20, :lo12:.LANCHOR1
-.LVL760:
+.LVL839:
 	add	x0, x0, 704
 	bl	down_write
-.LVL761:
+.LVL840:
 	.loc 1 341 0
 	add	x19, x19, 184
-.LVL762:
+.LVL841:
 	.loc 1 344 0
 	ldr	x0, [x19, 224]
 	ldr	w5, [x0, 40]
@@ -8599,22 +9734,22 @@ new_buffer_refresh:
 	.loc 1 346 0
 	cmp	w5, 0
 	ccmp	w1, 1, 0, ne
-	bls	.L781
+	bls	.L850
 	.loc 1 352 0
 	ldr	x1, [x0, 16]
 	mov	x4, x19
 	ldp	x2, x3, [x19, 160]
 	ldr	x0, [x19, 144]
 	bl	refresh_new_image2
-.LVL763:
+.LVL842:
 	.loc 1 357 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 704
 	bl	up_write
-.LVL764:
+.LVL843:
 	.loc 1 358 0
 	ldp	x19, x20, [sp, 16]
-.LVL765:
+.LVL844:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -8623,9 +9758,9 @@ new_buffer_refresh:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL766:
+.LVL845:
 	.p2align 3
-.L781:
+.L850:
 	.cfi_restore_state
 	.loc 1 347 0
 	ldr	x1, [x0, 16]
@@ -8633,15 +9768,15 @@ new_buffer_refresh:
 	ldr	x2, [x19, 168]
 	ldr	x0, [x19, 144]
 	bl	refresh_new_image_auto
-.LVL767:
+.LVL846:
 	.loc 1 357 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 704
 	bl	up_write
-.LVL768:
+.LVL847:
 	.loc 1 358 0
 	ldp	x19, x20, [sp, 16]
-.LVL769:
+.LVL848:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -8650,219 +9785,517 @@ new_buffer_refresh:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2810:
+.LFE2811:
 	.size	new_buffer_refresh, .-new_buffer_refresh
 	.align	2
 	.p2align 3,,7
 	.type	ebc_thread, %function
 ebc_thread:
-.LFB2828:
-	.loc 1 1362 0
+.LFB2835:
+	.loc 1 1830 0
 	.cfi_startproc
-.LVL770:
-	stp	x29, x30, [sp, -224]!
-	.cfi_def_cfa_offset 224
-	.cfi_offset 29, -224
-	.cfi_offset 30, -216
+.LVL849:
+	stp	x29, x30, [sp, -240]!
+	.cfi_def_cfa_offset 240
+	.cfi_offset 29, -240
+	.cfi_offset 30, -232
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x21, x22, [sp, 32]
-	.cfi_offset 21, -192
-	.cfi_offset 22, -184
-	.loc 1 1363 0
+	.cfi_offset 21, -208
+	.cfi_offset 22, -200
+	.loc 1 1831 0
 	adrp	x21, .LANCHOR0
-	.loc 1 1362 0
+	.loc 1 1830 0
 	stp	x19, x20, [sp, 16]
 	adrp	x22, .LANCHOR1
 	stp	x23, x24, [sp, 48]
-.LBB1783:
-.LBB1784:
-.LBB1785:
-	.loc 1 1688 0
+.LBB1836:
+.LBB1837:
+.LBB1838:
+	.loc 1 2158 0
 	add	x22, x22, :lo12:.LANCHOR1
-.LBE1785:
-.LBE1784:
-.LBE1783:
-	.loc 1 1362 0
+.LBE1838:
+.LBE1837:
+.LBE1836:
+	.loc 1 1830 0
 	stp	x27, x28, [sp, 80]
-	.cfi_offset 19, -208
-	.cfi_offset 20, -200
-	.cfi_offset 23, -176
-	.cfi_offset 24, -168
-	.cfi_offset 27, -144
-	.cfi_offset 28, -136
+	.cfi_offset 19, -224
+	.cfi_offset 20, -216
+	.cfi_offset 23, -192
+	.cfi_offset 24, -184
+	.cfi_offset 27, -160
+	.cfi_offset 28, -152
 	adrp	x23, __stack_chk_guard
 	stp	x25, x26, [sp, 64]
-	.cfi_offset 25, -160
-	.cfi_offset 26, -152
-	.loc 1 1362 0
+	.cfi_offset 25, -176
+	.cfi_offset 26, -168
+	.loc 1 1830 0
 	add	x0, x23, :lo12:__stack_chk_guard
-.LVL771:
-	.loc 1 1363 0
+.LVL850:
+	.loc 1 1831 0
 	ldr	x20, [x21, #:lo12:.LANCHOR0]
-.LVL772:
-.LBB1790:
-.LBB1788:
-.LBB1786:
-	.loc 1 1688 0
+.LVL851:
+.LBB1843:
+.LBB1841:
+.LBB1839:
+	.loc 1 2158 0
 	add	x19, x22, 304
-.LBE1786:
-.LBE1788:
-.LBE1790:
-	.loc 1 1362 0
+.LBE1839:
+.LBE1841:
+.LBE1843:
+	.loc 1 1830 0
 	ldr	x1, [x0]
-	str	x1, [x29, 216]
+	str	x1, [x29, 232]
 	mov	x1,0
-	.loc 1 1367 0
+	.loc 1 1835 0
 	str	wzr, [x29, 108]
-	.loc 1 1364 0
+	.loc 1 1832 0
 	add	x28, x20, 184
-.LVL773:
+.LVL852:
 	.p2align 2
-.L783:
-	.loc 1 1372 0
+.L852:
+	.loc 1 1840 0
 	ldr	w0, [x28, 624]
-	cbnz	w0, .L929
-.L784:
-	.loc 1 1378 0
+.LVL853:
+	cbnz	w0, .L997
+.L853:
+	.loc 1 1846 0
 	bl	ebc_dsp_buf_get
-.LVL774:
+.LVL854:
 	mov	x24, x0
-	.loc 1 1380 0
-	cbz	x0, .L786
-	.loc 1 1380 0 is_stmt 0 discriminator 1
+	.loc 1 1848 0
+	cbz	x0, .L855
+	.loc 1 1848 0 is_stmt 0 discriminator 1
 	ldr	x0, [x0, 8]
-	cbz	x0, .L786
-	.loc 1 1382 0 is_stmt 1
+	cbz	x0, .L855
+	.loc 1 1850 0 is_stmt 1
 	add	x0, x21, :lo12:.LANCHOR0
 	ldr	w1, [x0, 16]
-	cbz	w1, .L787
-	.loc 1 1383 0
+	cbz	w1, .L856
+	.loc 1 1851 0
 	ldr	w1, [x0, 20]
 	add	w2, w1, 1
 	str	w2, [x0, 20]
 	cmp	w1, 5
-	ble	.L788
-	.loc 1 1384 0
+	ble	.L857
+	.loc 1 1852 0
 	str	wzr, [x0, 16]
-.L788:
-	.loc 1 1385 0
-	ldr	w1, [x28, 20]
+.L857:
+	.loc 1 1853 0
+	ldr	w2, [x20, 204]
+	ldr	w1, [x24, 64]
 	ldr	x0, [x24, 16]
-	bl	check_black_percent
-.LVL775:
-	cbnz	w0, .L922
-.L787:
-	.loc 1 1393 0
+	bl	check_black_percent.isra.14
+.LVL855:
+	cbnz	w0, .L990
+.L856:
+	.loc 1 1861 0
+	ldr	w0, [x24, 40]
+	cmp	w0, 20
+	beq	.L998
+	.loc 1 1865 0
+	ldr	x1, [x28, 616]
+	cbz	x1, .L861
+	.loc 1 1866 0
+	cmp	w0, 19
+	beq	.L999
+	.loc 1 1875 0
+	mov	w1, 18
+	tst	w0, w1
+	beq	.L990
+	.loc 1 1876 0
+	ldr	x0, [x28, 104]
+	adrp	x1, .LC83
+	add	x1, x1, :lo12:.LC83
+	bl	_dev_info
+.LVL856:
+.L860:
+	.loc 1 1916 0
+	adrp	x25, jiffies
+.LVL857:
+	mov	x1, 402653184
+	add	x0, x20, 632
+	ldr	x2, [x25, #:lo12:jiffies]
+	add	x1, x2, x1
+	bl	mod_timer
+.LVL858:
+	.loc 1 1918 0
+	ldr	w0, [x28, 444]
+	cbz	w0, .L868
+	ldr	x0, [x28, 216]
+.L869:
+	.loc 1 1921 0
+	ldr	w2, [x0, 40]
+	ldr	w3, [x24, 40]
+	cmp	w3, w2
+	beq	.L870
+	.loc 1 1922 0
+	ldr	x0, [x28, 104]
+	adrp	x1, .LC86
+	add	x1, x1, :lo12:.LC86
+	bl	_dev_info
+.LVL859:
+	.loc 1 1924 0
+	ldr	w0, [x28, 44]
+	cmp	w0, 1
+	beq	.L1000
+.L991:
+	ldr	w2, [x24, 40]
+.L870:
+	.loc 1 1931 0
+	cmp	w2, 23
+	bls	.L1001
+	.loc 1 2106 0
+	ldr	x0, [x28, 104]
+	adrp	x1, .LC94
+	add	x1, x1, :lo12:.LC94
+	bl	_dev_err
+.LVL860:
+.L990:
+	.loc 1 1938 0
+	mov	x0, x24
+	bl	ebc_remove_from_dsp_buf_list
+.LVL861:
+	.loc 1 1939 0
+	mov	x0, x24
+	bl	ebc_buf_release
+.LVL862:
+	.loc 1 1840 0
+	ldr	w0, [x28, 624]
+	cbz	w0, .L853
+	.p2align 2
+.L997:
+	.loc 1 1841 0
+	ldr	w0, [x28, 200]
+	cmp	w0, 1
+	beq	.L1002
+.L854:
+	.loc 1 2164 0
+	add	x23, x23, :lo12:__stack_chk_guard
+	mov	w0, 0
+	ldr	x2, [x29, 232]
+	ldr	x1, [x23]
+	eor	x1, x2, x1
+	cbnz	x1, .L1003
+	ldp	x19, x20, [sp, 16]
+.LVL863:
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+.LVL864:
+	ldp	x25, x26, [sp, 64]
+.LVL865:
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 240
+	.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
+.LVL866:
+	.p2align 3
+.L855:
+	.cfi_restore_state
+	.loc 1 2145 0
+	ldr	w0, [x28, 44]
+	cmp	w0, 1
+	beq	.L1004
+	.loc 1 2154 0
+	ldr	w0, [x28, 200]
+	cmp	w0, 1
+	beq	.L1005
+.LVL867:
+.L993:
+	ldr	w0, [x28, 96]
+.LVL868:
+	.loc 1 2157 0
+	cbz	w0, .L1006
+.L944:
+.LVL869:
+.L934:
+	.loc 1 2159 0
+	str	wzr, [x28, 96]
+	b	.L852
+.LVL870:
+	.p2align 3
+.L1006:
+.LBB1844:
+.LBB1842:
+	.loc 1 2158 0 discriminator 1
+	mov	w1, 0
+	add	x0, x29, 120
+	bl	init_wait_entry
+.LVL871:
+	b	.L945
+	.p2align 3
+.L1007:
+.LVL872:
+.LBB1840:
+	.loc 1 2158 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L934
+	.loc 1 2158 0 discriminator 7
+	bl	schedule
+.LVL873:
+.L945:
+	.loc 1 2158 0 discriminator 9
+	add	x1, x29, 120
+	mov	w2, 1
+	mov	x0, x19
+	bl	prepare_to_wait_event
+.LVL874:
+	ldr	w1, [x28, 96]
+	cbz	w1, .L1007
+.LBE1840:
+	.loc 1 2158 0 discriminator 4
+	add	x1, x29, 120
+	mov	x0, x19
+	bl	finish_wait
+.LVL875:
+.LBE1842:
+.LBE1844:
+	.loc 1 2159 0 is_stmt 1 discriminator 4
+	str	wzr, [x28, 96]
+	b	.L852
+.LVL876:
+	.p2align 3
+.L1001:
+	.loc 1 1931 0
+	adrp	x0, .L878
+	add	x0, x0, :lo12:.L878
+	ldrh	w0, [x0,w2,uxtw #1]
+	adr	x1, .Lrtx878
+	add	x0, x1, w0, sxth #2
+	br	x0
+.Lrtx878:
+	.section	.rodata
+	.align	0
+	.align	2
+.L878:
+	.2byte	(.L877 - .Lrtx878) / 4
+	.2byte	(.L879 - .Lrtx878) / 4
+	.2byte	(.L949 - .Lrtx878) / 4
+	.2byte	(.L949 - .Lrtx878) / 4
+	.2byte	(.L949 - .Lrtx878) / 4
+	.2byte	(.L949 - .Lrtx878) / 4
+	.2byte	(.L949 - .Lrtx878) / 4
+	.2byte	(.L881 - .Lrtx878) / 4
+	.2byte	(.L881 - .Lrtx878) / 4
+	.2byte	(.L949 - .Lrtx878) / 4
+	.2byte	(.L949 - .Lrtx878) / 4
+	.2byte	(.L881 - .Lrtx878) / 4
+	.2byte	(.L949 - .Lrtx878) / 4
+	.2byte	(.L949 - .Lrtx878) / 4
+	.2byte	(.L881 - .Lrtx878) / 4
+	.2byte	(.L881 - .Lrtx878) / 4
+	.2byte	(.L949 - .Lrtx878) / 4
+	.2byte	(.L949 - .Lrtx878) / 4
+	.2byte	(.L949 - .Lrtx878) / 4
+	.2byte	(.L949 - .Lrtx878) / 4
+	.2byte	(.L949 - .Lrtx878) / 4
+	.2byte	(.L949 - .Lrtx878) / 4
+	.2byte	(.L877 - .Lrtx878) / 4
+	.2byte	(.L877 - .Lrtx878) / 4
+	.text
+	.p2align 3
+.L949:
+	.loc 1 2030 0
+	mov	w7, 1
+.LVL877:
+.L880:
+	.loc 1 2037 0
+	ldr	x26, [x28, 216]
+.LVL878:
+	.loc 1 2039 0
+	ldr	w0, [x26, 40]
+	sub	w1, w0, #22
+	.loc 1 2041 0
+	cmp	w1, 1
+	ccmp	w0, 1, 0, hi
+	bhi	.L916
+	.loc 1 2044 0
+	add	x0, x29, 160
+	str	x0, [x28, 216]
+	.loc 1 2045 0
+	ldr	x0, [x28, 152]
+	str	x0, [x29, 176]
+	.loc 1 2046 0
+	mov	w0, 16
+	str	w0, [x29, 224]
+.L916:
+	.loc 1 2048 0
+	str	wzr, [x28, 92]
+	.loc 1 2049 0
+	str	x24, [x28, 224]
+	.loc 1 2052 0
 	ldr	w0, [x24, 40]
+	sub	w0, w0, #2
+	.loc 1 2051 0
+	cmp	w0, 14
+	bhi	.L917
+	.loc 1 2054 0
+	ldr	x0, [x28, 216]
+.LBB1845:
+.LBB1846:
+	.loc 1 1813 0
+	ldr	w1, [x28, 20]
+.LBE1846:
+.LBE1845:
+	.loc 1 2053 0
+	ldr	x4, [x24, 16]
+.LBB1849:
+.LBB1847:
+	.loc 1 1813 0
+	cmp	w1, 0
+.LBE1847:
+.LBE1849:
+	.loc 1 2054 0
+	ldr	x5, [x0, 16]
+.LBB1850:
+.LBB1848:
+	.loc 1 1813 0
+	add	w0, w1, 7
+	csel	w0, w0, w1, lt
+	asr	w0, w0, 3
+	cmp	w0, 0
+	ble	.L918
+	.loc 1 1817 0
+	ldr	x2, [x4]
+	ldr	x1, [x5]
+	cmp	x2, x1
+	bne	.L917
+	sub	w1, w0, #1
+	mov	x0, 8
+	add	x1, x1, 1
+	lsl	x1, x1, 3
+	b	.L920
+	.p2align 3
+.L921:
+	.loc 1 1814 0
+	ldr	x3, [x4, x0]
+	add	x0, x0, 8
+	.loc 1 1815 0
+	add	x2, x5, x0
+	.loc 1 1817 0
+	ldr	x2, [x2, -8]
+	cmp	x3, x2
+	bne	.L917
+.L920:
+	.loc 1 1813 0
+	cmp	x1, x0
+	bne	.L921
+.L918:
+.LBE1848:
+.LBE1850:
+	.loc 1 2056 0
+	ldr	x0, [x28, 104]
+	adrp	x1, .LC97
+	add	x1, x1, :lo12:.LC97
+	bl	_dev_info
+.LVL879:
+	.loc 1 2058 0
+	str	x26, [x28, 216]
+	.loc 1 2117 0
+	ldr	x0, [x28, 224]
+	ldr	w0, [x0, 40]
 	cmp	w0, 20
-	beq	.L930
-	.loc 1 1397 0
-	ldr	x1, [x28, 616]
-	cbz	x1, .L792
-	.loc 1 1398 0
-	cmp	w0, 19
-	beq	.L931
-	.loc 1 1407 0
-	mov	w1, 18
-	tst	w0, w1
-	beq	.L922
-	.loc 1 1408 0
+	bne	.L929
+.LVL880:
+.L1018:
+	.loc 1 2120 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC83
-	add	x1, x1, :lo12:.LC83
+	.loc 1 2118 0
+	mov	w25, 1
+.LVL881:
+	.loc 1 2119 0
+	str	wzr, [x28, 204]
+	.loc 1 2120 0
+	adrp	x1, .LC95
+	.loc 1 2118 0
+	str	w25, [x28, 624]
+	.loc 1 2120 0
+	add	x1, x1, :lo12:.LC95
 	bl	_dev_info
-.LVL776:
-.L791:
-	.loc 1 1441 0
-	adrp	x25, jiffies
-.LVL777:
-	mov	x1, 402653184
-	add	x0, x20, 632
-	ldr	x2, [x25, #:lo12:jiffies]
-	add	x1, x2, x1
-	bl	mod_timer
-.LVL778:
-	.loc 1 1443 0
+.LVL882:
+	.loc 1 2121 0
+	mov	w2, w25
+	mov	w1, w25
+	add	x0, x22, 328
+	bl	__wake_up_sync
+.LVL883:
+	.loc 1 2134 0
+	mov	x0, x24
+	bl	ebc_remove_from_dsp_buf_list
+.LVL884:
+	.loc 1 2136 0
 	ldr	w0, [x28, 444]
-	cbz	w0, .L798
+	cbz	w0, .L932
+.LVL885:
+	.p2align 2
+.L1020:
+	.loc 1 2137 0
 	ldr	x0, [x28, 216]
-.L799:
-	.loc 1 1446 0
-	ldr	w2, [x0, 40]
-	ldr	w3, [x24, 40]
-	cmp	w3, w2
-	beq	.L800
-	.loc 1 1447 0
-	ldr	x0, [x28, 104]
-	adrp	x1, .LC85
-	add	x1, x1, :lo12:.LC85
-	bl	_dev_info
-.LVL779:
-	.loc 1 1448 0
-	ldr	w0, [x28, 44]
-	cmp	w0, 1
-	beq	.L932
-.L923:
-	ldr	w2, [x24, 40]
-.L800:
-	.loc 1 1455 0
-	cmp	w2, 13
-	bgt	.L807
-	cmp	w2, 12
-	bge	.L880
-	cmp	w2, 6
-	bgt	.L809
-	cmp	w2, 2
-	bge	.L880
-	cbz	w2, .L810
-	cmp	w2, 1
-	bne	.L806
-	.loc 1 1457 0
+	bl	ebc_buf_release
+.LVL886:
+	b	.L933
+.LVL887:
+	.p2align 3
+.L879:
+	.loc 1 1933 0
 	ldr	w0, [x28, 628]
-	cbz	w0, .L813
-	.loc 1 1458 0
-	str	w2, [x28, 632]
-	.loc 1 1467 0
+	cbz	w0, .L882
+	.loc 1 1934 0
+	mov	w0, 1
+	str	w0, [x28, 632]
+	.loc 1 1943 0
 	add	x0, x22, 704
 	bl	down_write
-.LVL780:
-	.loc 1 1468 0
+.LVL888:
+	.loc 1 1944 0
 	str	x24, [x28, 224]
-	.loc 1 1470 0
+	.loc 1 1946 0
 	ldr	x2, [x28, 216]
 	ldr	w0, [x2, 40]
-	.loc 1 1473 0
+	.loc 1 1949 0
 	cmp	w0, 1
-	.loc 1 1472 0
+	.loc 1 1948 0
 	sub	w1, w0, #22
-	.loc 1 1473 0
+	.loc 1 1949 0
 	ccmp	w1, 1, 0, hi
-	bls	.L933
-	.loc 1 1474 0
+	bls	.L1008
+	.loc 1 1950 0
 	ldr	x1, [x2, 16]
 	ldr	x0, [x28, 144]
 	ldrsw	x2, [x28, 20]
 	bl	memcpy
-.LVL781:
-	.loc 1 1475 0
+.LVL889:
+	.loc 1 1951 0
 	ldr	x0, [x28, 216]
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x28, 152]
 	bl	memcpy
-.LVL782:
-	.loc 1 1476 0
+.LVL890:
+	.loc 1 1952 0
 	ldr	x0, [x28, 216]
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x28, 160]
 	bl	memcpy
-.LVL783:
+.LVL891:
 	ldr	x0, [x28, 224]
-.L816:
-.LBB1791:
-.LBB1792:
+.L885:
+.LBB1851:
+.LBB1852:
 	.loc 1 379 0
 	ldp	w3, w16, [x0, 48]
 	.loc 1 438 0
@@ -8890,23 +10323,23 @@ ebc_thread:
 	asr	w10, w10, 3
 	.loc 1 382 0
 	asr	w18, w18, 3
-.LVL784:
+.LVL892:
 	.loc 1 378 0
 	add	w10, w10, 1
-.LVL785:
+.LVL893:
 	ldr	w1, [x20, 252]
 	.loc 1 385 0
 	cmp	w10, w18
-.LBE1792:
-.LBE1791:
-	.loc 1 1483 0
+.LBE1852:
+.LBE1851:
+	.loc 1 1959 0
 	ldr	x13, [x0, 16]
-.LBB1797:
-.LBB1793:
+.LBB1857:
+.LBB1853:
 	.loc 1 385 0
 	sub	w0, w18, #1
 	csel	w10, w0, w10, ge
-.LVL786:
+.LVL894:
 	.loc 1 387 0
 	cmp	w1, w25
 	sub	w1, w1, #1
@@ -8916,106 +10349,106 @@ ebc_thread:
 	csel	w25, w1, w25, le
 	.loc 1 377 0
 	asr	w17, w17, 3
-.LVL787:
+.LVL895:
 	mul	w7, w16, w18
 	.loc 1 389 0
 	cmp	w16, w25
-.LBE1793:
-.LBE1797:
-	.loc 1 1483 0
+.LBE1853:
+.LBE1857:
+	.loc 1 1959 0
 	ldr	x9, [x28, 144]
-	.loc 1 1484 0
+	.loc 1 1960 0
 	ldp	x12, x11, [x28, 160]
-.LBB1798:
-.LBB1794:
+.LBB1858:
+.LBB1854:
 	.loc 1 389 0
-	bgt	.L824
-.LVL788:
+	bgt	.L893
+.LVL896:
 	.p2align 2
-.L903:
+.L970:
 	.loc 1 394 0
 	mov	w5, w17
 	cmp	w17, w10
-	ble	.L904
-	b	.L841
-.LVL789:
+	ble	.L971
+	b	.L910
+.LVL897:
 	.p2align 3
-.L825:
+.L894:
 	.loc 1 407 0
 	tst	x2, 65280
-	bne	.L826
+	bne	.L895
 	.loc 1 408 0
 	and	w27, w0, 240
 	cmp	w27, 224
-	beq	.L934
+	beq	.L1009
 	.loc 1 411 0
 	orr	w3, w3, 240
-.L826:
+.L895:
 	.loc 1 413 0
 	tst	x2, 16711680
-	bne	.L828
+	bne	.L897
 	.loc 1 414 0
 	and	w27, w0, 3840
 	cmp	w27, 3584
-	beq	.L935
+	beq	.L1010
 	.loc 1 417 0
 	orr	w3, w3, 3840
-.L828:
+.L897:
 	.loc 1 419 0
 	tst	x2, 4278190080
-	bne	.L830
+	bne	.L899
 	.loc 1 420 0
 	and	w27, w0, 61440
 	cmp	w27, 57344
-	beq	.L936
+	beq	.L1011
 	.loc 1 423 0
 	orr	w3, w3, 61440
-.L830:
+.L899:
 	.loc 1 425 0
 	tst	x2, 1095216660480
-	bne	.L832
+	bne	.L901
 	.loc 1 426 0
 	and	w27, w0, 983040
 	cmp	w27, 917504
-	beq	.L937
+	beq	.L1012
 	.loc 1 429 0
 	orr	w3, w3, 983040
-.L832:
+.L901:
 	.loc 1 431 0
 	tst	x2, 280375465082880
-	bne	.L834
+	bne	.L903
 	.loc 1 432 0
 	and	w27, w0, 15728640
 	cmp	w27, 14680064
-	beq	.L938
+	beq	.L1013
 	.loc 1 435 0
 	orr	w3, w3, 15728640
-.L834:
+.L903:
 	.loc 1 437 0
 	tst	x2, 71776119061217280
-	bne	.L836
+	bne	.L905
 	.loc 1 438 0
 	and	w27, w0, 251658240
 	cmp	w27, w15
-	beq	.L939
+	beq	.L1014
 	.loc 1 441 0
 	orr	w3, w3, 251658240
-.L836:
+.L905:
 	.loc 1 443 0
 	tst	x2, -72057594037927936
-	bne	.L838
+	bne	.L907
 	.loc 1 444 0
 	and	w2, w0, -268435456
-.LVL790:
+.LVL898:
 	cmp	w2, w14
-	beq	.L940
+	beq	.L1015
 	.loc 1 447 0
 	orr	w3, w3, -268435456
-.LVL791:
-.L838:
+.LVL899:
+.L907:
 	.loc 1 450 0
 	and	w0, w0, w26
-.LVL792:
+.LVL900:
 	.loc 1 394 0
 	add	w5, w5, 1
 	eor	w0, w0, w4
@@ -9026,19 +10459,19 @@ ebc_thread:
 	.loc 1 451 0
 	str	w0, [x9, x1]
 	.loc 1 394 0
-	bgt	.L841
-.LVL793:
-.L904:
+	bgt	.L910
+.LVL901:
+.L971:
 	.loc 1 395 0
 	sxtw	x1, w5
-.LVL794:
+.LVL902:
 	.loc 1 399 0
 	mov	w3, 0
 	.loc 1 398 0
 	lsl	x0, x1, 3
 	.loc 1 395 0
 	lsl	x1, x1, 2
-.LVL795:
+.LVL903:
 	.loc 1 398 0
 	add	x0, x0, x7, sxtw 3
 	add	x1, x1, x7, sxtw 2
@@ -9051,478 +10484,246 @@ ebc_thread:
 	and	x27, x2, 255
 	.loc 1 397 0
 	ldr	w26, [x12, x1]
-.LVL796:
+.LVL904:
 	.loc 1 401 0
-	cbnz	x27, .L825
-.LVL797:
+	cbnz	x27, .L894
+.LVL905:
 	.loc 1 402 0
 	and	w3, w0, 15
-.LVL798:
+.LVL906:
 	cmp	w3, 14
 	.loc 1 405 0
 	mov	w3, 15
-.LVL799:
+.LVL907:
 	.loc 1 402 0
-	bne	.L825
+	bne	.L894
 	.loc 1 403 0
 	orr	w4, w4, w3
-.LVL800:
+.LVL908:
 	.loc 1 399 0
 	mov	w3, 0
-.LVL801:
-	b	.L825
-.LVL802:
-	.p2align 3
-.L786:
-.LBE1794:
-.LBE1798:
-	.loc 1 1675 0
-	ldr	w0, [x28, 44]
-	cmp	w0, 1
-	beq	.L941
-	.loc 1 1684 0
-	ldr	w0, [x28, 200]
-	cmp	w0, 1
-	beq	.L942
-.LVL803:
-.L925:
-	ldr	w0, [x28, 96]
-.LVL804:
-	.loc 1 1687 0
-	cbz	w0, .L943
-.L875:
-.LVL805:
-.L865:
-	.loc 1 1689 0
-	str	wzr, [x28, 96]
-.L947:
-	.loc 1 1372 0
-	ldr	w0, [x28, 624]
-.LVL806:
-	cbz	w0, .L784
-.L929:
-	.loc 1 1373 0
-	ldr	w0, [x28, 200]
-	cmp	w0, 1
-	beq	.L944
-.L785:
-	.loc 1 1694 0
-	add	x23, x23, :lo12:__stack_chk_guard
-	mov	w0, 0
-	ldr	x2, [x29, 216]
-	ldr	x1, [x23]
-	eor	x1, x2, x1
-	cbnz	x1, .L945
-	ldp	x19, x20, [sp, 16]
-.LVL807:
-	ldp	x21, x22, [sp, 32]
-	ldp	x23, x24, [sp, 48]
-.LVL808:
-	ldp	x25, x26, [sp, 64]
-.LVL809:
-	ldp	x27, x28, [sp, 80]
-	ldp	x29, x30, [sp], 224
-	.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:
-	.p2align 3
-.L943:
-	.cfi_restore_state
-.LBB1799:
-.LBB1789:
-	.loc 1 1688 0 discriminator 1
-	mov	w1, 0
-	add	x0, x29, 112
-	bl	init_wait_entry
-.LVL811:
-	b	.L876
+.LVL909:
+	b	.L894
+.LVL910:
 	.p2align 3
-.L946:
-.LVL812:
-.LBB1787:
-	.loc 1 1688 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L865
-	.loc 1 1688 0 discriminator 7
-	bl	schedule
-.LVL813:
-.L876:
-	.loc 1 1688 0 discriminator 9
-	add	x1, x29, 112
-	mov	w2, 1
-	mov	x0, x19
-	bl	prepare_to_wait_event
-.LVL814:
-	ldr	w1, [x28, 96]
-	cbz	w1, .L946
-.LBE1787:
-	.loc 1 1688 0 discriminator 4
-	add	x1, x29, 112
-	mov	x0, x19
-	bl	finish_wait
-.LVL815:
-.LBE1789:
-.LBE1799:
-	.loc 1 1689 0 is_stmt 1 discriminator 4
-	str	wzr, [x28, 96]
-	b	.L947
-.LVL816:
+.L877:
+.LBE1854:
+.LBE1858:
+	.loc 1 1982 0
+	add	x0, x22, 704
+	bl	down_write
+.LVL911:
+	.loc 1 1985 0
+	ldr	x0, [x28, 216]
+	.loc 1 1983 0
+	str	x24, [x28, 224]
+	.loc 1 1986 0
+	ldr	w0, [x0, 40]
+	sub	w1, w0, #22
+	.loc 1 1988 0
+	cmp	w1, 1
+	ccmp	w0, 1, 0, hi
+	bls	.L912
+	.loc 1 1989 0
+	ldr	w2, [x28, 20]
+	ldr	x1, [x24, 16]
+	ldr	x0, [x28, 144]
+	lsl	w2, w2, 1
+	sxtw	x2, w2
+	bl	memcpy
+.LVL912:
+	.loc 1 1990 0
+	ldr	x0, [x28, 216]
+	ldr	w2, [x28, 20]
+	ldr	x1, [x0, 16]
+	lsl	w2, w2, 1
+	ldr	x0, [x28, 152]
+	sxtw	x2, w2
+	bl	memcpy
+.LVL913:
+	b	.L913
 	.p2align 3
-.L812:
-	.loc 1 1455 0
-	cmp	w2, 23
-	ble	.L810
-.L806:
-	.loc 1 1636 0
-	ldr	x0, [x28, 104]
-	adrp	x1, .LC93
-	add	x1, x1, :lo12:.LC93
-	bl	_dev_err
-.LVL817:
-.L922:
-	.loc 1 1637 0
-	mov	x0, x24
-	bl	ebc_remove_from_dsp_buf_list
-.LVL818:
-	.loc 1 1638 0
-	mov	x0, x24
-	bl	ebc_buf_release
-.LVL819:
-	.loc 1 1640 0
-	b	.L783
-.LVL820:
+.L881:
+	.loc 1 1931 0
+	mov	w7, 0
+.LVL914:
+	b	.L880
+.LVL915:
 	.p2align 3
-.L798:
-	.loc 1 1444 0
+.L868:
+	.loc 1 1919 0
 	mov	x0, x24
 	str	x24, [x28, 216]
-	b	.L799
-.LVL821:
+	b	.L869
+.LVL916:
 	.p2align 3
-.L792:
-	.loc 1 1417 0
+.L861:
+	.loc 1 1885 0
 	cmp	w0, 18
 	ccmp	w0, 21, 4, ne
-	bne	.L796
-	.loc 1 1418 0
+	bne	.L865
+	.loc 1 1886 0
 	str	wzr, [x28, 632]
-	b	.L791
-.LVL822:
-	.p2align 3
-.L807:
-	.loc 1 1455 0
-	cmp	w2, 21
-	bgt	.L812
-	cmp	w2, 16
-	bge	.L880
-.L809:
-	mov	w7, 0
-.LVL823:
-.L808:
-	.loc 1 1564 0
-	ldr	x26, [x28, 216]
-.LVL824:
-	.loc 1 1566 0
-	ldr	w0, [x26, 40]
-	sub	w1, w0, #22
-	.loc 1 1568 0
-	cmp	w1, 1
-	ccmp	w0, 1, 0, hi
-	bhi	.L847
-	.loc 1 1572 0
-	add	x0, x29, 152
-	str	x0, [x28, 216]
-	.loc 1 1573 0
-	ldr	x0, [x28, 152]
-	str	x0, [x29, 168]
-.L847:
-	.loc 1 1578 0
-	str	wzr, [x28, 92]
-	.loc 1 1579 0
-	str	x24, [x28, 224]
-	.loc 1 1582 0
-	ldr	w0, [x24, 40]
-	sub	w0, w0, #2
-	.loc 1 1581 0
-	cmp	w0, 14
-	bhi	.L848
-	.loc 1 1584 0
-	ldr	x0, [x28, 216]
-.LBB1800:
-.LBB1801:
-	.loc 1 1345 0
-	ldr	w1, [x28, 20]
-.LBE1801:
-.LBE1800:
-	.loc 1 1583 0
-	ldr	x4, [x24, 16]
-.LBB1804:
-.LBB1802:
-	.loc 1 1345 0
-	cmp	w1, 0
-.LBE1802:
-.LBE1804:
-	.loc 1 1584 0
-	ldr	x5, [x0, 16]
-.LBB1805:
-.LBB1803:
-	.loc 1 1345 0
-	add	w0, w1, 7
-	csel	w0, w0, w1, lt
-	asr	w0, w0, 3
-	cmp	w0, 0
-	ble	.L849
-	.loc 1 1349 0
-	ldr	x2, [x4]
-	ldr	x1, [x5]
-	cmp	x2, x1
-	bne	.L848
-	sub	w1, w0, #1
-	mov	x0, 8
-	add	x1, x1, 1
-	lsl	x1, x1, 3
-	b	.L851
-	.p2align 3
-.L852:
-	.loc 1 1346 0
-	ldr	x3, [x4, x0]
-	add	x0, x0, 8
-	.loc 1 1347 0
-	add	x2, x5, x0
-	.loc 1 1349 0
-	ldr	x2, [x2, -8]
-	cmp	x3, x2
-	bne	.L848
-.L851:
-	.loc 1 1345 0
-	cmp	x1, x0
-	bne	.L852
-.L849:
-.LBE1803:
-.LBE1805:
-	.loc 1 1586 0
-	ldr	x0, [x28, 104]
-	adrp	x1, .LC96
-	add	x1, x1, :lo12:.LC96
-	bl	_dev_info
-.LVL825:
-	.loc 1 1588 0
-	str	x26, [x28, 216]
-	.loc 1 1647 0
-	ldr	x0, [x28, 224]
-	ldr	w0, [x0, 40]
-	cmp	w0, 20
-	bne	.L860
-.LVL826:
-.L950:
-	.loc 1 1650 0
-	ldr	x0, [x28, 104]
-	.loc 1 1648 0
-	mov	w25, 1
-.LVL827:
-	.loc 1 1649 0
-	str	wzr, [x28, 204]
-	.loc 1 1650 0
-	adrp	x1, .LC94
-	.loc 1 1648 0
-	str	w25, [x28, 624]
-	.loc 1 1650 0
-	add	x1, x1, :lo12:.LC94
-	bl	_dev_info
-.LVL828:
-	.loc 1 1651 0
-	mov	w2, w25
-	mov	w1, w25
-	add	x0, x22, 328
-	bl	__wake_up_sync
-.LVL829:
-	.loc 1 1664 0
-	mov	x0, x24
-	bl	ebc_remove_from_dsp_buf_list
-.LVL830:
-	.loc 1 1666 0
-	ldr	w0, [x28, 444]
-	cbz	w0, .L863
-.LVL831:
-	.p2align 2
-.L952:
-	.loc 1 1667 0
-	ldr	x0, [x28, 216]
-	bl	ebc_buf_release
-.LVL832:
-	b	.L864
-.LVL833:
-	.p2align 3
-.L880:
-	.loc 1 1555 0
-	mov	w7, 1
-.LVL834:
-	b	.L808
-.LVL835:
+	b	.L860
 	.p2align 3
-.L930:
-	.loc 1 1395 0
+.L998:
+	.loc 1 1863 0
 	str	wzr, [x28, 628]
-	.loc 1 1394 0
+	.loc 1 1862 0
 	str	wzr, [x28, 632]
-	b	.L791
-.LVL836:
+	b	.L860
+.LVL917:
 	.p2align 3
-.L848:
-	.loc 1 1594 0
-	cbz	w7, .L948
-	.loc 1 1595 0
+.L917:
+	.loc 1 2064 0
+	cbz	w7, .L1016
+	.loc 1 2065 0
 	str	wzr, [x29, 108]
-.LVL837:
-.L853:
-	.loc 1 1606 0
+.LVL918:
+.L922:
+	.loc 1 2076 0
 	ldr	w0, [x28, 200]
-	cbz	w0, .L949
-.L854:
-	.loc 1 1609 0
+	cbz	w0, .L1017
+.L923:
+	.loc 1 2079 0
+	ldr	x0, [x28, 224]
+	ldr	w1, [x0, 64]
+.LVL919:
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL838:
-	cbz	w0, .L855
-.L955:
-	.loc 1 1610 0
+.LVL920:
+	cbz	w0, .L924
+.L1024:
+	.loc 1 2080 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC90
-	add	x1, x1, :lo12:.LC90
+	adrp	x1, .LC91
+	add	x1, x1, :lo12:.LC91
 	bl	_dev_err
-.LVL839:
-	.loc 1 1612 0
+.LVL921:
+	.loc 1 2082 0
 	str	x26, [x28, 216]
-.LVL840:
-.L821:
-	.loc 1 1647 0
+.LVL922:
+.L890:
+	.loc 1 2117 0
 	ldr	x0, [x28, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
-	beq	.L950
-.L860:
-	.loc 1 1653 0
+	beq	.L1018
+.L929:
+	.loc 1 2123 0
 	cmp	w0, 18
-	beq	.L951
-.L861:
-	.loc 1 1664 0
+	beq	.L1019
+.L930:
+	.loc 1 2134 0
 	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL841:
-	.loc 1 1666 0
+.LVL923:
+	.loc 1 2136 0
 	ldr	w0, [x28, 444]
-	cbnz	w0, .L952
-.L863:
-	.loc 1 1669 0
+	cbnz	w0, .L1020
+.L932:
+	.loc 1 2139 0
 	mov	w0, 1
 	str	w0, [x28, 444]
-.L864:
-	.loc 1 1671 0
+.L933:
+	.loc 1 2141 0
 	ldr	x0, [x28, 224]
 	str	x0, [x28, 216]
-	.loc 1 1672 0
-	b	.L783
+	.loc 1 2142 0
+	b	.L852
 	.p2align 3
-.L941:
-.LBB1806:
-	.loc 1 1676 0 discriminator 1
+.L1004:
+.LBB1859:
+	.loc 1 2146 0 discriminator 1
 	ldr	w0, [x28, 96]
-	cbnz	w0, .L865
-.LBB1807:
-	.loc 1 1676 0 is_stmt 0 discriminator 3
+	cbnz	w0, .L934
+.LBB1860:
+	.loc 1 2146 0 is_stmt 0 discriminator 3
 	mov	w1, 0
-	add	x0, x29, 112
+	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL842:
-	b	.L869
+.LVL924:
+	b	.L938
 	.p2align 3
-.L953:
-.LBB1808:
-	.loc 1 1676 0 discriminator 7
+.L1021:
+.LBB1861:
+	.loc 1 2146 0 discriminator 7
 	ldr	w1, [x28, 96]
-	cbnz	w1, .L866
-.LVL843:
-	.loc 1 1676 0 discriminator 9
-	cbnz	x0, .L925
-	.loc 1 1676 0 discriminator 11
+	cbnz	w1, .L935
+.LVL925:
+	.loc 1 2146 0 discriminator 9
+	cbnz	x0, .L993
+	.loc 1 2146 0 discriminator 11
 	bl	schedule
-.LVL844:
-.L869:
-	.loc 1 1676 0 discriminator 13
-	add	x1, x29, 112
+.LVL926:
+.L938:
+	.loc 1 2146 0 discriminator 13
+	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL845:
+.LVL927:
 	ldr	w1, [x28, 44]
-	cbnz	w1, .L953
-.L866:
-.LBE1808:
-	.loc 1 1676 0 discriminator 8
+	cbnz	w1, .L1021
+.L935:
+.LBE1861:
+	.loc 1 2146 0 discriminator 8
 	mov	x0, x19
-	add	x1, x29, 112
+	add	x1, x29, 120
 	bl	finish_wait
-.LVL846:
+.LVL928:
 	ldr	w0, [x28, 44]
-.LBE1807:
-.LBE1806:
-	.loc 1 1679 0 is_stmt 1 discriminator 8
-	cbnz	w0, .L925
-	.loc 1 1684 0
+.LBE1860:
+.LBE1859:
+	.loc 1 2149 0 is_stmt 1 discriminator 8
+	cbnz	w0, .L993
+	.loc 1 2154 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	bne	.L925
+	bne	.L993
 	.p2align 2
-.L942:
-.LBB1809:
-.LBB1810:
+.L1005:
+.LBB1862:
+.LBB1863:
 	mov	w1, 0
 	mov	x0, x20
-	bl	ebc_power_set.part.8
-.LVL847:
-	b	.L925
+	bl	ebc_power_set.part.12
+.LVL929:
+	b	.L993
 	.p2align 3
-.L796:
-.LBE1810:
-.LBE1809:
-	.loc 1 1420 0
+.L865:
+.LBE1863:
+.LBE1862:
+	.loc 1 1888 0
 	ldr	w1, [x28, 632]
 	cmp	w1, 0
 	ccmp	w0, 1, 4, ne
-	beq	.L791
-	.loc 1 1421 0
+	beq	.L860
+	.loc 1 1889 0
+	ldr	w0, [x24, 64]
+	cmp	w0, 32
+	beq	.L1022
+	.loc 1 1896 0
 	add	x25, x22, 704
-.LVL848:
+.LVL930:
 	mov	x0, x25
 	bl	down_write
-.LVL849:
-	.loc 1 1422 0
+.LVL931:
+	.loc 1 1897 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x24, 16]
 	ldr	x0, [x28, 160]
 	bl	memcpy
-.LVL850:
-	.loc 1 1423 0
+.LVL932:
+	.loc 1 1898 0
 	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL851:
-	.loc 1 1424 0
+.LVL933:
+	.loc 1 1899 0
 	mov	x0, x24
 	bl	ebc_buf_release
-.LVL852:
-	.loc 1 1426 0
+.LVL934:
+	.loc 1 1901 0
 	ldr	x1, [x28, 224]
 	mov	x4, x28
 	ldr	x0, [x28, 144]
@@ -9530,293 +10731,228 @@ ebc_thread:
 	ldr	w5, [x1, 40]
 	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
-.LVL853:
-	.loc 1 1429 0
+.LVL935:
+	.loc 1 1904 0
 	mov	x0, x25
 	bl	up_write
-.LVL854:
-	.loc 1 1430 0
+.LVL936:
+	.loc 1 1905 0
 	ldr	w0, [x28, 44]
-	cbnz	w0, .L783
-	.loc 1 1431 0
+	cbnz	w0, .L852
+	.loc 1 1906 0
 	mov	w0, 1
 	str	w0, [x28, 44]
-	.loc 1 1433 0
+	.loc 1 1908 0
 	ldr	w0, [x28, 200]
-	.loc 1 1432 0
+	.loc 1 1907 0
 	str	wzr, [x28, 92]
-	.loc 1 1433 0
-	cbz	w0, .L954
-.L797:
-	.loc 1 1435 0
-	ldr	x0, [x28, 104]
-	adrp	x1, .LC84
-	ldrb	w2, [x28, 48]
-	add	x1, x1, :lo12:.LC84
-	bl	_dev_info
-.LVL855:
-	.loc 1 1436 0
-	mov	x0, x20
-	bl	ebc_frame_start
-.LVL856:
-	b	.L783
-	.p2align 3
-.L810:
-	.loc 1 1506 0
-	add	x0, x22, 704
-	bl	down_write
-.LVL857:
-	.loc 1 1512 0
-	ldr	x0, [x28, 216]
-	.loc 1 1507 0
-	str	x24, [x28, 224]
-	.loc 1 1513 0
-	ldr	w0, [x0, 40]
-	sub	w1, w0, #22
-	.loc 1 1515 0
-	cmp	w1, 1
-	ccmp	w0, 1, 0, hi
-	bls	.L843
-	.loc 1 1516 0
-	ldrsw	x2, [x28, 20]
-	ldr	x1, [x24, 16]
-	ldr	x0, [x28, 144]
-	bl	memcpy
-.LVL858:
-	.loc 1 1517 0
-	ldr	x0, [x28, 216]
-	ldrsw	x2, [x28, 20]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x28, 152]
-	bl	memcpy
-.LVL859:
-	b	.L844
-.LVL860:
+	.loc 1 1908 0
+	cbz	w0, .L1023
+.L867:
+	.loc 1 1910 0
+	ldr	x0, [x28, 104]
+	adrp	x1, .LC85
+	ldrb	w2, [x28, 48]
+	add	x1, x1, :lo12:.LC85
+	bl	_dev_info
+.LVL937:
+	.loc 1 1911 0
+	mov	x0, x20
+	bl	ebc_frame_start
+.LVL938:
+	b	.L852
+.LVL939:
 	.p2align 3
-.L948:
-	.loc 1 1598 0
+.L1016:
+	.loc 1 2068 0
 	ldr	w0, [x28, 64]
 	cmp	w0, 0
-	ble	.L853
-	.loc 1 1599 0
+	ble	.L922
+	.loc 1 2069 0
 	ldr	w1, [x29, 108]
-.LVL861:
+.LVL940:
 	add	w1, w1, 1
 	str	w1, [x29, 108]
-	.loc 1 1600 0
+	.loc 1 2070 0
 	cmp	w0, w1
-	bgt	.L853
-	.loc 1 1601 0
+	bgt	.L922
+	.loc 1 2071 0
 	mov	w0, 2
 	str	w0, [x24, 40]
-	.loc 1 1602 0
+	.loc 1 2072 0
 	str	wzr, [x29, 108]
-	.loc 1 1606 0
+	.loc 1 2076 0
 	ldr	w0, [x28, 200]
-	cbnz	w0, .L854
-.L949:
-	.loc 1 1607 0
+	cbnz	w0, .L923
+.L1017:
+	.loc 1 2077 0
 	mov	x0, x20
-	bl	ebc_power_set.constprop.11
-.LVL862:
-	.loc 1 1609 0
+	bl	ebc_power_set.constprop.16
+.LVL941:
+	.loc 1 2079 0
+	ldr	x0, [x28, 224]
+	ldr	w1, [x0, 64]
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL863:
-	cbnz	w0, .L955
-.L855:
-	.loc 1 1621 0
+.LVL942:
+	cbnz	w0, .L1024
+.L924:
+	.loc 1 2091 0
 	ldr	x0, [x28, 224]
-	adrp	x1, .LC92
-	.loc 1 1618 0
+	adrp	x1, .LC93
+	.loc 1 2088 0
 	ldr	w3, [x28, 112]
-	.loc 1 1621 0
-	add	x1, x1, :lo12:.LC92
-	.loc 1 1618 0
+	.loc 1 2091 0
+	add	x1, x1, :lo12:.LC93
+	.loc 1 2088 0
 	strb	w3, [x28, 48]
-	.loc 1 1621 0
+	.loc 1 2091 0
 	and	w3, w3, 255
 	ldr	w2, [x0, 40]
 	ldr	x0, [x28, 104]
 	bl	_dev_info
-.LVL864:
-	.loc 1 1622 0
+.LVL943:
+	.loc 1 2092 0
 	mov	w0, 1
 	str	w0, [x28, 44]
-	.loc 1 1623 0
+	.loc 1 2093 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL865:
-	.loc 1 1625 0
+.LVL944:
+	.loc 1 2095 0
 	ldr	x1, [x25, #:lo12:jiffies]
 	add	x0, x20, 688
 	str	x0, [x29, 96]
 	add	x1, x1, 900
 	bl	mod_timer
-.LVL866:
-.LBB1811:
-	.loc 1 1626 0
+.LVL945:
+.LBB1864:
+	.loc 1 2096 0
 	ldr	w0, [x28, 92]
-	cbz	w0, .L956
-.L858:
-.LVL867:
-.L856:
-.LBE1811:
-	.loc 1 1628 0 discriminator 11
+	cbz	w0, .L1025
+.L927:
+.LVL946:
+.L925:
+.LBE1864:
+	.loc 1 2098 0 discriminator 11
 	ldr	x2, [x25, #:lo12:jiffies]
 	mov	x1, 402653184
 	ldr	x0, [x29, 96]
-.LVL868:
+.LVL947:
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL869:
-	.loc 1 1629 0 discriminator 11
+.LVL948:
+	.loc 1 2099 0 discriminator 11
 	str	wzr, [x28, 92]
-	.loc 1 1631 0 discriminator 11
+	.loc 1 2101 0 discriminator 11
 	str	x26, [x28, 216]
-	.loc 1 1633 0 discriminator 11
-	b	.L821
-.LVL870:
-.L813:
-	.loc 1 1461 0
+	.loc 1 2103 0 discriminator 11
+	b	.L890
+.LVL949:
+.L882:
+	.loc 1 1937 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC88
-	add	x1, x1, :lo12:.LC88
+	adrp	x1, .LC89
+	add	x1, x1, :lo12:.LC89
 	bl	_dev_info
-.LVL871:
-	.loc 1 1462 0
-	mov	x0, x24
-	bl	ebc_remove_from_dsp_buf_list
-.LVL872:
-	.loc 1 1463 0
-	mov	x0, x24
-	bl	ebc_buf_release
-.LVL873:
-	.loc 1 1465 0
-	b	.L783
-.L843:
-	.loc 1 1520 0
+.LVL950:
+	b	.L990
+.L912:
+	.loc 1 1993 0
 	ldr	x1, [x24, 16]
 	mov	x3, x28
 	ldr	x0, [x28, 144]
 	ldr	x2, [x28, 168]
 	bl	refresh_new_image_auto
-.LVL874:
-.L844:
-	.loc 1 1523 0
+.LVL951:
+.L913:
+	.loc 1 1996 0
 	add	x0, x22, 704
 	bl	up_write
-.LVL875:
-	.loc 1 1525 0
+.LVL952:
+	.loc 1 1998 0
 	ldr	w0, [x28, 44]
-	cbnz	w0, .L821
-	.loc 1 1528 0
+	cbnz	w0, .L890
+	.loc 1 2001 0
 	ldr	w0, [x28, 200]
-	.loc 1 1526 0
+	.loc 1 1999 0
 	mov	w1, 1
-	.loc 1 1527 0
+	.loc 1 2000 0
 	str	wzr, [x28, 92]
-	.loc 1 1526 0
+	.loc 1 1999 0
 	str	w1, [x28, 44]
-	.loc 1 1528 0
-	cbz	w0, .L957
-.L845:
-	.loc 1 1530 0
+	.loc 1 2001 0
+	cbz	w0, .L1026
+.L914:
+	.loc 1 2003 0
+	mov	w1, 16
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL876:
+.LVL953:
 	cmn	w0, #1
-	beq	.L958
-	.loc 1 1538 0
+	beq	.L1027
+	.loc 1 2011 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC91
-	.loc 1 1535 0
+	adrp	x1, .LC92
+	.loc 1 2008 0
 	ldr	w3, [x28, 112]
-	.loc 1 1538 0
-	add	x1, x1, :lo12:.LC91
-	.loc 1 1535 0
+	.loc 1 2011 0
+	add	x1, x1, :lo12:.LC92
+	.loc 1 2008 0
 	strb	w3, [x28, 48]
-.LVL877:
-.L924:
-	.loc 1 1538 0
+.LVL954:
+.L992:
+	.loc 1 2011 0
 	and	w2, w3, 255
-	.loc 1 1536 0
+	.loc 1 2009 0
 	lsr	w3, w3, 8
 	strb	w3, [x28, 49]
-	.loc 1 1538 0
+	.loc 1 2011 0
 	bl	_dev_info
-.LVL878:
-	.loc 1 1539 0
+.LVL955:
+	.loc 1 2012 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL879:
-	b	.L821
-.LVL880:
-.L932:
-	.loc 1 1449 0
-	ldr	x0, [x28, 104]
-	adrp	x1, .LC86
-	add	x1, x1, :lo12:.LC86
-	bl	_dev_info
-.LVL881:
-.LBB1815:
-	.loc 1 1450 0
-	ldr	w0, [x28, 92]
-	cbz	w0, .L959
-.L804:
-.LVL882:
-.L802:
-.LBE1815:
-	.loc 1 1451 0 discriminator 11
-	ldr	x0, [x28, 104]
-.LVL883:
-	adrp	x1, .LC87
-	add	x1, x1, :lo12:.LC87
-	bl	_dev_info
-.LVL884:
-	b	.L923
-.L933:
-	.loc 1 1479 0
+.LVL956:
+	b	.L890
+.LVL957:
+.L1008:
+	.loc 1 1955 0
 	cmp	w0, 0
 	mov	x0, x24
 	ccmp	w1, 1, 0, ne
-	bhi	.L816
-	.loc 1 1480 0
+	bhi	.L885
+	.loc 1 1956 0
 	ldrsw	x2, [x28, 20]
 	ldp	x1, x0, [x28, 152]
 	bl	memcpy
-.LVL885:
+.LVL958:
 	ldr	x0, [x28, 224]
-	b	.L816
-.LVL886:
-	.p2align 3
-.L937:
-.LBB1819:
-.LBB1795:
-	.loc 1 427 0
-	orr	w4, w4, 983040
-	b	.L832
+	b	.L885
+.LVL959:
 	.p2align 3
-.L938:
+.L1013:
+.LBB1868:
+.LBB1855:
 	.loc 1 433 0
 	orr	w4, w4, 15728640
-	b	.L834
+	b	.L903
 	.p2align 3
-.L939:
+.L1014:
 	.loc 1 439 0
 	orr	w4, w4, 251658240
-	b	.L836
-.LVL887:
+	b	.L905
+.LVL960:
 	.p2align 3
-.L940:
+.L1015:
 	.loc 1 445 0
 	orr	w4, w4, -268435456
-.LVL888:
+.LVL961:
 	.loc 1 450 0
 	and	w0, w0, w26
-.LVL889:
+.LVL962:
 	eor	w0, w0, w4
-.LVL890:
+.LVL963:
 	.loc 1 394 0
 	add	w5, w5, 1
 	and	w0, w0, w3
@@ -9826,267 +10962,306 @@ ebc_thread:
 	.loc 1 451 0
 	str	w0, [x9, x1]
 	.loc 1 394 0
-	ble	.L904
-.LVL891:
+	ble	.L971
+.LVL964:
 	.p2align 2
-.L841:
+.L910:
 	.loc 1 389 0
 	add	w16, w16, 1
 	add	w7, w7, w18
 	cmp	w16, w25
-	ble	.L903
-.L824:
-.LBE1795:
-.LBE1819:
-	.loc 1 1486 0
+	ble	.L970
+.L893:
+.LBE1855:
+.LBE1868:
+	.loc 1 1962 0
 	add	x0, x22, 704
 	bl	up_write
-.LVL892:
-	.loc 1 1487 0
+.LVL965:
+	.loc 1 1963 0
 	ldr	w0, [x28, 44]
-	cbnz	w0, .L821
-	.loc 1 1490 0
+	cbnz	w0, .L890
+	.loc 1 1966 0
 	ldr	w0, [x28, 200]
-	.loc 1 1488 0
+	.loc 1 1964 0
 	mov	w1, 1
-	.loc 1 1489 0
+	.loc 1 1965 0
 	str	wzr, [x28, 92]
-	.loc 1 1488 0
+	.loc 1 1964 0
 	str	w1, [x28, 44]
-	.loc 1 1490 0
-	cbz	w0, .L960
-.L842:
-	.loc 1 1492 0
+	.loc 1 1966 0
+	cbz	w0, .L1028
+.L911:
+	.loc 1 1968 0
+	mov	w1, 16
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL893:
+.LVL966:
 	cmn	w0, #1
-	beq	.L821
-	.loc 1 1496 0
+	beq	.L890
+	.loc 1 1972 0
 	ldr	w3, [x28, 112]
-	.loc 1 1499 0
-	adrp	x1, .LC89
-	.loc 1 1496 0
+	.loc 1 1975 0
+	adrp	x1, .LC90
+	.loc 1 1972 0
 	strb	w3, [x28, 48]
-	.loc 1 1499 0
-	add	x1, x1, :lo12:.LC89
+	.loc 1 1975 0
+	add	x1, x1, :lo12:.LC90
 	ldr	x0, [x28, 104]
-	b	.L924
-.LVL894:
+	b	.L992
+.LVL967:
 	.p2align 3
-.L934:
-.LBB1820:
-.LBB1796:
+.L1009:
+.LBB1869:
+.LBB1856:
 	.loc 1 409 0
 	orr	w4, w4, 240
-	b	.L826
+	b	.L895
 	.p2align 3
-.L935:
+.L1010:
 	.loc 1 415 0
 	orr	w4, w4, 3840
-	b	.L828
+	b	.L897
 	.p2align 3
-.L936:
+.L1011:
 	.loc 1 421 0
 	orr	w4, w4, 61440
-	b	.L830
-.LVL895:
-.L951:
-.LBE1796:
-.LBE1820:
-	.loc 1 1654 0
+	b	.L899
+	.p2align 3
+.L1012:
+	.loc 1 427 0
+	orr	w4, w4, 983040
+	b	.L901
+.LVL968:
+.L1019:
+.LBE1856:
+.LBE1869:
+	.loc 1 2124 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC95
-	add	x1, x1, :lo12:.LC95
+	adrp	x1, .LC96
+	add	x1, x1, :lo12:.LC96
 	bl	_dev_info
-.LVL896:
-	.loc 1 1655 0
+.LVL969:
+	.loc 1 2125 0
 	ldr	w0, [x28, 616]
-	cbz	w0, .L961
-.L862:
-	.loc 1 1660 0
+	cbz	w0, .L1029
+.L931:
+	.loc 1 2130 0
 	add	x0, x21, :lo12:.LANCHOR0
-	.loc 1 1658 0
+	.loc 1 2128 0
 	mov	w2, 1
-	.loc 1 1657 0
+	.loc 1 2127 0
 	str	wzr, [x28, 204]
-	.loc 1 1661 0
+	.loc 1 2131 0
 	mov	w1, w2
-	.loc 1 1658 0
+	.loc 1 2128 0
 	str	w2, [x28, 616]
-	.loc 1 1659 0
+	.loc 1 2129 0
 	str	wzr, [x28, 632]
-	.loc 1 1660 0
+	.loc 1 2130 0
 	str	wzr, [x0, 16]
-	.loc 1 1661 0
+	.loc 1 2131 0
 	add	x0, x22, 328
 	bl	__wake_up_sync
-.LVL897:
-	b	.L861
-.L961:
-	.loc 1 1656 0
+.LVL970:
+	b	.L930
+.LVL971:
+.L1000:
+	.loc 1 1925 0
+	ldr	x0, [x28, 104]
+	adrp	x1, .LC87
+	add	x1, x1, :lo12:.LC87
+	bl	_dev_info
+.LVL972:
+.LBB1870:
+	.loc 1 1926 0
+	ldr	w0, [x28, 92]
+	cbz	w0, .L1030
+.L874:
+.LVL973:
+.L872:
+.LBE1870:
+	.loc 1 1927 0 discriminator 11
+	ldr	x0, [x28, 104]
+.LVL974:
+	adrp	x1, .LC88
+	add	x1, x1, :lo12:.LC88
+	bl	_dev_info
+.LVL975:
+	b	.L991
+.L1026:
+	.loc 1 2002 0
+	mov	x0, x20
+	bl	ebc_power_set.constprop.16
+.LVL976:
+	b	.L914
+.LVL977:
+.L1029:
+	.loc 1 2126 0
 	mov	x0, 2
 	bl	ebc_notify
-.LVL898:
-	b	.L862
-.LVL899:
-.L959:
-.LBB1821:
-.LBB1816:
-.LBB1817:
-	.loc 1 1450 0 discriminator 1
-	add	x26, x22, 352
-.LVL900:
-.LBE1817:
-	mov	w1, 0
-	add	x0, x29, 112
-	bl	init_wait_entry
-.LVL901:
-	b	.L805
-	.p2align 3
-.L962:
-.LVL902:
-.LBB1818:
-	.loc 1 1450 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L802
-	.loc 1 1450 0 discriminator 7
-	bl	schedule
-.LVL903:
-.L805:
-	.loc 1 1450 0 discriminator 9
-	add	x1, x29, 112
-	mov	w2, 1
-	mov	x0, x26
-	bl	prepare_to_wait_event
-.LVL904:
-	ldr	w1, [x28, 92]
-	cbz	w1, .L962
-.LBE1818:
-	.loc 1 1450 0 discriminator 4
-	mov	x0, x26
-	add	x1, x29, 112
-	bl	finish_wait
-.LVL905:
-	b	.L802
-.LVL906:
-.L931:
-.LBE1816:
-.LBE1821:
-	.loc 1 1399 0 is_stmt 1
+.LVL978:
+	b	.L931
+.L1022:
+	.loc 1 1890 0
+	ldr	x0, [x28, 104]
+	adrp	x1, .LC84
+	add	x1, x1, :lo12:.LC84
+	.loc 1 1937 0
+	bl	_dev_info
+.LVL979:
+	b	.L990
+.L999:
+	.loc 1 1867 0
 	str	wzr, [x28, 616]
-	.loc 1 1400 0
+	.loc 1 1868 0
 	mov	x0, 3
 	bl	ebc_notify
-.LVL907:
-	.loc 1 1401 0
+.LVL980:
+	.loc 1 1869 0
 	ldr	x0, [x28, 104]
 	adrp	x1, .LC82
 	add	x1, x1, :lo12:.LC82
 	bl	_dev_info
-.LVL908:
-	.loc 1 1404 0
-	ldr	w1, [x28, 20]
-	.loc 1 1402 0
-	add	x2, x21, :lo12:.LANCHOR0
-	.loc 1 1404 0
+.LVL981:
+	.loc 1 1872 0
+	ldr	w2, [x20, 204]
+	.loc 1 1870 0
+	add	x3, x21, :lo12:.LANCHOR0
+	.loc 1 1872 0
+	ldr	w1, [x24, 64]
+	.loc 1 1870 0
+	mov	w4, 1
+	.loc 1 1872 0
 	ldr	x0, [x24, 16]
-	.loc 1 1402 0
-	mov	w3, 1
-	.loc 1 1403 0
-	stp	w3, wzr, [x2, 16]
-	.loc 1 1404 0
-	bl	check_black_percent
-.LVL909:
-	cbnz	w0, .L783
-	b	.L791
-.LVL910:
-.L956:
-.LBB1822:
-.LBB1812:
-.LBB1813:
-	.loc 1 1626 0 discriminator 1
+	.loc 1 1871 0
+	stp	w4, wzr, [x3, 16]
+	.loc 1 1872 0
+	bl	check_black_percent.isra.14
+.LVL982:
+	cbnz	w0, .L852
+	b	.L860
+.L1002:
+.LBB1874:
+.LBB1875:
+	mov	w1, 0
+	mov	x0, x20
+	bl	ebc_power_set.part.12
+.LVL983:
+	b	.L854
+.LVL984:
+.L1025:
+.LBE1875:
+.LBE1874:
+.LBB1876:
+.LBB1865:
+.LBB1866:
+	.loc 1 2096 0 discriminator 1
 	add	x27, x22, 352
-.LBE1813:
+.LBE1866:
 	mov	w1, 0
-	add	x0, x29, 112
+	add	x0, x29, 120
 	bl	init_wait_entry
-.LVL911:
-	b	.L859
+.LVL985:
+	b	.L928
 	.p2align 3
-.L963:
-.LVL912:
-.LBB1814:
-	.loc 1 1626 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L856
-	.loc 1 1626 0 discriminator 7
+.L1031:
+.LVL986:
+.LBB1867:
+	.loc 1 2096 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L925
+	.loc 1 2096 0 discriminator 7
 	bl	schedule
-.LVL913:
-.L859:
-	.loc 1 1626 0 discriminator 9
-	add	x1, x29, 112
+.LVL987:
+.L928:
+	.loc 1 2096 0 discriminator 9
+	add	x1, x29, 120
 	mov	w2, 1
 	mov	x0, x27
 	bl	prepare_to_wait_event
-.LVL914:
+.LVL988:
 	ldr	w1, [x28, 92]
-	cbz	w1, .L963
-.LBE1814:
-	.loc 1 1626 0 discriminator 4
+	cbz	w1, .L1031
+.LBE1867:
+	.loc 1 2096 0 discriminator 4
 	mov	x0, x27
-	add	x1, x29, 112
+	add	x1, x29, 120
 	bl	finish_wait
-.LVL915:
-	b	.L856
-.LVL916:
-.L944:
-.LBE1812:
-.LBE1822:
-.LBB1823:
-.LBB1824:
-	mov	w1, 0
-	mov	x0, x20
-	bl	ebc_power_set.part.8
-.LVL917:
-	b	.L785
-.LVL918:
-.L957:
-.LBE1824:
-.LBE1823:
-	.loc 1 1529 0 is_stmt 1
-	mov	x0, x20
-	bl	ebc_power_set.constprop.11
-.LVL919:
-	b	.L845
-.L958:
-	.loc 1 1531 0
+.LVL989:
+	b	.L925
+.LVL990:
+.L1027:
+.LBE1865:
+.LBE1876:
+	.loc 1 2004 0 is_stmt 1
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC90
-	add	x1, x1, :lo12:.LC90
+	adrp	x1, .LC91
+	add	x1, x1, :lo12:.LC91
 	bl	_dev_err
-.LVL920:
-	.loc 1 1532 0
-	b	.L821
-.LVL921:
-.L960:
-	.loc 1 1491 0
+.LVL991:
+	.loc 1 2005 0
+	b	.L890
+.L1030:
+.LBB1877:
+.LBB1871:
+.LBB1872:
+	.loc 1 1926 0 discriminator 1
+	add	x26, x22, 352
+.LVL992:
+.LBE1872:
+	mov	w1, 0
+	add	x0, x29, 120
+	bl	init_wait_entry
+.LVL993:
+	b	.L875
+	.p2align 3
+.L1032:
+.LVL994:
+.LBB1873:
+	.loc 1 1926 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L872
+	.loc 1 1926 0 discriminator 7
+	bl	schedule
+.LVL995:
+.L875:
+	.loc 1 1926 0 discriminator 9
+	add	x1, x29, 120
+	mov	w2, 1
+	mov	x0, x26
+	bl	prepare_to_wait_event
+.LVL996:
+	ldr	w1, [x28, 92]
+	cbz	w1, .L1032
+.LBE1873:
+	.loc 1 1926 0 discriminator 4
+	mov	x0, x26
+	add	x1, x29, 120
+	bl	finish_wait
+.LVL997:
+	b	.L872
+.LVL998:
+.L1028:
+.LBE1871:
+.LBE1877:
+	.loc 1 1967 0 is_stmt 1
 	mov	x0, x20
-	bl	ebc_power_set.constprop.11
-.LVL922:
-	b	.L842
-.LVL923:
-.L954:
-	.loc 1 1434 0
+	bl	ebc_power_set.constprop.16
+.LVL999:
+	b	.L911
+.LVL1000:
+.L1023:
+	.loc 1 1909 0
 	mov	x0, x20
-	bl	ebc_power_set.constprop.11
-.LVL924:
-	b	.L797
-.LVL925:
-.L945:
-	.loc 1 1694 0
+	bl	ebc_power_set.constprop.16
+.LVL1001:
+	b	.L867
+.LVL1002:
+.L1003:
+	.loc 1 2164 0
 	bl	__stack_chk_fail
-.LVL926:
+.LVL1003:
 	.cfi_endproc
-.LFE2828:
+.LFE2835:
 	.size	ebc_thread, .-ebc_thread
 	.data
 	.align	3
@@ -10097,7 +11272,7 @@ ebc_driver:
 	.xword	ebc_probe
 	.xword	ebc_remove
 	.zero	24
-	.xword	.LC97
+	.xword	.LC98
 	.zero	32
 	.xword	ebc_match
 	.zero	64
@@ -10145,13 +11320,13 @@ ebc_auto_thread_sem:
 waveform_misc:
 	.word	244
 	.zero	4
-	.xword	.LC105
+	.xword	.LC106
 	.xword	waveform_ops
 	.zero	56
 	.type	dev_attr_waveform_version, %object
 	.size	dev_attr_waveform_version, 32
 dev_attr_waveform_version:
-	.xword	.LC104
+	.xword	.LC105
 	.hword	292
 	.zero	6
 	.xword	waveform_version_read
@@ -10159,7 +11334,7 @@ dev_attr_waveform_version:
 	.type	dev_attr_pmic_name, %object
 	.size	dev_attr_pmic_name, 32
 dev_attr_pmic_name:
-	.xword	.LC103
+	.xword	.LC104
 	.hword	292
 	.zero	6
 	.xword	pmic_name_read
@@ -10167,7 +11342,7 @@ dev_attr_pmic_name:
 	.type	dev_attr_pmic_temp, %object
 	.size	dev_attr_pmic_temp, 32
 dev_attr_pmic_temp:
-	.xword	.LC102
+	.xword	.LC103
 	.hword	292
 	.zero	6
 	.xword	pmic_temp_read
@@ -10175,7 +11350,7 @@ dev_attr_pmic_temp:
 	.type	dev_attr_pmic_vcom, %object
 	.size	dev_attr_pmic_vcom, 32
 dev_attr_pmic_vcom:
-	.xword	.LC101
+	.xword	.LC102
 	.hword	420
 	.zero	6
 	.xword	pmic_vcom_read
@@ -10183,7 +11358,7 @@ dev_attr_pmic_vcom:
 	.type	dev_attr_ebc_version, %object
 	.size	dev_attr_ebc_version, 32
 dev_attr_ebc_version:
-	.xword	.LC100
+	.xword	.LC101
 	.hword	292
 	.zero	6
 	.xword	ebc_version_read
@@ -10191,7 +11366,7 @@ dev_attr_ebc_version:
 	.type	dev_attr_ebc_state, %object
 	.size	dev_attr_ebc_state, 32
 dev_attr_ebc_state:
-	.xword	.LC99
+	.xword	.LC100
 	.hword	292
 	.zero	6
 	.xword	ebc_state_read
@@ -10199,7 +11374,7 @@ dev_attr_ebc_state:
 	.type	dev_attr_ebc_buf_state, %object
 	.size	dev_attr_ebc_buf_state, 32
 dev_attr_ebc_buf_state:
-	.xword	.LC98
+	.xword	.LC99
 	.hword	292
 	.zero	6
 	.xword	ebc_buf_state_read
@@ -10236,24 +11411,24 @@ resume_frame_count:
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.35011, %object
-	.size	__func__.35011, 11
-__func__.35011:
+	.type	__func__.35181, %object
+	.size	__func__.35181, 11
+__func__.35181:
 	.string	"ebc_io_ctl"
 	.align	3
 	.set	.LANCHOR3,. + 0
-	.type	__func__.34785, %object
-	.size	__func__.34785, 16
-__func__.34785:
+	.type	__func__.34953, %object
+	.size	__func__.34953, 16
+__func__.34953:
 	.string	"ebc_frame_start"
-	.type	__func__.35321, %object
-	.size	__func__.35321, 12
-__func__.35321:
+	.type	__func__.35491, %object
+	.size	__func__.35491, 12
+__func__.35491:
 	.string	"ebc_suspend"
 	.zero	4
-	.type	__func__.35255, %object
-	.size	__func__.35255, 19
-__func__.35255:
+	.type	__func__.35425, %object
+	.size	__func__.35425, 19
+__func__.35425:
 	.string	"ebc_lut_table_init"
 	.zero	5
 	.type	ebc_match, %object
@@ -10293,9 +11468,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init2636, %object
-	.size	__addressable_ebc_init2636, 8
-__addressable_ebc_init2636:
+	.type	__addressable_ebc_init3102, %object
+	.size	__addressable_ebc_init3102, 8
+__addressable_ebc_init3102:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -10335,52 +11510,52 @@ __exitcall_ebc_exit:
 	.string	"frame done\n"
 	.zero	4
 .LC10:
-	.string	"black point > 90percent, skip this frame\n"
-	.zero	6
-.LC11:
 	.string	"temperature = %d, out of range0~50 ,use 0 \n"
 	.zero	4
-.LC12:
+.LC11:
 	.string	"temperature = %d, out of range0~50 ,use 50 \n"
 	.zero	3
-.LC13:
+.LC12:
 	.string	"ebc_pmic_read_temp failed, ret = %d\n"
 	.zero	3
-.LC14:
+.LC13:
 	.string	"lut update use temperature = %d\n"
 	.zero	7
-.LC15:
+.LC14:
 	.string	"get lut data failed\n"
 	.zero	3
-.LC16:
+.LC15:
 	.string	"%d\n"
 	.zero	4
-.LC17:
-	.string	"2.14"
+.LC16:
+	.string	"2.15"
 	.zero	3
-.LC18:
+.LC17:
 	.string	"%s\n"
 	.zero	4
-.LC19:
+.LC18:
 	.string	"invalid value = %s\n"
 	.zero	4
-.LC20:
+.LC19:
 	.string	"set vcom value failed\n"
 	.zero	1
-.LC21:
+.LC20:
 	.string	"%s: overlay no need to update\n"
 	.zero	1
-.LC22:
+.LC21:
 	.string	"%s: auto no need to update\n"
 	.zero	4
-.LC23:
+.LC22:
 	.string	"ebc hw power off\n"
 	.zero	6
-.LC24:
+.LC23:
 	.string	"%s: device is busy now...\n"
 	.zero	5
-.LC25:
+.LC24:
 	.string	"device suspend\n"
+.LC25:
+	.string	"black point > 90percent, skip this frame\n"
+	.zero	6
 .LC26:
 	.string	"ebc_tcon"
 	.zero	7
@@ -10549,68 +11724,71 @@ __exitcall_ebc_exit:
 	.string	"refresh suspend logo\n"
 	.zero	2
 .LC84:
+	.string	"overlay mode not support 8bit background\n"
+	.zero	6
+.LC85:
 	.string	"overlay mode start, update background, frame_total=%d\n"
 	.zero	1
-.LC85:
+.LC86:
 	.string	"change display mode from %d to %d\n"
 	.zero	5
-.LC86:
+.LC87:
 	.string	"ebc is busy now, waiting prev refresh mode end...\n"
 	.zero	5
-.LC87:
+.LC88:
 	.string	"prev refresh mode end\n"
 	.zero	1
-.LC88:
+.LC89:
 	.string	"overlay disabled, drop EPD_OVERLAY frame\n"
 	.zero	6
-.LC89:
+.LC90:
 	.string	"overlay mode start, frame_total=%d\n"
 	.zero	4
-.LC90:
+.LC91:
 	.string	"ebc_lut_update err\n"
 	.zero	4
-.LC91:
+.LC92:
 	.string	"auto mode start, frame_total=%d\n"
 	.zero	7
-.LC92:
+.LC93:
 	.string	"frame start, mode = %d, framecount = %d\n"
 	.zero	7
-.LC93:
+.LC94:
 	.string	"ebc buffer mode %d error!!!\n"
 	.zero	3
-.LC94:
+.LC95:
 	.string	"power off\n"
 	.zero	5
-.LC95:
+.LC96:
 	.string	"early suspend\n"
 	.zero	1
-.LC96:
+.LC97:
 	.string	"check_part_mode==0, no need refresh\n"
 	.zero	3
-.LC97:
-	.string	"ebc-dev"
 .LC98:
+	.string	"ebc-dev"
+.LC99:
 	.string	"ebc_buf_state"
 	.zero	2
-.LC99:
+.LC100:
 	.string	"ebc_state"
 	.zero	6
-.LC100:
+.LC101:
 	.string	"ebc_version"
 	.zero	4
-.LC101:
+.LC102:
 	.string	"pmic_vcom"
 	.zero	6
-.LC102:
+.LC103:
 	.string	"pmic_temp"
 	.zero	6
-.LC103:
+.LC104:
 	.string	"pmic_name"
 	.zero	6
-.LC104:
+.LC105:
 	.string	"waveform_version"
 	.zero	7
-.LC105:
+.LC106:
 	.string	"waveform"
 	.text
 .Letext0:
@@ -10812,16 +11990,16 @@ __exitcall_ebc_exit:
 	.file 214 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x148bd
+	.4byte	0x152cc
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF3320
+	.4byte	.LASF3331
 	.byte	0x1
-	.4byte	.LASF3321
-	.4byte	.LASF3322
-	.4byte	.Ldebug_ranges0+0x1160
+	.4byte	.LASF3332
+	.4byte	.LASF3333
+	.4byte	.Ldebug_ranges0+0x12a0
 	.8byte	0
 	.4byte	.Ldebug_line0
 	.uleb128 0x2
@@ -28420,7 +29598,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x3
 	.4byte	0x9294
 	.uleb128 0x48
-	.4byte	.LASF3047
+	.4byte	.LASF3048
 	.byte	0x1f
 	.2byte	0xba2
 	.4byte	0x92a4
@@ -32889,121 +34067,121 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2413
 	.byte	0xa
 	.byte	0x85
-	.4byte	0xdcd4
+	.4byte	0xdcec
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF2414
 	.byte	0xa
 	.byte	0x88
-	.4byte	0xdcf9
+	.4byte	0xdd11
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF109
 	.byte	0xa
 	.byte	0x8b
-	.4byte	0xdd27
+	.4byte	0xdd3f
 	.byte	0x10
 	.uleb128 0xe
 	.4byte	.LASF2415
 	.byte	0xa
 	.byte	0x8f
-	.4byte	0xdd5b
+	.4byte	0xdd73
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF2416
 	.byte	0xa
 	.byte	0x92
-	.4byte	0xdd89
+	.4byte	0xdda1
 	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF2417
 	.byte	0xa
 	.byte	0x96
-	.4byte	0xddae
+	.4byte	0xddc6
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF2418
 	.byte	0xa
 	.byte	0x9d
-	.4byte	0xddd7
+	.4byte	0xddef
 	.byte	0x30
 	.uleb128 0xe
 	.4byte	.LASF2419
 	.byte	0xa
 	.byte	0xa0
-	.4byte	0xddfc
+	.4byte	0xde14
 	.byte	0x38
 	.uleb128 0xe
 	.4byte	.LASF2420
 	.byte	0xa
 	.byte	0xa4
-	.4byte	0xde25
+	.4byte	0xde3d
 	.byte	0x40
 	.uleb128 0xe
 	.4byte	.LASF2421
 	.byte	0xa
 	.byte	0xa7
-	.4byte	0xddae
+	.4byte	0xddc6
 	.byte	0x48
 	.uleb128 0xe
 	.4byte	.LASF2422
 	.byte	0xa
 	.byte	0xaa
-	.4byte	0xde45
+	.4byte	0xde5d
 	.byte	0x50
 	.uleb128 0xe
 	.4byte	.LASF2423
 	.byte	0xa
 	.byte	0xad
-	.4byte	0xde45
+	.4byte	0xde5d
 	.byte	0x58
 	.uleb128 0xe
 	.4byte	.LASF2424
 	.byte	0xa
 	.byte	0xb0
-	.4byte	0xde65
+	.4byte	0xde7d
 	.byte	0x60
 	.uleb128 0xe
 	.4byte	.LASF2425
 	.byte	0xa
 	.byte	0xb3
-	.4byte	0xde65
+	.4byte	0xde7d
 	.byte	0x68
 	.uleb128 0xe
 	.4byte	.LASF2426
 	.byte	0xa
 	.byte	0xb6
-	.4byte	0xde85
+	.4byte	0xde9d
 	.byte	0x70
 	.uleb128 0xe
 	.4byte	.LASF2427
 	.byte	0xa
 	.byte	0xb8
-	.4byte	0xde9f
+	.4byte	0xdeb7
 	.byte	0x78
 	.uleb128 0xe
 	.4byte	.LASF2428
 	.byte	0xa
 	.byte	0xb9
-	.4byte	0xdeb9
+	.4byte	0xded1
 	.byte	0x80
 	.uleb128 0xe
 	.4byte	.LASF2429
 	.byte	0xa
 	.byte	0xba
-	.4byte	0xdeb9
+	.4byte	0xded1
 	.byte	0x88
 	.uleb128 0xe
 	.4byte	.LASF2430
 	.byte	0xa
 	.byte	0xbb
-	.4byte	0xdee2
+	.4byte	0xdefa
 	.byte	0x90
 	.uleb128 0xe
 	.4byte	.LASF2431
 	.byte	0xa
 	.byte	0xbd
-	.4byte	0xdefd
+	.4byte	0xdf15
 	.byte	0x98
 	.uleb128 0xe
 	.4byte	.LASF130
@@ -37021,10 +38199,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0xd
 	.4byte	.LASF2878
-	.byte	0x40
+	.byte	0x48
 	.byte	0xc3
 	.byte	0x16
-	.4byte	0xd9e1
+	.4byte	0xd9ed
 	.uleb128 0xe
 	.4byte	.LASF760
 	.byte	0xc3
@@ -37085,166 +38263,178 @@ __exitcall_ebc_exit:
 	.byte	0x20
 	.4byte	0xc6
 	.byte	0x3c
+	.uleb128 0xe
+	.4byte	.LASF2887
+	.byte	0xc3
+	.byte	0x21
+	.4byte	0xc6
+	.byte	0x40
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF2887
+	.4byte	.LASF2888
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc4
-	.byte	0x3b
-	.4byte	0xda82
+	.byte	0x3e
+	.4byte	0xda8e
 	.uleb128 0xc
-	.4byte	.LASF2888
+	.4byte	.LASF2889
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2889
+	.4byte	.LASF2890
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2890
+	.4byte	.LASF2891
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2891
+	.4byte	.LASF2892
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2892
+	.4byte	.LASF2893
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF2893
+	.4byte	.LASF2894
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF2894
+	.4byte	.LASF2895
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF2895
+	.4byte	.LASF2896
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF2896
+	.4byte	.LASF2897
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF2897
+	.4byte	.LASF2898
 	.byte	0x9
 	.uleb128 0xc
-	.4byte	.LASF2898
+	.4byte	.LASF2899
 	.byte	0xa
 	.uleb128 0xc
-	.4byte	.LASF2899
+	.4byte	.LASF2900
 	.byte	0xb
 	.uleb128 0xc
-	.4byte	.LASF2900
+	.4byte	.LASF2901
 	.byte	0xc
 	.uleb128 0xc
-	.4byte	.LASF2901
+	.4byte	.LASF2902
 	.byte	0xd
 	.uleb128 0xc
-	.4byte	.LASF2902
+	.4byte	.LASF2903
 	.byte	0xe
 	.uleb128 0xc
-	.4byte	.LASF2903
+	.4byte	.LASF2904
 	.byte	0xf
 	.uleb128 0xc
-	.4byte	.LASF2904
+	.4byte	.LASF2905
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF2905
+	.4byte	.LASF2906
 	.byte	0x11
 	.uleb128 0xc
-	.4byte	.LASF2906
+	.4byte	.LASF2907
 	.byte	0x12
 	.uleb128 0xc
-	.4byte	.LASF2907
+	.4byte	.LASF2908
 	.byte	0x13
 	.uleb128 0xc
-	.4byte	.LASF2908
+	.4byte	.LASF2909
 	.byte	0x14
 	.uleb128 0xc
-	.4byte	.LASF2909
+	.4byte	.LASF2910
 	.byte	0x15
 	.uleb128 0xc
-	.4byte	.LASF2910
+	.4byte	.LASF2911
 	.byte	0x16
 	.uleb128 0xc
-	.4byte	.LASF2911
+	.4byte	.LASF2912
 	.byte	0x17
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2912
-	.byte	0x2c
+	.4byte	.LASF2913
+	.byte	0x30
 	.byte	0xc4
-	.byte	0x59
-	.4byte	0xdb13
+	.byte	0x5c
+	.4byte	0xdb2b
 	.uleb128 0xe
 	.4byte	.LASF898
 	.byte	0xc4
-	.byte	0x5a
+	.byte	0x5d
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2913
+	.4byte	.LASF2914
 	.byte	0xc4
-	.byte	0x5b
+	.byte	0x5e
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF2914
+	.4byte	.LASF2915
 	.byte	0xc4
-	.byte	0x5c
+	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF262
 	.byte	0xc4
-	.byte	0x5d
+	.byte	0x60
 	.4byte	0xc6
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF2915
+	.4byte	.LASF2916
 	.byte	0xc4
-	.byte	0x5e
+	.byte	0x61
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
 	.4byte	.LASF2883
 	.byte	0xc4
-	.byte	0x5f
+	.byte	0x62
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
 	.4byte	.LASF2884
 	.byte	0xc4
-	.byte	0x60
+	.byte	0x63
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF2885
 	.byte	0xc4
-	.byte	0x61
+	.byte	0x64
 	.4byte	0xc6
 	.byte	0x1c
 	.uleb128 0xe
 	.4byte	.LASF2886
 	.byte	0xc4
-	.byte	0x62
+	.byte	0x65
 	.4byte	0xc6
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2916
+	.4byte	.LASF2917
 	.byte	0xc4
-	.byte	0x63
+	.byte	0x66
 	.4byte	0xc6
 	.byte	0x24
 	.uleb128 0xe
-	.4byte	.LASF2917
+	.4byte	.LASF2918
 	.byte	0xc4
-	.byte	0x64
+	.byte	0x67
 	.4byte	0xc6
 	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF2887
+	.byte	0xc4
+	.byte	0x68
+	.4byte	0xc6
+	.byte	0x2c
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2918
+	.4byte	.LASF2919
 	.byte	0x50
 	.byte	0x3
 	.byte	0x10
-	.4byte	0xdb8c
+	.4byte	0xdba4
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x3
@@ -37252,134 +38442,134 @@ __exitcall_ebc_exit:
 	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2919
+	.4byte	.LASF2920
 	.byte	0x3
 	.byte	0x12
 	.4byte	0x4848
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2920
+	.4byte	.LASF2921
 	.byte	0x3
 	.byte	0x13
 	.4byte	0x458
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2921
+	.4byte	.LASF2922
 	.byte	0x3
 	.byte	0x14
-	.4byte	0xdba2
+	.4byte	0xdbba
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2922
+	.4byte	.LASF2923
 	.byte	0x3
 	.byte	0x15
-	.4byte	0xdbb3
+	.4byte	0xdbcb
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2923
+	.4byte	.LASF2924
 	.byte	0x3
 	.byte	0x16
-	.4byte	0xdbb3
+	.4byte	0xdbcb
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2924
+	.4byte	.LASF2925
 	.byte	0x3
 	.byte	0x17
-	.4byte	0xdbcd
+	.4byte	0xdbe5
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2925
+	.4byte	.LASF2926
 	.byte	0x3
 	.byte	0x18
-	.4byte	0xdbe2
+	.4byte	0xdbfa
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2926
+	.4byte	.LASF2927
 	.byte	0x3
 	.byte	0x19
-	.4byte	0xdbfc
+	.4byte	0xdc14
 	.byte	0x48
 	.byte	0
 	.uleb128 0x10
-	.4byte	0xdb9c
+	.4byte	0xdbb4
 	.uleb128 0x11
-	.4byte	0xdb9c
+	.4byte	0xdbb4
 	.uleb128 0x11
 	.4byte	0x2b0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb13
+	.4byte	0xdb2b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb8c
+	.4byte	0xdba4
 	.uleb128 0x10
-	.4byte	0xdbb3
+	.4byte	0xdbcb
 	.uleb128 0x11
-	.4byte	0xdb9c
+	.4byte	0xdbb4
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdba8
+	.4byte	0xdbc0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdbcd
+	.4byte	0xdbe5
 	.uleb128 0x11
-	.4byte	0xdb9c
+	.4byte	0xdbb4
 	.uleb128 0x11
 	.4byte	0x46ee
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdbb9
+	.4byte	0xdbd1
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdbe2
+	.4byte	0xdbfa
 	.uleb128 0x11
-	.4byte	0xdb9c
+	.4byte	0xdbb4
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdbd3
+	.4byte	0xdbeb
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdbfc
+	.4byte	0xdc14
 	.uleb128 0x11
-	.4byte	0xdb9c
+	.4byte	0xdbb4
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdbe8
+	.4byte	0xdc00
 	.uleb128 0x1f
-	.4byte	.LASF2927
+	.4byte	.LASF2928
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc5
 	.byte	0x5
-	.4byte	0xdc2b
+	.4byte	0xdc43
 	.uleb128 0xc
-	.4byte	.LASF2928
+	.4byte	.LASF2929
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2929
+	.4byte	.LASF2930
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2930
+	.4byte	.LASF2931
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2931
+	.4byte	.LASF2932
 	.byte	0x3
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2932
+	.4byte	.LASF2933
 	.byte	0x20
 	.byte	0xc6
 	.byte	0xb
-	.4byte	0xdc74
+	.4byte	0xdc8c
 	.uleb128 0xe
-	.4byte	.LASF2933
+	.4byte	.LASF2934
 	.byte	0xc6
 	.byte	0xc
 	.4byte	0x29
@@ -37397,38 +38587,38 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF2934
+	.4byte	.LASF2935
 	.byte	0xc6
 	.byte	0xf
 	.4byte	0x325
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2935
+	.4byte	.LASF2936
 	.byte	0xc6
 	.byte	0x11
 	.4byte	0x6d
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2936
+	.4byte	.LASF2937
 	.byte	0x10
 	.byte	0xc6
 	.byte	0x2a
-	.4byte	0xdca5
+	.4byte	0xdcbd
 	.uleb128 0x20
 	.string	"sgl"
 	.byte	0xc6
 	.byte	0x2b
-	.4byte	0xdca5
+	.4byte	0xdcbd
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2937
+	.4byte	.LASF2938
 	.byte	0xc6
 	.byte	0x2c
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2938
+	.4byte	.LASF2939
 	.byte	0xc6
 	.byte	0x2d
 	.4byte	0x6d
@@ -37436,16 +38626,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc2b
+	.4byte	0xdc43
 	.uleb128 0x14
 	.4byte	0x458
-	.4byte	0xdcce
+	.4byte	0xdce6
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdcce
+	.4byte	0xdce6
 	.uleb128 0x11
 	.4byte	0x330
 	.uleb128 0x11
@@ -37456,9 +38646,9 @@ __exitcall_ebc_exit:
 	.4byte	0x325
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdcab
+	.4byte	0xdcc3
 	.uleb128 0x10
-	.4byte	0xdcf9
+	.4byte	0xdd11
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -37472,10 +38662,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdcda
+	.4byte	0xdcf2
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdd27
+	.4byte	0xdd3f
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -37491,14 +38681,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdcff
+	.4byte	0xdd17
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdd55
+	.4byte	0xdd6d
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0xdd55
+	.4byte	0xdd6d
 	.uleb128 0x11
 	.4byte	0x458
 	.uleb128 0x11
@@ -37510,13 +38700,13 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc74
+	.4byte	0xdc8c
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd2d
+	.4byte	0xdd45
 	.uleb128 0x14
 	.4byte	0x325
-	.4byte	0xdd89
+	.4byte	0xdda1
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -37526,15 +38716,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdc02
+	.4byte	0xdc1a
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd61
+	.4byte	0xdd79
 	.uleb128 0x10
-	.4byte	0xddae
+	.4byte	0xddc6
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -37542,49 +38732,49 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdc02
+	.4byte	0xdc1a
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd8f
+	.4byte	0xdda7
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xddd7
+	.4byte	0xddef
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0xdca5
+	.4byte	0xdcbd
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdc02
+	.4byte	0xdc1a
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xddb4
+	.4byte	0xddcc
 	.uleb128 0x10
-	.4byte	0xddfc
+	.4byte	0xde14
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0xdca5
+	.4byte	0xdcbd
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdc02
+	.4byte	0xdc1a
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdddd
+	.4byte	0xddf5
 	.uleb128 0x14
 	.4byte	0x325
-	.4byte	0xde25
+	.4byte	0xde3d
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -37592,15 +38782,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdc02
+	.4byte	0xdc1a
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde02
+	.4byte	0xde1a
 	.uleb128 0x10
-	.4byte	0xde45
+	.4byte	0xde5d
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -37608,27 +38798,27 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdc02
+	.4byte	0xdc1a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde2b
+	.4byte	0xde43
 	.uleb128 0x10
-	.4byte	0xde65
+	.4byte	0xde7d
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0xdca5
+	.4byte	0xdcbd
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdc02
+	.4byte	0xdc1a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde4b
+	.4byte	0xde63
 	.uleb128 0x10
-	.4byte	0xde85
+	.4byte	0xde9d
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -37636,14 +38826,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdc02
+	.4byte	0xdc1a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde6b
+	.4byte	0xde83
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xde9f
+	.4byte	0xdeb7
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -37651,10 +38841,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde8b
+	.4byte	0xdea3
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdeb9
+	.4byte	0xded1
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -37662,10 +38852,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdea5
+	.4byte	0xdebd
 	.uleb128 0x14
 	.4byte	0x458
-	.4byte	0xdee2
+	.4byte	0xdefa
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -37679,9 +38869,9 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdebf
+	.4byte	0xded7
 	.uleb128 0x10
-	.4byte	0xdefd
+	.4byte	0xdf15
 	.uleb128 0x11
 	.4byte	0xa5e0
 	.uleb128 0x11
@@ -37691,58 +38881,58 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdee8
+	.4byte	0xdf00
 	.uleb128 0x19
-	.4byte	.LASF2939
+	.4byte	.LASF2940
 	.byte	0xa
 	.byte	0xc9
 	.4byte	0xb824
 	.uleb128 0x19
-	.4byte	.LASF2940
+	.4byte	.LASF2941
 	.byte	0xa
 	.byte	0xca
 	.4byte	0xb824
 	.uleb128 0x19
-	.4byte	.LASF2941
+	.4byte	.LASF2942
 	.byte	0xa
 	.byte	0xcb
 	.4byte	0xb824
 	.uleb128 0x24
-	.4byte	.LASF2942
-	.uleb128 0x19
 	.4byte	.LASF2943
+	.uleb128 0x19
+	.4byte	.LASF2944
 	.byte	0xc7
 	.byte	0x7
-	.4byte	0xdf34
+	.4byte	0xdf4c
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdf24
+	.4byte	0xdf3c
 	.uleb128 0x24
-	.4byte	.LASF2944
-	.uleb128 0x19
 	.4byte	.LASF2945
+	.uleb128 0x19
+	.4byte	.LASF2946
 	.byte	0xc7
 	.byte	0x8
-	.4byte	0xdf4a
+	.4byte	0xdf62
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdf3a
+	.4byte	0xdf52
 	.uleb128 0x19
-	.4byte	.LASF2946
+	.4byte	.LASF2947
 	.byte	0xc7
 	.byte	0x16
 	.4byte	0xb829
 	.uleb128 0x19
-	.4byte	.LASF2947
+	.4byte	.LASF2948
 	.byte	0xc8
 	.byte	0x1b
 	.4byte	0xb824
 	.uleb128 0xd
-	.4byte	.LASF2948
+	.4byte	.LASF2949
 	.byte	0x18
 	.byte	0xc9
 	.byte	0xf
-	.4byte	0xdf97
+	.4byte	0xdfaf
 	.uleb128 0xe
 	.4byte	.LASF2880
 	.byte	0xc9
@@ -37763,11 +38953,11 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2949
+	.4byte	.LASF2950
 	.byte	0xa0
 	.byte	0xc9
 	.byte	0x15
-	.4byte	0xe0db
+	.4byte	0xe0f3
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xc9
@@ -37775,25 +38965,25 @@ __exitcall_ebc_exit:
 	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2950
+	.4byte	.LASF2951
 	.byte	0xc9
 	.byte	0x17
-	.4byte	0xe19c
+	.4byte	0xe1b4
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2951
+	.4byte	.LASF2952
 	.byte	0xc9
 	.byte	0x18
-	.4byte	0xdb9c
+	.4byte	0xdbb4
 	.byte	0x10
 	.uleb128 0x20
 	.string	"fb"
 	.byte	0xc9
 	.byte	0x19
-	.4byte	0xe1a2
+	.4byte	0xe1ba
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2952
+	.4byte	.LASF2953
 	.byte	0xc9
 	.byte	0x1a
 	.4byte	0xc6
@@ -37805,43 +38995,43 @@ __exitcall_ebc_exit:
 	.4byte	0x13f
 	.byte	0x4c
 	.uleb128 0xe
-	.4byte	.LASF2914
+	.4byte	.LASF2915
 	.byte	0xc9
 	.byte	0x1d
 	.4byte	0x13f
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2953
+	.4byte	.LASF2954
 	.byte	0xc9
 	.byte	0x1e
 	.4byte	0x13f
 	.byte	0x54
 	.uleb128 0xe
-	.4byte	.LASF2954
+	.4byte	.LASF2955
 	.byte	0xc9
 	.byte	0x1f
 	.4byte	0x13f
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2916
+	.4byte	.LASF2917
 	.byte	0xc9
 	.byte	0x20
 	.4byte	0x13f
 	.byte	0x5c
 	.uleb128 0xe
-	.4byte	.LASF2917
+	.4byte	.LASF2918
 	.byte	0xc9
 	.byte	0x21
 	.4byte	0x13f
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2955
+	.4byte	.LASF2956
 	.byte	0xc9
 	.byte	0x22
 	.4byte	0x13f
 	.byte	0x64
 	.uleb128 0xe
-	.4byte	.LASF2956
+	.4byte	.LASF2957
 	.byte	0xc9
 	.byte	0x23
 	.4byte	0x13f
@@ -37871,13 +39061,13 @@ __exitcall_ebc_exit:
 	.4byte	0x13f
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0xc9
 	.byte	0x28
 	.4byte	0x13f
 	.byte	0x7c
 	.uleb128 0xe
-	.4byte	.LASF2958
+	.4byte	.LASF2959
 	.byte	0xc9
 	.byte	0x29
 	.4byte	0x13f
@@ -37907,30 +39097,30 @@ __exitcall_ebc_exit:
 	.4byte	0x13f
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2959
+	.4byte	.LASF2960
 	.byte	0xc9
 	.byte	0x2e
 	.4byte	0x13f
 	.byte	0x94
 	.uleb128 0xe
-	.4byte	.LASF2915
+	.4byte	.LASF2916
 	.byte	0xc9
 	.byte	0x2f
 	.4byte	0x13f
 	.byte	0x98
 	.uleb128 0xe
-	.4byte	.LASF2960
+	.4byte	.LASF2961
 	.byte	0xc9
 	.byte	0x30
 	.4byte	0x13f
 	.byte	0x9c
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2961
+	.4byte	.LASF2962
 	.byte	0x70
 	.byte	0xb
 	.byte	0x17
-	.4byte	0xe19c
+	.4byte	0xe1b4
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xb
@@ -37938,7 +39128,7 @@ __exitcall_ebc_exit:
 	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2962
+	.4byte	.LASF2963
 	.byte	0xb
 	.byte	0x19
 	.4byte	0x458
@@ -37956,67 +39146,67 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2963
+	.4byte	.LASF2964
 	.byte	0xb
 	.byte	0x1d
-	.4byte	0xe1b7
+	.4byte	0xe1cf
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2964
+	.4byte	.LASF2965
 	.byte	0xb
 	.byte	0x1e
-	.4byte	0xe1b7
+	.4byte	0xe1cf
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2965
+	.4byte	.LASF2966
 	.byte	0xb
 	.byte	0x1f
-	.4byte	0xe1c2
+	.4byte	0xe1da
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2966
+	.4byte	.LASF2967
 	.byte	0xb
 	.byte	0x21
-	.4byte	0xe1e2
+	.4byte	0xe1fa
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2967
+	.4byte	.LASF2968
 	.byte	0xb
 	.byte	0x22
-	.4byte	0xe1f3
+	.4byte	0xe20b
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2968
+	.4byte	.LASF2969
 	.byte	0xb
 	.byte	0x23
-	.4byte	0xe218
+	.4byte	0xe230
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2969
+	.4byte	.LASF2970
 	.byte	0xb
 	.byte	0x24
-	.4byte	0xe233
+	.4byte	0xe24b
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2970
+	.4byte	.LASF2971
 	.byte	0xb
 	.byte	0x25
-	.4byte	0xe249
+	.4byte	0xe261
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2971
+	.4byte	.LASF2972
 	.byte	0xb
 	.byte	0x26
-	.4byte	0xe26d
+	.4byte	0xe285
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2972
+	.4byte	.LASF2973
 	.byte	0xb
 	.byte	0x27
-	.4byte	0xe283
+	.4byte	0xe29b
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2973
+	.4byte	.LASF2974
 	.byte	0xb
 	.byte	0x29
 	.4byte	0x4b7
@@ -38024,10 +39214,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe0db
+	.4byte	0xe0f3
 	.uleb128 0x5
-	.4byte	0xdf66
-	.4byte	0xe1b2
+	.4byte	0xdf7e
+	.4byte	0xe1ca
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
@@ -38036,38 +39226,38 @@ __exitcall_ebc_exit:
 	.string	"clk"
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1b2
+	.4byte	0xe1ca
 	.uleb128 0x24
-	.4byte	.LASF2974
+	.4byte	.LASF2975
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1bd
+	.4byte	0xe1d5
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xe1dc
+	.4byte	0xe1f4
 	.uleb128 0x11
-	.4byte	0xe19c
+	.4byte	0xe1b4
 	.uleb128 0x11
-	.4byte	0xe1dc
+	.4byte	0xe1f4
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdf97
+	.4byte	0xdfaf
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1c8
+	.4byte	0xe1e0
 	.uleb128 0x10
-	.4byte	0xe1f3
+	.4byte	0xe20b
 	.uleb128 0x11
-	.4byte	0xe19c
+	.4byte	0xe1b4
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1e8
+	.4byte	0xe200
 	.uleb128 0x10
-	.4byte	0xe218
+	.4byte	0xe230
 	.uleb128 0x11
-	.4byte	0xe19c
+	.4byte	0xe1b4
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -38079,11 +39269,11 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1f9
+	.4byte	0xe211
 	.uleb128 0x10
-	.4byte	0xe233
+	.4byte	0xe24b
 	.uleb128 0x11
-	.4byte	0xe19c
+	.4byte	0xe1b4
 	.uleb128 0x11
 	.4byte	0x13f
 	.uleb128 0x11
@@ -38091,22 +39281,22 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe21e
+	.4byte	0xe236
 	.uleb128 0x10
-	.4byte	0xe249
+	.4byte	0xe261
 	.uleb128 0x11
-	.4byte	0xe19c
+	.4byte	0xe1b4
 	.uleb128 0x11
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe239
+	.4byte	0xe251
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xe26d
+	.4byte	0xe285
 	.uleb128 0x11
-	.4byte	0xe19c
+	.4byte	0xe1b4
 	.uleb128 0x11
 	.4byte	0x35e3
 	.uleb128 0x11
@@ -38116,109 +39306,109 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe24f
+	.4byte	0xe267
 	.uleb128 0x10
-	.4byte	0xe283
+	.4byte	0xe29b
 	.uleb128 0x11
-	.4byte	0xe19c
+	.4byte	0xe1b4
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe273
+	.4byte	0xe28b
 	.uleb128 0x26
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.2byte	0x280
 	.byte	0x1
 	.byte	0x33
-	.4byte	0xe4ca
+	.4byte	0xe4e2
 	.uleb128 0xe
-	.4byte	.LASF2976
+	.4byte	.LASF2977
 	.byte	0x1
 	.byte	0x34
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2977
+	.4byte	.LASF2978
 	.byte	0x1
 	.byte	0x35
 	.4byte	0x21e
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2978
+	.4byte	.LASF2979
 	.byte	0x1
 	.byte	0x36
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2979
+	.4byte	.LASF2980
 	.byte	0x1
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2980
+	.4byte	.LASF2981
 	.byte	0x1
 	.byte	0x38
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2981
+	.4byte	.LASF2982
 	.byte	0x1
 	.byte	0x39
 	.4byte	0x29
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2982
+	.4byte	.LASF2983
 	.byte	0x1
 	.byte	0x3a
 	.4byte	0xc6
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2983
+	.4byte	.LASF2984
 	.byte	0x1
 	.byte	0x3b
 	.4byte	0xc6
 	.byte	0x2c
 	.uleb128 0xe
-	.4byte	.LASF2984
+	.4byte	.LASF2985
 	.byte	0x1
 	.byte	0x3c
 	.4byte	0x61
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2985
+	.4byte	.LASF2986
 	.byte	0x1
 	.byte	0x3d
 	.4byte	0x61
 	.byte	0x31
 	.uleb128 0xe
-	.4byte	.LASF2986
+	.4byte	.LASF2987
 	.byte	0x1
 	.byte	0x3e
 	.4byte	0xc6
 	.byte	0x34
 	.uleb128 0xe
-	.4byte	.LASF2987
+	.4byte	.LASF2988
 	.byte	0x1
 	.byte	0x3f
 	.4byte	0xc6
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2988
+	.4byte	.LASF2989
 	.byte	0x1
 	.byte	0x40
 	.4byte	0xc6
 	.byte	0x3c
 	.uleb128 0xe
-	.4byte	.LASF2989
+	.4byte	.LASF2990
 	.byte	0x1
 	.byte	0x41
 	.4byte	0xc6
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2914
+	.4byte	.LASF2915
 	.byte	0x1
 	.byte	0x42
 	.4byte	0xc6
@@ -38230,25 +39420,25 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2990
+	.4byte	.LASF2991
 	.byte	0x1
 	.byte	0x44
 	.4byte	0x46ee
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2991
+	.4byte	.LASF2992
 	.byte	0x1
 	.byte	0x45
 	.4byte	0xc6
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2992
+	.4byte	.LASF2993
 	.byte	0x1
 	.byte	0x46
 	.4byte	0xc6
 	.byte	0x5c
 	.uleb128 0xe
-	.4byte	.LASF2993
+	.4byte	.LASF2994
 	.byte	0x1
 	.byte	0x47
 	.4byte	0xc6
@@ -38260,151 +39450,151 @@ __exitcall_ebc_exit:
 	.4byte	0xa5e0
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2994
+	.4byte	.LASF2995
 	.byte	0x1
 	.byte	0x49
 	.4byte	0xd8fc
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF2995
+	.4byte	.LASF2996
 	.byte	0x1
 	.byte	0x4a
 	.4byte	0x2f05
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF2996
+	.4byte	.LASF2997
 	.byte	0x1
 	.byte	0x4c
 	.4byte	0x46ee
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2997
+	.4byte	.LASF2998
 	.byte	0x1
 	.byte	0x4d
 	.4byte	0x46ee
 	.byte	0x98
 	.uleb128 0xe
-	.4byte	.LASF2998
+	.4byte	.LASF2999
 	.byte	0x1
 	.byte	0x4e
 	.4byte	0x46ee
 	.byte	0xa0
 	.uleb128 0xe
-	.4byte	.LASF2999
+	.4byte	.LASF3000
 	.byte	0x1
 	.byte	0x50
 	.4byte	0xc138
 	.byte	0xa8
 	.uleb128 0xe
-	.4byte	.LASF3000
+	.4byte	.LASF3001
 	.byte	0x1
 	.byte	0x51
 	.4byte	0xc138
 	.byte	0xb0
 	.uleb128 0xe
-	.4byte	.LASF3001
+	.4byte	.LASF3002
 	.byte	0x1
 	.byte	0x52
-	.4byte	0xe4ca
+	.4byte	0xe4e2
 	.byte	0xb8
 	.uleb128 0xe
-	.4byte	.LASF3002
+	.4byte	.LASF3003
 	.byte	0x1
 	.byte	0x53
 	.4byte	0xc6
 	.byte	0xc8
 	.uleb128 0xe
-	.4byte	.LASF3003
+	.4byte	.LASF3004
 	.byte	0x1
 	.byte	0x54
 	.4byte	0xc6
 	.byte	0xcc
 	.uleb128 0xe
-	.4byte	.LASF3004
+	.4byte	.LASF3005
 	.byte	0x1
 	.byte	0x55
 	.4byte	0x21e
 	.byte	0xd0
 	.uleb128 0xe
-	.4byte	.LASF3005
+	.4byte	.LASF3006
 	.byte	0x1
 	.byte	0x56
-	.4byte	0xe4da
+	.4byte	0xe4f2
 	.byte	0xd8
 	.uleb128 0xe
-	.4byte	.LASF3006
+	.4byte	.LASF3007
 	.byte	0x1
 	.byte	0x57
-	.4byte	0xe4da
+	.4byte	0xe4f2
 	.byte	0xe0
 	.uleb128 0xe
-	.4byte	.LASF3007
+	.4byte	.LASF3008
 	.byte	0x1
 	.byte	0x59
 	.4byte	0xd872
 	.byte	0xe8
 	.uleb128 0x27
-	.4byte	.LASF3008
+	.4byte	.LASF3009
 	.byte	0x1
 	.byte	0x5a
 	.4byte	0xc6
 	.2byte	0x1b8
 	.uleb128 0x27
-	.4byte	.LASF3009
+	.4byte	.LASF3010
 	.byte	0x1
 	.byte	0x5c
 	.4byte	0xc6
 	.2byte	0x1bc
 	.uleb128 0x27
-	.4byte	.LASF3010
+	.4byte	.LASF3011
 	.byte	0x1
 	.byte	0x5e
 	.4byte	0x3172
 	.2byte	0x1c0
 	.uleb128 0x27
-	.4byte	.LASF3011
+	.4byte	.LASF3012
 	.byte	0x1
 	.byte	0x61
 	.4byte	0x3172
 	.2byte	0x1f8
 	.uleb128 0x27
-	.4byte	.LASF3012
+	.4byte	.LASF3013
 	.byte	0x1
 	.byte	0x64
 	.4byte	0x320b
 	.2byte	0x230
 	.uleb128 0x27
-	.4byte	.LASF3013
+	.4byte	.LASF3014
 	.byte	0x1
 	.byte	0x65
 	.4byte	0x331f
 	.2byte	0x260
 	.uleb128 0x27
-	.4byte	.LASF3014
+	.4byte	.LASF3015
 	.byte	0x1
 	.byte	0x68
 	.4byte	0xc6
 	.2byte	0x268
 	.uleb128 0x27
-	.4byte	.LASF3015
+	.4byte	.LASF3016
 	.byte	0x1
 	.byte	0x6a
 	.4byte	0xc6
 	.2byte	0x26c
 	.uleb128 0x27
-	.4byte	.LASF3016
+	.4byte	.LASF3017
 	.byte	0x1
 	.byte	0x6c
 	.4byte	0xc6
 	.2byte	0x270
 	.uleb128 0x27
-	.4byte	.LASF3017
+	.4byte	.LASF3018
 	.byte	0x1
 	.byte	0x6e
 	.4byte	0xc6
 	.2byte	0x274
 	.uleb128 0x27
-	.4byte	.LASF3018
+	.4byte	.LASF3019
 	.byte	0x1
 	.byte	0x6f
 	.4byte	0xc6
@@ -38412,7 +39602,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x458
-	.4byte	0xe4da
+	.4byte	0xe4f2
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
@@ -38425,7 +39615,7 @@ __exitcall_ebc_exit:
 	.2byte	0x338
 	.byte	0x1
 	.byte	0x72
-	.4byte	0xe52a
+	.4byte	0xe542
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x1
@@ -38433,43 +39623,43 @@ __exitcall_ebc_exit:
 	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2950
+	.4byte	.LASF2951
 	.byte	0x1
 	.byte	0x74
-	.4byte	0xe19c
+	.4byte	0xe1b4
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2951
+	.4byte	.LASF2952
 	.byte	0x1
 	.byte	0x75
-	.4byte	0xdb9c
+	.4byte	0xdbb4
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF3019
+	.4byte	.LASF3020
 	.byte	0x1
 	.byte	0x76
-	.4byte	0xdf97
+	.4byte	0xdfaf
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF1788
 	.byte	0x1
 	.byte	0x77
-	.4byte	0xe289
+	.4byte	0xe2a1
 	.byte	0xb8
 	.byte	0
 	.uleb128 0x4c
-	.4byte	.LASF3020
+	.4byte	.LASF3021
 	.byte	0x1
 	.byte	0x7a
-	.4byte	0xe53f
+	.4byte	0xe557
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	global_ebc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe4e0
+	.4byte	0xe4f8
 	.uleb128 0x4c
-	.4byte	.LASF3021
+	.4byte	.LASF3022
 	.byte	0x1
 	.byte	0x7b
 	.4byte	0x2f05
@@ -38477,7 +39667,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_auto_task
 	.uleb128 0x4c
-	.4byte	.LASF3022
+	.4byte	.LASF3023
 	.byte	0x1
 	.byte	0x7c
 	.4byte	0x4ea6
@@ -38485,7 +39675,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	auto_buf_sema
 	.uleb128 0x4c
-	.4byte	.LASF3023
+	.4byte	.LASF3024
 	.byte	0x1
 	.byte	0x7e
 	.4byte	0x159a
@@ -38493,7 +39683,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_wq
 	.uleb128 0x4c
-	.4byte	.LASF3024
+	.4byte	.LASF3025
 	.byte	0x1
 	.byte	0x7f
 	.4byte	0x159a
@@ -38501,7 +39691,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_thread_wq
 	.uleb128 0x4c
-	.4byte	.LASF3025
+	.4byte	.LASF3026
 	.byte	0x1
 	.byte	0x80
 	.4byte	0x159a
@@ -38509,7 +39699,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_poweroff_wq
 	.uleb128 0x4c
-	.4byte	.LASF3026
+	.4byte	.LASF3027
 	.byte	0x1
 	.byte	0x81
 	.4byte	0x5be1
@@ -38517,3654 +39707,3603 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_auto_thread_sem
 	.uleb128 0x4d
-	.4byte	.LASF3027
+	.4byte	.LASF3028
 	.byte	0x1
-	.2byte	0x54f
+	.2byte	0x723
 	.4byte	0xc6
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	resume_frame_count
 	.uleb128 0x4d
-	.4byte	.LASF3028
+	.4byte	.LASF3029
 	.byte	0x1
-	.2byte	0x550
+	.2byte	0x724
 	.4byte	0xc6
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	resume_count_start
 	.uleb128 0x4d
-	.4byte	.LASF3029
+	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0x7e4
+	.2byte	0x9be
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_ops
 	.uleb128 0x4d
-	.4byte	.LASF3030
+	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0x7ee
+	.2byte	0x9c8
 	.4byte	0xc680
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_misc
 	.uleb128 0x4d
-	.4byte	.LASF3031
+	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0x80b
+	.2byte	0x9e5
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	waveform_ops
 	.uleb128 0x4d
-	.4byte	.LASF3032
+	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0x811
+	.2byte	0x9eb
 	.4byte	0xc680
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	waveform_misc
 	.uleb128 0x4d
-	.4byte	.LASF3033
+	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0x820
+	.2byte	0x9fa
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_waveform_version
 	.uleb128 0x4d
-	.4byte	.LASF3034
+	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0x82b
+	.2byte	0xa05
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_name
 	.uleb128 0x4d
-	.4byte	.LASF3035
+	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0x839
+	.2byte	0xa13
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_temp
 	.uleb128 0x4d
-	.4byte	.LASF3036
+	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0x85c
+	.2byte	0xa36
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_vcom
 	.uleb128 0x4d
-	.4byte	.LASF3037
+	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0x866
+	.2byte	0xa40
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_version
 	.uleb128 0x4d
-	.4byte	.LASF3038
+	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0x86f
+	.2byte	0xa49
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_state
 	.uleb128 0x4d
-	.4byte	.LASF3039
+	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0x878
+	.2byte	0xa52
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_buf_state
 	.uleb128 0x4d
-	.4byte	.LASF3040
+	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0xa2d
+	.2byte	0xbff
 	.4byte	0xa5cc
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_pm
 	.uleb128 0x5
 	.4byte	0xb20b
-	.4byte	0xe707
+	.4byte	0xe71f
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe6f7
+	.4byte	0xe70f
 	.uleb128 0x4d
-	.4byte	.LASF3041
+	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0xa32
-	.4byte	0xe707
+	.2byte	0xc04
+	.4byte	0xe71f
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_match
 	.uleb128 0x4d
-	.4byte	.LASF3042
+	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0xa38
+	.2byte	0xc0a
 	.4byte	0xd70e
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_driver
 	.uleb128 0x4d
-	.4byte	.LASF3043
+	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0xa4c
+	.2byte	0xc1e
 	.4byte	0x458
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init2636
+	.8byte	__addressable_ebc_init3102
 	.uleb128 0x4d
-	.4byte	.LASF3044
+	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0xa4d
+	.2byte	0xc1f
 	.4byte	0x4ac
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	__exitcall_ebc_exit
 	.uleb128 0x4e
-	.4byte	.LASF3095
+	.4byte	.LASF3096
 	.byte	0x1
-	.2byte	0xa47
-	.8byte	.LFB2857
-	.8byte	.LFE2857-.LFB2857
+	.2byte	0xc19
+	.8byte	.LFB2864
+	.8byte	.LFE2864-.LFB2864
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe790
+	.4byte	0xe7a8
 	.uleb128 0x4f
-	.8byte	.LVL64
-	.4byte	0x1458e
+	.8byte	.LVL66
+	.4byte	0x14f9d
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3045
+	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0xa42
+	.2byte	0xc14
 	.4byte	0xc6
-	.8byte	.LFB2856
-	.8byte	.LFE2856-.LFB2856
+	.8byte	.LFB2863
+	.8byte	.LFE2863-.LFB2863
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe7c0
+	.4byte	0xe7d8
 	.uleb128 0x4f
-	.8byte	.LVL366
-	.4byte	0x1459a
+	.8byte	.LVL360
+	.4byte	0x14fa9
 	.byte	0
 	.uleb128 0x51
-	.4byte	.LASF3046
+	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0xa21
+	.2byte	0xbf3
 	.4byte	0xc6
-	.8byte	.LFB2855
-	.8byte	.LFE2855-.LFB2855
+	.8byte	.LFB2862
+	.8byte	.LFE2862-.LFB2862
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe85c
+	.4byte	0xe874
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xa21
+	.2byte	0xbf3
 	.4byte	0xa5e0
-	.4byte	.LLST11
+	.4byte	.LLST13
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa23
-	.4byte	0xe53f
+	.2byte	0xbf5
+	.4byte	0xe557
 	.uleb128 0x48
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xa24
-	.4byte	0xe85c
+	.2byte	0xbf6
+	.4byte	0xe874
 	.uleb128 0x54
-	.4byte	0x13902
-	.8byte	.LBB934
-	.8byte	.LBE934-.LBB934
+	.4byte	0x14868
+	.8byte	.LBB944
+	.8byte	.LBE944-.LBB944
 	.byte	0x1
-	.2byte	0xa23
-	.4byte	0xe82c
+	.2byte	0xbf5
+	.4byte	0xe844
 	.uleb128 0x55
-	.4byte	0x13913
+	.4byte	0x14879
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x134d7
-	.8byte	.LBB936
-	.8byte	.LBE936-.LBB936
+	.4byte	0x1443d
+	.8byte	.LBB946
+	.8byte	.LBE946-.LBB946
 	.byte	0x1
-	.2byte	0xa26
-	.4byte	0xe84e
+	.2byte	0xbf8
+	.4byte	0xe866
 	.uleb128 0x55
-	.4byte	0x134e4
+	.4byte	0x1444a
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL68
-	.4byte	0x145a6
+	.8byte	.LVL70
+	.4byte	0x14fb5
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe289
+	.4byte	0xe2a1
 	.uleb128 0x51
-	.4byte	.LASF3048
+	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0xa10
+	.2byte	0xbe2
 	.4byte	0xc6
-	.8byte	.LFB2854
-	.8byte	.LFE2854-.LFB2854
+	.8byte	.LFB2861
+	.8byte	.LFE2861-.LFB2861
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe969
+	.4byte	0xe981
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xa10
+	.2byte	0xbe2
 	.4byte	0xa5e0
-	.4byte	.LLST152
+	.4byte	.LLST195
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xa12
-	.4byte	0xe53f
+	.2byte	0xbe4
+	.4byte	0xe557
 	.uleb128 0x48
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0xa13
-	.4byte	0xe85c
+	.2byte	0xbe5
+	.4byte	0xe874
 	.uleb128 0x56
-	.4byte	.LASF3049
-	.4byte	0xe979
+	.4byte	.LASF3050
+	.4byte	0xe991
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35321
+	.8byte	__func__.35491
 	.uleb128 0x54
-	.4byte	0x13902
-	.8byte	.LBB1414
-	.8byte	.LBE1414-.LBB1414
+	.4byte	0x14868
+	.8byte	.LBB1487
+	.8byte	.LBE1487-.LBB1487
 	.byte	0x1
-	.2byte	0xa12
-	.4byte	0xe8e1
+	.2byte	0xbe4
+	.4byte	0xe8f9
 	.uleb128 0x55
-	.4byte	0x13913
+	.4byte	0x14879
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x134f1
-	.8byte	.LBB1416
-	.8byte	.LBE1416-.LBB1416
+	.4byte	0x14457
+	.8byte	.LBB1489
+	.8byte	.LBE1489-.LBB1489
 	.byte	0x1
-	.2byte	0xa1b
-	.4byte	0xe903
+	.2byte	0xbed
+	.4byte	0xe91b
 	.uleb128 0x55
-	.4byte	0x134fe
+	.4byte	0x14464
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1321e
-	.8byte	.LBB1418
-	.8byte	.LBE1418-.LBB1418
+	.4byte	0x14104
+	.8byte	.LBB1491
+	.8byte	.LBE1491-.LBB1491
 	.byte	0x1
-	.2byte	0xa17
-	.4byte	0xe94e
+	.2byte	0xbe9
+	.4byte	0xe966
 	.uleb128 0x55
-	.4byte	0x13239
+	.4byte	0x1411f
 	.uleb128 0x55
-	.4byte	0x1322e
+	.4byte	0x14114
 	.uleb128 0x57
-	.8byte	.LBB1419
-	.8byte	.LBE1419-.LBB1419
+	.8byte	.LBB1492
+	.8byte	.LBE1492-.LBB1492
 	.uleb128 0x58
-	.4byte	0x13245
+	.4byte	0x1412b
 	.uleb128 0x4f
-	.8byte	.LVL531
-	.4byte	0x1441e
+	.8byte	.LVL608
+	.4byte	0x14dcc
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL529
-	.4byte	0x145a6
+	.8byte	.LVL606
+	.4byte	0x14fb5
 	.uleb128 0x4f
-	.8byte	.LVL530
-	.4byte	0x145a6
+	.8byte	.LVL607
+	.4byte	0x14fb5
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xe979
+	.4byte	0xe991
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xb
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe969
+	.4byte	0xe981
 	.uleb128 0x50
-	.4byte	.LASF3050
+	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0xa09
+	.2byte	0xbdb
 	.4byte	0xc6
-	.8byte	.LFB2853
-	.8byte	.LFE2853-.LFB2853
+	.8byte	.LFB2860
+	.8byte	.LFE2860-.LFB2860
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe9be
+	.4byte	0xe9d6
 	.uleb128 0x59
-	.4byte	.LASF3051
+	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0xa09
+	.2byte	0xbdb
 	.4byte	0xd78a
-	.4byte	.LLST13
+	.4byte	.LLST15
 	.uleb128 0x4f
-	.8byte	.LVL74
-	.4byte	0x145b3
+	.8byte	.LVL76
+	.4byte	0x14fc2
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3052
+	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0x988
+	.2byte	0xb5a
 	.4byte	0xc6
-	.8byte	.LFB2852
-	.8byte	.LFE2852-.LFB2852
+	.8byte	.LFB2859
+	.8byte	.LFE2859-.LFB2859
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfe46
+	.4byte	0xfdb3
 	.uleb128 0x59
-	.4byte	.LASF3051
+	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0x988
+	.2byte	0xb5a
 	.4byte	0xd78a
-	.4byte	.LLST153
+	.4byte	.LLST198
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x98a
+	.2byte	0xb5c
 	.4byte	0xa5e0
 	.uleb128 0x48
-	.4byte	.LASF3053
+	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0x98b
+	.2byte	0xb5d
 	.4byte	0xb904
 	.uleb128 0x5a
-	.4byte	.LASF3054
+	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0x98c
+	.2byte	0xb5e
 	.4byte	0xd78a
-	.4byte	.LLST154
+	.4byte	.LLST199
 	.uleb128 0x48
-	.4byte	.LASF3055
+	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0x98d
+	.2byte	0xb5f
 	.4byte	0xb904
 	.uleb128 0x5a
-	.4byte	.LASF3056
+	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0x98e
+	.2byte	0xb60
 	.4byte	0xc0b3
-	.4byte	.LLST155
+	.4byte	.LLST200
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x98f
-	.4byte	0xe53f
+	.2byte	0xb61
+	.4byte	0xe557
 	.uleb128 0x5a
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x990
-	.4byte	0xe85c
-	.4byte	.LLST156
+	.2byte	0xb62
+	.4byte	0xe874
+	.4byte	.LLST201
 	.uleb128 0x48
-	.4byte	.LASF3019
+	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x991
-	.4byte	0xe1dc
+	.2byte	0xb63
+	.4byte	0xe1f4
 	.uleb128 0x5a
 	.4byte	.LASF976
 	.byte	0x1
-	.2byte	0x992
+	.2byte	0xb64
 	.4byte	0xbd30
-	.4byte	.LLST157
+	.4byte	.LLST202
 	.uleb128 0x48
 	.4byte	.LASF2435
 	.byte	0x1
-	.2byte	0x993
+	.2byte	0xb65
 	.4byte	0xbcd0
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x994
+	.2byte	0xb66
 	.4byte	0xc6
 	.uleb128 0x5a
 	.4byte	.LASF1001
 	.byte	0x1
-	.2byte	0x995
+	.2byte	0xb67
 	.4byte	0xc6
-	.4byte	.LLST158
+	.4byte	.LLST203
 	.uleb128 0x5b
 	.string	"i"
 	.byte	0x1
-	.2byte	0x996
+	.2byte	0xb68
 	.4byte	0xc6
-	.4byte	.LLST159
+	.4byte	.LLST204
 	.uleb128 0x5c
-	.4byte	0x13920
-	.8byte	.LBB1570
-	.4byte	.Ldebug_ranges0+0xbd0
+	.4byte	0x14886
+	.8byte	.LBB1637
+	.4byte	.Ldebug_ranges0+0xd50
 	.byte	0x1
-	.2byte	0x998
-	.4byte	0xead7
+	.2byte	0xb6a
+	.4byte	0xeaef
 	.uleb128 0x55
-	.4byte	0x13949
+	.4byte	0x148af
 	.uleb128 0x55
-	.4byte	0x1393d
+	.4byte	0x148a3
 	.uleb128 0x55
-	.4byte	0x13931
+	.4byte	0x14897
 	.uleb128 0x4f
-	.8byte	.LVL534
-	.4byte	0x145bf
+	.8byte	.LVL614
+	.4byte	0x14fce
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x137fa
-	.8byte	.LBB1574
-	.8byte	.LBE1574-.LBB1574
+	.4byte	0x14760
+	.8byte	.LBB1641
+	.8byte	.LBE1641-.LBB1641
 	.byte	0x1
-	.2byte	0x9aa
-	.4byte	0xeb16
+	.2byte	0xb7c
+	.4byte	0xeb2e
 	.uleb128 0x55
-	.4byte	0x1380a
+	.4byte	0x14770
 	.uleb128 0x5d
-	.4byte	0x13902
-	.8byte	.LBB1575
-	.8byte	.LBE1575-.LBB1575
+	.4byte	0x14868
+	.8byte	.LBB1642
+	.8byte	.LBE1642-.LBB1642
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x55
-	.4byte	0x13913
+	.4byte	0x14879
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1381d
-	.8byte	.LBB1577
-	.8byte	.LBE1577-.LBB1577
+	.4byte	0x14783
+	.8byte	.LBB1644
+	.8byte	.LBE1644-.LBB1644
 	.byte	0x1
-	.2byte	0x9c5
-	.4byte	0xeb56
+	.2byte	0xb97
+	.4byte	0xeb6e
 	.uleb128 0x55
-	.4byte	0x1382e
+	.4byte	0x14794
 	.uleb128 0x5e
-	.4byte	0x13902
-	.8byte	.LBB1578
-	.8byte	.LBE1578-.LBB1578
+	.4byte	0x14868
+	.8byte	.LBB1645
+	.8byte	.LBE1645-.LBB1645
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x55
-	.4byte	0x13913
+	.4byte	0x14879
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x11851
-	.8byte	.LBB1580
-	.4byte	.Ldebug_ranges0+0xc00
+	.4byte	0x117be
+	.8byte	.LBB1647
+	.4byte	.Ldebug_ranges0+0xd80
 	.byte	0x1
-	.2byte	0x9d9
-	.4byte	0xf52b
+	.2byte	0xbab
+	.4byte	0xf543
 	.uleb128 0x55
-	.4byte	0x11862
+	.4byte	0x117cf
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xc00
+	.4byte	.Ldebug_ranges0+0xd80
 	.uleb128 0x58
-	.4byte	0x1186e
+	.4byte	0x117db
 	.uleb128 0x5c
-	.4byte	0x13841
-	.8byte	.LBB1582
-	.4byte	.Ldebug_ranges0+0xc50
+	.4byte	0x147a7
+	.8byte	.LBB1649
+	.4byte	.Ldebug_ranges0+0xdd0
 	.byte	0x1
-	.2byte	0x6c6
-	.4byte	0xebe6
+	.2byte	0x89d
+	.4byte	0xebfe
 	.uleb128 0x55
-	.4byte	0x13869
+	.4byte	0x147cf
 	.uleb128 0x55
-	.4byte	0x1385d
+	.4byte	0x147c3
 	.uleb128 0x55
-	.4byte	0x13852
+	.4byte	0x147b8
 	.uleb128 0x60
-	.4byte	0x13876
-	.8byte	.LBB1583
-	.4byte	.Ldebug_ranges0+0xc50
+	.4byte	0x147dc
+	.8byte	.LBB1650
+	.4byte	.Ldebug_ranges0+0xdd0
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x138aa
+	.4byte	0x14810
 	.uleb128 0x55
-	.4byte	0x1389e
+	.4byte	0x14804
 	.uleb128 0x55
-	.4byte	0x13892
+	.4byte	0x147f8
 	.uleb128 0x55
-	.4byte	0x13887
+	.4byte	0x147ed
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xc50
+	.4byte	.Ldebug_ranges0+0xdd0
 	.uleb128 0x58
-	.4byte	0x138b5
+	.4byte	0x1481b
 	.uleb128 0x4f
-	.8byte	.LVL559
-	.4byte	0x145cc
+	.8byte	.LVL639
+	.4byte	0x14fdb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13841
-	.8byte	.LBB1594
-	.8byte	.LBE1594-.LBB1594
+	.4byte	0x147a7
+	.8byte	.LBB1661
+	.8byte	.LBE1661-.LBB1661
 	.byte	0x1
-	.2byte	0x6c9
-	.4byte	0xec63
+	.2byte	0x8a0
+	.4byte	0xec7b
 	.uleb128 0x55
-	.4byte	0x13869
+	.4byte	0x147cf
 	.uleb128 0x55
-	.4byte	0x1385d
+	.4byte	0x147c3
 	.uleb128 0x55
-	.4byte	0x13852
+	.4byte	0x147b8
 	.uleb128 0x5e
-	.4byte	0x13876
-	.8byte	.LBB1595
-	.8byte	.LBE1595-.LBB1595
+	.4byte	0x147dc
+	.8byte	.LBB1662
+	.8byte	.LBE1662-.LBB1662
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x138aa
+	.4byte	0x14810
 	.uleb128 0x55
-	.4byte	0x1389e
+	.4byte	0x14804
 	.uleb128 0x55
-	.4byte	0x13892
+	.4byte	0x147f8
 	.uleb128 0x55
-	.4byte	0x13887
+	.4byte	0x147ed
 	.uleb128 0x57
-	.8byte	.LBB1596
-	.8byte	.LBE1596-.LBB1596
+	.8byte	.LBB1663
+	.8byte	.LBE1663-.LBB1663
 	.uleb128 0x58
-	.4byte	0x138b5
+	.4byte	0x1481b
 	.uleb128 0x4f
-	.8byte	.LVL560
-	.4byte	0x145cc
+	.8byte	.LVL640
+	.4byte	0x14fdb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13841
-	.8byte	.LBB1597
-	.8byte	.LBE1597-.LBB1597
+	.4byte	0x147a7
+	.8byte	.LBB1664
+	.8byte	.LBE1664-.LBB1664
 	.byte	0x1
-	.2byte	0x6cc
-	.4byte	0xece0
+	.2byte	0x8a3
+	.4byte	0xecf8
 	.uleb128 0x55
-	.4byte	0x13869
+	.4byte	0x147cf
 	.uleb128 0x55
-	.4byte	0x1385d
+	.4byte	0x147c3
 	.uleb128 0x55
-	.4byte	0x13852
+	.4byte	0x147b8
 	.uleb128 0x5e
-	.4byte	0x13876
-	.8byte	.LBB1598
-	.8byte	.LBE1598-.LBB1598
+	.4byte	0x147dc
+	.8byte	.LBB1665
+	.8byte	.LBE1665-.LBB1665
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x138aa
+	.4byte	0x14810
 	.uleb128 0x55
-	.4byte	0x1389e
+	.4byte	0x14804
 	.uleb128 0x55
-	.4byte	0x13892
+	.4byte	0x147f8
 	.uleb128 0x55
-	.4byte	0x13887
+	.4byte	0x147ed
 	.uleb128 0x57
-	.8byte	.LBB1599
-	.8byte	.LBE1599-.LBB1599
+	.8byte	.LBB1666
+	.8byte	.LBE1666-.LBB1666
 	.uleb128 0x58
-	.4byte	0x138b5
+	.4byte	0x1481b
 	.uleb128 0x4f
-	.8byte	.LVL561
-	.4byte	0x145cc
+	.8byte	.LVL641
+	.4byte	0x14fdb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13841
-	.8byte	.LBB1600
-	.8byte	.LBE1600-.LBB1600
+	.4byte	0x147a7
+	.8byte	.LBB1667
+	.8byte	.LBE1667-.LBB1667
 	.byte	0x1
-	.2byte	0x6cf
-	.4byte	0xed5d
+	.2byte	0x8a6
+	.4byte	0xed75
 	.uleb128 0x55
-	.4byte	0x13869
+	.4byte	0x147cf
 	.uleb128 0x55
-	.4byte	0x1385d
+	.4byte	0x147c3
 	.uleb128 0x55
-	.4byte	0x13852
+	.4byte	0x147b8
 	.uleb128 0x5e
-	.4byte	0x13876
-	.8byte	.LBB1601
-	.8byte	.LBE1601-.LBB1601
+	.4byte	0x147dc
+	.8byte	.LBB1668
+	.8byte	.LBE1668-.LBB1668
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x138aa
+	.4byte	0x14810
 	.uleb128 0x55
-	.4byte	0x1389e
+	.4byte	0x14804
 	.uleb128 0x55
-	.4byte	0x13892
+	.4byte	0x147f8
 	.uleb128 0x55
-	.4byte	0x13887
+	.4byte	0x147ed
 	.uleb128 0x57
-	.8byte	.LBB1602
-	.8byte	.LBE1602-.LBB1602
+	.8byte	.LBB1669
+	.8byte	.LBE1669-.LBB1669
 	.uleb128 0x58
-	.4byte	0x138b5
+	.4byte	0x1481b
 	.uleb128 0x4f
-	.8byte	.LVL562
-	.4byte	0x145cc
+	.8byte	.LVL642
+	.4byte	0x14fdb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13841
-	.8byte	.LBB1603
-	.8byte	.LBE1603-.LBB1603
+	.4byte	0x147a7
+	.8byte	.LBB1670
+	.8byte	.LBE1670-.LBB1670
 	.byte	0x1
-	.2byte	0x6d2
-	.4byte	0xedda
+	.2byte	0x8a9
+	.4byte	0xedf2
 	.uleb128 0x55
-	.4byte	0x13869
+	.4byte	0x147cf
 	.uleb128 0x55
-	.4byte	0x1385d
+	.4byte	0x147c3
 	.uleb128 0x55
-	.4byte	0x13852
+	.4byte	0x147b8
 	.uleb128 0x5e
-	.4byte	0x13876
-	.8byte	.LBB1604
-	.8byte	.LBE1604-.LBB1604
+	.4byte	0x147dc
+	.8byte	.LBB1671
+	.8byte	.LBE1671-.LBB1671
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x138aa
+	.4byte	0x14810
 	.uleb128 0x55
-	.4byte	0x1389e
+	.4byte	0x14804
 	.uleb128 0x55
-	.4byte	0x13892
+	.4byte	0x147f8
 	.uleb128 0x55
-	.4byte	0x13887
+	.4byte	0x147ed
 	.uleb128 0x57
-	.8byte	.LBB1605
-	.8byte	.LBE1605-.LBB1605
+	.8byte	.LBB1672
+	.8byte	.LBE1672-.LBB1672
 	.uleb128 0x58
-	.4byte	0x138b5
+	.4byte	0x1481b
 	.uleb128 0x4f
-	.8byte	.LVL563
-	.4byte	0x145cc
+	.8byte	.LVL643
+	.4byte	0x14fdb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13841
-	.8byte	.LBB1606
-	.8byte	.LBE1606-.LBB1606
+	.4byte	0x147a7
+	.8byte	.LBB1673
+	.8byte	.LBE1673-.LBB1673
 	.byte	0x1
-	.2byte	0x6d5
-	.4byte	0xee57
+	.2byte	0x8ac
+	.4byte	0xee6f
 	.uleb128 0x55
-	.4byte	0x13869
+	.4byte	0x147cf
 	.uleb128 0x55
-	.4byte	0x1385d
+	.4byte	0x147c3
 	.uleb128 0x55
-	.4byte	0x13852
+	.4byte	0x147b8
 	.uleb128 0x5e
-	.4byte	0x13876
-	.8byte	.LBB1607
-	.8byte	.LBE1607-.LBB1607
+	.4byte	0x147dc
+	.8byte	.LBB1674
+	.8byte	.LBE1674-.LBB1674
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x138aa
+	.4byte	0x14810
 	.uleb128 0x55
-	.4byte	0x1389e
+	.4byte	0x14804
 	.uleb128 0x55
-	.4byte	0x13892
+	.4byte	0x147f8
 	.uleb128 0x55
-	.4byte	0x13887
+	.4byte	0x147ed
 	.uleb128 0x57
-	.8byte	.LBB1608
-	.8byte	.LBE1608-.LBB1608
+	.8byte	.LBB1675
+	.8byte	.LBE1675-.LBB1675
 	.uleb128 0x58
-	.4byte	0x138b5
+	.4byte	0x1481b
 	.uleb128 0x4f
-	.8byte	.LVL564
-	.4byte	0x145cc
+	.8byte	.LVL644
+	.4byte	0x14fdb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13841
-	.8byte	.LBB1609
-	.8byte	.LBE1609-.LBB1609
+	.4byte	0x147a7
+	.8byte	.LBB1676
+	.8byte	.LBE1676-.LBB1676
 	.byte	0x1
-	.2byte	0x6d8
-	.4byte	0xeed4
+	.2byte	0x8af
+	.4byte	0xeeec
 	.uleb128 0x55
-	.4byte	0x13869
+	.4byte	0x147cf
 	.uleb128 0x55
-	.4byte	0x1385d
+	.4byte	0x147c3
 	.uleb128 0x55
-	.4byte	0x13852
+	.4byte	0x147b8
 	.uleb128 0x5e
-	.4byte	0x13876
-	.8byte	.LBB1610
-	.8byte	.LBE1610-.LBB1610
+	.4byte	0x147dc
+	.8byte	.LBB1677
+	.8byte	.LBE1677-.LBB1677
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x138aa
+	.4byte	0x14810
 	.uleb128 0x55
-	.4byte	0x1389e
+	.4byte	0x14804
 	.uleb128 0x55
-	.4byte	0x13892
+	.4byte	0x147f8
 	.uleb128 0x55
-	.4byte	0x13887
+	.4byte	0x147ed
 	.uleb128 0x57
-	.8byte	.LBB1611
-	.8byte	.LBE1611-.LBB1611
+	.8byte	.LBB1678
+	.8byte	.LBE1678-.LBB1678
 	.uleb128 0x58
-	.4byte	0x138b5
+	.4byte	0x1481b
 	.uleb128 0x4f
-	.8byte	.LVL565
-	.4byte	0x145cc
+	.8byte	.LVL645
+	.4byte	0x14fdb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13841
-	.8byte	.LBB1612
-	.8byte	.LBE1612-.LBB1612
+	.4byte	0x147a7
+	.8byte	.LBB1679
+	.8byte	.LBE1679-.LBB1679
 	.byte	0x1
-	.2byte	0x6db
-	.4byte	0xef51
+	.2byte	0x8b2
+	.4byte	0xef69
 	.uleb128 0x55
-	.4byte	0x13869
+	.4byte	0x147cf
 	.uleb128 0x55
-	.4byte	0x1385d
+	.4byte	0x147c3
 	.uleb128 0x55
-	.4byte	0x13852
+	.4byte	0x147b8
 	.uleb128 0x5e
-	.4byte	0x13876
-	.8byte	.LBB1613
-	.8byte	.LBE1613-.LBB1613
+	.4byte	0x147dc
+	.8byte	.LBB1680
+	.8byte	.LBE1680-.LBB1680
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x138aa
+	.4byte	0x14810
 	.uleb128 0x55
-	.4byte	0x1389e
+	.4byte	0x14804
 	.uleb128 0x55
-	.4byte	0x13892
+	.4byte	0x147f8
 	.uleb128 0x55
-	.4byte	0x13887
+	.4byte	0x147ed
 	.uleb128 0x57
-	.8byte	.LBB1614
-	.8byte	.LBE1614-.LBB1614
+	.8byte	.LBB1681
+	.8byte	.LBE1681-.LBB1681
 	.uleb128 0x58
-	.4byte	0x138b5
+	.4byte	0x1481b
 	.uleb128 0x4f
-	.8byte	.LVL566
-	.4byte	0x145cc
+	.8byte	.LVL646
+	.4byte	0x14fdb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13841
-	.8byte	.LBB1615
-	.8byte	.LBE1615-.LBB1615
+	.4byte	0x147a7
+	.8byte	.LBB1682
+	.8byte	.LBE1682-.LBB1682
 	.byte	0x1
-	.2byte	0x6de
-	.4byte	0xefce
+	.2byte	0x8b5
+	.4byte	0xefe6
 	.uleb128 0x55
-	.4byte	0x13869
+	.4byte	0x147cf
 	.uleb128 0x55
-	.4byte	0x1385d
+	.4byte	0x147c3
 	.uleb128 0x55
-	.4byte	0x13852
+	.4byte	0x147b8
 	.uleb128 0x5e
-	.4byte	0x13876
-	.8byte	.LBB1616
-	.8byte	.LBE1616-.LBB1616
+	.4byte	0x147dc
+	.8byte	.LBB1683
+	.8byte	.LBE1683-.LBB1683
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x138aa
+	.4byte	0x14810
 	.uleb128 0x55
-	.4byte	0x1389e
+	.4byte	0x14804
 	.uleb128 0x55
-	.4byte	0x13892
+	.4byte	0x147f8
 	.uleb128 0x55
-	.4byte	0x13887
+	.4byte	0x147ed
 	.uleb128 0x57
-	.8byte	.LBB1617
-	.8byte	.LBE1617-.LBB1617
+	.8byte	.LBB1684
+	.8byte	.LBE1684-.LBB1684
 	.uleb128 0x58
-	.4byte	0x138b5
+	.4byte	0x1481b
 	.uleb128 0x4f
-	.8byte	.LVL567
-	.4byte	0x145cc
+	.8byte	.LVL647
+	.4byte	0x14fdb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13841
-	.8byte	.LBB1618
-	.8byte	.LBE1618-.LBB1618
+	.4byte	0x147a7
+	.8byte	.LBB1685
+	.8byte	.LBE1685-.LBB1685
 	.byte	0x1
-	.2byte	0x6e1
-	.4byte	0xf04b
+	.2byte	0x8b8
+	.4byte	0xf063
 	.uleb128 0x55
-	.4byte	0x13869
+	.4byte	0x147cf
 	.uleb128 0x55
-	.4byte	0x1385d
+	.4byte	0x147c3
 	.uleb128 0x55
-	.4byte	0x13852
+	.4byte	0x147b8
 	.uleb128 0x5e
-	.4byte	0x13876
-	.8byte	.LBB1619
-	.8byte	.LBE1619-.LBB1619
+	.4byte	0x147dc
+	.8byte	.LBB1686
+	.8byte	.LBE1686-.LBB1686
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x138aa
+	.4byte	0x14810
 	.uleb128 0x55
-	.4byte	0x1389e
+	.4byte	0x14804
 	.uleb128 0x55
-	.4byte	0x13892
+	.4byte	0x147f8
 	.uleb128 0x55
-	.4byte	0x13887
+	.4byte	0x147ed
 	.uleb128 0x57
-	.8byte	.LBB1620
-	.8byte	.LBE1620-.LBB1620
+	.8byte	.LBB1687
+	.8byte	.LBE1687-.LBB1687
 	.uleb128 0x58
-	.4byte	0x138b5
+	.4byte	0x1481b
 	.uleb128 0x4f
-	.8byte	.LVL568
-	.4byte	0x145cc
+	.8byte	.LVL648
+	.4byte	0x14fdb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13841
-	.8byte	.LBB1621
-	.8byte	.LBE1621-.LBB1621
+	.4byte	0x147a7
+	.8byte	.LBB1688
+	.8byte	.LBE1688-.LBB1688
 	.byte	0x1
-	.2byte	0x6e4
-	.4byte	0xf0c8
+	.2byte	0x8bb
+	.4byte	0xf0e0
 	.uleb128 0x55
-	.4byte	0x13869
+	.4byte	0x147cf
 	.uleb128 0x55
-	.4byte	0x1385d
+	.4byte	0x147c3
 	.uleb128 0x55
-	.4byte	0x13852
+	.4byte	0x147b8
 	.uleb128 0x5e
-	.4byte	0x13876
-	.8byte	.LBB1622
-	.8byte	.LBE1622-.LBB1622
+	.4byte	0x147dc
+	.8byte	.LBB1689
+	.8byte	.LBE1689-.LBB1689
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x138aa
+	.4byte	0x14810
 	.uleb128 0x55
-	.4byte	0x1389e
+	.4byte	0x14804
 	.uleb128 0x55
-	.4byte	0x13892
+	.4byte	0x147f8
 	.uleb128 0x55
-	.4byte	0x13887
+	.4byte	0x147ed
 	.uleb128 0x57
-	.8byte	.LBB1623
-	.8byte	.LBE1623-.LBB1623
+	.8byte	.LBB1690
+	.8byte	.LBE1690-.LBB1690
 	.uleb128 0x58
-	.4byte	0x138b5
+	.4byte	0x1481b
 	.uleb128 0x4f
-	.8byte	.LVL569
-	.4byte	0x145cc
+	.8byte	.LVL649
+	.4byte	0x14fdb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13841
-	.8byte	.LBB1624
-	.8byte	.LBE1624-.LBB1624
+	.4byte	0x147a7
+	.8byte	.LBB1691
+	.8byte	.LBE1691-.LBB1691
 	.byte	0x1
-	.2byte	0x6e7
-	.4byte	0xf145
+	.2byte	0x8be
+	.4byte	0xf15d
 	.uleb128 0x55
-	.4byte	0x13869
+	.4byte	0x147cf
 	.uleb128 0x55
-	.4byte	0x1385d
+	.4byte	0x147c3
 	.uleb128 0x55
-	.4byte	0x13852
+	.4byte	0x147b8
 	.uleb128 0x5e
-	.4byte	0x13876
-	.8byte	.LBB1625
-	.8byte	.LBE1625-.LBB1625
+	.4byte	0x147dc
+	.8byte	.LBB1692
+	.8byte	.LBE1692-.LBB1692
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x138aa
+	.4byte	0x14810
 	.uleb128 0x55
-	.4byte	0x1389e
+	.4byte	0x14804
 	.uleb128 0x55
-	.4byte	0x13892
+	.4byte	0x147f8
 	.uleb128 0x55
-	.4byte	0x13887
+	.4byte	0x147ed
 	.uleb128 0x57
-	.8byte	.LBB1626
-	.8byte	.LBE1626-.LBB1626
+	.8byte	.LBB1693
+	.8byte	.LBE1693-.LBB1693
 	.uleb128 0x58
-	.4byte	0x138b5
+	.4byte	0x1481b
 	.uleb128 0x4f
-	.8byte	.LVL570
-	.4byte	0x145cc
+	.8byte	.LVL650
+	.4byte	0x14fdb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13841
-	.8byte	.LBB1627
-	.8byte	.LBE1627-.LBB1627
+	.4byte	0x147a7
+	.8byte	.LBB1694
+	.8byte	.LBE1694-.LBB1694
 	.byte	0x1
-	.2byte	0x6ea
-	.4byte	0xf1c2
+	.2byte	0x8c1
+	.4byte	0xf1da
 	.uleb128 0x55
-	.4byte	0x13869
+	.4byte	0x147cf
 	.uleb128 0x55
-	.4byte	0x1385d
+	.4byte	0x147c3
 	.uleb128 0x55
-	.4byte	0x13852
+	.4byte	0x147b8
 	.uleb128 0x5e
-	.4byte	0x13876
-	.8byte	.LBB1628
-	.8byte	.LBE1628-.LBB1628
+	.4byte	0x147dc
+	.8byte	.LBB1695
+	.8byte	.LBE1695-.LBB1695
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x138aa
+	.4byte	0x14810
 	.uleb128 0x55
-	.4byte	0x1389e
+	.4byte	0x14804
 	.uleb128 0x55
-	.4byte	0x13892
+	.4byte	0x147f8
 	.uleb128 0x55
-	.4byte	0x13887
+	.4byte	0x147ed
 	.uleb128 0x57
-	.8byte	.LBB1629
-	.8byte	.LBE1629-.LBB1629
+	.8byte	.LBB1696
+	.8byte	.LBE1696-.LBB1696
 	.uleb128 0x58
-	.4byte	0x138b5
+	.4byte	0x1481b
 	.uleb128 0x4f
-	.8byte	.LVL571
-	.4byte	0x145cc
+	.8byte	.LVL651
+	.4byte	0x14fdb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13841
-	.8byte	.LBB1630
-	.8byte	.LBE1630-.LBB1630
+	.4byte	0x147a7
+	.8byte	.LBB1697
+	.8byte	.LBE1697-.LBB1697
 	.byte	0x1
-	.2byte	0x6ed
-	.4byte	0xf23f
+	.2byte	0x8c4
+	.4byte	0xf257
 	.uleb128 0x55
-	.4byte	0x13869
+	.4byte	0x147cf
 	.uleb128 0x55
-	.4byte	0x1385d
+	.4byte	0x147c3
 	.uleb128 0x55
-	.4byte	0x13852
+	.4byte	0x147b8
 	.uleb128 0x5e
-	.4byte	0x13876
-	.8byte	.LBB1631
-	.8byte	.LBE1631-.LBB1631
+	.4byte	0x147dc
+	.8byte	.LBB1698
+	.8byte	.LBE1698-.LBB1698
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x138aa
+	.4byte	0x14810
 	.uleb128 0x55
-	.4byte	0x1389e
+	.4byte	0x14804
 	.uleb128 0x55
-	.4byte	0x13892
+	.4byte	0x147f8
 	.uleb128 0x55
-	.4byte	0x13887
+	.4byte	0x147ed
 	.uleb128 0x57
-	.8byte	.LBB1632
-	.8byte	.LBE1632-.LBB1632
+	.8byte	.LBB1699
+	.8byte	.LBE1699-.LBB1699
 	.uleb128 0x58
-	.4byte	0x138b5
+	.4byte	0x1481b
 	.uleb128 0x4f
-	.8byte	.LVL572
-	.4byte	0x145cc
+	.8byte	.LVL652
+	.4byte	0x14fdb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13841
-	.8byte	.LBB1633
-	.8byte	.LBE1633-.LBB1633
+	.4byte	0x147a7
+	.8byte	.LBB1700
+	.8byte	.LBE1700-.LBB1700
 	.byte	0x1
-	.2byte	0x6f0
-	.4byte	0xf2bc
+	.2byte	0x8c7
+	.4byte	0xf2d4
 	.uleb128 0x55
-	.4byte	0x13869
+	.4byte	0x147cf
 	.uleb128 0x55
-	.4byte	0x1385d
+	.4byte	0x147c3
 	.uleb128 0x55
-	.4byte	0x13852
+	.4byte	0x147b8
 	.uleb128 0x5e
-	.4byte	0x13876
-	.8byte	.LBB1634
-	.8byte	.LBE1634-.LBB1634
+	.4byte	0x147dc
+	.8byte	.LBB1701
+	.8byte	.LBE1701-.LBB1701
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x138aa
+	.4byte	0x14810
 	.uleb128 0x55
-	.4byte	0x1389e
+	.4byte	0x14804
 	.uleb128 0x55
-	.4byte	0x13892
+	.4byte	0x147f8
 	.uleb128 0x55
-	.4byte	0x13887
+	.4byte	0x147ed
 	.uleb128 0x57
-	.8byte	.LBB1635
-	.8byte	.LBE1635-.LBB1635
+	.8byte	.LBB1702
+	.8byte	.LBE1702-.LBB1702
 	.uleb128 0x58
-	.4byte	0x138b5
+	.4byte	0x1481b
 	.uleb128 0x4f
-	.8byte	.LVL573
-	.4byte	0x145cc
+	.8byte	.LVL653
+	.4byte	0x14fdb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13841
-	.8byte	.LBB1636
-	.8byte	.LBE1636-.LBB1636
+	.4byte	0x147a7
+	.8byte	.LBB1703
+	.8byte	.LBE1703-.LBB1703
 	.byte	0x1
-	.2byte	0x6f3
-	.4byte	0xf339
+	.2byte	0x8ca
+	.4byte	0xf351
 	.uleb128 0x55
-	.4byte	0x13869
+	.4byte	0x147cf
 	.uleb128 0x55
-	.4byte	0x1385d
+	.4byte	0x147c3
 	.uleb128 0x55
-	.4byte	0x13852
+	.4byte	0x147b8
 	.uleb128 0x5e
-	.4byte	0x13876
-	.8byte	.LBB1637
-	.8byte	.LBE1637-.LBB1637
+	.4byte	0x147dc
+	.8byte	.LBB1704
+	.8byte	.LBE1704-.LBB1704
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x138aa
+	.4byte	0x14810
 	.uleb128 0x55
-	.4byte	0x1389e
+	.4byte	0x14804
 	.uleb128 0x55
-	.4byte	0x13892
+	.4byte	0x147f8
 	.uleb128 0x55
-	.4byte	0x13887
+	.4byte	0x147ed
 	.uleb128 0x57
-	.8byte	.LBB1638
-	.8byte	.LBE1638-.LBB1638
+	.8byte	.LBB1705
+	.8byte	.LBE1705-.LBB1705
 	.uleb128 0x58
-	.4byte	0x138b5
+	.4byte	0x1481b
 	.uleb128 0x4f
-	.8byte	.LVL574
-	.4byte	0x145cc
+	.8byte	.LVL654
+	.4byte	0x14fdb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13841
-	.8byte	.LBB1639
-	.8byte	.LBE1639-.LBB1639
+	.4byte	0x147a7
+	.8byte	.LBB1706
+	.8byte	.LBE1706-.LBB1706
 	.byte	0x1
-	.2byte	0x6f6
-	.4byte	0xf3b6
+	.2byte	0x8cd
+	.4byte	0xf3ce
 	.uleb128 0x55
-	.4byte	0x13869
+	.4byte	0x147cf
 	.uleb128 0x55
-	.4byte	0x1385d
+	.4byte	0x147c3
 	.uleb128 0x55
-	.4byte	0x13852
+	.4byte	0x147b8
 	.uleb128 0x5e
-	.4byte	0x13876
-	.8byte	.LBB1640
-	.8byte	.LBE1640-.LBB1640
+	.4byte	0x147dc
+	.8byte	.LBB1707
+	.8byte	.LBE1707-.LBB1707
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x138aa
+	.4byte	0x14810
 	.uleb128 0x55
-	.4byte	0x1389e
+	.4byte	0x14804
 	.uleb128 0x55
-	.4byte	0x13892
+	.4byte	0x147f8
 	.uleb128 0x55
-	.4byte	0x13887
+	.4byte	0x147ed
 	.uleb128 0x57
-	.8byte	.LBB1641
-	.8byte	.LBE1641-.LBB1641
+	.8byte	.LBB1708
+	.8byte	.LBE1708-.LBB1708
 	.uleb128 0x58
-	.4byte	0x138b5
+	.4byte	0x1481b
 	.uleb128 0x4f
-	.8byte	.LVL575
-	.4byte	0x145cc
+	.8byte	.LVL655
+	.4byte	0x14fdb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13841
-	.8byte	.LBB1642
-	.8byte	.LBE1642-.LBB1642
+	.4byte	0x147a7
+	.8byte	.LBB1709
+	.8byte	.LBE1709-.LBB1709
 	.byte	0x1
-	.2byte	0x6f9
-	.4byte	0xf433
+	.2byte	0x8d0
+	.4byte	0xf44b
 	.uleb128 0x55
-	.4byte	0x13869
+	.4byte	0x147cf
 	.uleb128 0x55
-	.4byte	0x1385d
+	.4byte	0x147c3
 	.uleb128 0x55
-	.4byte	0x13852
+	.4byte	0x147b8
 	.uleb128 0x5e
-	.4byte	0x13876
-	.8byte	.LBB1643
-	.8byte	.LBE1643-.LBB1643
+	.4byte	0x147dc
+	.8byte	.LBB1710
+	.8byte	.LBE1710-.LBB1710
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x138aa
+	.4byte	0x14810
 	.uleb128 0x55
-	.4byte	0x1389e
+	.4byte	0x14804
 	.uleb128 0x55
-	.4byte	0x13892
+	.4byte	0x147f8
 	.uleb128 0x55
-	.4byte	0x13887
+	.4byte	0x147ed
 	.uleb128 0x57
-	.8byte	.LBB1644
-	.8byte	.LBE1644-.LBB1644
+	.8byte	.LBB1711
+	.8byte	.LBE1711-.LBB1711
 	.uleb128 0x58
-	.4byte	0x138b5
+	.4byte	0x1481b
 	.uleb128 0x4f
-	.8byte	.LVL576
-	.4byte	0x145cc
+	.8byte	.LVL656
+	.4byte	0x14fdb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13841
-	.8byte	.LBB1645
-	.8byte	.LBE1645-.LBB1645
+	.4byte	0x147a7
+	.8byte	.LBB1712
+	.8byte	.LBE1712-.LBB1712
 	.byte	0x1
-	.2byte	0x6fc
-	.4byte	0xf4b0
+	.2byte	0x8d3
+	.4byte	0xf4c8
 	.uleb128 0x55
-	.4byte	0x13869
+	.4byte	0x147cf
 	.uleb128 0x55
-	.4byte	0x1385d
+	.4byte	0x147c3
 	.uleb128 0x55
-	.4byte	0x13852
+	.4byte	0x147b8
 	.uleb128 0x5e
-	.4byte	0x13876
-	.8byte	.LBB1646
-	.8byte	.LBE1646-.LBB1646
+	.4byte	0x147dc
+	.8byte	.LBB1713
+	.8byte	.LBE1713-.LBB1713
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x138aa
+	.4byte	0x14810
 	.uleb128 0x55
-	.4byte	0x1389e
+	.4byte	0x14804
 	.uleb128 0x55
-	.4byte	0x13892
+	.4byte	0x147f8
 	.uleb128 0x55
-	.4byte	0x13887
+	.4byte	0x147ed
 	.uleb128 0x57
-	.8byte	.LBB1647
-	.8byte	.LBE1647-.LBB1647
+	.8byte	.LBB1714
+	.8byte	.LBE1714-.LBB1714
 	.uleb128 0x58
-	.4byte	0x138b5
+	.4byte	0x1481b
 	.uleb128 0x4f
-	.8byte	.LVL577
-	.4byte	0x145cc
+	.8byte	.LVL657
+	.4byte	0x14fdb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x13841
-	.8byte	.LBB1648
-	.8byte	.LBE1648-.LBB1648
+	.4byte	0x147a7
+	.8byte	.LBB1715
+	.8byte	.LBE1715-.LBB1715
 	.byte	0x1
-	.2byte	0x6ff
+	.2byte	0x8d6
 	.uleb128 0x55
-	.4byte	0x13869
+	.4byte	0x147cf
 	.uleb128 0x55
-	.4byte	0x1385d
+	.4byte	0x147c3
 	.uleb128 0x55
-	.4byte	0x13852
+	.4byte	0x147b8
 	.uleb128 0x5e
-	.4byte	0x13876
-	.8byte	.LBB1649
-	.8byte	.LBE1649-.LBB1649
+	.4byte	0x147dc
+	.8byte	.LBB1716
+	.8byte	.LBE1716-.LBB1716
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x138aa
+	.4byte	0x14810
 	.uleb128 0x55
-	.4byte	0x1389e
+	.4byte	0x14804
 	.uleb128 0x55
-	.4byte	0x13892
+	.4byte	0x147f8
 	.uleb128 0x55
-	.4byte	0x13887
+	.4byte	0x147ed
 	.uleb128 0x57
-	.8byte	.LBB1650
-	.8byte	.LBE1650-.LBB1650
+	.8byte	.LBB1717
+	.8byte	.LBE1717-.LBB1717
 	.uleb128 0x58
-	.4byte	0x138b5
+	.4byte	0x1481b
 	.uleb128 0x4f
-	.8byte	.LVL578
-	.4byte	0x145cc
+	.8byte	.LVL658
+	.4byte	0x14fdb
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0xff3a
-	.8byte	.LBB1657
-	.4byte	.Ldebug_ranges0+0xca0
+	.4byte	0xfea7
+	.8byte	.LBB1724
+	.4byte	.Ldebug_ranges0+0xe20
 	.byte	0x1
-	.2byte	0x9e5
-	.4byte	0xf6d8
+	.2byte	0xbb7
+	.4byte	0xf645
 	.uleb128 0x55
-	.4byte	0xff4b
+	.4byte	0xfeb8
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xca0
+	.4byte	.Ldebug_ranges0+0xe20
 	.uleb128 0x61
-	.4byte	0xff57
-	.4byte	.LLST160
+	.4byte	0xfec4
+	.4byte	.LLST205
 	.uleb128 0x58
-	.4byte	0xff63
+	.4byte	0xfed0
 	.uleb128 0x58
-	.4byte	0xff6f
+	.4byte	0xfedc
 	.uleb128 0x58
-	.4byte	0xff7b
+	.4byte	0xfee8
 	.uleb128 0x62
-	.4byte	0xff87
+	.4byte	0xfef4
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x58
-	.4byte	0xff91
+	.4byte	0xfefe
 	.uleb128 0x58
-	.4byte	0xff9d
+	.4byte	0xff0a
 	.uleb128 0x58
-	.4byte	0xffa9
+	.4byte	0xff16
 	.uleb128 0x5c
-	.4byte	0x13956
-	.8byte	.LBB1659
-	.4byte	.Ldebug_ranges0+0xd10
+	.4byte	0x148bc
+	.8byte	.LBB1726
+	.4byte	.Ldebug_ranges0+0xe90
 	.byte	0x1
-	.2byte	0x8cd
-	.4byte	0xf59b
+	.2byte	0xaa7
+	.4byte	0xf5b3
 	.uleb128 0x55
-	.4byte	0x13966
+	.4byte	0x148cc
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13920
-	.8byte	.LBB1663
-	.4byte	.Ldebug_ranges0+0xd40
-	.byte	0x1
-	.2byte	0x8e8
-	.4byte	0xf5d0
-	.uleb128 0x55
-	.4byte	0x13949
-	.uleb128 0x55
-	.4byte	0x1393d
-	.uleb128 0x55
-	.4byte	0x13931
-	.uleb128 0x4f
-	.8byte	.LVL584
-	.4byte	0x145bf
-	.byte	0
-	.uleb128 0x54
-	.4byte	0x13920
-	.8byte	.LBB1671
-	.8byte	.LBE1671-.LBB1671
-	.byte	0x1
-	.2byte	0x8eb
-	.4byte	0xf609
-	.uleb128 0x55
-	.4byte	0x13949
-	.uleb128 0x55
-	.4byte	0x1393d
-	.uleb128 0x55
-	.4byte	0x13931
-	.uleb128 0x4f
-	.8byte	.LVL585
-	.4byte	0x145bf
-	.byte	0
-	.uleb128 0x54
-	.4byte	0x13920
-	.8byte	.LBB1673
-	.8byte	.LBE1673-.LBB1673
-	.byte	0x1
-	.2byte	0x8ee
-	.4byte	0xf642
-	.uleb128 0x55
-	.4byte	0x13949
-	.uleb128 0x55
-	.4byte	0x1393d
-	.uleb128 0x55
-	.4byte	0x13931
-	.uleb128 0x4f
-	.8byte	.LVL586
-	.4byte	0x145bf
-	.byte	0
-	.uleb128 0x54
-	.4byte	0x13920
-	.8byte	.LBB1675
-	.8byte	.LBE1675-.LBB1675
+	.4byte	0x14886
+	.8byte	.LBB1730
+	.4byte	.Ldebug_ranges0+0xec0
 	.byte	0x1
-	.2byte	0x8f6
-	.4byte	0xf67b
+	.2byte	0xac6
+	.4byte	0xf5e8
 	.uleb128 0x55
-	.4byte	0x13949
+	.4byte	0x148af
 	.uleb128 0x55
-	.4byte	0x1393d
+	.4byte	0x148a3
 	.uleb128 0x55
-	.4byte	0x13931
+	.4byte	0x14897
 	.uleb128 0x4f
-	.8byte	.LVL587
-	.4byte	0x145bf
+	.8byte	.LVL664
+	.4byte	0x14fce
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL580
-	.4byte	0x145d9
+	.8byte	.LVL660
+	.4byte	0x14fe8
 	.uleb128 0x4f
-	.8byte	.LVL581
-	.4byte	0x145e6
+	.8byte	.LVL661
+	.4byte	0x14ff5
 	.uleb128 0x4f
-	.8byte	.LVL582
-	.4byte	0x145f2
+	.8byte	.LVL662
+	.4byte	0x15001
 	.uleb128 0x4f
-	.8byte	.LVL583
-	.4byte	0x145fe
+	.8byte	.LVL663
+	.4byte	0x1500d
 	.uleb128 0x4f
-	.8byte	.LVL588
-	.4byte	0x1460a
+	.8byte	.LVL665
+	.4byte	0x15019
 	.uleb128 0x4f
-	.8byte	.LVL589
-	.4byte	0x14614
+	.8byte	.LVL666
+	.4byte	0x15023
 	.uleb128 0x4f
-	.8byte	.LVL602
-	.4byte	0x14620
+	.8byte	.LVL679
+	.4byte	0x1502f
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0xffb4
-	.8byte	.LBB1684
-	.4byte	.Ldebug_ranges0+0xd90
+	.4byte	0xff21
+	.8byte	.LBB1741
+	.4byte	.Ldebug_ranges0+0xef0
 	.byte	0x1
-	.2byte	0x9ec
-	.4byte	0xf7b1
+	.2byte	0xbbe
+	.4byte	0xf71e
 	.uleb128 0x55
-	.4byte	0xffc5
+	.4byte	0xff32
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xd90
+	.4byte	.Ldebug_ranges0+0xef0
 	.uleb128 0x58
-	.4byte	0xffd1
+	.4byte	0xff3e
 	.uleb128 0x61
-	.4byte	0xffdd
-	.4byte	.LLST161
+	.4byte	0xff4a
+	.4byte	.LLST206
 	.uleb128 0x58
-	.4byte	0xffe9
+	.4byte	0xff56
 	.uleb128 0x62
-	.4byte	0xfff5
+	.4byte	0xff62
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x61
-	.4byte	0xffff
-	.4byte	.LLST162
+	.4byte	0xff6c
+	.4byte	.LLST207
 	.uleb128 0x58
-	.4byte	0x1000b
+	.4byte	0xff78
 	.uleb128 0x58
-	.4byte	0x10017
+	.4byte	0xff84
 	.uleb128 0x5c
-	.4byte	0x13956
-	.8byte	.LBB1686
-	.4byte	.Ldebug_ranges0+0xdf0
+	.4byte	0x148bc
+	.8byte	.LBB1743
+	.4byte	.Ldebug_ranges0+0xf40
 	.byte	0x1
-	.2byte	0x89d
-	.4byte	0xf747
+	.2byte	0xa77
+	.4byte	0xf6b4
 	.uleb128 0x55
-	.4byte	0x13966
+	.4byte	0x148cc
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL591
-	.4byte	0x145d9
+	.8byte	.LVL668
+	.4byte	0x14fe8
 	.uleb128 0x4f
-	.8byte	.LVL592
-	.4byte	0x145e6
+	.8byte	.LVL669
+	.4byte	0x14ff5
 	.uleb128 0x4f
-	.8byte	.LVL606
-	.4byte	0x145f2
+	.8byte	.LVL683
+	.4byte	0x15001
 	.uleb128 0x4f
-	.8byte	.LVL607
-	.4byte	0x1462d
+	.8byte	.LVL684
+	.4byte	0x1503c
 	.uleb128 0x4f
-	.8byte	.LVL694
-	.4byte	0x14620
+	.8byte	.LVL770
+	.4byte	0x1502f
 	.uleb128 0x4f
-	.8byte	.LVL695
-	.4byte	0x14639
+	.8byte	.LVL771
+	.4byte	0x15048
 	.uleb128 0x4f
-	.8byte	.LVL696
-	.4byte	0x14620
+	.8byte	.LVL772
+	.4byte	0x1502f
 	.uleb128 0x4f
-	.8byte	.LVL710
-	.4byte	0x14620
+	.8byte	.LVL785
+	.4byte	0x1502f
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0xff02
-	.8byte	.LBB1696
-	.4byte	.Ldebug_ranges0+0xe20
+	.4byte	0xfe6f
+	.8byte	.LBB1752
+	.4byte	.Ldebug_ranges0+0xf70
 	.byte	0x1
-	.2byte	0x9f3
-	.4byte	0xf94b
+	.2byte	0xbc5
+	.4byte	0xf8b8
 	.uleb128 0x55
-	.4byte	0xff13
+	.4byte	0xfe80
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xe20
+	.4byte	.Ldebug_ranges0+0xf70
 	.uleb128 0x62
-	.4byte	0xff1f
+	.4byte	0xfe8c
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5c
-	.4byte	0x13b1b
-	.8byte	.LBB1698
-	.4byte	.Ldebug_ranges0+0xe60
+	.4byte	0x14a81
+	.8byte	.LBB1754
+	.4byte	.Ldebug_ranges0+0xfb0
 	.byte	0x1
-	.2byte	0x903
-	.4byte	0xf838
+	.2byte	0xad3
+	.4byte	0xf7a5
 	.uleb128 0x55
-	.4byte	0x13b28
+	.4byte	0x14a8e
 	.uleb128 0x57
-	.8byte	.LBB1700
-	.8byte	.LBE1700-.LBB1700
+	.8byte	.LBB1756
+	.8byte	.LBE1756-.LBB1756
 	.uleb128 0x58
-	.4byte	0x13b54
+	.4byte	0x14aba
 	.uleb128 0x5d
-	.4byte	0x13d00
-	.8byte	.LBB1701
-	.8byte	.LBE1701-.LBB1701
+	.4byte	0x14c66
+	.8byte	.LBB1757
+	.8byte	.LBE1757-.LBB1757
 	.byte	0x10
 	.byte	0x1c
 	.uleb128 0x55
-	.4byte	0x13d23
+	.4byte	0x14c89
 	.uleb128 0x55
-	.4byte	0x13d17
+	.4byte	0x14c7d
 	.uleb128 0x55
-	.4byte	0x13d0d
+	.4byte	0x14c73
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13c3c
-	.8byte	.LBB1705
-	.8byte	.LBE1705-.LBB1705
+	.4byte	0x14ba2
+	.8byte	.LBB1761
+	.8byte	.LBE1761-.LBB1761
 	.byte	0x1
-	.2byte	0x90d
-	.4byte	0xf883
+	.2byte	0xadd
+	.4byte	0xf7f0
 	.uleb128 0x55
-	.4byte	0x13c52
+	.4byte	0x14bb8
 	.uleb128 0x55
-	.4byte	0x13c49
+	.4byte	0x14baf
 	.uleb128 0x57
-	.8byte	.LBB1706
-	.8byte	.LBE1706-.LBB1706
+	.8byte	.LBB1762
+	.8byte	.LBE1762-.LBB1762
 	.uleb128 0x61
-	.4byte	0x13c5b
-	.4byte	.LLST163
+	.4byte	0x14bc1
+	.4byte	.LLST208
 	.uleb128 0x61
-	.4byte	0x13c65
-	.4byte	.LLST164
+	.4byte	0x14bcb
+	.4byte	.LLST209
 	.byte	0
 	.byte	0
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0xe90
-	.4byte	0xf8b0
+	.4byte	.Ldebug_ranges0+0xfe0
+	.4byte	0xf81d
 	.uleb128 0x61
-	.4byte	0xff2c
-	.4byte	.LLST165
+	.4byte	0xfe99
+	.4byte	.LLST210
 	.uleb128 0x4f
-	.8byte	.LVL615
-	.4byte	0x14645
+	.8byte	.LVL692
+	.4byte	0x15054
 	.uleb128 0x4f
-	.8byte	.LVL617
-	.4byte	0x14651
+	.8byte	.LVL694
+	.4byte	0x15060
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13c3c
-	.8byte	.LBB1709
-	.8byte	.LBE1709-.LBB1709
+	.4byte	0x14ba2
+	.8byte	.LBB1765
+	.8byte	.LBE1765-.LBB1765
 	.byte	0x1
-	.2byte	0x916
-	.4byte	0xf8fb
+	.2byte	0xae6
+	.4byte	0xf868
 	.uleb128 0x55
-	.4byte	0x13c52
+	.4byte	0x14bb8
 	.uleb128 0x55
-	.4byte	0x13c49
+	.4byte	0x14baf
 	.uleb128 0x57
-	.8byte	.LBB1710
-	.8byte	.LBE1710-.LBB1710
+	.8byte	.LBB1766
+	.8byte	.LBE1766-.LBB1766
 	.uleb128 0x61
-	.4byte	0x13c5b
-	.4byte	.LLST166
+	.4byte	0x14bc1
+	.4byte	.LLST211
 	.uleb128 0x61
-	.4byte	0x13c65
-	.4byte	.LLST167
+	.4byte	0x14bcb
+	.4byte	.LLST212
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL608
-	.4byte	0x1465e
+	.8byte	.LVL685
+	.4byte	0x1506d
 	.uleb128 0x4f
-	.8byte	.LVL609
-	.4byte	0x14645
+	.8byte	.LVL686
+	.4byte	0x15054
 	.uleb128 0x4f
-	.8byte	.LVL610
-	.4byte	0x1466b
+	.8byte	.LVL687
+	.4byte	0x1507a
 	.uleb128 0x4f
-	.8byte	.LVL618
-	.4byte	0x1466b
+	.8byte	.LVL695
+	.4byte	0x1507a
 	.uleb128 0x4f
-	.8byte	.LVL697
-	.4byte	0x14620
+	.8byte	.LVL775
+	.4byte	0x1502f
 	.uleb128 0x4f
-	.8byte	.LVL701
-	.4byte	0x14620
+	.8byte	.LVL779
+	.4byte	0x1502f
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0xfee8
-	.8byte	.LBB1713
-	.8byte	.LBE1713-.LBB1713
+	.4byte	0xfe55
+	.8byte	.LBB1769
+	.8byte	.LBE1769-.LBB1769
 	.byte	0x1
-	.2byte	0x9fa
-	.4byte	0xf9e5
+	.2byte	0xbcc
+	.4byte	0xf952
 	.uleb128 0x55
-	.4byte	0xfef5
+	.4byte	0xfe62
 	.uleb128 0x5c
-	.4byte	0x13579
-	.8byte	.LBB1715
-	.4byte	.Ldebug_ranges0+0xec0
+	.4byte	0x144df
+	.8byte	.LBB1771
+	.4byte	.Ldebug_ranges0+0x1010
 	.byte	0x1
-	.2byte	0x926
-	.4byte	0xf9b0
+	.2byte	0xaf6
+	.4byte	0xf91d
 	.uleb128 0x55
-	.4byte	0x1359e
+	.4byte	0x14504
 	.uleb128 0x55
-	.4byte	0x13592
+	.4byte	0x144f8
 	.uleb128 0x55
-	.4byte	0x13586
+	.4byte	0x144ec
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xec0
+	.4byte	.Ldebug_ranges0+0x1010
 	.uleb128 0x61
-	.4byte	0x135aa
-	.4byte	.LLST168
+	.4byte	0x14510
+	.4byte	.LLST213
 	.uleb128 0x4f
-	.8byte	.LVL625
-	.4byte	0x14678
+	.8byte	.LVL702
+	.4byte	0x15087
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL626
-	.4byte	0x14684
+	.8byte	.LVL703
+	.4byte	0x15093
 	.uleb128 0x4f
-	.8byte	.LVL627
-	.4byte	0x14690
+	.8byte	.LVL704
+	.4byte	0x1509f
 	.uleb128 0x4f
-	.8byte	.LVL628
-	.4byte	0x14684
+	.8byte	.LVL705
+	.4byte	0x15093
 	.uleb128 0x4f
-	.8byte	.LVL629
-	.4byte	0x14690
+	.8byte	.LVL706
+	.4byte	0x1509f
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0xfe46
-	.8byte	.LBB1725
-	.4byte	.Ldebug_ranges0+0xf20
+	.4byte	0xfdb3
+	.8byte	.LBB1781
+	.4byte	.Ldebug_ranges0+0x1070
 	.byte	0x1
-	.2byte	0x9fd
-	.4byte	0xfc88
+	.2byte	0xbcf
+	.4byte	0xfbf5
 	.uleb128 0x55
-	.4byte	0xfe63
+	.4byte	0xfdd0
 	.uleb128 0x55
-	.4byte	0xfe57
+	.4byte	0xfdc4
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xf20
+	.4byte	.Ldebug_ranges0+0x1070
 	.uleb128 0x58
-	.4byte	0xfe6f
+	.4byte	0xfddc
 	.uleb128 0x61
-	.4byte	0xfe7b
-	.4byte	.LLST169
+	.4byte	0xfde8
+	.4byte	.LLST214
 	.uleb128 0x61
-	.4byte	0xfe87
-	.4byte	.LLST170
+	.4byte	0xfdf4
+	.4byte	.LLST215
 	.uleb128 0x61
-	.4byte	0xfe93
-	.4byte	.LLST171
+	.4byte	0xfe00
+	.4byte	.LLST216
 	.uleb128 0x61
-	.4byte	0xfe9f
-	.4byte	.LLST172
+	.4byte	0xfe0c
+	.4byte	.LLST217
 	.uleb128 0x61
-	.4byte	0xfeab
-	.4byte	.LLST173
+	.4byte	0xfe18
+	.4byte	.LLST218
 	.uleb128 0x61
-	.4byte	0xfeb7
-	.4byte	.LLST174
+	.4byte	0xfe24
+	.4byte	.LLST219
 	.uleb128 0x58
-	.4byte	0xfec3
+	.4byte	0xfe30
 	.uleb128 0x61
-	.4byte	0xfecf
-	.4byte	.LLST175
+	.4byte	0xfe3c
+	.4byte	.LLST220
 	.uleb128 0x61
-	.4byte	0xfedb
-	.4byte	.LLST176
+	.4byte	0xfe48
+	.4byte	.LLST221
 	.uleb128 0x54
-	.4byte	0x11915
-	.8byte	.LBB1727
-	.8byte	.LBE1727-.LBB1727
+	.4byte	0x11882
+	.8byte	.LBB1783
+	.8byte	.LBE1783-.LBB1783
 	.byte	0x1
-	.2byte	0x95e
-	.4byte	0xfac7
+	.2byte	0xb2e
+	.4byte	0xfa34
 	.uleb128 0x55
-	.4byte	0x11926
+	.4byte	0x11893
 	.uleb128 0x55
-	.4byte	0x11926
+	.4byte	0x11893
 	.uleb128 0x57
-	.8byte	.LBB1728
-	.8byte	.LBE1728-.LBB1728
+	.8byte	.LBB1784
+	.8byte	.LBE1784-.LBB1784
 	.uleb128 0x61
-	.4byte	0x11932
-	.4byte	.LLST177
+	.4byte	0x1189f
+	.4byte	.LLST222
 	.uleb128 0x4f
-	.8byte	.LVL646
-	.4byte	0x1469c
+	.8byte	.LVL723
+	.4byte	0x150ab
 	.uleb128 0x4f
-	.8byte	.LVL648
-	.4byte	0x14614
+	.8byte	.LVL725
+	.4byte	0x15023
 	.uleb128 0x4f
-	.8byte	.LVL649
-	.4byte	0x146a8
+	.8byte	.LVL726
+	.4byte	0x150b7
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13700
-	.8byte	.LBB1729
-	.8byte	.LBE1729-.LBB1729
+	.4byte	0x14666
+	.8byte	.LBB1785
+	.8byte	.LBE1785-.LBB1785
 	.byte	0x1
-	.2byte	0x944
-	.4byte	0xfb1e
+	.2byte	0xb14
+	.4byte	0xfa8b
 	.uleb128 0x55
-	.4byte	0x1371d
+	.4byte	0x14683
 	.uleb128 0x55
-	.4byte	0x13711
+	.4byte	0x14677
 	.uleb128 0x5e
-	.4byte	0x1372a
-	.8byte	.LBB1730
-	.8byte	.LBE1730-.LBB1730
+	.4byte	0x14690
+	.8byte	.LBB1786
+	.8byte	.LBE1786-.LBB1786
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x55
-	.4byte	0x13747
+	.4byte	0x146ad
 	.uleb128 0x55
-	.4byte	0x1373b
+	.4byte	0x146a1
 	.uleb128 0x4f
-	.8byte	.LVL666
-	.4byte	0x146b4
+	.8byte	.LVL743
+	.4byte	0x150c3
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13700
-	.8byte	.LBB1732
-	.8byte	.LBE1732-.LBB1732
+	.4byte	0x14666
+	.8byte	.LBB1788
+	.8byte	.LBE1788-.LBB1788
 	.byte	0x1
-	.2byte	0x952
-	.4byte	0xfb75
+	.2byte	0xb22
+	.4byte	0xfae2
 	.uleb128 0x55
-	.4byte	0x1371d
+	.4byte	0x14683
 	.uleb128 0x55
-	.4byte	0x13711
+	.4byte	0x14677
 	.uleb128 0x5e
-	.4byte	0x1372a
-	.8byte	.LBB1733
-	.8byte	.LBE1733-.LBB1733
+	.4byte	0x14690
+	.8byte	.LBB1789
+	.8byte	.LBE1789-.LBB1789
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x55
-	.4byte	0x13747
+	.4byte	0x146ad
 	.uleb128 0x55
-	.4byte	0x1373b
+	.4byte	0x146a1
 	.uleb128 0x4f
-	.8byte	.LVL679
-	.4byte	0x146b4
+	.8byte	.LVL756
+	.4byte	0x150c3
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL631
-	.4byte	0x146c1
+	.8byte	.LVL708
+	.4byte	0x150d0
 	.uleb128 0x4f
-	.8byte	.LVL633
-	.4byte	0x146c1
+	.8byte	.LVL710
+	.4byte	0x150d0
 	.uleb128 0x4f
-	.8byte	.LVL635
-	.4byte	0x146cd
+	.8byte	.LVL712
+	.4byte	0x150dc
 	.uleb128 0x4f
-	.8byte	.LVL640
-	.4byte	0x146cd
+	.8byte	.LVL717
+	.4byte	0x150dc
 	.uleb128 0x4f
-	.8byte	.LVL644
-	.4byte	0x145a6
+	.8byte	.LVL721
+	.4byte	0x14fb5
 	.uleb128 0x4f
-	.8byte	.LVL645
-	.4byte	0x146da
+	.8byte	.LVL722
+	.4byte	0x150e9
 	.uleb128 0x4f
-	.8byte	.LVL650
-	.4byte	0x146e6
+	.8byte	.LVL727
+	.4byte	0x150f5
 	.uleb128 0x4f
-	.8byte	.LVL651
-	.4byte	0x146e6
+	.8byte	.LVL728
+	.4byte	0x150f5
 	.uleb128 0x4f
-	.8byte	.LVL663
-	.4byte	0x146f2
+	.8byte	.LVL740
+	.4byte	0x15101
 	.uleb128 0x4f
-	.8byte	.LVL665
-	.4byte	0x145a6
+	.8byte	.LVL742
+	.4byte	0x14fb5
 	.uleb128 0x4f
-	.8byte	.LVL670
-	.4byte	0x146fe
+	.8byte	.LVL747
+	.4byte	0x1510d
 	.uleb128 0x4f
-	.8byte	.LVL673
-	.4byte	0x1469c
+	.8byte	.LVL750
+	.4byte	0x150ab
 	.uleb128 0x4f
-	.8byte	.LVL675
-	.4byte	0x146fe
+	.8byte	.LVL752
+	.4byte	0x1510d
 	.uleb128 0x4f
-	.8byte	.LVL676
-	.4byte	0x146a8
+	.8byte	.LVL753
+	.4byte	0x150b7
 	.uleb128 0x4f
-	.8byte	.LVL678
-	.4byte	0x145a6
+	.8byte	.LVL755
+	.4byte	0x14fb5
 	.uleb128 0x4f
-	.8byte	.LVL682
-	.4byte	0x146fe
+	.8byte	.LVL759
+	.4byte	0x1510d
 	.uleb128 0x4f
-	.8byte	.LVL686
-	.4byte	0x1469c
+	.8byte	.LVL762
+	.4byte	0x150ab
 	.uleb128 0x4f
-	.8byte	.LVL688
-	.4byte	0x146fe
+	.8byte	.LVL764
+	.4byte	0x1510d
 	.uleb128 0x4f
-	.8byte	.LVL689
-	.4byte	0x146a8
+	.8byte	.LVL765
+	.4byte	0x150b7
 	.uleb128 0x4f
-	.8byte	.LVL708
-	.4byte	0x14620
+	.8byte	.LVL790
+	.4byte	0x1502f
 	.uleb128 0x4f
-	.8byte	.LVL716
-	.4byte	0x14620
+	.8byte	.LVL793
+	.4byte	0x1502f
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x137d4
-	.8byte	.LBB1739
-	.8byte	.LBE1739-.LBB1739
+	.4byte	0x1473a
+	.8byte	.LBB1794
+	.8byte	.LBE1794-.LBB1794
 	.byte	0x1
-	.2byte	0x9ff
-	.4byte	0xfcd1
+	.2byte	0xbd1
+	.4byte	0xfc3e
 	.uleb128 0x55
-	.4byte	0x137ed
+	.4byte	0x14753
 	.uleb128 0x55
-	.4byte	0x137e1
+	.4byte	0x14747
 	.uleb128 0x5d
-	.4byte	0x138dc
-	.8byte	.LBB1740
-	.8byte	.LBE1740-.LBB1740
+	.4byte	0x14842
+	.8byte	.LBB1795
+	.8byte	.LBE1795-.LBB1795
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x55
-	.4byte	0x138f5
+	.4byte	0x1485b
 	.uleb128 0x55
-	.4byte	0x138e9
+	.4byte	0x1484f
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1003a
-	.8byte	.LBB1742
-	.8byte	.LBE1742-.LBB1742
+	.4byte	0xffa7
+	.8byte	.LBB1797
+	.8byte	.LBE1797-.LBB1797
 	.byte	0x1
-	.2byte	0xa02
-	.4byte	0xfd68
+	.2byte	0xbd4
+	.4byte	0xfcd5
 	.uleb128 0x55
-	.4byte	0x1004b
+	.4byte	0xffb8
 	.uleb128 0x4f
-	.8byte	.LVL652
-	.4byte	0x14708
+	.8byte	.LVL729
+	.4byte	0x15117
 	.uleb128 0x4f
-	.8byte	.LVL653
-	.4byte	0x14708
+	.8byte	.LVL730
+	.4byte	0x15117
 	.uleb128 0x4f
-	.8byte	.LVL654
-	.4byte	0x14714
+	.8byte	.LVL731
+	.4byte	0x15123
 	.uleb128 0x4f
-	.8byte	.LVL655
-	.4byte	0x14714
+	.8byte	.LVL732
+	.4byte	0x15123
 	.uleb128 0x4f
-	.8byte	.LVL656
-	.4byte	0x14714
+	.8byte	.LVL733
+	.4byte	0x15123
 	.uleb128 0x4f
-	.8byte	.LVL657
-	.4byte	0x14714
+	.8byte	.LVL734
+	.4byte	0x15123
 	.uleb128 0x4f
-	.8byte	.LVL658
-	.4byte	0x14714
+	.8byte	.LVL735
+	.4byte	0x15123
 	.uleb128 0x4f
-	.8byte	.LVL659
-	.4byte	0x14714
+	.8byte	.LVL736
+	.4byte	0x15123
 	.uleb128 0x4f
-	.8byte	.LVL660
-	.4byte	0x14714
+	.8byte	.LVL737
+	.4byte	0x15123
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL535
-	.4byte	0x145d9
+	.8byte	.LVL615
+	.4byte	0x14fe8
 	.uleb128 0x4f
-	.8byte	.LVL536
-	.4byte	0x14721
+	.8byte	.LVL616
+	.4byte	0x15130
 	.uleb128 0x4f
-	.8byte	.LVL538
-	.4byte	0x1472d
+	.8byte	.LVL618
+	.4byte	0x1513c
 	.uleb128 0x4f
-	.8byte	.LVL544
-	.4byte	0x1473a
+	.8byte	.LVL624
+	.4byte	0x15149
 	.uleb128 0x4f
-	.8byte	.LVL547
-	.4byte	0x14747
+	.8byte	.LVL627
+	.4byte	0x15156
 	.uleb128 0x4f
-	.8byte	.LVL548
-	.4byte	0x14620
+	.8byte	.LVL628
+	.4byte	0x1502f
 	.uleb128 0x4f
-	.8byte	.LVL556
-	.4byte	0x145a6
+	.8byte	.LVL636
+	.4byte	0x14fb5
 	.uleb128 0x4f
-	.8byte	.LVL593
-	.4byte	0x14620
+	.8byte	.LVL670
+	.4byte	0x1502f
 	.uleb128 0x4f
-	.8byte	.LVL595
-	.4byte	0x14620
+	.8byte	.LVL672
+	.4byte	0x1502f
 	.uleb128 0x4f
-	.8byte	.LVL598
-	.4byte	0x14620
+	.8byte	.LVL675
+	.4byte	0x1502f
 	.uleb128 0x4f
-	.8byte	.LVL600
-	.4byte	0x14620
+	.8byte	.LVL677
+	.4byte	0x1502f
 	.uleb128 0x4f
-	.8byte	.LVL603
-	.4byte	0x14620
+	.8byte	.LVL680
+	.4byte	0x1502f
 	.uleb128 0x4f
-	.8byte	.LVL661
-	.4byte	0x145a6
+	.8byte	.LVL738
+	.4byte	0x14fb5
 	.uleb128 0x4f
-	.8byte	.LVL692
-	.4byte	0x14620
+	.8byte	.LVL768
+	.4byte	0x1502f
 	.uleb128 0x4f
-	.8byte	.LVL698
-	.4byte	0x14620
+	.8byte	.LVL776
+	.4byte	0x1502f
 	.uleb128 0x4f
-	.8byte	.LVL703
-	.4byte	0x14620
+	.8byte	.LVL781
+	.4byte	0x1502f
 	.uleb128 0x4f
-	.8byte	.LVL712
-	.4byte	0x14754
+	.8byte	.LVL795
+	.4byte	0x15163
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3065
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x932
+	.2byte	0xb02
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfee8
+	.4byte	0xfe55
 	.uleb128 0x65
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x932
-	.4byte	0xe53f
-	.uleb128 0x66
-	.4byte	.LASF3019
-	.byte	0x1
-	.2byte	0x932
-	.4byte	0xe1dc
-	.uleb128 0x48
-	.4byte	.LASF2975
-	.byte	0x1
-	.2byte	0x934
-	.4byte	0xe85c
+	.2byte	0xb02
+	.4byte	0xe557
+	.uleb128 0x66
+	.4byte	.LASF3020
+	.byte	0x1
+	.2byte	0xb02
+	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3057
+	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x935
-	.4byte	0x6d
+	.2byte	0xb04
+	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x936
+	.2byte	0xb05
 	.4byte	0x6d
 	.uleb128 0x48
 	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x937
-	.4byte	0xc6
+	.2byte	0xb06
+	.4byte	0x6d
 	.uleb128 0x48
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x938
+	.2byte	0xb07
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x939
-	.4byte	0x21e
+	.2byte	0xb08
+	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x93a
+	.2byte	0xb09
+	.4byte	0x21e
+	.uleb128 0x48
+	.4byte	.LASF3063
+	.byte	0x1
+	.2byte	0xb0a
 	.4byte	0x21e
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x93b
-	.4byte	0xe4da
+	.2byte	0xb0b
+	.4byte	0xe4f2
 	.uleb128 0x48
-	.4byte	.LASF3063
+	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x93c
+	.2byte	0xb0c
 	.4byte	0x458
 	.uleb128 0x48
-	.4byte	.LASF3064
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x93d
+	.2byte	0xb0d
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3083
+	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0x91b
+	.2byte	0xaeb
 	.byte	0x1
-	.4byte	0xff02
+	.4byte	0xfe6f
 	.uleb128 0x66
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x91b
-	.4byte	0xe85c
+	.2byte	0xaeb
+	.4byte	0xe874
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3066
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x8ff
+	.2byte	0xacf
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xff3a
+	.4byte	0xfea7
 	.uleb128 0x66
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x8ff
-	.4byte	0xe85c
+	.2byte	0xacf
+	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF2480
 	.byte	0x1
-	.2byte	0x901
+	.2byte	0xad1
 	.4byte	0xd88a
 	.uleb128 0x68
 	.uleb128 0x53
 	.string	"__k"
 	.byte	0x1
-	.2byte	0x910
+	.2byte	0xae0
 	.4byte	0x2f05
 	.byte	0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3067
+	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x8b6
+	.2byte	0xa90
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xffb4
+	.4byte	0xff21
 	.uleb128 0x65
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x8b6
-	.4byte	0xe53f
+	.2byte	0xa90
+	.4byte	0xe557
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x8b8
+	.2byte	0xa92
 	.4byte	0xa5e0
 	.uleb128 0x48
-	.4byte	.LASF3019
+	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x8b9
-	.4byte	0xe1dc
+	.2byte	0xa93
+	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x8ba
-	.4byte	0xe85c
+	.2byte	0xa94
+	.4byte	0xe874
 	.uleb128 0x48
-	.4byte	.LASF3068
+	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0x8bb
+	.2byte	0xa95
 	.4byte	0xb904
 	.uleb128 0x53
 	.string	"r"
 	.byte	0x1
-	.2byte	0x8bc
+	.2byte	0xa96
 	.4byte	0x97bc
 	.uleb128 0x48
-	.4byte	.LASF3069
+	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0x8bd
+	.2byte	0xa97
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x8be
+	.2byte	0xa98
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x8be
+	.2byte	0xa98
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3070
+	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0x88a
+	.2byte	0xa64
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x10025
+	.4byte	0xff92
 	.uleb128 0x66
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x88a
-	.4byte	0xe85c
+	.2byte	0xa64
+	.4byte	0xe874
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x88c
+	.2byte	0xa66
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x88d
+	.2byte	0xa67
 	.4byte	0xa5e0
 	.uleb128 0x48
-	.4byte	.LASF3068
+	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0x88e
+	.2byte	0xa68
 	.4byte	0xb904
 	.uleb128 0x53
 	.string	"r"
 	.byte	0x1
-	.2byte	0x88f
+	.2byte	0xa69
 	.4byte	0x97bc
 	.uleb128 0x48
-	.4byte	.LASF2981
+	.4byte	.LASF2982
 	.byte	0x1
-	.2byte	0x890
+	.2byte	0xa6a
 	.4byte	0x29
 	.uleb128 0x48
-	.4byte	.LASF2982
+	.4byte	.LASF2983
 	.byte	0x1
-	.2byte	0x891
+	.2byte	0xa6b
 	.4byte	0xc6
 	.uleb128 0x69
-	.4byte	.LASF3049
-	.4byte	0x10035
-	.4byte	.LASF3070
+	.4byte	.LASF3050
+	.4byte	0xffa2
+	.4byte	.LASF3071
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0x10035
+	.4byte	0xffa2
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x12
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x10025
+	.4byte	0xff92
 	.uleb128 0x64
-	.4byte	.LASF3071
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x87a
+	.2byte	0xa54
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x10058
+	.4byte	0xffc5
 	.uleb128 0x66
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x87a
-	.4byte	0xe85c
+	.2byte	0xa54
+	.4byte	0xe874
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3072
+	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0x871
+	.2byte	0xa4b
 	.4byte	0x2ee
-	.8byte	.LFB2845
-	.8byte	.LFE2845-.LFB2845
+	.8byte	.LFB2852
+	.8byte	.LFE2852-.LFB2852
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x100b8
+	.4byte	0x10025
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x871
+	.2byte	0xa4b
 	.4byte	0xa5e0
-	.4byte	.LLST81
+	.4byte	.LLST80
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x872
+	.2byte	0xa4c
 	.4byte	0xb45b
-	.4byte	.LLST82
+	.4byte	.LLST81
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x873
+	.2byte	0xa4d
 	.4byte	0x21e
-	.4byte	.LLST83
+	.4byte	.LLST82
 	.uleb128 0x4f
-	.8byte	.LVL314
-	.4byte	0x1475e
+	.8byte	.LVL308
+	.4byte	0x1516d
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3073
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x868
+	.2byte	0xa42
 	.4byte	0x2ee
-	.8byte	.LFB2844
-	.8byte	.LFE2844-.LFB2844
+	.8byte	.LFB2851
+	.8byte	.LFE2851-.LFB2851
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10118
+	.4byte	0x10085
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x868
+	.2byte	0xa42
 	.4byte	0xa5e0
-	.4byte	.LLST84
+	.4byte	.LLST83
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x869
+	.2byte	0xa43
 	.4byte	0xb45b
-	.4byte	.LLST85
+	.4byte	.LLST84
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x86a
+	.2byte	0xa44
 	.4byte	0x21e
-	.4byte	.LLST86
+	.4byte	.LLST85
 	.uleb128 0x4f
-	.8byte	.LVL319
-	.4byte	0x1476a
+	.8byte	.LVL313
+	.4byte	0x15179
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3074
+	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x85f
+	.2byte	0xa39
 	.4byte	0x2ee
-	.8byte	.LFB2843
-	.8byte	.LFE2843-.LFB2843
+	.8byte	.LFB2850
+	.8byte	.LFE2850-.LFB2850
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10178
+	.4byte	0x100e5
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x85f
+	.2byte	0xa39
 	.4byte	0xa5e0
-	.4byte	.LLST87
+	.4byte	.LLST86
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x860
+	.2byte	0xa3a
 	.4byte	0xb45b
-	.4byte	.LLST88
+	.4byte	.LLST87
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x861
+	.2byte	0xa3b
 	.4byte	0x21e
-	.4byte	.LLST89
+	.4byte	.LLST88
 	.uleb128 0x4f
-	.8byte	.LVL324
-	.4byte	0x1476a
+	.8byte	.LVL318
+	.4byte	0x15179
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3075
+	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0x847
+	.2byte	0xa21
 	.4byte	0x2ee
-	.8byte	.LFB2842
-	.8byte	.LFE2842-.LFB2842
+	.8byte	.LFB2849
+	.8byte	.LFE2849-.LFB2849
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10248
+	.4byte	0x101b5
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x847
+	.2byte	0xa21
 	.4byte	0xa5e0
-	.4byte	.LLST99
+	.4byte	.LLST98
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x848
+	.2byte	0xa22
 	.4byte	0xb45b
-	.4byte	.LLST100
+	.4byte	.LLST99
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x849
+	.2byte	0xa23
 	.4byte	0x56
-	.4byte	.LLST101
+	.4byte	.LLST100
 	.uleb128 0x59
 	.4byte	.LASF383
 	.byte	0x1
-	.2byte	0x849
+	.2byte	0xa23
 	.4byte	0x2e3
-	.4byte	.LLST102
+	.4byte	.LLST101
 	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x84b
-	.4byte	0xe53f
-	.4byte	.LLST103
+	.2byte	0xa25
+	.4byte	0xe557
+	.4byte	.LLST102
 	.uleb128 0x5a
 	.4byte	.LASF2470
 	.byte	0x1
-	.2byte	0x84c
+	.2byte	0xa26
 	.4byte	0xc6
-	.4byte	.LLST104
+	.4byte	.LLST103
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x84c
+	.2byte	0xa26
 	.4byte	0xc6
 	.uleb128 0x4f
-	.8byte	.LVL350
-	.4byte	0x14777
+	.8byte	.LVL344
+	.4byte	0x15186
 	.uleb128 0x4f
-	.8byte	.LVL352
-	.4byte	0x14784
+	.8byte	.LVL346
+	.4byte	0x15193
 	.uleb128 0x4f
-	.8byte	.LVL357
-	.4byte	0x14620
+	.8byte	.LVL351
+	.4byte	0x1502f
 	.uleb128 0x4f
-	.8byte	.LVL360
-	.4byte	0x14620
+	.8byte	.LVL354
+	.4byte	0x1502f
 	.uleb128 0x4f
-	.8byte	.LVL361
-	.4byte	0x14754
+	.8byte	.LVL355
+	.4byte	0x15163
 	.byte	0
 	.uleb128 0x51
-	.4byte	.LASF3076
+	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x83b
+	.2byte	0xa15
 	.4byte	0x2ee
-	.8byte	.LFB2841
-	.8byte	.LFE2841-.LFB2841
+	.8byte	.LFB2848
+	.8byte	.LFE2848-.LFB2848
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x102e2
+	.4byte	0x1024f
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x83b
+	.2byte	0xa15
 	.4byte	0xa5e0
-	.4byte	.LLST90
+	.4byte	.LLST89
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x83c
+	.2byte	0xa16
 	.4byte	0xb45b
-	.4byte	.LLST91
+	.4byte	.LLST90
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x83d
+	.2byte	0xa17
 	.4byte	0x21e
-	.4byte	.LLST92
+	.4byte	.LLST91
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x83f
-	.4byte	0xe53f
+	.2byte	0xa19
+	.4byte	0xe557
 	.uleb128 0x48
 	.4byte	.LASF2470
 	.byte	0x1
-	.2byte	0x840
+	.2byte	0xa1a
 	.4byte	0xc6
 	.uleb128 0x54
-	.4byte	0x13494
-	.8byte	.LBB1214
-	.8byte	.LBE1214-.LBB1214
+	.4byte	0x143fa
+	.8byte	.LBB1224
+	.8byte	.LBE1224-.LBB1224
 	.byte	0x1
-	.2byte	0x842
-	.4byte	0x102d4
+	.2byte	0xa1c
+	.4byte	0x10241
 	.uleb128 0x55
-	.4byte	0x134a4
+	.4byte	0x1440a
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL329
-	.4byte	0x1476a
+	.8byte	.LVL323
+	.4byte	0x15179
 	.byte	0
 	.uleb128 0x51
-	.4byte	.LASF3077
+	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0x82d
+	.2byte	0xa07
 	.4byte	0x2ee
-	.8byte	.LFB2840
-	.8byte	.LFE2840-.LFB2840
+	.8byte	.LFB2847
+	.8byte	.LFE2847-.LFB2847
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1038b
+	.4byte	0x102f8
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x82d
+	.2byte	0xa07
 	.4byte	0xa5e0
-	.4byte	.LLST93
+	.4byte	.LLST92
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x82e
+	.2byte	0xa08
 	.4byte	0xb45b
-	.4byte	.LLST94
+	.4byte	.LLST93
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x82f
+	.2byte	0xa09
 	.4byte	0x21e
-	.4byte	.LLST95
+	.4byte	.LLST94
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x831
-	.4byte	0xe53f
+	.2byte	0xa0b
+	.4byte	0xe557
 	.uleb128 0x6a
 	.string	"t"
 	.byte	0x1
-	.2byte	0x832
+	.2byte	0xa0c
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x5c
-	.4byte	0x134b1
-	.8byte	.LBB1216
+	.4byte	0x14417
+	.8byte	.LBB1226
 	.4byte	.Ldebug_ranges0+0x6a0
 	.byte	0x1
-	.2byte	0x834
-	.4byte	0x10370
+	.2byte	0xa0e
+	.4byte	0x102dd
 	.uleb128 0x55
-	.4byte	0x134cd
+	.4byte	0x14433
 	.uleb128 0x55
-	.4byte	0x134c1
+	.4byte	0x14427
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL336
-	.4byte	0x1476a
+	.8byte	.LVL330
+	.4byte	0x15179
 	.uleb128 0x4f
-	.8byte	.LVL339
-	.4byte	0x14754
+	.8byte	.LVL333
+	.4byte	0x15163
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3078
+	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0x822
+	.2byte	0x9fc
 	.4byte	0x2ee
-	.8byte	.LFB2839
-	.8byte	.LFE2839-.LFB2839
+	.8byte	.LFB2846
+	.8byte	.LFE2846-.LFB2846
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x103f7
+	.4byte	0x10364
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x822
+	.2byte	0x9fc
 	.4byte	0xa5e0
-	.4byte	.LLST96
+	.4byte	.LLST95
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x823
+	.2byte	0x9fd
 	.4byte	0xb45b
-	.4byte	.LLST97
+	.4byte	.LLST96
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x824
+	.2byte	0x9fe
 	.4byte	0x21e
-	.4byte	.LLST98
+	.4byte	.LLST97
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x826
-	.4byte	0xe53f
+	.2byte	0xa00
+	.4byte	0xe557
 	.uleb128 0x4f
-	.8byte	.LVL344
-	.4byte	0x1476a
+	.8byte	.LVL338
+	.4byte	0x15179
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3079
+	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0x817
+	.2byte	0x9f1
 	.4byte	0x2ee
-	.8byte	.LFB2838
-	.8byte	.LFE2838-.LFB2838
+	.8byte	.LFB2845
+	.8byte	.LFE2845-.LFB2845
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10470
+	.4byte	0x103dd
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x817
+	.2byte	0x9f1
 	.4byte	0xa5e0
-	.4byte	.LLST105
+	.4byte	.LLST104
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x818
+	.2byte	0x9f2
 	.4byte	0xb45b
-	.4byte	.LLST106
+	.4byte	.LLST105
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x819
+	.2byte	0x9f3
 	.4byte	0x21e
-	.4byte	.LLST107
+	.4byte	.LLST106
 	.uleb128 0x48
-	.4byte	.LASF3080
+	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0x81b
+	.2byte	0x9f5
 	.4byte	0x56
 	.uleb128 0x4f
-	.8byte	.LVL363
-	.4byte	0x14790
+	.8byte	.LVL357
+	.4byte	0x1519f
 	.uleb128 0x4f
-	.8byte	.LVL364
-	.4byte	0x1476a
+	.8byte	.LVL358
+	.4byte	0x15179
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3081
+	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0x804
+	.2byte	0x9de
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1049a
+	.4byte	0x10407
 	.uleb128 0x66
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0x804
+	.2byte	0x9de
 	.4byte	0x1c7f
 	.uleb128 0x66
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x804
+	.2byte	0x9de
 	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3082
+	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0x7f4
+	.2byte	0x9ce
 	.4byte	0xc6
-	.8byte	.LFB2836
-	.8byte	.LFE2836-.LFB2836
+	.8byte	.LFB2843
+	.8byte	.LFE2843-.LFB2843
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10502
+	.4byte	0x1046f
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x7f4
+	.2byte	0x9ce
 	.4byte	0x55cc
-	.4byte	.LLST16
+	.4byte	.LLST18
 	.uleb128 0x52
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x7f4
+	.2byte	0x9ce
 	.4byte	0x3d25
-	.4byte	.LLST17
+	.4byte	.LLST19
 	.uleb128 0x48
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x7f6
-	.4byte	0xe85c
+	.2byte	0x9d0
+	.4byte	0xe874
 	.uleb128 0x48
 	.4byte	.LASF898
 	.byte	0x1
-	.2byte	0x7f7
+	.2byte	0x9d1
 	.4byte	0x29
 	.uleb128 0x4f
-	.8byte	.LVL82
-	.4byte	0x1479c
+	.8byte	.LVL84
+	.4byte	0x151ab
 	.byte	0
 	.uleb128 0x6b
-	.4byte	.LASF3084
+	.4byte	.LASF3085
 	.byte	0x1
-	.2byte	0x7dd
+	.2byte	0x9b7
 	.4byte	0xc6
-	.4byte	0x1052b
+	.4byte	0x10498
 	.uleb128 0x66
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0x7dd
+	.2byte	0x9b7
 	.4byte	0x1c7f
 	.uleb128 0x66
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x7dd
+	.2byte	0x9b7
 	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3085
+	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0x7ce
+	.2byte	0x9a8
 	.4byte	0xc6
-	.8byte	.LFB2834
-	.8byte	.LFE2834-.LFB2834
+	.8byte	.LFB2841
+	.8byte	.LFE2841-.LFB2841
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10594
+	.4byte	0x10501
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x7ce
+	.2byte	0x9a8
 	.4byte	0x55cc
-	.4byte	.LLST14
+	.4byte	.LLST16
 	.uleb128 0x52
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x7ce
+	.2byte	0x9a8
 	.4byte	0x3d25
-	.4byte	.LLST15
+	.4byte	.LLST17
 	.uleb128 0x48
 	.4byte	.LASF898
 	.byte	0x1
-	.2byte	0x7d0
+	.2byte	0x9aa
 	.4byte	0x29
 	.uleb128 0x4f
-	.8byte	.LVL76
-	.4byte	0x147a9
+	.8byte	.LVL78
+	.4byte	0x151b8
 	.uleb128 0x4f
-	.8byte	.LVL77
-	.4byte	0x1479c
+	.8byte	.LVL79
+	.4byte	0x151ab
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3086
+	.4byte	.LASF3087
 	.byte	0x1
-	.2byte	0x705
+	.2byte	0x8dc
 	.4byte	0x199
-	.8byte	.LFB2833
-	.8byte	.LFE2833-.LFB2833
+	.8byte	.LFB2840
+	.8byte	.LFE2840-.LFB2840
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1183c
+	.4byte	0x117a9
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x705
+	.2byte	0x8dc
 	.4byte	0x55cc
-	.4byte	.LLST18
+	.4byte	.LLST20
 	.uleb128 0x52
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0x705
+	.2byte	0x8dc
 	.4byte	0x6d
-	.4byte	.LLST19
+	.4byte	.LLST21
 	.uleb128 0x52
 	.string	"arg"
 	.byte	0x1
-	.2byte	0x705
+	.2byte	0x8dc
 	.4byte	0x29
-	.4byte	.LLST20
+	.4byte	.LLST22
 	.uleb128 0x48
-	.4byte	.LASF3087
+	.4byte	.LASF3088
 	.byte	0x1
-	.2byte	0x707
+	.2byte	0x8de
 	.4byte	0x458
 	.uleb128 0x48
-	.4byte	.LASF3019
+	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x708
-	.4byte	0xe1dc
+	.2byte	0x8df
+	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x709
-	.4byte	0xe85c
+	.2byte	0x8e0
+	.4byte	0xe874
 	.uleb128 0x4d
-	.4byte	.LASF3088
+	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x70a
-	.4byte	0xda82
+	.2byte	0x8e1
+	.4byte	0xda8e
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 -56
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x70b
-	.4byte	0xe4da
+	.2byte	0x8e2
+	.4byte	0xe4f2
 	.uleb128 0x48
-	.4byte	.LASF3089
+	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x70c
+	.2byte	0x8e3
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3090
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x70d
+	.2byte	0x8e4
 	.4byte	0x29
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x70e
+	.2byte	0x8e5
 	.4byte	0xc6
 	.uleb128 0x56
-	.4byte	.LASF3049
-	.4byte	0x1184c
+	.4byte	.LASF3050
+	.4byte	0x117b9
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35011
+	.8byte	__func__.35181
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x1a0
-	.4byte	0x106fe
+	.4byte	0x1066b
 	.uleb128 0x48
-	.4byte	.LASF3091
+	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x758
+	.2byte	0x931
 	.4byte	0xc6
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1a0
 	.uleb128 0x6c
-	.4byte	.LASF3103
+	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x758
-	.8byte	.L216
+	.2byte	0x931
+	.8byte	.L195
 	.uleb128 0x4d
-	.4byte	.LASF3092
+	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x758
+	.2byte	0x931
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -96
 	.uleb128 0x48
-	.4byte	.LASF3091
+	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x758
+	.2byte	0x931
 	.4byte	0x199
 	.uleb128 0x6d
-	.8byte	.LBB1006
-	.8byte	.LBE1006-.LBB1006
-	.4byte	0x106e2
+	.8byte	.LBB1016
+	.8byte	.LBE1016-.LBB1016
+	.4byte	0x1064f
 	.uleb128 0x5a
-	.4byte	.LASF3093
+	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x758
+	.2byte	0x931
 	.4byte	0x199
-	.4byte	.LLST35
+	.4byte	.LLST37
 	.uleb128 0x4f
-	.8byte	.LVL127
-	.4byte	0x147b5
+	.8byte	.LVL129
+	.4byte	0x151c4
 	.uleb128 0x4f
-	.8byte	.LVL128
-	.4byte	0x147c1
+	.8byte	.LVL130
+	.4byte	0x151d0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL125
-	.4byte	0x147ce
+	.8byte	.LVL127
+	.4byte	0x151dd
 	.uleb128 0x4f
-	.8byte	.LVL129
-	.4byte	0x147da
+	.8byte	.LVL131
+	.4byte	0x151e9
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x135b5
-	.8byte	.LBB942
+	.4byte	0x1451b
+	.8byte	.LBB952
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x7c0
-	.4byte	0x1091e
+	.2byte	0x99a
+	.4byte	0x1088b
 	.uleb128 0x55
-	.4byte	0x135db
+	.4byte	0x14541
 	.uleb128 0x55
-	.4byte	0x135cf
+	.4byte	0x14535
 	.uleb128 0x55
-	.4byte	0x135c5
+	.4byte	0x1452b
 	.uleb128 0x6e
-	.4byte	0x13615
-	.8byte	.LBB943
+	.4byte	0x1457b
+	.8byte	.LBB953
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1363b
+	.4byte	0x145a1
 	.uleb128 0x55
-	.4byte	0x1362f
+	.4byte	0x14595
 	.uleb128 0x55
-	.4byte	0x13625
+	.4byte	0x1458b
 	.uleb128 0x6f
-	.4byte	0x136b4
-	.8byte	.LBB945
+	.4byte	0x1461a
+	.8byte	.LBB955
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10854
+	.4byte	0x107c1
 	.uleb128 0x55
-	.4byte	0x136d0
+	.4byte	0x14636
 	.uleb128 0x70
-	.4byte	0x136c4
-	.4byte	.LLST21
+	.4byte	0x1462a
+	.4byte	.LLST23
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x80
 	.uleb128 0x61
-	.4byte	0x136dc
-	.4byte	.LLST22
+	.4byte	0x14642
+	.4byte	.LLST24
 	.uleb128 0x61
-	.4byte	0x136e7
-	.4byte	.LLST23
+	.4byte	0x1464d
+	.4byte	.LLST25
 	.uleb128 0x71
-	.4byte	0x13aff
-	.8byte	.LBB947
-	.8byte	.LBE947-.LBB947
+	.4byte	0x14a65
+	.8byte	.LBB957
+	.8byte	.LBE957-.LBB957
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x107ba
+	.4byte	0x10727
 	.uleb128 0x57
-	.8byte	.LBB948
-	.8byte	.LBE948-.LBB948
+	.8byte	.LBB958
+	.8byte	.LBE958-.LBB958
 	.uleb128 0x61
-	.4byte	0x13b0f
-	.4byte	.LLST24
+	.4byte	0x14a75
+	.4byte	.LLST26
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x13ad2
-	.8byte	.LBB949
-	.8byte	.LBE949-.LBB949
+	.4byte	0x14a38
+	.8byte	.LBB959
+	.8byte	.LBE959-.LBB959
 	.byte	0x6
 	.byte	0x55
-	.4byte	0x10802
+	.4byte	0x1076f
 	.uleb128 0x55
-	.4byte	0x13aec
+	.4byte	0x14a52
 	.uleb128 0x55
-	.4byte	0x13ae2
+	.4byte	0x14a48
 	.uleb128 0x5d
-	.4byte	0x13c0f
-	.8byte	.LBB950
-	.8byte	.LBE950-.LBB950
+	.4byte	0x14b75
+	.8byte	.LBB960
+	.8byte	.LBE960-.LBB960
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x13c29
+	.4byte	0x14b8f
 	.uleb128 0x55
-	.4byte	0x13c1f
+	.4byte	0x14b85
 	.byte	0
 	.byte	0
 	.uleb128 0x57
-	.8byte	.LBB952
-	.8byte	.LBE952-.LBB952
+	.8byte	.LBB962
+	.8byte	.LBE962-.LBB962
 	.uleb128 0x58
-	.4byte	0x136f3
+	.4byte	0x14659
 	.uleb128 0x5d
-	.4byte	0x13b85
-	.8byte	.LBB953
-	.8byte	.LBE953-.LBB953
+	.4byte	0x14aeb
+	.8byte	.LBB963
+	.8byte	.LBE963-.LBB963
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x13ba1
+	.4byte	0x14b07
 	.uleb128 0x55
-	.4byte	0x13b95
+	.4byte	0x14afb
 	.uleb128 0x57
-	.8byte	.LBB954
-	.8byte	.LBE954-.LBB954
+	.8byte	.LBB964
+	.8byte	.LBE964-.LBB964
 	.uleb128 0x58
-	.4byte	0x13bad
+	.4byte	0x14b13
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x13680
-	.8byte	.LBB959
-	.8byte	.LBE959-.LBB959
+	.4byte	0x145e6
+	.8byte	.LBB969
+	.8byte	.LBE969-.LBB969
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x1090f
+	.4byte	0x1087c
 	.uleb128 0x55
-	.4byte	0x13690
+	.4byte	0x145f6
 	.uleb128 0x57
-	.8byte	.LBB960
-	.8byte	.LBE960-.LBB960
+	.8byte	.LBB970
+	.8byte	.LBE970-.LBB970
 	.uleb128 0x61
-	.4byte	0x1369b
-	.4byte	.LLST25
+	.4byte	0x14601
+	.4byte	.LLST27
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0xc0
-	.4byte	0x108da
+	.4byte	0x10847
 	.uleb128 0x61
-	.4byte	0x136a7
-	.4byte	.LLST26
+	.4byte	0x1460d
+	.4byte	.LLST28
 	.uleb128 0x5d
-	.4byte	0x13b85
-	.8byte	.LBB962
-	.8byte	.LBE962-.LBB962
+	.4byte	0x14aeb
+	.8byte	.LBB972
+	.8byte	.LBE972-.LBB972
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x13ba1
+	.4byte	0x14b07
 	.uleb128 0x55
-	.4byte	0x13b95
+	.4byte	0x14afb
 	.uleb128 0x57
-	.8byte	.LBB963
-	.8byte	.LBE963-.LBB963
+	.8byte	.LBB973
+	.8byte	.LBE973-.LBB973
 	.uleb128 0x58
-	.4byte	0x13bad
+	.4byte	0x14b13
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13aff
-	.8byte	.LBB964
-	.8byte	.LBE964-.LBB964
+	.4byte	0x14a65
+	.8byte	.LBB974
+	.8byte	.LBE974-.LBB974
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB965
-	.8byte	.LBE965-.LBB965
+	.8byte	.LBB975
+	.8byte	.LBE975-.LBB975
 	.uleb128 0x61
-	.4byte	0x13b0f
-	.4byte	.LLST27
+	.4byte	0x14a75
+	.4byte	.LLST29
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL155
-	.4byte	0x147e7
+	.8byte	.LVL157
+	.4byte	0x151f6
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x135e5
-	.8byte	.LBB975
+	.4byte	0x1454b
+	.8byte	.LBB985
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
-	.2byte	0x743
-	.4byte	0x10b49
+	.2byte	0x91c
+	.4byte	0x10ab6
 	.uleb128 0x55
-	.4byte	0x1360b
+	.4byte	0x14571
 	.uleb128 0x55
-	.4byte	0x135ff
+	.4byte	0x14565
 	.uleb128 0x55
-	.4byte	0x135f5
+	.4byte	0x1455b
 	.uleb128 0x6e
-	.4byte	0x13645
-	.8byte	.LBB976
+	.4byte	0x145ab
+	.8byte	.LBB986
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x1366b
+	.4byte	0x145d1
 	.uleb128 0x55
-	.4byte	0x1365f
+	.4byte	0x145c5
 	.uleb128 0x55
-	.4byte	0x13655
+	.4byte	0x145bb
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x58
-	.4byte	0x13674
+	.4byte	0x145da
 	.uleb128 0x6f
-	.4byte	0x136b4
-	.8byte	.LBB978
+	.4byte	0x1461a
+	.8byte	.LBB988
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x10a7e
+	.4byte	0x109eb
 	.uleb128 0x55
-	.4byte	0x136d0
+	.4byte	0x14636
 	.uleb128 0x70
-	.4byte	0x136c4
-	.4byte	.LLST28
+	.4byte	0x1462a
+	.4byte	.LLST30
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x130
 	.uleb128 0x61
-	.4byte	0x136dc
-	.4byte	.LLST29
+	.4byte	0x14642
+	.4byte	.LLST31
 	.uleb128 0x61
-	.4byte	0x136e7
-	.4byte	.LLST30
+	.4byte	0x1464d
+	.4byte	.LLST32
 	.uleb128 0x71
-	.4byte	0x13aff
-	.8byte	.LBB980
-	.8byte	.LBE980-.LBB980
+	.4byte	0x14a65
+	.8byte	.LBB990
+	.8byte	.LBE990-.LBB990
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x109e4
+	.4byte	0x10951
 	.uleb128 0x57
-	.8byte	.LBB981
-	.8byte	.LBE981-.LBB981
+	.8byte	.LBB991
+	.8byte	.LBE991-.LBB991
 	.uleb128 0x61
-	.4byte	0x13b0f
-	.4byte	.LLST31
+	.4byte	0x14a75
+	.4byte	.LLST33
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB982
-	.8byte	.LBE982-.LBB982
-	.4byte	0x10a38
+	.8byte	.LBB992
+	.8byte	.LBE992-.LBB992
+	.4byte	0x109a5
 	.uleb128 0x58
-	.4byte	0x136f3
+	.4byte	0x14659
 	.uleb128 0x5d
-	.4byte	0x13b85
-	.8byte	.LBB983
-	.8byte	.LBE983-.LBB983
+	.4byte	0x14aeb
+	.8byte	.LBB993
+	.8byte	.LBE993-.LBB993
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x13ba1
+	.4byte	0x14b07
 	.uleb128 0x55
-	.4byte	0x13b95
+	.4byte	0x14afb
 	.uleb128 0x57
-	.8byte	.LBB984
-	.8byte	.LBE984-.LBB984
+	.8byte	.LBB994
+	.8byte	.LBE994-.LBB994
 	.uleb128 0x58
-	.4byte	0x13bad
+	.4byte	0x14b13
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13ad2
-	.8byte	.LBB985
-	.8byte	.LBE985-.LBB985
+	.4byte	0x14a38
+	.8byte	.LBB995
+	.8byte	.LBE995-.LBB995
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x13aec
+	.4byte	0x14a52
 	.uleb128 0x55
-	.4byte	0x13ae2
+	.4byte	0x14a48
 	.uleb128 0x5d
-	.4byte	0x13c0f
-	.8byte	.LBB986
-	.8byte	.LBE986-.LBB986
+	.4byte	0x14b75
+	.8byte	.LBB996
+	.8byte	.LBE996-.LBB996
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x13c29
+	.4byte	0x14b8f
 	.uleb128 0x55
-	.4byte	0x13c1f
+	.4byte	0x14b85
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x13680
-	.8byte	.LBB990
-	.8byte	.LBE990-.LBB990
+	.4byte	0x145e6
+	.8byte	.LBB1000
+	.8byte	.LBE1000-.LBB1000
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10b39
+	.4byte	0x10aa6
 	.uleb128 0x55
-	.4byte	0x13690
+	.4byte	0x145f6
 	.uleb128 0x57
-	.8byte	.LBB991
-	.8byte	.LBE991-.LBB991
+	.8byte	.LBB1001
+	.8byte	.LBE1001-.LBB1001
 	.uleb128 0x61
-	.4byte	0x1369b
-	.4byte	.LLST32
+	.4byte	0x14601
+	.4byte	.LLST34
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x170
-	.4byte	0x10b04
+	.4byte	0x10a71
 	.uleb128 0x61
-	.4byte	0x136a7
-	.4byte	.LLST33
+	.4byte	0x1460d
+	.4byte	.LLST35
 	.uleb128 0x5d
-	.4byte	0x13b85
-	.8byte	.LBB993
-	.8byte	.LBE993-.LBB993
+	.4byte	0x14aeb
+	.8byte	.LBB1003
+	.8byte	.LBE1003-.LBB1003
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x13ba1
+	.4byte	0x14b07
 	.uleb128 0x55
-	.4byte	0x13b95
+	.4byte	0x14afb
 	.uleb128 0x57
-	.8byte	.LBB994
-	.8byte	.LBE994-.LBB994
+	.8byte	.LBB1004
+	.8byte	.LBE1004-.LBB1004
 	.uleb128 0x58
-	.4byte	0x13bad
+	.4byte	0x14b13
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13aff
-	.8byte	.LBB995
-	.8byte	.LBE995-.LBB995
+	.4byte	0x14a65
+	.8byte	.LBB1005
+	.8byte	.LBE1005-.LBB1005
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB996
-	.8byte	.LBE996-.LBB996
+	.8byte	.LBB1006
+	.8byte	.LBE1006-.LBB1006
 	.uleb128 0x61
-	.4byte	0x13b0f
-	.4byte	.LLST34
+	.4byte	0x14a75
+	.4byte	.LLST36
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL120
-	.4byte	0x147f4
+	.8byte	.LVL122
+	.4byte	0x15203
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x135e5
-	.8byte	.LBB1010
+	.4byte	0x1454b
+	.8byte	.LBB1020
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
-	.2byte	0x75f
-	.4byte	0x10d74
+	.2byte	0x938
+	.4byte	0x10ce1
 	.uleb128 0x55
-	.4byte	0x1360b
+	.4byte	0x14571
 	.uleb128 0x55
-	.4byte	0x135ff
+	.4byte	0x14565
 	.uleb128 0x55
-	.4byte	0x135f5
+	.4byte	0x1455b
 	.uleb128 0x6e
-	.4byte	0x13645
-	.8byte	.LBB1011
+	.4byte	0x145ab
+	.8byte	.LBB1021
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x1366b
+	.4byte	0x145d1
 	.uleb128 0x55
-	.4byte	0x1365f
+	.4byte	0x145c5
 	.uleb128 0x55
-	.4byte	0x13655
+	.4byte	0x145bb
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1f0
 	.uleb128 0x58
-	.4byte	0x13674
+	.4byte	0x145da
 	.uleb128 0x6f
-	.4byte	0x136b4
-	.8byte	.LBB1013
+	.4byte	0x1461a
+	.8byte	.LBB1023
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x10ca9
+	.4byte	0x10c16
 	.uleb128 0x55
-	.4byte	0x136d0
+	.4byte	0x14636
 	.uleb128 0x70
-	.4byte	0x136c4
-	.4byte	.LLST36
+	.4byte	0x1462a
+	.4byte	.LLST38
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x230
 	.uleb128 0x61
-	.4byte	0x136dc
-	.4byte	.LLST37
+	.4byte	0x14642
+	.4byte	.LLST39
 	.uleb128 0x61
-	.4byte	0x136e7
-	.4byte	.LLST38
+	.4byte	0x1464d
+	.4byte	.LLST40
 	.uleb128 0x71
-	.4byte	0x13aff
-	.8byte	.LBB1015
-	.8byte	.LBE1015-.LBB1015
+	.4byte	0x14a65
+	.8byte	.LBB1025
+	.8byte	.LBE1025-.LBB1025
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10c0f
+	.4byte	0x10b7c
 	.uleb128 0x57
-	.8byte	.LBB1016
-	.8byte	.LBE1016-.LBB1016
+	.8byte	.LBB1026
+	.8byte	.LBE1026-.LBB1026
 	.uleb128 0x61
-	.4byte	0x13b0f
-	.4byte	.LLST39
+	.4byte	0x14a75
+	.4byte	.LLST41
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1017
-	.8byte	.LBE1017-.LBB1017
-	.4byte	0x10c63
+	.8byte	.LBB1027
+	.8byte	.LBE1027-.LBB1027
+	.4byte	0x10bd0
 	.uleb128 0x58
-	.4byte	0x136f3
+	.4byte	0x14659
 	.uleb128 0x5d
-	.4byte	0x13b85
-	.8byte	.LBB1018
-	.8byte	.LBE1018-.LBB1018
+	.4byte	0x14aeb
+	.8byte	.LBB1028
+	.8byte	.LBE1028-.LBB1028
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x13ba1
+	.4byte	0x14b07
 	.uleb128 0x55
-	.4byte	0x13b95
+	.4byte	0x14afb
 	.uleb128 0x57
-	.8byte	.LBB1019
-	.8byte	.LBE1019-.LBB1019
+	.8byte	.LBB1029
+	.8byte	.LBE1029-.LBB1029
 	.uleb128 0x58
-	.4byte	0x13bad
+	.4byte	0x14b13
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13ad2
-	.8byte	.LBB1020
-	.8byte	.LBE1020-.LBB1020
+	.4byte	0x14a38
+	.8byte	.LBB1030
+	.8byte	.LBE1030-.LBB1030
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x13aec
+	.4byte	0x14a52
 	.uleb128 0x55
-	.4byte	0x13ae2
+	.4byte	0x14a48
 	.uleb128 0x5d
-	.4byte	0x13c0f
-	.8byte	.LBB1021
-	.8byte	.LBE1021-.LBB1021
+	.4byte	0x14b75
+	.8byte	.LBB1031
+	.8byte	.LBE1031-.LBB1031
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x13c29
+	.4byte	0x14b8f
 	.uleb128 0x55
-	.4byte	0x13c1f
+	.4byte	0x14b85
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x13680
-	.8byte	.LBB1025
-	.8byte	.LBE1025-.LBB1025
+	.4byte	0x145e6
+	.8byte	.LBB1035
+	.8byte	.LBE1035-.LBB1035
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10d64
+	.4byte	0x10cd1
 	.uleb128 0x55
-	.4byte	0x13690
+	.4byte	0x145f6
 	.uleb128 0x57
-	.8byte	.LBB1026
-	.8byte	.LBE1026-.LBB1026
+	.8byte	.LBB1036
+	.8byte	.LBE1036-.LBB1036
 	.uleb128 0x61
-	.4byte	0x1369b
-	.4byte	.LLST40
+	.4byte	0x14601
+	.4byte	.LLST42
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x270
-	.4byte	0x10d2f
+	.4byte	0x10c9c
 	.uleb128 0x61
-	.4byte	0x136a7
-	.4byte	.LLST41
+	.4byte	0x1460d
+	.4byte	.LLST43
 	.uleb128 0x5d
-	.4byte	0x13b85
-	.8byte	.LBB1028
-	.8byte	.LBE1028-.LBB1028
+	.4byte	0x14aeb
+	.8byte	.LBB1038
+	.8byte	.LBE1038-.LBB1038
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x13ba1
+	.4byte	0x14b07
 	.uleb128 0x55
-	.4byte	0x13b95
+	.4byte	0x14afb
 	.uleb128 0x57
-	.8byte	.LBB1029
-	.8byte	.LBE1029-.LBB1029
+	.8byte	.LBB1039
+	.8byte	.LBE1039-.LBB1039
 	.uleb128 0x58
-	.4byte	0x13bad
+	.4byte	0x14b13
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13aff
-	.8byte	.LBB1030
-	.8byte	.LBE1030-.LBB1030
+	.4byte	0x14a65
+	.8byte	.LBB1040
+	.8byte	.LBE1040-.LBB1040
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1031
-	.8byte	.LBE1031-.LBB1031
+	.8byte	.LBB1041
+	.8byte	.LBE1041-.LBB1041
 	.uleb128 0x61
-	.4byte	0x13b0f
-	.4byte	.LLST42
+	.4byte	0x14a75
+	.4byte	.LLST44
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL144
-	.4byte	0x147f4
+	.8byte	.LVL146
+	.4byte	0x15203
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x135b5
-	.8byte	.LBB1040
+	.4byte	0x1451b
+	.8byte	.LBB1050
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
-	.2byte	0x72d
-	.4byte	0x10f94
+	.2byte	0x905
+	.4byte	0x10f01
 	.uleb128 0x55
-	.4byte	0x135db
+	.4byte	0x14541
 	.uleb128 0x55
-	.4byte	0x135cf
+	.4byte	0x14535
 	.uleb128 0x55
-	.4byte	0x135c5
+	.4byte	0x1452b
 	.uleb128 0x6e
-	.4byte	0x13615
-	.8byte	.LBB1041
+	.4byte	0x1457b
+	.8byte	.LBB1051
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1363b
+	.4byte	0x145a1
 	.uleb128 0x55
-	.4byte	0x1362f
+	.4byte	0x14595
 	.uleb128 0x55
-	.4byte	0x13625
+	.4byte	0x1458b
 	.uleb128 0x6f
-	.4byte	0x136b4
-	.8byte	.LBB1043
+	.4byte	0x1461a
+	.8byte	.LBB1053
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10eca
+	.4byte	0x10e37
 	.uleb128 0x55
-	.4byte	0x136d0
+	.4byte	0x14636
 	.uleb128 0x70
-	.4byte	0x136c4
-	.4byte	.LLST43
+	.4byte	0x1462a
+	.4byte	.LLST45
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x2f0
 	.uleb128 0x61
-	.4byte	0x136dc
-	.4byte	.LLST44
+	.4byte	0x14642
+	.4byte	.LLST46
 	.uleb128 0x61
-	.4byte	0x136e7
-	.4byte	.LLST45
+	.4byte	0x1464d
+	.4byte	.LLST47
 	.uleb128 0x71
-	.4byte	0x13aff
-	.8byte	.LBB1045
-	.8byte	.LBE1045-.LBB1045
+	.4byte	0x14a65
+	.8byte	.LBB1055
+	.8byte	.LBE1055-.LBB1055
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10e30
+	.4byte	0x10d9d
 	.uleb128 0x57
-	.8byte	.LBB1046
-	.8byte	.LBE1046-.LBB1046
+	.8byte	.LBB1056
+	.8byte	.LBE1056-.LBB1056
 	.uleb128 0x61
-	.4byte	0x13b0f
-	.4byte	.LLST46
+	.4byte	0x14a75
+	.4byte	.LLST48
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1047
-	.8byte	.LBE1047-.LBB1047
-	.4byte	0x10e84
+	.8byte	.LBB1057
+	.8byte	.LBE1057-.LBB1057
+	.4byte	0x10df1
 	.uleb128 0x58
-	.4byte	0x136f3
+	.4byte	0x14659
 	.uleb128 0x5d
-	.4byte	0x13b85
-	.8byte	.LBB1048
-	.8byte	.LBE1048-.LBB1048
+	.4byte	0x14aeb
+	.8byte	.LBB1058
+	.8byte	.LBE1058-.LBB1058
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x13ba1
+	.4byte	0x14b07
 	.uleb128 0x55
-	.4byte	0x13b95
+	.4byte	0x14afb
 	.uleb128 0x57
-	.8byte	.LBB1049
-	.8byte	.LBE1049-.LBB1049
+	.8byte	.LBB1059
+	.8byte	.LBE1059-.LBB1059
 	.uleb128 0x58
-	.4byte	0x13bad
+	.4byte	0x14b13
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13ad2
-	.8byte	.LBB1050
-	.8byte	.LBE1050-.LBB1050
+	.4byte	0x14a38
+	.8byte	.LBB1060
+	.8byte	.LBE1060-.LBB1060
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x13aec
+	.4byte	0x14a52
 	.uleb128 0x55
-	.4byte	0x13ae2
+	.4byte	0x14a48
 	.uleb128 0x5d
-	.4byte	0x13c0f
-	.8byte	.LBB1051
-	.8byte	.LBE1051-.LBB1051
+	.4byte	0x14b75
+	.8byte	.LBB1061
+	.8byte	.LBE1061-.LBB1061
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x13c29
+	.4byte	0x14b8f
 	.uleb128 0x55
-	.4byte	0x13c1f
+	.4byte	0x14b85
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x13680
-	.8byte	.LBB1057
-	.8byte	.LBE1057-.LBB1057
+	.4byte	0x145e6
+	.8byte	.LBB1067
+	.8byte	.LBE1067-.LBB1067
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x10f85
+	.4byte	0x10ef2
 	.uleb128 0x55
-	.4byte	0x13690
+	.4byte	0x145f6
 	.uleb128 0x57
-	.8byte	.LBB1058
-	.8byte	.LBE1058-.LBB1058
+	.8byte	.LBB1068
+	.8byte	.LBE1068-.LBB1068
 	.uleb128 0x61
-	.4byte	0x1369b
-	.4byte	.LLST47
+	.4byte	0x14601
+	.4byte	.LLST49
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x340
-	.4byte	0x10f50
+	.4byte	0x10ebd
 	.uleb128 0x61
-	.4byte	0x136a7
-	.4byte	.LLST48
+	.4byte	0x1460d
+	.4byte	.LLST50
 	.uleb128 0x5d
-	.4byte	0x13b85
-	.8byte	.LBB1060
-	.8byte	.LBE1060-.LBB1060
+	.4byte	0x14aeb
+	.8byte	.LBB1070
+	.8byte	.LBE1070-.LBB1070
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x13ba1
+	.4byte	0x14b07
 	.uleb128 0x55
-	.4byte	0x13b95
+	.4byte	0x14afb
 	.uleb128 0x57
-	.8byte	.LBB1061
-	.8byte	.LBE1061-.LBB1061
+	.8byte	.LBB1071
+	.8byte	.LBE1071-.LBB1071
 	.uleb128 0x58
-	.4byte	0x13bad
+	.4byte	0x14b13
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13aff
-	.8byte	.LBB1062
-	.8byte	.LBE1062-.LBB1062
+	.4byte	0x14a65
+	.8byte	.LBB1072
+	.8byte	.LBE1072-.LBB1072
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1063
-	.8byte	.LBE1063-.LBB1063
+	.8byte	.LBB1073
+	.8byte	.LBE1073-.LBB1073
 	.uleb128 0x61
-	.4byte	0x13b0f
-	.4byte	.LLST49
+	.4byte	0x14a75
+	.4byte	.LLST51
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL171
-	.4byte	0x147e7
+	.8byte	.LVL173
+	.4byte	0x151f6
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x135e5
-	.8byte	.LBB1074
+	.4byte	0x1454b
+	.8byte	.LBB1084
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
-	.2byte	0x77c
-	.4byte	0x111d0
+	.2byte	0x955
+	.4byte	0x1113d
 	.uleb128 0x55
-	.4byte	0x1360b
+	.4byte	0x14571
 	.uleb128 0x55
-	.4byte	0x135ff
+	.4byte	0x14565
 	.uleb128 0x55
-	.4byte	0x135f5
+	.4byte	0x1455b
 	.uleb128 0x6e
-	.4byte	0x13645
-	.8byte	.LBB1075
+	.4byte	0x145ab
+	.8byte	.LBB1085
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x1366b
+	.4byte	0x145d1
 	.uleb128 0x55
-	.4byte	0x1365f
+	.4byte	0x145c5
 	.uleb128 0x55
-	.4byte	0x13655
+	.4byte	0x145bb
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x370
 	.uleb128 0x61
-	.4byte	0x13674
-	.4byte	.LLST50
+	.4byte	0x145da
+	.4byte	.LLST52
 	.uleb128 0x6f
-	.4byte	0x136b4
-	.8byte	.LBB1077
+	.4byte	0x1461a
+	.8byte	.LBB1087
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x110f8
+	.4byte	0x11065
 	.uleb128 0x55
-	.4byte	0x136d0
+	.4byte	0x14636
 	.uleb128 0x70
-	.4byte	0x136c4
-	.4byte	.LLST51
+	.4byte	0x1462a
+	.4byte	.LLST53
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x61
-	.4byte	0x136dc
-	.4byte	.LLST52
+	.4byte	0x14642
+	.4byte	.LLST54
 	.uleb128 0x61
-	.4byte	0x136e7
-	.4byte	.LLST53
+	.4byte	0x1464d
+	.4byte	.LLST55
 	.uleb128 0x71
-	.4byte	0x13aff
-	.8byte	.LBB1079
-	.8byte	.LBE1079-.LBB1079
+	.4byte	0x14a65
+	.8byte	.LBB1089
+	.8byte	.LBE1089-.LBB1089
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x1105e
+	.4byte	0x10fcb
 	.uleb128 0x57
-	.8byte	.LBB1080
-	.8byte	.LBE1080-.LBB1080
+	.8byte	.LBB1090
+	.8byte	.LBE1090-.LBB1090
 	.uleb128 0x61
-	.4byte	0x13b0f
-	.4byte	.LLST54
+	.4byte	0x14a75
+	.4byte	.LLST56
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1081
-	.8byte	.LBE1081-.LBB1081
-	.4byte	0x110b2
+	.8byte	.LBB1091
+	.8byte	.LBE1091-.LBB1091
+	.4byte	0x1101f
 	.uleb128 0x58
-	.4byte	0x136f3
+	.4byte	0x14659
 	.uleb128 0x5d
-	.4byte	0x13b85
-	.8byte	.LBB1082
-	.8byte	.LBE1082-.LBB1082
+	.4byte	0x14aeb
+	.8byte	.LBB1092
+	.8byte	.LBE1092-.LBB1092
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x13ba1
+	.4byte	0x14b07
 	.uleb128 0x55
-	.4byte	0x13b95
+	.4byte	0x14afb
 	.uleb128 0x57
-	.8byte	.LBB1083
-	.8byte	.LBE1083-.LBB1083
+	.8byte	.LBB1093
+	.8byte	.LBE1093-.LBB1093
 	.uleb128 0x58
-	.4byte	0x13bad
+	.4byte	0x14b13
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13ad2
-	.8byte	.LBB1084
-	.8byte	.LBE1084-.LBB1084
+	.4byte	0x14a38
+	.8byte	.LBB1094
+	.8byte	.LBE1094-.LBB1094
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x13aec
+	.4byte	0x14a52
 	.uleb128 0x55
-	.4byte	0x13ae2
+	.4byte	0x14a48
 	.uleb128 0x5d
-	.4byte	0x13c0f
-	.8byte	.LBB1085
-	.8byte	.LBE1085-.LBB1085
+	.4byte	0x14b75
+	.8byte	.LBB1095
+	.8byte	.LBE1095-.LBB1095
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x13c29
+	.4byte	0x14b8f
 	.uleb128 0x55
-	.4byte	0x13c1f
+	.4byte	0x14b85
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x13680
-	.8byte	.LBB1091
-	.8byte	.LBE1091-.LBB1091
+	.4byte	0x145e6
+	.8byte	.LBB1101
+	.8byte	.LBE1101-.LBB1101
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x111b3
+	.4byte	0x11120
 	.uleb128 0x55
-	.4byte	0x13690
+	.4byte	0x145f6
 	.uleb128 0x57
-	.8byte	.LBB1092
-	.8byte	.LBE1092-.LBB1092
+	.8byte	.LBB1102
+	.8byte	.LBE1102-.LBB1102
 	.uleb128 0x61
-	.4byte	0x1369b
-	.4byte	.LLST55
+	.4byte	0x14601
+	.4byte	.LLST57
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x420
-	.4byte	0x1117e
+	.4byte	0x110eb
 	.uleb128 0x61
-	.4byte	0x136a7
-	.4byte	.LLST56
+	.4byte	0x1460d
+	.4byte	.LLST58
 	.uleb128 0x5d
-	.4byte	0x13b85
-	.8byte	.LBB1094
-	.8byte	.LBE1094-.LBB1094
+	.4byte	0x14aeb
+	.8byte	.LBB1104
+	.8byte	.LBE1104-.LBB1104
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x13ba1
+	.4byte	0x14b07
 	.uleb128 0x55
-	.4byte	0x13b95
+	.4byte	0x14afb
 	.uleb128 0x57
-	.8byte	.LBB1095
-	.8byte	.LBE1095-.LBB1095
+	.8byte	.LBB1105
+	.8byte	.LBE1105-.LBB1105
 	.uleb128 0x58
-	.4byte	0x13bad
+	.4byte	0x14b13
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13aff
-	.8byte	.LBB1096
-	.8byte	.LBE1096-.LBB1096
+	.4byte	0x14a65
+	.8byte	.LBB1106
+	.8byte	.LBE1106-.LBB1106
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1097
-	.8byte	.LBE1097-.LBB1097
+	.8byte	.LBB1107
+	.8byte	.LBE1107-.LBB1107
 	.uleb128 0x61
-	.4byte	0x13b0f
-	.4byte	.LLST57
+	.4byte	0x14a75
+	.4byte	.LLST59
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL183
-	.4byte	0x147f4
+	.8byte	.LVL185
+	.4byte	0x15203
 	.uleb128 0x4f
-	.8byte	.LVL261
-	.4byte	0x1460a
+	.8byte	.LVL263
+	.4byte	0x15019
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x135b5
-	.8byte	.LBB1110
+	.4byte	0x1451b
+	.8byte	.LBB1120
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
-	.2byte	0x799
-	.4byte	0x11282
+	.2byte	0x973
+	.4byte	0x111ef
 	.uleb128 0x55
-	.4byte	0x135db
+	.4byte	0x14541
 	.uleb128 0x55
-	.4byte	0x135cf
+	.4byte	0x14535
 	.uleb128 0x55
-	.4byte	0x135c5
+	.4byte	0x1452b
 	.uleb128 0x6e
-	.4byte	0x13615
-	.8byte	.LBB1111
+	.4byte	0x1457b
+	.8byte	.LBB1121
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1363b
+	.4byte	0x145a1
 	.uleb128 0x55
-	.4byte	0x1362f
+	.4byte	0x14595
 	.uleb128 0x55
-	.4byte	0x13625
+	.4byte	0x1458b
 	.uleb128 0x6e
-	.4byte	0x136b4
-	.8byte	.LBB1113
+	.4byte	0x1461a
+	.8byte	.LBB1123
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x55
-	.4byte	0x136d0
+	.4byte	0x14636
 	.uleb128 0x72
-	.4byte	0x136c4
+	.4byte	0x1462a
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x4b0
 	.uleb128 0x58
-	.4byte	0x136dc
+	.4byte	0x14642
 	.uleb128 0x61
-	.4byte	0x136e7
-	.4byte	.LLST58
+	.4byte	0x1464d
+	.4byte	.LLST60
 	.uleb128 0x5d
-	.4byte	0x13aff
-	.8byte	.LBB1115
-	.8byte	.LBE1115-.LBB1115
+	.4byte	0x14a65
+	.8byte	.LBB1125
+	.8byte	.LBE1125-.LBB1125
 	.byte	0x6
 	.byte	0x4d
 	.uleb128 0x57
-	.8byte	.LBB1116
-	.8byte	.LBE1116-.LBB1116
+	.8byte	.LBB1126
+	.8byte	.LBE1126-.LBB1126
 	.uleb128 0x61
-	.4byte	0x13b0f
-	.4byte	.LLST59
+	.4byte	0x14a75
+	.4byte	.LLST61
 	.byte	0
 	.byte	0
 	.byte	0
@@ -42172,2058 +43311,3554 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x135b5
-	.8byte	.LBB1122
+	.4byte	0x1451b
+	.8byte	.LBB1132
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
-	.2byte	0x789
-	.4byte	0x114a2
+	.2byte	0x963
+	.4byte	0x1140f
 	.uleb128 0x55
-	.4byte	0x135db
+	.4byte	0x14541
 	.uleb128 0x55
-	.4byte	0x135cf
+	.4byte	0x14535
 	.uleb128 0x55
-	.4byte	0x135c5
+	.4byte	0x1452b
 	.uleb128 0x6e
-	.4byte	0x13615
-	.8byte	.LBB1123
+	.4byte	0x1457b
+	.8byte	.LBB1133
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1363b
+	.4byte	0x145a1
 	.uleb128 0x55
-	.4byte	0x1362f
+	.4byte	0x14595
 	.uleb128 0x55
-	.4byte	0x13625
+	.4byte	0x1458b
 	.uleb128 0x6f
-	.4byte	0x136b4
-	.8byte	.LBB1125
+	.4byte	0x1461a
+	.8byte	.LBB1135
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x113d8
+	.4byte	0x11345
 	.uleb128 0x55
-	.4byte	0x136d0
+	.4byte	0x14636
 	.uleb128 0x70
-	.4byte	0x136c4
-	.4byte	.LLST60
+	.4byte	0x1462a
+	.4byte	.LLST62
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x540
 	.uleb128 0x61
-	.4byte	0x136dc
-	.4byte	.LLST61
+	.4byte	0x14642
+	.4byte	.LLST63
 	.uleb128 0x61
-	.4byte	0x136e7
-	.4byte	.LLST62
+	.4byte	0x1464d
+	.4byte	.LLST64
 	.uleb128 0x71
-	.4byte	0x13aff
-	.8byte	.LBB1127
-	.8byte	.LBE1127-.LBB1127
+	.4byte	0x14a65
+	.8byte	.LBB1137
+	.8byte	.LBE1137-.LBB1137
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x1133e
+	.4byte	0x112ab
 	.uleb128 0x57
-	.8byte	.LBB1128
-	.8byte	.LBE1128-.LBB1128
+	.8byte	.LBB1138
+	.8byte	.LBE1138-.LBB1138
 	.uleb128 0x61
-	.4byte	0x13b0f
-	.4byte	.LLST63
+	.4byte	0x14a75
+	.4byte	.LLST65
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1129
-	.8byte	.LBE1129-.LBB1129
-	.4byte	0x11392
+	.8byte	.LBB1139
+	.8byte	.LBE1139-.LBB1139
+	.4byte	0x112ff
 	.uleb128 0x58
-	.4byte	0x136f3
+	.4byte	0x14659
 	.uleb128 0x5d
-	.4byte	0x13b85
-	.8byte	.LBB1130
-	.8byte	.LBE1130-.LBB1130
+	.4byte	0x14aeb
+	.8byte	.LBB1140
+	.8byte	.LBE1140-.LBB1140
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x13ba1
+	.4byte	0x14b07
 	.uleb128 0x55
-	.4byte	0x13b95
+	.4byte	0x14afb
 	.uleb128 0x57
-	.8byte	.LBB1131
-	.8byte	.LBE1131-.LBB1131
+	.8byte	.LBB1141
+	.8byte	.LBE1141-.LBB1141
 	.uleb128 0x58
-	.4byte	0x13bad
+	.4byte	0x14b13
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13ad2
-	.8byte	.LBB1132
-	.8byte	.LBE1132-.LBB1132
+	.4byte	0x14a38
+	.8byte	.LBB1142
+	.8byte	.LBE1142-.LBB1142
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x13aec
+	.4byte	0x14a52
 	.uleb128 0x55
-	.4byte	0x13ae2
+	.4byte	0x14a48
 	.uleb128 0x5d
-	.4byte	0x13c0f
-	.8byte	.LBB1133
-	.8byte	.LBE1133-.LBB1133
+	.4byte	0x14b75
+	.8byte	.LBB1143
+	.8byte	.LBE1143-.LBB1143
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x13c29
+	.4byte	0x14b8f
 	.uleb128 0x55
-	.4byte	0x13c1f
+	.4byte	0x14b85
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x13680
-	.8byte	.LBB1141
-	.8byte	.LBE1141-.LBB1141
+	.4byte	0x145e6
+	.8byte	.LBB1151
+	.8byte	.LBE1151-.LBB1151
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x11493
+	.4byte	0x11400
 	.uleb128 0x55
-	.4byte	0x13690
+	.4byte	0x145f6
 	.uleb128 0x57
-	.8byte	.LBB1142
-	.8byte	.LBE1142-.LBB1142
+	.8byte	.LBB1152
+	.8byte	.LBE1152-.LBB1152
 	.uleb128 0x61
-	.4byte	0x1369b
-	.4byte	.LLST64
+	.4byte	0x14601
+	.4byte	.LLST66
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x590
-	.4byte	0x1145e
+	.4byte	0x113cb
 	.uleb128 0x61
-	.4byte	0x136a7
-	.4byte	.LLST65
+	.4byte	0x1460d
+	.4byte	.LLST67
 	.uleb128 0x5d
-	.4byte	0x13b85
-	.8byte	.LBB1144
-	.8byte	.LBE1144-.LBB1144
+	.4byte	0x14aeb
+	.8byte	.LBB1154
+	.8byte	.LBE1154-.LBB1154
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x13ba1
+	.4byte	0x14b07
 	.uleb128 0x55
-	.4byte	0x13b95
+	.4byte	0x14afb
 	.uleb128 0x57
-	.8byte	.LBB1145
-	.8byte	.LBE1145-.LBB1145
+	.8byte	.LBB1155
+	.8byte	.LBE1155-.LBB1155
 	.uleb128 0x58
-	.4byte	0x13bad
+	.4byte	0x14b13
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13aff
-	.8byte	.LBB1146
-	.8byte	.LBE1146-.LBB1146
+	.4byte	0x14a65
+	.8byte	.LBB1156
+	.8byte	.LBE1156-.LBB1156
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1147
-	.8byte	.LBE1147-.LBB1147
+	.8byte	.LBB1157
+	.8byte	.LBE1157-.LBB1157
 	.uleb128 0x61
-	.4byte	0x13b0f
-	.4byte	.LLST66
+	.4byte	0x14a75
+	.4byte	.LLST68
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL244
-	.4byte	0x147e7
+	.8byte	.LVL246
+	.4byte	0x151f6
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x135b5
-	.8byte	.LBB1158
+	.4byte	0x1451b
+	.8byte	.LBB1168
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
-	.2byte	0x73b
-	.4byte	0x116c2
+	.2byte	0x914
+	.4byte	0x1162f
 	.uleb128 0x55
-	.4byte	0x135db
+	.4byte	0x14541
 	.uleb128 0x55
-	.4byte	0x135cf
+	.4byte	0x14535
 	.uleb128 0x55
-	.4byte	0x135c5
+	.4byte	0x1452b
 	.uleb128 0x6e
-	.4byte	0x13615
-	.8byte	.LBB1159
+	.4byte	0x1457b
+	.8byte	.LBB1169
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1363b
+	.4byte	0x145a1
 	.uleb128 0x55
-	.4byte	0x1362f
+	.4byte	0x14595
 	.uleb128 0x55
-	.4byte	0x13625
+	.4byte	0x1458b
 	.uleb128 0x6f
-	.4byte	0x136b4
-	.8byte	.LBB1161
+	.4byte	0x1461a
+	.8byte	.LBB1171
 	.4byte	.Ldebug_ranges0+0x620
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x115f8
+	.4byte	0x11565
 	.uleb128 0x55
-	.4byte	0x136d0
+	.4byte	0x14636
 	.uleb128 0x70
-	.4byte	0x136c4
-	.4byte	.LLST67
+	.4byte	0x1462a
+	.4byte	.LLST69
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x620
 	.uleb128 0x61
-	.4byte	0x136dc
-	.4byte	.LLST68
+	.4byte	0x14642
+	.4byte	.LLST70
 	.uleb128 0x61
-	.4byte	0x136e7
-	.4byte	.LLST69
+	.4byte	0x1464d
+	.4byte	.LLST71
 	.uleb128 0x71
-	.4byte	0x13aff
-	.8byte	.LBB1163
-	.8byte	.LBE1163-.LBB1163
+	.4byte	0x14a65
+	.8byte	.LBB1173
+	.8byte	.LBE1173-.LBB1173
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x1155e
+	.4byte	0x114cb
 	.uleb128 0x57
-	.8byte	.LBB1164
-	.8byte	.LBE1164-.LBB1164
+	.8byte	.LBB1174
+	.8byte	.LBE1174-.LBB1174
 	.uleb128 0x61
-	.4byte	0x13b0f
-	.4byte	.LLST70
+	.4byte	0x14a75
+	.4byte	.LLST72
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
-	.8byte	.LBB1165
-	.8byte	.LBE1165-.LBB1165
-	.4byte	0x115b2
+	.8byte	.LBB1175
+	.8byte	.LBE1175-.LBB1175
+	.4byte	0x1151f
 	.uleb128 0x58
-	.4byte	0x136f3
+	.4byte	0x14659
 	.uleb128 0x5d
-	.4byte	0x13b85
-	.8byte	.LBB1166
-	.8byte	.LBE1166-.LBB1166
+	.4byte	0x14aeb
+	.8byte	.LBB1176
+	.8byte	.LBE1176-.LBB1176
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x13ba1
+	.4byte	0x14b07
 	.uleb128 0x55
-	.4byte	0x13b95
+	.4byte	0x14afb
 	.uleb128 0x57
-	.8byte	.LBB1167
-	.8byte	.LBE1167-.LBB1167
+	.8byte	.LBB1177
+	.8byte	.LBE1177-.LBB1177
 	.uleb128 0x58
-	.4byte	0x13bad
+	.4byte	0x14b13
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13ad2
-	.8byte	.LBB1168
-	.8byte	.LBE1168-.LBB1168
+	.4byte	0x14a38
+	.8byte	.LBB1178
+	.8byte	.LBE1178-.LBB1178
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x13aec
+	.4byte	0x14a52
 	.uleb128 0x55
-	.4byte	0x13ae2
+	.4byte	0x14a48
 	.uleb128 0x5d
-	.4byte	0x13c0f
-	.8byte	.LBB1169
-	.8byte	.LBE1169-.LBB1169
+	.4byte	0x14b75
+	.8byte	.LBB1179
+	.8byte	.LBE1179-.LBB1179
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x13c29
+	.4byte	0x14b8f
 	.uleb128 0x55
-	.4byte	0x13c1f
+	.4byte	0x14b85
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x13680
-	.8byte	.LBB1177
-	.8byte	.LBE1177-.LBB1177
+	.4byte	0x145e6
+	.8byte	.LBB1187
+	.8byte	.LBE1187-.LBB1187
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x116b3
+	.4byte	0x11620
 	.uleb128 0x55
-	.4byte	0x13690
+	.4byte	0x145f6
 	.uleb128 0x57
-	.8byte	.LBB1178
-	.8byte	.LBE1178-.LBB1178
+	.8byte	.LBB1188
+	.8byte	.LBE1188-.LBB1188
 	.uleb128 0x61
-	.4byte	0x1369b
-	.4byte	.LLST71
+	.4byte	0x14601
+	.4byte	.LLST73
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x670
-	.4byte	0x1167e
+	.4byte	0x115eb
 	.uleb128 0x61
-	.4byte	0x136a7
-	.4byte	.LLST72
+	.4byte	0x1460d
+	.4byte	.LLST74
 	.uleb128 0x5d
-	.4byte	0x13b85
-	.8byte	.LBB1180
-	.8byte	.LBE1180-.LBB1180
+	.4byte	0x14aeb
+	.8byte	.LBB1190
+	.8byte	.LBE1190-.LBB1190
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x13ba1
+	.4byte	0x14b07
 	.uleb128 0x55
-	.4byte	0x13b95
+	.4byte	0x14afb
 	.uleb128 0x57
-	.8byte	.LBB1181
-	.8byte	.LBE1181-.LBB1181
+	.8byte	.LBB1191
+	.8byte	.LBE1191-.LBB1191
 	.uleb128 0x58
-	.4byte	0x13bad
+	.4byte	0x14b13
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13aff
-	.8byte	.LBB1182
-	.8byte	.LBE1182-.LBB1182
+	.4byte	0x14a65
+	.8byte	.LBB1192
+	.8byte	.LBE1192-.LBB1192
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x57
-	.8byte	.LBB1183
-	.8byte	.LBE1183-.LBB1183
+	.8byte	.LBB1193
+	.8byte	.LBE1193-.LBB1193
 	.uleb128 0x61
-	.4byte	0x13b0f
-	.4byte	.LLST73
+	.4byte	0x14a75
+	.4byte	.LLST75
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4f
+	.8byte	.LVL254
+	.4byte	0x151f6
+	.byte	0
+	.byte	0
+	.uleb128 0x4f
+	.8byte	.LVL87
+	.4byte	0x150ab
+	.uleb128 0x4f
+	.8byte	.LVL88
+	.4byte	0x1510d
+	.uleb128 0x4f
+	.8byte	.LVL89
+	.4byte	0x151b8
+	.uleb128 0x4f
+	.8byte	.LVL100
+	.4byte	0x15210
+	.uleb128 0x4f
+	.8byte	.LVL103
+	.4byte	0x1502f
+	.uleb128 0x4f
+	.8byte	.LVL106
+	.4byte	0x14fb5
+	.uleb128 0x4f
+	.8byte	.LVL123
+	.4byte	0x151b8
+	.uleb128 0x4f
+	.8byte	.LVL124
+	.4byte	0x1521c
+	.uleb128 0x4f
+	.8byte	.LVL126
+	.4byte	0x150b7
+	.uleb128 0x4f
+	.8byte	.LVL133
+	.4byte	0x150ab
+	.uleb128 0x4f
+	.8byte	.LVL147
+	.4byte	0x15228
+	.uleb128 0x4f
+	.8byte	.LVL148
+	.4byte	0x150b7
+	.uleb128 0x4f
+	.8byte	.LVL149
+	.4byte	0x15101
+	.uleb128 0x4f
+	.8byte	.LVL159
+	.4byte	0x15234
+	.uleb128 0x4f
+	.8byte	.LVL160
+	.4byte	0x151b8
+	.uleb128 0x4f
+	.8byte	.LVL187
+	.4byte	0x14fb5
+	.uleb128 0x4f
+	.8byte	.LVL190
+	.4byte	0x14fb5
+	.uleb128 0x4f
+	.8byte	.LVL192
+	.4byte	0x150ab
+	.uleb128 0x4f
+	.8byte	.LVL194
+	.4byte	0x150ab
+	.uleb128 0x4f
+	.8byte	.LVL195
+	.4byte	0x1510d
+	.uleb128 0x4f
+	.8byte	.LVL196
+	.4byte	0x151b8
+	.uleb128 0x4f
+	.8byte	.LVL209
+	.4byte	0x1502f
+	.uleb128 0x4f
+	.8byte	.LVL212
+	.4byte	0x1502f
+	.uleb128 0x4f
+	.8byte	.LVL214
+	.4byte	0x150ab
+	.uleb128 0x4f
+	.8byte	.LVL215
+	.4byte	0x151b8
+	.uleb128 0x4f
+	.8byte	.LVL223
+	.4byte	0x15210
+	.uleb128 0x4f
+	.8byte	.LVL257
+	.4byte	0x15101
+	.uleb128 0x4f
+	.8byte	.LVL264
+	.4byte	0x1502f
+	.uleb128 0x4f
+	.8byte	.LVL265
+	.4byte	0x15163
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x68
+	.4byte	0x117b9
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0xa
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x117a9
+	.uleb128 0x64
+	.4byte	.LASF3095
+	.byte	0x1
+	.2byte	0x899
+	.4byte	0xc6
+	.byte	0x1
+	.4byte	0x117e8
+	.uleb128 0x66
+	.4byte	.LASF3020
+	.byte	0x1
+	.2byte	0x899
+	.4byte	0xe1f4
+	.uleb128 0x53
+	.string	"dev"
+	.byte	0x1
+	.2byte	0x89b
+	.4byte	0xa5e0
+	.byte	0
+	.uleb128 0x4e
+	.4byte	.LASF3097
+	.byte	0x1
+	.2byte	0x893
+	.8byte	.LFB2838
+	.8byte	.LFE2838-.LFB2838
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x11822
+	.uleb128 0x52
+	.string	"t"
+	.byte	0x1
+	.2byte	0x893
+	.4byte	0x31d2
+	.4byte	.LLST76
+	.uleb128 0x4f
+	.8byte	.LVL278
+	.4byte	0x122f8
+	.byte	0
+	.uleb128 0x4e
+	.4byte	.LASF3098
+	.byte	0x1
+	.2byte	0x887
+	.8byte	.LFB2837
+	.8byte	.LFE2837-.LFB2837
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x11882
+	.uleb128 0x52
+	.string	"t"
+	.byte	0x1
+	.2byte	0x887
+	.4byte	0x31d2
+	.4byte	.LLST14
+	.uleb128 0x48
+	.4byte	.LASF2976
+	.byte	0x1
+	.2byte	0x889
+	.4byte	0xe874
+	.uleb128 0x60
+	.4byte	0x144a5
+	.8byte	.LBB948
+	.4byte	.Ldebug_ranges0+0
+	.byte	0x1
+	.2byte	0x88d
+	.uleb128 0x55
+	.4byte	0x144b2
+	.uleb128 0x4f
+	.8byte	.LVL73
+	.4byte	0x15240
+	.byte	0
+	.byte	0
+	.uleb128 0x64
+	.4byte	.LASF3099
+	.byte	0x1
+	.2byte	0x876
+	.4byte	0xc6
+	.byte	0x1
+	.4byte	0x118ac
+	.uleb128 0x66
+	.4byte	.LASF3020
+	.byte	0x1
+	.2byte	0x876
+	.4byte	0xe1f4
+	.uleb128 0x53
+	.string	"buf"
+	.byte	0x1
+	.2byte	0x878
+	.4byte	0xe4f2
+	.byte	0
+	.uleb128 0x50
+	.4byte	.LASF3100
+	.byte	0x1
+	.2byte	0x725
+	.4byte	0xc6
+	.8byte	.LFB2835
+	.8byte	.LFE2835-.LFB2835
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x120a0
+	.uleb128 0x52
+	.string	"ptr"
+	.byte	0x1
+	.2byte	0x725
+	.4byte	0x458
+	.4byte	.LLST237
+	.uleb128 0x5b
+	.string	"ebc"
+	.byte	0x1
+	.2byte	0x727
+	.4byte	0xe557
+	.4byte	.LLST238
+	.uleb128 0x48
+	.4byte	.LASF2976
+	.byte	0x1
+	.2byte	0x728
+	.4byte	0xe874
+	.uleb128 0x5b
+	.string	"buf"
+	.byte	0x1
+	.2byte	0x729
+	.4byte	0xe4f2
+	.4byte	.LLST239
+	.uleb128 0x5a
+	.4byte	.LASF3101
+	.byte	0x1
+	.2byte	0x72a
+	.4byte	0xc6
+	.4byte	.LLST240
+	.uleb128 0x5a
+	.4byte	.LASF2989
+	.byte	0x1
+	.2byte	0x72b
+	.4byte	0xc6
+	.4byte	.LLST241
+	.uleb128 0x4d
+	.4byte	.LASF3102
+	.byte	0x1
+	.2byte	0x72c
+	.4byte	0xd95c
+	.uleb128 0x3
+	.byte	0x91
+	.sleb128 -80
+	.uleb128 0x5a
+	.4byte	.LASF3103
+	.byte	0x1
+	.2byte	0x72d
+	.4byte	0xe4f2
+	.4byte	.LLST242
+	.uleb128 0x6c
+	.4byte	.LASF3105
+	.byte	0x1
+	.2byte	0x844
+	.8byte	.L890
+	.uleb128 0x63
+	.4byte	.Ldebug_ranges0+0x1240
+	.4byte	0x119fc
+	.uleb128 0x48
+	.4byte	.LASF3092
+	.byte	0x1
+	.2byte	0x786
+	.4byte	0xc6
+	.uleb128 0x57
+	.8byte	.LBB1871
+	.8byte	.LBE1871-.LBB1871
+	.uleb128 0x6c
+	.4byte	.LASF3104
+	.byte	0x1
+	.2byte	0x786
+	.8byte	.L874
+	.uleb128 0x4d
+	.4byte	.LASF3093
+	.byte	0x1
+	.2byte	0x786
+	.4byte	0x1528
+	.uleb128 0x3
+	.byte	0x91
+	.sleb128 -120
+	.uleb128 0x48
+	.4byte	.LASF3092
+	.byte	0x1
+	.2byte	0x786
+	.4byte	0x199
+	.uleb128 0x63
+	.4byte	.Ldebug_ranges0+0x1270
+	.4byte	0x119e0
+	.uleb128 0x5a
+	.4byte	.LASF3094
+	.byte	0x1
+	.2byte	0x786
+	.4byte	0x199
+	.4byte	.LLST256
+	.uleb128 0x4f
+	.8byte	.LVL995
+	.4byte	0x151c4
+	.uleb128 0x4f
+	.8byte	.LVL996
+	.4byte	0x151d0
+	.byte	0
+	.uleb128 0x4f
+	.8byte	.LVL993
+	.4byte	0x151dd
+	.uleb128 0x4f
+	.8byte	.LVL997
+	.4byte	0x151e9
+	.byte	0
+	.byte	0
+	.uleb128 0x63
+	.4byte	.Ldebug_ranges0+0x11e0
+	.4byte	0x11a9e
+	.uleb128 0x48
+	.4byte	.LASF3092
+	.byte	0x1
+	.2byte	0x830
+	.4byte	0xc6
+	.uleb128 0x57
+	.8byte	.LBB1865
+	.8byte	.LBE1865-.LBB1865
+	.uleb128 0x6c
+	.4byte	.LASF3104
+	.byte	0x1
+	.2byte	0x830
+	.8byte	.L927
+	.uleb128 0x4d
+	.4byte	.LASF3093
+	.byte	0x1
+	.2byte	0x830
+	.4byte	0x1528
+	.uleb128 0x3
+	.byte	0x91
+	.sleb128 -120
+	.uleb128 0x48
+	.4byte	.LASF3092
+	.byte	0x1
+	.2byte	0x830
+	.4byte	0x199
+	.uleb128 0x63
+	.4byte	.Ldebug_ranges0+0x1210
+	.4byte	0x11a82
+	.uleb128 0x5a
+	.4byte	.LASF3094
+	.byte	0x1
+	.2byte	0x830
+	.4byte	0x199
+	.4byte	.LLST255
+	.uleb128 0x4f
+	.8byte	.LVL987
+	.4byte	0x151c4
+	.uleb128 0x4f
+	.8byte	.LVL988
+	.4byte	0x151d0
+	.byte	0
+	.uleb128 0x4f
+	.8byte	.LVL985
+	.4byte	0x151dd
+	.uleb128 0x4f
+	.8byte	.LVL989
+	.4byte	0x151e9
+	.byte	0
+	.byte	0
+	.uleb128 0x6d
+	.8byte	.LBB1859
+	.8byte	.LBE1859-.LBB1859
+	.4byte	0x11b50
+	.uleb128 0x48
+	.4byte	.LASF3092
+	.byte	0x1
+	.2byte	0x862
+	.4byte	0xc6
+	.uleb128 0x57
+	.8byte	.LBB1860
+	.8byte	.LBE1860-.LBB1860
+	.uleb128 0x73
+	.4byte	.LASF3104
+	.byte	0x1
+	.2byte	0x862
+	.uleb128 0x4d
+	.4byte	.LASF3093
+	.byte	0x1
+	.2byte	0x862
+	.4byte	0x1528
+	.uleb128 0x3
+	.byte	0x91
+	.sleb128 -120
+	.uleb128 0x48
+	.4byte	.LASF3092
+	.byte	0x1
+	.2byte	0x862
+	.4byte	0x199
+	.uleb128 0x6d
+	.8byte	.LBB1861
+	.8byte	.LBE1861-.LBB1861
+	.4byte	0x11b34
+	.uleb128 0x5a
+	.4byte	.LASF3094
+	.byte	0x1
+	.2byte	0x862
+	.4byte	0x199
+	.4byte	.LLST254
+	.uleb128 0x4f
+	.8byte	.LVL926
+	.4byte	0x151c4
+	.uleb128 0x4f
+	.8byte	.LVL927
+	.4byte	0x151d0
+	.byte	0
+	.uleb128 0x4f
+	.8byte	.LVL924
+	.4byte	0x151dd
+	.uleb128 0x4f
+	.8byte	.LVL928
+	.4byte	0x151e9
+	.byte	0
+	.byte	0
+	.uleb128 0x63
+	.4byte	.Ldebug_ranges0+0x10c0
+	.4byte	0x11be6
+	.uleb128 0x48
+	.4byte	.LASF3092
+	.byte	0x1
+	.2byte	0x86e
+	.4byte	0xc6
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0x10c0
+	.uleb128 0x6c
+	.4byte	.LASF3104
+	.byte	0x1
+	.2byte	0x86e
+	.8byte	.L944
+	.uleb128 0x4d
+	.4byte	.LASF3093
+	.byte	0x1
+	.2byte	0x86e
+	.4byte	0x1528
+	.uleb128 0x3
+	.byte	0x91
+	.sleb128 -120
+	.uleb128 0x48
+	.4byte	.LASF3092
+	.byte	0x1
+	.2byte	0x86e
+	.4byte	0x199
+	.uleb128 0x63
+	.4byte	.Ldebug_ranges0+0x1100
+	.4byte	0x11bca
+	.uleb128 0x5a
+	.4byte	.LASF3094
+	.byte	0x1
+	.2byte	0x86e
+	.4byte	0x199
+	.4byte	.LLST243
+	.uleb128 0x4f
+	.8byte	.LVL873
+	.4byte	0x151c4
+	.uleb128 0x4f
+	.8byte	.LVL874
+	.4byte	0x151d0
+	.byte	0
+	.uleb128 0x4f
+	.8byte	.LVL871
+	.4byte	0x151dd
+	.uleb128 0x4f
+	.8byte	.LVL875
+	.4byte	0x151e9
+	.byte	0
+	.byte	0
+	.uleb128 0x5c
+	.4byte	0x120a0
+	.8byte	.LBB1845
+	.4byte	.Ldebug_ranges0+0x1140
+	.byte	0x1
+	.2byte	0x805
+	.4byte	0x11c37
+	.uleb128 0x55
+	.4byte	0x120c9
+	.uleb128 0x55
+	.4byte	0x120bd
+	.uleb128 0x55
+	.4byte	0x120b1
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0x1140
+	.uleb128 0x58
+	.4byte	0x120d5
+	.uleb128 0x58
+	.4byte	0x120df
+	.uleb128 0x58
+	.4byte	0x120eb
+	.uleb128 0x58
+	.4byte	0x120f7
+	.uleb128 0x58
+	.4byte	0x12103
+	.uleb128 0x58
+	.4byte	0x1210f
+	.uleb128 0x74
+	.4byte	0x1211b
+	.byte	0
+	.byte	0
+	.uleb128 0x5c
+	.4byte	0x13daa
+	.8byte	.LBB1851
+	.4byte	.Ldebug_ranges0+0x1180
+	.byte	0x1
+	.2byte	0x7a7
+	.4byte	0x11cfd
+	.uleb128 0x55
+	.4byte	0x13de7
+	.uleb128 0x55
+	.4byte	0x13de7
+	.uleb128 0x55
+	.4byte	0x13de7
+	.uleb128 0x55
+	.4byte	0x13df3
+	.uleb128 0x55
+	.4byte	0x13ddb
+	.uleb128 0x55
+	.4byte	0x13dcf
+	.uleb128 0x55
+	.4byte	0x13dc3
+	.uleb128 0x55
+	.4byte	0x13db7
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0x1180
+	.uleb128 0x58
+	.4byte	0x13dff
+	.uleb128 0x61
+	.4byte	0x13e0b
+	.4byte	.LLST244
+	.uleb128 0x58
+	.4byte	0x13e17
+	.uleb128 0x61
+	.4byte	0x13e23
+	.4byte	.LLST245
+	.uleb128 0x61
+	.4byte	0x13e2f
+	.4byte	.LLST246
+	.uleb128 0x58
+	.4byte	0x13e3b
+	.uleb128 0x58
+	.4byte	0x13e47
+	.uleb128 0x58
+	.4byte	0x13e53
+	.uleb128 0x61
+	.4byte	0x13e5f
+	.4byte	.LLST247
+	.uleb128 0x58
+	.4byte	0x13e6b
+	.uleb128 0x61
+	.4byte	0x13e77
+	.4byte	.LLST248
+	.uleb128 0x62
+	.4byte	0x13e83
+	.uleb128 0x1
+	.byte	0x60
+	.uleb128 0x61
+	.4byte	0x13e8d
+	.4byte	.LLST249
+	.uleb128 0x61
+	.4byte	0x13e97
+	.4byte	.LLST250
+	.uleb128 0x61
+	.4byte	0x13ea3
+	.4byte	.LLST251
+	.uleb128 0x61
+	.4byte	0x13eaf
+	.4byte	.LLST252
+	.uleb128 0x61
+	.4byte	0x13ebb
+	.4byte	.LLST253
+	.byte	0
+	.byte	0
+	.uleb128 0x54
+	.4byte	0x14104
+	.8byte	.LBB1862
+	.8byte	.LBE1862-.LBB1862
+	.byte	0x1
+	.2byte	0x86b
+	.4byte	0x11d48
+	.uleb128 0x55
+	.4byte	0x1411f
+	.uleb128 0x55
+	.4byte	0x14114
+	.uleb128 0x57
+	.8byte	.LBB1863
+	.8byte	.LBE1863-.LBB1863
+	.uleb128 0x58
+	.4byte	0x1412b
+	.uleb128 0x4f
+	.8byte	.LVL929
+	.4byte	0x14dcc
 	.byte	0
 	.byte	0
+	.uleb128 0x54
+	.4byte	0x14104
+	.8byte	.LBB1874
+	.8byte	.LBE1874-.LBB1874
+	.byte	0x1
+	.2byte	0x732
+	.4byte	0x11d93
+	.uleb128 0x55
+	.4byte	0x1411f
+	.uleb128 0x55
+	.4byte	0x14114
+	.uleb128 0x57
+	.8byte	.LBB1875
+	.8byte	.LBE1875-.LBB1875
+	.uleb128 0x58
+	.4byte	0x1412b
+	.uleb128 0x4f
+	.8byte	.LVL983
+	.4byte	0x14dcc
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL252
-	.4byte	0x147e7
-	.byte	0
-	.byte	0
+	.8byte	.LVL854
+	.4byte	0x1524c
+	.uleb128 0x4f
+	.8byte	.LVL855
+	.4byte	0x14e8a
+	.uleb128 0x4f
+	.8byte	.LVL856
+	.4byte	0x14fb5
+	.uleb128 0x4f
+	.8byte	.LVL858
+	.4byte	0x1509f
+	.uleb128 0x4f
+	.8byte	.LVL859
+	.4byte	0x14fb5
+	.uleb128 0x4f
+	.8byte	.LVL860
+	.4byte	0x1502f
+	.uleb128 0x4f
+	.8byte	.LVL861
+	.4byte	0x15258
 	.uleb128 0x4f
-	.8byte	.LVL85
-	.4byte	0x1469c
+	.8byte	.LVL862
+	.4byte	0x15210
 	.uleb128 0x4f
-	.8byte	.LVL86
-	.4byte	0x146fe
+	.8byte	.LVL879
+	.4byte	0x14fb5
 	.uleb128 0x4f
-	.8byte	.LVL87
-	.4byte	0x147a9
+	.8byte	.LVL882
+	.4byte	0x14fb5
 	.uleb128 0x4f
-	.8byte	.LVL98
-	.4byte	0x14801
+	.8byte	.LVL883
+	.4byte	0x15101
 	.uleb128 0x4f
-	.8byte	.LVL101
-	.4byte	0x14620
+	.8byte	.LVL884
+	.4byte	0x15258
 	.uleb128 0x4f
-	.8byte	.LVL104
-	.4byte	0x145a6
+	.8byte	.LVL886
+	.4byte	0x15210
 	.uleb128 0x4f
-	.8byte	.LVL121
-	.4byte	0x147a9
+	.8byte	.LVL888
+	.4byte	0x15264
 	.uleb128 0x4f
-	.8byte	.LVL122
-	.4byte	0x1480d
+	.8byte	.LVL889
+	.4byte	0x1510d
 	.uleb128 0x4f
-	.8byte	.LVL124
-	.4byte	0x146a8
+	.8byte	.LVL890
+	.4byte	0x1510d
 	.uleb128 0x4f
-	.8byte	.LVL131
-	.4byte	0x1469c
+	.8byte	.LVL891
+	.4byte	0x1510d
 	.uleb128 0x4f
-	.8byte	.LVL145
-	.4byte	0x14819
+	.8byte	.LVL911
+	.4byte	0x15264
 	.uleb128 0x4f
-	.8byte	.LVL146
-	.4byte	0x146a8
+	.8byte	.LVL912
+	.4byte	0x1510d
 	.uleb128 0x4f
-	.8byte	.LVL147
-	.4byte	0x146f2
+	.8byte	.LVL913
+	.4byte	0x1510d
 	.uleb128 0x4f
-	.8byte	.LVL157
-	.4byte	0x14825
+	.8byte	.LVL920
+	.4byte	0x12194
 	.uleb128 0x4f
-	.8byte	.LVL158
-	.4byte	0x147a9
+	.8byte	.LVL921
+	.4byte	0x1502f
 	.uleb128 0x4f
-	.8byte	.LVL185
-	.4byte	0x145a6
+	.8byte	.LVL923
+	.4byte	0x15258
 	.uleb128 0x4f
-	.8byte	.LVL188
-	.4byte	0x145a6
+	.8byte	.LVL931
+	.4byte	0x15264
 	.uleb128 0x4f
-	.8byte	.LVL190
-	.4byte	0x1469c
+	.8byte	.LVL932
+	.4byte	0x1510d
 	.uleb128 0x4f
-	.8byte	.LVL192
-	.4byte	0x1469c
+	.8byte	.LVL933
+	.4byte	0x15258
 	.uleb128 0x4f
-	.8byte	.LVL193
-	.4byte	0x146fe
+	.8byte	.LVL934
+	.4byte	0x15210
 	.uleb128 0x4f
-	.8byte	.LVL194
-	.4byte	0x147a9
+	.8byte	.LVL935
+	.4byte	0x1401f
 	.uleb128 0x4f
-	.8byte	.LVL207
-	.4byte	0x14620
+	.8byte	.LVL936
+	.4byte	0x15270
 	.uleb128 0x4f
-	.8byte	.LVL210
-	.4byte	0x14620
+	.8byte	.LVL937
+	.4byte	0x14fb5
 	.uleb128 0x4f
-	.8byte	.LVL212
-	.4byte	0x1469c
+	.8byte	.LVL938
+	.4byte	0x12578
 	.uleb128 0x4f
-	.8byte	.LVL213
-	.4byte	0x147a9
+	.8byte	.LVL941
+	.4byte	0x14eeb
 	.uleb128 0x4f
-	.8byte	.LVL221
-	.4byte	0x14801
+	.8byte	.LVL942
+	.4byte	0x12194
 	.uleb128 0x4f
-	.8byte	.LVL255
-	.4byte	0x146f2
+	.8byte	.LVL943
+	.4byte	0x14fb5
 	.uleb128 0x4f
-	.8byte	.LVL262
-	.4byte	0x14620
+	.8byte	.LVL944
+	.4byte	0x12578
 	.uleb128 0x4f
-	.8byte	.LVL263
-	.4byte	0x14754
-	.byte	0
-	.uleb128 0x5
-	.4byte	0x68
-	.4byte	0x1184c
-	.uleb128 0x6
-	.4byte	0x4f
-	.byte	0xa
+	.8byte	.LVL945
+	.4byte	0x1509f
+	.uleb128 0x4f
+	.8byte	.LVL948
+	.4byte	0x1509f
+	.uleb128 0x4f
+	.8byte	.LVL950
+	.4byte	0x14fb5
+	.uleb128 0x4f
+	.8byte	.LVL951
+	.4byte	0x13f58
+	.uleb128 0x4f
+	.8byte	.LVL952
+	.4byte	0x15270
+	.uleb128 0x4f
+	.8byte	.LVL953
+	.4byte	0x12194
+	.uleb128 0x4f
+	.8byte	.LVL955
+	.4byte	0x14fb5
+	.uleb128 0x4f
+	.8byte	.LVL956
+	.4byte	0x12578
+	.uleb128 0x4f
+	.8byte	.LVL958
+	.4byte	0x1510d
+	.uleb128 0x4f
+	.8byte	.LVL965
+	.4byte	0x15270
+	.uleb128 0x4f
+	.8byte	.LVL966
+	.4byte	0x12194
+	.uleb128 0x4f
+	.8byte	.LVL969
+	.4byte	0x14fb5
+	.uleb128 0x4f
+	.8byte	.LVL970
+	.4byte	0x15101
+	.uleb128 0x4f
+	.8byte	.LVL972
+	.4byte	0x14fb5
+	.uleb128 0x4f
+	.8byte	.LVL975
+	.4byte	0x14fb5
+	.uleb128 0x4f
+	.8byte	.LVL976
+	.4byte	0x14eeb
+	.uleb128 0x4f
+	.8byte	.LVL978
+	.4byte	0x1527c
+	.uleb128 0x4f
+	.8byte	.LVL979
+	.4byte	0x14fb5
+	.uleb128 0x4f
+	.8byte	.LVL980
+	.4byte	0x1527c
+	.uleb128 0x4f
+	.8byte	.LVL981
+	.4byte	0x14fb5
+	.uleb128 0x4f
+	.8byte	.LVL982
+	.4byte	0x14e8a
+	.uleb128 0x4f
+	.8byte	.LVL991
+	.4byte	0x1502f
+	.uleb128 0x4f
+	.8byte	.LVL999
+	.4byte	0x14eeb
+	.uleb128 0x4f
+	.8byte	.LVL1001
+	.4byte	0x14eeb
+	.uleb128 0x4f
+	.8byte	.LVL1003
+	.4byte	0x15163
 	.byte	0
-	.uleb128 0x3
-	.4byte	0x1183c
 	.uleb128 0x64
-	.4byte	.LASF3094
+	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x6c2
+	.2byte	0x70c
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1187b
+	.4byte	0x12124
 	.uleb128 0x66
-	.4byte	.LASF3019
+	.4byte	.LASF3107
+	.byte	0x1
+	.2byte	0x70c
+	.4byte	0x46ee
+	.uleb128 0x66
+	.4byte	.LASF3108
+	.byte	0x1
+	.2byte	0x70c
+	.4byte	0x46ee
+	.uleb128 0x66
+	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x6c2
-	.4byte	0xe1dc
+	.2byte	0x70c
+	.4byte	0xc6
 	.uleb128 0x53
-	.string	"dev"
+	.string	"i"
 	.byte	0x1
-	.2byte	0x6c4
-	.4byte	0xa5e0
-	.byte	0
-	.uleb128 0x4e
-	.4byte	.LASF3096
+	.2byte	0x70e
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF3110
 	.byte	0x1
-	.2byte	0x6bc
-	.8byte	.LFB2831
-	.8byte	.LFE2831-.LFB2831
-	.uleb128 0x1
-	.byte	0x9c
-	.4byte	0x118b5
-	.uleb128 0x52
-	.string	"t"
+	.2byte	0x70f
+	.4byte	0x15a
+	.uleb128 0x48
+	.4byte	.LASF3111
 	.byte	0x1
-	.2byte	0x6bc
-	.4byte	0x31d2
-	.4byte	.LLST74
-	.uleb128 0x4f
-	.8byte	.LVL276
-	.4byte	0x123aa
-	.byte	0
-	.uleb128 0x4e
-	.4byte	.LASF3097
+	.2byte	0x70f
+	.4byte	0x15a
+	.uleb128 0x48
+	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x6b0
-	.8byte	.LFB2830
-	.8byte	.LFE2830-.LFB2830
-	.uleb128 0x1
-	.byte	0x9c
-	.4byte	0x11915
-	.uleb128 0x52
-	.string	"t"
+	.2byte	0x710
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF3113
 	.byte	0x1
-	.2byte	0x6b0
-	.4byte	0x31d2
-	.4byte	.LLST12
+	.2byte	0x711
+	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF2975
+	.4byte	.LASF3114
 	.byte	0x1
-	.2byte	0x6b2
-	.4byte	0xe85c
-	.uleb128 0x60
-	.4byte	0x1353f
-	.8byte	.LBB938
-	.4byte	.Ldebug_ranges0+0
+	.2byte	0x712
+	.4byte	0x46f4
+	.uleb128 0x73
+	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x6b6
-	.uleb128 0x55
-	.4byte	0x1354c
-	.uleb128 0x4f
-	.8byte	.LVL71
-	.4byte	0x14831
-	.byte	0
+	.2byte	0x71f
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3098
+	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x6a0
+	.2byte	0x6f0
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1193f
+	.4byte	0x12194
+	.uleb128 0x65
+	.string	"buf"
+	.byte	0x1
+	.2byte	0x6f0
+	.4byte	0xe4f2
 	.uleb128 0x66
-	.4byte	.LASF3019
+	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x6a0
-	.4byte	0xe1dc
+	.2byte	0x6f0
+	.4byte	0xe874
 	.uleb128 0x53
-	.string	"buf"
+	.string	"i"
+	.byte	0x1
+	.2byte	0x6f2
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF3110
+	.byte	0x1
+	.2byte	0x6f3
+	.4byte	0x15a
+	.uleb128 0x48
+	.4byte	.LASF3113
+	.byte	0x1
+	.2byte	0x6f4
+	.4byte	0x46f4
+	.uleb128 0x48
+	.4byte	.LASF3117
+	.byte	0x1
+	.2byte	0x6f5
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF3109
+	.byte	0x1
+	.2byte	0x6f6
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x6a2
-	.4byte	0xe4da
+	.2byte	0x6f7
+	.4byte	0xc6
 	.byte	0
-	.uleb128 0x50
-	.4byte	.LASF3099
+	.uleb128 0x51
+	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x551
+	.2byte	0x691
 	.4byte	0xc6
-	.8byte	.LFB2828
-	.8byte	.LFE2828-.LFB2828
+	.8byte	.LFB2832
+	.8byte	.LFE2832-.LFB2832
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12140
+	.4byte	0x122f8
 	.uleb128 0x52
-	.string	"ptr"
-	.byte	0x1
-	.2byte	0x551
-	.4byte	0x458
-	.4byte	.LLST192
-	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x553
-	.4byte	0xe53f
-	.4byte	.LLST193
-	.uleb128 0x48
-	.4byte	.LASF2975
+	.2byte	0x691
+	.4byte	0xe557
+	.4byte	.LLST77
+	.uleb128 0x59
+	.4byte	.LASF2887
 	.byte	0x1
-	.2byte	0x554
-	.4byte	0xe85c
-	.uleb128 0x5b
-	.string	"buf"
+	.2byte	0x691
+	.4byte	0xc6
+	.4byte	.LLST78
+	.uleb128 0x48
+	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x555
-	.4byte	0xe4da
-	.4byte	.LLST194
+	.2byte	0x693
+	.4byte	0xe874
 	.uleb128 0x5a
-	.4byte	.LASF3100
+	.4byte	.LASF3120
 	.byte	0x1
-	.2byte	0x556
+	.2byte	0x694
 	.4byte	0xc6
-	.4byte	.LLST195
-	.uleb128 0x5a
-	.4byte	.LASF2988
+	.4byte	.LLST79
+	.uleb128 0x6a
+	.string	"ret"
 	.byte	0x1
-	.2byte	0x557
+	.2byte	0x695
 	.4byte	0xc6
-	.4byte	.LLST196
-	.uleb128 0x4d
-	.4byte	.LASF3101
-	.byte	0x1
-	.2byte	0x558
-	.4byte	0xd95c
-	.uleb128 0x3
-	.byte	0x91
-	.sleb128 -72
-	.uleb128 0x5a
-	.4byte	.LASF3102
+	.uleb128 0x1
+	.byte	0x64
+	.uleb128 0x54
+	.4byte	0x14417
+	.8byte	.LBB1222
+	.8byte	.LBE1222-.LBB1222
 	.byte	0x1
-	.2byte	0x559
-	.4byte	0xe4da
-	.4byte	.LLST197
-	.uleb128 0x6c
-	.4byte	.LASF3104
+	.2byte	0x69a
+	.4byte	0x12227
+	.uleb128 0x55
+	.4byte	0x14433
+	.uleb128 0x55
+	.4byte	0x14427
+	.byte	0
+	.uleb128 0x4f
+	.8byte	.LVL285
+	.4byte	0x14fb5
+	.uleb128 0x4f
+	.8byte	.LVL286
+	.4byte	0x15288
+	.uleb128 0x4f
+	.8byte	.LVL291
+	.4byte	0x1502f
+	.uleb128 0x4f
+	.8byte	.LVL292
+	.4byte	0x14fb5
+	.uleb128 0x4f
+	.8byte	.LVL294
+	.4byte	0x15288
+	.uleb128 0x4f
+	.8byte	.LVL295
+	.4byte	0x1502f
+	.uleb128 0x4f
+	.8byte	.LVL296
+	.4byte	0x15288
+	.uleb128 0x4f
+	.8byte	.LVL297
+	.4byte	0x15288
+	.uleb128 0x4f
+	.8byte	.LVL298
+	.4byte	0x15288
+	.uleb128 0x4f
+	.8byte	.LVL299
+	.4byte	0x15288
+	.uleb128 0x4f
+	.8byte	.LVL300
+	.4byte	0x15288
+	.uleb128 0x4f
+	.8byte	.LVL301
+	.4byte	0x15288
+	.uleb128 0x4f
+	.8byte	.LVL302
+	.4byte	0x15288
+	.uleb128 0x4f
+	.8byte	.LVL303
+	.4byte	0x15288
+	.uleb128 0x4f
+	.8byte	.LVL304
+	.4byte	0x14fb5
+	.uleb128 0x4f
+	.8byte	.LVL305
+	.4byte	0x15163
+	.byte	0
+	.uleb128 0x4e
+	.4byte	.LASF3121
 	.byte	0x1
-	.2byte	0x66e
-	.8byte	.L821
-	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1100
-	.4byte	0x11a8f
+	.2byte	0x66a
+	.8byte	.LFB2831
+	.8byte	.LFE2831-.LFB2831
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x123b1
 	.uleb128 0x48
-	.4byte	.LASF3091
-	.byte	0x1
-	.2byte	0x5aa
-	.4byte	0xc6
-	.uleb128 0x57
-	.8byte	.LBB1816
-	.8byte	.LBE1816-.LBB1816
-	.uleb128 0x6c
-	.4byte	.LASF3103
-	.byte	0x1
-	.2byte	0x5aa
-	.8byte	.L804
-	.uleb128 0x4d
-	.4byte	.LASF3092
+	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x5aa
-	.4byte	0x1528
-	.uleb128 0x3
-	.byte	0x91
-	.sleb128 -112
+	.2byte	0x66c
+	.4byte	0xe874
 	.uleb128 0x48
-	.4byte	.LASF3091
-	.byte	0x1
-	.2byte	0x5aa
-	.4byte	0x199
-	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x1130
-	.4byte	0x11a73
-	.uleb128 0x5a
-	.4byte	.LASF3093
+	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x5aa
-	.4byte	0x199
-	.4byte	.LLST211
+	.2byte	0x66d
+	.4byte	0xe1f4
 	.uleb128 0x4f
-	.8byte	.LVL903
-	.4byte	0x147b5
+	.8byte	.LVL267
+	.4byte	0x14fb5
 	.uleb128 0x4f
-	.8byte	.LVL904
-	.4byte	0x147c1
-	.byte	0
+	.8byte	.LVL268
+	.4byte	0x15101
 	.uleb128 0x4f
-	.8byte	.LVL901
-	.4byte	0x147ce
+	.8byte	.LVL269
+	.4byte	0x15101
 	.uleb128 0x4f
-	.8byte	.LVL905
-	.4byte	0x147da
-	.byte	0
+	.8byte	.LVL270
+	.4byte	0x15060
+	.uleb128 0x4f
+	.8byte	.LVL271
+	.4byte	0x14fb5
+	.uleb128 0x4f
+	.8byte	.LVL272
+	.4byte	0x15019
+	.uleb128 0x4f
+	.8byte	.LVL273
+	.4byte	0x1509f
+	.uleb128 0x4f
+	.8byte	.LVL274
+	.4byte	0x15101
+	.uleb128 0x4f
+	.8byte	.LVL275
+	.4byte	0x15101
+	.uleb128 0x4f
+	.8byte	.LVL276
+	.4byte	0x15060
 	.byte	0
-	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x10a0
-	.4byte	0x11b31
-	.uleb128 0x48
-	.4byte	.LASF3091
+	.uleb128 0x50
+	.4byte	.LASF3122
 	.byte	0x1
-	.2byte	0x65a
+	.2byte	0x607
 	.4byte	0xc6
-	.uleb128 0x57
-	.8byte	.LBB1812
-	.8byte	.LBE1812-.LBB1812
-	.uleb128 0x6c
-	.4byte	.LASF3103
+	.8byte	.LFB2830
+	.8byte	.LFE2830-.LFB2830
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x12568
+	.uleb128 0x59
+	.4byte	.LASF794
 	.byte	0x1
-	.2byte	0x65a
-	.8byte	.L858
-	.uleb128 0x4d
-	.4byte	.LASF3092
+	.2byte	0x607
+	.4byte	0x458
+	.4byte	.LLST192
+	.uleb128 0x6a
+	.string	"ebc"
 	.byte	0x1
-	.2byte	0x65a
-	.4byte	0x1528
-	.uleb128 0x3
-	.byte	0x91
-	.sleb128 -112
+	.2byte	0x609
+	.4byte	0xe557
+	.uleb128 0x1
+	.byte	0x66
 	.uleb128 0x48
-	.4byte	.LASF3091
+	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x65a
-	.4byte	0x199
+	.2byte	0x60a
+	.4byte	0xe1f4
+	.uleb128 0x48
+	.4byte	.LASF2976
+	.byte	0x1
+	.2byte	0x60b
+	.4byte	0xe874
 	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x10d0
-	.4byte	0x11b15
-	.uleb128 0x5a
-	.4byte	.LASF3093
+	.4byte	.Ldebug_ranges0+0xcb0
+	.4byte	0x1249b
+	.uleb128 0x41
+	.byte	0x8
 	.byte	0x1
-	.2byte	0x65a
-	.4byte	0x199
-	.4byte	.LLST210
+	.2byte	0x612
+	.4byte	0x12434
+	.uleb128 0x43
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x612
+	.4byte	0x1a0
+	.uleb128 0x3f
+	.string	"__c"
+	.byte	0x1
+	.2byte	0x612
+	.4byte	0x12568
+	.byte	0
+	.uleb128 0x53
+	.string	"__u"
+	.byte	0x1
+	.2byte	0x612
+	.4byte	0x12412
+	.uleb128 0x5c
+	.4byte	0x14c66
+	.8byte	.LBB1469
+	.4byte	.Ldebug_ranges0+0xcf0
+	.byte	0x1
+	.2byte	0x612
+	.4byte	0x12468
+	.uleb128 0x55
+	.4byte	0x14c89
+	.uleb128 0x55
+	.4byte	0x14c7d
+	.uleb128 0x55
+	.4byte	0x14c73
+	.byte	0
+	.uleb128 0x5e
+	.4byte	0x14a65
+	.8byte	.LBB1472
+	.8byte	.LBE1472-.LBB1472
+	.byte	0x1
+	.2byte	0x612
+	.uleb128 0x57
+	.8byte	.LBB1473
+	.8byte	.LBE1473-.LBB1473
+	.uleb128 0x62
+	.4byte	0x14a75
+	.uleb128 0x1
+	.byte	0x67
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x5c
+	.4byte	0x14911
+	.8byte	.LBB1477
+	.4byte	.Ldebug_ranges0+0xd20
+	.byte	0x1
+	.2byte	0x661
+	.4byte	0x124d8
+	.uleb128 0x55
+	.4byte	0x1492d
+	.uleb128 0x55
+	.4byte	0x14922
 	.uleb128 0x4f
-	.8byte	.LVL913
-	.4byte	0x147b5
+	.8byte	.LVL584
+	.4byte	0x15294
 	.uleb128 0x4f
-	.8byte	.LVL914
-	.4byte	0x147c1
+	.8byte	.LVL591
+	.4byte	0x15294
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL911
-	.4byte	0x147ce
+	.8byte	.LVL579
+	.4byte	0x152a1
 	.uleb128 0x4f
-	.8byte	.LVL915
-	.4byte	0x147da
+	.8byte	.LVL580
+	.4byte	0x151c4
+	.uleb128 0x4f
+	.8byte	.LVL581
+	.4byte	0x152ab
+	.uleb128 0x4f
+	.8byte	.LVL582
+	.4byte	0x14cc9
+	.uleb128 0x4f
+	.8byte	.LVL583
+	.4byte	0x13ae8
+	.uleb128 0x4f
+	.8byte	.LVL585
+	.4byte	0x14cc9
+	.uleb128 0x4f
+	.8byte	.LVL586
+	.4byte	0x1318f
+	.uleb128 0x4f
+	.8byte	.LVL587
+	.4byte	0x14cc9
+	.uleb128 0x4f
+	.8byte	.LVL588
+	.4byte	0x13c4f
+	.uleb128 0x4f
+	.8byte	.LVL589
+	.4byte	0x14cc9
+	.uleb128 0x4f
+	.8byte	.LVL590
+	.4byte	0x12782
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x61
+	.4byte	0x12578
+	.uleb128 0x6
+	.4byte	0x4f
 	.byte	0
 	.byte	0
-	.uleb128 0x6d
-	.8byte	.LBB1806
-	.8byte	.LBE1806-.LBB1806
-	.4byte	0x11be3
-	.uleb128 0x48
-	.4byte	.LASF3091
+	.uleb128 0x4e
+	.4byte	.LASF3124
 	.byte	0x1
-	.2byte	0x68c
-	.4byte	0xc6
-	.uleb128 0x57
-	.8byte	.LBB1807
-	.8byte	.LBE1807-.LBB1807
-	.uleb128 0x73
-	.4byte	.LASF3103
+	.2byte	0x592
+	.8byte	.LFB2829
+	.8byte	.LFE2829-.LFB2829
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x12724
+	.uleb128 0x52
+	.string	"ebc"
 	.byte	0x1
-	.2byte	0x68c
-	.uleb128 0x4d
-	.4byte	.LASF3092
+	.2byte	0x592
+	.4byte	0xe557
+	.4byte	.LLST191
+	.uleb128 0x48
+	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x68c
-	.4byte	0x1528
-	.uleb128 0x3
-	.byte	0x91
-	.sleb128 -112
+	.2byte	0x594
+	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3091
+	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x68c
-	.4byte	0x199
-	.uleb128 0x6d
-	.8byte	.LBB1808
-	.8byte	.LBE1808-.LBB1808
-	.4byte	0x11bc7
-	.uleb128 0x5a
-	.4byte	.LASF3093
+	.2byte	0x595
+	.4byte	0xe874
+	.uleb128 0x56
+	.4byte	.LASF3050
+	.4byte	0xb9b0
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	__func__.34953
+	.uleb128 0x54
+	.4byte	0x12724
+	.8byte	.LBB1460
+	.8byte	.LBE1460-.LBB1460
 	.byte	0x1
-	.2byte	0x68c
-	.4byte	0x199
-	.4byte	.LLST209
+	.2byte	0x5a7
+	.4byte	0x12605
+	.uleb128 0x55
+	.4byte	0x1273d
+	.uleb128 0x55
+	.4byte	0x12731
+	.uleb128 0x4f
+	.8byte	.LVL552
+	.4byte	0x14cc9
+	.byte	0
+	.uleb128 0x54
+	.4byte	0x12724
+	.8byte	.LBB1462
+	.8byte	.LBE1462-.LBB1462
+	.byte	0x1
+	.2byte	0x5bb
+	.4byte	0x12639
+	.uleb128 0x55
+	.4byte	0x1273d
+	.uleb128 0x55
+	.4byte	0x12731
+	.uleb128 0x4f
+	.8byte	.LVL557
+	.4byte	0x14cc9
+	.byte	0
+	.uleb128 0x54
+	.4byte	0x12724
+	.8byte	.LBB1464
+	.8byte	.LBE1464-.LBB1464
+	.byte	0x1
+	.2byte	0x600
+	.4byte	0x1266d
+	.uleb128 0x55
+	.4byte	0x1273d
+	.uleb128 0x55
+	.4byte	0x12731
+	.uleb128 0x4f
+	.8byte	.LVL562
+	.4byte	0x14cc9
+	.byte	0
+	.uleb128 0x54
+	.4byte	0x12724
+	.8byte	.LBB1466
+	.8byte	.LBE1466-.LBB1466
+	.byte	0x1
+	.2byte	0x5d5
+	.4byte	0x126a1
+	.uleb128 0x55
+	.4byte	0x1273d
+	.uleb128 0x55
+	.4byte	0x12731
+	.uleb128 0x4f
+	.8byte	.LVL567
+	.4byte	0x14cc9
+	.byte	0
+	.uleb128 0x4f
+	.8byte	.LVL550
+	.4byte	0x13ae8
+	.uleb128 0x4f
+	.8byte	.LVL551
+	.4byte	0x13ae8
+	.uleb128 0x4f
+	.8byte	.LVL555
+	.4byte	0x13c4f
 	.uleb128 0x4f
-	.8byte	.LVL844
-	.4byte	0x147b5
+	.8byte	.LVL556
+	.4byte	0x13c4f
 	.uleb128 0x4f
-	.8byte	.LVL845
-	.4byte	0x147c1
-	.byte	0
+	.8byte	.LVL560
+	.4byte	0x1318f
 	.uleb128 0x4f
-	.8byte	.LVL842
-	.4byte	0x147ce
+	.8byte	.LVL561
+	.4byte	0x1318f
 	.uleb128 0x4f
-	.8byte	.LVL846
-	.4byte	0x147da
+	.8byte	.LVL565
+	.4byte	0x12782
+	.uleb128 0x4f
+	.8byte	.LVL566
+	.4byte	0x12782
+	.uleb128 0x4f
+	.8byte	.LVL570
+	.4byte	0x14fb5
+	.uleb128 0x4f
+	.8byte	.LVL573
+	.4byte	0x14fb5
 	.byte	0
+	.uleb128 0x67
+	.4byte	.LASF3125
+	.byte	0x1
+	.2byte	0x58c
+	.byte	0x1
+	.4byte	0x1274a
+	.uleb128 0x66
+	.4byte	.LASF3020
+	.byte	0x1
+	.2byte	0x58c
+	.4byte	0xe1f4
+	.uleb128 0x66
+	.4byte	.LASF2976
+	.byte	0x1
+	.2byte	0x58c
+	.4byte	0xe874
 	.byte	0
-	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0xf80
-	.4byte	0x11c79
-	.uleb128 0x48
-	.4byte	.LASF3091
+	.uleb128 0x67
+	.4byte	.LASF3126
 	.byte	0x1
-	.2byte	0x698
-	.4byte	0xc6
-	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xf80
-	.uleb128 0x6c
-	.4byte	.LASF3103
+	.2byte	0x581
 	.byte	0x1
-	.2byte	0x698
-	.8byte	.L875
-	.uleb128 0x4d
-	.4byte	.LASF3092
+	.4byte	0x1277c
+	.uleb128 0x66
+	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x698
-	.4byte	0x1528
-	.uleb128 0x3
-	.byte	0x91
-	.sleb128 -112
-	.uleb128 0x48
-	.4byte	.LASF3091
+	.2byte	0x581
+	.4byte	0xe1f4
+	.uleb128 0x66
+	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x698
-	.4byte	0x199
-	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0xfc0
-	.4byte	0x11c5d
-	.uleb128 0x5a
-	.4byte	.LASF3093
+	.2byte	0x581
+	.4byte	0xe874
+	.uleb128 0x53
+	.string	"buf"
 	.byte	0x1
-	.2byte	0x698
-	.4byte	0x199
-	.4byte	.LLST198
-	.uleb128 0x4f
-	.8byte	.LVL813
-	.4byte	0x147b5
-	.uleb128 0x4f
-	.8byte	.LVL814
-	.4byte	0x147c1
+	.2byte	0x583
+	.4byte	0x1277c
 	.byte	0
-	.uleb128 0x4f
-	.8byte	.LVL811
-	.4byte	0x147ce
-	.uleb128 0x4f
-	.8byte	.LVL815
-	.4byte	0x147da
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdf7e
+	.uleb128 0x4e
+	.4byte	.LASF3127
+	.byte	0x1
+	.2byte	0x56c
+	.8byte	.LFB2826
+	.8byte	.LFE2826-.LFB2826
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x12d31
+	.uleb128 0x75
+	.4byte	.LASF3128
+	.byte	0x1
+	.2byte	0x56c
+	.4byte	0xc138
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x59
+	.4byte	.LASF3129
+	.byte	0x1
+	.2byte	0x56d
+	.4byte	0xac0
+	.4byte	.LLST144
+	.uleb128 0x59
+	.4byte	.LASF3130
+	.byte	0x1
+	.2byte	0x56d
+	.4byte	0xac0
+	.4byte	.LLST145
+	.uleb128 0x59
+	.4byte	.LASF2976
+	.byte	0x1
+	.2byte	0x56e
+	.4byte	0xe874
+	.4byte	.LLST146
+	.uleb128 0x54
+	.4byte	0x12d31
+	.8byte	.LBB1370
+	.8byte	.LBE1370-.LBB1370
+	.byte	0x1
+	.2byte	0x57d
+	.4byte	0x1288b
+	.uleb128 0x55
+	.4byte	0x12d62
+	.uleb128 0x55
+	.4byte	0x12d62
+	.uleb128 0x55
+	.4byte	0x12d62
+	.uleb128 0x55
+	.4byte	0x12d56
+	.uleb128 0x72
+	.4byte	0x12d4a
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x55
+	.4byte	0x12d3e
+	.uleb128 0x57
+	.8byte	.LBB1371
+	.8byte	.LBE1371-.LBB1371
+	.uleb128 0x58
+	.4byte	0x12d6e
+	.uleb128 0x61
+	.4byte	0x12d7a
+	.4byte	.LLST147
+	.uleb128 0x58
+	.4byte	0x12d86
+	.uleb128 0x58
+	.4byte	0x12d92
+	.uleb128 0x58
+	.4byte	0x12d9e
+	.uleb128 0x58
+	.4byte	0x12daa
+	.uleb128 0x61
+	.4byte	0x12db6
+	.4byte	.LLST148
+	.uleb128 0x61
+	.4byte	0x12dc2
+	.4byte	.LLST149
+	.uleb128 0x58
+	.4byte	0x12dce
+	.uleb128 0x61
+	.4byte	0x12dda
+	.4byte	.LLST150
+	.uleb128 0x58
+	.4byte	0x12de4
+	.uleb128 0x61
+	.4byte	0x12dee
+	.4byte	.LLST151
+	.uleb128 0x61
+	.4byte	0x12dfa
+	.4byte	.LLST152
+	.uleb128 0x58
+	.4byte	0x12e06
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12ec4
-	.8byte	.LBB1791
-	.4byte	.Ldebug_ranges0+0x1000
+	.4byte	0x12fe3
+	.8byte	.LBB1372
+	.4byte	.Ldebug_ranges0+0x9c0
 	.byte	0x1
-	.2byte	0x5cb
-	.4byte	0x11d3f
-	.uleb128 0x55
-	.4byte	0x12f01
-	.uleb128 0x55
-	.4byte	0x12f01
+	.2byte	0x576
+	.4byte	0x12a4d
 	.uleb128 0x55
-	.4byte	0x12f01
+	.4byte	0x13014
 	.uleb128 0x55
-	.4byte	0x12f0d
+	.4byte	0x13014
 	.uleb128 0x55
-	.4byte	0x12ef5
+	.4byte	0x13014
 	.uleb128 0x55
-	.4byte	0x12ee9
+	.4byte	0x13008
 	.uleb128 0x55
-	.4byte	0x12edd
+	.4byte	0x12ffc
 	.uleb128 0x55
-	.4byte	0x12ed1
+	.4byte	0x12ff0
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x1000
+	.4byte	.Ldebug_ranges0+0x9c0
 	.uleb128 0x58
-	.4byte	0x12f19
+	.4byte	0x13020
 	.uleb128 0x61
-	.4byte	0x12f25
-	.4byte	.LLST199
+	.4byte	0x1302c
+	.4byte	.LLST153
+	.uleb128 0x61
+	.4byte	0x13038
+	.4byte	.LLST154
+	.uleb128 0x61
+	.4byte	0x13044
+	.4byte	.LLST155
+	.uleb128 0x61
+	.4byte	0x13050
+	.4byte	.LLST156
+	.uleb128 0x61
+	.4byte	0x1305c
+	.4byte	.LLST157
+	.uleb128 0x61
+	.4byte	0x13068
+	.4byte	.LLST158
+	.uleb128 0x61
+	.4byte	0x13074
+	.4byte	.LLST159
+	.uleb128 0x61
+	.4byte	0x13080
+	.4byte	.LLST160
 	.uleb128 0x58
-	.4byte	0x12f31
+	.4byte	0x1308a
 	.uleb128 0x61
-	.4byte	0x12f3d
-	.4byte	.LLST200
+	.4byte	0x13094
+	.4byte	.LLST161
 	.uleb128 0x61
-	.4byte	0x12f49
-	.4byte	.LLST201
+	.4byte	0x130a0
+	.4byte	.LLST162
 	.uleb128 0x58
-	.4byte	0x12f55
+	.4byte	0x130ac
+	.uleb128 0x5c
+	.4byte	0x14182
+	.8byte	.LBB1374
+	.4byte	.Ldebug_ranges0+0xa00
+	.byte	0x1
+	.2byte	0x49b
+	.4byte	0x1296b
+	.uleb128 0x55
+	.4byte	0x141aa
+	.uleb128 0x55
+	.4byte	0x1419e
+	.uleb128 0x55
+	.4byte	0x14192
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0xa00
 	.uleb128 0x58
-	.4byte	0x12f61
+	.4byte	0x141b6
+	.uleb128 0x61
+	.4byte	0x141c1
+	.4byte	.LLST163
+	.byte	0
+	.byte	0
+	.uleb128 0x54
+	.4byte	0x14182
+	.8byte	.LBB1377
+	.8byte	.LBE1377-.LBB1377
+	.byte	0x1
+	.2byte	0x498
+	.4byte	0x129b7
+	.uleb128 0x55
+	.4byte	0x141aa
+	.uleb128 0x55
+	.4byte	0x1419e
+	.uleb128 0x55
+	.4byte	0x14192
+	.uleb128 0x57
+	.8byte	.LBB1378
+	.8byte	.LBE1378-.LBB1378
 	.uleb128 0x58
-	.4byte	0x12f6d
+	.4byte	0x141b6
 	.uleb128 0x61
-	.4byte	0x12f79
-	.4byte	.LLST202
+	.4byte	0x141c1
+	.4byte	.LLST164
+	.byte	0
+	.byte	0
+	.uleb128 0x54
+	.4byte	0x14182
+	.8byte	.LBB1379
+	.8byte	.LBE1379-.LBB1379
+	.byte	0x1
+	.2byte	0x499
+	.4byte	0x12a03
+	.uleb128 0x55
+	.4byte	0x141aa
+	.uleb128 0x55
+	.4byte	0x1419e
+	.uleb128 0x55
+	.4byte	0x14192
+	.uleb128 0x57
+	.8byte	.LBB1380
+	.8byte	.LBE1380-.LBB1380
 	.uleb128 0x58
-	.4byte	0x12f85
+	.4byte	0x141b6
 	.uleb128 0x61
-	.4byte	0x12f91
-	.4byte	.LLST203
-	.uleb128 0x62
-	.4byte	0x12f9d
+	.4byte	0x141c1
+	.4byte	.LLST165
+	.byte	0
+	.byte	0
+	.uleb128 0x5e
+	.4byte	0x14182
+	.8byte	.LBB1381
+	.8byte	.LBE1381-.LBB1381
+	.byte	0x1
+	.2byte	0x49a
+	.uleb128 0x55
+	.4byte	0x141aa
+	.uleb128 0x55
+	.4byte	0x1419e
+	.uleb128 0x55
+	.4byte	0x14192
+	.uleb128 0x57
+	.8byte	.LBB1382
+	.8byte	.LBE1382-.LBB1382
+	.uleb128 0x58
+	.4byte	0x141b6
+	.uleb128 0x61
+	.4byte	0x141c1
+	.4byte	.LLST166
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x54
+	.4byte	0x12e13
+	.8byte	.LBB1387
+	.8byte	.LBE1387-.LBB1387
+	.byte	0x1
+	.2byte	0x57b
+	.4byte	0x12af6
+	.uleb128 0x55
+	.4byte	0x12e44
+	.uleb128 0x55
+	.4byte	0x12e44
+	.uleb128 0x55
+	.4byte	0x12e44
+	.uleb128 0x55
+	.4byte	0x12e38
+	.uleb128 0x72
+	.4byte	0x12e2c
 	.uleb128 0x1
-	.byte	0x60
+	.byte	0x51
+	.uleb128 0x55
+	.4byte	0x12e20
+	.uleb128 0x57
+	.8byte	.LBB1388
+	.8byte	.LBE1388-.LBB1388
+	.uleb128 0x58
+	.4byte	0x12e50
+	.uleb128 0x58
+	.4byte	0x12e5c
+	.uleb128 0x58
+	.4byte	0x12e68
+	.uleb128 0x58
+	.4byte	0x12e74
+	.uleb128 0x58
+	.4byte	0x12e80
+	.uleb128 0x58
+	.4byte	0x12e8c
 	.uleb128 0x61
-	.4byte	0x12fa7
-	.4byte	.LLST204
+	.4byte	0x12e98
+	.4byte	.LLST167
 	.uleb128 0x61
-	.4byte	0x12fb1
-	.4byte	.LLST205
+	.4byte	0x12ea4
+	.4byte	.LLST168
+	.uleb128 0x58
+	.4byte	0x12eb0
 	.uleb128 0x61
-	.4byte	0x12fbd
-	.4byte	.LLST206
+	.4byte	0x12ebc
+	.4byte	.LLST169
+	.uleb128 0x58
+	.4byte	0x12ec6
 	.uleb128 0x61
-	.4byte	0x12fc9
-	.4byte	.LLST207
+	.4byte	0x12ed0
+	.4byte	.LLST170
 	.uleb128 0x61
-	.4byte	0x12fd5
-	.4byte	.LLST208
+	.4byte	0x12edc
+	.4byte	.LLST171
+	.uleb128 0x58
+	.4byte	0x12ee8
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12140
-	.8byte	.LBB1800
-	.4byte	.Ldebug_ranges0+0x1060
+	.4byte	0x130b9
+	.8byte	.LBB1389
+	.4byte	.Ldebug_ranges0+0xa30
 	.byte	0x1
-	.2byte	0x62f
-	.4byte	0x11d90
+	.2byte	0x578
+	.4byte	0x12c04
 	.uleb128 0x55
-	.4byte	0x12169
+	.4byte	0x130ea
 	.uleb128 0x55
-	.4byte	0x1215d
+	.4byte	0x130ea
 	.uleb128 0x55
-	.4byte	0x12151
+	.4byte	0x130ea
+	.uleb128 0x55
+	.4byte	0x130de
+	.uleb128 0x55
+	.4byte	0x130d2
+	.uleb128 0x55
+	.4byte	0x130c6
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x1060
+	.4byte	.Ldebug_ranges0+0xa30
 	.uleb128 0x58
-	.4byte	0x12175
+	.4byte	0x130f6
 	.uleb128 0x58
-	.4byte	0x1217f
+	.4byte	0x13102
 	.uleb128 0x58
-	.4byte	0x1218b
+	.4byte	0x1310e
+	.uleb128 0x62
+	.4byte	0x1311a
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x62
+	.4byte	0x13126
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x61
+	.4byte	0x13132
+	.4byte	.LLST172
+	.uleb128 0x61
+	.4byte	0x1313e
+	.4byte	.LLST173
+	.uleb128 0x61
+	.4byte	0x1314a
+	.4byte	.LLST174
+	.uleb128 0x61
+	.4byte	0x13156
+	.4byte	.LLST175
 	.uleb128 0x58
-	.4byte	0x12197
+	.4byte	0x13160
+	.uleb128 0x61
+	.4byte	0x1316a
+	.4byte	.LLST176
+	.uleb128 0x61
+	.4byte	0x13176
+	.4byte	.LLST177
 	.uleb128 0x58
-	.4byte	0x121a3
+	.4byte	0x13182
+	.uleb128 0x5c
+	.4byte	0x14182
+	.8byte	.LBB1391
+	.4byte	.Ldebug_ranges0+0xa60
+	.byte	0x1
+	.2byte	0x470
+	.4byte	0x12bca
+	.uleb128 0x55
+	.4byte	0x141aa
+	.uleb128 0x55
+	.4byte	0x1419e
+	.uleb128 0x55
+	.4byte	0x14192
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0xa60
 	.uleb128 0x58
-	.4byte	0x121af
-	.uleb128 0x74
-	.4byte	0x121bb
+	.4byte	0x141b6
+	.uleb128 0x61
+	.4byte	0x141c1
+	.4byte	.LLST178
 	.byte	0
 	.byte	0
-	.uleb128 0x54
-	.4byte	0x1321e
-	.8byte	.LBB1809
-	.8byte	.LBE1809-.LBB1809
+	.uleb128 0x60
+	.4byte	0x14182
+	.8byte	.LBB1398
+	.4byte	.Ldebug_ranges0+0xad0
 	.byte	0x1
-	.2byte	0x695
-	.4byte	0x11ddb
+	.2byte	0x46f
 	.uleb128 0x55
-	.4byte	0x13239
+	.4byte	0x141aa
 	.uleb128 0x55
-	.4byte	0x1322e
-	.uleb128 0x57
-	.8byte	.LBB1810
-	.8byte	.LBE1810-.LBB1810
+	.4byte	0x1419e
+	.uleb128 0x55
+	.4byte	0x14192
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0xad0
 	.uleb128 0x58
-	.4byte	0x13245
-	.uleb128 0x4f
-	.8byte	.LVL847
-	.4byte	0x1441e
+	.4byte	0x141b6
+	.uleb128 0x61
+	.4byte	0x141c1
+	.4byte	.LLST179
 	.byte	0
 	.byte	0
-	.uleb128 0x54
-	.4byte	0x1321e
-	.8byte	.LBB1823
-	.8byte	.LBE1823-.LBB1823
+	.byte	0
+	.byte	0
+	.uleb128 0x5e
+	.4byte	0x12ef5
+	.8byte	.LBB1416
+	.8byte	.LBE1416-.LBB1416
 	.byte	0x1
-	.2byte	0x55e
-	.4byte	0x11e26
+	.2byte	0x572
+	.uleb128 0x55
+	.4byte	0x12f26
+	.uleb128 0x55
+	.4byte	0x12f26
 	.uleb128 0x55
-	.4byte	0x13239
+	.4byte	0x12f26
 	.uleb128 0x55
-	.4byte	0x1322e
+	.4byte	0x12f1a
+	.uleb128 0x55
+	.4byte	0x12f0e
+	.uleb128 0x55
+	.4byte	0x12f02
 	.uleb128 0x57
-	.8byte	.LBB1824
-	.8byte	.LBE1824-.LBB1824
+	.8byte	.LBB1417
+	.8byte	.LBE1417-.LBB1417
 	.uleb128 0x58
-	.4byte	0x13245
-	.uleb128 0x4f
-	.8byte	.LVL917
-	.4byte	0x1441e
+	.4byte	0x12f32
+	.uleb128 0x58
+	.4byte	0x12f3e
+	.uleb128 0x58
+	.4byte	0x12f4a
+	.uleb128 0x62
+	.4byte	0x12f56
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x62
+	.4byte	0x12f62
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x61
+	.4byte	0x12f6e
+	.4byte	.LLST180
+	.uleb128 0x61
+	.4byte	0x12f7a
+	.4byte	.LLST181
+	.uleb128 0x61
+	.4byte	0x12f86
+	.4byte	.LLST182
+	.uleb128 0x61
+	.4byte	0x12f92
+	.4byte	.LLST183
+	.uleb128 0x58
+	.4byte	0x12f9c
+	.uleb128 0x61
+	.4byte	0x12fa6
+	.4byte	.LLST184
+	.uleb128 0x61
+	.4byte	0x12fb2
+	.4byte	.LLST185
+	.uleb128 0x58
+	.4byte	0x12fbe
+	.uleb128 0x58
+	.4byte	0x12fca
+	.uleb128 0x58
+	.4byte	0x12fd6
+	.uleb128 0x5c
+	.4byte	0x14137
+	.8byte	.LBB1418
+	.4byte	.Ldebug_ranges0+0xb30
+	.byte	0x1
+	.2byte	0x4c6
+	.4byte	0x12cf2
+	.uleb128 0x55
+	.4byte	0x1415f
+	.uleb128 0x55
+	.4byte	0x14153
+	.uleb128 0x55
+	.4byte	0x14147
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0xb30
+	.uleb128 0x61
+	.4byte	0x1416b
+	.4byte	.LLST186
+	.uleb128 0x61
+	.4byte	0x14176
+	.4byte	.LLST187
 	.byte	0
 	.byte	0
-	.uleb128 0x4f
-	.8byte	.LVL774
-	.4byte	0x1483d
-	.uleb128 0x4f
-	.8byte	.LVL775
-	.4byte	0x121c4
-	.uleb128 0x4f
-	.8byte	.LVL776
-	.4byte	0x145a6
-	.uleb128 0x4f
-	.8byte	.LVL778
-	.4byte	0x14690
-	.uleb128 0x4f
-	.8byte	.LVL779
-	.4byte	0x145a6
-	.uleb128 0x4f
-	.8byte	.LVL780
-	.4byte	0x14849
-	.uleb128 0x4f
-	.8byte	.LVL781
-	.4byte	0x146fe
-	.uleb128 0x4f
-	.8byte	.LVL782
-	.4byte	0x146fe
-	.uleb128 0x4f
-	.8byte	.LVL783
-	.4byte	0x146fe
-	.uleb128 0x4f
-	.8byte	.LVL817
-	.4byte	0x14620
-	.uleb128 0x4f
-	.8byte	.LVL818
-	.4byte	0x14855
-	.uleb128 0x4f
-	.8byte	.LVL819
-	.4byte	0x14801
-	.uleb128 0x4f
-	.8byte	.LVL825
-	.4byte	0x145a6
-	.uleb128 0x4f
-	.8byte	.LVL828
-	.4byte	0x145a6
-	.uleb128 0x4f
-	.8byte	.LVL829
-	.4byte	0x146f2
-	.uleb128 0x4f
-	.8byte	.LVL830
-	.4byte	0x14855
-	.uleb128 0x4f
-	.8byte	.LVL832
-	.4byte	0x14801
-	.uleb128 0x4f
-	.8byte	.LVL838
-	.4byte	0x12256
-	.uleb128 0x4f
-	.8byte	.LVL839
-	.4byte	0x14620
-	.uleb128 0x4f
-	.8byte	.LVL841
-	.4byte	0x14855
-	.uleb128 0x4f
-	.8byte	.LVL849
-	.4byte	0x14849
-	.uleb128 0x4f
-	.8byte	.LVL850
-	.4byte	0x146fe
-	.uleb128 0x4f
-	.8byte	.LVL851
-	.4byte	0x14855
-	.uleb128 0x4f
-	.8byte	.LVL852
-	.4byte	0x14801
-	.uleb128 0x4f
-	.8byte	.LVL853
-	.4byte	0x13139
-	.uleb128 0x4f
-	.8byte	.LVL854
-	.4byte	0x14861
-	.uleb128 0x4f
-	.8byte	.LVL855
-	.4byte	0x145a6
-	.uleb128 0x4f
-	.8byte	.LVL856
-	.4byte	0x1262a
-	.uleb128 0x4f
-	.8byte	.LVL857
-	.4byte	0x14849
-	.uleb128 0x4f
-	.8byte	.LVL858
-	.4byte	0x146fe
-	.uleb128 0x4f
-	.8byte	.LVL859
-	.4byte	0x146fe
-	.uleb128 0x4f
-	.8byte	.LVL862
-	.4byte	0x144dc
-	.uleb128 0x4f
-	.8byte	.LVL863
-	.4byte	0x12256
-	.uleb128 0x4f
-	.8byte	.LVL864
-	.4byte	0x145a6
-	.uleb128 0x4f
-	.8byte	.LVL865
-	.4byte	0x1262a
-	.uleb128 0x4f
-	.8byte	.LVL866
-	.4byte	0x14690
-	.uleb128 0x4f
-	.8byte	.LVL869
-	.4byte	0x14690
-	.uleb128 0x4f
-	.8byte	.LVL871
-	.4byte	0x145a6
-	.uleb128 0x4f
-	.8byte	.LVL872
-	.4byte	0x14855
-	.uleb128 0x4f
-	.8byte	.LVL873
-	.4byte	0x14801
-	.uleb128 0x4f
-	.8byte	.LVL874
-	.4byte	0x13072
-	.uleb128 0x4f
-	.8byte	.LVL875
-	.4byte	0x14861
-	.uleb128 0x4f
-	.8byte	.LVL876
-	.4byte	0x12256
-	.uleb128 0x4f
-	.8byte	.LVL878
-	.4byte	0x145a6
-	.uleb128 0x4f
-	.8byte	.LVL879
-	.4byte	0x1262a
-	.uleb128 0x4f
-	.8byte	.LVL881
-	.4byte	0x145a6
-	.uleb128 0x4f
-	.8byte	.LVL884
-	.4byte	0x145a6
-	.uleb128 0x4f
-	.8byte	.LVL885
-	.4byte	0x146fe
-	.uleb128 0x4f
-	.8byte	.LVL892
-	.4byte	0x14861
-	.uleb128 0x4f
-	.8byte	.LVL893
-	.4byte	0x12256
-	.uleb128 0x4f
-	.8byte	.LVL896
-	.4byte	0x145a6
-	.uleb128 0x4f
-	.8byte	.LVL897
-	.4byte	0x146f2
-	.uleb128 0x4f
-	.8byte	.LVL898
-	.4byte	0x1486d
-	.uleb128 0x4f
-	.8byte	.LVL907
-	.4byte	0x1486d
-	.uleb128 0x4f
-	.8byte	.LVL908
-	.4byte	0x145a6
-	.uleb128 0x4f
-	.8byte	.LVL909
-	.4byte	0x121c4
-	.uleb128 0x4f
-	.8byte	.LVL919
-	.4byte	0x144dc
-	.uleb128 0x4f
-	.8byte	.LVL920
-	.4byte	0x14620
-	.uleb128 0x4f
-	.8byte	.LVL922
-	.4byte	0x144dc
-	.uleb128 0x4f
-	.8byte	.LVL924
-	.4byte	0x144dc
-	.uleb128 0x4f
-	.8byte	.LVL926
-	.4byte	0x14754
+	.uleb128 0x60
+	.4byte	0x14137
+	.8byte	.LBB1425
+	.4byte	.Ldebug_ranges0+0xba0
+	.byte	0x1
+	.2byte	0x4c5
+	.uleb128 0x55
+	.4byte	0x1415f
+	.uleb128 0x55
+	.4byte	0x14153
+	.uleb128 0x55
+	.4byte	0x14147
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0xba0
+	.uleb128 0x61
+	.4byte	0x1416b
+	.4byte	.LLST188
+	.uleb128 0x61
+	.4byte	0x14176
+	.4byte	.LLST189
 	.byte	0
-	.uleb128 0x64
-	.4byte	.LASF3105
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x67
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x51e
+	.byte	0x1
+	.4byte	0x12e13
+	.uleb128 0x66
+	.4byte	.LASF3128
+	.byte	0x1
+	.2byte	0x51e
+	.4byte	0xc138
+	.uleb128 0x66
+	.4byte	.LASF3129
+	.byte	0x1
+	.2byte	0x51f
+	.4byte	0xac0
+	.uleb128 0x66
+	.4byte	.LASF3130
+	.byte	0x1
+	.2byte	0x51f
+	.4byte	0xac0
+	.uleb128 0x66
+	.4byte	.LASF2976
+	.byte	0x1
+	.2byte	0x520
+	.4byte	0xe874
+	.uleb128 0x48
+	.4byte	.LASF3020
+	.byte	0x1
+	.2byte	0x522
+	.4byte	0xe1f4
+	.uleb128 0x48
+	.4byte	.LASF3132
 	.byte	0x1
-	.2byte	0x538
+	.2byte	0x523
+	.4byte	0x13f
+	.uleb128 0x48
+	.4byte	.LASF3133
+	.byte	0x1
+	.2byte	0x523
+	.4byte	0x13f
+	.uleb128 0x48
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x524
+	.4byte	0x110
+	.uleb128 0x48
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x524
+	.4byte	0x110
+	.uleb128 0x48
+	.4byte	.LASF794
+	.byte	0x1
+	.2byte	0x524
+	.4byte	0x110
+	.uleb128 0x48
+	.4byte	.LASF3136
+	.byte	0x1
+	.2byte	0x525
+	.4byte	0xc138
+	.uleb128 0x48
+	.4byte	.LASF2915
+	.byte	0x1
+	.2byte	0x526
 	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF262
+	.byte	0x1
+	.2byte	0x526
+	.4byte	0xc6
+	.uleb128 0x53
+	.string	"i"
+	.byte	0x1
+	.2byte	0x527
+	.4byte	0xc6
+	.uleb128 0x53
+	.string	"j"
+	.byte	0x1
+	.2byte	0x527
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF3137
+	.byte	0x1
+	.2byte	0x528
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF2871
+	.byte	0x1
+	.2byte	0x529
+	.4byte	0xc138
+	.uleb128 0x48
+	.4byte	.LASF2961
+	.byte	0x1
+	.2byte	0x52a
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x67
+	.4byte	.LASF3138
 	.byte	0x1
-	.4byte	0x121c4
+	.2byte	0x4d0
+	.byte	0x1
+	.4byte	0x12ef5
 	.uleb128 0x66
-	.4byte	.LASF3106
+	.4byte	.LASF3128
 	.byte	0x1
-	.2byte	0x538
-	.4byte	0x46ee
+	.2byte	0x4d0
+	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3107
+	.4byte	.LASF3129
 	.byte	0x1
-	.2byte	0x538
-	.4byte	0x46ee
+	.2byte	0x4d1
+	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3108
+	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x538
+	.2byte	0x4d1
+	.4byte	0xac0
+	.uleb128 0x66
+	.4byte	.LASF2976
+	.byte	0x1
+	.2byte	0x4d2
+	.4byte	0xe874
+	.uleb128 0x48
+	.4byte	.LASF3020
+	.byte	0x1
+	.2byte	0x4d4
+	.4byte	0xe1f4
+	.uleb128 0x48
+	.4byte	.LASF3132
+	.byte	0x1
+	.2byte	0x4d5
+	.4byte	0x13f
+	.uleb128 0x48
+	.4byte	.LASF3133
+	.byte	0x1
+	.2byte	0x4d5
+	.4byte	0x13f
+	.uleb128 0x48
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x4d6
+	.4byte	0x110
+	.uleb128 0x48
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x4d6
+	.4byte	0x110
+	.uleb128 0x48
+	.4byte	.LASF794
+	.byte	0x1
+	.2byte	0x4d6
+	.4byte	0x110
+	.uleb128 0x48
+	.4byte	.LASF3136
+	.byte	0x1
+	.2byte	0x4d7
+	.4byte	0xc138
+	.uleb128 0x48
+	.4byte	.LASF2915
+	.byte	0x1
+	.2byte	0x4d8
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF262
+	.byte	0x1
+	.2byte	0x4d8
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x53a
+	.2byte	0x4d9
+	.4byte	0xc6
+	.uleb128 0x53
+	.string	"j"
+	.byte	0x1
+	.2byte	0x4d9
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3109
+	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x53b
-	.4byte	0x15a
+	.2byte	0x4da
+	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3110
+	.4byte	.LASF2871
 	.byte	0x1
-	.2byte	0x53b
-	.4byte	0x15a
+	.2byte	0x4db
+	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF3111
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x53c
+	.2byte	0x4dc
 	.4byte	0xc6
+	.byte	0
+	.uleb128 0x67
+	.4byte	.LASF3139
+	.byte	0x1
+	.2byte	0x4a6
+	.byte	0x1
+	.4byte	0x12fe3
+	.uleb128 0x66
+	.4byte	.LASF3128
+	.byte	0x1
+	.2byte	0x4a6
+	.4byte	0xc138
+	.uleb128 0x66
+	.4byte	.LASF3129
+	.byte	0x1
+	.2byte	0x4a7
+	.4byte	0xac0
+	.uleb128 0x66
+	.4byte	.LASF3130
+	.byte	0x1
+	.2byte	0x4a7
+	.4byte	0xac0
+	.uleb128 0x66
+	.4byte	.LASF2976
+	.byte	0x1
+	.2byte	0x4a8
+	.4byte	0xe874
 	.uleb128 0x48
-	.4byte	.LASF3112
+	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x53d
-	.4byte	0x46f4
+	.2byte	0x4aa
+	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF3113
+	.4byte	.LASF3134
 	.byte	0x1
-	.2byte	0x53e
-	.4byte	0x46f4
-	.uleb128 0x73
-	.4byte	.LASF3114
+	.2byte	0x4ab
+	.4byte	0x13f
+	.uleb128 0x48
+	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x54b
-	.byte	0
-	.uleb128 0x50
-	.4byte	.LASF3115
+	.2byte	0x4ab
+	.4byte	0x13f
+	.uleb128 0x48
+	.4byte	.LASF3132
 	.byte	0x1
-	.2byte	0x523
-	.4byte	0xc6
-	.8byte	.LFB2826
-	.8byte	.LFE2826-.LFB2826
-	.uleb128 0x1
-	.byte	0x9c
-	.4byte	0x12256
-	.uleb128 0x59
-	.4byte	.LASF3106
+	.2byte	0x4ab
+	.4byte	0xac0
+	.uleb128 0x48
+	.4byte	.LASF3133
 	.byte	0x1
-	.2byte	0x523
-	.4byte	0x46ee
-	.4byte	.LLST75
-	.uleb128 0x59
-	.4byte	.LASF3108
+	.2byte	0x4ab
+	.4byte	0xac0
+	.uleb128 0x48
+	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x523
+	.2byte	0x4ac
+	.4byte	0xc138
+	.uleb128 0x48
+	.4byte	.LASF2915
+	.byte	0x1
+	.2byte	0x4ad
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF262
+	.byte	0x1
+	.2byte	0x4ad
 	.4byte	0xc6
-	.4byte	.LLST76
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x525
+	.2byte	0x4ae
+	.4byte	0xc6
+	.uleb128 0x53
+	.string	"j"
+	.byte	0x1
+	.2byte	0x4ae
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3109
+	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x526
-	.4byte	0x15a
+	.2byte	0x4af
+	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3112
+	.4byte	.LASF2871
 	.byte	0x1
-	.2byte	0x527
-	.4byte	0x46f4
-	.uleb128 0x5a
-	.4byte	.LASF3116
+	.2byte	0x4b0
+	.4byte	0xc138
+	.uleb128 0x48
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x528
+	.2byte	0x4b1
 	.4byte	0xc6
-	.4byte	.LLST77
-	.uleb128 0x5a
-	.4byte	.LASF3117
+	.uleb128 0x48
+	.4byte	.LASF3140
 	.byte	0x1
-	.2byte	0x529
-	.4byte	0xc6
-	.4byte	.LLST78
-	.uleb128 0x4f
-	.8byte	.LVL286
-	.4byte	0x14879
+	.2byte	0x4b2
+	.4byte	0x110
+	.uleb128 0x48
+	.4byte	.LASF3141
+	.byte	0x1
+	.2byte	0x4b3
+	.4byte	0x110
 	.byte	0
-	.uleb128 0x51
-	.4byte	.LASF3118
+	.uleb128 0x67
+	.4byte	.LASF3142
 	.byte	0x1
-	.2byte	0x4c6
-	.4byte	0xc6
-	.8byte	.LFB2825
-	.8byte	.LFE2825-.LFB2825
-	.uleb128 0x1
-	.byte	0x9c
-	.4byte	0x123aa
-	.uleb128 0x52
-	.string	"ebc"
+	.2byte	0x47b
 	.byte	0x1
-	.2byte	0x4c6
-	.4byte	0xe53f
-	.4byte	.LLST79
+	.4byte	0x130b9
+	.uleb128 0x66
+	.4byte	.LASF3128
+	.byte	0x1
+	.2byte	0x47b
+	.4byte	0xc138
+	.uleb128 0x66
+	.4byte	.LASF3129
+	.byte	0x1
+	.2byte	0x47c
+	.4byte	0xac0
+	.uleb128 0x66
+	.4byte	.LASF3130
+	.byte	0x1
+	.2byte	0x47c
+	.4byte	0xac0
+	.uleb128 0x66
+	.4byte	.LASF2976
+	.byte	0x1
+	.2byte	0x47d
+	.4byte	0xe874
 	.uleb128 0x48
-	.4byte	.LASF2975
+	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x4c8
-	.4byte	0xe85c
-	.uleb128 0x5a
-	.4byte	.LASF3119
+	.2byte	0x47f
+	.4byte	0xe1f4
+	.uleb128 0x48
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x480
+	.4byte	0x15a
+	.uleb128 0x48
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x480
+	.4byte	0x15a
+	.uleb128 0x48
+	.4byte	.LASF3132
+	.byte	0x1
+	.2byte	0x480
+	.4byte	0x46f4
+	.uleb128 0x48
+	.4byte	.LASF3133
+	.byte	0x1
+	.2byte	0x480
+	.4byte	0x46f4
+	.uleb128 0x48
+	.4byte	.LASF3136
+	.byte	0x1
+	.2byte	0x481
+	.4byte	0xc138
+	.uleb128 0x48
+	.4byte	.LASF2915
 	.byte	0x1
-	.2byte	0x4c9
+	.2byte	0x482
 	.4byte	0xc6
-	.4byte	.LLST80
-	.uleb128 0x6a
-	.string	"ret"
+	.uleb128 0x48
+	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x4ca
+	.2byte	0x482
 	.4byte	0xc6
-	.uleb128 0x1
-	.byte	0x64
-	.uleb128 0x54
-	.4byte	0x134b1
-	.8byte	.LBB1212
-	.8byte	.LBE1212-.LBB1212
+	.uleb128 0x53
+	.string	"i"
 	.byte	0x1
-	.2byte	0x4cd
-	.4byte	0x122d9
-	.uleb128 0x55
-	.4byte	0x134cd
-	.uleb128 0x55
-	.4byte	0x134c1
-	.byte	0
-	.uleb128 0x4f
-	.8byte	.LVL292
-	.4byte	0x145a6
-	.uleb128 0x4f
-	.8byte	.LVL293
-	.4byte	0x14885
-	.uleb128 0x4f
-	.8byte	.LVL297
-	.4byte	0x14620
-	.uleb128 0x4f
-	.8byte	.LVL298
-	.4byte	0x145a6
-	.uleb128 0x4f
-	.8byte	.LVL300
-	.4byte	0x14885
-	.uleb128 0x4f
-	.8byte	.LVL301
-	.4byte	0x14620
-	.uleb128 0x4f
-	.8byte	.LVL302
-	.4byte	0x14885
-	.uleb128 0x4f
-	.8byte	.LVL303
-	.4byte	0x14885
-	.uleb128 0x4f
-	.8byte	.LVL304
-	.4byte	0x14885
-	.uleb128 0x4f
-	.8byte	.LVL305
-	.4byte	0x14885
-	.uleb128 0x4f
-	.8byte	.LVL306
-	.4byte	0x14885
-	.uleb128 0x4f
-	.8byte	.LVL307
-	.4byte	0x14885
-	.uleb128 0x4f
-	.8byte	.LVL308
-	.4byte	0x14885
-	.uleb128 0x4f
-	.8byte	.LVL309
-	.4byte	0x14885
-	.uleb128 0x4f
-	.8byte	.LVL310
-	.4byte	0x145a6
-	.uleb128 0x4f
-	.8byte	.LVL311
-	.4byte	0x14754
-	.byte	0
-	.uleb128 0x4e
-	.4byte	.LASF3120
+	.2byte	0x483
+	.4byte	0xc6
+	.uleb128 0x53
+	.string	"j"
 	.byte	0x1
-	.2byte	0x49f
-	.8byte	.LFB2824
-	.8byte	.LFE2824-.LFB2824
-	.uleb128 0x1
-	.byte	0x9c
-	.4byte	0x12463
+	.2byte	0x483
+	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF2975
+	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x4a1
-	.4byte	0xe85c
+	.2byte	0x484
+	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3019
+	.4byte	.LASF2871
 	.byte	0x1
-	.2byte	0x4a2
-	.4byte	0xe1dc
-	.uleb128 0x4f
-	.8byte	.LVL265
-	.4byte	0x145a6
-	.uleb128 0x4f
-	.8byte	.LVL266
-	.4byte	0x146f2
-	.uleb128 0x4f
-	.8byte	.LVL267
-	.4byte	0x146f2
-	.uleb128 0x4f
-	.8byte	.LVL268
-	.4byte	0x14651
-	.uleb128 0x4f
-	.8byte	.LVL269
-	.4byte	0x145a6
-	.uleb128 0x4f
-	.8byte	.LVL270
-	.4byte	0x1460a
-	.uleb128 0x4f
-	.8byte	.LVL271
-	.4byte	0x14690
-	.uleb128 0x4f
-	.8byte	.LVL272
-	.4byte	0x146f2
-	.uleb128 0x4f
-	.8byte	.LVL273
-	.4byte	0x146f2
-	.uleb128 0x4f
-	.8byte	.LVL274
-	.4byte	0x14651
+	.2byte	0x485
+	.4byte	0xc138
+	.uleb128 0x48
+	.4byte	.LASF2961
+	.byte	0x1
+	.2byte	0x486
+	.4byte	0xc6
 	.byte	0
-	.uleb128 0x50
-	.4byte	.LASF3121
+	.uleb128 0x67
+	.4byte	.LASF3143
+	.byte	0x1
+	.2byte	0x452
+	.byte	0x1
+	.4byte	0x1318f
+	.uleb128 0x66
+	.4byte	.LASF3128
+	.byte	0x1
+	.2byte	0x452
+	.4byte	0xc138
+	.uleb128 0x66
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x453
-	.4byte	0xc6
-	.8byte	.LFB2823
-	.8byte	.LFE2823-.LFB2823
-	.uleb128 0x1
-	.byte	0x9c
-	.4byte	0x1261a
-	.uleb128 0x59
-	.4byte	.LASF794
+	.4byte	0xac0
+	.uleb128 0x66
+	.4byte	.LASF3130
 	.byte	0x1
 	.2byte	0x453
-	.4byte	0x458
-	.4byte	.LLST149
-	.uleb128 0x6a
-	.string	"ebc"
+	.4byte	0xac0
+	.uleb128 0x66
+	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x455
-	.4byte	0xe53f
-	.uleb128 0x1
-	.byte	0x66
+	.2byte	0x454
+	.4byte	0xe874
 	.uleb128 0x48
-	.4byte	.LASF3019
+	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x456
-	.4byte	0xe1dc
+	.4byte	0xe1f4
 	.uleb128 0x48
-	.4byte	.LASF2975
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x457
-	.4byte	0xe85c
-	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0xb30
-	.4byte	0x1254d
-	.uleb128 0x41
-	.byte	0x8
+	.4byte	0x13f
+	.uleb128 0x48
+	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x45e
-	.4byte	0x124e6
-	.uleb128 0x43
-	.4byte	.LASF3122
+	.2byte	0x457
+	.4byte	0x13f
+	.uleb128 0x48
+	.4byte	.LASF3132
 	.byte	0x1
-	.2byte	0x45e
-	.4byte	0x1a0
-	.uleb128 0x3f
-	.string	"__c"
+	.2byte	0x457
+	.4byte	0xac0
+	.uleb128 0x48
+	.4byte	.LASF3133
+	.byte	0x1
+	.2byte	0x457
+	.4byte	0xac0
+	.uleb128 0x48
+	.4byte	.LASF3136
+	.byte	0x1
+	.2byte	0x458
+	.4byte	0xc138
+	.uleb128 0x48
+	.4byte	.LASF2915
+	.byte	0x1
+	.2byte	0x459
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF262
+	.byte	0x1
+	.2byte	0x459
+	.4byte	0xc6
+	.uleb128 0x53
+	.string	"i"
+	.byte	0x1
+	.2byte	0x45a
+	.4byte	0xc6
+	.uleb128 0x53
+	.string	"j"
+	.byte	0x1
+	.2byte	0x45a
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF3137
+	.byte	0x1
+	.2byte	0x45b
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF2871
+	.byte	0x1
+	.2byte	0x45c
+	.4byte	0xc138
+	.uleb128 0x48
+	.4byte	.LASF2961
+	.byte	0x1
+	.2byte	0x45d
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x4e
+	.4byte	.LASF3144
+	.byte	0x1
+	.2byte	0x43c
+	.8byte	.LFB2820
+	.8byte	.LFE2820-.LFB2820
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1368a
+	.uleb128 0x75
+	.4byte	.LASF3128
+	.byte	0x1
+	.2byte	0x43c
+	.4byte	0xc138
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x59
+	.4byte	.LASF3129
+	.byte	0x1
+	.2byte	0x43d
+	.4byte	0xac0
+	.4byte	.LLST107
+	.uleb128 0x59
+	.4byte	.LASF3130
+	.byte	0x1
+	.2byte	0x43d
+	.4byte	0xac0
+	.4byte	.LLST108
+	.uleb128 0x59
+	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x45e
-	.4byte	0x1261a
+	.2byte	0x43e
+	.4byte	0xe874
+	.4byte	.LLST109
+	.uleb128 0x54
+	.4byte	0x1368a
+	.8byte	.LBB1256
+	.8byte	.LBE1256-.LBB1256
+	.byte	0x1
+	.2byte	0x44d
+	.4byte	0x13298
+	.uleb128 0x55
+	.4byte	0x136bb
+	.uleb128 0x55
+	.4byte	0x136bb
+	.uleb128 0x55
+	.4byte	0x136bb
+	.uleb128 0x55
+	.4byte	0x136af
+	.uleb128 0x72
+	.4byte	0x136a3
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x55
+	.4byte	0x13697
+	.uleb128 0x57
+	.8byte	.LBB1257
+	.8byte	.LBE1257-.LBB1257
+	.uleb128 0x58
+	.4byte	0x136c7
+	.uleb128 0x61
+	.4byte	0x136d3
+	.4byte	.LLST110
+	.uleb128 0x58
+	.4byte	0x136df
+	.uleb128 0x58
+	.4byte	0x136eb
+	.uleb128 0x58
+	.4byte	0x136f7
+	.uleb128 0x58
+	.4byte	0x13703
+	.uleb128 0x61
+	.4byte	0x1370f
+	.4byte	.LLST111
+	.uleb128 0x61
+	.4byte	0x1371b
+	.4byte	.LLST112
+	.uleb128 0x58
+	.4byte	0x13727
+	.uleb128 0x61
+	.4byte	0x13733
+	.4byte	.LLST113
+	.uleb128 0x58
+	.4byte	0x1373d
+	.uleb128 0x61
+	.4byte	0x13747
+	.4byte	.LLST114
+	.uleb128 0x61
+	.4byte	0x13753
+	.4byte	.LLST115
+	.uleb128 0x58
+	.4byte	0x1375f
 	.byte	0
-	.uleb128 0x53
-	.string	"__u"
+	.byte	0
+	.uleb128 0x54
+	.4byte	0x13a12
+	.8byte	.LBB1258
+	.8byte	.LBE1258-.LBB1258
 	.byte	0x1
-	.2byte	0x45e
-	.4byte	0x124c4
+	.2byte	0x446
+	.4byte	0x133e6
+	.uleb128 0x55
+	.4byte	0x13a43
+	.uleb128 0x55
+	.4byte	0x13a43
+	.uleb128 0x55
+	.4byte	0x13a43
+	.uleb128 0x55
+	.4byte	0x13a37
+	.uleb128 0x55
+	.4byte	0x13a2b
+	.uleb128 0x55
+	.4byte	0x13a1f
+	.uleb128 0x57
+	.8byte	.LBB1259
+	.8byte	.LBE1259-.LBB1259
+	.uleb128 0x58
+	.4byte	0x13a4f
+	.uleb128 0x61
+	.4byte	0x13a5b
+	.4byte	.LLST116
+	.uleb128 0x58
+	.4byte	0x13a65
+	.uleb128 0x61
+	.4byte	0x13a6f
+	.4byte	.LLST117
+	.uleb128 0x58
+	.4byte	0x13a7b
+	.uleb128 0x61
+	.4byte	0x13a87
+	.4byte	.LLST118
+	.uleb128 0x61
+	.4byte	0x13a93
+	.4byte	.LLST119
+	.uleb128 0x61
+	.4byte	0x13a9f
+	.4byte	.LLST120
+	.uleb128 0x61
+	.4byte	0x13aab
+	.4byte	.LLST121
+	.uleb128 0x61
+	.4byte	0x13ab7
+	.4byte	.LLST122
+	.uleb128 0x61
+	.4byte	0x13ac3
+	.4byte	.LLST123
+	.uleb128 0x61
+	.4byte	0x13acf
+	.4byte	.LLST124
+	.uleb128 0x58
+	.4byte	0x13adb
 	.uleb128 0x5c
-	.4byte	0x13d00
-	.8byte	.LBB1396
-	.4byte	.Ldebug_ranges0+0xb70
+	.4byte	0x14202
+	.8byte	.LBB1260
+	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
-	.2byte	0x45e
-	.4byte	0x1251a
+	.2byte	0x359
+	.4byte	0x13370
 	.uleb128 0x55
-	.4byte	0x13d23
+	.4byte	0x1422a
 	.uleb128 0x55
-	.4byte	0x13d17
+	.4byte	0x1421e
 	.uleb128 0x55
-	.4byte	0x13d0d
+	.4byte	0x14212
 	.byte	0
-	.uleb128 0x5e
-	.4byte	0x13aff
-	.8byte	.LBB1399
-	.8byte	.LBE1399-.LBB1399
+	.uleb128 0x5c
+	.4byte	0x14202
+	.8byte	.LBB1265
+	.4byte	.Ldebug_ranges0+0x720
 	.byte	0x1
-	.2byte	0x45e
-	.uleb128 0x57
-	.8byte	.LBB1400
-	.8byte	.LBE1400-.LBB1400
-	.uleb128 0x62
-	.4byte	0x13b0f
-	.uleb128 0x1
-	.byte	0x67
-	.byte	0
-	.byte	0
+	.2byte	0x35a
+	.4byte	0x13398
+	.uleb128 0x55
+	.4byte	0x1422a
+	.uleb128 0x55
+	.4byte	0x1421e
+	.uleb128 0x55
+	.4byte	0x14212
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x139ab
-	.8byte	.LBB1404
-	.4byte	.Ldebug_ranges0+0xba0
+	.4byte	0x14202
+	.8byte	.LBB1277
+	.4byte	.Ldebug_ranges0+0x790
 	.byte	0x1
-	.2byte	0x496
-	.4byte	0x1258a
+	.2byte	0x35b
+	.4byte	0x133c0
 	.uleb128 0x55
-	.4byte	0x139c7
+	.4byte	0x1422a
 	.uleb128 0x55
-	.4byte	0x139bc
-	.uleb128 0x4f
-	.8byte	.LVL507
-	.4byte	0x14891
-	.uleb128 0x4f
-	.8byte	.LVL514
-	.4byte	0x14891
+	.4byte	0x1421e
+	.uleb128 0x55
+	.4byte	0x14212
 	.byte	0
-	.uleb128 0x4f
-	.8byte	.LVL502
-	.4byte	0x1489e
-	.uleb128 0x4f
-	.8byte	.LVL503
-	.4byte	0x147b5
-	.uleb128 0x4f
-	.8byte	.LVL504
-	.4byte	0x148a8
-	.uleb128 0x4f
-	.8byte	.LVL505
-	.4byte	0x1431b
-	.uleb128 0x4f
-	.8byte	.LVL506
-	.4byte	0x12c08
-	.uleb128 0x4f
-	.8byte	.LVL508
-	.4byte	0x1431b
-	.uleb128 0x4f
-	.8byte	.LVL509
-	.4byte	0x12a1e
-	.uleb128 0x4f
-	.8byte	.LVL510
-	.4byte	0x1431b
-	.uleb128 0x4f
-	.8byte	.LVL511
-	.4byte	0x12d69
-	.uleb128 0x4f
-	.8byte	.LVL512
-	.4byte	0x1431b
-	.uleb128 0x4f
-	.8byte	.LVL513
-	.4byte	0x12834
+	.uleb128 0x60
+	.4byte	0x14202
+	.8byte	.LBB1289
+	.4byte	.Ldebug_ranges0+0x800
+	.byte	0x1
+	.2byte	0x35c
+	.uleb128 0x55
+	.4byte	0x1422a
+	.uleb128 0x55
+	.4byte	0x1421e
+	.uleb128 0x55
+	.4byte	0x14212
 	.byte	0
-	.uleb128 0x5
-	.4byte	0x61
-	.4byte	0x1262a
-	.uleb128 0x6
-	.4byte	0x4f
 	.byte	0
 	.byte	0
-	.uleb128 0x4e
-	.4byte	.LASF3123
+	.uleb128 0x54
+	.4byte	0x1376c
+	.8byte	.LBB1300
+	.8byte	.LBE1300-.LBB1300
 	.byte	0x1
-	.2byte	0x3ff
-	.8byte	.LFB2822
-	.8byte	.LFE2822-.LFB2822
+	.2byte	0x44b
+	.4byte	0x1348f
+	.uleb128 0x55
+	.4byte	0x1379d
+	.uleb128 0x55
+	.4byte	0x1379d
+	.uleb128 0x55
+	.4byte	0x1379d
+	.uleb128 0x55
+	.4byte	0x13791
+	.uleb128 0x72
+	.4byte	0x13785
 	.uleb128 0x1
-	.byte	0x9c
-	.4byte	0x127d6
-	.uleb128 0x52
-	.string	"ebc"
-	.byte	0x1
-	.2byte	0x3ff
-	.4byte	0xe53f
-	.4byte	.LLST148
-	.uleb128 0x48
-	.4byte	.LASF3019
-	.byte	0x1
-	.2byte	0x401
-	.4byte	0xe1dc
-	.uleb128 0x48
-	.4byte	.LASF2975
-	.byte	0x1
-	.2byte	0x402
-	.4byte	0xe85c
-	.uleb128 0x56
-	.4byte	.LASF3049
-	.4byte	0xb9b0
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	__func__.34785
+	.byte	0x51
+	.uleb128 0x55
+	.4byte	0x13779
+	.uleb128 0x57
+	.8byte	.LBB1301
+	.8byte	.LBE1301-.LBB1301
+	.uleb128 0x58
+	.4byte	0x137a9
+	.uleb128 0x58
+	.4byte	0x137b5
+	.uleb128 0x58
+	.4byte	0x137c1
+	.uleb128 0x58
+	.4byte	0x137cd
+	.uleb128 0x58
+	.4byte	0x137d9
+	.uleb128 0x58
+	.4byte	0x137e5
+	.uleb128 0x61
+	.4byte	0x137f1
+	.4byte	.LLST125
+	.uleb128 0x61
+	.4byte	0x137fd
+	.4byte	.LLST126
+	.uleb128 0x58
+	.4byte	0x13809
+	.uleb128 0x61
+	.4byte	0x13815
+	.4byte	.LLST127
+	.uleb128 0x58
+	.4byte	0x1381f
+	.uleb128 0x61
+	.4byte	0x13829
+	.4byte	.LLST128
+	.uleb128 0x61
+	.4byte	0x13835
+	.4byte	.LLST129
+	.uleb128 0x58
+	.4byte	0x13841
+	.byte	0
+	.byte	0
 	.uleb128 0x54
-	.4byte	0x127d6
-	.8byte	.LBB1387
-	.8byte	.LBE1387-.LBB1387
+	.4byte	0x1393c
+	.8byte	.LBB1302
+	.8byte	.LBE1302-.LBB1302
 	.byte	0x1
-	.2byte	0x40c
-	.4byte	0x126b7
+	.2byte	0x448
+	.4byte	0x13589
 	.uleb128 0x55
-	.4byte	0x127ef
+	.4byte	0x1396d
 	.uleb128 0x55
-	.4byte	0x127e3
-	.uleb128 0x4f
-	.8byte	.LVL474
-	.4byte	0x1431b
+	.4byte	0x1396d
+	.uleb128 0x55
+	.4byte	0x1396d
+	.uleb128 0x55
+	.4byte	0x13961
+	.uleb128 0x55
+	.4byte	0x13955
+	.uleb128 0x55
+	.4byte	0x13949
+	.uleb128 0x57
+	.8byte	.LBB1303
+	.8byte	.LBE1303-.LBB1303
+	.uleb128 0x58
+	.4byte	0x13979
+	.uleb128 0x61
+	.4byte	0x13985
+	.4byte	.LLST130
+	.uleb128 0x58
+	.4byte	0x1398f
+	.uleb128 0x61
+	.4byte	0x13999
+	.4byte	.LLST131
+	.uleb128 0x61
+	.4byte	0x139a5
+	.4byte	.LLST132
+	.uleb128 0x61
+	.4byte	0x139b1
+	.4byte	.LLST133
+	.uleb128 0x58
+	.4byte	0x139bd
+	.uleb128 0x62
+	.4byte	0x139c9
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x62
+	.4byte	0x139d5
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x61
+	.4byte	0x139e1
+	.4byte	.LLST134
+	.uleb128 0x61
+	.4byte	0x139ed
+	.4byte	.LLST135
+	.uleb128 0x61
+	.4byte	0x139f9
+	.4byte	.LLST136
+	.uleb128 0x58
+	.4byte	0x13a05
+	.uleb128 0x5c
+	.4byte	0x14202
+	.8byte	.LBB1304
+	.4byte	.Ldebug_ranges0+0x850
+	.byte	0x1
+	.2byte	0x381
+	.4byte	0x13563
+	.uleb128 0x55
+	.4byte	0x1422a
+	.uleb128 0x55
+	.4byte	0x1421e
+	.uleb128 0x55
+	.4byte	0x14212
 	.byte	0
-	.uleb128 0x54
-	.4byte	0x127d6
-	.8byte	.LBB1389
-	.8byte	.LBE1389-.LBB1389
+	.uleb128 0x60
+	.4byte	0x14202
+	.8byte	.LBB1311
+	.4byte	.Ldebug_ranges0+0x8b0
 	.byte	0x1
-	.2byte	0x420
-	.4byte	0x126eb
+	.2byte	0x382
 	.uleb128 0x55
-	.4byte	0x127ef
+	.4byte	0x1422a
 	.uleb128 0x55
-	.4byte	0x127e3
-	.uleb128 0x4f
-	.8byte	.LVL479
-	.4byte	0x1431b
+	.4byte	0x1421e
+	.uleb128 0x55
+	.4byte	0x14212
 	.byte	0
-	.uleb128 0x54
-	.4byte	0x127d6
-	.8byte	.LBB1391
-	.8byte	.LBE1391-.LBB1391
+	.byte	0
+	.byte	0
+	.uleb128 0x5e
+	.4byte	0x1384e
+	.8byte	.LBB1322
+	.8byte	.LBE1322-.LBB1322
 	.byte	0x1
-	.2byte	0x447
-	.4byte	0x1271f
+	.2byte	0x442
 	.uleb128 0x55
-	.4byte	0x127ef
+	.4byte	0x1387f
 	.uleb128 0x55
-	.4byte	0x127e3
-	.uleb128 0x4f
-	.8byte	.LVL484
-	.4byte	0x1431b
+	.4byte	0x1387f
+	.uleb128 0x55
+	.4byte	0x1387f
+	.uleb128 0x55
+	.4byte	0x13873
+	.uleb128 0x55
+	.4byte	0x13867
+	.uleb128 0x55
+	.4byte	0x1385b
+	.uleb128 0x57
+	.8byte	.LBB1323
+	.8byte	.LBE1323-.LBB1323
+	.uleb128 0x58
+	.4byte	0x1388b
+	.uleb128 0x61
+	.4byte	0x13897
+	.4byte	.LLST137
+	.uleb128 0x58
+	.4byte	0x138a1
+	.uleb128 0x61
+	.4byte	0x138ab
+	.4byte	.LLST138
+	.uleb128 0x61
+	.4byte	0x138b7
+	.4byte	.LLST139
+	.uleb128 0x61
+	.4byte	0x138c3
+	.4byte	.LLST140
+	.uleb128 0x58
+	.4byte	0x138cf
+	.uleb128 0x62
+	.4byte	0x138db
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x62
+	.4byte	0x138e7
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x61
+	.4byte	0x138f3
+	.4byte	.LLST141
+	.uleb128 0x61
+	.4byte	0x138ff
+	.4byte	.LLST142
+	.uleb128 0x61
+	.4byte	0x1390b
+	.4byte	.LLST143
+	.uleb128 0x58
+	.4byte	0x13917
+	.uleb128 0x58
+	.4byte	0x13923
+	.uleb128 0x58
+	.4byte	0x1392f
+	.uleb128 0x5c
+	.4byte	0x141cd
+	.8byte	.LBB1324
+	.4byte	.Ldebug_ranges0+0x900
+	.byte	0x1
+	.2byte	0x3a8
+	.4byte	0x13663
+	.uleb128 0x55
+	.4byte	0x141f5
+	.uleb128 0x55
+	.4byte	0x141e9
+	.uleb128 0x55
+	.4byte	0x141dd
 	.byte	0
-	.uleb128 0x54
-	.4byte	0x127d6
-	.8byte	.LBB1393
-	.8byte	.LBE1393-.LBB1393
+	.uleb128 0x60
+	.4byte	0x141cd
+	.8byte	.LBB1330
+	.4byte	.Ldebug_ranges0+0x960
 	.byte	0x1
-	.2byte	0x43a
-	.4byte	0x12753
+	.2byte	0x3a9
 	.uleb128 0x55
-	.4byte	0x127ef
+	.4byte	0x141f5
 	.uleb128 0x55
-	.4byte	0x127e3
-	.uleb128 0x4f
-	.8byte	.LVL489
-	.4byte	0x1431b
+	.4byte	0x141e9
+	.uleb128 0x55
+	.4byte	0x141dd
+	.byte	0
+	.byte	0
 	.byte	0
-	.uleb128 0x4f
-	.8byte	.LVL473
-	.4byte	0x12c08
-	.uleb128 0x4f
-	.8byte	.LVL475
-	.4byte	0x12c08
-	.uleb128 0x4f
-	.8byte	.LVL478
-	.4byte	0x12d69
-	.uleb128 0x4f
-	.8byte	.LVL480
-	.4byte	0x12d69
-	.uleb128 0x4f
-	.8byte	.LVL483
-	.4byte	0x12a1e
-	.uleb128 0x4f
-	.8byte	.LVL485
-	.4byte	0x12a1e
-	.uleb128 0x4f
-	.8byte	.LVL488
-	.4byte	0x12834
-	.uleb128 0x4f
-	.8byte	.LVL490
-	.4byte	0x12834
-	.uleb128 0x4f
-	.8byte	.LVL493
-	.4byte	0x145a6
-	.uleb128 0x4f
-	.8byte	.LVL496
-	.4byte	0x145a6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3124
+	.4byte	.LASF3145
 	.byte	0x1
-	.2byte	0x3f9
+	.2byte	0x3f5
 	.byte	0x1
-	.4byte	0x127fc
+	.4byte	0x1376c
 	.uleb128 0x66
-	.4byte	.LASF3019
+	.4byte	.LASF3128
 	.byte	0x1
-	.2byte	0x3f9
-	.4byte	0xe1dc
+	.2byte	0x3f5
+	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF2975
-	.byte	0x1
-	.2byte	0x3f9
-	.4byte	0xe85c
-	.byte	0
-	.uleb128 0x67
-	.4byte	.LASF3125
-	.byte	0x1
-	.2byte	0x3ee
+	.4byte	.LASF3129
 	.byte	0x1
-	.4byte	0x1282e
+	.2byte	0x3f6
+	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3019
+	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x3ee
-	.4byte	0xe1dc
+	.2byte	0x3f6
+	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x3ee
-	.4byte	0xe85c
-	.uleb128 0x53
-	.string	"buf"
+	.2byte	0x3f7
+	.4byte	0xe874
+	.uleb128 0x48
+	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x3f0
-	.4byte	0x1282e
-	.byte	0
-	.uleb128 0x7
-	.byte	0x8
-	.4byte	0xdf66
-	.uleb128 0x67
-	.4byte	.LASF3126
+	.2byte	0x3f9
+	.4byte	0xe1f4
+	.uleb128 0x48
+	.4byte	.LASF3132
 	.byte	0x1
-	.2byte	0x3e4
+	.2byte	0x3fa
+	.4byte	0x13f
+	.uleb128 0x48
+	.4byte	.LASF3133
 	.byte	0x1
-	.4byte	0x12872
-	.uleb128 0x66
-	.4byte	.LASF3127
+	.2byte	0x3fa
+	.4byte	0x13f
+	.uleb128 0x48
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x3fb
+	.4byte	0x110
+	.uleb128 0x48
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x3fb
+	.4byte	0x110
+	.uleb128 0x48
+	.4byte	.LASF794
+	.byte	0x1
+	.2byte	0x3fb
+	.4byte	0x110
+	.uleb128 0x48
+	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x3e4
+	.2byte	0x3fc
 	.4byte	0xc138
-	.uleb128 0x66
-	.4byte	.LASF3128
+	.uleb128 0x48
+	.4byte	.LASF2915
 	.byte	0x1
-	.2byte	0x3e5
-	.4byte	0xac0
-	.uleb128 0x66
-	.4byte	.LASF3129
+	.2byte	0x3fd
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x3e5
-	.4byte	0xac0
-	.uleb128 0x66
-	.4byte	.LASF2975
+	.2byte	0x3fd
+	.4byte	0xc6
+	.uleb128 0x53
+	.string	"i"
+	.byte	0x1
+	.2byte	0x3fe
+	.4byte	0xc6
+	.uleb128 0x53
+	.string	"j"
+	.byte	0x1
+	.2byte	0x3fe
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF3137
+	.byte	0x1
+	.2byte	0x3ff
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF2871
+	.byte	0x1
+	.2byte	0x400
+	.4byte	0xc138
+	.uleb128 0x48
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x3e6
-	.4byte	0xe85c
+	.2byte	0x401
+	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3130
+	.4byte	.LASF3146
 	.byte	0x1
-	.2byte	0x3ba
+	.2byte	0x3af
 	.byte	0x1
-	.4byte	0x12948
+	.4byte	0x1384e
 	.uleb128 0x66
-	.4byte	.LASF3127
+	.4byte	.LASF3128
 	.byte	0x1
-	.2byte	0x3ba
+	.2byte	0x3af
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3128
+	.4byte	.LASF3129
 	.byte	0x1
-	.2byte	0x3bb
+	.2byte	0x3b0
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3129
+	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x3bb
+	.2byte	0x3b0
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF2975
-	.byte	0x1
-	.2byte	0x3bc
-	.4byte	0xe85c
-	.uleb128 0x48
-	.4byte	.LASF3019
+	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x3be
-	.4byte	0xe1dc
+	.2byte	0x3b1
+	.4byte	0xe874
 	.uleb128 0x48
-	.4byte	.LASF3131
+	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x3bf
-	.4byte	0x15a
+	.2byte	0x3b3
+	.4byte	0xe1f4
 	.uleb128 0x48
 	.4byte	.LASF3132
 	.byte	0x1
-	.2byte	0x3bf
-	.4byte	0x15a
+	.2byte	0x3b4
+	.4byte	0x13f
 	.uleb128 0x48
 	.4byte	.LASF3133
 	.byte	0x1
-	.2byte	0x3bf
-	.4byte	0x46f4
+	.2byte	0x3b4
+	.4byte	0x13f
 	.uleb128 0x48
 	.4byte	.LASF3134
 	.byte	0x1
-	.2byte	0x3bf
-	.4byte	0x46f4
+	.2byte	0x3b5
+	.4byte	0x110
 	.uleb128 0x48
 	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x3c0
+	.2byte	0x3b5
+	.4byte	0x110
+	.uleb128 0x48
+	.4byte	.LASF794
+	.byte	0x1
+	.2byte	0x3b5
+	.4byte	0x110
+	.uleb128 0x48
+	.4byte	.LASF3136
+	.byte	0x1
+	.2byte	0x3b6
 	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF2914
+	.4byte	.LASF2915
 	.byte	0x1
-	.2byte	0x3c1
+	.2byte	0x3b7
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x3c1
+	.2byte	0x3b7
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x3c2
+	.2byte	0x3b8
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
-	.2byte	0x3c2
+	.2byte	0x3b8
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3136
+	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x3c3
+	.2byte	0x3b9
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF2871
 	.byte	0x1
-	.2byte	0x3c4
+	.2byte	0x3ba
 	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF2960
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x3c5
+	.2byte	0x3bb
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3137
+	.4byte	.LASF3147
 	.byte	0x1
-	.2byte	0x391
+	.2byte	0x388
 	.byte	0x1
-	.4byte	0x12a1e
+	.4byte	0x1393c
 	.uleb128 0x66
-	.4byte	.LASF3127
+	.4byte	.LASF3128
 	.byte	0x1
-	.2byte	0x391
+	.2byte	0x388
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3128
+	.4byte	.LASF3129
 	.byte	0x1
-	.2byte	0x392
+	.2byte	0x389
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3129
+	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x392
+	.2byte	0x389
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF2975
+	.4byte	.LASF2976
+	.byte	0x1
+	.2byte	0x38a
+	.4byte	0xe874
+	.uleb128 0x48
+	.4byte	.LASF3020
+	.byte	0x1
+	.2byte	0x38c
+	.4byte	0xe1f4
+	.uleb128 0x53
+	.string	"i"
+	.byte	0x1
+	.2byte	0x38d
+	.4byte	0xc6
+	.uleb128 0x53
+	.string	"j"
 	.byte	0x1
-	.2byte	0x393
-	.4byte	0xe85c
+	.2byte	0x38d
+	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3019
+	.4byte	.LASF2915
 	.byte	0x1
-	.2byte	0x395
-	.4byte	0xe1dc
+	.2byte	0x38e
+	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3131
+	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x396
+	.2byte	0x38f
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x390
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3132
+	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x396
+	.2byte	0x390
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3133
+	.4byte	.LASF3132
 	.byte	0x1
-	.2byte	0x396
+	.2byte	0x390
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3134
+	.4byte	.LASF3133
 	.byte	0x1
-	.2byte	0x396
+	.2byte	0x390
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3135
+	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x397
+	.2byte	0x391
 	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF2914
+	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x398
+	.2byte	0x392
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF262
-	.byte	0x1
-	.2byte	0x398
-	.4byte	0xc6
-	.uleb128 0x53
-	.string	"i"
-	.byte	0x1
-	.2byte	0x399
-	.4byte	0xc6
-	.uleb128 0x53
-	.string	"j"
+	.4byte	.LASF2871
 	.byte	0x1
-	.2byte	0x399
-	.4byte	0xc6
+	.2byte	0x393
+	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF3136
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x39a
+	.2byte	0x394
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF2871
+	.4byte	.LASF3140
 	.byte	0x1
-	.2byte	0x39b
-	.4byte	0xc138
+	.2byte	0x395
+	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF2960
+	.4byte	.LASF3141
 	.byte	0x1
-	.2byte	0x39c
+	.2byte	0x396
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3138
-	.byte	0x1
-	.2byte	0x386
+	.4byte	.LASF3148
 	.byte	0x1
-	.4byte	0x12a5c
-	.uleb128 0x66
-	.4byte	.LASF3127
+	.2byte	0x363
 	.byte	0x1
-	.2byte	0x386
-	.4byte	0xc138
+	.4byte	0x13a12
 	.uleb128 0x66
 	.4byte	.LASF3128
 	.byte	0x1
-	.2byte	0x387
-	.4byte	0xac0
-	.uleb128 0x66
-	.4byte	.LASF3129
-	.byte	0x1
-	.2byte	0x387
-	.4byte	0xac0
-	.uleb128 0x66
-	.4byte	.LASF2975
-	.byte	0x1
-	.2byte	0x388
-	.4byte	0xe85c
-	.byte	0
-	.uleb128 0x67
-	.4byte	.LASF3139
-	.byte	0x1
-	.2byte	0x362
-	.byte	0x1
-	.4byte	0x12b32
-	.uleb128 0x66
-	.4byte	.LASF3127
-	.byte	0x1
-	.2byte	0x362
+	.2byte	0x363
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3128
+	.4byte	.LASF3129
 	.byte	0x1
-	.2byte	0x363
+	.2byte	0x364
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3129
+	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x363
+	.2byte	0x364
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
-	.2byte	0x364
-	.4byte	0xe85c
+	.2byte	0x365
+	.4byte	0xe874
 	.uleb128 0x48
-	.4byte	.LASF3019
+	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x366
-	.4byte	0xe1dc
+	.2byte	0x367
+	.4byte	0xe1f4
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x367
+	.2byte	0x368
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
-	.2byte	0x367
+	.2byte	0x368
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF2914
+	.4byte	.LASF2915
 	.byte	0x1
-	.2byte	0x368
+	.2byte	0x369
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x369
+	.2byte	0x36a
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3131
+	.4byte	.LASF3134
 	.byte	0x1
-	.2byte	0x36a
+	.2byte	0x36b
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3132
+	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x36a
+	.2byte	0x36b
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3133
+	.4byte	.LASF3132
 	.byte	0x1
-	.2byte	0x36a
+	.2byte	0x36b
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3134
+	.4byte	.LASF3133
 	.byte	0x1
-	.2byte	0x36a
+	.2byte	0x36b
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3135
+	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x36b
+	.2byte	0x36c
 	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF3136
+	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x36c
+	.2byte	0x36d
 	.4byte	0xc6
 	.uleb128 0x48
 	.4byte	.LASF2871
 	.byte	0x1
-	.2byte	0x36d
+	.2byte	0x36e
 	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF2960
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x36e
+	.2byte	0x36f
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3140
+	.4byte	.LASF3149
 	.byte	0x1
 	.2byte	0x33b
 	.byte	0x1
-	.4byte	0x12c08
+	.4byte	0x13ae8
 	.uleb128 0x66
-	.4byte	.LASF3127
+	.4byte	.LASF3128
 	.byte	0x1
 	.2byte	0x33b
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3128
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x33c
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3129
+	.4byte	.LASF3130
 	.byte	0x1
 	.2byte	0x33c
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x33d
-	.4byte	0xe85c
+	.4byte	0xe874
 	.uleb128 0x48
-	.4byte	.LASF3019
+	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x33f
-	.4byte	0xe1dc
+	.4byte	0xe1f4
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
@@ -44235,7 +46870,7 @@ __exitcall_ebc_exit:
 	.2byte	0x340
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF2914
+	.4byte	.LASF2915
 	.byte	0x1
 	.2byte	0x341
 	.4byte	0xc6
@@ -44245,32 +46880,32 @@ __exitcall_ebc_exit:
 	.2byte	0x342
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3131
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x343
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3132
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x343
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3133
+	.4byte	.LASF3132
 	.byte	0x1
 	.2byte	0x343
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3134
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x343
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3135
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x344
 	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF3136
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x345
 	.4byte	0xc6
@@ -44280,137 +46915,137 @@ __exitcall_ebc_exit:
 	.2byte	0x346
 	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF2960
+	.4byte	.LASF2961
 	.byte	0x1
 	.2byte	0x347
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3141
+	.4byte	.LASF3150
 	.byte	0x1
 	.2byte	0x26d
-	.8byte	.LFB2813
-	.8byte	.LFE2813-.LFB2813
+	.8byte	.LFB2814
+	.8byte	.LFE2814-.LFB2814
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12d69
+	.4byte	0x13c4f
 	.uleb128 0x75
-	.4byte	.LASF3127
+	.4byte	.LASF3128
 	.byte	0x1
 	.2byte	0x26d
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x75
-	.4byte	.LASF3128
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x26d
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x75
-	.4byte	.LASF3129
+	.4byte	.LASF3130
 	.byte	0x1
 	.2byte	0x26d
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x75
-	.4byte	.LASF3142
+	.4byte	.LASF3151
 	.byte	0x1
 	.2byte	0x26e
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x75
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x26e
-	.4byte	0xe85c
+	.4byte	0xe874
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x48
-	.4byte	.LASF3019
+	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x270
-	.4byte	0xe1dc
-	.uleb128 0x6a
+	.4byte	0xe1f4
+	.uleb128 0x5b
 	.string	"i"
 	.byte	0x1
 	.2byte	0x271
 	.4byte	0xc6
-	.uleb128 0x1
-	.byte	0x5d
+	.4byte	.LLST6
 	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
 	.2byte	0x272
 	.4byte	0xc6
 	.uleb128 0x4d
-	.4byte	.LASF2914
+	.4byte	.LASF2915
 	.byte	0x1
 	.2byte	0x273
 	.4byte	0xc6
 	.uleb128 0x1
-	.byte	0x62
-	.uleb128 0x4d
+	.byte	0x61
+	.uleb128 0x5a
 	.4byte	.LASF262
 	.byte	0x1
 	.2byte	0x274
 	.4byte	0xc6
-	.uleb128 0x1
-	.byte	0x5b
+	.4byte	.LLST7
 	.uleb128 0x5a
-	.4byte	.LASF3131
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x275
 	.4byte	0x13f
-	.4byte	.LLST6
+	.4byte	.LLST8
 	.uleb128 0x5a
-	.4byte	.LASF3132
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x275
 	.4byte	0x13f
-	.4byte	.LLST7
+	.4byte	.LLST9
 	.uleb128 0x48
-	.4byte	.LASF3143
+	.4byte	.LASF3152
 	.byte	0x1
 	.2byte	0x275
 	.4byte	0x13f
 	.uleb128 0x4d
-	.4byte	.LASF3133
+	.4byte	.LASF3132
 	.byte	0x1
 	.2byte	0x276
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4d
-	.4byte	.LASF3134
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x276
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5a
-	.4byte	.LASF3135
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x277
 	.4byte	0xc138
-	.4byte	.LLST8
-	.uleb128 0x48
-	.4byte	.LASF2984
+	.4byte	.LLST10
+	.uleb128 0x4d
+	.4byte	.LASF2985
 	.byte	0x1
 	.2byte	0x278
 	.4byte	0x110
+	.uleb128 0x1
+	.byte	0x5b
 	.uleb128 0x4d
-	.4byte	.LASF3144
+	.4byte	.LASF3153
 	.byte	0x1
 	.2byte	0x279
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x48
-	.4byte	.LASF3145
+	.4byte	.LASF3154
 	.byte	0x1
 	.2byte	0x27a
 	.4byte	0x110
@@ -44420,76 +47055,76 @@ __exitcall_ebc_exit:
 	.2byte	0x27b
 	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF2960
+	.4byte	.LASF2961
 	.byte	0x1
 	.2byte	0x27c
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3146
+	.4byte	.LASF3155
 	.byte	0x1
 	.2byte	0x27d
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3147
+	.4byte	.LASF3156
 	.byte	0x1
 	.2byte	0x27d
 	.4byte	0x110
 	.uleb128 0x5a
-	.4byte	.LASF3148
+	.4byte	.LASF3157
 	.byte	0x1
 	.2byte	0x27e
 	.4byte	0x13f
-	.4byte	.LLST9
+	.4byte	.LLST11
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3149
+	.4byte	.LASF3158
 	.byte	0x1
 	.2byte	0x1c8
-	.8byte	.LFB2812
-	.8byte	.LFE2812-.LFB2812
+	.8byte	.LFB2813
+	.8byte	.LFE2813-.LFB2813
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12ec4
+	.4byte	0x13daa
 	.uleb128 0x75
-	.4byte	.LASF3127
+	.4byte	.LASF3128
 	.byte	0x1
 	.2byte	0x1c8
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x75
-	.4byte	.LASF3128
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x1c8
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x75
-	.4byte	.LASF3129
+	.4byte	.LASF3130
 	.byte	0x1
 	.2byte	0x1c8
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x75
-	.4byte	.LASF3142
+	.4byte	.LASF3151
 	.byte	0x1
 	.2byte	0x1c9
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x75
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x1c9
-	.4byte	0xe85c
+	.4byte	0xe874
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x48
-	.4byte	.LASF3019
+	.4byte	.LASF3020
 	.byte	0x1
 	.2byte	0x1cb
-	.4byte	0xe1dc
+	.4byte	0xe1f4
 	.uleb128 0x5b
 	.string	"i"
 	.byte	0x1
@@ -44502,7 +47137,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1cd
 	.4byte	0xc6
 	.uleb128 0x4d
-	.4byte	.LASF2914
+	.4byte	.LASF2915
 	.byte	0x1
 	.2byte	0x1ce
 	.4byte	0xc6
@@ -44515,53 +47150,53 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.4byte	.LLST1
 	.uleb128 0x5a
-	.4byte	.LASF3131
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x1d0
 	.4byte	0x13f
 	.4byte	.LLST2
 	.uleb128 0x5a
-	.4byte	.LASF3132
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x1d0
 	.4byte	0x13f
 	.4byte	.LLST3
 	.uleb128 0x4d
-	.4byte	.LASF3133
+	.4byte	.LASF3132
 	.byte	0x1
 	.2byte	0x1d1
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4d
-	.4byte	.LASF3134
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x1d1
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5a
-	.4byte	.LASF3135
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x1d2
 	.4byte	0xc138
 	.4byte	.LLST4
 	.uleb128 0x4d
-	.4byte	.LASF2984
+	.4byte	.LASF2985
 	.byte	0x1
 	.2byte	0x1d3
 	.4byte	0x110
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x4d
-	.4byte	.LASF3144
+	.4byte	.LASF3153
 	.byte	0x1
 	.2byte	0x1d4
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x48
-	.4byte	.LASF3145
+	.4byte	.LASF3154
 	.byte	0x1
 	.2byte	0x1d5
 	.4byte	0x110
@@ -44571,65 +47206,65 @@ __exitcall_ebc_exit:
 	.2byte	0x1d6
 	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF2960
+	.4byte	.LASF2961
 	.byte	0x1
 	.2byte	0x1d7
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3146
+	.4byte	.LASF3155
 	.byte	0x1
 	.2byte	0x1d8
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3147
+	.4byte	.LASF3156
 	.byte	0x1
 	.2byte	0x1d8
 	.4byte	0x110
 	.uleb128 0x5a
-	.4byte	.LASF3148
+	.4byte	.LASF3157
 	.byte	0x1
 	.2byte	0x1d9
 	.4byte	0x13f
 	.4byte	.LLST5
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3150
+	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x169
 	.byte	0x1
-	.4byte	0x12fe2
+	.4byte	0x13ec8
 	.uleb128 0x66
-	.4byte	.LASF3151
+	.4byte	.LASF3160
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3152
+	.4byte	.LASF3161
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3153
+	.4byte	.LASF3162
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3142
+	.4byte	.LASF3151
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0x46f4
 	.uleb128 0x66
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x16a
-	.4byte	0xe85c
+	.4byte	0xe874
 	.uleb128 0x66
 	.4byte	.LASF2882
 	.byte	0x1
 	.2byte	0x16a
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF2914
+	.4byte	.LASF2915
 	.byte	0x1
 	.2byte	0x16c
 	.4byte	0xc6
@@ -44639,47 +47274,47 @@ __exitcall_ebc_exit:
 	.2byte	0x16c
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3154
+	.4byte	.LASF3163
 	.byte	0x1
 	.2byte	0x16d
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3155
+	.4byte	.LASF3164
 	.byte	0x1
 	.2byte	0x16d
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3156
+	.4byte	.LASF3165
 	.byte	0x1
 	.2byte	0x16d
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3157
+	.4byte	.LASF3166
 	.byte	0x1
 	.2byte	0x16e
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3158
+	.4byte	.LASF3167
 	.byte	0x1
 	.2byte	0x16e
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3159
+	.4byte	.LASF3168
 	.byte	0x1
 	.2byte	0x16e
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3145
+	.4byte	.LASF3154
 	.byte	0x1
 	.2byte	0x16f
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3144
+	.4byte	.LASF3153
 	.byte	0x1
 	.2byte	0x170
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3160
+	.4byte	.LASF3169
 	.byte	0x1
 	.2byte	0x171
 	.4byte	0x13f
@@ -44715,86 +47350,86 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x76
-	.4byte	.LASF3161
+	.4byte	.LASF3170
 	.byte	0x1
 	.2byte	0x152
-	.8byte	.LFB2810
-	.8byte	.LFE2810-.LFB2810
+	.8byte	.LFB2811
+	.8byte	.LFE2811-.LFB2811
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13072
+	.4byte	0x13f58
 	.uleb128 0x59
 	.4byte	.LASF2288
 	.byte	0x1
 	.2byte	0x152
 	.4byte	0x3205
-	.4byte	.LLST189
+	.4byte	.LLST234
 	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x154
-	.4byte	0xe53f
-	.4byte	.LLST190
+	.4byte	0xe557
+	.4byte	.LLST235
 	.uleb128 0x5a
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x155
-	.4byte	0xe85c
-	.4byte	.LLST191
+	.4byte	0xe874
+	.4byte	.LLST236
 	.uleb128 0x4f
-	.8byte	.LVL761
-	.4byte	0x14849
+	.8byte	.LVL840
+	.4byte	0x15264
 	.uleb128 0x4f
-	.8byte	.LVL763
-	.4byte	0x13139
+	.8byte	.LVL842
+	.4byte	0x1401f
 	.uleb128 0x4f
-	.8byte	.LVL764
-	.4byte	0x14861
+	.8byte	.LVL843
+	.4byte	0x15270
 	.uleb128 0x4f
-	.8byte	.LVL767
-	.4byte	0x13072
+	.8byte	.LVL846
+	.4byte	0x13f58
 	.uleb128 0x4f
-	.8byte	.LVL768
-	.4byte	0x14861
+	.8byte	.LVL847
+	.4byte	0x15270
 	.byte	0
 	.uleb128 0x76
-	.4byte	.LASF3162
+	.4byte	.LASF3171
 	.byte	0x1
 	.2byte	0x121
-	.8byte	.LFB2809
-	.8byte	.LFE2809-.LFB2809
+	.8byte	.LFB2810
+	.8byte	.LFE2810-.LFB2810
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13139
+	.4byte	0x1401f
 	.uleb128 0x75
-	.4byte	.LASF3151
+	.4byte	.LASF3160
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x75
-	.4byte	.LASF3152
+	.4byte	.LASF3161
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x75
-	.4byte	.LASF3142
+	.4byte	.LASF3151
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0x46f4
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x59
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
 	.2byte	0x122
-	.4byte	0xe85c
-	.4byte	.LLST185
+	.4byte	0xe874
+	.4byte	.LLST230
 	.uleb128 0x4d
-	.4byte	.LASF2914
+	.4byte	.LASF2915
 	.byte	0x1
 	.2byte	0x124
 	.4byte	0xc6
@@ -44808,22 +47443,22 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x59
 	.uleb128 0x48
-	.4byte	.LASF3154
+	.4byte	.LASF3163
 	.byte	0x1
 	.2byte	0x125
 	.4byte	0x13f
 	.uleb128 0x5a
-	.4byte	.LASF3155
+	.4byte	.LASF3164
 	.byte	0x1
 	.2byte	0x125
 	.4byte	0x13f
-	.4byte	.LLST186
+	.4byte	.LLST231
 	.uleb128 0x5a
-	.4byte	.LASF3145
+	.4byte	.LASF3154
 	.byte	0x1
 	.2byte	0x126
 	.4byte	0x15a
-	.4byte	.LLST187
+	.4byte	.LLST232
 	.uleb128 0x6a
 	.string	"i"
 	.byte	0x1
@@ -44837,63 +47472,63 @@ __exitcall_ebc_exit:
 	.2byte	0x127
 	.4byte	0xc6
 	.uleb128 0x5a
-	.4byte	.LASF3160
+	.4byte	.LASF3169
 	.byte	0x1
 	.2byte	0x128
 	.4byte	0x13f
-	.4byte	.LLST188
+	.4byte	.LLST233
 	.byte	0
 	.uleb128 0x77
-	.4byte	.LASF3163
+	.4byte	.LASF3172
 	.byte	0x1
 	.byte	0xd6
-	.8byte	.LFB2808
-	.8byte	.LFE2808-.LFB2808
+	.8byte	.LFB2809
+	.8byte	.LFE2809-.LFB2809
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1321e
+	.4byte	0x14104
 	.uleb128 0x78
-	.4byte	.LASF3151
+	.4byte	.LASF3160
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x78
-	.4byte	.LASF3152
+	.4byte	.LASF3161
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x78
-	.4byte	.LASF3153
+	.4byte	.LASF3162
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x78
-	.4byte	.LASF3142
+	.4byte	.LASF3151
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0x46f4
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x79
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
 	.byte	0xd7
-	.4byte	0xe85c
-	.4byte	.LLST179
+	.4byte	0xe874
+	.4byte	.LLST224
 	.uleb128 0x79
 	.4byte	.LASF2882
 	.byte	0x1
 	.byte	0xd7
 	.4byte	0xc6
-	.4byte	.LLST180
+	.4byte	.LLST225
 	.uleb128 0x4c
-	.4byte	.LASF2914
+	.4byte	.LASF2915
 	.byte	0x1
 	.byte	0xd9
 	.4byte	0xc6
@@ -44907,28 +47542,28 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x7a
-	.4byte	.LASF3154
+	.4byte	.LASF3163
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x13f
 	.uleb128 0x7b
-	.4byte	.LASF3155
+	.4byte	.LASF3164
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x13f
-	.4byte	.LLST181
+	.4byte	.LLST226
 	.uleb128 0x7b
-	.4byte	.LASF3156
+	.4byte	.LASF3165
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x13f
-	.4byte	.LLST182
+	.4byte	.LLST227
 	.uleb128 0x7b
-	.4byte	.LASF3145
+	.4byte	.LASF3154
 	.byte	0x1
 	.byte	0xdb
 	.4byte	0x15a
-	.4byte	.LLST183
+	.4byte	.LLST228
 	.uleb128 0x7c
 	.string	"i"
 	.byte	0x1
@@ -44942,198 +47577,254 @@ __exitcall_ebc_exit:
 	.byte	0xdc
 	.4byte	0xc6
 	.uleb128 0x7b
-	.4byte	.LASF3160
+	.4byte	.LASF3169
 	.byte	0x1
 	.byte	0xdd
 	.4byte	0x13f
-	.4byte	.LLST184
+	.4byte	.LLST229
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3164
+	.4byte	.LASF3173
 	.byte	0x1
 	.byte	0xb7
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x13251
+	.4byte	0x14137
 	.uleb128 0x7f
 	.string	"ebc"
 	.byte	0x1
 	.byte	0xb7
-	.4byte	0xe53f
+	.4byte	0xe557
 	.uleb128 0x80
-	.4byte	.LASF3165
+	.4byte	.LASF3174
 	.byte	0x1
 	.byte	0xb7
 	.4byte	0xc6
 	.uleb128 0x7a
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
 	.byte	0xb9
-	.4byte	0xe85c
+	.4byte	0xe874
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3166
+	.4byte	.LASF3175
 	.byte	0x1
-	.byte	0x89
+	.byte	0xa5
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x1329c
+	.4byte	0x14182
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
-	.byte	0x89
+	.byte	0xa5
 	.4byte	0xc138
 	.uleb128 0x80
-	.4byte	.LASF3131
+	.4byte	.LASF3134
 	.byte	0x1
-	.byte	0x89
+	.byte	0xa5
 	.4byte	0x11f
 	.uleb128 0x80
-	.4byte	.LASF3132
+	.4byte	.LASF3135
 	.byte	0x1
-	.byte	0x89
+	.byte	0xa5
 	.4byte	0x11f
 	.uleb128 0x7a
-	.4byte	.LASF3167
+	.4byte	.LASF3176
 	.byte	0x1
-	.byte	0x8b
+	.byte	0xa7
 	.4byte	0x110
 	.uleb128 0x7a
-	.4byte	.LASF3148
+	.4byte	.LASF3157
 	.byte	0x1
-	.byte	0x8c
+	.byte	0xa8
 	.4byte	0x11f
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3168
+	.4byte	.LASF3177
+	.byte	0x1
+	.byte	0x8f
+	.4byte	0x110
+	.byte	0x3
+	.4byte	0x141cd
+	.uleb128 0x80
+	.4byte	.LASF2871
+	.byte	0x1
+	.byte	0x8f
+	.4byte	0xc138
+	.uleb128 0x80
+	.4byte	.LASF3134
+	.byte	0x1
+	.byte	0x8f
+	.4byte	0x11f
+	.uleb128 0x80
+	.4byte	.LASF3135
+	.byte	0x1
+	.byte	0x8f
+	.4byte	0x11f
+	.uleb128 0x7a
+	.4byte	.LASF3176
+	.byte	0x1
+	.byte	0x91
+	.4byte	0x110
+	.uleb128 0x7a
+	.4byte	.LASF3157
+	.byte	0x1
+	.byte	0x92
+	.4byte	0x11f
+	.byte	0
+	.uleb128 0x7e
+	.4byte	.LASF3178
+	.byte	0x1
+	.byte	0x89
+	.4byte	0x110
+	.byte	0x3
+	.4byte	0x14202
+	.uleb128 0x80
+	.4byte	.LASF2871
+	.byte	0x1
+	.byte	0x89
+	.4byte	0xc138
+	.uleb128 0x80
+	.4byte	.LASF3134
+	.byte	0x1
+	.byte	0x89
+	.4byte	0x11f
+	.uleb128 0x80
+	.4byte	.LASF3135
+	.byte	0x1
+	.byte	0x89
+	.4byte	0x11f
+	.byte	0
+	.uleb128 0x7e
+	.4byte	.LASF3179
 	.byte	0x1
 	.byte	0x83
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x132d1
+	.4byte	0x14237
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
 	.byte	0x83
 	.4byte	0xc138
 	.uleb128 0x80
-	.4byte	.LASF3131
+	.4byte	.LASF3134
 	.byte	0x1
 	.byte	0x83
 	.4byte	0x11f
 	.uleb128 0x80
-	.4byte	.LASF3132
+	.4byte	.LASF3135
 	.byte	0x1
 	.byte	0x83
 	.4byte	0x11f
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3169
+	.4byte	.LASF3180
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x132f7
+	.4byte	0x1425d
 	.uleb128 0x80
-	.4byte	.LASF2950
+	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x4b
-	.4byte	0xe19c
+	.4byte	0xe1b4
 	.uleb128 0x80
-	.4byte	.LASF2984
+	.4byte	.LASF2985
 	.byte	0xb
 	.byte	0x4b
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3170
+	.4byte	.LASF3181
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x13329
+	.4byte	0x1428f
 	.uleb128 0x80
-	.4byte	.LASF2950
+	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x3c
-	.4byte	0xe19c
+	.4byte	0xe1b4
 	.uleb128 0x80
-	.4byte	.LASF3171
+	.4byte	.LASF3182
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13f
 	.uleb128 0x80
-	.4byte	.LASF3172
+	.4byte	.LASF3183
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3173
+	.4byte	.LASF3184
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x13373
+	.4byte	0x142d9
 	.uleb128 0x80
-	.4byte	.LASF2950
+	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x36
-	.4byte	0xe19c
+	.4byte	0xe1b4
 	.uleb128 0x80
-	.4byte	.LASF3174
+	.4byte	.LASF3185
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xc6
 	.uleb128 0x80
-	.4byte	.LASF3175
+	.4byte	.LASF3186
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x80
-	.4byte	.LASF3176
+	.4byte	.LASF3187
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x80
-	.4byte	.LASF3177
+	.4byte	.LASF3188
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3178
+	.4byte	.LASF3189
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x1338d
+	.4byte	0x142f3
 	.uleb128 0x80
-	.4byte	.LASF2950
+	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x31
-	.4byte	0xe19c
+	.4byte	0xe1b4
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3179
+	.4byte	.LASF3190
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x133b6
+	.4byte	0x1431c
 	.uleb128 0x80
-	.4byte	.LASF2950
+	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x2c
-	.4byte	0xe19c
+	.4byte	0xe1b4
 	.uleb128 0x80
-	.4byte	.LASF3019
+	.4byte	.LASF3020
 	.byte	0xb
 	.byte	0x2c
-	.4byte	0xe1dc
+	.4byte	0xe1f4
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3180
+	.4byte	.LASF3191
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x13400
+	.4byte	0x14366
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
@@ -45153,7 +47844,7 @@ __exitcall_ebc_exit:
 	.string	"dir"
 	.byte	0xa
 	.2byte	0x1ad
-	.4byte	0xdc02
+	.4byte	0xdc1a
 	.uleb128 0x53
 	.string	"ops"
 	.byte	0xa
@@ -45161,12 +47852,12 @@ __exitcall_ebc_exit:
 	.4byte	0xb829
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3181
+	.4byte	.LASF3192
 	.byte	0xa
 	.2byte	0x108
 	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x1341e
+	.4byte	0x14384
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
@@ -45174,12 +47865,12 @@ __exitcall_ebc_exit:
 	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3182
+	.4byte	.LASF3193
 	.byte	0xc8
 	.byte	0x1d
 	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x1343a
+	.4byte	0x143a0
 	.uleb128 0x7f
 	.string	"bus"
 	.byte	0xc8
@@ -45187,31 +47878,31 @@ __exitcall_ebc_exit:
 	.4byte	0xae47
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3183
+	.4byte	.LASF3194
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13457
+	.4byte	0x143bd
 	.uleb128 0x80
-	.4byte	.LASF3184
+	.4byte	.LASF3195
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3185
+	.4byte	.LASF3196
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x13494
+	.4byte	0x143fa
 	.uleb128 0x7f
 	.string	"dev"
 	.byte	0xcb
 	.byte	0xa3
 	.4byte	0xa5e0
 	.uleb128 0x80
-	.4byte	.LASF3186
+	.4byte	.LASF3197
 	.byte	0xcb
 	.byte	0xa4
 	.4byte	0x325
@@ -45221,36 +47912,36 @@ __exitcall_ebc_exit:
 	.byte	0xa5
 	.4byte	0x2e3
 	.uleb128 0x80
-	.4byte	.LASF3187
+	.4byte	.LASF3198
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3188
+	.4byte	.LASF3199
 	.byte	0x3
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x134b1
+	.4byte	0x14417
 	.uleb128 0x80
-	.4byte	.LASF2951
+	.4byte	.LASF2952
 	.byte	0x3
 	.byte	0x35
-	.4byte	0xdb9c
+	.4byte	0xdbb4
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3189
+	.4byte	.LASF3200
 	.byte	0x3
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x134d7
+	.4byte	0x1443d
 	.uleb128 0x80
-	.4byte	.LASF2951
+	.4byte	.LASF2952
 	.byte	0x3
 	.byte	0x30
-	.4byte	0xdb9c
+	.4byte	0xdbb4
 	.uleb128 0x7f
 	.string	"t"
 	.byte	0x3
@@ -45258,64 +47949,64 @@ __exitcall_ebc_exit:
 	.4byte	0x46ee
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3190
+	.4byte	.LASF3201
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x134f1
+	.4byte	0x14457
 	.uleb128 0x80
-	.4byte	.LASF2951
+	.4byte	.LASF2952
 	.byte	0x3
 	.byte	0x2b
-	.4byte	0xdb9c
+	.4byte	0xdbb4
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3191
+	.4byte	.LASF3202
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x1350b
+	.4byte	0x14471
 	.uleb128 0x80
-	.4byte	.LASF2951
+	.4byte	.LASF2952
 	.byte	0x3
 	.byte	0x26
-	.4byte	0xdb9c
+	.4byte	0xdbb4
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3192
+	.4byte	.LASF3203
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x13525
+	.4byte	0x1448b
 	.uleb128 0x80
-	.4byte	.LASF2951
+	.4byte	.LASF2952
 	.byte	0x3
 	.byte	0x21
-	.4byte	0xdb9c
+	.4byte	0xdbb4
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3193
+	.4byte	.LASF3204
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x1353f
+	.4byte	0x144a5
 	.uleb128 0x80
-	.4byte	.LASF2951
+	.4byte	.LASF2952
 	.byte	0x3
 	.byte	0x1c
-	.4byte	0xdb9c
+	.4byte	0xdbb4
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3194
+	.4byte	.LASF3205
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x13559
+	.4byte	0x144bf
 	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x13559
+	.4byte	0x144bf
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -45325,24 +48016,24 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x13579
+	.4byte	0x144df
 	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x13559
+	.4byte	0x144bf
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3195
+	.4byte	.LASF3206
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x135b5
+	.4byte	0x1451b
 	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x13559
+	.4byte	0x144bf
 	.uleb128 0x80
 	.4byte	.LASF193
 	.byte	0x4
@@ -45360,12 +48051,12 @@ __exitcall_ebc_exit:
 	.4byte	0xad7d
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3196
+	.4byte	.LASF3207
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x135e5
+	.4byte	0x1454b
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -45383,12 +48074,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3197
+	.4byte	.LASF3208
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13615
+	.4byte	0x1457b
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -45406,12 +48097,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3198
+	.4byte	.LASF3209
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13645
+	.4byte	0x145ab
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -45429,12 +48120,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3199
+	.4byte	.LASF3210
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13680
+	.4byte	0x145e6
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -45457,37 +48148,37 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3200
+	.4byte	.LASF3211
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x136b4
+	.4byte	0x1461a
 	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x30bc
 	.uleb128 0x7a
-	.4byte	.LASF3201
+	.4byte	.LASF3212
 	.byte	0x6
 	.byte	0xf7
 	.4byte	0x458
 	.uleb128 0x68
 	.uleb128 0x7a
-	.4byte	.LASF3202
+	.4byte	.LASF3213
 	.byte	0x6
 	.byte	0xfe
 	.4byte	0x15a
 	.byte	0
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3203
+	.4byte	.LASF3214
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13700
+	.4byte	0x14666
 	.uleb128 0x80
 	.4byte	.LASF1164
 	.byte	0x6
@@ -45504,25 +48195,25 @@ __exitcall_ebc_exit:
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x7a
-	.4byte	.LASF3204
+	.4byte	.LASF3215
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x68
 	.uleb128 0x7a
-	.4byte	.LASF3202
+	.4byte	.LASF3213
 	.byte	0x6
 	.byte	0x56
 	.4byte	0x15a
 	.byte	0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3205
+	.4byte	.LASF3216
 	.byte	0x12
 	.2byte	0x2e5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x1372a
+	.4byte	0x14690
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x12
@@ -45535,12 +48226,12 @@ __exitcall_ebc_exit:
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3206
+	.4byte	.LASF3217
 	.byte	0x12
 	.2byte	0x216
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x13762
+	.4byte	0x146c8
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x12
@@ -45560,12 +48251,12 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3207
+	.4byte	.LASF3218
 	.byte	0x12
 	.2byte	0x1dd
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x13798
+	.4byte	0x146fe
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x12
@@ -45577,18 +48268,18 @@ __exitcall_ebc_exit:
 	.2byte	0x1dd
 	.4byte	0x330
 	.uleb128 0x48
-	.4byte	.LASF3208
+	.4byte	.LASF3219
 	.byte	0x12
 	.2byte	0x1df
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3209
+	.4byte	.LASF3220
 	.byte	0x12
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x137b6
+	.4byte	0x1471c
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x12
@@ -45596,12 +48287,12 @@ __exitcall_ebc_exit:
 	.4byte	0x2e3
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3210
+	.4byte	.LASF3221
 	.byte	0x12
 	.2byte	0x13d
 	.4byte	0xd813
 	.byte	0x3
-	.4byte	0x137d4
+	.4byte	0x1473a
 	.uleb128 0x66
 	.4byte	.LASF171
 	.byte	0x12
@@ -45609,13 +48300,13 @@ __exitcall_ebc_exit:
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3211
+	.4byte	.LASF3222
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x137fa
+	.4byte	0x14760
 	.uleb128 0x80
-	.4byte	.LASF3051
+	.4byte	.LASF3052
 	.byte	0xbe
 	.byte	0xdb
 	.4byte	0xd78a
@@ -45626,79 +48317,79 @@ __exitcall_ebc_exit:
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3212
+	.4byte	.LASF3223
 	.byte	0xbe
 	.byte	0xd6
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x13817
+	.4byte	0x1477d
 	.uleb128 0x80
-	.4byte	.LASF3051
+	.4byte	.LASF3052
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x13817
+	.4byte	0x1477d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xd6e2
 	.uleb128 0x64
-	.4byte	.LASF3213
+	.4byte	.LASF3224
 	.byte	0xa3
 	.2byte	0x164
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x1383b
+	.4byte	0x147a1
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x1383b
+	.4byte	0x147a1
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc133
 	.uleb128 0x64
-	.4byte	.LASF3214
+	.4byte	.LASF3225
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13876
+	.4byte	0x147dc
 	.uleb128 0x65
 	.string	"np"
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xbd2a
 	.uleb128 0x66
-	.4byte	.LASF3215
+	.4byte	.LASF3226
 	.byte	0xe
 	.2byte	0x499
 	.4byte	0x56
 	.uleb128 0x66
-	.4byte	.LASF3216
+	.4byte	.LASF3227
 	.byte	0xe
 	.2byte	0x49a
 	.4byte	0xac0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3217
+	.4byte	.LASF3228
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x138c2
+	.4byte	0x14828
 	.uleb128 0x65
 	.string	"np"
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xbd2a
 	.uleb128 0x66
-	.4byte	.LASF3215
+	.4byte	.LASF3226
 	.byte	0xe
 	.2byte	0x1f0
 	.4byte	0x56
 	.uleb128 0x66
-	.4byte	.LASF3218
+	.4byte	.LASF3229
 	.byte	0xe
 	.2byte	0x1f1
 	.4byte	0xac0
@@ -45714,11 +48405,11 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3219
+	.4byte	.LASF3230
 	.byte	0xe
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x138dc
+	.4byte	0x14842
 	.uleb128 0x80
 	.4byte	.LASF882
 	.byte	0xe
@@ -45726,11 +48417,11 @@ __exitcall_ebc_exit:
 	.4byte	0xb904
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3220
+	.4byte	.LASF3231
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x13902
+	.4byte	0x14868
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -45743,12 +48434,12 @@ __exitcall_ebc_exit:
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3221
+	.4byte	.LASF3232
 	.byte	0x2
 	.2byte	0x49b
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x13920
+	.4byte	0x14886
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -45756,12 +48447,12 @@ __exitcall_ebc_exit:
 	.4byte	0xbb9a
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3222
+	.4byte	.LASF3233
 	.byte	0x2
 	.2byte	0x2c5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x13956
+	.4byte	0x148bc
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -45779,12 +48470,12 @@ __exitcall_ebc_exit:
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3223
+	.4byte	.LASF3234
 	.byte	0xf
 	.byte	0xca
 	.4byte	0x351
 	.byte	0x3
-	.4byte	0x13972
+	.4byte	0x148d8
 	.uleb128 0x7f
 	.string	"res"
 	.byte	0xf
@@ -45792,12 +48483,12 @@ __exitcall_ebc_exit:
 	.4byte	0xc244
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3224
+	.4byte	.LASF3235
 	.byte	0xcc
 	.byte	0x22
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x1398e
+	.4byte	0x148f4
 	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0xcc
@@ -45805,12 +48496,12 @@ __exitcall_ebc_exit:
 	.4byte	0x30bc
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3225
+	.4byte	.LASF3236
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x139ab
+	.4byte	0x14911
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xcd
@@ -45818,12 +48509,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3226
+	.4byte	.LASF3237
 	.byte	0xd
 	.2byte	0x203
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x139d4
+	.4byte	0x1493a
 	.uleb128 0x65
 	.string	"wq"
 	.byte	0xd
@@ -45836,29 +48527,29 @@ __exitcall_ebc_exit:
 	.4byte	0x3205
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3227
+	.4byte	.LASF3238
 	.byte	0xd
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x139fa
+	.4byte	0x14960
 	.uleb128 0x80
 	.4byte	.LASF2288
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0x3205
 	.uleb128 0x80
-	.4byte	.LASF3228
+	.4byte	.LASF3239
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3229
+	.4byte	.LASF3240
 	.byte	0x51
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13a16
+	.4byte	0x1497c
 	.uleb128 0x65
 	.string	"m"
 	.byte	0x51
@@ -45866,12 +48557,12 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3230
+	.4byte	.LASF3241
 	.byte	0x51
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13a32
+	.4byte	0x14998
 	.uleb128 0x65
 	.string	"m"
 	.byte	0x51
@@ -45879,24 +48570,24 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3231
+	.4byte	.LASF3242
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x13a71
+	.4byte	0x149d7
 	.uleb128 0x80
 	.4byte	.LASF1164
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x30bc
 	.uleb128 0x80
-	.4byte	.LASF3232
+	.4byte	.LASF3243
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2e3
 	.uleb128 0x80
-	.4byte	.LASF3233
+	.4byte	.LASF3244
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2b0
@@ -45907,11 +48598,11 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3234
+	.4byte	.LASF3245
 	.byte	0xca
 	.byte	0x91
 	.byte	0x3
-	.4byte	0x13aa4
+	.4byte	0x14a0a
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xca
@@ -45924,18 +48615,18 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.uleb128 0x68
 	.uleb128 0x7a
-	.4byte	.LASF3235
+	.4byte	.LASF3246
 	.byte	0xca
 	.byte	0x93
 	.4byte	0xc6
 	.byte	0
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3236
+	.4byte	.LASF3247
 	.byte	0xca
 	.byte	0x80
 	.byte	0x3
-	.4byte	0x13ad2
+	.4byte	0x14a38
 	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0xca
@@ -45947,25 +48638,25 @@ __exitcall_ebc_exit:
 	.byte	0x80
 	.4byte	0x29
 	.uleb128 0x80
-	.4byte	.LASF3237
+	.4byte	.LASF3248
 	.byte	0xca
 	.byte	0x81
 	.4byte	0x2b0
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3238
+	.4byte	.LASF3249
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13af9
+	.4byte	0x14a5f
 	.uleb128 0x7f
 	.string	"ti"
 	.byte	0xca
 	.byte	0x5f
-	.4byte	0x13af9
+	.4byte	0x14a5f
 	.uleb128 0x80
-	.4byte	.LASF3239
+	.4byte	.LASF3250
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
@@ -45974,24 +48665,24 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.4byte	0xc33
 	.uleb128 0x7e
-	.4byte	.LASF3240
+	.4byte	.LASF3251
 	.byte	0x5
 	.byte	0xf
 	.4byte	0x2f05
 	.byte	0x3
-	.4byte	0x13b1b
+	.4byte	0x14a81
 	.uleb128 0x7a
-	.4byte	.LASF3241
+	.4byte	.LASF3252
 	.byte	0x5
 	.byte	0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3242
+	.4byte	.LASF3253
 	.byte	0x10
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x13b61
+	.4byte	0x14ac7
 	.uleb128 0x80
 	.4byte	.LASF976
 	.byte	0x10
@@ -46002,9 +48693,9 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x13b54
+	.4byte	0x14aba
 	.uleb128 0x22
-	.4byte	.LASF3122
+	.4byte	.LASF3123
 	.byte	0x10
 	.byte	0x1c
 	.4byte	0x3cc
@@ -46012,27 +48703,27 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x1261a
+	.4byte	0x12568
 	.byte	0
 	.uleb128 0x7d
 	.string	"__u"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x13b35
+	.4byte	0x14a9b
 	.byte	0
 	.byte	0
 	.uleb128 0x82
-	.4byte	.LASF3323
+	.4byte	.LASF3334
 	.byte	0x20
 	.2byte	0x126
 	.byte	0x3
 	.uleb128 0x7e
-	.4byte	.LASF3243
+	.4byte	.LASF3254
 	.byte	0xce
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13b85
+	.4byte	0x14aeb
 	.uleb128 0x7f
 	.string	"n"
 	.byte	0xce
@@ -46040,12 +48731,12 @@ __exitcall_ebc_exit:
 	.4byte	0x15a
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3244
+	.4byte	.LASF3255
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xe2
 	.byte	0x3
-	.4byte	0x13bb9
+	.4byte	0x14b1f
 	.uleb128 0x80
 	.4byte	.LASF2470
 	.byte	0x8
@@ -46063,12 +48754,12 @@ __exitcall_ebc_exit:
 	.4byte	0x8b
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3245
+	.4byte	.LASF3256
 	.byte	0xcf
 	.byte	0x50
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x13bd3
+	.4byte	0x14b39
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xcf
@@ -46076,28 +48767,28 @@ __exitcall_ebc_exit:
 	.4byte	0xbd30
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3246
+	.4byte	.LASF3257
 	.byte	0xd0
 	.byte	0xb8
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x13bed
+	.4byte	0x14b53
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd0
 	.byte	0xb8
-	.4byte	0x13bed
+	.4byte	0x14b53
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xdd
 	.uleb128 0x7e
-	.4byte	.LASF3247
+	.4byte	.LASF3258
 	.byte	0xd0
 	.byte	0x39
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x13c0f
+	.4byte	0x14b75
 	.uleb128 0x7f
 	.string	"val"
 	.byte	0xd0
@@ -46105,12 +48796,12 @@ __exitcall_ebc_exit:
 	.4byte	0xd2
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3248
+	.4byte	.LASF3259
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13c36
+	.4byte	0x14b9c
 	.uleb128 0x7f
 	.string	"nr"
 	.byte	0x7
@@ -46120,1175 +48811,683 @@ __exitcall_ebc_exit:
 	.4byte	.LASF1164
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x13c36
+	.4byte	0x14b9c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x3a
 	.uleb128 0x81
-	.4byte	.LASF3249
+	.4byte	.LASF3260
 	.byte	0x11
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x13c70
+	.4byte	0x14bd6
 	.uleb128 0x7f
 	.string	"i"
 	.byte	0x11
-	.byte	0x2f
-	.4byte	0xc6
-	.uleb128 0x7f
-	.string	"v"
-	.byte	0x11
-	.byte	0x2f
-	.4byte	0x13c70
-	.uleb128 0x7d
-	.string	"w0"
-	.byte	0x11
-	.byte	0x2f
-	.4byte	0xc6
-	.uleb128 0x7d
-	.string	"x1"
-	.byte	0x11
-	.byte	0x2f
-	.4byte	0x13c70
-	.byte	0
-	.uleb128 0x7
-	.byte	0x8
-	.4byte	0x37c
-	.uleb128 0x7e
-	.4byte	.LASF3250
-	.byte	0xd1
-	.byte	0x1b
-	.4byte	0xc6
-	.byte	0x3
-	.4byte	0x13c90
-	.uleb128 0x7f
-	.string	"x"
-	.byte	0xd1
-	.byte	0x1b
-	.4byte	0xf4
-	.byte	0
-	.uleb128 0x7e
-	.4byte	.LASF3251
-	.byte	0xd2
-	.byte	0xb
-	.4byte	0x29
-	.byte	0x3
-	.4byte	0x13cad
-	.uleb128 0x80
-	.4byte	.LASF2503
-	.byte	0xd2
-	.byte	0xb
-	.4byte	0x29
-	.byte	0
-	.uleb128 0x81
-	.4byte	.LASF3252
-	.byte	0xd3
-	.byte	0xb
-	.byte	0x3
-	.4byte	0x13cd0
-	.uleb128 0x7f
-	.string	"p"
-	.byte	0xd3
-	.byte	0xb
-	.4byte	0x13cd0
-	.uleb128 0x80
-	.4byte	.LASF1001
-	.byte	0xd3
-	.byte	0xb
-	.4byte	0x6d
-	.byte	0
-	.uleb128 0x7
-	.byte	0x8
-	.4byte	0x13cd8
-	.uleb128 0x83
-	.uleb128 0x3
-	.4byte	0x13cd6
-	.uleb128 0x81
-	.4byte	.LASF3253
-	.byte	0xd3
-	.byte	0x9
-	.byte	0x3
-	.4byte	0x13d00
-	.uleb128 0x7f
-	.string	"p"
-	.byte	0xd3
-	.byte	0x9
-	.4byte	0x13cd0
-	.uleb128 0x80
-	.4byte	.LASF1001
-	.byte	0xd3
-	.byte	0x9
-	.4byte	0x6d
-	.byte	0
-	.uleb128 0x67
-	.4byte	.LASF3254
-	.byte	0xc
-	.2byte	0x11a
-	.byte	0x3
-	.4byte	0x13d30
-	.uleb128 0x65
-	.string	"p"
-	.byte	0xc
-	.2byte	0x11a
-	.4byte	0x13d30
-	.uleb128 0x65
-	.string	"res"
-	.byte	0xc
-	.2byte	0x11a
-	.4byte	0x458
-	.uleb128 0x66
-	.4byte	.LASF1001
-	.byte	0xc
-	.2byte	0x11a
-	.4byte	0xc6
-	.byte	0
-	.uleb128 0x7
-	.byte	0x8
-	.4byte	0x13cd6
-	.uleb128 0x84
-	.4byte	0x10470
-	.8byte	.LFB2837
-	.8byte	.LFE2837-.LFB2837
-	.uleb128 0x1
-	.byte	0x9c
-	.4byte	0x13d63
-	.uleb128 0x70
-	.4byte	0x10481
-	.4byte	.LLST10
-	.uleb128 0x72
-	.4byte	0x1048d
-	.uleb128 0x1
-	.byte	0x51
-	.byte	0
-	.uleb128 0x84
-	.4byte	0x12a1e
-	.8byte	.LFB2816
-	.8byte	.LFE2816-.LFB2816
-	.uleb128 0x1
-	.byte	0x9c
-	.4byte	0x13fe6
-	.uleb128 0x72
-	.4byte	0x12a2b
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x70
-	.4byte	0x12a37
-	.4byte	.LLST108
-	.uleb128 0x70
-	.4byte	0x12a43
-	.4byte	.LLST109
-	.uleb128 0x70
-	.4byte	0x12a4f
-	.4byte	.LLST110
-	.uleb128 0x54
-	.4byte	0x12a5c
-	.8byte	.LBB1238
-	.8byte	.LBE1238-.LBB1238
-	.byte	0x1
-	.2byte	0x38d
-	.4byte	0x13e9b
-	.uleb128 0x55
-	.4byte	0x12a8d
-	.uleb128 0x55
-	.4byte	0x12a8d
-	.uleb128 0x55
-	.4byte	0x12a8d
-	.uleb128 0x55
-	.4byte	0x12a81
-	.uleb128 0x55
-	.4byte	0x12a75
-	.uleb128 0x55
-	.4byte	0x12a69
-	.uleb128 0x57
-	.8byte	.LBB1239
-	.8byte	.LBE1239-.LBB1239
-	.uleb128 0x58
-	.4byte	0x12a99
-	.uleb128 0x61
-	.4byte	0x12aa5
-	.4byte	.LLST111
-	.uleb128 0x58
-	.4byte	0x12aaf
-	.uleb128 0x61
-	.4byte	0x12ab9
-	.4byte	.LLST112
-	.uleb128 0x61
-	.4byte	0x12ac5
-	.4byte	.LLST113
-	.uleb128 0x61
-	.4byte	0x12ad1
-	.4byte	.LLST114
-	.uleb128 0x58
-	.4byte	0x12add
-	.uleb128 0x62
-	.4byte	0x12ae9
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x62
-	.4byte	0x12af5
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x61
-	.4byte	0x12b01
-	.4byte	.LLST115
-	.uleb128 0x61
-	.4byte	0x12b0d
-	.4byte	.LLST116
-	.uleb128 0x61
-	.4byte	0x12b19
-	.4byte	.LLST117
-	.uleb128 0x58
-	.4byte	0x12b25
-	.uleb128 0x5c
-	.4byte	0x1329c
-	.8byte	.LBB1240
-	.4byte	.Ldebug_ranges0+0x6d0
-	.byte	0x1
-	.2byte	0x380
-	.4byte	0x13e75
-	.uleb128 0x55
-	.4byte	0x132c4
-	.uleb128 0x55
-	.4byte	0x132b8
-	.uleb128 0x55
-	.4byte	0x132ac
-	.byte	0
-	.uleb128 0x60
-	.4byte	0x1329c
-	.8byte	.LBB1247
-	.4byte	.Ldebug_ranges0+0x730
-	.byte	0x1
-	.2byte	0x381
-	.uleb128 0x55
-	.4byte	0x132c4
-	.uleb128 0x55
-	.4byte	0x132b8
-	.uleb128 0x55
-	.4byte	0x132ac
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x780
-	.uleb128 0x55
-	.4byte	0x12a4f
-	.uleb128 0x55
-	.4byte	0x12a43
-	.uleb128 0x55
-	.4byte	0x12a37
-	.uleb128 0x55
-	.4byte	0x12a2b
-	.uleb128 0x60
-	.4byte	0x12b32
-	.8byte	.LBB1259
-	.4byte	.Ldebug_ranges0+0x780
-	.byte	0x1
-	.2byte	0x38b
-	.uleb128 0x55
-	.4byte	0x12b63
-	.uleb128 0x55
-	.4byte	0x12b63
-	.uleb128 0x55
-	.4byte	0x12b63
-	.uleb128 0x55
-	.4byte	0x12b57
-	.uleb128 0x55
-	.4byte	0x12b4b
-	.uleb128 0x55
-	.4byte	0x12b3f
-	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x780
-	.uleb128 0x58
-	.4byte	0x12b6f
-	.uleb128 0x62
-	.4byte	0x12b7b
-	.uleb128 0x1
-	.byte	0x5c
-	.uleb128 0x58
-	.4byte	0x12b85
-	.uleb128 0x62
-	.4byte	0x12b8f
-	.uleb128 0x1
-	.byte	0x5f
-	.uleb128 0x58
-	.4byte	0x12b9b
-	.uleb128 0x61
-	.4byte	0x12ba7
-	.4byte	.LLST118
-	.uleb128 0x61
-	.4byte	0x12bb3
-	.4byte	.LLST119
-	.uleb128 0x62
-	.4byte	0x12bbf
-	.uleb128 0x1
-	.byte	0x59
-	.uleb128 0x62
-	.4byte	0x12bcb
-	.uleb128 0x1
-	.byte	0x5a
-	.uleb128 0x61
-	.4byte	0x12bd7
-	.4byte	.LLST120
-	.uleb128 0x61
-	.4byte	0x12be3
-	.4byte	.LLST121
-	.uleb128 0x62
-	.4byte	0x12bef
-	.uleb128 0x1
-	.byte	0x53
-	.uleb128 0x58
-	.4byte	0x12bfb
-	.uleb128 0x5c
-	.4byte	0x1329c
-	.8byte	.LBB1261
-	.4byte	.Ldebug_ranges0+0x7c0
-	.byte	0x1
-	.2byte	0x359
-	.4byte	0x13f6e
-	.uleb128 0x55
-	.4byte	0x132c4
-	.uleb128 0x55
-	.4byte	0x132b8
-	.uleb128 0x55
-	.4byte	0x132ac
-	.byte	0
-	.uleb128 0x5c
-	.4byte	0x1329c
-	.8byte	.LBB1266
-	.4byte	.Ldebug_ranges0+0x810
-	.byte	0x1
-	.2byte	0x35a
-	.4byte	0x13f96
-	.uleb128 0x55
-	.4byte	0x132c4
-	.uleb128 0x55
-	.4byte	0x132b8
-	.uleb128 0x55
-	.4byte	0x132ac
-	.byte	0
-	.uleb128 0x5c
-	.4byte	0x1329c
-	.8byte	.LBB1278
-	.4byte	.Ldebug_ranges0+0x880
-	.byte	0x1
-	.2byte	0x35b
-	.4byte	0x13fbe
-	.uleb128 0x55
-	.4byte	0x132c4
-	.uleb128 0x55
-	.4byte	0x132b8
-	.uleb128 0x55
-	.4byte	0x132ac
-	.byte	0
-	.uleb128 0x60
-	.4byte	0x1329c
-	.8byte	.LBB1290
-	.4byte	.Ldebug_ranges0+0x8f0
-	.byte	0x1
-	.2byte	0x35c
-	.uleb128 0x55
-	.4byte	0x132c4
-	.uleb128 0x55
-	.4byte	0x132b8
-	.uleb128 0x55
-	.4byte	0x132ac
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x84
-	.4byte	0x12834
-	.8byte	.LFB2819
-	.8byte	.LFE2819-.LFB2819
-	.uleb128 0x1
-	.byte	0x9c
-	.4byte	0x1431b
-	.uleb128 0x72
-	.4byte	0x12841
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x70
-	.4byte	0x1284d
-	.4byte	.LLST122
-	.uleb128 0x70
-	.4byte	0x12859
-	.4byte	.LLST123
-	.uleb128 0x70
-	.4byte	0x12865
-	.4byte	.LLST124
-	.uleb128 0x63
-	.4byte	.Ldebug_ranges0+0x940
-	.4byte	0x14200
-	.uleb128 0x55
-	.4byte	0x12865
-	.uleb128 0x55
-	.4byte	0x12859
-	.uleb128 0x55
-	.4byte	0x1284d
-	.uleb128 0x55
-	.4byte	0x12841
-	.uleb128 0x60
-	.4byte	0x12872
-	.8byte	.LBB1326
-	.4byte	.Ldebug_ranges0+0x940
-	.byte	0x1
-	.2byte	0x3e9
-	.uleb128 0x55
-	.4byte	0x128a3
-	.uleb128 0x55
-	.4byte	0x128a3
-	.uleb128 0x55
-	.4byte	0x128a3
-	.uleb128 0x55
-	.4byte	0x12897
-	.uleb128 0x55
-	.4byte	0x1288b
-	.uleb128 0x55
-	.4byte	0x1287f
-	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x940
-	.uleb128 0x58
-	.4byte	0x128af
-	.uleb128 0x61
-	.4byte	0x128bb
-	.4byte	.LLST125
-	.uleb128 0x61
-	.4byte	0x128c7
-	.4byte	.LLST126
-	.uleb128 0x61
-	.4byte	0x128d3
-	.4byte	.LLST127
-	.uleb128 0x61
-	.4byte	0x128df
-	.4byte	.LLST128
-	.uleb128 0x61
-	.4byte	0x128eb
-	.4byte	.LLST129
-	.uleb128 0x61
-	.4byte	0x128f7
-	.4byte	.LLST130
-	.uleb128 0x61
-	.4byte	0x12903
-	.4byte	.LLST131
-	.uleb128 0x61
-	.4byte	0x1290f
-	.4byte	.LLST132
-	.uleb128 0x58
-	.4byte	0x12919
-	.uleb128 0x61
-	.4byte	0x12923
-	.4byte	.LLST133
-	.uleb128 0x61
-	.4byte	0x1292f
-	.4byte	.LLST134
-	.uleb128 0x58
-	.4byte	0x1293b
-	.uleb128 0x5c
-	.4byte	0x13251
-	.8byte	.LBB1328
-	.4byte	.Ldebug_ranges0+0x970
-	.byte	0x1
-	.2byte	0x3da
-	.4byte	0x1411d
-	.uleb128 0x55
-	.4byte	0x13279
-	.uleb128 0x55
-	.4byte	0x1326d
-	.uleb128 0x55
-	.4byte	0x13261
-	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x970
-	.uleb128 0x58
-	.4byte	0x13285
-	.uleb128 0x61
-	.4byte	0x13290
-	.4byte	.LLST135
-	.byte	0
-	.byte	0
-	.uleb128 0x54
-	.4byte	0x13251
-	.8byte	.LBB1331
-	.8byte	.LBE1331-.LBB1331
-	.byte	0x1
-	.2byte	0x3d7
-	.4byte	0x14169
-	.uleb128 0x55
-	.4byte	0x13279
-	.uleb128 0x55
-	.4byte	0x1326d
-	.uleb128 0x55
-	.4byte	0x13261
-	.uleb128 0x57
-	.8byte	.LBB1332
-	.8byte	.LBE1332-.LBB1332
-	.uleb128 0x58
-	.4byte	0x13285
-	.uleb128 0x61
-	.4byte	0x13290
-	.4byte	.LLST136
-	.byte	0
-	.byte	0
-	.uleb128 0x54
-	.4byte	0x13251
-	.8byte	.LBB1333
-	.8byte	.LBE1333-.LBB1333
-	.byte	0x1
-	.2byte	0x3d8
-	.4byte	0x141b5
-	.uleb128 0x55
-	.4byte	0x13279
-	.uleb128 0x55
-	.4byte	0x1326d
-	.uleb128 0x55
-	.4byte	0x13261
-	.uleb128 0x57
-	.8byte	.LBB1334
-	.8byte	.LBE1334-.LBB1334
-	.uleb128 0x58
-	.4byte	0x13285
-	.uleb128 0x61
-	.4byte	0x13290
-	.4byte	.LLST137
-	.byte	0
+	.byte	0x2f
+	.4byte	0xc6
+	.uleb128 0x7f
+	.string	"v"
+	.byte	0x11
+	.byte	0x2f
+	.4byte	0x14bd6
+	.uleb128 0x7d
+	.string	"w0"
+	.byte	0x11
+	.byte	0x2f
+	.4byte	0xc6
+	.uleb128 0x7d
+	.string	"x1"
+	.byte	0x11
+	.byte	0x2f
+	.4byte	0x14bd6
 	.byte	0
-	.uleb128 0x5e
-	.4byte	0x13251
-	.8byte	.LBB1335
-	.8byte	.LBE1335-.LBB1335
-	.byte	0x1
-	.2byte	0x3d9
-	.uleb128 0x55
-	.4byte	0x13279
-	.uleb128 0x55
-	.4byte	0x1326d
-	.uleb128 0x55
-	.4byte	0x13261
-	.uleb128 0x57
-	.8byte	.LBB1336
-	.8byte	.LBE1336-.LBB1336
-	.uleb128 0x58
-	.4byte	0x13285
-	.uleb128 0x61
-	.4byte	0x13290
-	.4byte	.LLST138
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x37c
+	.uleb128 0x7e
+	.4byte	.LASF3261
+	.byte	0xd1
+	.byte	0x1b
+	.4byte	0xc6
+	.byte	0x3
+	.4byte	0x14bf6
+	.uleb128 0x7f
+	.string	"x"
+	.byte	0xd1
+	.byte	0x1b
+	.4byte	0xf4
 	.byte	0
+	.uleb128 0x7e
+	.4byte	.LASF3262
+	.byte	0xd2
+	.byte	0xb
+	.4byte	0x29
+	.byte	0x3
+	.4byte	0x14c13
+	.uleb128 0x80
+	.4byte	.LASF2503
+	.byte	0xd2
+	.byte	0xb
+	.4byte	0x29
 	.byte	0
+	.uleb128 0x81
+	.4byte	.LASF3263
+	.byte	0xd3
+	.byte	0xb
+	.byte	0x3
+	.4byte	0x14c36
+	.uleb128 0x7f
+	.string	"p"
+	.byte	0xd3
+	.byte	0xb
+	.4byte	0x14c36
+	.uleb128 0x80
+	.4byte	.LASF1001
+	.byte	0xd3
+	.byte	0xb
+	.4byte	0x6d
 	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x14c3e
+	.uleb128 0x83
+	.uleb128 0x3
+	.4byte	0x14c3c
+	.uleb128 0x81
+	.4byte	.LASF3264
+	.byte	0xd3
+	.byte	0x9
+	.byte	0x3
+	.4byte	0x14c66
+	.uleb128 0x7f
+	.string	"p"
+	.byte	0xd3
+	.byte	0x9
+	.4byte	0x14c36
+	.uleb128 0x80
+	.4byte	.LASF1001
+	.byte	0xd3
+	.byte	0x9
+	.4byte	0x6d
 	.byte	0
+	.uleb128 0x67
+	.4byte	.LASF3265
+	.byte	0xc
+	.2byte	0x11a
+	.byte	0x3
+	.4byte	0x14c96
+	.uleb128 0x65
+	.string	"p"
+	.byte	0xc
+	.2byte	0x11a
+	.4byte	0x14c96
+	.uleb128 0x65
+	.string	"res"
+	.byte	0xc
+	.2byte	0x11a
+	.4byte	0x458
+	.uleb128 0x66
+	.4byte	.LASF1001
+	.byte	0xc
+	.2byte	0x11a
+	.4byte	0xc6
 	.byte	0
-	.uleb128 0x5e
-	.4byte	0x12948
-	.8byte	.LBB1340
-	.8byte	.LBE1340-.LBB1340
-	.byte	0x1
-	.2byte	0x3eb
-	.uleb128 0x55
-	.4byte	0x12979
-	.uleb128 0x55
-	.4byte	0x12979
-	.uleb128 0x55
-	.4byte	0x12979
-	.uleb128 0x55
-	.4byte	0x1296d
-	.uleb128 0x55
-	.4byte	0x12961
-	.uleb128 0x55
-	.4byte	0x12955
-	.uleb128 0x57
-	.8byte	.LBB1341
-	.8byte	.LBE1341-.LBB1341
-	.uleb128 0x58
-	.4byte	0x12985
-	.uleb128 0x58
-	.4byte	0x12991
-	.uleb128 0x58
-	.4byte	0x1299d
-	.uleb128 0x62
-	.4byte	0x129a9
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x14c3c
+	.uleb128 0x84
+	.4byte	0x103dd
+	.8byte	.LFB2844
+	.8byte	.LFE2844-.LFB2844
 	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x62
-	.4byte	0x129b5
+	.byte	0x9c
+	.4byte	0x14cc9
+	.uleb128 0x70
+	.4byte	0x103ee
+	.4byte	.LLST12
+	.uleb128 0x72
+	.4byte	0x103fa
 	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x61
-	.4byte	0x129c1
-	.4byte	.LLST139
-	.uleb128 0x61
-	.4byte	0x129cd
-	.4byte	.LLST140
-	.uleb128 0x61
-	.4byte	0x129d9
-	.4byte	.LLST141
-	.uleb128 0x61
-	.4byte	0x129e5
-	.4byte	.LLST142
-	.uleb128 0x58
-	.4byte	0x129ef
-	.uleb128 0x61
-	.4byte	0x129f9
-	.4byte	.LLST143
-	.uleb128 0x61
-	.4byte	0x12a05
-	.4byte	.LLST144
-	.uleb128 0x58
-	.4byte	0x12a11
-	.uleb128 0x5c
-	.4byte	0x13251
-	.8byte	.LBB1342
-	.4byte	.Ldebug_ranges0+0x9a0
-	.byte	0x1
-	.2byte	0x3af
-	.4byte	0x142e0
-	.uleb128 0x55
-	.4byte	0x13279
-	.uleb128 0x55
-	.4byte	0x1326d
-	.uleb128 0x55
-	.4byte	0x13261
-	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0x9a0
-	.uleb128 0x58
-	.4byte	0x13285
-	.uleb128 0x61
-	.4byte	0x13290
-	.4byte	.LLST145
-	.byte	0
-	.byte	0
-	.uleb128 0x60
-	.4byte	0x13251
-	.8byte	.LBB1349
-	.4byte	.Ldebug_ranges0+0xa10
-	.byte	0x1
-	.2byte	0x3ae
-	.uleb128 0x55
-	.4byte	0x13279
-	.uleb128 0x55
-	.4byte	0x1326d
-	.uleb128 0x55
-	.4byte	0x13261
-	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xa10
-	.uleb128 0x58
-	.4byte	0x13285
-	.uleb128 0x61
-	.4byte	0x13290
-	.4byte	.LLST146
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
+	.byte	0x51
 	.byte	0
 	.uleb128 0x85
-	.4byte	0x127fc
-	.8byte	.LFB2865
-	.8byte	.LFE2865-.LFB2865
+	.4byte	0x1274a
+	.8byte	.LFB2876
+	.8byte	.LFE2876-.LFB2876
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1441e
+	.4byte	0x14dcc
 	.uleb128 0x70
-	.4byte	0x12809
-	.4byte	.LLST147
+	.4byte	0x12757
+	.4byte	.LLST190
 	.uleb128 0x55
-	.4byte	0x12815
+	.4byte	0x12763
 	.uleb128 0x58
-	.4byte	0x12821
+	.4byte	0x1276f
 	.uleb128 0x5c
-	.4byte	0x133b6
-	.8byte	.LBB1365
-	.4byte	.Ldebug_ranges0+0xa70
+	.4byte	0x1431c
+	.8byte	.LBB1438
+	.4byte	.Ldebug_ranges0+0xbf0
 	.byte	0x1
-	.2byte	0x3f2
-	.4byte	0x1439c
+	.2byte	0x585
+	.4byte	0x14d4a
 	.uleb128 0x55
-	.4byte	0x133e7
+	.4byte	0x1434d
 	.uleb128 0x55
-	.4byte	0x133db
+	.4byte	0x14341
 	.uleb128 0x55
-	.4byte	0x133cf
+	.4byte	0x14335
 	.uleb128 0x55
-	.4byte	0x133c3
+	.4byte	0x14329
 	.uleb128 0x5f
-	.4byte	.Ldebug_ranges0+0xa70
+	.4byte	.Ldebug_ranges0+0xbf0
 	.uleb128 0x58
-	.4byte	0x133f3
+	.4byte	0x14359
 	.uleb128 0x60
-	.4byte	0x13400
-	.8byte	.LBB1367
-	.4byte	.Ldebug_ranges0+0xac0
+	.4byte	0x14366
+	.8byte	.LBB1440
+	.4byte	.Ldebug_ranges0+0xc40
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x55
-	.4byte	0x13411
+	.4byte	0x14377
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13329
-	.8byte	.LBB1376
-	.4byte	.Ldebug_ranges0+0xaf0
+	.4byte	0x1428f
+	.8byte	.LBB1449
+	.4byte	.Ldebug_ranges0+0xc70
 	.byte	0x1
-	.2byte	0x3f3
-	.4byte	0x143ce
+	.2byte	0x586
+	.4byte	0x14d7c
 	.uleb128 0x55
-	.4byte	0x13366
+	.4byte	0x142cc
 	.uleb128 0x55
-	.4byte	0x1335a
+	.4byte	0x142c0
 	.uleb128 0x55
-	.4byte	0x1334e
+	.4byte	0x142b4
 	.uleb128 0x55
-	.4byte	0x13342
+	.4byte	0x142a8
 	.uleb128 0x55
-	.4byte	0x13336
+	.4byte	0x1429c
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x132f7
-	.8byte	.LBB1382
-	.8byte	.LBE1382-.LBB1382
+	.4byte	0x1425d
+	.8byte	.LBB1455
+	.8byte	.LBE1455-.LBB1455
 	.byte	0x1
-	.2byte	0x3f4
-	.4byte	0x143fa
+	.2byte	0x587
+	.4byte	0x14da8
 	.uleb128 0x55
-	.4byte	0x1331c
+	.4byte	0x14282
 	.uleb128 0x55
-	.4byte	0x13310
+	.4byte	0x14276
 	.uleb128 0x55
-	.4byte	0x13304
+	.4byte	0x1426a
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x132d1
-	.8byte	.LBB1384
-	.8byte	.LBE1384-.LBB1384
+	.4byte	0x14237
+	.8byte	.LBB1457
+	.8byte	.LBE1457-.LBB1457
 	.byte	0x1
-	.2byte	0x3f5
+	.2byte	0x588
 	.uleb128 0x55
-	.4byte	0x132ea
+	.4byte	0x14250
 	.uleb128 0x55
-	.4byte	0x132de
+	.4byte	0x14244
 	.byte	0
 	.byte	0
 	.uleb128 0x85
-	.4byte	0x1321e
-	.8byte	.LFB2866
-	.8byte	.LFE2866-.LFB2866
+	.4byte	0x14104
+	.8byte	.LFB2877
+	.8byte	.LFE2877-.LFB2877
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x144dc
+	.4byte	0x14e8a
 	.uleb128 0x70
-	.4byte	0x1322e
-	.4byte	.LLST150
+	.4byte	0x14114
+	.4byte	.LLST193
 	.uleb128 0x70
-	.4byte	0x13239
-	.4byte	.LLST151
+	.4byte	0x1411f
+	.4byte	.LLST194
 	.uleb128 0x58
-	.4byte	0x13245
+	.4byte	0x1412b
 	.uleb128 0x71
-	.4byte	0x13373
-	.8byte	.LBB1408
-	.8byte	.LBE1408-.LBB1408
+	.4byte	0x142d9
+	.8byte	.LBB1481
+	.8byte	.LBE1481-.LBB1481
 	.byte	0x1
 	.byte	0xc9
-	.4byte	0x14472
+	.4byte	0x14e20
 	.uleb128 0x55
-	.4byte	0x13380
+	.4byte	0x142e6
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x1350b
-	.8byte	.LBB1410
-	.8byte	.LBE1410-.LBB1410
+	.4byte	0x14471
+	.8byte	.LBB1483
+	.8byte	.LBE1483-.LBB1483
 	.byte	0x1
 	.byte	0xca
-	.4byte	0x14493
+	.4byte	0x14e41
 	.uleb128 0x55
-	.4byte	0x13518
+	.4byte	0x1447e
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x1353f
-	.8byte	.LBB1412
-	.8byte	.LBE1412-.LBB1412
+	.4byte	0x144a5
+	.8byte	.LBB1485
+	.8byte	.LBE1485-.LBB1485
 	.byte	0x1
 	.byte	0xcd
-	.4byte	0x144c1
+	.4byte	0x14e6f
 	.uleb128 0x55
-	.4byte	0x1354c
+	.4byte	0x144b2
 	.uleb128 0x4f
-	.8byte	.LVL523
-	.4byte	0x14831
+	.8byte	.LVL600
+	.4byte	0x15240
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL520
-	.4byte	0x145a6
+	.8byte	.LVL597
+	.4byte	0x14fb5
 	.uleb128 0x4f
-	.8byte	.LVL524
-	.4byte	0x145a6
+	.8byte	.LVL601
+	.4byte	0x14fb5
+	.byte	0
+	.uleb128 0x84
+	.4byte	0x12124
+	.8byte	.LFB2879
+	.8byte	.LFE2879-.LFB2879
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x14eeb
+	.uleb128 0x55
+	.4byte	0x12141
+	.uleb128 0x55
+	.4byte	0x12135
+	.uleb128 0x55
+	.4byte	0x12135
+	.uleb128 0x58
+	.4byte	0x1214d
+	.uleb128 0x58
+	.4byte	0x12157
+	.uleb128 0x58
+	.4byte	0x12163
+	.uleb128 0x61
+	.4byte	0x1216f
+	.4byte	.LLST196
+	.uleb128 0x62
+	.4byte	0x1217b
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x61
+	.4byte	0x12187
+	.4byte	.LLST197
+	.uleb128 0x4f
+	.8byte	.LVL611
+	.4byte	0x152b7
 	.byte	0
 	.uleb128 0x85
-	.4byte	0x1321e
-	.8byte	.LFB2871
-	.8byte	.LFE2871-.LFB2871
+	.4byte	0x14104
+	.8byte	.LFB2883
+	.8byte	.LFE2883-.LFB2883
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1458e
+	.4byte	0x14f9d
 	.uleb128 0x70
-	.4byte	0x1322e
-	.4byte	.LLST178
+	.4byte	0x14114
+	.4byte	.LLST223
 	.uleb128 0x58
-	.4byte	0x13245
+	.4byte	0x1412b
 	.uleb128 0x55
-	.4byte	0x13239
+	.4byte	0x1411f
 	.uleb128 0x71
-	.4byte	0x13525
-	.8byte	.LBB1755
-	.8byte	.LBE1755-.LBB1755
+	.4byte	0x1448b
+	.8byte	.LBB1808
+	.8byte	.LBE1808-.LBB1808
 	.byte	0x1
 	.byte	0xc2
-	.4byte	0x1452c
+	.4byte	0x14f3b
 	.uleb128 0x55
-	.4byte	0x13532
+	.4byte	0x14498
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x1338d
-	.8byte	.LBB1757
-	.8byte	.LBE1757-.LBB1757
+	.4byte	0x142f3
+	.8byte	.LBB1810
+	.8byte	.LBE1810-.LBB1810
 	.byte	0x1
 	.byte	0xc3
-	.4byte	0x14552
+	.4byte	0x14f61
 	.uleb128 0x55
-	.4byte	0x133a9
+	.4byte	0x1430f
 	.uleb128 0x55
-	.4byte	0x1339d
+	.4byte	0x14303
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x1355f
-	.8byte	.LBB1759
-	.8byte	.LBE1759-.LBB1759
+	.4byte	0x144c5
+	.8byte	.LBB1812
+	.8byte	.LBE1812-.LBB1812
 	.byte	0x1
 	.byte	0xbf
-	.4byte	0x14580
+	.4byte	0x14f8f
 	.uleb128 0x55
-	.4byte	0x1356c
+	.4byte	0x144d2
 	.uleb128 0x4f
-	.8byte	.LVL724
-	.4byte	0x148b4
+	.8byte	.LVL803
+	.4byte	0x152c3
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL721
-	.4byte	0x145a6
+	.8byte	.LVL800
+	.4byte	0x14fb5
 	.byte	0
 	.uleb128 0x86
-	.4byte	.LASF3255
-	.4byte	.LASF3255
+	.4byte	.LASF3266
+	.4byte	.LASF3266
 	.byte	0xbe
 	.byte	0xcc
 	.uleb128 0x86
-	.4byte	.LASF3256
-	.4byte	.LASF3256
+	.4byte	.LASF3267
+	.4byte	.LASF3267
 	.byte	0xbe
 	.byte	0xca
 	.uleb128 0x87
-	.4byte	.LASF3257
-	.4byte	.LASF3257
+	.4byte	.LASF3268
+	.4byte	.LASF3268
 	.byte	0x2
 	.2byte	0x5d1
 	.uleb128 0x86
-	.4byte	.LASF3258
-	.4byte	.LASF3258
+	.4byte	.LASF3269
+	.4byte	.LASF3269
 	.byte	0xac
 	.byte	0x4f
 	.uleb128 0x87
-	.4byte	.LASF3259
-	.4byte	.LASF3259
+	.4byte	.LASF3270
+	.4byte	.LASF3270
 	.byte	0x2
 	.2byte	0x2bf
 	.uleb128 0x87
-	.4byte	.LASF3260
-	.4byte	.LASF3260
+	.4byte	.LASF3271
+	.4byte	.LASF3271
 	.byte	0xe
 	.2byte	0x149
 	.uleb128 0x87
-	.4byte	.LASF3261
-	.4byte	.LASF3261
+	.4byte	.LASF3272
+	.4byte	.LASF3272
 	.byte	0xe
 	.2byte	0x172
 	.uleb128 0x86
-	.4byte	.LASF3262
-	.4byte	.LASF3262
+	.4byte	.LASF3273
+	.4byte	.LASF3273
 	.byte	0xd4
 	.byte	0x78
 	.uleb128 0x86
-	.4byte	.LASF3263
-	.4byte	.LASF3263
+	.4byte	.LASF3274
+	.4byte	.LASF3274
 	.byte	0xaa
 	.byte	0x59
 	.uleb128 0x86
-	.4byte	.LASF3264
-	.4byte	.LASF3264
+	.4byte	.LASF3275
+	.4byte	.LASF3275
 	.byte	0xc3
-	.byte	0x30
+	.byte	0x31
 	.uleb128 0x88
-	.4byte	.LASF3265
-	.4byte	.LASF3265
+	.4byte	.LASF3276
+	.4byte	.LASF3276
 	.uleb128 0x86
-	.4byte	.LASF3265
-	.4byte	.LASF3265
+	.4byte	.LASF3276
+	.4byte	.LASF3276
 	.byte	0xd5
 	.byte	0x36
 	.uleb128 0x87
-	.4byte	.LASF3266
-	.4byte	.LASF3266
+	.4byte	.LASF3277
+	.4byte	.LASF3277
 	.byte	0x2
 	.2byte	0x5cb
 	.uleb128 0x86
-	.4byte	.LASF3267
-	.4byte	.LASF3267
+	.4byte	.LASF3278
+	.4byte	.LASF3278
 	.byte	0xc2
 	.byte	0x30
 	.uleb128 0x86
-	.4byte	.LASF3268
-	.4byte	.LASF3268
+	.4byte	.LASF3279
+	.4byte	.LASF3279
 	.byte	0xc2
 	.byte	0x31
 	.uleb128 0x86
-	.4byte	.LASF3269
-	.4byte	.LASF3269
+	.4byte	.LASF3280
+	.4byte	.LASF3280
 	.byte	0xab
 	.byte	0x9
 	.uleb128 0x87
-	.4byte	.LASF3270
-	.4byte	.LASF3270
+	.4byte	.LASF3281
+	.4byte	.LASF3281
 	.byte	0x48
 	.2byte	0x6b8
 	.uleb128 0x87
-	.4byte	.LASF3271
-	.4byte	.LASF3271
+	.4byte	.LASF3282
+	.4byte	.LASF3282
 	.byte	0xd
 	.2byte	0x190
 	.uleb128 0x87
-	.4byte	.LASF3272
-	.4byte	.LASF3272
+	.4byte	.LASF3283
+	.4byte	.LASF3283
 	.byte	0x48
 	.2byte	0x676
 	.uleb128 0x86
-	.4byte	.LASF3273
-	.4byte	.LASF3273
+	.4byte	.LASF3284
+	.4byte	.LASF3284
 	.byte	0x9c
 	.byte	0x67
 	.uleb128 0x86
-	.4byte	.LASF3274
-	.4byte	.LASF3274
+	.4byte	.LASF3285
+	.4byte	.LASF3285
 	.byte	0x54
 	.byte	0x53
 	.uleb128 0x86
-	.4byte	.LASF3275
-	.4byte	.LASF3275
+	.4byte	.LASF3286
+	.4byte	.LASF3286
 	.byte	0x54
 	.byte	0xa5
 	.uleb128 0x86
-	.4byte	.LASF3276
-	.4byte	.LASF3276
+	.4byte	.LASF3287
+	.4byte	.LASF3287
 	.byte	0xc3
-	.byte	0x2b
+	.byte	0x2c
 	.uleb128 0x86
-	.4byte	.LASF3277
-	.4byte	.LASF3277
+	.4byte	.LASF3288
+	.4byte	.LASF3288
 	.byte	0xc3
-	.byte	0x27
+	.byte	0x28
 	.uleb128 0x87
-	.4byte	.LASF3278
-	.4byte	.LASF3278
+	.4byte	.LASF3289
+	.4byte	.LASF3289
 	.byte	0x12
 	.2byte	0x184
 	.uleb128 0x86
-	.4byte	.LASF3279
-	.4byte	.LASF3279
+	.4byte	.LASF3290
+	.4byte	.LASF3290
 	.byte	0xd6
 	.byte	0x51
 	.uleb128 0x87
-	.4byte	.LASF3280
-	.4byte	.LASF3280
+	.4byte	.LASF3291
+	.4byte	.LASF3291
 	.byte	0x20
 	.2byte	0x1d9
 	.uleb128 0x86
-	.4byte	.LASF3281
-	.4byte	.LASF3281
+	.4byte	.LASF3292
+	.4byte	.LASF3292
 	.byte	0x3
 	.byte	0x3b
 	.uleb128 0x86
-	.4byte	.LASF3282
-	.4byte	.LASF3282
+	.4byte	.LASF3293
+	.4byte	.LASF3293
 	.byte	0x12
 	.byte	0xb9
 	.uleb128 0x86
-	.4byte	.LASF3283
-	.4byte	.LASF3283
+	.4byte	.LASF3294
+	.4byte	.LASF3294
 	.byte	0x3a
 	.byte	0xc2
 	.uleb128 0x88
-	.4byte	.LASF3284
-	.4byte	.LASF3284
+	.4byte	.LASF3295
+	.4byte	.LASF3295
 	.uleb128 0x86
-	.4byte	.LASF3285
-	.4byte	.LASF3285
+	.4byte	.LASF3296
+	.4byte	.LASF3296
 	.byte	0xac
 	.byte	0x4e
 	.uleb128 0x87
-	.4byte	.LASF3286
-	.4byte	.LASF3286
+	.4byte	.LASF3297
+	.4byte	.LASF3297
 	.byte	0x2
 	.2byte	0x287
 	.uleb128 0x86
-	.4byte	.LASF3287
-	.4byte	.LASF3287
+	.4byte	.LASF3298
+	.4byte	.LASF3298
 	.byte	0xbf
 	.byte	0x38
 	.uleb128 0x87
-	.4byte	.LASF3288
-	.4byte	.LASF3288
+	.4byte	.LASF3299
+	.4byte	.LASF3299
 	.byte	0xe
 	.2byte	0x165
 	.uleb128 0x87
-	.4byte	.LASF3289
-	.4byte	.LASF3289
+	.4byte	.LASF3300
+	.4byte	.LASF3300
 	.byte	0xa3
 	.2byte	0x37b
 	.uleb128 0x87
-	.4byte	.LASF3290
-	.4byte	.LASF3290
+	.4byte	.LASF3301
+	.4byte	.LASF3301
 	.byte	0xe
 	.2byte	0x125
 	.uleb128 0x88
-	.4byte	.LASF3291
-	.4byte	.LASF3291
+	.4byte	.LASF3302
+	.4byte	.LASF3302
 	.uleb128 0x86
-	.4byte	.LASF3292
-	.4byte	.LASF3292
+	.4byte	.LASF3303
+	.4byte	.LASF3303
 	.byte	0xc3
-	.byte	0x2e
+	.byte	0x2f
 	.uleb128 0x87
-	.4byte	.LASF3293
-	.4byte	.LASF3293
+	.4byte	.LASF3304
+	.4byte	.LASF3304
 	.byte	0x20
 	.2byte	0x1c7
 	.uleb128 0x87
-	.4byte	.LASF3294
-	.4byte	.LASF3294
+	.4byte	.LASF3305
+	.4byte	.LASF3305
 	.byte	0x20
 	.2byte	0x17e
 	.uleb128 0x86
-	.4byte	.LASF3295
-	.4byte	.LASF3295
+	.4byte	.LASF3306
+	.4byte	.LASF3306
 	.byte	0x3
 	.byte	0x3a
 	.uleb128 0x86
-	.4byte	.LASF3296
-	.4byte	.LASF3296
+	.4byte	.LASF3307
+	.4byte	.LASF3307
 	.byte	0xc2
 	.byte	0x32
 	.uleb128 0x87
-	.4byte	.LASF3297
-	.4byte	.LASF3297
+	.4byte	.LASF3308
+	.4byte	.LASF3308
 	.byte	0x76
 	.2byte	0xa0a
 	.uleb128 0x86
-	.4byte	.LASF3298
-	.4byte	.LASF3298
+	.4byte	.LASF3309
+	.4byte	.LASF3309
 	.byte	0xc3
-	.byte	0x2c
+	.byte	0x2d
 	.uleb128 0x86
-	.4byte	.LASF3299
-	.4byte	.LASF3299
+	.4byte	.LASF3310
+	.4byte	.LASF3310
 	.byte	0x48
 	.byte	0xdc
 	.uleb128 0x87
-	.4byte	.LASF3300
-	.4byte	.LASF3300
+	.4byte	.LASF3311
+	.4byte	.LASF3311
 	.byte	0x3a
 	.2byte	0x459
 	.uleb128 0x86
-	.4byte	.LASF3301
-	.4byte	.LASF3301
+	.4byte	.LASF3312
+	.4byte	.LASF3312
 	.byte	0x3a
 	.byte	0xe9
 	.uleb128 0x87
-	.4byte	.LASF3302
-	.4byte	.LASF3302
+	.4byte	.LASF3313
+	.4byte	.LASF3313
 	.byte	0x3a
 	.2byte	0x45a
 	.uleb128 0x87
-	.4byte	.LASF3303
-	.4byte	.LASF3303
+	.4byte	.LASF3314
+	.4byte	.LASF3314
 	.byte	0x6
 	.2byte	0x19f
 	.uleb128 0x87
-	.4byte	.LASF3304
-	.4byte	.LASF3304
+	.4byte	.LASF3315
+	.4byte	.LASF3315
 	.byte	0x6
 	.2byte	0x199
 	.uleb128 0x86
-	.4byte	.LASF3305
-	.4byte	.LASF3305
+	.4byte	.LASF3316
+	.4byte	.LASF3316
 	.byte	0xc3
-	.byte	0x25
+	.byte	0x26
 	.uleb128 0x86
-	.4byte	.LASF3306
-	.4byte	.LASF3306
+	.4byte	.LASF3317
+	.4byte	.LASF3317
 	.byte	0xc3
-	.byte	0x2a
+	.byte	0x2b
 	.uleb128 0x86
-	.4byte	.LASF3307
-	.4byte	.LASF3307
+	.4byte	.LASF3318
+	.4byte	.LASF3318
 	.byte	0xc3
-	.byte	0x24
+	.byte	0x25
 	.uleb128 0x86
-	.4byte	.LASF3308
-	.4byte	.LASF3308
+	.4byte	.LASF3319
+	.4byte	.LASF3319
 	.byte	0xc3
-	.byte	0x23
+	.byte	0x24
 	.uleb128 0x86
-	.4byte	.LASF3309
-	.4byte	.LASF3309
+	.4byte	.LASF3320
+	.4byte	.LASF3320
 	.byte	0x9c
 	.byte	0x73
 	.uleb128 0x86
-	.4byte	.LASF3310
-	.4byte	.LASF3310
+	.4byte	.LASF3321
+	.4byte	.LASF3321
 	.byte	0xc3
-	.byte	0x29
+	.byte	0x2a
 	.uleb128 0x86
-	.4byte	.LASF3311
-	.4byte	.LASF3311
+	.4byte	.LASF3322
+	.4byte	.LASF3322
+	.byte	0xc3
+	.byte	0x27
+	.uleb128 0x86
+	.4byte	.LASF3323
+	.4byte	.LASF3323
 	.byte	0x72
 	.byte	0x88
 	.uleb128 0x86
-	.4byte	.LASF3312
-	.4byte	.LASF3312
-	.byte	0xc3
-	.byte	0x26
-	.uleb128 0x86
-	.4byte	.LASF3313
-	.4byte	.LASF3313
+	.4byte	.LASF3324
+	.4byte	.LASF3324
 	.byte	0x72
 	.byte	0x98
 	.uleb128 0x86
-	.4byte	.LASF3314
-	.4byte	.LASF3314
+	.4byte	.LASF3325
+	.4byte	.LASF3325
 	.byte	0xc4
-	.byte	0x6a
-	.uleb128 0x86
-	.4byte	.LASF3315
-	.4byte	.LASF3315
-	.byte	0x1e
-	.byte	0xb0
+	.byte	0x6e
 	.uleb128 0x86
-	.4byte	.LASF3316
-	.4byte	.LASF3316
+	.4byte	.LASF3326
+	.4byte	.LASF3326
 	.byte	0xc2
 	.byte	0x33
 	.uleb128 0x87
-	.4byte	.LASF3317
-	.4byte	.LASF3317
+	.4byte	.LASF3327
+	.4byte	.LASF3327
 	.byte	0xd
 	.2byte	0x1d6
 	.uleb128 0x89
@@ -47297,13 +49496,18 @@ __exitcall_ebc_exit:
 	.byte	0x78
 	.byte	0x2c
 	.uleb128 0x86
-	.4byte	.LASF3318
-	.4byte	.LASF3318
+	.4byte	.LASF3328
+	.4byte	.LASF3328
 	.byte	0x78
 	.byte	0x27
 	.uleb128 0x86
-	.4byte	.LASF3319
-	.4byte	.LASF3319
+	.4byte	.LASF3329
+	.4byte	.LASF3329
+	.byte	0x1e
+	.byte	0xb0
+	.uleb128 0x86
+	.4byte	.LASF3330
+	.4byte	.LASF3330
 	.byte	0x9c
 	.byte	0x71
 	.byte	0
@@ -49139,2902 +51343,3466 @@ __exitcall_ebc_exit:
 	.byte	0
 	.section	.debug_loc,"",@progbits
 .Ldebug_loc0:
-.LLST11:
-	.8byte	.LVL65
-	.8byte	.LVL66
+.LLST13:
+	.8byte	.LVL67
+	.8byte	.LVL68
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST195:
+	.8byte	.LVL603
+	.8byte	.LVL604
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST15:
+	.8byte	.LVL74
+	.8byte	.LVL75
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST198:
+	.8byte	.LVL612
+	.8byte	.LVL613
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST199:
+	.8byte	.LVL616
+	.8byte	.LVL617
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL628
+	.8byte	.LVL629
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL760
+	.8byte	.LVL761
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST200:
+	.8byte	.LVL624
+	.8byte	.LVL625
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL673
+	.8byte	.LVL674
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST201:
+	.8byte	.LVL628
+	.8byte	.LVL630
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL637
+	.8byte	.LVL673
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL678
+	.8byte	.LVL760
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL761
+	.8byte	.LVL766
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL769
+	.8byte	.LVL780
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL782
+	.8byte	.LFE2859
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST202:
+	.8byte	.LVL619
+	.8byte	.LVL631
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL635
+	.8byte	.LVL638
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL673
+	.8byte	.LVL678
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL767
+	.8byte	.LVL769
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL794
+	.8byte	.LFE2859
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST203:
+	.8byte	.LVL619
+	.8byte	.LVL620
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	.LVL620
+	.8byte	.LVL621
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL622
+	.8byte	.LVL626
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	.LVL626
+	.8byte	.LVL676
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL676
+	.8byte	.LVL760
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	.LVL761
+	.8byte	.LVL766
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	.LVL767
+	.8byte	.LVL780
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	.LVL782
+	.8byte	.LFE2859
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	0
+	.8byte	0
+.LLST204:
+	.8byte	.LVL623
+	.8byte	.LVL630
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL635
+	.8byte	.LVL637
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL673
+	.8byte	.LVL678
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL794
+	.8byte	.LFE2859
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST205:
+	.8byte	.LVL628
+	.8byte	.LVL633
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL659
+	.8byte	.LVL667
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL678
+	.8byte	.LVL681
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL773
+	.8byte	.LVL774
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL782
+	.8byte	.LVL783
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL794
+	.8byte	.LFE2859
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST206:
+	.8byte	.LVL628
+	.8byte	.LVL633
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL667
+	.8byte	.LVL671
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL681
+	.8byte	.LVL682
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL783
+	.8byte	.LVL784
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL794
+	.8byte	.LFE2859
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST207:
+	.8byte	.LVL682
+	.8byte	.LVL683-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST208:
+	.8byte	.LVL688
+	.8byte	.LVL691
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST209:
+	.8byte	.LVL689
+	.8byte	.LVL690
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST210:
+	.8byte	.LVL628
+	.8byte	.LVL632
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL693
+	.8byte	.LVL701
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL775
+	.8byte	.LVL777
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL777
+	.8byte	.LVL778
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL778
+	.8byte	.LVL780
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL794
+	.8byte	.LFE2859
+	.2byte	0x1
+	.byte	0x68
+	.8byte	0
+	.8byte	0
+.LLST211:
+	.8byte	.LVL696
+	.8byte	.LVL699
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST212:
+	.8byte	.LVL697
+	.8byte	.LVL698
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST213:
+	.8byte	.LVL700
+	.8byte	.LVL702-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST214:
+	.8byte	.LVL628
+	.8byte	.LVL635
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	.LVL707
+	.8byte	.LVL745
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	.LVL745
+	.8byte	.LVL746
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL749
+	.8byte	.LVL760
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	.LVL761
+	.8byte	.LVL766
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	.LVL788
+	.8byte	.LFE2859
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	0
+	.8byte	0
+.LLST215:
+	.8byte	.LVL628
+	.8byte	.LVL635
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -24
+	.8byte	.LVL707
+	.8byte	.LVL757
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -24
+	.8byte	.LVL757
+	.8byte	.LVL758
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x51
+	.8byte	.LVL761
+	.8byte	.LVL766
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -24
+	.8byte	.LVL786
+	.8byte	.LFE2859
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -24
 	.8byte	0
 	.8byte	0
-.LLST152:
-	.8byte	.LVL526
-	.8byte	.LVL527
+.LLST216:
+	.8byte	.LVL628
+	.8byte	.LVL632
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x68
+	.8byte	.LVL713
+	.8byte	.LVL724
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL728
+	.8byte	.LVL739
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL749
+	.8byte	.LVL751
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL754
+	.8byte	.LVL760
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL787
+	.8byte	.LVL788
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL791
+	.8byte	.LFE2859
+	.2byte	0x1
+	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST13:
-	.8byte	.LVL72
-	.8byte	.LVL73
+.LLST217:
+	.8byte	.LVL628
+	.8byte	.LVL634
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x6c
+	.8byte	.LVL718
+	.8byte	.LVL741
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL748
+	.8byte	.LVL760
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL761
+	.8byte	.LVL766
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL791
+	.8byte	.LFE2859
+	.2byte	0x1
+	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST153:
-	.8byte	.LVL532
-	.8byte	.LVL533
+.LLST218:
+	.8byte	.LVL628
+	.8byte	.LVL633
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x6a
+	.8byte	.LVL709
+	.8byte	.LVL715
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL716
+	.8byte	.LVL719
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL728
+	.8byte	.LVL739
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL741
+	.8byte	.LVL749
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL786
+	.8byte	.LVL791
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL794
+	.8byte	.LFE2859
+	.2byte	0x1
+	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST154:
-	.8byte	.LVL536
-	.8byte	.LVL537
+.LLST219:
+	.8byte	.LVL628
+	.8byte	.LVL634
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL548
-	.8byte	.LVL549
+	.byte	0x6c
+	.8byte	.LVL711
+	.8byte	.LVL718
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL683
-	.8byte	.LVL684
+	.byte	0x6c
+	.8byte	.LVL720
+	.8byte	.LVL748
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x6c
+	.8byte	.LVL761
+	.8byte	.LVL766
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL786
+	.8byte	.LVL791
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL794
+	.8byte	.LFE2859
+	.2byte	0x1
+	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST155:
-	.8byte	.LVL544
-	.8byte	.LVL545
+.LLST220:
+	.8byte	.LVL628
+	.8byte	.LVL634
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL596
-	.8byte	.LVL597
+	.byte	0x6b
+	.8byte	.LVL714
+	.8byte	.LVL741
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL744
+	.8byte	.LVL760
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL761
+	.8byte	.LVL766
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL786
+	.8byte	.LVL788
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL788
+	.8byte	.LVL789
 	.2byte	0x1
 	.byte	0x50
+	.8byte	.LVL789
+	.8byte	.LFE2859
+	.2byte	0x1
+	.byte	0x6b
 	.8byte	0
 	.8byte	0
-.LLST156:
-	.8byte	.LVL548
-	.8byte	.LVL550
+.LLST221:
+	.8byte	.LVL628
+	.8byte	.LVL633
 	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL557
-	.8byte	.LVL596
+	.byte	0x6a
+	.8byte	.LVL715
+	.8byte	.LVL741
 	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL601
-	.8byte	.LVL683
+	.byte	0x6a
+	.8byte	.LVL749
+	.8byte	.LVL760
 	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL684
-	.8byte	.LVL690
+	.byte	0x6a
+	.8byte	.LVL761
+	.8byte	.LVL766
 	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL693
-	.8byte	.LVL702
+	.byte	0x6a
+	.8byte	.LVL791
+	.8byte	.LVL792
 	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL704
-	.8byte	.LFE2852
+	.byte	0x50
+	.8byte	.LVL792
+	.8byte	.LFE2859
 	.2byte	0x1
-	.byte	0x63
+	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST157:
-	.8byte	.LVL539
-	.8byte	.LVL551
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL555
-	.8byte	.LVL558
+.LLST222:
+	.8byte	.LVL628
+	.8byte	.LVL632
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL596
-	.8byte	.LVL601
+	.byte	0x68
+	.8byte	.LVL724
+	.8byte	.LVL741
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL691
-	.8byte	.LVL693
+	.byte	0x68
+	.8byte	.LVL761
+	.8byte	.LVL763
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL711
-	.8byte	.LVL712
+	.byte	0x68
+	.8byte	.LVL794
+	.8byte	.LFE2859
 	.2byte	0x1
-	.byte	0x65
+	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST158:
-	.8byte	.LVL539
-	.8byte	.LVL540
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -32
-	.8byte	.LVL540
-	.8byte	.LVL541
+.LLST80:
+	.8byte	.LVL306
+	.8byte	.LVL307
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL542
-	.8byte	.LVL546
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -32
-	.8byte	.LVL546
-	.8byte	.LVL599
+	.8byte	0
+	.8byte	0
+.LLST81:
+	.8byte	.LVL306
+	.8byte	.LVL308-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST82:
+	.8byte	.LVL306
+	.8byte	.LVL308-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST83:
+	.8byte	.LVL309
+	.8byte	.LVL310
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL599
-	.8byte	.LVL683
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -32
-	.8byte	.LVL684
-	.8byte	.LVL690
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -32
-	.8byte	.LVL691
-	.8byte	.LVL702
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -32
-	.8byte	.LVL704
-	.8byte	.LFE2852
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -32
 	.8byte	0
 	.8byte	0
-.LLST159:
-	.8byte	.LVL543
-	.8byte	.LVL550
+.LLST84:
+	.8byte	.LVL309
+	.8byte	.LVL311
 	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL555
-	.8byte	.LVL557
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST85:
+	.8byte	.LVL309
+	.8byte	.LVL312
 	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL596
-	.8byte	.LVL601
+	.byte	0x52
+	.8byte	.LVL312
+	.8byte	.LVL313-1
 	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL711
-	.8byte	.LVL712
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST86:
+	.8byte	.LVL314
+	.8byte	.LVL315
 	.2byte	0x1
-	.byte	0x63
+	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST160:
-	.8byte	.LVL548
-	.8byte	.LVL553
+.LLST87:
+	.8byte	.LVL314
+	.8byte	.LVL316
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL579
-	.8byte	.LVL590
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST88:
+	.8byte	.LVL314
+	.8byte	.LVL317
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL601
-	.8byte	.LVL604
+	.byte	0x52
+	.8byte	.LVL317
+	.8byte	.LVL318-1
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL684
-	.8byte	.LVL685
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST98:
+	.8byte	.LVL339
+	.8byte	.LVL340
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL704
-	.8byte	.LVL705
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST99:
+	.8byte	.LVL339
+	.8byte	.LVL341
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL711
-	.8byte	.LVL712
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST100:
+	.8byte	.LVL339
+	.8byte	.LVL343
 	.2byte	0x1
-	.byte	0x6a
+	.byte	0x52
+	.8byte	.LVL343
+	.8byte	.LVL348
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL349
+	.8byte	.LFE2849
+	.2byte	0x1
+	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST161:
-	.8byte	.LVL548
-	.8byte	.LVL553
+.LLST101:
+	.8byte	.LVL339
+	.8byte	.LVL344-1
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL590
-	.8byte	.LVL594
+	.byte	0x53
+	.8byte	.LVL344-1
+	.8byte	.LVL347
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL604
-	.8byte	.LVL605
+	.byte	0x64
+	.8byte	.LVL349
+	.8byte	.LVL350
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL705
-	.8byte	.LVL706
+	.byte	0x64
+	.8byte	.LVL352
+	.8byte	.LVL353
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL711
-	.8byte	.LVL712
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST102:
+	.8byte	.LVL342
+	.8byte	.LVL348
 	.2byte	0x1
-	.byte	0x6a
+	.byte	0x66
+	.8byte	.LVL349
+	.8byte	.LFE2849
+	.2byte	0x1
+	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST162:
-	.8byte	.LVL605
-	.8byte	.LVL606-1
+.LLST103:
+	.8byte	.LVL345
+	.8byte	.LVL349
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 20
+	.8byte	.LVL352
+	.8byte	.LFE2849
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 20
+	.8byte	0
+	.8byte	0
+.LLST89:
+	.8byte	.LVL319
+	.8byte	.LVL320
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST90:
+	.8byte	.LVL319
+	.8byte	.LVL321
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST163:
-	.8byte	.LVL611
-	.8byte	.LVL614
+.LLST91:
+	.8byte	.LVL319
+	.8byte	.LVL322-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL322-1
+	.8byte	.LVL324
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST92:
+	.8byte	.LVL325
+	.8byte	.LVL326
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST164:
-	.8byte	.LVL612
-	.8byte	.LVL613
+.LLST93:
+	.8byte	.LVL325
+	.8byte	.LVL327
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST165:
-	.8byte	.LVL548
-	.8byte	.LVL552
+.LLST94:
+	.8byte	.LVL325
+	.8byte	.LVL328
 	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL616
-	.8byte	.LVL624
+	.byte	0x52
+	.8byte	.LVL328
+	.8byte	.LVL331
 	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL697
-	.8byte	.LVL699
+	.byte	0x64
+	.8byte	.LVL332
+	.8byte	.LFE2847
 	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL699
-	.8byte	.LVL700
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST95:
+	.8byte	.LVL334
+	.8byte	.LVL335
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL700
-	.8byte	.LVL702
+	.8byte	0
+	.8byte	0
+.LLST96:
+	.8byte	.LVL334
+	.8byte	.LVL336
 	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL711
-	.8byte	.LVL712
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST97:
+	.8byte	.LVL334
+	.8byte	.LVL337
 	.2byte	0x1
-	.byte	0x68
+	.byte	0x52
+	.8byte	.LVL337
+	.8byte	.LVL338-1
+	.2byte	0x1
+	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST166:
-	.8byte	.LVL619
-	.8byte	.LVL622
+.LLST104:
+	.8byte	.LVL356
+	.8byte	.LVL357-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST105:
+	.8byte	.LVL356
+	.8byte	.LVL357-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST106:
+	.8byte	.LVL356
+	.8byte	.LVL357-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL357-1
+	.8byte	.LVL359
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST18:
+	.8byte	.LVL81
+	.8byte	.LVL82
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST167:
-	.8byte	.LVL620
-	.8byte	.LVL621
+.LLST19:
+	.8byte	.LVL81
+	.8byte	.LVL83
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST168:
-	.8byte	.LVL623
-	.8byte	.LVL625-1
+.LLST16:
+	.8byte	.LVL77
+	.8byte	.LVL78-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST169:
-	.8byte	.LVL548
-	.8byte	.LVL555
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -28
-	.8byte	.LVL630
-	.8byte	.LVL668
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -28
-	.8byte	.LVL668
-	.8byte	.LVL669
+.LLST17:
+	.8byte	.LVL77
+	.8byte	.LVL78-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL672
-	.8byte	.LVL683
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -28
-	.8byte	.LVL685
-	.8byte	.LVL690
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -28
-	.8byte	.LVL706
-	.8byte	.LVL709
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -28
-	.8byte	.LVL711
-	.8byte	.LVL712
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -28
-	.8byte	.LVL714
-	.8byte	.LFE2852
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -28
+	.8byte	.LVL78-1
+	.8byte	.LVL80
+	.2byte	0x1
+	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST170:
-	.8byte	.LVL548
-	.8byte	.LVL555
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -24
-	.8byte	.LVL630
-	.8byte	.LVL680
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -24
-	.8byte	.LVL680
-	.8byte	.LVL681
+.LLST20:
+	.8byte	.LVL85
+	.8byte	.LVL86
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL685
-	.8byte	.LVL690
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -24
-	.8byte	.LVL706
-	.8byte	.LVL709
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -24
-	.8byte	.LVL711
-	.8byte	.LFE2852
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -24
+	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST171:
-	.8byte	.LVL548
-	.8byte	.LVL552
+.LLST21:
+	.8byte	.LVL85
+	.8byte	.LVL87-1
 	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL636
-	.8byte	.LVL647
+	.byte	0x51
+	.8byte	.LVL101
+	.8byte	.LVL102
 	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL651
-	.8byte	.LVL662
+	.byte	0x51
+	.8byte	.LVL104
+	.8byte	.LVL105
 	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL672
-	.8byte	.LVL674
+	.byte	0x51
+	.8byte	.LVL110
+	.8byte	.LVL112
 	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL677
-	.8byte	.LVL683
+	.byte	0x51
+	.8byte	.LVL132
+	.8byte	.LVL133-1
 	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL706
-	.8byte	.LVL709
+	.byte	0x51
+	.8byte	.LVL134
+	.8byte	.LVL136
 	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL711
-	.8byte	.LVL712
+	.byte	0x51
+	.8byte	.LVL158
+	.8byte	.LVL159-1
 	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL713
-	.8byte	.LVL714
+	.byte	0x51
+	.8byte	.LVL174
+	.8byte	.LVL176
 	.2byte	0x1
-	.byte	0x68
-	.8byte	0
-	.8byte	0
-.LLST172:
-	.8byte	.LVL548
-	.8byte	.LVL554
+	.byte	0x51
+	.8byte	.LVL188
+	.8byte	.LVL189
 	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL641
-	.8byte	.LVL664
+	.byte	0x51
+	.8byte	.LVL191
+	.8byte	.LVL192-1
 	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL671
-	.8byte	.LVL683
+	.byte	0x51
+	.8byte	.LVL193
+	.8byte	.LVL194-1
 	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL685
-	.8byte	.LVL690
+	.byte	0x51
+	.8byte	.LVL199
+	.8byte	.LVL200
 	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL706
-	.8byte	.LVL709
+	.byte	0x51
+	.8byte	.LVL210
+	.8byte	.LVL211
 	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL711
-	.8byte	.LVL712
+	.byte	0x51
+	.8byte	.LVL213
+	.8byte	.LVL214-1
 	.2byte	0x1
-	.byte	0x6c
+	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST173:
-	.8byte	.LVL548
-	.8byte	.LVL553
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL632
-	.8byte	.LVL638
+.LLST22:
+	.8byte	.LVL85
+	.8byte	.LVL101
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL639
-	.8byte	.LVL642
+	.byte	0x52
+	.8byte	.LVL101
+	.8byte	.LVL109
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL651
-	.8byte	.LVL662
+	.byte	0x65
+	.8byte	.LVL110
+	.8byte	.LVL125
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL664
-	.8byte	.LVL672
+	.byte	0x65
+	.8byte	.LVL131
+	.8byte	.LVL256
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL711
-	.8byte	.LFE2852
+	.byte	0x65
+	.8byte	.LVL258
+	.8byte	.LFE2840
 	.2byte	0x1
-	.byte	0x6a
+	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST174:
-	.8byte	.LVL548
-	.8byte	.LVL554
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL634
-	.8byte	.LVL641
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL643
-	.8byte	.LVL671
+.LLST37:
+	.8byte	.LVL106
+	.8byte	.LVL107
 	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL685
-	.8byte	.LVL690
+	.byte	0x50
+	.8byte	.LVL128
+	.8byte	.LVL129-1
 	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL711
-	.8byte	.LFE2852
+	.byte	0x50
+	.8byte	.LVL131
+	.8byte	.LVL132
 	.2byte	0x1
-	.byte	0x6c
+	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST175:
-	.8byte	.LVL548
-	.8byte	.LVL554
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL637
-	.8byte	.LVL664
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL667
-	.8byte	.LVL683
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL685
-	.8byte	.LVL690
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL706
-	.8byte	.LVL709
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL711
-	.8byte	.LVL714
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL714
-	.8byte	.LVL715
+.LLST23:
+	.8byte	.LVL94
+	.8byte	.LVL96
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL715
-	.8byte	.LFE2852
+	.8byte	.LVL97
+	.8byte	.LVL98
 	.2byte	0x1
-	.byte	0x6b
+	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST176:
-	.8byte	.LVL548
-	.8byte	.LVL553
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL638
-	.8byte	.LVL664
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL672
-	.8byte	.LVL683
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL685
-	.8byte	.LVL690
+.LLST24:
+	.8byte	.LVL97
+	.8byte	.LVL99
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL706
-	.8byte	.LVL707
+	.byte	0x50
+	.8byte	.LVL150
+	.8byte	.LVL152
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL707
-	.8byte	.LVL709
+	.8byte	0
+	.8byte	0
+.LLST25:
+	.8byte	.LVL91
+	.8byte	.LVL100-1
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL711
-	.8byte	.LVL712
+	.byte	0x51
+	.8byte	.LVL150
+	.8byte	.LVL151
 	.2byte	0x1
-	.byte	0x6a
+	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST177:
-	.8byte	.LVL548
-	.8byte	.LVL552
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL647
-	.8byte	.LVL664
+.LLST26:
+	.8byte	.LVL90
+	.8byte	.LVL93
 	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL685
-	.8byte	.LVL687
+	.byte	0x52
+	.8byte	.LVL95
+	.8byte	.LVL100-1
 	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL711
-	.8byte	.LVL712
+	.byte	0x52
+	.8byte	.LVL150
+	.8byte	.LVL154
 	.2byte	0x1
-	.byte	0x68
+	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST81:
-	.8byte	.LVL312
-	.8byte	.LVL313
+.LLST27:
+	.8byte	.LVL155
+	.8byte	.LVL157-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST82:
-	.8byte	.LVL312
-	.8byte	.LVL314-1
+.LLST28:
+	.8byte	.LVL153
+	.8byte	.LVL156
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST83:
-	.8byte	.LVL312
-	.8byte	.LVL314-1
+.LLST29:
+	.8byte	.LVL152
+	.8byte	.LVL155
 	.2byte	0x1
-	.byte	0x52
+	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST84:
-	.8byte	.LVL315
-	.8byte	.LVL316
+.LLST30:
+	.8byte	.LVL113
+	.8byte	.LVL114
 	.2byte	0x1
 	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST85:
-	.8byte	.LVL315
-	.8byte	.LVL317
+	.8byte	.LVL115
+	.8byte	.LVL116
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x50
+	.8byte	.LVL227
+	.8byte	.LVL228
+	.2byte	0x1
+	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST86:
-	.8byte	.LVL315
-	.8byte	.LVL318
+.LLST31:
+	.8byte	.LVL106
+	.8byte	.LVL107
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL318
-	.8byte	.LVL319-1
+	.byte	0x50
+	.8byte	.LVL115
+	.8byte	.LVL117
 	.2byte	0x1
 	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST87:
-	.8byte	.LVL320
-	.8byte	.LVL321
+	.8byte	.LVL255
+	.8byte	.LVL256
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST88:
-	.8byte	.LVL320
-	.8byte	.LVL322
+.LLST32:
+	.8byte	.LVL106
+	.8byte	.LVL108
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL112
+	.8byte	.LVL118
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL226
+	.8byte	.LVL228
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL255
+	.8byte	.LVL256
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST89:
-	.8byte	.LVL320
-	.8byte	.LVL323
+.LLST33:
+	.8byte	.LVL111
+	.8byte	.LVL114
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL323
-	.8byte	.LVL324-1
+	.byte	0x50
+	.8byte	.LVL226
+	.8byte	.LVL227
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST99:
-	.8byte	.LVL345
-	.8byte	.LVL346
+.LLST34:
+	.8byte	.LVL120
+	.8byte	.LVL122-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST35:
+	.8byte	.LVL119
+	.8byte	.LVL121
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST100:
-	.8byte	.LVL345
-	.8byte	.LVL347
+.LLST36:
+	.8byte	.LVL118
+	.8byte	.LVL120
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST101:
-	.8byte	.LVL345
-	.8byte	.LVL349
+.LLST38:
+	.8byte	.LVL137
+	.8byte	.LVL138
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL349
-	.8byte	.LVL354
+	.byte	0x50
+	.8byte	.LVL139
+	.8byte	.LVL140
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL355
-	.8byte	.LFE2842
+	.byte	0x50
+	.8byte	.LVL225
+	.8byte	.LVL226
 	.2byte	0x1
-	.byte	0x65
+	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST102:
-	.8byte	.LVL345
-	.8byte	.LVL350-1
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL350-1
-	.8byte	.LVL353
+.LLST39:
+	.8byte	.LVL106
+	.8byte	.LVL107
 	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL355
-	.8byte	.LVL356
+	.byte	0x50
+	.8byte	.LVL139
+	.8byte	.LVL141
 	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL358
-	.8byte	.LVL359
+	.byte	0x50
+	.8byte	.LVL255
+	.8byte	.LVL256
 	.2byte	0x1
-	.byte	0x64
+	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST103:
-	.8byte	.LVL348
-	.8byte	.LVL354
+.LLST40:
+	.8byte	.LVL106
+	.8byte	.LVL108
 	.2byte	0x1
-	.byte	0x66
-	.8byte	.LVL355
-	.8byte	.LFE2842
+	.byte	0x51
+	.8byte	.LVL136
+	.8byte	.LVL142
 	.2byte	0x1
-	.byte	0x66
-	.8byte	0
-	.8byte	0
-.LLST104:
-	.8byte	.LVL351
-	.8byte	.LVL355
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 20
-	.8byte	.LVL358
-	.8byte	.LFE2842
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 20
-	.8byte	0
-	.8byte	0
-.LLST90:
-	.8byte	.LVL325
-	.8byte	.LVL326
+	.byte	0x51
+	.8byte	.LVL224
+	.8byte	.LVL226
 	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST91:
-	.8byte	.LVL325
-	.8byte	.LVL327
+	.byte	0x51
+	.8byte	.LVL255
+	.8byte	.LVL256
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST92:
-	.8byte	.LVL325
-	.8byte	.LVL328-1
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL328-1
-	.8byte	.LVL330
+.LLST41:
+	.8byte	.LVL135
+	.8byte	.LVL138
 	.2byte	0x1
-	.byte	0x63
-	.8byte	0
-	.8byte	0
-.LLST93:
-	.8byte	.LVL331
-	.8byte	.LVL332
+	.byte	0x50
+	.8byte	.LVL224
+	.8byte	.LVL225
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST94:
-	.8byte	.LVL331
-	.8byte	.LVL333
+.LLST42:
+	.8byte	.LVL144
+	.8byte	.LVL146-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST95:
-	.8byte	.LVL331
-	.8byte	.LVL334
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL334
-	.8byte	.LVL337
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL338
-	.8byte	.LFE2840
-	.2byte	0x1
-	.byte	0x64
-	.8byte	0
-	.8byte	0
-.LLST96:
-	.8byte	.LVL340
-	.8byte	.LVL341
+.LLST43:
+	.8byte	.LVL143
+	.8byte	.LVL145
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST97:
-	.8byte	.LVL340
-	.8byte	.LVL342
+.LLST44:
+	.8byte	.LVL142
+	.8byte	.LVL144
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST98:
-	.8byte	.LVL340
-	.8byte	.LVL343
+.LLST45:
+	.8byte	.LVL163
+	.8byte	.LVL164
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL343
-	.8byte	.LVL344-1
+	.byte	0x50
+	.8byte	.LVL165
+	.8byte	.LVL166
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL238
+	.8byte	.LVL239
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST105:
-	.8byte	.LVL362
-	.8byte	.LVL363-1
+.LLST46:
+	.8byte	.LVL106
+	.8byte	.LVL107
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL165
+	.8byte	.LVL168
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST106:
-	.8byte	.LVL362
-	.8byte	.LVL363-1
+.LLST47:
+	.8byte	.LVL106
+	.8byte	.LVL108
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL162
+	.8byte	.LVL167
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL236
+	.8byte	.LVL239
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST107:
-	.8byte	.LVL362
-	.8byte	.LVL363-1
+.LLST48:
+	.8byte	.LVL106
+	.8byte	.LVL108
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL363-1
-	.8byte	.LVL365
+	.8byte	.LVL161
+	.8byte	.LVL170
 	.2byte	0x1
-	.byte	0x63
+	.byte	0x52
+	.8byte	.LVL236
+	.8byte	.LVL237
+	.2byte	0x1
+	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST16:
-	.8byte	.LVL79
-	.8byte	.LVL80
+.LLST49:
+	.8byte	.LVL171
+	.8byte	.LVL173-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST17:
-	.8byte	.LVL79
-	.8byte	.LVL81
+.LLST50:
+	.8byte	.LVL169
+	.8byte	.LVL172
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST14:
-	.8byte	.LVL75
-	.8byte	.LVL76-1
+.LLST51:
+	.8byte	.LVL168
+	.8byte	.LVL171
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST15:
-	.8byte	.LVL75
-	.8byte	.LVL76-1
+.LLST52:
+	.8byte	.LVL185
+	.8byte	.LVL186
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL76-1
-	.8byte	.LVL78
+	.byte	0x50
+	.8byte	.LVL260
+	.8byte	.LVL262
 	.2byte	0x1
-	.byte	0x63
+	.byte	0x50
+	.8byte	.LVL265
+	.8byte	.LFE2840
+	.2byte	0x1
+	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST18:
-	.8byte	.LVL83
-	.8byte	.LVL84
+.LLST53:
+	.8byte	.LVL177
+	.8byte	.LVL178
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL179
+	.8byte	.LVL180
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL232
+	.8byte	.LVL233
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST19:
-	.8byte	.LVL83
-	.8byte	.LVL85-1
+.LLST54:
+	.8byte	.LVL179
+	.8byte	.LVL185-1
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL99
-	.8byte	.LVL100
+	.byte	0x50
+	.8byte	.LVL259
+	.8byte	.LVL260
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL102
-	.8byte	.LVL103
+	.byte	0x50
+	.8byte	.LVL260
+	.8byte	.LVL263-1
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL108
-	.8byte	.LVL110
+	.byte	0x53
+	.8byte	.LVL266
+	.8byte	.LFE2840
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL130
-	.8byte	.LVL131-1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST55:
+	.8byte	.LVL176
+	.8byte	.LVL181
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL132
-	.8byte	.LVL134
+	.8byte	.LVL231
+	.8byte	.LVL233
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL156
-	.8byte	.LVL157-1
+	.8byte	.LVL259
+	.8byte	.LVL261
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL172
-	.8byte	.LVL174
+	.8byte	0
+	.8byte	0
+.LLST56:
+	.8byte	.LVL175
+	.8byte	.LVL178
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL186
-	.8byte	.LVL187
+	.byte	0x50
+	.8byte	.LVL231
+	.8byte	.LVL232
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL189
-	.8byte	.LVL190-1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST57:
+	.8byte	.LVL183
+	.8byte	.LVL185-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL191
-	.8byte	.LVL192-1
+	.8byte	0
+	.8byte	0
+.LLST58:
+	.8byte	.LVL182
+	.8byte	.LVL184
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL197
-	.8byte	.LVL199
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST59:
+	.8byte	.LVL181
+	.8byte	.LVL183
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL208
-	.8byte	.LVL209
+	.8byte	0
+	.8byte	0
+.LLST60:
+	.8byte	.LVL92
+	.8byte	.LVL98
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL211
-	.8byte	.LVL212-1
+	.8byte	.LVL198
+	.8byte	.LVL199
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST20:
-	.8byte	.LVL83
-	.8byte	.LVL99
+.LLST61:
+	.8byte	.LVL92
+	.8byte	.LVL93
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL99
-	.8byte	.LVL107
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL108
-	.8byte	.LVL123
+	.8byte	.LVL95
+	.8byte	.LVL100-1
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL129
-	.8byte	.LVL254
+	.byte	0x52
+	.8byte	.LVL150
+	.8byte	.LVL154
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL256
-	.8byte	.LFE2833
+	.byte	0x52
+	.8byte	.LVL197
+	.8byte	.LVL199
 	.2byte	0x1
-	.byte	0x65
+	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST35:
-	.8byte	.LVL104
-	.8byte	.LVL105
+.LLST62:
+	.8byte	.LVL203
+	.8byte	.LVL204
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL126
-	.8byte	.LVL127-1
+	.8byte	.LVL205
+	.8byte	.LVL206
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL129
-	.8byte	.LVL130
+	.8byte	.LVL230
+	.8byte	.LVL231
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST21:
-	.8byte	.LVL92
-	.8byte	.LVL94
+.LLST63:
+	.8byte	.LVL205
+	.8byte	.LVL207
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL95
-	.8byte	.LVL96
+	.8byte	.LVL239
+	.8byte	.LVL241
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST22:
-	.8byte	.LVL95
-	.8byte	.LVL97
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL148
-	.8byte	.LVL150
+.LLST64:
+	.8byte	.LVL202
+	.8byte	.LVL208
 	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST23:
-	.8byte	.LVL89
-	.8byte	.LVL98-1
+	.byte	0x51
+	.8byte	.LVL228
+	.8byte	.LVL231
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL148
-	.8byte	.LVL149
+	.8byte	.LVL239
+	.8byte	.LVL240
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST24:
-	.8byte	.LVL88
-	.8byte	.LVL91
+.LLST65:
+	.8byte	.LVL201
+	.8byte	.LVL209-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL93
-	.8byte	.LVL98-1
+	.8byte	.LVL228
+	.8byte	.LVL229
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL148
-	.8byte	.LVL152
+	.8byte	.LVL239
+	.8byte	.LVL243
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST25:
-	.8byte	.LVL153
-	.8byte	.LVL155-1
+.LLST66:
+	.8byte	.LVL244
+	.8byte	.LVL246-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST26:
-	.8byte	.LVL151
-	.8byte	.LVL154
+.LLST67:
+	.8byte	.LVL242
+	.8byte	.LVL245
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST27:
-	.8byte	.LVL150
-	.8byte	.LVL153
+.LLST68:
+	.8byte	.LVL241
+	.8byte	.LVL244
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST28:
-	.8byte	.LVL111
-	.8byte	.LVL112
+.LLST69:
+	.8byte	.LVL218
+	.8byte	.LVL219
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL113
-	.8byte	.LVL114
+	.8byte	.LVL220
+	.8byte	.LVL221
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL225
-	.8byte	.LVL226
+	.8byte	.LVL235
+	.8byte	.LVL236
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST29:
-	.8byte	.LVL104
-	.8byte	.LVL105
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL113
-	.8byte	.LVL115
+.LLST70:
+	.8byte	.LVL220
+	.8byte	.LVL222
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL253
-	.8byte	.LVL254
+	.8byte	.LVL247
+	.8byte	.LVL249
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST30:
-	.8byte	.LVL104
-	.8byte	.LVL106
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL110
-	.8byte	.LVL116
+.LLST71:
+	.8byte	.LVL217
+	.8byte	.LVL223-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL224
-	.8byte	.LVL226
+	.8byte	.LVL233
+	.8byte	.LVL236
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL253
-	.8byte	.LVL254
+	.8byte	.LVL247
+	.8byte	.LVL248
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST31:
-	.8byte	.LVL109
-	.8byte	.LVL112
+.LLST72:
+	.8byte	.LVL216
+	.8byte	.LVL223-1
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL224
-	.8byte	.LVL225
+	.byte	0x52
+	.8byte	.LVL233
+	.8byte	.LVL234
 	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST32:
-	.8byte	.LVL118
-	.8byte	.LVL120-1
+	.byte	0x52
+	.8byte	.LVL247
+	.8byte	.LVL251
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST33:
-	.8byte	.LVL117
-	.8byte	.LVL119
+.LLST73:
+	.8byte	.LVL252
+	.8byte	.LVL254-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST34:
-	.8byte	.LVL116
-	.8byte	.LVL118
+.LLST74:
+	.8byte	.LVL250
+	.8byte	.LVL253
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST36:
-	.8byte	.LVL135
-	.8byte	.LVL136
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL137
-	.8byte	.LVL138
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL223
-	.8byte	.LVL224
+.LLST75:
+	.8byte	.LVL249
+	.8byte	.LVL252
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST37:
-	.8byte	.LVL104
-	.8byte	.LVL105
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL137
-	.8byte	.LVL139
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL253
-	.8byte	.LVL254
+.LLST76:
+	.8byte	.LVL277
+	.8byte	.LVL278-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST38:
-	.8byte	.LVL104
-	.8byte	.LVL106
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL134
-	.8byte	.LVL140
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL222
-	.8byte	.LVL224
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL253
-	.8byte	.LVL254
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST39:
-	.8byte	.LVL133
-	.8byte	.LVL136
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL222
-	.8byte	.LVL223
+.LLST14:
+	.8byte	.LVL71
+	.8byte	.LVL72
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST40:
-	.8byte	.LVL142
-	.8byte	.LVL144-1
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST41:
-	.8byte	.LVL141
-	.8byte	.LVL143
+.LLST237:
+	.8byte	.LVL849
+	.8byte	.LVL850
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST42:
-	.8byte	.LVL140
-	.8byte	.LVL142
+.LLST238:
+	.8byte	.LVL851
+	.8byte	.LVL863
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x64
+	.8byte	.LVL866
+	.8byte	.LFE2835
+	.2byte	0x1
+	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST43:
-	.8byte	.LVL161
-	.8byte	.LVL162
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL163
-	.8byte	.LVL164
+.LLST239:
+	.8byte	.LVL852
+	.8byte	.LVL864
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL236
-	.8byte	.LVL237
+	.byte	0x68
+	.8byte	.LVL866
+	.8byte	.LFE2835
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST44:
-	.8byte	.LVL104
-	.8byte	.LVL105
+.LLST240:
+	.8byte	.LVL877
+	.8byte	.LVL879-1
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL163
-	.8byte	.LVL166
+	.byte	0x57
+	.8byte	.LVL914
+	.8byte	.LVL915
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL917
+	.8byte	.LVL920-1
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x57
+	.8byte	.LVL939
+	.8byte	.LVL941-1
+	.2byte	0x1
+	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST45:
-	.8byte	.LVL104
-	.8byte	.LVL106
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL160
-	.8byte	.LVL165
+.LLST241:
+	.8byte	.LVL918
+	.8byte	.LVL919
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL234
-	.8byte	.LVL237
+	.8byte	.LVL940
+	.8byte	.LVL941-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST46:
-	.8byte	.LVL104
-	.8byte	.LVL106
+.LLST242:
+	.8byte	.LVL852
+	.8byte	.LVL865
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL159
-	.8byte	.LVL168
+	.byte	0x6a
+	.8byte	.LVL866
+	.8byte	.LVL897
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL234
-	.8byte	.LVL235
+	.byte	0x6a
+	.8byte	.LVL901
+	.8byte	.LVL904
 	.2byte	0x1
-	.byte	0x52
-	.8byte	0
-	.8byte	0
-.LLST47:
-	.8byte	.LVL169
-	.8byte	.LVL171-1
+	.byte	0x6a
+	.8byte	.LVL910
+	.8byte	.LVL959
 	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST48:
-	.8byte	.LVL167
-	.8byte	.LVL170
+	.byte	0x6a
+	.8byte	.LVL964
+	.8byte	.LVL967
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x6a
+	.8byte	.LVL968
+	.8byte	.LVL992
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL998
+	.8byte	.LFE2835
+	.2byte	0x1
+	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST49:
-	.8byte	.LVL166
-	.8byte	.LVL169
+.LLST256:
+	.8byte	.LVL973
+	.8byte	.LVL974
 	.2byte	0x1
 	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST50:
-	.8byte	.LVL183
-	.8byte	.LVL184
+	.8byte	.LVL994
+	.8byte	.LVL995-1
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL258
-	.8byte	.LVL260
+	.8byte	0
+	.8byte	0
+.LLST255:
+	.8byte	.LVL946
+	.8byte	.LVL947
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL263
-	.8byte	.LFE2833
+	.8byte	.LVL986
+	.8byte	.LVL987-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST51:
-	.8byte	.LVL175
-	.8byte	.LVL176
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL177
-	.8byte	.LVL178
+.LLST254:
+	.8byte	.LVL867
+	.8byte	.LVL868
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL230
-	.8byte	.LVL231
+	.8byte	.LVL925
+	.8byte	.LVL926-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST52:
-	.8byte	.LVL177
-	.8byte	.LVL183-1
+.LLST243:
+	.8byte	.LVL852
+	.8byte	.LVL853
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL257
-	.8byte	.LVL258
+	.8byte	.LVL869
+	.8byte	.LVL870
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL258
-	.8byte	.LVL261-1
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL264
-	.8byte	.LFE2833
+	.8byte	.LVL872
+	.8byte	.LVL873-1
 	.2byte	0x1
-	.byte	0x53
+	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST53:
-	.8byte	.LVL174
-	.8byte	.LVL179
+.LLST244:
+	.8byte	.LVL892
+	.8byte	.LVL910
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL229
-	.8byte	.LVL231
+	.byte	0x62
+	.8byte	.LVL959
+	.8byte	.LVL965-1
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL257
-	.8byte	.LVL259
+	.byte	0x62
+	.8byte	.LVL967
+	.8byte	.LVL968
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST54:
-	.8byte	.LVL173
-	.8byte	.LVL176
+.LLST245:
+	.8byte	.LVL897
+	.8byte	.LVL900
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL229
-	.8byte	.LVL230
+	.8byte	.LVL905
+	.8byte	.LVL910
 	.2byte	0x1
 	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST55:
-	.8byte	.LVL181
-	.8byte	.LVL183-1
+	.8byte	.LVL959
+	.8byte	.LVL962
 	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST56:
-	.8byte	.LVL180
-	.8byte	.LVL182
+	.byte	0x50
+	.8byte	.LVL967
+	.8byte	.LVL968
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST57:
-	.8byte	.LVL179
-	.8byte	.LVL181
+.LLST246:
+	.8byte	.LVL852
+	.8byte	.LVL865
 	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST58:
-	.8byte	.LVL90
-	.8byte	.LVL96
+	.byte	0x6a
+	.8byte	.LVL866
+	.8byte	.LVL878
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL196
-	.8byte	.LVL197
+	.byte	0x6a
+	.8byte	.LVL880
+	.8byte	.LVL897
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x6a
+	.8byte	.LVL899
+	.8byte	.LVL904
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL910
+	.8byte	.LVL917
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL922
+	.8byte	.LVL939
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL949
+	.8byte	.LVL959
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL961
+	.8byte	.LVL967
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL968
+	.8byte	.LVL984
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL990
+	.8byte	.LVL992
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL998
+	.8byte	.LFE2835
+	.2byte	0x1
+	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST59:
-	.8byte	.LVL90
-	.8byte	.LVL91
+.LLST247:
+	.8byte	.LVL896
+	.8byte	.LVL898
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL93
-	.8byte	.LVL98-1
+	.8byte	.LVL899
+	.8byte	.LVL910
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL148
-	.8byte	.LVL152
+	.8byte	.LVL959
+	.8byte	.LVL960
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL195
-	.8byte	.LVL197
+	.8byte	.LVL964
+	.8byte	.LVL965-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL967
+	.8byte	.LVL968
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST60:
-	.8byte	.LVL201
-	.8byte	.LVL202
+.LLST248:
+	.8byte	.LVL896
+	.8byte	.LVL906
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL203
-	.8byte	.LVL204
+	.byte	0x53
+	.8byte	.LVL907
+	.8byte	.LVL908
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL228
-	.8byte	.LVL229
+	.byte	0x53
+	.8byte	.LVL909
+	.8byte	.LVL910
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x53
+	.8byte	.LVL959
+	.8byte	.LVL965-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL967
+	.8byte	.LVL968
+	.2byte	0x1
+	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST61:
-	.8byte	.LVL203
-	.8byte	.LVL205
+.LLST249:
+	.8byte	.LVL896
+	.8byte	.LVL897
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL237
-	.8byte	.LVL239
+	.byte	0x55
+	.8byte	.LVL900
+	.8byte	.LVL902
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x55
+	.8byte	.LVL902
+	.8byte	.LVL903
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL963
+	.8byte	.LVL965-1
+	.2byte	0x1
+	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST62:
-	.8byte	.LVL200
-	.8byte	.LVL206
+.LLST250:
+	.8byte	.LVL895
+	.8byte	.LVL910
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL226
-	.8byte	.LVL229
+	.byte	0x61
+	.8byte	.LVL959
+	.8byte	.LVL965-1
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL237
-	.8byte	.LVL238
+	.byte	0x61
+	.8byte	.LVL967
+	.8byte	.LVL968
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x61
 	.8byte	0
 	.8byte	0
-.LLST63:
-	.8byte	.LVL198
-	.8byte	.LVL207-1
+.LLST251:
+	.8byte	.LVL893
+	.8byte	.LVL910
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL226
-	.8byte	.LVL227
+	.byte	0x5a
+	.8byte	.LVL959
+	.8byte	.LVL965-1
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL237
-	.8byte	.LVL241
+	.byte	0x5a
+	.8byte	.LVL967
+	.8byte	.LVL968
 	.2byte	0x1
-	.byte	0x52
+	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST64:
-	.8byte	.LVL242
-	.8byte	.LVL244-1
+.LLST252:
+	.8byte	.LVL895
+	.8byte	.LVL910
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x60
+	.8byte	.LVL959
+	.8byte	.LVL965-1
+	.2byte	0x1
+	.byte	0x60
+	.8byte	.LVL967
+	.8byte	.LVL968
+	.2byte	0x1
+	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST65:
-	.8byte	.LVL240
-	.8byte	.LVL243
+.LLST253:
+	.8byte	.LVL852
+	.8byte	.LVL857
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x69
+	.8byte	.LVL860
+	.8byte	.LVL865
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL866
+	.8byte	.LVL876
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL880
+	.8byte	.LVL881
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL885
+	.8byte	.LVL887
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL894
+	.8byte	.LVL910
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL916
+	.8byte	.LVL917
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL922
+	.8byte	.LVL930
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL954
+	.8byte	.LVL957
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL959
+	.8byte	.LVL971
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL977
+	.8byte	.LVL984
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL998
+	.8byte	.LVL1000
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1002
+	.8byte	.LFE2835
+	.2byte	0x1
+	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST66:
-	.8byte	.LVL239
-	.8byte	.LVL242
+.LLST77:
+	.8byte	.LVL279
+	.8byte	.LVL280
 	.2byte	0x1
 	.byte	0x50
+	.8byte	.LVL280
+	.8byte	.LVL287
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL289
+	.8byte	.LFE2832
+	.2byte	0x1
+	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST67:
-	.8byte	.LVL216
-	.8byte	.LVL217
+.LLST78:
+	.8byte	.LVL279
+	.8byte	.LVL281
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL218
-	.8byte	.LVL219
+	.byte	0x51
+	.8byte	.LVL281
+	.8byte	.LVL288
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL233
-	.8byte	.LVL234
+	.byte	0x67
+	.8byte	.LVL289
+	.8byte	.LFE2832
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x67
 	.8byte	0
 	.8byte	0
-.LLST68:
-	.8byte	.LVL218
-	.8byte	.LVL220
+.LLST79:
+	.8byte	.LVL282
+	.8byte	.LVL284
+	.2byte	0x2
+	.byte	0x70
+	.sleb128 -12
+	.8byte	.LVL284
+	.8byte	.LVL290
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 36
+	.8byte	.LVL290
+	.8byte	.LVL293
+	.2byte	0x2
+	.byte	0x70
+	.sleb128 -12
+	.8byte	.LVL293
+	.8byte	.LFE2832
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 36
+	.8byte	0
+	.8byte	0
+.LLST192:
+	.8byte	.LVL575
+	.8byte	.LVL576
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL245
-	.8byte	.LVL247
+	.8byte	0
+	.8byte	0
+.LLST191:
+	.8byte	.LVL548
+	.8byte	.LVL549
 	.2byte	0x1
 	.byte	0x50
+	.8byte	.LVL549
+	.8byte	.LVL553
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL554
+	.8byte	.LVL558
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL559
+	.8byte	.LVL563
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL564
+	.8byte	.LVL568
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL569
+	.8byte	.LVL571
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL572
+	.8byte	.LVL574
+	.2byte	0x1
+	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST69:
-	.8byte	.LVL215
-	.8byte	.LVL221-1
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL231
-	.8byte	.LVL234
+.LLST144:
+	.8byte	.LVL440
+	.8byte	.LVL487
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL245
-	.8byte	.LVL246
+	.8byte	.LVL488
+	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST70:
-	.8byte	.LVL214
-	.8byte	.LVL221-1
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL231
-	.8byte	.LVL232
+.LLST145:
+	.8byte	.LVL440
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL245
-	.8byte	.LVL249
+	.8byte	.LVL488
+	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST71:
-	.8byte	.LVL250
-	.8byte	.LVL252-1
+.LLST146:
+	.8byte	.LVL440
+	.8byte	.LVL441
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x53
+	.8byte	.LVL460
+	.8byte	.LVL462
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL492
+	.8byte	.LVL493
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL505
+	.8byte	.LVL506
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL521
+	.8byte	.LVL522
+	.2byte	0x1
+	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST72:
-	.8byte	.LVL248
-	.8byte	.LVL251
+.LLST147:
+	.8byte	.LVL450
+	.8byte	.LVL451
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST73:
-	.8byte	.LVL247
-	.8byte	.LVL250
+.LLST148:
+	.8byte	.LVL447
+	.8byte	.LVL448
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x57
+	.8byte	.LVL449
+	.8byte	.LVL452
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL453
+	.8byte	.LVL460
+	.2byte	0x1
+	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST74:
-	.8byte	.LVL275
-	.8byte	.LVL276-1
+.LLST149:
+	.8byte	.LVL445
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST12:
-	.8byte	.LVL69
-	.8byte	.LVL70
+.LLST150:
+	.8byte	.LVL446
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST192:
-	.8byte	.LVL770
-	.8byte	.LVL771
+.LLST151:
+	.8byte	.LVL442
+	.8byte	.LVL443
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST193:
-	.8byte	.LVL772
-	.8byte	.LVL807
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL810
-	.8byte	.LFE2828
+.LLST152:
+	.8byte	.LVL444
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x64
+	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST194:
-	.8byte	.LVL773
-	.8byte	.LVL808
+.LLST153:
+	.8byte	.LVL454
+	.8byte	.LVL460
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL469
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL486
+	.8byte	.LVL492
 	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL810
-	.8byte	.LFE2828
+	.byte	0x54
+	.8byte	.LVL519
+	.8byte	.LVL520
 	.2byte	0x1
-	.byte	0x68
+	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST195:
-	.8byte	.LVL823
-	.8byte	.LVL825-1
+.LLST154:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL834
-	.8byte	.LVL835
+	.byte	0x53
+	.8byte	.LVL473
+	.8byte	.LVL482
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL836
-	.8byte	.LVL838-1
+	.byte	0x53
+	.8byte	.LVL486
+	.8byte	.LVL489
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL860
-	.8byte	.LVL862-1
+	.byte	0x53
+	.8byte	.LVL519
+	.8byte	.LVL520
 	.2byte	0x1
-	.byte	0x57
+	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST196:
-	.8byte	.LVL837
-	.8byte	.LVL838-1
+.LLST155:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL861
-	.8byte	.LVL862-1
+	.8byte	.LVL469
+	.8byte	.LVL492
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL519
+	.8byte	.LVL520
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST197:
-	.8byte	.LVL773
-	.8byte	.LVL789
+.LLST156:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL793
-	.8byte	.LVL796
+	.byte	0x52
+	.8byte	.LVL469
+	.8byte	.LVL492
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL802
-	.8byte	.LVL809
+	.byte	0x52
+	.8byte	.LVL519
+	.8byte	.LVL520
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL810
-	.8byte	.LVL886
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST157:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL891
-	.8byte	.LVL894
+	.byte	0x55
+	.8byte	.LVL469
+	.8byte	.LVL470
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL895
-	.8byte	.LVL900
+	.byte	0x55
+	.8byte	.LVL471
+	.8byte	.LVL472
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL906
-	.8byte	.LFE2828
+	.byte	0x55
+	.8byte	.LVL488
+	.8byte	.LVL490
 	.2byte	0x1
-	.byte	0x6a
+	.byte	0x55
+	.8byte	.LVL491
+	.8byte	.LVL492
+	.2byte	0x1
+	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST211:
-	.8byte	.LVL882
-	.8byte	.LVL883
+.LLST158:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL902
-	.8byte	.LVL903-1
+	.byte	0x5d
+	.8byte	.LVL466
+	.8byte	.LVL492
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x5d
+	.8byte	.LVL519
+	.8byte	.LVL520
+	.2byte	0x1
+	.byte	0x5d
 	.8byte	0
 	.8byte	0
-.LLST210:
-	.8byte	.LVL867
-	.8byte	.LVL868
+.LLST159:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL912
-	.8byte	.LVL913-1
+	.byte	0x5b
+	.8byte	.LVL467
+	.8byte	.LVL492
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x5b
+	.8byte	.LVL519
+	.8byte	.LVL520
+	.2byte	0x1
+	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST209:
-	.8byte	.LVL803
-	.8byte	.LVL804
+.LLST160:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL843
-	.8byte	.LVL844-1
+	.byte	0x5f
+	.8byte	.LVL468
+	.8byte	.LVL492
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x5f
+	.8byte	.LVL519
+	.8byte	.LVL520
+	.2byte	0x1
+	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST198:
-	.8byte	.LVL805
-	.8byte	.LVL806
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL812
-	.8byte	.LVL813-1
+.LLST161:
+	.8byte	.LVL463
+	.8byte	.LVL464
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST199:
-	.8byte	.LVL784
-	.8byte	.LVL802
+.LLST162:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL886
-	.8byte	.LVL892-1
+	.byte	0x59
+	.8byte	.LVL465
+	.8byte	.LVL492
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL894
-	.8byte	.LVL895
+	.byte	0x59
+	.8byte	.LVL519
+	.8byte	.LVL520
 	.2byte	0x1
-	.byte	0x62
+	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST200:
-	.8byte	.LVL789
-	.8byte	.LVL792
+.LLST163:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL797
-	.8byte	.LVL802
+	.byte	0x57
+	.8byte	.LVL469
+	.8byte	.LVL474
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL886
-	.8byte	.LVL889
+	.byte	0x57
+	.8byte	.LVL483
+	.8byte	.LVL492
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL894
-	.8byte	.LVL895
+	.byte	0x57
+	.8byte	.LVL519
+	.8byte	.LVL520
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST201:
-	.8byte	.LVL773
-	.8byte	.LVL789
+.LLST164:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL791
-	.8byte	.LVL796
+	.byte	0x62
+	.8byte	.LVL469
+	.8byte	.LVL477
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL802
-	.8byte	.LVL809
+	.byte	0x62
+	.8byte	.LVL478
+	.8byte	.LVL479
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL810
-	.8byte	.LVL824
+	.byte	0x62
+	.8byte	.LVL480
+	.8byte	.LVL484
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL826
-	.8byte	.LVL836
+	.byte	0x62
+	.8byte	.LVL485
+	.8byte	.LVL492
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL840
-	.8byte	.LVL860
+	.byte	0x62
+	.8byte	.LVL519
+	.8byte	.LVL520
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL870
-	.8byte	.LVL886
+	.byte	0x62
+	.8byte	0
+	.8byte	0
+.LLST165:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL888
-	.8byte	.LVL894
+	.byte	0x62
+	.8byte	.LVL469
+	.8byte	.LVL475
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL895
-	.8byte	.LVL900
+	.byte	0x62
+	.8byte	.LVL476
+	.8byte	.LVL479
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL906
-	.8byte	.LVL910
+	.byte	0x62
+	.8byte	.LVL480
+	.8byte	.LVL484
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL916
-	.8byte	.LFE2828
+	.byte	0x62
+	.8byte	.LVL485
+	.8byte	.LVL492
 	.2byte	0x1
-	.byte	0x6a
+	.byte	0x62
+	.8byte	.LVL519
+	.8byte	.LVL520
+	.2byte	0x1
+	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST202:
-	.8byte	.LVL788
-	.8byte	.LVL790
+.LLST166:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL791
-	.8byte	.LVL802
+	.byte	0x62
+	.8byte	.LVL469
+	.8byte	.LVL475
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL886
-	.8byte	.LVL887
+	.byte	0x62
+	.8byte	.LVL476
+	.8byte	.LVL477
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL891
-	.8byte	.LVL892-1
+	.byte	0x62
+	.8byte	.LVL478
+	.8byte	.LVL484
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL894
-	.8byte	.LVL895
+	.byte	0x62
+	.8byte	.LVL485
+	.8byte	.LVL492
 	.2byte	0x1
-	.byte	0x52
+	.byte	0x62
+	.8byte	.LVL519
+	.8byte	.LVL520
+	.2byte	0x1
+	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST203:
-	.8byte	.LVL788
-	.8byte	.LVL798
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL799
-	.8byte	.LVL800
+.LLST167:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL801
-	.8byte	.LVL802
+	.byte	0x57
+	.8byte	.LVL499
+	.8byte	.LVL500
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL886
-	.8byte	.LVL892-1
+	.byte	0x57
+	.8byte	.LVL501
+	.8byte	.LVL503
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL894
-	.8byte	.LVL895
+	.byte	0x57
+	.8byte	.LVL504
+	.8byte	.LVL505
 	.2byte	0x1
-	.byte	0x53
+	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST204:
-	.8byte	.LVL788
-	.8byte	.LVL789
+.LLST168:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL792
-	.8byte	.LVL794
+	.byte	0x5e
+	.8byte	.LVL497
+	.8byte	.LVL505
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL794
-	.8byte	.LVL795
+	.byte	0x5e
+	.8byte	0
+	.8byte	0
+.LLST169:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL890
-	.8byte	.LVL892-1
+	.byte	0x5a
+	.8byte	.LVL498
+	.8byte	.LVL505
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST205:
-	.8byte	.LVL787
-	.8byte	.LVL802
+.LLST170:
+	.8byte	.LVL494
+	.8byte	.LVL495
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL886
-	.8byte	.LVL892-1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST171:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL894
-	.8byte	.LVL895
+	.byte	0x56
+	.8byte	.LVL496
+	.8byte	.LVL505
 	.2byte	0x1
-	.byte	0x61
+	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST206:
-	.8byte	.LVL785
-	.8byte	.LVL802
+.LLST172:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL886
-	.8byte	.LVL892-1
+	.byte	0x5b
+	.8byte	.LVL512
+	.8byte	.LVL513
 	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL894
-	.8byte	.LVL895
+	.byte	0x5b
+	.8byte	.LVL514
+	.8byte	.LVL515
 	.2byte	0x1
-	.byte	0x5a
+	.byte	0x5b
+	.8byte	.LVL516
+	.8byte	.LVL517
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL518
+	.8byte	.LVL519
+	.2byte	0x1
+	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST207:
-	.8byte	.LVL787
-	.8byte	.LVL802
+.LLST173:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL886
-	.8byte	.LVL892-1
+	.byte	0x62
+	.8byte	.LVL510
+	.8byte	.LVL519
 	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL894
-	.8byte	.LVL895
+	.byte	0x62
+	.8byte	.LVL520
+	.8byte	.LVL521
 	.2byte	0x1
-	.byte	0x60
+	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST208:
-	.8byte	.LVL773
-	.8byte	.LVL777
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL786
-	.8byte	.LVL809
+.LLST174:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL810
-	.8byte	.LVL816
+	.byte	0x5d
+	.8byte	.LVL511
+	.8byte	.LVL519
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL817
-	.8byte	.LVL820
+	.byte	0x5d
+	.8byte	.LVL520
+	.8byte	.LVL521
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL821
-	.8byte	.LVL822
+	.byte	0x5d
+	.8byte	0
+	.8byte	0
+.LLST175:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL826
-	.8byte	.LVL827
+	.byte	0x5f
+	.8byte	.LVL461
+	.8byte	.LVL468
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL831
-	.8byte	.LVL833
+	.byte	0x5f
+	.8byte	.LVL505
+	.8byte	.LVL519
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL835
-	.8byte	.LVL836
+	.byte	0x5f
+	.8byte	.LVL520
+	.8byte	.LVL521
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL840
-	.8byte	.LVL848
+	.byte	0x5f
+	.8byte	0
+	.8byte	0
+.LLST176:
+	.8byte	.LVL507
+	.8byte	.LVL508
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL877
-	.8byte	.LVL880
+	.byte	0x5c
+	.8byte	0
+	.8byte	0
+.LLST177:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL886
-	.8byte	.LVL899
+	.byte	0x5c
+	.8byte	.LVL509
+	.8byte	.LVL519
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL906
-	.8byte	.LVL910
+	.byte	0x5c
+	.8byte	.LVL520
+	.8byte	.LVL521
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL916
-	.8byte	.LVL918
+	.byte	0x5c
+	.8byte	0
+	.8byte	0
+.LLST178:
+	.8byte	.LVL454
+	.8byte	.LVL455
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL921
-	.8byte	.LVL923
+	.byte	0x64
+	.8byte	.LVL512
+	.8byte	.LVL519
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL925
-	.8byte	.LFE2828
+	.byte	0x64
+	.8byte	.LVL520
+	.8byte	.LVL521
 	.2byte	0x1
-	.byte	0x69
+	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST75:
-	.8byte	.LVL277
-	.8byte	.LVL283
+.LLST179:
+	.8byte	.LVL454
+	.8byte	.LVL457
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL512
+	.8byte	.LVL519
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL284
-	.8byte	.LVL285
+	.byte	0x68
+	.8byte	.LVL520
+	.8byte	.LVL521
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST76:
-	.8byte	.LVL277
-	.8byte	.LVL278
+.LLST180:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL278
-	.8byte	.LVL279
+	.byte	0x60
+	.8byte	.LVL529
+	.8byte	.LVL530
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL279
-	.8byte	.LVL281
+	.byte	0x60
+	.8byte	.LVL531
+	.8byte	.LVL538
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL284
-	.8byte	.LVL286-1
+	.byte	0x60
+	.8byte	.LVL539
+	.8byte	.LFE2826
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST77:
-	.8byte	.LVL282
-	.8byte	.LVL286-1
+.LLST181:
+	.8byte	.LVL454
+	.8byte	.LVL456
 	.2byte	0x1
-	.byte	0x52
-	.8byte	0
-	.8byte	0
-.LLST78:
-	.8byte	.LVL280
-	.8byte	.LVL286-1
+	.byte	0x66
+	.8byte	.LVL526
+	.8byte	.LFE2826
 	.2byte	0x1
-	.byte	0x54
+	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST79:
-	.8byte	.LVL287
-	.8byte	.LVL288
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL288
-	.8byte	.LVL294
+.LLST182:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL295
-	.8byte	.LFE2825
+	.byte	0x61
+	.8byte	.LVL527
+	.8byte	.LFE2826
 	.2byte	0x1
-	.byte	0x65
+	.byte	0x61
 	.8byte	0
 	.8byte	0
-.LLST80:
-	.8byte	.LVL289
-	.8byte	.LVL291
-	.2byte	0x2
-	.byte	0x71
-	.sleb128 -12
-	.8byte	.LVL291
-	.8byte	.LVL296
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 20
-	.8byte	.LVL296
-	.8byte	.LVL299
-	.2byte	0x2
-	.byte	0x71
-	.sleb128 -12
-	.8byte	.LVL299
-	.8byte	.LFE2825
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 20
+.LLST183:
+	.8byte	.LVL454
+	.8byte	.LVL455
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL528
+	.8byte	.LFE2826
+	.2byte	0x1
+	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST149:
-	.8byte	.LVL498
-	.8byte	.LVL499
+.LLST184:
+	.8byte	.LVL523
+	.8byte	.LVL524
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST148:
-	.8byte	.LVL471
-	.8byte	.LVL472
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL472
-	.8byte	.LVL476
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL477
-	.8byte	.LVL481
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL482
-	.8byte	.LVL486
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL487
-	.8byte	.LVL491
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL492
-	.8byte	.LVL494
+.LLST185:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL495
-	.8byte	.LVL497
+	.byte	0x5f
+	.8byte	.LVL525
+	.8byte	.LFE2826
 	.2byte	0x1
-	.byte	0x64
+	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST6:
-	.8byte	.LVL36
-	.8byte	.LVL45
-	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL46
-	.8byte	.LVL48
-	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL49
-	.8byte	.LVL51
+.LLST186:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL52
-	.8byte	.LVL53
+	.byte	0x54
+	.8byte	.LVL529
+	.8byte	.LVL532
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL54
-	.8byte	.LVL55
+	.byte	0x54
+	.8byte	.LVL534
+	.8byte	.LVL536
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL56
-	.8byte	.LVL57
+	.byte	0x54
+	.8byte	.LVL537
+	.8byte	.LFE2826
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL58
-	.8byte	.LVL59
+	.byte	0x54
+	.8byte	0
+	.8byte	0
+.LLST187:
+	.8byte	.LVL454
+	.8byte	.LVL458
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL60
-	.8byte	.LFE2813
+	.byte	0x69
+	.8byte	.LVL529
+	.8byte	.LFE2826
 	.2byte	0x1
-	.byte	0x56
+	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST7:
-	.8byte	.LVL36
-	.8byte	.LVL37
+.LLST188:
+	.8byte	.LVL454
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL38
-	.8byte	.LVL40
+	.byte	0x54
+	.8byte	.LVL529
+	.8byte	.LVL532
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL41
-	.8byte	.LVL43
+	.byte	0x54
+	.8byte	.LVL533
+	.8byte	.LVL534
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL44
-	.8byte	.LVL47
+	.byte	0x54
+	.8byte	.LVL535
+	.8byte	.LVL536
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL50
-	.8byte	.LFE2813
+	.byte	0x54
+	.8byte	.LVL537
+	.8byte	.LFE2826
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST8:
-	.8byte	.LVL38
-	.8byte	.LVL39
+.LLST189:
+	.8byte	.LVL454
+	.8byte	.LVL459
 	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL61
-	.8byte	.LFE2813
+	.byte	0x6e
+	.8byte	.LVL529
+	.8byte	.LFE2826
 	.2byte	0x1
-	.byte	0x5a
+	.byte	0x6e
 	.8byte	0
 	.8byte	0
-.LLST9:
-	.8byte	.LVL36
-	.8byte	.LVL42
-	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL44
-	.8byte	.LVL47
+.LLST107:
+	.8byte	.LVL361
+	.8byte	.LVL392
 	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL50
-	.8byte	.LFE2813
+	.byte	0x51
+	.8byte	.LVL393
+	.8byte	.LFE2820
 	.2byte	0x1
-	.byte	0x58
+	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST0:
-	.8byte	.LVL4
-	.8byte	.LVL31
+.LLST108:
+	.8byte	.LVL361
+	.8byte	.LVL393
 	.2byte	0x1
-	.byte	0x5e
-	.8byte	0
-	.8byte	0
-.LLST1:
-	.8byte	.LVL3
-	.8byte	.LVL31
+	.byte	0x52
+	.8byte	.LVL393
+	.8byte	.LFE2820
 	.2byte	0x1
-	.byte	0x5c
+	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST2:
-	.8byte	.LVL5
-	.8byte	.LVL6
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL7
-	.8byte	.LVL14
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL16
-	.8byte	.LVL18
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL19
-	.8byte	.LVL20
+.LLST109:
+	.8byte	.LVL361
+	.8byte	.LVL362
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL21
-	.8byte	.LVL22
+	.byte	0x53
+	.8byte	.LVL376
+	.8byte	.LVL378
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL23
-	.8byte	.LVL24
+	.byte	0x53
+	.8byte	.LVL396
+	.8byte	.LVL397
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL25
-	.8byte	.LVL26
+	.byte	0x53
+	.8byte	.LVL409
+	.8byte	.LVL410
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL27
-	.8byte	.LVL28
+	.byte	0x53
+	.8byte	.LVL424
+	.8byte	.LVL425
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL29
-	.8byte	.LVL31
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST110:
+	.8byte	.LVL371
+	.8byte	.LVL372
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST3:
-	.8byte	.LVL5
-	.8byte	.LVL9
+.LLST111:
+	.8byte	.LVL368
+	.8byte	.LVL369
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL10
-	.8byte	.LVL15
+	.8byte	.LVL370
+	.8byte	.LVL373
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL17
-	.8byte	.LVL31
+	.8byte	.LVL374
+	.8byte	.LVL376
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST4:
-	.8byte	.LVL7
-	.8byte	.LVL8
-	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL30
-	.8byte	.LVL31
+.LLST112:
+	.8byte	.LVL366
+	.8byte	.LVL376
 	.2byte	0x1
-	.byte	0x5a
+	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST5:
-	.8byte	.LVL5
-	.8byte	.LVL11
-	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL12
-	.8byte	.LVL13
-	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL17
-	.8byte	.LVL31
+.LLST113:
+	.8byte	.LVL367
+	.8byte	.LVL376
 	.2byte	0x1
-	.byte	0x58
+	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST189:
-	.8byte	.LVL758
-	.8byte	.LVL760
+.LLST114:
+	.8byte	.LVL363
+	.8byte	.LVL364
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST190:
-	.8byte	.LVL759
-	.8byte	.LVL762
+.LLST115:
+	.8byte	.LVL365
+	.8byte	.LVL376
 	.2byte	0x1
-	.byte	0x63
+	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST191:
-	.8byte	.LVL762
-	.8byte	.LVL765
+.LLST116:
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL766
-	.8byte	.LVL769
+	.byte	0x60
+	.8byte	.LVL384
+	.8byte	.LVL396
 	.2byte	0x1
-	.byte	0x63
+	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST185:
-	.8byte	.LVL747
-	.8byte	.LVL752
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL757
-	.8byte	.LFE2809
+.LLST117:
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
-	.byte	0x53
-	.8byte	0
-	.8byte	0
-.LLST186:
-	.8byte	.LVL753
-	.8byte	.LVL754
+	.byte	0x5e
+	.8byte	.LVL382
+	.8byte	.LVL396
 	.2byte	0x1
-	.byte	0x53
+	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST187:
-	.8byte	.LVL751
-	.8byte	.LVL755
+.LLST118:
+	.8byte	.LVL388
+	.8byte	.LVL390
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST188:
-	.8byte	.LVL754
-	.8byte	.LVL756
+.LLST119:
+	.8byte	.LVL389
+	.8byte	.LVL391
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST179:
-	.8byte	.LVL725
-	.8byte	.LVL731
-	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL735
-	.8byte	.LVL736
-	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL745
-	.8byte	.LVL746
+.LLST120:
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
-	.byte	0x54
-	.8byte	0
-	.8byte	0
-.LLST180:
-	.8byte	.LVL725
-	.8byte	.LVL726
+	.byte	0x51
+	.8byte	.LVL385
+	.8byte	.LVL396
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST181:
-	.8byte	.LVL731
-	.8byte	.LVL734
-	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL738
-	.8byte	.LVL743
+.LLST121:
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL746
-	.8byte	.LFE2808
+	.byte	0x52
+	.8byte	.LVL385
+	.8byte	.LVL396
 	.2byte	0x1
-	.byte	0x54
+	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST182:
-	.8byte	.LVL730
-	.8byte	.LVL731
+.LLST122:
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL733
-	.8byte	.LVL737
+	.byte	0x56
+	.8byte	.LVL385
+	.8byte	.LVL386
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL742
-	.8byte	.LVL746
+	.byte	0x56
+	.8byte	.LVL387
+	.8byte	.LVL394
 	.2byte	0x1
-	.byte	0x59
+	.byte	0x56
+	.8byte	.LVL395
+	.8byte	.LVL396
+	.2byte	0x1
+	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST183:
-	.8byte	.LVL730
-	.8byte	.LVL732
+.LLST123:
+	.8byte	.LVL379
+	.8byte	.LVL380
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL733
-	.8byte	.LVL741
+	.8byte	0
+	.8byte	0
+.LLST124:
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL744
-	.8byte	.LFE2808
+	.8byte	.LVL381
+	.8byte	.LVL396
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST184:
-	.8byte	.LVL730
-	.8byte	.LVL739
+.LLST125:
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL740
-	.8byte	.LFE2808
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x57
-	.8byte	0
-	.8byte	0
-.LLST10:
-	.8byte	.LVL62
-	.8byte	.LVL63
+	.8byte	.LVL405
+	.8byte	.LVL407
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x57
+	.8byte	.LVL408
+	.8byte	.LVL409
+	.2byte	0x1
+	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST108:
-	.8byte	.LVL367
-	.8byte	.LVL396
+.LLST126:
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x5e
 	.8byte	.LVL401
-	.8byte	.LVL404
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL407
-	.8byte	.LFE2816
+	.8byte	.LVL409
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST109:
-	.8byte	.LVL367
-	.8byte	.LVL395
+.LLST127:
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL401
-	.8byte	.LVL404
+	.byte	0x5a
+	.8byte	.LVL402
+	.8byte	.LVL409
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL407
-	.8byte	.LFE2816
+	.byte	0x5a
+	.8byte	0
+	.8byte	0
+.LLST128:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
-	.byte	0x52
+	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST110:
-	.8byte	.LVL367
-	.8byte	.LVL369
+.LLST129:
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL383
-	.8byte	.LVL385
+	.byte	0x55
+	.8byte	.LVL400
+	.8byte	.LVL409
 	.2byte	0x1
-	.byte	0x53
+	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST111:
-	.8byte	.LVL368
-	.8byte	.LVL384
+.LLST130:
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL408
-	.8byte	.LFE2816
+	.8byte	.LVL377
+	.8byte	.LVL383
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	.LVL409
+	.8byte	.LVL424
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
-.LLST112:
-	.8byte	.LVL373
-	.8byte	.LVL383
+.LLST131:
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL408
-	.8byte	.LFE2816
+	.8byte	.LVL414
+	.8byte	.LVL424
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST113:
-	.8byte	.LVL374
-	.8byte	.LVL383
+.LLST132:
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL408
-	.8byte	.LFE2816
+	.8byte	.LVL415
+	.8byte	.LVL424
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST114:
-	.8byte	.LVL378
-	.8byte	.LVL380
+.LLST133:
+	.8byte	.LVL419
+	.8byte	.LVL421
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST115:
+.LLST134:
 	.8byte	.LVL375
 	.8byte	.LVL376
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL377
-	.8byte	.LVL381
+	.8byte	.LVL416
+	.8byte	.LVL417
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL382
-	.8byte	.LVL383
+	.8byte	.LVL418
+	.8byte	.LVL422
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL408
-	.8byte	.LFE2816
+	.8byte	.LVL423
+	.8byte	.LVL424
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST116:
-	.8byte	.LVL370
-	.8byte	.LVL371
+.LLST135:
+	.8byte	.LVL411
+	.8byte	.LVL412
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST117:
-	.8byte	.LVL372
-	.8byte	.LVL383
+.LLST136:
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL408
-	.8byte	.LFE2816
+	.8byte	.LVL413
+	.8byte	.LVL424
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST118:
-	.8byte	.LVL395
-	.8byte	.LVL397
+.LLST137:
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
-	.byte	0x52
-	.8byte	0
-	.8byte	0
-.LLST119:
-	.8byte	.LVL396
-	.8byte	.LVL398
+	.byte	0x5d
+	.8byte	.LVL431
+	.8byte	.LFE2820
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x5d
 	.8byte	0
 	.8byte	0
-.LLST120:
-	.8byte	.LVL392
-	.8byte	.LVL393
-	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL394
-	.8byte	.LVL399
+.LLST138:
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL400
-	.8byte	.LVL402
+	.byte	0x60
+	.8byte	.LVL429
+	.8byte	.LFE2820
 	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL403
-	.8byte	.LVL405
+	.byte	0x60
+	.8byte	0
+	.8byte	0
+.LLST139:
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL406
-	.8byte	.LFE2816
+	.byte	0x5c
+	.8byte	.LVL430
+	.8byte	.LFE2820
 	.2byte	0x1
-	.byte	0x54
+	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST121:
-	.8byte	.LVL385
-	.8byte	.LVL386
+.LLST140:
+	.8byte	.LVL435
+	.8byte	.LVL437
 	.2byte	0x1
-	.byte	0x53
+	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST122:
-	.8byte	.LVL409
-	.8byte	.LVL441
+.LLST141:
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL442
-	.8byte	.LVL444
+	.byte	0x5b
+	.8byte	.LVL432
+	.8byte	.LVL433
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL459
-	.8byte	.LVL462
+	.byte	0x5b
+	.8byte	.LVL434
+	.8byte	.LVL438
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x5b
+	.8byte	.LVL439
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST123:
-	.8byte	.LVL409
-	.8byte	.LVL445
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL459
-	.8byte	.LVL462
+.LLST142:
+	.8byte	.LVL426
+	.8byte	.LVL427
 	.2byte	0x1
-	.byte	0x52
+	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST124:
-	.8byte	.LVL409
-	.8byte	.LVL411
+.LLST143:
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL429
-	.8byte	.LVL430
+	.byte	0x58
+	.8byte	.LVL428
+	.8byte	.LFE2820
 	.2byte	0x1
-	.byte	0x53
+	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST125:
-	.8byte	.LVL425
-	.8byte	.LVL429
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL440
-	.8byte	.LVL453
+.LLST6:
+	.8byte	.LVL36
+	.8byte	.LVL63
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL458
-	.8byte	.LFE2819
+	.byte	0x5e
+	.8byte	0
+	.8byte	0
+.LLST7:
+	.8byte	.LVL35
+	.8byte	.LVL63
 	.2byte	0x1
-	.byte	0x52
+	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST126:
-	.8byte	.LVL425
-	.8byte	.LVL429
+.LLST8:
+	.8byte	.LVL37
+	.8byte	.LVL38
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL440
-	.8byte	.LVL441
+	.byte	0x55
+	.8byte	.LVL39
+	.8byte	.LVL46
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL442
-	.8byte	.LVL454
+	.byte	0x55
+	.8byte	.LVL48
+	.8byte	.LVL50
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL458
-	.8byte	.LFE2819
+	.byte	0x55
+	.8byte	.LVL51
+	.8byte	.LVL52
 	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST127:
-	.8byte	.LVL425
-	.8byte	.LVL429
+	.byte	0x55
+	.8byte	.LVL53
+	.8byte	.LVL54
 	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL438
-	.8byte	.LFE2819
+	.byte	0x55
+	.8byte	.LVL55
+	.8byte	.LVL56
 	.2byte	0x1
-	.byte	0x58
-	.8byte	0
-	.8byte	0
-.LLST128:
-	.8byte	.LVL425
-	.8byte	.LVL429
+	.byte	0x55
+	.8byte	.LVL57
+	.8byte	.LVL58
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL437
-	.8byte	.LFE2819
+	.byte	0x55
+	.8byte	.LVL59
+	.8byte	.LVL60
 	.2byte	0x1
-	.byte	0x59
+	.byte	0x55
+	.8byte	.LVL61
+	.8byte	.LVL63
+	.2byte	0x1
+	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST129:
-	.8byte	.LVL425
-	.8byte	.LVL429
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL442
-	.8byte	.LVL443
+.LLST9:
+	.8byte	.LVL37
+	.8byte	.LVL41
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL459
-	.8byte	.LVL460
+	.byte	0x57
+	.8byte	.LVL42
+	.8byte	.LVL47
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL461
-	.8byte	.LVL462
+	.byte	0x57
+	.8byte	.LVL49
+	.8byte	.LVL63
 	.2byte	0x1
-	.byte	0x53
+	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST130:
-	.8byte	.LVL425
-	.8byte	.LVL429
+.LLST10:
+	.8byte	.LVL39
+	.8byte	.LVL40
 	.2byte	0x1
-	.byte	0x5f
-	.8byte	.LVL435
-	.8byte	.LFE2819
+	.byte	0x5a
+	.8byte	.LVL62
+	.8byte	.LVL63
 	.2byte	0x1
-	.byte	0x5f
+	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST131:
-	.8byte	.LVL425
-	.8byte	.LVL429
+.LLST11:
+	.8byte	.LVL37
+	.8byte	.LVL43
 	.2byte	0x1
-	.byte	0x5b
-	.8byte	.LVL436
-	.8byte	.LFE2819
+	.byte	0x58
+	.8byte	.LVL44
+	.8byte	.LVL45
 	.2byte	0x1
-	.byte	0x5b
+	.byte	0x58
+	.8byte	.LVL49
+	.8byte	.LVL63
+	.2byte	0x1
+	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST132:
-	.8byte	.LVL425
-	.8byte	.LVL429
+.LLST0:
+	.8byte	.LVL4
+	.8byte	.LVL31
 	.2byte	0x1
-	.byte	0x5c
-	.8byte	.LVL439
-	.8byte	.LFE2819
+	.byte	0x5e
+	.8byte	0
+	.8byte	0
+.LLST1:
+	.8byte	.LVL3
+	.8byte	.LVL31
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST133:
-	.8byte	.LVL431
-	.8byte	.LVL432
+.LLST2:
+	.8byte	.LVL5
+	.8byte	.LVL6
 	.2byte	0x1
-	.byte	0x57
+	.byte	0x55
+	.8byte	.LVL7
+	.8byte	.LVL14
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL16
+	.8byte	.LVL18
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL19
+	.8byte	.LVL20
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL21
+	.8byte	.LVL22
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL23
+	.8byte	.LVL24
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL25
+	.8byte	.LVL26
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL27
+	.8byte	.LVL28
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL29
+	.8byte	.LVL31
+	.2byte	0x1
+	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST134:
-	.8byte	.LVL425
-	.8byte	.LVL429
+.LLST3:
+	.8byte	.LVL5
+	.8byte	.LVL9
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL434
-	.8byte	.LFE2819
+	.8byte	.LVL10
+	.8byte	.LVL15
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL17
+	.8byte	.LVL31
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST135:
-	.8byte	.LVL425
-	.8byte	.LVL429
-	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL440
-	.8byte	.LVL446
+.LLST4:
+	.8byte	.LVL7
+	.8byte	.LVL8
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL455
-	.8byte	.LFE2819
+	.byte	0x5a
+	.8byte	.LVL30
+	.8byte	.LVL31
 	.2byte	0x1
-	.byte	0x56
+	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST136:
-	.8byte	.LVL425
-	.8byte	.LVL429
-	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL440
-	.8byte	.LVL449
-	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL450
-	.8byte	.LVL451
+.LLST5:
+	.8byte	.LVL5
+	.8byte	.LVL11
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL452
-	.8byte	.LVL456
+	.byte	0x58
+	.8byte	.LVL12
+	.8byte	.LVL13
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL457
-	.8byte	.LFE2819
+	.byte	0x58
+	.8byte	.LVL17
+	.8byte	.LVL31
 	.2byte	0x1
-	.byte	0x62
+	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST137:
-	.8byte	.LVL425
-	.8byte	.LVL429
-	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL440
-	.8byte	.LVL447
+.LLST234:
+	.8byte	.LVL837
+	.8byte	.LVL839
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL448
-	.8byte	.LVL451
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST235:
+	.8byte	.LVL838
+	.8byte	.LVL841
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL452
-	.8byte	.LVL456
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST236:
+	.8byte	.LVL841
+	.8byte	.LVL844
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL457
-	.8byte	.LFE2819
+	.byte	0x63
+	.8byte	.LVL845
+	.8byte	.LVL848
 	.2byte	0x1
-	.byte	0x62
+	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST138:
-	.8byte	.LVL425
-	.8byte	.LVL429
-	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL440
-	.8byte	.LVL447
+.LLST230:
+	.8byte	.LVL826
+	.8byte	.LVL831
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL448
-	.8byte	.LVL449
+	.byte	0x53
+	.8byte	.LVL836
+	.8byte	.LFE2810
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL450
-	.8byte	.LVL456
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST231:
+	.8byte	.LVL832
+	.8byte	.LVL833
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL457
-	.8byte	.LFE2819
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST232:
+	.8byte	.LVL830
+	.8byte	.LVL834
 	.2byte	0x1
-	.byte	0x62
+	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST139:
-	.8byte	.LVL417
-	.8byte	.LVL418
-	.2byte	0x1
-	.byte	0x5d
-	.8byte	.LVL419
-	.8byte	.LVL420
+.LLST233:
+	.8byte	.LVL833
+	.8byte	.LVL835
 	.2byte	0x1
-	.byte	0x5d
-	.8byte	.LVL421
-	.8byte	.LVL422
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST224:
+	.8byte	.LVL804
+	.8byte	.LVL810
 	.2byte	0x1
-	.byte	0x5d
-	.8byte	.LVL423
-	.8byte	.LVL424
+	.byte	0x54
+	.8byte	.LVL814
+	.8byte	.LVL815
 	.2byte	0x1
-	.byte	0x5d
-	.8byte	.LVL425
-	.8byte	.LVL429
+	.byte	0x54
+	.8byte	.LVL824
+	.8byte	.LVL825
 	.2byte	0x1
-	.byte	0x5d
+	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST140:
-	.8byte	.LVL415
-	.8byte	.LVL428
+.LLST225:
+	.8byte	.LVL804
+	.8byte	.LVL805
 	.2byte	0x1
-	.byte	0x6e
+	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST141:
-	.8byte	.LVL416
-	.8byte	.LVL429
+.LLST226:
+	.8byte	.LVL810
+	.8byte	.LVL813
 	.2byte	0x1
-	.byte	0x59
-	.8byte	0
-	.8byte	0
-.LLST142:
-	.8byte	.LVL410
-	.8byte	.LVL433
+	.byte	0x54
+	.8byte	.LVL817
+	.8byte	.LVL822
 	.2byte	0x1
-	.byte	0x60
+	.byte	0x54
+	.8byte	.LVL825
+	.8byte	.LFE2809
+	.2byte	0x1
+	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST143:
-	.8byte	.LVL412
-	.8byte	.LVL413
+.LLST227:
+	.8byte	.LVL809
+	.8byte	.LVL810
 	.2byte	0x1
-	.byte	0x5e
+	.byte	0x59
+	.8byte	.LVL812
+	.8byte	.LVL816
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL821
+	.8byte	.LVL825
+	.2byte	0x1
+	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST144:
-	.8byte	.LVL414
-	.8byte	.LVL429
+.LLST228:
+	.8byte	.LVL809
+	.8byte	.LVL811
 	.2byte	0x1
-	.byte	0x5e
+	.byte	0x55
+	.8byte	.LVL812
+	.8byte	.LVL820
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL823
+	.8byte	.LFE2809
+	.2byte	0x1
+	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST145:
-	.8byte	.LVL417
-	.8byte	.LVL426
+.LLST229:
+	.8byte	.LVL809
+	.8byte	.LVL818
 	.2byte	0x1
-	.byte	0x66
+	.byte	0x57
+	.8byte	.LVL819
+	.8byte	.LFE2809
+	.2byte	0x1
+	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST146:
-	.8byte	.LVL417
-	.8byte	.LVL427
+.LLST12:
+	.8byte	.LVL64
+	.8byte	.LVL65
 	.2byte	0x1
-	.byte	0x69
+	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST147:
-	.8byte	.LVL463
-	.8byte	.LVL464
+.LLST190:
+	.8byte	.LVL540
+	.8byte	.LVL541
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL464
-	.8byte	.LVL469
+	.8byte	.LVL541
+	.8byte	.LVL546
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL470
-	.8byte	.LFE2865
+	.8byte	.LVL547
+	.8byte	.LFE2876
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST150:
-	.8byte	.LVL515
-	.8byte	.LVL517
+.LLST193:
+	.8byte	.LVL592
+	.8byte	.LVL594
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL517
-	.8byte	.LVL521
+	.8byte	.LVL594
+	.8byte	.LVL598
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL522
-	.8byte	.LVL525
+	.8byte	.LVL599
+	.8byte	.LVL602
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST151:
-	.8byte	.LVL515
-	.8byte	.LVL516
+.LLST194:
+	.8byte	.LVL592
+	.8byte	.LVL593
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST178:
-	.8byte	.LVL717
-	.8byte	.LVL718
+.LLST196:
+	.8byte	.LVL610
+	.8byte	.LVL611-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST197:
+	.8byte	.LVL609
+	.8byte	.LVL611-1
+	.2byte	0x1
+	.byte	0x54
+	.8byte	0
+	.8byte	0
+.LLST223:
+	.8byte	.LVL796
+	.8byte	.LVL797
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL718
-	.8byte	.LVL722
+	.8byte	.LVL797
+	.8byte	.LVL801
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL723
-	.8byte	.LFE2871
+	.8byte	.LVL802
+	.8byte	.LFE2883
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -52049,292 +54817,272 @@ __exitcall_ebc_exit:
 	.2byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0-.Ltext0
-	.8byte	.LFB2857
-	.8byte	.LFE2857-.LFB2857
-	.8byte	.LFB2856
-	.8byte	.LFE2856-.LFB2856
+	.8byte	.LFB2864
+	.8byte	.LFE2864-.LFB2864
+	.8byte	.LFB2863
+	.8byte	.LFE2863-.LFB2863
 	.8byte	0
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
 .Ldebug_ranges0:
-	.8byte	.LBB938
-	.8byte	.LBE938
-	.8byte	.LBB941
-	.8byte	.LBE941
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB942
-	.8byte	.LBE942
-	.8byte	.LBB973
-	.8byte	.LBE973
-	.8byte	.LBB974
-	.8byte	.LBE974
-	.8byte	.LBB1039
-	.8byte	.LBE1039
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB945
-	.8byte	.LBE945
-	.8byte	.LBB957
-	.8byte	.LBE957
-	.8byte	.LBB958
-	.8byte	.LBE958
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB961
-	.8byte	.LBE961
-	.8byte	.LBB966
-	.8byte	.LBE966
+	.8byte	.LBB948
+	.8byte	.LBE948
+	.8byte	.LBB951
+	.8byte	.LBE951
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB975
-	.8byte	.LBE975
-	.8byte	.LBB1196
-	.8byte	.LBE1196
-	.8byte	.LBB1197
-	.8byte	.LBE1197
+	.8byte	.LBB952
+	.8byte	.LBE952
+	.8byte	.LBB983
+	.8byte	.LBE983
+	.8byte	.LBB984
+	.8byte	.LBE984
+	.8byte	.LBB1049
+	.8byte	.LBE1049
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB978
-	.8byte	.LBE978
-	.8byte	.LBB998
-	.8byte	.LBE998
-	.8byte	.LBB999
-	.8byte	.LBE999
+	.8byte	.LBB955
+	.8byte	.LBE955
+	.8byte	.LBB967
+	.8byte	.LBE967
+	.8byte	.LBB968
+	.8byte	.LBE968
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB992
-	.8byte	.LBE992
-	.8byte	.LBB997
-	.8byte	.LBE997
+	.8byte	.LBB971
+	.8byte	.LBE971
+	.8byte	.LBB976
+	.8byte	.LBE976
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1004
-	.8byte	.LBE1004
+	.8byte	.LBB985
+	.8byte	.LBE985
+	.8byte	.LBB1206
+	.8byte	.LBE1206
 	.8byte	.LBB1207
 	.8byte	.LBE1207
-	.8byte	.LBB1209
-	.8byte	.LBE1209
-	.8byte	.LBB1210
-	.8byte	.LBE1210
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1010
-	.8byte	.LBE1010
-	.8byte	.LBB1194
-	.8byte	.LBE1194
-	.8byte	.LBB1195
-	.8byte	.LBE1195
+	.8byte	.LBB988
+	.8byte	.LBE988
+	.8byte	.LBB1008
+	.8byte	.LBE1008
+	.8byte	.LBB1009
+	.8byte	.LBE1009
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1013
-	.8byte	.LBE1013
-	.8byte	.LBB1033
-	.8byte	.LBE1033
-	.8byte	.LBB1034
-	.8byte	.LBE1034
+	.8byte	.LBB1002
+	.8byte	.LBE1002
+	.8byte	.LBB1007
+	.8byte	.LBE1007
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1027
-	.8byte	.LBE1027
-	.8byte	.LBB1032
-	.8byte	.LBE1032
+	.8byte	.LBB1014
+	.8byte	.LBE1014
+	.8byte	.LBB1217
+	.8byte	.LBE1217
+	.8byte	.LBB1219
+	.8byte	.LBE1219
+	.8byte	.LBB1220
+	.8byte	.LBE1220
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1040
-	.8byte	.LBE1040
-	.8byte	.LBB1073
-	.8byte	.LBE1073
+	.8byte	.LBB1020
+	.8byte	.LBE1020
 	.8byte	.LBB1204
 	.8byte	.LBE1204
 	.8byte	.LBB1205
 	.8byte	.LBE1205
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1023
+	.8byte	.LBE1023
 	.8byte	.LBB1043
 	.8byte	.LBE1043
-	.8byte	.LBB1056
-	.8byte	.LBE1056
-	.8byte	.LBB1065
-	.8byte	.LBE1065
-	.8byte	.LBB1066
-	.8byte	.LBE1066
+	.8byte	.LBB1044
+	.8byte	.LBE1044
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1059
-	.8byte	.LBE1059
-	.8byte	.LBB1064
-	.8byte	.LBE1064
+	.8byte	.LBB1037
+	.8byte	.LBE1037
+	.8byte	.LBB1042
+	.8byte	.LBE1042
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1050
+	.8byte	.LBE1050
+	.8byte	.LBB1083
+	.8byte	.LBE1083
+	.8byte	.LBB1214
+	.8byte	.LBE1214
+	.8byte	.LBB1215
+	.8byte	.LBE1215
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1053
+	.8byte	.LBE1053
+	.8byte	.LBB1066
+	.8byte	.LBE1066
+	.8byte	.LBB1075
+	.8byte	.LBE1075
+	.8byte	.LBB1076
+	.8byte	.LBE1076
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1069
+	.8byte	.LBE1069
 	.8byte	.LBB1074
 	.8byte	.LBE1074
-	.8byte	.LBB1109
-	.8byte	.LBE1109
-	.8byte	.LBB1200
-	.8byte	.LBE1200
-	.8byte	.LBB1201
-	.8byte	.LBE1201
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1084
+	.8byte	.LBE1084
+	.8byte	.LBB1119
+	.8byte	.LBE1119
+	.8byte	.LBB1210
+	.8byte	.LBE1210
 	.8byte	.LBB1211
 	.8byte	.LBE1211
+	.8byte	.LBB1221
+	.8byte	.LBE1221
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1077
-	.8byte	.LBE1077
-	.8byte	.LBB1090
-	.8byte	.LBE1090
-	.8byte	.LBB1099
-	.8byte	.LBE1099
+	.8byte	.LBB1087
+	.8byte	.LBE1087
 	.8byte	.LBB1100
 	.8byte	.LBE1100
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1093
-	.8byte	.LBE1093
-	.8byte	.LBB1098
-	.8byte	.LBE1098
-	.8byte	0
-	.8byte	0
+	.8byte	.LBB1109
+	.8byte	.LBE1109
 	.8byte	.LBB1110
 	.8byte	.LBE1110
-	.8byte	.LBB1121
-	.8byte	.LBE1121
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1113
-	.8byte	.LBE1113
-	.8byte	.LBB1118
-	.8byte	.LBE1118
+	.8byte	.LBB1103
+	.8byte	.LBE1103
+	.8byte	.LBB1108
+	.8byte	.LBE1108
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1114
-	.8byte	.LBE1114
-	.8byte	.LBB1117
-	.8byte	.LBE1117
+	.8byte	.LBB1120
+	.8byte	.LBE1120
+	.8byte	.LBB1131
+	.8byte	.LBE1131
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1122
-	.8byte	.LBE1122
-	.8byte	.LBB1157
-	.8byte	.LBE1157
-	.8byte	.LBB1198
-	.8byte	.LBE1198
-	.8byte	.LBB1199
-	.8byte	.LBE1199
-	.8byte	.LBB1206
-	.8byte	.LBE1206
+	.8byte	.LBB1123
+	.8byte	.LBE1123
+	.8byte	.LBB1128
+	.8byte	.LBE1128
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1125
-	.8byte	.LBE1125
-	.8byte	.LBB1138
-	.8byte	.LBE1138
-	.8byte	.LBB1139
-	.8byte	.LBE1139
-	.8byte	.LBB1140
-	.8byte	.LBE1140
+	.8byte	.LBB1124
+	.8byte	.LBE1124
+	.8byte	.LBB1127
+	.8byte	.LBE1127
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1143
-	.8byte	.LBE1143
+	.8byte	.LBB1132
+	.8byte	.LBE1132
+	.8byte	.LBB1167
+	.8byte	.LBE1167
+	.8byte	.LBB1208
+	.8byte	.LBE1208
+	.8byte	.LBB1209
+	.8byte	.LBE1209
+	.8byte	.LBB1216
+	.8byte	.LBE1216
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1135
+	.8byte	.LBE1135
 	.8byte	.LBB1148
 	.8byte	.LBE1148
+	.8byte	.LBB1149
+	.8byte	.LBE1149
+	.8byte	.LBB1150
+	.8byte	.LBE1150
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1153
+	.8byte	.LBE1153
 	.8byte	.LBB1158
 	.8byte	.LBE1158
-	.8byte	.LBB1193
-	.8byte	.LBE1193
-	.8byte	.LBB1202
-	.8byte	.LBE1202
-	.8byte	.LBB1203
-	.8byte	.LBE1203
-	.8byte	.LBB1208
-	.8byte	.LBE1208
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1161
-	.8byte	.LBE1161
-	.8byte	.LBB1174
-	.8byte	.LBE1174
-	.8byte	.LBB1175
-	.8byte	.LBE1175
-	.8byte	.LBB1176
-	.8byte	.LBE1176
+	.8byte	.LBB1168
+	.8byte	.LBE1168
+	.8byte	.LBB1203
+	.8byte	.LBE1203
+	.8byte	.LBB1212
+	.8byte	.LBE1212
+	.8byte	.LBB1213
+	.8byte	.LBE1213
+	.8byte	.LBB1218
+	.8byte	.LBE1218
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1179
-	.8byte	.LBE1179
+	.8byte	.LBB1171
+	.8byte	.LBE1171
 	.8byte	.LBB1184
 	.8byte	.LBE1184
+	.8byte	.LBB1185
+	.8byte	.LBE1185
+	.8byte	.LBB1186
+	.8byte	.LBE1186
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1216
-	.8byte	.LBE1216
-	.8byte	.LBB1219
-	.8byte	.LBE1219
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1240
-	.8byte	.LBE1240
-	.8byte	.LBB1246
-	.8byte	.LBE1246
-	.8byte	.LBB1252
-	.8byte	.LBE1252
-	.8byte	.LBB1254
-	.8byte	.LBE1254
-	.8byte	.LBB1256
-	.8byte	.LBE1256
+	.8byte	.LBB1189
+	.8byte	.LBE1189
+	.8byte	.LBB1194
+	.8byte	.LBE1194
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1247
-	.8byte	.LBE1247
-	.8byte	.LBB1253
-	.8byte	.LBE1253
-	.8byte	.LBB1255
-	.8byte	.LBE1255
-	.8byte	.LBB1257
-	.8byte	.LBE1257
+	.8byte	.LBB1226
+	.8byte	.LBE1226
+	.8byte	.LBB1229
+	.8byte	.LBE1229
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1258
-	.8byte	.LBE1258
-	.8byte	.LBB1305
-	.8byte	.LBE1305
-	.8byte	.LBB1306
-	.8byte	.LBE1306
+	.8byte	.LBB1260
+	.8byte	.LBE1260
+	.8byte	.LBB1272
+	.8byte	.LBE1272
+	.8byte	.LBB1274
+	.8byte	.LBE1274
+	.8byte	.LBB1276
+	.8byte	.LBE1276
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1261
-	.8byte	.LBE1261
+	.8byte	.LBB1265
+	.8byte	.LBE1265
 	.8byte	.LBB1273
 	.8byte	.LBE1273
 	.8byte	.LBB1275
 	.8byte	.LBE1275
-	.8byte	.LBB1277
-	.8byte	.LBE1277
+	.8byte	.LBB1284
+	.8byte	.LBE1284
+	.8byte	.LBB1286
+	.8byte	.LBE1286
+	.8byte	.LBB1288
+	.8byte	.LBE1288
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1266
-	.8byte	.LBE1266
-	.8byte	.LBB1274
-	.8byte	.LBE1274
-	.8byte	.LBB1276
-	.8byte	.LBE1276
+	.8byte	.LBB1277
+	.8byte	.LBE1277
 	.8byte	.LBB1285
 	.8byte	.LBE1285
 	.8byte	.LBB1287
 	.8byte	.LBE1287
-	.8byte	.LBB1289
-	.8byte	.LBE1289
+	.8byte	.LBB1294
+	.8byte	.LBE1294
+	.8byte	.LBB1296
+	.8byte	.LBE1296
+	.8byte	.LBB1298
+	.8byte	.LBE1298
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1278
-	.8byte	.LBE1278
-	.8byte	.LBB1286
-	.8byte	.LBE1286
-	.8byte	.LBB1288
-	.8byte	.LBE1288
+	.8byte	.LBB1289
+	.8byte	.LBE1289
 	.8byte	.LBB1295
 	.8byte	.LBE1295
 	.8byte	.LBB1297
@@ -52343,282 +55091,342 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1299
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1290
-	.8byte	.LBE1290
-	.8byte	.LBB1296
-	.8byte	.LBE1296
-	.8byte	.LBB1298
-	.8byte	.LBE1298
-	.8byte	.LBB1300
-	.8byte	.LBE1300
+	.8byte	.LBB1304
+	.8byte	.LBE1304
+	.8byte	.LBB1310
+	.8byte	.LBE1310
+	.8byte	.LBB1316
+	.8byte	.LBE1316
+	.8byte	.LBB1318
+	.8byte	.LBE1318
+	.8byte	.LBB1320
+	.8byte	.LBE1320
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1325
-	.8byte	.LBE1325
-	.8byte	.LBB1364
-	.8byte	.LBE1364
+	.8byte	.LBB1311
+	.8byte	.LBE1311
+	.8byte	.LBB1317
+	.8byte	.LBE1317
+	.8byte	.LBB1319
+	.8byte	.LBE1319
+	.8byte	.LBB1321
+	.8byte	.LBE1321
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1328
-	.8byte	.LBE1328
+	.8byte	.LBB1324
+	.8byte	.LBE1324
 	.8byte	.LBB1337
 	.8byte	.LBE1337
+	.8byte	.LBB1339
+	.8byte	.LBE1339
+	.8byte	.LBB1341
+	.8byte	.LBE1341
+	.8byte	.LBB1343
+	.8byte	.LBE1343
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1330
+	.8byte	.LBE1330
+	.8byte	.LBB1336
+	.8byte	.LBE1336
+	.8byte	.LBB1338
+	.8byte	.LBE1338
+	.8byte	.LBB1340
+	.8byte	.LBE1340
 	.8byte	.LBB1342
 	.8byte	.LBE1342
-	.8byte	.LBB1355
-	.8byte	.LBE1355
-	.8byte	.LBB1357
-	.8byte	.LBE1357
-	.8byte	.LBB1359
-	.8byte	.LBE1359
-	.8byte	.LBB1361
-	.8byte	.LBE1361
-	.8byte	.LBB1363
-	.8byte	.LBE1363
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1349
-	.8byte	.LBE1349
-	.8byte	.LBB1356
-	.8byte	.LBE1356
-	.8byte	.LBB1358
-	.8byte	.LBE1358
-	.8byte	.LBB1360
-	.8byte	.LBE1360
-	.8byte	.LBB1362
-	.8byte	.LBE1362
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1365
-	.8byte	.LBE1365
-	.8byte	.LBB1374
-	.8byte	.LBE1374
-	.8byte	.LBB1375
-	.8byte	.LBE1375
-	.8byte	.LBB1386
-	.8byte	.LBE1386
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1367
-	.8byte	.LBE1367
-	.8byte	.LBB1370
-	.8byte	.LBE1370
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1376
-	.8byte	.LBE1376
-	.8byte	.LBB1380
-	.8byte	.LBE1380
-	.8byte	.LBB1381
-	.8byte	.LBE1381
+	.8byte	.LBB1372
+	.8byte	.LBE1372
+	.8byte	.LBB1386
+	.8byte	.LBE1386
+	.8byte	.LBB1414
+	.8byte	.LBE1414
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1395
-	.8byte	.LBE1395
-	.8byte	.LBB1402
-	.8byte	.LBE1402
-	.8byte	.LBB1403
-	.8byte	.LBE1403
+	.8byte	.LBB1374
+	.8byte	.LBE1374
+	.8byte	.LBB1383
+	.8byte	.LBE1383
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1396
-	.8byte	.LBE1396
-	.8byte	.LBB1401
-	.8byte	.LBE1401
+	.8byte	.LBB1389
+	.8byte	.LBE1389
+	.8byte	.LBB1415
+	.8byte	.LBE1415
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1391
+	.8byte	.LBE1391
 	.8byte	.LBB1404
 	.8byte	.LBE1404
-	.8byte	.LBB1407
-	.8byte	.LBE1407
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1570
-	.8byte	.LBE1570
-	.8byte	.LBB1573
-	.8byte	.LBE1573
+	.8byte	.LBB1406
+	.8byte	.LBE1406
+	.8byte	.LBB1408
+	.8byte	.LBE1408
+	.8byte	.LBB1410
+	.8byte	.LBE1410
+	.8byte	.LBB1412
+	.8byte	.LBE1412
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1580
-	.8byte	.LBE1580
-	.8byte	.LBB1654
-	.8byte	.LBE1654
-	.8byte	.LBB1655
-	.8byte	.LBE1655
-	.8byte	.LBB1656
-	.8byte	.LBE1656
+	.8byte	.LBB1398
+	.8byte	.LBE1398
+	.8byte	.LBB1405
+	.8byte	.LBE1405
+	.8byte	.LBB1407
+	.8byte	.LBE1407
+	.8byte	.LBB1409
+	.8byte	.LBE1409
+	.8byte	.LBB1411
+	.8byte	.LBE1411
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1582
-	.8byte	.LBE1582
-	.8byte	.LBB1591
-	.8byte	.LBE1591
-	.8byte	.LBB1592
-	.8byte	.LBE1592
-	.8byte	.LBB1593
-	.8byte	.LBE1593
+	.8byte	.LBB1418
+	.8byte	.LBE1418
+	.8byte	.LBB1430
+	.8byte	.LBE1430
+	.8byte	.LBB1432
+	.8byte	.LBE1432
+	.8byte	.LBB1433
+	.8byte	.LBE1433
+	.8byte	.LBB1435
+	.8byte	.LBE1435
+	.8byte	.LBB1437
+	.8byte	.LBE1437
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1657
-	.8byte	.LBE1657
-	.8byte	.LBB1682
-	.8byte	.LBE1682
-	.8byte	.LBB1683
-	.8byte	.LBE1683
-	.8byte	.LBB1694
-	.8byte	.LBE1694
-	.8byte	.LBB1745
-	.8byte	.LBE1745
-	.8byte	.LBB1750
-	.8byte	.LBE1750
+	.8byte	.LBB1425
+	.8byte	.LBE1425
+	.8byte	.LBB1431
+	.8byte	.LBE1431
+	.8byte	.LBB1434
+	.8byte	.LBE1434
+	.8byte	.LBB1436
+	.8byte	.LBE1436
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1659
-	.8byte	.LBE1659
-	.8byte	.LBB1662
-	.8byte	.LBE1662
+	.8byte	.LBB1438
+	.8byte	.LBE1438
+	.8byte	.LBB1447
+	.8byte	.LBE1447
+	.8byte	.LBB1448
+	.8byte	.LBE1448
+	.8byte	.LBB1459
+	.8byte	.LBE1459
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1663
-	.8byte	.LBE1663
-	.8byte	.LBB1668
-	.8byte	.LBE1668
-	.8byte	.LBB1669
-	.8byte	.LBE1669
-	.8byte	.LBB1670
-	.8byte	.LBE1670
+	.8byte	.LBB1440
+	.8byte	.LBE1440
+	.8byte	.LBB1443
+	.8byte	.LBE1443
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1684
-	.8byte	.LBE1684
-	.8byte	.LBB1695
-	.8byte	.LBE1695
-	.8byte	.LBB1747
-	.8byte	.LBE1747
-	.8byte	.LBB1751
-	.8byte	.LBE1751
-	.8byte	.LBB1753
-	.8byte	.LBE1753
+	.8byte	.LBB1449
+	.8byte	.LBE1449
+	.8byte	.LBB1453
+	.8byte	.LBE1453
+	.8byte	.LBB1454
+	.8byte	.LBE1454
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1686
-	.8byte	.LBE1686
-	.8byte	.LBB1689
-	.8byte	.LBE1689
+	.8byte	.LBB1468
+	.8byte	.LBE1468
+	.8byte	.LBB1475
+	.8byte	.LBE1475
+	.8byte	.LBB1476
+	.8byte	.LBE1476
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1696
-	.8byte	.LBE1696
-	.8byte	.LBB1748
-	.8byte	.LBE1748
-	.8byte	.LBB1749
-	.8byte	.LBE1749
+	.8byte	.LBB1469
+	.8byte	.LBE1469
+	.8byte	.LBB1474
+	.8byte	.LBE1474
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1698
-	.8byte	.LBE1698
-	.8byte	.LBB1704
-	.8byte	.LBE1704
+	.8byte	.LBB1477
+	.8byte	.LBE1477
+	.8byte	.LBB1480
+	.8byte	.LBE1480
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1707
-	.8byte	.LBE1707
-	.8byte	.LBB1708
-	.8byte	.LBE1708
+	.8byte	.LBB1637
+	.8byte	.LBE1637
+	.8byte	.LBB1640
+	.8byte	.LBE1640
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1715
-	.8byte	.LBE1715
+	.8byte	.LBB1647
+	.8byte	.LBE1647
 	.8byte	.LBB1721
 	.8byte	.LBE1721
 	.8byte	.LBB1722
 	.8byte	.LBE1722
 	.8byte	.LBB1723
 	.8byte	.LBE1723
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1649
+	.8byte	.LBE1649
+	.8byte	.LBB1658
+	.8byte	.LBE1658
+	.8byte	.LBB1659
+	.8byte	.LBE1659
+	.8byte	.LBB1660
+	.8byte	.LBE1660
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB1724
 	.8byte	.LBE1724
+	.8byte	.LBB1739
+	.8byte	.LBE1739
+	.8byte	.LBB1740
+	.8byte	.LBE1740
+	.8byte	.LBB1750
+	.8byte	.LBE1750
+	.8byte	.LBB1802
+	.8byte	.LBE1802
+	.8byte	.LBB1805
+	.8byte	.LBE1805
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1726
+	.8byte	.LBE1726
+	.8byte	.LBB1729
+	.8byte	.LBE1729
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1730
+	.8byte	.LBE1730
+	.8byte	.LBB1733
+	.8byte	.LBE1733
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1741
+	.8byte	.LBE1741
+	.8byte	.LBB1751
+	.8byte	.LBE1751
+	.8byte	.LBB1801
+	.8byte	.LBE1801
+	.8byte	.LBB1806
+	.8byte	.LBE1806
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1725
-	.8byte	.LBE1725
-	.8byte	.LBB1744
-	.8byte	.LBE1744
+	.8byte	.LBB1743
+	.8byte	.LBE1743
 	.8byte	.LBB1746
 	.8byte	.LBE1746
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB1752
 	.8byte	.LBE1752
+	.8byte	.LBB1803
+	.8byte	.LBE1803
+	.8byte	.LBB1804
+	.8byte	.LBE1804
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB1754
 	.8byte	.LBE1754
+	.8byte	.LBB1760
+	.8byte	.LBE1760
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1783
-	.8byte	.LBE1783
-	.8byte	.LBB1790
-	.8byte	.LBE1790
+	.8byte	.LBB1763
+	.8byte	.LBE1763
+	.8byte	.LBB1764
+	.8byte	.LBE1764
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1771
+	.8byte	.LBE1771
+	.8byte	.LBB1777
+	.8byte	.LBE1777
+	.8byte	.LBB1778
+	.8byte	.LBE1778
+	.8byte	.LBB1779
+	.8byte	.LBE1779
+	.8byte	.LBB1780
+	.8byte	.LBE1780
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1781
+	.8byte	.LBE1781
 	.8byte	.LBB1799
 	.8byte	.LBE1799
+	.8byte	.LBB1800
+	.8byte	.LBE1800
+	.8byte	.LBB1807
+	.8byte	.LBE1807
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1785
-	.8byte	.LBE1785
-	.8byte	.LBB1786
-	.8byte	.LBE1786
-	.8byte	.LBB1787
-	.8byte	.LBE1787
+	.8byte	.LBB1836
+	.8byte	.LBE1836
+	.8byte	.LBB1843
+	.8byte	.LBE1843
+	.8byte	.LBB1844
+	.8byte	.LBE1844
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1791
-	.8byte	.LBE1791
-	.8byte	.LBB1797
-	.8byte	.LBE1797
-	.8byte	.LBB1798
-	.8byte	.LBE1798
-	.8byte	.LBB1819
-	.8byte	.LBE1819
-	.8byte	.LBB1820
-	.8byte	.LBE1820
+	.8byte	.LBB1838
+	.8byte	.LBE1838
+	.8byte	.LBB1839
+	.8byte	.LBE1839
+	.8byte	.LBB1840
+	.8byte	.LBE1840
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1800
-	.8byte	.LBE1800
-	.8byte	.LBB1804
-	.8byte	.LBE1804
-	.8byte	.LBB1805
-	.8byte	.LBE1805
+	.8byte	.LBB1845
+	.8byte	.LBE1845
+	.8byte	.LBB1849
+	.8byte	.LBE1849
+	.8byte	.LBB1850
+	.8byte	.LBE1850
+	.8byte	0
 	.8byte	0
+	.8byte	.LBB1851
+	.8byte	.LBE1851
+	.8byte	.LBB1857
+	.8byte	.LBE1857
+	.8byte	.LBB1858
+	.8byte	.LBE1858
+	.8byte	.LBB1868
+	.8byte	.LBE1868
+	.8byte	.LBB1869
+	.8byte	.LBE1869
 	.8byte	0
-	.8byte	.LBB1811
-	.8byte	.LBE1811
-	.8byte	.LBB1822
-	.8byte	.LBE1822
 	.8byte	0
+	.8byte	.LBB1864
+	.8byte	.LBE1864
+	.8byte	.LBB1876
+	.8byte	.LBE1876
 	.8byte	0
-	.8byte	.LBB1813
-	.8byte	.LBE1813
-	.8byte	.LBB1814
-	.8byte	.LBE1814
 	.8byte	0
+	.8byte	.LBB1866
+	.8byte	.LBE1866
+	.8byte	.LBB1867
+	.8byte	.LBE1867
 	.8byte	0
-	.8byte	.LBB1815
-	.8byte	.LBE1815
-	.8byte	.LBB1821
-	.8byte	.LBE1821
 	.8byte	0
+	.8byte	.LBB1870
+	.8byte	.LBE1870
+	.8byte	.LBB1877
+	.8byte	.LBE1877
 	.8byte	0
-	.8byte	.LBB1817
-	.8byte	.LBE1817
-	.8byte	.LBB1818
-	.8byte	.LBE1818
+	.8byte	0
+	.8byte	.LBB1872
+	.8byte	.LBE1872
+	.8byte	.LBB1873
+	.8byte	.LBE1873
 	.8byte	0
 	.8byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0
-	.8byte	.LFB2857
-	.8byte	.LFE2857
-	.8byte	.LFB2856
-	.8byte	.LFE2856
+	.8byte	.LFB2864
+	.8byte	.LFE2864
+	.8byte	.LFB2863
+	.8byte	.LFE2863
 	.8byte	0
 	.8byte	0
 	.section	.debug_line,"",@progbits
@@ -52642,9 +55450,9 @@ __exitcall_ebc_exit:
 	.string	"RPM_REQ_IDLE"
 .LASF2395:
 	.string	"suppliers"
-.LASF3067:
+.LASF3068:
 	.string	"ebc_buffer_manage_init"
-.LASF2894:
+.LASF2895:
 	.string	"EPD_FULL_GCC16"
 .LASF38:
 	.string	"dev_t"
@@ -52654,7 +55462,7 @@ __exitcall_ebc_exit:
 	.string	"PE_SIZE_PUD"
 .LASF2605:
 	.string	"__tracepoint_page_ref_mod"
-.LASF2989:
+.LASF2990:
 	.string	"full_mode_num"
 .LASF1057:
 	.string	"nr_wakeups"
@@ -52700,7 +55508,7 @@ __exitcall_ebc_exit:
 	.string	"dev_kobj"
 .LASF475:
 	.string	"d_release"
-.LASF3182:
+.LASF3193:
 	.string	"get_arch_dma_ops"
 .LASF305:
 	.string	"__ctors_start"
@@ -52708,11 +55516,11 @@ __exitcall_ebc_exit:
 	.string	"state"
 .LASF524:
 	.string	"s_d_op"
-.LASF2977:
+.LASF2978:
 	.string	"ebc_buffer_vir"
 .LASF923:
 	.string	"node_states"
-.LASF2921:
+.LASF2922:
 	.string	"pmic_power_req"
 .LASF915:
 	.string	"hrtimer_resolution"
@@ -52734,7 +55542,7 @@ __exitcall_ebc_exit:
 	.string	"si_code"
 .LASF649:
 	.string	"thread_node"
-.LASF3119:
+.LASF3120:
 	.string	"temperature"
 .LASF1316:
 	.string	"map_pages"
@@ -52770,15 +55578,15 @@ __exitcall_ebc_exit:
 	.string	"system_wq"
 .LASF604:
 	.string	"rcu_read_lock_nesting"
-.LASF3007:
+.LASF3008:
 	.string	"suspend_lock"
 .LASF2544:
 	.string	"gpio_desc"
 .LASF976:
 	.string	"list"
-.LASF3199:
+.LASF3210:
 	.string	"_copy_from_user"
-.LASF3225:
+.LASF3236:
 	.string	"get_order"
 .LASF959:
 	.string	"si_errno"
@@ -52802,7 +55610,7 @@ __exitcall_ebc_exit:
 	.string	"trace_events"
 .LASF1357:
 	.string	"env_start"
-.LASF2930:
+.LASF2931:
 	.string	"DMA_FROM_DEVICE"
 .LASF756:
 	.string	"cpu_number"
@@ -52812,7 +55620,7 @@ __exitcall_ebc_exit:
 	.string	"mm_rb"
 .LASF2201:
 	.string	"freeze_late"
-.LASF3088:
+.LASF3089:
 	.string	"buf_info"
 .LASF409:
 	.string	"d_inode"
@@ -52828,7 +55636,7 @@ __exitcall_ebc_exit:
 	.string	"locked"
 .LASF73:
 	.string	"exitcall_t"
-.LASF2962:
+.LASF2963:
 	.string	"regs"
 .LASF1051:
 	.string	"slice_max"
@@ -52838,7 +55646,7 @@ __exitcall_ebc_exit:
 	.string	"n_node"
 .LASF1638:
 	.string	"qsize_t"
-.LASF3222:
+.LASF3233:
 	.string	"devm_kzalloc"
 .LASF380:
 	.string	"sequence"
@@ -52854,7 +55662,7 @@ __exitcall_ebc_exit:
 	.string	"s_state"
 .LASF1080:
 	.string	"run_list"
-.LASF3139:
+.LASF3148:
 	.string	"clac_full_data_align8"
 .LASF2567:
 	.string	"SCHED_SOFTIRQ"
@@ -52876,7 +55684,7 @@ __exitcall_ebc_exit:
 	.string	"param_ops_uint"
 .LASF905:
 	.string	"softirq_activated"
-.LASF3051:
+.LASF3052:
 	.string	"pdev"
 .LASF841:
 	.string	"system_long_wq"
@@ -52900,7 +55708,7 @@ __exitcall_ebc_exit:
 	.string	"c_true"
 .LASF1592:
 	.string	"notifier_call"
-.LASF3095:
+.LASF3096:
 	.string	"ebc_exit"
 .LASF1847:
 	.string	"gendisk"
@@ -52908,7 +55716,7 @@ __exitcall_ebc_exit:
 	.string	"spc_timelimit"
 .LASF512:
 	.string	"s_instances"
-.LASF2910:
+.LASF2911:
 	.string	"EPD_AUTO_DU"
 .LASF2750:
 	.string	"sh_size"
@@ -52928,7 +55736,7 @@ __exitcall_ebc_exit:
 	.string	"size_t"
 .LASF209:
 	.string	"compat_elf_hwcap"
-.LASF3300:
+.LASF3311:
 	.string	"prepare_to_wait_event"
 .LASF1124:
 	.string	"cap_permitted"
@@ -52970,7 +55778,7 @@ __exitcall_ebc_exit:
 	.string	"__reserved"
 .LASF954:
 	.string	"_sigfault"
-.LASF3153:
+.LASF3162:
 	.string	"image_bg"
 .LASF2872:
 	.string	"ebc_buf_status"
@@ -53010,7 +55818,7 @@ __exitcall_ebc_exit:
 	.string	"delayed_call"
 .LASF934:
 	.string	"_status"
-.LASF2919:
+.LASF2920:
 	.string	"pmic_name"
 .LASF1478:
 	.string	"NR_FREE_CMA_PAGES"
@@ -53022,11 +55830,11 @@ __exitcall_ebc_exit:
 	.string	"bin_attribute"
 .LASF1617:
 	.string	"percpu_counter"
-.LASF3009:
+.LASF3010:
 	.string	"first_in"
 .LASF2343:
 	.string	"dev_groups"
-.LASF2969:
+.LASF2970:
 	.string	"image_addr_set"
 .LASF301:
 	.string	"__softirqentry_text_start"
@@ -53060,9 +55868,9 @@ __exitcall_ebc_exit:
 	.string	"irqchip_fwnode_ops"
 .LASF1628:
 	.string	"dq_id"
-.LASF3144:
+.LASF3153:
 	.string	"frame_count_tmp"
-.LASF3152:
+.LASF3161:
 	.string	"image_fb"
 .LASF1803:
 	.string	"write_end"
@@ -53070,7 +55878,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ION_HEAP_POOL"
 .LASF1438:
 	.string	"sysctl_protected_hardlinks"
-.LASF3304:
+.LASF3315:
 	.string	"__arch_copy_from_user"
 .LASF1191:
 	.string	"scan_objects"
@@ -53078,7 +55886,7 @@ __exitcall_ebc_exit:
 	.string	"pageset"
 .LASF1252:
 	.string	"wb_err"
-.LASF3196:
+.LASF3207:
 	.string	"copy_to_user"
 .LASF735:
 	.string	"trace_recursion"
@@ -53092,7 +55900,7 @@ __exitcall_ebc_exit:
 	.string	"jit_keyring"
 .LASF169:
 	.string	"file_disp"
-.LASF2986:
+.LASF2987:
 	.string	"auto_need_refresh"
 .LASF2860:
 	.string	"WF_TYPE_GRAY2"
@@ -53158,6 +55966,8 @@ __exitcall_ebc_exit:
 	.string	"poll"
 .LASF2458:
 	.string	"graph_get_next_endpoint"
+.LASF3145:
+	.string	"clac_full_data_32_to_16"
 .LASF1424:
 	.string	"io_cq"
 .LASF2869:
@@ -53170,11 +55980,11 @@ __exitcall_ebc_exit:
 	.string	"latch_tree_node"
 .LASF1169:
 	.string	"cad_pid"
-.LASF2958:
+.LASF2959:
 	.string	"lgonl"
 .LASF535:
 	.string	"destroy_work"
-.LASF3104:
+.LASF3105:
 	.string	"one_buffer_end"
 .LASF254:
 	.string	"FTR_LOWER_SAFE"
@@ -53190,7 +56000,7 @@ __exitcall_ebc_exit:
 	.string	"pcpu_chosen_fc"
 .LASF391:
 	.string	"dentry_stat_t"
-.LASF3249:
+.LASF3260:
 	.string	"atomic_add"
 .LASF1657:
 	.string	"dqi_bgrace"
@@ -53208,7 +56018,7 @@ __exitcall_ebc_exit:
 	.string	"ctl_table"
 .LASF44:
 	.string	"uid_t"
-.LASF3279:
+.LASF3290:
 	.string	"strstr"
 .LASF2862:
 	.string	"WF_TYPE_A2"
@@ -53228,10 +56038,12 @@ __exitcall_ebc_exit:
 	.string	"write"
 .LASF2609:
 	.string	"__tracepoint_page_ref_freeze"
-.LASF2948:
+.LASF2949:
 	.string	"panel_buffer"
 .LASF317:
 	.string	"__exception_text_end"
+.LASF3138:
+	.string	"clac_part_data_16_to_32"
 .LASF2748:
 	.string	"sh_addr"
 .LASF275:
@@ -53270,7 +56082,7 @@ __exitcall_ebc_exit:
 	.string	"pteval_t"
 .LASF430:
 	.string	"i_ino"
-.LASF3323:
+.LASF3334:
 	.string	"might_fault"
 .LASF1576:
 	.string	"compact_cached_free_pfn"
@@ -53278,7 +56090,7 @@ __exitcall_ebc_exit:
 	.string	"index"
 .LASF2218:
 	.string	"driver_data"
-.LASF2956:
+.LASF2957:
 	.string	"sdck"
 .LASF2823:
 	.string	"module_kset"
@@ -53296,7 +56108,7 @@ __exitcall_ebc_exit:
 	.string	"randomize_va_space"
 .LASF2594:
 	.string	"confirm_switch"
-.LASF2906:
+.LASF2907:
 	.string	"EPD_SUSPEND"
 .LASF381:
 	.string	"seqcount_t"
@@ -53352,7 +56164,7 @@ __exitcall_ebc_exit:
 	.string	"prev_sum_exec_runtime"
 .LASF1752:
 	.string	"gpl_future_syms"
-.LASF2892:
+.LASF2893:
 	.string	"EPD_FULL_GLR16"
 .LASF1056:
 	.string	"nr_forced_migrations"
@@ -53360,7 +56172,9 @@ __exitcall_ebc_exit:
 	.string	"seq_operations"
 .LASF638:
 	.string	"stack_canary"
-.LASF3116:
+.LASF3044:
+	.string	"__addressable_ebc_init3102"
+.LASF3117:
 	.string	"no_black_count"
 .LASF1175:
 	.string	"blksize"
@@ -53390,7 +56204,7 @@ __exitcall_ebc_exit:
 	.string	"pidfd_fops"
 .LASF1931:
 	.string	"lm_put_owner"
-.LASF3281:
+.LASF3292:
 	.string	"ebc_pmic_verity_vcom"
 .LASF2538:
 	.string	"set_sda"
@@ -53456,7 +56270,7 @@ __exitcall_ebc_exit:
 	.string	"func"
 .LASF1155:
 	.string	"perf_event_context"
-.LASF3021:
+.LASF3022:
 	.string	"ebc_auto_task"
 .LASF94:
 	.string	"printk_delay_msec"
@@ -53486,11 +56300,11 @@ __exitcall_ebc_exit:
 	.string	"wake_q_node"
 .LASF1131:
 	.string	"request_key_auth"
-.LASF3032:
+.LASF3033:
 	.string	"waveform_misc"
 .LASF1968:
 	.string	"destroy_inode"
-.LASF2983:
+.LASF2984:
 	.string	"is_busy_now"
 .LASF58:
 	.string	"irq_hw_number_t"
@@ -53498,12 +56312,12 @@ __exitcall_ebc_exit:
 	.string	"sysfs_dev_block_kobj"
 .LASF555:
 	.string	"upid"
-.LASF3311:
+.LASF3323:
 	.string	"down_write"
 .LASF1113:
 	.string	"completion"
-.LASF3043:
-	.string	"__addressable_ebc_init2636"
+.LASF3103:
+	.string	"old_prev_buf"
 .LASF1514:
 	.string	"NR_GPU_HEAP"
 .LASF875:
@@ -53516,13 +56330,13 @@ __exitcall_ebc_exit:
 	.string	"__con_initcall_end"
 .LASF1160:
 	.string	"active_uprobe"
-.LASF3025:
+.LASF3026:
 	.string	"ebc_poweroff_wq"
 .LASF1986:
 	.string	"show_options"
 .LASF2157:
 	.string	"uevent_helper"
-.LASF2981:
+.LASF2982:
 	.string	"lut_buffer_phy"
 .LASF110:
 	.string	"mmap_supported_flags"
@@ -53552,7 +56366,7 @@ __exitcall_ebc_exit:
 	.string	"taint_flag"
 .LASF1993:
 	.string	"get_dquots"
-.LASF3290:
+.LASF3301:
 	.string	"of_find_node_by_phandle"
 .LASF2417:
 	.string	"unmap_page"
@@ -53576,7 +56390,7 @@ __exitcall_ebc_exit:
 	.string	"vm_operations_struct"
 .LASF2405:
 	.string	"hwirq_max"
-.LASF3247:
+.LASF3258:
 	.string	"__fswab32"
 .LASF2213:
 	.string	"runtime_idle"
@@ -53606,13 +56420,13 @@ __exitcall_ebc_exit:
 	.string	"RPM_SUSPENDED"
 .LASF698:
 	.string	"reclaim_state"
-.LASF3322:
+.LASF3333:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF138:
 	.string	"vendor_panic_cb"
-.LASF3097:
+.LASF3098:
 	.string	"ebc_vdd_power_timeout"
-.LASF3168:
+.LASF3179:
 	.string	"ebc_get_4pix_wf"
 .LASF2813:
 	.string	"num_symtab"
@@ -53634,7 +56448,7 @@ __exitcall_ebc_exit:
 	.string	"_refcount"
 .LASF466:
 	.string	"i_crypt_info"
-.LASF3082:
+.LASF3083:
 	.string	"waveform_mmap"
 .LASF1886:
 	.string	"flc_flock"
@@ -53642,13 +56456,13 @@ __exitcall_ebc_exit:
 	.string	"module_alloc_base"
 .LASF1766:
 	.string	"core_kallsyms"
-.LASF3284:
+.LASF3295:
 	.string	"memcpy"
-.LASF2909:
+.LASF2910:
 	.string	"EPD_FORCE_FULL"
 .LASF2415:
 	.string	"get_sgtable"
-.LASF3148:
+.LASF3157:
 	.string	"xor_val"
 .LASF2170:
 	.string	"envp_idx"
@@ -53660,11 +56474,11 @@ __exitcall_ebc_exit:
 	.string	"OOM_KILL"
 .LASF445:
 	.string	"i_hash"
-.LASF3131:
+.LASF3134:
 	.string	"gray_old"
 .LASF68:
 	.string	"hlist_node"
-.LASF3293:
+.LASF3304:
 	.string	"sprintf"
 .LASF1923:
 	.string	"fl_ops"
@@ -53676,7 +56490,7 @@ __exitcall_ebc_exit:
 	.string	"WQ_MEM_RECLAIM"
 .LASF2688:
 	.string	"COMPACTISOLATED"
-.LASF3260:
+.LASF3271:
 	.string	"of_property_read_variable_u32_array"
 .LASF328:
 	.string	"__inittext_begin"
@@ -53712,7 +56526,7 @@ __exitcall_ebc_exit:
 	.string	"DOMAIN_BUS_WAKEUP"
 .LASF1237:
 	.string	"arm64_el2_vector_last_slot"
-.LASF3317:
+.LASF3327:
 	.string	"queue_work_on"
 .LASF2350:
 	.string	"online"
@@ -53720,17 +56534,17 @@ __exitcall_ebc_exit:
 	.string	"runtime_resume"
 .LASF1222:
 	.string	"dup_xol_work"
-.LASF3189:
+.LASF3200:
 	.string	"ebc_pmic_read_temp"
-.LASF2890:
+.LASF2891:
 	.string	"EPD_FULL_GC16"
-.LASF3038:
+.LASF3039:
 	.string	"dev_attr_ebc_state"
 .LASF2176:
 	.string	"kernel_kobj"
 .LASF2602:
 	.string	"funcs"
-.LASF3017:
+.LASF3018:
 	.string	"overlay_enable"
 .LASF1122:
 	.string	"securebits"
@@ -53740,7 +56554,7 @@ __exitcall_ebc_exit:
 	.string	"total_vm"
 .LASF623:
 	.string	"jobctl"
-.LASF2888:
+.LASF2889:
 	.string	"EPD_AUTO"
 .LASF332:
 	.string	"__entry_tramp_text_start"
@@ -53750,7 +56564,7 @@ __exitcall_ebc_exit:
 	.string	"DOMAIN_BUS_NEXUS"
 .LASF2053:
 	.string	"sysctl_mount_point"
-.LASF3012:
+.LASF3013:
 	.string	"auto_buffer_work"
 .LASF267:
 	.string	"user_mask"
@@ -53794,7 +56608,7 @@ __exitcall_ebc_exit:
 	.string	"UNEVICTABLE_PGMLOCKED"
 .LASF851:
 	.string	"pgdval_t"
-.LASF2933:
+.LASF2934:
 	.string	"page_link"
 .LASF1874:
 	.string	"setattr"
@@ -53806,7 +56620,7 @@ __exitcall_ebc_exit:
 	.string	"prepare"
 .LASF2153:
 	.string	"bin_attrs"
-.LASF2943:
+.LASF2944:
 	.string	"HYPERVISOR_shared_info"
 .LASF683:
 	.string	"sas_ss_flags"
@@ -53814,7 +56628,7 @@ __exitcall_ebc_exit:
 	.string	"f_mode"
 .LASF1444:
 	.string	"ki_complete"
-.LASF3054:
+.LASF3055:
 	.string	"ebc_tcon_pdev"
 .LASF1770:
 	.string	"percpu"
@@ -53834,13 +56648,13 @@ __exitcall_ebc_exit:
 	.string	"driver"
 .LASF1559:
 	.string	"ZONE_NORMAL"
-.LASF3154:
+.LASF3163:
 	.string	"image_new_data"
 .LASF426:
 	.string	"i_op"
 .LASF1701:
 	.string	"d_rt_spc_hardlimit"
-.LASF2995:
+.LASF2996:
 	.string	"ebc_task"
 .LASF2141:
 	.string	"kobj_ns_type_operations"
@@ -53862,7 +56676,7 @@ __exitcall_ebc_exit:
 	.string	"list_lru_node"
 .LASF394:
 	.string	"age_limit"
-.LASF2895:
+.LASF2896:
 	.string	"EPD_PART_GC16"
 .LASF237:
 	.string	"spinlock_t"
@@ -53882,13 +56696,13 @@ __exitcall_ebc_exit:
 	.string	"trace_bprintk_fmt_start"
 .LASF666:
 	.string	"cpu_timers"
-.LASF2967:
+.LASF2968:
 	.string	"disable"
 .LASF1315:
 	.string	"huge_fault"
 .LASF2023:
 	.string	"kstatfs"
-.LASF3192:
+.LASF3203:
 	.string	"ebc_pmic_power_off"
 .LASF2649:
 	.string	"PGPGOUTCLEAN"
@@ -53906,7 +56720,7 @@ __exitcall_ebc_exit:
 	.string	"i_dentry"
 .LASF2143:
 	.string	"grab_current_ns"
-.LASF3069:
+.LASF3070:
 	.string	"fb_size"
 .LASF898:
 	.string	"offset"
@@ -53916,7 +56730,7 @@ __exitcall_ebc_exit:
 	.string	"fsnotify_mark_connector"
 .LASF956:
 	.string	"_sigsys"
-.LASF3118:
+.LASF3119:
 	.string	"ebc_lut_update"
 .LASF1936:
 	.string	"lm_setup"
@@ -53950,7 +56764,7 @@ __exitcall_ebc_exit:
 	.string	"idmap_pg_dir"
 .LASF2533:
 	.string	"i2c_bus_recovery_info"
-.LASF2982:
+.LASF2983:
 	.string	"lut_buffer_size"
 .LASF484:
 	.string	"s_dev"
@@ -53960,7 +56774,7 @@ __exitcall_ebc_exit:
 	.string	"get_next_id"
 .LASF238:
 	.string	"rwlock_t"
-.LASF3321:
+.LASF3332:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
 .LASF855:
 	.string	"pgprot"
@@ -53976,7 +56790,7 @@ __exitcall_ebc_exit:
 	.string	"PIDTYPE_TGID"
 .LASF1930:
 	.string	"lm_get_owner"
-.LASF2920:
+.LASF2921:
 	.string	"drvpar"
 .LASF2646:
 	.string	"vm_event_item"
@@ -53988,7 +56802,7 @@ __exitcall_ebc_exit:
 	.string	"__icache_flags"
 .LASF148:
 	.string	"crash_kexec_post_notifiers"
-.LASF3177:
+.LASF3188:
 	.string	"eink_mode"
 .LASF1712:
 	.string	"rt_spc_warnlimit"
@@ -54010,7 +56824,7 @@ __exitcall_ebc_exit:
 	.string	"_pid"
 .LASF1171:
 	.string	"init_stack"
-.LASF3160:
+.LASF3169:
 	.string	"dmask"
 .LASF1240:
 	.string	"address_space"
@@ -54018,21 +56832,23 @@ __exitcall_ebc_exit:
 	.string	"mm_context_t"
 .LASF1326:
 	.string	"startup"
+.LASF3139:
+	.string	"clac_part_data_32"
 .LASF835:
 	.string	"__WQ_ORDERED_EXPLICIT"
 .LASF1433:
 	.string	"sysctl_nr_open"
 .LASF82:
 	.string	"reset_devices"
-.LASF2998:
+.LASF2999:
 	.string	"auto_image_bg"
 .LASF447:
 	.string	"i_wb"
 .LASF2101:
 	.string	"idr_next"
-.LASF3145:
+.LASF3154:
 	.string	"frame_count_data"
-.LASF2972:
+.LASF2973:
 	.string	"frame_start"
 .LASF1265:
 	.string	"compound_order"
@@ -54080,7 +56896,7 @@ __exitcall_ebc_exit:
 	.string	"normal_prio"
 .LASF1303:
 	.string	"f_ep_links"
-.LASF3158:
+.LASF3167:
 	.string	"image_fb_tmp"
 .LASF2309:
 	.string	"last_busy"
@@ -54092,7 +56908,7 @@ __exitcall_ebc_exit:
 	.string	"host"
 .LASF185:
 	.string	"uaddr"
-.LASF3312:
+.LASF3322:
 	.string	"ebc_remove_from_dsp_buf_list"
 .LASF662:
 	.string	"real_start_time"
@@ -54128,11 +56944,11 @@ __exitcall_ebc_exit:
 	.string	"devres_head"
 .LASF428:
 	.string	"i_mapping"
-.LASF3285:
+.LASF3296:
 	.string	"misc_register"
 .LASF723:
 	.string	"rseq_sig"
-.LASF3211:
+.LASF3222:
 	.string	"platform_set_drvdata"
 .LASF343:
 	.string	"cpu_context"
@@ -54140,7 +56956,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pm_domain"
 .LASF1528:
 	.string	"nr_zones"
-.LASF3233:
+.LASF3244:
 	.string	"is_source"
 .LASF1390:
 	.string	"migrate_mode"
@@ -54162,11 +56978,11 @@ __exitcall_ebc_exit:
 	.string	"d_hash"
 .LASF1090:
 	.string	"dl_bw"
-.LASF3204:
+.LASF3215:
 	.string	"limit"
 .LASF2160:
 	.string	"kobj"
-.LASF3294:
+.LASF3305:
 	.string	"kstrtouint"
 .LASF114:
 	.string	"fsync"
@@ -54174,15 +56990,15 @@ __exitcall_ebc_exit:
 	.string	"mtd_info"
 .LASF423:
 	.string	"i_flags"
-.LASF2907:
+.LASF2908:
 	.string	"EPD_RESUME"
-.LASF3280:
+.LASF3291:
 	.string	"sscanf"
-.LASF3276:
+.LASF3287:
 	.string	"ebc_empty_buf_get"
 .LASF1489:
 	.string	"NR_ISOLATED_ANON"
-.LASF3070:
+.LASF3071:
 	.string	"ebc_lut_table_init"
 .LASF1228:
 	.string	"uprobes_state"
@@ -54192,7 +57008,7 @@ __exitcall_ebc_exit:
 	.string	"rb_node"
 .LASF614:
 	.string	"pushable_tasks"
-.LASF3159:
+.LASF3168:
 	.string	"image_bg_tmp"
 .LASF2217:
 	.string	"platform_data"
@@ -54222,13 +57038,13 @@ __exitcall_ebc_exit:
 	.string	"last_update_time"
 .LASF1152:
 	.string	"robust_list_head"
-.LASF3274:
+.LASF3285:
 	.string	"init_timer_key"
 .LASF1495:
 	.string	"NR_ANON_MAPPED"
 .LASF383:
 	.string	"count"
-.LASF3028:
+.LASF3029:
 	.string	"resume_count_start"
 .LASF557:
 	.string	"level"
@@ -54238,9 +57054,9 @@ __exitcall_ebc_exit:
 	.string	"srcversion"
 .LASF873:
 	.string	"pcpu_unit_offsets"
-.LASF3180:
+.LASF3191:
 	.string	"dma_sync_single_for_device"
-.LASF2973:
+.LASF2974:
 	.string	"dsp_end_callback"
 .LASF461:
 	.string	"i_data"
@@ -54264,7 +57080,7 @@ __exitcall_ebc_exit:
 	.string	"usage_count"
 .LASF2092:
 	.string	"show"
-.LASF3035:
+.LASF3036:
 	.string	"dev_attr_pmic_temp"
 .LASF7:
 	.string	"unsigned char"
@@ -54280,7 +57096,7 @@ __exitcall_ebc_exit:
 	.string	"task_rss_stat"
 .LASF1156:
 	.string	"pipe_inode_info"
-.LASF3002:
+.LASF3003:
 	.string	"ebc_power_status"
 .LASF975:
 	.string	"ratelimit"
@@ -54296,7 +57112,7 @@ __exitcall_ebc_exit:
 	.string	"uevent_ops"
 .LASF546:
 	.string	"rename_lock"
-.LASF3103:
+.LASF3104:
 	.string	"__out"
 .LASF681:
 	.string	"sas_ss_sp"
@@ -54304,7 +57120,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_INACTIVE_ANON"
 .LASF729:
 	.string	"nr_dirtied"
-.LASF3221:
+.LASF3232:
 	.string	"dev_get_drvdata"
 .LASF2410:
 	.string	"linear_revmap"
@@ -54348,11 +57164,11 @@ __exitcall_ebc_exit:
 	.string	"sysctl_memory_failure_early_kill"
 .LASF2775:
 	.string	"param_ops_bool_enable_only"
-.LASF3165:
+.LASF3174:
 	.string	"power_status"
 .LASF307:
 	.string	"__start_opd"
-.LASF3289:
+.LASF3300:
 	.string	"of_find_i2c_device_by_node"
 .LASF154:
 	.string	"SYSTEM_RUNNING"
@@ -54370,7 +57186,7 @@ __exitcall_ebc_exit:
 	.string	"icq_hint"
 .LASF2009:
 	.string	"fiemap_extent_info"
-.LASF2929:
+.LASF2930:
 	.string	"DMA_TO_DEVICE"
 .LASF2744:
 	.string	"elf64_shdr"
@@ -54388,11 +57204,11 @@ __exitcall_ebc_exit:
 	.string	"sigval_t"
 .LASF1948:
 	.string	"fa_file"
-.LASF3019:
+.LASF3020:
 	.string	"panel"
 .LASF2447:
 	.string	"irq_data"
-.LASF3110:
+.LASF3111:
 	.string	"old_buffer_temp"
 .LASF2720:
 	.string	"sysctl_memory_failure_recovery"
@@ -54410,7 +57226,7 @@ __exitcall_ebc_exit:
 	.string	"st_shndx"
 .LASF2414:
 	.string	"free"
-.LASF3075:
+.LASF3076:
 	.string	"pmic_vcom_write"
 .LASF2148:
 	.string	"attribute"
@@ -54426,7 +57242,7 @@ __exitcall_ebc_exit:
 	.string	"taint_flags"
 .LASF1362:
 	.string	"membarrier_state"
-.LASF3171:
+.LASF3182:
 	.string	"pre_image_addr"
 .LASF2193:
 	.string	"suspend"
@@ -54480,7 +57296,7 @@ __exitcall_ebc_exit:
 	.string	"path"
 .LASF2742:
 	.string	"st_size"
-.LASF3039:
+.LASF3040:
 	.string	"dev_attr_ebc_buf_state"
 .LASF189:
 	.string	"rmtp"
@@ -54494,7 +57310,7 @@ __exitcall_ebc_exit:
 	.string	"exit_code"
 .LASF1071:
 	.string	"exec_start"
-.LASF3315:
+.LASF3329:
 	.string	"printk"
 .LASF2396:
 	.string	"consumers"
@@ -54514,13 +57330,13 @@ __exitcall_ebc_exit:
 	.string	"arch_uprobe_task"
 .LASF459:
 	.string	"i_fop"
-.LASF2901:
+.LASF2902:
 	.string	"EPD_A2_DITHER"
 .LASF1868:
 	.string	"unlink"
 .LASF2732:
 	.string	"d_ptr"
-.LASF3077:
+.LASF3078:
 	.string	"pmic_temp_read"
 .LASF1667:
 	.string	"dqstats"
@@ -54542,11 +57358,11 @@ __exitcall_ebc_exit:
 	.string	"mmap_rnd_bits"
 .LASF2476:
 	.string	"of_stdout"
-.LASF3101:
+.LASF3102:
 	.string	"new_prev_buf"
 .LASF991:
 	.string	"vm_ops"
-.LASF2949:
+.LASF2950:
 	.string	"ebc_panel"
 .LASF1317:
 	.string	"pagesize"
@@ -54558,9 +57374,9 @@ __exitcall_ebc_exit:
 	.string	"timer"
 .LASF2477:
 	.string	"devtree_lock"
-.LASF3162:
+.LASF3171:
 	.string	"refresh_new_image_auto"
-.LASF3091:
+.LASF3092:
 	.string	"__ret"
 .LASF1277:
 	.string	"_zd_pad_1"
@@ -54584,17 +57400,17 @@ __exitcall_ebc_exit:
 	.string	"expiry"
 .LASF572:
 	.string	"optimistic_spin_queue"
-.LASF2978:
+.LASF2979:
 	.string	"ebc_buffer_size"
-.LASF3295:
+.LASF3306:
 	.string	"ebc_pmic_set_vcom"
 .LASF2656:
 	.string	"ALLOCSTALL_NORMAL"
-.LASF3135:
+.LASF3136:
 	.string	"data_buf_tmp"
 .LASF326:
 	.string	"__initdata_begin"
-.LASF2923:
+.LASF2924:
 	.string	"pmic_pm_resume"
 .LASF225:
 	.string	"__lstate"
@@ -54668,7 +57484,7 @@ __exitcall_ebc_exit:
 	.string	"algo_data"
 .LASF1526:
 	.string	"node_zones"
-.LASF3036:
+.LASF3037:
 	.string	"dev_attr_pmic_vcom"
 .LASF1574:
 	.string	"initialized"
@@ -54682,7 +57498,7 @@ __exitcall_ebc_exit:
 	.string	"mod_plt_sec"
 .LASF637:
 	.string	"tgid"
-.LASF2913:
+.LASF2914:
 	.string	"epd_mode"
 .LASF1153:
 	.string	"compat_robust_list_head"
@@ -54758,12 +57574,14 @@ __exitcall_ebc_exit:
 	.string	"seq_show"
 .LASF767:
 	.string	"ate_match_dt"
-.LASF3219:
+.LASF3230:
 	.string	"of_node_put"
 .LASF1375:
 	.string	"cow_page"
 .LASF1607:
 	.string	"core_id"
+.LASF3178:
+	.string	"ebc_get_2pix_wf_32"
 .LASF2504:
 	.string	"block"
 .LASF2706:
@@ -54780,11 +57598,11 @@ __exitcall_ebc_exit:
 	.string	"param_ops_ushort"
 .LASF526:
 	.string	"s_shrink"
-.LASF3143:
+.LASF3152:
 	.string	"gray_new_temp"
 .LASF1540:
 	.string	"kcompactd_classzone_idx"
-.LASF3209:
+.LASF3220:
 	.string	"kmalloc_index"
 .LASF884:
 	.string	"hrtimer_restart"
@@ -54792,7 +57610,7 @@ __exitcall_ebc_exit:
 	.string	"totalram_pages"
 .LASF2501:
 	.string	"i2c_smbus_data"
-.LASF3006:
+.LASF3007:
 	.string	"curr_dsp_buf"
 .LASF1083:
 	.string	"time_slice"
@@ -54832,7 +57650,7 @@ __exitcall_ebc_exit:
 	.string	"wake_lock"
 .LASF2285:
 	.string	"may_skip_resume"
-.LASF3015:
+.LASF3016:
 	.string	"is_deep_sleep"
 .LASF1189:
 	.string	"shrinker"
@@ -54864,7 +57682,7 @@ __exitcall_ebc_exit:
 	.string	"ate_match_local_cap_id"
 .LASF2468:
 	.string	"property"
-.LASF3071:
+.LASF3072:
 	.string	"ebc_sysfs_init"
 .LASF1006:
 	.string	"wchar"
@@ -54874,7 +57692,7 @@ __exitcall_ebc_exit:
 	.string	"platform_notify"
 .LASF62:
 	.string	"kernel_symbol"
-.LASF2941:
+.LASF2942:
 	.string	"dma_virt_ops"
 .LASF2313:
 	.string	"subsys_data"
@@ -54894,7 +57712,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_DELAYED_BIT"
 .LASF1053:
 	.string	"nr_failed_migrations_affine"
-.LASF3224:
+.LASF3235:
 	.string	"IS_ERR"
 .LASF876:
 	.string	"PCPU_FC_EMBED"
@@ -54908,7 +57726,7 @@ __exitcall_ebc_exit:
 	.string	"pi_top_task"
 .LASF806:
 	.string	"WORK_NR_COLORS"
-.LASF3163:
+.LASF3172:
 	.string	"refresh_new_image2"
 .LASF528:
 	.string	"s_fsnotify_inode_refs"
@@ -54920,7 +57738,7 @@ __exitcall_ebc_exit:
 	.string	"uprobe"
 .LASF529:
 	.string	"s_readonly_remount"
-.LASF3252:
+.LASF3263:
 	.string	"kasan_check_write"
 .LASF378:
 	.string	"hlist_bl_node"
@@ -54946,7 +57764,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_FLAG_MASK"
 .LASF1286:
 	.string	"units"
-.LASF3267:
+.LASF3278:
 	.string	"epd_lut_from_mem_init"
 .LASF312:
 	.string	"__nosave_begin"
@@ -54966,7 +57784,7 @@ __exitcall_ebc_exit:
 	.string	"user_namespace"
 .LASF2771:
 	.string	"param_ops_ulong"
-.LASF3240:
+.LASF3251:
 	.string	"get_current"
 .LASF232:
 	.string	"raw_spinlock"
@@ -54974,7 +57792,7 @@ __exitcall_ebc_exit:
 	.string	"kswapd_wait"
 .LASF2302:
 	.string	"timer_autosuspends"
-.LASF2897:
+.LASF2898:
 	.string	"EPD_PART_GLR16"
 .LASF2693:
 	.string	"KCOMPACTD_MIGRATE_SCANNED"
@@ -54990,7 +57808,7 @@ __exitcall_ebc_exit:
 	.string	"fault_address"
 .LASF1621:
 	.string	"dq_inuse"
-.LASF3126:
+.LASF3127:
 	.string	"direct_mode_data_change_part"
 .LASF1656:
 	.string	"dqi_flags"
@@ -54998,13 +57816,13 @@ __exitcall_ebc_exit:
 	.string	"PGREFILL"
 .LASF2777:
 	.string	"param_ops_bint"
-.LASF3277:
+.LASF3288:
 	.string	"ebc_add_to_dsp_buf_list"
-.LASF3282:
+.LASF3293:
 	.string	"kfree"
 .LASF1817:
 	.string	"swap_deactivate"
-.LASF2957:
+.LASF2958:
 	.string	"gdck_sta"
 .LASF1158:
 	.string	"request_queue"
@@ -55012,7 +57830,7 @@ __exitcall_ebc_exit:
 	.string	"WORKINGSET_REFAULT"
 .LASF1655:
 	.string	"dqi_dirty_list"
-.LASF3072:
+.LASF3073:
 	.string	"ebc_buf_state_read"
 .LASF230:
 	.string	"prove_locking"
@@ -55026,7 +57844,7 @@ __exitcall_ebc_exit:
 	.string	"gtime"
 .LASF573:
 	.string	"debug_locks"
-.LASF3022:
+.LASF3023:
 	.string	"auto_buf_sema"
 .LASF1798:
 	.string	"readpage"
@@ -55046,7 +57864,7 @@ __exitcall_ebc_exit:
 	.string	"perm"
 .LASF715:
 	.string	"compat_robust_list"
-.LASF2976:
+.LASF2977:
 	.string	"ebc_buffer_phy"
 .LASF2492:
 	.string	"unmap"
@@ -55068,9 +57886,9 @@ __exitcall_ebc_exit:
 	.string	"alternatives_applied"
 .LASF598:
 	.string	"boost_expires"
-.LASF2928:
+.LASF2929:
 	.string	"DMA_BIDIRECTIONAL"
-.LASF3303:
+.LASF3314:
 	.string	"__arch_copy_to_user"
 .LASF236:
 	.string	"spinlock"
@@ -55088,13 +57906,13 @@ __exitcall_ebc_exit:
 	.string	"d_compare"
 .LASF986:
 	.string	"vm_mm"
-.LASF3111:
+.LASF3112:
 	.string	"need_refresh"
 .LASF2835:
 	.string	"platform_bus_type"
-.LASF3127:
+.LASF3128:
 	.string	"data_buf"
-.LASF3063:
+.LASF3064:
 	.string	"ulogo_buf"
 .LASF1652:
 	.string	"mem_dqinfo"
@@ -55112,15 +57930,15 @@ __exitcall_ebc_exit:
 	.string	"WORK_OFFQ_POOL_BITS"
 .LASF1920:
 	.string	"fl_fasync"
-.LASF3174:
+.LASF3185:
 	.string	"update_mode"
-.LASF2955:
+.LASF2956:
 	.string	"direct_mode"
 .LASF2426:
 	.string	"cache_sync"
 .LASF436:
 	.string	"i_lock"
-.LASF2993:
+.LASF2994:
 	.string	"ebc_dsp_buf_status"
 .LASF408:
 	.string	"d_name"
@@ -55154,7 +57972,7 @@ __exitcall_ebc_exit:
 	.string	"last_switch_time"
 .LASF566:
 	.string	"fs_overflowuid"
-.LASF2944:
+.LASF2945:
 	.string	"start_info"
 .LASF2708:
 	.string	"vm_zone_stat"
@@ -55184,15 +58002,15 @@ __exitcall_ebc_exit:
 	.string	"page_ext_operations"
 .LASF2678:
 	.string	"KSWAPD_HIGH_WMARK_HIT_QUICKLY"
-.LASF3073:
+.LASF3074:
 	.string	"ebc_state_read"
-.LASF3291:
+.LASF3302:
 	.string	"__stack_chk_fail"
-.LASF2926:
+.LASF2927:
 	.string	"pmic_set_vcom"
 .LASF2714:
 	.string	"stack_guard_gap"
-.LASF3232:
+.LASF3243:
 	.string	"bytes"
 .LASF1753:
 	.string	"gpl_future_crcs"
@@ -55224,7 +58042,7 @@ __exitcall_ebc_exit:
 	.string	"thaw_noirq"
 .LASF984:
 	.string	"vm_rb"
-.LASF3047:
+.LASF3048:
 	.string	"kernel_read_file_str"
 .LASF569:
 	.string	"init_user_ns"
@@ -55232,7 +58050,7 @@ __exitcall_ebc_exit:
 	.string	"add_links"
 .LASF2189:
 	.string	"pm_message_t"
-.LASF2946:
+.LASF2947:
 	.string	"xen_dma_ops"
 .LASF1459:
 	.string	"page_group_by_mobility_disabled"
@@ -55266,9 +58084,9 @@ __exitcall_ebc_exit:
 	.string	"payload"
 .LASF1404:
 	.string	"cb_state"
-.LASF2938:
+.LASF2939:
 	.string	"orig_nents"
-.LASF3090:
+.LASF3091:
 	.string	"buf_addr"
 .LASF413:
 	.string	"d_sb"
@@ -55296,7 +58114,7 @@ __exitcall_ebc_exit:
 	.string	"i_mtime"
 .LASF2619:
 	.string	"dev_page_fault_t"
-.LASF3121:
+.LASF3122:
 	.string	"ebc_auto_tast_function"
 .LASF24:
 	.string	"__kernel_gid32_t"
@@ -55308,7 +58126,7 @@ __exitcall_ebc_exit:
 	.string	"MODULE_STATE_COMING"
 .LASF2246:
 	.string	"offline_disabled"
-.LASF3217:
+.LASF3228:
 	.string	"of_property_read_u32_array"
 .LASF2491:
 	.string	"select"
@@ -55332,7 +58150,7 @@ __exitcall_ebc_exit:
 	.string	"async_put_work"
 .LASF2131:
 	.string	"kernfs_syscall_ops"
-.LASF3003:
+.LASF3004:
 	.string	"ebc_last_display"
 .LASF1872:
 	.string	"mknod"
@@ -55340,7 +58158,7 @@ __exitcall_ebc_exit:
 	.string	"SYSTEM_BOOTING"
 .LASF1615:
 	.string	"max_freq_scale"
-.LASF2939:
+.LASF2940:
 	.string	"dma_direct_ops"
 .LASF2267:
 	.string	"dev_pm_info"
@@ -55354,7 +58172,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pagemap"
 .LASF2663:
 	.string	"PGDEACTIVATE"
-.LASF3134:
+.LASF3133:
 	.string	"buffer_old_tmp"
 .LASF1799:
 	.string	"writepages"
@@ -55376,13 +58194,13 @@ __exitcall_ebc_exit:
 	.string	"writeback_control"
 .LASF1919:
 	.string	"fl_end"
-.LASF3306:
+.LASF3317:
 	.string	"ebc_find_buf_by_phy_addr"
 .LASF1966:
 	.string	"super_operations"
 .LASF395:
 	.string	"want_pages"
-.LASF2965:
+.LASF2966:
 	.string	"regmap_base"
 .LASF339:
 	.string	"wps_disabled"
@@ -55408,7 +58226,7 @@ __exitcall_ebc_exit:
 	.string	"i_security"
 .LASF2659:
 	.string	"PGSCAN_SKIP_NORMAL"
-.LASF2937:
+.LASF2938:
 	.string	"nents"
 .LASF757:
 	.string	"__smp_cross_call"
@@ -55416,13 +58234,13 @@ __exitcall_ebc_exit:
 	.string	"core"
 .LASF1830:
 	.string	"bd_holders"
-.LASF3124:
+.LASF3125:
 	.string	"reset_and_flip"
-.LASF2966:
+.LASF2967:
 	.string	"enable"
 .LASF970:
 	.string	"pipe_bufs"
-.LASF3237:
+.LASF3248:
 	.string	"to_user"
 .LASF2139:
 	.string	"KOBJ_NS_TYPE_NET"
@@ -55442,7 +58260,7 @@ __exitcall_ebc_exit:
 	.string	"__rb_parent_color"
 .LASF2239:
 	.string	"devres_lock"
-.LASF3161:
+.LASF3170:
 	.string	"new_buffer_refresh"
 .LASF366:
 	.string	"bits"
@@ -55458,17 +58276,17 @@ __exitcall_ebc_exit:
 	.string	"lookup"
 .LASF1605:
 	.string	"cpu_topology"
-.LASF3241:
+.LASF3252:
 	.string	"sp_el0"
-.LASF3310:
+.LASF3321:
 	.string	"ebc_dsp_buf_get"
-.LASF2915:
+.LASF2916:
 	.string	"panel_color"
 .LASF1911:
 	.string	"fl_owner"
 .LASF2866:
 	.string	"WF_TYPE_GLD16"
-.LASF3016:
+.LASF3017:
 	.string	"is_power_off"
 .LASF994:
 	.string	"vm_private_data"
@@ -55482,7 +58300,7 @@ __exitcall_ebc_exit:
 	.string	"kobj_type"
 .LASF2637:
 	.string	"sysctl_overcommit_kbytes"
-.LASF2987:
+.LASF2988:
 	.string	"frame_left"
 .LASF2494:
 	.string	"deactivate"
@@ -55490,7 +58308,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_AUTO"
 .LASF1242:
 	.string	"i_pages"
-.LASF3201:
+.LASF3212:
 	.string	"safe_ptr"
 .LASF377:
 	.string	"hlist_bl_head"
@@ -55520,9 +58338,9 @@ __exitcall_ebc_exit:
 	.string	"unix_inflight"
 .LASF1741:
 	.string	"holders_dir"
-.LASF3092:
+.LASF3093:
 	.string	"__wq_entry"
-.LASF3106:
+.LASF3107:
 	.string	"new_buffer"
 .LASF464:
 	.string	"i_fsnotify_mask"
@@ -55530,7 +58348,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_LOW_WMARK_HIT_QUICKLY"
 .LASF1009:
 	.string	"syscfs"
-.LASF3194:
+.LASF3205:
 	.string	"wake_unlock"
 .LASF2460:
 	.string	"graph_get_port_parent"
@@ -55540,7 +58358,7 @@ __exitcall_ebc_exit:
 	.string	"UNEVICTABLE_PGRESCUED"
 .LASF2224:
 	.string	"msi_list"
-.LASF3243:
+.LASF3254:
 	.string	"__ilog2_u64"
 .LASF548:
 	.string	"compat_time_t"
@@ -55564,7 +58382,7 @@ __exitcall_ebc_exit:
 	.string	"cap_effective"
 .LASF1761:
 	.string	"taints"
-.LASF3262:
+.LASF3273:
 	.string	"of_address_to_resource"
 .LASF1027:
 	.string	"enqueued"
@@ -55574,7 +58392,7 @@ __exitcall_ebc_exit:
 	.string	"hex_asc_upper"
 .LASF507:
 	.string	"s_roots"
-.LASF2927:
+.LASF2928:
 	.string	"dma_data_direction"
 .LASF1704:
 	.string	"d_rt_spc_timer"
@@ -55592,7 +58410,7 @@ __exitcall_ebc_exit:
 	.string	"bd_private"
 .LASF1918:
 	.string	"fl_start"
-.LASF3216:
+.LASF3227:
 	.string	"out_value"
 .LASF1976:
 	.string	"freeze_fs"
@@ -55600,7 +58418,7 @@ __exitcall_ebc_exit:
 	.string	"sigset_t"
 .LASF1932:
 	.string	"lm_notify"
-.LASF3173:
+.LASF3184:
 	.string	"ebc_tcon_dsp_mode_set"
 .LASF895:
 	.string	"running"
@@ -55626,7 +58444,7 @@ __exitcall_ebc_exit:
 	.string	"d_automount"
 .LASF1280:
 	.string	"page_free"
-.LASF3122:
+.LASF3123:
 	.string	"__val"
 .LASF1496:
 	.string	"NR_FILE_MAPPED"
@@ -55638,19 +58456,19 @@ __exitcall_ebc_exit:
 	.string	"copy_file_range"
 .LASF2700:
 	.string	"UNEVICTABLE_PGCLEARED"
-.LASF3296:
+.LASF3307:
 	.string	"epd_lut_get_wf_version"
 .LASF2062:
 	.string	"key_type"
 .LASF798:
 	.string	"WORK_STRUCT_LINKED_BIT"
-.LASF3234:
+.LASF3245:
 	.string	"copy_overflow"
 .LASF2456:
 	.string	"get_named_child_node"
 .LASF2273:
 	.string	"is_suspended"
-.LASF2935:
+.LASF2936:
 	.string	"dma_length"
 .LASF2081:
 	.string	"burst"
@@ -55658,15 +58476,15 @@ __exitcall_ebc_exit:
 	.string	"clone_mnt_data"
 .LASF2792:
 	.string	"module_kobject"
-.LASF3068:
+.LASF3069:
 	.string	"memory"
-.LASF3208:
+.LASF3219:
 	.string	"order"
 .LASF740:
 	.string	"active_memcg"
 .LASF1347:
 	.string	"def_flags"
-.LASF3020:
+.LASF3021:
 	.string	"global_ebc"
 .LASF1488:
 	.string	"NR_SLAB_UNRECLAIMABLE"
@@ -55674,7 +58492,7 @@ __exitcall_ebc_exit:
 	.string	"refcount"
 .LASF1805:
 	.string	"invalidatepage"
-.LASF3096:
+.LASF3097:
 	.string	"ebc_frame_timeout"
 .LASF364:
 	.string	"wait_queue_head_t"
@@ -55692,11 +58510,11 @@ __exitcall_ebc_exit:
 	.string	"stack_vm_area"
 .LASF2834:
 	.string	"mfd_cell"
-.LASF2900:
+.LASF2901:
 	.string	"EPD_A2"
 .LASF2117:
 	.string	"kernfs_elem_attr"
-.LASF3109:
+.LASF3110:
 	.string	"new_buffer_temp"
 .LASF2314:
 	.string	"set_latency_tolerance"
@@ -55710,7 +58528,7 @@ __exitcall_ebc_exit:
 	.string	"arm64_ftr_reg_ctrel0"
 .LASF1259:
 	.string	"counters"
-.LASF3253:
+.LASF3264:
 	.string	"kasan_check_read"
 .LASF2074:
 	.string	"name_link"
@@ -55730,9 +58548,9 @@ __exitcall_ebc_exit:
 	.string	"policy"
 .LASF1308:
 	.string	"shared"
-.LASF3041:
+.LASF3042:
 	.string	"ebc_match"
-.LASF2964:
+.LASF2965:
 	.string	"dclk"
 .LASF2232:
 	.string	"dma_mem"
@@ -55752,7 +58570,7 @@ __exitcall_ebc_exit:
 	.string	"module_sysfs_initialized"
 .LASF1017:
 	.string	"task_cputime"
-.LASF2990:
+.LASF2991:
 	.string	"lut_addr"
 .LASF1211:
 	.string	"rnode"
@@ -55764,7 +58582,7 @@ __exitcall_ebc_exit:
 	.string	"get_dqblk"
 .LASF829:
 	.string	"WQ_CPU_INTENSIVE"
-.LASF3053:
+.LASF3054:
 	.string	"ebc_tcon_node"
 .LASF2832:
 	.string	"id_entry"
@@ -55774,7 +58592,7 @@ __exitcall_ebc_exit:
 	.string	"nr_irqs"
 .LASF909:
 	.string	"max_hang_time"
-.LASF3197:
+.LASF3208:
 	.string	"copy_from_user"
 .LASF2482:
 	.string	"DOMAIN_BUS_ANY"
@@ -55782,15 +58600,15 @@ __exitcall_ebc_exit:
 	.string	"root_user"
 .LASF2105:
 	.string	"subdirs"
-.LASF2902:
+.LASF2903:
 	.string	"EPD_DU"
 .LASF1898:
 	.string	"mmap_miss"
 .LASF1669:
 	.string	"quota_format_ops"
-.LASF3308:
+.LASF3319:
 	.string	"ebc_osd_buf_get"
-.LASF3087:
+.LASF3088:
 	.string	"argp"
 .LASF1769:
 	.string	"args"
@@ -55802,13 +58620,13 @@ __exitcall_ebc_exit:
 	.string	"run_delay"
 .LASF2013:
 	.string	"fi_extents_start"
-.LASF2947:
+.LASF2948:
 	.string	"dummy_dma_ops"
 .LASF239:
 	.string	"static_key_initialized"
 .LASF2799:
 	.string	"module_uevent"
-.LASF3100:
+.LASF3101:
 	.string	"is_full_mode"
 .LASF2612:
 	.string	"base_pfn"
@@ -55816,29 +58634,33 @@ __exitcall_ebc_exit:
 	.string	"width"
 .LASF944:
 	.string	"_addr_pkey"
-.LASF3080:
+.LASF3081:
 	.string	"waveform_buffer"
 .LASF297:
 	.string	"__start_rodata"
 .LASF1483:
 	.string	"NR_ACTIVE_ANON"
-.LASF2950:
+.LASF2951:
 	.string	"tcon"
 .LASF1130:
 	.string	"thread_keyring"
 .LASF2760:
 	.string	"kparam_array"
-.LASF3255:
+.LASF3266:
 	.string	"platform_driver_unregister"
 .LASF653:
 	.string	"utime"
+.LASF3140:
+	.string	"pix0"
+.LASF3141:
+	.string	"pix1"
 .LASF1349:
 	.string	"start_code"
-.LASF3042:
+.LASF3043:
 	.string	"ebc_driver"
 .LASF2620:
 	.string	"dev_page_free_t"
-.LASF3214:
+.LASF3225:
 	.string	"of_property_read_u32"
 .LASF1413:
 	.string	"guid_t"
@@ -55846,7 +58668,7 @@ __exitcall_ebc_exit:
 	.string	"sysctl_panic_on_stackoverflow"
 .LASF1909:
 	.string	"fl_link"
-.LASF3115:
+.LASF3116:
 	.string	"check_black_percent"
 .LASF2264:
 	.string	"clock_list"
@@ -55860,7 +58682,7 @@ __exitcall_ebc_exit:
 	.string	"tz_minuteswest"
 .LASF2474:
 	.string	"of_chosen"
-.LASF3123:
+.LASF3124:
 	.string	"ebc_frame_start"
 .LASF349:
 	.string	"sve_state"
@@ -55870,7 +58692,7 @@ __exitcall_ebc_exit:
 	.string	"cpumask_t"
 .LASF134:
 	.string	"kmsg_fops"
-.LASF3305:
+.LASF3316:
 	.string	"ebc_buf_release"
 .LASF820:
 	.string	"WORK_STRUCT_NO_POOL"
@@ -55892,7 +58714,7 @@ __exitcall_ebc_exit:
 	.string	"sched_rt_entity"
 .LASF117:
 	.string	"sendpage"
-.LASF3167:
+.LASF3176:
 	.string	"ret_val"
 .LASF881:
 	.string	"timerqueue_node"
@@ -55902,7 +58724,7 @@ __exitcall_ebc_exit:
 	.string	"mem_dqblk"
 .LASF2787:
 	.string	"plt_entry"
-.LASF3175:
+.LASF3186:
 	.string	"display_mode"
 .LASF1995:
 	.string	"nr_cached_objects"
@@ -55926,7 +58748,7 @@ __exitcall_ebc_exit:
 	.string	"bd_part_count"
 .LASF357:
 	.string	"__sched_text_start"
-.LASF2887:
+.LASF2888:
 	.string	"panel_refresh_mode"
 .LASF91:
 	.string	"linux_proc_banner"
@@ -55934,11 +58756,11 @@ __exitcall_ebc_exit:
 	.string	"fops"
 .LASF1288:
 	.string	"f_path"
-.LASF3269:
+.LASF3280:
 	.string	"kthread_create_on_node"
 .LASF712:
 	.string	"cgroups"
-.LASF3200:
+.LASF3211:
 	.string	"__uaccess_mask_ptr"
 .LASF2359:
 	.string	"probe_type"
@@ -55958,9 +58780,9 @@ __exitcall_ebc_exit:
 	.string	"userspace_clients"
 .LASF2158:
 	.string	"uevent_seqnum"
-.LASF3265:
+.LASF3276:
 	.string	"memset"
-.LASF3172:
+.LASF3183:
 	.string	"cur_image_addr"
 .LASF2159:
 	.string	"list_lock"
@@ -55994,7 +58816,7 @@ __exitcall_ebc_exit:
 	.string	"file_lock_operations"
 .LASF344:
 	.string	"tp_value"
-.LASF3050:
+.LASF3051:
 	.string	"ebc_remove"
 .LASF1908:
 	.string	"fl_list"
@@ -56008,7 +58830,7 @@ __exitcall_ebc_exit:
 	.string	"qf_fmt_id"
 .LASF1065:
 	.string	"nr_wakeups_idle"
-.LASF3313:
+.LASF3324:
 	.string	"up_write"
 .LASF1473:
 	.string	"NR_MLOCK"
@@ -56024,11 +58846,11 @@ __exitcall_ebc_exit:
 	.string	"sysctl_drop_caches"
 .LASF1988:
 	.string	"show_devname"
-.LASF2959:
+.LASF2960:
 	.string	"panel_16bit"
 .LASF1337:
 	.string	"page_table_lock"
-.LASF3040:
+.LASF3041:
 	.string	"ebc_pm"
 .LASF2855:
 	.string	"sched_priority"
@@ -56044,7 +58866,7 @@ __exitcall_ebc_exit:
 	.string	"console_printk"
 .LASF703:
 	.string	"ioac"
-.LASF3227:
+.LASF3238:
 	.string	"__init_work"
 .LASF1186:
 	.string	"nr_to_scan"
@@ -56056,7 +58878,7 @@ __exitcall_ebc_exit:
 	.string	"exec_max"
 .LASF1418:
 	.string	"uuid_index"
-.LASF3228:
+.LASF3239:
 	.string	"onstack"
 .LASF190:
 	.string	"compat_rmtp"
@@ -56068,13 +58890,13 @@ __exitcall_ebc_exit:
 	.string	"nfs_fl"
 .LASF403:
 	.string	"dentry"
-.LASF3245:
+.LASF3256:
 	.string	"__be32_to_cpup"
 .LASF2181:
 	.string	"klist_node"
 .LASF1905:
 	.string	"fl_release_private"
-.LASF2898:
+.LASF2899:
 	.string	"EPD_PART_GLD16"
 .LASF107:
 	.string	"unlocked_ioctl"
@@ -56086,7 +58908,7 @@ __exitcall_ebc_exit:
 	.string	"__i_nlink"
 .LASF145:
 	.string	"panic_on_warn"
-.LASF3094:
+.LASF3095:
 	.string	"ebc_panel_probe"
 .LASF80:
 	.string	"boot_command_line"
@@ -56104,13 +58926,13 @@ __exitcall_ebc_exit:
 	.string	"d_spc_warns"
 .LASF1055:
 	.string	"nr_failed_migrations_hot"
-.LASF2951:
+.LASF2952:
 	.string	"pmic"
 .LASF1151:
 	.string	"css_set"
 .LASF1417:
 	.string	"guid_index"
-.LASF2992:
+.LASF2993:
 	.string	"ebc_irq_status"
 .LASF2559:
 	.string	"force_irqthreads"
@@ -56122,7 +58944,7 @@ __exitcall_ebc_exit:
 	.string	"s_export_op"
 .LASF1851:
 	.string	"i_rcu"
-.LASF2893:
+.LASF2894:
 	.string	"EPD_FULL_GLD16"
 .LASF156:
 	.string	"SYSTEM_POWER_OFF"
@@ -56152,13 +58974,13 @@ __exitcall_ebc_exit:
 	.string	"d_rt_space"
 .LASF265:
 	.string	"name"
-.LASF3275:
+.LASF3286:
 	.string	"mod_timer"
 .LASF151:
 	.string	"early_boot_irqs_disabled"
 .LASF659:
 	.string	"nvcsw"
-.LASF3066:
+.LASF3067:
 	.string	"ebc_task_init"
 .LASF2847:
 	.string	"KMALLOC_NORMAL"
@@ -56178,7 +59000,7 @@ __exitcall_ebc_exit:
 	.string	"i_gid"
 .LASF1634:
 	.string	"quota_type"
-.LASF3129:
+.LASF3130:
 	.string	"buffer_old"
 .LASF1551:
 	.string	"high"
@@ -56194,11 +59016,11 @@ __exitcall_ebc_exit:
 	.string	"self_exec_id"
 .LASF1922:
 	.string	"fl_downgrade_time"
-.LASF2999:
+.LASF3000:
 	.string	"auto_frame_count"
 .LASF2119:
 	.string	"kernfs_ops"
-.LASF2996:
+.LASF2997:
 	.string	"auto_image_new"
 .LASF808:
 	.string	"WORK_CPU_UNBOUND"
@@ -56206,7 +59028,7 @@ __exitcall_ebc_exit:
 	.string	"MODULE_STATE_LIVE"
 .LASF1439:
 	.string	"sysctl_protected_fifos"
-.LASF3013:
+.LASF3014:
 	.string	"auto_buffer_wq"
 .LASF1074:
 	.string	"nr_migrations"
@@ -56224,25 +59046,25 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_WRITE_PENDING"
 .LASF1311:
 	.string	"close"
-.LASF3155:
+.LASF3164:
 	.string	"image_fb_data"
-.LASF3064:
+.LASF3065:
 	.string	"klogo_buf"
-.LASF2908:
+.LASF2909:
 	.string	"EPD_POWER_OFF"
 .LASF1516:
 	.string	"zone_reclaim_stat"
-.LASF3023:
+.LASF3024:
 	.string	"ebc_wq"
 .LASF737:
 	.string	"memcg_oom_gfp_mask"
-.LASF3230:
+.LASF3241:
 	.string	"_msecs_to_jiffies"
 .LASF1698:
 	.string	"d_spc_timer"
 .LASF1774:
 	.string	"jump_entries"
-.LASF3238:
+.LASF3249:
 	.string	"test_ti_thread_flag"
 .LASF2270:
 	.string	"async_suspend"
@@ -56252,7 +59074,7 @@ __exitcall_ebc_exit:
 	.string	"read_pos"
 .LASF482:
 	.string	"super_block"
-.LASF3202:
+.LASF3213:
 	.string	"__addr"
 .LASF2337:
 	.string	"dma_coherent"
@@ -56290,7 +59112,7 @@ __exitcall_ebc_exit:
 	.string	"map_sg"
 .LASF1174:
 	.string	"nlink"
-.LASF3059:
+.LASF3060:
 	.string	"ulogo_addr_valid"
 .LASF2592:
 	.string	"percpu_ref"
@@ -56298,11 +59120,11 @@ __exitcall_ebc_exit:
 	.string	"devkmsg_log_str"
 .LASF255:
 	.string	"FTR_HIGHER_SAFE"
-.LASF3213:
+.LASF3224:
 	.string	"i2c_get_clientdata"
-.LASF3198:
+.LASF3209:
 	.string	"_copy_to_user"
-.LASF3248:
+.LASF3259:
 	.string	"test_bit"
 .LASF249:
 	.string	"__start___jump_table"
@@ -56318,7 +59140,7 @@ __exitcall_ebc_exit:
 	.string	"mems_allowed_seq"
 .LASF1785:
 	.string	"refcnt"
-.LASF3112:
+.LASF3113:
 	.string	"pbuf_new"
 .LASF2196:
 	.string	"thaw"
@@ -56334,9 +59156,9 @@ __exitcall_ebc_exit:
 	.string	"futex"
 .LASF1040:
 	.string	"wait_max"
-.LASF3273:
+.LASF3284:
 	.string	"wakeup_source_add"
-.LASF3191:
+.LASF3202:
 	.string	"ebc_pmic_suspend"
 .LASF1173:
 	.string	"result_mask"
@@ -56348,15 +59170,15 @@ __exitcall_ebc_exit:
 	.string	"dquot_operations"
 .LASF1239:
 	.string	"mapping"
-.LASF3223:
+.LASF3234:
 	.string	"resource_size"
-.LASF3270:
+.LASF3281:
 	.string	"wake_up_process"
 .LASF1369:
 	.string	"kioctx_table"
 .LASF867:
 	.string	"rb_right"
-.LASF3133:
+.LASF3132:
 	.string	"buffer_new_tmp"
 .LASF993:
 	.string	"vm_file"
@@ -56382,11 +59204,11 @@ __exitcall_ebc_exit:
 	.string	"__initdata_end"
 .LASF2516:
 	.string	"bus_lock"
-.LASF3210:
+.LASF3221:
 	.string	"kmalloc_type"
 .LASF388:
 	.string	"qstr"
-.LASF3132:
+.LASF3135:
 	.string	"gray_new"
 .LASF1107:
 	.string	"futex_state"
@@ -56394,7 +59216,7 @@ __exitcall_ebc_exit:
 	.string	"WORKINGSET_RESTORE"
 .LASF629:
 	.string	"sched_psi_wake_requeue"
-.LASF3231:
+.LASF3242:
 	.string	"check_copy_size"
 .LASF738:
 	.string	"memcg_oom_order"
@@ -56450,7 +59272,7 @@ __exitcall_ebc_exit:
 	.string	"core_state"
 .LASF883:
 	.string	"timerqueue_head"
-.LASF3272:
+.LASF3283:
 	.string	"sched_setscheduler_nocheck"
 .LASF1306:
 	.string	"f_wb_err"
@@ -56458,7 +59280,7 @@ __exitcall_ebc_exit:
 	.string	"rt_mutex"
 .LASF1005:
 	.string	"rchar"
-.LASF3183:
+.LASF3194:
 	.string	"valid_dma_direction"
 .LASF1833:
 	.string	"bd_contains"
@@ -56480,7 +59302,7 @@ __exitcall_ebc_exit:
 	.string	"_pt_pad_1"
 .LASF1274:
 	.string	"_pt_pad_2"
-.LASF2991:
+.LASF2992:
 	.string	"buf_align16"
 .LASF2827:
 	.string	"cpuhp_tasks_frozen"
@@ -56494,13 +59316,13 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_FLAG_BITS"
 .LASF2463:
 	.string	"fwnode_endpoint"
-.LASF3093:
+.LASF3094:
 	.string	"__int"
 .LASF967:
 	.string	"epoll_watches"
 .LASF2692:
 	.string	"KCOMPACTD_WAKE"
-.LASF3150:
+.LASF3159:
 	.string	"refresh_new_image"
 .LASF2089:
 	.string	"non_rcu"
@@ -56534,7 +59356,7 @@ __exitcall_ebc_exit:
 	.string	"_uid"
 .LASF340:
 	.string	"hbp_break"
-.LASF3055:
+.LASF3056:
 	.string	"pmic_node"
 .LASF139:
 	.string	"panic_blink"
@@ -56574,13 +59396,13 @@ __exitcall_ebc_exit:
 	.string	"need"
 .LASF505:
 	.string	"s_encoding"
-.LASF3226:
+.LASF3237:
 	.string	"queue_work"
 .LASF1749:
 	.string	"gpl_crcs"
 .LASF1735:
 	.string	"get_state"
-.LASF3186:
+.LASF3197:
 	.string	"dma_handle"
 .LASF1374:
 	.string	"orig_pte"
@@ -56598,7 +59420,7 @@ __exitcall_ebc_exit:
 	.string	"__s8"
 .LASF353:
 	.string	"fault_code"
-.LASF3033:
+.LASF3034:
 	.string	"dev_attr_waveform_version"
 .LASF2226:
 	.string	"dma_mask"
@@ -56632,9 +59454,9 @@ __exitcall_ebc_exit:
 	.string	"__kernel_ulong_t"
 .LASF2621:
 	.string	"max_mapnr"
-.LASF2974:
+.LASF2975:
 	.string	"regmap"
-.LASF2942:
+.LASF2943:
 	.string	"shared_info"
 .LASF773:
 	.string	"read_cntp_tval_el0"
@@ -56648,13 +59470,13 @@ __exitcall_ebc_exit:
 	.string	"NR_WRITEBACK_TEMP"
 .LASF2528:
 	.string	"functionality"
-.LASF3137:
+.LASF3143:
 	.string	"clac_part_data_align8"
 .LASF306:
 	.string	"__ctors_end"
 .LASF2281:
 	.string	"wakeup_path"
-.LASF3292:
+.LASF3303:
 	.string	"ebc_buf_state_show"
 .LASF983:
 	.string	"vm_prev"
@@ -56670,7 +59492,7 @@ __exitcall_ebc_exit:
 	.string	"__u8"
 .LASF116:
 	.string	"lock"
-.LASF3190:
+.LASF3201:
 	.string	"ebc_pmic_resume"
 .LASF1577:
 	.string	"compact_cached_migrate_pfn"
@@ -56678,9 +59500,9 @@ __exitcall_ebc_exit:
 	.string	"PGALLOC_DMA32"
 .LASF2770:
 	.string	"param_ops_long"
-.LASF3018:
+.LASF3019:
 	.string	"overlay_start"
-.LASF2970:
+.LASF2971:
 	.string	"frame_addr_set"
 .LASF1092:
 	.string	"runtime"
@@ -56706,13 +59528,13 @@ __exitcall_ebc_exit:
 	.string	"xattr_handler"
 .LASF1441:
 	.string	"kiocb"
-.LASF2916:
+.LASF2917:
 	.string	"width_mm"
 .LASF1580:
 	.string	"compact_order_failed"
 .LASF1120:
 	.string	"fsuid"
-.LASF3239:
+.LASF3250:
 	.string	"flag"
 .LASF1490:
 	.string	"NR_ISOLATED_FILE"
@@ -56724,9 +59546,9 @@ __exitcall_ebc_exit:
 	.string	"managed_pages"
 .LASF2604:
 	.string	"__tracepoint_page_ref_set"
-.LASF3179:
+.LASF3190:
 	.string	"ebc_tcon_enable"
-.LASF3320:
+.LASF3331:
 	.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"
@@ -56774,13 +59596,13 @@ __exitcall_ebc_exit:
 	.string	"s_vop"
 .LASF1665:
 	.string	"qf_owner"
-.LASF3254:
+.LASF3265:
 	.string	"__write_once_size"
 .LASF2846:
 	.string	"kmalloc_cache_type"
 .LASF575:
 	.string	"mutex"
-.LASF3218:
+.LASF3229:
 	.string	"out_values"
 .LASF854:
 	.string	"pgd_t"
@@ -56792,9 +59614,9 @@ __exitcall_ebc_exit:
 	.string	"NR_VM_NODE_STAT_ITEMS"
 .LASF234:
 	.string	"raw_spinlock_t"
-.LASF2953:
+.LASF2954:
 	.string	"vir_width"
-.LASF3242:
+.LASF3253:
 	.string	"INIT_LIST_HEAD"
 .LASF1953:
 	.string	"fs_flags"
@@ -56808,15 +59630,15 @@ __exitcall_ebc_exit:
 	.string	"sigpending"
 .LASF2229:
 	.string	"dma_pfn_offset"
-.LASF3027:
+.LASF3028:
 	.string	"resume_frame_count"
 .LASF1204:
 	.string	"radix_tree_node"
-.LASF3244:
+.LASF3255:
 	.string	"sign_extend64"
 .LASF2328:
 	.string	"wake_irq"
-.LASF3057:
+.LASF3058:
 	.string	"ulogo_addr"
 .LASF874:
 	.string	"pcpu_fc"
@@ -56834,12 +59656,14 @@ __exitcall_ebc_exit:
 	.string	"ptraced"
 .LASF2766:
 	.string	"param_ops_short"
-.LASF3287:
+.LASF3298:
 	.string	"of_find_device_by_node"
 .LASF2568:
 	.string	"HRTIMER_SOFTIRQ"
 .LASF802:
 	.string	"WORK_STRUCT_DELAYED"
+.LASF3175:
+	.string	"ebc_get_2pix_wf_part_32"
 .LASF455:
 	.string	"i_sequence"
 .LASF1524:
@@ -56854,13 +59678,13 @@ __exitcall_ebc_exit:
 	.string	"d_lockref"
 .LASF2257:
 	.string	"rpm_request"
-.LASF3086:
+.LASF3087:
 	.string	"ebc_io_ctl"
 .LASF1164:
 	.string	"addr"
 .LASF2400:
 	.string	"device_private"
-.LASF3181:
+.LASF3192:
 	.string	"get_dma_ops"
 .LASF2712:
 	.string	"watermark_scale_factor"
@@ -56874,9 +59698,9 @@ __exitcall_ebc_exit:
 	.string	"mm_rss_stat"
 .LASF1737:
 	.string	"mkobj"
-.LASF2980:
+.LASF2981:
 	.string	"direct_buf_real_size"
-.LASF3309:
+.LASF3320:
 	.string	"__pm_relax"
 .LASF473:
 	.string	"d_delete"
@@ -56888,7 +59712,7 @@ __exitcall_ebc_exit:
 	.string	"sh_link"
 .LASF836:
 	.string	"WQ_MAX_ACTIVE"
-.LASF3048:
+.LASF3049:
 	.string	"ebc_suspend"
 .LASF2372:
 	.string	"cls_msk"
@@ -56910,7 +59734,7 @@ __exitcall_ebc_exit:
 	.string	"num_resources"
 .LASF1590:
 	.string	"notifier_fn_t"
-.LASF3056:
+.LASF3057:
 	.string	"pmic_client"
 .LASF2586:
 	.string	"miscdevice"
@@ -56918,19 +59742,19 @@ __exitcall_ebc_exit:
 	.string	"WQ_POWER_EFFICIENT"
 .LASF656:
 	.string	"time_in_state"
-.LASF3065:
+.LASF3066:
 	.string	"ebc_logo_init"
 .LASF1283:
 	.string	"kill"
 .LASF1044:
 	.string	"iowait_sum"
-.LASF3151:
+.LASF3160:
 	.string	"image_new"
 .LASF15:
 	.string	"__u64"
 .LASF695:
 	.string	"journal_info"
-.LASF2891:
+.LASF2892:
 	.string	"EPD_FULL_GL16"
 .LASF626:
 	.string	"sched_contributes_to_load"
@@ -56950,13 +59774,15 @@ __exitcall_ebc_exit:
 	.string	"i_blkbits"
 .LASF2470:
 	.string	"value"
-.LASF3011:
+.LASF3012:
 	.string	"frame_timer"
+.LASF2887:
+	.string	"needpic"
 .LASF1047:
 	.string	"sum_sleep_runtime"
-.LASF3061:
+.LASF3062:
 	.string	"ulogo_addr_str"
-.LASF3125:
+.LASF3126:
 	.string	"flip"
 .LASF1093:
 	.string	"deadline"
@@ -56990,7 +59816,7 @@ __exitcall_ebc_exit:
 	.string	"fault"
 .LASF81:
 	.string	"saved_command_line"
-.LASF2911:
+.LASF2912:
 	.string	"EPD_AUTO_DU4"
 .LASF1990:
 	.string	"show_stats"
@@ -57000,11 +59826,11 @@ __exitcall_ebc_exit:
 	.string	"read_dqblk"
 .LASF1630:
 	.string	"dq_flags"
-.LASF3128:
+.LASF3129:
 	.string	"buffer_new"
 .LASF213:
 	.string	"user_fpsimd_state"
-.LASF3286:
+.LASF3297:
 	.string	"device_create_file"
 .LASF521:
 	.string	"s_time_gran"
@@ -57028,15 +59854,15 @@ __exitcall_ebc_exit:
 	.string	"s_bdi"
 .LASF2871:
 	.string	"wf_table"
-.LASF3157:
+.LASF3166:
 	.string	"image_new_tmp"
 .LASF1746:
 	.string	"num_kp"
-.LASF3319:
+.LASF3330:
 	.string	"__pm_stay_awake"
 .LASF2579:
 	.string	"vmap_area_list"
-.LASF3026:
+.LASF3027:
 	.string	"ebc_auto_thread_sem"
 .LASF630:
 	.string	"in_execve"
@@ -57050,7 +59876,7 @@ __exitcall_ebc_exit:
 	.string	"version"
 .LASF2578:
 	.string	"xen_start_flags"
-.LASF2896:
+.LASF2897:
 	.string	"EPD_PART_GL16"
 .LASF1553:
 	.string	"stat_threshold"
@@ -57080,13 +59906,13 @@ __exitcall_ebc_exit:
 	.string	"pgoff"
 .LASF2236:
 	.string	"of_node"
-.LASF2899:
+.LASF2900:
 	.string	"EPD_PART_GCC16"
 .LASF2034:
 	.string	"names_cachep"
 .LASF785:
 	.string	"preset_lpj"
-.LASF3010:
+.LASF3011:
 	.string	"vdd_timer"
 .LASF2235:
 	.string	"archdata"
@@ -57138,7 +59964,7 @@ __exitcall_ebc_exit:
 	.string	"seeks"
 .LASF577:
 	.string	"task_struct"
-.LASF2917:
+.LASF2918:
 	.string	"height_mm"
 .LASF2654:
 	.string	"PGALLOC_MOVABLE"
@@ -57176,7 +60002,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_RESUMING"
 .LASF471:
 	.string	"d_weak_revalidate"
-.LASF3005:
+.LASF3006:
 	.string	"prev_dsp_buf"
 .LASF1507:
 	.string	"NR_VMSCAN_IMMEDIATE"
@@ -57192,7 +60018,7 @@ __exitcall_ebc_exit:
 	.string	"setup_max_cpus"
 .LASF1848:
 	.string	"i_nlink"
-.LASF2960:
+.LASF2961:
 	.string	"mirror"
 .LASF1802:
 	.string	"write_begin"
@@ -57200,11 +60026,11 @@ __exitcall_ebc_exit:
 	.string	"groups"
 .LASF694:
 	.string	"pi_blocked_on"
-.LASF3052:
+.LASF3053:
 	.string	"ebc_probe"
 .LASF501:
 	.string	"s_xattr"
-.LASF3062:
+.LASF3063:
 	.string	"klogo_addr_str"
 .LASF1007:
 	.string	"syscr"
@@ -57238,7 +60064,7 @@ __exitcall_ebc_exit:
 	.string	"s_inode_list_lock"
 .LASF2614:
 	.string	"align"
-.LASF3136:
+.LASF3137:
 	.string	"frame_idx"
 .LASF204:
 	.string	"mm_segment_t"
@@ -57260,13 +60086,13 @@ __exitcall_ebc_exit:
 	.string	"maj_flt"
 .LASF229:
 	.string	"arch_rwlock_t"
-.LASF3307:
+.LASF3318:
 	.string	"ebc_osd_buf_clone"
 .LASF162:
 	.string	"c_false"
 .LASF914:
 	.string	"clock_base"
-.LASF2924:
+.LASF2925:
 	.string	"pmic_read_temperature"
 .LASF1812:
 	.string	"launder_page"
@@ -57286,7 +60112,7 @@ __exitcall_ebc_exit:
 	.string	"minor"
 .LASF1713:
 	.string	"nextents"
-.LASF3184:
+.LASF3195:
 	.string	"dma_direction"
 .LASF1:
 	.string	"sizetype"
@@ -57296,13 +60122,13 @@ __exitcall_ebc_exit:
 	.string	"arg_lock"
 .LASF1755:
 	.string	"num_exentries"
-.LASF3114:
+.LASF3115:
 	.string	"check_out"
 .LASF2623:
 	.string	"high_memory"
 .LASF49:
 	.string	"int32_t"
-.LASF3044:
+.LASF3045:
 	.string	"__exitcall_ebc_exit"
 .LASF1054:
 	.string	"nr_failed_migrations_running"
@@ -57310,7 +60136,7 @@ __exitcall_ebc_exit:
 	.string	"next_timer"
 .LASF741:
 	.string	"throttle_queue"
-.LASF3302:
+.LASF3313:
 	.string	"finish_wait"
 .LASF1494:
 	.string	"WORKINGSET_NODERECLAIM"
@@ -57322,7 +60148,7 @@ __exitcall_ebc_exit:
 	.string	"keyring_index_key"
 .LASF833:
 	.string	"__WQ_ORDERED"
-.LASF3178:
+.LASF3189:
 	.string	"ebc_tcon_disable"
 .LASF1435:
 	.string	"leases_enable"
@@ -57338,7 +60164,7 @@ __exitcall_ebc_exit:
 	.string	"user_struct"
 .LASF2380:
 	.string	"ns_type"
-.LASF2903:
+.LASF2904:
 	.string	"EPD_DU4"
 .LASF589:
 	.string	"on_rq"
@@ -57346,7 +60172,7 @@ __exitcall_ebc_exit:
 	.string	"lock_key"
 .LASF2577:
 	.string	"tramp_pg_dir"
-.LASF3037:
+.LASF3038:
 	.string	"dev_attr_ebc_version"
 .LASF878:
 	.string	"PCPU_FC_NR"
@@ -57364,7 +60190,7 @@ __exitcall_ebc_exit:
 	.string	"num_vf"
 .LASF1549:
 	.string	"isolate_mode_t"
-.LASF3185:
+.LASF3196:
 	.string	"debug_dma_sync_single_for_device"
 .LASF99:
 	.string	"llseek"
@@ -57398,7 +60224,7 @@ __exitcall_ebc_exit:
 	.string	"file_lock"
 .LASF325:
 	.string	"__idmap_text_end"
-.LASF2984:
+.LASF2985:
 	.string	"frame_total"
 .LASF776:
 	.string	"read_cntvct_el0"
@@ -57406,9 +60232,9 @@ __exitcall_ebc_exit:
 	.string	"target"
 .LASF2560:
 	.string	"HI_SOFTIRQ"
-.LASF3187:
+.LASF3198:
 	.string	"direction"
-.LASF3156:
+.LASF3165:
 	.string	"image_bg_data"
 .LASF972:
 	.string	"session_keyring"
@@ -57418,7 +60244,7 @@ __exitcall_ebc_exit:
 	.string	"key_restrict_link_func_t"
 .LASF1499:
 	.string	"NR_WRITEBACK"
-.LASF3142:
+.LASF3151:
 	.string	"frame_count"
 .LASF487:
 	.string	"s_maxbytes"
@@ -57432,7 +60258,7 @@ __exitcall_ebc_exit:
 	.string	"i2c_bus_type"
 .LASF899:
 	.string	"hrtimer_cpu_base"
-.LASF3314:
+.LASF3325:
 	.string	"ebc_notify"
 .LASF1405:
 	.string	"cb_head"
@@ -57460,7 +60286,7 @@ __exitcall_ebc_exit:
 	.string	"cpus_requested"
 .LASF2608:
 	.string	"__tracepoint_page_ref_mod_unless"
-.LASF3195:
+.LASF3206:
 	.string	"wake_lock_init"
 .LASF1200:
 	.string	"list_lru"
@@ -57476,7 +60302,7 @@ __exitcall_ebc_exit:
 	.string	"robust_list"
 .LASF1729:
 	.string	"quota_disable"
-.LASF3081:
+.LASF3082:
 	.string	"waveform_open"
 .LASF2070:
 	.string	"serial_node"
@@ -57486,7 +60312,7 @@ __exitcall_ebc_exit:
 	.string	"d_iput"
 .LASF108:
 	.string	"compat_ioctl"
-.LASF3203:
+.LASF3214:
 	.string	"__range_ok"
 .LASF287:
 	.string	"__start_ro_after_init"
@@ -57494,9 +60320,9 @@ __exitcall_ebc_exit:
 	.string	"num_poisoned_pages"
 .LASF919:
 	.string	"filter"
-.LASF3188:
+.LASF3199:
 	.string	"ebc_pmic_get_vcom"
-.LASF2961:
+.LASF2962:
 	.string	"ebc_tcon"
 .LASF2625:
 	.string	"sysctl_legacy_va_layout"
@@ -57580,13 +60406,13 @@ __exitcall_ebc_exit:
 	.string	"saved_sigmask"
 .LASF414:
 	.string	"d_time"
-.LASF2975:
+.LASF2976:
 	.string	"ebc_info"
 .LASF240:
 	.string	"entries"
 .LASF1015:
 	.string	"cpu_id"
-.LASF2968:
+.LASF2969:
 	.string	"dsp_mode_set"
 .LASF2666:
 	.string	"PGMAJFAULT"
@@ -57594,7 +60420,7 @@ __exitcall_ebc_exit:
 	.string	"__MAX_NR_ZONES"
 .LASF2478:
 	.string	"irq_fwspec"
-.LASF3031:
+.LASF3032:
 	.string	"waveform_ops"
 .LASF1819:
 	.string	"iov_iter"
@@ -57606,11 +60432,11 @@ __exitcall_ebc_exit:
 	.string	"power"
 .LASF266:
 	.string	"strict_mask"
-.LASF3301:
+.LASF3312:
 	.string	"init_wait_entry"
 .LASF2801:
 	.string	"module_state"
-.LASF3257:
+.LASF3268:
 	.string	"_dev_info"
 .LASF417:
 	.string	"d_subdirs"
@@ -57632,7 +60458,7 @@ __exitcall_ebc_exit:
 	.string	"wait_pidfd"
 .LASF1960:
 	.string	"s_umount_key"
-.LASF2945:
+.LASF2946:
 	.string	"xen_start_info"
 .LASF2472:
 	.string	"of_fwnode_ops"
@@ -57656,15 +60482,15 @@ __exitcall_ebc_exit:
 	.string	"removed_mem"
 .LASF248:
 	.string	"jump_label_t"
-.LASF3288:
+.LASF3299:
 	.string	"of_get_property"
-.LASF3169:
+.LASF3180:
 	.string	"ebc_tcon_frame_start"
 .LASF2726:
 	.string	"Elf64_Half"
 .LASF2301:
 	.string	"use_autosuspend"
-.LASF3045:
+.LASF3046:
 	.string	"ebc_init"
 .LASF675:
 	.string	"nsproxy"
@@ -57672,7 +60498,7 @@ __exitcall_ebc_exit:
 	.string	"can_wakeup"
 .LASF2561:
 	.string	"TIMER_SOFTIRQ"
-.LASF3147:
+.LASF3156:
 	.string	"temp_data"
 .LASF1229:
 	.string	"xol_area"
@@ -57698,15 +60524,15 @@ __exitcall_ebc_exit:
 	.string	"init_on_free"
 .LASF1166:
 	.string	"nr_pages"
-.LASF3164:
+.LASF3173:
 	.string	"ebc_power_set"
 .LASF1776:
 	.string	"num_trace_bprintk_fmt"
-.LASF3251:
+.LASF3262:
 	.string	"__fls"
 .LASF1144:
 	.string	"ioprio"
-.LASF3014:
+.LASF3015:
 	.string	"is_early_suspend"
 .LASF1178:
 	.string	"rdev"
@@ -57728,9 +60554,9 @@ __exitcall_ebc_exit:
 	.string	"persistent_clock_is_local"
 .LASF2428:
 	.string	"dma_supported"
-.LASF3220:
+.LASF3231:
 	.string	"dev_set_drvdata"
-.LASF3316:
+.LASF3326:
 	.string	"epd_lut_get"
 .LASF1550:
 	.string	"per_cpu_pages"
@@ -57766,7 +60592,7 @@ __exitcall_ebc_exit:
 	.string	"BLOCK_SOFTIRQ"
 .LASF1426:
 	.string	"files_stat_struct"
-.LASF3263:
+.LASF3274:
 	.string	"devm_memremap"
 .LASF858:
 	.string	"pgtable_t"
@@ -57778,13 +60604,15 @@ __exitcall_ebc_exit:
 	.string	"symlink"
 .LASF1589:
 	.string	"mem_map"
-.LASF3107:
+.LASF3108:
 	.string	"old_buffer"
-.LASF2971:
+.LASF2972:
 	.string	"lut_data_set"
 .LASF791:
 	.string	"sysctl_timer_migration"
-.LASF2931:
+.LASF3146:
+	.string	"clac_full_data_16_to_32"
+.LASF2932:
 	.string	"DMA_NONE"
 .LASF1913:
 	.string	"fl_type"
@@ -57794,7 +60622,7 @@ __exitcall_ebc_exit:
 	.string	"WAKE_LOCK_SUSPEND"
 .LASF1792:
 	.string	"WRITE_LIFE_SHORT"
-.LASF3246:
+.LASF3257:
 	.string	"__swab32p"
 .LASF286:
 	.string	"_einittext"
@@ -57836,7 +60664,7 @@ __exitcall_ebc_exit:
 	.string	"rm_xquota"
 .LASF1099:
 	.string	"dl_timer"
-.LASF3297:
+.LASF3308:
 	.string	"remap_pfn_range"
 .LASF2390:
 	.string	"DL_DEV_NO_DRIVER"
@@ -57850,7 +60678,7 @@ __exitcall_ebc_exit:
 	.string	"watermark"
 .LASF2438:
 	.string	"deadprops"
-.LASF3259:
+.LASF3270:
 	.string	"devm_kmalloc"
 .LASF16:
 	.string	"long long unsigned int"
@@ -57880,7 +60708,7 @@ __exitcall_ebc_exit:
 	.string	"flc_lease"
 .LASF2421:
 	.string	"unmap_resource"
-.LASF3008:
+.LASF3009:
 	.string	"wake_lock_is_set"
 .LASF2373:
 	.string	"driver_private"
@@ -57902,7 +60730,7 @@ __exitcall_ebc_exit:
 	.string	"__security_initcall_end"
 .LASF2175:
 	.string	"kobj_sysfs_ops"
-.LASF2905:
+.LASF2906:
 	.string	"EPD_RESET"
 .LASF2384:
 	.string	"device_dma_parameters"
@@ -57926,7 +60754,7 @@ __exitcall_ebc_exit:
 	.string	"pstate_check_t"
 .LASF845:
 	.string	"system_freezable_power_efficient_wq"
-.LASF3049:
+.LASF3050:
 	.string	"__func__"
 .LASF57:
 	.string	"resource_size_t"
@@ -57956,7 +60784,7 @@ __exitcall_ebc_exit:
 	.string	"__kernel_clock_t"
 .LASF393:
 	.string	"nr_unused"
-.LASF2934:
+.LASF2935:
 	.string	"dma_address"
 .LASF2630:
 	.string	"mmap_rnd_compat_bits_max"
@@ -57978,15 +60806,15 @@ __exitcall_ebc_exit:
 	.string	"vregs"
 .LASF2639:
 	.string	"page_entry_size"
-.LASF2994:
+.LASF2995:
 	.string	"lut_data"
-.LASF3083:
+.LASF3084:
 	.string	"ebc_other_init"
 .LASF1461:
 	.string	"free_list"
 .LASF590:
 	.string	"prio"
-.LASF3212:
+.LASF3223:
 	.string	"platform_get_drvdata"
 .LASF2570:
 	.string	"NR_SOFTIRQS"
@@ -58008,7 +60836,7 @@ __exitcall_ebc_exit:
 	.string	"atomic_t"
 .LASF813:
 	.string	"WORK_OFFQ_FLAG_BITS"
-.LASF3170:
+.LASF3181:
 	.string	"ebc_tcon_image_addr_set"
 .LASF2546:
 	.string	"max_num_msgs"
@@ -58024,11 +60852,11 @@ __exitcall_ebc_exit:
 	.string	"short int"
 .LASF2369:
 	.string	"of_device_id"
-.LASF2932:
+.LASF2933:
 	.string	"scatterlist"
 .LASF1282:
 	.string	"altmap_valid"
-.LASF3318:
+.LASF3328:
 	.string	"down"
 .LASF102:
 	.string	"read_iter"
@@ -58066,7 +60894,7 @@ __exitcall_ebc_exit:
 	.string	"pm_domain_data"
 .LASF2502:
 	.string	"byte"
-.LASF3283:
+.LASF3294:
 	.string	"__wake_up_sync"
 .LASF2017:
 	.string	"poll_table_struct"
@@ -58076,11 +60904,11 @@ __exitcall_ebc_exit:
 	.string	"current_may_mount"
 .LASF382:
 	.string	"seqlock_t"
-.LASF2963:
+.LASF2964:
 	.string	"hclk"
 .LASF2130:
 	.string	"kernfs_iattrs"
-.LASF2925:
+.LASF2926:
 	.string	"pmic_get_vcom"
 .LASF627:
 	.string	"sched_migrated"
@@ -58092,7 +60920,7 @@ __exitcall_ebc_exit:
 	.string	"page_fault"
 .LASF1484:
 	.string	"NR_INACTIVE_FILE"
-.LASF3235:
+.LASF3246:
 	.string	"__ret_warn_on"
 .LASF1640:
 	.string	"kqid"
@@ -58164,7 +60992,7 @@ __exitcall_ebc_exit:
 	.string	"shift"
 .LASF1452:
 	.string	"ia_gid"
-.LASF3117:
+.LASF3118:
 	.string	"vaild_size"
 .LASF36:
 	.string	"name_offset"
@@ -58174,7 +61002,7 @@ __exitcall_ebc_exit:
 	.string	"__irqentry_text_end"
 .LASF1361:
 	.string	"context"
-.LASF3141:
+.LASF3150:
 	.string	"get_overlay_image"
 .LASF1555:
 	.string	"per_cpu_nodestat"
@@ -58186,7 +61014,7 @@ __exitcall_ebc_exit:
 	.string	"thread_id"
 .LASF733:
 	.string	"default_timer_slack_ns"
-.LASF3079:
+.LASF3080:
 	.string	"waveform_version_read"
 .LASF1782:
 	.string	"source_list"
@@ -58216,7 +61044,7 @@ __exitcall_ebc_exit:
 	.string	"of_match_table"
 .LASF2593:
 	.string	"percpu_count_ptr"
-.LASF3298:
+.LASF3309:
 	.string	"ebc_phy_buf_base_get"
 .LASF2094:
 	.string	"loops_per_jiffy"
@@ -58228,7 +61056,7 @@ __exitcall_ebc_exit:
 	.string	"uuid_t"
 .LASF2452:
 	.string	"property_read_int_array"
-.LASF2997:
+.LASF2998:
 	.string	"auto_image_old"
 .LASF1875:
 	.string	"setattr2"
@@ -58238,7 +61066,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_INODESTEAL"
 .LASF1190:
 	.string	"count_objects"
-.LASF3250:
+.LASF3261:
 	.string	"fls64"
 .LASF936:
 	.string	"_stime"
@@ -58256,9 +61084,9 @@ __exitcall_ebc_exit:
 	.string	"atomic_notifier_head"
 .LASF1075:
 	.string	"statistics"
-.LASF2952:
+.LASF2953:
 	.string	"current_buffer"
-.LASF3138:
+.LASF3144:
 	.string	"direct_mode_data_change"
 .LASF1633:
 	.string	"kprojid_t"
@@ -58274,15 +61102,15 @@ __exitcall_ebc_exit:
 	.string	"sync_sg_for_device"
 .LASF1979:
 	.string	"statfs"
-.LASF3278:
+.LASF3289:
 	.string	"__kmalloc"
-.LASF3266:
+.LASF3277:
 	.string	"_dev_err"
-.LASF3256:
+.LASF3267:
 	.string	"__platform_driver_register"
-.LASF2979:
+.LASF2980:
 	.string	"ebc_buf_real_size"
-.LASF3024:
+.LASF3025:
 	.string	"ebc_thread_wq"
 .LASF1809:
 	.string	"migratepage"
@@ -58290,7 +61118,7 @@ __exitcall_ebc_exit:
 	.string	"DROP_PAGECACHE"
 .LASF793:
 	.string	"work_struct"
-.LASF2914:
+.LASF2915:
 	.string	"height"
 .LASF1109:
 	.string	"task_group"
@@ -58304,8 +61132,6 @@ __exitcall_ebc_exit:
 	.string	"kgid_t"
 .LASF583:
 	.string	"on_cpu"
-.LASF3102:
-	.string	"old_prev_buf"
 .LASF2146:
 	.string	"drop_ns"
 .LASF1437:
@@ -58334,7 +61160,7 @@ __exitcall_ebc_exit:
 	.string	"max_comb_1st_msg_len"
 .LASF1560:
 	.string	"ZONE_MOVABLE"
-.LASF3030:
+.LASF3031:
 	.string	"ebc_misc"
 .LASF2407:
 	.string	"revmap_size"
@@ -58366,7 +61192,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_PENDING_BIT"
 .LASF721:
 	.string	"rseq"
-.LASF3149:
+.LASF3158:
 	.string	"get_auto_image"
 .LASF196:
 	.string	"nfds"
@@ -58380,17 +61206,17 @@ __exitcall_ebc_exit:
 	.string	"i_acl"
 .LASF1804:
 	.string	"bmap"
-.LASF3264:
+.LASF3275:
 	.string	"ebc_buf_init"
 .LASF2063:
 	.string	"key_payload"
-.LASF3000:
+.LASF3001:
 	.string	"auto_image_osd"
 .LASF481:
 	.string	"d_real"
 .LASF2575:
 	.string	"swapper_pg_end"
-.LASF3034:
+.LASF3035:
 	.string	"dev_attr_pmic_name"
 .LASF632:
 	.string	"in_user_fault"
@@ -58420,7 +61246,7 @@ __exitcall_ebc_exit:
 	.string	"fallocate"
 .LASF1722:
 	.string	"i_spc_warnlimit"
-.LASF3236:
+.LASF3247:
 	.string	"check_object_size"
 .LASF1530:
 	.string	"node_present_pages"
@@ -58470,7 +61296,7 @@ __exitcall_ebc_exit:
 	.string	"__idmap_text_start"
 .LASF1731:
 	.string	"set_info"
-.LASF3085:
+.LASF3086:
 	.string	"ebc_mmap"
 .LASF2634:
 	.string	"sysctl_admin_reserve_kbytes"
@@ -58482,9 +61308,9 @@ __exitcall_ebc_exit:
 	.string	"lock_ops"
 .LASF1341:
 	.string	"hiwater_vm"
-.LASF3076:
+.LASF3077:
 	.string	"pmic_vcom_read"
-.LASF3258:
+.LASF3269:
 	.string	"misc_deregister"
 .LASF1263:
 	.string	"compound_head"
@@ -58504,7 +61330,7 @@ __exitcall_ebc_exit:
 	.string	"bd_write_holder"
 .LASF2209:
 	.string	"poweroff_noirq"
-.LASF3261:
+.LASF3272:
 	.string	"of_parse_phandle"
 .LASF1873:
 	.string	"rename"
@@ -58524,9 +61350,9 @@ __exitcall_ebc_exit:
 	.string	"i_rt_spc_timelimit"
 .LASF140:
 	.string	"oops_in_progress"
-.LASF3029:
+.LASF3030:
 	.string	"ebc_ops"
-.LASF3058:
+.LASF3059:
 	.string	"klogo_addr"
 .LASF1666:
 	.string	"qf_next"
@@ -58534,9 +61360,9 @@ __exitcall_ebc_exit:
 	.string	"sync_single_for_cpu"
 .LASF794:
 	.string	"data"
-.LASF3205:
+.LASF3216:
 	.string	"kzalloc"
-.LASF3229:
+.LASF3240:
 	.string	"msecs_to_jiffies"
 .LASF1934:
 	.string	"lm_break"
@@ -58550,7 +61376,7 @@ __exitcall_ebc_exit:
 	.string	"personality"
 .LASF1840:
 	.string	"bd_queue"
-.LASF3046:
+.LASF3047:
 	.string	"ebc_resume"
 .LASF2844:
 	.string	"init_task"
@@ -58572,7 +61398,7 @@ __exitcall_ebc_exit:
 	.string	"signed char"
 .LASF376:
 	.string	"rcu_scheduler_active"
-.LASF3215:
+.LASF3226:
 	.string	"propname"
 .LASF2116:
 	.string	"priv"
@@ -58626,7 +61452,7 @@ __exitcall_ebc_exit:
 	.string	"arch"
 .LASF2276:
 	.string	"no_pm"
-.LASF2912:
+.LASF2913:
 	.string	"ebc_buf_info"
 .LASF951:
 	.string	"_kill"
@@ -58652,7 +61478,7 @@ __exitcall_ebc_exit:
 	.string	"sve_vl"
 .LASF2669:
 	.string	"PGSTEAL_KSWAPD"
-.LASF3060:
+.LASF3061:
 	.string	"klogo_addr_valid"
 .LASF2617:
 	.string	"MEMORY_DEVICE_PUBLIC"
@@ -58688,7 +61514,7 @@ __exitcall_ebc_exit:
 	.string	"WQ_MAX_UNBOUND_PER_CPU"
 .LASF1552:
 	.string	"per_cpu_pageset"
-.LASF3271:
+.LASF3282:
 	.string	"__alloc_workqueue_key"
 .LASF760:
 	.string	"status"
@@ -58702,7 +61528,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_GCC16"
 .LASF2529:
 	.string	"i2c_lock_operations"
-.LASF3166:
+.LASF3177:
 	.string	"ebc_get_4pix_wf_part"
 .LASF1635:
 	.string	"USRQUOTA"
@@ -58710,7 +61536,7 @@ __exitcall_ebc_exit:
 	.string	"description"
 .LASF2812:
 	.string	"symtab"
-.LASF2936:
+.LASF2937:
 	.string	"sg_table"
 .LASF1139:
 	.string	"rt_mutex_waiter"
@@ -58724,7 +61550,7 @@ __exitcall_ebc_exit:
 	.string	"in_iowait"
 .LASF2601:
 	.string	"unregfunc"
-.LASF2922:
+.LASF2923:
 	.string	"pmic_pm_suspend"
 .LASF1119:
 	.string	"egid"
@@ -58748,9 +61574,9 @@ __exitcall_ebc_exit:
 	.string	"f_inode"
 .LASF2046:
 	.string	"procname"
-.LASF3146:
+.LASF3155:
 	.string	"point_data"
-.LASF3268:
+.LASF3279:
 	.string	"epd_lut_from_file_init"
 .LASF1684:
 	.string	"mark_dirty"
@@ -58774,21 +61600,23 @@ __exitcall_ebc_exit:
 	.string	"__kernel_clockid_t"
 .LASF686:
 	.string	"seccomp"
-.LASF3098:
+.LASF3099:
 	.string	"ebc_rst_panel"
 .LASF1806:
 	.string	"releasepage"
 .LASF1717:
 	.string	"qc_info"
-.LASF3099:
+.LASF3131:
+	.string	"clac_part_data_32_to_16"
+.LASF3100:
 	.string	"ebc_thread"
-.LASF3113:
+.LASF3114:
 	.string	"pbuf_old"
-.LASF2904:
+.LASF2905:
 	.string	"EPD_A2_ENTER"
 .LASF1518:
 	.string	"recent_scanned"
-.LASF2954:
+.LASF2955:
 	.string	"vir_height"
 .LASF1758:
 	.string	"core_layout"
@@ -58800,7 +61628,7 @@ __exitcall_ebc_exit:
 	.string	"win_y1"
 .LASF2886:
 	.string	"win_y2"
-.LASF3108:
+.LASF3109:
 	.string	"buf_size"
 .LASF2103:
 	.string	"bitmap"
@@ -58840,11 +61668,11 @@ __exitcall_ebc_exit:
 	.string	"MIGRATE_SYNC_LIGHT"
 .LASF1052:
 	.string	"nr_migrations_cold"
-.LASF3074:
+.LASF3075:
 	.string	"ebc_version_read"
 .LASF304:
 	.string	"__end_once"
-.LASF2940:
+.LASF2941:
 	.string	"dma_noncoherent_ops"
 .LASF1520:
 	.string	"lists"
@@ -58860,7 +61688,7 @@ __exitcall_ebc_exit:
 	.string	"inactive_age"
 .LASF2618:
 	.string	"MEMORY_DEVICE_FS_DAX"
-.LASF2985:
+.LASF2986:
 	.string	"frame_bw_total"
 .LASF2810:
 	.string	"ro_after_init_size"
@@ -58904,7 +61732,7 @@ __exitcall_ebc_exit:
 	.string	"percpu_size"
 .LASF1338:
 	.string	"mmap_sem"
-.LASF3299:
+.LASF3310:
 	.string	"schedule"
 .LASF2457:
 	.string	"get_reference_args"
@@ -58964,7 +61792,7 @@ __exitcall_ebc_exit:
 	.string	"ki_flags"
 .LASF1406:
 	.string	"gp_type"
-.LASF2988:
+.LASF2989:
 	.string	"part_mode_count"
 .LASF401:
 	.string	"d_in_lookup_hash"
@@ -58990,7 +61818,7 @@ __exitcall_ebc_exit:
 	.string	"lock_stat"
 .LASF2409:
 	.string	"revmap_tree_mutex"
-.LASF3078:
+.LASF3079:
 	.string	"pmic_name_read"
 .LASF1094:
 	.string	"dl_throttled"
@@ -59010,7 +61838,7 @@ __exitcall_ebc_exit:
 	.string	"restore_noirq"
 .LASF1442:
 	.string	"ki_filp"
-.LASF3140:
+.LASF3149:
 	.string	"clac_full_data_align16"
 .LASF1127:
 	.string	"cap_ambient"
@@ -59018,7 +61846,7 @@ __exitcall_ebc_exit:
 	.string	"dma_configure"
 .LASF2307:
 	.string	"runtime_error"
-.LASF3089:
+.LASF3090:
 	.string	"temp_offset"
 .LASF964:
 	.string	"__count"
@@ -59032,12 +61860,14 @@ __exitcall_ebc_exit:
 	.string	"PROBE_DEFAULT_STRATEGY"
 .LASF2761:
 	.string	"elemsize"
-.LASF3130:
+.LASF3142:
 	.string	"clac_part_data_align16"
 .LASF906:
 	.string	"nr_events"
 .LASF2336:
 	.string	"iommu"
+.LASF3147:
+	.string	"clac_full_data_32"
 .LASF360:
 	.string	"private"
 .LASF2607:
@@ -59046,7 +61876,7 @@ __exitcall_ebc_exit:
 	.string	"text_size"
 .LASF1668:
 	.string	"stat"
-.LASF3004:
+.LASF3005:
 	.string	"lut_ddr_vir"
 .LASF1336:
 	.string	"map_count"
@@ -59060,7 +61890,7 @@ __exitcall_ebc_exit:
 	.string	"uid_keyring"
 .LASF726:
 	.string	"splice_pipe"
-.LASF3120:
+.LASF3121:
 	.string	"frame_done_callback"
 .LASF1815:
 	.string	"error_remove_page"
@@ -59106,7 +61936,7 @@ __exitcall_ebc_exit:
 	.string	"compound_mapcount"
 .LASF1464:
 	.string	"zone_stat_item"
-.LASF3207:
+.LASF3218:
 	.string	"kmalloc_large"
 .LASF2641:
 	.string	"PE_SIZE_PMD"
@@ -59144,7 +61974,7 @@ __exitcall_ebc_exit:
 	.string	"gp_count"
 .LASF2066:
 	.string	"key_restriction"
-.LASF3105:
+.LASF3106:
 	.string	"check_part_mode"
 .LASF619:
 	.string	"exit_state"
@@ -59176,17 +62006,17 @@ __exitcall_ebc_exit:
 	.string	"fs_supers"
 .LASF1146:
 	.string	"last_waited"
-.LASF3084:
+.LASF3085:
 	.string	"ebc_open"
-.LASF3176:
+.LASF3187:
 	.string	"three_win_mode"
-.LASF2889:
+.LASF2890:
 	.string	"EPD_OVERLAY"
 .LASF1644:
 	.string	"dqb_bsoftlimit"
 .LASF219:
 	.string	"pending"
-.LASF3001:
+.LASF3002:
 	.string	"direct_buffer"
 .LASF2507:
 	.string	"i2c_client_type"
@@ -59212,7 +62042,7 @@ __exitcall_ebc_exit:
 	.string	"pt_mm"
 .LASF1519:
 	.string	"lruvec"
-.LASF2918:
+.LASF2919:
 	.string	"ebc_pmic"
 .LASF14:
 	.string	"long long int"
@@ -59230,7 +62060,7 @@ __exitcall_ebc_exit:
 	.string	"timer_expires"
 .LASF2842:
 	.string	"mmlist_lock"
-.LASF3193:
+.LASF3204:
 	.string	"ebc_pmic_power_on"
 .LASF1780:
 	.string	"trace_evals"
@@ -59274,7 +62104,7 @@ __exitcall_ebc_exit:
 	.string	"relax_count"
 .LASF1428:
 	.string	"nr_free_files"
-.LASF3206:
+.LASF3217:
 	.string	"kmalloc"
 	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
 	.section	.note.GNU-stack,"",@progbits
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.c b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.c
index 8871b37d52cc..a6b98ed56d80 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.c
+++ b/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,7 +66,7 @@ const char *epd_lut_get_wf_version(void)
 	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 needpic)
 {
-	return lut_get(output, lut_type, temperture);
+	return lut_get(output, lut_type, temperture, needpic);
 }
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h
index 8d2210603a29..91a99531ccff 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h
+++ b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h
@@ -48,19 +48,19 @@ struct epd_lut_data {
 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 needpic);
 
 /*
  * PVI Waveform Interfaces
  */
 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 needpic);
 
 /*
  * 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 needpic);
 #endif
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S
index 947c5e453202..b5473ad96cf4 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S
@@ -14,9 +14,9 @@
 	.p2align 3,,7
 	.type	get_wf_mode_index, %function
 get_wf_mode_index:
-.LFB1549:
+.LFB1550:
 	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform.c"
-	.loc 1 383 0
+	.loc 1 349 0
 	.cfi_startproc
 .LVL0:
 	stp	x29, x30, [sp, -32]!
@@ -28,17 +28,17 @@ get_wf_mode_index:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-	.loc 1 384 0
+	.loc 1 350 0
 	adrp	x19, .LANCHOR0
 	add	x1, x19, :lo12:.LANCHOR0
-	.loc 1 383 0
+	.loc 1 349 0
 	mov	w20, w0
-	.loc 1 384 0
+	.loc 1 350 0
 	ldr	x3, [x1, 40]
 .LVL1:
+.LBB6:
 .LBB7:
-.LBB8:
-	.loc 1 284 0
+	.loc 1 250 0
 	ldrb	w0, [x3, 16]
 .LVL2:
 	cmp	w0, 25
@@ -46,318 +46,311 @@ get_wf_mode_index:
 	bhi	.L4
 	cmp	w0, 18
 	beq	.L5
-	bls	.L45
+	bls	.L47
 	cmp	w0, 22
-	bne	.L46
-	.loc 1 298 0
+	bne	.L48
+	.loc 1 264 0
 	mov	w2, 1
-	.loc 1 302 0
+	.loc 1 268 0
 	mov	w0, 4
-	.loc 1 300 0
+	.loc 1 266 0
 	mov	w6, 2
-	.loc 1 301 0
+	.loc 1 267 0
 	mov	w5, 3
-	.loc 1 304 0
+	.loc 1 270 0
 	mov	w4, 5
-	.loc 1 305 0
+	.loc 1 271 0
 	mov	w3, 6
 .LVL3:
-	.loc 1 297 0
+	.loc 1 263 0
 	str	wzr, [x19, #:lo12:.LANCHOR0]
-.LBE8:
 .LBE7:
-	.loc 1 390 0
+.LBE6:
+	.loc 1 356 0
 	cmp	w20, 5
-.LBB13:
-.LBB9:
-	.loc 1 299 0
+.LBB12:
+.LBB8:
+	.loc 1 265 0
 	stp	w2, w2, [x1, 4]
-	.loc 1 301 0
+	.loc 1 267 0
 	stp	w6, w5, [x1, 12]
-	.loc 1 303 0
+	.loc 1 269 0
 	stp	w0, w0, [x1, 20]
-	.loc 1 304 0
+	.loc 1 270 0
 	stp	w3, w4, [x1, 28]
-.LBE9:
-.LBE13:
-	.loc 1 390 0
-	bne	.L47
+.LBE8:
+.LBE12:
+	.loc 1 356 0
+	bne	.L49
 	.p2align 2
-.L26:
+.L28:
 	add	x19, x19, :lo12:.LANCHOR0
 	add	x19, x19, 12
-	.loc 1 426 0
+.L14:
+	.loc 1 395 0
 	ldr	w0, [x19]
-.L50:
-	.loc 1 427 0
+	.loc 1 396 0
 	ldp	x19, x20, [sp, 16]
 .LVL4:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
-	.cfi_restore 20
-	.cfi_restore 19
-	.cfi_restore 29
 	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
 .LVL5:
 	.p2align 3
 .L4:
 	.cfi_restore_state
-.LBB14:
-.LBB10:
-	.loc 1 284 0
+.LBB13:
+.LBB9:
+	.loc 1 250 0
 	cmp	w0, 35
 	beq	.L10
-	bls	.L48
+	bls	.L50
 	cmp	w0, 67
 	beq	.L3
 	cmp	w0, 84
 	bne	.L2
-	.loc 1 325 0
+	.loc 1 291 0
 	mov	w0, 4
-	.loc 1 321 0
+	.loc 1 287 0
 	mov	w2, 1
-	.loc 1 323 0
+	.loc 1 289 0
 	mov	w5, 2
-	.loc 1 324 0
+	.loc 1 290 0
 	mov	w4, 3
-	.loc 1 327 0
+	.loc 1 293 0
 	mov	w3, 5
 .LVL6:
-	.loc 1 320 0
+	.loc 1 286 0
 	str	wzr, [x19, #:lo12:.LANCHOR0]
-	.loc 1 322 0
+	.loc 1 288 0
 	stp	w2, w2, [x1, 4]
-	.loc 1 324 0
+	.loc 1 290 0
 	stp	w5, w4, [x1, 12]
-	.loc 1 326 0
+	.loc 1 292 0
 	stp	w0, w0, [x1, 20]
-	.loc 1 328 0
+	.loc 1 294 0
 	stp	w3, w0, [x1, 28]
 	.p2align 2
 .L13:
-.LBE10:
-.LBE14:
-	.loc 1 390 0
+.LBE9:
+.LBE13:
+	.loc 1 356 0
 	cmp	w20, 5
-	beq	.L26
-.L47:
-	.loc 1 393 0
+	beq	.L28
+.L49:
+	.loc 1 359 0
 	cmp	w20, 2
-	beq	.L26
-	.loc 1 396 0
-	cmp	w20, 6
-	beq	.L16
+	beq	.L28
+	.loc 1 362 0
+	cmp	w20, 7
+	beq	.L28
+	.loc 1 377 0
+	add	x19, x19, :lo12:.LANCHOR0
+	.loc 1 362 0
 	bhi	.L17
 	cmp	w20, 3
 	beq	.L18
+	bls	.L51
 	cmp	w20, 4
-	beq	.L19
-	cmp	w20, 1
-	beq	.L49
+	beq	.L21
+	cmp	w20, 6
+	add	x19, x19, 28
+	beq	.L14
 .L15:
-	.loc 1 422 0
+	.loc 1 391 0
 	adrp	x0, .LC1
 	add	x0, x0, :lo12:.LC1
 	bl	printk
 .LVL7:
-	.loc 1 423 0
+	.loc 1 392 0
 	mov	w0, -1
-	.loc 1 427 0
+	.loc 1 396 0
 	ldp	x19, x20, [sp, 16]
 .LVL8:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
-	.cfi_restore 30
-	.cfi_restore 29
-	.cfi_restore 19
 	.cfi_restore 20
+	.cfi_restore 19
+	.cfi_restore 29
+	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
 .LVL9:
 	.p2align 3
 .L5:
 	.cfi_restore_state
-.LBB15:
-.LBB11:
-	.loc 1 348 0
+.LBB14:
+.LBB10:
+	.loc 1 314 0
 	mov	w0, 5
-	.loc 1 346 0
+	.loc 1 312 0
 	mov	w2, 3
-	.loc 1 344 0
+	.loc 1 310 0
 	mov	w6, 1
-	.loc 1 345 0
+	.loc 1 311 0
 	mov	w5, 7
-	.loc 1 349 0
+	.loc 1 315 0
 	mov	w4, 6
-	.loc 1 350 0
+	.loc 1 316 0
 	mov	w3, 4
 .LVL10:
-	.loc 1 343 0
+	.loc 1 309 0
 	str	wzr, [x19, #:lo12:.LANCHOR0]
-	.loc 1 345 0
+	.loc 1 311 0
 	stp	w6, w5, [x1, 4]
-	.loc 1 347 0
+	.loc 1 313 0
 	stp	w2, w2, [x1, 12]
-	.loc 1 349 0
+	.loc 1 315 0
 	stp	w0, w4, [x1, 20]
-	.loc 1 351 0
+	.loc 1 317 0
 	stp	w3, w0, [x1, 28]
 	b	.L13
 .LVL11:
 	.p2align 3
-.L46:
-	.loc 1 284 0
+.L48:
+	.loc 1 250 0
 	cmp	w0, 24
 	bne	.L2
 .L9:
-	.loc 1 309 0
+	.loc 1 275 0
 	add	x0, x19, :lo12:.LANCHOR0
-	.loc 1 314 0
+	.loc 1 280 0
 	mov	w1, 4
-	.loc 1 310 0
+	.loc 1 276 0
 	mov	w2, 1
-	.loc 1 312 0
+	.loc 1 278 0
 	mov	w6, 2
-	.loc 1 313 0
+	.loc 1 279 0
 	mov	w5, 3
-	.loc 1 315 0
+	.loc 1 281 0
 	mov	w4, 5
-	.loc 1 316 0
+	.loc 1 282 0
 	mov	w3, 6
 .LVL12:
-	.loc 1 309 0
+	.loc 1 275 0
 	str	wzr, [x19, #:lo12:.LANCHOR0]
-	.loc 1 311 0
+	.loc 1 277 0
 	stp	w2, w2, [x0, 4]
-	.loc 1 313 0
+	.loc 1 279 0
 	stp	w6, w5, [x0, 12]
-	.loc 1 315 0
+	.loc 1 281 0
 	stp	w1, w4, [x0, 20]
-	.loc 1 317 0
+	.loc 1 283 0
 	stp	w3, w1, [x0, 28]
 	b	.L13
 .LVL13:
 	.p2align 3
 .L3:
-	.loc 1 332 0
+	.loc 1 298 0
 	add	x0, x19, :lo12:.LANCHOR0
-	.loc 1 337 0
+	.loc 1 303 0
 	mov	w1, 4
-	.loc 1 333 0
+	.loc 1 299 0
 	mov	w7, 1
-	.loc 1 334 0
+	.loc 1 300 0
 	mov	w6, 7
-	.loc 1 335 0
+	.loc 1 301 0
 	mov	w5, 2
-	.loc 1 336 0
+	.loc 1 302 0
 	mov	w4, 3
-	.loc 1 338 0
+	.loc 1 304 0
 	mov	w3, 5
 .LVL14:
-	.loc 1 339 0
+	.loc 1 305 0
 	mov	w2, 6
-	.loc 1 332 0
+	.loc 1 298 0
 	str	wzr, [x19, #:lo12:.LANCHOR0]
-	.loc 1 334 0
+	.loc 1 300 0
 	stp	w7, w6, [x0, 4]
-	.loc 1 336 0
+	.loc 1 302 0
 	stp	w5, w4, [x0, 12]
-	.loc 1 338 0
+	.loc 1 304 0
 	stp	w1, w3, [x0, 20]
-	.loc 1 340 0
+	.loc 1 306 0
 	stp	w2, w1, [x0, 28]
 	b	.L13
 	.p2align 3
-.L49:
-.LBE11:
-.LBE15:
-	.loc 1 396 0
-	add	x19, x19, :lo12:.LANCHOR0
-	.loc 1 426 0
-	ldr	w0, [x19]
-	b	.L50
-	.p2align 3
 .L17:
-	.loc 1 396 0
-	cmp	w20, 8
-	beq	.L27
-	bcc	.L26
-	.loc 1 411 0
-	add	x19, x19, :lo12:.LANCHOR0
-	.loc 1 396 0
+.LBE10:
+.LBE14:
+	.loc 1 362 0
 	cmp	w20, 9
-	beq	.L22
+	beq	.L23
+	bcc	.L29
 	cmp	w20, 10
-	.loc 1 414 0
-	add	x19, x19, 24
-	.loc 1 396 0
-	bne	.L15
-	.loc 1 426 0
-	ldr	w0, [x19]
-	b	.L50
+	beq	.L24
+	cmp	w20, 11
+	.loc 1 383 0
+	add	x19, x19, 32
+	.loc 1 362 0
+	beq	.L14
+	b	.L15
 .LVL15:
 	.p2align 3
-.L45:
-.LBB16:
-.LBB12:
-	.loc 1 284 0
+.L47:
+.LBB15:
+.LBB11:
+	.loc 1 250 0
 	cmp	w0, 9
 	bne	.L2
-	.loc 1 290 0
+	.loc 1 256 0
 	mov	w0, 3
-	.loc 1 287 0
+	.loc 1 253 0
 	mov	w2, 1
-	.loc 1 289 0
+	.loc 1 255 0
 	mov	w4, 2
-	.loc 1 294 0
+	.loc 1 260 0
 	mov	w3, 4
 .LVL16:
-	.loc 1 286 0
+	.loc 1 252 0
 	str	wzr, [x19, #:lo12:.LANCHOR0]
-	.loc 1 288 0
+	.loc 1 254 0
 	stp	w2, w2, [x1, 4]
-	.loc 1 290 0
+	.loc 1 256 0
 	stp	w4, w0, [x1, 12]
-	.loc 1 292 0
+	.loc 1 258 0
 	stp	w0, w0, [x1, 20]
-	.loc 1 293 0
+	.loc 1 259 0
 	stp	w3, w0, [x1, 28]
 	b	.L13
 .LVL17:
 	.p2align 3
-.L48:
-	.loc 1 284 0
+.L50:
+	.loc 1 250 0
 	cmp	w0, 32
 	beq	.L9
 .L2:
-	.loc 1 365 0
+	.loc 1 331 0
 	add	x0, x19, :lo12:.LANCHOR0
-	.loc 1 370 0
+	.loc 1 336 0
 	mov	w1, 4
-	.loc 1 366 0
+	.loc 1 332 0
 	mov	w2, 1
-	.loc 1 365 0
+	.loc 1 331 0
 	str	wzr, [x19, #:lo12:.LANCHOR0]
-	.loc 1 368 0
+	.loc 1 334 0
 	mov	w5, 2
-	.loc 1 369 0
+	.loc 1 335 0
 	mov	w4, 3
-	.loc 1 367 0
+	.loc 1 333 0
 	stp	w2, w2, [x0, 4]
-	.loc 1 371 0
+	.loc 1 337 0
 	mov	w2, 5
-	.loc 1 369 0
+	.loc 1 335 0
 	stp	w5, w4, [x0, 12]
-	.loc 1 370 0
+	.loc 1 336 0
 	str	w1, [x0, 20]
-	.loc 1 373 0
+	.loc 1 339 0
 	str	w1, [x0, 32]
-	.loc 1 372 0
+	.loc 1 338 0
 	mov	w1, 6
 	stp	w2, w1, [x0, 24]
-	.loc 1 374 0
+	.loc 1 340 0
 	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	ldrb	w2, [x3, 22]
@@ -368,71 +361,62 @@ get_wf_mode_index:
 .LVL19:
 	.p2align 3
 .L10:
-	.loc 1 358 0
+	.loc 1 324 0
 	mov	w0, 3
-	.loc 1 355 0
+	.loc 1 321 0
 	mov	w5, 1
-	.loc 1 356 0
+	.loc 1 322 0
 	mov	w4, 5
-	.loc 1 357 0
+	.loc 1 323 0
 	mov	w3, 2
 .LVL20:
-	.loc 1 361 0
+	.loc 1 327 0
 	mov	w2, 4
-	.loc 1 354 0
+	.loc 1 320 0
 	str	wzr, [x19, #:lo12:.LANCHOR0]
-	.loc 1 356 0
+	.loc 1 322 0
 	stp	w5, w4, [x1, 4]
-	.loc 1 358 0
+	.loc 1 324 0
 	stp	w3, w0, [x1, 12]
-	.loc 1 360 0
+	.loc 1 326 0
 	stp	w0, w0, [x1, 20]
-	.loc 1 362 0
+	.loc 1 328 0
 	stp	w2, w0, [x1, 28]
 	b	.L13
 	.p2align 3
-.L22:
-.LBE12:
-.LBE16:
-	.loc 1 411 0
-	add	x19, x19, 20
-	.loc 1 426 0
-	ldr	w0, [x19]
-	b	.L50
+.L24:
+.LBE11:
+.LBE15:
+	.loc 1 380 0
+	add	x19, x19, 24
+	b	.L14
 	.p2align 3
-.L19:
-	.loc 1 420 0
-	add	x19, x19, :lo12:.LANCHOR0
-	add	x19, x19, 4
-	.loc 1 426 0
-	ldr	w0, [x19]
-	b	.L50
+.L23:
+	.loc 1 377 0
+	add	x19, x19, 20
+	b	.L14
 	.p2align 3
 .L18:
-	.loc 1 417 0
-	add	x19, x19, :lo12:.LANCHOR0
+	.loc 1 386 0
 	add	x19, x19, 8
-	.loc 1 426 0
-	ldr	w0, [x19]
-	b	.L50
+	b	.L14
 	.p2align 3
-.L27:
-	.loc 1 396 0
-	add	x19, x19, :lo12:.LANCHOR0
-	add	x19, x19, 16
-	.loc 1 426 0
-	ldr	w0, [x19]
-	b	.L50
+.L21:
+	.loc 1 389 0
+	add	x19, x19, 4
+	b	.L14
 	.p2align 3
-.L16:
-	.loc 1 396 0
-	add	x19, x19, :lo12:.LANCHOR0
-	add	x19, x19, 28
-	.loc 1 426 0
-	ldr	w0, [x19]
-	b	.L50
+.L51:
+	.loc 1 362 0
+	cmp	w20, 1
+	beq	.L14
+	b	.L15
+	.p2align 3
+.L29:
+	add	x19, x19, 16
+	b	.L14
 	.cfi_endproc
-.LFE1549:
+.LFE1550:
 	.size	get_wf_mode_index, .-get_wf_mode_index
 	.align	2
 	.p2align 3,,7
@@ -440,7 +424,7 @@ get_wf_mode_index:
 	.type	decodewaveform, %function
 decodewaveform:
 .LFB1547:
-	.loc 1 64 0
+	.loc 1 67 0
 	.cfi_startproc
 .LVL21:
 	stp	x29, x30, [sp, -48]!
@@ -452,145 +436,143 @@ decodewaveform:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 72 0
+	.loc 1 75 0
 	adrp	x20, .LANCHOR0
-	add	x2, x20, :lo12:.LANCHOR0
-	.loc 1 64 0
+	add	x1, x20, :lo12:.LANCHOR0
+	.loc 1 67 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 72 0
-	ldr	x5, [x2, 48]
-	cbz	x5, .L89
-	.loc 1 76 0
-	sub	w2, w1, #16
-	mov	w21, w1
-	tst	w2, -17
-	bne	.L71
-	mov	w7, 1
+	.loc 1 75 0
+	ldr	x4, [x1, 48]
+	cbz	x4, .L88
+	.loc 1 137 0
+	adrp	x21, .LANCHOR1
+	mov	w6, 1
 .LVL22:
 	mov	w15, 0
 	mov	w19, 0
 .LVL23:
-	mov	w3, 0
-	mov	w6, 0
+	ldr	w14, [x21, #:lo12:.LANCHOR1]
+	mov	w5, 0
+	mov	w2, 0
 	.p2align 2
 .L55:
 	.loc 1 86 0
-	ldrb	w2, [x0, w15, uxtw]
-	cmp	w2, 255
+	ldrb	w1, [x0, w15, uxtw]
+	cmp	w1, 255
 	beq	.L58
 	.loc 1 91 0
-	cmp	w2, 252
-	beq	.L90
+	cmp	w1, 252
+	beq	.L89
 .L59:
 	.loc 1 98 0
-	lsl	w4, w19, 16
+	lsl	w3, w19, 10
 	.loc 1 96 0
-	cbz	w7, .L60
+	cbz	w6, .L60
 	.loc 1 98 0
-	add	w10, w4, w3, lsl 8
-	add	w9, w3, 1
-	add	w4, w4, w6
-	add	w10, w10, w6
+	add	w9, w3, w2, lsl 5
+	add	w8, w2, 1
+	add	w3, w3, w5
+	add	w9, w9, w5
 	.loc 1 99 0
-	add	w8, w3, 2
-	add	w9, w4, w9, lsl 8
+	add	w7, w2, 2
+	add	w8, w3, w8, lsl 5
 	.loc 1 100 0
-	add	w7, w3, 3
+	add	w6, w2, 3
 .LVL24:
-	add	w8, w4, w8, lsl 8
+	add	w7, w3, w7, lsl 5
 	.loc 1 98 0
-	and	w11, w2, 3
+	and	w10, w1, 3
 	.loc 1 101 0
-	add	w4, w4, w7, lsl 8
+	add	w3, w3, w6, lsl 5
 	.loc 1 98 0
-	strb	w11, [x5, w10, uxtw]
+	strb	w10, [x4, w9, uxtw]
 	.loc 1 99 0
-	ubfx	x12, x2, 2, 2
-	strb	w12, [x5, w9, uxtw]
+	ubfx	x11, x1, 2, 2
+	strb	w11, [x4, w8, uxtw]
 	.loc 1 100 0
-	ubfx	x13, x2, 4, 2
-	strb	w13, [x5, w8, uxtw]
+	ubfx	x12, x1, 4, 2
+	strb	w12, [x4, w7, uxtw]
 	.loc 1 101 0
-	lsr	w14, w2, 6
-	strb	w14, [x5, w4, uxtw]
-	add	w3, w3, 4
+	lsr	w13, w1, 6
+	strb	w13, [x4, w3, uxtw]
+	add	w2, w2, 4
 	.loc 1 102 0
-	add	w2, w15, 1
+	add	w1, w15, 1
 	.loc 1 104 0
-	cmp	w21, w3
+	cmp	w14, w2
 	bhi	.L61
 	.loc 1 106 0
-	add	w6, w6, 1
+	add	w5, w5, 1
 	.loc 1 105 0
-	mov	w3, 0
+	mov	w2, 0
 	.loc 1 106 0
-	cmp	w21, w6
+	cmp	w14, w5
 	bhi	.L61
 	.loc 1 108 0
 	add	w19, w19, 1
 	.loc 1 107 0
-	mov	w6, 0
+	mov	w5, 0
 .L61:
 	.loc 1 112 0
-	ldrb	w4, [x0, w2, uxtw]
+	ldrb	w3, [x0, w1, uxtw]
 	.loc 1 113 0
-	cbz	w4, .L62
+	cbz	w3, .L62
 	.p2align 2
 .L64:
 	.loc 1 114 0
-	lsl	w2, w19, 16
-	add	w9, w3, 1
-	add	w10, w2, w3, lsl 8
-	add	w2, w2, w6
-	add	w10, w10, w6
+	lsl	w1, w19, 10
+	add	w8, w2, 1
+	add	w9, w1, w2, lsl 5
+	add	w1, w1, w5
+	add	w9, w9, w5
 	.loc 1 115 0
-	add	w8, w3, 2
-	add	w9, w2, w9, lsl 8
+	add	w7, w2, 2
+	add	w8, w1, w8, lsl 5
 	.loc 1 116 0
-	add	w7, w3, 3
-	add	w8, w2, w8, lsl 8
+	add	w6, w2, 3
+	add	w7, w1, w7, lsl 5
 	.loc 1 117 0
-	add	w2, w2, w7, lsl 8
+	add	w1, w1, w6, lsl 5
 	.loc 1 114 0
-	strb	w11, [x5, w10, uxtw]
+	strb	w10, [x4, w9, uxtw]
 	.loc 1 117 0
-	add	w3, w3, 4
+	add	w2, w2, 4
 	.loc 1 115 0
-	strb	w12, [x5, w9, uxtw]
+	strb	w11, [x4, w8, uxtw]
 	.loc 1 113 0
-	sub	w4, w4, #1
+	sub	w3, w3, #1
 	.loc 1 116 0
-	strb	w13, [x5, w8, uxtw]
+	strb	w12, [x4, w7, uxtw]
 	.loc 1 118 0
-	cmp	w21, w3
+	cmp	w14, w2
 	.loc 1 117 0
-	strb	w14, [x5, w2, uxtw]
+	strb	w13, [x4, w1, uxtw]
 	.loc 1 118 0
 	bhi	.L63
 	.loc 1 120 0
-	add	w6, w6, 1
+	add	w5, w5, 1
 	.loc 1 119 0
-	mov	w3, 0
+	mov	w2, 0
 	.loc 1 120 0
-	cmp	w21, w6
+	cmp	w14, w5
 	bhi	.L63
 	.loc 1 122 0
 	add	w19, w19, 1
 	.loc 1 121 0
-	mov	w6, 0
+	mov	w5, 0
 .L63:
 	.loc 1 113 0
-	ands	w4, w4, 255
+	ands	w3, w3, 255
 	bne	.L64
 .L62:
 	.loc 1 127 0
 	add	w15, w15, 2
-	mov	w7, 1
+	mov	w6, 1
 .LVL25:
 .L65:
 	.loc 1 81 0
-	cmp	w19, 255
+	cmp	w19, 149
 	bls	.L55
 	.loc 1 82 0
 	adrp	x0, .LC3
@@ -599,19 +581,18 @@ decodewaveform:
 	bl	printk
 .LVL27:
 	.loc 1 147 0
-	cmp	w21, 32
+	ldr	w0, [x21, #:lo12:.LANCHOR1]
+	cmp	w0, 32
 	beq	.L56
 .LVL28:
 .L57:
-	.loc 1 164 0
+	.loc 1 159 0
 	mov	w0, w19
-.LVL29:
-.L51:
-	.loc 1 165 0
+.L52:
+	.loc 1 160 0
 	ldp	x19, x20, [sp, 16]
-.LVL30:
+.LVL29:
 	ldr	x21, [sp, 32]
-.LVL31:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 30
@@ -621,144 +602,126 @@ decodewaveform:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL32:
+.LVL30:
 	.p2align 3
 .L60:
 	.cfi_restore_state
 	.loc 1 131 0
-	add	w11, w4, w3, lsl 8
-	add	w10, w3, 1
-	add	w4, w4, w6
-	add	w11, w11, w6
+	add	w10, w3, w2, lsl 5
+	add	w9, w2, 1
+	add	w3, w3, w5
+	add	w10, w10, w5
 	.loc 1 132 0
-	add	w9, w3, 2
-	add	w10, w4, w10, lsl 8
+	add	w8, w2, 2
+	add	w9, w3, w9, lsl 5
 	.loc 1 133 0
-	add	w8, w3, 3
-	add	w9, w4, w9, lsl 8
+	add	w7, w2, 3
+	add	w8, w3, w8, lsl 5
 	.loc 1 131 0
-	and	w12, w2, 3
+	and	w11, w1, 3
 	.loc 1 134 0
-	add	w4, w4, w8, lsl 8
+	add	w3, w3, w7, lsl 5
 	.loc 1 131 0
-	strb	w12, [x5, w11, uxtw]
+	strb	w11, [x4, w10, uxtw]
 	.loc 1 132 0
-	ubfx	x8, x2, 2, 2
-	strb	w8, [x5, w10, uxtw]
+	ubfx	x7, x1, 2, 2
+	strb	w7, [x4, w9, uxtw]
 	.loc 1 133 0
-	ubfx	x8, x2, 4, 2
-	strb	w8, [x5, w9, uxtw]
+	ubfx	x7, x1, 4, 2
+	strb	w7, [x4, w8, uxtw]
 	.loc 1 134 0
-	lsr	w2, w2, 6
-	strb	w2, [x5, w4, uxtw]
-	add	w3, w3, 4
+	lsr	w1, w1, 6
+	strb	w1, [x4, w3, uxtw]
+	add	w2, w2, 4
 	.loc 1 135 0
 	add	w15, w15, 1
 	.loc 1 137 0
-	cmp	w21, w3
-	bhi	.L65
+	cmp	w2, w14
+	bcc	.L65
 	.loc 1 139 0
-	add	w6, w6, 1
+	add	w5, w5, 1
 	.loc 1 138 0
-	mov	w3, 0
+	mov	w2, 0
 	.loc 1 139 0
-	cmp	w21, w6
+	cmp	w14, w5
 	bhi	.L65
 	.loc 1 141 0
 	add	w19, w19, 1
-	.loc 1 138 0
-	mov	w3, w7
 	.loc 1 140 0
-	mov	w6, 0
+	mov	w5, 0
+	.loc 1 138 0
+	mov	w2, w6
 	b	.L65
-.L90:
+.L89:
 	.loc 1 93 0
 	add	w15, w15, 1
 	.loc 1 92 0
-	eor	w7, w7, 1
-	ldrb	w2, [x0, w15, uxtw]
+	eor	w6, w6, 1
+	ldrb	w1, [x0, w15, uxtw]
 	b	.L59
 .L58:
 	.loc 1 147 0
-	cmp	w21, 32
+	ldr	w0, [x21, #:lo12:.LANCHOR1]
+.LVL31:
+	cmp	w0, 32
 	bne	.L57
 	.loc 1 149 0 discriminator 1
 	cbz	w19, .L57
 .L56:
 	add	x20, x20, :lo12:.LANCHOR0
-	.loc 1 121 0
+	.loc 1 119 0
 	mov	w8, 0
 	ldr	x1, [x20, 48]
-.LVL33:
+.LVL32:
 .L70:
-	lsl	w7, w8, 16
-.LVL34:
+	lsl	w7, w8, 10
 	mov	w6, 0
+.LVL33:
 	mov	w5, w7
 	.p2align 2
 .L68:
 	lsr	w4, w6, 1
 	mov	w0, 0
-.LVL35:
-	add	w4, w7, w4, lsl 8
+	add	w4, w7, w4, lsl 5
 	.p2align 2
 .L67:
-	.loc 1 156 0 discriminator 3
+	.loc 1 152 0 discriminator 3
 	add	w3, w0, w5
-.LVL36:
-	.loc 1 157 0 discriminator 3
+.LVL34:
+	.loc 1 153 0 discriminator 3
 	add	w2, w4, w0, lsr 1
 	.loc 1 151 0 discriminator 3
 	add	w0, w0, 2
 	cmp	w0, 32
-	.loc 1 156 0 discriminator 3
+	.loc 1 152 0 discriminator 3
 	ldrb	w3, [x1, w3, uxtw]
-.LVL37:
-	.loc 1 157 0 discriminator 3
+.LVL35:
+	.loc 1 153 0 discriminator 3
 	strb	w3, [x1, w2, uxtw]
 	.loc 1 151 0 discriminator 3
 	bne	.L67
 	.loc 1 150 0 discriminator 2
 	add	w6, w6, 2
-	add	w5, w5, 512
+	add	w5, w5, 64
 	cmp	w6, 32
 	bne	.L68
 	.loc 1 149 0 discriminator 2
 	add	w8, w8, 1
 	and	w8, w8, 255
-	cmp	w19, w8
-	bhi	.L70
+	cmp	w8, w19
+	bcc	.L70
 	b	.L57
-.LVL38:
-.L71:
-	.loc 1 77 0
-	mov	w0, -22
-.LVL39:
-	.loc 1 165 0
-	ldr	x21, [sp, 32]
-.LVL40:
-	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
-.LVL41:
-.L89:
-	.cfi_restore_state
-	.loc 1 73 0
+.LVL36:
+.L88:
+	.loc 1 76 0
 	adrp	x0, .LC2
-.LVL42:
+.LVL37:
 	add	x0, x0, :lo12:.LC2
 	bl	printk
-.LVL43:
-	.loc 1 74 0
+.LVL38:
+	.loc 1 77 0
 	mov	w0, -22
-	b	.L51
+	b	.L52
 	.cfi_endproc
 .LFE1547:
 	.size	decodewaveform, .-decodewaveform
@@ -766,485 +729,906 @@ decodewaveform:
 	.p2align 3,,7
 	.type	get_wf_frm_num, %function
 get_wf_frm_num:
-.LFB1551:
-	.loc 1 450 0
+.LFB1552:
+	.loc 1 419 0
 	.cfi_startproc
-.LVL44:
+.LVL39:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 451 0
+	.loc 1 420 0
 	adrp	x2, .LANCHOR0+40
-	.loc 1 450 0
+	.loc 1 419 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 451 0
+	.loc 1 420 0
 	ldr	x2, [x2, #:lo12:.LANCHOR0+40]
-.LVL45:
-	.loc 1 456 0
+.LVL40:
+	.loc 1 424 0
 	ldrb	w3, [x2, 32]
 	add	w0, w3, w0, lsl 2
-.LVL46:
-	.loc 1 459 0
+.LVL41:
+	.loc 1 427 0
 	add	x4, x2, x0, sxtw
-	.loc 1 458 0
+	.loc 1 426 0
 	ldrb	w5, [x2, w0, sxtw]
-	.loc 1 460 0
+	.loc 1 428 0
 	ldrb	w3, [x4, 2]
-	.loc 1 459 0
+	.loc 1 427 0
 	ldrb	w0, [x4, 1]
-	.loc 1 461 0
+	.loc 1 429 0
 	ldrb	w6, [x4, 3]
-	.loc 1 462 0
+	.loc 1 430 0
 	add	w4, w0, w3
 	add	w4, w4, w5
 	cmp	w6, w4, uxtb
-	bne	.L109
-	.loc 1 467 0
+	bne	.L95
+	.loc 1 435 0
 	lsl	w3, w3, 16
 	orr	w0, w3, w0, lsl 8
 	orr	w0, w0, w5
-	.loc 1 469 0
+	.loc 1 437 0
 	add	w0, w0, w1, lsl 2
-	.loc 1 472 0
+	.loc 1 440 0
 	add	x3, x2, x0, sxtw
-	.loc 1 471 0
+	.loc 1 439 0
 	ldrb	w4, [x2, w0, sxtw]
-	.loc 1 473 0
+	.loc 1 441 0
 	ldrb	w1, [x3, 2]
-.LVL47:
-	.loc 1 472 0
+.LVL42:
+	.loc 1 440 0
 	ldrb	w0, [x3, 1]
-	.loc 1 474 0
+	.loc 1 442 0
 	ldrb	w5, [x3, 3]
-	.loc 1 476 0
+	.loc 1 444 0
 	add	w3, w0, w1
 	add	w3, w3, w4
 	cmp	w5, w3, uxtb
-	bne	.L110
-	.loc 1 481 0
+	bne	.L96
+	.loc 1 449 0
 	lsl	w1, w1, 16
-	.loc 1 483 0
-	ldrb	w3, [x2, 16]
-	.loc 1 481 0
 	orr	w0, w1, w0, lsl 8
 	orr	w0, w0, w4
-	.loc 1 483 0
-	cmp	w3, 25
-	bhi	.L96
-	cmp	w3, 24
-	bcs	.L97
-	cmp	w3, 22
-	beq	.L97
-.L95:
-	.loc 1 492 0
-	mov	w1, 16
+	.loc 1 451 0
 	add	x0, x2, x0
 	bl	decodewaveform
-.LVL48:
-.L91:
-	.loc 1 497 0
+.LVL43:
+.L90:
+	.loc 1 452 0
 	ldp	x29, x30, [sp], 16
 	.cfi_remember_state
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
-.LVL49:
-	.p2align 3
-.L96:
-	.cfi_restore_state
-	.loc 1 483 0
-	cmp	w3, 32
-	beq	.L97
-	cmp	w3, 67
-	bne	.L95
-.L97:
-	.loc 1 489 0
-	mov	w1, 32
-	add	x0, x2, x0
-	bl	decodewaveform
-.LVL50:
-	.loc 1 497 0
-	ldp	x29, x30, [sp], 16
-	.cfi_remember_state
-	.cfi_restore 29
-	.cfi_restore 30
-	.cfi_def_cfa 31, 0
-	ret
-.LVL51:
-.L110:
+.LVL44:
+.L95:
 	.cfi_restore_state
-	.loc 1 477 0
-	adrp	x1, .LANCHOR1
+	.loc 1 431 0
+	adrp	x1, .LANCHOR2
+.LVL45:
 	adrp	x0, .LC4
-	mov	w2, 477
-.LVL52:
-	add	x1, x1, :lo12:.LANCHOR1
+	mov	w2, 431
+.LVL46:
+	add	x1, x1, :lo12:.LANCHOR2
 	add	x0, x0, :lo12:.LC4
 	bl	printk
-.LVL53:
-	.loc 1 478 0
+.LVL47:
+	.loc 1 432 0
 	mov	w0, -22
-	b	.L91
-.LVL54:
-.L109:
-	.loc 1 463 0
-	adrp	x1, .LANCHOR1
-.LVL55:
+	b	.L90
+.LVL48:
+.L96:
+	.loc 1 445 0
+	adrp	x1, .LANCHOR2
 	adrp	x0, .LC4
-	mov	w2, 463
-.LVL56:
-	add	x1, x1, :lo12:.LANCHOR1
+	mov	w2, 445
+.LVL49:
+	add	x1, x1, :lo12:.LANCHOR2
 	add	x0, x0, :lo12:.LC4
 	bl	printk
-.LVL57:
-	.loc 1 464 0
+.LVL50:
+	.loc 1 446 0
 	mov	w0, -22
-	b	.L91
+	b	.L90
 	.cfi_endproc
-.LFE1551:
+.LFE1552:
 	.size	get_wf_frm_num, .-get_wf_frm_num
 	.align	2
 	.p2align 3,,7
-	.global	pvi_wf_get_lut
-	.type	pvi_wf_get_lut, %function
-pvi_wf_get_lut:
-.LFB1553:
-	.loc 1 941 0
+	.global	decodewaveform_32
+	.type	decodewaveform_32, %function
+decodewaveform_32:
+.LFB1548:
+	.loc 1 163 0
 	.cfi_startproc
-.LVL58:
-	stp	x29, x30, [sp, -64]!
-	.cfi_def_cfa_offset 64
-	.cfi_offset 29, -64
-	.cfi_offset 30, -56
+.LVL51:
+	stp	x29, x30, [sp, -32]!
+	.cfi_def_cfa_offset 32
+	.cfi_offset 29, -32
+	.cfi_offset 30, -24
+	.loc 1 171 0
+	adrp	x1, .LANCHOR0+48
+	.loc 1 163 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	str	x23, [sp, 48]
-	.cfi_offset 23, -16
-	.loc 1 947 0
-	adrp	x23, .LANCHOR0
-	add	x3, x23, :lo12:.LANCHOR0
-	.loc 1 941 0
-	stp	x19, x20, [sp, 16]
-	stp	x21, x22, [sp, 32]
-	.cfi_offset 19, -48
-	.cfi_offset 20, -40
-	.cfi_offset 21, -32
-	.cfi_offset 22, -24
-	.loc 1 947 0
-	ldr	x5, [x3, 40]
-	cbz	x5, .L132
-	.loc 1 950 0
-	cbz	x0, .L146
-.L113:
-	.loc 1 955 0
-	adrp	x6, .LANCHOR2
-	mov	w3, 21846
-	movk	w3, 0x5555, lsl 16
-	add	x8, x6, :lo12:.LANCHOR2
-	ldr	w7, [x6, #:lo12:.LANCHOR2]
-	smull	x4, w2, w3
-	smull	x3, w7, w3
-	lsr	x4, x4, 32
-	sub	w4, w4, w2, asr 31
-	lsr	x3, x3, 32
-	sub	w3, w3, w7, asr 31
-	cmp	w4, w3
-	beq	.L147
-.L114:
-	.loc 1 958 0
-	add	x4, x6, :lo12:.LANCHOR2
-.LBB22:
-.LBB23:
-	.loc 1 432 0
-	ldrb	w3, [x5, 38]
+	.loc 1 171 0
+	ldr	x4, [x1, #:lo12:.LANCHOR0+48]
+	.loc 1 163 0
+	str	x19, [sp, 16]
+	.cfi_offset 19, -16
+	.loc 1 171 0
+	cbz	x4, .L121
+	.loc 1 233 0
+	adrp	x1, .LANCHOR1
+	mov	w6, 1
+.LVL52:
+	mov	w15, 0
+	mov	w19, 0
+.LVL53:
+	ldr	w14, [x1, #:lo12:.LANCHOR1]
+	mov	w5, 0
+.LVL54:
+	mov	w1, 0
+.LVL55:
+	.p2align 2
+.L100:
+	.loc 1 182 0
+	ldrb	w2, [x0, w15, uxtw]
+	cmp	w2, 255
+	beq	.L101
+	.loc 1 187 0
+	cmp	w2, 252
+	beq	.L122
+.L102:
+	.loc 1 194 0
+	lsl	w3, w19, 10
+.LVL56:
+	.loc 1 192 0
+	cbz	w6, .L103
+	.loc 1 194 0
+	add	w9, w3, w1, lsl 5
+	add	w8, w1, 1
+	add	w3, w3, w5
+	add	w9, w9, w5
+	.loc 1 195 0
+	add	w7, w1, 2
+	add	w8, w3, w8, lsl 5
+	.loc 1 196 0
+	add	w6, w1, 3
+.LVL57:
+	add	w7, w3, w7, lsl 5
+	.loc 1 194 0
+	and	w10, w2, 3
+	.loc 1 197 0
+	add	w3, w3, w6, lsl 5
+	.loc 1 194 0
+	strb	w10, [x4, w9, uxtw]
+	.loc 1 195 0
+	ubfx	x11, x2, 2, 2
+	strb	w11, [x4, w8, uxtw]
+	.loc 1 196 0
+	ubfx	x12, x2, 4, 2
+	strb	w12, [x4, w7, uxtw]
+	.loc 1 197 0
+	lsr	w13, w2, 6
+	strb	w13, [x4, w3, uxtw]
+	add	w1, w1, 4
+	.loc 1 198 0
+	add	w2, w15, 1
+	.loc 1 200 0
+	cmp	w14, w1
+	bhi	.L104
+	.loc 1 202 0
+	add	w5, w5, 1
+	.loc 1 201 0
+	mov	w1, 0
+	.loc 1 202 0
+	cmp	w14, w5
+	bhi	.L104
+	.loc 1 204 0
+	add	w19, w19, 1
+	.loc 1 203 0
+	mov	w5, 0
+.L104:
+	.loc 1 208 0
+	ldrb	w3, [x0, w2, uxtw]
+.LVL58:
+	.loc 1 209 0
+	cbz	w3, .L105
+	.p2align 2
+.L107:
+	.loc 1 210 0
+	lsl	w2, w19, 10
+	add	w8, w1, 1
+	add	w9, w2, w1, lsl 5
+	add	w2, w5, w2
+	add	w9, w9, w5
+	.loc 1 211 0
+	add	w7, w1, 2
+	add	w8, w2, w8, lsl 5
+	.loc 1 212 0
+	add	w6, w1, 3
+	add	w7, w2, w7, lsl 5
+	.loc 1 213 0
+	add	w2, w2, w6, lsl 5
+	.loc 1 210 0
+	strb	w10, [x4, w9, uxtw]
+	.loc 1 213 0
+	add	w1, w1, 4
+	.loc 1 211 0
+	strb	w11, [x4, w8, uxtw]
+	.loc 1 209 0
+	sub	w3, w3, #1
 .LVL59:
-.LBE23:
-.LBE22:
-	.loc 1 958 0
-	str	w2, [x6, #:lo12:.LANCHOR2]
-	.loc 1 959 0
-	str	w1, [x4, 4]
-.LBB27:
-.LBB24:
-	.loc 1 436 0
-	cbz	w3, .L115
-	.loc 1 437 0
-	ldrb	w4, [x5, 48]
-	cmp	w2, w4
-	blt	.L134
-	mov	w21, 0
+	.loc 1 212 0
+	strb	w12, [x4, w7, uxtw]
+	.loc 1 214 0
+	cmp	w14, w1
+	.loc 1 213 0
+	strb	w13, [x4, w2, uxtw]
+	.loc 1 214 0
+	bhi	.L106
+	.loc 1 216 0
+	add	w5, w5, 1
+	.loc 1 215 0
+	mov	w1, 0
+	.loc 1 216 0
+	cmp	w14, w5
+	bhi	.L106
+	.loc 1 218 0
+	add	w19, w19, 1
+	.loc 1 217 0
+	mov	w5, 0
+.L106:
+	.loc 1 209 0
+	ands	w3, w3, 255
 .LVL60:
-	b	.L117
-	.p2align 3
-.L118:
-	ldrb	w6, [x5, w6, sxtw]
-	cmp	w2, w6
-	blt	.L131
-	mov	w21, w4
-.L117:
-	.loc 1 436 0
-	add	w4, w21, 1
-	.loc 1 437 0
-	add	w6, w21, 49
-	.loc 1 436 0
-	cmp	w3, w4
-	bne	.L118
-.L115:
-	.loc 1 444 0
-	sub	w21, w3, #1
-.L131:
-	mov	x20, x0
-.LBE24:
-.LBE27:
-	.loc 1 962 0
-	add	x0, x23, :lo12:.LANCHOR0
+	bne	.L107
+.L105:
+	.loc 1 223 0
+	add	w15, w15, 2
+	mov	w6, 1
 .LVL61:
-	.loc 1 966 0
-	sub	w2, w1, #1
+.L108:
+	.loc 1 177 0
+	cmp	w19, 149
+	bls	.L100
+	.loc 1 178 0
+	adrp	x0, .LC3
 .LVL62:
-	mov	w19, w1
-	cmp	w2, 10
-	.loc 1 962 0
-	ldr	x1, [x20, 16]
+	add	x0, x0, :lo12:.LC3
+	bl	printk
 .LVL63:
-	str	x1, [x0, 48]
-	.loc 1 966 0
-	bhi	.L119
-.LBB28:
-.LBB29:
-	.loc 1 902 0
+.L101:
+	.loc 1 243 0
 	mov	w0, w19
-	bl	get_wf_mode_index
 .LVL64:
-	.loc 1 903 0
-	mov	w1, w21
-	bl	get_wf_frm_num
+.L97:
+	.loc 1 244 0
+	ldr	x19, [sp, 16]
 .LVL65:
-	mov	w22, w0
+	ldp	x29, x30, [sp], 32
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_def_cfa 31, 0
+	ret
 .LVL66:
-	.loc 1 904 0
-	tbnz	w0, #31, .L148
-	.loc 1 908 0
-	str	w0, [x20]
-	.loc 1 910 0
-	cmp	w19, 5
-	beq	.L149
-	.loc 1 900 0
-	mov	w21, 0
+	.p2align 3
+.L103:
+	.cfi_restore_state
+	.loc 1 227 0
+	add	w10, w3, w1, lsl 5
+	add	w9, w1, 1
+	add	w3, w3, w5
+	add	w10, w10, w5
+	.loc 1 228 0
+	add	w8, w1, 2
+	add	w9, w3, w9, lsl 5
+	.loc 1 229 0
+	add	w7, w1, 3
+	add	w8, w3, w8, lsl 5
+	.loc 1 227 0
+	and	w11, w2, 3
+	.loc 1 230 0
+	add	w3, w3, w7, lsl 5
+	.loc 1 227 0
+	strb	w11, [x4, w10, uxtw]
+	.loc 1 228 0
+	ubfx	x7, x2, 2, 2
+	strb	w7, [x4, w9, uxtw]
+	.loc 1 229 0
+	ubfx	x7, x2, 4, 2
+	strb	w7, [x4, w8, uxtw]
+	.loc 1 230 0
+	lsr	w2, w2, 6
+	strb	w2, [x4, w3, uxtw]
+	add	w1, w1, 4
+	.loc 1 231 0
+	add	w15, w15, 1
+	.loc 1 233 0
+	cmp	w1, w14
+	bcc	.L108
+	.loc 1 235 0
+	add	w5, w5, 1
+	.loc 1 234 0
+	mov	w1, 0
+	.loc 1 235 0
+	cmp	w14, w5
+	bhi	.L108
+	.loc 1 237 0
+	add	w19, w19, 1
+	.loc 1 236 0
+	mov	w5, 0
+	.loc 1 234 0
+	mov	w1, w6
+	b	.L108
 .LVL67:
-	.loc 1 917 0
-	cbz	w0, .L128
-.L129:
-	add	x23, x23, :lo12:.LANCHOR0
-	.loc 1 900 0
-	mov	w10, 0
-	mov	w11, 0
+	.p2align 3
+.L122:
+	.loc 1 189 0
+	add	w15, w15, 1
+	.loc 1 188 0
+	eor	w6, w6, 1
+	ldrb	w2, [x0, w15, uxtw]
+	b	.L102
 .LVL68:
-	ldr	x4, [x23, 48]
+.L121:
+	.loc 1 172 0
+	adrp	x0, .LC2
 .LVL69:
-.L127:
-	mov	w8, w10
-	mov	w9, 0
-	.p2align 2
+	add	x0, x0, :lo12:.LC2
+	bl	printk
+.LVL70:
+	.loc 1 173 0
+	mov	w0, -22
+	b	.L97
+	.cfi_endproc
+.LFE1548:
+	.size	decodewaveform_32, .-decodewaveform_32
+	.align	2
+	.p2align 3,,7
+	.global	pvi_wf_get_lut
+	.type	pvi_wf_get_lut, %function
+pvi_wf_get_lut:
+.LFB1557:
+	.loc 1 585 0
+	.cfi_startproc
+.LVL71:
+	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	x23, x24, [sp, 48]
+	.cfi_offset 23, -32
+	.cfi_offset 24, -24
+	.loc 1 592 0
+	adrp	x23, .LANCHOR0
+	add	x4, x23, :lo12:.LANCHOR0
+	.loc 1 585 0
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
+	str	x25, [sp, 64]
+	.cfi_offset 19, -64
+	.cfi_offset 20, -56
+	.cfi_offset 21, -48
+	.cfi_offset 22, -40
+	.cfi_offset 25, -16
+	.loc 1 592 0
+	ldr	x4, [x4, 40]
+	cbz	x4, .L156
+	.loc 1 595 0
+	cbz	x0, .L179
 .L125:
-	and	w0, w9, 65535
+	mov	x19, x0
+	.loc 1 598 0
+	adrp	x0, .LANCHOR1
+.LVL72:
+	mov	w24, w3
+	mov	w3, w2
+.LVL73:
+	ldr	w2, [x0, #:lo12:.LANCHOR1]
+.LVL74:
+	mov	w20, w1
+	add	x6, x0, :lo12:.LANCHOR1
+	cmp	w2, w24
+	blt	.L180
+	.loc 1 605 0
+	ldr	w5, [x6, 4]
+	mov	w1, 21846
+	movk	w1, 0x5555, lsl 16
+	smull	x2, w3, w1
+	smull	x1, w5, w1
+	lsr	x2, x2, 32
+	lsr	x1, x1, 32
+	sub	w2, w2, w3, asr 31
+	sub	w1, w1, w5, asr 31
+	cmp	w2, w1
+	beq	.L181
+.L127:
+	.loc 1 608 0
+	add	x0, x0, :lo12:.LANCHOR1
+.LBB28:
+.LBB29:
+	.loc 1 401 0
+	ldrb	w1, [x4, 38]
+.LVL75:
 .LBE29:
 .LBE28:
-.LBB36:
-.LBB25:
-	.loc 1 437 0
-	mov	w2, 0
-	ubfiz	w7, w0, 8, 4
-	and	w0, w0, 240
-	add	w7, w7, w10
-	add	w6, w10, w0, lsl 4
-	.p2align 2
-.L124:
-.LBE25:
-.LBE36:
-.LBB37:
+	.loc 1 609 0
+	stp	w3, w20, [x0, 4]
 .LBB32:
 .LBB30:
-	.loc 1 922 0
-	and	w0, w2, 65535
-	.loc 1 929 0
-	add	w5, w2, w8
-	.loc 1 928 0
-	add	w1, w6, w0, lsr 4
-	.loc 1 927 0
-	and	w0, w0, 15
-	add	w0, w0, w7
-.LBE30:
-	.loc 1 919 0
-	add	w2, w2, 1
-	cmp	w2, 256
-.LBB31:
-	.loc 1 928 0
-	ldrb	w1, [x4, w1, sxtw]
-	.loc 1 927 0
-	ldrb	w3, [x4, w0, sxtw]
-	.loc 1 929 0
-	ubfiz	w0, w1, 2, 2
-	.loc 1 927 0
-	and	w1, w3, 3
-	.loc 1 929 0
-	orr	w0, w0, w1
-	strb	w0, [x4, w5, sxtw]
-.LBE31:
-	.loc 1 919 0
-	bne	.L124
-	.loc 1 918 0
-	add	w9, w9, 1
-	add	w8, w8, 256
-	cmp	w9, 256
-	bne	.L125
-	.loc 1 917 0
-	add	w11, w11, 1
-	add	w10, w10, 65536
-	cmp	w22, w11
-	bgt	.L127
-	.loc 1 934 0
-	cmp	w19, 5
-	beq	.L130
-.LVL70:
+	.loc 1 405 0
+	cbz	w1, .L128
+	.loc 1 406 0
+	ldrb	w0, [x4, 48]
+	cmp	w3, w0
+	blt	.L158
+	mov	w25, 0
+.LVL76:
+	b	.L130
+	.p2align 3
+.L131:
+	ldrb	w2, [x4, w2, sxtw]
+	cmp	w3, w2
+	blt	.L155
+	mov	w25, w0
+.L130:
+	.loc 1 405 0
+	add	w0, w25, 1
+	.loc 1 406 0
+	add	w2, w25, 49
+	.loc 1 405 0
+	cmp	w1, w0
+	bne	.L131
 .L128:
+	.loc 1 413 0
+	sub	w25, w1, #1
+.L155:
+.LBE30:
 .LBE32:
-.LBE37:
-	.loc 1 956 0
-	mov	w0, 0
-	b	.L111
-.LVL71:
-.L132:
-	.loc 1 948 0
-	mov	w0, -19
-.LVL72:
-.L111:
-	.loc 1 988 0
-	ldp	x19, x20, [sp, 16]
-.LVL73:
-	ldp	x21, x22, [sp, 32]
-.LVL74:
-	ldr	x23, [sp, 48]
-	ldp	x29, x30, [sp], 64
-	.cfi_remember_state
-	.cfi_restore 30
-	.cfi_restore 29
-	.cfi_restore 23
-	.cfi_restore 21
-	.cfi_restore 22
-	.cfi_restore 19
-	.cfi_restore 20
-	.cfi_def_cfa 31, 0
-	ret
-.LVL75:
-.L134:
-	.cfi_restore_state
-.LBB38:
-.LBB26:
-	.loc 1 437 0
-	mov	w21, -1
-.LVL76:
-	b	.L131
+	.loc 1 613 0
+	add	x21, x23, :lo12:.LANCHOR0
+	ldr	x0, [x19, 16]
+	.loc 1 616 0
+	sub	w1, w20, #1
 .LVL77:
-.L147:
-.LBE26:
-.LBE38:
-	.loc 1 955 0 discriminator 1
-	ldr	w3, [x8, 4]
-	cmp	w3, w1
-	bne	.L114
-	b	.L128
-.L146:
-	.loc 1 950 0 discriminator 1
-	ldr	x3, [x0, 16]
-	cbnz	x3, .L113
-	.loc 1 951 0
-	mov	w0, -22
+	.loc 1 613 0
+	add	x0, x0, 9764864
+	.loc 1 616 0
+	cmp	w1, 10
+	.loc 1 613 0
+	str	x0, [x21, 48]
+	.loc 1 616 0
+	bhi	.L132
+.LBB33:
+.LBB34:
+	.loc 1 555 0
+	mov	w0, w20
+	bl	get_wf_mode_index
 .LVL78:
-	b	.L111
+	.loc 1 556 0
+	cmp	w24, 32
+	.loc 1 555 0
+	mov	w1, w0
+	.loc 1 556 0
+	beq	.L182
+	.loc 1 559 0
+	mov	w1, w25
+	bl	get_wf_frm_num
 .LVL79:
-.L148:
-.LBB39:
-.LBB33:
-	.loc 1 905 0
-	adrp	x0, .LC5
+	mov	w21, w0
 .LVL80:
-	add	x0, x0, :lo12:.LC5
-	bl	printk
+.L138:
+	.loc 1 560 0
+	tbnz	w21, #31, .L136
+	.loc 1 564 0
+	str	w21, [x19]
+	.loc 1 553 0
+	mov	w22, 0
 .LVL81:
-.LBE33:
-.LBE39:
-	.loc 1 980 0
-	mov	w0, -1
-	b	.L111
+	.loc 1 566 0
+	cmp	w20, 5
+	beq	.L183
+.L140:
+	.loc 1 573 0
+	cmp	w24, 32
+	beq	.L184
+	.loc 1 576 0
+	ldr	x9, [x19, 16]
+.LBB35:
+.LBB36:
+	.loc 1 523 0
+	cbz	w21, .L149
+	add	x23, x23, :lo12:.LANCHOR0
+	mov	w12, 0
 .LVL82:
-.L149:
-.LBB40:
-.LBB34:
-	.loc 1 911 0
-	mov	w0, 4
+	ldr	x4, [x23, 48]
 .LVL83:
-	bl	get_wf_mode_index
+.L154:
+	lsl	w11, w12, 10
+	lsl	w8, w12, 16
+	mov	w10, 0
+	.p2align 2
+.L152:
+	ubfiz	w7, w10, 5, 4
+	and	w6, w10, 240
+	add	w7, w7, w11
+	add	w6, w11, w6, lsl 1
+.LBE36:
+.LBE35:
+.LBB40:
+.LBB41:
+	.loc 1 495 0
+	mov	x2, 0
+	.p2align 2
+.L151:
+	and	w0, w2, 65535
 .LVL84:
-	.loc 1 912 0
-	mov	w1, w21
-	bl	get_wf_frm_num
+.LBE41:
+.LBE40:
+.LBB46:
+.LBB39:
+.LBB37:
+	.loc 1 532 0
+	add	w5, w8, w2
+	.loc 1 531 0
+	add	w1, w6, w0, lsr 4
+	.loc 1 530 0
+	and	w0, w0, 15
 .LVL85:
-	mov	w21, w0
+	add	w0, w0, w7
+	add	x2, x2, 1
+.LBE37:
+	.loc 1 525 0
+	cmp	x2, 256
+.LBB38:
+	.loc 1 531 0
+	ldrb	w1, [x4, w1, sxtw]
+	.loc 1 530 0
+	ldrb	w3, [x4, w0, sxtw]
+	.loc 1 532 0
+	ubfiz	w0, w1, 2, 2
+	.loc 1 530 0
+	and	w1, w3, 3
+	.loc 1 532 0
+	orr	w0, w0, w1
+	strb	w0, [x9, w5, sxtw]
+.LBE38:
+	.loc 1 525 0
+	bne	.L151
+	.loc 1 524 0
+	add	w10, w10, 1
 .LVL86:
-	.loc 1 913 0
-	cmp	w0, 0
-	bgt	.L123
-	.loc 1 914 0
-	adrp	x0, .LC6
-	add	x0, x0, :lo12:.LC6
-	bl	printk
+	add	w8, w8, 256
+	and	w10, w10, 65535
 .LVL87:
-.L123:
-	.loc 1 917 0
-	cbnz	w22, .L129
+	cmp	w10, 256
+	bne	.L152
+	.loc 1 523 0
+	add	w12, w12, 1
+	cmp	w21, w12
+	bne	.L154
 .LVL88:
-.L130:
-	.loc 1 935 0
-	ldr	w1, [x20]
+.L149:
+.LBE39:
+.LBE46:
+	.loc 1 578 0
+	cmp	w20, 5
+	beq	.L185
+.LVL89:
+.L144:
 .LBE34:
-.LBE40:
-	.loc 1 987 0
+.LBE33:
+	.loc 1 606 0
 	mov	w0, 0
-.LBB41:
-.LBB35:
-	.loc 1 935 0
-	orr	w21, w1, w21, lsl 8
-.LVL89:
-	str	w21, [x20]
-	b	.L111
+	b	.L123
 .LVL90:
-.L119:
-.LBE35:
-.LBE41:
-	.loc 1 983 0
+.L156:
+	.loc 1 593 0
+	mov	w0, -19
+.LVL91:
+.L123:
+	.loc 1 638 0
+	ldp	x19, x20, [sp, 16]
+.LVL92:
+	ldp	x21, x22, [sp, 32]
+.LVL93:
+	ldp	x23, x24, [sp, 48]
+	ldr	x25, [sp, 64]
+.LVL94:
+	ldp	x29, x30, [sp], 80
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 25
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+.LVL95:
+.L184:
+	.cfi_restore_state
+.LBB59:
+.LBB55:
+	.loc 1 574 0
+	ldr	x6, [x19, 16]
+.LBB47:
+.LBB44:
+	.loc 1 495 0
+	cbz	w21, .L149
+	add	x23, x23, :lo12:.LANCHOR0
+	mov	w8, 0
+.LVL96:
+	ldr	x5, [x23, 48]
+.LVL97:
+.L148:
+	lsl	w9, w8, 10
+	lsl	w4, w8, 16
+	mov	w7, 0
+.L146:
+	lsr	w3, w7, 3
+.LBE44:
+.LBE47:
+	.loc 1 553 0
+	mov	x0, 0
+	add	w3, w9, w3, lsl 5
+	.p2align 2
+.L145:
+.LBB48:
+.LBB45:
+.LBB42:
+	.loc 1 500 0
+	ubfx	x1, x0, 3, 13
+	.loc 1 501 0
+	add	w2, w4, w0
+	.loc 1 500 0
+	add	w1, w1, w3
+	add	x0, x0, 1
+.LBE42:
+	.loc 1 497 0
+	cmp	x0, 256
+.LBB43:
+	.loc 1 500 0
+	ldrb	w1, [x5, w1, sxtw]
+	and	w1, w1, 3
+	.loc 1 501 0
+	strb	w1, [x6, w2, sxtw]
+.LBE43:
+	.loc 1 497 0
+	bne	.L145
+	.loc 1 496 0
+	add	w7, w7, 1
+.LVL98:
+	add	w4, w4, 256
+	and	w7, w7, 65535
+.LVL99:
+	cmp	w7, 256
+	bne	.L146
+	.loc 1 495 0
+	add	w8, w8, 1
+	cmp	w21, w8
+	bne	.L148
+	b	.L149
+.LVL100:
+.L183:
+.LBE45:
+.LBE48:
+	.loc 1 567 0
+	mov	w0, 4
+	bl	get_wf_mode_index
+.LVL101:
+	.loc 1 568 0
+	mov	w1, w25
+	bl	get_wf_frm_num
+.LVL102:
+	mov	w22, w0
+.LVL103:
+	.loc 1 569 0
+	cmp	w0, 0
+	bgt	.L140
+	.loc 1 570 0
 	adrp	x0, .LC7
 	add	x0, x0, :lo12:.LC7
 	bl	printk
-.LVL91:
-	.loc 1 984 0
+.LVL104:
+	b	.L140
+.LVL105:
+.L185:
+	.loc 1 579 0
+	ldr	w1, [x19]
+.LBE55:
+.LBE59:
+	.loc 1 637 0
+	mov	w0, 0
+.LBB60:
+.LBB56:
+	.loc 1 579 0
+	orr	w22, w1, w22, lsl 8
+.LVL106:
+	str	w22, [x19]
+	b	.L123
+.LVL107:
+.L186:
+.LBB49:
+.LBB50:
+	.loc 1 467 0
+	adrp	x1, .LANCHOR2
+	add	x1, x1, :lo12:.LANCHOR2
+	adrp	x0, .LC4
+	mov	w2, 467
+.LVL108:
+	add	x1, x1, 16
+	add	x0, x0, :lo12:.LC4
+	bl	printk
+.LVL109:
+.L136:
+.LBE50:
+.LBE49:
+	.loc 1 561 0
+	adrp	x0, .LC6
+	add	x0, x0, :lo12:.LC6
+	bl	printk
+.LVL110:
+.LBE56:
+.LBE60:
+	.loc 1 630 0
+	mov	w0, -1
+	b	.L123
+.LVL111:
+.L182:
+.LBB61:
+.LBB57:
+.LBB53:
+.LBB51:
+	.loc 1 456 0
+	ldr	x2, [x21, 40]
+.LVL112:
+	.loc 1 460 0
+	ldrb	w0, [x2, 32]
+	add	w0, w0, w1, lsl 2
+	.loc 1 463 0
+	add	x3, x2, x0, sxtw
+	.loc 1 462 0
+	ldrb	w4, [x2, w0, sxtw]
+	.loc 1 463 0
+	ldrb	w1, [x3, 1]
+	.loc 1 464 0
+	ldrb	w0, [x3, 2]
+	.loc 1 465 0
+	ldrb	w5, [x3, 3]
+	.loc 1 466 0
+	add	w3, w1, w0
+	add	w3, w3, w4
+	cmp	w5, w3, uxtb
+	bne	.L186
+	.loc 1 471 0
+	lsl	w0, w0, 16
+	orr	w1, w0, w1, lsl 8
+	orr	w1, w1, w4
+	.loc 1 473 0
+	add	w1, w1, w25, lsl 2
+	.loc 1 476 0
+	add	x3, x2, x1, sxtw
+	.loc 1 475 0
+	ldrb	w4, [x2, w1, sxtw]
+	.loc 1 477 0
+	ldrb	w0, [x3, 2]
+	.loc 1 476 0
+	ldrb	w1, [x3, 1]
+	.loc 1 478 0
+	ldrb	w5, [x3, 3]
+	.loc 1 480 0
+	add	w3, w1, w0
+	add	w3, w3, w4
+	cmp	w5, w3, uxtb
+	bne	.L187
+	.loc 1 485 0
+	lsl	w0, w0, 16
+	orr	w0, w0, w1, lsl 8
+	orr	w0, w0, w4
+	.loc 1 487 0
+	add	x0, x2, x0
+	bl	decodewaveform_32
+.LVL113:
+	mov	w21, w0
+.LVL114:
+	b	.L138
+.LVL115:
+.L132:
+.LBE51:
+.LBE53:
+.LBE57:
+.LBE61:
+	.loc 1 633 0
+	adrp	x0, .LC8
+	mov	w1, w20
+	add	x0, x0, :lo12:.LC8
+	bl	printk
+.LVL116:
+	.loc 1 634 0
 	mov	w0, -1
-	b	.L111
+	b	.L123
+.LVL117:
+.L158:
+.LBB62:
+.LBB31:
+	.loc 1 406 0
+	mov	w25, -1
+.LVL118:
+	b	.L155
+.LVL119:
+.L187:
+.LBE31:
+.LBE62:
+.LBB63:
+.LBB58:
+.LBB54:
+.LBB52:
+	.loc 1 481 0
+	adrp	x1, .LANCHOR2
+	add	x1, x1, :lo12:.LANCHOR2
+	adrp	x0, .LC4
+	mov	w2, 481
+.LVL120:
+	add	x1, x1, 16
+	add	x0, x0, :lo12:.LC4
+	bl	printk
+.LVL121:
+	b	.L136
+.LVL122:
+.L181:
+.LBE52:
+.LBE54:
+.LBE58:
+.LBE63:
+	.loc 1 605 0 discriminator 1
+	ldr	w1, [x6, 8]
+	cmp	w1, w20
+	ccmn	w24, #1, 0, eq
+	bne	.L127
+	b	.L144
+.L180:
+	.loc 1 599 0
+	adrp	x0, .LC5
+	mov	w1, w24
+	add	x0, x0, :lo12:.LC5
+	bl	printk
+.LVL123:
+	.loc 1 600 0
+	mov	w0, -22
+	b	.L123
+.LVL124:
+.L179:
+	.loc 1 595 0 discriminator 1
+	ldr	x5, [x0, 16]
+	cbnz	x5, .L125
+	.loc 1 596 0
+	mov	w0, -22
+.LVL125:
+	b	.L123
 	.cfi_endproc
-.LFE1553:
+.LFE1557:
 	.size	pvi_wf_get_lut, .-pvi_wf_get_lut
 	.align	2
 	.p2align 3,,7
 	.global	pvi_wf_input
 	.type	pvi_wf_input, %function
 pvi_wf_input:
-.LFB1554:
-	.loc 1 997 0
+.LFB1558:
+	.loc 1 647 0
 	.cfi_startproc
-.LVL92:
+.LVL126:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -1254,18 +1638,18 @@ pvi_wf_input:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-	.loc 1 1000 0
+	.loc 1 650 0
 	adrp	x19, .LANCHOR0
 	add	x1, x19, :lo12:.LANCHOR0
 	ldr	x1, [x1, 40]
-	cbz	x1, .L179
-	.loc 1 1001 0
+	cbz	x1, .L218
+	.loc 1 651 0
 	mov	w0, -16
-.LVL93:
-.L150:
-	.loc 1 1026 0
+.LVL127:
+.L188:
+	.loc 1 677 0
 	ldp	x19, x20, [sp, 16]
-.LVL94:
+.LVL128:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -1274,128 +1658,142 @@ pvi_wf_input:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL95:
-.L179:
+.LVL129:
+.L218:
 	.cfi_restore_state
-	.loc 1 1003 0
+	.loc 1 653 0
 	ldrb	w1, [x0, 16]
 	mov	x20, x0
-	adrp	x0, .LC8
-.LVL96:
-	add	x0, x0, :lo12:.LC8
+	adrp	x0, .LC9
+.LVL130:
+	add	x0, x0, :lo12:.LC9
 	bl	printk
-.LVL97:
-	.loc 1 1006 0
+.LVL131:
+	.loc 1 656 0
 	ldrb	w1, [x20, 16]
 	cmp	w1, 25
-	bhi	.L153
+	bhi	.L191
 	cmp	w1, 24
-	bcs	.L154
+	bcs	.L192
 	cmp	w1, 18
-	beq	.L154
+	beq	.L193
 	cmp	w1, 22
-	beq	.L154
+	beq	.L192
 	cmp	w1, 9
-	beq	.L154
-.L152:
-	.loc 1 1018 0
+	beq	.L193
+.L190:
+	.loc 1 669 0
 	ldrb	w2, [x20, 22]
-	adrp	x0, .LC9
-	add	x0, x0, :lo12:.LC9
+	adrp	x0, .LC10
+	add	x0, x0, :lo12:.LC10
 	bl	printk
-.LVL98:
-	.loc 1 1020 0
+.LVL132:
+	.loc 1 671 0
 	mov	w0, -8
-	b	.L150
-.L153:
-	.loc 1 1006 0
-	cmp	w1, 35
-	beq	.L154
-	bls	.L180
-	cmp	w1, 67
-	beq	.L154
-	cmp	w1, 84
-	bne	.L152
-.L154:
-	.loc 1 1023 0
+	b	.L188
+.L219:
+	.loc 1 656 0
+	cmp	w1, 32
+	bne	.L190
+.L192:
+	.loc 1 662 0
+	adrp	x0, .LANCHOR1
+	mov	w1, 32
+	str	w1, [x0, #:lo12:.LANCHOR1]
+.L193:
+	.loc 1 674 0
 	add	x19, x19, :lo12:.LANCHOR0
-	.loc 1 1025 0
+	.loc 1 676 0
 	mov	w0, 0
-	.loc 1 1023 0
+	.loc 1 674 0
 	str	x20, [x19, 40]
-	.loc 1 1025 0
-	b	.L150
-.L180:
-	.loc 1 1006 0
-	cmp	w1, 32
-	beq	.L154
-	b	.L152
+	.loc 1 676 0
+	b	.L188
+.L191:
+	.loc 1 656 0
+	cmp	w1, 35
+	beq	.L193
+	bls	.L219
+	cmp	w1, 67
+	beq	.L192
+	cmp	w1, 84
+	beq	.L193
+	b	.L190
 	.cfi_endproc
-.LFE1554:
+.LFE1558:
 	.size	pvi_wf_input, .-pvi_wf_input
 	.align	2
 	.p2align 3,,7
 	.global	pvi_wf_get_version
 	.type	pvi_wf_get_version, %function
 pvi_wf_get_version:
-.LFB1555:
-	.loc 1 1035 0
+.LFB1559:
+	.loc 1 686 0
 	.cfi_startproc
-	.loc 1 1036 0
+	.loc 1 687 0
 	adrp	x0, .LANCHOR0
 	add	x0, x0, :lo12:.LANCHOR0
 	ldr	x3, [x0, 40]
-.LVL99:
-	.loc 1 1040 0
-	cbz	x3, .L184
-	.loc 1 1044 0 discriminator 3
+.LVL133:
+	.loc 1 691 0
+	cbz	x3, .L223
+	.loc 1 695 0 discriminator 3
 	add	x0, x0, 56
 	mov	x1, 0
 	.p2align 2
-.L183:
+.L222:
 	add	x2, x3, x1
 	ldrb	w2, [x2, 65]
 	strb	w2, [x1, x0]
 	add	x1, x1, 1
-	.loc 1 1043 0 discriminator 3
+	.loc 1 694 0 discriminator 3
 	cmp	x1, 31
-	bne	.L183
-	.loc 1 1046 0
+	bne	.L222
+	.loc 1 697 0
 	strb	wzr, [x0, 31]
-	.loc 1 1048 0
+	.loc 1 699 0
 	ret
-.L184:
-	.loc 1 1041 0
+.L223:
+	.loc 1 692 0
 	mov	x0, 0
-	.loc 1 1049 0
+	.loc 1 700 0
 	ret
 	.cfi_endproc
-.LFE1555:
+.LFE1559:
 	.size	pvi_wf_get_version, .-pvi_wf_get_version
 	.section	.rodata
 	.align	3
-	.set	.LANCHOR1,. + 0
-	.type	__func__.16872, %object
-	.size	__func__.16872, 15
-__func__.16872:
+	.set	.LANCHOR2,. + 0
+	.type	__func__.16890, %object
+	.size	__func__.16890, 15
+__func__.16890:
 	.string	"get_wf_frm_num"
+	.zero	1
+	.type	__func__.16901, %object
+	.size	__func__.16901, 18
+__func__.16901:
+	.string	"get_wf_frm_num_32"
 	.data
 	.align	2
-	.set	.LANCHOR2,. + 0
-	.type	sftemp.16912, %object
-	.size	sftemp.16912, 4
-sftemp.16912:
+	.set	.LANCHOR1,. + 0
+	.type	maxpic, %object
+	.size	maxpic, 4
+maxpic:
+	.word	16
+	.type	sftemp.16959, %object
+	.size	sftemp.16959, 4
+sftemp.16959:
 	.word	-1
-	.type	stype.16911, %object
-	.size	stype.16911, 4
-stype.16911:
+	.type	stype.16958, %object
+	.size	stype.16958, 4
+stype.16958:
 	.word	12
 	.bss
 	.align	3
 	.set	.LANCHOR0,. + 0
-	.type	pvi_modes.16823, %object
-	.size	pvi_modes.16823, 36
-pvi_modes.16823:
+	.type	pvi_modes.16841, %object
+	.size	pvi_modes.16841, 36
+pvi_modes.16841:
 	.zero	36
 	.zero	4
 	.type	global_waveform, %object
@@ -1406,9 +1804,9 @@ global_waveform:
 	.size	waveformdata, 8
 waveformdata:
 	.zero	8
-	.type	spi_id_buffer.16947, %object
-	.size	spi_id_buffer.16947, 32
-spi_id_buffer.16947:
+	.type	spi_id_buffer.16995, %object
+	.size	spi_id_buffer.16995, 32
+spi_id_buffer.16995:
 	.zero	32
 	.section	.rodata.str1.8,"aMS",@progbits,1
 	.align	3
@@ -1425,17 +1823,21 @@ spi_id_buffer.16947:
 .LC4:
 	.string	"pvi: %s %d check error\n"
 .LC5:
+	.string	"pvi: unsupport, needpic = %d, maxpic = %d\n"
+	.zero	5
+.LC6:
 	.string	"pvi waveform get frame number failed\n"
 	.zero	2
-.LC6:
+.LC7:
 	.string	"Get GRAY2 waveform data failed during AUTO mode\n"
 	.zero	7
-.LC7:
-	.string	"pvi: unsupport WF type\n"
 .LC8:
+	.string	"pvi: unsupport WF type = %d\n"
+	.zero	3
+.LC9:
 	.string	"pvi : input waveform version 0x%x\n"
 	.zero	5
-.LC9:
+.LC10:
 	.string	"pvi : Unknow waveform version 0x%x, 0x%x, may be wrong waveform file\n"
 	.text
 .Letext0:
@@ -1536,15 +1938,15 @@ spi_id_buffer.16947:
 	.file 96 "drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x6856
+	.4byte	0x6b3e
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF1513
+	.4byte	.LASF1518
 	.byte	0x1
-	.4byte	.LASF1514
-	.4byte	.LASF1515
+	.4byte	.LASF1519
+	.4byte	.LASF1520
 	.8byte	.Ltext0
 	.8byte	.Letext0-.Ltext0
 	.4byte	.Ldebug_line0
@@ -10014,7 +10416,7 @@ spi_id_buffer.16947:
 	.2byte	0x510
 	.4byte	0x461c
 	.uleb128 0x40
-	.4byte	.LASF1516
+	.4byte	.LASF1521
 	.byte	0x21
 	.2byte	0x510
 	.4byte	0x6c
@@ -13278,138 +13680,138 @@ spi_id_buffer.16947:
 	.4byte	.LASF1447
 	.byte	0x30
 	.byte	0x1
-	.byte	0xf
+	.byte	0xd
 	.4byte	0x61cd
 	.uleb128 0xe
 	.4byte	.LASF1448
 	.byte	0x1
-	.byte	0x10
+	.byte	0xe
 	.4byte	0x120
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF1449
 	.byte	0x1
-	.byte	0x11
+	.byte	0xf
 	.4byte	0x120
 	.byte	0x4
 	.uleb128 0xe
 	.4byte	.LASF1450
 	.byte	0x1
-	.byte	0x12
+	.byte	0x10
 	.4byte	0x120
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF1451
 	.byte	0x1
-	.byte	0x13
+	.byte	0x11
 	.4byte	0x100
 	.byte	0xc
 	.uleb128 0xe
 	.4byte	.LASF1452
 	.byte	0x1
-	.byte	0x14
+	.byte	0x12
 	.4byte	0x100
 	.byte	0xd
 	.uleb128 0xe
 	.4byte	.LASF1453
 	.byte	0x1
-	.byte	0x15
+	.byte	0x13
 	.4byte	0x10a
 	.byte	0xe
 	.uleb128 0xe
 	.4byte	.LASF1454
 	.byte	0x1
-	.byte	0x16
+	.byte	0x14
 	.4byte	0x100
 	.byte	0x10
 	.uleb128 0xe
 	.4byte	.LASF1455
 	.byte	0x1
-	.byte	0x17
+	.byte	0x15
 	.4byte	0x100
 	.byte	0x11
 	.uleb128 0xe
 	.4byte	.LASF1456
 	.byte	0x1
-	.byte	0x18
+	.byte	0x16
 	.4byte	0x100
 	.byte	0x12
 	.uleb128 0xe
 	.4byte	.LASF1457
 	.byte	0x1
-	.byte	0x19
+	.byte	0x17
 	.4byte	0x100
 	.byte	0x13
 	.uleb128 0xe
 	.4byte	.LASF1458
 	.byte	0x1
-	.byte	0x1a
+	.byte	0x18
 	.4byte	0x100
 	.byte	0x14
 	.uleb128 0xe
 	.4byte	.LASF1459
 	.byte	0x1
-	.byte	0x1b
+	.byte	0x19
 	.4byte	0x100
 	.byte	0x15
 	.uleb128 0xe
 	.4byte	.LASF1460
 	.byte	0x1
-	.byte	0x1c
+	.byte	0x1a
 	.4byte	0x100
 	.byte	0x16
 	.uleb128 0xe
 	.4byte	.LASF1461
 	.byte	0x1
-	.byte	0x1d
+	.byte	0x1b
 	.4byte	0x100
 	.byte	0x17
 	.uleb128 0xe
 	.4byte	.LASF1462
 	.byte	0x1
-	.byte	0x1e
+	.byte	0x1c
 	.4byte	0x120
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF1463
 	.byte	0x1
-	.byte	0x1f
+	.byte	0x1d
 	.4byte	0x100
 	.byte	0x1c
 	.uleb128 0xe
 	.4byte	.LASF1464
 	.byte	0x1
-	.byte	0x20
+	.byte	0x1e
 	.4byte	0x81e
 	.byte	0x1d
 	.uleb128 0x12
 	.string	"sc1"
 	.byte	0x1
-	.byte	0x21
+	.byte	0x1f
 	.4byte	0x100
 	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF1465
 	.byte	0x1
-	.byte	0x22
+	.byte	0x20
 	.4byte	0x61cd
 	.byte	0x21
 	.uleb128 0xe
 	.4byte	.LASF1466
 	.byte	0x1
-	.byte	0x23
+	.byte	0x21
 	.4byte	0x100
 	.byte	0x25
 	.uleb128 0xe
 	.4byte	.LASF1467
 	.byte	0x1
-	.byte	0x24
+	.byte	0x22
 	.4byte	0x100
 	.byte	0x26
 	.uleb128 0xe
 	.4byte	.LASF1468
 	.byte	0x1
-	.byte	0x25
+	.byte	0x23
 	.4byte	0x61dd
 	.byte	0x27
 	.byte	0
@@ -13430,7 +13832,7 @@ spi_id_buffer.16947:
 	.uleb128 0x45
 	.4byte	.LASF1469
 	.byte	0x1
-	.byte	0x30
+	.byte	0x2f
 	.4byte	0x60b2
 	.uleb128 0x9
 	.byte	0x3
@@ -13438,8 +13840,16 @@ spi_id_buffer.16947:
 	.uleb128 0x45
 	.4byte	.LASF1470
 	.byte	0x1
-	.byte	0x3c
-	.4byte	0x6217
+	.byte	0x30
+	.4byte	0xbb
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	maxpic
+	.uleb128 0x45
+	.4byte	.LASF1471
+	.byte	0x1
+	.byte	0x31
+	.4byte	0x622c
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	global_waveform
@@ -13447,592 +13857,873 @@ spi_id_buffer.16947:
 	.byte	0x8
 	.4byte	0x60b8
 	.uleb128 0x46
-	.4byte	.LASF1473
+	.4byte	.LASF1474
 	.byte	0x1
-	.2byte	0x40a
+	.2byte	0x2ad
 	.4byte	0x55
-	.8byte	.LFB1555
-	.8byte	.LFE1555-.LFB1555
+	.8byte	.LFB1559
+	.8byte	.LFE1559-.LFB1559
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x626e
+	.4byte	0x6283
 	.uleb128 0x47
-	.4byte	.LASF1471
+	.4byte	.LASF1472
 	.byte	0x1
-	.2byte	0x40c
+	.2byte	0x2af
 	.4byte	0x55
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x47
-	.4byte	.LASF1472
+	.4byte	.LASF1473
 	.byte	0x1
-	.2byte	0x40d
-	.4byte	0x626e
+	.2byte	0x2b0
+	.4byte	0x6283
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	spi_id_buffer.16947
+	.8byte	spi_id_buffer.16995
 	.uleb128 0x48
 	.string	"i"
 	.byte	0x1
-	.2byte	0x40e
+	.2byte	0x2b1
 	.4byte	0xbb
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x60
-	.4byte	0x627e
+	.4byte	0x6293
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x1f
 	.byte	0
 	.uleb128 0x46
-	.4byte	.LASF1474
+	.4byte	.LASF1475
 	.byte	0x1
-	.2byte	0x3e4
+	.2byte	0x286
 	.4byte	0xbb
-	.8byte	.LFB1554
-	.8byte	.LFE1554-.LFB1554
+	.8byte	.LFB1558
+	.8byte	.LFE1558-.LFB1558
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x62d7
+	.4byte	0x62ec
 	.uleb128 0x49
-	.4byte	.LASF1477
+	.4byte	.LASF1478
 	.byte	0x1
-	.2byte	0x3e4
+	.2byte	0x286
 	.4byte	0x45b
-	.4byte	.LLST20
+	.4byte	.LLST28
 	.uleb128 0x4a
-	.4byte	.LASF1475
+	.4byte	.LASF1476
 	.byte	0x1
-	.2byte	0x3e6
-	.4byte	0x6217
+	.2byte	0x288
+	.4byte	0x622c
 	.uleb128 0x4b
-	.8byte	.LVL97
-	.4byte	0x684e
+	.8byte	.LVL131
+	.4byte	0x6b36
 	.uleb128 0x4b
-	.8byte	.LVL98
-	.4byte	0x684e
+	.8byte	.LVL132
+	.4byte	0x6b36
 	.byte	0
 	.uleb128 0x46
-	.4byte	.LASF1476
+	.4byte	.LASF1477
 	.byte	0x1
-	.2byte	0x3ac
+	.2byte	0x248
 	.4byte	0xbb
-	.8byte	.LFB1553
-	.8byte	.LFE1553-.LFB1553
+	.8byte	.LFB1557
+	.8byte	.LFE1557-.LFB1557
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6491
+	.4byte	0x65ca
 	.uleb128 0x49
-	.4byte	.LASF1478
+	.4byte	.LASF1479
 	.byte	0x1
-	.2byte	0x3ac
-	.4byte	0x6491
-	.4byte	.LLST10
+	.2byte	0x248
+	.4byte	0x65ca
+	.4byte	.LLST14
 	.uleb128 0x49
-	.4byte	.LASF1479
+	.4byte	.LASF1480
 	.byte	0x1
-	.2byte	0x3ac
+	.2byte	0x248
 	.4byte	0x5fdb
-	.4byte	.LLST11
+	.4byte	.LLST15
 	.uleb128 0x49
-	.4byte	.LASF1480
+	.4byte	.LASF1481
 	.byte	0x1
-	.2byte	0x3ac
+	.2byte	0x248
 	.4byte	0xbb
-	.4byte	.LLST12
+	.4byte	.LLST16
+	.uleb128 0x49
+	.4byte	.LASF1482
+	.byte	0x1
+	.2byte	0x248
+	.4byte	0xbb
+	.4byte	.LLST17
 	.uleb128 0x47
-	.4byte	.LASF1481
+	.4byte	.LASF1483
 	.byte	0x1
-	.2byte	0x3ae
+	.2byte	0x24a
 	.4byte	0x5fdb
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	stype.16911
+	.8byte	stype.16958
 	.uleb128 0x47
-	.4byte	.LASF1482
+	.4byte	.LASF1484
 	.byte	0x1
-	.2byte	0x3af
+	.2byte	0x24b
 	.4byte	0xbb
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	sftemp.16912
+	.8byte	sftemp.16959
 	.uleb128 0x4a
-	.4byte	.LASF1483
+	.4byte	.LASF1485
 	.byte	0x1
-	.2byte	0x3b0
+	.2byte	0x24c
 	.4byte	0xbb
 	.uleb128 0x48
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x3b1
+	.2byte	0x24d
+	.4byte	0xbb
+	.uleb128 0x48
+	.string	"pic"
+	.byte	0x1
+	.2byte	0x24e
 	.4byte	0xbb
 	.uleb128 0x4c
-	.4byte	0x665a
-	.8byte	.LBB22
+	.4byte	0x68ae
+	.8byte	.LBB28
 	.4byte	.Ldebug_ranges0+0x60
 	.byte	0x1
-	.2byte	0x3c1
-	.4byte	0x63ad
+	.2byte	0x264
+	.4byte	0x63de
 	.uleb128 0x4d
-	.4byte	0x666b
+	.4byte	0x68bf
 	.uleb128 0x4e
 	.4byte	.Ldebug_ranges0+0x60
 	.uleb128 0x4f
-	.4byte	0x6677
+	.4byte	0x68cb
 	.uleb128 0x50
-	.4byte	0x6683
-	.4byte	.LLST13
+	.4byte	0x68d7
+	.4byte	.LLST18
 	.uleb128 0x50
-	.4byte	0x668f
-	.4byte	.LLST14
+	.4byte	0x68e3
+	.4byte	.LLST19
 	.uleb128 0x4f
-	.4byte	0x669b
+	.4byte	0x68ef
 	.byte	0
 	.byte	0
 	.uleb128 0x4c
-	.4byte	0x6497
-	.8byte	.LBB28
-	.4byte	.Ldebug_ranges0+0xb0
+	.4byte	0x65d0
+	.8byte	.LBB33
+	.4byte	.Ldebug_ranges0+0xa0
 	.byte	0x1
-	.2byte	0x3d2
-	.4byte	0x6483
+	.2byte	0x274
+	.4byte	0x65af
+	.uleb128 0x4d
+	.4byte	0x65e1
 	.uleb128 0x4d
-	.4byte	0x64a8
+	.4byte	0x65e1
 	.uleb128 0x4d
-	.4byte	0x64c0
+	.4byte	0x6605
 	.uleb128 0x4d
-	.4byte	0x64b4
+	.4byte	0x65f9
+	.uleb128 0x4d
+	.4byte	0x65ed
 	.uleb128 0x4e
-	.4byte	.Ldebug_ranges0+0xb0
+	.4byte	.Ldebug_ranges0+0xa0
 	.uleb128 0x4f
-	.4byte	0x64cc
+	.4byte	0x6611
 	.uleb128 0x50
-	.4byte	0x64d8
-	.4byte	.LLST15
+	.4byte	0x661d
+	.4byte	.LLST20
 	.uleb128 0x50
-	.4byte	0x64e4
-	.4byte	.LLST16
+	.4byte	0x6629
+	.4byte	.LLST21
+	.uleb128 0x4c
+	.4byte	0x6636
+	.8byte	.LBB35
+	.4byte	.Ldebug_ranges0+0x100
+	.byte	0x1
+	.2byte	0x240
+	.4byte	0x6493
+	.uleb128 0x4d
+	.4byte	0x664f
+	.uleb128 0x4d
+	.4byte	0x6643
+	.uleb128 0x4e
+	.4byte	.Ldebug_ranges0+0x100
 	.uleb128 0x50
-	.4byte	0x64ee
-	.4byte	.LLST17
+	.4byte	0x665b
+	.4byte	.LLST22
 	.uleb128 0x50
-	.4byte	0x64f8
-	.4byte	.LLST18
+	.4byte	0x6665
+	.4byte	.LLST23
 	.uleb128 0x50
-	.4byte	0x6504
-	.4byte	.LLST19
-	.uleb128 0x51
-	.4byte	.Ldebug_ranges0+0x110
-	.4byte	0x6433
+	.4byte	0x6671
+	.4byte	.LLST24
+	.uleb128 0x4e
+	.4byte	.Ldebug_ranges0+0x130
 	.uleb128 0x4f
-	.4byte	0x6511
+	.4byte	0x667e
 	.uleb128 0x4f
-	.4byte	0x651d
+	.4byte	0x668a
 	.uleb128 0x4f
-	.4byte	0x6529
+	.4byte	0x6696
 	.uleb128 0x4f
-	.4byte	0x6535
+	.4byte	0x66a2
 	.uleb128 0x4f
-	.4byte	0x6541
+	.4byte	0x66ae
 	.uleb128 0x4f
-	.4byte	0x654d
+	.4byte	0x66ba
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4c
+	.4byte	0x66c8
+	.8byte	.LBB40
+	.4byte	.Ldebug_ranges0+0x160
+	.byte	0x1
+	.2byte	0x23e
+	.4byte	0x64e8
+	.uleb128 0x4d
+	.4byte	0x66e1
+	.uleb128 0x4d
+	.4byte	0x66d5
+	.uleb128 0x4e
+	.4byte	.Ldebug_ranges0+0x160
+	.uleb128 0x50
+	.4byte	0x66ed
+	.4byte	.LLST25
+	.uleb128 0x50
+	.4byte	0x66f7
+	.4byte	.LLST26
+	.uleb128 0x4f
+	.4byte	0x6703
+	.uleb128 0x4e
+	.4byte	.Ldebug_ranges0+0x1a0
+	.uleb128 0x4f
+	.4byte	0x6710
+	.uleb128 0x4f
+	.4byte	0x671c
+	.uleb128 0x4f
+	.4byte	0x6728
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4c
+	.4byte	0x6736
+	.8byte	.LBB49
+	.4byte	.Ldebug_ranges0+0x1d0
+	.byte	0x1
+	.2byte	0x22d
+	.4byte	0x655f
+	.uleb128 0x4d
+	.4byte	0x6753
+	.uleb128 0x4d
+	.4byte	0x6747
+	.uleb128 0x4e
+	.4byte	.Ldebug_ranges0+0x1d0
+	.uleb128 0x50
+	.4byte	0x675f
+	.4byte	.LLST27
+	.uleb128 0x4f
+	.4byte	0x676b
+	.uleb128 0x4f
+	.4byte	0x6777
+	.uleb128 0x4f
+	.4byte	0x6783
+	.uleb128 0x4f
+	.4byte	0x678f
+	.uleb128 0x4f
+	.4byte	0x679b
+	.uleb128 0x4f
+	.4byte	0x67a7
+	.uleb128 0x4b
+	.8byte	.LVL109
+	.4byte	0x6b36
+	.uleb128 0x4b
+	.8byte	.LVL113
+	.4byte	0x69ee
+	.uleb128 0x4b
+	.8byte	.LVL121
+	.4byte	0x6b36
+	.byte	0
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL64
-	.4byte	0x66a6
+	.8byte	.LVL78
+	.4byte	0x68fa
 	.uleb128 0x4b
-	.8byte	.LVL65
-	.4byte	0x655b
+	.8byte	.LVL79
+	.4byte	0x67d0
 	.uleb128 0x4b
-	.8byte	.LVL81
-	.4byte	0x684e
+	.8byte	.LVL101
+	.4byte	0x68fa
 	.uleb128 0x4b
-	.8byte	.LVL84
-	.4byte	0x66a6
+	.8byte	.LVL102
+	.4byte	0x67d0
 	.uleb128 0x4b
-	.8byte	.LVL85
-	.4byte	0x655b
+	.8byte	.LVL104
+	.4byte	0x6b36
 	.uleb128 0x4b
-	.8byte	.LVL87
-	.4byte	0x684e
+	.8byte	.LVL110
+	.4byte	0x6b36
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL91
-	.4byte	0x684e
+	.8byte	.LVL116
+	.4byte	0x6b36
+	.uleb128 0x4b
+	.8byte	.LVL123
+	.4byte	0x6b36
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x6081
-	.uleb128 0x52
-	.4byte	.LASF1499
+	.uleb128 0x51
+	.4byte	.LASF1498
 	.byte	0x1
-	.2byte	0x37f
+	.2byte	0x225
 	.4byte	0xbb
 	.byte	0x1
-	.4byte	0x655b
-	.uleb128 0x53
-	.4byte	.LASF1478
+	.4byte	0x6636
+	.uleb128 0x52
+	.4byte	.LASF1479
 	.byte	0x1
-	.2byte	0x37f
-	.4byte	0x6491
-	.uleb128 0x53
-	.4byte	.LASF1483
+	.2byte	0x225
+	.4byte	0x65ca
+	.uleb128 0x52
+	.4byte	.LASF1485
 	.byte	0x1
-	.2byte	0x37f
+	.2byte	0x225
 	.4byte	0xbb
-	.uleb128 0x53
+	.uleb128 0x52
 	.4byte	.LASF150
 	.byte	0x1
-	.2byte	0x37f
+	.2byte	0x225
 	.4byte	0x5fdb
+	.uleb128 0x52
+	.4byte	.LASF1482
+	.byte	0x1
+	.2byte	0x225
+	.4byte	0xbb
 	.uleb128 0x4a
-	.4byte	.LASF1484
+	.4byte	.LASF1486
 	.byte	0x1
-	.2byte	0x381
+	.2byte	0x227
 	.4byte	0xbb
 	.uleb128 0x4a
 	.4byte	.LASF1445
 	.byte	0x1
-	.2byte	0x382
+	.2byte	0x228
 	.4byte	0xbb
-	.uleb128 0x48
-	.string	"i"
+	.uleb128 0x4a
+	.4byte	.LASF1487
 	.byte	0x1
-	.2byte	0x383
+	.2byte	0x229
+	.4byte	0xbb
+	.byte	0
+	.uleb128 0x53
+	.4byte	.LASF1496
+	.byte	0x1
+	.2byte	0x206
+	.byte	0x1
+	.4byte	0x66c8
+	.uleb128 0x52
+	.4byte	.LASF1446
+	.byte	0x1
+	.2byte	0x206
+	.4byte	0x60b2
+	.uleb128 0x52
+	.4byte	.LASF1445
+	.byte	0x1
+	.2byte	0x206
 	.4byte	0xbb
 	.uleb128 0x48
-	.string	"j"
+	.string	"i"
 	.byte	0x1
-	.2byte	0x383
+	.2byte	0x208
 	.4byte	0xbb
 	.uleb128 0x4a
-	.4byte	.LASF1485
+	.4byte	.LASF1488
 	.byte	0x1
-	.2byte	0x383
-	.4byte	0xbb
+	.2byte	0x209
+	.4byte	0x10a
 	.uleb128 0x4a
-	.4byte	.LASF1486
+	.4byte	.LASF1489
 	.byte	0x1
-	.2byte	0x384
-	.4byte	0xbb
+	.2byte	0x209
+	.4byte	0x10a
 	.uleb128 0x54
 	.uleb128 0x4a
-	.4byte	.LASF1487
+	.4byte	.LASF1490
 	.byte	0x1
-	.2byte	0x398
+	.2byte	0x20e
+	.4byte	0x10a
+	.uleb128 0x4a
+	.4byte	.LASF1491
+	.byte	0x1
+	.2byte	0x20f
+	.4byte	0x10a
+	.uleb128 0x4a
+	.4byte	.LASF1492
+	.byte	0x1
+	.2byte	0x210
+	.4byte	0x10a
+	.uleb128 0x4a
+	.4byte	.LASF1493
+	.byte	0x1
+	.2byte	0x211
+	.4byte	0x10a
+	.uleb128 0x4a
+	.4byte	.LASF1494
+	.byte	0x1
+	.2byte	0x212
 	.4byte	0x100
 	.uleb128 0x4a
-	.4byte	.LASF1488
+	.4byte	.LASF1495
 	.byte	0x1
-	.2byte	0x398
+	.2byte	0x213
 	.4byte	0x100
+	.byte	0
+	.byte	0
+	.uleb128 0x53
+	.4byte	.LASF1497
+	.byte	0x1
+	.2byte	0x1ea
+	.byte	0x1
+	.4byte	0x6736
+	.uleb128 0x52
+	.4byte	.LASF1446
+	.byte	0x1
+	.2byte	0x1ea
+	.4byte	0x60b2
+	.uleb128 0x52
+	.4byte	.LASF1445
+	.byte	0x1
+	.2byte	0x1ea
+	.4byte	0xbb
+	.uleb128 0x48
+	.string	"i"
+	.byte	0x1
+	.2byte	0x1ec
+	.4byte	0xbb
+	.uleb128 0x4a
+	.4byte	.LASF1488
+	.byte	0x1
+	.2byte	0x1ed
+	.4byte	0x10a
 	.uleb128 0x4a
 	.4byte	.LASF1489
 	.byte	0x1
-	.2byte	0x399
+	.2byte	0x1ed
 	.4byte	0x10a
+	.uleb128 0x54
 	.uleb128 0x4a
 	.4byte	.LASF1490
 	.byte	0x1
-	.2byte	0x39a
+	.2byte	0x1f2
 	.4byte	0x10a
 	.uleb128 0x4a
 	.4byte	.LASF1491
 	.byte	0x1
-	.2byte	0x39b
+	.2byte	0x1f3
 	.4byte	0x10a
 	.uleb128 0x4a
-	.4byte	.LASF1492
+	.4byte	.LASF1494
 	.byte	0x1
-	.2byte	0x39c
-	.4byte	0x10a
+	.2byte	0x1f4
+	.4byte	0x100
 	.byte	0
 	.byte	0
-	.uleb128 0x55
+	.uleb128 0x51
+	.4byte	.LASF1499
+	.byte	0x1
+	.2byte	0x1c6
+	.4byte	0xbb
+	.byte	0x1
+	.4byte	0x67b5
+	.uleb128 0x52
+	.4byte	.LASF824
+	.byte	0x1
+	.2byte	0x1c6
+	.4byte	0xbb
+	.uleb128 0x52
+	.4byte	.LASF1485
+	.byte	0x1
+	.2byte	0x1c6
+	.4byte	0xbb
+	.uleb128 0x4a
+	.4byte	.LASF1472
+	.byte	0x1
+	.2byte	0x1c8
+	.4byte	0x67b5
+	.uleb128 0x4a
+	.4byte	.LASF1500
+	.byte	0x1
+	.2byte	0x1c9
+	.4byte	0x6c
+	.uleb128 0x4a
+	.4byte	.LASF1501
+	.byte	0x1
+	.2byte	0x1c9
+	.4byte	0x6c
+	.uleb128 0x4a
 	.4byte	.LASF1502
 	.byte	0x1
-	.2byte	0x1c1
+	.2byte	0x1c9
+	.4byte	0x6c
+	.uleb128 0x4a
+	.4byte	.LASF1503
+	.byte	0x1
+	.2byte	0x1c9
+	.4byte	0x6c
+	.uleb128 0x4a
+	.4byte	.LASF503
+	.byte	0x1
+	.2byte	0x1ca
 	.4byte	0xbb
-	.8byte	.LFB1551
-	.8byte	.LFE1551-.LFB1551
+	.uleb128 0x55
+	.4byte	.LASF1504
+	.4byte	0x67cb
+	.4byte	.LASF1499
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x90
+	.uleb128 0x5
+	.4byte	0x67
+	.4byte	0x67cb
+	.uleb128 0x6
+	.4byte	0x4e
+	.byte	0x11
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x67bb
+	.uleb128 0x56
+	.4byte	.LASF1507
+	.byte	0x1
+	.2byte	0x1a2
+	.4byte	0xbb
+	.8byte	.LFB1552
+	.8byte	.LFE1552-.LFB1552
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x663f
+	.4byte	0x6899
 	.uleb128 0x49
 	.4byte	.LASF824
 	.byte	0x1
-	.2byte	0x1c1
+	.2byte	0x1a2
 	.4byte	0xbb
-	.4byte	.LLST7
+	.4byte	.LLST6
 	.uleb128 0x49
-	.4byte	.LASF1483
+	.4byte	.LASF1485
 	.byte	0x1
-	.2byte	0x1c1
+	.2byte	0x1a2
 	.4byte	0xbb
-	.4byte	.LLST8
-	.uleb128 0x56
-	.4byte	.LASF1471
+	.4byte	.LLST7
+	.uleb128 0x57
+	.4byte	.LASF1472
 	.byte	0x1
-	.2byte	0x1c3
-	.4byte	0x663f
-	.4byte	.LLST9
+	.2byte	0x1a4
+	.4byte	0x67b5
+	.4byte	.LLST8
 	.uleb128 0x4a
-	.4byte	.LASF1493
+	.4byte	.LASF1500
 	.byte	0x1
-	.2byte	0x1c4
+	.2byte	0x1a5
 	.4byte	0x6c
 	.uleb128 0x4a
-	.4byte	.LASF1494
+	.4byte	.LASF1501
 	.byte	0x1
-	.2byte	0x1c4
+	.2byte	0x1a5
 	.4byte	0x6c
 	.uleb128 0x4a
-	.4byte	.LASF1495
+	.4byte	.LASF1502
 	.byte	0x1
-	.2byte	0x1c4
+	.2byte	0x1a5
 	.4byte	0x6c
 	.uleb128 0x4a
-	.4byte	.LASF1496
-	.byte	0x1
-	.2byte	0x1c4
-	.4byte	0x6c
-	.uleb128 0x47
-	.4byte	.LASF1497
+	.4byte	.LASF1503
 	.byte	0x1
-	.2byte	0x1c5
+	.2byte	0x1a5
 	.4byte	0x6c
-	.uleb128 0x1
-	.byte	0x50
 	.uleb128 0x4a
 	.4byte	.LASF503
 	.byte	0x1
-	.2byte	0x1c6
+	.2byte	0x1a6
 	.4byte	0xbb
-	.uleb128 0x57
-	.4byte	.LASF1498
-	.4byte	0x6655
+	.uleb128 0x58
+	.4byte	.LASF1504
+	.4byte	0x68a9
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.16872
+	.8byte	__func__.16890
 	.uleb128 0x4b
-	.8byte	.LVL48
-	.4byte	0x679d
-	.uleb128 0x4b
-	.8byte	.LVL50
-	.4byte	0x679d
+	.8byte	.LVL43
+	.4byte	0x6a94
 	.uleb128 0x4b
-	.8byte	.LVL53
-	.4byte	0x684e
+	.8byte	.LVL47
+	.4byte	0x6b36
 	.uleb128 0x4b
-	.8byte	.LVL57
-	.4byte	0x684e
+	.8byte	.LVL50
+	.4byte	0x6b36
 	.byte	0
-	.uleb128 0x7
-	.byte	0x8
-	.4byte	0x90
 	.uleb128 0x5
 	.4byte	0x67
-	.4byte	0x6655
+	.4byte	0x68a9
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0xe
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x6645
-	.uleb128 0x52
-	.4byte	.LASF1500
+	.4byte	0x6899
+	.uleb128 0x51
+	.4byte	.LASF1505
 	.byte	0x1
-	.2byte	0x1ad
+	.2byte	0x18e
 	.4byte	0xbb
 	.byte	0x1
-	.4byte	0x66a6
-	.uleb128 0x53
-	.4byte	.LASF1480
+	.4byte	0x68fa
+	.uleb128 0x52
+	.4byte	.LASF1481
 	.byte	0x1
-	.2byte	0x1ad
+	.2byte	0x18e
 	.4byte	0xbb
 	.uleb128 0x4a
-	.4byte	.LASF1471
+	.4byte	.LASF1472
 	.byte	0x1
-	.2byte	0x1af
-	.4byte	0x663f
+	.2byte	0x190
+	.4byte	0x67b5
 	.uleb128 0x4a
-	.4byte	.LASF1501
+	.4byte	.LASF1506
 	.byte	0x1
-	.2byte	0x1b0
+	.2byte	0x191
 	.4byte	0xbb
 	.uleb128 0x4a
 	.4byte	.LASF886
 	.byte	0x1
-	.2byte	0x1b1
+	.2byte	0x192
 	.4byte	0xbb
 	.uleb128 0x48
 	.string	"i"
 	.byte	0x1
-	.2byte	0x1b2
+	.2byte	0x193
 	.4byte	0xbb
 	.byte	0
-	.uleb128 0x55
-	.4byte	.LASF1503
+	.uleb128 0x56
+	.4byte	.LASF1508
 	.byte	0x1
-	.2byte	0x17e
+	.2byte	0x15c
 	.4byte	0xbb
-	.8byte	.LFB1549
-	.8byte	.LFE1549-.LFB1549
+	.8byte	.LFB1550
+	.8byte	.LFE1550-.LFB1550
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6753
+	.4byte	0x69a7
 	.uleb128 0x49
-	.4byte	.LASF1479
+	.4byte	.LASF1480
 	.byte	0x1
-	.2byte	0x17e
+	.2byte	0x15c
 	.4byte	0x5fdb
 	.4byte	.LLST0
-	.uleb128 0x56
-	.4byte	.LASF1471
+	.uleb128 0x57
+	.4byte	.LASF1472
 	.byte	0x1
-	.2byte	0x180
-	.4byte	0x6217
+	.2byte	0x15e
+	.4byte	0x622c
 	.4byte	.LLST1
 	.uleb128 0x4a
-	.4byte	.LASF1504
+	.4byte	.LASF1509
 	.byte	0x1
-	.2byte	0x181
-	.4byte	0x6753
+	.2byte	0x15f
+	.4byte	0x69a7
 	.uleb128 0x4a
 	.4byte	.LASF824
 	.byte	0x1
-	.2byte	0x182
+	.2byte	0x160
 	.4byte	0xbb
 	.uleb128 0x4c
-	.4byte	0x6759
-	.8byte	.LBB7
+	.4byte	0x69ad
+	.8byte	.LBB6
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.2byte	0x184
-	.4byte	0x6745
+	.2byte	0x162
+	.4byte	0x6999
 	.uleb128 0x4d
-	.4byte	0x676a
+	.4byte	0x69bd
 	.uleb128 0x4d
-	.4byte	0x676a
+	.4byte	0x69bd
 	.uleb128 0x4e
 	.4byte	.Ldebug_ranges0+0
-	.uleb128 0x58
-	.4byte	0x6776
+	.uleb128 0x59
+	.4byte	0x69c8
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	pvi_modes.16823
+	.8byte	pvi_modes.16841
 	.uleb128 0x4b
 	.8byte	.LVL18
-	.4byte	0x684e
+	.4byte	0x6b36
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
 	.8byte	.LVL7
-	.4byte	0x684e
+	.4byte	0x6b36
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc2
-	.uleb128 0x52
-	.4byte	.LASF1505
+	.uleb128 0x5a
+	.4byte	.LASF1510
 	.byte	0x1
-	.2byte	0x118
-	.4byte	0x6753
+	.byte	0xf6
+	.4byte	0x69a7
 	.byte	0x1
-	.4byte	0x678d
-	.uleb128 0x53
-	.4byte	.LASF1471
+	.4byte	0x69de
+	.uleb128 0x5b
+	.4byte	.LASF1472
 	.byte	0x1
-	.2byte	0x118
-	.4byte	0x6217
-	.uleb128 0x47
-	.4byte	.LASF1504
+	.byte	0xf6
+	.4byte	0x622c
+	.uleb128 0x45
+	.4byte	.LASF1509
 	.byte	0x1
-	.2byte	0x11a
-	.4byte	0x678d
+	.byte	0xf8
+	.4byte	0x69de
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	pvi_modes.16823
+	.8byte	pvi_modes.16841
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xbb
-	.4byte	0x679d
+	.4byte	0x69ee
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x8
 	.byte	0
-	.uleb128 0x59
-	.4byte	.LASF1506
+	.uleb128 0x5c
+	.4byte	.LASF1511
 	.byte	0x1
-	.byte	0x3f
+	.byte	0xa2
 	.4byte	0xbb
-	.8byte	.LFB1547
-	.8byte	.LFE1547-.LFB1547
+	.8byte	.LFB1548
+	.8byte	.LFE1548-.LFB1548
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x684e
-	.uleb128 0x5a
+	.4byte	0x6a94
+	.uleb128 0x5d
 	.4byte	.LASF741
 	.byte	0x1
-	.byte	0x3f
-	.4byte	0x663f
-	.4byte	.LLST2
-	.uleb128 0x5a
-	.4byte	.LASF1507
-	.byte	0x1
-	.byte	0x3f
-	.4byte	0xbb
-	.4byte	.LLST3
-	.uleb128 0x5b
-	.4byte	.LASF1508
+	.byte	0xa2
+	.4byte	0x67b5
+	.4byte	.LLST9
+	.uleb128 0x5e
+	.4byte	.LASF1512
 	.byte	0x1
-	.byte	0x41
+	.byte	0xa4
 	.4byte	0x6c
-	.uleb128 0x5b
-	.4byte	.LASF1509
+	.uleb128 0x5f
+	.4byte	.LASF1513
 	.byte	0x1
-	.byte	0x41
+	.byte	0xa4
 	.4byte	0x6c
-	.uleb128 0x5c
-	.4byte	.LASF1510
+	.4byte	.LLST10
+	.uleb128 0x5f
+	.4byte	.LASF1514
 	.byte	0x1
-	.byte	0x42
+	.byte	0xa5
 	.4byte	0x6c
-	.4byte	.LLST4
-	.uleb128 0x5b
+	.4byte	.LLST11
+	.uleb128 0x5e
 	.4byte	.LASF503
 	.byte	0x1
-	.byte	0x43
+	.byte	0xa6
 	.4byte	0x6c
-	.uleb128 0x5c
-	.4byte	.LASF1511
+	.uleb128 0x5e
+	.4byte	.LASF1515
 	.byte	0x1
-	.byte	0x44
+	.byte	0xa7
 	.4byte	0x90
-	.4byte	.LLST5
-	.uleb128 0x5d
+	.uleb128 0x60
 	.string	"i"
 	.byte	0x1
-	.byte	0x45
+	.byte	0xa8
 	.4byte	0x90
+	.4byte	.LLST12
+	.uleb128 0x5f
+	.4byte	.LASF1516
+	.byte	0x1
+	.byte	0xa9
+	.4byte	0x247
+	.4byte	.LLST13
+	.uleb128 0x4b
+	.8byte	.LVL63
+	.4byte	0x6b36
+	.uleb128 0x4b
+	.8byte	.LVL70
+	.4byte	0x6b36
+	.byte	0
 	.uleb128 0x5c
+	.4byte	.LASF1517
+	.byte	0x1
+	.byte	0x42
+	.4byte	0xbb
+	.8byte	.LFB1547
+	.8byte	.LFE1547-.LFB1547
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x6b36
+	.uleb128 0x5d
+	.4byte	.LASF741
+	.byte	0x1
+	.byte	0x42
+	.4byte	0x67b5
+	.4byte	.LLST2
+	.uleb128 0x5e
 	.4byte	.LASF1512
 	.byte	0x1
+	.byte	0x44
+	.4byte	0x6c
+	.uleb128 0x5e
+	.4byte	.LASF1513
+	.byte	0x1
+	.byte	0x44
+	.4byte	0x6c
+	.uleb128 0x5f
+	.4byte	.LASF1514
+	.byte	0x1
+	.byte	0x45
+	.4byte	0x6c
+	.4byte	.LLST3
+	.uleb128 0x5e
+	.4byte	.LASF503
+	.byte	0x1
 	.byte	0x46
+	.4byte	0x6c
+	.uleb128 0x5f
+	.4byte	.LASF1515
+	.byte	0x1
+	.byte	0x47
+	.4byte	0x90
+	.4byte	.LLST4
+	.uleb128 0x61
+	.string	"i"
+	.byte	0x1
+	.byte	0x48
+	.4byte	0x90
+	.uleb128 0x5f
+	.4byte	.LASF1516
+	.byte	0x1
+	.byte	0x49
 	.4byte	0x247
-	.4byte	.LLST6
+	.4byte	.LLST5
 	.uleb128 0x4b
 	.8byte	.LVL27
-	.4byte	0x684e
+	.4byte	0x6b36
 	.uleb128 0x4b
-	.8byte	.LVL43
-	.4byte	0x684e
+	.8byte	.LVL38
+	.4byte	0x6b36
 	.byte	0
-	.uleb128 0x5e
-	.4byte	.LASF1517
-	.4byte	.LASF1517
+	.uleb128 0x62
+	.4byte	.LASF1522
+	.4byte	.LASF1522
 	.byte	0xd
 	.byte	0xb0
 	.byte	0
@@ -15049,15 +15740,6 @@ spi_id_buffer.16947:
 	.byte	0
 	.byte	0
 	.uleb128 0x51
-	.uleb128 0xb
-	.byte	0x1
-	.uleb128 0x55
-	.uleb128 0x17
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x52
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -15076,7 +15758,7 @@ spi_id_buffer.16947:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x53
+	.uleb128 0x52
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -15089,12 +15771,42 @@ spi_id_buffer.16947:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
+	.uleb128 0x53
+	.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 0x54
 	.uleb128 0xb
 	.byte	0x1
 	.byte	0
 	.byte	0
 	.uleb128 0x55
+	.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 0x56
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -15119,7 +15831,7 @@ spi_id_buffer.16947:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x56
+	.uleb128 0x57
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -15134,7 +15846,7 @@ spi_id_buffer.16947:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x57
+	.uleb128 0x58
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -15147,16 +15859,48 @@ spi_id_buffer.16947:
 	.uleb128 0x18
 	.byte	0
 	.byte	0
-	.uleb128 0x58
+	.uleb128 0x59
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x31
 	.uleb128 0x13
-	.uleb128 0x2
-	.uleb128 0x18
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x5a
+	.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 0x5b
+	.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 0x59
+	.uleb128 0x5c
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3f
@@ -15183,7 +15927,7 @@ spi_id_buffer.16947:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
+	.uleb128 0x5d
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -15198,7 +15942,7 @@ spi_id_buffer.16947:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
+	.uleb128 0x5e
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -15211,7 +15955,7 @@ spi_id_buffer.16947:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
+	.uleb128 0x5f
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -15226,7 +15970,7 @@ spi_id_buffer.16947:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x5d
+	.uleb128 0x60
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -15237,9 +15981,24 @@ spi_id_buffer.16947:
 	.uleb128 0xb
 	.uleb128 0x49
 	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x5e
+	.uleb128 0x61
+	.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 0x62
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -15259,248 +16018,328 @@ spi_id_buffer.16947:
 	.byte	0
 	.section	.debug_loc,"",@progbits
 .Ldebug_loc0:
-.LLST20:
-	.8byte	.LVL92-.Ltext0
-	.8byte	.LVL93-.Ltext0
+.LLST28:
+	.8byte	.LVL126-.Ltext0
+	.8byte	.LVL127-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL93-.Ltext0
-	.8byte	.LVL94-.Ltext0
+	.8byte	.LVL127-.Ltext0
+	.8byte	.LVL128-.Ltext0
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL95-.Ltext0
-	.8byte	.LVL96-.Ltext0
+	.8byte	.LVL129-.Ltext0
+	.8byte	.LVL130-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL96-.Ltext0
-	.8byte	.LFE1554-.Ltext0
+	.8byte	.LVL130-.Ltext0
+	.8byte	.LFE1558-.Ltext0
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST10:
-	.8byte	.LVL58-.Ltext0
-	.8byte	.LVL61-.Ltext0
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL61-.Ltext0
-	.8byte	.LVL71-.Ltext0
-	.2byte	0x1
-	.byte	0x64
+.LLST14:
 	.8byte	.LVL71-.Ltext0
 	.8byte	.LVL72-.Ltext0
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL72-.Ltext0
-	.8byte	.LVL73-.Ltext0
+	.8byte	.LVL90-.Ltext0
 	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL75-.Ltext0
-	.8byte	.LVL78-.Ltext0
+	.byte	0x63
+	.8byte	.LVL90-.Ltext0
+	.8byte	.LVL91-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL79-.Ltext0
-	.8byte	.LFE1553-.Ltext0
-	.2byte	0x1
-	.byte	0x64
-	.8byte	0
-	.8byte	0
-.LLST11:
-	.8byte	.LVL58-.Ltext0
-	.8byte	.LVL63-.Ltext0
+	.8byte	.LVL91-.Ltext0
+	.8byte	.LVL92-.Ltext0
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL63-.Ltext0
-	.8byte	.LVL71-.Ltext0
+	.byte	0x63
+	.8byte	.LVL95-.Ltext0
+	.8byte	.LVL124-.Ltext0
 	.2byte	0x1
 	.byte	0x63
+	.8byte	.LVL124-.Ltext0
+	.8byte	.LVL125-.Ltext0
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST15:
 	.8byte	.LVL71-.Ltext0
-	.8byte	.LVL72-.Ltext0
+	.8byte	.LVL95-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL72-.Ltext0
-	.8byte	.LVL73-.Ltext0
+	.8byte	.LVL95-.Ltext0
+	.8byte	.LVL124-.Ltext0
 	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL73-.Ltext0
-	.8byte	.LVL79-.Ltext0
+	.byte	0x64
+	.8byte	.LVL124-.Ltext0
+	.8byte	.LFE1557-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL79-.Ltext0
-	.8byte	.LFE1553-.Ltext0
-	.2byte	0x1
-	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST12:
-	.8byte	.LVL58-.Ltext0
-	.8byte	.LVL62-.Ltext0
+.LLST16:
+	.8byte	.LVL71-.Ltext0
+	.8byte	.LVL74-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL74-.Ltext0
+	.8byte	.LVL78-1-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL89-.Ltext0
+	.8byte	.LVL90-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL90-.Ltext0
+	.8byte	.LVL95-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL70-.Ltext0
-	.8byte	.LVL79-.Ltext0
+	.8byte	.LVL115-.Ltext0
+	.8byte	.LVL116-1-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL117-.Ltext0
+	.8byte	.LVL119-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL122-.Ltext0
+	.8byte	.LVL123-1-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL124-.Ltext0
+	.8byte	.LFE1557-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST13:
-	.8byte	.LVL59-.Ltext0
-	.8byte	.LVL64-1-.Ltext0
+.LLST17:
+	.8byte	.LVL71-.Ltext0
+	.8byte	.LVL73-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL73-.Ltext0
+	.8byte	.LVL90-.Ltext0
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL90-.Ltext0
+	.8byte	.LVL95-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL95-.Ltext0
+	.8byte	.LVL124-.Ltext0
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL124-.Ltext0
+	.8byte	.LFE1557-.Ltext0
 	.2byte	0x1
 	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST18:
 	.8byte	.LVL75-.Ltext0
 	.8byte	.LVL77-.Ltext0
 	.2byte	0x1
-	.byte	0x53
+	.byte	0x51
+	.8byte	.LVL117-.Ltext0
+	.8byte	.LVL119-.Ltext0
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST19:
+	.8byte	.LVL76-.Ltext0
 	.8byte	.LVL90-.Ltext0
-	.8byte	.LVL91-1-.Ltext0
 	.2byte	0x1
-	.byte	0x53
+	.byte	0x69
+	.8byte	.LVL91-.Ltext0
+	.8byte	.LVL94-.Ltext0
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL95-.Ltext0
+	.8byte	.LVL117-.Ltext0
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL118-.Ltext0
+	.8byte	.LVL122-.Ltext0
+	.2byte	0x1
+	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST14:
-	.8byte	.LVL60-.Ltext0
-	.8byte	.LVL67-.Ltext0
+.LLST20:
+	.8byte	.LVL80-.Ltext0
+	.8byte	.LVL90-.Ltext0
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL72-.Ltext0
-	.8byte	.LVL74-.Ltext0
+	.8byte	.LVL91-.Ltext0
+	.8byte	.LVL93-.Ltext0
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL76-.Ltext0
-	.8byte	.LVL77-.Ltext0
+	.8byte	.LVL95-.Ltext0
+	.8byte	.LVL107-.Ltext0
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL79-.Ltext0
-	.8byte	.LVL86-.Ltext0
+	.8byte	.LVL109-.Ltext0
+	.8byte	.LVL111-.Ltext0
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL90-.Ltext0
-	.8byte	.LFE1553-.Ltext0
+	.8byte	.LVL114-.Ltext0
+	.8byte	.LVL115-.Ltext0
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST15:
-	.8byte	.LVL66-.Ltext0
-	.8byte	.LVL71-.Ltext0
+.LLST21:
+	.8byte	.LVL81-.Ltext0
+	.8byte	.LVL90-.Ltext0
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL72-.Ltext0
-	.8byte	.LVL74-.Ltext0
+	.8byte	.LVL91-.Ltext0
+	.8byte	.LVL93-.Ltext0
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL79-.Ltext0
-	.8byte	.LVL80-.Ltext0
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL80-.Ltext0
-	.8byte	.LVL82-.Ltext0
+	.8byte	.LVL95-.Ltext0
+	.8byte	.LVL103-.Ltext0
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL82-.Ltext0
-	.8byte	.LVL83-.Ltext0
+	.8byte	.LVL103-.Ltext0
+	.8byte	.LVL105-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL83-.Ltext0
-	.8byte	.LVL90-.Ltext0
+	.8byte	.LVL105-.Ltext0
+	.8byte	.LVL106-.Ltext0
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST16:
-	.8byte	.LVL69-.Ltext0
-	.8byte	.LVL71-.Ltext0
+.LLST22:
+	.8byte	.LVL82-.Ltext0
+	.8byte	.LVL90-.Ltext0
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL72-.Ltext0
-	.8byte	.LVL75-.Ltext0
+	.byte	0x5c
+	.8byte	.LVL91-.Ltext0
+	.8byte	.LVL95-.Ltext0
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL88-.Ltext0
-	.8byte	.LVL90-.Ltext0
+	.byte	0x5c
+	.8byte	.LVL105-.Ltext0
+	.8byte	.LVL107-.Ltext0
 	.2byte	0x1
-	.byte	0x59
+	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST17:
-	.8byte	.LVL69-.Ltext0
-	.8byte	.LVL71-.Ltext0
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL72-.Ltext0
-	.8byte	.LVL75-.Ltext0
+.LLST23:
+	.8byte	.LVL83-.Ltext0
+	.8byte	.LVL86-.Ltext0
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL88-.Ltext0
+	.byte	0x5a
+	.8byte	.LVL87-.Ltext0
 	.8byte	.LVL90-.Ltext0
 	.2byte	0x1
-	.byte	0x52
+	.byte	0x5a
+	.8byte	.LVL91-.Ltext0
+	.8byte	.LVL95-.Ltext0
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL105-.Ltext0
+	.8byte	.LVL107-.Ltext0
+	.2byte	0x1
+	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST18:
-	.8byte	.LVL68-.Ltext0
-	.8byte	.LVL71-.Ltext0
+.LLST24:
+	.8byte	.LVL84-.Ltext0
+	.8byte	.LVL85-.Ltext0
 	.2byte	0x1
-	.byte	0x5b
-	.8byte	.LVL72-.Ltext0
-	.8byte	.LVL75-.Ltext0
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST25:
+	.8byte	.LVL88-.Ltext0
+	.8byte	.LVL90-.Ltext0
 	.2byte	0x1
-	.byte	0x5b
+	.byte	0x58
+	.8byte	.LVL91-.Ltext0
+	.8byte	.LVL95-.Ltext0
+	.2byte	0x1
+	.byte	0x58
+	.8byte	.LVL96-.Ltext0
+	.8byte	.LVL100-.Ltext0
+	.2byte	0x1
+	.byte	0x58
+	.8byte	.LVL105-.Ltext0
+	.8byte	.LVL107-.Ltext0
+	.2byte	0x1
+	.byte	0x58
+	.8byte	0
+	.8byte	0
+.LLST26:
 	.8byte	.LVL88-.Ltext0
 	.8byte	.LVL90-.Ltext0
 	.2byte	0x1
-	.byte	0x5b
+	.byte	0x57
+	.8byte	.LVL91-.Ltext0
+	.8byte	.LVL95-.Ltext0
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL97-.Ltext0
+	.8byte	.LVL98-.Ltext0
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL99-.Ltext0
+	.8byte	.LVL100-.Ltext0
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL105-.Ltext0
+	.8byte	.LVL107-.Ltext0
+	.2byte	0x1
+	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST19:
-	.8byte	.LVL67-.Ltext0
-	.8byte	.LVL71-.Ltext0
+.LLST27:
+	.8byte	.LVL107-.Ltext0
+	.8byte	.LVL108-.Ltext0
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL72-.Ltext0
-	.8byte	.LVL74-.Ltext0
+	.byte	0x52
+	.8byte	.LVL112-.Ltext0
+	.8byte	.LVL113-1-.Ltext0
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL86-.Ltext0
-	.8byte	.LVL89-.Ltext0
+	.byte	0x52
+	.8byte	.LVL119-.Ltext0
+	.8byte	.LVL120-.Ltext0
 	.2byte	0x1
-	.byte	0x65
+	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST7:
-	.8byte	.LVL44-.Ltext0
-	.8byte	.LVL46-.Ltext0
+.LLST6:
+	.8byte	.LVL39-.Ltext0
+	.8byte	.LVL41-.Ltext0
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST8:
-	.8byte	.LVL44-.Ltext0
-	.8byte	.LVL47-.Ltext0
+.LLST7:
+	.8byte	.LVL39-.Ltext0
+	.8byte	.LVL42-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL54-.Ltext0
-	.8byte	.LVL55-.Ltext0
+	.8byte	.LVL44-.Ltext0
+	.8byte	.LVL45-.Ltext0
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST9:
-	.8byte	.LVL45-.Ltext0
-	.8byte	.LVL48-1-.Ltext0
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL49-.Ltext0
-	.8byte	.LVL50-1-.Ltext0
+.LLST8:
+	.8byte	.LVL40-.Ltext0
+	.8byte	.LVL43-1-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL51-.Ltext0
-	.8byte	.LVL52-.Ltext0
+	.8byte	.LVL44-.Ltext0
+	.8byte	.LVL46-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL54-.Ltext0
-	.8byte	.LVL56-.Ltext0
+	.8byte	.LVL48-.Ltext0
+	.8byte	.LVL49-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
@@ -15519,7 +16358,7 @@ spi_id_buffer.16947:
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL9-.Ltext0
-	.8byte	.LFE1549-.Ltext0
+	.8byte	.LFE1550-.Ltext0
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
@@ -15559,91 +16398,135 @@ spi_id_buffer.16947:
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST2:
-	.8byte	.LVL21-.Ltext0
-	.8byte	.LVL26-.Ltext0
+.LLST9:
+	.8byte	.LVL51-.Ltext0
+	.8byte	.LVL62-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL28-.Ltext0
-	.8byte	.LVL29-.Ltext0
+	.8byte	.LVL63-.Ltext0
+	.8byte	.LVL64-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL32-.Ltext0
-	.8byte	.LVL35-.Ltext0
+	.8byte	.LVL66-.Ltext0
+	.8byte	.LVL69-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL38-.Ltext0
-	.8byte	.LVL39-.Ltext0
+	.8byte	0
+	.8byte	0
+.LLST10:
+	.8byte	.LVL54-.Ltext0
+	.8byte	.LVL63-1-.Ltext0
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL41-.Ltext0
-	.8byte	.LVL42-.Ltext0
+	.byte	0x55
+	.8byte	.LVL63-.Ltext0
+	.8byte	.LVL68-.Ltext0
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST3:
-	.8byte	.LVL21-.Ltext0
-	.8byte	.LVL28-.Ltext0
+.LLST11:
+	.8byte	.LVL53-.Ltext0
+	.8byte	.LVL65-.Ltext0
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL28-.Ltext0
-	.8byte	.LVL31-.Ltext0
+	.byte	0x63
+	.8byte	.LVL66-.Ltext0
+	.8byte	.LVL68-.Ltext0
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL31-.Ltext0
-	.8byte	.LVL32-.Ltext0
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST12:
+	.8byte	.LVL55-.Ltext0
+	.8byte	.LVL56-.Ltext0
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL32-.Ltext0
-	.8byte	.LVL40-.Ltext0
+	.byte	0x53
+	.8byte	.LVL58-.Ltext0
+	.8byte	.LVL59-.Ltext0
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL40-.Ltext0
-	.8byte	.LVL43-1-.Ltext0
+	.byte	0x53
+	.8byte	.LVL60-.Ltext0
+	.8byte	.LVL63-1-.Ltext0
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x53
+	.8byte	.LVL63-.Ltext0
+	.8byte	.LVL66-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL67-.Ltext0
+	.8byte	.LVL68-.Ltext0
+	.2byte	0x1
+	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST4:
-	.8byte	.LVL23-.Ltext0
+.LLST13:
+	.8byte	.LVL52-.Ltext0
+	.8byte	.LVL57-.Ltext0
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL61-.Ltext0
+	.8byte	.LVL63-1-.Ltext0
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL63-.Ltext0
+	.8byte	.LVL68-.Ltext0
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST2:
+	.8byte	.LVL21-.Ltext0
+	.8byte	.LVL26-.Ltext0
+	.2byte	0x1
+	.byte	0x50
 	.8byte	.LVL30-.Ltext0
+	.8byte	.LVL31-.Ltext0
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL36-.Ltext0
+	.8byte	.LVL37-.Ltext0
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST3:
+	.8byte	.LVL23-.Ltext0
+	.8byte	.LVL29-.Ltext0
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL32-.Ltext0
-	.8byte	.LVL38-.Ltext0
+	.8byte	.LVL30-.Ltext0
+	.8byte	.LVL36-.Ltext0
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST5:
+.LLST4:
 	.8byte	.LVL28-.Ltext0
-	.8byte	.LVL32-.Ltext0
+	.8byte	.LVL30-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL33-.Ltext0
-	.8byte	.LVL36-.Ltext0
+	.8byte	.LVL32-.Ltext0
+	.8byte	.LVL34-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL37-.Ltext0
-	.8byte	.LVL38-.Ltext0
+	.8byte	.LVL35-.Ltext0
+	.8byte	.LVL36-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST6:
+.LLST5:
 	.8byte	.LVL22-.Ltext0
 	.8byte	.LVL24-.Ltext0
 	.2byte	0x1
-	.byte	0x57
+	.byte	0x56
 	.8byte	.LVL25-.Ltext0
 	.8byte	.LVL27-1-.Ltext0
 	.2byte	0x1
-	.byte	0x57
+	.byte	0x56
 	.8byte	.LVL28-.Ltext0
-	.8byte	.LVL34-.Ltext0
+	.8byte	.LVL33-.Ltext0
 	.2byte	0x1
-	.byte	0x57
+	.byte	0x56
 	.8byte	0
 	.8byte	0
 	.section	.debug_aranges,"",@progbits
@@ -15660,44 +16543,70 @@ spi_id_buffer.16947:
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
 .Ldebug_ranges0:
-	.8byte	.LBB7-.Ltext0
-	.8byte	.LBE7-.Ltext0
+	.8byte	.LBB6-.Ltext0
+	.8byte	.LBE6-.Ltext0
+	.8byte	.LBB12-.Ltext0
+	.8byte	.LBE12-.Ltext0
 	.8byte	.LBB13-.Ltext0
 	.8byte	.LBE13-.Ltext0
 	.8byte	.LBB14-.Ltext0
 	.8byte	.LBE14-.Ltext0
 	.8byte	.LBB15-.Ltext0
 	.8byte	.LBE15-.Ltext0
-	.8byte	.LBB16-.Ltext0
-	.8byte	.LBE16-.Ltext0
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB22-.Ltext0
-	.8byte	.LBE22-.Ltext0
-	.8byte	.LBB27-.Ltext0
-	.8byte	.LBE27-.Ltext0
-	.8byte	.LBB36-.Ltext0
-	.8byte	.LBE36-.Ltext0
-	.8byte	.LBB38-.Ltext0
-	.8byte	.LBE38-.Ltext0
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB28-.Ltext0
 	.8byte	.LBE28-.Ltext0
+	.8byte	.LBB32-.Ltext0
+	.8byte	.LBE32-.Ltext0
+	.8byte	.LBB62-.Ltext0
+	.8byte	.LBE62-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB33-.Ltext0
+	.8byte	.LBE33-.Ltext0
+	.8byte	.LBB59-.Ltext0
+	.8byte	.LBE59-.Ltext0
+	.8byte	.LBB60-.Ltext0
+	.8byte	.LBE60-.Ltext0
+	.8byte	.LBB61-.Ltext0
+	.8byte	.LBE61-.Ltext0
+	.8byte	.LBB63-.Ltext0
+	.8byte	.LBE63-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB35-.Ltext0
+	.8byte	.LBE35-.Ltext0
+	.8byte	.LBB46-.Ltext0
+	.8byte	.LBE46-.Ltext0
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB37-.Ltext0
 	.8byte	.LBE37-.Ltext0
-	.8byte	.LBB39-.Ltext0
-	.8byte	.LBE39-.Ltext0
+	.8byte	.LBB38-.Ltext0
+	.8byte	.LBE38-.Ltext0
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB40-.Ltext0
 	.8byte	.LBE40-.Ltext0
-	.8byte	.LBB41-.Ltext0
-	.8byte	.LBE41-.Ltext0
+	.8byte	.LBB47-.Ltext0
+	.8byte	.LBE47-.Ltext0
+	.8byte	.LBB48-.Ltext0
+	.8byte	.LBE48-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB42-.Ltext0
+	.8byte	.LBE42-.Ltext0
+	.8byte	.LBB43-.Ltext0
+	.8byte	.LBE43-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB30-.Ltext0
-	.8byte	.LBE30-.Ltext0
-	.8byte	.LBB31-.Ltext0
-	.8byte	.LBE31-.Ltext0
+	.8byte	.LBB49-.Ltext0
+	.8byte	.LBE49-.Ltext0
+	.8byte	.LBB53-.Ltext0
+	.8byte	.LBE53-.Ltext0
+	.8byte	.LBB54-.Ltext0
+	.8byte	.LBE54-.Ltext0
 	.8byte	0
 	.8byte	0
 	.section	.debug_line,"",@progbits
@@ -15741,7 +16650,7 @@ spi_id_buffer.16947:
 	.string	"runnable_weight"
 .LASF323:
 	.string	"pushable_dl_tasks"
-.LASF1498:
+.LASF1504:
 	.string	"__func__"
 .LASF703:
 	.string	"cpu_number"
@@ -15771,7 +16680,7 @@ spi_id_buffer.16947:
 	.string	"entry"
 .LASF1447:
 	.string	"pvi_waveform"
-.LASF1508:
+.LASF1512:
 	.string	"oldpic"
 .LASF547:
 	.string	"MIGRATE_PCPTYPES"
@@ -15847,8 +16756,6 @@ spi_id_buffer.16947:
 	.string	"WHOLE_SECONDS"
 .LASF1385:
 	.string	"shutdown_pre"
-.LASF1497:
-	.string	"frm_num"
 .LASF297:
 	.string	"prio"
 .LASF145:
@@ -15903,6 +16810,8 @@ spi_id_buffer.16947:
 	.string	"xa_lock"
 .LASF284:
 	.string	"thread_info"
+.LASF1482:
+	.string	"needpic"
 .LASF151:
 	.string	"entries"
 .LASF1131:
@@ -15961,7 +16870,7 @@ spi_id_buffer.16947:
 	.string	"ZONE_MOVABLE"
 .LASF1144:
 	.string	"bin_attrs"
-.LASF1489:
+.LASF1491:
 	.string	"pix0_new"
 .LASF248:
 	.string	"__entry_tramp_text_start"
@@ -15973,23 +16882,25 @@ spi_id_buffer.16947:
 	.string	"perf_event_mutex"
 .LASF1382:
 	.string	"dev_uevent"
-.LASF1501:
+.LASF1506:
 	.string	"temp_num"
 .LASF1008:
 	.string	"cancelled_write_bytes"
 .LASF1078:
 	.string	"my_q"
+.LASF1496:
+	.string	"pvi_lut_init_wf_table"
 .LASF269:
 	.string	"sve_vl"
 .LASF383:
 	.string	"signal"
-.LASF1476:
+.LASF1477:
 	.string	"pvi_wf_get_lut"
 .LASF202:
 	.string	"_sinittext"
 .LASF969:
 	.string	"_band"
-.LASF1506:
+.LASF1517:
 	.string	"decodewaveform"
 .LASF728:
 	.string	"tick_nsec"
@@ -16245,7 +17156,7 @@ spi_id_buffer.16947:
 	.string	"NR_FILE_PAGES"
 .LASF23:
 	.string	"__kernel_uid32_t"
-.LASF1470:
+.LASF1471:
 	.string	"global_waveform"
 .LASF162:
 	.string	"static_key_false"
@@ -16369,7 +17280,7 @@ spi_id_buffer.16947:
 	.string	"nr_wakeups"
 .LASF289:
 	.string	"wake_entry"
-.LASF1473:
+.LASF1474:
 	.string	"pvi_wf_get_version"
 .LASF394:
 	.string	"parent_exec_id"
@@ -16381,6 +17292,8 @@ spi_id_buffer.16947:
 	.string	"last_arrival"
 .LASF752:
 	.string	"wait"
+.LASF1497:
+	.string	"pvi_lut_init_wf_table_32"
 .LASF998:
 	.string	"lock_class_key"
 .LASF632:
@@ -16501,14 +17414,16 @@ spi_id_buffer.16947:
 	.string	"WF_TYPE_GLD16"
 .LASF1037:
 	.string	"util_avg"
-.LASF1495:
+.LASF1502:
 	.string	"temp3"
 .LASF850:
 	.string	"rmdir"
-.LASF1496:
+.LASF1503:
 	.string	"temp4"
 .LASF184:
 	.string	"cpu_hwcap_keys"
+.LASF1488:
+	.string	"old_gray"
 .LASF506:
 	.string	"root"
 .LASF1092:
@@ -16521,7 +17436,7 @@ spi_id_buffer.16947:
 	.string	"start_prevent_time"
 .LASF602:
 	.string	"NR_WRITTEN"
-.LASF1479:
+.LASF1480:
 	.string	"lut_type"
 .LASF1349:
 	.string	"dev_root"
@@ -16557,8 +17472,6 @@ spi_id_buffer.16947:
 	.string	"batch"
 .LASF368:
 	.string	"start_time"
-.LASF1488:
-	.string	"pix1_wf"
 .LASF993:
 	.string	"MM_UNRECLAIMABLE"
 .LASF546:
@@ -16583,7 +17496,7 @@ spi_id_buffer.16947:
 	.string	"_etext"
 .LASF1175:
 	.string	"kset_uevent_ops"
-.LASF1499:
+.LASF1498:
 	.string	"parse_wf_direct"
 .LASF856:
 	.string	"prealloc_mutex"
@@ -16597,11 +17510,11 @@ spi_id_buffer.16947:
 	.string	"rb_leftmost"
 .LASF658:
 	.string	"stat_threshold"
-.LASF1472:
+.LASF1473:
 	.string	"spi_id_buffer"
 .LASF1120:
 	.string	"rt_mutex_waiter"
-.LASF1515:
+.LASF1520:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF705:
 	.string	"secondary_data"
@@ -16667,6 +17580,8 @@ spi_id_buffer.16947:
 	.string	"radix_tree_root"
 .LASF240:
 	.string	"__idmap_text_start"
+.LASF1511:
+	.string	"decodewaveform_32"
 .LASF783:
 	.string	"core_sibling"
 .LASF1398:
@@ -16693,7 +17608,7 @@ spi_id_buffer.16947:
 	.string	"thaw"
 .LASF227:
 	.string	"__noinstr_text_end"
-.LASF1507:
+.LASF1470:
 	.string	"maxpic"
 .LASF224:
 	.string	"__start_opd"
@@ -16717,7 +17632,7 @@ spi_id_buffer.16947:
 	.string	"dl_density"
 .LASF1264:
 	.string	"RPM_REQ_RESUME"
-.LASF1516:
+.LASF1521:
 	.string	"frozen"
 .LASF192:
 	.string	"_text"
@@ -16783,7 +17698,7 @@ spi_id_buffer.16947:
 	.string	"sys_val"
 .LASF43:
 	.string	"size_t"
-.LASF1480:
+.LASF1481:
 	.string	"temperture"
 .LASF1362:
 	.string	"lock_key"
@@ -16817,7 +17732,7 @@ spi_id_buffer.16947:
 	.string	"oom_reaper_list"
 .LASF826:
 	.string	"kernfs_elem_attr"
-.LASF1491:
+.LASF1493:
 	.string	"pix1_new"
 .LASF541:
 	.string	"page"
@@ -16907,13 +17822,13 @@ spi_id_buffer.16947:
 	.string	"init_user_ns"
 .LASF1104:
 	.string	"perf_event_task_context"
-.LASF1477:
+.LASF1478:
 	.string	"waveform_file"
 .LASF1391:
 	.string	"segment_boundary_mask"
 .LASF855:
 	.string	"file"
-.LASF1486:
+.LASF1487:
 	.string	"frame_num_gray2"
 .LASF165:
 	.string	"FTR_EXACT"
@@ -16937,6 +17852,10 @@ spi_id_buffer.16947:
 	.string	"PVI_WF_DU4"
 .LASF1246:
 	.string	"iommu_group"
+.LASF1494:
+	.string	"pix0"
+.LASF1495:
+	.string	"pix1"
 .LASF271:
 	.string	"fault_address"
 .LASF385:
@@ -17123,7 +18042,7 @@ spi_id_buffer.16947:
 	.string	"epd_lut_data"
 .LASF694:
 	.string	"zonelist"
-.LASF1514:
+.LASF1519:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform.c"
 .LASF672:
 	.string	"pageset"
@@ -17267,7 +18186,7 @@ spi_id_buffer.16947:
 	.string	"node_present_pages"
 .LASF1433:
 	.string	"pvi_wf_mode"
-.LASF1502:
+.LASF1507:
 	.string	"get_wf_frm_num"
 .LASF327:
 	.string	"exit_state"
@@ -17395,7 +18314,7 @@ spi_id_buffer.16947:
 	.string	"pcount"
 .LASF1148:
 	.string	"kref"
-.LASF1509:
+.LASF1513:
 	.string	"newpic"
 .LASF436:
 	.string	"nr_dirtied"
@@ -17535,7 +18454,7 @@ spi_id_buffer.16947:
 	.string	"pm_message_t"
 .LASF1429:
 	.string	"WF_TYPE_GLR16"
-.LASF1511:
+.LASF1515:
 	.string	"tempdata"
 .LASF230:
 	.string	"__alt_instructions"
@@ -17631,7 +18550,7 @@ spi_id_buffer.16947:
 	.string	"next_timer"
 .LASF313:
 	.string	"rcu_node_entry"
-.LASF1475:
+.LASF1476:
 	.string	"pvi_wf"
 .LASF858:
 	.string	"list"
@@ -17767,7 +18686,7 @@ spi_id_buffer.16947:
 	.string	"zoneref"
 .LASF825:
 	.string	"iattr"
-.LASF1510:
+.LASF1514:
 	.string	"frame_tmp"
 .LASF1051:
 	.string	"slice_max"
@@ -17785,7 +18704,7 @@ spi_id_buffer.16947:
 	.string	"self_exec_id"
 .LASF1041:
 	.string	"wait_count"
-.LASF1503:
+.LASF1508:
 	.string	"get_wf_mode_index"
 .LASF1335:
 	.string	"sync"
@@ -17903,6 +18822,8 @@ spi_id_buffer.16947:
 	.string	"wait_sum"
 .LASF305:
 	.string	"boost_expires"
+.LASF1499:
+	.string	"get_wf_frm_num_32"
 .LASF334:
 	.string	"sched_contributes_to_load"
 .LASF1096:
@@ -17945,11 +18866,11 @@ spi_id_buffer.16947:
 	.string	"bps_disabled"
 .LASF755:
 	.string	"notifier_call"
-.LASF1493:
+.LASF1500:
 	.string	"temp1"
-.LASF1494:
+.LASF1501:
 	.string	"temp2"
-.LASF1478:
+.LASF1479:
 	.string	"output"
 .LASF402:
 	.string	"journal_info"
@@ -17997,7 +18918,7 @@ spi_id_buffer.16947:
 	.string	"NR_UNEVICTABLE"
 .LASF861:
 	.string	"released"
-.LASF1482:
+.LASF1484:
 	.string	"sftemp"
 .LASF819:
 	.string	"target_kn"
@@ -18093,7 +19014,7 @@ spi_id_buffer.16947:
 	.string	"argv"
 .LASF666:
 	.string	"__MAX_NR_ZONES"
-.LASF1484:
+.LASF1486:
 	.string	"mode_index"
 .LASF438:
 	.string	"dirty_paused_when"
@@ -18111,9 +19032,7 @@ spi_id_buffer.16947:
 	.string	"device_node"
 .LASF732:
 	.string	"ktime_t"
-.LASF1487:
-	.string	"pix0_wf"
-.LASF1517:
+.LASF1522:
 	.string	"printk"
 .LASF741:
 	.string	"data"
@@ -18171,7 +19090,7 @@ spi_id_buffer.16947:
 	.string	"dl_throttled"
 .LASF1186:
 	.string	"n_ref"
-.LASF1474:
+.LASF1475:
 	.string	"pvi_wf_input"
 .LASF391:
 	.string	"task_works"
@@ -18211,7 +19130,7 @@ spi_id_buffer.16947:
 	.string	"nodemask_t"
 .LASF1329:
 	.string	"autosleep_enabled"
-.LASF1481:
+.LASF1483:
 	.string	"stype"
 .LASF772:
 	.string	"PCPU_FC_EMBED"
@@ -18283,7 +19202,7 @@ spi_id_buffer.16947:
 	.string	"load_avg"
 .LASF532:
 	.string	"FDPIC_FUNCPTRS"
-.LASF1471:
+.LASF1472:
 	.string	"waveform"
 .LASF778:
 	.string	"thread_id"
@@ -18307,7 +19226,7 @@ spi_id_buffer.16947:
 	.string	"fpsimd_cpu"
 .LASF1262:
 	.string	"RPM_REQ_SUSPEND"
-.LASF1512:
+.LASF1516:
 	.string	"israr"
 .LASF360:
 	.string	"utime"
@@ -18315,7 +19234,7 @@ spi_id_buffer.16947:
 	.string	"__nosave_begin"
 .LASF967:
 	.string	"_addr_pkey"
-.LASF1513:
+.LASF1518:
 	.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"
@@ -18343,7 +19262,7 @@ spi_id_buffer.16947:
 	.string	"static_key_mod"
 .LASF543:
 	.string	"MIGRATE_UNMOVABLE"
-.LASF1504:
+.LASF1509:
 	.string	"pvi_modes"
 .LASF959:
 	.string	"_stime"
@@ -18423,7 +19342,7 @@ spi_id_buffer.16947:
 	.string	"namespace"
 .LASF1278:
 	.string	"no_pm"
-.LASF1500:
+.LASF1505:
 	.string	"get_wf_temp_index"
 .LASF14:
 	.string	"long long int"
@@ -18431,8 +19350,6 @@ spi_id_buffer.16947:
 	.string	"dl_timer"
 .LASF1209:
 	.string	"freeze_noirq"
-.LASF1485:
-	.string	"frame_idx"
 .LASF1173:
 	.string	"envp_idx"
 .LASF316:
@@ -18713,7 +19630,7 @@ spi_id_buffer.16947:
 	.string	"serial"
 .LASF398:
 	.string	"wake_q"
-.LASF1505:
+.LASF1510:
 	.string	"parse_mode_version"
 .LASF598:
 	.string	"NR_UNSTABLE_NFS"
@@ -18731,6 +19648,8 @@ spi_id_buffer.16947:
 	.string	"tz_minuteswest"
 .LASF428:
 	.string	"rseq"
+.LASF1489:
+	.string	"new_gray"
 .LASF446:
 	.string	"memcg_nr_pages_over_high"
 .LASF354:
@@ -18741,7 +19660,7 @@ spi_id_buffer.16947:
 	.string	"total_time"
 .LASF211:
 	.string	"__kprobes_text_end"
-.LASF1483:
+.LASF1485:
 	.string	"temp_index"
 	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
 	.section	.note.GNU-stack,"",@progbits
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S
index 78cb8204855d..016a123e1984 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S
@@ -580,6 +580,7 @@ rkf_wf_get_lut:
 	.cfi_offset 20, -24
 	.loc 1 481 0
 	ldr	x3, [x22, #:lo12:.LANCHOR0]
+.LVL59:
 	cbz	x3, .L109
 	.loc 1 484 0
 	cbz	x0, .L110
@@ -601,11 +602,11 @@ rkf_wf_get_lut:
 	mov	w20, w1
 	.loc 1 492 0
 	add	x1, x21, :lo12:.LANCHOR1
-.LVL59:
+.LVL60:
 	mov	x19, x0
 	.loc 1 496 0
 	ldr	x0, [x0, 8]
-.LVL60:
+.LVL61:
 	.loc 1 492 0
 	str	w2, [x21, #:lo12:.LANCHOR1]
 	.loc 1 493 0
@@ -614,10 +615,10 @@ rkf_wf_get_lut:
 	cbz	x0, .L63
 	.loc 1 497 0
 	bl	kfree
-.LVL61:
+.LVL62:
 	.loc 1 498 0
 	str	xzr, [x19, 8]
-.LVL62:
+.LVL63:
 .L63:
 	.loc 1 501 0
 	cmp	w20, 2
@@ -645,7 +646,7 @@ rkf_wf_get_lut:
 .LBB338:
 	.loc 1 173 0
 	ldr	w20, [x21, #:lo12:.LANCHOR1]
-.LVL63:
+.LVL64:
 .LBE338:
 .LBB339:
 	.loc 1 174 0
@@ -655,7 +656,7 @@ rkf_wf_get_lut:
 .LBE336:
 	.loc 1 188 0
 	ldr	x1, [x22, #:lo12:.LANCHOR0]
-.LVL64:
+.LVL65:
 .LBB347:
 .LBB344:
 .LBB340:
@@ -671,7 +672,7 @@ rkf_wf_get_lut:
 .LBE347:
 	.loc 1 205 0
 	add	x4, x1, 212
-.LVL65:
+.LVL66:
 .LBB348:
 .LBB345:
 .LBB342:
@@ -682,7 +683,7 @@ rkf_wf_get_lut:
 .LBE348:
 	.loc 1 206 0
 	add	x2, x1, 852
-.LVL66:
+.LVL67:
 .LBB349:
 .LBB346:
 .LBB343:
@@ -704,20 +705,20 @@ rkf_wf_get_lut:
 .LBE349:
 	.loc 1 230 0
 	ldr	w2, [x2, x0]
-.LVL67:
+.LVL68:
 .LBE335:
 .LBE334:
 	.loc 1 399 0
 	add	x0, x1, x2
 	.loc 1 393 0
 	ldrb	w1, [x1, x2]
-.LVL68:
+.LVL69:
 	.loc 1 395 0
 	str	w1, [x19]
 	.loc 1 399 0
 	lsl	w1, w1, 6
 	bl	decode_wf_data
-.LVL69:
+.LVL70:
 	str	x0, [x19, 8]
 	.loc 1 400 0
 	cbz	x0, .L158
@@ -725,15 +726,15 @@ rkf_wf_get_lut:
 .LBB351:
 	.loc 1 188 0
 	ldr	x1, [x22, #:lo12:.LANCHOR0]
-.LVL70:
+.LVL71:
 	.loc 1 202 0
 	mov	x0, 0
 	.loc 1 201 0
 	add	x3, x1, 468
-.LVL71:
+.LVL72:
 	.loc 1 202 0
 	add	x2, x1, 1876
-.LVL72:
+.LVL73:
 .L95:
 .LBB352:
 .LBB353:
@@ -751,12 +752,12 @@ rkf_wf_get_lut:
 .LBE352:
 	.loc 1 230 0
 	ldr	w3, [x2, x0]
-.LVL73:
+.LVL74:
 .LBE351:
 .LBE350:
 	.loc 1 408 0
 	ldr	w2, [x19]
-.LVL74:
+.LVL75:
 	.loc 1 413 0
 	add	x0, x1, x3
 .LBB354:
@@ -767,23 +768,23 @@ rkf_wf_get_lut:
 .LBE354:
 	.loc 1 408 0
 	orr	w1, w2, w20, lsl 8
-.LVL75:
+.LVL76:
 	str	w1, [x19]
 	.loc 1 413 0
 	lsl	w1, w20, 6
 	bl	decode_wf_data
-.LVL76:
+.LVL77:
 	.loc 1 414 0
 	cbz	x0, .L158
 .LBB356:
 .LBB357:
 	.loc 1 297 0
 	mov	x5, x0
-.LVL77:
-	mov	w4, 0
 .LVL78:
-	ldr	x3, [x19, 8]
+	mov	w4, 0
 .LVL79:
+	ldr	x3, [x19, 8]
+.LVL80:
 	cbz	w20, .L156
 .L132:
 	mov	x1, 0
@@ -809,7 +810,7 @@ rkf_wf_get_lut:
 	add	x3, x3, 64
 	cmp	w4, w20
 	bne	.L132
-.LVL80:
+.LVL81:
 .L156:
 .LBE357:
 .LBE356:
@@ -819,9 +820,9 @@ rkf_wf_get_lut:
 .LBB359:
 	.loc 1 338 0
 	bl	kfree
-.LVL81:
-	ldr	w20, [x19]
 .LVL82:
+	ldr	w20, [x19]
+.LVL83:
 .L86:
 .LBE359:
 .LBE358:
@@ -829,24 +830,24 @@ rkf_wf_get_lut:
 .LBB385:
 	.loc 1 449 0
 	and	w20, w20, 255
-.LVL83:
+.LVL84:
 	.loc 1 451 0
 	mov	w12, 0
 	lsl	w14, w20, 16
 	mov	x13, 0
 	cbz	w20, .L111
-.LVL84:
+.LVL85:
 .L131:
 .LBB386:
 	.loc 1 452 0
 	ldr	x11, [x19, 8]
-.LVL85:
+.LVL86:
 	mov	w9, w12
 	.loc 1 453 0
 	mov	w10, 0
 	.loc 1 452 0
 	add	x11, x11, x13
-.LVL86:
+.LVL87:
 	.p2align 2
 .L104:
 	ubfiz	x8, x10, 2, 4
@@ -901,19 +902,19 @@ rkf_wf_get_lut:
 	.loc 1 451 0
 	cmp	w14, w12
 	bne	.L131
-.LVL87:
+.LVL88:
 .L111:
 .LBE385:
 .LBE384:
 	.loc 1 490 0
 	mov	w0, 0
-.LVL88:
+.LVL89:
 .L60:
 	.loc 1 570 0
 	ldp	x19, x20, [sp, 16]
-.LVL89:
-	ldp	x21, x22, [sp, 32]
 .LVL90:
+	ldp	x21, x22, [sp, 32]
+.LVL91:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 30
@@ -924,7 +925,7 @@ rkf_wf_get_lut:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL91:
+.LVL92:
 .L160:
 	.cfi_restore_state
 	.loc 1 489 0 discriminator 1
@@ -932,15 +933,15 @@ rkf_wf_get_lut:
 	cmp	w3, w1
 	bne	.L62
 	b	.L111
-.LVL92:
+.LVL93:
 .L163:
 	lsl	x0, x0, 2
 	b	.L94
-.LVL93:
+.LVL94:
 .L162:
 	lsl	x0, x0, 2
 	b	.L91
-.LVL94:
+.LVL95:
 .L79:
 .LBB390:
 .LBB382:
@@ -949,14 +950,14 @@ rkf_wf_get_lut:
 	.loc 1 334 0
 	mov	x0, x21
 	bl	kfree
-.LVL95:
+.LVL96:
 .L158:
 .LBE382:
 .LBE390:
 	.loc 1 512 0
 	mov	w0, -1
 	b	.L60
-.LVL96:
+.LVL97:
 .L71:
 .LBB391:
 .LBB392:
@@ -976,7 +977,7 @@ rkf_wf_get_lut:
 .LBE395:
 	.loc 1 188 0
 	ldr	x2, [x22, #:lo12:.LANCHOR0]
-.LVL97:
+.LVL98:
 .LBB406:
 .LBB403:
 .LBB399:
@@ -992,7 +993,7 @@ rkf_wf_get_lut:
 .LBE406:
 	.loc 1 201 0
 	add	x5, x2, 468
-.LVL98:
+.LVL99:
 .LBB407:
 .LBB404:
 .LBB401:
@@ -1003,7 +1004,7 @@ rkf_wf_get_lut:
 .LBE407:
 	.loc 1 202 0
 	add	x3, x2, 1876
-.LVL99:
+.LVL100:
 .LBB408:
 .LBB405:
 .LBB402:
@@ -1031,18 +1032,18 @@ rkf_wf_get_lut:
 	add	x0, x2, x1
 	.loc 1 371 0
 	ldrb	w20, [x2, x1]
-.LVL100:
+.LVL101:
 	.loc 1 375 0
 	lsl	w1, w20, 6
 	bl	decode_wf_data
-.LVL101:
+.LVL102:
 	str	x0, [x19, 8]
 	.loc 1 376 0
 	cbz	x0, .L158
 	.loc 1 379 0
 	str	w20, [x19]
 	b	.L86
-.LVL102:
+.LVL103:
 .L161:
 .LBE392:
 .LBE391:
@@ -1067,7 +1068,7 @@ rkf_wf_get_lut:
 .LBE362:
 	.loc 1 188 0
 	ldr	x2, [x22, #:lo12:.LANCHOR0]
-.LVL103:
+.LVL104:
 .LBB373:
 .LBB370:
 .LBB366:
@@ -1083,7 +1084,7 @@ rkf_wf_get_lut:
 .LBE373:
 	.loc 1 197 0
 	add	x5, x2, 148
-.LVL104:
+.LVL105:
 .LBB374:
 .LBB371:
 .LBB368:
@@ -1094,7 +1095,7 @@ rkf_wf_get_lut:
 .LBE374:
 	.loc 1 198 0
 	add	x3, x2, 596
-.LVL105:
+.LVL106:
 .LBB375:
 .LBB372:
 .LBB369:
@@ -1122,15 +1123,15 @@ rkf_wf_get_lut:
 	add	x0, x2, x1
 	.loc 1 320 0
 	ldrb	w22, [x2, x1]
-.LVL106:
+.LVL107:
 	.loc 1 323 0
 	add	w20, w22, 15
-.LVL107:
+.LVL108:
 	lsr	w20, w20, 4
 	.loc 1 324 0
 	lsl	w1, w20, 2
 	bl	decode_wf_data
-.LVL108:
+.LVL109:
 	mov	x21, x0
 	.loc 1 325 0
 	cbz	x0, .L158
@@ -1148,7 +1149,7 @@ rkf_wf_get_lut:
 	sxtw	x0, w0
 	movk	w1, 0x60, lsl 16
 	bl	__kmalloc
-.LVL109:
+.LVL110:
 .LBE380:
 .LBE379:
 .LBE378:
@@ -1157,21 +1158,21 @@ rkf_wf_get_lut:
 	.loc 1 269 0
 	cbz	w20, .L80
 	mov	x4, 0
-.LVL110:
+.LVL111:
 .L84:
 	.loc 1 270 0
 	ldr	w8, [x21, x4, lsl 2]
-.LVL111:
+.LVL112:
 	lsl	w1, w4, 8
 	mov	w6, 0
-.LVL112:
+.LVL113:
 .L83:
 .LBB381:
 	.loc 1 272 0
 	asr	w5, w8, w6
-.LVL113:
-	and	w5, w5, 3
 .LVL114:
+	and	w5, w5, 3
+.LVL115:
 	.loc 1 273 0
 	mov	w3, w5
 	.loc 1 272 0
@@ -1209,54 +1210,54 @@ rkf_wf_get_lut:
 	.loc 1 338 0
 	mov	x0, x21
 	b	.L156
-.LVL115:
+.LVL116:
 .L164:
 	lsl	x0, x0, 2
 	b	.L88
-.LVL116:
+.LVL117:
 .L65:
 .LBE383:
 .LBE409:
 	.loc 1 528 0
 	ldr	w2, [x21, #:lo12:.LANCHOR1]
-.LVL117:
+.LVL118:
 	mov	w3, 4
 	add	x1, x19, 8
 	mov	x0, x19
 	bl	parse_wf_gray16.isra.3
-.LVL118:
+.LVL119:
 	.loc 1 529 0
 	cbnz	w0, .L158
 .L157:
 	ldr	w20, [x19]
-.LVL119:
-	b	.L86
 .LVL120:
+	b	.L86
+.LVL121:
 .L68:
 	.loc 1 540 0
 	ldr	w2, [x21, #:lo12:.LANCHOR1]
-.LVL121:
+.LVL122:
 	mov	w3, 2
 	add	x1, x19, 8
 	mov	x0, x19
 	bl	parse_wf_gray16.isra.3
-.LVL122:
+.LVL123:
 	.loc 1 541 0
 	cbz	w0, .L157
 	b	.L158
-.LVL123:
+.LVL124:
 .L110:
 	.loc 1 485 0
 	mov	w0, -22
-.LVL124:
-	b	.L60
 .LVL125:
+	b	.L60
+.LVL126:
 .L109:
 	.loc 1 482 0
 	mov	w0, -19
-.LVL126:
-	b	.L60
 .LVL127:
+	b	.L60
+.LVL128:
 .L67:
 	.loc 1 508 0
 	cmp	w20, 8
@@ -1268,16 +1269,16 @@ rkf_wf_get_lut:
 	bne	.L158
 	.loc 1 534 0
 	ldr	w2, [x21, #:lo12:.LANCHOR1]
-.LVL128:
+.LVL129:
 	mov	w3, 5
 	add	x1, x19, 8
 	mov	x0, x19
 	bl	parse_wf_gray16.isra.3
-.LVL129:
+.LVL130:
 	.loc 1 535 0
 	cbz	w0, .L157
 	b	.L158
-.LVL130:
+.LVL131:
 .L66:
 .LBB410:
 .LBB411:
@@ -1297,7 +1298,7 @@ rkf_wf_get_lut:
 .LBE414:
 	.loc 1 188 0
 	ldr	x2, [x22, #:lo12:.LANCHOR0]
-.LVL131:
+.LVL132:
 .LBB425:
 .LBB422:
 .LBB418:
@@ -1313,7 +1314,7 @@ rkf_wf_get_lut:
 .LBE425:
 	.loc 1 221 0
 	add	x5, x2, 532
-.LVL132:
+.LVL133:
 .LBB426:
 .LBB423:
 .LBB420:
@@ -1324,7 +1325,7 @@ rkf_wf_get_lut:
 .LBE426:
 	.loc 1 222 0
 	add	x3, x2, 2132
-.LVL133:
+.LVL134:
 .LBB427:
 .LBB424:
 .LBB421:
@@ -1352,38 +1353,38 @@ rkf_wf_get_lut:
 	add	x0, x2, x1
 	.loc 1 432 0
 	ldrb	w1, [x2, x1]
-.LVL134:
+.LVL135:
 	.loc 1 434 0
 	str	w1, [x19]
 	.loc 1 438 0
 	lsl	w1, w1, 6
-.LVL135:
-	bl	decode_wf_data
 .LVL136:
+	bl	decode_wf_data
+.LVL137:
 	str	x0, [x19, 8]
 	.loc 1 439 0
 	cbnz	x0, .L157
 	b	.L158
-.LVL137:
+.LVL138:
 .L73:
 .LBE411:
 .LBE410:
 	.loc 1 522 0
 	ldr	w2, [x21, #:lo12:.LANCHOR1]
-.LVL138:
+.LVL139:
 	mov	w3, 3
 	add	x1, x19, 8
 	mov	x0, x19
 	bl	parse_wf_gray16.isra.3
-.LVL139:
+.LVL140:
 	.loc 1 523 0
 	cbz	w0, .L157
 	b	.L158
-.LVL140:
+.LVL141:
 .L166:
 	lsl	x0, x0, 2
 	b	.L101
-.LVL141:
+.LVL142:
 .L165:
 	lsl	x0, x0, 2
 	b	.L76
@@ -1393,13 +1394,13 @@ rkf_wf_get_lut:
 	.data
 	.align	2
 	.set	.LANCHOR1,. + 0
-	.type	sftemp.16988, %object
-	.size	sftemp.16988, 4
-sftemp.16988:
+	.type	sftemp.16992, %object
+	.size	sftemp.16992, 4
+sftemp.16992:
 	.word	-1
-	.type	stype.16987, %object
-	.size	stype.16987, 4
-stype.16987:
+	.type	stype.16991, %object
+	.size	stype.16991, 4
+stype.16991:
 	.word	12
 	.bss
 	.align	3
@@ -1533,15 +1534,15 @@ crc32_table:
 	.file 100 "./arch/arm64/include/asm/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x7358
+	.4byte	0x7368
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF1534
-	.byte	0x1
 	.4byte	.LASF1535
+	.byte	0x1
 	.4byte	.LASF1536
+	.4byte	.LASF1537
 	.8byte	.Ltext0
 	.8byte	.Letext0-.Ltext0
 	.4byte	.Ldebug_line0
@@ -9991,7 +9992,7 @@ crc32_table:
 	.2byte	0x510
 	.4byte	0x45f3
 	.uleb128 0x40
-	.4byte	.LASF1537
+	.4byte	.LASF1538
 	.byte	0x22
 	.2byte	0x510
 	.4byte	0x6c
@@ -13416,7 +13417,7 @@ crc32_table:
 	.byte	0x3
 	.8byte	crc32_table
 	.uleb128 0x46
-	.4byte	.LASF1501
+	.4byte	.LASF1502
 	.byte	0x1
 	.2byte	0x1db
 	.4byte	0xc0
@@ -13424,12 +13425,12 @@ crc32_table:
 	.8byte	.LFE1565-.LFB1565
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x69a6
+	.4byte	0x69b6
 	.uleb128 0x47
 	.4byte	.LASF1466
 	.byte	0x1
 	.2byte	0x1db
-	.4byte	0x69a6
+	.4byte	0x69b6
 	.4byte	.LLST13
 	.uleb128 0x47
 	.4byte	.LASF1467
@@ -13443,649 +13444,655 @@ crc32_table:
 	.2byte	0x1db
 	.4byte	0xc0
 	.4byte	.LLST15
-	.uleb128 0x48
+	.uleb128 0x47
 	.4byte	.LASF1469
 	.byte	0x1
+	.2byte	0x1db
+	.4byte	0xc0
+	.4byte	.LLST16
+	.uleb128 0x48
+	.4byte	.LASF1470
+	.byte	0x1
 	.2byte	0x1dd
 	.4byte	0x5fb2
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	stype.16987
+	.8byte	stype.16991
 	.uleb128 0x48
-	.4byte	.LASF1470
+	.4byte	.LASF1471
 	.byte	0x1
 	.2byte	0x1de
 	.4byte	0xc0
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	sftemp.16988
+	.8byte	sftemp.16992
 	.uleb128 0x49
 	.string	"ret"
 	.byte	0x1
 	.2byte	0x1df
 	.4byte	0xc0
 	.uleb128 0x4a
-	.4byte	0x6a74
+	.4byte	0x6a84
 	.8byte	.LBB332
 	.8byte	.LBE332-.LBB332
 	.byte	0x1
 	.2byte	0x228
-	.4byte	0x64c4
+	.4byte	0x64d4
 	.uleb128 0x4b
-	.4byte	0x6a91
+	.4byte	0x6aa1
 	.uleb128 0x4b
-	.4byte	0x6a85
+	.4byte	0x6a95
 	.uleb128 0x4c
 	.8byte	.LBB333
 	.8byte	.LBE333-.LBB333
 	.uleb128 0x4d
-	.4byte	0x6a9d
+	.4byte	0x6aad
 	.uleb128 0x4d
-	.4byte	0x6aa9
+	.4byte	0x6ab9
 	.uleb128 0x4d
-	.4byte	0x6ab5
+	.4byte	0x6ac5
 	.uleb128 0x4d
-	.4byte	0x6ac1
+	.4byte	0x6ad1
 	.uleb128 0x4a
-	.4byte	0x6d9e
+	.4byte	0x6dae
 	.8byte	.LBB334
 	.8byte	.LBE334-.LBB334
 	.byte	0x1
 	.2byte	0x188
-	.4byte	0x637d
+	.4byte	0x638d
 	.uleb128 0x4b
-	.4byte	0x6db9
+	.4byte	0x6dc9
 	.uleb128 0x4b
-	.4byte	0x6dae
+	.4byte	0x6dbe
 	.uleb128 0x4c
 	.8byte	.LBB335
 	.8byte	.LBE335-.LBB335
 	.uleb128 0x4e
-	.4byte	0x6dc4
-	.4byte	.LLST16
-	.uleb128 0x4e
-	.4byte	0x6dcf
+	.4byte	0x6dd4
 	.4byte	.LLST17
 	.uleb128 0x4e
-	.4byte	0x6dda
+	.4byte	0x6ddf
 	.4byte	.LLST18
+	.uleb128 0x4e
+	.4byte	0x6dea
+	.4byte	.LLST19
 	.uleb128 0x4d
-	.4byte	0x6de5
+	.4byte	0x6df5
 	.uleb128 0x4d
-	.4byte	0x6df0
+	.4byte	0x6e00
 	.uleb128 0x4d
-	.4byte	0x6dfa
+	.4byte	0x6e0a
 	.uleb128 0x4f
-	.4byte	0x6e06
+	.4byte	0x6e16
 	.8byte	.LBB336
 	.4byte	.Ldebug_ranges0+0x1c0
 	.byte	0x1
 	.byte	0xe4
 	.uleb128 0x4b
-	.4byte	0x6e21
+	.4byte	0x6e31
 	.uleb128 0x4b
-	.4byte	0x6e16
+	.4byte	0x6e26
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x1c0
 	.uleb128 0x4d
-	.4byte	0x6e2c
+	.4byte	0x6e3c
 	.uleb128 0x4d
-	.4byte	0x6e37
+	.4byte	0x6e47
 	.uleb128 0x51
 	.4byte	.Ldebug_ranges0+0x210
-	.4byte	0x6369
+	.4byte	0x6379
 	.uleb128 0x4d
-	.4byte	0x6e45
+	.4byte	0x6e55
 	.uleb128 0x4d
-	.4byte	0x6e50
+	.4byte	0x6e60
 	.byte	0
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x240
 	.uleb128 0x4d
-	.4byte	0x6e5d
+	.4byte	0x6e6d
 	.uleb128 0x4d
-	.4byte	0x6e68
+	.4byte	0x6e78
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4a
-	.4byte	0x6d9e
+	.4byte	0x6dae
 	.8byte	.LBB350
 	.8byte	.LBE350-.LBB350
 	.byte	0x1
 	.2byte	0x195
-	.4byte	0x641e
+	.4byte	0x642e
 	.uleb128 0x4b
-	.4byte	0x6db9
+	.4byte	0x6dc9
 	.uleb128 0x4b
-	.4byte	0x6dae
+	.4byte	0x6dbe
 	.uleb128 0x4c
 	.8byte	.LBB351
 	.8byte	.LBE351-.LBB351
 	.uleb128 0x4e
-	.4byte	0x6dc4
-	.4byte	.LLST19
-	.uleb128 0x4e
-	.4byte	0x6dcf
+	.4byte	0x6dd4
 	.4byte	.LLST20
 	.uleb128 0x4e
-	.4byte	0x6dda
+	.4byte	0x6ddf
 	.4byte	.LLST21
+	.uleb128 0x4e
+	.4byte	0x6dea
+	.4byte	.LLST22
 	.uleb128 0x4d
-	.4byte	0x6de5
+	.4byte	0x6df5
 	.uleb128 0x4d
-	.4byte	0x6df0
+	.4byte	0x6e00
 	.uleb128 0x4d
-	.4byte	0x6dfa
+	.4byte	0x6e0a
 	.uleb128 0x52
-	.4byte	0x6e06
+	.4byte	0x6e16
 	.8byte	.LBB352
 	.8byte	.LBE352-.LBB352
 	.byte	0x1
 	.byte	0xe4
 	.uleb128 0x4b
-	.4byte	0x6e21
+	.4byte	0x6e31
 	.uleb128 0x4b
-	.4byte	0x6e16
+	.4byte	0x6e26
 	.uleb128 0x4c
 	.8byte	.LBB353
 	.8byte	.LBE353-.LBB353
 	.uleb128 0x4d
-	.4byte	0x6e2c
+	.4byte	0x6e3c
 	.uleb128 0x4d
-	.4byte	0x6e37
+	.4byte	0x6e47
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4a
-	.4byte	0x6d82
+	.4byte	0x6d92
 	.8byte	.LBB354
 	.8byte	.LBE354-.LBB354
 	.byte	0x1
 	.2byte	0x196
-	.4byte	0x6440
+	.4byte	0x6450
 	.uleb128 0x4b
-	.4byte	0x6d92
+	.4byte	0x6da2
 	.byte	0
 	.uleb128 0x4a
-	.4byte	0x6bd0
+	.4byte	0x6be0
 	.8byte	.LBB356
 	.8byte	.LBE356-.LBB356
 	.byte	0x1
 	.2byte	0x1a2
-	.4byte	0x64a8
+	.4byte	0x64b8
 	.uleb128 0x4b
-	.4byte	0x6bdd
+	.4byte	0x6bed
 	.uleb128 0x4b
-	.4byte	0x6bdd
+	.4byte	0x6bed
 	.uleb128 0x4b
-	.4byte	0x6be9
+	.4byte	0x6bf9
 	.uleb128 0x4c
 	.8byte	.LBB357
 	.8byte	.LBE357-.LBB357
 	.uleb128 0x4d
-	.4byte	0x6bf5
-	.uleb128 0x4e
-	.4byte	0x6c01
-	.4byte	.LLST22
+	.4byte	0x6c05
 	.uleb128 0x4e
-	.4byte	0x6c0d
+	.4byte	0x6c11
 	.4byte	.LLST23
+	.uleb128 0x4e
+	.4byte	0x6c1d
+	.4byte	.LLST24
 	.uleb128 0x4d
-	.4byte	0x6c19
+	.4byte	0x6c29
 	.uleb128 0x4d
-	.4byte	0x6c25
+	.4byte	0x6c35
 	.uleb128 0x4e
-	.4byte	0x6c31
-	.4byte	.LLST24
+	.4byte	0x6c41
+	.4byte	.LLST25
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.8byte	.LVL69
-	.4byte	0x6cd6
+	.8byte	.LVL70
+	.4byte	0x6ce6
 	.uleb128 0x53
-	.8byte	.LVL76
-	.4byte	0x6cd6
+	.8byte	.LVL77
+	.4byte	0x6ce6
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x6b76
+	.4byte	0x6b86
 	.8byte	.LBB358
 	.4byte	.Ldebug_ranges0+0x290
 	.byte	0x1
 	.2byte	0x1fe
-	.4byte	0x66cb
+	.4byte	0x66db
 	.uleb128 0x4b
-	.4byte	0x6b87
+	.4byte	0x6b97
 	.uleb128 0x4b
-	.4byte	0x6b87
+	.4byte	0x6b97
 	.uleb128 0x4b
-	.4byte	0x6b93
+	.4byte	0x6ba3
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x290
 	.uleb128 0x4d
-	.4byte	0x6b9f
+	.4byte	0x6baf
 	.uleb128 0x4d
-	.4byte	0x6bab
+	.4byte	0x6bbb
 	.uleb128 0x4e
-	.4byte	0x6bb7
-	.4byte	.LLST25
+	.4byte	0x6bc7
+	.4byte	.LLST26
 	.uleb128 0x4d
-	.4byte	0x6bc3
+	.4byte	0x6bd3
 	.uleb128 0x4a
-	.4byte	0x6d9e
+	.4byte	0x6dae
 	.8byte	.LBB360
 	.8byte	.LBE360-.LBB360
 	.byte	0x1
 	.2byte	0x13f
-	.4byte	0x65bd
+	.4byte	0x65cd
 	.uleb128 0x4b
-	.4byte	0x6db9
+	.4byte	0x6dc9
 	.uleb128 0x4b
-	.4byte	0x6dae
+	.4byte	0x6dbe
 	.uleb128 0x4c
 	.8byte	.LBB361
 	.8byte	.LBE361-.LBB361
 	.uleb128 0x4e
-	.4byte	0x6dc4
-	.4byte	.LLST26
-	.uleb128 0x4e
-	.4byte	0x6dcf
+	.4byte	0x6dd4
 	.4byte	.LLST27
 	.uleb128 0x4e
-	.4byte	0x6dda
+	.4byte	0x6ddf
 	.4byte	.LLST28
+	.uleb128 0x4e
+	.4byte	0x6dea
+	.4byte	.LLST29
 	.uleb128 0x4d
-	.4byte	0x6de5
+	.4byte	0x6df5
 	.uleb128 0x4d
-	.4byte	0x6df0
+	.4byte	0x6e00
 	.uleb128 0x4d
-	.4byte	0x6dfa
+	.4byte	0x6e0a
 	.uleb128 0x4f
-	.4byte	0x6e06
+	.4byte	0x6e16
 	.8byte	.LBB362
 	.4byte	.Ldebug_ranges0+0x2d0
 	.byte	0x1
 	.byte	0xe4
 	.uleb128 0x4b
-	.4byte	0x6e21
+	.4byte	0x6e31
 	.uleb128 0x4b
-	.4byte	0x6e16
+	.4byte	0x6e26
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x2d0
 	.uleb128 0x4d
-	.4byte	0x6e2c
+	.4byte	0x6e3c
 	.uleb128 0x4d
-	.4byte	0x6e37
+	.4byte	0x6e47
 	.uleb128 0x51
 	.4byte	.Ldebug_ranges0+0x320
-	.4byte	0x65a9
+	.4byte	0x65b9
 	.uleb128 0x4d
-	.4byte	0x6e45
+	.4byte	0x6e55
 	.uleb128 0x4d
-	.4byte	0x6e50
+	.4byte	0x6e60
 	.byte	0
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x350
 	.uleb128 0x4d
-	.4byte	0x6e5d
+	.4byte	0x6e6d
 	.uleb128 0x4d
-	.4byte	0x6e68
+	.4byte	0x6e78
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4a
-	.4byte	0x6c3c
+	.4byte	0x6c4c
 	.8byte	.LBB376
 	.8byte	.LBE376-.LBB376
 	.byte	0x1
 	.2byte	0x14c
-	.4byte	0x66a2
+	.4byte	0x66b2
 	.uleb128 0x4b
-	.4byte	0x6c4c
+	.4byte	0x6c5c
 	.uleb128 0x4b
-	.4byte	0x6c4c
+	.4byte	0x6c5c
 	.uleb128 0x4c
 	.8byte	.LBB377
 	.8byte	.LBE377-.LBB377
 	.uleb128 0x4d
-	.4byte	0x6c57
+	.4byte	0x6c67
 	.uleb128 0x4d
-	.4byte	0x6c63
+	.4byte	0x6c73
 	.uleb128 0x4d
-	.4byte	0x6c6f
+	.4byte	0x6c7f
 	.uleb128 0x4d
-	.4byte	0x6c79
+	.4byte	0x6c89
 	.uleb128 0x4d
-	.4byte	0x6c83
+	.4byte	0x6c93
 	.uleb128 0x4d
-	.4byte	0x6c8d
+	.4byte	0x6c9d
 	.uleb128 0x4e
-	.4byte	0x6c97
-	.4byte	.LLST29
+	.4byte	0x6ca7
+	.4byte	.LLST30
 	.uleb128 0x4d
-	.4byte	0x6ca3
+	.4byte	0x6cb3
 	.uleb128 0x4d
-	.4byte	0x6caf
+	.4byte	0x6cbf
 	.uleb128 0x4a
-	.4byte	0x70df
+	.4byte	0x70ef
 	.8byte	.LBB378
 	.8byte	.LBE378-.LBB378
 	.byte	0x1
 	.2byte	0x109
-	.4byte	0x667c
+	.4byte	0x668c
 	.uleb128 0x4b
-	.4byte	0x70fc
+	.4byte	0x710c
 	.uleb128 0x4b
-	.4byte	0x70f0
+	.4byte	0x7100
 	.uleb128 0x55
-	.4byte	0x7109
+	.4byte	0x7119
 	.8byte	.LBB379
 	.8byte	.LBE379-.LBB379
 	.byte	0x2
 	.2byte	0x2e7
 	.uleb128 0x4b
-	.4byte	0x7126
+	.4byte	0x7136
 	.uleb128 0x4b
-	.4byte	0x711a
+	.4byte	0x712a
 	.uleb128 0x53
-	.8byte	.LVL109
-	.4byte	0x731c
+	.8byte	.LVL110
+	.4byte	0x732c
 	.byte	0
 	.byte	0
 	.uleb128 0x4c
 	.8byte	.LBB381
 	.8byte	.LBE381-.LBB381
 	.uleb128 0x4e
-	.4byte	0x6cbc
-	.4byte	.LLST30
-	.uleb128 0x4e
-	.4byte	0x6cc8
+	.4byte	0x6ccc
 	.4byte	.LLST31
+	.uleb128 0x4e
+	.4byte	0x6cd8
+	.4byte	.LLST32
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.8byte	.LVL81
-	.4byte	0x7328
+	.8byte	.LVL82
+	.4byte	0x7338
 	.uleb128 0x53
-	.8byte	.LVL95
-	.4byte	0x7328
+	.8byte	.LVL96
+	.4byte	0x7338
 	.uleb128 0x53
-	.8byte	.LVL108
-	.4byte	0x6cd6
+	.8byte	.LVL109
+	.4byte	0x6ce6
 	.byte	0
 	.byte	0
 	.uleb128 0x4a
-	.4byte	0x69ac
+	.4byte	0x69bc
 	.8byte	.LBB384
 	.8byte	.LBE384-.LBB384
 	.byte	0x1
 	.2byte	0x237
-	.4byte	0x673e
+	.4byte	0x674e
 	.uleb128 0x4b
-	.4byte	0x69bd
+	.4byte	0x69cd
 	.uleb128 0x4c
 	.8byte	.LBB385
 	.8byte	.LBE385-.LBB385
 	.uleb128 0x4d
-	.4byte	0x69c9
-	.uleb128 0x4e
-	.4byte	0x69d3
-	.4byte	.LLST32
+	.4byte	0x69d9
 	.uleb128 0x4e
-	.4byte	0x69df
+	.4byte	0x69e3
 	.4byte	.LLST33
 	.uleb128 0x4e
-	.4byte	0x69eb
+	.4byte	0x69ef
 	.4byte	.LLST34
+	.uleb128 0x4e
+	.4byte	0x69fb
+	.4byte	.LLST35
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x3a0
 	.uleb128 0x4e
-	.4byte	0x69f8
-	.4byte	.LLST35
+	.4byte	0x6a08
+	.4byte	.LLST36
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x4d
-	.4byte	0x6a05
+	.4byte	0x6a15
 	.uleb128 0x4d
-	.4byte	0x6a11
+	.4byte	0x6a21
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4a
-	.4byte	0x6ace
+	.4byte	0x6ade
 	.8byte	.LBB391
 	.8byte	.LBE391-.LBB391
 	.byte	0x1
 	.2byte	0x222
-	.4byte	0x6851
+	.4byte	0x6861
 	.uleb128 0x4b
-	.4byte	0x6adf
+	.4byte	0x6aef
 	.uleb128 0x4b
-	.4byte	0x6adf
+	.4byte	0x6aef
 	.uleb128 0x4b
-	.4byte	0x6aeb
+	.4byte	0x6afb
 	.uleb128 0x4c
 	.8byte	.LBB392
 	.8byte	.LBE392-.LBB392
 	.uleb128 0x4d
-	.4byte	0x6af7
+	.4byte	0x6b07
 	.uleb128 0x4e
-	.4byte	0x6b03
-	.4byte	.LLST36
+	.4byte	0x6b13
+	.4byte	.LLST37
 	.uleb128 0x4d
-	.4byte	0x6b0f
+	.4byte	0x6b1f
 	.uleb128 0x4a
-	.4byte	0x6d9e
+	.4byte	0x6dae
 	.8byte	.LBB393
 	.8byte	.LBE393-.LBB393
 	.byte	0x1
 	.2byte	0x172
-	.4byte	0x6842
+	.4byte	0x6852
 	.uleb128 0x4b
-	.4byte	0x6db9
+	.4byte	0x6dc9
 	.uleb128 0x4b
-	.4byte	0x6dae
+	.4byte	0x6dbe
 	.uleb128 0x4c
 	.8byte	.LBB394
 	.8byte	.LBE394-.LBB394
 	.uleb128 0x4e
-	.4byte	0x6dc4
-	.4byte	.LLST37
-	.uleb128 0x4e
-	.4byte	0x6dcf
+	.4byte	0x6dd4
 	.4byte	.LLST38
 	.uleb128 0x4e
-	.4byte	0x6dda
+	.4byte	0x6ddf
 	.4byte	.LLST39
+	.uleb128 0x4e
+	.4byte	0x6dea
+	.4byte	.LLST40
 	.uleb128 0x4d
-	.4byte	0x6de5
+	.4byte	0x6df5
 	.uleb128 0x4d
-	.4byte	0x6df0
+	.4byte	0x6e00
 	.uleb128 0x4d
-	.4byte	0x6dfa
+	.4byte	0x6e0a
 	.uleb128 0x4f
-	.4byte	0x6e06
+	.4byte	0x6e16
 	.8byte	.LBB395
 	.4byte	.Ldebug_ranges0+0x400
 	.byte	0x1
 	.byte	0xe4
 	.uleb128 0x4b
-	.4byte	0x6e21
+	.4byte	0x6e31
 	.uleb128 0x4b
-	.4byte	0x6e16
+	.4byte	0x6e26
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x400
 	.uleb128 0x4d
-	.4byte	0x6e2c
+	.4byte	0x6e3c
 	.uleb128 0x4d
-	.4byte	0x6e37
+	.4byte	0x6e47
 	.uleb128 0x51
 	.4byte	.Ldebug_ranges0+0x450
-	.4byte	0x682e
+	.4byte	0x683e
 	.uleb128 0x4d
-	.4byte	0x6e45
+	.4byte	0x6e55
 	.uleb128 0x4d
-	.4byte	0x6e50
+	.4byte	0x6e60
 	.byte	0
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x480
 	.uleb128 0x4d
-	.4byte	0x6e5d
+	.4byte	0x6e6d
 	.uleb128 0x4d
-	.4byte	0x6e68
+	.4byte	0x6e78
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.8byte	.LVL101
-	.4byte	0x6cd6
+	.8byte	.LVL102
+	.4byte	0x6ce6
 	.byte	0
 	.byte	0
 	.uleb128 0x4a
-	.4byte	0x6a20
+	.4byte	0x6a30
 	.8byte	.LBB410
 	.8byte	.LBE410-.LBB410
 	.byte	0x1
 	.2byte	0x22e
-	.4byte	0x6964
+	.4byte	0x6974
 	.uleb128 0x4b
-	.4byte	0x6a31
+	.4byte	0x6a41
 	.uleb128 0x4b
-	.4byte	0x6a31
+	.4byte	0x6a41
 	.uleb128 0x4b
-	.4byte	0x6a3d
+	.4byte	0x6a4d
 	.uleb128 0x4c
 	.8byte	.LBB411
 	.8byte	.LBE411-.LBB411
 	.uleb128 0x4d
-	.4byte	0x6a49
+	.4byte	0x6a59
 	.uleb128 0x4e
-	.4byte	0x6a55
-	.4byte	.LLST40
+	.4byte	0x6a65
+	.4byte	.LLST41
 	.uleb128 0x4d
-	.4byte	0x6a61
+	.4byte	0x6a71
 	.uleb128 0x4a
-	.4byte	0x6d9e
+	.4byte	0x6dae
 	.8byte	.LBB412
 	.8byte	.LBE412-.LBB412
 	.byte	0x1
 	.2byte	0x1af
-	.4byte	0x6955
+	.4byte	0x6965
 	.uleb128 0x4b
-	.4byte	0x6db9
+	.4byte	0x6dc9
 	.uleb128 0x4b
-	.4byte	0x6dae
+	.4byte	0x6dbe
 	.uleb128 0x4c
 	.8byte	.LBB413
 	.8byte	.LBE413-.LBB413
 	.uleb128 0x4e
-	.4byte	0x6dc4
-	.4byte	.LLST41
-	.uleb128 0x4e
-	.4byte	0x6dcf
+	.4byte	0x6dd4
 	.4byte	.LLST42
 	.uleb128 0x4e
-	.4byte	0x6dda
+	.4byte	0x6ddf
 	.4byte	.LLST43
+	.uleb128 0x4e
+	.4byte	0x6dea
+	.4byte	.LLST44
 	.uleb128 0x4d
-	.4byte	0x6de5
+	.4byte	0x6df5
 	.uleb128 0x4d
-	.4byte	0x6df0
+	.4byte	0x6e00
 	.uleb128 0x4d
-	.4byte	0x6dfa
+	.4byte	0x6e0a
 	.uleb128 0x4f
-	.4byte	0x6e06
+	.4byte	0x6e16
 	.8byte	.LBB414
 	.4byte	.Ldebug_ranges0+0x4d0
 	.byte	0x1
 	.byte	0xe4
 	.uleb128 0x4b
-	.4byte	0x6e21
+	.4byte	0x6e31
 	.uleb128 0x4b
-	.4byte	0x6e16
+	.4byte	0x6e26
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x4d0
 	.uleb128 0x4d
-	.4byte	0x6e2c
+	.4byte	0x6e3c
 	.uleb128 0x4d
-	.4byte	0x6e37
+	.4byte	0x6e47
 	.uleb128 0x51
 	.4byte	.Ldebug_ranges0+0x520
-	.4byte	0x6941
+	.4byte	0x6951
 	.uleb128 0x4d
-	.4byte	0x6e45
+	.4byte	0x6e55
 	.uleb128 0x4d
-	.4byte	0x6e50
+	.4byte	0x6e60
 	.byte	0
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x550
 	.uleb128 0x4d
-	.4byte	0x6e5d
+	.4byte	0x6e6d
 	.uleb128 0x4d
-	.4byte	0x6e68
+	.4byte	0x6e78
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.8byte	.LVL136
-	.4byte	0x6cd6
+	.8byte	.LVL137
+	.4byte	0x6ce6
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.8byte	.LVL61
-	.4byte	0x7328
+	.8byte	.LVL62
+	.4byte	0x7338
 	.uleb128 0x53
-	.8byte	.LVL118
-	.4byte	0x721f
+	.8byte	.LVL119
+	.4byte	0x722f
 	.uleb128 0x53
-	.8byte	.LVL122
-	.4byte	0x721f
+	.8byte	.LVL123
+	.4byte	0x722f
 	.uleb128 0x53
-	.8byte	.LVL129
-	.4byte	0x721f
+	.8byte	.LVL130
+	.4byte	0x722f
 	.uleb128 0x53
-	.8byte	.LVL139
-	.4byte	0x721f
+	.8byte	.LVL140
+	.4byte	0x722f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x600b
 	.uleb128 0x56
-	.4byte	.LASF1476
+	.4byte	.LASF1477
 	.byte	0x1
 	.2byte	0x1bd
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6a20
+	.4byte	0x6a30
 	.uleb128 0x57
 	.4byte	.LASF739
 	.byte	0x1
 	.2byte	0x1bd
-	.4byte	0x69a6
+	.4byte	0x69b6
 	.uleb128 0x49
 	.string	"i"
 	.byte	0x1
 	.2byte	0x1be
 	.4byte	0xc0
 	.uleb128 0x58
-	.4byte	.LASF1471
+	.4byte	.LASF1472
 	.byte	0x1
 	.2byte	0x1bf
 	.4byte	0x120
 	.uleb128 0x58
-	.4byte	.LASF1472
+	.4byte	.LASF1473
 	.byte	0x1
 	.2byte	0x1bf
 	.4byte	0x120
@@ -14096,18 +14103,18 @@ crc32_table:
 	.4byte	0xc0
 	.uleb128 0x59
 	.uleb128 0x58
-	.4byte	.LASF1473
+	.4byte	.LASF1474
 	.byte	0x1
 	.2byte	0x1c4
 	.4byte	0x2d56
 	.uleb128 0x59
 	.uleb128 0x58
-	.4byte	.LASF1474
+	.4byte	.LASF1475
 	.byte	0x1
 	.2byte	0x1c7
 	.4byte	0x100
 	.uleb128 0x58
-	.4byte	.LASF1475
+	.4byte	.LASF1476
 	.byte	0x1
 	.2byte	0x1c8
 	.4byte	0x100
@@ -14115,27 +14122,27 @@ crc32_table:
 	.byte	0
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1477
+	.4byte	.LASF1478
 	.byte	0x1
 	.2byte	0x1a9
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6a6e
+	.4byte	0x6a7e
 	.uleb128 0x57
 	.4byte	.LASF1466
 	.byte	0x1
 	.2byte	0x1a9
-	.4byte	0x69a6
+	.4byte	0x69b6
 	.uleb128 0x57
-	.4byte	.LASF1478
+	.4byte	.LASF1479
 	.byte	0x1
 	.2byte	0x1a9
 	.4byte	0xc0
 	.uleb128 0x58
-	.4byte	.LASF1479
+	.4byte	.LASF1480
 	.byte	0x1
 	.2byte	0x1ab
-	.4byte	0x6a6e
+	.4byte	0x6a7e
 	.uleb128 0x58
 	.4byte	.LASF1432
 	.byte	0x1
@@ -14151,32 +14158,32 @@ crc32_table:
 	.byte	0x8
 	.4byte	0x97
 	.uleb128 0x56
-	.4byte	.LASF1480
+	.4byte	.LASF1481
 	.byte	0x1
 	.2byte	0x180
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6ace
+	.4byte	0x6ade
 	.uleb128 0x57
 	.4byte	.LASF1466
 	.byte	0x1
 	.2byte	0x180
-	.4byte	0x69a6
+	.4byte	0x69b6
 	.uleb128 0x57
-	.4byte	.LASF1478
+	.4byte	.LASF1479
 	.byte	0x1
 	.2byte	0x180
 	.4byte	0xc0
 	.uleb128 0x58
-	.4byte	.LASF1481
+	.4byte	.LASF1482
 	.byte	0x1
 	.2byte	0x182
 	.4byte	0x600b
 	.uleb128 0x58
-	.4byte	.LASF1479
+	.4byte	.LASF1480
 	.byte	0x1
 	.2byte	0x183
-	.4byte	0x6a6e
+	.4byte	0x6a7e
 	.uleb128 0x58
 	.4byte	.LASF1432
 	.byte	0x1
@@ -14189,27 +14196,27 @@ crc32_table:
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1482
+	.4byte	.LASF1483
 	.byte	0x1
 	.2byte	0x16b
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6b1c
+	.4byte	0x6b2c
 	.uleb128 0x57
 	.4byte	.LASF1466
 	.byte	0x1
 	.2byte	0x16b
-	.4byte	0x69a6
+	.4byte	0x69b6
 	.uleb128 0x57
-	.4byte	.LASF1478
+	.4byte	.LASF1479
 	.byte	0x1
 	.2byte	0x16b
 	.4byte	0xc0
 	.uleb128 0x58
-	.4byte	.LASF1479
+	.4byte	.LASF1480
 	.byte	0x1
 	.2byte	0x16d
-	.4byte	0x6a6e
+	.4byte	0x6a7e
 	.uleb128 0x58
 	.4byte	.LASF1432
 	.byte	0x1
@@ -14222,19 +14229,19 @@ crc32_table:
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1483
+	.4byte	.LASF1484
 	.byte	0x1
 	.2byte	0x156
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6b76
+	.4byte	0x6b86
 	.uleb128 0x57
 	.4byte	.LASF1466
 	.byte	0x1
 	.2byte	0x156
-	.4byte	0x69a6
+	.4byte	0x69b6
 	.uleb128 0x57
-	.4byte	.LASF1478
+	.4byte	.LASF1479
 	.byte	0x1
 	.2byte	0x156
 	.4byte	0xc0
@@ -14244,10 +14251,10 @@ crc32_table:
 	.2byte	0x156
 	.4byte	0x6042
 	.uleb128 0x58
-	.4byte	.LASF1479
+	.4byte	.LASF1480
 	.byte	0x1
 	.2byte	0x158
-	.4byte	0x6a6e
+	.4byte	0x6a7e
 	.uleb128 0x58
 	.4byte	.LASF1432
 	.byte	0x1
@@ -14260,32 +14267,32 @@ crc32_table:
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1484
+	.4byte	.LASF1485
 	.byte	0x1
 	.2byte	0x137
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6bd0
+	.4byte	0x6be0
 	.uleb128 0x57
 	.4byte	.LASF1466
 	.byte	0x1
 	.2byte	0x137
-	.4byte	0x69a6
+	.4byte	0x69b6
 	.uleb128 0x57
-	.4byte	.LASF1478
+	.4byte	.LASF1479
 	.byte	0x1
 	.2byte	0x137
 	.4byte	0xc0
 	.uleb128 0x58
-	.4byte	.LASF1481
+	.4byte	.LASF1482
 	.byte	0x1
 	.2byte	0x139
 	.4byte	0x600b
 	.uleb128 0x58
-	.4byte	.LASF1479
+	.4byte	.LASF1480
 	.byte	0x1
 	.2byte	0x13a
-	.4byte	0x6a6e
+	.4byte	0x6a7e
 	.uleb128 0x58
 	.4byte	.LASF1432
 	.byte	0x1
@@ -14298,43 +14305,43 @@ crc32_table:
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x5a
-	.4byte	.LASF1512
+	.4byte	.LASF1513
 	.byte	0x1
 	.2byte	0x11e
 	.byte	0x1
-	.4byte	0x6c3c
+	.4byte	0x6c4c
 	.uleb128 0x57
-	.4byte	.LASF1481
+	.4byte	.LASF1482
 	.byte	0x1
 	.2byte	0x11e
-	.4byte	0x69a6
+	.4byte	0x69b6
 	.uleb128 0x57
 	.4byte	.LASF1466
 	.byte	0x1
 	.2byte	0x11f
-	.4byte	0x69a6
+	.4byte	0x69b6
 	.uleb128 0x58
-	.4byte	.LASF1485
+	.4byte	.LASF1486
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0xc0
 	.uleb128 0x58
-	.4byte	.LASF1486
+	.4byte	.LASF1487
 	.byte	0x1
 	.2byte	0x122
 	.4byte	0x3326
 	.uleb128 0x58
-	.4byte	.LASF1487
+	.4byte	.LASF1488
 	.byte	0x1
 	.2byte	0x122
 	.4byte	0x3326
 	.uleb128 0x58
-	.4byte	.LASF1478
+	.4byte	.LASF1479
 	.byte	0x1
 	.2byte	0x123
 	.4byte	0xc0
 	.uleb128 0x58
-	.4byte	.LASF1488
+	.4byte	.LASF1489
 	.byte	0x1
 	.2byte	0x123
 	.4byte	0xc0
@@ -14345,24 +14352,24 @@ crc32_table:
 	.4byte	0xc0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.LASF1489
+	.4byte	.LASF1490
 	.byte	0x1
 	.byte	0xfe
 	.4byte	0x2d56
 	.byte	0x1
-	.4byte	0x6cd6
+	.4byte	0x6ce6
 	.uleb128 0x5c
-	.4byte	.LASF1481
+	.4byte	.LASF1482
 	.byte	0x1
 	.byte	0xfe
-	.4byte	0x69a6
+	.4byte	0x69b6
 	.uleb128 0x58
-	.4byte	.LASF1486
+	.4byte	.LASF1487
 	.byte	0x1
 	.2byte	0x100
 	.4byte	0x2d56
 	.uleb128 0x58
-	.4byte	.LASF1487
+	.4byte	.LASF1488
 	.byte	0x1
 	.2byte	0x100
 	.4byte	0x2d56
@@ -14387,7 +14394,7 @@ crc32_table:
 	.2byte	0x101
 	.4byte	0xc0
 	.uleb128 0x58
-	.4byte	.LASF1490
+	.4byte	.LASF1491
 	.byte	0x1
 	.2byte	0x102
 	.4byte	0xc0
@@ -14403,19 +14410,19 @@ crc32_table:
 	.4byte	0xc0
 	.uleb128 0x59
 	.uleb128 0x58
-	.4byte	.LASF1478
+	.4byte	.LASF1479
 	.byte	0x1
 	.2byte	0x110
 	.4byte	0xc0
 	.uleb128 0x58
-	.4byte	.LASF1488
+	.4byte	.LASF1489
 	.byte	0x1
 	.2byte	0x111
 	.4byte	0xc0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	.LASF1538
+	.4byte	.LASF1539
 	.byte	0x1
 	.byte	0xf0
 	.4byte	0x2d56
@@ -14423,12 +14430,12 @@ crc32_table:
 	.8byte	.LFE1556-.LFB1556
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6d7c
+	.4byte	0x6d8c
 	.uleb128 0x5e
-	.4byte	.LASF1479
+	.4byte	.LASF1480
 	.byte	0x1
 	.byte	0xf0
-	.4byte	0x6a6e
+	.4byte	0x6a7e
 	.4byte	.LLST0
 	.uleb128 0x5e
 	.4byte	.LASF1443
@@ -14440,62 +14447,62 @@ crc32_table:
 	.string	"out"
 	.byte	0x1
 	.byte	0xf3
-	.4byte	0x6d7c
+	.4byte	0x6d8c
 	.uleb128 0x60
-	.4byte	0x70df
+	.4byte	0x70ef
 	.8byte	.LBB205
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
 	.byte	0xf5
-	.4byte	0x6d6e
+	.4byte	0x6d7e
 	.uleb128 0x4b
-	.4byte	0x70fc
+	.4byte	0x710c
 	.uleb128 0x4b
-	.4byte	0x70f0
+	.4byte	0x7100
 	.uleb128 0x61
-	.4byte	0x7109
+	.4byte	0x7119
 	.8byte	.LBB206
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x2
 	.2byte	0x2e7
 	.uleb128 0x4b
-	.4byte	0x7126
+	.4byte	0x7136
 	.uleb128 0x4b
-	.4byte	0x711a
+	.4byte	0x712a
 	.uleb128 0x53
 	.8byte	.LVL3
-	.4byte	0x731c
+	.4byte	0x732c
 	.byte	0
 	.byte	0
 	.uleb128 0x53
 	.8byte	.LVL4
-	.4byte	0x7333
+	.4byte	0x7343
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x90
 	.uleb128 0x5b
-	.4byte	.LASF1491
+	.4byte	.LASF1492
 	.byte	0x1
 	.byte	0xeb
 	.4byte	0x90
 	.byte	0x3
-	.4byte	0x6d9e
+	.4byte	0x6dae
 	.uleb128 0x5c
-	.4byte	.LASF1479
+	.4byte	.LASF1480
 	.byte	0x1
 	.byte	0xeb
-	.4byte	0x6a6e
+	.4byte	0x6a7e
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.LASF1492
+	.4byte	.LASF1493
 	.byte	0x1
 	.byte	0xba
-	.4byte	0x6a6e
+	.4byte	0x6a7e
 	.byte	0x1
-	.4byte	0x6e06
+	.4byte	0x6e16
 	.uleb128 0x5c
-	.4byte	.LASF1478
+	.4byte	.LASF1479
 	.byte	0x1
 	.byte	0xba
 	.4byte	0xc0
@@ -14505,7 +14512,7 @@ crc32_table:
 	.byte	0xba
 	.4byte	0xc0
 	.uleb128 0x62
-	.4byte	.LASF1493
+	.4byte	.LASF1494
 	.byte	0x1
 	.byte	0xbc
 	.4byte	0x61c8
@@ -14515,12 +14522,12 @@ crc32_table:
 	.byte	0xbd
 	.4byte	0x2d56
 	.uleb128 0x62
-	.4byte	.LASF1494
+	.4byte	.LASF1495
 	.byte	0x1
 	.byte	0xbe
 	.4byte	0x1e1
 	.uleb128 0x62
-	.4byte	.LASF1495
+	.4byte	.LASF1496
 	.byte	0x1
 	.byte	0xbf
 	.4byte	0x6c
@@ -14530,25 +14537,25 @@ crc32_table:
 	.byte	0xc0
 	.4byte	0x6c
 	.uleb128 0x62
-	.4byte	.LASF1479
+	.4byte	.LASF1480
 	.byte	0x1
 	.byte	0xc1
 	.4byte	0x442
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.LASF1496
+	.4byte	.LASF1497
 	.byte	0x1
 	.byte	0xa8
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6e75
+	.4byte	0x6e85
 	.uleb128 0x5c
 	.4byte	.LASF856
 	.byte	0x1
 	.byte	0xa8
 	.4byte	0x1e1
 	.uleb128 0x5c
-	.4byte	.LASF1478
+	.4byte	.LASF1479
 	.byte	0x1
 	.byte	0xa8
 	.4byte	0xc0
@@ -14563,33 +14570,33 @@ crc32_table:
 	.byte	0xab
 	.4byte	0xc0
 	.uleb128 0x63
-	.4byte	0x6e5c
+	.4byte	0x6e6c
 	.uleb128 0x62
-	.4byte	.LASF1497
+	.4byte	.LASF1498
 	.byte	0x1
 	.byte	0xad
 	.4byte	0xc0
 	.uleb128 0x62
-	.4byte	.LASF1498
+	.4byte	.LASF1499
 	.byte	0x1
 	.byte	0xad
 	.4byte	0xc0
 	.byte	0
 	.uleb128 0x59
 	.uleb128 0x62
-	.4byte	.LASF1499
+	.4byte	.LASF1500
 	.byte	0x1
 	.byte	0xae
 	.4byte	0xc0
 	.uleb128 0x62
-	.4byte	.LASF1500
+	.4byte	.LASF1501
 	.byte	0x1
 	.byte	0xae
 	.4byte	0xc0
 	.byte	0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF1539
+	.4byte	.LASF1540
 	.byte	0x1
 	.byte	0xa0
 	.4byte	0x55
@@ -14598,7 +14605,7 @@ crc32_table:
 	.uleb128 0x1
 	.byte	0x9c
 	.uleb128 0x65
-	.4byte	.LASF1502
+	.4byte	.LASF1503
 	.byte	0x1
 	.byte	0x7f
 	.4byte	0xc0
@@ -14606,9 +14613,9 @@ crc32_table:
 	.8byte	.LFE1551-.LFB1551
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x700b
+	.4byte	0x701b
 	.uleb128 0x5e
-	.4byte	.LASF1503
+	.4byte	.LASF1504
 	.byte	0x1
 	.byte	0x7f
 	.4byte	0x442
@@ -14624,131 +14631,131 @@ crc32_table:
 	.byte	0x82
 	.4byte	0x61c8
 	.uleb128 0x60
-	.4byte	0x703d
+	.4byte	0x704d
 	.8byte	.LBB246
 	.4byte	.Ldebug_ranges0+0x120
 	.byte	0x1
 	.byte	0x87
-	.4byte	0x6f0e
+	.4byte	0x6f1e
 	.uleb128 0x4b
-	.4byte	0x704d
+	.4byte	0x705d
 	.uleb128 0x53
 	.8byte	.LVL35
-	.4byte	0x733c
+	.4byte	0x734c
 	.uleb128 0x53
 	.8byte	.LVL56
-	.4byte	0x7347
+	.4byte	0x7357
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x700b
+	.4byte	0x701b
 	.8byte	.LBB249
 	.4byte	.Ldebug_ranges0+0x150
 	.byte	0x1
 	.byte	0x8d
-	.4byte	0x6fe3
+	.4byte	0x6ff3
 	.uleb128 0x4b
-	.4byte	0x701b
+	.4byte	0x702b
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x150
 	.uleb128 0x4d
-	.4byte	0x7026
+	.4byte	0x7036
 	.uleb128 0x4e
-	.4byte	0x7031
+	.4byte	0x7041
 	.4byte	.LLST9
 	.uleb128 0x66
-	.4byte	0x7059
+	.4byte	0x7069
 	.8byte	.LBB251
 	.8byte	.LBE251-.LBB251
 	.byte	0x1
 	.byte	0x6e
-	.4byte	0x6fd4
+	.4byte	0x6fe4
 	.uleb128 0x4b
-	.4byte	0x7074
+	.4byte	0x7084
 	.uleb128 0x4b
-	.4byte	0x7069
+	.4byte	0x7079
 	.uleb128 0x4c
 	.8byte	.LBB252
 	.8byte	.LBE252-.LBB252
 	.uleb128 0x4d
-	.4byte	0x707f
+	.4byte	0x708f
 	.uleb128 0x4e
-	.4byte	0x7088
+	.4byte	0x7098
 	.4byte	.LLST10
 	.uleb128 0x60
-	.4byte	0x7094
+	.4byte	0x70a4
 	.8byte	.LBB253
 	.4byte	.Ldebug_ranges0+0x180
 	.byte	0x1
 	.byte	0x54
-	.4byte	0x6fc5
+	.4byte	0x6fd5
 	.uleb128 0x4b
-	.4byte	0x70ab
+	.4byte	0x70bb
 	.uleb128 0x4b
-	.4byte	0x70a0
+	.4byte	0x70b0
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x180
 	.uleb128 0x4d
-	.4byte	0x70b6
+	.4byte	0x70c6
 	.uleb128 0x4d
-	.4byte	0x70bf
+	.4byte	0x70cf
 	.uleb128 0x4e
-	.4byte	0x70c8
+	.4byte	0x70d8
 	.4byte	.LLST11
 	.uleb128 0x4e
-	.4byte	0x70d3
+	.4byte	0x70e3
 	.4byte	.LLST12
 	.byte	0
 	.byte	0
 	.uleb128 0x53
 	.8byte	.LVL36
-	.4byte	0x7352
+	.4byte	0x7362
 	.byte	0
 	.byte	0
 	.uleb128 0x53
 	.8byte	.LVL51
-	.4byte	0x7347
+	.4byte	0x7357
 	.byte	0
 	.byte	0
 	.uleb128 0x53
 	.8byte	.LVL45
-	.4byte	0x7347
+	.4byte	0x7357
 	.uleb128 0x53
 	.8byte	.LVL52
-	.4byte	0x7347
+	.4byte	0x7357
 	.uleb128 0x53
 	.8byte	.LVL57
-	.4byte	0x7347
+	.4byte	0x7357
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.LASF1504
+	.4byte	.LASF1505
 	.byte	0x1
 	.byte	0x65
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x703d
+	.4byte	0x704d
 	.uleb128 0x5c
-	.4byte	.LASF1493
+	.4byte	.LASF1494
 	.byte	0x1
 	.byte	0x65
 	.4byte	0x61c8
 	.uleb128 0x62
-	.4byte	.LASF1505
+	.4byte	.LASF1506
 	.byte	0x1
 	.byte	0x67
 	.4byte	0x120
 	.uleb128 0x62
-	.4byte	.LASF1506
+	.4byte	.LASF1507
 	.byte	0x1
 	.byte	0x68
 	.4byte	0x120
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.LASF1507
+	.4byte	.LASF1508
 	.byte	0x1
 	.byte	0x5b
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x7059
+	.4byte	0x7069
 	.uleb128 0x67
 	.string	"buf"
 	.byte	0x1
@@ -14756,19 +14763,19 @@ crc32_table:
 	.4byte	0x603c
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.LASF1508
+	.4byte	.LASF1509
 	.byte	0x1
 	.byte	0x4e
 	.4byte	0x6c
 	.byte	0x1
-	.4byte	0x7094
+	.4byte	0x70a4
 	.uleb128 0x5c
-	.4byte	.LASF1509
+	.4byte	.LASF1510
 	.byte	0x1
 	.byte	0x4e
-	.4byte	0x6d7c
+	.4byte	0x6d8c
 	.uleb128 0x5c
-	.4byte	.LASF1510
+	.4byte	.LASF1511
 	.byte	0x1
 	.byte	0x4e
 	.4byte	0x6c
@@ -14778,24 +14785,24 @@ crc32_table:
 	.byte	0x50
 	.4byte	0x6c
 	.uleb128 0x62
-	.4byte	.LASF1511
+	.4byte	.LASF1512
 	.byte	0x1
 	.byte	0x51
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x68
-	.4byte	.LASF1513
+	.4byte	.LASF1514
 	.byte	0x1
 	.byte	0x3a
 	.byte	0x1
-	.4byte	0x70df
+	.4byte	0x70ef
 	.uleb128 0x5c
-	.4byte	.LASF1514
+	.4byte	.LASF1515
 	.byte	0x1
 	.byte	0x3a
 	.4byte	0x6c
 	.uleb128 0x5c
-	.4byte	.LASF1515
+	.4byte	.LASF1516
 	.byte	0x1
 	.byte	0x3a
 	.4byte	0x2d56
@@ -14810,23 +14817,23 @@ crc32_table:
 	.byte	0x3c
 	.4byte	0x6c
 	.uleb128 0x62
-	.4byte	.LASF1516
+	.4byte	.LASF1517
 	.byte	0x1
 	.byte	0x3d
 	.4byte	0x6c
 	.uleb128 0x62
-	.4byte	.LASF1511
+	.4byte	.LASF1512
 	.byte	0x1
 	.byte	0x3e
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1517
+	.4byte	.LASF1518
 	.byte	0x2
 	.2byte	0x2e5
 	.4byte	0x442
 	.byte	0x3
-	.4byte	0x7109
+	.4byte	0x7119
 	.uleb128 0x57
 	.4byte	.LASF826
 	.byte	0x2
@@ -14839,12 +14846,12 @@ crc32_table:
 	.4byte	0x277
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1518
+	.4byte	.LASF1519
 	.byte	0x2
 	.2byte	0x216
 	.4byte	0x442
 	.byte	0x3
-	.4byte	0x7141
+	.4byte	0x7151
 	.uleb128 0x57
 	.4byte	.LASF826
 	.byte	0x2
@@ -14864,12 +14871,12 @@ crc32_table:
 	.byte	0
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1519
+	.4byte	.LASF1520
 	.byte	0x2
 	.2byte	0x1dd
 	.4byte	0x442
 	.byte	0x3
-	.4byte	0x7177
+	.4byte	0x7187
 	.uleb128 0x57
 	.4byte	.LASF826
 	.byte	0x2
@@ -14881,18 +14888,18 @@ crc32_table:
 	.2byte	0x1dd
 	.4byte	0x277
 	.uleb128 0x58
-	.4byte	.LASF1520
+	.4byte	.LASF1521
 	.byte	0x2
 	.2byte	0x1df
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1521
+	.4byte	.LASF1522
 	.byte	0x2
 	.2byte	0x159
 	.4byte	0x6c
 	.byte	0x3
-	.4byte	0x7195
+	.4byte	0x71a5
 	.uleb128 0x57
 	.4byte	.LASF826
 	.byte	0x2
@@ -14900,12 +14907,12 @@ crc32_table:
 	.4byte	0x261
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1522
+	.4byte	.LASF1523
 	.byte	0x2
 	.2byte	0x13d
 	.4byte	0x5f61
 	.byte	0x3
-	.4byte	0x71b3
+	.4byte	0x71c3
 	.uleb128 0x57
 	.4byte	.LASF61
 	.byte	0x2
@@ -14913,12 +14920,12 @@ crc32_table:
 	.4byte	0x277
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.LASF1523
+	.4byte	.LASF1524
 	.byte	0x60
 	.byte	0x1d
 	.4byte	0xc0
 	.byte	0x3
-	.4byte	0x71cf
+	.4byte	0x71df
 	.uleb128 0x5c
 	.4byte	.LASF826
 	.byte	0x60
@@ -14926,12 +14933,12 @@ crc32_table:
 	.4byte	0x2d
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.LASF1524
+	.4byte	.LASF1525
 	.byte	0x61
 	.byte	0x22
 	.4byte	0xc0
 	.byte	0x3
-	.4byte	0x71e9
+	.4byte	0x71f9
 	.uleb128 0x67
 	.string	"n"
 	.byte	0x61
@@ -14939,12 +14946,12 @@ crc32_table:
 	.4byte	0x136
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.LASF1525
+	.4byte	.LASF1526
 	.byte	0x62
 	.byte	0x1b
 	.4byte	0xc0
 	.byte	0x3
-	.4byte	0x7203
+	.4byte	0x7213
 	.uleb128 0x67
 	.string	"x"
 	.byte	0x62
@@ -14952,100 +14959,100 @@ crc32_table:
 	.4byte	0xe4
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.LASF1526
+	.4byte	.LASF1527
 	.byte	0x63
 	.byte	0xb
 	.4byte	0x2d
 	.byte	0x3
-	.4byte	0x721f
+	.4byte	0x722f
 	.uleb128 0x5c
-	.4byte	.LASF1527
+	.4byte	.LASF1528
 	.byte	0x63
 	.byte	0xb
 	.4byte	0x2d
 	.byte	0
 	.uleb128 0x69
-	.4byte	0x6b1c
+	.4byte	0x6b2c
 	.8byte	.LFB1569
 	.8byte	.LFE1569-.LFB1569
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x731c
+	.4byte	0x732c
 	.uleb128 0x6a
-	.4byte	0x6b39
+	.4byte	0x6b49
 	.4byte	.LLST2
 	.uleb128 0x6a
-	.4byte	0x6b45
+	.4byte	0x6b55
 	.4byte	.LLST3
 	.uleb128 0x4b
-	.4byte	0x6b2d
+	.4byte	0x6b3d
 	.uleb128 0x4b
-	.4byte	0x6b2d
+	.4byte	0x6b3d
 	.uleb128 0x4d
-	.4byte	0x6b51
+	.4byte	0x6b61
 	.uleb128 0x4e
-	.4byte	0x6b5d
+	.4byte	0x6b6d
 	.4byte	.LLST4
 	.uleb128 0x4d
-	.4byte	0x6b69
+	.4byte	0x6b79
 	.uleb128 0x54
-	.4byte	0x6d9e
+	.4byte	0x6dae
 	.8byte	.LBB222
 	.4byte	.Ldebug_ranges0+0x40
 	.byte	0x1
 	.2byte	0x15d
-	.4byte	0x730e
+	.4byte	0x731e
 	.uleb128 0x4b
-	.4byte	0x6db9
+	.4byte	0x6dc9
 	.uleb128 0x4b
-	.4byte	0x6dae
+	.4byte	0x6dbe
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x40
 	.uleb128 0x4e
-	.4byte	0x6dc4
+	.4byte	0x6dd4
 	.4byte	.LLST5
 	.uleb128 0x4e
-	.4byte	0x6dcf
+	.4byte	0x6ddf
 	.4byte	.LLST6
 	.uleb128 0x4e
-	.4byte	0x6dda
+	.4byte	0x6dea
 	.4byte	.LLST7
 	.uleb128 0x4d
-	.4byte	0x6de5
+	.4byte	0x6df5
 	.uleb128 0x4d
-	.4byte	0x6df0
+	.4byte	0x6e00
 	.uleb128 0x4d
-	.4byte	0x6dfa
+	.4byte	0x6e0a
 	.uleb128 0x4f
-	.4byte	0x6e06
+	.4byte	0x6e16
 	.8byte	.LBB224
 	.4byte	.Ldebug_ranges0+0x90
 	.byte	0x1
 	.byte	0xe4
 	.uleb128 0x4b
-	.4byte	0x6e21
+	.4byte	0x6e31
 	.uleb128 0x4b
-	.4byte	0x6e16
+	.4byte	0x6e26
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x90
 	.uleb128 0x4d
-	.4byte	0x6e2c
+	.4byte	0x6e3c
 	.uleb128 0x4d
-	.4byte	0x6e37
+	.4byte	0x6e47
 	.uleb128 0x51
 	.4byte	.Ldebug_ranges0+0xc0
-	.4byte	0x72fa
+	.4byte	0x730a
 	.uleb128 0x4d
-	.4byte	0x6e45
+	.4byte	0x6e55
 	.uleb128 0x4d
-	.4byte	0x6e50
+	.4byte	0x6e60
 	.byte	0
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x4d
-	.4byte	0x6e5d
+	.4byte	0x6e6d
 	.uleb128 0x4d
-	.4byte	0x6e68
+	.4byte	0x6e78
 	.byte	0
 	.byte	0
 	.byte	0
@@ -15053,34 +15060,34 @@ crc32_table:
 	.byte	0
 	.uleb128 0x53
 	.8byte	.LVL19
-	.4byte	0x6cd6
+	.4byte	0x6ce6
 	.byte	0
 	.uleb128 0x6b
-	.4byte	.LASF1528
-	.4byte	.LASF1528
+	.4byte	.LASF1529
+	.4byte	.LASF1529
 	.byte	0x2
 	.2byte	0x184
 	.uleb128 0x6c
-	.4byte	.LASF1529
-	.4byte	.LASF1529
+	.4byte	.LASF1530
+	.4byte	.LASF1530
 	.byte	0x2
 	.byte	0xb9
 	.uleb128 0x6d
-	.4byte	.LASF1532
-	.4byte	.LASF1532
+	.4byte	.LASF1533
+	.4byte	.LASF1533
 	.uleb128 0x6c
-	.4byte	.LASF1530
-	.4byte	.LASF1530
+	.4byte	.LASF1531
+	.4byte	.LASF1531
 	.byte	0x64
 	.byte	0x1e
 	.uleb128 0x6c
-	.4byte	.LASF1531
-	.4byte	.LASF1531
+	.4byte	.LASF1532
+	.4byte	.LASF1532
 	.byte	0xe
 	.byte	0xb0
 	.uleb128 0x6d
-	.4byte	.LASF1533
-	.4byte	.LASF1533
+	.4byte	.LASF1534
+	.4byte	.LASF1534
 	.byte	0
 	.section	.debug_abbrev,"",@progbits
 .Ldebug_abbrev0:
@@ -16542,30 +16549,30 @@ crc32_table:
 .Ldebug_loc0:
 .LLST13:
 	.8byte	.LVL58-.Ltext0
-	.8byte	.LVL60-.Ltext0
+	.8byte	.LVL61-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL60-.Ltext0
-	.8byte	.LVL89-.Ltext0
+	.8byte	.LVL61-.Ltext0
+	.8byte	.LVL90-.Ltext0
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL91-.Ltext0
 	.8byte	.LVL92-.Ltext0
+	.8byte	.LVL93-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL92-.Ltext0
-	.8byte	.LVL123-.Ltext0
+	.8byte	.LVL93-.Ltext0
+	.8byte	.LVL124-.Ltext0
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL123-.Ltext0
 	.8byte	.LVL124-.Ltext0
+	.8byte	.LVL125-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL125-.Ltext0
 	.8byte	.LVL126-.Ltext0
+	.8byte	.LVL127-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL127-.Ltext0
+	.8byte	.LVL128-.Ltext0
 	.8byte	.LFE1565-.Ltext0
 	.2byte	0x1
 	.byte	0x63
@@ -16573,38 +16580,38 @@ crc32_table:
 	.8byte	0
 .LLST14:
 	.8byte	.LVL58-.Ltext0
-	.8byte	.LVL59-.Ltext0
+	.8byte	.LVL60-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL59-.Ltext0
-	.8byte	.LVL63-.Ltext0
+	.8byte	.LVL60-.Ltext0
+	.8byte	.LVL64-.Ltext0
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL87-.Ltext0
-	.8byte	.LVL92-.Ltext0
+	.8byte	.LVL88-.Ltext0
+	.8byte	.LVL93-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL95-.Ltext0
-	.8byte	.LVL100-.Ltext0
+	.8byte	.LVL96-.Ltext0
+	.8byte	.LVL101-.Ltext0
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL102-.Ltext0
-	.8byte	.LVL107-.Ltext0
+	.8byte	.LVL103-.Ltext0
+	.8byte	.LVL108-.Ltext0
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL115-.Ltext0
-	.8byte	.LVL119-.Ltext0
+	.8byte	.LVL116-.Ltext0
+	.8byte	.LVL120-.Ltext0
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL120-.Ltext0
-	.8byte	.LVL123-.Ltext0
+	.8byte	.LVL121-.Ltext0
+	.8byte	.LVL124-.Ltext0
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL123-.Ltext0
-	.8byte	.LVL127-.Ltext0
+	.8byte	.LVL124-.Ltext0
+	.8byte	.LVL128-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL127-.Ltext0
+	.8byte	.LVL128-.Ltext0
 	.8byte	.LFE1565-.Ltext0
 	.2byte	0x1
 	.byte	0x64
@@ -16612,343 +16619,350 @@ crc32_table:
 	.8byte	0
 .LLST15:
 	.8byte	.LVL58-.Ltext0
-	.8byte	.LVL61-1-.Ltext0
+	.8byte	.LVL62-1-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL62-.Ltext0
-	.8byte	.LVL66-.Ltext0
+	.8byte	.LVL63-.Ltext0
+	.8byte	.LVL67-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL87-.Ltext0
-	.8byte	.LVL92-.Ltext0
+	.8byte	.LVL88-.Ltext0
+	.8byte	.LVL93-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL95-.Ltext0
-	.8byte	.LVL97-.Ltext0
+	.8byte	.LVL96-.Ltext0
+	.8byte	.LVL98-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL102-.Ltext0
 	.8byte	.LVL103-.Ltext0
+	.8byte	.LVL104-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL116-.Ltext0
 	.8byte	.LVL117-.Ltext0
+	.8byte	.LVL118-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL120-.Ltext0
 	.8byte	.LVL121-.Ltext0
+	.8byte	.LVL122-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL123-.Ltext0
-	.8byte	.LVL128-.Ltext0
+	.8byte	.LVL124-.Ltext0
+	.8byte	.LVL129-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL130-.Ltext0
 	.8byte	.LVL131-.Ltext0
+	.8byte	.LVL132-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL137-.Ltext0
 	.8byte	.LVL138-.Ltext0
+	.8byte	.LVL139-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST16:
-	.8byte	.LVL64-.Ltext0
-	.8byte	.LVL68-.Ltext0
+	.8byte	.LVL58-.Ltext0
+	.8byte	.LVL59-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST17:
+	.8byte	.LVL65-.Ltext0
+	.8byte	.LVL69-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL93-.Ltext0
 	.8byte	.LVL94-.Ltext0
+	.8byte	.LVL95-.Ltext0
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST17:
-	.8byte	.LVL66-.Ltext0
+.LLST18:
 	.8byte	.LVL67-.Ltext0
+	.8byte	.LVL68-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL93-.Ltext0
 	.8byte	.LVL94-.Ltext0
+	.8byte	.LVL95-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST18:
-	.8byte	.LVL65-.Ltext0
-	.8byte	.LVL69-1-.Ltext0
+.LLST19:
+	.8byte	.LVL66-.Ltext0
+	.8byte	.LVL70-1-.Ltext0
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL93-.Ltext0
 	.8byte	.LVL94-.Ltext0
+	.8byte	.LVL95-.Ltext0
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST19:
-	.8byte	.LVL70-.Ltext0
-	.8byte	.LVL75-.Ltext0
+.LLST20:
+	.8byte	.LVL71-.Ltext0
+	.8byte	.LVL76-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL92-.Ltext0
 	.8byte	.LVL93-.Ltext0
+	.8byte	.LVL94-.Ltext0
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST20:
-	.8byte	.LVL72-.Ltext0
-	.8byte	.LVL74-.Ltext0
+.LLST21:
+	.8byte	.LVL73-.Ltext0
+	.8byte	.LVL75-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL92-.Ltext0
 	.8byte	.LVL93-.Ltext0
+	.8byte	.LVL94-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST21:
-	.8byte	.LVL71-.Ltext0
-	.8byte	.LVL73-.Ltext0
+.LLST22:
+	.8byte	.LVL72-.Ltext0
+	.8byte	.LVL74-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL92-.Ltext0
 	.8byte	.LVL93-.Ltext0
+	.8byte	.LVL94-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST22:
-	.8byte	.LVL77-.Ltext0
-	.8byte	.LVL81-1-.Ltext0
+.LLST23:
+	.8byte	.LVL78-.Ltext0
+	.8byte	.LVL82-1-.Ltext0
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST23:
-	.8byte	.LVL79-.Ltext0
-	.8byte	.LVL81-1-.Ltext0
+.LLST24:
+	.8byte	.LVL80-.Ltext0
+	.8byte	.LVL82-1-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST24:
-	.8byte	.LVL78-.Ltext0
-	.8byte	.LVL81-1-.Ltext0
+.LLST25:
+	.8byte	.LVL79-.Ltext0
+	.8byte	.LVL82-1-.Ltext0
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST25:
-	.8byte	.LVL80-.Ltext0
-	.8byte	.LVL90-.Ltext0
+.LLST26:
+	.8byte	.LVL81-.Ltext0
+	.8byte	.LVL91-.Ltext0
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL94-.Ltext0
-	.8byte	.LVL96-.Ltext0
+	.8byte	.LVL95-.Ltext0
+	.8byte	.LVL97-.Ltext0
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL106-.Ltext0
-	.8byte	.LVL115-.Ltext0
+	.8byte	.LVL107-.Ltext0
+	.8byte	.LVL116-.Ltext0
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST26:
-	.8byte	.LVL103-.Ltext0
-	.8byte	.LVL108-1-.Ltext0
+.LLST27:
+	.8byte	.LVL104-.Ltext0
+	.8byte	.LVL109-1-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL141-.Ltext0
+	.8byte	.LVL142-.Ltext0
 	.8byte	.LFE1565-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST27:
-	.8byte	.LVL105-.Ltext0
-	.8byte	.LVL108-1-.Ltext0
+.LLST28:
+	.8byte	.LVL106-.Ltext0
+	.8byte	.LVL109-1-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL141-.Ltext0
+	.8byte	.LVL142-.Ltext0
 	.8byte	.LFE1565-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST28:
-	.8byte	.LVL104-.Ltext0
-	.8byte	.LVL108-1-.Ltext0
+.LLST29:
+	.8byte	.LVL105-.Ltext0
+	.8byte	.LVL109-1-.Ltext0
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL141-.Ltext0
+	.8byte	.LVL142-.Ltext0
 	.8byte	.LFE1565-.Ltext0
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST29:
-	.8byte	.LVL80-.Ltext0
-	.8byte	.LVL81-1-.Ltext0
+.LLST30:
+	.8byte	.LVL81-.Ltext0
+	.8byte	.LVL82-1-.Ltext0
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL110-.Ltext0
 	.8byte	.LVL111-.Ltext0
+	.8byte	.LVL112-.Ltext0
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL112-.Ltext0
-	.8byte	.LVL115-.Ltext0
+	.8byte	.LVL113-.Ltext0
+	.8byte	.LVL116-.Ltext0
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST30:
-	.8byte	.LVL80-.Ltext0
-	.8byte	.LVL81-1-.Ltext0
+.LLST31:
+	.8byte	.LVL81-.Ltext0
+	.8byte	.LVL82-1-.Ltext0
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL110-.Ltext0
-	.8byte	.LVL113-.Ltext0
+	.8byte	.LVL111-.Ltext0
+	.8byte	.LVL114-.Ltext0
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL114-.Ltext0
 	.8byte	.LVL115-.Ltext0
+	.8byte	.LVL116-.Ltext0
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST31:
-	.8byte	.LVL80-.Ltext0
-	.8byte	.LVL81-1-.Ltext0
+.LLST32:
+	.8byte	.LVL81-.Ltext0
+	.8byte	.LVL82-1-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL110-.Ltext0
-	.8byte	.LVL115-.Ltext0
+	.8byte	.LVL111-.Ltext0
+	.8byte	.LVL116-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST32:
-	.8byte	.LVL84-.Ltext0
-	.8byte	.LVL91-.Ltext0
+.LLST33:
+	.8byte	.LVL85-.Ltext0
+	.8byte	.LVL92-.Ltext0
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST33:
-	.8byte	.LVL84-.Ltext0
-	.8byte	.LVL91-.Ltext0
+.LLST34:
+	.8byte	.LVL85-.Ltext0
+	.8byte	.LVL92-.Ltext0
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST34:
-	.8byte	.LVL83-.Ltext0
-	.8byte	.LVL89-.Ltext0
+.LLST35:
+	.8byte	.LVL84-.Ltext0
+	.8byte	.LVL90-.Ltext0
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST35:
-	.8byte	.LVL84-.Ltext0
+.LLST36:
 	.8byte	.LVL85-.Ltext0
+	.8byte	.LVL86-.Ltext0
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL86-.Ltext0
-	.8byte	.LVL91-.Ltext0
+	.8byte	.LVL87-.Ltext0
+	.8byte	.LVL92-.Ltext0
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST36:
-	.8byte	.LVL82-.Ltext0
+.LLST37:
 	.8byte	.LVL83-.Ltext0
+	.8byte	.LVL84-.Ltext0
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL88-.Ltext0
 	.8byte	.LVL89-.Ltext0
+	.8byte	.LVL90-.Ltext0
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL95-.Ltext0
 	.8byte	.LVL96-.Ltext0
+	.8byte	.LVL97-.Ltext0
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL100-.Ltext0
-	.8byte	.LVL102-.Ltext0
+	.8byte	.LVL101-.Ltext0
+	.8byte	.LVL103-.Ltext0
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST37:
-	.8byte	.LVL97-.Ltext0
-	.8byte	.LVL101-1-.Ltext0
+.LLST38:
+	.8byte	.LVL98-.Ltext0
+	.8byte	.LVL102-1-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL115-.Ltext0
 	.8byte	.LVL116-.Ltext0
+	.8byte	.LVL117-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST38:
-	.8byte	.LVL99-.Ltext0
-	.8byte	.LVL101-1-.Ltext0
+.LLST39:
+	.8byte	.LVL100-.Ltext0
+	.8byte	.LVL102-1-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL115-.Ltext0
 	.8byte	.LVL116-.Ltext0
+	.8byte	.LVL117-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST39:
-	.8byte	.LVL98-.Ltext0
-	.8byte	.LVL101-1-.Ltext0
+.LLST40:
+	.8byte	.LVL99-.Ltext0
+	.8byte	.LVL102-1-.Ltext0
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL115-.Ltext0
 	.8byte	.LVL116-.Ltext0
+	.8byte	.LVL117-.Ltext0
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST40:
-	.8byte	.LVL134-.Ltext0
+.LLST41:
 	.8byte	.LVL135-.Ltext0
+	.8byte	.LVL136-.Ltext0
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST41:
-	.8byte	.LVL131-.Ltext0
-	.8byte	.LVL136-1-.Ltext0
+.LLST42:
+	.8byte	.LVL132-.Ltext0
+	.8byte	.LVL137-1-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL140-.Ltext0
 	.8byte	.LVL141-.Ltext0
+	.8byte	.LVL142-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST42:
-	.8byte	.LVL133-.Ltext0
-	.8byte	.LVL136-1-.Ltext0
+.LLST43:
+	.8byte	.LVL134-.Ltext0
+	.8byte	.LVL137-1-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL140-.Ltext0
 	.8byte	.LVL141-.Ltext0
+	.8byte	.LVL142-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST43:
-	.8byte	.LVL132-.Ltext0
-	.8byte	.LVL136-1-.Ltext0
+.LLST44:
+	.8byte	.LVL133-.Ltext0
+	.8byte	.LVL137-1-.Ltext0
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL140-.Ltext0
 	.8byte	.LVL141-.Ltext0
+	.8byte	.LVL142-.Ltext0
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
@@ -17397,7 +17411,7 @@ crc32_table:
 	.string	"locked_pending"
 .LASF345:
 	.string	"stack_canary"
-.LASF1506:
+.LASF1507:
 	.string	"readcrc"
 .LASF326:
 	.string	"exit_code"
@@ -17433,7 +17447,7 @@ crc32_table:
 	.string	"need_parent_lock"
 .LASF847:
 	.string	"mkdir"
-.LASF1501:
+.LASF1502:
 	.string	"rkf_wf_get_lut"
 .LASF37:
 	.string	"_Bool"
@@ -17549,6 +17563,8 @@ crc32_table:
 	.string	"xa_lock"
 .LASF282:
 	.string	"thread_info"
+.LASF1469:
+	.string	"needpic"
 .LASF149:
 	.string	"entries"
 .LASF1129:
@@ -17649,7 +17665,7 @@ crc32_table:
 	.string	"__rb_parent_color"
 .LASF241:
 	.string	"__initdata_end"
-.LASF1526:
+.LASF1527:
 	.string	"__fls"
 .LASF980:
 	.string	"si_errno"
@@ -17669,7 +17685,7 @@ crc32_table:
 	.string	"subsys_private"
 .LASF875:
 	.string	"compat_time_t"
-.LASF1502:
+.LASF1503:
 	.string	"rkf_wf_input"
 .LASF1278:
 	.string	"direct_complete"
@@ -17803,7 +17819,7 @@ crc32_table:
 	.string	"llist_node"
 .LASF700:
 	.string	"__per_cpu_offset"
-.LASF1480:
+.LASF1481:
 	.string	"parse_wf_auto"
 .LASF471:
 	.string	"rmtp"
@@ -17871,7 +17887,7 @@ crc32_table:
 	.string	"hrtimer_resolution"
 .LASF849:
 	.string	"rename"
-.LASF1487:
+.LASF1488:
 	.string	"odata"
 .LASF52:
 	.string	"hlist_head"
@@ -17893,7 +17909,7 @@ crc32_table:
 	.string	"runnable_load_sum"
 .LASF407:
 	.string	"last_siginfo"
-.LASF1522:
+.LASF1523:
 	.string	"kmalloc_type"
 .LASF146:
 	.string	"elf_hwcap"
@@ -17921,9 +17937,9 @@ crc32_table:
 	.string	"pending"
 .LASF522:
 	.string	"N_ONLINE"
-.LASF1489:
-	.string	"decode_wf_reset"
 .LASF1490:
+	.string	"decode_wf_reset"
+.LASF1491:
 	.string	"temp_data"
 .LASF1113:
 	.string	"mm_struct"
@@ -17937,7 +17953,7 @@ crc32_table:
 	.string	"remove"
 .LASF276:
 	.string	"debug_locks_silent"
-.LASF1525:
+.LASF1526:
 	.string	"fls64"
 .LASF1103:
 	.string	"perf_invalid_context"
@@ -18053,7 +18069,7 @@ crc32_table:
 	.string	"ptrace"
 .LASF1274:
 	.string	"is_noirq_suspended"
-.LASF1482:
+.LASF1483:
 	.string	"parse_wf_gray2"
 .LASF780:
 	.string	"thread_sibling"
@@ -18077,7 +18093,7 @@ crc32_table:
 	.string	"MIGRATE_TYPES"
 .LASF25:
 	.string	"__kernel_loff_t"
-.LASF1513:
+.LASF1514:
 	.string	"crc_build_table32"
 .LASF180:
 	.string	"arm64_ftr_reg_ctrel0"
@@ -18085,7 +18101,7 @@ crc32_table:
 	.string	"PIDTYPE_TGID"
 .LASF1161:
 	.string	"kobj"
-.LASF1494:
+.LASF1495:
 	.string	"templist"
 .LASF165:
 	.string	"FTR_HIGHER_SAFE"
@@ -18173,7 +18189,7 @@ crc32_table:
 	.string	"rmdir"
 .LASF182:
 	.string	"cpu_hwcap_keys"
-.LASF1471:
+.LASF1472:
 	.string	"old_gray"
 .LASF504:
 	.string	"root"
@@ -18207,7 +18223,7 @@ crc32_table:
 	.string	"NR_KMALLOC_TYPES"
 .LASF1293:
 	.string	"disable_depth"
-.LASF1530:
+.LASF1531:
 	.string	"strncmp"
 .LASF867:
 	.string	"KOBJ_NS_TYPES"
@@ -18239,7 +18255,7 @@ crc32_table:
 	.string	"cpu_bit_bitmap"
 .LASF1079:
 	.string	"timeout"
-.LASF1529:
+.LASF1530:
 	.string	"kfree"
 .LASF587:
 	.string	"NR_FILE_MAPPED"
@@ -18267,7 +18283,7 @@ crc32_table:
 	.string	"stat_threshold"
 .LASF1118:
 	.string	"rt_mutex_waiter"
-.LASF1536:
+.LASF1537:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF703:
 	.string	"secondary_data"
@@ -18327,7 +18343,7 @@ crc32_table:
 	.string	"wake_irq"
 .LASF825:
 	.string	"open"
-.LASF1510:
+.LASF1511:
 	.string	"a_size"
 .LASF507:
 	.string	"radix_tree_root"
@@ -18353,7 +18369,7 @@ crc32_table:
 	.string	"WF_TYPE_GRAY16"
 .LASF455:
 	.string	"android_kabi_reserved8"
-.LASF1532:
+.LASF1533:
 	.string	"memcpy"
 .LASF271:
 	.string	"debug"
@@ -18375,7 +18391,7 @@ crc32_table:
 	.string	"attribute_group"
 .LASF104:
 	.string	"panic_timeout"
-.LASF1499:
+.LASF1500:
 	.string	"__UNIQUE_ID___x55"
 .LASF791:
 	.string	"bitmap"
@@ -18387,9 +18403,9 @@ crc32_table:
 	.string	"dl_density"
 .LASF1262:
 	.string	"RPM_REQ_RESUME"
-.LASF1535:
+.LASF1536:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform.c"
-.LASF1537:
+.LASF1538:
 	.string	"frozen"
 .LASF190:
 	.string	"_text"
@@ -18405,7 +18421,7 @@ crc32_table:
 	.string	"mutex"
 .LASF826:
 	.string	"size"
-.LASF1521:
+.LASF1522:
 	.string	"kmalloc_index"
 .LASF1115:
 	.string	"files_struct"
@@ -18447,7 +18463,7 @@ crc32_table:
 	.string	"io_context"
 .LASF702:
 	.string	"__smp_cross_call"
-.LASF1492:
+.LASF1493:
 	.string	"get_wf_buf"
 .LASF1069:
 	.string	"exec_start"
@@ -18483,7 +18499,7 @@ crc32_table:
 	.string	"mm_kobj"
 .LASF466:
 	.string	"TT_COMPAT"
-.LASF1477:
+.LASF1478:
 	.string	"parse_wf_a2"
 .LASF1406:
 	.string	"dma_coherent_mem"
@@ -18575,7 +18591,7 @@ crc32_table:
 	.string	"__start_rodata"
 .LASF1240:
 	.string	"devres_head"
-.LASF1486:
+.LASF1487:
 	.string	"idata"
 .LASF384:
 	.string	"real_blocked"
@@ -18583,7 +18599,7 @@ crc32_table:
 	.string	"init_user_ns"
 .LASF1102:
 	.string	"perf_event_task_context"
-.LASF1503:
+.LASF1504:
 	.string	"waveform_file"
 .LASF1389:
 	.string	"segment_boundary_mask"
@@ -18605,13 +18621,13 @@ crc32_table:
 	.string	"archdata"
 .LASF27:
 	.string	"__kernel_clock_t"
-.LASF1519:
+.LASF1520:
 	.string	"kmalloc_large"
 .LASF1244:
 	.string	"iommu_group"
-.LASF1474:
-	.string	"pix0"
 .LASF1475:
+	.string	"pix0"
+.LASF1476:
 	.string	"pix1"
 .LASF269:
 	.string	"fault_address"
@@ -18623,7 +18639,7 @@ crc32_table:
 	.string	"__s32"
 .LASF435:
 	.string	"nr_dirtied_pause"
-.LASF1509:
+.LASF1510:
 	.string	"a_data"
 .LASF218:
 	.string	"__start_once"
@@ -18655,9 +18671,9 @@ crc32_table:
 	.string	"kimage_vaddr"
 .LASF1340:
 	.string	"begin"
-.LASF1498:
+.LASF1499:
 	.string	"__UNIQUE_ID___y54"
-.LASF1500:
+.LASF1501:
 	.string	"__UNIQUE_ID___y56"
 .LASF1376:
 	.string	"acpi_device_id"
@@ -18721,7 +18737,7 @@ crc32_table:
 	.string	"autosuspend_delay"
 .LASF1305:
 	.string	"request"
-.LASF1538:
+.LASF1539:
 	.string	"decode_wf_data"
 .LASF761:
 	.string	"contig_page_data"
@@ -18749,7 +18765,7 @@ crc32_table:
 	.string	"syscr"
 .LASF931:
 	.string	"HRTIMER_BASE_BOOTTIME"
-.LASF1484:
+.LASF1485:
 	.string	"parse_wf_reset"
 .LASF547:
 	.string	"MIGRATE_ISOLATE"
@@ -18781,7 +18797,7 @@ crc32_table:
 	.string	"__cpu_present_mask"
 .LASF1186:
 	.string	"pm_power_off_prepare"
-.LASF1495:
+.LASF1496:
 	.string	"wf_offset"
 .LASF1162:
 	.string	"uevent_ops"
@@ -18835,7 +18851,7 @@ crc32_table:
 	.string	"system_highpri_wq"
 .LASF1018:
 	.string	"run_delay"
-.LASF1507:
+.LASF1508:
 	.string	"check_wf_format"
 .LASF1112:
 	.string	"rcu_node"
@@ -18855,7 +18871,7 @@ crc32_table:
 	.string	"drv_groups"
 .LASF112:
 	.string	"panic_cpu"
-.LASF1533:
+.LASF1534:
 	.string	"memset"
 .LASF1403:
 	.string	"irq_domain"
@@ -18887,7 +18903,7 @@ crc32_table:
 	.string	"NR_LRU_LISTS"
 .LASF614:
 	.string	"zone_reclaim_stat"
-.LASF1473:
+.LASF1474:
 	.string	"lut_data"
 .LASF285:
 	.string	"usage"
@@ -18943,13 +18959,13 @@ crc32_table:
 	.string	"HRTIMER_RESTART"
 .LASF1434:
 	.string	"rkf_waveform_type"
-.LASF1517:
+.LASF1518:
 	.string	"kzalloc"
 .LASF1267:
 	.string	"dev_pm_info"
 .LASF628:
 	.string	"node_present_pages"
-.LASF1491:
+.LASF1492:
 	.string	"get_wf_frm_num"
 .LASF325:
 	.string	"exit_state"
@@ -19003,7 +19019,7 @@ crc32_table:
 	.string	"sock"
 .LASF858:
 	.string	"mmapped"
-.LASF1478:
+.LASF1479:
 	.string	"temp"
 .LASF456:
 	.string	"thread"
@@ -19071,7 +19087,7 @@ crc32_table:
 	.string	"N_POSSIBLE"
 .LASF96:
 	.string	"kmsg_fops"
-.LASF1504:
+.LASF1505:
 	.string	"check_wf_crc"
 .LASF443:
 	.string	"memcg_oom_order"
@@ -19103,7 +19119,7 @@ crc32_table:
 	.string	"sigset_t"
 .LASF1254:
 	.string	"RPM_RESUMING"
-.LASF1476:
+.LASF1477:
 	.string	"rkf_lut_init_wf_table"
 .LASF1086:
 	.string	"dl_deadline"
@@ -19127,7 +19143,7 @@ crc32_table:
 	.string	"need_qs"
 .LASF379:
 	.string	"files"
-.LASF1481:
+.LASF1482:
 	.string	"input"
 .LASF1111:
 	.string	"task_group"
@@ -19143,7 +19159,7 @@ crc32_table:
 	.string	"last_switch_count"
 .LASF908:
 	.string	"cpu_base"
-.LASF1523:
+.LASF1524:
 	.string	"get_order"
 .LASF126:
 	.string	"module"
@@ -19159,7 +19175,7 @@ crc32_table:
 	.string	"pstate_check_t"
 .LASF954:
 	.string	"_sys_private"
-.LASF1512:
+.LASF1513:
 	.string	"decode_wf_auto"
 .LASF462:
 	.string	"tz_dsttime"
@@ -19173,7 +19189,7 @@ crc32_table:
 	.string	"util_est"
 .LASF270:
 	.string	"fault_code"
-.LASF1528:
+.LASF1529:
 	.string	"__kmalloc"
 .LASF88:
 	.string	"linux_banner"
@@ -19479,7 +19495,7 @@ crc32_table:
 	.string	"run_list"
 .LASF293:
 	.string	"wake_cpu"
-.LASF1479:
+.LASF1480:
 	.string	"pbuf"
 .LASF617:
 	.string	"lruvec"
@@ -19551,11 +19567,11 @@ crc32_table:
 	.string	"tick_usec"
 .LASF1300:
 	.string	"irq_safe"
-.LASF1497:
+.LASF1498:
 	.string	"__UNIQUE_ID___x53"
 .LASF982:
 	.string	"_sifields"
-.LASF1527:
+.LASF1528:
 	.string	"word"
 .LASF35:
 	.string	"clockid_t"
@@ -19631,7 +19647,7 @@ crc32_table:
 	.string	"bps_disabled"
 .LASF753:
 	.string	"notifier_call"
-.LASF1488:
+.LASF1489:
 	.string	"temp1"
 .LASF1466:
 	.string	"output"
@@ -19663,7 +19679,7 @@ crc32_table:
 	.string	"wakeup_source"
 .LASF1202:
 	.string	"thaw_early"
-.LASF1524:
+.LASF1525:
 	.string	"__ilog2_u64"
 .LASF301:
 	.string	"boost"
@@ -19681,7 +19697,7 @@ crc32_table:
 	.string	"NR_UNEVICTABLE"
 .LASF859:
 	.string	"released"
-.LASF1470:
+.LASF1471:
 	.string	"sftemp"
 .LASF817:
 	.string	"target_kn"
@@ -19717,7 +19733,7 @@ crc32_table:
 	.string	"system_long_wq"
 .LASF430:
 	.string	"tlb_ubc"
-.LASF1516:
+.LASF1517:
 	.string	"n_data"
 .LASF1073:
 	.string	"statistics"
@@ -19797,7 +19813,7 @@ crc32_table:
 	.string	"device_node"
 .LASF730:
 	.string	"ktime_t"
-.LASF1531:
+.LASF1532:
 	.string	"printk"
 .LASF739:
 	.string	"data"
@@ -19823,7 +19839,7 @@ crc32_table:
 	.string	"kcompactd"
 .LASF99:
 	.string	"head"
-.LASF1485:
+.LASF1486:
 	.string	"gray"
 .LASF1399:
 	.string	"needs_suppliers"
@@ -19839,7 +19855,7 @@ crc32_table:
 	.string	"SYSTEM_POWER_OFF"
 .LASF482:
 	.string	"poll"
-.LASF1508:
+.LASF1509:
 	.string	"crc_32"
 .LASF144:
 	.string	"compat_elf_hwcap"
@@ -19897,7 +19913,7 @@ crc32_table:
 	.string	"nodemask_t"
 .LASF1327:
 	.string	"autosleep_enabled"
-.LASF1469:
+.LASF1470:
 	.string	"stype"
 .LASF770:
 	.string	"PCPU_FC_EMBED"
@@ -19971,7 +19987,7 @@ crc32_table:
 	.string	"load_avg"
 .LASF530:
 	.string	"FDPIC_FUNCPTRS"
-.LASF1493:
+.LASF1494:
 	.string	"waveform"
 .LASF776:
 	.string	"thread_id"
@@ -20001,7 +20017,7 @@ crc32_table:
 	.string	"__nosave_begin"
 .LASF965:
 	.string	"_addr_pkey"
-.LASF1534:
+.LASF1535:
 	.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"
@@ -20053,7 +20069,7 @@ crc32_table:
 	.string	"syscore"
 .LASF873:
 	.string	"drop_ns"
-.LASF1514:
+.LASF1515:
 	.string	"a_poly"
 .LASF262:
 	.string	"tp2_value"
@@ -20081,7 +20097,7 @@ crc32_table:
 	.string	"bio_list"
 .LASF1382:
 	.string	"dev_release"
-.LASF1515:
+.LASF1516:
 	.string	"crc_table"
 .LASF844:
 	.string	"kernfs_syscall_ops"
@@ -20179,7 +20195,7 @@ crc32_table:
 	.string	"refaults"
 .LASF1000:
 	.string	"wchar"
-.LASF1505:
+.LASF1506:
 	.string	"crccheck"
 .LASF242:
 	.string	"__inittext_begin"
@@ -20207,7 +20223,7 @@ crc32_table:
 	.string	"sched_statistics"
 .LASF704:
 	.string	"task"
-.LASF1496:
+.LASF1497:
 	.string	"get_wf_level"
 .LASF578:
 	.string	"NR_SLAB_RECLAIMABLE"
@@ -20261,7 +20277,7 @@ crc32_table:
 	.string	"class_release"
 .LASF1010:
 	.string	"RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE_BIT"
-.LASF1511:
+.LASF1512:
 	.string	"n_accum"
 .LASF989:
 	.string	"MM_SWAPENTS"
@@ -20293,7 +20309,7 @@ crc32_table:
 	.string	"on_list"
 .LASF317:
 	.string	"rcu_tasks_holdout_list"
-.LASF1539:
+.LASF1540:
 	.string	"rkf_wf_get_version"
 .LASF404:
 	.string	"backing_dev_info"
@@ -20331,7 +20347,7 @@ crc32_table:
 	.string	"uevent_helper"
 .LASF1423:
 	.string	"WF_TYPE_AUTO"
-.LASF1518:
+.LASF1519:
 	.string	"kmalloc"
 .LASF994:
 	.string	"events"
@@ -20339,7 +20355,7 @@ crc32_table:
 	.string	"user_mask"
 .LASF113:
 	.string	"root_mountflags"
-.LASF1520:
+.LASF1521:
 	.string	"order"
 .LASF3:
 	.string	"unsigned int"
@@ -20391,7 +20407,7 @@ crc32_table:
 	.string	"no_callbacks"
 .LASF310:
 	.string	"rcu_read_unlock_special"
-.LASF1483:
+.LASF1484:
 	.string	"parse_wf_gray16"
 .LASF1298:
 	.string	"ignore_children"
@@ -20427,7 +20443,7 @@ crc32_table:
 	.string	"tz_minuteswest"
 .LASF426:
 	.string	"rseq"
-.LASF1472:
+.LASF1473:
 	.string	"new_gray"
 .LASF444:
 	.string	"memcg_nr_pages_over_high"

commit 92a6441ba1af95c9e1b1807f073f5582203ab6df
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Fri Apr 9 15:40:32 2021 +0200

    UPSTREAM: usb: typec: tcpm: Add support for altmodes
    
    Add support for altmodes described in the usb-connector fwnode
    associated with the Type-C controller by calling the new
    typec_port_register_altmodes_from_fwnode() helper for this.
    
    Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Link: https://lore.kernel.org/r/20210409134033.105834-3-hdegoede@redhat.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Change-Id: I0d7de11b08f1c297e78c7f4cbea90b6d85f8abe5
    Signed-off-by: Zhang Yubing <yubing.zhang@rock-chips.com>
    Signed-off-by: Wang Jie <dave.wang@rock-chips.com>
    (cherry picked from commit 55d8b34772e0728a224198ba605eed8cfc570aa0)

diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index 2dd6fb81edbe..6e4910678e17 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -5949,6 +5949,10 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
 		goto out_destroy_wq;
 	}
 
+	typec_port_register_altmodes(port->typec_port,
+				     &tcpm_altmode_ops, port,
+				     port->port_altmode, ALTMODE_DISCOVERY_MAX);
+
 	mutex_lock(&port->lock);
 	tcpm_init(port);
 	mutex_unlock(&port->lock);

commit 99739def5003b22da498ea76d0db0b59dd27a34c
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Fri Apr 9 15:40:31 2021 +0200

    BACKPORT: usb: typec: Add typec_port_register_altmodes()
    
    This can be used by Type-C controller drivers which use a standard
    usb-connector fwnode, with altmodes sub-node, to describe the available
    altmodes.
    
    Note there are is no devicetree bindings documentation for the altmodes
    node, this is deliberate. ATM the fwnodes used to register the altmodes
    are only used internally to pass platform info from a drivers/platform/x86
    driver to the type-c subsystem.
    
    When a devicetree user of this functionally comes up and the dt-bindings
    have been hashed out the internal use can be adjusted to match the
    dt-bindings.
    
    Currently the typec_port_register_altmodes() function expects
    an "altmodes" child fwnode on port->dev with this "altmodes" fwnode having
    child fwnodes itself with each child containing 2 integer properties:
    
    1. A "svid" property, which sets the id of the altmode, e.g. displayport
    altmode has a svid of 0xff01.
    
    2. A "vdo" property, typically used as a bitmask describing the
    capabilities of the altmode, the bits in the vdo are specified in the
    specification of the altmode.
    
    Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Link: https://lore.kernel.org/r/20210409134033.105834-2-hdegoede@redhat.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Change-Id: Ib78f0b67b985751a32b6f42e79c7976f5515f6b2
    Signed-off-by: zhang Yubing <yubing.zhang@rock-chips.com>
    Signed-off-by: Wang Jie <dave.wang@rock-chips.com>
    (cherry picked from commit 9cf9c33b764aad831c83425a4874f0cec125429c)

diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c
index 1644ca08e91c..4270bf72fc88 100644
--- a/drivers/usb/typec/class.c
+++ b/drivers/usb/typec/class.c
@@ -9,6 +9,7 @@
 #include <linux/device.h>
 #include <linux/module.h>
 #include <linux/mutex.h>
+#include <linux/of.h>
 #include <linux/property.h>
 #include <linux/slab.h>
 
@@ -1531,6 +1532,60 @@ typec_port_register_altmode(struct typec_port *port,
 }
 EXPORT_SYMBOL_GPL(typec_port_register_altmode);
 
+void typec_port_register_altmodes(struct typec_port *port,
+	const struct typec_altmode_ops *ops, void *drvdata,
+	struct typec_altmode **altmodes, size_t n)
+{
+	struct fwnode_handle *altmodes_node, *child;
+	struct typec_altmode_desc desc;
+	struct typec_altmode *alt;
+	size_t index = 0;
+	u32 svid, vdo;
+	int ret;
+
+	altmodes_node = device_get_named_child_node(&port->dev, "altmodes");
+	if (!altmodes_node)
+		return; /* No altmodes specified */
+
+	fwnode_for_each_child_node(altmodes_node, child) {
+		ret = fwnode_property_read_u32(child, "svid", &svid);
+		if (ret) {
+			dev_err(&port->dev, "Error reading svid for altmode %s\n",
+				kbasename(of_node_full_name(to_of_node(child))));
+			continue;
+		}
+
+		ret = fwnode_property_read_u32(child, "vdo", &vdo);
+		if (ret) {
+			dev_err(&port->dev, "Error reading vdo for altmode %s\n",
+				kbasename(of_node_full_name(to_of_node(child))));
+			continue;
+		}
+
+		if (index >= n) {
+			dev_err(&port->dev, "Error not enough space for altmode %s\n",
+				kbasename(of_node_full_name(to_of_node(child))));
+			continue;
+		}
+
+		desc.svid = svid;
+		desc.vdo = vdo;
+		desc.mode = index + 1;
+		alt = typec_port_register_altmode(port, &desc);
+		if (IS_ERR(alt)) {
+			dev_err(&port->dev, "Error registering altmode %s\n",
+				kbasename(of_node_full_name(to_of_node(child))));
+			continue;
+		}
+
+		alt->ops = ops;
+		typec_altmode_set_drvdata(alt, drvdata);
+		altmodes[index] = alt;
+		index++;
+	}
+}
+EXPORT_SYMBOL_GPL(typec_port_register_altmodes);
+
 /**
  * typec_register_port - Register a USB Type-C Port
  * @parent: Parent device
diff --git a/include/linux/usb/typec.h b/include/linux/usb/typec.h
index 27a6fc7c35ea..56780e541baa 100644
--- a/include/linux/usb/typec.h
+++ b/include/linux/usb/typec.h
@@ -14,6 +14,7 @@ struct typec_partner;
 struct typec_cable;
 struct typec_plug;
 struct typec_port;
+struct typec_altmode_ops;
 
 struct fwnode_handle;
 struct device;
@@ -118,6 +119,11 @@ struct typec_altmode
 struct typec_altmode
 *typec_port_register_altmode(struct typec_port *port,
 			     const struct typec_altmode_desc *desc);
+
+void typec_port_register_altmodes(struct typec_port *port,
+	const struct typec_altmode_ops *ops, void *drvdata,
+	struct typec_altmode **altmodes, size_t n);
+
 void typec_unregister_altmode(struct typec_altmode *altmode);
 
 struct typec_port *typec_altmode2port(struct typec_altmode *alt);

commit 7b7aa234a0ec108e35c6e500b38f66756e6d2017
Author: Todd Kjos <tkjos@google.com>
Date:   Tue Oct 12 09:56:14 2021 -0700

    UPSTREAM: binder: use cred instead of task for getsecid
    
    commit 4d5b5539742d2554591751b4248b0204d20dcc9d upstream.
    
    Use the 'struct cred' saved at binder_open() to lookup
    the security ID via security_cred_getsecid(). This
    ensures that the security context that opened binder
    is the one used to generate the secctx.
    
    Cc: stable@vger.kernel.org # 5.4+
    Fixes: ec74136ded79 ("binder: create node flag to request sender's security context")
    Signed-off-by: Todd Kjos <tkjos@google.com>
    Suggested-by: Stephen Smalley <stephen.smalley.work@gmail.com>
    Reported-by: kernel test robot <lkp@intel.com>
    Acked-by: Casey Schaufler <casey@schaufler-ca.com>
    Signed-off-by: Paul Moore <paul@paul-moore.com>
    Change-Id: Ia7b59804a0bdbd51191bbcca556414840307c623
    Bug: 200688826
    Signed-off-by: Todd Kjos <tkjos@google.com>

diff --git a/drivers/android/binder.c b/drivers/android/binder.c
index 4714b5c96a29..547edc666329 100644
--- a/drivers/android/binder.c
+++ b/drivers/android/binder.c
@@ -3198,7 +3198,7 @@ static void binder_transaction(struct binder_proc *proc,
 		u32 secid;
 		size_t added_size;
 
-		security_task_getsecid(proc->tsk, &secid);
+		security_cred_getsecid(proc->cred, &secid);
 		ret = security_secid_to_secctx(secid, &secctx, &secctx_sz);
 		if (ret) {
 			return_error = BR_FAILED_REPLY;
diff --git a/include/linux/security.h b/include/linux/security.h
index da13cdc28327..8c32a2f7b3c6 100644
--- a/include/linux/security.h
+++ b/include/linux/security.h
@@ -914,6 +914,11 @@ static inline void security_transfer_creds(struct cred *new,
 {
 }
 
+static inline void security_cred_getsecid(const struct cred *c, u32 *secid)
+{
+	*secid = 0;
+}
+
 static inline int security_kernel_act_as(struct cred *cred, u32 secid)
 {
 	return 0;

commit 213d8be2c6cf6254b467da785c5ac015bf362b6c
Author: Todd Kjos <tkjos@google.com>
Date:   Fri Nov 12 10:07:20 2021 -0800

    FROMGIT: binder: fix test regression due to sender_euid change
    
    This is a partial revert of commit
    29bc22ac5e5b ("binder: use euid from cred instead of using task").
    Setting sender_euid using proc->cred caused some Android system test
    regressions that need further investigation. It is a partial
    reversion because subsequent patches rely on proc->cred.
    
    Fixes: 29bc22ac5e5b ("binder: use euid from cred instead of using task")
    Cc: stable@vger.kernel.org # 4.4+
    Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
    Signed-off-by: Todd Kjos <tkjos@google.com>
    Change-Id: I9b1769a3510fed250bb21859ef8beebabe034c66
    Link: https://lore.kernel.org/r/20211112180720.2858135-1-tkjos@google.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Bug: 200688826
    (cherry picked from commit c21a80ca0684ec2910344d72556c816cb8940c01
    git: //git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git char-misc-linus)
    Signed-off-by: Todd Kjos <tkjos@google.com>

diff --git a/drivers/android/binder.c b/drivers/android/binder.c
index a5ad590f360c..4714b5c96a29 100644
--- a/drivers/android/binder.c
+++ b/drivers/android/binder.c
@@ -3179,7 +3179,7 @@ static void binder_transaction(struct binder_proc *proc,
 		t->from = thread;
 	else
 		t->from = NULL;
-	t->sender_euid = proc->cred->euid;
+	t->sender_euid = task_euid(proc->tsk);
 	t->to_proc = target_proc;
 	t->to_thread = target_thread;
 	t->code = tr->code;

commit 2a4f6c62954f8100af47873877d62d75141d833f
Author: Todd Kjos <tkjos@google.com>
Date:   Tue Oct 12 09:56:13 2021 -0700

    BACKPORT: binder: use cred instead of task for selinux checks
    
    commit 52f88693378a58094c538662ba652aff0253c4fe upstream.
    
    Since binder was integrated with selinux, it has passed
    'struct task_struct' associated with the binder_proc
    to represent the source and target of transactions.
    The conversion of task to SID was then done in the hook
    implementations. It turns out that there are race conditions
    which can result in an incorrect security context being used.
    
    Fix by using the 'struct cred' saved during binder_open and pass
    it to the selinux subsystem.
    
    Cc: stable@vger.kernel.org # 5.14 (need backport for earlier stables)
    Fixes: 79af73079d75 ("Add security hooks to binder and implement the hooks for SELinux.")
    Suggested-by: Jann Horn <jannh@google.com>
    Signed-off-by: Todd Kjos <tkjos@google.com>
    Acked-by: Casey Schaufler <casey@schaufler-ca.com>
    Signed-off-by: Paul Moore <paul@paul-moore.com>
    Change-Id: Id7157515d2b08f11683aeb8ad9b8f1da075d34e7
    Bug: 200688826
    [ tkjos@ fixed minor conflict ]
    Signed-off-by: Todd Kjos <tkjos@google.com>

diff --git a/drivers/android/binder.c b/drivers/android/binder.c
index b2671a723156..a5ad590f360c 100644
--- a/drivers/android/binder.c
+++ b/drivers/android/binder.c
@@ -2528,7 +2528,7 @@ static int binder_translate_binder(struct flat_binder_object *fp,
 		ret = -EINVAL;
 		goto done;
 	}
-	if (security_binder_transfer_binder(proc->tsk, target_proc->tsk)) {
+	if (security_binder_transfer_binder(proc->cred, target_proc->cred)) {
 		ret = -EPERM;
 		goto done;
 	}
@@ -2574,7 +2574,7 @@ static int binder_translate_handle(struct flat_binder_object *fp,
 				  proc->pid, thread->pid, fp->handle);
 		return -EINVAL;
 	}
-	if (security_binder_transfer_binder(proc->tsk, target_proc->tsk)) {
+	if (security_binder_transfer_binder(proc->cred, target_proc->cred)) {
 		ret = -EPERM;
 		goto done;
 	}
@@ -2658,7 +2658,7 @@ static int binder_translate_fd(int fd,
 		ret = -EBADF;
 		goto err_fget;
 	}
-	ret = security_binder_transfer_file(proc->tsk, target_proc->tsk, file);
+	ret = security_binder_transfer_file(proc->cred, target_proc->cred, file);
 	if (ret < 0) {
 		ret = -EPERM;
 		goto err_security;
@@ -3064,8 +3064,8 @@ static void binder_transaction(struct binder_proc *proc,
 			goto err_dead_binder;
 		}
 		e->to_node = target_node->debug_id;
-		if (security_binder_transaction(proc->tsk,
-						target_proc->tsk) < 0) {
+		if (security_binder_transaction(proc->cred,
+						target_proc->cred) < 0) {
 			return_error = BR_FAILED_REPLY;
 			return_error_param = -EPERM;
 			return_error_line = __LINE__;
@@ -4870,7 +4870,7 @@ static int binder_ioctl_set_ctx_mgr(struct file *filp,
 		ret = -EBUSY;
 		goto out;
 	}
-	ret = security_binder_set_context_mgr(proc->tsk);
+	ret = security_binder_set_context_mgr(proc->cred);
 	if (ret < 0)
 		goto out;
 	if (uid_valid(context->binder_context_mgr_uid)) {
diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h
index 1a922bd5b739..2e0f91dba55e 100644
--- a/include/linux/lsm_hooks.h
+++ b/include/linux/lsm_hooks.h
@@ -1211,22 +1211,22 @@
  *
  * @binder_set_context_mgr:
  *	Check whether @mgr is allowed to be the binder context manager.
- *	@mgr contains the task_struct for the task being registered.
+ *	@mgr contains the struct cred for the current binder process.
  *	Return 0 if permission is granted.
  * @binder_transaction:
  *	Check whether @from is allowed to invoke a binder transaction call
  *	to @to.
- *	@from contains the task_struct for the sending task.
- *	@to contains the task_struct for the receiving task.
+ *	@from contains the struct cred for the sending process.
+ *	@to contains the struct cred for the receiving process.
  * @binder_transfer_binder:
  *	Check whether @from is allowed to transfer a binder reference to @to.
- *	@from contains the task_struct for the sending task.
- *	@to contains the task_struct for the receiving task.
+ *	@from contains the struct cred for the sending process.
+ *	@to contains the struct cred for the receiving process.
  * @binder_transfer_file:
  *	Check whether @from is allowed to transfer @file to @to.
- *	@from contains the task_struct for the sending task.
+ *	@from contains the struct cred for the sending process.
  *	@file contains the struct file being transferred.
- *	@to contains the task_struct for the receiving task.
+ *	@to contains the struct cred for the receiving process.
  *
  * @ptrace_access_check:
  *	Check permission before allowing the current process to trace the
@@ -1428,13 +1428,13 @@
  *
  */
 union security_list_options {
-	int (*binder_set_context_mgr)(struct task_struct *mgr);
-	int (*binder_transaction)(struct task_struct *from,
-					struct task_struct *to);
-	int (*binder_transfer_binder)(struct task_struct *from,
-					struct task_struct *to);
-	int (*binder_transfer_file)(struct task_struct *from,
-					struct task_struct *to,
+	int (*binder_set_context_mgr)(const struct cred *mgr);
+	int (*binder_transaction)(const struct cred *from,
+					const struct cred *to);
+	int (*binder_transfer_binder)(const struct cred *from,
+					const struct cred *to);
+	int (*binder_transfer_file)(const struct cred *from,
+					const struct cred *to,
 					struct file *file);
 
 	int (*ptrace_access_check)(struct task_struct *child,
diff --git a/include/linux/security.h b/include/linux/security.h
index ef2079c60ed1..da13cdc28327 100644
--- a/include/linux/security.h
+++ b/include/linux/security.h
@@ -219,13 +219,13 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)
 extern int security_init(void);
 
 /* Security operations */
-int security_binder_set_context_mgr(struct task_struct *mgr);
-int security_binder_transaction(struct task_struct *from,
-				struct task_struct *to);
-int security_binder_transfer_binder(struct task_struct *from,
-				    struct task_struct *to);
-int security_binder_transfer_file(struct task_struct *from,
-				  struct task_struct *to, struct file *file);
+int security_binder_set_context_mgr(const struct cred *mgr);
+int security_binder_transaction(const struct cred *from,
+				const struct cred *to);
+int security_binder_transfer_binder(const struct cred *from,
+				    const struct cred *to);
+int security_binder_transfer_file(const struct cred *from,
+				  const struct cred *to, struct file *file);
 int security_ptrace_access_check(struct task_struct *child, unsigned int mode);
 int security_ptrace_traceme(struct task_struct *parent);
 int security_capget(struct task_struct *target,
@@ -442,25 +442,25 @@ static inline int security_init(void)
 	return 0;
 }
 
-static inline int security_binder_set_context_mgr(struct task_struct *mgr)
+static inline int security_binder_set_context_mgr(const struct cred *mgr)
 {
 	return 0;
 }
 
-static inline int security_binder_transaction(struct task_struct *from,
-					      struct task_struct *to)
+static inline int security_binder_transaction(const struct cred *from,
+					      const struct cred *to)
 {
 	return 0;
 }
 
-static inline int security_binder_transfer_binder(struct task_struct *from,
-						  struct task_struct *to)
+static inline int security_binder_transfer_binder(const struct cred *from,
+						  const struct cred *to)
 {
 	return 0;
 }
 
-static inline int security_binder_transfer_file(struct task_struct *from,
-						struct task_struct *to,
+static inline int security_binder_transfer_file(const struct cred *from,
+						const struct cred *to,
 						struct file *file)
 {
 	return 0;
diff --git a/security/security.c b/security/security.c
index c792aa4e7f06..bb1216572bcb 100644
--- a/security/security.c
+++ b/security/security.c
@@ -232,25 +232,25 @@ EXPORT_SYMBOL(unregister_lsm_notifier);
 
 /* Security operations */
 
-int security_binder_set_context_mgr(struct task_struct *mgr)
+int security_binder_set_context_mgr(const struct cred *mgr)
 {
 	return call_int_hook(binder_set_context_mgr, 0, mgr);
 }
 
-int security_binder_transaction(struct task_struct *from,
-				struct task_struct *to)
+int security_binder_transaction(const struct cred *from,
+				const struct cred *to)
 {
 	return call_int_hook(binder_transaction, 0, from, to);
 }
 
-int security_binder_transfer_binder(struct task_struct *from,
-				    struct task_struct *to)
+int security_binder_transfer_binder(const struct cred *from,
+				    const struct cred *to)
 {
 	return call_int_hook(binder_transfer_binder, 0, from, to);
 }
 
-int security_binder_transfer_file(struct task_struct *from,
-				  struct task_struct *to, struct file *file)
+int security_binder_transfer_file(const struct cred *from,
+				  const struct cred *to, struct file *file)
 {
 	return call_int_hook(binder_transfer_file, 0, from, to, file);
 }
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index b8ff42a7c16d..a8739f78bf27 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -2220,22 +2220,19 @@ static inline u32 open_file_to_av(struct file *file)
 
 /* Hook functions begin here. */
 
-static int selinux_binder_set_context_mgr(struct task_struct *mgr)
+static int selinux_binder_set_context_mgr(const struct cred *mgr)
 {
-	u32 mysid = current_sid();
-	u32 mgrsid = task_sid(mgr);
-
 	return avc_has_perm(&selinux_state,
-			    mysid, mgrsid, SECCLASS_BINDER,
+			    current_sid(), cred_sid(mgr), SECCLASS_BINDER,
 			    BINDER__SET_CONTEXT_MGR, NULL);
 }
 
-static int selinux_binder_transaction(struct task_struct *from,
-				      struct task_struct *to)
+static int selinux_binder_transaction(const struct cred *from,
+				      const struct cred *to)
 {
 	u32 mysid = current_sid();
-	u32 fromsid = task_sid(from);
-	u32 tosid = task_sid(to);
+	u32 fromsid = cred_sid(from);
+	u32 tosid = cred_sid(to);
 	int rc;
 
 	if (mysid != fromsid) {
@@ -2246,27 +2243,24 @@ static int selinux_binder_transaction(struct task_struct *from,
 			return rc;
 	}
 
-	return avc_has_perm(&selinux_state,
-			    fromsid, tosid, SECCLASS_BINDER, BINDER__CALL,
-			    NULL);
+	return avc_has_perm(&selinux_state, fromsid, tosid,
+			    SECCLASS_BINDER, BINDER__CALL, NULL);
 }
 
-static int selinux_binder_transfer_binder(struct task_struct *from,
-					  struct task_struct *to)
+static int selinux_binder_transfer_binder(const struct cred *from,
+					  const struct cred *to)
 {
-	u32 fromsid = task_sid(from);
-	u32 tosid = task_sid(to);
-
 	return avc_has_perm(&selinux_state,
-			    fromsid, tosid, SECCLASS_BINDER, BINDER__TRANSFER,
+			    cred_sid(from), cred_sid(to),
+			    SECCLASS_BINDER, BINDER__TRANSFER,
 			    NULL);
 }
 
-static int selinux_binder_transfer_file(struct task_struct *from,
-					struct task_struct *to,
+static int selinux_binder_transfer_file(const struct cred *from,
+					const struct cred *to,
 					struct file *file)
 {
-	u32 sid = task_sid(to);
+	u32 sid = cred_sid(to);
 	struct file_security_struct *fsec = file->f_security;
 	struct dentry *dentry = file->f_path.dentry;
 	struct inode_security_struct *isec;

commit 6ada76218aa6232a19effef1dbf104988f010a22
Author: Todd Kjos <tkjos@google.com>
Date:   Tue Oct 12 09:56:12 2021 -0700

    UPSTREAM: binder: use euid from cred instead of using task
    
    commit 29bc22ac5e5bc63275e850f0c8fc549e3d0e306b upstream.
    
    Save the 'struct cred' associated with a binder process
    at initial open to avoid potential race conditions
    when converting to an euid.
    
    Set a transaction's sender_euid from the 'struct cred'
    saved at binder_open() instead of looking up the euid
    from the binder proc's 'struct task'. This ensures
    the euid is associated with the security context that
    of the task that opened binder.
    
    Cc: stable@vger.kernel.org # 4.4+
    Fixes: 457b9a6f09f0 ("Staging: android: add binder driver")
    Signed-off-by: Todd Kjos <tkjos@google.com>
    Suggested-by: Stephen Smalley <stephen.smalley.work@gmail.com>
    Suggested-by: Jann Horn <jannh@google.com>
    Acked-by: Casey Schaufler <casey@schaufler-ca.com>
    Signed-off-by: Paul Moore <paul@paul-moore.com>
    Change-Id: I91922e7f359df5901749f1b09094c3c68d45aed4
    Bug: 200688826
    Signed-off-by: Todd Kjos <tkjos@google.com>

diff --git a/drivers/android/binder.c b/drivers/android/binder.c
index 7e16c9365db8..b2671a723156 100644
--- a/drivers/android/binder.c
+++ b/drivers/android/binder.c
@@ -459,6 +459,9 @@ struct binder_priority {
  * @files                 files_struct for process
  *                        (protected by @files_lock)
  * @files_lock            mutex to protect @files
+ * @cred                  struct cred associated with the `struct file`
+ *                        in binder_open()
+ *                        (invariant after initialized)
  * @deferred_work_node:   element for binder_deferred_list
  *                        (protected by binder_deferred_lock)
  * @deferred_work:        bitmap of deferred work to perform
@@ -506,6 +509,7 @@ struct binder_proc {
 	struct task_struct *tsk;
 	struct files_struct *files;
 	struct mutex files_lock;
+	const struct cred *cred;
 	struct hlist_node deferred_work_node;
 	int deferred_work;
 	bool is_dead;
@@ -3175,7 +3179,7 @@ static void binder_transaction(struct binder_proc *proc,
 		t->from = thread;
 	else
 		t->from = NULL;
-	t->sender_euid = task_euid(proc->tsk);
+	t->sender_euid = proc->cred->euid;
 	t->to_proc = target_proc;
 	t->to_thread = target_thread;
 	t->code = tr->code;
@@ -4660,6 +4664,7 @@ static void binder_free_proc(struct binder_proc *proc)
 	}
 	binder_alloc_deferred_release(&proc->alloc);
 	put_task_struct(proc->tsk);
+	put_cred(proc->cred);
 	binder_stats_deleted(BINDER_STAT_PROC);
 	kfree(proc);
 }
@@ -5189,6 +5194,7 @@ static int binder_open(struct inode *nodp, struct file *filp)
 	get_task_struct(current->group_leader);
 	proc->tsk = current->group_leader;
 	mutex_init(&proc->files_lock);
+	proc->cred = get_cred(filp->f_cred);
 	INIT_LIST_HEAD(&proc->todo);
 	if (binder_supported_policy(current->policy)) {
 		proc->default_priority.sched_policy = current->policy;

commit 7e3d32f22f980c5bfa339d55fbe4080bfbc946aa
Author: Ziyuan Xu <xzy.xu@rock-chips.com>
Date:   Fri Nov 19 09:06:15 2021 +0800

    ARM: dts: rockchip: add rv1126-trailcamera board support
    
    Signed-off-by: Ziyuan Xu <xzy.xu@rock-chips.com>
    Change-Id: I008bcdea18439073ad0efee8dc2c955b1d785b8d

diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
index 61f51d5419c3..ef5ed40e2ef7 100644
--- a/arch/arm/boot/dts/Makefile
+++ b/arch/arm/boot/dts/Makefile
@@ -877,6 +877,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += \
 	rv1126-rmsl-ddr3-v1.dtb \
 	rv1126-snapshot.dtb \
 	rv1126-sphericalipc-ddr3-v10.dtb \
+	rv1126-trailcamera.dtb \
 	rk3036-evb.dtb \
 	rk3036-kylin.dtb \
 	rk3066a-bqcurie2.dtb \
diff --git a/arch/arm/boot/dts/rv1126-trailcamera.dts b/arch/arm/boot/dts/rv1126-trailcamera.dts
new file mode 100644
index 000000000000..d4aa8fbc2594
--- /dev/null
+++ b/arch/arm/boot/dts/rv1126-trailcamera.dts
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
+ */
+
+/dts-v1/;
+#include "rv1126-bat-evb-v10.dtsi"
+#include "rv1126-thunder-boot-spi-nor.dtsi"
+
+/ {
+	model = "Rockchip RV1126 trailcamera Board";
+	compatible = "rockchip,rv1126-trailcamera", "rockchip,rv1126";
+
+	reserved-memory {
+		/delete-node/ mmc@20f000;
+		/delete-node/ mmc@500000;
+	};
+};
+
+&emmc {
+	/delete-property/ memory-region-ecsd;
+	status = "disabled";
+};
+
+&thunderboot_ramoops {
+	reg = <0x00280000 0x00010000>;
+	record-size = <0x0000>;
+	console-size = <0x00000>;
+	ftrace-size = <0x00000>;
+	pmsg-size = <0x00000>;
+	mcu-log-size = <0x10000>;
+	mcu-log-count = <0x1>;
+};
+
+&rkisp_thunderboot {
+	reg = <0x08000000 (64 * 0x00100000)>;
+};
+
+&rkisp_vir1 {
+	status = "okay";
+};
+
+&rkispp_vir1 {
+	status = "okay";
+};
+
+&sdio {
+	status = "disabled";
+};
+
+&sfc {
+	/delete-property/ assigned-clocks;
+	/delete-property/ assigned-clock-rates;
+	status = "okay";
+};
+
+&thunder_boot_mmc {
+	/delete-property/ memory-region-idmac;
+	status = "disabled";
+};

commit e324350fe70e8b2daa903efc61fa98139761fc68
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Fri Nov 19 08:10:51 2021 +0800

    PCIe: rockchip: Fix uninitialized lock
    
    intx_lock should be initialized before use.
    
    Fixes: ee99fe07a7df ("PCIe: rockchip:  Add more legacy int support")
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: I39586ae4f8edc1c39d78ce95af29f24bfc46b4d4

diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
index d5b785272fde..c03fa51e8c04 100644
--- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
+++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
@@ -1234,6 +1234,7 @@ static int rk_pcie_init_irq_domain(struct rk_pcie *rockchip)
 		return -EINVAL;
 	}
 
+	raw_spin_lock_init(&rockchip->intx_lock);
 	rockchip->irq_domain = irq_domain_add_linear(intc, PCI_NUM_INTX,
 						     &intx_domain_ops, rockchip);
 	if (!rockchip->irq_domain) {

commit 1ecdb89e3457e2e3843408d6dc9b7ed47cb3eab0
Author: Kyle Tso <kyletso@google.com>
Date:   Fri Feb 5 11:34:15 2021 +0800

    UPSTREAM: usb: typec: tcpm: Get Sink VDO from fwnode
    
    Commit a079973f462a ("usb: typec: tcpm: Remove tcpc_config
    configuration mechanism") removed the tcpc_config which includes the
    Sink VDO and it is not yet added back with fwnode. Add it now.
    
    Acked-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
    Signed-off-by: Kyle Tso <kyletso@google.com>
    Link: https://lore.kernel.org/r/20210205033415.3320439-8-kyletso@google.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    (cherry picked from commit f5d1d63e7359c6b3c65097b4941756b3d8ac0be0
     https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-next)
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Signed-off-by: Wang Jie <dave.wang@rock-chips.com>
    Change-Id: I5ac46e01f3c8f3f616e81097bb013a4603e8fa05
    (cherry picked from commit 2ab1b9bec32898885e4908cf8dc0675ddacf530a)

diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index 38c809d1aed2..2dd6fb81edbe 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -5455,6 +5455,20 @@ static int tcpm_fw_get_caps(struct tcpm_port *port,
 			port->frs_current = frs_current;
 	}
 
+	/* sink-vdos is optional */
+	ret = fwnode_property_count_u32(fwnode, "sink-vdos");
+	if (ret < 0)
+		ret = 0;
+
+	port->nr_snk_vdo = min(ret, VDO_MAX_OBJECTS);
+	if (port->nr_snk_vdo) {
+		ret = fwnode_property_read_u32_array(fwnode, "sink-vdos",
+						     port->snk_vdo,
+						     port->nr_snk_vdo);
+		if (ret < 0)
+			return ret;
+	}
+
 	return 0;
 }
 

commit 870df5dbb204e1960b9b5838ce8ef931d1ed086e
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Thu Nov 14 12:18:40 2019 +0100

    UPSTREAM: usb: typec: tcpm: Remove tcpc_config configuration mechanism
    
    All configuration can and should be done through fwnodes instead of
    through the tcpc_config struct and there are no existing users left of
    struct tcpc_config, so lets remove it.
    
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
    Link: https://lore.kernel.org/r/20191114111840.40876-1-hdegoede@redhat.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Wang Jie <dave.wang@rock-chips.com>
    (cherry picked from commit a079973f462a3d506c6a7f00c770a55b167ed094)
    Change-Id: I7aa3c9094af653c9eaaad4cff2a8f1071d719d73

diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index 4ad0fdf0b186..38c809d1aed2 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -515,9 +515,6 @@ static enum tcpm_state tcpm_default_state(struct tcpm_port *port)
 			return SNK_UNATTACHED;
 		else if (port->try_role == TYPEC_SOURCE)
 			return SRC_UNATTACHED;
-		else if (port->tcpc->config &&
-			 port->tcpc->config->default_role == TYPEC_SINK)
-			return SNK_UNATTACHED;
 		/* Fall through to return SRC_UNATTACHED */
 	} else if (port->port_type == TYPEC_PORT_SNK) {
 		return SNK_UNATTACHED;
@@ -5097,7 +5094,7 @@ static int tcpm_try_role(const struct typec_capability *cap, int role)
 	mutex_lock(&port->lock);
 	if (tcpc->try_role)
 		ret = tcpc->try_role(tcpc, role);
-	if (!ret && (!tcpc->config || !tcpc->config->try_role_hw))
+	if (!ret)
 		port->try_role = role;
 	port->try_src_count = 0;
 	port->try_snk_count = 0;
@@ -5367,20 +5364,6 @@ static int tcpm_copy_pdos(u32 *dest_pdo, const u32 *src_pdo,
 	return nr_pdo;
 }
 
-static int tcpm_copy_vdos(u32 *dest_vdo, const u32 *src_vdo,
-			  unsigned int nr_vdo)
-{
-	unsigned int i;
-
-	if (nr_vdo > VDO_MAX_OBJECTS)
-		nr_vdo = VDO_MAX_OBJECTS;
-
-	for (i = 0; i < nr_vdo; i++)
-		dest_vdo[i] = src_vdo[i];
-
-	return nr_vdo;
-}
-
 static int tcpm_fw_get_caps(struct tcpm_port *port,
 			    struct fwnode_handle *fwnode)
 {
@@ -5760,31 +5743,6 @@ static int devm_tcpm_psy_register(struct tcpm_port *port)
 	return PTR_ERR_OR_ZERO(port->psy);
 }
 
-static int tcpm_copy_caps(struct tcpm_port *port,
-			  const struct tcpc_config *tcfg)
-{
-	if (tcpm_validate_caps(port, tcfg->src_pdo, tcfg->nr_src_pdo) ||
-	    tcpm_validate_caps(port, tcfg->snk_pdo, tcfg->nr_snk_pdo))
-		return -EINVAL;
-
-	port->nr_src_pdo = tcpm_copy_pdos(port->src_pdo, tcfg->src_pdo,
-					  tcfg->nr_src_pdo);
-	port->nr_snk_pdo = tcpm_copy_pdos(port->snk_pdo, tcfg->snk_pdo,
-					  tcfg->nr_snk_pdo);
-
-	port->nr_snk_vdo = tcpm_copy_vdos(port->snk_vdo, tcfg->snk_vdo,
-					  tcfg->nr_snk_vdo);
-
-	port->operating_snk_mw = tcfg->operating_snk_mw;
-
-	port->typec_caps.prefer_role = tcfg->default_role;
-	port->typec_caps.type = tcfg->type;
-	port->typec_caps.data = tcfg->data;
-	port->self_powered = tcfg->self_powered;
-
-	return 0;
-}
-
 static enum hrtimer_restart state_machine_timer_handler(struct hrtimer *timer)
 {
 	struct tcpm_port *port = container_of(timer, struct tcpm_port, state_machine_timer);
@@ -5893,7 +5851,7 @@ static int tcpm_extcon_register(struct tcpm_port *port)
 struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
 {
 	struct tcpm_port *port;
-	int i, err;
+	int err;
 	struct sched_param param = { .sched_priority = MAX_RT_PRIO - 1 };
 
 	if (!dev || !tcpc ||
@@ -5944,15 +5902,10 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
 		goto out_destroy_wq;
 
 	err = tcpm_fw_get_caps(port, tcpc->fwnode);
-	if ((err < 0) && tcpc->config)
-		err = tcpm_copy_caps(port, tcpc->config);
 	if (err < 0)
 		goto out_destroy_wq;
 
-	if (!tcpc->config || !tcpc->config->try_role_hw)
-		port->try_role = port->typec_caps.prefer_role;
-	else
-		port->try_role = TYPEC_NO_PREFERRED_ROLE;
+	port->try_role = port->typec_caps.prefer_role;
 
 	port->typec_caps.fwnode = tcpc->fwnode;
 	port->typec_caps.revision = 0x0120;	/* Type-C spec release 1.2 */
@@ -5982,29 +5935,6 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
 		goto out_destroy_wq;
 	}
 
-	if (tcpc->config && tcpc->config->alt_modes) {
-		const struct typec_altmode_desc *paltmode = tcpc->config->alt_modes;
-
-		i = 0;
-		while (paltmode->svid && i < ARRAY_SIZE(port->port_altmode)) {
-			struct typec_altmode *alt;
-
-			alt = typec_port_register_altmode(port->typec_port,
-							  paltmode);
-			if (IS_ERR(alt)) {
-				tcpm_log(port,
-					 "%s: failed to register port alternate mode 0x%x",
-					 dev_name(dev), paltmode->svid);
-				break;
-			}
-			typec_altmode_set_drvdata(alt, port);
-			alt->ops = &tcpm_altmode_ops;
-			port->port_altmode[i] = alt;
-			i++;
-			paltmode++;
-		}
-	}
-
 	mutex_lock(&port->lock);
 	tcpm_init(port);
 	mutex_unlock(&port->lock);
diff --git a/include/linux/usb/tcpm.h b/include/linux/usb/tcpm.h
index 3e3101e21373..c910188d951f 100644
--- a/include/linux/usb/tcpm.h
+++ b/include/linux/usb/tcpm.h
@@ -59,45 +59,6 @@ enum tcpm_transmit_type {
 	TCPC_TX_BIST_MODE_2 = 7
 };
 
-/**
- * struct tcpc_config - Port configuration
- * @src_pdo:	PDO parameters sent to port partner as response to
- *		PD_CTRL_GET_SOURCE_CAP message
- * @nr_src_pdo:	Number of entries in @src_pdo
- * @snk_pdo:	PDO parameters sent to partner as response to
- *		PD_CTRL_GET_SINK_CAP message
- * @nr_snk_pdo:	Number of entries in @snk_pdo
- * @operating_snk_mw:
- *		Required operating sink power in mW
- * @type:	Port type (TYPEC_PORT_DFP, TYPEC_PORT_UFP, or
- *		TYPEC_PORT_DRP)
- * @default_role:
- *		Default port role (TYPEC_SINK or TYPEC_SOURCE).
- *		Set to TYPEC_NO_PREFERRED_ROLE if no default role.
- * @try_role_hw:True if try.{Src,Snk} is implemented in hardware
- * @alt_modes:	List of supported alternate modes
- */
-struct tcpc_config {
-	const u32 *src_pdo;
-	unsigned int nr_src_pdo;
-
-	const u32 *snk_pdo;
-	unsigned int nr_snk_pdo;
-
-	const u32 *snk_vdo;
-	unsigned int nr_snk_vdo;
-
-	unsigned int operating_snk_mw;
-
-	enum typec_port_type type;
-	enum typec_port_data data;
-	enum typec_role default_role;
-	bool try_role_hw;	/* try.{src,snk} implemented in hardware */
-	bool self_powered;	/* port belongs to a self powered device */
-
-	const struct typec_altmode_desc *alt_modes;
-};
-
 /* Mux state attributes */
 #define TCPC_MUX_USB_ENABLED		BIT(0)	/* USB enabled */
 #define TCPC_MUX_DP_ENABLED		BIT(1)	/* DP enabled */
@@ -105,7 +66,6 @@ struct tcpc_config {
 
 /**
  * struct tcpc_dev - Port configuration and callback functions
- * @config:	Pointer to port configuration
  * @fwnode:	Pointer to port fwnode
  * @get_vbus:	Called to read current VBUS state
  * @get_current_limit:
@@ -137,7 +97,6 @@ struct tcpc_config {
  *		accessories support fast role swap.
  */
 struct tcpc_dev {
-	const struct tcpc_config *config;
 	struct fwnode_handle *fwnode;
 
 	int (*init)(struct tcpc_dev *dev);

commit be32fafb08b3e880cd49befb1087653ce45fe87a
Author: Yandong Lin <yandong.lin@rock-chips.com>
Date:   Wed Nov 10 11:37:43 2021 +0800

    video: rockchip: mpp: Fix mpp_iommu_refresh crash issue
    
    1. mpp_iommu_refresh will crash after mpp_iommu_detach, cause by
    iommu->domain is null.
    2. After the mpp_iommu_refresh operation, there is no need to do
    mpp_iommu_detach/attach operations, because the purpose is the same
    for refresh iommu.
    
    Signed-off-by: Yandong Lin <yandong.lin@rock-chips.com>
    Change-Id: I7c39a63cac67e94b80e7df26c8962b3fed4c670e

diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c
index 63144255eae6..48a7aa55c671 100644
--- a/drivers/video/rockchip/mpp/mpp_common.c
+++ b/drivers/video/rockchip/mpp/mpp_common.c
@@ -625,8 +625,6 @@ int mpp_dev_reset(struct mpp_dev *mpp)
 	mpp_iommu_down_write(mpp->iommu_info);
 	mpp_reset_down_write(mpp->reset_group);
 	atomic_set(&mpp->reset_request, 0);
-	mpp_iommu_detach(mpp->iommu_info);
-
 	rockchip_save_qos(mpp->dev);
 	if (mpp->hw_ops->reset)
 		mpp->hw_ops->reset(mpp);
@@ -638,7 +636,6 @@ int mpp_dev_reset(struct mpp_dev *mpp)
 	 */
 	mpp_iommu_refresh(mpp->iommu_info, mpp->dev);
 
-	mpp_iommu_attach(mpp->iommu_info);
 	mpp_reset_up_write(mpp->reset_group);
 	mpp_iommu_up_write(mpp->iommu_info);
 
diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c
index 4d2048b3803f..1c0b0d9540d2 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c
@@ -665,7 +665,6 @@ static int rkvdec2_link_reset(struct mpp_dev *mpp)
 	rockchip_dmcfreq_unlock();
 	mutex_unlock(&dec->sip_reset_lock);
 
-	mpp_iommu_detach(mpp->iommu_info);
 	rockchip_restore_qos(mpp->dev);
 
 	/* Note: if the domain does not change, iommu attach will be return
@@ -674,7 +673,6 @@ static int rkvdec2_link_reset(struct mpp_dev *mpp)
 	 */
 	mpp_iommu_refresh(mpp->iommu_info, mpp->dev);
 
-	mpp_iommu_attach(mpp->iommu_info);
 	mpp_reset_up_write(mpp->reset_group);
 	mpp_iommu_up_write(mpp->iommu_info);
 

commit 6d7ce2c8a00ddf6f7018782df44be23e25cf575c
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Wed Nov 17 21:23:24 2021 +0800

    drivers: rkflash: Support F35SQA002G
    
    Change-Id: I5d421c084ca001f061f4bec371046cf28d814555
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/rkflash/sfc_nand.c b/drivers/rkflash/sfc_nand.c
index aa9c8fffe3cf..7e307978b957 100644
--- a/drivers/rkflash/sfc_nand.c
+++ b/drivers/rkflash/sfc_nand.c
@@ -111,6 +111,8 @@ static struct nand_info spi_nand_tbl[] = {
 	{ 0xCD, 0xEC, 0x00, 4, 0x40, 2, 2048, 0x4C, 20, 0x4, 0, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
 	/* F35SQA001G */
 	{ 0xCD, 0x71, 0x00, 4, 0x40, 1, 1024, 0x4C, 18, 0x1, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
+	/* F35SQA002G */
+	{ 0xCD, 0x72, 0x00, 4, 0x40, 1, 2048, 0x4C, 19, 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 },

commit 2e9a54567061e6cababd1a3d76810599f6162f4d
Author: Liang Chen <cl@rock-chips.com>
Date:   Thu Nov 11 20:02:43 2021 +0800

    arm64: dts: rockchip: rk3568: adjust bus-npu-opp-table
    
    Change-Id: Ieb37cf13ddd1c9119dc12cc31b8181caf4bcfe0e
    Signed-off-by: Liang Chen <cl@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index 4cda4c1d5e06..8e8a943b7968 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -1147,6 +1147,14 @@
 		>;
 		rockchip,pvtm-ch = <0 5>;
 
+		opp-700000000 {
+			opp-hz = /bits/ 64 <700000000>;
+			opp-microvolt = <0>;
+		};
+		opp-900000000 {
+			opp-hz = /bits/ 64 <900000000>;
+			opp-microvolt = <900000>;
+		};
 		opp-1000000000 {
 			opp-hz = /bits/ 64 <1000000000>;
 			opp-microvolt = <950000>;
@@ -1154,10 +1162,6 @@
 			opp-microvolt-L1 = <925000>;
 			opp-microvolt-L2 = <0>;
 		};
-		opp-900000000 {
-			opp-hz = /bits/ 64 <900000000>;
-			opp-microvolt = <0>;
-		};
 	};
 
 	rknpu_mmu: iommu@fde4b000 {

commit 4b0d5f03427e2021375c707c6b0b1e89cb81754b
Author: Alistair Delva <adelva@google.com>
Date:   Wed Nov 17 09:58:10 2021 -0800

    ANDROID: setlocalversion: make KMI_GENERATION optional
    
    GKI required the KMI_GENERATION to be added to the kernel version
    string, but this only makes sense for GKI kernels, for non-GKI kernels
    we don't need it. Leave all the other stuff we added, though, as it
    seems useful.
    
    Bug: 205897686
    Change-Id: I2e7b3cb7ed5529f1e5e7c9d79a1f7ce4a1b6ee1f
    Signed-off-by: Alistair Delva <adelva@google.com>

diff --git a/scripts/setlocalversion b/scripts/setlocalversion
index c2e8455b3aeb..5ca29cbf2fa1 100755
--- a/scripts/setlocalversion
+++ b/scripts/setlocalversion
@@ -41,8 +41,6 @@ if test $# -gt 0; then
 		kmi_generation=$1
 		[ $(expr $kmi_generation : '^[0-9]\+$') -eq 0 ] && usage
 		shift
-	else
-		usage
 	fi
 fi
 if test $# -gt 0 -o ! -d "$srctree"; then
@@ -69,6 +67,8 @@ scm_version()
 
 		if [ -n "$android_release" ] && [ -n "$kmi_generation" ]; then
 			printf '%s' "-$android_release-$kmi_generation"
+		elif [ -n "$android_release" ]; then
+			printf '%s' "-$android_release"
 		fi
 
 		# If we are at a tagged commit (like "v2.6.30-rc6"), we ignore

commit 1e8c38dae95581690cbf9c75bba89962b4ea50ee
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Tue Nov 16 10:42:50 2021 +0800

    PCIe: rockchip:  Add more legacy int support
    
    Some vendor drivers rely on flow control by toggling
    enable/disable virtual irq if using legacy interrupt.
    It can certainly change the behaviour by function
    drivers, but adding corresponding operations would make
    RC driver more flexible.
    
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: Idf3e6a0ca9c4ebde369745713a88db53e3f72ea5

diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
index d37d0732d702..d5b785272fde 100644
--- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
+++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
@@ -87,6 +87,8 @@ struct reset_bulk_data	{
 #define PCIE_CLIENT_INTR_STATUS_MISC	0x10
 #define PCIE_CLIENT_INTR_MASK_LEGACY	0x1c
 #define UNMASK_ALL_LEGACY_INT		0xffff0000
+#define MASK_LEGACY_INT(x)		(0x00110011 << x)
+#define UNMASK_LEGACY_INT(x)		(0x00110000 << x)
 #define PCIE_CLIENT_INTR_MASK		0x24
 #define PCIE_CLIENT_GENERAL_DEBUG	0x104
 #define PCIE_CLIENT_HOT_RESET_CTRL	0x180
@@ -141,6 +143,7 @@ struct rk_pcie {
 	bool				bifurcation;
 	struct regulator		*vpcie3v3;
 	struct irq_domain		*irq_domain;
+	raw_spinlock_t			intx_lock;
 };
 
 struct rk_pcie_of_data {
@@ -1149,10 +1152,41 @@ static void rk_pcie_fast_link_setup(struct rk_pcie *rk_pcie)
 	rk_pcie_writel_apb(rk_pcie, PCIE_CLIENT_HOT_RESET_CTRL, val);
 }
 
+static void rk_pcie_legacy_irq_mask(struct irq_data *d)
+{
+	struct rk_pcie *rk_pcie = irq_data_get_irq_chip_data(d);
+	unsigned long flags;
+
+	raw_spin_lock_irqsave(&rk_pcie->intx_lock, flags);
+	rk_pcie_writel_apb(rk_pcie, PCIE_CLIENT_INTR_MASK_LEGACY,
+			   MASK_LEGACY_INT(d->hwirq));
+	raw_spin_unlock_irqrestore(&rk_pcie->intx_lock, flags);
+}
+
+static void rk_pcie_legacy_irq_unmask(struct irq_data *d)
+{
+	struct rk_pcie *rk_pcie = irq_data_get_irq_chip_data(d);
+	unsigned long flags;
+
+	raw_spin_lock_irqsave(&rk_pcie->intx_lock, flags);
+	rk_pcie_writel_apb(rk_pcie, PCIE_CLIENT_INTR_MASK_LEGACY,
+			   UNMASK_LEGACY_INT(d->hwirq));
+	raw_spin_unlock_irqrestore(&rk_pcie->intx_lock, flags);
+}
+
+static struct irq_chip rk_pcie_legacy_irq_chip = {
+	.name		= "rk-pcie-legacy-int",
+	.irq_enable	= rk_pcie_legacy_irq_unmask,
+	.irq_disable	= rk_pcie_legacy_irq_mask,
+	.irq_mask	= rk_pcie_legacy_irq_mask,
+	.irq_unmask	= rk_pcie_legacy_irq_unmask,
+	.flags		= IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MASK_ON_SUSPEND,
+};
+
 static int rk_pcie_intx_map(struct irq_domain *domain, unsigned int irq,
 			    irq_hw_number_t hwirq)
 {
-	irq_set_chip_and_handler(irq, &dummy_irq_chip, handle_simple_irq);
+	irq_set_chip_and_handler(irq, &rk_pcie_legacy_irq_chip, handle_simple_irq);
 	irq_set_chip_data(irq, domain->host_data);
 
 	return 0;

commit eb48e694e1a1d7e7c0777ac2076cfa6f1a491cb1
Author: William Wu <william.wu@rock-chips.com>
Date:   Mon Aug 23 09:27:30 2021 +0800

    phy: rockchip: inno-usb2: keep utmi clk on during charge detection
    
    The utmi clk is provided by the USB PHY for the USB controller.
    And the utmi clk is disabled if the USB PHY enter suspend mode.
    The current charge detection sets the USB PHY in suspend mode
    at first, then take about hundreds of milliseconds to do charge
    detection, in other words, the utmi clk will be disabled hundreds
    of milliseconds. It may cause the USB controller work abnormally
    during the charge detection.
    
    Actually, the conditions for charger detection is:
    1. Set the utmi_opmode in non-driving mode.
    2. Set the utmi_xcvrselect to FS speed.
    3. Set the utmi_termselect to FS speed.
    4. Enable the DP/DM pulldown resistor.
    
    This patch adds a new chg_mode to set the PHY in charge detection
    mode according to the above conditions, and set the PHY in normal
    mode to keep the utmi clk at the same time.
    
    Signed-off-by: William Wu <william.wu@rock-chips.com>
    Change-Id: I1cbf565d5145bdae5bc91132bc5fbff23a5cc443

diff --git a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
index bbdcf3f58e63..3299f403d998 100644
--- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
+++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
@@ -111,7 +111,7 @@ struct usb2phy_reg {
  * @rdm_pdwn_en: open dm pull down resistor.
  * @vdm_src_en: open dm voltage source.
  * @vdp_src_en: open dp voltage source.
- * @opmode: utmi operational mode.
+ * @chg_mode: set phy in charge detection mode.
  */
 struct rockchip_chg_det_reg {
 	struct usb2phy_reg	cp_det;
@@ -123,7 +123,7 @@ struct rockchip_chg_det_reg {
 	struct usb2phy_reg	rdm_pdwn_en;
 	struct usb2phy_reg	vdm_src_en;
 	struct usb2phy_reg	vdp_src_en;
-	struct usb2phy_reg	opmode;
+	struct usb2phy_reg	chg_mode;
 };
 
 /**
@@ -281,6 +281,9 @@ struct rockchip_usb2phy_port {
  * @chg_type: USB charger types.
  * @dcd_retries: The retry count used to track Data contact
  *		 detection process.
+ * @primary_retries: The retry count used for charger
+ *		     detection primary phase.
+ * @phy_sus_cfg: Store the phy current suspend configuration.
  * @edev_self: represent the source of extcon.
  * @irq: IRQ number assigned for phy which combined irqs of
  *	 otg port and host port.
@@ -300,6 +303,7 @@ struct rockchip_usb2phy {
 	enum power_supply_type	chg_type;
 	u8			dcd_retries;
 	u8			primary_retries;
+	unsigned int		phy_sus_cfg;
 	bool			edev_self;
 	int			irq;
 	struct extcon_dev	*edev;
@@ -1210,22 +1214,40 @@ static void rockchip_chg_detect_work(struct work_struct *work)
 		container_of(work, struct rockchip_usb2phy_port, chg_work.work);
 	struct rockchip_usb2phy *rphy = dev_get_drvdata(rport->phy->dev.parent);
 	struct regmap *base = get_reg_base(rphy);
+	const struct usb2phy_reg *phy_sus_reg;
 	bool is_dcd, tmout, vout;
 	unsigned long delay;
+	unsigned int mask;
+	int ret;
 
 	dev_dbg(&rport->phy->dev, "chg detection work state = %d\n",
 		rphy->chg_state);
 
+	/*
+	 * The conditions for charger detection:
+	 * 1. Set the PHY in normal mode to keep the UTMI_CLK on.
+	 * 2. Set the utmi_opmode in non-driving mode.
+	 * 3. Set the utmi_xcvrselect to FS speed.
+	 * 4. Set the utmi_termselect to FS speed.
+	 * 5. Enable the DP/DM pulldown resistor.
+	 */
 	switch (rphy->chg_state) {
 	case USB_CHG_STATE_UNDEFINED:
 		mutex_lock(&rport->mutex);
-		if (!rport->suspended) {
+		/* Store the PHY current suspend configuration */
+		phy_sus_reg = &rport->port_cfg->phy_sus;
+		ret = regmap_read(base, phy_sus_reg->offset,
+				  &rphy->phy_sus_cfg);
+		if (ret) {
+			dev_err(&rport->phy->dev,
+				"Fail to read phy_sus reg offset 0x%x, ret %d\n",
+				phy_sus_reg->offset, ret);
 			mutex_unlock(&rport->mutex);
-			rockchip_usb2phy_power_off(rport->phy);
-			mutex_lock(&rport->mutex);
+			return;
 		}
-		/* put the controller in non-driving mode */
-		property_enable(base, &rphy->phy_cfg->chg_det.opmode, false);
+
+		/* Set the PHY in charger detection mode */
+		property_enable(base, &rphy->phy_cfg->chg_det.chg_mode, true);
 		/* Start DCD processing stage 1 */
 		rockchip_chg_enable_dcd(rphy, true);
 		rphy->chg_state = USB_CHG_STATE_WAIT_FOR_DCD;
@@ -1301,8 +1323,17 @@ static void rockchip_chg_detect_work(struct work_struct *work)
 		rphy->chg_state = USB_CHG_STATE_DETECTED;
 		/* fall through */
 	case USB_CHG_STATE_DETECTED:
-		/* put the controller in normal mode */
-		property_enable(base, &rphy->phy_cfg->chg_det.opmode, true);
+		/* Restore the PHY suspend configuration */
+		phy_sus_reg = &rport->port_cfg->phy_sus;
+		mask = GENMASK(phy_sus_reg->bitend, phy_sus_reg->bitstart);
+		ret = regmap_write(base, phy_sus_reg->offset,
+				   ((rphy->phy_sus_cfg <<
+				     phy_sus_reg->bitstart) |
+				    (mask << BIT_WRITEABLE_SHIFT)));
+		if (ret)
+			dev_err(&rport->phy->dev,
+				"Fail to set phy_sus reg offset 0x%x, ret %d\n",
+				phy_sus_reg->offset, ret);
 		mutex_unlock(&rport->mutex);
 		rockchip_usb2phy_otg_sm_work(&rport->otg_sm_work.work);
 		dev_info(&rport->phy->dev, "charger = %s\n",
@@ -2493,7 +2524,7 @@ static const struct rockchip_usb2phy_cfg rk1808_phy_cfgs[] = {
 			}
 		},
 		.chg_det = {
-			.opmode		= { 0x0100, 3, 0, 5, 1 },
+			.chg_mode	= { 0x0100, 8, 0, 0, 0x1d7 },
 			.cp_det		= { 0x0120, 24, 24, 0, 1 },
 			.dcp_det	= { 0x0120, 23, 23, 0, 1 },
 			.dp_det		= { 0x0120, 25, 25, 0, 1 },
@@ -2545,7 +2576,7 @@ static const struct rockchip_usb2phy_cfg rk312x_phy_cfgs[] = {
 			}
 		},
 		.chg_det = {
-			.opmode		= { 0x017c, 3, 0, 5, 1 },
+			.chg_mode	= { 0x017c, 8, 0, 0, 0x1d7 },
 			.cp_det		= { 0x02c0, 6, 6, 0, 1 },
 			.dcp_det	= { 0x02c0, 5, 5, 0, 1 },
 			.dp_det		= { 0x02c0, 7, 7, 0, 1 },
@@ -2596,7 +2627,7 @@ static const struct rockchip_usb2phy_cfg rk3228_phy_cfgs[] = {
 			}
 		},
 		.chg_det = {
-			.opmode		= { 0x0760, 3, 0, 5, 1 },
+			.chg_mode	= { 0x0760, 8, 0, 0, 0x1d7 },
 			.cp_det		= { 0x0884, 4, 4, 0, 1 },
 			.dcp_det	= { 0x0884, 3, 3, 0, 1 },
 			.dp_det		= { 0x0884, 5, 5, 0, 1 },
@@ -2669,7 +2700,7 @@ static const struct rockchip_usb2phy_cfg rk3308_phy_cfgs[] = {
 			}
 		},
 		.chg_det = {
-			.opmode		= { 0x0100, 3, 0, 5, 1 },
+			.chg_mode	= { 0x0100, 8, 0, 0, 0x1d7 },
 			.cp_det		= { 0x0120, 24, 24, 0, 1 },
 			.dcp_det	= { 0x0120, 23, 23, 0, 1 },
 			.dp_det		= { 0x0120, 25, 25, 0, 1 },
@@ -2726,7 +2757,7 @@ static const struct rockchip_usb2phy_cfg rk3328_phy_cfgs[] = {
 			}
 		},
 		.chg_det = {
-			.opmode		= { 0x0100, 3, 0, 5, 1 },
+			.chg_mode	= { 0x0100, 8, 0, 0, 0x1d7 },
 			.cp_det		= { 0x0120, 24, 24, 0, 1 },
 			.dcp_det	= { 0x0120, 23, 23, 0, 1 },
 			.dp_det		= { 0x0120, 25, 25, 0, 1 },
@@ -2796,7 +2827,7 @@ static const struct rockchip_usb2phy_cfg rk3368_phy_cfgs[] = {
 			}
 		},
 		.chg_det = {
-			.opmode		= { 0x0700, 3, 0, 5, 1 },
+			.chg_mode	= { 0x0700, 8, 0, 0, 0x1d7 },
 			.cp_det		= { 0x04b8, 30, 30, 0, 1 },
 			.dcp_det	= { 0x04b8, 29, 29, 0, 1 },
 			.dp_det		= { 0x04b8, 31, 31, 0, 1 },
@@ -2852,7 +2883,7 @@ static const struct rockchip_usb2phy_cfg rk3399_phy_cfgs[] = {
 			}
 		},
 		.chg_det = {
-			.opmode		= { 0xe454, 3, 0, 5, 1 },
+			.chg_mode	= { 0xe454, 8, 0, 0, 0x1d7 },
 			.cp_det		= { 0xe2ac, 2, 2, 0, 1 },
 			.dcp_det	= { 0xe2ac, 1, 1, 0, 1 },
 			.dp_det		= { 0xe2ac, 0, 0, 0, 1 },
@@ -2902,7 +2933,7 @@ static const struct rockchip_usb2phy_cfg rk3399_phy_cfgs[] = {
 			}
 		},
 		.chg_det = {
-			.opmode		= { 0xe464, 3, 0, 5, 1 },
+			.chg_mode	= { 0xe464, 8, 0, 0, 0x1d7 },
 			.cp_det		= { 0xe2ac, 5, 5, 0, 1 },
 			.dcp_det	= { 0xe2ac, 4, 4, 0, 1 },
 			.dp_det		= { 0xe2ac, 3, 3, 0, 1 },
@@ -2961,7 +2992,7 @@ static const struct rockchip_usb2phy_cfg rk3568_phy_cfgs[] = {
 			}
 		},
 		.chg_det = {
-			.opmode		= { 0x0000, 3, 0, 5, 1 },
+			.chg_mode	= { 0x0000, 8, 0, 0, 0x1d7 },
 			.cp_det		= { 0x00c0, 24, 24, 0, 1 },
 			.dcp_det	= { 0x00c0, 23, 23, 0, 1 },
 			.dp_det		= { 0x00c0, 25, 25, 0, 1 },
@@ -3028,7 +3059,7 @@ static const struct rockchip_usb2phy_cfg rv1108_phy_cfgs[] = {
 			}
 		},
 		.chg_det = {
-			.opmode		= { 0x0100, 3, 0, 5, 1 },
+			.chg_mode	= { 0x0100, 8, 0, 0, 0x1d7 },
 			.cp_det		= { 0x0804, 1, 1, 0, 1 },
 			.dcp_det	= { 0x0804, 0, 0, 0, 1 },
 			.dp_det		= { 0x0804, 2, 2, 0, 1 },

commit 57b68ce21a179145ea5ec2ab179dff6694597518
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Mon Nov 15 15:40:51 2021 +0800

    drm/rockchip: ebc_dev: release version v2.14
    
    skip black frame when resume
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: I2e0ade3213fc8323d88de51571ded7655da6406b

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index 9e7e1f483c5c..704816983942 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -1118,56 +1118,56 @@ get_overlay_image:
 	.p2align 3,,7
 	.type	waveform_open, %function
 waveform_open:
-.LFB2836:
-	.loc 1 2012 0
+.LFB2837:
+	.loc 1 2053 0
 	.cfi_startproc
 .LVL62:
-	.loc 1 2016 0
+	.loc 1 2057 0
 	mov	w0, 0
 .LVL63:
-	.loc 1 2013 0
+	.loc 1 2054 0
 	str	xzr, [x1, 104]
-	.loc 1 2016 0
+	.loc 1 2057 0
 	ret
 	.cfi_endproc
-.LFE2836:
+.LFE2837:
 	.size	waveform_open, .-waveform_open
 	.section	.exit.text,"ax",@progbits
 	.align	2
 	.type	ebc_exit, %function
 ebc_exit:
-.LFB2856:
-	.loc 1 2591 0
+.LFB2857:
+	.loc 1 2632 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2592 0
+	.loc 1 2633 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2591 0
+	.loc 1 2632 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2592 0
+	.loc 1 2633 0
 	bl	platform_driver_unregister
 .LVL64:
-	.loc 1 2593 0
+	.loc 1 2634 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2856:
+.LFE2857:
 	.size	ebc_exit, .-ebc_exit
 	.text
 	.align	2
 	.p2align 3,,7
 	.type	ebc_resume, %function
 ebc_resume:
-.LFB2854:
-	.loc 1 2553 0
+.LFB2855:
+	.loc 1 2594 0
 	.cfi_startproc
 .LVL65:
 	stp	x29, x30, [sp, -32]!
@@ -1185,7 +1185,7 @@ ebc_resume:
 	ldr	x19, [x0, 184]
 .LBE935:
 .LBE934:
-	.loc 1 2557 0
+	.loc 1 2598 0
 	ldr	x1, [x19, 16]
 .LBB936:
 .LBB937:
@@ -1198,15 +1198,15 @@ ebc_resume:
 .LVL67:
 .LBE937:
 .LBE936:
-	.loc 1 2558 0
+	.loc 1 2599 0
 	str	wzr, [x19, 804]
-	.loc 1 2559 0
+	.loc 1 2600 0
 	ldr	x0, [x19, 288]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
 .LVL68:
-	.loc 1 2562 0
+	.loc 1 2603 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -1216,27 +1216,27 @@ ebc_resume:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2854:
+.LFE2855:
 	.size	ebc_resume, .-ebc_resume
 	.align	2
 	.p2align 3,,7
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
-.LFB2829:
-	.loc 1 1672 0
+.LFB2830:
+	.loc 1 1713 0
 	.cfi_startproc
 .LVL69:
-	.loc 1 1673 0
+	.loc 1 1714 0
 	adrp	x0, .LANCHOR0
 .LVL70:
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1675 0
+	.loc 1 1716 0
 	ldr	w2, [x0, 624]
 	cbnz	w2, .L165
 	ret
 	.p2align 3
 .L165:
-	.loc 1 1672 0
+	.loc 1 1713 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -1248,10 +1248,10 @@ ebc_vdd_power_timeout:
 	add	x0, x0, 416
 .LBE939:
 .LBE938:
-	.loc 1 1672 0
+	.loc 1 1713 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1676 0
+	.loc 1 1717 0
 	str	wzr, [x0, 208]
 .LBB941:
 .LBB940:
@@ -1260,41 +1260,41 @@ ebc_vdd_power_timeout:
 .LVL71:
 .LBE940:
 .LBE941:
-	.loc 1 1681 0
+	.loc 1 1722 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2829:
+.LFE2830:
 	.size	ebc_vdd_power_timeout, .-ebc_vdd_power_timeout
 	.align	2
 	.p2align 3,,7
 	.type	ebc_remove, %function
 ebc_remove:
-.LFB2852:
-	.loc 1 2529 0
+.LFB2853:
+	.loc 1 2570 0
 	.cfi_startproc
 .LVL72:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2530 0
+	.loc 1 2571 0
 	adrp	x0, .LANCHOR1
 .LVL73:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2529 0
+	.loc 1 2570 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2530 0
+	.loc 1 2571 0
 	add	x0, x0, 224
-	.loc 1 2529 0
-	.loc 1 2530 0
+	.loc 1 2570 0
+	.loc 1 2571 0
 	bl	misc_deregister
 .LVL74:
-	.loc 1 2533 0
+	.loc 1 2574 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -1302,14 +1302,14 @@ ebc_remove:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2852:
+.LFE2853:
 	.size	ebc_remove, .-ebc_remove
 	.align	2
 	.p2align 3,,7
 	.type	ebc_mmap, %function
 ebc_mmap:
-.LFB2833:
-	.loc 1 1958 0
+.LFB2834:
+	.loc 1 1999 0
 	.cfi_startproc
 .LVL75:
 	stp	x29, x30, [sp, -32]!
@@ -1320,33 +1320,33 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1958 0
+	.loc 1 1999 0
 	mov	x19, x1
-	.loc 1 1961 0
+	.loc 1 2002 0
 	bl	ebc_phy_buf_base_get
 .LVL76:
-	.loc 1 1964 0
+	.loc 1 2005 0
 	lsr	x2, x0, 12
-	.loc 1 1962 0
+	.loc 1 2003 0
 	mov	x6, 16384
-	.loc 1 1964 0
+	.loc 1 2005 0
 	mov	x0, x19
-	.loc 1 1962 0
+	.loc 1 2003 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 1964 0
+	.loc 1 2005 0
 	ldp	x1, x3, [x19]
-	.loc 1 1962 0
+	.loc 1 2003 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 1964 0
+	.loc 1 2005 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
 .LVL77:
-	.loc 1 1967 0
+	.loc 1 2008 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 1970 0
+	.loc 1 2011 0
 	ldr	x19, [sp, 16]
 .LVL78:
 	csel	w0, w0, w1, eq
@@ -1357,54 +1357,54 @@ ebc_mmap:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2833:
+.LFE2834:
 	.size	ebc_mmap, .-ebc_mmap
 	.align	2
 	.p2align 3,,7
 	.type	waveform_mmap, %function
 waveform_mmap:
-.LFB2835:
-	.loc 1 1996 0
+.LFB2836:
+	.loc 1 2037 0
 	.cfi_startproc
 .LVL79:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1997 0
+	.loc 1 2038 0
 	adrp	x2, .LANCHOR0
-	.loc 1 2001 0
+	.loc 1 2042 0
 	mov	x7, 16384
-	.loc 1 2003 0
+	.loc 1 2044 0
 	mov	x0, x1
 .LVL80:
-	.loc 1 1996 0
+	.loc 1 2037 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2000 0
+	.loc 1 2041 0
 	ldr	x2, [x2, #:lo12:.LANCHOR0]
-	.loc 1 2001 0
+	.loc 1 2042 0
 	movk	x7, 0x404, lsl 16
 	ldp	x4, x5, [x1, 72]
-	.loc 1 2003 0
+	.loc 1 2044 0
 	ldp	x6, x3, [x1]
-	.loc 1 2001 0
+	.loc 1 2042 0
 	orr	x5, x5, x7
-	.loc 1 2000 0
+	.loc 1 2041 0
 	ldr	x2, [x2, 216]
-	.loc 1 2001 0
+	.loc 1 2042 0
 	str	x5, [x1, 80]
-	.loc 1 2003 0
+	.loc 1 2044 0
 	sub	x3, x3, x6
 	mov	x1, x6
 .LVL81:
 	lsr	x2, x2, 12
 	bl	remap_pfn_range
 .LVL82:
-	.loc 1 2006 0
+	.loc 1 2047 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 2009 0
+	.loc 1 2050 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1412,23 +1412,23 @@ waveform_mmap:
 	csel	w0, w0, w1, eq
 	ret
 	.cfi_endproc
-.LFE2835:
+.LFE2836:
 	.size	waveform_mmap, .-waveform_mmap
 	.align	2
 	.p2align 3,,7
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
-.LFB2832:
-	.loc 1 1757 0
+.LFB2833:
+	.loc 1 1798 0
 	.cfi_startproc
 .LVL83:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 1767 0
+	.loc 1 1808 0
 	cmp	w1, 28672
-	.loc 1 1757 0
+	.loc 1 1798 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -1442,15 +1442,15 @@ ebc_io_ctl:
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
 	.cfi_offset 23, -112
-	.loc 1 1757 0
+	.loc 1 1798 0
 	mov	x21, x2
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 1759 0
+	.loc 1 1800 0
 	adrp	x0, .LANCHOR0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1767 0
+	.loc 1 1808 0
 	bcc	.L177
 	mov	w0, 28675
 	cmp	w1, w0
@@ -1460,7 +1460,7 @@ ebc_io_ctl:
 	cmp	w0, 1
 	bls	.L178
 .L177:
-	.loc 1 1783 0
+	.loc 1 1824 0
 	mov	w0, 28677
 	cmp	w1, w0
 	beq	.L181
@@ -1476,13 +1476,13 @@ ebc_io_ctl:
 	mov	w0, 28683
 	cmp	w1, w0
 	bne	.L180
-	.loc 1 1935 0
+	.loc 1 1976 0
 	bl	ebc_empty_buf_get
 .LVL85:
 	mov	x23, x0
-	.loc 1 1936 0
+	.loc 1 1977 0
 	cbz	x0, .L201
-	.loc 1 1938 0
+	.loc 1 1979 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 408]
@@ -1493,7 +1493,7 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL86:
-	.loc 1 1939 0
+	.loc 1 1980 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL87:
@@ -1523,11 +1523,11 @@ ebc_io_ctl:
 .LBE944:
 .LBE943:
 .LBE942:
-	.loc 1 1941 0
+	.loc 1 1982 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 1940 0
+	.loc 1 1981 0
 	str	w0, [x29, 104]
-	.loc 1 1942 0
+	.loc 1 1983 0
 	stp	w4, w1, [x29, 112]
 .LBB973:
 .LBB970:
@@ -1556,7 +1556,7 @@ ebc_io_ctl:
 .LBE967:
 .LBE970:
 .LBE973:
-	.loc 1 1758 0
+	.loc 1 1799 0
 	mov	x0, x21
 .LVL92:
 .LBB974:
@@ -1604,36 +1604,36 @@ ebc_io_ctl:
 .LBE968:
 .LBE971:
 .LBE974:
-	.loc 1 1944 0
+	.loc 1 1985 0
 	mov	x0, x23
 .LVL97:
 	bl	ebc_buf_release
 .LVL98:
-	.loc 1 1945 0
+	.loc 1 1986 0
 	b	.L176
 .LVL99:
 	.p2align 3
 .L178:
-	.loc 1 1774 0
+	.loc 1 1815 0
 	cbnz	x21, .L177
-	.loc 1 1775 0
+	.loc 1 1816 0
 	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
 .LVL100:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC1
-	.loc 1 1776 0
+	.loc 1 1817 0
 	mov	x22, -14
-	.loc 1 1775 0
+	.loc 1 1816 0
 	bl	_dev_err
 .LVL101:
-	.loc 1 1776 0
+	.loc 1 1817 0
 	b	.L176
 .LVL102:
 	.p2align 3
 .L310:
-	.loc 1 1783 0
+	.loc 1 1824 0
 	mov	w0, 28674
 	cmp	w1, w0
 	beq	.L183
@@ -1644,23 +1644,23 @@ ebc_io_ctl:
 	mov	w0, 28676
 	cmp	w1, w0
 	bne	.L180
-	.loc 1 1867 0
+	.loc 1 1908 0
 	ldr	x0, [x20, 288]
-	.loc 1 1866 0
+	.loc 1 1907 0
 	mov	w2, 1
 	str	w2, [x20, 812]
-	.loc 1 1867 0
+	.loc 1 1908 0
 	adrp	x1, .LC2
 .LVL103:
-	.loc 1 1868 0
+	.loc 1 1909 0
 	mov	x22, 0
-	.loc 1 1867 0
+	.loc 1 1908 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
 .LVL104:
 	.p2align 2
 .L176:
-	.loc 1 1955 0
+	.loc 1 1996 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
 .LVL105:
@@ -1688,7 +1688,7 @@ ebc_io_ctl:
 	.p2align 3
 .L313:
 	.cfi_restore_state
-	.loc 1 1783 0
+	.loc 1 1824 0
 	cmp	w1, 28672
 	beq	.L185
 	mov	w0, 28673
@@ -1802,53 +1802,53 @@ ebc_io_ctl:
 .LBE977:
 .LBE976:
 .LBE975:
-	.loc 1 1821 0
+	.loc 1 1862 0
 	bl	ebc_phy_buf_base_get
 .LVL121:
 	ldrsw	x1, [x29, 104]
-	.loc 1 1822 0
+	.loc 1 1863 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
 .LVL122:
 	mov	x21, x0
 .LVL123:
-	.loc 1 1823 0
+	.loc 1 1864 0
 	cbz	x0, .L216
-	.loc 1 1824 0
+	.loc 1 1865 0
 	ldr	w5, [x29, 108]
-	.loc 1 1833 0
+	.loc 1 1874 0
 	add	x20, x20, 184
-	.loc 1 1828 0
+	.loc 1 1869 0
 	ldp	w4, w2, [x29, 124]
-	.loc 1 1824 0
+	.loc 1 1865 0
 	str	w5, [x21, 40]
-	.loc 1 1829 0
+	.loc 1 1870 0
 	ldp	w3, w1, [x29, 132]
-	.loc 1 1828 0
+	.loc 1 1869 0
 	stp	w4, w2, [x21, 48]
-	.loc 1 1829 0
+	.loc 1 1870 0
 	stp	w3, w1, [x21, 56]
-	.loc 1 1831 0
+	.loc 1 1872 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL124:
-	.loc 1 1833 0
+	.loc 1 1874 0
 	ldr	w0, [x20, 96]
 	cbz	w0, .L316
 .L211:
-	.loc 1 1837 0
+	.loc 1 1878 0
 	ldr	w0, [x21, 40]
 	cmp	w0, 18
 	beq	.L317
-	.loc 1 1837 0 is_stmt 0 discriminator 3
+	.loc 1 1878 0 is_stmt 0 discriminator 3
 	cmp	w0, 20
 	bne	.L216
 .L213:
-	.loc 1 1838 0 is_stmt 1
+	.loc 1 1879 0 is_stmt 1
 	mov	w0, 1
 	str	w0, [x20, 204]
 .LBB1004:
 .LBB1005:
-	.loc 1 1839 0
+	.loc 1 1880 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
@@ -1861,13 +1861,13 @@ ebc_io_ctl:
 	.p2align 3
 .L318:
 .LVL126:
-	.loc 1 1839 0 is_stmt 0 discriminator 5
+	.loc 1 1880 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L216
-	.loc 1 1839 0 discriminator 7
+	.loc 1 1880 0 discriminator 7
 	bl	schedule
 .LVL127:
 .L217:
-	.loc 1 1839 0 discriminator 9
+	.loc 1 1880 0 discriminator 9
 	add	x1, x29, 64
 	mov	w2, 1
 	mov	x0, x21
@@ -1876,7 +1876,7 @@ ebc_io_ctl:
 	ldr	w1, [x20, 204]
 	cbnz	w1, .L318
 .LBE1006:
-	.loc 1 1839 0 discriminator 4
+	.loc 1 1880 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
 	bl	finish_wait
@@ -1890,13 +1890,13 @@ ebc_io_ctl:
 .L193:
 .LBE1005:
 .LBE1004:
-	.loc 1 1922 0 is_stmt 1
+	.loc 1 1963 0 is_stmt 1
 	bl	ebc_empty_buf_get
 .LVL131:
 	mov	x23, x0
-	.loc 1 1923 0
+	.loc 1 1964 0
 	cbz	x0, .L201
-	.loc 1 1925 0
+	.loc 1 1966 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 344]
@@ -1906,7 +1906,7 @@ ebc_io_ctl:
 .LVL132:
 	.p2align 3
 .L311:
-	.loc 1 1783 0
+	.loc 1 1824 0
 	mov	w0, 28678
 	cmp	w1, w0
 	beq	.L191
@@ -2021,36 +2021,36 @@ ebc_io_ctl:
 .LBE1012:
 .LBE1011:
 .LBE1010:
-	.loc 1 1848 0
+	.loc 1 1889 0
 	bl	ebc_osd_buf_clone
 .LVL145:
 	mov	x1, x0
-	.loc 1 1849 0
+	.loc 1 1890 0
 	cbz	x0, .L216
-	.loc 1 1850 0
+	.loc 1 1891 0
 	ldr	w6, [x29, 108]
-	.loc 1 1859 0
+	.loc 1 1900 0
 	add	x20, x20, 184
-	.loc 1 1854 0
+	.loc 1 1895 0
 	ldp	w5, w3, [x29, 124]
-	.loc 1 1850 0
+	.loc 1 1891 0
 	str	w6, [x1, 40]
-	.loc 1 1855 0
+	.loc 1 1896 0
 	ldp	w4, w2, [x29, 132]
-	.loc 1 1854 0
+	.loc 1 1895 0
 	stp	w5, w3, [x1, 48]
-	.loc 1 1855 0
+	.loc 1 1896 0
 	stp	w4, w2, [x1, 56]
-	.loc 1 1857 0
+	.loc 1 1898 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL146:
-	.loc 1 1859 0
+	.loc 1 1900 0
 	ldr	w0, [x20, 96]
 	cbnz	w0, .L216
-	.loc 1 1860 0
+	.loc 1 1901 0
 	mov	w2, 1
 	str	w2, [x20, 96]
-	.loc 1 1861 0
+	.loc 1 1902 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -2123,12 +2123,12 @@ ebc_io_ctl:
 .LBE969:
 .LBE972:
 .LBE1039:
-	.loc 1 1785 0
+	.loc 1 1826 0
 	bl	ebc_osd_buf_get
 .LVL157:
-	.loc 1 1786 0
+	.loc 1 1827 0
 	cbz	x0, .L201
-	.loc 1 1789 0
+	.loc 1 1830 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL158:
@@ -2155,17 +2155,17 @@ ebc_io_ctl:
 .LBE1042:
 .LBE1041:
 .LBE1040:
-	.loc 1 1789 0
+	.loc 1 1830 0
 	sub	w0, w22, w0
-	.loc 1 1794 0
+	.loc 1 1835 0
 	ldr	w1, [x20, 176]
-	.loc 1 1793 0
+	.loc 1 1834 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1792 0
+	.loc 1 1833 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1794 0
+	.loc 1 1835 0
 	str	w1, [x29, 120]
-	.loc 1 1791 0
+	.loc 1 1832 0
 	str	w0, [x29, 104]
 .LBB1073:
 .LBB1070:
@@ -2290,7 +2290,7 @@ ebc_io_ctl:
 .LBE1076:
 .LBE1075:
 .LBE1074:
-	.loc 1 1875 0
+	.loc 1 1916 0
 	add	x22, x20, 248
 .LBB1109:
 .LBB1105:
@@ -2387,49 +2387,49 @@ ebc_io_ctl:
 .LBE1101:
 .LBE1105:
 .LBE1109:
-	.loc 1 1879 0
+	.loc 1 1920 0
 	add	x20, x20, 184
 	ldr	w2, [x20, 64]
 	ldr	x0, [x20, 104]
 .LVL184:
-	.loc 1 1880 0
+	.loc 1 1921 0
 	mov	x22, 0
-	.loc 1 1879 0
+	.loc 1 1920 0
 	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	_dev_info
 .LVL185:
-	.loc 1 1880 0
+	.loc 1 1921 0
 	b	.L176
 .LVL186:
 	.p2align 3
 .L181:
-	.loc 1 1872 0
+	.loc 1 1913 0
 	ldr	x0, [x20, 288]
 	adrp	x1, .LC3
 .LVL187:
-	.loc 1 1870 0
+	.loc 1 1911 0
 	str	wzr, [x20, 812]
-	.loc 1 1873 0
+	.loc 1 1914 0
 	mov	x22, 0
-	.loc 1 1871 0
+	.loc 1 1912 0
 	str	wzr, [x20, 816]
-	.loc 1 1872 0
+	.loc 1 1913 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
 .LVL188:
-	.loc 1 1873 0
+	.loc 1 1914 0
 	b	.L176
 .LVL189:
 	.p2align 3
 .L189:
-	.loc 1 1909 0
+	.loc 1 1950 0
 	bl	ebc_empty_buf_get
 .LVL190:
 	mov	x23, x0
-	.loc 1 1910 0
+	.loc 1 1951 0
 	cbz	x0, .L201
-	.loc 1 1912 0
+	.loc 1 1953 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 336]
@@ -2439,13 +2439,13 @@ ebc_io_ctl:
 .LVL191:
 	.p2align 3
 .L194:
-	.loc 1 1896 0
+	.loc 1 1937 0
 	bl	ebc_empty_buf_get
 .LVL192:
 	mov	x23, x0
-	.loc 1 1897 0
+	.loc 1 1938 0
 	cbz	x0, .L201
-	.loc 1 1899 0
+	.loc 1 1940 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 328]
@@ -2454,7 +2454,7 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL193:
-	.loc 1 1900 0
+	.loc 1 1941 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL194:
@@ -2482,11 +2482,11 @@ ebc_io_ctl:
 .LBE1112:
 .LBE1111:
 .LBE1110:
-	.loc 1 1903 0
+	.loc 1 1944 0
 	ldp	w4, w1, [x22, 84]
-	.loc 1 1901 0
+	.loc 1 1942 0
 	str	w0, [x29, 104]
-	.loc 1 1902 0
+	.loc 1 1943 0
 	stp	w1, w4, [x29, 112]
 .LBB1121:
 .LBB1120:
@@ -2530,15 +2530,15 @@ ebc_io_ctl:
 .LBE1124:
 .LBE1123:
 .LBE1122:
-	.loc 1 1886 0
+	.loc 1 1927 0
 	ldp	w1, w0, [x20, 116]
 .LVL199:
 	stp	w1, w0, [x29, 140]
-	.loc 1 1883 0
+	.loc 1 1924 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 1882 0
+	.loc 1 1923 0
 	stp	w5, w6, [x29, 112]
-	.loc 1 1884 0
+	.loc 1 1925 0
 	ldr	w4, [x20, 176]
 	str	w4, [x29, 120]
 .LBB1157:
@@ -2586,46 +2586,46 @@ ebc_io_ctl:
 .LBE1149:
 .LBE1153:
 .LBE1157:
-	.loc 1 1889 0
+	.loc 1 1930 0
 	ldr	x0, [x20, 288]
 .LVL205:
 	adrp	x1, .LC5
 .LVL206:
-	.loc 1 1890 0
+	.loc 1 1931 0
 	mov	x22, -14
-	.loc 1 1889 0
+	.loc 1 1930 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
 .LVL207:
-	.loc 1 1890 0
+	.loc 1 1931 0
 	b	.L176
 .LVL208:
 	.p2align 3
 .L180:
-	.loc 1 1950 0
+	.loc 1 1991 0
 	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
 .LVL209:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
-	.loc 1 1951 0
+	.loc 1 1992 0
 	mov	x22, 0
-	.loc 1 1950 0
+	.loc 1 1991 0
 	bl	_dev_err
 .LVL210:
-	.loc 1 1954 0
+	.loc 1 1995 0
 	b	.L176
 .LVL211:
 	.p2align 3
 .L185:
-	.loc 1 1799 0
+	.loc 1 1840 0
 	bl	ebc_empty_buf_get
 .LVL212:
 	mov	x23, x0
-	.loc 1 1800 0
+	.loc 1 1841 0
 	cbz	x0, .L201
-	.loc 1 1803 0
+	.loc 1 1844 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL213:
@@ -2652,17 +2652,17 @@ ebc_io_ctl:
 .LBE1160:
 .LBE1159:
 .LBE1158:
-	.loc 1 1803 0
+	.loc 1 1844 0
 	sub	w0, w22, w0
-	.loc 1 1808 0
+	.loc 1 1849 0
 	ldr	w1, [x20, 176]
-	.loc 1 1807 0
+	.loc 1 1848 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1806 0
+	.loc 1 1847 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1808 0
+	.loc 1 1849 0
 	str	w1, [x29, 120]
-	.loc 1 1805 0
+	.loc 1 1846 0
 	str	w0, [x29, 104]
 .LBB1193:
 .LBB1189:
@@ -2709,15 +2709,15 @@ ebc_io_ctl:
 .LBE1185:
 .LBE1189:
 .LBE1193:
-	.loc 1 1812 0
+	.loc 1 1853 0
 	mov	x0, x23
 .LVL220:
-	.loc 1 1813 0
+	.loc 1 1854 0
 	mov	x22, -14
-	.loc 1 1812 0
+	.loc 1 1853 0
 	bl	ebc_buf_release
 .LVL221:
-	.loc 1 1813 0
+	.loc 1 1854 0
 	b	.L176
 .LVL222:
 	.p2align 3
@@ -2740,7 +2740,7 @@ ebc_io_ctl:
 .LBE1035:
 .LBE1037:
 .LBE1194:
-	.loc 1 1758 0
+	.loc 1 1799 0
 	mov	x0, x21
 .LVL223:
 .LBB1195:
@@ -2777,7 +2777,7 @@ ebc_io_ctl:
 .LBE1000:
 .LBE1002:
 .LBE1196:
-	.loc 1 1758 0
+	.loc 1 1799 0
 	mov	x0, x21
 .LVL225:
 .LBB1197:
@@ -2815,7 +2815,7 @@ ebc_io_ctl:
 .LBE1150:
 .LBE1154:
 .LBE1198:
-	.loc 1 1758 0
+	.loc 1 1799 0
 	mov	x0, x21
 .LVL228:
 .LBB1199:
@@ -2852,7 +2852,7 @@ ebc_io_ctl:
 .LBE1102:
 .LBE1106:
 .LBE1200:
-	.loc 1 1758 0
+	.loc 1 1799 0
 	mov	x0, x21
 .LVL230:
 .LBB1201:
@@ -2890,7 +2890,7 @@ ebc_io_ctl:
 .LBE1186:
 .LBE1190:
 .LBE1202:
-	.loc 1 1758 0
+	.loc 1 1799 0
 	mov	x0, x21
 .LVL233:
 .LBB1203:
@@ -2928,7 +2928,7 @@ ebc_io_ctl:
 .LBE1068:
 .LBE1071:
 .LBE1204:
-	.loc 1 1758 0
+	.loc 1 1799 0
 	mov	x0, x21
 .LVL236:
 .LBB1205:
@@ -3003,7 +3003,7 @@ ebc_io_ctl:
 .LBE1152:
 .LBE1156:
 .LBE1206:
-	.loc 1 1888 0
+	.loc 1 1929 0
 	cbnz	x0, .L228
 .LBB1207:
 .LBB1007:
@@ -3070,7 +3070,7 @@ ebc_io_ctl:
 .LBE1188:
 .LBE1192:
 .LBE1208:
-	.loc 1 1811 0
+	.loc 1 1852 0
 	cbnz	w0, .L205
 .LBB1209:
 .LBB1008:
@@ -3081,16 +3081,16 @@ ebc_io_ctl:
 .L209:
 .LBE1008:
 .LBE1209:
-	.loc 1 1819 0
+	.loc 1 1860 0
 	mov	x22, -14
 	b	.L176
 .LVL254:
 	.p2align 3
 .L316:
-	.loc 1 1834 0
+	.loc 1 1875 0
 	mov	w2, 1
 	str	w2, [x20, 96]
-	.loc 1 1835 0
+	.loc 1 1876 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -3100,7 +3100,7 @@ ebc_io_ctl:
 	b	.L211
 	.p2align 3
 .L317:
-	.loc 1 1837 0 discriminator 1
+	.loc 1 1878 0 discriminator 1
 	ldr	w0, [x20, 616]
 	cbz	w0, .L213
 .LBB1210:
@@ -3111,7 +3111,7 @@ ebc_io_ctl:
 .L201:
 .LBE1009:
 .LBE1210:
-	.loc 1 1787 0
+	.loc 1 1828 0
 	mov	x22, -1
 	b	.L176
 .LVL257:
@@ -3134,19 +3134,19 @@ ebc_io_ctl:
 .LBE1104:
 .LBE1108:
 .LBE1211:
-	.loc 1 1876 0
+	.loc 1 1917 0
 	ldr	x0, [x20, 288]
 	adrp	x1, .LC4
-	.loc 1 1877 0
+	.loc 1 1918 0
 	mov	x22, -14
-	.loc 1 1876 0
+	.loc 1 1917 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
 .LVL262:
-	.loc 1 1877 0
+	.loc 1 1918 0
 	b	.L176
 .L314:
-	.loc 1 1955 0
+	.loc 1 1996 0
 	bl	__stack_chk_fail
 .LVL263:
 .L322:
@@ -3155,7 +3155,7 @@ ebc_io_ctl:
 .LVL264:
 	b	.L223
 	.cfi_endproc
-.LFE2832:
+.LFE2833:
 	.size	ebc_io_ctl, .-ebc_io_ctl
 	.align	2
 	.p2align 3,,7
@@ -3347,8 +3347,8 @@ frame_done_callback:
 	.p2align 3,,7
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
-.LFB2830:
-	.loc 1 1684 0
+.LFB2831:
+	.loc 1 1725 0
 	.cfi_startproc
 .LVL275:
 	stp	x29, x30, [sp, -16]!
@@ -3357,26 +3357,108 @@ ebc_frame_timeout:
 	.cfi_offset 30, -8
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1685 0
+	.loc 1 1726 0
 	bl	frame_done_callback
 .LVL276:
-	.loc 1 1687 0
+	.loc 1 1728 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2830:
+.LFE2831:
 	.size	ebc_frame_timeout, .-ebc_frame_timeout
 	.align	2
 	.p2align 3,,7
+	.type	check_black_percent, %function
+check_black_percent:
+.LFB2826:
+	.loc 1 1316 0
+	.cfi_startproc
+.LVL277:
+	.loc 1 1321 0
+	mov	w2, 26215
+	.loc 1 1323 0
+	cmp	w1, 0
+	.loc 1 1321 0
+	movk	w2, 0x6666, lsl 16
+	.loc 1 1323 0
+	add	w5, w1, 7
+	csel	w5, w5, w1, lt
+.LVL278:
+	.loc 1 1321 0
+	smull	x4, w1, w2
+	.loc 1 1323 0
+	asr	w5, w5, 3
+.LVL279:
+	cmp	w5, 0
+	.loc 1 1321 0
+	asr	x4, x4, 34
+	sub	w4, w4, w1, asr 31
+.LVL280:
+	.loc 1 1323 0
+	ble	.L336
+	mov	x1, 0
+.LVL281:
+	mov	w2, 0
+.LVL282:
+	b	.L339
+	.p2align 3
+.L347:
+	.loc 1 1323 0 is_stmt 0 discriminator 2
+	cmp	w5, w1
+	ble	.L336
+.L339:
+	.loc 1 1325 0 is_stmt 1
+	ldr	x3, [x0, x1, lsl 3]
+	add	x1, x1, 1
+	.loc 1 1326 0
+	cmp	x3, 0
+	cinc	w2, w2, ne
+	.loc 1 1327 0
+	cmp	w4, w2, lsl 3
+	bge	.L347
+	.loc 1 1328 0
+	mov	w0, 0
+.LVL283:
+	ret
+.LVL284:
+.L336:
+	.loc 1 1316 0
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	.loc 1 1331 0
+	adrp	x0, .LC10
+.LVL285:
+	add	x0, x0, :lo12:.LC10
+	.loc 1 1316 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 1331 0
+	bl	printk
+.LVL286:
+	.loc 1 1333 0
+	mov	w0, 1
+	.loc 1 1334 0
+	ldp	x29, x30, [sp], 16
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE2826:
+	.size	check_black_percent, .-check_black_percent
+	.align	2
+	.p2align 3,,7
 	.type	ebc_lut_update, %function
 ebc_lut_update:
 .LFB2825:
 	.loc 1 1223 0
 	.cfi_startproc
-.LVL277:
+.LVL287:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
@@ -3398,12 +3480,12 @@ ebc_lut_update:
 	.loc 1 1223 0
 	adrp	x19, __stack_chk_guard
 	add	x0, x19, :lo12:__stack_chk_guard
-.LVL278:
+.LVL288:
 	.loc 1 1229 0
 	ldr	x2, [x21, 16]
 	.loc 1 1225 0
 	str	w3, [x1, -12]!
-.LVL279:
+.LVL289:
 	.loc 1 1223 0
 	ldr	x3, [x0]
 	str	x3, [x29, 56]
@@ -3414,57 +3496,57 @@ ebc_lut_update:
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL280:
+.LVL290:
 	mov	w20, w0
 .LBE1213:
 .LBE1212:
 	.loc 1 1230 0
-	cbnz	w0, .L336
-.LVL281:
+	cbnz	w0, .L349
+.LVL291:
 	.loc 1 1231 0
 	ldr	w2, [x29, 52]
 	.loc 1 1232 0
 	add	x22, x21, 184
 	.loc 1 1231 0
-	tbnz	w2, #31, .L360
+	tbnz	w2, #31, .L373
 	.loc 1 1235 0
 	cmp	w2, 50
-	bgt	.L361
-.L338:
+	bgt	.L374
+.L351:
 	.loc 1 1243 0
 	ldr	x0, [x22, 104]
-	adrp	x1, .LC13
-	add	x1, x1, :lo12:.LC13
+	adrp	x1, .LC14
+	add	x1, x1, :lo12:.LC14
 	bl	_dev_info
-.LVL282:
+.LVL292:
 	.loc 1 1246 0
 	ldr	x0, [x22, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 23
-	bls	.L362
+	bls	.L375
 	.loc 1 1302 0
 	ldr	w2, [x29, 52]
-.L359:
+.L372:
 	mov	w1, 7
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL283:
-	cbnz	w0, .L351
+.LVL293:
+	cbnz	w0, .L364
 	.p2align 2
-.L354:
+.L367:
 	.loc 1 1307 0
-	cbnz	w20, .L352
-.L335:
+	cbnz	w20, .L365
+.L348:
 	.loc 1 1313 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	w0, w20
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L363
+	cbnz	x1, .L376
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL284:
+.LVL294:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -3475,185 +3557,185 @@ ebc_lut_update:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL285:
+.LVL295:
 	.p2align 3
-.L362:
+.L375:
 	.cfi_restore_state
 	.loc 1 1246 0
-	adrp	x1, .L341
+	adrp	x1, .L354
 	.loc 1 1248 0
 	ldr	w2, [x29, 52]
 	.loc 1 1246 0
-	add	x1, x1, :lo12:.L341
+	add	x1, x1, :lo12:.L354
 	ldrb	w0, [x1,w0,uxtw]
-	adr	x1, .Lrtx341
+	adr	x1, .Lrtx354
 	add	x0, x1, w0, sxtb #2
 	br	x0
-.Lrtx341:
+.Lrtx354:
 	.section	.rodata
 	.align	0
 	.align	2
-.L341:
-	.byte	(.L359 - .Lrtx341) / 4
-	.byte	(.L342 - .Lrtx341) / 4
-	.byte	(.L359 - .Lrtx341) / 4
-	.byte	(.L343 - .Lrtx341) / 4
-	.byte	(.L344 - .Lrtx341) / 4
-	.byte	(.L345 - .Lrtx341) / 4
-	.byte	(.L346 - .Lrtx341) / 4
-	.byte	(.L359 - .Lrtx341) / 4
-	.byte	(.L343 - .Lrtx341) / 4
-	.byte	(.L344 - .Lrtx341) / 4
-	.byte	(.L345 - .Lrtx341) / 4
-	.byte	(.L346 - .Lrtx341) / 4
-	.byte	(.L347 - .Lrtx341) / 4
-	.byte	(.L347 - .Lrtx341) / 4
-	.byte	(.L348 - .Lrtx341) / 4
-	.byte	(.L349 - .Lrtx341) / 4
-	.byte	(.L348 - .Lrtx341) / 4
-	.byte	(.L350 - .Lrtx341) / 4
-	.byte	(.L359 - .Lrtx341) / 4
-	.byte	(.L359 - .Lrtx341) / 4
-	.byte	(.L359 - .Lrtx341) / 4
-	.byte	(.L359 - .Lrtx341) / 4
-	.byte	(.L348 - .Lrtx341) / 4
-	.byte	(.L349 - .Lrtx341) / 4
+.L354:
+	.byte	(.L372 - .Lrtx354) / 4
+	.byte	(.L355 - .Lrtx354) / 4
+	.byte	(.L372 - .Lrtx354) / 4
+	.byte	(.L356 - .Lrtx354) / 4
+	.byte	(.L357 - .Lrtx354) / 4
+	.byte	(.L358 - .Lrtx354) / 4
+	.byte	(.L359 - .Lrtx354) / 4
+	.byte	(.L372 - .Lrtx354) / 4
+	.byte	(.L356 - .Lrtx354) / 4
+	.byte	(.L357 - .Lrtx354) / 4
+	.byte	(.L358 - .Lrtx354) / 4
+	.byte	(.L359 - .Lrtx354) / 4
+	.byte	(.L360 - .Lrtx354) / 4
+	.byte	(.L360 - .Lrtx354) / 4
+	.byte	(.L361 - .Lrtx354) / 4
+	.byte	(.L362 - .Lrtx354) / 4
+	.byte	(.L361 - .Lrtx354) / 4
+	.byte	(.L363 - .Lrtx354) / 4
+	.byte	(.L372 - .Lrtx354) / 4
+	.byte	(.L372 - .Lrtx354) / 4
+	.byte	(.L372 - .Lrtx354) / 4
+	.byte	(.L372 - .Lrtx354) / 4
+	.byte	(.L361 - .Lrtx354) / 4
+	.byte	(.L362 - .Lrtx354) / 4
 	.text
-.LVL286:
+.LVL296:
 	.p2align 3
-.L336:
+.L349:
 	.loc 1 1241 0
 	add	x22, x21, 184
 	mov	w2, w0
-	adrp	x1, .LC12
-	add	x1, x1, :lo12:.LC12
+	adrp	x1, .LC13
+	add	x1, x1, :lo12:.LC13
 	ldr	x0, [x22, 104]
 	bl	_dev_err
-.LVL287:
+.LVL297:
 	ldr	w2, [x29, 52]
-	b	.L338
+	b	.L351
 	.p2align 3
-.L361:
+.L374:
 	.loc 1 1236 0
 	ldr	x0, [x22, 104]
-	adrp	x1, .LC11
-	add	x1, x1, :lo12:.LC11
+	adrp	x1, .LC12
+	add	x1, x1, :lo12:.LC12
 	bl	_dev_info
-.LVL288:
+.LVL298:
 	.loc 1 1237 0
 	mov	w2, 50
 	str	w2, [x29, 52]
-.LVL289:
-	b	.L338
+.LVL299:
+	b	.L351
 	.p2align 3
-.L350:
+.L363:
 	.loc 1 1248 0
 	mov	w1, 1
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL290:
-	cbz	w0, .L354
+.LVL300:
+	cbz	w0, .L367
 	.p2align 2
-.L351:
+.L364:
 	.loc 1 1237 0
 	mov	w20, -1
-.L352:
+.L365:
 	.loc 1 1308 0
 	ldr	x0, [x22, 104]
-	adrp	x1, .LC14
-	add	x1, x1, :lo12:.LC14
+	adrp	x1, .LC15
+	add	x1, x1, :lo12:.LC15
 	bl	_dev_err
-.LVL291:
+.LVL301:
 	.loc 1 1309 0
-	b	.L335
+	b	.L348
 	.p2align 3
-.L344:
+.L357:
 	.loc 1 1288 0
 	mov	w1, 9
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL292:
-	cbnz	w0, .L351
-	b	.L354
+.LVL302:
+	cbnz	w0, .L364
+	b	.L367
 	.p2align 3
-.L345:
+.L358:
 	.loc 1 1293 0
 	mov	w1, 10
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL293:
-	cbnz	w0, .L351
-	b	.L354
+.LVL303:
+	cbnz	w0, .L364
+	b	.L367
 	.p2align 3
-.L342:
+.L355:
 	.loc 1 1262 0
 	mov	w1, 5
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL294:
-	cbnz	w0, .L351
-	b	.L354
+.LVL304:
+	cbnz	w0, .L364
+	b	.L367
 	.p2align 3
-.L343:
+.L356:
 	.loc 1 1283 0
 	mov	w1, 8
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL295:
-	cbnz	w0, .L351
-	b	.L354
+.LVL305:
+	cbnz	w0, .L364
+	b	.L367
 	.p2align 3
-.L346:
+.L359:
 	.loc 1 1298 0
 	mov	w1, 11
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL296:
-	cbnz	w0, .L351
-	b	.L354
+.LVL306:
+	cbnz	w0, .L364
+	b	.L367
 	.p2align 3
-.L347:
+.L360:
 	.loc 1 1267 0
 	mov	w1, 6
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL297:
-	cbnz	w0, .L351
-	b	.L354
+.LVL307:
+	cbnz	w0, .L364
+	b	.L367
 	.p2align 3
-.L348:
+.L361:
 	.loc 1 1273 0
 	mov	w1, 4
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL298:
-	cbnz	w0, .L351
-	b	.L354
+.LVL308:
+	cbnz	w0, .L364
+	b	.L367
 	.p2align 3
-.L349:
+.L362:
 	.loc 1 1278 0
 	mov	w1, 3
 	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL299:
-	cbnz	w0, .L351
-	b	.L354
+.LVL309:
+	cbnz	w0, .L364
+	b	.L367
 	.p2align 3
-.L360:
+.L373:
 	.loc 1 1232 0
 	ldr	x0, [x22, 104]
-	adrp	x1, .LC10
-	add	x1, x1, :lo12:.LC10
+	adrp	x1, .LC11
+	add	x1, x1, :lo12:.LC11
 	bl	_dev_info
-.LVL300:
+.LVL310:
 	.loc 1 1233 0
 	str	wzr, [x29, 52]
 	mov	w2, 0
-	b	.L338
-.L363:
+	b	.L351
+.L376:
 	.loc 1 1313 0
 	bl	__stack_chk_fail
-.LVL301:
+.LVL311:
 	.cfi_endproc
 .LFE2825:
 	.size	ebc_lut_update, .-ebc_lut_update
@@ -3661,24 +3743,24 @@ ebc_lut_update:
 	.p2align 3,,7
 	.type	ebc_buf_state_read, %function
 ebc_buf_state_read:
-.LFB2844:
-	.loc 1 2123 0
+.LFB2845:
+	.loc 1 2164 0
 	.cfi_startproc
-.LVL302:
+.LVL312:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2124 0
+	.loc 1 2165 0
 	mov	x0, x2
-.LVL303:
-	.loc 1 2123 0
+.LVL313:
+	.loc 1 2164 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2124 0
+	.loc 1 2165 0
 	bl	ebc_buf_state_show
-.LVL304:
-	.loc 1 2125 0
+.LVL314:
+	.loc 1 2166 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3686,39 +3768,39 @@ ebc_buf_state_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2844:
+.LFE2845:
 	.size	ebc_buf_state_read, .-ebc_buf_state_read
 	.align	2
 	.p2align 3,,7
 	.type	ebc_state_read, %function
 ebc_state_read:
-.LFB2843:
-	.loc 1 2114 0
+.LFB2844:
+	.loc 1 2155 0
 	.cfi_startproc
-.LVL305:
+.LVL315:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2115 0
+	.loc 1 2156 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2114 0
+	.loc 1 2155 0
 	mov	x0, x2
-.LVL306:
-	.loc 1 2115 0
-	adrp	x1, .LC15
-.LVL307:
-	.loc 1 2114 0
+.LVL316:
+	.loc 1 2156 0
+	adrp	x1, .LC16
+.LVL317:
+	.loc 1 2155 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2115 0
+	.loc 1 2156 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL308:
-	add	x1, x1, :lo12:.LC15
+.LVL318:
+	add	x1, x1, :lo12:.LC16
 	ldr	w2, [x2, 624]
 	bl	sprintf
-.LVL309:
-	.loc 1 2116 0
+.LVL319:
+	.loc 1 2157 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3726,38 +3808,38 @@ ebc_state_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2843:
+.LFE2844:
 	.size	ebc_state_read, .-ebc_state_read
 	.align	2
 	.p2align 3,,7
 	.type	ebc_version_read, %function
 ebc_version_read:
-.LFB2842:
-	.loc 1 2105 0
+.LFB2843:
+	.loc 1 2146 0
 	.cfi_startproc
-.LVL310:
+.LVL320:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mov	x0, x2
-.LVL311:
-	.loc 1 2106 0
-	adrp	x1, .LC17
-.LVL312:
-	adrp	x2, .LC16
-.LVL313:
-	.loc 1 2105 0
+.LVL321:
+	.loc 1 2147 0
+	adrp	x1, .LC18
+.LVL322:
+	adrp	x2, .LC17
+.LVL323:
+	.loc 1 2146 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2106 0
-	add	x2, x2, :lo12:.LC16
-	.loc 1 2105 0
-	.loc 1 2106 0
-	add	x1, x1, :lo12:.LC17
+	.loc 1 2147 0
+	add	x2, x2, :lo12:.LC17
+	.loc 1 2146 0
+	.loc 1 2147 0
+	add	x1, x1, :lo12:.LC18
 	bl	sprintf
-.LVL314:
-	.loc 1 2107 0
+.LVL324:
+	.loc 1 2148 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3765,56 +3847,56 @@ ebc_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2842:
+.LFE2843:
 	.size	ebc_version_read, .-ebc_version_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
-.LFB2840:
-	.loc 1 2069 0
+.LFB2841:
+	.loc 1 2110 0
 	.cfi_startproc
-.LVL315:
+.LVL325:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 2070 0
+	.loc 1 2111 0
 	adrp	x0, .LANCHOR0
-.LVL316:
-	.loc 1 2069 0
+.LVL326:
+	.loc 1 2110 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2073 0
+	.loc 1 2114 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2069 0
+	.loc 1 2110 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2069 0
+	.loc 1 2110 0
 	mov	x19, x2
-	.loc 1 2073 0
+	.loc 1 2114 0
 	ldr	x1, [x0, 16]
-.LVL317:
+.LVL327:
 .LBB1214:
 .LBB1215:
 	.loc 3 55 0
 	mov	x0, x1
 	ldr	x1, [x1, 64]
 	blr	x1
-.LVL318:
+.LVL328:
 .LBE1215:
 .LBE1214:
-	.loc 1 2075 0
+	.loc 1 2116 0
 	mov	w2, w0
-	adrp	x1, .LC15
+	adrp	x1, .LC16
 	mov	x0, x19
-	add	x1, x1, :lo12:.LC15
+	add	x1, x1, :lo12:.LC16
 	bl	sprintf
-.LVL319:
-	.loc 1 2076 0
+.LVL329:
+	.loc 1 2117 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL320:
+.LVL330:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3822,48 +3904,48 @@ pmic_vcom_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2840:
+.LFE2841:
 	.size	pmic_vcom_read, .-pmic_vcom_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_temp_read, %function
 pmic_temp_read:
-.LFB2839:
-	.loc 1 2055 0
+.LFB2840:
+	.loc 1 2096 0
 	.cfi_startproc
-.LVL321:
+.LVL331:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 2056 0
+	.loc 1 2097 0
 	adrp	x0, .LANCHOR0
-.LVL322:
-	.loc 1 2055 0
+.LVL332:
+	.loc 1 2096 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2059 0
+	.loc 1 2100 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
 .LBB1216:
 .LBB1217:
 	.loc 3 50 0
 	add	x1, x29, 36
-.LVL323:
+.LVL333:
 .LBE1217:
 .LBE1216:
-	.loc 1 2055 0
+	.loc 1 2096 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 2055 0
+	.loc 1 2096 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
-.LVL324:
-	.loc 1 2059 0
+.LVL334:
+	.loc 1 2100 0
 	ldr	x2, [x0, 16]
 .LBB1219:
 .LBB1218:
@@ -3871,23 +3953,23 @@ pmic_temp_read:
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL325:
+.LVL335:
 .LBE1218:
 .LBE1219:
-	.loc 1 2061 0
+	.loc 1 2102 0
 	ldr	w2, [x29, 36]
-	adrp	x1, .LC15
+	adrp	x1, .LC16
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC15
+	add	x1, x1, :lo12:.LC16
 	bl	sprintf
-.LVL326:
-	.loc 1 2062 0
+.LVL336:
+	.loc 1 2103 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L375
+	cbnz	x1, .L388
 	ldp	x19, x20, [sp, 16]
-.LVL327:
+.LVL337:
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -3897,46 +3979,46 @@ pmic_temp_read:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL328:
-.L375:
+.LVL338:
+.L388:
 	.cfi_restore_state
 	bl	__stack_chk_fail
-.LVL329:
+.LVL339:
 	.cfi_endproc
-.LFE2839:
+.LFE2840:
 	.size	pmic_temp_read, .-pmic_temp_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_name_read, %function
 pmic_name_read:
-.LFB2838:
-	.loc 1 2044 0
+.LFB2839:
+	.loc 1 2085 0
 	.cfi_startproc
-.LVL330:
+.LVL340:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2045 0
+	.loc 1 2086 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2044 0
+	.loc 1 2085 0
 	mov	x0, x2
-.LVL331:
-	.loc 1 2047 0
-	adrp	x1, .LC17
-.LVL332:
-	.loc 1 2044 0
+.LVL341:
+	.loc 1 2088 0
+	adrp	x1, .LC18
+.LVL342:
+	.loc 1 2085 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2047 0
+	.loc 1 2088 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL333:
-	add	x1, x1, :lo12:.LC17
+.LVL343:
+	add	x1, x1, :lo12:.LC18
 	ldr	x2, [x2, 16]
 	add	x2, x2, 8
 	bl	sprintf
-.LVL334:
-	.loc 1 2048 0
+.LVL344:
+	.loc 1 2089 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3944,24 +4026,24 @@ pmic_name_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2838:
+.LFE2839:
 	.size	pmic_name_read, .-pmic_name_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
-.LFB2841:
-	.loc 1 2081 0
+.LFB2842:
+	.loc 1 2122 0
 	.cfi_startproc
-.LVL335:
+.LVL345:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 2082 0
+	.loc 1 2123 0
 	adrp	x0, .LANCHOR0
-.LVL336:
-	.loc 1 2081 0
+.LVL346:
+	.loc 1 2122 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -3971,47 +4053,47 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 2081 0
+	.loc 1 2122 0
 	add	x1, x19, :lo12:__stack_chk_guard
-.LVL337:
+.LVL347:
 	mov	x21, x2
-	.loc 1 2082 0
+	.loc 1 2123 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
-.LVL338:
-	.loc 1 2081 0
+.LVL348:
+	.loc 1 2122 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
-.LVL339:
+.LVL349:
 	mov	x20, x3
-	.loc 1 2085 0
+	.loc 1 2126 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
-.LVL340:
-	.loc 1 2086 0
-	cbnz	w0, .L385
-.LVL341:
-	.loc 1 2090 0
+.LVL350:
+	.loc 1 2127 0
+	cbnz	w0, .L398
+.LVL351:
+	.loc 1 2131 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
-.LVL342:
-	.loc 1 2091 0
-	cbnz	w0, .L386
-.L378:
-	.loc 1 2097 0
+.LVL352:
+	.loc 1 2132 0
+	cbnz	w0, .L399
+.L391:
+	.loc 1 2138 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
-.LVL343:
+.LVL353:
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L387
+	cbnz	x1, .L400
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL344:
+.LVL354:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -4022,53 +4104,53 @@ pmic_vcom_write:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL345:
+.LVL355:
 	.p2align 3
-.L385:
+.L398:
 	.cfi_restore_state
-	.loc 1 2087 0
+	.loc 1 2128 0
 	ldr	x0, [x22]
-	adrp	x1, .LC18
+	adrp	x1, .LC19
 	mov	x2, x21
-	add	x1, x1, :lo12:.LC18
-	.loc 1 2088 0
+	add	x1, x1, :lo12:.LC19
+	.loc 1 2129 0
 	mov	x20, -1
-.LVL346:
-	.loc 1 2087 0
+.LVL356:
+	.loc 1 2128 0
 	bl	_dev_err
-.LVL347:
-	.loc 1 2088 0
-	b	.L378
-.LVL348:
+.LVL357:
+	.loc 1 2129 0
+	b	.L391
+.LVL358:
 	.p2align 3
-.L386:
-	.loc 1 2092 0
+.L399:
+	.loc 1 2133 0
 	ldr	x0, [x22]
-	adrp	x1, .LC19
-	.loc 1 2093 0
+	adrp	x1, .LC20
+	.loc 1 2134 0
 	mov	x20, -1
-.LVL349:
-	.loc 1 2092 0
-	add	x1, x1, :lo12:.LC19
+.LVL359:
+	.loc 1 2133 0
+	add	x1, x1, :lo12:.LC20
 	bl	_dev_err
-.LVL350:
-	.loc 1 2093 0
-	b	.L378
-.L387:
-	.loc 1 2097 0
+.LVL360:
+	.loc 1 2134 0
+	b	.L391
+.L400:
+	.loc 1 2138 0
 	bl	__stack_chk_fail
-.LVL351:
+.LVL361:
 	.cfi_endproc
-.LFE2841:
+.LFE2842:
 	.size	pmic_vcom_write, .-pmic_vcom_write
 	.align	2
 	.p2align 3,,7
 	.type	waveform_version_read, %function
 waveform_version_read:
-.LFB2837:
-	.loc 1 2033 0
+.LFB2838:
+	.loc 1 2074 0
 	.cfi_startproc
-.LVL352:
+.LVL362:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -4077,22 +4159,22 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2033 0
+	.loc 1 2074 0
 	mov	x19, x2
-	.loc 1 2034 0
+	.loc 1 2075 0
 	bl	epd_lut_get_wf_version
-.LVL353:
-	.loc 1 2036 0
+.LVL363:
+	.loc 1 2077 0
 	mov	x2, x0
-	adrp	x1, .LC17
+	adrp	x1, .LC18
 	mov	x0, x19
-	add	x1, x1, :lo12:.LC17
+	add	x1, x1, :lo12:.LC18
 	bl	sprintf
-.LVL354:
-	.loc 1 2037 0
+.LVL364:
+	.loc 1 2078 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL355:
+.LVL365:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -4100,37 +4182,37 @@ waveform_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2837:
+.LFE2838:
 	.size	waveform_version_read, .-waveform_version_read
 	.section	.init.text,"ax",@progbits
 	.align	2
 	.type	ebc_init, %function
 ebc_init:
-.LFB2855:
-	.loc 1 2586 0
+.LFB2856:
+	.loc 1 2627 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2587 0
+	.loc 1 2628 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2586 0
+	.loc 1 2627 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2587 0
+	.loc 1 2628 0
 	bl	__platform_driver_register
-.LVL356:
-	.loc 1 2588 0
+.LVL366:
+	.loc 1 2629 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2855:
+.LFE2856:
 	.size	ebc_init, .-ebc_init
 	.text
 	.align	2
@@ -4140,11 +4222,11 @@ direct_mode_data_change:
 .LFB2816:
 	.loc 1 905 0
 	.cfi_startproc
-.LVL357:
+.LVL367:
 	.loc 1 906 0
 	ldr	w13, [x3, 88]
-.LVL358:
-	cbnz	w13, .L426
+.LVL368:
+	cbnz	w13, .L439
 .LBB1238:
 .LBB1239:
 	.loc 1 870 0
@@ -4156,60 +4238,60 @@ direct_mode_data_change:
 	ldr	x15, [x5, #:lo12:.LANCHOR0]
 	.loc 1 877 0
 	ldr	x3, [x3, 128]
-.LVL359:
+.LVL369:
 	.loc 1 876 0
 	sub	w7, w7, w4
-.LVL360:
+.LVL370:
 	.loc 1 878 0
 	add	x15, x15, 24
 	.loc 1 877 0
 	lsl	w7, w7, 16
-.LVL361:
+.LVL371:
 	add	x7, x3, x7, sxtw
-.LVL362:
+.LVL372:
 	.loc 1 881 0
 	ldr	w16, [x15, 88]
 	.loc 1 880 0
 	ldr	w3, [x15, 84]
 	.loc 1 878 0
 	ldr	w17, [x15, 156]
-.LVL363:
+.LVL373:
 	.loc 1 886 0
 	cmp	w16, 0
 	.loc 1 880 0
 	lsr	w12, w3, 3
-.LVL364:
+.LVL374:
 	.loc 1 886 0
-	ble	.L414
+	ble	.L427
 	sub	w14, w12, #1
 	add	x14, x14, 1
 	lsl	x14, x14, 2
 	.loc 1 887 0
-	cbz	w17, .L400
-.LVL365:
+	cbz	w17, .L413
+.LVL375:
 	.p2align 2
-.L427:
+.L440:
 	.loc 1 888 0
 	ldr	w10, [x15, 88]
-.LVL366:
+.LVL376:
 	sub	w10, w10, #1
 	sub	w10, w10, w13
 	mul	w10, w10, w3
 	lsr	w10, w10, 2
 	add	x10, x0, x10
-.LVL367:
-.L401:
+.LVL377:
+.L414:
 	.loc 1 892 0
-	cbz	w12, .L402
+	cbz	w12, .L415
 	mov	x5, 0
 	.p2align 2
-.L403:
+.L416:
 	.loc 1 894 0
 	ldr	w3, [x2, x5, lsl 2]
 	.loc 1 893 0
 	ldr	w4, [x1, x5, lsl 2]
 	add	x5, x5, 1
-.LVL368:
+.LVL378:
 .LBB1240:
 .LBB1241:
 	.loc 1 134 0
@@ -4218,7 +4300,7 @@ direct_mode_data_change:
 .LBE1240:
 	.loc 1 892 0
 	cmp	w12, w5
-.LVL369:
+.LVL379:
 	.loc 1 896 0
 	and	w6, w4, 65535
 .LBB1246:
@@ -4233,7 +4315,7 @@ direct_mode_data_change:
 .LBE1246:
 	.loc 1 897 0
 	lsr	w3, w3, 16
-.LVL370:
+.LVL380:
 	lsr	w4, w4, 16
 .LBB1247:
 .LBB1248:
@@ -4285,27 +4367,27 @@ direct_mode_data_change:
 	.loc 1 897 0
 	strb	w3, [x10, -1]
 	.loc 1 892 0
-	bgt	.L403
+	bgt	.L416
 	add	x1, x1, x14
 	add	x2, x2, x14
-.L402:
+.L415:
 	.loc 1 886 0
 	add	w13, w13, 1
 	cmp	w16, w13
-	beq	.L414
+	beq	.L427
 	ldr	w3, [x15, 84]
 	.loc 1 887 0
-	cbnz	w17, .L427
-.L400:
+	cbnz	w17, .L440
+.L413:
 	.loc 1 890 0
 	mul	w10, w13, w3
-.LVL371:
+.LVL381:
 	lsr	w10, w10, 2
 	add	x10, x0, x10
-.LVL372:
-	b	.L401
-.LVL373:
-.L426:
+.LVL382:
+	b	.L414
+.LVL383:
+.L439:
 .LBE1239:
 .LBE1238:
 .LBB1258:
@@ -4318,57 +4400,57 @@ direct_mode_data_change:
 	ldr	w6, [x3, 56]
 	.loc 1 831 0
 	ldr	x13, [x7, #:lo12:.LANCHOR0]
-.LVL374:
+.LVL384:
 	.loc 1 838 0
 	ldr	x5, [x3, 128]
 	.loc 1 837 0
 	sub	w3, w4, w6
-.LVL375:
+.LVL385:
 	.loc 1 839 0
 	add	x13, x13, 24
 	.loc 1 838 0
 	lsl	w3, w3, 16
-.LVL376:
+.LVL386:
 	add	x3, x5, x3, sxtw
-.LVL377:
+.LVL387:
 	.loc 1 842 0
 	ldr	w15, [x13, 88]
 	.loc 1 841 0
 	ldr	w5, [x13, 84]
 	.loc 1 839 0
 	ldr	w16, [x13, 156]
-.LVL378:
+.LVL388:
 	.loc 1 847 0
 	cmp	w15, 0
 	.loc 1 841 0
 	lsr	w14, w5, 4
 	.loc 1 847 0
-	ble	.L414
+	ble	.L427
 	sub	w11, w14, #1
 	mov	x10, x2
-.LVL379:
+.LVL389:
 	add	x11, x11, 1
 	mov	x9, x1
-.LVL380:
+.LVL390:
 	lsl	x11, x11, 3
 	mov	w12, 0
-.LVL381:
+.LVL391:
 	.loc 1 848 0
-	cbz	w16, .L417
-.LVL382:
-.L430:
+	cbz	w16, .L430
+.LVL392:
+.L443:
 	.loc 1 849 0
 	ldr	w4, [x13, 88]
-.LVL383:
+.LVL393:
 	sub	w4, w4, #1
 	sub	w4, w4, w12
 	mul	w4, w4, w5
 	lsr	w4, w4, 2
 	add	x4, x0, x4
-.LVL384:
-.L418:
+.LVL394:
+.L431:
 	.loc 1 853 0
-	cbz	w14, .L428
+	cbz	w14, .L441
 .LBE1260:
 .LBE1259:
 .LBE1258:
@@ -4380,21 +4462,21 @@ direct_mode_data_change:
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	.p2align 2
-.L419:
+.L432:
 .LBB1305:
 .LBB1303:
 .LBB1301:
 	.loc 1 853 0
 	mov	x5, 0
 	.p2align 2
-.L399:
+.L412:
 	.loc 1 855 0
 	ldr	x2, [x10, x5]
-.LVL385:
+.LVL395:
 	add	x4, x4, 4
 	.loc 1 854 0
 	ldr	x1, [x9, x5]
-.LVL386:
+.LVL396:
 	add	x5, x5, 8
 	.loc 1 857 0
 	and	w7, w2, 65535
@@ -4452,7 +4534,7 @@ direct_mode_data_change:
 	ubfx	x6, x1, 32, 16
 	.loc 1 860 0
 	lsr	x2, x2, 48
-.LVL387:
+.LVL397:
 .LBB1277:
 .LBB1265:
 	.loc 1 133 0
@@ -4493,7 +4575,7 @@ direct_mode_data_change:
 .LBE1288:
 	.loc 1 860 0
 	lsr	x1, x1, 48
-.LVL388:
+.LVL398:
 .LBB1289:
 .LBB1272:
 	.loc 1 133 0
@@ -4552,34 +4634,34 @@ direct_mode_data_change:
 	.loc 1 860 0
 	strb	w1, [x4, -1]
 	.loc 1 853 0
-	bne	.L399
+	bne	.L412
 	.loc 1 847 0
 	add	w12, w12, 1
 	add	x9, x9, x11
 	add	x10, x10, x11
 	cmp	w15, w12
-	beq	.L392
-.L429:
+	beq	.L405
+.L442:
 	ldr	w5, [x13, 84]
 	.loc 1 848 0
-	cbz	w16, .L396
+	cbz	w16, .L409
 	.loc 1 849 0
 	ldr	w4, [x13, 88]
-.LVL389:
+.LVL399:
 	sub	w4, w4, #1
 	sub	w4, w4, w12
 	mul	w4, w4, w5
 	lsr	w4, w4, 2
 	add	x4, x0, x4
-.LVL390:
+.LVL400:
 	.loc 1 853 0
-	cbnz	w14, .L419
-.L425:
+	cbnz	w14, .L432
+.L438:
 	.loc 1 847 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	bne	.L429
-.L392:
+	bne	.L442
+.L405:
 .LBE1301:
 .LBE1303:
 .LBE1305:
@@ -4589,48 +4671,48 @@ direct_mode_data_change:
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
-.LVL391:
-.L417:
+.LVL401:
+.L430:
 .LBB1306:
 .LBB1304:
 .LBB1302:
 	.loc 1 851 0
 	mul	w4, w12, w5
-.LVL392:
+.LVL402:
 	lsr	w4, w4, 2
 	add	x4, x0, x4
-.LVL393:
-	b	.L418
-.LVL394:
+.LVL403:
+	b	.L431
+.LVL404:
 	.p2align 3
-.L396:
+.L409:
 	.cfi_def_cfa 29, 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mul	w4, w12, w5
-.LVL395:
+.LVL405:
 	lsr	w4, w4, 2
 	add	x4, x0, x4
-.LVL396:
+.LVL406:
 	.loc 1 853 0
-	cbnz	w14, .L419
-	b	.L425
-.LVL397:
-.L428:
+	cbnz	w14, .L432
+	b	.L438
+.LVL407:
+.L441:
 	.cfi_def_cfa 31, 0
 	.cfi_restore 29
 	.cfi_restore 30
 	.loc 1 847 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L414
+	beq	.L427
 	ldr	w5, [x13, 84]
 	.loc 1 848 0
-	cbz	w16, .L417
-	b	.L430
-.LVL398:
+	cbz	w16, .L430
+	b	.L443
+.LVL408:
 	.p2align 3
-.L414:
+.L427:
 	ret
 .LBE1302:
 .LBE1304:
@@ -4645,7 +4727,7 @@ direct_mode_data_change_part:
 .LFB2819:
 	.loc 1 999 0
 	.cfi_startproc
-.LVL399:
+.LVL409:
 	stp	x29, x30, [sp, -80]!
 	.cfi_def_cfa_offset 80
 	.cfi_offset 29, -80
@@ -4674,8 +4756,8 @@ direct_mode_data_change_part:
 	.cfi_offset 25, -16
 	.loc 1 1000 0
 	ldr	w16, [x3, 88]
-.LVL400:
-	cbnz	w16, .L535
+.LVL410:
+	cbnz	w16, .L548
 .LBB1340:
 .LBB1341:
 	.loc 1 917 0
@@ -4687,30 +4769,30 @@ direct_mode_data_change_part:
 	add	x18, x18, 24
 	.loc 1 923 0
 	ldr	x3, [x3, 128]
-.LVL401:
+.LVL411:
 	.loc 1 922 0
 	sub	w14, w14, w4
-.LVL402:
+.LVL412:
 	.loc 1 927 0
 	ldr	w30, [x18, 88]
 	.loc 1 923 0
 	lsl	w14, w14, 16
-.LVL403:
+.LVL413:
 	.loc 1 924 0
 	ldr	w19, [x18, 156]
 	.loc 1 923 0
 	add	x14, x3, x14, sxtw
-.LVL404:
+.LVL414:
 	.loc 1 926 0
 	ldr	w3, [x18, 84]
-.LVL405:
+.LVL415:
 	.loc 1 932 0
 	cmp	w30, 0
 	.loc 1 926 0
 	lsr	w9, w3, 3
-.LVL406:
+.LVL416:
 	.loc 1 932 0
-	ble	.L431
+	ble	.L444
 	sub	w17, w9, #1
 .LBB1342:
 .LBB1343:
@@ -4721,27 +4803,27 @@ direct_mode_data_change_part:
 .LBE1343:
 .LBE1342:
 	.loc 1 933 0
-	cbz	w19, .L461
-.LVL407:
+	cbz	w19, .L474
+.LVL417:
 	.p2align 2
-.L536:
+.L549:
 	.loc 1 934 0
 	ldr	w13, [x18, 88]
-.LVL408:
+.LVL418:
 	sub	w13, w13, #1
 	sub	w13, w13, w16
 	mul	w13, w13, w3
 	lsr	w13, w13, 2
 	add	x13, x0, x13
-.LVL409:
-.L462:
+.LVL419:
+.L475:
 	.loc 1 938 0
-	cbz	w9, .L463
+	cbz	w9, .L476
 	add	x13, x13, 2
-.LVL410:
+.LVL420:
 	mov	x10, 0
 	.p2align 2
-.L476:
+.L489:
 	.loc 1 940 0
 	ldr	w6, [x2, x10, lsl 2]
 .LBB1349:
@@ -4810,12 +4892,12 @@ direct_mode_data_change_part:
 .LBE1361:
 	.loc 1 941 0
 	cmp	w7, w6
-	beq	.L464
+	beq	.L477
 .LBB1362:
 .LBB1354:
 	.loc 1 142 0
 	cmp	w20, w12
-	beq	.L465
+	beq	.L478
 	.loc 1 139 0
 	tst	x25, 15
 	.loc 1 154 0
@@ -4844,7 +4926,7 @@ direct_mode_data_change_part:
 	.loc 1 153 0
 	and	w4, w6, w4
 	and	w4, w4, 255
-.L465:
+.L478:
 .LBE1354:
 .LBE1362:
 	.loc 1 942 0
@@ -4853,7 +4935,7 @@ direct_mode_data_change_part:
 .LBB1348:
 	.loc 1 142 0
 	cmp	w3, w11
-	beq	.L470
+	beq	.L483
 	.loc 1 139 0
 	tst	x22, 15
 	.loc 1 153 0
@@ -4882,54 +4964,54 @@ direct_mode_data_change_part:
 	.loc 1 153 0
 	and	w3, w5, w3
 	and	w5, w3, 255
-.L470:
+.L483:
 .LBE1348:
 .LBE1363:
 	.loc 1 943 0
 	strb	w5, [x13, -1]
-.L475:
+.L488:
 	add	x10, x10, 1
 	add	x13, x13, 2
 	.loc 1 938 0
 	cmp	w9, w10
-	bgt	.L476
+	bgt	.L489
 	add	x1, x1, x17
 	add	x2, x2, x17
-.LVL411:
-.L463:
+.LVL421:
+.L476:
 	.loc 1 932 0
 	add	w16, w16, 1
 	cmp	w30, w16
-	beq	.L431
+	beq	.L444
 	ldr	w3, [x18, 84]
 	.loc 1 933 0
-	cbnz	w19, .L536
-.L461:
+	cbnz	w19, .L549
+.L474:
 	.loc 1 936 0
 	mul	w13, w16, w3
-.LVL412:
+.LVL422:
 	lsr	w13, w13, 2
 	add	x13, x0, x13
-.LVL413:
-	b	.L462
-.LVL414:
+.LVL423:
+	b	.L475
+.LVL424:
 	.p2align 3
-.L464:
+.L477:
 	.loc 1 946 0
 	strh	wzr, [x13, -2]
-	b	.L475
-.LVL415:
+	b	.L488
+.LVL425:
 	.p2align 3
-.L431:
+.L444:
 .LBE1341:
 .LBE1340:
 	.loc 1 1004 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL416:
+.LVL426:
 	ldp	x23, x24, [sp, 48]
 	ldr	x25, [sp, 64]
-.LVL417:
+.LVL427:
 	ldp	x29, x30, [sp], 80
 	.cfi_remember_state
 	.cfi_restore 30
@@ -4942,10 +5024,10 @@ direct_mode_data_change_part:
 	.cfi_restore 19
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
-.LVL418:
+.LVL428:
 	ret
-.LVL419:
-.L535:
+.LVL429:
+.L548:
 	.cfi_restore_state
 .LBB1364:
 .LBB1339:
@@ -4959,40 +5041,40 @@ direct_mode_data_change_part:
 	add	x14, x14, 24
 	.loc 1 964 0
 	ldr	x3, [x3, 128]
-.LVL420:
+.LVL430:
 	.loc 1 963 0
 	sub	w7, w7, w4
-.LVL421:
+.LVL431:
 	.loc 1 968 0
 	ldr	w15, [x14, 88]
 	.loc 1 964 0
 	lsl	w7, w7, 16
-.LVL422:
+.LVL432:
 	.loc 1 965 0
 	ldr	w16, [x14, 156]
-.LVL423:
+.LVL433:
 	.loc 1 964 0
 	add	x7, x3, x7, sxtw
-.LVL424:
+.LVL434:
 	.loc 1 967 0
 	ldr	w3, [x14, 84]
-.LVL425:
+.LVL435:
 	.loc 1 973 0
 	cmp	w15, 0
 	.loc 1 967 0
 	lsr	w11, w3, 4
-.LVL426:
+.LVL436:
 	.loc 1 973 0
-	ble	.L431
+	ble	.L444
 	sub	w13, w11, #1
 	mov	x9, x2
-.LVL427:
+.LVL437:
 	add	x13, x13, 1
 	mov	x8, x1
-.LVL428:
+.LVL438:
 	lsl	x13, x13, 3
 	mov	w12, 0
-.LVL429:
+.LVL439:
 .LBB1328:
 .LBB1329:
 	.loc 1 139 0
@@ -5000,50 +5082,50 @@ direct_mode_data_change_part:
 .LBE1329:
 .LBE1328:
 	.loc 1 974 0
-	cbz	w16, .L435
-.LVL430:
+	cbz	w16, .L448
+.LVL440:
 	.p2align 2
-.L537:
+.L550:
 	.loc 1 975 0
 	ldr	w1, [x14, 88]
-.LVL431:
+.LVL441:
 	sub	w1, w1, #1
 	sub	w1, w1, w12
 	mul	w3, w1, w3
 	lsr	w3, w3, 2
 	add	x3, x0, x3
-.LVL432:
-.L436:
+.LVL442:
+.L449:
 	.loc 1 979 0
-	cbz	w11, .L437
+	cbz	w11, .L450
 	add	x3, x3, 4
-.LVL433:
+.LVL443:
 	mov	x5, 0
 	.p2align 2
-.L460:
+.L473:
 	.loc 1 980 0
 	ldr	x1, [x8, x5, lsl 3]
-.LVL434:
+.LVL444:
 	.loc 1 981 0
 	ldr	x2, [x9, x5, lsl 3]
-.LVL435:
+.LVL445:
 	.loc 1 982 0
 	cmp	x1, x2
-	beq	.L438
+	beq	.L451
 	.loc 1 983 0
 	and	w17, w2, 65535
 	and	w6, w1, 65535
-.LVL436:
+.LVL446:
 .LBB1331:
 .LBB1332:
 	.loc 1 143 0
 	mov	w4, 0
 	.loc 1 142 0
 	cmp	w17, w6
-	beq	.L439
+	beq	.L452
 	.loc 1 140 0
 	eor	w18, w17, w6
-.LVL437:
+.LVL447:
 	.loc 1 153 0
 	ubfiz	w19, w17, 8, 8
 	.loc 1 154 0
@@ -5081,8 +5163,8 @@ direct_mode_data_change_part:
 	.loc 1 153 0
 	and	w4, w6, w4
 	and	w4, w4, 255
-.LVL438:
-.L439:
+.LVL448:
+.L452:
 .LBE1332:
 .LBE1331:
 	.loc 1 983 0
@@ -5096,10 +5178,10 @@ direct_mode_data_change_part:
 	mov	w4, 0
 	.loc 1 142 0
 	cmp	w17, w6
-	beq	.L444
+	beq	.L457
 	.loc 1 140 0
 	eor	w18, w17, w6
-.LVL439:
+.LVL449:
 	.loc 1 153 0
 	ubfiz	w19, w17, 8, 8
 	.loc 1 154 0
@@ -5137,8 +5219,8 @@ direct_mode_data_change_part:
 	.loc 1 153 0
 	and	w4, w6, w4
 	and	w4, w4, 255
-.LVL440:
-.L444:
+.LVL450:
+.L457:
 .LBE1334:
 .LBE1333:
 	.loc 1 984 0
@@ -5152,10 +5234,10 @@ direct_mode_data_change_part:
 	mov	w4, 0
 	.loc 1 142 0
 	cmp	w17, w6
-	beq	.L449
+	beq	.L462
 	.loc 1 140 0
 	eor	w18, w17, w6
-.LVL441:
+.LVL451:
 	.loc 1 153 0
 	ubfiz	w19, w17, 8, 8
 	.loc 1 154 0
@@ -5193,27 +5275,27 @@ direct_mode_data_change_part:
 	.loc 1 153 0
 	and	w4, w6, w4
 	and	w4, w4, 255
-.LVL442:
-.L449:
+.LVL452:
+.L462:
 .LBE1336:
 .LBE1335:
 	.loc 1 985 0
 	strb	w4, [x3, -2]
 	.loc 1 986 0
 	lsr	x2, x2, 48
-.LVL443:
+.LVL453:
 	lsr	x1, x1, 48
-.LVL444:
+.LVL454:
 .LBB1337:
 .LBB1330:
 	.loc 1 143 0
 	mov	w4, 0
 	.loc 1 142 0
 	cmp	w2, w1
-	beq	.L454
+	beq	.L467
 	.loc 1 140 0
 	eor	w6, w2, w1
-.LVL445:
+.LVL455:
 	.loc 1 153 0
 	ubfiz	w4, w2, 8, 8
 	.loc 1 154 0
@@ -5229,7 +5311,7 @@ direct_mode_data_change_part:
 	.loc 1 147 0
 	tst	w6, 240
 	orr	w18, w2, 12
-.LVL446:
+.LVL456:
 	.loc 1 153 0
 	ldrb	w17, [x7, w4, sxtw]
 	.loc 1 147 0
@@ -5252,44 +5334,44 @@ direct_mode_data_change_part:
 	.loc 1 153 0
 	and	w2, w4, w2
 	and	w4, w2, 255
-.LVL447:
-.L454:
+.LVL457:
+.L467:
 .LBE1330:
 .LBE1337:
 	.loc 1 986 0
 	strb	w4, [x3, -1]
-.LVL448:
-.L459:
+.LVL458:
+.L472:
 	add	x5, x5, 1
 	add	x3, x3, 4
 	.loc 1 979 0
 	cmp	w11, w5
-	bgt	.L460
+	bgt	.L473
 	add	x8, x8, x13
 	add	x9, x9, x13
-.LVL449:
-.L437:
+.LVL459:
+.L450:
 	.loc 1 973 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L431
+	beq	.L444
 	ldr	w3, [x14, 84]
-.LVL450:
+.LVL460:
 	.loc 1 974 0
-	cbnz	w16, .L537
-.L435:
+	cbnz	w16, .L550
+.L448:
 	.loc 1 977 0
 	mul	w3, w12, w3
 	lsr	w3, w3, 2
 	add	x3, x0, x3
-.LVL451:
-	b	.L436
-.LVL452:
+.LVL461:
+	b	.L449
+.LVL462:
 	.p2align 3
-.L438:
+.L451:
 	.loc 1 989 0
 	str	wzr, [x3, -4]
-	b	.L459
+	b	.L472
 .LBE1338:
 .LBE1339:
 .LBE1364:
@@ -5300,10 +5382,10 @@ direct_mode_data_change_part:
 	.p2align 3,,7
 	.type	flip.isra.7, %function
 flip.isra.7:
-.LFB2864:
+.LFB2865:
 	.loc 1 1006 0
 	.cfi_startproc
-.LVL453:
+.LVL463:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -5322,27 +5404,27 @@ flip.isra.7:
 	ldr	w19, [x0, 72]
 	.loc 1 1010 0
 	ldr	x0, [x0]
-.LVL454:
+.LVL464:
 .LBB1365:
 .LBB1366:
 .LBB1367:
 .LBB1368:
 	.file 10 "./include/linux/dma-mapping.h"
 	.loc 10 266 0
-	cbz	x0, .L541
+	cbz	x0, .L554
 	ldr	x3, [x0, 648]
 	.loc 10 268 0
 	adrp	x4, dummy_dma_ops
 	add	x4, x4, :lo12:dummy_dma_ops
 	cmp	x3, 0
 	csel	x3, x4, x3, eq
-.L539:
+.L552:
 .LBE1368:
 .LBE1367:
 	.loc 10 434 0
 	ldr	x5, [x3, 88]
 	sxtw	x19, w19
-	cbz	x5, .L540
+	cbz	x5, .L553
 .LBE1366:
 .LBE1365:
 	.loc 1 1010 0
@@ -5360,8 +5442,8 @@ flip.isra.7:
 	.loc 10 435 0
 	ldr	x1, [x4, 32]
 	blr	x5
-.LVL455:
-.L540:
+.LVL465:
+.L553:
 .LBE1372:
 .LBE1375:
 	.loc 1 1011 0
@@ -5391,7 +5473,7 @@ flip.isra.7:
 .LBB1379:
 	.loc 11 57 0
 	blr	x5
-.LVL456:
+.LVL466:
 .LBE1379:
 .LBE1381:
 	.loc 1 1012 0
@@ -5404,7 +5486,7 @@ flip.isra.7:
 	ldr	x3, [x1, 72]
 	ldr	w1, [x19, 32]
 	blr	x3
-.LVL457:
+.LVL467:
 .LBE1383:
 .LBE1382:
 	.loc 1 1013 0
@@ -5416,7 +5498,7 @@ flip.isra.7:
 	mov	x0, x2
 	ldr	x2, [x2, 96]
 	blr	x2
-.LVL458:
+.LVL468:
 .LBE1385:
 .LBE1384:
 	.loc 1 1014 0
@@ -5426,7 +5508,7 @@ flip.isra.7:
 	str	w0, [x20, 72]
 	.loc 1 1015 0
 	ldp	x19, x20, [sp, 16]
-.LVL459:
+.LVL469:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -5435,9 +5517,9 @@ flip.isra.7:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL460:
+.LVL470:
 	.p2align 3
-.L541:
+.L554:
 	.cfi_restore_state
 .LBB1386:
 .LBB1373:
@@ -5446,13 +5528,13 @@ flip.isra.7:
 	.loc 10 268 0
 	adrp	x3, dummy_dma_ops
 	add	x3, x3, :lo12:dummy_dma_ops
-	b	.L539
+	b	.L552
 .LBE1369:
 .LBE1370:
 .LBE1373:
 .LBE1386:
 	.cfi_endproc
-.LFE2864:
+.LFE2865:
 	.size	flip.isra.7, .-flip.isra.7
 	.align	2
 	.p2align 3,,7
@@ -5461,7 +5543,7 @@ ebc_frame_start:
 .LFB2822:
 	.loc 1 1024 0
 	.cfi_startproc
-.LVL461:
+.LVL471:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
@@ -5483,24 +5565,24 @@ ebc_frame_start:
 	.loc 1 1028 0
 	ldr	x1, [x19, 224]
 	ldr	w0, [x1, 40]
-.LVL462:
+.LVL472:
 	cmp	w0, 16
-	bgt	.L548
+	bgt	.L561
 	cmp	w0, 7
-	bge	.L549
-	cbz	w0, .L550
+	bge	.L562
+	cbz	w0, .L563
 	cmp	w0, 1
-	bne	.L547
+	bne	.L560
 	.loc 1 1030 0
 	ldr	x0, [x19, 184]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
 	ldr	x3, [x19, 168]
 	bl	get_overlay_image
-.LVL463:
+.LVL473:
 	.loc 1 1035 0
 	ldr	w0, [x19, 52]
-	cbz	w0, .L552
+	cbz	w0, .L565
 .LBB1387:
 .LBB1388:
 	.loc 1 1019 0
@@ -5509,7 +5591,7 @@ ebc_frame_start:
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
-.LVL464:
+.LVL474:
 .LBE1388:
 .LBE1387:
 	.loc 1 1037 0
@@ -5518,11 +5600,11 @@ ebc_frame_start:
 	ldr	x3, [x19, 168]
 	ldr	x0, [x19, 192]
 	bl	get_overlay_image
-.LVL465:
+.LVL475:
 	.loc 1 1105 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL466:
+.LVL476:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -5532,25 +5614,25 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL467:
+.LVL477:
 	.p2align 3
-.L548:
+.L561:
 	.cfi_restore_state
 	.loc 1 1028 0
 	sub	w0, w0, #22
 	cmp	w0, 1
-	bhi	.L547
-.L550:
+	bhi	.L560
+.L563:
 	.loc 1 1050 0
 	ldr	x0, [x19, 184]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
 	ldr	x3, [x19, 168]
 	bl	get_auto_image
-.LVL468:
+.LVL478:
 	.loc 1 1055 0
 	ldr	w0, [x19, 52]
-	cbz	w0, .L554
+	cbz	w0, .L567
 .LBB1389:
 .LBB1390:
 	.loc 1 1019 0
@@ -5559,7 +5641,7 @@ ebc_frame_start:
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
-.LVL469:
+.LVL479:
 .LBE1390:
 .LBE1389:
 	.loc 1 1057 0
@@ -5568,11 +5650,11 @@ ebc_frame_start:
 	ldr	x3, [x19, 168]
 	ldr	x0, [x19, 192]
 	bl	get_auto_image
-.LVL470:
+.LVL480:
 	.loc 1 1105 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL471:
+.LVL481:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -5582,9 +5664,9 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL472:
+.LVL482:
 	.p2align 3
-.L547:
+.L560:
 	.cfi_restore_state
 	.loc 1 1093 0
 	ldr	x2, [x19, 216]
@@ -5598,7 +5680,7 @@ ebc_frame_start:
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change
-.LVL473:
+.LVL483:
 .LBB1391:
 .LBB1392:
 	.loc 1 1019 0
@@ -5607,7 +5689,7 @@ ebc_frame_start:
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
-.LVL474:
+.LVL484:
 .LBE1392:
 .LBE1391:
 	.loc 1 1096 0
@@ -5624,11 +5706,11 @@ ebc_frame_start:
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
-.LVL475:
+.LVL485:
 	.loc 1 1105 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL476:
+.LVL486:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 30
@@ -5638,9 +5720,9 @@ ebc_frame_start:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL477:
+.LVL487:
 	.p2align 3
-.L549:
+.L562:
 	.cfi_restore_state
 	.loc 1 1080 0
 	ldr	x2, [x19, 216]
@@ -5654,7 +5736,7 @@ ebc_frame_start:
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change_part
-.LVL478:
+.LVL488:
 .LBB1393:
 .LBB1394:
 	.loc 1 1019 0
@@ -5663,7 +5745,7 @@ ebc_frame_start:
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
-.LVL479:
+.LVL489:
 .LBE1394:
 .LBE1393:
 	.loc 1 1083 0
@@ -5680,11 +5762,11 @@ ebc_frame_start:
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part
-.LVL480:
+.LVL490:
 	.loc 1 1105 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL481:
+.LVL491:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -5694,23 +5776,23 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL482:
+.LVL492:
 	.p2align 3
-.L554:
+.L567:
 	.cfi_restore_state
 	.loc 1 1063 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
-	adrp	x1, .LC21
+	adrp	x1, .LC22
 	add	x2, x2, :lo12:.LANCHOR3
-	add	x1, x1, :lo12:.LC21
+	add	x1, x1, :lo12:.LC22
 	bl	_dev_info
-.LVL483:
+.LVL493:
 	.loc 1 1064 0
 	str	wzr, [x19, 44]
 	.loc 1 1105 0
 	ldp	x19, x20, [sp, 16]
-.LVL484:
+.LVL494:
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -5721,23 +5803,23 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL485:
+.LVL495:
 	.p2align 3
-.L552:
+.L565:
 	.cfi_restore_state
 	.loc 1 1043 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
-	adrp	x1, .LC20
+	adrp	x1, .LC21
 	add	x2, x2, :lo12:.LANCHOR3
-	add	x1, x1, :lo12:.LC20
+	add	x1, x1, :lo12:.LC21
 	bl	_dev_info
-.LVL486:
+.LVL496:
 	.loc 1 1044 0
 	str	wzr, [x19, 44]
 	.loc 1 1105 0
 	ldp	x19, x20, [sp, 16]
-.LVL487:
+.LVL497:
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	.cfi_restore 20
@@ -5757,7 +5839,7 @@ ebc_auto_tast_function:
 .LFB2823:
 	.loc 1 1108 0
 	.cfi_startproc
-.LVL488:
+.LVL498:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
@@ -5766,7 +5848,7 @@ ebc_auto_tast_function:
 	adrp	x1, .LANCHOR0
 	.loc 1 1108 0
 	adrp	x0, __stack_chk_guard
-.LVL489:
+.LVL499:
 	add	x0, x0, :lo12:__stack_chk_guard
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -5781,7 +5863,7 @@ ebc_auto_tast_function:
 	.cfi_offset 22, -56
 	.loc 1 1109 0
 	ldr	x22, [x1, #:lo12:.LANCHOR0]
-.LVL490:
+.LVL500:
 	.loc 1 1114 0
 	add	x20, x20, 376
 	.loc 1 1108 0
@@ -5813,7 +5895,7 @@ ebc_auto_tast_function:
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x23, sp_el0
 // 0 "" 2
-.LVL491:
+.LVL501:
 #NO_APP
 .LBE1400:
 .LBE1399:
@@ -5822,25 +5904,25 @@ ebc_auto_tast_function:
 	ldr	x1, [x0]
 	str	x1, [x29, 88]
 	mov	x1,0
-	b	.L570
+	b	.L583
 	.p2align 3
-.L586:
+.L599:
 	.loc 1 1173 0
 	cmp	w0, 1
-	beq	.L585
-.L569:
+	beq	.L598
+.L582:
 	.loc 1 1176 0
 	mov	x0, x20
 	bl	up
-.LVL492:
+.LVL502:
 	.loc 1 1177 0
 	bl	schedule
-.LVL493:
-.L570:
+.LVL503:
+.L583:
 	.loc 1 1114 0
 	mov	x0, x20
 	bl	down
-.LVL494:
+.LVL504:
 .LBB1403:
 .LBB1401:
 .LBB1398:
@@ -5859,17 +5941,17 @@ ebc_auto_tast_function:
 	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 16
-	bgt	.L561
+	bgt	.L574
 	cmp	w0, 7
-	bge	.L562
-	cbz	w0, .L563
+	bge	.L575
+	cbz	w0, .L576
 	cmp	w0, 1
-	bne	.L560
+	bne	.L573
 	.loc 1 1121 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
 	bl	flip.isra.7
-.LVL495:
+.LVL505:
 	.loc 1 1122 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
@@ -5878,8 +5960,8 @@ ebc_auto_tast_function:
 	ldr	x3, [x19, 168]
 	ldr	x0, [x0, 184]
 	bl	get_overlay_image
-.LVL496:
-.L565:
+.LVL506:
+.L578:
 	.loc 1 1170 0
 	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
@@ -5888,7 +5970,7 @@ ebc_auto_tast_function:
 	.loc 1 1172 0
 	cmp	w0, 0
 	ccmp	w1, 1, 0, ne
-	bhi	.L586
+	bhi	.L599
 .LBB1404:
 .LBB1405:
 	.file 13 "./include/linux/workqueue.h"
@@ -5897,17 +5979,17 @@ ebc_auto_tast_function:
 	mov	x2, x25
 	mov	w0, 8
 	bl	queue_work_on
-.LVL497:
-	b	.L569
+.LVL507:
+	b	.L582
 	.p2align 3
-.L561:
+.L574:
 .LBE1405:
 .LBE1404:
 	.loc 1 1119 0
 	sub	w0, w0, #22
 	cmp	w0, 1
-	bls	.L563
-.L560:
+	bls	.L576
+.L573:
 	.loc 1 1158 0
 	ldr	w1, [x19, 56]
 	.loc 1 1159 0
@@ -5918,10 +6000,10 @@ ebc_auto_tast_function:
 	.loc 1 1159 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.7
-.LVL498:
+.LVL508:
 	.loc 1 1160 0
 	ldr	w0, [x19, 56]
-	cbz	w0, .L565
+	cbz	w0, .L578
 	.loc 1 1162 0
 	ldrsw	x0, [x21, 72]
 	mov	x3, x19
@@ -5933,16 +6015,16 @@ ebc_auto_tast_function:
 	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
-.LVL499:
+.LVL509:
 	.loc 1 1166 0
-	b	.L565
+	b	.L578
 	.p2align 3
-.L563:
+.L576:
 	.loc 1 1131 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
 	bl	flip.isra.7
-.LVL500:
+.LVL510:
 	.loc 1 1132 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
@@ -5951,11 +6033,11 @@ ebc_auto_tast_function:
 	ldr	x3, [x19, 168]
 	ldr	x0, [x0, 184]
 	bl	get_auto_image
-.LVL501:
+.LVL511:
 	.loc 1 1137 0
-	b	.L565
+	b	.L578
 	.p2align 3
-.L562:
+.L575:
 	.loc 1 1148 0
 	ldr	w1, [x19, 56]
 	.loc 1 1149 0
@@ -5966,10 +6048,10 @@ ebc_auto_tast_function:
 	.loc 1 1149 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.7
-.LVL502:
+.LVL512:
 	.loc 1 1150 0
 	ldr	w0, [x19, 56]
-	cbz	w0, .L565
+	cbz	w0, .L578
 	.loc 1 1152 0
 	ldrsw	x0, [x21, 72]
 	mov	x3, x19
@@ -5981,17 +6063,17 @@ ebc_auto_tast_function:
 	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part
-.LVL503:
+.LVL513:
 	.loc 1 1156 0
-	b	.L565
+	b	.L578
 	.p2align 3
-.L585:
+.L598:
 	.loc 1 1173 0 discriminator 1
 	ldr	w0, [x19, 628]
-	cbz	w0, .L569
+	cbz	w0, .L582
 	.loc 1 1173 0 is_stmt 0 discriminator 2
 	ldr	w0, [x19, 632]
-	cbz	w0, .L569
+	cbz	w0, .L582
 .LBB1407:
 .LBB1406:
 	.loc 13 518 0 is_stmt 1
@@ -5999,8 +6081,8 @@ ebc_auto_tast_function:
 	mov	x2, x25
 	mov	w0, 8
 	bl	queue_work_on
-.LVL504:
-	b	.L569
+.LVL514:
+	b	.L582
 .LBE1406:
 .LBE1407:
 	.cfi_endproc
@@ -6010,10 +6092,10 @@ ebc_auto_tast_function:
 	.p2align 3,,7
 	.type	ebc_power_set.part.8, %function
 ebc_power_set.part.8:
-.LFB2865:
+.LFB2866:
 	.loc 1 183 0
 	.cfi_startproc
-.LVL505:
+.LVL515:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -6029,15 +6111,15 @@ ebc_power_set.part.8:
 	str	w1, [x0, 384]
 	.loc 1 201 0
 	ldr	x1, [x0, 8]
-.LVL506:
+.LVL516:
 .LBB1408:
 .LBB1409:
 	.loc 11 51 0
 	mov	x0, x1
-.LVL507:
+.LVL517:
 	ldr	x1, [x1, 56]
 	blr	x1
-.LVL508:
+.LVL518:
 .LBE1409:
 .LBE1408:
 	.loc 1 202 0
@@ -6049,21 +6131,21 @@ ebc_power_set.part.8:
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL509:
+.LVL519:
 .LBE1411:
 .LBE1410:
 	.loc 1 203 0
 	ldr	w0, [x19, 624]
-	cbnz	w0, .L593
+	cbnz	w0, .L606
 	.loc 1 207 0
 	ldr	x0, [x19]
-	adrp	x1, .LC22
-	add	x1, x1, :lo12:.LC22
+	adrp	x1, .LC23
+	add	x1, x1, :lo12:.LC23
 	bl	_dev_info
-.LVL510:
+.LVL520:
 	.loc 1 211 0
 	ldp	x19, x20, [sp, 16]
-.LVL511:
+.LVL521:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -6072,9 +6154,9 @@ ebc_power_set.part.8:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL512:
+.LVL522:
 	.p2align 3
-.L593:
+.L606:
 	.cfi_restore_state
 	.loc 1 204 0
 	str	wzr, [x19, 624]
@@ -6083,18 +6165,18 @@ ebc_power_set.part.8:
 	.loc 4 68 0
 	add	x0, x19, 416
 	bl	__pm_relax
-.LVL513:
+.LVL523:
 .LBE1413:
 .LBE1412:
 	.loc 1 207 0
 	ldr	x0, [x19]
-	adrp	x1, .LC22
-	add	x1, x1, :lo12:.LC22
+	adrp	x1, .LC23
+	add	x1, x1, :lo12:.LC23
 	bl	_dev_info
-.LVL514:
+.LVL524:
 	.loc 1 211 0
 	ldp	x19, x20, [sp, 16]
-.LVL515:
+.LVL525:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -6103,16 +6185,16 @@ ebc_power_set.part.8:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2865:
+.LFE2866:
 	.size	ebc_power_set.part.8, .-ebc_power_set.part.8
 	.align	2
 	.p2align 3,,7
 	.type	ebc_suspend, %function
 ebc_suspend:
-.LFB2853:
-	.loc 1 2536 0
+.LFB2854:
+	.loc 1 2577 0
 	.cfi_startproc
-.LVL516:
+.LVL526:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -6128,17 +6210,17 @@ ebc_suspend:
 	ldr	x20, [x0, 184]
 .LBE1415:
 .LBE1414:
-	.loc 1 2540 0
+	.loc 1 2581 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 200]
-.LVL517:
+.LVL527:
 	cmp	w0, 1
-	beq	.L597
-.L595:
-	.loc 1 2544 0
+	beq	.L610
+.L608:
+	.loc 1 2585 0
 	mov	w0, 1
 	str	w0, [x19, 620]
-	.loc 1 2546 0
+	.loc 1 2587 0
 	ldr	x1, [x20, 16]
 .LBB1416:
 .LBB1417:
@@ -6146,16 +6228,16 @@ ebc_suspend:
 	mov	x0, x1
 	ldr	x1, [x1, 40]
 	blr	x1
-.LVL518:
+.LVL528:
 .LBE1417:
 .LBE1416:
-	.loc 1 2547 0
+	.loc 1 2588 0
 	ldr	x0, [x19, 104]
-	adrp	x1, .LC24
-	add	x1, x1, :lo12:.LC24
+	adrp	x1, .LC25
+	add	x1, x1, :lo12:.LC25
 	bl	_dev_info
-.LVL519:
-	.loc 1 2550 0
+.LVL529:
+	.loc 1 2591 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -6167,37 +6249,37 @@ ebc_suspend:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L597:
+.L610:
 	.cfi_restore_state
-	.loc 1 2541 0
+	.loc 1 2582 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
-	adrp	x1, .LC23
+	adrp	x1, .LC24
 	add	x2, x2, 16
-	add	x1, x1, :lo12:.LC23
+	add	x1, x1, :lo12:.LC24
 	bl	_dev_info
-.LVL520:
+.LVL530:
 .LBB1418:
 .LBB1419:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
-.LVL521:
-	b	.L595
+.LVL531:
+	b	.L608
 .LBE1419:
 .LBE1418:
 	.cfi_endproc
-.LFE2853:
+.LFE2854:
 	.size	ebc_suspend, .-ebc_suspend
 	.align	2
 	.p2align 3,,7
 	.type	ebc_probe, %function
 ebc_probe:
-.LFB2851:
-	.loc 1 2400 0
+.LFB2852:
+	.loc 1 2441 0
 	.cfi_startproc
-.LVL522:
+.LVL532:
 	stp	x29, x30, [sp, -208]!
 	.cfi_def_cfa_offset 208
 	.cfi_offset 29, -208
@@ -6209,22 +6291,22 @@ ebc_probe:
 	movk	w2, 0x60, lsl 16
 .LBE1571:
 .LBE1570:
-	.loc 1 2400 0
+	.loc 1 2441 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 2401 0
+	.loc 1 2442 0
 	add	x22, x0, 16
-	.loc 1 2400 0
+	.loc 1 2441 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
-.LVL523:
+.LVL533:
 	stp	x25, x26, [sp, 64]
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 19, -192
@@ -6233,7 +6315,7 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 2400 0
+	.loc 1 2441 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
@@ -6243,138 +6325,138 @@ ebc_probe:
 	mov	x0, x22
 	mov	x1, 824
 	bl	devm_kmalloc
-.LVL524:
+.LVL534:
 .LBE1572:
 .LBE1573:
-	.loc 1 2416 0
-	cbz	x0, .L648
-	.loc 1 2420 0
+	.loc 1 2457 0
+	cbz	x0, .L661
+	.loc 1 2461 0
 	adrp	x24, .LANCHOR0
 	mov	x20, x0
-	.loc 1 2422 0
-	adrp	x1, .LC25
+	.loc 1 2463 0
+	adrp	x1, .LC26
 	mov	w2, 0
-	.loc 1 2420 0
+	.loc 1 2461 0
 	str	x0, [x24, #:lo12:.LANCHOR0]
-	.loc 1 2422 0
-	add	x1, x1, :lo12:.LC25
+	.loc 1 2463 0
+	add	x1, x1, :lo12:.LC26
 	ldr	x0, [x22, 752]
-	.loc 1 2419 0
+	.loc 1 2460 0
 	str	x22, [x20]
-	.loc 1 2422 0
+	.loc 1 2463 0
 	bl	of_parse_phandle
-.LVL525:
-	.loc 1 2423 0
-	cbz	x0, .L693
-	.loc 1 2428 0
+.LVL535:
+	.loc 1 2464 0
+	cbz	x0, .L706
+	.loc 1 2469 0
 	bl	of_find_device_by_node
-.LVL526:
-	.loc 1 2430 0
-	cbz	x0, .L602
+.LVL536:
+	.loc 1 2471 0
+	cbz	x0, .L615
 .LBB1574:
 .LBB1575:
 .LBB1576:
 	.loc 2 1181 0
 	ldr	x0, [x0, 200]
-.LVL527:
+.LVL537:
 .LBE1576:
 .LBE1575:
 .LBE1574:
-	.loc 1 2433 0
+	.loc 1 2474 0
 	str	x0, [x20, 8]
-	.loc 1 2434 0
-	cbz	x0, .L602
-	.loc 1 2436 0
+	.loc 1 2475 0
+	cbz	x0, .L615
+	.loc 1 2477 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 2438 0
+	.loc 1 2479 0
 	add	x2, x29, 96
-	adrp	x1, .LC27
-	add	x1, x1, :lo12:.LC27
+	adrp	x1, .LC28
+	add	x1, x1, :lo12:.LC28
 	ldr	x0, [x22, 752]
 	bl	of_get_property
-.LVL528:
+.LVL538:
 	mov	x21, x0
-.LVL529:
-	.loc 1 2439 0
+.LVL539:
+	.loc 1 2480 0
 	ldrsw	x0, [x29, 96]
-.LVL530:
+.LVL540:
 	lsr	x0, x0, 2
-.LVL531:
+.LVL541:
 	str	w0, [x29, 96]
-.LVL532:
-	.loc 1 2440 0
+.LVL542:
+	.loc 1 2481 0
 	cmp	w0, 0
-	beq	.L603
-	.loc 1 2445 0 discriminator 1
+	beq	.L616
+	.loc 1 2486 0 discriminator 1
 	mov	w19, 0
-.LVL533:
-	bgt	.L677
-	b	.L605
+.LVL543:
+	bgt	.L690
+	b	.L618
 	.p2align 3
-.L606:
-	.loc 1 2453 0
+.L619:
+	.loc 1 2494 0
 	bl	of_find_i2c_device_by_node
-.LVL534:
-	.loc 1 2455 0
-	cbz	x0, .L694
+.LVL544:
+	.loc 1 2496 0
+	cbz	x0, .L707
 .LBB1577:
 .LBB1578:
 .LBB1579:
 	.loc 2 1181 0
 	ldr	x0, [x0, 216]
-.LVL535:
+.LVL545:
 .LBE1579:
 .LBE1578:
 .LBE1577:
-	.loc 1 2460 0
+	.loc 1 2501 0
 	str	x0, [x20, 16]
-	.loc 1 2461 0
-	cbnz	x0, .L695
-	.loc 1 2445 0 discriminator 2
+	.loc 1 2502 0
+	cbnz	x0, .L708
+	.loc 1 2486 0 discriminator 2
 	ldr	w0, [x29, 96]
 	add	w19, w19, 1
-.LVL536:
+.LVL546:
 	cmp	w0, w19
-	ble	.L610
-.L677:
+	ble	.L623
+.L690:
 	ldr	w0, [x21], 4
-	.loc 1 2447 0
+	.loc 1 2488 0
 	rev	w0, w0
 	bl	of_find_node_by_phandle
-.LVL537:
-	.loc 1 2448 0
-	cbnz	x0, .L606
-	.loc 1 2449 0
-	adrp	x1, .LC29
+.LVL547:
+	.loc 1 2489 0
+	cbnz	x0, .L619
+	.loc 1 2490 0
+	adrp	x1, .LC30
 	mov	x0, x22
-	add	x1, x1, :lo12:.LC29
-	.loc 1 2450 0
+	add	x1, x1, :lo12:.LC30
+	.loc 1 2491 0
 	mov	w25, -19
-	.loc 1 2449 0
+	.loc 1 2490 0
 	bl	_dev_err
-.LVL538:
+.LVL548:
 	.p2align 2
-.L598:
-	.loc 1 2526 0
+.L611:
+	.loc 1 2567 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w25
-.LVL539:
+.LVL549:
 	ldr	x2, [x29, 200]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L696
+	cbnz	x1, .L709
 	ldp	x19, x20, [sp, 16]
-.LVL540:
+.LVL550:
 	ldp	x21, x22, [sp, 32]
-.LVL541:
+.LVL551:
 	ldp	x23, x24, [sp, 48]
-.LVL542:
+.LVL552:
 	ldp	x25, x26, [sp, 64]
-.LVL543:
+.LVL553:
 	ldp	x27, x28, [sp, 80]
-.LVL544:
+.LVL554:
 	ldp	x29, x30, [sp], 208
 	.cfi_remember_state
 	.cfi_restore 30
@@ -6391,28 +6473,28 @@ ebc_probe:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL545:
+.LVL555:
 	.p2align 3
-.L695:
+.L708:
 	.cfi_restore_state
-	.loc 1 2462 0
-	adrp	x1, .LC31
+	.loc 1 2503 0
+	adrp	x1, .LC32
 	mov	w2, w19
-	add	x1, x1, :lo12:.LC31
+	add	x1, x1, :lo12:.LC32
 	mov	x0, x22
 	bl	_dev_info
-.LVL546:
-.L605:
-	.loc 1 2467 0
+.LVL556:
+.L618:
+	.loc 1 2508 0
 	ldr	x0, [x20, 16]
-	cbz	x0, .L610
-	.loc 1 2473 0
+	cbz	x0, .L623
+	.loc 1 2514 0
 	add	x19, x20, 184
-.LVL547:
-	.loc 1 2475 0
+.LVL557:
+	.loc 1 2516 0
 	add	x21, x20, 24
-.LVL548:
-	.loc 1 2473 0
+.LVL558:
+	.loc 1 2514 0
 	str	x22, [x19, 104]
 .LBB1580:
 .LBB1581:
@@ -6421,13 +6503,13 @@ ebc_probe:
 .LBB1584:
 	.file 14 "./include/linux/of.h"
 	.loc 14 499 0
-	adrp	x1, .LC33
+	adrp	x1, .LC34
 .LBE1584:
 .LBE1583:
 .LBE1582:
 .LBE1581:
 .LBE1580:
-	.loc 1 2475 0
+	.loc 1 2516 0
 	str	x22, [x20, 24]
 .LBB1654:
 .LBB1651:
@@ -6441,7 +6523,7 @@ ebc_probe:
 .LBE1591:
 .LBE1651:
 .LBE1654:
-	.loc 1 2476 0
+	.loc 1 2517 0
 	ldr	x2, [x20, 8]
 .LBB1655:
 .LBB1652:
@@ -6449,13 +6531,13 @@ ebc_probe:
 .LBB1589:
 .LBB1586:
 	.loc 14 499 0
-	add	x1, x1, :lo12:.LC33
+	add	x1, x1, :lo12:.LC34
 .LBE1586:
 .LBE1589:
 .LBE1592:
 .LBE1652:
 .LBE1655:
-	.loc 1 2477 0
+	.loc 1 2518 0
 	stp	x2, x0, [x21, 8]
 .LBB1656:
 .LBB1653:
@@ -6467,9 +6549,9 @@ ebc_probe:
 	ldr	x0, [x22, 752]
 	add	x2, x20, 100
 	bl	of_property_read_variable_u32_array
-.LVL549:
+.LVL559:
 	.loc 14 501 0
-	tbnz	w0, #31, .L612
+	tbnz	w0, #31, .L625
 .LBE1587:
 .LBE1590:
 .LBE1593:
@@ -6478,15 +6560,15 @@ ebc_probe:
 .LBB1596:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC57
+	adrp	x1, .LC58
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 104
-	add	x1, x1, :lo12:.LC57
+	add	x1, x1, :lo12:.LC58
 	bl	of_property_read_variable_u32_array
-.LVL550:
+.LVL560:
 	.loc 14 501 0
-	tbnz	w0, #31, .L612
+	tbnz	w0, #31, .L625
 .LBE1596:
 .LBE1595:
 .LBE1594:
@@ -6495,15 +6577,15 @@ ebc_probe:
 .LBB1599:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC58
+	adrp	x1, .LC59
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 108
-	add	x1, x1, :lo12:.LC58
+	add	x1, x1, :lo12:.LC59
 	bl	of_property_read_variable_u32_array
-.LVL551:
+.LVL561:
 	.loc 14 501 0
-	tbnz	w0, #31, .L612
+	tbnz	w0, #31, .L625
 .LBE1599:
 .LBE1598:
 .LBE1597:
@@ -6512,15 +6594,15 @@ ebc_probe:
 .LBB1602:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC59
+	adrp	x1, .LC60
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 112
-	add	x1, x1, :lo12:.LC59
+	add	x1, x1, :lo12:.LC60
 	bl	of_property_read_variable_u32_array
-.LVL552:
+.LVL562:
 	.loc 14 501 0
-	tbnz	w0, #31, .L612
+	tbnz	w0, #31, .L625
 .LBE1602:
 .LBE1601:
 .LBE1600:
@@ -6529,15 +6611,15 @@ ebc_probe:
 .LBB1605:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC60
+	adrp	x1, .LC61
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 128
-	add	x1, x1, :lo12:.LC60
+	add	x1, x1, :lo12:.LC61
 	bl	of_property_read_variable_u32_array
-.LVL553:
+.LVL563:
 	.loc 14 501 0
-	tbnz	w0, #31, .L612
+	tbnz	w0, #31, .L625
 .LBE1605:
 .LBE1604:
 .LBE1603:
@@ -6546,15 +6628,15 @@ ebc_probe:
 .LBB1608:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC61
+	adrp	x1, .LC62
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 132
-	add	x1, x1, :lo12:.LC61
+	add	x1, x1, :lo12:.LC62
 	bl	of_property_read_variable_u32_array
-.LVL554:
+.LVL564:
 	.loc 14 501 0
-	tbnz	w0, #31, .L612
+	tbnz	w0, #31, .L625
 .LBE1608:
 .LBE1607:
 .LBE1606:
@@ -6563,15 +6645,15 @@ ebc_probe:
 .LBB1611:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC62
+	adrp	x1, .LC63
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 136
-	add	x1, x1, :lo12:.LC62
+	add	x1, x1, :lo12:.LC63
 	bl	of_property_read_variable_u32_array
-.LVL555:
+.LVL565:
 	.loc 14 501 0
-	tbnz	w0, #31, .L612
+	tbnz	w0, #31, .L625
 .LBE1611:
 .LBE1610:
 .LBE1609:
@@ -6580,15 +6662,15 @@ ebc_probe:
 .LBB1614:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC63
+	adrp	x1, .LC64
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 140
-	add	x1, x1, :lo12:.LC63
+	add	x1, x1, :lo12:.LC64
 	bl	of_property_read_variable_u32_array
-.LVL556:
+.LVL566:
 	.loc 14 501 0
-	tbnz	w0, #31, .L612
+	tbnz	w0, #31, .L625
 .LBE1614:
 .LBE1613:
 .LBE1612:
@@ -6597,15 +6679,15 @@ ebc_probe:
 .LBB1617:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC64
+	adrp	x1, .LC65
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 144
-	add	x1, x1, :lo12:.LC64
+	add	x1, x1, :lo12:.LC65
 	bl	of_property_read_variable_u32_array
-.LVL557:
+.LVL567:
 	.loc 14 501 0
-	tbnz	w0, #31, .L612
+	tbnz	w0, #31, .L625
 .LBE1617:
 .LBE1616:
 .LBE1615:
@@ -6614,15 +6696,15 @@ ebc_probe:
 .LBB1620:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC65
+	adrp	x1, .LC66
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 148
-	add	x1, x1, :lo12:.LC65
+	add	x1, x1, :lo12:.LC66
 	bl	of_property_read_variable_u32_array
-.LVL558:
+.LVL568:
 	.loc 14 501 0
-	tbnz	w0, #31, .L612
+	tbnz	w0, #31, .L625
 .LBE1620:
 .LBE1619:
 .LBE1618:
@@ -6631,15 +6713,15 @@ ebc_probe:
 .LBB1623:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC66
+	adrp	x1, .LC67
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 152
-	add	x1, x1, :lo12:.LC66
+	add	x1, x1, :lo12:.LC67
 	bl	of_property_read_variable_u32_array
-.LVL559:
+.LVL569:
 	.loc 14 501 0
-	tbnz	w0, #31, .L612
+	tbnz	w0, #31, .L625
 .LBE1623:
 .LBE1622:
 .LBE1621:
@@ -6648,15 +6730,15 @@ ebc_probe:
 .LBB1626:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC67
+	adrp	x1, .LC68
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 156
-	add	x1, x1, :lo12:.LC67
+	add	x1, x1, :lo12:.LC68
 	bl	of_property_read_variable_u32_array
-.LVL560:
+.LVL570:
 	.loc 14 501 0
-	tbnz	w0, #31, .L612
+	tbnz	w0, #31, .L625
 .LBE1626:
 .LBE1625:
 .LBE1624:
@@ -6665,15 +6747,15 @@ ebc_probe:
 .LBB1629:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC68
+	adrp	x1, .LC69
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 160
-	add	x1, x1, :lo12:.LC68
+	add	x1, x1, :lo12:.LC69
 	bl	of_property_read_variable_u32_array
-.LVL561:
+.LVL571:
 	.loc 14 501 0
-	tbnz	w0, #31, .L612
+	tbnz	w0, #31, .L625
 .LBE1629:
 .LBE1628:
 .LBE1627:
@@ -6682,15 +6764,15 @@ ebc_probe:
 .LBB1632:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC69
+	adrp	x1, .LC70
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 164
-	add	x1, x1, :lo12:.LC69
+	add	x1, x1, :lo12:.LC70
 	bl	of_property_read_variable_u32_array
-.LVL562:
+.LVL572:
 	.loc 14 501 0
-	tbnz	w0, #31, .L612
+	tbnz	w0, #31, .L625
 .LBE1632:
 .LBE1631:
 .LBE1630:
@@ -6699,15 +6781,15 @@ ebc_probe:
 .LBB1635:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC70
+	adrp	x1, .LC71
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 168
-	add	x1, x1, :lo12:.LC70
+	add	x1, x1, :lo12:.LC71
 	bl	of_property_read_variable_u32_array
-.LVL563:
+.LVL573:
 	.loc 14 501 0
-	tbnz	w0, #31, .L612
+	tbnz	w0, #31, .L625
 .LBE1635:
 .LBE1634:
 .LBE1633:
@@ -6716,154 +6798,154 @@ ebc_probe:
 .LBB1638:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC71
+	adrp	x1, .LC72
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 172
-	add	x1, x1, :lo12:.LC71
+	add	x1, x1, :lo12:.LC72
 	bl	of_property_read_variable_u32_array
-.LVL564:
+.LVL574:
 	.loc 14 501 0
-	tbz	w0, #31, .L638
+	tbz	w0, #31, .L651
 .LBE1638:
 .LBE1637:
 .LBE1636:
-	.loc 1 1739 0
+	.loc 1 1780 0
 	str	wzr, [x21, 148]
-.L638:
+.L651:
 .LBB1639:
 .LBB1640:
 .LBB1641:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC34
+	adrp	x1, .LC35
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 176
-	add	x1, x1, :lo12:.LC34
+	add	x1, x1, :lo12:.LC35
 	bl	of_property_read_variable_u32_array
-.LVL565:
+.LVL575:
 	.loc 14 501 0
-	tbz	w0, #31, .L639
+	tbz	w0, #31, .L652
 .LBE1641:
 .LBE1640:
 .LBE1639:
-	.loc 1 1742 0
+	.loc 1 1783 0
 	str	wzr, [x21, 152]
-.L639:
+.L652:
 .LBB1642:
 .LBB1643:
 .LBB1644:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC35
+	adrp	x1, .LC36
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 180
-	add	x1, x1, :lo12:.LC35
+	add	x1, x1, :lo12:.LC36
 	bl	of_property_read_variable_u32_array
-.LVL566:
+.LVL576:
 	.loc 14 501 0
-	tbz	w0, #31, .L640
+	tbz	w0, #31, .L653
 .LBE1644:
 .LBE1643:
 .LBE1642:
-	.loc 1 1745 0
+	.loc 1 1786 0
 	str	wzr, [x21, 156]
-.L640:
+.L653:
 .LBB1645:
 .LBB1646:
 .LBB1647:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC36
+	adrp	x1, .LC37
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 116
-	add	x1, x1, :lo12:.LC36
+	add	x1, x1, :lo12:.LC37
 	bl	of_property_read_variable_u32_array
-.LVL567:
+.LVL577:
 	.loc 14 501 0
-	tbz	w0, #31, .L641
+	tbz	w0, #31, .L654
 .LBE1647:
 .LBE1646:
 .LBE1645:
-	.loc 1 1748 0
+	.loc 1 1789 0
 	str	wzr, [x21, 92]
-.L641:
+.L654:
 .LBB1648:
 .LBB1649:
 .LBB1650:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
-	adrp	x1, .LC37
+	adrp	x1, .LC38
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x20, 120
-	add	x1, x1, :lo12:.LC37
+	add	x1, x1, :lo12:.LC38
 	bl	of_property_read_variable_u32_array
-.LVL568:
+.LVL578:
 	.loc 14 501 0
-	tbz	w0, #31, .L642
+	tbz	w0, #31, .L655
 .LBE1650:
 .LBE1649:
 .LBE1648:
-	.loc 1 1751 0
+	.loc 1 1792 0
 	str	wzr, [x21, 96]
-.L642:
+.L655:
 .LBE1653:
 .LBE1656:
-	.loc 1 2485 0
+	.loc 1 2526 0
 	ldr	w0, [x21, 88]
 .LBB1657:
 .LBB1658:
-	.loc 1 2200 0
+	.loc 1 2241 0
 	mov	w2, 0
 .LBE1658:
 .LBE1657:
-	.loc 1 2485 0
+	.loc 1 2526 0
 	str	w0, [x19, 68]
-	.loc 1 2486 0
+	.loc 1 2527 0
 	ldr	w1, [x21, 84]
 	str	w1, [x19, 72]
-	.loc 1 2489 0
+	.loc 1 2530 0
 	tst	x1, 15
-	.loc 1 2487 0
+	.loc 1 2528 0
 	mul	w0, w0, w1
-	.loc 1 2489 0
+	.loc 1 2530 0
 	cset	w1, eq
 	str	w1, [x19, 88]
 .LBB1682:
 .LBB1677:
-	.loc 1 2200 0
-	adrp	x1, .LC38
-	add	x1, x1, :lo12:.LC38
+	.loc 1 2241 0
+	adrp	x1, .LC39
+	add	x1, x1, :lo12:.LC39
 .LBE1677:
 .LBE1682:
-	.loc 1 2487 0
+	.loc 1 2528 0
 	lsr	w3, w0, 1
-	.loc 1 2488 0
+	.loc 1 2529 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x19, 20]
 .LBB1683:
 .LBB1678:
-	.loc 1 2191 0
+	.loc 1 2232 0
 	ldr	x26, [x20]
-.LVL569:
-	.loc 1 2200 0
+.LVL579:
+	.loc 1 2241 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL570:
-	.loc 1 2201 0
-	cbz	x0, .L649
-	.loc 1 2204 0
+.LVL580:
+	.loc 1 2242 0
+	cbz	x0, .L662
+	.loc 1 2245 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL571:
+.LVL581:
 	mov	w25, w0
-	.loc 1 2206 0
-	cbnz	w0, .L697
+	.loc 1 2247 0
+	cbnz	w0, .L710
 .LBB1659:
 .LBB1660:
 	.file 15 "./include/linux/ioport.h"
@@ -6871,9 +6953,9 @@ ebc_probe:
 	ldp	x1, x2, [x29, 104]
 .LBE1660:
 .LBE1659:
-	.loc 1 2211 0
+	.loc 1 2252 0
 	str	x1, [x20, 184]
-	.loc 1 2214 0
+	.loc 1 2255 0
 	mov	x3, 1
 	mov	x0, x26
 .LBB1662:
@@ -6883,28 +6965,28 @@ ebc_probe:
 	sub	x2, x2, x1
 .LBE1661:
 .LBE1662:
-	.loc 1 2212 0
+	.loc 1 2253 0
 	str	w2, [x19, 16]
-	.loc 1 2214 0
+	.loc 1 2255 0
 	sxtw	x2, w2
 	bl	devm_memremap
-.LVL572:
+.LVL582:
 	str	x0, [x19, 8]
-	.loc 1 2216 0
-	cbz	x0, .L620
-	.loc 1 2224 0
+	.loc 1 2257 0
+	cbz	x0, .L633
+	.loc 1 2265 0
 	mov	x1, x0
 	ldr	w2, [x19, 16]
 	ldr	x0, [x20, 184]
 	mov	w4, 4
 	mov	w3, 2097152
 	bl	ebc_buf_init
-.LVL573:
-	.loc 1 2225 0
-	cbnz	w0, .L620
-	.loc 1 2230 0
+.LVL583:
+	.loc 1 2266 0
+	cbnz	w0, .L633
+	.loc 1 2271 0
 	ldr	x0, [x19, 8]
-	.loc 1 2231 0
+	.loc 1 2272 0
 	mov	x5, 1048576
 	str	x5, [x21, 40]
 .LBB1663:
@@ -6913,13 +6995,13 @@ ebc_probe:
 	mov	w2, 32960
 .LBE1664:
 .LBE1663:
-	.loc 1 2230 0
+	.loc 1 2271 0
 	add	x6, x0, 10485760
 	str	x6, [x21, 24]
 	add	x4, x0, 11534336
-	.loc 1 2236 0
+	.loc 1 2277 0
 	add	x1, x0, 12582912
-	.loc 1 2232 0
+	.loc 1 2273 0
 	ldr	x3, [x20, 184]
 .LBB1668:
 .LBB1665:
@@ -6928,18 +7010,18 @@ ebc_probe:
 	mov	x0, x26
 .LBE1665:
 .LBE1668:
-	.loc 1 2232 0
+	.loc 1 2273 0
 	add	x7, x3, 10485760
 	str	x7, [x21, 32]
-	.loc 1 2233 0
+	.loc 1 2274 0
 	str	x6, [x19, 184]
-	.loc 1 2232 0
+	.loc 1 2273 0
 	add	x3, x3, 11534336
-	.loc 1 2231 0
+	.loc 1 2272 0
 	str	x5, [x21, 64]
-	.loc 1 2232 0
+	.loc 1 2273 0
 	stp	x4, x3, [x21, 48]
-	.loc 1 2236 0
+	.loc 1 2277 0
 	str	x1, [x19, 128]
 .LBB1669:
 .LBB1666:
@@ -6947,19 +7029,19 @@ ebc_probe:
 	ldrsw	x1, [x19, 20]
 .LBE1666:
 .LBE1669:
-	.loc 1 2233 0
+	.loc 1 2274 0
 	str	x4, [x19, 192]
 .LBB1670:
 .LBB1667:
 	.loc 2 711 0
 	bl	devm_kmalloc
-.LVL574:
+.LVL584:
 .LBE1667:
 .LBE1670:
-	.loc 1 2239 0
+	.loc 1 2280 0
 	str	x0, [x19, 144]
-	.loc 1 2240 0
-	cbz	x0, .L620
+	.loc 1 2281 0
+	cbz	x0, .L633
 .LBB1671:
 .LBB1672:
 	.loc 2 711 0
@@ -6968,13 +7050,13 @@ ebc_probe:
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL575:
+.LVL585:
 .LBE1672:
 .LBE1671:
-	.loc 1 2242 0
+	.loc 1 2283 0
 	str	x0, [x19, 152]
-	.loc 1 2243 0
-	cbz	x0, .L620
+	.loc 1 2284 0
+	cbz	x0, .L633
 .LBB1673:
 .LBB1674:
 	.loc 2 711 0
@@ -6983,14 +7065,14 @@ ebc_probe:
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL576:
+.LVL586:
 .LBE1674:
 .LBE1673:
-	.loc 1 2245 0
+	.loc 1 2286 0
 	str	x0, [x19, 160]
-	.loc 1 2246 0
-	cbz	x0, .L620
-	.loc 1 2253 0
+	.loc 1 2287 0
+	cbz	x0, .L633
+	.loc 1 2294 0
 	ldp	w1, w0, [x21, 84]
 .LBB1675:
 .LBB1676:
@@ -7000,140 +7082,140 @@ ebc_probe:
 	mul	w1, w1, w0
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL577:
+.LVL587:
 .LBE1676:
 .LBE1675:
-	.loc 1 2253 0
+	.loc 1 2294 0
 	str	x0, [x19, 168]
-	.loc 1 2254 0
-	cbz	x0, .L620
-	.loc 1 2256 0
+	.loc 1 2295 0
+	cbz	x0, .L633
+	.loc 1 2297 0
 	ldp	w2, w1, [x21, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
-.LVL578:
-	.loc 1 2257 0
+.LVL588:
+	.loc 1 2298 0
 	ldrsw	x2, [x19, 20]
 	mov	w1, 255
 	ldr	x0, [x19, 160]
 	bl	memset
-.LVL579:
+.LVL589:
 .LBE1678:
 .LBE1683:
 .LBB1684:
 .LBB1685:
-	.loc 1 2148 0
+	.loc 1 2189 0
 	ldr	x26, [x19, 104]
-.LVL580:
-	.loc 1 2154 0
-	adrp	x1, .LC40
+.LVL590:
+	.loc 1 2195 0
+	adrp	x1, .LC41
 	mov	w2, 0
-	add	x1, x1, :lo12:.LC40
+	add	x1, x1, :lo12:.LC41
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL581:
-	.loc 1 2155 0
-	cbz	x0, .L650
-	.loc 1 2158 0
+.LVL591:
+	.loc 1 2196 0
+	cbz	x0, .L663
+	.loc 1 2199 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL582:
+.LVL592:
 	mov	w25, w0
-	.loc 1 2160 0
-	cbz	w0, .L698
-.L621:
+	.loc 1 2201 0
+	cbz	w0, .L711
+.L634:
 .LBE1685:
 .LBE1684:
-	.loc 1 2501 0
-	adrp	x1, .LC73
+	.loc 1 2542 0
+	adrp	x1, .LC74
 	mov	x0, x22
-	add	x1, x1, :lo12:.LC73
+	add	x1, x1, :lo12:.LC74
 	bl	_dev_err
-.LVL583:
-	.loc 1 2502 0
-	b	.L598
-.LVL584:
+.LVL593:
+	.loc 1 2543 0
+	b	.L611
+.LVL594:
 	.p2align 3
-.L612:
-	.loc 1 2483 0
+.L625:
+	.loc 1 2524 0
 	mov	w25, -22
-	.loc 1 2482 0
-	adrp	x1, .LC79
+	.loc 1 2523 0
+	adrp	x1, .LC80
 	mov	w2, w25
-	add	x1, x1, :lo12:.LC79
+	add	x1, x1, :lo12:.LC80
 	mov	x0, x22
 	bl	_dev_err
-.LVL585:
-	.loc 1 2483 0
-	b	.L598
-.LVL586:
+.LVL595:
+	.loc 1 2524 0
+	b	.L611
+.LVL596:
 	.p2align 3
-.L694:
-	.loc 1 2456 0
-	adrp	x1, .LC30
+.L707:
+	.loc 1 2497 0
+	adrp	x1, .LC31
 	mov	x0, x22
-.LVL587:
-	add	x1, x1, :lo12:.LC30
-	.loc 1 2457 0
+.LVL597:
+	add	x1, x1, :lo12:.LC31
+	.loc 1 2498 0
 	mov	w25, -19
-	.loc 1 2456 0
+	.loc 1 2497 0
 	bl	_dev_err
-.LVL588:
-	.loc 1 2457 0
-	b	.L598
-.LVL589:
+.LVL598:
+	.loc 1 2498 0
+	b	.L611
+.LVL599:
 	.p2align 3
-.L610:
-	.loc 1 2468 0
-	adrp	x1, .LC32
+.L623:
+	.loc 1 2509 0
+	adrp	x1, .LC33
 	mov	x0, x22
-	add	x1, x1, :lo12:.LC32
-	.loc 1 2469 0
+	add	x1, x1, :lo12:.LC33
+	.loc 1 2510 0
 	mov	w25, -517
-	.loc 1 2468 0
+	.loc 1 2509 0
 	bl	_dev_err
-.LVL590:
-	.loc 1 2469 0
-	b	.L598
-.LVL591:
+.LVL600:
+	.loc 1 2510 0
+	b	.L611
+.LVL601:
 	.p2align 3
-.L697:
+.L710:
 .LBB1694:
 .LBB1679:
-	.loc 1 2207 0
-	adrp	x1, .LC39
+	.loc 1 2248 0
+	adrp	x1, .LC40
 	mov	x0, x26
-	add	x1, x1, :lo12:.LC39
+	add	x1, x1, :lo12:.LC40
 	bl	_dev_err
-.LVL592:
-.L617:
+.LVL602:
+.L630:
 .LBE1679:
 .LBE1694:
-	.loc 1 2494 0
-	adrp	x1, .LC72
+	.loc 1 2535 0
+	adrp	x1, .LC73
 	mov	x0, x22
-	add	x1, x1, :lo12:.LC72
+	add	x1, x1, :lo12:.LC73
 	bl	_dev_err
-.LVL593:
-	.loc 1 2495 0
-	b	.L598
-.LVL594:
-.L698:
+.LVL603:
+	.loc 1 2536 0
+	b	.L611
+.LVL604:
+.L711:
 .LBB1695:
 .LBB1690:
-	.loc 1 2169 0
+	.loc 1 2210 0
 	mov	x0, x26
 	mov	x3, 1
 .LBB1686:
 .LBB1687:
 	.loc 15 204 0
 	ldp	x1, x26, [x29, 104]
-.LVL595:
+.LVL605:
 .LBE1687:
 .LBE1686:
-	.loc 1 2166 0
+	.loc 1 2207 0
 	str	x1, [x19, 32]
 .LBB1689:
 .LBB1688:
@@ -7142,30 +7224,30 @@ ebc_probe:
 	sub	x26, x26, x1
 .LBE1688:
 .LBE1689:
-	.loc 1 2167 0
+	.loc 1 2208 0
 	str	w26, [x19, 40]
-	.loc 1 2169 0
+	.loc 1 2210 0
 	sxtw	x2, w26
 	bl	devm_memremap
-.LVL596:
+.LVL606:
 	str	x0, [x19, 208]
-	.loc 1 2171 0
-	cbz	x0, .L699
-	.loc 1 2176 0
+	.loc 1 2212 0
+	cbz	x0, .L712
+	.loc 1 2217 0
 	bl	epd_lut_from_mem_init
-.LVL597:
-	.loc 1 2177 0
-	tbnz	w0, #31, .L700
-.L623:
+.LVL607:
+	.loc 1 2218 0
+	tbnz	w0, #31, .L713
+.L636:
 .LBE1690:
 .LBE1695:
 .LBB1696:
 .LBB1697:
-	.loc 1 2266 0
+	.loc 1 2307 0
 	add	x0, x20, 752
 	mov	x1, 68719476704
 	str	x1, [x19, 560]
-	.loc 1 2270 0
+	.loc 1 2311 0
 	add	x24, x24, :lo12:.LANCHOR0
 .LBB1698:
 .LBB1699:
@@ -7179,8 +7261,8 @@ ebc_probe:
 .LBE1700:
 .LBE1699:
 .LBE1698:
-	.loc 1 2267 0
-	adrp	x5, .LC74
+	.loc 1 2308 0
+	adrp	x5, .LC75
 .LBB1704:
 .LBB1703:
 	.file 16 "./include/linux/list.h"
@@ -7188,56 +7270,56 @@ ebc_probe:
 	str	x0, [x0, 8]
 .LBE1703:
 .LBE1704:
-	.loc 1 2266 0
+	.loc 1 2307 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x19, 584]
-	.loc 1 2267 0
-	add	x5, x5, :lo12:.LC74
+	.loc 1 2308 0
+	add	x5, x5, :lo12:.LC75
 	mov	w1, 14
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 1
 	movk	w1, 0xa, lsl 16
-	.loc 1 2264 0
+	.loc 1 2305 0
 	mov	w26, 99
-	.loc 1 2267 0
-	adrp	x0, .LC75
-	.loc 1 2264 0
+	.loc 1 2308 0
+	adrp	x0, .LC76
+	.loc 1 2305 0
 	str	w26, [x29, 104]
-	.loc 1 2267 0
-	add	x0, x0, :lo12:.LC75
+	.loc 1 2308 0
+	add	x0, x0, :lo12:.LC76
 	bl	__alloc_workqueue_key
-.LVL598:
+.LVL608:
 	str	x0, [x19, 608]
-	.loc 1 2270 0
-	adrp	x3, .LC76
+	.loc 1 2311 0
+	adrp	x3, .LC77
 	mov	w2, -1
-	add	x3, x3, :lo12:.LC76
+	add	x3, x3, :lo12:.LC77
 	mov	x1, x19
 	adrp	x0, ebc_auto_tast_function
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
-.LVL599:
+.LVL609:
 	str	x0, [x24, 8]
-	.loc 1 2271 0
+	.loc 1 2312 0
 	cmn	x0, #4096
-	bhi	.L701
-	.loc 1 2275 0
+	bhi	.L714
+	.loc 1 2316 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
-.LVL600:
-	.loc 1 2276 0
+.LVL610:
+	.loc 1 2317 0
 	ldr	x2, [x24, 8]
 .LBB1705:
 .LBB1706:
 	.file 17 "./arch/arm64/include/asm/atomic_lse.h"
 	.loc 17 47 0
 	mov	w0, 1
-.LVL601:
+.LVL611:
 	add	x1, x2, 48
-.LVL602:
+.LVL612:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -7265,49 +7347,49 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL603:
+.LVL613:
 #NO_APP
 .LBE1706:
 .LBE1705:
 .LBB1707:
-	.loc 1 2279 0
-	adrp	x3, .LC45
+	.loc 1 2320 0
+	adrp	x3, .LC46
 	adrp	x0, ebc_thread
-.LVL604:
-	add	x3, x3, :lo12:.LC45
+.LVL614:
+	add	x3, x3, :lo12:.LC46
 	mov	w2, -1
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x19
 .LBE1707:
-	.loc 1 2278 0
+	.loc 1 2319 0
 	str	w26, [x29, 104]
 .LBB1708:
-	.loc 1 2279 0
+	.loc 1 2320 0
 	bl	kthread_create_on_node
-.LVL605:
+.LVL615:
 	mov	x24, x0
-.LVL606:
+.LVL616:
 	cmn	x0, #4096
-	bhi	.L625
+	bhi	.L638
 	bl	wake_up_process
-.LVL607:
+.LVL617:
 .LBE1708:
 	str	x24, [x19, 136]
-	.loc 1 2284 0
+	.loc 1 2325 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x24
 	bl	sched_setscheduler_nocheck
-.LVL608:
-	.loc 1 2285 0
+.LVL618:
+	.loc 1 2326 0
 	ldr	x2, [x19, 136]
 .LBB1709:
 .LBB1710:
 	.loc 17 47 0
 	mov	w0, 1
-.LVL609:
+.LVL619:
 	add	x1, x2, 48
-.LVL610:
+.LVL620:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -7335,7 +7417,7 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL611:
+.LVL621:
 #NO_APP
 .LBE1710:
 .LBE1709:
@@ -7343,43 +7425,43 @@ ebc_probe:
 .LBE1696:
 .LBB1713:
 .LBB1714:
-	.loc 1 2294 0
+	.loc 1 2335 0
 	mov	w0, -1
-.LVL612:
+.LVL622:
 	str	w0, [x19, 64]
 .LBB1715:
 .LBB1716:
 	.loc 4 39 0
 	add	x0, x20, 416
-.LVL613:
+.LVL623:
 .LBE1716:
 .LBE1715:
-	.loc 1 2298 0
+	.loc 1 2339 0
 	str	wzr, [x19, 44]
-	.loc 1 2297 0
+	.loc 1 2338 0
 	str	wzr, [x19, 96]
 .LBB1721:
 .LBB1717:
 	.loc 4 43 0
-	adrp	x1, .LC46
+	adrp	x1, .LC47
 .LBE1717:
 .LBE1721:
-	.loc 1 2293 0
+	.loc 1 2334 0
 	str	wzr, [x19, 200]
 .LBB1722:
 .LBB1718:
 	.loc 4 43 0
-	add	x1, x1, :lo12:.LC46
+	add	x1, x1, :lo12:.LC47
 .LBE1718:
 .LBE1722:
-	.loc 1 2295 0
+	.loc 1 2336 0
 	str	wzr, [x19, 616]
-	.loc 1 2305 0
+	.loc 1 2346 0
 	add	x24, x20, 632
-.LVL614:
-	.loc 1 2296 0
+.LVL624:
+	.loc 1 2337 0
 	str	wzr, [x19, 620]
-	.loc 1 2306 0
+	.loc 1 2347 0
 	adrp	x26, jiffies
 .LBB1723:
 .LBB1719:
@@ -7387,7 +7469,7 @@ ebc_probe:
 	stp	xzr, xzr, [x0]
 .LBE1719:
 .LBE1723:
-	.loc 1 2306 0
+	.loc 1 2347 0
 	mov	x27, 268435455
 .LBB1724:
 .LBB1720:
@@ -7408,12 +7490,12 @@ ebc_probe:
 	str	x1, [x20, 416]
 	.loc 4 45 0
 	bl	wakeup_source_add
-.LVL615:
+.LVL625:
 .LBE1720:
 .LBE1724:
-	.loc 1 2302 0
+	.loc 1 2343 0
 	str	wzr, [x19, 440]
-	.loc 1 2305 0
+	.loc 1 2346 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -7421,17 +7503,17 @@ ebc_probe:
 	adrp	x1, ebc_vdd_power_timeout
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
-.LVL616:
-	.loc 1 2306 0
+.LVL626:
+	.loc 1 2347 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
-	.loc 1 2309 0
+	.loc 1 2350 0
 	add	x24, x20, 688
-	.loc 1 2306 0
+	.loc 1 2347 0
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL617:
-	.loc 1 2309 0
+.LVL627:
+	.loc 1 2350 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -7439,158 +7521,158 @@ ebc_probe:
 	adrp	x1, ebc_frame_timeout
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
-.LVL618:
-	.loc 1 2310 0
+.LVL628:
+	.loc 1 2351 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL619:
+.LVL629:
 .LBE1714:
 .LBE1713:
 .LBB1725:
 .LBB1726:
-	.loc 1 2320 0
+	.loc 1 2361 0
 	adrp	x0, saved_command_line
-	adrp	x1, .LC47
-	.loc 1 2317 0
+	adrp	x1, .LC48
+	.loc 1 2358 0
 	stp	wzr, wzr, [x29, 100]
-.LVL620:
-	.loc 1 2320 0
-	add	x1, x1, :lo12:.LC47
+.LVL630:
+	.loc 1 2361 0
+	add	x1, x1, :lo12:.LC48
 	ldr	x24, [x0, #:lo12:saved_command_line]
 	mov	x0, x24
 	bl	strstr
-.LVL621:
-	.loc 1 2321 0
-	adrp	x1, .LC48
-	.loc 1 2320 0
+.LVL631:
+	.loc 1 2362 0
+	adrp	x1, .LC49
+	.loc 1 2361 0
 	mov	x26, x0
-.LVL622:
-	.loc 1 2321 0
-	add	x1, x1, :lo12:.LC48
+.LVL632:
+	.loc 1 2362 0
+	add	x1, x1, :lo12:.LC49
 	mov	x0, x24
 	bl	strstr
-.LVL623:
+.LVL633:
 	mov	x28, x0
-.LVL624:
-	.loc 1 2326 0
-	cbz	x26, .L626
-	.loc 1 2327 0
+.LVL634:
+	.loc 1 2367 0
+	cbz	x26, .L639
+	.loc 1 2368 0
 	add	x2, x29, 100
-	adrp	x1, .LC49
+	adrp	x1, .LC50
 	mov	x0, x26
-	add	x1, x1, :lo12:.LC49
+	add	x1, x1, :lo12:.LC50
 	bl	sscanf
-.LVL625:
-	.loc 1 2328 0
+.LVL635:
+	.loc 1 2369 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
-	bls	.L702
-.L626:
-	.loc 1 2340 0
+	bls	.L715
+.L639:
+	.loc 1 2381 0
 	mov	w24, 0
-.LVL626:
+.LVL636:
 	mov	x27, 0
-.LVL627:
-	.loc 1 2324 0
+.LVL637:
+	.loc 1 2365 0
 	mov	x26, 0
-.LVL628:
-	.loc 1 2340 0
-	cbz	x28, .L646
-.LVL629:
-.L645:
-	.loc 1 2341 0
+.LVL638:
+	.loc 1 2381 0
+	cbz	x28, .L659
+.LVL639:
+.L658:
+	.loc 1 2382 0
 	add	x2, x29, 104
 	mov	x0, x28
-	adrp	x1, .LC52
-	add	x1, x1, :lo12:.LC52
+	adrp	x1, .LC53
+	add	x1, x1, :lo12:.LC53
 	bl	sscanf
-.LVL630:
-	.loc 1 2319 0
+.LVL640:
+	.loc 1 2360 0
 	mov	w28, 0
-.LVL631:
-	.loc 1 2342 0
+.LVL641:
+	.loc 1 2383 0
 	ldr	w2, [x29, 104]
-	.loc 1 2324 0
+	.loc 1 2365 0
 	mov	x26, 0
-.LVL632:
-	.loc 1 2342 0
+.LVL642:
+	.loc 1 2383 0
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
-	bls	.L703
-.L630:
-	.loc 1 2354 0
-	cbnz	w24, .L629
-.LVL633:
-.L646:
-	.loc 1 2355 0
+	bls	.L716
+.L643:
+	.loc 1 2395 0
+	cbnz	w24, .L642
+.LVL643:
+.L659:
+	.loc 1 2396 0
 	ldr	x0, [x19, 104]
-	adrp	x1, .LC55
-	add	x1, x1, :lo12:.LC55
+	adrp	x1, .LC56
+	add	x1, x1, :lo12:.LC56
 	bl	_dev_info
-.LVL634:
-	.loc 1 2356 0
+.LVL644:
+	.loc 1 2397 0
 	ldr	x0, [x20, 16]
 	bl	ebc_pmic_verity_vcom
-.LVL635:
+.LVL645:
 .LBB1727:
 .LBB1728:
-	.loc 1 1659 0
+	.loc 1 1700 0
 	bl	ebc_empty_buf_get
-.LVL636:
+.LVL646:
 	mov	x24, x0
-.LVL637:
-	.loc 1 1660 0
+.LVL647:
+	.loc 1 1701 0
 	ldp	w2, w0, [x20, 108]
 	mov	w1, 255
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memset
-.LVL638:
-	.loc 1 1663 0
+.LVL648:
+	.loc 1 1704 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 1661 0
+	.loc 1 1702 0
 	mov	w0, 17
 	str	w0, [x24, 40]
-	.loc 1 1666 0
+	.loc 1 1707 0
 	mov	x0, x24
-	.loc 1 1664 0
+	.loc 1 1705 0
 	ldr	w1, [x20, 108]
 	str	w1, [x24, 56]
-	.loc 1 1665 0
+	.loc 1 1706 0
 	ldr	w1, [x20, 112]
 	str	w1, [x24, 60]
-	.loc 1 1666 0
+	.loc 1 1707 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL639:
-.L632:
+.LVL649:
+.L645:
 .LBE1728:
 .LBE1727:
-	.loc 1 2373 0
-	cbnz	w28, .L704
-.L634:
-	.loc 1 2386 0
+	.loc 1 2414 0
+	cbnz	w28, .L717
+.L647:
+	.loc 1 2427 0
 	ldr	w0, [x19, 96]
 	adrp	x21, .LANCHOR1
-	cbz	w0, .L705
-.L636:
-	.loc 1 2391 0
-	cbz	x27, .L637
-	.loc 1 2392 0
+	cbz	w0, .L718
+.L649:
+	.loc 1 2432 0
+	cbz	x27, .L650
+	.loc 1 2433 0
 	mov	x0, x27
 	bl	kfree
-.LVL640:
-.L637:
-	.loc 1 2393 0
-	cbz	x26, .L628
-	.loc 1 2394 0
+.LVL650:
+.L650:
+	.loc 1 2434 0
+	cbz	x26, .L641
+	.loc 1 2435 0
 	mov	x0, x26
 	bl	kfree
-.LVL641:
-.L628:
+.LVL651:
+.L641:
 .LBE1726:
 .LBE1725:
 .LBB1739:
@@ -7603,88 +7685,88 @@ ebc_probe:
 .LBE1739:
 .LBB1742:
 .LBB1743:
-	.loc 1 2131 0
+	.loc 1 2172 0
 	add	x21, x21, :lo12:.LANCHOR1
 	add	x0, x21, 224
-	.loc 1 2132 0
+	.loc 1 2173 0
 	add	x22, x21, 512
-	.loc 1 2131 0
+	.loc 1 2172 0
 	bl	misc_register
-.LVL642:
-	.loc 1 2132 0
+.LVL652:
+	.loc 1 2173 0
 	add	x0, x21, 400
 	bl	misc_register
-.LVL643:
-	.loc 1 2134 0
+.LVL653:
+	.loc 1 2175 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 480
 	bl	device_create_file
-.LVL644:
-	.loc 1 2135 0
+.LVL654:
+	.loc 1 2176 0
 	ldr	x0, [x20, 288]
 	mov	x1, x22
 	bl	device_create_file
-.LVL645:
-	.loc 1 2136 0
+.LVL655:
+	.loc 1 2177 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 544
 	bl	device_create_file
-.LVL646:
-	.loc 1 2137 0
+.LVL656:
+	.loc 1 2178 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 576
 	bl	device_create_file
-.LVL647:
-	.loc 1 2138 0
+.LVL657:
+	.loc 1 2179 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 608
 	bl	device_create_file
-.LVL648:
-	.loc 1 2139 0
+.LVL658:
+	.loc 1 2180 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 640
 	bl	device_create_file
-.LVL649:
-	.loc 1 2140 0
+.LVL659:
+	.loc 1 2181 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 672
 	bl	device_create_file
-.LVL650:
+.LVL660:
 .LBE1743:
 .LBE1742:
-	.loc 1 2523 0
+	.loc 1 2564 0
 	ldr	x0, [x19, 104]
-	adrp	x2, .LC16
-	adrp	x1, .LC56
-	add	x2, x2, :lo12:.LC16
-	add	x1, x1, :lo12:.LC56
+	adrp	x2, .LC17
+	adrp	x1, .LC57
+	add	x2, x2, :lo12:.LC17
+	add	x1, x1, :lo12:.LC57
 	bl	_dev_info
-.LVL651:
-	.loc 1 2525 0
-	b	.L598
-.LVL652:
-.L705:
+.LVL661:
+	.loc 1 2566 0
+	b	.L611
+.LVL662:
+.L718:
 .LBB1744:
 .LBB1735:
-	.loc 1 2387 0
+	.loc 1 2428 0
 	mov	w2, 1
 	str	w2, [x19, 96]
-	.loc 1 2388 0
+	.loc 1 2429 0
 	add	x0, x21, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL653:
-	b	.L636
-.LVL654:
-.L702:
-	.loc 1 2330 0
+.LVL663:
+	b	.L649
+.LVL664:
+.L715:
+	.loc 1 2371 0
 	ldr	x0, [x19, 104]
-	adrp	x1, .LC50
-	add	x1, x1, :lo12:.LC50
+	adrp	x1, .LC51
+	add	x1, x1, :lo12:.LC51
 	bl	_dev_info
-.LVL655:
-	.loc 1 2331 0
+.LVL665:
+	.loc 1 2372 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
 .LBB1729:
@@ -7696,77 +7778,77 @@ ebc_probe:
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL656:
+.LVL666:
 	mov	x27, x0
-.LVL657:
+.LVL667:
 .LBE1731:
 .LBE1730:
 .LBE1729:
-	.loc 1 2332 0
-	cbz	x0, .L706
-	.loc 1 2336 0
+	.loc 1 2373 0
+	cbz	x0, .L719
+	.loc 1 2377 0
 	ldp	w2, w1, [x21, 84]
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 100]
-.LVL658:
+.LVL668:
 	sub	x1, x1, x3
-.LVL659:
+.LVL669:
 	ldr	x3, [x19, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL660:
-	.loc 1 2340 0
-	cbnz	x28, .L707
-	.loc 1 2319 0
+.LVL670:
+	.loc 1 2381 0
+	cbnz	x28, .L720
+	.loc 1 2360 0
 	mov	w28, 0
-.LVL661:
-	.loc 1 2324 0
+.LVL671:
+	.loc 1 2365 0
 	mov	x26, 0
-.LVL662:
-.L629:
-	.loc 1 2361 0
+.LVL672:
+.L642:
+	.loc 1 2402 0
 	bl	ebc_empty_buf_get
-.LVL663:
+.LVL673:
 	mov	x24, x0
-.LVL664:
-	.loc 1 2362 0
-	cbz	x0, .L632
-	.loc 1 2363 0
+.LVL674:
+	.loc 1 2403 0
+	cbz	x0, .L645
+	.loc 1 2404 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL665:
-	.loc 1 2366 0
+.LVL675:
+	.loc 1 2407 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2364 0
+	.loc 1 2405 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2369 0
+	.loc 1 2410 0
 	mov	x0, x24
-	.loc 1 2367 0
+	.loc 1 2408 0
 	ldr	w1, [x21, 84]
 	str	w1, [x24, 56]
-	.loc 1 2368 0
+	.loc 1 2409 0
 	ldr	w1, [x21, 88]
 	str	w1, [x24, 60]
-	.loc 1 2369 0
+	.loc 1 2410 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL666:
-	b	.L632
-.LVL667:
-.L703:
-	.loc 1 2344 0
+.LVL676:
+	b	.L645
+.LVL677:
+.L716:
+	.loc 1 2385 0
 	ldr	x0, [x19, 104]
-	adrp	x1, .LC53
-	add	x1, x1, :lo12:.LC53
+	adrp	x1, .LC54
+	add	x1, x1, :lo12:.LC54
 	bl	_dev_info
-.LVL668:
-	.loc 1 2345 0
+.LVL678:
+	.loc 1 2386 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
 .LBB1732:
@@ -7777,275 +7859,275 @@ ebc_probe:
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL669:
+.LVL679:
 	mov	x26, x0
 .LBE1734:
 .LBE1733:
 .LBE1732:
-	.loc 1 2346 0
-	cbz	x0, .L708
-	.loc 1 2350 0
+	.loc 1 2387 0
+	cbz	x0, .L721
+	.loc 1 2391 0
 	ldp	w2, w1, [x21, 84]
-	.loc 1 2343 0
+	.loc 1 2384 0
 	mov	w28, 1
-	.loc 1 2350 0
+	.loc 1 2391 0
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
-.LVL670:
+.LVL680:
 	sub	x1, x1, x3
-.LVL671:
+.LVL681:
 	ldr	x3, [x19, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL672:
-	b	.L630
-.LVL673:
-.L602:
+.LVL682:
+	b	.L643
+.LVL683:
+.L615:
 .LBE1735:
 .LBE1744:
-	.loc 1 2431 0
+	.loc 1 2472 0
 	mov	w25, -517
-	b	.L598
-.LVL674:
-.L620:
+	b	.L611
+.LVL684:
+.L633:
 .LBB1745:
 .LBB1680:
-	.loc 1 2217 0
+	.loc 1 2258 0
 	mov	w25, -12
-	b	.L617
-.LVL675:
-.L704:
+	b	.L630
+.LVL685:
+.L717:
 .LBE1680:
 .LBE1745:
 .LBB1746:
 .LBB1736:
-	.loc 1 2374 0
+	.loc 1 2415 0
 	bl	ebc_empty_buf_get
-.LVL676:
+.LVL686:
 	mov	x24, x0
-.LVL677:
-	.loc 1 2375 0
-	cbz	x0, .L634
-	.loc 1 2376 0
+.LVL687:
+	.loc 1 2416 0
+	cbz	x0, .L647
+	.loc 1 2417 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL678:
-	.loc 1 2379 0
+.LVL688:
+	.loc 1 2420 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2377 0
+	.loc 1 2418 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2380 0
+	.loc 1 2421 0
 	ldr	w0, [x21, 84]
 	str	w0, [x24, 56]
-	.loc 1 2382 0
+	.loc 1 2423 0
 	mov	x0, x24
-	.loc 1 2381 0
+	.loc 1 2422 0
 	ldr	w1, [x21, 88]
 	str	w1, [x24, 60]
-	.loc 1 2382 0
+	.loc 1 2423 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL679:
-	b	.L634
-.LVL680:
-.L648:
+.LVL689:
+	b	.L647
+.LVL690:
+.L661:
 .LBE1736:
 .LBE1746:
-	.loc 1 2417 0
+	.loc 1 2458 0
 	mov	w25, -12
-	b	.L598
-.LVL681:
-.L603:
-	.loc 1 2441 0
-	adrp	x1, .LC28
+	b	.L611
+.LVL691:
+.L616:
+	.loc 1 2482 0
+	adrp	x1, .LC29
 	mov	x0, x22
-	add	x1, x1, :lo12:.LC28
-	.loc 1 2442 0
+	add	x1, x1, :lo12:.LC29
+	.loc 1 2483 0
 	mov	w25, -22
-	.loc 1 2441 0
+	.loc 1 2482 0
 	bl	_dev_err
-.LVL682:
-	.loc 1 2442 0
-	b	.L598
-.LVL683:
-.L700:
+.LVL692:
+	.loc 1 2483 0
+	b	.L611
+.LVL693:
+.L713:
 .LBB1747:
 .LBB1691:
-	.loc 1 2178 0
+	.loc 1 2219 0
 	ldr	x0, [x19, 104]
-	adrp	x1, .LC42
-	add	x1, x1, :lo12:.LC42
+	adrp	x1, .LC43
+	add	x1, x1, :lo12:.LC43
 	bl	_dev_err
-.LVL684:
-	.loc 1 2179 0
+.LVL694:
+	.loc 1 2220 0
 	ldr	x0, [x19, 104]
 	mov	w2, w26
 	ldr	x1, [x19, 208]
 	bl	epd_lut_from_file_init
-.LVL685:
-	.loc 1 2180 0
-	tbz	w0, #31, .L623
-	.loc 1 2181 0
+.LVL695:
+	.loc 1 2221 0
+	tbz	w0, #31, .L636
+	.loc 1 2222 0
 	ldr	x0, [x19, 104]
-	adrp	x1, .LC43
-	.loc 1 2182 0
+	adrp	x1, .LC44
+	.loc 1 2223 0
 	mov	w25, -1
-	.loc 1 2181 0
-	add	x1, x1, :lo12:.LC43
+	.loc 1 2222 0
+	add	x1, x1, :lo12:.LC44
 	bl	_dev_err
-.LVL686:
-	b	.L621
+.LVL696:
+	b	.L634
 	.p2align 3
-.L701:
+.L714:
 .LBE1691:
 .LBE1747:
 .LBB1748:
 .LBB1711:
-	.loc 1 2272 0
+	.loc 1 2313 0
 	ldr	x0, [x19, 104]
-	adrp	x1, .LC44
-	add	x1, x1, :lo12:.LC44
+	adrp	x1, .LC45
+	add	x1, x1, :lo12:.LC45
 	bl	_dev_err
-.LVL687:
-.L624:
+.LVL697:
+.L637:
 .LBE1711:
 .LBE1748:
-	.loc 1 2508 0
-	adrp	x1, .LC78
+	.loc 1 2549 0
+	adrp	x1, .LC79
 	mov	x0, x22
-	add	x1, x1, :lo12:.LC78
-	.loc 1 2509 0
+	add	x1, x1, :lo12:.LC79
+	.loc 1 2550 0
 	mov	w25, -1
-	.loc 1 2508 0
+	.loc 1 2549 0
 	bl	_dev_err
-.LVL688:
-	.loc 1 2509 0
-	b	.L598
-.LVL689:
-.L625:
+.LVL698:
+	.loc 1 2550 0
+	b	.L611
+.LVL699:
+.L638:
 .LBB1749:
 .LBB1712:
-	.loc 1 2281 0
+	.loc 1 2322 0
 	ldr	x0, [x19, 104]
-.LVL690:
-	adrp	x1, .LC77
-	.loc 1 2279 0
+.LVL700:
+	adrp	x1, .LC78
+	.loc 1 2320 0
 	str	x24, [x19, 136]
-	.loc 1 2281 0
-	add	x1, x1, :lo12:.LC77
+	.loc 1 2322 0
+	add	x1, x1, :lo12:.LC78
 	bl	_dev_err
-.LVL691:
-	b	.L624
-.LVL692:
-.L693:
+.LVL701:
+	b	.L637
+.LVL702:
+.L706:
 .LBE1712:
 .LBE1749:
-	.loc 1 2424 0
-	adrp	x1, .LC26
+	.loc 1 2465 0
+	adrp	x1, .LC27
 	mov	x0, x22
-	add	x1, x1, :lo12:.LC26
-	.loc 1 2425 0
+	add	x1, x1, :lo12:.LC27
+	.loc 1 2466 0
 	mov	w25, -19
-	.loc 1 2424 0
+	.loc 1 2465 0
 	bl	_dev_err
-.LVL693:
-	.loc 1 2425 0
-	b	.L598
-.LVL694:
-.L649:
+.LVL703:
+	.loc 1 2466 0
+	b	.L611
+.LVL704:
+.L662:
 .LBB1750:
 .LBB1681:
-	.loc 1 2202 0
+	.loc 1 2243 0
 	mov	w25, -19
-	b	.L617
-.LVL695:
-.L650:
+	b	.L630
+.LVL705:
+.L663:
 .LBE1681:
 .LBE1750:
 .LBB1751:
 .LBB1692:
-	.loc 1 2156 0
+	.loc 1 2197 0
 	mov	w25, -19
-	b	.L621
-.LVL696:
-.L708:
+	b	.L634
+.LVL706:
+.L721:
 .LBE1692:
 .LBE1751:
 .LBB1752:
 .LBB1737:
-	.loc 1 2347 0
+	.loc 1 2388 0
 	ldr	x0, [x19, 104]
-.LVL697:
-	adrp	x1, .LC54
+.LVL707:
+	adrp	x1, .LC55
 	adrp	x21, .LANCHOR1
-	add	x1, x1, :lo12:.LC54
+	add	x1, x1, :lo12:.LC55
 	bl	_dev_err
-.LVL698:
-	b	.L628
-.LVL699:
-.L699:
+.LVL708:
+	b	.L641
+.LVL709:
+.L712:
 .LBE1737:
 .LBE1752:
 .LBB1753:
 .LBB1693:
-	.loc 1 2172 0
+	.loc 1 2213 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
-	adrp	x1, .LC41
-	mov	w3, 2172
+	adrp	x1, .LC42
+	mov	w3, 2213
 	add	x2, x2, 32
-	add	x1, x1, :lo12:.LC41
-	.loc 1 2173 0
+	add	x1, x1, :lo12:.LC42
+	.loc 1 2214 0
 	mov	w25, -12
-	.loc 1 2172 0
+	.loc 1 2213 0
 	bl	_dev_err
-.LVL700:
-	b	.L621
-.LVL701:
-.L696:
+.LVL710:
+	b	.L634
+.LVL711:
+.L709:
 .LBE1693:
 .LBE1753:
-	.loc 1 2526 0
+	.loc 1 2567 0
 	bl	__stack_chk_fail
-.LVL702:
-.L707:
+.LVL712:
+.L720:
 .LBB1754:
 .LBB1738:
-	.loc 1 2329 0
+	.loc 1 2370 0
 	mov	w24, 1
-.LVL703:
-	b	.L645
-.LVL704:
-.L706:
-	.loc 1 2333 0
+.LVL713:
+	b	.L658
+.LVL714:
+.L719:
+	.loc 1 2374 0
 	ldr	x0, [x19, 104]
-.LVL705:
-	adrp	x1, .LC51
+.LVL715:
+	adrp	x1, .LC52
 	adrp	x21, .LANCHOR1
-	add	x1, x1, :lo12:.LC51
+	add	x1, x1, :lo12:.LC52
 	bl	_dev_err
-.LVL706:
-	b	.L628
+.LVL716:
+	b	.L641
 .LBE1738:
 .LBE1754:
 	.cfi_endproc
-.LFE2851:
+.LFE2852:
 	.size	ebc_probe, .-ebc_probe
 	.align	2
 	.p2align 3,,7
 	.type	ebc_power_set.constprop.11, %function
 ebc_power_set.constprop.11:
-.LFB2870:
+.LFB2871:
 	.loc 1 183 0
 	.cfi_startproc
-.LVL707:
+.LVL717:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -8061,9 +8143,9 @@ ebc_power_set.constprop.11:
 	mov	x19, x0
 	.loc 1 189 0
 	ldr	w0, [x20, 440]
-.LVL708:
-	cbz	w0, .L712
-.L710:
+.LVL718:
+	cbz	w0, .L725
+.L723:
 	.loc 1 193 0
 	mov	w1, 1
 	str	w1, [x20, 200]
@@ -8075,7 +8157,7 @@ ebc_power_set.constprop.11:
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL709:
+.LVL719:
 .LBE1756:
 .LBE1755:
 	.loc 1 195 0
@@ -8087,19 +8169,19 @@ ebc_power_set.constprop.11:
 	mov	x0, x2
 	ldr	x2, [x2, 48]
 	blr	x2
-.LVL710:
+.LVL720:
 .LBE1758:
 .LBE1757:
 	.loc 1 196 0
 	ldr	x0, [x19]
-	adrp	x1, .LC80
-	add	x1, x1, :lo12:.LC80
+	adrp	x1, .LC81
+	add	x1, x1, :lo12:.LC81
 	bl	_dev_info
-.LVL711:
+.LVL721:
 	.loc 1 211 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
-.LVL712:
+.LVL722:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -8108,9 +8190,9 @@ ebc_power_set.constprop.11:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL713:
+.LVL723:
 	.p2align 3
-.L712:
+.L725:
 	.cfi_restore_state
 	.loc 1 190 0
 	mov	w0, 1
@@ -8120,24 +8202,24 @@ ebc_power_set.constprop.11:
 	.loc 4 58 0
 	add	x0, x19, 416
 	bl	__pm_stay_awake
-.LVL714:
-	b	.L710
+.LVL724:
+	b	.L723
 .LBE1760:
 .LBE1759:
 	.cfi_endproc
-.LFE2870:
+.LFE2871:
 	.size	ebc_power_set.constprop.11, .-ebc_power_set.constprop.11
 	.align	2
 	.p2align 3,,7
 	.type	ebc_open, %function
 ebc_open:
-.LFB2869:
+.LFB2870:
 	.cfi_startproc
 	mov	w0, 0
 	str	xzr, [x1, 104]
 	ret
 	.cfi_endproc
-.LFE2869:
+.LFE2870:
 	.size	ebc_open, .-ebc_open
 	.align	2
 	.p2align 3,,7
@@ -8147,24 +8229,24 @@ refresh_new_image2:
 .LFB2808:
 	.loc 1 216 0
 	.cfi_startproc
-.LVL715:
+.LVL725:
 	.loc 1 223 0
 	ldp	w16, w5, [x4, 68]
-.LVL716:
+.LVL726:
 	cmp	w5, 0
 	add	w11, w5, 7
 	csel	w11, w11, w5, lt
-.LVL717:
+.LVL727:
 	.loc 1 225 0
 	cmp	w16, 0
 	.loc 1 223 0
 	asr	w11, w11, 3
-.LVL718:
+.LVL728:
 	.loc 1 225 0
-	ble	.L714
+	ble	.L727
 	sub	w14, w11, #1
 	mov	w15, 0
-.LVL719:
+.LVL729:
 	add	x14, x14, 1
 	.loc 1 270 0
 	mov	w13, 234881024
@@ -8172,92 +8254,92 @@ refresh_new_image2:
 	lsl	x14, x14, 2
 	.loc 1 276 0
 	mov	w12, -536870912
-.LVL720:
+.LVL730:
 	.p2align 2
-.L716:
+.L729:
 	.loc 1 226 0 discriminator 1
 	mov	x6, 0
 	cmp	w11, 0
-	bgt	.L737
-	b	.L734
-.LVL721:
+	bgt	.L750
+	b	.L747
+.LVL731:
 	.p2align 3
-.L717:
+.L730:
 	.loc 1 239 0
 	tst	x5, 65280
-	bne	.L718
+	bne	.L731
 	.loc 1 240 0
 	and	w10, w4, 240
 	cmp	w10, 224
-	beq	.L739
+	beq	.L752
 	.loc 1 243 0
 	orr	w7, w7, 240
-.L718:
+.L731:
 	.loc 1 245 0
 	tst	x5, 16711680
-	bne	.L720
+	bne	.L733
 	.loc 1 246 0
 	and	w10, w4, 3840
 	cmp	w10, 3584
-	beq	.L740
+	beq	.L753
 	.loc 1 249 0
 	orr	w7, w7, 3840
-.L720:
+.L733:
 	.loc 1 251 0
 	tst	x5, 4278190080
-	bne	.L722
+	bne	.L735
 	.loc 1 252 0
 	and	w10, w4, 61440
 	cmp	w10, 57344
-	beq	.L741
+	beq	.L754
 	.loc 1 255 0
 	orr	w7, w7, 61440
-.L722:
+.L735:
 	.loc 1 257 0
 	tst	x5, 1095216660480
-	bne	.L724
+	bne	.L737
 	.loc 1 258 0
 	and	w10, w4, 983040
 	cmp	w10, 917504
-	beq	.L742
+	beq	.L755
 	.loc 1 261 0
 	orr	w7, w7, 983040
-.L724:
+.L737:
 	.loc 1 263 0
 	tst	x5, 280375465082880
-	bne	.L726
+	bne	.L739
 	.loc 1 264 0
 	and	w10, w4, 15728640
 	cmp	w10, 14680064
-	beq	.L743
+	beq	.L756
 	.loc 1 267 0
 	orr	w7, w7, 15728640
-.L726:
+.L739:
 	.loc 1 269 0
 	tst	x5, 71776119061217280
-	bne	.L728
+	bne	.L741
 	.loc 1 270 0
 	and	w10, w4, 251658240
 	cmp	w10, w13
-	beq	.L744
+	beq	.L757
 	.loc 1 273 0
 	orr	w7, w7, 251658240
-.L728:
+.L741:
 	.loc 1 275 0
 	tst	x5, -72057594037927936
-	bne	.L730
+	bne	.L743
 	.loc 1 276 0
 	and	w5, w4, -268435456
-.LVL722:
+.LVL732:
 	cmp	w5, w12
-	beq	.L745
+	beq	.L758
 	.loc 1 279 0
 	orr	w7, w7, -268435456
-.LVL723:
-.L730:
+.LVL733:
+.L743:
 	.loc 1 283 0 discriminator 2
 	and	w4, w4, w9
-.LVL724:
+.LVL734:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
@@ -8266,54 +8348,54 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 226 0 discriminator 2
 	cmp	w11, w6
-	ble	.L746
-.LVL725:
-.L737:
+	ble	.L759
+.LVL735:
+.L750:
 	.loc 1 227 0
 	ldr	x5, [x3, x6, lsl 3]
 	.loc 1 231 0
 	mov	w7, 0
 	.loc 1 228 0
 	ldr	w4, [x1, x6, lsl 2]
-.LVL726:
+.LVL736:
 	.loc 1 229 0
 	ldr	w8, [x0, x6, lsl 2]
 	.loc 1 233 0
 	and	x10, x5, 255
 	.loc 1 230 0
 	ldr	w9, [x2, x6, lsl 2]
-.LVL727:
+.LVL737:
 	.loc 1 233 0
-	cbnz	x10, .L717
-.LVL728:
+	cbnz	x10, .L730
+.LVL738:
 	.loc 1 234 0
 	and	w10, w4, 15
 	.loc 1 237 0
 	mov	w7, 15
 	.loc 1 234 0
 	cmp	w10, 14
-	bne	.L717
+	bne	.L730
 	.loc 1 235 0
 	orr	w8, w8, w7
-.LVL729:
+.LVL739:
 	.loc 1 231 0
 	mov	w7, 0
-.LVL730:
-	b	.L717
+.LVL740:
+	b	.L730
 	.p2align 3
-.L744:
+.L757:
 	.loc 1 271 0
 	orr	w8, w8, 251658240
-	b	.L728
-.LVL731:
+	b	.L741
+.LVL741:
 	.p2align 3
-.L745:
+.L758:
 	.loc 1 277 0
 	orr	w8, w8, -268435456
-.LVL732:
+.LVL742:
 	.loc 1 283 0
 	and	w4, w4, w9
-.LVL733:
+.LVL743:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
@@ -8322,48 +8404,48 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 226 0
 	cmp	w11, w6
-	bgt	.L737
-.LVL734:
+	bgt	.L750
+.LVL744:
 	.p2align 2
-.L746:
+.L759:
 	add	x3, x3, x17
 	add	x1, x1, x14
 	add	x2, x2, x14
 	add	x0, x0, x14
-.LVL735:
-.L734:
+.LVL745:
+.L747:
 	.loc 1 225 0 discriminator 2
 	add	w15, w15, 1
 	cmp	w16, w15
-	bne	.L716
-.L714:
+	bne	.L729
+.L727:
 	ret
-.LVL736:
+.LVL746:
 	.p2align 3
-.L740:
+.L753:
 	.loc 1 247 0
 	orr	w8, w8, 3840
-	b	.L720
+	b	.L733
 	.p2align 3
-.L741:
+.L754:
 	.loc 1 253 0
 	orr	w8, w8, 61440
-	b	.L722
+	b	.L735
 	.p2align 3
-.L742:
+.L755:
 	.loc 1 259 0
 	orr	w8, w8, 983040
-	b	.L724
+	b	.L737
 	.p2align 3
-.L743:
+.L756:
 	.loc 1 265 0
 	orr	w8, w8, 15728640
-	b	.L726
+	b	.L739
 	.p2align 3
-.L739:
+.L752:
 	.loc 1 241 0
 	orr	w8, w8, 240
-	b	.L718
+	b	.L731
 	.cfi_endproc
 .LFE2808:
 	.size	refresh_new_image2, .-refresh_new_image2
@@ -8375,52 +8457,52 @@ refresh_new_image_auto:
 .LFB2809:
 	.loc 1 291 0
 	.cfi_startproc
-.LVL737:
+.LVL747:
 	.loc 1 298 0
 	ldp	w13, w4, [x3, 68]
 	cmp	w4, 0
 	add	w9, w4, 7
 	csel	w9, w9, w4, lt
-.LVL738:
+.LVL748:
 	.loc 1 300 0
 	cmp	w13, 0
 	.loc 1 298 0
 	asr	w9, w9, 3
-.LVL739:
+.LVL749:
 	.loc 1 300 0
-	ble	.L747
+	ble	.L760
 	sub	w12, w9, #1
 	mov	w11, 0
-.LVL740:
+.LVL750:
 	add	x12, x12, 1
 	.loc 1 308 0
 	mov	w10, 15
 	lsl	x14, x12, 3
 	lsl	x12, x12, 2
 	.p2align 2
-.L749:
+.L762:
 	.loc 1 301 0 discriminator 1
 	mov	x6, 0
 	cmp	w9, 0
-	ble	.L760
+	ble	.L773
 	.p2align 2
-.L762:
+.L775:
 	.loc 1 302 0
 	ldr	x4, [x2, x6, lsl 3]
-.LVL741:
+.LVL751:
 	.loc 1 304 0
 	ldr	w7, [x0, x6, lsl 2]
 	.loc 1 303 0
 	ldr	w3, [x1, x6, lsl 2]
-.LVL742:
+.LVL752:
 	.loc 1 307 0
 	and	x5, x4, 255
 	.loc 1 308 0
 	cmp	x5, 0
-.LVL743:
+.LVL753:
 	eor	w5, w3, w7
 	csel	w3, wzr, w10, ne
-.LVL744:
+.LVL754:
 	.loc 1 311 0
 	orr	w8, w3, 240
 	tst	x4, 65280
@@ -8448,10 +8530,10 @@ refresh_new_image_auto:
 	.loc 1 329 0
 	tst	x4, -72057594037927936
 	orr	w4, w3, -268435456
-.LVL745:
+.LVL755:
 	csel	w3, w4, w3, eq
 	and	w3, w5, w3
-.LVL746:
+.LVL756:
 	.loc 1 332 0
 	eor	w3, w3, w7
 	.loc 1 333 0
@@ -8459,17 +8541,17 @@ refresh_new_image_auto:
 	add	x6, x6, 1
 	.loc 1 301 0
 	cmp	w9, w6
-	bgt	.L762
+	bgt	.L775
 	add	x2, x2, x14
 	add	x1, x1, x12
 	add	x0, x0, x12
-.LVL747:
-.L760:
+.LVL757:
+.L773:
 	.loc 1 300 0 discriminator 2
 	add	w11, w11, 1
 	cmp	w13, w11
-	bne	.L749
-.L747:
+	bne	.L762
+.L760:
 	ret
 	.cfi_endproc
 .LFE2809:
@@ -8482,7 +8564,7 @@ new_buffer_refresh:
 .LFB2810:
 	.loc 1 339 0
 	.cfi_startproc
-.LVL748:
+.LVL758:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -8499,16 +8581,16 @@ new_buffer_refresh:
 	adrp	x20, .LANCHOR1
 	.loc 1 340 0
 	ldr	x19, [x1, #:lo12:.LANCHOR0]
-.LVL749:
+.LVL759:
 	.loc 1 343 0
 	add	x0, x20, :lo12:.LANCHOR1
-.LVL750:
+.LVL760:
 	add	x0, x0, 704
 	bl	down_write
-.LVL751:
+.LVL761:
 	.loc 1 341 0
 	add	x19, x19, 184
-.LVL752:
+.LVL762:
 	.loc 1 344 0
 	ldr	x0, [x19, 224]
 	ldr	w5, [x0, 40]
@@ -8517,22 +8599,22 @@ new_buffer_refresh:
 	.loc 1 346 0
 	cmp	w5, 0
 	ccmp	w1, 1, 0, ne
-	bls	.L768
+	bls	.L781
 	.loc 1 352 0
 	ldr	x1, [x0, 16]
 	mov	x4, x19
 	ldp	x2, x3, [x19, 160]
 	ldr	x0, [x19, 144]
 	bl	refresh_new_image2
-.LVL753:
+.LVL763:
 	.loc 1 357 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 704
 	bl	up_write
-.LVL754:
+.LVL764:
 	.loc 1 358 0
 	ldp	x19, x20, [sp, 16]
-.LVL755:
+.LVL765:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -8541,9 +8623,9 @@ new_buffer_refresh:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL756:
+.LVL766:
 	.p2align 3
-.L768:
+.L781:
 	.cfi_restore_state
 	.loc 1 347 0
 	ldr	x1, [x0, 16]
@@ -8551,15 +8633,15 @@ new_buffer_refresh:
 	ldr	x2, [x19, 168]
 	ldr	x0, [x19, 144]
 	bl	refresh_new_image_auto
-.LVL757:
+.LVL767:
 	.loc 1 357 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 704
 	bl	up_write
-.LVL758:
+.LVL768:
 	.loc 1 358 0
 	ldp	x19, x20, [sp, 16]
-.LVL759:
+.LVL769:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -8574,449 +8656,470 @@ new_buffer_refresh:
 	.p2align 3,,7
 	.type	ebc_thread, %function
 ebc_thread:
-.LFB2827:
-	.loc 1 1339 0
+.LFB2828:
+	.loc 1 1362 0
 	.cfi_startproc
-.LVL760:
+.LVL770:
 	stp	x29, x30, [sp, -224]!
 	.cfi_def_cfa_offset 224
 	.cfi_offset 29, -224
 	.cfi_offset 30, -216
-	.loc 1 1340 0
-	adrp	x1, .LANCHOR0
-	.loc 1 1339 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	stp	x19, x20, [sp, 16]
 	stp	x21, x22, [sp, 32]
-	.cfi_offset 19, -208
-	.cfi_offset 20, -200
 	.cfi_offset 21, -192
 	.cfi_offset 22, -184
-	adrp	x22, __stack_chk_guard
+	.loc 1 1363 0
+	adrp	x21, .LANCHOR0
+	.loc 1 1362 0
+	stp	x19, x20, [sp, 16]
+	adrp	x22, .LANCHOR1
 	stp	x23, x24, [sp, 48]
-	adrp	x21, .LANCHOR1
-	stp	x27, x28, [sp, 80]
-	add	x0, x22, :lo12:__stack_chk_guard
-.LVL761:
-	.loc 1 1340 0
-	ldr	x20, [x1, #:lo12:.LANCHOR0]
-.LVL762:
 .LBB1783:
 .LBB1784:
 .LBB1785:
-	.loc 1 1647 0
-	add	x21, x21, :lo12:.LANCHOR1
+	.loc 1 1688 0
+	add	x22, x22, :lo12:.LANCHOR1
 .LBE1785:
 .LBE1784:
 .LBE1783:
-	.loc 1 1339 0
-	stp	x25, x26, [sp, 64]
+	.loc 1 1362 0
+	stp	x27, x28, [sp, 80]
+	.cfi_offset 19, -208
+	.cfi_offset 20, -200
 	.cfi_offset 23, -176
 	.cfi_offset 24, -168
 	.cfi_offset 27, -144
 	.cfi_offset 28, -136
+	adrp	x23, __stack_chk_guard
+	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -160
 	.cfi_offset 26, -152
+	.loc 1 1362 0
+	add	x0, x23, :lo12:__stack_chk_guard
+.LVL771:
+	.loc 1 1363 0
+	ldr	x20, [x21, #:lo12:.LANCHOR0]
+.LVL772:
 .LBB1790:
 .LBB1788:
 .LBB1786:
-	.loc 1 1647 0
-	add	x19, x21, 304
+	.loc 1 1688 0
+	add	x19, x22, 304
 .LBE1786:
 .LBE1788:
 .LBE1790:
-	.loc 1 1341 0
-	add	x28, x20, 184
-	.loc 1 1344 0
-	mov	w23, 0
-.LVL763:
-	.loc 1 1339 0
+	.loc 1 1362 0
 	ldr	x1, [x0]
 	str	x1, [x29, 216]
 	mov	x1,0
-.LVL764:
+	.loc 1 1367 0
+	str	wzr, [x29, 108]
+	.loc 1 1364 0
+	add	x28, x20, 184
+.LVL773:
 	.p2align 2
-.L770:
-	.loc 1 1349 0
+.L783:
+	.loc 1 1372 0
 	ldr	w0, [x28, 624]
-	cbnz	w0, .L906
-.L771:
-	.loc 1 1355 0
+	cbnz	w0, .L929
+.L784:
+	.loc 1 1378 0
 	bl	ebc_dsp_buf_get
-.LVL765:
+.LVL774:
 	mov	x24, x0
-	.loc 1 1357 0
-	cbz	x0, .L773
-	.loc 1 1357 0 is_stmt 0 discriminator 1
-	ldr	x1, [x0, 8]
-	cbz	x1, .L773
-	.loc 1 1358 0 is_stmt 1
-	ldr	w1, [x0, 40]
-	cmp	w1, 20
-	beq	.L907
-	.loc 1 1362 0
-	ldr	x2, [x28, 616]
-	cbz	x2, .L776
-	.loc 1 1363 0
-	cmp	w1, 19
-	beq	.L908
-	.loc 1 1368 0
-	mov	w2, 18
-	tst	w1, w2
-	beq	.L899
-	.loc 1 1369 0
+	.loc 1 1380 0
+	cbz	x0, .L786
+	.loc 1 1380 0 is_stmt 0 discriminator 1
+	ldr	x0, [x0, 8]
+	cbz	x0, .L786
+	.loc 1 1382 0 is_stmt 1
+	add	x0, x21, :lo12:.LANCHOR0
+	ldr	w1, [x0, 16]
+	cbz	w1, .L787
+	.loc 1 1383 0
+	ldr	w1, [x0, 20]
+	add	w2, w1, 1
+	str	w2, [x0, 20]
+	cmp	w1, 5
+	ble	.L788
+	.loc 1 1384 0
+	str	wzr, [x0, 16]
+.L788:
+	.loc 1 1385 0
+	ldr	w1, [x28, 20]
+	ldr	x0, [x24, 16]
+	bl	check_black_percent
+.LVL775:
+	cbnz	w0, .L922
+.L787:
+	.loc 1 1393 0
+	ldr	w0, [x24, 40]
+	cmp	w0, 20
+	beq	.L930
+	.loc 1 1397 0
+	ldr	x1, [x28, 616]
+	cbz	x1, .L792
+	.loc 1 1398 0
+	cmp	w0, 19
+	beq	.L931
+	.loc 1 1407 0
+	mov	w1, 18
+	tst	w0, w1
+	beq	.L922
+	.loc 1 1408 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC82
-	add	x1, x1, :lo12:.LC82
+	adrp	x1, .LC83
+	add	x1, x1, :lo12:.LC83
 	bl	_dev_info
-.LVL766:
-.L775:
-	.loc 1 1402 0
+.LVL776:
+.L791:
+	.loc 1 1441 0
 	adrp	x25, jiffies
-.LVL767:
+.LVL777:
 	mov	x1, 402653184
 	add	x0, x20, 632
 	ldr	x2, [x25, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL768:
-	.loc 1 1404 0
+.LVL778:
+	.loc 1 1443 0
 	ldr	w0, [x28, 444]
-	cbz	w0, .L782
+	cbz	w0, .L798
 	ldr	x0, [x28, 216]
-.L783:
-	.loc 1 1407 0
+.L799:
+	.loc 1 1446 0
 	ldr	w2, [x0, 40]
 	ldr	w3, [x24, 40]
 	cmp	w3, w2
-	beq	.L784
-	.loc 1 1408 0
+	beq	.L800
+	.loc 1 1447 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC84
-	add	x1, x1, :lo12:.LC84
+	adrp	x1, .LC85
+	add	x1, x1, :lo12:.LC85
 	bl	_dev_info
-.LVL769:
-	.loc 1 1409 0
+.LVL779:
+	.loc 1 1448 0
 	ldr	w0, [x28, 44]
 	cmp	w0, 1
-	beq	.L909
-.L900:
+	beq	.L932
+.L923:
 	ldr	w2, [x24, 40]
-.L784:
-	.loc 1 1416 0
+.L800:
+	.loc 1 1455 0
 	cmp	w2, 13
-	bgt	.L791
+	bgt	.L807
 	cmp	w2, 12
-	bge	.L863
+	bge	.L880
 	cmp	w2, 6
-	bgt	.L793
+	bgt	.L809
 	cmp	w2, 2
-	bge	.L863
-	cbz	w2, .L794
+	bge	.L880
+	cbz	w2, .L810
 	cmp	w2, 1
-	bne	.L790
-	.loc 1 1418 0
+	bne	.L806
+	.loc 1 1457 0
 	ldr	w0, [x28, 628]
-	cbz	w0, .L797
-	.loc 1 1419 0
+	cbz	w0, .L813
+	.loc 1 1458 0
 	str	w2, [x28, 632]
-	.loc 1 1428 0
-	add	x0, x21, 704
+	.loc 1 1467 0
+	add	x0, x22, 704
 	bl	down_write
-.LVL770:
-	.loc 1 1429 0
+.LVL780:
+	.loc 1 1468 0
 	str	x24, [x28, 224]
-	.loc 1 1431 0
+	.loc 1 1470 0
 	ldr	x2, [x28, 216]
 	ldr	w0, [x2, 40]
-	.loc 1 1434 0
+	.loc 1 1473 0
 	cmp	w0, 1
-	.loc 1 1433 0
+	.loc 1 1472 0
 	sub	w1, w0, #22
-	.loc 1 1434 0
+	.loc 1 1473 0
 	ccmp	w1, 1, 0, hi
-	bls	.L910
-	.loc 1 1435 0
+	bls	.L933
+	.loc 1 1474 0
 	ldr	x1, [x2, 16]
 	ldr	x0, [x28, 144]
 	ldrsw	x2, [x28, 20]
 	bl	memcpy
-.LVL771:
-	.loc 1 1436 0
+.LVL781:
+	.loc 1 1475 0
 	ldr	x0, [x28, 216]
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x28, 152]
 	bl	memcpy
-.LVL772:
-	.loc 1 1437 0
+.LVL782:
+	.loc 1 1476 0
 	ldr	x0, [x28, 216]
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x28, 160]
 	bl	memcpy
-.LVL773:
+.LVL783:
 	ldr	x0, [x28, 224]
-.L800:
+.L816:
 .LBB1791:
 .LBB1792:
 	.loc 1 379 0
-	ldp	w3, w15, [x0, 48]
+	ldp	w3, w16, [x0, 48]
 	.loc 1 438 0
-	mov	w14, 234881024
+	mov	w15, 234881024
 	.loc 1 380 0
-	ldp	w2, w18, [x0, 56]
+	ldp	w2, w25, [x0, 56]
 	.loc 1 377 0
 	cmp	w3, 0
 	.loc 1 382 0
 	ldr	w1, [x20, 256]
 	.loc 1 377 0
-	add	w16, w3, 7
-	csel	w16, w16, w3, lt
+	add	w17, w3, 7
+	csel	w17, w17, w3, lt
 	.loc 1 378 0
-	add	w9, w2, 7
+	add	w10, w2, 7
 	cmp	w2, 0
 	.loc 1 382 0
-	add	w17, w1, 7
+	add	w18, w1, 7
 	.loc 1 378 0
-	csel	w9, w9, w2, lt
+	csel	w10, w10, w2, lt
 	.loc 1 382 0
 	cmp	w1, 0
-	csel	w17, w17, w1, lt
+	csel	w18, w18, w1, lt
 	.loc 1 378 0
-	asr	w9, w9, 3
+	asr	w10, w10, 3
 	.loc 1 382 0
-	asr	w17, w17, 3
-.LVL774:
+	asr	w18, w18, 3
+.LVL784:
 	.loc 1 378 0
-	add	w9, w9, 1
-.LVL775:
+	add	w10, w10, 1
+.LVL785:
 	ldr	w1, [x20, 252]
 	.loc 1 385 0
-	cmp	w9, w17
+	cmp	w10, w18
 .LBE1792:
 .LBE1791:
-	.loc 1 1444 0
-	ldr	x12, [x0, 16]
+	.loc 1 1483 0
+	ldr	x13, [x0, 16]
 .LBB1797:
 .LBB1793:
 	.loc 1 385 0
-	sub	w0, w17, #1
-	csel	w9, w0, w9, ge
-.LVL776:
+	sub	w0, w18, #1
+	csel	w10, w0, w10, ge
+.LVL786:
 	.loc 1 387 0
-	cmp	w1, w18
+	cmp	w1, w25
 	sub	w1, w1, #1
 	.loc 1 444 0
-	mov	w13, -536870912
+	mov	w14, -536870912
 	.loc 1 387 0
-	csel	w18, w1, w18, le
+	csel	w25, w1, w25, le
 	.loc 1 377 0
-	asr	w16, w16, 3
-.LVL777:
-	mul	w5, w15, w17
+	asr	w17, w17, 3
+.LVL787:
+	mul	w7, w16, w18
 	.loc 1 389 0
-	cmp	w15, w18
+	cmp	w16, w25
 .LBE1793:
 .LBE1797:
-	.loc 1 1444 0
-	ldr	x8, [x28, 144]
-	.loc 1 1445 0
-	ldp	x11, x10, [x28, 160]
+	.loc 1 1483 0
+	ldr	x9, [x28, 144]
+	.loc 1 1484 0
+	ldp	x12, x11, [x28, 160]
 .LBB1798:
 .LBB1794:
 	.loc 1 389 0
-	bgt	.L808
-.LVL778:
+	bgt	.L824
+.LVL788:
 	.p2align 2
-.L882:
+.L903:
 	.loc 1 394 0
-	mov	w4, w16
-	cmp	w16, w9
-	ble	.L883
-	b	.L825
-.LVL779:
+	mov	w5, w17
+	cmp	w17, w10
+	ble	.L904
+	b	.L841
+.LVL789:
 	.p2align 3
-.L809:
+.L825:
 	.loc 1 407 0
 	tst	x2, 65280
-	bne	.L810
+	bne	.L826
 	.loc 1 408 0
-	and	w27, w1, 240
+	and	w27, w0, 240
 	cmp	w27, 224
-	beq	.L911
+	beq	.L934
 	.loc 1 411 0
-	orr	w25, w25, 240
-.L810:
+	orr	w3, w3, 240
+.L826:
 	.loc 1 413 0
 	tst	x2, 16711680
-	bne	.L812
+	bne	.L828
 	.loc 1 414 0
-	and	w27, w1, 3840
+	and	w27, w0, 3840
 	cmp	w27, 3584
-	beq	.L912
+	beq	.L935
 	.loc 1 417 0
-	orr	w25, w25, 3840
-.L812:
+	orr	w3, w3, 3840
+.L828:
 	.loc 1 419 0
 	tst	x2, 4278190080
-	bne	.L814
+	bne	.L830
 	.loc 1 420 0
-	and	w27, w1, 61440
+	and	w27, w0, 61440
 	cmp	w27, 57344
-	beq	.L913
+	beq	.L936
 	.loc 1 423 0
-	orr	w25, w25, 61440
-.L814:
+	orr	w3, w3, 61440
+.L830:
 	.loc 1 425 0
 	tst	x2, 1095216660480
-	bne	.L816
+	bne	.L832
 	.loc 1 426 0
-	and	w27, w1, 983040
+	and	w27, w0, 983040
 	cmp	w27, 917504
-	beq	.L914
+	beq	.L937
 	.loc 1 429 0
-	orr	w25, w25, 983040
-.L816:
+	orr	w3, w3, 983040
+.L832:
 	.loc 1 431 0
 	tst	x2, 280375465082880
-	bne	.L818
+	bne	.L834
 	.loc 1 432 0
-	and	w27, w1, 15728640
+	and	w27, w0, 15728640
 	cmp	w27, 14680064
-	beq	.L915
+	beq	.L938
 	.loc 1 435 0
-	orr	w25, w25, 15728640
-.L818:
+	orr	w3, w3, 15728640
+.L834:
 	.loc 1 437 0
 	tst	x2, 71776119061217280
-	bne	.L820
+	bne	.L836
 	.loc 1 438 0
-	and	w27, w1, 251658240
-	cmp	w27, w14
-	beq	.L916
+	and	w27, w0, 251658240
+	cmp	w27, w15
+	beq	.L939
 	.loc 1 441 0
-	orr	w25, w25, 251658240
-.L820:
+	orr	w3, w3, 251658240
+.L836:
 	.loc 1 443 0
 	tst	x2, -72057594037927936
-	bne	.L822
+	bne	.L838
 	.loc 1 444 0
-	and	w2, w1, -268435456
-.LVL780:
-	cmp	w2, w13
-	beq	.L917
+	and	w2, w0, -268435456
+.LVL790:
+	cmp	w2, w14
+	beq	.L940
 	.loc 1 447 0
-	orr	w25, w25, -268435456
-.LVL781:
-.L822:
+	orr	w3, w3, -268435456
+.LVL791:
+.L838:
 	.loc 1 450 0
-	and	w1, w1, w26
-.LVL782:
+	and	w0, w0, w26
+.LVL792:
 	.loc 1 394 0
-	add	w4, w4, 1
-	eor	w1, w1, w3
-	cmp	w4, w9
-	and	w1, w1, w25
+	add	w5, w5, 1
+	eor	w0, w0, w4
+	cmp	w5, w10
+	and	w0, w0, w3
 	.loc 1 450 0
-	eor	w1, w3, w1
+	eor	w0, w4, w0
 	.loc 1 451 0
-	str	w1, [x8, x0]
+	str	w0, [x9, x1]
 	.loc 1 394 0
-	bgt	.L825
-.LVL783:
-.L883:
+	bgt	.L841
+.LVL793:
+.L904:
 	.loc 1 395 0
-	sxtw	x0, w4
-.LVL784:
+	sxtw	x1, w5
+.LVL794:
 	.loc 1 399 0
-	mov	w25, 0
+	mov	w3, 0
 	.loc 1 398 0
-	lsl	x1, x0, 3
+	lsl	x0, x1, 3
 	.loc 1 395 0
-	lsl	x0, x0, 2
-.LVL785:
+	lsl	x1, x1, 2
+.LVL795:
 	.loc 1 398 0
-	add	x1, x1, x5, sxtw 3
-	add	x0, x0, x5, sxtw 2
-	ldr	x2, [x10, x1]
+	add	x0, x0, x7, sxtw 3
+	add	x1, x1, x7, sxtw 2
+	ldr	x2, [x11, x0]
 	.loc 1 395 0
-	ldr	w3, [x8, x0]
+	ldr	w4, [x9, x1]
 	.loc 1 396 0
-	ldr	w1, [x12, x0]
+	ldr	w0, [x13, x1]
 	.loc 1 401 0
 	and	x27, x2, 255
 	.loc 1 397 0
-	ldr	w26, [x11, x0]
-.LVL786:
+	ldr	w26, [x12, x1]
+.LVL796:
 	.loc 1 401 0
-	cbnz	x27, .L809
-.LVL787:
+	cbnz	x27, .L825
+.LVL797:
 	.loc 1 402 0
-	and	w27, w1, 15
+	and	w3, w0, 15
+.LVL798:
+	cmp	w3, 14
 	.loc 1 405 0
-	mov	w25, 15
+	mov	w3, 15
+.LVL799:
 	.loc 1 402 0
-	cmp	w27, 14
-	bne	.L809
+	bne	.L825
 	.loc 1 403 0
-	orr	w3, w3, w25
-.LVL788:
+	orr	w4, w4, w3
+.LVL800:
 	.loc 1 399 0
-	mov	w25, 0
-.LVL789:
-	b	.L809
-.LVL790:
+	mov	w3, 0
+.LVL801:
+	b	.L825
+.LVL802:
 	.p2align 3
-.L773:
+.L786:
 .LBE1794:
 .LBE1798:
-	.loc 1 1634 0
+	.loc 1 1675 0
 	ldr	w0, [x28, 44]
-.LVL791:
 	cmp	w0, 1
-	beq	.L918
-	.loc 1 1643 0
+	beq	.L941
+	.loc 1 1684 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	beq	.L919
-.LVL792:
-.L902:
+	beq	.L942
+.LVL803:
+.L925:
 	ldr	w0, [x28, 96]
-.LVL793:
-	.loc 1 1646 0
-	cbz	w0, .L920
-.L858:
-.LVL794:
-.L848:
-	.loc 1 1648 0
+.LVL804:
+	.loc 1 1687 0
+	cbz	w0, .L943
+.L875:
+.LVL805:
+.L865:
+	.loc 1 1689 0
 	str	wzr, [x28, 96]
-.L924:
-	.loc 1 1349 0
+.L947:
+	.loc 1 1372 0
 	ldr	w0, [x28, 624]
-.LVL795:
-	cbz	w0, .L771
-.L906:
-	.loc 1 1350 0
+.LVL806:
+	cbz	w0, .L784
+.L929:
+	.loc 1 1373 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	beq	.L921
-.L772:
-	.loc 1 1653 0
-	add	x22, x22, :lo12:__stack_chk_guard
+	beq	.L944
+.L785:
+	.loc 1 1694 0
+	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, 0
 	ldr	x2, [x29, 216]
-	ldr	x1, [x22]
+	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L922
+	cbnz	x1, .L945
 	ldp	x19, x20, [sp, 16]
-.LVL796:
+.LVL807:
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
-.LVL797:
+.LVL808:
 	ldp	x25, x26, [sp, 64]
-.LVL798:
+.LVL809:
 	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 224
 	.cfi_remember_state
@@ -9034,407 +9137,392 @@ ebc_thread:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL799:
+.LVL810:
 	.p2align 3
-.L920:
+.L943:
 	.cfi_restore_state
 .LBB1799:
 .LBB1789:
-	.loc 1 1647 0 discriminator 1
+	.loc 1 1688 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL800:
-	b	.L859
+.LVL811:
+	b	.L876
 	.p2align 3
-.L923:
-.LVL801:
+.L946:
+.LVL812:
 .LBB1787:
-	.loc 1 1647 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L848
-	.loc 1 1647 0 discriminator 7
+	.loc 1 1688 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L865
+	.loc 1 1688 0 discriminator 7
 	bl	schedule
-.LVL802:
-.L859:
-	.loc 1 1647 0 discriminator 9
+.LVL813:
+.L876:
+	.loc 1 1688 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL803:
+.LVL814:
 	ldr	w1, [x28, 96]
-	cbz	w1, .L923
+	cbz	w1, .L946
 .LBE1787:
-	.loc 1 1647 0 discriminator 4
+	.loc 1 1688 0 discriminator 4
 	add	x1, x29, 112
 	mov	x0, x19
 	bl	finish_wait
-.LVL804:
+.LVL815:
 .LBE1789:
 .LBE1799:
-	.loc 1 1648 0 is_stmt 1 discriminator 4
+	.loc 1 1689 0 is_stmt 1 discriminator 4
 	str	wzr, [x28, 96]
-	b	.L924
-.LVL805:
-	.p2align 3
-.L782:
-	.loc 1 1405 0
-	mov	x0, x24
-	str	x24, [x28, 216]
-	b	.L783
-.LVL806:
-	.p2align 3
-.L776:
-	.loc 1 1378 0
-	cmp	w1, 18
-	ccmp	w1, 21, 4, ne
-	bne	.L780
-	.loc 1 1379 0
-	str	wzr, [x28, 632]
-	b	.L775
-.LVL807:
+	b	.L947
+.LVL816:
 	.p2align 3
-.L796:
-	.loc 1 1416 0
+.L812:
+	.loc 1 1455 0
 	cmp	w2, 23
-	ble	.L794
-.L790:
-	.loc 1 1597 0
+	ble	.L810
+.L806:
+	.loc 1 1636 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC92
-	add	x1, x1, :lo12:.LC92
+	adrp	x1, .LC93
+	add	x1, x1, :lo12:.LC93
 	bl	_dev_err
-.LVL808:
-	.loc 1 1598 0
+.LVL817:
+.L922:
+	.loc 1 1637 0
 	mov	x0, x24
-.LVL809:
-.L899:
 	bl	ebc_remove_from_dsp_buf_list
-.LVL810:
-	.loc 1 1599 0
+.LVL818:
+	.loc 1 1638 0
 	mov	x0, x24
 	bl	ebc_buf_release
-.LVL811:
-	.loc 1 1601 0
-	b	.L770
-.LVL812:
+.LVL819:
+	.loc 1 1640 0
+	b	.L783
+.LVL820:
 	.p2align 3
-.L791:
-	.loc 1 1416 0
+.L798:
+	.loc 1 1444 0
+	mov	x0, x24
+	str	x24, [x28, 216]
+	b	.L799
+.LVL821:
+	.p2align 3
+.L792:
+	.loc 1 1417 0
+	cmp	w0, 18
+	ccmp	w0, 21, 4, ne
+	bne	.L796
+	.loc 1 1418 0
+	str	wzr, [x28, 632]
+	b	.L791
+.LVL822:
+	.p2align 3
+.L807:
+	.loc 1 1455 0
 	cmp	w2, 21
-	bgt	.L796
+	bgt	.L812
 	cmp	w2, 16
-	bge	.L863
-.L793:
-	mov	w8, 0
-.LVL813:
-.L792:
-	.loc 1 1525 0
+	bge	.L880
+.L809:
+	mov	w7, 0
+.LVL823:
+.L808:
+	.loc 1 1564 0
 	ldr	x26, [x28, 216]
-.LVL814:
-	.loc 1 1527 0
+.LVL824:
+	.loc 1 1566 0
 	ldr	w0, [x26, 40]
 	sub	w1, w0, #22
-	.loc 1 1529 0
+	.loc 1 1568 0
 	cmp	w1, 1
 	ccmp	w0, 1, 0, hi
-	bhi	.L831
-	.loc 1 1533 0
+	bhi	.L847
+	.loc 1 1572 0
 	add	x0, x29, 152
 	str	x0, [x28, 216]
-	.loc 1 1534 0
+	.loc 1 1573 0
 	ldr	x0, [x28, 152]
 	str	x0, [x29, 168]
-.L831:
-	.loc 1 1539 0
+.L847:
+	.loc 1 1578 0
 	str	wzr, [x28, 92]
-	.loc 1 1540 0
+	.loc 1 1579 0
 	str	x24, [x28, 224]
-	.loc 1 1543 0
+	.loc 1 1582 0
 	ldr	w0, [x24, 40]
 	sub	w0, w0, #2
-	.loc 1 1542 0
+	.loc 1 1581 0
 	cmp	w0, 14
-	bhi	.L832
-	.loc 1 1545 0
+	bhi	.L848
+	.loc 1 1584 0
 	ldr	x0, [x28, 216]
 .LBB1800:
 .LBB1801:
-	.loc 1 1324 0
+	.loc 1 1345 0
 	ldr	w1, [x28, 20]
 .LBE1801:
 .LBE1800:
-	.loc 1 1544 0
+	.loc 1 1583 0
 	ldr	x4, [x24, 16]
 .LBB1804:
 .LBB1802:
-	.loc 1 1324 0
+	.loc 1 1345 0
 	cmp	w1, 0
 .LBE1802:
 .LBE1804:
-	.loc 1 1545 0
+	.loc 1 1584 0
 	ldr	x5, [x0, 16]
 .LBB1805:
 .LBB1803:
-	.loc 1 1324 0
+	.loc 1 1345 0
 	add	w0, w1, 7
 	csel	w0, w0, w1, lt
 	asr	w0, w0, 3
 	cmp	w0, 0
-	ble	.L833
-	.loc 1 1328 0
+	ble	.L849
+	.loc 1 1349 0
 	ldr	x2, [x4]
 	ldr	x1, [x5]
 	cmp	x2, x1
-	bne	.L832
+	bne	.L848
 	sub	w1, w0, #1
 	mov	x0, 8
 	add	x1, x1, 1
 	lsl	x1, x1, 3
-	b	.L835
+	b	.L851
 	.p2align 3
-.L836:
-	.loc 1 1325 0
+.L852:
+	.loc 1 1346 0
 	ldr	x3, [x4, x0]
 	add	x0, x0, 8
-	.loc 1 1326 0
+	.loc 1 1347 0
 	add	x2, x5, x0
-	.loc 1 1328 0
+	.loc 1 1349 0
 	ldr	x2, [x2, -8]
 	cmp	x3, x2
-	bne	.L832
-.L835:
-	.loc 1 1324 0
+	bne	.L848
+.L851:
+	.loc 1 1345 0
 	cmp	x1, x0
-	bne	.L836
-.L833:
+	bne	.L852
+.L849:
 .LBE1803:
 .LBE1805:
-	.loc 1 1547 0
+	.loc 1 1586 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC95
-	add	x1, x1, :lo12:.LC95
+	adrp	x1, .LC96
+	add	x1, x1, :lo12:.LC96
 	bl	_dev_info
-.LVL815:
-	.loc 1 1549 0
+.LVL825:
+	.loc 1 1588 0
 	str	x26, [x28, 216]
-	.loc 1 1608 0
+	.loc 1 1647 0
 	ldr	x0, [x28, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
-	bne	.L844
-.LVL816:
-.L926:
-	.loc 1 1611 0
+	bne	.L860
+.LVL826:
+.L950:
+	.loc 1 1650 0
 	ldr	x0, [x28, 104]
-	.loc 1 1609 0
+	.loc 1 1648 0
 	mov	w25, 1
-.LVL817:
-	.loc 1 1610 0
+.LVL827:
+	.loc 1 1649 0
 	str	wzr, [x28, 204]
-	.loc 1 1611 0
-	adrp	x1, .LC93
-	.loc 1 1609 0
+	.loc 1 1650 0
+	adrp	x1, .LC94
+	.loc 1 1648 0
 	str	w25, [x28, 624]
-	.loc 1 1611 0
-	add	x1, x1, :lo12:.LC93
+	.loc 1 1650 0
+	add	x1, x1, :lo12:.LC94
 	bl	_dev_info
-.LVL818:
-	.loc 1 1612 0
+.LVL828:
+	.loc 1 1651 0
 	mov	w2, w25
 	mov	w1, w25
-	add	x0, x21, 328
+	add	x0, x22, 328
 	bl	__wake_up_sync
-.LVL819:
-	.loc 1 1623 0
+.LVL829:
+	.loc 1 1664 0
 	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL820:
-	.loc 1 1625 0
+.LVL830:
+	.loc 1 1666 0
 	ldr	w0, [x28, 444]
-	cbz	w0, .L846
-.LVL821:
+	cbz	w0, .L863
+.LVL831:
 	.p2align 2
-.L928:
-	.loc 1 1626 0
+.L952:
+	.loc 1 1667 0
 	ldr	x0, [x28, 216]
 	bl	ebc_buf_release
-.LVL822:
-	b	.L847
-.LVL823:
+.LVL832:
+	b	.L864
+.LVL833:
 	.p2align 3
-.L863:
-	.loc 1 1516 0
-	mov	w8, 1
-.LVL824:
-	b	.L792
-.LVL825:
+.L880:
+	.loc 1 1555 0
+	mov	w7, 1
+.LVL834:
+	b	.L808
+.LVL835:
 	.p2align 3
-.L907:
-	.loc 1 1360 0
+.L930:
+	.loc 1 1395 0
 	str	wzr, [x28, 628]
-	.loc 1 1359 0
+	.loc 1 1394 0
 	str	wzr, [x28, 632]
-	b	.L775
-.LVL826:
+	b	.L791
+.LVL836:
 	.p2align 3
-.L832:
-	.loc 1 1555 0
-	cbnz	w8, .L867
-	.loc 1 1559 0
-	ldr	w0, [x28, 64]
-	cmp	w0, 0
-	ble	.L837
-	.loc 1 1560 0
-	add	w23, w23, 1
-	.loc 1 1561 0
-	cmp	w0, w23
-	bgt	.L837
-	.loc 1 1562 0
-	mov	w0, 2
-	.loc 1 1563 0
-	mov	w23, 0
-	.loc 1 1562 0
-	str	w0, [x24, 40]
-.L837:
-	.loc 1 1567 0
+.L848:
+	.loc 1 1594 0
+	cbz	w7, .L948
+	.loc 1 1595 0
+	str	wzr, [x29, 108]
+.LVL837:
+.L853:
+	.loc 1 1606 0
 	ldr	w0, [x28, 200]
-	cbz	w0, .L925
-.L838:
-	.loc 1 1570 0
+	cbz	w0, .L949
+.L854:
+	.loc 1 1609 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL827:
-	cbz	w0, .L839
-.L933:
-	.loc 1 1571 0
+.LVL838:
+	cbz	w0, .L855
+.L955:
+	.loc 1 1610 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC89
-	add	x1, x1, :lo12:.LC89
+	adrp	x1, .LC90
+	add	x1, x1, :lo12:.LC90
 	bl	_dev_err
-.LVL828:
-	.loc 1 1573 0
+.LVL839:
+	.loc 1 1612 0
 	str	x26, [x28, 216]
-.LVL829:
-.L805:
-	.loc 1 1608 0
+.LVL840:
+.L821:
+	.loc 1 1647 0
 	ldr	x0, [x28, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
-	beq	.L926
-.L844:
-	.loc 1 1614 0
+	beq	.L950
+.L860:
+	.loc 1 1653 0
 	cmp	w0, 18
-	beq	.L927
-.L845:
-	.loc 1 1623 0
+	beq	.L951
+.L861:
+	.loc 1 1664 0
 	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL830:
-	.loc 1 1625 0
+.LVL841:
+	.loc 1 1666 0
 	ldr	w0, [x28, 444]
-	cbnz	w0, .L928
-.L846:
-	.loc 1 1628 0
+	cbnz	w0, .L952
+.L863:
+	.loc 1 1669 0
 	mov	w0, 1
 	str	w0, [x28, 444]
-.L847:
-	.loc 1 1630 0
+.L864:
+	.loc 1 1671 0
 	ldr	x0, [x28, 224]
 	str	x0, [x28, 216]
-	.loc 1 1631 0
-	b	.L770
+	.loc 1 1672 0
+	b	.L783
 	.p2align 3
-.L918:
+.L941:
 .LBB1806:
-	.loc 1 1635 0 discriminator 1
+	.loc 1 1676 0 discriminator 1
 	ldr	w0, [x28, 96]
-	cbnz	w0, .L848
+	cbnz	w0, .L865
 .LBB1807:
-	.loc 1 1635 0 is_stmt 0 discriminator 3
+	.loc 1 1676 0 is_stmt 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL831:
-	b	.L852
+.LVL842:
+	b	.L869
 	.p2align 3
-.L929:
+.L953:
 .LBB1808:
-	.loc 1 1635 0 discriminator 7
+	.loc 1 1676 0 discriminator 7
 	ldr	w1, [x28, 96]
-	cbnz	w1, .L849
-.LVL832:
-	.loc 1 1635 0 discriminator 9
-	cbnz	x0, .L902
-	.loc 1 1635 0 discriminator 11
+	cbnz	w1, .L866
+.LVL843:
+	.loc 1 1676 0 discriminator 9
+	cbnz	x0, .L925
+	.loc 1 1676 0 discriminator 11
 	bl	schedule
-.LVL833:
-.L852:
-	.loc 1 1635 0 discriminator 13
+.LVL844:
+.L869:
+	.loc 1 1676 0 discriminator 13
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL834:
+.LVL845:
 	ldr	w1, [x28, 44]
-	cbnz	w1, .L929
-.L849:
+	cbnz	w1, .L953
+.L866:
 .LBE1808:
-	.loc 1 1635 0 discriminator 8
+	.loc 1 1676 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL835:
+.LVL846:
 	ldr	w0, [x28, 44]
 .LBE1807:
 .LBE1806:
-	.loc 1 1638 0 is_stmt 1 discriminator 8
-	cbnz	w0, .L902
-	.loc 1 1643 0
+	.loc 1 1679 0 is_stmt 1 discriminator 8
+	cbnz	w0, .L925
+	.loc 1 1684 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	bne	.L902
+	bne	.L925
 	.p2align 2
-.L919:
+.L942:
 .LBB1809:
 .LBB1810:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
-.LVL836:
-	b	.L902
-.LVL837:
+.LVL847:
+	b	.L925
 	.p2align 3
-.L780:
+.L796:
 .LBE1810:
 .LBE1809:
-	.loc 1 1381 0
-	ldr	w0, [x28, 632]
-.LVL838:
-	cmp	w0, 0
-	ccmp	w1, 1, 4, ne
-	beq	.L775
-	.loc 1 1382 0
-	add	x25, x21, 704
-.LVL839:
+	.loc 1 1420 0
+	ldr	w1, [x28, 632]
+	cmp	w1, 0
+	ccmp	w0, 1, 4, ne
+	beq	.L791
+	.loc 1 1421 0
+	add	x25, x22, 704
+.LVL848:
 	mov	x0, x25
 	bl	down_write
-.LVL840:
-	.loc 1 1383 0
+.LVL849:
+	.loc 1 1422 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x24, 16]
 	ldr	x0, [x28, 160]
 	bl	memcpy
-.LVL841:
-	.loc 1 1384 0
+.LVL850:
+	.loc 1 1423 0
 	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL842:
-	.loc 1 1385 0
+.LVL851:
+	.loc 1 1424 0
 	mov	x0, x24
 	bl	ebc_buf_release
-.LVL843:
-	.loc 1 1387 0
+.LVL852:
+	.loc 1 1426 0
 	ldr	x1, [x28, 224]
 	mov	x4, x28
 	ldr	x0, [x28, 144]
@@ -9442,546 +9530,563 @@ ebc_thread:
 	ldr	w5, [x1, 40]
 	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
-.LVL844:
-	.loc 1 1390 0
+.LVL853:
+	.loc 1 1429 0
 	mov	x0, x25
 	bl	up_write
-.LVL845:
-	.loc 1 1391 0
+.LVL854:
+	.loc 1 1430 0
 	ldr	w0, [x28, 44]
-	cbnz	w0, .L770
-	.loc 1 1394 0
+	cbnz	w0, .L783
+	.loc 1 1431 0
+	mov	w0, 1
+	str	w0, [x28, 44]
+	.loc 1 1433 0
 	ldr	w0, [x28, 200]
-	.loc 1 1392 0
-	mov	w1, 1
-	.loc 1 1393 0
+	.loc 1 1432 0
 	str	wzr, [x28, 92]
-	.loc 1 1392 0
-	str	w1, [x28, 44]
-	.loc 1 1394 0
-	cbz	w0, .L930
-.L781:
-	.loc 1 1396 0
+	.loc 1 1433 0
+	cbz	w0, .L954
+.L797:
+	.loc 1 1435 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC83
+	adrp	x1, .LC84
 	ldrb	w2, [x28, 48]
-	add	x1, x1, :lo12:.LC83
+	add	x1, x1, :lo12:.LC84
 	bl	_dev_info
-.LVL846:
-	.loc 1 1397 0
+.LVL855:
+	.loc 1 1436 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL847:
-	b	.L770
+.LVL856:
+	b	.L783
 	.p2align 3
-.L794:
-	.loc 1 1467 0
-	add	x0, x21, 704
+.L810:
+	.loc 1 1506 0
+	add	x0, x22, 704
 	bl	down_write
-.LVL848:
-	.loc 1 1473 0
+.LVL857:
+	.loc 1 1512 0
 	ldr	x0, [x28, 216]
-	.loc 1 1468 0
+	.loc 1 1507 0
 	str	x24, [x28, 224]
-	.loc 1 1474 0
+	.loc 1 1513 0
 	ldr	w0, [x0, 40]
 	sub	w1, w0, #22
-	.loc 1 1476 0
+	.loc 1 1515 0
 	cmp	w1, 1
 	ccmp	w0, 1, 0, hi
-	bls	.L827
-	.loc 1 1477 0
+	bls	.L843
+	.loc 1 1516 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x24, 16]
 	ldr	x0, [x28, 144]
 	bl	memcpy
-.LVL849:
-	.loc 1 1478 0
+.LVL858:
+	.loc 1 1517 0
 	ldr	x0, [x28, 216]
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x28, 152]
 	bl	memcpy
-.LVL850:
-	.loc 1 1484 0
-	add	x0, x21, 704
-	bl	up_write
-.LVL851:
-	.loc 1 1486 0
-	ldr	w0, [x28, 44]
-	cbnz	w0, .L805
-	.loc 1 1487 0
-	mov	w0, 1
-	str	w0, [x28, 44]
-	.loc 1 1489 0
-	ldr	w0, [x28, 200]
-	.loc 1 1488 0
-	str	wzr, [x28, 92]
-	.loc 1 1489 0
-	cbz	w0, .L931
-.L829:
-	.loc 1 1491 0
-	mov	x0, x20
-	bl	ebc_lut_update
-.LVL852:
-	cmn	w0, #1
-	beq	.L932
-.L830:
-	.loc 1 1499 0
-	ldr	x0, [x28, 104]
-	adrp	x1, .LC90
-	.loc 1 1496 0
-	ldr	w3, [x28, 112]
-	.loc 1 1499 0
-	add	x1, x1, :lo12:.LC90
-	.loc 1 1496 0
-	strb	w3, [x28, 48]
-.LVL853:
-.L901:
-	.loc 1 1499 0
-	and	w2, w3, 255
-	.loc 1 1497 0
-	lsr	w3, w3, 8
-	strb	w3, [x28, 49]
-	.loc 1 1499 0
-	bl	_dev_info
-.LVL854:
-	.loc 1 1500 0
-	mov	x0, x20
-	bl	ebc_frame_start
-.LVL855:
-	b	.L805
-.LVL856:
-.L827:
-	.loc 1 1481 0
-	ldr	x1, [x24, 16]
-	mov	x3, x28
-	ldr	x0, [x28, 144]
-	ldr	x2, [x28, 168]
-	bl	refresh_new_image_auto
-.LVL857:
-	.loc 1 1484 0
-	add	x0, x21, 704
-	bl	up_write
-.LVL858:
-	.loc 1 1486 0
-	ldr	w0, [x28, 44]
-	cbnz	w0, .L805
-	.loc 1 1487 0
-	mov	w0, 1
-	str	w0, [x28, 44]
-	.loc 1 1489 0
-	ldr	w0, [x28, 200]
-	.loc 1 1488 0
-	str	wzr, [x28, 92]
-	.loc 1 1489 0
-	cbnz	w0, .L829
-.L931:
-	.loc 1 1490 0
-	mov	x0, x20
-	bl	ebc_power_set.constprop.11
 .LVL859:
-	.loc 1 1491 0
-	mov	x0, x20
-	bl	ebc_lut_update
+	b	.L844
 .LVL860:
-	cmn	w0, #1
-	bne	.L830
-.L932:
-	.loc 1 1492 0
-	ldr	x0, [x28, 104]
-	adrp	x1, .LC89
-	add	x1, x1, :lo12:.LC89
-	bl	_dev_err
-.LVL861:
-	.loc 1 1493 0
-	b	.L805
-.LVL862:
 	.p2align 3
-.L867:
-	.loc 1 1567 0
+.L948:
+	.loc 1 1598 0
+	ldr	w0, [x28, 64]
+	cmp	w0, 0
+	ble	.L853
+	.loc 1 1599 0
+	ldr	w1, [x29, 108]
+.LVL861:
+	add	w1, w1, 1
+	str	w1, [x29, 108]
+	.loc 1 1600 0
+	cmp	w0, w1
+	bgt	.L853
+	.loc 1 1601 0
+	mov	w0, 2
+	str	w0, [x24, 40]
+	.loc 1 1602 0
+	str	wzr, [x29, 108]
+	.loc 1 1606 0
 	ldr	w0, [x28, 200]
-	.loc 1 1556 0
-	mov	w23, 0
-	.loc 1 1567 0
-	cbnz	w0, .L838
-.L925:
-	.loc 1 1568 0
+	cbnz	w0, .L854
+.L949:
+	.loc 1 1607 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.11
-.LVL863:
-	.loc 1 1570 0
+.LVL862:
+	.loc 1 1609 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL864:
-	cbnz	w0, .L933
-.L839:
-	.loc 1 1582 0
+.LVL863:
+	cbnz	w0, .L955
+.L855:
+	.loc 1 1621 0
 	ldr	x0, [x28, 224]
-	adrp	x1, .LC91
-	.loc 1 1579 0
+	adrp	x1, .LC92
+	.loc 1 1618 0
 	ldr	w3, [x28, 112]
-	.loc 1 1582 0
-	add	x1, x1, :lo12:.LC91
-	.loc 1 1579 0
+	.loc 1 1621 0
+	add	x1, x1, :lo12:.LC92
+	.loc 1 1618 0
 	strb	w3, [x28, 48]
-	.loc 1 1582 0
+	.loc 1 1621 0
 	and	w3, w3, 255
 	ldr	w2, [x0, 40]
 	ldr	x0, [x28, 104]
 	bl	_dev_info
-.LVL865:
-	.loc 1 1583 0
+.LVL864:
+	.loc 1 1622 0
 	mov	w0, 1
 	str	w0, [x28, 44]
-	.loc 1 1584 0
+	.loc 1 1623 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL866:
-	.loc 1 1586 0
+.LVL865:
+	.loc 1 1625 0
 	ldr	x1, [x25, #:lo12:jiffies]
 	add	x0, x20, 688
-	str	x0, [x29, 104]
+	str	x0, [x29, 96]
 	add	x1, x1, 900
 	bl	mod_timer
-.LVL867:
+.LVL866:
 .LBB1811:
-	.loc 1 1587 0
+	.loc 1 1626 0
 	ldr	w0, [x28, 92]
-	cbz	w0, .L934
-.L842:
-.LVL868:
-.L840:
+	cbz	w0, .L956
+.L858:
+.LVL867:
+.L856:
 .LBE1811:
-	.loc 1 1589 0 discriminator 11
+	.loc 1 1628 0 discriminator 11
 	ldr	x2, [x25, #:lo12:jiffies]
 	mov	x1, 402653184
-	ldr	x0, [x29, 104]
-.LVL869:
+	ldr	x0, [x29, 96]
+.LVL868:
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL870:
-	.loc 1 1590 0 discriminator 11
+.LVL869:
+	.loc 1 1629 0 discriminator 11
 	str	wzr, [x28, 92]
-	.loc 1 1592 0 discriminator 11
+	.loc 1 1631 0 discriminator 11
 	str	x26, [x28, 216]
-	.loc 1 1594 0 discriminator 11
-	b	.L805
-.LVL871:
-.L797:
-	.loc 1 1422 0
+	.loc 1 1633 0 discriminator 11
+	b	.L821
+.LVL870:
+.L813:
+	.loc 1 1461 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC87
-	add	x1, x1, :lo12:.LC87
+	adrp	x1, .LC88
+	add	x1, x1, :lo12:.LC88
 	bl	_dev_info
-.LVL872:
-	.loc 1 1423 0
+.LVL871:
+	.loc 1 1462 0
 	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL873:
-	.loc 1 1424 0
+.LVL872:
+	.loc 1 1463 0
 	mov	x0, x24
 	bl	ebc_buf_release
+.LVL873:
+	.loc 1 1465 0
+	b	.L783
+.L843:
+	.loc 1 1520 0
+	ldr	x1, [x24, 16]
+	mov	x3, x28
+	ldr	x0, [x28, 144]
+	ldr	x2, [x28, 168]
+	bl	refresh_new_image_auto
 .LVL874:
-	.loc 1 1426 0
-	b	.L770
-.L909:
-	.loc 1 1410 0
-	ldr	x0, [x28, 104]
-	adrp	x1, .LC85
-	add	x1, x1, :lo12:.LC85
-	bl	_dev_info
+.L844:
+	.loc 1 1523 0
+	add	x0, x22, 704
+	bl	up_write
 .LVL875:
-.LBB1815:
-	.loc 1 1411 0
-	ldr	w0, [x28, 92]
-	cbz	w0, .L935
-.L788:
+	.loc 1 1525 0
+	ldr	w0, [x28, 44]
+	cbnz	w0, .L821
+	.loc 1 1528 0
+	ldr	w0, [x28, 200]
+	.loc 1 1526 0
+	mov	w1, 1
+	.loc 1 1527 0
+	str	wzr, [x28, 92]
+	.loc 1 1526 0
+	str	w1, [x28, 44]
+	.loc 1 1528 0
+	cbz	w0, .L957
+.L845:
+	.loc 1 1530 0
+	mov	x0, x20
+	bl	ebc_lut_update
 .LVL876:
-.L786:
-.LBE1815:
-	.loc 1 1412 0 discriminator 11
+	cmn	w0, #1
+	beq	.L958
+	.loc 1 1538 0
 	ldr	x0, [x28, 104]
+	adrp	x1, .LC91
+	.loc 1 1535 0
+	ldr	w3, [x28, 112]
+	.loc 1 1538 0
+	add	x1, x1, :lo12:.LC91
+	.loc 1 1535 0
+	strb	w3, [x28, 48]
 .LVL877:
+.L924:
+	.loc 1 1538 0
+	and	w2, w3, 255
+	.loc 1 1536 0
+	lsr	w3, w3, 8
+	strb	w3, [x28, 49]
+	.loc 1 1538 0
+	bl	_dev_info
+.LVL878:
+	.loc 1 1539 0
+	mov	x0, x20
+	bl	ebc_frame_start
+.LVL879:
+	b	.L821
+.LVL880:
+.L932:
+	.loc 1 1449 0
+	ldr	x0, [x28, 104]
 	adrp	x1, .LC86
 	add	x1, x1, :lo12:.LC86
 	bl	_dev_info
-.LVL878:
-	b	.L900
-.L910:
-	.loc 1 1440 0
+.LVL881:
+.LBB1815:
+	.loc 1 1450 0
+	ldr	w0, [x28, 92]
+	cbz	w0, .L959
+.L804:
+.LVL882:
+.L802:
+.LBE1815:
+	.loc 1 1451 0 discriminator 11
+	ldr	x0, [x28, 104]
+.LVL883:
+	adrp	x1, .LC87
+	add	x1, x1, :lo12:.LC87
+	bl	_dev_info
+.LVL884:
+	b	.L923
+.L933:
+	.loc 1 1479 0
 	cmp	w0, 0
 	mov	x0, x24
 	ccmp	w1, 1, 0, ne
-	bhi	.L800
-	.loc 1 1441 0
+	bhi	.L816
+	.loc 1 1480 0
 	ldrsw	x2, [x28, 20]
 	ldp	x1, x0, [x28, 152]
 	bl	memcpy
-.LVL879:
+.LVL885:
 	ldr	x0, [x28, 224]
-	b	.L800
-.LVL880:
+	b	.L816
+.LVL886:
 	.p2align 3
-.L917:
+.L937:
 .LBB1819:
 .LBB1795:
+	.loc 1 427 0
+	orr	w4, w4, 983040
+	b	.L832
+	.p2align 3
+.L938:
+	.loc 1 433 0
+	orr	w4, w4, 15728640
+	b	.L834
+	.p2align 3
+.L939:
+	.loc 1 439 0
+	orr	w4, w4, 251658240
+	b	.L836
+.LVL887:
+	.p2align 3
+.L940:
 	.loc 1 445 0
-	orr	w3, w3, -268435456
-.LVL881:
+	orr	w4, w4, -268435456
+.LVL888:
 	.loc 1 450 0
-	and	w1, w1, w26
-.LVL882:
-	eor	w1, w1, w3
-.LVL883:
+	and	w0, w0, w26
+.LVL889:
+	eor	w0, w0, w4
+.LVL890:
 	.loc 1 394 0
-	add	w4, w4, 1
-	and	w1, w1, w25
-	cmp	w4, w9
+	add	w5, w5, 1
+	and	w0, w0, w3
+	cmp	w5, w10
 	.loc 1 450 0
-	eor	w1, w3, w1
+	eor	w0, w4, w0
 	.loc 1 451 0
-	str	w1, [x8, x0]
+	str	w0, [x9, x1]
 	.loc 1 394 0
-	ble	.L883
-.LVL884:
+	ble	.L904
+.LVL891:
 	.p2align 2
-.L825:
+.L841:
 	.loc 1 389 0
-	add	w15, w15, 1
-	add	w5, w5, w17
-	cmp	w15, w18
-	ble	.L882
-.L808:
+	add	w16, w16, 1
+	add	w7, w7, w18
+	cmp	w16, w25
+	ble	.L903
+.L824:
 .LBE1795:
 .LBE1819:
-	.loc 1 1447 0
-	add	x0, x21, 704
+	.loc 1 1486 0
+	add	x0, x22, 704
 	bl	up_write
-.LVL885:
-	.loc 1 1448 0
+.LVL892:
+	.loc 1 1487 0
 	ldr	w0, [x28, 44]
-	cbnz	w0, .L805
-	.loc 1 1449 0
-	mov	w0, 1
-	str	w0, [x28, 44]
-	.loc 1 1451 0
+	cbnz	w0, .L821
+	.loc 1 1490 0
 	ldr	w0, [x28, 200]
-	.loc 1 1450 0
+	.loc 1 1488 0
+	mov	w1, 1
+	.loc 1 1489 0
 	str	wzr, [x28, 92]
-	.loc 1 1451 0
-	cbz	w0, .L936
-.L826:
-	.loc 1 1453 0
+	.loc 1 1488 0
+	str	w1, [x28, 44]
+	.loc 1 1490 0
+	cbz	w0, .L960
+.L842:
+	.loc 1 1492 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL886:
+.LVL893:
 	cmn	w0, #1
-	beq	.L805
-	.loc 1 1457 0
+	beq	.L821
+	.loc 1 1496 0
 	ldr	w3, [x28, 112]
-	.loc 1 1460 0
-	adrp	x1, .LC88
-	.loc 1 1457 0
+	.loc 1 1499 0
+	adrp	x1, .LC89
+	.loc 1 1496 0
 	strb	w3, [x28, 48]
-	.loc 1 1460 0
-	add	x1, x1, :lo12:.LC88
+	.loc 1 1499 0
+	add	x1, x1, :lo12:.LC89
 	ldr	x0, [x28, 104]
-	b	.L901
-.LVL887:
+	b	.L924
+.LVL894:
 	.p2align 3
-.L911:
+.L934:
 .LBB1820:
 .LBB1796:
 	.loc 1 409 0
-	orr	w3, w3, 240
-	b	.L810
+	orr	w4, w4, 240
+	b	.L826
 	.p2align 3
-.L912:
+.L935:
 	.loc 1 415 0
-	orr	w3, w3, 3840
-	b	.L812
+	orr	w4, w4, 3840
+	b	.L828
 	.p2align 3
-.L913:
+.L936:
 	.loc 1 421 0
-	orr	w3, w3, 61440
-	b	.L814
-	.p2align 3
-.L914:
-	.loc 1 427 0
-	orr	w3, w3, 983040
-	b	.L816
-	.p2align 3
-.L915:
-	.loc 1 433 0
-	orr	w3, w3, 15728640
-	b	.L818
-	.p2align 3
-.L916:
-	.loc 1 439 0
-	orr	w3, w3, 251658240
-	b	.L820
-.LVL888:
-.L927:
+	orr	w4, w4, 61440
+	b	.L830
+.LVL895:
+.L951:
 .LBE1796:
 .LBE1820:
-	.loc 1 1618 0
+	.loc 1 1654 0
 	ldr	x0, [x28, 104]
-	.loc 1 1616 0
-	mov	w25, 1
-.LVL889:
-	.loc 1 1615 0
+	adrp	x1, .LC95
+	add	x1, x1, :lo12:.LC95
+	bl	_dev_info
+.LVL896:
+	.loc 1 1655 0
+	ldr	w0, [x28, 616]
+	cbz	w0, .L961
+.L862:
+	.loc 1 1660 0
+	add	x0, x21, :lo12:.LANCHOR0
+	.loc 1 1658 0
+	mov	w2, 1
+	.loc 1 1657 0
 	str	wzr, [x28, 204]
-	.loc 1 1618 0
-	adrp	x1, .LC94
-	.loc 1 1616 0
-	str	w25, [x28, 616]
-	.loc 1 1618 0
-	add	x1, x1, :lo12:.LC94
-	.loc 1 1617 0
+	.loc 1 1661 0
+	mov	w1, w2
+	.loc 1 1658 0
+	str	w2, [x28, 616]
+	.loc 1 1659 0
 	str	wzr, [x28, 632]
-	.loc 1 1618 0
-	bl	_dev_info
-.LVL890:
-	.loc 1 1619 0
-	mov	x0, 2
-	bl	ebc_notify
-.LVL891:
-	.loc 1 1620 0
-	mov	w2, w25
-	mov	w1, w25
-	add	x0, x21, 328
+	.loc 1 1660 0
+	str	wzr, [x0, 16]
+	.loc 1 1661 0
+	add	x0, x22, 328
 	bl	__wake_up_sync
-.LVL892:
-	b	.L845
-.LVL893:
-.L908:
-	.loc 1 1364 0
-	str	wzr, [x28, 616]
-	.loc 1 1365 0
-	mov	x0, 3
-.LVL894:
-	bl	ebc_notify
-.LVL895:
-	.loc 1 1366 0
-	ldr	x0, [x28, 104]
-	adrp	x1, .LC81
-	add	x1, x1, :lo12:.LC81
-	bl	_dev_info
-.LVL896:
-	b	.L775
 .LVL897:
-.L934:
+	b	.L861
+.L961:
+	.loc 1 1656 0
+	mov	x0, 2
+	bl	ebc_notify
+.LVL898:
+	b	.L862
+.LVL899:
+.L959:
 .LBB1821:
-.LBB1812:
-.LBB1813:
-	.loc 1 1587 0 discriminator 1
-	add	x27, x21, 352
-.LBE1813:
+.LBB1816:
+.LBB1817:
+	.loc 1 1450 0 discriminator 1
+	add	x26, x22, 352
+.LVL900:
+.LBE1817:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL898:
-	b	.L843
+.LVL901:
+	b	.L805
 	.p2align 3
-.L937:
-.LVL899:
-.LBB1814:
-	.loc 1 1587 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L840
-	.loc 1 1587 0 discriminator 7
+.L962:
+.LVL902:
+.LBB1818:
+	.loc 1 1450 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L802
+	.loc 1 1450 0 discriminator 7
 	bl	schedule
-.LVL900:
-.L843:
-	.loc 1 1587 0 discriminator 9
+.LVL903:
+.L805:
+	.loc 1 1450 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
-	mov	x0, x27
+	mov	x0, x26
 	bl	prepare_to_wait_event
-.LVL901:
+.LVL904:
 	ldr	w1, [x28, 92]
-	cbz	w1, .L937
-.LBE1814:
-	.loc 1 1587 0 discriminator 4
-	mov	x0, x27
+	cbz	w1, .L962
+.LBE1818:
+	.loc 1 1450 0 discriminator 4
+	mov	x0, x26
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL902:
-	b	.L840
-.LVL903:
-.L935:
-.LBE1812:
+.LVL905:
+	b	.L802
+.LVL906:
+.L931:
+.LBE1816:
 .LBE1821:
+	.loc 1 1399 0 is_stmt 1
+	str	wzr, [x28, 616]
+	.loc 1 1400 0
+	mov	x0, 3
+	bl	ebc_notify
+.LVL907:
+	.loc 1 1401 0
+	ldr	x0, [x28, 104]
+	adrp	x1, .LC82
+	add	x1, x1, :lo12:.LC82
+	bl	_dev_info
+.LVL908:
+	.loc 1 1404 0
+	ldr	w1, [x28, 20]
+	.loc 1 1402 0
+	add	x2, x21, :lo12:.LANCHOR0
+	.loc 1 1404 0
+	ldr	x0, [x24, 16]
+	.loc 1 1402 0
+	mov	w3, 1
+	.loc 1 1403 0
+	stp	w3, wzr, [x2, 16]
+	.loc 1 1404 0
+	bl	check_black_percent
+.LVL909:
+	cbnz	w0, .L783
+	b	.L791
+.LVL910:
+.L956:
 .LBB1822:
-.LBB1816:
-.LBB1817:
-	.loc 1 1411 0 is_stmt 1 discriminator 1
-	add	x26, x21, 352
-.LVL904:
-.LBE1817:
+.LBB1812:
+.LBB1813:
+	.loc 1 1626 0 discriminator 1
+	add	x27, x22, 352
+.LBE1813:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL905:
-	b	.L789
+.LVL911:
+	b	.L859
 	.p2align 3
-.L938:
-.LVL906:
-.LBB1818:
-	.loc 1 1411 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L786
-	.loc 1 1411 0 discriminator 7
+.L963:
+.LVL912:
+.LBB1814:
+	.loc 1 1626 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L856
+	.loc 1 1626 0 discriminator 7
 	bl	schedule
-.LVL907:
-.L789:
-	.loc 1 1411 0 discriminator 9
+.LVL913:
+.L859:
+	.loc 1 1626 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
-	mov	x0, x26
+	mov	x0, x27
 	bl	prepare_to_wait_event
-.LVL908:
+.LVL914:
 	ldr	w1, [x28, 92]
-	cbz	w1, .L938
-.LBE1818:
-	.loc 1 1411 0 discriminator 4
-	mov	x0, x26
+	cbz	w1, .L963
+.LBE1814:
+	.loc 1 1626 0 discriminator 4
+	mov	x0, x27
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL909:
-	b	.L786
-.LVL910:
-.L921:
-.LBE1816:
+.LVL915:
+	b	.L856
+.LVL916:
+.L944:
+.LBE1812:
 .LBE1822:
 .LBB1823:
 .LBB1824:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
-.LVL911:
-	b	.L772
-.L936:
+.LVL917:
+	b	.L785
+.LVL918:
+.L957:
 .LBE1824:
 .LBE1823:
-	.loc 1 1452 0 is_stmt 1
+	.loc 1 1529 0 is_stmt 1
 	mov	x0, x20
 	bl	ebc_power_set.constprop.11
-.LVL912:
-	b	.L826
-.LVL913:
-.L930:
-	.loc 1 1395 0
+.LVL919:
+	b	.L845
+.L958:
+	.loc 1 1531 0
+	ldr	x0, [x28, 104]
+	adrp	x1, .LC90
+	add	x1, x1, :lo12:.LC90
+	bl	_dev_err
+.LVL920:
+	.loc 1 1532 0
+	b	.L821
+.LVL921:
+.L960:
+	.loc 1 1491 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.11
-.LVL914:
-	b	.L781
-.LVL915:
-.L922:
-	.loc 1 1653 0
+.LVL922:
+	b	.L842
+.LVL923:
+.L954:
+	.loc 1 1434 0
+	mov	x0, x20
+	bl	ebc_power_set.constprop.11
+.LVL924:
+	b	.L797
+.LVL925:
+.L945:
+	.loc 1 1694 0
 	bl	__stack_chk_fail
-.LVL916:
+.LVL926:
 	.cfi_endproc
-.LFE2827:
+.LFE2828:
 	.size	ebc_thread, .-ebc_thread
 	.data
 	.align	3
@@ -9992,7 +10097,7 @@ ebc_driver:
 	.xword	ebc_probe
 	.xword	ebc_remove
 	.zero	24
-	.xword	.LC96
+	.xword	.LC97
 	.zero	32
 	.xword	ebc_match
 	.zero	64
@@ -10004,7 +10109,7 @@ ebc_driver:
 ebc_misc:
 	.word	243
 	.zero	4
-	.xword	.LC46
+	.xword	.LC47
 	.xword	ebc_ops
 	.zero	56
 	.type	ebc_thread_wq, %object
@@ -10040,13 +10145,13 @@ ebc_auto_thread_sem:
 waveform_misc:
 	.word	244
 	.zero	4
-	.xword	.LC104
+	.xword	.LC105
 	.xword	waveform_ops
 	.zero	56
 	.type	dev_attr_waveform_version, %object
 	.size	dev_attr_waveform_version, 32
 dev_attr_waveform_version:
-	.xword	.LC103
+	.xword	.LC104
 	.hword	292
 	.zero	6
 	.xword	waveform_version_read
@@ -10054,7 +10159,7 @@ dev_attr_waveform_version:
 	.type	dev_attr_pmic_name, %object
 	.size	dev_attr_pmic_name, 32
 dev_attr_pmic_name:
-	.xword	.LC102
+	.xword	.LC103
 	.hword	292
 	.zero	6
 	.xword	pmic_name_read
@@ -10062,7 +10167,7 @@ dev_attr_pmic_name:
 	.type	dev_attr_pmic_temp, %object
 	.size	dev_attr_pmic_temp, 32
 dev_attr_pmic_temp:
-	.xword	.LC101
+	.xword	.LC102
 	.hword	292
 	.zero	6
 	.xword	pmic_temp_read
@@ -10070,7 +10175,7 @@ dev_attr_pmic_temp:
 	.type	dev_attr_pmic_vcom, %object
 	.size	dev_attr_pmic_vcom, 32
 dev_attr_pmic_vcom:
-	.xword	.LC100
+	.xword	.LC101
 	.hword	420
 	.zero	6
 	.xword	pmic_vcom_read
@@ -10078,7 +10183,7 @@ dev_attr_pmic_vcom:
 	.type	dev_attr_ebc_version, %object
 	.size	dev_attr_ebc_version, 32
 dev_attr_ebc_version:
-	.xword	.LC99
+	.xword	.LC100
 	.hword	292
 	.zero	6
 	.xword	ebc_version_read
@@ -10086,7 +10191,7 @@ dev_attr_ebc_version:
 	.type	dev_attr_ebc_state, %object
 	.size	dev_attr_ebc_state, 32
 dev_attr_ebc_state:
-	.xword	.LC98
+	.xword	.LC99
 	.hword	292
 	.zero	6
 	.xword	ebc_state_read
@@ -10094,7 +10199,7 @@ dev_attr_ebc_state:
 	.type	dev_attr_ebc_buf_state, %object
 	.size	dev_attr_ebc_buf_state, 32
 dev_attr_ebc_buf_state:
-	.xword	.LC97
+	.xword	.LC98
 	.hword	292
 	.zero	6
 	.xword	ebc_buf_state_read
@@ -10120,12 +10225,20 @@ global_ebc:
 	.size	ebc_auto_task, 8
 ebc_auto_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__.34997, %object
-	.size	__func__.34997, 11
-__func__.34997:
+	.type	__func__.35011, %object
+	.size	__func__.35011, 11
+__func__.35011:
 	.string	"ebc_io_ctl"
 	.align	3
 	.set	.LANCHOR3,. + 0
@@ -10133,14 +10246,14 @@ __func__.34997:
 	.size	__func__.34785, 16
 __func__.34785:
 	.string	"ebc_frame_start"
-	.type	__func__.35307, %object
-	.size	__func__.35307, 12
-__func__.35307:
+	.type	__func__.35321, %object
+	.size	__func__.35321, 12
+__func__.35321:
 	.string	"ebc_suspend"
 	.zero	4
-	.type	__func__.35241, %object
-	.size	__func__.35241, 19
-__func__.35241:
+	.type	__func__.35255, %object
+	.size	__func__.35255, 19
+__func__.35255:
 	.string	"ebc_lut_table_init"
 	.zero	5
 	.type	ebc_match, %object
@@ -10180,9 +10293,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init2595, %object
-	.size	__addressable_ebc_init2595, 8
-__addressable_ebc_init2595:
+	.type	__addressable_ebc_init2636, %object
+	.size	__addressable_ebc_init2636, 8
+__addressable_ebc_init2636:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -10222,279 +10335,282 @@ __exitcall_ebc_exit:
 	.string	"frame done\n"
 	.zero	4
 .LC10:
+	.string	"black point > 90percent, skip this frame\n"
+	.zero	6
+.LC11:
 	.string	"temperature = %d, out of range0~50 ,use 0 \n"
 	.zero	4
-.LC11:
+.LC12:
 	.string	"temperature = %d, out of range0~50 ,use 50 \n"
 	.zero	3
-.LC12:
+.LC13:
 	.string	"ebc_pmic_read_temp failed, ret = %d\n"
 	.zero	3
-.LC13:
+.LC14:
 	.string	"lut update use temperature = %d\n"
 	.zero	7
-.LC14:
+.LC15:
 	.string	"get lut data failed\n"
 	.zero	3
-.LC15:
+.LC16:
 	.string	"%d\n"
 	.zero	4
-.LC16:
-	.string	"2.13"
-	.zero	3
 .LC17:
+	.string	"2.14"
+	.zero	3
+.LC18:
 	.string	"%s\n"
 	.zero	4
-.LC18:
+.LC19:
 	.string	"invalid value = %s\n"
 	.zero	4
-.LC19:
+.LC20:
 	.string	"set vcom value failed\n"
 	.zero	1
-.LC20:
+.LC21:
 	.string	"%s: overlay no need to update\n"
 	.zero	1
-.LC21:
+.LC22:
 	.string	"%s: auto no need to update\n"
 	.zero	4
-.LC22:
+.LC23:
 	.string	"ebc hw power off\n"
 	.zero	6
-.LC23:
+.LC24:
 	.string	"%s: device is busy now...\n"
 	.zero	5
-.LC24:
-	.string	"device suspend\n"
 .LC25:
+	.string	"device suspend\n"
+.LC26:
 	.string	"ebc_tcon"
 	.zero	7
-.LC26:
+.LC27:
 	.string	"not find ebc tcon\n"
 	.zero	5
-.LC27:
+.LC28:
 	.string	"pmic"
 	.zero	3
-.LC28:
+.LC29:
 	.string	"wrong pmics number\n"
 	.zero	4
-.LC29:
+.LC30:
 	.string	"not find pmic node\n"
 	.zero	4
-.LC30:
+.LC31:
 	.string	"not find pmic i2c client\n"
 	.zero	6
-.LC31:
+.LC32:
 	.string	"use pmic%d\n"
 	.zero	4
-.LC32:
+.LC33:
 	.string	"get drvdata from pmic client failed\n"
 	.zero	3
-.LC33:
+.LC34:
 	.string	"panel,width"
 	.zero	4
-.LC34:
+.LC35:
 	.string	"panel,panel_color"
 	.zero	6
-.LC35:
+.LC36:
 	.string	"panel,mirror"
 	.zero	3
-.LC36:
+.LC37:
 	.string	"panel,width-mm"
 	.zero	1
-.LC37:
-	.string	"panel,height-mm"
 .LC38:
+	.string	"panel,height-mm"
+.LC39:
 	.string	"memory-region"
 	.zero	2
-.LC39:
+.LC40:
 	.string	"Couldn't address to resource for reserved memory\n"
 	.zero	6
-.LC40:
-	.string	"waveform-region"
 .LC41:
-	.string	"%s:%d: failed to get mem from reserved\n"
+	.string	"waveform-region"
 .LC42:
+	.string	"%s:%d: failed to get mem from reserved\n"
+.LC43:
 	.string	"Failed to read waveform from mem, we use waveform file from kernel file instead\n"
 	.zero	7
-.LC43:
+.LC44:
 	.string	"Failed to read waveform file from kernel, no waveform!!!\n"
 	.zero	6
-.LC44:
+.LC45:
 	.string	"failed to create ebc_task thread\n"
 	.zero	6
-.LC45:
+.LC46:
 	.string	"ebc_thread"
 	.zero	5
-.LC46:
+.LC47:
 	.string	"ebc"
 	.zero	4
-.LC47:
+.LC48:
 	.string	"ulogo_addr="
 	.zero	4
-.LC48:
+.LC49:
 	.string	"klogo_addr="
 	.zero	4
-.LC49:
-	.string	"ulogo_addr=0x%x"
 .LC50:
+	.string	"ulogo_addr=0x%x"
+.LC51:
 	.string	"have ulogo display, ulogo addr = 0x%x\n"
 	.zero	1
-.LC51:
+.LC52:
 	.string	"malloc ulogo buffer failed\n"
 	.zero	4
-.LC52:
-	.string	"klogo_addr=0x%x"
 .LC53:
+	.string	"klogo_addr=0x%x"
+.LC54:
 	.string	"need show klogo, klogo addr = 0x%x\n"
 	.zero	4
-.LC54:
+.LC55:
 	.string	"malloc klogo buffer failed\n"
 	.zero	4
-.LC55:
+.LC56:
 	.string	"no uboot logo, panel init\n"
 	.zero	5
-.LC56:
+.LC57:
 	.string	"rockchip ebc driver %s probe success\n"
 	.zero	2
-.LC57:
+.LC58:
 	.string	"panel,height"
 	.zero	3
-.LC58:
-	.string	"panel,vir_width"
 .LC59:
+	.string	"panel,vir_width"
+.LC60:
 	.string	"panel,vir_height"
 	.zero	7
-.LC60:
+.LC61:
 	.string	"panel,sdck"
 	.zero	5
-.LC61:
+.LC62:
 	.string	"panel,lsl"
 	.zero	6
-.LC62:
+.LC63:
 	.string	"panel,lbl"
 	.zero	6
-.LC63:
+.LC64:
 	.string	"panel,ldl"
 	.zero	6
-.LC64:
+.LC65:
 	.string	"panel,lel"
 	.zero	6
-.LC65:
+.LC66:
 	.string	"panel,gdck-sta"
 	.zero	1
-.LC66:
+.LC67:
 	.string	"panel,lgonl"
 	.zero	4
-.LC67:
+.LC68:
 	.string	"panel,fsl"
 	.zero	6
-.LC68:
+.LC69:
 	.string	"panel,fbl"
 	.zero	6
-.LC69:
+.LC70:
 	.string	"panel,fdl"
 	.zero	6
-.LC70:
+.LC71:
 	.string	"panel,fel"
 	.zero	6
-.LC71:
+.LC72:
 	.string	"panel,panel_16bit"
 	.zero	6
-.LC72:
+.LC73:
 	.string	"buffer manage init failed\n"
 	.zero	5
-.LC73:
+.LC74:
 	.string	"lut table init failed\n"
 	.zero	1
-.LC74:
-	.string	"auto-refresh-wq"
 .LC75:
+	.string	"auto-refresh-wq"
+.LC76:
 	.string	"%s"
 	.zero	5
-.LC76:
+.LC77:
 	.string	"ebc_task"
 	.zero	7
-.LC77:
+.LC78:
 	.string	"failed to run ebc thread\n"
 	.zero	6
-.LC78:
+.LC79:
 	.string	"task init failed\n"
 	.zero	6
-.LC79:
+.LC80:
 	.string	"failed to probe panel: %d\n"
 	.zero	5
-.LC80:
+.LC81:
 	.string	"ebc hw power on\n"
 	.zero	7
-.LC81:
+.LC82:
 	.string	"early resume\n"
 	.zero	2
-.LC82:
+.LC83:
 	.string	"refresh suspend logo\n"
 	.zero	2
-.LC83:
+.LC84:
 	.string	"overlay mode start, update background, frame_total=%d\n"
 	.zero	1
-.LC84:
+.LC85:
 	.string	"change display mode from %d to %d\n"
 	.zero	5
-.LC85:
+.LC86:
 	.string	"ebc is busy now, waiting prev refresh mode end...\n"
 	.zero	5
-.LC86:
+.LC87:
 	.string	"prev refresh mode end\n"
 	.zero	1
-.LC87:
+.LC88:
 	.string	"overlay disabled, drop EPD_OVERLAY frame\n"
 	.zero	6
-.LC88:
+.LC89:
 	.string	"overlay mode start, frame_total=%d\n"
 	.zero	4
-.LC89:
+.LC90:
 	.string	"ebc_lut_update err\n"
 	.zero	4
-.LC90:
+.LC91:
 	.string	"auto mode start, frame_total=%d\n"
 	.zero	7
-.LC91:
+.LC92:
 	.string	"frame start, mode = %d, framecount = %d\n"
 	.zero	7
-.LC92:
+.LC93:
 	.string	"ebc buffer mode %d error!!!\n"
 	.zero	3
-.LC93:
+.LC94:
 	.string	"power off\n"
 	.zero	5
-.LC94:
+.LC95:
 	.string	"early suspend\n"
 	.zero	1
-.LC95:
+.LC96:
 	.string	"check_part_mode==0, no need refresh\n"
 	.zero	3
-.LC96:
-	.string	"ebc-dev"
 .LC97:
+	.string	"ebc-dev"
+.LC98:
 	.string	"ebc_buf_state"
 	.zero	2
-.LC98:
+.LC99:
 	.string	"ebc_state"
 	.zero	6
-.LC99:
+.LC100:
 	.string	"ebc_version"
 	.zero	4
-.LC100:
+.LC101:
 	.string	"pmic_vcom"
 	.zero	6
-.LC101:
+.LC102:
 	.string	"pmic_temp"
 	.zero	6
-.LC102:
+.LC103:
 	.string	"pmic_name"
 	.zero	6
-.LC103:
+.LC104:
 	.string	"waveform_version"
 	.zero	7
-.LC104:
+.LC105:
 	.string	"waveform"
 	.text
 .Letext0:
@@ -10696,15 +10812,15 @@ __exitcall_ebc_exit:
 	.file 214 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x147f3
+	.4byte	0x148bd
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF3314
+	.4byte	.LASF3320
 	.byte	0x1
-	.4byte	.LASF3315
-	.4byte	.LASF3316
+	.4byte	.LASF3321
+	.4byte	.LASF3322
 	.4byte	.Ldebug_ranges0+0x1160
 	.8byte	0
 	.4byte	.Ldebug_line0
@@ -28304,7 +28420,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x3
 	.4byte	0x9294
 	.uleb128 0x48
-	.4byte	.LASF3045
+	.4byte	.LASF3047
 	.byte	0x1f
 	.2byte	0xba2
 	.4byte	0x92a4
@@ -38403,2638 +38519,2654 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3027
 	.byte	0x1
-	.2byte	0x7bb
+	.2byte	0x54f
+	.4byte	0xc6
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	resume_frame_count
+	.uleb128 0x4d
+	.4byte	.LASF3028
+	.byte	0x1
+	.2byte	0x550
+	.4byte	0xc6
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	resume_count_start
+	.uleb128 0x4d
+	.4byte	.LASF3029
+	.byte	0x1
+	.2byte	0x7e4
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_ops
 	.uleb128 0x4d
-	.4byte	.LASF3028
+	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0x7c5
+	.2byte	0x7ee
 	.4byte	0xc680
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_misc
 	.uleb128 0x4d
-	.4byte	.LASF3029
+	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0x7e2
+	.2byte	0x80b
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	waveform_ops
 	.uleb128 0x4d
-	.4byte	.LASF3030
+	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0x7e8
+	.2byte	0x811
 	.4byte	0xc680
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	waveform_misc
 	.uleb128 0x4d
-	.4byte	.LASF3031
+	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0x7f7
+	.2byte	0x820
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_waveform_version
 	.uleb128 0x4d
-	.4byte	.LASF3032
+	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0x802
+	.2byte	0x82b
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_name
 	.uleb128 0x4d
-	.4byte	.LASF3033
+	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0x810
+	.2byte	0x839
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_temp
 	.uleb128 0x4d
-	.4byte	.LASF3034
+	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0x833
+	.2byte	0x85c
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_vcom
 	.uleb128 0x4d
-	.4byte	.LASF3035
+	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0x83d
+	.2byte	0x866
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_version
 	.uleb128 0x4d
-	.4byte	.LASF3036
+	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0x846
+	.2byte	0x86f
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_state
 	.uleb128 0x4d
-	.4byte	.LASF3037
+	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0x84f
+	.2byte	0x878
 	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_buf_state
 	.uleb128 0x4d
-	.4byte	.LASF3038
+	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0xa04
+	.2byte	0xa2d
 	.4byte	0xa5cc
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_pm
 	.uleb128 0x5
 	.4byte	0xb20b
-	.4byte	0xe6db
+	.4byte	0xe707
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe6cb
+	.4byte	0xe6f7
 	.uleb128 0x4d
-	.4byte	.LASF3039
+	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0xa09
-	.4byte	0xe6db
+	.2byte	0xa32
+	.4byte	0xe707
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_match
 	.uleb128 0x4d
-	.4byte	.LASF3040
+	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0xa0f
+	.2byte	0xa38
 	.4byte	0xd70e
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_driver
 	.uleb128 0x4d
-	.4byte	.LASF3041
+	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0xa23
+	.2byte	0xa4c
 	.4byte	0x458
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init2595
+	.8byte	__addressable_ebc_init2636
 	.uleb128 0x4d
-	.4byte	.LASF3042
+	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0xa24
+	.2byte	0xa4d
 	.4byte	0x4ac
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	__exitcall_ebc_exit
 	.uleb128 0x4e
-	.4byte	.LASF3093
+	.4byte	.LASF3095
 	.byte	0x1
-	.2byte	0xa1e
-	.8byte	.LFB2856
-	.8byte	.LFE2856-.LFB2856
+	.2byte	0xa47
+	.8byte	.LFB2857
+	.8byte	.LFE2857-.LFB2857
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe764
+	.4byte	0xe790
 	.uleb128 0x4f
 	.8byte	.LVL64
-	.4byte	0x144d0
+	.4byte	0x1458e
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3043
+	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0xa19
+	.2byte	0xa42
 	.4byte	0xc6
-	.8byte	.LFB2855
-	.8byte	.LFE2855-.LFB2855
+	.8byte	.LFB2856
+	.8byte	.LFE2856-.LFB2856
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe794
+	.4byte	0xe7c0
 	.uleb128 0x4f
-	.8byte	.LVL356
-	.4byte	0x144dc
+	.8byte	.LVL366
+	.4byte	0x1459a
 	.byte	0
 	.uleb128 0x51
-	.4byte	.LASF3044
+	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0x9f8
+	.2byte	0xa21
 	.4byte	0xc6
-	.8byte	.LFB2854
-	.8byte	.LFE2854-.LFB2854
+	.8byte	.LFB2855
+	.8byte	.LFE2855-.LFB2855
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe830
+	.4byte	0xe85c
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x9f8
+	.2byte	0xa21
 	.4byte	0xa5e0
 	.4byte	.LLST11
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x9fa
+	.2byte	0xa23
 	.4byte	0xe53f
 	.uleb128 0x48
 	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x9fb
-	.4byte	0xe830
+	.2byte	0xa24
+	.4byte	0xe85c
 	.uleb128 0x54
-	.4byte	0x13844
+	.4byte	0x13902
 	.8byte	.LBB934
 	.8byte	.LBE934-.LBB934
 	.byte	0x1
-	.2byte	0x9fa
-	.4byte	0xe800
+	.2byte	0xa23
+	.4byte	0xe82c
 	.uleb128 0x55
-	.4byte	0x13855
+	.4byte	0x13913
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13419
+	.4byte	0x134d7
 	.8byte	.LBB936
 	.8byte	.LBE936-.LBB936
 	.byte	0x1
-	.2byte	0x9fd
-	.4byte	0xe822
+	.2byte	0xa26
+	.4byte	0xe84e
 	.uleb128 0x55
-	.4byte	0x13426
+	.4byte	0x134e4
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL68
-	.4byte	0x144e8
+	.4byte	0x145a6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xe289
 	.uleb128 0x51
-	.4byte	.LASF3046
+	.4byte	.LASF3048
 	.byte	0x1
-	.2byte	0x9e7
+	.2byte	0xa10
 	.4byte	0xc6
-	.8byte	.LFB2853
-	.8byte	.LFE2853-.LFB2853
+	.8byte	.LFB2854
+	.8byte	.LFE2854-.LFB2854
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe93d
+	.4byte	0xe969
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x9e7
+	.2byte	0xa10
 	.4byte	0xa5e0
-	.4byte	.LLST148
+	.4byte	.LLST152
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x9e9
+	.2byte	0xa12
 	.4byte	0xe53f
 	.uleb128 0x48
 	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x9ea
-	.4byte	0xe830
+	.2byte	0xa13
+	.4byte	0xe85c
 	.uleb128 0x56
-	.4byte	.LASF3047
-	.4byte	0xe94d
+	.4byte	.LASF3049
+	.4byte	0xe979
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35307
+	.8byte	__func__.35321
 	.uleb128 0x54
-	.4byte	0x13844
+	.4byte	0x13902
 	.8byte	.LBB1414
 	.8byte	.LBE1414-.LBB1414
 	.byte	0x1
-	.2byte	0x9e9
-	.4byte	0xe8b5
+	.2byte	0xa12
+	.4byte	0xe8e1
 	.uleb128 0x55
-	.4byte	0x13855
+	.4byte	0x13913
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13433
+	.4byte	0x134f1
 	.8byte	.LBB1416
 	.8byte	.LBE1416-.LBB1416
 	.byte	0x1
-	.2byte	0x9f2
-	.4byte	0xe8d7
+	.2byte	0xa1b
+	.4byte	0xe903
 	.uleb128 0x55
-	.4byte	0x13440
+	.4byte	0x134fe
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13160
+	.4byte	0x1321e
 	.8byte	.LBB1418
 	.8byte	.LBE1418-.LBB1418
 	.byte	0x1
-	.2byte	0x9ee
-	.4byte	0xe922
+	.2byte	0xa17
+	.4byte	0xe94e
 	.uleb128 0x55
-	.4byte	0x1317b
+	.4byte	0x13239
 	.uleb128 0x55
-	.4byte	0x13170
+	.4byte	0x1322e
 	.uleb128 0x57
 	.8byte	.LBB1419
 	.8byte	.LBE1419-.LBB1419
 	.uleb128 0x58
-	.4byte	0x13187
+	.4byte	0x13245
 	.uleb128 0x4f
-	.8byte	.LVL521
-	.4byte	0x14360
+	.8byte	.LVL531
+	.4byte	0x1441e
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL519
-	.4byte	0x144e8
+	.8byte	.LVL529
+	.4byte	0x145a6
 	.uleb128 0x4f
-	.8byte	.LVL520
-	.4byte	0x144e8
+	.8byte	.LVL530
+	.4byte	0x145a6
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xe94d
+	.4byte	0xe979
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xb
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe93d
+	.4byte	0xe969
 	.uleb128 0x50
-	.4byte	.LASF3048
+	.4byte	.LASF3050
 	.byte	0x1
-	.2byte	0x9e0
+	.2byte	0xa09
 	.4byte	0xc6
-	.8byte	.LFB2852
-	.8byte	.LFE2852-.LFB2852
+	.8byte	.LFB2853
+	.8byte	.LFE2853-.LFB2853
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe992
+	.4byte	0xe9be
 	.uleb128 0x59
-	.4byte	.LASF3049
+	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0x9e0
+	.2byte	0xa09
 	.4byte	0xd78a
 	.4byte	.LLST13
 	.uleb128 0x4f
 	.8byte	.LVL74
-	.4byte	0x144f5
+	.4byte	0x145b3
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3050
+	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0x95f
+	.2byte	0x988
 	.4byte	0xc6
-	.8byte	.LFB2851
-	.8byte	.LFE2851-.LFB2851
+	.8byte	.LFB2852
+	.8byte	.LFE2852-.LFB2852
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfe1a
+	.4byte	0xfe46
 	.uleb128 0x59
-	.4byte	.LASF3049
+	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0x95f
+	.2byte	0x988
 	.4byte	0xd78a
-	.4byte	.LLST149
+	.4byte	.LLST153
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x961
+	.2byte	0x98a
 	.4byte	0xa5e0
 	.uleb128 0x48
-	.4byte	.LASF3051
+	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0x962
+	.2byte	0x98b
 	.4byte	0xb904
 	.uleb128 0x5a
-	.4byte	.LASF3052
+	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0x963
+	.2byte	0x98c
 	.4byte	0xd78a
-	.4byte	.LLST150
+	.4byte	.LLST154
 	.uleb128 0x48
-	.4byte	.LASF3053
+	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0x964
+	.2byte	0x98d
 	.4byte	0xb904
 	.uleb128 0x5a
-	.4byte	.LASF3054
+	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0x965
+	.2byte	0x98e
 	.4byte	0xc0b3
-	.4byte	.LLST151
+	.4byte	.LLST155
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x966
+	.2byte	0x98f
 	.4byte	0xe53f
 	.uleb128 0x5a
 	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x967
-	.4byte	0xe830
-	.4byte	.LLST152
+	.2byte	0x990
+	.4byte	0xe85c
+	.4byte	.LLST156
 	.uleb128 0x48
 	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x968
+	.2byte	0x991
 	.4byte	0xe1dc
 	.uleb128 0x5a
 	.4byte	.LASF976
 	.byte	0x1
-	.2byte	0x969
+	.2byte	0x992
 	.4byte	0xbd30
-	.4byte	.LLST153
+	.4byte	.LLST157
 	.uleb128 0x48
 	.4byte	.LASF2435
 	.byte	0x1
-	.2byte	0x96a
+	.2byte	0x993
 	.4byte	0xbcd0
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x96b
+	.2byte	0x994
 	.4byte	0xc6
 	.uleb128 0x5a
 	.4byte	.LASF1001
 	.byte	0x1
-	.2byte	0x96c
+	.2byte	0x995
 	.4byte	0xc6
-	.4byte	.LLST154
+	.4byte	.LLST158
 	.uleb128 0x5b
 	.string	"i"
 	.byte	0x1
-	.2byte	0x96d
+	.2byte	0x996
 	.4byte	0xc6
-	.4byte	.LLST155
+	.4byte	.LLST159
 	.uleb128 0x5c
-	.4byte	0x13862
+	.4byte	0x13920
 	.8byte	.LBB1570
 	.4byte	.Ldebug_ranges0+0xbd0
 	.byte	0x1
-	.2byte	0x96f
-	.4byte	0xeaab
+	.2byte	0x998
+	.4byte	0xead7
 	.uleb128 0x55
-	.4byte	0x1388b
+	.4byte	0x13949
 	.uleb128 0x55
-	.4byte	0x1387f
+	.4byte	0x1393d
 	.uleb128 0x55
-	.4byte	0x13873
+	.4byte	0x13931
 	.uleb128 0x4f
-	.8byte	.LVL524
-	.4byte	0x14501
+	.8byte	.LVL534
+	.4byte	0x145bf
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1373c
+	.4byte	0x137fa
 	.8byte	.LBB1574
 	.8byte	.LBE1574-.LBB1574
 	.byte	0x1
-	.2byte	0x981
-	.4byte	0xeaea
+	.2byte	0x9aa
+	.4byte	0xeb16
 	.uleb128 0x55
-	.4byte	0x1374c
+	.4byte	0x1380a
 	.uleb128 0x5d
-	.4byte	0x13844
+	.4byte	0x13902
 	.8byte	.LBB1575
 	.8byte	.LBE1575-.LBB1575
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x55
-	.4byte	0x13855
+	.4byte	0x13913
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1375f
+	.4byte	0x1381d
 	.8byte	.LBB1577
 	.8byte	.LBE1577-.LBB1577
 	.byte	0x1
-	.2byte	0x99c
-	.4byte	0xeb2a
+	.2byte	0x9c5
+	.4byte	0xeb56
 	.uleb128 0x55
-	.4byte	0x13770
+	.4byte	0x1382e
 	.uleb128 0x5e
-	.4byte	0x13844
+	.4byte	0x13902
 	.8byte	.LBB1578
 	.8byte	.LBE1578-.LBB1578
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x55
-	.4byte	0x13855
+	.4byte	0x13913
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x11825
+	.4byte	0x11851
 	.8byte	.LBB1580
 	.4byte	.Ldebug_ranges0+0xc00
 	.byte	0x1
-	.2byte	0x9b0
-	.4byte	0xf4ff
+	.2byte	0x9d9
+	.4byte	0xf52b
 	.uleb128 0x55
-	.4byte	0x11836
+	.4byte	0x11862
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xc00
 	.uleb128 0x58
-	.4byte	0x11842
+	.4byte	0x1186e
 	.uleb128 0x5c
-	.4byte	0x13783
+	.4byte	0x13841
 	.8byte	.LBB1582
 	.4byte	.Ldebug_ranges0+0xc50
 	.byte	0x1
-	.2byte	0x69d
-	.4byte	0xebba
+	.2byte	0x6c6
+	.4byte	0xebe6
 	.uleb128 0x55
-	.4byte	0x137ab
+	.4byte	0x13869
 	.uleb128 0x55
-	.4byte	0x1379f
+	.4byte	0x1385d
 	.uleb128 0x55
-	.4byte	0x13794
+	.4byte	0x13852
 	.uleb128 0x60
-	.4byte	0x137b8
+	.4byte	0x13876
 	.8byte	.LBB1583
 	.4byte	.Ldebug_ranges0+0xc50
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x137ec
+	.4byte	0x138aa
 	.uleb128 0x55
-	.4byte	0x137e0
+	.4byte	0x1389e
 	.uleb128 0x55
-	.4byte	0x137d4
+	.4byte	0x13892
 	.uleb128 0x55
-	.4byte	0x137c9
+	.4byte	0x13887
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xc50
 	.uleb128 0x58
-	.4byte	0x137f7
+	.4byte	0x138b5
 	.uleb128 0x4f
-	.8byte	.LVL549
-	.4byte	0x1450e
+	.8byte	.LVL559
+	.4byte	0x145cc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13783
+	.4byte	0x13841
 	.8byte	.LBB1594
 	.8byte	.LBE1594-.LBB1594
 	.byte	0x1
-	.2byte	0x6a0
-	.4byte	0xec37
+	.2byte	0x6c9
+	.4byte	0xec63
 	.uleb128 0x55
-	.4byte	0x137ab
+	.4byte	0x13869
 	.uleb128 0x55
-	.4byte	0x1379f
+	.4byte	0x1385d
 	.uleb128 0x55
-	.4byte	0x13794
+	.4byte	0x13852
 	.uleb128 0x5e
-	.4byte	0x137b8
+	.4byte	0x13876
 	.8byte	.LBB1595
 	.8byte	.LBE1595-.LBB1595
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x137ec
+	.4byte	0x138aa
 	.uleb128 0x55
-	.4byte	0x137e0
+	.4byte	0x1389e
 	.uleb128 0x55
-	.4byte	0x137d4
+	.4byte	0x13892
 	.uleb128 0x55
-	.4byte	0x137c9
+	.4byte	0x13887
 	.uleb128 0x57
 	.8byte	.LBB1596
 	.8byte	.LBE1596-.LBB1596
 	.uleb128 0x58
-	.4byte	0x137f7
+	.4byte	0x138b5
 	.uleb128 0x4f
-	.8byte	.LVL550
-	.4byte	0x1450e
+	.8byte	.LVL560
+	.4byte	0x145cc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13783
+	.4byte	0x13841
 	.8byte	.LBB1597
 	.8byte	.LBE1597-.LBB1597
 	.byte	0x1
-	.2byte	0x6a3
-	.4byte	0xecb4
+	.2byte	0x6cc
+	.4byte	0xece0
 	.uleb128 0x55
-	.4byte	0x137ab
+	.4byte	0x13869
 	.uleb128 0x55
-	.4byte	0x1379f
+	.4byte	0x1385d
 	.uleb128 0x55
-	.4byte	0x13794
+	.4byte	0x13852
 	.uleb128 0x5e
-	.4byte	0x137b8
+	.4byte	0x13876
 	.8byte	.LBB1598
 	.8byte	.LBE1598-.LBB1598
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x137ec
+	.4byte	0x138aa
 	.uleb128 0x55
-	.4byte	0x137e0
+	.4byte	0x1389e
 	.uleb128 0x55
-	.4byte	0x137d4
+	.4byte	0x13892
 	.uleb128 0x55
-	.4byte	0x137c9
+	.4byte	0x13887
 	.uleb128 0x57
 	.8byte	.LBB1599
 	.8byte	.LBE1599-.LBB1599
 	.uleb128 0x58
-	.4byte	0x137f7
+	.4byte	0x138b5
 	.uleb128 0x4f
-	.8byte	.LVL551
-	.4byte	0x1450e
+	.8byte	.LVL561
+	.4byte	0x145cc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13783
+	.4byte	0x13841
 	.8byte	.LBB1600
 	.8byte	.LBE1600-.LBB1600
 	.byte	0x1
-	.2byte	0x6a6
-	.4byte	0xed31
+	.2byte	0x6cf
+	.4byte	0xed5d
 	.uleb128 0x55
-	.4byte	0x137ab
+	.4byte	0x13869
 	.uleb128 0x55
-	.4byte	0x1379f
+	.4byte	0x1385d
 	.uleb128 0x55
-	.4byte	0x13794
+	.4byte	0x13852
 	.uleb128 0x5e
-	.4byte	0x137b8
+	.4byte	0x13876
 	.8byte	.LBB1601
 	.8byte	.LBE1601-.LBB1601
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x137ec
+	.4byte	0x138aa
 	.uleb128 0x55
-	.4byte	0x137e0
+	.4byte	0x1389e
 	.uleb128 0x55
-	.4byte	0x137d4
+	.4byte	0x13892
 	.uleb128 0x55
-	.4byte	0x137c9
+	.4byte	0x13887
 	.uleb128 0x57
 	.8byte	.LBB1602
 	.8byte	.LBE1602-.LBB1602
 	.uleb128 0x58
-	.4byte	0x137f7
+	.4byte	0x138b5
 	.uleb128 0x4f
-	.8byte	.LVL552
-	.4byte	0x1450e
+	.8byte	.LVL562
+	.4byte	0x145cc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13783
+	.4byte	0x13841
 	.8byte	.LBB1603
 	.8byte	.LBE1603-.LBB1603
 	.byte	0x1
-	.2byte	0x6a9
-	.4byte	0xedae
+	.2byte	0x6d2
+	.4byte	0xedda
 	.uleb128 0x55
-	.4byte	0x137ab
+	.4byte	0x13869
 	.uleb128 0x55
-	.4byte	0x1379f
+	.4byte	0x1385d
 	.uleb128 0x55
-	.4byte	0x13794
+	.4byte	0x13852
 	.uleb128 0x5e
-	.4byte	0x137b8
+	.4byte	0x13876
 	.8byte	.LBB1604
 	.8byte	.LBE1604-.LBB1604
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x137ec
+	.4byte	0x138aa
 	.uleb128 0x55
-	.4byte	0x137e0
+	.4byte	0x1389e
 	.uleb128 0x55
-	.4byte	0x137d4
+	.4byte	0x13892
 	.uleb128 0x55
-	.4byte	0x137c9
+	.4byte	0x13887
 	.uleb128 0x57
 	.8byte	.LBB1605
 	.8byte	.LBE1605-.LBB1605
 	.uleb128 0x58
-	.4byte	0x137f7
+	.4byte	0x138b5
 	.uleb128 0x4f
-	.8byte	.LVL553
-	.4byte	0x1450e
+	.8byte	.LVL563
+	.4byte	0x145cc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13783
+	.4byte	0x13841
 	.8byte	.LBB1606
 	.8byte	.LBE1606-.LBB1606
 	.byte	0x1
-	.2byte	0x6ac
-	.4byte	0xee2b
+	.2byte	0x6d5
+	.4byte	0xee57
 	.uleb128 0x55
-	.4byte	0x137ab
+	.4byte	0x13869
 	.uleb128 0x55
-	.4byte	0x1379f
+	.4byte	0x1385d
 	.uleb128 0x55
-	.4byte	0x13794
+	.4byte	0x13852
 	.uleb128 0x5e
-	.4byte	0x137b8
+	.4byte	0x13876
 	.8byte	.LBB1607
 	.8byte	.LBE1607-.LBB1607
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x137ec
+	.4byte	0x138aa
 	.uleb128 0x55
-	.4byte	0x137e0
+	.4byte	0x1389e
 	.uleb128 0x55
-	.4byte	0x137d4
+	.4byte	0x13892
 	.uleb128 0x55
-	.4byte	0x137c9
+	.4byte	0x13887
 	.uleb128 0x57
 	.8byte	.LBB1608
 	.8byte	.LBE1608-.LBB1608
 	.uleb128 0x58
-	.4byte	0x137f7
+	.4byte	0x138b5
 	.uleb128 0x4f
-	.8byte	.LVL554
-	.4byte	0x1450e
+	.8byte	.LVL564
+	.4byte	0x145cc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13783
+	.4byte	0x13841
 	.8byte	.LBB1609
 	.8byte	.LBE1609-.LBB1609
 	.byte	0x1
-	.2byte	0x6af
-	.4byte	0xeea8
+	.2byte	0x6d8
+	.4byte	0xeed4
 	.uleb128 0x55
-	.4byte	0x137ab
+	.4byte	0x13869
 	.uleb128 0x55
-	.4byte	0x1379f
+	.4byte	0x1385d
 	.uleb128 0x55
-	.4byte	0x13794
+	.4byte	0x13852
 	.uleb128 0x5e
-	.4byte	0x137b8
+	.4byte	0x13876
 	.8byte	.LBB1610
 	.8byte	.LBE1610-.LBB1610
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x137ec
+	.4byte	0x138aa
 	.uleb128 0x55
-	.4byte	0x137e0
+	.4byte	0x1389e
 	.uleb128 0x55
-	.4byte	0x137d4
+	.4byte	0x13892
 	.uleb128 0x55
-	.4byte	0x137c9
+	.4byte	0x13887
 	.uleb128 0x57
 	.8byte	.LBB1611
 	.8byte	.LBE1611-.LBB1611
 	.uleb128 0x58
-	.4byte	0x137f7
+	.4byte	0x138b5
 	.uleb128 0x4f
-	.8byte	.LVL555
-	.4byte	0x1450e
+	.8byte	.LVL565
+	.4byte	0x145cc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13783
+	.4byte	0x13841
 	.8byte	.LBB1612
 	.8byte	.LBE1612-.LBB1612
 	.byte	0x1
-	.2byte	0x6b2
-	.4byte	0xef25
+	.2byte	0x6db
+	.4byte	0xef51
 	.uleb128 0x55
-	.4byte	0x137ab
+	.4byte	0x13869
 	.uleb128 0x55
-	.4byte	0x1379f
+	.4byte	0x1385d
 	.uleb128 0x55
-	.4byte	0x13794
+	.4byte	0x13852
 	.uleb128 0x5e
-	.4byte	0x137b8
+	.4byte	0x13876
 	.8byte	.LBB1613
 	.8byte	.LBE1613-.LBB1613
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x137ec
+	.4byte	0x138aa
 	.uleb128 0x55
-	.4byte	0x137e0
+	.4byte	0x1389e
 	.uleb128 0x55
-	.4byte	0x137d4
+	.4byte	0x13892
 	.uleb128 0x55
-	.4byte	0x137c9
+	.4byte	0x13887
 	.uleb128 0x57
 	.8byte	.LBB1614
 	.8byte	.LBE1614-.LBB1614
 	.uleb128 0x58
-	.4byte	0x137f7
+	.4byte	0x138b5
 	.uleb128 0x4f
-	.8byte	.LVL556
-	.4byte	0x1450e
+	.8byte	.LVL566
+	.4byte	0x145cc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13783
+	.4byte	0x13841
 	.8byte	.LBB1615
 	.8byte	.LBE1615-.LBB1615
 	.byte	0x1
-	.2byte	0x6b5
-	.4byte	0xefa2
+	.2byte	0x6de
+	.4byte	0xefce
 	.uleb128 0x55
-	.4byte	0x137ab
+	.4byte	0x13869
 	.uleb128 0x55
-	.4byte	0x1379f
+	.4byte	0x1385d
 	.uleb128 0x55
-	.4byte	0x13794
+	.4byte	0x13852
 	.uleb128 0x5e
-	.4byte	0x137b8
+	.4byte	0x13876
 	.8byte	.LBB1616
 	.8byte	.LBE1616-.LBB1616
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x137ec
+	.4byte	0x138aa
 	.uleb128 0x55
-	.4byte	0x137e0
+	.4byte	0x1389e
 	.uleb128 0x55
-	.4byte	0x137d4
+	.4byte	0x13892
 	.uleb128 0x55
-	.4byte	0x137c9
+	.4byte	0x13887
 	.uleb128 0x57
 	.8byte	.LBB1617
 	.8byte	.LBE1617-.LBB1617
 	.uleb128 0x58
-	.4byte	0x137f7
+	.4byte	0x138b5
 	.uleb128 0x4f
-	.8byte	.LVL557
-	.4byte	0x1450e
+	.8byte	.LVL567
+	.4byte	0x145cc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13783
+	.4byte	0x13841
 	.8byte	.LBB1618
 	.8byte	.LBE1618-.LBB1618
 	.byte	0x1
-	.2byte	0x6b8
-	.4byte	0xf01f
+	.2byte	0x6e1
+	.4byte	0xf04b
 	.uleb128 0x55
-	.4byte	0x137ab
+	.4byte	0x13869
 	.uleb128 0x55
-	.4byte	0x1379f
+	.4byte	0x1385d
 	.uleb128 0x55
-	.4byte	0x13794
+	.4byte	0x13852
 	.uleb128 0x5e
-	.4byte	0x137b8
+	.4byte	0x13876
 	.8byte	.LBB1619
 	.8byte	.LBE1619-.LBB1619
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x137ec
+	.4byte	0x138aa
 	.uleb128 0x55
-	.4byte	0x137e0
+	.4byte	0x1389e
 	.uleb128 0x55
-	.4byte	0x137d4
+	.4byte	0x13892
 	.uleb128 0x55
-	.4byte	0x137c9
+	.4byte	0x13887
 	.uleb128 0x57
 	.8byte	.LBB1620
 	.8byte	.LBE1620-.LBB1620
 	.uleb128 0x58
-	.4byte	0x137f7
+	.4byte	0x138b5
 	.uleb128 0x4f
-	.8byte	.LVL558
-	.4byte	0x1450e
+	.8byte	.LVL568
+	.4byte	0x145cc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13783
+	.4byte	0x13841
 	.8byte	.LBB1621
 	.8byte	.LBE1621-.LBB1621
 	.byte	0x1
-	.2byte	0x6bb
-	.4byte	0xf09c
+	.2byte	0x6e4
+	.4byte	0xf0c8
 	.uleb128 0x55
-	.4byte	0x137ab
+	.4byte	0x13869
 	.uleb128 0x55
-	.4byte	0x1379f
+	.4byte	0x1385d
 	.uleb128 0x55
-	.4byte	0x13794
+	.4byte	0x13852
 	.uleb128 0x5e
-	.4byte	0x137b8
+	.4byte	0x13876
 	.8byte	.LBB1622
 	.8byte	.LBE1622-.LBB1622
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x137ec
+	.4byte	0x138aa
 	.uleb128 0x55
-	.4byte	0x137e0
+	.4byte	0x1389e
 	.uleb128 0x55
-	.4byte	0x137d4
+	.4byte	0x13892
 	.uleb128 0x55
-	.4byte	0x137c9
+	.4byte	0x13887
 	.uleb128 0x57
 	.8byte	.LBB1623
 	.8byte	.LBE1623-.LBB1623
 	.uleb128 0x58
-	.4byte	0x137f7
+	.4byte	0x138b5
 	.uleb128 0x4f
-	.8byte	.LVL559
-	.4byte	0x1450e
+	.8byte	.LVL569
+	.4byte	0x145cc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13783
+	.4byte	0x13841
 	.8byte	.LBB1624
 	.8byte	.LBE1624-.LBB1624
 	.byte	0x1
-	.2byte	0x6be
-	.4byte	0xf119
+	.2byte	0x6e7
+	.4byte	0xf145
 	.uleb128 0x55
-	.4byte	0x137ab
+	.4byte	0x13869
 	.uleb128 0x55
-	.4byte	0x1379f
+	.4byte	0x1385d
 	.uleb128 0x55
-	.4byte	0x13794
+	.4byte	0x13852
 	.uleb128 0x5e
-	.4byte	0x137b8
+	.4byte	0x13876
 	.8byte	.LBB1625
 	.8byte	.LBE1625-.LBB1625
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x137ec
+	.4byte	0x138aa
 	.uleb128 0x55
-	.4byte	0x137e0
+	.4byte	0x1389e
 	.uleb128 0x55
-	.4byte	0x137d4
+	.4byte	0x13892
 	.uleb128 0x55
-	.4byte	0x137c9
+	.4byte	0x13887
 	.uleb128 0x57
 	.8byte	.LBB1626
 	.8byte	.LBE1626-.LBB1626
 	.uleb128 0x58
-	.4byte	0x137f7
+	.4byte	0x138b5
 	.uleb128 0x4f
-	.8byte	.LVL560
-	.4byte	0x1450e
+	.8byte	.LVL570
+	.4byte	0x145cc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13783
+	.4byte	0x13841
 	.8byte	.LBB1627
 	.8byte	.LBE1627-.LBB1627
 	.byte	0x1
-	.2byte	0x6c1
-	.4byte	0xf196
+	.2byte	0x6ea
+	.4byte	0xf1c2
 	.uleb128 0x55
-	.4byte	0x137ab
+	.4byte	0x13869
 	.uleb128 0x55
-	.4byte	0x1379f
+	.4byte	0x1385d
 	.uleb128 0x55
-	.4byte	0x13794
+	.4byte	0x13852
 	.uleb128 0x5e
-	.4byte	0x137b8
+	.4byte	0x13876
 	.8byte	.LBB1628
 	.8byte	.LBE1628-.LBB1628
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x137ec
+	.4byte	0x138aa
 	.uleb128 0x55
-	.4byte	0x137e0
+	.4byte	0x1389e
 	.uleb128 0x55
-	.4byte	0x137d4
+	.4byte	0x13892
 	.uleb128 0x55
-	.4byte	0x137c9
+	.4byte	0x13887
 	.uleb128 0x57
 	.8byte	.LBB1629
 	.8byte	.LBE1629-.LBB1629
 	.uleb128 0x58
-	.4byte	0x137f7
+	.4byte	0x138b5
 	.uleb128 0x4f
-	.8byte	.LVL561
-	.4byte	0x1450e
+	.8byte	.LVL571
+	.4byte	0x145cc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13783
+	.4byte	0x13841
 	.8byte	.LBB1630
 	.8byte	.LBE1630-.LBB1630
 	.byte	0x1
-	.2byte	0x6c4
-	.4byte	0xf213
+	.2byte	0x6ed
+	.4byte	0xf23f
 	.uleb128 0x55
-	.4byte	0x137ab
+	.4byte	0x13869
 	.uleb128 0x55
-	.4byte	0x1379f
+	.4byte	0x1385d
 	.uleb128 0x55
-	.4byte	0x13794
+	.4byte	0x13852
 	.uleb128 0x5e
-	.4byte	0x137b8
+	.4byte	0x13876
 	.8byte	.LBB1631
 	.8byte	.LBE1631-.LBB1631
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x137ec
+	.4byte	0x138aa
 	.uleb128 0x55
-	.4byte	0x137e0
+	.4byte	0x1389e
 	.uleb128 0x55
-	.4byte	0x137d4
+	.4byte	0x13892
 	.uleb128 0x55
-	.4byte	0x137c9
+	.4byte	0x13887
 	.uleb128 0x57
 	.8byte	.LBB1632
 	.8byte	.LBE1632-.LBB1632
 	.uleb128 0x58
-	.4byte	0x137f7
+	.4byte	0x138b5
 	.uleb128 0x4f
-	.8byte	.LVL562
-	.4byte	0x1450e
+	.8byte	.LVL572
+	.4byte	0x145cc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13783
+	.4byte	0x13841
 	.8byte	.LBB1633
 	.8byte	.LBE1633-.LBB1633
 	.byte	0x1
-	.2byte	0x6c7
-	.4byte	0xf290
+	.2byte	0x6f0
+	.4byte	0xf2bc
 	.uleb128 0x55
-	.4byte	0x137ab
+	.4byte	0x13869
 	.uleb128 0x55
-	.4byte	0x1379f
+	.4byte	0x1385d
 	.uleb128 0x55
-	.4byte	0x13794
+	.4byte	0x13852
 	.uleb128 0x5e
-	.4byte	0x137b8
+	.4byte	0x13876
 	.8byte	.LBB1634
 	.8byte	.LBE1634-.LBB1634
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x137ec
+	.4byte	0x138aa
 	.uleb128 0x55
-	.4byte	0x137e0
+	.4byte	0x1389e
 	.uleb128 0x55
-	.4byte	0x137d4
+	.4byte	0x13892
 	.uleb128 0x55
-	.4byte	0x137c9
+	.4byte	0x13887
 	.uleb128 0x57
 	.8byte	.LBB1635
 	.8byte	.LBE1635-.LBB1635
 	.uleb128 0x58
-	.4byte	0x137f7
+	.4byte	0x138b5
 	.uleb128 0x4f
-	.8byte	.LVL563
-	.4byte	0x1450e
+	.8byte	.LVL573
+	.4byte	0x145cc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13783
+	.4byte	0x13841
 	.8byte	.LBB1636
 	.8byte	.LBE1636-.LBB1636
 	.byte	0x1
-	.2byte	0x6ca
-	.4byte	0xf30d
+	.2byte	0x6f3
+	.4byte	0xf339
 	.uleb128 0x55
-	.4byte	0x137ab
+	.4byte	0x13869
 	.uleb128 0x55
-	.4byte	0x1379f
+	.4byte	0x1385d
 	.uleb128 0x55
-	.4byte	0x13794
+	.4byte	0x13852
 	.uleb128 0x5e
-	.4byte	0x137b8
+	.4byte	0x13876
 	.8byte	.LBB1637
 	.8byte	.LBE1637-.LBB1637
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x137ec
+	.4byte	0x138aa
 	.uleb128 0x55
-	.4byte	0x137e0
+	.4byte	0x1389e
 	.uleb128 0x55
-	.4byte	0x137d4
+	.4byte	0x13892
 	.uleb128 0x55
-	.4byte	0x137c9
+	.4byte	0x13887
 	.uleb128 0x57
 	.8byte	.LBB1638
 	.8byte	.LBE1638-.LBB1638
 	.uleb128 0x58
-	.4byte	0x137f7
+	.4byte	0x138b5
 	.uleb128 0x4f
-	.8byte	.LVL564
-	.4byte	0x1450e
+	.8byte	.LVL574
+	.4byte	0x145cc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13783
+	.4byte	0x13841
 	.8byte	.LBB1639
 	.8byte	.LBE1639-.LBB1639
 	.byte	0x1
-	.2byte	0x6cd
-	.4byte	0xf38a
+	.2byte	0x6f6
+	.4byte	0xf3b6
 	.uleb128 0x55
-	.4byte	0x137ab
+	.4byte	0x13869
 	.uleb128 0x55
-	.4byte	0x1379f
+	.4byte	0x1385d
 	.uleb128 0x55
-	.4byte	0x13794
+	.4byte	0x13852
 	.uleb128 0x5e
-	.4byte	0x137b8
+	.4byte	0x13876
 	.8byte	.LBB1640
 	.8byte	.LBE1640-.LBB1640
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x137ec
+	.4byte	0x138aa
 	.uleb128 0x55
-	.4byte	0x137e0
+	.4byte	0x1389e
 	.uleb128 0x55
-	.4byte	0x137d4
+	.4byte	0x13892
 	.uleb128 0x55
-	.4byte	0x137c9
+	.4byte	0x13887
 	.uleb128 0x57
 	.8byte	.LBB1641
 	.8byte	.LBE1641-.LBB1641
 	.uleb128 0x58
-	.4byte	0x137f7
+	.4byte	0x138b5
 	.uleb128 0x4f
-	.8byte	.LVL565
-	.4byte	0x1450e
+	.8byte	.LVL575
+	.4byte	0x145cc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13783
+	.4byte	0x13841
 	.8byte	.LBB1642
 	.8byte	.LBE1642-.LBB1642
 	.byte	0x1
-	.2byte	0x6d0
-	.4byte	0xf407
+	.2byte	0x6f9
+	.4byte	0xf433
 	.uleb128 0x55
-	.4byte	0x137ab
+	.4byte	0x13869
 	.uleb128 0x55
-	.4byte	0x1379f
+	.4byte	0x1385d
 	.uleb128 0x55
-	.4byte	0x13794
+	.4byte	0x13852
 	.uleb128 0x5e
-	.4byte	0x137b8
+	.4byte	0x13876
 	.8byte	.LBB1643
 	.8byte	.LBE1643-.LBB1643
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x137ec
+	.4byte	0x138aa
 	.uleb128 0x55
-	.4byte	0x137e0
+	.4byte	0x1389e
 	.uleb128 0x55
-	.4byte	0x137d4
+	.4byte	0x13892
 	.uleb128 0x55
-	.4byte	0x137c9
+	.4byte	0x13887
 	.uleb128 0x57
 	.8byte	.LBB1644
 	.8byte	.LBE1644-.LBB1644
 	.uleb128 0x58
-	.4byte	0x137f7
+	.4byte	0x138b5
 	.uleb128 0x4f
-	.8byte	.LVL566
-	.4byte	0x1450e
+	.8byte	.LVL576
+	.4byte	0x145cc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13783
+	.4byte	0x13841
 	.8byte	.LBB1645
 	.8byte	.LBE1645-.LBB1645
 	.byte	0x1
-	.2byte	0x6d3
-	.4byte	0xf484
+	.2byte	0x6fc
+	.4byte	0xf4b0
 	.uleb128 0x55
-	.4byte	0x137ab
+	.4byte	0x13869
 	.uleb128 0x55
-	.4byte	0x1379f
+	.4byte	0x1385d
 	.uleb128 0x55
-	.4byte	0x13794
+	.4byte	0x13852
 	.uleb128 0x5e
-	.4byte	0x137b8
+	.4byte	0x13876
 	.8byte	.LBB1646
 	.8byte	.LBE1646-.LBB1646
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x137ec
+	.4byte	0x138aa
 	.uleb128 0x55
-	.4byte	0x137e0
+	.4byte	0x1389e
 	.uleb128 0x55
-	.4byte	0x137d4
+	.4byte	0x13892
 	.uleb128 0x55
-	.4byte	0x137c9
+	.4byte	0x13887
 	.uleb128 0x57
 	.8byte	.LBB1647
 	.8byte	.LBE1647-.LBB1647
 	.uleb128 0x58
-	.4byte	0x137f7
+	.4byte	0x138b5
 	.uleb128 0x4f
-	.8byte	.LVL567
-	.4byte	0x1450e
+	.8byte	.LVL577
+	.4byte	0x145cc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x13783
+	.4byte	0x13841
 	.8byte	.LBB1648
 	.8byte	.LBE1648-.LBB1648
 	.byte	0x1
-	.2byte	0x6d6
+	.2byte	0x6ff
 	.uleb128 0x55
-	.4byte	0x137ab
+	.4byte	0x13869
 	.uleb128 0x55
-	.4byte	0x1379f
+	.4byte	0x1385d
 	.uleb128 0x55
-	.4byte	0x13794
+	.4byte	0x13852
 	.uleb128 0x5e
-	.4byte	0x137b8
+	.4byte	0x13876
 	.8byte	.LBB1649
 	.8byte	.LBE1649-.LBB1649
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x55
-	.4byte	0x137ec
+	.4byte	0x138aa
 	.uleb128 0x55
-	.4byte	0x137e0
+	.4byte	0x1389e
 	.uleb128 0x55
-	.4byte	0x137d4
+	.4byte	0x13892
 	.uleb128 0x55
-	.4byte	0x137c9
+	.4byte	0x13887
 	.uleb128 0x57
 	.8byte	.LBB1650
 	.8byte	.LBE1650-.LBB1650
 	.uleb128 0x58
-	.4byte	0x137f7
+	.4byte	0x138b5
 	.uleb128 0x4f
-	.8byte	.LVL568
-	.4byte	0x1450e
+	.8byte	.LVL578
+	.4byte	0x145cc
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0xff0e
+	.4byte	0xff3a
 	.8byte	.LBB1657
 	.4byte	.Ldebug_ranges0+0xca0
 	.byte	0x1
-	.2byte	0x9bc
-	.4byte	0xf6ac
+	.2byte	0x9e5
+	.4byte	0xf6d8
 	.uleb128 0x55
-	.4byte	0xff1f
+	.4byte	0xff4b
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xca0
 	.uleb128 0x61
-	.4byte	0xff2b
-	.4byte	.LLST156
+	.4byte	0xff57
+	.4byte	.LLST160
 	.uleb128 0x58
-	.4byte	0xff37
+	.4byte	0xff63
 	.uleb128 0x58
-	.4byte	0xff43
+	.4byte	0xff6f
 	.uleb128 0x58
-	.4byte	0xff4f
+	.4byte	0xff7b
 	.uleb128 0x62
-	.4byte	0xff5b
+	.4byte	0xff87
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x58
-	.4byte	0xff65
+	.4byte	0xff91
 	.uleb128 0x58
-	.4byte	0xff71
+	.4byte	0xff9d
 	.uleb128 0x58
-	.4byte	0xff7d
+	.4byte	0xffa9
 	.uleb128 0x5c
-	.4byte	0x13898
+	.4byte	0x13956
 	.8byte	.LBB1659
 	.4byte	.Ldebug_ranges0+0xd10
 	.byte	0x1
-	.2byte	0x8a4
-	.4byte	0xf56f
+	.2byte	0x8cd
+	.4byte	0xf59b
 	.uleb128 0x55
-	.4byte	0x138a8
+	.4byte	0x13966
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13862
+	.4byte	0x13920
 	.8byte	.LBB1663
 	.4byte	.Ldebug_ranges0+0xd40
 	.byte	0x1
-	.2byte	0x8bf
-	.4byte	0xf5a4
+	.2byte	0x8e8
+	.4byte	0xf5d0
 	.uleb128 0x55
-	.4byte	0x1388b
+	.4byte	0x13949
 	.uleb128 0x55
-	.4byte	0x1387f
+	.4byte	0x1393d
 	.uleb128 0x55
-	.4byte	0x13873
+	.4byte	0x13931
 	.uleb128 0x4f
-	.8byte	.LVL574
-	.4byte	0x14501
+	.8byte	.LVL584
+	.4byte	0x145bf
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13862
+	.4byte	0x13920
 	.8byte	.LBB1671
 	.8byte	.LBE1671-.LBB1671
 	.byte	0x1
-	.2byte	0x8c2
-	.4byte	0xf5dd
+	.2byte	0x8eb
+	.4byte	0xf609
 	.uleb128 0x55
-	.4byte	0x1388b
+	.4byte	0x13949
 	.uleb128 0x55
-	.4byte	0x1387f
+	.4byte	0x1393d
 	.uleb128 0x55
-	.4byte	0x13873
+	.4byte	0x13931
 	.uleb128 0x4f
-	.8byte	.LVL575
-	.4byte	0x14501
+	.8byte	.LVL585
+	.4byte	0x145bf
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13862
+	.4byte	0x13920
 	.8byte	.LBB1673
 	.8byte	.LBE1673-.LBB1673
 	.byte	0x1
-	.2byte	0x8c5
-	.4byte	0xf616
+	.2byte	0x8ee
+	.4byte	0xf642
 	.uleb128 0x55
-	.4byte	0x1388b
+	.4byte	0x13949
 	.uleb128 0x55
-	.4byte	0x1387f
+	.4byte	0x1393d
 	.uleb128 0x55
-	.4byte	0x13873
+	.4byte	0x13931
 	.uleb128 0x4f
-	.8byte	.LVL576
-	.4byte	0x14501
+	.8byte	.LVL586
+	.4byte	0x145bf
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13862
+	.4byte	0x13920
 	.8byte	.LBB1675
 	.8byte	.LBE1675-.LBB1675
 	.byte	0x1
-	.2byte	0x8cd
-	.4byte	0xf64f
+	.2byte	0x8f6
+	.4byte	0xf67b
 	.uleb128 0x55
-	.4byte	0x1388b
+	.4byte	0x13949
 	.uleb128 0x55
-	.4byte	0x1387f
+	.4byte	0x1393d
 	.uleb128 0x55
-	.4byte	0x13873
+	.4byte	0x13931
 	.uleb128 0x4f
-	.8byte	.LVL577
-	.4byte	0x14501
+	.8byte	.LVL587
+	.4byte	0x145bf
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL570
-	.4byte	0x1451b
+	.8byte	.LVL580
+	.4byte	0x145d9
 	.uleb128 0x4f
-	.8byte	.LVL571
-	.4byte	0x14528
+	.8byte	.LVL581
+	.4byte	0x145e6
 	.uleb128 0x4f
-	.8byte	.LVL572
-	.4byte	0x14534
+	.8byte	.LVL582
+	.4byte	0x145f2
 	.uleb128 0x4f
-	.8byte	.LVL573
-	.4byte	0x14540
+	.8byte	.LVL583
+	.4byte	0x145fe
 	.uleb128 0x4f
-	.8byte	.LVL578
-	.4byte	0x1454c
+	.8byte	.LVL588
+	.4byte	0x1460a
 	.uleb128 0x4f
-	.8byte	.LVL579
-	.4byte	0x14556
+	.8byte	.LVL589
+	.4byte	0x14614
 	.uleb128 0x4f
-	.8byte	.LVL592
-	.4byte	0x14562
+	.8byte	.LVL602
+	.4byte	0x14620
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0xff88
+	.4byte	0xffb4
 	.8byte	.LBB1684
 	.4byte	.Ldebug_ranges0+0xd90
 	.byte	0x1
-	.2byte	0x9c3
-	.4byte	0xf785
+	.2byte	0x9ec
+	.4byte	0xf7b1
 	.uleb128 0x55
-	.4byte	0xff99
+	.4byte	0xffc5
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xd90
 	.uleb128 0x58
-	.4byte	0xffa5
+	.4byte	0xffd1
 	.uleb128 0x61
-	.4byte	0xffb1
-	.4byte	.LLST157
+	.4byte	0xffdd
+	.4byte	.LLST161
 	.uleb128 0x58
-	.4byte	0xffbd
+	.4byte	0xffe9
 	.uleb128 0x62
-	.4byte	0xffc9
+	.4byte	0xfff5
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x61
-	.4byte	0xffd3
-	.4byte	.LLST158
+	.4byte	0xffff
+	.4byte	.LLST162
 	.uleb128 0x58
-	.4byte	0xffdf
+	.4byte	0x1000b
 	.uleb128 0x58
-	.4byte	0xffeb
+	.4byte	0x10017
 	.uleb128 0x5c
-	.4byte	0x13898
+	.4byte	0x13956
 	.8byte	.LBB1686
 	.4byte	.Ldebug_ranges0+0xdf0
 	.byte	0x1
-	.2byte	0x874
-	.4byte	0xf71b
+	.2byte	0x89d
+	.4byte	0xf747
 	.uleb128 0x55
-	.4byte	0x138a8
+	.4byte	0x13966
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL581
-	.4byte	0x1451b
+	.8byte	.LVL591
+	.4byte	0x145d9
 	.uleb128 0x4f
-	.8byte	.LVL582
-	.4byte	0x14528
+	.8byte	.LVL592
+	.4byte	0x145e6
 	.uleb128 0x4f
-	.8byte	.LVL596
-	.4byte	0x14534
+	.8byte	.LVL606
+	.4byte	0x145f2
 	.uleb128 0x4f
-	.8byte	.LVL597
-	.4byte	0x1456f
+	.8byte	.LVL607
+	.4byte	0x1462d
 	.uleb128 0x4f
-	.8byte	.LVL684
-	.4byte	0x14562
+	.8byte	.LVL694
+	.4byte	0x14620
 	.uleb128 0x4f
-	.8byte	.LVL685
-	.4byte	0x1457b
+	.8byte	.LVL695
+	.4byte	0x14639
 	.uleb128 0x4f
-	.8byte	.LVL686
-	.4byte	0x14562
+	.8byte	.LVL696
+	.4byte	0x14620
 	.uleb128 0x4f
-	.8byte	.LVL700
-	.4byte	0x14562
+	.8byte	.LVL710
+	.4byte	0x14620
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0xfed6
+	.4byte	0xff02
 	.8byte	.LBB1696
 	.4byte	.Ldebug_ranges0+0xe20
 	.byte	0x1
-	.2byte	0x9ca
-	.4byte	0xf91f
+	.2byte	0x9f3
+	.4byte	0xf94b
 	.uleb128 0x55
-	.4byte	0xfee7
+	.4byte	0xff13
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xe20
 	.uleb128 0x62
-	.4byte	0xfef3
+	.4byte	0xff1f
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5c
-	.4byte	0x13a5d
+	.4byte	0x13b1b
 	.8byte	.LBB1698
 	.4byte	.Ldebug_ranges0+0xe60
 	.byte	0x1
-	.2byte	0x8da
-	.4byte	0xf80c
+	.2byte	0x903
+	.4byte	0xf838
 	.uleb128 0x55
-	.4byte	0x13a6a
+	.4byte	0x13b28
 	.uleb128 0x57
 	.8byte	.LBB1700
 	.8byte	.LBE1700-.LBB1700
 	.uleb128 0x58
-	.4byte	0x13a96
+	.4byte	0x13b54
 	.uleb128 0x5d
-	.4byte	0x13c42
+	.4byte	0x13d00
 	.8byte	.LBB1701
 	.8byte	.LBE1701-.LBB1701
 	.byte	0x10
 	.byte	0x1c
 	.uleb128 0x55
-	.4byte	0x13c65
+	.4byte	0x13d23
 	.uleb128 0x55
-	.4byte	0x13c59
+	.4byte	0x13d17
 	.uleb128 0x55
-	.4byte	0x13c4f
+	.4byte	0x13d0d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13b7e
+	.4byte	0x13c3c
 	.8byte	.LBB1705
 	.8byte	.LBE1705-.LBB1705
 	.byte	0x1
-	.2byte	0x8e4
-	.4byte	0xf857
+	.2byte	0x90d
+	.4byte	0xf883
 	.uleb128 0x55
-	.4byte	0x13b94
+	.4byte	0x13c52
 	.uleb128 0x55
-	.4byte	0x13b8b
+	.4byte	0x13c49
 	.uleb128 0x57
 	.8byte	.LBB1706
 	.8byte	.LBE1706-.LBB1706
 	.uleb128 0x61
-	.4byte	0x13b9d
-	.4byte	.LLST159
+	.4byte	0x13c5b
+	.4byte	.LLST163
 	.uleb128 0x61
-	.4byte	0x13ba7
-	.4byte	.LLST160
+	.4byte	0x13c65
+	.4byte	.LLST164
 	.byte	0
 	.byte	0
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0xe90
-	.4byte	0xf884
+	.4byte	0xf8b0
 	.uleb128 0x61
-	.4byte	0xff00
-	.4byte	.LLST161
+	.4byte	0xff2c
+	.4byte	.LLST165
 	.uleb128 0x4f
-	.8byte	.LVL605
-	.4byte	0x14587
+	.8byte	.LVL615
+	.4byte	0x14645
 	.uleb128 0x4f
-	.8byte	.LVL607
-	.4byte	0x14593
+	.8byte	.LVL617
+	.4byte	0x14651
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13b7e
+	.4byte	0x13c3c
 	.8byte	.LBB1709
 	.8byte	.LBE1709-.LBB1709
 	.byte	0x1
-	.2byte	0x8ed
-	.4byte	0xf8cf
+	.2byte	0x916
+	.4byte	0xf8fb
 	.uleb128 0x55
-	.4byte	0x13b94
+	.4byte	0x13c52
 	.uleb128 0x55
-	.4byte	0x13b8b
+	.4byte	0x13c49
 	.uleb128 0x57
 	.8byte	.LBB1710
 	.8byte	.LBE1710-.LBB1710
 	.uleb128 0x61
-	.4byte	0x13b9d
-	.4byte	.LLST162
+	.4byte	0x13c5b
+	.4byte	.LLST166
 	.uleb128 0x61
-	.4byte	0x13ba7
-	.4byte	.LLST163
+	.4byte	0x13c65
+	.4byte	.LLST167
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL598
-	.4byte	0x145a0
+	.8byte	.LVL608
+	.4byte	0x1465e
 	.uleb128 0x4f
-	.8byte	.LVL599
-	.4byte	0x14587
+	.8byte	.LVL609
+	.4byte	0x14645
 	.uleb128 0x4f
-	.8byte	.LVL600
-	.4byte	0x145ad
+	.8byte	.LVL610
+	.4byte	0x1466b
 	.uleb128 0x4f
-	.8byte	.LVL608
-	.4byte	0x145ad
+	.8byte	.LVL618
+	.4byte	0x1466b
 	.uleb128 0x4f
-	.8byte	.LVL687
-	.4byte	0x14562
+	.8byte	.LVL697
+	.4byte	0x14620
 	.uleb128 0x4f
-	.8byte	.LVL691
-	.4byte	0x14562
+	.8byte	.LVL701
+	.4byte	0x14620
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0xfebc
+	.4byte	0xfee8
 	.8byte	.LBB1713
 	.8byte	.LBE1713-.LBB1713
 	.byte	0x1
-	.2byte	0x9d1
-	.4byte	0xf9b9
+	.2byte	0x9fa
+	.4byte	0xf9e5
 	.uleb128 0x55
-	.4byte	0xfec9
+	.4byte	0xfef5
 	.uleb128 0x5c
-	.4byte	0x134bb
+	.4byte	0x13579
 	.8byte	.LBB1715
 	.4byte	.Ldebug_ranges0+0xec0
 	.byte	0x1
-	.2byte	0x8fd
-	.4byte	0xf984
+	.2byte	0x926
+	.4byte	0xf9b0
 	.uleb128 0x55
-	.4byte	0x134e0
+	.4byte	0x1359e
 	.uleb128 0x55
-	.4byte	0x134d4
+	.4byte	0x13592
 	.uleb128 0x55
-	.4byte	0x134c8
+	.4byte	0x13586
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xec0
 	.uleb128 0x61
-	.4byte	0x134ec
-	.4byte	.LLST164
+	.4byte	0x135aa
+	.4byte	.LLST168
 	.uleb128 0x4f
-	.8byte	.LVL615
-	.4byte	0x145ba
+	.8byte	.LVL625
+	.4byte	0x14678
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL616
-	.4byte	0x145c6
+	.8byte	.LVL626
+	.4byte	0x14684
 	.uleb128 0x4f
-	.8byte	.LVL617
-	.4byte	0x145d2
+	.8byte	.LVL627
+	.4byte	0x14690
 	.uleb128 0x4f
-	.8byte	.LVL618
-	.4byte	0x145c6
+	.8byte	.LVL628
+	.4byte	0x14684
 	.uleb128 0x4f
-	.8byte	.LVL619
-	.4byte	0x145d2
+	.8byte	.LVL629
+	.4byte	0x14690
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0xfe1a
+	.4byte	0xfe46
 	.8byte	.LBB1725
 	.4byte	.Ldebug_ranges0+0xf20
 	.byte	0x1
-	.2byte	0x9d4
-	.4byte	0xfc5c
+	.2byte	0x9fd
+	.4byte	0xfc88
 	.uleb128 0x55
-	.4byte	0xfe37
+	.4byte	0xfe63
 	.uleb128 0x55
-	.4byte	0xfe2b
+	.4byte	0xfe57
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xf20
 	.uleb128 0x58
-	.4byte	0xfe43
+	.4byte	0xfe6f
 	.uleb128 0x61
-	.4byte	0xfe4f
-	.4byte	.LLST165
+	.4byte	0xfe7b
+	.4byte	.LLST169
 	.uleb128 0x61
-	.4byte	0xfe5b
-	.4byte	.LLST166
+	.4byte	0xfe87
+	.4byte	.LLST170
 	.uleb128 0x61
-	.4byte	0xfe67
-	.4byte	.LLST167
+	.4byte	0xfe93
+	.4byte	.LLST171
 	.uleb128 0x61
-	.4byte	0xfe73
-	.4byte	.LLST168
+	.4byte	0xfe9f
+	.4byte	.LLST172
 	.uleb128 0x61
-	.4byte	0xfe7f
-	.4byte	.LLST169
+	.4byte	0xfeab
+	.4byte	.LLST173
 	.uleb128 0x61
-	.4byte	0xfe8b
-	.4byte	.LLST170
+	.4byte	0xfeb7
+	.4byte	.LLST174
 	.uleb128 0x58
-	.4byte	0xfe97
+	.4byte	0xfec3
 	.uleb128 0x61
-	.4byte	0xfea3
-	.4byte	.LLST171
+	.4byte	0xfecf
+	.4byte	.LLST175
 	.uleb128 0x61
-	.4byte	0xfeaf
-	.4byte	.LLST172
+	.4byte	0xfedb
+	.4byte	.LLST176
 	.uleb128 0x54
-	.4byte	0x118e9
+	.4byte	0x11915
 	.8byte	.LBB1727
 	.8byte	.LBE1727-.LBB1727
 	.byte	0x1
-	.2byte	0x935
-	.4byte	0xfa9b
+	.2byte	0x95e
+	.4byte	0xfac7
 	.uleb128 0x55
-	.4byte	0x118fa
+	.4byte	0x11926
 	.uleb128 0x55
-	.4byte	0x118fa
+	.4byte	0x11926
 	.uleb128 0x57
 	.8byte	.LBB1728
 	.8byte	.LBE1728-.LBB1728
 	.uleb128 0x61
-	.4byte	0x11906
-	.4byte	.LLST173
+	.4byte	0x11932
+	.4byte	.LLST177
 	.uleb128 0x4f
-	.8byte	.LVL636
-	.4byte	0x145de
+	.8byte	.LVL646
+	.4byte	0x1469c
 	.uleb128 0x4f
-	.8byte	.LVL638
-	.4byte	0x14556
+	.8byte	.LVL648
+	.4byte	0x14614
 	.uleb128 0x4f
-	.8byte	.LVL639
-	.4byte	0x145ea
+	.8byte	.LVL649
+	.4byte	0x146a8
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13642
+	.4byte	0x13700
 	.8byte	.LBB1729
 	.8byte	.LBE1729-.LBB1729
 	.byte	0x1
-	.2byte	0x91b
-	.4byte	0xfaf2
+	.2byte	0x944
+	.4byte	0xfb1e
 	.uleb128 0x55
-	.4byte	0x1365f
+	.4byte	0x1371d
 	.uleb128 0x55
-	.4byte	0x13653
+	.4byte	0x13711
 	.uleb128 0x5e
-	.4byte	0x1366c
+	.4byte	0x1372a
 	.8byte	.LBB1730
 	.8byte	.LBE1730-.LBB1730
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x55
-	.4byte	0x13689
+	.4byte	0x13747
 	.uleb128 0x55
-	.4byte	0x1367d
+	.4byte	0x1373b
 	.uleb128 0x4f
-	.8byte	.LVL656
-	.4byte	0x145f6
+	.8byte	.LVL666
+	.4byte	0x146b4
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13642
+	.4byte	0x13700
 	.8byte	.LBB1732
 	.8byte	.LBE1732-.LBB1732
 	.byte	0x1
-	.2byte	0x929
-	.4byte	0xfb49
+	.2byte	0x952
+	.4byte	0xfb75
 	.uleb128 0x55
-	.4byte	0x1365f
+	.4byte	0x1371d
 	.uleb128 0x55
-	.4byte	0x13653
+	.4byte	0x13711
 	.uleb128 0x5e
-	.4byte	0x1366c
+	.4byte	0x1372a
 	.8byte	.LBB1733
 	.8byte	.LBE1733-.LBB1733
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x55
-	.4byte	0x13689
+	.4byte	0x13747
 	.uleb128 0x55
-	.4byte	0x1367d
+	.4byte	0x1373b
 	.uleb128 0x4f
-	.8byte	.LVL669
-	.4byte	0x145f6
+	.8byte	.LVL679
+	.4byte	0x146b4
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL621
-	.4byte	0x14603
-	.uleb128 0x4f
-	.8byte	.LVL623
-	.4byte	0x14603
-	.uleb128 0x4f
-	.8byte	.LVL625
-	.4byte	0x1460f
-	.uleb128 0x4f
-	.8byte	.LVL630
-	.4byte	0x1460f
+	.8byte	.LVL631
+	.4byte	0x146c1
 	.uleb128 0x4f
-	.8byte	.LVL634
-	.4byte	0x144e8
+	.8byte	.LVL633
+	.4byte	0x146c1
 	.uleb128 0x4f
 	.8byte	.LVL635
-	.4byte	0x1461c
+	.4byte	0x146cd
 	.uleb128 0x4f
 	.8byte	.LVL640
-	.4byte	0x14628
+	.4byte	0x146cd
 	.uleb128 0x4f
-	.8byte	.LVL641
-	.4byte	0x14628
+	.8byte	.LVL644
+	.4byte	0x145a6
 	.uleb128 0x4f
-	.8byte	.LVL653
-	.4byte	0x14634
+	.8byte	.LVL645
+	.4byte	0x146da
 	.uleb128 0x4f
-	.8byte	.LVL655
-	.4byte	0x144e8
+	.8byte	.LVL650
+	.4byte	0x146e6
 	.uleb128 0x4f
-	.8byte	.LVL660
-	.4byte	0x14640
+	.8byte	.LVL651
+	.4byte	0x146e6
 	.uleb128 0x4f
 	.8byte	.LVL663
-	.4byte	0x145de
+	.4byte	0x146f2
 	.uleb128 0x4f
 	.8byte	.LVL665
-	.4byte	0x14640
+	.4byte	0x145a6
 	.uleb128 0x4f
-	.8byte	.LVL666
-	.4byte	0x145ea
+	.8byte	.LVL670
+	.4byte	0x146fe
 	.uleb128 0x4f
-	.8byte	.LVL668
-	.4byte	0x144e8
+	.8byte	.LVL673
+	.4byte	0x1469c
 	.uleb128 0x4f
-	.8byte	.LVL672
-	.4byte	0x14640
+	.8byte	.LVL675
+	.4byte	0x146fe
 	.uleb128 0x4f
 	.8byte	.LVL676
-	.4byte	0x145de
+	.4byte	0x146a8
 	.uleb128 0x4f
 	.8byte	.LVL678
-	.4byte	0x14640
+	.4byte	0x145a6
 	.uleb128 0x4f
-	.8byte	.LVL679
-	.4byte	0x145ea
+	.8byte	.LVL682
+	.4byte	0x146fe
 	.uleb128 0x4f
-	.8byte	.LVL698
-	.4byte	0x14562
+	.8byte	.LVL686
+	.4byte	0x1469c
 	.uleb128 0x4f
-	.8byte	.LVL706
-	.4byte	0x14562
+	.8byte	.LVL688
+	.4byte	0x146fe
+	.uleb128 0x4f
+	.8byte	.LVL689
+	.4byte	0x146a8
+	.uleb128 0x4f
+	.8byte	.LVL708
+	.4byte	0x14620
+	.uleb128 0x4f
+	.8byte	.LVL716
+	.4byte	0x14620
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13716
+	.4byte	0x137d4
 	.8byte	.LBB1739
 	.8byte	.LBE1739-.LBB1739
 	.byte	0x1
-	.2byte	0x9d6
-	.4byte	0xfca5
+	.2byte	0x9ff
+	.4byte	0xfcd1
 	.uleb128 0x55
-	.4byte	0x1372f
+	.4byte	0x137ed
 	.uleb128 0x55
-	.4byte	0x13723
+	.4byte	0x137e1
 	.uleb128 0x5d
-	.4byte	0x1381e
+	.4byte	0x138dc
 	.8byte	.LBB1740
 	.8byte	.LBE1740-.LBB1740
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x55
-	.4byte	0x13837
+	.4byte	0x138f5
 	.uleb128 0x55
-	.4byte	0x1382b
+	.4byte	0x138e9
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x1000e
+	.4byte	0x1003a
 	.8byte	.LBB1742
 	.8byte	.LBE1742-.LBB1742
 	.byte	0x1
-	.2byte	0x9d9
-	.4byte	0xfd3c
+	.2byte	0xa02
+	.4byte	0xfd68
 	.uleb128 0x55
-	.4byte	0x1001f
+	.4byte	0x1004b
 	.uleb128 0x4f
-	.8byte	.LVL642
-	.4byte	0x1464a
+	.8byte	.LVL652
+	.4byte	0x14708
 	.uleb128 0x4f
-	.8byte	.LVL643
-	.4byte	0x1464a
+	.8byte	.LVL653
+	.4byte	0x14708
 	.uleb128 0x4f
-	.8byte	.LVL644
-	.4byte	0x14656
+	.8byte	.LVL654
+	.4byte	0x14714
 	.uleb128 0x4f
-	.8byte	.LVL645
-	.4byte	0x14656
+	.8byte	.LVL655
+	.4byte	0x14714
 	.uleb128 0x4f
-	.8byte	.LVL646
-	.4byte	0x14656
+	.8byte	.LVL656
+	.4byte	0x14714
 	.uleb128 0x4f
-	.8byte	.LVL647
-	.4byte	0x14656
+	.8byte	.LVL657
+	.4byte	0x14714
 	.uleb128 0x4f
-	.8byte	.LVL648
-	.4byte	0x14656
+	.8byte	.LVL658
+	.4byte	0x14714
 	.uleb128 0x4f
-	.8byte	.LVL649
-	.4byte	0x14656
+	.8byte	.LVL659
+	.4byte	0x14714
 	.uleb128 0x4f
-	.8byte	.LVL650
-	.4byte	0x14656
+	.8byte	.LVL660
+	.4byte	0x14714
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL525
-	.4byte	0x1451b
+	.8byte	.LVL535
+	.4byte	0x145d9
 	.uleb128 0x4f
-	.8byte	.LVL526
-	.4byte	0x14663
+	.8byte	.LVL536
+	.4byte	0x14721
 	.uleb128 0x4f
-	.8byte	.LVL528
-	.4byte	0x1466f
+	.8byte	.LVL538
+	.4byte	0x1472d
 	.uleb128 0x4f
-	.8byte	.LVL534
-	.4byte	0x1467c
+	.8byte	.LVL544
+	.4byte	0x1473a
 	.uleb128 0x4f
-	.8byte	.LVL537
-	.4byte	0x14689
+	.8byte	.LVL547
+	.4byte	0x14747
 	.uleb128 0x4f
-	.8byte	.LVL538
-	.4byte	0x14562
+	.8byte	.LVL548
+	.4byte	0x14620
 	.uleb128 0x4f
-	.8byte	.LVL546
-	.4byte	0x144e8
+	.8byte	.LVL556
+	.4byte	0x145a6
 	.uleb128 0x4f
-	.8byte	.LVL583
-	.4byte	0x14562
+	.8byte	.LVL593
+	.4byte	0x14620
 	.uleb128 0x4f
-	.8byte	.LVL585
-	.4byte	0x14562
+	.8byte	.LVL595
+	.4byte	0x14620
 	.uleb128 0x4f
-	.8byte	.LVL588
-	.4byte	0x14562
+	.8byte	.LVL598
+	.4byte	0x14620
 	.uleb128 0x4f
-	.8byte	.LVL590
-	.4byte	0x14562
+	.8byte	.LVL600
+	.4byte	0x14620
 	.uleb128 0x4f
-	.8byte	.LVL593
-	.4byte	0x14562
+	.8byte	.LVL603
+	.4byte	0x14620
 	.uleb128 0x4f
-	.8byte	.LVL651
-	.4byte	0x144e8
+	.8byte	.LVL661
+	.4byte	0x145a6
 	.uleb128 0x4f
-	.8byte	.LVL682
-	.4byte	0x14562
+	.8byte	.LVL692
+	.4byte	0x14620
 	.uleb128 0x4f
-	.8byte	.LVL688
-	.4byte	0x14562
+	.8byte	.LVL698
+	.4byte	0x14620
 	.uleb128 0x4f
-	.8byte	.LVL693
-	.4byte	0x14562
+	.8byte	.LVL703
+	.4byte	0x14620
 	.uleb128 0x4f
-	.8byte	.LVL702
-	.4byte	0x14696
+	.8byte	.LVL712
+	.4byte	0x14754
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3063
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x909
+	.2byte	0x932
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfebc
+	.4byte	0xfee8
 	.uleb128 0x65
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x909
+	.2byte	0x932
 	.4byte	0xe53f
 	.uleb128 0x66
 	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x909
+	.2byte	0x932
 	.4byte	0xe1dc
 	.uleb128 0x48
 	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x90b
-	.4byte	0xe830
+	.2byte	0x934
+	.4byte	0xe85c
 	.uleb128 0x48
-	.4byte	.LASF3055
+	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0x90c
+	.2byte	0x935
 	.4byte	0x6d
 	.uleb128 0x48
-	.4byte	.LASF3056
+	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x90d
+	.2byte	0x936
 	.4byte	0x6d
 	.uleb128 0x48
-	.4byte	.LASF3057
+	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x90e
+	.2byte	0x937
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3058
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x90f
+	.2byte	0x938
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3059
+	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x910
+	.2byte	0x939
 	.4byte	0x21e
 	.uleb128 0x48
-	.4byte	.LASF3060
+	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x911
+	.2byte	0x93a
 	.4byte	0x21e
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x912
+	.2byte	0x93b
 	.4byte	0xe4da
 	.uleb128 0x48
-	.4byte	.LASF3061
+	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x913
+	.2byte	0x93c
 	.4byte	0x458
 	.uleb128 0x48
-	.4byte	.LASF3062
+	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x914
+	.2byte	0x93d
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3081
+	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0x8f2
+	.2byte	0x91b
 	.byte	0x1
-	.4byte	0xfed6
+	.4byte	0xff02
 	.uleb128 0x66
 	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x8f2
-	.4byte	0xe830
+	.2byte	0x91b
+	.4byte	0xe85c
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3064
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x8d6
+	.2byte	0x8ff
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xff0e
+	.4byte	0xff3a
 	.uleb128 0x66
 	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x8d6
-	.4byte	0xe830
+	.2byte	0x8ff
+	.4byte	0xe85c
 	.uleb128 0x48
 	.4byte	.LASF2480
 	.byte	0x1
-	.2byte	0x8d8
+	.2byte	0x901
 	.4byte	0xd88a
 	.uleb128 0x68
 	.uleb128 0x53
 	.string	"__k"
 	.byte	0x1
-	.2byte	0x8e7
+	.2byte	0x910
 	.4byte	0x2f05
 	.byte	0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3065
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x88d
+	.2byte	0x8b6
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xff88
+	.4byte	0xffb4
 	.uleb128 0x65
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x88d
+	.2byte	0x8b6
 	.4byte	0xe53f
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x88f
+	.2byte	0x8b8
 	.4byte	0xa5e0
 	.uleb128 0x48
 	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x890
+	.2byte	0x8b9
 	.4byte	0xe1dc
 	.uleb128 0x48
 	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x891
-	.4byte	0xe830
+	.2byte	0x8ba
+	.4byte	0xe85c
 	.uleb128 0x48
-	.4byte	.LASF3066
+	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x892
+	.2byte	0x8bb
 	.4byte	0xb904
 	.uleb128 0x53
 	.string	"r"
 	.byte	0x1
-	.2byte	0x893
+	.2byte	0x8bc
 	.4byte	0x97bc
 	.uleb128 0x48
-	.4byte	.LASF3067
+	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0x894
+	.2byte	0x8bd
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x895
+	.2byte	0x8be
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x895
+	.2byte	0x8be
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3068
+	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0x861
+	.2byte	0x88a
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfff9
+	.4byte	0x10025
 	.uleb128 0x66
 	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x861
-	.4byte	0xe830
+	.2byte	0x88a
+	.4byte	0xe85c
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x863
+	.2byte	0x88c
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x864
+	.2byte	0x88d
 	.4byte	0xa5e0
 	.uleb128 0x48
-	.4byte	.LASF3066
+	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x865
+	.2byte	0x88e
 	.4byte	0xb904
 	.uleb128 0x53
 	.string	"r"
 	.byte	0x1
-	.2byte	0x866
+	.2byte	0x88f
 	.4byte	0x97bc
 	.uleb128 0x48
 	.4byte	.LASF2981
 	.byte	0x1
-	.2byte	0x867
+	.2byte	0x890
 	.4byte	0x29
 	.uleb128 0x48
 	.4byte	.LASF2982
 	.byte	0x1
-	.2byte	0x868
+	.2byte	0x891
 	.4byte	0xc6
 	.uleb128 0x69
-	.4byte	.LASF3047
-	.4byte	0x10009
-	.4byte	.LASF3068
+	.4byte	.LASF3049
+	.4byte	0x10035
+	.4byte	.LASF3070
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0x10009
+	.4byte	0x10035
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x12
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xfff9
+	.4byte	0x10025
 	.uleb128 0x64
-	.4byte	.LASF3069
+	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0x851
+	.2byte	0x87a
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1002c
+	.4byte	0x10058
 	.uleb128 0x66
 	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x851
-	.4byte	0xe830
+	.2byte	0x87a
+	.4byte	0xe85c
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3070
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x848
+	.2byte	0x871
 	.4byte	0x2ee
-	.8byte	.LFB2844
-	.8byte	.LFE2844-.LFB2844
+	.8byte	.LFB2845
+	.8byte	.LFE2845-.LFB2845
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1008c
+	.4byte	0x100b8
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x848
+	.2byte	0x871
 	.4byte	0xa5e0
-	.4byte	.LLST77
+	.4byte	.LLST81
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x849
+	.2byte	0x872
 	.4byte	0xb45b
-	.4byte	.LLST78
+	.4byte	.LLST82
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x84a
+	.2byte	0x873
 	.4byte	0x21e
-	.4byte	.LLST79
+	.4byte	.LLST83
 	.uleb128 0x4f
-	.8byte	.LVL304
-	.4byte	0x146a0
+	.8byte	.LVL314
+	.4byte	0x1475e
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3071
+	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0x83f
+	.2byte	0x868
 	.4byte	0x2ee
-	.8byte	.LFB2843
-	.8byte	.LFE2843-.LFB2843
+	.8byte	.LFB2844
+	.8byte	.LFE2844-.LFB2844
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x100ec
+	.4byte	0x10118
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x83f
+	.2byte	0x868
 	.4byte	0xa5e0
-	.4byte	.LLST80
+	.4byte	.LLST84
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x840
+	.2byte	0x869
 	.4byte	0xb45b
-	.4byte	.LLST81
+	.4byte	.LLST85
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x841
+	.2byte	0x86a
 	.4byte	0x21e
-	.4byte	.LLST82
+	.4byte	.LLST86
 	.uleb128 0x4f
-	.8byte	.LVL309
-	.4byte	0x146ac
+	.8byte	.LVL319
+	.4byte	0x1476a
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3072
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x836
+	.2byte	0x85f
 	.4byte	0x2ee
-	.8byte	.LFB2842
-	.8byte	.LFE2842-.LFB2842
+	.8byte	.LFB2843
+	.8byte	.LFE2843-.LFB2843
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1014c
+	.4byte	0x10178
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x836
+	.2byte	0x85f
 	.4byte	0xa5e0
-	.4byte	.LLST83
+	.4byte	.LLST87
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x837
+	.2byte	0x860
 	.4byte	0xb45b
-	.4byte	.LLST84
+	.4byte	.LLST88
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x838
+	.2byte	0x861
 	.4byte	0x21e
-	.4byte	.LLST85
+	.4byte	.LLST89
 	.uleb128 0x4f
-	.8byte	.LVL314
-	.4byte	0x146ac
+	.8byte	.LVL324
+	.4byte	0x1476a
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3073
+	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x81e
+	.2byte	0x847
 	.4byte	0x2ee
-	.8byte	.LFB2841
-	.8byte	.LFE2841-.LFB2841
+	.8byte	.LFB2842
+	.8byte	.LFE2842-.LFB2842
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1021c
+	.4byte	0x10248
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x81e
+	.2byte	0x847
 	.4byte	0xa5e0
-	.4byte	.LLST95
+	.4byte	.LLST99
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x81f
+	.2byte	0x848
 	.4byte	0xb45b
-	.4byte	.LLST96
+	.4byte	.LLST100
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x820
+	.2byte	0x849
 	.4byte	0x56
-	.4byte	.LLST97
+	.4byte	.LLST101
 	.uleb128 0x59
 	.4byte	.LASF383
 	.byte	0x1
-	.2byte	0x820
+	.2byte	0x849
 	.4byte	0x2e3
-	.4byte	.LLST98
+	.4byte	.LLST102
 	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x822
+	.2byte	0x84b
 	.4byte	0xe53f
-	.4byte	.LLST99
+	.4byte	.LLST103
 	.uleb128 0x5a
 	.4byte	.LASF2470
 	.byte	0x1
-	.2byte	0x823
+	.2byte	0x84c
 	.4byte	0xc6
-	.4byte	.LLST100
+	.4byte	.LLST104
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x823
+	.2byte	0x84c
 	.4byte	0xc6
 	.uleb128 0x4f
-	.8byte	.LVL340
-	.4byte	0x146b9
+	.8byte	.LVL350
+	.4byte	0x14777
 	.uleb128 0x4f
-	.8byte	.LVL342
-	.4byte	0x146c6
+	.8byte	.LVL352
+	.4byte	0x14784
 	.uleb128 0x4f
-	.8byte	.LVL347
-	.4byte	0x14562
+	.8byte	.LVL357
+	.4byte	0x14620
 	.uleb128 0x4f
-	.8byte	.LVL350
-	.4byte	0x14562
+	.8byte	.LVL360
+	.4byte	0x14620
 	.uleb128 0x4f
-	.8byte	.LVL351
-	.4byte	0x14696
+	.8byte	.LVL361
+	.4byte	0x14754
 	.byte	0
 	.uleb128 0x51
-	.4byte	.LASF3074
+	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0x812
+	.2byte	0x83b
 	.4byte	0x2ee
-	.8byte	.LFB2840
-	.8byte	.LFE2840-.LFB2840
+	.8byte	.LFB2841
+	.8byte	.LFE2841-.LFB2841
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x102b6
+	.4byte	0x102e2
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x812
+	.2byte	0x83b
 	.4byte	0xa5e0
-	.4byte	.LLST86
+	.4byte	.LLST90
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x813
+	.2byte	0x83c
 	.4byte	0xb45b
-	.4byte	.LLST87
+	.4byte	.LLST91
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x814
+	.2byte	0x83d
 	.4byte	0x21e
-	.4byte	.LLST88
+	.4byte	.LLST92
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x816
+	.2byte	0x83f
 	.4byte	0xe53f
 	.uleb128 0x48
 	.4byte	.LASF2470
 	.byte	0x1
-	.2byte	0x817
+	.2byte	0x840
 	.4byte	0xc6
 	.uleb128 0x54
-	.4byte	0x133d6
+	.4byte	0x13494
 	.8byte	.LBB1214
 	.8byte	.LBE1214-.LBB1214
 	.byte	0x1
-	.2byte	0x819
-	.4byte	0x102a8
+	.2byte	0x842
+	.4byte	0x102d4
 	.uleb128 0x55
-	.4byte	0x133e6
+	.4byte	0x134a4
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL319
-	.4byte	0x146ac
+	.8byte	.LVL329
+	.4byte	0x1476a
 	.byte	0
 	.uleb128 0x51
-	.4byte	.LASF3075
+	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x804
+	.2byte	0x82d
 	.4byte	0x2ee
-	.8byte	.LFB2839
-	.8byte	.LFE2839-.LFB2839
+	.8byte	.LFB2840
+	.8byte	.LFE2840-.LFB2840
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1035f
+	.4byte	0x1038b
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x804
+	.2byte	0x82d
 	.4byte	0xa5e0
-	.4byte	.LLST89
+	.4byte	.LLST93
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x805
+	.2byte	0x82e
 	.4byte	0xb45b
-	.4byte	.LLST90
+	.4byte	.LLST94
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x806
+	.2byte	0x82f
 	.4byte	0x21e
-	.4byte	.LLST91
+	.4byte	.LLST95
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x808
+	.2byte	0x831
 	.4byte	0xe53f
 	.uleb128 0x6a
 	.string	"t"
 	.byte	0x1
-	.2byte	0x809
+	.2byte	0x832
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x5c
-	.4byte	0x133f3
+	.4byte	0x134b1
 	.8byte	.LBB1216
 	.4byte	.Ldebug_ranges0+0x6a0
 	.byte	0x1
-	.2byte	0x80b
-	.4byte	0x10344
+	.2byte	0x834
+	.4byte	0x10370
 	.uleb128 0x55
-	.4byte	0x1340f
+	.4byte	0x134cd
 	.uleb128 0x55
-	.4byte	0x13403
+	.4byte	0x134c1
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL326
-	.4byte	0x146ac
+	.8byte	.LVL336
+	.4byte	0x1476a
 	.uleb128 0x4f
-	.8byte	.LVL329
-	.4byte	0x14696
+	.8byte	.LVL339
+	.4byte	0x14754
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3076
+	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0x7f9
+	.2byte	0x822
 	.4byte	0x2ee
-	.8byte	.LFB2838
-	.8byte	.LFE2838-.LFB2838
+	.8byte	.LFB2839
+	.8byte	.LFE2839-.LFB2839
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x103cb
+	.4byte	0x103f7
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x7f9
+	.2byte	0x822
 	.4byte	0xa5e0
-	.4byte	.LLST92
+	.4byte	.LLST96
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x7fa
+	.2byte	0x823
 	.4byte	0xb45b
-	.4byte	.LLST93
+	.4byte	.LLST97
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7fb
+	.2byte	0x824
 	.4byte	0x21e
-	.4byte	.LLST94
+	.4byte	.LLST98
 	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x7fd
+	.2byte	0x826
 	.4byte	0xe53f
 	.uleb128 0x4f
-	.8byte	.LVL334
-	.4byte	0x146ac
+	.8byte	.LVL344
+	.4byte	0x1476a
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3077
+	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0x7ee
+	.2byte	0x817
 	.4byte	0x2ee
-	.8byte	.LFB2837
-	.8byte	.LFE2837-.LFB2837
+	.8byte	.LFB2838
+	.8byte	.LFE2838-.LFB2838
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10444
+	.4byte	0x10470
 	.uleb128 0x59
 	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x7ee
+	.2byte	0x817
 	.4byte	0xa5e0
-	.4byte	.LLST101
+	.4byte	.LLST105
 	.uleb128 0x59
 	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x7ef
+	.2byte	0x818
 	.4byte	0xb45b
-	.4byte	.LLST102
+	.4byte	.LLST106
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7f0
+	.2byte	0x819
 	.4byte	0x21e
-	.4byte	.LLST103
+	.4byte	.LLST107
 	.uleb128 0x48
-	.4byte	.LASF3078
+	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0x7f2
+	.2byte	0x81b
 	.4byte	0x56
 	.uleb128 0x4f
-	.8byte	.LVL353
-	.4byte	0x146d2
+	.8byte	.LVL363
+	.4byte	0x14790
 	.uleb128 0x4f
-	.8byte	.LVL354
-	.4byte	0x146ac
+	.8byte	.LVL364
+	.4byte	0x1476a
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3079
+	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0x7db
+	.2byte	0x804
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1046e
+	.4byte	0x1049a
 	.uleb128 0x66
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0x7db
+	.2byte	0x804
 	.4byte	0x1c7f
 	.uleb128 0x66
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x7db
+	.2byte	0x804
 	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3080
+	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0x7cb
+	.2byte	0x7f4
 	.4byte	0xc6
-	.8byte	.LFB2835
-	.8byte	.LFE2835-.LFB2835
+	.8byte	.LFB2836
+	.8byte	.LFE2836-.LFB2836
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x104d6
+	.4byte	0x10502
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x7cb
+	.2byte	0x7f4
 	.4byte	0x55cc
 	.4byte	.LLST16
 	.uleb128 0x52
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x7cb
+	.2byte	0x7f4
 	.4byte	0x3d25
 	.4byte	.LLST17
 	.uleb128 0x48
 	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x7cd
-	.4byte	0xe830
+	.2byte	0x7f6
+	.4byte	0xe85c
 	.uleb128 0x48
 	.4byte	.LASF898
 	.byte	0x1
-	.2byte	0x7ce
+	.2byte	0x7f7
 	.4byte	0x29
 	.uleb128 0x4f
 	.8byte	.LVL82
-	.4byte	0x146de
+	.4byte	0x1479c
 	.byte	0
 	.uleb128 0x6b
-	.4byte	.LASF3082
+	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0x7b4
+	.2byte	0x7dd
 	.4byte	0xc6
-	.4byte	0x104ff
+	.4byte	0x1052b
 	.uleb128 0x66
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0x7b4
+	.2byte	0x7dd
 	.4byte	0x1c7f
 	.uleb128 0x66
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x7b4
+	.2byte	0x7dd
 	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3083
+	.4byte	.LASF3085
 	.byte	0x1
-	.2byte	0x7a5
+	.2byte	0x7ce
 	.4byte	0xc6
-	.8byte	.LFB2833
-	.8byte	.LFE2833-.LFB2833
+	.8byte	.LFB2834
+	.8byte	.LFE2834-.LFB2834
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10568
+	.4byte	0x10594
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x7a5
+	.2byte	0x7ce
 	.4byte	0x55cc
 	.4byte	.LLST14
 	.uleb128 0x52
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x7a5
+	.2byte	0x7ce
 	.4byte	0x3d25
 	.4byte	.LLST15
 	.uleb128 0x48
 	.4byte	.LASF898
 	.byte	0x1
-	.2byte	0x7a7
+	.2byte	0x7d0
 	.4byte	0x29
 	.uleb128 0x4f
 	.8byte	.LVL76
-	.4byte	0x146eb
+	.4byte	0x147a9
 	.uleb128 0x4f
 	.8byte	.LVL77
-	.4byte	0x146de
+	.4byte	0x1479c
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3084
+	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0x6dc
+	.2byte	0x705
 	.4byte	0x199
-	.8byte	.LFB2832
-	.8byte	.LFE2832-.LFB2832
+	.8byte	.LFB2833
+	.8byte	.LFE2833-.LFB2833
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11810
+	.4byte	0x1183c
 	.uleb128 0x59
 	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x6dc
+	.2byte	0x705
 	.4byte	0x55cc
 	.4byte	.LLST18
 	.uleb128 0x52
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0x6dc
+	.2byte	0x705
 	.4byte	0x6d
 	.4byte	.LLST19
 	.uleb128 0x52
 	.string	"arg"
 	.byte	0x1
-	.2byte	0x6dc
+	.2byte	0x705
 	.4byte	0x29
 	.4byte	.LLST20
 	.uleb128 0x48
-	.4byte	.LASF3085
+	.4byte	.LASF3087
 	.byte	0x1
-	.2byte	0x6de
+	.2byte	0x707
 	.4byte	0x458
 	.uleb128 0x48
 	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x6df
+	.2byte	0x708
 	.4byte	0xe1dc
 	.uleb128 0x48
 	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x6e0
-	.4byte	0xe830
+	.2byte	0x709
+	.4byte	0xe85c
 	.uleb128 0x4d
-	.4byte	.LASF3086
+	.4byte	.LASF3088
 	.byte	0x1
-	.2byte	0x6e1
+	.2byte	0x70a
 	.4byte	0xda82
 	.uleb128 0x2
 	.byte	0x91
@@ -41042,231 +41174,231 @@ __exitcall_ebc_exit:
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6e2
+	.2byte	0x70b
 	.4byte	0xe4da
 	.uleb128 0x48
-	.4byte	.LASF3087
+	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x6e3
+	.2byte	0x70c
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3088
+	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x6e4
+	.2byte	0x70d
 	.4byte	0x29
 	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x6e5
+	.2byte	0x70e
 	.4byte	0xc6
 	.uleb128 0x56
-	.4byte	.LASF3047
-	.4byte	0x11820
+	.4byte	.LASF3049
+	.4byte	0x1184c
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34997
+	.8byte	__func__.35011
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x1a0
-	.4byte	0x106d2
+	.4byte	0x106fe
 	.uleb128 0x48
-	.4byte	.LASF3089
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x72f
+	.2byte	0x758
 	.4byte	0xc6
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1a0
 	.uleb128 0x6c
-	.4byte	.LASF3101
+	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x72f
+	.2byte	0x758
 	.8byte	.L216
 	.uleb128 0x4d
-	.4byte	.LASF3090
+	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x72f
+	.2byte	0x758
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -96
 	.uleb128 0x48
-	.4byte	.LASF3089
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x72f
+	.2byte	0x758
 	.4byte	0x199
 	.uleb128 0x6d
 	.8byte	.LBB1006
 	.8byte	.LBE1006-.LBB1006
-	.4byte	0x106b6
+	.4byte	0x106e2
 	.uleb128 0x5a
-	.4byte	.LASF3091
+	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x72f
+	.2byte	0x758
 	.4byte	0x199
 	.4byte	.LLST35
 	.uleb128 0x4f
 	.8byte	.LVL127
-	.4byte	0x146f7
+	.4byte	0x147b5
 	.uleb128 0x4f
 	.8byte	.LVL128
-	.4byte	0x14703
+	.4byte	0x147c1
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL125
-	.4byte	0x14710
+	.4byte	0x147ce
 	.uleb128 0x4f
 	.8byte	.LVL129
-	.4byte	0x1471c
+	.4byte	0x147da
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x134f7
+	.4byte	0x135b5
 	.8byte	.LBB942
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x797
-	.4byte	0x108f2
+	.2byte	0x7c0
+	.4byte	0x1091e
 	.uleb128 0x55
-	.4byte	0x1351d
+	.4byte	0x135db
 	.uleb128 0x55
-	.4byte	0x13511
+	.4byte	0x135cf
 	.uleb128 0x55
-	.4byte	0x13507
+	.4byte	0x135c5
 	.uleb128 0x6e
-	.4byte	0x13557
+	.4byte	0x13615
 	.8byte	.LBB943
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1357d
+	.4byte	0x1363b
 	.uleb128 0x55
-	.4byte	0x13571
+	.4byte	0x1362f
 	.uleb128 0x55
-	.4byte	0x13567
+	.4byte	0x13625
 	.uleb128 0x6f
-	.4byte	0x135f6
+	.4byte	0x136b4
 	.8byte	.LBB945
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10828
+	.4byte	0x10854
 	.uleb128 0x55
-	.4byte	0x13612
+	.4byte	0x136d0
 	.uleb128 0x70
-	.4byte	0x13606
+	.4byte	0x136c4
 	.4byte	.LLST21
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x80
 	.uleb128 0x61
-	.4byte	0x1361e
+	.4byte	0x136dc
 	.4byte	.LLST22
 	.uleb128 0x61
-	.4byte	0x13629
+	.4byte	0x136e7
 	.4byte	.LLST23
 	.uleb128 0x71
-	.4byte	0x13a41
+	.4byte	0x13aff
 	.8byte	.LBB947
 	.8byte	.LBE947-.LBB947
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x1078e
+	.4byte	0x107ba
 	.uleb128 0x57
 	.8byte	.LBB948
 	.8byte	.LBE948-.LBB948
 	.uleb128 0x61
-	.4byte	0x13a51
+	.4byte	0x13b0f
 	.4byte	.LLST24
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x13a14
+	.4byte	0x13ad2
 	.8byte	.LBB949
 	.8byte	.LBE949-.LBB949
 	.byte	0x6
 	.byte	0x55
-	.4byte	0x107d6
+	.4byte	0x10802
 	.uleb128 0x55
-	.4byte	0x13a2e
+	.4byte	0x13aec
 	.uleb128 0x55
-	.4byte	0x13a24
+	.4byte	0x13ae2
 	.uleb128 0x5d
-	.4byte	0x13b51
+	.4byte	0x13c0f
 	.8byte	.LBB950
 	.8byte	.LBE950-.LBB950
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x13b6b
+	.4byte	0x13c29
 	.uleb128 0x55
-	.4byte	0x13b61
+	.4byte	0x13c1f
 	.byte	0
 	.byte	0
 	.uleb128 0x57
 	.8byte	.LBB952
 	.8byte	.LBE952-.LBB952
 	.uleb128 0x58
-	.4byte	0x13635
+	.4byte	0x136f3
 	.uleb128 0x5d
-	.4byte	0x13ac7
+	.4byte	0x13b85
 	.8byte	.LBB953
 	.8byte	.LBE953-.LBB953
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x13ae3
+	.4byte	0x13ba1
 	.uleb128 0x55
-	.4byte	0x13ad7
+	.4byte	0x13b95
 	.uleb128 0x57
 	.8byte	.LBB954
 	.8byte	.LBE954-.LBB954
 	.uleb128 0x58
-	.4byte	0x13aef
+	.4byte	0x13bad
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x135c2
+	.4byte	0x13680
 	.8byte	.LBB959
 	.8byte	.LBE959-.LBB959
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x108e3
+	.4byte	0x1090f
 	.uleb128 0x55
-	.4byte	0x135d2
+	.4byte	0x13690
 	.uleb128 0x57
 	.8byte	.LBB960
 	.8byte	.LBE960-.LBB960
 	.uleb128 0x61
-	.4byte	0x135dd
+	.4byte	0x1369b
 	.4byte	.LLST25
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0xc0
-	.4byte	0x108ae
+	.4byte	0x108da
 	.uleb128 0x61
-	.4byte	0x135e9
+	.4byte	0x136a7
 	.4byte	.LLST26
 	.uleb128 0x5d
-	.4byte	0x13ac7
+	.4byte	0x13b85
 	.8byte	.LBB962
 	.8byte	.LBE962-.LBB962
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x13ae3
+	.4byte	0x13ba1
 	.uleb128 0x55
-	.4byte	0x13ad7
+	.4byte	0x13b95
 	.uleb128 0x57
 	.8byte	.LBB963
 	.8byte	.LBE963-.LBB963
 	.uleb128 0x58
-	.4byte	0x13aef
+	.4byte	0x13bad
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13a41
+	.4byte	0x13aff
 	.8byte	.LBB964
 	.8byte	.LBE964-.LBB964
 	.byte	0x6
@@ -41275,7 +41407,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB965
 	.8byte	.LBE965-.LBB965
 	.uleb128 0x61
-	.4byte	0x13a51
+	.4byte	0x13b0f
 	.4byte	.LLST27
 	.byte	0
 	.byte	0
@@ -41283,162 +41415,162 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL155
-	.4byte	0x14729
+	.4byte	0x147e7
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13527
+	.4byte	0x135e5
 	.8byte	.LBB975
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
-	.2byte	0x71a
-	.4byte	0x10b1d
+	.2byte	0x743
+	.4byte	0x10b49
 	.uleb128 0x55
-	.4byte	0x1354d
+	.4byte	0x1360b
 	.uleb128 0x55
-	.4byte	0x13541
+	.4byte	0x135ff
 	.uleb128 0x55
-	.4byte	0x13537
+	.4byte	0x135f5
 	.uleb128 0x6e
-	.4byte	0x13587
+	.4byte	0x13645
 	.8byte	.LBB976
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x135ad
+	.4byte	0x1366b
 	.uleb128 0x55
-	.4byte	0x135a1
+	.4byte	0x1365f
 	.uleb128 0x55
-	.4byte	0x13597
+	.4byte	0x13655
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x58
-	.4byte	0x135b6
+	.4byte	0x13674
 	.uleb128 0x6f
-	.4byte	0x135f6
+	.4byte	0x136b4
 	.8byte	.LBB978
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x10a52
+	.4byte	0x10a7e
 	.uleb128 0x55
-	.4byte	0x13612
+	.4byte	0x136d0
 	.uleb128 0x70
-	.4byte	0x13606
+	.4byte	0x136c4
 	.4byte	.LLST28
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x130
 	.uleb128 0x61
-	.4byte	0x1361e
+	.4byte	0x136dc
 	.4byte	.LLST29
 	.uleb128 0x61
-	.4byte	0x13629
+	.4byte	0x136e7
 	.4byte	.LLST30
 	.uleb128 0x71
-	.4byte	0x13a41
+	.4byte	0x13aff
 	.8byte	.LBB980
 	.8byte	.LBE980-.LBB980
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x109b8
+	.4byte	0x109e4
 	.uleb128 0x57
 	.8byte	.LBB981
 	.8byte	.LBE981-.LBB981
 	.uleb128 0x61
-	.4byte	0x13a51
+	.4byte	0x13b0f
 	.4byte	.LLST31
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
 	.8byte	.LBB982
 	.8byte	.LBE982-.LBB982
-	.4byte	0x10a0c
+	.4byte	0x10a38
 	.uleb128 0x58
-	.4byte	0x13635
+	.4byte	0x136f3
 	.uleb128 0x5d
-	.4byte	0x13ac7
+	.4byte	0x13b85
 	.8byte	.LBB983
 	.8byte	.LBE983-.LBB983
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x13ae3
+	.4byte	0x13ba1
 	.uleb128 0x55
-	.4byte	0x13ad7
+	.4byte	0x13b95
 	.uleb128 0x57
 	.8byte	.LBB984
 	.8byte	.LBE984-.LBB984
 	.uleb128 0x58
-	.4byte	0x13aef
+	.4byte	0x13bad
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13a14
+	.4byte	0x13ad2
 	.8byte	.LBB985
 	.8byte	.LBE985-.LBB985
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x13a2e
+	.4byte	0x13aec
 	.uleb128 0x55
-	.4byte	0x13a24
+	.4byte	0x13ae2
 	.uleb128 0x5d
-	.4byte	0x13b51
+	.4byte	0x13c0f
 	.8byte	.LBB986
 	.8byte	.LBE986-.LBB986
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x13b6b
+	.4byte	0x13c29
 	.uleb128 0x55
-	.4byte	0x13b61
+	.4byte	0x13c1f
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x135c2
+	.4byte	0x13680
 	.8byte	.LBB990
 	.8byte	.LBE990-.LBB990
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10b0d
+	.4byte	0x10b39
 	.uleb128 0x55
-	.4byte	0x135d2
+	.4byte	0x13690
 	.uleb128 0x57
 	.8byte	.LBB991
 	.8byte	.LBE991-.LBB991
 	.uleb128 0x61
-	.4byte	0x135dd
+	.4byte	0x1369b
 	.4byte	.LLST32
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x170
-	.4byte	0x10ad8
+	.4byte	0x10b04
 	.uleb128 0x61
-	.4byte	0x135e9
+	.4byte	0x136a7
 	.4byte	.LLST33
 	.uleb128 0x5d
-	.4byte	0x13ac7
+	.4byte	0x13b85
 	.8byte	.LBB993
 	.8byte	.LBE993-.LBB993
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x13ae3
+	.4byte	0x13ba1
 	.uleb128 0x55
-	.4byte	0x13ad7
+	.4byte	0x13b95
 	.uleb128 0x57
 	.8byte	.LBB994
 	.8byte	.LBE994-.LBB994
 	.uleb128 0x58
-	.4byte	0x13aef
+	.4byte	0x13bad
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13a41
+	.4byte	0x13aff
 	.8byte	.LBB995
 	.8byte	.LBE995-.LBB995
 	.byte	0x6
@@ -41447,7 +41579,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB996
 	.8byte	.LBE996-.LBB996
 	.uleb128 0x61
-	.4byte	0x13a51
+	.4byte	0x13b0f
 	.4byte	.LLST34
 	.byte	0
 	.byte	0
@@ -41455,163 +41587,163 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL120
-	.4byte	0x14736
+	.4byte	0x147f4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13527
+	.4byte	0x135e5
 	.8byte	.LBB1010
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
-	.2byte	0x736
-	.4byte	0x10d48
+	.2byte	0x75f
+	.4byte	0x10d74
 	.uleb128 0x55
-	.4byte	0x1354d
+	.4byte	0x1360b
 	.uleb128 0x55
-	.4byte	0x13541
+	.4byte	0x135ff
 	.uleb128 0x55
-	.4byte	0x13537
+	.4byte	0x135f5
 	.uleb128 0x6e
-	.4byte	0x13587
+	.4byte	0x13645
 	.8byte	.LBB1011
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x135ad
+	.4byte	0x1366b
 	.uleb128 0x55
-	.4byte	0x135a1
+	.4byte	0x1365f
 	.uleb128 0x55
-	.4byte	0x13597
+	.4byte	0x13655
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1f0
 	.uleb128 0x58
-	.4byte	0x135b6
+	.4byte	0x13674
 	.uleb128 0x6f
-	.4byte	0x135f6
+	.4byte	0x136b4
 	.8byte	.LBB1013
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x10c7d
+	.4byte	0x10ca9
 	.uleb128 0x55
-	.4byte	0x13612
+	.4byte	0x136d0
 	.uleb128 0x70
-	.4byte	0x13606
+	.4byte	0x136c4
 	.4byte	.LLST36
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x230
 	.uleb128 0x61
-	.4byte	0x1361e
+	.4byte	0x136dc
 	.4byte	.LLST37
 	.uleb128 0x61
-	.4byte	0x13629
+	.4byte	0x136e7
 	.4byte	.LLST38
 	.uleb128 0x71
-	.4byte	0x13a41
+	.4byte	0x13aff
 	.8byte	.LBB1015
 	.8byte	.LBE1015-.LBB1015
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10be3
+	.4byte	0x10c0f
 	.uleb128 0x57
 	.8byte	.LBB1016
 	.8byte	.LBE1016-.LBB1016
 	.uleb128 0x61
-	.4byte	0x13a51
+	.4byte	0x13b0f
 	.4byte	.LLST39
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
 	.8byte	.LBB1017
 	.8byte	.LBE1017-.LBB1017
-	.4byte	0x10c37
+	.4byte	0x10c63
 	.uleb128 0x58
-	.4byte	0x13635
+	.4byte	0x136f3
 	.uleb128 0x5d
-	.4byte	0x13ac7
+	.4byte	0x13b85
 	.8byte	.LBB1018
 	.8byte	.LBE1018-.LBB1018
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x13ae3
+	.4byte	0x13ba1
 	.uleb128 0x55
-	.4byte	0x13ad7
+	.4byte	0x13b95
 	.uleb128 0x57
 	.8byte	.LBB1019
 	.8byte	.LBE1019-.LBB1019
 	.uleb128 0x58
-	.4byte	0x13aef
+	.4byte	0x13bad
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13a14
+	.4byte	0x13ad2
 	.8byte	.LBB1020
 	.8byte	.LBE1020-.LBB1020
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x13a2e
+	.4byte	0x13aec
 	.uleb128 0x55
-	.4byte	0x13a24
+	.4byte	0x13ae2
 	.uleb128 0x5d
-	.4byte	0x13b51
+	.4byte	0x13c0f
 	.8byte	.LBB1021
 	.8byte	.LBE1021-.LBB1021
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x13b6b
+	.4byte	0x13c29
 	.uleb128 0x55
-	.4byte	0x13b61
+	.4byte	0x13c1f
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x135c2
+	.4byte	0x13680
 	.8byte	.LBB1025
 	.8byte	.LBE1025-.LBB1025
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10d38
+	.4byte	0x10d64
 	.uleb128 0x55
-	.4byte	0x135d2
+	.4byte	0x13690
 	.uleb128 0x57
 	.8byte	.LBB1026
 	.8byte	.LBE1026-.LBB1026
 	.uleb128 0x61
-	.4byte	0x135dd
+	.4byte	0x1369b
 	.4byte	.LLST40
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x270
-	.4byte	0x10d03
+	.4byte	0x10d2f
 	.uleb128 0x61
-	.4byte	0x135e9
+	.4byte	0x136a7
 	.4byte	.LLST41
 	.uleb128 0x5d
-	.4byte	0x13ac7
+	.4byte	0x13b85
 	.8byte	.LBB1028
 	.8byte	.LBE1028-.LBB1028
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x13ae3
+	.4byte	0x13ba1
 	.uleb128 0x55
-	.4byte	0x13ad7
+	.4byte	0x13b95
 	.uleb128 0x57
 	.8byte	.LBB1029
 	.8byte	.LBE1029-.LBB1029
 	.uleb128 0x58
-	.4byte	0x13aef
+	.4byte	0x13bad
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13a41
+	.4byte	0x13aff
 	.8byte	.LBB1030
 	.8byte	.LBE1030-.LBB1030
 	.byte	0x6
@@ -41620,7 +41752,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1031
 	.8byte	.LBE1031-.LBB1031
 	.uleb128 0x61
-	.4byte	0x13a51
+	.4byte	0x13b0f
 	.4byte	.LLST42
 	.byte	0
 	.byte	0
@@ -41628,159 +41760,159 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL144
-	.4byte	0x14736
+	.4byte	0x147f4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x134f7
+	.4byte	0x135b5
 	.8byte	.LBB1040
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
-	.2byte	0x704
-	.4byte	0x10f68
+	.2byte	0x72d
+	.4byte	0x10f94
 	.uleb128 0x55
-	.4byte	0x1351d
+	.4byte	0x135db
 	.uleb128 0x55
-	.4byte	0x13511
+	.4byte	0x135cf
 	.uleb128 0x55
-	.4byte	0x13507
+	.4byte	0x135c5
 	.uleb128 0x6e
-	.4byte	0x13557
+	.4byte	0x13615
 	.8byte	.LBB1041
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1357d
+	.4byte	0x1363b
 	.uleb128 0x55
-	.4byte	0x13571
+	.4byte	0x1362f
 	.uleb128 0x55
-	.4byte	0x13567
+	.4byte	0x13625
 	.uleb128 0x6f
-	.4byte	0x135f6
+	.4byte	0x136b4
 	.8byte	.LBB1043
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10e9e
+	.4byte	0x10eca
 	.uleb128 0x55
-	.4byte	0x13612
+	.4byte	0x136d0
 	.uleb128 0x70
-	.4byte	0x13606
+	.4byte	0x136c4
 	.4byte	.LLST43
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x2f0
 	.uleb128 0x61
-	.4byte	0x1361e
+	.4byte	0x136dc
 	.4byte	.LLST44
 	.uleb128 0x61
-	.4byte	0x13629
+	.4byte	0x136e7
 	.4byte	.LLST45
 	.uleb128 0x71
-	.4byte	0x13a41
+	.4byte	0x13aff
 	.8byte	.LBB1045
 	.8byte	.LBE1045-.LBB1045
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10e04
+	.4byte	0x10e30
 	.uleb128 0x57
 	.8byte	.LBB1046
 	.8byte	.LBE1046-.LBB1046
 	.uleb128 0x61
-	.4byte	0x13a51
+	.4byte	0x13b0f
 	.4byte	.LLST46
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
 	.8byte	.LBB1047
 	.8byte	.LBE1047-.LBB1047
-	.4byte	0x10e58
+	.4byte	0x10e84
 	.uleb128 0x58
-	.4byte	0x13635
+	.4byte	0x136f3
 	.uleb128 0x5d
-	.4byte	0x13ac7
+	.4byte	0x13b85
 	.8byte	.LBB1048
 	.8byte	.LBE1048-.LBB1048
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x13ae3
+	.4byte	0x13ba1
 	.uleb128 0x55
-	.4byte	0x13ad7
+	.4byte	0x13b95
 	.uleb128 0x57
 	.8byte	.LBB1049
 	.8byte	.LBE1049-.LBB1049
 	.uleb128 0x58
-	.4byte	0x13aef
+	.4byte	0x13bad
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13a14
+	.4byte	0x13ad2
 	.8byte	.LBB1050
 	.8byte	.LBE1050-.LBB1050
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x13a2e
+	.4byte	0x13aec
 	.uleb128 0x55
-	.4byte	0x13a24
+	.4byte	0x13ae2
 	.uleb128 0x5d
-	.4byte	0x13b51
+	.4byte	0x13c0f
 	.8byte	.LBB1051
 	.8byte	.LBE1051-.LBB1051
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x13b6b
+	.4byte	0x13c29
 	.uleb128 0x55
-	.4byte	0x13b61
+	.4byte	0x13c1f
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x135c2
+	.4byte	0x13680
 	.8byte	.LBB1057
 	.8byte	.LBE1057-.LBB1057
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x10f59
+	.4byte	0x10f85
 	.uleb128 0x55
-	.4byte	0x135d2
+	.4byte	0x13690
 	.uleb128 0x57
 	.8byte	.LBB1058
 	.8byte	.LBE1058-.LBB1058
 	.uleb128 0x61
-	.4byte	0x135dd
+	.4byte	0x1369b
 	.4byte	.LLST47
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x340
-	.4byte	0x10f24
+	.4byte	0x10f50
 	.uleb128 0x61
-	.4byte	0x135e9
+	.4byte	0x136a7
 	.4byte	.LLST48
 	.uleb128 0x5d
-	.4byte	0x13ac7
+	.4byte	0x13b85
 	.8byte	.LBB1060
 	.8byte	.LBE1060-.LBB1060
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x13ae3
+	.4byte	0x13ba1
 	.uleb128 0x55
-	.4byte	0x13ad7
+	.4byte	0x13b95
 	.uleb128 0x57
 	.8byte	.LBB1061
 	.8byte	.LBE1061-.LBB1061
 	.uleb128 0x58
-	.4byte	0x13aef
+	.4byte	0x13bad
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13a41
+	.4byte	0x13aff
 	.8byte	.LBB1062
 	.8byte	.LBE1062-.LBB1062
 	.byte	0x6
@@ -41789,7 +41921,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1063
 	.8byte	.LBE1063-.LBB1063
 	.uleb128 0x61
-	.4byte	0x13a51
+	.4byte	0x13b0f
 	.4byte	.LLST49
 	.byte	0
 	.byte	0
@@ -41797,163 +41929,163 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL171
-	.4byte	0x14729
+	.4byte	0x147e7
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13527
+	.4byte	0x135e5
 	.8byte	.LBB1074
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
-	.2byte	0x753
-	.4byte	0x111a4
+	.2byte	0x77c
+	.4byte	0x111d0
 	.uleb128 0x55
-	.4byte	0x1354d
+	.4byte	0x1360b
 	.uleb128 0x55
-	.4byte	0x13541
+	.4byte	0x135ff
 	.uleb128 0x55
-	.4byte	0x13537
+	.4byte	0x135f5
 	.uleb128 0x6e
-	.4byte	0x13587
+	.4byte	0x13645
 	.8byte	.LBB1075
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x55
-	.4byte	0x135ad
+	.4byte	0x1366b
 	.uleb128 0x55
-	.4byte	0x135a1
+	.4byte	0x1365f
 	.uleb128 0x55
-	.4byte	0x13597
+	.4byte	0x13655
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x370
 	.uleb128 0x61
-	.4byte	0x135b6
+	.4byte	0x13674
 	.4byte	.LLST50
 	.uleb128 0x6f
-	.4byte	0x135f6
+	.4byte	0x136b4
 	.8byte	.LBB1077
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x110cc
+	.4byte	0x110f8
 	.uleb128 0x55
-	.4byte	0x13612
+	.4byte	0x136d0
 	.uleb128 0x70
-	.4byte	0x13606
+	.4byte	0x136c4
 	.4byte	.LLST51
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x61
-	.4byte	0x1361e
+	.4byte	0x136dc
 	.4byte	.LLST52
 	.uleb128 0x61
-	.4byte	0x13629
+	.4byte	0x136e7
 	.4byte	.LLST53
 	.uleb128 0x71
-	.4byte	0x13a41
+	.4byte	0x13aff
 	.8byte	.LBB1079
 	.8byte	.LBE1079-.LBB1079
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x11032
+	.4byte	0x1105e
 	.uleb128 0x57
 	.8byte	.LBB1080
 	.8byte	.LBE1080-.LBB1080
 	.uleb128 0x61
-	.4byte	0x13a51
+	.4byte	0x13b0f
 	.4byte	.LLST54
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
 	.8byte	.LBB1081
 	.8byte	.LBE1081-.LBB1081
-	.4byte	0x11086
+	.4byte	0x110b2
 	.uleb128 0x58
-	.4byte	0x13635
+	.4byte	0x136f3
 	.uleb128 0x5d
-	.4byte	0x13ac7
+	.4byte	0x13b85
 	.8byte	.LBB1082
 	.8byte	.LBE1082-.LBB1082
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x13ae3
+	.4byte	0x13ba1
 	.uleb128 0x55
-	.4byte	0x13ad7
+	.4byte	0x13b95
 	.uleb128 0x57
 	.8byte	.LBB1083
 	.8byte	.LBE1083-.LBB1083
 	.uleb128 0x58
-	.4byte	0x13aef
+	.4byte	0x13bad
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13a14
+	.4byte	0x13ad2
 	.8byte	.LBB1084
 	.8byte	.LBE1084-.LBB1084
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x13a2e
+	.4byte	0x13aec
 	.uleb128 0x55
-	.4byte	0x13a24
+	.4byte	0x13ae2
 	.uleb128 0x5d
-	.4byte	0x13b51
+	.4byte	0x13c0f
 	.8byte	.LBB1085
 	.8byte	.LBE1085-.LBB1085
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x13b6b
+	.4byte	0x13c29
 	.uleb128 0x55
-	.4byte	0x13b61
+	.4byte	0x13c1f
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x135c2
+	.4byte	0x13680
 	.8byte	.LBB1091
 	.8byte	.LBE1091-.LBB1091
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x11187
+	.4byte	0x111b3
 	.uleb128 0x55
-	.4byte	0x135d2
+	.4byte	0x13690
 	.uleb128 0x57
 	.8byte	.LBB1092
 	.8byte	.LBE1092-.LBB1092
 	.uleb128 0x61
-	.4byte	0x135dd
+	.4byte	0x1369b
 	.4byte	.LLST55
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x420
-	.4byte	0x11152
+	.4byte	0x1117e
 	.uleb128 0x61
-	.4byte	0x135e9
+	.4byte	0x136a7
 	.4byte	.LLST56
 	.uleb128 0x5d
-	.4byte	0x13ac7
+	.4byte	0x13b85
 	.8byte	.LBB1094
 	.8byte	.LBE1094-.LBB1094
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x13ae3
+	.4byte	0x13ba1
 	.uleb128 0x55
-	.4byte	0x13ad7
+	.4byte	0x13b95
 	.uleb128 0x57
 	.8byte	.LBB1095
 	.8byte	.LBE1095-.LBB1095
 	.uleb128 0x58
-	.4byte	0x13aef
+	.4byte	0x13bad
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13a41
+	.4byte	0x13aff
 	.8byte	.LBB1096
 	.8byte	.LBE1096-.LBB1096
 	.byte	0x6
@@ -41962,7 +42094,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1097
 	.8byte	.LBE1097-.LBB1097
 	.uleb128 0x61
-	.4byte	0x13a51
+	.4byte	0x13b0f
 	.4byte	.LLST57
 	.byte	0
 	.byte	0
@@ -41970,59 +42102,59 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL183
-	.4byte	0x14736
+	.4byte	0x147f4
 	.uleb128 0x4f
 	.8byte	.LVL261
-	.4byte	0x1454c
+	.4byte	0x1460a
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x134f7
+	.4byte	0x135b5
 	.8byte	.LBB1110
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
-	.2byte	0x770
-	.4byte	0x11256
+	.2byte	0x799
+	.4byte	0x11282
 	.uleb128 0x55
-	.4byte	0x1351d
+	.4byte	0x135db
 	.uleb128 0x55
-	.4byte	0x13511
+	.4byte	0x135cf
 	.uleb128 0x55
-	.4byte	0x13507
+	.4byte	0x135c5
 	.uleb128 0x6e
-	.4byte	0x13557
+	.4byte	0x13615
 	.8byte	.LBB1111
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1357d
+	.4byte	0x1363b
 	.uleb128 0x55
-	.4byte	0x13571
+	.4byte	0x1362f
 	.uleb128 0x55
-	.4byte	0x13567
+	.4byte	0x13625
 	.uleb128 0x6e
-	.4byte	0x135f6
+	.4byte	0x136b4
 	.8byte	.LBB1113
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x55
-	.4byte	0x13612
+	.4byte	0x136d0
 	.uleb128 0x72
-	.4byte	0x13606
+	.4byte	0x136c4
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x4b0
 	.uleb128 0x58
-	.4byte	0x1361e
+	.4byte	0x136dc
 	.uleb128 0x61
-	.4byte	0x13629
+	.4byte	0x136e7
 	.4byte	.LLST58
 	.uleb128 0x5d
-	.4byte	0x13a41
+	.4byte	0x13aff
 	.8byte	.LBB1115
 	.8byte	.LBE1115-.LBB1115
 	.byte	0x6
@@ -42031,7 +42163,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1116
 	.8byte	.LBE1116-.LBB1116
 	.uleb128 0x61
-	.4byte	0x13a51
+	.4byte	0x13b0f
 	.4byte	.LLST59
 	.byte	0
 	.byte	0
@@ -42040,154 +42172,154 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x134f7
+	.4byte	0x135b5
 	.8byte	.LBB1122
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
-	.2byte	0x760
-	.4byte	0x11476
+	.2byte	0x789
+	.4byte	0x114a2
 	.uleb128 0x55
-	.4byte	0x1351d
+	.4byte	0x135db
 	.uleb128 0x55
-	.4byte	0x13511
+	.4byte	0x135cf
 	.uleb128 0x55
-	.4byte	0x13507
+	.4byte	0x135c5
 	.uleb128 0x6e
-	.4byte	0x13557
+	.4byte	0x13615
 	.8byte	.LBB1123
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1357d
+	.4byte	0x1363b
 	.uleb128 0x55
-	.4byte	0x13571
+	.4byte	0x1362f
 	.uleb128 0x55
-	.4byte	0x13567
+	.4byte	0x13625
 	.uleb128 0x6f
-	.4byte	0x135f6
+	.4byte	0x136b4
 	.8byte	.LBB1125
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x113ac
+	.4byte	0x113d8
 	.uleb128 0x55
-	.4byte	0x13612
+	.4byte	0x136d0
 	.uleb128 0x70
-	.4byte	0x13606
+	.4byte	0x136c4
 	.4byte	.LLST60
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x540
 	.uleb128 0x61
-	.4byte	0x1361e
+	.4byte	0x136dc
 	.4byte	.LLST61
 	.uleb128 0x61
-	.4byte	0x13629
+	.4byte	0x136e7
 	.4byte	.LLST62
 	.uleb128 0x71
-	.4byte	0x13a41
+	.4byte	0x13aff
 	.8byte	.LBB1127
 	.8byte	.LBE1127-.LBB1127
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x11312
+	.4byte	0x1133e
 	.uleb128 0x57
 	.8byte	.LBB1128
 	.8byte	.LBE1128-.LBB1128
 	.uleb128 0x61
-	.4byte	0x13a51
+	.4byte	0x13b0f
 	.4byte	.LLST63
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
 	.8byte	.LBB1129
 	.8byte	.LBE1129-.LBB1129
-	.4byte	0x11366
+	.4byte	0x11392
 	.uleb128 0x58
-	.4byte	0x13635
+	.4byte	0x136f3
 	.uleb128 0x5d
-	.4byte	0x13ac7
+	.4byte	0x13b85
 	.8byte	.LBB1130
 	.8byte	.LBE1130-.LBB1130
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x13ae3
+	.4byte	0x13ba1
 	.uleb128 0x55
-	.4byte	0x13ad7
+	.4byte	0x13b95
 	.uleb128 0x57
 	.8byte	.LBB1131
 	.8byte	.LBE1131-.LBB1131
 	.uleb128 0x58
-	.4byte	0x13aef
+	.4byte	0x13bad
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13a14
+	.4byte	0x13ad2
 	.8byte	.LBB1132
 	.8byte	.LBE1132-.LBB1132
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x13a2e
+	.4byte	0x13aec
 	.uleb128 0x55
-	.4byte	0x13a24
+	.4byte	0x13ae2
 	.uleb128 0x5d
-	.4byte	0x13b51
+	.4byte	0x13c0f
 	.8byte	.LBB1133
 	.8byte	.LBE1133-.LBB1133
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x13b6b
+	.4byte	0x13c29
 	.uleb128 0x55
-	.4byte	0x13b61
+	.4byte	0x13c1f
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x135c2
+	.4byte	0x13680
 	.8byte	.LBB1141
 	.8byte	.LBE1141-.LBB1141
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x11467
+	.4byte	0x11493
 	.uleb128 0x55
-	.4byte	0x135d2
+	.4byte	0x13690
 	.uleb128 0x57
 	.8byte	.LBB1142
 	.8byte	.LBE1142-.LBB1142
 	.uleb128 0x61
-	.4byte	0x135dd
+	.4byte	0x1369b
 	.4byte	.LLST64
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x590
-	.4byte	0x11432
+	.4byte	0x1145e
 	.uleb128 0x61
-	.4byte	0x135e9
+	.4byte	0x136a7
 	.4byte	.LLST65
 	.uleb128 0x5d
-	.4byte	0x13ac7
+	.4byte	0x13b85
 	.8byte	.LBB1144
 	.8byte	.LBE1144-.LBB1144
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x13ae3
+	.4byte	0x13ba1
 	.uleb128 0x55
-	.4byte	0x13ad7
+	.4byte	0x13b95
 	.uleb128 0x57
 	.8byte	.LBB1145
 	.8byte	.LBE1145-.LBB1145
 	.uleb128 0x58
-	.4byte	0x13aef
+	.4byte	0x13bad
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13a41
+	.4byte	0x13aff
 	.8byte	.LBB1146
 	.8byte	.LBE1146-.LBB1146
 	.byte	0x6
@@ -42196,7 +42328,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1147
 	.8byte	.LBE1147-.LBB1147
 	.uleb128 0x61
-	.4byte	0x13a51
+	.4byte	0x13b0f
 	.4byte	.LLST66
 	.byte	0
 	.byte	0
@@ -42204,158 +42336,158 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL244
-	.4byte	0x14729
+	.4byte	0x147e7
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x134f7
+	.4byte	0x135b5
 	.8byte	.LBB1158
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
-	.2byte	0x712
-	.4byte	0x11696
+	.2byte	0x73b
+	.4byte	0x116c2
 	.uleb128 0x55
-	.4byte	0x1351d
+	.4byte	0x135db
 	.uleb128 0x55
-	.4byte	0x13511
+	.4byte	0x135cf
 	.uleb128 0x55
-	.4byte	0x13507
+	.4byte	0x135c5
 	.uleb128 0x6e
-	.4byte	0x13557
+	.4byte	0x13615
 	.8byte	.LBB1159
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x55
-	.4byte	0x1357d
+	.4byte	0x1363b
 	.uleb128 0x55
-	.4byte	0x13571
+	.4byte	0x1362f
 	.uleb128 0x55
-	.4byte	0x13567
+	.4byte	0x13625
 	.uleb128 0x6f
-	.4byte	0x135f6
+	.4byte	0x136b4
 	.8byte	.LBB1161
 	.4byte	.Ldebug_ranges0+0x620
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x115cc
+	.4byte	0x115f8
 	.uleb128 0x55
-	.4byte	0x13612
+	.4byte	0x136d0
 	.uleb128 0x70
-	.4byte	0x13606
+	.4byte	0x136c4
 	.4byte	.LLST67
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x620
 	.uleb128 0x61
-	.4byte	0x1361e
+	.4byte	0x136dc
 	.4byte	.LLST68
 	.uleb128 0x61
-	.4byte	0x13629
+	.4byte	0x136e7
 	.4byte	.LLST69
 	.uleb128 0x71
-	.4byte	0x13a41
+	.4byte	0x13aff
 	.8byte	.LBB1163
 	.8byte	.LBE1163-.LBB1163
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x11532
+	.4byte	0x1155e
 	.uleb128 0x57
 	.8byte	.LBB1164
 	.8byte	.LBE1164-.LBB1164
 	.uleb128 0x61
-	.4byte	0x13a51
+	.4byte	0x13b0f
 	.4byte	.LLST70
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
 	.8byte	.LBB1165
 	.8byte	.LBE1165-.LBB1165
-	.4byte	0x11586
+	.4byte	0x115b2
 	.uleb128 0x58
-	.4byte	0x13635
+	.4byte	0x136f3
 	.uleb128 0x5d
-	.4byte	0x13ac7
+	.4byte	0x13b85
 	.8byte	.LBB1166
 	.8byte	.LBE1166-.LBB1166
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x55
-	.4byte	0x13ae3
+	.4byte	0x13ba1
 	.uleb128 0x55
-	.4byte	0x13ad7
+	.4byte	0x13b95
 	.uleb128 0x57
 	.8byte	.LBB1167
 	.8byte	.LBE1167-.LBB1167
 	.uleb128 0x58
-	.4byte	0x13aef
+	.4byte	0x13bad
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13a14
+	.4byte	0x13ad2
 	.8byte	.LBB1168
 	.8byte	.LBE1168-.LBB1168
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x55
-	.4byte	0x13a2e
+	.4byte	0x13aec
 	.uleb128 0x55
-	.4byte	0x13a24
+	.4byte	0x13ae2
 	.uleb128 0x5d
-	.4byte	0x13b51
+	.4byte	0x13c0f
 	.8byte	.LBB1169
 	.8byte	.LBE1169-.LBB1169
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x55
-	.4byte	0x13b6b
+	.4byte	0x13c29
 	.uleb128 0x55
-	.4byte	0x13b61
+	.4byte	0x13c1f
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x135c2
+	.4byte	0x13680
 	.8byte	.LBB1177
 	.8byte	.LBE1177-.LBB1177
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x11687
+	.4byte	0x116b3
 	.uleb128 0x55
-	.4byte	0x135d2
+	.4byte	0x13690
 	.uleb128 0x57
 	.8byte	.LBB1178
 	.8byte	.LBE1178-.LBB1178
 	.uleb128 0x61
-	.4byte	0x135dd
+	.4byte	0x1369b
 	.4byte	.LLST71
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x670
-	.4byte	0x11652
+	.4byte	0x1167e
 	.uleb128 0x61
-	.4byte	0x135e9
+	.4byte	0x136a7
 	.4byte	.LLST72
 	.uleb128 0x5d
-	.4byte	0x13ac7
+	.4byte	0x13b85
 	.8byte	.LBB1180
 	.8byte	.LBE1180-.LBB1180
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x55
-	.4byte	0x13ae3
+	.4byte	0x13ba1
 	.uleb128 0x55
-	.4byte	0x13ad7
+	.4byte	0x13b95
 	.uleb128 0x57
 	.8byte	.LBB1181
 	.8byte	.LBE1181-.LBB1181
 	.uleb128 0x58
-	.4byte	0x13aef
+	.4byte	0x13bad
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13a41
+	.4byte	0x13aff
 	.8byte	.LBB1182
 	.8byte	.LBE1182-.LBB1182
 	.byte	0x6
@@ -42364,7 +42496,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1183
 	.8byte	.LBE1183-.LBB1183
 	.uleb128 0x61
-	.4byte	0x13a51
+	.4byte	0x13b0f
 	.4byte	.LLST73
 	.byte	0
 	.byte	0
@@ -42372,859 +42504,912 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL252
-	.4byte	0x14729
+	.4byte	0x147e7
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
 	.8byte	.LVL85
-	.4byte	0x145de
+	.4byte	0x1469c
 	.uleb128 0x4f
 	.8byte	.LVL86
-	.4byte	0x14640
+	.4byte	0x146fe
 	.uleb128 0x4f
 	.8byte	.LVL87
-	.4byte	0x146eb
+	.4byte	0x147a9
 	.uleb128 0x4f
 	.8byte	.LVL98
-	.4byte	0x14743
+	.4byte	0x14801
 	.uleb128 0x4f
 	.8byte	.LVL101
-	.4byte	0x14562
+	.4byte	0x14620
 	.uleb128 0x4f
 	.8byte	.LVL104
-	.4byte	0x144e8
+	.4byte	0x145a6
 	.uleb128 0x4f
 	.8byte	.LVL121
-	.4byte	0x146eb
+	.4byte	0x147a9
 	.uleb128 0x4f
 	.8byte	.LVL122
-	.4byte	0x1474f
+	.4byte	0x1480d
 	.uleb128 0x4f
 	.8byte	.LVL124
-	.4byte	0x145ea
+	.4byte	0x146a8
 	.uleb128 0x4f
 	.8byte	.LVL131
-	.4byte	0x145de
+	.4byte	0x1469c
 	.uleb128 0x4f
 	.8byte	.LVL145
-	.4byte	0x1475b
+	.4byte	0x14819
 	.uleb128 0x4f
 	.8byte	.LVL146
-	.4byte	0x145ea
+	.4byte	0x146a8
 	.uleb128 0x4f
 	.8byte	.LVL147
-	.4byte	0x14634
+	.4byte	0x146f2
 	.uleb128 0x4f
 	.8byte	.LVL157
-	.4byte	0x14767
+	.4byte	0x14825
 	.uleb128 0x4f
 	.8byte	.LVL158
-	.4byte	0x146eb
+	.4byte	0x147a9
 	.uleb128 0x4f
 	.8byte	.LVL185
-	.4byte	0x144e8
+	.4byte	0x145a6
 	.uleb128 0x4f
 	.8byte	.LVL188
-	.4byte	0x144e8
+	.4byte	0x145a6
 	.uleb128 0x4f
 	.8byte	.LVL190
-	.4byte	0x145de
+	.4byte	0x1469c
 	.uleb128 0x4f
 	.8byte	.LVL192
-	.4byte	0x145de
+	.4byte	0x1469c
 	.uleb128 0x4f
 	.8byte	.LVL193
-	.4byte	0x14640
+	.4byte	0x146fe
 	.uleb128 0x4f
 	.8byte	.LVL194
-	.4byte	0x146eb
+	.4byte	0x147a9
 	.uleb128 0x4f
 	.8byte	.LVL207
-	.4byte	0x14562
+	.4byte	0x14620
 	.uleb128 0x4f
 	.8byte	.LVL210
-	.4byte	0x14562
+	.4byte	0x14620
 	.uleb128 0x4f
 	.8byte	.LVL212
-	.4byte	0x145de
+	.4byte	0x1469c
 	.uleb128 0x4f
 	.8byte	.LVL213
-	.4byte	0x146eb
+	.4byte	0x147a9
 	.uleb128 0x4f
 	.8byte	.LVL221
-	.4byte	0x14743
+	.4byte	0x14801
 	.uleb128 0x4f
 	.8byte	.LVL255
-	.4byte	0x14634
+	.4byte	0x146f2
 	.uleb128 0x4f
 	.8byte	.LVL262
-	.4byte	0x14562
+	.4byte	0x14620
 	.uleb128 0x4f
 	.8byte	.LVL263
-	.4byte	0x14696
+	.4byte	0x14754
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0x11820
+	.4byte	0x1184c
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xa
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x11810
+	.4byte	0x1183c
 	.uleb128 0x64
-	.4byte	.LASF3092
+	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x699
+	.2byte	0x6c2
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1184f
+	.4byte	0x1187b
 	.uleb128 0x66
 	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x699
+	.2byte	0x6c2
 	.4byte	0xe1dc
 	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x69b
+	.2byte	0x6c4
 	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3094
+	.4byte	.LASF3096
 	.byte	0x1
-	.2byte	0x693
-	.8byte	.LFB2830
-	.8byte	.LFE2830-.LFB2830
+	.2byte	0x6bc
+	.8byte	.LFB2831
+	.8byte	.LFE2831-.LFB2831
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11889
+	.4byte	0x118b5
 	.uleb128 0x52
 	.string	"t"
 	.byte	0x1
-	.2byte	0x693
+	.2byte	0x6bc
 	.4byte	0x31d2
 	.4byte	.LLST74
 	.uleb128 0x4f
 	.8byte	.LVL276
-	.4byte	0x122ec
+	.4byte	0x123aa
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3095
+	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x687
-	.8byte	.LFB2829
-	.8byte	.LFE2829-.LFB2829
+	.2byte	0x6b0
+	.8byte	.LFB2830
+	.8byte	.LFE2830-.LFB2830
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x118e9
+	.4byte	0x11915
 	.uleb128 0x52
 	.string	"t"
 	.byte	0x1
-	.2byte	0x687
+	.2byte	0x6b0
 	.4byte	0x31d2
 	.4byte	.LLST12
 	.uleb128 0x48
 	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x689
-	.4byte	0xe830
+	.2byte	0x6b2
+	.4byte	0xe85c
 	.uleb128 0x60
-	.4byte	0x13481
+	.4byte	0x1353f
 	.8byte	.LBB938
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.2byte	0x68d
+	.2byte	0x6b6
 	.uleb128 0x55
-	.4byte	0x1348e
+	.4byte	0x1354c
 	.uleb128 0x4f
 	.8byte	.LVL71
-	.4byte	0x14773
+	.4byte	0x14831
 	.byte	0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3096
+	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x677
+	.2byte	0x6a0
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11913
+	.4byte	0x1193f
 	.uleb128 0x66
 	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x677
+	.2byte	0x6a0
 	.4byte	0xe1dc
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x679
+	.2byte	0x6a2
 	.4byte	0xe4da
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3097
+	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x53a
+	.2byte	0x551
 	.4byte	0xc6
-	.8byte	.LFB2827
-	.8byte	.LFE2827-.LFB2827
+	.8byte	.LFB2828
+	.8byte	.LFE2828-.LFB2828
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12114
+	.4byte	0x12140
 	.uleb128 0x52
 	.string	"ptr"
 	.byte	0x1
-	.2byte	0x53a
+	.2byte	0x551
 	.4byte	0x458
-	.4byte	.LLST188
+	.4byte	.LLST192
 	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x53c
+	.2byte	0x553
 	.4byte	0xe53f
-	.4byte	.LLST189
+	.4byte	.LLST193
 	.uleb128 0x48
 	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x53d
-	.4byte	0xe830
+	.2byte	0x554
+	.4byte	0xe85c
 	.uleb128 0x5b
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x53e
+	.2byte	0x555
 	.4byte	0xe4da
-	.4byte	.LLST190
+	.4byte	.LLST194
 	.uleb128 0x5a
-	.4byte	.LASF3098
+	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x53f
+	.2byte	0x556
 	.4byte	0xc6
-	.4byte	.LLST191
+	.4byte	.LLST195
 	.uleb128 0x5a
 	.4byte	.LASF2988
 	.byte	0x1
-	.2byte	0x540
+	.2byte	0x557
 	.4byte	0xc6
-	.4byte	.LLST192
+	.4byte	.LLST196
 	.uleb128 0x4d
-	.4byte	.LASF3099
+	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x541
+	.2byte	0x558
 	.4byte	0xd95c
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -72
 	.uleb128 0x5a
-	.4byte	.LASF3100
+	.4byte	.LASF3102
 	.byte	0x1
-	.2byte	0x542
+	.2byte	0x559
 	.4byte	0xe4da
-	.4byte	.LLST193
+	.4byte	.LLST197
 	.uleb128 0x6c
-	.4byte	.LASF3102
+	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x647
-	.8byte	.L805
+	.2byte	0x66e
+	.8byte	.L821
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x1100
-	.4byte	0x11a63
+	.4byte	0x11a8f
 	.uleb128 0x48
-	.4byte	.LASF3089
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x583
+	.2byte	0x5aa
 	.4byte	0xc6
 	.uleb128 0x57
 	.8byte	.LBB1816
 	.8byte	.LBE1816-.LBB1816
 	.uleb128 0x6c
-	.4byte	.LASF3101
+	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x583
-	.8byte	.L788
+	.2byte	0x5aa
+	.8byte	.L804
 	.uleb128 0x4d
-	.4byte	.LASF3090
+	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x583
+	.2byte	0x5aa
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x48
-	.4byte	.LASF3089
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x583
+	.2byte	0x5aa
 	.4byte	0x199
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x1130
-	.4byte	0x11a47
+	.4byte	0x11a73
 	.uleb128 0x5a
-	.4byte	.LASF3091
+	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x583
+	.2byte	0x5aa
 	.4byte	0x199
-	.4byte	.LLST207
+	.4byte	.LLST211
 	.uleb128 0x4f
-	.8byte	.LVL907
-	.4byte	0x146f7
+	.8byte	.LVL903
+	.4byte	0x147b5
 	.uleb128 0x4f
-	.8byte	.LVL908
-	.4byte	0x14703
+	.8byte	.LVL904
+	.4byte	0x147c1
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL905
-	.4byte	0x14710
+	.8byte	.LVL901
+	.4byte	0x147ce
 	.uleb128 0x4f
-	.8byte	.LVL909
-	.4byte	0x1471c
+	.8byte	.LVL905
+	.4byte	0x147da
 	.byte	0
 	.byte	0
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x10a0
-	.4byte	0x11b05
+	.4byte	0x11b31
 	.uleb128 0x48
-	.4byte	.LASF3089
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x633
+	.2byte	0x65a
 	.4byte	0xc6
 	.uleb128 0x57
 	.8byte	.LBB1812
 	.8byte	.LBE1812-.LBB1812
 	.uleb128 0x6c
-	.4byte	.LASF3101
+	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x633
-	.8byte	.L842
+	.2byte	0x65a
+	.8byte	.L858
 	.uleb128 0x4d
-	.4byte	.LASF3090
+	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x633
+	.2byte	0x65a
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x48
-	.4byte	.LASF3089
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x633
+	.2byte	0x65a
 	.4byte	0x199
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x10d0
-	.4byte	0x11ae9
+	.4byte	0x11b15
 	.uleb128 0x5a
-	.4byte	.LASF3091
+	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x633
+	.2byte	0x65a
 	.4byte	0x199
-	.4byte	.LLST206
+	.4byte	.LLST210
 	.uleb128 0x4f
-	.8byte	.LVL900
-	.4byte	0x146f7
+	.8byte	.LVL913
+	.4byte	0x147b5
 	.uleb128 0x4f
-	.8byte	.LVL901
-	.4byte	0x14703
+	.8byte	.LVL914
+	.4byte	0x147c1
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL898
-	.4byte	0x14710
+	.8byte	.LVL911
+	.4byte	0x147ce
 	.uleb128 0x4f
-	.8byte	.LVL902
-	.4byte	0x1471c
+	.8byte	.LVL915
+	.4byte	0x147da
 	.byte	0
 	.byte	0
 	.uleb128 0x6d
 	.8byte	.LBB1806
 	.8byte	.LBE1806-.LBB1806
-	.4byte	0x11bb7
+	.4byte	0x11be3
 	.uleb128 0x48
-	.4byte	.LASF3089
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x663
+	.2byte	0x68c
 	.4byte	0xc6
 	.uleb128 0x57
 	.8byte	.LBB1807
 	.8byte	.LBE1807-.LBB1807
 	.uleb128 0x73
-	.4byte	.LASF3101
+	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x663
+	.2byte	0x68c
 	.uleb128 0x4d
-	.4byte	.LASF3090
+	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x663
+	.2byte	0x68c
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x48
-	.4byte	.LASF3089
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x663
+	.2byte	0x68c
 	.4byte	0x199
 	.uleb128 0x6d
 	.8byte	.LBB1808
 	.8byte	.LBE1808-.LBB1808
-	.4byte	0x11b9b
+	.4byte	0x11bc7
 	.uleb128 0x5a
-	.4byte	.LASF3091
+	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x663
+	.2byte	0x68c
 	.4byte	0x199
-	.4byte	.LLST205
+	.4byte	.LLST209
 	.uleb128 0x4f
-	.8byte	.LVL833
-	.4byte	0x146f7
+	.8byte	.LVL844
+	.4byte	0x147b5
 	.uleb128 0x4f
-	.8byte	.LVL834
-	.4byte	0x14703
+	.8byte	.LVL845
+	.4byte	0x147c1
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL831
-	.4byte	0x14710
+	.8byte	.LVL842
+	.4byte	0x147ce
 	.uleb128 0x4f
-	.8byte	.LVL835
-	.4byte	0x1471c
+	.8byte	.LVL846
+	.4byte	0x147da
 	.byte	0
 	.byte	0
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0xf80
-	.4byte	0x11c4d
+	.4byte	0x11c79
 	.uleb128 0x48
-	.4byte	.LASF3089
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x66f
+	.2byte	0x698
 	.4byte	0xc6
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xf80
 	.uleb128 0x6c
-	.4byte	.LASF3101
+	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x66f
-	.8byte	.L858
+	.2byte	0x698
+	.8byte	.L875
 	.uleb128 0x4d
-	.4byte	.LASF3090
+	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x66f
+	.2byte	0x698
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x48
-	.4byte	.LASF3089
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x66f
+	.2byte	0x698
 	.4byte	0x199
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0xfc0
-	.4byte	0x11c31
+	.4byte	0x11c5d
 	.uleb128 0x5a
-	.4byte	.LASF3091
+	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x66f
+	.2byte	0x698
 	.4byte	0x199
-	.4byte	.LLST194
+	.4byte	.LLST198
 	.uleb128 0x4f
-	.8byte	.LVL802
-	.4byte	0x146f7
+	.8byte	.LVL813
+	.4byte	0x147b5
 	.uleb128 0x4f
-	.8byte	.LVL803
-	.4byte	0x14703
+	.8byte	.LVL814
+	.4byte	0x147c1
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL800
-	.4byte	0x14710
+	.8byte	.LVL811
+	.4byte	0x147ce
 	.uleb128 0x4f
-	.8byte	.LVL804
-	.4byte	0x1471c
+	.8byte	.LVL815
+	.4byte	0x147da
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12e06
+	.4byte	0x12ec4
 	.8byte	.LBB1791
 	.4byte	.Ldebug_ranges0+0x1000
 	.byte	0x1
-	.2byte	0x5a4
-	.4byte	0x11d13
+	.2byte	0x5cb
+	.4byte	0x11d3f
 	.uleb128 0x55
-	.4byte	0x12e43
+	.4byte	0x12f01
 	.uleb128 0x55
-	.4byte	0x12e43
+	.4byte	0x12f01
 	.uleb128 0x55
-	.4byte	0x12e43
+	.4byte	0x12f01
 	.uleb128 0x55
-	.4byte	0x12e4f
+	.4byte	0x12f0d
 	.uleb128 0x55
-	.4byte	0x12e37
+	.4byte	0x12ef5
 	.uleb128 0x55
-	.4byte	0x12e2b
+	.4byte	0x12ee9
 	.uleb128 0x55
-	.4byte	0x12e1f
+	.4byte	0x12edd
 	.uleb128 0x55
-	.4byte	0x12e13
+	.4byte	0x12ed1
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1000
 	.uleb128 0x58
-	.4byte	0x12e5b
+	.4byte	0x12f19
 	.uleb128 0x61
-	.4byte	0x12e67
-	.4byte	.LLST195
+	.4byte	0x12f25
+	.4byte	.LLST199
 	.uleb128 0x58
-	.4byte	0x12e73
+	.4byte	0x12f31
 	.uleb128 0x61
-	.4byte	0x12e7f
-	.4byte	.LLST196
+	.4byte	0x12f3d
+	.4byte	.LLST200
 	.uleb128 0x61
-	.4byte	0x12e8b
-	.4byte	.LLST197
+	.4byte	0x12f49
+	.4byte	.LLST201
 	.uleb128 0x58
-	.4byte	0x12e97
+	.4byte	0x12f55
 	.uleb128 0x58
-	.4byte	0x12ea3
+	.4byte	0x12f61
 	.uleb128 0x58
-	.4byte	0x12eaf
+	.4byte	0x12f6d
 	.uleb128 0x61
-	.4byte	0x12ebb
-	.4byte	.LLST198
+	.4byte	0x12f79
+	.4byte	.LLST202
 	.uleb128 0x58
-	.4byte	0x12ec7
+	.4byte	0x12f85
 	.uleb128 0x61
-	.4byte	0x12ed3
-	.4byte	.LLST199
+	.4byte	0x12f91
+	.4byte	.LLST203
 	.uleb128 0x62
-	.4byte	0x12edf
+	.4byte	0x12f9d
 	.uleb128 0x1
-	.byte	0x5f
+	.byte	0x60
 	.uleb128 0x61
-	.4byte	0x12ee9
-	.4byte	.LLST200
+	.4byte	0x12fa7
+	.4byte	.LLST204
 	.uleb128 0x61
-	.4byte	0x12ef3
-	.4byte	.LLST201
+	.4byte	0x12fb1
+	.4byte	.LLST205
 	.uleb128 0x61
-	.4byte	0x12eff
-	.4byte	.LLST202
+	.4byte	0x12fbd
+	.4byte	.LLST206
 	.uleb128 0x61
-	.4byte	0x12f0b
-	.4byte	.LLST203
+	.4byte	0x12fc9
+	.4byte	.LLST207
 	.uleb128 0x61
-	.4byte	0x12f17
-	.4byte	.LLST204
+	.4byte	0x12fd5
+	.4byte	.LLST208
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12114
+	.4byte	0x12140
 	.8byte	.LBB1800
 	.4byte	.Ldebug_ranges0+0x1060
 	.byte	0x1
-	.2byte	0x608
-	.4byte	0x11d64
+	.2byte	0x62f
+	.4byte	0x11d90
 	.uleb128 0x55
-	.4byte	0x1213d
+	.4byte	0x12169
 	.uleb128 0x55
-	.4byte	0x12131
+	.4byte	0x1215d
 	.uleb128 0x55
-	.4byte	0x12125
+	.4byte	0x12151
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1060
 	.uleb128 0x58
-	.4byte	0x12149
+	.4byte	0x12175
 	.uleb128 0x58
-	.4byte	0x12153
+	.4byte	0x1217f
 	.uleb128 0x58
-	.4byte	0x1215f
+	.4byte	0x1218b
 	.uleb128 0x58
-	.4byte	0x1216b
+	.4byte	0x12197
 	.uleb128 0x58
-	.4byte	0x12177
+	.4byte	0x121a3
 	.uleb128 0x58
-	.4byte	0x12183
+	.4byte	0x121af
 	.uleb128 0x74
-	.4byte	0x1218f
+	.4byte	0x121bb
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13160
+	.4byte	0x1321e
 	.8byte	.LBB1809
 	.8byte	.LBE1809-.LBB1809
 	.byte	0x1
-	.2byte	0x66c
-	.4byte	0x11daf
+	.2byte	0x695
+	.4byte	0x11ddb
 	.uleb128 0x55
-	.4byte	0x1317b
+	.4byte	0x13239
 	.uleb128 0x55
-	.4byte	0x13170
+	.4byte	0x1322e
 	.uleb128 0x57
 	.8byte	.LBB1810
 	.8byte	.LBE1810-.LBB1810
 	.uleb128 0x58
-	.4byte	0x13187
+	.4byte	0x13245
 	.uleb128 0x4f
-	.8byte	.LVL836
-	.4byte	0x14360
+	.8byte	.LVL847
+	.4byte	0x1441e
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13160
+	.4byte	0x1321e
 	.8byte	.LBB1823
 	.8byte	.LBE1823-.LBB1823
 	.byte	0x1
-	.2byte	0x547
-	.4byte	0x11dfa
+	.2byte	0x55e
+	.4byte	0x11e26
 	.uleb128 0x55
-	.4byte	0x1317b
+	.4byte	0x13239
 	.uleb128 0x55
-	.4byte	0x13170
+	.4byte	0x1322e
 	.uleb128 0x57
 	.8byte	.LBB1824
 	.8byte	.LBE1824-.LBB1824
 	.uleb128 0x58
-	.4byte	0x13187
+	.4byte	0x13245
 	.uleb128 0x4f
-	.8byte	.LVL911
-	.4byte	0x14360
+	.8byte	.LVL917
+	.4byte	0x1441e
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL765
-	.4byte	0x1477f
-	.uleb128 0x4f
-	.8byte	.LVL766
-	.4byte	0x144e8
-	.uleb128 0x4f
-	.8byte	.LVL768
-	.4byte	0x145d2
+	.8byte	.LVL774
+	.4byte	0x1483d
 	.uleb128 0x4f
-	.8byte	.LVL769
-	.4byte	0x144e8
+	.8byte	.LVL775
+	.4byte	0x121c4
 	.uleb128 0x4f
-	.8byte	.LVL770
-	.4byte	0x1478b
+	.8byte	.LVL776
+	.4byte	0x145a6
 	.uleb128 0x4f
-	.8byte	.LVL771
-	.4byte	0x14640
+	.8byte	.LVL778
+	.4byte	0x14690
 	.uleb128 0x4f
-	.8byte	.LVL772
-	.4byte	0x14640
+	.8byte	.LVL779
+	.4byte	0x145a6
 	.uleb128 0x4f
-	.8byte	.LVL773
-	.4byte	0x14640
+	.8byte	.LVL780
+	.4byte	0x14849
 	.uleb128 0x4f
-	.8byte	.LVL808
-	.4byte	0x14562
+	.8byte	.LVL781
+	.4byte	0x146fe
 	.uleb128 0x4f
-	.8byte	.LVL810
-	.4byte	0x14797
+	.8byte	.LVL782
+	.4byte	0x146fe
 	.uleb128 0x4f
-	.8byte	.LVL811
-	.4byte	0x14743
+	.8byte	.LVL783
+	.4byte	0x146fe
 	.uleb128 0x4f
-	.8byte	.LVL815
-	.4byte	0x144e8
+	.8byte	.LVL817
+	.4byte	0x14620
 	.uleb128 0x4f
 	.8byte	.LVL818
-	.4byte	0x144e8
+	.4byte	0x14855
 	.uleb128 0x4f
 	.8byte	.LVL819
-	.4byte	0x14634
+	.4byte	0x14801
 	.uleb128 0x4f
-	.8byte	.LVL820
-	.4byte	0x14797
-	.uleb128 0x4f
-	.8byte	.LVL822
-	.4byte	0x14743
-	.uleb128 0x4f
-	.8byte	.LVL827
-	.4byte	0x12198
+	.8byte	.LVL825
+	.4byte	0x145a6
 	.uleb128 0x4f
 	.8byte	.LVL828
-	.4byte	0x14562
-	.uleb128 0x4f
-	.8byte	.LVL830
-	.4byte	0x14797
+	.4byte	0x145a6
 	.uleb128 0x4f
-	.8byte	.LVL840
-	.4byte	0x1478b
-	.uleb128 0x4f
-	.8byte	.LVL841
-	.4byte	0x14640
-	.uleb128 0x4f
-	.8byte	.LVL842
-	.4byte	0x14797
-	.uleb128 0x4f
-	.8byte	.LVL843
-	.4byte	0x14743
+	.8byte	.LVL829
+	.4byte	0x146f2
 	.uleb128 0x4f
-	.8byte	.LVL844
-	.4byte	0x1307b
+	.8byte	.LVL830
+	.4byte	0x14855
 	.uleb128 0x4f
-	.8byte	.LVL845
-	.4byte	0x147a3
+	.8byte	.LVL832
+	.4byte	0x14801
 	.uleb128 0x4f
-	.8byte	.LVL846
-	.4byte	0x144e8
+	.8byte	.LVL838
+	.4byte	0x12256
 	.uleb128 0x4f
-	.8byte	.LVL847
-	.4byte	0x1256c
+	.8byte	.LVL839
+	.4byte	0x14620
 	.uleb128 0x4f
-	.8byte	.LVL848
-	.4byte	0x1478b
+	.8byte	.LVL841
+	.4byte	0x14855
 	.uleb128 0x4f
 	.8byte	.LVL849
-	.4byte	0x14640
+	.4byte	0x14849
 	.uleb128 0x4f
 	.8byte	.LVL850
-	.4byte	0x14640
+	.4byte	0x146fe
 	.uleb128 0x4f
 	.8byte	.LVL851
-	.4byte	0x147a3
+	.4byte	0x14855
 	.uleb128 0x4f
 	.8byte	.LVL852
-	.4byte	0x12198
+	.4byte	0x14801
+	.uleb128 0x4f
+	.8byte	.LVL853
+	.4byte	0x13139
 	.uleb128 0x4f
 	.8byte	.LVL854
-	.4byte	0x144e8
+	.4byte	0x14861
 	.uleb128 0x4f
 	.8byte	.LVL855
-	.4byte	0x1256c
+	.4byte	0x145a6
+	.uleb128 0x4f
+	.8byte	.LVL856
+	.4byte	0x1262a
 	.uleb128 0x4f
 	.8byte	.LVL857
-	.4byte	0x12fb4
+	.4byte	0x14849
 	.uleb128 0x4f
 	.8byte	.LVL858
-	.4byte	0x147a3
+	.4byte	0x146fe
 	.uleb128 0x4f
 	.8byte	.LVL859
-	.4byte	0x1441e
-	.uleb128 0x4f
-	.8byte	.LVL860
-	.4byte	0x12198
+	.4byte	0x146fe
 	.uleb128 0x4f
-	.8byte	.LVL861
-	.4byte	0x14562
+	.8byte	.LVL862
+	.4byte	0x144dc
 	.uleb128 0x4f
 	.8byte	.LVL863
-	.4byte	0x1441e
+	.4byte	0x12256
 	.uleb128 0x4f
 	.8byte	.LVL864
-	.4byte	0x12198
+	.4byte	0x145a6
 	.uleb128 0x4f
 	.8byte	.LVL865
-	.4byte	0x144e8
+	.4byte	0x1262a
 	.uleb128 0x4f
 	.8byte	.LVL866
-	.4byte	0x1256c
+	.4byte	0x14690
 	.uleb128 0x4f
-	.8byte	.LVL867
-	.4byte	0x145d2
+	.8byte	.LVL869
+	.4byte	0x14690
 	.uleb128 0x4f
-	.8byte	.LVL870
-	.4byte	0x145d2
+	.8byte	.LVL871
+	.4byte	0x145a6
 	.uleb128 0x4f
 	.8byte	.LVL872
-	.4byte	0x144e8
+	.4byte	0x14855
 	.uleb128 0x4f
 	.8byte	.LVL873
-	.4byte	0x14797
+	.4byte	0x14801
 	.uleb128 0x4f
 	.8byte	.LVL874
-	.4byte	0x14743
+	.4byte	0x13072
 	.uleb128 0x4f
 	.8byte	.LVL875
-	.4byte	0x144e8
+	.4byte	0x14861
+	.uleb128 0x4f
+	.8byte	.LVL876
+	.4byte	0x12256
 	.uleb128 0x4f
 	.8byte	.LVL878
-	.4byte	0x144e8
+	.4byte	0x145a6
 	.uleb128 0x4f
 	.8byte	.LVL879
-	.4byte	0x14640
-	.uleb128 0x4f
-	.8byte	.LVL885
-	.4byte	0x147a3
+	.4byte	0x1262a
 	.uleb128 0x4f
-	.8byte	.LVL886
-	.4byte	0x12198
+	.8byte	.LVL881
+	.4byte	0x145a6
 	.uleb128 0x4f
-	.8byte	.LVL890
-	.4byte	0x144e8
+	.8byte	.LVL884
+	.4byte	0x145a6
 	.uleb128 0x4f
-	.8byte	.LVL891
-	.4byte	0x147af
+	.8byte	.LVL885
+	.4byte	0x146fe
 	.uleb128 0x4f
 	.8byte	.LVL892
-	.4byte	0x14634
+	.4byte	0x14861
 	.uleb128 0x4f
-	.8byte	.LVL895
-	.4byte	0x147af
+	.8byte	.LVL893
+	.4byte	0x12256
 	.uleb128 0x4f
 	.8byte	.LVL896
-	.4byte	0x144e8
+	.4byte	0x145a6
 	.uleb128 0x4f
-	.8byte	.LVL912
-	.4byte	0x1441e
+	.8byte	.LVL897
+	.4byte	0x146f2
 	.uleb128 0x4f
-	.8byte	.LVL914
-	.4byte	0x1441e
+	.8byte	.LVL898
+	.4byte	0x1486d
 	.uleb128 0x4f
-	.8byte	.LVL916
-	.4byte	0x14696
+	.8byte	.LVL907
+	.4byte	0x1486d
+	.uleb128 0x4f
+	.8byte	.LVL908
+	.4byte	0x145a6
+	.uleb128 0x4f
+	.8byte	.LVL909
+	.4byte	0x121c4
+	.uleb128 0x4f
+	.8byte	.LVL919
+	.4byte	0x144dc
+	.uleb128 0x4f
+	.8byte	.LVL920
+	.4byte	0x14620
+	.uleb128 0x4f
+	.8byte	.LVL922
+	.4byte	0x144dc
+	.uleb128 0x4f
+	.8byte	.LVL924
+	.4byte	0x144dc
+	.uleb128 0x4f
+	.8byte	.LVL926
+	.4byte	0x14754
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3103
+	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x523
+	.2byte	0x538
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x12198
+	.4byte	0x121c4
 	.uleb128 0x66
-	.4byte	.LASF3104
+	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x523
+	.2byte	0x538
 	.4byte	0x46ee
 	.uleb128 0x66
-	.4byte	.LASF3105
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x523
+	.2byte	0x538
 	.4byte	0x46ee
 	.uleb128 0x66
-	.4byte	.LASF3106
+	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x523
+	.2byte	0x538
 	.4byte	0xc6
 	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x525
+	.2byte	0x53a
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3107
+	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x526
+	.2byte	0x53b
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3108
+	.4byte	.LASF3110
 	.byte	0x1
-	.2byte	0x526
+	.2byte	0x53b
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3109
+	.4byte	.LASF3111
 	.byte	0x1
-	.2byte	0x527
+	.2byte	0x53c
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3110
+	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x528
+	.2byte	0x53d
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3111
+	.4byte	.LASF3113
 	.byte	0x1
-	.2byte	0x529
+	.2byte	0x53e
 	.4byte	0x46f4
 	.uleb128 0x73
+	.4byte	.LASF3114
+	.byte	0x1
+	.2byte	0x54b
+	.byte	0
+	.uleb128 0x50
+	.4byte	.LASF3115
+	.byte	0x1
+	.2byte	0x523
+	.4byte	0xc6
+	.8byte	.LFB2826
+	.8byte	.LFE2826-.LFB2826
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x12256
+	.uleb128 0x59
+	.4byte	.LASF3106
+	.byte	0x1
+	.2byte	0x523
+	.4byte	0x46ee
+	.4byte	.LLST75
+	.uleb128 0x59
+	.4byte	.LASF3108
+	.byte	0x1
+	.2byte	0x523
+	.4byte	0xc6
+	.4byte	.LLST76
+	.uleb128 0x53
+	.string	"i"
+	.byte	0x1
+	.2byte	0x525
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF3109
+	.byte	0x1
+	.2byte	0x526
+	.4byte	0x15a
+	.uleb128 0x48
 	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x536
+	.2byte	0x527
+	.4byte	0x46f4
+	.uleb128 0x5a
+	.4byte	.LASF3116
+	.byte	0x1
+	.2byte	0x528
+	.4byte	0xc6
+	.4byte	.LLST77
+	.uleb128 0x5a
+	.4byte	.LASF3117
+	.byte	0x1
+	.2byte	0x529
+	.4byte	0xc6
+	.4byte	.LLST78
+	.uleb128 0x4f
+	.8byte	.LVL286
+	.4byte	0x14879
 	.byte	0
 	.uleb128 0x51
-	.4byte	.LASF3113
+	.4byte	.LASF3118
 	.byte	0x1
 	.2byte	0x4c6
 	.4byte	0xc6
@@ -43232,24 +43417,24 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2825-.LFB2825
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x122ec
+	.4byte	0x123aa
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x4c6
 	.4byte	0xe53f
-	.4byte	.LLST75
+	.4byte	.LLST79
 	.uleb128 0x48
 	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x4c8
-	.4byte	0xe830
+	.4byte	0xe85c
 	.uleb128 0x5a
-	.4byte	.LASF3114
+	.4byte	.LASF3119
 	.byte	0x1
 	.2byte	0x4c9
 	.4byte	0xc6
-	.4byte	.LLST76
+	.4byte	.LLST80
 	.uleb128 0x6a
 	.string	"ret"
 	.byte	0x1
@@ -43258,80 +43443,80 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x64
 	.uleb128 0x54
-	.4byte	0x133f3
+	.4byte	0x134b1
 	.8byte	.LBB1212
 	.8byte	.LBE1212-.LBB1212
 	.byte	0x1
 	.2byte	0x4cd
-	.4byte	0x1221b
+	.4byte	0x122d9
 	.uleb128 0x55
-	.4byte	0x1340f
+	.4byte	0x134cd
 	.uleb128 0x55
-	.4byte	0x13403
+	.4byte	0x134c1
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL282
-	.4byte	0x144e8
+	.8byte	.LVL292
+	.4byte	0x145a6
 	.uleb128 0x4f
-	.8byte	.LVL283
-	.4byte	0x147bb
+	.8byte	.LVL293
+	.4byte	0x14885
 	.uleb128 0x4f
-	.8byte	.LVL287
-	.4byte	0x14562
+	.8byte	.LVL297
+	.4byte	0x14620
 	.uleb128 0x4f
-	.8byte	.LVL288
-	.4byte	0x144e8
+	.8byte	.LVL298
+	.4byte	0x145a6
 	.uleb128 0x4f
-	.8byte	.LVL290
-	.4byte	0x147bb
+	.8byte	.LVL300
+	.4byte	0x14885
 	.uleb128 0x4f
-	.8byte	.LVL291
-	.4byte	0x14562
+	.8byte	.LVL301
+	.4byte	0x14620
 	.uleb128 0x4f
-	.8byte	.LVL292
-	.4byte	0x147bb
+	.8byte	.LVL302
+	.4byte	0x14885
 	.uleb128 0x4f
-	.8byte	.LVL293
-	.4byte	0x147bb
+	.8byte	.LVL303
+	.4byte	0x14885
 	.uleb128 0x4f
-	.8byte	.LVL294
-	.4byte	0x147bb
+	.8byte	.LVL304
+	.4byte	0x14885
 	.uleb128 0x4f
-	.8byte	.LVL295
-	.4byte	0x147bb
+	.8byte	.LVL305
+	.4byte	0x14885
 	.uleb128 0x4f
-	.8byte	.LVL296
-	.4byte	0x147bb
+	.8byte	.LVL306
+	.4byte	0x14885
 	.uleb128 0x4f
-	.8byte	.LVL297
-	.4byte	0x147bb
+	.8byte	.LVL307
+	.4byte	0x14885
 	.uleb128 0x4f
-	.8byte	.LVL298
-	.4byte	0x147bb
+	.8byte	.LVL308
+	.4byte	0x14885
 	.uleb128 0x4f
-	.8byte	.LVL299
-	.4byte	0x147bb
+	.8byte	.LVL309
+	.4byte	0x14885
 	.uleb128 0x4f
-	.8byte	.LVL300
-	.4byte	0x144e8
+	.8byte	.LVL310
+	.4byte	0x145a6
 	.uleb128 0x4f
-	.8byte	.LVL301
-	.4byte	0x14696
+	.8byte	.LVL311
+	.4byte	0x14754
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3115
+	.4byte	.LASF3120
 	.byte	0x1
 	.2byte	0x49f
 	.8byte	.LFB2824
 	.8byte	.LFE2824-.LFB2824
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x123a5
+	.4byte	0x12463
 	.uleb128 0x48
 	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x4a1
-	.4byte	0xe830
+	.4byte	0xe85c
 	.uleb128 0x48
 	.4byte	.LASF3019
 	.byte	0x1
@@ -43339,37 +43524,37 @@ __exitcall_ebc_exit:
 	.4byte	0xe1dc
 	.uleb128 0x4f
 	.8byte	.LVL265
-	.4byte	0x144e8
+	.4byte	0x145a6
 	.uleb128 0x4f
 	.8byte	.LVL266
-	.4byte	0x14634
+	.4byte	0x146f2
 	.uleb128 0x4f
 	.8byte	.LVL267
-	.4byte	0x14634
+	.4byte	0x146f2
 	.uleb128 0x4f
 	.8byte	.LVL268
-	.4byte	0x14593
+	.4byte	0x14651
 	.uleb128 0x4f
 	.8byte	.LVL269
-	.4byte	0x144e8
+	.4byte	0x145a6
 	.uleb128 0x4f
 	.8byte	.LVL270
-	.4byte	0x1454c
+	.4byte	0x1460a
 	.uleb128 0x4f
 	.8byte	.LVL271
-	.4byte	0x145d2
+	.4byte	0x14690
 	.uleb128 0x4f
 	.8byte	.LVL272
-	.4byte	0x14634
+	.4byte	0x146f2
 	.uleb128 0x4f
 	.8byte	.LVL273
-	.4byte	0x14634
+	.4byte	0x146f2
 	.uleb128 0x4f
 	.8byte	.LVL274
-	.4byte	0x14593
+	.4byte	0x14651
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3116
+	.4byte	.LASF3121
 	.byte	0x1
 	.2byte	0x453
 	.4byte	0xc6
@@ -43377,13 +43562,13 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2823-.LFB2823
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1255c
+	.4byte	0x1261a
 	.uleb128 0x59
 	.4byte	.LASF794
 	.byte	0x1
 	.2byte	0x453
 	.4byte	0x458
-	.4byte	.LLST145
+	.4byte	.LLST149
 	.uleb128 0x6a
 	.string	"ebc"
 	.byte	0x1
@@ -43400,17 +43585,17 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x457
-	.4byte	0xe830
+	.4byte	0xe85c
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0xb30
-	.4byte	0x1248f
+	.4byte	0x1254d
 	.uleb128 0x41
 	.byte	0x8
 	.byte	0x1
 	.2byte	0x45e
-	.4byte	0x12428
+	.4byte	0x124e6
 	.uleb128 0x43
-	.4byte	.LASF3117
+	.4byte	.LASF3122
 	.byte	0x1
 	.2byte	0x45e
 	.4byte	0x1a0
@@ -43418,29 +43603,29 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x1
 	.2byte	0x45e
-	.4byte	0x1255c
+	.4byte	0x1261a
 	.byte	0
 	.uleb128 0x53
 	.string	"__u"
 	.byte	0x1
 	.2byte	0x45e
-	.4byte	0x12406
+	.4byte	0x124c4
 	.uleb128 0x5c
-	.4byte	0x13c42
+	.4byte	0x13d00
 	.8byte	.LBB1396
 	.4byte	.Ldebug_ranges0+0xb70
 	.byte	0x1
 	.2byte	0x45e
-	.4byte	0x1245c
+	.4byte	0x1251a
 	.uleb128 0x55
-	.4byte	0x13c65
+	.4byte	0x13d23
 	.uleb128 0x55
-	.4byte	0x13c59
+	.4byte	0x13d17
 	.uleb128 0x55
-	.4byte	0x13c4f
+	.4byte	0x13d0d
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x13a41
+	.4byte	0x13aff
 	.8byte	.LBB1399
 	.8byte	.LBE1399-.LBB1399
 	.byte	0x1
@@ -43449,86 +43634,86 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1400
 	.8byte	.LBE1400-.LBB1400
 	.uleb128 0x62
-	.4byte	0x13a51
+	.4byte	0x13b0f
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x138ed
+	.4byte	0x139ab
 	.8byte	.LBB1404
 	.4byte	.Ldebug_ranges0+0xba0
 	.byte	0x1
 	.2byte	0x496
-	.4byte	0x124cc
+	.4byte	0x1258a
 	.uleb128 0x55
-	.4byte	0x13909
+	.4byte	0x139c7
 	.uleb128 0x55
-	.4byte	0x138fe
+	.4byte	0x139bc
 	.uleb128 0x4f
-	.8byte	.LVL497
-	.4byte	0x147c7
+	.8byte	.LVL507
+	.4byte	0x14891
 	.uleb128 0x4f
-	.8byte	.LVL504
-	.4byte	0x147c7
+	.8byte	.LVL514
+	.4byte	0x14891
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL492
-	.4byte	0x147d4
+	.8byte	.LVL502
+	.4byte	0x1489e
 	.uleb128 0x4f
-	.8byte	.LVL493
-	.4byte	0x146f7
+	.8byte	.LVL503
+	.4byte	0x147b5
 	.uleb128 0x4f
-	.8byte	.LVL494
-	.4byte	0x147de
+	.8byte	.LVL504
+	.4byte	0x148a8
 	.uleb128 0x4f
-	.8byte	.LVL495
-	.4byte	0x1425d
+	.8byte	.LVL505
+	.4byte	0x1431b
 	.uleb128 0x4f
-	.8byte	.LVL496
-	.4byte	0x12b4a
+	.8byte	.LVL506
+	.4byte	0x12c08
 	.uleb128 0x4f
-	.8byte	.LVL498
-	.4byte	0x1425d
+	.8byte	.LVL508
+	.4byte	0x1431b
 	.uleb128 0x4f
-	.8byte	.LVL499
-	.4byte	0x12960
+	.8byte	.LVL509
+	.4byte	0x12a1e
 	.uleb128 0x4f
-	.8byte	.LVL500
-	.4byte	0x1425d
+	.8byte	.LVL510
+	.4byte	0x1431b
 	.uleb128 0x4f
-	.8byte	.LVL501
-	.4byte	0x12cab
+	.8byte	.LVL511
+	.4byte	0x12d69
 	.uleb128 0x4f
-	.8byte	.LVL502
-	.4byte	0x1425d
+	.8byte	.LVL512
+	.4byte	0x1431b
 	.uleb128 0x4f
-	.8byte	.LVL503
-	.4byte	0x12776
+	.8byte	.LVL513
+	.4byte	0x12834
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x1256c
+	.4byte	0x1262a
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3118
+	.4byte	.LASF3123
 	.byte	0x1
 	.2byte	0x3ff
 	.8byte	.LFB2822
 	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12718
+	.4byte	0x127d6
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x3ff
 	.4byte	0xe53f
-	.4byte	.LLST144
+	.4byte	.LLST148
 	.uleb128 0x48
 	.4byte	.LASF3019
 	.byte	0x1
@@ -43538,110 +43723,110 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x402
-	.4byte	0xe830
+	.4byte	0xe85c
 	.uleb128 0x56
-	.4byte	.LASF3047
+	.4byte	.LASF3049
 	.4byte	0xb9b0
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	__func__.34785
 	.uleb128 0x54
-	.4byte	0x12718
+	.4byte	0x127d6
 	.8byte	.LBB1387
 	.8byte	.LBE1387-.LBB1387
 	.byte	0x1
 	.2byte	0x40c
-	.4byte	0x125f9
+	.4byte	0x126b7
 	.uleb128 0x55
-	.4byte	0x12731
+	.4byte	0x127ef
 	.uleb128 0x55
-	.4byte	0x12725
+	.4byte	0x127e3
 	.uleb128 0x4f
-	.8byte	.LVL464
-	.4byte	0x1425d
+	.8byte	.LVL474
+	.4byte	0x1431b
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12718
+	.4byte	0x127d6
 	.8byte	.LBB1389
 	.8byte	.LBE1389-.LBB1389
 	.byte	0x1
 	.2byte	0x420
-	.4byte	0x1262d
+	.4byte	0x126eb
 	.uleb128 0x55
-	.4byte	0x12731
+	.4byte	0x127ef
 	.uleb128 0x55
-	.4byte	0x12725
+	.4byte	0x127e3
 	.uleb128 0x4f
-	.8byte	.LVL469
-	.4byte	0x1425d
+	.8byte	.LVL479
+	.4byte	0x1431b
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12718
+	.4byte	0x127d6
 	.8byte	.LBB1391
 	.8byte	.LBE1391-.LBB1391
 	.byte	0x1
 	.2byte	0x447
-	.4byte	0x12661
+	.4byte	0x1271f
 	.uleb128 0x55
-	.4byte	0x12731
+	.4byte	0x127ef
 	.uleb128 0x55
-	.4byte	0x12725
+	.4byte	0x127e3
 	.uleb128 0x4f
-	.8byte	.LVL474
-	.4byte	0x1425d
+	.8byte	.LVL484
+	.4byte	0x1431b
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x12718
+	.4byte	0x127d6
 	.8byte	.LBB1393
 	.8byte	.LBE1393-.LBB1393
 	.byte	0x1
 	.2byte	0x43a
-	.4byte	0x12695
+	.4byte	0x12753
 	.uleb128 0x55
-	.4byte	0x12731
+	.4byte	0x127ef
 	.uleb128 0x55
-	.4byte	0x12725
+	.4byte	0x127e3
 	.uleb128 0x4f
-	.8byte	.LVL479
-	.4byte	0x1425d
+	.8byte	.LVL489
+	.4byte	0x1431b
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL463
-	.4byte	0x12b4a
-	.uleb128 0x4f
-	.8byte	.LVL465
-	.4byte	0x12b4a
-	.uleb128 0x4f
-	.8byte	.LVL468
-	.4byte	0x12cab
-	.uleb128 0x4f
-	.8byte	.LVL470
-	.4byte	0x12cab
-	.uleb128 0x4f
 	.8byte	.LVL473
-	.4byte	0x12960
+	.4byte	0x12c08
 	.uleb128 0x4f
 	.8byte	.LVL475
-	.4byte	0x12960
+	.4byte	0x12c08
 	.uleb128 0x4f
 	.8byte	.LVL478
-	.4byte	0x12776
+	.4byte	0x12d69
 	.uleb128 0x4f
 	.8byte	.LVL480
-	.4byte	0x12776
+	.4byte	0x12d69
 	.uleb128 0x4f
 	.8byte	.LVL483
-	.4byte	0x144e8
+	.4byte	0x12a1e
 	.uleb128 0x4f
-	.8byte	.LVL486
-	.4byte	0x144e8
+	.8byte	.LVL485
+	.4byte	0x12a1e
+	.uleb128 0x4f
+	.8byte	.LVL488
+	.4byte	0x12834
+	.uleb128 0x4f
+	.8byte	.LVL490
+	.4byte	0x12834
+	.uleb128 0x4f
+	.8byte	.LVL493
+	.4byte	0x145a6
+	.uleb128 0x4f
+	.8byte	.LVL496
+	.4byte	0x145a6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3119
+	.4byte	.LASF3124
 	.byte	0x1
 	.2byte	0x3f9
 	.byte	0x1
-	.4byte	0x1273e
+	.4byte	0x127fc
 	.uleb128 0x66
 	.4byte	.LASF3019
 	.byte	0x1
@@ -43651,14 +43836,14 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x3f9
-	.4byte	0xe830
+	.4byte	0xe85c
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3120
+	.4byte	.LASF3125
 	.byte	0x1
 	.2byte	0x3ee
 	.byte	0x1
-	.4byte	0x12770
+	.4byte	0x1282e
 	.uleb128 0x66
 	.4byte	.LASF3019
 	.byte	0x1
@@ -43668,34 +43853,34 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x3ee
-	.4byte	0xe830
+	.4byte	0xe85c
 	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
 	.2byte	0x3f0
-	.4byte	0x12770
+	.4byte	0x1282e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xdf66
 	.uleb128 0x67
-	.4byte	.LASF3121
+	.4byte	.LASF3126
 	.byte	0x1
 	.2byte	0x3e4
 	.byte	0x1
-	.4byte	0x127b4
+	.4byte	0x12872
 	.uleb128 0x66
-	.4byte	.LASF3122
+	.4byte	.LASF3127
 	.byte	0x1
 	.2byte	0x3e4
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3123
+	.4byte	.LASF3128
 	.byte	0x1
 	.2byte	0x3e5
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3124
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x3e5
 	.4byte	0xac0
@@ -43703,26 +43888,26 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x3e6
-	.4byte	0xe830
+	.4byte	0xe85c
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3125
+	.4byte	.LASF3130
 	.byte	0x1
 	.2byte	0x3ba
 	.byte	0x1
-	.4byte	0x1288a
+	.4byte	0x12948
 	.uleb128 0x66
-	.4byte	.LASF3122
+	.4byte	.LASF3127
 	.byte	0x1
 	.2byte	0x3ba
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3123
+	.4byte	.LASF3128
 	.byte	0x1
 	.2byte	0x3bb
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3124
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x3bb
 	.4byte	0xac0
@@ -43730,34 +43915,34 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x3bc
-	.4byte	0xe830
+	.4byte	0xe85c
 	.uleb128 0x48
 	.4byte	.LASF3019
 	.byte	0x1
 	.2byte	0x3be
 	.4byte	0xe1dc
 	.uleb128 0x48
-	.4byte	.LASF3126
+	.4byte	.LASF3131
 	.byte	0x1
 	.2byte	0x3bf
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3127
+	.4byte	.LASF3132
 	.byte	0x1
 	.2byte	0x3bf
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3128
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x3bf
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3129
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x3bf
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3130
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x3c0
 	.4byte	0xc138
@@ -43782,7 +43967,7 @@ __exitcall_ebc_exit:
 	.2byte	0x3c2
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3131
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x3c3
 	.4byte	0xc6
@@ -43798,23 +43983,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3132
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x391
 	.byte	0x1
-	.4byte	0x12960
+	.4byte	0x12a1e
 	.uleb128 0x66
-	.4byte	.LASF3122
+	.4byte	.LASF3127
 	.byte	0x1
 	.2byte	0x391
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3123
+	.4byte	.LASF3128
 	.byte	0x1
 	.2byte	0x392
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3124
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x392
 	.4byte	0xac0
@@ -43822,34 +44007,34 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x393
-	.4byte	0xe830
+	.4byte	0xe85c
 	.uleb128 0x48
 	.4byte	.LASF3019
 	.byte	0x1
 	.2byte	0x395
 	.4byte	0xe1dc
 	.uleb128 0x48
-	.4byte	.LASF3126
+	.4byte	.LASF3131
 	.byte	0x1
 	.2byte	0x396
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3127
+	.4byte	.LASF3132
 	.byte	0x1
 	.2byte	0x396
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3128
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x396
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3129
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x396
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3130
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x397
 	.4byte	0xc138
@@ -43874,7 +44059,7 @@ __exitcall_ebc_exit:
 	.2byte	0x399
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3131
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x39a
 	.4byte	0xc6
@@ -43890,23 +44075,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3133
+	.4byte	.LASF3138
 	.byte	0x1
 	.2byte	0x386
 	.byte	0x1
-	.4byte	0x1299e
+	.4byte	0x12a5c
 	.uleb128 0x66
-	.4byte	.LASF3122
+	.4byte	.LASF3127
 	.byte	0x1
 	.2byte	0x386
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3123
+	.4byte	.LASF3128
 	.byte	0x1
 	.2byte	0x387
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3124
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x387
 	.4byte	0xac0
@@ -43914,26 +44099,26 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x388
-	.4byte	0xe830
+	.4byte	0xe85c
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3134
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x362
 	.byte	0x1
-	.4byte	0x12a74
+	.4byte	0x12b32
 	.uleb128 0x66
-	.4byte	.LASF3122
+	.4byte	.LASF3127
 	.byte	0x1
 	.2byte	0x362
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3123
+	.4byte	.LASF3128
 	.byte	0x1
 	.2byte	0x363
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3124
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x363
 	.4byte	0xac0
@@ -43941,7 +44126,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x364
-	.4byte	0xe830
+	.4byte	0xe85c
 	.uleb128 0x48
 	.4byte	.LASF3019
 	.byte	0x1
@@ -43968,32 +44153,32 @@ __exitcall_ebc_exit:
 	.2byte	0x369
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3126
+	.4byte	.LASF3131
 	.byte	0x1
 	.2byte	0x36a
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3127
+	.4byte	.LASF3132
 	.byte	0x1
 	.2byte	0x36a
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3128
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x36a
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3129
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x36a
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3130
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x36b
 	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF3131
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x36c
 	.4byte	0xc6
@@ -44009,23 +44194,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3135
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x33b
 	.byte	0x1
-	.4byte	0x12b4a
+	.4byte	0x12c08
 	.uleb128 0x66
-	.4byte	.LASF3122
+	.4byte	.LASF3127
 	.byte	0x1
 	.2byte	0x33b
 	.4byte	0xc138
 	.uleb128 0x66
-	.4byte	.LASF3123
+	.4byte	.LASF3128
 	.byte	0x1
 	.2byte	0x33c
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3124
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x33c
 	.4byte	0xac0
@@ -44033,7 +44218,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x33d
-	.4byte	0xe830
+	.4byte	0xe85c
 	.uleb128 0x48
 	.4byte	.LASF3019
 	.byte	0x1
@@ -44060,32 +44245,32 @@ __exitcall_ebc_exit:
 	.2byte	0x342
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3126
+	.4byte	.LASF3131
 	.byte	0x1
 	.2byte	0x343
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3127
+	.4byte	.LASF3132
 	.byte	0x1
 	.2byte	0x343
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3128
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x343
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3129
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x343
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3130
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x344
 	.4byte	0xc138
 	.uleb128 0x48
-	.4byte	.LASF3131
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x345
 	.4byte	0xc6
@@ -44101,37 +44286,37 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3136
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x26d
 	.8byte	.LFB2813
 	.8byte	.LFE2813-.LFB2813
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12cab
+	.4byte	0x12d69
 	.uleb128 0x75
-	.4byte	.LASF3122
+	.4byte	.LASF3127
 	.byte	0x1
 	.2byte	0x26d
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x75
-	.4byte	.LASF3123
+	.4byte	.LASF3128
 	.byte	0x1
 	.2byte	0x26d
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x75
-	.4byte	.LASF3124
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x26d
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x75
-	.4byte	.LASF3137
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x26e
 	.4byte	0xc138
@@ -44141,7 +44326,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x26e
-	.4byte	0xe830
+	.4byte	0xe85c
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x48
@@ -44176,38 +44361,38 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x5a
-	.4byte	.LASF3126
+	.4byte	.LASF3131
 	.byte	0x1
 	.2byte	0x275
 	.4byte	0x13f
 	.4byte	.LLST6
 	.uleb128 0x5a
-	.4byte	.LASF3127
+	.4byte	.LASF3132
 	.byte	0x1
 	.2byte	0x275
 	.4byte	0x13f
 	.4byte	.LLST7
 	.uleb128 0x48
-	.4byte	.LASF3138
+	.4byte	.LASF3143
 	.byte	0x1
 	.2byte	0x275
 	.4byte	0x13f
 	.uleb128 0x4d
-	.4byte	.LASF3128
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x276
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4d
-	.4byte	.LASF3129
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x276
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5a
-	.4byte	.LASF3130
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x277
 	.4byte	0xc138
@@ -44218,14 +44403,14 @@ __exitcall_ebc_exit:
 	.2byte	0x278
 	.4byte	0x110
 	.uleb128 0x4d
-	.4byte	.LASF3139
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x279
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3145
 	.byte	0x1
 	.2byte	0x27a
 	.4byte	0x110
@@ -44240,54 +44425,54 @@ __exitcall_ebc_exit:
 	.2byte	0x27c
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3146
 	.byte	0x1
 	.2byte	0x27d
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3147
 	.byte	0x1
 	.2byte	0x27d
 	.4byte	0x110
 	.uleb128 0x5a
-	.4byte	.LASF3143
+	.4byte	.LASF3148
 	.byte	0x1
 	.2byte	0x27e
 	.4byte	0x13f
 	.4byte	.LLST9
 	.byte	0
 	.uleb128 0x4e
-	.4byte	.LASF3144
+	.4byte	.LASF3149
 	.byte	0x1
 	.2byte	0x1c8
 	.8byte	.LFB2812
 	.8byte	.LFE2812-.LFB2812
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12e06
+	.4byte	0x12ec4
 	.uleb128 0x75
-	.4byte	.LASF3122
+	.4byte	.LASF3127
 	.byte	0x1
 	.2byte	0x1c8
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x75
-	.4byte	.LASF3123
+	.4byte	.LASF3128
 	.byte	0x1
 	.2byte	0x1c8
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x75
-	.4byte	.LASF3124
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x1c8
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x75
-	.4byte	.LASF3137
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x1c9
 	.4byte	0xc138
@@ -44297,7 +44482,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x1c9
-	.4byte	0xe830
+	.4byte	0xe85c
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x48
@@ -44330,33 +44515,33 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.4byte	.LLST1
 	.uleb128 0x5a
-	.4byte	.LASF3126
+	.4byte	.LASF3131
 	.byte	0x1
 	.2byte	0x1d0
 	.4byte	0x13f
 	.4byte	.LLST2
 	.uleb128 0x5a
-	.4byte	.LASF3127
+	.4byte	.LASF3132
 	.byte	0x1
 	.2byte	0x1d0
 	.4byte	0x13f
 	.4byte	.LLST3
 	.uleb128 0x4d
-	.4byte	.LASF3128
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x1d1
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4d
-	.4byte	.LASF3129
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x1d1
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5a
-	.4byte	.LASF3130
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x1d2
 	.4byte	0xc138
@@ -44369,14 +44554,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x4d
-	.4byte	.LASF3139
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x1d4
 	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3145
 	.byte	0x1
 	.2byte	0x1d5
 	.4byte	0x110
@@ -44391,45 +44576,45 @@ __exitcall_ebc_exit:
 	.2byte	0x1d7
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3141
+	.4byte	.LASF3146
 	.byte	0x1
 	.2byte	0x1d8
 	.4byte	0x110
 	.uleb128 0x48
-	.4byte	.LASF3142
+	.4byte	.LASF3147
 	.byte	0x1
 	.2byte	0x1d8
 	.4byte	0x110
 	.uleb128 0x5a
-	.4byte	.LASF3143
+	.4byte	.LASF3148
 	.byte	0x1
 	.2byte	0x1d9
 	.4byte	0x13f
 	.4byte	.LLST5
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3145
+	.4byte	.LASF3150
 	.byte	0x1
 	.2byte	0x169
 	.byte	0x1
-	.4byte	0x12f24
+	.4byte	0x12fe2
 	.uleb128 0x66
-	.4byte	.LASF3146
+	.4byte	.LASF3151
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3147
+	.4byte	.LASF3152
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3148
+	.4byte	.LASF3153
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3137
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0x46f4
@@ -44437,7 +44622,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x16a
-	.4byte	0xe830
+	.4byte	0xe85c
 	.uleb128 0x66
 	.4byte	.LASF2882
 	.byte	0x1
@@ -44454,47 +44639,47 @@ __exitcall_ebc_exit:
 	.2byte	0x16c
 	.4byte	0xc6
 	.uleb128 0x48
-	.4byte	.LASF3149
+	.4byte	.LASF3154
 	.byte	0x1
 	.2byte	0x16d
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3150
+	.4byte	.LASF3155
 	.byte	0x1
 	.2byte	0x16d
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3151
+	.4byte	.LASF3156
 	.byte	0x1
 	.2byte	0x16d
 	.4byte	0x13f
 	.uleb128 0x48
-	.4byte	.LASF3152
+	.4byte	.LASF3157
 	.byte	0x1
 	.2byte	0x16e
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3153
+	.4byte	.LASF3158
 	.byte	0x1
 	.2byte	0x16e
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3154
+	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x16e
 	.4byte	0xac0
 	.uleb128 0x48
-	.4byte	.LASF3140
+	.4byte	.LASF3145
 	.byte	0x1
 	.2byte	0x16f
 	.4byte	0x15a
 	.uleb128 0x48
-	.4byte	.LASF3139
+	.4byte	.LASF3144
 	.byte	0x1
 	.2byte	0x170
 	.4byte	0x46f4
 	.uleb128 0x48
-	.4byte	.LASF3155
+	.4byte	.LASF3160
 	.byte	0x1
 	.2byte	0x171
 	.4byte	0x13f
@@ -44530,73 +44715,73 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x76
-	.4byte	.LASF3156
+	.4byte	.LASF3161
 	.byte	0x1
 	.2byte	0x152
 	.8byte	.LFB2810
 	.8byte	.LFE2810-.LFB2810
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12fb4
+	.4byte	0x13072
 	.uleb128 0x59
 	.4byte	.LASF2288
 	.byte	0x1
 	.2byte	0x152
 	.4byte	0x3205
-	.4byte	.LLST185
+	.4byte	.LLST189
 	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x154
 	.4byte	0xe53f
-	.4byte	.LLST186
+	.4byte	.LLST190
 	.uleb128 0x5a
 	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x155
-	.4byte	0xe830
-	.4byte	.LLST187
+	.4byte	0xe85c
+	.4byte	.LLST191
 	.uleb128 0x4f
-	.8byte	.LVL751
-	.4byte	0x1478b
+	.8byte	.LVL761
+	.4byte	0x14849
 	.uleb128 0x4f
-	.8byte	.LVL753
-	.4byte	0x1307b
+	.8byte	.LVL763
+	.4byte	0x13139
 	.uleb128 0x4f
-	.8byte	.LVL754
-	.4byte	0x147a3
+	.8byte	.LVL764
+	.4byte	0x14861
 	.uleb128 0x4f
-	.8byte	.LVL757
-	.4byte	0x12fb4
+	.8byte	.LVL767
+	.4byte	0x13072
 	.uleb128 0x4f
-	.8byte	.LVL758
-	.4byte	0x147a3
+	.8byte	.LVL768
+	.4byte	0x14861
 	.byte	0
 	.uleb128 0x76
-	.4byte	.LASF3157
+	.4byte	.LASF3162
 	.byte	0x1
 	.2byte	0x121
 	.8byte	.LFB2809
 	.8byte	.LFE2809-.LFB2809
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1307b
+	.4byte	0x13139
 	.uleb128 0x75
-	.4byte	.LASF3146
+	.4byte	.LASF3151
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x75
-	.4byte	.LASF3147
+	.4byte	.LASF3152
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x75
-	.4byte	.LASF3137
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0x46f4
@@ -44606,8 +44791,8 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x122
-	.4byte	0xe830
-	.4byte	.LLST181
+	.4byte	0xe85c
+	.4byte	.LLST185
 	.uleb128 0x4d
 	.4byte	.LASF2914
 	.byte	0x1
@@ -44623,22 +44808,22 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x59
 	.uleb128 0x48
-	.4byte	.LASF3149
+	.4byte	.LASF3154
 	.byte	0x1
 	.2byte	0x125
 	.4byte	0x13f
 	.uleb128 0x5a
-	.4byte	.LASF3150
+	.4byte	.LASF3155
 	.byte	0x1
 	.2byte	0x125
 	.4byte	0x13f
-	.4byte	.LLST182
+	.4byte	.LLST186
 	.uleb128 0x5a
-	.4byte	.LASF3140
+	.4byte	.LASF3145
 	.byte	0x1
 	.2byte	0x126
 	.4byte	0x15a
-	.4byte	.LLST183
+	.4byte	.LLST187
 	.uleb128 0x6a
 	.string	"i"
 	.byte	0x1
@@ -44652,44 +44837,44 @@ __exitcall_ebc_exit:
 	.2byte	0x127
 	.4byte	0xc6
 	.uleb128 0x5a
-	.4byte	.LASF3155
+	.4byte	.LASF3160
 	.byte	0x1
 	.2byte	0x128
 	.4byte	0x13f
-	.4byte	.LLST184
+	.4byte	.LLST188
 	.byte	0
 	.uleb128 0x77
-	.4byte	.LASF3158
+	.4byte	.LASF3163
 	.byte	0x1
 	.byte	0xd6
 	.8byte	.LFB2808
 	.8byte	.LFE2808-.LFB2808
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13160
+	.4byte	0x1321e
 	.uleb128 0x78
-	.4byte	.LASF3146
+	.4byte	.LASF3151
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x78
-	.4byte	.LASF3147
+	.4byte	.LASF3152
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x78
-	.4byte	.LASF3148
+	.4byte	.LASF3153
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x78
-	.4byte	.LASF3137
+	.4byte	.LASF3142
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0x46f4
@@ -44699,14 +44884,14 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2975
 	.byte	0x1
 	.byte	0xd7
-	.4byte	0xe830
-	.4byte	.LLST175
+	.4byte	0xe85c
+	.4byte	.LLST179
 	.uleb128 0x79
 	.4byte	.LASF2882
 	.byte	0x1
 	.byte	0xd7
 	.4byte	0xc6
-	.4byte	.LLST176
+	.4byte	.LLST180
 	.uleb128 0x4c
 	.4byte	.LASF2914
 	.byte	0x1
@@ -44722,28 +44907,28 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x7a
-	.4byte	.LASF3149
+	.4byte	.LASF3154
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x13f
 	.uleb128 0x7b
-	.4byte	.LASF3150
+	.4byte	.LASF3155
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x13f
-	.4byte	.LLST177
+	.4byte	.LLST181
 	.uleb128 0x7b
-	.4byte	.LASF3151
+	.4byte	.LASF3156
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x13f
-	.4byte	.LLST178
+	.4byte	.LLST182
 	.uleb128 0x7b
-	.4byte	.LASF3140
+	.4byte	.LASF3145
 	.byte	0x1
 	.byte	0xdb
 	.4byte	0x15a
-	.4byte	.LLST179
+	.4byte	.LLST183
 	.uleb128 0x7c
 	.string	"i"
 	.byte	0x1
@@ -44757,26 +44942,26 @@ __exitcall_ebc_exit:
 	.byte	0xdc
 	.4byte	0xc6
 	.uleb128 0x7b
-	.4byte	.LASF3155
+	.4byte	.LASF3160
 	.byte	0x1
 	.byte	0xdd
 	.4byte	0x13f
-	.4byte	.LLST180
+	.4byte	.LLST184
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3159
+	.4byte	.LASF3164
 	.byte	0x1
 	.byte	0xb7
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x13193
+	.4byte	0x13251
 	.uleb128 0x7f
 	.string	"ebc"
 	.byte	0x1
 	.byte	0xb7
 	.4byte	0xe53f
 	.uleb128 0x80
-	.4byte	.LASF3160
+	.4byte	.LASF3165
 	.byte	0x1
 	.byte	0xb7
 	.4byte	0xc6
@@ -44784,70 +44969,70 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2975
 	.byte	0x1
 	.byte	0xb9
-	.4byte	0xe830
+	.4byte	0xe85c
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3161
+	.4byte	.LASF3166
 	.byte	0x1
 	.byte	0x89
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x131de
+	.4byte	0x1329c
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
 	.byte	0x89
 	.4byte	0xc138
 	.uleb128 0x80
-	.4byte	.LASF3126
+	.4byte	.LASF3131
 	.byte	0x1
 	.byte	0x89
 	.4byte	0x11f
 	.uleb128 0x80
-	.4byte	.LASF3127
+	.4byte	.LASF3132
 	.byte	0x1
 	.byte	0x89
 	.4byte	0x11f
 	.uleb128 0x7a
-	.4byte	.LASF3162
+	.4byte	.LASF3167
 	.byte	0x1
 	.byte	0x8b
 	.4byte	0x110
 	.uleb128 0x7a
-	.4byte	.LASF3143
+	.4byte	.LASF3148
 	.byte	0x1
 	.byte	0x8c
 	.4byte	0x11f
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3163
+	.4byte	.LASF3168
 	.byte	0x1
 	.byte	0x83
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x13213
+	.4byte	0x132d1
 	.uleb128 0x80
 	.4byte	.LASF2871
 	.byte	0x1
 	.byte	0x83
 	.4byte	0xc138
 	.uleb128 0x80
-	.4byte	.LASF3126
+	.4byte	.LASF3131
 	.byte	0x1
 	.byte	0x83
 	.4byte	0x11f
 	.uleb128 0x80
-	.4byte	.LASF3127
+	.4byte	.LASF3132
 	.byte	0x1
 	.byte	0x83
 	.4byte	0x11f
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3164
+	.4byte	.LASF3169
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x13239
+	.4byte	0x132f7
 	.uleb128 0x80
 	.4byte	.LASF2950
 	.byte	0xb
@@ -44860,65 +45045,65 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3165
+	.4byte	.LASF3170
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x1326b
+	.4byte	0x13329
 	.uleb128 0x80
 	.4byte	.LASF2950
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0xe19c
 	.uleb128 0x80
-	.4byte	.LASF3166
+	.4byte	.LASF3171
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13f
 	.uleb128 0x80
-	.4byte	.LASF3167
+	.4byte	.LASF3172
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3168
+	.4byte	.LASF3173
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x132b5
+	.4byte	0x13373
 	.uleb128 0x80
 	.4byte	.LASF2950
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xe19c
 	.uleb128 0x80
-	.4byte	.LASF3169
+	.4byte	.LASF3174
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xc6
 	.uleb128 0x80
-	.4byte	.LASF3170
+	.4byte	.LASF3175
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x80
-	.4byte	.LASF3171
+	.4byte	.LASF3176
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x80
-	.4byte	.LASF3172
+	.4byte	.LASF3177
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3173
+	.4byte	.LASF3178
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x132cf
+	.4byte	0x1338d
 	.uleb128 0x80
 	.4byte	.LASF2950
 	.byte	0xb
@@ -44926,12 +45111,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe19c
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3174
+	.4byte	.LASF3179
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x132f8
+	.4byte	0x133b6
 	.uleb128 0x80
 	.4byte	.LASF2950
 	.byte	0xb
@@ -44944,11 +45129,11 @@ __exitcall_ebc_exit:
 	.4byte	0xe1dc
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3175
+	.4byte	.LASF3180
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x13342
+	.4byte	0x13400
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
@@ -44976,12 +45161,12 @@ __exitcall_ebc_exit:
 	.4byte	0xb829
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3176
+	.4byte	.LASF3181
 	.byte	0xa
 	.2byte	0x108
 	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x13360
+	.4byte	0x1341e
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
@@ -44989,12 +45174,12 @@ __exitcall_ebc_exit:
 	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3177
+	.4byte	.LASF3182
 	.byte	0xc8
 	.byte	0x1d
 	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x1337c
+	.4byte	0x1343a
 	.uleb128 0x7f
 	.string	"bus"
 	.byte	0xc8
@@ -45002,31 +45187,31 @@ __exitcall_ebc_exit:
 	.4byte	0xae47
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3178
+	.4byte	.LASF3183
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13399
+	.4byte	0x13457
 	.uleb128 0x80
-	.4byte	.LASF3179
+	.4byte	.LASF3184
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3180
+	.4byte	.LASF3185
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x133d6
+	.4byte	0x13494
 	.uleb128 0x7f
 	.string	"dev"
 	.byte	0xcb
 	.byte	0xa3
 	.4byte	0xa5e0
 	.uleb128 0x80
-	.4byte	.LASF3181
+	.4byte	.LASF3186
 	.byte	0xcb
 	.byte	0xa4
 	.4byte	0x325
@@ -45036,18 +45221,18 @@ __exitcall_ebc_exit:
 	.byte	0xa5
 	.4byte	0x2e3
 	.uleb128 0x80
-	.4byte	.LASF3182
+	.4byte	.LASF3187
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3183
+	.4byte	.LASF3188
 	.byte	0x3
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x133f3
+	.4byte	0x134b1
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0x3
@@ -45055,12 +45240,12 @@ __exitcall_ebc_exit:
 	.4byte	0xdb9c
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3184
+	.4byte	.LASF3189
 	.byte	0x3
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13419
+	.4byte	0x134d7
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0x3
@@ -45073,11 +45258,11 @@ __exitcall_ebc_exit:
 	.4byte	0x46ee
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3185
+	.4byte	.LASF3190
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x13433
+	.4byte	0x134f1
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0x3
@@ -45085,11 +45270,11 @@ __exitcall_ebc_exit:
 	.4byte	0xdb9c
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3186
+	.4byte	.LASF3191
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x1344d
+	.4byte	0x1350b
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0x3
@@ -45097,11 +45282,11 @@ __exitcall_ebc_exit:
 	.4byte	0xdb9c
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3187
+	.4byte	.LASF3192
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x13467
+	.4byte	0x13525
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0x3
@@ -45109,11 +45294,11 @@ __exitcall_ebc_exit:
 	.4byte	0xdb9c
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3188
+	.4byte	.LASF3193
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x13481
+	.4byte	0x1353f
 	.uleb128 0x80
 	.4byte	.LASF2951
 	.byte	0x3
@@ -45121,16 +45306,16 @@ __exitcall_ebc_exit:
 	.4byte	0xdb9c
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3189
+	.4byte	.LASF3194
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x1349b
+	.4byte	0x13559
 	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x1349b
+	.4byte	0x13559
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -45140,24 +45325,24 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x134bb
+	.4byte	0x13579
 	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x1349b
+	.4byte	0x13559
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3190
+	.4byte	.LASF3195
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x134f7
+	.4byte	0x135b5
 	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x1349b
+	.4byte	0x13559
 	.uleb128 0x80
 	.4byte	.LASF193
 	.byte	0x4
@@ -45175,12 +45360,12 @@ __exitcall_ebc_exit:
 	.4byte	0xad7d
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3191
+	.4byte	.LASF3196
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13527
+	.4byte	0x135e5
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -45198,12 +45383,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3192
+	.4byte	.LASF3197
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13557
+	.4byte	0x13615
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -45221,12 +45406,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3193
+	.4byte	.LASF3198
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13587
+	.4byte	0x13645
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -45244,12 +45429,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3194
+	.4byte	.LASF3199
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x135c2
+	.4byte	0x13680
 	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
@@ -45272,37 +45457,37 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3195
+	.4byte	.LASF3200
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x135f6
+	.4byte	0x136b4
 	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x30bc
 	.uleb128 0x7a
-	.4byte	.LASF3196
+	.4byte	.LASF3201
 	.byte	0x6
 	.byte	0xf7
 	.4byte	0x458
 	.uleb128 0x68
 	.uleb128 0x7a
-	.4byte	.LASF3197
+	.4byte	.LASF3202
 	.byte	0x6
 	.byte	0xfe
 	.4byte	0x15a
 	.byte	0
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3198
+	.4byte	.LASF3203
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13642
+	.4byte	0x13700
 	.uleb128 0x80
 	.4byte	.LASF1164
 	.byte	0x6
@@ -45319,25 +45504,25 @@ __exitcall_ebc_exit:
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x7a
-	.4byte	.LASF3199
+	.4byte	.LASF3204
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x68
 	.uleb128 0x7a
-	.4byte	.LASF3197
+	.4byte	.LASF3202
 	.byte	0x6
 	.byte	0x56
 	.4byte	0x15a
 	.byte	0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3200
+	.4byte	.LASF3205
 	.byte	0x12
 	.2byte	0x2e5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x1366c
+	.4byte	0x1372a
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x12
@@ -45350,12 +45535,12 @@ __exitcall_ebc_exit:
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3201
+	.4byte	.LASF3206
 	.byte	0x12
 	.2byte	0x216
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x136a4
+	.4byte	0x13762
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x12
@@ -45375,12 +45560,12 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3202
+	.4byte	.LASF3207
 	.byte	0x12
 	.2byte	0x1dd
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x136da
+	.4byte	0x13798
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x12
@@ -45392,18 +45577,18 @@ __exitcall_ebc_exit:
 	.2byte	0x1dd
 	.4byte	0x330
 	.uleb128 0x48
-	.4byte	.LASF3203
+	.4byte	.LASF3208
 	.byte	0x12
 	.2byte	0x1df
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3204
+	.4byte	.LASF3209
 	.byte	0x12
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x136f8
+	.4byte	0x137b6
 	.uleb128 0x66
 	.4byte	.LASF1001
 	.byte	0x12
@@ -45411,12 +45596,12 @@ __exitcall_ebc_exit:
 	.4byte	0x2e3
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3205
+	.4byte	.LASF3210
 	.byte	0x12
 	.2byte	0x13d
 	.4byte	0xd813
 	.byte	0x3
-	.4byte	0x13716
+	.4byte	0x137d4
 	.uleb128 0x66
 	.4byte	.LASF171
 	.byte	0x12
@@ -45424,13 +45609,13 @@ __exitcall_ebc_exit:
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3206
+	.4byte	.LASF3211
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x1373c
+	.4byte	0x137fa
 	.uleb128 0x80
-	.4byte	.LASF3049
+	.4byte	.LASF3051
 	.byte	0xbe
 	.byte	0xdb
 	.4byte	0xd78a
@@ -45441,79 +45626,79 @@ __exitcall_ebc_exit:
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3207
+	.4byte	.LASF3212
 	.byte	0xbe
 	.byte	0xd6
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x13759
+	.4byte	0x13817
 	.uleb128 0x80
-	.4byte	.LASF3049
+	.4byte	.LASF3051
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x13759
+	.4byte	0x13817
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xd6e2
 	.uleb128 0x64
-	.4byte	.LASF3208
+	.4byte	.LASF3213
 	.byte	0xa3
 	.2byte	0x164
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x1377d
+	.4byte	0x1383b
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x1377d
+	.4byte	0x1383b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc133
 	.uleb128 0x64
-	.4byte	.LASF3209
+	.4byte	.LASF3214
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x137b8
+	.4byte	0x13876
 	.uleb128 0x65
 	.string	"np"
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xbd2a
 	.uleb128 0x66
-	.4byte	.LASF3210
+	.4byte	.LASF3215
 	.byte	0xe
 	.2byte	0x499
 	.4byte	0x56
 	.uleb128 0x66
-	.4byte	.LASF3211
+	.4byte	.LASF3216
 	.byte	0xe
 	.2byte	0x49a
 	.4byte	0xac0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3212
+	.4byte	.LASF3217
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13804
+	.4byte	0x138c2
 	.uleb128 0x65
 	.string	"np"
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xbd2a
 	.uleb128 0x66
-	.4byte	.LASF3210
+	.4byte	.LASF3215
 	.byte	0xe
 	.2byte	0x1f0
 	.4byte	0x56
 	.uleb128 0x66
-	.4byte	.LASF3213
+	.4byte	.LASF3218
 	.byte	0xe
 	.2byte	0x1f1
 	.4byte	0xac0
@@ -45529,11 +45714,11 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3214
+	.4byte	.LASF3219
 	.byte	0xe
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x1381e
+	.4byte	0x138dc
 	.uleb128 0x80
 	.4byte	.LASF882
 	.byte	0xe
@@ -45541,11 +45726,11 @@ __exitcall_ebc_exit:
 	.4byte	0xb904
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3215
+	.4byte	.LASF3220
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x13844
+	.4byte	0x13902
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -45558,12 +45743,12 @@ __exitcall_ebc_exit:
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3216
+	.4byte	.LASF3221
 	.byte	0x2
 	.2byte	0x49b
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x13862
+	.4byte	0x13920
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -45571,12 +45756,12 @@ __exitcall_ebc_exit:
 	.4byte	0xbb9a
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3217
+	.4byte	.LASF3222
 	.byte	0x2
 	.2byte	0x2c5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x13898
+	.4byte	0x13956
 	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
@@ -45594,12 +45779,12 @@ __exitcall_ebc_exit:
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3218
+	.4byte	.LASF3223
 	.byte	0xf
 	.byte	0xca
 	.4byte	0x351
 	.byte	0x3
-	.4byte	0x138b4
+	.4byte	0x13972
 	.uleb128 0x7f
 	.string	"res"
 	.byte	0xf
@@ -45607,12 +45792,12 @@ __exitcall_ebc_exit:
 	.4byte	0xc244
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3219
+	.4byte	.LASF3224
 	.byte	0xcc
 	.byte	0x22
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x138d0
+	.4byte	0x1398e
 	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0xcc
@@ -45620,12 +45805,12 @@ __exitcall_ebc_exit:
 	.4byte	0x30bc
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3220
+	.4byte	.LASF3225
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x138ed
+	.4byte	0x139ab
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xcd
@@ -45633,12 +45818,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3221
+	.4byte	.LASF3226
 	.byte	0xd
 	.2byte	0x203
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x13916
+	.4byte	0x139d4
 	.uleb128 0x65
 	.string	"wq"
 	.byte	0xd
@@ -45651,29 +45836,29 @@ __exitcall_ebc_exit:
 	.4byte	0x3205
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3222
+	.4byte	.LASF3227
 	.byte	0xd
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x1393c
+	.4byte	0x139fa
 	.uleb128 0x80
 	.4byte	.LASF2288
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0x3205
 	.uleb128 0x80
-	.4byte	.LASF3223
+	.4byte	.LASF3228
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3224
+	.4byte	.LASF3229
 	.byte	0x51
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13958
+	.4byte	0x13a16
 	.uleb128 0x65
 	.string	"m"
 	.byte	0x51
@@ -45681,12 +45866,12 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF3225
+	.4byte	.LASF3230
 	.byte	0x51
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13974
+	.4byte	0x13a32
 	.uleb128 0x65
 	.string	"m"
 	.byte	0x51
@@ -45694,24 +45879,24 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3226
+	.4byte	.LASF3231
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x139b3
+	.4byte	0x13a71
 	.uleb128 0x80
 	.4byte	.LASF1164
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x30bc
 	.uleb128 0x80
-	.4byte	.LASF3227
+	.4byte	.LASF3232
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2e3
 	.uleb128 0x80
-	.4byte	.LASF3228
+	.4byte	.LASF3233
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2b0
@@ -45722,11 +45907,11 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3229
+	.4byte	.LASF3234
 	.byte	0xca
 	.byte	0x91
 	.byte	0x3
-	.4byte	0x139e6
+	.4byte	0x13aa4
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xca
@@ -45739,18 +45924,18 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.uleb128 0x68
 	.uleb128 0x7a
-	.4byte	.LASF3230
+	.4byte	.LASF3235
 	.byte	0xca
 	.byte	0x93
 	.4byte	0xc6
 	.byte	0
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3231
+	.4byte	.LASF3236
 	.byte	0xca
 	.byte	0x80
 	.byte	0x3
-	.4byte	0x13a14
+	.4byte	0x13ad2
 	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0xca
@@ -45762,25 +45947,25 @@ __exitcall_ebc_exit:
 	.byte	0x80
 	.4byte	0x29
 	.uleb128 0x80
-	.4byte	.LASF3232
+	.4byte	.LASF3237
 	.byte	0xca
 	.byte	0x81
 	.4byte	0x2b0
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3233
+	.4byte	.LASF3238
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13a3b
+	.4byte	0x13af9
 	.uleb128 0x7f
 	.string	"ti"
 	.byte	0xca
 	.byte	0x5f
-	.4byte	0x13a3b
+	.4byte	0x13af9
 	.uleb128 0x80
-	.4byte	.LASF3234
+	.4byte	.LASF3239
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
@@ -45789,24 +45974,24 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.4byte	0xc33
 	.uleb128 0x7e
-	.4byte	.LASF3235
+	.4byte	.LASF3240
 	.byte	0x5
 	.byte	0xf
 	.4byte	0x2f05
 	.byte	0x3
-	.4byte	0x13a5d
+	.4byte	0x13b1b
 	.uleb128 0x7a
-	.4byte	.LASF3236
+	.4byte	.LASF3241
 	.byte	0x5
 	.byte	0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3237
+	.4byte	.LASF3242
 	.byte	0x10
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x13aa3
+	.4byte	0x13b61
 	.uleb128 0x80
 	.4byte	.LASF976
 	.byte	0x10
@@ -45817,9 +46002,9 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x13a96
+	.4byte	0x13b54
 	.uleb128 0x22
-	.4byte	.LASF3117
+	.4byte	.LASF3122
 	.byte	0x10
 	.byte	0x1c
 	.4byte	0x3cc
@@ -45827,27 +46012,27 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x1255c
+	.4byte	0x1261a
 	.byte	0
 	.uleb128 0x7d
 	.string	"__u"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x13a77
+	.4byte	0x13b35
 	.byte	0
 	.byte	0
 	.uleb128 0x82
-	.4byte	.LASF3317
+	.4byte	.LASF3323
 	.byte	0x20
 	.2byte	0x126
 	.byte	0x3
 	.uleb128 0x7e
-	.4byte	.LASF3238
+	.4byte	.LASF3243
 	.byte	0xce
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13ac7
+	.4byte	0x13b85
 	.uleb128 0x7f
 	.string	"n"
 	.byte	0xce
@@ -45855,12 +46040,12 @@ __exitcall_ebc_exit:
 	.4byte	0x15a
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3239
+	.4byte	.LASF3244
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xe2
 	.byte	0x3
-	.4byte	0x13afb
+	.4byte	0x13bb9
 	.uleb128 0x80
 	.4byte	.LASF2470
 	.byte	0x8
@@ -45878,12 +46063,12 @@ __exitcall_ebc_exit:
 	.4byte	0x8b
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3240
+	.4byte	.LASF3245
 	.byte	0xcf
 	.byte	0x50
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x13b15
+	.4byte	0x13bd3
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xcf
@@ -45891,28 +46076,28 @@ __exitcall_ebc_exit:
 	.4byte	0xbd30
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3241
+	.4byte	.LASF3246
 	.byte	0xd0
 	.byte	0xb8
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x13b2f
+	.4byte	0x13bed
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd0
 	.byte	0xb8
-	.4byte	0x13b2f
+	.4byte	0x13bed
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xdd
 	.uleb128 0x7e
-	.4byte	.LASF3242
+	.4byte	.LASF3247
 	.byte	0xd0
 	.byte	0x39
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x13b51
+	.4byte	0x13c0f
 	.uleb128 0x7f
 	.string	"val"
 	.byte	0xd0
@@ -45920,12 +46105,12 @@ __exitcall_ebc_exit:
 	.4byte	0xd2
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3243
+	.4byte	.LASF3248
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13b78
+	.4byte	0x13c36
 	.uleb128 0x7f
 	.string	"nr"
 	.byte	0x7
@@ -45935,17 +46120,17 @@ __exitcall_ebc_exit:
 	.4byte	.LASF1164
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x13b78
+	.4byte	0x13c36
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x3a
 	.uleb128 0x81
-	.4byte	.LASF3244
+	.4byte	.LASF3249
 	.byte	0x11
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x13bb2
+	.4byte	0x13c70
 	.uleb128 0x7f
 	.string	"i"
 	.byte	0x11
@@ -45955,7 +46140,7 @@ __exitcall_ebc_exit:
 	.string	"v"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13bb2
+	.4byte	0x13c70
 	.uleb128 0x7d
 	.string	"w0"
 	.byte	0x11
@@ -45965,18 +46150,18 @@ __exitcall_ebc_exit:
 	.string	"x1"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13bb2
+	.4byte	0x13c70
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x37c
 	.uleb128 0x7e
-	.4byte	.LASF3245
+	.4byte	.LASF3250
 	.byte	0xd1
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13bd2
+	.4byte	0x13c90
 	.uleb128 0x7f
 	.string	"x"
 	.byte	0xd1
@@ -45984,12 +46169,12 @@ __exitcall_ebc_exit:
 	.4byte	0xf4
 	.byte	0
 	.uleb128 0x7e
-	.4byte	.LASF3246
+	.4byte	.LASF3251
 	.byte	0xd2
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13bef
+	.4byte	0x13cad
 	.uleb128 0x80
 	.4byte	.LASF2503
 	.byte	0xd2
@@ -45997,16 +46182,16 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3247
+	.4byte	.LASF3252
 	.byte	0xd3
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x13c12
+	.4byte	0x13cd0
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd3
 	.byte	0xb
-	.4byte	0x13c12
+	.4byte	0x13cd0
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xd3
@@ -46015,21 +46200,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x13c1a
+	.4byte	0x13cd8
 	.uleb128 0x83
 	.uleb128 0x3
-	.4byte	0x13c18
+	.4byte	0x13cd6
 	.uleb128 0x81
-	.4byte	.LASF3248
+	.4byte	.LASF3253
 	.byte	0xd3
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x13c42
+	.4byte	0x13d00
 	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd3
 	.byte	0x9
-	.4byte	0x13c12
+	.4byte	0x13cd0
 	.uleb128 0x80
 	.4byte	.LASF1001
 	.byte	0xd3
@@ -46037,16 +46222,16 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3249
+	.4byte	.LASF3254
 	.byte	0xc
 	.2byte	0x11a
 	.byte	0x3
-	.4byte	0x13c72
+	.4byte	0x13d30
 	.uleb128 0x65
 	.string	"p"
 	.byte	0xc
 	.2byte	0x11a
-	.4byte	0x13c72
+	.4byte	0x13d30
 	.uleb128 0x65
 	.string	"res"
 	.byte	0xc
@@ -46060,1045 +46245,1050 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x13c18
+	.4byte	0x13cd6
 	.uleb128 0x84
-	.4byte	0x10444
-	.8byte	.LFB2836
-	.8byte	.LFE2836-.LFB2836
+	.4byte	0x10470
+	.8byte	.LFB2837
+	.8byte	.LFE2837-.LFB2837
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13ca5
+	.4byte	0x13d63
 	.uleb128 0x70
-	.4byte	0x10455
+	.4byte	0x10481
 	.4byte	.LLST10
 	.uleb128 0x72
-	.4byte	0x10461
+	.4byte	0x1048d
 	.uleb128 0x1
 	.byte	0x51
 	.byte	0
 	.uleb128 0x84
-	.4byte	0x12960
+	.4byte	0x12a1e
 	.8byte	.LFB2816
 	.8byte	.LFE2816-.LFB2816
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13f28
+	.4byte	0x13fe6
 	.uleb128 0x72
-	.4byte	0x1296d
+	.4byte	0x12a2b
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x70
-	.4byte	0x12979
-	.4byte	.LLST104
+	.4byte	0x12a37
+	.4byte	.LLST108
 	.uleb128 0x70
-	.4byte	0x12985
-	.4byte	.LLST105
+	.4byte	0x12a43
+	.4byte	.LLST109
 	.uleb128 0x70
-	.4byte	0x12991
-	.4byte	.LLST106
+	.4byte	0x12a4f
+	.4byte	.LLST110
 	.uleb128 0x54
-	.4byte	0x1299e
+	.4byte	0x12a5c
 	.8byte	.LBB1238
 	.8byte	.LBE1238-.LBB1238
 	.byte	0x1
 	.2byte	0x38d
-	.4byte	0x13ddd
+	.4byte	0x13e9b
 	.uleb128 0x55
-	.4byte	0x129cf
+	.4byte	0x12a8d
 	.uleb128 0x55
-	.4byte	0x129cf
+	.4byte	0x12a8d
 	.uleb128 0x55
-	.4byte	0x129cf
+	.4byte	0x12a8d
 	.uleb128 0x55
-	.4byte	0x129c3
+	.4byte	0x12a81
 	.uleb128 0x55
-	.4byte	0x129b7
+	.4byte	0x12a75
 	.uleb128 0x55
-	.4byte	0x129ab
+	.4byte	0x12a69
 	.uleb128 0x57
 	.8byte	.LBB1239
 	.8byte	.LBE1239-.LBB1239
 	.uleb128 0x58
-	.4byte	0x129db
+	.4byte	0x12a99
 	.uleb128 0x61
-	.4byte	0x129e7
-	.4byte	.LLST107
+	.4byte	0x12aa5
+	.4byte	.LLST111
 	.uleb128 0x58
-	.4byte	0x129f1
+	.4byte	0x12aaf
 	.uleb128 0x61
-	.4byte	0x129fb
-	.4byte	.LLST108
+	.4byte	0x12ab9
+	.4byte	.LLST112
 	.uleb128 0x61
-	.4byte	0x12a07
-	.4byte	.LLST109
+	.4byte	0x12ac5
+	.4byte	.LLST113
 	.uleb128 0x61
-	.4byte	0x12a13
-	.4byte	.LLST110
+	.4byte	0x12ad1
+	.4byte	.LLST114
 	.uleb128 0x58
-	.4byte	0x12a1f
+	.4byte	0x12add
 	.uleb128 0x62
-	.4byte	0x12a2b
+	.4byte	0x12ae9
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x12a37
+	.4byte	0x12af5
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x12a43
-	.4byte	.LLST111
+	.4byte	0x12b01
+	.4byte	.LLST115
 	.uleb128 0x61
-	.4byte	0x12a4f
-	.4byte	.LLST112
+	.4byte	0x12b0d
+	.4byte	.LLST116
 	.uleb128 0x61
-	.4byte	0x12a5b
-	.4byte	.LLST113
+	.4byte	0x12b19
+	.4byte	.LLST117
 	.uleb128 0x58
-	.4byte	0x12a67
+	.4byte	0x12b25
 	.uleb128 0x5c
-	.4byte	0x131de
+	.4byte	0x1329c
 	.8byte	.LBB1240
 	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
 	.2byte	0x380
-	.4byte	0x13db7
+	.4byte	0x13e75
 	.uleb128 0x55
-	.4byte	0x13206
+	.4byte	0x132c4
 	.uleb128 0x55
-	.4byte	0x131fa
+	.4byte	0x132b8
 	.uleb128 0x55
-	.4byte	0x131ee
+	.4byte	0x132ac
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x131de
+	.4byte	0x1329c
 	.8byte	.LBB1247
 	.4byte	.Ldebug_ranges0+0x730
 	.byte	0x1
 	.2byte	0x381
 	.uleb128 0x55
-	.4byte	0x13206
+	.4byte	0x132c4
 	.uleb128 0x55
-	.4byte	0x131fa
+	.4byte	0x132b8
 	.uleb128 0x55
-	.4byte	0x131ee
+	.4byte	0x132ac
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x780
 	.uleb128 0x55
-	.4byte	0x12991
+	.4byte	0x12a4f
 	.uleb128 0x55
-	.4byte	0x12985
+	.4byte	0x12a43
 	.uleb128 0x55
-	.4byte	0x12979
+	.4byte	0x12a37
 	.uleb128 0x55
-	.4byte	0x1296d
+	.4byte	0x12a2b
 	.uleb128 0x60
-	.4byte	0x12a74
+	.4byte	0x12b32
 	.8byte	.LBB1259
 	.4byte	.Ldebug_ranges0+0x780
 	.byte	0x1
 	.2byte	0x38b
 	.uleb128 0x55
-	.4byte	0x12aa5
+	.4byte	0x12b63
 	.uleb128 0x55
-	.4byte	0x12aa5
+	.4byte	0x12b63
 	.uleb128 0x55
-	.4byte	0x12aa5
+	.4byte	0x12b63
 	.uleb128 0x55
-	.4byte	0x12a99
+	.4byte	0x12b57
 	.uleb128 0x55
-	.4byte	0x12a8d
+	.4byte	0x12b4b
 	.uleb128 0x55
-	.4byte	0x12a81
+	.4byte	0x12b3f
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x780
 	.uleb128 0x58
-	.4byte	0x12ab1
+	.4byte	0x12b6f
 	.uleb128 0x62
-	.4byte	0x12abd
+	.4byte	0x12b7b
 	.uleb128 0x1
 	.byte	0x5c
 	.uleb128 0x58
-	.4byte	0x12ac7
+	.4byte	0x12b85
 	.uleb128 0x62
-	.4byte	0x12ad1
+	.4byte	0x12b8f
 	.uleb128 0x1
 	.byte	0x5f
 	.uleb128 0x58
-	.4byte	0x12add
+	.4byte	0x12b9b
 	.uleb128 0x61
-	.4byte	0x12ae9
-	.4byte	.LLST114
+	.4byte	0x12ba7
+	.4byte	.LLST118
 	.uleb128 0x61
-	.4byte	0x12af5
-	.4byte	.LLST115
+	.4byte	0x12bb3
+	.4byte	.LLST119
 	.uleb128 0x62
-	.4byte	0x12b01
+	.4byte	0x12bbf
 	.uleb128 0x1
 	.byte	0x59
 	.uleb128 0x62
-	.4byte	0x12b0d
+	.4byte	0x12bcb
 	.uleb128 0x1
 	.byte	0x5a
 	.uleb128 0x61
-	.4byte	0x12b19
-	.4byte	.LLST116
+	.4byte	0x12bd7
+	.4byte	.LLST120
 	.uleb128 0x61
-	.4byte	0x12b25
-	.4byte	.LLST117
+	.4byte	0x12be3
+	.4byte	.LLST121
 	.uleb128 0x62
-	.4byte	0x12b31
+	.4byte	0x12bef
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x58
-	.4byte	0x12b3d
+	.4byte	0x12bfb
 	.uleb128 0x5c
-	.4byte	0x131de
+	.4byte	0x1329c
 	.8byte	.LBB1261
 	.4byte	.Ldebug_ranges0+0x7c0
 	.byte	0x1
 	.2byte	0x359
-	.4byte	0x13eb0
+	.4byte	0x13f6e
 	.uleb128 0x55
-	.4byte	0x13206
+	.4byte	0x132c4
 	.uleb128 0x55
-	.4byte	0x131fa
+	.4byte	0x132b8
 	.uleb128 0x55
-	.4byte	0x131ee
+	.4byte	0x132ac
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x131de
+	.4byte	0x1329c
 	.8byte	.LBB1266
 	.4byte	.Ldebug_ranges0+0x810
 	.byte	0x1
 	.2byte	0x35a
-	.4byte	0x13ed8
+	.4byte	0x13f96
 	.uleb128 0x55
-	.4byte	0x13206
+	.4byte	0x132c4
 	.uleb128 0x55
-	.4byte	0x131fa
+	.4byte	0x132b8
 	.uleb128 0x55
-	.4byte	0x131ee
+	.4byte	0x132ac
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x131de
+	.4byte	0x1329c
 	.8byte	.LBB1278
 	.4byte	.Ldebug_ranges0+0x880
 	.byte	0x1
 	.2byte	0x35b
-	.4byte	0x13f00
+	.4byte	0x13fbe
 	.uleb128 0x55
-	.4byte	0x13206
+	.4byte	0x132c4
 	.uleb128 0x55
-	.4byte	0x131fa
+	.4byte	0x132b8
 	.uleb128 0x55
-	.4byte	0x131ee
+	.4byte	0x132ac
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x131de
+	.4byte	0x1329c
 	.8byte	.LBB1290
 	.4byte	.Ldebug_ranges0+0x8f0
 	.byte	0x1
 	.2byte	0x35c
 	.uleb128 0x55
-	.4byte	0x13206
+	.4byte	0x132c4
 	.uleb128 0x55
-	.4byte	0x131fa
+	.4byte	0x132b8
 	.uleb128 0x55
-	.4byte	0x131ee
+	.4byte	0x132ac
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x84
-	.4byte	0x12776
+	.4byte	0x12834
 	.8byte	.LFB2819
 	.8byte	.LFE2819-.LFB2819
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1425d
+	.4byte	0x1431b
 	.uleb128 0x72
-	.4byte	0x12783
+	.4byte	0x12841
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x70
-	.4byte	0x1278f
-	.4byte	.LLST118
+	.4byte	0x1284d
+	.4byte	.LLST122
 	.uleb128 0x70
-	.4byte	0x1279b
-	.4byte	.LLST119
+	.4byte	0x12859
+	.4byte	.LLST123
 	.uleb128 0x70
-	.4byte	0x127a7
-	.4byte	.LLST120
+	.4byte	0x12865
+	.4byte	.LLST124
 	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x940
-	.4byte	0x14142
+	.4byte	0x14200
 	.uleb128 0x55
-	.4byte	0x127a7
+	.4byte	0x12865
 	.uleb128 0x55
-	.4byte	0x1279b
+	.4byte	0x12859
 	.uleb128 0x55
-	.4byte	0x1278f
+	.4byte	0x1284d
 	.uleb128 0x55
-	.4byte	0x12783
+	.4byte	0x12841
 	.uleb128 0x60
-	.4byte	0x127b4
+	.4byte	0x12872
 	.8byte	.LBB1326
 	.4byte	.Ldebug_ranges0+0x940
 	.byte	0x1
 	.2byte	0x3e9
 	.uleb128 0x55
-	.4byte	0x127e5
+	.4byte	0x128a3
 	.uleb128 0x55
-	.4byte	0x127e5
+	.4byte	0x128a3
 	.uleb128 0x55
-	.4byte	0x127e5
+	.4byte	0x128a3
 	.uleb128 0x55
-	.4byte	0x127d9
+	.4byte	0x12897
 	.uleb128 0x55
-	.4byte	0x127cd
+	.4byte	0x1288b
 	.uleb128 0x55
-	.4byte	0x127c1
+	.4byte	0x1287f
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x940
 	.uleb128 0x58
-	.4byte	0x127f1
-	.uleb128 0x61
-	.4byte	0x127fd
-	.4byte	.LLST121
-	.uleb128 0x61
-	.4byte	0x12809
-	.4byte	.LLST122
-	.uleb128 0x61
-	.4byte	0x12815
-	.4byte	.LLST123
-	.uleb128 0x61
-	.4byte	0x12821
-	.4byte	.LLST124
+	.4byte	0x128af
 	.uleb128 0x61
-	.4byte	0x1282d
+	.4byte	0x128bb
 	.4byte	.LLST125
 	.uleb128 0x61
-	.4byte	0x12839
+	.4byte	0x128c7
 	.4byte	.LLST126
 	.uleb128 0x61
-	.4byte	0x12845
+	.4byte	0x128d3
 	.4byte	.LLST127
 	.uleb128 0x61
-	.4byte	0x12851
+	.4byte	0x128df
 	.4byte	.LLST128
-	.uleb128 0x58
-	.4byte	0x1285b
 	.uleb128 0x61
-	.4byte	0x12865
+	.4byte	0x128eb
 	.4byte	.LLST129
 	.uleb128 0x61
-	.4byte	0x12871
+	.4byte	0x128f7
 	.4byte	.LLST130
+	.uleb128 0x61
+	.4byte	0x12903
+	.4byte	.LLST131
+	.uleb128 0x61
+	.4byte	0x1290f
+	.4byte	.LLST132
 	.uleb128 0x58
-	.4byte	0x1287d
+	.4byte	0x12919
+	.uleb128 0x61
+	.4byte	0x12923
+	.4byte	.LLST133
+	.uleb128 0x61
+	.4byte	0x1292f
+	.4byte	.LLST134
+	.uleb128 0x58
+	.4byte	0x1293b
 	.uleb128 0x5c
-	.4byte	0x13193
+	.4byte	0x13251
 	.8byte	.LBB1328
 	.4byte	.Ldebug_ranges0+0x970
 	.byte	0x1
 	.2byte	0x3da
-	.4byte	0x1405f
+	.4byte	0x1411d
 	.uleb128 0x55
-	.4byte	0x131bb
+	.4byte	0x13279
 	.uleb128 0x55
-	.4byte	0x131af
+	.4byte	0x1326d
 	.uleb128 0x55
-	.4byte	0x131a3
+	.4byte	0x13261
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x970
 	.uleb128 0x58
-	.4byte	0x131c7
+	.4byte	0x13285
 	.uleb128 0x61
-	.4byte	0x131d2
-	.4byte	.LLST131
+	.4byte	0x13290
+	.4byte	.LLST135
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13193
+	.4byte	0x13251
 	.8byte	.LBB1331
 	.8byte	.LBE1331-.LBB1331
 	.byte	0x1
 	.2byte	0x3d7
-	.4byte	0x140ab
+	.4byte	0x14169
 	.uleb128 0x55
-	.4byte	0x131bb
+	.4byte	0x13279
 	.uleb128 0x55
-	.4byte	0x131af
+	.4byte	0x1326d
 	.uleb128 0x55
-	.4byte	0x131a3
+	.4byte	0x13261
 	.uleb128 0x57
 	.8byte	.LBB1332
 	.8byte	.LBE1332-.LBB1332
 	.uleb128 0x58
-	.4byte	0x131c7
+	.4byte	0x13285
 	.uleb128 0x61
-	.4byte	0x131d2
-	.4byte	.LLST132
+	.4byte	0x13290
+	.4byte	.LLST136
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13193
+	.4byte	0x13251
 	.8byte	.LBB1333
 	.8byte	.LBE1333-.LBB1333
 	.byte	0x1
 	.2byte	0x3d8
-	.4byte	0x140f7
+	.4byte	0x141b5
 	.uleb128 0x55
-	.4byte	0x131bb
+	.4byte	0x13279
 	.uleb128 0x55
-	.4byte	0x131af
+	.4byte	0x1326d
 	.uleb128 0x55
-	.4byte	0x131a3
+	.4byte	0x13261
 	.uleb128 0x57
 	.8byte	.LBB1334
 	.8byte	.LBE1334-.LBB1334
 	.uleb128 0x58
-	.4byte	0x131c7
+	.4byte	0x13285
 	.uleb128 0x61
-	.4byte	0x131d2
-	.4byte	.LLST133
+	.4byte	0x13290
+	.4byte	.LLST137
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x13193
+	.4byte	0x13251
 	.8byte	.LBB1335
 	.8byte	.LBE1335-.LBB1335
 	.byte	0x1
 	.2byte	0x3d9
 	.uleb128 0x55
-	.4byte	0x131bb
+	.4byte	0x13279
 	.uleb128 0x55
-	.4byte	0x131af
+	.4byte	0x1326d
 	.uleb128 0x55
-	.4byte	0x131a3
+	.4byte	0x13261
 	.uleb128 0x57
 	.8byte	.LBB1336
 	.8byte	.LBE1336-.LBB1336
 	.uleb128 0x58
-	.4byte	0x131c7
+	.4byte	0x13285
 	.uleb128 0x61
-	.4byte	0x131d2
-	.4byte	.LLST134
+	.4byte	0x13290
+	.4byte	.LLST138
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x1288a
+	.4byte	0x12948
 	.8byte	.LBB1340
 	.8byte	.LBE1340-.LBB1340
 	.byte	0x1
 	.2byte	0x3eb
 	.uleb128 0x55
-	.4byte	0x128bb
+	.4byte	0x12979
 	.uleb128 0x55
-	.4byte	0x128bb
+	.4byte	0x12979
 	.uleb128 0x55
-	.4byte	0x128bb
+	.4byte	0x12979
 	.uleb128 0x55
-	.4byte	0x128af
+	.4byte	0x1296d
 	.uleb128 0x55
-	.4byte	0x128a3
+	.4byte	0x12961
 	.uleb128 0x55
-	.4byte	0x12897
+	.4byte	0x12955
 	.uleb128 0x57
 	.8byte	.LBB1341
 	.8byte	.LBE1341-.LBB1341
 	.uleb128 0x58
-	.4byte	0x128c7
+	.4byte	0x12985
 	.uleb128 0x58
-	.4byte	0x128d3
+	.4byte	0x12991
 	.uleb128 0x58
-	.4byte	0x128df
+	.4byte	0x1299d
 	.uleb128 0x62
-	.4byte	0x128eb
+	.4byte	0x129a9
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x62
-	.4byte	0x128f7
+	.4byte	0x129b5
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x61
-	.4byte	0x12903
-	.4byte	.LLST135
+	.4byte	0x129c1
+	.4byte	.LLST139
 	.uleb128 0x61
-	.4byte	0x1290f
-	.4byte	.LLST136
+	.4byte	0x129cd
+	.4byte	.LLST140
 	.uleb128 0x61
-	.4byte	0x1291b
-	.4byte	.LLST137
+	.4byte	0x129d9
+	.4byte	.LLST141
 	.uleb128 0x61
-	.4byte	0x12927
-	.4byte	.LLST138
+	.4byte	0x129e5
+	.4byte	.LLST142
 	.uleb128 0x58
-	.4byte	0x12931
+	.4byte	0x129ef
 	.uleb128 0x61
-	.4byte	0x1293b
-	.4byte	.LLST139
+	.4byte	0x129f9
+	.4byte	.LLST143
 	.uleb128 0x61
-	.4byte	0x12947
-	.4byte	.LLST140
+	.4byte	0x12a05
+	.4byte	.LLST144
 	.uleb128 0x58
-	.4byte	0x12953
+	.4byte	0x12a11
 	.uleb128 0x5c
-	.4byte	0x13193
+	.4byte	0x13251
 	.8byte	.LBB1342
 	.4byte	.Ldebug_ranges0+0x9a0
 	.byte	0x1
 	.2byte	0x3af
-	.4byte	0x14222
+	.4byte	0x142e0
 	.uleb128 0x55
-	.4byte	0x131bb
+	.4byte	0x13279
 	.uleb128 0x55
-	.4byte	0x131af
+	.4byte	0x1326d
 	.uleb128 0x55
-	.4byte	0x131a3
+	.4byte	0x13261
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x9a0
 	.uleb128 0x58
-	.4byte	0x131c7
+	.4byte	0x13285
 	.uleb128 0x61
-	.4byte	0x131d2
-	.4byte	.LLST141
+	.4byte	0x13290
+	.4byte	.LLST145
 	.byte	0
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x13193
+	.4byte	0x13251
 	.8byte	.LBB1349
 	.4byte	.Ldebug_ranges0+0xa10
 	.byte	0x1
 	.2byte	0x3ae
 	.uleb128 0x55
-	.4byte	0x131bb
+	.4byte	0x13279
 	.uleb128 0x55
-	.4byte	0x131af
+	.4byte	0x1326d
 	.uleb128 0x55
-	.4byte	0x131a3
+	.4byte	0x13261
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa10
 	.uleb128 0x58
-	.4byte	0x131c7
+	.4byte	0x13285
 	.uleb128 0x61
-	.4byte	0x131d2
-	.4byte	.LLST142
+	.4byte	0x13290
+	.4byte	.LLST146
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x85
-	.4byte	0x1273e
-	.8byte	.LFB2864
-	.8byte	.LFE2864-.LFB2864
+	.4byte	0x127fc
+	.8byte	.LFB2865
+	.8byte	.LFE2865-.LFB2865
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14360
+	.4byte	0x1441e
 	.uleb128 0x70
-	.4byte	0x1274b
-	.4byte	.LLST143
+	.4byte	0x12809
+	.4byte	.LLST147
 	.uleb128 0x55
-	.4byte	0x12757
+	.4byte	0x12815
 	.uleb128 0x58
-	.4byte	0x12763
+	.4byte	0x12821
 	.uleb128 0x5c
-	.4byte	0x132f8
+	.4byte	0x133b6
 	.8byte	.LBB1365
 	.4byte	.Ldebug_ranges0+0xa70
 	.byte	0x1
 	.2byte	0x3f2
-	.4byte	0x142de
+	.4byte	0x1439c
 	.uleb128 0x55
-	.4byte	0x13329
+	.4byte	0x133e7
 	.uleb128 0x55
-	.4byte	0x1331d
+	.4byte	0x133db
 	.uleb128 0x55
-	.4byte	0x13311
+	.4byte	0x133cf
 	.uleb128 0x55
-	.4byte	0x13305
+	.4byte	0x133c3
 	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa70
 	.uleb128 0x58
-	.4byte	0x13335
+	.4byte	0x133f3
 	.uleb128 0x60
-	.4byte	0x13342
+	.4byte	0x13400
 	.8byte	.LBB1367
 	.4byte	.Ldebug_ranges0+0xac0
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x55
-	.4byte	0x13353
+	.4byte	0x13411
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x1326b
+	.4byte	0x13329
 	.8byte	.LBB1376
 	.4byte	.Ldebug_ranges0+0xaf0
 	.byte	0x1
 	.2byte	0x3f3
-	.4byte	0x14310
+	.4byte	0x143ce
 	.uleb128 0x55
-	.4byte	0x132a8
+	.4byte	0x13366
 	.uleb128 0x55
-	.4byte	0x1329c
+	.4byte	0x1335a
 	.uleb128 0x55
-	.4byte	0x13290
+	.4byte	0x1334e
 	.uleb128 0x55
-	.4byte	0x13284
+	.4byte	0x13342
 	.uleb128 0x55
-	.4byte	0x13278
+	.4byte	0x13336
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x13239
+	.4byte	0x132f7
 	.8byte	.LBB1382
 	.8byte	.LBE1382-.LBB1382
 	.byte	0x1
 	.2byte	0x3f4
-	.4byte	0x1433c
+	.4byte	0x143fa
 	.uleb128 0x55
-	.4byte	0x1325e
+	.4byte	0x1331c
 	.uleb128 0x55
-	.4byte	0x13252
+	.4byte	0x13310
 	.uleb128 0x55
-	.4byte	0x13246
+	.4byte	0x13304
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x13213
+	.4byte	0x132d1
 	.8byte	.LBB1384
 	.8byte	.LBE1384-.LBB1384
 	.byte	0x1
 	.2byte	0x3f5
 	.uleb128 0x55
-	.4byte	0x1322c
+	.4byte	0x132ea
 	.uleb128 0x55
-	.4byte	0x13220
+	.4byte	0x132de
 	.byte	0
 	.byte	0
 	.uleb128 0x85
-	.4byte	0x13160
-	.8byte	.LFB2865
-	.8byte	.LFE2865-.LFB2865
+	.4byte	0x1321e
+	.8byte	.LFB2866
+	.8byte	.LFE2866-.LFB2866
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1441e
+	.4byte	0x144dc
 	.uleb128 0x70
-	.4byte	0x13170
-	.4byte	.LLST146
+	.4byte	0x1322e
+	.4byte	.LLST150
 	.uleb128 0x70
-	.4byte	0x1317b
-	.4byte	.LLST147
+	.4byte	0x13239
+	.4byte	.LLST151
 	.uleb128 0x58
-	.4byte	0x13187
+	.4byte	0x13245
 	.uleb128 0x71
-	.4byte	0x132b5
+	.4byte	0x13373
 	.8byte	.LBB1408
 	.8byte	.LBE1408-.LBB1408
 	.byte	0x1
 	.byte	0xc9
-	.4byte	0x143b4
+	.4byte	0x14472
 	.uleb128 0x55
-	.4byte	0x132c2
+	.4byte	0x13380
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x1344d
+	.4byte	0x1350b
 	.8byte	.LBB1410
 	.8byte	.LBE1410-.LBB1410
 	.byte	0x1
 	.byte	0xca
-	.4byte	0x143d5
+	.4byte	0x14493
 	.uleb128 0x55
-	.4byte	0x1345a
+	.4byte	0x13518
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x13481
+	.4byte	0x1353f
 	.8byte	.LBB1412
 	.8byte	.LBE1412-.LBB1412
 	.byte	0x1
 	.byte	0xcd
-	.4byte	0x14403
+	.4byte	0x144c1
 	.uleb128 0x55
-	.4byte	0x1348e
+	.4byte	0x1354c
 	.uleb128 0x4f
-	.8byte	.LVL513
-	.4byte	0x14773
+	.8byte	.LVL523
+	.4byte	0x14831
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL510
-	.4byte	0x144e8
+	.8byte	.LVL520
+	.4byte	0x145a6
 	.uleb128 0x4f
-	.8byte	.LVL514
-	.4byte	0x144e8
+	.8byte	.LVL524
+	.4byte	0x145a6
 	.byte	0
 	.uleb128 0x85
-	.4byte	0x13160
-	.8byte	.LFB2870
-	.8byte	.LFE2870-.LFB2870
+	.4byte	0x1321e
+	.8byte	.LFB2871
+	.8byte	.LFE2871-.LFB2871
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x144d0
+	.4byte	0x1458e
 	.uleb128 0x70
-	.4byte	0x13170
-	.4byte	.LLST174
+	.4byte	0x1322e
+	.4byte	.LLST178
 	.uleb128 0x58
-	.4byte	0x13187
+	.4byte	0x13245
 	.uleb128 0x55
-	.4byte	0x1317b
+	.4byte	0x13239
 	.uleb128 0x71
-	.4byte	0x13467
+	.4byte	0x13525
 	.8byte	.LBB1755
 	.8byte	.LBE1755-.LBB1755
 	.byte	0x1
 	.byte	0xc2
-	.4byte	0x1446e
+	.4byte	0x1452c
 	.uleb128 0x55
-	.4byte	0x13474
+	.4byte	0x13532
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x132cf
+	.4byte	0x1338d
 	.8byte	.LBB1757
 	.8byte	.LBE1757-.LBB1757
 	.byte	0x1
 	.byte	0xc3
-	.4byte	0x14494
+	.4byte	0x14552
 	.uleb128 0x55
-	.4byte	0x132eb
+	.4byte	0x133a9
 	.uleb128 0x55
-	.4byte	0x132df
+	.4byte	0x1339d
 	.byte	0
 	.uleb128 0x71
-	.4byte	0x134a1
+	.4byte	0x1355f
 	.8byte	.LBB1759
 	.8byte	.LBE1759-.LBB1759
 	.byte	0x1
 	.byte	0xbf
-	.4byte	0x144c2
+	.4byte	0x14580
 	.uleb128 0x55
-	.4byte	0x134ae
+	.4byte	0x1356c
 	.uleb128 0x4f
-	.8byte	.LVL714
-	.4byte	0x147ea
+	.8byte	.LVL724
+	.4byte	0x148b4
 	.byte	0
 	.uleb128 0x4f
-	.8byte	.LVL711
-	.4byte	0x144e8
+	.8byte	.LVL721
+	.4byte	0x145a6
 	.byte	0
 	.uleb128 0x86
-	.4byte	.LASF3250
-	.4byte	.LASF3250
+	.4byte	.LASF3255
+	.4byte	.LASF3255
 	.byte	0xbe
 	.byte	0xcc
 	.uleb128 0x86
-	.4byte	.LASF3251
-	.4byte	.LASF3251
+	.4byte	.LASF3256
+	.4byte	.LASF3256
 	.byte	0xbe
 	.byte	0xca
 	.uleb128 0x87
-	.4byte	.LASF3252
-	.4byte	.LASF3252
+	.4byte	.LASF3257
+	.4byte	.LASF3257
 	.byte	0x2
 	.2byte	0x5d1
 	.uleb128 0x86
-	.4byte	.LASF3253
-	.4byte	.LASF3253
+	.4byte	.LASF3258
+	.4byte	.LASF3258
 	.byte	0xac
 	.byte	0x4f
 	.uleb128 0x87
-	.4byte	.LASF3254
-	.4byte	.LASF3254
+	.4byte	.LASF3259
+	.4byte	.LASF3259
 	.byte	0x2
 	.2byte	0x2bf
 	.uleb128 0x87
-	.4byte	.LASF3255
-	.4byte	.LASF3255
+	.4byte	.LASF3260
+	.4byte	.LASF3260
 	.byte	0xe
 	.2byte	0x149
 	.uleb128 0x87
-	.4byte	.LASF3256
-	.4byte	.LASF3256
+	.4byte	.LASF3261
+	.4byte	.LASF3261
 	.byte	0xe
 	.2byte	0x172
 	.uleb128 0x86
-	.4byte	.LASF3257
-	.4byte	.LASF3257
+	.4byte	.LASF3262
+	.4byte	.LASF3262
 	.byte	0xd4
 	.byte	0x78
 	.uleb128 0x86
-	.4byte	.LASF3258
-	.4byte	.LASF3258
+	.4byte	.LASF3263
+	.4byte	.LASF3263
 	.byte	0xaa
 	.byte	0x59
 	.uleb128 0x86
-	.4byte	.LASF3259
-	.4byte	.LASF3259
+	.4byte	.LASF3264
+	.4byte	.LASF3264
 	.byte	0xc3
 	.byte	0x30
 	.uleb128 0x88
-	.4byte	.LASF3260
-	.4byte	.LASF3260
+	.4byte	.LASF3265
+	.4byte	.LASF3265
 	.uleb128 0x86
-	.4byte	.LASF3260
-	.4byte	.LASF3260
+	.4byte	.LASF3265
+	.4byte	.LASF3265
 	.byte	0xd5
 	.byte	0x36
 	.uleb128 0x87
-	.4byte	.LASF3261
-	.4byte	.LASF3261
+	.4byte	.LASF3266
+	.4byte	.LASF3266
 	.byte	0x2
 	.2byte	0x5cb
 	.uleb128 0x86
-	.4byte	.LASF3262
-	.4byte	.LASF3262
+	.4byte	.LASF3267
+	.4byte	.LASF3267
 	.byte	0xc2
 	.byte	0x30
 	.uleb128 0x86
-	.4byte	.LASF3263
-	.4byte	.LASF3263
+	.4byte	.LASF3268
+	.4byte	.LASF3268
 	.byte	0xc2
 	.byte	0x31
 	.uleb128 0x86
-	.4byte	.LASF3264
-	.4byte	.LASF3264
+	.4byte	.LASF3269
+	.4byte	.LASF3269
 	.byte	0xab
 	.byte	0x9
 	.uleb128 0x87
-	.4byte	.LASF3265
-	.4byte	.LASF3265
+	.4byte	.LASF3270
+	.4byte	.LASF3270
 	.byte	0x48
 	.2byte	0x6b8
 	.uleb128 0x87
-	.4byte	.LASF3266
-	.4byte	.LASF3266
+	.4byte	.LASF3271
+	.4byte	.LASF3271
 	.byte	0xd
 	.2byte	0x190
 	.uleb128 0x87
-	.4byte	.LASF3267
-	.4byte	.LASF3267
+	.4byte	.LASF3272
+	.4byte	.LASF3272
 	.byte	0x48
 	.2byte	0x676
 	.uleb128 0x86
-	.4byte	.LASF3268
-	.4byte	.LASF3268
+	.4byte	.LASF3273
+	.4byte	.LASF3273
 	.byte	0x9c
 	.byte	0x67
 	.uleb128 0x86
-	.4byte	.LASF3269
-	.4byte	.LASF3269
+	.4byte	.LASF3274
+	.4byte	.LASF3274
 	.byte	0x54
 	.byte	0x53
 	.uleb128 0x86
-	.4byte	.LASF3270
-	.4byte	.LASF3270
+	.4byte	.LASF3275
+	.4byte	.LASF3275
 	.byte	0x54
 	.byte	0xa5
 	.uleb128 0x86
-	.4byte	.LASF3271
-	.4byte	.LASF3271
+	.4byte	.LASF3276
+	.4byte	.LASF3276
 	.byte	0xc3
 	.byte	0x2b
 	.uleb128 0x86
-	.4byte	.LASF3272
-	.4byte	.LASF3272
+	.4byte	.LASF3277
+	.4byte	.LASF3277
 	.byte	0xc3
 	.byte	0x27
 	.uleb128 0x87
-	.4byte	.LASF3273
-	.4byte	.LASF3273
+	.4byte	.LASF3278
+	.4byte	.LASF3278
 	.byte	0x12
 	.2byte	0x184
 	.uleb128 0x86
-	.4byte	.LASF3274
-	.4byte	.LASF3274
+	.4byte	.LASF3279
+	.4byte	.LASF3279
 	.byte	0xd6
 	.byte	0x51
 	.uleb128 0x87
-	.4byte	.LASF3275
-	.4byte	.LASF3275
+	.4byte	.LASF3280
+	.4byte	.LASF3280
 	.byte	0x20
 	.2byte	0x1d9
 	.uleb128 0x86
-	.4byte	.LASF3276
-	.4byte	.LASF3276
+	.4byte	.LASF3281
+	.4byte	.LASF3281
 	.byte	0x3
 	.byte	0x3b
 	.uleb128 0x86
-	.4byte	.LASF3277
-	.4byte	.LASF3277
+	.4byte	.LASF3282
+	.4byte	.LASF3282
 	.byte	0x12
 	.byte	0xb9
 	.uleb128 0x86
-	.4byte	.LASF3278
-	.4byte	.LASF3278
+	.4byte	.LASF3283
+	.4byte	.LASF3283
 	.byte	0x3a
 	.byte	0xc2
 	.uleb128 0x88
-	.4byte	.LASF3279
-	.4byte	.LASF3279
+	.4byte	.LASF3284
+	.4byte	.LASF3284
 	.uleb128 0x86
-	.4byte	.LASF3280
-	.4byte	.LASF3280
+	.4byte	.LASF3285
+	.4byte	.LASF3285
 	.byte	0xac
 	.byte	0x4e
 	.uleb128 0x87
-	.4byte	.LASF3281
-	.4byte	.LASF3281
+	.4byte	.LASF3286
+	.4byte	.LASF3286
 	.byte	0x2
 	.2byte	0x287
 	.uleb128 0x86
-	.4byte	.LASF3282
-	.4byte	.LASF3282
+	.4byte	.LASF3287
+	.4byte	.LASF3287
 	.byte	0xbf
 	.byte	0x38
 	.uleb128 0x87
-	.4byte	.LASF3283
-	.4byte	.LASF3283
+	.4byte	.LASF3288
+	.4byte	.LASF3288
 	.byte	0xe
 	.2byte	0x165
 	.uleb128 0x87
-	.4byte	.LASF3284
-	.4byte	.LASF3284
+	.4byte	.LASF3289
+	.4byte	.LASF3289
 	.byte	0xa3
 	.2byte	0x37b
 	.uleb128 0x87
-	.4byte	.LASF3285
-	.4byte	.LASF3285
+	.4byte	.LASF3290
+	.4byte	.LASF3290
 	.byte	0xe
 	.2byte	0x125
 	.uleb128 0x88
-	.4byte	.LASF3286
-	.4byte	.LASF3286
+	.4byte	.LASF3291
+	.4byte	.LASF3291
 	.uleb128 0x86
-	.4byte	.LASF3287
-	.4byte	.LASF3287
+	.4byte	.LASF3292
+	.4byte	.LASF3292
 	.byte	0xc3
 	.byte	0x2e
 	.uleb128 0x87
-	.4byte	.LASF3288
-	.4byte	.LASF3288
+	.4byte	.LASF3293
+	.4byte	.LASF3293
 	.byte	0x20
 	.2byte	0x1c7
 	.uleb128 0x87
-	.4byte	.LASF3289
-	.4byte	.LASF3289
+	.4byte	.LASF3294
+	.4byte	.LASF3294
 	.byte	0x20
 	.2byte	0x17e
 	.uleb128 0x86
-	.4byte	.LASF3290
-	.4byte	.LASF3290
+	.4byte	.LASF3295
+	.4byte	.LASF3295
 	.byte	0x3
 	.byte	0x3a
 	.uleb128 0x86
-	.4byte	.LASF3291
-	.4byte	.LASF3291
+	.4byte	.LASF3296
+	.4byte	.LASF3296
 	.byte	0xc2
 	.byte	0x32
 	.uleb128 0x87
-	.4byte	.LASF3292
-	.4byte	.LASF3292
+	.4byte	.LASF3297
+	.4byte	.LASF3297
 	.byte	0x76
 	.2byte	0xa0a
 	.uleb128 0x86
-	.4byte	.LASF3293
-	.4byte	.LASF3293
+	.4byte	.LASF3298
+	.4byte	.LASF3298
 	.byte	0xc3
 	.byte	0x2c
 	.uleb128 0x86
-	.4byte	.LASF3294
-	.4byte	.LASF3294
+	.4byte	.LASF3299
+	.4byte	.LASF3299
 	.byte	0x48
 	.byte	0xdc
 	.uleb128 0x87
-	.4byte	.LASF3295
-	.4byte	.LASF3295
+	.4byte	.LASF3300
+	.4byte	.LASF3300
 	.byte	0x3a
 	.2byte	0x459
 	.uleb128 0x86
-	.4byte	.LASF3296
-	.4byte	.LASF3296
+	.4byte	.LASF3301
+	.4byte	.LASF3301
 	.byte	0x3a
 	.byte	0xe9
 	.uleb128 0x87
-	.4byte	.LASF3297
-	.4byte	.LASF3297
+	.4byte	.LASF3302
+	.4byte	.LASF3302
 	.byte	0x3a
 	.2byte	0x45a
 	.uleb128 0x87
-	.4byte	.LASF3298
-	.4byte	.LASF3298
+	.4byte	.LASF3303
+	.4byte	.LASF3303
 	.byte	0x6
 	.2byte	0x19f
 	.uleb128 0x87
-	.4byte	.LASF3299
-	.4byte	.LASF3299
+	.4byte	.LASF3304
+	.4byte	.LASF3304
 	.byte	0x6
 	.2byte	0x199
 	.uleb128 0x86
-	.4byte	.LASF3300
-	.4byte	.LASF3300
+	.4byte	.LASF3305
+	.4byte	.LASF3305
 	.byte	0xc3
 	.byte	0x25
 	.uleb128 0x86
-	.4byte	.LASF3301
-	.4byte	.LASF3301
+	.4byte	.LASF3306
+	.4byte	.LASF3306
 	.byte	0xc3
 	.byte	0x2a
 	.uleb128 0x86
-	.4byte	.LASF3302
-	.4byte	.LASF3302
+	.4byte	.LASF3307
+	.4byte	.LASF3307
 	.byte	0xc3
 	.byte	0x24
 	.uleb128 0x86
-	.4byte	.LASF3303
-	.4byte	.LASF3303
+	.4byte	.LASF3308
+	.4byte	.LASF3308
 	.byte	0xc3
 	.byte	0x23
 	.uleb128 0x86
-	.4byte	.LASF3304
-	.4byte	.LASF3304
+	.4byte	.LASF3309
+	.4byte	.LASF3309
 	.byte	0x9c
 	.byte	0x73
 	.uleb128 0x86
-	.4byte	.LASF3305
-	.4byte	.LASF3305
+	.4byte	.LASF3310
+	.4byte	.LASF3310
 	.byte	0xc3
 	.byte	0x29
 	.uleb128 0x86
-	.4byte	.LASF3306
-	.4byte	.LASF3306
+	.4byte	.LASF3311
+	.4byte	.LASF3311
 	.byte	0x72
 	.byte	0x88
 	.uleb128 0x86
-	.4byte	.LASF3307
-	.4byte	.LASF3307
+	.4byte	.LASF3312
+	.4byte	.LASF3312
 	.byte	0xc3
 	.byte	0x26
 	.uleb128 0x86
-	.4byte	.LASF3308
-	.4byte	.LASF3308
+	.4byte	.LASF3313
+	.4byte	.LASF3313
 	.byte	0x72
 	.byte	0x98
 	.uleb128 0x86
-	.4byte	.LASF3309
-	.4byte	.LASF3309
+	.4byte	.LASF3314
+	.4byte	.LASF3314
 	.byte	0xc4
 	.byte	0x6a
 	.uleb128 0x86
-	.4byte	.LASF3310
-	.4byte	.LASF3310
+	.4byte	.LASF3315
+	.4byte	.LASF3315
+	.byte	0x1e
+	.byte	0xb0
+	.uleb128 0x86
+	.4byte	.LASF3316
+	.4byte	.LASF3316
 	.byte	0xc2
 	.byte	0x33
 	.uleb128 0x87
-	.4byte	.LASF3311
-	.4byte	.LASF3311
+	.4byte	.LASF3317
+	.4byte	.LASF3317
 	.byte	0xd
 	.2byte	0x1d6
 	.uleb128 0x89
@@ -47107,13 +47297,13 @@ __exitcall_ebc_exit:
 	.byte	0x78
 	.byte	0x2c
 	.uleb128 0x86
-	.4byte	.LASF3312
-	.4byte	.LASF3312
+	.4byte	.LASF3318
+	.4byte	.LASF3318
 	.byte	0x78
 	.byte	0x27
 	.uleb128 0x86
-	.4byte	.LASF3313
-	.4byte	.LASF3313
+	.4byte	.LASF3319
+	.4byte	.LASF3319
 	.byte	0x9c
 	.byte	0x71
 	.byte	0
@@ -48956,9 +49146,9 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST148:
-	.8byte	.LVL516
-	.8byte	.LVL517
+.LLST152:
+	.8byte	.LVL526
+	.8byte	.LVL527
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -48970,782 +49160,782 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST149:
-	.8byte	.LVL522
-	.8byte	.LVL523
+.LLST153:
+	.8byte	.LVL532
+	.8byte	.LVL533
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST150:
-	.8byte	.LVL526
-	.8byte	.LVL527
+.LLST154:
+	.8byte	.LVL536
+	.8byte	.LVL537
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL538
-	.8byte	.LVL539
+	.8byte	.LVL548
+	.8byte	.LVL549
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL673
-	.8byte	.LVL674
+	.8byte	.LVL683
+	.8byte	.LVL684
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST151:
-	.8byte	.LVL534
-	.8byte	.LVL535
+.LLST155:
+	.8byte	.LVL544
+	.8byte	.LVL545
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL586
-	.8byte	.LVL587
+	.8byte	.LVL596
+	.8byte	.LVL597
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST152:
-	.8byte	.LVL538
-	.8byte	.LVL540
+.LLST156:
+	.8byte	.LVL548
+	.8byte	.LVL550
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL547
-	.8byte	.LVL586
+	.8byte	.LVL557
+	.8byte	.LVL596
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL591
-	.8byte	.LVL673
+	.8byte	.LVL601
+	.8byte	.LVL683
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL674
-	.8byte	.LVL680
+	.8byte	.LVL684
+	.8byte	.LVL690
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL683
-	.8byte	.LVL692
+	.8byte	.LVL693
+	.8byte	.LVL702
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL694
-	.8byte	.LFE2851
+	.8byte	.LVL704
+	.8byte	.LFE2852
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST153:
-	.8byte	.LVL529
-	.8byte	.LVL541
+.LLST157:
+	.8byte	.LVL539
+	.8byte	.LVL551
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL545
-	.8byte	.LVL548
+	.8byte	.LVL555
+	.8byte	.LVL558
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL586
-	.8byte	.LVL591
+	.8byte	.LVL596
+	.8byte	.LVL601
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL681
-	.8byte	.LVL683
+	.8byte	.LVL691
+	.8byte	.LVL693
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL701
-	.8byte	.LVL702
+	.8byte	.LVL711
+	.8byte	.LVL712
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST154:
-	.8byte	.LVL529
-	.8byte	.LVL530
+.LLST158:
+	.8byte	.LVL539
+	.8byte	.LVL540
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL530
-	.8byte	.LVL531
+	.8byte	.LVL540
+	.8byte	.LVL541
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL532
-	.8byte	.LVL536
+	.8byte	.LVL542
+	.8byte	.LVL546
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL536
-	.8byte	.LVL589
+	.8byte	.LVL546
+	.8byte	.LVL599
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL589
-	.8byte	.LVL673
+	.8byte	.LVL599
+	.8byte	.LVL683
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL674
-	.8byte	.LVL680
+	.8byte	.LVL684
+	.8byte	.LVL690
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL681
-	.8byte	.LVL692
+	.8byte	.LVL691
+	.8byte	.LVL702
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL694
-	.8byte	.LFE2851
+	.8byte	.LVL704
+	.8byte	.LFE2852
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
 	.8byte	0
 	.8byte	0
-.LLST155:
-	.8byte	.LVL533
-	.8byte	.LVL540
+.LLST159:
+	.8byte	.LVL543
+	.8byte	.LVL550
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL545
-	.8byte	.LVL547
+	.8byte	.LVL555
+	.8byte	.LVL557
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL586
-	.8byte	.LVL591
+	.8byte	.LVL596
+	.8byte	.LVL601
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL701
-	.8byte	.LVL702
+	.8byte	.LVL711
+	.8byte	.LVL712
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST156:
-	.8byte	.LVL538
-	.8byte	.LVL543
+.LLST160:
+	.8byte	.LVL548
+	.8byte	.LVL553
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL569
-	.8byte	.LVL580
+	.8byte	.LVL579
+	.8byte	.LVL590
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL591
-	.8byte	.LVL594
+	.8byte	.LVL601
+	.8byte	.LVL604
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL674
-	.8byte	.LVL675
+	.8byte	.LVL684
+	.8byte	.LVL685
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL694
-	.8byte	.LVL695
+	.8byte	.LVL704
+	.8byte	.LVL705
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL701
-	.8byte	.LVL702
+	.8byte	.LVL711
+	.8byte	.LVL712
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST157:
-	.8byte	.LVL538
-	.8byte	.LVL543
+.LLST161:
+	.8byte	.LVL548
+	.8byte	.LVL553
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL580
-	.8byte	.LVL584
+	.8byte	.LVL590
+	.8byte	.LVL594
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL594
-	.8byte	.LVL595
+	.8byte	.LVL604
+	.8byte	.LVL605
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL695
-	.8byte	.LVL696
+	.8byte	.LVL705
+	.8byte	.LVL706
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL701
-	.8byte	.LVL702
+	.8byte	.LVL711
+	.8byte	.LVL712
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST158:
-	.8byte	.LVL595
-	.8byte	.LVL596-1
+.LLST162:
+	.8byte	.LVL605
+	.8byte	.LVL606-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST159:
-	.8byte	.LVL601
-	.8byte	.LVL604
+.LLST163:
+	.8byte	.LVL611
+	.8byte	.LVL614
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST160:
-	.8byte	.LVL602
-	.8byte	.LVL603
+.LLST164:
+	.8byte	.LVL612
+	.8byte	.LVL613
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST161:
-	.8byte	.LVL538
-	.8byte	.LVL542
+.LLST165:
+	.8byte	.LVL548
+	.8byte	.LVL552
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL606
-	.8byte	.LVL614
+	.8byte	.LVL616
+	.8byte	.LVL624
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL687
-	.8byte	.LVL689
+	.8byte	.LVL697
+	.8byte	.LVL699
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL689
-	.8byte	.LVL690
+	.8byte	.LVL699
+	.8byte	.LVL700
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL690
-	.8byte	.LVL692
+	.8byte	.LVL700
+	.8byte	.LVL702
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL701
-	.8byte	.LVL702
+	.8byte	.LVL711
+	.8byte	.LVL712
 	.2byte	0x1
 	.byte	0x68
-	.8byte	0
-	.8byte	0
-.LLST162:
-	.8byte	.LVL609
-	.8byte	.LVL612
+	.8byte	0
+	.8byte	0
+.LLST166:
+	.8byte	.LVL619
+	.8byte	.LVL622
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST163:
-	.8byte	.LVL610
-	.8byte	.LVL611
+.LLST167:
+	.8byte	.LVL620
+	.8byte	.LVL621
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST164:
-	.8byte	.LVL613
-	.8byte	.LVL615-1
+.LLST168:
+	.8byte	.LVL623
+	.8byte	.LVL625-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST165:
-	.8byte	.LVL538
-	.8byte	.LVL545
+.LLST169:
+	.8byte	.LVL548
+	.8byte	.LVL555
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL620
-	.8byte	.LVL658
+	.8byte	.LVL630
+	.8byte	.LVL668
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL658
-	.8byte	.LVL659
+	.8byte	.LVL668
+	.8byte	.LVL669
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL662
-	.8byte	.LVL673
+	.8byte	.LVL672
+	.8byte	.LVL683
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL675
-	.8byte	.LVL680
+	.8byte	.LVL685
+	.8byte	.LVL690
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL696
-	.8byte	.LVL699
+	.8byte	.LVL706
+	.8byte	.LVL709
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL701
-	.8byte	.LVL702
+	.8byte	.LVL711
+	.8byte	.LVL712
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL704
-	.8byte	.LFE2851
+	.8byte	.LVL714
+	.8byte	.LFE2852
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
 	.8byte	0
 	.8byte	0
-.LLST166:
-	.8byte	.LVL538
-	.8byte	.LVL545
+.LLST170:
+	.8byte	.LVL548
+	.8byte	.LVL555
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL620
-	.8byte	.LVL670
+	.8byte	.LVL630
+	.8byte	.LVL680
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL670
-	.8byte	.LVL671
+	.8byte	.LVL680
+	.8byte	.LVL681
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL675
-	.8byte	.LVL680
+	.8byte	.LVL685
+	.8byte	.LVL690
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL696
-	.8byte	.LVL699
+	.8byte	.LVL706
+	.8byte	.LVL709
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL701
-	.8byte	.LFE2851
+	.8byte	.LVL711
+	.8byte	.LFE2852
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
 	.8byte	0
 	.8byte	0
-.LLST167:
-	.8byte	.LVL538
-	.8byte	.LVL542
+.LLST171:
+	.8byte	.LVL548
+	.8byte	.LVL552
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL626
-	.8byte	.LVL637
+	.8byte	.LVL636
+	.8byte	.LVL647
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL641
-	.8byte	.LVL652
+	.8byte	.LVL651
+	.8byte	.LVL662
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL662
-	.8byte	.LVL664
+	.8byte	.LVL672
+	.8byte	.LVL674
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL667
-	.8byte	.LVL673
+	.8byte	.LVL677
+	.8byte	.LVL683
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL696
-	.8byte	.LVL699
+	.8byte	.LVL706
+	.8byte	.LVL709
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL701
-	.8byte	.LVL702
+	.8byte	.LVL711
+	.8byte	.LVL712
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL703
-	.8byte	.LVL704
+	.8byte	.LVL713
+	.8byte	.LVL714
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST168:
-	.8byte	.LVL538
-	.8byte	.LVL544
+.LLST172:
+	.8byte	.LVL548
+	.8byte	.LVL554
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL631
-	.8byte	.LVL654
+	.8byte	.LVL641
+	.8byte	.LVL664
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL661
-	.8byte	.LVL673
+	.8byte	.LVL671
+	.8byte	.LVL683
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL675
-	.8byte	.LVL680
+	.8byte	.LVL685
+	.8byte	.LVL690
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL696
-	.8byte	.LVL699
+	.8byte	.LVL706
+	.8byte	.LVL709
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL701
-	.8byte	.LVL702
+	.8byte	.LVL711
+	.8byte	.LVL712
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST169:
-	.8byte	.LVL538
-	.8byte	.LVL543
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL622
-	.8byte	.LVL628
+.LLST173:
+	.8byte	.LVL548
+	.8byte	.LVL553
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL629
 	.8byte	.LVL632
+	.8byte	.LVL638
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL641
-	.8byte	.LVL652
+	.8byte	.LVL639
+	.8byte	.LVL642
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL654
+	.8byte	.LVL651
 	.8byte	.LVL662
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL701
-	.8byte	.LFE2851
+	.8byte	.LVL664
+	.8byte	.LVL672
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL711
+	.8byte	.LFE2852
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST170:
-	.8byte	.LVL538
-	.8byte	.LVL544
+.LLST174:
+	.8byte	.LVL548
+	.8byte	.LVL554
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL624
-	.8byte	.LVL631
+	.8byte	.LVL634
+	.8byte	.LVL641
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL633
-	.8byte	.LVL661
+	.8byte	.LVL643
+	.8byte	.LVL671
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL675
-	.8byte	.LVL680
+	.8byte	.LVL685
+	.8byte	.LVL690
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL701
-	.8byte	.LFE2851
+	.8byte	.LVL711
+	.8byte	.LFE2852
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST171:
-	.8byte	.LVL538
-	.8byte	.LVL544
+.LLST175:
+	.8byte	.LVL548
+	.8byte	.LVL554
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL627
-	.8byte	.LVL654
+	.8byte	.LVL637
+	.8byte	.LVL664
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL657
-	.8byte	.LVL673
+	.8byte	.LVL667
+	.8byte	.LVL683
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL675
-	.8byte	.LVL680
+	.8byte	.LVL685
+	.8byte	.LVL690
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL696
-	.8byte	.LVL699
+	.8byte	.LVL706
+	.8byte	.LVL709
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL701
-	.8byte	.LVL704
+	.8byte	.LVL711
+	.8byte	.LVL714
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL704
-	.8byte	.LVL705
+	.8byte	.LVL714
+	.8byte	.LVL715
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL705
-	.8byte	.LFE2851
+	.8byte	.LVL715
+	.8byte	.LFE2852
 	.2byte	0x1
 	.byte	0x6b
 	.8byte	0
 	.8byte	0
-.LLST172:
-	.8byte	.LVL538
-	.8byte	.LVL543
+.LLST176:
+	.8byte	.LVL548
+	.8byte	.LVL553
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL628
-	.8byte	.LVL654
+	.8byte	.LVL638
+	.8byte	.LVL664
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL662
-	.8byte	.LVL673
+	.8byte	.LVL672
+	.8byte	.LVL683
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL675
-	.8byte	.LVL680
+	.8byte	.LVL685
+	.8byte	.LVL690
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL696
-	.8byte	.LVL697
+	.8byte	.LVL706
+	.8byte	.LVL707
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL697
-	.8byte	.LVL699
+	.8byte	.LVL707
+	.8byte	.LVL709
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL701
-	.8byte	.LVL702
+	.8byte	.LVL711
+	.8byte	.LVL712
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST173:
-	.8byte	.LVL538
-	.8byte	.LVL542
+.LLST177:
+	.8byte	.LVL548
+	.8byte	.LVL552
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL637
-	.8byte	.LVL654
+	.8byte	.LVL647
+	.8byte	.LVL664
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL675
-	.8byte	.LVL677
+	.8byte	.LVL685
+	.8byte	.LVL687
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL701
-	.8byte	.LVL702
+	.8byte	.LVL711
+	.8byte	.LVL712
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST77:
-	.8byte	.LVL302
-	.8byte	.LVL303
+.LLST81:
+	.8byte	.LVL312
+	.8byte	.LVL313
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST78:
-	.8byte	.LVL302
-	.8byte	.LVL304-1
+.LLST82:
+	.8byte	.LVL312
+	.8byte	.LVL314-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST79:
-	.8byte	.LVL302
-	.8byte	.LVL304-1
+.LLST83:
+	.8byte	.LVL312
+	.8byte	.LVL314-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST80:
-	.8byte	.LVL305
-	.8byte	.LVL306
+.LLST84:
+	.8byte	.LVL315
+	.8byte	.LVL316
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST81:
-	.8byte	.LVL305
-	.8byte	.LVL307
+.LLST85:
+	.8byte	.LVL315
+	.8byte	.LVL317
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST82:
-	.8byte	.LVL305
-	.8byte	.LVL308
+.LLST86:
+	.8byte	.LVL315
+	.8byte	.LVL318
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL308
-	.8byte	.LVL309-1
+	.8byte	.LVL318
+	.8byte	.LVL319-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST83:
-	.8byte	.LVL310
-	.8byte	.LVL311
+.LLST87:
+	.8byte	.LVL320
+	.8byte	.LVL321
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST84:
-	.8byte	.LVL310
-	.8byte	.LVL312
+.LLST88:
+	.8byte	.LVL320
+	.8byte	.LVL322
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST85:
-	.8byte	.LVL310
-	.8byte	.LVL313
+.LLST89:
+	.8byte	.LVL320
+	.8byte	.LVL323
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL313
-	.8byte	.LVL314-1
+	.8byte	.LVL323
+	.8byte	.LVL324-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST95:
-	.8byte	.LVL335
-	.8byte	.LVL336
+.LLST99:
+	.8byte	.LVL345
+	.8byte	.LVL346
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST96:
-	.8byte	.LVL335
-	.8byte	.LVL337
+.LLST100:
+	.8byte	.LVL345
+	.8byte	.LVL347
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST97:
-	.8byte	.LVL335
-	.8byte	.LVL339
+.LLST101:
+	.8byte	.LVL345
+	.8byte	.LVL349
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL339
-	.8byte	.LVL344
+	.8byte	.LVL349
+	.8byte	.LVL354
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL345
-	.8byte	.LFE2841
+	.8byte	.LVL355
+	.8byte	.LFE2842
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST98:
-	.8byte	.LVL335
-	.8byte	.LVL340-1
+.LLST102:
+	.8byte	.LVL345
+	.8byte	.LVL350-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL340-1
-	.8byte	.LVL343
+	.8byte	.LVL350-1
+	.8byte	.LVL353
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL345
-	.8byte	.LVL346
+	.8byte	.LVL355
+	.8byte	.LVL356
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL348
-	.8byte	.LVL349
+	.8byte	.LVL358
+	.8byte	.LVL359
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST99:
-	.8byte	.LVL338
-	.8byte	.LVL344
+.LLST103:
+	.8byte	.LVL348
+	.8byte	.LVL354
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL345
-	.8byte	.LFE2841
+	.8byte	.LVL355
+	.8byte	.LFE2842
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST100:
-	.8byte	.LVL341
-	.8byte	.LVL345
+.LLST104:
+	.8byte	.LVL351
+	.8byte	.LVL355
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
-	.8byte	.LVL348
-	.8byte	.LFE2841
+	.8byte	.LVL358
+	.8byte	.LFE2842
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
 	.8byte	0
 	.8byte	0
-.LLST86:
-	.8byte	.LVL315
-	.8byte	.LVL316
+.LLST90:
+	.8byte	.LVL325
+	.8byte	.LVL326
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST87:
-	.8byte	.LVL315
-	.8byte	.LVL317
+.LLST91:
+	.8byte	.LVL325
+	.8byte	.LVL327
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST88:
-	.8byte	.LVL315
-	.8byte	.LVL318-1
+.LLST92:
+	.8byte	.LVL325
+	.8byte	.LVL328-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL318-1
-	.8byte	.LVL320
+	.8byte	.LVL328-1
+	.8byte	.LVL330
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST89:
-	.8byte	.LVL321
-	.8byte	.LVL322
+.LLST93:
+	.8byte	.LVL331
+	.8byte	.LVL332
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST90:
-	.8byte	.LVL321
-	.8byte	.LVL323
+.LLST94:
+	.8byte	.LVL331
+	.8byte	.LVL333
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST91:
-	.8byte	.LVL321
-	.8byte	.LVL324
+.LLST95:
+	.8byte	.LVL331
+	.8byte	.LVL334
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL324
-	.8byte	.LVL327
+	.8byte	.LVL334
+	.8byte	.LVL337
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL328
-	.8byte	.LFE2839
+	.8byte	.LVL338
+	.8byte	.LFE2840
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST92:
-	.8byte	.LVL330
-	.8byte	.LVL331
+.LLST96:
+	.8byte	.LVL340
+	.8byte	.LVL341
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST93:
-	.8byte	.LVL330
-	.8byte	.LVL332
+.LLST97:
+	.8byte	.LVL340
+	.8byte	.LVL342
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST94:
-	.8byte	.LVL330
-	.8byte	.LVL333
+.LLST98:
+	.8byte	.LVL340
+	.8byte	.LVL343
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL333
-	.8byte	.LVL334-1
+	.8byte	.LVL343
+	.8byte	.LVL344-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST101:
-	.8byte	.LVL352
-	.8byte	.LVL353-1
+.LLST105:
+	.8byte	.LVL362
+	.8byte	.LVL363-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST102:
-	.8byte	.LVL352
-	.8byte	.LVL353-1
+.LLST106:
+	.8byte	.LVL362
+	.8byte	.LVL363-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST103:
-	.8byte	.LVL352
-	.8byte	.LVL353-1
+.LLST107:
+	.8byte	.LVL362
+	.8byte	.LVL363-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL353-1
-	.8byte	.LVL355
+	.8byte	.LVL363-1
+	.8byte	.LVL365
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -49866,7 +50056,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL256
-	.8byte	.LFE2832
+	.8byte	.LFE2833
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
@@ -50204,7 +50394,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL263
-	.8byte	.LFE2832
+	.8byte	.LFE2833
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -50238,7 +50428,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x53
 	.8byte	.LVL264
-	.8byte	.LFE2832
+	.8byte	.LFE2833
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
@@ -50488,480 +50678,488 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST188:
-	.8byte	.LVL760
-	.8byte	.LVL761
+.LLST192:
+	.8byte	.LVL770
+	.8byte	.LVL771
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST189:
-	.8byte	.LVL762
-	.8byte	.LVL796
+.LLST193:
+	.8byte	.LVL772
+	.8byte	.LVL807
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL799
-	.8byte	.LFE2827
+	.8byte	.LVL810
+	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST190:
-	.8byte	.LVL764
-	.8byte	.LVL790
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL790
-	.8byte	.LVL791
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL791
-	.8byte	.LVL797
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL799
-	.8byte	.LVL806
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL806
-	.8byte	.LVL807
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL807
-	.8byte	.LVL825
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL825
-	.8byte	.LVL826
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL826
-	.8byte	.LVL837
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL837
-	.8byte	.LVL838
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL838
-	.8byte	.LVL893
+.LLST194:
+	.8byte	.LVL773
+	.8byte	.LVL808
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL893
-	.8byte	.LVL894
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL894
-	.8byte	.LFE2827
+	.8byte	.LVL810
+	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST191:
-	.8byte	.LVL813
-	.8byte	.LVL815-1
+.LLST195:
+	.8byte	.LVL823
+	.8byte	.LVL825-1
 	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL824
-	.8byte	.LVL825
+	.byte	0x57
+	.8byte	.LVL834
+	.8byte	.LVL835
 	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL826
-	.8byte	.LVL827-1
+	.byte	0x57
+	.8byte	.LVL836
+	.8byte	.LVL838-1
 	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL862
-	.8byte	.LVL863-1
+	.byte	0x57
+	.8byte	.LVL860
+	.8byte	.LVL862-1
 	.2byte	0x1
-	.byte	0x58
-	.8byte	0
+	.byte	0x57
 	.8byte	0
-.LLST192:
-	.8byte	.LVL763
-	.8byte	.LVL797
+	.8byte	0
+.LLST196:
+	.8byte	.LVL837
+	.8byte	.LVL838-1
 	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL799
-	.8byte	.LFE2827
+	.byte	0x51
+	.8byte	.LVL861
+	.8byte	.LVL862-1
 	.2byte	0x1
-	.byte	0x67
+	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST193:
-	.8byte	.LVL764
-	.8byte	.LVL779
+.LLST197:
+	.8byte	.LVL773
+	.8byte	.LVL789
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL783
-	.8byte	.LVL786
+	.8byte	.LVL793
+	.8byte	.LVL796
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL790
-	.8byte	.LVL798
+	.8byte	.LVL802
+	.8byte	.LVL809
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL799
-	.8byte	.LVL880
+	.8byte	.LVL810
+	.8byte	.LVL886
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL884
-	.8byte	.LVL887
+	.8byte	.LVL891
+	.8byte	.LVL894
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL888
-	.8byte	.LVL904
+	.8byte	.LVL895
+	.8byte	.LVL900
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL910
-	.8byte	.LFE2827
+	.8byte	.LVL906
+	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST207:
-	.8byte	.LVL876
-	.8byte	.LVL877
+.LLST211:
+	.8byte	.LVL882
+	.8byte	.LVL883
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL906
-	.8byte	.LVL907-1
+	.8byte	.LVL902
+	.8byte	.LVL903-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST206:
+.LLST210:
+	.8byte	.LVL867
 	.8byte	.LVL868
-	.8byte	.LVL869
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL899
-	.8byte	.LVL900-1
+	.8byte	.LVL912
+	.8byte	.LVL913-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST205:
-	.8byte	.LVL792
-	.8byte	.LVL793
+.LLST209:
+	.8byte	.LVL803
+	.8byte	.LVL804
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL832
-	.8byte	.LVL833-1
+	.8byte	.LVL843
+	.8byte	.LVL844-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST194:
-	.8byte	.LVL794
-	.8byte	.LVL795
+.LLST198:
+	.8byte	.LVL805
+	.8byte	.LVL806
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL801
-	.8byte	.LVL802-1
+	.8byte	.LVL812
+	.8byte	.LVL813-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST195:
-	.8byte	.LVL774
-	.8byte	.LVL790
+.LLST199:
+	.8byte	.LVL784
+	.8byte	.LVL802
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL880
-	.8byte	.LVL885-1
+	.byte	0x62
+	.8byte	.LVL886
+	.8byte	.LVL892-1
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL887
-	.8byte	.LVL888
+	.byte	0x62
+	.8byte	.LVL894
+	.8byte	.LVL895
 	.2byte	0x1
-	.byte	0x61
+	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST196:
-	.8byte	.LVL779
-	.8byte	.LVL782
+.LLST200:
+	.8byte	.LVL789
+	.8byte	.LVL792
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL787
-	.8byte	.LVL790
+	.byte	0x50
+	.8byte	.LVL797
+	.8byte	.LVL802
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL880
-	.8byte	.LVL882
+	.byte	0x50
+	.8byte	.LVL886
+	.8byte	.LVL889
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL887
-	.8byte	.LVL888
+	.byte	0x50
+	.8byte	.LVL894
+	.8byte	.LVL895
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST197:
-	.8byte	.LVL764
-	.8byte	.LVL779
+.LLST201:
+	.8byte	.LVL773
+	.8byte	.LVL789
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL781
-	.8byte	.LVL786
+	.8byte	.LVL791
+	.8byte	.LVL796
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL790
-	.8byte	.LVL798
+	.8byte	.LVL802
+	.8byte	.LVL809
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL799
-	.8byte	.LVL814
+	.8byte	.LVL810
+	.8byte	.LVL824
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL816
 	.8byte	.LVL826
+	.8byte	.LVL836
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL829
-	.8byte	.LVL862
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL871
-	.8byte	.LVL880
+	.8byte	.LVL840
+	.8byte	.LVL860
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL881
-	.8byte	.LVL887
+	.8byte	.LVL870
+	.8byte	.LVL886
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	.LVL888
-	.8byte	.LVL897
+	.8byte	.LVL894
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL903
-	.8byte	.LVL904
+	.8byte	.LVL895
+	.8byte	.LVL900
 	.2byte	0x1
 	.byte	0x6a
+	.8byte	.LVL906
 	.8byte	.LVL910
-	.8byte	.LFE2827
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL916
+	.8byte	.LFE2828
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST198:
-	.8byte	.LVL778
-	.8byte	.LVL780
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL781
+.LLST202:
+	.8byte	.LVL788
 	.8byte	.LVL790
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL884
-	.8byte	.LVL885-1
+	.8byte	.LVL791
+	.8byte	.LVL802
 	.2byte	0x1
 	.byte	0x52
+	.8byte	.LVL886
 	.8byte	.LVL887
-	.8byte	.LVL888
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL891
+	.8byte	.LVL892-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL894
+	.8byte	.LVL895
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST199:
-	.8byte	.LVL764
-	.8byte	.LVL767
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL778
+.LLST203:
 	.8byte	.LVL788
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL789
 	.8byte	.LVL798
 	.2byte	0x1
-	.byte	0x69
+	.byte	0x53
 	.8byte	.LVL799
-	.8byte	.LVL805
+	.8byte	.LVL800
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL806
-	.8byte	.LVL807
+	.byte	0x53
+	.8byte	.LVL801
+	.8byte	.LVL802
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL886
+	.8byte	.LVL892-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL894
+	.8byte	.LVL895
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST204:
+	.8byte	.LVL788
+	.8byte	.LVL789
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL792
+	.8byte	.LVL794
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL794
+	.8byte	.LVL795
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL890
+	.8byte	.LVL892-1
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST205:
+	.8byte	.LVL787
+	.8byte	.LVL802
+	.2byte	0x1
+	.byte	0x61
+	.8byte	.LVL886
+	.8byte	.LVL892-1
+	.2byte	0x1
+	.byte	0x61
+	.8byte	.LVL894
+	.8byte	.LVL895
+	.2byte	0x1
+	.byte	0x61
+	.8byte	0
+	.8byte	0
+.LLST206:
+	.8byte	.LVL785
+	.8byte	.LVL802
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL886
+	.8byte	.LVL892-1
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL894
+	.8byte	.LVL895
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	0
+	.8byte	0
+.LLST207:
+	.8byte	.LVL787
+	.8byte	.LVL802
+	.2byte	0x1
+	.byte	0x60
+	.8byte	.LVL886
+	.8byte	.LVL892-1
+	.2byte	0x1
+	.byte	0x60
+	.8byte	.LVL894
+	.8byte	.LVL895
+	.2byte	0x1
+	.byte	0x60
+	.8byte	0
+	.8byte	0
+.LLST208:
+	.8byte	.LVL773
+	.8byte	.LVL777
 	.2byte	0x1
 	.byte	0x69
+	.8byte	.LVL786
 	.8byte	.LVL809
-	.8byte	.LVL812
 	.2byte	0x1
 	.byte	0x69
+	.8byte	.LVL810
 	.8byte	.LVL816
+	.2byte	0x1
+	.byte	0x69
 	.8byte	.LVL817
+	.8byte	.LVL820
 	.2byte	0x1
 	.byte	0x69
 	.8byte	.LVL821
-	.8byte	.LVL823
+	.8byte	.LVL822
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL825
 	.8byte	.LVL826
+	.8byte	.LVL827
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL829
-	.8byte	.LVL839
+	.8byte	.LVL831
+	.8byte	.LVL833
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL853
-	.8byte	.LVL856
+	.8byte	.LVL835
+	.8byte	.LVL836
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL840
+	.8byte	.LVL848
 	.2byte	0x1
 	.byte	0x69
+	.8byte	.LVL877
 	.8byte	.LVL880
-	.8byte	.LVL889
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL893
-	.8byte	.LVL897
+	.8byte	.LVL886
+	.8byte	.LVL899
 	.2byte	0x1
 	.byte	0x69
+	.8byte	.LVL906
 	.8byte	.LVL910
-	.8byte	.LVL913
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL915
-	.8byte	.LFE2827
+	.8byte	.LVL916
+	.8byte	.LVL918
 	.2byte	0x1
 	.byte	0x69
-	.8byte	0
-	.8byte	0
-.LLST200:
-	.8byte	.LVL778
-	.8byte	.LVL779
-	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL782
-	.8byte	.LVL784
+	.8byte	.LVL921
+	.8byte	.LVL923
 	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL784
-	.8byte	.LVL785
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL883
-	.8byte	.LVL885-1
+	.byte	0x69
+	.8byte	.LVL925
+	.8byte	.LFE2828
 	.2byte	0x1
-	.byte	0x54
+	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST201:
-	.8byte	.LVL777
-	.8byte	.LVL790
-	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL880
-	.8byte	.LVL885-1
+.LLST75:
+	.8byte	.LVL277
+	.8byte	.LVL283
 	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL887
-	.8byte	.LVL888
+	.byte	0x50
+	.8byte	.LVL284
+	.8byte	.LVL285
 	.2byte	0x1
-	.byte	0x60
+	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST202:
-	.8byte	.LVL775
-	.8byte	.LVL790
+.LLST76:
+	.8byte	.LVL277
+	.8byte	.LVL278
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL880
-	.8byte	.LVL885-1
+	.byte	0x51
+	.8byte	.LVL278
+	.8byte	.LVL279
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL887
-	.8byte	.LVL888
+	.byte	0x55
+	.8byte	.LVL279
+	.8byte	.LVL281
 	.2byte	0x1
-	.byte	0x59
+	.byte	0x51
+	.8byte	.LVL284
+	.8byte	.LVL286-1
+	.2byte	0x1
+	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST203:
-	.8byte	.LVL777
-	.8byte	.LVL790
-	.2byte	0x1
-	.byte	0x5f
-	.8byte	.LVL880
-	.8byte	.LVL885-1
-	.2byte	0x1
-	.byte	0x5f
-	.8byte	.LVL887
-	.8byte	.LVL888
+.LLST77:
+	.8byte	.LVL282
+	.8byte	.LVL286-1
 	.2byte	0x1
-	.byte	0x5f
+	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST204:
-	.8byte	.LVL776
-	.8byte	.LVL790
-	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL880
-	.8byte	.LVL885-1
-	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL887
-	.8byte	.LVL888
+.LLST78:
+	.8byte	.LVL280
+	.8byte	.LVL286-1
 	.2byte	0x1
-	.byte	0x62
+	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST75:
-	.8byte	.LVL277
-	.8byte	.LVL278
+.LLST79:
+	.8byte	.LVL287
+	.8byte	.LVL288
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL278
-	.8byte	.LVL284
+	.8byte	.LVL288
+	.8byte	.LVL294
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL285
+	.8byte	.LVL295
 	.8byte	.LFE2825
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST76:
-	.8byte	.LVL279
-	.8byte	.LVL281
+.LLST80:
+	.8byte	.LVL289
+	.8byte	.LVL291
 	.2byte	0x2
 	.byte	0x71
 	.sleb128 -12
-	.8byte	.LVL281
-	.8byte	.LVL286
+	.8byte	.LVL291
+	.8byte	.LVL296
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
-	.8byte	.LVL286
-	.8byte	.LVL289
+	.8byte	.LVL296
+	.8byte	.LVL299
 	.2byte	0x2
 	.byte	0x71
 	.sleb128 -12
-	.8byte	.LVL289
+	.8byte	.LVL299
 	.8byte	.LFE2825
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
 	.8byte	0
 	.8byte	0
-.LLST145:
-	.8byte	.LVL488
-	.8byte	.LVL489
+.LLST149:
+	.8byte	.LVL498
+	.8byte	.LVL499
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST144:
-	.8byte	.LVL461
-	.8byte	.LVL462
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL462
-	.8byte	.LVL466
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL467
+.LLST148:
 	.8byte	.LVL471
+	.8byte	.LVL472
 	.2byte	0x1
-	.byte	0x64
+	.byte	0x50
 	.8byte	.LVL472
 	.8byte	.LVL476
 	.2byte	0x1
@@ -50971,11 +51169,19 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL482
-	.8byte	.LVL484
+	.8byte	.LVL486
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL485
 	.8byte	.LVL487
+	.8byte	.LVL491
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL492
+	.8byte	.LVL494
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL495
+	.8byte	.LVL497
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
@@ -51158,136 +51364,136 @@ __exitcall_ebc_exit:
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST185:
-	.8byte	.LVL748
-	.8byte	.LVL750
+.LLST189:
+	.8byte	.LVL758
+	.8byte	.LVL760
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST186:
-	.8byte	.LVL749
-	.8byte	.LVL752
+.LLST190:
+	.8byte	.LVL759
+	.8byte	.LVL762
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST187:
-	.8byte	.LVL752
-	.8byte	.LVL755
+.LLST191:
+	.8byte	.LVL762
+	.8byte	.LVL765
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL756
-	.8byte	.LVL759
+	.8byte	.LVL766
+	.8byte	.LVL769
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST181:
-	.8byte	.LVL737
-	.8byte	.LVL742
+.LLST185:
+	.8byte	.LVL747
+	.8byte	.LVL752
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL747
+	.8byte	.LVL757
 	.8byte	.LFE2809
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST182:
-	.8byte	.LVL743
-	.8byte	.LVL744
+.LLST186:
+	.8byte	.LVL753
+	.8byte	.LVL754
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST183:
-	.8byte	.LVL741
-	.8byte	.LVL745
+.LLST187:
+	.8byte	.LVL751
+	.8byte	.LVL755
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST184:
-	.8byte	.LVL744
-	.8byte	.LVL746
+.LLST188:
+	.8byte	.LVL754
+	.8byte	.LVL756
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST175:
-	.8byte	.LVL715
-	.8byte	.LVL721
-	.2byte	0x1
-	.byte	0x54
+.LLST179:
 	.8byte	.LVL725
-	.8byte	.LVL726
+	.8byte	.LVL731
 	.2byte	0x1
 	.byte	0x54
 	.8byte	.LVL735
 	.8byte	.LVL736
 	.2byte	0x1
 	.byte	0x54
+	.8byte	.LVL745
+	.8byte	.LVL746
+	.2byte	0x1
+	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST176:
-	.8byte	.LVL715
-	.8byte	.LVL716
+.LLST180:
+	.8byte	.LVL725
+	.8byte	.LVL726
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST177:
-	.8byte	.LVL721
-	.8byte	.LVL724
+.LLST181:
+	.8byte	.LVL731
+	.8byte	.LVL734
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL728
-	.8byte	.LVL733
+	.8byte	.LVL738
+	.8byte	.LVL743
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL736
+	.8byte	.LVL746
 	.8byte	.LFE2808
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST178:
-	.8byte	.LVL720
-	.8byte	.LVL721
+.LLST182:
+	.8byte	.LVL730
+	.8byte	.LVL731
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL723
-	.8byte	.LVL727
+	.8byte	.LVL733
+	.8byte	.LVL737
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL732
-	.8byte	.LVL736
+	.8byte	.LVL742
+	.8byte	.LVL746
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST179:
-	.8byte	.LVL720
-	.8byte	.LVL722
+.LLST183:
+	.8byte	.LVL730
+	.8byte	.LVL732
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL723
-	.8byte	.LVL731
+	.8byte	.LVL733
+	.8byte	.LVL741
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL734
+	.8byte	.LVL744
 	.8byte	.LFE2808
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST180:
-	.8byte	.LVL720
-	.8byte	.LVL729
+.LLST184:
+	.8byte	.LVL730
+	.8byte	.LVL739
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL730
+	.8byte	.LVL740
 	.8byte	.LFE2808
 	.2byte	0x1
 	.byte	0x57
@@ -51300,535 +51506,535 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST104:
-	.8byte	.LVL357
-	.8byte	.LVL386
+.LLST108:
+	.8byte	.LVL367
+	.8byte	.LVL396
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL391
-	.8byte	.LVL394
+	.8byte	.LVL401
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL397
+	.8byte	.LVL407
 	.8byte	.LFE2816
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST105:
-	.8byte	.LVL357
-	.8byte	.LVL385
+.LLST109:
+	.8byte	.LVL367
+	.8byte	.LVL395
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL391
-	.8byte	.LVL394
+	.8byte	.LVL401
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL397
+	.8byte	.LVL407
 	.8byte	.LFE2816
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST106:
-	.8byte	.LVL357
-	.8byte	.LVL359
+.LLST110:
+	.8byte	.LVL367
+	.8byte	.LVL369
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL373
-	.8byte	.LVL375
+	.8byte	.LVL383
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST107:
-	.8byte	.LVL358
-	.8byte	.LVL374
+.LLST111:
+	.8byte	.LVL368
+	.8byte	.LVL384
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL398
+	.8byte	.LVL408
 	.8byte	.LFE2816
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
-.LLST108:
-	.8byte	.LVL363
+.LLST112:
 	.8byte	.LVL373
+	.8byte	.LVL383
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL398
+	.8byte	.LVL408
 	.8byte	.LFE2816
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST109:
-	.8byte	.LVL364
-	.8byte	.LVL373
+.LLST113:
+	.8byte	.LVL374
+	.8byte	.LVL383
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL398
+	.8byte	.LVL408
 	.8byte	.LFE2816
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST110:
-	.8byte	.LVL368
-	.8byte	.LVL370
+.LLST114:
+	.8byte	.LVL378
+	.8byte	.LVL380
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST111:
-	.8byte	.LVL365
-	.8byte	.LVL366
+.LLST115:
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL367
-	.8byte	.LVL371
+	.8byte	.LVL377
+	.8byte	.LVL381
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL372
-	.8byte	.LVL373
+	.8byte	.LVL382
+	.8byte	.LVL383
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL398
+	.8byte	.LVL408
 	.8byte	.LFE2816
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST112:
-	.8byte	.LVL360
-	.8byte	.LVL361
+.LLST116:
+	.8byte	.LVL370
+	.8byte	.LVL371
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST113:
-	.8byte	.LVL362
-	.8byte	.LVL373
+.LLST117:
+	.8byte	.LVL372
+	.8byte	.LVL383
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL398
+	.8byte	.LVL408
 	.8byte	.LFE2816
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST114:
-	.8byte	.LVL385
-	.8byte	.LVL387
+.LLST118:
+	.8byte	.LVL395
+	.8byte	.LVL397
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST115:
-	.8byte	.LVL386
-	.8byte	.LVL388
+.LLST119:
+	.8byte	.LVL396
+	.8byte	.LVL398
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST116:
-	.8byte	.LVL382
-	.8byte	.LVL383
+.LLST120:
+	.8byte	.LVL392
+	.8byte	.LVL393
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL384
-	.8byte	.LVL389
+	.8byte	.LVL394
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL390
-	.8byte	.LVL392
+	.8byte	.LVL400
+	.8byte	.LVL402
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL393
-	.8byte	.LVL395
+	.8byte	.LVL403
+	.8byte	.LVL405
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL396
+	.8byte	.LVL406
 	.8byte	.LFE2816
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST117:
-	.8byte	.LVL375
-	.8byte	.LVL376
+.LLST121:
+	.8byte	.LVL385
+	.8byte	.LVL386
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST118:
-	.8byte	.LVL399
-	.8byte	.LVL431
+.LLST122:
+	.8byte	.LVL409
+	.8byte	.LVL441
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL432
-	.8byte	.LVL434
+	.8byte	.LVL442
+	.8byte	.LVL444
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL449
-	.8byte	.LVL452
+	.8byte	.LVL459
+	.8byte	.LVL462
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST119:
-	.8byte	.LVL399
-	.8byte	.LVL435
+.LLST123:
+	.8byte	.LVL409
+	.8byte	.LVL445
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL449
-	.8byte	.LVL452
+	.8byte	.LVL459
+	.8byte	.LVL462
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST120:
-	.8byte	.LVL399
-	.8byte	.LVL401
+.LLST124:
+	.8byte	.LVL409
+	.8byte	.LVL411
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL419
-	.8byte	.LVL420
+	.8byte	.LVL429
+	.8byte	.LVL430
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST121:
-	.8byte	.LVL415
-	.8byte	.LVL419
+.LLST125:
+	.8byte	.LVL425
+	.8byte	.LVL429
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL430
-	.8byte	.LVL443
+	.8byte	.LVL440
+	.8byte	.LVL453
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL448
+	.8byte	.LVL458
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST122:
-	.8byte	.LVL415
-	.8byte	.LVL419
+.LLST126:
+	.8byte	.LVL425
+	.8byte	.LVL429
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL430
-	.8byte	.LVL431
+	.8byte	.LVL440
+	.8byte	.LVL441
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL432
-	.8byte	.LVL444
+	.8byte	.LVL442
+	.8byte	.LVL454
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL448
+	.8byte	.LVL458
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST123:
-	.8byte	.LVL415
-	.8byte	.LVL419
+.LLST127:
+	.8byte	.LVL425
+	.8byte	.LVL429
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL428
+	.8byte	.LVL438
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST124:
-	.8byte	.LVL415
-	.8byte	.LVL419
+.LLST128:
+	.8byte	.LVL425
+	.8byte	.LVL429
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL427
+	.8byte	.LVL437
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST125:
-	.8byte	.LVL415
-	.8byte	.LVL419
+.LLST129:
+	.8byte	.LVL425
+	.8byte	.LVL429
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL432
-	.8byte	.LVL433
+	.8byte	.LVL442
+	.8byte	.LVL443
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL449
-	.8byte	.LVL450
+	.8byte	.LVL459
+	.8byte	.LVL460
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL451
-	.8byte	.LVL452
+	.8byte	.LVL461
+	.8byte	.LVL462
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST126:
-	.8byte	.LVL415
-	.8byte	.LVL419
+.LLST130:
+	.8byte	.LVL425
+	.8byte	.LVL429
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL425
+	.8byte	.LVL435
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST127:
-	.8byte	.LVL415
-	.8byte	.LVL419
+.LLST131:
+	.8byte	.LVL425
+	.8byte	.LVL429
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL426
+	.8byte	.LVL436
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST128:
-	.8byte	.LVL415
-	.8byte	.LVL419
+.LLST132:
+	.8byte	.LVL425
+	.8byte	.LVL429
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL429
+	.8byte	.LVL439
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST129:
-	.8byte	.LVL421
-	.8byte	.LVL422
+.LLST133:
+	.8byte	.LVL431
+	.8byte	.LVL432
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST130:
-	.8byte	.LVL415
-	.8byte	.LVL419
+.LLST134:
+	.8byte	.LVL425
+	.8byte	.LVL429
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL424
+	.8byte	.LVL434
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST131:
-	.8byte	.LVL415
-	.8byte	.LVL419
+.LLST135:
+	.8byte	.LVL425
+	.8byte	.LVL429
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL430
-	.8byte	.LVL436
+	.8byte	.LVL440
+	.8byte	.LVL446
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL445
+	.8byte	.LVL455
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST132:
-	.8byte	.LVL415
-	.8byte	.LVL419
+.LLST136:
+	.8byte	.LVL425
+	.8byte	.LVL429
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL430
-	.8byte	.LVL439
+	.8byte	.LVL440
+	.8byte	.LVL449
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL440
-	.8byte	.LVL441
+	.8byte	.LVL450
+	.8byte	.LVL451
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL442
-	.8byte	.LVL446
+	.8byte	.LVL452
+	.8byte	.LVL456
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL447
+	.8byte	.LVL457
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST133:
-	.8byte	.LVL415
-	.8byte	.LVL419
+.LLST137:
+	.8byte	.LVL425
+	.8byte	.LVL429
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL430
-	.8byte	.LVL437
+	.8byte	.LVL440
+	.8byte	.LVL447
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL438
-	.8byte	.LVL441
+	.8byte	.LVL448
+	.8byte	.LVL451
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL442
-	.8byte	.LVL446
+	.8byte	.LVL452
+	.8byte	.LVL456
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL447
+	.8byte	.LVL457
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST134:
-	.8byte	.LVL415
-	.8byte	.LVL419
+.LLST138:
+	.8byte	.LVL425
+	.8byte	.LVL429
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL430
-	.8byte	.LVL437
+	.8byte	.LVL440
+	.8byte	.LVL447
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL438
-	.8byte	.LVL439
+	.8byte	.LVL448
+	.8byte	.LVL449
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL440
-	.8byte	.LVL446
+	.8byte	.LVL450
+	.8byte	.LVL456
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL447
+	.8byte	.LVL457
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST135:
-	.8byte	.LVL407
-	.8byte	.LVL408
+.LLST139:
+	.8byte	.LVL417
+	.8byte	.LVL418
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL409
-	.8byte	.LVL410
+	.8byte	.LVL419
+	.8byte	.LVL420
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL411
-	.8byte	.LVL412
+	.8byte	.LVL421
+	.8byte	.LVL422
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL413
-	.8byte	.LVL414
+	.8byte	.LVL423
+	.8byte	.LVL424
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL415
-	.8byte	.LVL419
+	.8byte	.LVL425
+	.8byte	.LVL429
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
-.LLST136:
-	.8byte	.LVL405
-	.8byte	.LVL418
+.LLST140:
+	.8byte	.LVL415
+	.8byte	.LVL428
 	.2byte	0x1
 	.byte	0x6e
 	.8byte	0
 	.8byte	0
-.LLST137:
-	.8byte	.LVL406
-	.8byte	.LVL419
+.LLST141:
+	.8byte	.LVL416
+	.8byte	.LVL429
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST138:
-	.8byte	.LVL400
-	.8byte	.LVL423
+.LLST142:
+	.8byte	.LVL410
+	.8byte	.LVL433
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST139:
-	.8byte	.LVL402
-	.8byte	.LVL403
+.LLST143:
+	.8byte	.LVL412
+	.8byte	.LVL413
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST140:
-	.8byte	.LVL404
-	.8byte	.LVL419
+.LLST144:
+	.8byte	.LVL414
+	.8byte	.LVL429
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST141:
-	.8byte	.LVL407
-	.8byte	.LVL416
+.LLST145:
+	.8byte	.LVL417
+	.8byte	.LVL426
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST142:
-	.8byte	.LVL407
+.LLST146:
 	.8byte	.LVL417
+	.8byte	.LVL427
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST143:
-	.8byte	.LVL453
-	.8byte	.LVL454
+.LLST147:
+	.8byte	.LVL463
+	.8byte	.LVL464
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL454
-	.8byte	.LVL459
+	.8byte	.LVL464
+	.8byte	.LVL469
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL460
-	.8byte	.LFE2864
+	.8byte	.LVL470
+	.8byte	.LFE2865
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST146:
-	.8byte	.LVL505
-	.8byte	.LVL507
+.LLST150:
+	.8byte	.LVL515
+	.8byte	.LVL517
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL507
-	.8byte	.LVL511
+	.8byte	.LVL517
+	.8byte	.LVL521
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL512
-	.8byte	.LVL515
+	.8byte	.LVL522
+	.8byte	.LVL525
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST147:
-	.8byte	.LVL505
-	.8byte	.LVL506
+.LLST151:
+	.8byte	.LVL515
+	.8byte	.LVL516
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST174:
-	.8byte	.LVL707
-	.8byte	.LVL708
+.LLST178:
+	.8byte	.LVL717
+	.8byte	.LVL718
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL708
-	.8byte	.LVL712
+	.8byte	.LVL718
+	.8byte	.LVL722
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL713
-	.8byte	.LFE2870
+	.8byte	.LVL723
+	.8byte	.LFE2871
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -51843,10 +52049,10 @@ __exitcall_ebc_exit:
 	.2byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0-.Ltext0
+	.8byte	.LFB2857
+	.8byte	.LFE2857-.LFB2857
 	.8byte	.LFB2856
 	.8byte	.LFE2856-.LFB2856
-	.8byte	.LFB2855
-	.8byte	.LFE2855-.LFB2855
 	.8byte	0
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
@@ -52385,8 +52591,8 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	.LBB1811
 	.8byte	.LBE1811
-	.8byte	.LBB1821
-	.8byte	.LBE1821
+	.8byte	.LBB1822
+	.8byte	.LBE1822
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1813
@@ -52397,8 +52603,8 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	.LBB1815
 	.8byte	.LBE1815
-	.8byte	.LBB1822
-	.8byte	.LBE1822
+	.8byte	.LBB1821
+	.8byte	.LBE1821
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1817
@@ -52409,10 +52615,10 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0
+	.8byte	.LFB2857
+	.8byte	.LFE2857
 	.8byte	.LFB2856
 	.8byte	.LFE2856
-	.8byte	.LFB2855
-	.8byte	.LFE2855
 	.8byte	0
 	.8byte	0
 	.section	.debug_line,"",@progbits
@@ -52436,7 +52642,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_REQ_IDLE"
 .LASF2395:
 	.string	"suppliers"
-.LASF3065:
+.LASF3067:
 	.string	"ebc_buffer_manage_init"
 .LASF2894:
 	.string	"EPD_FULL_GCC16"
@@ -52494,7 +52700,7 @@ __exitcall_ebc_exit:
 	.string	"dev_kobj"
 .LASF475:
 	.string	"d_release"
-.LASF3177:
+.LASF3182:
 	.string	"get_arch_dma_ops"
 .LASF305:
 	.string	"__ctors_start"
@@ -52528,7 +52734,7 @@ __exitcall_ebc_exit:
 	.string	"si_code"
 .LASF649:
 	.string	"thread_node"
-.LASF3114:
+.LASF3119:
 	.string	"temperature"
 .LASF1316:
 	.string	"map_pages"
@@ -52570,9 +52776,9 @@ __exitcall_ebc_exit:
 	.string	"gpio_desc"
 .LASF976:
 	.string	"list"
-.LASF3194:
+.LASF3199:
 	.string	"_copy_from_user"
-.LASF3220:
+.LASF3225:
 	.string	"get_order"
 .LASF959:
 	.string	"si_errno"
@@ -52606,7 +52812,7 @@ __exitcall_ebc_exit:
 	.string	"mm_rb"
 .LASF2201:
 	.string	"freeze_late"
-.LASF3086:
+.LASF3088:
 	.string	"buf_info"
 .LASF409:
 	.string	"d_inode"
@@ -52632,7 +52838,7 @@ __exitcall_ebc_exit:
 	.string	"n_node"
 .LASF1638:
 	.string	"qsize_t"
-.LASF3217:
+.LASF3222:
 	.string	"devm_kzalloc"
 .LASF380:
 	.string	"sequence"
@@ -52648,7 +52854,7 @@ __exitcall_ebc_exit:
 	.string	"s_state"
 .LASF1080:
 	.string	"run_list"
-.LASF3134:
+.LASF3139:
 	.string	"clac_full_data_align8"
 .LASF2567:
 	.string	"SCHED_SOFTIRQ"
@@ -52670,7 +52876,7 @@ __exitcall_ebc_exit:
 	.string	"param_ops_uint"
 .LASF905:
 	.string	"softirq_activated"
-.LASF3049:
+.LASF3051:
 	.string	"pdev"
 .LASF841:
 	.string	"system_long_wq"
@@ -52694,7 +52900,7 @@ __exitcall_ebc_exit:
 	.string	"c_true"
 .LASF1592:
 	.string	"notifier_call"
-.LASF3093:
+.LASF3095:
 	.string	"ebc_exit"
 .LASF1847:
 	.string	"gendisk"
@@ -52722,7 +52928,7 @@ __exitcall_ebc_exit:
 	.string	"size_t"
 .LASF209:
 	.string	"compat_elf_hwcap"
-.LASF3295:
+.LASF3300:
 	.string	"prepare_to_wait_event"
 .LASF1124:
 	.string	"cap_permitted"
@@ -52764,7 +52970,7 @@ __exitcall_ebc_exit:
 	.string	"__reserved"
 .LASF954:
 	.string	"_sigfault"
-.LASF3148:
+.LASF3153:
 	.string	"image_bg"
 .LASF2872:
 	.string	"ebc_buf_status"
@@ -52854,9 +53060,9 @@ __exitcall_ebc_exit:
 	.string	"irqchip_fwnode_ops"
 .LASF1628:
 	.string	"dq_id"
-.LASF3139:
+.LASF3144:
 	.string	"frame_count_tmp"
-.LASF3147:
+.LASF3152:
 	.string	"image_fb"
 .LASF1803:
 	.string	"write_end"
@@ -52864,7 +53070,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ION_HEAP_POOL"
 .LASF1438:
 	.string	"sysctl_protected_hardlinks"
-.LASF3299:
+.LASF3304:
 	.string	"__arch_copy_from_user"
 .LASF1191:
 	.string	"scan_objects"
@@ -52872,7 +53078,7 @@ __exitcall_ebc_exit:
 	.string	"pageset"
 .LASF1252:
 	.string	"wb_err"
-.LASF3191:
+.LASF3196:
 	.string	"copy_to_user"
 .LASF735:
 	.string	"trace_recursion"
@@ -52968,7 +53174,7 @@ __exitcall_ebc_exit:
 	.string	"lgonl"
 .LASF535:
 	.string	"destroy_work"
-.LASF3102:
+.LASF3104:
 	.string	"one_buffer_end"
 .LASF254:
 	.string	"FTR_LOWER_SAFE"
@@ -52984,7 +53190,7 @@ __exitcall_ebc_exit:
 	.string	"pcpu_chosen_fc"
 .LASF391:
 	.string	"dentry_stat_t"
-.LASF3244:
+.LASF3249:
 	.string	"atomic_add"
 .LASF1657:
 	.string	"dqi_bgrace"
@@ -53002,7 +53208,7 @@ __exitcall_ebc_exit:
 	.string	"ctl_table"
 .LASF44:
 	.string	"uid_t"
-.LASF3274:
+.LASF3279:
 	.string	"strstr"
 .LASF2862:
 	.string	"WF_TYPE_A2"
@@ -53064,7 +53270,7 @@ __exitcall_ebc_exit:
 	.string	"pteval_t"
 .LASF430:
 	.string	"i_ino"
-.LASF3317:
+.LASF3323:
 	.string	"might_fault"
 .LASF1576:
 	.string	"compact_cached_free_pfn"
@@ -53154,6 +53360,8 @@ __exitcall_ebc_exit:
 	.string	"seq_operations"
 .LASF638:
 	.string	"stack_canary"
+.LASF3116:
+	.string	"no_black_count"
 .LASF1175:
 	.string	"blksize"
 .LASF642:
@@ -53182,7 +53390,7 @@ __exitcall_ebc_exit:
 	.string	"pidfd_fops"
 .LASF1931:
 	.string	"lm_put_owner"
-.LASF3276:
+.LASF3281:
 	.string	"ebc_pmic_verity_vcom"
 .LASF2538:
 	.string	"set_sda"
@@ -53278,7 +53486,7 @@ __exitcall_ebc_exit:
 	.string	"wake_q_node"
 .LASF1131:
 	.string	"request_key_auth"
-.LASF3030:
+.LASF3032:
 	.string	"waveform_misc"
 .LASF1968:
 	.string	"destroy_inode"
@@ -53290,12 +53498,12 @@ __exitcall_ebc_exit:
 	.string	"sysfs_dev_block_kobj"
 .LASF555:
 	.string	"upid"
-.LASF3306:
+.LASF3311:
 	.string	"down_write"
 .LASF1113:
 	.string	"completion"
-.LASF3100:
-	.string	"old_prev_buf"
+.LASF3043:
+	.string	"__addressable_ebc_init2636"
 .LASF1514:
 	.string	"NR_GPU_HEAP"
 .LASF875:
@@ -53344,7 +53552,7 @@ __exitcall_ebc_exit:
 	.string	"taint_flag"
 .LASF1993:
 	.string	"get_dquots"
-.LASF3285:
+.LASF3290:
 	.string	"of_find_node_by_phandle"
 .LASF2417:
 	.string	"unmap_page"
@@ -53368,7 +53576,7 @@ __exitcall_ebc_exit:
 	.string	"vm_operations_struct"
 .LASF2405:
 	.string	"hwirq_max"
-.LASF3242:
+.LASF3247:
 	.string	"__fswab32"
 .LASF2213:
 	.string	"runtime_idle"
@@ -53398,13 +53606,13 @@ __exitcall_ebc_exit:
 	.string	"RPM_SUSPENDED"
 .LASF698:
 	.string	"reclaim_state"
-.LASF3316:
+.LASF3322:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF138:
 	.string	"vendor_panic_cb"
-.LASF3095:
+.LASF3097:
 	.string	"ebc_vdd_power_timeout"
-.LASF3163:
+.LASF3168:
 	.string	"ebc_get_4pix_wf"
 .LASF2813:
 	.string	"num_symtab"
@@ -53426,7 +53634,7 @@ __exitcall_ebc_exit:
 	.string	"_refcount"
 .LASF466:
 	.string	"i_crypt_info"
-.LASF3080:
+.LASF3082:
 	.string	"waveform_mmap"
 .LASF1886:
 	.string	"flc_flock"
@@ -53434,13 +53642,13 @@ __exitcall_ebc_exit:
 	.string	"module_alloc_base"
 .LASF1766:
 	.string	"core_kallsyms"
-.LASF3279:
+.LASF3284:
 	.string	"memcpy"
 .LASF2909:
 	.string	"EPD_FORCE_FULL"
 .LASF2415:
 	.string	"get_sgtable"
-.LASF3143:
+.LASF3148:
 	.string	"xor_val"
 .LASF2170:
 	.string	"envp_idx"
@@ -53452,11 +53660,11 @@ __exitcall_ebc_exit:
 	.string	"OOM_KILL"
 .LASF445:
 	.string	"i_hash"
-.LASF3126:
+.LASF3131:
 	.string	"gray_old"
 .LASF68:
 	.string	"hlist_node"
-.LASF3288:
+.LASF3293:
 	.string	"sprintf"
 .LASF1923:
 	.string	"fl_ops"
@@ -53468,7 +53676,7 @@ __exitcall_ebc_exit:
 	.string	"WQ_MEM_RECLAIM"
 .LASF2688:
 	.string	"COMPACTISOLATED"
-.LASF3255:
+.LASF3260:
 	.string	"of_property_read_variable_u32_array"
 .LASF328:
 	.string	"__inittext_begin"
@@ -53504,7 +53712,7 @@ __exitcall_ebc_exit:
 	.string	"DOMAIN_BUS_WAKEUP"
 .LASF1237:
 	.string	"arm64_el2_vector_last_slot"
-.LASF3311:
+.LASF3317:
 	.string	"queue_work_on"
 .LASF2350:
 	.string	"online"
@@ -53512,11 +53720,11 @@ __exitcall_ebc_exit:
 	.string	"runtime_resume"
 .LASF1222:
 	.string	"dup_xol_work"
-.LASF3184:
+.LASF3189:
 	.string	"ebc_pmic_read_temp"
 .LASF2890:
 	.string	"EPD_FULL_GC16"
-.LASF3036:
+.LASF3038:
 	.string	"dev_attr_ebc_state"
 .LASF2176:
 	.string	"kernel_kobj"
@@ -53606,7 +53814,7 @@ __exitcall_ebc_exit:
 	.string	"f_mode"
 .LASF1444:
 	.string	"ki_complete"
-.LASF3052:
+.LASF3054:
 	.string	"ebc_tcon_pdev"
 .LASF1770:
 	.string	"percpu"
@@ -53626,7 +53834,7 @@ __exitcall_ebc_exit:
 	.string	"driver"
 .LASF1559:
 	.string	"ZONE_NORMAL"
-.LASF3149:
+.LASF3154:
 	.string	"image_new_data"
 .LASF426:
 	.string	"i_op"
@@ -53680,7 +53888,7 @@ __exitcall_ebc_exit:
 	.string	"huge_fault"
 .LASF2023:
 	.string	"kstatfs"
-.LASF3187:
+.LASF3192:
 	.string	"ebc_pmic_power_off"
 .LASF2649:
 	.string	"PGPGOUTCLEAN"
@@ -53698,7 +53906,7 @@ __exitcall_ebc_exit:
 	.string	"i_dentry"
 .LASF2143:
 	.string	"grab_current_ns"
-.LASF3067:
+.LASF3069:
 	.string	"fb_size"
 .LASF898:
 	.string	"offset"
@@ -53708,7 +53916,7 @@ __exitcall_ebc_exit:
 	.string	"fsnotify_mark_connector"
 .LASF956:
 	.string	"_sigsys"
-.LASF3113:
+.LASF3118:
 	.string	"ebc_lut_update"
 .LASF1936:
 	.string	"lm_setup"
@@ -53752,7 +53960,7 @@ __exitcall_ebc_exit:
 	.string	"get_next_id"
 .LASF238:
 	.string	"rwlock_t"
-.LASF3315:
+.LASF3321:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
 .LASF855:
 	.string	"pgprot"
@@ -53780,7 +53988,7 @@ __exitcall_ebc_exit:
 	.string	"__icache_flags"
 .LASF148:
 	.string	"crash_kexec_post_notifiers"
-.LASF3172:
+.LASF3177:
 	.string	"eink_mode"
 .LASF1712:
 	.string	"rt_spc_warnlimit"
@@ -53802,7 +54010,7 @@ __exitcall_ebc_exit:
 	.string	"_pid"
 .LASF1171:
 	.string	"init_stack"
-.LASF3155:
+.LASF3160:
 	.string	"dmask"
 .LASF1240:
 	.string	"address_space"
@@ -53822,7 +54030,7 @@ __exitcall_ebc_exit:
 	.string	"i_wb"
 .LASF2101:
 	.string	"idr_next"
-.LASF3140:
+.LASF3145:
 	.string	"frame_count_data"
 .LASF2972:
 	.string	"frame_start"
@@ -53872,7 +54080,7 @@ __exitcall_ebc_exit:
 	.string	"normal_prio"
 .LASF1303:
 	.string	"f_ep_links"
-.LASF3153:
+.LASF3158:
 	.string	"image_fb_tmp"
 .LASF2309:
 	.string	"last_busy"
@@ -53884,7 +54092,7 @@ __exitcall_ebc_exit:
 	.string	"host"
 .LASF185:
 	.string	"uaddr"
-.LASF3307:
+.LASF3312:
 	.string	"ebc_remove_from_dsp_buf_list"
 .LASF662:
 	.string	"real_start_time"
@@ -53920,11 +54128,11 @@ __exitcall_ebc_exit:
 	.string	"devres_head"
 .LASF428:
 	.string	"i_mapping"
-.LASF3280:
+.LASF3285:
 	.string	"misc_register"
 .LASF723:
 	.string	"rseq_sig"
-.LASF3206:
+.LASF3211:
 	.string	"platform_set_drvdata"
 .LASF343:
 	.string	"cpu_context"
@@ -53932,7 +54140,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pm_domain"
 .LASF1528:
 	.string	"nr_zones"
-.LASF3228:
+.LASF3233:
 	.string	"is_source"
 .LASF1390:
 	.string	"migrate_mode"
@@ -53954,11 +54162,11 @@ __exitcall_ebc_exit:
 	.string	"d_hash"
 .LASF1090:
 	.string	"dl_bw"
-.LASF3199:
+.LASF3204:
 	.string	"limit"
 .LASF2160:
 	.string	"kobj"
-.LASF3289:
+.LASF3294:
 	.string	"kstrtouint"
 .LASF114:
 	.string	"fsync"
@@ -53968,13 +54176,13 @@ __exitcall_ebc_exit:
 	.string	"i_flags"
 .LASF2907:
 	.string	"EPD_RESUME"
-.LASF3275:
+.LASF3280:
 	.string	"sscanf"
-.LASF3271:
+.LASF3276:
 	.string	"ebc_empty_buf_get"
 .LASF1489:
 	.string	"NR_ISOLATED_ANON"
-.LASF3068:
+.LASF3070:
 	.string	"ebc_lut_table_init"
 .LASF1228:
 	.string	"uprobes_state"
@@ -53984,7 +54192,7 @@ __exitcall_ebc_exit:
 	.string	"rb_node"
 .LASF614:
 	.string	"pushable_tasks"
-.LASF3154:
+.LASF3159:
 	.string	"image_bg_tmp"
 .LASF2217:
 	.string	"platform_data"
@@ -54014,12 +54222,14 @@ __exitcall_ebc_exit:
 	.string	"last_update_time"
 .LASF1152:
 	.string	"robust_list_head"
-.LASF3269:
+.LASF3274:
 	.string	"init_timer_key"
 .LASF1495:
 	.string	"NR_ANON_MAPPED"
 .LASF383:
 	.string	"count"
+.LASF3028:
+	.string	"resume_count_start"
 .LASF557:
 	.string	"level"
 .LASF532:
@@ -54028,7 +54238,7 @@ __exitcall_ebc_exit:
 	.string	"srcversion"
 .LASF873:
 	.string	"pcpu_unit_offsets"
-.LASF3175:
+.LASF3180:
 	.string	"dma_sync_single_for_device"
 .LASF2973:
 	.string	"dsp_end_callback"
@@ -54054,7 +54264,7 @@ __exitcall_ebc_exit:
 	.string	"usage_count"
 .LASF2092:
 	.string	"show"
-.LASF3033:
+.LASF3035:
 	.string	"dev_attr_pmic_temp"
 .LASF7:
 	.string	"unsigned char"
@@ -54086,7 +54296,7 @@ __exitcall_ebc_exit:
 	.string	"uevent_ops"
 .LASF546:
 	.string	"rename_lock"
-.LASF3101:
+.LASF3103:
 	.string	"__out"
 .LASF681:
 	.string	"sas_ss_sp"
@@ -54094,7 +54304,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_INACTIVE_ANON"
 .LASF729:
 	.string	"nr_dirtied"
-.LASF3216:
+.LASF3221:
 	.string	"dev_get_drvdata"
 .LASF2410:
 	.string	"linear_revmap"
@@ -54138,11 +54348,11 @@ __exitcall_ebc_exit:
 	.string	"sysctl_memory_failure_early_kill"
 .LASF2775:
 	.string	"param_ops_bool_enable_only"
-.LASF3160:
+.LASF3165:
 	.string	"power_status"
 .LASF307:
 	.string	"__start_opd"
-.LASF3284:
+.LASF3289:
 	.string	"of_find_i2c_device_by_node"
 .LASF154:
 	.string	"SYSTEM_RUNNING"
@@ -54182,7 +54392,7 @@ __exitcall_ebc_exit:
 	.string	"panel"
 .LASF2447:
 	.string	"irq_data"
-.LASF3108:
+.LASF3110:
 	.string	"old_buffer_temp"
 .LASF2720:
 	.string	"sysctl_memory_failure_recovery"
@@ -54200,7 +54410,7 @@ __exitcall_ebc_exit:
 	.string	"st_shndx"
 .LASF2414:
 	.string	"free"
-.LASF3073:
+.LASF3075:
 	.string	"pmic_vcom_write"
 .LASF2148:
 	.string	"attribute"
@@ -54216,7 +54426,7 @@ __exitcall_ebc_exit:
 	.string	"taint_flags"
 .LASF1362:
 	.string	"membarrier_state"
-.LASF3166:
+.LASF3171:
 	.string	"pre_image_addr"
 .LASF2193:
 	.string	"suspend"
@@ -54270,7 +54480,7 @@ __exitcall_ebc_exit:
 	.string	"path"
 .LASF2742:
 	.string	"st_size"
-.LASF3037:
+.LASF3039:
 	.string	"dev_attr_ebc_buf_state"
 .LASF189:
 	.string	"rmtp"
@@ -54284,6 +54494,8 @@ __exitcall_ebc_exit:
 	.string	"exit_code"
 .LASF1071:
 	.string	"exec_start"
+.LASF3315:
+	.string	"printk"
 .LASF2396:
 	.string	"consumers"
 .LASF2113:
@@ -54308,7 +54520,7 @@ __exitcall_ebc_exit:
 	.string	"unlink"
 .LASF2732:
 	.string	"d_ptr"
-.LASF3075:
+.LASF3077:
 	.string	"pmic_temp_read"
 .LASF1667:
 	.string	"dqstats"
@@ -54330,7 +54542,7 @@ __exitcall_ebc_exit:
 	.string	"mmap_rnd_bits"
 .LASF2476:
 	.string	"of_stdout"
-.LASF3099:
+.LASF3101:
 	.string	"new_prev_buf"
 .LASF991:
 	.string	"vm_ops"
@@ -54346,9 +54558,9 @@ __exitcall_ebc_exit:
 	.string	"timer"
 .LASF2477:
 	.string	"devtree_lock"
-.LASF3157:
+.LASF3162:
 	.string	"refresh_new_image_auto"
-.LASF3089:
+.LASF3091:
 	.string	"__ret"
 .LASF1277:
 	.string	"_zd_pad_1"
@@ -54374,11 +54586,11 @@ __exitcall_ebc_exit:
 	.string	"optimistic_spin_queue"
 .LASF2978:
 	.string	"ebc_buffer_size"
-.LASF3290:
+.LASF3295:
 	.string	"ebc_pmic_set_vcom"
 .LASF2656:
 	.string	"ALLOCSTALL_NORMAL"
-.LASF3130:
+.LASF3135:
 	.string	"data_buf_tmp"
 .LASF326:
 	.string	"__initdata_begin"
@@ -54456,7 +54668,7 @@ __exitcall_ebc_exit:
 	.string	"algo_data"
 .LASF1526:
 	.string	"node_zones"
-.LASF3034:
+.LASF3036:
 	.string	"dev_attr_pmic_vcom"
 .LASF1574:
 	.string	"initialized"
@@ -54546,7 +54758,7 @@ __exitcall_ebc_exit:
 	.string	"seq_show"
 .LASF767:
 	.string	"ate_match_dt"
-.LASF3214:
+.LASF3219:
 	.string	"of_node_put"
 .LASF1375:
 	.string	"cow_page"
@@ -54568,11 +54780,11 @@ __exitcall_ebc_exit:
 	.string	"param_ops_ushort"
 .LASF526:
 	.string	"s_shrink"
-.LASF3138:
+.LASF3143:
 	.string	"gray_new_temp"
 .LASF1540:
 	.string	"kcompactd_classzone_idx"
-.LASF3204:
+.LASF3209:
 	.string	"kmalloc_index"
 .LASF884:
 	.string	"hrtimer_restart"
@@ -54652,7 +54864,7 @@ __exitcall_ebc_exit:
 	.string	"ate_match_local_cap_id"
 .LASF2468:
 	.string	"property"
-.LASF3069:
+.LASF3071:
 	.string	"ebc_sysfs_init"
 .LASF1006:
 	.string	"wchar"
@@ -54682,7 +54894,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_DELAYED_BIT"
 .LASF1053:
 	.string	"nr_failed_migrations_affine"
-.LASF3219:
+.LASF3224:
 	.string	"IS_ERR"
 .LASF876:
 	.string	"PCPU_FC_EMBED"
@@ -54696,7 +54908,7 @@ __exitcall_ebc_exit:
 	.string	"pi_top_task"
 .LASF806:
 	.string	"WORK_NR_COLORS"
-.LASF3158:
+.LASF3163:
 	.string	"refresh_new_image2"
 .LASF528:
 	.string	"s_fsnotify_inode_refs"
@@ -54708,7 +54920,7 @@ __exitcall_ebc_exit:
 	.string	"uprobe"
 .LASF529:
 	.string	"s_readonly_remount"
-.LASF3247:
+.LASF3252:
 	.string	"kasan_check_write"
 .LASF378:
 	.string	"hlist_bl_node"
@@ -54734,7 +54946,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_FLAG_MASK"
 .LASF1286:
 	.string	"units"
-.LASF3262:
+.LASF3267:
 	.string	"epd_lut_from_mem_init"
 .LASF312:
 	.string	"__nosave_begin"
@@ -54754,7 +54966,7 @@ __exitcall_ebc_exit:
 	.string	"user_namespace"
 .LASF2771:
 	.string	"param_ops_ulong"
-.LASF3235:
+.LASF3240:
 	.string	"get_current"
 .LASF232:
 	.string	"raw_spinlock"
@@ -54778,7 +54990,7 @@ __exitcall_ebc_exit:
 	.string	"fault_address"
 .LASF1621:
 	.string	"dq_inuse"
-.LASF3121:
+.LASF3126:
 	.string	"direct_mode_data_change_part"
 .LASF1656:
 	.string	"dqi_flags"
@@ -54786,9 +54998,9 @@ __exitcall_ebc_exit:
 	.string	"PGREFILL"
 .LASF2777:
 	.string	"param_ops_bint"
-.LASF3272:
-	.string	"ebc_add_to_dsp_buf_list"
 .LASF3277:
+	.string	"ebc_add_to_dsp_buf_list"
+.LASF3282:
 	.string	"kfree"
 .LASF1817:
 	.string	"swap_deactivate"
@@ -54800,7 +55012,7 @@ __exitcall_ebc_exit:
 	.string	"WORKINGSET_REFAULT"
 .LASF1655:
 	.string	"dqi_dirty_list"
-.LASF3070:
+.LASF3072:
 	.string	"ebc_buf_state_read"
 .LASF230:
 	.string	"prove_locking"
@@ -54858,7 +55070,7 @@ __exitcall_ebc_exit:
 	.string	"boost_expires"
 .LASF2928:
 	.string	"DMA_BIDIRECTIONAL"
-.LASF3298:
+.LASF3303:
 	.string	"__arch_copy_to_user"
 .LASF236:
 	.string	"spinlock"
@@ -54876,13 +55088,13 @@ __exitcall_ebc_exit:
 	.string	"d_compare"
 .LASF986:
 	.string	"vm_mm"
-.LASF3109:
+.LASF3111:
 	.string	"need_refresh"
 .LASF2835:
 	.string	"platform_bus_type"
-.LASF3122:
+.LASF3127:
 	.string	"data_buf"
-.LASF3061:
+.LASF3063:
 	.string	"ulogo_buf"
 .LASF1652:
 	.string	"mem_dqinfo"
@@ -54900,7 +55112,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_OFFQ_POOL_BITS"
 .LASF1920:
 	.string	"fl_fasync"
-.LASF3169:
+.LASF3174:
 	.string	"update_mode"
 .LASF2955:
 	.string	"direct_mode"
@@ -54972,15 +55184,15 @@ __exitcall_ebc_exit:
 	.string	"page_ext_operations"
 .LASF2678:
 	.string	"KSWAPD_HIGH_WMARK_HIT_QUICKLY"
-.LASF3071:
+.LASF3073:
 	.string	"ebc_state_read"
-.LASF3286:
+.LASF3291:
 	.string	"__stack_chk_fail"
 .LASF2926:
 	.string	"pmic_set_vcom"
 .LASF2714:
 	.string	"stack_guard_gap"
-.LASF3227:
+.LASF3232:
 	.string	"bytes"
 .LASF1753:
 	.string	"gpl_future_crcs"
@@ -55012,7 +55224,7 @@ __exitcall_ebc_exit:
 	.string	"thaw_noirq"
 .LASF984:
 	.string	"vm_rb"
-.LASF3045:
+.LASF3047:
 	.string	"kernel_read_file_str"
 .LASF569:
 	.string	"init_user_ns"
@@ -55056,7 +55268,7 @@ __exitcall_ebc_exit:
 	.string	"cb_state"
 .LASF2938:
 	.string	"orig_nents"
-.LASF3088:
+.LASF3090:
 	.string	"buf_addr"
 .LASF413:
 	.string	"d_sb"
@@ -55084,7 +55296,7 @@ __exitcall_ebc_exit:
 	.string	"i_mtime"
 .LASF2619:
 	.string	"dev_page_fault_t"
-.LASF3116:
+.LASF3121:
 	.string	"ebc_auto_tast_function"
 .LASF24:
 	.string	"__kernel_gid32_t"
@@ -55096,7 +55308,7 @@ __exitcall_ebc_exit:
 	.string	"MODULE_STATE_COMING"
 .LASF2246:
 	.string	"offline_disabled"
-.LASF3212:
+.LASF3217:
 	.string	"of_property_read_u32_array"
 .LASF2491:
 	.string	"select"
@@ -55142,7 +55354,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pagemap"
 .LASF2663:
 	.string	"PGDEACTIVATE"
-.LASF3129:
+.LASF3134:
 	.string	"buffer_old_tmp"
 .LASF1799:
 	.string	"writepages"
@@ -55164,7 +55376,7 @@ __exitcall_ebc_exit:
 	.string	"writeback_control"
 .LASF1919:
 	.string	"fl_end"
-.LASF3301:
+.LASF3306:
 	.string	"ebc_find_buf_by_phy_addr"
 .LASF1966:
 	.string	"super_operations"
@@ -55204,13 +55416,13 @@ __exitcall_ebc_exit:
 	.string	"core"
 .LASF1830:
 	.string	"bd_holders"
-.LASF3119:
+.LASF3124:
 	.string	"reset_and_flip"
 .LASF2966:
 	.string	"enable"
 .LASF970:
 	.string	"pipe_bufs"
-.LASF3232:
+.LASF3237:
 	.string	"to_user"
 .LASF2139:
 	.string	"KOBJ_NS_TYPE_NET"
@@ -55230,7 +55442,7 @@ __exitcall_ebc_exit:
 	.string	"__rb_parent_color"
 .LASF2239:
 	.string	"devres_lock"
-.LASF3156:
+.LASF3161:
 	.string	"new_buffer_refresh"
 .LASF366:
 	.string	"bits"
@@ -55246,9 +55458,9 @@ __exitcall_ebc_exit:
 	.string	"lookup"
 .LASF1605:
 	.string	"cpu_topology"
-.LASF3236:
+.LASF3241:
 	.string	"sp_el0"
-.LASF3305:
+.LASF3310:
 	.string	"ebc_dsp_buf_get"
 .LASF2915:
 	.string	"panel_color"
@@ -55278,7 +55490,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_AUTO"
 .LASF1242:
 	.string	"i_pages"
-.LASF3196:
+.LASF3201:
 	.string	"safe_ptr"
 .LASF377:
 	.string	"hlist_bl_head"
@@ -55308,9 +55520,9 @@ __exitcall_ebc_exit:
 	.string	"unix_inflight"
 .LASF1741:
 	.string	"holders_dir"
-.LASF3090:
+.LASF3092:
 	.string	"__wq_entry"
-.LASF3104:
+.LASF3106:
 	.string	"new_buffer"
 .LASF464:
 	.string	"i_fsnotify_mask"
@@ -55318,7 +55530,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_LOW_WMARK_HIT_QUICKLY"
 .LASF1009:
 	.string	"syscfs"
-.LASF3189:
+.LASF3194:
 	.string	"wake_unlock"
 .LASF2460:
 	.string	"graph_get_port_parent"
@@ -55328,7 +55540,7 @@ __exitcall_ebc_exit:
 	.string	"UNEVICTABLE_PGRESCUED"
 .LASF2224:
 	.string	"msi_list"
-.LASF3238:
+.LASF3243:
 	.string	"__ilog2_u64"
 .LASF548:
 	.string	"compat_time_t"
@@ -55352,7 +55564,7 @@ __exitcall_ebc_exit:
 	.string	"cap_effective"
 .LASF1761:
 	.string	"taints"
-.LASF3257:
+.LASF3262:
 	.string	"of_address_to_resource"
 .LASF1027:
 	.string	"enqueued"
@@ -55380,7 +55592,7 @@ __exitcall_ebc_exit:
 	.string	"bd_private"
 .LASF1918:
 	.string	"fl_start"
-.LASF3211:
+.LASF3216:
 	.string	"out_value"
 .LASF1976:
 	.string	"freeze_fs"
@@ -55388,7 +55600,7 @@ __exitcall_ebc_exit:
 	.string	"sigset_t"
 .LASF1932:
 	.string	"lm_notify"
-.LASF3168:
+.LASF3173:
 	.string	"ebc_tcon_dsp_mode_set"
 .LASF895:
 	.string	"running"
@@ -55414,7 +55626,7 @@ __exitcall_ebc_exit:
 	.string	"d_automount"
 .LASF1280:
 	.string	"page_free"
-.LASF3117:
+.LASF3122:
 	.string	"__val"
 .LASF1496:
 	.string	"NR_FILE_MAPPED"
@@ -55426,13 +55638,13 @@ __exitcall_ebc_exit:
 	.string	"copy_file_range"
 .LASF2700:
 	.string	"UNEVICTABLE_PGCLEARED"
-.LASF3291:
+.LASF3296:
 	.string	"epd_lut_get_wf_version"
 .LASF2062:
 	.string	"key_type"
 .LASF798:
 	.string	"WORK_STRUCT_LINKED_BIT"
-.LASF3229:
+.LASF3234:
 	.string	"copy_overflow"
 .LASF2456:
 	.string	"get_named_child_node"
@@ -55446,9 +55658,9 @@ __exitcall_ebc_exit:
 	.string	"clone_mnt_data"
 .LASF2792:
 	.string	"module_kobject"
-.LASF3066:
+.LASF3068:
 	.string	"memory"
-.LASF3203:
+.LASF3208:
 	.string	"order"
 .LASF740:
 	.string	"active_memcg"
@@ -55462,7 +55674,7 @@ __exitcall_ebc_exit:
 	.string	"refcount"
 .LASF1805:
 	.string	"invalidatepage"
-.LASF3094:
+.LASF3096:
 	.string	"ebc_frame_timeout"
 .LASF364:
 	.string	"wait_queue_head_t"
@@ -55484,7 +55696,7 @@ __exitcall_ebc_exit:
 	.string	"EPD_A2"
 .LASF2117:
 	.string	"kernfs_elem_attr"
-.LASF3107:
+.LASF3109:
 	.string	"new_buffer_temp"
 .LASF2314:
 	.string	"set_latency_tolerance"
@@ -55498,7 +55710,7 @@ __exitcall_ebc_exit:
 	.string	"arm64_ftr_reg_ctrel0"
 .LASF1259:
 	.string	"counters"
-.LASF3248:
+.LASF3253:
 	.string	"kasan_check_read"
 .LASF2074:
 	.string	"name_link"
@@ -55518,7 +55730,7 @@ __exitcall_ebc_exit:
 	.string	"policy"
 .LASF1308:
 	.string	"shared"
-.LASF3039:
+.LASF3041:
 	.string	"ebc_match"
 .LASF2964:
 	.string	"dclk"
@@ -55552,7 +55764,7 @@ __exitcall_ebc_exit:
 	.string	"get_dqblk"
 .LASF829:
 	.string	"WQ_CPU_INTENSIVE"
-.LASF3051:
+.LASF3053:
 	.string	"ebc_tcon_node"
 .LASF2832:
 	.string	"id_entry"
@@ -55562,7 +55774,7 @@ __exitcall_ebc_exit:
 	.string	"nr_irqs"
 .LASF909:
 	.string	"max_hang_time"
-.LASF3192:
+.LASF3197:
 	.string	"copy_from_user"
 .LASF2482:
 	.string	"DOMAIN_BUS_ANY"
@@ -55576,9 +55788,9 @@ __exitcall_ebc_exit:
 	.string	"mmap_miss"
 .LASF1669:
 	.string	"quota_format_ops"
-.LASF3303:
+.LASF3308:
 	.string	"ebc_osd_buf_get"
-.LASF3085:
+.LASF3087:
 	.string	"argp"
 .LASF1769:
 	.string	"args"
@@ -55596,7 +55808,7 @@ __exitcall_ebc_exit:
 	.string	"static_key_initialized"
 .LASF2799:
 	.string	"module_uevent"
-.LASF3098:
+.LASF3100:
 	.string	"is_full_mode"
 .LASF2612:
 	.string	"base_pfn"
@@ -55604,7 +55816,7 @@ __exitcall_ebc_exit:
 	.string	"width"
 .LASF944:
 	.string	"_addr_pkey"
-.LASF3078:
+.LASF3080:
 	.string	"waveform_buffer"
 .LASF297:
 	.string	"__start_rodata"
@@ -55616,17 +55828,17 @@ __exitcall_ebc_exit:
 	.string	"thread_keyring"
 .LASF2760:
 	.string	"kparam_array"
-.LASF3250:
+.LASF3255:
 	.string	"platform_driver_unregister"
 .LASF653:
 	.string	"utime"
 .LASF1349:
 	.string	"start_code"
-.LASF3040:
+.LASF3042:
 	.string	"ebc_driver"
 .LASF2620:
 	.string	"dev_page_free_t"
-.LASF3209:
+.LASF3214:
 	.string	"of_property_read_u32"
 .LASF1413:
 	.string	"guid_t"
@@ -55634,6 +55846,8 @@ __exitcall_ebc_exit:
 	.string	"sysctl_panic_on_stackoverflow"
 .LASF1909:
 	.string	"fl_link"
+.LASF3115:
+	.string	"check_black_percent"
 .LASF2264:
 	.string	"clock_list"
 .LASF1602:
@@ -55646,7 +55860,7 @@ __exitcall_ebc_exit:
 	.string	"tz_minuteswest"
 .LASF2474:
 	.string	"of_chosen"
-.LASF3118:
+.LASF3123:
 	.string	"ebc_frame_start"
 .LASF349:
 	.string	"sve_state"
@@ -55656,7 +55870,7 @@ __exitcall_ebc_exit:
 	.string	"cpumask_t"
 .LASF134:
 	.string	"kmsg_fops"
-.LASF3300:
+.LASF3305:
 	.string	"ebc_buf_release"
 .LASF820:
 	.string	"WORK_STRUCT_NO_POOL"
@@ -55678,7 +55892,7 @@ __exitcall_ebc_exit:
 	.string	"sched_rt_entity"
 .LASF117:
 	.string	"sendpage"
-.LASF3162:
+.LASF3167:
 	.string	"ret_val"
 .LASF881:
 	.string	"timerqueue_node"
@@ -55688,7 +55902,7 @@ __exitcall_ebc_exit:
 	.string	"mem_dqblk"
 .LASF2787:
 	.string	"plt_entry"
-.LASF3170:
+.LASF3175:
 	.string	"display_mode"
 .LASF1995:
 	.string	"nr_cached_objects"
@@ -55720,11 +55934,11 @@ __exitcall_ebc_exit:
 	.string	"fops"
 .LASF1288:
 	.string	"f_path"
-.LASF3264:
+.LASF3269:
 	.string	"kthread_create_on_node"
 .LASF712:
 	.string	"cgroups"
-.LASF3195:
+.LASF3200:
 	.string	"__uaccess_mask_ptr"
 .LASF2359:
 	.string	"probe_type"
@@ -55744,9 +55958,9 @@ __exitcall_ebc_exit:
 	.string	"userspace_clients"
 .LASF2158:
 	.string	"uevent_seqnum"
-.LASF3260:
+.LASF3265:
 	.string	"memset"
-.LASF3167:
+.LASF3172:
 	.string	"cur_image_addr"
 .LASF2159:
 	.string	"list_lock"
@@ -55780,7 +55994,7 @@ __exitcall_ebc_exit:
 	.string	"file_lock_operations"
 .LASF344:
 	.string	"tp_value"
-.LASF3048:
+.LASF3050:
 	.string	"ebc_remove"
 .LASF1908:
 	.string	"fl_list"
@@ -55794,7 +56008,7 @@ __exitcall_ebc_exit:
 	.string	"qf_fmt_id"
 .LASF1065:
 	.string	"nr_wakeups_idle"
-.LASF3308:
+.LASF3313:
 	.string	"up_write"
 .LASF1473:
 	.string	"NR_MLOCK"
@@ -55814,7 +56028,7 @@ __exitcall_ebc_exit:
 	.string	"panel_16bit"
 .LASF1337:
 	.string	"page_table_lock"
-.LASF3038:
+.LASF3040:
 	.string	"ebc_pm"
 .LASF2855:
 	.string	"sched_priority"
@@ -55830,7 +56044,7 @@ __exitcall_ebc_exit:
 	.string	"console_printk"
 .LASF703:
 	.string	"ioac"
-.LASF3222:
+.LASF3227:
 	.string	"__init_work"
 .LASF1186:
 	.string	"nr_to_scan"
@@ -55842,7 +56056,7 @@ __exitcall_ebc_exit:
 	.string	"exec_max"
 .LASF1418:
 	.string	"uuid_index"
-.LASF3223:
+.LASF3228:
 	.string	"onstack"
 .LASF190:
 	.string	"compat_rmtp"
@@ -55854,7 +56068,7 @@ __exitcall_ebc_exit:
 	.string	"nfs_fl"
 .LASF403:
 	.string	"dentry"
-.LASF3240:
+.LASF3245:
 	.string	"__be32_to_cpup"
 .LASF2181:
 	.string	"klist_node"
@@ -55872,7 +56086,7 @@ __exitcall_ebc_exit:
 	.string	"__i_nlink"
 .LASF145:
 	.string	"panic_on_warn"
-.LASF3092:
+.LASF3094:
 	.string	"ebc_panel_probe"
 .LASF80:
 	.string	"boot_command_line"
@@ -55938,13 +56152,13 @@ __exitcall_ebc_exit:
 	.string	"d_rt_space"
 .LASF265:
 	.string	"name"
-.LASF3270:
+.LASF3275:
 	.string	"mod_timer"
 .LASF151:
 	.string	"early_boot_irqs_disabled"
 .LASF659:
 	.string	"nvcsw"
-.LASF3064:
+.LASF3066:
 	.string	"ebc_task_init"
 .LASF2847:
 	.string	"KMALLOC_NORMAL"
@@ -55964,7 +56178,7 @@ __exitcall_ebc_exit:
 	.string	"i_gid"
 .LASF1634:
 	.string	"quota_type"
-.LASF3124:
+.LASF3129:
 	.string	"buffer_old"
 .LASF1551:
 	.string	"high"
@@ -56010,9 +56224,9 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_WRITE_PENDING"
 .LASF1311:
 	.string	"close"
-.LASF3150:
+.LASF3155:
 	.string	"image_fb_data"
-.LASF3062:
+.LASF3064:
 	.string	"klogo_buf"
 .LASF2908:
 	.string	"EPD_POWER_OFF"
@@ -56022,13 +56236,13 @@ __exitcall_ebc_exit:
 	.string	"ebc_wq"
 .LASF737:
 	.string	"memcg_oom_gfp_mask"
-.LASF3225:
+.LASF3230:
 	.string	"_msecs_to_jiffies"
 .LASF1698:
 	.string	"d_spc_timer"
 .LASF1774:
 	.string	"jump_entries"
-.LASF3233:
+.LASF3238:
 	.string	"test_ti_thread_flag"
 .LASF2270:
 	.string	"async_suspend"
@@ -56038,7 +56252,7 @@ __exitcall_ebc_exit:
 	.string	"read_pos"
 .LASF482:
 	.string	"super_block"
-.LASF3197:
+.LASF3202:
 	.string	"__addr"
 .LASF2337:
 	.string	"dma_coherent"
@@ -56076,7 +56290,7 @@ __exitcall_ebc_exit:
 	.string	"map_sg"
 .LASF1174:
 	.string	"nlink"
-.LASF3057:
+.LASF3059:
 	.string	"ulogo_addr_valid"
 .LASF2592:
 	.string	"percpu_ref"
@@ -56084,11 +56298,11 @@ __exitcall_ebc_exit:
 	.string	"devkmsg_log_str"
 .LASF255:
 	.string	"FTR_HIGHER_SAFE"
-.LASF3208:
+.LASF3213:
 	.string	"i2c_get_clientdata"
-.LASF3193:
+.LASF3198:
 	.string	"_copy_to_user"
-.LASF3243:
+.LASF3248:
 	.string	"test_bit"
 .LASF249:
 	.string	"__start___jump_table"
@@ -56104,7 +56318,7 @@ __exitcall_ebc_exit:
 	.string	"mems_allowed_seq"
 .LASF1785:
 	.string	"refcnt"
-.LASF3110:
+.LASF3112:
 	.string	"pbuf_new"
 .LASF2196:
 	.string	"thaw"
@@ -56120,9 +56334,9 @@ __exitcall_ebc_exit:
 	.string	"futex"
 .LASF1040:
 	.string	"wait_max"
-.LASF3268:
+.LASF3273:
 	.string	"wakeup_source_add"
-.LASF3186:
+.LASF3191:
 	.string	"ebc_pmic_suspend"
 .LASF1173:
 	.string	"result_mask"
@@ -56134,15 +56348,15 @@ __exitcall_ebc_exit:
 	.string	"dquot_operations"
 .LASF1239:
 	.string	"mapping"
-.LASF3218:
+.LASF3223:
 	.string	"resource_size"
-.LASF3265:
+.LASF3270:
 	.string	"wake_up_process"
 .LASF1369:
 	.string	"kioctx_table"
 .LASF867:
 	.string	"rb_right"
-.LASF3128:
+.LASF3133:
 	.string	"buffer_new_tmp"
 .LASF993:
 	.string	"vm_file"
@@ -56168,11 +56382,11 @@ __exitcall_ebc_exit:
 	.string	"__initdata_end"
 .LASF2516:
 	.string	"bus_lock"
-.LASF3205:
+.LASF3210:
 	.string	"kmalloc_type"
 .LASF388:
 	.string	"qstr"
-.LASF3127:
+.LASF3132:
 	.string	"gray_new"
 .LASF1107:
 	.string	"futex_state"
@@ -56180,7 +56394,7 @@ __exitcall_ebc_exit:
 	.string	"WORKINGSET_RESTORE"
 .LASF629:
 	.string	"sched_psi_wake_requeue"
-.LASF3226:
+.LASF3231:
 	.string	"check_copy_size"
 .LASF738:
 	.string	"memcg_oom_order"
@@ -56236,7 +56450,7 @@ __exitcall_ebc_exit:
 	.string	"core_state"
 .LASF883:
 	.string	"timerqueue_head"
-.LASF3267:
+.LASF3272:
 	.string	"sched_setscheduler_nocheck"
 .LASF1306:
 	.string	"f_wb_err"
@@ -56244,7 +56458,7 @@ __exitcall_ebc_exit:
 	.string	"rt_mutex"
 .LASF1005:
 	.string	"rchar"
-.LASF3178:
+.LASF3183:
 	.string	"valid_dma_direction"
 .LASF1833:
 	.string	"bd_contains"
@@ -56280,13 +56494,13 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_FLAG_BITS"
 .LASF2463:
 	.string	"fwnode_endpoint"
-.LASF3091:
+.LASF3093:
 	.string	"__int"
 .LASF967:
 	.string	"epoll_watches"
 .LASF2692:
 	.string	"KCOMPACTD_WAKE"
-.LASF3145:
+.LASF3150:
 	.string	"refresh_new_image"
 .LASF2089:
 	.string	"non_rcu"
@@ -56320,7 +56534,7 @@ __exitcall_ebc_exit:
 	.string	"_uid"
 .LASF340:
 	.string	"hbp_break"
-.LASF3053:
+.LASF3055:
 	.string	"pmic_node"
 .LASF139:
 	.string	"panic_blink"
@@ -56360,13 +56574,13 @@ __exitcall_ebc_exit:
 	.string	"need"
 .LASF505:
 	.string	"s_encoding"
-.LASF3221:
+.LASF3226:
 	.string	"queue_work"
 .LASF1749:
 	.string	"gpl_crcs"
 .LASF1735:
 	.string	"get_state"
-.LASF3181:
+.LASF3186:
 	.string	"dma_handle"
 .LASF1374:
 	.string	"orig_pte"
@@ -56384,7 +56598,7 @@ __exitcall_ebc_exit:
 	.string	"__s8"
 .LASF353:
 	.string	"fault_code"
-.LASF3031:
+.LASF3033:
 	.string	"dev_attr_waveform_version"
 .LASF2226:
 	.string	"dma_mask"
@@ -56434,13 +56648,13 @@ __exitcall_ebc_exit:
 	.string	"NR_WRITEBACK_TEMP"
 .LASF2528:
 	.string	"functionality"
-.LASF3132:
+.LASF3137:
 	.string	"clac_part_data_align8"
 .LASF306:
 	.string	"__ctors_end"
 .LASF2281:
 	.string	"wakeup_path"
-.LASF3287:
+.LASF3292:
 	.string	"ebc_buf_state_show"
 .LASF983:
 	.string	"vm_prev"
@@ -56456,7 +56670,7 @@ __exitcall_ebc_exit:
 	.string	"__u8"
 .LASF116:
 	.string	"lock"
-.LASF3185:
+.LASF3190:
 	.string	"ebc_pmic_resume"
 .LASF1577:
 	.string	"compact_cached_migrate_pfn"
@@ -56498,7 +56712,7 @@ __exitcall_ebc_exit:
 	.string	"compact_order_failed"
 .LASF1120:
 	.string	"fsuid"
-.LASF3234:
+.LASF3239:
 	.string	"flag"
 .LASF1490:
 	.string	"NR_ISOLATED_FILE"
@@ -56510,9 +56724,9 @@ __exitcall_ebc_exit:
 	.string	"managed_pages"
 .LASF2604:
 	.string	"__tracepoint_page_ref_set"
-.LASF3174:
+.LASF3179:
 	.string	"ebc_tcon_enable"
-.LASF3314:
+.LASF3320:
 	.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"
@@ -56560,13 +56774,13 @@ __exitcall_ebc_exit:
 	.string	"s_vop"
 .LASF1665:
 	.string	"qf_owner"
-.LASF3249:
+.LASF3254:
 	.string	"__write_once_size"
 .LASF2846:
 	.string	"kmalloc_cache_type"
 .LASF575:
 	.string	"mutex"
-.LASF3213:
+.LASF3218:
 	.string	"out_values"
 .LASF854:
 	.string	"pgd_t"
@@ -56580,7 +56794,7 @@ __exitcall_ebc_exit:
 	.string	"raw_spinlock_t"
 .LASF2953:
 	.string	"vir_width"
-.LASF3237:
+.LASF3242:
 	.string	"INIT_LIST_HEAD"
 .LASF1953:
 	.string	"fs_flags"
@@ -56594,13 +56808,15 @@ __exitcall_ebc_exit:
 	.string	"sigpending"
 .LASF2229:
 	.string	"dma_pfn_offset"
+.LASF3027:
+	.string	"resume_frame_count"
 .LASF1204:
 	.string	"radix_tree_node"
-.LASF3239:
+.LASF3244:
 	.string	"sign_extend64"
 .LASF2328:
 	.string	"wake_irq"
-.LASF3055:
+.LASF3057:
 	.string	"ulogo_addr"
 .LASF874:
 	.string	"pcpu_fc"
@@ -56618,7 +56834,7 @@ __exitcall_ebc_exit:
 	.string	"ptraced"
 .LASF2766:
 	.string	"param_ops_short"
-.LASF3282:
+.LASF3287:
 	.string	"of_find_device_by_node"
 .LASF2568:
 	.string	"HRTIMER_SOFTIRQ"
@@ -56638,13 +56854,13 @@ __exitcall_ebc_exit:
 	.string	"d_lockref"
 .LASF2257:
 	.string	"rpm_request"
-.LASF3084:
+.LASF3086:
 	.string	"ebc_io_ctl"
 .LASF1164:
 	.string	"addr"
 .LASF2400:
 	.string	"device_private"
-.LASF3176:
+.LASF3181:
 	.string	"get_dma_ops"
 .LASF2712:
 	.string	"watermark_scale_factor"
@@ -56660,7 +56876,7 @@ __exitcall_ebc_exit:
 	.string	"mkobj"
 .LASF2980:
 	.string	"direct_buf_real_size"
-.LASF3304:
+.LASF3309:
 	.string	"__pm_relax"
 .LASF473:
 	.string	"d_delete"
@@ -56672,7 +56888,7 @@ __exitcall_ebc_exit:
 	.string	"sh_link"
 .LASF836:
 	.string	"WQ_MAX_ACTIVE"
-.LASF3046:
+.LASF3048:
 	.string	"ebc_suspend"
 .LASF2372:
 	.string	"cls_msk"
@@ -56694,7 +56910,7 @@ __exitcall_ebc_exit:
 	.string	"num_resources"
 .LASF1590:
 	.string	"notifier_fn_t"
-.LASF3054:
+.LASF3056:
 	.string	"pmic_client"
 .LASF2586:
 	.string	"miscdevice"
@@ -56702,13 +56918,13 @@ __exitcall_ebc_exit:
 	.string	"WQ_POWER_EFFICIENT"
 .LASF656:
 	.string	"time_in_state"
-.LASF3063:
+.LASF3065:
 	.string	"ebc_logo_init"
 .LASF1283:
 	.string	"kill"
 .LASF1044:
 	.string	"iowait_sum"
-.LASF3146:
+.LASF3151:
 	.string	"image_new"
 .LASF15:
 	.string	"__u64"
@@ -56738,9 +56954,9 @@ __exitcall_ebc_exit:
 	.string	"frame_timer"
 .LASF1047:
 	.string	"sum_sleep_runtime"
-.LASF3059:
+.LASF3061:
 	.string	"ulogo_addr_str"
-.LASF3120:
+.LASF3125:
 	.string	"flip"
 .LASF1093:
 	.string	"deadline"
@@ -56784,11 +57000,11 @@ __exitcall_ebc_exit:
 	.string	"read_dqblk"
 .LASF1630:
 	.string	"dq_flags"
-.LASF3123:
+.LASF3128:
 	.string	"buffer_new"
 .LASF213:
 	.string	"user_fpsimd_state"
-.LASF3281:
+.LASF3286:
 	.string	"device_create_file"
 .LASF521:
 	.string	"s_time_gran"
@@ -56812,11 +57028,11 @@ __exitcall_ebc_exit:
 	.string	"s_bdi"
 .LASF2871:
 	.string	"wf_table"
-.LASF3152:
+.LASF3157:
 	.string	"image_new_tmp"
 .LASF1746:
 	.string	"num_kp"
-.LASF3313:
+.LASF3319:
 	.string	"__pm_stay_awake"
 .LASF2579:
 	.string	"vmap_area_list"
@@ -56984,11 +57200,11 @@ __exitcall_ebc_exit:
 	.string	"groups"
 .LASF694:
 	.string	"pi_blocked_on"
-.LASF3050:
+.LASF3052:
 	.string	"ebc_probe"
 .LASF501:
 	.string	"s_xattr"
-.LASF3060:
+.LASF3062:
 	.string	"klogo_addr_str"
 .LASF1007:
 	.string	"syscr"
@@ -57022,7 +57238,7 @@ __exitcall_ebc_exit:
 	.string	"s_inode_list_lock"
 .LASF2614:
 	.string	"align"
-.LASF3131:
+.LASF3136:
 	.string	"frame_idx"
 .LASF204:
 	.string	"mm_segment_t"
@@ -57044,7 +57260,7 @@ __exitcall_ebc_exit:
 	.string	"maj_flt"
 .LASF229:
 	.string	"arch_rwlock_t"
-.LASF3302:
+.LASF3307:
 	.string	"ebc_osd_buf_clone"
 .LASF162:
 	.string	"c_false"
@@ -57070,7 +57286,7 @@ __exitcall_ebc_exit:
 	.string	"minor"
 .LASF1713:
 	.string	"nextents"
-.LASF3179:
+.LASF3184:
 	.string	"dma_direction"
 .LASF1:
 	.string	"sizetype"
@@ -57080,13 +57296,13 @@ __exitcall_ebc_exit:
 	.string	"arg_lock"
 .LASF1755:
 	.string	"num_exentries"
-.LASF3112:
+.LASF3114:
 	.string	"check_out"
 .LASF2623:
 	.string	"high_memory"
 .LASF49:
 	.string	"int32_t"
-.LASF3042:
+.LASF3044:
 	.string	"__exitcall_ebc_exit"
 .LASF1054:
 	.string	"nr_failed_migrations_running"
@@ -57094,7 +57310,7 @@ __exitcall_ebc_exit:
 	.string	"next_timer"
 .LASF741:
 	.string	"throttle_queue"
-.LASF3297:
+.LASF3302:
 	.string	"finish_wait"
 .LASF1494:
 	.string	"WORKINGSET_NODERECLAIM"
@@ -57106,7 +57322,7 @@ __exitcall_ebc_exit:
 	.string	"keyring_index_key"
 .LASF833:
 	.string	"__WQ_ORDERED"
-.LASF3173:
+.LASF3178:
 	.string	"ebc_tcon_disable"
 .LASF1435:
 	.string	"leases_enable"
@@ -57130,7 +57346,7 @@ __exitcall_ebc_exit:
 	.string	"lock_key"
 .LASF2577:
 	.string	"tramp_pg_dir"
-.LASF3035:
+.LASF3037:
 	.string	"dev_attr_ebc_version"
 .LASF878:
 	.string	"PCPU_FC_NR"
@@ -57148,7 +57364,7 @@ __exitcall_ebc_exit:
 	.string	"num_vf"
 .LASF1549:
 	.string	"isolate_mode_t"
-.LASF3180:
+.LASF3185:
 	.string	"debug_dma_sync_single_for_device"
 .LASF99:
 	.string	"llseek"
@@ -57190,9 +57406,9 @@ __exitcall_ebc_exit:
 	.string	"target"
 .LASF2560:
 	.string	"HI_SOFTIRQ"
-.LASF3182:
+.LASF3187:
 	.string	"direction"
-.LASF3151:
+.LASF3156:
 	.string	"image_bg_data"
 .LASF972:
 	.string	"session_keyring"
@@ -57202,7 +57418,7 @@ __exitcall_ebc_exit:
 	.string	"key_restrict_link_func_t"
 .LASF1499:
 	.string	"NR_WRITEBACK"
-.LASF3137:
+.LASF3142:
 	.string	"frame_count"
 .LASF487:
 	.string	"s_maxbytes"
@@ -57216,7 +57432,7 @@ __exitcall_ebc_exit:
 	.string	"i2c_bus_type"
 .LASF899:
 	.string	"hrtimer_cpu_base"
-.LASF3309:
+.LASF3314:
 	.string	"ebc_notify"
 .LASF1405:
 	.string	"cb_head"
@@ -57244,7 +57460,7 @@ __exitcall_ebc_exit:
 	.string	"cpus_requested"
 .LASF2608:
 	.string	"__tracepoint_page_ref_mod_unless"
-.LASF3190:
+.LASF3195:
 	.string	"wake_lock_init"
 .LASF1200:
 	.string	"list_lru"
@@ -57260,7 +57476,7 @@ __exitcall_ebc_exit:
 	.string	"robust_list"
 .LASF1729:
 	.string	"quota_disable"
-.LASF3079:
+.LASF3081:
 	.string	"waveform_open"
 .LASF2070:
 	.string	"serial_node"
@@ -57270,7 +57486,7 @@ __exitcall_ebc_exit:
 	.string	"d_iput"
 .LASF108:
 	.string	"compat_ioctl"
-.LASF3198:
+.LASF3203:
 	.string	"__range_ok"
 .LASF287:
 	.string	"__start_ro_after_init"
@@ -57278,7 +57494,7 @@ __exitcall_ebc_exit:
 	.string	"num_poisoned_pages"
 .LASF919:
 	.string	"filter"
-.LASF3183:
+.LASF3188:
 	.string	"ebc_pmic_get_vcom"
 .LASF2961:
 	.string	"ebc_tcon"
@@ -57378,7 +57594,7 @@ __exitcall_ebc_exit:
 	.string	"__MAX_NR_ZONES"
 .LASF2478:
 	.string	"irq_fwspec"
-.LASF3029:
+.LASF3031:
 	.string	"waveform_ops"
 .LASF1819:
 	.string	"iov_iter"
@@ -57390,11 +57606,11 @@ __exitcall_ebc_exit:
 	.string	"power"
 .LASF266:
 	.string	"strict_mask"
-.LASF3296:
+.LASF3301:
 	.string	"init_wait_entry"
 .LASF2801:
 	.string	"module_state"
-.LASF3252:
+.LASF3257:
 	.string	"_dev_info"
 .LASF417:
 	.string	"d_subdirs"
@@ -57440,15 +57656,15 @@ __exitcall_ebc_exit:
 	.string	"removed_mem"
 .LASF248:
 	.string	"jump_label_t"
-.LASF3283:
+.LASF3288:
 	.string	"of_get_property"
-.LASF3164:
+.LASF3169:
 	.string	"ebc_tcon_frame_start"
 .LASF2726:
 	.string	"Elf64_Half"
 .LASF2301:
 	.string	"use_autosuspend"
-.LASF3043:
+.LASF3045:
 	.string	"ebc_init"
 .LASF675:
 	.string	"nsproxy"
@@ -57456,7 +57672,7 @@ __exitcall_ebc_exit:
 	.string	"can_wakeup"
 .LASF2561:
 	.string	"TIMER_SOFTIRQ"
-.LASF3142:
+.LASF3147:
 	.string	"temp_data"
 .LASF1229:
 	.string	"xol_area"
@@ -57482,11 +57698,11 @@ __exitcall_ebc_exit:
 	.string	"init_on_free"
 .LASF1166:
 	.string	"nr_pages"
-.LASF3159:
+.LASF3164:
 	.string	"ebc_power_set"
 .LASF1776:
 	.string	"num_trace_bprintk_fmt"
-.LASF3246:
+.LASF3251:
 	.string	"__fls"
 .LASF1144:
 	.string	"ioprio"
@@ -57512,9 +57728,9 @@ __exitcall_ebc_exit:
 	.string	"persistent_clock_is_local"
 .LASF2428:
 	.string	"dma_supported"
-.LASF3215:
+.LASF3220:
 	.string	"dev_set_drvdata"
-.LASF3310:
+.LASF3316:
 	.string	"epd_lut_get"
 .LASF1550:
 	.string	"per_cpu_pages"
@@ -57550,7 +57766,7 @@ __exitcall_ebc_exit:
 	.string	"BLOCK_SOFTIRQ"
 .LASF1426:
 	.string	"files_stat_struct"
-.LASF3258:
+.LASF3263:
 	.string	"devm_memremap"
 .LASF858:
 	.string	"pgtable_t"
@@ -57562,7 +57778,7 @@ __exitcall_ebc_exit:
 	.string	"symlink"
 .LASF1589:
 	.string	"mem_map"
-.LASF3105:
+.LASF3107:
 	.string	"old_buffer"
 .LASF2971:
 	.string	"lut_data_set"
@@ -57578,7 +57794,7 @@ __exitcall_ebc_exit:
 	.string	"WAKE_LOCK_SUSPEND"
 .LASF1792:
 	.string	"WRITE_LIFE_SHORT"
-.LASF3241:
+.LASF3246:
 	.string	"__swab32p"
 .LASF286:
 	.string	"_einittext"
@@ -57620,7 +57836,7 @@ __exitcall_ebc_exit:
 	.string	"rm_xquota"
 .LASF1099:
 	.string	"dl_timer"
-.LASF3292:
+.LASF3297:
 	.string	"remap_pfn_range"
 .LASF2390:
 	.string	"DL_DEV_NO_DRIVER"
@@ -57634,7 +57850,7 @@ __exitcall_ebc_exit:
 	.string	"watermark"
 .LASF2438:
 	.string	"deadprops"
-.LASF3254:
+.LASF3259:
 	.string	"devm_kmalloc"
 .LASF16:
 	.string	"long long unsigned int"
@@ -57710,7 +57926,7 @@ __exitcall_ebc_exit:
 	.string	"pstate_check_t"
 .LASF845:
 	.string	"system_freezable_power_efficient_wq"
-.LASF3047:
+.LASF3049:
 	.string	"__func__"
 .LASF57:
 	.string	"resource_size_t"
@@ -57764,13 +57980,13 @@ __exitcall_ebc_exit:
 	.string	"page_entry_size"
 .LASF2994:
 	.string	"lut_data"
-.LASF3081:
+.LASF3083:
 	.string	"ebc_other_init"
 .LASF1461:
 	.string	"free_list"
 .LASF590:
 	.string	"prio"
-.LASF3207:
+.LASF3212:
 	.string	"platform_get_drvdata"
 .LASF2570:
 	.string	"NR_SOFTIRQS"
@@ -57792,7 +58008,7 @@ __exitcall_ebc_exit:
 	.string	"atomic_t"
 .LASF813:
 	.string	"WORK_OFFQ_FLAG_BITS"
-.LASF3165:
+.LASF3170:
 	.string	"ebc_tcon_image_addr_set"
 .LASF2546:
 	.string	"max_num_msgs"
@@ -57812,7 +58028,7 @@ __exitcall_ebc_exit:
 	.string	"scatterlist"
 .LASF1282:
 	.string	"altmap_valid"
-.LASF3312:
+.LASF3318:
 	.string	"down"
 .LASF102:
 	.string	"read_iter"
@@ -57850,7 +58066,7 @@ __exitcall_ebc_exit:
 	.string	"pm_domain_data"
 .LASF2502:
 	.string	"byte"
-.LASF3278:
+.LASF3283:
 	.string	"__wake_up_sync"
 .LASF2017:
 	.string	"poll_table_struct"
@@ -57876,7 +58092,7 @@ __exitcall_ebc_exit:
 	.string	"page_fault"
 .LASF1484:
 	.string	"NR_INACTIVE_FILE"
-.LASF3230:
+.LASF3235:
 	.string	"__ret_warn_on"
 .LASF1640:
 	.string	"kqid"
@@ -57948,6 +58164,8 @@ __exitcall_ebc_exit:
 	.string	"shift"
 .LASF1452:
 	.string	"ia_gid"
+.LASF3117:
+	.string	"vaild_size"
 .LASF36:
 	.string	"name_offset"
 .LASF2149:
@@ -57956,7 +58174,7 @@ __exitcall_ebc_exit:
 	.string	"__irqentry_text_end"
 .LASF1361:
 	.string	"context"
-.LASF3136:
+.LASF3141:
 	.string	"get_overlay_image"
 .LASF1555:
 	.string	"per_cpu_nodestat"
@@ -57968,7 +58186,7 @@ __exitcall_ebc_exit:
 	.string	"thread_id"
 .LASF733:
 	.string	"default_timer_slack_ns"
-.LASF3077:
+.LASF3079:
 	.string	"waveform_version_read"
 .LASF1782:
 	.string	"source_list"
@@ -57998,7 +58216,7 @@ __exitcall_ebc_exit:
 	.string	"of_match_table"
 .LASF2593:
 	.string	"percpu_count_ptr"
-.LASF3293:
+.LASF3298:
 	.string	"ebc_phy_buf_base_get"
 .LASF2094:
 	.string	"loops_per_jiffy"
@@ -58020,7 +58238,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_INODESTEAL"
 .LASF1190:
 	.string	"count_objects"
-.LASF3245:
+.LASF3250:
 	.string	"fls64"
 .LASF936:
 	.string	"_stime"
@@ -58040,7 +58258,7 @@ __exitcall_ebc_exit:
 	.string	"statistics"
 .LASF2952:
 	.string	"current_buffer"
-.LASF3133:
+.LASF3138:
 	.string	"direct_mode_data_change"
 .LASF1633:
 	.string	"kprojid_t"
@@ -58056,11 +58274,11 @@ __exitcall_ebc_exit:
 	.string	"sync_sg_for_device"
 .LASF1979:
 	.string	"statfs"
-.LASF3273:
+.LASF3278:
 	.string	"__kmalloc"
-.LASF3261:
+.LASF3266:
 	.string	"_dev_err"
-.LASF3251:
+.LASF3256:
 	.string	"__platform_driver_register"
 .LASF2979:
 	.string	"ebc_buf_real_size"
@@ -58086,6 +58304,8 @@ __exitcall_ebc_exit:
 	.string	"kgid_t"
 .LASF583:
 	.string	"on_cpu"
+.LASF3102:
+	.string	"old_prev_buf"
 .LASF2146:
 	.string	"drop_ns"
 .LASF1437:
@@ -58114,7 +58334,7 @@ __exitcall_ebc_exit:
 	.string	"max_comb_1st_msg_len"
 .LASF1560:
 	.string	"ZONE_MOVABLE"
-.LASF3028:
+.LASF3030:
 	.string	"ebc_misc"
 .LASF2407:
 	.string	"revmap_size"
@@ -58146,7 +58366,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_PENDING_BIT"
 .LASF721:
 	.string	"rseq"
-.LASF3144:
+.LASF3149:
 	.string	"get_auto_image"
 .LASF196:
 	.string	"nfds"
@@ -58160,7 +58380,7 @@ __exitcall_ebc_exit:
 	.string	"i_acl"
 .LASF1804:
 	.string	"bmap"
-.LASF3259:
+.LASF3264:
 	.string	"ebc_buf_init"
 .LASF2063:
 	.string	"key_payload"
@@ -58170,7 +58390,7 @@ __exitcall_ebc_exit:
 	.string	"d_real"
 .LASF2575:
 	.string	"swapper_pg_end"
-.LASF3032:
+.LASF3034:
 	.string	"dev_attr_pmic_name"
 .LASF632:
 	.string	"in_user_fault"
@@ -58200,7 +58420,7 @@ __exitcall_ebc_exit:
 	.string	"fallocate"
 .LASF1722:
 	.string	"i_spc_warnlimit"
-.LASF3231:
+.LASF3236:
 	.string	"check_object_size"
 .LASF1530:
 	.string	"node_present_pages"
@@ -58250,7 +58470,7 @@ __exitcall_ebc_exit:
 	.string	"__idmap_text_start"
 .LASF1731:
 	.string	"set_info"
-.LASF3083:
+.LASF3085:
 	.string	"ebc_mmap"
 .LASF2634:
 	.string	"sysctl_admin_reserve_kbytes"
@@ -58262,9 +58482,9 @@ __exitcall_ebc_exit:
 	.string	"lock_ops"
 .LASF1341:
 	.string	"hiwater_vm"
-.LASF3074:
+.LASF3076:
 	.string	"pmic_vcom_read"
-.LASF3253:
+.LASF3258:
 	.string	"misc_deregister"
 .LASF1263:
 	.string	"compound_head"
@@ -58284,7 +58504,7 @@ __exitcall_ebc_exit:
 	.string	"bd_write_holder"
 .LASF2209:
 	.string	"poweroff_noirq"
-.LASF3256:
+.LASF3261:
 	.string	"of_parse_phandle"
 .LASF1873:
 	.string	"rename"
@@ -58304,9 +58524,9 @@ __exitcall_ebc_exit:
 	.string	"i_rt_spc_timelimit"
 .LASF140:
 	.string	"oops_in_progress"
-.LASF3027:
+.LASF3029:
 	.string	"ebc_ops"
-.LASF3056:
+.LASF3058:
 	.string	"klogo_addr"
 .LASF1666:
 	.string	"qf_next"
@@ -58314,14 +58534,12 @@ __exitcall_ebc_exit:
 	.string	"sync_single_for_cpu"
 .LASF794:
 	.string	"data"
-.LASF3200:
+.LASF3205:
 	.string	"kzalloc"
-.LASF3224:
+.LASF3229:
 	.string	"msecs_to_jiffies"
 .LASF1934:
 	.string	"lm_break"
-.LASF3041:
-	.string	"__addressable_ebc_init2595"
 .LASF1234:
 	.string	"hyp_vectors_slot"
 .LASF1254:
@@ -58332,7 +58550,7 @@ __exitcall_ebc_exit:
 	.string	"personality"
 .LASF1840:
 	.string	"bd_queue"
-.LASF3044:
+.LASF3046:
 	.string	"ebc_resume"
 .LASF2844:
 	.string	"init_task"
@@ -58354,7 +58572,7 @@ __exitcall_ebc_exit:
 	.string	"signed char"
 .LASF376:
 	.string	"rcu_scheduler_active"
-.LASF3210:
+.LASF3215:
 	.string	"propname"
 .LASF2116:
 	.string	"priv"
@@ -58434,7 +58652,7 @@ __exitcall_ebc_exit:
 	.string	"sve_vl"
 .LASF2669:
 	.string	"PGSTEAL_KSWAPD"
-.LASF3058:
+.LASF3060:
 	.string	"klogo_addr_valid"
 .LASF2617:
 	.string	"MEMORY_DEVICE_PUBLIC"
@@ -58470,7 +58688,7 @@ __exitcall_ebc_exit:
 	.string	"WQ_MAX_UNBOUND_PER_CPU"
 .LASF1552:
 	.string	"per_cpu_pageset"
-.LASF3266:
+.LASF3271:
 	.string	"__alloc_workqueue_key"
 .LASF760:
 	.string	"status"
@@ -58484,7 +58702,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_GCC16"
 .LASF2529:
 	.string	"i2c_lock_operations"
-.LASF3161:
+.LASF3166:
 	.string	"ebc_get_4pix_wf_part"
 .LASF1635:
 	.string	"USRQUOTA"
@@ -58530,9 +58748,9 @@ __exitcall_ebc_exit:
 	.string	"f_inode"
 .LASF2046:
 	.string	"procname"
-.LASF3141:
+.LASF3146:
 	.string	"point_data"
-.LASF3263:
+.LASF3268:
 	.string	"epd_lut_from_file_init"
 .LASF1684:
 	.string	"mark_dirty"
@@ -58556,15 +58774,15 @@ __exitcall_ebc_exit:
 	.string	"__kernel_clockid_t"
 .LASF686:
 	.string	"seccomp"
-.LASF3096:
+.LASF3098:
 	.string	"ebc_rst_panel"
 .LASF1806:
 	.string	"releasepage"
 .LASF1717:
 	.string	"qc_info"
-.LASF3097:
+.LASF3099:
 	.string	"ebc_thread"
-.LASF3111:
+.LASF3113:
 	.string	"pbuf_old"
 .LASF2904:
 	.string	"EPD_A2_ENTER"
@@ -58582,7 +58800,7 @@ __exitcall_ebc_exit:
 	.string	"win_y1"
 .LASF2886:
 	.string	"win_y2"
-.LASF3106:
+.LASF3108:
 	.string	"buf_size"
 .LASF2103:
 	.string	"bitmap"
@@ -58622,7 +58840,7 @@ __exitcall_ebc_exit:
 	.string	"MIGRATE_SYNC_LIGHT"
 .LASF1052:
 	.string	"nr_migrations_cold"
-.LASF3072:
+.LASF3074:
 	.string	"ebc_version_read"
 .LASF304:
 	.string	"__end_once"
@@ -58686,7 +58904,7 @@ __exitcall_ebc_exit:
 	.string	"percpu_size"
 .LASF1338:
 	.string	"mmap_sem"
-.LASF3294:
+.LASF3299:
 	.string	"schedule"
 .LASF2457:
 	.string	"get_reference_args"
@@ -58772,7 +58990,7 @@ __exitcall_ebc_exit:
 	.string	"lock_stat"
 .LASF2409:
 	.string	"revmap_tree_mutex"
-.LASF3076:
+.LASF3078:
 	.string	"pmic_name_read"
 .LASF1094:
 	.string	"dl_throttled"
@@ -58792,7 +59010,7 @@ __exitcall_ebc_exit:
 	.string	"restore_noirq"
 .LASF1442:
 	.string	"ki_filp"
-.LASF3135:
+.LASF3140:
 	.string	"clac_full_data_align16"
 .LASF1127:
 	.string	"cap_ambient"
@@ -58800,7 +59018,7 @@ __exitcall_ebc_exit:
 	.string	"dma_configure"
 .LASF2307:
 	.string	"runtime_error"
-.LASF3087:
+.LASF3089:
 	.string	"temp_offset"
 .LASF964:
 	.string	"__count"
@@ -58814,7 +59032,7 @@ __exitcall_ebc_exit:
 	.string	"PROBE_DEFAULT_STRATEGY"
 .LASF2761:
 	.string	"elemsize"
-.LASF3125:
+.LASF3130:
 	.string	"clac_part_data_align16"
 .LASF906:
 	.string	"nr_events"
@@ -58842,7 +59060,7 @@ __exitcall_ebc_exit:
 	.string	"uid_keyring"
 .LASF726:
 	.string	"splice_pipe"
-.LASF3115:
+.LASF3120:
 	.string	"frame_done_callback"
 .LASF1815:
 	.string	"error_remove_page"
@@ -58888,7 +59106,7 @@ __exitcall_ebc_exit:
 	.string	"compound_mapcount"
 .LASF1464:
 	.string	"zone_stat_item"
-.LASF3202:
+.LASF3207:
 	.string	"kmalloc_large"
 .LASF2641:
 	.string	"PE_SIZE_PMD"
@@ -58926,7 +59144,7 @@ __exitcall_ebc_exit:
 	.string	"gp_count"
 .LASF2066:
 	.string	"key_restriction"
-.LASF3103:
+.LASF3105:
 	.string	"check_part_mode"
 .LASF619:
 	.string	"exit_state"
@@ -58958,9 +59176,9 @@ __exitcall_ebc_exit:
 	.string	"fs_supers"
 .LASF1146:
 	.string	"last_waited"
-.LASF3082:
+.LASF3084:
 	.string	"ebc_open"
-.LASF3171:
+.LASF3176:
 	.string	"three_win_mode"
 .LASF2889:
 	.string	"EPD_OVERLAY"
@@ -59012,7 +59230,7 @@ __exitcall_ebc_exit:
 	.string	"timer_expires"
 .LASF2842:
 	.string	"mmlist_lock"
-.LASF3188:
+.LASF3193:
 	.string	"ebc_pmic_power_on"
 .LASF1780:
 	.string	"trace_evals"
@@ -59056,7 +59274,7 @@ __exitcall_ebc_exit:
 	.string	"relax_count"
 .LASF1428:
 	.string	"nr_free_files"
-.LASF3201:
+.LASF3206:
 	.string	"kmalloc"
 	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
 	.section	.note.GNU-stack,"",@progbits

commit a513b1ef96dcd295f77365400c8574d930c7662e
Merge: 45c480b553c9 fd8250304dd5
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Fri Nov 12 15:01:45 2021 +0100

    Merge 4.19.217 into android-4.19-stable
    
    Changes in 4.19.217
            Revert "x86/kvm: fix vcpu-id indexed array sizes"
            usb: ehci: handshake CMD_RUN instead of STS_HALT
            usb: gadget: Mark USB_FSL_QE broken on 64-bit
            usb: musb: Balance list entry in musb_gadget_queue
            usb-storage: Add compatibility quirk flags for iODD 2531/2541
            printk/console: Allow to disable console output by using console="" or console=null
            isofs: Fix out of bound access for corrupted isofs image
            comedi: dt9812: fix DMA buffers on stack
            comedi: ni_usb6501: fix NULL-deref in command paths
            comedi: vmk80xx: fix transfer-buffer overflows
            comedi: vmk80xx: fix bulk-buffer overflow
            comedi: vmk80xx: fix bulk and interrupt message timeouts
            staging: r8712u: fix control-message timeout
            staging: rtl8192u: fix control-message timeouts
            rsi: fix control-message timeout
            Linux 4.19.217
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: Id429ece519f3fdcaeeff0811c39660490c583231

commit fd8250304dd51bc2c8674af65c102dd8463ee88b
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Fri Nov 12 14:40:52 2021 +0100

    Linux 4.19.217
    
    Link: https://lore.kernel.org/r/20211110182001.994215976@linuxfoundation.org
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index f8255c787f7e..6f983a62d1fd 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 216
+SUBLEVEL = 217
 EXTRAVERSION =
 NAME = "People's Front"
 

commit 4924d15182acb97b21da1ec2917c53fcb0d4d36f
Author: Johan Hovold <johan@kernel.org>
Date:   Mon Oct 25 14:05:22 2021 +0200

    rsi: fix control-message timeout
    
    commit 541fd20c3ce5b0bc39f0c6a52414b6b92416831c upstream.
    
    USB control-message timeouts are specified in milliseconds and should
    specifically not vary with CONFIG_HZ.
    
    Use the common control-message timeout define for the five-second
    timeout.
    
    Fixes: dad0d04fa7ba ("rsi: Add RS9113 wireless driver")
    Cc: stable@vger.kernel.org      # 3.15
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20211025120522.6045-5-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c
index 54106646445a..17e50eba780d 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
@@ -61,7 +61,7 @@ static int rsi_usb_card_write(struct rsi_hw *adapter,
 			      (void *)seg,
 			      (int)len,
 			      &transfer,
-			      HZ * 5);
+			      USB_CTRL_SET_TIMEOUT);
 
 	if (status < 0) {
 		rsi_dbg(ERR_ZONE,

commit 452a2988e6eb19874b7be6a78a7310199c1ee7ac
Author: Johan Hovold <johan@kernel.org>
Date:   Mon Oct 25 14:09:09 2021 +0200

    staging: rtl8192u: fix control-message timeouts
    
    commit 4cfa36d312d6789448b59a7aae770ac8425017a3 upstream.
    
    USB control-message timeouts are specified in milliseconds and should
    specifically not vary with CONFIG_HZ.
    
    Fixes: 8fc8598e61f6 ("Staging: Added Realtek rtl8192u driver to staging")
    Cc: stable@vger.kernel.org      # 2.6.33
    Acked-by: Larry Finger <Larry.Finger@lwfinger.net>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20211025120910.6339-2-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/staging/rtl8192u/r8192U_core.c b/drivers/staging/rtl8192u/r8192U_core.c
index cc12e6c36fed..becf444e590c 100644
--- a/drivers/staging/rtl8192u/r8192U_core.c
+++ b/drivers/staging/rtl8192u/r8192U_core.c
@@ -266,7 +266,7 @@ int write_nic_byte_E(struct net_device *dev, int indx, u8 data)
 
 	status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
 				 RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
-				 indx | 0xfe00, 0, usbdata, 1, HZ / 2);
+				 indx | 0xfe00, 0, usbdata, 1, 500);
 	kfree(usbdata);
 
 	if (status < 0) {
@@ -288,7 +288,7 @@ int read_nic_byte_E(struct net_device *dev, int indx, u8 *data)
 
 	status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
 				 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
-				 indx | 0xfe00, 0, usbdata, 1, HZ / 2);
+				 indx | 0xfe00, 0, usbdata, 1, 500);
 	*data = *usbdata;
 	kfree(usbdata);
 
@@ -316,7 +316,7 @@ int write_nic_byte(struct net_device *dev, int indx, u8 data)
 	status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
 				 RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
 				 (indx & 0xff) | 0xff00, (indx >> 8) & 0x0f,
-				 usbdata, 1, HZ / 2);
+				 usbdata, 1, 500);
 	kfree(usbdata);
 
 	if (status < 0) {
@@ -343,7 +343,7 @@ int write_nic_word(struct net_device *dev, int indx, u16 data)
 	status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
 				 RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
 				 (indx & 0xff) | 0xff00, (indx >> 8) & 0x0f,
-				 usbdata, 2, HZ / 2);
+				 usbdata, 2, 500);
 	kfree(usbdata);
 
 	if (status < 0) {
@@ -370,7 +370,7 @@ int write_nic_dword(struct net_device *dev, int indx, u32 data)
 	status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
 				 RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
 				 (indx & 0xff) | 0xff00, (indx >> 8) & 0x0f,
-				 usbdata, 4, HZ / 2);
+				 usbdata, 4, 500);
 	kfree(usbdata);
 
 
@@ -397,7 +397,7 @@ int read_nic_byte(struct net_device *dev, int indx, u8 *data)
 	status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
 				 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
 				 (indx & 0xff) | 0xff00, (indx >> 8) & 0x0f,
-				 usbdata, 1, HZ / 2);
+				 usbdata, 1, 500);
 	*data = *usbdata;
 	kfree(usbdata);
 
@@ -424,7 +424,7 @@ int read_nic_word(struct net_device *dev, int indx, u16 *data)
 	status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
 				 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
 				 (indx & 0xff) | 0xff00, (indx >> 8) & 0x0f,
-				 usbdata, 2, HZ / 2);
+				 usbdata, 2, 500);
 	*data = *usbdata;
 	kfree(usbdata);
 
@@ -448,7 +448,7 @@ static int read_nic_word_E(struct net_device *dev, int indx, u16 *data)
 
 	status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
 				 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
-				 indx | 0xfe00, 0, usbdata, 2, HZ / 2);
+				 indx | 0xfe00, 0, usbdata, 2, 500);
 	*data = *usbdata;
 	kfree(usbdata);
 
@@ -474,7 +474,7 @@ int read_nic_dword(struct net_device *dev, int indx, u32 *data)
 	status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
 				 RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
 				 (indx & 0xff) | 0xff00, (indx >> 8) & 0x0f,
-				 usbdata, 4, HZ / 2);
+				 usbdata, 4, 500);
 	*data = *usbdata;
 	kfree(usbdata);
 

commit 8421e749b3ee265ffaf3e60f61ae9a69c1808861
Author: Johan Hovold <johan@kernel.org>
Date:   Mon Oct 25 14:09:10 2021 +0200

    staging: r8712u: fix control-message timeout
    
    commit ce4940525f36ffdcf4fa623bcedab9c2a6db893a upstream.
    
    USB control-message timeouts are specified in milliseconds and should
    specifically not vary with CONFIG_HZ.
    
    Fixes: 2865d42c78a9 ("staging: r8712u: Add the new driver to the mainline kernel")
    Cc: stable@vger.kernel.org      # 2.6.37
    Acked-by: Larry Finger <Larry.Finger@lwfinger.net>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20211025120910.6339-3-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/staging/rtl8712/usb_ops_linux.c b/drivers/staging/rtl8712/usb_ops_linux.c
index 6d12a96fa65f..dd1311b62b05 100644
--- a/drivers/staging/rtl8712/usb_ops_linux.c
+++ b/drivers/staging/rtl8712/usb_ops_linux.c
@@ -505,7 +505,7 @@ int r8712_usbctrl_vendorreq(struct intf_priv *pintfpriv, u8 request, u16 value,
 		memcpy(pIo_buf, pdata, len);
 	}
 	status = usb_control_msg(udev, pipe, request, reqtype, value, index,
-				 pIo_buf, len, HZ / 2);
+				 pIo_buf, len, 500);
 	if (status > 0) {  /* Success this control transfer. */
 		if (requesttype == 0x01) {
 			/* For Control read transfer, we have to copy the read

commit 8743917355dd223984459ccf4eee89013baf7836
Author: Johan Hovold <johan@kernel.org>
Date:   Mon Oct 25 13:45:32 2021 +0200

    comedi: vmk80xx: fix bulk and interrupt message timeouts
    
    commit a56d3e40bda460edf3f8d6aac00ec0b322b4ab83 upstream.
    
    USB bulk and interrupt message timeouts are specified in milliseconds
    and should specifically not vary with CONFIG_HZ.
    
    Note that the bulk-out transfer timeout was set to the endpoint
    bInterval value, which should be ignored for bulk endpoints and is
    typically set to zero. This meant that a failing bulk-out transfer
    would never time out.
    
    Assume that the 10 second timeout used for all other transfers is more
    than enough also for the bulk-out endpoint.
    
    Fixes: 985cafccbf9b ("Staging: Comedi: vmk80xx: Add k8061 support")
    Fixes: 951348b37738 ("staging: comedi: vmk80xx: wait for URBs to complete")
    Cc: stable@vger.kernel.org      # 2.6.31
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Reviewed-by: Ian Abbott <abbotti@mev.co.uk>
    Link: https://lore.kernel.org/r/20211025114532.4599-6-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/staging/comedi/drivers/vmk80xx.c b/drivers/staging/comedi/drivers/vmk80xx.c
index 78c0383b8088..7769eadfaf61 100644
--- a/drivers/staging/comedi/drivers/vmk80xx.c
+++ b/drivers/staging/comedi/drivers/vmk80xx.c
@@ -91,6 +91,7 @@ enum {
 #define IC6_VERSION		BIT(1)
 
 #define MIN_BUF_SIZE		64
+#define PACKET_TIMEOUT		10000	/* ms */
 
 enum vmk80xx_model {
 	VMK8055_MODEL,
@@ -169,10 +170,11 @@ static void vmk80xx_do_bulk_msg(struct comedi_device *dev)
 	tx_size = usb_endpoint_maxp(devpriv->ep_tx);
 	rx_size = usb_endpoint_maxp(devpriv->ep_rx);
 
-	usb_bulk_msg(usb, tx_pipe, devpriv->usb_tx_buf,
-		     tx_size, NULL, devpriv->ep_tx->bInterval);
+	usb_bulk_msg(usb, tx_pipe, devpriv->usb_tx_buf, tx_size, NULL,
+		     PACKET_TIMEOUT);
 
-	usb_bulk_msg(usb, rx_pipe, devpriv->usb_rx_buf, rx_size, NULL, HZ * 10);
+	usb_bulk_msg(usb, rx_pipe, devpriv->usb_rx_buf, rx_size, NULL,
+		     PACKET_TIMEOUT);
 }
 
 static int vmk80xx_read_packet(struct comedi_device *dev)
@@ -191,7 +193,7 @@ static int vmk80xx_read_packet(struct comedi_device *dev)
 	pipe = usb_rcvintpipe(usb, ep->bEndpointAddress);
 	return usb_interrupt_msg(usb, pipe, devpriv->usb_rx_buf,
 				 usb_endpoint_maxp(ep), NULL,
-				 HZ * 10);
+				 PACKET_TIMEOUT);
 }
 
 static int vmk80xx_write_packet(struct comedi_device *dev, int cmd)
@@ -212,7 +214,7 @@ static int vmk80xx_write_packet(struct comedi_device *dev, int cmd)
 	pipe = usb_sndintpipe(usb, ep->bEndpointAddress);
 	return usb_interrupt_msg(usb, pipe, devpriv->usb_tx_buf,
 				 usb_endpoint_maxp(ep), NULL,
-				 HZ * 10);
+				 PACKET_TIMEOUT);
 }
 
 static int vmk80xx_reset_device(struct comedi_device *dev)

commit 063f576c43d589a4c153554b681d32b3f8317c7b
Author: Johan Hovold <johan@kernel.org>
Date:   Mon Oct 25 13:45:31 2021 +0200

    comedi: vmk80xx: fix bulk-buffer overflow
    
    commit 78cdfd62bd54af615fba9e3ca1ba35de39d3871d upstream.
    
    The driver is using endpoint-sized buffers but must not assume that the
    tx and rx buffers are of equal size or a malicious device could overflow
    the slab-allocated receive buffer when doing bulk transfers.
    
    Fixes: 985cafccbf9b ("Staging: Comedi: vmk80xx: Add k8061 support")
    Cc: stable@vger.kernel.org      # 2.6.31
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Reviewed-by: Ian Abbott <abbotti@mev.co.uk>
    Link: https://lore.kernel.org/r/20211025114532.4599-5-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/staging/comedi/drivers/vmk80xx.c b/drivers/staging/comedi/drivers/vmk80xx.c
index 2787757cf75f..78c0383b8088 100644
--- a/drivers/staging/comedi/drivers/vmk80xx.c
+++ b/drivers/staging/comedi/drivers/vmk80xx.c
@@ -159,22 +159,20 @@ static void vmk80xx_do_bulk_msg(struct comedi_device *dev)
 	__u8 rx_addr;
 	unsigned int tx_pipe;
 	unsigned int rx_pipe;
-	size_t size;
+	size_t tx_size;
+	size_t rx_size;
 
 	tx_addr = devpriv->ep_tx->bEndpointAddress;
 	rx_addr = devpriv->ep_rx->bEndpointAddress;
 	tx_pipe = usb_sndbulkpipe(usb, tx_addr);
 	rx_pipe = usb_rcvbulkpipe(usb, rx_addr);
-
-	/*
-	 * The max packet size attributes of the K8061
-	 * input/output endpoints are identical
-	 */
-	size = usb_endpoint_maxp(devpriv->ep_tx);
+	tx_size = usb_endpoint_maxp(devpriv->ep_tx);
+	rx_size = usb_endpoint_maxp(devpriv->ep_rx);
 
 	usb_bulk_msg(usb, tx_pipe, devpriv->usb_tx_buf,
-		     size, NULL, devpriv->ep_tx->bInterval);
-	usb_bulk_msg(usb, rx_pipe, devpriv->usb_rx_buf, size, NULL, HZ * 10);
+		     tx_size, NULL, devpriv->ep_tx->bInterval);
+
+	usb_bulk_msg(usb, rx_pipe, devpriv->usb_rx_buf, rx_size, NULL, HZ * 10);
 }
 
 static int vmk80xx_read_packet(struct comedi_device *dev)

commit 7a2021b896de1ad559d33b5c5cdd20b982242088
Author: Johan Hovold <johan@kernel.org>
Date:   Mon Oct 25 13:45:30 2021 +0200

    comedi: vmk80xx: fix transfer-buffer overflows
    
    commit a23461c47482fc232ffc9b819539d1f837adf2b1 upstream.
    
    The driver uses endpoint-sized USB transfer buffers but up until
    recently had no sanity checks on the sizes.
    
    Commit e1f13c879a7c ("staging: comedi: check validity of wMaxPacketSize
    of usb endpoints found") inadvertently fixed NULL-pointer dereferences
    when accessing the transfer buffers in case a malicious device has a
    zero wMaxPacketSize.
    
    Make sure to allocate buffers large enough to handle also the other
    accesses that are done without a size check (e.g. byte 18 in
    vmk80xx_cnt_insn_read() for the VMK8061_MODEL) to avoid writing beyond
    the buffers, for example, when doing descriptor fuzzing.
    
    The original driver was for a low-speed device with 8-byte buffers.
    Support was later added for a device that uses bulk transfers and is
    presumably a full-speed device with a maximum 64-byte wMaxPacketSize.
    
    Fixes: 985cafccbf9b ("Staging: Comedi: vmk80xx: Add k8061 support")
    Cc: stable@vger.kernel.org      # 2.6.31
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Reviewed-by: Ian Abbott <abbotti@mev.co.uk>
    Link: https://lore.kernel.org/r/20211025114532.4599-4-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/staging/comedi/drivers/vmk80xx.c b/drivers/staging/comedi/drivers/vmk80xx.c
index 7956abcbae22..2787757cf75f 100644
--- a/drivers/staging/comedi/drivers/vmk80xx.c
+++ b/drivers/staging/comedi/drivers/vmk80xx.c
@@ -90,6 +90,8 @@ enum {
 #define IC3_VERSION		BIT(0)
 #define IC6_VERSION		BIT(1)
 
+#define MIN_BUF_SIZE		64
+
 enum vmk80xx_model {
 	VMK8055_MODEL,
 	VMK8061_MODEL
@@ -678,12 +680,12 @@ static int vmk80xx_alloc_usb_buffers(struct comedi_device *dev)
 	struct vmk80xx_private *devpriv = dev->private;
 	size_t size;
 
-	size = usb_endpoint_maxp(devpriv->ep_rx);
+	size = max(usb_endpoint_maxp(devpriv->ep_rx), MIN_BUF_SIZE);
 	devpriv->usb_rx_buf = kzalloc(size, GFP_KERNEL);
 	if (!devpriv->usb_rx_buf)
 		return -ENOMEM;
 
-	size = usb_endpoint_maxp(devpriv->ep_tx);
+	size = max(usb_endpoint_maxp(devpriv->ep_rx), MIN_BUF_SIZE);
 	devpriv->usb_tx_buf = kzalloc(size, GFP_KERNEL);
 	if (!devpriv->usb_tx_buf)
 		return -ENOMEM;

commit bc51111bf6e8e7b6cc94b133e4c291273a16acd1
Author: Johan Hovold <johan@kernel.org>
Date:   Wed Oct 27 11:35:28 2021 +0200

    comedi: ni_usb6501: fix NULL-deref in command paths
    
    commit 907767da8f3a925b060c740e0b5c92ea7dbec440 upstream.
    
    The driver uses endpoint-sized USB transfer buffers but had no sanity
    checks on the sizes. This can lead to zero-size-pointer dereferences or
    overflowed transfer buffers in ni6501_port_command() and
    ni6501_counter_command() if a (malicious) device has smaller max-packet
    sizes than expected (or when doing descriptor fuzz testing).
    
    Add the missing sanity checks to probe().
    
    Fixes: a03bb00e50ab ("staging: comedi: add NI USB-6501 support")
    Cc: stable@vger.kernel.org      # 3.18
    Cc: Luca Ellero <luca.ellero@brickedbrain.com>
    Reviewed-by: Ian Abbott <abbotti@mev.co.uk>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20211027093529.30896-2-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/staging/comedi/drivers/ni_usb6501.c b/drivers/staging/comedi/drivers/ni_usb6501.c
index 1bb1cb651349..75e5b57ae0d7 100644
--- a/drivers/staging/comedi/drivers/ni_usb6501.c
+++ b/drivers/staging/comedi/drivers/ni_usb6501.c
@@ -144,6 +144,10 @@ static const u8 READ_COUNTER_RESPONSE[]	= {0x00, 0x01, 0x00, 0x10,
 					   0x00, 0x00, 0x00, 0x02,
 					   0x00, 0x00, 0x00, 0x00};
 
+/* Largest supported packets */
+static const size_t TX_MAX_SIZE	= sizeof(SET_PORT_DIR_REQUEST);
+static const size_t RX_MAX_SIZE	= sizeof(READ_PORT_RESPONSE);
+
 enum commands {
 	READ_PORT,
 	WRITE_PORT,
@@ -501,6 +505,12 @@ static int ni6501_find_endpoints(struct comedi_device *dev)
 	if (!devpriv->ep_rx || !devpriv->ep_tx)
 		return -ENODEV;
 
+	if (usb_endpoint_maxp(devpriv->ep_rx) < RX_MAX_SIZE)
+		return -ENODEV;
+
+	if (usb_endpoint_maxp(devpriv->ep_tx) < TX_MAX_SIZE)
+		return -ENODEV;
+
 	return 0;
 }
 

commit 39ea61037ae78f14fa121228dd962ea3280eacf3
Author: Johan Hovold <johan@kernel.org>
Date:   Wed Oct 27 11:35:29 2021 +0200

    comedi: dt9812: fix DMA buffers on stack
    
    commit 536de747bc48262225889a533db6650731ab25d3 upstream.
    
    USB transfer buffers are typically mapped for DMA and must not be
    allocated on the stack or transfers will fail.
    
    Allocate proper transfer buffers in the various command helpers and
    return an error on short transfers instead of acting on random stack
    data.
    
    Note that this also fixes a stack info leak on systems where DMA is not
    used as 32 bytes are always sent to the device regardless of how short
    the command is.
    
    Fixes: 63274cd7d38a ("Staging: comedi: add usb dt9812 driver")
    Cc: stable@vger.kernel.org      # 2.6.29
    Reviewed-by: Ian Abbott <abbotti@mev.co.uk>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20211027093529.30896-3-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/staging/comedi/drivers/dt9812.c b/drivers/staging/comedi/drivers/dt9812.c
index 75cc9e8e5b94..ee0402bf6e67 100644
--- a/drivers/staging/comedi/drivers/dt9812.c
+++ b/drivers/staging/comedi/drivers/dt9812.c
@@ -32,6 +32,7 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/errno.h>
+#include <linux/slab.h>
 #include <linux/uaccess.h>
 
 #include "../comedi_usb.h"
@@ -237,22 +238,42 @@ static int dt9812_read_info(struct comedi_device *dev,
 {
 	struct usb_device *usb = comedi_to_usb_dev(dev);
 	struct dt9812_private *devpriv = dev->private;
-	struct dt9812_usb_cmd cmd;
+	struct dt9812_usb_cmd *cmd;
+	size_t tbuf_size;
 	int count, ret;
+	void *tbuf;
 
-	cmd.cmd = cpu_to_le32(DT9812_R_FLASH_DATA);
-	cmd.u.flash_data_info.address =
+	tbuf_size = max(sizeof(*cmd), buf_size);
+
+	tbuf = kzalloc(tbuf_size, GFP_KERNEL);
+	if (!tbuf)
+		return -ENOMEM;
+
+	cmd = tbuf;
+
+	cmd->cmd = cpu_to_le32(DT9812_R_FLASH_DATA);
+	cmd->u.flash_data_info.address =
 	    cpu_to_le16(DT9812_DIAGS_BOARD_INFO_ADDR + offset);
-	cmd.u.flash_data_info.numbytes = cpu_to_le16(buf_size);
+	cmd->u.flash_data_info.numbytes = cpu_to_le16(buf_size);
 
 	/* DT9812 only responds to 32 byte writes!! */
 	ret = usb_bulk_msg(usb, usb_sndbulkpipe(usb, devpriv->cmd_wr.addr),
-			   &cmd, 32, &count, DT9812_USB_TIMEOUT);
+			   cmd, sizeof(*cmd), &count, DT9812_USB_TIMEOUT);
 	if (ret)
-		return ret;
+		goto out;
+
+	ret = usb_bulk_msg(usb, usb_rcvbulkpipe(usb, devpriv->cmd_rd.addr),
+			   tbuf, buf_size, &count, DT9812_USB_TIMEOUT);
+	if (!ret) {
+		if (count == buf_size)
+			memcpy(buf, tbuf, buf_size);
+		else
+			ret = -EREMOTEIO;
+	}
+out:
+	kfree(tbuf);
 
-	return usb_bulk_msg(usb, usb_rcvbulkpipe(usb, devpriv->cmd_rd.addr),
-			    buf, buf_size, &count, DT9812_USB_TIMEOUT);
+	return ret;
 }
 
 static int dt9812_read_multiple_registers(struct comedi_device *dev,
@@ -261,22 +282,42 @@ static int dt9812_read_multiple_registers(struct comedi_device *dev,
 {
 	struct usb_device *usb = comedi_to_usb_dev(dev);
 	struct dt9812_private *devpriv = dev->private;
-	struct dt9812_usb_cmd cmd;
+	struct dt9812_usb_cmd *cmd;
 	int i, count, ret;
+	size_t buf_size;
+	void *buf;
 
-	cmd.cmd = cpu_to_le32(DT9812_R_MULTI_BYTE_REG);
-	cmd.u.read_multi_info.count = reg_count;
+	buf_size = max_t(size_t, sizeof(*cmd), reg_count);
+
+	buf = kzalloc(buf_size, GFP_KERNEL);
+	if (!buf)
+		return -ENOMEM;
+
+	cmd = buf;
+
+	cmd->cmd = cpu_to_le32(DT9812_R_MULTI_BYTE_REG);
+	cmd->u.read_multi_info.count = reg_count;
 	for (i = 0; i < reg_count; i++)
-		cmd.u.read_multi_info.address[i] = address[i];
+		cmd->u.read_multi_info.address[i] = address[i];
 
 	/* DT9812 only responds to 32 byte writes!! */
 	ret = usb_bulk_msg(usb, usb_sndbulkpipe(usb, devpriv->cmd_wr.addr),
-			   &cmd, 32, &count, DT9812_USB_TIMEOUT);
+			   cmd, sizeof(*cmd), &count, DT9812_USB_TIMEOUT);
 	if (ret)
-		return ret;
+		goto out;
+
+	ret = usb_bulk_msg(usb, usb_rcvbulkpipe(usb, devpriv->cmd_rd.addr),
+			   buf, reg_count, &count, DT9812_USB_TIMEOUT);
+	if (!ret) {
+		if (count == reg_count)
+			memcpy(value, buf, reg_count);
+		else
+			ret = -EREMOTEIO;
+	}
+out:
+	kfree(buf);
 
-	return usb_bulk_msg(usb, usb_rcvbulkpipe(usb, devpriv->cmd_rd.addr),
-			    value, reg_count, &count, DT9812_USB_TIMEOUT);
+	return ret;
 }
 
 static int dt9812_write_multiple_registers(struct comedi_device *dev,
@@ -285,19 +326,27 @@ static int dt9812_write_multiple_registers(struct comedi_device *dev,
 {
 	struct usb_device *usb = comedi_to_usb_dev(dev);
 	struct dt9812_private *devpriv = dev->private;
-	struct dt9812_usb_cmd cmd;
+	struct dt9812_usb_cmd *cmd;
 	int i, count;
+	int ret;
+
+	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
+	if (!cmd)
+		return -ENOMEM;
 
-	cmd.cmd = cpu_to_le32(DT9812_W_MULTI_BYTE_REG);
-	cmd.u.read_multi_info.count = reg_count;
+	cmd->cmd = cpu_to_le32(DT9812_W_MULTI_BYTE_REG);
+	cmd->u.read_multi_info.count = reg_count;
 	for (i = 0; i < reg_count; i++) {
-		cmd.u.write_multi_info.write[i].address = address[i];
-		cmd.u.write_multi_info.write[i].value = value[i];
+		cmd->u.write_multi_info.write[i].address = address[i];
+		cmd->u.write_multi_info.write[i].value = value[i];
 	}
 
 	/* DT9812 only responds to 32 byte writes!! */
-	return usb_bulk_msg(usb, usb_sndbulkpipe(usb, devpriv->cmd_wr.addr),
-			    &cmd, 32, &count, DT9812_USB_TIMEOUT);
+	ret = usb_bulk_msg(usb, usb_sndbulkpipe(usb, devpriv->cmd_wr.addr),
+			   cmd, sizeof(*cmd), &count, DT9812_USB_TIMEOUT);
+	kfree(cmd);
+
+	return ret;
 }
 
 static int dt9812_rmw_multiple_registers(struct comedi_device *dev,
@@ -306,17 +355,25 @@ static int dt9812_rmw_multiple_registers(struct comedi_device *dev,
 {
 	struct usb_device *usb = comedi_to_usb_dev(dev);
 	struct dt9812_private *devpriv = dev->private;
-	struct dt9812_usb_cmd cmd;
+	struct dt9812_usb_cmd *cmd;
 	int i, count;
+	int ret;
+
+	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
+	if (!cmd)
+		return -ENOMEM;
 
-	cmd.cmd = cpu_to_le32(DT9812_RMW_MULTI_BYTE_REG);
-	cmd.u.rmw_multi_info.count = reg_count;
+	cmd->cmd = cpu_to_le32(DT9812_RMW_MULTI_BYTE_REG);
+	cmd->u.rmw_multi_info.count = reg_count;
 	for (i = 0; i < reg_count; i++)
-		cmd.u.rmw_multi_info.rmw[i] = rmw[i];
+		cmd->u.rmw_multi_info.rmw[i] = rmw[i];
 
 	/* DT9812 only responds to 32 byte writes!! */
-	return usb_bulk_msg(usb, usb_sndbulkpipe(usb, devpriv->cmd_wr.addr),
-			    &cmd, 32, &count, DT9812_USB_TIMEOUT);
+	ret = usb_bulk_msg(usb, usb_sndbulkpipe(usb, devpriv->cmd_wr.addr),
+			   cmd, sizeof(*cmd), &count, DT9812_USB_TIMEOUT);
+	kfree(cmd);
+
+	return ret;
 }
 
 static int dt9812_digital_in(struct comedi_device *dev, u8 *bits)

commit b0ddff8d68f2e43857a84dce54c3deab181c8ae1
Author: Jan Kara <jack@suse.cz>
Date:   Mon Oct 18 12:37:41 2021 +0200

    isofs: Fix out of bound access for corrupted isofs image
    
    commit e96a1866b40570b5950cda8602c2819189c62a48 upstream.
    
    When isofs image is suitably corrupted isofs_read_inode() can read data
    beyond the end of buffer. Sanity-check the directory entry length before
    using it.
    
    Reported-and-tested-by: syzbot+6fc7fb214625d82af7d1@syzkaller.appspotmail.com
    CC: stable@vger.kernel.org
    Signed-off-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c
index 2355ad62b81f..6e4e2cfd40b9 100644
--- a/fs/isofs/inode.c
+++ b/fs/isofs/inode.c
@@ -1326,6 +1326,8 @@ static int isofs_read_inode(struct inode *inode, int relocated)
 
 	de = (struct iso_directory_record *) (bh->b_data + offset);
 	de_len = *(unsigned char *) de;
+	if (de_len < sizeof(struct iso_directory_record))
+		goto fail;
 
 	if (offset + de_len > bufsize) {
 		int frag1 = bufsize - offset;

commit a9342139ac906e97675bb250ce69e0e683504943
Author: Petr Mladek <pmladek@suse.com>
Date:   Wed Nov 11 14:54:50 2020 +0100

    printk/console: Allow to disable console output by using console="" or console=null
    
    commit 3cffa06aeef7ece30f6b5ac0ea51f264e8fea4d0 upstream.
    
    The commit 48021f98130880dd74 ("printk: handle blank console arguments
    passed in.") prevented crash caused by empty console= parameter value.
    
    Unfortunately, this value is widely used on Chromebooks to disable
    the console output. The above commit caused performance regression
    because the messages were pushed on slow console even though nobody
    was watching it.
    
    Use ttynull driver explicitly for console="" and console=null
    parameters. It has been created for exactly this purpose.
    
    It causes that preferred_console is set. As a result, ttySX and ttyX
    are not used as a fallback. And only ttynull console gets registered by
    default.
    
    It still allows to register other consoles either by additional console=
    parameters or SPCR. It prevents regression because it worked this way even
    before. Also it is a sane semantic. Preventing output on all consoles
    should be done another way, for example, by introducing mute_console
    parameter.
    
    Link: https://lore.kernel.org/r/20201006025935.GA597@jagdpanzerIV.localdomain
    Suggested-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Acked-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Signed-off-by: Petr Mladek <pmladek@suse.com>
    Link: https://lore.kernel.org/r/20201111135450.11214-3-pmladek@suse.com
    Cc: Yi Fan <yfa@google.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index cf272aba362b..57742e193214 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -2148,8 +2148,15 @@ static int __init console_setup(char *str)
 	char *s, *options, *brl_options = NULL;
 	int idx;
 
-	if (str[0] == 0)
+	/*
+	 * console="" or console=null have been suggested as a way to
+	 * disable console output. Use ttynull that has been created
+	 * for exacly this purpose.
+	 */
+	if (str[0] == 0 || strcmp(str, "null") == 0) {
+		__add_preferred_console("ttynull", 0, NULL, NULL);
 		return 1;
+	}
 
 	if (_braille_console_setup(&str, &brl_options))
 		return 1;

commit 2be363c8f571d68864181ed678cb51343acc0eea
Author: James Buren <braewoods+lkml@braewoods.net>
Date:   Wed Oct 13 20:55:04 2021 -0500

    usb-storage: Add compatibility quirk flags for iODD 2531/2541
    
    commit 05c8f1b67e67dcd786ae3fe44492bbc617b4bd12 upstream.
    
    These drive enclosures have firmware bugs that make it impossible to mount
    a new virtual ISO image after Linux ejects the old one if the device is
    locked by Linux. Windows bypasses this problem by the fact that they do
    not lock the device. Add a quirk to disable device locking for these
    drive enclosures.
    
    Acked-by: Alan Stern <stern@rowland.harvard.edu>
    Signed-off-by: James Buren <braewoods+lkml@braewoods.net>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20211014015504.2695089-1-braewoods+lkml@braewoods.net
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
index 7442793fe050..3ba4e060fd05 100644
--- a/drivers/usb/storage/unusual_devs.h
+++ b/drivers/usb/storage/unusual_devs.h
@@ -406,6 +406,16 @@ UNUSUAL_DEV(  0x04b8, 0x0602, 0x0110, 0x0110,
 		"785EPX Storage",
 		USB_SC_SCSI, USB_PR_BULK, NULL, US_FL_SINGLE_LUN),
 
+/*
+ * Reported by James Buren <braewoods+lkml@braewoods.net>
+ * Virtual ISOs cannot be remounted if ejected while the device is locked
+ * Disable locking to mimic Windows behavior that bypasses the issue
+ */
+UNUSUAL_DEV(  0x04c5, 0x2028, 0x0001, 0x0001,
+		"iODD",
+		"2531/2541",
+		USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_NOT_LOCKABLE),
+
 /*
  * Not sure who reported this originally but
  * Pavel Machek <pavel@ucw.cz> reported that the extra US_FL_SINGLE_LUN

commit 3e7a9e8e68d52238708c4622ef3063012951ddcf
Author: Viraj Shah <viraj.shah@linutronix.de>
Date:   Thu Oct 21 11:36:44 2021 +0200

    usb: musb: Balance list entry in musb_gadget_queue
    
    commit 21b5fcdccb32ff09b6b63d4a83c037150665a83f upstream.
    
    musb_gadget_queue() adds the passed request to musb_ep::req_list. If the
    endpoint is idle and it is the first request then it invokes
    musb_queue_resume_work(). If the function returns an error then the
    error is passed to the caller without any clean-up and the request
    remains enqueued on the list. If the caller enqueues the request again
    then the list corrupts.
    
    Remove the request from the list on error.
    
    Fixes: ea2f35c01d5ea ("usb: musb: Fix sleeping function called from invalid context for hdrc glue")
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Viraj Shah <viraj.shah@linutronix.de>
    Link: https://lore.kernel.org/r/20211021093644.4734-1-viraj.shah@linutronix.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
index ffe462a657b1..4622400ba4dd 100644
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
@@ -1248,9 +1248,11 @@ static int musb_gadget_queue(struct usb_ep *ep, struct usb_request *req,
 		status = musb_queue_resume_work(musb,
 						musb_ep_restart_resume_work,
 						request);
-		if (status < 0)
+		if (status < 0) {
 			dev_err(musb->controller, "%s resume work: %i\n",
 				__func__, status);
+			list_del(&request->list);
+		}
 	}
 
 unlock:

commit 3d24b7a566dc0729b46adc84e7615c09ac095ac7
Author: Geert Uytterhoeven <geert@linux-m68k.org>
Date:   Wed Oct 27 10:08:49 2021 +0200

    usb: gadget: Mark USB_FSL_QE broken on 64-bit
    
    commit a0548b26901f082684ad1fb3ba397d2de3a1406a upstream.
    
    On 64-bit:
    
        drivers/usb/gadget/udc/fsl_qe_udc.c: In function ?qe_ep0_rx??
        drivers/usb/gadget/udc/fsl_qe_udc.c:842:13: error: cast from pointer to integer of different size [-Werror=pointer-to-int-cast]
          842 |     vaddr = (u32)phys_to_virt(in_be32(&bd->buf));
              |             ^
        In file included from drivers/usb/gadget/udc/fsl_qe_udc.c:41:
        drivers/usb/gadget/udc/fsl_qe_udc.c:843:28: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
          843 |     frame_set_data(pframe, (u8 *)vaddr);
              |                            ^
    
    The driver assumes physical and virtual addresses are 32-bit, hence it
    cannot work on 64-bit platforms.
    
    Acked-by: Li Yang <leoyang.li@nxp.com>
    Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
    Link: https://lore.kernel.org/r/20211027080849.3276289-1-geert@linux-m68k.org
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/gadget/udc/Kconfig b/drivers/usb/gadget/udc/Kconfig
index 0a16cbd4e528..d83d93c6ef9e 100644
--- a/drivers/usb/gadget/udc/Kconfig
+++ b/drivers/usb/gadget/udc/Kconfig
@@ -328,6 +328,7 @@ config USB_AMD5536UDC
 config USB_FSL_QE
 	tristate "Freescale QE/CPM USB Device Controller"
 	depends on FSL_SOC && (QUICC_ENGINE || CPM)
+	depends on !64BIT || BROKEN
 	help
 	   Some of Freescale PowerPC processors have a Full Speed
 	   QE/CPM2 USB controller, which support device mode with 4

commit 36acc24dc5dcca2e3529cc8e7037b261f8535baa
Author: Neal Liu <neal_liu@aspeedtech.com>
Date:   Fri Sep 10 15:36:19 2021 +0800

    usb: ehci: handshake CMD_RUN instead of STS_HALT
    
    commit 7f2d73788d9067fd4f677ac5f60ffd25945af7af upstream.
    
    For Aspeed, HCHalted status depends on not only Run/Stop but also
    ASS/PSS status.
    Handshake CMD_RUN on startup instead.
    
    Tested-by: Tao Ren <rentao.bupt@gmail.com>
    Reviewed-by: Tao Ren <rentao.bupt@gmail.com>
    Acked-by: Alan Stern <stern@rowland.harvard.edu>
    Signed-off-by: Neal Liu <neal_liu@aspeedtech.com>
    Link: https://lore.kernel.org/r/20210910073619.26095-1-neal_liu@aspeedtech.com
    Cc: Joel Stanley <joel@jms.id.au>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index d9282ca7ae8c..f2be5501430b 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -634,7 +634,16 @@ static int ehci_run (struct usb_hcd *hcd)
 	/* Wait until HC become operational */
 	ehci_readl(ehci, &ehci->regs->command);	/* unblock posted writes */
 	msleep(5);
-	rc = ehci_handshake(ehci, &ehci->regs->status, STS_HALT, 0, 100 * 1000);
+
+	/* For Aspeed, STS_HALT also depends on ASS/PSS status.
+	 * Check CMD_RUN instead.
+	 */
+	if (ehci->is_aspeed)
+		rc = ehci_handshake(ehci, &ehci->regs->command, CMD_RUN,
+				    1, 100 * 1000);
+	else
+		rc = ehci_handshake(ehci, &ehci->regs->status, STS_HALT,
+				    0, 100 * 1000);
 
 	up_write(&ehci_cf_port_reset_rwsem);
 
diff --git a/drivers/usb/host/ehci-platform.c b/drivers/usb/host/ehci-platform.c
index 8a45362155c5..ed96353764e8 100644
--- a/drivers/usb/host/ehci-platform.c
+++ b/drivers/usb/host/ehci-platform.c
@@ -288,6 +288,12 @@ static int ehci_platform_probe(struct platform_device *dev)
 					  "has-transaction-translator"))
 			hcd->has_tt = 1;
 
+		if (of_device_is_compatible(dev->dev.of_node,
+					    "aspeed,ast2500-ehci") ||
+		    of_device_is_compatible(dev->dev.of_node,
+					    "aspeed,ast2600-ehci"))
+			ehci->is_aspeed = 1;
+
 		if (soc_device_match(quirk_poll_match))
 			priv->quirk_poll = true;
 
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
index c8e9a48e1d51..f3b2f3375a21 100644
--- a/drivers/usb/host/ehci.h
+++ b/drivers/usb/host/ehci.h
@@ -218,6 +218,7 @@ struct ehci_hcd {			/* one per controller */
 	unsigned		frame_index_bug:1; /* MosChip (AKA NetMos) */
 	unsigned		need_oc_pp_cycle:1; /* MPC834X port power */
 	unsigned		imx28_write_fix:1; /* For Freescale i.MX28 */
+	unsigned		is_aspeed:1;
 
 	/* required for usb32 quirk */
 	#define OHCI_CTRL_HCFS          (3 << 6)

commit 9057a48428340f75b2fc3bfba8809eca74412a5e
Author: Juergen Gross <jgross@suse.com>
Date:   Mon Sep 13 15:57:43 2021 +0200

    Revert "x86/kvm: fix vcpu-id indexed array sizes"
    
    commit 1e254d0d86a0f2efd4190a89d5204b37c18c6381 upstream.
    
    This reverts commit 76b4f357d0e7d8f6f0013c733e6cba1773c266d3.
    
    The commit has the wrong reasoning, as KVM_MAX_VCPU_ID is not defining the
    maximum allowed vcpu-id as its name suggests, but the number of vcpu-ids.
    So revert this patch again.
    
    Suggested-by: Eduardo Habkost <ehabkost@redhat.com>
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Message-Id: <20210913135745.13944-2-jgross@suse.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kvm/ioapic.c b/arch/x86/kvm/ioapic.c
index 9944b9c7ceee..bac2ec9b4443 100644
--- a/arch/x86/kvm/ioapic.c
+++ b/arch/x86/kvm/ioapic.c
@@ -96,7 +96,7 @@ static unsigned long ioapic_read_indirect(struct kvm_ioapic *ioapic,
 static void rtc_irq_eoi_tracking_reset(struct kvm_ioapic *ioapic)
 {
 	ioapic->rtc_status.pending_eoi = 0;
-	bitmap_zero(ioapic->rtc_status.dest_map.map, KVM_MAX_VCPU_ID + 1);
+	bitmap_zero(ioapic->rtc_status.dest_map.map, KVM_MAX_VCPU_ID);
 }
 
 static void kvm_rtc_eoi_tracking_restore_all(struct kvm_ioapic *ioapic);
diff --git a/arch/x86/kvm/ioapic.h b/arch/x86/kvm/ioapic.h
index 283f1f489bca..ea1a4e0297da 100644
--- a/arch/x86/kvm/ioapic.h
+++ b/arch/x86/kvm/ioapic.h
@@ -43,13 +43,13 @@ struct kvm_vcpu;
 
 struct dest_map {
 	/* vcpu bitmap where IRQ has been sent */
-	DECLARE_BITMAP(map, KVM_MAX_VCPU_ID + 1);
+	DECLARE_BITMAP(map, KVM_MAX_VCPU_ID);
 
 	/*
 	 * Vector sent to a given vcpu, only valid when
 	 * the vcpu's bit in map is set
 	 */
-	u8 vectors[KVM_MAX_VCPU_ID + 1];
+	u8 vectors[KVM_MAX_VCPU_ID];
 };
 
 

commit c6f0b1854456becea896ae160657518f03173575
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Thu Nov 11 11:29:26 2021 +0800

    drm/rockchip: vvop: send last vblank when vblank disable
    
    Fix the warning:
    [   32.660604] virtual-vop virtual-vop: [drm:vvop_vblank_simulate]
    [   32.677230] virtual-vop virtual-vop: [drm:vvop_vblank_simulate]
    [   32.693872] virtual-vop virtual-vop: [drm:vvop_vblank_simulate]
    [   32.710535] virtual-vop virtual-vop: [drm:vvop_vblank_simulate]
    [   32.716379] rockchip-drm display-subsystem:[drm:vvop_crtc_atomic_disable]
    [   32.716412] rockchip-drm display-subsystem: [drm:vvop_disable_vblank]
    [   32.716446] drm_atomic_helper_commit_hw_done start
    [   32.716458] ------------[ cut here ]------------
    [   32.716515] WARNING: CPU: 2 PID: 243 drivers/gpu/drm/drm_atomic_helper.c:2214
                   drm_atomic_helper_commit_hw_done+0xe0/0x138
    [   32.716539] Modules linked in: bcmdhd
    [   32.716571] CPU: 2 PID: 243 Comm: HwBinder:231_1 Not tainted 4.19.193
    [   32.716595] Hardware name: Rockchip RK3568 EVB1 DDR4 V10 Board (DT)
    [   32.716624] pstate: 40400009 (nZcv daif +PAN -UAO)
    [   32.716653] pc : drm_atomic_helper_commit_hw_done+0xe0/0x138
    [   32.716679] lr : drm_atomic_helper_commit_hw_done+0xe0/0x138
    
    Change-Id: Ia2ff790f685d4c5421a21f958a9f466179cd64a8
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vvop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vvop.c
index 62c53316fec8..5ad39b96911a 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vvop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vvop.c
@@ -183,7 +183,17 @@ static void vvop_crtc_atomic_enable(struct drm_crtc *crtc,
 static void vvop_crtc_atomic_disable(struct drm_crtc *crtc,
 				     struct drm_crtc_state *old_state)
 {
+	unsigned long flags;
+
 	drm_crtc_vblank_off(crtc);
+	if (crtc->state->event && !crtc->state->active) {
+		spin_lock_irqsave(&crtc->dev->event_lock, flags);
+		drm_crtc_send_vblank_event(crtc, crtc->state->event);
+		spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
+
+		crtc->state->event = NULL;
+	}
+
 }
 
 static void vvop_crtc_atomic_flush(struct drm_crtc *crtc,

commit 8d01436efc10c619f269df60146168de90e477aa
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Thu Nov 11 11:19:56 2021 +0800

    drm/rockchip: vvop: Enable hrtimer for vblank simulate
    
    Start hrtimer when enable vblank.
    
    Change-Id: If0f914e8da61f811347e3dabdaf8630e7aa92cb7
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vvop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vvop.c
index 9c74221d7a05..62c53316fec8 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vvop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vvop.c
@@ -118,7 +118,7 @@ static int vvop_enable_vblank(struct drm_crtc *crtc)
 
 	hrtimer_init(&vvop->vblank_hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
 	vvop->vblank_hrtimer.function = &vvop_vblank_simulate;
-	vvop->period_ns = ktime_set(-1, vblank->framedur_ns);
+	vvop->period_ns = ktime_set(0, vblank->framedur_ns);
 	hrtimer_start(&vvop->vblank_hrtimer, vvop->period_ns, HRTIMER_MODE_REL);
 
 	return 0;

commit edcb521c0a7d47e7715473da1251f557301b3b9d
Author: Wang Jie <dave.wang@rock-chips.com>
Date:   Tue Sep 7 15:45:55 2021 +0800

    usb: typec: tcpm: add extcon notify mechanism
    
    For Husb311, ET7303 and other PD chips, the tcpm framework is used.
    In order not to modify the usb controller, usb3.0 phy and DP
    driver, the extcon notify mechanism is added.
    
    Change-Id: I02552d5a2d1d2491ff9a647ca1a85e75e295ebd2
    Signed-off-by: Wang Jie <dave.wang@rock-chips.com>

diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index 3d368437e411..4ad0fdf0b186 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -8,6 +8,7 @@
 #include <linux/completion.h>
 #include <linux/debugfs.h>
 #include <linux/device.h>
+#include <linux/extcon-provider.h>
 #include <linux/hrtimer.h>
 #include <linux/jiffies.h>
 #include <linux/kernel.h>
@@ -17,6 +18,7 @@
 #include <linux/power_supply.h>
 #include <linux/proc_fs.h>
 #include <linux/property.h>
+#include <linux/regulator/consumer.h>
 #include <linux/sched/clock.h>
 #include <linux/seq_file.h>
 #include <linux/slab.h>
@@ -29,6 +31,7 @@
 #include <linux/usb/role.h>
 #include <linux/usb/tcpm.h>
 #include <linux/usb/typec_altmode.h>
+#include <linux/usb/typec_dp.h>
 
 #include <uapi/linux/sched/types.h>
 
@@ -232,6 +235,24 @@ enum frs_typec_current {
 	FRS_5V_3A,
 };
 
+static const unsigned int tcpm_cable[] = {
+	EXTCON_USB,
+	EXTCON_USB_HOST,
+	EXTCON_USB_VBUS_EN,
+	EXTCON_CHG_USB_SDP,
+	EXTCON_CHG_USB_CDP,
+	EXTCON_CHG_USB_DCP,
+	EXTCON_CHG_USB_SLOW,
+	EXTCON_CHG_USB_FAST,
+	EXTCON_DISP_DP,
+	EXTCON_NONE,
+};
+
+/* Pin assignments where one channel is for USB */
+#define DP_PIN_ASSIGN_MULTI_FUNCTION_MASK	(BIT(DP_PIN_ASSIGN_B) | \
+						 BIT(DP_PIN_ASSIGN_D) | \
+						 BIT(DP_PIN_ASSIGN_F))
+
 /* Events from low level driver */
 
 #define TCPM_CC_EVENT		BIT(0)
@@ -249,6 +270,7 @@ enum frs_typec_current {
 #define ALTMODE_DISCOVERY_MAX	(SVID_DISCOVERY_MAX * MODE_DISCOVERY_MAX)
 
 #define GET_SINK_CAP_RETRY_MS	100
+#define SEND_NEW_MODE_NOTIFY_MS 20
 
 struct pd_mode_data {
 	int svid_index;		/* current SVID index		*/
@@ -289,6 +311,9 @@ struct tcpm_port {
 	struct typec_partner_desc partner_desc;
 	struct typec_partner *partner;
 
+	struct regulator *vbus;
+	struct extcon_dev *extcon;
+
 	enum typec_cc_status cc_req;
 
 	enum typec_cc_status cc1;
@@ -305,6 +330,7 @@ struct tcpm_port {
 
 	bool send_discover;
 	bool op_vsafe5v;
+	bool vbus_on;
 
 	int try_role;
 	int try_snk_count;
@@ -329,6 +355,8 @@ struct tcpm_port {
 	struct kthread_work vdm_state_machine;
 	struct hrtimer enable_frs_timer;
 	struct kthread_work enable_frs;
+	struct kthread_work data_role_swap;
+	struct hrtimer data_role_swap_timer;
 	bool state_machine_running;
 	bool vdm_sm_running;
 
@@ -349,6 +377,10 @@ struct tcpm_port {
 	bool explicit_contract;
 	unsigned int rx_msgid;
 
+	u32 dp_pin_assignment;
+	u32 dp_status;
+	bool dp_configured;
+
 	/* Partner capabilities/requests */
 	u32 sink_request;
 	u32 source_caps[PDO_MAX_OBJECTS];
@@ -719,6 +751,105 @@ static void tcpm_debugfs_exit(const struct tcpm_port *port) { }
 
 #endif
 
+static int tcpm_send_vbus_notify(struct tcpm_port *port, bool enable)
+{
+	int ret = 0;
+
+	if (port->vbus_on == enable) {
+		tcpm_log(port, "vbus is already %s", enable ? "on" : "Off");
+		goto done;
+	}
+
+	if (port->vbus) {
+		if (enable)
+			ret = regulator_enable(port->vbus);
+		else
+			ret = regulator_disable(port->vbus);
+		if (ret < 0) {
+			dev_err(port->dev, "failed to %s vbus supply(%d)\n",
+				enable ? "enable" : "disable", ret);
+			goto done;
+		}
+
+		/* Only set state here, don't sync notifier to PMIC */
+		extcon_set_state(port->extcon, EXTCON_USB_VBUS_EN, enable);
+	} else {
+		extcon_set_state(port->extcon, EXTCON_USB_VBUS_EN, enable);
+		extcon_sync(port->extcon, EXTCON_USB_VBUS_EN);
+		tcpm_log(port, "tcpm driver send extcon to %s vbus 5v\n",
+			 enable ? "enable" : "disable");
+	}
+
+	port->vbus_on = enable;
+
+done:
+	return ret;
+}
+
+static void tcpm_send_orientation_notify(struct tcpm_port *port)
+{
+	union extcon_property_value property;
+
+	property.intval = port->polarity;
+	extcon_set_property(port->extcon, EXTCON_USB,
+			    EXTCON_PROP_USB_TYPEC_POLARITY, property);
+	extcon_set_property(port->extcon, EXTCON_USB_HOST,
+			    EXTCON_PROP_USB_TYPEC_POLARITY, property);
+	extcon_set_property(port->extcon, EXTCON_DISP_DP,
+			    EXTCON_PROP_USB_TYPEC_POLARITY, property);
+}
+
+static void tcpm_send_data_role_notify(struct tcpm_port *port, bool attached,
+				  enum typec_data_role data)
+{
+	bool dfp = false;
+	bool ufp = false;
+
+	if (attached) {
+		if (data == TYPEC_HOST)
+			dfp = true;
+		else
+			ufp = true;
+	}
+	extcon_set_state(port->extcon, EXTCON_USB, ufp);
+	extcon_set_state(port->extcon, EXTCON_USB_HOST, dfp);
+	extcon_sync(port->extcon, EXTCON_USB);
+	extcon_sync(port->extcon, EXTCON_USB_HOST);
+}
+
+static void tcpm_send_dp_notify(struct tcpm_port *port)
+{
+	union extcon_property_value property;
+	bool usb_ss = false;
+	bool hpd = false;
+
+	if (port->dp_configured) {
+		usb_ss = (port->dp_pin_assignment &
+			  DP_PIN_ASSIGN_MULTI_FUNCTION_MASK) ? true : false;
+		hpd = !!(port->dp_status & DP_STATUS_HPD_STATE);
+	}
+	property.intval = usb_ss;
+	extcon_set_property(port->extcon, EXTCON_USB,
+			    EXTCON_PROP_USB_SS, property);
+	extcon_set_property(port->extcon, EXTCON_USB_HOST,
+			    EXTCON_PROP_USB_SS, property);
+	extcon_set_property(port->extcon, EXTCON_DISP_DP,
+			    EXTCON_PROP_USB_SS, property);
+	extcon_set_state(port->extcon, EXTCON_DISP_DP, port->dp_configured && hpd);
+	extcon_sync(port->extcon, EXTCON_DISP_DP);
+}
+
+static void tcpm_send_power_change_notify(struct tcpm_port *port)
+{
+	union extcon_property_value property;
+
+	property.intval = (port->current_limit << 15 | port->supply_voltage);
+	extcon_set_property(port->extcon, EXTCON_CHG_USB_FAST,
+			    EXTCON_PROP_USB_TYPEC_POLARITY, property);
+	extcon_set_state(port->extcon, EXTCON_CHG_USB_FAST, true);
+	extcon_sync(port->extcon, EXTCON_CHG_USB_FAST);
+}
+
 static void tcpm_set_cc(struct tcpm_port *port, enum typec_cc_status cc)
 {
 	tcpm_log(port, "cc:=%d", cc);
@@ -1074,6 +1205,17 @@ static void mod_enable_frs_delayed_work(struct tcpm_port *port, unsigned int del
 	}
 }
 
+static void mod_data_role_swap_work(struct tcpm_port *port, unsigned int delay_ms)
+{
+	if (delay_ms) {
+		hrtimer_start(&port->data_role_swap_timer,
+			      ms_to_ktime(delay_ms), HRTIMER_MODE_REL);
+	} else {
+		hrtimer_cancel(&port->data_role_swap_timer);
+		kthread_queue_work(port->wq, &port->data_role_swap);
+	}
+}
+
 static void tcpm_set_state(struct tcpm_port *port, enum tcpm_state state,
 			   unsigned int delay_ms)
 {
@@ -1919,10 +2061,39 @@ static int tcpm_altmode_vdm(struct typec_altmode *altmode,
 	return 0;
 }
 
+static int tcpm_altmode_notify(struct typec_altmode *altmode,
+			       unsigned long conf, void *data)
+{
+	struct tcpm_port *port = typec_altmode_get_drvdata(altmode);
+	struct typec_displayport_data *dp_data = data;
+
+	if ((conf >= TYPEC_DP_STATE_A) && (conf <= TYPEC_DP_STATE_F)) {
+		if (port->dp_configured) {
+			port->dp_status = dp_data->status;
+			tcpm_send_dp_notify(port);
+			dev_info(port->dev, "dp_status %x\n", dp_data->status);
+		} else {
+			port->dp_pin_assignment = dp_data->conf;
+			port->dp_configured = true;
+			dev_info(port->dev, "DP pin assignment 0x%x\n",
+				 port->dp_pin_assignment);
+		}
+	} else if ((conf == TYPEC_STATE_USB) && (port->dp_configured)) {
+		/* may receive ufp device response Exit Mode Command Ack */
+		port->dp_status = 0;
+		port->dp_pin_assignment = 0;
+		port->dp_configured = false;
+		tcpm_send_dp_notify(port);
+	}
+
+	return 0;
+}
+
 static const struct typec_altmode_ops tcpm_altmode_ops = {
 	.enter = tcpm_altmode_enter,
 	.exit = tcpm_altmode_exit,
 	.vdm = tcpm_altmode_vdm,
+	.notify = tcpm_altmode_notify,
 };
 
 /*
@@ -2983,6 +3154,10 @@ static int tcpm_set_vbus(struct tcpm_port *port, bool enable)
 
 	tcpm_log(port, "vbus:=%d charge=%d", enable, port->vbus_charge);
 
+	ret = tcpm_send_vbus_notify(port, enable);
+	if (ret)
+		return ret;
+
 	ret = port->tcpc->set_vbus(port->tcpc, enable, port->vbus_charge);
 	if (ret < 0)
 		return ret;
@@ -3000,6 +3175,11 @@ static int tcpm_set_charge(struct tcpm_port *port, bool charge)
 
 	if (charge != port->vbus_charge) {
 		tcpm_log(port, "vbus=%d charge:=%d", port->vbus_source, charge);
+
+		ret = tcpm_send_vbus_notify(port, port->vbus_source);
+		if (ret < 0)
+			return ret;
+
 		ret = port->tcpc->set_vbus(port->tcpc, port->vbus_source,
 					   charge);
 		if (ret < 0)
@@ -3025,6 +3205,10 @@ static int tcpm_init_vbus(struct tcpm_port *port)
 {
 	int ret;
 
+	ret = tcpm_send_vbus_notify(port, false);
+	if (ret)
+		return ret;
+
 	ret = port->tcpc->set_vbus(port->tcpc, false, false);
 	port->vbus_source = false;
 	port->vbus_charge = false;
@@ -3103,6 +3287,11 @@ static int tcpm_src_attach(struct tcpm_port *port)
 	port->attached = true;
 	port->send_discover = true;
 
+	dev_info(port->dev, "CC connected in %s as DFP\n",
+		 polarity ? "CC2" : "CC1");
+	tcpm_send_orientation_notify(port);
+	tcpm_send_data_role_notify(port, port->attached, port->data_role);
+
 	return 0;
 
 out_disable_vconn:
@@ -3144,7 +3333,17 @@ static void tcpm_reset_port(struct tcpm_port *port)
 	port->vdm_sm_running = false;
 	tcpm_unregister_altmodes(port);
 	tcpm_typec_disconnect(port);
-	port->attached = false;
+	if (port->attached) {
+		port->attached = false;
+		if (port->dp_configured) {
+			port->dp_configured = false;
+			port->dp_pin_assignment = 0;
+			port->dp_status = 0;
+			tcpm_send_dp_notify(port);
+		}
+		tcpm_send_data_role_notify(port, port->attached,
+					   port->data_role);
+	}
 	port->pd_capable = false;
 	port->pps_data.supported = false;
 
@@ -3212,6 +3411,11 @@ static int tcpm_snk_attach(struct tcpm_port *port)
 	port->attached = true;
 	port->send_discover = true;
 
+	dev_info(port->dev, "CC connected in %s as UFP\n",
+		 port->cc1 != TYPEC_CC_OPEN ? "CC1" : "CC2");
+	tcpm_send_orientation_notify(port);
+	tcpm_send_data_role_notify(port, port->attached, port->data_role);
+
 	return 0;
 }
 
@@ -3237,6 +3441,10 @@ static int tcpm_acc_attach(struct tcpm_port *port)
 
 	port->attached = true;
 
+	dev_info(port->dev, "CC connected as Audio Accessory\n");
+	tcpm_send_orientation_notify(port);
+	tcpm_send_data_role_notify(port, port->attached, port->data_role);
+
 	return 0;
 }
 
@@ -3754,6 +3962,9 @@ static void run_state_machine(struct tcpm_port *port)
 
 		tcpm_check_send_discover(port);
 		power_supply_changed(port->psy);
+		if (port->usb_type == POWER_SUPPLY_USB_TYPE_PD ||
+		    port->usb_type == POWER_SUPPLY_USB_TYPE_PD_PPS)
+			tcpm_send_power_change_notify(port);
 		break;
 
 	/* Accessory states */
@@ -3909,14 +4120,36 @@ static void run_state_machine(struct tcpm_port *port)
 		tcpm_set_state(port, ready_state(port), 0);
 		break;
 	case DR_SWAP_CHANGE_DR:
+		/*
+		 * After the DR_swap process is executed, for the
+		 * Rockchip platform, the tcpm framework needs to
+		 * send two notifications to the dwc3 driver, the
+		 * two notifications require a time interval.
+		 *
+		 * (a) For Type-C devices with DP function,
+		 * a notification will be sent here, another
+		 * notification can be sent after receiving
+		 * Attention cmd.
+		 * (b) But for Type-C devices without DP function,
+		 * the tcpm framework will only send a notification once.
+		 *
+		 * Based on the above reasons, it is necessary to start
+		 * the timer here, wait for 20 ms to start work and send
+		 * the notification again.
+		 */
+
 		if (port->data_role == TYPEC_HOST) {
 			tcpm_unregister_altmodes(port);
 			tcpm_set_roles(port, true, port->pwr_role,
 				       TYPEC_DEVICE);
+			tcpm_send_data_role_notify(port, false, TYPEC_HOST);
+			mod_data_role_swap_work(port, SEND_NEW_MODE_NOTIFY_MS);
 		} else {
 			tcpm_set_roles(port, true, port->pwr_role,
 				       TYPEC_HOST);
 			port->send_discover = true;
+			tcpm_send_data_role_notify(port, false, TYPEC_DEVICE);
+			mod_data_role_swap_work(port, SEND_NEW_MODE_NOTIFY_MS);
 		}
 		tcpm_set_state(port, ready_state(port), 0);
 		break;
@@ -4675,6 +4908,17 @@ static void tcpm_enable_frs_work(struct kthread_work *work)
 	mutex_unlock(&port->lock);
 }
 
+static void tcpm_data_role_swap_work(struct kthread_work *work)
+{
+	struct tcpm_port *port =
+		container_of(work, struct tcpm_port, data_role_swap);
+
+	if (tcpm_port_is_disconnected(port))
+		return;
+
+	tcpm_send_data_role_notify(port, true, port->data_role);
+}
+
 static int tcpm_dr_set(const struct typec_capability *cap,
 		       enum typec_data_role data)
 {
@@ -5147,6 +5391,16 @@ static int tcpm_fw_get_caps(struct tcpm_port *port,
 	if (!fwnode)
 		return -EINVAL;
 
+	/* get vbus regulator */
+	port->vbus = devm_regulator_get_optional(port->dev, "vbus");
+	if (IS_ERR(port->vbus)) {
+		if (PTR_ERR(port->vbus) == -EPROBE_DEFER)
+			return PTR_ERR(port->vbus);
+
+		dev_info(port->dev, "may no need vbus regulator\n");
+		port->vbus = NULL;
+	}
+
 	/* USB data support is optional */
 	ret = fwnode_property_read_string(fwnode, "data-role", &cap_str);
 	if (ret == 0) {
@@ -5555,6 +5809,87 @@ static enum hrtimer_restart enable_frs_timer_handler(struct hrtimer *timer)
 	return HRTIMER_NORESTART;
 }
 
+static enum hrtimer_restart data_role_swap_timer_handler(struct hrtimer *timer)
+{
+	struct tcpm_port *port =
+		container_of(timer, struct tcpm_port, data_role_swap_timer);
+
+	kthread_queue_work(port->wq, &port->data_role_swap);
+	return HRTIMER_NORESTART;
+}
+
+static int tcpm_extcon_register(struct tcpm_port *port)
+{
+	struct extcon_dev *extcon;
+	int ret;
+
+	extcon = devm_extcon_dev_allocate(port->dev, tcpm_cable);
+	if (IS_ERR(extcon)) {
+		dev_err(port->dev, "allocate extcon failed\n");
+		return -ENOMEM;
+	}
+
+	ret = devm_extcon_dev_register(port->dev, extcon);
+	if (ret) {
+		dev_err(port->dev, "failed to register extcon: %d\n", ret);
+		goto init_err;
+	}
+
+	ret = extcon_set_property_capability(extcon, EXTCON_USB,
+					     EXTCON_PROP_USB_TYPEC_POLARITY);
+	if (ret) {
+		dev_err(port->dev, "failed to set USB property capability: %d\n", ret);
+		goto init_err;
+	}
+
+	ret = extcon_set_property_capability(extcon, EXTCON_USB_HOST,
+					     EXTCON_PROP_USB_TYPEC_POLARITY);
+	if (ret) {
+		dev_err(port->dev, "failed to set USB_HOST property capability: %d\n", ret);
+		goto init_err;
+	}
+
+	ret = extcon_set_property_capability(extcon, EXTCON_DISP_DP,
+					     EXTCON_PROP_USB_TYPEC_POLARITY);
+	if (ret) {
+		dev_err(port->dev, "failed to set DISP_DP property capability: %d\n", ret);
+		goto init_err;
+	}
+
+	ret = extcon_set_property_capability(extcon, EXTCON_USB, EXTCON_PROP_USB_SS);
+	if (ret) {
+		dev_err(port->dev, "failed to set USB USB_SS property capability: %d\n", ret);
+		goto init_err;
+	}
+
+	ret = extcon_set_property_capability(extcon, EXTCON_USB_HOST, EXTCON_PROP_USB_SS);
+	if (ret) {
+		dev_err(port->dev, "failed to set USB_HOST USB_SS property capability: %d", ret);
+		goto init_err;
+	}
+
+	ret = extcon_set_property_capability(extcon, EXTCON_DISP_DP, EXTCON_PROP_USB_SS);
+	if (ret) {
+		dev_err(port->dev, "failed to set DISP_DP USB_SS property capability: %d", ret);
+		goto init_err;
+	}
+
+	ret = extcon_set_property_capability(extcon, EXTCON_CHG_USB_FAST,
+					    EXTCON_PROP_USB_TYPEC_POLARITY);
+	if (ret) {
+		dev_err(port->dev, "failed to set USB_PD property capability: %d\n", ret);
+		goto init_err;
+	}
+
+	port->extcon = extcon;
+	tcpm_log(port, "init extcon finished\n");
+
+	return 0;
+
+init_err:
+	return ret;
+}
+
 struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
 {
 	struct tcpm_port *port;
@@ -5586,12 +5921,15 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
 	kthread_init_work(&port->vdm_state_machine, vdm_state_machine_work);
 	kthread_init_work(&port->event_work, tcpm_pd_event_handler);
 	kthread_init_work(&port->enable_frs, tcpm_enable_frs_work);
+	kthread_init_work(&port->data_role_swap, tcpm_data_role_swap_work);
 	hrtimer_init(&port->state_machine_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
 	port->state_machine_timer.function = state_machine_timer_handler;
 	hrtimer_init(&port->vdm_state_machine_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
 	port->vdm_state_machine_timer.function = vdm_state_machine_timer_handler;
 	hrtimer_init(&port->enable_frs_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
 	port->enable_frs_timer.function = enable_frs_timer_handler;
+	hrtimer_init(&port->data_role_swap_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+	port->data_role_swap_timer.function = data_role_swap_timer_handler;
 
 	spin_lock_init(&port->pd_event_lock);
 
@@ -5600,6 +5938,11 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
 	init_completion(&port->pps_complete);
 	tcpm_debugfs_init(port);
 
+	/* init extcon */
+	err = tcpm_extcon_register(port);
+	if (err)
+		goto out_destroy_wq;
+
 	err = tcpm_fw_get_caps(port, tcpc->fwnode);
 	if ((err < 0) && tcpc->config)
 		err = tcpm_copy_caps(port, tcpc->config);
@@ -5683,6 +6026,7 @@ void tcpm_unregister_port(struct tcpm_port *port)
 	hrtimer_cancel(&port->enable_frs_timer);
 	hrtimer_cancel(&port->vdm_state_machine_timer);
 	hrtimer_cancel(&port->state_machine_timer);
+	hrtimer_cancel(&port->data_role_swap_timer);
 
 	tcpm_reset_port(port);
 	for (i = 0; i < ARRAY_SIZE(port->port_altmode); i++)
diff --git a/include/linux/usb/typec_dp.h b/include/linux/usb/typec_dp.h
index 55ae781d60a9..a4fe12bf0dbc 100644
--- a/include/linux/usb/typec_dp.h
+++ b/include/linux/usb/typec_dp.h
@@ -92,4 +92,8 @@ enum {
 #define DP_CONF_PIN_ASSIGNEMENT_SHIFT	8
 #define DP_CONF_PIN_ASSIGNEMENT_MASK	GENMASK(15, 8)
 
+/* Helper for setting/getting the pin assignment value to the configuration */
+#define DP_CONF_SET_PIN_ASSIGN(_a_)	((_a_) << 8)
+#define DP_CONF_GET_PIN_ASSIGN(_conf_)	(((_conf_) & GENMASK(15, 8)) >> 8)
+
 #endif /* __USB_TYPEC_DP_H */

commit d80d78c6991570064462b290880bdded3993f13d
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Wed Nov 10 08:45:11 2021 +0800

    mmc: dw_mmc-rockchip: Fix corner cases of tuning
    
    We should avoid rolling the phases if 270 and 0 is both
    fine in tuning. Otherwise it would chose a middle phase
    laid later than 270 which isn't a good.
    
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Fixes: 8d0e8827901a ("mmc: dw_mmc-rockchip: Skip all phases bigger than 270 degrees")
    Change-Id: I87bd3e957623d6a5fdf38226be65564e353b01b6

diff --git a/drivers/mmc/host/dw_mmc-rockchip.c b/drivers/mmc/host/dw_mmc-rockchip.c
index b0673f876317..b63b15719182 100644
--- a/drivers/mmc/host/dw_mmc-rockchip.c
+++ b/drivers/mmc/host/dw_mmc-rockchip.c
@@ -203,7 +203,7 @@ static int dw_mci_rk3288_execute_tuning(struct dw_mci_slot *slot, u32 opcode)
 	unsigned int range_count = 0;
 	int longest_range_len = -1;
 	int longest_range = -1;
-	int middle_phase;
+	int middle_phase, real_middle_phase;
 
 	if (IS_ERR(priv->sample_clk)) {
 		dev_err(host->dev, "Tuning clock (sample_clk) not defined.\n");
@@ -311,12 +311,30 @@ static int dw_mci_rk3288_execute_tuning(struct dw_mci_slot *slot, u32 opcode)
 
 	middle_phase = ranges[longest_range].start + longest_range_len / 2;
 	middle_phase %= priv->num_phases;
+	real_middle_phase = TUNING_ITERATION_TO_PHASE(middle_phase, priv->num_phases);
+
+	/*
+	 * Since we cut out 270 ~ 360, the original algorithm
+	 * still rolling ranges before and after 270 together
+	 * in some corner cases, we should adjust it to avoid
+	 * using any middle phase located between 270 and 360.
+	 * By calculatiion, it happends due to the bad phases
+	 * lay between 90 ~ 180. So others are all fine to chose.
+	 * Pick 270 is a better choice in those cases. In case of
+	 * bad phases exceed 180, the middle phase of rollback
+	 * would be bigger than 315, so we chose 360.
+	 */
+	if (real_middle_phase > 270) {
+		if (real_middle_phase < 315)
+			real_middle_phase = 270;
+		else
+			real_middle_phase = 360;
+	}
+
 	dev_info(host->dev, "Successfully tuned phase to %d\n",
-		 TUNING_ITERATION_TO_PHASE(middle_phase, priv->num_phases));
+		 real_middle_phase);
 
-	clk_set_phase(priv->sample_clk,
-		      TUNING_ITERATION_TO_PHASE(middle_phase,
-						priv->num_phases));
+	clk_set_phase(priv->sample_clk, real_middle_phase);
 
 free:
 	kfree(ranges);

commit 8a6091f2926aeb35567f2cccd6c1332dc9fab0e1
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Fri Nov 5 09:02:23 2021 +0800

    mmc: dw_mmc-rockchip: Restore slot's clock if it's updated
    
    slot's clock is cached before calling ->set_ios for sub-driver.
    If the clock is updated by sub-driver, it's better to restore
    the cached slot's clock. Or we can see a unexpected clock as the
    driver didn't know the slot's clock is updated and still use the
    old clock to calculate divider. So we may see a lower clock. It
    theory, it's won't be a problem because any rate lower than 400k
    should be fine, and we even didn't start issuing any command during
    the lower clock. But still it's right to update slot's clock to reflect
    the correct clock and may fix some potential unknown problems.
    
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: I06581320547bb06c306da57e141d06f9206ea585

diff --git a/drivers/mmc/host/dw_mmc-rockchip.c b/drivers/mmc/host/dw_mmc-rockchip.c
index aec06b9284a8..b0673f876317 100644
--- a/drivers/mmc/host/dw_mmc-rockchip.c
+++ b/drivers/mmc/host/dw_mmc-rockchip.c
@@ -50,8 +50,10 @@ static void dw_mci_rk3288_set_ios(struct dw_mci *host, struct mmc_ios *ios)
 	 * Note: div can only be 0 or 1, but div must be set to 1 for eMMC
 	 * DDR52 8-bit mode.
 	 */
-	if (ios->clock < priv->f_min)
+	if (ios->clock < priv->f_min) {
 		ios->clock = priv->f_min;
+		host->slot->clock = ios->clock;
+	}
 
 	if (ios->bus_width == MMC_BUS_WIDTH_8 &&
 	    ios->timing == MMC_TIMING_MMC_DDR52)

commit 2ab6dde5c9a3c8d11f2d8d84408cc4eddbdc4deb
Author: XiaoTan Luo <lxt@rock-chips.com>
Date:   Wed Nov 10 14:27:22 2021 +0800

    arm64: dts: rockchip: rk3568-evb: fixed hdmi sound probe error
    
    Fixes: 520474071e47 ("arm64: dts: rockchip: rk3568-evb:
    use "rockchip,hdmi" instead of "simple-audio-card"")
    
    Signed-off-by: XiaoTan Luo <lxt@rock-chips.com>
    Change-Id: Ia43b35ebf63f312a5b5de1ad17ed2e5ddd887b62

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
index 18d6115341cd..4263f9d89dff 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
@@ -154,7 +154,7 @@
 		status = "disabled";
 		compatible = "rockchip,hdmi";
 		rockchip,mclk-fs = <128>;
-		rockchip,name = "rockchip,hdmi";
+		rockchip,card-name = "rockchip,hdmi";
 		rockchip,cpu = <&i2s0_8ch>;
 		rockchip,codec = <&hdmi>;
 	};

commit 15ca5d9432e52603a30274d628489f8a568f0fd8
Author: Daniel Vetter <daniel.vetter@ffwll.ch>
Date:   Fri Nov 2 14:25:42 2018 +0100

    UPSTREAM: drm/file: Uncompact the feature flags
    
    This essentially undoes
    
    commit 39868bd7668bd47308b1dfd97c212757caee764f
    Author: Chris Wilson <chris@chris-wilson.co.uk>
    Date:   Tue Oct 29 08:55:58 2013 +0000
    
        drm: Compact booleans within struct drm_file
    
    We do lockless access to these flags everywhere, and it's kinda not a
    great idea to mix lockless and bitfields. Aside from that gcc isn't
    generating great code for these.
    
    If this ever becomes an issue size-wise, I think we need atomic_t here
    and atomic bitflag ops.
    
    Cc: Chris Wilson <chris@chris-wilson.co.uk>
    Cc: David Herrmann <dh.herrmann@gmail.com>
    Cc: Dave Airlie <airlied@redhat.com>
    Acked-by: Chris Wilson <chris@chris-wilson.co.uk>
    Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20181102132543.16486-2-daniel.vetter@ffwll.ch
    (cherry picked from commit 078b7de41249b989a574339078696663e095cf37)
    
    Change-Id: I3643619209bb9e292fb1a3c273f1a52cc4a4de74
    Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>

diff --git a/include/drm/drm_file.h b/include/drm/drm_file.h
index 26485acc51d7..84ac79219e4c 100644
--- a/include/drm/drm_file.h
+++ b/include/drm/drm_file.h
@@ -164,14 +164,14 @@ struct drm_file {
 	 * See also the :ref:`section on primary nodes and authentication
 	 * <drm_primary_node>`.
 	 */
-	unsigned authenticated :1;
+	bool authenticated;
 
 	/**
 	 * @stereo_allowed:
 	 *
 	 * True when the client has asked us to expose stereo 3D mode flags.
 	 */
-	unsigned stereo_allowed :1;
+	bool stereo_allowed;
 
 	/**
 	 * @universal_planes:
@@ -179,10 +179,10 @@ struct drm_file {
 	 * True if client understands CRTC primary planes and cursor planes
 	 * in the plane list. Automatically set when @atomic is set.
 	 */
-	unsigned universal_planes:1;
+	bool universal_planes;
 
 	/** @atomic: True if client understands atomic properties. */
-	unsigned atomic:1;
+	bool atomic;
 
 	/**
 	 * @aspect_ratio_allowed:
@@ -190,14 +190,14 @@ struct drm_file {
 	 * True, if client can handle picture aspect ratios, and has requested
 	 * to pass this information along with the mode.
 	 */
-	unsigned aspect_ratio_allowed:1;
+	bool aspect_ratio_allowed;
 
 	/**
 	 * @writeback_connectors:
 	 *
 	 * True if client understands writeback connectors
 	 */
-	unsigned writeback_connectors:1;
+	bool writeback_connectors;
 
 	/**
 	 * @is_master:
@@ -208,7 +208,7 @@ struct drm_file {
 	 * See also the :ref:`section on primary nodes and authentication
 	 * <drm_primary_node>`.
 	 */
-	unsigned is_master:1;
+	bool is_master;
 
 	/**
 	 * @master:

commit 45298c2d6e50926bc682db71a9d7a4ef58b6f4de
Author: Caesar Wang <wxt@rock-chips.com>
Date:   Mon Nov 8 10:52:30 2021 +0800

    arm64/config: update rk3326/px30_linux_defconfig
    
    Signed-off-by: Caesar Wang <wxt@rock-chips.com>
    Change-Id: I50d05d0e7d6350f64fe1876e26af9e0f111a4673

diff --git a/arch/arm64/configs/px30_linux_defconfig b/arch/arm64/configs/px30_linux_defconfig
index 537c6db800b6..0aaf752f4b51 100644
--- a/arch/arm64/configs/px30_linux_defconfig
+++ b/arch/arm64/configs/px30_linux_defconfig
@@ -1,34 +1,27 @@
 CONFIG_DEFAULT_HOSTNAME="localhost"
 CONFIG_SYSVIPC=y
-CONFIG_FHANDLE=y
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
+CONFIG_PREEMPT_VOLUNTARY=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
 CONFIG_LOG_BUF_SHIFT=18
 CONFIG_CGROUPS=y
+CONFIG_CGROUP_SCHED=y
+CONFIG_CFS_BANDWIDTH=y
 CONFIG_CGROUP_FREEZER=y
-CONFIG_CGROUP_DEVICE=y
 CONFIG_CPUSETS=y
+CONFIG_CGROUP_DEVICE=y
 CONFIG_CGROUP_CPUACCT=y
-CONFIG_CGROUP_SCHED=y
-CONFIG_CFS_BANDWIDTH=y
 CONFIG_NAMESPACES=y
 CONFIG_USER_NS=y
-CONFIG_DEFAULT_USE_ENERGY_AWARE=y
 CONFIG_BLK_DEV_INITRD=y
+# CONFIG_ROCKCHIP_ONE_INITRD is not set
 CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 CONFIG_EMBEDDED=y
 # CONFIG_COMPAT_BRK is not set
 CONFIG_PROFILING=y
-CONFIG_MODULES=y
-CONFIG_MODULE_FORCE_LOAD=y
-CONFIG_MODULE_UNLOAD=y
-CONFIG_MODULE_FORCE_UNLOAD=y
-CONFIG_PARTITION_ADVANCED=y
 CONFIG_ARCH_ROCKCHIP=y
-CONFIG_PCI=y
-CONFIG_PCI_MSI=y
-CONFIG_PCIEPORTBUS=y
-CONFIG_PCIEASPM_POWERSAVE=y
 # CONFIG_ARM64_ERRATUM_826319 is not set
 # CONFIG_ARM64_ERRATUM_827319 is not set
 # CONFIG_ARM64_ERRATUM_824069 is not set
@@ -38,11 +31,7 @@ CONFIG_PCIEASPM_POWERSAVE=y
 # CONFIG_CAVIUM_ERRATUM_23154 is not set
 CONFIG_SCHED_MC=y
 CONFIG_NR_CPUS=8
-CONFIG_PREEMPT_VOLUNTARY=y
-CONFIG_HZ_1000=y
-# CONFIG_COMPACTION is not set
-CONFIG_DEFAULT_MMAP_MIN_ADDR=32768
-CONFIG_ZSMALLOC=y
+CONFIG_HZ_300=y
 CONFIG_SECCOMP=y
 CONFIG_ARMV8_DEPRECATED=y
 CONFIG_SWP_EMULATION=y
@@ -53,17 +42,23 @@ CONFIG_COMPAT=y
 CONFIG_PM_DEBUG=y
 CONFIG_PM_ADVANCED_DEBUG=y
 CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y
+CONFIG_ENERGY_MODEL=y
 CONFIG_CPU_IDLE=y
 CONFIG_ARM_CPUIDLE=y
 CONFIG_CPU_FREQ=y
 CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE=y
-CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
 CONFIG_CPU_FREQ_GOV_POWERSAVE=y
 CONFIG_CPU_FREQ_GOV_USERSPACE=y
 CONFIG_CPU_FREQ_GOV_ONDEMAND=y
 CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
 CONFIG_CPUFREQ_DT=y
 CONFIG_ARM_ROCKCHIP_CPUFREQ=y
+CONFIG_ROCKCHIP_SIP=y
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_COMPACTION is not set
+CONFIG_DEFAULT_MMAP_MIN_ADDR=32768
+CONFIG_CMA=y
+CONFIG_ZSMALLOC=y
 CONFIG_NET=y
 CONFIG_PACKET=y
 CONFIG_UNIX=y
@@ -77,20 +72,20 @@ CONFIG_SYN_COOKIES=y
 # CONFIG_INET_XFRM_MODE_TRANSPORT is not set
 # CONFIG_INET_XFRM_MODE_TUNNEL is not set
 # CONFIG_INET_XFRM_MODE_BEET is not set
-# CONFIG_INET_LRO is not set
 # CONFIG_INET_DIAG is not set
 # CONFIG_INET6_XFRM_MODE_TRANSPORT is not set
 # CONFIG_INET6_XFRM_MODE_TUNNEL is not set
 # CONFIG_INET6_XFRM_MODE_BEET is not set
 # CONFIG_IPV6_SIT is not set
-# CONFIG_ANDROID_PARANOID_NETWORK is not set
+CONFIG_NETFILTER=y
+CONFIG_IP_NF_IPTABLES=y
+CONFIG_IP_NF_MANGLE=y
 CONFIG_BT=y
 CONFIG_BT_RFCOMM=y
 CONFIG_BT_HIDP=y
 CONFIG_BT_HCIBTUSB=y
 CONFIG_BT_HCIUART=y
 CONFIG_BT_HCIUART_ATH3K=y
-CONFIG_BT_HCIUART_LL=y
 CONFIG_BT_HCIBFUSB=y
 CONFIG_BT_HCIVHCI=y
 CONFIG_BT_MRVL=y
@@ -106,94 +101,32 @@ CONFIG_RFKILL=y
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_DEBUG_DEVRES=y
+CONFIG_DMA_CMA=y
 CONFIG_CONNECTOR=y
 CONFIG_ZRAM=y
 CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=1
-CONFIG_BLK_DEV_NVME=y
-CONFIG_ROCKCHIP_SCR=y
-CONFIG_SRAM=y
-CONFIG_SCSI=y
-CONFIG_BLK_DEV_SD=y
-CONFIG_BLK_DEV_SR=y
-CONFIG_SCSI_SCAN_ASYNC=y
-CONFIG_SCSI_SPI_ATTRS=y
-CONFIG_MD=y
 CONFIG_NETDEVICES=y
-# CONFIG_NET_VENDOR_3COM is not set
-# CONFIG_NET_VENDOR_ADAPTEC is not set
-# CONFIG_NET_VENDOR_AGERE is not set
-# CONFIG_NET_VENDOR_ALTEON is not set
-# CONFIG_NET_VENDOR_AMD is not set
-# CONFIG_NET_VENDOR_ARC is not set
-# CONFIG_NET_VENDOR_ATHEROS is not set
-# CONFIG_NET_CADENCE is not set
-# CONFIG_NET_VENDOR_BROADCOM is not set
-# CONFIG_NET_VENDOR_BROCADE is not set
-# CONFIG_NET_VENDOR_CAVIUM is not set
-# CONFIG_NET_VENDOR_CHELSIO is not set
-# CONFIG_NET_VENDOR_CISCO is not set
-# CONFIG_NET_VENDOR_DEC is not set
-# CONFIG_NET_VENDOR_DLINK is not set
-# CONFIG_NET_VENDOR_EMULEX is not set
-# CONFIG_NET_VENDOR_EZCHIP is not set
-# CONFIG_NET_VENDOR_EXAR is not set
-# CONFIG_NET_VENDOR_HISILICON is not set
-# CONFIG_NET_VENDOR_HP is not set
-# CONFIG_NET_VENDOR_INTEL is not set
-# CONFIG_NET_VENDOR_MARVELL is not set
-# CONFIG_NET_VENDOR_MELLANOX is not set
-# CONFIG_NET_VENDOR_MICREL is not set
-# CONFIG_NET_VENDOR_MICROCHIP is not set
-# CONFIG_NET_VENDOR_MYRI is not set
-# CONFIG_NET_VENDOR_NATSEMI is not set
-# CONFIG_NET_VENDOR_NVIDIA is not set
-# CONFIG_NET_VENDOR_OKI is not set
-# CONFIG_NET_PACKET_ENGINE is not set
-# CONFIG_NET_VENDOR_QLOGIC is not set
-# CONFIG_NET_VENDOR_QUALCOMM is not set
-# CONFIG_NET_VENDOR_REALTEK is not set
-# CONFIG_NET_VENDOR_RENESAS is not set
-# CONFIG_NET_VENDOR_RDC is not set
-# CONFIG_NET_VENDOR_ROCKER is not set
-# CONFIG_NET_VENDOR_SAMSUNG is not set
-# CONFIG_NET_VENDOR_SEEQ is not set
-# CONFIG_NET_VENDOR_SILAN is not set
-# CONFIG_NET_VENDOR_SIS is not set
-# CONFIG_NET_VENDOR_SMSC is not set
 CONFIG_STMMAC_ETH=y
-# CONFIG_DWMAC_GENERIC is not set
-# CONFIG_NET_VENDOR_SUN is not set
-# CONFIG_NET_VENDOR_SYNOPSYS is not set
-# CONFIG_NET_VENDOR_TEHUTI is not set
-# CONFIG_NET_VENDOR_TI is not set
-# CONFIG_NET_VENDOR_VIA is not set
-# CONFIG_NET_VENDOR_WIZNET is not set
 CONFIG_ROCKCHIP_PHY=y
 CONFIG_USB_RTL8150=y
 CONFIG_USB_RTL8152=y
 CONFIG_USB_NET_CDC_MBIM=y
-# CONFIG_USB_NET_NET1080 is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-# CONFIG_USB_NET_ZAURUS is not set
 CONFIG_LIBERTAS_THINFIRM=y
-CONFIG_USB_NET_RNDIS_WLAN=y
+CONFIG_MWIFIEX=y
+CONFIG_MWIFIEX_SDIO=y
 CONFIG_WL_ROCKCHIP=y
+CONFIG_WIFI_BUILD_MODULE=y
 CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP=y
 CONFIG_AP6XXX=y
-CONFIG_RTL8188EU=y
-CONFIG_MWIFIEX=y
-CONFIG_MWIFIEX_SDIO=y
+CONFIG_USB_NET_RNDIS_WLAN=y
 CONFIG_INPUT_FF_MEMLESS=y
-# CONFIG_INPUT_MOUSEDEV is not set
 CONFIG_INPUT_EVDEV=y
 CONFIG_KEYBOARD_ADC=y
 # CONFIG_KEYBOARD_ATKBD is not set
 CONFIG_KEYBOARD_GPIO=y
 CONFIG_KEYBOARD_GPIO_POLLED=y
-CONFIG_KEYBOARD_ROCKCHIP=y
-CONFIG_KEYBOARD_CROS_EC=y
 # CONFIG_MOUSE_PS2 is not set
 CONFIG_MOUSE_CYAPA=y
 CONFIG_MOUSE_ELAN_I2C=y
@@ -208,85 +141,65 @@ CONFIG_TOUCHSCREEN_GT1X=y
 CONFIG_ROCKCHIP_REMOTECTL=y
 CONFIG_ROCKCHIP_REMOTECTL_PWM=y
 CONFIG_INPUT_MISC=y
-CONFIG_INPUT_RK8XX_PWRKEY=y
 CONFIG_INPUT_UINPUT=y
-CONFIG_INPUT_GPIO=y
+CONFIG_INPUT_RK805_PWRKEY=y
 # CONFIG_SERIO is not set
-CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
+CONFIG_VT_HW_CONSOLE_BINDING=y
 # CONFIG_LEGACY_PTYS is not set
-# CONFIG_DEVKMEM is not set
 CONFIG_SERIAL_8250=y
 CONFIG_SERIAL_8250_CONSOLE=y
-# CONFIG_SERIAL_8250_PCI is not set
-CONFIG_SERIAL_8250_NR_UARTS=5
-CONFIG_SERIAL_8250_RUNTIME_UARTS=5
+CONFIG_SERIAL_8250_NR_UARTS=10
+CONFIG_SERIAL_8250_RUNTIME_UARTS=10
 CONFIG_SERIAL_8250_DW=y
 CONFIG_SERIAL_OF_PLATFORM=y
-CONFIG_HW_RANDOM=y
+CONFIG_HW_RANDOM_ROCKCHIP=y
 CONFIG_TCG_TPM=y
 CONFIG_TCG_TIS_I2C_INFINEON=y
 CONFIG_I2C_CHARDEV=y
-CONFIG_I2C_MUX=y
 CONFIG_I2C_RK3X=y
-CONFIG_I2C_CROS_EC_TUNNEL=y
 CONFIG_SPI=y
 CONFIG_SPI_BITBANG=y
 CONFIG_SPI_ROCKCHIP=y
 CONFIG_SPI_SPIDEV=y
+CONFIG_PINCTRL_RK805=y
 CONFIG_GPIO_SYSFS=y
 CONFIG_GPIO_GENERIC_PLATFORM=y
-CONFIG_GPIO_RK8XX=y
+CONFIG_POWER_AVS=y
+CONFIG_ROCKCHIP_IODOMAIN=y
+CONFIG_POWER_RESET_GPIO=y
+CONFIG_POWER_RESET_GPIO_RESTART=y
+CONFIG_SYSCON_REBOOT_MODE=y
 CONFIG_BATTERY_SBS=y
 CONFIG_CHARGER_GPIO=y
 CONFIG_CHARGER_BQ24735=y
 CONFIG_BATTERY_RK817=y
 CONFIG_CHARGER_RK817=y
-CONFIG_POWER_RESET_GPIO=y
-CONFIG_POWER_RESET_GPIO_RESTART=y
-CONFIG_SYSCON_REBOOT_MODE=y
-CONFIG_POWER_AVS=y
-CONFIG_ROCKCHIP_IODOMAIN=y
 CONFIG_THERMAL=y
 CONFIG_THERMAL_WRITABLE_TRIPS=y
 CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR=y
 CONFIG_THERMAL_GOV_FAIR_SHARE=y
 CONFIG_THERMAL_GOV_STEP_WISE=y
 CONFIG_CPU_THERMAL=y
-CONFIG_DEVFREQ_THERMAL=y
 CONFIG_ROCKCHIP_THERMAL=y
 CONFIG_WATCHDOG=y
 CONFIG_DW_WATCHDOG=y
-CONFIG_MFD_CROS_EC=y
-CONFIG_MFD_CROS_EC_SPI=y
+CONFIG_MFD_RK618=y
+CONFIG_MFD_RK628=y
 CONFIG_MFD_RK808=y
 CONFIG_MFD_TPS6586X=y
 CONFIG_FUSB_30X=y
 CONFIG_REGULATOR=y
 CONFIG_REGULATOR_DEBUG=y
 CONFIG_REGULATOR_FIXED_VOLTAGE=y
-CONFIG_REGULATOR_ACT8865=y
 CONFIG_REGULATOR_FAN53555=y
 CONFIG_REGULATOR_GPIO=y
-CONFIG_REGULATOR_LP8752=y
-CONFIG_REGULATOR_MP8865=y
 CONFIG_REGULATOR_PWM=y
 CONFIG_REGULATOR_RK808=y
-CONFIG_REGULATOR_RK818=y
-CONFIG_REGULATOR_TPS6586X=y
-CONFIG_REGULATOR_XZ3216=y
 CONFIG_MEDIA_SUPPORT=y
 CONFIG_MEDIA_CAMERA_SUPPORT=y
-CONFIG_MEDIA_RC_SUPPORT=y
+CONFIG_MEDIA_CEC_SUPPORT=y
 CONFIG_MEDIA_CONTROLLER=y
 CONFIG_VIDEO_V4L2_SUBDEV_API=y
-# CONFIG_IR_RC5_DECODER is not set
-# CONFIG_IR_RC6_DECODER is not set
-# CONFIG_IR_JVC_DECODER is not set
-# CONFIG_IR_SONY_DECODER is not set
-# CONFIG_IR_SANYO_DECODER is not set
-# CONFIG_IR_SHARP_DECODER is not set
-# CONFIG_IR_MCE_KBD_DECODER is not set
-# CONFIG_IR_XMP_DECODER is not set
 CONFIG_MEDIA_USB_SUPPORT=y
 CONFIG_USB_VIDEO_CLASS=y
 # CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set
@@ -294,60 +207,81 @@ CONFIG_USB_VIDEO_CLASS=y
 CONFIG_V4L_PLATFORM_DRIVERS=y
 CONFIG_SOC_CAMERA=y
 CONFIG_VIDEO_ROCKCHIP_ISP1=y
+CONFIG_VIDEO_ROCKCHIP_ISP=y
 CONFIG_V4L_MEM2MEM_DRIVERS=y
 CONFIG_VIDEO_ROCKCHIP_RGA=y
 # CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set
-# CONFIG_VIDEO_IR_I2C is not set
+CONFIG_VIDEO_RK628_CSI=y
+CONFIG_VIDEO_LT6911UXC=y
+CONFIG_VIDEO_LT8619C=y
+CONFIG_VIDEO_OS04A10=y
+CONFIG_VIDEO_OV4689=y
 CONFIG_VIDEO_OV5695=y
-# CONFIG_DVB_AU8522_V4L is not set
-# CONFIG_DVB_TUNER_DIB0070 is not set
-# CONFIG_DVB_TUNER_DIB0090 is not set
-# CONFIG_VGA_ARB is not set
+CONFIG_VIDEO_OV7251=y
+CONFIG_VIDEO_OV13850=y
+CONFIG_VIDEO_GC8034=y
 CONFIG_DRM=y
+CONFIG_DRM_IGNORE_IOTCL_PERMIT=y
 CONFIG_DRM_LOAD_EDID_FIRMWARE=y
-CONFIG_DRM_DMA_SYNC=y
 CONFIG_DRM_ROCKCHIP=y
-CONFIG_ROCKCHIP_DW_MIPI_DSI=y
 CONFIG_ROCKCHIP_ANALOGIX_DP=y
+CONFIG_ROCKCHIP_DW_HDMI=y
+CONFIG_ROCKCHIP_DW_MIPI_DSI=y
 CONFIG_ROCKCHIP_LVDS=y
 CONFIG_ROCKCHIP_DRM_TVE=y
+CONFIG_ROCKCHIP_RGB=y
+CONFIG_DRM_ROCKCHIP_RK618=y
 CONFIG_DRM_PANEL_SIMPLE=y
+CONFIG_DRM_SII902X=y
+CONFIG_DRM_DW_HDMI_I2S_AUDIO=y
+CONFIG_DRM_DW_HDMI_CEC=y
+# CONFIG_MALI400_PROFILING is not set
+CONFIG_MALI_SHARED_INTERRUPTS=y
+CONFIG_MALI_DT=y
+CONFIG_MALI_DEVFREQ=y
+CONFIG_MALI_MIDGARD=y
+CONFIG_MALI_EXPERT=y
+CONFIG_MALI_PLATFORM_THIRDPARTY=y
+CONFIG_MALI_PLATFORM_THIRDPARTY_NAME="rk"
+CONFIG_MALI_DEBUG=y
 CONFIG_MALI_PWRSOFT_765=y
 CONFIG_MALI_BIFROST=y
-CONFIG_MALI_BIFROST_DEVFREQ=y
 CONFIG_MALI_PLATFORM_NAME="rk"
-CONFIG_MALI_BIFROST_EXPERT=y
-CONFIG_MALI_BIFROST_DEBUG=y
 CONFIG_BACKLIGHT_LCD_SUPPORT=y
 # CONFIG_LCD_CLASS_DEVICE is not set
-CONFIG_BACKLIGHT_CLASS_DEVICE=y
 CONFIG_BACKLIGHT_PWM=y
-CONFIG_RK_VCODEC=y
+CONFIG_ROCKCHIP_RGA2=y
 CONFIG_ROCKCHIP_MPP_SERVICE=y
-CONFIG_ROCKCHIP_MPP_DEVICE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_ROCKCHIP_MPP_RKVDEC=y
+CONFIG_ROCKCHIP_MPP_RKVDEC2=y
+CONFIG_ROCKCHIP_MPP_RKVENC=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_SOUND=y
 CONFIG_SND=y
-CONFIG_SND_SEQUENCER=y
-CONFIG_SND_SEQ_DUMMY=y
 CONFIG_SND_HRTIMER=y
 CONFIG_SND_DYNAMIC_MINORS=y
 # CONFIG_SND_SUPPORT_OLD_API is not set
-# CONFIG_SND_PROC_FS is not set
-# CONFIG_SND_PCI is not set
+CONFIG_SND_SEQUENCER=y
+CONFIG_SND_SEQ_DUMMY=y
 # CONFIG_SND_SPI is not set
 CONFIG_SND_USB_AUDIO=y
 CONFIG_SND_SOC=y
 CONFIG_SND_SOC_ROCKCHIP=y
-CONFIG_SND_SOC_ROCKCHIP_SPDIF=y
-CONFIG_SND_SOC_ROCKCHIP_MAX98090=y
-CONFIG_SND_SOC_ROCKCHIP_RT5645=y
-CONFIG_SND_SOC_ES8316=y
+CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=y
+CONFIG_SND_SOC_ROCKCHIP_PDM=y
+CONFIG_SND_SOC_ROCKCHIP_MULTICODECS=y
+CONFIG_SND_SOC_ROCKCHIP_RT5651_RK628=y
+CONFIG_SND_SOC_ROCKCHIP_HDMI=y
+CONFIG_SND_SOC_DUMMY_CODEC=y
+CONFIG_SND_SOC_ES7202=y
+CONFIG_SND_SOC_ES7243E=y
 CONFIG_SND_SOC_RK817=y
-CONFIG_SND_SOC_RT5616=y
-CONFIG_SND_SOC_RT5640=y
-CONFIG_SND_SOC_RT5651=y
-CONFIG_SND_SOC_SPDIF=y
+CONFIG_SND_SOC_RK_CODEC_DIGITAL=y
 CONFIG_SND_SIMPLE_CARD=y
 CONFIG_HID_BATTERY_STRENGTH=y
 CONFIG_HIDRAW=y
@@ -360,15 +294,13 @@ CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
 # CONFIG_USB_DEFAULT_PERSIST is not set
 CONFIG_USB_OTG=y
 CONFIG_USB_MON=y
+CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_EHCI_ROOT_HUB_TT=y
 CONFIG_USB_EHCI_HCD_PLATFORM=y
 CONFIG_USB_OHCI_HCD=y
-# CONFIG_USB_OHCI_HCD_PCI is not set
 CONFIG_USB_OHCI_HCD_PLATFORM=y
 CONFIG_USB_ACM=y
-CONFIG_USB_STORAGE=y
-CONFIG_USB_UAS=y
 CONFIG_USB_DWC2=y
 CONFIG_USB_SERIAL=y
 CONFIG_USB_SERIAL_GENERIC=y
@@ -384,68 +316,69 @@ CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_DEBUG_FILES=y
 CONFIG_USB_GADGET_VBUS_DRAW=500
 CONFIG_USB_CONFIGFS=y
+CONFIG_USB_CONFIGFS_UEVENT=y
 CONFIG_USB_CONFIGFS_ACM=y
 CONFIG_USB_CONFIGFS_MASS_STORAGE=y
 CONFIG_USB_CONFIGFS_F_FS=y
-CONFIG_USB_CONFIGFS_UEVENT=y
+CONFIG_USB_CONFIGFS_F_UVC=y
 CONFIG_MMC=y
 CONFIG_MMC_BLOCK_MINORS=32
 CONFIG_MMC_TEST=y
-CONFIG_MMC_SDHCI=y
-CONFIG_MMC_SDHCI_PLTFM=y
-CONFIG_MMC_SDHCI_OF_ARASAN=y
+CONFIG_SDIO_KEEPALIVE=y
 CONFIG_MMC_DW=y
 CONFIG_MMC_DW_ROCKCHIP=y
 CONFIG_NEW_LEDS=y
 CONFIG_LEDS_CLASS=y
 CONFIG_LEDS_GPIO=y
 CONFIG_LEDS_IS31FL32XX=y
+CONFIG_LEDS_TRIGGER_TIMER=y
 CONFIG_RTC_CLASS=y
-CONFIG_RTC_DRV_HYM8563=y
 CONFIG_RTC_DRV_RK808=y
 CONFIG_DMADEVICES=y
 CONFIG_PL330_DMA=y
 CONFIG_STAGING=y
-CONFIG_SENSORS_ISL29018=y
-CONFIG_TSL2583=y
-# CONFIG_ANDROID_TIMED_OUTPUT is not set
 CONFIG_FIQ_DEBUGGER=y
 CONFIG_FIQ_DEBUGGER_NO_SLEEP=y
 CONFIG_FIQ_DEBUGGER_CONSOLE=y
 CONFIG_FIQ_DEBUGGER_CONSOLE_DEFAULT_ENABLE=y
+CONFIG_FIQ_DEBUGGER_TRUST_ZONE=y
+CONFIG_RK_CONSOLE_THREAD=y
 CONFIG_COMMON_CLK_RK808=y
-CONFIG_MAILBOX=y
 CONFIG_ROCKCHIP_IOMMU=y
+CONFIG_CPU_PX30=y
 CONFIG_ROCKCHIP_PM_DOMAINS=y
 CONFIG_ROCKCHIP_PVTM=y
 CONFIG_ROCKCHIP_SUSPEND_MODE=y
-CONFIG_PM_DEVFREQ=y
+CONFIG_ROCKCHIP_VENDOR_STORAGE_UPDATE_LOADER=y
 CONFIG_DEVFREQ_GOV_PERFORMANCE=y
 CONFIG_DEVFREQ_GOV_POWERSAVE=y
 CONFIG_DEVFREQ_GOV_USERSPACE=y
 CONFIG_ARM_ROCKCHIP_BUS_DEVFREQ=y
 CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ=y
-CONFIG_PM_DEVFREQ_EVENT=y
+CONFIG_ARM_ROCKCHIP_DMC_DEBUG=y
+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
+CONFIG_TSL2583=y
 CONFIG_IIO_SYSFS_TRIGGER=y
 CONFIG_PWM=y
 CONFIG_PWM_ROCKCHIP=y
-CONFIG_PHY_ROCKCHIP_USB=y
+CONFIG_PHY_ROCKCHIP_CSI2_DPHY=y
+CONFIG_PHY_ROCKCHIP_INNO_MIPI_DPHY=y
 CONFIG_PHY_ROCKCHIP_INNO_USB2=y
-CONFIG_PHY_ROCKCHIP_EMMC=y
-CONFIG_PHY_ROCKCHIP_DP=y
 CONFIG_PHY_ROCKCHIP_INNO_VIDEO_COMBO_PHY=y
 CONFIG_ANDROID=y
-CONFIG_NVMEM=y
+CONFIG_ROCKCHIP_EFUSE=y
 CONFIG_ROCKCHIP_OTP=y
-CONFIG_ROCKCHIP_SIP=y
-# CONFIG_ACPI is not set
+CONFIG_TEE=y
+CONFIG_OPTEE=y
+CONFIG_RK_HEADSET=y
 CONFIG_EXT4_FS=y
 CONFIG_EXT4_FS_POSIX_ACL=y
 CONFIG_EXT4_FS_SECURITY=y
@@ -458,9 +391,13 @@ CONFIG_ZISOFS=y
 CONFIG_VFAT_FS=y
 CONFIG_FAT_DEFAULT_CODEPAGE=936
 CONFIG_FAT_DEFAULT_IOCHARSET="utf8"
+CONFIG_NTFS_FS=y
 CONFIG_TMPFS=y
 CONFIG_TMPFS_POSIX_ACL=y
 CONFIG_SQUASHFS=y
+CONFIG_PSTORE=y
+CONFIG_PSTORE_CONSOLE=y
+CONFIG_PSTORE_RAM=y
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3_ACL=y
 CONFIG_NFS_V4=y
@@ -471,47 +408,24 @@ CONFIG_NLS_CODEPAGE_936=y
 CONFIG_NLS_ASCII=y
 CONFIG_NLS_ISO8859_1=y
 CONFIG_NLS_UTF8=y
+CONFIG_UNICODE=y
+# CONFIG_CRYPTO_ECHAINIV is not set
+CONFIG_CRC_CCITT=y
+CONFIG_CRC_T10DIF=y
+CONFIG_CRC7=y
+# CONFIG_XZ_DEC_X86 is not set
+# CONFIG_XZ_DEC_POWERPC is not set
+# CONFIG_XZ_DEC_IA64 is not set
+# CONFIG_XZ_DEC_SPARC is not set
 CONFIG_PRINTK_TIME=y
 CONFIG_DYNAMIC_DEBUG=y
 CONFIG_DEBUG_INFO=y
 CONFIG_MAGIC_SYSRQ=y
 CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0
-CONFIG_LOCKUP_DETECTOR=y
-CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y
-CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y
 CONFIG_SCHEDSTATS=y
-CONFIG_TIMER_STATS=y
 CONFIG_DEBUG_SPINLOCK=y
 CONFIG_DEBUG_CREDENTIALS=y
 CONFIG_RCU_CPU_STALL_TIMEOUT=60
 CONFIG_FUNCTION_TRACER=y
 CONFIG_BLK_DEV_IO_TRACE=y
 CONFIG_LKDTM=y
-CONFIG_STRICT_DEVMEM=y
-CONFIG_DEBUG_SET_MODULE_RONX=y
-# CONFIG_CRYPTO_ECHAINIV is not set
-CONFIG_CRYPTO_MD5=y
-CONFIG_CRYPTO_SHA1=y
-CONFIG_CRYPTO_SHA512=y
-CONFIG_CRYPTO_TWOFISH=y
-CONFIG_CRYPTO_ANSI_CPRNG=y
-CONFIG_CRYPTO_USER_API_HASH=y
-CONFIG_CRYPTO_USER_API_SKCIPHER=y
-CONFIG_ASYMMETRIC_KEY_TYPE=y
-CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
-CONFIG_X509_CERTIFICATE_PARSER=y
-CONFIG_PKCS7_MESSAGE_PARSER=y
-CONFIG_SYSTEM_TRUSTED_KEYRING=y
-CONFIG_ARM64_CRYPTO=y
-CONFIG_CRYPTO_SHA1_ARM64_CE=y
-CONFIG_CRYPTO_SHA2_ARM64_CE=y
-CONFIG_CRYPTO_GHASH_ARM64_CE=y
-CONFIG_CRYPTO_AES_ARM64_CE_CCM=y
-CONFIG_CRYPTO_AES_ARM64_CE_BLK=y
-CONFIG_CRC_CCITT=y
-CONFIG_CRC_T10DIF=y
-CONFIG_CRC7=y
-# CONFIG_XZ_DEC_X86 is not set
-# CONFIG_XZ_DEC_POWERPC is not set
-# CONFIG_XZ_DEC_IA64 is not set
-# CONFIG_XZ_DEC_SPARC is not set
diff --git a/arch/arm64/configs/rk3326_linux_defconfig b/arch/arm64/configs/rk3326_linux_defconfig
index 682969aa2b60..63b8cb319281 100644
--- a/arch/arm64/configs/rk3326_linux_defconfig
+++ b/arch/arm64/configs/rk3326_linux_defconfig
@@ -1,34 +1,27 @@
 CONFIG_DEFAULT_HOSTNAME="localhost"
 CONFIG_SYSVIPC=y
-CONFIG_FHANDLE=y
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
+CONFIG_PREEMPT_VOLUNTARY=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
 CONFIG_LOG_BUF_SHIFT=18
 CONFIG_CGROUPS=y
+CONFIG_CGROUP_SCHED=y
+CONFIG_CFS_BANDWIDTH=y
 CONFIG_CGROUP_FREEZER=y
-CONFIG_CGROUP_DEVICE=y
 CONFIG_CPUSETS=y
+CONFIG_CGROUP_DEVICE=y
 CONFIG_CGROUP_CPUACCT=y
-CONFIG_CGROUP_SCHED=y
-CONFIG_CFS_BANDWIDTH=y
 CONFIG_NAMESPACES=y
 CONFIG_USER_NS=y
-CONFIG_DEFAULT_USE_ENERGY_AWARE=y
 CONFIG_BLK_DEV_INITRD=y
+# CONFIG_ROCKCHIP_ONE_INITRD is not set
 CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 CONFIG_EMBEDDED=y
 # CONFIG_COMPAT_BRK is not set
 CONFIG_PROFILING=y
-CONFIG_MODULES=y
-CONFIG_MODULE_FORCE_LOAD=y
-CONFIG_MODULE_UNLOAD=y
-CONFIG_MODULE_FORCE_UNLOAD=y
-CONFIG_PARTITION_ADVANCED=y
 CONFIG_ARCH_ROCKCHIP=y
-CONFIG_PCI=y
-CONFIG_PCI_MSI=y
-CONFIG_PCIEPORTBUS=y
-CONFIG_PCIEASPM_POWERSAVE=y
 # CONFIG_ARM64_ERRATUM_826319 is not set
 # CONFIG_ARM64_ERRATUM_827319 is not set
 # CONFIG_ARM64_ERRATUM_824069 is not set
@@ -38,11 +31,7 @@ CONFIG_PCIEASPM_POWERSAVE=y
 # CONFIG_CAVIUM_ERRATUM_23154 is not set
 CONFIG_SCHED_MC=y
 CONFIG_NR_CPUS=8
-CONFIG_PREEMPT_VOLUNTARY=y
-CONFIG_HZ_1000=y
-# CONFIG_COMPACTION is not set
-CONFIG_DEFAULT_MMAP_MIN_ADDR=32768
-CONFIG_ZSMALLOC=y
+CONFIG_HZ_300=y
 CONFIG_SECCOMP=y
 CONFIG_ARMV8_DEPRECATED=y
 CONFIG_SWP_EMULATION=y
@@ -53,17 +42,23 @@ CONFIG_COMPAT=y
 CONFIG_PM_DEBUG=y
 CONFIG_PM_ADVANCED_DEBUG=y
 CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y
+CONFIG_ENERGY_MODEL=y
 CONFIG_CPU_IDLE=y
 CONFIG_ARM_CPUIDLE=y
 CONFIG_CPU_FREQ=y
 CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE=y
-CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
 CONFIG_CPU_FREQ_GOV_POWERSAVE=y
 CONFIG_CPU_FREQ_GOV_USERSPACE=y
 CONFIG_CPU_FREQ_GOV_ONDEMAND=y
 CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
 CONFIG_CPUFREQ_DT=y
 CONFIG_ARM_ROCKCHIP_CPUFREQ=y
+CONFIG_ROCKCHIP_SIP=y
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_COMPACTION is not set
+CONFIG_DEFAULT_MMAP_MIN_ADDR=32768
+CONFIG_CMA=y
+CONFIG_ZSMALLOC=y
 CONFIG_NET=y
 CONFIG_PACKET=y
 CONFIG_UNIX=y
@@ -77,20 +72,20 @@ CONFIG_SYN_COOKIES=y
 # CONFIG_INET_XFRM_MODE_TRANSPORT is not set
 # CONFIG_INET_XFRM_MODE_TUNNEL is not set
 # CONFIG_INET_XFRM_MODE_BEET is not set
-# CONFIG_INET_LRO is not set
 # CONFIG_INET_DIAG is not set
 # CONFIG_INET6_XFRM_MODE_TRANSPORT is not set
 # CONFIG_INET6_XFRM_MODE_TUNNEL is not set
 # CONFIG_INET6_XFRM_MODE_BEET is not set
 # CONFIG_IPV6_SIT is not set
-# CONFIG_ANDROID_PARANOID_NETWORK is not set
+CONFIG_NETFILTER=y
+CONFIG_IP_NF_IPTABLES=y
+CONFIG_IP_NF_MANGLE=y
 CONFIG_BT=y
 CONFIG_BT_RFCOMM=y
 CONFIG_BT_HIDP=y
 CONFIG_BT_HCIBTUSB=y
 CONFIG_BT_HCIUART=y
 CONFIG_BT_HCIUART_ATH3K=y
-CONFIG_BT_HCIUART_LL=y
 CONFIG_BT_HCIBFUSB=y
 CONFIG_BT_HCIVHCI=y
 CONFIG_BT_MRVL=y
@@ -106,46 +101,32 @@ CONFIG_RFKILL=y
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_DEBUG_DEVRES=y
+CONFIG_DMA_CMA=y
 CONFIG_CONNECTOR=y
 CONFIG_ZRAM=y
 CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=1
-CONFIG_BLK_DEV_NVME=y
-CONFIG_ROCKCHIP_SCR=y
-CONFIG_SRAM=y
-CONFIG_SCSI=y
-CONFIG_BLK_DEV_SD=y
-CONFIG_BLK_DEV_SR=y
-CONFIG_SCSI_SCAN_ASYNC=y
-CONFIG_SCSI_SPI_ATTRS=y
-CONFIG_MD=y
 CONFIG_NETDEVICES=y
-# CONFIG_ETHERNET is not set
+CONFIG_STMMAC_ETH=y
 CONFIG_ROCKCHIP_PHY=y
 CONFIG_USB_RTL8150=y
 CONFIG_USB_RTL8152=y
 CONFIG_USB_NET_CDC_MBIM=y
-# CONFIG_USB_NET_NET1080 is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-# CONFIG_USB_NET_ZAURUS is not set
 CONFIG_LIBERTAS_THINFIRM=y
-CONFIG_USB_NET_RNDIS_WLAN=y
+CONFIG_MWIFIEX=y
+CONFIG_MWIFIEX_SDIO=y
 CONFIG_WL_ROCKCHIP=y
+CONFIG_WIFI_BUILD_MODULE=y
 CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP=y
 CONFIG_AP6XXX=y
-CONFIG_RTL8188EU=y
-CONFIG_MWIFIEX=y
-CONFIG_MWIFIEX_SDIO=y
+CONFIG_USB_NET_RNDIS_WLAN=y
 CONFIG_INPUT_FF_MEMLESS=y
-# CONFIG_INPUT_MOUSEDEV is not set
 CONFIG_INPUT_EVDEV=y
 CONFIG_KEYBOARD_ADC=y
 # CONFIG_KEYBOARD_ATKBD is not set
 CONFIG_KEYBOARD_GPIO=y
 CONFIG_KEYBOARD_GPIO_POLLED=y
-CONFIG_KEYBOARD_ROCKCHIP=y
-CONFIG_KEYBOARD_CROS_EC=y
 # CONFIG_MOUSE_PS2 is not set
 CONFIG_MOUSE_CYAPA=y
 CONFIG_MOUSE_ELAN_I2C=y
@@ -160,149 +141,144 @@ CONFIG_TOUCHSCREEN_GT1X=y
 CONFIG_ROCKCHIP_REMOTECTL=y
 CONFIG_ROCKCHIP_REMOTECTL_PWM=y
 CONFIG_INPUT_MISC=y
-CONFIG_INPUT_RK8XX_PWRKEY=y
 CONFIG_INPUT_UINPUT=y
-CONFIG_INPUT_GPIO=y
+CONFIG_INPUT_RK805_PWRKEY=y
 # CONFIG_SERIO is not set
-CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
+CONFIG_VT_HW_CONSOLE_BINDING=y
 # CONFIG_LEGACY_PTYS is not set
-# CONFIG_DEVKMEM is not set
 CONFIG_SERIAL_8250=y
 CONFIG_SERIAL_8250_CONSOLE=y
-# CONFIG_SERIAL_8250_PCI is not set
-CONFIG_SERIAL_8250_NR_UARTS=5
-CONFIG_SERIAL_8250_RUNTIME_UARTS=5
+CONFIG_SERIAL_8250_NR_UARTS=10
+CONFIG_SERIAL_8250_RUNTIME_UARTS=10
 CONFIG_SERIAL_8250_DW=y
 CONFIG_SERIAL_OF_PLATFORM=y
-CONFIG_HW_RANDOM=y
+CONFIG_HW_RANDOM_ROCKCHIP=y
 CONFIG_TCG_TPM=y
 CONFIG_TCG_TIS_I2C_INFINEON=y
 CONFIG_I2C_CHARDEV=y
-CONFIG_I2C_MUX=y
 CONFIG_I2C_RK3X=y
-CONFIG_I2C_CROS_EC_TUNNEL=y
 CONFIG_SPI=y
 CONFIG_SPI_BITBANG=y
 CONFIG_SPI_ROCKCHIP=y
 CONFIG_SPI_SPIDEV=y
-CONFIG_PTP_1588_CLOCK=y
+CONFIG_PINCTRL_RK805=y
 CONFIG_GPIO_SYSFS=y
 CONFIG_GPIO_GENERIC_PLATFORM=y
-CONFIG_GPIO_RK8XX=y
+CONFIG_POWER_AVS=y
+CONFIG_ROCKCHIP_IODOMAIN=y
+CONFIG_POWER_RESET_GPIO=y
+CONFIG_POWER_RESET_GPIO_RESTART=y
+CONFIG_SYSCON_REBOOT_MODE=y
 CONFIG_BATTERY_SBS=y
 CONFIG_CHARGER_GPIO=y
 CONFIG_CHARGER_BQ24735=y
 CONFIG_BATTERY_RK817=y
 CONFIG_CHARGER_RK817=y
-CONFIG_POWER_RESET_GPIO=y
-CONFIG_POWER_RESET_GPIO_RESTART=y
-CONFIG_SYSCON_REBOOT_MODE=y
-CONFIG_POWER_AVS=y
-CONFIG_ROCKCHIP_IODOMAIN=y
 CONFIG_THERMAL=y
 CONFIG_THERMAL_WRITABLE_TRIPS=y
 CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR=y
 CONFIG_THERMAL_GOV_FAIR_SHARE=y
 CONFIG_THERMAL_GOV_STEP_WISE=y
 CONFIG_CPU_THERMAL=y
-CONFIG_DEVFREQ_THERMAL=y
 CONFIG_ROCKCHIP_THERMAL=y
 CONFIG_WATCHDOG=y
 CONFIG_DW_WATCHDOG=y
-CONFIG_MFD_CROS_EC=y
-CONFIG_MFD_CROS_EC_SPI=y
+CONFIG_MFD_RK618=y
+CONFIG_MFD_RK628=y
 CONFIG_MFD_RK808=y
 CONFIG_MFD_TPS6586X=y
 CONFIG_FUSB_30X=y
 CONFIG_REGULATOR=y
 CONFIG_REGULATOR_DEBUG=y
 CONFIG_REGULATOR_FIXED_VOLTAGE=y
-CONFIG_REGULATOR_ACT8865=y
 CONFIG_REGULATOR_FAN53555=y
 CONFIG_REGULATOR_GPIO=y
-CONFIG_REGULATOR_LP8752=y
-CONFIG_REGULATOR_MP8865=y
 CONFIG_REGULATOR_PWM=y
 CONFIG_REGULATOR_RK808=y
-CONFIG_REGULATOR_RK818=y
-CONFIG_REGULATOR_TPS6586X=y
-CONFIG_REGULATOR_XZ3216=y
 CONFIG_MEDIA_SUPPORT=y
 CONFIG_MEDIA_CAMERA_SUPPORT=y
-CONFIG_MEDIA_RC_SUPPORT=y
+CONFIG_MEDIA_CEC_SUPPORT=y
 CONFIG_MEDIA_CONTROLLER=y
 CONFIG_VIDEO_V4L2_SUBDEV_API=y
-# CONFIG_IR_RC5_DECODER is not set
-# CONFIG_IR_RC6_DECODER is not set
-# CONFIG_IR_JVC_DECODER is not set
-# CONFIG_IR_SONY_DECODER is not set
-# CONFIG_IR_SANYO_DECODER is not set
-# CONFIG_IR_SHARP_DECODER is not set
-# CONFIG_IR_MCE_KBD_DECODER is not set
-# CONFIG_IR_XMP_DECODER is not set
 CONFIG_MEDIA_USB_SUPPORT=y
 CONFIG_USB_VIDEO_CLASS=y
 # CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set
 # CONFIG_USB_GSPCA is not set
 CONFIG_V4L_PLATFORM_DRIVERS=y
 CONFIG_SOC_CAMERA=y
-CONFIG_VIDEO_ROCKCHIP_CIF=y
 CONFIG_VIDEO_ROCKCHIP_ISP1=y
+CONFIG_VIDEO_ROCKCHIP_ISP=y
 CONFIG_V4L_MEM2MEM_DRIVERS=y
 CONFIG_VIDEO_ROCKCHIP_RGA=y
 # CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set
-# CONFIG_VIDEO_IR_I2C is not set
+CONFIG_VIDEO_RK628_CSI=y
+CONFIG_VIDEO_LT6911UXC=y
+CONFIG_VIDEO_LT8619C=y
+CONFIG_VIDEO_OS04A10=y
+CONFIG_VIDEO_OV4689=y
 CONFIG_VIDEO_OV5695=y
-CONFIG_VIDEO_GC2155=y
-# CONFIG_DVB_AU8522_V4L is not set
-# CONFIG_DVB_TUNER_DIB0070 is not set
-# CONFIG_DVB_TUNER_DIB0090 is not set
-# CONFIG_VGA_ARB is not set
+CONFIG_VIDEO_OV7251=y
+CONFIG_VIDEO_OV13850=y
+CONFIG_VIDEO_GC8034=y
 CONFIG_DRM=y
+CONFIG_DRM_IGNORE_IOTCL_PERMIT=y
 CONFIG_DRM_LOAD_EDID_FIRMWARE=y
-CONFIG_DRM_DMA_SYNC=y
 CONFIG_DRM_ROCKCHIP=y
-CONFIG_ROCKCHIP_DW_MIPI_DSI=y
 CONFIG_ROCKCHIP_ANALOGIX_DP=y
+CONFIG_ROCKCHIP_DW_HDMI=y
+CONFIG_ROCKCHIP_DW_MIPI_DSI=y
 CONFIG_ROCKCHIP_LVDS=y
 CONFIG_ROCKCHIP_DRM_TVE=y
+CONFIG_ROCKCHIP_RGB=y
+CONFIG_DRM_ROCKCHIP_RK618=y
 CONFIG_DRM_PANEL_SIMPLE=y
+CONFIG_DRM_SII902X=y
+CONFIG_DRM_DW_HDMI_I2S_AUDIO=y
+CONFIG_DRM_DW_HDMI_CEC=y
+CONFIG_MALI_DEVFREQ=y
+CONFIG_MALI_MIDGARD=y
+CONFIG_MALI_EXPERT=y
+CONFIG_MALI_PLATFORM_THIRDPARTY=y
+CONFIG_MALI_PLATFORM_THIRDPARTY_NAME="rk"
+CONFIG_MALI_DEBUG=y
 CONFIG_MALI_PWRSOFT_765=y
 CONFIG_MALI_BIFROST=y
-CONFIG_MALI_BIFROST_DEVFREQ=y
 CONFIG_MALI_PLATFORM_NAME="rk"
-CONFIG_MALI_BIFROST_EXPERT=y
-CONFIG_MALI_BIFROST_DEBUG=y
 CONFIG_BACKLIGHT_LCD_SUPPORT=y
 # CONFIG_LCD_CLASS_DEVICE is not set
-CONFIG_BACKLIGHT_CLASS_DEVICE=y
 CONFIG_BACKLIGHT_PWM=y
-CONFIG_RK_VCODEC=y
+CONFIG_ROCKCHIP_RGA2=y
 CONFIG_ROCKCHIP_MPP_SERVICE=y
-CONFIG_ROCKCHIP_MPP_DEVICE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_ROCKCHIP_MPP_RKVDEC=y
+CONFIG_ROCKCHIP_MPP_RKVDEC2=y
+CONFIG_ROCKCHIP_MPP_RKVENC=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_SOUND=y
 CONFIG_SND=y
-CONFIG_SND_SEQUENCER=y
-CONFIG_SND_SEQ_DUMMY=y
 CONFIG_SND_HRTIMER=y
 CONFIG_SND_DYNAMIC_MINORS=y
 # CONFIG_SND_SUPPORT_OLD_API is not set
-# CONFIG_SND_PROC_FS is not set
-# CONFIG_SND_PCI is not set
+CONFIG_SND_SEQUENCER=y
+CONFIG_SND_SEQ_DUMMY=y
 # CONFIG_SND_SPI is not set
 CONFIG_SND_USB_AUDIO=y
 CONFIG_SND_SOC=y
 CONFIG_SND_SOC_ROCKCHIP=y
-CONFIG_SND_SOC_ROCKCHIP_SPDIF=y
-CONFIG_SND_SOC_ROCKCHIP_MAX98090=y
-CONFIG_SND_SOC_ROCKCHIP_RT5645=y
-CONFIG_SND_SOC_ES8316=y
+CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=y
+CONFIG_SND_SOC_ROCKCHIP_PDM=y
+CONFIG_SND_SOC_ROCKCHIP_MULTICODECS=y
+CONFIG_SND_SOC_ROCKCHIP_RT5651_RK628=y
+CONFIG_SND_SOC_ROCKCHIP_HDMI=y
+CONFIG_SND_SOC_DUMMY_CODEC=y
+CONFIG_SND_SOC_ES7202=y
+CONFIG_SND_SOC_ES7243E=y
 CONFIG_SND_SOC_RK817=y
-CONFIG_SND_SOC_RT5616=y
-CONFIG_SND_SOC_RT5640=y
-CONFIG_SND_SOC_RT5651=y
-CONFIG_SND_SOC_SPDIF=y
+CONFIG_SND_SOC_RK_CODEC_DIGITAL=y
 CONFIG_SND_SIMPLE_CARD=y
 CONFIG_HID_BATTERY_STRENGTH=y
 CONFIG_HIDRAW=y
@@ -315,15 +291,13 @@ CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
 # CONFIG_USB_DEFAULT_PERSIST is not set
 CONFIG_USB_OTG=y
 CONFIG_USB_MON=y
+CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_EHCI_ROOT_HUB_TT=y
 CONFIG_USB_EHCI_HCD_PLATFORM=y
 CONFIG_USB_OHCI_HCD=y
-# CONFIG_USB_OHCI_HCD_PCI is not set
 CONFIG_USB_OHCI_HCD_PLATFORM=y
 CONFIG_USB_ACM=y
-CONFIG_USB_STORAGE=y
-CONFIG_USB_UAS=y
 CONFIG_USB_DWC2=y
 CONFIG_USB_SERIAL=y
 CONFIG_USB_SERIAL_GENERIC=y
@@ -339,68 +313,69 @@ CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_DEBUG_FILES=y
 CONFIG_USB_GADGET_VBUS_DRAW=500
 CONFIG_USB_CONFIGFS=y
+CONFIG_USB_CONFIGFS_UEVENT=y
 CONFIG_USB_CONFIGFS_ACM=y
 CONFIG_USB_CONFIGFS_MASS_STORAGE=y
 CONFIG_USB_CONFIGFS_F_FS=y
-CONFIG_USB_CONFIGFS_UEVENT=y
+CONFIG_USB_CONFIGFS_F_UVC=y
 CONFIG_MMC=y
 CONFIG_MMC_BLOCK_MINORS=32
 CONFIG_MMC_TEST=y
-CONFIG_MMC_SDHCI=y
-CONFIG_MMC_SDHCI_PLTFM=y
-CONFIG_MMC_SDHCI_OF_ARASAN=y
+CONFIG_SDIO_KEEPALIVE=y
 CONFIG_MMC_DW=y
 CONFIG_MMC_DW_ROCKCHIP=y
 CONFIG_NEW_LEDS=y
 CONFIG_LEDS_CLASS=y
 CONFIG_LEDS_GPIO=y
 CONFIG_LEDS_IS31FL32XX=y
+CONFIG_LEDS_TRIGGER_TIMER=y
 CONFIG_RTC_CLASS=y
-CONFIG_RTC_DRV_HYM8563=y
 CONFIG_RTC_DRV_RK808=y
 CONFIG_DMADEVICES=y
 CONFIG_PL330_DMA=y
 CONFIG_STAGING=y
-CONFIG_SENSORS_ISL29018=y
-CONFIG_TSL2583=y
-# CONFIG_ANDROID_TIMED_OUTPUT is not set
 CONFIG_FIQ_DEBUGGER=y
 CONFIG_FIQ_DEBUGGER_NO_SLEEP=y
 CONFIG_FIQ_DEBUGGER_CONSOLE=y
 CONFIG_FIQ_DEBUGGER_CONSOLE_DEFAULT_ENABLE=y
+CONFIG_FIQ_DEBUGGER_TRUST_ZONE=y
+CONFIG_RK_CONSOLE_THREAD=y
 CONFIG_COMMON_CLK_RK808=y
-CONFIG_MAILBOX=y
 CONFIG_ROCKCHIP_IOMMU=y
+CONFIG_CPU_PX30=y
 CONFIG_ROCKCHIP_PM_DOMAINS=y
 CONFIG_ROCKCHIP_PVTM=y
 CONFIG_ROCKCHIP_SUSPEND_MODE=y
-CONFIG_PM_DEVFREQ=y
+CONFIG_ROCKCHIP_VENDOR_STORAGE_UPDATE_LOADER=y
 CONFIG_DEVFREQ_GOV_PERFORMANCE=y
 CONFIG_DEVFREQ_GOV_POWERSAVE=y
 CONFIG_DEVFREQ_GOV_USERSPACE=y
 CONFIG_ARM_ROCKCHIP_BUS_DEVFREQ=y
 CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ=y
-CONFIG_PM_DEVFREQ_EVENT=y
+CONFIG_ARM_ROCKCHIP_DMC_DEBUG=y
+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
+CONFIG_TSL2583=y
 CONFIG_IIO_SYSFS_TRIGGER=y
 CONFIG_PWM=y
 CONFIG_PWM_ROCKCHIP=y
-CONFIG_PHY_ROCKCHIP_USB=y
+CONFIG_PHY_ROCKCHIP_CSI2_DPHY=y
+CONFIG_PHY_ROCKCHIP_INNO_MIPI_DPHY=y
 CONFIG_PHY_ROCKCHIP_INNO_USB2=y
-CONFIG_PHY_ROCKCHIP_EMMC=y
-CONFIG_PHY_ROCKCHIP_DP=y
 CONFIG_PHY_ROCKCHIP_INNO_VIDEO_COMBO_PHY=y
 CONFIG_ANDROID=y
-CONFIG_NVMEM=y
+CONFIG_ROCKCHIP_EFUSE=y
 CONFIG_ROCKCHIP_OTP=y
-CONFIG_ROCKCHIP_SIP=y
-# CONFIG_ACPI is not set
+CONFIG_TEE=y
+CONFIG_OPTEE=y
+CONFIG_RK_HEADSET=y
 CONFIG_EXT4_FS=y
 CONFIG_EXT4_FS_POSIX_ACL=y
 CONFIG_EXT4_FS_SECURITY=y
@@ -413,9 +388,13 @@ CONFIG_ZISOFS=y
 CONFIG_VFAT_FS=y
 CONFIG_FAT_DEFAULT_CODEPAGE=936
 CONFIG_FAT_DEFAULT_IOCHARSET="utf8"
+CONFIG_NTFS_FS=y
 CONFIG_TMPFS=y
 CONFIG_TMPFS_POSIX_ACL=y
 CONFIG_SQUASHFS=y
+CONFIG_PSTORE=y
+CONFIG_PSTORE_CONSOLE=y
+CONFIG_PSTORE_RAM=y
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3_ACL=y
 CONFIG_NFS_V4=y
@@ -426,47 +405,24 @@ CONFIG_NLS_CODEPAGE_936=y
 CONFIG_NLS_ASCII=y
 CONFIG_NLS_ISO8859_1=y
 CONFIG_NLS_UTF8=y
+CONFIG_UNICODE=y
+# CONFIG_CRYPTO_ECHAINIV is not set
+CONFIG_CRC_CCITT=y
+CONFIG_CRC_T10DIF=y
+CONFIG_CRC7=y
+# CONFIG_XZ_DEC_X86 is not set
+# CONFIG_XZ_DEC_POWERPC is not set
+# CONFIG_XZ_DEC_IA64 is not set
+# CONFIG_XZ_DEC_SPARC is not set
 CONFIG_PRINTK_TIME=y
 CONFIG_DYNAMIC_DEBUG=y
 CONFIG_DEBUG_INFO=y
 CONFIG_MAGIC_SYSRQ=y
 CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0
-CONFIG_LOCKUP_DETECTOR=y
-CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y
-CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y
 CONFIG_SCHEDSTATS=y
-CONFIG_TIMER_STATS=y
 CONFIG_DEBUG_SPINLOCK=y
 CONFIG_DEBUG_CREDENTIALS=y
 CONFIG_RCU_CPU_STALL_TIMEOUT=60
 CONFIG_FUNCTION_TRACER=y
 CONFIG_BLK_DEV_IO_TRACE=y
 CONFIG_LKDTM=y
-CONFIG_STRICT_DEVMEM=y
-CONFIG_DEBUG_SET_MODULE_RONX=y
-# CONFIG_CRYPTO_ECHAINIV is not set
-CONFIG_CRYPTO_MD5=y
-CONFIG_CRYPTO_SHA1=y
-CONFIG_CRYPTO_SHA512=y
-CONFIG_CRYPTO_TWOFISH=y
-CONFIG_CRYPTO_ANSI_CPRNG=y
-CONFIG_CRYPTO_USER_API_HASH=y
-CONFIG_CRYPTO_USER_API_SKCIPHER=y
-CONFIG_ASYMMETRIC_KEY_TYPE=y
-CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
-CONFIG_X509_CERTIFICATE_PARSER=y
-CONFIG_PKCS7_MESSAGE_PARSER=y
-CONFIG_SYSTEM_TRUSTED_KEYRING=y
-CONFIG_ARM64_CRYPTO=y
-CONFIG_CRYPTO_SHA1_ARM64_CE=y
-CONFIG_CRYPTO_SHA2_ARM64_CE=y
-CONFIG_CRYPTO_GHASH_ARM64_CE=y
-CONFIG_CRYPTO_AES_ARM64_CE_CCM=y
-CONFIG_CRYPTO_AES_ARM64_CE_BLK=y
-CONFIG_CRC_CCITT=y
-CONFIG_CRC_T10DIF=y
-CONFIG_CRC7=y
-# CONFIG_XZ_DEC_X86 is not set
-# CONFIG_XZ_DEC_POWERPC is not set
-# CONFIG_XZ_DEC_IA64 is not set
-# CONFIG_XZ_DEC_SPARC is not set

commit bcd39e1a04631b98d8823967548b54ae20f99c60
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Fri Sep 3 14:38:16 2021 +0800

    drm: rockchip: gem: create sg with size according to swiotlb limit
    
    The swiotlb limit the log of the size of each IO TLB slab by
    IO_TLB_SHIFT, and limit the Maximum allowable number of contiguous slabs
    to map by IO_TLB_SEGSIZE.
    
    Since memory from rockchip gem maybe accessed by some processor only
    with 32 bit address, so the gem should limit the sg size according to
    the swiotlb limit.
    
    The swiotlb limit single tlb size to IO_TLB_SEGSIZE * (1 << IO_TLB_SHIFT)
    
    Change-Id: Ifa18068ea30e0f9277521d4efa8a55fdce5dd264
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
index 4d991009df84..b02ce9e301d7 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
@@ -22,6 +22,7 @@
 #include <linux/iommu.h>
 #include <linux/pagemap.h>
 #include <linux/vmalloc.h>
+#include <linux/swiotlb.h>
 
 #include "rockchip_drm_drv.h"
 #include "rockchip_drm_gem.h"
@@ -103,6 +104,30 @@ static void rockchip_gem_free_list(struct list_head lists[])
 	}
 }
 
+static struct sg_table *rockchip_gem_pages_to_sg(struct page **pages, unsigned int nr_pages)
+{
+	struct sg_table *sg = NULL;
+	int ret;
+#define SG_SIZE_MAX	(IO_TLB_SEGSIZE * (1 << IO_TLB_SHIFT))
+
+	sg = kmalloc(sizeof(struct sg_table), GFP_KERNEL);
+	if (!sg) {
+		ret = -ENOMEM;
+		goto out;
+	}
+
+	ret = __sg_alloc_table_from_pages(sg, pages, nr_pages, 0,
+					  nr_pages << PAGE_SHIFT,
+					  SG_SIZE_MAX, GFP_KERNEL);
+	if (ret)
+		goto out;
+
+	return sg;
+out:
+	kfree(sg);
+	return ERR_PTR(ret);
+}
+
 static int rockchip_gem_get_pages(struct rockchip_gem_object *rk_obj)
 {
 	struct drm_device *drm = rk_obj->base.dev;
@@ -199,7 +224,7 @@ static int rockchip_gem_get_pages(struct rockchip_gem_object *rk_obj)
 	DRM_DEBUG_KMS("%s, %d, end = %d, n_pages = %d\n", __func__, __LINE__,
 			end, n_pages);
 
-	rk_obj->sgt = drm_prime_pages_to_sg(dst_pages, rk_obj->num_pages);
+	rk_obj->sgt = rockchip_gem_pages_to_sg(dst_pages, rk_obj->num_pages);
 
 	if (IS_ERR(rk_obj->sgt)) {
 		ret = PTR_ERR(rk_obj->sgt);
@@ -369,7 +394,7 @@ static int rockchip_gem_alloc_secure(struct rockchip_gem_object *rk_obj)
 		paddr += PAGE_SIZE;
 		i++;
 	}
-	sgt = drm_prime_pages_to_sg(rk_obj->pages, rk_obj->num_pages);
+	sgt = rockchip_gem_pages_to_sg(rk_obj->pages, rk_obj->num_pages);
 	if (IS_ERR(sgt)) {
 		ret = PTR_ERR(sgt);
 		goto err_free_pages;
@@ -808,7 +833,7 @@ struct sg_table *rockchip_gem_prime_get_sg_table(struct drm_gem_object *obj)
 	int ret;
 
 	if (rk_obj->pages)
-		return drm_prime_pages_to_sg(rk_obj->pages, rk_obj->num_pages);
+		return rockchip_gem_pages_to_sg(rk_obj->pages, rk_obj->num_pages);
 
 	sgt = kzalloc(sizeof(*sgt), GFP_KERNEL);
 	if (!sgt)

commit 45c480b553c90178bf1cc30fd9054c75a31bf599
Merge: 65de976f5d55 3033e5726834
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Sat Nov 6 14:06:59 2021 +0100

    Merge 4.19.216 into android-4.19-stable
    
    Changes in 4.19.216
            scsi: core: Put LLD module refcnt after SCSI device is released
            media: firewire: firedtv-avc: fix a buffer overflow in avc_ca_pmt()
            IB/qib: Use struct_size() helper
            IB/qib: Protect from buffer overflow in struct qib_user_sdma_pkt fields
            sfc: Fix reading non-legacy supported link modes
            arch: pgtable: define MAX_POSSIBLE_PHYSMEM_BITS where needed
            ARM: 9120/1: Revert "amba: make use of -1 IRQs warn"
            Linux 4.19.216
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I64effccc85e57b1850ba7139177282da9b122929

commit 3033e5726834e4c9c8c48cdb2273f33bd105f938
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Sat Nov 6 13:58:45 2021 +0100

    Linux 4.19.216
    
    Link: https://lore.kernel.org/r/20211104141158.037189396@linuxfoundation.org
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index 40657b8e92f1..f8255c787f7e 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 215
+SUBLEVEL = 216
 EXTRAVERSION =
 NAME = "People's Front"
 

commit de4868f6b081733490e1d2828644c4b157f19c87
Author: Wang Kefeng <wangkefeng.wang@huawei.com>
Date:   Mon Aug 23 10:41:42 2021 +0100

    ARM: 9120/1: Revert "amba: make use of -1 IRQs warn"
    
    commit eb4f756915875b0ea0757751cd29841f0504d547 upstream.
    
    After commit 77a7300abad7 ("of/irq: Get rid of NO_IRQ usage"),
    no irq case has been removed, irq_of_parse_and_map() will return
    0 in all cases when get error from parse and map an interrupt into
    linux virq space.
    
    amba_device_register() is only used on no-DT initialization, see
      s3c64xx_pl080_init()          arch/arm/mach-s3c/pl080.c
      ep93xx_init_devices()         arch/arm/mach-ep93xx/core.c
    
    They won't set -1 to irq[0], so no need the warn.
    
    This reverts commit 2eac58d5026e4ec8b17ff8b62877fea9e1d2f1b3.
    
    Reviewed-by: Rob Herring <robh@kernel.org>
    Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
    Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c
index 2380ebd9b7fd..e1992f361c9a 100644
--- a/drivers/amba/bus.c
+++ b/drivers/amba/bus.c
@@ -360,9 +360,6 @@ static int amba_device_try_add(struct amba_device *dev, struct resource *parent)
 	void __iomem *tmp;
 	int i, ret;
 
-	WARN_ON(dev->irq[0] == (unsigned int)-1);
-	WARN_ON(dev->irq[1] == (unsigned int)-1);
-
 	ret = request_resource(parent, &dev->res);
 	if (ret)
 		goto err_out;

commit d4fe42d646f277dfbc8a6cbc82bc4c8a12dd7798
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Wed Nov 11 17:52:58 2020 +0100

    arch: pgtable: define MAX_POSSIBLE_PHYSMEM_BITS where needed
    
    commit cef397038167ac15d085914493d6c86385773709 upstream.
    
    Stefan Agner reported a bug when using zsram on 32-bit Arm machines
    with RAM above the 4GB address boundary:
    
      Unable to handle kernel NULL pointer dereference at virtual address 00000000
      pgd = a27bd01c
      [00000000] *pgd=236a0003, *pmd=1ffa64003
      Internal error: Oops: 207 [#1] SMP ARM
      Modules linked in: mdio_bcm_unimac(+) brcmfmac cfg80211 brcmutil raspberrypi_hwmon hci_uart crc32_arm_ce bcm2711_thermal phy_generic genet
      CPU: 0 PID: 123 Comm: mkfs.ext4 Not tainted 5.9.6 #1
      Hardware name: BCM2711
      PC is at zs_map_object+0x94/0x338
      LR is at zram_bvec_rw.constprop.0+0x330/0xa64
      pc : [<c0602b38>]    lr : [<c0bda6a0>]    psr: 60000013
      sp : e376bbe0  ip : 00000000  fp : c1e2921c
      r10: 00000002  r9 : c1dda730  r8 : 00000000
      r7 : e8ff7a00  r6 : 00000000  r5 : 02f9ffa0  r4 : e3710000
      r3 : 000fdffe  r2 : c1e0ce80  r1 : ebf979a0  r0 : 00000000
      Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
      Control: 30c5383d  Table: 235c2a80  DAC: fffffffd
      Process mkfs.ext4 (pid: 123, stack limit = 0x495a22e6)
      Stack: (0xe376bbe0 to 0xe376c000)
    
    As it turns out, zsram needs to know the maximum memory size, which
    is defined in MAX_PHYSMEM_BITS when CONFIG_SPARSEMEM is set, or in
    MAX_POSSIBLE_PHYSMEM_BITS on the x86 architecture.
    
    The same problem will be hit on all 32-bit architectures that have a
    physical address space larger than 4GB and happen to not enable sparsemem
    and include asm/sparsemem.h from asm/pgtable.h.
    
    After the initial discussion, I suggested just always defining
    MAX_POSSIBLE_PHYSMEM_BITS whenever CONFIG_PHYS_ADDR_T_64BIT is
    set, or provoking a build error otherwise. This addresses all
    configurations that can currently have this runtime bug, but
    leaves all other configurations unchanged.
    
    I looked up the possible number of bits in source code and
    datasheets, here is what I found:
    
     - on ARC, CONFIG_ARC_HAS_PAE40 controls whether 32 or 40 bits are used
     - on ARM, CONFIG_LPAE enables 40 bit addressing, without it we never
       support more than 32 bits, even though supersections in theory allow
       up to 40 bits as well.
     - on MIPS, some MIPS32r1 or later chips support 36 bits, and MIPS32r5
       XPA supports up to 60 bits in theory, but 40 bits are more than
       anyone will ever ship
     - On PowerPC, there are three different implementations of 36 bit
       addressing, but 32-bit is used without CONFIG_PTE_64BIT
     - On RISC-V, the normal page table format can support 34 bit
       addressing. There is no highmem support on RISC-V, so anything
       above 2GB is unused, but it might be useful to eventually support
       CONFIG_ZRAM for high pages.
    
    Fixes: 61989a80fb3a ("staging: zsmalloc: zsmalloc memory allocation library")
    Fixes: 02390b87a945 ("mm/zsmalloc: Prepare to variable MAX_PHYSMEM_BITS")
    Acked-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Reviewed-by: Stefan Agner <stefan@agner.ch>
    Tested-by: Stefan Agner <stefan@agner.ch>
    Acked-by: Mike Rapoport <rppt@linux.ibm.com>
    Link: https://lore.kernel.org/linux-mm/bdfa44bf1c570b05d6c70898e2bbb0acf234ecdf.1604762181.git.stefan@agner.ch/
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    [florian: patch arch/powerpc/include/asm/pte-common.h for 4.19.y]
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arc/include/asm/pgtable.h b/arch/arc/include/asm/pgtable.h
index cf4be70d5892..f231963b4011 100644
--- a/arch/arc/include/asm/pgtable.h
+++ b/arch/arc/include/asm/pgtable.h
@@ -138,8 +138,10 @@
 
 #ifdef CONFIG_ARC_HAS_PAE40
 #define PTE_BITS_NON_RWX_IN_PD1	(0xff00000000 | PAGE_MASK | _PAGE_CACHEABLE)
+#define MAX_POSSIBLE_PHYSMEM_BITS 40
 #else
 #define PTE_BITS_NON_RWX_IN_PD1	(PAGE_MASK | _PAGE_CACHEABLE)
+#define MAX_POSSIBLE_PHYSMEM_BITS 32
 #endif
 
 /**************************************************************************
diff --git a/arch/arm/include/asm/pgtable-2level.h b/arch/arm/include/asm/pgtable-2level.h
index 12659ce5c1f3..90bf19d99378 100644
--- a/arch/arm/include/asm/pgtable-2level.h
+++ b/arch/arm/include/asm/pgtable-2level.h
@@ -78,6 +78,8 @@
 #define PTE_HWTABLE_OFF		(PTE_HWTABLE_PTRS * sizeof(pte_t))
 #define PTE_HWTABLE_SIZE	(PTRS_PER_PTE * sizeof(u32))
 
+#define MAX_POSSIBLE_PHYSMEM_BITS	32
+
 /*
  * PMD_SHIFT determines the size of the area a second-level page table can map
  * PGDIR_SHIFT determines what a third-level page table entry can map
diff --git a/arch/arm/include/asm/pgtable-3level.h b/arch/arm/include/asm/pgtable-3level.h
index 6d50a11d7793..7ba08dd650e3 100644
--- a/arch/arm/include/asm/pgtable-3level.h
+++ b/arch/arm/include/asm/pgtable-3level.h
@@ -37,6 +37,8 @@
 #define PTE_HWTABLE_OFF		(0)
 #define PTE_HWTABLE_SIZE	(PTRS_PER_PTE * sizeof(u64))
 
+#define MAX_POSSIBLE_PHYSMEM_BITS 40
+
 /*
  * PGDIR_SHIFT determines the size a top-level page table entry can map.
  */
diff --git a/arch/mips/include/asm/pgtable-32.h b/arch/mips/include/asm/pgtable-32.h
index 74afe8c76bdd..215fb48f644b 100644
--- a/arch/mips/include/asm/pgtable-32.h
+++ b/arch/mips/include/asm/pgtable-32.h
@@ -111,6 +111,7 @@ static inline void pmd_clear(pmd_t *pmdp)
 
 #if defined(CONFIG_XPA)
 
+#define MAX_POSSIBLE_PHYSMEM_BITS 40
 #define pte_pfn(x)		(((unsigned long)((x).pte_high >> _PFN_SHIFT)) | (unsigned long)((x).pte_low << _PAGE_PRESENT_SHIFT))
 static inline pte_t
 pfn_pte(unsigned long pfn, pgprot_t prot)
@@ -126,6 +127,7 @@ pfn_pte(unsigned long pfn, pgprot_t prot)
 
 #elif defined(CONFIG_PHYS_ADDR_T_64BIT) && defined(CONFIG_CPU_MIPS32)
 
+#define MAX_POSSIBLE_PHYSMEM_BITS 36
 #define pte_pfn(x)		((unsigned long)((x).pte_high >> 6))
 
 static inline pte_t pfn_pte(unsigned long pfn, pgprot_t prot)
@@ -140,6 +142,7 @@ static inline pte_t pfn_pte(unsigned long pfn, pgprot_t prot)
 
 #else
 
+#define MAX_POSSIBLE_PHYSMEM_BITS 32
 #ifdef CONFIG_CPU_VR41XX
 #define pte_pfn(x)		((unsigned long)((x).pte >> (PAGE_SHIFT + 2)))
 #define pfn_pte(pfn, prot)	__pte(((pfn) << (PAGE_SHIFT + 2)) | pgprot_val(prot))
diff --git a/arch/powerpc/include/asm/pte-common.h b/arch/powerpc/include/asm/pte-common.h
index bef56141a549..f740f67ebf98 100644
--- a/arch/powerpc/include/asm/pte-common.h
+++ b/arch/powerpc/include/asm/pte-common.h
@@ -110,8 +110,10 @@ static inline bool pte_user(pte_t pte)
  */
 #if defined(CONFIG_PPC32) && defined(CONFIG_PTE_64BIT)
 #define PTE_RPN_MASK	(~((1ULL<<PTE_RPN_SHIFT)-1))
+#define MAX_POSSIBLE_PHYSMEM_BITS 36
 #else
 #define PTE_RPN_MASK	(~((1UL<<PTE_RPN_SHIFT)-1))
+#define MAX_POSSIBLE_PHYSMEM_BITS 32
 #endif
 
 /* _PAGE_CHG_MASK masks of bits that are to be preserved across
diff --git a/arch/riscv/include/asm/pgtable-32.h b/arch/riscv/include/asm/pgtable-32.h
index d61974b74182..5cfe5a131867 100644
--- a/arch/riscv/include/asm/pgtable-32.h
+++ b/arch/riscv/include/asm/pgtable-32.h
@@ -22,4 +22,6 @@
 #define PGDIR_SIZE      (_AC(1, UL) << PGDIR_SHIFT)
 #define PGDIR_MASK      (~(PGDIR_SIZE - 1))
 
+#define MAX_POSSIBLE_PHYSMEM_BITS 34
+
 #endif /* _ASM_RISCV_PGTABLE_32_H */
diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h
index 5901b0005929..1544331bec27 100644
--- a/include/asm-generic/pgtable.h
+++ b/include/asm-generic/pgtable.h
@@ -1115,6 +1115,19 @@ static inline bool arch_has_pfn_modify_check(void)
 
 #endif /* !__ASSEMBLY__ */
 
+#if !defined(MAX_POSSIBLE_PHYSMEM_BITS) && !defined(CONFIG_64BIT)
+#ifdef CONFIG_PHYS_ADDR_T_64BIT
+/*
+ * ZSMALLOC needs to know the highest PFN on 32-bit architectures
+ * with physical address space extension, but falls back to
+ * BITS_PER_LONG otherwise.
+ */
+#error Missing MAX_POSSIBLE_PHYSMEM_BITS definition
+#else
+#define MAX_POSSIBLE_PHYSMEM_BITS 32
+#endif
+#endif
+
 #ifndef has_transparent_hugepage
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
 #define has_transparent_hugepage() 1

commit 3659fd7e08cfad2717d3b61c4470d82c5942a4bb
Author: Erik Ekman <erik@kryo.se>
Date:   Sun Oct 17 19:16:57 2021 +0200

    sfc: Fix reading non-legacy supported link modes
    
    commit 041c61488236a5a84789083e3d9f0a51139b6edf upstream.
    
    Everything except the first 32 bits was lost when the pause flags were
    added. This makes the 50000baseCR2 mode flag (bit 34) not appear.
    
    I have tested this with a 10G card (SFN5122F-R7) by modifying it to
    return a non-legacy link mode (10000baseCR).
    
    Signed-off-by: Erik Ekman <erik@kryo.se>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/sfc/ethtool.c b/drivers/net/ethernet/sfc/ethtool.c
index 3143588ffd77..82b32c742d69 100644
--- a/drivers/net/ethernet/sfc/ethtool.c
+++ b/drivers/net/ethernet/sfc/ethtool.c
@@ -131,20 +131,14 @@ efx_ethtool_get_link_ksettings(struct net_device *net_dev,
 {
 	struct efx_nic *efx = netdev_priv(net_dev);
 	struct efx_link_state *link_state = &efx->link_state;
-	u32 supported;
 
 	mutex_lock(&efx->mac_lock);
 	efx->phy_op->get_link_ksettings(efx, cmd);
 	mutex_unlock(&efx->mac_lock);
 
 	/* Both MACs support pause frames (bidirectional and respond-only) */
-	ethtool_convert_link_mode_to_legacy_u32(&supported,
-						cmd->link_modes.supported);
-
-	supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
-
-	ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
-						supported);
+	ethtool_link_ksettings_add_link_mode(cmd, supported, Pause);
+	ethtool_link_ksettings_add_link_mode(cmd, supported, Asym_Pause);
 
 	if (LOOPBACK_INTERNAL(efx)) {
 		cmd->base.speed = link_state->speed;

commit 73d2892148aa4397a885b4f4afcfc5b27a325c42
Author: Mike Marciniszyn <mike.marciniszyn@cornelisnetworks.com>
Date:   Tue Oct 12 13:55:19 2021 -0400

    IB/qib: Protect from buffer overflow in struct qib_user_sdma_pkt fields
    
    commit d39bf40e55e666b5905fdbd46a0dced030ce87be upstream.
    
    Overflowing either addrlimit or bytes_togo can allow userspace to trigger
    a buffer overflow of kernel memory. Check for overflows in all the places
    doing math on user controlled buffers.
    
    Fixes: f931551bafe1 ("IB/qib: Add new qib driver for QLogic PCIe InfiniBand adapters")
    Link: https://lore.kernel.org/r/20211012175519.7298.77738.stgit@awfm-01.cornelisnetworks.com
    Reported-by: Ilja Van Sprundel <ivansprundel@ioactive.com>
    Reviewed-by: Dennis Dalessandro <dennis.dalessandro@cornelisnetworks.com>
    Signed-off-by: Mike Marciniszyn <mike.marciniszyn@cornelisnetworks.com>
    Signed-off-by: Dennis Dalessandro <dennis.dalessandro@cornelisnetworks.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/infiniband/hw/qib/qib_user_sdma.c b/drivers/infiniband/hw/qib/qib_user_sdma.c
index 371961a589ad..47ed3ab25dc9 100644
--- a/drivers/infiniband/hw/qib/qib_user_sdma.c
+++ b/drivers/infiniband/hw/qib/qib_user_sdma.c
@@ -606,7 +606,7 @@ static int qib_user_sdma_coalesce(const struct qib_devdata *dd,
 /*
  * How many pages in this iovec element?
  */
-static int qib_user_sdma_num_pages(const struct iovec *iov)
+static size_t qib_user_sdma_num_pages(const struct iovec *iov)
 {
 	const unsigned long addr  = (unsigned long) iov->iov_base;
 	const unsigned long  len  = iov->iov_len;
@@ -662,7 +662,7 @@ static void qib_user_sdma_free_pkt_frag(struct device *dev,
 static int qib_user_sdma_pin_pages(const struct qib_devdata *dd,
 				   struct qib_user_sdma_queue *pq,
 				   struct qib_user_sdma_pkt *pkt,
-				   unsigned long addr, int tlen, int npages)
+				   unsigned long addr, int tlen, size_t npages)
 {
 	struct page *pages[8];
 	int i, j;
@@ -726,7 +726,7 @@ static int qib_user_sdma_pin_pkt(const struct qib_devdata *dd,
 	unsigned long idx;
 
 	for (idx = 0; idx < niov; idx++) {
-		const int npages = qib_user_sdma_num_pages(iov + idx);
+		const size_t npages = qib_user_sdma_num_pages(iov + idx);
 		const unsigned long addr = (unsigned long) iov[idx].iov_base;
 
 		ret = qib_user_sdma_pin_pages(dd, pq, pkt, addr,
@@ -828,8 +828,8 @@ static int qib_user_sdma_queue_pkts(const struct qib_devdata *dd,
 		unsigned pktnw;
 		unsigned pktnwc;
 		int nfrags = 0;
-		int npages = 0;
-		int bytes_togo = 0;
+		size_t npages = 0;
+		size_t bytes_togo = 0;
 		int tiddma = 0;
 		int cfur;
 
@@ -889,7 +889,11 @@ static int qib_user_sdma_queue_pkts(const struct qib_devdata *dd,
 
 			npages += qib_user_sdma_num_pages(&iov[idx]);
 
-			bytes_togo += slen;
+			if (check_add_overflow(bytes_togo, slen, &bytes_togo) ||
+			    bytes_togo > type_max(typeof(pkt->bytes_togo))) {
+				ret = -EINVAL;
+				goto free_pbc;
+			}
 			pktnwc += slen >> 2;
 			idx++;
 			nfrags++;
@@ -908,8 +912,7 @@ static int qib_user_sdma_queue_pkts(const struct qib_devdata *dd,
 		}
 
 		if (frag_size) {
-			int tidsmsize, n;
-			size_t pktsize;
+			size_t tidsmsize, n, pktsize, sz, addrlimit;
 
 			n = npages*((2*PAGE_SIZE/frag_size)+1);
 			pktsize = struct_size(pkt, addr, n);
@@ -927,14 +930,24 @@ static int qib_user_sdma_queue_pkts(const struct qib_devdata *dd,
 			else
 				tidsmsize = 0;
 
-			pkt = kmalloc(pktsize+tidsmsize, GFP_KERNEL);
+			if (check_add_overflow(pktsize, tidsmsize, &sz)) {
+				ret = -EINVAL;
+				goto free_pbc;
+			}
+			pkt = kmalloc(sz, GFP_KERNEL);
 			if (!pkt) {
 				ret = -ENOMEM;
 				goto free_pbc;
 			}
 			pkt->largepkt = 1;
 			pkt->frag_size = frag_size;
-			pkt->addrlimit = n + ARRAY_SIZE(pkt->addr);
+			if (check_add_overflow(n, ARRAY_SIZE(pkt->addr),
+					       &addrlimit) ||
+			    addrlimit > type_max(typeof(pkt->addrlimit))) {
+				ret = -EINVAL;
+				goto free_pbc;
+			}
+			pkt->addrlimit = addrlimit;
 
 			if (tiddma) {
 				char *tidsm = (char *)pkt + pktsize;

commit cde048c5fe6ff79b6f26fb68d94c165d4a420c09
Author: Gustavo A. R. Silva <gustavo@embeddedor.com>
Date:   Wed May 29 10:13:26 2019 -0500

    IB/qib: Use struct_size() helper
    
    commit 829ca44ecf60e9b6f83d0161a6ef10c1304c5060 upstream.
    
    Make use of the struct_size() helper instead of an open-coded version
    in order to avoid any potential type mistakes, in particular in the
    context in which this code is being used.
    
    So, replace the following form:
    
    sizeof(*pkt) + sizeof(pkt->addr[0])*n
    
    with:
    
    struct_size(pkt, addr, n)
    
    Also, notice that variable size is unnecessary, hence it is removed.
    
    This code was detected with the help of Coccinelle.
    
    Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
    Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
    Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
    Cc: Mile Marciniszyn <mike.marciniszyn@cornelisnetworks.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/infiniband/hw/qib/qib_user_sdma.c b/drivers/infiniband/hw/qib/qib_user_sdma.c
index 926f3c8eba69..371961a589ad 100644
--- a/drivers/infiniband/hw/qib/qib_user_sdma.c
+++ b/drivers/infiniband/hw/qib/qib_user_sdma.c
@@ -908,10 +908,11 @@ static int qib_user_sdma_queue_pkts(const struct qib_devdata *dd,
 		}
 
 		if (frag_size) {
-			int pktsize, tidsmsize, n;
+			int tidsmsize, n;
+			size_t pktsize;
 
 			n = npages*((2*PAGE_SIZE/frag_size)+1);
-			pktsize = sizeof(*pkt) + sizeof(pkt->addr[0])*n;
+			pktsize = struct_size(pkt, addr, n);
 
 			/*
 			 * Determine if this is tid-sdma or just sdma.

commit 53ec9dab4eb0a8140fc85760fb50effb526fe219
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Mon Jun 7 17:23:48 2021 +0200

    media: firewire: firedtv-avc: fix a buffer overflow in avc_ca_pmt()
    
    commit 35d2969ea3c7d32aee78066b1f3cf61a0d935a4e upstream.
    
    The bounds checking in avc_ca_pmt() is not strict enough.  It should
    be checking "read_pos + 4" because it's reading 5 bytes.  If the
    "es_info_length" is non-zero then it reads a 6th byte so there needs to
    be an additional check for that.
    
    I also added checks for the "write_pos".  I don't think these are
    required because "read_pos" and "write_pos" are tied together so
    checking one ought to be enough.  But they make the code easier to
    understand for me.  The check on write_pos is:
    
            if (write_pos + 4 >= sizeof(c->operand) - 4) {
    
    The first "+ 4" is because we're writing 5 bytes and the last " - 4"
    is to leave space for the CRC.
    
    The other problem is that "length" can be invalid.  It comes from
    "data_length" in fdtv_ca_pmt().
    
    Cc: stable@vger.kernel.org
    Reported-by: Luo Likang <luolikang@nsfocus.com>
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/media/firewire/firedtv-avc.c b/drivers/media/firewire/firedtv-avc.c
index 3ef5df1648d7..8c31cf90c590 100644
--- a/drivers/media/firewire/firedtv-avc.c
+++ b/drivers/media/firewire/firedtv-avc.c
@@ -1169,7 +1169,11 @@ int avc_ca_pmt(struct firedtv *fdtv, char *msg, int length)
 		read_pos += program_info_length;
 		write_pos += program_info_length;
 	}
-	while (read_pos < length) {
+	while (read_pos + 4 < length) {
+		if (write_pos + 4 >= sizeof(c->operand) - 4) {
+			ret = -EINVAL;
+			goto out;
+		}
 		c->operand[write_pos++] = msg[read_pos++];
 		c->operand[write_pos++] = msg[read_pos++];
 		c->operand[write_pos++] = msg[read_pos++];
@@ -1181,13 +1185,17 @@ int avc_ca_pmt(struct firedtv *fdtv, char *msg, int length)
 		c->operand[write_pos++] = es_info_length >> 8;
 		c->operand[write_pos++] = es_info_length & 0xff;
 		if (es_info_length > 0) {
+			if (read_pos >= length) {
+				ret = -EINVAL;
+				goto out;
+			}
 			pmt_cmd_id = msg[read_pos++];
 			if (pmt_cmd_id != 1 && pmt_cmd_id != 4)
 				dev_err(fdtv->device, "invalid pmt_cmd_id %d at stream level\n",
 					pmt_cmd_id);
 
-			if (es_info_length > sizeof(c->operand) - 4 -
-					     write_pos) {
+			if (es_info_length > sizeof(c->operand) - 4 - write_pos ||
+			    es_info_length > length - read_pos) {
 				ret = -EINVAL;
 				goto out;
 			}
diff --git a/drivers/media/firewire/firedtv-ci.c b/drivers/media/firewire/firedtv-ci.c
index 8dc5a7495abe..14f779812d25 100644
--- a/drivers/media/firewire/firedtv-ci.c
+++ b/drivers/media/firewire/firedtv-ci.c
@@ -138,6 +138,8 @@ static int fdtv_ca_pmt(struct firedtv *fdtv, void *arg)
 	} else {
 		data_length = msg->msg[3];
 	}
+	if (data_length > sizeof(msg->msg) - data_pos)
+		return -EINVAL;
 
 	return avc_ca_pmt(fdtv, &msg->msg[data_pos], data_length);
 }

commit c2df161f69fb1c67f63adbd193368b47f511edc0
Author: Ming Lei <ming.lei@redhat.com>
Date:   Fri Oct 8 13:01:18 2021 +0800

    scsi: core: Put LLD module refcnt after SCSI device is released
    
    commit f2b85040acec9a928b4eb1b57a989324e8e38d3f upstream.
    
    SCSI host release is triggered when SCSI device is freed. We have to make
    sure that the low-level device driver module won't be unloaded before SCSI
    host instance is released because shost->hostt is required in the release
    handler.
    
    Make sure to put LLD module refcnt after SCSI device is released.
    
    Fixes a kernel panic of 'BUG: unable to handle page fault for address'
    reported by Changhui and Yi.
    
    Link: https://lore.kernel.org/r/20211008050118.1440686-1-ming.lei@redhat.com
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Reported-by: Changhui Zhong <czhong@redhat.com>
    Reported-by: Yi Zhang <yi.zhang@redhat.com>
    Tested-by: Yi Zhang <yi.zhang@redhat.com>
    Signed-off-by: Ming Lei <ming.lei@redhat.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index fc1356d101b0..febe29a9b8b0 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -575,8 +575,10 @@ EXPORT_SYMBOL(scsi_device_get);
  */
 void scsi_device_put(struct scsi_device *sdev)
 {
-	module_put(sdev->host->hostt->module);
+	struct module *mod = sdev->host->hostt->module;
+
 	put_device(&sdev->sdev_gendev);
+	module_put(mod);
 }
 EXPORT_SYMBOL(scsi_device_put);
 
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
index 186f779fa60c..d4be13892b26 100644
--- a/drivers/scsi/scsi_sysfs.c
+++ b/drivers/scsi/scsi_sysfs.c
@@ -431,9 +431,12 @@ static void scsi_device_dev_release_usercontext(struct work_struct *work)
 	struct list_head *this, *tmp;
 	struct scsi_vpd *vpd_pg80 = NULL, *vpd_pg83 = NULL;
 	unsigned long flags;
+	struct module *mod;
 
 	sdev = container_of(work, struct scsi_device, ew.work);
 
+	mod = sdev->host->hostt->module;
+
 	scsi_dh_release_device(sdev);
 
 	parent = sdev->sdev_gendev.parent;
@@ -474,11 +477,17 @@ static void scsi_device_dev_release_usercontext(struct work_struct *work)
 
 	if (parent)
 		put_device(parent);
+	module_put(mod);
 }
 
 static void scsi_device_dev_release(struct device *dev)
 {
 	struct scsi_device *sdp = to_scsi_device(dev);
+
+	/* Set module pointer as NULL in case of module unloading */
+	if (!try_module_get(sdp->host->hostt->module))
+		sdp->host->hostt->module = NULL;
+
 	execute_in_process_context(scsi_device_dev_release_usercontext,
 				   &sdp->ew);
 }

commit 98a32a4b693c906c22fbba518351807322690a71
Author: William Wu <william.wu@rock-chips.com>
Date:   Sat Nov 6 17:49:21 2021 +0800

    Revert "usb: dwc2: hcd: do not disable non-split periodic channels"
    
    This reverts commit debf378724206de37e21fdd9a96a33e693ee01c7.
    The patch a82c7abdf8fc ("usb: dwc2: hcd: Fix host channel halt flow")
    can fix the issue.
    
    Change-Id: I9a014c42cf942cab22480b5faab13c802e7fd47e
    Signed-off-by: William Wu <william.wu@rock-chips.com>

diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c
index f495101eb1dc..1746adc19488 100644
--- a/drivers/usb/dwc2/hcd.c
+++ b/drivers/usb/dwc2/hcd.c
@@ -1052,12 +1052,8 @@ void dwc2_hc_halt(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan,
 		chan->halt_status = halt_status;
 
 		hcchar = dwc2_readl(hsotg, HCCHAR(chan->hc_num));
-		if (!(hcchar & HCCHAR_CHENA) ||
-		    (!chan->do_split &&
-		     (chan->ep_type == USB_ENDPOINT_XFER_ISOC ||
-		      chan->ep_type == USB_ENDPOINT_XFER_INT))){
+		if (!(hcchar & HCCHAR_CHENA)) {
 			/*
-			 * HCCHARn.ChEna 0 means that:
 			 * The channel is either already halted or it hasn't
 			 * started yet. In DMA mode, the transfer may halt if
 			 * it finishes normally or a condition occurs that
@@ -1067,16 +1063,7 @@ void dwc2_hc_halt(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan,
 			 * to a channel, but not started yet when an URB is
 			 * dequeued. Don't want to halt a channel that hasn't
 			 * started yet.
-			 * If channel is used for non-split periodic transfer
-			 * according to DWC Programming Guide:
-			 * '3.5 Halting a Channel': Channel disable must not
-			 * be programmed for non-split periodic channels. At
-			 * the end of the next uframe/frame (in the worst
-			 * case), the core generates a channel halted and
-			 * disables the channel automatically.
 			 */
-			dev_info(hsotg->dev, "hcchar 0x%08x, ep_type %d\n",
-				 hcchar, chan->ep_type);
 			return;
 		}
 	}

commit 4ee1573943ca0ba14c196c9983b47bc18c67b5d3
Author: William Wu <william.wu@rock-chips.com>
Date:   Sat Nov 6 17:18:07 2021 +0800

    usb: dwc2: hcd: Fix channel halt for isoc and int transfer
    
    The parameters g_dma and g_dma_desc is used for gadget,
    so let's use host_dma and dma_desc_enable instead of them.
    And it needs to update the chan->halt_status for non-split
    periodic channels rather than return immediately, otherwise,
    the software will not release the channel when the channel
    halt interrupt is triggered next time.
    
    In addition, it only needs to wait for the core generates
    a channel halted if halt_status is DWC2_HC_XFER_URB_DEQUEUE.
    
    Fixes: a82c7abdf8fc ("usb: dwc2: hcd: Fix host channel halt flow")
    Change-Id: I455444af020ff751406295f21133ff6a950c04dd
    Signed-off-by: William Wu <william.wu@rock-chips.com>
    Signed-off-by: Wang Jie <dave.wang@rock-chips.com>

diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c
index 1e4702eefd09..f495101eb1dc 100644
--- a/drivers/usb/dwc2/hcd.c
+++ b/drivers/usb/dwc2/hcd.c
@@ -1008,11 +1008,13 @@ void dwc2_hc_halt(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan,
 	 * uframe/frame (in the worst case), the core generates a channel
 	 * halted and disables the channel automatically.
 	 */
-	if ((hsotg->params.g_dma && !hsotg->params.g_dma_desc) ||
+	if ((hsotg->params.host_dma && !hsotg->params.dma_desc_enable) ||
 	    hsotg->hw_params.arch == GHWCFG2_EXT_DMA_ARCH) {
 		if (!chan->do_split &&
 		    (chan->ep_type == USB_ENDPOINT_XFER_ISOC ||
-		     chan->ep_type == USB_ENDPOINT_XFER_INT)) {
+		     chan->ep_type == USB_ENDPOINT_XFER_INT) &&
+		    (halt_status == DWC2_HC_XFER_URB_DEQUEUE)) {
+			chan->halt_status = halt_status;
 			dev_err(hsotg->dev, "%s() Channel can't be halted\n",
 				__func__);
 			return;

commit effdc5032fc35e41daa92259131d49b5847ffd73
Author: Steven Liu <steven.liu@rock-chips.com>
Date:   Fri Nov 5 10:40:30 2021 +0800

    arm64: dts: rockchip: rk3568: add rk3568-amp.dtsi
    
    Signed-off-by: Steven Liu <steven.liu@rock-chips.com>
    Change-Id: I93e64854e053866b6faca68107f6a496f22aa864

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-amp.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-amp.dtsi
new file mode 100644
index 000000000000..ee5803f6462f
--- /dev/null
+++ b/arch/arm64/boot/dts/rockchip/rk3568-amp.dtsi
@@ -0,0 +1,21 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
+ */
+
+/ {
+	rockchip_amp: rockchip-amp {
+		compatible = "rockchip,rk3568-amp";
+		clocks = <&cru SCLK_UART4>, <&cru PCLK_UART4>,
+			<&cru PCLK_TIMER>, <&cru CLK_TIMER4>, <&cru CLK_TIMER5>;
+		clock-names = "baudclk", "apb_pclk", "pclk", "timer";
+		assigned-clocks = <&cru SCLK_UART4>,
+				<&cru CLK_TIMER4>,
+				<&cru CLK_TIMER5>;
+		assigned-clock-rates = <24000000>;
+
+		pinctrl-names = "default";
+		pinctrl-0 = <&uart4m1_xfer>;
+		status = "disabled";
+	};
+};

commit d5590a0c1ed31235f71ba321a893b34930f3dfdb
Author: Steven Liu <steven.liu@rock-chips.com>
Date:   Thu Aug 26 20:04:20 2021 +0800

    soc: rockchip: amp: support amp driver
    
    1.Protect clock and iomux resources used by AMP.
    2.Support RK3568 AMP.
    
    Signed-off-by: Steven Liu <steven.liu@rock-chips.com>
    Change-Id: If53e893fac916217bfa5618350b1706b742b34e7

diff --git a/drivers/soc/rockchip/Kconfig b/drivers/soc/rockchip/Kconfig
index b7c1bf17f436..53fa90da72c2 100644
--- a/drivers/soc/rockchip/Kconfig
+++ b/drivers/soc/rockchip/Kconfig
@@ -14,6 +14,12 @@ config ANDROID_VERSION
 	  The version of Android kernel supported.
 	  The value is 0xAABBCCRR, corresponding to Android A.B.C release R
 
+config ROCKCHIP_AMP
+	tristate "Rockchip AMP support"
+	help
+	  Say y here to enable Rockchip AMP support.
+	  This option protects resources used by AMP.
+
 config ROCKCHIP_CPUINFO
 	tristate "Rockchip cpuinfo support"
 	depends on (ROCKCHIP_EFUSE || ROCKCHIP_OTP) && (ARM64 || ARM)
diff --git a/drivers/soc/rockchip/Makefile b/drivers/soc/rockchip/Makefile
index 9b6fb071213a..4e256ce633c9 100644
--- a/drivers/soc/rockchip/Makefile
+++ b/drivers/soc/rockchip/Makefile
@@ -14,6 +14,7 @@ obj-$(CONFIG_ROCKCHIP_IPA)	+= rockchip_ipa.o
 obj-$(CONFIG_ROCKCHIP_OPP)	+= rockchip_opp_select.o
 obj-$(CONFIG_ROCKCHIP_PVTM)	+= rockchip_pvtm.o
 obj-$(CONFIG_ROCKCHIP_RAMDISK)	+= rockchip_ramdisk.o
+obj-$(CONFIG_ROCKCHIP_AMP)	+= rockchip_amp.o
 obj-$(CONFIG_ROCKCHIP_SUSPEND_MODE) += rockchip_pm_config.o
 obj-$(CONFIG_ROCKCHIP_SYSTEM_MONITOR) += rockchip_system_monitor.o
 obj-$(CONFIG_ROCKCHIP_THUNDER_BOOT_CRYPTO) += rockchip_thunderboot_crypto.o
diff --git a/drivers/soc/rockchip/rockchip_amp.c b/drivers/soc/rockchip/rockchip_amp.c
new file mode 100644
index 000000000000..e3defc225d4c
--- /dev/null
+++ b/drivers/soc/rockchip/rockchip_amp.c
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Rockchip AMP support.
+ *
+ * Copyright (c) 2021 Rockchip Electronics Co. Ltd.
+ * Author: Tony Xie <tony.xie@rock-chips.com>
+ */
+
+#include <linux/clk.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+
+static const struct of_device_id rockchip_amp_match[] = {
+	{
+		.compatible = "rockchip,rk3568-amp",
+	},
+	{ /* sentinel */ },
+};
+MODULE_DEVICE_TABLE(of, rockchip_amp_match);
+
+static int rockchip_amp_probe(struct platform_device *pdev)
+{
+	struct clk_bulk_data *clks;
+	int num_clks;
+	int ret;
+
+	num_clks = devm_clk_bulk_get_all(&pdev->dev, &clks);
+	if (num_clks < 1)
+		return -ENODEV;
+	ret = clk_bulk_prepare_enable(num_clks, clks);
+	if (ret) {
+		dev_err(&pdev->dev, "failed to prepare enable clks: %d\n", ret);
+		return ret;
+	}
+	return 0;
+}
+
+static struct platform_driver rockchip_amp_driver = {
+	.probe = rockchip_amp_probe,
+	.driver = {
+		.name  = "rockchip-amp",
+		.of_match_table = rockchip_amp_match,
+	},
+};
+module_platform_driver(rockchip_amp_driver);
+
+MODULE_DESCRIPTION("Rockchip AMP driver");
+MODULE_AUTHOR("Tony xie<tony.xie@rock-chips.com>");
+MODULE_LICENSE("GPL v2");

commit 28ce07e7f105ee6b26c73dfeb97669aa70afa2cb
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Fri Jul 9 10:29:41 2021 +0800

    video: rockchip: rga2 use dma-buf-cache
    
    Change-Id: Ic1b37308b9fe5d8558ed73eb576398e0f0f05290
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/video/rockchip/rga2/rga2_drv.c b/drivers/video/rockchip/rga2/rga2_drv.c
index 3d7891306272..9aeb89ac682a 100644
--- a/drivers/video/rockchip/rga2/rga2_drv.c
+++ b/drivers/video/rockchip/rga2/rga2_drv.c
@@ -45,7 +45,7 @@
 
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
 #include <linux/pm_runtime.h>
-#include <linux/dma-buf.h>
+#include <linux/dma-buf-cache.h>
 #endif
 
 #include "rga2.h"

commit 65de976f5d55475a57d745bea91814ed376c8871
Author: Connor O'Brien <connoro@google.com>
Date:   Fri Feb 7 10:01:49 2020 -0800

    UPSTREAM: security: selinux: allow per-file labeling for bpffs
    
    Add support for genfscon per-file labeling of bpffs files. This allows
    for separate permissions for different pinned bpf objects, which may
    be completely unrelated to each other.
    
    Signed-off-by: Connor O'Brien <connoro@google.com>
    Signed-off-by: Steven Moreland <smoreland@google.com>
    Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
    Signed-off-by: Paul Moore <paul@paul-moore.com>
    (cherry picked from commit 4ca54d3d3022ce27170b50e4bdecc3a42f05dbdc)
    [which is v5.6-rc1-10-g4ca54d3d3022 and thus already included in 5.10]
    Bug: 200440527
    Change-Id: I8234b9047f29981b8140bd81bb2ff070b3b0b843
    (cherry picked from commit d52ac987ad2ae16ff313d7fb6185bc412cb221a4)

diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index 95cbf285b299..b8ff42a7c16d 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -872,6 +872,7 @@ static int selinux_set_mnt_opts(struct super_block *sb,
 	    !strcmp(sb->s_type->name, "sysfs") ||
 	    !strcmp(sb->s_type->name, "pstore") ||
 	    !strcmp(sb->s_type->name, "binder") ||
+	    !strcmp(sb->s_type->name, "bpf") ||
 	    !strcmp(sb->s_type->name, "cgroup") ||
 	    !strcmp(sb->s_type->name, "cgroup2"))
 		sbsec->flags |= SE_SBGENFS;

commit 816e197f50a04b94ad791dc39c936d0cbcdd0e91
Author: XiaoTan Luo <lxt@rock-chips.com>
Date:   Fri Sep 17 14:29:53 2021 +0800

    arm64: dts: rockchip: rk3568-linux: enable rk809 sound for headphones jack function
    
    Signed-off-by: XiaoTan Luo <lxt@rock-chips.com>
    Change-Id: Ic9788c4c58a04828af3f50c06f7a96a1fd661cae

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
index 57d83d46e40f..5623aa8dd15c 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
@@ -37,6 +37,22 @@
 			<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 {
@@ -55,6 +71,25 @@
 	};
 };
 
+&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 {
 	status = "okay";
 };

commit d47e486b19bda2110287440dfeaae56e366f85aa
Author: Yandong Lin <yandong.lin@rock-chips.com>
Date:   Mon Jul 12 11:47:02 2021 +0800

    video: rockchip: mpp: use dma-buf-cache func
    
    Note:
    The commit depends on the following commit:
    commit 36514da674cb ("dma-buf: support to cache dma-buf-attachment")
    
      The attachment and sg_table will be store in dma-buf-cache.
      So use dma-buf-cache api instead of dma-buf api to reduce
      the actual operation of attach/map.
    
    Signed-off-by: Yandong Lin <yandong.lin@rock-chips.com>
    Change-Id: I8b46c8f6a6f69ebe9854858e198d1c312a808a2f

diff --git a/drivers/video/rockchip/mpp/mpp_iommu.c b/drivers/video/rockchip/mpp/mpp_iommu.c
index b9f10cd0c689..1ff83c1a8eb5 100644
--- a/drivers/video/rockchip/mpp/mpp_iommu.c
+++ b/drivers/video/rockchip/mpp/mpp_iommu.c
@@ -12,7 +12,7 @@
 #include <asm/dma-iommu.h>
 #endif
 #include <linux/delay.h>
-#include <linux/dma-buf.h>
+#include <linux/dma-buf-cache.h>
 #include <linux/dma-iommu.h>
 #include <linux/iommu.h>
 #include <linux/of.h>
@@ -233,8 +233,6 @@ struct mpp_dma_buffer *mpp_dma_import_fd(struct mpp_iommu_info *iommu_info,
 	buffer->dma = dma;
 
 	kref_init(&buffer->ref);
-	/* Increase the reference for used outside the buffer pool */
-	kref_get(&buffer->ref);
 
 	mutex_lock(&dma->list_mutex);
 	dma->buffer_count++;

commit 0ed46b824fe502337f6279d3b26e2b159c84f150
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Wed Nov 3 10:27:44 2021 +0800

    drm: rockchip: do release callback if not define CONFIG_DMABUF_CACHE
    
    When enable CONFIG_DMABUF_CACHE, the dmabuf attach will be cached by
    dma-buf-cache driver.
    
    Change-Id: Icc9c21542c2f0883e74a5b35f82e4d604509bcb3
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/dma-buf/Kconfig b/drivers/dma-buf/Kconfig
index 414a05a8b7aa..87d64f56bf01 100644
--- a/drivers/dma-buf/Kconfig
+++ b/drivers/dma-buf/Kconfig
@@ -2,7 +2,7 @@ menu "DMABUF options"
 
 config DMABUF_CACHE
 	bool "DMABUF cache attachment"
-	default n
+	default ARCH_ROCKCHIP
 	help
 	  This option support to store attachments in a list and destroy them by
 	  set to a callback list in the dtor of dma-buf.
diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
index 8f101e83caed..cbfc7d8cf9f1 100644
--- a/drivers/dma-buf/dma-buf.c
+++ b/drivers/dma-buf/dma-buf.c
@@ -46,7 +46,7 @@
 
 static inline int is_dma_buf_file(struct file *);
 
-#ifdef CONFIG_ARCH_ROCKCHIP
+#if !defined(CONFIG_DMABUF_CACHE)
 struct dma_buf_callback {
 	struct list_head list;
 	void (*callback)(void *);
@@ -99,7 +99,7 @@ static struct file_system_type dma_buf_fs_type = {
 static int dma_buf_release(struct inode *inode, struct file *file)
 {
 	struct dma_buf *dmabuf;
-#ifdef CONFIG_ARCH_ROCKCHIP
+#if !defined(CONFIG_DMABUF_CACHE)
 	struct dma_buf_callback *cb, *tmp;
 #endif
 	int dtor_ret = 0;
@@ -121,7 +121,7 @@ static int dma_buf_release(struct inode *inode, struct file *file)
 	 */
 	BUG_ON(dmabuf->cb_shared.active || dmabuf->cb_excl.active);
 
-#ifdef CONFIG_ARCH_ROCKCHIP
+#if !defined(CONFIG_DMABUF_CACHE)
 	mutex_lock(&dmabuf->release_lock);
 	list_for_each_entry_safe(cb, tmp, &dmabuf->release_callbacks, list) {
 		if (cb->callback)
@@ -553,7 +553,7 @@ static struct file *dma_buf_getfile(struct dma_buf *dmabuf, int flags)
 	return file;
 }
 
-#ifdef CONFIG_ARCH_ROCKCHIP
+#if !defined(CONFIG_DMABUF_CACHE)
 void *dma_buf_get_release_callback_data(struct dma_buf *dmabuf,
 					void (*callback)(void *))
 {
@@ -708,7 +708,7 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
 	spin_lock_init(&dmabuf->name_lock);
 	INIT_LIST_HEAD(&dmabuf->attachments);
 
-#ifdef CONFIG_ARCH_ROCKCHIP
+#if !defined(CONFIG_DMABUF_CACHE)
 	mutex_init(&dmabuf->release_lock);
 	INIT_LIST_HEAD(&dmabuf->release_callbacks);
 #endif
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index 0cd9d48dbff5..4121561ba69b 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -213,7 +213,7 @@ int rockchip_drm_add_modes_noedid(struct drm_connector *connector)
 }
 EXPORT_SYMBOL(rockchip_drm_add_modes_noedid);
 
-#ifdef CONFIG_ARCH_ROCKCHIP
+#if !defined(CONFIG_DMABUF_CACHE)
 struct drm_prime_callback_data {
 	struct drm_gem_object *obj;
 	struct sg_table *sgt;
@@ -1935,7 +1935,7 @@ static const struct dma_buf_ops rockchip_drm_gem_prime_dmabuf_ops = {
 	.end_cpu_access_partial = rockchip_drm_gem_end_cpu_access_partial,
 };
 
-#ifdef CONFIG_ARCH_ROCKCHIP
+#if !defined(CONFIG_DMABUF_CACHE)
 static void drm_gem_prime_dmabuf_release_callback(void *data)
 {
 	struct drm_prime_callback_data *cb_data = data;
@@ -1961,7 +1961,7 @@ static struct drm_gem_object *rockchip_drm_gem_prime_import_dev(struct drm_devic
 	struct dma_buf_attachment *attach;
 	struct sg_table *sgt;
 	struct drm_gem_object *obj;
-#ifdef CONFIG_ARCH_ROCKCHIP
+#if !defined(CONFIG_DMABUF_CACHE)
 	struct drm_prime_callback_data *cb_data = NULL;
 #endif
 	int ret;
@@ -1978,7 +1978,7 @@ static struct drm_gem_object *rockchip_drm_gem_prime_import_dev(struct drm_devic
 		}
 	}
 
-#ifdef CONFIG_ARCH_ROCKCHIP
+#if !defined(CONFIG_DMABUF_CACHE)
 	cb_data = dma_buf_get_release_callback_data(dma_buf,
 					drm_gem_prime_dmabuf_release_callback);
 	if (cb_data && cb_data->obj && cb_data->obj->dev == dev) {
@@ -1996,7 +1996,7 @@ static struct drm_gem_object *rockchip_drm_gem_prime_import_dev(struct drm_devic
 
 	get_dma_buf(dma_buf);
 
-#ifdef CONFIG_ARCH_ROCKCHIP
+#if !defined(CONFIG_DMABUF_CACHE)
 	cb_data = kmalloc(sizeof(*cb_data), GFP_KERNEL);
 	if (!cb_data) {
 		ret = -ENOMEM;
@@ -2018,7 +2018,7 @@ static struct drm_gem_object *rockchip_drm_gem_prime_import_dev(struct drm_devic
 
 	obj->import_attach = attach;
 
-#ifdef CONFIG_ARCH_ROCKCHIP
+#if !defined(CONFIG_DMABUF_CACHE)
 	cb_data->obj = obj;
 	cb_data->sgt = sgt;
 	dma_buf_set_release_callback(dma_buf,
@@ -2032,7 +2032,7 @@ static struct drm_gem_object *rockchip_drm_gem_prime_import_dev(struct drm_devic
 fail_unmap:
 	dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL);
 fail_detach:
-#ifdef CONFIG_ARCH_ROCKCHIP
+#if !defined(CONFIG_DMABUF_CACHE)
 	kfree(cb_data);
 #endif
 	dma_buf_detach(dma_buf, attach);
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
index a0595561f5ea..4d991009df84 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
@@ -678,6 +678,20 @@ rockchip_gem_create_object(struct drm_device *drm, unsigned int size,
 	return ERR_PTR(ret);
 }
 
+static void rockchip_gem_destroy(struct drm_gem_object *obj, struct sg_table *sg)
+{
+	struct dma_buf_attachment *attach;
+	struct dma_buf *dma_buf;
+
+	attach = obj->import_attach;
+	if (sg)
+		dma_buf_unmap_attachment(attach, sg, DMA_BIDIRECTIONAL);
+	dma_buf = attach->dmabuf;
+	dma_buf_detach(attach->dmabuf, attach);
+	/* remove the reference */
+	dma_buf_put(dma_buf);
+}
+
 /*
  * rockchip_gem_free_object - (struct drm_driver)->gem_free_object_unlocked
  * callback function
@@ -696,7 +710,13 @@ void rockchip_gem_free_object(struct drm_gem_object *obj)
 				     rk_obj->sgt->nents, DMA_BIDIRECTIONAL);
 		}
 		drm_free_large(rk_obj->pages);
-#ifndef CONFIG_ARCH_ROCKCHIP
+#if defined(CONFIG_DMABUF_CACHE)
+		/*
+		 * The dma_buf_unmap_attachment and dma_buf_detach will be re-defined if
+		 * CONFIG_DMABUF_CACHE is enabled.
+		 */
+		rockchip_gem_destroy(obj, rk_obj->sgt);
+#elif !defined(CONFIG_ARCH_ROCKCHIP)
 		drm_prime_gem_destroy(obj, rk_obj->sgt);
 #endif
 	} else {
diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h
index 4696b114034f..cbadb1f8ee92 100644
--- a/include/linux/dma-buf.h
+++ b/include/linux/dma-buf.h
@@ -146,7 +146,7 @@ struct dma_buf_ops {
 	/* TODO: Add try_map_dma_buf version, to return immed with -EBUSY
 	 * if the call would block.
 	 */
-#ifdef CONFIG_ARCH_ROCKCHIP
+#if !defined(CONFIG_DMABUF_CACHE)
 	int (*set_release_callback)(void (*release_callback)(void *data),
 				    void *data);
 	void *(*get_release_callback_data)(void *callback);
@@ -438,7 +438,7 @@ struct dma_buf {
 	size_t size;
 	struct file *file;
 	struct list_head attachments;
-#ifdef CONFIG_ARCH_ROCKCHIP
+#if !defined(CONFIG_DMABUF_CACHE)
 	struct list_head release_callbacks;
 	struct mutex release_lock;
 #endif
@@ -545,7 +545,7 @@ static inline void get_dma_buf(struct dma_buf *dmabuf)
 	get_file(dmabuf->file);
 }
 
-#ifdef CONFIG_ARCH_ROCKCHIP
+#if !defined(CONFIG_DMABUF_CACHE)
 int dma_buf_set_release_callback(struct dma_buf *dmabuf,
 				 void (*callback)(void *), void *data);
 

commit 3c29e3c43b60e5c43af6e201e93f0202ee575f81
Author: Elaine Zhang <zhangqing@rock-chips.com>
Date:   Wed Nov 3 11:15:49 2021 +0800

    clk: rockchip: rk3568: add CLK_SET_RATE_NO_REPARENT flag for clk_gmacx_rx_tx
    
    Change-Id: If0f415b6b4f8694572e20ff3658d2f079a3190e8
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>

diff --git a/drivers/clk/rockchip/clk-rk3568.c b/drivers/clk/rockchip/clk-rk3568.c
index 242a282d0042..33854addab92 100644
--- a/drivers/clk/rockchip/clk-rk3568.c
+++ b/drivers/clk/rockchip/clk-rk3568.c
@@ -982,7 +982,7 @@ static struct rockchip_clk_branch rk3568_clk_branches[] __initdata = {
 			RK3568_CLKSEL_CON(31), 4, 2, MFLAGS),
 	MUX(SCLK_GMAC0_RMII_SPEED, "clk_gmac0_rmii_speed", mux_gmac0_rmii_speed_p, 0,
 			RK3568_CLKSEL_CON(31), 3, 1, MFLAGS),
-	MUX(SCLK_GMAC0_RX_TX, "clk_gmac0_rx_tx", mux_gmac0_rx_tx_p,  CLK_SET_RATE_PARENT,
+	MUX(SCLK_GMAC0_RX_TX, "clk_gmac0_rx_tx", mux_gmac0_rx_tx_p,  CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
 			RK3568_CLKSEL_CON(31), 0, 2, MFLAGS),
 
 	/* PD_USB */
@@ -1036,7 +1036,7 @@ static struct rockchip_clk_branch rk3568_clk_branches[] __initdata = {
 			RK3568_CLKSEL_CON(33), 4, 2, MFLAGS),
 	MUX(SCLK_GMAC1_RMII_SPEED, "clk_gmac1_rmii_speed", mux_gmac1_rmii_speed_p, 0,
 			RK3568_CLKSEL_CON(33), 3, 1, MFLAGS),
-	MUX(SCLK_GMAC1_RX_TX, "clk_gmac1_rx_tx", mux_gmac1_rx_tx_p,  CLK_SET_RATE_PARENT,
+	MUX(SCLK_GMAC1_RX_TX, "clk_gmac1_rx_tx", mux_gmac1_rx_tx_p,  CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
 			RK3568_CLKSEL_CON(33), 0, 2, MFLAGS),
 
 	/* PD_PERI */

commit 96166eb846834eee1f9a21e1c82c062e09163794
Author: XiaoTan Luo <lxt@rock-chips.com>
Date:   Tue Nov 2 18:07:16 2021 +0800

    ASoC: es8311: fixed the dapm route error
    
    SND_SOC_DAPM_AIF_OUT/SND_SOC_DAPM_AIF_IN must match the dai stream name
    
    Fixes: 3b13f64c6dd1 ("ASoC: es8311: add support es8311 codec driver")
    Signed-off-by: XiaoTan Luo <lxt@rock-chips.com>
    Change-Id: I2ed044b2ea9e518bb4bd0fa1b578a64495e9723a

diff --git a/sound/soc/codecs/es8311.c b/sound/soc/codecs/es8311.c
index 1a328ce95d97..e6b2b81681bd 100644
--- a/sound/soc/codecs/es8311.c
+++ b/sound/soc/codecs/es8311.c
@@ -244,10 +244,10 @@ static const struct snd_soc_dapm_widget es8311_dapm_widgets[] = {
 	SND_SOC_DAPM_MUX("SDP OUT MUX", SND_SOC_NOPM, 0, 0,
 			 &es8311_adc_sdp_mux_controls),
 	/* Digital Interface */
-	SND_SOC_DAPM_AIF_OUT("I2S OUT", "I2S1 Capture",  1,
+	SND_SOC_DAPM_AIF_OUT("I2S OUT", "Capture",  1,
 			     SND_SOC_NOPM, 0, 0),
 	/* Render path	*/
-	SND_SOC_DAPM_AIF_IN("I2S IN", "I2S1 Playback", 0,
+	SND_SOC_DAPM_AIF_IN("I2S IN", "Playback", 0,
 			    SND_SOC_NOPM, 0, 0),
 	/*DACs SDP DATA SRC MUX */
 	SND_SOC_DAPM_MUX("DAC SDP SRC MUX", SND_SOC_NOPM, 0, 0,

commit 1d5173fc2d7b6566bb03e663a44705c749a02bfb
Author: William Wu <william.wu@rock-chips.com>
Date:   Tue Nov 2 19:42:06 2021 +0800

    phy: rockchip-naneng-usb2: do apb reset during probe
    
    It's not enough to reset the internal circuit in phy
    with the phy power reset signal when probe. It also
    needs to reset the apb of phy, with this patch, we
    can fix the usb enumeration error on some rv1126/rv1109
    products.
    
    Signed-off-by: William Wu <william.wu@rock-chips.com>
    Change-Id: Ib6bb0f0aeca7577ad65041a28ede57ba110b7bc0

diff --git a/drivers/phy/rockchip/phy-rockchip-naneng-usb2.c b/drivers/phy/rockchip/phy-rockchip-naneng-usb2.c
index 924b316ef6d2..1a6ae9dedacd 100644
--- a/drivers/phy/rockchip/phy-rockchip-naneng-usb2.c
+++ b/drivers/phy/rockchip/phy-rockchip-naneng-usb2.c
@@ -221,6 +221,7 @@ struct rockchip_usb2phy_port {
  * @dev: pointer to our struct device.
  * @grf: General Register Files regmap.
  * @base: the base address of APB interface.
+ * @apb_reset: apb reset signal for phy.
  * @reset: power reset signal for phy.
  * @clks: array of input clocks.
  * @num_clks: number of input clocks.
@@ -239,6 +240,7 @@ struct rockchip_usb2phy {
 	struct device		*dev;
 	struct regmap		*grf;
 	void __iomem		*base;
+	struct reset_control	*apb_reset;
 	struct reset_control	*reset;
 	struct clk_bulk_data	*clks;
 	int			num_clks;
@@ -1507,6 +1509,10 @@ static int rockchip_usb2phy_probe(struct platform_device *pdev)
 	if (IS_ERR(rphy->reset))
 		return PTR_ERR(rphy->reset);
 
+	rphy->apb_reset = devm_reset_control_get(dev, "u2phy-apb");
+	if (IS_ERR(rphy->apb_reset))
+		return PTR_ERR(rphy->apb_reset);
+
 	rphy->vup_gpio = devm_gpiod_get_optional(dev, "vup", GPIOD_OUT_LOW);
 	if (IS_ERR(rphy->vup_gpio)) {
 		ret = PTR_ERR(rphy->vup_gpio);
@@ -1514,9 +1520,11 @@ static int rockchip_usb2phy_probe(struct platform_device *pdev)
 		return ret;
 	}
 
+	reset_control_assert(rphy->apb_reset);
 	reset_control_assert(rphy->reset);
 	udelay(1);
 	reset_control_deassert(rphy->reset);
+	reset_control_deassert(rphy->apb_reset);
 
 	match = of_match_device(dev->driver->of_match_table, dev);
 	if (!match || !match->data) {

commit 0deaba2121d8f4ed3960fa13f69e0ae74e091cd1
Author: XiaoTan Luo <lxt@rock-chips.com>
Date:   Thu Sep 30 15:39:16 2021 +0800

    arm64: dts: rockchip: rk3568-linux: enable hdmi_sound with hdmi jack function
    
    Signed-off-by: XiaoTan Luo <lxt@rock-chips.com>
    Change-Id: I56ed59069293cd04d867f7d0facf12569b322434

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
index 34af555d2a23..57d83d46e40f 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
@@ -39,6 +39,11 @@
 	};
 };
 
+&hdmi_sound {
+	status = "okay";
+	rockchip,jack-det;
+};
+
 &reserved_memory {
 	ramoops: ramoops@110000 {
 		compatible = "ramoops";

commit 520474071e476c58b0f88696f5c6d38c7af14de7
Author: XiaoTan Luo <lxt@rock-chips.com>
Date:   Fri Sep 17 13:54:08 2021 +0800

    arm64: dts: rockchip: rk3568-evb: use "rockchip,hdmi" instead of "simple-audio-card"
    
    Such as Debian SDK need the HDMI connection jack status to monitor the audio devices.
    if want to enable jack detection must add this config: "rockchip,jack-det;"
    else if want to disable jack detection and than remove "rockchip,jack-det;"
    
    Signed-off-by: XiaoTan Luo <lxt@rock-chips.com>
    Change-Id: I4a530987b032c1bc564804f6274cb30b495ea205

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
index 1bfaeb681069..18d6115341cd 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
@@ -151,18 +151,12 @@
 	};
 
 	hdmi_sound: hdmi-sound {
-		compatible = "simple-audio-card";
-		simple-audio-card,format = "i2s";
-		simple-audio-card,mclk-fs = <128>;
-		simple-audio-card,name = "rockchip,hdmi";
 		status = "disabled";
-
-		simple-audio-card,cpu {
-				sound-dai = <&i2s0_8ch>;
-		};
-		simple-audio-card,codec {
-				sound-dai = <&hdmi>;
-		};
+		compatible = "rockchip,hdmi";
+		rockchip,mclk-fs = <128>;
+		rockchip,name = "rockchip,hdmi";
+		rockchip,cpu = <&i2s0_8ch>;
+		rockchip,codec = <&hdmi>;
 	};
 
 	leds: leds {

commit d8f7033aa0d595824a786e6bd7049a0cdb374230
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Fri Oct 29 15:13:52 2021 +0800

    mmc: dw_mmc-rockchip: Improve v2 tuning
    
    v2 tuning has a defect that if invalid space is laid
    between 90 and 180, and the PVT might make the invalid
    space back and forth. To overcome this weakness, we don't
    need to select phase from beginning, and should directly
    chose the next one against the last phase selected.
    
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: I0cbeb1dba524c2e23a3719d28b868af3ed49e20b

diff --git a/drivers/mmc/host/dw_mmc-rockchip.c b/drivers/mmc/host/dw_mmc-rockchip.c
index acf10c4ffea1..aec06b9284a8 100644
--- a/drivers/mmc/host/dw_mmc-rockchip.c
+++ b/drivers/mmc/host/dw_mmc-rockchip.c
@@ -147,22 +147,29 @@ static int dw_mci_v2_execute_tuning(struct dw_mci_slot *slot, u32 opcode)
 	struct dw_mci *host = slot->host;
 	struct dw_mci_rockchip_priv_data *priv = host->priv;
 	struct mmc_host *mmc = slot->mmc;
-	u32 degrees[4] = {90, 180, 270, 360};
+	u32 degrees[4] = {0, 90, 180, 270}, degree;
 	int i;
 	static bool inherit = true;
 
 	if (inherit) {
 		inherit = false;
-		i = clk_get_phase(priv->sample_clk) / 90 - 1;
+		i = clk_get_phase(priv->sample_clk) / 90;
+		degree = degrees[i];
 		goto done;
 	}
 
-	/* v2 only support 4 degrees in theory */
+	/*
+	 * v2 only support 4 degrees in theory.
+	 * First we inherit sample phases from firmware, which should
+	 * be able work fine, at least in the first place.
+	 * If retune is needed, we search forward to pick the last
+	 * one phase from degree list and loop around until we get one.
+	 * It's impossible all 4 fixed phase won't be able to work.
+	 */
 	for (i = 0; i < ARRAY_SIZE(degrees); i++) {
-		if (degrees[i] == priv->last_degree)
-			continue;
-
-		clk_set_phase(priv->sample_clk, degrees[i]);
+		degree = degrees[i] + priv->last_degree;
+		degree = degree % 360;
+		clk_set_phase(priv->sample_clk, degree);
 		if (!mmc_send_tuning(mmc, opcode, NULL))
 			break;
 	}
@@ -174,7 +181,7 @@ static int dw_mci_v2_execute_tuning(struct dw_mci_slot *slot, u32 opcode)
 
 done:
 	dev_info(host->dev, "Successfully tuned phase to %d\n", degrees[i]);
-	priv->last_degree = degrees[i];
+	priv->last_degree = degree;
 	return 0;
 }
 

commit 8d0e8827901af29b61547b1c6d4daa590399ac1e
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Wed Oct 27 09:50:53 2021 +0800

    mmc: dw_mmc-rockchip: Skip all phases bigger than 270 degrees
    
    Per design recommendation, it'd better not try to use any phase
    which is bigger than 270. Let's officially follow this.
    
    Change-Id: I8dee3eb648d321cc86e0926844cde528dbb5bd95
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>

diff --git a/drivers/mmc/host/dw_mmc-rockchip.c b/drivers/mmc/host/dw_mmc-rockchip.c
index cc7cd5e7fd21..acf10c4ffea1 100644
--- a/drivers/mmc/host/dw_mmc-rockchip.c
+++ b/drivers/mmc/host/dw_mmc-rockchip.c
@@ -215,6 +215,9 @@ static int dw_mci_rk3288_execute_tuning(struct dw_mci_slot *slot, u32 opcode)
 
 	/* Try each phase and extract good ranges */
 	for (i = 0; i < priv->num_phases; ) {
+		/* Cannot guarantee any phases larger than 270 would work well */
+		if (TUNING_ITERATION_TO_PHASE(i, priv->num_phases) > 270)
+			break;
 		clk_set_phase(priv->sample_clk,
 			      TUNING_ITERATION_TO_PHASE(i, priv->num_phases));
 

commit abc59cba82d0832637deb15a69cb9d6781b920f0
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Thu Oct 14 16:38:01 2021 +0800

    media: rockchip: ispp: replace iommu detach/attach
    
    Change-Id: I1cf46cb9cba85be418f32d218dd70452c8062d42
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/ispp/hw.c b/drivers/media/platform/rockchip/ispp/hw.c
index 9d755cc88c38..ef4b8c315f61 100644
--- a/drivers/media/platform/rockchip/ispp/hw.c
+++ b/drivers/media/platform/rockchip/ispp/hw.c
@@ -16,6 +16,7 @@
 #include <linux/reset.h>
 #include <media/videobuf2-dma-contig.h>
 #include <media/videobuf2-dma-sg.h>
+#include <soc/rockchip/rockchip_iommu.h>
 
 #include "common.h"
 #include "dev.h"
@@ -40,10 +41,6 @@ struct irqs_data {
 
 void rkispp_soft_reset(struct rkispp_hw_dev *hw)
 {
-	struct iommu_domain *domain = iommu_get_domain_for_dev(hw->dev);
-
-	if (domain)
-		iommu_detach_device(domain, hw->dev);
 	writel(GLB_SOFT_RST_ALL, hw->base_addr + RKISPP_CTRL_RESET);
 	udelay(10);
 	if (hw->reset) {
@@ -52,8 +49,12 @@ void rkispp_soft_reset(struct rkispp_hw_dev *hw)
 		reset_control_deassert(hw->reset);
 		udelay(20);
 	}
-	if (domain)
-		iommu_attach_device(domain, hw->dev);
+
+	/* refresh iommu after reset */
+	if (hw->is_mmu) {
+		rockchip_iommu_disable(hw->dev);
+		rockchip_iommu_enable(hw->dev);
+	}
 
 	writel(SW_SCL_BYPASS, hw->base_addr + RKISPP_SCL0_CTRL);
 	writel(SW_SCL_BYPASS, hw->base_addr + RKISPP_SCL1_CTRL);

commit eac9782a733332d4e33b7fc82774367afd663558
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Thu Oct 14 16:26:33 2021 +0800

    media: rockchip: isp: replace iommu detach/attach
    
    fix NULL Pointer when isp to reset
    [ 4486.719609]  __iommu_dma_unmap+0x14/0x7c
    [ 4486.719968]  iommu_dma_unmap_sg+0x64/0x90
    [ 4486.720348]  __iommu_unmap_sg_attrs+0x48/0x5c
    [ 4486.720745]  vb2_dma_sg_dmabuf_ops_detach+0x60/0x80
    [ 4486.721192]  dma_buf_detach+0x88/0x9c
    
    iommu_detach_device will set domain to null,
    and __iommu_dma_unmap using domain but no check.
    
    Change-Id: I3c679565c6a7e67783e1750fc4d028191a9c9fcf
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/hw.c b/drivers/media/platform/rockchip/isp/hw.c
index 1f587f95da03..5707b29ea975 100644
--- a/drivers/media/platform/rockchip/isp/hw.c
+++ b/drivers/media/platform/rockchip/isp/hw.c
@@ -17,6 +17,7 @@
 #include <linux/reset.h>
 #include <media/videobuf2-dma-contig.h>
 #include <media/videobuf2-dma-sg.h>
+#include <soc/rockchip/rockchip_iommu.h>
 
 #include "common.h"
 #include "dev.h"
@@ -523,10 +524,6 @@ static inline bool is_iommu_enable(struct device *dev)
 void rkisp_soft_reset(struct rkisp_hw_dev *dev, bool is_secure)
 {
 	void __iomem *base = dev->base_addr;
-	struct iommu_domain *domain = iommu_get_domain_for_dev(dev->dev);
-
-	if (domain)
-		iommu_detach_device(domain, dev->dev);
 
 	if (is_secure) {
 		/* if isp working, cru reset isn't secure.
@@ -549,8 +546,11 @@ void rkisp_soft_reset(struct rkisp_hw_dev *dev, bool is_secure)
 	writel(0xffff, base + CIF_IRCL);
 	udelay(10);
 
-	if (domain)
-		iommu_attach_device(domain, dev->dev);
+	/* refresh iommu after reset */
+	if (dev->is_mmu) {
+		rockchip_iommu_disable(dev->dev);
+		rockchip_iommu_enable(dev->dev);
+	}
 }
 
 static void isp_config_clk(struct rkisp_hw_dev *dev, int on)

commit ea097296901ff7f3a1d11bd912a6653534fcc70d
Author: Ding Wei <leo.ding@rock-chips.com>
Date:   Fri Oct 22 18:11:29 2021 +0800

    video: rockchip: mpp: mpp_iommu_refresh via rockchip_iommu funcs
    
    reason:
    device_links_read_lock/unlock are not export symbols, thus use
    rockchip_iommu_disable/enable instead.
    
    Change-Id: I545eced499533383f6cfbdf81e696064f42b6c3e
    Signed-off-by: Ding Wei <leo.ding@rock-chips.com>

diff --git a/drivers/video/rockchip/mpp/mpp_iommu.c b/drivers/video/rockchip/mpp/mpp_iommu.c
index 2e035aa5f8af..b9f10cd0c689 100644
--- a/drivers/video/rockchip/mpp/mpp_iommu.c
+++ b/drivers/video/rockchip/mpp/mpp_iommu.c
@@ -20,7 +20,7 @@
 #include <linux/kref.h>
 #include <linux/slab.h>
 #include <linux/pm_runtime.h>
-#include "../../../base/base.h"
+#include <soc/rockchip/rockchip_iommu.h>
 
 #include "mpp_debug.h"
 #include "mpp_iommu.h"
@@ -460,27 +460,15 @@ int mpp_iommu_remove(struct mpp_iommu_info *info)
 
 int mpp_iommu_refresh(struct mpp_iommu_info *info, struct device *dev)
 {
-	int idx, i;
-	int usage_count;
-	struct device_link *link;
-	struct device *iommu_dev = &info->pdev->dev;
-
-	idx = device_links_read_lock();
-
-	usage_count = atomic_read(&iommu_dev->power.usage_count);
-	list_for_each_entry_rcu(link, &dev->links.suppliers, c_node) {
-		for (i = 0; i < usage_count; i++)
-			pm_runtime_put_sync(link->supplier);
-	}
-
-	list_for_each_entry_rcu(link, &dev->links.suppliers, c_node) {
-		for (i = 0; i < usage_count; i++)
-			pm_runtime_get_sync(link->supplier);
-	}
+	int ret;
 
-	device_links_read_unlock(idx);
+	/* disable iommu */
+	ret = rockchip_iommu_disable(dev);
+	if (ret)
+		return ret;
 
-	return 0;
+	/* re-enable iommu */
+	return rockchip_iommu_enable(dev);
 }
 
 int mpp_iommu_flush_tlb(struct mpp_iommu_info *info)

commit 7964bdd1b194256b325902d4e8e1df3255842874
Author: Wangqiang Guo <kay.guo@rock-chips.com>
Date:   Wed Oct 13 08:40:59 2021 +0000

    input: sensor: accel: support 3-Axis accelerometer: da228e
    
    Signed-off-by: Wangqiang Guo <kay.guo@rock-chips.com>
    Change-Id: I272c179d151acefcd54fa01cf25fc3790a141ecd

diff --git a/drivers/input/sensors/accel/Kconfig b/drivers/input/sensors/accel/Kconfig
index 9cde3e630fac..790127d9e284 100644
--- a/drivers/input/sensors/accel/Kconfig
+++ b/drivers/input/sensors/accel/Kconfig
@@ -146,6 +146,12 @@ config GS_DA223
 	  To have support for your specific gsesnor you will have to
 	  select the proper drivers which depend on this option.
 
+config GS_DA228E
+	tristate "gsensor da228e"
+	help
+	  To have support for your specific gsesnor you will have to
+	  select the proper drivers which depend on this option.
+
 config ICM2060X_ACC
 	tristate "gsensor icm2060x"
 	help
diff --git a/drivers/input/sensors/accel/Makefile b/drivers/input/sensors/accel/Makefile
index 108bb258c2ff..687d23d34554 100644
--- a/drivers/input/sensors/accel/Makefile
+++ b/drivers/input/sensors/accel/Makefile
@@ -19,5 +19,6 @@ obj-$(CONFIG_BMA2XX_ACC)	+= bma2xx.o
 obj-$(CONFIG_STK8BAXX_ACC)	+= stk8baxx.o
 obj-$(CONFIG_GS_DA215S)		+= da215s/
 obj-$(CONFIG_GS_DA223)		+= da223.o
+obj-$(CONFIG_GS_DA228E)		+= da228e/
 obj-$(CONFIG_ICM2060X_ACC)	+= icm2060x_acc.o
 da223-y	:= da223_cust.o da223_core.o
diff --git a/drivers/input/sensors/accel/da228e/Makefile b/drivers/input/sensors/accel/da228e/Makefile
new file mode 100644
index 000000000000..64998da2ac0e
--- /dev/null
+++ b/drivers/input/sensors/accel/da228e/Makefile
@@ -0,0 +1,2 @@
+obj-$(CONFIG_GS_DA228E)		+= gs-da228e.o
+gs-da228e-y	+= da228e.o da228e_core.o
diff --git a/drivers/input/sensors/accel/da228e/da228e.c b/drivers/input/sensors/accel/da228e/da228e.c
new file mode 100644
index 000000000000..a0819e8a8033
--- /dev/null
+++ b/drivers/input/sensors/accel/da228e/da228e.c
@@ -0,0 +1,344 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co. Ltd.
+ *
+ * Author: Kay Guo <kay.guo@rock-chips.com>
+ */
+
+#include <linux/atomic.h>
+#include <linux/delay.h>
+#ifdef CONFIG_HAS_EARLYSUSPEND
+#include <linux/earlysuspend.h>
+#endif
+#include <linux/freezer.h>
+#include <linux/gpio.h>
+#include <linux/i2c.h>
+#include <linux/input.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/miscdevice.h>
+#include <linux/of_gpio.h>
+#include <linux/sensor-dev.h>
+#include <linux/slab.h>
+#include <linux/uaccess.h>
+#include <linux/workqueue.h>
+#include "da228e_core.h"
+
+/* Linear acceleration  register */
+#define DA228E_CONFIG	0X00
+#define DA228E_CHIP_ID	0x01
+#define ACC_X_LSB	0x02
+#define ACC_X_MSB	0x03
+#define ACC_Y_LSB	0x04
+#define ACC_Y_MSB	0x05
+#define ACC_Z_LSB       0x06
+#define ACC_Z_MSB       0x07
+#define MOTION_FLAG	0x09
+#define NEWDATA_FLAG	0x0A
+#define ACTIVE_STATUS	0x0B
+#define DA228E_RANGE	0x0F
+#define ODR_AXIS	0x10
+#define DA228E_MODE_BW	0x11
+#define SWAP_POLARITY	0x12
+#define INT_ACTIVE_SET1	0x16
+#define INT_DATA_SET2	0x17
+#define INT_MAP1	0x19
+#define INT_MAP2	0x1A
+#define INT_CONFIG	0x20
+#define INT_LATCH	0x21
+#define ACTIVE_DUR	0x27
+#define ACTIVE_THS	0x28
+
+#define DA228E_CHIPID_DATA	0x13
+#define DA228E_CTRL_NORMAL	0x34
+#define DA228E_CTRL_SUSPEND	0x80
+#define INT_ACTIVE_ENABLE	0x87
+#define INT_NEW_DATA_ENABLE	0x10
+
+#define DA228E_OFFSET_MAX	200
+#define DA228E_OFFSET_CUS	130
+#define DA228E_OFFSET_SEN	1024
+
+#define GSENSOR_MIN		2
+#define DA228E_PRECISION	12
+#define DA228E_DATA_RANGE	(16384 * 4)
+#define DA228E_BOUNDARY		(0x1 << (DA228E_PRECISION - 1))
+#define DA228E_GRAVITY_STEP	(DA228E_DATA_RANGE/DA228E_BOUNDARY)
+
+/******************************************************************************/
+
+static int sensor_active(struct i2c_client *client, int enable, int rate)
+{
+	struct sensor_private_data *sensor =
+		(struct sensor_private_data *)i2c_get_clientdata(client);
+	int result = 0;
+
+	sensor->ops->ctrl_data = sensor_read_reg(client, sensor->ops->ctrl_reg);
+	if (enable)
+		sensor->ops->ctrl_data &= DA228E_CTRL_NORMAL;
+	else
+		sensor->ops->ctrl_data |= DA228E_CTRL_SUSPEND;
+
+	result = sensor_write_reg(client, sensor->ops->ctrl_reg,
+				  sensor->ops->ctrl_data);
+	if (result)
+		dev_err(&client->dev, "%s:fail to active sensor\n", __func__);
+
+	dev_dbg(&client->dev, "%s:reg = 0x%x, reg_ctrl = 0x%x, enable= %d\n",
+		 __func__,
+		 sensor->ops->ctrl_reg, sensor->ops->ctrl_data, enable);
+
+	return result;
+}
+
+static int sensor_init(struct i2c_client *client)
+{
+	struct sensor_private_data *sensor =
+		(struct sensor_private_data *)i2c_get_clientdata(client);
+	int status = 0;
+	int result = 0;
+
+	result = sensor->ops->active(client, 0, 0);
+	if (result) {
+		dev_err(&client->dev,
+			"%s:line=%d,error\n", __func__, __LINE__);
+		return result;
+	}
+	sensor->status_cur = SENSOR_OFF;
+
+	result = sensor_write_reg(client, DA228E_CONFIG, 0x24);
+	mdelay(25);
+	/*+/-4G,12bit  normal mode  ODR = 62.5hz*/
+	result |= sensor_write_reg(client, DA228E_RANGE, 0x61);
+	result |= sensor_write_reg(client, DA228E_MODE_BW, 0x34);
+	result |= sensor_write_reg(client, ODR_AXIS, 0x06);
+	if (result) {
+		dev_err(&client->dev, "%s:fail to config DA228E_accel.\n",
+		__func__);
+		return result;
+	}
+
+	/* Enable or Disable for active Interrupt */
+	status = sensor_read_reg(client, INT_ACTIVE_SET1);
+	if (sensor->pdata->irq_enable)
+		status |= INT_ACTIVE_ENABLE;
+	else
+		status &= ~INT_ACTIVE_ENABLE;
+	result = sensor_write_reg(client, INT_ACTIVE_SET1, status);
+	if (result) {
+		dev_err(&client->dev,
+			"%s:fail to set DA228E_INT_ACTIVE.\n", __func__);
+		return result;
+	}
+
+	/* Enable or Disable for new data Interrupt */
+	status = sensor_read_reg(client, INT_DATA_SET2);
+	if (sensor->pdata->irq_enable)
+		status |= INT_NEW_DATA_ENABLE;
+	else
+		status &= ~INT_NEW_DATA_ENABLE;
+	result = sensor_write_reg(client, INT_DATA_SET2, status);
+	if (result) {
+		dev_err(&client->dev,
+			"%s:fail to set DA228E_INT_NEW_DATA.\n", __func__);
+		return result;
+	}
+
+	return result;
+}
+
+static int sensor_convert_data(struct i2c_client *client,
+			      unsigned char low_byte4, unsigned char high_byte8)
+{
+	s64 result;
+
+	result = ((short)((high_byte8 << 8)|low_byte4)) >> 4;
+
+	return (int)result;
+}
+
+
+static int gsensor_report_value(struct i2c_client *client,
+				struct sensor_axis *axis)
+{
+	struct sensor_private_data *sensor =
+		(struct sensor_private_data *)i2c_get_clientdata(client);
+	if ((abs(sensor->axis.x - axis->x) > GSENSOR_MIN) ||
+	    (abs(sensor->axis.y - axis->y) > GSENSOR_MIN) ||
+	    (abs(sensor->axis.z - axis->z) > GSENSOR_MIN)) {
+		input_report_abs(sensor->input_dev, ABS_X, axis->x);
+		input_report_abs(sensor->input_dev, ABS_Y, axis->y);
+		input_report_abs(sensor->input_dev, ABS_Z, axis->z);
+		input_sync(sensor->input_dev);
+	}
+
+	return 0;
+}
+
+static int sensor_report_value(struct i2c_client *client)
+{
+	struct sensor_axis axis;
+	struct sensor_private_data *sensor =
+		(struct sensor_private_data *)i2c_get_clientdata(client);
+	struct sensor_platform_data *pdata = sensor->pdata;
+	unsigned char buffer[6] = {0};
+	int x, y, z;
+	int ret = 0;
+	int tmp_x = 0, tmp_y = 0, tmp_z = 0;
+
+	if (sensor->ops->read_len < 6) {
+		dev_err(&client->dev, "%s:Read len is error,len= %d\n",
+			__func__, sensor->ops->read_len);
+		return -EINVAL;
+	}
+
+	*buffer = sensor->ops->read_reg;
+	ret = sensor_rx_data(client, buffer, sensor->ops->read_len);
+	if (ret < 0) {
+		dev_err(&client->dev,
+			"da228e read data failed, ret = %d\n", ret);
+		return ret;
+	}
+
+	/* x,y,z axis is the 12-bit acceleration output */
+	x = sensor_convert_data(sensor->client, buffer[0], buffer[1]);
+	y = sensor_convert_data(sensor->client, buffer[2], buffer[3]);
+	z = sensor_convert_data(sensor->client, buffer[4], buffer[5]);
+
+	da228e_temp_calibrate(&x, &y, &z);
+
+	dev_dbg(&client->dev, "%s:x=%d, y=%d, z=%d\n", __func__, x, y, z);
+
+	tmp_x = x * DA228E_GRAVITY_STEP;
+	tmp_y = y * DA228E_GRAVITY_STEP;
+	tmp_z = z * DA228E_GRAVITY_STEP;
+	dev_dbg(&client->dev, "%s:temp_x = %d, temp_y = %d, temp_z = %d\n",
+		__func__, tmp_x, tmp_y, tmp_z);
+
+	axis.x = (pdata->orientation[0]) * tmp_x + (pdata->orientation[1]) * tmp_y +
+		 (pdata->orientation[2]) * tmp_z;
+	axis.y = (pdata->orientation[3]) * tmp_x + (pdata->orientation[4]) * tmp_y +
+		 (pdata->orientation[5]) * tmp_z;
+	axis.z = (pdata->orientation[6]) * tmp_x + (pdata->orientation[7]) * tmp_y +
+		 (pdata->orientation[8]) * tmp_z;
+	dev_dbg(&client->dev, "%s:<map:>axis=%d, %d, %d\n", __func__,
+		axis.x, axis.y, axis.z);
+
+	gsensor_report_value(client, &axis);
+
+	mutex_lock(&(sensor->data_mutex));
+	sensor->axis = axis;
+	mutex_unlock(&(sensor->data_mutex));
+
+	if (sensor->pdata->irq_enable) {
+		ret = sensor_write_reg(client, INT_MAP1, 0);
+		if (ret) {
+			dev_err(&client->dev,
+				"%s:fail to clear DA228E_INT_register.\n",
+				__func__);
+			return ret;
+		}
+		ret = sensor_write_reg(client, INT_MAP2, 0);
+		if (ret) {
+			dev_err(&client->dev,
+				"%s:fail to clear DA228E_INT_register.\n",
+				__func__);
+			return ret;
+		}
+	}
+
+	return ret;
+}
+
+/******************************************************************************/
+static int sensor_suspend(struct i2c_client *client)
+{
+	int result = 0;
+
+//	MI_FUN;
+//	result = mir3da_set_enable(client, false);
+//	if (result) {
+//		MI_ERR("sensor_suspend disable  fail!!\n");
+//		return result;
+//	}
+
+	return result;
+}
+
+/******************************************************************************/
+static int sensor_resume(struct i2c_client *client)
+{
+	int result = 0;
+
+//	MI_FUN;
+
+	/*
+	 * result = mir3da_chip_resume(client);
+	 * if(result) {
+	 * MI_ERR("sensor_resume chip resume fail!!\n");
+	 * return result;
+	 * }
+	 */
+//	result = mir3da_set_enable(client, true);
+//	if (result) {
+//		MI_ERR("sensor_resume enable  fail!!\n");
+//		return result;
+//	}
+
+	return result;
+}
+
+static struct sensor_operate gsensor_da228e_ops = {
+	.name		= "gs_da228e",
+	.type		= SENSOR_TYPE_ACCEL,
+	.id_i2c		= ACCEL_ID_DA228E,
+	.read_reg	= ACC_X_LSB,
+	.read_len	= 6,
+	.id_reg		= DA228E_CHIP_ID,
+	.id_data	= DA228E_CHIPID_DATA,
+	.precision	= DA228E_PRECISION,
+	.ctrl_reg	= DA228E_MODE_BW,
+	.int_status_reg	= INT_MAP1,
+	.range          = {-DA228E_DATA_RANGE, DA228E_DATA_RANGE},
+	.trig		= IRQF_TRIGGER_LOW | IRQF_ONESHOT,
+	.active		= sensor_active,
+	.init		= sensor_init,
+	.report		= sensor_report_value,
+	.suspend        = sensor_suspend,
+	.resume         = sensor_resume,
+};
+
+static int gsensor_da228e_probe(struct i2c_client *client,
+				const struct i2c_device_id *devid)
+{
+	return sensor_register_device(client, NULL, devid, &gsensor_da228e_ops);
+}
+
+static int gsensor_da228e_remove(struct i2c_client *client)
+{
+	return sensor_unregister_device(client, NULL, &gsensor_da228e_ops);
+}
+
+static const struct i2c_device_id gsensor_da228e_id[] = {
+	{"gs_da228e", ACCEL_ID_DA228E},
+	{}
+};
+
+static struct i2c_driver gsensor_da228e_driver = {
+	.probe = gsensor_da228e_probe,
+	.remove = gsensor_da228e_remove,
+	.shutdown = sensor_shutdown,
+	.id_table = gsensor_da228e_id,
+	.driver = {
+		.name = "gsensor_da228e",
+	#ifdef CONFIG_PM
+		.pm = &sensor_pm_ops,
+	#endif
+	},
+};
+
+module_i2c_driver(gsensor_da228e_driver);
+
+MODULE_AUTHOR("Guo Wangqiang <kay.guo@rock-chips.com>");
+MODULE_DESCRIPTION("da228e 3-Axis accelerometer driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/input/sensors/accel/da228e/da228e_core.c b/drivers/input/sensors/accel/da228e/da228e_core.c
new file mode 100644
index 000000000000..4202ed1044f1
--- /dev/null
+++ b/drivers/input/sensors/accel/da228e/da228e_core.c
@@ -0,0 +1,175 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co. Ltd.
+ *
+ * Author: Kay Guo <kay.guo@rock-chips.com>
+ */
+#include <linux/kernel.h>
+#include "da228e_core.h"
+
+#define DA228E_OFFSET_THRESHOLD	20
+#define PEAK_LVL		800
+#define STICK_LSB		2000
+#define AIX_HISTORY_SIZE	20
+
+#define TEMP_CALIBRATE_STATIC_THRESHOLD	60
+#define TEMP_CALIBRATE_STATIC_COUNT	12
+
+static int z_offset;
+
+static int squareRoot(int val)
+{
+	int ret = 0, x;
+	int shift;
+
+	if (val < 0)
+		return 0;
+
+	for (shift = 0; shift < 32; shift += 2) {
+		x = 0x40000000l >> shift;
+		if ((x+ret) <= val) {
+			val -= x + ret;
+			ret = (ret >> 1) | x;
+		} else
+			ret = ret >> 1;
+	}
+
+	return ret;
+}
+
+static int da228e_temp_calibrate_detect_static(short x, short y, short z)
+{
+	static int count_static;
+	static short temp_x[TEMP_CALIBRATE_STATIC_COUNT];
+	static short temp_y[TEMP_CALIBRATE_STATIC_COUNT];
+	static short temp_z[TEMP_CALIBRATE_STATIC_COUNT];
+	static short max_x, max_y, max_z;
+	static short min_x, min_y, min_z;
+	static char is_first = 1;
+	int i, delta_sum = 0;
+
+	count_static++;
+
+	if (is_first) {
+		temp_x[0] = x;
+		temp_y[0] = y;
+		temp_z[0] = z;
+		for (i = 1; i < TEMP_CALIBRATE_STATIC_COUNT; i++) {
+			temp_x[i] = temp_x[0];
+			temp_y[i] = temp_y[0];
+			temp_z[i] = temp_z[0];
+		}
+		is_first = 0;
+	} else {
+		max_x = min_x = temp_x[1];
+		max_y = min_y = temp_y[1];
+		max_z = min_z = temp_z[1];
+
+		for (i = 0; i < TEMP_CALIBRATE_STATIC_COUNT; i++) {
+			if (i == TEMP_CALIBRATE_STATIC_COUNT - 1) {
+				temp_x[i] = x;
+				temp_y[i] = y;
+				temp_z[i] = z;
+			} else {
+				temp_x[i] = temp_x[i+1];
+				temp_y[i] = temp_y[i+1];
+				temp_z[i] = temp_z[i+1];
+			}
+			max_x = (max_x > temp_x[i]) ? max_x:temp_x[i];
+			max_y = (max_y > temp_y[i]) ? max_y:temp_y[i];
+			max_z = (max_z > temp_z[i]) ? max_z:temp_z[i];
+
+			min_x = (min_x < temp_x[i]) ? min_x:temp_x[i];
+			min_y = (min_y < temp_y[i]) ? min_y:temp_y[i];
+			min_z = (min_z < temp_z[i]) ? min_z:temp_z[i];
+		}
+	}
+
+	if (count_static > TEMP_CALIBRATE_STATIC_COUNT) {
+		count_static = TEMP_CALIBRATE_STATIC_COUNT;
+		delta_sum = abs(max_x - min_x) + abs(max_y - min_y) +
+			    abs(max_z - min_z);
+
+		if (delta_sum < TEMP_CALIBRATE_STATIC_THRESHOLD)
+			return 1;
+	}
+
+	return 0;
+}
+
+int da228e_temp_calibrate(int *x, int *y, int *z)
+{
+	int tem_z = 0;
+	int cus = MIR3DA_OFFSET_MAX-MIR3DA_OFFSET_CUS;
+	int is_static = 0;
+	short lz_offset;
+
+	*z = *z + z_offset;
+	lz_offset  =  (*z) % 10;
+
+	if ((abs(*x) < MIR3DA_OFFSET_MAX) &&
+	    (abs(*y) < MIR3DA_OFFSET_MAX)) {
+		is_static = da228e_temp_calibrate_detect_static(*x, *y, *z-z_offset);
+		tem_z = squareRoot(MIR3DA_OFFSET_SEN*MIR3DA_OFFSET_SEN -
+				  (*x)*(*x) - (*y)*(*y)) + lz_offset;
+		if (z_offset == 0) {
+			if (is_static == 1)
+				z_offset = (*z >= 0) ? (tem_z-*z) : (-tem_z-*z);
+			*z = ((*z >= 0) ? (1) : (-1))*tem_z;
+		} else if (is_static) {
+			if (abs(abs(*z) - MIR3DA_OFFSET_SEN) > MIR3DA_OFFSET_CUS) {
+				*z = ((*z >= 0) ? (1) : (-1))*tem_z;
+				z_offset = 0;
+			}
+		}
+		*x = (*x)*MIR3DA_OFFSET_CUS/MIR3DA_OFFSET_MAX;
+		*y = (*y)*MIR3DA_OFFSET_CUS/MIR3DA_OFFSET_MAX;
+
+	} else if ((abs((abs(*x) - MIR3DA_OFFSET_SEN)) < MIR3DA_OFFSET_MAX) &&
+		   (abs(*y) < MIR3DA_OFFSET_MAX) && (z_offset)) {
+		if (abs(*x) > MIR3DA_OFFSET_SEN) {
+			*x = (*x > 0) ?
+			     (*x - (abs(*x) - MIR3DA_OFFSET_SEN)*cus/MIR3DA_OFFSET_MAX) :
+			     (*x + (abs(*x) - MIR3DA_OFFSET_SEN)*cus/MIR3DA_OFFSET_MAX);
+		} else {
+			*x = (*x > 0) ?
+			     (*x + (MIR3DA_OFFSET_SEN - abs(*x))*cus/MIR3DA_OFFSET_MAX) :
+			     (*x - (MIR3DA_OFFSET_SEN-abs(*x))*cus/MIR3DA_OFFSET_MAX);
+		}
+		*y = (*y) * MIR3DA_OFFSET_CUS/MIR3DA_OFFSET_MAX;
+	} else if ((abs((abs(*y) - MIR3DA_OFFSET_SEN)) < MIR3DA_OFFSET_MAX) &&
+		   (abs(*x) < MIR3DA_OFFSET_MAX) && (z_offset)) {
+		if (abs(*y) > MIR3DA_OFFSET_SEN) {
+			*y = (*y > 0) ?
+			     (*y - (abs(*y) - MIR3DA_OFFSET_SEN)*cus/MIR3DA_OFFSET_MAX) :
+			     (*y + (abs(*y)-MIR3DA_OFFSET_SEN)*cus/MIR3DA_OFFSET_MAX);
+		} else {
+			*y = (*y > 0) ?
+			     (*y + (MIR3DA_OFFSET_SEN - abs(*y))*cus/MIR3DA_OFFSET_MAX) :
+			     (*y - (MIR3DA_OFFSET_SEN - abs(*y))*cus/MIR3DA_OFFSET_MAX);
+		}
+		*x = (*x) * MIR3DA_OFFSET_CUS/MIR3DA_OFFSET_MAX;
+	} else if (z_offset == 0) {
+		if ((abs(*x) < MIR3DA_OFFSET_MAX) && (abs((*y > 0) ?
+		    (MIR3DA_OFFSET_SEN - *y) : (MIR3DA_OFFSET_SEN + *y)) < MIR3DA_OFFSET_MAX)) {
+			*z = ((*z >= 0) ?
+			     (1) : (-1))*abs(*x)*MIR3DA_OFFSET_CUS/MIR3DA_OFFSET_MAX;
+		} else if ((abs(*y) < MIR3DA_OFFSET_MAX) &&
+			   (abs((*x > 0) ? (MIR3DA_OFFSET_SEN - *x) : (MIR3DA_OFFSET_SEN + *x))
+			    < MIR3DA_OFFSET_MAX)) {
+			*z = ((*z >= 0) ? (1) : (-1)) *
+			     abs(*y) * MIR3DA_OFFSET_CUS/MIR3DA_OFFSET_MAX;
+		} else {
+			tem_z = squareRoot(MIR3DA_OFFSET_SEN*MIR3DA_OFFSET_SEN -
+					  (*x)*(*x) - (*y)*(*y)) + lz_offset;
+			*z = ((*z >= 0) ? (1) : (-1))*tem_z;
+		}
+	}
+
+	if (z_offset)
+		return 0;
+	else
+		return -1;
+}
+
+
diff --git a/drivers/input/sensors/accel/da228e/da228e_core.h b/drivers/input/sensors/accel/da228e/da228e_core.h
new file mode 100644
index 000000000000..29c7fe234f65
--- /dev/null
+++ b/drivers/input/sensors/accel/da228e/da228e_core.h
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co. Ltd.
+ *
+ * Author: Kay Guo <kay.guo@rock-chips.com>
+ */
+
+#ifndef __DA228E_CORE_H__
+#define __DA228E_CORE_H__
+
+#define DA228E_OFFSET_TEMP_SOLUTION	0
+
+#define MIR3DA_OFFSET_MAX	200
+#define MIR3DA_OFFSET_CUS	130
+#define MIR3DA_OFFSET_SEN	1024
+
+int da228e_temp_calibrate(int *x, int *y, int *z);
+
+#endif    /* __DA228E_CORE_H__ */
+
+
+
diff --git a/include/linux/sensor-dev.h b/include/linux/sensor-dev.h
index eeb2dfa5708d..1a927b9d0f5f 100644
--- a/include/linux/sensor-dev.h
+++ b/include/linux/sensor-dev.h
@@ -68,6 +68,7 @@ enum sensor_id {
 	ACCEL_ID_MIR3DA,
 	ACCEL_ID_ICM2060X,
 	ACCEL_ID_DA215S,
+	ACCEL_ID_DA228E,
 	COMPASS_ID_ALL,
 	COMPASS_ID_AK8975,
 	COMPASS_ID_AK8963,

commit ac2e46aaa79c897cd5e0813839fab1e6bfdecef5
Author: Wangqiang Guo <kay.guo@rock-chips.com>
Date:   Wed Oct 13 07:16:01 2021 +0000

    input: sensor: accel: support 3-Axis accelerometer: da215s
    
    Signed-off-by: Wangqiang Guo <kay.guo@rock-chips.com>
    Change-Id: Ia1c00b45fb86043c730835f95543bbd01dd882ee

diff --git a/drivers/input/sensors/accel/Kconfig b/drivers/input/sensors/accel/Kconfig
index 724cb2ca1e7a..9cde3e630fac 100644
--- a/drivers/input/sensors/accel/Kconfig
+++ b/drivers/input/sensors/accel/Kconfig
@@ -134,6 +134,12 @@ config BMA2XX_ACC
 	  To have support for your specific gsesnor you will have to
 	  select the proper drivers which depend on this option.
 
+config GS_DA215S
+	tristate "gsensor da215s"
+	help
+	  To have support for your specific gsesnor you will have to
+	  select the proper drivers which depend on this option.
+
 config GS_DA223
 	tristate "gsensor da223"
 	help
diff --git a/drivers/input/sensors/accel/Makefile b/drivers/input/sensors/accel/Makefile
index de250ef4a282..108bb258c2ff 100644
--- a/drivers/input/sensors/accel/Makefile
+++ b/drivers/input/sensors/accel/Makefile
@@ -17,6 +17,7 @@ obj-$(CONFIG_MPU6500_ACC)	+= mpu6500_acc.o
 obj-$(CONFIG_LSM330_ACC)	+= lsm330_acc.o
 obj-$(CONFIG_BMA2XX_ACC)	+= bma2xx.o
 obj-$(CONFIG_STK8BAXX_ACC)	+= stk8baxx.o
+obj-$(CONFIG_GS_DA215S)		+= da215s/
 obj-$(CONFIG_GS_DA223)		+= da223.o
 obj-$(CONFIG_ICM2060X_ACC)	+= icm2060x_acc.o
 da223-y	:= da223_cust.o da223_core.o
diff --git a/drivers/input/sensors/accel/da215s/Makefile b/drivers/input/sensors/accel/da215s/Makefile
new file mode 100644
index 000000000000..1538390d9785
--- /dev/null
+++ b/drivers/input/sensors/accel/da215s/Makefile
@@ -0,0 +1,2 @@
+obj-$(CONFIG_GS_DA215S)		+= gs-da215s.o
+gs-da215s-y	+= da215s.o da215s_core.o
diff --git a/drivers/input/sensors/accel/da215s/da215s.c b/drivers/input/sensors/accel/da215s/da215s.c
new file mode 100644
index 000000000000..b2e6d1710958
--- /dev/null
+++ b/drivers/input/sensors/accel/da215s/da215s.c
@@ -0,0 +1,343 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co. Ltd.
+ *
+ * Author: Kay Guo <kay.guo@rock-chips.com>
+ */
+#include <linux/atomic.h>
+#include <linux/delay.h>
+#ifdef CONFIG_HAS_EARLYSUSPEND
+#include <linux/earlysuspend.h>
+#endif
+#include <linux/freezer.h>
+#include <linux/gpio.h>
+#include <linux/i2c.h>
+#include <linux/input.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/miscdevice.h>
+#include <linux/of_gpio.h>
+#include <linux/sensor-dev.h>
+#include <linux/slab.h>
+#include <linux/uaccess.h>
+#include <linux/workqueue.h>
+
+#include "da215s_core.h"
+
+/* Linear acceleration  register */
+#define DA215S_CONFIG	0X00
+#define DA215S_CHIP_ID	0x01
+#define ACC_X_LSB	0x02
+#define ACC_X_MSB	0x03
+#define ACC_Y_LSB	0x04
+#define ACC_Y_MSB	0x05
+#define ACC_Z_LSB       0x06
+#define ACC_Z_MSB       0x07
+#define MOTION_FLAG	0x09
+#define NEWDATA_FLAG	0x0A
+#define ACTIVE_STATUS	0x0B
+#define DA215S_RANGE	0x0F
+#define ODR_AXIS	0x10
+#define DA215S_MODE_BW	0x11
+#define SWAP_POLARITY	0x12
+#define INT_ACTIVE_SET1	0x16
+#define INT_DATA_SET2	0x17
+#define INT_MAP1	0x19
+#define INT_MAP2	0x1A
+#define INT_CONFIG	0x20
+#define INT_LATCH	0x21
+#define ACTIVE_DUR	0x27
+#define ACTIVE_THS	0x28
+
+#define DA215S_CHIPID_DATA	0x13
+#define DA215S_CTRL_NORMAL	0x34
+#define DA215S_CTRL_SUSPEND	0x80
+#define INT_ACTIVE_ENABLE	0x87
+#define INT_NEW_DATA_ENABLE	0x10
+
+#define DA215S_OFFSET_MAX	200
+#define DA215S_OFFSET_CUS	130
+#define DA215S_OFFSET_SEN	1024
+
+#define GSENSOR_MIN		2
+#define DA215S_PRECISION	14
+#define DA215S_DATA_RANGE	(16384*4)
+#define DA215S_BOUNDARY		(0x1 << (DA215S_PRECISION - 1))
+#define DA215S_GRAVITY_STEP	(DA215S_DATA_RANGE/DA215S_BOUNDARY)
+
+
+static int sensor_active(struct i2c_client *client, int enable, int rate)
+{
+	struct sensor_private_data *sensor =
+		(struct sensor_private_data *)i2c_get_clientdata(client);
+	int result = 0;
+
+	sensor->ops->ctrl_data = sensor_read_reg(client, sensor->ops->ctrl_reg);
+	if (enable)
+		sensor->ops->ctrl_data &= DA215S_CTRL_NORMAL;
+	else
+		sensor->ops->ctrl_data |= DA215S_CTRL_SUSPEND;
+
+	result = sensor_write_reg(client, sensor->ops->ctrl_reg,
+				  sensor->ops->ctrl_data);
+	if (result)
+		dev_err(&client->dev, "%s:fail to active sensor\n", __func__);
+
+	dev_dbg(&client->dev, "reg = 0x%x, reg_ctrl = 0x%x, enable= %d\n",
+		 sensor->ops->ctrl_reg, sensor->ops->ctrl_data, enable);
+
+	return result;
+}
+
+static int sensor_init(struct i2c_client *client)
+{
+	struct sensor_private_data *sensor =
+		(struct sensor_private_data *)i2c_get_clientdata(client);
+	int status = 0;
+	int result = 0;
+
+	result = sensor->ops->active(client, 0, 0);
+	if (result) {
+		dev_err(&client->dev,
+			"%s:line=%d,error\n", __func__, __LINE__);
+		return result;
+	}
+	sensor->status_cur = SENSOR_OFF;
+
+	result = sensor_write_reg(client, 0x00, 0x24);
+	mdelay(25);
+	/*+/-4G,14bit  normal mode  ODR = 62.5hz*/
+	result |= sensor_write_reg(client, DA215S_RANGE, 0x61);
+	result |= sensor_write_reg(client, DA215S_MODE_BW, 0x34);
+	result |= sensor_write_reg(client, ODR_AXIS, 0x06);
+	if (result) {
+		dev_err(&client->dev, "%s:fail to config DA215S_accel.\n",
+		__func__);
+		return result;
+	}
+
+
+	/* Enable or Disable for active Interrupt */
+	status = sensor_read_reg(client, INT_ACTIVE_SET1);
+	if (sensor->pdata->irq_enable)
+		status |= INT_ACTIVE_ENABLE;
+	else
+		status &= ~INT_ACTIVE_ENABLE;
+	result = sensor_write_reg(client, INT_ACTIVE_SET1, status);
+	if (result) {
+		dev_err(&client->dev,
+			"%s:fail to set DA215S_INT_ACTIVE.\n", __func__);
+		return result;
+	}
+
+	/* Enable or Disable for new data Interrupt */
+	status = sensor_read_reg(client, INT_DATA_SET2);
+	if (sensor->pdata->irq_enable)
+		status |= INT_NEW_DATA_ENABLE;
+	else
+		status &= ~INT_NEW_DATA_ENABLE;
+	result = sensor_write_reg(client, INT_DATA_SET2, status);
+	if (result) {
+		dev_err(&client->dev,
+			"%s:fail to set DA215S_INT_NEW_DATA.\n", __func__);
+		return result;
+	}
+
+	return result;
+}
+
+static int sensor_convert_data(struct i2c_client *client,
+			      unsigned char low_byte4, unsigned char high_byte8)
+{
+	s64 result;
+
+	result = ((short)((high_byte8 << 8)|low_byte4)) >> 2;
+
+	return (int)result;
+}
+
+
+static int gsensor_report_value(struct i2c_client *client,
+				struct sensor_axis *axis)
+{
+	struct sensor_private_data *sensor =
+		(struct sensor_private_data *)i2c_get_clientdata(client);
+	if ((abs(sensor->axis.x - axis->x) > GSENSOR_MIN) ||
+	    (abs(sensor->axis.y - axis->y) > GSENSOR_MIN) ||
+	    (abs(sensor->axis.z - axis->z) > GSENSOR_MIN)) {
+		input_report_abs(sensor->input_dev, ABS_X, axis->x);
+		input_report_abs(sensor->input_dev, ABS_Y, axis->y);
+		input_report_abs(sensor->input_dev, ABS_Z, axis->z);
+		input_sync(sensor->input_dev);
+	}
+
+	return 0;
+}
+
+static int sensor_report_value(struct i2c_client *client)
+{
+	struct sensor_axis axis;
+	struct sensor_private_data *sensor =
+		(struct sensor_private_data *)i2c_get_clientdata(client);
+	struct sensor_platform_data *pdata = sensor->pdata;
+	unsigned char buffer[6] = {0};
+	int x = 0, y = 0, z = 0;
+	int ret = 0;
+	int tmp_x = 0, tmp_y = 0, tmp_z = 0;
+
+	if (sensor->ops->read_len < 6) {
+		dev_err(&client->dev, "%s:Read len is error,len= %d\n",
+			__func__, sensor->ops->read_len);
+		return -EINVAL;
+	}
+
+	*buffer = sensor->ops->read_reg;
+	sensor_rx_data(client, buffer, sensor->ops->read_len);
+	if (ret < 0) {
+		dev_err(&client->dev,
+			"da215s read data failed, ret = %d\n", ret);
+		return ret;
+	}
+
+	/* x,y,z axis is the 12-bit acceleration output */
+	x = sensor_convert_data(sensor->client, buffer[0], buffer[1]);
+	y = sensor_convert_data(sensor->client, buffer[2], buffer[3]);
+	z = sensor_convert_data(sensor->client, buffer[4], buffer[5]);
+
+	dev_dbg(&client->dev, "%s:x=%d, y=%d, z=%d\n",  __func__, x, y, z);
+	da215s_temp_calibrate(&x, &y, &z);
+
+	dev_dbg(&client->dev, "%s:x=%d, y=%d, z=%d\n",  __func__, x, y, z);
+
+	tmp_x = x * DA215S_GRAVITY_STEP;
+	tmp_y = y * DA215S_GRAVITY_STEP;
+	tmp_z = z * DA215S_GRAVITY_STEP;
+	dev_dbg(&client->dev, "%s:temp_x=%d, temp_y=%d, temp_z=%d\n",
+		__func__, tmp_x, tmp_y, tmp_z);
+
+	axis.x = (pdata->orientation[0]) * tmp_x + (pdata->orientation[1]) * tmp_y +
+		 (pdata->orientation[2]) * tmp_z;
+	axis.y = (pdata->orientation[3]) * tmp_x + (pdata->orientation[4]) * tmp_y +
+		 (pdata->orientation[5]) * tmp_z;
+	axis.z = (pdata->orientation[6]) * tmp_x + (pdata->orientation[7]) * tmp_y +
+		 (pdata->orientation[8]) * tmp_z;
+	dev_dbg(&client->dev, "<map:>axis = %d, %d, %d\n", axis.x, axis.y, axis.z);
+
+	gsensor_report_value(client, &axis);
+
+	mutex_lock(&(sensor->data_mutex));
+	sensor->axis = axis;
+	mutex_unlock(&(sensor->data_mutex));
+
+	if (sensor->pdata->irq_enable) {
+		ret = sensor_write_reg(client, INT_MAP1, 0);
+		if (ret) {
+			dev_err(&client->dev,
+				"%s:fail to clear DA215S_INT_register.\n",
+				__func__);
+			return ret;
+		}
+		ret = sensor_write_reg(client, INT_MAP2, 0);
+		if (ret) {
+			dev_err(&client->dev,
+				"%s:fail to clear DA215S_INT_register.\n",
+				__func__);
+			return ret;
+		}
+	}
+
+	return ret;
+}
+
+/******************************************************************************/
+static int sensor_suspend(struct i2c_client *client)
+{
+	int result = 0;
+
+//	MI_FUN;
+//	result = mir3da_set_enable(client, false);
+//	if (result) {
+//		MI_ERR("sensor_suspend disable  fail!!\n");
+//		return result;
+//	}
+
+	return result;
+}
+
+/******************************************************************************/
+static int sensor_resume(struct i2c_client *client)
+{
+	int result = 0;
+
+//	MI_FUN;
+
+	/*
+	 * result = mir3da_chip_resume(client);
+	 * if(result) {
+	 * MI_ERR("sensor_resume chip resume fail!!\n");
+	 * return result;
+	 * }
+	 */
+//	result = mir3da_set_enable(client, true);
+//	if (result) {
+//		MI_ERR("sensor_resume enable  fail!!\n");
+//		return result;
+//	}
+
+	return result;
+}
+
+static struct sensor_operate gsensor_da215s_ops = {
+	.name		= "gs_da215s",
+	.type		= SENSOR_TYPE_ACCEL,
+	.id_i2c		= ACCEL_ID_DA215S,
+	.read_reg	= ACC_X_LSB,
+	.read_len	= 6,
+	.id_reg		= DA215S_CHIP_ID,
+	.id_data	= DA215S_CHIPID_DATA,
+	.precision	= DA215S_PRECISION,
+	.ctrl_reg	= DA215S_MODE_BW,
+	.int_status_reg	= INT_MAP1,
+	.range          = {-DA215S_DATA_RANGE, DA215S_DATA_RANGE},
+	.trig		= IRQF_TRIGGER_LOW | IRQF_ONESHOT,
+	.active		= sensor_active,
+	.init		= sensor_init,
+	.report		= sensor_report_value,
+	.suspend        = sensor_suspend,
+	.resume         = sensor_resume,
+};
+
+static int gsensor_da215s_probe(struct i2c_client *client,
+				const struct i2c_device_id *devid)
+{
+	return sensor_register_device(client, NULL, devid, &gsensor_da215s_ops);
+}
+
+static int gsensor_da215s_remove(struct i2c_client *client)
+{
+	return sensor_unregister_device(client, NULL, &gsensor_da215s_ops);
+}
+
+static const struct i2c_device_id gsensor_da215s_id[] = {
+	{"gs_da215s", ACCEL_ID_DA215S},
+	{}
+};
+
+static struct i2c_driver gsensor_da215s_driver = {
+	.probe = gsensor_da215s_probe,
+	.remove = gsensor_da215s_remove,
+	.shutdown = sensor_shutdown,
+	.id_table = gsensor_da215s_id,
+	.driver = {
+		.name = "gsensor_da215s",
+	#ifdef CONFIG_PM
+		.pm = &sensor_pm_ops,
+	#endif
+	},
+};
+
+module_i2c_driver(gsensor_da215s_driver);
+
+MODULE_AUTHOR("Guo Wangqiang <kay.guo@rock-chips.com>");
+MODULE_DESCRIPTION("da215s 3-Axis accelerometer driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/input/sensors/accel/da215s/da215s_core.c b/drivers/input/sensors/accel/da215s/da215s_core.c
new file mode 100644
index 000000000000..8e675e56c3c9
--- /dev/null
+++ b/drivers/input/sensors/accel/da215s/da215s_core.c
@@ -0,0 +1,178 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co. Ltd.
+ *
+ * Author: Kay Guo <kay.guo@rock-chips.com>
+ */
+
+#include <linux/kernel.h>
+#include "da215s_core.h"
+
+#define DA215S_OFFSET_THRESHOLD	20
+#define PEAK_LVL		800
+#define STICK_LSB		2000
+#define AIX_HISTORY_SIZE	20
+
+
+static int z_offset;
+
+#define TEMP_CALIBRATE_STATIC_THRESHOLD	60
+#define TEMP_CALIBRATE_STATIC_COUNT	12
+
+static int squareRoot(int val)
+{
+	int r = 0, x;
+	int shift;
+
+	if (val < 0)
+		return 0;
+
+	for (shift = 0; shift < 32; shift += 2) {
+		x = 0x40000000l >> shift;
+		if ((x+r) <= val) {
+			val -= x + r;
+			r = (r >> 1) | x;
+		} else {
+			r = r >> 1;
+		}
+	}
+
+	return r;
+}
+
+static int da215s_temp_calibrate_detect_static(short x, short y, short z)
+{
+	static int count_static;
+	static short temp_x[TEMP_CALIBRATE_STATIC_COUNT];
+	static short temp_y[TEMP_CALIBRATE_STATIC_COUNT];
+	static short temp_z[TEMP_CALIBRATE_STATIC_COUNT];
+	static short max_x, max_y, max_z;
+	static short min_x, min_y, min_z;
+	static char is_first = 1;
+	int i, delta_sum = 0;
+
+	count_static++;
+
+	if (is_first) {
+		temp_x[0] = x;
+		temp_y[0] = y;
+		temp_z[0] = z;
+		for (i = 1; i < TEMP_CALIBRATE_STATIC_COUNT; i++) {
+			temp_x[i] = temp_x[0];
+			temp_y[i] = temp_y[0];
+			temp_z[i] = temp_z[0];
+		}
+		is_first = 0;
+	} else {
+		max_x = min_x = temp_x[1];
+		max_y = min_y = temp_y[1];
+		max_z = min_z = temp_z[1];
+
+		for (i = 0; i < TEMP_CALIBRATE_STATIC_COUNT; i++) {
+			if (i == (TEMP_CALIBRATE_STATIC_COUNT-1)) {
+				temp_x[i] = x;
+				temp_y[i] = y;
+				temp_z[i] = z;
+			} else {
+				temp_x[i] = temp_x[i+1];
+				temp_y[i] = temp_y[i+1];
+				temp_z[i] = temp_z[i+1];
+			}
+			max_x = (max_x > temp_x[i]) ? max_x:temp_x[i];
+			max_y = (max_y > temp_y[i]) ? max_y:temp_y[i];
+			max_z = (max_z > temp_z[i]) ? max_z:temp_z[i];
+
+			min_x = (min_x < temp_x[i]) ? min_x:temp_x[i];
+			min_y = (min_y < temp_y[i]) ? min_y:temp_y[i];
+			min_z = (min_z < temp_z[i]) ? min_z:temp_z[i];
+		}
+	}
+
+	if (count_static > TEMP_CALIBRATE_STATIC_COUNT) {
+		count_static = TEMP_CALIBRATE_STATIC_COUNT;
+		delta_sum = abs(max_x - min_x) + abs(max_y - min_y) + abs(max_z - min_z);
+
+		if (delta_sum < TEMP_CALIBRATE_STATIC_THRESHOLD)
+			return 1;
+	}
+
+	return 0;
+}
+
+int da215s_temp_calibrate(int *x, int *y, int *z)
+{
+	int tem_z = 0;
+	int cus = MIR3DA_OFFSET_MAX-MIR3DA_OFFSET_CUS;
+	int is_static = 0;
+	short lz_offset;
+
+	*z = *z + z_offset;
+	lz_offset  =  (*z) % 10;
+
+	if ((abs(*x) < MIR3DA_OFFSET_MAX) && (abs(*y) < MIR3DA_OFFSET_MAX)) {
+		is_static = da215s_temp_calibrate_detect_static(*x, *y, *z-z_offset);
+		tem_z = squareRoot(MIR3DA_OFFSET_SEN*MIR3DA_OFFSET_SEN -
+			(*x)*(*x) - (*y)*(*y)) + lz_offset;
+		if (z_offset == 0) {
+			if (is_static == 1)
+				z_offset = (*z >= 0) ? (tem_z-*z) : (-tem_z-*z);
+			*z = ((*z >= 0) ? (1) : (-1))*tem_z;
+		} else if (is_static) {
+			if (abs(abs(*z) - MIR3DA_OFFSET_SEN) > MIR3DA_OFFSET_CUS) {
+				*z = ((*z >= 0) ? (1) : (-1))*tem_z;
+				z_offset = 0;
+			}
+		}
+
+		*x = (*x) * MIR3DA_OFFSET_CUS / MIR3DA_OFFSET_MAX;
+		*y = (*y) * MIR3DA_OFFSET_CUS / MIR3DA_OFFSET_MAX;
+
+	} else if ((abs((abs(*x)-MIR3DA_OFFSET_SEN)) < MIR3DA_OFFSET_MAX) &&
+		   (abs(*y) < MIR3DA_OFFSET_MAX) && (z_offset)) {
+		if (abs(*x) > MIR3DA_OFFSET_SEN) {
+			*x = (*x > 0) ?
+			     (*x - (abs(*x) - MIR3DA_OFFSET_SEN) * cus/MIR3DA_OFFSET_MAX) :
+			     (*x + (abs(*x) - MIR3DA_OFFSET_SEN) * cus/MIR3DA_OFFSET_MAX);
+		} else {
+			*x = (*x > 0) ?
+			     (*x + (MIR3DA_OFFSET_SEN-abs(*x)) * cus/MIR3DA_OFFSET_MAX) :
+			     (*x - (MIR3DA_OFFSET_SEN-abs(*x)) * cus/MIR3DA_OFFSET_MAX);
+		}
+		*y = (*y) * MIR3DA_OFFSET_CUS/MIR3DA_OFFSET_MAX;
+	} else if ((abs((abs(*y) - MIR3DA_OFFSET_SEN)) < MIR3DA_OFFSET_MAX) &&
+		   (abs(*x) < MIR3DA_OFFSET_MAX) && (z_offset)) {
+		if (abs(*y) > MIR3DA_OFFSET_SEN) {
+			*y = (*y > 0) ?
+			     (*y - (abs(*y) - MIR3DA_OFFSET_SEN) * cus/MIR3DA_OFFSET_MAX) :
+			     (*y + (abs(*y) - MIR3DA_OFFSET_SEN) * cus/MIR3DA_OFFSET_MAX);
+		} else {
+			*y = (*y > 0) ?
+			     (*y + (MIR3DA_OFFSET_SEN-abs(*y)) * cus/MIR3DA_OFFSET_MAX) :
+			     (*y - (MIR3DA_OFFSET_SEN-abs(*y)) * cus/MIR3DA_OFFSET_MAX);
+		}
+		*x = (*x) * MIR3DA_OFFSET_CUS/MIR3DA_OFFSET_MAX;
+	} else if (z_offset == 0) {
+		if ((abs(*x) < MIR3DA_OFFSET_MAX) && (abs((*y > 0) ?
+		    (MIR3DA_OFFSET_SEN - *y) : (MIR3DA_OFFSET_SEN + *y)) < MIR3DA_OFFSET_MAX)) {
+			*z = ((*z >= 0) ?
+			     (1) : (-1)) * abs(*x) * MIR3DA_OFFSET_CUS/MIR3DA_OFFSET_MAX;
+		} else if ((abs(*y) < MIR3DA_OFFSET_MAX) && (abs((*x > 0) ?
+			   (MIR3DA_OFFSET_SEN - *x) :
+			   (MIR3DA_OFFSET_SEN + *x)) < MIR3DA_OFFSET_MAX)) {
+			*z = ((*z >= 0) ?
+			     (1) : (-1)) * abs(*y) * MIR3DA_OFFSET_CUS/MIR3DA_OFFSET_MAX;
+		} else {
+			tem_z = squareRoot(MIR3DA_OFFSET_SEN*MIR3DA_OFFSET_SEN -
+				(*x) * (*x) - (*y) * (*y)) + lz_offset;
+			*z = ((*z >= 0) ? (1) : (-1)) * tem_z;
+		}
+	}
+
+	if (z_offset)
+		return 0;
+	else
+		return -1;
+}
+
+
+
diff --git a/drivers/input/sensors/accel/da215s/da215s_core.h b/drivers/input/sensors/accel/da215s/da215s_core.h
new file mode 100644
index 000000000000..0c2f43a804f8
--- /dev/null
+++ b/drivers/input/sensors/accel/da215s/da215s_core.h
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co. Ltd.
+ *
+ * Author: Kay Guo <kay.guo@rock-chips.com>
+ */
+
+
+#ifndef __DA215S_CORE_H__
+#define __DA215S_CORE_H__
+
+#define DA215S_OFFSET_TEMP_SOLUTION	0
+
+#define MIR3DA_OFFSET_MAX		200
+#define MIR3DA_OFFSET_CUS		130
+#define MIR3DA_OFFSET_SEN		1024
+
+int da215s_temp_calibrate(int *x, int *y, int *z);
+
+#endif    /* __DA215S_CORE_H__ */
+
+
+
+
diff --git a/include/linux/sensor-dev.h b/include/linux/sensor-dev.h
index 6ae9c16e67a3..eeb2dfa5708d 100644
--- a/include/linux/sensor-dev.h
+++ b/include/linux/sensor-dev.h
@@ -67,6 +67,7 @@ enum sensor_id {
 	ACCEL_ID_STK8BAXX,
 	ACCEL_ID_MIR3DA,
 	ACCEL_ID_ICM2060X,
+	ACCEL_ID_DA215S,
 	COMPASS_ID_ALL,
 	COMPASS_ID_AK8975,
 	COMPASS_ID_AK8963,

commit 4c99006d1c108e1d18e3b4cfba2916e2612d9e6c
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Thu Oct 21 21:34:44 2021 +0800

    mtd: rawnand: rockchip: Support read_oob_raw
    
    nanddump split read_page_raw into two operations, page read and oob read.
    So read_oob_raw is necessary for getting the oob data.
    
    Change-Id: I4e85bbdbf8cd3312fa3525f9e674c31ce20024e9
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/mtd/nand/raw/rockchip_nand_v6.c b/drivers/mtd/nand/raw/rockchip_nand_v6.c
index dbfbc427d63c..1405edbaa8b1 100644
--- a/drivers/mtd/nand/raw/rockchip_nand_v6.c
+++ b/drivers/mtd/nand/raw/rockchip_nand_v6.c
@@ -424,6 +424,25 @@ static int rk_nfc_hw_ecc_read_oob(struct mtd_info *mtd,
 	return nand->ecc.read_page(mtd, nand, nand->data_buf, 1, page);
 }
 
+static int rk_nfc_hw_ecc_read_oob_raw(struct mtd_info *mtd,
+				      struct nand_chip *nand,
+				      int page)
+{
+	struct nand_chip *chip = mtd_to_nand(mtd);
+	struct rk_nfc *nfc = nand_get_controller_data(mtd_to_nand(mtd));
+	int ret;
+
+	ret = nand_read_page_op(chip, page, 0, nfc->page_buf, mtd->writesize);
+	if (ret)
+		return ret;
+
+	ret = nand_read_data_op(chip, chip->oob_poi, mtd->oobsize, false);
+	if (ret)
+		return ret;
+
+	return 0;
+}
+
 static int rk_nfc_hw_ecc_write_oob(struct mtd_info *mtd,
 				   struct nand_chip *nand,
 				   int page)
@@ -787,6 +806,7 @@ static int rk_nand_chip_init(struct device *dev, struct rk_nfc *nfc,
 	nand->ecc.write_oob = rk_nfc_hw_ecc_write_oob;
 	nand->ecc.read_page = rk_nfc_hw_syndrome_ecc_read_page;
 	nand->ecc.read_oob = rk_nfc_hw_ecc_read_oob;
+	nand->ecc.read_oob_raw = rk_nfc_hw_ecc_read_oob_raw;
 
 	mtd = nand_to_mtd(nand);
 	mtd_set_ooblayout(mtd, &rk_nfc_ooblayout_ops);
diff --git a/drivers/mtd/nand/raw/rockchip_nand_v9.c b/drivers/mtd/nand/raw/rockchip_nand_v9.c
index 18924d0bf1e3..f5ba7b4e5362 100644
--- a/drivers/mtd/nand/raw/rockchip_nand_v9.c
+++ b/drivers/mtd/nand/raw/rockchip_nand_v9.c
@@ -414,6 +414,25 @@ static int rk_nfc_hw_ecc_read_oob(struct mtd_info *mtd,
 	return nand->ecc.read_page(mtd, nand, nand->data_buf, 1, page);
 }
 
+static int rk_nfc_hw_ecc_read_oob_raw(struct mtd_info *mtd,
+				      struct nand_chip *nand,
+				      int page)
+{
+	struct nand_chip *chip = mtd_to_nand(mtd);
+	struct rk_nfc *nfc = nand_get_controller_data(mtd_to_nand(mtd));
+	int ret;
+
+	ret = nand_read_page_op(chip, page, 0, nfc->page_buf, mtd->writesize);
+	if (ret)
+		return ret;
+
+	ret = nand_read_data_op(chip, chip->oob_poi, mtd->oobsize, false);
+	if (ret)
+		return ret;
+
+	return 0;
+}
+
 static int rk_nfc_hw_ecc_write_oob(struct mtd_info *mtd,
 				   struct nand_chip *nand,
 				   int page)
@@ -772,6 +791,7 @@ static int rk_nand_chip_init(struct device *dev, struct rk_nfc *nfc,
 	nand->ecc.write_oob = rk_nfc_hw_ecc_write_oob;
 	nand->ecc.read_page = rk_nfc_hw_syndrome_ecc_read_page;
 	nand->ecc.read_oob = rk_nfc_hw_ecc_read_oob;
+	nand->ecc.read_oob_raw = rk_nfc_hw_ecc_read_oob_raw;
 
 	mtd = nand_to_mtd(nand);
 	mtd_set_ooblayout(mtd, &rk_nfc_ooblayout_ops);

commit 694d0b47644771436d3513dc15f0f51b6495216b
Author: Guochun Huang <hero.huang@rock-chips.com>
Date:   Fri Oct 29 16:00:57 2021 +0800

    drm/rockchip: rk628: fix lvds default data format
    
    Signed-off-by: Guochun Huang <hero.huang@rock-chips.com>
    Change-Id: Ib99e6e3d285b3693428523fdd11027d8862ee734

diff --git a/drivers/gpu/drm/rockchip/rk628/rk628_lvds.c b/drivers/gpu/drm/rockchip/rk628/rk628_lvds.c
index b0b6dcedd00b..ce8f0c500d5e 100644
--- a/drivers/gpu/drm/rockchip/rk628/rk628_lvds.c
+++ b/drivers/gpu/drm/rockchip/rk628/rk628_lvds.c
@@ -117,7 +117,7 @@ static int rk628_lvds_connector_get_modes(struct drm_connector *connector)
 	if (info->num_bus_formats)
 		lvds->format = rk628_lvds_get_format(info->bus_formats[0]);
 	else
-		lvds->format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG;
+		lvds->format = LVDS_FORMAT_VESA_24BIT;
 
 	return num_modes;
 }

commit 10317ccd4334ea3ee2cdb5a1b61cff9283697ff2
Author: Zhen Chen <chenzhen@rock-chips.com>
Date:   Fri Oct 29 14:56:16 2021 +0800

    MALI: bifrost: fix an error in Kbuild
    
    Bifrost device driver should be built once CONFIG_MALI_BIFROST is enabled,
    not CONFIG_MALI_MIDGARD.
    
    Fixes: 100a5af029b1 ("MALI: rockchip: upgrade bifrost DDK to g7p1-01bet0, from g6p0-01eac0")
    Signed-off-by: Zhen Chen <chenzhen@rock-chips.com>
    Change-Id: Idf49dd482576c293081f846891c39523520350a8

diff --git a/drivers/gpu/arm/bifrost/Kbuild b/drivers/gpu/arm/bifrost/Kbuild
index 69d0fbb31a87..83c331d832db 100644
--- a/drivers/gpu/arm/bifrost/Kbuild
+++ b/drivers/gpu/arm/bifrost/Kbuild
@@ -142,7 +142,7 @@ subdir-ccflags-y += $(ccflags-y)
 #
 # Kernel Modules
 #
-obj-$(CONFIG_MALI_MIDGARD) += bifrost_kbase.o
+obj-$(CONFIG_MALI_BIFROST) += bifrost_kbase.o
 obj-$(CONFIG_MALI_KUTF)    += tests/
 
 bifrost_kbase-y := \

commit 0afef62d52c12ba523d244fe27494418a37694c2
Merge: da9299d74c19 a027d43cf3f2
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Wed Nov 3 09:46:48 2021 +0100

    Merge 4.19.215 into android-4.19-stable
    
    Changes in 4.19.215
            ARM: 9133/1: mm: proc-macros: ensure *_tlb_fns are 4B aligned
            ARM: 9134/1: remove duplicate memcpy() definition
            ARM: 9139/1: kprobes: fix arch_init_kprobes() prototype
            ARM: 9141/1: only warn about XIP address when not compile testing
            powerpc/bpf: Fix BPF_MOD when imm == 1
            arm64: Avoid premature usercopy failure
            ARM: 8819/1: Remove '-p' from LDFLAGS
            usbnet: sanity check for maxpacket
            usbnet: fix error return code in usbnet_probe()
            ata: sata_mv: Fix the error handling of mv_chip_id()
            nfc: port100: fix using -ERRNO as command type mask
            Revert "net: mdiobus: Fix memory leak in __mdiobus_register"
            ipv4: use siphash instead of Jenkins in fnhe_hashfun()
            ipv6: use siphash in rt6_exception_hash()
            ipv6: make exception cache less predictible
            mmc: vub300: fix control-message timeouts
            mmc: cqhci: clear HALT state after CQE enable
            mmc: dw_mmc: exynos: fix the finding clock sample value
            mmc: sdhci: Map more voltage level to SDHCI_POWER_330
            mmc: sdhci-esdhc-imx: clear the buffer_read_ready to reset standard tuning circuit
            net: lan78xx: fix division by zero in send path
            RDMA/mlx5: Set user priority for DCT
            arm64: dts: allwinner: h5: NanoPI Neo 2: Fix ethernet node
            regmap: Fix possible double-free in regcache_rbtree_exit()
            net: batman-adv: fix error handling
            net: Prevent infinite while loop in skb_tx_hash()
            nios2: Make NIOS2_DTB_SOURCE_BOOL depend on !COMPILE_TEST
            net: ethernet: microchip: lan743x: Fix driver crash when lan743x_pm_resume fails
            net: ethernet: microchip: lan743x: Fix dma allocation failure by using dma_set_mask_and_coherent
            net: nxp: lpc_eth.c: avoid hang when bringing interface down
            sctp: use init_tag from inithdr for ABORT chunk
            sctp: fix the processing for COOKIE_ECHO chunk
            sctp: add vtag check in sctp_sf_violation
            sctp: add vtag check in sctp_sf_do_8_5_1_E_sa
            sctp: add vtag check in sctp_sf_ootb
            Linux 4.19.215
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I31d72c412edc330fea8f80def686cb20f3af5731

commit a027d43cf3f2fdaabf467b4bcb92d0fe748c2eaf
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Tue Nov 2 18:26:46 2021 +0100

    Linux 4.19.215
    
    Link: https://lore.kernel.org/r/20211101082451.430720900@linuxfoundation.org
    Link: https://lore.kernel.org/r/20211101114224.924071362@linuxfoundation.org
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Hulk Robot <hulkrobot@huawei.com>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index 358b07946bd1..40657b8e92f1 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 214
+SUBLEVEL = 215
 EXTRAVERSION =
 NAME = "People's Front"
 

commit 1ff3c379248ea579aa122d4ca245028e4bc9af23
Author: Xin Long <lucien.xin@gmail.com>
Date:   Wed Oct 20 07:42:47 2021 -0400

    sctp: add vtag check in sctp_sf_ootb
    
    [ Upstream commit 9d02831e517aa36ee6bdb453a0eb47bd49923fe3 ]
    
    sctp_sf_ootb() is called when processing DATA chunk in closed state,
    and many other places are also using it.
    
    The vtag in the chunk's sctphdr should be verified, otherwise, as
    later in chunk length check, it may send abort with the existent
    asoc's vtag, which can be exploited by one to cook a malicious
    chunk to terminate a SCTP asoc.
    
    When fails to verify the vtag from the chunk, this patch sets asoc
    to NULL, so that the abort will be made with the vtag from the
    received chunk later.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Xin Long <lucien.xin@gmail.com>
    Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
index 2995d00bd5d0..ebca069064df 100644
--- a/net/sctp/sm_statefuns.c
+++ b/net/sctp/sm_statefuns.c
@@ -3583,6 +3583,9 @@ enum sctp_disposition sctp_sf_ootb(struct net *net,
 
 	SCTP_INC_STATS(net, SCTP_MIB_OUTOFBLUES);
 
+	if (asoc && !sctp_vtag_verify(chunk, asoc))
+		asoc = NULL;
+
 	ch = (struct sctp_chunkhdr *)chunk->chunk_hdr;
 	do {
 		/* Report violation if the chunk is less then minimal */

commit d9a4f990aab48dd5c134a9e76c7b651d404b05d3
Author: Xin Long <lucien.xin@gmail.com>
Date:   Wed Oct 20 07:42:46 2021 -0400

    sctp: add vtag check in sctp_sf_do_8_5_1_E_sa
    
    [ Upstream commit ef16b1734f0a176277b7bb9c71a6d977a6ef3998 ]
    
    sctp_sf_do_8_5_1_E_sa() is called when processing SHUTDOWN_ACK chunk
    in cookie_wait and cookie_echoed state.
    
    The vtag in the chunk's sctphdr should be verified, otherwise, as
    later in chunk length check, it may send abort with the existent
    asoc's vtag, which can be exploited by one to cook a malicious
    chunk to terminate a SCTP asoc.
    
    Note that when fails to verify the vtag from SHUTDOWN-ACK chunk,
    SHUTDOWN COMPLETE message will still be sent back to peer, but
    with the vtag from SHUTDOWN-ACK chunk, as said in 5) of
    rfc4960#section-8.4.
    
    While at it, also remove the unnecessary chunk length check from
    sctp_sf_shut_8_4_5(), as it's already done in both places where
    it calls sctp_sf_shut_8_4_5().
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Xin Long <lucien.xin@gmail.com>
    Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
index a4874b55faab..2995d00bd5d0 100644
--- a/net/sctp/sm_statefuns.c
+++ b/net/sctp/sm_statefuns.c
@@ -3698,12 +3698,6 @@ static enum sctp_disposition sctp_sf_shut_8_4_5(
 
 	SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);
 
-	/* If the chunk length is invalid, we don't want to process
-	 * the reset of the packet.
-	 */
-	if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_chunkhdr)))
-		return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
-
 	/* We need to discard the rest of the packet to prevent
 	 * potential bomming attacks from additional bundled chunks.
 	 * This is documented in SCTP Threats ID.
@@ -3731,6 +3725,9 @@ enum sctp_disposition sctp_sf_do_8_5_1_E_sa(struct net *net,
 {
 	struct sctp_chunk *chunk = arg;
 
+	if (!sctp_vtag_verify(chunk, asoc))
+		asoc = NULL;
+
 	/* Make sure that the SHUTDOWN_ACK chunk has a valid length. */
 	if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_chunkhdr)))
 		return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,

commit 7bf2f6a30d1851c530ad5e4ee7e5c45fb6be0128
Author: Xin Long <lucien.xin@gmail.com>
Date:   Wed Oct 20 07:42:45 2021 -0400

    sctp: add vtag check in sctp_sf_violation
    
    [ Upstream commit aa0f697e45286a6b5f0ceca9418acf54b9099d99 ]
    
    sctp_sf_violation() is called when processing HEARTBEAT_ACK chunk
    in cookie_wait state, and some other places are also using it.
    
    The vtag in the chunk's sctphdr should be verified, otherwise, as
    later in chunk length check, it may send abort with the existent
    asoc's vtag, which can be exploited by one to cook a malicious
    chunk to terminate a SCTP asoc.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Xin Long <lucien.xin@gmail.com>
    Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
index e93aa08d2a78..a4874b55faab 100644
--- a/net/sctp/sm_statefuns.c
+++ b/net/sctp/sm_statefuns.c
@@ -4561,6 +4561,9 @@ enum sctp_disposition sctp_sf_violation(struct net *net,
 {
 	struct sctp_chunk *chunk = arg;
 
+	if (!sctp_vtag_verify(chunk, asoc))
+		return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
+
 	/* Make sure that the chunk has a valid length. */
 	if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_chunkhdr)))
 		return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,

commit 86044244fc6f9eaec0070cb668e0d500de22dbba
Author: Xin Long <lucien.xin@gmail.com>
Date:   Wed Oct 20 07:42:44 2021 -0400

    sctp: fix the processing for COOKIE_ECHO chunk
    
    [ Upstream commit a64b341b8695e1c744dd972b39868371b4f68f83 ]
    
    1. In closed state: in sctp_sf_do_5_1D_ce():
    
      When asoc is NULL, making packet for abort will use chunk's vtag
      in sctp_ootb_pkt_new(). But when asoc exists, vtag from the chunk
      should be verified before using peer.i.init_tag to make packet
      for abort in sctp_ootb_pkt_new(), and just discard it if vtag is
      not correct.
    
    2. In the other states: in sctp_sf_do_5_2_4_dupcook():
    
      asoc always exists, but duplicate cookie_echo's vtag will be
      handled by sctp_tietags_compare() and then take actions, so before
      that we only verify the vtag for the abort sent for invalid chunk
      length.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Xin Long <lucien.xin@gmail.com>
    Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
index f57fbe79490a..e93aa08d2a78 100644
--- a/net/sctp/sm_statefuns.c
+++ b/net/sctp/sm_statefuns.c
@@ -712,6 +712,9 @@ enum sctp_disposition sctp_sf_do_5_1D_ce(struct net *net,
 	struct sock *sk;
 	int error = 0;
 
+	if (asoc && !sctp_vtag_verify(chunk, asoc))
+		return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
+
 	/* If the packet is an OOTB packet which is temporarily on the
 	 * control endpoint, respond with an ABORT.
 	 */
@@ -726,7 +729,8 @@ enum sctp_disposition sctp_sf_do_5_1D_ce(struct net *net,
 	 * in sctp_unpack_cookie().
 	 */
 	if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_chunkhdr)))
-		return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
+		return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
+						  commands);
 
 	/* If the endpoint is not listening or if the number of associations
 	 * on the TCP-style socket exceed the max backlog, respond with an
@@ -2156,9 +2160,11 @@ enum sctp_disposition sctp_sf_do_5_2_4_dupcook(
 	 * enough for the chunk header.  Cookie length verification is
 	 * done later.
 	 */
-	if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_chunkhdr)))
-		return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
-						  commands);
+	if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_chunkhdr))) {
+		if (!sctp_vtag_verify(chunk, asoc))
+			asoc = NULL;
+		return sctp_sf_violation_chunklen(net, ep, asoc, type, arg, commands);
+	}
 
 	/* "Decode" the chunk.  We have no optional parameters so we
 	 * are in good shape.

commit 1f52dfacca7bb315d89f5ece5660b0337809798e
Author: Xin Long <lucien.xin@gmail.com>
Date:   Wed Oct 20 07:42:41 2021 -0400

    sctp: use init_tag from inithdr for ABORT chunk
    
    [ Upstream commit 4f7019c7eb33967eb87766e0e4602b5576873680 ]
    
    Currently Linux SCTP uses the verification tag of the existing SCTP
    asoc when failing to process and sending the packet with the ABORT
    chunk. This will result in the peer accepting the ABORT chunk and
    removing the SCTP asoc. One could exploit this to terminate a SCTP
    asoc.
    
    This patch is to fix it by always using the initiate tag of the
    received INIT chunk for the ABORT chunk to be sent.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Xin Long <lucien.xin@gmail.com>
    Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
index be5ea5e8b19e..f57fbe79490a 100644
--- a/net/sctp/sm_statefuns.c
+++ b/net/sctp/sm_statefuns.c
@@ -6261,6 +6261,7 @@ static struct sctp_packet *sctp_ootb_pkt_new(
 		 * yet.
 		 */
 		switch (chunk->chunk_hdr->type) {
+		case SCTP_CID_INIT:
 		case SCTP_CID_INIT_ACK:
 		{
 			struct sctp_initack_chunk *initack;

commit b75fa48e42d022d6757b7de29178d531df8cf43b
Author: Trevor Woerner <twoerner@gmail.com>
Date:   Sun Oct 24 13:50:02 2021 -0400

    net: nxp: lpc_eth.c: avoid hang when bringing interface down
    
    commit ace19b992436a257d9a793672e57abc28fe83e2e upstream.
    
    A hard hang is observed whenever the ethernet interface is brought
    down. If the PHY is stopped before the LPC core block is reset,
    the SoC will hang. Comparing lpc_eth_close() and lpc_eth_open() I
    re-arranged the ordering of the functions calls in lpc_eth_close() to
    reset the hardware before stopping the PHY.
    Fixes: b7370112f519 ("lpc32xx: Added ethernet driver")
    Signed-off-by: Trevor Woerner <twoerner@gmail.com>
    Acked-by: Vladimir Zapolskiy <vz@mleia.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/nxp/lpc_eth.c b/drivers/net/ethernet/nxp/lpc_eth.c
index 6bd6c261f2ba..415ac33341c5 100644
--- a/drivers/net/ethernet/nxp/lpc_eth.c
+++ b/drivers/net/ethernet/nxp/lpc_eth.c
@@ -1037,9 +1037,6 @@ static int lpc_eth_close(struct net_device *ndev)
 	napi_disable(&pldat->napi);
 	netif_stop_queue(ndev);
 
-	if (ndev->phydev)
-		phy_stop(ndev->phydev);
-
 	spin_lock_irqsave(&pldat->lock, flags);
 	__lpc_eth_reset(pldat);
 	netif_carrier_off(ndev);
@@ -1047,6 +1044,8 @@ static int lpc_eth_close(struct net_device *ndev)
 	writel(0, LPC_ENET_MAC2(pldat->net_base));
 	spin_unlock_irqrestore(&pldat->lock, flags);
 
+	if (ndev->phydev)
+		phy_stop(ndev->phydev);
 	clk_disable_unprepare(pldat->clk);
 
 	return 0;

commit 84a9eb9a2f179ea5e6398fe270560a8aaa16f996
Author: Yuiko Oshino <yuiko.oshino@microchip.com>
Date:   Fri Oct 22 11:53:43 2021 -0400

    net: ethernet: microchip: lan743x: Fix dma allocation failure by using dma_set_mask_and_coherent
    
    commit 95a359c9553342d36d408d35331ff0bfce75272f upstream.
    
    The dma failure was reported in the raspberry pi github (issue #4117).
    https://github.com/raspberrypi/linux/issues/4117
    The use of dma_set_mask_and_coherent fixes the issue.
    Tested on 32/64-bit raspberry pi CM4 and 64-bit ubuntu x86 PC with EVB-LAN7430.
    
    Fixes: 23f0703c125b ("lan743x: Add main source files for new lan743x driver")
    Signed-off-by: Yuiko Oshino <yuiko.oshino@microchip.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c
index e049fefc36c8..e734bc5e3ceb 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.c
+++ b/drivers/net/ethernet/microchip/lan743x_main.c
@@ -1710,6 +1710,16 @@ static int lan743x_tx_ring_init(struct lan743x_tx *tx)
 		ret = -EINVAL;
 		goto cleanup;
 	}
+	if (dma_set_mask_and_coherent(&tx->adapter->pdev->dev,
+				      DMA_BIT_MASK(64))) {
+		if (dma_set_mask_and_coherent(&tx->adapter->pdev->dev,
+					      DMA_BIT_MASK(32))) {
+			dev_warn(&tx->adapter->pdev->dev,
+				 "lan743x_: No suitable DMA available\n");
+			ret = -ENOMEM;
+			goto cleanup;
+		}
+	}
 	ring_allocation_size = ALIGN(tx->ring_size *
 				     sizeof(struct lan743x_tx_descriptor),
 				     PAGE_SIZE);
@@ -2258,6 +2268,16 @@ static int lan743x_rx_ring_init(struct lan743x_rx *rx)
 		ret = -EINVAL;
 		goto cleanup;
 	}
+	if (dma_set_mask_and_coherent(&rx->adapter->pdev->dev,
+				      DMA_BIT_MASK(64))) {
+		if (dma_set_mask_and_coherent(&rx->adapter->pdev->dev,
+					      DMA_BIT_MASK(32))) {
+			dev_warn(&rx->adapter->pdev->dev,
+				 "lan743x_: No suitable DMA available\n");
+			ret = -ENOMEM;
+			goto cleanup;
+		}
+	}
 	ring_allocation_size = ALIGN(rx->ring_size *
 				     sizeof(struct lan743x_rx_descriptor),
 				     PAGE_SIZE);

commit fcda74cc95aa450a6d17780ccb1a8853cac7d0cd
Author: Yuiko Oshino <yuiko.oshino@microchip.com>
Date:   Fri Oct 22 11:13:53 2021 -0400

    net: ethernet: microchip: lan743x: Fix driver crash when lan743x_pm_resume fails
    
    commit d6423d2ec39cce2bfca418c81ef51792891576bc upstream.
    
    The driver needs to clean up and return when the initialization fails on resume.
    
    Fixes: 23f0703c125b ("lan743x: Add main source files for new lan743x driver")
    Signed-off-by: Yuiko Oshino <yuiko.oshino@microchip.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c
index 0d681714878b..e049fefc36c8 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.c
+++ b/drivers/net/ethernet/microchip/lan743x_main.c
@@ -3003,6 +3003,8 @@ static int lan743x_pm_resume(struct device *dev)
 	if (ret) {
 		netif_err(adapter, probe, adapter->netdev,
 			  "lan743x_hardware_init returned %d\n", ret);
+		lan743x_pci_cleanup(adapter);
+		return ret;
 	}
 
 	/* open netdev when netdev is at running state while resume.

commit 25d852a8adf017a478246d19c8b282e975521e8a
Author: Guenter Roeck <linux@roeck-us.net>
Date:   Wed Oct 20 12:11:16 2021 -0700

    nios2: Make NIOS2_DTB_SOURCE_BOOL depend on !COMPILE_TEST
    
    commit 4a089e95b4d6bb625044d47aed0c442a8f7bd093 upstream.
    
    nios2:allmodconfig builds fail with
    
    make[1]: *** No rule to make target 'arch/nios2/boot/dts/""',
            needed by 'arch/nios2/boot/dts/built-in.a'.  Stop.
    make: [Makefile:1868: arch/nios2/boot/dts] Error 2 (ignored)
    
    This is seen with compile tests since those enable NIOS2_DTB_SOURCE_BOOL,
    which in turn enables NIOS2_DTB_SOURCE. This causes the build error
    because the default value for NIOS2_DTB_SOURCE is an empty string.
    Disable NIOS2_DTB_SOURCE_BOOL for compile tests to avoid the error.
    
    Fixes: 2fc8483fdcde ("nios2: Build infrastructure")
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Reviewed-by: Randy Dunlap <rdunlap@infradead.org>
    Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/nios2/platform/Kconfig.platform b/arch/nios2/platform/Kconfig.platform
index 74c1aaf588b8..54f6dfb3b797 100644
--- a/arch/nios2/platform/Kconfig.platform
+++ b/arch/nios2/platform/Kconfig.platform
@@ -37,6 +37,7 @@ config NIOS2_DTB_PHYS_ADDR
 
 config NIOS2_DTB_SOURCE_BOOL
 	bool "Compile and link device tree into kernel image"
+	depends on !COMPILE_TEST
 	default n
 	help
 	  This allows you to specify a dts (device tree source) file

commit 02302cbd52264337630a32848ac03648648e9685
Author: Michael Chan <michael.chan@broadcom.com>
Date:   Mon Oct 25 05:05:28 2021 -0400

    net: Prevent infinite while loop in skb_tx_hash()
    
    commit 0c57eeecc559ca6bc18b8c4e2808bc78dbe769b0 upstream.
    
    Drivers call netdev_set_num_tc() and then netdev_set_tc_queue()
    to set the queue count and offset for each TC.  So the queue count
    and offset for the TCs may be zero for a short period after dev->num_tc
    has been set.  If a TX packet is being transmitted at this time in the
    code path netdev_pick_tx() -> skb_tx_hash(), skb_tx_hash() may see
    nonzero dev->num_tc but zero qcount for the TC.  The while loop that
    keeps looping while hash >= qcount will not end.
    
    Fix it by checking the TC's qcount to be nonzero before using it.
    
    Fixes: eadec877ce9c ("net: Add support for subordinate traffic classes to netdev_pick_tx")
    Reviewed-by: Andy Gospodarek <gospo@broadcom.com>
    Signed-off-by: Michael Chan <michael.chan@broadcom.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/core/dev.c b/net/core/dev.c
index a6798117bb1a..397bc2f50de0 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -2846,6 +2846,12 @@ static u16 skb_tx_hash(const struct net_device *dev,
 
 		qoffset = sb_dev->tc_to_txq[tc].offset;
 		qcount = sb_dev->tc_to_txq[tc].count;
+		if (unlikely(!qcount)) {
+			net_warn_ratelimited("%s: invalid qcount, qoffset %u for tc %u\n",
+					     sb_dev->name, qoffset, tc);
+			qoffset = 0;
+			qcount = dev->real_num_tx_queues;
+		}
 	}
 
 	if (skb_rx_queue_recorded(skb)) {

commit fbf150b16a3635634b7dfb7f229d8fcd643c6c51
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Sun Oct 24 16:13:56 2021 +0300

    net: batman-adv: fix error handling
    
    commit 6f68cd634856f8ca93bafd623ba5357e0f648c68 upstream.
    
    Syzbot reported ODEBUG warning in batadv_nc_mesh_free(). The problem was
    in wrong error handling in batadv_mesh_init().
    
    Before this patch batadv_mesh_init() was calling batadv_mesh_free() in case
    of any batadv_*_init() calls failure. This approach may work well, when
    there is some kind of indicator, which can tell which parts of batadv are
    initialized; but there isn't any.
    
    All written above lead to cleaning up uninitialized fields. Even if we hide
    ODEBUG warning by initializing bat_priv->nc.work, syzbot was able to hit
    GPF in batadv_nc_purge_paths(), because hash pointer in still NULL. [1]
    
    To fix these bugs we can unwind batadv_*_init() calls one by one.
    It is good approach for 2 reasons: 1) It fixes bugs on error handling
    path 2) It improves the performance, since we won't call unneeded
    batadv_*_free() functions.
    
    So, this patch makes all batadv_*_init() clean up all allocated memory
    before returning with an error to no call correspoing batadv_*_free()
    and open-codes batadv_mesh_free() with proper order to avoid touching
    uninitialized fields.
    
    Link: https://lore.kernel.org/netdev/000000000000c87fbd05cef6bcb0@google.com/ [1]
    Reported-and-tested-by: syzbot+28b0702ada0bf7381f58@syzkaller.appspotmail.com
    Fixes: c6c8fea29769 ("net: Add batman-adv meshing protocol")
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Acked-by: Sven Eckelmann <sven@narfation.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/batman-adv/bridge_loop_avoidance.c b/net/batman-adv/bridge_loop_avoidance.c
index 1401031f4bb4..b9e61fc3928a 100644
--- a/net/batman-adv/bridge_loop_avoidance.c
+++ b/net/batman-adv/bridge_loop_avoidance.c
@@ -1574,10 +1574,14 @@ int batadv_bla_init(struct batadv_priv *bat_priv)
 		return 0;
 
 	bat_priv->bla.claim_hash = batadv_hash_new(128);
-	bat_priv->bla.backbone_hash = batadv_hash_new(32);
+	if (!bat_priv->bla.claim_hash)
+		return -ENOMEM;
 
-	if (!bat_priv->bla.claim_hash || !bat_priv->bla.backbone_hash)
+	bat_priv->bla.backbone_hash = batadv_hash_new(32);
+	if (!bat_priv->bla.backbone_hash) {
+		batadv_hash_destroy(bat_priv->bla.claim_hash);
 		return -ENOMEM;
+	}
 
 	batadv_hash_set_lock_class(bat_priv->bla.claim_hash,
 				   &batadv_claim_hash_lock_class_key);
diff --git a/net/batman-adv/main.c b/net/batman-adv/main.c
index 79b8a2d8793e..bba64b9b3668 100644
--- a/net/batman-adv/main.c
+++ b/net/batman-adv/main.c
@@ -187,29 +187,41 @@ int batadv_mesh_init(struct net_device *soft_iface)
 	INIT_HLIST_HEAD(&bat_priv->softif_vlan_list);
 	INIT_HLIST_HEAD(&bat_priv->tp_list);
 
-	ret = batadv_v_mesh_init(bat_priv);
-	if (ret < 0)
-		goto err;
-
 	ret = batadv_originator_init(bat_priv);
-	if (ret < 0)
-		goto err;
+	if (ret < 0) {
+		atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
+		goto err_orig;
+	}
 
 	ret = batadv_tt_init(bat_priv);
-	if (ret < 0)
-		goto err;
+	if (ret < 0) {
+		atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
+		goto err_tt;
+	}
+
+	ret = batadv_v_mesh_init(bat_priv);
+	if (ret < 0) {
+		atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
+		goto err_v;
+	}
 
 	ret = batadv_bla_init(bat_priv);
-	if (ret < 0)
-		goto err;
+	if (ret < 0) {
+		atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
+		goto err_bla;
+	}
 
 	ret = batadv_dat_init(bat_priv);
-	if (ret < 0)
-		goto err;
+	if (ret < 0) {
+		atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
+		goto err_dat;
+	}
 
 	ret = batadv_nc_mesh_init(bat_priv);
-	if (ret < 0)
-		goto err;
+	if (ret < 0) {
+		atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
+		goto err_nc;
+	}
 
 	batadv_gw_init(bat_priv);
 	batadv_mcast_init(bat_priv);
@@ -219,8 +231,20 @@ int batadv_mesh_init(struct net_device *soft_iface)
 
 	return 0;
 
-err:
-	batadv_mesh_free(soft_iface);
+err_nc:
+	batadv_dat_free(bat_priv);
+err_dat:
+	batadv_bla_free(bat_priv);
+err_bla:
+	batadv_v_mesh_free(bat_priv);
+err_v:
+	batadv_tt_free(bat_priv);
+err_tt:
+	batadv_originator_free(bat_priv);
+err_orig:
+	batadv_purge_outstanding_packets(bat_priv, NULL);
+	atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE);
+
 	return ret;
 }
 
diff --git a/net/batman-adv/network-coding.c b/net/batman-adv/network-coding.c
index 7f1be5a28757..d6749fc22236 100644
--- a/net/batman-adv/network-coding.c
+++ b/net/batman-adv/network-coding.c
@@ -167,8 +167,10 @@ int batadv_nc_mesh_init(struct batadv_priv *bat_priv)
 				   &batadv_nc_coding_hash_lock_class_key);
 
 	bat_priv->nc.decoding_hash = batadv_hash_new(128);
-	if (!bat_priv->nc.decoding_hash)
+	if (!bat_priv->nc.decoding_hash) {
+		batadv_hash_destroy(bat_priv->nc.coding_hash);
 		goto err;
+	}
 
 	batadv_hash_set_lock_class(bat_priv->nc.decoding_hash,
 				   &batadv_nc_decoding_hash_lock_class_key);
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
index cc350ab4de0a..6bdb70c93e3f 100644
--- a/net/batman-adv/translation-table.c
+++ b/net/batman-adv/translation-table.c
@@ -4413,8 +4413,10 @@ int batadv_tt_init(struct batadv_priv *bat_priv)
 		return ret;
 
 	ret = batadv_tt_global_init(bat_priv);
-	if (ret < 0)
+	if (ret < 0) {
+		batadv_tt_local_table_free(bat_priv);
 		return ret;
+	}
 
 	batadv_tvlv_handler_register(bat_priv, batadv_tt_tvlv_ogm_handler_v1,
 				     batadv_tt_tvlv_unicast_handler_v1,

commit 3dae1a4eced3ee733d7222e69b8a55caf2d61091
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Tue Oct 12 10:37:35 2021 +0800

    regmap: Fix possible double-free in regcache_rbtree_exit()
    
    commit 55e6d8037805b3400096d621091dfbf713f97e83 upstream.
    
    In regcache_rbtree_insert_to_block(), when 'present' realloc failed,
    the 'blk' which is supposed to assign to 'rbnode->block' will be freed,
    so 'rbnode->block' points a freed memory, in the error handling path of
    regcache_rbtree_init(), 'rbnode->block' will be freed again in
    regcache_rbtree_exit(), KASAN will report double-free as follows:
    
    BUG: KASAN: double-free or invalid-free in kfree+0xce/0x390
    Call Trace:
     slab_free_freelist_hook+0x10d/0x240
     kfree+0xce/0x390
     regcache_rbtree_exit+0x15d/0x1a0
     regcache_rbtree_init+0x224/0x2c0
     regcache_init+0x88d/0x1310
     __regmap_init+0x3151/0x4a80
     __devm_regmap_init+0x7d/0x100
     madera_spi_probe+0x10f/0x333 [madera_spi]
     spi_probe+0x183/0x210
     really_probe+0x285/0xc30
    
    To fix this, moving up the assignment of rbnode->block to immediately after
    the reallocation has succeeded so that the data structure stays valid even
    if the second reallocation fails.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Fixes: 3f4ff561bc88b ("regmap: rbtree: Make cache_present bitmap per node")
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Link: https://lore.kernel.org/r/20211012023735.1632786-1-yangyingliang@huawei.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/base/regmap/regcache-rbtree.c b/drivers/base/regmap/regcache-rbtree.c
index b1e9aae9a5d0..e9b7ce8c272c 100644
--- a/drivers/base/regmap/regcache-rbtree.c
+++ b/drivers/base/regmap/regcache-rbtree.c
@@ -295,14 +295,14 @@ static int regcache_rbtree_insert_to_block(struct regmap *map,
 	if (!blk)
 		return -ENOMEM;
 
+	rbnode->block = blk;
+
 	if (BITS_TO_LONGS(blklen) > BITS_TO_LONGS(rbnode->blklen)) {
 		present = krealloc(rbnode->cache_present,
 				   BITS_TO_LONGS(blklen) * sizeof(*present),
 				   GFP_KERNEL);
-		if (!present) {
-			kfree(blk);
+		if (!present)
 			return -ENOMEM;
-		}
 
 		memset(present + BITS_TO_LONGS(rbnode->blklen), 0,
 		       (BITS_TO_LONGS(blklen) - BITS_TO_LONGS(rbnode->blklen))
@@ -319,7 +319,6 @@ static int regcache_rbtree_insert_to_block(struct regmap *map,
 	}
 
 	/* update the rbnode block, its size and the base register */
-	rbnode->block = blk;
 	rbnode->blklen = blklen;
 	rbnode->base_reg = base_reg;
 	rbnode->cache_present = present;

commit cdaf7a469244b5e65ae5eda062ff5ea90172de62
Author: Clément B?sch <u@pkh.me>
Date:   Sun Sep 5 02:20:27 2021 +0200

    arm64: dts: allwinner: h5: NanoPI Neo 2: Fix ethernet node
    
    commit 0764e365dacd0b8f75c1736f9236be280649bd18 upstream.
    
    RX and TX delay are provided by ethernet PHY. Reflect that in ethernet
    node.
    
    Fixes: 44a94c7ef989 ("arm64: dts: allwinner: H5: Restore EMAC changes")
    Signed-off-by: Clément B?sch <u@pkh.me>
    Reviewed-by: Jernej Skrabec <jernej.skrabec@gmail.com>
    Reviewed-by: Andrew Lunn <andrew@lunn.ch>
    Signed-off-by: Maxime Ripard <maxime@cerno.tech>
    Link: https://lore.kernel.org/r/20210905002027.171984-1-u@pkh.me
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-neo2.dts b/arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-neo2.dts
index cc268a69786c..cac9231e2e29 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-neo2.dts
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-neo2.dts
@@ -114,7 +114,7 @@
 	pinctrl-0 = <&emac_rgmii_pins>;
 	phy-supply = <&reg_gmac_3v3>;
 	phy-handle = <&ext_rgmii_phy>;
-	phy-mode = "rgmii";
+	phy-mode = "rgmii-id";
 	status = "okay";
 };
 

commit 2864b6d54244b82a8c7d4628a43055c57bfba80c
Author: Patrisious Haddad <phaddad@nvidia.com>
Date:   Wed Oct 6 12:31:53 2021 +0300

    RDMA/mlx5: Set user priority for DCT
    
    commit 1ab52ac1e9bc9391f592c9fa8340a6e3e9c36286 upstream.
    
    Currently, the driver doesn't set the PCP-based priority for DCT, hence
    DCT response packets are transmitted without user priority.
    
    Fix it by setting user provided priority in the eth_prio field in the DCT
    context, which in turn sets the value in the transmitted packet.
    
    Fixes: 776a3906b692 ("IB/mlx5: Add support for DC target QP")
    Link: https://lore.kernel.org/r/5fd2d94a13f5742d8803c218927322257d53205c.1633512672.git.leonro@nvidia.com
    Signed-off-by: Patrisious Haddad <phaddad@nvidia.com>
    Reviewed-by: Maor Gottlieb <maorg@nvidia.com>
    Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c
index 10f6ae4f8f3f..361b1b859782 100644
--- a/drivers/infiniband/hw/mlx5/qp.c
+++ b/drivers/infiniband/hw/mlx5/qp.c
@@ -3387,6 +3387,8 @@ static int mlx5_ib_modify_dct(struct ib_qp *ibqp, struct ib_qp_attr *attr,
 		MLX5_SET(dctc, dctc, mtu, attr->path_mtu);
 		MLX5_SET(dctc, dctc, my_addr_index, attr->ah_attr.grh.sgid_index);
 		MLX5_SET(dctc, dctc, hop_limit, attr->ah_attr.grh.hop_limit);
+		if (attr->ah_attr.type == RDMA_AH_ATTR_TYPE_ROCE)
+			MLX5_SET(dctc, dctc, eth_prio, attr->ah_attr.sl & 0x7);
 
 		err = mlx5_core_create_dct(dev->mdev, &qp->dct.mdct, qp->dct.in,
 					   MLX5_ST_SZ_BYTES(create_dct_in));

commit 326da4f6ffdbd8671e86f69ded7a714dcc12fecf
Author: Johan Hovold <johan@kernel.org>
Date:   Tue Oct 26 12:36:17 2021 +0200

    net: lan78xx: fix division by zero in send path
    
    commit db6c3c064f5d55fa9969f33eafca3cdbefbb3541 upstream.
    
    Add the missing endpoint max-packet sanity check to probe() to avoid
    division by zero in lan78xx_tx_bh() in case a malicious device has
    broken descriptors (or when doing descriptor fuzz testing).
    
    Note that USB core will reject URBs submitted for endpoints with zero
    wMaxPacketSize but that drivers doing packet-size calculations still
    need to handle this (cf. commit 2548288b4fb0 ("USB: Fix: Don't skip
    endpoint descriptors with maxpacket=0")).
    
    Fixes: 55d7de9de6c3 ("Microchip's LAN7800 family USB 2/3 to 10/100/1000 Ethernet device driver")
    Cc: stable@vger.kernel.org      # 4.3
    Cc: Woojung.Huh@microchip.com <Woojung.Huh@microchip.com>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
index ac5f72077b26..75984c799afc 100644
--- a/drivers/net/usb/lan78xx.c
+++ b/drivers/net/usb/lan78xx.c
@@ -3772,6 +3772,12 @@ static int lan78xx_probe(struct usb_interface *intf,
 
 	dev->maxpacket = usb_maxpacket(dev->udev, dev->pipe_out, 1);
 
+	/* Reject broken descriptors. */
+	if (dev->maxpacket == 0) {
+		ret = -ENODEV;
+		goto out4;
+	}
+
 	/* driver requires remote-wakeup capability during autosuspend. */
 	intf->needs_remote_wakeup = 1;
 

commit 2ff5289793fd61c56ac8774408f27350e5da865f
Author: Haibo Chen <haibo.chen@nxp.com>
Date:   Fri Oct 15 10:00:36 2021 +0800

    mmc: sdhci-esdhc-imx: clear the buffer_read_ready to reset standard tuning circuit
    
    commit 9af372dc70e9fdcbb70939dac75365e7b88580b4 upstream.
    
    To reset standard tuning circuit completely, after clear ESDHC_MIX_CTRL_EXE_TUNE,
    also need to clear bit buffer_read_ready, this operation will finally clear the
    USDHC IP internal logic flag execute_tuning_with_clr_buf, make sure the following
    normal data transfer will not be impacted by standard tuning logic used before.
    
    Find this issue when do quick SD card insert/remove stress test. During standard
    tuning prodedure, if remove SD card, USDHC standard tuning logic can't clear the
    internal flag execute_tuning_with_clr_buf. Next time when insert SD card, all
    data related commands can't get any data related interrupts, include data transfer
    complete interrupt, data timeout interrupt, data CRC interrupt, data end bit interrupt.
    Always trigger software timeout issue. Even reset the USDHC through bits in register
    SYS_CTRL (0x2C, bit28 reset tuning, bit26 reset data, bit 25 reset command, bit 24
    reset all) can't recover this. From the user's point of view, USDHC stuck, SD can't
    be recognized any more.
    
    Fixes: d9370424c948 ("mmc: sdhci-esdhc-imx: reset tuning circuit when power on mmc card")
    Signed-off-by: Haibo Chen <haibo.chen@nxp.com>
    Acked-by: Adrian Hunter <adrian.hunter@intel.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/1634263236-6111-1-git-send-email-haibo.chen@nxp.com
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
index 5099353e6f13..f8a4791e64f8 100644
--- a/drivers/mmc/host/sdhci-esdhc-imx.c
+++ b/drivers/mmc/host/sdhci-esdhc-imx.c
@@ -25,6 +25,7 @@
 #include <linux/pinctrl/consumer.h>
 #include <linux/platform_data/mmc-esdhc-imx.h>
 #include <linux/pm_runtime.h>
+#include <linux/iopoll.h>
 #include "sdhci-pltfm.h"
 #include "sdhci-esdhc.h"
 
@@ -947,6 +948,7 @@ static void esdhc_reset_tuning(struct sdhci_host *host)
 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
 	struct pltfm_imx_data *imx_data = sdhci_pltfm_priv(pltfm_host);
 	u32 ctrl;
+	int ret;
 
 	/* Reset the tuning circuit */
 	if (esdhc_is_usdhc(imx_data)) {
@@ -959,7 +961,22 @@ static void esdhc_reset_tuning(struct sdhci_host *host)
 		} else if (imx_data->socdata->flags & ESDHC_FLAG_STD_TUNING) {
 			ctrl = readl(host->ioaddr + SDHCI_AUTO_CMD_STATUS);
 			ctrl &= ~ESDHC_MIX_CTRL_SMPCLK_SEL;
+			ctrl &= ~ESDHC_MIX_CTRL_EXE_TUNE;
 			writel(ctrl, host->ioaddr + SDHCI_AUTO_CMD_STATUS);
+			/* Make sure ESDHC_MIX_CTRL_EXE_TUNE cleared */
+			ret = readl_poll_timeout(host->ioaddr + SDHCI_AUTO_CMD_STATUS,
+				ctrl, !(ctrl & ESDHC_MIX_CTRL_EXE_TUNE), 1, 50);
+			if (ret == -ETIMEDOUT)
+				dev_warn(mmc_dev(host->mmc),
+				 "Warning! clear execute tuning bit failed\n");
+			/*
+			 * SDHCI_INT_DATA_AVAIL is W1C bit, set this bit will clear the
+			 * usdhc IP internal logic flag execute_tuning_with_clr_buf, which
+			 * will finally make sure the normal data transfer logic correct.
+			 */
+			ctrl = readl(host->ioaddr + SDHCI_INT_STATUS);
+			ctrl |= SDHCI_INT_DATA_AVAIL;
+			writel(ctrl, host->ioaddr + SDHCI_INT_STATUS);
 		}
 	}
 }

commit 7824414c2903e2cfe56ea610387a22c0c88fb468
Author: Shawn Guo <shawn.guo@linaro.org>
Date:   Mon Oct 4 10:49:35 2021 +0800

    mmc: sdhci: Map more voltage level to SDHCI_POWER_330
    
    commit 4217d07b9fb328751f877d3bd9550122014860a2 upstream.
    
    On Thundercomm TurboX CM2290, the eMMC OCR reports vdd = 23 (3.5 ~ 3.6 V),
    which is being treated as an invalid value by sdhci_set_power_noreg().
    And thus eMMC is totally broken on the platform.
    
    [    1.436599] ------------[ cut here ]------------
    [    1.436606] mmc0: Invalid vdd 0x17
    [    1.436640] WARNING: CPU: 2 PID: 69 at drivers/mmc/host/sdhci.c:2048 sdhci_set_power_noreg+0x168/0x2b4
    [    1.436655] Modules linked in:
    [    1.436662] CPU: 2 PID: 69 Comm: kworker/u8:1 Tainted: G        W         5.15.0-rc1+ #137
    [    1.436669] Hardware name: Thundercomm TurboX CM2290 (DT)
    [    1.436674] Workqueue: events_unbound async_run_entry_fn
    [    1.436685] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
    [    1.436692] pc : sdhci_set_power_noreg+0x168/0x2b4
    [    1.436698] lr : sdhci_set_power_noreg+0x168/0x2b4
    [    1.436703] sp : ffff800010803a60
    [    1.436705] x29: ffff800010803a60 x28: ffff6a9102465f00 x27: ffff6a9101720a70
    [    1.436715] x26: ffff6a91014de1c0 x25: ffff6a91014de010 x24: ffff6a91016af280
    [    1.436724] x23: ffffaf7b1b276640 x22: 0000000000000000 x21: ffff6a9101720000
    [    1.436733] x20: ffff6a9101720370 x19: ffff6a9101720580 x18: 0000000000000020
    [    1.436743] x17: 0000000000000000 x16: 0000000000000004 x15: ffffffffffffffff
    [    1.436751] x14: 0000000000000000 x13: 00000000fffffffd x12: ffffaf7b1b84b0bc
    [    1.436760] x11: ffffaf7b1b720d10 x10: 000000000000000a x9 : ffff800010803a60
    [    1.436769] x8 : 000000000000000a x7 : 000000000000000f x6 : 00000000fffff159
    [    1.436778] x5 : 0000000000000000 x4 : 0000000000000000 x3 : 00000000ffffffff
    [    1.436787] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff6a9101718d80
    [    1.436797] Call trace:
    [    1.436800]  sdhci_set_power_noreg+0x168/0x2b4
    [    1.436805]  sdhci_set_ios+0xa0/0x7fc
    [    1.436811]  mmc_power_up.part.0+0xc4/0x164
    [    1.436818]  mmc_start_host+0xa0/0xb0
    [    1.436824]  mmc_add_host+0x60/0x90
    [    1.436830]  __sdhci_add_host+0x174/0x330
    [    1.436836]  sdhci_msm_probe+0x7c0/0x920
    [    1.436842]  platform_probe+0x68/0xe0
    [    1.436850]  really_probe.part.0+0x9c/0x31c
    [    1.436857]  __driver_probe_device+0x98/0x144
    [    1.436863]  driver_probe_device+0xc8/0x15c
    [    1.436869]  __device_attach_driver+0xb4/0x120
    [    1.436875]  bus_for_each_drv+0x78/0xd0
    [    1.436881]  __device_attach_async_helper+0xac/0xd0
    [    1.436888]  async_run_entry_fn+0x34/0x110
    [    1.436895]  process_one_work+0x1d0/0x354
    [    1.436903]  worker_thread+0x13c/0x470
    [    1.436910]  kthread+0x150/0x160
    [    1.436915]  ret_from_fork+0x10/0x20
    [    1.436923] ---[ end trace fcfac44cb045c3a8 ]---
    
    Fix the issue by mapping MMC_VDD_35_36 (and MMC_VDD_34_35) to
    SDHCI_POWER_330 as well.
    
    Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
    Acked-by: Adrian Hunter <adrian.hunter@intel.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20211004024935.15326-1-shawn.guo@linaro.org
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 5cb7c2cc501a..8ff37f06e691 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1578,6 +1578,12 @@ void sdhci_set_power_noreg(struct sdhci_host *host, unsigned char mode,
 			break;
 		case MMC_VDD_32_33:
 		case MMC_VDD_33_34:
+		/*
+		 * 3.4 ~ 3.6V are valid only for those platforms where it's
+		 * known that the voltage range is supported by hardware.
+		 */
+		case MMC_VDD_34_35:
+		case MMC_VDD_35_36:
 			pwr = SDHCI_POWER_330;
 			break;
 		default:

commit 29d56f3790e684e630d56f500b59e834fa382209
Author: Jaehoon Chung <jh80.chung@samsung.com>
Date:   Fri Oct 22 17:21:06 2021 +0900

    mmc: dw_mmc: exynos: fix the finding clock sample value
    
    commit 697542bceae51f7620af333b065dd09d213629fb upstream.
    
    Even though there are candiates value if can't find best value, it's
    returned -EIO. It's not proper behavior.
    If there is not best value, use a first candiate value to work eMMC.
    
    Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com>
    Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
    Tested-by: Christian Hewitt <christianshewitt@gmail.com>
    Cc: stable@vger.kernel.org
    Fixes: c537a1c5ff63 ("mmc: dw_mmc: exynos: add variable delay tuning sequence")
    Link: https://lore.kernel.org/r/20211022082106.1557-1-jh80.chung@samsung.com
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/mmc/host/dw_mmc-exynos.c b/drivers/mmc/host/dw_mmc-exynos.c
index ab47b018716a..d7915e511ed2 100644
--- a/drivers/mmc/host/dw_mmc-exynos.c
+++ b/drivers/mmc/host/dw_mmc-exynos.c
@@ -455,6 +455,18 @@ static s8 dw_mci_exynos_get_best_clksmpl(u8 candiates)
 		}
 	}
 
+	/*
+	 * If there is no cadiates value, then it needs to return -EIO.
+	 * If there are candiates values and don't find bset clk sample value,
+	 * then use a first candiates clock sample value.
+	 */
+	for (i = 0; i < iter; i++) {
+		__c = ror8(candiates, i);
+		if ((__c & 0x1) == 0x1) {
+			loc = i;
+			goto out;
+		}
+	}
 out:
 	return loc;
 }
@@ -485,6 +497,8 @@ static int dw_mci_exynos_execute_tuning(struct dw_mci_slot *slot, u32 opcode)
 		priv->tuned_sample = found;
 	} else {
 		ret = -EIO;
+		dev_warn(&mmc->class_dev,
+			"There is no candiates value about clksmpl!\n");
 	}
 
 	return ret;

commit 24f8658690477e8983f88cbfe21fb7f4062ad837
Author: Wenbin Mei <wenbin.mei@mediatek.com>
Date:   Tue Oct 26 15:08:12 2021 +0800

    mmc: cqhci: clear HALT state after CQE enable
    
    commit 92b18252b91de567cd875f2e84722b10ab34ee28 upstream.
    
    While mmc0 enter suspend state, we need halt CQE to send legacy cmd(flush
    cache) and disable cqe, for resume back, we enable CQE and not clear HALT
    state.
    In this case MediaTek mmc host controller will keep the value for HALT
    state after CQE disable/enable flow, so the next CQE transfer after resume
    will be timeout due to CQE is in HALT state, the log as below:
    <4>.(4)[318:kworker/4:1H]mmc0: cqhci: timeout for tag 2
    <4>.(4)[318:kworker/4:1H]mmc0: cqhci: ============ CQHCI REGISTER DUMP ===========
    <4>.(4)[318:kworker/4:1H]mmc0: cqhci: Caps:      0x100020b6 | Version:  0x00000510
    <4>.(4)[318:kworker/4:1H]mmc0: cqhci: Config:    0x00001103 | Control:  0x00000001
    <4>.(4)[318:kworker/4:1H]mmc0: cqhci: Int stat:  0x00000000 | Int enab: 0x00000006
    <4>.(4)[318:kworker/4:1H]mmc0: cqhci: Int sig:   0x00000006 | Int Coal: 0x00000000
    <4>.(4)[318:kworker/4:1H]mmc0: cqhci: TDL base:  0xfd05f000 | TDL up32: 0x00000000
    <4>.(4)[318:kworker/4:1H]mmc0: cqhci: Doorbell:  0x8000203c | TCN:      0x00000000
    <4>.(4)[318:kworker/4:1H]mmc0: cqhci: Dev queue: 0x00000000 | Dev Pend: 0x00000000
    <4>.(4)[318:kworker/4:1H]mmc0: cqhci: Task clr:  0x00000000 | SSC1:     0x00001000
    <4>.(4)[318:kworker/4:1H]mmc0: cqhci: SSC2:      0x00000001 | DCMD rsp: 0x00000000
    <4>.(4)[318:kworker/4:1H]mmc0: cqhci: RED mask:  0xfdf9a080 | TERRI:    0x00000000
    <4>.(4)[318:kworker/4:1H]mmc0: cqhci: Resp idx:  0x00000000 | Resp arg: 0x00000000
    <4>.(4)[318:kworker/4:1H]mmc0: cqhci: CRNQP:     0x00000000 | CRNQDUN:  0x00000000
    <4>.(4)[318:kworker/4:1H]mmc0: cqhci: CRNQIS:    0x00000000 | CRNQIE:   0x00000000
    
    This change check HALT state after CQE enable, if CQE is in HALT state, we
    will clear it.
    
    Signed-off-by: Wenbin Mei <wenbin.mei@mediatek.com>
    Cc: stable@vger.kernel.org
    Acked-by: Adrian Hunter <adrian.hunter@intel.com>
    Fixes: a4080225f51d ("mmc: cqhci: support for command queue enabled host")
    Link: https://lore.kernel.org/r/20211026070812.9359-1-wenbin.mei@mediatek.com
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/mmc/host/cqhci.c b/drivers/mmc/host/cqhci.c
index 2c5a6e7aadc0..495a09b5a8e7 100644
--- a/drivers/mmc/host/cqhci.c
+++ b/drivers/mmc/host/cqhci.c
@@ -281,6 +281,9 @@ static void __cqhci_enable(struct cqhci_host *cq_host)
 
 	cqhci_writel(cq_host, cqcfg, CQHCI_CFG);
 
+	if (cqhci_readl(cq_host, CQHCI_CTL) & CQHCI_HALT)
+		cqhci_writel(cq_host, 0, CQHCI_CTL);
+
 	mmc->cqe_on = true;
 
 	if (cq_host->ops->enable)

commit 99641238575c26c2e47fa593f562dae476709d68
Author: Johan Hovold <johan@kernel.org>
Date:   Mon Oct 25 13:56:08 2021 +0200

    mmc: vub300: fix control-message timeouts
    
    commit 8c8171929116cc23f74743d99251eedadf62341a upstream.
    
    USB control-message timeouts are specified in milliseconds and should
    specifically not vary with CONFIG_HZ.
    
    Fixes: 88095e7b473a ("mmc: Add new VUB300 USB-to-SD/SDIO/MMC driver")
    Cc: stable@vger.kernel.org      # 3.0
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20211025115608.5287-1-johan@kernel.org
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/mmc/host/vub300.c b/drivers/mmc/host/vub300.c
index a004f2ee15b1..aa8905753be3 100644
--- a/drivers/mmc/host/vub300.c
+++ b/drivers/mmc/host/vub300.c
@@ -579,7 +579,7 @@ static void check_vub300_port_status(struct vub300_mmc_host *vub300)
 				GET_SYSTEM_PORT_STATUS,
 				USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 				0x0000, 0x0000, &vub300->system_port_status,
-				sizeof(vub300->system_port_status), HZ);
+				sizeof(vub300->system_port_status), 1000);
 	if (sizeof(vub300->system_port_status) == retval)
 		new_system_port_status(vub300);
 }
@@ -1244,7 +1244,7 @@ static void __download_offload_pseudocode(struct vub300_mmc_host *vub300,
 						SET_INTERRUPT_PSEUDOCODE,
 						USB_DIR_OUT | USB_TYPE_VENDOR |
 						USB_RECIP_DEVICE, 0x0000, 0x0000,
-						xfer_buffer, xfer_length, HZ);
+						xfer_buffer, xfer_length, 1000);
 			kfree(xfer_buffer);
 			if (retval < 0)
 				goto copy_error_message;
@@ -1287,7 +1287,7 @@ static void __download_offload_pseudocode(struct vub300_mmc_host *vub300,
 						SET_TRANSFER_PSEUDOCODE,
 						USB_DIR_OUT | USB_TYPE_VENDOR |
 						USB_RECIP_DEVICE, 0x0000, 0x0000,
-						xfer_buffer, xfer_length, HZ);
+						xfer_buffer, xfer_length, 1000);
 			kfree(xfer_buffer);
 			if (retval < 0)
 				goto copy_error_message;
@@ -1994,7 +1994,7 @@ static void __set_clock_speed(struct vub300_mmc_host *vub300, u8 buf[8],
 		usb_control_msg(vub300->udev, usb_sndctrlpipe(vub300->udev, 0),
 				SET_CLOCK_SPEED,
 				USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
-				0x00, 0x00, buf, buf_array_size, HZ);
+				0x00, 0x00, buf, buf_array_size, 1000);
 	if (retval != 8) {
 		dev_err(&vub300->udev->dev, "SET_CLOCK_SPEED"
 			" %dkHz failed with retval=%d\n", kHzClock, retval);
@@ -2016,14 +2016,14 @@ static void vub300_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 		usb_control_msg(vub300->udev, usb_sndctrlpipe(vub300->udev, 0),
 				SET_SD_POWER,
 				USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
-				0x0000, 0x0000, NULL, 0, HZ);
+				0x0000, 0x0000, NULL, 0, 1000);
 		/* must wait for the VUB300 u-proc to boot up */
 		msleep(600);
 	} else if ((ios->power_mode == MMC_POWER_UP) && !vub300->card_powered) {
 		usb_control_msg(vub300->udev, usb_sndctrlpipe(vub300->udev, 0),
 				SET_SD_POWER,
 				USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
-				0x0001, 0x0000, NULL, 0, HZ);
+				0x0001, 0x0000, NULL, 0, 1000);
 		msleep(600);
 		vub300->card_powered = 1;
 	} else if (ios->power_mode == MMC_POWER_ON) {
@@ -2285,14 +2285,14 @@ static int vub300_probe(struct usb_interface *interface,
 				GET_HC_INF0,
 				USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 				0x0000, 0x0000, &vub300->hc_info,
-				sizeof(vub300->hc_info), HZ);
+				sizeof(vub300->hc_info), 1000);
 	if (retval < 0)
 		goto error5;
 	retval =
 		usb_control_msg(vub300->udev, usb_sndctrlpipe(vub300->udev, 0),
 				SET_ROM_WAIT_STATES,
 				USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
-				firmware_rom_wait_states, 0x0000, NULL, 0, HZ);
+				firmware_rom_wait_states, 0x0000, NULL, 0, 1000);
 	if (retval < 0)
 		goto error5;
 	dev_info(&vub300->udev->dev,
@@ -2307,7 +2307,7 @@ static int vub300_probe(struct usb_interface *interface,
 				GET_SYSTEM_PORT_STATUS,
 				USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 				0x0000, 0x0000, &vub300->system_port_status,
-				sizeof(vub300->system_port_status), HZ);
+				sizeof(vub300->system_port_status), 1000);
 	if (retval < 0) {
 		goto error4;
 	} else if (sizeof(vub300->system_port_status) == retval) {

commit c6d0d68d6da68159948cad3d808d61bb291a0283
Author: Eric Dumazet <edumazet@google.com>
Date:   Sun Aug 29 15:16:14 2021 -0700

    ipv6: make exception cache less predictible
    
    commit a00df2caffed3883c341d5685f830434312e4a43 upstream.
    
    Even after commit 4785305c05b2 ("ipv6: use siphash in rt6_exception_hash()"),
    an attacker can still use brute force to learn some secrets from a victim
    linux host.
    
    One way to defeat these attacks is to make the max depth of the hash
    table bucket a random value.
    
    Before this patch, each bucket of the hash table used to store exceptions
    could contain 6 items under attack.
    
    After the patch, each bucket would contains a random number of items,
    between 6 and 10. The attacker can no longer infer secrets.
    
    This is slightly increasing memory size used by the hash table,
    we do not expect this to be a problem.
    
    Following patch is dealing with the same issue in IPv4.
    
    Fixes: 35732d01fe31 ("ipv6: introduce a hash table to store dst cache")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: Keyu Man <kman001@ucr.edu>
    Cc: Wei Wang <weiwan@google.com>
    Cc: Martin KaFai Lau <kafai@fb.com>
    Reviewed-by: David Ahern <dsahern@kernel.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    [OP: adjusted context for 4.19 stable]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index 9bc806a4ded6..d04f3951c5fb 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -1454,6 +1454,7 @@ static int rt6_insert_exception(struct rt6_info *nrt,
 	struct rt6_exception_bucket *bucket;
 	struct in6_addr *src_key = NULL;
 	struct rt6_exception *rt6_ex;
+	int max_depth;
 	int err = 0;
 
 	spin_lock_bh(&rt6_exception_lock);
@@ -1515,7 +1516,9 @@ static int rt6_insert_exception(struct rt6_info *nrt,
 	bucket->depth++;
 	net->ipv6.rt6_stats->fib_rt_cache++;
 
-	if (bucket->depth > FIB6_MAX_DEPTH)
+	/* Randomize max depth to avoid some side channels attacks. */
+	max_depth = FIB6_MAX_DEPTH + prandom_u32_max(FIB6_MAX_DEPTH);
+	while (bucket->depth > max_depth)
 		rt6_exception_remove_oldest(bucket);
 
 out:

commit ad829847ad59af8e26a1f1c345716099abbc7a58
Author: Eric Dumazet <edumazet@google.com>
Date:   Fri Oct 29 10:50:26 2021 +0300

    ipv6: use siphash in rt6_exception_hash()
    
    commit 4785305c05b25a242e5314cc821f54ade4c18810 upstream.
    
    A group of security researchers brought to our attention
    the weakness of hash function used in rt6_exception_hash()
    
    Lets use siphash instead of Jenkins Hash, to considerably
    reduce security risks.
    
    Following patch deals with IPv4.
    
    Fixes: 35732d01fe31 ("ipv6: introduce a hash table to store dst cache")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: Keyu Man <kman001@ucr.edu>
    Cc: Wei Wang <weiwan@google.com>
    Cc: Martin KaFai Lau <kafai@fb.com>
    Acked-by: Wei Wang <weiwan@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    [OP: adjusted context for 4.19 stable]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index f884739a0c1c..9bc806a4ded6 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -45,6 +45,7 @@
 #include <linux/nsproxy.h>
 #include <linux/slab.h>
 #include <linux/jhash.h>
+#include <linux/siphash.h>
 #include <net/net_namespace.h>
 #include <net/snmp.h>
 #include <net/ipv6.h>
@@ -1337,17 +1338,24 @@ static void rt6_exception_remove_oldest(struct rt6_exception_bucket *bucket)
 static u32 rt6_exception_hash(const struct in6_addr *dst,
 			      const struct in6_addr *src)
 {
-	static u32 seed __read_mostly;
-	u32 val;
+	static siphash_key_t rt6_exception_key __read_mostly;
+	struct {
+		struct in6_addr dst;
+		struct in6_addr src;
+	} __aligned(SIPHASH_ALIGNMENT) combined = {
+		.dst = *dst,
+	};
+	u64 val;
 
-	net_get_random_once(&seed, sizeof(seed));
-	val = jhash(dst, sizeof(*dst), seed);
+	net_get_random_once(&rt6_exception_key, sizeof(rt6_exception_key));
 
 #ifdef CONFIG_IPV6_SUBTREES
 	if (src)
-		val = jhash(src, sizeof(*src), val);
+		combined.src = *src;
 #endif
-	return hash_32(val, FIB6_EXCEPTION_BUCKET_SIZE_SHIFT);
+	val = siphash(&combined, sizeof(combined), &rt6_exception_key);
+
+	return hash_64(val, FIB6_EXCEPTION_BUCKET_SIZE_SHIFT);
 }
 
 /* Helper function to find the cached rt in the hash table

commit 6e2856767eb1a9cfcfcd82136928037f04920e97
Author: Eric Dumazet <edumazet@google.com>
Date:   Fri Oct 29 10:50:25 2021 +0300

    ipv4: use siphash instead of Jenkins in fnhe_hashfun()
    
    commit 6457378fe796815c973f631a1904e147d6ee33b1 upstream.
    
    A group of security researchers brought to our attention
    the weakness of hash function used in fnhe_hashfun().
    
    Lets use siphash instead of Jenkins Hash, to considerably
    reduce security risks.
    
    Also remove the inline keyword, this really is distracting.
    
    Fixes: d546c621542d ("ipv4: harden fnhe_hashfun()")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: Keyu Man <kman001@ucr.edu>
    Cc: Willy Tarreau <w@1wt.eu>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    [OP: adjusted context for 4.19 stable]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 730a15fc497c..b41d4acc57e6 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -625,14 +625,14 @@ static void fnhe_remove_oldest(struct fnhe_hash_bucket *hash)
 	kfree_rcu(oldest, rcu);
 }
 
-static inline u32 fnhe_hashfun(__be32 daddr)
+static u32 fnhe_hashfun(__be32 daddr)
 {
-	static u32 fnhe_hashrnd __read_mostly;
-	u32 hval;
+	static siphash_key_t fnhe_hash_key __read_mostly;
+	u64 hval;
 
-	net_get_random_once(&fnhe_hashrnd, sizeof(fnhe_hashrnd));
-	hval = jhash_1word((__force u32) daddr, fnhe_hashrnd);
-	return hash_32(hval, FNHE_HASH_SHIFT);
+	net_get_random_once(&fnhe_hash_key, sizeof(fnhe_hash_key));
+	hval = siphash_1u32((__force u32)daddr, &fnhe_hash_key);
+	return hash_64(hval, FNHE_HASH_SHIFT);
 }
 
 static void fill_route_from_fnhe(struct rtable *rt, struct fib_nh_exception *fnhe)

commit 8121d0d4fd108280f5cd7b7fe8c6592adaa37be9
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Thu Sep 30 20:49:42 2021 +0300

    Revert "net: mdiobus: Fix memory leak in __mdiobus_register"
    
    commit 10eff1f5788b6ffac212c254e2f3666219576889 upstream.
    
    This reverts commit ab609f25d19858513919369ff3d9a63c02cd9e2e.
    
    This patch is correct in the sense that we _should_ call device_put() in
    case of device_register() failure, but the problem in this code is more
    vast.
    
    We need to set bus->state to UNMDIOBUS_REGISTERED before calling
    device_register() to correctly release the device in mdiobus_free().
    This patch prevents us from doing it, since in case of device_register()
    failure put_device() will be called 2 times and it will cause UAF or
    something else.
    
    Also, Reported-by: tag in revered commit was wrong, since syzbot
    reported different leak in same function.
    
    Link: https://lore.kernel.org/netdev/20210928092657.GI2048@kadam/
    Acked-by: Yanfei Xu <yanfei.xu@windriver.com>
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Link: https://lore.kernel.org/r/f12fb1faa4eccf0f355788225335eb4309ff2599.1633024062.git.paskripkin@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c
index f31a822bf4cc..3207da2224f6 100644
--- a/drivers/net/phy/mdio_bus.c
+++ b/drivers/net/phy/mdio_bus.c
@@ -388,7 +388,6 @@ int __mdiobus_register(struct mii_bus *bus, struct module *owner)
 	err = device_register(&bus->dev);
 	if (err) {
 		pr_err("mii_bus %s failed to register\n", bus->id);
-		put_device(&bus->dev);
 		return -EINVAL;
 	}
 

commit 4a9043ba1b0e9bea1da0fe34366222974f2c0f92
Author: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Date:   Mon Oct 25 16:49:36 2021 +0200

    nfc: port100: fix using -ERRNO as command type mask
    
    commit 2195f2062e4cc93870da8e71c318ef98a1c51cef upstream.
    
    During probing, the driver tries to get a list (mask) of supported
    command types in port100_get_command_type_mask() function.  The value
    is u64 and 0 is treated as invalid mask (no commands supported).  The
    function however returns also -ERRNO as u64 which will be interpret as
    valid command mask.
    
    Return 0 on every error case of port100_get_command_type_mask(), so the
    probing will stop.
    
    Cc: <stable@vger.kernel.org>
    Fixes: 0347a6ab300a ("NFC: port100: Commands mechanism implementation")
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/nfc/port100.c b/drivers/nfc/port100.c
index 06bb226c62ef..0f37acec98ab 100644
--- a/drivers/nfc/port100.c
+++ b/drivers/nfc/port100.c
@@ -1012,11 +1012,11 @@ static u64 port100_get_command_type_mask(struct port100 *dev)
 
 	skb = port100_alloc_skb(dev, 0);
 	if (!skb)
-		return -ENOMEM;
+		return 0;
 
 	resp = port100_send_cmd_sync(dev, PORT100_CMD_GET_COMMAND_TYPE, skb);
 	if (IS_ERR(resp))
-		return PTR_ERR(resp);
+		return 0;
 
 	if (resp->len < 8)
 		mask = 0;

commit a36119f9b3fb069437383a8eff4e65181b6e7e2f
Author: Zheyu Ma <zheyuma97@gmail.com>
Date:   Fri Oct 22 09:12:26 2021 +0000

    ata: sata_mv: Fix the error handling of mv_chip_id()
    
    commit a0023bb9dd9bc439d44604eeec62426a990054cd upstream.
    
    mv_init_host() propagates the value returned by mv_chip_id() which in turn
    gets propagated by mv_pci_init_one() and hits local_pci_probe().
    
    During the process of driver probing, the probe function should return < 0
    for failure, otherwise, the kernel will treat value > 0 as success.
    
    Since this is a bug rather than a recoverable runtime error we should
    use dev_alert() instead of dev_err().
    
    Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
    Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c
index 57ef11ecbb9b..84ea284502d5 100644
--- a/drivers/ata/sata_mv.c
+++ b/drivers/ata/sata_mv.c
@@ -3905,8 +3905,8 @@ static int mv_chip_id(struct ata_host *host, unsigned int board_idx)
 		break;
 
 	default:
-		dev_err(host->dev, "BUG: invalid board index %u\n", board_idx);
-		return 1;
+		dev_alert(host->dev, "BUG: invalid board index %u\n", board_idx);
+		return -EINVAL;
 	}
 
 	hpriv->hp_flags = hp_flags;

commit 78c2dc1cdf0bdfc83e473d78f23da4d2aeb98142
Author: Wang Hai <wanghai38@huawei.com>
Date:   Tue Oct 26 20:40:15 2021 +0800

    usbnet: fix error return code in usbnet_probe()
    
    commit 6f7c88691191e6c52ef2543d6f1da8d360b27a24 upstream.
    
    Return error code if usb_maxpacket() returns 0 in usbnet_probe()
    
    Fixes: 397430b50a36 ("usbnet: sanity check for maxpacket")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Wang Hai <wanghai38@huawei.com>
    Reviewed-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20211026124015.3025136-1-wanghai38@huawei.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index 0598bc7aff89..867cadb1e5cc 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -1786,6 +1786,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
 	dev->maxpacket = usb_maxpacket (dev->udev, dev->out, 1);
 	if (dev->maxpacket == 0) {
 		/* that is a broken device */
+		status = -ENODEV;
 		goto out4;
 	}
 

commit 002d82227c0abe29118cf80f7e2f396b22d448ed
Author: Oliver Neukum <oneukum@suse.com>
Date:   Thu Oct 21 14:29:44 2021 +0200

    usbnet: sanity check for maxpacket
    
    commit 397430b50a363d8b7bdda00522123f82df6adc5e upstream.
    
    maxpacket of 0 makes no sense and oopses as we need to divide
    by it. Give up.
    
    V2: fixed typo in log and stylistic issues
    
    Signed-off-by: Oliver Neukum <oneukum@suse.com>
    Reported-by: syzbot+76bb1d34ffa0adc03baa@syzkaller.appspotmail.com
    Reviewed-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20211021122944.21816-1-oneukum@suse.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index 84b354f76dea..0598bc7aff89 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -1784,6 +1784,10 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
 	if (!dev->rx_urb_size)
 		dev->rx_urb_size = dev->hard_mtu;
 	dev->maxpacket = usb_maxpacket (dev->udev, dev->out, 1);
+	if (dev->maxpacket == 0) {
+		/* that is a broken device */
+		goto out4;
+	}
 
 	/* let userspace know we have a random address */
 	if (ether_addr_equal(net->dev_addr, node_id))

commit d725978abb0bac6e0c427548dfd6db86709a2a1e
Author: Nathan Chancellor <natechancellor@gmail.com>
Date:   Sat Jan 5 19:35:25 2019 +0100

    ARM: 8819/1: Remove '-p' from LDFLAGS
    
    commit 091bb549f7722723b284f63ac665e2aedcf9dec9 upstream.
    
    This option is not supported by lld:
    
        ld.lld: error: unknown argument: -p
    
    This has been a no-op in binutils since 2004 (see commit dea514f51da1 in
    that tree). Given that the lowest officially supported of binutils for
    the kernel is 2.20, which was released in 2009, nobody needs this flag
    around so just remove it. Commit 1a381d4a0a9a ("arm64: remove no-op -p
    linker flag") did the same for arm64.
    
    Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
    Acked-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
    Acked-by: Nicolas Pitre <nico@linaro.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
    Reviewed-by: Stefan Agner <stefan@agner.ch>
    Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index d1516f85f25d..658896a7d30d 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -10,7 +10,7 @@
 #
 # Copyright (C) 1995-2001 by Russell King
 
-LDFLAGS_vmlinux	:=-p --no-undefined -X --pic-veneer
+LDFLAGS_vmlinux	:= --no-undefined -X --pic-veneer
 ifeq ($(CONFIG_CPU_ENDIAN_BE8),y)
 LDFLAGS_vmlinux	+= --be8
 KBUILD_LDFLAGS_MODULE	+= --be8
diff --git a/arch/arm/boot/bootp/Makefile b/arch/arm/boot/bootp/Makefile
index 83e1a076a5d6..981a8d03f064 100644
--- a/arch/arm/boot/bootp/Makefile
+++ b/arch/arm/boot/bootp/Makefile
@@ -8,7 +8,7 @@
 
 GCOV_PROFILE	:= n
 
-LDFLAGS_bootp	:=-p --no-undefined -X \
+LDFLAGS_bootp	:= --no-undefined -X \
 		 --defsym initrd_phys=$(INITRD_PHYS) \
 		 --defsym params_phys=$(PARAMS_PHYS) -T
 AFLAGS_initrd.o :=-DINITRD=\"$(INITRD)\"
diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile
index 1b3a4144646b..7f19143981c9 100644
--- a/arch/arm/boot/compressed/Makefile
+++ b/arch/arm/boot/compressed/Makefile
@@ -133,8 +133,6 @@ endif
 ifeq ($(CONFIG_CPU_ENDIAN_BE8),y)
 LDFLAGS_vmlinux += --be8
 endif
-# ?
-LDFLAGS_vmlinux += -p
 # Report unresolved symbol references
 LDFLAGS_vmlinux += --no-undefined
 # Delete all temporary local symbols

commit aaf4e1b05cab800b36b40c1aa09f7c13ef30de56
Author: Robin Murphy <robin.murphy@arm.com>
Date:   Mon Jul 12 15:27:46 2021 +0100

    arm64: Avoid premature usercopy failure
    
    commit 295cf156231ca3f9e3a66bde7fab5e09c41835e0 upstream.
    
    Al reminds us that the usercopy API must only return complete failure
    if absolutely nothing could be copied. Currently, if userspace does
    something silly like giving us an unaligned pointer to Device memory,
    or a size which overruns MTE tag bounds, we may fail to honour that
    requirement when faulting on a multi-byte access even though a smaller
    access could have succeeded.
    
    Add a mitigation to the fixup routines to fall back to a single-byte
    copy if we faulted on a larger access before anything has been written
    to the destination, to guarantee making *some* forward progress. We
    needn't be too concerned about the overall performance since this should
    only occur when callers are doing something a bit dodgy in the first
    place. Particularly broken userspace might still be able to trick
    generic_perform_write() into an infinite loop by targeting write() at
    an mmap() of some read-only device register where the fault-in load
    succeeds but any store synchronously aborts such that copy_to_user() is
    genuinely unable to make progress, but, well, don't do that...
    
    CC: stable@vger.kernel.org
    Reported-by: Chen Huang <chenhuang5@huawei.com>
    Suggested-by: Al Viro <viro@zeniv.linux.org.uk>
    Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: Robin Murphy <robin.murphy@arm.com>
    Link: https://lore.kernel.org/r/dc03d5c675731a1f24a62417dba5429ad744234e.1626098433.git.robin.murphy@arm.com
    Signed-off-by: Will Deacon <will@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Chen Huang <chenhuang5@huawei.com>

diff --git a/arch/arm64/lib/copy_from_user.S b/arch/arm64/lib/copy_from_user.S
index 96b22c0fa343..7cd6eeaa216c 100644
--- a/arch/arm64/lib/copy_from_user.S
+++ b/arch/arm64/lib/copy_from_user.S
@@ -39,7 +39,7 @@
 	.endm
 
 	.macro ldrh1 ptr, regB, val
-	uao_user_alternative 9998f, ldrh, ldtrh, \ptr, \regB, \val
+	uao_user_alternative 9997f, ldrh, ldtrh, \ptr, \regB, \val
 	.endm
 
 	.macro strh1 ptr, regB, val
@@ -47,7 +47,7 @@
 	.endm
 
 	.macro ldr1 ptr, regB, val
-	uao_user_alternative 9998f, ldr, ldtr, \ptr, \regB, \val
+	uao_user_alternative 9997f, ldr, ldtr, \ptr, \regB, \val
 	.endm
 
 	.macro str1 ptr, regB, val
@@ -55,7 +55,7 @@
 	.endm
 
 	.macro ldp1 ptr, regB, regC, val
-	uao_ldp 9998f, \ptr, \regB, \regC, \val
+	uao_ldp 9997f, \ptr, \regB, \regC, \val
 	.endm
 
 	.macro stp1 ptr, regB, regC, val
@@ -63,9 +63,11 @@
 	.endm
 
 end	.req	x5
+srcin	.req	x15
 ENTRY(__arch_copy_from_user)
 	uaccess_enable_not_uao x3, x4, x5
 	add	end, x0, x2
+	mov	srcin, x1
 #include "copy_template.S"
 	uaccess_disable_not_uao x3, x4
 	mov	x0, #0				// Nothing to copy
@@ -74,6 +76,11 @@ ENDPROC(__arch_copy_from_user)
 
 	.section .fixup,"ax"
 	.align	2
+9997:	cmp	dst, dstin
+	b.ne	9998f
+	// Before being absolutely sure we couldn't copy anything, try harder
+USER(9998f, ldtrb tmp1w, [srcin])
+	strb	tmp1w, [dst], #1
 9998:	sub	x0, end, dst			// bytes not copied
 	uaccess_disable_not_uao x3, x4
 	ret
diff --git a/arch/arm64/lib/copy_in_user.S b/arch/arm64/lib/copy_in_user.S
index e56c705f1f23..b20d3a0b3237 100644
--- a/arch/arm64/lib/copy_in_user.S
+++ b/arch/arm64/lib/copy_in_user.S
@@ -40,34 +40,36 @@
 	.endm
 
 	.macro ldrh1 ptr, regB, val
-	uao_user_alternative 9998f, ldrh, ldtrh, \ptr, \regB, \val
+	uao_user_alternative 9997f, ldrh, ldtrh, \ptr, \regB, \val
 	.endm
 
 	.macro strh1 ptr, regB, val
-	uao_user_alternative 9998f, strh, sttrh, \ptr, \regB, \val
+	uao_user_alternative 9997f, strh, sttrh, \ptr, \regB, \val
 	.endm
 
 	.macro ldr1 ptr, regB, val
-	uao_user_alternative 9998f, ldr, ldtr, \ptr, \regB, \val
+	uao_user_alternative 9997f, ldr, ldtr, \ptr, \regB, \val
 	.endm
 
 	.macro str1 ptr, regB, val
-	uao_user_alternative 9998f, str, sttr, \ptr, \regB, \val
+	uao_user_alternative 9997f, str, sttr, \ptr, \regB, \val
 	.endm
 
 	.macro ldp1 ptr, regB, regC, val
-	uao_ldp 9998f, \ptr, \regB, \regC, \val
+	uao_ldp 9997f, \ptr, \regB, \regC, \val
 	.endm
 
 	.macro stp1 ptr, regB, regC, val
-	uao_stp 9998f, \ptr, \regB, \regC, \val
+	uao_stp 9997f, \ptr, \regB, \regC, \val
 	.endm
 
 end	.req	x5
+srcin	.req	x15
 
 ENTRY(__arch_copy_in_user)
 	uaccess_enable_not_uao x3, x4, x5
 	add	end, x0, x2
+	mov	srcin, x1
 #include "copy_template.S"
 	uaccess_disable_not_uao x3, x4
 	mov	x0, #0
@@ -76,6 +78,12 @@ ENDPROC(__arch_copy_in_user)
 
 	.section .fixup,"ax"
 	.align	2
+9997:	cmp	dst, dstin
+	b.ne	9998f
+	// Before being absolutely sure we couldn't copy anything, try harder
+USER(9998f, ldtrb tmp1w, [srcin])
+USER(9998f, sttrb tmp1w, [dst])
+	add	dst, dst, #1
 9998:	sub	x0, end, dst			// bytes not copied
 	uaccess_disable_not_uao x3, x4
 	ret
diff --git a/arch/arm64/lib/copy_to_user.S b/arch/arm64/lib/copy_to_user.S
index 6b99b939c50f..cfdbb1fe8d51 100644
--- a/arch/arm64/lib/copy_to_user.S
+++ b/arch/arm64/lib/copy_to_user.S
@@ -42,7 +42,7 @@
 	.endm
 
 	.macro strh1 ptr, regB, val
-	uao_user_alternative 9998f, strh, sttrh, \ptr, \regB, \val
+	uao_user_alternative 9997f, strh, sttrh, \ptr, \regB, \val
 	.endm
 
 	.macro ldr1 ptr, regB, val
@@ -50,7 +50,7 @@
 	.endm
 
 	.macro str1 ptr, regB, val
-	uao_user_alternative 9998f, str, sttr, \ptr, \regB, \val
+	uao_user_alternative 9997f, str, sttr, \ptr, \regB, \val
 	.endm
 
 	.macro ldp1 ptr, regB, regC, val
@@ -58,13 +58,15 @@
 	.endm
 
 	.macro stp1 ptr, regB, regC, val
-	uao_stp 9998f, \ptr, \regB, \regC, \val
+	uao_stp 9997f, \ptr, \regB, \regC, \val
 	.endm
 
 end	.req	x5
+srcin	.req	x15
 ENTRY(__arch_copy_to_user)
 	uaccess_enable_not_uao x3, x4, x5
 	add	end, x0, x2
+	mov	srcin, x1
 #include "copy_template.S"
 	uaccess_disable_not_uao x3, x4
 	mov	x0, #0
@@ -73,6 +75,12 @@ ENDPROC(__arch_copy_to_user)
 
 	.section .fixup,"ax"
 	.align	2
+9997:	cmp	dst, dstin
+	b.ne	9998f
+	// Before being absolutely sure we couldn't copy anything, try harder
+	ldrb	tmp1w, [srcin]
+USER(9998f, sttrb tmp1w, [dst])
+	add	dst, dst, #1
 9998:	sub	x0, end, dst			// bytes not copied
 	uaccess_disable_not_uao x3, x4
 	ret

commit 5909b851b5e11d04f299e5f0a8937e9dcc807248
Author: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Date:   Wed Oct 6 01:55:22 2021 +0530

    powerpc/bpf: Fix BPF_MOD when imm == 1
    
    commit 8bbc9d822421d9ac8ff9ed26a3713c9afc69d6c8 upstream.
    
    Only ignore the operation if dividing by 1.
    
    Fixes: 156d0e290e969c ("powerpc/ebpf/jit: Implement JIT compiler for extended BPF")
    Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Tested-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
    Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu>
    Acked-by: Song Liu <songliubraving@fb.com>
    Acked-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/c674ca18c3046885602caebb326213731c675d06.1633464148.git.naveen.n.rao@linux.vnet.ibm.com
    [cascardo: use PPC_LI instead of EMIT(PPC_RAW_LI)]
    Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/powerpc/net/bpf_jit_comp64.c b/arch/powerpc/net/bpf_jit_comp64.c
index e7d56ddba43a..87213a1bb14c 100644
--- a/arch/powerpc/net/bpf_jit_comp64.c
+++ b/arch/powerpc/net/bpf_jit_comp64.c
@@ -385,8 +385,14 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
 		case BPF_ALU64 | BPF_DIV | BPF_K: /* dst /= imm */
 			if (imm == 0)
 				return -EINVAL;
-			else if (imm == 1)
-				goto bpf_alu32_trunc;
+			if (imm == 1) {
+				if (BPF_OP(code) == BPF_DIV) {
+					goto bpf_alu32_trunc;
+				} else {
+					PPC_LI(dst_reg, 0);
+					break;
+				}
+			}
 
 			PPC_LI32(b2p[TMP_REG_1], imm);
 			switch (BPF_CLASS(code)) {

commit 901741a53d7cf45be861e881c0e3cba5b4bd1f94
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Mon Oct 18 15:30:37 2021 +0100

    ARM: 9141/1: only warn about XIP address when not compile testing
    
    commit 48ccc8edf5b90622cdc4f8878e0042ab5883e2ca upstream.
    
    In randconfig builds, we sometimes come across this warning:
    
    arm-linux-gnueabi-ld: XIP start address may cause MPU programming issues
    
    While this is helpful for actual systems to figure out why it
    fails, the warning does not provide any benefit for build testing,
    so guard it in a check for CONFIG_COMPILE_TEST, which is usually
    set on randconfig builds.
    
    Fixes: 216218308cfb ("ARM: 8713/1: NOMMU: Support MPU in XIP configuration")
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/kernel/vmlinux-xip.lds.S b/arch/arm/kernel/vmlinux-xip.lds.S
index 3593d5c1acd2..93267800ccff 100644
--- a/arch/arm/kernel/vmlinux-xip.lds.S
+++ b/arch/arm/kernel/vmlinux-xip.lds.S
@@ -181,7 +181,7 @@ ASSERT(__hyp_idmap_text_end - (__hyp_idmap_text_start & PAGE_MASK) <= PAGE_SIZE,
 ASSERT((_end - __bss_start) >= 12288, ".bss too small for CONFIG_XIP_DEFLATED_DATA")
 #endif
 
-#ifdef CONFIG_ARM_MPU
+#if defined(CONFIG_ARM_MPU) && !defined(CONFIG_COMPILE_TEST)
 /*
  * Due to PMSAv7 restriction on base address and size we have to
  * enforce minimal alignment restrictions. It was seen that weaker

commit ee4b38ce37ed31beca29d3ebec7db3d5e87fe39e
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Mon Oct 18 15:30:09 2021 +0100

    ARM: 9139/1: kprobes: fix arch_init_kprobes() prototype
    
    commit 1f323127cab086e4fd618981b1e5edc396eaf0f4 upstream.
    
    With extra warnings enabled, gcc complains about this function
    definition:
    
    arch/arm/probes/kprobes/core.c: In function 'arch_init_kprobes':
    arch/arm/probes/kprobes/core.c:465:12: warning: old-style function definition [-Wold-style-definition]
      465 | int __init arch_init_kprobes()
    
    Link: https://lore.kernel.org/all/20201027093057.c685a14b386acacb3c449e3d@kernel.org/
    
    Fixes: 24ba613c9d6c ("ARM kprobes: core code")
    Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/probes/kprobes/core.c b/arch/arm/probes/kprobes/core.c
index f8bd523d64d1..62da8e2211e4 100644
--- a/arch/arm/probes/kprobes/core.c
+++ b/arch/arm/probes/kprobes/core.c
@@ -542,7 +542,7 @@ static struct undef_hook kprobes_arm_break_hook = {
 
 #endif /* !CONFIG_THUMB2_KERNEL */
 
-int __init arch_init_kprobes()
+int __init arch_init_kprobes(void)
 {
 	arm_probes_decode_init();
 #ifdef CONFIG_THUMB2_KERNEL

commit c0b4f1db7feef31d401814121760b45aff7885c1
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Mon Oct 18 15:30:04 2021 +0100

    ARM: 9134/1: remove duplicate memcpy() definition
    
    commit eaf6cc7165c9c5aa3c2f9faa03a98598123d0afb upstream.
    
    Both the decompressor code and the kasan logic try to override
    the memcpy() and memmove()  definitions, which leading to a clash
    in a KASAN-enabled kernel with XZ decompression:
    
    arch/arm/boot/compressed/decompress.c:50:9: error: 'memmove' macro redefined [-Werror,-Wmacro-redefined]
     #define memmove memmove
            ^
    arch/arm/include/asm/string.h:59:9: note: previous definition is here
     #define memmove(dst, src, len) __memmove(dst, src, len)
            ^
    arch/arm/boot/compressed/decompress.c:51:9: error: 'memcpy' macro redefined [-Werror,-Wmacro-redefined]
     #define memcpy memcpy
            ^
    arch/arm/include/asm/string.h:58:9: note: previous definition is here
     #define memcpy(dst, src, len) __memcpy(dst, src, len)
            ^
    
    Here we want the set of functions from the decompressor, so undefine
    the other macros before the override.
    
    Link: https://lore.kernel.org/linux-arm-kernel/CACRpkdZYJogU_SN3H9oeVq=zJkRgRT1gDz3xp59gdqWXxw-B=w@mail.gmail.com/
    Link: https://lore.kernel.org/lkml/202105091112.F5rmd4By-lkp@intel.com/
    
    Fixes: d6d51a96c7d6 ("ARM: 9014/2: Replace string mem* functions for KASan")
    Fixes: a7f464f3db93 ("ARM: 7001/2: Wire up support for the XZ decompressor")
    Reported-by: kernel test robot <lkp@intel.com>
    Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/boot/compressed/decompress.c b/arch/arm/boot/compressed/decompress.c
index c16c1829a5e4..c10e10f26c09 100644
--- a/arch/arm/boot/compressed/decompress.c
+++ b/arch/arm/boot/compressed/decompress.c
@@ -46,7 +46,10 @@ extern int memcmp(const void *cs, const void *ct, size_t count);
 #endif
 
 #ifdef CONFIG_KERNEL_XZ
+/* Prevent KASAN override of string helpers in decompressor */
+#undef memmove
 #define memmove memmove
+#undef memcpy
 #define memcpy memcpy
 #include "../../../../lib/decompress_unxz.c"
 #endif

commit 00dcbb2d2cd3594faa2f977f2f7175cf23d4e326
Author: Nick Desaulniers <ndesaulniers@google.com>
Date:   Mon Oct 4 18:03:28 2021 +0100

    ARM: 9133/1: mm: proc-macros: ensure *_tlb_fns are 4B aligned
    
    commit e6a0c958bdf9b2e1b57501fc9433a461f0a6aadd upstream.
    
    A kernel built with CONFIG_THUMB2_KERNEL=y and using clang as the
    assembler could generate non-naturally-aligned v7wbi_tlb_fns which
    results in a boot failure. The original commit adding the macro missed
    the .align directive on this data.
    
    Link: https://github.com/ClangBuiltLinux/linux/issues/1447
    Link: https://lore.kernel.org/all/0699da7b-354f-aecc-a62f-e25693209af4@linaro.org/
    Debugged-by: Ard Biesheuvel <ardb@kernel.org>
    Debugged-by: Nathan Chancellor <nathan@kernel.org>
    Debugged-by: Richard Henderson <richard.henderson@linaro.org>
    
    Fixes: 66a625a88174 ("ARM: mm: proc-macros: Add generic proc/cache/tlb struct definition macros")
    Suggested-by: Ard Biesheuvel <ardb@kernel.org>
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
    Tested-by: Nathan Chancellor <nathan@kernel.org>
    Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/mm/proc-macros.S b/arch/arm/mm/proc-macros.S
index 60ac7c5999a9..86e54447dc91 100644
--- a/arch/arm/mm/proc-macros.S
+++ b/arch/arm/mm/proc-macros.S
@@ -342,6 +342,7 @@ ENTRY(\name\()_cache_fns)
 
 .macro define_tlb_functions name:req, flags_up:req, flags_smp
 	.type	\name\()_tlb_fns, #object
+	.align 2
 ENTRY(\name\()_tlb_fns)
 	.long	\name\()_flush_user_tlb_range
 	.long	\name\()_flush_kern_tlb_range

commit da9299d74c193cd8bf0c938e22683ed773df5a5a
Merge: 998e8e89b36b 38ec06730e44
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Wed Oct 27 10:06:19 2021 +0200

    Merge 4.19.214 into android-4.19-stable
    
    Changes in 4.19.214
            ARM: dts: at91: sama5d2_som1_ek: disable ISC node by default
            xtensa: xtfpga: use CONFIG_USE_OF instead of CONFIG_OF
            xtensa: xtfpga: Try software restart before simulating CPU reset
            NFSD: Keep existing listeners on portlist error
            dma-debug: fix sg checks in debug_dma_map_sg()
            ASoC: wm8960: Fix clock configuration on slave mode
            netfilter: ipvs: make global sysctl readonly in non-init netns
            lan78xx: select CRC32
            NIOS2: irqflags: rename a redefined register name
            net: hns3: add limit ets dwrr bandwidth cannot be 0
            net: hns3: disable sriov before unload hclge layer
            can: rcar_can: fix suspend/resume
            can: peak_usb: pcan_usb_fd_decode_status(): fix back to ERROR_ACTIVE state notification
            can: peak_pci: peak_pci_remove(): fix UAF
            ocfs2: fix data corruption after conversion from inline format
            ocfs2: mount fails with buffer overflow in strlen
            elfcore: correct reference to CONFIG_UML
            vfs: check fd has read access in kernel_read_file_from_fd()
            ALSA: usb-audio: Provide quirk for Sennheiser GSP670 Headset
            ALSA: hda/realtek: Add quirk for Clevo PC50HS
            ASoC: DAPM: Fix missing kctl change notifications
            mm, slub: fix mismatch between reconstructed freelist depth and cnt
            nfc: nci: fix the UAF of rf_conn_info object
            isdn: cpai: check ctr->cnr to avoid array index out of bound
            netfilter: Kconfig: use 'default y' instead of 'm' for bool config option
            gcc-plugins/structleak: add makefile var for disabling structleak
            btrfs: deal with errors when checking if a dir entry exists during log replay
            net: stmmac: add support for dwmac 3.40a
            ARM: dts: spear3xx: Fix gmac node
            isdn: mISDN: Fix sleeping function called from invalid context
            platform/x86: intel_scu_ipc: Update timeout value in comment
            ALSA: hda: avoid write to STATESTS if controller is in reset
            scsi: core: Fix shost->cmd_per_lun calculation in scsi_add_host_with_dma()
            net: mdiobus: Fix memory leak in __mdiobus_register
            tracing: Have all levels of checks prevent recursion
            ARM: 9122/1: select HAVE_FUTEX_CMPXCHG
            Linux 4.19.214
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I97b88fa1d9a31240483461a80650955c1b8adc80

commit d0b95bb73b965eefa1446adc00a05fa9db0232e6
Author: Zhen Chen <chenzhen@rock-chips.com>
Date:   Thu Oct 28 18:00:11 2021 +0800

    MALI: bifrost: fix compilation errors when CONFIG_DEBUG_FS is disabled
    
    Such as involving non_debuggable.config.
    
    Signed-off-by: Zhen Chen <chenzhen@rock-chips.com>
    Change-Id: I4224a31169c2ce224d8cc2d6993f4ac3cd40d675

diff --git a/drivers/gpu/arm/bifrost/device/mali_kbase_device.c b/drivers/gpu/arm/bifrost/device/mali_kbase_device.c
index 1ebd8aa14f3a..08961d583034 100644
--- a/drivers/gpu/arm/bifrost/device/mali_kbase_device.c
+++ b/drivers/gpu/arm/bifrost/device/mali_kbase_device.c
@@ -395,6 +395,7 @@ void kbase_device_vinstr_term(struct kbase_device *kbdev)
 	kbase_vinstr_term(kbdev->vinstr_ctx);
 }
 
+#if defined(CONFIG_DEBUG_FS) && !IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI)
 int kbase_device_io_history_init(struct kbase_device *kbdev)
 {
 	return kbase_io_history_init(&kbdev->io_history,
@@ -405,6 +406,7 @@ void kbase_device_io_history_term(struct kbase_device *kbdev)
 {
 	kbase_io_history_term(&kbdev->io_history);
 }
+#endif
 
 int kbase_device_misc_register(struct kbase_device *kbdev)
 {
diff --git a/drivers/gpu/arm/bifrost/device/mali_kbase_device_internal.h b/drivers/gpu/arm/bifrost/device/mali_kbase_device_internal.h
index d422407901e3..b4c063ce5257 100644
--- a/drivers/gpu/arm/bifrost/device/mali_kbase_device_internal.h
+++ b/drivers/gpu/arm/bifrost/device/mali_kbase_device_internal.h
@@ -51,8 +51,18 @@ void kbase_device_hwcnt_virtualizer_term(struct kbase_device *kbdev);
 int kbase_device_list_init(struct kbase_device *kbdev);
 void kbase_device_list_term(struct kbase_device *kbdev);
 
+#if defined(CONFIG_DEBUG_FS) && !IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI)
 int kbase_device_io_history_init(struct kbase_device *kbdev);
 void kbase_device_io_history_term(struct kbase_device *kbdev);
+#else
+static inline int kbase_device_io_history_init(struct kbase_device *kbdev)
+{
+	return 0;
+}
+static inline void kbase_device_io_history_term(struct kbase_device *kbdev)
+{
+}
+#endif
 
 int kbase_device_misc_register(struct kbase_device *kbdev);
 void kbase_device_misc_deregister(struct kbase_device *kbdev);
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_regs_history_debugfs.h b/drivers/gpu/arm/bifrost/mali_kbase_regs_history_debugfs.h
index 75fbb47d5107..cbe602248836 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_regs_history_debugfs.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_regs_history_debugfs.h
@@ -70,6 +70,23 @@ void kbase_io_history_dump(struct kbase_device *kbdev);
 void kbasep_regs_history_debugfs_init(struct kbase_device *kbdev);
 
 #else /* defined(CONFIG_DEBUG_FS) && !IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI) */
+static inline int kbase_io_history_init(struct kbase_io_history *h, u16 n)
+{
+	return 0;
+}
+
+static inline void kbase_io_history_term(struct kbase_io_history *h)
+{
+}
+
+static inline void kbase_io_history_dump(struct kbase_device *kbdev)
+{
+}
+
+static inline void kbasep_regs_history_debugfs_init(struct kbase_device *kbdev)
+{
+}
+
 #endif /* defined(CONFIG_DEBUG_FS) && !IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI) */
 
 #endif  /*_KBASE_REGS_HISTORY_DEBUGFS_H*/

commit 998e8e89b36bf0efd45e36d1454651a3d8ac153d
Author: Lee Jones <lee.jones@linaro.org>
Date:   Fri Oct 22 19:07:29 2021 +0100

    ANDROID: Incremental fs: Fix dentry get/put imbalance on vfs_mkdir() failure
    
    Syz{bot,kaller} reports[0]:
    
      BUG: Dentry ffff888119d8a000{i=0,n=.index}  still in use (1) [unmount of ramfs ramfs]
      ------------[ cut here ]------------
      WARNING: CPU: 0 PID: 367 at fs/dcache.c:1616 umount_check+0x18d/0x1d0 fs/dcache.c:1607
      Modules linked in:
      CPU: 0 PID: 367 Comm: syz-executor388 Not tainted 5.10.75-syzkaller-01082-g234d53d2bb60 #0
      Hardware name: Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
      RIP: 0010:umount_check+0x18d/0x1d0 fs/dcache.c:1607
      Code: 8b 0b 49 81 c6 f8 03 00 00 48 c7 c7 00 40 2e 85 4c 89 e6 48 8b 55 d0 4c 89 e1 45 89 f8 31 c0 41 56 e8 ae d9 9e ff 48 83 c4 08 <0f> 0b e9 f1 fe ff ff 89 d9 80 e1 07 80 c1 03 38 c1 0f 8c c9 fe ff
      RSP: 0018:ffffc9000096f770 EFLAGS: 00010292
      RAX: 0000000000000055 RBX: ffffffff866af200 RCX: 1ad6b89836e5b500
      RDX: 0000000000000000 RSI: 0000000000000002 RDI: 0000000000000000
      RBP: ffffc9000096f7a0 R08: ffffffff81545368 R09: 0000000000000003
      R10: fffff5200012de41 R11: 0000000000000004 R12: ffff888119d8a000
      R13: dffffc0000000000 R14: ffff88811d7373f8 R15: 0000000000000001
      FS:  0000000000000000(0000) GS:ffff8881f7000000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 00007f01b7bddb68 CR3: 000000010c4f0000 CR4: 00000000003506b0
      DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      Call Trace:
       d_walk+0x309/0x540 fs/dcache.c:1326
       do_one_tree fs/dcache.c:1623 [inline]
       shrink_dcache_for_umount+0x8e/0x1b0 fs/dcache.c:1639
       generic_shutdown_super+0x66/0x2c0 fs/super.c:447
       kill_anon_super fs/super.c:1108 [inline]
       kill_litter_super+0x75/0xa0 fs/super.c:1117
       ramfs_kill_sb+0x44/0x50 fs/ramfs/inode.c:270
       deactivate_locked_super+0xb0/0x100 fs/super.c:335
       deactivate_super+0xa5/0xd0 fs/super.c:366
       cleanup_mnt+0x45f/0x510 fs/namespace.c:1118
       __cleanup_mnt+0x19/0x20 fs/namespace.c:1125
       task_work_run+0x147/0x1b0 kernel/task_work.c:154
       exit_task_work include/linux/task_work.h:30 [inline]
       do_exit+0x70e/0x23a0 kernel/exit.c:813
       do_group_exit+0x16a/0x2d0 kernel/exit.c:910
       get_signal+0x133e/0x1f80 kernel/signal.c:2790
       arch_do_signal+0x8d/0x620 arch/x86/kernel/signal.c:805
       exit_to_user_mode_loop kernel/entry/common.c:161 [inline]
       exit_to_user_mode_prepare+0xaa/0xe0 kernel/entry/common.c:191
       syscall_exit_to_user_mode+0x24/0x40 kernel/entry/common.c:266
       do_syscall_64+0x3d/0x70 arch/x86/entry/common.c:56
       entry_SYSCALL_64_after_hwframe+0x44/0xa9
      RIP: 0033:0x7f01b7b884f9
      Code: Unable to access opcode bytes at RIP 0x7f01b7b884cf.
      RSP: 002b:00007f01b7b19308 EFLAGS: 00000246 ORIG_RAX: 00000000000000ca
      RAX: fffffffffffffe00 RBX: 00007f01b7c103f8 RCX: 00007f
    
    Which was due to a missing dput() before returning from a vfs_mkdir() failure.
    
    Bug: 203827798
    Link: [0] https://syzkaller.appspot.com/bug?extid=81b5ca9b2848f4dad8fa
    Reported-by: syzbot+81b5ca9b2848f4dad8fa@syzkaller.appspotmail.com
    Signed-off-by: Lee Jones <lee.jones@linaro.org>
    Change-Id: Iaef9aa0aecc964645aaca5fe8d79388ae28527bd

diff --git a/fs/incfs/vfs.c b/fs/incfs/vfs.c
index 9e335954171f..aaca345cb786 100644
--- a/fs/incfs/vfs.c
+++ b/fs/incfs/vfs.c
@@ -779,8 +779,10 @@ static struct dentry *open_or_create_index_dir(struct dentry *backing_dir)
 	err = vfs_mkdir(backing_inode, index_dentry, 0777);
 	inode_unlock(backing_inode);
 
-	if (err)
+	if (err) {
+		dput(index_dentry);
 		return ERR_PTR(err);
+	}
 
 	if (!d_really_is_positive(index_dentry)) {
 		dput(index_dentry);

commit 26595250be522a596079f1f8878b9fb26d632002
Author: Simon Xue <xxm@rock-chips.com>
Date:   Fri Oct 22 09:39:24 2021 +0800

    iommu/rockchip: wrap enable/disable operation for user
    
    There are issues about the field "links" of struct device
    by calling pm_runtime_get_sync/pm_runtime_put_sync to
    enable/disable iommu, wrap helpers to make things easy.
    
    Change-Id: I03a85dc8c67b902e79b1e86a201b2074e2562d83
    Signed-off-by: Simon Xue <xxm@rock-chips.com>

diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c
index dc2920e866b0..6ed2cddea49c 100644
--- a/drivers/iommu/rockchip-iommu.c
+++ b/drivers/iommu/rockchip-iommu.c
@@ -25,6 +25,7 @@
 #include <linux/pm_runtime.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
+#include <soc/rockchip/rockchip_iommu.h>
 
 /** MMU register offsets */
 #define RK_MMU_DTE_ADDR		0x00	/* Directory table address */
@@ -1258,6 +1259,20 @@ static void rk_iommu_disable(struct rk_iommu *iommu)
 	clk_bulk_disable(iommu->num_clocks, iommu->clocks);
 }
 
+int rockchip_iommu_disable(struct device *dev)
+{
+	struct rk_iommu *iommu;
+
+	iommu = rk_iommu_from_dev(dev);
+	if (!iommu)
+		return -ENODEV;
+
+	rk_iommu_disable(iommu);
+
+	return 0;
+}
+EXPORT_SYMBOL(rockchip_iommu_disable);
+
 /* Must be called with iommu powered on and attached */
 static int rk_iommu_enable(struct rk_iommu *iommu)
 {
@@ -1306,6 +1321,18 @@ static int rk_iommu_enable(struct rk_iommu *iommu)
 	return ret;
 }
 
+int rockchip_iommu_enable(struct device *dev)
+{
+	struct rk_iommu *iommu;
+
+	iommu = rk_iommu_from_dev(dev);
+	if (!iommu)
+		return -ENODEV;
+
+	return rk_iommu_enable(iommu);
+}
+EXPORT_SYMBOL(rockchip_iommu_enable);
+
 static void rk_iommu_detach_device(struct iommu_domain *domain,
 				   struct device *dev)
 {
diff --git a/include/soc/rockchip/rockchip_iommu.h b/include/soc/rockchip/rockchip_iommu.h
new file mode 100644
index 000000000000..e837d9fec30c
--- /dev/null
+++ b/include/soc/rockchip/rockchip_iommu.h
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co., Ltd
+ */
+#ifndef __SOC_ROCKCHIP_IOMMU_H
+#define __SOC_ROCKCHIP_IOMMU_H
+
+struct device;
+
+#if IS_ENABLED(CONFIG_ROCKCHIP_IOMMU)
+int rockchip_iommu_enable(struct device *dev);
+int rockchip_iommu_disable(struct device *dev);
+#else
+static inline int rockchip_iommu_enable(struct device *dev)
+{
+	return -ENODEV;
+}
+static inline int rockchip_iommu_disable(struct device *dev)
+{
+	return -ENODEV;
+}
+#endif
+
+#endif

commit 6341858d4bc595a95de05d5b71a436be4eb38b85
Author: Algea Cao <algea.cao@rock-chips.com>
Date:   Mon Oct 25 17:16:38 2021 +0800

    drm/bridge: rk630: Support new version rk630 tve
    
    Signed-off-by: Algea Cao <algea.cao@rock-chips.com>
    Change-Id: I2b1eae031a7f78ec06cf28d9120038c8eb8ae419

diff --git a/drivers/gpu/drm/bridge/rk630-tve.c b/drivers/gpu/drm/bridge/rk630-tve.c
index 026ef77f7772..2b6c30c50d2e 100644
--- a/drivers/gpu/drm/bridge/rk630-tve.c
+++ b/drivers/gpu/drm/bridge/rk630-tve.c
@@ -194,6 +194,7 @@ static int rk630_tve_cfg_set(struct rk630_tve *tve)
 {
 	int ret;
 	struct env_config *bt656_cfg, *tve_cfg;
+	int upsample_en = tve->is_4x ? 1 : 0;
 
 	switch (tve->mode) {
 	case CVBS_PAL:
@@ -224,7 +225,7 @@ static int rk630_tve_cfg_set(struct rk630_tve *tve)
 				   SW_DCLK_UPSAMPLE_EN_MASK |
 				   SW_TVE_MODE_MASK | SW_TVE_EN_MASK,
 				   SW_TVE_DCLK_POL(0) | SW_TVE_DCLK_EN(1) |
-				   SW_DCLK_UPSAMPLE_EN(tve->is_4x) |
+				   SW_DCLK_UPSAMPLE_EN(upsample_en) |
 				   SW_TVE_MODE(1) | SW_TVE_EN(1));
 	else
 		regmap_update_bits(tve->grf, PLUMAGE_GRF_SOC_CON0,
@@ -233,7 +234,7 @@ static int rk630_tve_cfg_set(struct rk630_tve *tve)
 				   SW_DCLK_UPSAMPLE_EN_MASK |
 				   SW_TVE_MODE_MASK | SW_TVE_EN_MASK,
 				   SW_TVE_DCLK_POL(0) | SW_TVE_DCLK_EN(1) |
-				   SW_DCLK_UPSAMPLE_EN(tve->is_4x) |
+				   SW_DCLK_UPSAMPLE_EN(upsample_en) |
 				   SW_TVE_MODE(0) | SW_TVE_EN(1));
 
 	ret = rk630_tve_write_block(tve, tve_cfg, 27);
@@ -255,8 +256,7 @@ static int rk630_tve_disable(struct rk630_tve *tve)
 
 static int rk630_tve_enable(struct rk630_tve *tve)
 {
-	int ret, i;
-	u32 val = 0;
+	int ret;
 
 	dev_dbg(tve->dev, "%s\n", __func__);
 
@@ -275,30 +275,17 @@ static int rk630_tve_enable(struct rk630_tve *tve)
 
 	/*config clk*/
 	if (!tve->is_4x) {
-		regmap_update_bits(tve->cru, CRU_MODE_CON, CLK_SPLL_MODE_MASK,
-				   CLK_SPLL_MODE(2));
+		regmap_update_bits(tve->cru, CRU_GATE_CON0,
+				   DCLK_CVBS_4X_PLL_CLK_EN_MASK,
+				   DCLK_CVBS_4X_PLL_CLK_EN(0));
 	} else {
-		regmap_update_bits(tve->cru, CRU_SPLL_CON1, PLLPD0_MASK,
-				   PLLPD0(1));
-
-		regmap_update_bits(tve->cru, CRU_MODE_CON, CLK_SPLL_MODE_MASK,
-				   CLK_SPLL_MODE(1));
-
-		regmap_update_bits(tve->cru, CRU_SPLL_CON1, PLLPD0_MASK,
-				   PLLPD0(0));
-
-		for (i = 0; i < 10; i++) {
-			usleep_range(1000, 2000);
-			regmap_read(tve->cru, CRU_SPLL_CON1, &val);
-			if (val & PLL_LOCK) {
-				dev_dbg(tve->dev, "rk630 pll locked\n");
-				break;
-			}
-		}
-		if (!(val & PLL_LOCK)) {
-			dev_err(tve->dev, "rk630 pll unlock\n");
-			return -EINVAL;
-		}
+		regmap_update_bits(tve->cru, CRU_CLKSEL_CON1,
+				   DCLK_CVBS_4X_DIV_CON_MASK,
+				   DCLK_CVBS_4X_DIV_CON(tve->is_4x - 1));
+
+		regmap_update_bits(tve->cru, CRU_GATE_CON0,
+				   DCLK_CVBS_4X_PLL_CLK_EN_MASK,
+				   DCLK_CVBS_4X_PLL_CLK_EN(1));
 	}
 
 	/* enable vdac */
@@ -461,6 +448,7 @@ static int rk630_tve_probe(struct platform_device *pdev)
 	struct rk630 *rk630 = dev_get_drvdata(pdev->dev.parent);
 	struct rk630_tve *tve;
 	struct device *dev = &pdev->dev;
+	int ret;
 
 	if (!of_device_is_available(dev->of_node))
 		return -ENODEV;
@@ -479,6 +467,11 @@ static int rk630_tve_probe(struct platform_device *pdev)
 	if (!tve->grf | !tve->cru | !tve->tvemap)
 		return -ENODEV;
 
+	ret = device_property_read_u32(dev, "rockchip,tve-upsample",
+				       &tve->is_4x);
+	if (ret < 0)
+		tve->is_4x = 0;
+
 	tve->mode = CVBS_PAL;
 
 	tve->bridge.funcs = &rk630_tve_bridge_funcs;
diff --git a/include/linux/mfd/rk630.h b/include/linux/mfd/rk630.h
index db81677bd0fb..4105a2bdad74 100644
--- a/include/linux/mfd/rk630.h
+++ b/include/linux/mfd/rk630.h
@@ -154,6 +154,10 @@
 #define CRU_CLKSEL_CON2			CRU_REG(0x0038)
 #define CRU_CLKSEL_CON3			CRU_REG(0x003c)
 #define CRU_GATE_CON0			CRU_REG(0x0040)
+#define DCLK_CVBS_1X_PLL_CLK_EN_MASK	HIWORD_MASK(12, 12)
+#define DCLK_CVBS_1X_PLL_CLK_EN(x)	HIWORD_UPDATE(x, 12, 12)
+#define DCLK_CVBS_4X_PLL_CLK_EN_MASK	HIWORD_MASK(11, 11)
+#define DCLK_CVBS_4X_PLL_CLK_EN(x)	HIWORD_UPDATE(x, 11, 11)
 #define CRU_SOFTRST_CON0		CRU_REG(0x0050)
 #define DRESETN_CVBS_1X_MASK		HIWORD_MASK(10, 10)
 #define DRESETN_CVBS_1X(x)		HIWORD_UPDATE(x, 10, 10)

commit efa2999fc6db14263793b1c88fab3a8bddee222b
Author: Zhenke Fan <fanzy.fan@rock-chips.com>
Date:   Sat Oct 9 14:22:14 2021 +0800

    media: i2c: ov13b10: add ov13b10 sensor driver
    
    Signed-off-by: Zhenke Fan <fanzy.fan@rock-chips.com>
    Change-Id: Ie5c65660f4745aa7151cdbca172c45178bb8d6e4

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index efb2bc4e7973..cb75b42bf06e 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -1277,6 +1277,15 @@ config VIDEO_OV13858
 	  This is a Video4Linux2 sensor driver for the OmniVision
 	  OV13858 camera.
 
+config VIDEO_OV13B10
+	tristate "OmniVision OV13B10 sensor support"
+	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
+	depends on MEDIA_CAMERA_SUPPORT
+	select V4L2_FWNODE
+	---help---
+	  This is a Video4Linux2 sensor driver for the OmniVision
+	  OV13B10 camera.
+
 config VIDEO_PREISP_DUMMY_SENSOR
 	tristate "Preisp dummy sensor support"
 	depends on VIDEO_V4L2 && I2C && VIDEO_V4L2_SUBDEV_API
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index 2d421b93d4e6..0414c47621ea 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -113,6 +113,7 @@ obj-$(CONFIG_VIDEO_OV9750) += ov9750.o
 obj-$(CONFIG_VIDEO_OV12D2Q) += ov12d2q.o
 obj-$(CONFIG_VIDEO_OV13850) += ov13850.o
 obj-$(CONFIG_VIDEO_OV13858) += ov13858.o
+obj-$(CONFIG_VIDEO_OV13B10)	+= ov13b10.o
 obj-$(CONFIG_VIDEO_MT9M032) += mt9m032.o
 obj-$(CONFIG_VIDEO_MT9M111) += mt9m111.o
 obj-$(CONFIG_VIDEO_MT9P031) += mt9p031.o
diff --git a/drivers/media/i2c/ov13b10.c b/drivers/media/i2c/ov13b10.c
new file mode 100644
index 000000000000..63f3b9c52ad6
--- /dev/null
+++ b/drivers/media/i2c/ov13b10.c
@@ -0,0 +1,1877 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * ov13b10 driver
+ *
+ * Copyright (C) 2020 Rockchip Electronics Co., Ltd.
+ *
+ * V0.0X01.0X01 add poweron function.
+ * V0.0X01.0X02 fix mclk issue when probe multiple camera.
+ * V0.0X01.0X03 add enum_frame_interval function.
+ * V0.0X01.0X04 add quick stream on/off
+ */
+
+#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 <linux/pinctrl/consumer.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/of_graph.h>
+#include <linux/of_platform.h>
+#include <linux/of_gpio.h>
+#include <linux/mfd/syscon.h>
+#include <linux/rk-preisp.h>
+#include "otp_eeprom.h"
+
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x04)
+
+#ifndef V4L2_CID_DIGITAL_GAIN
+#define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
+#endif
+
+#define OV13B10_LINK_FREQ_1120MHZ	560000000   //1120MHz
+#define OV13B10_PIXEL_RATE		(OV13B10_LINK_FREQ_1120MHZ / 10 * 2 * 4)
+
+
+#define OV13B10_XVCLK_FREQ		24000000
+
+#define CHIP_ID				0x00560d
+#define OV13B10_REG_CHIP_ID		0x300a
+
+#define OV13B10_REG_CTRL_MODE		0x0100
+#define OV13B10_MODE_SW_STANDBY		0x0
+#define OV13B10_MODE_STREAMING		BIT(0)
+
+#define OV13B10_REG_EXPOSURE_H		0x3500
+#define OV13B10_REG_EXPOSURE_M		0x3501
+#define OV13B10_REG_EXPOSURE_L		0x3502
+#define	OV13B10_EXPOSURE_MIN		4
+#define	OV13B10_EXPOSURE_STEP		1
+#define OV13B10_VTS_MAX			0x7fff
+
+#define OV13B10_REG_GAIN_H		0x3508
+#define OV13B10_REG_GAIN_L		0x3509
+#define OV13B10_GAIN_H_MASK		0x0f
+#define OV13B10_GAIN_H_SHIFT		8
+#define OV13B10_GAIN_L_MASK		0xff
+#define OV13B10_GAIN_MIN		0x100
+#define OV13B10_GAIN_MAX		0x1f7f
+#define OV13B10_GAIN_STEP		1
+#define OV13B10_GAIN_DEFAULT		0x100
+
+#define OV13B10_REG_TEST_PATTERN	0x5080
+#define	OV13B10_TEST_PATTERN_ENABLE	0x80
+#define	OV13B10_TEST_PATTERN_DISABLE	0x0
+
+#define OV13B10_REG_VTS			0x380e
+
+#define REG_NULL			0xFFFF
+
+#define OV13B10_REG_VALUE_08BIT		1
+#define OV13B10_REG_VALUE_16BIT		2
+#define OV13B10_REG_VALUE_24BIT		3
+
+#define OV13B10_LANES			4
+#define OV13B10_BITS_PER_SAMPLE		10
+
+#define OV13B10_CHIP_REVISION_REG	0x302A
+#define OV13B10_R1A			0xb1
+#define OV13B10_R2A			0xb2
+
+#define OF_CAMERA_PINCTRL_STATE_DEFAULT	"rockchip,camera_default"
+#define OF_CAMERA_PINCTRL_STATE_SLEEP	"rockchip,camera_sleep"
+#define OF_CAMERA_HDR_MODE		"rockchip,camera-hdr-mode"
+
+#define OV13B10_NAME			"ov13b10"
+
+#define OV13B10_REG_DGAIN_H  0x350A
+#define OV13B10_REG_DGAIN_M  0x350B
+#define OV13B10_REG_DGAIN_L  0x350C
+
+static const struct regval *ov13b10_global_regs;
+
+/* usb supply power */
+static const char * const ov13b10_supply_names[] = {
+	"avdd",		/* Analog power */
+	"dovdd",	/* Digital I/O power */
+	"dvdd",		/* Digital core power */
+};
+
+#define OV13B10_NUM_SUPPLIES ARRAY_SIZE(ov13b10_supply_names)
+
+enum ov13b10_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 ov13b10_mode {
+	u32 width;
+	u32 height;
+	struct v4l2_fract max_fps;
+	u32 hts_def;
+	u32 vts_def;
+	u32 exp_def;
+	u32 hdr_mode;
+	const struct regval *reg_list;
+	u32 vc[PAD_MAX];
+};
+
+struct ov13b10 {
+	struct i2c_client	*client;
+	struct clk		*xvclk;
+	struct gpio_desc	*power_gpio;
+	struct gpio_desc	*reset_gpio;
+	struct gpio_desc	*pwdn_gpio;
+	struct gpio_desc	*camled_gpio;
+	struct regulator_bulk_data supplies[OV13B10_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	*test_pattern;
+	struct mutex		mutex;
+	bool			streaming;
+	bool			power_on;
+	const struct ov13b10_mode *cur_mode;
+	u32			cfg_num;
+	u32			module_index;
+	u32			cur_width;
+	const char		*module_facing;
+	const char		*module_name;
+	const char		*len_name;
+	struct otp_info		*otp;
+};
+
+#define to_ov13b10(sd) container_of(sd, struct ov13b10, subdev)
+
+/*
+ * Xclk 24Mhz
+ */
+static const struct regval ov13b10_global_regs_r1a[] = {
+	{0x0103, 0x01},
+	{0x0303, 0x01},
+	{0x0305, 0x46},
+	{0x0321, 0x00},
+	{0x0323, 0x04},
+	{0x0324, 0x01},
+	{0x0325, 0x50},
+	{0x0326, 0x81},
+	{0x0327, 0x04},
+	{0x3012, 0x07},
+	{0x3013, 0x32},
+	{0x3107, 0x23},
+	{0x3501, 0x0c},
+	{0x3502, 0x10},
+	{0x3504, 0x08},
+	{0x3508, 0x07},
+	{0x3509, 0xf0},
+	{0x3600, 0x16},
+	{0x3601, 0x54},
+	{0x3612, 0x4e},
+	{0x3620, 0x00},
+	{0x3621, 0x68},
+	{0x3622, 0x66},
+	{0x3623, 0x03},
+	{0x3662, 0x92},
+	{0x3666, 0xbb},
+	{0x3667, 0x44},
+	{0x366e, 0xff},
+	{0x366f, 0xf3},
+	{0x3675, 0x44},
+	{0x3676, 0x00},
+	{0x367f, 0xe9},
+	{0x3681, 0x1f},
+	{0x3682, 0x1f},
+	{0x3683, 0x0b},
+	{0x3684, 0x0b},
+	{0x3704, 0x0f},
+	{0x3706, 0x40},
+	{0x3708, 0x3b},
+	{0x3709, 0x72},
+	{0x370b, 0xa2},
+	{0x3714, 0x24},
+	{0x371a, 0x3e},
+	{0x3725, 0x42},
+	{0x3739, 0x12},
+	{0x3767, 0x00},
+	{0x377a, 0x0d},
+	{0x3789, 0x18},
+	{0x3790, 0x40},
+	{0x3791, 0xa2},
+	{0x37c2, 0x04},
+	{0x37c3, 0xf1},
+	{0x37d9, 0x0c},
+	{0x37da, 0x02},
+	{0x37dc, 0x02},
+	{0x37e1, 0x04},
+	{0x37e2, 0x0a},
+	{0x3800, 0x00},
+	{0x3801, 0x00},
+	{0x3802, 0x00},
+	{0x3803, 0x08},
+	{0x3804, 0x10},
+	{0x3805, 0x8f},
+	{0x3806, 0x0c},
+	{0x3807, 0x47},
+	{0x3808, 0x10},
+	{0x3809, 0x70},
+	{0x380a, 0x0c},
+	{0x380b, 0x30},
+	{0x380c, 0x04},
+	{0x380d, 0x98},
+	{0x380e, 0x0c},
+	{0x380f, 0x7c},
+	{0x3811, 0x0f},
+	{0x3813, 0x08},
+	{0x3814, 0x01},
+	{0x3815, 0x01},
+	{0x3816, 0x01},
+	{0x3817, 0x01},
+	{0x381f, 0x08},
+	{0x3820, 0x88},
+	{0x3821, 0x00},
+	{0x382e, 0xe6},
+	{0x3c80, 0x00},
+	{0x3c87, 0x01},
+	{0x3c8c, 0x19},
+	{0x3c8d, 0x1c},
+	{0x3ca0, 0x00},
+	{0x3ca1, 0x00},
+	{0x3ca2, 0x00},
+	{0x3ca3, 0x00},
+	{0x3ca4, 0x50},
+	{0x3ca5, 0x11},
+	{0x3ca6, 0x01},
+	{0x3ca7, 0x00},
+	{0x3ca8, 0x00},
+	{0x4008, 0x02},
+	{0x4009, 0x0f},
+	{0x400a, 0x01},
+	{0x400b, 0x19},
+	{0x4019, 0x04},
+	{0x401a, 0x58},
+	{0x4032, 0x1e},
+	{0x4050, 0x02},
+	{0x4051, 0x09},
+	{0x405e, 0x00},
+	{0x4066, 0x02},
+	{0x4501, 0x00},
+	{0x4502, 0x04},
+	{0x4505, 0x00},
+	{0x4800, 0x64},
+	{0x481b, 0x3e},
+	{0x481f, 0x30},
+	{0x4825, 0x34},
+	{0x4837, 0x0e},
+	{0x484b, 0x01},
+	{0x4883, 0x02},
+	{0x5000, 0xff},
+	{0x5001, 0x0f},
+	{0x5045, 0x20},
+	{0x5046, 0x20},
+	{0x5047, 0xa4},
+	{0x5048, 0x20},
+	{0x5049, 0xa4},
+	{0x380c, 0x04},
+	{0x380d, 0x90},
+	{0x3508, 0x01},
+	{0x3509, 0x00},
+	{0x0305, 0x32},
+	{0x4837, 0x14},
+	{REG_NULL, 0x00},
+};
+
+/*
+ * Xclk 24Mhz
+ */
+static const struct regval ov13b10_global_regs_r2a[] = {
+	{0x0103, 0x01},
+	{0x0303, 0x01},
+	{0x0305, 0x46},
+	{0x0321, 0x00},
+	{0x0323, 0x04},
+	{0x0324, 0x01},
+	{0x0325, 0x50},
+	{0x0326, 0x81},
+	{0x0327, 0x04},
+	{0x3012, 0x07},
+	{0x3013, 0x32},
+	{0x3107, 0x23},
+	{0x3501, 0x0c},
+	{0x3502, 0x10},
+	{0x3504, 0x08},
+	{0x3508, 0x07},
+	{0x3509, 0xf0},
+	{0x3600, 0x16},
+	{0x3601, 0x54},
+	{0x3612, 0x4e},
+	{0x3620, 0x00},
+	{0x3621, 0x68},
+	{0x3622, 0x66},
+	{0x3623, 0x03},
+	{0x3662, 0x92},
+	{0x3666, 0xbb},
+	{0x3667, 0x44},
+	{0x366e, 0xff},
+	{0x366f, 0xf3},
+	{0x3675, 0x44},
+	{0x3676, 0x00},
+	{0x367f, 0xe9},
+	{0x3681, 0x1f},
+	{0x3682, 0x1f},
+	{0x3683, 0x0b},
+	{0x3684, 0x0b},
+	{0x3704, 0x0f},
+	{0x3706, 0x40},
+	{0x3708, 0x3b},
+	{0x3709, 0x72},
+	{0x370b, 0xa2},
+	{0x3714, 0x24},
+	{0x371a, 0x3e},
+	{0x3725, 0x42},
+	{0x3739, 0x12},
+	{0x3767, 0x00},
+	{0x377a, 0x0d},
+	{0x3789, 0x18},
+	{0x3790, 0x40},
+	{0x3791, 0xa2},
+	{0x37c2, 0x04},
+	{0x37c3, 0xf1},
+	{0x37d9, 0x0c},
+	{0x37da, 0x02},
+	{0x37dc, 0x02},
+	{0x37e1, 0x04},
+	{0x37e2, 0x0a},
+	{0x3800, 0x00},
+	{0x3801, 0x00},
+	{0x3802, 0x00},
+	{0x3803, 0x08},
+	{0x3804, 0x10},
+	{0x3805, 0x8f},
+	{0x3806, 0x0c},
+	{0x3807, 0x47},
+	{0x3808, 0x10},
+	{0x3809, 0x70},
+	{0x380a, 0x0c},
+	{0x380b, 0x30},
+	{0x380c, 0x04},
+	{0x380d, 0x98},
+	{0x380e, 0x0c},
+	{0x380f, 0x7c},
+	{0x3811, 0x0f},
+	{0x3813, 0x08},
+	{0x3814, 0x01},
+	{0x3815, 0x01},
+	{0x3816, 0x01},
+	{0x3817, 0x01},
+	{0x381f, 0x08},
+	{0x3820, 0x88},
+	{0x3821, 0x00},
+	{0x382e, 0xe6},
+	{0x3c80, 0x00},
+	{0x3c87, 0x01},
+	{0x3c8c, 0x19},
+	{0x3c8d, 0x1c},
+	{0x3ca0, 0x00},
+	{0x3ca1, 0x00},
+	{0x3ca2, 0x00},
+	{0x3ca3, 0x00},
+	{0x3ca4, 0x50},
+	{0x3ca5, 0x11},
+	{0x3ca6, 0x01},
+	{0x3ca7, 0x00},
+	{0x3ca8, 0x00},
+	{0x4008, 0x02},
+	{0x4009, 0x0f},
+	{0x400a, 0x01},
+	{0x400b, 0x19},
+	{0x4019, 0x04},
+	{0x401a, 0x58},
+	{0x4032, 0x1e},
+	{0x4050, 0x02},
+	{0x4051, 0x09},
+	{0x405e, 0x00},
+	{0x4066, 0x02},
+	{0x4501, 0x00},
+	{0x4502, 0x04},
+	{0x4505, 0x00},
+	{0x4800, 0x64},
+	{0x481b, 0x3e},
+	{0x481f, 0x30},
+	{0x4825, 0x34},
+	{0x4837, 0x0e},
+	{0x484b, 0x01},
+	{0x4883, 0x02},
+	{0x5000, 0xff},
+	{0x5001, 0x0f},
+	{0x5045, 0x20},
+	{0x5046, 0x20},
+	{0x5047, 0xa4},
+	{0x5048, 0x20},
+	{0x5049, 0xa4},
+	{0x380c, 0x04},
+	{0x380d, 0x90},
+	{0x3508, 0x01},
+	{0x3509, 0x00},
+	{0x0305, 0x32},
+	{0x4837, 0x14},
+	{REG_NULL, 0x00},
+};
+
+/*
+ * Xclk 24Mhz
+ * max_framerate 30fps
+ * mipi_datarate per lane 600Mbps
+ */
+static const struct regval ov13b10_4208x3120_regs[] = {
+	{0x0103, 0x01},
+	{0x0303, 0x01},
+	{0x0305, 0x46},
+	{0x0321, 0x00},
+	{0x0323, 0x04},
+	{0x0324, 0x01},
+	{0x0325, 0x50},
+	{0x0326, 0x81},
+	{0x0327, 0x04},
+	{0x3012, 0x07},
+	{0x3013, 0x32},
+	{0x3107, 0x23},
+	{0x3501, 0x0c},
+	{0x3502, 0x10},
+	{0x3504, 0x08},
+	{0x3508, 0x07},
+	{0x3509, 0xc0},
+	{0x3600, 0x16},
+	{0x3601, 0x54},
+	{0x3612, 0x4e},
+	{0x3620, 0x00},
+	{0x3621, 0x68},
+	{0x3622, 0x66},
+	{0x3623, 0x03},
+	{0x3662, 0x92},
+	{0x3666, 0xbb},
+	{0x3667, 0x44},
+	{0x366e, 0xff},
+	{0x366f, 0xf3},
+	{0x3675, 0x44},
+	{0x3676, 0x00},
+	{0x367f, 0xe9},
+	{0x3681, 0x32},
+	{0x3682, 0x1f},
+	{0x3683, 0x0b},
+	{0x3684, 0x0b},
+	{0x3704, 0x0f},
+	{0x3706, 0x40},
+	{0x3708, 0x3b},
+	{0x3709, 0x72},
+	{0x370b, 0xa2},
+	{0x3714, 0x24},
+	{0x371a, 0x3e},
+	{0x3725, 0x42},
+	{0x3739, 0x12},
+	{0x3767, 0x00},
+	{0x377a, 0x0d},
+	{0x3789, 0x18},
+	{0x3790, 0x40},
+	{0x3791, 0xa2},
+	{0x37c2, 0x04},
+	{0x37c3, 0xf1},
+	{0x37d9, 0x0c},
+	{0x37da, 0x02},
+	{0x37dc, 0x02},
+	{0x37e1, 0x04},
+	{0x37e2, 0x0a},
+	{0x3800, 0x00},
+	{0x3801, 0x00},
+	{0x3802, 0x00},
+	{0x3803, 0x08},
+	{0x3804, 0x10},
+	{0x3805, 0x8f},
+	{0x3806, 0x0c},
+	{0x3807, 0x47},
+	{0x3808, 0x10},
+	{0x3809, 0x70},
+	{0x380a, 0x0c},
+	{0x380b, 0x30},
+	{0x380c, 0x04},
+	{0x380d, 0x98},
+	{0x380e, 0x0c},
+	{0x380f, 0x7c},
+	{0x3811, 0x0f},
+	{0x3813, 0x08},
+	{0x3814, 0x01},
+	{0x3815, 0x01},
+	{0x3816, 0x01},
+	{0x3817, 0x01},
+	{0x381f, 0x08},
+	{0x3820, 0x88},
+	{0x3821, 0x00},
+	{0x3822, 0x14},
+	{0x382e, 0xe6},
+	{0x3c80, 0x00},
+	{0x3c87, 0x01},
+	{0x3c8c, 0x19},
+	{0x3c8d, 0x1c},
+	{0x3ca0, 0x00},
+	{0x3ca1, 0x00},
+	{0x3ca2, 0x00},
+	{0x3ca3, 0x00},
+	{0x3ca4, 0x50},
+	{0x3ca5, 0x11},
+	{0x3ca6, 0x01},
+	{0x3ca7, 0x00},
+	{0x3ca8, 0x00},
+	{0x4008, 0x02},
+	{0x4009, 0x0f},
+	{0x400a, 0x01},
+	{0x400b, 0x19},
+	{0x4011, 0x21},
+	{0x4017, 0x08},
+	{0x4019, 0x04},
+	{0x401a, 0x58},
+	{0x4032, 0x1e},
+	{0x4050, 0x02},
+	{0x4051, 0x09},
+	{0x405e, 0x00},
+	{0x4066, 0x02},
+	{0x4501, 0x00},
+	{0x4502, 0x10},
+	{0x4505, 0x00},
+	{0x4800, 0x64},
+	{0x481b, 0x3e},
+	{0x481f, 0x30},
+	{0x4825, 0x34},
+	{0x4837, 0x0e},
+	{0x484b, 0x01},
+	{0x4883, 0x02},
+	{0x5000, 0xff},
+	{0x5001, 0x0f},
+	{0x5045, 0x20},
+	{0x5046, 0x20},
+	{0x5047, 0xa4},
+	{0x5048, 0x20},
+	{0x5049, 0xa4},
+	{REG_NULL, 0x00},
+};
+
+
+static const struct ov13b10_mode supported_modes[] = {
+{
+		.width = 4208,
+		.height = 3120,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x0200,
+		.hts_def = 0x0498 * 4,
+		.vts_def = 0x0c7c,
+		.reg_list = ov13b10_4208x3120_regs,
+		.hdr_mode = NO_HDR,
+		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0,
+	},
+};
+
+static const s64 link_freq_menu_items[] = {
+	OV13B10_LINK_FREQ_1120MHZ,
+};
+
+static const char * const ov13b10_test_pattern_menu[] = {
+	"Disabled",
+	"Vertical Color Bar Type 1",
+	"Vertical Color Bar Type 2",
+	"Vertical Color Bar Type 3",
+	"Vertical Color Bar Type 4"
+};
+
+/* Write registers up to 4 at a time */
+static int ov13b10_write_reg(struct i2c_client *client, u16 reg,
+			     u32 len, u32 val)
+{
+	u32 buf_i = 0;
+	u32 val_i = 0;
+	u8 buf[6];
+	u8 *val_p = NULL;
+	__be32 val_be = 0;
+
+	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 ov13b10_write_array(struct i2c_client *client,
+			       const struct regval *regs)
+{
+	u32 i = 0;
+	int ret = 0;
+
+	for (i = 0; ret == 0 && regs[i].addr != REG_NULL; i++)
+		ret = ov13b10_write_reg(client, regs[i].addr,
+					OV13B10_REG_VALUE_08BIT,
+					regs[i].val);
+
+	return ret;
+}
+
+/* Read registers up to 4 at a time */
+static int ov13b10_read_reg(struct i2c_client *client, u16 reg,
+			    unsigned int len, u32 *val)
+{
+	struct i2c_msg msgs[2];
+	u8 *data_be_p = NULL;
+	__be32 data_be = 0;
+	__be16 reg_addr_be = cpu_to_be16(reg);
+	int ret = 0;
+
+	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 *)&reg_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 ov13b10_get_reso_dist(const struct ov13b10_mode *mode,
+				 struct v4l2_mbus_framefmt *framefmt)
+{
+	return abs(mode->width - framefmt->width) +
+	       abs(mode->height - framefmt->height);
+}
+
+static const struct ov13b10_mode *
+ov13b10_find_best_fit(struct ov13b10 *ov13b10, struct v4l2_subdev_format *fmt)
+{
+	struct v4l2_mbus_framefmt *framefmt = &fmt->format;
+	int dist = 0;
+	int cur_best_fit = 0;
+	int cur_best_fit_dist = -1;
+	unsigned int i = 0;
+
+	for (i = 0; i < ov13b10->cfg_num; i++) {
+		dist = ov13b10_get_reso_dist(&supported_modes[i], framefmt);
+		if (cur_best_fit_dist == -1 || dist < cur_best_fit_dist) {
+			cur_best_fit_dist = dist;
+			cur_best_fit = i;
+		}
+	}
+
+	return &supported_modes[cur_best_fit];
+}
+
+static int ov13b10_set_fmt(struct v4l2_subdev *sd,
+			   struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct ov13b10 *ov13b10 = to_ov13b10(sd);
+	const struct ov13b10_mode *mode;
+	s64 h_blank, vblank_def = 0;
+
+	mutex_lock(&ov13b10->mutex);
+
+	mode = ov13b10_find_best_fit(ov13b10, fmt);
+	fmt->format.code = MEDIA_BUS_FMT_SBGGR10_1X10;
+	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(&ov13b10->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		ov13b10->cur_mode = mode;
+		h_blank = mode->hts_def - mode->width;
+		__v4l2_ctrl_modify_range(ov13b10->hblank, h_blank,
+					 h_blank, 1, h_blank);
+		vblank_def = mode->vts_def - mode->height;
+		__v4l2_ctrl_modify_range(ov13b10->vblank, vblank_def,
+					 OV13B10_VTS_MAX - mode->height,
+					 1, vblank_def);
+	}
+
+	mutex_unlock(&ov13b10->mutex);
+
+	return 0;
+}
+
+static int ov13b10_get_fmt(struct v4l2_subdev *sd,
+			   struct v4l2_subdev_pad_config *cfg,
+			   struct v4l2_subdev_format *fmt)
+{
+	struct ov13b10 *ov13b10 = to_ov13b10(sd);
+	const struct ov13b10_mode *mode = ov13b10->cur_mode;
+
+	mutex_lock(&ov13b10->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(&ov13b10->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		fmt->format.width = mode->width;
+		fmt->format.height = mode->height;
+		fmt->format.code = MEDIA_BUS_FMT_SBGGR10_1X10;
+		fmt->format.field = V4L2_FIELD_NONE;
+	}
+	mutex_unlock(&ov13b10->mutex);
+
+	return 0;
+}
+
+static int ov13b10_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 = MEDIA_BUS_FMT_SBGGR10_1X10;
+
+	return 0;
+}
+
+static int ov13b10_enum_frame_sizes(struct v4l2_subdev *sd,
+				    struct v4l2_subdev_pad_config *cfg,
+				   struct v4l2_subdev_frame_size_enum *fse)
+{
+	struct ov13b10 *ov13b10 = to_ov13b10(sd);
+
+	if (fse->index >= ov13b10->cfg_num)
+		return -EINVAL;
+
+	if (fse->code != MEDIA_BUS_FMT_SBGGR10_1X10)
+		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;
+
+	return 0;
+}
+
+static int ov13b10_enable_test_pattern(struct ov13b10 *ov13b10, u32 pattern)
+{
+	u32 val = 0;
+
+	if (pattern)
+		val = (pattern - 1) | OV13B10_TEST_PATTERN_ENABLE;
+	else
+		val = OV13B10_TEST_PATTERN_DISABLE;
+
+	return ov13b10_write_reg(ov13b10->client,
+				 OV13B10_REG_TEST_PATTERN,
+				 OV13B10_REG_VALUE_08BIT,
+				 val);
+}
+
+static int ov13b10_g_frame_interval(struct v4l2_subdev *sd,
+				    struct v4l2_subdev_frame_interval *fi)
+{
+	struct ov13b10 *ov13b10 = to_ov13b10(sd);
+	const struct ov13b10_mode *mode = ov13b10->cur_mode;
+
+	mutex_lock(&ov13b10->mutex);
+	fi->interval = mode->max_fps;
+	mutex_unlock(&ov13b10->mutex);
+
+	return 0;
+}
+
+static void ov13b10_get_otp(struct otp_info *otp,
+			       struct rkmodule_inf *inf)
+{
+	u32 i;
+
+	if (otp->total_checksum) {
+		/* awb */
+		if (otp->awb_data.flag) {
+			inf->awb.flag = 1;
+			inf->awb.r_value = otp->awb_data.r_ratio;
+			inf->awb.b_value = otp->awb_data.b_ratio;
+			inf->awb.gr_value = otp->awb_data.g_ratio;
+			inf->awb.gb_value = 0x0;
+
+			inf->awb.golden_r_value = otp->awb_data.r_golden;
+			inf->awb.golden_b_value = otp->awb_data.b_golden;
+			inf->awb.golden_gr_value = otp->awb_data.g_golden;
+			inf->awb.golden_gb_value = 0x0;
+		}
+
+		/* lsc */
+		if (otp->lsc_data.flag) {
+			inf->lsc.flag = 1;
+			inf->lsc.width = otp->basic_data.size.width;
+			inf->lsc.height = otp->basic_data.size.height;
+			inf->lsc.table_size = otp->lsc_data.table_size;
+
+			for (i = 0; i < 289; i++) {
+				inf->lsc.lsc_r[i] = (otp->lsc_data.data[i * 2] << 8) |
+						     otp->lsc_data.data[i * 2 + 1];
+				inf->lsc.lsc_gr[i] = (otp->lsc_data.data[i * 2 + 578] << 8) |
+						      otp->lsc_data.data[i * 2 + 579];
+				inf->lsc.lsc_gb[i] = (otp->lsc_data.data[i * 2 + 1156] << 8) |
+						      otp->lsc_data.data[i * 2 + 1157];
+				inf->lsc.lsc_b[i] = (otp->lsc_data.data[i * 2 + 1734] << 8) |
+						     otp->lsc_data.data[i * 2 + 1735];
+			}
+		}
+	}
+}
+
+static int ov13b10_g_mbus_config(struct v4l2_subdev *sd,
+				struct v4l2_mbus_config *config)
+{
+	struct ov13b10 *ov13b10 = to_ov13b10(sd);
+	const struct ov13b10_mode *mode = ov13b10->cur_mode;
+	u32 val = 0;
+
+	if (mode->hdr_mode == NO_HDR)
+		val = 1 << (OV13B10_LANES - 1) |
+		V4L2_MBUS_CSI2_CHANNEL_0 |
+		V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
+	if (mode->hdr_mode == HDR_X2)
+		val = 1 << (OV13B10_LANES - 1) |
+		V4L2_MBUS_CSI2_CHANNEL_0 |
+		V4L2_MBUS_CSI2_CONTINUOUS_CLOCK |
+		V4L2_MBUS_CSI2_CHANNEL_1;
+
+	config->type = V4L2_MBUS_CSI2;
+	config->flags = val;
+
+	return 0;
+}
+
+static void ov13b10_get_module_inf(struct ov13b10 *ov13b10,
+				   struct rkmodule_inf *inf)
+{
+	struct otp_info *otp = ov13b10->otp;
+
+	memset(inf, 0, sizeof(*inf));
+	strscpy(inf->base.sensor, OV13B10_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, ov13b10->module_name,
+		sizeof(inf->base.module));
+	strscpy(inf->base.lens, ov13b10->len_name, sizeof(inf->base.lens));
+	if (otp)
+		ov13b10_get_otp(otp, inf);
+}
+
+static long ov13b10_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	struct ov13b10 *ov13b10 = to_ov13b10(sd);
+	struct rkmodule_hdr_cfg *hdr;
+	long ret = 0;
+	u32 stream = 0;
+	u32 i = 0;
+	u32 h = 0;
+	u32 w = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		ov13b10_get_module_inf(ov13b10, (struct rkmodule_inf *)arg);
+		break;
+	case RKMODULE_GET_HDR_CFG:
+		hdr = (struct rkmodule_hdr_cfg *)arg;
+		hdr->esp.mode = HDR_NORMAL_VC;
+		hdr->hdr_mode = ov13b10->cur_mode->hdr_mode;
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr = (struct rkmodule_hdr_cfg *)arg;
+		w = ov13b10->cur_mode->width;
+		h = ov13b10->cur_mode->height;
+		for (i = 0; i < ov13b10->cfg_num; i++) {
+			if (w == supported_modes[i].width &&
+			    h == supported_modes[i].height &&
+			    supported_modes[i].hdr_mode == hdr->hdr_mode) {
+				ov13b10->cur_mode = &supported_modes[i];
+				break;
+			}
+		}
+		if (i == ov13b10->cfg_num) {
+			dev_err(&ov13b10->client->dev,
+				"not find hdr mode:%d %dx%d config\n",
+				hdr->hdr_mode, w, h);
+			ret = -EINVAL;
+		} else {
+			w = ov13b10->cur_mode->hts_def -
+			    ov13b10->cur_mode->width;
+			h = ov13b10->cur_mode->vts_def -
+			    ov13b10->cur_mode->height;
+			__v4l2_ctrl_modify_range(ov13b10->hblank, w, w, 1, w);
+			__v4l2_ctrl_modify_range(ov13b10->vblank, h,
+						 OV13B10_VTS_MAX -
+						 ov13b10->cur_mode->height,
+						 1, h);
+		}
+		break;
+	case PREISP_CMD_SET_HDRAE_EXP:
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		stream = *((u32 *)arg);
+		if (stream)
+			ret = ov13b10_write_reg(ov13b10->client,
+				 OV13B10_REG_CTRL_MODE,
+				 OV13B10_REG_VALUE_08BIT,
+				 OV13B10_MODE_STREAMING);
+		else
+			ret = ov13b10_write_reg(ov13b10->client,
+				 OV13B10_REG_CTRL_MODE,
+				 OV13B10_REG_VALUE_08BIT,
+				 OV13B10_MODE_SW_STANDBY);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+
+#ifdef CONFIG_COMPAT
+static long ov13b10_compat_ioctl32(struct v4l2_subdev *sd,
+				   unsigned int cmd, unsigned long arg)
+{
+	void __user *up = compat_ptr(arg);
+	struct rkmodule_inf *inf = NULL;
+	struct rkmodule_awb_cfg *cfg = NULL;
+	struct rkmodule_hdr_cfg *hdr;
+	struct preisp_hdrae_exp_s *hdrae;
+	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 = ov13b10_ioctl(sd, cmd, inf);
+		if (!ret) {
+			ret = copy_to_user(up, inf, sizeof(*inf));
+			if (ret) {
+				kfree(inf);
+				return -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) {
+			kfree(cfg);
+			return -EFAULT;
+		}
+		ret = ov13b10_ioctl(sd, cmd, cfg);
+		kfree(cfg);
+		break;
+	case RKMODULE_GET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = ov13b10_ioctl(sd, cmd, hdr);
+		if (!ret) {
+			ret = copy_to_user(up, hdr, sizeof(*hdr));
+			if (ret) {
+				kfree(hdr);
+				return -EFAULT;
+			}
+		}
+		kfree(hdr);
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = copy_from_user(hdr, up, sizeof(*hdr));
+		if (ret) {
+			kfree(hdr);
+			return -EFAULT;
+		}
+		ret = ov13b10_ioctl(sd, cmd, hdr);
+		kfree(hdr);
+		break;
+	case PREISP_CMD_SET_HDRAE_EXP:
+		hdrae = kzalloc(sizeof(*hdrae), GFP_KERNEL);
+		if (!hdrae) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = copy_from_user(hdrae, up, sizeof(*hdrae));
+		if (ret) {
+			kfree(hdrae);
+			return -EFAULT;
+		}
+		ret = ov13b10_ioctl(sd, cmd, hdrae);
+		kfree(hdrae);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		ret = copy_from_user(&stream, up, sizeof(u32));
+		if (ret)
+			return -EFAULT;
+		ret = ov13b10_ioctl(sd, cmd, &stream);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+#endif
+
+static int __ov13b10_start_stream(struct ov13b10 *ov13b10)
+{
+	int ret = 0;
+
+	ret = ov13b10_write_array(ov13b10->client, ov13b10->cur_mode->reg_list);
+	if (ret)
+		return ret;
+
+	/* In case these controls are set before streaming */
+	ret = __v4l2_ctrl_handler_setup(&ov13b10->ctrl_handler);
+	if (ret)
+		return ret;
+
+	return ov13b10_write_reg(ov13b10->client,
+				 OV13B10_REG_CTRL_MODE,
+				 OV13B10_REG_VALUE_08BIT,
+				 OV13B10_MODE_STREAMING);
+}
+
+static int __ov13b10_stop_stream(struct ov13b10 *ov13b10)
+{
+	return ov13b10_write_reg(ov13b10->client,
+				 OV13B10_REG_CTRL_MODE,
+				 OV13B10_REG_VALUE_08BIT,
+				 OV13B10_MODE_SW_STANDBY);
+}
+
+static int ov13b10_s_stream(struct v4l2_subdev *sd, int on)
+{
+	int ret = 0;
+	struct ov13b10 *ov13b10 = to_ov13b10(sd);
+	struct i2c_client *client = ov13b10->client;
+
+	mutex_lock(&ov13b10->mutex);
+	on = !!on;
+	if (on == ov13b10->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 = __ov13b10_start_stream(ov13b10);
+		if (ret) {
+			v4l2_err(sd, "start stream failed while write regs\n");
+			pm_runtime_put(&client->dev);
+			goto unlock_and_return;
+		}
+	} else {
+		__ov13b10_stop_stream(ov13b10);
+		pm_runtime_put(&client->dev);
+	}
+
+	ov13b10->streaming = on;
+
+unlock_and_return:
+	mutex_unlock(&ov13b10->mutex);
+
+	return ret;
+}
+
+static int ov13b10_s_power(struct v4l2_subdev *sd, int on)
+{
+	int ret = 0;
+	struct ov13b10 *ov13b10 = to_ov13b10(sd);
+	struct i2c_client *client = ov13b10->client;
+
+	mutex_lock(&ov13b10->mutex);
+
+	/* If the power state is not modified - no work to do. */
+	if (ov13b10->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;
+		}
+
+		ov13b10->power_on = true;
+	} else {
+		pm_runtime_put(&client->dev);
+		ov13b10->power_on = false;
+	}
+
+unlock_and_return:
+	mutex_unlock(&ov13b10->mutex);
+
+	return ret;
+}
+
+/* Calculate the delay in us by clock rate and clock cycles */
+static inline u32 ov13b10_cal_delay(u32 cycles)
+{
+	return DIV_ROUND_UP(cycles, OV13B10_XVCLK_FREQ / 1000 / 1000);
+}
+
+static int __ov13b10_power_on(struct ov13b10 *ov13b10)
+{
+	int ret = 0;
+	u32 delay_us = 0;
+	struct device *dev = &ov13b10->client->dev;
+
+	if (!IS_ERR(ov13b10->power_gpio))
+		gpiod_set_value_cansleep(ov13b10->power_gpio, 1);
+
+	usleep_range(1000, 2000);
+
+	if (!IS_ERR_OR_NULL(ov13b10->pins_default)) {
+		ret = pinctrl_select_state(ov13b10->pinctrl,
+					   ov13b10->pins_default);
+		if (ret < 0)
+			dev_err(dev, "could not set pins\n");
+	}
+	ret = clk_set_rate(ov13b10->xvclk, OV13B10_XVCLK_FREQ);
+	if (ret < 0)
+		dev_warn(dev, "Failed to set xvclk rate (24MHz)\n");
+	if (clk_get_rate(ov13b10->xvclk) != OV13B10_XVCLK_FREQ)
+		dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n");
+	ret = clk_prepare_enable(ov13b10->xvclk);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable xvclk\n");
+		return ret;
+	}
+	if (!IS_ERR(ov13b10->reset_gpio))
+		gpiod_set_value_cansleep(ov13b10->reset_gpio, 0);
+
+	ret = regulator_bulk_enable(OV13B10_NUM_SUPPLIES, ov13b10->supplies);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable regulators\n");
+		goto disable_clk;
+	}
+
+	if (!IS_ERR(ov13b10->reset_gpio))
+		gpiod_set_value_cansleep(ov13b10->reset_gpio, 1);
+
+	usleep_range(500, 1000);
+	if (!IS_ERR(ov13b10->pwdn_gpio))
+		gpiod_set_value_cansleep(ov13b10->pwdn_gpio, 1);
+
+	/* 8192 cycles prior to first SCCB transaction */
+	delay_us = ov13b10_cal_delay(8192);
+	usleep_range(delay_us, delay_us * 2);
+
+	return 0;
+
+disable_clk:
+	clk_disable_unprepare(ov13b10->xvclk);
+
+	return ret;
+}
+
+static void __ov13b10_power_off(struct ov13b10 *ov13b10)
+{
+	int ret = 0;
+	struct device *dev = &ov13b10->client->dev;
+
+	if (!IS_ERR(ov13b10->pwdn_gpio))
+		gpiod_set_value_cansleep(ov13b10->pwdn_gpio, 0);
+	clk_disable_unprepare(ov13b10->xvclk);
+	if (!IS_ERR(ov13b10->reset_gpio))
+		gpiod_set_value_cansleep(ov13b10->reset_gpio, 0);
+
+	if (!IS_ERR_OR_NULL(ov13b10->pins_sleep)) {
+		ret = pinctrl_select_state(ov13b10->pinctrl,
+					   ov13b10->pins_sleep);
+		if (ret < 0)
+			dev_dbg(dev, "could not set pins\n");
+	}
+	if (!IS_ERR(ov13b10->power_gpio))
+		gpiod_set_value_cansleep(ov13b10->power_gpio, 0);
+
+	regulator_bulk_disable(OV13B10_NUM_SUPPLIES, ov13b10->supplies);
+}
+
+static int ov13b10_runtime_resume(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct ov13b10 *ov13b10 = to_ov13b10(sd);
+
+	return __ov13b10_power_on(ov13b10);
+}
+
+static int ov13b10_runtime_suspend(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct ov13b10 *ov13b10 = to_ov13b10(sd);
+
+	__ov13b10_power_off(ov13b10);
+
+	return 0;
+}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static int ov13b10_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
+{
+	struct ov13b10 *ov13b10 = to_ov13b10(sd);
+	struct v4l2_mbus_framefmt *try_fmt = v4l2_subdev_get_try_format(sd, fh->pad, 0);
+	const struct ov13b10_mode *def_mode = &supported_modes[0];
+
+	mutex_lock(&ov13b10->mutex);
+	/* Initialize try_fmt */
+	try_fmt->width = def_mode->width;
+	try_fmt->height = def_mode->height;
+	try_fmt->code = MEDIA_BUS_FMT_SBGGR10_1X10;
+	try_fmt->field = V4L2_FIELD_NONE;
+
+	mutex_unlock(&ov13b10->mutex);
+	/* No crop or compose */
+
+	return 0;
+}
+#endif
+
+static int ov13b10_enum_frame_interval(struct v4l2_subdev *sd,
+				       struct v4l2_subdev_pad_config *cfg,
+				       struct v4l2_subdev_frame_interval_enum *fie)
+{
+	struct ov13b10 *ov13b10 = to_ov13b10(sd);
+
+	if (fie->index >= ov13b10->cfg_num)
+		return -EINVAL;
+
+	fie->code = MEDIA_BUS_FMT_SBGGR10_1X10;
+	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;
+	return 0;
+}
+
+
+#define CROP_START(SRC, DST) (((SRC) - (DST)) / 2 / 4 * 4)
+#define DST_WIDTH 3840
+#define DST_HEIGHT 2160
+
+/*
+ * The resolution of the driver configuration needs to be exactly
+ * the same as the current output resolution of the sensor,
+ * the input width of the isp needs to be 16 aligned,
+ * the input height of the isp needs to be 8 aligned.
+ * Can be cropped to standard resolution by this function,
+ * otherwise it will crop out strange resolution according
+ * to the alignment rules.
+ */
+static int ov13b10_get_selection(struct v4l2_subdev *sd,
+				struct v4l2_subdev_pad_config *cfg,
+				struct v4l2_subdev_selection *sel)
+{
+	struct ov13b10 *ov13b10 = to_ov13b10(sd);
+
+	if (sel->target == V4L2_SEL_TGT_CROP_BOUNDS) {
+		if (ov13b10->cur_width == 4208) {
+			sel->r.left = CROP_START(ov13b10->cur_mode->width, 4208);
+			sel->r.width = 4208;
+			sel->r.top = CROP_START(ov13b10->cur_mode->height, 3120);
+			sel->r.height = 3120;
+		} else {
+			sel->r.left = CROP_START(ov13b10->cur_mode->width, DST_WIDTH);
+			sel->r.width = DST_WIDTH;
+			sel->r.top = CROP_START(ov13b10->cur_mode->height, DST_HEIGHT);
+			sel->r.height = DST_HEIGHT;
+		}
+		return 0;
+	}
+	return -EINVAL;
+}
+
+static const struct dev_pm_ops ov13b10_pm_ops = {
+	SET_RUNTIME_PM_OPS(ov13b10_runtime_suspend,
+			   ov13b10_runtime_resume, NULL)
+};
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static const struct v4l2_subdev_internal_ops ov13b10_internal_ops = {
+	.open = ov13b10_open,
+};
+#endif
+
+static const struct v4l2_subdev_core_ops ov13b10_core_ops = {
+	.s_power = ov13b10_s_power,
+	.ioctl = ov13b10_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = ov13b10_compat_ioctl32,
+#endif
+};
+
+static const struct v4l2_subdev_video_ops ov13b10_video_ops = {
+	.s_stream = ov13b10_s_stream,
+	.g_frame_interval = ov13b10_g_frame_interval,
+	.g_mbus_config = ov13b10_g_mbus_config,
+};
+
+static const struct v4l2_subdev_pad_ops ov13b10_pad_ops = {
+	.enum_mbus_code = ov13b10_enum_mbus_code,
+	.enum_frame_size = ov13b10_enum_frame_sizes,
+	.enum_frame_interval = ov13b10_enum_frame_interval,
+	.get_fmt = ov13b10_get_fmt,
+	.set_fmt = ov13b10_set_fmt,
+	.get_selection = ov13b10_get_selection, // Xin add
+};
+
+static const struct v4l2_subdev_ops ov13b10_subdev_ops = {
+	.core	= &ov13b10_core_ops,
+	.video	= &ov13b10_video_ops,
+	.pad	= &ov13b10_pad_ops,
+};
+
+static int ov13b10_set_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct ov13b10 *ov13b10 = container_of(ctrl->handler,
+					       struct ov13b10, ctrl_handler);
+	struct i2c_client *client = ov13b10->client;
+	s64 max = 0;
+	int ret = 0;
+	u32 again = 0;
+	u32 dgain = 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 = ov13b10->cur_mode->height + ctrl->val - 4;
+		__v4l2_ctrl_modify_range(ov13b10->exposure,
+					 ov13b10->exposure->minimum, max,
+					 ov13b10->exposure->step,
+					 ov13b10->exposure->default_value);
+		break;
+	}
+
+	if (pm_runtime_get(&client->dev) <= 0)
+		return 0;
+
+	switch (ctrl->id) {
+	case V4L2_CID_EXPOSURE:
+		/* 4 least significant bits of expsoure are fractional part */
+		ret = ov13b10_write_reg(ov13b10->client,
+					OV13B10_REG_EXPOSURE_H,
+					OV13B10_REG_VALUE_08BIT,
+					(ctrl->val >> 16) & 0xFF);
+		ret |= ov13b10_write_reg(ov13b10->client,
+					 OV13B10_REG_EXPOSURE_M,
+					 OV13B10_REG_VALUE_08BIT,
+					 (ctrl->val >> 8) & 0xFF);
+		ret |= ov13b10_write_reg(ov13b10->client,
+					 OV13B10_REG_EXPOSURE_L,
+					 OV13B10_REG_VALUE_08BIT,
+					 ctrl->val & 0xFF);
+		break;
+	case V4L2_CID_ANALOGUE_GAIN:
+		if (ctrl->val > 0xF80) {
+			again = 0xF80;
+			dgain = ctrl->val - 0xF80;
+			if (dgain < 0x400)
+				dgain = 0x400;           //1024,1x dgain
+			else if (dgain > 0xFFF)
+				dgain = 0xFFF;           //max dgain=3.999x
+		} else {
+			dgain = 1024;
+			if (ctrl->val < 0x100)
+				again = 0x100;
+			else
+				again = ctrl->val;
+		}
+
+		ret = ov13b10_write_reg(ov13b10->client,
+					OV13B10_REG_GAIN_H,
+					OV13B10_REG_VALUE_08BIT,
+					(again >> OV13B10_GAIN_H_SHIFT) &
+					OV13B10_GAIN_H_MASK);
+		ret |= ov13b10_write_reg(ov13b10->client,
+					 OV13B10_REG_GAIN_L,
+					 OV13B10_REG_VALUE_08BIT,
+					 again & OV13B10_GAIN_L_MASK);
+		ret |= ov13b10_write_reg(ov13b10->client,
+					 OV13B10_REG_DGAIN_H,
+					 OV13B10_REG_VALUE_08BIT,
+					 (dgain >> 10) & 0x03);
+		ret |= ov13b10_write_reg(ov13b10->client,
+					 OV13B10_REG_DGAIN_M,
+					 OV13B10_REG_VALUE_08BIT,
+					 dgain >> 2 & 0xff);
+		ret |= ov13b10_write_reg(ov13b10->client,
+					 OV13B10_REG_DGAIN_L,
+					 OV13B10_REG_VALUE_08BIT,
+					 (dgain & 0x03) << 6 & 0xC0);
+		break;
+	case V4L2_CID_VBLANK:
+		ret = ov13b10_write_reg(ov13b10->client,
+					OV13B10_REG_VTS,
+					OV13B10_REG_VALUE_16BIT,
+					ctrl->val + ov13b10->cur_mode->height);
+		break;
+	case V4L2_CID_TEST_PATTERN:
+		ret = ov13b10_enable_test_pattern(ov13b10, 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 ov13b10_ctrl_ops = {
+	.s_ctrl = ov13b10_set_ctrl,
+};
+
+static int ov13b10_initialize_controls(struct ov13b10 *ov13b10)
+{
+	const struct ov13b10_mode *mode;
+	struct v4l2_ctrl_handler *handler;
+	struct v4l2_ctrl *ctrl = NULL;
+	s64 exposure_max = 0;
+	s64 vblank_def = 0;
+	u32 h_blank = 0;
+	int ret = 0;
+
+	handler = &ov13b10->ctrl_handler;
+	mode = ov13b10->cur_mode;
+	ret = v4l2_ctrl_handler_init(handler, 8);
+	if (ret)
+		return ret;
+	handler->lock = &ov13b10->mutex;
+
+	ctrl = v4l2_ctrl_new_int_menu(handler, NULL, V4L2_CID_LINK_FREQ,
+				      0, 0, link_freq_menu_items);
+	if (ctrl)
+		ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+
+	v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE,
+			  0, OV13B10_PIXEL_RATE, 1, OV13B10_PIXEL_RATE);
+
+	h_blank = mode->hts_def - mode->width;
+	ov13b10->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
+				h_blank, h_blank, 1, h_blank);
+	if (ov13b10->hblank)
+		ov13b10->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+
+	vblank_def = mode->vts_def - mode->height;
+	ov13b10->vblank = v4l2_ctrl_new_std(handler, &ov13b10_ctrl_ops,
+				V4L2_CID_VBLANK, vblank_def,
+				OV13B10_VTS_MAX - mode->height,
+				1, vblank_def);
+
+	exposure_max = mode->vts_def - 4;
+	ov13b10->exposure = v4l2_ctrl_new_std(handler, &ov13b10_ctrl_ops,
+				V4L2_CID_EXPOSURE, OV13B10_EXPOSURE_MIN,
+				exposure_max, OV13B10_EXPOSURE_STEP,
+				mode->exp_def);
+
+	ov13b10->anal_gain = v4l2_ctrl_new_std(handler, &ov13b10_ctrl_ops,
+				V4L2_CID_ANALOGUE_GAIN, OV13B10_GAIN_MIN,
+				OV13B10_GAIN_MAX, OV13B10_GAIN_STEP,
+				OV13B10_GAIN_DEFAULT);
+
+	ov13b10->test_pattern = v4l2_ctrl_new_std_menu_items(handler,
+				&ov13b10_ctrl_ops, V4L2_CID_TEST_PATTERN,
+				ARRAY_SIZE(ov13b10_test_pattern_menu) - 1,
+				0, 0, ov13b10_test_pattern_menu);
+
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(&ov13b10->client->dev,
+			"Failed to init controls(%d)\n", ret);
+		goto err_free_handler;
+	}
+
+	ov13b10->subdev.ctrl_handler = handler;
+
+	return 0;
+
+err_free_handler:
+	v4l2_ctrl_handler_free(handler);
+
+	return ret;
+}
+
+static int ov13b10_check_sensor_id(struct ov13b10 *ov13b10,
+				   struct i2c_client *client)
+{
+	struct device *dev = &ov13b10->client->dev;
+	u32 id = 0;
+	int ret = 0;
+
+	ret = ov13b10_read_reg(client, OV13B10_REG_CHIP_ID,
+			       OV13B10_REG_VALUE_16BIT, &id);
+	if (id != CHIP_ID) {
+		dev_err(dev, "Unexpected sensor id(%06x), ret(%d)\n", id, ret);
+		return -ENODEV;
+	}
+
+	ret = ov13b10_read_reg(client, OV13B10_CHIP_REVISION_REG,
+			       OV13B10_REG_VALUE_08BIT, &id);
+	if (ret) {
+		dev_err(dev, "Read chip revision register error\n");
+		return ret;
+	}
+
+	if (id == OV13B10_R2A)
+		ov13b10_global_regs = ov13b10_global_regs_r2a;
+	else
+		ov13b10_global_regs = ov13b10_global_regs_r1a;
+	dev_info(dev, "Detected OV%06x sensor, REVISION 0x%x\n", CHIP_ID, id);
+
+	return 0;
+}
+
+static int ov13b10_configure_regulators(struct ov13b10 *ov13b10)
+{
+	unsigned int i = 0;
+
+	for (i = 0; i < OV13B10_NUM_SUPPLIES; i++)
+		ov13b10->supplies[i].supply = ov13b10_supply_names[i];
+
+	return devm_regulator_bulk_get(&ov13b10->client->dev,
+				       OV13B10_NUM_SUPPLIES,
+				       ov13b10->supplies);
+}
+
+static int ov13b10_probe(struct i2c_client *client,
+			 const struct i2c_device_id *id)
+{
+		struct device *dev = &client->dev;
+	struct device_node *node = dev->of_node;
+	struct ov13b10 *ov13b10;
+	struct v4l2_subdev *sd;
+	char facing[2];
+	int ret = 0;
+	struct device_node *eeprom_ctrl_node;
+	struct i2c_client *eeprom_ctrl_client;
+	struct v4l2_subdev *eeprom_ctrl;
+	struct otp_info *otp_ptr;
+	u32 i, hdr_mode = 0;
+
+	dev_info(dev, "driver version: %02x.%02x.%02x",
+		DRIVER_VERSION >> 16,
+		(DRIVER_VERSION & 0xff00) >> 8,
+		DRIVER_VERSION & 0x00ff);
+
+	ov13b10 = devm_kzalloc(dev, sizeof(*ov13b10), GFP_KERNEL);
+	if (!ov13b10)
+		return -ENOMEM;
+
+
+	ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
+				   &ov13b10->module_index);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
+				       &ov13b10->module_facing);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME,
+				       &ov13b10->module_name);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME,
+				       &ov13b10->len_name);
+	if (ret) {
+		dev_err(dev, "could not get module information!\n");
+		return -EINVAL;
+	}
+
+	ret = of_property_read_u32(node, OF_CAMERA_HDR_MODE, &hdr_mode);
+	if (ret) {
+		hdr_mode = NO_HDR;
+		dev_warn(dev, " Get hdr mode failed! no hdr default\n");
+	}
+	ov13b10->client = client;
+	ov13b10->cfg_num = ARRAY_SIZE(supported_modes);
+	for (i = 0; i < ov13b10->cfg_num; i++) {
+		if (hdr_mode == supported_modes[i].hdr_mode) {
+			ov13b10->cur_mode = &supported_modes[i];
+			break;
+		}
+	}
+	if (i == ov13b10->cfg_num)
+		ov13b10->cur_mode = &supported_modes[0];
+	ov13b10->cur_width = DST_WIDTH;
+
+	ov13b10->xvclk = devm_clk_get(dev, "xvclk");
+	if (IS_ERR(ov13b10->xvclk)) {
+		dev_err(dev, "Failed to get xvclk\n");
+		return -EINVAL;
+	}
+
+	ov13b10->power_gpio = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW);
+	if (IS_ERR(ov13b10->power_gpio))
+		dev_warn(dev, "Failed to get power-gpios, maybe no use\n");
+
+	ov13b10->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+	if (IS_ERR(ov13b10->reset_gpio))
+		dev_warn(dev, "Failed to get reset-gpios\n");
+
+	ov13b10->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW);
+	if (IS_ERR(ov13b10->pwdn_gpio))
+		dev_warn(dev, "Failed to get pwdn-gpios\n");
+
+	ret = ov13b10_configure_regulators(ov13b10);
+	if (ret) {
+		dev_err(dev, "Failed to get power regulators\n");
+		return ret;
+	}
+
+	ov13b10->pinctrl = devm_pinctrl_get(dev);
+	if (!IS_ERR(ov13b10->pinctrl)) {
+		ov13b10->pins_default =
+			pinctrl_lookup_state(ov13b10->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_DEFAULT);
+		if (IS_ERR(ov13b10->pins_default))
+			dev_err(dev, "could not get default pinstate\n");
+
+		ov13b10->pins_sleep =
+			pinctrl_lookup_state(ov13b10->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_SLEEP);
+		if (IS_ERR(ov13b10->pins_sleep))
+			dev_err(dev, "could not get sleep pinstate\n");
+	}
+
+	mutex_init(&ov13b10->mutex);
+
+	sd = &ov13b10->subdev;
+	v4l2_i2c_subdev_init(sd, client, &ov13b10_subdev_ops);
+	ret = ov13b10_initialize_controls(ov13b10);
+	if (ret)
+		goto err_destroy_mutex;
+
+	ret = __ov13b10_power_on(ov13b10);
+	if (ret)
+		goto err_free_handler;
+
+	ret = ov13b10_check_sensor_id(ov13b10, client);
+	if (ret)
+		goto err_power_off;
+
+	eeprom_ctrl_node = of_parse_phandle(node, "eeprom-ctrl", 0);
+	if (eeprom_ctrl_node) {
+		eeprom_ctrl_client =
+			of_find_i2c_device_by_node(eeprom_ctrl_node);
+		of_node_put(eeprom_ctrl_node);
+		if (IS_ERR_OR_NULL(eeprom_ctrl_client)) {
+			dev_err(dev, "can not get node\n");
+			goto continue_probe;
+		}
+		eeprom_ctrl = i2c_get_clientdata(eeprom_ctrl_client);
+		if (IS_ERR_OR_NULL(eeprom_ctrl)) {
+			dev_err(dev, "can not get eeprom i2c client\n");
+		} else {
+			otp_ptr = devm_kzalloc(dev, sizeof(*otp_ptr), GFP_KERNEL);
+			if (!otp_ptr)
+				return -ENOMEM;
+			ret = v4l2_subdev_call(eeprom_ctrl,
+				core, ioctl, 0, otp_ptr);
+			if (!ret) {
+				ov13b10->otp = otp_ptr;
+			} else {
+				ov13b10->otp = NULL;
+				devm_kfree(dev, otp_ptr);
+			}
+		}
+	}
+
+continue_probe:
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+	sd->internal_ops = &ov13b10_internal_ops;
+	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
+#endif
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	ov13b10->pad.flags = MEDIA_PAD_FL_SOURCE;
+	sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
+	ret = media_entity_pads_init(&sd->entity, 1, &ov13b10->pad);
+	if (ret < 0)
+		goto err_power_off;
+#endif
+
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(ov13b10->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s",
+		 ov13b10->module_index, facing,
+		 OV13B10_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:
+	__ov13b10_power_off(ov13b10);
+err_free_handler:
+	v4l2_ctrl_handler_free(&ov13b10->ctrl_handler);
+err_destroy_mutex:
+	mutex_destroy(&ov13b10->mutex);
+
+	return ret;
+}
+
+static int ov13b10_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct ov13b10 *ov13b10 = to_ov13b10(sd);
+
+	v4l2_async_unregister_subdev(sd);
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	media_entity_cleanup(&sd->entity);
+#endif
+	v4l2_ctrl_handler_free(&ov13b10->ctrl_handler);
+	mutex_destroy(&ov13b10->mutex);
+
+	pm_runtime_disable(&client->dev);
+	if (!pm_runtime_status_suspended(&client->dev))
+		__ov13b10_power_off(ov13b10);
+	pm_runtime_set_suspended(&client->dev);
+
+	return 0;
+}
+
+#if IS_ENABLED(CONFIG_OF)
+static const struct of_device_id ov13b10_of_match[] = {
+	{ .compatible = "ovti,ov13b10" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, ov13b10_of_match);
+#endif
+
+static const struct i2c_device_id ov13b10_match_id[] = {
+	{ "ovti,ov13b10", 0 },
+	{ },
+};
+
+static struct i2c_driver ov13b10_i2c_driver = {
+	.driver = {
+		.name = OV13B10_NAME,
+		.pm = &ov13b10_pm_ops,
+		.of_match_table = of_match_ptr(ov13b10_of_match),
+	},
+	.probe		= &ov13b10_probe,
+	.remove		= &ov13b10_remove,
+	.id_table	= ov13b10_match_id,
+};
+
+static int __init sensor_mod_init(void)
+{
+	return i2c_add_driver(&ov13b10_i2c_driver);
+}
+
+static void __exit sensor_mod_exit(void)
+{
+	i2c_del_driver(&ov13b10_i2c_driver);
+}
+
+device_initcall_sync(sensor_mod_init);
+module_exit(sensor_mod_exit);
+
+MODULE_DESCRIPTION("OmniVision ov13b10 sensor driver");
+MODULE_LICENSE("GPL v2");

commit ce202a12c62e5f898d8b969c2c972acb9bb27fa5
Author: Zhenke Fan <fanzy.fan@rock-chips.com>
Date:   Sat Oct 9 10:38:09 2021 +0800

    media: i2c: otp_eeprom: add sensor otp eeprom driver
    
    Signed-off-by: Zhenke Fan <fanzy.fan@rock-chips.com>
    Change-Id: If08548c4613289c15947428c8468e7fb3769c60e

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index 3252c63a9ae6..efb2bc4e7973 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -395,6 +395,13 @@ config VIDEO_VM149C
 	help
 	  This is a driver for the VM149C camera lens voice coil.
 
+config VIDEO_OTP_EEPROM
+	tristate "sensor otp from eeprom support"
+	depends on VIDEO_V4L2 && I2C
+	select V4L2_FWNODE
+	help
+	  This driver supports OTP load from eeprom.
+
 config VIDEO_SAA7110
 	tristate "Philips SAA7110 video decoder"
 	depends on VIDEO_V4L2 && I2C
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index 6e62bc83461d..2d421b93d4e6 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -211,3 +211,5 @@ obj-$(CONFIG_VIDEO_HM5040)	+= hm5040.o
 obj-$(CONFIG_VIDEO_PREISP_DUMMY_SENSOR)	+= preisp-dummy.o
 
 obj-$(CONFIG_SDR_MAX2175) += max2175.o
+
+obj-$(CONFIG_VIDEO_OTP_EEPROM)	+= otp_eeprom.o
diff --git a/drivers/media/i2c/otp_eeprom.c b/drivers/media/i2c/otp_eeprom.c
new file mode 100644
index 000000000000..f9c5a319e3ca
--- /dev/null
+++ b/drivers/media/i2c/otp_eeprom.c
@@ -0,0 +1,476 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (c) 2020 Rockchip Electronics Co., Ltd.
+
+#include <linux/delay.h>
+#include <linux/i2c.h>
+#include <linux/module.h>
+#include <linux/pm_runtime.h>
+#include <linux/proc_fs.h>
+#include <linux/rk-camera-module.h>
+#include <linux/sem.h>
+#include <linux/seq_file.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include "otp_eeprom.h"
+
+#define DEVICE_NAME			"otp_eeprom"
+
+static inline struct eeprom_device
+	*sd_to_eeprom(struct v4l2_subdev *subdev)
+{
+	return container_of(subdev, struct eeprom_device, sd);
+}
+
+/* Read registers up to 4 at a time */
+static int read_reg_otp(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 *)&reg_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 u8 get_vendor_flag(struct i2c_client *client)
+{
+	u8 vendor_flag = 0;
+
+	if (client->addr == SLAVE_ADDRESS)
+		vendor_flag |= 0x80;
+	return vendor_flag;
+}
+
+static int otp_read_data(struct eeprom_device *eeprom_dev)
+{
+	struct i2c_client *client = eeprom_dev->client;
+	int i;
+	struct otp_info *otp_ptr;
+	struct device *dev = &eeprom_dev->client->dev;
+	int ret = 0;
+	u32 temp = 0;
+
+	otp_ptr = kzalloc(sizeof(*otp_ptr), GFP_KERNEL);
+	if (!otp_ptr)
+		return -ENOMEM;
+	/* OTP base information*/
+	ret = read_reg_otp(client, INFO_FLAG_REG,
+		1, &otp_ptr->basic_data.flag);
+	if (otp_ptr->basic_data.flag == 0x01) {
+		ret |= read_reg_otp(client, INFO_ID_REG,
+			1, &otp_ptr->basic_data.id.supplier_id);
+		ret |= read_reg_otp(client, INFO_ID_REG + 1,
+			1, &otp_ptr->basic_data.id.year);
+		ret |= read_reg_otp(client, INFO_ID_REG + 2,
+			1, &otp_ptr->basic_data.id.month);
+		ret |= read_reg_otp(client, INFO_ID_REG + 3,
+			1, &otp_ptr->basic_data.id.day);
+		ret |= read_reg_otp(client, INFO_ID_REG + 4,
+			1, &otp_ptr->basic_data.id.sensor_id);
+		ret |= read_reg_otp(client, INFO_ID_REG + 5,
+			1, &otp_ptr->basic_data.id.lens_id);
+		ret |= read_reg_otp(client, INFO_ID_REG + 6,
+			1, &otp_ptr->basic_data.id.vcm_id);
+		ret |= read_reg_otp(client, INFO_ID_REG + 7,
+			1, &otp_ptr->basic_data.id.driver_ic_id);
+		ret |= read_reg_otp(client, INFO_ID_REG + 8,
+			1, &otp_ptr->basic_data.id.color_temperature_id);
+		for (i = 0; i < SMARTISAN_PN_SIZE; i++) {
+			ret |= read_reg_otp(client, SMARTISAN_PN_REG + i,
+				1, &temp);
+			otp_ptr->basic_data.smartisan_pn[i] = temp;
+		}
+		for (i = 0; i < MOUDLE_ID_SIZE; i++) {
+			ret |= read_reg_otp(client, MOUDLE_ID_REG + i,
+				1, &temp);
+				otp_ptr->basic_data.modul_id[i] = temp;
+		}
+		ret |= read_reg_otp(client, MIRROR_FLIP_REG,
+			1, &otp_ptr->basic_data.mirror_flip);
+		ret |= read_reg_otp(client, FULL_SIZE_WIGHT_REG,
+			2, &temp);
+		otp_ptr->basic_data.size.width = temp;
+		ret |= read_reg_otp(client, FULL_SIZE_HEIGHT_REG,
+			2, &temp);
+		otp_ptr->basic_data.size.height = temp;
+		ret |= read_reg_otp(client, INFO_CHECKSUM_REG,
+			1, &otp_ptr->basic_data.checksum);
+
+		dev_dbg(dev, "fasic info: supplier_id(0x%x) lens(0x%x) time(%d_%d_%d)\n",
+			otp_ptr->basic_data.id.supplier_id,
+			otp_ptr->basic_data.id.lens_id,
+			otp_ptr->basic_data.id.year,
+			otp_ptr->basic_data.id.month,
+			otp_ptr->basic_data.id.day);
+		if (ret)
+			goto err;
+	}
+
+	/* OTP WB calibration data */
+	ret = read_reg_otp(client, AWB_FLAG_REG,
+		1, &otp_ptr->awb_data.flag);
+	if (otp_ptr->awb_data.flag == 0x01) {
+		ret |= read_reg_otp(client, AWB_VERSION_REG,
+			1, &otp_ptr->awb_data.version);
+		ret |= read_reg_otp(client, CUR_R_REG,
+			2, &otp_ptr->awb_data.r_ratio);
+		ret |= read_reg_otp(client, CUR_B_REG,
+			2, &otp_ptr->awb_data.b_ratio);
+		ret |= read_reg_otp(client, CUR_G_REG,
+			2, &otp_ptr->awb_data.g_ratio);
+		ret |= read_reg_otp(client, GOLDEN_R_REG,
+			2, &otp_ptr->awb_data.r_golden);
+		ret |= read_reg_otp(client, GOLDEN_B_REG,
+			2, &otp_ptr->awb_data.b_golden);
+		ret |= read_reg_otp(client, GOLDEN_G_REG,
+			2, &otp_ptr->awb_data.g_golden);
+		ret |= read_reg_otp(client, AWB_CHECKSUM_REG,
+			1, &otp_ptr->awb_data.checksum);
+
+		dev_dbg(dev, "awb version:0x%x\n",
+			otp_ptr->awb_data.version);
+		if (ret)
+			goto err;
+	}
+
+	/* OTP LSC calibration data */
+	ret = read_reg_otp(client, LSC_FLAG_REG,
+		1, &otp_ptr->lsc_data.flag);
+	if (otp_ptr->lsc_data.flag == 0x01) {
+		ret |= read_reg_otp(client, LSC_VERSION_REG,
+			1, &otp_ptr->lsc_data.version);
+		ret |= read_reg_otp(client, LSC_TABLE_SIZE_REG,
+			2, &temp);
+		otp_ptr->lsc_data.table_size = temp;
+		for (i = 0; i < LSC_DATA_SIZE; i++) {
+			ret |= read_reg_otp(client, LSC_DATA_START_REG + i,
+				1, &temp);
+			otp_ptr->lsc_data.data[i] = temp;
+		}
+		ret |= read_reg_otp(client, LSC_CHECKSUM_REG,
+			1, &otp_ptr->lsc_data.checksum);
+		dev_dbg(dev, "lsc cur:(version 0x%x, table_size 0x%x checksum 0x%x)\n",
+			otp_ptr->lsc_data.version,
+			otp_ptr->lsc_data.table_size,
+			otp_ptr->lsc_data.checksum);
+		if (ret)
+			goto err;
+	}
+
+	/* OTP sfr calibration data */
+	ret = read_reg_otp(client, LSC_FLAG_REG,
+		1, &otp_ptr->sfr_otp_data.flag);
+	if (otp_ptr->sfr_otp_data.flag == 0x01) {
+		ret |= read_reg_otp(client, SFR_EQUIQ_NUM_REG,
+			1, &otp_ptr->sfr_otp_data.equip_num);
+		ret |= read_reg_otp(client, SFR_C_HOR_REG,
+			2, &otp_ptr->sfr_otp_data.center_horizontal);
+		ret |= read_reg_otp(client, SFR_C_VER_REG,
+			2, &otp_ptr->sfr_otp_data.center_vertical);
+		for (i = 0; i < 3; i++) {
+			ret |= read_reg_otp(client, SFR_TOP_L_HOR_REG + 16 * i,
+				2, &otp_ptr->sfr_otp_data.data[i].top_l_horizontal);
+			ret |= read_reg_otp(client, SFR_TOP_L_VER_REG + 16 * i,
+				2, &otp_ptr->sfr_otp_data.data[i].top_l_vertical);
+			ret |= read_reg_otp(client, SFR_TOP_R_HOR_REG + 16 * i,
+				2, &otp_ptr->sfr_otp_data.data[i].top_r_horizontal);
+			ret |= read_reg_otp(client, SFR_TOP_R_VER_REG + 16 * i,
+				2, &otp_ptr->sfr_otp_data.data[i].top_r_vertical);
+			ret |= read_reg_otp(client, SFR_BOTTOM_L_HOR_REG + 16 * i,
+				2, &otp_ptr->sfr_otp_data.data[i].bottom_l_horizontal);
+			ret |= read_reg_otp(client, SFR_BOTTOM_L_VER_REG + 16 * i,
+				2, &otp_ptr->sfr_otp_data.data[i].bottom_l_vertical);
+			ret |= read_reg_otp(client, SFR_BOTTOM_R_HOR_REG + 16 * i,
+				2, &otp_ptr->sfr_otp_data.data[i].bottom_r_horizontal);
+			ret |= read_reg_otp(client, SFR_BOTTOM_R_VER_REG + 16 * i,
+				2, &otp_ptr->sfr_otp_data.data[i].bottom_r_vertical);
+		}
+
+		ret |= read_reg_otp(client, SFR_CHECKSUM_REG,
+			1, &otp_ptr->sfr_otp_data.checksum);
+		if (ret)
+			goto err;
+	}
+
+	ret = read_reg_otp(client, TOTAL_CHECKSUM_REG,
+		1, &otp_ptr->total_checksum);
+	if (ret)
+		goto err;
+
+	if (otp_ptr->total_checksum) {
+		eeprom_dev->otp = otp_ptr;
+	} else {
+		eeprom_dev->otp = NULL;
+		kfree(otp_ptr);
+	}
+
+	return 0;
+err:
+	eeprom_dev->otp = NULL;
+	kfree(otp_ptr);
+	return -EINVAL;
+}
+
+static int otp_read(struct eeprom_device *eeprom_dev)
+{
+	u8 vendor_flag = 0;
+	struct i2c_client *client = eeprom_dev->client;
+
+	vendor_flag = get_vendor_flag(client);
+	if (vendor_flag == 0x80)
+		otp_read_data(eeprom_dev);
+	return 0;
+}
+
+static long eeprom_ioctl(struct v4l2_subdev *sd,
+	unsigned int cmd, void *arg)
+{
+	struct eeprom_device *eeprom_dev =
+		sd_to_eeprom(sd);
+	if (!eeprom_dev->otp)
+		otp_read(eeprom_dev);
+	if (arg && eeprom_dev->otp)
+		memcpy(arg, eeprom_dev->otp,
+			sizeof(struct otp_info));
+	return 0;
+}
+
+#ifdef CONFIG_PROC_FS
+static int otp_eeprom_show(struct seq_file *p, void *v)
+{
+	struct eeprom_device *dev = p->private;
+	int i = 0;
+	int j = 0;
+
+	if (dev) {
+		seq_puts(p, "[Header]\n");
+		seq_puts(p, "version=1.0;\n\n");
+
+		seq_puts(p, "[RKAWBOTPParam]\n");
+		seq_printf(p, "flag=%d;\n", dev->otp->awb_data.flag);
+		seq_printf(p, "r_value=%d;\n", dev->otp->awb_data.r_ratio);
+		seq_printf(p, "b_value=%d;\n", dev->otp->awb_data.b_ratio);
+		seq_printf(p, "gr_value=%d;\n", dev->otp->awb_data.g_ratio);
+		seq_puts(p, "gb_value=-1;\n");
+		seq_printf(p, "golden_r_value=%d;\n", dev->otp->awb_data.r_golden);
+		seq_printf(p, "golden_b_value=%d;\n", dev->otp->awb_data.b_golden);
+		seq_printf(p, "golden_gr_value=%d;\n", dev->otp->awb_data.g_golden);
+		seq_puts(p, "golden_gb_value=-1;\n\n");
+
+		seq_puts(p, "[RKLSCOTPParam]\n");
+		seq_printf(p, "flag=%d;\n", dev->otp->lsc_data.flag);
+		seq_printf(p, "width=%d;\n", dev->otp->basic_data.size.width);
+		seq_printf(p, "height=%d;\n", dev->otp->basic_data.size.height);
+		seq_printf(p, "tablesize=%d;\n\n", dev->otp->lsc_data.table_size);
+
+		seq_puts(p, "lsc_r_table=\n");
+		for (i = 0; i < 17; i++) {
+			for (j = 0; j < 17; j++) {
+				seq_printf(p, "%d", (dev->otp->lsc_data.data[(i * 17 + j) * 2] << 8)
+					   | dev->otp->lsc_data.data[(i * 17 + j) * 2 + 1]);
+				if (j < 16)
+					seq_puts(p, " ");
+			}
+			if (i < 16)
+				seq_puts(p, "\n");
+		}
+		seq_puts(p, "\n\n");
+
+		seq_puts(p, "lsc_b_table=\n");
+		for (i = 0; i < 17; i++) {
+			for (j = 0; j < 17; j++) {
+				seq_printf(p, "%d", (dev->otp->lsc_data.data[(i * 17 + j) * 2 +
+					   1734] << 8) | dev->otp->lsc_data.data[(i * 17 + j) *
+					   2 + 1735]);
+				if (j < 16)
+					seq_puts(p, " ");
+			}
+			if (i < 16)
+				seq_puts(p, "\n");
+		}
+		seq_puts(p, "\n\n");
+
+		seq_puts(p, "lsc_gr_table=\n");
+		for (i = 0; i < 17; i++) {
+			for (j = 0; j < 17; j++) {
+				seq_printf(p, "%d", (dev->otp->lsc_data.data[(i * 17 + j) * 2 +
+					   578] << 8) | dev->otp->lsc_data.data[(i * 17 + j) *
+					   2 + 579]);
+				if (j < 16)
+					seq_puts(p, " ");
+			}
+			if (i < 16)
+				seq_puts(p, "\n");
+		}
+		seq_puts(p, "\n\n");
+
+		seq_puts(p, "lsc_gb_table=\n");
+		for (i = 0; i < 17; i++) {
+			for (j = 0; j < 17; j++) {
+				seq_printf(p, "%d", (dev->otp->lsc_data.data[(i * 17 + j) * 2 +
+					   1156] << 8) | dev->otp->lsc_data.data[(i * 17 + j) *
+					   2 + 1157]);
+				if (j < 16)
+					seq_puts(p, " ");
+			}
+			if (i < 16)
+				seq_puts(p, "\n");
+		}
+		seq_puts(p, "\n\n");
+	}
+	return 0;
+}
+
+static int eeprom_open(struct inode *inode, struct file *file)
+{
+	struct eeprom_device *data = PDE_DATA(inode);
+
+	return single_open(file, otp_eeprom_show, data);
+}
+
+static const struct file_operations ops = {
+	.owner		= THIS_MODULE,
+	.open		= eeprom_open,
+	.read		= seq_read,
+	.llseek		= seq_lseek,
+	.release	= single_release,
+};
+
+static int eeprom_proc_init(struct eeprom_device *dev)
+{
+	dev->procfs = proc_create_data(dev->name, 0, NULL, &ops, dev);
+	if (!dev->procfs)
+		return -EINVAL;
+	return 0;
+}
+
+static void eeprom_proc_cleanup(struct eeprom_device *dev)
+{
+	if (dev->procfs)
+		remove_proc_entry(dev->name, NULL);
+	dev->procfs = NULL;
+}
+
+#endif
+
+static const struct v4l2_subdev_core_ops eeprom_core_ops = {
+	.ioctl = eeprom_ioctl,
+};
+
+static const struct v4l2_subdev_ops eeprom_ops = {
+	.core = &eeprom_core_ops,
+};
+
+static void eeprom_subdev_cleanup(struct eeprom_device *dev)
+{
+	v4l2_device_unregister_subdev(&dev->sd);
+	media_entity_cleanup(&dev->sd.entity);
+}
+
+static int eeprom_probe(struct i2c_client *client,
+	const struct i2c_device_id *id)
+{
+	struct eeprom_device *eeprom_dev;
+
+	dev_info(&client->dev, "probing...\n");
+	eeprom_dev = devm_kzalloc(&client->dev,
+		sizeof(*eeprom_dev),
+		GFP_KERNEL);
+
+	if (eeprom_dev == NULL) {
+		dev_err(&client->dev, "Probe failed\n");
+		return -ENOMEM;
+	}
+	v4l2_i2c_subdev_init(&eeprom_dev->sd,
+		client, &eeprom_ops);
+	eeprom_dev->client = client;
+	sprintf(eeprom_dev->name, "%s", DEVICE_NAME);
+	eeprom_proc_init(eeprom_dev);
+	pm_runtime_set_active(&client->dev);
+	pm_runtime_enable(&client->dev);
+	pm_runtime_idle(&client->dev);
+
+	dev_info(&client->dev, "probing successful\n");
+
+	return 0;
+}
+
+static int eeprom_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct eeprom_device *eeprom_dev =
+		sd_to_eeprom(sd);
+	kfree(eeprom_dev->otp);
+	pm_runtime_disable(&client->dev);
+	eeprom_subdev_cleanup(eeprom_dev);
+	eeprom_proc_cleanup(eeprom_dev);
+
+	return 0;
+}
+
+static int __maybe_unused eeprom_suspend(struct device *dev)
+{
+	return 0;
+}
+
+static int  __maybe_unused eeprom_resume(struct device *dev)
+{
+	return 0;
+}
+
+static const struct i2c_device_id eeprom_id_table[] = {
+	{ DEVICE_NAME, 0 },
+	{ { 0 } }
+};
+MODULE_DEVICE_TABLE(i2c, eeprom_id_table);
+
+static const struct of_device_id eeprom_of_table[] = {
+	{ .compatible = "rk,otp_eeprom" },
+	{ { 0 } }
+};
+MODULE_DEVICE_TABLE(of, eeprom_of_table);
+
+static const struct dev_pm_ops eeprom_pm_ops = {
+	SET_SYSTEM_SLEEP_PM_OPS(eeprom_suspend, eeprom_resume)
+	SET_RUNTIME_PM_OPS(eeprom_suspend, eeprom_resume, NULL)
+};
+
+static struct i2c_driver eeprom_i2c_driver = {
+	.driver = {
+		.name = DEVICE_NAME,
+		.pm = &eeprom_pm_ops,
+		.of_match_table = eeprom_of_table,
+	},
+	.probe = &eeprom_probe,
+	.remove = &eeprom_remove,
+	.id_table = eeprom_id_table,
+};
+
+module_i2c_driver(eeprom_i2c_driver);
+
+MODULE_DESCRIPTION("OTP driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/media/i2c/otp_eeprom.h b/drivers/media/i2c/otp_eeprom.h
new file mode 100644
index 000000000000..077af3f94e88
--- /dev/null
+++ b/drivers/media/i2c/otp_eeprom.h
@@ -0,0 +1,137 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/* Copyright (c) 2020 Rockchip Electronics Co., Ltd. */
+
+#ifndef OTP_EEPROM_H
+#define OTP_EEPROM_H
+
+#define SLAVE_ADDRESS	0x50
+
+#define INFO_FLAG_REG	0X0000
+#define INFO_ID_REG		0X0001
+#define SMARTISAN_PN_REG	0X000A
+#define SMARTISAN_PN_SIZE	0x000C		//12
+#define MOUDLE_ID_REG	0X0016
+#define MOUDLE_ID_SIZE	0X0010		//16
+#define MIRROR_FLIP_REG	0X0026
+#define FULL_SIZE_WIGHT_REG	0X0027
+#define FULL_SIZE_HEIGHT_REG	0X0029
+#define INFO_CHECKSUM_REG	0X0033
+
+#define AWB_FLAG_REG		0x0034
+#define AWB_VERSION_REG	0x0035
+#define CUR_R_REG		0x0036
+#define CUR_B_REG		0x0038
+#define CUR_G_REG		0x003A
+#define GOLDEN_R_REG		0x003C
+#define GOLDEN_B_REG		0x003E
+#define GOLDEN_G_REG		0x0040
+#define AWB_CHECKSUM_REG	0x0062
+
+#define LSC_FLAG_REG		0X0063
+#define LSC_VERSION_REG	0x0064
+#define LSC_TABLE_SIZE_REG	0x0065
+#define LSC_DATA_START_REG	0x0067
+#define LSC_DATA_SIZE	0x0908		//2312
+#define LSC_CHECKSUM_REG	0x097B
+
+#define SFR_FLAG_REG		0X097C
+#define SFR_EQUIQ_NUM_REG	0X097D
+#define SFR_C_HOR_REG	0X097E
+#define SFR_C_VER_REG	0X0980
+#define SFR_TOP_L_HOR_REG	0X0982
+#define SFR_TOP_L_VER_REG	0X0984
+#define SFR_TOP_R_HOR_REG	0X0986
+#define SFR_TOP_R_VER_REG	0X0988
+#define SFR_BOTTOM_L_HOR_REG	0X098A
+#define SFR_BOTTOM_L_VER_REG	0X098C
+#define SFR_BOTTOM_R_HOR_REG	0X098E
+#define SFR_BOTTOM_R_VER_REG	0X0990
+#define SFR_CHECKSUM_REG	0x09BE
+
+#define TOTAL_CHECKSUM_REG	0x09BF
+
+struct id_defination {
+	u32 supplier_id;
+	u32 year;
+	u32 month;
+	u32 day;
+	u32 sensor_id;
+	u32 lens_id;
+	u32 vcm_id;
+	u32 driver_ic_id;
+	u32 color_temperature_id;
+};
+
+struct full_size {
+	u16 width;
+	u16 height;
+};
+
+struct basic_info {
+	u32 flag;
+	struct id_defination id;
+	u32 smartisan_pn[SMARTISAN_PN_SIZE];
+	u32 modul_id[MOUDLE_ID_SIZE];
+	u32 mirror_flip;
+	struct full_size size;
+	u32 checksum;
+};
+
+struct awb_otp_info {
+	u32 flag;
+	u32 version;
+	u32 r_ratio;
+	u32 b_ratio;
+	u32 g_ratio;
+	u32 r_golden;
+	u32 b_golden;
+	u32 g_golden;
+	u32 checksum;
+};
+
+struct lsc_otp_info {
+	u32 flag;
+	u32 version;
+	u16 table_size;
+	u8 data[LSC_DATA_SIZE];
+	u32 checksum;
+};
+
+struct sfr_data {
+	u32 top_l_horizontal;
+	u32 top_l_vertical;
+	u32 top_r_horizontal;
+	u32 top_r_vertical;
+	u32 bottom_l_horizontal;
+	u32 bottom_l_vertical;
+	u32 bottom_r_horizontal;
+	u32 bottom_r_vertical;
+};
+
+struct sfr_otp_info {
+	u32 flag;
+	u32 equip_num;
+	u32 center_horizontal;
+	u32 center_vertical;
+	struct sfr_data data[3];
+	u32 checksum;
+};
+
+struct otp_info {
+	struct basic_info basic_data;
+	struct awb_otp_info awb_data;
+	struct lsc_otp_info lsc_data;
+	struct sfr_otp_info sfr_otp_data;
+	u32 total_checksum;
+};
+
+/* eeprom device structure */
+struct eeprom_device {
+	struct v4l2_subdev sd;
+	struct i2c_client *client;
+	struct otp_info *otp;
+	struct proc_dir_entry *procfs;
+	char name[128];
+};
+
+#endif /* OTP_EEPROM_H */

commit ab662f9660d887627f13e5b071a9ee6cb303fc2a
Author: Elaine Zhang <zhangqing@rock-chips.com>
Date:   Mon Oct 25 15:31:07 2021 +0800

    rtc: rk630: add rtc for rk630
    
    Change-Id: I36bfe7ba7c4876d9030b065f26b1e99fefc738b9
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>

diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index 5198f41090e2..d9646ce40250 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -368,6 +368,16 @@ config RTC_DRV_MAX77686
 	  This driver can also be built as a module. If so, the module
 	  will be called rtc-max77686.
 
+config RTC_DRV_RK630
+	tristate "Rockchip RK630 RTC"
+	depends on MFD_RK630
+	help
+	  If you say yes here you will get support for the
+	  RTC of RK630.
+
+	  This driver can also be built as a module. If so, the module
+	  will be called rtc-rk630.
+
 config RTC_DRV_RK808
 	tristate "Rockchip RK805/RK808/RK809/RK816/RK817/RK818 RTC"
 	depends on MFD_RK808
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile
index a3e637dc1027..45e146abc2d6 100644
--- a/drivers/rtc/Makefile
+++ b/drivers/rtc/Makefile
@@ -131,6 +131,7 @@ obj-$(CONFIG_RTC_DRV_PXA)	+= rtc-pxa.o
 obj-$(CONFIG_RTC_DRV_R7301)	+= rtc-r7301.o
 obj-$(CONFIG_RTC_DRV_R9701)	+= rtc-r9701.o
 obj-$(CONFIG_RTC_DRV_RC5T583)	+= rtc-rc5t583.o
+obj-$(CONFIG_RTC_DRV_RK630)	+= rtc-rk630.o
 obj-$(CONFIG_RTC_DRV_RK808)	+= rtc-rk808.o
 obj-$(CONFIG_RTC_DRV_RK_TIMER)	+= rtc-rk-timer.o
 obj-$(CONFIG_RTC_DRV_RP5C01)	+= rtc-rp5c01.o
diff --git a/drivers/rtc/rtc-rk630.c b/drivers/rtc/rtc-rk630.c
new file mode 100644
index 000000000000..a18a2fe68af5
--- /dev/null
+++ b/drivers/rtc/rtc-rk630.c
@@ -0,0 +1,561 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2021 Fuzhou Rockchip Electronics Co., Ltd
+ */
+#include <linux/bcd.h>
+#include <linux/kernel.h>
+#include <linux/mfd/rk630.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/rtc.h>
+
+/* RTC_CTRL_REG bitfields */
+#define BIT_RTC_CTRL_REG_STOP_RTC_M		BIT(0)
+
+/* RK630 has a shadowed register for saving a "frozen" RTC time.
+ * When user setting "GET_TIME" to 1, the time will save in this shadowed
+ * register. If set "READSEL" to 1, user read rtc time register, actually
+ * get the time of that moment. If we need the real time, clr this bit.
+ */
+#define BIT_RTC_CTRL_REG_RTC_GET_TIME		BIT(6)
+#define BIT_RTC_CTRL_REG_RTC_READSEL_M		BIT(7)
+#define BIT_RTC_INTERRUPTS_REG_IT_ALARM_M	BIT(7)
+#define RTC_STATUS_MASK		0xFF
+
+#define SECONDS_REG_MSK				0x7F
+#define MINUTES_REG_MAK				0x7F
+#define HOURS_REG_MSK				0x3F
+#define DAYS_REG_MSK				0x3F
+#define MONTHS_REG_MSK				0x1F
+#define YEARS_REG_MSK				0xFF
+#define WEEKS_REG_MSK				0x7
+
+/* REG_SECONDS_REG through REG_YEARS_REG is how many registers? */
+
+#define NUM_TIME_REGS				8
+#define NUM_ALARM_REGS				7
+
+#define ENABLE_ALARM_INT			0xBF
+#define ALARM_INT_STATUS			BIT(4)
+
+#define CLK32K_TEST_EN				BIT(0)
+#define CLK32K_TEST_START			BIT(0)
+#define CLK32K_TEST_STATUS			BIT(1)
+#define CLK32K_TEST_DONE			BIT(2)
+
+/* Units are seconds */
+#define CLK32K_TEST_LEN				10
+
+#define CLK32K_COMP_DIR_ADD			BIT(7)
+#define CLK32K_COMP_EN				BIT(2)
+#define CLK32K_NO_COMP				0x1
+
+struct rk630_rtc {
+	struct rk630 *rk630;
+	struct rtc_device *rtc;
+	int irq;
+	unsigned int flag;
+};
+
+/* Read current time and date in RTC */
+static int rk630_rtc_readtime(struct device *dev, struct rtc_time *tm)
+{
+	struct rk630_rtc *rk630_rtc = dev_get_drvdata(dev);
+	struct rk630 *rk630 = rk630_rtc->rk630;
+	u8 rtc_data[NUM_TIME_REGS];
+	int ret;
+
+	/* Force an update of the shadowed registers right now */
+	ret = regmap_update_bits(rk630->rtc, RTC_CTRL,
+				 BIT_RTC_CTRL_REG_RTC_GET_TIME,
+				 BIT_RTC_CTRL_REG_RTC_GET_TIME);
+	if (ret) {
+		dev_err(dev, "Failed to update bits rtc_ctrl: %d\n", ret);
+		return ret;
+	}
+
+	/*
+	 * After we set the GET_TIME bit, the rtc time can't be read
+	 * immediately. So we should wait up to 31.25 us, about one cycle of
+	 * 32khz. If we clear the GET_TIME bit here, the time of i2c transfer
+	 * certainly more than 31.25us: 16 * 2.5us at 400kHz bus frequency.
+	 */
+	ret = regmap_update_bits(rk630->rtc, RTC_CTRL,
+				 BIT_RTC_CTRL_REG_RTC_GET_TIME,
+				 0);
+	if (ret) {
+		dev_err(dev, "Failed to update bits rtc_ctrl: %d\n", ret);
+		return ret;
+	}
+
+	ret = regmap_bulk_read(rk630->rtc, RTC_SET_SECONDS,
+			       rtc_data, NUM_TIME_REGS);
+	if (ret) {
+		dev_err(dev, "Failed to bulk read rtc_data: %d\n", ret);
+		return ret;
+	}
+
+	tm->tm_sec = bcd2bin(rtc_data[0] & SECONDS_REG_MSK);
+	tm->tm_min = bcd2bin(rtc_data[1] & MINUTES_REG_MAK);
+	tm->tm_hour = bcd2bin(rtc_data[2] & HOURS_REG_MSK);
+	tm->tm_mday = bcd2bin(rtc_data[3] & DAYS_REG_MSK);
+	tm->tm_mon = (bcd2bin(rtc_data[4] & MONTHS_REG_MSK)) - 1;
+	tm->tm_year = (bcd2bin(rtc_data[5] & YEARS_REG_MSK)) + 100;
+	tm->tm_wday = bcd2bin(rtc_data[7] & WEEKS_REG_MSK);
+
+	dev_dbg(dev, "RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n",
+		1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday,
+		tm->tm_wday, tm->tm_hour, tm->tm_min, tm->tm_sec);
+
+	return ret;
+}
+
+/* Set current time and date in RTC */
+static int rk630_rtc_set_time(struct device *dev, struct rtc_time *tm)
+{
+	struct rk630_rtc *rk630_rtc = dev_get_drvdata(dev);
+	struct rk630 *rk630 = rk630_rtc->rk630;
+	u8 rtc_data[NUM_TIME_REGS];
+	int ret;
+
+	dev_dbg(dev, "set RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n",
+		1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday,
+		tm->tm_wday, tm->tm_hour, tm->tm_min, tm->tm_sec);
+
+	rtc_data[0] = bin2bcd(tm->tm_sec);
+	rtc_data[1] = bin2bcd(tm->tm_min);
+	rtc_data[2] = bin2bcd(tm->tm_hour);
+	rtc_data[3] = bin2bcd(tm->tm_mday);
+	rtc_data[4] = bin2bcd(tm->tm_mon + 1);
+	rtc_data[5] = bin2bcd(tm->tm_year - 100);
+	rtc_data[6] = 0;
+	rtc_data[7] = bin2bcd(tm->tm_wday);
+
+	/* Stop RTC while updating the RTC registers */
+	ret = regmap_update_bits(rk630->rtc, RTC_CTRL,
+				 BIT_RTC_CTRL_REG_STOP_RTC_M,
+				 BIT_RTC_CTRL_REG_STOP_RTC_M);
+	if (ret) {
+		dev_err(dev, "Failed to update RTC control: %d\n", ret);
+		return ret;
+	}
+
+	ret = regmap_bulk_write(rk630->rtc, RTC_SET_SECONDS,
+				rtc_data, NUM_TIME_REGS);
+	if (ret) {
+		dev_err(dev, "Failed to bull write rtc_data: %d\n", ret);
+		return ret;
+	}
+	/* Start RTC again */
+	ret = regmap_update_bits(rk630->rtc, RTC_CTRL,
+				 BIT_RTC_CTRL_REG_STOP_RTC_M, 0);
+	if (ret) {
+		dev_err(dev, "Failed to update RTC control: %d\n", ret);
+		return ret;
+	}
+	return 0;
+}
+
+/* Read alarm time and date in RTC */
+static int rk630_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm)
+{
+	struct rk630_rtc *rk630_rtc = dev_get_drvdata(dev);
+	struct rk630 *rk630 = rk630_rtc->rk630;
+	u8 alrm_data[NUM_ALARM_REGS];
+	u32 int_reg;
+	int ret;
+
+	ret = regmap_bulk_read(rk630->rtc,
+			       RTC_ALARM_SECONDS,
+			       alrm_data, NUM_ALARM_REGS);
+	if (ret) {
+		dev_err(dev, "Failed to read RTC alarm date REG: %d\n", ret);
+		return ret;
+	}
+
+	alrm->time.tm_sec = bcd2bin(alrm_data[0] & SECONDS_REG_MSK);
+	alrm->time.tm_min = bcd2bin(alrm_data[1] & MINUTES_REG_MAK);
+	alrm->time.tm_hour = bcd2bin(alrm_data[2] & HOURS_REG_MSK);
+	alrm->time.tm_mday = bcd2bin(alrm_data[3] & DAYS_REG_MSK);
+	alrm->time.tm_mon = (bcd2bin(alrm_data[4] & MONTHS_REG_MSK)) - 1;
+	alrm->time.tm_year = (bcd2bin(alrm_data[5] & YEARS_REG_MSK)) + 100;
+
+	ret = regmap_read(rk630->rtc, RTC_INT0_EN, &int_reg);
+	if (ret) {
+		dev_err(dev, "Failed to read RTC INT REG: %d\n", ret);
+		return ret;
+	}
+
+	dev_dbg(dev, "alrm read RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n",
+		1900 + alrm->time.tm_year, alrm->time.tm_mon + 1,
+		alrm->time.tm_mday, alrm->time.tm_wday, alrm->time.tm_hour,
+		alrm->time.tm_min, alrm->time.tm_sec);
+
+	alrm->enabled = (int_reg & BIT_RTC_INTERRUPTS_REG_IT_ALARM_M) ? 1 : 0;
+
+	return 0;
+}
+
+static int rk630_rtc_stop_alarm(struct rk630_rtc *rk630_rtc)
+{
+	struct rk630 *rk630 = rk630_rtc->rk630;
+	int ret;
+
+	ret = regmap_write(rk630->rtc, RTC_INT0_EN, 0);
+
+	return ret;
+}
+
+static int rk630_rtc_start_alarm(struct rk630_rtc *rk630_rtc)
+{
+	struct rk630 *rk630 = rk630_rtc->rk630;
+	int ret;
+
+	ret = regmap_write(rk630->rtc, RTC_INT0_EN, ENABLE_ALARM_INT);
+
+	return ret;
+}
+
+static int rk630_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
+{
+	struct rk630_rtc *rk630_rtc = dev_get_drvdata(dev);
+	struct rk630 *rk630 = rk630_rtc->rk630;
+	u8 alrm_data[NUM_ALARM_REGS];
+	int ret;
+
+	ret = rk630_rtc_stop_alarm(rk630_rtc);
+	if (ret) {
+		dev_err(dev, "Failed to stop alarm: %d\n", ret);
+		return ret;
+	}
+	dev_dbg(dev, "alrm set RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n",
+		1900 + alrm->time.tm_year, alrm->time.tm_mon + 1,
+		alrm->time.tm_mday, alrm->time.tm_wday, alrm->time.tm_hour,
+		alrm->time.tm_min, alrm->time.tm_sec);
+
+	alrm_data[0] = bin2bcd(alrm->time.tm_sec);
+	alrm_data[1] = bin2bcd(alrm->time.tm_min);
+	alrm_data[2] = bin2bcd(alrm->time.tm_hour);
+	alrm_data[3] = bin2bcd(alrm->time.tm_mday);
+	alrm_data[4] = bin2bcd(alrm->time.tm_mon + 1);
+	alrm_data[5] = bin2bcd(alrm->time.tm_year - 100);
+
+	ret = regmap_bulk_write(rk630->rtc,
+				RTC_ALARM_SECONDS,
+				alrm_data, NUM_ALARM_REGS);
+	if (ret) {
+		dev_err(dev, "Failed to bulk write: %d\n", ret);
+		return ret;
+	}
+	if (alrm->enabled) {
+		ret = rk630_rtc_start_alarm(rk630_rtc);
+		if (ret) {
+			dev_err(dev, "Failed to start alarm: %d\n", ret);
+			return ret;
+		}
+	}
+	return 0;
+}
+
+static int rk630_rtc_alarm_irq_enable(struct device *dev,
+				      unsigned int enabled)
+{
+	struct rk630_rtc *rk630_rtc = dev_get_drvdata(dev);
+
+	if (enabled)
+		return rk630_rtc_start_alarm(rk630_rtc);
+
+	return rk630_rtc_stop_alarm(rk630_rtc);
+}
+
+/*
+ * We will just handle setting the frequency and make use the framework for
+ * reading the periodic interrupts.
+ *
+ */
+static irqreturn_t rk630_alarm_irq(int irq, void *data)
+{
+	struct rk630_rtc *rk630_rtc = data;
+	struct rk630 *rk630 = rk630_rtc->rk630;
+	int ret, status;
+
+	ret = regmap_read(rk630->rtc, RTC_STATUS0, &status);
+	if (ret) {
+		pr_err("Failed to read RTC INT REG: %d\n", ret);
+		return ret;
+	}
+
+	ret = regmap_write(rk630->rtc, RTC_STATUS0, status);
+	if (ret) {
+		pr_err("%s:Failed to update RTC status: %d\n", __func__, ret);
+		return ret;
+	}
+	if (status & ALARM_INT_STATUS)
+		rtc_update_irq(rk630_rtc->rtc, 1, RTC_IRQF | RTC_AF);
+
+	return IRQ_HANDLED;
+}
+
+static const struct rtc_class_ops rk630_rtc_ops = {
+	.read_time = rk630_rtc_readtime,
+	.set_time = rk630_rtc_set_time,
+	.read_alarm = rk630_rtc_readalarm,
+	.set_alarm = rk630_rtc_setalarm,
+	.alarm_irq_enable = rk630_rtc_alarm_irq_enable,
+};
+
+/*
+ * Due to the analog generator 32k clock affected by
+ * temperature, voltage, clock precision need test
+ * with the environment change. In rtc test,
+ * use 24M clock as reference clock to measure the 32k clock.
+ * Before start test 32k clock, we should enable clk32k test(0x80),
+ * and configure test length, when rtc test done(0x84[2]),
+ * latch the 24M clock domain counter,
+ * and read out the counter from rtc_test
+ * registers(0x8c~0x98) via apb bus.
+ * In RTC digital design, we set three level compensation,
+ * the compensation value due to the
+ * RTC 32k clock test result, and if we need compensation,
+ * we need configure the compensation enable bit.
+ * Comp every hour, compensation at last minute every hour,
+ * and support add time and sub time by the MSB bit.
+ * Comp every day, compensation at last minute in last hour every day,
+ * and support add time and sub time by the MSB bit.
+ * Comp every month, compensation at last minute
+ * in last hour in last day every month,
+ * and support add time and sub time by the MSB bit.
+ */
+static int rk630_rtc_compensation(struct device *dev)
+{
+	struct platform_device *pdev = to_platform_device(dev);
+	struct rk630_rtc *rk630_rtc = dev_get_drvdata(&pdev->dev);
+	struct rk630 *rk630 = rk630_rtc->rk630;
+	u32 counts, g_ref;
+	u8 count[4];
+	int ret, done = 0, tcamp, trim_dir, c_hour,
+	    c_day, c_det_day, c_mon, c_det_mon;
+
+	ret = regmap_update_bits(rk630->rtc, RTC_CLK32K_TEST,
+				 CLK32K_TEST_EN, CLK32K_TEST_EN);
+	if (ret) {
+		dev_err(dev,
+			"%s:Failed to update RTC CLK32K TEST: %d\n",
+			__func__, ret);
+		return ret;
+	}
+
+	ret = regmap_write(rk630->rtc, RTC_TEST_LEN,
+			   CLK32K_TEST_LEN);
+	if (ret) {
+		dev_err(dev,
+			"%s:Failed to update RTC CLK32K TEST LEN: %d\n",
+			__func__, ret);
+		return ret;
+	}
+
+	ret = regmap_update_bits(rk630->rtc, RTC_TEST_ST,
+				 CLK32K_TEST_START, CLK32K_TEST_START);
+	if (ret) {
+		dev_err(dev,
+			"%s:Failed to update RTC CLK32K TEST STATUS : %d\n",
+			__func__, ret);
+		return ret;
+	}
+
+	while (!done) {
+		ret = regmap_read(rk630->rtc, RTC_TEST_ST, &done);
+		if (ret) {
+			dev_err(dev, "Failed to read RTC CLK32K TEST STATUS: %d\n",
+				ret);
+			return ret;
+		}
+		done = (done & CLK32K_TEST_DONE) >> 2;
+		udelay(1);
+	}
+
+	ret = regmap_bulk_read(rk630->rtc,
+			       RTC_CNT_0,
+			       count, 4);
+	if (ret) {
+		dev_err(dev, "Failed to read RTC count REG: %d\n", ret);
+		return ret;
+	}
+
+	counts = count[0] | (count[1] << 8) |
+		 (count[2] << 16) | (count[3] << 24);
+	g_ref = 24000000 * CLK32K_TEST_LEN;
+
+	if (counts > g_ref) {
+		trim_dir = 1;
+		tcamp = 3600 * ((counts - g_ref) * 10) / g_ref;
+	} else {
+		trim_dir = 0;
+		tcamp = 3600 * ((g_ref - counts) * 10) / g_ref;
+	}
+	c_hour = tcamp / 10;
+	c_day = (24 * tcamp) / 10;
+	c_mon = (30 * 24 * tcamp) / 10;
+	if (trim_dir) {
+		c_det_day = c_day - c_hour * 23;
+		c_det_mon = c_mon - 29 * c_day - 23 * c_hour;
+		if (c_hour > 1)
+			regmap_write(rk630->rtc, RTC_COMP_H, c_hour - 1);
+		else
+			regmap_write(rk630->rtc, RTC_COMP_H, CLK32K_NO_COMP);
+		if (c_det_day > 1)
+			regmap_write(rk630->rtc, RTC_COMP_D, c_det_day - 1);
+		else
+			regmap_write(rk630->rtc, RTC_COMP_D, CLK32K_NO_COMP);
+		if (c_det_mon)
+			regmap_write(rk630->rtc, RTC_COMP_M, c_det_mon - 1);
+		else
+			regmap_write(rk630->rtc, RTC_COMP_M, CLK32K_NO_COMP);
+	} else {
+		c_det_day = c_day - c_hour * 23;
+		c_det_mon = c_mon - 29 * c_day - 23 * c_hour;
+		if (c_hour > 1)
+			regmap_write(rk630->rtc, RTC_COMP_H,
+				     (c_hour - 1) | CLK32K_COMP_DIR_ADD);
+		else
+			regmap_write(rk630->rtc, RTC_COMP_H, CLK32K_NO_COMP);
+		if (c_det_day > 1)
+			regmap_write(rk630->rtc, RTC_COMP_D,
+				     (c_det_day - 1) | CLK32K_COMP_DIR_ADD);
+		else
+			regmap_write(rk630->rtc, RTC_COMP_D, CLK32K_NO_COMP);
+		if (c_det_mon)
+			regmap_write(rk630->rtc, RTC_COMP_M,
+				     (c_det_mon - 1) | CLK32K_COMP_DIR_ADD);
+		else
+			regmap_write(rk630->rtc, RTC_COMP_M, CLK32K_NO_COMP);
+	}
+
+	ret = regmap_update_bits(rk630->rtc, RTC_CTRL,
+				 CLK32K_COMP_EN, CLK32K_COMP_EN);
+	if (ret) {
+		dev_err(dev,
+			"%s:Failed to update RTC CTRL : %d\n", __func__, ret);
+		return ret;
+	}
+	return 0;
+}
+
+/* Enable the alarm if it should be enabled (in case it was disabled to
+ * prevent use as a wake source).
+ */
+#ifdef CONFIG_PM_SLEEP
+/* Turn off the alarm if it should not be a wake source. */
+static int rk630_rtc_suspend(struct device *dev)
+{
+	struct platform_device *pdev = to_platform_device(dev);
+	struct rk630_rtc *rk630_rtc = dev_get_drvdata(&pdev->dev);
+
+	if (device_may_wakeup(dev))
+		enable_irq_wake(rk630_rtc->irq);
+
+	return 0;
+}
+
+/* Enable the alarm if it should be enabled (in case it was disabled to
+ * prevent use as a wake source).
+ */
+static int rk630_rtc_resume(struct device *dev)
+{
+	struct platform_device *pdev = to_platform_device(dev);
+	struct rk630_rtc *rk630_rtc = dev_get_drvdata(&pdev->dev);
+
+	if (device_may_wakeup(dev))
+		disable_irq_wake(rk630_rtc->irq);
+
+	return 0;
+}
+#endif
+
+static SIMPLE_DEV_PM_OPS(rk630_rtc_pm_ops,
+	rk630_rtc_suspend, rk630_rtc_resume);
+
+static int rk630_rtc_probe(struct platform_device *pdev)
+{
+	struct rk630 *rk630 = dev_get_drvdata(pdev->dev.parent);
+	struct rk630_rtc *rk630_rtc;
+	int ret;
+
+	rk630_rtc = devm_kzalloc(&pdev->dev, sizeof(*rk630_rtc), GFP_KERNEL);
+	if (!rk630_rtc)
+		return -ENOMEM;
+
+	platform_set_drvdata(pdev, rk630_rtc);
+	rk630_rtc->rk630 = rk630;
+
+	rk630_rtc_compensation(&pdev->dev);
+
+	/* start rtc running by default, and use shadowed timer. */
+	ret = regmap_update_bits(rk630->rtc, RTC_CTRL,
+				 BIT_RTC_CTRL_REG_STOP_RTC_M |
+				 BIT_RTC_CTRL_REG_RTC_READSEL_M,
+				 BIT_RTC_CTRL_REG_RTC_READSEL_M);
+	if (ret) {
+		dev_err(&pdev->dev,
+			"Failed to update RTC control: %d\n", ret);
+		return ret;
+	}
+
+	ret = regmap_write(rk630->rtc, RTC_STATUS0,
+			   RTC_STATUS_MASK);
+	if (ret) {
+		dev_err(&pdev->dev,
+			"Failed to write RTC status0: %d\n", ret);
+			return ret;
+	}
+
+	ret = regmap_write(rk630->rtc, RTC_STATUS1,
+			   RTC_STATUS_MASK);
+	if (ret) {
+		dev_err(&pdev->dev,
+			"Failed to write RTC status1: %d\n", ret);
+			return ret;
+	}
+
+	device_init_wakeup(&pdev->dev, 1);
+
+	rk630_rtc->rtc = devm_rtc_allocate_device(&pdev->dev);
+	if (IS_ERR(rk630_rtc->rtc))
+		return PTR_ERR(rk630_rtc->rtc);
+
+	rk630_rtc->rtc->ops = &rk630_rtc_ops;
+
+	rk630_rtc->irq = platform_get_irq(pdev, 0);
+	if (rk630_rtc->irq < 0) {
+		if (rk630_rtc->irq != -EPROBE_DEFER)
+			dev_err(&pdev->dev, "Wake up is not possible as irq = %d\n",
+				rk630_rtc->irq);
+		return rk630_rtc->irq;
+	}
+
+	/* request alarm irq of rk630 */
+	ret = devm_request_threaded_irq(&pdev->dev, rk630_rtc->irq, NULL,
+					rk630_alarm_irq, 0,
+					"RTC alarm", rk630_rtc);
+	if (ret) {
+		dev_err(&pdev->dev, "Failed to request alarm IRQ %d: %d\n",
+			rk630_rtc->irq, ret);
+		return ret;
+	}
+
+	return rtc_register_device(rk630_rtc->rtc);
+}
+
+static struct platform_driver rk630_rtc_driver = {
+	.probe = rk630_rtc_probe,
+	.driver = {
+		.name = "rk630-rtc",
+		.pm = &rk630_rtc_pm_ops,
+	},
+};
+
+module_platform_driver(rk630_rtc_driver);
+
+MODULE_DESCRIPTION("RTC driver for the rk630");
+MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>");
+MODULE_LICENSE("GPL");

commit ffbb2a9f9fc60f5714ba75bc7bd9c7db2723f790
Author: Elaine Zhang <zhangqing@rock-chips.com>
Date:   Mon Oct 25 15:29:57 2021 +0800

    mfd: rk630: add rtc regmap and irq
    
    Change-Id: Ia21198d9806e697c6383ed7211959a3a3c6e38d9
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>

diff --git a/drivers/mfd/rk630-i2c.c b/drivers/mfd/rk630-i2c.c
index e31a5b4314fb..9636458e137a 100644
--- a/drivers/mfd/rk630-i2c.c
+++ b/drivers/mfd/rk630-i2c.c
@@ -49,6 +49,15 @@ rk630_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
 		return ret;
 	}
 
+	rk630->rtc = devm_regmap_init_i2c(client, &rk630_rtc_regmap_config);
+	if (IS_ERR(rk630->rtc)) {
+		ret = PTR_ERR(rk630->rtc);
+		dev_err(dev, "failed to allocate rtc register map: %d\n", ret);
+		return ret;
+	}
+
+	rk630->irq = client->irq;
+
 	return rk630_core_probe(rk630);
 }
 
diff --git a/drivers/mfd/rk630-spi.c b/drivers/mfd/rk630-spi.c
index 9475db99d0aa..b12843c583de 100644
--- a/drivers/mfd/rk630-spi.c
+++ b/drivers/mfd/rk630-spi.c
@@ -213,6 +213,16 @@ rk630_spi_probe(struct spi_device *spi)
 		return ret;
 	}
 
+	rk630->rtc = devm_regmap_init(&spi->dev, &rk630_regmap,
+				      &spi->dev, &rk630_rtc_regmap_config);
+	if (IS_ERR(rk630->rtc)) {
+		ret = PTR_ERR(rk630->rtc);
+		dev_err(rk630->dev, "Failed to initialize rtc regmap: %d\n",
+			ret);
+		return ret;
+	}
+	rk630->irq = spi->irq;
+
 	ret = rk630_core_probe(rk630);
 	if (ret)
 		return ret;
diff --git a/drivers/mfd/rk630.c b/drivers/mfd/rk630.c
index c0da053366b0..36d08407fef5 100644
--- a/drivers/mfd/rk630.c
+++ b/drivers/mfd/rk630.c
@@ -13,11 +13,41 @@
 #include <linux/gpio/consumer.h>
 #include <linux/mfd/rk630.h>
 
+static const struct regmap_irq rk630_irqs[] = {
+
+	/* RTC INT_STS0 */
+	[RK630_IRQ_RTC_ALARM] = {
+		.mask = RK630_IRQ_RTC_ALARM_MSK,
+		.reg_offset = 0,
+	},
+	/* RTC INT_STS1 */
+	[RK630_IRQ_SYS_INT] = {
+		.mask = RK630_IRQ_SYS_MSK,
+		.reg_offset = 4,
+	},
+};
+
+static const struct regmap_irq_chip rk630_irq_chip = {
+	.name = "rk630",
+	.irqs = rk630_irqs,
+	.num_irqs = ARRAY_SIZE(rk630_irqs),
+	.num_regs = 2,
+	.irq_reg_stride = 4,
+	.status_base = RTC_STATUS0,
+	.mask_base = RTC_INT0_EN,
+	.ack_base = RTC_STATUS0,
+	.init_ack_masked = true,
+};
+
 static const struct mfd_cell rk630_devs[] = {
 	{
 		.name = "rk630-tve",
 		.of_compatible = "rockchip,rk630-tve",
 	},
+	{
+		.name = "rk630-rtc",
+		.of_compatible = "rockchip,rk630-rtc",
+	},
 };
 
 static const struct regmap_range rk630_grf_readable_ranges[] = {
@@ -76,6 +106,26 @@ const struct regmap_config rk630_cru_regmap_config = {
 	.rd_table = &rk630_cru_readable_table,
 };
 
+static const struct regmap_range rk630_rtc_readable_ranges[] = {
+	regmap_reg_range(RTC_SET_SECONDS, RTC_CNT_3),
+};
+
+static const struct regmap_access_table rk630_rtc_readable_table = {
+	.yes_ranges = rk630_rtc_readable_ranges,
+	.n_yes_ranges = ARRAY_SIZE(rk630_rtc_readable_ranges),
+};
+
+const struct regmap_config rk630_rtc_regmap_config = {
+	.name = "rtc",
+	.reg_bits = 32,
+	.val_bits = 32,
+	.reg_stride = 4,
+	.max_register = RTC_MAX_REGISTER,
+	.reg_format_endian = REGMAP_ENDIAN_NATIVE,
+	.val_format_endian = REGMAP_ENDIAN_NATIVE,
+	.rd_table = &rk630_rtc_readable_table,
+};
+
 int rk630_core_probe(struct rk630 *rk630)
 {
 	int ret;
@@ -93,6 +143,21 @@ int rk630_core_probe(struct rk630 *rk630)
 	usleep_range(50000, 60000);
 	gpiod_direction_output(rk630->reset_gpio, 0);
 
+	if (!rk630->irq) {
+		dev_err(rk630->dev, "No interrupt support, no core IRQ\n");
+		return -EINVAL;
+	}
+
+	rk630->regmap_irq_chip = &rk630_irq_chip;
+	ret = devm_regmap_add_irq_chip(rk630->dev, rk630->rtc, rk630->irq,
+				       IRQF_ONESHOT | IRQF_SHARED, -1,
+				       rk630->regmap_irq_chip,
+				       &rk630->irq_data);
+	if (ret) {
+		dev_err(rk630->dev, "Failed to add irq_chip %d\n", ret);
+		return ret;
+	}
+
 	ret = devm_mfd_add_devices(rk630->dev, PLATFORM_DEVID_NONE,
 				   rk630_devs, ARRAY_SIZE(rk630_devs),
 				   NULL, 0, NULL);
diff --git a/include/linux/mfd/rk630.h b/include/linux/mfd/rk630.h
index e97989414b54..db81677bd0fb 100644
--- a/include/linux/mfd/rk630.h
+++ b/include/linux/mfd/rk630.h
@@ -17,149 +17,198 @@
 #define HIWORD_MASK(h, l)	((GENMASK((h), (l)) << 16) | GENMASK((h), (l)))
 #define HIWORD_UPDATE(v, h, l)	((((v) << (l)) & GENMASK((h), (l))) | (GENMASK((h), (l)) << 16))
 
-#define GRF_REG(x)                    ((x) + 0x20000)
-#define PLUMAGE_GRF_GPIO0A_IOMUX      GRF_REG(0x0000)
-#define GPIO0A0_SEL_MASK              HIWORD_MASK(1, 0)
-#define GPIO0A0_SEL(x)                HIWORD_UPDATE(x, 1, 0)
-#define GPIO0A1_SEL_MASK              HIWORD_MASK(3, 2)
-#define GPIO0A1_SEL(x)                HIWORD_UPDATE(x, 3, 2)
-#define GPIO0A2_SEL_MASK              HIWORD_MASK(5, 4)
-#define GPIO0A2_SEL(x)                HIWORD_UPDATE(x, 5, 4)
-#define GPIO0A3_SEL_MASK              HIWORD_MASK(7, 6)
-#define GPIO0A3_SEL(x)                HIWORD_UPDATE(x, 7, 6)
-#define GPIO0A4_SEL_MASK              HIWORD_MASK(9, 8)
-#define GPIO0A4_SEL(x)                HIWORD_UPDATE(x, 9, 8)
-#define GPIO0A5_SEL_MASK              HIWORD_MASK(11, 10)
-#define GPIO0A5_SEL(x)                HIWORD_UPDATE(x, 11, 10)
-#define GPIO0A6_SEL_MASK              HIWORD_MASK(13, 12)
-#define GPIO0A6_SEL(x)                HIWORD_UPDATE(x, 13, 12)
-#define GPIO0A7_SEL_MASK              HIWORD_MASK(15, 14)
-#define GPIO0A7_SEL(x)                HIWORD_UPDATE(x, 15, 14)
-#define PLUMAGE_GRF_GPIO0B_IOMUX      GRF_REG(0x0008)
-#define GPIO0B0_SEL_MASK              HIWORD_MASK(1, 0)
-#define GPIO0B0_SEL(x)                HIWORD_UPDATE(x, 1, 0)
-#define PLUMAGE_GRF_GPIO0C_IOMUX      GRF_REG(0x0010)
-#define PLUMAGE_GRF_GPIO0D_IOMUX      GRF_REG(0x0018)
-#define PLUMAGE_GRF_GPIO1A_IOMUX      GRF_REG(0x0020)
-#define PLUMAGE_GRF_GPIO1B_IOMUX      GRF_REG(0x0028)
-#define PLUMAGE_GRF_GPIO0A_P          GRF_REG(0x0080)
-#define PLUMAGE_GRF_GPIO0B_P          GRF_REG(0x0084)
-#define PLUMAGE_GRF_GPIO0C_P          GRF_REG(0x0088)
-#define PLUMAGE_GRF_GPIO0D_P          GRF_REG(0x008C)
-#define PLUMAGE_GRF_GPIO1A_P          GRF_REG(0x0090)
-#define PLUMAGE_GRF_GPIO1B_P          GRF_REG(0x0094)
-#define PLUMAGE_GRF_GPIO1B_SR         GRF_REG(0x00D4)
-#define PLUMAGE_GRF_GPIO1B_E          GRF_REG(0x0154)
-#define PLUMAGE_GRF_SOC_CON0          GRF_REG(0x0400)
-#define SW_TVE_DCLK_POL_MASK          HIWORD_MASK(4, 4)
-#define SW_TVE_DCLK_POL(x)            HIWORD_UPDATE(x, 4, 4)
-#define SW_TVE_DCLK_EN_MASK           HIWORD_MASK(3, 3)
-#define SW_TVE_DCLK_EN(x)             HIWORD_UPDATE(x, 3, 3)
-#define SW_DCLK_UPSAMPLE_EN_MASK      HIWORD_MASK(2, 2)
-#define SW_DCLK_UPSAMPLE_EN(x)        HIWORD_UPDATE(x, 2, 2)
-#define SW_TVE_MODE_MASK              HIWORD_MASK(1, 1)
-#define SW_TVE_MODE(x)                HIWORD_UPDATE(x, 1, 1)
-#define SW_TVE_EN_MASK                HIWORD_MASK(0, 0)
-#define SW_TVE_EN(x)                  HIWORD_UPDATE(x, 0, 0)
-#define PLUMAGE_GRF_SOC_CON1          GRF_REG(0x0404)
-#define PLUMAGE_GRF_SOC_CON2          GRF_REG(0x0408)
-#define PLUMAGE_GRF_SOC_CON3          GRF_REG(0x040C)
-#define VDAC_ENVBG_MASK               HIWORD_MASK(12, 12)
-#define VDAC_ENVBG(x)                 HIWORD_UPDATE(x, 12, 12)
-#define VDAC_ENSC0_MASK               HIWORD_MASK(11, 11)
-#define VDAC_ENSC0(x)                 HIWORD_UPDATE(x, 11, 11)
-#define VDAC_ENEXTREF_MASK            HIWORD_MASK(10, 10)
-#define VDAC_ENEXTREF(x)              HIWORD_UPDATE(x, 10, 10)
-#define VDAC_ENDAC0_MASK              HIWORD_MASK(9, 9)
-#define VDAC_ENDAC0(x)                HIWORD_UPDATE(x, 9, 9)
-#define VDAC_ENCTR2_MASK              HIWORD_MASK(8, 8)
-#define VDAC_ENCTR2(x)                HIWORD_UPDATE(x, 8, 8)
-#define VDAC_ENCTR1_MASK              HIWORD_MASK(7, 7)
-#define VDAC_ENCTR1(x)                HIWORD_UPDATE(x, 7, 7)
-#define VDAC_ENCTR0_MASK              HIWORD_MASK(6, 6)
-#define VDAC_ENCTR0(x)                HIWORD_UPDATE(x, 6, 6)
-#define VDAC_GAIN_MASK                GENMASK(x, 5, 0)
-#define VDAC_GAIN(x)                  HIWORD_UPDATE(x, 5, 0)
-#define PLUMAGE_GRF_SOC_CON4          GRF_REG(0x0410)
-#define PLUMAGE_GRF_SOC_STATUS        GRF_REG(0x0480)
-#define PLUMAGE_GRF_GPIO0_REN0        GRF_REG(0x0500)
-#define PLUMAGE_GRF_GPIO0_REN1        GRF_REG(0x0504)
-#define PLUMAGE_GRF_GPIO1_REN0        GRF_REG(0x0508)
-#define GRF_MAX_REGISTER              PLUMAGE_GRF_GPIO1_REN0
+#define RTC_REG(x)			((x) + 0x6000)
+#define RTC_SET_SECONDS			RTC_REG(0x0)
+#define RTC_SET_MINUTES			RTC_REG(0x4)
+#define RTC_SET_HOURS			RTC_REG(0x8)
+#define RTC_SET_DAYS			RTC_REG(0xc)
+#define RTC_SET_MONTHS			RTC_REG(0x10)
+#define RTC_SET_YEARL			RTC_REG(0x14)
+#define RTC_SET_YEARH			RTC_REG(0x18)
+#define RTC_SET_WEEKS			RTC_REG(0x1c)
+#define RTC_ALARM_SECONDS		RTC_REG(0x20)
+#define RTC_ALARM_MINUTES		RTC_REG(0x24)
+#define RTC_ALARM_HOURS			RTC_REG(0x28)
+#define RTC_ALARM_DAYS			RTC_REG(0x2c)
+#define RTC_ALARM_MONTHS		RTC_REG(0x30)
+#define RTC_ALARM_YEARL			RTC_REG(0x34)
+#define RTC_ALARM_YEARH			RTC_REG(0x38)
+#define RTC_CTRL			RTC_REG(0x3C)
+#define RTC_STATUS0			RTC_REG(0x40)
+#define RTC_STATUS1			RTC_REG(0x44)
+#define RTC_INT0_EN			RTC_REG(0x48)
+#define RTC_INT1_EN			RTC_REG(0x4c)
+#define RTC_MSEC_CTRL			RTC_REG(0x50)
+#define RTC_MSEC_CNT			RTC_REG(0x54)
+#define RTC_COMP_H			RTC_REG(0x58)
+#define RTC_COMP_D			RTC_REG(0x5c)
+#define RTC_COMP_M			RTC_REG(0x60)
+#define RTC_ANALOG_CTRL			RTC_REG(0x64)
+#define RTC_ANALOG_TEST			RTC_REG(0x68)
+#define RTC_LDO_CTRL			RTC_REG(0x6c)
+#define RTC_XO_TRIM0			RTC_REG(0x70)
+#define RTC_XO_TRIM1			RTC_REG(0x74)
+#define RTC_VPTAT_TRIM			RTC_REG(0x78)
+#define RTC_ANALOG_EN			RTC_REG(0x7c)
+#define RTC_CLK32K_TEST			RTC_REG(0x80)
+#define RTC_TEST_ST			RTC_REG(0x84)
+#define RTC_TEST_LEN			RTC_REG(0x88)
+#define RTC_CNT_0			RTC_REG(0x8c)
+#define RTC_CNT_1			RTC_REG(0x90)
+#define RTC_CNT_2			RTC_REG(0x94)
+#define RTC_CNT_3			RTC_REG(0x98)
+#define RTC_MAX_REGISTER		RTC_CNT_3
 
-#define CRU_REG(x)                    ((x) + 0x140000)
-#define CRU_SPLL_CON0                 CRU_REG(0x0000)
-#define POSTDIV1_MASK                 HIWORD_MASK(14, 12)
-#define POSTDIV1(x)                   HIWORD_UPDATE(x, 14, 12)
-#define FBDIV_MASK                    HIWORD_MASK(14, 12)
-#define FBDIV(x)                      HIWORD_UPDATE(x, 14, 12)
-#define CRU_SPLL_CON1                 CRU_REG(0x0004)
-#define PLLPD0_MASK                   HIWORD_MASK(13, 13)
-#define PLLPD0(x)                     HIWORD_UPDATE(x, 13, 13)
-#define PLL_LOCK                      BIT(10)
-#define POSTDIV2_MASK                 HIWORD_MASK(8, 6)
-#define POSTDIV2(x)                   HIWORD_UPDATE(x, 8, 6)
-#define REFDIV_MASK                   HIWORD_MASK(5, 0)
-#define REFDIV(x)                     HIWORD_UPDATE(x, 5, 0)
-#define CRU_SPLL_CON2                 CRU_REG(0x0008)
-#define CRU_MODE_CON                  CRU_REG(0x0020)
-#define CLK_SPLL_MODE_MASK            HIWORD_MASK(2, 0)
-#define CLK_SPLL_MODE(x)              HIWORD_UPDATE(x, 2, 0)
-#define CRU_CLKSEL_CON0               CRU_REG(0x0030)
-#define CRU_CLKSEL_CON1               CRU_REG(0x0034)
-#define DCLK_CVBS_4X_DIV_CON_MASK     HIWORD_MASK(12, 8)
-#define DCLK_CVBS_4X_DIV_CON(x)       HIWORD_UPDATE(x, 12, 8)
-#define CRU_CLKSEL_CON2               CRU_REG(0x0038)
-#define CRU_CLKSEL_CON3               CRU_REG(0x003c)
-#define CRU_GATE_CON0                 CRU_REG(0x0040)
-#define CRU_SOFTRST_CON0              CRU_REG(0x0050)
-#define DRESETN_CVBS_1X_MASK          HIWORD_MASK(10, 10)
-#define DRESETN_CVBS_1X(x)            HIWORD_UPDATE(x, 10, 10)
-#define DRESETN_CVBS_4X_MASK          HIWORD_MASK(9, 9)
-#define DRESETN_CVBS_4X(x)            HIWORD_UPDATE(x, 9, 9)
-#define PRESETN_CVBS_MASK             HIWORD_MASK(8, 8)
-#define PRESETN_CVBS(x)               HIWORD_UPDATE(x, 8, 8)
-#define PRESETN_GRF_MASK              HIWORD_MASK(3, 3)
-#define PRESETN_GRF(x)                HIWORD_UPDATE(x, 3, 3)
-#define CRU_MAX_REGISTER              CRU_SOFTRST_CON0
+#define GRF_REG(x)			((x) + 0x20000)
+#define PLUMAGE_GRF_GPIO0A_IOMUX	GRF_REG(0x0000)
+#define GPIO0A0_SEL_MASK		HIWORD_MASK(1, 0)
+#define GPIO0A0_SEL(x)			HIWORD_UPDATE(x, 1, 0)
+#define GPIO0A1_SEL_MASK		HIWORD_MASK(3, 2)
+#define GPIO0A1_SEL(x)			HIWORD_UPDATE(x, 3, 2)
+#define GPIO0A2_SEL_MASK		HIWORD_MASK(5, 4)
+#define GPIO0A2_SEL(x)			HIWORD_UPDATE(x, 5, 4)
+#define GPIO0A3_SEL_MASK		HIWORD_MASK(7, 6)
+#define GPIO0A3_SEL(x)			HIWORD_UPDATE(x, 7, 6)
+#define GPIO0A4_SEL_MASK		HIWORD_MASK(9, 8)
+#define GPIO0A4_SEL(x)			HIWORD_UPDATE(x, 9, 8)
+#define GPIO0A5_SEL_MASK		HIWORD_MASK(11, 10)
+#define GPIO0A5_SEL(x)			HIWORD_UPDATE(x, 11, 10)
+#define GPIO0A6_SEL_MASK		HIWORD_MASK(13, 12)
+#define GPIO0A6_SEL(x)			HIWORD_UPDATE(x, 13, 12)
+#define GPIO0A7_SEL_MASK		HIWORD_MASK(15, 14)
+#define GPIO0A7_SEL(x)			HIWORD_UPDATE(x, 15, 14)
+#define PLUMAGE_GRF_GPIO0B_IOMUX	GRF_REG(0x0008)
+#define GPIO0B0_SEL_MASK		HIWORD_MASK(1, 0)
+#define GPIO0B0_SEL(x)			HIWORD_UPDATE(x, 1, 0)
+#define PLUMAGE_GRF_GPIO0C_IOMUX	GRF_REG(0x0010)
+#define PLUMAGE_GRF_GPIO0D_IOMUX	GRF_REG(0x0018)
+#define PLUMAGE_GRF_GPIO1A_IOMUX	GRF_REG(0x0020)
+#define PLUMAGE_GRF_GPIO1B_IOMUX	GRF_REG(0x0028)
+#define PLUMAGE_GRF_GPIO0A_P		GRF_REG(0x0080)
+#define PLUMAGE_GRF_GPIO0B_P		GRF_REG(0x0084)
+#define PLUMAGE_GRF_GPIO0C_P		GRF_REG(0x0088)
+#define PLUMAGE_GRF_GPIO0D_P		GRF_REG(0x008C)
+#define PLUMAGE_GRF_GPIO1A_P		GRF_REG(0x0090)
+#define PLUMAGE_GRF_GPIO1B_P		GRF_REG(0x0094)
+#define PLUMAGE_GRF_GPIO1B_SR		GRF_REG(0x00D4)
+#define PLUMAGE_GRF_GPIO1B_E		GRF_REG(0x0154)
+#define PLUMAGE_GRF_SOC_CON0		GRF_REG(0x0400)
+#define SW_TVE_DCLK_POL_MASK		HIWORD_MASK(4, 4)
+#define SW_TVE_DCLK_POL(x)		HIWORD_UPDATE(x, 4, 4)
+#define SW_TVE_DCLK_EN_MASK		HIWORD_MASK(3, 3)
+#define SW_TVE_DCLK_EN(x)		HIWORD_UPDATE(x, 3, 3)
+#define SW_DCLK_UPSAMPLE_EN_MASK	HIWORD_MASK(2, 2)
+#define SW_DCLK_UPSAMPLE_EN(x)		HIWORD_UPDATE(x, 2, 2)
+#define SW_TVE_MODE_MASK		HIWORD_MASK(1, 1)
+#define SW_TVE_MODE(x)			HIWORD_UPDATE(x, 1, 1)
+#define SW_TVE_EN_MASK			HIWORD_MASK(0, 0)
+#define SW_TVE_EN(x)			HIWORD_UPDATE(x, 0, 0)
+#define PLUMAGE_GRF_SOC_CON1		GRF_REG(0x0404)
+#define PLUMAGE_GRF_SOC_CON2		GRF_REG(0x0408)
+#define PLUMAGE_GRF_SOC_CON3		GRF_REG(0x040C)
+#define VDAC_ENVBG_MASK			HIWORD_MASK(12, 12)
+#define VDAC_ENVBG(x)			HIWORD_UPDATE(x, 12, 12)
+#define VDAC_ENSC0_MASK			HIWORD_MASK(11, 11)
+#define VDAC_ENSC0(x)			HIWORD_UPDATE(x, 11, 11)
+#define VDAC_ENEXTREF_MASK		HIWORD_MASK(10, 10)
+#define VDAC_ENEXTREF(x)		HIWORD_UPDATE(x, 10, 10)
+#define VDAC_ENDAC0_MASK		HIWORD_MASK(9, 9)
+#define VDAC_ENDAC0(x)			HIWORD_UPDATE(x, 9, 9)
+#define VDAC_ENCTR2_MASK		HIWORD_MASK(8, 8)
+#define VDAC_ENCTR2(x)			HIWORD_UPDATE(x, 8, 8)
+#define VDAC_ENCTR1_MASK		HIWORD_MASK(7, 7)
+#define VDAC_ENCTR1(x)			HIWORD_UPDATE(x, 7, 7)
+#define VDAC_ENCTR0_MASK		HIWORD_MASK(6, 6)
+#define VDAC_ENCTR0(x)			HIWORD_UPDATE(x, 6, 6)
+#define VDAC_GAIN_MASK			GENMASK(x, 5, 0)
+#define VDAC_GAIN(x)			HIWORD_UPDATE(x, 5, 0)
+#define PLUMAGE_GRF_SOC_CON4		GRF_REG(0x0410)
+#define PLUMAGE_GRF_SOC_STATUS		GRF_REG(0x0480)
+#define PLUMAGE_GRF_GPIO0_REN0		GRF_REG(0x0500)
+#define PLUMAGE_GRF_GPIO0_REN1		GRF_REG(0x0504)
+#define PLUMAGE_GRF_GPIO1_REN0		GRF_REG(0x0508)
+#define GRF_MAX_REGISTER		PLUMAGE_GRF_GPIO1_REN0
 
-#define TVE_REG(x)                      ((x) + 0x10000)
-#define BT656_DECODER_CTRL              TVE_REG(0x3D00)
-#define BT656_DECODER_CROP              TVE_REG(0x3D04)
-#define BT656_DECODER_SIZE              TVE_REG(0x3D08)
-#define BT656_DECODER_HTOTAL_HS_END     TVE_REG(0x3D0C)
-#define BT656_DECODER_VACT_ST_HACT_ST   TVE_REG(0x3D10)
-#define BT656_DECODER_VTOTAL_VS_END     TVE_REG(0x3D14)
-#define BT656_DECODER_VS_ST_END_F1      TVE_REG(0x3D18)
-#define BT656_DECODER_DBG_REG           TVE_REG(0x3D1C)
-#define TVE_MODE_CTRL                   TVE_REG(0x3E00)
-#define TVE_HOR_TIMING1                 TVE_REG(0x3E04)
-#define TVE_HOR_TIMING2                 TVE_REG(0x3E08)
-#define TVE_HOR_TIMING3                 TVE_REG(0x3E0C)
-#define TVE_SUB_CAR_FRQ                 TVE_REG(0x3E10)
-#define TVE_LUMA_FILTER1                TVE_REG(0x3E14)
-#define TVE_LUMA_FILTER2                TVE_REG(0x3E18)
-#define TVE_LUMA_FILTER3                TVE_REG(0x3E1C)
-#define TVE_LUMA_FILTER4                TVE_REG(0x3E20)
-#define TVE_LUMA_FILTER5                TVE_REG(0x3E24)
-#define TVE_LUMA_FILTER6                TVE_REG(0x3E28)
-#define TVE_LUMA_FILTER7                TVE_REG(0x3E2C)
-#define TVE_LUMA_FILTER8                TVE_REG(0x3E30)
-#define TVE_IMAGE_POSITION              TVE_REG(0x3E34)
-#define TVE_ROUTING                     TVE_REG(0x3E38)
-#define TVE_SYNC_ADJUST                 TVE_REG(0x3E50)
-#define TVE_STATUS                      TVE_REG(0x3E54)
-#define TVE_CTRL                        TVE_REG(0x3E68)
-#define TVE_INTR_STATUS                 TVE_REG(0x3E6C)
-#define TVE_INTR_EN                     TVE_REG(0x3E70)
-#define TVE_INTR_CLR                    TVE_REG(0x3E74)
-#define TVE_COLOR_BUSRT_SAT             TVE_REG(0x3E78)
-#define TVE_CHROMA_BANDWIDTH            TVE_REG(0x3E8C)
-#define TVE_BRIGHTNESS_CONTRAST         TVE_REG(0x3E90)
-#define TVE_ID                          TVE_REG(0x3E98)
-#define TVE_REVISION                    TVE_REG(0x3E9C)
-#define TVE_CLAMP                       TVE_REG(0x3EA0)
-#define TVE_MAX_REGISTER                TVE_CLAMP
+#define CRU_REG(x)			((x) + 0x140000)
+#define CRU_SPLL_CON0			CRU_REG(0x0000)
+#define POSTDIV1_MASK			HIWORD_MASK(14, 12)
+#define POSTDIV1(x)			HIWORD_UPDATE(x, 14, 12)
+#define FBDIV_MASK			HIWORD_MASK(14, 12)
+#define FBDIV(x)			HIWORD_UPDATE(x, 14, 12)
+#define CRU_SPLL_CON1			CRU_REG(0x0004)
+#define PLLPD0_MASK			HIWORD_MASK(13, 13)
+#define PLLPD0(x)			HIWORD_UPDATE(x, 13, 13)
+#define PLL_LOCK			BIT(10)
+#define POSTDIV2_MASK			HIWORD_MASK(8, 6)
+#define POSTDIV2(x)			HIWORD_UPDATE(x, 8, 6)
+#define REFDIV_MASK			HIWORD_MASK(5, 0)
+#define REFDIV(x)			HIWORD_UPDATE(x, 5, 0)
+#define CRU_SPLL_CON2			CRU_REG(0x0008)
+#define CRU_MODE_CON			CRU_REG(0x0020)
+#define CLK_SPLL_MODE_MASK		HIWORD_MASK(2, 0)
+#define CLK_SPLL_MODE(x)		HIWORD_UPDATE(x, 2, 0)
+#define CRU_CLKSEL_CON0			CRU_REG(0x0030)
+#define CRU_CLKSEL_CON1			CRU_REG(0x0034)
+#define DCLK_CVBS_4X_DIV_CON_MASK	HIWORD_MASK(12, 8)
+#define DCLK_CVBS_4X_DIV_CON(x)		HIWORD_UPDATE(x, 12, 8)
+#define CRU_CLKSEL_CON2			CRU_REG(0x0038)
+#define CRU_CLKSEL_CON3			CRU_REG(0x003c)
+#define CRU_GATE_CON0			CRU_REG(0x0040)
+#define CRU_SOFTRST_CON0		CRU_REG(0x0050)
+#define DRESETN_CVBS_1X_MASK		HIWORD_MASK(10, 10)
+#define DRESETN_CVBS_1X(x)		HIWORD_UPDATE(x, 10, 10)
+#define DRESETN_CVBS_4X_MASK		HIWORD_MASK(9, 9)
+#define DRESETN_CVBS_4X(x)		HIWORD_UPDATE(x, 9, 9)
+#define PRESETN_CVBS_MASK		HIWORD_MASK(8, 8)
+#define PRESETN_CVBS(x)			HIWORD_UPDATE(x, 8, 8)
+#define PRESETN_GRF_MASK		HIWORD_MASK(3, 3)
+#define PRESETN_GRF(x)			HIWORD_UPDATE(x, 3, 3)
+#define CRU_MAX_REGISTER		CRU_SOFTRST_CON0
+
+#define TVE_REG(x)			((x) + 0x10000)
+#define BT656_DECODER_CTRL		TVE_REG(0x3D00)
+#define BT656_DECODER_CROP		TVE_REG(0x3D04)
+#define BT656_DECODER_SIZE		TVE_REG(0x3D08)
+#define BT656_DECODER_HTOTAL_HS_END	TVE_REG(0x3D0C)
+#define BT656_DECODER_VACT_ST_HACT_ST	TVE_REG(0x3D10)
+#define BT656_DECODER_VTOTAL_VS_END	TVE_REG(0x3D14)
+#define BT656_DECODER_VS_ST_END_F1	TVE_REG(0x3D18)
+#define BT656_DECODER_DBG_REG		TVE_REG(0x3D1C)
+#define TVE_MODE_CTRL			TVE_REG(0x3E00)
+#define TVE_HOR_TIMING1			TVE_REG(0x3E04)
+#define TVE_HOR_TIMING2			TVE_REG(0x3E08)
+#define TVE_HOR_TIMING3			TVE_REG(0x3E0C)
+#define TVE_SUB_CAR_FRQ			TVE_REG(0x3E10)
+#define TVE_LUMA_FILTER1		TVE_REG(0x3E14)
+#define TVE_LUMA_FILTER2		TVE_REG(0x3E18)
+#define TVE_LUMA_FILTER3		TVE_REG(0x3E1C)
+#define TVE_LUMA_FILTER4		TVE_REG(0x3E20)
+#define TVE_LUMA_FILTER5		TVE_REG(0x3E24)
+#define TVE_LUMA_FILTER6		TVE_REG(0x3E28)
+#define TVE_LUMA_FILTER7		TVE_REG(0x3E2C)
+#define TVE_LUMA_FILTER8		TVE_REG(0x3E30)
+#define TVE_IMAGE_POSITION		TVE_REG(0x3E34)
+#define TVE_ROUTING			TVE_REG(0x3E38)
+#define TVE_SYNC_ADJUST			TVE_REG(0x3E50)
+#define TVE_STATUS			TVE_REG(0x3E54)
+#define TVE_CTRL			TVE_REG(0x3E68)
+#define TVE_INTR_STATUS			TVE_REG(0x3E6C)
+#define TVE_INTR_EN			TVE_REG(0x3E70)
+#define TVE_INTR_CLR			TVE_REG(0x3E74)
+#define TVE_COLOR_BUSRT_SAT		TVE_REG(0x3E78)
+#define TVE_CHROMA_BANDWIDTH		TVE_REG(0x3E8C)
+#define TVE_BRIGHTNESS_CONTRAST		TVE_REG(0x3E90)
+#define TVE_ID				TVE_REG(0x3E98)
+#define TVE_REVISION			TVE_REG(0x3E9C)
+#define TVE_CLAMP			TVE_REG(0x3EA0)
+#define TVE_MAX_REGISTER		TVE_CLAMP
+
+/* RK630 IRQ Definitions */
+#define RK630_IRQ_RTC_ALARM		0
+#define RK630_IRQ_SYS_INT		1
+
+#define RK630_IRQ_RTC_ALARM_MSK		BIT(7)
+#define RK630_IRQ_SYS_MSK		BIT(4)
 
 struct rk630 {
 	struct device *dev;
@@ -167,9 +216,14 @@ struct rk630 {
 	struct regmap *grf;
 	struct regmap *cru;
 	struct regmap *tve;
+	struct regmap *rtc;
 	struct gpio_desc *reset_gpio;
+	int irq;
+	struct regmap_irq_chip_data *irq_data;
+	const struct regmap_irq_chip *regmap_irq_chip;
 };
 
+extern const struct regmap_config rk630_rtc_regmap_config;
 extern const struct regmap_config rk630_grf_regmap_config;
 extern const struct regmap_config rk630_cru_regmap_config;
 extern const struct regmap_config rk630_tve_regmap_config;

commit 7d79155429faa8a166b5207ea32b0308a811ac44
Author: Zhen Chen <chenzhen@rock-chips.com>
Date:   Mon Oct 18 10:43:03 2021 +0800

    MALI: bifrost: resolve error when 'make clean'
    
    Signed-off-by: Zhen Chen <chenzhen@rock-chips.com>
    Change-Id: I492507877fc82c475c46d5c0c93d216ab052a48e

diff --git a/drivers/gpu/arm/bifrost/Kbuild b/drivers/gpu/arm/bifrost/Kbuild
index b1ac6e92db6a..69d0fbb31a87 100644
--- a/drivers/gpu/arm/bifrost/Kbuild
+++ b/drivers/gpu/arm/bifrost/Kbuild
@@ -143,7 +143,6 @@ subdir-ccflags-y += $(ccflags-y)
 # Kernel Modules
 #
 obj-$(CONFIG_MALI_MIDGARD) += bifrost_kbase.o
-obj-$(CONFIG_MALI_ARBITRATION) += arbitration/
 obj-$(CONFIG_MALI_KUTF)    += tests/
 
 bifrost_kbase-y := \

commit 100a5af029b1536ed558168e1df812298bad8a10
Author: Zhen Chen <chenzhen@rock-chips.com>
Date:   Tue Aug 10 15:44:31 2021 +0800

    MALI: rockchip: upgrade bifrost DDK to g7p1-01bet0, from g6p0-01eac0
    
    Including modifications under drivers/base/ from the new DDK.
    
    Resolve lots of conflicts.
    
    Change-Id: I69f9ac87d927441d0b92b8dac8b704922aeb6a0a
    Signed-off-by: Zhen Chen <chenzhen@rock-chips.com>

diff --git a/Documentation/ABI/testing/sysfs-device-mali b/Documentation/ABI/testing/sysfs-device-mali
index 1cd1819d42bc..99f8ae57b7c9 100644
--- a/Documentation/ABI/testing/sysfs-device-mali
+++ b/Documentation/ABI/testing/sysfs-device-mali
@@ -15,10 +15,11 @@
 
 What:		/sys/class/misc/mali%u/device/core_mask
 Description:
-		This attribute is used to restrict number of shader core
-		available, is useful for debugging purposes. Reading
-		this attribute provides us mask of cores available.
-		Writing to it will set the current core mask.
+		This attribute is used to restrict the number of shader cores
+		available in this instance, is useful for debugging purposes.
+		Reading this attribute provides us mask of all cores available.
+		Writing to it will set the current core mask. Doesn't
+		allow disabling all the cores present in this instance.
 
 What:		/sys/class/misc/mali%u/device/debug_command
 Description:
@@ -43,6 +44,14 @@ Description:
 		Its a readonly attribute and on reading gives details on the
 		options used with the dummy workaround.
 
+What:		/sys/class/misc/mali%u/device/fw_timeout
+Description:
+		This attribute is available only with mali platform
+		device-driver that supports a CSF GPU. This attribute is
+		used to set the duration value in milliseconds for the
+		waiting timeout used for a GPU status change request being
+		acknowledged by the FW.
+
 What:		/sys/class/misc/mali%u/device/gpuinfo
 Description:
 		This attribute provides description of the present Mali GPU.
diff --git a/Documentation/devicetree/bindings/arm/mali-bifrost.txt b/Documentation/devicetree/bindings/arm/mali-bifrost.txt
index 93493e833c9b..a74d56945a1d 100644
--- a/Documentation/devicetree/bindings/arm/mali-bifrost.txt
+++ b/Documentation/devicetree/bindings/arm/mali-bifrost.txt
@@ -1,4 +1,4 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
 # (C) COPYRIGHT 2013-2021 ARM Limited. All rights reserved.
 #
@@ -97,6 +97,8 @@ for details.
 	  are used at different points so care should be taken to configure
 	  both power models in the device tree (specifically dynamic-coefficient,
 	  static-coefficient and scale) to best match the platform.
+- power_policy : Sets the GPU power policy at probe time. Available options are
+                 "coarse_demand" and "always_on". If not set, then "coarse_demand" is used.
 - system-coherency : Sets the coherency protocol to be used for coherent
 		     accesses made from the GPU.
 		     If not set then no coherency is used.
diff --git a/Documentation/devicetree/bindings/arm/memory_group_manager.txt b/Documentation/devicetree/bindings/arm/memory_group_manager.txt
index 77a94743a97b..634973f1434c 100644
--- a/Documentation/devicetree/bindings/arm/memory_group_manager.txt
+++ b/Documentation/devicetree/bindings/arm/memory_group_manager.txt
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
diff --git a/Documentation/devicetree/bindings/arm/priority_control_manager.txt b/Documentation/devicetree/bindings/arm/priority_control_manager.txt
index 0a34896dd8ee..c7dd14f64427 100644
--- a/Documentation/devicetree/bindings/arm/priority_control_manager.txt
+++ b/Documentation/devicetree/bindings/arm/priority_control_manager.txt
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
diff --git a/Documentation/devicetree/bindings/arm/protected_memory_allocator.txt b/Documentation/devicetree/bindings/arm/protected_memory_allocator.txt
index 8ca5f08c6b44..89a3cc7fad46 100644
--- a/Documentation/devicetree/bindings/arm/protected_memory_allocator.txt
+++ b/Documentation/devicetree/bindings/arm/protected_memory_allocator.txt
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
diff --git a/Documentation/devicetree/bindings/power/mali-opp.txt b/Documentation/devicetree/bindings/power/mali-opp.txt
index 411c99229e95..009e8eab3d40 100644
--- a/Documentation/devicetree/bindings/power/mali-opp.txt
+++ b/Documentation/devicetree/bindings/power/mali-opp.txt
@@ -1,4 +1,4 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
 # (C) COPYRIGHT 2017, 2019-2021 ARM Limited. All rights reserved.
 #
diff --git a/Documentation/dma-buf-test-exporter.txt b/Documentation/dma-buf-test-exporter.txt
new file mode 100644
index 000000000000..b01020c06751
--- /dev/null
+++ b/Documentation/dma-buf-test-exporter.txt
@@ -0,0 +1,42 @@
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+#
+# (C) COPYRIGHT 2012-2013, 2020-2021 ARM Limited. All rights reserved.
+#
+# This program is free software and is provided to you under the terms of the
+# GNU General Public License version 2 as published by the Free Software
+# Foundation, and any use by you of this program is subject to the terms
+# of such GNU license.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can access it online at
+# http://www.gnu.org/licenses/gpl-2.0.html.
+#
+#
+
+=====================
+dma-buf-test-exporter
+=====================
+
+Overview
+--------
+
+The dma-buf-test-exporter is a simple exporter of dma_buf objects.
+It has a private API to allocate and manipulate the buffers which are represented as dma_buf fds.
+The private API allows:
+* simple allocation of physically non-contiguous buffers
+* simple allocation of physically contiguous buffers
+* query kernel side API usage stats (number of attachments, number of mappings, mmaps)
+* failure mode configuration (fail attach, mapping, mmap)
+* kernel side memset of buffers
+
+The buffers support all of the dma_buf API, including mmap.
+
+It supports being compiled as a module both in-tree and out-of-tree.
+
+See include/linux/dma-buf-test-exporter.h for the ioctl interface.
+See Documentation/dma-buf-sharing.txt for details on dma_buf.
diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig
index ec863016e7d7..0ec415410499 100644
--- a/drivers/base/Kconfig
+++ b/drivers/base/Kconfig
@@ -171,8 +171,7 @@ config SOC_BUS
 
 source "drivers/base/regmap/Kconfig"
 
-source "drivers/base/arm/memory_group_manager/Kconfig"
-source "drivers/base/arm/protected_memory_allocator/Kconfig"
+source "drivers/base/arm/Kconfig"
 
 config DMA_SHARED_BUFFER
 	bool
diff --git a/drivers/base/arm/Kbuild b/drivers/base/arm/Kbuild
new file mode 100644
index 000000000000..b0fbf9369381
--- /dev/null
+++ b/drivers/base/arm/Kbuild
@@ -0,0 +1,34 @@
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+#
+# (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
+#
+# This program is free software and is provided to you under the terms of the
+# GNU General Public License version 2 as published by the Free Software
+# Foundation, and any use by you of this program is subject to the terms
+# of such GNU license.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can access it online at
+# http://www.gnu.org/licenses/gpl-2.0.html.
+#
+#
+
+#
+# ccflags
+#
+ccflags-y += -I$(src)/../../../include
+
+subdir-ccflags-y += $(ccflags-y)
+
+#
+# Kernel modules
+#
+obj-$(CONFIG_DMA_SHARED_BUFFER_TEST_EXPORTER) += dma_buf_test_exporter/
+obj-$(CONFIG_MALI_MEMORY_GROUP_MANAGER) += memory_group_manager/
+obj-$(CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR) += protected_memory_allocator/
+
diff --git a/drivers/base/arm/Kconfig b/drivers/base/arm/Kconfig
new file mode 100644
index 000000000000..75d543489707
--- /dev/null
+++ b/drivers/base/arm/Kconfig
@@ -0,0 +1,64 @@
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+#
+# (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
+#
+# This program is free software and is provided to you under the terms of the
+# GNU General Public License version 2 as published by the Free Software
+# Foundation, and any use by you of this program is subject to the terms
+# of such GNU license.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can access it online at
+# http://www.gnu.org/licenses/gpl-2.0.html.
+#
+#
+
+menuconfig MALI_BASE_MODULES
+	bool "Mali Base extra modules"
+	default n
+	help
+	  Enable this option to build support for a Arm Mali base modules.
+	  Those modules provide extra features or debug interfaces and,
+	  are optional for the use of the Mali GPU modules.
+
+config DMA_SHARED_BUFFER_TEST_EXPORTER
+	bool "Build dma-buf framework test exporter module"
+	depends on MALI_BASE_MODULES && DMA_SHARED_BUFFER
+	default y
+	help
+	  This option will build the dma-buf framework test exporter module.
+	  Usable to help test importers.
+
+	  Modules:
+	    - dma-buf-test-exporter.ko
+
+config MALI_MEMORY_GROUP_MANAGER
+	bool "Build Mali Memory Group Manager module"
+	depends on MALI_BASE_MODULES
+	default y
+	help
+	  This option will build the memory group manager module.
+	  This is an example implementation for allocation and release of pages
+	  for memory pools managed by Mali GPU device drivers.
+
+	  Modules:
+	    - memory_group_manager.ko
+
+config MALI_PROTECTED_MEMORY_ALLOCATOR
+	bool "Build Mali Protected Memory Allocator module"
+	depends on MALI_BASE_MODULES && MALI_CSF_SUPPORT
+	default y
+	help
+	  This option will build the protected memory allocator module.
+	  This is an example implementation for allocation and release of pages
+	  of secure memory intended to be used by the firmware
+	  of Mali GPU device drivers.
+
+	  Modules:
+	    - protected_memory_allocator.ko
+
diff --git a/drivers/base/arm/Makefile b/drivers/base/arm/Makefile
new file mode 100644
index 000000000000..0bd6ab5f502f
--- /dev/null
+++ b/drivers/base/arm/Makefile
@@ -0,0 +1,98 @@
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+#
+# (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
+#
+# This program is free software and is provided to you under the terms of the
+# GNU General Public License version 2 as published by the Free Software
+# Foundation, and any use by you of this program is subject to the terms
+# of such GNU license.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can access it online at
+# http://www.gnu.org/licenses/gpl-2.0.html.
+#
+#
+
+#
+# Paths
+#
+KERNEL_SRC ?= /lib/modules/$(shell uname -r)/build
+KDIR ?= $(KERNEL_SRC)
+
+ifeq ($(KDIR),)
+    $(error Must specify KDIR to point to the kernel to target))
+endif
+
+vars :=
+#
+# Default configuration values
+#
+CONFIG_MALI_BASE_MODULES ?= n
+
+ifeq ($(CONFIG_MALI_BASE_MODULES),y)
+    CONFIG_MALI_CSF_SUPPORT ?= n
+
+    ifneq ($(CONFIG_DMA_SHARED_BUFFER),n)
+        CONFIG_DMA_SHARED_BUFFER_TEST_EXPORTER ?= y
+    else
+        # Prevent misuse when CONFIG_DMA_SHARED_BUFFER=n
+        CONFIG_DMA_SHARED_BUFFER_TEST_EXPORTER = n
+    endif
+
+    CONFIG_MALI_MEMORY_GROUP_MANAGER ?= y
+
+    ifneq ($(CONFIG_MALI_CSF_SUPPORT), n)
+        CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR ?= y
+    endif
+
+else
+    # Prevent misuse when CONFIG_MALI_BASE_MODULES=n
+    CONFIG_DMA_SHARED_BUFFER_TEST_EXPORTER = n
+    CONFIG_MALI_MEMORY_GROUP_MANAGER = n
+    CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR = n
+
+endif
+
+CONFIGS := \
+    CONFIG_MALI_BASE_MODULES \
+    CONFIG_MALI_CSF_SUPPORT \
+    CONFIG_DMA_SHARED_BUFFER_TEST_EXPORTER \
+    CONFIG_MALI_MEMORY_GROUP_MANAGER \
+    CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR
+
+
+#
+# MAKE_ARGS to pass the custom CONFIGs on out-of-tree build
+#
+# Generate the list of CONFIGs and values.
+# $(value config) is the name of the CONFIG option.
+# $(value $(value config)) is its value (y, m).
+# When the CONFIG is not set to y or m, it defaults to n.
+MAKE_ARGS := $(foreach config,$(CONFIGS), \
+                    $(if $(filter y m,$(value $(value config))), \
+                        $(value config)=$(value $(value config)), \
+                        $(value config)=n))
+
+#
+# EXTRA_CFLAGS to define the custom CONFIGs on out-of-tree build
+#
+# Generate the list of CONFIGs defines with values from CONFIGS.
+# $(value config) is the name of the CONFIG option.
+# When set to y or m, the CONFIG gets defined to 1.
+EXTRA_CFLAGS := $(foreach config,$(CONFIGS), \
+                    $(if $(filter y m,$(value $(value config))), \
+                        -D$(value config)=1))
+
+all:
+	$(MAKE) -C $(KDIR) M=$(CURDIR) $(MAKE_ARGS) EXTRA_CFLAGS="$(EXTRA_CFLAGS)" KBUILD_EXTRA_SYMBOLS="$(EXTRA_SYMBOLS)" modules
+
+modules_install:
+	$(MAKE) -C $(KDIR) M=$(CURDIR) $(MAKE_ARGS) modules_install
+
+clean:
+	$(MAKE) -C $(KDIR) M=$(CURDIR) $(MAKE_ARGS) clean
diff --git a/drivers/base/arm/Mconfig b/drivers/base/arm/Mconfig
new file mode 100644
index 000000000000..d21a72e4b9a7
--- /dev/null
+++ b/drivers/base/arm/Mconfig
@@ -0,0 +1,64 @@
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+#
+# (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
+#
+# This program is free software and is provided to you under the terms of the
+# GNU General Public License version 2 as published by the Free Software
+# Foundation, and any use by you of this program is subject to the terms
+# of such GNU license.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can access it online at
+# http://www.gnu.org/licenses/gpl-2.0.html.
+#
+#
+
+menuconfig MALI_BASE_MODULES
+	bool "Mali Base extra modules"
+	default y if BACKEND_KERNEL
+	help
+	  Enable this option to build support for a Arm Mali base modules.
+	  Those modules provide extra features or debug interfaces and,
+	  are optional for the use of the Mali GPU modules.
+
+config DMA_SHARED_BUFFER_TEST_EXPORTER
+	bool "Build dma-buf framework test exporter module"
+	depends on MALI_BASE_MODULES
+	default y
+	help
+	  This option will build the dma-buf framework test exporter module.
+	  Usable to help test importers.
+
+	  Modules:
+	    - dma-buf-test-exporter.ko
+
+config MALI_MEMORY_GROUP_MANAGER
+	bool "Build Mali Memory Group Manager module"
+	depends on MALI_BASE_MODULES
+	default y
+	help
+	  This option will build the memory group manager module.
+	  This is an example implementation for allocation and release of pages
+	  for memory pools managed by Mali GPU device drivers.
+
+	  Modules:
+	    - memory_group_manager.ko
+
+config MALI_PROTECTED_MEMORY_ALLOCATOR
+	bool "Build Mali Protected Memory Allocator module"
+	depends on MALI_BASE_MODULES && GPU_HAS_CSF
+	default y
+	help
+	  This option will build the protected memory allocator module.
+	  This is an example implementation for allocation and release of pages
+	  of secure memory intended to be used by the firmware
+	  of Mali GPU device drivers.
+
+	  Modules:
+	    - protected_memory_allocator.ko
+
diff --git a/drivers/gpu/arm/bifrost/tests/kutf/Kconfig b/drivers/base/arm/dma_buf_lock/src/Kbuild
similarity index 69%
rename from drivers/gpu/arm/bifrost/tests/kutf/Kconfig
rename to drivers/base/arm/dma_buf_lock/src/Kbuild
index 7ea95b600160..c7ae3324e798 100644
--- a/drivers/gpu/arm/bifrost/tests/kutf/Kconfig
+++ b/drivers/base/arm/dma_buf_lock/src/Kbuild
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2012, 2020-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
@@ -18,9 +18,6 @@
 #
 #
 
-config MALI_KUTF
- tristate "Mali Kernel Unit Test Framework"
- default m
- help
-   Enables MALI testing framework. To compile it as a module,
-   choose M here - this will generate a single module called kutf.
+ifeq ($(CONFIG_DMA_SHARED_BUFFER), y)
+obj-m := dma_buf_lock.o
+endif
diff --git a/drivers/base/arm/memory_group_manager/Makefile b/drivers/base/arm/dma_buf_lock/src/Makefile
similarity index 85%
rename from drivers/base/arm/memory_group_manager/Makefile
rename to drivers/base/arm/dma_buf_lock/src/Makefile
index 4f1ef727cb23..451d2d710123 100644
--- a/drivers/base/arm/memory_group_manager/Makefile
+++ b/drivers/base/arm/dma_buf_lock/src/Makefile
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2012, 2020-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
@@ -27,8 +27,10 @@ ARCH ?= $(shell uname -m)
 KERNEL_SRC ?= /lib/modules/$(shell uname -r)/build
 KDIR ?= $(KERNEL_SRC)
 
-all:
-	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) EXTRA_CFLAGS="-I$(CURDIR)/../../../../include" modules CONFIG_MALI_MEMORY_GROUP_MANAGER=m
+all: dma_buf_lock
+
+dma_buf_lock:
+	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) EXTRA_CFLAGS="-I$(CURDIR)/../../../../../include"
 
 clean:
 	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) clean
diff --git a/drivers/base/arm/dma_buf_lock/src/dma_buf_lock.c b/drivers/base/arm/dma_buf_lock/src/dma_buf_lock.c
new file mode 100644
index 000000000000..f5ab1ed8f405
--- /dev/null
+++ b/drivers/base/arm/dma_buf_lock/src/dma_buf_lock.c
@@ -0,0 +1,898 @@
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+/*
+ *
+ * (C) COPYRIGHT 2012-2014, 2017-2018, 2020-2021 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+#include <linux/version.h>
+#include <linux/uaccess.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/fs.h>
+#include <linux/cdev.h>
+#include <linux/device.h>
+#include <linux/slab.h>
+#include <linux/atomic.h>
+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
+#include <linux/reservation.h>
+#else
+#include <linux/dma-resv.h>
+#endif
+#include <linux/dma-buf.h>
+#include <linux/wait.h>
+#include <linux/sched.h>
+#include <linux/poll.h>
+#include <linux/anon_inodes.h>
+#include <linux/file.h>
+
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
+
+#include <linux/fence.h>
+
+#define dma_fence_context_alloc(a) fence_context_alloc(a)
+#define dma_fence_init(a, b, c, d, e) fence_init(a, b, c, d, e)
+#define dma_fence_get(a) fence_get(a)
+#define dma_fence_put(a) fence_put(a)
+#define dma_fence_signal(a) fence_signal(a)
+#define dma_fence_is_signaled(a) fence_is_signaled(a)
+#define dma_fence_add_callback(a, b, c) fence_add_callback(a, b, c)
+#define dma_fence_remove_callback(a, b) fence_remove_callback(a, b)
+
+#if (KERNEL_VERSION(4, 9, 68) > LINUX_VERSION_CODE)
+#define dma_fence_get_status(a) (fence_is_signaled(a) ? (a)->status ?: 1 : 0)
+#else
+#define dma_fence_get_status(a) (fence_is_signaled(a) ? (a)->error ?: 1 : 0)
+#endif
+
+#else
+
+#include <linux/dma-fence.h>
+
+#if (KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE)
+#define dma_fence_get_status(a) (dma_fence_is_signaled(a) ? \
+	(a)->status ?: 1 \
+	: 0)
+#endif
+
+#endif /* < 4.10.0 */
+
+#include "dma_buf_lock.h"
+
+/* Maximum number of buffers that a single handle can address */
+#define DMA_BUF_LOCK_BUF_MAX 32
+
+#define DMA_BUF_LOCK_DEBUG 1
+
+#define DMA_BUF_LOCK_INIT_BIAS  0xFF
+
+static dev_t dma_buf_lock_dev;
+static struct cdev dma_buf_lock_cdev;
+static struct class *dma_buf_lock_class;
+static char dma_buf_lock_dev_name[] = "dma_buf_lock";
+
+#ifdef HAVE_UNLOCKED_IOCTL
+static long dma_buf_lock_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
+#else
+static int dma_buf_lock_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);
+#endif
+
+static struct file_operations dma_buf_lock_fops =
+{
+	.owner   = THIS_MODULE,
+#ifdef HAVE_UNLOCKED_IOCTL
+	.unlocked_ioctl   = dma_buf_lock_ioctl,
+#else
+	.ioctl   = dma_buf_lock_ioctl,
+#endif
+	.compat_ioctl   = dma_buf_lock_ioctl,
+};
+
+typedef struct dma_buf_lock_resource
+{
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
+	struct fence fence;
+#else
+	struct dma_fence fence;
+#endif
+	int *list_of_dma_buf_fds;               /* List of buffers copied from userspace */
+	atomic_t locked;                        /* Status of lock */
+	struct dma_buf **dma_bufs;
+	unsigned long exclusive;                /* Exclusive access bitmap */
+	atomic_t fence_dep_count;		/* Number of dma-fence dependencies */
+	struct list_head dma_fence_callbacks;	/* list of all callbacks set up to wait on other fences */
+	wait_queue_head_t wait;
+	struct kref refcount;
+	struct list_head link;
+	struct work_struct work;
+	int count;
+} dma_buf_lock_resource;
+
+/**
+ * struct dma_buf_lock_fence_cb - Callback data struct for dma-fence
+ * @fence_cb: Callback function
+ * @fence:    Pointer to the fence object on which this callback is waiting
+ * @res:      Pointer to dma_buf_lock_resource that is waiting on this callback
+ * @node:     List head for linking this callback to the lock resource
+ */
+struct dma_buf_lock_fence_cb {
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
+	struct fence_cb fence_cb;
+	struct fence *fence;
+#else
+	struct dma_fence_cb fence_cb;
+	struct dma_fence *fence;
+#endif
+	struct dma_buf_lock_resource *res;
+	struct list_head node;
+};
+
+static LIST_HEAD(dma_buf_lock_resource_list);
+static DEFINE_MUTEX(dma_buf_lock_mutex);
+
+static inline int is_dma_buf_lock_file(struct file *);
+static void dma_buf_lock_dounlock(struct kref *ref);
+
+
+/*** dma_buf_lock fence part ***/
+
+/* Spin lock protecting all Mali fences as fence->lock. */
+static DEFINE_SPINLOCK(dma_buf_lock_fence_lock);
+
+static const char *
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
+dma_buf_lock_fence_get_driver_name(struct fence *fence)
+#else
+dma_buf_lock_fence_get_driver_name(struct dma_fence *fence)
+#endif
+{
+	return "dma_buf_lock";
+}
+
+static const char *
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
+dma_buf_lock_fence_get_timeline_name(struct fence *fence)
+#else
+dma_buf_lock_fence_get_timeline_name(struct dma_fence *fence)
+#endif
+{
+	return "dma_buf_lock.timeline";
+}
+
+static bool
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
+dma_buf_lock_fence_enable_signaling(struct fence *fence)
+#else
+dma_buf_lock_fence_enable_signaling(struct dma_fence *fence)
+#endif
+{
+	return true;
+}
+
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
+const struct fence_ops dma_buf_lock_fence_ops = {
+	.wait = fence_default_wait,
+#else
+const struct dma_fence_ops dma_buf_lock_fence_ops = {
+	.wait = dma_fence_default_wait,
+#endif
+	.get_driver_name = dma_buf_lock_fence_get_driver_name,
+	.get_timeline_name = dma_buf_lock_fence_get_timeline_name,
+	.enable_signaling = dma_buf_lock_fence_enable_signaling,
+};
+
+static void
+dma_buf_lock_fence_init(dma_buf_lock_resource *resource)
+{
+	dma_fence_init(&resource->fence,
+		       &dma_buf_lock_fence_ops,
+		       &dma_buf_lock_fence_lock,
+		       0,
+		       0);
+}
+
+static void
+dma_buf_lock_fence_free_callbacks(dma_buf_lock_resource *resource)
+{
+	struct dma_buf_lock_fence_cb *cb, *tmp;
+
+	/* Clean up and free callbacks. */
+	list_for_each_entry_safe(cb, tmp, &resource->dma_fence_callbacks, node) {
+		/* Cancel callbacks that hasn't been called yet and release the
+		 * reference taken in dma_buf_lock_fence_add_callback().
+		 */
+		dma_fence_remove_callback(cb->fence, &cb->fence_cb);
+		dma_fence_put(cb->fence);
+		list_del(&cb->node);
+		kfree(cb);
+	}
+}
+
+static void
+dma_buf_lock_fence_work(struct work_struct *pwork)
+{
+	dma_buf_lock_resource *resource =
+		container_of(pwork, dma_buf_lock_resource, work);
+
+	WARN_ON(atomic_read(&resource->fence_dep_count));
+	WARN_ON(!atomic_read(&resource->locked));
+	WARN_ON(!resource->exclusive);
+
+	mutex_lock(&dma_buf_lock_mutex);
+	kref_put(&resource->refcount, dma_buf_lock_dounlock);
+	mutex_unlock(&dma_buf_lock_mutex);
+}
+
+static void
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
+dma_buf_lock_fence_callback(struct fence *fence, struct fence_cb *cb)
+#else
+dma_buf_lock_fence_callback(struct dma_fence *fence, struct dma_fence_cb *cb)
+#endif
+{
+	struct dma_buf_lock_fence_cb *dma_buf_lock_cb = container_of(cb,
+				struct dma_buf_lock_fence_cb,
+				fence_cb);
+	dma_buf_lock_resource *resource = dma_buf_lock_cb->res;
+
+#if DMA_BUF_LOCK_DEBUG
+	printk(KERN_DEBUG "dma_buf_lock_fence_callback\n");
+#endif
+
+	/* Callback function will be invoked in atomic context. */
+
+	if (atomic_dec_and_test(&resource->fence_dep_count)) {
+		atomic_set(&resource->locked, 1);
+		wake_up(&resource->wait);
+
+		if (resource->exclusive)
+			/* Warn if the work was already queued */
+			WARN_ON(!schedule_work(&resource->work));
+	}
+}
+
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
+static int
+dma_buf_lock_fence_add_callback(dma_buf_lock_resource *resource,
+				struct fence *fence,
+				fence_func_t callback)
+#else
+static int
+dma_buf_lock_fence_add_callback(dma_buf_lock_resource *resource,
+				struct dma_fence *fence,
+				dma_fence_func_t callback)
+#endif
+{
+	int err = 0;
+	struct dma_buf_lock_fence_cb *fence_cb;
+
+	if (!fence)
+		return -EINVAL;
+
+	fence_cb = kmalloc(sizeof(*fence_cb), GFP_KERNEL);
+	if (!fence_cb)
+		return -ENOMEM;
+
+	fence_cb->fence = fence;
+	fence_cb->res   = resource;
+	INIT_LIST_HEAD(&fence_cb->node);
+
+	err = dma_fence_add_callback(fence, &fence_cb->fence_cb,
+				     callback);
+
+	if (err == -ENOENT) {
+		/* Fence signaled, get the completion result */
+		err = dma_fence_get_status(fence);
+
+		/* remap success completion to err code */
+		if (err == 1)
+			err = 0;
+
+		kfree(fence_cb);
+	} else if (err) {
+		kfree(fence_cb);
+	} else {
+		/*
+		 * Get reference to fence that will be kept until callback gets
+		 * cleaned up in dma_buf_lock_fence_free_callbacks().
+		 */
+		dma_fence_get(fence);
+		atomic_inc(&resource->fence_dep_count);
+		/* Add callback to resource's list of callbacks */
+		list_add(&fence_cb->node, &resource->dma_fence_callbacks);
+	}
+
+	return err;
+}
+
+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
+static int
+dma_buf_lock_add_fence_reservation_callback(dma_buf_lock_resource *resource,
+					    struct reservation_object *resv,
+					    bool exclusive)
+#else
+static int
+dma_buf_lock_add_fence_reservation_callback(dma_buf_lock_resource *resource,
+					    struct dma_resv *resv,
+					    bool exclusive)
+#endif
+{
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
+	struct fence *excl_fence = NULL;
+	struct fence **shared_fences = NULL;
+#else
+	struct dma_fence *excl_fence = NULL;
+	struct dma_fence **shared_fences = NULL;
+#endif
+	unsigned int shared_count = 0;
+	int err, i;
+
+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
+	err = reservation_object_get_fences_rcu(
+#else
+	err = dma_resv_get_fences_rcu(
+#endif
+						resv,
+						&excl_fence,
+						&shared_count,
+						&shared_fences);
+	if (err)
+		return err;
+
+	if (excl_fence) {
+		err = dma_buf_lock_fence_add_callback(resource,
+						      excl_fence,
+						      dma_buf_lock_fence_callback);
+
+		/* Release our reference, taken by reservation_object_get_fences_rcu(),
+		 * to the fence. We have set up our callback (if that was possible),
+		 * and it's the fence's owner is responsible for singling the fence
+		 * before allowing it to disappear.
+		 */
+		dma_fence_put(excl_fence);
+
+		if (err)
+			goto out;
+	}
+
+	if (exclusive) {
+		for (i = 0; i < shared_count; i++) {
+			err = dma_buf_lock_fence_add_callback(resource,
+							      shared_fences[i],
+							      dma_buf_lock_fence_callback);
+			if (err)
+				goto out;
+		}
+	}
+
+	/* Release all our references to the shared fences, taken by
+	 * reservation_object_get_fences_rcu(). We have set up our callback (if
+	 * that was possible), and it's the fence's owner is responsible for
+	 * signaling the fence before allowing it to disappear.
+	 */
+out:
+	for (i = 0; i < shared_count; i++)
+		dma_fence_put(shared_fences[i]);
+	kfree(shared_fences);
+
+	return err;
+}
+
+static void
+dma_buf_lock_release_fence_reservation(dma_buf_lock_resource *resource,
+				       struct ww_acquire_ctx *ctx)
+{
+	unsigned int r;
+
+	for (r = 0; r < resource->count; r++)
+		ww_mutex_unlock(&resource->dma_bufs[r]->resv->lock);
+	ww_acquire_fini(ctx);
+}
+
+static int
+dma_buf_lock_acquire_fence_reservation(dma_buf_lock_resource *resource,
+				       struct ww_acquire_ctx *ctx)
+{
+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
+	struct reservation_object *content_resv = NULL;
+#else
+	struct dma_resv *content_resv = NULL;
+#endif
+	unsigned int content_resv_idx = 0;
+	unsigned int r;
+	int err = 0;
+
+	ww_acquire_init(ctx, &reservation_ww_class);
+
+retry:
+	for (r = 0; r < resource->count; r++) {
+		if (resource->dma_bufs[r]->resv == content_resv) {
+			content_resv = NULL;
+			continue;
+		}
+
+		err = ww_mutex_lock(&resource->dma_bufs[r]->resv->lock, ctx);
+		if (err)
+			goto error;
+	}
+
+	ww_acquire_done(ctx);
+	return err;
+
+error:
+	content_resv_idx = r;
+
+	/* Unlock the locked one ones */
+	while (r--)
+		ww_mutex_unlock(&resource->dma_bufs[r]->resv->lock);
+
+	if (content_resv)
+		ww_mutex_unlock(&content_resv->lock);
+
+	/* If we deadlock try with lock_slow and retry */
+	if (err == -EDEADLK) {
+#if DMA_BUF_LOCK_DEBUG
+		printk(KERN_DEBUG "deadlock at dma_buf fd %i\n",
+		       resource->list_of_dma_buf_fds[content_resv_idx]);
+#endif
+		content_resv = resource->dma_bufs[content_resv_idx]->resv;
+		ww_mutex_lock_slow(&content_resv->lock, ctx);
+		goto retry;
+	}
+
+	/* If we are here the function failed */
+	ww_acquire_fini(ctx);
+	return err;
+}
+
+static int dma_buf_lock_handle_release(struct inode *inode, struct file *file)
+{
+	dma_buf_lock_resource *resource;
+
+	if (!is_dma_buf_lock_file(file))
+		return -EINVAL;
+
+	resource = file->private_data;
+#if DMA_BUF_LOCK_DEBUG
+	printk("dma_buf_lock_handle_release\n");
+#endif
+	mutex_lock(&dma_buf_lock_mutex);
+	kref_put(&resource->refcount, dma_buf_lock_dounlock);
+	mutex_unlock(&dma_buf_lock_mutex);
+
+	return 0;
+}
+
+static unsigned int dma_buf_lock_handle_poll(struct file *file,
+                                             struct poll_table_struct *wait)
+{
+	dma_buf_lock_resource *resource;
+	unsigned int ret = 0;
+
+	if (!is_dma_buf_lock_file(file))
+		return POLLERR;
+
+	resource = file->private_data;
+#if DMA_BUF_LOCK_DEBUG
+	printk("dma_buf_lock_handle_poll\n");
+#endif
+	if (atomic_read(&resource->locked) == 1) {
+		/* Resources have been locked */
+		ret = POLLIN | POLLRDNORM;
+		if (resource->exclusive)
+			ret |=  POLLOUT | POLLWRNORM;
+	}
+	else
+	{
+		if (!poll_does_not_wait(wait))
+			poll_wait(file, &resource->wait, wait);
+	}
+#if DMA_BUF_LOCK_DEBUG
+	printk("dma_buf_lock_handle_poll : return %i\n", ret);
+#endif
+	return ret;
+}
+
+static const struct file_operations dma_buf_lock_handle_fops = {
+	.owner		= THIS_MODULE,
+	.release	= dma_buf_lock_handle_release,
+	.poll		= dma_buf_lock_handle_poll,
+};
+
+/*
+ * is_dma_buf_lock_file - Check if struct file* is associated with dma_buf_lock
+ */
+static inline int is_dma_buf_lock_file(struct file *file)
+{
+	return file->f_op == &dma_buf_lock_handle_fops;
+}
+
+
+
+/*
+ * Start requested lock.
+ *
+ * Allocates required memory, copies dma_buf_fd list from userspace,
+ * acquires related reservation objects, and starts the lock.
+ */
+static int dma_buf_lock_dolock(dma_buf_lock_k_request *request)
+{
+	dma_buf_lock_resource *resource;
+	struct ww_acquire_ctx ww_ctx;
+	int size;
+	int fd;
+	int i;
+	int ret;
+
+	if (request->list_of_dma_buf_fds == NULL)
+		return -EINVAL;
+	if (request->count <= 0)
+		return -EINVAL;
+	if (request->count > DMA_BUF_LOCK_BUF_MAX)
+		return -EINVAL;
+	if (request->exclusive != DMA_BUF_LOCK_NONEXCLUSIVE &&
+	    request->exclusive != DMA_BUF_LOCK_EXCLUSIVE)
+		return -EINVAL;
+
+	resource = kzalloc(sizeof(dma_buf_lock_resource), GFP_KERNEL);
+	if (resource == NULL)
+		return -ENOMEM;
+
+	atomic_set(&resource->locked, 0);
+	kref_init(&resource->refcount);
+	INIT_LIST_HEAD(&resource->link);
+	INIT_WORK(&resource->work, dma_buf_lock_fence_work);
+	resource->count = request->count;
+
+	/* Allocate space to store dma_buf_fds received from user space */
+	size = request->count * sizeof(int);
+	resource->list_of_dma_buf_fds = kmalloc(size, GFP_KERNEL);
+
+	if (resource->list_of_dma_buf_fds == NULL) {
+		kfree(resource);
+		return -ENOMEM;
+	}
+
+	/* Allocate space to store dma_buf pointers associated with dma_buf_fds */
+	size = sizeof(struct dma_buf *) * request->count;
+	resource->dma_bufs = kmalloc(size, GFP_KERNEL);
+
+	if (resource->dma_bufs == NULL) {
+		kfree(resource->list_of_dma_buf_fds);
+		kfree(resource);
+		return -ENOMEM;
+	}
+
+	/* Copy requested list of dma_buf_fds from user space */
+	size = request->count * sizeof(int);
+	if (copy_from_user(resource->list_of_dma_buf_fds,
+			   (void __user *)request->list_of_dma_buf_fds,
+			   size) != 0) {
+		kfree(resource->list_of_dma_buf_fds);
+		kfree(resource->dma_bufs);
+		kfree(resource);
+		return -ENOMEM;
+	}
+#if DMA_BUF_LOCK_DEBUG
+	for (i = 0; i < request->count; i++)
+		printk("dma_buf %i = %X\n", i, resource->list_of_dma_buf_fds[i]);
+#endif
+
+	/* Initialize the fence associated with dma_buf_lock resource */
+	dma_buf_lock_fence_init(resource);
+
+	INIT_LIST_HEAD(&resource->dma_fence_callbacks);
+
+	atomic_set(&resource->fence_dep_count, DMA_BUF_LOCK_INIT_BIAS);
+
+	/* Add resource to global list */
+	mutex_lock(&dma_buf_lock_mutex);
+
+	list_add(&resource->link, &dma_buf_lock_resource_list);
+
+	mutex_unlock(&dma_buf_lock_mutex);
+
+	for (i = 0; i < request->count; i++)
+	{
+		/* Convert fd into dma_buf structure */
+		resource->dma_bufs[i] = dma_buf_get(resource->list_of_dma_buf_fds[i]);
+
+		if (IS_ERR_VALUE(PTR_ERR(resource->dma_bufs[i])))
+		{
+			mutex_lock(&dma_buf_lock_mutex);
+			kref_put(&resource->refcount, dma_buf_lock_dounlock);
+			mutex_unlock(&dma_buf_lock_mutex);
+			return -EINVAL;
+		}
+
+		/*Check the reservation object associated with dma_buf */
+		if (resource->dma_bufs[i]->resv == NULL) {
+			mutex_lock(&dma_buf_lock_mutex);
+			kref_put(&resource->refcount, dma_buf_lock_dounlock);
+			mutex_unlock(&dma_buf_lock_mutex);
+			return -EINVAL;
+		}
+#if DMA_BUF_LOCK_DEBUG
+		printk(KERN_DEBUG "dma_buf_lock_dolock : dma_buf_fd %i dma_buf %p dma_fence reservation %p\n",
+		       resource->list_of_dma_buf_fds[i], resource->dma_bufs[i], resource->dma_bufs[i]->resv);
+#endif
+	}
+
+	init_waitqueue_head(&resource->wait);
+
+	kref_get(&resource->refcount);
+
+	/* Create file descriptor associated with lock request */
+	fd = anon_inode_getfd("dma_buf_lock", &dma_buf_lock_handle_fops,
+	                      (void *)resource, 0);
+	if (fd < 0)
+	{
+		mutex_lock(&dma_buf_lock_mutex);
+		kref_put(&resource->refcount, dma_buf_lock_dounlock);
+		kref_put(&resource->refcount, dma_buf_lock_dounlock);
+		mutex_unlock(&dma_buf_lock_mutex);
+		return fd;
+	}
+
+	resource->exclusive = request->exclusive;
+
+	/* Start locking process */
+	ret = dma_buf_lock_acquire_fence_reservation(resource, &ww_ctx);
+	if (ret) {
+#if DMA_BUF_LOCK_DEBUG
+		printk(KERN_DEBUG "dma_buf_lock_dolock : Error %d locking reservations.\n", ret);
+#endif
+		put_unused_fd(fd);
+		mutex_lock(&dma_buf_lock_mutex);
+		kref_put(&resource->refcount, dma_buf_lock_dounlock);
+		kref_put(&resource->refcount, dma_buf_lock_dounlock);
+		mutex_unlock(&dma_buf_lock_mutex);
+		return ret;
+	}
+
+	/* Take an extra reference for exclusive access, which will be dropped
+	 * once the pre-existing fences attached to dma-buf resources, for which
+	 * we have commited for exclusive access, are signaled.
+	 * At a given time there can be only one exclusive fence attached to a
+	 * reservation object, so the new exclusive fence replaces the original
+	 * fence and the future sync is done against the new fence which is
+	 * supposed to be signaled only after the original fence was signaled.
+	 * If the new exclusive fence is signaled prematurely then the resources
+	 * would become available for new access while they are already being
+	 * written to by the original owner.
+	 */
+	if (resource->exclusive)
+		kref_get(&resource->refcount);
+
+	for (i = 0; i < request->count; i++) {
+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
+		struct reservation_object *resv = resource->dma_bufs[i]->resv;
+#else
+		struct dma_resv *resv = resource->dma_bufs[i]->resv;
+#endif
+		if (!test_bit(i, &resource->exclusive)) {
+
+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
+			ret = reservation_object_reserve_shared(resv);
+#else
+			ret = dma_resv_reserve_shared(resv, 0);
+#endif
+			if (ret) {
+#if DMA_BUF_LOCK_DEBUG
+				printk(KERN_DEBUG "dma_buf_lock_dolock : Error %d reserving space for shared fence.\n", ret);
+#endif
+				break;
+			}
+
+			ret = dma_buf_lock_add_fence_reservation_callback(resource,
+									  resv,
+									  false);
+			if (ret) {
+#if DMA_BUF_LOCK_DEBUG
+				printk(KERN_DEBUG "dma_buf_lock_dolock : Error %d adding reservation to callback.\n", ret);
+#endif
+				break;
+			}
+
+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
+			reservation_object_add_shared_fence(resv, &resource->fence);
+#else
+			dma_resv_add_shared_fence(resv, &resource->fence);
+#endif
+		} else {
+			ret = dma_buf_lock_add_fence_reservation_callback(resource,
+									  resv,
+									  true);
+			if (ret) {
+#if DMA_BUF_LOCK_DEBUG
+				printk(KERN_DEBUG "dma_buf_lock_dolock : Error %d adding reservation to callback.\n", ret);
+#endif
+				break;
+			}
+
+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
+			reservation_object_add_excl_fence(resv, &resource->fence);
+#else
+			dma_resv_add_excl_fence(resv, &resource->fence);
+#endif
+		}
+	}
+
+	dma_buf_lock_release_fence_reservation(resource, &ww_ctx);
+
+	/* Test if the callbacks were already triggered */
+	if (!atomic_sub_return(DMA_BUF_LOCK_INIT_BIAS, &resource->fence_dep_count)) {
+		atomic_set(&resource->locked, 1);
+
+		/* Drop the extra reference taken for exclusive access */
+		if (resource->exclusive)
+			dma_buf_lock_fence_work(&resource->work);
+	}
+
+	if (IS_ERR_VALUE((unsigned long)ret))
+	{
+		put_unused_fd(fd);
+
+		mutex_lock(&dma_buf_lock_mutex);
+		kref_put(&resource->refcount, dma_buf_lock_dounlock);
+		kref_put(&resource->refcount, dma_buf_lock_dounlock);
+		mutex_unlock(&dma_buf_lock_mutex);
+
+		return ret;
+	}
+
+#if DMA_BUF_LOCK_DEBUG
+	printk("dma_buf_lock_dolock : complete\n");
+#endif
+	mutex_lock(&dma_buf_lock_mutex);
+	kref_put(&resource->refcount, dma_buf_lock_dounlock);
+	mutex_unlock(&dma_buf_lock_mutex);
+
+	return fd;
+}
+
+static void dma_buf_lock_dounlock(struct kref *ref)
+{
+	int i;
+	dma_buf_lock_resource *resource = container_of(ref, dma_buf_lock_resource, refcount);
+
+	atomic_set(&resource->locked, 0);
+
+	/* Signal the resource's fence. */
+	dma_fence_signal(&resource->fence);
+
+	dma_buf_lock_fence_free_callbacks(resource);
+
+	list_del(&resource->link);
+
+	for (i = 0; i < resource->count; i++)
+	{
+		if (resource->dma_bufs[i])
+			dma_buf_put(resource->dma_bufs[i]);
+	}
+
+	kfree(resource->dma_bufs);
+	kfree(resource->list_of_dma_buf_fds);
+	dma_fence_put(&resource->fence);
+}
+
+static int __init dma_buf_lock_init(void)
+{
+	int err;
+#if DMA_BUF_LOCK_DEBUG
+	printk("dma_buf_lock_init\n");
+#endif
+	err = alloc_chrdev_region(&dma_buf_lock_dev, 0, 1, dma_buf_lock_dev_name);
+
+	if (err == 0) {
+		cdev_init(&dma_buf_lock_cdev, &dma_buf_lock_fops);
+
+		err = cdev_add(&dma_buf_lock_cdev, dma_buf_lock_dev, 1);
+
+		if (err == 0) {
+			dma_buf_lock_class = class_create(THIS_MODULE, dma_buf_lock_dev_name);
+			if (IS_ERR(dma_buf_lock_class))
+				err = PTR_ERR(dma_buf_lock_class);
+			else
+			{
+				struct device *mdev;
+				mdev = device_create(dma_buf_lock_class, NULL, dma_buf_lock_dev, NULL, dma_buf_lock_dev_name);
+				if (!IS_ERR(mdev))
+					return 0;
+
+				err = PTR_ERR(mdev);
+				class_destroy(dma_buf_lock_class);
+			}
+			cdev_del(&dma_buf_lock_cdev);
+		}
+
+		unregister_chrdev_region(dma_buf_lock_dev, 1);
+	}
+#if DMA_BUF_LOCK_DEBUG
+	printk("dma_buf_lock_init failed\n");
+#endif
+	return err;
+}
+
+static void __exit dma_buf_lock_exit(void)
+{
+#if DMA_BUF_LOCK_DEBUG
+	printk("dma_buf_lock_exit\n");
+#endif
+
+	/* Unlock all outstanding references */
+	while (1)
+	{
+		mutex_lock(&dma_buf_lock_mutex);
+		if (list_empty(&dma_buf_lock_resource_list))
+		{
+			mutex_unlock(&dma_buf_lock_mutex);
+			break;
+		}
+		else
+		{
+			dma_buf_lock_resource *resource = list_entry(dma_buf_lock_resource_list.next,
+			                                             dma_buf_lock_resource, link);
+			kref_put(&resource->refcount, dma_buf_lock_dounlock);
+			mutex_unlock(&dma_buf_lock_mutex);
+		}
+	}
+
+	device_destroy(dma_buf_lock_class, dma_buf_lock_dev);
+
+	class_destroy(dma_buf_lock_class);
+
+	cdev_del(&dma_buf_lock_cdev);
+
+	unregister_chrdev_region(dma_buf_lock_dev, 1);
+}
+
+#ifdef HAVE_UNLOCKED_IOCTL
+static long dma_buf_lock_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
+#else
+static int dma_buf_lock_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
+#endif
+{
+	dma_buf_lock_k_request request;
+	int size = _IOC_SIZE(cmd);
+
+	if (_IOC_TYPE(cmd) != DMA_BUF_LOCK_IOC_MAGIC)
+		return -ENOTTY;
+	if ((_IOC_NR(cmd) < DMA_BUF_LOCK_IOC_MINNR) || (_IOC_NR(cmd) > DMA_BUF_LOCK_IOC_MAXNR))
+		return -ENOTTY;
+
+	switch (cmd)
+	{
+		case DMA_BUF_LOCK_FUNC_LOCK_ASYNC:
+			if (size != sizeof(dma_buf_lock_k_request))
+				return -ENOTTY;
+			if (copy_from_user(&request, (void __user *)arg, size))
+				return -EFAULT;
+#if DMA_BUF_LOCK_DEBUG
+			printk("DMA_BUF_LOCK_FUNC_LOCK_ASYNC - %i\n", request.count);
+#endif
+			return dma_buf_lock_dolock(&request);
+	}
+
+	return -ENOTTY;
+}
+
+module_init(dma_buf_lock_init);
+module_exit(dma_buf_lock_exit);
+
+MODULE_LICENSE("GPL");
+
diff --git a/drivers/base/arm/dma_buf_lock/src/dma_buf_lock.h b/drivers/base/arm/dma_buf_lock/src/dma_buf_lock.h
new file mode 100644
index 000000000000..104af1f20503
--- /dev/null
+++ b/drivers/base/arm/dma_buf_lock/src/dma_buf_lock.h
@@ -0,0 +1,46 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+/*
+ *
+ * (C) COPYRIGHT 2012, 2020-2021 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+#ifndef _DMA_BUF_LOCK_H
+#define _DMA_BUF_LOCK_H
+
+typedef enum dma_buf_lock_exclusive
+{
+	DMA_BUF_LOCK_NONEXCLUSIVE = 0,
+	DMA_BUF_LOCK_EXCLUSIVE = -1
+} dma_buf_lock_exclusive;
+
+typedef struct dma_buf_lock_k_request
+{
+	int count;
+	int *list_of_dma_buf_fds;
+	int timeout;
+	dma_buf_lock_exclusive exclusive;
+} dma_buf_lock_k_request;
+
+#define DMA_BUF_LOCK_IOC_MAGIC '~'
+
+#define DMA_BUF_LOCK_FUNC_LOCK_ASYNC       _IOW(DMA_BUF_LOCK_IOC_MAGIC, 11, dma_buf_lock_k_request)
+
+#define DMA_BUF_LOCK_IOC_MINNR 11
+#define DMA_BUF_LOCK_IOC_MAXNR 11
+
+#endif /* _DMA_BUF_LOCK_H */
diff --git a/drivers/base/arm/dma_buf_test_exporter/Kbuild b/drivers/base/arm/dma_buf_test_exporter/Kbuild
new file mode 100644
index 000000000000..0e20cb44543e
--- /dev/null
+++ b/drivers/base/arm/dma_buf_test_exporter/Kbuild
@@ -0,0 +1,23 @@
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+#
+# (C) COPYRIGHT 2012, 2020-2021 ARM Limited. All rights reserved.
+#
+# This program is free software and is provided to you under the terms of the
+# GNU General Public License version 2 as published by the Free Software
+# Foundation, and any use by you of this program is subject to the terms
+# of such GNU license.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can access it online at
+# http://www.gnu.org/licenses/gpl-2.0.html.
+#
+#
+
+ifeq ($(CONFIG_DMA_SHARED_BUFFER_TEST_EXPORTER), y)
+obj-m += dma-buf-test-exporter.o
+endif
diff --git a/drivers/base/arm/dma_buf_test_exporter/build.bp b/drivers/base/arm/dma_buf_test_exporter/build.bp
new file mode 100644
index 000000000000..a49fb81d6665
--- /dev/null
+++ b/drivers/base/arm/dma_buf_test_exporter/build.bp
@@ -0,0 +1,36 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+/*
+ *
+ * (C) COPYRIGHT 2017, 2020-2021 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+bob_kernel_module {
+    name: "dma-buf-test-exporter",
+    defaults: [
+        "kernel_defaults"
+    ],
+    srcs: [
+        "Kbuild",
+        "dma-buf-test-exporter.c",
+    ],
+    enabled: false,
+    dma_shared_buffer_test_exporter: {
+        kbuild_options: ["CONFIG_DMA_SHARED_BUFFER_TEST_EXPORTER=y"],
+        enabled: true,
+    },
+}
diff --git a/drivers/base/arm/dma_buf_test_exporter/dma-buf-test-exporter.c b/drivers/base/arm/dma_buf_test_exporter/dma-buf-test-exporter.c
new file mode 100644
index 000000000000..ccf73ccbcc3f
--- /dev/null
+++ b/drivers/base/arm/dma_buf_test_exporter/dma-buf-test-exporter.c
@@ -0,0 +1,824 @@
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+/*
+ *
+ * (C) COPYRIGHT 2012-2021 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+#include <linux/dma-buf-test-exporter.h>
+#include <linux/dma-buf.h>
+#include <linux/miscdevice.h>
+#include <linux/slab.h>
+#include <linux/uaccess.h>
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/fs.h>
+#include <linux/atomic.h>
+#include <linux/mm.h>
+#include <linux/highmem.h>
+#if (KERNEL_VERSION(4, 8, 0) > LINUX_VERSION_CODE)
+#include <linux/dma-attrs.h>
+#endif
+#include <linux/dma-mapping.h>
+
+/* Maximum size allowed in a single DMA_BUF_TE_ALLOC call */
+#define DMA_BUF_TE_ALLOC_MAX_SIZE ((8ull << 30) >> PAGE_SHIFT) /* 8 GB */
+
+/* Since kernel version 5.0 CONFIG_ARCH_NO_SG_CHAIN replaced CONFIG_ARCH_HAS_SG_CHAIN */
+#if KERNEL_VERSION(5, 0, 0) > LINUX_VERSION_CODE
+#if (!defined(ARCH_HAS_SG_CHAIN) && !defined(CONFIG_ARCH_HAS_SG_CHAIN))
+#define NO_SG_CHAIN
+#endif
+#elif defined(CONFIG_ARCH_NO_SG_CHAIN)
+#define NO_SG_CHAIN
+#endif
+
+struct dma_buf_te_alloc {
+	/* the real alloc */
+	size_t nr_pages;
+	struct page **pages;
+
+	/* the debug usage tracking */
+	int nr_attached_devices;
+	int nr_device_mappings;
+	int nr_cpu_mappings;
+
+	/* failure simulation */
+	int fail_attach;
+	int fail_map;
+	int fail_mmap;
+
+	bool contiguous;
+	dma_addr_t contig_dma_addr;
+	void *contig_cpu_addr;
+};
+
+struct dma_buf_te_attachment {
+	struct sg_table *sg;
+	bool attachment_mapped;
+};
+
+static struct miscdevice te_device;
+
+#if (KERNEL_VERSION(4, 19, 0) > LINUX_VERSION_CODE)
+static int dma_buf_te_attach(struct dma_buf *buf, struct device *dev, struct dma_buf_attachment *attachment)
+#else
+static int dma_buf_te_attach(struct dma_buf *buf, struct dma_buf_attachment *attachment)
+#endif
+{
+	struct dma_buf_te_alloc	*alloc;
+	alloc = buf->priv;
+
+	if (alloc->fail_attach)
+		return -EFAULT;
+
+	attachment->priv = kzalloc(sizeof(struct dma_buf_te_attachment), GFP_KERNEL);
+	if (!attachment->priv)
+		return -ENOMEM;
+
+	/* dma_buf is externally locked during call */
+	alloc->nr_attached_devices++;
+	return 0;
+}
+
+static void dma_buf_te_detach(struct dma_buf *buf, struct dma_buf_attachment *attachment)
+{
+	struct dma_buf_te_alloc *alloc = buf->priv;
+	struct dma_buf_te_attachment *pa = attachment->priv;
+
+	/* dma_buf is externally locked during call */
+
+	WARN(pa->attachment_mapped, "WARNING: dma-buf-test-exporter detected detach with open device mappings");
+
+	alloc->nr_attached_devices--;
+
+	kfree(pa);
+}
+
+static struct sg_table *dma_buf_te_map(struct dma_buf_attachment *attachment, enum dma_data_direction direction)
+{
+	struct sg_table *sg;
+	struct scatterlist *iter;
+	struct dma_buf_te_alloc	*alloc;
+	struct dma_buf_te_attachment *pa = attachment->priv;
+	size_t i;
+	int ret;
+
+	alloc = attachment->dmabuf->priv;
+
+	if (alloc->fail_map)
+		return ERR_PTR(-ENOMEM);
+
+	if (WARN(pa->attachment_mapped,
+	    "WARNING: Attempted to map already mapped attachment."))
+		return ERR_PTR(-EBUSY);
+
+#ifdef NO_SG_CHAIN
+	/* if the ARCH can't chain we can't have allocs larger than a single sg can hold */
+	if (alloc->nr_pages > SG_MAX_SINGLE_ALLOC)
+		return ERR_PTR(-EINVAL);
+#endif /* NO_SG_CHAIN */
+
+	sg = kmalloc(sizeof(struct sg_table), GFP_KERNEL);
+	if (!sg)
+		return ERR_PTR(-ENOMEM);
+
+	/* from here we access the allocation object, so lock the dmabuf pointing to it */
+	mutex_lock(&attachment->dmabuf->lock);
+
+	if (alloc->contiguous)
+		ret = sg_alloc_table(sg, 1, GFP_KERNEL);
+	else
+		ret = sg_alloc_table(sg, alloc->nr_pages, GFP_KERNEL);
+	if (ret) {
+		mutex_unlock(&attachment->dmabuf->lock);
+		kfree(sg);
+		return ERR_PTR(ret);
+	}
+
+	if (alloc->contiguous) {
+		sg_dma_len(sg->sgl) = alloc->nr_pages * PAGE_SIZE;
+		sg_set_page(sg->sgl, pfn_to_page(PFN_DOWN(alloc->contig_dma_addr)), alloc->nr_pages * PAGE_SIZE, 0);
+		sg_dma_address(sg->sgl) = alloc->contig_dma_addr;
+	} else {
+		for_each_sg(sg->sgl, iter, alloc->nr_pages, i)
+			sg_set_page(iter, alloc->pages[i], PAGE_SIZE, 0);
+	}
+
+	if (!dma_map_sg(attachment->dev, sg->sgl, sg->nents, direction)) {
+		mutex_unlock(&attachment->dmabuf->lock);
+		sg_free_table(sg);
+		kfree(sg);
+		return ERR_PTR(-ENOMEM);
+	}
+
+	alloc->nr_device_mappings++;
+	pa->attachment_mapped = true;
+	pa->sg = sg;
+	mutex_unlock(&attachment->dmabuf->lock);
+	return sg;
+}
+
+static void dma_buf_te_unmap(struct dma_buf_attachment *attachment,
+							 struct sg_table *sg, enum dma_data_direction direction)
+{
+	struct dma_buf_te_alloc *alloc;
+	struct dma_buf_te_attachment *pa = attachment->priv;
+
+	alloc = attachment->dmabuf->priv;
+
+	mutex_lock(&attachment->dmabuf->lock);
+
+	WARN(!pa->attachment_mapped, "WARNING: Unmatched unmap of attachment.");
+
+	alloc->nr_device_mappings--;
+	pa->attachment_mapped = false;
+	pa->sg = NULL;
+	mutex_unlock(&attachment->dmabuf->lock);
+
+	dma_unmap_sg(attachment->dev, sg->sgl, sg->nents, direction);
+	sg_free_table(sg);
+	kfree(sg);
+}
+
+static void dma_buf_te_release(struct dma_buf *buf)
+{
+	size_t i;
+	struct dma_buf_te_alloc *alloc;
+	alloc = buf->priv;
+	/* no need for locking */
+
+	if (alloc->contiguous) {
+#if (KERNEL_VERSION(4, 8, 0) <= LINUX_VERSION_CODE)
+		dma_free_attrs(te_device.this_device,
+						alloc->nr_pages * PAGE_SIZE,
+						alloc->contig_cpu_addr,
+						alloc->contig_dma_addr,
+						DMA_ATTR_WRITE_COMBINE);
+#else
+		DEFINE_DMA_ATTRS(attrs);
+
+		dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs);
+		dma_free_attrs(te_device.this_device,
+						alloc->nr_pages * PAGE_SIZE,
+						alloc->contig_cpu_addr, alloc->contig_dma_addr, &attrs);
+#endif
+	} else {
+		for (i = 0; i < alloc->nr_pages; i++)
+			__free_page(alloc->pages[i]);
+	}
+#if (KERNEL_VERSION(4, 12, 0) <= LINUX_VERSION_CODE)
+	kvfree(alloc->pages);
+#else
+	kfree(alloc->pages);
+#endif
+	kfree(alloc);
+}
+
+static int dma_buf_te_sync(struct dma_buf *dmabuf,
+			enum dma_data_direction direction,
+			bool start_cpu_access)
+{
+	struct dma_buf_attachment *attachment;
+
+	mutex_lock(&dmabuf->lock);
+
+	list_for_each_entry(attachment, &dmabuf->attachments, node) {
+		struct dma_buf_te_attachment *pa = attachment->priv;
+		struct sg_table *sg = pa->sg;
+		if (!sg) {
+			dev_dbg(te_device.this_device, "no mapping for device %s\n", dev_name(attachment->dev));
+			continue;
+		}
+
+		if (start_cpu_access) {
+			dev_dbg(te_device.this_device, "sync cpu with device %s\n", dev_name(attachment->dev));
+
+			dma_sync_sg_for_cpu(attachment->dev, sg->sgl, sg->nents, direction);
+		} else {
+			dev_dbg(te_device.this_device, "sync device %s with cpu\n", dev_name(attachment->dev));
+
+			dma_sync_sg_for_device(attachment->dev, sg->sgl, sg->nents, direction);
+		}
+	}
+
+	mutex_unlock(&dmabuf->lock);
+	return 0;
+}
+
+#if (KERNEL_VERSION(4, 6, 0) <= LINUX_VERSION_CODE)
+static int dma_buf_te_begin_cpu_access(struct dma_buf *dmabuf,
+					enum dma_data_direction direction)
+#else
+static int dma_buf_te_begin_cpu_access(struct dma_buf *dmabuf, size_t start,
+					size_t len,
+					enum dma_data_direction direction)
+#endif
+{
+	return dma_buf_te_sync(dmabuf, direction, true);
+}
+
+#if (KERNEL_VERSION(4, 6, 0) <= LINUX_VERSION_CODE)
+static int dma_buf_te_end_cpu_access(struct dma_buf *dmabuf,
+				enum dma_data_direction direction)
+{
+	return dma_buf_te_sync(dmabuf, direction, false);
+}
+#else
+static void dma_buf_te_end_cpu_access(struct dma_buf *dmabuf, size_t start,
+				size_t len,
+				enum dma_data_direction direction)
+{
+	dma_buf_te_sync(dmabuf, direction, false);
+}
+#endif
+
+static void dma_buf_te_mmap_open(struct vm_area_struct *vma)
+{
+	struct dma_buf *dma_buf;
+	struct dma_buf_te_alloc *alloc;
+	dma_buf = vma->vm_private_data;
+	alloc = dma_buf->priv;
+
+	mutex_lock(&dma_buf->lock);
+	alloc->nr_cpu_mappings++;
+	mutex_unlock(&dma_buf->lock);
+}
+
+static void dma_buf_te_mmap_close(struct vm_area_struct *vma)
+{
+	struct dma_buf *dma_buf;
+	struct dma_buf_te_alloc *alloc;
+	dma_buf = vma->vm_private_data;
+	alloc = dma_buf->priv;
+
+	BUG_ON(alloc->nr_cpu_mappings <= 0);
+	mutex_lock(&dma_buf->lock);
+	alloc->nr_cpu_mappings--;
+	mutex_unlock(&dma_buf->lock);
+}
+
+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
+static int dma_buf_te_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
+#elif KERNEL_VERSION(5, 1, 0) > LINUX_VERSION_CODE
+static int dma_buf_te_mmap_fault(struct vm_fault *vmf)
+#else
+static vm_fault_t dma_buf_te_mmap_fault(struct vm_fault *vmf)
+#endif
+{
+	struct dma_buf_te_alloc *alloc;
+	struct dma_buf *dmabuf;
+	struct page *pageptr;
+
+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
+	dmabuf = vma->vm_private_data;
+#else
+	dmabuf = vmf->vma->vm_private_data;
+#endif
+	alloc = dmabuf->priv;
+
+	if (vmf->pgoff > alloc->nr_pages)
+		return VM_FAULT_SIGBUS;
+
+	pageptr = alloc->pages[vmf->pgoff];
+
+	BUG_ON(!pageptr);
+
+	get_page(pageptr);
+	vmf->page = pageptr;
+
+	return 0;
+}
+
+struct vm_operations_struct dma_buf_te_vm_ops = {
+	.open = dma_buf_te_mmap_open,
+	.close = dma_buf_te_mmap_close,
+	.fault = dma_buf_te_mmap_fault
+};
+
+static int dma_buf_te_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma)
+{
+	struct dma_buf_te_alloc *alloc;
+	alloc = dmabuf->priv;
+
+	if (alloc->fail_mmap)
+		return -ENOMEM;
+
+	vma->vm_flags |= VM_IO | VM_DONTEXPAND | VM_DONTDUMP;
+	vma->vm_ops = &dma_buf_te_vm_ops;
+	vma->vm_private_data = dmabuf;
+
+	/*  we fault in the pages on access */
+
+	/* call open to do the ref-counting */
+	dma_buf_te_vm_ops.open(vma);
+
+	return 0;
+}
+
+#if KERNEL_VERSION(4, 19, 0) > LINUX_VERSION_CODE
+static void *dma_buf_te_kmap_atomic(struct dma_buf *buf, unsigned long page_num)
+{
+	/* IGNORE */
+	return NULL;
+}
+#endif
+
+static void *dma_buf_te_kmap(struct dma_buf *buf, unsigned long page_num)
+{
+	struct dma_buf_te_alloc *alloc;
+
+	alloc = buf->priv;
+	if (page_num >= alloc->nr_pages)
+		return NULL;
+
+	return kmap(alloc->pages[page_num]);
+}
+static void dma_buf_te_kunmap(struct dma_buf *buf,
+		unsigned long page_num, void *addr)
+{
+	struct dma_buf_te_alloc *alloc;
+
+	alloc = buf->priv;
+	if (page_num >= alloc->nr_pages)
+		return;
+
+	kunmap(alloc->pages[page_num]);
+	return;
+}
+
+static struct dma_buf_ops dma_buf_te_ops = {
+	/* real handlers */
+	.attach = dma_buf_te_attach,
+	.detach = dma_buf_te_detach,
+	.map_dma_buf = dma_buf_te_map,
+	.unmap_dma_buf = dma_buf_te_unmap,
+	.release = dma_buf_te_release,
+	.mmap = dma_buf_te_mmap,
+	.begin_cpu_access = dma_buf_te_begin_cpu_access,
+	.end_cpu_access = dma_buf_te_end_cpu_access,
+#if KERNEL_VERSION(4, 12, 0) > LINUX_VERSION_CODE
+	.kmap = dma_buf_te_kmap,
+	.kunmap = dma_buf_te_kunmap,
+
+	/* nop handlers for mandatory functions we ignore */
+	.kmap_atomic = dma_buf_te_kmap_atomic
+#else
+#if KERNEL_VERSION(5, 6, 0) > LINUX_VERSION_CODE
+	.map = dma_buf_te_kmap,
+	.unmap = dma_buf_te_kunmap,
+#endif
+
+#if KERNEL_VERSION(4, 19, 0) > LINUX_VERSION_CODE
+	/* nop handlers for mandatory functions we ignore */
+	.map_atomic = dma_buf_te_kmap_atomic
+#endif
+#endif
+};
+
+static int do_dma_buf_te_ioctl_version(struct dma_buf_te_ioctl_version __user *buf)
+{
+	struct dma_buf_te_ioctl_version v;
+
+	if (copy_from_user(&v, buf, sizeof(v)))
+		return -EFAULT;
+
+	if (v.op != DMA_BUF_TE_ENQ)
+		return -EFAULT;
+
+	v.op = DMA_BUF_TE_ACK;
+	v.major = DMA_BUF_TE_VER_MAJOR;
+	v.minor = DMA_BUF_TE_VER_MINOR;
+
+	if (copy_to_user(buf, &v, sizeof(v)))
+		return -EFAULT;
+	else
+		return 0;
+}
+
+static int do_dma_buf_te_ioctl_alloc(struct dma_buf_te_ioctl_alloc __user *buf, bool contiguous)
+{
+	struct dma_buf_te_ioctl_alloc alloc_req;
+	struct dma_buf_te_alloc *alloc;
+	struct dma_buf *dma_buf;
+	size_t i = 0;
+	size_t max_nr_pages = DMA_BUF_TE_ALLOC_MAX_SIZE;
+	int fd;
+
+	if (copy_from_user(&alloc_req, buf, sizeof(alloc_req))) {
+		dev_err(te_device.this_device, "%s: couldn't get user data", __func__);
+		goto no_input;
+	}
+
+	if (!alloc_req.size) {
+		dev_err(te_device.this_device, "%s: no size specified", __func__);
+		goto invalid_size;
+	}
+
+#ifdef NO_SG_CHAIN
+	/* Whilst it is possible to allocate larger buffer, we won't be able to
+	 * map it during actual usage (mmap() still succeeds). We fail here so
+	 * userspace code can deal with it early than having driver failure
+	 * later on.
+	 */
+	if (max_nr_pages > SG_MAX_SINGLE_ALLOC)
+		max_nr_pages = SG_MAX_SINGLE_ALLOC;
+#endif /* NO_SG_CHAIN */
+
+	if (alloc_req.size > max_nr_pages) {
+		dev_err(te_device.this_device, "%s: buffer size of %llu pages exceeded the mapping limit of %zu pages",
+				__func__, alloc_req.size, max_nr_pages);
+		goto invalid_size;
+	}
+
+	alloc = kzalloc(sizeof(struct dma_buf_te_alloc), GFP_KERNEL);
+	if (alloc == NULL) {
+		dev_err(te_device.this_device, "%s: couldn't alloc object", __func__);
+		goto no_alloc_object;
+	}
+
+	alloc->nr_pages = alloc_req.size;
+	alloc->contiguous = contiguous;
+
+#if (KERNEL_VERSION(4, 12, 0) <= LINUX_VERSION_CODE)
+	alloc->pages = kvzalloc(sizeof(struct page *) * alloc->nr_pages, GFP_KERNEL);
+#else
+	alloc->pages = kzalloc(sizeof(struct page *) * alloc->nr_pages, GFP_KERNEL);
+#endif
+
+	if (!alloc->pages) {
+		dev_err(te_device.this_device,
+				"%s: couldn't alloc %zu page structures",
+				__func__, alloc->nr_pages);
+		goto free_alloc_object;
+	}
+
+	if (contiguous) {
+		dma_addr_t dma_aux;
+
+#if (KERNEL_VERSION(4, 8, 0) <= LINUX_VERSION_CODE)
+		alloc->contig_cpu_addr = dma_alloc_attrs(te_device.this_device,
+				alloc->nr_pages * PAGE_SIZE,
+				&alloc->contig_dma_addr,
+				GFP_KERNEL | __GFP_ZERO,
+				DMA_ATTR_WRITE_COMBINE);
+#else
+		DEFINE_DMA_ATTRS(attrs);
+
+		dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs);
+		alloc->contig_cpu_addr = dma_alloc_attrs(te_device.this_device,
+				alloc->nr_pages * PAGE_SIZE,
+				&alloc->contig_dma_addr,
+				GFP_KERNEL | __GFP_ZERO, &attrs);
+#endif
+		if (!alloc->contig_cpu_addr) {
+			dev_err(te_device.this_device, "%s: couldn't alloc contiguous buffer %zu pages",
+				__func__, alloc->nr_pages);
+			goto free_page_struct;
+		}
+		dma_aux = alloc->contig_dma_addr;
+		for (i = 0; i < alloc->nr_pages; i++) {
+			alloc->pages[i] = pfn_to_page(PFN_DOWN(dma_aux));
+			dma_aux += PAGE_SIZE;
+		}
+	} else {
+		for (i = 0; i < alloc->nr_pages; i++) {
+			alloc->pages[i] = alloc_page(GFP_KERNEL | __GFP_ZERO);
+			if (alloc->pages[i] == NULL) {
+				dev_err(te_device.this_device, "%s: couldn't alloc page", __func__);
+				goto no_page;
+			}
+		}
+	}
+
+	/* alloc ready, let's export it */
+	{
+		struct dma_buf_export_info export_info = {
+			.exp_name = "dma_buf_te",
+			.owner = THIS_MODULE,
+			.ops = &dma_buf_te_ops,
+			.size = alloc->nr_pages << PAGE_SHIFT,
+			.flags = O_CLOEXEC | O_RDWR,
+			.priv = alloc,
+		};
+
+		dma_buf = dma_buf_export(&export_info);
+	}
+
+	if (IS_ERR_OR_NULL(dma_buf)) {
+		dev_err(te_device.this_device, "%s: couldn't export dma_buf", __func__);
+		goto no_export;
+	}
+
+	/* get fd for buf */
+	fd = dma_buf_fd(dma_buf, O_CLOEXEC);
+
+	if (fd < 0) {
+		dev_err(te_device.this_device, "%s: couldn't get fd from dma_buf", __func__);
+		goto no_fd;
+	}
+
+	return fd;
+
+no_fd:
+	dma_buf_put(dma_buf);
+no_export:
+	/* i still valid */
+no_page:
+	if (contiguous) {
+#if (KERNEL_VERSION(4, 8, 0) <= LINUX_VERSION_CODE)
+		dma_free_attrs(te_device.this_device,
+						alloc->nr_pages * PAGE_SIZE,
+						alloc->contig_cpu_addr,
+						alloc->contig_dma_addr,
+						DMA_ATTR_WRITE_COMBINE);
+#else
+		DEFINE_DMA_ATTRS(attrs);
+
+		dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs);
+		dma_free_attrs(te_device.this_device,
+						alloc->nr_pages * PAGE_SIZE,
+						alloc->contig_cpu_addr, alloc->contig_dma_addr, &attrs);
+#endif
+	} else {
+		while (i-- > 0)
+			__free_page(alloc->pages[i]);
+	}
+free_page_struct:
+#if (KERNEL_VERSION(4, 12, 0) <= LINUX_VERSION_CODE)
+	kvfree(alloc->pages);
+#else
+	kfree(alloc->pages);
+#endif
+free_alloc_object:
+	kfree(alloc);
+no_alloc_object:
+invalid_size:
+no_input:
+	return -EFAULT;
+}
+
+static int do_dma_buf_te_ioctl_status(struct dma_buf_te_ioctl_status __user *arg)
+{
+	struct dma_buf_te_ioctl_status status;
+	struct dma_buf *dmabuf;
+	struct dma_buf_te_alloc *alloc;
+	int res = -EINVAL;
+
+	if (copy_from_user(&status, arg, sizeof(status)))
+		return -EFAULT;
+
+	dmabuf = dma_buf_get(status.fd);
+	if (IS_ERR_OR_NULL(dmabuf))
+		return -EINVAL;
+
+	/* verify it's one of ours */
+	if (dmabuf->ops != &dma_buf_te_ops)
+		goto err_have_dmabuf;
+
+	/* ours, get the current status */
+	alloc = dmabuf->priv;
+
+	/* lock while reading status to take a snapshot */
+	mutex_lock(&dmabuf->lock);
+	status.attached_devices = alloc->nr_attached_devices;
+	status.device_mappings = alloc->nr_device_mappings;
+	status.cpu_mappings = alloc->nr_cpu_mappings;
+	mutex_unlock(&dmabuf->lock);
+
+	if (copy_to_user(arg, &status, sizeof(status)))
+		goto err_have_dmabuf;
+
+	/* All OK */
+	res = 0;
+
+err_have_dmabuf:
+	dma_buf_put(dmabuf);
+	return res;
+}
+
+static int do_dma_buf_te_ioctl_set_failing(struct dma_buf_te_ioctl_set_failing __user *arg)
+{
+	struct dma_buf *dmabuf;
+	struct dma_buf_te_ioctl_set_failing f;
+	struct dma_buf_te_alloc *alloc;
+	int res = -EINVAL;
+
+	if (copy_from_user(&f, arg, sizeof(f)))
+		return -EFAULT;
+
+	dmabuf = dma_buf_get(f.fd);
+	if (IS_ERR_OR_NULL(dmabuf))
+		return -EINVAL;
+
+	/* verify it's one of ours */
+	if (dmabuf->ops != &dma_buf_te_ops)
+		goto err_have_dmabuf;
+
+	/* ours, set the fail modes */
+	alloc = dmabuf->priv;
+	/* lock to set the fail modes atomically */
+	mutex_lock(&dmabuf->lock);
+	alloc->fail_attach = f.fail_attach;
+	alloc->fail_map    = f.fail_map;
+	alloc->fail_mmap   = f.fail_mmap;
+	mutex_unlock(&dmabuf->lock);
+
+	/* success */
+	res = 0;
+
+err_have_dmabuf:
+	dma_buf_put(dmabuf);
+	return res;
+}
+
+static u32 dma_te_buf_fill(struct dma_buf *dma_buf, unsigned int value)
+{
+	struct dma_buf_attachment *attachment;
+	struct sg_table *sgt;
+	struct scatterlist *sg;
+	unsigned int count;
+	unsigned int offset = 0;
+	int ret = 0;
+	size_t i;
+
+	attachment = dma_buf_attach(dma_buf, te_device.this_device);
+	if (IS_ERR_OR_NULL(attachment))
+		return -EBUSY;
+
+	sgt = dma_buf_map_attachment(attachment, DMA_BIDIRECTIONAL);
+	if (IS_ERR_OR_NULL(sgt)) {
+		ret = PTR_ERR(sgt);
+		goto no_import;
+	}
+
+	ret = dma_buf_begin_cpu_access(dma_buf,
+#if KERNEL_VERSION(4, 6, 0) > LINUX_VERSION_CODE
+				       0, dma_buf->size,
+#endif
+				       DMA_BIDIRECTIONAL);
+	if (ret)
+		goto no_cpu_access;
+
+	for_each_sg(sgt->sgl, sg, sgt->nents, count) {
+		for (i = 0; i < sg_dma_len(sg); i = i + PAGE_SIZE) {
+			void *addr = NULL;
+#if KERNEL_VERSION(5, 6, 0) <= LINUX_VERSION_CODE
+			addr = dma_buf_te_kmap(dma_buf, i >> PAGE_SHIFT);
+#else
+			addr = dma_buf_kmap(dma_buf, i >> PAGE_SHIFT);
+#endif
+			if (!addr) {
+				ret = -EPERM;
+				goto no_kmap;
+			}
+			memset(addr, value, PAGE_SIZE);
+#if KERNEL_VERSION(5, 6, 0) <= LINUX_VERSION_CODE
+			dma_buf_te_kunmap(dma_buf, i >> PAGE_SHIFT, addr);
+#else
+			dma_buf_kunmap(dma_buf, i >> PAGE_SHIFT, addr);
+#endif
+		}
+		offset += sg_dma_len(sg);
+	}
+
+no_kmap:
+	dma_buf_end_cpu_access(dma_buf,
+#if KERNEL_VERSION(4, 6, 0) > LINUX_VERSION_CODE
+			       0, dma_buf->size,
+#endif
+			       DMA_BIDIRECTIONAL);
+no_cpu_access:
+	dma_buf_unmap_attachment(attachment, sgt, DMA_BIDIRECTIONAL);
+no_import:
+	dma_buf_detach(dma_buf, attachment);
+	return ret;
+}
+
+static int do_dma_buf_te_ioctl_fill(struct dma_buf_te_ioctl_fill __user *arg)
+{
+
+	struct dma_buf *dmabuf;
+	struct dma_buf_te_ioctl_fill f;
+	int ret;
+
+	if (copy_from_user(&f, arg, sizeof(f)))
+		return -EFAULT;
+
+	dmabuf = dma_buf_get(f.fd);
+	if (IS_ERR_OR_NULL(dmabuf))
+		return -EINVAL;
+
+	ret = dma_te_buf_fill(dmabuf, f.value);
+	dma_buf_put(dmabuf);
+
+	return ret;
+}
+
+static long dma_buf_te_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+{
+	switch (cmd) {
+	case DMA_BUF_TE_VERSION:
+		return do_dma_buf_te_ioctl_version((struct dma_buf_te_ioctl_version __user *)arg);
+	case DMA_BUF_TE_ALLOC:
+		return do_dma_buf_te_ioctl_alloc((struct dma_buf_te_ioctl_alloc __user *)arg, false);
+	case DMA_BUF_TE_ALLOC_CONT:
+		return do_dma_buf_te_ioctl_alloc((struct dma_buf_te_ioctl_alloc __user *)arg, true);
+	case DMA_BUF_TE_QUERY:
+		return do_dma_buf_te_ioctl_status((struct dma_buf_te_ioctl_status __user *)arg);
+	case DMA_BUF_TE_SET_FAILING:
+		return do_dma_buf_te_ioctl_set_failing((struct dma_buf_te_ioctl_set_failing __user *)arg);
+	case DMA_BUF_TE_FILL:
+		return do_dma_buf_te_ioctl_fill((struct dma_buf_te_ioctl_fill __user *)arg);
+	default:
+		return -ENOTTY;
+	}
+}
+
+static const struct file_operations dma_buf_te_fops = {
+	.owner = THIS_MODULE,
+	.unlocked_ioctl = dma_buf_te_ioctl,
+	.compat_ioctl = dma_buf_te_ioctl,
+};
+
+static int __init dma_buf_te_init(void)
+{
+	int res;
+	te_device.minor = MISC_DYNAMIC_MINOR;
+	te_device.name = "dma_buf_te";
+	te_device.fops = &dma_buf_te_fops;
+
+	res = misc_register(&te_device);
+	if (res) {
+		printk(KERN_WARNING"Misc device registration failed of 'dma_buf_te'\n");
+		return res;
+	}
+	te_device.this_device->coherent_dma_mask = DMA_BIT_MASK(32);
+
+	dev_info(te_device.this_device, "dma_buf_te ready\n");
+	return 0;
+
+}
+
+static void __exit dma_buf_te_exit(void)
+{
+	misc_deregister(&te_device);
+}
+
+module_init(dma_buf_te_init);
+module_exit(dma_buf_te_exit);
+MODULE_LICENSE("GPL");
diff --git a/drivers/base/arm/memory_group_manager/Kbuild b/drivers/base/arm/memory_group_manager/Kbuild
index 1b0f8b07b399..99ce311a7aad 100644
--- a/drivers/base/arm/memory_group_manager/Kbuild
+++ b/drivers/base/arm/memory_group_manager/Kbuild
@@ -1,4 +1,4 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
 # (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
 #
@@ -18,4 +18,6 @@
 #
 #
 
-obj-$(CONFIG_MALI_MEMORY_GROUP_MANAGER) := memory_group_manager.o
+ifeq ($(CONFIG_MALI_MEMORY_GROUP_MANAGER), y)
+obj-m := memory_group_manager.o
+endif
diff --git a/drivers/base/arm/memory_group_manager/build.bp b/drivers/base/arm/memory_group_manager/build.bp
index 4eb447cc1257..23db183e4f1b 100644
--- a/drivers/base/arm/memory_group_manager/build.bp
+++ b/drivers/base/arm/memory_group_manager/build.bp
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -21,10 +21,16 @@
 
 bob_kernel_module {
     name: "memory_group_manager",
+    defaults: [
+        "kernel_defaults"
+    ],
     srcs: [
         "Kbuild",
         "memory_group_manager.c",
     ],
-    kbuild_options: ["CONFIG_MALI_MEMORY_GROUP_MANAGER=m"],
-    defaults: ["kernel_defaults"],
+    enabled: false,
+    mali_memory_group_manager: {
+        kbuild_options: ["CONFIG_MALI_MEMORY_GROUP_MANAGER=y"],
+        enabled: true,
+    },
 }
diff --git a/drivers/base/arm/memory_group_manager/memory_group_manager.c b/drivers/base/arm/memory_group_manager/memory_group_manager.c
index 2ce3b940ed72..270257287e71 100644
--- a/drivers/base/arm/memory_group_manager/memory_group_manager.c
+++ b/drivers/base/arm/memory_group_manager/memory_group_manager.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -25,7 +25,7 @@
 #include <linux/platform_device.h>
 #include <linux/version.h>
 #include <linux/module.h>
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 #include <linux/debugfs.h>
 #endif
 #include <linux/mm.h>
@@ -97,12 +97,12 @@ struct mgm_group {
 struct mgm_groups {
 	struct mgm_group groups[MEMORY_GROUP_MANAGER_NR_GROUPS];
 	struct device *dev;
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 	struct dentry *mgm_debugfs_root;
 #endif
 };
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 
 static int mgm_size_get(void *data, u64 *val)
 {
diff --git a/drivers/base/arm/protected_memory_allocator/Kbuild b/drivers/base/arm/protected_memory_allocator/Kbuild
index 205c5f1ee95a..25295a9a0f76 100644
--- a/drivers/base/arm/protected_memory_allocator/Kbuild
+++ b/drivers/base/arm/protected_memory_allocator/Kbuild
@@ -1,4 +1,4 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
 # (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
 #
@@ -18,4 +18,6 @@
 #
 #
 
-obj-$(CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR) := protected_memory_allocator.o
+ifeq ($(CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR), y)
+obj-m := protected_memory_allocator.o
+endif
diff --git a/drivers/base/arm/protected_memory_allocator/Makefile b/drivers/base/arm/protected_memory_allocator/Makefile
deleted file mode 100644
index 93f49b5efdf2..000000000000
--- a/drivers/base/arm/protected_memory_allocator/Makefile
+++ /dev/null
@@ -1,37 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-#
-# (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU license.
-#
-# 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.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, you can access it online at
-# http://www.gnu.org/licenses/gpl-2.0.html.
-#
-#
-
-# linux build system bootstrap for out-of-tree module
-
-# default to building for the host
-ARCH ?= $(shell uname -m)
-
-# Handle Android Common Kernel source naming
-KERNEL_SRC ?= /lib/modules/$(shell uname -r)/build
-KDIR ?= $(KERNEL_SRC)
-
-all:
-	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) EXTRA_CFLAGS="-I$(CURDIR)/../../../../include" modules CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR=m
-
-clean:
-	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) clean
-
-modules_install:
-	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) modules_install
diff --git a/drivers/base/arm/protected_memory_allocator/build.bp b/drivers/base/arm/protected_memory_allocator/build.bp
index ddb0510cacd6..4c56154061e8 100644
--- a/drivers/base/arm/protected_memory_allocator/build.bp
+++ b/drivers/base/arm/protected_memory_allocator/build.bp
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -21,14 +21,16 @@
 
 bob_kernel_module {
     name: "protected_memory_allocator",
+    defaults: [
+        "kernel_defaults"
+    ],
     srcs: [
         "Kbuild",
         "protected_memory_allocator.c",
     ],
-    kbuild_options: ["CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR=m"],
-    defaults: ["kernel_defaults"],
     enabled: false,
-    build_csf_only_module: {
+    mali_protected_memory_allocator: {
+        kbuild_options: ["CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR=y"],
         enabled: true,
     },
 }
diff --git a/drivers/base/arm/protected_memory_allocator/protected_memory_allocator.c b/drivers/base/arm/protected_memory_allocator/protected_memory_allocator.c
index a34b3a44fb79..6684210762d0 100644
--- a/drivers/base/arm/protected_memory_allocator/protected_memory_allocator.c
+++ b/drivers/base/arm/protected_memory_allocator/protected_memory_allocator.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/Kbuild b/drivers/gpu/arm/bifrost/Kbuild
index 8b4ece17cfe5..b1ac6e92db6a 100644
--- a/drivers/gpu/arm/bifrost/Kbuild
+++ b/drivers/gpu/arm/bifrost/Kbuild
@@ -1,4 +1,4 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
 # (C) COPYRIGHT 2012-2021 ARM Limited. All rights reserved.
 #
@@ -18,221 +18,238 @@
 #
 #
 
-# Driver version string which is returned to userspace via an ioctl
-MALI_RELEASE_NAME ?= '"g6p0-01eac0"'
-
-# Paths required for build
-
 # make $(src) as absolute path if it is not already, by prefixing $(srctree)
+# This is to prevent any build issue due to wrong path.
 src:=$(if $(patsubst /%,,$(src)),$(srctree)/$(src),$(src))
-KBASE_PATH = $(src)
-KBASE_PLATFORM_PATH = $(KBASE_PATH)/platform_dummy
-UMP_PATH = $(src)/../../../base
 
-# Set up defaults if not defined by build system
-MALI_CUSTOMER_RELEASE ?= 1
-MALI_UNIT_TEST ?= 0
-MALI_COVERAGE ?= 0
-CONFIG_MALI_PLATFORM_NAME ?= "devicetree"
-# Experimental features (corresponding -D definition should be appended to
-# DEFINES below, e.g. for MALI_EXPERIMENTAL_FEATURE,
-# -DMALI_EXPERIMENTAL_FEATURE=$(MALI_EXPERIMENTAL_FEATURE) should be appended)
 #
-# Experimental features must default to disabled, e.g.:
-# MALI_EXPERIMENTAL_FEATURE ?= 0
-MALI_INCREMENTAL_RENDERING ?= 0
-
-ifeq ($(CONFIG_MALI_CSF_SUPPORT),y)
-MALI_JIT_PRESSURE_LIMIT_BASE = 0
-MALI_USE_CSF = 1
-else
-MALI_JIT_PRESSURE_LIMIT_BASE ?= 1
-MALI_USE_CSF ?= 0
+# Prevent misuse when Kernel configurations are not present by default
+# in out-of-tree builds
+#
+ifneq ($(CONFIG_ANDROID),n)
+ifeq ($(CONFIG_GPU_TRACEPOINTS),n)
+    $(error CONFIG_GPU_TRACEPOINTS must be set in Kernel configuration)
 endif
-
-ifneq ($(CONFIG_MALI_KUTF), n)
-MALI_KERNEL_TEST_API ?= 1
-else
-MALI_KERNEL_TEST_API ?= 0
 endif
 
-# Set up our defines, which will be passed to gcc
-DEFINES = \
-	-DMALI_CUSTOMER_RELEASE=$(MALI_CUSTOMER_RELEASE) \
-	-DMALI_USE_CSF=$(MALI_USE_CSF) \
-	-DMALI_KERNEL_TEST_API=$(MALI_KERNEL_TEST_API) \
-	-DMALI_UNIT_TEST=$(MALI_UNIT_TEST) \
-	-DMALI_COVERAGE=$(MALI_COVERAGE) \
-	-DMALI_RELEASE_NAME=$(MALI_RELEASE_NAME) \
-	-DMALI_JIT_PRESSURE_LIMIT_BASE=$(MALI_JIT_PRESSURE_LIMIT_BASE) \
-	-DMALI_INCREMENTAL_RENDERING=$(MALI_INCREMENTAL_RENDERING)
+ifeq ($(CONFIG_DMA_SHARED_BUFFER),n)
+    $(error CONFIG_DMA_SHARED_BUFFER must be set in Kernel configuration)
+endif
 
-ifeq ($(KBUILD_EXTMOD),)
-# in-tree
-DEFINES +=-DMALI_KBASE_PLATFORM_PATH=../../$(src)/platform/$(CONFIG_MALI_PLATFORM_NAME)
-else
-# out-of-tree
-DEFINES +=-DMALI_KBASE_PLATFORM_PATH=$(src)/platform/$(CONFIG_MALI_PLATFORM_NAME)
-endif
-
-DEFINES += -I$(srctree)/drivers/staging/android
-
-DEFINES += -DMALI_KBASE_BUILD
-
-# Use our defines when compiling
-ccflags-y += $(DEFINES) -I$(KBASE_PATH)   -I$(KBASE_PLATFORM_PATH) -I$(UMP_PATH) -I$(srctree)/include/linux
-subdir-ccflags-y += $(DEFINES) -I$(KBASE_PATH)   -I$(KBASE_PLATFORM_PATH) -I$(UMP_PATH) -I$(srctree)/include/linux
-
-SRC := \
-	context/mali_kbase_context.c \
-	debug/mali_kbase_debug_ktrace.c \
-	device/mali_kbase_device.c \
-	device/mali_kbase_device_hw.c \
-	mali_kbase_cache_policy.c \
-	mali_kbase_ccswe.c \
-	mali_kbase_mem.c \
-	mali_kbase_mem_pool_group.c \
-	mali_kbase_native_mgm.c \
-	mali_kbase_ctx_sched.c \
-	mali_kbase_jm.c \
-	mali_kbase_gpuprops.c \
-	mali_kbase_pm.c \
-	mali_kbase_config.c \
-	mali_kbase_vinstr.c \
-	mali_kbase_hwcnt.c \
-	mali_kbase_hwcnt_gpu.c \
-	mali_kbase_hwcnt_legacy.c \
-	mali_kbase_hwcnt_types.c \
-	mali_kbase_hwcnt_virtualizer.c \
-	mali_kbase_softjobs.c \
-	mali_kbase_hw.c \
-	mali_kbase_debug.c \
-	mali_kbase_gpu_memory_debugfs.c \
-	mali_kbase_mem_linux.c \
-	mali_kbase_core_linux.c \
-	mali_kbase_mem_profile_debugfs.c \
-	mmu/mali_kbase_mmu.c \
-	mmu/mali_kbase_mmu_hw_direct.c \
-	mmu/mali_kbase_mmu_mode_aarch64.c \
-	mali_kbase_disjoint_events.c \
-	mali_kbase_debug_mem_view.c \
-	mali_kbase_smc.c \
-	mali_kbase_mem_pool.c \
-	mali_kbase_mem_pool_debugfs.c \
-	mali_kbase_debugfs_helper.c \
-	mali_kbase_strings.c \
-	mali_kbase_as_fault_debugfs.c \
-	mali_kbase_regs_history_debugfs.c \
-	mali_kbase_dvfs_debugfs.c \
-	mali_power_gpu_frequency_trace.c \
-	mali_kbase_trace_gpu_mem.c \
-	thirdparty/mali_kbase_mmap.c \
-	tl/mali_kbase_timeline.c \
-	tl/mali_kbase_timeline_io.c \
-	tl/mali_kbase_tlstream.c \
-	tl/mali_kbase_tracepoints.c \
-	gpu/mali_kbase_gpu.c
-
-ifeq ($(MALI_USE_CSF),1)
-	SRC += \
-		mali_kbase_hwcnt_backend_csf.c \
-		mali_kbase_hwcnt_backend_csf_if_fw.c \
-		debug/backend/mali_kbase_debug_ktrace_csf.c \
-		device/backend/mali_kbase_device_csf.c \
-		device/backend/mali_kbase_device_hw_csf.c \
-		gpu/backend/mali_kbase_gpu_fault_csf.c \
-		tl/backend/mali_kbase_timeline_csf.c \
-		mmu/backend/mali_kbase_mmu_csf.c \
-		context/backend/mali_kbase_context_csf.c
-else
-	SRC += \
-		mali_kbase_hwcnt_backend_jm.c \
-		mali_kbase_dummy_job_wa.c \
-		mali_kbase_debug_job_fault.c \
-		mali_kbase_event.c \
-		mali_kbase_jd.c \
-		mali_kbase_jd_debugfs.c \
-		mali_kbase_js.c \
-		mali_kbase_js_ctx_attr.c \
-		mali_kbase_kinstr_jm.c \
-		debug/backend/mali_kbase_debug_ktrace_jm.c \
-		device/backend/mali_kbase_device_jm.c \
-		device/backend/mali_kbase_device_hw_jm.c \
-		gpu/backend/mali_kbase_gpu_fault_jm.c \
-		tl/backend/mali_kbase_timeline_jm.c \
-		mmu/backend/mali_kbase_mmu_jm.c \
-		context/backend/mali_kbase_context_jm.c
+ifeq ($(CONFIG_PM_DEVFREQ),n)
+    $(error CONFIG_PM_DEVFREQ must be set in Kernel configuration)
 endif
 
-ifeq ($(CONFIG_MALI_CINSTR_GWT),y)
-	SRC += mali_kbase_gwt.c
+ifeq ($(CONFIG_DEVFREQ_THERMAL),n)
+    $(error CONFIG_DEVFREQ_THERMAL must be set in Kernel configuration)
 endif
 
+ifeq ($(CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND),n)
+    $(error CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND must be set in Kernel configuration)
+endif
 
-ifeq ($(MALI_CUSTOMER_RELEASE),0)
-	SRC += mali_kbase_regs_dump_debugfs.c
+ifeq ($(CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS), y)
+    ifneq ($(CONFIG_DEBUG_FS), y)
+        $(error CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS depends on CONFIG_DEBUG_FS to be set in Kernel configuration)
+    endif
 endif
 
+ifeq ($(CONFIG_MALI_BIFROST_FENCE_DEBUG), y)
+    ifneq ($(CONFIG_SYNC), y)
+        ifneq ($(CONFIG_SYNC_FILE), y)
+            $(error CONFIG_MALI_BIFROST_FENCE_DEBUG depends on CONFIG_SYNC || CONFIG_SYNC_FILE to be set in Kernel configuration)
+        endif
+    endif
+endif
 
-ccflags-y += -I$(KBASE_PATH) -I$(KBASE_PATH)/debug \
-	-I$(KBASE_PATH)/debug/backend
+#
+# Configurations
+#
 
-# Tell the Linux build system from which .o file to create the kernel module
-obj-$(CONFIG_MALI_BIFROST) += bifrost_kbase.o
+# Driver version string which is returned to userspace via an ioctl
+MALI_RELEASE_NAME ?= '"g7p1-01bet0"'
+# Set up defaults if not defined by build system
+ifeq ($(CONFIG_MALI_BIFROST_DEBUG), y)
+    MALI_UNIT_TEST = 1
+    MALI_CUSTOMER_RELEASE ?= 0
+else
+    MALI_UNIT_TEST ?= 0
+    MALI_CUSTOMER_RELEASE ?= 1
+endif
+MALI_COVERAGE ?= 0
 
-# Tell the Linux build system to enable building of our .c files
-bifrost_kbase-y := $(SRC:.c=.o)
+CONFIG_MALI_PLATFORM_NAME ?= "devicetree"
 
 # Kconfig passes in the name with quotes for in-tree builds - remove them.
-platform_name := $(shell echo $(CONFIG_MALI_PLATFORM_NAME))
-MALI_PLATFORM_DIR := platform/$(platform_name)
-ccflags-y += -I$(src)/$(MALI_PLATFORM_DIR)
-include $(src)/$(MALI_PLATFORM_DIR)/Kbuild
+MALI_PLATFORM_DIR := $(shell echo $(CONFIG_MALI_PLATFORM_NAME))
 
-ifeq ($(CONFIG_MALI_BIFROST_DEVFREQ),y)
-  ifeq ($(CONFIG_DEVFREQ_THERMAL),y)
-    include $(src)/ipa/Kbuild
-  endif
+ifeq ($(CONFIG_MALI_CSF_SUPPORT),y)
+    MALI_JIT_PRESSURE_LIMIT_BASE = 0
+    MALI_USE_CSF = 1
+else
+    MALI_JIT_PRESSURE_LIMIT_BASE ?= 1
+    MALI_USE_CSF ?= 0
 endif
 
-ifeq ($(MALI_USE_CSF),1)
-	include $(src)/csf/Kbuild
+ifneq ($(CONFIG_MALI_KUTF), n)
+    MALI_KERNEL_TEST_API ?= 1
 else
-# empty
+    MALI_KERNEL_TEST_API ?= 0
 endif
 
-ifeq ($(CONFIG_MALI_ARBITER_SUPPORT),y)
-	include $(src)/arbiter/Kbuild
+# Experimental features (corresponding -D definition should be appended to
+# ccflags-y below, e.g. for MALI_EXPERIMENTAL_FEATURE,
+# -DMALI_EXPERIMENTAL_FEATURE=$(MALI_EXPERIMENTAL_FEATURE) should be appended)
+#
+# Experimental features must default to disabled, e.g.:
+# MALI_EXPERIMENTAL_FEATURE ?= 0
+MALI_INCREMENTAL_RENDERING ?= 0
+
+#
+# ccflags
+#
+ccflags-y = \
+    -DMALI_CUSTOMER_RELEASE=$(MALI_CUSTOMER_RELEASE) \
+    -DMALI_USE_CSF=$(MALI_USE_CSF) \
+    -DMALI_KERNEL_TEST_API=$(MALI_KERNEL_TEST_API) \
+    -DMALI_UNIT_TEST=$(MALI_UNIT_TEST) \
+    -DMALI_COVERAGE=$(MALI_COVERAGE) \
+    -DMALI_RELEASE_NAME=$(MALI_RELEASE_NAME) \
+    -DMALI_JIT_PRESSURE_LIMIT_BASE=$(MALI_JIT_PRESSURE_LIMIT_BASE) \
+    -DMALI_INCREMENTAL_RENDERING=$(MALI_INCREMENTAL_RENDERING) \
+    -DMALI_KBASE_BUILD \
+    -DMALI_PLATFORM_DIR=$(MALI_PLATFORM_DIR)
+
+
+ifeq ($(KBUILD_EXTMOD),)
+# in-tree
+    ccflags-y +=-DMALI_KBASE_PLATFORM_PATH=../../$(src)/platform/$(CONFIG_MALI_PLATFORM_NAME)
 else
-# empty
+# out-of-tree
+    ccflags-y +=-DMALI_KBASE_PLATFORM_PATH=$(src)/platform/$(CONFIG_MALI_PLATFORM_NAME)
 endif
 
-ifeq ($(MALI_USE_CSF),0)
-	bifrost_kbase-$(CONFIG_MALI_BIFROST_DMA_FENCE) += \
-		mali_kbase_fence_ops.o \
-		mali_kbase_dma_fence.o \
-		mali_kbase_fence.o
+ccflags-y += \
+    -I$(srctree)/include/linux \
+    -I$(srctree)/drivers/staging/android \
+    -I$(src) \
+    -I$(src)/platform/$(MALI_PLATFORM_DIR) \
+    -I$(src)/../../../base \
+    -I$(src)/../../../../include
 
-	bifrost_kbase-$(CONFIG_SYNC_FILE) += \
-		mali_kbase_fence_ops.o \
-		mali_kbase_fence.o
-endif
+subdir-ccflags-y += $(ccflags-y)
+
+#
+# Kernel Modules
+#
+obj-$(CONFIG_MALI_MIDGARD) += bifrost_kbase.o
+obj-$(CONFIG_MALI_ARBITRATION) += arbitration/
+obj-$(CONFIG_MALI_KUTF)    += tests/
+
+bifrost_kbase-y := \
+    mali_kbase_cache_policy.o \
+    mali_kbase_ccswe.o \
+    mali_kbase_mem.o \
+    mali_kbase_mem_pool_group.o \
+    mali_kbase_native_mgm.o \
+    mali_kbase_ctx_sched.o \
+    mali_kbase_gpuprops.o \
+    mali_kbase_pm.o \
+    mali_kbase_config.o \
+    mali_kbase_vinstr.o \
+    mali_kbase_hwcnt.o \
+    mali_kbase_hwcnt_gpu.o \
+    mali_kbase_hwcnt_legacy.o \
+    mali_kbase_hwcnt_types.o \
+    mali_kbase_hwcnt_virtualizer.o \
+    mali_kbase_softjobs.o \
+    mali_kbase_hw.o \
+    mali_kbase_debug.o \
+    mali_kbase_gpu_memory_debugfs.o \
+    mali_kbase_mem_linux.o \
+    mali_kbase_core_linux.o \
+    mali_kbase_mem_profile_debugfs.o \
+    mali_kbase_disjoint_events.o \
+    mali_kbase_debug_mem_view.o \
+    mali_kbase_smc.o \
+    mali_kbase_mem_pool.o \
+    mali_kbase_mem_pool_debugfs.o \
+    mali_kbase_debugfs_helper.o \
+    mali_kbase_strings.o \
+    mali_kbase_as_fault_debugfs.o \
+    mali_kbase_regs_history_debugfs.o \
+    mali_kbase_dvfs_debugfs.o \
+    mali_power_gpu_frequency_trace.o \
+    mali_kbase_trace_gpu_mem.o
+
+bifrost_kbase-$(CONFIG_MALI_CINSTR_GWT) += mali_kbase_gwt.o
 
 bifrost_kbase-$(CONFIG_SYNC) += \
-	mali_kbase_sync_android.o \
-	mali_kbase_sync_common.o
+    mali_kbase_sync_android.o \
+    mali_kbase_sync_common.o
 
 bifrost_kbase-$(CONFIG_SYNC_FILE) += \
-	mali_kbase_fence_ops.o \
-	mali_kbase_sync_file.o \
-	mali_kbase_sync_common.o
+    mali_kbase_fence_ops.o \
+    mali_kbase_sync_file.o \
+    mali_kbase_sync_common.o
+
+ifeq ($(CONFIG_MALI_CSF_SUPPORT),y)
+    bifrost_kbase-y += \
+        mali_kbase_hwcnt_backend_csf.o \
+        mali_kbase_hwcnt_backend_csf_if_fw.o
+else
+    bifrost_kbase-y += \
+        mali_kbase_jm.o \
+        mali_kbase_hwcnt_backend_jm.o \
+        mali_kbase_dummy_job_wa.o \
+        mali_kbase_debug_job_fault.o \
+        mali_kbase_event.o \
+        mali_kbase_jd.o \
+        mali_kbase_jd_debugfs.o \
+        mali_kbase_js.o \
+        mali_kbase_js_ctx_attr.o \
+        mali_kbase_kinstr_jm.o
+
+    bifrost_kbase-$(CONFIG_MALI_BIFROST_DMA_FENCE) += \
+        mali_kbase_fence_ops.o \
+        mali_kbase_dma_fence.o \
+        mali_kbase_fence.o
+
+    bifrost_kbase-$(CONFIG_SYNC_FILE) += \
+        mali_kbase_fence_ops.o \
+        mali_kbase_fence.o
+endif
 
-include  $(src)/backend/gpu/Kbuild
-bifrost_kbase-y += $(BACKEND:.c=.o)
 
+INCLUDE_SUBDIR = \
+    $(src)/context/Kbuild \
+    $(src)/debug/Kbuild \
+    $(src)/device/Kbuild \
+    $(src)/backend/gpu/Kbuild \
+    $(src)/mmu/Kbuild \
+    $(src)/tl/Kbuild \
+    $(src)/gpu/Kbuild \
+    $(src)/thirdparty/Kbuild \
+    $(src)/platform/$(MALI_PLATFORM_DIR)/Kbuild
+
+ifeq ($(CONFIG_MALI_CSF_SUPPORT),y)
+    INCLUDE_SUBDIR += $(src)/csf/Kbuild
+endif
+
+ifeq ($(CONFIG_MALI_ARBITER_SUPPORT),y)
+    INCLUDE_SUBDIR += $(src)/arbiter/Kbuild
+endif
 
-ccflags-y += -I$(src)/backend/gpu
-subdir-ccflags-y += -I$(src)/backend/gpu
+ifeq ($(CONFIG_MALI_BIFROST_DEVFREQ),y)
+    ifeq ($(CONFIG_DEVFREQ_THERMAL),y)
+        INCLUDE_SUBDIR += $(src)/ipa/Kbuild
+    endif
+endif
 
-# For kutf and mali_kutf_irq_latency_test
-obj-$(CONFIG_MALI_KUTF) += tests/
+ifeq ($(KBUILD_EXTMOD),)
+# in-tree
+    -include $(INCLUDE_SUBDIR)
+else
+# out-of-tree
+    include $(INCLUDE_SUBDIR)
+endif
diff --git a/drivers/gpu/arm/bifrost/Kconfig b/drivers/gpu/arm/bifrost/Kconfig
index fdbeafc010fb..39dca109b40d 100644
--- a/drivers/gpu/arm/bifrost/Kconfig
+++ b/drivers/gpu/arm/bifrost/Kconfig
@@ -1,4 +1,4 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
 # (C) COPYRIGHT 2012-2021 ARM Limited. All rights reserved.
 #
@@ -18,11 +18,12 @@
 #
 #
 
-
 menuconfig MALI_BIFROST
 	tristate "Mali Bifrost series support"
 	select GPU_TRACEPOINTS if ANDROID
 	select DMA_SHARED_BUFFER
+	select PM_DEVFREQ
+	select DEVFREQ_THERMAL
 	default n
 	help
 	  Enable this option to build support for a ARM Mali Bifrost GPU.
@@ -30,20 +31,43 @@ menuconfig MALI_BIFROST
 	  To compile this driver as a module, choose M here:
 	  this will generate a single module, called mali_kbase.
 
+if MALI_BIFROST
+
+config MALI_PLATFORM_NAME
+	depends on MALI_BIFROST
+	string "Platform name"
+	default "devicetree"
+	help
+	  Enter the name of the desired platform configuration directory to
+	  include in the build. 'platform/$(MALI_PLATFORM_NAME)/Makefile' must
+	  exist.
+
+config MALI_REAL_HW
+	depends on MALI_BIFROST
+	def_bool !MALI_BIFROST_NO_MALI
+
+menu "Platform specific options"
+source "drivers/gpu/arm/midgard/platform/Kconfig"
+endmenu
+
 config MALI_CSF_SUPPORT
-	bool "Mali CSF based GPU support"
+	bool "Enable Mali CSF based GPU support"
 	depends on MALI_BIFROST=m
 	default n
 	help
 	  Enables support for CSF based GPUs.
 
-config MALI_BIFROST_GATOR_SUPPORT
-	bool "Enable Streamline tracing support"
-	depends on MALI_BIFROST
-	default n
+config MALI_BIFROST_DEVFREQ
+	bool "Enable devfreq support for Mali"
+	depends on MALI_BIFROST && PM_DEVFREQ
+	select DEVFREQ_GOV_SIMPLE_ONDEMAND
+	default y
 	help
-	  Enables kbase tracing used by the Arm Streamline Performance Analyzer.
-	  The tracepoints are used to derive GPU activity charts in Streamline.
+	  Support devfreq for Mali.
+
+	  Using the devfreq framework and, by default, the simple on-demand
+	  governor, the frequency of Mali will be dynamically selected from the
+	  available OPPs.
 
 config MALI_BIFROST_DVFS
 	bool "Enable legacy DVFS"
@@ -52,28 +76,25 @@ config MALI_BIFROST_DVFS
 	help
 	  Choose this option to enable legacy DVFS in the Mali Midgard DDK.
 
+config MALI_BIFROST_GATOR_SUPPORT
+	bool "Enable Streamline tracing support"
+	depends on MALI_BIFROST
+	default y
+	help
+	  Enables kbase tracing used by the Arm Streamline Performance Analyzer.
+	  The tracepoints are used to derive GPU activity charts in Streamline.
+
 config MALI_BIFROST_ENABLE_TRACE
 	bool "Enable kbase tracing"
 	depends on MALI_BIFROST
 	default y if MALI_BIFROST_DEBUG
 	default n
 	help
-	  Enables tracing in kbase.  Trace log available through
+	  Enables tracing in kbase. Trace log available through
 	  the "mali_trace" debugfs file, when the CONFIG_DEBUG_FS is enabled
 
-config MALI_BIFROST_DEVFREQ
-	bool "devfreq support for Mali"
-	depends on MALI_BIFROST && PM_DEVFREQ
-	select DEVFREQ_GOV_SIMPLE_ONDEMAND
-	help
-	  Support devfreq for Mali.
-
-	  Using the devfreq framework and, by default, the simpleondemand
-	  governor, the frequency of Mali will be dynamically selected from the
-	  available OPPs.
-
 config MALI_BIFROST_DMA_FENCE
-	bool "DMA_BUF fence support for Mali"
+	bool "Enable DMA_BUF fence support for Mali"
 	depends on MALI_BIFROST
 	default n
 	help
@@ -82,18 +103,9 @@ config MALI_BIFROST_DMA_FENCE
 	  This option should only be enabled if the Linux Kernel has built in
 	  support for DMA_BUF fences.
 
-config MALI_PLATFORM_NAME
-	depends on MALI_BIFROST
-	string "Platform name"
-	default "devicetree"
-	help
-	  Enter the name of the desired platform configuration directory to
-	  include in the build. 'platform/$(MALI_PLATFORM_NAME)/Kbuild' must
-	  exist.
-
 config MALI_ARBITER_SUPPORT
 	bool "Enable arbiter support for Mali"
-	depends on MALI_BIFROST
+	depends on MALI_BIFROST && !MALI_CSF_SUPPORT
 	default n
 	help
 	  Enable support for the arbiter interface in the driver.
@@ -102,85 +114,40 @@ config MALI_ARBITER_SUPPORT
 
 	  If unsure, say N.
 
-# MALI_BIFROST_EXPERT configuration options
-
-menuconfig MALI_BIFROST_EXPERT
+config MALI_DMA_BUF_MAP_ON_DEMAND
+	bool "Enable map imported dma-bufs on demand"
 	depends on MALI_BIFROST
-	bool "Enable Expert Settings"
-	default n
-	help
-	  Enabling this option and modifying the default settings may produce a driver with performance or
-	  other limitations.
-
-config MALI_CORESTACK
-	bool "Support controlling power to the GPU core stack"
-	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
 	default n
 	help
-	  Enabling this feature on supported GPUs will let the driver powering
-	  on/off the GPU core stack independently without involving the Power
-	  Domain Controller. This should only be enabled on platforms which
-	  integration of the PDC to the Mali GPU is known to be problematic.
-	  This feature is currently only supported on t-Six and t-HEx GPUs.
-
-	  If unsure, say N.
-
-config MALI_BIFROST_DEBUG
-	bool "Debug build"
-	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
-	default n
-	help
-	  Select this option for increased checking and reporting of errors.
-
-config MALI_BIFROST_FENCE_DEBUG
-	bool "Debug sync fence usage"
-	depends on MALI_BIFROST && MALI_BIFROST_EXPERT && (SYNC || SYNC_FILE)
-	default y if MALI_BIFROST_DEBUG
-	help
-	  Select this option to enable additional checking and reporting on the
-	  use of sync fences in the Mali driver.
-
-	  This will add a 3s timeout to all sync fence waits in the Mali
-	  driver, so that when work for Mali has been waiting on a sync fence
-	  for a long time a debug message will be printed, detailing what fence
-	  is causing the block, and which dependent Mali atoms are blocked as a
-	  result of this.
+	  This option caused kbase to set up the GPU mapping of imported
+	  dma-buf when needed to run atoms. This is the legacy behavior.
 
-	  The timeout can be changed at runtime through the js_soft_timeout
-	  device attribute, where the timeout is specified in milliseconds.
+	  This is intended for testing and the option will get removed in the
+	  future.
 
-config MALI_BIFROST_NO_MALI
-	bool "No Mali"
-	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
+config MALI_DMA_BUF_LEGACY_COMPAT
+	bool "Enable legacy compatibility cache flush on dma-buf map"
+	depends on MALI_BIFROST && !MALI_DMA_BUF_MAP_ON_DEMAND
 	default n
 	help
-	  This can be used to test the driver in a simulated environment
-	  whereby the hardware is not physically present. If the hardware is physically
-	  present it will not be used. This can be used to test the majority of the
-	  driver without needing actual hardware or for software benchmarking.
-	  All calls to the simulated hardware will complete immediately as if the hardware
-	  completed the task.
+	  This option enables compatibility with legacy dma-buf mapping
+	  behavior, then the dma-buf is mapped on import, by adding cache
+	  maintenance where MALI_DMA_BUF_MAP_ON_DEMAND would do the mapping,
+	  including a cache flush.
 
-config MALI_REAL_HW
-	def_bool !MALI_BIFROST_NO_MALI
+	  This option might work-around issues related to missing cache
+	  flushes in other drivers. This only has an effect for clients using
+	  UK 11.18 or older. For later UK versions it is not possible.
 
-config MALI_BIFROST_ERROR_INJECT
-	bool "Error injection"
-	depends on MALI_BIFROST && MALI_BIFROST_EXPERT && MALI_BIFROST_NO_MALI
+menuconfig MALI_BIFROST_EXPERT
+	depends on MALI_BIFROST
+	bool "Enable Expert Settings"
 	default n
 	help
-	  Enables insertion of errors to test module failure and recovery mechanisms.
+	  Enabling this option and modifying the default settings may produce
+	  a driver with performance or other limitations.
 
-config MALI_BIFROST_SYSTEM_TRACE
-	bool "Enable system event tracing support"
-	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
-	default y if MALI_BIFROST_DEBUG
-	default n
-	help
-	  Choose this option to enable system trace events for each
-	  kbase event. This is typically used for debugging but has
-	  minimal overhead when not in use. Enable only if you know what
-	  you are doing.
+if MALI_BIFROST_EXPERT
 
 config MALI_2MB_ALLOC
 	bool "Attempt to allocate 2MB pages"
@@ -193,20 +160,8 @@ config MALI_2MB_ALLOC
 
 	  If in doubt, say N
 
-config MALI_PWRSOFT_765
-	bool "PWRSOFT-765 ticket"
-	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
-	default n
-	help
-	  PWRSOFT-765 fixes devfreq cooling devices issues. The fix was merged
-	  in kernel v4.10, however if backported into the kernel then this
-	  option must be manually selected.
-
-	  If using kernel >= v4.10 then say N, otherwise if devfreq cooling
-	  changes have been backported say Y to avoid compilation errors.
-
 config MALI_MEMORY_FULLY_BACKED
-	bool "Memory fully physically-backed"
+	bool "Enable memory fully physically-backed"
 	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
 	default n
 	help
@@ -215,76 +170,92 @@ config MALI_MEMORY_FULLY_BACKED
 	  option only affects allocations of grow-on-GPU-page-fault
 	  memory.
 
-config MALI_DMA_BUF_MAP_ON_DEMAND
-	bool "Map imported dma-bufs on demand"
-	depends on MALI_BIFROST
+config MALI_CORESTACK
+	bool "Enable support of GPU core stack power control"
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
 	default n
 	help
-	  This option caused kbase to set up the GPU mapping of imported
-	  dma-buf when needed to run atoms.  This is the legacy behaviour.
-
-	  This is intended for testing and the option will get removed in the
-	  future.
+	  Enabling this feature on supported GPUs will let the driver powering
+	  on/off the GPU core stack independently without involving the Power
+	  Domain Controller. This should only be enabled on platforms which
+	  integration of the PDC to the Mali GPU is known to be problematic.
+	  This feature is currently only supported on t-Six and t-HEx GPUs.
 
-config MALI_DMA_BUF_LEGACY_COMPAT
-	bool "Enable legacy compatibility cache flush on dma-buf map"
-	depends on MALI_BIFROST && !MALI_DMA_BUF_MAP_ON_DEMAND
-	default n
-	help
-	  This option enables compatibility with legacy dma-buf mapping
-	  behavior, then the dma-buf is mapped on import, by adding cache
-	  maintenance where MALI_DMA_BUF_MAP_ON_DEMAND would do the mapping,
-	  including a cache flush.
+	  If unsure, say N.
 
-	  This option might work-around issues related to missing cache
-	  flushes in other drivers. This only has an effect for clients using
-	  UK 11.18 or older. For later UK versions it is not possible.
+comment "Platform options"
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
 
-config MALI_HW_ERRATA_1485982_NOT_AFFECTED
-	bool "Disable workaround for BASE_HW_ISSUE_GPU2017_1336"
+config MALI_BIFROST_NO_MALI
+	bool "Enable No Mali"
 	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
 	default n
 	help
-	  This option disables the default workaround for GPU2017-1336. The
-	  workaround keeps the L2 cache powered up except for powerdown and reset.
-
-	  The workaround introduces a limitation that will prevent the running of
-	  protected mode content on fully coherent platforms, as the switch to IO
-	  coherency mode requires the L2 to be turned off.
+	  This can be used to test the driver in a simulated environment
+	  whereby the hardware is not physically present. If the hardware is physically
+	  present it will not be used. This can be used to test the majority of the
+	  driver without needing actual hardware or for software benchmarking.
+	  All calls to the simulated hardware will complete immediately as if the hardware
+	  completed the task.
 
-config MALI_HW_ERRATA_1485982_USE_CLOCK_ALTERNATIVE
-	bool "Use alternative workaround for BASE_HW_ISSUE_GPU2017_1336"
-	depends on MALI_BIFROST && MALI_BIFROST_EXPERT && !MALI_HW_ERRATA_1485982_NOT_AFFECTED
+config MALI_BIFROST_ERROR_INJECT
+	bool "Enable No Mali error injection"
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT && MALI_BIFROST_NO_MALI
 	default n
 	help
-	  This option uses an alternative workaround for GPU2017-1336. Lowering
-	  the GPU clock to a, platform specific, known good frequeuncy before
-	  powering down the L2 cache. The clock can be specified in the device
-	  tree using the property, opp-mali-errata-1485982. Otherwise the
-	  slowest clock will be selected.
+	  Enables insertion of errors to test module failure and recovery mechanisms.
 
 config MALI_GEM5_BUILD
 	bool "Enable build of Mali kernel driver for GEM5"
-	depends on MALI_BIFROST
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
 	default n
 	help
 	  This option is to do a Mali GEM5 build.
 	  If unsure, say N.
 
-# Instrumentation options.
+comment "Debug options"
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
 
-config MALI_JOB_DUMP
-	bool "Enable system level support needed for job dumping"
+config MALI_BIFROST_DEBUG
+	bool "Enable debug build"
 	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
 	default n
 	help
-	  Choose this option to enable system level support needed for
-	  job dumping. This is typically used for instrumentation but has
+	  Select this option for increased checking and reporting of errors.
+
+config MALI_BIFROST_FENCE_DEBUG
+	bool "Enable debug sync fence usage"
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT && (SYNC || SYNC_FILE)
+	default y if MALI_BIFROST_DEBUG
+	help
+	  Select this option to enable additional checking and reporting on the
+	  use of sync fences in the Mali driver.
+
+	  This will add a 3s timeout to all sync fence waits in the Mali
+	  driver, so that when work for Mali has been waiting on a sync fence
+	  for a long time a debug message will be printed, detailing what fence
+	  is causing the block, and which dependent Mali atoms are blocked as a
+	  result of this.
+
+	  The timeout can be changed at runtime through the js_soft_timeout
+	  device attribute, where the timeout is specified in milliseconds.
+
+config MALI_BIFROST_SYSTEM_TRACE
+	bool "Enable system event tracing support"
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
+	default y if MALI_BIFROST_DEBUG
+	default n
+	help
+	  Choose this option to enable system trace events for each
+	  kbase event. This is typically used for debugging but has
 	  minimal overhead when not in use. Enable only if you know what
 	  you are doing.
 
+comment "Instrumentation options"
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
+
 choice
-	prompt "Performance counters set"
+	prompt "Select Performance counters set"
 	default MALI_PRFCNT_SET_PRIMARY
 	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
 
@@ -321,7 +292,7 @@ config MALI_PRFCNT_SET_TERTIARY
 endchoice
 
 config MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS
-	bool "Allow runtime selection of performance counters set via debugfs"
+	bool "Enable runtime selection of performance counters set via debugfs"
 	depends on MALI_BIFROST && MALI_BIFROST_EXPERT && DEBUG_FS
 	default n
 	help
@@ -343,5 +314,65 @@ config MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS
 
 	  If unsure, say N.
 
-source "drivers/gpu/arm/midgard/platform/Kconfig"
-# source "drivers/gpu/arm/midgard/tests/Kconfig"
+config MALI_JOB_DUMP
+	bool "Enable system level support needed for job dumping"
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
+	default n
+	help
+	  Choose this option to enable system level support needed for
+	  job dumping. This is typically used for instrumentation but has
+	  minimal overhead when not in use. Enable only if you know what
+	  you are doing.
+
+comment "Workarounds"
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
+
+config MALI_PWRSOFT_765
+	bool "Enable workaround for PWRSOFT-765"
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
+	default n
+	help
+	  PWRSOFT-765 fixes devfreq cooling devices issues. The fix was merged
+	  in kernel v4.10, however if backported into the kernel then this
+	  option must be manually selected.
+
+	  If using kernel >= v4.10 then say N, otherwise if devfreq cooling
+	  changes have been backported say Y to avoid compilation errors.
+
+config MALI_HW_ERRATA_1485982_NOT_AFFECTED
+	bool "Disable workaround for BASE_HW_ISSUE_GPU2017_1336"
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
+	default n
+	help
+	  This option disables the default workaround for GPU2017-1336. The
+	  workaround keeps the L2 cache powered up except for powerdown and reset.
+
+	  The workaround introduces a limitation that will prevent the running of
+	  protected mode content on fully coherent platforms, as the switch to IO
+	  coherency mode requires the L2 to be turned off.
+
+config MALI_HW_ERRATA_1485982_USE_CLOCK_ALTERNATIVE
+	bool "Use alternative workaround for BASE_HW_ISSUE_GPU2017_1336"
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT && !MALI_HW_ERRATA_1485982_NOT_AFFECTED
+	default n
+	help
+	  This option uses an alternative workaround for GPU2017-1336. Lowering
+	  the GPU clock to a, platform specific, known good frequency before
+	  powering down the L2 cache. The clock can be specified in the device
+	  tree using the property, opp-mali-errata-1485982. Otherwise the
+	  slowest clock will be selected.
+
+endif
+
+config MALI_ARBITRATION
+	bool "Enable Virtualization reference code"
+	depends on MALI_BIFROST
+	default n
+	help
+	  Enables the build of several reference modules used in the reference
+	  virtualization setup for Mali
+	  If unsure, say N.
+
+source "drivers/gpu/arm/midgard/tests/Kconfig"
+
+endif
diff --git a/drivers/gpu/arm/bifrost/Makefile b/drivers/gpu/arm/bifrost/Makefile
index 89760d9f850a..ecc6f1ed2a6d 100644
--- a/drivers/gpu/arm/bifrost/Makefile
+++ b/drivers/gpu/arm/bifrost/Makefile
@@ -1,4 +1,4 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
 # (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
 #
@@ -18,47 +18,198 @@
 #
 #
 
-# Handle Android Common Kernel source naming
 KERNEL_SRC ?= /lib/modules/$(shell uname -r)/build
 KDIR ?= $(KERNEL_SRC)
 
-# out-of-tree
-ifeq ($(KBUILD_EXTMOD),)
-export CONFIG_MALI_MIDGARD?=m
+ifeq ($(KDIR),)
+    $(error Must specify KDIR to point to the kernel to target))
+endif
 
-ifneq ($(CONFIG_MALI_MIDGARD),n)
-export CONFIG_MALI_CSF_SUPPORT?=n
-export CONFIG_MALI_KUTF?=m
-export CONFIG_MALI_REAL_HW?=y
+#
+# Default configuration values
+#
+# Dependency resolution is done through statements as Kconfig
+# is not supported for out-of-tree builds.
+#
 
-# Handle default y/m in Kconfig
-export CONFIG_MALI_BIFROST_GATOR_SUPPORT?=y
-export CONFIG_MALI_BIFROST_DEVFREQ?=n
-ifneq ($(CONFIG_PM_DEVFREQ),n)
-export CONFIG_MALI_BIFROST_DEVFREQ?=y
-endif
+CONFIG_MALI_BIFROST ?= m
+ifeq ($(CONFIG_MALI_BIFROST),m)
+    CONFIG_MALI_BIFROST_GATOR_SUPPORT ?= y
+    CONFIG_MALI_ARBITRATION ?= n
+    CONFIG_MALI_PARTITION_MANAGER ?= n
 
-DEFINES += -DCONFIG_MALI_MIDGARD=$(CONFIG_MALI_MIDGARD) \
-	-DCONFIG_MALI_CSF_SUPPORT=$(CONFIG_MALI_CSF_SUPPORT) \
-	-DCONFIG_MALI_KUTF=$(CONFIG_MALI_KUTF) \
-	-DCONFIG_MALI_REAL_HW=$(CONFIG_MALI_REAL_HW) \
-	-DCONFIG_MALI_GATOR_SUPPORT=$(CONFIG_MALI_BIFROST_GATOR_SUPPORT) \
-	-DCONFIG_MALI_DEVFREQ=$(CONFIG_MALI_BIFROST_DEVFREQ)
+    ifneq ($(CONFIG_MALI_BIFROST_NO_MALI),y)
+        # Prevent misuse when CONFIG_MALI_BIFROST_NO_MALI=y
+        CONFIG_MALI_REAL_HW ?= y
+    endif
 
-export DEFINES
+    ifeq ($(CONFIG_MALI_BIFROST_DVFS),y)
+        # Prevent misuse when CONFIG_MALI_BIFROST_DVFS=y
+        CONFIG_MALI_BIFROST_DEVFREQ ?= n
+    else
+        CONFIG_MALI_BIFROST_DEVFREQ ?= y
+    endif
 
+    ifeq ($(CONFIG_MALI_DMA_BUF_MAP_ON_DEMAND), y)
+        # Prevent misuse when CONFIG_MALI_DMA_BUF_MAP_ON_DEMAND=y
+        CONFIG_MALI_DMA_BUF_LEGACY_COMPAT = n
+    endif
+
+    ifeq ($(CONFIG_BSP_HAS_HYPERVISOR),y)
+        ifneq ($(CONFIG_MALI_ARBITRATION), n)
+            CONFIG_MALI_XEN ?= m
+        endif
+    endif
+
+    #
+    # Expert/Debug/Test released configurations
+    #
+    ifeq ($(CONFIG_MALI_BIFROST_EXPERT), y)
+        ifeq ($(CONFIG_MALI_BIFROST_NO_MALI), y)
+            CONFIG_MALI_REAL_HW = n
+        else
+            # Prevent misuse when CONFIG_MALI_BIFROST_NO_MALI=n
+            CONFIG_MALI_REAL_HW = y
+            CONFIG_MALI_BIFROST_ERROR_INJECT = n
+        endif
+
+        ifeq ($(CONFIG_MALI_HW_ERRATA_1485982_NOT_AFFECTED), y)
+            # Prevent misuse when CONFIG_MALI_HW_ERRATA_1485982_NOT_AFFECTED=y
+            CONFIG_MALI_HW_ERRATA_1485982_USE_CLOCK_ALTERNATIVE = n
+        endif
+
+        ifeq ($(CONFIG_MALI_BIFROST_DEBUG), y)
+            CONFIG_MALI_BIFROST_ENABLE_TRACE ?= y
+            CONFIG_MALI_BIFROST_SYSTEM_TRACE ?= y
+
+            ifeq ($(CONFIG_SYNC), y)
+                CONFIG_MALI_BIFROST_FENCE_DEBUG ?= y
+            else
+                ifeq ($(CONFIG_SYNC_FILE), y)
+                    CONFIG_MALI_BIFROST_FENCE_DEBUG ?= y
+                else
+                    CONFIG_MALI_BIFROST_FENCE_DEBUG = n
+                endif
+            endif
+        else
+            # Prevent misuse when CONFIG_MALI_BIFROST_DEBUG=n
+            CONFIG_MALI_BIFROST_ENABLE_TRACE = n
+            CONFIG_MALI_BIFROST_SYSTEM_TRACE = n
+            CONFIG_MALI_BIFROST_FENCE_DEBUG = n
+        endif
+    else
+        # Prevent misuse when CONFIG_MALI_BIFROST_EXPERT=n
+        CONFIG_MALI_CORESTACK = n
+        CONFIG_MALI_2MB_ALLOC = n
+        CONFIG_MALI_PWRSOFT_765 = n
+        CONFIG_MALI_MEMORY_FULLY_BACKED = n
+        CONFIG_MALI_JOB_DUMP = n
+        CONFIG_MALI_BIFROST_NO_MALI = n
+        CONFIG_MALI_REAL_HW = y
+        CONFIG_MALI_BIFROST_ERROR_INJECT = n
+        CONFIG_MALI_HW_ERRATA_1485982_NOT_AFFECTED = n
+        CONFIG_MALI_HW_ERRATA_1485982_USE_CLOCK_ALTERNATIVE = n
+        CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS = n
+        CONFIG_MALI_BIFROST_DEBUG = n
+        CONFIG_MALI_BIFROST_ENABLE_TRACE = n
+        CONFIG_MALI_BIFROST_SYSTEM_TRACE = n
+        CONFIG_MALI_BIFROST_FENCE_DEBUG = n
+    endif
+
+    ifeq ($(CONFIG_MALI_BIFROST_DEBUG), y)
+        CONFIG_MALI_KUTF ?= y
+        ifeq ($(CONFIG_MALI_KUTF), y)
+            CONFIG_MALI_KUTF_IRQ_TEST ?= y
+            CONFIG_MALI_KUTF_CLK_RATE_TRACE ?= y
+        else
+            # Prevent misuse when CONFIG_MALI_KUTF=n
+            CONFIG_MALI_KUTF_IRQ_TEST = n
+            CONFIG_MALI_KUTF_CLK_RATE_TRACE = n
+        endif
+    else
+        # Prevent misuse when CONFIG_MALI_BIFROST_DEBUG=n
+        CONFIG_MALI_KUTF = n
+        CONFIG_MALI_KUTF_IRQ_TEST = n
+        CONFIG_MALI_KUTF_CLK_RATE_TRACE = n
+    endif
+else
+    # Prevent misuse when CONFIG_MALI_BIFROST=n
+    CONFIG_MALI_ARBITRATION = n
+    CONFIG_MALI_KUTF = n
+    CONFIG_MALI_KUTF_IRQ_TEST = n
+    CONFIG_MALI_KUTF_CLK_RATE_TRACE = n
 endif
-endif
 
-KBASE_PATH_RELATIVE = $(CURDIR)
+# All Mali CONFIG should be listed here
+CONFIGS := \
+    CONFIG_MALI_BIFROST \
+    CONFIG_MALI_CSF_SUPPORT \
+    CONFIG_MALI_BIFROST_GATOR_SUPPORT \
+    CONFIG_MALI_BIFROST_DMA_FENCE \
+    CONFIG_MALI_ARBITER_SUPPORT \
+    CONFIG_MALI_ARBITRATION \
+    CONFIG_MALI_PARTITION_MANAGER \
+    CONFIG_MALI_REAL_HW \
+    CONFIG_MALI_GEM5_BUILD \
+    CONFIG_MALI_BIFROST_DEVFREQ \
+    CONFIG_MALI_BIFROST_DVFS \
+    CONFIG_MALI_DMA_BUF_MAP_ON_DEMAND \
+    CONFIG_MALI_DMA_BUF_LEGACY_COMPAT \
+    CONFIG_MALI_BIFROST_EXPERT \
+    CONFIG_MALI_CORESTACK \
+    CONFIG_MALI_2MB_ALLOC \
+    CONFIG_MALI_PWRSOFT_765 \
+    CONFIG_MALI_MEMORY_FULLY_BACKED \
+    CONFIG_MALI_JOB_DUMP \
+    CONFIG_MALI_BIFROST_NO_MALI \
+    CONFIG_MALI_BIFROST_ERROR_INJECT \
+    CONFIG_MALI_HW_ERRATA_1485982_NOT_AFFECTED \
+    CONFIG_MALI_HW_ERRATA_1485982_USE_CLOCK_ALTERNATIVE \
+    CONFIG_MALI_PRFCNT_SET_PRIMARY \
+    CONFIG_MALI_BIFROST_PRFCNT_SET_SECONDARY \
+    CONFIG_MALI_PRFCNT_SET_TERTIARY \
+    CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS \
+    CONFIG_MALI_BIFROST_DEBUG \
+    CONFIG_MALI_BIFROST_ENABLE_TRACE \
+    CONFIG_MALI_BIFROST_SYSTEM_TRACE \
+    CONFIG_MALI_BIFROST_FENCE_DEBUG \
+    CONFIG_MALI_KUTF \
+    CONFIG_MALI_KUTF_IRQ_TEST \
+    CONFIG_MALI_KUTF_CLK_RATE_TRACE \
+    CONFIG_MALI_XEN
+
+
+#
+# MAKE_ARGS to pass the custom CONFIGs on out-of-tree build
+#
+# Generate the list of CONFIGs and values.
+# $(value config) is the name of the CONFIG option.
+# $(value $(value config)) is its value (y, m).
+# When the CONFIG is not set to y or m, it defaults to n.
+MAKE_ARGS := $(foreach config,$(CONFIGS), \
+                    $(if $(filter y m,$(value $(value config))), \
+                        $(value config)=$(value $(value config)), \
+                        $(value config)=n))
+
+#
+# EXTRA_CFLAGS to define the custom CONFIGs on out-of-tree build
+#
+# Generate the list of CONFIGs defines with values from CONFIGS.
+# $(value config) is the name of the CONFIG option.
+# When set to y or m, the CONFIG gets defined to 1.
+EXTRA_CFLAGS := $(foreach config,$(CONFIGS), \
+                    $(if $(filter y m,$(value $(value config))), \
+                        -D$(value config)=1))
 
+#
+# KBUILD_EXTRA_SYMBOLS to prevent warnings about unknown functions
+#
 
-# we get the symbols from modules using KBUILD_EXTRA_SYMBOLS to prevent warnings about unknown functions
 all:
-	$(MAKE) -C $(KDIR) M=$(CURDIR) EXTRA_CFLAGS="-I$(CURDIR)/../../../../include -I$(CURDIR)/../../../../tests/include $(SCONS_CFLAGS)" $(SCONS_CONFIGS) KBUILD_EXTRA_SYMBOLS="$(EXTRA_SYMBOLS)" modules
+	$(MAKE) -C $(KDIR) M=$(CURDIR) $(MAKE_ARGS) EXTRA_CFLAGS="$(EXTRA_CFLAGS)" KBUILD_EXTRA_SYMBOLS="$(EXTRA_SYMBOLS)" modules
 
 modules_install:
-	$(MAKE) -C $(KDIR) M=$(CURDIR) modules_install
+	$(MAKE) -C $(KDIR) M=$(CURDIR) $(MAKE_ARGS) modules_install
 
 clean:
-	$(MAKE) -C $(KDIR) M=$(CURDIR) clean
+	$(MAKE) -C $(KDIR) M=$(CURDIR) $(MAKE_ARGS) clean
diff --git a/drivers/gpu/arm/bifrost/Mconfig b/drivers/gpu/arm/bifrost/Mconfig
index 7d6695d5eae7..83bd0ad0d682 100644
--- a/drivers/gpu/arm/bifrost/Mconfig
+++ b/drivers/gpu/arm/bifrost/Mconfig
@@ -1,4 +1,4 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
 # (C) COPYRIGHT 2012-2021 ARM Limited. All rights reserved.
 #
@@ -27,20 +27,44 @@ menuconfig MALI_BIFROST
 	  To compile this driver as a module, choose M here:
 	  this will generate a single module, called mali_kbase.
 
+config MALI_PLATFORM_NAME
+	depends on MALI_BIFROST
+	string "Platform name"
+	default "hisilicon" if PLATFORM_HIKEY960
+	default "hisilicon" if PLATFORM_HIKEY970
+	default "devicetree"
+	help
+	  Enter the name of the desired platform configuration directory to
+	  include in the build. 'platform/$(MALI_PLATFORM_NAME)/Makefile' must
+	  exist.
+
+	  When PLATFORM_CUSTOM is set, this needs to be set manually to
+	  pick up the desired platform files.
+
+config MALI_REAL_HW
+	bool
+	depends on MALI_BIFROST
+	default y
+	default n if NO_MALI
+
 config MALI_CSF_SUPPORT
-	bool "Mali CSF based GPU support"
+	bool "Enable Mali CSF based GPU support"
 	depends on MALI_BIFROST
-	default n
+	default y if GPU_HAS_CSF
 	help
 	  Enables support for CSF based GPUs.
 
-config MALI_BIFROST_GATOR_SUPPORT
-	bool "Enable Streamline tracing support"
-	depends on MALI_BIFROST && !BACKEND_USER
-	default y
+config MALI_BIFROST_DEVFREQ
+	bool "Enable devfreq support for Mali"
+	depends on MALI_BIFROST
+	default y if PLATFORM_JUNO
+	default y if PLATFORM_CUSTOM
 	help
-	  Enables kbase tracing used by the Arm Streamline Performance Analyzer.
-	  The tracepoints are used to derive GPU activity charts in Streamline.
+	  Support devfreq for Mali.
+
+	  Using the devfreq framework and, by default, the simple on-demand
+	  governor, the frequency of Mali will be dynamically selected from the
+	  available OPPs.
 
 config MALI_BIFROST_DVFS
 	bool "Enable legacy DVFS"
@@ -49,28 +73,25 @@ config MALI_BIFROST_DVFS
 	help
 	  Choose this option to enable legacy DVFS in the Mali Midgard DDK.
 
+config MALI_BIFROST_GATOR_SUPPORT
+	bool "Enable Streamline tracing support"
+	depends on MALI_BIFROST && !BACKEND_USER
+	default y
+	help
+	  Enables kbase tracing used by the Arm Streamline Performance Analyzer.
+	  The tracepoints are used to derive GPU activity charts in Streamline.
+
 config MALI_BIFROST_ENABLE_TRACE
 	bool "Enable kbase tracing"
+	depends on MALI_BIFROST
 	default y if MALI_BIFROST_DEBUG
 	default n
 	help
-	  Enables tracing in kbase.  Trace log available through
+	  Enables tracing in kbase. Trace log available through
 	  the "mali_trace" debugfs file, when the CONFIG_DEBUG_FS is enabled
 
-config MALI_BIFROST_DEVFREQ
-	bool "devfreq support for Mali"
-	depends on MALI_BIFROST
-	default y if PLATFORM_JUNO
-	default y if PLATFORM_CUSTOM
-	help
-	  Support devfreq for Mali.
-
-	  Using the devfreq framework and, by default, the simpleondemand
-	  governor, the frequency of Mali will be dynamically selected from the
-	  available OPPs.
-
 config MALI_BIFROST_DMA_FENCE
-	bool "DMA_BUF fence support for Mali"
+	bool "Enable DMA_BUF fence support for Mali"
 	depends on MALI_BIFROST
 	default n
 	help
@@ -79,23 +100,9 @@ config MALI_BIFROST_DMA_FENCE
 	  This option should only be enabled if the Linux Kernel has built in
 	  support for DMA_BUF fences.
 
-config MALI_PLATFORM_NAME
-	depends on MALI_BIFROST
-	string "Platform name"
-	default "hisilicon" if PLATFORM_HIKEY960
-	default "hisilicon" if PLATFORM_HIKEY970
-	default "devicetree"
-	help
-	  Enter the name of the desired platform configuration directory to
-	  include in the build. 'platform/$(MALI_PLATFORM_NAME)/Kbuild' must
-	  exist.
-
-	  When PLATFORM_CUSTOM is set, this needs to be set manually to
-	  pick up the desired platform files.
-
 config MALI_ARBITER_SUPPORT
 	bool "Enable arbiter support for Mali"
-	depends on MALI_BIFROST && !GPU_HAS_CSF
+	depends on MALI_BIFROST && !MALI_CSF_SUPPORT
 	default n
 	help
 	  Enable support for the arbiter interface in the driver.
@@ -104,62 +111,89 @@ config MALI_ARBITER_SUPPORT
 
 	  If unsure, say N.
 
-# MALI_BIFROST_EXPERT configuration options
+config DMA_BUF_SYNC_IOCTL_SUPPORTED
+	bool "Enable Kernel DMA buffers support DMA_BUF_IOCTL_SYNC"
+	depends on MALI_BIFROST && BACKEND_KERNEL
+	default y
+
+config MALI_DMA_BUF_MAP_ON_DEMAND
+	bool "Enable map imported dma-bufs on demand"
+	depends on MALI_BIFROST
+	default n
+	default y if !DMA_BUF_SYNC_IOCTL_SUPPORTED
+	help
+	  This option caused kbase to set up the GPU mapping of imported
+	  dma-buf when needed to run atoms. This is the legacy behavior.
+
+	  This is intended for testing and the option will get removed in the
+	  future.
+
+config MALI_DMA_BUF_LEGACY_COMPAT
+	bool "Enable legacy compatibility cache flush on dma-buf map"
+	depends on MALI_BIFROST && !MALI_DMA_BUF_MAP_ON_DEMAND
+	default n
+	help
+	  This option enables compatibility with legacy dma-buf mapping
+	  behavior, then the dma-buf is mapped on import, by adding cache
+	  maintenance where MALI_DMA_BUF_MAP_ON_DEMAND would do the mapping,
+	  including a cache flush.
+
+	  This option might work-around issues related to missing cache
+	  flushes in other drivers. This only has an effect for clients using
+	  UK 11.18 or older. For later UK versions it is not possible.
 
 menuconfig MALI_BIFROST_EXPERT
 	depends on MALI_BIFROST
 	bool "Enable Expert Settings"
 	default y
 	help
-	  Enabling this option and modifying the default settings may produce a driver with performance or
-	  other limitations.
+	  Enabling this option and modifying the default settings may produce
+	  a driver with performance or other limitations.
 
-config MALI_CORESTACK
-	bool "Support controlling power to the GPU core stack"
+config MALI_2MB_ALLOC
+	bool "Attempt to allocate 2MB pages"
 	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
 	default n
 	help
-	  Enabling this feature on supported GPUs will let the driver powering
-	  on/off the GPU core stack independently without involving the Power
-	  Domain Controller. This should only be enabled on platforms which
-	  integration of the PDC to the Mali GPU is known to be problematic.
-	  This feature is currently only supported on t-Six and t-HEx GPUs.
+	  Rather than allocating all GPU memory page-by-page, attempt to
+	  allocate 2MB pages from the kernel. This reduces TLB pressure and
+	  helps to prevent memory fragmentation.
 
-	  If unsure, say N.
+	  If in doubt, say N
 
-config MALI_BIFROST_DEBUG
-	bool "Debug build"
+config MALI_MEMORY_FULLY_BACKED
+	bool "Enable memory fully physically-backed"
 	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
-	default y if DEBUG
 	default n
 	help
-	  Select this option for increased checking and reporting of errors.
+	  This option enables full physical backing of all virtual
+	  memory allocations in the kernel. Notice that this build
+	  option only affects allocations of grow-on-GPU-page-fault
+	  memory.
 
-config MALI_BIFROST_FENCE_DEBUG
-	bool "Debug sync fence usage"
+config MALI_CORESTACK
+	bool "Enable support of GPU core stack power control"
 	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
-	default y if MALI_BIFROST_DEBUG
+	default n
 	help
-	  Select this option to enable additional checking and reporting on the
-	  use of sync fences in the Mali driver.
-
-	  This will add a 3s timeout to all sync fence waits in the Mali
-	  driver, so that when work for Mali has been waiting on a sync fence
-	  for a long time a debug message will be printed, detailing what fence
-	  is causing the block, and which dependent Mali atoms are blocked as a
-	  result of this.
+	  Enabling this feature on supported GPUs will let the driver powering
+	  on/off the GPU core stack independently without involving the Power
+	  Domain Controller. This should only be enabled on platforms which
+	  integration of the PDC to the Mali GPU is known to be problematic.
+	  This feature is currently only supported on t-Six and t-HEx GPUs.
 
-	  The timeout can be changed at runtime through the js_soft_timeout
-	  device attribute, where the timeout is specified in milliseconds.
+	  If unsure, say N.
 
 choice
 	prompt "Error injection level"
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
 	default MALI_ERROR_INJECT_NONE
 	help
 	  Enables insertion of errors to test module failure and recovery mechanisms.
 
 config MALI_ERROR_INJECT_NONE
 	bool "disabled"
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
 	help
 	  Error injection is disabled.
 
@@ -179,14 +213,49 @@ endchoice
 
 config MALI_ERROR_INJECT_ON
 	string
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
 	default "0" if MALI_ERROR_INJECT_NONE
 	default "1" if MALI_ERROR_INJECT_TRACK_LIST
 	default "2" if MALI_ERROR_INJECT_RANDOM
 
 config MALI_BIFROST_ERROR_INJECT
 	bool
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
 	default y if !MALI_ERROR_INJECT_NONE
 
+config MALI_GEM5_BUILD
+	bool "Enable build of Mali kernel driver for GEM5"
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
+	default n
+	help
+	  This option is to do a Mali GEM5 build.
+	  If unsure, say N.
+
+config MALI_BIFROST_DEBUG
+	bool "Enable debug build"
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
+	default y if DEBUG
+	default n
+	help
+	  Select this option for increased checking and reporting of errors.
+
+config MALI_BIFROST_FENCE_DEBUG
+	bool "Enable debug sync fence usage"
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
+	default y if MALI_BIFROST_DEBUG
+	help
+	  Select this option to enable additional checking and reporting on the
+	  use of sync fences in the Mali driver.
+
+	  This will add a 3s timeout to all sync fence waits in the Mali
+	  driver, so that when work for Mali has been waiting on a sync fence
+	  for a long time a debug message will be printed, detailing what fence
+	  is causing the block, and which dependent Mali atoms are blocked as a
+	  result of this.
+
+	  The timeout can be changed at runtime through the js_soft_timeout
+	  device attribute, where the timeout is specified in milliseconds.
+
 config MALI_BIFROST_SYSTEM_TRACE
 	bool "Enable system event tracing support"
 	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
@@ -198,56 +267,35 @@ config MALI_BIFROST_SYSTEM_TRACE
 	  minimal overhead when not in use. Enable only if you know what
 	  you are doing.
 
-config MALI_2MB_ALLOC
-	bool "Attempt to allocate 2MB pages"
+# Instrumentation options.
+
+# config MALI_PRFCNT_SET_PRIMARY exists in the Kernel Kconfig but is configured using CINSTR_PRIMARY_HWC in Mconfig.
+# config MALI_BIFROST_PRFCNT_SET_SECONDARY exists in the Kernel Kconfig but is configured using CINSTR_SECONDARY_HWC in Mconfig.
+# config MALI_PRFCNT_SET_TERTIARY exists in the Kernel Kconfig but is configured using CINSTR_TERTIARY_HWC in Mconfig.
+# config MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS exists in the Kernel Kconfig but is configured using CINSTR_HWC_SET_SELECT_VIA_DEBUG_FS in Mconfig.
+
+config MALI_JOB_DUMP
+	bool "Enable system level support needed for job dumping"
 	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
 	default n
 	help
-	  Rather than allocating all GPU memory page-by-page, attempt to
-	  allocate 2MB pages from the kernel. This reduces TLB pressure and
-	  helps to prevent memory fragmentation.
-
-	  If in doubt, say N
+	  Choose this option to enable system level support needed for
+	  job dumping. This is typically used for instrumentation but has
+	  minimal overhead when not in use. Enable only if you know what
+	  you are doing.
 
 config MALI_PWRSOFT_765
-	bool "PWRSOFT-765 ticket"
+	bool "Enable workaround for PWRSOFT-765"
 	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
 	default n
 	help
-	  PWRSOFT-765 fixes devfreq cooling devices issues. However, they are
-	  not merged in mainline kernel yet. So this define helps to guard those
-	  parts of the code.
+	  PWRSOFT-765 fixes devfreq cooling devices issues. The fix was merged
+	  in kernel v4.10, however if backported into the kernel then this
+	  option must be manually selected.
 
-config MALI_MEMORY_FULLY_BACKED
-	bool "Memory fully physically-backed"
-	default n
-	help
-	  This option enables full backing of all virtual memory allocations
-	  for the kernel. This only affects grow-on-GPU-page-fault memory.
+	  If using kernel >= v4.10 then say N, otherwise if devfreq cooling
+	  changes have been backported say Y to avoid compilation errors.
 
-config MALI_DMA_BUF_MAP_ON_DEMAND
-	bool "Map imported dma-bufs on demand"
-	depends on MALI_BIFROST
-	default n
-	default y if !DMA_BUF_SYNC_IOCTL_SUPPORTED
-	help
-	  This option caused kbase to set up the GPU mapping of imported
-	  dma-buf when needed to run atoms.  This is the legacy behaviour.
-
-config MALI_DMA_BUF_LEGACY_COMPAT
-	bool "Enable legacy compatibility cache flush on dma-buf map"
-	depends on MALI_BIFROST && !MALI_DMA_BUF_MAP_ON_DEMAND
-	default n
-	help
-	  This option enables compatibility with legacy dma-buf mapping
-	  behavior, then the dma-buf is mapped on import, by adding cache
-	  maintenance where MALI_DMA_BUF_MAP_ON_DEMAND would do the mapping,
-	  including a cache flush.
-
-config MALI_REAL_HW
-	bool
-	default y
-	default n if NO_MALI
 
 config MALI_HW_ERRATA_1485982_NOT_AFFECTED
 	bool "Disable workaround for BASE_HW_ISSUE_GPU2017_1336"
@@ -273,20 +321,6 @@ config MALI_HW_ERRATA_1485982_USE_CLOCK_ALTERNATIVE
 	  tree using the property, opp-mali-errata-1485982. Otherwise the
 	  slowest clock will be selected.
 
-config MALI_GEM5_BUILD
-	bool "Enable build of Mali kernel driver for GEM5"
-	depends on MALI_BIFROST
-	default n
-	help
-	  This option is to do a Mali GEM5 build.
-	  If unsure, say N.
-
-# Instrumentation options.
-
-# config MALI_JOB_DUMP exists in the Kernel Kconfig but is configured using CINSTR_JOB_DUMP in Mconfig.
-# config MALI_PRFCNT_SET_PRIMARY exists in the Kernel Kconfig but is configured using CINSTR_PRIMARY_HWC in Mconfig.
-# config MALI_BIFROST_PRFCNT_SET_SECONDARY exists in the Kernel Kconfig but is configured using CINSTR_SECONDARY_HWC in Mconfig.
-# config MALI_PRFCNT_SET_TERTIARY exists in the Kernel Kconfig but is configured using CINSTR_TERTIARY_HWC in Mconfig.
-# config MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS exists in the Kernel Kconfig but is configured using CINSTR_HWC_SET_SELECT_VIA_DEBUG_FS in Mconfig.
 
+source "kernel/drivers/gpu/arm/midgard/arbitration/Mconfig"
 source "kernel/drivers/gpu/arm/midgard/tests/Mconfig"
diff --git a/drivers/gpu/arm/bifrost/arbiter/Kbuild b/drivers/gpu/arm/bifrost/arbiter/Kbuild
index 4c04cabce93c..2e6b111441ca 100644
--- a/drivers/gpu/arm/bifrost/arbiter/Kbuild
+++ b/drivers/gpu/arm/bifrost/arbiter/Kbuild
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
@@ -19,5 +19,5 @@
 #
 
 bifrost_kbase-y += \
-	arbiter/mali_kbase_arbif.o \
-	arbiter/mali_kbase_arbiter_pm.o
+    arbiter/mali_kbase_arbif.o \
+    arbiter/mali_kbase_arbiter_pm.o
diff --git a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbif.c b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbif.c
index 7d6ab0cd95c7..64e11ce53625 100644
--- a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbif.c
+++ b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbif.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -170,11 +170,15 @@ static void on_gpu_lost(struct device *dev)
  *
  * Initialise Kbase Arbiter interface and assign callback functions.
  *
- * Return: 0 on success else a Linux error code
+ * Return:
+ * * 0			- the interface was initialized or was not specified
+ * *			in the device tree.
+ * * -EFAULT		- the interface was specified but failed to initialize.
+ * * -EPROBE_DEFER	- module dependencies are not yet available.
  */
 int kbase_arbif_init(struct kbase_device *kbdev)
 {
-#ifdef CONFIG_OF
+#if IS_ENABLED(CONFIG_OF)
 	struct arbiter_if_arb_vm_ops ops;
 	struct arbiter_if_dev *arb_if;
 	struct device_node *arbiter_if_node;
@@ -218,8 +222,8 @@ int kbase_arbif_init(struct kbase_device *kbdev)
 	ops.arb_vm_max_config = on_max_config;
 	ops.arb_vm_update_freq = on_update_freq;
 
-
 	kbdev->arb.arb_freq.arb_freq = 0;
+	kbdev->arb.arb_freq.freq_updated = false;
 	mutex_init(&kbdev->arb.arb_freq.arb_freq_lock);
 
 	/* register kbase arbiter_if callbacks */
@@ -229,6 +233,8 @@ int kbase_arbif_init(struct kbase_device *kbdev)
 		if (err) {
 			dev_err(&pdev->dev, "Failed to register with arbiter\n");
 			module_put(pdev->dev.driver->owner);
+			if (err != -EPROBE_DEFER)
+				err = -EFAULT;
 			return err;
 		}
 	}
@@ -307,6 +313,8 @@ void kbase_arbif_gpu_stopped(struct kbase_device *kbdev, u8 gpu_required)
 	if (arb_if && arb_if->vm_ops.vm_arb_gpu_stopped) {
 		dev_dbg(kbdev->dev, "%s\n", __func__);
 		KBASE_TLSTREAM_TL_ARBITER_STOPPED(kbdev, kbdev);
+		if (gpu_required)
+			KBASE_TLSTREAM_TL_ARBITER_REQUESTED(kbdev, kbdev);
 		arb_if->vm_ops.vm_arb_gpu_stopped(arb_if, gpu_required);
 	}
 }
diff --git a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbif.h b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbif.h
index 710559c4fe02..701ffd42f6f7 100644
--- a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbif.h
+++ b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbif.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -57,8 +57,11 @@ enum kbase_arbif_evt {
  * Initialize the arbiter interface and also determines
  * if Arbiter functionality is required.
  *
- * Return: 0 if the Arbiter interface was successfully initialized or the
- *           Arbiter was not required.
+ * Return:
+ * * 0			- the interface was initialized or was not specified
+ * *			in the device tree.
+ * * -EFAULT		- the interface was specified but failed to initialize.
+ * * -EPROBE_DEFER	- module dependencies are not yet available.
  */
 int kbase_arbif_init(struct kbase_device *kbdev);
 
diff --git a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_defs.h b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_defs.h
index 586c5d4f69db..570a82afa0ce 100644
--- a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_defs.h
+++ b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_defs.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_interface.h b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_interface.h
index 84389e828f4d..c0137f7adc9d 100644
--- a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_interface.h
+++ b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_interface.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -132,6 +132,11 @@ struct arbiter_if_vm_arb_ops {
 	 * @dev: The device structure to supply in the callbacks.
 	 * @ops: The callbacks that the device driver supports
 	 *       (none are optional).
+	 *
+	 * Return:
+	 * * 0			- successful.
+	 * * -EINVAL		- invalid argument.
+	 * * -EPROBE_DEFER	- module dependencies are not yet available.
 	 */
 	int (*vm_arb_register_dev)(struct arbiter_if_dev *arbif_dev,
 		struct device *dev, struct arbiter_if_arb_vm_ops *ops);
diff --git a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_pm.c b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_pm.c
index 456cc70753cd..5c75686254ed 100644
--- a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_pm.c
+++ b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_pm.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -27,9 +27,9 @@
 #include <mali_kbase.h>
 #include <mali_kbase_pm.h>
 #include <mali_kbase_hwaccess_jm.h>
-#include <mali_kbase_irq_internal.h>
+#include <backend/gpu/mali_kbase_irq_internal.h>
 #include <mali_kbase_hwcnt_context.h>
-#include <mali_kbase_pm_internal.h>
+#include <backend/gpu/mali_kbase_pm_internal.h>
 #include <tl/mali_kbase_tracepoints.h>
 #include <mali_kbase_gpuprops.h>
 
@@ -37,6 +37,7 @@
  * after the following time (in milliseconds) has ellapsed.
  */
 #define GPU_REQUEST_TIMEOUT 1000
+#define KHZ_TO_HZ 1000
 
 #define MAX_L2_SLICES_MASK		0xFF
 
@@ -528,8 +529,16 @@ int kbase_arbiter_pm_gpu_assigned(struct kbase_device *kbdev)
 static void kbase_arbiter_pm_vm_gpu_start(struct kbase_device *kbdev)
 {
 	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
+	bool freq_updated = false;
 
 	lockdep_assert_held(&arb_vm_state->vm_state_lock);
+	mutex_lock(&kbdev->arb.arb_freq.arb_freq_lock);
+	if (kbdev->arb.arb_freq.freq_updated) {
+		kbdev->arb.arb_freq.freq_updated = false;
+		freq_updated = true;
+	}
+	mutex_unlock(&kbdev->arb.arb_freq.arb_freq_lock);
+
 	cancel_request_timer(kbdev);
 	switch (arb_vm_state->vm_state) {
 	case KBASE_VM_STATE_INITIALIZING:
@@ -555,9 +564,16 @@ static void kbase_arbiter_pm_vm_gpu_start(struct kbase_device *kbdev)
 		kbase_arbiter_pm_vm_set_state(kbdev, KBASE_VM_STATE_SUSPENDED);
 		break;
 	default:
-		dev_warn(kbdev->dev,
-			"GPU_GRANTED when not expected - state %s\n",
-			kbase_arbiter_pm_vm_state_str(arb_vm_state->vm_state));
+		/*
+		 * GPU_GRANTED can be received when there is a frequency update
+		 * Only show a warning if received in an unexpected state
+		 * without a frequency update
+		 */
+		if (!freq_updated)
+			dev_warn(kbdev->dev,
+				"GPU_GRANTED when not expected - state %s\n",
+				kbase_arbiter_pm_vm_state_str(
+					arb_vm_state->vm_state));
 		break;
 	}
 }
@@ -1005,13 +1021,25 @@ int kbase_arbiter_pm_ctx_active_handle_suspend(struct kbase_device *kbdev,
  * kbase_arbiter_pm_update_gpu_freq() - Updates GPU clock frequency received
  * from arbiter.
  * @arb_freq - Pointer to struchture holding GPU clock frequenecy data
- * @freq - New frequency value
+ * @freq - New frequency value in KHz
  */
 void kbase_arbiter_pm_update_gpu_freq(struct kbase_arbiter_freq *arb_freq,
-		uint32_t freq)
+	uint32_t freq)
 {
+	struct kbase_gpu_clk_notifier_data ndata;
+
 	mutex_lock(&arb_freq->arb_freq_lock);
-	arb_freq->arb_freq = freq;
+	if (arb_freq->arb_freq != freq) {
+		ndata.new_rate = freq * KHZ_TO_HZ;
+		ndata.old_rate = arb_freq->arb_freq * KHZ_TO_HZ;
+		ndata.gpu_clk_handle = arb_freq;
+		arb_freq->arb_freq = freq;
+		arb_freq->freq_updated = true;
+		if (arb_freq->nb)
+			arb_freq->nb->notifier_call(arb_freq->nb,
+						    POST_RATE_CHANGE, &ndata);
+	}
+
 	mutex_unlock(&arb_freq->arb_freq_lock);
 }
 
@@ -1046,14 +1074,64 @@ static unsigned long get_arb_gpu_clk_rate(struct kbase_device *kbdev,
 			(struct kbase_arbiter_freq *) gpu_clk_handle;
 
 	mutex_lock(&arb_dev_freq->arb_freq_lock);
-	freq = arb_dev_freq->arb_freq;
+	/* Convert from KHz to Hz */
+	freq = arb_dev_freq->arb_freq * KHZ_TO_HZ;
 	mutex_unlock(&arb_dev_freq->arb_freq_lock);
 	return freq;
 }
 
+/**
+ * arb_gpu_clk_notifier_register() - Register a clock rate change notifier.
+ * @kbdev          - kbase_device pointer
+ * @gpu_clk_handle - Handle unique to the enumerated GPU clock
+ * @nb             - notifier block containing the callback function pointer
+ *
+ * Returns 0 on success, negative error code otherwise.
+ *
+ * This function registers a callback function that is invoked whenever the
+ * frequency of the clock corresponding to @gpu_clk_handle changes.
+ */
+static int arb_gpu_clk_notifier_register(struct kbase_device *kbdev,
+	void *gpu_clk_handle, struct notifier_block *nb)
+{
+	int ret = 0;
+	struct kbase_arbiter_freq *arb_dev_freq =
+		(struct kbase_arbiter_freq *)gpu_clk_handle;
+
+	if (!arb_dev_freq->nb)
+		arb_dev_freq->nb = nb;
+	else
+		ret = -EBUSY;
+
+	return ret;
+}
+
+/**
+ * gpu_clk_notifier_unregister() - Unregister clock rate change notifier
+ * @kbdev          - kbase_device pointer
+ * @gpu_clk_handle - Handle unique to the enumerated GPU clock
+ * @nb             - notifier block containing the callback function pointer
+ *
+ * This function pointer is used to unregister a callback function that
+ * was previously registered to get notified of a frequency change of the
+ * clock corresponding to @gpu_clk_handle.
+ */
+static void arb_gpu_clk_notifier_unregister(struct kbase_device *kbdev,
+	void *gpu_clk_handle, struct notifier_block *nb)
+{
+	struct kbase_arbiter_freq *arb_dev_freq =
+		(struct kbase_arbiter_freq *)gpu_clk_handle;
+	if (arb_dev_freq->nb == nb) {
+		arb_dev_freq->nb = NULL;
+	} else {
+		dev_err(kbdev->dev, "%s - notifier did not match\n",
+			 __func__);
+	}
+}
+
 struct kbase_clk_rate_trace_op_conf arb_clk_rate_trace_ops = {
 	.get_gpu_clk_rate = get_arb_gpu_clk_rate,
 	.enumerate_gpu_clk = enumerate_arb_gpu_clk,
-	.gpu_clk_notifier_register = NULL,
-	.gpu_clk_notifier_unregister = NULL
+	.gpu_clk_notifier_register = arb_gpu_clk_notifier_register,
+	.gpu_clk_notifier_unregister = arb_gpu_clk_notifier_unregister
 };
diff --git a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_pm.h b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_pm.h
index 0f74b631c76e..1f570bbe1d6e 100644
--- a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_pm.h
+++ b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_pm.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -168,15 +168,27 @@ extern struct kbase_clk_rate_trace_op_conf arb_clk_rate_trace_ops;
 /**
  * struct kbase_arbiter_freq - Holding the GPU clock frequency data retrieved
  * from arbiter
- * @arb_freq:                 GPU clock frequency value
- * @arb_freq_lock:            Mutex protecting access to arbfreq value
+ * @arb_freq:      GPU clock frequency value
+ * @arb_freq_lock: Mutex protecting access to arbfreq value
+ * @nb:            Notifier block to receive rate change callbacks
+ * @freq_updated:  Flag to indicate whether a frequency changed has just been
+ *                 communicated to avoid "GPU_GRANTED when not expected" warning
  */
 struct kbase_arbiter_freq {
 	uint32_t arb_freq;
 	struct mutex arb_freq_lock;
+	struct notifier_block *nb;
+	bool freq_updated;
 };
 
+/**
+ * kbase_arbiter_pm_update_gpu_freq() - Update GPU frequency
+ * @arb_freq: Pointer to GPU clock frequency data
+ * @freq:     The new frequency
+ *
+ * Updates the GPU frequency and triggers any notifications
+ */
 void kbase_arbiter_pm_update_gpu_freq(struct kbase_arbiter_freq *arb_freq,
-		uint32_t freq);
+	uint32_t freq);
 
 #endif /*_MALI_KBASE_ARBITER_PM_H_ */
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/Kbuild b/drivers/gpu/arm/bifrost/backend/gpu/Kbuild
index 928766d65632..dab5449a225e 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/Kbuild
+++ b/drivers/gpu/arm/bifrost/backend/gpu/Kbuild
@@ -1,4 +1,4 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
 # (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
 #
@@ -18,47 +18,32 @@
 #
 #
 
-BACKEND += \
-	backend/gpu/mali_kbase_cache_policy_backend.c \
-	backend/gpu/mali_kbase_gpuprops_backend.c \
-	backend/gpu/mali_kbase_irq_linux.c \
-	backend/gpu/mali_kbase_js_backend.c \
-	backend/gpu/mali_kbase_pm_backend.c \
-	backend/gpu/mali_kbase_pm_driver.c \
-	backend/gpu/mali_kbase_pm_metrics.c \
-	backend/gpu/mali_kbase_pm_ca.c \
-	backend/gpu/mali_kbase_pm_always_on.c \
-	backend/gpu/mali_kbase_pm_coarse_demand.c \
-	backend/gpu/mali_kbase_pm_policy.c \
-	backend/gpu/mali_kbase_time.c \
-	backend/gpu/mali_kbase_l2_mmu_config.c \
-	backend/gpu/mali_kbase_clk_rate_trace_mgr.c
+bifrost_kbase-y += \
+    backend/gpu/mali_kbase_cache_policy_backend.o \
+    backend/gpu/mali_kbase_gpuprops_backend.o \
+    backend/gpu/mali_kbase_irq_linux.o \
+    backend/gpu/mali_kbase_js_backend.o \
+    backend/gpu/mali_kbase_pm_backend.o \
+    backend/gpu/mali_kbase_pm_driver.o \
+    backend/gpu/mali_kbase_pm_metrics.o \
+    backend/gpu/mali_kbase_pm_ca.o \
+    backend/gpu/mali_kbase_pm_always_on.o \
+    backend/gpu/mali_kbase_pm_coarse_demand.o \
+    backend/gpu/mali_kbase_pm_policy.o \
+    backend/gpu/mali_kbase_time.o \
+    backend/gpu/mali_kbase_l2_mmu_config.o \
+    backend/gpu/mali_kbase_clk_rate_trace_mgr.o
 
-ifeq ($(MALI_USE_CSF),1)
-# empty
-else
-	BACKEND += \
-		backend/gpu/mali_kbase_instr_backend.c \
-		backend/gpu/mali_kbase_jm_as.c \
-		backend/gpu/mali_kbase_debug_job_fault_backend.c \
-		backend/gpu/mali_kbase_jm_hw.c \
-		backend/gpu/mali_kbase_jm_rb.c
+ifeq ($(MALI_USE_CSF),0)
+    bifrost_kbase-y += \
+        backend/gpu/mali_kbase_instr_backend.o \
+        backend/gpu/mali_kbase_jm_as.o \
+        backend/gpu/mali_kbase_debug_job_fault_backend.o \
+        backend/gpu/mali_kbase_jm_hw.o \
+        backend/gpu/mali_kbase_jm_rb.o
 endif
 
-ifeq ($(MALI_CUSTOMER_RELEASE),0)
-BACKEND += \
-	backend/gpu/mali_kbase_pm_always_on_demand.c
-endif
 
-ifeq ($(CONFIG_MALI_BIFROST_DEVFREQ),y)
-BACKEND += \
-	backend/gpu/mali_kbase_devfreq.c
-endif
+bifrost_kbase-$(CONFIG_MALI_BIFROST_DEVFREQ) += \
+    backend/gpu/mali_kbase_devfreq.o
 
-ifeq ($(CONFIG_MALI_BIFROST_NO_MALI),y)
-	# Dummy model
-	BACKEND += backend/gpu/mali_kbase_model_dummy.c
-	BACKEND += backend/gpu/mali_kbase_model_linux.c
-	# HW error simulation
-	BACKEND += backend/gpu/mali_kbase_model_error_generator.c
-endif
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_backend_config.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_backend_config.h
index a6bbdbbc150c..6924fdb8a608 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_backend_config.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_backend_config.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2014-2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_cache_policy_backend.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_cache_policy_backend.c
index fee946478667..e542ccf32659 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_cache_policy_backend.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_cache_policy_backend.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2014-2016, 2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2016, 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_cache_policy_backend.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_cache_policy_backend.h
index 53b9667cc669..5294c2c100a9 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_cache_policy_backend.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_cache_policy_backend.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2014-2016, 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_clk_rate_trace_mgr.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_clk_rate_trace_mgr.c
index 7076ab4f73ee..6ad0f58b47cb 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_clk_rate_trace_mgr.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_clk_rate_trace_mgr.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
@@ -27,7 +27,7 @@
 #include <mali_kbase_config_defaults.h>
 #include <linux/clk.h>
 #include <asm/div64.h>
-#include "mali_kbase_clk_rate_trace_mgr.h"
+#include "backend/gpu/mali_kbase_clk_rate_trace_mgr.h"
 
 #ifdef CONFIG_TRACE_POWER_GPU_FREQUENCY
 #include <trace/events/power_gpu_frequency.h>
@@ -299,8 +299,8 @@ void kbase_clk_rate_trace_manager_notify_all(
 
 	kbdev = container_of(clk_rtm, struct kbase_device, pm.clk_rtm);
 
-	dev_dbg(kbdev->dev, "GPU clock %u rate changed to %lu",
-		clk_index, new_rate);
+	dev_dbg(kbdev->dev, "%s - GPU clock %u rate changed to %lu, pid: %d",
+		__func__, clk_index, new_rate, current->pid);
 
 	/* Raise standard `power/gpu_frequency` ftrace event */
 	{
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_clk_rate_trace_mgr.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_clk_rate_trace_mgr.h
index ba250bec4491..f7ec9d11ee94 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_clk_rate_trace_mgr.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_clk_rate_trace_mgr.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_debug_job_fault_backend.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_debug_job_fault_backend.c
index b5ca79db5fad..e121b417f80d 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_debug_job_fault_backend.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_debug_job_fault_backend.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2012-2015, 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2015, 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -23,7 +23,7 @@
 #include <device/mali_kbase_device.h>
 #include "mali_kbase_debug_job_fault.h"
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 
 /*GPU_CONTROL_REG(r)*/
 static int gpu_control_reg_snapshot[] = {
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.c
index e64d273fa87f..bbf75bafd22f 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
@@ -28,7 +28,7 @@
 #include <linux/of.h>
 #include <linux/clk.h>
 #include <linux/devfreq.h>
-#ifdef CONFIG_DEVFREQ_THERMAL
+#if IS_ENABLED(CONFIG_DEVFREQ_THERMAL)
 #include <linux/devfreq_cooling.h>
 #endif
 
@@ -190,7 +190,7 @@ kbase_devfreq_target(struct device *dev, unsigned long *target_freq, u32 flags)
 
 	dev_dbg(dev, "%lu-->%lu\n", kbdev->current_nominal_freq, nominal_freq);
 
-#ifdef CONFIG_REGULATOR
+#if IS_ENABLED(CONFIG_REGULATOR)
 	/* Regulators and clocks work in pairs: every clock has a regulator,
 	 * and we never expect to have more regulators than clocks.
 	 *
@@ -242,7 +242,7 @@ kbase_devfreq_target(struct device *dev, unsigned long *target_freq, u32 flags)
 		}
 	}
 
-#ifdef CONFIG_REGULATOR
+#if IS_ENABLED(CONFIG_REGULATOR)
 	for (i = 0; i < kbdev->nr_clocks; i++) {
 		if (kbdev->regulators[i] &&
 				kbdev->current_voltages[i] != volts[i] &&
@@ -381,18 +381,21 @@ static void kbase_devfreq_term_freq_table(struct kbase_device *kbdev)
 	struct devfreq_dev_profile *dp = &kbdev->devfreq_profile;
 
 	kfree(dp->freq_table);
+	dp->freq_table = NULL;
 }
 
 static void kbase_devfreq_term_core_mask_table(struct kbase_device *kbdev)
 {
 	kfree(kbdev->devfreq_table);
+	kbdev->devfreq_table = NULL;
 }
 
 static void kbase_devfreq_exit(struct device *dev)
 {
 	struct kbase_device *kbdev = dev_get_drvdata(dev);
 
-	kbase_devfreq_term_freq_table(kbdev);
+	if (kbdev)
+		kbase_devfreq_term_freq_table(kbdev);
 }
 
 static void kbasep_devfreq_read_suspend_clock(struct kbase_device *kbdev,
@@ -464,7 +467,7 @@ static int kbase_devfreq_init_core_mask_table(struct kbase_device *kbdev)
 		u64 core_mask, opp_freq,
 			real_freqs[BASE_MAX_NR_CLOCKS_REGULATORS];
 		int err;
-#ifdef CONFIG_REGULATOR
+#if IS_ENABLED(CONFIG_REGULATOR)
 		u32 opp_volts[BASE_MAX_NR_CLOCKS_REGULATORS];
 #endif
 
@@ -492,7 +495,7 @@ static int kbase_devfreq_init_core_mask_table(struct kbase_device *kbdev)
 					err);
 			continue;
 		}
-#ifdef CONFIG_REGULATOR
+#if IS_ENABLED(CONFIG_REGULATOR)
 		err = of_property_read_u32_array(node,
 			"opp-microvolt", opp_volts, kbdev->nr_regulators);
 		if (err < 0) {
@@ -546,7 +549,7 @@ static int kbase_devfreq_init_core_mask_table(struct kbase_device *kbdev)
 				kbdev->devfreq_table[i].real_freqs[j] =
 					real_freqs[j];
 		}
-#ifdef CONFIG_REGULATOR
+#if IS_ENABLED(CONFIG_REGULATOR)
 		if (kbdev->nr_regulators > 0) {
 			int j;
 
@@ -631,8 +634,12 @@ void kbase_devfreq_enqueue_work(struct kbase_device *kbdev,
 
 	WARN_ON(work_type == DEVFREQ_WORK_NONE);
 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	kbdev->devfreq_queue.req_type = work_type;
-	queue_work(kbdev->devfreq_queue.workq, &kbdev->devfreq_queue.work);
+	/* Skip enqueuing a work if workqueue has already been terminated. */
+	if (likely(kbdev->devfreq_queue.workq)) {
+		kbdev->devfreq_queue.req_type = work_type;
+		queue_work(kbdev->devfreq_queue.workq,
+			   &kbdev->devfreq_queue.work);
+	}
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 	dev_dbg(kbdev->dev, "Enqueuing devfreq req: %s\n",
 		kbase_devfreq_req_type_name(work_type));
@@ -654,11 +661,19 @@ static int kbase_devfreq_work_init(struct kbase_device *kbdev)
 
 static void kbase_devfreq_work_term(struct kbase_device *kbdev)
 {
-	destroy_workqueue(kbdev->devfreq_queue.workq);
+	unsigned long flags;
+	struct workqueue_struct *workq;
+
+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+	workq = kbdev->devfreq_queue.workq;
+	kbdev->devfreq_queue.workq = NULL;
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+
+	destroy_workqueue(workq);
 }
 
 static unsigned long kbase_devfreq_get_static_power(struct devfreq *devfreq,
-						    unsigned long voltage)
+		unsigned long voltage)
 {
 	struct device *dev = devfreq->dev.parent;
 	struct kbase_device *kbdev = dev_get_drvdata(dev);
@@ -718,14 +733,6 @@ int kbase_devfreq_init(struct kbase_device *kbdev)
 		return err;
 	}
 
-	/* Initialise devfreq suspend/resume workqueue */
-	err = kbase_devfreq_work_init(kbdev);
-	if (err) {
-		kbase_devfreq_term_freq_table(kbdev);
-		dev_err(kbdev->dev, "Devfreq initialization failed");
-		return err;
-	}
-
 	of_property_read_u32(np, "upthreshold",
 			     &ondemand_data.upthreshold);
 	of_property_read_u32(np, "downdifferential",
@@ -734,8 +741,21 @@ int kbase_devfreq_init(struct kbase_device *kbdev)
 				"simple_ondemand", &ondemand_data);
 	if (IS_ERR(kbdev->devfreq)) {
 		err = PTR_ERR(kbdev->devfreq);
-		kbase_devfreq_work_term(kbdev);
+		kbdev->devfreq = NULL;
+		kbase_devfreq_term_core_mask_table(kbdev);
 		kbase_devfreq_term_freq_table(kbdev);
+		dev_err(kbdev->dev, "Fail to add devfreq device(%d)\n", err);
+		return err;
+	}
+
+	/* Initialize devfreq suspend/resume workqueue */
+	err = kbase_devfreq_work_init(kbdev);
+	if (err) {
+		if (devfreq_remove_device(kbdev->devfreq))
+			dev_err(kbdev->dev, "Fail to rm devfreq\n");
+		kbdev->devfreq = NULL;
+		kbase_devfreq_term_core_mask_table(kbdev);
+		dev_err(kbdev->dev, "Fail to init devfreq workqueue\n");
 		return err;
 	}
 
@@ -759,12 +779,12 @@ int kbase_devfreq_init(struct kbase_device *kbdev)
 
 	mali_mdevp.data = kbdev->devfreq;
 	kbdev->mdev_info = rockchip_system_monitor_register(kbdev->dev,
-							    &mali_mdevp);
+			&mali_mdevp);
 	if (IS_ERR(kbdev->mdev_info)) {
 		dev_dbg(kbdev->dev, "without system monitor\n");
-		kbdev->mdev_info = NULL;
+               kbdev->mdev_info = NULL;
 	}
-#ifdef CONFIG_DEVFREQ_THERMAL
+#if IS_ENABLED(CONFIG_DEVFREQ_THERMAL)
 	if (of_find_compatible_node(kbdev->dev->of_node, NULL,
 				    "simple-power-model")) {
 		of_property_read_u32(kbdev->dev->of_node,
@@ -782,23 +802,23 @@ int kbase_devfreq_init(struct kbase_device *kbdev)
 		if (!kbase_dcp->dyn_power_coeff) {
 			err = -EINVAL;
 			dev_err(kbdev->dev, "failed to get dynamic-coefficient\n");
-			goto cooling_failed;
+			goto ipa_init_failed;
 		}
 
 		kbdev->devfreq_cooling =
 			of_devfreq_cooling_register_power(kbdev->dev->of_node,
-							  kbdev->devfreq,
-							  kbase_dcp);
+					kbdev->devfreq,
+					kbase_dcp);
 		if (IS_ERR(kbdev->devfreq_cooling)) {
 			err = PTR_ERR(kbdev->devfreq_cooling);
 			dev_err(kbdev->dev, "failed to register cooling device\n");
-			goto cooling_failed;
+			goto cooling_reg_failed;
 		}
 	} else {
 		err = kbase_ipa_init(kbdev);
 		if (err) {
 			dev_err(kbdev->dev, "IPA initialization failed\n");
-			goto cooling_failed;
+			goto ipa_init_failed;
 		}
 
 		kbdev->devfreq_cooling = of_devfreq_cooling_register_power(
@@ -808,26 +828,32 @@ int kbase_devfreq_init(struct kbase_device *kbdev)
 		if (IS_ERR(kbdev->devfreq_cooling)) {
 			err = PTR_ERR(kbdev->devfreq_cooling);
 			dev_err(kbdev->dev,
-				"Failed to register cooling device (%d)\n",
-				err);
-			goto cooling_failed;
-		}
+					"Failed to register cooling device (%d)\n",
+					err);
+			goto cooling_reg_failed;
+               }
+
 	}
 #endif
 
 	return 0;
 
-#ifdef CONFIG_DEVFREQ_THERMAL
-cooling_failed:
+#if IS_ENABLED(CONFIG_DEVFREQ_THERMAL)
+cooling_reg_failed:
+	kbase_ipa_term(kbdev);
+ipa_init_failed:
 	devfreq_unregister_opp_notifier(kbdev->dev, kbdev->devfreq);
 #endif /* CONFIG_DEVFREQ_THERMAL */
+
 opp_notifier_failed:
+	kbase_devfreq_work_term(kbdev);
+
 	if (devfreq_remove_device(kbdev->devfreq))
 		dev_err(kbdev->dev, "Failed to terminate devfreq (%d)\n", err);
-	else
-		kbdev->devfreq = NULL;
 
-	kbase_devfreq_work_term(kbdev);
+	kbdev->devfreq = NULL;
+
+	kbase_devfreq_term_core_mask_table(kbdev);
 
 	return err;
 }
@@ -838,8 +864,7 @@ void kbase_devfreq_term(struct kbase_device *kbdev)
 
 	dev_dbg(kbdev->dev, "Term Mali devfreq\n");
 
-	rockchip_system_monitor_unregister(kbdev->mdev_info);
-#ifdef CONFIG_DEVFREQ_THERMAL
+#if IS_ENABLED(CONFIG_DEVFREQ_THERMAL)
 	if (kbdev->devfreq_cooling)
 		devfreq_cooling_unregister(kbdev->devfreq_cooling);
 
@@ -850,6 +875,8 @@ void kbase_devfreq_term(struct kbase_device *kbdev)
 
 	devfreq_unregister_opp_notifier(kbdev->dev, kbdev->devfreq);
 
+	kbase_devfreq_work_term(kbdev);
+
 	err = devfreq_remove_device(kbdev->devfreq);
 	if (err)
 		dev_err(kbdev->dev, "Failed to terminate devfreq (%d)\n", err);
@@ -857,6 +884,4 @@ void kbase_devfreq_term(struct kbase_device *kbdev)
 		kbdev->devfreq = NULL;
 
 	kbase_devfreq_term_core_mask_table(kbdev);
-
-	kbase_devfreq_work_term(kbdev);
 }
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.h
index d1305d382990..4a1587ecdff1 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2014, 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_gpuprops_backend.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_gpuprops_backend.c
index 7542209ca247..11088db568c0 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_gpuprops_backend.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_gpuprops_backend.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
@@ -45,6 +45,12 @@ int kbase_backend_gpuprops_get(struct kbase_device *kbdev,
 	registers.core_features = kbase_reg_read(kbdev,
 				GPU_CONTROL_REG(CORE_FEATURES));
 #else /* !MALI_USE_CSF */
+	if (((registers.gpu_id & GPU_ID2_PRODUCT_MODEL) ==
+	     GPU_ID2_PRODUCT_TGRX) ||
+	    ((registers.gpu_id & GPU_ID2_PRODUCT_MODEL) ==
+	     GPU_ID2_PRODUCT_TVAX))
+		registers.core_features =
+			kbase_reg_read(kbdev, GPU_CONTROL_REG(CORE_FEATURES));
 #endif /* MALI_USE_CSF */
 	registers.tiler_features = kbase_reg_read(kbdev,
 				GPU_CONTROL_REG(TILER_FEATURES));
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_backend.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_backend.c
index edc2f69e47f7..0c5fe9d21ee9 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_backend.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_backend.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_defs.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_defs.h
index 05d5193b9b1c..e356348b657f 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_defs.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_defs.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2014, 2016, 2018-2021 ARM Limited. All rights reserved.
@@ -26,7 +26,7 @@
 #ifndef _KBASE_INSTR_DEFS_H_
 #define _KBASE_INSTR_DEFS_H_
 
-#include "../../mali_kbase_hwcnt_gpu.h"
+#include <mali_kbase_hwcnt_gpu.h>
 
 /*
  * Instrumentation State Machine States
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_internal.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_internal.h
index c0472fadb687..332cc6944d94 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_internal.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_internal.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2014, 2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_irq_internal.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_irq_internal.h
index bad249c9ee03..2671ce52851f 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_irq_internal.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_irq_internal.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2014-2015, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2015, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_irq_linux.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_irq_linux.c
index 92aa4e481660..72def5e7aabb 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_irq_linux.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_irq_linux.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2014-2016,2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2016, 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -25,7 +25,7 @@
 
 #include <linux/interrupt.h>
 
-#if !defined(CONFIG_MALI_BIFROST_NO_MALI)
+#if !IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI)
 
 /* GPU IRQ Tags */
 #define	JOB_IRQ_TAG	0
@@ -232,7 +232,7 @@ int kbase_set_custom_irq_handler(struct kbase_device *kbdev,
 		result = -EINVAL;
 		dev_err(kbdev->dev, "Can't request interrupt %d (index %d)\n",
 					kbdev->irqs[irq_type].irq, irq_type);
-#ifdef CONFIG_SPARSE_IRQ
+#if IS_ENABLED(CONFIG_SPARSE_IRQ)
 		dev_err(kbdev->dev, "You have CONFIG_SPARSE_IRQ support enabled - is the interrupt number correct for this configuration?\n");
 #endif /* CONFIG_SPARSE_IRQ */
 	}
@@ -461,7 +461,7 @@ int kbase_install_interrupts(struct kbase_device *kbdev)
 		if (err) {
 			dev_err(kbdev->dev, "Can't request interrupt %d (index %d)\n",
 							kbdev->irqs[i].irq, i);
-#ifdef CONFIG_SPARSE_IRQ
+#if IS_ENABLED(CONFIG_SPARSE_IRQ)
 			dev_err(kbdev->dev, "You have CONFIG_SPARSE_IRQ support enabled - is the interrupt number correct for this configuration?\n");
 #endif /* CONFIG_SPARSE_IRQ */
 			goto release;
@@ -501,4 +501,4 @@ void kbase_synchronize_irqs(struct kbase_device *kbdev)
 
 KBASE_EXPORT_TEST_API(kbase_synchronize_irqs);
 
-#endif /* !defined(CONFIG_MALI_BIFROST_NO_MALI) */
+#endif /* !IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI) */
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_as.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_as.c
index 57ff67b75cab..888aa59421a7 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_as.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_as.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_defs.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_defs.h
index 97663c7d00eb..e29ace710ed7 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_defs.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_defs.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_hw.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_hw.c
index 6acacf1eeed4..e7e9fb1d8b47 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_hw.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_hw.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
@@ -300,7 +300,7 @@ void kbase_job_hw_submit(struct kbase_device *kbdev,
 			&kbdev->gpu_props.props.raw_props.js_features[js],
 			"ctx_nr,atom_nr");
 	kbase_kinstr_jm_atom_hw_submit(katom);
-#ifdef CONFIG_GPU_TRACEPOINTS
+#if IS_ENABLED(CONFIG_GPU_TRACEPOINTS)
 	if (!kbase_backend_nr_atoms_submitted(kbdev, js)) {
 		/* If this is the only job on the slot, trace it as starting */
 		char js_string[16];
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_internal.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_internal.h
index 6761cbd9a32a..1039e851f959 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_internal.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_internal.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2011-2016, 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2016, 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -59,7 +59,7 @@ void kbase_job_submit_nolock(struct kbase_device *kbdev,
 void kbase_job_done_slot(struct kbase_device *kbdev, int s, u32 completion_code,
 					u64 job_tail, ktime_t *end_timestamp);
 
-#ifdef CONFIG_GPU_TRACEPOINTS
+#if IS_ENABLED(CONFIG_GPU_TRACEPOINTS)
 static inline char *kbasep_make_job_slot_string(int js, char *js_string,
 						size_t js_size)
 {
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_rb.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_rb.c
index 5fdf9b63d263..a3cb5477ae64 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_rb.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_rb.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
@@ -289,9 +289,11 @@ static void kbase_gpu_release_atom(struct kbase_device *kbdev,
 		katom->gpu_rb_state = KBASE_ATOM_GPU_RB_READY;
 		kbase_pm_metrics_update(kbdev, end_timestamp);
 
+		/* Inform platform at start/finish of atom */
+		kbasep_platform_event_atom_complete(katom);
+
 		if (katom->core_req & BASE_JD_REQ_PERMON)
 			kbase_pm_release_gpu_cycle_counter_nolock(kbdev);
-		/* ***FALLTHROUGH: TRANSITION TO LOWER STATE*** */
 
 		KBASE_TLSTREAM_TL_NRET_ATOM_LPU(kbdev, katom,
 			&kbdev->gpu_props.props.raw_props.js_features
@@ -301,6 +303,8 @@ static void kbase_gpu_release_atom(struct kbase_device *kbdev,
 			&kbdev->gpu_props.props.raw_props.js_features
 				[katom->slot_nr]);
 
+		/* ***FALLTHROUGH: TRANSITION TO LOWER STATE*** */
+
 	case KBASE_ATOM_GPU_RB_READY:
 		/* ***FALLTHROUGH: TRANSITION TO LOWER STATE*** */
 
@@ -847,7 +851,7 @@ void kbase_backend_slot_update(struct kbase_device *kbdev)
 					break;
 
 				katom[idx]->gpu_rb_state =
-				KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_PREV;
+					KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_PREV;
 
 				/* ***TRANSITION TO HIGHER STATE*** */
 				/* fallthrough */
@@ -987,7 +991,11 @@ void kbase_backend_slot_update(struct kbase_device *kbdev)
 
 				kbase_job_hw_submit(kbdev, katom[idx], js);
 				katom[idx]->gpu_rb_state =
-						KBASE_ATOM_GPU_RB_SUBMITTED;
+					KBASE_ATOM_GPU_RB_SUBMITTED;
+
+				/* ***TRANSITION TO HIGHER STATE*** */
+				/* fallthrough */
+			case KBASE_ATOM_GPU_RB_SUBMITTED:
 
 				/* Inform power management at start/finish of
 				 * atom so it can update its GPU utilisation
@@ -996,10 +1004,9 @@ void kbase_backend_slot_update(struct kbase_device *kbdev)
 				kbase_pm_metrics_update(kbdev,
 						&katom[idx]->start_timestamp);
 
-				/* ***TRANSITION TO HIGHER STATE*** */
-				/* fallthrough */
-			case KBASE_ATOM_GPU_RB_SUBMITTED:
-				/* Atom submitted to HW, nothing else to do */
+				/* Inform platform at start/finish of atom */
+				kbasep_platform_event_atom_submit(katom[idx]);
+
 				break;
 
 			case KBASE_ATOM_GPU_RB_RETURN_TO_JS:
@@ -1225,7 +1232,7 @@ void kbase_gpu_complete_hw(struct kbase_device *kbdev, int js,
 	 * - Schedule out the parent context if necessary, and schedule a new
 	 *   one in.
 	 */
-#ifdef CONFIG_GPU_TRACEPOINTS
+#if IS_ENABLED(CONFIG_GPU_TRACEPOINTS)
 	{
 		/* The atom in the HEAD */
 		struct kbase_jd_atom *next_katom = kbase_gpu_inspect(kbdev, js,
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_rb.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_rb.h
index 14da98143f74..d3ff203762f9 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_rb.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_rb.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2014-2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_js_backend.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_js_backend.c
index 0940bccccddd..ea4c4d0cfe73 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_js_backend.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_js_backend.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_js_internal.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_js_internal.h
index e15528d069ac..52842882156f 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_js_internal.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_js_internal.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2014-2015, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2015, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_l2_mmu_config.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_l2_mmu_config.c
index 884cbd6326f1..713154688de1 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_l2_mmu_config.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_l2_mmu_config.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_l2_mmu_config.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_l2_mmu_config.h
index 2dfeadb178c2..07014ad360d8 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_l2_mmu_config.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_l2_mmu_config.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_always_on.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_always_on.c
index 66fb24d27b86..077c234d8802 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_always_on.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_always_on.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2010-2015, 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2015, 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -58,6 +58,7 @@ const struct kbase_pm_policy kbase_pm_always_on_policy_ops = {
 	always_on_term,			/* term */
 	always_on_shaders_needed,	/* shaders_needed */
 	always_on_get_core_active,	/* get_core_active */
+	NULL,				/* handle_event */
 	KBASE_PM_POLICY_ID_ALWAYS_ON,	/* id */
 #if MALI_USE_CSF
 	ALWAYS_ON_PM_SCHED_FLAGS,	/* pm_sched_flags */
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_always_on.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_always_on.h
index e500d46dc82d..98d35dabec88 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_always_on.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_always_on.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2011-2015, 2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2015, 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_backend.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_backend.c
index a03078b33063..38baa0d27937 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_backend.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_backend.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
@@ -37,7 +37,7 @@
 #include <backend/gpu/mali_kbase_pm_internal.h>
 #include <backend/gpu/mali_kbase_devfreq.h>
 #include <mali_kbase_dummy_job_wa.h>
-#include <mali_kbase_irq_internal.h>
+#include <backend/gpu/mali_kbase_irq_internal.h>
 
 static void kbase_pm_gpu_poweroff_wait_wq(struct work_struct *data);
 static void kbase_pm_hwcnt_disable_worker(struct work_struct *data);
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca.c
index 368f89dd0c61..95b9d6c9a383 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2013-2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2013-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -26,9 +26,6 @@
 #include <mali_kbase.h>
 #include <mali_kbase_pm.h>
 #include <backend/gpu/mali_kbase_pm_internal.h>
-#ifdef MALI_BIFROST_NO_MALI
-#include <backend/gpu/mali_kbase_model_dummy.h>
-#endif
 #include <mali_kbase_dummy_job_wa.h>
 
 int kbase_pm_ca_init(struct kbase_device *kbdev)
@@ -123,9 +120,7 @@ u64 kbase_pm_ca_get_instr_core_mask(struct kbase_device *kbdev)
 {
 	lockdep_assert_held(&kbdev->hwaccess_lock);
 
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-	return (((1ull) << KBASE_DUMMY_MODEL_MAX_SHADER_CORES) - 1);
-#elif MALI_USE_CSF
+#if   MALI_USE_CSF
 	return kbase_pm_get_ready_cores(kbdev, KBASE_PM_CORE_SHADER);
 #else
 	return kbdev->pm.backend.pm_shaders_core_mask;
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca.h
index c20bf6f965ee..8d169c38ff6f 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2011-2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca_devfreq.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca_devfreq.h
index d24bccd9e1a0..41f3c14835e7 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca_devfreq.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca_devfreq.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_coarse_demand.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_coarse_demand.c
index dd8fad4f2384..f40b753850df 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_coarse_demand.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_coarse_demand.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2012-2016, 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2016, 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -57,6 +57,7 @@ const struct kbase_pm_policy kbase_pm_coarse_demand_policy_ops = {
 	coarse_demand_term,			/* term */
 	coarse_demand_shaders_needed,		/* shaders_needed */
 	coarse_demand_get_core_active,		/* get_core_active */
+	NULL,					/* handle_event */
 	KBASE_PM_POLICY_ID_COARSE_DEMAND,	/* id */
 #if MALI_USE_CSF
 	COARSE_ON_DEMAND_PM_SCHED_FLAGS,	/* pm_sched_flags */
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_coarse_demand.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_coarse_demand.h
index f1a0e3aab24e..5e3f17ec0650 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_coarse_demand.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_coarse_demand.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2012-2015, 2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2015, 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_defs.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_defs.h
index e7017ad14792..5018ecea8385 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_defs.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_defs.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
@@ -28,9 +28,6 @@
 
 #include "mali_kbase_pm_always_on.h"
 #include "mali_kbase_pm_coarse_demand.h"
-#if !MALI_CUSTOMER_RELEASE
-#include "mali_kbase_pm_always_on_demand.h"
-#endif
 
 /* Forward definition - see mali_kbase.h */
 struct kbase_device;
@@ -179,8 +176,12 @@ struct kbasep_pm_metrics_state {
  * @work: Work item which cancels the timer
  * @timer: Timer for powering off the shader cores
  * @configured_interval: Period of GPU poweroff timer
- * @configured_ticks: User-configured number of ticks to wait after the shader
- *                    power down request is received before turning off the cores
+ * @default_ticks: User-configured number of ticks to wait after the shader
+ *                 power down request is received before turning off the cores
+ * @configured_ticks: Power-policy configured number of ticks to wait after the
+ *                    shader power down request is received before turning off
+ *                    the cores. For simple power policies, this is equivalent
+ *                    to @default_ticks.
  * @remaining_ticks: Number of remaining timer ticks until shaders are powered off
  * @cancel_queued: True if the cancellation work item has been queued. This is
  *                 required to ensure that it is not queued twice, e.g. after
@@ -194,6 +195,7 @@ struct kbasep_pm_tick_timer_state {
 	struct hrtimer timer;
 
 	ktime_t configured_interval;
+	unsigned int default_ticks;
 	unsigned int configured_ticks;
 	unsigned int remaining_ticks;
 
@@ -204,9 +206,6 @@ struct kbasep_pm_tick_timer_state {
 union kbase_pm_policy_data {
 	struct kbasep_pm_policy_always_on always_on;
 	struct kbasep_pm_policy_coarse_demand coarse_demand;
-#if !MALI_CUSTOMER_RELEASE
-	struct kbasep_pm_policy_always_on_demand always_on_demand;
-#endif
 };
 
 /**
@@ -217,7 +216,8 @@ union kbase_pm_policy_data {
  *
  * @pm_current_policy: The policy that is currently actively controlling the
  *                     power state.
- * @pm_policy_data:    Private data for current PM policy
+ * @pm_policy_data:    Private data for current PM policy. This is automatically
+ *                     zeroed when a policy change occurs.
  * @reset_done:        Flag when a reset is complete
  * @reset_done_wait:   Wait queue to wait for changes to @reset_done
  * @gpu_cycle_counter_requests: The reference count of active gpu cycle counter
@@ -464,6 +464,33 @@ enum kbase_pm_policy_id {
 	KBASE_PM_POLICY_ID_ALWAYS_ON
 };
 
+/**
+ * enum kbase_pm_policy_event - PM Policy event ID
+ */
+enum kbase_pm_policy_event {
+	/**
+	 * @KBASE_PM_POLICY_EVENT_IDLE: Indicates that the GPU power state
+	 * model has determined that the GPU has gone idle.
+	 */
+	KBASE_PM_POLICY_EVENT_IDLE,
+	/**
+	 * @KBASE_PM_POLICY_EVENT_POWER_ON: Indicates that the GPU state model
+	 * is preparing to power on the GPU.
+	 */
+	KBASE_PM_POLICY_EVENT_POWER_ON,
+	/**
+	 * @KBASE_PM_POLICY_EVENT_TIMER_HIT: Indicates that the GPU became
+	 * active while the Shader Tick Timer was holding the GPU in a powered
+	 * on state.
+	 */
+	KBASE_PM_POLICY_EVENT_TIMER_HIT,
+	/**
+	 * @KBASE_PM_POLICY_EVENT_TIMER_MISS: Indicates that the GPU did not
+	 * become active before the Shader Tick Timer timeout occurred.
+	 */
+	KBASE_PM_POLICY_EVENT_TIMER_MISS,
+};
+
 /**
  * struct kbase_pm_policy - Power policy structure.
  *
@@ -476,6 +503,9 @@ enum kbase_pm_policy_id {
  * @shaders_needed:     Function called to find out if shader cores are needed
  * @get_core_active:    Function called to get the current overall GPU power
  *                      state
+ * @handle_event:       Function called when a PM policy event occurs. Should be
+ *                      set to NULL if the power policy doesn't require any
+ *                      event notifications.
  * @id:                 Field indicating an ID for this policy. This is not
  *                      necessarily the same as its index in the list returned
  *                      by kbase_pm_list_policies().
@@ -536,6 +566,16 @@ struct kbase_pm_policy {
 	 */
 	bool (*get_core_active)(struct kbase_device *kbdev);
 
+	/**
+	 * Function called when a power event occurs
+	 *
+	 * @kbdev: The kbase device structure for the device (must be a
+	 *         valid pointer)
+	 * @event: The id of the power event that has occurred
+	 */
+	void (*handle_event)(struct kbase_device *kbdev,
+			     enum kbase_pm_policy_event event);
+
 	enum kbase_pm_policy_id id;
 
 #if MALI_USE_CSF
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_driver.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_driver.c
index 6e742fb1137e..bcada93e46a2 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_driver.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_driver.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
@@ -244,7 +244,7 @@ static u32 core_type_to_reg(enum kbase_pm_core_type core_type,
 	return (u32)core_type + (u32)action;
 }
 
-#ifdef CONFIG_ARM64
+#if IS_ENABLED(CONFIG_ARM64)
 static void mali_cci_flush_l2(struct kbase_device *kbdev)
 {
 	const u32 mask = CLEAN_CACHES_COMPLETED | RESET_COMPLETED;
@@ -1343,6 +1343,12 @@ static int kbase_pm_shaders_update_state(struct kbase_device *kbdev)
 				kbase_pm_invoke(kbdev, KBASE_PM_CORE_SHADER,
 						backend->shaders_avail, ACTION_PWRON);
 
+				if (backend->pm_current_policy &&
+				    backend->pm_current_policy->handle_event)
+					backend->pm_current_policy->handle_event(
+						kbdev,
+						KBASE_PM_POLICY_EVENT_POWER_ON);
+
 				backend->shaders_state = KBASE_SHADERS_PEND_ON_CORESTACK_ON;
 			}
 			break;
@@ -1395,6 +1401,12 @@ static int kbase_pm_shaders_update_state(struct kbase_device *kbdev)
 				/* Wait for being disabled */
 				;
 			} else if (!backend->shaders_desired) {
+				if (backend->pm_current_policy &&
+				    backend->pm_current_policy->handle_event)
+					backend->pm_current_policy->handle_event(
+						kbdev,
+						KBASE_PM_POLICY_EVENT_IDLE);
+
 				if (kbdev->pm.backend.protected_transition_override ||
 #ifdef CONFIG_MALI_ARBITER_SUPPORT
 						kbase_pm_is_suspending(kbdev) ||
@@ -1455,9 +1467,21 @@ static int kbase_pm_shaders_update_state(struct kbase_device *kbdev)
 			}
 
 			if (backend->shaders_desired) {
+				if (backend->pm_current_policy &&
+				    backend->pm_current_policy->handle_event)
+					backend->pm_current_policy->handle_event(
+						kbdev,
+						KBASE_PM_POLICY_EVENT_TIMER_HIT);
+
 				stt->remaining_ticks = 0;
 				backend->shaders_state = KBASE_SHADERS_ON_CORESTACK_ON_RECHECK;
 			} else if (stt->remaining_ticks == 0) {
+				if (backend->pm_current_policy &&
+				    backend->pm_current_policy->handle_event)
+					backend->pm_current_policy->handle_event(
+						kbdev,
+						KBASE_PM_POLICY_EVENT_TIMER_MISS);
+
 				backend->shaders_state = KBASE_SHADERS_WAIT_FINISHED_CORESTACK_ON;
 #ifdef CONFIG_MALI_ARBITER_SUPPORT
 			} else if (kbase_pm_is_suspending(kbdev) ||
@@ -1776,7 +1800,8 @@ int kbase_pm_state_machine_init(struct kbase_device *kbdev)
 	hrtimer_init(&stt->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
 	stt->timer.function = shader_tick_timer_callback;
 	stt->configured_interval = HR_TIMER_DELAY_NSEC(DEFAULT_PM_GPU_POWEROFF_TICK_NS);
-	stt->configured_ticks = DEFAULT_PM_POWEROFF_TICK_SHADER;
+	stt->default_ticks = DEFAULT_PM_POWEROFF_TICK_SHADER;
+	stt->configured_ticks = stt->default_ticks;
 
 	return 0;
 }
@@ -1912,24 +1937,43 @@ static void kbase_pm_timed_out(struct kbase_device *kbdev)
 		kbase_reset_gpu(kbdev);
 }
 
-void kbase_pm_wait_for_l2_powered(struct kbase_device *kbdev)
+int kbase_pm_wait_for_l2_powered(struct kbase_device *kbdev)
 {
 	unsigned long flags;
 	unsigned long timeout;
-	int err;
+	long remaining;
+	int err = 0;
 
 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
 	kbase_pm_update_state(kbdev);
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 
-	timeout = jiffies + msecs_to_jiffies(PM_TIMEOUT_MS);
+#if MALI_USE_CSF
+	timeout = kbase_csf_timeout_in_jiffies(PM_TIMEOUT_MS);
+#else
+	timeout = msecs_to_jiffies(PM_TIMEOUT_MS);
+#endif
 
 	/* Wait for cores */
-	err = wait_event_killable(kbdev->pm.backend.gpu_in_desired_state_wait,
-			kbase_pm_is_in_desired_state_with_l2_powered(kbdev));
+#if KERNEL_VERSION(4, 13, 1) <= LINUX_VERSION_CODE
+	remaining = wait_event_killable_timeout(
+#else
+	remaining = wait_event_timeout(
+#endif
+		kbdev->pm.backend.gpu_in_desired_state_wait,
+		kbase_pm_is_in_desired_state_with_l2_powered(kbdev), timeout);
 
-	if (err < 0 && time_after(jiffies, timeout))
+	if (!remaining) {
 		kbase_pm_timed_out(kbdev);
+		err = -ETIMEDOUT;
+	} else if (remaining < 0) {
+		dev_info(
+			kbdev->dev,
+			"Wait for desired PM state with L2 powered got interrupted");
+		err = (int)remaining;
+	}
+
+	return err;
 }
 
 int kbase_pm_wait_for_desired_state(struct kbase_device *kbdev)
@@ -2045,6 +2089,7 @@ static void update_user_reg_page_mapping(struct kbase_device *kbdev)
 }
 #endif
 
+
 /*
  * pmu layout:
  * 0x0000: PMU TAG (RO) (0xCAFECAFE)
@@ -2462,7 +2507,7 @@ void kbase_pm_cache_snoop_enable(struct kbase_device *kbdev)
 {
 	if ((kbdev->current_gpu_coherency_mode == COHERENCY_ACE) &&
 		!kbdev->cci_snoop_enabled) {
-#ifdef CONFIG_ARM64
+#if IS_ENABLED(CONFIG_ARM64)
 		if (kbdev->snoop_enable_smc != 0)
 			kbase_invoke_smc_fid(kbdev->snoop_enable_smc, 0, 0, 0);
 #endif /* CONFIG_ARM64 */
@@ -2474,7 +2519,7 @@ void kbase_pm_cache_snoop_enable(struct kbase_device *kbdev)
 void kbase_pm_cache_snoop_disable(struct kbase_device *kbdev)
 {
 	if (kbdev->cci_snoop_enabled) {
-#ifdef CONFIG_ARM64
+#if IS_ENABLED(CONFIG_ARM64)
 		if (kbdev->snoop_disable_smc != 0) {
 			mali_cci_flush_l2(kbdev);
 			kbase_invoke_smc_fid(kbdev->snoop_disable_smc, 0, 0, 0);
@@ -2754,9 +2799,8 @@ kbase_pm_request_gpu_cycle_counter_do_request(struct kbase_device *kbdev)
 		/* This might happen after GPU reset.
 		 * Then counter needs to be kicked.
 		 */
-		if (!IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI) &&
-		    (!(kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_STATUS)) &
-		       GPU_STATUS_CYCLE_COUNT_ACTIVE))) {
+		if (!(kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_STATUS)) &
+		      GPU_STATUS_CYCLE_COUNT_ACTIVE)) {
 			kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
 					GPU_COMMAND_CYCLE_COUNT_START);
 		}
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_internal.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_internal.h
index d27eb58ebcda..9ec5890b0d13 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_internal.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_internal.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
@@ -28,7 +28,7 @@
 
 #include <mali_kbase_hwaccess_pm.h>
 
-#include "mali_kbase_pm_ca.h"
+#include "backend/gpu/mali_kbase_pm_ca.h"
 #include "mali_kbase_pm_policy.h"
 
 
@@ -263,8 +263,10 @@ int kbase_pm_wait_for_desired_state(struct kbase_device *kbdev);
  * because this function will take that lock itself.
  *
  * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * Return: 0 on success, error code on error
  */
-void kbase_pm_wait_for_l2_powered(struct kbase_device *kbdev);
+int kbase_pm_wait_for_l2_powered(struct kbase_device *kbdev);
 
 /**
  * kbase_pm_update_dynamic_cores_onoff - Update the L2 and shader power state
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_l2_states.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_l2_states.h
index d66b92841290..ef72f6083afd 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_l2_states.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_l2_states.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_mcu_states.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_mcu_states.h
index eab30eb32c56..4e9992839ff7 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_mcu_states.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_mcu_states.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_metrics.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_metrics.c
index 319a60bc62e8..551bf44a1775 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_metrics.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_metrics.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2011-2021 ARM Limited. All rights reserved.
@@ -28,7 +28,7 @@
 #include <backend/gpu/mali_kbase_pm_internal.h>
 
 #if MALI_USE_CSF
-#include "mali_kbase_clk_rate_trace_mgr.h"
+#include "backend/gpu/mali_kbase_clk_rate_trace_mgr.h"
 #include <csf/ipa_control/mali_kbase_csf_ipa_control.h>
 #else
 #include <backend/gpu/mali_kbase_jm_rb.h>
@@ -206,7 +206,7 @@ static void kbase_pm_get_dvfs_utilisation_calc(struct kbase_device *kbdev)
 			"Failed to query the increment of GPU_ACTIVE counter: err=%d",
 			err);
 	} else {
-		u64 diff_ns, margin_ns;
+		u64 diff_ns;
 		s64 diff_ns_signed;
 		u32 ns_time;
 		ktime_t diff = ktime_sub(
@@ -219,15 +219,7 @@ static void kbase_pm_get_dvfs_utilisation_calc(struct kbase_device *kbdev)
 
 		diff_ns = (u64)diff_ns_signed;
 
-		/* Use a margin value that is approximately 1% of the time
-		 * difference.
-		 */
-		margin_ns = diff_ns >> 6;
-
-		/* Calculate time difference in units of 256ns */
-		ns_time = (u32)(diff_ns >> KBASE_PM_TIME_SHIFT);
-
-#ifndef CONFIG_MALI_BIFROST_NO_MALI
+#if !IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI)
 		/* The GPU_ACTIVE counter shouldn't clock-up more time than has
 		 * actually elapsed - but still some margin needs to be given
 		 * when doing the comparison. There could be some drift between
@@ -239,6 +231,10 @@ static void kbase_pm_get_dvfs_utilisation_calc(struct kbase_device *kbdev)
 		 * time.
 		 */
 		if (!kbdev->pm.backend.metrics.skip_gpu_active_sanity_check) {
+			/* Use a margin value that is approximately 1% of the time
+			 * difference.
+			 */
+			u64 margin_ns = diff_ns >> 6;
 			if (gpu_active_counter > (diff_ns + margin_ns)) {
 				dev_info(
 					kbdev->dev,
@@ -247,9 +243,9 @@ static void kbase_pm_get_dvfs_utilisation_calc(struct kbase_device *kbdev)
 					(unsigned long long)diff_ns);
 			}
 		}
-#else
-		CSTD_UNUSED(margin_ns);
 #endif
+		/* Calculate time difference in units of 256ns */
+		ns_time = (u32)(diff_ns >> KBASE_PM_TIME_SHIFT);
 
 		/* Add protected_time to gpu_active_counter so that time in
 		 * protected mode is included in the apparent GPU active time,
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_policy.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_policy.c
index 1f56ae867177..9b5006c87871 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_policy.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_policy.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
@@ -33,29 +33,30 @@
 #include <csf/mali_kbase_csf_firmware.h>
 #endif
 
+#include <linux/of.h>
+
 static const struct kbase_pm_policy *const all_policy_list[] = {
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-	&kbase_pm_always_on_policy_ops,
-	&kbase_pm_coarse_demand_policy_ops,
-#if !MALI_CUSTOMER_RELEASE
-	&kbase_pm_always_on_demand_policy_ops,
-#endif
-#else				/* CONFIG_MALI_BIFROST_NO_MALI */
 	&kbase_pm_coarse_demand_policy_ops,
-#if !MALI_CUSTOMER_RELEASE
-	&kbase_pm_always_on_demand_policy_ops,
-#endif
 	&kbase_pm_always_on_policy_ops
-#endif /* CONFIG_MALI_BIFROST_NO_MALI */
 };
 
-#if MALI_USE_CSF
 void kbase_pm_policy_init(struct kbase_device *kbdev)
 {
-	unsigned long flags;
 	const struct kbase_pm_policy *default_policy = all_policy_list[0];
+	struct device_node *np = kbdev->dev->of_node;
+	const char *power_policy_name;
+	unsigned long flags;
+	int i;
+
+	if (of_property_read_string(np, "power_policy", &power_policy_name) == 0) {
+		for (i = 0; i < ARRAY_SIZE(all_policy_list); i++)
+			if (sysfs_streq(all_policy_list[i]->name, power_policy_name)) {
+				default_policy = all_policy_list[i];
+				break;
+			}
+	}
 
-#if defined CONFIG_MALI_BIFROST_DEBUG
+#if MALI_USE_CSF && defined(CONFIG_MALI_BIFROST_DEBUG)
 	/* Use always_on policy if module param fw_debug=1 is
 	 * passed, to aid firmware debugging.
 	 */
@@ -63,31 +64,18 @@ void kbase_pm_policy_init(struct kbase_device *kbdev)
 		default_policy = &kbase_pm_always_on_policy_ops;
 #endif
 
-
 	default_policy->init(kbdev);
 
+#if MALI_USE_CSF
 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
 	kbdev->pm.backend.pm_current_policy = default_policy;
-	kbdev->pm.backend.csf_pm_sched_flags =
-				default_policy->pm_sched_flags;
+	kbdev->pm.backend.csf_pm_sched_flags = default_policy->pm_sched_flags;
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-}
-#else /* MALI_USE_CSF */
-void kbase_pm_policy_init(struct kbase_device *kbdev)
-{
-	kbdev->pm.backend.pm_current_policy = all_policy_list[0];
-
-#if MALI_USE_CSF && defined CONFIG_MALI_BIFROST_DEBUG
-	/* Use always_on policy if module param fw_debug=1 is
-	 * passed, to aid firmware debugging.
-	 */
-	if (fw_debug)
-		kbdev->pm.backend.pm_current_policy =
-			&kbase_pm_always_on_policy_ops;
+#else
+	CSTD_UNUSED(flags);
+	kbdev->pm.backend.pm_current_policy = default_policy;
 #endif
-	kbdev->pm.backend.pm_current_policy->init(kbdev);
 }
-#endif /* MALI_USE_CSF */
 
 void kbase_pm_policy_term(struct kbase_device *kbdev)
 {
@@ -373,6 +361,9 @@ void kbase_pm_set_policy(struct kbase_device *kbdev,
 	if (old_policy->term)
 		old_policy->term(kbdev);
 
+	memset(&kbdev->pm.backend.pm_policy_data, 0,
+	       sizeof(union kbase_pm_policy_data));
+
 	KBASE_KTRACE_ADD(kbdev, PM_CURRENT_POLICY_INIT, NULL, new_policy->id);
 	if (new_policy->init)
 		new_policy->init(kbdev);
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_policy.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_policy.h
index a513a26ac92c..e8113659b92e 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_policy.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_policy.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2010-2015, 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2015, 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_shader_states.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_shader_states.h
index 2276713d9987..8622ef78d363 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_shader_states.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_shader_states.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_time.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_time.c
index 7abb8e2c7b06..d10e40426099 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_time.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_time.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2014-2016, 2018-2021 ARM Limited. All rights reserved.
@@ -76,9 +76,6 @@ void kbase_backend_get_gpu_time_norequest(struct kbase_device *kbdev,
  */
 static bool timedwait_cycle_count_active(struct kbase_device *kbdev)
 {
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-	return true;
-#else
 	bool success = false;
 	const unsigned int timeout = 100;
 	const unsigned long remaining = jiffies + msecs_to_jiffies(timeout);
@@ -91,7 +88,6 @@ static bool timedwait_cycle_count_active(struct kbase_device *kbdev)
 		}
 	}
 	return success;
-#endif
 }
 #endif
 
diff --git a/drivers/gpu/arm/bifrost/build.bp b/drivers/gpu/arm/bifrost/build.bp
index b1b52ffe9a1c..f88f60401596 100644
--- a/drivers/gpu/arm/bifrost/build.bp
+++ b/drivers/gpu/arm/bifrost/build.bp
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2017-2021 ARM Limited. All rights reserved.
@@ -25,14 +25,17 @@
  * both mali_kbase and the test modules. */
 bob_defaults {
     name: "mali_kbase_shared_config_defaults",
+    defaults: [
+        "kernel_defaults",
+    ],
     no_mali: {
-        kbuild_options: ["CONFIG_MALI_BIFROST_NO_MALI=y"],
-    },
-    mali_real_hw: {
-        kbuild_options: ["CONFIG_MALI_REAL_HW=y"],
+        kbuild_options: [
+            "CONFIG_MALI_BIFROST_NO_MALI=y",
+            "CONFIG_MALI_NO_MALI_DEFAULT_GPU={{.gpu}}",
+        ],
     },
-    mali_dma_fence: {
-        kbuild_options: ["CONFIG_MALI_BIFROST_DMA_FENCE=y"],
+    gpu_has_csf: {
+        kbuild_options: ["CONFIG_MALI_CSF_SUPPORT=y"],
     },
     mali_devfreq: {
         kbuild_options: ["CONFIG_MALI_BIFROST_DEVFREQ=y"],
@@ -40,8 +43,62 @@ bob_defaults {
     mali_midgard_dvfs: {
         kbuild_options: ["CONFIG_MALI_BIFROST_DVFS=y"],
     },
+    mali_gator_support: {
+        kbuild_options: ["CONFIG_MALI_BIFROST_GATOR_SUPPORT=y"],
+    },
+    mali_midgard_enable_trace: {
+        kbuild_options: ["CONFIG_MALI_BIFROST_ENABLE_TRACE=y"],
+    },
+    mali_dma_fence: {
+        kbuild_options: ["CONFIG_MALI_BIFROST_DMA_FENCE=y"],
+    },
+    mali_arbiter_support: {
+        kbuild_options: ["CONFIG_MALI_ARBITER_SUPPORT=y"],
+    },
+    mali_dma_buf_map_on_demand: {
+        kbuild_options: ["CONFIG_MALI_DMA_BUF_MAP_ON_DEMAND=y"],
+    },
+    mali_dma_buf_legacy_compat: {
+        kbuild_options: ["CONFIG_MALI_DMA_BUF_LEGACY_COMPAT=y"],
+    },
+    mali_2mb_alloc: {
+        kbuild_options: ["CONFIG_MALI_2MB_ALLOC=y"],
+    },
+    mali_memory_fully_backed: {
+        kbuild_options: ["CONFIG_MALI_MEMORY_FULLY_BACKED=y"],
+    },
+    mali_corestack: {
+        kbuild_options: ["CONFIG_MALI_CORESTACK=y"],
+    },
+    mali_real_hw: {
+        kbuild_options: ["CONFIG_MALI_REAL_HW=y"],
+    },
+    mali_error_inject_none: {
+        kbuild_options: ["CONFIG_MALI_ERROR_INJECT_NONE=y"],
+    },
+    mali_error_inject_track_list: {
+        kbuild_options: ["CONFIG_MALI_ERROR_INJECT_TRACK_LIST=y"],
+    },
+    mali_error_inject_random: {
+        kbuild_options: ["CONFIG_MALI_ERROR_INJECT_RANDOM=y"],
+    },
+    mali_error_inject: {
+        kbuild_options: ["CONFIG_MALI_BIFROST_ERROR_INJECT=y"],
+    },
+    mali_gem5_build: {
+       kbuild_options: ["CONFIG_MALI_GEM5_BUILD=y"],
+    },
     mali_debug: {
-        kbuild_options: ["CONFIG_MALI_BIFROST_DEBUG=y"],
+        kbuild_options: [
+            "CONFIG_MALI_BIFROST_DEBUG=y",
+            "MALI_KERNEL_TEST_API={{.debug}}",
+        ],
+    },
+    mali_fence_debug: {
+        kbuild_options: ["CONFIG_MALI_BIFROST_FENCE_DEBUG=y"],
+    },
+    mali_system_trace: {
+        kbuild_options: ["CONFIG_MALI_BIFROST_SYSTEM_TRACE=y"],
     },
     buslog: {
         kbuild_options: ["CONFIG_MALI_BUSLOG=y"],
@@ -52,44 +109,60 @@ bob_defaults {
     cinstr_gwt: {
         kbuild_options: ["CONFIG_MALI_CINSTR_GWT=y"],
     },
-    mali_gator_support: {
-        kbuild_options: ["CONFIG_MALI_BIFROST_GATOR_SUPPORT=y"],
-    },
-    mali_midgard_enable_trace: {
-        kbuild_options: ["CONFIG_MALI_BIFROST_ENABLE_TRACE=y"],
+    cinstr_primary_hwc: {
+        kbuild_options: ["CONFIG_MALI_PRFCNT_SET_PRIMARY=y"],
     },
-    mali_system_trace: {
-        kbuild_options: ["CONFIG_MALI_BIFROST_SYSTEM_TRACE=y"],
+    cinstr_secondary_hwc: {
+        kbuild_options: ["CONFIG_MALI_BIFROST_PRFCNT_SET_SECONDARY=y"],
     },
-    mali_pwrsoft_765: {
-        kbuild_options: ["CONFIG_MALI_PWRSOFT_765=y"],
+    cinstr_tertiary_hwc: {
+        kbuild_options: ["CONFIG_MALI_PRFCNT_SET_TERTIARY=y"],
     },
-    mali_memory_fully_backed: {
-        kbuild_options: ["CONFIG_MALI_MEMORY_FULLY_BACKED=y"],
+    cinstr_hwc_set_select_via_debug_fs: {
+        kbuild_options: ["CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS=y"],
     },
-    mali_dma_buf_map_on_demand: {
-        kbuild_options: ["CONFIG_MALI_DMA_BUF_MAP_ON_DEMAND=y"],
+    mali_job_dump: {
+        kbuild_options: ["CONFIG_MALI_JOB_DUMP"],
     },
-    mali_dma_buf_legacy_compat: {
-        kbuild_options: ["CONFIG_MALI_DMA_BUF_LEGACY_COMPAT=y"],
+    mali_pwrsoft_765: {
+        kbuild_options: ["CONFIG_MALI_PWRSOFT_765=y"],
     },
-    mali_arbiter_support: {
-        kbuild_options: ["CONFIG_MALI_ARBITER_SUPPORT=y"],
+    mali_hw_errata_1485982_not_affected: {
+        kbuild_options: ["CONFIG_MALI_HW_ERRATA_1485982_NOT_AFFECTED=y"],
     },
-    mali_gem5_build: {
-       kbuild_options: ["CONFIG_MALI_GEM5_BUILD=y"],
+    mali_hw_errata_1485982_use_clock_alternative: {
+        kbuild_options: ["CONFIG_MALI_HW_ERRATA_1485982_USE_CLOCK_ALTERNATIVE=y"],
     },
     kbuild_options: [
-        "MALI_UNIT_TEST={{.unit_test_code}}",
+        "CONFIG_MALI_PLATFORM_NAME={{.mali_platform_name}}",
         "MALI_CUSTOMER_RELEASE={{.release}}",
+        "MALI_UNIT_TEST={{.unit_test_code}}",
         "MALI_USE_CSF={{.gpu_has_csf}}",
-        "MALI_KERNEL_TEST_API={{.debug}}",
+        "MALI_JIT_PRESSURE_LIMIT_BASE={{.jit_pressure_limit_base}}",
+
+        // Start of CS experimental features definitions.
+        // If there is nothing below, definition should be added as follows:
+        // "MALI_EXPERIMENTAL_FEATURE={{.experimental_feature}}"
+        // experimental_feature above comes from Mconfig in
+        // <ddk_root>/product/base/
+        // However, in Mconfig, experimental_feature should be looked up (for
+        // similar explanation to this one) as ALLCAPS, i.e.
+        // EXPERIMENTAL_FEATURE.
+        //
+        // IMPORTANT: MALI_CS_EXPERIMENTAL should NEVER be defined below as it
+        // is an umbrella feature that would be open for inappropriate use
+        // (catch-all for experimental CS code without separating it into
+        // different features).
+        "MALI_INCREMENTAL_RENDERING={{.incremental_rendering}}",
+        "GPU_TIMESTAMP_CORRECTION={{.gpu_timestamp_correction}}",
     ],
-    defaults: ["kernel_defaults"],
 }
 
 bob_kernel_module {
     name: "mali_kbase",
+    defaults: [
+        "mali_kbase_shared_config_defaults",
+    ],
     srcs: [
         "*.c",
         "*.h",
@@ -99,6 +172,7 @@ bob_kernel_module {
         "backend/gpu/Kbuild",
         "context/*.c",
         "context/*.h",
+        "context/Kbuild",
         "ipa/*.c",
         "ipa/*.h",
         "ipa/Kbuild",
@@ -107,55 +181,23 @@ bob_kernel_module {
         "platform/*/*.h",
         "platform/*/Kbuild",
         "thirdparty/*.c",
+        "thirdparty/Kbuild",
         "debug/*.c",
         "debug/*.h",
+        "debug/Kbuild",
         "device/*.c",
         "device/*.h",
+        "device/Kbuild",
         "gpu/*.c",
         "gpu/*.h",
+        "gpu/Kbuild",
         "tl/*.c",
         "tl/*.h",
+        "tl/Kbuild",
         "mmu/*.c",
         "mmu/*.h",
+        "mmu/Kbuild",
     ],
-    kbuild_options: [
-        "CONFIG_MALI_KUTF=n",
-        "CONFIG_MALI_MIDGARD=m",
-        "CONFIG_MALI_NO_MALI_DEFAULT_GPU={{.gpu}}",
-        "CONFIG_MALI_PLATFORM_NAME={{.mali_platform_name}}",
-    ],
-    buslog: {
-        extra_symbols: [
-            "bus_logger",
-        ],
-    },
-    mali_corestack: {
-        kbuild_options: ["CONFIG_MALI_CORESTACK=y"],
-    },
-    mali_error_inject: {
-        kbuild_options: ["CONFIG_MALI_BIFROST_ERROR_INJECT=y"],
-    },
-    mali_error_inject_random: {
-        kbuild_options: ["CONFIG_MALI_ERROR_INJECT_RANDOM=y"],
-    },
-    cinstr_secondary_hwc: {
-        kbuild_options: ["CONFIG_MALI_BIFROST_PRFCNT_SET_SECONDARY=y"],
-    },
-    cinstr_tertiary_hwc: {
-        kbuild_options: ["CONFIG_MALI_PRFCNT_SET_TERTIARY=y"],
-    },
-    cinstr_hwc_set_select_via_debug_fs: {
-        kbuild_options: ["CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS=y"],
-    },
-    mali_2mb_alloc: {
-        kbuild_options: ["CONFIG_MALI_2MB_ALLOC=y"],
-    },
-    mali_hw_errata_1485982_not_affected: {
-        kbuild_options: ["CONFIG_MALI_HW_ERRATA_1485982_NOT_AFFECTED=y"],
-    },
-    mali_hw_errata_1485982_use_clock_alternative: {
-        kbuild_options: ["CONFIG_MALI_HW_ERRATA_1485982_USE_CLOCK_ALTERNATIVE=y"],
-    },
     gpu_has_job_manager: {
         srcs: [
             "context/backend/*_jm.c",
@@ -172,7 +214,6 @@ bob_kernel_module {
         ],
     },
     gpu_has_csf: {
-        kbuild_options: ["CONFIG_MALI_CSF_SUPPORT=y"],
         srcs: [
             "context/backend/*_csf.c",
             "csf/*.c",
@@ -199,5 +240,13 @@ bob_kernel_module {
             "arbiter/Kbuild",
         ],
     },
-    defaults: ["mali_kbase_shared_config_defaults"],
+    kbuild_options: [
+        "CONFIG_MALI_BIFROST=m",
+        "CONFIG_MALI_KUTF=n",
+    ],
+    buslog: {
+        extra_symbols: [
+            "bus_logger",
+        ],
+    },
 }
diff --git a/drivers/base/arm/protected_memory_allocator/Kconfig b/drivers/gpu/arm/bifrost/context/Kbuild
similarity index 63%
rename from drivers/base/arm/protected_memory_allocator/Kconfig
rename to drivers/gpu/arm/bifrost/context/Kbuild
index 5ee5dcce625d..156b46a12870 100644
--- a/drivers/base/arm/protected_memory_allocator/Kconfig
+++ b/drivers/gpu/arm/bifrost/context/Kbuild
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2012-2013, 2016-2017, 2020-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
@@ -18,10 +18,10 @@
 #
 #
 
+bifrost_kbase-y += context/mali_kbase_context.o
 
-config MALI_PROTECTED_MEMORY_ALLOCATOR
-	tristate "MALI_PROTECTED_MEMORY_ALLOCATOR"
-	help
-	  This option enables an example implementation of a protected memory allocator
-	  for allocation and release of pages of secure memory intended to be used
-	  by the firmware of Mali GPU device drivers.
+ifeq ($(CONFIG_MALI_CSF_SUPPORT),y)
+    bifrost_kbase-y += context/backend/mali_kbase_context_csf.o
+else
+    bifrost_kbase-y += context/backend/mali_kbase_context_jm.o
+endif
diff --git a/drivers/gpu/arm/bifrost/context/backend/mali_kbase_context_csf.c b/drivers/gpu/arm/bifrost/context/backend/mali_kbase_context_csf.c
index c6602476284f..1ce806f639d4 100644
--- a/drivers/gpu/arm/bifrost/context/backend/mali_kbase_context_csf.c
+++ b/drivers/gpu/arm/bifrost/context/backend/mali_kbase_context_csf.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -32,7 +32,7 @@
 #include <mmu/mali_kbase_mmu.h>
 #include <tl/mali_kbase_timeline.h>
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 #include <csf/mali_kbase_csf_csg_debugfs.h>
 #include <csf/mali_kbase_csf_kcpu_debugfs.h>
 #include <csf/mali_kbase_csf_tiler_heap_debugfs.h>
diff --git a/drivers/gpu/arm/bifrost/context/backend/mali_kbase_context_jm.c b/drivers/gpu/arm/bifrost/context/backend/mali_kbase_context_jm.c
index d74e31fe8ca4..8ce81e78a9e6 100644
--- a/drivers/gpu/arm/bifrost/context/backend/mali_kbase_context_jm.c
+++ b/drivers/gpu/arm/bifrost/context/backend/mali_kbase_context_jm.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -34,7 +34,7 @@
 #include <mmu/mali_kbase_mmu.h>
 #include <tl/mali_kbase_timeline.h>
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 #include <mali_kbase_debug_mem_view.h>
 #include <mali_kbase_mem_pool_debugfs.h>
 
@@ -147,7 +147,7 @@ static const struct kbase_context_init context_init[] = {
 	  "JS kctx initialization failed" },
 	{ kbase_jd_init, kbase_jd_exit, "JD initialization failed" },
 	{ kbase_context_submit_check, NULL, "Enabling job submission failed" },
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 	{ kbase_debug_job_fault_context_init,
 	  kbase_debug_job_fault_context_term,
 	  "Job fault context initialization failed" },
@@ -155,6 +155,8 @@ static const struct kbase_context_init context_init[] = {
 	{ NULL, kbase_context_flush_jobs, NULL },
 	{ kbase_context_add_to_dev_list, kbase_context_remove_from_dev_list,
 	  "Adding kctx to device failed" },
+	{ kbasep_platform_context_init, kbasep_platform_context_term,
+	  "Platform callback for kctx initialization failed" },
 };
 
 static void kbase_context_term_partial(
diff --git a/drivers/gpu/arm/bifrost/context/mali_kbase_context.c b/drivers/gpu/arm/bifrost/context/mali_kbase_context.c
index fa4970be05ce..b2e7025dd334 100644
--- a/drivers/gpu/arm/bifrost/context/mali_kbase_context.c
+++ b/drivers/gpu/arm/bifrost/context/mali_kbase_context.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -154,7 +154,7 @@ int kbase_context_common_init(struct kbase_context *kctx)
 	atomic_set(&kctx->event_count, 0);
 #if !MALI_USE_CSF
 	atomic_set(&kctx->event_closed, false);
-#ifdef CONFIG_GPU_TRACEPOINTS
+#if IS_ENABLED(CONFIG_GPU_TRACEPOINTS)
 	atomic_set(&kctx->jctx.work_id, 0);
 #endif
 #endif
diff --git a/drivers/gpu/arm/bifrost/context/mali_kbase_context.h b/drivers/gpu/arm/bifrost/context/mali_kbase_context.h
index f18f64b172be..a0c51c90cd23 100644
--- a/drivers/gpu/arm/bifrost/context/mali_kbase_context.h
+++ b/drivers/gpu/arm/bifrost/context/mali_kbase_context.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2011-2017, 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2017, 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/context/mali_kbase_context_internal.h b/drivers/gpu/arm/bifrost/context/mali_kbase_context_internal.h
index fd009b8ebc89..1cde7394c705 100644
--- a/drivers/gpu/arm/bifrost/context/mali_kbase_context_internal.h
+++ b/drivers/gpu/arm/bifrost/context/mali_kbase_context_internal.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/csf/Kbuild b/drivers/gpu/arm/bifrost/csf/Kbuild
index d65b75f32525..7bb5f54452b1 100644
--- a/drivers/gpu/arm/bifrost/csf/Kbuild
+++ b/drivers/gpu/arm/bifrost/csf/Kbuild
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2018-2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
@@ -19,24 +19,29 @@
 #
 
 bifrost_kbase-y += \
-	csf/mali_kbase_csf_firmware_cfg.o \
-	csf/mali_kbase_csf_trace_buffer.o \
-	csf/mali_kbase_csf.o \
-	csf/mali_kbase_csf_scheduler.o \
-	csf/mali_kbase_csf_kcpu.o \
-	csf/mali_kbase_csf_tiler_heap.o \
-	csf/mali_kbase_csf_timeout.o \
-	csf/mali_kbase_csf_tl_reader.o \
-	csf/mali_kbase_csf_heap_context_alloc.o \
-	csf/mali_kbase_csf_reset_gpu.o \
-	csf/mali_kbase_csf_csg_debugfs.o \
-	csf/mali_kbase_csf_kcpu_debugfs.o \
-	csf/mali_kbase_csf_protected_memory.o \
-	csf/mali_kbase_csf_tiler_heap_debugfs.o \
-	csf/mali_kbase_csf_cpu_queue_debugfs.o
+    csf/mali_kbase_csf_firmware_cfg.o \
+    csf/mali_kbase_csf_trace_buffer.o \
+    csf/mali_kbase_csf.o \
+    csf/mali_kbase_csf_scheduler.o \
+    csf/mali_kbase_csf_kcpu.o \
+    csf/mali_kbase_csf_tiler_heap.o \
+    csf/mali_kbase_csf_timeout.o \
+    csf/mali_kbase_csf_tl_reader.o \
+    csf/mali_kbase_csf_heap_context_alloc.o \
+    csf/mali_kbase_csf_reset_gpu.o \
+    csf/mali_kbase_csf_csg_debugfs.o \
+    csf/mali_kbase_csf_kcpu_debugfs.o \
+    csf/mali_kbase_csf_protected_memory.o \
+    csf/mali_kbase_csf_tiler_heap_debugfs.o \
+    csf/mali_kbase_csf_cpu_queue_debugfs.o
 
 bifrost_kbase-$(CONFIG_MALI_REAL_HW) += csf/mali_kbase_csf_firmware.o
 
-bifrost_kbase-$(CONFIG_MALI_BIFROST_NO_MALI) += csf/mali_kbase_csf_firmware_no_mali.o
 
-include $(src)/csf/ipa_control/Kbuild
+ifeq ($(KBUILD_EXTMOD),)
+# in-tree
+    -include $(src)/csf/ipa_control/Kbuild
+else
+# out-of-tree
+    include $(src)/csf/ipa_control/Kbuild
+endif
diff --git a/drivers/gpu/arm/bifrost/csf/ipa_control/Kbuild b/drivers/gpu/arm/bifrost/csf/ipa_control/Kbuild
index 222e0c803572..dc30281e4781 100644
--- a/drivers/gpu/arm/bifrost/csf/ipa_control/Kbuild
+++ b/drivers/gpu/arm/bifrost/csf/ipa_control/Kbuild
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
@@ -19,4 +19,4 @@
 #
 
 bifrost_kbase-y += \
-	csf/ipa_control/mali_kbase_csf_ipa_control.o
\ No newline at end of file
+    csf/ipa_control/mali_kbase_csf_ipa_control.o
diff --git a/drivers/gpu/arm/bifrost/csf/ipa_control/mali_kbase_csf_ipa_control.c b/drivers/gpu/arm/bifrost/csf/ipa_control/mali_kbase_csf_ipa_control.c
index 7b0845c0d78c..e23d68110b58 100644
--- a/drivers/gpu/arm/bifrost/csf/ipa_control/mali_kbase_csf_ipa_control.c
+++ b/drivers/gpu/arm/bifrost/csf/ipa_control/mali_kbase_csf_ipa_control.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -20,7 +20,7 @@
  */
 
 #include <mali_kbase.h>
-#include "mali_kbase_clk_rate_trace_mgr.h"
+#include "backend/gpu/mali_kbase_clk_rate_trace_mgr.h"
 #include "mali_kbase_csf_ipa_control.h"
 
 /*
diff --git a/drivers/gpu/arm/bifrost/csf/ipa_control/mali_kbase_csf_ipa_control.h b/drivers/gpu/arm/bifrost/csf/ipa_control/mali_kbase_csf_ipa_control.h
index a828e01f9d4d..348a52f54d8f 100644
--- a/drivers/gpu/arm/bifrost/csf/ipa_control/mali_kbase_csf_ipa_control.h
+++ b/drivers/gpu/arm/bifrost/csf/ipa_control/mali_kbase_csf_ipa_control.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf.c
index 00f89088c7ba..b4c780b25048 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
@@ -144,14 +144,21 @@ static void gpu_munmap_user_io_pages(struct kbase_context *kctx,
 	mutex_unlock(&kctx->kbdev->csf.reg_lock);
 }
 
-static void init_user_output_page(struct kbase_queue *queue)
+static void init_user_io_pages(struct kbase_queue *queue)
 {
-	u32 *addr = (u32 *)(queue->user_io_addr + PAGE_SIZE);
+	u32 *input_addr = (u32 *)(queue->user_io_addr);
+	u32 *output_addr = (u32 *)(queue->user_io_addr + PAGE_SIZE);
 
-	addr[CS_EXTRACT_LO/4] = 0;
-	addr[CS_EXTRACT_HI/4] = 0;
+	input_addr[CS_INSERT_LO/4] = 0;
+	input_addr[CS_INSERT_HI/4] = 0;
 
-	addr[CS_ACTIVE/4] = 0;
+	input_addr[CS_EXTRACT_INIT_LO/4] = 0;
+	input_addr[CS_EXTRACT_INIT_HI/4] = 0;
+
+	output_addr[CS_EXTRACT_LO/4] = 0;
+	output_addr[CS_EXTRACT_HI/4] = 0;
+
+	output_addr[CS_ACTIVE/4] = 0;
 }
 
 /* Map the input/output pages in the shared interface segment of MCU firmware
@@ -350,7 +357,7 @@ int kbase_csf_alloc_command_stream_user_pages(struct kbase_context *kctx,
 	if (ret)
 		goto kernel_map_failed;
 
-	init_user_output_page(queue);
+	init_user_io_pages(queue);
 
 	ret = gpu_mmap_user_io_pages(kctx->kbdev, queue->phys, reg);
 	if (ret)
@@ -455,19 +462,39 @@ static void release_queue(struct kbase_queue *queue)
 static void oom_event_worker(struct work_struct *data);
 static void fatal_event_worker(struct work_struct *data);
 
-int kbase_csf_queue_register(struct kbase_context *kctx,
-			     struct kbase_ioctl_cs_queue_register *reg)
+/* Between reg and reg_ex, one and only one must be null */
+static int csf_queue_register_internal(struct kbase_context *kctx,
+			struct kbase_ioctl_cs_queue_register *reg,
+			struct kbase_ioctl_cs_queue_register_ex *reg_ex)
 {
 	struct kbase_queue *queue;
 	int ret = 0;
 	struct kbase_va_region *region;
-	u64 queue_addr = reg->buffer_gpu_addr;
-	size_t queue_size = reg->buffer_size >> PAGE_SHIFT;
+	u64 queue_addr;
+	size_t queue_size;
+
+	/* Only one pointer expected, otherwise coding error */
+	if ((reg == NULL && reg_ex == NULL) || (reg && reg_ex)) {
+		dev_err(kctx->kbdev->dev,
+			"Error, one and only one param-ptr expected!");
+		return -EINVAL;
+	}
+
+	/* struct kbase_ioctl_cs_queue_register_ex contains a full
+	 * struct kbase_ioctl_cs_queue_register at the start address. So
+	 * the pointer can be safely cast to pointing to a
+	 * kbase_ioctl_cs_queue_register object.
+	 */
+	if (reg_ex)
+		reg = (struct kbase_ioctl_cs_queue_register *)reg_ex;
 
 	/* Validate the queue priority */
 	if (reg->priority > BASE_QUEUE_MAX_PRIORITY)
 		return -EINVAL;
 
+	queue_addr = reg->buffer_gpu_addr;
+	queue_size = reg->buffer_size >> PAGE_SHIFT;
+
 	mutex_lock(&kctx->csf.lock);
 
 	/* Check if queue is already registered */
@@ -492,6 +519,35 @@ int kbase_csf_queue_register(struct kbase_context *kctx,
 		goto out_unlock_vm;
 	}
 
+	/* Check address validity on cs_trace buffer etc. Don't care
+	 * if not enabled (i.e. when size is 0).
+	 */
+	if (reg_ex && reg_ex->ex_buffer_size) {
+		int buf_pages = (reg_ex->ex_buffer_size +
+				 (1 << PAGE_SHIFT) - 1) >> PAGE_SHIFT;
+
+		region = kbase_region_tracker_find_region_enclosing_address(
+				kctx, reg_ex->ex_buffer_base);
+		if (kbase_is_region_invalid_or_free(region)) {
+			ret = -ENOENT;
+			goto out_unlock_vm;
+		}
+
+		if (buf_pages > (region->nr_pages -
+				 ((reg_ex->ex_buffer_base >> PAGE_SHIFT) -
+				 region->start_pfn))) {
+			ret = -EINVAL;
+			goto out_unlock_vm;
+		}
+
+		region = kbase_region_tracker_find_region_enclosing_address(
+				kctx, reg_ex->ex_offset_var_addr);
+		if (kbase_is_region_invalid_or_free(region)) {
+			ret = -ENOENT;
+			goto out_unlock_vm;
+		}
+	}
+
 	queue = kzalloc(sizeof(struct kbase_queue), GFP_KERNEL);
 
 	if (!queue) {
@@ -529,6 +585,22 @@ int kbase_csf_queue_register(struct kbase_context *kctx,
 
 	region->flags |= KBASE_REG_NO_USER_FREE;
 
+	/* Initialize the cs_trace configuration parameters, When buffer_size
+	 * is 0, trace is disabled. Here we only update the fields when
+	 * enabled, otherwise leave them as default zeros.
+	 */
+	if (reg_ex && reg_ex->ex_buffer_size) {
+		u32 cfg = CS_INSTR_CONFIG_EVENT_SIZE_SET(
+					0, reg_ex->ex_event_size);
+		cfg = CS_INSTR_CONFIG_EVENT_STATE_SET(
+					cfg, reg_ex->ex_event_state);
+
+		queue->trace_cfg = cfg;
+		queue->trace_buffer_size = reg_ex->ex_buffer_size;
+		queue->trace_buffer_base = reg_ex->ex_buffer_base;
+		queue->trace_offset_ptr = reg_ex->ex_offset_var_addr;
+	}
+
 out_unlock_vm:
 	kbase_gpu_vm_unlock(kctx);
 out:
@@ -537,6 +609,37 @@ int kbase_csf_queue_register(struct kbase_context *kctx,
 	return ret;
 }
 
+int kbase_csf_queue_register(struct kbase_context *kctx,
+			     struct kbase_ioctl_cs_queue_register *reg)
+{
+	return csf_queue_register_internal(kctx, reg, NULL);
+}
+
+int kbase_csf_queue_register_ex(struct kbase_context *kctx,
+				struct kbase_ioctl_cs_queue_register_ex *reg)
+{
+	struct kbase_csf_global_iface const *const iface =
+						&kctx->kbdev->csf.global_iface;
+	u32 const glb_version = iface->version;
+	u32 instr = iface->instr_features;
+	u8 max_size = GLB_INSTR_FEATURES_EVENT_SIZE_MAX_GET(instr);
+	u32 min_buf_size = (1u << reg->ex_event_size) *
+			GLB_INSTR_FEATURES_OFFSET_UPDATE_RATE_GET(instr);
+
+	/* If cs_trace_command not supported, the call fails */
+	if (glb_version < kbase_csf_interface_version(1, 1, 0))
+		return -EINVAL;
+
+	/* Validate the cs_trace configuration parameters */
+        if (reg->ex_buffer_size &&
+            ((reg->ex_event_size > max_size) ||
+             (reg->ex_buffer_size & (reg->ex_buffer_size - 1)) ||
+             (reg->ex_buffer_size < min_buf_size)))
+          return -EINVAL;
+
+        return csf_queue_register_internal(kctx, NULL, reg);
+}
+
 static void unbind_queue(struct kbase_context *kctx,
 		struct kbase_queue *queue);
 
@@ -787,6 +890,8 @@ static void unbind_stopped_queue(struct kbase_context *kctx,
 		kbase_csf_scheduler_spin_lock(kctx->kbdev, &flags);
 		bitmap_clear(queue->group->protm_pending_bitmap,
 				queue->csi_index, 1);
+		KBASE_KTRACE_ADD_CSF_GRP_Q(kctx->kbdev, PROTM_PENDING_CLEAR,
+			 queue->group, queue, queue->group->protm_pending_bitmap[0]);
 		queue->group->bound_queues[queue->csi_index] = NULL;
 		queue->group = NULL;
 		kbase_csf_scheduler_spin_unlock(kctx->kbdev, flags);
@@ -1913,6 +2018,7 @@ void kbase_csf_event_signal(struct kbase_context *kctx, bool notify_gpu)
 		spin_lock_irqsave(&kctx->kbdev->hwaccess_lock, flags);
 		if (kctx->kbdev->pm.backend.gpu_powered)
 			kbase_csf_ring_doorbell(kctx->kbdev, CSF_KERNEL_DOORBELL_NR);
+		KBASE_KTRACE_ADD(kctx->kbdev, SYNC_UPDATE_EVENT_NOTIFY_GPU, kctx, 0u);
 		spin_unlock_irqrestore(&kctx->kbdev->hwaccess_lock, flags);
 	}
 
@@ -2251,7 +2357,11 @@ static void protm_event_worker(struct work_struct *data)
 	struct kbase_queue_group *const group =
 		container_of(data, struct kbase_queue_group, protm_event_work);
 
+	KBASE_KTRACE_ADD_CSF_GRP(group->kctx->kbdev, PROTM_EVENT_WORKER_BEGIN,
+				 group, 0u);
 	kbase_csf_scheduler_group_protm_enter(group);
+	KBASE_KTRACE_ADD_CSF_GRP(group->kctx->kbdev, PROTM_EVENT_WORKER_END,
+				 group, 0u);
 }
 
 static void report_queue_fatal_error(struct kbase_queue *const queue,
@@ -2308,13 +2418,16 @@ handle_fault_event(struct kbase_queue *const queue,
 
 	kbase_csf_scheduler_spin_lock_assert_held(kbdev);
 
-	dev_warn(kbdev->dev, "CSI: %d\n"
-			"CS_FAULT.EXCEPTION_TYPE: 0x%x (%s)\n"
-			"CS_FAULT.EXCEPTION_DATA: 0x%x\n"
-			"CS_FAULT_INFO.EXCEPTION_DATA: 0x%llx\n",
-			queue->csi_index, cs_fault_exception_type,
-			kbase_gpu_exception_name(cs_fault_exception_type),
-			cs_fault_exception_data, cs_fault_info_exception_data);
+	dev_warn(kbdev->dev,
+		 "Ctx %d_%d Group %d CSG %d CSI: %d\n"
+		 "CS_FAULT.EXCEPTION_TYPE: 0x%x (%s)\n"
+		 "CS_FAULT.EXCEPTION_DATA: 0x%x\n"
+		 "CS_FAULT_INFO.EXCEPTION_DATA: 0x%llx\n",
+		 queue->kctx->tgid, queue->kctx->id, queue->group->handle,
+		 queue->group->csg_nr, queue->csi_index,
+		 cs_fault_exception_type,
+		 kbase_gpu_exception_name(cs_fault_exception_type),
+		 cs_fault_exception_data, cs_fault_info_exception_data);
 
 	if (cs_fault_exception_type ==
 	    CS_FAULT_EXCEPTION_TYPE_RESOURCE_EVICTION_TIMEOUT)
@@ -2398,11 +2511,12 @@ handle_fatal_event(struct kbase_queue *const queue,
 	kbase_csf_scheduler_spin_lock_assert_held(kbdev);
 
 	dev_warn(kbdev->dev,
-		 "CSG: %d, CSI: %d\n"
+		 "Ctx %d_%d Group %d CSG %d CSI: %d\n"
 		 "CS_FATAL.EXCEPTION_TYPE: 0x%x (%s)\n"
 		 "CS_FATAL.EXCEPTION_DATA: 0x%x\n"
 		 "CS_FATAL_INFO.EXCEPTION_DATA: 0x%llx\n",
-		 queue->group->handle, queue->csi_index,
+		 queue->kctx->tgid, queue->kctx->id, queue->group->handle,
+		 queue->group->csg_nr, queue->csi_index,
 		 cs_fatal_exception_type,
 		 kbase_gpu_exception_name(cs_fatal_exception_type),
 		 cs_fatal_exception_data, cs_fatal_info_exception_data);
@@ -2505,23 +2619,28 @@ static void process_cs_interrupts(struct kbase_queue_group *const group,
 			if ((cs_req & CS_REQ_EXCEPTION_MASK) ^
 			    (cs_ack & CS_ACK_EXCEPTION_MASK)) {
 				KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, CSI_FAULT_INTERRUPT, group, queue, cs_req ^ cs_ack);
-				handle_queue_exception_event(queue, cs_req,
-							     cs_ack);
+				handle_queue_exception_event(queue, cs_req, cs_ack);
 			}
 
 			/* PROTM_PEND and TILER_OOM can be safely ignored
 			 * because they will be raised again if the group
 			 * is assigned a CSG slot in future.
 			 */
-			if (group_suspending)
+			if (group_suspending) {
+				u32 const cs_req_remain = cs_req & ~CS_REQ_EXCEPTION_MASK;
+				u32 const cs_ack_remain = cs_ack & ~CS_ACK_EXCEPTION_MASK;
+
+				KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, CSI_IGNORED_INTERRUPTS_GROUP_SUSPEND,
+							   group, queue, cs_req_remain ^ cs_ack_remain);
 				continue;
+			}
 
 			if (((cs_req & CS_REQ_TILER_OOM_MASK) ^
 			     (cs_ack & CS_ACK_TILER_OOM_MASK))) {
 				get_queue(queue);
-				KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, CSI_TILER_OOM_INTERRUPT, group, queue, cs_req ^ cs_ack);
-				if (WARN_ON(!queue_work(
-					    wq, &queue->oom_event_work))) {
+				KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, CSI_TILER_OOM_INTERRUPT, group, queue,
+							   cs_req ^ cs_ack);
+				if (WARN_ON(!queue_work(wq, &queue->oom_event_work))) {
 					/* The work item shall not have been
 					 * already queued, there can be only
 					 * one pending OoM event for a
@@ -2533,12 +2652,17 @@ static void process_cs_interrupts(struct kbase_queue_group *const group,
 
 			if ((cs_req & CS_REQ_PROTM_PEND_MASK) ^
 			    (cs_ack & CS_ACK_PROTM_PEND_MASK)) {
+				KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, CSI_PROTM_PEND_INTERRUPT, group, queue,
+							   cs_req ^ cs_ack);
+
 				dev_dbg(kbdev->dev,
 					"Protected mode entry request for queue on csi %d bound to group-%d on slot %d",
 					queue->csi_index, group->handle,
 					group->csg_nr);
 
 				bitmap_set(group->protm_pending_bitmap, i, 1);
+				KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, PROTM_PENDING_SET, group, queue,
+							   group->protm_pending_bitmap[0]);
 				protm_pend = true;
 			}
 		}
@@ -2567,7 +2691,7 @@ static void process_csg_interrupts(struct kbase_device *const kbdev,
 	int const csg_nr)
 {
 	struct kbase_csf_cmd_stream_group_info *ginfo;
-	struct kbase_queue_group *group;
+	struct kbase_queue_group *group = NULL;
 	u32 req, ack, irqreq, irqack;
 
 	kbase_csf_scheduler_spin_lock_assert_held(kbdev);
@@ -2575,6 +2699,8 @@ static void process_csg_interrupts(struct kbase_device *const kbdev,
 	if (WARN_ON(csg_nr >= kbdev->csf.global_iface.group_num))
 		return;
 
+	KBASE_KTRACE_ADD(kbdev, CSG_INTERRUPT_PROCESS, NULL, csg_nr);
+
 	ginfo = &kbdev->csf.global_iface.groups[csg_nr];
 	req = kbase_csf_firmware_csg_input_read(ginfo, CSG_REQ);
 	ack = kbase_csf_firmware_csg_output(ginfo, CSG_ACK);
@@ -2583,7 +2709,7 @@ static void process_csg_interrupts(struct kbase_device *const kbdev,
 
 	/* There may not be any pending CSG/CS interrupts to process */
 	if ((req == ack) && (irqreq == irqack))
-		return;
+		goto out;
 
 	/* Immediately set IRQ_ACK bits to be same as the IRQ_REQ bits before
 	 * examining the CS_ACK & CS_REQ bits. This would ensure that Host
@@ -2604,10 +2730,10 @@ static void process_csg_interrupts(struct kbase_device *const kbdev,
 	 * slot scheduler spinlock is required.
 	 */
 	if (!group)
-		return;
+		goto out;
 
 	if (WARN_ON(kbase_csf_scheduler_group_get_slot_locked(group) != csg_nr))
-		return;
+		goto out;
 
 	if ((req ^ ack) & CSG_REQ_SYNC_UPDATE_MASK) {
 		kbase_csf_firmware_csg_input_mask(ginfo,
@@ -2624,7 +2750,8 @@ static void process_csg_interrupts(struct kbase_device *const kbdev,
 			CSG_REQ_IDLE_MASK);
 
 		set_bit(csg_nr, scheduler->csg_slots_idle_mask);
-
+		KBASE_KTRACE_ADD_CSF_GRP(kbdev, CSG_SLOT_IDLE_SET, group,
+					 scheduler->csg_slots_idle_mask[0]);
 		KBASE_KTRACE_ADD_CSF_GRP(kbdev,  CSG_IDLE_INTERRUPT, group, req ^ ack);
 		dev_dbg(kbdev->dev, "Idle notification received for Group %u on slot %d\n",
 			 group->handle, csg_nr);
@@ -2640,6 +2767,8 @@ static void process_csg_interrupts(struct kbase_device *const kbdev,
 		kbase_csf_firmware_csg_input_mask(ginfo, CSG_REQ, ack,
 			CSG_REQ_PROGRESS_TIMER_EVENT_MASK);
 
+		KBASE_KTRACE_ADD_CSF_GRP(kbdev, CSG_PROGRESS_TIMER_INTERRUPT,
+					 group, req ^ ack);
 		dev_info(kbdev->dev,
 			"Timeout notification received for group %u of ctx %d_%d on slot %d\n",
 			group->handle, group->kctx->tgid, group->kctx->id, csg_nr);
@@ -2648,6 +2777,11 @@ static void process_csg_interrupts(struct kbase_device *const kbdev,
 	}
 
 	process_cs_interrupts(group, ginfo, irqreq, irqack);
+
+out:
+	/* group may still be NULL here */
+	KBASE_KTRACE_ADD_CSF_GRP(kbdev, CSG_INTERRUPT_PROCESS_END, group,
+				 ((u64)req ^ ack) | (((u64)irqreq ^ irqack) << 32));
 }
 
 /**
@@ -2741,6 +2875,7 @@ void kbase_csf_interrupt(struct kbase_device *kbdev, u32 val)
 
 	lockdep_assert_held(&kbdev->hwaccess_lock);
 
+	KBASE_KTRACE_ADD(kbdev, CSF_INTERRUPT, NULL, val);
 	kbase_reg_write(kbdev, JOB_CONTROL_REG(JOB_IRQ_CLEAR), val);
 
 	if (val & JOB_IRQ_GLOBAL_IF) {
@@ -2761,6 +2896,7 @@ void kbase_csf_interrupt(struct kbase_device *kbdev, u32 val)
 					global_iface, GLB_REQ);
 			glb_ack = kbase_csf_firmware_global_output(
 					global_iface, GLB_ACK);
+			KBASE_KTRACE_ADD(kbdev, GLB_REQ_ACQ, NULL, glb_req ^ glb_ack);
 
 			if ((glb_req ^ glb_ack) & GLB_REQ_PROTM_EXIT_MASK) {
 				dev_dbg(kbdev->dev, "Protected mode exit interrupt received");
@@ -2768,8 +2904,8 @@ void kbase_csf_interrupt(struct kbase_device *kbdev, u32 val)
 						global_iface, GLB_REQ, glb_ack,
 						GLB_REQ_PROTM_EXIT_MASK);
 				WARN_ON(!kbase_csf_scheduler_protected_mode_in_use(kbdev));
+				KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_EXIT_PROTM, scheduler->active_protm_grp, 0u);
 				scheduler->active_protm_grp = NULL;
-				KBASE_KTRACE_ADD(kbdev, SCHEDULER_EXIT_PROTM, NULL, 0u);
 				kbdev->protected_mode = false;
 				kbase_ipa_control_protm_exited(kbdev);
 				kbase_hwcnt_backend_csf_protm_exited(
@@ -2778,13 +2914,20 @@ void kbase_csf_interrupt(struct kbase_device *kbdev, u32 val)
 
 			/* Handle IDLE Hysteresis notification event */
 			if ((glb_req ^ glb_ack) & GLB_REQ_IDLE_EVENT_MASK) {
+				int non_idle_offslot_grps;
+				bool can_suspend_on_idle;
 				dev_dbg(kbdev->dev, "Idle-hysteresis event flagged");
 				kbase_csf_firmware_global_input_mask(
 						global_iface, GLB_REQ, glb_ack,
 						GLB_REQ_IDLE_EVENT_MASK);
 
-				if (!atomic_read(&scheduler->non_idle_offslot_grps)) {
-					if (kbase_pm_idle_groups_sched_suspendable(kbdev))
+				non_idle_offslot_grps = atomic_read(&scheduler->non_idle_offslot_grps);
+				can_suspend_on_idle = kbase_pm_idle_groups_sched_suspendable(kbdev);
+				KBASE_KTRACE_ADD(kbdev, SCHEDULER_CAN_IDLE, NULL,
+					((u64)(u32)non_idle_offslot_grps) | (((u64)can_suspend_on_idle) << 32));
+
+				if (!non_idle_offslot_grps) {
+					if (can_suspend_on_idle)
 						queue_work(system_highpri_wq,
 							   &scheduler->gpu_idle_work);
 				} else {
@@ -2809,6 +2952,7 @@ void kbase_csf_interrupt(struct kbase_device *kbdev, u32 val)
 
 		if (!remaining) {
 			wake_up_all(&kbdev->csf.event_wait);
+			KBASE_KTRACE_ADD(kbdev, CSF_INTERRUPT_END, NULL, val);
 			return;
 		}
 	}
@@ -2823,6 +2967,7 @@ void kbase_csf_interrupt(struct kbase_device *kbdev, u32 val)
 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
 
 	wake_up_all(&kbdev->csf.event_wait);
+	KBASE_KTRACE_ADD(kbdev, CSF_INTERRUPT_END, NULL, val);
 }
 
 void kbase_csf_doorbell_mapping_term(struct kbase_device *kbdev)
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf.h
index effd4686a444..e3bd436dd249 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
@@ -39,7 +39,7 @@
  */
 #define KBASEP_USER_DB_NR_INVALID ((s8)-1)
 
-#define FIRMWARE_PING_INTERVAL_MS (2000) /* 2 seconds */
+#define FIRMWARE_PING_INTERVAL_MS (4000) /* 4 seconds */
 
 #define FIRMWARE_IDLE_HYSTERESIS_TIME_MS (10) /* Default 10 milliseconds */
 
@@ -212,6 +212,22 @@ void kbase_csf_ctx_term(struct kbase_context *kctx);
 int kbase_csf_queue_register(struct kbase_context *kctx,
 			     struct kbase_ioctl_cs_queue_register *reg);
 
+/**
+ * kbase_csf_queue_register_ex - Register a GPU command queue with
+ *                               extended format.
+ *
+ * @kctx:	Pointer to the kbase context within which the
+ *		queue is to be registered.
+ * @reg:	Pointer to the structure which contains details of the
+ *		queue to be registered within the provided
+ *		context, together with the extended parameter fields
+ *              for supporting cs trace command.
+ *
+ * Return:	0 on success, or negative on failure.
+ */
+int kbase_csf_queue_register_ex(struct kbase_context *kctx,
+			     struct kbase_ioctl_cs_queue_register_ex *reg);
+
 /**
  * kbase_csf_queue_terminate - Terminate a GPU command queue.
  *
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_cpu_queue_debugfs.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_cpu_queue_debugfs.c
index b54b2fc31939..26637bf3fa73 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_cpu_queue_debugfs.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_cpu_queue_debugfs.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
@@ -23,7 +23,7 @@
 #include <mali_kbase.h>
 #include <linux/seq_file.h>
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 
 bool kbase_csf_cpu_queue_read_dump_req(struct kbase_context *kctx,
 					struct base_csf_notification *req)
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_cpu_queue_debugfs.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_cpu_queue_debugfs.h
index 36336497209e..435a993955fe 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_cpu_queue_debugfs.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_cpu_queue_debugfs.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
@@ -68,7 +68,7 @@ bool kbase_csf_cpu_queue_read_dump_req(struct kbase_context *kctx,
  */
 static inline bool kbase_csf_cpu_queue_dump_needed(struct kbase_context *kctx)
 {
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 	return (atomic_read(&kctx->csf.cpu_queue.dump_req_status) ==
 		BASE_CSF_CPU_QUEUE_DUMP_ISSUED);
 #else
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_csg_debugfs.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_csg_debugfs.c
index 389468307e5f..14deb989ef92 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_csg_debugfs.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_csg_debugfs.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -25,7 +25,7 @@
 #include <linux/delay.h>
 #include <csf/mali_kbase_csf_trace_buffer.h>
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 #include "mali_kbase_csf_tl_reader.h"
 
 /**
@@ -87,6 +87,32 @@ static void kbasep_csf_scheduler_dump_active_queue_cs_status_wait(
 			   blocked_reason)));
 }
 
+static void kbasep_csf_scheduler_dump_active_cs_trace(struct seq_file *file,
+			struct kbase_csf_cmd_stream_info const *const stream)
+{
+	u32 val = kbase_csf_firmware_cs_input_read(stream,
+			CS_INSTR_BUFFER_BASE_LO);
+	u64 addr = ((u64)kbase_csf_firmware_cs_input_read(stream,
+				CS_INSTR_BUFFER_BASE_HI) << 32) | val;
+	val = kbase_csf_firmware_cs_input_read(stream,
+				CS_INSTR_BUFFER_SIZE);
+
+	seq_printf(file, "CS_TRACE_BUF_ADDR: 0x%16llx, SIZE: %u\n", addr, val);
+
+	/* Write offset variable address (pointer) */
+	val = kbase_csf_firmware_cs_input_read(stream,
+			CS_INSTR_BUFFER_OFFSET_POINTER_LO);
+	addr = ((u64)kbase_csf_firmware_cs_input_read(stream,
+			CS_INSTR_BUFFER_OFFSET_POINTER_HI) << 32) | val;
+	seq_printf(file, "CS_TRACE_BUF_OFFSET_PTR: 0x%16llx\n", addr);
+
+	/* EVENT_SIZE and EVENT_STATEs */
+	val = kbase_csf_firmware_cs_input_read(stream, CS_INSTR_CONFIG);
+	seq_printf(file, "TRACE_EVENT_SIZE: 0x%x, TRACE_EVENT_STAES 0x%x\n",
+			CS_INSTR_CONFIG_EVENT_SIZE_GET(val),
+			CS_INSTR_CONFIG_EVENT_STATE_GET(val));
+}
+
 /**
  * kbasep_csf_scheduler_dump_active_queue() - Print GPU command queue
  *                                            debug information
@@ -134,7 +160,9 @@ static void kbasep_csf_scheduler_dump_active_queue(struct seq_file *file,
 			queue->csi_index, queue->base_addr, queue->priority,
 			cs_insert, cs_extract, cs_active, queue->doorbell_nr);
 
-	/* Print status information for blocked group waiting for sync object */
+	/* Print status information for blocked group waiting for sync object. For on-slot queues,
+	 * if cs_trace is enabled, dump the interface's cs_trace configuration.
+	 */
 	if (kbase_csf_scheduler_group_get_slot(queue->group) < 0) {
 		if (CS_STATUS_WAIT_SYNC_WAIT_GET(queue->status_wait)) {
 			wait_status = queue->status_wait;
@@ -212,6 +240,11 @@ static void kbasep_csf_scheduler_dump_active_queue(struct seq_file *file,
 			file, wait_status, wait_sync_value,
 			wait_sync_live_value, wait_sync_pointer, sb_status,
 			blocked_reason);
+		/* Dealing with cs_trace */
+		if (kbase_csf_scheduler_queue_has_trace(queue))
+			kbasep_csf_scheduler_dump_active_cs_trace(file, stream);
+		else
+			seq_puts(file, "NO CS_TRACE\n");
 	}
 
 	seq_puts(file, "\n");
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_csg_debugfs.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_csg_debugfs.h
index c6a86b6d814b..397e657d2cb6 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_csg_debugfs.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_csg_debugfs.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_defs.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_defs.h
index 05173990c6d8..53526cee1d78 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_defs.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_defs.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
@@ -314,6 +314,10 @@ struct kbase_csf_notification {
  *                  are non-zero
  * @blocked_reason: Value shows if the queue is blocked, and if so,
  *                  the reason why it is blocked
+ * @trace_buffer_base: CS trace buffer base address.
+ * @trace_offset_ptr:  Pointer to the CS trace buffer offset variable.
+ * @trace_buffer_size: CS trace buffer size for the queue.
+ * @trace_cfg:         CS trace configuration parameters.
  * @error:          GPU command queue fatal information to pass to user space.
  * @fatal_event_work: Work item to handle the CS fatal event reported for this
  *                    queue.
@@ -344,6 +348,10 @@ struct kbase_queue {
 	u32 sync_value;
 	u32 sb_status;
 	u32 blocked_reason;
+	u64 trace_buffer_base;
+	u64 trace_offset_ptr;
+	u32 trace_buffer_size;
+	u32 trace_cfg;
 	struct kbase_csf_notification error;
 	struct work_struct fatal_event_work;
 	u64 cs_fatal_info;
@@ -667,7 +675,7 @@ struct kbase_csf_context {
 	struct vm_area_struct *user_reg_vma;
 	struct kbase_csf_scheduler_context sched;
 	struct list_head error_list;
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 	struct kbase_csf_cpu_queue_context cpu_queue;
 #endif
 };
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware.c
index 89585bfc9716..b51c0ff53278 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
@@ -993,7 +993,12 @@ static int parse_capabilities(struct kbase_device *kbdev)
 
 	iface->group_stride = shared_info[GLB_GROUP_STRIDE/4];
 	iface->prfcnt_size = shared_info[GLB_PRFCNT_SIZE/4];
-	iface->instr_features = shared_info[GLB_INSTR_FEATURES / 4];
+
+	if (iface->version >= kbase_csf_interface_version(1, 1, 0)) {
+		iface->instr_features = shared_info[GLB_INSTR_FEATURES / 4];
+	} else {
+		iface->instr_features = 0;
+	}
 
 	if ((GROUP_CONTROL_0 +
 		(unsigned long)iface->group_num * iface->group_stride) >
@@ -1671,6 +1676,25 @@ u32 kbase_csf_firmware_set_mcu_core_pwroff_time(struct kbase_device *kbdev, u32
 }
 
 
+int kbase_csf_firmware_early_init(struct kbase_device *kbdev)
+{
+	init_waitqueue_head(&kbdev->csf.event_wait);
+	kbdev->csf.interrupt_received = false;
+	kbdev->csf.fw_timeout_ms = CSF_FIRMWARE_TIMEOUT_MS;
+
+	INIT_LIST_HEAD(&kbdev->csf.firmware_interfaces);
+	INIT_LIST_HEAD(&kbdev->csf.firmware_config);
+	INIT_LIST_HEAD(&kbdev->csf.firmware_timeline_metadata);
+	INIT_LIST_HEAD(&kbdev->csf.firmware_trace_buffers.list);
+	INIT_WORK(&kbdev->csf.firmware_reload_work,
+		  kbase_csf_firmware_reload_worker);
+	INIT_WORK(&kbdev->csf.fw_error_work, firmware_error_worker);
+
+	mutex_init(&kbdev->csf.reg_lock);
+
+	return 0;
+}
+
 int kbase_csf_firmware_init(struct kbase_device *kbdev)
 {
 	const struct firmware *firmware;
@@ -1681,6 +1705,8 @@ int kbase_csf_firmware_init(struct kbase_device *kbdev)
 	u32 entry_offset;
 	int ret;
 
+	lockdep_assert_held(&kbdev->fw_load_lock);
+
 	if (WARN_ON((kbdev->as_free & MCU_AS_BITMASK) == 0))
 		return -EINVAL;
 	kbdev->as_free &= ~MCU_AS_BITMASK;
@@ -1694,31 +1720,18 @@ int kbase_csf_firmware_init(struct kbase_device *kbdev)
 		return ret;
 	}
 
-	init_waitqueue_head(&kbdev->csf.event_wait);
-	kbdev->csf.interrupt_received = false;
-	kbdev->csf.fw_timeout_ms = CSF_FIRMWARE_TIMEOUT_MS;
-
-	INIT_LIST_HEAD(&kbdev->csf.firmware_interfaces);
-	INIT_LIST_HEAD(&kbdev->csf.firmware_config);
-	INIT_LIST_HEAD(&kbdev->csf.firmware_timeline_metadata);
-	INIT_LIST_HEAD(&kbdev->csf.firmware_trace_buffers.list);
-	INIT_WORK(&kbdev->csf.firmware_reload_work,
-		  kbase_csf_firmware_reload_worker);
-	INIT_WORK(&kbdev->csf.fw_error_work, firmware_error_worker);
-
-	mutex_init(&kbdev->csf.reg_lock);
-
 	kbdev->csf.gpu_idle_hysteresis_ms = FIRMWARE_IDLE_HYSTERESIS_TIME_MS;
-	kbdev->csf.gpu_idle_dur_count = convert_dur_to_idle_count(kbdev,
-						FIRMWARE_IDLE_HYSTERESIS_TIME_MS);
+	kbdev->csf.gpu_idle_dur_count = convert_dur_to_idle_count(
+		kbdev, FIRMWARE_IDLE_HYSTERESIS_TIME_MS);
 
 	kbdev->csf.mcu_core_pwroff_dur_us = DEFAULT_GLB_PWROFF_TIMEOUT_US;
-	kbdev->csf.mcu_core_pwroff_dur_count =
-		convert_dur_to_core_pwroff_count(kbdev, DEFAULT_GLB_PWROFF_TIMEOUT_US);
+	kbdev->csf.mcu_core_pwroff_dur_count = convert_dur_to_core_pwroff_count(
+		kbdev, DEFAULT_GLB_PWROFF_TIMEOUT_US);
 
 	ret = kbase_mcu_shared_interface_region_tracker_init(kbdev);
 	if (ret != 0) {
-		dev_err(kbdev->dev, "Failed to setup the rb tree for managing shared interface segment\n");
+		dev_err(kbdev->dev,
+			"Failed to setup the rb tree for managing shared interface segment\n");
 		goto error;
 	}
 
@@ -2081,7 +2094,7 @@ int kbase_csf_trigger_firmware_config_update(struct kbase_device *kbdev)
 	int err = 0;
 
 	/* Ensure GPU is powered-up until we complete config update.*/
-	kbase_pm_context_active(kbdev);
+	kbase_csf_scheduler_pm_active(kbdev);
 
 	/* The 'reg_lock' is also taken and is held till the update is
 	 * complete, to ensure the config update gets serialized.
@@ -2098,7 +2111,7 @@ int kbase_csf_trigger_firmware_config_update(struct kbase_device *kbdev)
 				      GLB_REQ_FIRMWARE_CONFIG_UPDATE_MASK);
 	mutex_unlock(&kbdev->csf.reg_lock);
 
-	kbase_pm_context_idle(kbdev);
+	kbase_csf_scheduler_pm_idle(kbdev);
 	return err;
 }
 
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware.h
index 768d42339caf..6a78ff23bc8e 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
@@ -79,7 +79,7 @@
 #define MAX_SUPPORTED_STREAMS_PER_GROUP 32
 
 /* Waiting timeout for status change acknowledgment, in milliseconds */
-#define CSF_FIRMWARE_TIMEOUT_MS (800) /* Relaxed to 800ms from 100ms */
+#define CSF_FIRMWARE_TIMEOUT_MS (3000) /* Relaxed to 3000ms from 800ms due to Android */
 
 struct kbase_device;
 
@@ -266,7 +266,7 @@ u32 kbase_csf_firmware_csg_output(
  * @group_stride: Stride in bytes in JASID0 virtual address between
  *                CSG capability structures.
  * @prfcnt_size: Performance counters size.
- * @instr_features: Instrumentation features.
+ * @instr_features: Instrumentation features. (csf >= 1.1.0)
  * @groups: Address of an array of CSG capability structures.
  */
 struct kbase_csf_global_iface {
@@ -376,23 +376,31 @@ void kbase_csf_read_firmware_memory(struct kbase_device *kbdev,
 void kbase_csf_update_firmware_memory(struct kbase_device *kbdev,
 	u32 gpu_addr, u32 value);
 
+/**
+ * kbase_csf_firmware_early_init() - Early initializatin for the firmware.
+ * @kbdev: Kbase device
+ *
+ * Initialize resources related to the firmware. Must be called at kbase probe.
+ *
+ * Return: 0 if successful, negative error code on failure
+ */
+int kbase_csf_firmware_early_init(struct kbase_device *kbdev);
+
 /**
  * kbase_csf_firmware_init() - Load the firmware for the CSF MCU
+ * @kbdev: Kbase device
  *
  * Request the firmware from user space and load it into memory.
  *
  * Return: 0 if successful, negative error code on failure
- *
- * @kbdev: Kbase device
  */
 int kbase_csf_firmware_init(struct kbase_device *kbdev);
 
 /**
  * kbase_csf_firmware_term() - Unload the firmware
+ * @kbdev: Kbase device
  *
  * Frees the memory allocated by kbase_csf_firmware_init()
- *
- * @kbdev: Kbase device
  */
 void kbase_csf_firmware_term(struct kbase_device *kbdev);
 
@@ -443,12 +451,8 @@ void kbase_csf_enter_protected_mode(struct kbase_device *kbdev);
 
 static inline bool kbase_csf_firmware_mcu_halted(struct kbase_device *kbdev)
 {
-#ifndef CONFIG_MALI_BIFROST_NO_MALI
 	return (kbase_reg_read(kbdev, GPU_CONTROL_REG(MCU_STATUS)) ==
 		MCU_STATUS_HALTED);
-#else
-	return true;
-#endif
 }
 
 /**
@@ -584,6 +588,7 @@ bool kbase_csf_firmware_core_attr_updated(struct kbase_device *kbdev);
  *                         hardware performance counter data.
  * @instr_features:        Instrumentation features. Bits 7:4 hold the max size
  *                         of events. Bits 3:0 hold the offset update rate.
+ *                         (csf >= 1,1,0)
  */
 u32 kbase_csf_firmware_get_glb_iface(
 	struct kbase_device *kbdev, struct basep_cs_group_control *group_data,
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_cfg.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_cfg.c
index 10bc4197f83a..f00acb1d106a 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_cfg.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_cfg.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_cfg.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_cfg.h
index 36883abad2eb..080c154cab61 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_cfg.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_cfg.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_no_mali.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_no_mali.c
index 311e3bba6f43..48864cca6b99 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_no_mali.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_no_mali.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
@@ -158,7 +158,7 @@ static int invent_memory_setup_entry(struct kbase_device *kbdev)
 
 	/* Allocate enough memory for the struct dummy_firmware_interface.
 	 */
-	interface = kmalloc(sizeof(*interface), GFP_KERNEL);
+	interface = kzalloc(sizeof(*interface), GFP_KERNEL);
 	if (!interface)
 		return -ENOMEM;
 
@@ -237,8 +237,13 @@ static int invent_capabilities(struct kbase_device *kbdev)
 	iface->kbdev = kbdev;
 	iface->features = 0;
 	iface->prfcnt_size = 64;
-	iface->instr_features =
-		0x81; /* update rate=1, max event size = 1<<8 = 256 */
+
+	if (iface->version >= kbase_csf_interface_version(1, 1, 0)) {
+		/* update rate=1, max event size = 1<<8 = 256 */
+		iface->instr_features = 0x81;
+	} else {
+		iface->instr_features = 0;
+	}
 
 	iface->group_num = ARRAY_SIZE(interface->csg);
 	iface->group_stride = 0;
@@ -375,6 +380,37 @@ u32 kbase_csf_firmware_csg_output(
 	return val;
 }
 
+static void
+csf_firmware_prfcnt_process(const struct kbase_csf_global_iface *const iface,
+			    const u32 glb_req)
+{
+	struct kbase_device *kbdev = iface->kbdev;
+	u32 glb_ack = output_page_read(iface->output, GLB_ACK);
+	/* If the value of GLB_REQ.PRFCNT_SAMPLE is different from the value of
+	 * GLB_ACK.PRFCNT_SAMPLE, the CSF will sample the performance counters.
+	 */
+	if ((glb_req ^ glb_ack) & GLB_REQ_PRFCNT_SAMPLE_MASK) {
+		/* NO_MALI only uses the first buffer in the ring buffer. */
+		input_page_write(iface->input, GLB_PRFCNT_EXTRACT, 0);
+		output_page_write(iface->output, GLB_PRFCNT_INSERT, 1);
+		kbase_reg_write(kbdev, GPU_COMMAND, GPU_COMMAND_PRFCNT_SAMPLE);
+	}
+
+	/* Propagate enable masks to model if request to enable. */
+	if (glb_req & GLB_REQ_PRFCNT_ENABLE_MASK) {
+		u32 tiler_en, l2_en, sc_en;
+
+		tiler_en = input_page_read(iface->input, GLB_PRFCNT_TILER_EN);
+		l2_en = input_page_read(iface->input, GLB_PRFCNT_MMU_L2_EN);
+		sc_en = input_page_read(iface->input, GLB_PRFCNT_SHADER_EN);
+
+		/* NO_MALI platform enabled all CSHW counters by default. */
+		kbase_reg_write(kbdev, PRFCNT_TILER_EN, tiler_en);
+		kbase_reg_write(kbdev, PRFCNT_MMU_L2_EN, l2_en);
+		kbase_reg_write(kbdev, PRFCNT_SHADER_EN, sc_en);
+	}
+}
+
 void kbase_csf_firmware_global_input(
 	const struct kbase_csf_global_iface *const iface, const u32 offset,
 	const u32 value)
@@ -385,6 +421,7 @@ void kbase_csf_firmware_global_input(
 	input_page_write(iface->input, offset, value);
 
 	if (offset == GLB_REQ) {
+		csf_firmware_prfcnt_process(iface, value);
 		/* NO_MALI: Immediately acknowledge requests */
 		output_page_write(iface->output, GLB_ACK, value);
 	}
@@ -854,10 +891,30 @@ u32 kbase_csf_firmware_set_mcu_core_pwroff_time(struct kbase_device *kbdev, u32
 	return pwroff;
 }
 
+int kbase_csf_firmware_early_init(struct kbase_device *kbdev)
+{
+	init_waitqueue_head(&kbdev->csf.event_wait);
+	kbdev->csf.interrupt_received = false;
+	kbdev->csf.fw_timeout_ms = CSF_FIRMWARE_TIMEOUT_MS;
+
+	INIT_LIST_HEAD(&kbdev->csf.firmware_interfaces);
+	INIT_LIST_HEAD(&kbdev->csf.firmware_config);
+	INIT_LIST_HEAD(&kbdev->csf.firmware_trace_buffers.list);
+	INIT_WORK(&kbdev->csf.firmware_reload_work,
+		  kbase_csf_firmware_reload_worker);
+	INIT_WORK(&kbdev->csf.fw_error_work, firmware_error_worker);
+
+	mutex_init(&kbdev->csf.reg_lock);
+
+	return 0;
+}
+
 int kbase_csf_firmware_init(struct kbase_device *kbdev)
 {
 	int ret;
 
+	lockdep_assert_held(&kbdev->fw_load_lock);
+
 	if (WARN_ON((kbdev->as_free & MCU_AS_BITMASK) == 0))
 		return -EINVAL;
 	kbdev->as_free &= ~MCU_AS_BITMASK;
@@ -871,26 +928,14 @@ int kbase_csf_firmware_init(struct kbase_device *kbdev)
 		return ret;
 	}
 
-	init_waitqueue_head(&kbdev->csf.event_wait);
-	kbdev->csf.interrupt_received = false;
-	kbdev->csf.fw_timeout_ms = CSF_FIRMWARE_TIMEOUT_MS;
-
-	INIT_LIST_HEAD(&kbdev->csf.firmware_interfaces);
-	INIT_LIST_HEAD(&kbdev->csf.firmware_config);
-	INIT_LIST_HEAD(&kbdev->csf.firmware_trace_buffers.list);
-	INIT_WORK(&kbdev->csf.firmware_reload_work,
-		  kbase_csf_firmware_reload_worker);
-	INIT_WORK(&kbdev->csf.fw_error_work, firmware_error_worker);
-
-	mutex_init(&kbdev->csf.reg_lock);
-
 	kbdev->csf.gpu_idle_hysteresis_ms = FIRMWARE_IDLE_HYSTERESIS_TIME_MS;
-	kbdev->csf.gpu_idle_dur_count = convert_dur_to_idle_count(kbdev,
-						FIRMWARE_IDLE_HYSTERESIS_TIME_MS);
+	kbdev->csf.gpu_idle_dur_count = convert_dur_to_idle_count(
+		kbdev, FIRMWARE_IDLE_HYSTERESIS_TIME_MS);
 
 	ret = kbase_mcu_shared_interface_region_tracker_init(kbdev);
 	if (ret != 0) {
-		dev_err(kbdev->dev, "Failed to setup the rb tree for managing shared interface segment\n");
+		dev_err(kbdev->dev,
+			"Failed to setup the rb tree for managing shared interface segment\n");
 		goto error;
 	}
 
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_heap_context_alloc.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_heap_context_alloc.c
index 6c6d181d27e1..96746c647665 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_heap_context_alloc.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_heap_context_alloc.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_heap_context_alloc.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_heap_context_alloc.h
index a39ee92cad24..993db6347cb1 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_heap_context_alloc.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_heap_context_alloc.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu.c
index 1203d2c40807..4e26a496305e 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
@@ -26,7 +26,7 @@
 #include "mali_kbase_csf.h"
 #include <linux/export.h>
 
-#ifdef CONFIG_SYNC_FILE
+#if IS_ENABLED(CONFIG_SYNC_FILE)
 #include "mali_kbase_fence.h"
 #include "mali_kbase_sync.h"
 
@@ -758,9 +758,7 @@ static int kbase_kcpu_cqs_wait_process(struct kbase_device *kbdev,
 
 				KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_CQS_WAIT_END(
 					kbdev, queue,
-					queue->has_error ?
-						evt[BASEP_EVENT_ERR_INDEX] :
-						0);
+					evt[BASEP_EVENT_ERR_INDEX]);
 				queue->command_started = false;
 			}
 
@@ -1170,7 +1168,7 @@ static int kbase_kcpu_cqs_set_operation_prepare(
 	return 0;
 }
 
-#ifdef CONFIG_SYNC_FILE
+#if IS_ENABLED(CONFIG_SYNC_FILE)
 #if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 static void kbase_csf_fence_wait_callback(struct fence *fence,
 			struct fence_cb *cb)
@@ -1549,7 +1547,7 @@ static void kcpu_queue_process(struct kbase_kcpu_command_queue *queue,
 			}
 
 			status = 0;
-#ifdef CONFIG_SYNC_FILE
+#if IS_ENABLED(CONFIG_SYNC_FILE)
 			if (ignore_waits) {
 				kbase_kcpu_fence_wait_cancel(queue,
 					&cmd->info.fence);
@@ -1582,7 +1580,7 @@ static void kcpu_queue_process(struct kbase_kcpu_command_queue *queue,
 
 			status = 0;
 
-#ifdef CONFIG_SYNC_FILE
+#if IS_ENABLED(CONFIG_SYNC_FILE)
 			status = kbase_kcpu_fence_signal_process(
 				queue, &cmd->info.fence);
 
@@ -2021,7 +2019,7 @@ int kbase_csf_kcpu_queue_enqueue(struct kbase_context *kctx,
 		kcpu_cmd->enqueue_ts = kctx->csf.kcpu_queues.num_cmds;
 		switch (command.type) {
 		case BASE_KCPU_COMMAND_TYPE_FENCE_WAIT:
-#ifdef CONFIG_SYNC_FILE
+#if IS_ENABLED(CONFIG_SYNC_FILE)
 			ret = kbase_kcpu_fence_wait_prepare(queue,
 						&command.info.fence, kcpu_cmd);
 #else
@@ -2030,7 +2028,7 @@ int kbase_csf_kcpu_queue_enqueue(struct kbase_context *kctx,
 #endif
 			break;
 		case BASE_KCPU_COMMAND_TYPE_FENCE_SIGNAL:
-#ifdef CONFIG_SYNC_FILE
+#if IS_ENABLED(CONFIG_SYNC_FILE)
 			ret = kbase_kcpu_fence_signal_prepare(queue,
 						&command.info.fence, kcpu_cmd);
 #else
@@ -2231,7 +2229,7 @@ int kbase_csf_kcpu_queue_new(struct kbase_context *kctx,
 	queue->kctx = kctx;
 	queue->start_offset = 0;
 	queue->num_pending_cmds = 0;
-#ifdef CONFIG_SYNC_FILE
+#if IS_ENABLED(CONFIG_SYNC_FILE)
 	queue->fence_context = dma_fence_context_alloc(1);
 	queue->fence_seqno = 0;
 	queue->fence_wait_processed = false;
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu.h
index 86aa7dcc452e..2f6da552fdaf 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu_debugfs.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu_debugfs.c
index d59e77c2b98e..0a2cde02fe1c 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu_debugfs.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu_debugfs.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -23,11 +23,11 @@
 #include <mali_kbase.h>
 #include <linux/seq_file.h>
 
-#ifdef CONFIG_SYNC_FILE
+#if IS_ENABLED(CONFIG_SYNC_FILE)
 #include "mali_kbase_sync.h"
 #endif
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 
 /**
  * kbasep_csf_kcpu_debugfs_print_queue() - Print additional info for KCPU
@@ -89,7 +89,7 @@ static void kbasep_csf_kcpu_debugfs_print_queue(struct seq_file *file,
 		struct kbase_kcpu_command *cmd =
 				&queue->commands[queue->start_offset];
 		switch (cmd->type) {
-#ifdef CONFIG_SYNC_FILE
+#if IS_ENABLED(CONFIG_SYNC_FILE)
 		case BASE_KCPU_COMMAND_TYPE_FENCE_WAIT:
 		{
 			struct kbase_sync_fence_info info;
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu_debugfs.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu_debugfs.h
index 58b8e34ead92..08f2fda034a2 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu_debugfs.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu_debugfs.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_protected_memory.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_protected_memory.c
index 09e72711d3cb..599748346f1f 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_protected_memory.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_protected_memory.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -22,7 +22,7 @@
 #include "mali_kbase_csf_protected_memory.h"
 #include <linux/protected_memory_allocator.h>
 
-#ifdef CONFIG_OF
+#if IS_ENABLED(CONFIG_OF)
 #include <linux/of_platform.h>
 #endif
 
@@ -30,7 +30,7 @@ int kbase_csf_protected_memory_init(struct kbase_device *const kbdev)
 {
 	int err = 0;
 
-#if CONFIG_OF
+#if IS_ENABLED(CONFIG_OF)
 	struct device_node *pma_node = of_parse_phandle(kbdev->dev->of_node,
 					"protected-memory-allocator", 0);
 	if (!pma_node) {
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_protected_memory.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_protected_memory.h
index 95f507f52d78..4c0609ee40e1 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_protected_memory.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_protected_memory.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_reset_gpu.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_reset_gpu.c
index e8da0f3cccda..f6d61d7fd25d 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_reset_gpu.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_reset_gpu.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_scheduler.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_scheduler.c
index f7a20d5f6678..c165c0efe57a 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_scheduler.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_scheduler.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
@@ -25,8 +25,8 @@
 #include <mali_kbase_reset_gpu.h>
 #include <mali_kbase_as_fault_debugfs.h>
 #include "mali_kbase_csf.h"
-#include "../tl/mali_kbase_tracepoints.h"
-#include "backend/gpu/mali_kbase_pm_internal.h"
+#include <tl/mali_kbase_tracepoints.h>
+#include <backend/gpu/mali_kbase_pm_internal.h>
 #include <linux/export.h>
 #include <uapi/gpu/arm/bifrost/csf/mali_gpu_csf_registers.h>
 #include <uapi/gpu/arm/bifrost/mali_base_kernel.h>
@@ -307,7 +307,7 @@ static u32 get_nr_active_csgs(struct kbase_device *kbdev)
  *
  * Return: the interface is actively engaged flag.
  */
-bool csgs_active(struct kbase_device *kbdev)
+static bool csgs_active(struct kbase_device *kbdev)
 {
 	u32 nr_active_csgs;
 
@@ -388,11 +388,17 @@ static void scheduler_wait_protm_quit(struct kbase_device *kbdev)
 
 	lockdep_assert_held(&scheduler->lock);
 
+	KBASE_KTRACE_ADD(kbdev, SCHEDULER_WAIT_PROTM_QUIT, NULL,
+			 jiffies_to_msecs(wt));
+
 	remaining = wait_event_timeout(kbdev->csf.event_wait,
 			!kbase_csf_scheduler_protected_mode_in_use(kbdev), wt);
 
 	if (!remaining)
 		dev_warn(kbdev->dev, "Timeout, protm_quit wait skipped");
+
+	KBASE_KTRACE_ADD(kbdev, SCHEDULER_WAIT_PROTM_QUIT_DONE, NULL,
+			 jiffies_to_msecs(remaining));
 }
 
 /**
@@ -514,7 +520,7 @@ static void scheduler_suspend(struct kbase_device *kbdev)
  * This function is called to change the state of queue group to non-idle
  * suspended state, if the group was suspended when all the queues bound to it
  * became empty or when some queues got blocked on a sync wait & others became
- * empty. The group is also moved to the runnbale list from idle wait list in
+ * empty. The group is also moved to the runnable list from idle wait list in
  * the latter case.
  * So the function gets called when a queue is kicked or sync wait condition
  * gets satisfied.
@@ -523,6 +529,7 @@ static void update_idle_suspended_group_state(struct kbase_queue_group *group)
 {
 	struct kbase_csf_scheduler *scheduler =
 		&group->kctx->kbdev->csf.scheduler;
+	int new_val;
 
 	lockdep_assert_held(&scheduler->lock);
 
@@ -543,7 +550,9 @@ static void update_idle_suspended_group_state(struct kbase_queue_group *group)
 	} else
 		return;
 
-	atomic_inc(&scheduler->non_idle_offslot_grps);
+	new_val = atomic_inc_return(&scheduler->non_idle_offslot_grps);
+	KBASE_KTRACE_ADD_CSF_GRP(group->kctx->kbdev, SCHEDULER_NONIDLE_OFFSLOT_INC,
+				group, new_val);
 }
 
 int kbase_csf_scheduler_group_get_slot_locked(struct kbase_queue_group *group)
@@ -898,16 +907,8 @@ int kbase_csf_scheduler_queue_stop(struct kbase_queue *queue)
 
 static void update_hw_active(struct kbase_queue *queue, bool active)
 {
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-	if (queue && queue->enabled) {
-		u32 *output_addr = (u32 *)(queue->user_io_addr + PAGE_SIZE);
-
-		output_addr[CS_ACTIVE / sizeof(u32)] = active;
-	}
-#else
 	CSTD_UNUSED(queue);
 	CSTD_UNUSED(active);
-#endif
 }
 
 static void program_cs_extract_init(struct kbase_queue *queue)
@@ -919,6 +920,50 @@ static void program_cs_extract_init(struct kbase_queue *queue)
 			output_addr[CS_EXTRACT_LO / sizeof(u64)];
 }
 
+static void program_cs_trace_cfg(struct kbase_csf_cmd_stream_info *stream,
+				 struct kbase_queue *queue)
+{
+	struct kbase_device *kbdev = queue->kctx->kbdev;
+	u32 const glb_version = kbdev->csf.global_iface.version;
+
+	lockdep_assert_held(&kbdev->csf.scheduler.lock);
+
+	/* If cs_trace_command not supported, nothing to program */
+	if (glb_version < kbase_csf_interface_version(1, 1, 0))
+		return;
+
+	/* Program for cs_trace if enabled. In the current arrangement, it is
+	 * possible for the context to enable the cs_trace after some queues
+	 * has been registered in cs_trace in disabled state. This is tracked by
+	 * the queue's trace buffer base address, which had been validated at the
+	 * queue's register_ex call.
+	 */
+	if (kbase_csf_scheduler_queue_has_trace(queue)) {
+		u32 cs_cfg = CS_INSTR_CONFIG_JASID_SET(
+			queue->trace_cfg, queue->kctx->as_nr);
+
+		kbase_csf_firmware_cs_input(stream, CS_INSTR_CONFIG, cs_cfg);
+		kbase_csf_firmware_cs_input(stream, CS_INSTR_BUFFER_SIZE,
+				queue->trace_buffer_size);
+
+		kbase_csf_firmware_cs_input(stream, CS_INSTR_BUFFER_BASE_LO,
+				queue->trace_buffer_base & U32_MAX);
+		kbase_csf_firmware_cs_input(stream, CS_INSTR_BUFFER_BASE_HI,
+				queue->trace_buffer_base >> 32);
+
+		kbase_csf_firmware_cs_input(
+				stream, CS_INSTR_BUFFER_OFFSET_POINTER_LO,
+				queue->trace_offset_ptr & U32_MAX);
+		kbase_csf_firmware_cs_input(
+				stream, CS_INSTR_BUFFER_OFFSET_POINTER_HI,
+				queue->trace_offset_ptr >> 32);
+	} else {
+		/* Place the configuration to the disabled condition */
+		kbase_csf_firmware_cs_input(stream, CS_INSTR_CONFIG, 0);
+		kbase_csf_firmware_cs_input(stream, CS_INSTR_BUFFER_SIZE, 0);
+	}
+}
+
 static void program_cs(struct kbase_device *kbdev,
 		struct kbase_queue *queue, bool ring_csg_doorbell)
 {
@@ -976,6 +1021,9 @@ static void program_cs(struct kbase_device *kbdev,
 	kbase_csf_firmware_cs_input(stream, CS_CONFIG,
 		(queue->doorbell_nr << 8) | (queue->priority & 0xF));
 
+	/* Program the queue's cs_trace configuration */
+	program_cs_trace_cfg(stream, queue);
+
 	/* Enable all interrupts for now */
 	kbase_csf_firmware_cs_input(stream, CS_ACK_IRQ_MASK, ~((u32)0));
 
@@ -1016,7 +1064,10 @@ int kbase_csf_scheduler_queue_start(struct kbase_queue *queue)
 
 	mutex_lock(&kbdev->csf.scheduler.lock);
 
-	KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, QUEUE_START, group, queue, group->run_state);
+	KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, QUEUE_START, group, queue,
+				   group->run_state);
+	KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, QUEUE_SYNC_STATUS_WAIT, queue->group,
+				   queue, queue->status_wait);
 
 	if (group->run_state == KBASE_CSF_GROUP_FAULT_EVICTED) {
 		err = -EIO;
@@ -1228,19 +1279,27 @@ static bool evaluate_sync_update(struct kbase_queue *queue)
 	bool updated = false;
 	u32 *sync_ptr;
 	u32 sync_wait_cond;
+	u32 sync_current_val;
+	struct kbase_device *kbdev;
 
 	if (WARN_ON(!queue))
 		return false;
 
-	lockdep_assert_held(&queue->kctx->kbdev->csf.scheduler.lock);
+	kbdev = queue->kctx->kbdev;
+	lockdep_assert_held(&kbdev->csf.scheduler.lock);
 
 	sync_ptr = kbase_phy_alloc_mapping_get(queue->kctx, queue->sync_ptr,
 					&mapping);
 
+	KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, QUEUE_SYNC_UPDATE, queue->group,
+				   queue, queue->sync_ptr);
+	KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, QUEUE_SYNC_BLOCKED_REASON,
+				   queue->group, queue, queue->blocked_reason);
+
 	if (!sync_ptr) {
 		dev_dbg(queue->kctx->kbdev->dev, "sync memory VA 0x%016llX already freed",
 			queue->sync_ptr);
-		return false;
+		goto out;
 	}
 
 	sync_wait_cond =
@@ -1249,21 +1308,30 @@ static bool evaluate_sync_update(struct kbase_queue *queue)
 	WARN_ON((sync_wait_cond != CS_STATUS_WAIT_SYNC_WAIT_CONDITION_GT) &&
 		(sync_wait_cond != CS_STATUS_WAIT_SYNC_WAIT_CONDITION_LE));
 
+	sync_current_val = READ_ONCE(*sync_ptr);
+	KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, QUEUE_SYNC_CURRENT_VAL, queue->group,
+				   queue, sync_current_val);
+
+	KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, QUEUE_SYNC_TEST_VAL, queue->group,
+				   queue, queue->sync_value);
+
 	if (((sync_wait_cond == CS_STATUS_WAIT_SYNC_WAIT_CONDITION_GT) &&
-	     (*sync_ptr > queue->sync_value)) ||
+	     (sync_current_val > queue->sync_value)) ||
 	    ((sync_wait_cond == CS_STATUS_WAIT_SYNC_WAIT_CONDITION_LE) &&
-	     (*sync_ptr <= queue->sync_value))) {
+	     (sync_current_val <= queue->sync_value))) {
 		/* The sync wait condition is satisfied so the group to which
 		 * queue is bound can be re-scheduled.
 		 */
 		updated = true;
 	} else {
-		dev_dbg(queue->kctx->kbdev->dev, "sync memory not updated yet(%u)",
-			*sync_ptr);
+		dev_dbg(queue->kctx->kbdev->dev,
+			"sync memory not updated yet(%u)", sync_current_val);
 	}
 
 	kbase_phy_alloc_mapping_put(queue->kctx, mapping);
-
+out:
+	KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, QUEUE_SYNC_UPDATE_EVALUATED,
+				   queue->group, queue, updated);
 	return updated;
 }
 
@@ -1290,6 +1358,9 @@ bool save_slot_cs(struct kbase_csf_cmd_stream_group_info const *const ginfo,
 	u32 status = kbase_csf_firmware_cs_output(stream, CS_STATUS_WAIT);
 	bool is_waiting = false;
 
+	KBASE_KTRACE_ADD_CSF_GRP_Q(stream->kbdev, QUEUE_SYNC_STATUS_WAIT,
+				   queue->group, queue, status);
+
 	if (CS_STATUS_WAIT_SYNC_WAIT_GET(status)) {
 		queue->status_wait = status;
 		queue->sync_ptr = kbase_csf_firmware_cs_output(stream,
@@ -1408,11 +1479,15 @@ void insert_group_to_runnable(struct kbase_csf_scheduler *const scheduler,
 	list_add_tail(&group->link,
 			&kctx->csf.sched.runnable_groups[group->priority]);
 	kctx->csf.sched.num_runnable_grps++;
+	KBASE_KTRACE_ADD_CSF_GRP(kbdev, GROUP_INSERT_RUNNABLE, group,
+				 kctx->csf.sched.num_runnable_grps);
+
 	/* Add the kctx if not yet in runnable kctxs */
 	if (kctx->csf.sched.num_runnable_grps == 1) {
 		/* First runnable csg, adds to the runnable_kctxs */
 		INIT_LIST_HEAD(&kctx->csf.link);
 		list_add_tail(&kctx->csf.link, &scheduler->runnable_kctxs);
+		KBASE_KTRACE_ADD(kbdev, SCHEDULER_INSERT_RUNNABLE, kctx, 0u);
 	}
 
 	scheduler->total_runnable_grps++;
@@ -1438,6 +1513,9 @@ void remove_group_from_runnable(struct kbase_csf_scheduler *const scheduler,
 		enum kbase_csf_group_state run_state)
 {
 	struct kbase_context *kctx = group->kctx;
+	struct kbase_queue_group *new_head_grp;
+	struct list_head *list =
+		&kctx->csf.sched.runnable_groups[group->priority];
 
 	lockdep_assert_held(&scheduler->lock);
 
@@ -1470,11 +1548,28 @@ void remove_group_from_runnable(struct kbase_csf_scheduler *const scheduler,
 	}
 
 	kctx->csf.sched.num_runnable_grps--;
+	KBASE_KTRACE_ADD_CSF_GRP(kctx->kbdev, GROUP_REMOVE_RUNNABLE, group,
+				 kctx->csf.sched.num_runnable_grps);
+	new_head_grp = (!list_empty(list)) ?
+				list_first_entry(list, struct kbase_queue_group, link) :
+				NULL;
+	KBASE_KTRACE_ADD_CSF_GRP(kctx->kbdev, GROUP_HEAD_RUNNABLE, new_head_grp,
+				 0u);
+
 	if (kctx->csf.sched.num_runnable_grps == 0) {
+		struct kbase_context *new_head_kctx;
+		struct list_head *kctx_list = &scheduler->runnable_kctxs;
 		/* drop the kctx */
 		list_del_init(&kctx->csf.link);
 		if (scheduler->top_ctx == kctx)
 			scheduler->top_ctx = NULL;
+		KBASE_KTRACE_ADD(kctx->kbdev, SCHEDULER_REMOVE_RUNNABLE, kctx,
+				 0u);
+		new_head_kctx = (!list_empty(kctx_list)) ?
+					list_first_entry(kctx_list, struct kbase_context, csf.link) :
+					NULL;
+		KBASE_KTRACE_ADD(kctx->kbdev, SCHEDULER_HEAD_RUNNABLE,
+				 new_head_kctx, 0u);
 	}
 
 	WARN_ON(scheduler->total_runnable_grps == 0);
@@ -1501,6 +1596,8 @@ static void insert_group_to_idle_wait(struct kbase_queue_group *const group)
 
 	list_add_tail(&group->link, &kctx->csf.sched.idle_wait_groups);
 	kctx->csf.sched.num_idle_wait_grps++;
+	KBASE_KTRACE_ADD_CSF_GRP(kctx->kbdev, GROUP_INSERT_IDLE_WAIT, group,
+				 kctx->csf.sched.num_idle_wait_grps);
 	group->run_state = KBASE_CSF_GROUP_SUSPENDED_ON_WAIT_SYNC;
 	dev_dbg(kctx->kbdev->dev,
 		"Group-%d suspended on sync_wait, total wait_groups: %u\n",
@@ -1510,6 +1607,8 @@ static void insert_group_to_idle_wait(struct kbase_queue_group *const group)
 static void remove_group_from_idle_wait(struct kbase_queue_group *const group)
 {
 	struct kbase_context *kctx = group->kctx;
+	struct list_head *list = &kctx->csf.sched.idle_wait_groups;
+	struct kbase_queue_group *new_head_grp;
 
 	lockdep_assert_held(&kctx->kbdev->csf.scheduler.lock);
 
@@ -1518,6 +1617,13 @@ static void remove_group_from_idle_wait(struct kbase_queue_group *const group)
 	list_del_init(&group->link);
 	WARN_ON(kctx->csf.sched.num_idle_wait_grps == 0);
 	kctx->csf.sched.num_idle_wait_grps--;
+	KBASE_KTRACE_ADD_CSF_GRP(kctx->kbdev, GROUP_REMOVE_IDLE_WAIT, group,
+				 kctx->csf.sched.num_idle_wait_grps);
+	new_head_grp = (!list_empty(list)) ?
+				list_first_entry(list, struct kbase_queue_group, link) :
+				NULL;
+	KBASE_KTRACE_ADD_CSF_GRP(kctx->kbdev, GROUP_HEAD_IDLE_WAIT,
+				 new_head_grp, 0u);
 	group->run_state = KBASE_CSF_GROUP_INACTIVE;
 }
 
@@ -1540,8 +1646,12 @@ static void update_offslot_non_idle_cnt_for_faulty_grp(struct kbase_queue_group
 
 	lockdep_assert_held(&scheduler->lock);
 
-	if (group->prepared_seq_num < scheduler->non_idle_scanout_grps)
-		atomic_dec(&scheduler->non_idle_offslot_grps);
+	if (group->prepared_seq_num < scheduler->non_idle_scanout_grps) {
+		int new_val =
+			atomic_dec_return(&scheduler->non_idle_offslot_grps);
+		KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_DEC,
+					 group, new_val);
+	}
 }
 
 static void update_offslot_non_idle_cnt_for_onslot_grp(struct kbase_queue_group *group)
@@ -1553,8 +1663,12 @@ static void update_offslot_non_idle_cnt_for_onslot_grp(struct kbase_queue_group
 
 	WARN_ON(group->csg_nr < 0);
 
-	if (group->prepared_seq_num < scheduler->non_idle_scanout_grps)
-		atomic_dec(&scheduler->non_idle_offslot_grps);
+	if (group->prepared_seq_num < scheduler->non_idle_scanout_grps) {
+		int new_val =
+			atomic_dec_return(&scheduler->non_idle_offslot_grps);
+		KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_DEC,
+					 group, new_val);
+	}
 }
 
 static void update_offslot_non_idle_cnt_on_grp_suspend(
@@ -1570,16 +1684,28 @@ static void update_offslot_non_idle_cnt_on_grp_suspend(
 		if (group->prepared_seq_num >=
 		    scheduler->non_idle_scanout_grps) {
 			/* At scanout, it was tagged as on-slot idle */
-			if (group->run_state == KBASE_CSF_GROUP_SUSPENDED)
-				atomic_inc(&scheduler->non_idle_offslot_grps);
+			if (group->run_state == KBASE_CSF_GROUP_SUSPENDED) {
+				int new_val = atomic_inc_return(
+					&scheduler->non_idle_offslot_grps);
+				KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_INC,
+					group, new_val);
+			}
 		} else {
-			if (group->run_state != KBASE_CSF_GROUP_SUSPENDED)
-				atomic_dec(&scheduler->non_idle_offslot_grps);
+			if (group->run_state != KBASE_CSF_GROUP_SUSPENDED) {
+				int new_val = atomic_dec_return(
+					&scheduler->non_idle_offslot_grps);
+				KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_DEC,
+					group, new_val);
+			}
 		}
 	} else {
 		/* async phases */
-		if (group->run_state == KBASE_CSF_GROUP_SUSPENDED)
-			atomic_inc(&scheduler->non_idle_offslot_grps);
+		if (group->run_state == KBASE_CSF_GROUP_SUSPENDED) {
+			int new_val = atomic_inc_return(
+				&scheduler->non_idle_offslot_grps);
+			KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_INC,
+						 group, new_val);
+		}
 	}
 }
 
@@ -1641,11 +1767,6 @@ static void save_csg_slot(struct kbase_queue_group *group)
 		bool sync_wait = false;
 		bool idle = kbase_csf_firmware_csg_output(ginfo, CSG_STATUS_STATE) &
 			    CSG_STATUS_STATE_IDLE_MASK;
-
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-		for (i = 0; i < max_streams; i++)
-			update_hw_active(group->bound_queues[i], false);
-#endif
 		for (i = 0; idle && i < max_streams; i++) {
 			struct kbase_queue *const queue =
 					group->bound_queues[i];
@@ -1745,8 +1866,11 @@ static bool cleanup_csg_slot(struct kbase_queue_group *group)
 	/* now marking the slot is vacant */
 	spin_lock_irqsave(&kbdev->csf.scheduler.interrupt_lock, flags);
 	kbdev->csf.scheduler.csg_slots[slot].resident_group = NULL;
-	group->csg_nr = KBASEP_CSG_NR_INVALID;
 	clear_bit(slot, kbdev->csf.scheduler.csg_slots_idle_mask);
+	KBASE_KTRACE_ADD_CSF_GRP(kbdev, CSG_SLOT_IDLE_CLEAR, group,
+				 kbdev->csf.scheduler.csg_slots_idle_mask[0]);
+
+	group->csg_nr = KBASEP_CSG_NR_INVALID;
 	set_bit(slot, kbdev->csf.scheduler.csgs_events_enable_mask);
 	clear_bit(slot, kbdev->csf.scheduler.csg_inuse_bitmap);
 	spin_unlock_irqrestore(&kbdev->csf.scheduler.interrupt_lock, flags);
@@ -2001,8 +2125,12 @@ static void sched_evict_group(struct kbase_queue_group *group, bool fault,
 
 		if (update_non_idle_offslot_grps_cnt &&
 		    (group->run_state == KBASE_CSF_GROUP_SUSPENDED ||
-		     group->run_state == KBASE_CSF_GROUP_RUNNABLE))
-			atomic_dec(&scheduler->non_idle_offslot_grps);
+		     group->run_state == KBASE_CSF_GROUP_RUNNABLE)) {
+			int new_val = atomic_dec_return(
+				&scheduler->non_idle_offslot_grps);
+			KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_DEC,
+						 group, new_val);
+		}
 
 		for (i = 0; i < MAX_SUPPORTED_STREAMS_PER_GROUP; i++) {
 			if (group->bound_queues[i])
@@ -2047,8 +2175,9 @@ static int term_group_sync(struct kbase_queue_group *group)
 		csg_slot_stopped_locked(kbdev, group->csg_nr), remaining);
 
 	if (!remaining) {
-		dev_warn(kbdev->dev, "term request timed out for group %d on slot %d",
-			 group->handle, group->csg_nr);
+		dev_warn(kbdev->dev, "term request timed out for group %d of context %d_%d on slot %d",
+			 group->handle, group->kctx->tgid,
+			 group->kctx->id, group->csg_nr);
 		if (kbase_prepare_to_reset_gpu(kbdev, RESET_FLAGS_NONE))
 			kbase_reset_gpu(kbdev);
 		err = -ETIMEDOUT;
@@ -2147,9 +2276,12 @@ static int scheduler_group_schedule(struct kbase_queue_group *group)
 			 */
 			spin_lock_irqsave(&scheduler->interrupt_lock, flags);
 			protm_grp = scheduler->active_protm_grp;
-			if (protm_grp && protm_grp != group)
+			if (protm_grp && protm_grp != group) {
 				clear_bit((unsigned int)group->csg_nr,
 					  scheduler->csg_slots_idle_mask);
+				KBASE_KTRACE_ADD_CSF_GRP(kbdev, CSG_SLOT_IDLE_CLEAR, group,
+					scheduler->csg_slots_idle_mask[0]);
+			}
 			spin_unlock_irqrestore(&scheduler->interrupt_lock,
 					       flags);
 
@@ -2166,10 +2298,14 @@ static int scheduler_group_schedule(struct kbase_queue_group *group)
 			}
 		}
 	} else if (!queue_group_scheduled_locked(group)) {
+		int new_val;
 		insert_group_to_runnable(&kbdev->csf.scheduler, group,
 			KBASE_CSF_GROUP_RUNNABLE);
 		/* A new group into the scheduler */
-		atomic_inc(&kbdev->csf.scheduler.non_idle_offslot_grps);
+		new_val = atomic_inc_return(
+			&kbdev->csf.scheduler.non_idle_offslot_grps);
+		KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_INC,
+					 group, new_val);
 	}
 
 	/* Since a group has become active now, check if GPU needs to be
@@ -2224,13 +2360,12 @@ static inline void count_active_address_space(struct kbase_device *kbdev,
 			kbdev->nr_hw_address_spaces - NUM_RESERVED_AS_SLOTS;
 
 	if (scheduler->ngrp_to_schedule <= total_csg_slots) {
-		if (kctx->csf.sched.ngrp_to_schedule == 1) {
+		if (kctx->csf.sched.ngrp_to_schedule == 1)
 			scheduler->num_active_address_spaces++;
 
-			if (scheduler->num_active_address_spaces <=
-			    max_address_space_slots)
-				scheduler->num_csg_slots_for_tick++;
-		}
+		if (scheduler->num_active_address_spaces <=
+		    max_address_space_slots)
+			scheduler->num_csg_slots_for_tick++;
 	}
 }
 
@@ -2549,8 +2684,9 @@ static void program_suspending_csg_slots(struct kbase_device *kbdev)
 				 */
 				dev_warn(
 					kbdev->dev,
-					"Group %pK on slot %u failed to suspend\n",
-					(void *)group, i);
+					"Group %d of context %d_%d on slot %u failed to suspend",
+					group->handle, group->kctx->tgid,
+					group->kctx->id, i);
 
 				/* The group has failed suspension, stop
 				 * further examination.
@@ -2878,6 +3014,8 @@ static bool scheduler_slot_protm_ack(struct kbase_device *const kbdev,
 		struct kbase_queue *queue = group->bound_queues[i];
 
 		clear_bit(i, group->protm_pending_bitmap);
+		KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, PROTM_PENDING_CLEAR, group,
+					   queue, group->protm_pending_bitmap[0]);
 
 		if (!WARN_ON(!queue) && queue->enabled) {
 			struct kbase_csf_cmd_stream_info *stream =
@@ -2889,6 +3027,9 @@ static bool scheduler_slot_protm_ack(struct kbase_device *const kbdev,
 						stream, CS_REQ) &
 						CS_REQ_PROTM_PEND_MASK;
 
+			KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, CSI_PROTM_ACK, group,
+						   queue, cs_protm_ack ^ cs_protm_req);
+
 			if (cs_protm_ack == cs_protm_req) {
 				dev_dbg(kbdev->dev,
 					"PROTM-ack already done for queue-%d group-%d slot-%d",
@@ -2928,11 +3069,16 @@ static void scheduler_group_check_protm_enter(struct kbase_device *const kbdev,
 {
 	struct kbase_csf_scheduler *scheduler = &kbdev->csf.scheduler;
 	unsigned long flags;
+	bool protm_in_use;
 
 	lockdep_assert_held(&scheduler->lock);
 
 	spin_lock_irqsave(&scheduler->interrupt_lock, flags);
 
+	protm_in_use = kbase_csf_scheduler_protected_mode_in_use(kbdev);
+	KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_CHECK_PROTM_ENTER, input_grp,
+				 protm_in_use);
+
 	/* Firmware samples the PROTM_PEND ACK bit for CSs when
 	 * Host sends PROTM_ENTER global request. So if PROTM_PEND ACK bit
 	 * is set for a CS after Host has sent the PROTM_ENTER
@@ -2951,40 +3097,35 @@ static void scheduler_group_check_protm_enter(struct kbase_device *const kbdev,
 	 * be replacement, and that it is currently in a stable state (i.e. the
 	 * slot state is running).
 	 */
-	if (!kbase_csf_scheduler_protected_mode_in_use(kbdev)) {
-		if (!WARN_ON(!input_grp)) {
-			const int slot =
-				kbase_csf_scheduler_group_get_slot_locked(
-					input_grp);
-
-			/* check the input_grp is running and requesting
-			 * protected mode
-			 */
-			if (slot >= 0 &&
-				atomic_read(
-					&scheduler->csg_slots[slot].state) ==
-					CSG_SLOT_RUNNING) {
-				if (kctx_as_enabled(input_grp->kctx) &&
-					scheduler_slot_protm_ack(kbdev,
-							input_grp, slot)) {
-					/* Option of acknowledging to multiple
-					 * CSGs from the same kctx is dropped,
-					 * after consulting with the
-					 * architecture team. See the comment in
-					 * GPUCORE-21394.
-					 */
+	if (!protm_in_use && !WARN_ON(!input_grp)) {
+		const int slot =
+			kbase_csf_scheduler_group_get_slot_locked(input_grp);
 
-					/* Disable the idle timer */
-					disable_gpu_idle_fw_timer_locked(kbdev);
+		/* check the input_grp is running and requesting protected mode
+		 */
+		if (slot >= 0 &&
+		    atomic_read(&scheduler->csg_slots[slot].state) ==
+			    CSG_SLOT_RUNNING) {
+			if (kctx_as_enabled(input_grp->kctx) &&
+			    scheduler_slot_protm_ack(kbdev, input_grp, slot)) {
+				/* Option of acknowledging to multiple
+				 * CSGs from the same kctx is dropped,
+				 * after consulting with the
+				 * architecture team. See the comment in
+				 * GPUCORE-21394.
+				 */
 
-					/* Switch to protected mode */
-					scheduler->active_protm_grp = input_grp;
-					KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_ENTER_PROTM, input_grp, 0u);
+				/* Disable the idle timer */
+				disable_gpu_idle_fw_timer_locked(kbdev);
 
-					spin_unlock_irqrestore(&scheduler->interrupt_lock, flags);
-					kbase_csf_enter_protected_mode(kbdev);
-					return;
-				}
+				/* Switch to protected mode */
+				scheduler->active_protm_grp = input_grp;
+				KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_ENTER_PROTM,
+							 input_grp, 0u);
+
+				spin_unlock_irqrestore(&scheduler->interrupt_lock, flags);
+				kbase_csf_enter_protected_mode(kbdev);
+				return;
 			}
 		}
 	}
@@ -3175,7 +3316,15 @@ static void scheduler_rotate_groups(struct kbase_device *kbdev)
 
 		WARN_ON(top_grp->kctx != top_ctx);
 		if (!WARN_ON(list_empty(list))) {
+			struct kbase_queue_group *new_head_grp;
 			list_move_tail(&top_grp->link, list);
+			new_head_grp = (!list_empty(list)) ?
+						list_first_entry(list, struct kbase_queue_group, link) :
+						NULL;
+			KBASE_KTRACE_ADD_CSF_GRP(kbdev, GROUP_ROTATE_RUNNABLE,
+						top_grp, top_ctx->csf.sched.num_runnable_grps);
+			KBASE_KTRACE_ADD_CSF_GRP(kbdev, GROUP_HEAD_RUNNABLE,
+						 new_head_grp, 0u);
 			dev_dbg(kbdev->dev,
 			    "groups rotated for a context, num_runnable_groups: %u\n",
 			    scheduler->top_ctx->csf.sched.num_runnable_grps);
@@ -3203,7 +3352,15 @@ static void scheduler_rotate_ctxs(struct kbase_device *kbdev)
 			}
 
 			if (!WARN_ON(!found)) {
+				struct kbase_context *new_head_kctx;
 				list_move_tail(&pos->csf.link, list);
+				KBASE_KTRACE_ADD(kbdev, SCHEDULER_ROTATE_RUNNABLE, pos,
+						 0u);
+				new_head_kctx = (!list_empty(list)) ?
+							list_first_entry(list, struct kbase_context, csf.link) :
+							NULL;
+				KBASE_KTRACE_ADD(kbdev, SCHEDULER_HEAD_RUNNABLE,
+						 new_head_kctx, 0u);
 				dev_dbg(kbdev->dev, "contexts rotated\n");
 			}
 		}
@@ -3247,10 +3404,14 @@ static void scheduler_update_idle_slots_status(struct kbase_device *kbdev,
 		u32 csg_req;
 
 		clear_bit(i, scheduler->csg_slots_idle_mask);
-
+		KBASE_KTRACE_ADD_CSF_GRP(kbdev, CSG_SLOT_IDLE_CLEAR, group,
+					 scheduler->csg_slots_idle_mask[0]);
 		if (WARN_ON(!group))
 			continue;
 
+		KBASE_KTRACE_ADD_CSF_GRP(kbdev, CSG_SLOT_STATUS_UPDATE, group,
+					 i);
+
 		csg_req = kbase_csf_firmware_csg_output(ginfo, CSG_ACK);
 		csg_req ^= CSG_REQ_STATUS_UPDATE_MASK;
 		kbase_csf_firmware_csg_input_mask(ginfo, CSG_REQ, csg_req,
@@ -3279,6 +3440,8 @@ static void scheduler_update_idle_slots_status(struct kbase_device *kbdev,
 			bitmap_copy(failed_csg_bitmap, csg_bitmap, num_groups);
 			csg_bitmap[0] = ~csg_bitmap[0] & db_slots;
 		} else {
+			KBASE_KTRACE_ADD(kbdev, SLOTS_STATUS_UPDATE_ACK, NULL,
+					 db_slots);
 			csg_bitmap[0] = db_slots;
 		}
 	}
@@ -3336,6 +3499,8 @@ static void scheduler_handle_idle_slots(struct kbase_device *kbdev)
 		if (group_on_slot_is_idle(kbdev, i)) {
 			group->run_state = KBASE_CSF_GROUP_IDLE;
 			set_bit(i, scheduler->csg_slots_idle_mask);
+			KBASE_KTRACE_ADD_CSF_GRP(kbdev, CSG_SLOT_IDLE_SET,
+						 group, scheduler->csg_slots_idle_mask[0]);
 		} else
 			group->run_state = KBASE_CSF_GROUP_RUNNABLE;
 	}
@@ -3343,6 +3508,8 @@ static void scheduler_handle_idle_slots(struct kbase_device *kbdev)
 	bitmap_or(scheduler->csg_slots_idle_mask,
 		  scheduler->csg_slots_idle_mask,
 		  failed_csg_bitmap, num_groups);
+	KBASE_KTRACE_ADD_CSF_GRP(kbdev, CSG_SLOT_IDLE_SET, NULL,
+				 scheduler->csg_slots_idle_mask[0]);
 	spin_unlock_irqrestore(&scheduler->interrupt_lock, flags);
 }
 
@@ -3477,20 +3644,32 @@ static void gpu_idle_worker(struct work_struct *work)
 	struct kbase_device *kbdev = container_of(
 		work, struct kbase_device, csf.scheduler.gpu_idle_work);
 	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
+	bool reset_active = false;
+	bool scheduler_is_idle_suspendable = false;
+	bool all_groups_suspended = false;
+
+	KBASE_KTRACE_ADD(kbdev, IDLE_WORKER_BEGIN, NULL, 0u);
+
+#define __ENCODE_KTRACE_INFO(reset, idle, all_suspend)                         \
+	(((u32)reset) | (((u32)idle) << 4) | (((u32)all_suspend) << 8))
 
 	if (kbase_reset_gpu_try_prevent(kbdev)) {
 		dev_warn(kbdev->dev, "Quit idle for failing to prevent gpu reset.\n");
+		KBASE_KTRACE_ADD(kbdev, IDLE_WORKER_END, NULL,
+				 __ENCODE_KTRACE_INFO(true, false, false));
 		return;
 	}
 	mutex_lock(&scheduler->lock);
 
 	/* Cycle completed, disable the firmware idle timer */
 	disable_gpu_idle_fw_timer(kbdev);
-	if (scheduler_idle_suspendable(kbdev) &&
-	    !kbase_reset_gpu_is_active(kbdev)) {
-		int ret = suspend_active_groups_on_powerdown(kbdev, false);
+	scheduler_is_idle_suspendable = scheduler_idle_suspendable(kbdev);
+	reset_active = kbase_reset_gpu_is_active(kbdev);
+	if (scheduler_is_idle_suspendable && !reset_active) {
+		all_groups_suspended =
+			!suspend_active_groups_on_powerdown(kbdev, false);
 
-		if (!ret) {
+		if (all_groups_suspended) {
 			dev_dbg(kbdev->dev, "Scheduler becomes idle suspended now");
 			scheduler_suspend(kbdev);
 			cancel_tick_timer(kbdev);
@@ -3504,6 +3683,9 @@ static void gpu_idle_worker(struct work_struct *work)
 
 	mutex_unlock(&scheduler->lock);
 	kbase_reset_gpu_allow(kbdev);
+	KBASE_KTRACE_ADD(kbdev, IDLE_WORKER_END, NULL,
+			 __ENCODE_KTRACE_INFO(reset_active, scheduler_is_idle_suspendable, all_groups_suspended));
+#undef __ENCODE_KTRACE_INFO
 }
 
 static int scheduler_prepare(struct kbase_device *kbdev)
@@ -3552,6 +3734,8 @@ static int scheduler_prepare(struct kbase_device *kbdev)
 	 */
 	atomic_set(&scheduler->non_idle_offslot_grps,
 		   scheduler->non_idle_scanout_grps);
+	KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_INC, NULL,
+				 scheduler->non_idle_scanout_grps);
 
 	/* Adds those idle but runnable groups to the scanout list */
 	scheduler_scan_idle_groups(kbdev);
@@ -3634,9 +3818,12 @@ static void schedule_actions(struct kbase_device *kbdev)
 	 * queue jobs.
 	 */
 	if (protm_grp && scheduler->top_grp == protm_grp) {
+		int new_val;
 		dev_dbg(kbdev->dev, "Scheduler keep protm exec: group-%d",
 			protm_grp->handle);
-		atomic_dec(&scheduler->non_idle_offslot_grps);
+		new_val = atomic_dec_return(&scheduler->non_idle_offslot_grps);
+		KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_DEC,
+					 protm_grp, new_val);
 	} else if (scheduler->top_grp) {
 		if (protm_grp)
 			dev_dbg(kbdev->dev, "Scheduler drop protm exec: group-%d",
@@ -3725,6 +3912,7 @@ static void schedule_on_tock(struct work_struct *work)
 	dev_dbg(kbdev->dev,
 		"Waking up for event after schedule-on-tock completes.");
 	wake_up_all(&kbdev->csf.event_wait);
+	KBASE_KTRACE_ADD(kbdev, SCHEDULER_TOCK_END, NULL, 0u);
 	return;
 
 exit_no_schedule_unlock:
@@ -3756,7 +3944,8 @@ static void schedule_on_tick(struct work_struct *work)
 	scheduler_rotate(kbdev);
 
 	/* Undertaking schedule action steps */
-	KBASE_KTRACE_ADD(kbdev, SCHEDULER_TICK, NULL, 0u);
+	KBASE_KTRACE_ADD(kbdev, SCHEDULER_TICK, NULL,
+			 scheduler->total_runnable_grps);
 	schedule_actions(kbdev);
 
 	/* Record time information */
@@ -3777,6 +3966,8 @@ static void schedule_on_tick(struct work_struct *work)
 
 	dev_dbg(kbdev->dev, "Waking up for event after schedule-on-tick completes.");
 	wake_up_all(&kbdev->csf.event_wait);
+	KBASE_KTRACE_ADD(kbdev, SCHEDULER_TICK_END, NULL,
+			 scheduler->total_runnable_grps);
 	return;
 
 exit_no_schedule_unlock:
@@ -3784,7 +3975,7 @@ static void schedule_on_tick(struct work_struct *work)
 	kbase_reset_gpu_allow(kbdev);
 }
 
-int wait_csg_slots_suspend(struct kbase_device *kbdev,
+static int wait_csg_slots_suspend(struct kbase_device *kbdev,
 			   const unsigned long *slot_mask,
 			   unsigned int timeout_ms)
 {
@@ -3907,6 +4098,82 @@ static int suspend_active_queue_groups_on_reset(struct kbase_device *kbdev)
 	return ret;
 }
 
+/**
+ * scheduler_handle_reset_in_protected_mode() - Update the state of normal mode
+ *                                              groups when reset is done during
+ *                                              protected mode execution.
+ *
+ * @group: Pointer to the device.
+ *
+ * This function is called at the time of GPU reset, before the suspension of
+ * queue groups, to handle the case when the reset is getting performed whilst
+ * GPU is in protected mode.
+ * On entry to protected mode all the groups, except the top group that executes
+ * in protected mode, are implicitly suspended by the FW. Thus this function
+ * simply marks the normal mode groups as suspended (and cleans up the
+ * corresponding CSG slots) to prevent their potential forceful eviction from
+ * the Scheduler. So if GPU was in protected mode and there was no fault, then
+ * only the protected mode group would be suspended in the regular way post exit
+ * from this function. And if GPU was in normal mode, then all on-slot groups
+ * will get suspended in the regular way.
+ *
+ * Return: true if the groups remaining on the CSG slots need to be suspended in
+ *         the regular way by sending CSG SUSPEND reqs to FW, otherwise false.
+ */
+static bool scheduler_handle_reset_in_protected_mode(struct kbase_device *kbdev)
+{
+	struct kbase_csf_scheduler *scheduler = &kbdev->csf.scheduler;
+	u32 const num_groups = kbdev->csf.global_iface.group_num;
+	struct kbase_queue_group *protm_grp;
+	bool suspend_on_slot_groups;
+	unsigned long flags;
+	u32 csg_nr;
+
+	mutex_lock(&scheduler->lock);
+
+	spin_lock_irqsave(&scheduler->interrupt_lock, flags);
+	protm_grp = scheduler->active_protm_grp;
+
+	/* If GPU wasn't in protected mode or had exited it before the GPU reset
+	 * then all the on-slot groups can be suspended in the regular way by
+	 * sending CSG SUSPEND requests to FW.
+	 * If there wasn't a fault for protected mode group, then it would
+	 * also need to be suspended in the regular way before the reset.
+	 */
+	suspend_on_slot_groups = !(protm_grp && protm_grp->faulted);
+	spin_unlock_irqrestore(&scheduler->interrupt_lock, flags);
+
+	if (!protm_grp)
+		goto unlock;
+
+	/* GPU is in protected mode, so all the on-slot groups barring the
+	 * the protected mode group can be marked as suspended right away.
+	 */
+	for (csg_nr = 0; csg_nr < num_groups; csg_nr++) {
+		struct kbase_queue_group *const group =
+			kbdev->csf.scheduler.csg_slots[csg_nr].resident_group;
+		int new_val;
+
+		if (!group || (group == protm_grp))
+			continue;
+
+		cleanup_csg_slot(group);
+		group->run_state = KBASE_CSF_GROUP_SUSPENDED;
+
+		/* Simply treat the normal mode groups as non-idle. The tick
+		 * scheduled after the reset will re-initialize the counter
+		 * anyways.
+		 */
+		new_val = atomic_inc_return(&scheduler->non_idle_offslot_grps);
+		KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_INC,
+					 group, new_val);
+	}
+
+unlock:
+	mutex_unlock(&scheduler->lock);
+	return suspend_on_slot_groups;
+}
+
 static void scheduler_inner_reset(struct kbase_device *kbdev)
 {
 	u32 const num_groups = kbdev->csf.global_iface.group_num;
@@ -3926,6 +4193,9 @@ static void scheduler_inner_reset(struct kbase_device *kbdev)
 
 	spin_lock_irqsave(&scheduler->interrupt_lock, flags);
 	bitmap_fill(scheduler->csgs_events_enable_mask, MAX_SUPPORTED_CSGS);
+	if (scheduler->active_protm_grp)
+		KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_EXIT_PROTM,
+					 scheduler->active_protm_grp, 0u);
 	scheduler->active_protm_grp = NULL;
 	memset(kbdev->csf.scheduler.csg_slots, 0,
 	       num_groups * sizeof(struct kbase_csf_csg_slot));
@@ -3949,7 +4219,9 @@ void kbase_csf_scheduler_reset(struct kbase_device *kbdev)
 	WARN_ON(!kbase_reset_gpu_is_active(kbdev));
 
 	KBASE_KTRACE_ADD(kbdev, SCHEDULER_RESET, NULL, 0u);
-	if (!suspend_active_queue_groups_on_reset(kbdev)) {
+
+	if (scheduler_handle_reset_in_protected_mode(kbdev) &&
+	    !suspend_active_queue_groups_on_reset(kbdev)) {
 		/* As all groups have been successfully evicted from the CSG
 		 * slots, clear out thee scheduler data fields and return
 		 */
@@ -4194,20 +4466,24 @@ static bool group_sync_updated(struct kbase_queue_group *group)
  * This function is called outside the scheduling tick/tock to determine
  * if the given GPU queue group can now execute in protected mode or not.
  * If the group pointer passed is NULL then the evaluation is done for the
- * scheduler->top_grp (or the second top-group).
+ * highest priority group on the scheduler maintained group lists without
+ * tick associated rotation actions. This is referred as the 'top-group'
+ * in a tock action sense.
  *
  * It returns the same group pointer, that was passed as an argument, if that
- * group matches the scheduler->top_grp and has pending protected region
+ * group matches the highest priority group and has pending protected region
  * requests otherwise NULL is returned.
  *
- * If the group pointer passed is NULL then the pointer to scheduler->top_grp
- * is returned if that has pending protected region requests otherwise NULL is
- * returned.
+ * If the group pointer passed is NULL then the internal evaluated highest
+ * priority group is returned if that has pending protected region requests
+ * otherwise NULL is returned.
  *
- * If the scheduler->top_grp is NULL, which may happen when the top-group is
- * evicted during the tick, the second top-group (as a replacement of the
- * top-group) is used for the match check and also for the evaluation of
- * pending protected region requests if the group pointer passed is NULL.
+ * The evaluated highest priority group may not necessarily be the same as the
+ * scheduler->top_grp. This can happen if there is dynamic de-idle update
+ * during the tick interval for some on-slots groups that were idle during the
+ * scheduler normal scheduling action, where the scheduler->top_grp was set.
+ * The recorded scheduler->top_grp is untouched by this evualuation, so will not
+ * affect the scheduler context/priority list rotation arrangement.
  *
  * Return: the pointer to queue group that can currently execute in protected
  *         mode or NULL.
@@ -4224,8 +4500,7 @@ static struct kbase_queue_group *scheduler_get_protm_enter_async_group(
 	if (scheduler->state != SCHED_INACTIVE)
 		return NULL;
 
-	match_grp = scheduler->top_grp ? scheduler->top_grp :
-					 get_tock_top_group(scheduler);
+	match_grp = get_tock_top_group(scheduler);
 	input_grp = group ? group : match_grp;
 
 	if (input_grp && (input_grp == match_grp)) {
@@ -4308,6 +4583,9 @@ static bool check_sync_update_for_idle_group_protm(
 					stream, CS_STATUS_WAIT);
 			unsigned long flags;
 
+			KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, QUEUE_SYNC_STATUS_WAIT,
+						   queue->group, queue, status);
+
 			if (!CS_STATUS_WAIT_SYNC_WAIT_GET(status))
 				continue;
 
@@ -4323,17 +4601,32 @@ static bool check_sync_update_for_idle_group_protm(
 				stream, CS_STATUS_WAIT_SYNC_POINTER_HI) << 32;
 			queue->sync_value = kbase_csf_firmware_cs_output(
 				stream, CS_STATUS_WAIT_SYNC_VALUE);
+			queue->blocked_reason =
+				CS_STATUS_BLOCKED_REASON_REASON_GET(
+					kbase_csf_firmware_cs_output(
+						stream,
+						CS_STATUS_BLOCKED_REASON));
 
 			if (!evaluate_sync_update(queue))
 				continue;
 
 			/* Update csg_slots_idle_mask and group's run_state */
-			spin_lock_irqsave(&scheduler->interrupt_lock, flags);
-			clear_bit((unsigned int)group->csg_nr,
-					scheduler->csg_slots_idle_mask);
-			spin_unlock_irqrestore(&scheduler->interrupt_lock,
-					       flags);
-			group->run_state = KBASE_CSF_GROUP_RUNNABLE;
+			if (group->run_state != KBASE_CSF_GROUP_RUNNABLE) {
+				/* Only clear the group's idle flag if it has been dealt
+				 * with by the scheduler's tick/tock action, otherwise
+				 * leave it untouched.
+				 */
+				spin_lock_irqsave(&scheduler->interrupt_lock,
+						  flags);
+				clear_bit((unsigned int)group->csg_nr,
+					  scheduler->csg_slots_idle_mask);
+				KBASE_KTRACE_ADD_CSF_GRP(
+					kbdev, CSG_SLOT_IDLE_CLEAR, group,
+					scheduler->csg_slots_idle_mask[0]);
+				spin_unlock_irqrestore(
+					&scheduler->interrupt_lock, flags);
+				group->run_state = KBASE_CSF_GROUP_RUNNABLE;
+			}
 
 			KBASE_KTRACE_ADD_CSF_GRP(kbdev, GROUP_SYNC_UPDATE_DONE, group, 0u);
 			sync_update_done = true;
@@ -4419,6 +4712,7 @@ static void check_group_sync_update_worker(struct work_struct *work)
 
 	mutex_lock(&scheduler->lock);
 
+	KBASE_KTRACE_ADD(kbdev, GROUP_SYNC_UPDATE_WORKER_BEGIN, kctx, 0u);
 	if (kctx->csf.sched.num_idle_wait_grps != 0) {
 		struct kbase_queue_group *group, *temp;
 
@@ -4438,6 +4732,7 @@ static void check_group_sync_update_worker(struct work_struct *work)
 
 	if (check_sync_update_for_idle_groups_protm(kbdev))
 		scheduler_force_protm_exit(kbdev);
+	KBASE_KTRACE_ADD(kbdev, GROUP_SYNC_UPDATE_WORKER_END, kctx, 0u);
 
 	mutex_unlock(&scheduler->lock);
 }
@@ -4515,15 +4810,18 @@ int kbase_csf_scheduler_init(struct kbase_device *kbdev)
 		return -ENOMEM;
 	}
 
+	return 0;
+}
+
+int kbase_csf_scheduler_early_init(struct kbase_device *kbdev)
+{
+	struct kbase_csf_scheduler *scheduler = &kbdev->csf.scheduler;
+
 	scheduler->timer_enabled = true;
 
 	scheduler->wq = alloc_ordered_workqueue("csf_scheduler_wq", WQ_HIGHPRI);
 	if (!scheduler->wq) {
 		dev_err(kbdev->dev, "Failed to allocate scheduler workqueue\n");
-
-		kfree(scheduler->csg_slots);
-		scheduler->csg_slots = NULL;
-
 		return -ENOMEM;
 	}
 
@@ -4581,13 +4879,18 @@ void kbase_csf_scheduler_term(struct kbase_device *kbdev)
 		cancel_tick_timer(kbdev);
 		cancel_work_sync(&kbdev->csf.scheduler.tick_work);
 		cancel_delayed_work_sync(&kbdev->csf.scheduler.tock_work);
-		destroy_workqueue(kbdev->csf.scheduler.wq);
 		mutex_destroy(&kbdev->csf.scheduler.lock);
 		kfree(kbdev->csf.scheduler.csg_slots);
 		kbdev->csf.scheduler.csg_slots = NULL;
 	}
 }
 
+void kbase_csf_scheduler_early_term(struct kbase_device *kbdev)
+{
+	if (kbdev->csf.scheduler.wq)
+		destroy_workqueue(kbdev->csf.scheduler.wq);
+}
+
 /**
  * scheduler_enable_tick_timer_nolock - Enable the scheduler tick timer.
  *
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_scheduler.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_scheduler.h
index 1607ff637554..428ecbee790a 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_scheduler.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_scheduler.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -168,11 +168,24 @@ int kbase_csf_scheduler_context_init(struct kbase_context *kctx);
  * The scheduler does the arbitration for the CSG slots
  * provided by the firmware between the GPU command queue groups created
  * by the Clients.
+ * This function must be called after loading firmware and parsing its capabilities.
  *
  * Return: 0 on success, or negative on failure.
  */
 int kbase_csf_scheduler_init(struct kbase_device *kbdev);
 
+/**
+ * kbase_csf_scheduler_early_init - Early initialization for the CSF scheduler
+ *
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
+ *
+ * Initialize necessary resources such as locks, workqueue for CSF scheduler.
+ * This must be called at kbase probe.
+ *
+ * Return: 0 on success, or negative on failure.
+ */
+int kbase_csf_scheduler_early_init(struct kbase_device *kbdev);
+
 /**
  * kbase_csf_scheduler_context_term() - Terminate the context-specific part
  *                                      for CSF scheduler.
@@ -193,6 +206,15 @@ void kbase_csf_scheduler_context_term(struct kbase_context *kctx);
  */
 void kbase_csf_scheduler_term(struct kbase_device *kbdev);
 
+/**
+ * kbase_csf_scheduler_early_term - Early termination of the CSF scheduler.
+ *
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
+ *
+ * This should be called only when kbase probe fails or gets rmmoded.
+ */
+void kbase_csf_scheduler_early_term(struct kbase_device *kbdev);
+
 /**
  * kbase_csf_scheduler_reset - Reset the state of all active GPU command
  *                             queue groups.
@@ -422,8 +444,11 @@ kbase_csf_scheduler_advance_tick_nolock(struct kbase_device *kbdev)
 	lockdep_assert_held(&scheduler->interrupt_lock);
 
 	if (scheduler->tick_timer_active) {
+		KBASE_KTRACE_ADD(kbdev, SCHEDULER_ADVANCE_TICK, NULL, 0u);
 		scheduler->tick_timer_active = false;
 		queue_work(scheduler->wq, &scheduler->tick_work);
+	} else {
+		KBASE_KTRACE_ADD(kbdev, SCHEDULER_NOADVANCE_TICK, NULL, 0u);
 	}
 }
 
@@ -446,4 +471,24 @@ static inline void kbase_csf_scheduler_advance_tick(struct kbase_device *kbdev)
 	spin_unlock_irqrestore(&scheduler->interrupt_lock, flags);
 }
 
+/**
+ * kbase_csf_scheduler_queue_has_trace() - report whether the queue has been
+ *                                         configured to operate with the
+ *                                         cs_trace feature.
+ *
+ * @queue: Pointer to the queue.
+ *
+ * Return: True if the gpu queue is configured to operate with the cs_trace
+ *         feature, otherwise false.
+ */
+static inline bool kbase_csf_scheduler_queue_has_trace(struct kbase_queue *queue)
+{
+	lockdep_assert_held(&queue->kctx->kbdev->csf.scheduler.lock);
+	/* In the current arrangement, it is possible for the context to enable
+	 * the cs_trace after some queues have been registered with cs_trace in
+	 * disabled state. So each queue has its own enabled/disabled condition.
+	 */
+	return (queue->trace_buffer_size && queue->trace_buffer_base);
+}
+
 #endif /* _KBASE_CSF_SCHEDULER_H_ */
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap.c
index 4b402df2f1c3..b31c82eadb96 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap.h
index 683aeca38bc3..04c27f7dd40e 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_debugfs.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_debugfs.c
index 0f69500f01ca..f46beed102e0 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_debugfs.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_debugfs.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -24,7 +24,7 @@
 #include <mali_kbase.h>
 #include <linux/seq_file.h>
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 
 /**
  * kbasep_csf_tiler_heap_debugfs_show() - Print tiler heap information for per context
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_debugfs.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_debugfs.h
index 65dfaf701845..92ae91a1e620 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_debugfs.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_debugfs.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_def.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_def.h
index 0bf655178fae..fb439cfe492d 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_def.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_def.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_timeout.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_timeout.c
index 854aad581318..4d93fe56e529 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_timeout.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_timeout.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -147,7 +147,7 @@ int kbase_csf_timeout_init(struct kbase_device *const kbdev)
 	u64 timeout = DEFAULT_PROGRESS_TIMEOUT;
 	int err;
 
-#ifdef CONFIG_OF
+#if IS_ENABLED(CONFIG_OF)
 	err = of_property_read_u64(kbdev->dev->of_node,
 		"progress_timeout", &timeout);
 	if (!err)
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_timeout.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_timeout.h
index 48c71818a0ab..b406eaad2d51 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_timeout.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_timeout.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tl_reader.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tl_reader.c
index de292c1d0ca2..1824c2d3849a 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tl_reader.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tl_reader.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -35,7 +35,7 @@
 #include <linux/math64.h>
 #include <asm/arch_timer.h>
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 #include "tl/mali_kbase_timeline_priv.h"
 #include <linux/debugfs.h>
 
@@ -64,7 +64,7 @@ struct kbase_csffw_tl_message {
 	u64 cycle_counter;
 } __packed __aligned(4);
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 static int kbase_csf_tl_debugfs_poll_interval_read(void *data, u64 *val)
 {
 	struct kbase_device *kbdev = (struct kbase_device *)data;
@@ -93,11 +93,13 @@ DEFINE_DEBUGFS_ATTRIBUTE(kbase_csf_tl_poll_interval_fops,
 		kbase_csf_tl_debugfs_poll_interval_read,
 		kbase_csf_tl_debugfs_poll_interval_write, "%llu\n");
 
+
 void kbase_csf_tl_reader_debugfs_init(struct kbase_device *kbdev)
 {
 	debugfs_create_file("csf_tl_poll_interval_in_ms", S_IRUGO | S_IWUSR,
 		kbdev->debugfs_instr_directory, kbdev,
 		&kbase_csf_tl_poll_interval_fops);
+
 }
 #endif
 
@@ -125,6 +127,7 @@ static void get_cpu_gpu_time(
 		*cpu_ts = ts.tv_sec * NSEC_PER_SEC + ts.tv_nsec;
 }
 
+
 /**
  * kbase_ts_converter_init() - Initialize system timestamp converter.
  *
@@ -168,7 +171,7 @@ static int kbase_ts_converter_init(
  *
  * Return: The CPU timestamp.
  */
-void kbase_ts_converter_convert(
+static void kbase_ts_converter_convert(
 	const struct kbase_ts_converter *self,
 	u64 *gpu_ts)
 {
@@ -474,14 +477,7 @@ int kbase_csf_tl_reader_start(struct kbase_csf_tl_reader *self,
 		return 0;
 
 	if (tl_reader_init_late(self, kbdev)) {
-#if defined(CONFIG_MALI_BIFROST_NO_MALI)
-		dev_warn(
-			kbdev->dev,
-			"CSFFW timeline is not available for MALI_BIFROST_NO_MALI builds!");
-		return 0;
-#else
 		return -EINVAL;
-#endif
 	}
 
 	tl_reader_reset(self);
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tl_reader.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tl_reader.h
index c691871cbdc5..1b0fcd7602a9 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tl_reader.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tl_reader.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -164,7 +164,7 @@ int kbase_csf_tl_reader_start(struct kbase_csf_tl_reader *self,
  */
 void kbase_csf_tl_reader_stop(struct kbase_csf_tl_reader *self);
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 /**
  * kbase_csf_tl_reader_debugfs_init() -
  *	Initialize debugfs for CSFFW Timelime Stream Reader.
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_trace_buffer.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_trace_buffer.c
index afcc90b39b54..a6343c809aad 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_trace_buffer.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_trace_buffer.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
@@ -29,7 +29,7 @@
 #include <linux/list.h>
 #include <linux/mman.h>
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 #if (KERNEL_VERSION(4, 7, 0) > LINUX_VERSION_CODE)
 #define DEFINE_DEBUGFS_ATTRIBUTE DEFINE_SIMPLE_ATTRIBUTE
 #endif
@@ -513,7 +513,7 @@ unsigned int kbase_csf_firmware_trace_buffer_read_data(
 }
 EXPORT_SYMBOL(kbase_csf_firmware_trace_buffer_read_data);
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 
 #define U32_BITS 32
 static u64 get_trace_buffer_active_mask64(struct firmware_trace_buffer *tb)
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_trace_buffer.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_trace_buffer.h
index e6babef9250c..b9f481dcf00d 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_trace_buffer.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_trace_buffer.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
@@ -168,7 +168,7 @@ bool kbase_csf_firmware_trace_buffer_is_empty(
 unsigned int kbase_csf_firmware_trace_buffer_read_data(
 	struct firmware_trace_buffer *trace_buffer, u8 *data, unsigned int num_bytes);
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 /**
  * kbase_csf_fw_trace_buffer_debugfs_init() - Add debugfs entries for setting
  *                                         enable mask and dumping the binary
diff --git a/drivers/gpu/arm/bifrost/debug/Kbuild b/drivers/gpu/arm/bifrost/debug/Kbuild
new file mode 100644
index 000000000000..6e1f0f75c43e
--- /dev/null
+++ b/drivers/gpu/arm/bifrost/debug/Kbuild
@@ -0,0 +1,27 @@
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+#
+# (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
+#
+# This program is free software and is provided to you under the terms of the
+# GNU General Public License version 2 as published by the Free Software
+# Foundation, and any use by you of this program is subject to the terms
+# of such GNU license.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can access it online at
+# http://www.gnu.org/licenses/gpl-2.0.html.
+#
+#
+
+bifrost_kbase-y += debug/mali_kbase_debug_ktrace.o
+
+ifeq ($(CONFIG_MALI_CSF_SUPPORT),y)
+    bifrost_kbase-y += debug/backend/mali_kbase_debug_ktrace_csf.o
+else
+    bifrost_kbase-y += debug/backend/mali_kbase_debug_ktrace_jm.o
+endif
diff --git a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_codes_csf.h b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_codes_csf.h
index 7ed62aa02972..d05f802f0db5 100644
--- a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_codes_csf.h
+++ b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_codes_csf.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -50,10 +50,52 @@ int dummy_array[] = {
 	KBASE_KTRACE_CODE_MAKE_CODE(FIRMWARE_BOOT),
 	KBASE_KTRACE_CODE_MAKE_CODE(FIRMWARE_REBOOT),
 	KBASE_KTRACE_CODE_MAKE_CODE(SCHEDULER_TOCK),
+	KBASE_KTRACE_CODE_MAKE_CODE(SCHEDULER_TOCK_END),
+	/* info_val == total number of runnable groups across all kctxs */
 	KBASE_KTRACE_CODE_MAKE_CODE(SCHEDULER_TICK),
+	KBASE_KTRACE_CODE_MAKE_CODE(SCHEDULER_TICK_END),
 	KBASE_KTRACE_CODE_MAKE_CODE(SCHEDULER_RESET),
-	KBASE_KTRACE_CODE_MAKE_CODE(SCHEDULER_EXIT_PROTM),
+	/* info_val = timeout in ms */
+	KBASE_KTRACE_CODE_MAKE_CODE(SCHEDULER_WAIT_PROTM_QUIT),
+	/* info_val = remaining ms timeout, or 0 if timedout */
+	KBASE_KTRACE_CODE_MAKE_CODE(SCHEDULER_WAIT_PROTM_QUIT_DONE),
 	KBASE_KTRACE_CODE_MAKE_CODE(SYNC_UPDATE_EVENT),
+	KBASE_KTRACE_CODE_MAKE_CODE(SYNC_UPDATE_EVENT_NOTIFY_GPU),
+
+	/* info_val = JOB_IRQ_STATUS */
+	KBASE_KTRACE_CODE_MAKE_CODE(CSF_INTERRUPT),
+	/* info_val = JOB_IRQ_STATUS */
+	KBASE_KTRACE_CODE_MAKE_CODE(CSF_INTERRUPT_END),
+	/* info_val = JOB_IRQ_STATUS */
+	KBASE_KTRACE_CODE_MAKE_CODE(CSG_INTERRUPT_PROCESS),
+	/* info_val = GLB_REQ ^ GLB_ACQ */
+	KBASE_KTRACE_CODE_MAKE_CODE(GLB_REQ_ACQ),
+	/* info_val[31:0] = num non idle offslot groups
+	 * info_val[32] = scheduler can suspend on idle
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(SCHEDULER_CAN_IDLE),
+	KBASE_KTRACE_CODE_MAKE_CODE(SCHEDULER_ADVANCE_TICK),
+	KBASE_KTRACE_CODE_MAKE_CODE(SCHEDULER_NOADVANCE_TICK),
+	/* kctx is added to the back of the list */
+	KBASE_KTRACE_CODE_MAKE_CODE(SCHEDULER_INSERT_RUNNABLE),
+	KBASE_KTRACE_CODE_MAKE_CODE(SCHEDULER_REMOVE_RUNNABLE),
+	/* kctx is moved to the back of the list */
+	KBASE_KTRACE_CODE_MAKE_CODE(SCHEDULER_ROTATE_RUNNABLE),
+	KBASE_KTRACE_CODE_MAKE_CODE(SCHEDULER_HEAD_RUNNABLE),
+
+	KBASE_KTRACE_CODE_MAKE_CODE(IDLE_WORKER_BEGIN),
+	/* 4-bit encoding of boolean values (ease of reading as hex values)
+	 *
+	 * info_val[3:0] = was reset active/failed to be prevented
+	 * info_val[7:4] = whether scheduler was both idle and suspendable
+	 * info_val[11:8] = whether all groups were suspended
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(IDLE_WORKER_END),
+	KBASE_KTRACE_CODE_MAKE_CODE(GROUP_SYNC_UPDATE_WORKER_BEGIN),
+	KBASE_KTRACE_CODE_MAKE_CODE(GROUP_SYNC_UPDATE_WORKER_END),
+
+	/* info_val = bitmask of slots that gave an ACK for STATUS_UPDATE */
+	KBASE_KTRACE_CODE_MAKE_CODE(SLOTS_STATUS_UPDATE_ACK),
 
 	/*
 	 * Group events
@@ -71,12 +113,30 @@ int dummy_array[] = {
 	KBASE_KTRACE_CODE_MAKE_CODE(CSG_SLOT_STOPPED),
 	/* info_val == slot cleaned */
 	KBASE_KTRACE_CODE_MAKE_CODE(CSG_SLOT_CLEANED),
+	/* info_val = slot requesting STATUS_UPDATE */
+	KBASE_KTRACE_CODE_MAKE_CODE(CSG_SLOT_STATUS_UPDATE),
+	/* info_val = scheduler's new csg_slots_idle_mask[0]
+	 * group->csg_nr indicates which bit was set
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(CSG_SLOT_IDLE_SET),
+	/* info_val = scheduler's new csg_slots_idle_mask[0]
+	 * group->csg_nr indicates which bit was cleared
+	 *
+	 * in case of no group, multiple bits may have been updated
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(CSG_SLOT_IDLE_CLEAR),
 	/* info_val == previous priority */
 	KBASE_KTRACE_CODE_MAKE_CODE(CSG_PRIO_UPDATE),
 	/* info_val == CSG_REQ ^ CSG_ACK */
 	KBASE_KTRACE_CODE_MAKE_CODE(CSG_SYNC_UPDATE_INTERRUPT),
 	/* info_val == CSG_REQ ^ CSG_ACK */
 	KBASE_KTRACE_CODE_MAKE_CODE(CSG_IDLE_INTERRUPT),
+	/* info_val == CSG_REQ ^ CSG_ACK */
+	KBASE_KTRACE_CODE_MAKE_CODE(CSG_PROGRESS_TIMER_INTERRUPT),
+	/* info_val[31:0] == CSG_REQ ^ CSG_ACQ
+	 * info_val[63:32] == CSG_IRQ_REQ ^ CSG_IRQ_ACK
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(CSG_INTERRUPT_PROCESS_END),
 	KBASE_KTRACE_CODE_MAKE_CODE(GROUP_SYNC_UPDATE_DONE),
 	/* info_val == run state of the group */
 	KBASE_KTRACE_CODE_MAKE_CODE(GROUP_DESCHEDULE),
@@ -86,11 +146,46 @@ int dummy_array[] = {
 	 * info_val[63:32] == number of runnable groups
 	 */
 	KBASE_KTRACE_CODE_MAKE_CODE(GROUP_EVICT_SCHED),
+
+	/* info_val == new num_runnable_grps
+	 * group is added to the back of the list for its priority level
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(GROUP_INSERT_RUNNABLE),
+	/* info_val == new num_runnable_grps
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(GROUP_REMOVE_RUNNABLE),
+	/* info_val == num_runnable_grps
+	 * group is moved to the back of the list for its priority level
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(GROUP_ROTATE_RUNNABLE),
+	KBASE_KTRACE_CODE_MAKE_CODE(GROUP_HEAD_RUNNABLE),
+	/* info_val == new num_idle_wait_grps
+	 * group is added to the back of the list
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(GROUP_INSERT_IDLE_WAIT),
+	/* info_val == new num_idle_wait_grps
+	 * group is added to the back of the list
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(GROUP_REMOVE_IDLE_WAIT),
+	KBASE_KTRACE_CODE_MAKE_CODE(GROUP_HEAD_IDLE_WAIT),
+
+	/* info_val == is scheduler running with protected mode tasks */
+	KBASE_KTRACE_CODE_MAKE_CODE(SCHEDULER_CHECK_PROTM_ENTER),
 	KBASE_KTRACE_CODE_MAKE_CODE(SCHEDULER_ENTER_PROTM),
+	KBASE_KTRACE_CODE_MAKE_CODE(SCHEDULER_EXIT_PROTM),
 	/* info_val[31:0] == number of GPU address space slots in use
 	 * info_val[63:32] == number of runnable groups
 	 */
 	KBASE_KTRACE_CODE_MAKE_CODE(SCHEDULER_TOP_GRP),
+	/* info_val == new count of off-slot non-idle groups
+	 * no group indicates it was set rather than incremented
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(SCHEDULER_NONIDLE_OFFSLOT_INC),
+	/* info_val == new count of off-slot non-idle groups */
+	KBASE_KTRACE_CODE_MAKE_CODE(SCHEDULER_NONIDLE_OFFSLOT_DEC),
+
+	KBASE_KTRACE_CODE_MAKE_CODE(PROTM_EVENT_WORKER_BEGIN),
+	KBASE_KTRACE_CODE_MAKE_CODE(PROTM_EVENT_WORKER_END),
 
 	/*
 	 * Group + Queue events
@@ -100,13 +195,41 @@ int dummy_array[] = {
 	/* info_val == queue->enabled before stop */
 	KBASE_KTRACE_CODE_MAKE_CODE(CSI_STOP),
 	KBASE_KTRACE_CODE_MAKE_CODE(CSI_STOP_REQUESTED),
+	/* info_val == CS_REQ ^ CS_ACK that were not processed due to the group
+	 * being suspended
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(CSI_IGNORED_INTERRUPTS_GROUP_SUSPEND),
 	/* info_val == CS_REQ ^ CS_ACK */
 	KBASE_KTRACE_CODE_MAKE_CODE(CSI_FAULT_INTERRUPT),
 	/* info_val == CS_REQ ^ CS_ACK */
 	KBASE_KTRACE_CODE_MAKE_CODE(CSI_TILER_OOM_INTERRUPT),
+	/* info_val == CS_REQ ^ CS_ACK */
+	KBASE_KTRACE_CODE_MAKE_CODE(CSI_PROTM_PEND_INTERRUPT),
+	/* info_val == CS_ACK_PROTM_PEND ^ CS_REQ_PROTM_PEND */
+	KBASE_KTRACE_CODE_MAKE_CODE(CSI_PROTM_ACK),
 	/* info_val == group->run_State (for group the queue is bound to) */
 	KBASE_KTRACE_CODE_MAKE_CODE(QUEUE_START),
 	KBASE_KTRACE_CODE_MAKE_CODE(QUEUE_STOP),
+	/* info_val == contents of CS_STATUS_WAIT_SYNC_POINTER */
+	KBASE_KTRACE_CODE_MAKE_CODE(QUEUE_SYNC_UPDATE),
+	/* info_val == bool for result of the evaluation */
+	KBASE_KTRACE_CODE_MAKE_CODE(QUEUE_SYNC_UPDATE_EVALUATED),
+	/* info_val == contents of CS_STATUS_WAIT */
+	KBASE_KTRACE_CODE_MAKE_CODE(QUEUE_SYNC_STATUS_WAIT),
+	/* info_val == current sync value pointed to by queue->sync_ptr */
+	KBASE_KTRACE_CODE_MAKE_CODE(QUEUE_SYNC_CURRENT_VAL),
+	/* info_val == current value of CS_STATUS_WAIT_SYNC_VALUE */
+	KBASE_KTRACE_CODE_MAKE_CODE(QUEUE_SYNC_TEST_VAL),
+	/* info_val == current value of CS_STATUS_BLOCKED_REASON */
+	KBASE_KTRACE_CODE_MAKE_CODE(QUEUE_SYNC_BLOCKED_REASON),
+	/* info_val = group's new protm_pending_bitmap[0]
+	 * queue->csi_index indicates which bit was set
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(PROTM_PENDING_SET),
+	/* info_val = group's new protm_pending_bitmap[0]
+	 * queue->csi_index indicates which bit was cleared
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(PROTM_PENDING_CLEAR),
 
 	/*
 	 * KCPU queue events
diff --git a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_codes_jm.h b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_codes_jm.h
index a616f2bc492d..f419f701b523 100644
--- a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_codes_jm.h
+++ b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_codes_jm.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2011-2015, 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2015, 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_csf.c b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_csf.c
index 9183520a33f0..824ca4b87b36 100644
--- a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_csf.c
+++ b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_csf.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_csf.h b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_csf.h
index 62cd1bca1292..e3d03730734d 100644
--- a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_csf.h
+++ b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_csf.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_defs_csf.h b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_defs_csf.h
index ef75afa98585..7f32cd2f23c8 100644
--- a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_defs_csf.h
+++ b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_defs_csf.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
@@ -43,9 +43,14 @@
  * ringbuffer RBUF (mali_trace) between csi and info_val, which is empty
  * for non-kcpu related traces, and usually displays the KCPU Queue ID and
  * an extra information value. ftrace also displays these KCPU traces.
+ *
+ * 1.3:
+ * Add a lot of extra new traces. Tweak some existing scheduler related traces
+ * to contain extra information information/happen at slightly different times.
+ * SCHEDULER_EXIT_PROTM now has group information
  */
 #define KBASE_KTRACE_VERSION_MAJOR 1
-#define KBASE_KTRACE_VERSION_MINOR 2
+#define KBASE_KTRACE_VERSION_MINOR 3
 
 /* indicates if the trace message has valid queue-group related info. */
 #define KBASE_KTRACE_FLAG_CSF_GROUP     (((kbase_ktrace_flag_t)1) << 0)
diff --git a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_defs_jm.h b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_defs_jm.h
index abd35ff46e06..c01f930ca76f 100644
--- a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_defs_jm.h
+++ b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_defs_jm.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_jm.c b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_jm.c
index 276290917a82..fed9c1f71c3a 100644
--- a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_jm.c
+++ b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_jm.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_jm.h b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_jm.h
index 233d06f2eae7..a2ce3c421574 100644
--- a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_jm.h
+++ b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_jm.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_linux_ktrace_csf.h b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_linux_ktrace_csf.h
index 4ed175e53f49..4b23fc940c93 100644
--- a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_linux_ktrace_csf.h
+++ b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_linux_ktrace_csf.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -34,10 +34,30 @@ DEFINE_MALI_ADD_EVENT(EVICT_CTX_SLOTS);
 DEFINE_MALI_ADD_EVENT(FIRMWARE_BOOT);
 DEFINE_MALI_ADD_EVENT(FIRMWARE_REBOOT);
 DEFINE_MALI_ADD_EVENT(SCHEDULER_TOCK);
+DEFINE_MALI_ADD_EVENT(SCHEDULER_TOCK_END);
 DEFINE_MALI_ADD_EVENT(SCHEDULER_TICK);
+DEFINE_MALI_ADD_EVENT(SCHEDULER_TICK_END);
 DEFINE_MALI_ADD_EVENT(SCHEDULER_RESET);
-DEFINE_MALI_ADD_EVENT(SCHEDULER_EXIT_PROTM);
+DEFINE_MALI_ADD_EVENT(SCHEDULER_WAIT_PROTM_QUIT);
+DEFINE_MALI_ADD_EVENT(SCHEDULER_WAIT_PROTM_QUIT_DONE);
 DEFINE_MALI_ADD_EVENT(SYNC_UPDATE_EVENT);
+DEFINE_MALI_ADD_EVENT(SYNC_UPDATE_EVENT_NOTIFY_GPU);
+DEFINE_MALI_ADD_EVENT(CSF_INTERRUPT);
+DEFINE_MALI_ADD_EVENT(CSF_INTERRUPT_END);
+DEFINE_MALI_ADD_EVENT(CSG_INTERRUPT_PROCESS);
+DEFINE_MALI_ADD_EVENT(GLB_REQ_ACQ);
+DEFINE_MALI_ADD_EVENT(SCHEDULER_CAN_IDLE);
+DEFINE_MALI_ADD_EVENT(SCHEDULER_ADVANCE_TICK);
+DEFINE_MALI_ADD_EVENT(SCHEDULER_NOADVANCE_TICK);
+DEFINE_MALI_ADD_EVENT(SCHEDULER_INSERT_RUNNABLE);
+DEFINE_MALI_ADD_EVENT(SCHEDULER_REMOVE_RUNNABLE);
+DEFINE_MALI_ADD_EVENT(SCHEDULER_ROTATE_RUNNABLE);
+DEFINE_MALI_ADD_EVENT(SCHEDULER_HEAD_RUNNABLE);
+DEFINE_MALI_ADD_EVENT(IDLE_WORKER_BEGIN);
+DEFINE_MALI_ADD_EVENT(IDLE_WORKER_END);
+DEFINE_MALI_ADD_EVENT(GROUP_SYNC_UPDATE_WORKER_BEGIN);
+DEFINE_MALI_ADD_EVENT(GROUP_SYNC_UPDATE_WORKER_END);
+DEFINE_MALI_ADD_EVENT(SLOTS_STATUS_UPDATE_ACK);
 
 DECLARE_EVENT_CLASS(mali_csf_grp_q_template,
 	TP_PROTO(struct kbase_device *kbdev, struct kbase_queue_group *group,
@@ -112,15 +132,33 @@ DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_STOP);
 DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_STARTED);
 DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_STOPPED);
 DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_CLEANED);
+DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_STATUS_UPDATE);
+DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_IDLE_SET);
+DEFINE_MALI_CSF_GRP_EVENT(CSG_SLOT_IDLE_CLEAR);
 DEFINE_MALI_CSF_GRP_EVENT(CSG_PRIO_UPDATE);
 DEFINE_MALI_CSF_GRP_EVENT(CSG_SYNC_UPDATE_INTERRUPT);
 DEFINE_MALI_CSF_GRP_EVENT(CSG_IDLE_INTERRUPT);
+DEFINE_MALI_CSF_GRP_EVENT(CSG_PROGRESS_TIMER_INTERRUPT);
+DEFINE_MALI_CSF_GRP_EVENT(CSG_INTERRUPT_PROCESS_END);
 DEFINE_MALI_CSF_GRP_EVENT(GROUP_SYNC_UPDATE_DONE);
 DEFINE_MALI_CSF_GRP_EVENT(GROUP_DESCHEDULE);
 DEFINE_MALI_CSF_GRP_EVENT(GROUP_SCHEDULE);
 DEFINE_MALI_CSF_GRP_EVENT(GROUP_EVICT_SCHED);
+DEFINE_MALI_CSF_GRP_EVENT(GROUP_INSERT_RUNNABLE);
+DEFINE_MALI_CSF_GRP_EVENT(GROUP_REMOVE_RUNNABLE);
+DEFINE_MALI_CSF_GRP_EVENT(GROUP_ROTATE_RUNNABLE);
+DEFINE_MALI_CSF_GRP_EVENT(GROUP_HEAD_RUNNABLE);
+DEFINE_MALI_CSF_GRP_EVENT(GROUP_INSERT_IDLE_WAIT);
+DEFINE_MALI_CSF_GRP_EVENT(GROUP_REMOVE_IDLE_WAIT);
+DEFINE_MALI_CSF_GRP_EVENT(GROUP_HEAD_IDLE_WAIT);
+DEFINE_MALI_CSF_GRP_EVENT(SCHEDULER_CHECK_PROTM_ENTER);
 DEFINE_MALI_CSF_GRP_EVENT(SCHEDULER_ENTER_PROTM);
+DEFINE_MALI_CSF_GRP_EVENT(SCHEDULER_EXIT_PROTM);
 DEFINE_MALI_CSF_GRP_EVENT(SCHEDULER_TOP_GRP);
+DEFINE_MALI_CSF_GRP_EVENT(SCHEDULER_NONIDLE_OFFSLOT_INC);
+DEFINE_MALI_CSF_GRP_EVENT(SCHEDULER_NONIDLE_OFFSLOT_DEC);
+DEFINE_MALI_CSF_GRP_EVENT(PROTM_EVENT_WORKER_BEGIN);
+DEFINE_MALI_CSF_GRP_EVENT(PROTM_EVENT_WORKER_END);
 
 #undef DEFINE_MALI_CSF_GRP_EVENT
 
@@ -136,10 +174,21 @@ DEFINE_MALI_CSF_GRP_EVENT(SCHEDULER_TOP_GRP);
 DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_START);
 DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_STOP);
 DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_STOP_REQUESTED);
+DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_IGNORED_INTERRUPTS_GROUP_SUSPEND);
 DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_FAULT_INTERRUPT);
 DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_TILER_OOM_INTERRUPT);
+DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_PROTM_PEND_INTERRUPT);
+DEFINE_MALI_CSF_GRP_Q_EVENT(CSI_PROTM_ACK);
 DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_START);
 DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_STOP);
+DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_SYNC_UPDATE);
+DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_SYNC_UPDATE_EVALUATED);
+DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_SYNC_STATUS_WAIT);
+DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_SYNC_CURRENT_VAL);
+DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_SYNC_TEST_VAL);
+DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_SYNC_BLOCKED_REASON);
+DEFINE_MALI_CSF_GRP_Q_EVENT(PROTM_PENDING_SET);
+DEFINE_MALI_CSF_GRP_Q_EVENT(PROTM_PENDING_CLEAR);
 
 #undef DEFINE_MALI_CSF_GRP_Q_EVENT
 
diff --git a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_linux_ktrace_jm.h b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_linux_ktrace_jm.h
index b368a8510ad1..2e88e696a1f5 100644
--- a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_linux_ktrace_jm.h
+++ b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_linux_ktrace_jm.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2014, 2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace.c b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace.c
index 443b048d6d16..9bf86108338f 100644
--- a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace.c
+++ b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -240,7 +240,7 @@ void kbasep_ktrace_dump(struct kbase_device *kbdev)
 	spin_unlock_irqrestore(&kbdev->ktrace.lock, flags);
 }
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 struct trace_seq_state {
 	struct kbase_ktrace_msg trace_buf[KBASE_KTRACE_SIZE];
 	u32 start;
@@ -348,7 +348,7 @@ void kbase_ktrace_debugfs_init(struct kbase_device *kbdev)
 
 #else /* KBASE_KTRACE_TARGET_RBUF  */
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 void kbase_ktrace_debugfs_init(struct kbase_device *kbdev)
 {
 	CSTD_UNUSED(kbdev);
diff --git a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace.h b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace.h
index b7545e08ab28..6cb1ea34b77f 100644
--- a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace.h
+++ b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -65,7 +65,7 @@ void kbase_ktrace_term(struct kbase_device *kbdev);
  */
 void kbase_ktrace_hook_wrapper(void *param);
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 /**
  * kbase_ktrace_debugfs_init - initialize kbase ktrace for debugfs usage, if
  *                             the selected targets support it.
diff --git a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_codes.h b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_codes.h
index c5ca08e0a18b..33098346ebcb 100644
--- a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_codes.h
+++ b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_codes.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2011-2015, 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2015, 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_defs.h b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_defs.h
index accf3cf17236..d8242ad18918 100644
--- a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_defs.h
+++ b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_defs.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -114,7 +114,7 @@ union kbase_ktrace_backend;
 #define KBASE_KTRACE_FLAG_ALL \
 		(KBASE_KTRACE_FLAG_COMMON_ALL | KBASE_KTRACE_FLAG_BACKEND_ALL)
 
-#define KBASE_KTRACE_SHIFT 8 /* 256 entries */
+#define KBASE_KTRACE_SHIFT (9) /* 512 entries */
 #define KBASE_KTRACE_SIZE (1 << KBASE_KTRACE_SHIFT)
 #define KBASE_KTRACE_MASK ((1 << KBASE_KTRACE_SHIFT)-1)
 
diff --git a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_internal.h b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_internal.h
index 1f0fa5ecf9ea..d9bd351dcadc 100644
--- a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_internal.h
+++ b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_internal.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_linux_ktrace.h b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_linux_ktrace.h
index 4a73da50029b..b56dec4b0619 100644
--- a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_linux_ktrace.h
+++ b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_linux_ktrace.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2014, 2018, 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/tests/kutf/Makefile b/drivers/gpu/arm/bifrost/device/Kbuild
similarity index 58%
rename from drivers/gpu/arm/bifrost/tests/kutf/Makefile
rename to drivers/gpu/arm/bifrost/device/Kbuild
index 041f5394bf32..723ffd215696 100644
--- a/drivers/gpu/arm/bifrost/tests/kutf/Makefile
+++ b/drivers/gpu/arm/bifrost/device/Kbuild
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2014-2017, 2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
@@ -18,17 +18,16 @@
 #
 #
 
-# linux build system bootstrap for out-of-tree module
+bifrost_kbase-y += \
+    device/mali_kbase_device.o \
+    device/mali_kbase_device_hw.o
 
-# default to building for the host
-ARCH ?= $(shell uname -m)
-
-ifeq ($(KDIR),)
-$(error Must specify KDIR to point to the kernel to target))
+ifeq ($(CONFIG_MALI_CSF_SUPPORT),y)
+    bifrost_kbase-y += \
+        device/backend/mali_kbase_device_csf.o \
+        device/backend/mali_kbase_device_hw_csf.o
+else
+    bifrost_kbase-y += \
+        device/backend/mali_kbase_device_jm.o \
+        device/backend/mali_kbase_device_hw_jm.o
 endif
-
-all:
-	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) $(SCONS_CONFIGS) EXTRA_CFLAGS=-I$(CURDIR)/../include modules
-
-clean:
-	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) clean
diff --git a/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_csf.c b/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_csf.c
index 39a46276cf22..f97ee356d68e 100644
--- a/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_csf.c
+++ b/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_csf.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -19,8 +19,8 @@
  *
  */
 
-#include "../mali_kbase_device_internal.h"
-#include "../mali_kbase_device.h"
+#include <device/mali_kbase_device_internal.h>
+#include <device/mali_kbase_device.h>
 
 #include <mali_kbase_hwaccess_backend.h>
 #include <mali_kbase_hwcnt_backend_csf_if_fw.h>
@@ -29,40 +29,33 @@
 #include <csf/mali_kbase_csf.h>
 #include <csf/ipa_control/mali_kbase_csf_ipa_control.h>
 
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-#include <mali_kbase_model_linux.h>
-#endif
 
 #include <mali_kbase.h>
 #include <backend/gpu/mali_kbase_irq_internal.h>
 #include <backend/gpu/mali_kbase_pm_internal.h>
 #include <backend/gpu/mali_kbase_js_internal.h>
 #include <backend/gpu/mali_kbase_clk_rate_trace_mgr.h>
+#include <csf/mali_kbase_csf_csg_debugfs.h>
+#include <mali_kbase_hwcnt_virtualizer.h>
+#include <mali_kbase_vinstr.h>
 
-static void kbase_device_csf_firmware_term(struct kbase_device *kbdev)
-{
-	kbase_csf_firmware_term(kbdev);
-}
-
-static int kbase_device_csf_firmware_init(struct kbase_device *kbdev)
+/**
+ * kbase_device_firmware_hwcnt_term - Terminate CSF firmware and HWC
+ *
+ * @kbdev: An instance of the GPU platform device, allocated from the probe
+ *         method of the driver.
+ *
+ * When a kbase driver is removed, terminate CSF firmware and hardware counter
+ * components.
+ */
+static void kbase_device_firmware_hwcnt_term(struct kbase_device *kbdev)
 {
-	int err = kbase_csf_firmware_init(kbdev);
-
-	if (!err) {
-		unsigned long flags;
-
-		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-		kbdev->pm.backend.mcu_state = KBASE_MCU_ON;
-		kbdev->csf.firmware_inited = true;
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+	if (kbdev->csf.firmware_inited) {
+		kbase_vinstr_term(kbdev->vinstr_ctx);
+		kbase_hwcnt_virtualizer_term(kbdev->hwcnt_gpu_virt);
+		kbase_hwcnt_backend_csf_metadata_term(&kbdev->hwcnt_gpu_iface);
+		kbase_csf_firmware_term(kbdev);
 	}
-
-	/* Post firmware init, idle condition is restored. Note this is
-	 * a deferral action step from the late init stage for CSF.
-	 */
-	kbase_pm_context_idle(kbdev);
-
-	return err;
 }
 
 /**
@@ -128,7 +121,9 @@ static int kbase_backend_late_init(struct kbase_device *kbdev)
 
 	init_waitqueue_head(&kbdev->hwaccess.backend.reset_wait);
 
-	/* kbase_pm_context_idle is called after the boot of firmware */
+	kbase_pm_context_idle(kbdev);
+
+	mutex_init(&kbdev->fw_load_lock);
 
 	return 0;
 
@@ -171,6 +166,33 @@ static void kbase_backend_late_term(struct kbase_device *kbdev)
 	kbase_hwaccess_pm_term(kbdev);
 }
 
+/**
+ * kbase_csf_early_init - Early initialization for firmware & scheduler.
+ * @kbdev:	Device pointer
+ *
+ * Return: 0 on success, error code otherwise.
+ */
+static int kbase_csf_early_init(struct kbase_device *kbdev)
+{
+	int err = kbase_csf_firmware_early_init(kbdev);
+
+	if (err)
+		return err;
+
+	err = kbase_csf_scheduler_early_init(kbdev);
+
+	return err;
+}
+
+/**
+ * kbase_csf_early_init - Early termination for firmware & scheduler.
+ * @kbdev:	Device pointer
+ */
+static void kbase_csf_early_term(struct kbase_device *kbdev)
+{
+	kbase_csf_scheduler_early_term(kbdev);
+}
+
 /**
  * kbase_device_hwcnt_backend_csf_if_init - Create hardware counter backend
  *                                          firmware interface.
@@ -214,96 +236,52 @@ static void kbase_device_hwcnt_backend_csf_term(struct kbase_device *kbdev)
 	kbase_hwcnt_backend_csf_destroy(&kbdev->hwcnt_gpu_iface);
 }
 
-/**
- * kbase_device_hwcnt_backend_csf_metadata_init - Initialize hardware counter
- *                                                metadata.
- * @kbdev:	Device pointer
- */
-static int
-kbase_device_hwcnt_backend_csf_metadata_init(struct kbase_device *kbdev)
-{
-	/* For CSF GPUs, HWC metadata needs to query information from CSF
-	 * firmware, so the initialization of HWC metadata only can be called
-	 * after firmware initialized, but firmware initialization depends on
-	 * HWC backend initialization, so we need to separate HWC backend
-	 * metadata initialization from HWC backend initialization.
-	 */
-	return kbase_hwcnt_backend_csf_metadata_init(&kbdev->hwcnt_gpu_iface);
-}
-
-/**
- * kbase_device_hwcnt_backend_csf_metadata_term - Terminate hardware counter
- *                                                metadata.
- * @kbdev:	Device pointer
- */
-static void
-kbase_device_hwcnt_backend_csf_metadata_term(struct kbase_device *kbdev)
-{
-	kbase_hwcnt_backend_csf_metadata_term(&kbdev->hwcnt_gpu_iface);
-}
-
 static const struct kbase_device_init dev_init[] = {
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-	{kbase_gpu_device_create, kbase_gpu_device_destroy,
-			"Dummy model initialization failed"},
-#else
-	{assign_irqs, NULL,
-			"IRQ search failed"},
-	{registers_map, registers_unmap,
-			"Register map failed"},
-#endif
-	{power_control_init, power_control_term,
-			"Power control initialization failed"},
-	{kbase_device_io_history_init, kbase_device_io_history_term,
-			"Register access history initialization failed"},
-	{kbase_device_early_init, kbase_device_early_term,
-			"Early device initialization failed"},
-	{kbase_device_populate_max_freq, NULL,
-			"Populating max frequency failed"},
-	{kbase_device_misc_init, kbase_device_misc_term,
-			"Miscellaneous device initialization failed"},
-	{kbase_device_pcm_dev_init, kbase_device_pcm_dev_term,
-			"Priority control manager initialization failed"},
-	{kbase_ctx_sched_init, kbase_ctx_sched_term,
-			"Context scheduler initialization failed"},
-	{kbase_mem_init, kbase_mem_term,
-			"Memory subsystem initialization failed"},
-	{kbase_csf_protected_memory_init, kbase_csf_protected_memory_term,
-			"Protected memory allocator initialization failed"},
-	{kbase_device_coherency_init, NULL,
-			"Device coherency init failed"},
-	{kbase_protected_mode_init, kbase_protected_mode_term,
-			"Protected mode subsystem initialization failed"},
-	{kbase_device_list_init, kbase_device_list_term,
-			"Device list setup failed"},
-	{kbase_device_timeline_init, kbase_device_timeline_term,
-			"Timeline stream initialization failed"},
-	{kbase_clk_rate_trace_manager_init,
-			kbase_clk_rate_trace_manager_term,
-			"Clock rate trace manager initialization failed"},
-	{kbase_device_hwcnt_backend_csf_if_init,
-			kbase_device_hwcnt_backend_csf_if_term,
-			"GPU hwcnt backend CSF interface creation failed"},
-	{kbase_device_hwcnt_backend_csf_init,
-			kbase_device_hwcnt_backend_csf_term,
-			"GPU hwcnt backend creation failed"},
-	{kbase_device_hwcnt_context_init, kbase_device_hwcnt_context_term,
-			"GPU hwcnt context initialization failed"},
-	{kbase_backend_late_init, kbase_backend_late_term,
-			"Late backend initialization failed"},
-	{kbase_device_csf_firmware_init, kbase_device_csf_firmware_term,
-			"Firmware initialization failed"},
-	{kbase_device_hwcnt_backend_csf_metadata_init,
-			kbase_device_hwcnt_backend_csf_metadata_term,
-			"GPU hwcnt backend metadata creation failed"},
-	{kbase_device_hwcnt_virtualizer_init,
-			kbase_device_hwcnt_virtualizer_term,
-			"GPU hwcnt virtualizer initialization failed"},
-	{kbase_device_vinstr_init, kbase_device_vinstr_term,
-			"Virtual instrumentation initialization failed"},
+	{ assign_irqs, NULL, "IRQ search failed" },
+	{ registers_map, registers_unmap, "Register map failed" },
+	{ power_control_init, power_control_term,
+	  "Power control initialization failed" },
+	{ kbase_device_io_history_init, kbase_device_io_history_term,
+	  "Register access history initialization failed" },
+	{ kbase_device_early_init, kbase_device_early_term,
+	  "Early device initialization failed" },
+	{ kbase_device_populate_max_freq, NULL,
+	  "Populating max frequency failed" },
+	{ kbase_device_misc_init, kbase_device_misc_term,
+	  "Miscellaneous device initialization failed" },
+	{ kbase_device_pcm_dev_init, kbase_device_pcm_dev_term,
+	  "Priority control manager initialization failed" },
+	{ kbase_ctx_sched_init, kbase_ctx_sched_term,
+	  "Context scheduler initialization failed" },
+	{ kbase_mem_init, kbase_mem_term,
+	  "Memory subsystem initialization failed" },
+	{ kbase_csf_protected_memory_init, kbase_csf_protected_memory_term,
+	  "Protected memory allocator initialization failed" },
+	{ kbase_device_coherency_init, NULL, "Device coherency init failed" },
+	{ kbase_protected_mode_init, kbase_protected_mode_term,
+	  "Protected mode subsystem initialization failed" },
+	{ kbase_device_list_init, kbase_device_list_term,
+	  "Device list setup failed" },
+	{ kbase_device_timeline_init, kbase_device_timeline_term,
+	  "Timeline stream initialization failed" },
+	{ kbase_clk_rate_trace_manager_init, kbase_clk_rate_trace_manager_term,
+	  "Clock rate trace manager initialization failed" },
+	{ kbase_device_hwcnt_backend_csf_if_init,
+	  kbase_device_hwcnt_backend_csf_if_term,
+	  "GPU hwcnt backend CSF interface creation failed" },
+	{ kbase_device_hwcnt_backend_csf_init,
+	  kbase_device_hwcnt_backend_csf_term,
+	  "GPU hwcnt backend creation failed" },
+	{ kbase_device_hwcnt_context_init, kbase_device_hwcnt_context_term,
+	  "GPU hwcnt context initialization failed" },
+	{ kbase_backend_late_init, kbase_backend_late_term,
+	  "Late backend initialization failed" },
+	{ kbase_csf_early_init, kbase_csf_early_term,
+	  "Early CSF initialization failed" },
+	{ NULL, kbase_device_firmware_hwcnt_term, NULL },
 #ifdef MALI_KBASE_BUILD
-	{kbase_device_debugfs_init, kbase_device_debugfs_term,
-			"DebugFS initialization failed"},
+	{ kbase_device_debugfs_init, kbase_device_debugfs_term,
+	  "DebugFS initialization failed" },
 	/* Sysfs init needs to happen before registering the device with
 	 * misc_register(), otherwise it causes a race condition between
 	 * registering the device and a uevent event being generated for
@@ -316,12 +294,13 @@ static const struct kbase_device_init dev_init[] = {
 	 * paragraph that starts with "Word of warning", currently the
 	 * second-last paragraph.
 	 */
-	{kbase_sysfs_init, kbase_sysfs_term,
-			"SysFS group creation failed"},
-	{kbase_device_misc_register, kbase_device_misc_deregister,
-			"Misc device registration failed"},
-	{kbase_gpuprops_populate_user_buffer, kbase_gpuprops_free_user_buffer,
-			"GPU property population failed"},
+	{ kbase_sysfs_init, kbase_sysfs_term, "SysFS group creation failed" },
+	{ kbase_device_misc_register, kbase_device_misc_deregister,
+	  "Misc device registration failed" },
+	{ kbase_gpuprops_populate_user_buffer, kbase_gpuprops_free_user_buffer,
+	  "GPU property population failed" },
+	{ kbase_device_late_init, kbase_device_late_term,
+	  "Late device initialization failed" },
 #endif
 };
 
@@ -352,14 +331,134 @@ int kbase_device_init(struct kbase_device *kbdev)
 	kbase_disjoint_init(kbdev);
 
 	for (i = 0; i < ARRAY_SIZE(dev_init); i++) {
-		err = dev_init[i].init(kbdev);
-		if (err) {
-			dev_err(kbdev->dev, "%s error = %d\n",
-						dev_init[i].err_mes, err);
-			kbase_device_term_partial(kbdev, i);
-			break;
+		if (dev_init[i].init) {
+			err = dev_init[i].init(kbdev);
+			if (err) {
+				dev_err(kbdev->dev, "%s error = %d\n",
+					dev_init[i].err_mes, err);
+				kbase_device_term_partial(kbdev, i);
+				break;
+			}
 		}
 	}
 
 	return err;
 }
+
+/**
+ * kbase_device_hwcnt_csf_deferred_init - Initialize CSF deferred HWC components
+ *
+ * @kbdev: An instance of the GPU platform device, allocated from the probe
+ *         method of the driver.
+ *
+ * Hardware counter components depending on firmware are initialized after CSF
+ * firmware is loaded.
+ *
+ * @return 0 on success. An error code on failure.
+ */
+static int kbase_device_hwcnt_csf_deferred_init(struct kbase_device *kbdev)
+{
+	int ret = 0;
+
+	/* For CSF GPUs, HWC metadata needs to query information from CSF
+	 * firmware, so the initialization of HWC metadata only can be called
+	 * after firmware initialized, but firmware initialization depends on
+	 * HWC backend initialization, so we need to separate HWC backend
+	 * metadata initialization from HWC backend initialization.
+	 */
+	ret = kbase_hwcnt_backend_csf_metadata_init(&kbdev->hwcnt_gpu_iface);
+	if (ret) {
+		dev_err(kbdev->dev,
+			"GPU hwcnt backend metadata creation failed");
+		return ret;
+	}
+
+	ret = kbase_hwcnt_virtualizer_init(
+		kbdev->hwcnt_gpu_ctx,
+		KBASE_HWCNT_GPU_VIRTUALIZER_DUMP_THRESHOLD_NS,
+		&kbdev->hwcnt_gpu_virt);
+	if (ret) {
+		dev_err(kbdev->dev,
+			"GPU hwcnt virtualizer initialization failed");
+		goto virt_fail;
+	}
+
+	ret = kbase_vinstr_init(kbdev->hwcnt_gpu_virt, &kbdev->vinstr_ctx);
+	if (ret) {
+		dev_err(kbdev->dev,
+			"Virtual instrumentation initialization failed");
+		goto vinstr_fail;
+	}
+
+	return ret;
+
+vinstr_fail:
+	kbase_hwcnt_virtualizer_term(kbdev->hwcnt_gpu_virt);
+
+virt_fail:
+	kbase_hwcnt_backend_csf_metadata_term(&kbdev->hwcnt_gpu_iface);
+	return ret;
+}
+
+/**
+ * kbase_csf_firmware_deferred_init - Load and initialize CSF firmware
+ *
+ * @kbdev: An instance of the GPU platform device, allocated from the probe
+ *         method of the driver.
+ *
+ * Called when a device file is opened for the first time.
+ * To meet Android GKI vendor guideline, firmware load is deferred at
+ * the time when @ref kbase_open is called for the first time.
+ *
+ * @return 0 on success. An error code on failure.
+ */
+static int kbase_csf_firmware_deferred_init(struct kbase_device *kbdev)
+{
+	int err = 0;
+
+	lockdep_assert_held(&kbdev->fw_load_lock);
+
+	kbase_pm_context_active(kbdev);
+
+	err = kbase_csf_firmware_init(kbdev);
+	if (!err) {
+		unsigned long flags;
+
+		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+		kbdev->pm.backend.mcu_state = KBASE_MCU_ON;
+		kbdev->csf.firmware_inited = true;
+		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+	} else {
+		dev_err(kbdev->dev, "Firmware initialization failed");
+	}
+
+	kbase_pm_context_idle(kbdev);
+
+	return err;
+}
+
+int kbase_device_firmware_init_once(struct kbase_device *kbdev)
+{
+	int ret = 0;
+
+	mutex_lock(&kbdev->fw_load_lock);
+
+	if (!kbdev->csf.firmware_inited) {
+		ret = kbase_csf_firmware_deferred_init(kbdev);
+		if (ret)
+			goto out;
+
+		ret = kbase_device_hwcnt_csf_deferred_init(kbdev);
+		if (ret) {
+			kbase_csf_firmware_term(kbdev);
+			goto out;
+		}
+
+		kbase_csf_debugfs_init(kbdev);
+	}
+
+out:
+	mutex_unlock(&kbdev->fw_load_lock);
+
+	return ret;
+}
diff --git a/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_hw_csf.c b/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_hw_csf.c
index 259e42a6d3ea..8427edb0dbb1 100644
--- a/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_hw_csf.c
+++ b/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_hw_csf.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
@@ -53,7 +53,7 @@ static void kbase_report_gpu_fault(struct kbase_device *kbdev, u32 status,
 	kbase_mmu_gpu_fault_interrupt(kbdev, status, as_nr, address, as_valid);
 }
 
-static bool kbase_gpu_fault_interrupt(struct kbase_device *kbdev)
+static void kbase_gpu_fault_interrupt(struct kbase_device *kbdev)
 {
 	const u32 status = kbase_reg_read(kbdev,
 			GPU_CONTROL_REG(GPU_FAULTSTATUS));
@@ -62,7 +62,6 @@ static bool kbase_gpu_fault_interrupt(struct kbase_device *kbdev)
 			GPU_FAULTSTATUS_JASID_SHIFT;
 	bool bus_fault = (status & GPU_FAULTSTATUS_EXCEPTION_TYPE_MASK) ==
 			GPU_FAULTSTATUS_EXCEPTION_TYPE_GPU_BUS_FAULT;
-	bool clear_gpu_fault = true;
 
 	if (bus_fault) {
 		/* If as_valid, reset gpu when ASID is for MCU. */
@@ -76,21 +75,18 @@ static bool kbase_gpu_fault_interrupt(struct kbase_device *kbdev)
 		} else {
 			/* Handle Bus fault */
 			if (kbase_mmu_bus_fault_interrupt(kbdev, status, as_nr))
-				clear_gpu_fault = false;
+				dev_warn(kbdev->dev,
+					 "fail to handle GPU bus fault ...\n");
 		}
 	} else
 		kbase_report_gpu_fault(kbdev, status, as_nr, as_valid);
-
-	return clear_gpu_fault;
 }
 
 void kbase_gpu_interrupt(struct kbase_device *kbdev, u32 val)
 {
-	bool clear_gpu_fault = false;
-
 	KBASE_KTRACE_ADD(kbdev, CORE_GPU_IRQ, NULL, val);
 	if (val & GPU_FAULT)
-		clear_gpu_fault = kbase_gpu_fault_interrupt(kbdev);
+		kbase_gpu_fault_interrupt(kbdev);
 
 	if (val & GPU_PROTECTED_FAULT) {
 		struct kbase_csf_scheduler *scheduler = &kbdev->csf.scheduler;
@@ -162,14 +158,5 @@ void kbase_gpu_interrupt(struct kbase_device *kbdev, u32 val)
 			kbase_pm_power_changed(kbdev);
 	}
 
-	if (clear_gpu_fault) {
-		unsigned long flags;
-
-		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-		kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
-				GPU_COMMAND_CLEAR_FAULT);
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-	}
-
 	KBASE_KTRACE_ADD(kbdev, CORE_GPU_IRQ_DONE, NULL, val);
 }
diff --git a/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_hw_jm.c b/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_hw_jm.c
index 33ebe0901fe2..c4e6eb8a680c 100644
--- a/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_hw_jm.c
+++ b/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_hw_jm.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_jm.c b/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_jm.c
index 4f5de18d3571..aae11a5ec659 100644
--- a/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_jm.c
+++ b/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_jm.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -19,18 +19,15 @@
  *
  */
 
-#include "../mali_kbase_device_internal.h"
-#include "../mali_kbase_device.h"
-#include "../mali_kbase_hwaccess_instr.h"
+#include <device/mali_kbase_device_internal.h>
+#include <device/mali_kbase_device.h>
+#include <mali_kbase_hwaccess_instr.h>
 
 #include <mali_kbase_config_defaults.h>
 #include <mali_kbase_hwaccess_backend.h>
 #include <mali_kbase_ctx_sched.h>
 #include <mali_kbase_reset_gpu.h>
 
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-#include <mali_kbase_model_linux.h>
-#endif
 
 #ifdef CONFIG_MALI_ARBITER_SUPPORT
 #include <arbiter/mali_kbase_arbiter_pm.h>
@@ -105,6 +102,8 @@ static int kbase_backend_late_init(struct kbase_device *kbdev)
 	/* Idle the GPU and/or cores, if the policy wants it to */
 	kbase_pm_context_idle(kbdev);
 
+	mutex_init(&kbdev->fw_load_lock);
+
 	return 0;
 
 fail_update_l2_features:
@@ -157,63 +156,54 @@ static void kbase_device_hwcnt_backend_jm_term(struct kbase_device *kbdev)
 }
 
 static const struct kbase_device_init dev_init[] = {
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-	{kbase_gpu_device_create, kbase_gpu_device_destroy,
-			"Dummy model initialization failed"},
-#else
-	{assign_irqs, NULL,
-			"IRQ search failed"},
-	{registers_map, registers_unmap,
-			"Register map failed"},
-#endif
-	{kbase_device_io_history_init, kbase_device_io_history_term,
-			"Register access history initialization failed"},
-	{kbase_device_pm_init, kbase_device_pm_term,
-			"Power management initialization failed"},
-	{kbase_device_early_init, kbase_device_early_term,
-			"Early device initialization failed"},
-	{kbase_device_populate_max_freq, NULL,
-			"Populating max frequency failed"},
-	{kbase_device_misc_init, kbase_device_misc_term,
-			"Miscellaneous device initialization failed"},
-	{kbase_device_pcm_dev_init, kbase_device_pcm_dev_term,
-			"Priority control manager initialization failed"},
-	{kbase_ctx_sched_init, kbase_ctx_sched_term,
-			"Context scheduler initialization failed"},
-	{kbase_mem_init, kbase_mem_term,
-			"Memory subsystem initialization failed"},
-	{kbase_device_coherency_init, NULL,
-			"Device coherency init failed"},
-	{kbase_protected_mode_init, kbase_protected_mode_term,
-			"Protected mode subsystem initialization failed"},
-	{kbase_device_list_init, kbase_device_list_term,
-			"Device list setup failed"},
-	{kbasep_js_devdata_init, kbasep_js_devdata_term,
-			"Job JS devdata initialization failed"},
-	{kbase_device_timeline_init, kbase_device_timeline_term,
-			"Timeline stream initialization failed"},
-	{kbase_clk_rate_trace_manager_init,
-			kbase_clk_rate_trace_manager_term,
-			"Clock rate trace manager initialization failed"},
-	{kbase_instr_backend_init, kbase_instr_backend_term,
-			"Instrumentation backend initialization failed"},
-	{kbase_device_hwcnt_backend_jm_init,
-			kbase_device_hwcnt_backend_jm_term,
-			"GPU hwcnt backend creation failed"},
-	{kbase_device_hwcnt_context_init, kbase_device_hwcnt_context_term,
-			"GPU hwcnt context initialization failed"},
-	{kbase_device_hwcnt_virtualizer_init,
-			kbase_device_hwcnt_virtualizer_term,
-			"GPU hwcnt virtualizer initialization failed"},
-	{kbase_device_vinstr_init, kbase_device_vinstr_term,
-			"Virtual instrumentation initialization failed"},
-	{kbase_backend_late_init, kbase_backend_late_term,
-			"Late backend initialization failed"},
+	{ assign_irqs, NULL, "IRQ search failed" },
+	{ registers_map, registers_unmap, "Register map failed" },
+	{ kbase_device_io_history_init, kbase_device_io_history_term,
+	  "Register access history initialization failed" },
+	{ kbase_device_pm_init, kbase_device_pm_term,
+	  "Power management initialization failed" },
+	{ kbase_device_early_init, kbase_device_early_term,
+	  "Early device initialization failed" },
+	{ kbase_device_populate_max_freq, NULL,
+	  "Populating max frequency failed" },
+	{ kbase_device_misc_init, kbase_device_misc_term,
+	  "Miscellaneous device initialization failed" },
+	{ kbase_device_pcm_dev_init, kbase_device_pcm_dev_term,
+	  "Priority control manager initialization failed" },
+	{ kbase_ctx_sched_init, kbase_ctx_sched_term,
+	  "Context scheduler initialization failed" },
+	{ kbase_mem_init, kbase_mem_term,
+	  "Memory subsystem initialization failed" },
+	{ kbase_device_coherency_init, NULL, "Device coherency init failed" },
+	{ kbase_protected_mode_init, kbase_protected_mode_term,
+	  "Protected mode subsystem initialization failed" },
+	{ kbase_device_list_init, kbase_device_list_term,
+	  "Device list setup failed" },
+	{ kbasep_js_devdata_init, kbasep_js_devdata_term,
+	  "Job JS devdata initialization failed" },
+	{ kbase_device_timeline_init, kbase_device_timeline_term,
+	  "Timeline stream initialization failed" },
+	{ kbase_clk_rate_trace_manager_init, kbase_clk_rate_trace_manager_term,
+	  "Clock rate trace manager initialization failed" },
+	{ kbase_instr_backend_init, kbase_instr_backend_term,
+	  "Instrumentation backend initialization failed" },
+	{ kbase_device_hwcnt_backend_jm_init,
+	  kbase_device_hwcnt_backend_jm_term,
+	  "GPU hwcnt backend creation failed" },
+	{ kbase_device_hwcnt_context_init, kbase_device_hwcnt_context_term,
+	  "GPU hwcnt context initialization failed" },
+	{ kbase_device_hwcnt_virtualizer_init,
+	  kbase_device_hwcnt_virtualizer_term,
+	  "GPU hwcnt virtualizer initialization failed" },
+	{ kbase_device_vinstr_init, kbase_device_vinstr_term,
+	  "Virtual instrumentation initialization failed" },
+	{ kbase_backend_late_init, kbase_backend_late_term,
+	  "Late backend initialization failed" },
 #ifdef MALI_KBASE_BUILD
-	{kbase_debug_job_fault_dev_init, kbase_debug_job_fault_dev_term,
-			"Job fault debug initialization failed"},
-	{kbase_device_debugfs_init, kbase_device_debugfs_term,
-			"DebugFS initialization failed"},
+	{ kbase_debug_job_fault_dev_init, kbase_debug_job_fault_dev_term,
+	  "Job fault debug initialization failed" },
+	{ kbase_device_debugfs_init, kbase_device_debugfs_term,
+	  "DebugFS initialization failed" },
 	/* Sysfs init needs to happen before registering the device with
 	 * misc_register(), otherwise it causes a race condition between
 	 * registering the device and a uevent event being generated for
@@ -226,14 +216,15 @@ static const struct kbase_device_init dev_init[] = {
 	 * paragraph that starts with "Word of warning", currently the
 	 * second-last paragraph.
 	 */
-	{kbase_sysfs_init, kbase_sysfs_term, "SysFS group creation failed"},
-	{kbase_device_misc_register, kbase_device_misc_deregister,
-			"Misc device registration failed"},
-	{kbase_gpuprops_populate_user_buffer, kbase_gpuprops_free_user_buffer,
-			"GPU property population failed"},
+	{ kbase_sysfs_init, kbase_sysfs_term, "SysFS group creation failed" },
+	{ kbase_device_misc_register, kbase_device_misc_deregister,
+	  "Misc device registration failed" },
+	{ kbase_gpuprops_populate_user_buffer, kbase_gpuprops_free_user_buffer,
+	  "GPU property population failed" },
 #endif
-	{kbase_dummy_job_wa_load, kbase_dummy_job_wa_cleanup,
-			"Dummy job workaround load failed"},
+	{ NULL, kbase_dummy_job_wa_cleanup, NULL },
+	{ kbase_device_late_init, kbase_device_late_term,
+	  "Late device initialization failed" },
 };
 
 static void kbase_device_term_partial(struct kbase_device *kbdev,
@@ -263,15 +254,34 @@ int kbase_device_init(struct kbase_device *kbdev)
 	kbase_disjoint_init(kbdev);
 
 	for (i = 0; i < ARRAY_SIZE(dev_init); i++) {
-		err = dev_init[i].init(kbdev);
-		if (err) {
-			if (err != -EPROBE_DEFER)
-				dev_err(kbdev->dev, "%s error = %d\n",
+		if (dev_init[i].init) {
+			err = dev_init[i].init(kbdev);
+			if (err) {
+				if (err != -EPROBE_DEFER)
+					dev_err(kbdev->dev, "%s error = %d\n",
 						dev_init[i].err_mes, err);
-			kbase_device_term_partial(kbdev, i);
-			break;
+				kbase_device_term_partial(kbdev, i);
+				break;
+			}
 		}
 	}
 
 	return err;
 }
+
+int kbase_device_firmware_init_once(struct kbase_device *kbdev)
+{
+	int ret = 0;
+
+	mutex_lock(&kbdev->fw_load_lock);
+
+	if (!kbdev->dummy_job_wa_loaded) {
+		ret = kbase_dummy_job_wa_load(kbdev);
+		if (!ret)
+			kbdev->dummy_job_wa_loaded = true;
+	}
+
+	mutex_unlock(&kbdev->fw_load_lock);
+
+	return ret;
+}
diff --git a/drivers/gpu/arm/bifrost/device/mali_kbase_device.c b/drivers/gpu/arm/bifrost/device/mali_kbase_device.c
index 5e900d0fd0d4..1ebd8aa14f3a 100644
--- a/drivers/gpu/arm/bifrost/device/mali_kbase_device.c
+++ b/drivers/gpu/arm/bifrost/device/mali_kbase_device.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
@@ -30,6 +30,7 @@
 #include <linux/module.h>
 #include <linux/of_platform.h>
 #include <linux/types.h>
+#include <linux/oom.h>
 
 #include <mali_kbase.h>
 #include <mali_kbase_defs.h>
@@ -110,7 +111,7 @@ int kbase_device_pcm_dev_init(struct kbase_device *const kbdev)
 {
 	int err = 0;
 
-#ifdef CONFIG_OF
+#if IS_ENABLED(CONFIG_OF)
 	struct device_node *prio_ctrl_node;
 
 	/* Check to see whether or not a platform specific priority control manager
@@ -155,16 +156,70 @@ void kbase_device_pcm_dev_term(struct kbase_device *const kbdev)
 		module_put(kbdev->pcm_dev->owner);
 }
 
+#define KBASE_PAGES_TO_KIB(pages) (((unsigned int)pages) << (PAGE_SHIFT - 10))
+
+/**
+ * mali_oom_notifier_handler - Mali driver out-of-memory handler
+ *
+ * @nb - notifier block - used to retrieve kbdev pointer
+ * @action - action (unused)
+ * @data - data pointer (unused)
+ * This function simply lists memory usage by the Mali driver, per GPU device,
+ * for diagnostic purposes.
+ */
+static int mali_oom_notifier_handler(struct notifier_block *nb,
+				     unsigned long action, void *data)
+{
+	struct kbase_device *kbdev;
+	struct kbase_context *kctx = NULL;
+	unsigned long kbdev_alloc_total;
+
+	if (WARN_ON(nb == NULL))
+		return NOTIFY_BAD;
+
+	kbdev = container_of(nb, struct kbase_device, oom_notifier_block);
+
+	kbdev_alloc_total =
+		KBASE_PAGES_TO_KIB(atomic_read(&(kbdev->memdev.used_pages)));
+
+	dev_err(kbdev->dev, "OOM notifier: dev %s  %lu kB\n", kbdev->devname,
+		kbdev_alloc_total);
+
+	mutex_lock(&kbdev->kctx_list_lock);
+
+	list_for_each_entry (kctx, &kbdev->kctx_list, kctx_list_link) {
+		struct pid *pid_struct;
+		struct task_struct *task;
+		unsigned long task_alloc_total =
+			KBASE_PAGES_TO_KIB(atomic_read(&(kctx->used_pages)));
+
+		rcu_read_lock();
+		pid_struct = find_get_pid(kctx->pid);
+		task = pid_task(pid_struct, PIDTYPE_PID);
+
+		dev_err(kbdev->dev,
+			"OOM notifier: tsk %s  tgid (%u)  pid (%u) %lu kB\n",
+			task ? task->comm : "[null task]", kctx->tgid,
+			kctx->pid, task_alloc_total);
+
+		put_pid(pid_struct);
+		rcu_read_unlock();
+	}
+
+	mutex_unlock(&kbdev->kctx_list_lock);
+	return NOTIFY_OK;
+}
+
 int kbase_device_misc_init(struct kbase_device * const kbdev)
 {
 	int err;
-#ifdef CONFIG_ARM64
+#if IS_ENABLED(CONFIG_ARM64)
 	struct device_node *np = NULL;
 #endif /* CONFIG_ARM64 */
 
 	spin_lock_init(&kbdev->mmu_mask_change);
 	mutex_init(&kbdev->mmu_hw_mutex);
-#ifdef CONFIG_ARM64
+#if IS_ENABLED(CONFIG_ARM64)
 	kbdev->cci_snoop_enabled = false;
 	np = kbdev->dev->of_node;
 	if (np != NULL) {
@@ -243,8 +298,15 @@ int kbase_device_misc_init(struct kbase_device * const kbdev)
 	mutex_init(&kbdev->kctx_list_lock);
 	INIT_LIST_HEAD(&kbdev->kctx_list);
 
-	spin_lock_init(&kbdev->hwaccess_lock);
+	dev_dbg(kbdev->dev, "Registering mali_oom_notifier_handlern");
+	kbdev->oom_notifier_block.notifier_call = mali_oom_notifier_handler;
+	err = register_oom_notifier(&kbdev->oom_notifier_block);
 
+	if (err) {
+		dev_err(kbdev->dev,
+			"Unable to register OOM notifier for Mali - but will continue\n");
+		kbdev->oom_notifier_block.notifier_call = NULL;
+	}
 	return 0;
 
 term_as:
@@ -267,6 +329,9 @@ void kbase_device_misc_term(struct kbase_device *kbdev)
 	kbase_ktrace_term(kbdev);
 
 	kbase_device_all_as_term(kbdev);
+
+	if (kbdev->oom_notifier_block.notifier_call)
+		unregister_oom_notifier(&kbdev->oom_notifier_block);
 }
 
 void kbase_device_free(struct kbase_device *kbdev)
@@ -405,6 +470,10 @@ int kbase_device_early_init(struct kbase_device *kbdev)
 	/* We're done accessing the GPU registers for now. */
 	kbase_pm_register_access_disable(kbdev);
 
+	/* This spinlock has to be initialized before installing interrupt
+	 * handlers that require to hold it to process interrupts.
+	 */
+	spin_lock_init(&kbdev->hwaccess_lock);
 #ifdef CONFIG_MALI_ARBITER_SUPPORT
 	if (kbdev->arb.arb_if)
 		err = kbase_arbiter_pm_install_interrupts(kbdev);
@@ -439,3 +508,17 @@ void kbase_device_early_term(struct kbase_device *kbdev)
 	kbase_pm_runtime_term(kbdev);
 	kbasep_platform_device_term(kbdev);
 }
+
+int kbase_device_late_init(struct kbase_device *kbdev)
+{
+	int err;
+
+	err = kbasep_platform_device_late_init(kbdev);
+
+	return err;
+}
+
+void kbase_device_late_term(struct kbase_device *kbdev)
+{
+	kbasep_platform_device_late_term(kbdev);
+}
diff --git a/drivers/gpu/arm/bifrost/device/mali_kbase_device.h b/drivers/gpu/arm/bifrost/device/mali_kbase_device.h
index 3a774fc3f9b0..517c16b15fca 100644
--- a/drivers/gpu/arm/bifrost/device/mali_kbase_device.h
+++ b/drivers/gpu/arm/bifrost/device/mali_kbase_device.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -46,6 +46,19 @@ void kbase_device_put_list(const struct list_head *dev_list);
  */
 void kbase_increment_device_id(void);
 
+/**
+ * kbase_device_firmware_init_once - Initialize firmware and HWC
+ *
+ * @kbdev: An instance of the GPU platform device, allocated from the probe
+ *         method of the driver.
+ *
+ * When a device file is opened for the first time,
+ * load firmware and initialize hardware counter components.
+ *
+ * @return 0 on success. An error code on failure.
+ */
+int kbase_device_firmware_init_once(struct kbase_device *kbdev);
+
 /**
  * kbase_device_init - Device initialisation.
  *
diff --git a/drivers/gpu/arm/bifrost/device/mali_kbase_device_hw.c b/drivers/gpu/arm/bifrost/device/mali_kbase_device_hw.c
index 4097296952d8..762483123b61 100644
--- a/drivers/gpu/arm/bifrost/device/mali_kbase_device_hw.c
+++ b/drivers/gpu/arm/bifrost/device/mali_kbase_device_hw.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2014-2016, 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2016, 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -27,7 +27,7 @@
 #include <mali_kbase_reset_gpu.h>
 #include <mmu/mali_kbase_mmu.h>
 
-#if !defined(CONFIG_MALI_BIFROST_NO_MALI)
+#if !IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI)
 void kbase_reg_write(struct kbase_device *kbdev, u32 offset, u32 value)
 {
 	KBASE_DEBUG_ASSERT(kbdev->pm.backend.gpu_powered);
@@ -35,7 +35,7 @@ void kbase_reg_write(struct kbase_device *kbdev, u32 offset, u32 value)
 
 	writel(value, kbdev->reg + offset);
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 	if (unlikely(kbdev->io_history.enabled))
 		kbase_io_history_add(&kbdev->io_history, kbdev->reg + offset,
 				value, 1);
@@ -54,7 +54,7 @@ u32 kbase_reg_read(struct kbase_device *kbdev, u32 offset)
 
 	val = readl(kbdev->reg + offset);
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 	if (unlikely(kbdev->io_history.enabled))
 		kbase_io_history_add(&kbdev->io_history, kbdev->reg + offset,
 				val, 0);
@@ -74,7 +74,7 @@ bool kbase_is_gpu_removed(struct kbase_device *kbdev)
 
 	return val == 0;
 }
-#endif /* !defined(CONFIG_MALI_BIFROST_NO_MALI) */
+#endif /* !IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI) */
 
 void kbase_gpu_start_cache_clean_nolock(struct kbase_device *kbdev)
 {
diff --git a/drivers/gpu/arm/bifrost/device/mali_kbase_device_internal.h b/drivers/gpu/arm/bifrost/device/mali_kbase_device_internal.h
index 067f33ce0528..d422407901e3 100644
--- a/drivers/gpu/arm/bifrost/device/mali_kbase_device_internal.h
+++ b/drivers/gpu/arm/bifrost/device/mali_kbase_device_internal.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -72,3 +72,17 @@ int kbase_device_early_init(struct kbase_device *kbdev);
  * @kbdev:	Device pointer
  */
 void kbase_device_early_term(struct kbase_device *kbdev);
+
+/**
+ * kbase_device_late_init - Complete any device-specific initialization.
+ * @kbdev:	Device pointer
+ *
+ * Return: 0 on success, or an error code on failure.
+ */
+int kbase_device_late_init(struct kbase_device *kbdev);
+
+/**
+ * kbase_device_late_term - Complete any device-specific termination.
+ * @kbdev:	Device pointer
+ */
+void kbase_device_late_term(struct kbase_device *kbdev);
diff --git a/drivers/base/arm/memory_group_manager/Kconfig b/drivers/gpu/arm/bifrost/gpu/Kbuild
similarity index 66%
rename from drivers/base/arm/memory_group_manager/Kconfig
rename to drivers/gpu/arm/bifrost/gpu/Kbuild
index de698fa1eb4c..f3a48caf6b2c 100644
--- a/drivers/base/arm/memory_group_manager/Kconfig
+++ b/drivers/gpu/arm/bifrost/gpu/Kbuild
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2012, 2020-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
@@ -18,10 +18,10 @@
 #
 #
 
+bifrost_kbase-y += gpu/mali_kbase_gpu.o
 
-config MALI_MEMORY_GROUP_MANAGER
-	tristate "MALI_MEMORY_GROUP_MANAGER"
-	help
-	  This option enables an example implementation of a memory group manager
-	  for allocation and release of pages for memory pools managed by Mali GPU
-	  device drivers.
+ifeq ($(CONFIG_MALI_CSF_SUPPORT),y)
+    bifrost_kbase-y += gpu/backend/mali_kbase_gpu_fault_csf.o
+else
+    bifrost_kbase-y += gpu/backend/mali_kbase_gpu_fault_jm.o
+endif
diff --git a/drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_fault_csf.c b/drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_fault_csf.c
index ab0e3264615c..f6784f1647fc 100644
--- a/drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_fault_csf.c
+++ b/drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_fault_csf.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -21,7 +21,7 @@
 
 #include <mali_kbase.h>
 #include <uapi/gpu/arm/bifrost/csf/mali_gpu_csf_registers.h>
-#include "../mali_kbase_gpu_fault.h"
+#include <gpu/mali_kbase_gpu_fault.h>
 
 const char *kbase_gpu_exception_name(u32 const exception_code)
 {
diff --git a/drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_fault_jm.c b/drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_fault_jm.c
index 110e5b3244b7..37015ccacd7c 100644
--- a/drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_fault_jm.c
+++ b/drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_fault_jm.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -21,7 +21,7 @@
 
 #include <mali_kbase.h>
 
-#include "../mali_kbase_gpu_fault.h"
+#include <gpu/mali_kbase_gpu_fault.h>
 
 const char *kbase_gpu_exception_name(u32 const exception_code)
 {
diff --git a/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu.c b/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu.c
index 92aa59373bcd..8a84ef54100a 100644
--- a/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu.c
+++ b/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_fault.h b/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_fault.h
index 9f4dc66bed94..d1e9f770384b 100644
--- a/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_fault.h
+++ b/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_fault.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_regmap.h b/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_regmap.h
index 8e5941ed3f3f..2da05a8bf044 100644
--- a/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_regmap.h
+++ b/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_regmap.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/ipa/Kbuild b/drivers/gpu/arm/bifrost/ipa/Kbuild
index 4faa325732c7..0be664c47b54 100644
--- a/drivers/gpu/arm/bifrost/ipa/Kbuild
+++ b/drivers/gpu/arm/bifrost/ipa/Kbuild
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2016-2018, 2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2016-2018, 2020-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
@@ -19,17 +19,17 @@
 #
 
 bifrost_kbase-y += \
-	ipa/mali_kbase_ipa_simple.o \
-	ipa/mali_kbase_ipa.o
+    ipa/mali_kbase_ipa_simple.o \
+    ipa/mali_kbase_ipa.o
 
 bifrost_kbase-$(CONFIG_DEBUG_FS) += ipa/mali_kbase_ipa_debugfs.o
 
 ifeq ($(MALI_USE_CSF),1)
-	bifrost_kbase-y += \
-		ipa/backend/mali_kbase_ipa_counter_csf.o \
-		ipa/backend/mali_kbase_ipa_counter_common_csf.o
+    bifrost_kbase-y += \
+        ipa/backend/mali_kbase_ipa_counter_csf.o \
+        ipa/backend/mali_kbase_ipa_counter_common_csf.o
 else
-	bifrost_kbase-y += \
-		ipa/backend/mali_kbase_ipa_counter_jm.o \
-		ipa/backend/mali_kbase_ipa_counter_common_jm.o
+    bifrost_kbase-y += \
+        ipa/backend/mali_kbase_ipa_counter_jm.o \
+        ipa/backend/mali_kbase_ipa_counter_common_jm.o
 endif
diff --git a/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_csf.c b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_csf.c
index 89bba49a7c98..81dc56b3d688 100644
--- a/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_csf.c
+++ b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_csf.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_csf.h b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_csf.h
index 8e299314d7de..37d2efc59fcc 100644
--- a/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_csf.h
+++ b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_csf.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_jm.c b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_jm.c
index 076dcd0266df..4737b0eb3dd1 100644
--- a/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_jm.c
+++ b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_jm.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2017-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2017-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_jm.h b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_jm.h
index 24602beed3d2..3486a9be1820 100644
--- a/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_jm.h
+++ b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_jm.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2017-2018, 2020-2021 ARM Limited. All rights reserved.
@@ -41,7 +41,8 @@
 
 struct kbase_ipa_model_vinstr_data;
 
-typedef u32 (*kbase_ipa_get_active_cycles_callback)(struct kbase_ipa_model_vinstr_data *);
+typedef u32
+kbase_ipa_get_active_cycles_callback(struct kbase_ipa_model_vinstr_data *);
 
 /**
  * struct kbase_ipa_model_vinstr_data - IPA context per device
@@ -73,7 +74,7 @@ struct kbase_ipa_model_vinstr_data {
 	s32 group_values[KBASE_IPA_MAX_GROUP_DEF_NUM];
 	const struct kbase_ipa_group *groups_def;
 	size_t groups_def_num;
-	kbase_ipa_get_active_cycles_callback get_active_cycles;
+	kbase_ipa_get_active_cycles_callback *get_active_cycles;
 	struct kbase_hwcnt_virtualizer_client *hvirt_cli;
 	struct kbase_hwcnt_dump_buffer dump_buf;
 	s32 reference_voltage;
@@ -215,7 +216,7 @@ void kbase_ipa_vinstr_reset_data(struct kbase_ipa_model *model);
 int kbase_ipa_vinstr_common_model_init(struct kbase_ipa_model *model,
 				       const struct kbase_ipa_group *ipa_groups_def,
 				       size_t ipa_group_size,
-				       kbase_ipa_get_active_cycles_callback get_active_cycles,
+				       kbase_ipa_get_active_cycles_callback *get_active_cycles,
 				       s32 reference_voltage);
 
 /**
diff --git a/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_csf.c b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_csf.c
index 9326b0195544..1852c3c2b5d1 100644
--- a/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_csf.c
+++ b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_csf.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
@@ -24,11 +24,15 @@
 
 /* MEMSYS counter block offsets */
 #define L2_RD_MSG_IN            (16)
+#define L2_WR_MSG_IN            (18)
+#define L2_READ_LOOKUP          (26)
 #define L2_EXT_WRITE_NOSNP_FULL (43)
 
 /* SC counter block offsets */
 #define FRAG_QUADS_EZS_UPDATE   (13)
+#define FULL_QUAD_WARPS         (21)
 #define EXEC_INSTR_FMA          (27)
+#define EXEC_INSTR_CVT          (28)
 #define TEX_FILT_NUM_OPS        (39)
 #define LS_MEM_READ_SHORT       (45)
 #define LS_MEM_WRITE_SHORT      (47)
@@ -38,6 +42,7 @@
 #define IDVS_POS_SHAD_STALL     (23)
 #define PREFETCH_STALL          (25)
 #define VFETCH_POS_READ_WAIT    (29)
+#define VFETCH_VERTEX_WAIT      (30)
 #define IDVS_VAR_SHAD_STALL     (38)
 
 #define COUNTER_DEF(cnt_name, coeff, cnt_idx, block_type)	\
@@ -60,9 +65,9 @@
 #define TILER_COUNTER_DEF(cnt_name, coeff, cnt_idx)	\
 	COUNTER_DEF(cnt_name, coeff, cnt_idx, KBASE_IPA_CORE_TYPE_TILER)
 
-/* Table of description of HW counters used by IPA counter model.
+/* Tables of description of HW counters used by IPA counter model.
  *
- * This table provides a description of each performance counter
+ * These tables provide a description of each performance counter
  * used by the top level counter model for energy estimation.
  */
 static const struct kbase_ipa_counter ipa_top_level_cntrs_def_todx[] = {
@@ -75,10 +80,11 @@ static const struct kbase_ipa_counter ipa_top_level_cntrs_def_todx[] = {
 	TILER_COUNTER_DEF("vfetch_pos_read_wait", -119118, VFETCH_POS_READ_WAIT),
 };
 
- /* This table provides a description of each performance counter
+
+/* These tables provide a description of each performance counter
   * used by the shader cores counter model for energy estimation.
   */
- static const struct kbase_ipa_counter ipa_shader_core_cntrs_def_todx[] = {
+static const struct kbase_ipa_counter ipa_shader_core_cntrs_def_todx[] = {
 	SC_COUNTER_DEF("exec_instr_fma", 505449, EXEC_INSTR_FMA),
 	SC_COUNTER_DEF("tex_filt_num_operations", 574869, TEX_FILT_NUM_OPS),
 	SC_COUNTER_DEF("ls_mem_read_short", 60917, LS_MEM_READ_SHORT),
@@ -87,6 +93,7 @@ static const struct kbase_ipa_counter ipa_top_level_cntrs_def_todx[] = {
 	SC_COUNTER_DEF("vary_slot_16", 181069, VARY_SLOT_16),
 };
 
+
 #define IPA_POWER_MODEL_OPS(gpu, init_token) \
 	const struct kbase_ipa_model_ops kbase_ ## gpu ## _ipa_model_ops = { \
 		.name = "mali-" #gpu "-power-model", \
@@ -122,12 +129,12 @@ static const struct kbase_ipa_counter ipa_top_level_cntrs_def_todx[] = {
  */
 STANDARD_POWER_MODEL(todx, 750);
 
+
 /* Assuming LODX is an alias of TODX for IPA */
 ALIAS_POWER_MODEL(lodx, todx);
 
 static const struct kbase_ipa_model_ops *ipa_counter_model_ops[] = {
-	&kbase_todx_ipa_model_ops,
-	&kbase_lodx_ipa_model_ops
+	&kbase_todx_ipa_model_ops, &kbase_lodx_ipa_model_ops,
 };
 
 const struct kbase_ipa_model_ops *kbase_ipa_counter_model_ops_find(
diff --git a/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_jm.c b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_jm.c
index 8d33b139169f..2f4c9d9dd68b 100644
--- a/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_jm.c
+++ b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_jm.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2016-2021 ARM Limited. All rights reserved.
@@ -23,9 +23,7 @@
 
 #include "mali_kbase_ipa_counter_common_jm.h"
 #include "mali_kbase.h"
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-#include <backend/gpu/mali_kbase_model_dummy.h>
-#endif
+
 
 /* Performance counter blocks base offsets */
 #define JM_BASE             (0 * KBASE_IPA_NR_BYTES_PER_BLOCK)
@@ -96,15 +94,9 @@ static u32 kbase_g7x_power_model_get_memsys_counter(struct kbase_ipa_model_vinst
 static u32 kbase_g7x_power_model_get_sc_counter(struct kbase_ipa_model_vinstr_data *model_data,
 						u32 counter_block_offset)
 {
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-	const u32 sc_base = MEMSYS_BASE +
-		(KBASE_DUMMY_MODEL_MAX_MEMSYS_BLOCKS *
-		 KBASE_IPA_NR_BYTES_PER_BLOCK);
-#else
 	const u32 sc_base = MEMSYS_BASE +
 		(model_data->kbdev->gpu_props.props.l2_props.num_l2_slices *
 		 KBASE_IPA_NR_BYTES_PER_BLOCK);
-#endif
 	return sc_base + counter_block_offset;
 }
 
diff --git a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa.c b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa.c
index e86a94317b0b..24d7b06218f2 100644
--- a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa.c
+++ b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2016-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2016-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -537,7 +537,6 @@ static void opp_translate_freq_voltage(struct kbase_device *kbdev,
 				       unsigned long *freqs,
 				       unsigned long *volts)
 {
-#ifndef CONFIG_MALI_BIFROST_NO_MALI
 	u64 core_mask;
 
 	kbase_devfreq_opp_translate(kbdev, nominal_freq, &core_mask,
@@ -550,16 +549,6 @@ static void opp_translate_freq_voltage(struct kbase_device *kbdev,
 		volts[KBASE_IPA_BLOCK_TYPE_SHADER_CORES] =
 			volts[KBASE_IPA_BLOCK_TYPE_TOP_LEVEL];
 	}
-#else
-	/* An arbitrary voltage and frequency value can be chosen for testing
-	 * in no mali configuration which may not match with any OPP level.
-	 */
-	freqs[KBASE_IPA_BLOCK_TYPE_TOP_LEVEL] = nominal_freq;
-	volts[KBASE_IPA_BLOCK_TYPE_TOP_LEVEL] = nominal_voltage;
-
-	freqs[KBASE_IPA_BLOCK_TYPE_SHADER_CORES] = nominal_freq;
-	volts[KBASE_IPA_BLOCK_TYPE_SHADER_CORES] = nominal_voltage;
-#endif
 }
 
 #if KERNEL_VERSION(5, 10, 0) > LINUX_VERSION_CODE
diff --git a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa.h b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa.h
index beceb6ce7b55..1d81ab6ae53f 100644
--- a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa.h
+++ b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2016-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2016-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_debugfs.c b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_debugfs.c
index 2672146e8e1d..59763896a988 100644
--- a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_debugfs.c
+++ b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_debugfs.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2017-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2017-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_debugfs.h b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_debugfs.h
index 189b43c609d6..f690367757c9 100644
--- a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_debugfs.h
+++ b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_debugfs.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2017, 2020-2021 ARM Limited. All rights reserved.
@@ -27,7 +27,7 @@ enum kbase_ipa_model_param_type {
 	PARAM_TYPE_STRING,
 };
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 
 void kbase_ipa_debugfs_init(struct kbase_device *kbdev);
 int kbase_ipa_model_param_add(struct kbase_ipa_model *model, const char *name,
diff --git a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_simple.c b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_simple.c
index dce685a3b072..c90894e934f3 100644
--- a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_simple.c
+++ b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_simple.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2016-2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2016-2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -22,7 +22,7 @@
 #include <linux/freezer.h>
 #include <uapi/linux/thermal.h>
 #include <linux/thermal.h>
-#ifdef CONFIG_DEVFREQ_THERMAL
+#if IS_ENABLED(CONFIG_DEVFREQ_THERMAL)
 #include <linux/devfreq_cooling.h>
 #endif
 #include <linux/of.h>
diff --git a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_simple.h b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_simple.h
index 40cf0d151a32..dd17786a51d9 100644
--- a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_simple.h
+++ b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_simple.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/jm/mali_kbase_jm_defs.h b/drivers/gpu/arm/bifrost/jm/mali_kbase_jm_defs.h
index 8b3e03f15964..a44b4b774fe0 100644
--- a/drivers/gpu/arm/bifrost/jm/mali_kbase_jm_defs.h
+++ b/drivers/gpu/arm/bifrost/jm/mali_kbase_jm_defs.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -126,7 +126,7 @@
 /* Reset the GPU after each atom completion */
 #define KBASE_SERIALIZE_RESET (1 << 2)
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 /**
  * struct base_job_fault_event - keeps track of the atom which faulted or which
  *                               completed after the faulty atom but before the
@@ -602,7 +602,7 @@ struct kbase_jd_atom {
 
 	wait_queue_head_t completed;
 	enum kbase_jd_atom_state status;
-#ifdef CONFIG_GPU_TRACEPOINTS
+#if IS_ENABLED(CONFIG_GPU_TRACEPOINTS)
 	int work_id;
 #endif
 	int slot_nr;
@@ -627,7 +627,7 @@ struct kbase_jd_atom {
 
 	u32 flush_id;
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 	struct base_job_fault_event fault_event;
 #endif
 	struct list_head queue;
@@ -804,7 +804,7 @@ struct kbase_jd_context {
 	u32 job_nr;
 	size_t tb_wrap_offset;
 
-#ifdef CONFIG_GPU_TRACEPOINTS
+#if IS_ENABLED(CONFIG_GPU_TRACEPOINTS)
 	atomic_t work_id;
 #endif
 
diff --git a/drivers/gpu/arm/bifrost/jm/mali_kbase_jm_js.h b/drivers/gpu/arm/bifrost/jm/mali_kbase_jm_js.h
index e3275369b459..5e0c4bc9e507 100644
--- a/drivers/gpu/arm/bifrost/jm/mali_kbase_jm_js.h
+++ b/drivers/gpu/arm/bifrost/jm/mali_kbase_jm_js.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/jm/mali_kbase_js_defs.h b/drivers/gpu/arm/bifrost/jm/mali_kbase_js_defs.h
index 68660a9709c3..405f346f4368 100644
--- a/drivers/gpu/arm/bifrost/jm/mali_kbase_js_defs.h
+++ b/drivers/gpu/arm/bifrost/jm/mali_kbase_js_defs.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2011-2018, 2020-2021 ARM Limited. All rights reserved.
@@ -37,8 +37,8 @@ typedef u32 kbase_context_flags;
  * typedef kbasep_js_ctx_job_cb - Callback function run on all of a context's
  * jobs registered with the Job Scheduler
  */
-typedef void (*kbasep_js_ctx_job_cb)(struct kbase_device *kbdev,
-				     struct kbase_jd_atom *katom);
+typedef void kbasep_js_ctx_job_cb(struct kbase_device *kbdev,
+				  struct kbase_jd_atom *katom);
 
 /*
  * @brief Maximum number of jobs that can be submitted to a job slot whilst
diff --git a/drivers/gpu/arm/bifrost/mali_base_hwconfig_features.h b/drivers/gpu/arm/bifrost/mali_base_hwconfig_features.h
index bdc769fd4f06..93cd05ff71a0 100644
--- a/drivers/gpu/arm/bifrost/mali_base_hwconfig_features.h
+++ b/drivers/gpu/arm/bifrost/mali_base_hwconfig_features.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
@@ -386,5 +386,59 @@ static const enum base_hw_feature base_hw_features_tODx[] = {
 	BASE_HW_FEATURE_END
 };
 
+static const enum base_hw_feature base_hw_features_tGRx[] = {
+	BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION,
+	BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS,
+	BASE_HW_FEATURE_XAFFINITY,
+	BASE_HW_FEATURE_WARPING,
+	BASE_HW_FEATURE_INTERPIPE_REG_ALIASING,
+	BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS,
+	BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL,
+	BASE_HW_FEATURE_BRNDOUT_CC,
+	BASE_HW_FEATURE_BRNDOUT_KILL,
+	BASE_HW_FEATURE_LD_ST_LEA_TEX,
+	BASE_HW_FEATURE_LD_ST_TILEBUFFER,
+	BASE_HW_FEATURE_LINEAR_FILTER_FLOAT,
+	BASE_HW_FEATURE_MRT,
+	BASE_HW_FEATURE_MSAA_16X,
+	BASE_HW_FEATURE_NEXT_INSTRUCTION_TYPE,
+	BASE_HW_FEATURE_OUT_OF_ORDER_EXEC,
+	BASE_HW_FEATURE_T7XX_PAIRING_RULES,
+	BASE_HW_FEATURE_TEST4_DATUM_MODE,
+	BASE_HW_FEATURE_FLUSH_REDUCTION,
+	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
+	BASE_HW_FEATURE_COHERENCY_REG,
+	BASE_HW_FEATURE_L2_CONFIG,
+	BASE_HW_FEATURE_CLEAN_ONLY_SAFE,
+	BASE_HW_FEATURE_END
+};
+
+static const enum base_hw_feature base_hw_features_tVAx[] = {
+	BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION,
+	BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS,
+	BASE_HW_FEATURE_XAFFINITY,
+	BASE_HW_FEATURE_WARPING,
+	BASE_HW_FEATURE_INTERPIPE_REG_ALIASING,
+	BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS,
+	BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL,
+	BASE_HW_FEATURE_BRNDOUT_CC,
+	BASE_HW_FEATURE_BRNDOUT_KILL,
+	BASE_HW_FEATURE_LD_ST_LEA_TEX,
+	BASE_HW_FEATURE_LD_ST_TILEBUFFER,
+	BASE_HW_FEATURE_LINEAR_FILTER_FLOAT,
+	BASE_HW_FEATURE_MRT,
+	BASE_HW_FEATURE_MSAA_16X,
+	BASE_HW_FEATURE_NEXT_INSTRUCTION_TYPE,
+	BASE_HW_FEATURE_OUT_OF_ORDER_EXEC,
+	BASE_HW_FEATURE_T7XX_PAIRING_RULES,
+	BASE_HW_FEATURE_TEST4_DATUM_MODE,
+	BASE_HW_FEATURE_FLUSH_REDUCTION,
+	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
+	BASE_HW_FEATURE_COHERENCY_REG,
+	BASE_HW_FEATURE_L2_CONFIG,
+	BASE_HW_FEATURE_CLEAN_ONLY_SAFE,
+	BASE_HW_FEATURE_END
+};
+
 
 #endif /* _BASE_HWCONFIG_FEATURES_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_base_hwconfig_issues.h b/drivers/gpu/arm/bifrost/mali_base_hwconfig_issues.h
index a61eeb2ca200..beda1e4bf650 100644
--- a/drivers/gpu/arm/bifrost/mali_base_hwconfig_issues.h
+++ b/drivers/gpu/arm/bifrost/mali_base_hwconfig_issues.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
@@ -607,5 +607,35 @@ static const enum base_hw_issue base_hw_issues_model_tODx[] = {
 	BASE_HW_ISSUE_END
 };
 
+static const enum base_hw_issue base_hw_issues_tGRx_r0p0[] = {
+	BASE_HW_ISSUE_9435,
+	BASE_HW_ISSUE_TSIX_2033,
+	BASE_HW_ISSUE_TTRX_1337,
+	BASE_HW_ISSUE_END
+};
+
+static const enum base_hw_issue base_hw_issues_model_tGRx[] = {
+	BASE_HW_ISSUE_5736,
+	BASE_HW_ISSUE_9435,
+	BASE_HW_ISSUE_TSIX_2033,
+	BASE_HW_ISSUE_TTRX_1337,
+	BASE_HW_ISSUE_END
+};
+
+static const enum base_hw_issue base_hw_issues_tVAx_r0p0[] = {
+	BASE_HW_ISSUE_9435,
+	BASE_HW_ISSUE_TSIX_2033,
+	BASE_HW_ISSUE_TTRX_1337,
+	BASE_HW_ISSUE_END
+};
+
+static const enum base_hw_issue base_hw_issues_model_tVAx[] = {
+	BASE_HW_ISSUE_5736,
+	BASE_HW_ISSUE_9435,
+	BASE_HW_ISSUE_TSIX_2033,
+	BASE_HW_ISSUE_TTRX_1337,
+	BASE_HW_ISSUE_END
+};
+
 
 #endif /* _BASE_HWCONFIG_ISSUES_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase.h b/drivers/gpu/arm/bifrost/mali_kbase.h
index 52dfbe4f6e7f..d9bf1f4f8f2d 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
@@ -74,7 +74,7 @@
 
 #include "ipa/mali_kbase_ipa.h"
 
-#ifdef CONFIG_GPU_TRACEPOINTS
+#if IS_ENABLED(CONFIG_GPU_TRACEPOINTS)
 #include <trace/events/gpu.h>
 #endif
 
@@ -196,7 +196,7 @@ void kbase_device_pm_term(struct kbase_device *kbdev);
 int power_control_init(struct kbase_device *kbdev);
 void power_control_term(struct kbase_device *kbdev);
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 void kbase_device_debugfs_term(struct kbase_device *kbdev);
 int kbase_device_debugfs_init(struct kbase_device *kbdev);
 #else /* CONFIG_DEBUG_FS */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_as_fault_debugfs.c b/drivers/gpu/arm/bifrost/mali_kbase_as_fault_debugfs.c
index 18ca56cb7cec..5cf800905335 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_as_fault_debugfs.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_as_fault_debugfs.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2016-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2016-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -25,7 +25,7 @@
 #include <mali_kbase_as_fault_debugfs.h>
 #include <device/mali_kbase_device.h>
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 #ifdef CONFIG_MALI_BIFROST_DEBUG
 
 static int kbase_as_fault_read(struct seq_file *sfile, void *data)
@@ -79,7 +79,7 @@ static const struct file_operations as_fault_fops = {
  */
 void kbase_as_fault_debugfs_init(struct kbase_device *kbdev)
 {
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 #ifdef CONFIG_MALI_BIFROST_DEBUG
 	uint i;
 	char as_name[64];
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_as_fault_debugfs.h b/drivers/gpu/arm/bifrost/mali_kbase_as_fault_debugfs.h
index a9cf99c0aa55..45e48f4d345b 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_as_fault_debugfs.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_as_fault_debugfs.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2016, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2016, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -38,7 +38,7 @@ void kbase_as_fault_debugfs_init(struct kbase_device *kbdev);
 static inline void
 kbase_as_fault_debugfs_new(struct kbase_device *kbdev, int as_no)
 {
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 #ifdef CONFIG_MALI_BIFROST_DEBUG
 	kbdev->debugfs_as_read_bitmap |= (1ULL << as_no);
 #endif /* CONFIG_DEBUG_FS */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_bits.h b/drivers/gpu/arm/bifrost/mali_kbase_bits.h
index 6f6dba1b2a02..a085fd86c488 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_bits.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_bits.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_cache_policy.c b/drivers/gpu/arm/bifrost/mali_kbase_cache_policy.c
index 7f266aa53cac..af51ed8c2dec 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_cache_policy.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_cache_policy.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2012-2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_cache_policy.h b/drivers/gpu/arm/bifrost/mali_kbase_cache_policy.h
index 6799492be822..598d245383fd 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_cache_policy.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_cache_policy.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2012-2013, 2015, 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_caps.h b/drivers/gpu/arm/bifrost/mali_kbase_caps.h
index 478a3177e8ec..c232e2183d78 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_caps.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_caps.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_ccswe.c b/drivers/gpu/arm/bifrost/mali_kbase_ccswe.c
index 624482ad6c15..6a1e7e4c5ff5 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_ccswe.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_ccswe.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_ccswe.h b/drivers/gpu/arm/bifrost/mali_kbase_ccswe.h
index 5c440b8473d3..8e55ffc70e77 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_ccswe.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_ccswe.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_config.c b/drivers/gpu/arm/bifrost/mali_kbase_config.c
index fe71526fdf96..37dbca129f86 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_config.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_config.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2011-2015, 2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2015, 2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -43,3 +43,62 @@ void kbasep_platform_device_term(struct kbase_device *kbdev)
 		platform_funcs_p->platform_term_func(kbdev);
 }
 
+int kbasep_platform_device_late_init(struct kbase_device *kbdev)
+{
+	struct kbase_platform_funcs_conf *platform_funcs_p;
+
+	platform_funcs_p = (struct kbase_platform_funcs_conf *)PLATFORM_FUNCS;
+	if (platform_funcs_p && platform_funcs_p->platform_late_init_func)
+		platform_funcs_p->platform_late_init_func(kbdev);
+
+	return 0;
+}
+
+void kbasep_platform_device_late_term(struct kbase_device *kbdev)
+{
+	struct kbase_platform_funcs_conf *platform_funcs_p;
+
+	platform_funcs_p = (struct kbase_platform_funcs_conf *)PLATFORM_FUNCS;
+	if (platform_funcs_p && platform_funcs_p->platform_late_term_func)
+		platform_funcs_p->platform_late_term_func(kbdev);
+}
+
+#if !MALI_USE_CSF
+int kbasep_platform_context_init(struct kbase_context *kctx)
+{
+	struct kbase_platform_funcs_conf *platform_funcs_p;
+
+	platform_funcs_p = (struct kbase_platform_funcs_conf *)PLATFORM_FUNCS;
+	if (platform_funcs_p && platform_funcs_p->platform_handler_context_init_func)
+		return platform_funcs_p->platform_handler_context_init_func(kctx);
+
+	return 0;
+}
+
+void kbasep_platform_context_term(struct kbase_context *kctx)
+{
+	struct kbase_platform_funcs_conf *platform_funcs_p;
+
+	platform_funcs_p = (struct kbase_platform_funcs_conf *)PLATFORM_FUNCS;
+	if (platform_funcs_p && platform_funcs_p->platform_handler_context_term_func)
+		platform_funcs_p->platform_handler_context_term_func(kctx);
+}
+
+void kbasep_platform_event_atom_submit(struct kbase_jd_atom *katom)
+{
+	struct kbase_platform_funcs_conf *platform_funcs_p;
+
+	platform_funcs_p = (struct kbase_platform_funcs_conf *)PLATFORM_FUNCS;
+	if (platform_funcs_p && platform_funcs_p->platform_handler_atom_submit_func)
+		platform_funcs_p->platform_handler_atom_submit_func(katom);
+}
+
+void kbasep_platform_event_atom_complete(struct kbase_jd_atom *katom)
+{
+	struct kbase_platform_funcs_conf *platform_funcs_p;
+
+	platform_funcs_p = (struct kbase_platform_funcs_conf *)PLATFORM_FUNCS;
+	if (platform_funcs_p && platform_funcs_p->platform_handler_atom_complete_func)
+		platform_funcs_p->platform_handler_atom_complete_func(katom);
+}
+#endif
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_config.h b/drivers/gpu/arm/bifrost/mali_kbase_config.h
index fe21cf5fa69f..e7eb3349692f 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_config.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_config.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2010-2017, 2019-2021 ARM Limited. All rights reserved.
@@ -28,18 +28,27 @@
 
 #include <linux/mm.h>
 #include <mali_malisw.h>
-#include <mali_kbase_backend_config.h>
+#include <backend/gpu/mali_kbase_backend_config.h>
 #include <linux/rbtree.h>
 
 /* Forward declaration of struct kbase_device */
 struct kbase_device;
 
+#if !MALI_USE_CSF
+/* Forward declaration of struct kbase_context */
+struct kbase_context;
+
+/* Forward declaration of struct kbase_atom */
+struct kbase_jd_atom;
+#endif
+
 /**
- * struct kbase_platform_funcs_conf - Specifies platform init/term function pointers
+ * struct kbase_platform_funcs_conf - Specifies platform integration function
+ * pointers for DDK events such as device init and term.
  *
  * Specifies the functions pointers for platform specific initialization and
- * termination. By default no functions are required. No additional platform
- * specific control is necessary.
+ * termination as well as other events. By default no functions are required.
+ * No additional platform specific control is necessary.
  */
 struct kbase_platform_funcs_conf {
 	/**
@@ -69,6 +78,84 @@ struct kbase_platform_funcs_conf {
 	 * can be accessed (and possibly terminated) in here.
 	 */
 	void (*platform_term_func)(struct kbase_device *kbdev);
+
+	/**
+	 * @platform_late_init_func: platform specific late init function pointer
+	 * @kbdev - kbase_device pointer
+	 *
+	 * Function pointer to inform that the kbase driver initialization completed
+	 * or NULL if no such function is required. At this point the GPU driver will be
+	 * fully initialized.
+	 *
+	 * The platform specific private pointer kbase_device::platform_context
+	 * can be accessed (and possibly terminated) in here.
+	 */
+	int (*platform_late_init_func)(struct kbase_device *kbdev);
+
+	/**
+	 * @platform_late_term_func: platform specific late termination function pointer
+	 * @kbdev - kbase_device pointer
+	 *
+	 * Function pointer for platform specific termination or NULL if no
+	 * termination function is required. At this point the GPU driver will complete
+	 * termination process
+	 *
+	 * The platform specific private pointer kbase_device::platform_context
+	 * can be accessed (and possibly terminated) in here.
+	 */
+	void (*platform_late_term_func)(struct kbase_device *kbdev);
+
+#if !MALI_USE_CSF
+	/**
+	 * @platform_handler_context_init_func: platform specific handler for
+	 * when a new kbase_context is created.
+	 * @kctx - kbase_context pointer
+	 *
+	 * Returns 0 on success, negative error code otherwise.
+	 *
+	 * Function pointer for platform specific initialization of a kernel
+	 * context or NULL if not required. Called at the last stage of kernel
+	 * context initialization.
+	 */
+	int (*platform_handler_context_init_func)(struct kbase_context *kctx);
+	/**
+	 * @platform_handler_context_term_func: platform specific handler for
+	 * when a kbase_context is terminated.
+	 * @kctx - kbase_context pointer
+	 *
+	 * Function pointer for platform specific termination of a kernel
+	 * context or NULL if not required. Called at the first stage of kernel
+	 * context termination.
+	 */
+	void (*platform_handler_context_term_func)(struct kbase_context *kctx);
+	/**
+	 * @platform_handler_atom_submit_func: platform specific handler for
+	 * when a kbase_jd_atom is submitted.
+	 * @katom - kbase_jd_atom pointer
+	 *
+	 * Function pointer for platform specific handling at the point when an
+	 * atom is submitted to the GPU or set to NULL if not required. The
+	 * function cannot assume that it is running in a process context.
+	 *
+	 * Context: The caller must hold the hwaccess_lock. Function must be
+	 *          runnable in an interrupt context.
+	 */
+	void (*platform_handler_atom_submit_func)(struct kbase_jd_atom *katom);
+	/**
+	 * @platform_handler_atom_complete_func: platform specific handler for
+	 * when a kbase_jd_atom completes.
+	 * @katom - kbase_jd_atom pointer
+	 *
+	 * Function pointer for platform specific handling at the point when an
+	 * atom stops running on the GPU or set to NULL if not required. The
+	 * function cannot assume that it is running in a process context.
+	 *
+	 * Context: The caller must hold the hwaccess_lock. Function must be
+	 *          runnable in an interrupt context.
+	 */
+	void (*platform_handler_atom_complete_func)(
+		struct kbase_jd_atom *katom);
+#endif
 };
 
 /*
@@ -212,8 +299,8 @@ struct kbase_pm_callback_conf {
  * and such alignment should be maintained.
  *
  * @gpu_clk_handle: Handle of the GPU clock for which notifier was registered.
- * @old_rate:       Previous rate of this GPU clock.
- * @new_rate:       New rate of this GPU clock.
+ * @old_rate:       Previous rate of this GPU clock in Hz.
+ * @new_rate:       New rate of this GPU clock in Hz.
  */
 struct kbase_gpu_clk_notifier_data {
 	void *gpu_clk_handle;
@@ -287,7 +374,7 @@ struct kbase_clk_rate_trace_op_conf {
 		void *gpu_clk_handle, struct notifier_block *nb);
 };
 
-#ifdef CONFIG_OF
+#if IS_ENABLED(CONFIG_OF)
 struct kbase_platform_config {
 };
 #else
@@ -348,6 +435,83 @@ int kbasep_platform_device_init(struct kbase_device *kbdev);
  */
 void kbasep_platform_device_term(struct kbase_device *kbdev);
 
+/**
+ * kbasep_platform_device_late_init: - Platform specific call to finish hardware
+ *                                     initialization
+ * @kbdev: kbase device pointer
+ *
+ * Function calls a platform defined routine if specified in the configuration
+ * attributes.  The routine can initialize any hardware and context state that
+ * is required for the GPU block to function.
+ *
+ * Return: 0 if no errors have been found in the config.
+ *         Negative error code otherwise.
+ */
+int kbasep_platform_device_late_init(struct kbase_device *kbdev);
+
+/**
+ * kbasep_platform_device_late_term - Platform specific call to finish hardware
+ *                                    termination
+ * @kbdev: Kbase device pointer
+ *
+ * Function calls a platform defined routine if specified in the configuration
+ * attributes. The routine can destroy any platform specific context state and
+ * shut down any hardware functionality that are outside of the Power Management
+ * callbacks.
+ *
+ */
+void kbasep_platform_device_late_term(struct kbase_device *kbdev);
+
+#if !MALI_USE_CSF
+/**
+ * kbasep_platform_context_init - Platform specific callback when a kernel
+ *                                context is created
+ * @kctx: kbase_context pointer
+ *
+ * Function calls a platform defined routine if specified in the configuration
+ * attributes.  The routine can initialize any per kernel context structures
+ * that are required for the GPU block to function.
+ *
+ * Return: 0 if no errors were encountered. Negative error code otherwise.
+ */
+int kbasep_platform_context_init(struct kbase_context *kctx);
+
+/**
+ * kbasep_platform_context_term - Platform specific callback when a kernel
+ *                                context is terminated
+ * @kctx: kbase_context pointer
+ *
+ * Function calls a platform defined routine if specified in the configuration
+ * attributes.  The routine should terminate any per kernel context structures
+ * created as part of &kbasep_platform_context_init.
+ *
+ */
+void kbasep_platform_context_term(struct kbase_context *kctx);
+
+/**
+ * kbasep_platform_event_atom_submit - Platform specific callback when an atom
+ *                                     is submitted to the GPU
+ * @katom: kbase_jd_atom pointer
+ *
+ * Function calls a platform defined routine if specified in the configuration
+ * attributes.  The routine should not assume that it is in a process context.
+ *
+ * Return: 0 if no errors were encountered. Negative error code otherwise.
+ */
+void kbasep_platform_event_atom_submit(struct kbase_jd_atom *katom);
+
+/**
+ * kbasep_platform_event_atom_complete - Platform specific callback when an atom
+ *                                       has stopped running on the GPU
+ * @katom: kbase_jd_atom pointer
+ *
+ * Function calls a platform defined routine if specified in the configuration
+ * attributes.  The routine should not assume that it is in a process context.
+ *
+ */
+void kbasep_platform_event_atom_complete(struct kbase_jd_atom *katom);
+#endif
+
 #ifndef CONFIG_OF
 /**
  * kbase_platform_register - Register a platform device for the GPU
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_config_defaults.h b/drivers/gpu/arm/bifrost/mali_kbase_config_defaults.h
index aad8e6c88e61..63c36e25899b 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_config_defaults.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_config_defaults.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2013-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_core_linux.c b/drivers/gpu/arm/bifrost/mali_kbase_core_linux.c
index 42539832b05e..52c040aeae28 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_core_linux.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_core_linux.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
@@ -27,22 +27,15 @@
 #ifdef CONFIG_MALI_BIFROST_DEVFREQ
 #include <linux/devfreq.h>
 #include <backend/gpu/mali_kbase_devfreq.h>
-#ifdef CONFIG_DEVFREQ_THERMAL
+#if IS_ENABLED(CONFIG_DEVFREQ_THERMAL)
 #include <ipa/mali_kbase_ipa_debugfs.h>
 #endif /* CONFIG_DEVFREQ_THERMAL */
 #endif /* CONFIG_MALI_BIFROST_DEVFREQ */
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-#include "mali_kbase_model_linux.h"
-#include <backend/gpu/mali_kbase_model_dummy.h>
-#endif /* CONFIG_MALI_BIFROST_NO_MALI */
 #include "mali_kbase_mem_profile_debugfs_buf_size.h"
 #include "mali_kbase_mem.h"
 #include "mali_kbase_mem_pool_debugfs.h"
 #include "mali_kbase_mem_pool_group.h"
 #include "mali_kbase_debugfs_helper.h"
-#if !MALI_CUSTOMER_RELEASE
-#include "mali_kbase_regs_dump_debugfs.h"
-#endif /* !MALI_CUSTOMER_RELEASE */
 #include "mali_kbase_regs_history_debugfs.h"
 #include <mali_kbase_hwaccess_backend.h>
 #include <mali_kbase_hwaccess_time.h>
@@ -76,7 +69,7 @@
 #ifdef CONFIG_MALI_CINSTR_GWT
 #include "mali_kbase_gwt.h"
 #endif
-#include "mali_kbase_pm_internal.h"
+#include "backend/gpu/mali_kbase_pm_internal.h"
 #include "mali_kbase_dvfs_debugfs.h"
 
 #include <linux/module.h>
@@ -108,7 +101,6 @@
 
 #include <mali_kbase_config.h>
 
-
 #include <linux/pm_opp.h>
 #include <soc/rockchip/rockchip_opp_select.h>
 #include <linux/pm_runtime.h>
@@ -344,7 +336,7 @@ static void kbase_file_delete(struct kbase_file *const kfile)
 	if (atomic_read(&kfile->setup_state) == KBASE_FILE_COMPLETE) {
 		struct kbase_context *kctx = kfile->kctx;
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 		kbasep_mem_profile_debugfs_remove(kctx);
 #endif
 
@@ -437,7 +429,7 @@ int assign_irqs(struct kbase_device *kbdev)
 			return -ENOENT;
 		}
 
-#ifdef CONFIG_OF
+#if IS_ENABLED(CONFIG_OF)
 		if (!strncasecmp(irq_res->name, "JOB", 4)) {
 			irqtag = JOB_IRQ_TAG;
 		} else if (!strncasecmp(irq_res->name, "MMU", 4)) {
@@ -488,7 +480,7 @@ void kbase_release_device(struct kbase_device *kbdev)
 }
 EXPORT_SYMBOL(kbase_release_device);
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 #if KERNEL_VERSION(4, 6, 0) > LINUX_VERSION_CODE &&                            \
 	!(KERNEL_VERSION(4, 4, 28) <= LINUX_VERSION_CODE &&                    \
 	  KERNEL_VERSION(4, 5, 0) > LINUX_VERSION_CODE)
@@ -605,7 +597,7 @@ static int kbase_file_create_kctx(struct kbase_file *const kfile,
 {
 	struct kbase_device *kbdev = NULL;
 	struct kbase_context *kctx = NULL;
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 	char kctx_name[64];
 #endif
 
@@ -636,7 +628,7 @@ static int kbase_file_create_kctx(struct kbase_file *const kfile,
 	if (kbdev->infinite_cache_active_default)
 		kbase_ctx_flag_set(kctx, KCTX_INFINITE_CACHE);
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 	snprintf(kctx_name, 64, "%d_%d", kctx->tgid, kctx->id);
 
 	mutex_init(&kctx->mem_profile_lock);
@@ -684,6 +676,13 @@ static int kbase_open(struct inode *inode, struct file *filp)
 	if (!kbdev)
 		return -ENODEV;
 
+	/* Device-wide firmware load is moved here from probing to comply with
+	 * Android GKI vendor guideline.
+	 */
+	ret = kbase_device_firmware_init_once(kbdev);
+	if (ret)
+		goto out;
+
 	kfile = kbase_file_new(kbdev, filp);
 	if (!kfile) {
 		ret = -ENOMEM;
@@ -695,7 +694,7 @@ static int kbase_open(struct inode *inode, struct file *filp)
 
 	return 0;
 
- out:
+out:
 	kbase_release_device(kbdev);
 	return ret;
 }
@@ -976,17 +975,6 @@ static int kbase_api_get_cpu_gpu_timeinfo(struct kbase_context *kctx,
 	return 0;
 }
 
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-static int kbase_api_hwcnt_set(struct kbase_context *kctx,
-		struct kbase_ioctl_hwcnt_values *values)
-{
-	gpu_model_set_dummy_prfcnt_sample(
-			(u32 __user *)(uintptr_t)values->data,
-			values->size);
-
-	return 0;
-}
-#endif
 
 static int kbase_api_disjoint_query(struct kbase_context *kctx,
 		struct kbase_ioctl_disjoint_query *query)
@@ -1382,6 +1370,14 @@ static int kbasep_cs_queue_register(struct kbase_context *kctx,
 	return kbase_csf_queue_register(kctx, reg);
 }
 
+static int kbasep_cs_queue_register_ex(struct kbase_context *kctx,
+			      struct kbase_ioctl_cs_queue_register_ex *reg)
+{
+	kctx->jit_group_id = BASE_MEM_GROUP_DEFAULT;
+
+	return kbase_csf_queue_register_ex(kctx, reg);
+}
+
 static int kbasep_cs_queue_terminate(struct kbase_context *kctx,
 			       struct kbase_ioctl_cs_queue_terminate *term)
 {
@@ -1868,14 +1864,6 @@ static long kbase_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 				union kbase_ioctl_get_cpu_gpu_timeinfo,
 				kctx);
 		break;
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-	case KBASE_IOCTL_HWCNT_SET:
-		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_HWCNT_SET,
-				kbase_api_hwcnt_set,
-				struct kbase_ioctl_hwcnt_values,
-				kctx);
-		break;
-#endif
 #ifdef CONFIG_MALI_CINSTR_GWT
 	case KBASE_IOCTL_CINSTR_GWT_START:
 		KBASE_HANDLE_IOCTL(KBASE_IOCTL_CINSTR_GWT_START,
@@ -1906,6 +1894,12 @@ static long kbase_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 				struct kbase_ioctl_cs_queue_register,
 				kctx);
 		break;
+	case KBASE_IOCTL_CS_QUEUE_REGISTER_EX:
+		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_CS_QUEUE_REGISTER_EX,
+				kbasep_cs_queue_register_ex,
+				struct kbase_ioctl_cs_queue_register_ex,
+				kctx);
+		break;
 	case KBASE_IOCTL_CS_QUEUE_TERMINATE:
 		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_CS_QUEUE_TERMINATE,
 				kbasep_cs_queue_terminate,
@@ -2462,6 +2456,11 @@ static ssize_t set_core_mask(struct device *dev, struct device_attribute *attr,
 					new_core_mask[i], i, group0_core_mask);
 			err = -EINVAL;
 			goto unlock;
+		} else if (!(new_core_mask[i] & kbdev->gpu_props.curr_config.shader_present)) {
+			dev_err(dev, "Invalid core mask 0x%llX for JS %d: No intersection with current core mask 0x%llX\n",
+					new_core_mask[i], i, kbdev->gpu_props.curr_config.shader_present);
+			err = -EINVAL;
+			goto unlock;
 		}
 	}
 
@@ -2939,7 +2938,7 @@ static DEVICE_ATTR(js_softstop_always, S_IRUGO | S_IWUSR, show_js_softstop_alway
 #endif /* !MALI_USE_CSF */
 
 #ifdef CONFIG_MALI_BIFROST_DEBUG
-typedef void (kbasep_debug_command_func) (struct kbase_device *);
+typedef void kbasep_debug_command_func(struct kbase_device *);
 
 enum kbasep_debug_command_code {
 	KBASEP_DEBUG_COMMAND_DUMPTRACE,
@@ -3092,9 +3091,13 @@ static ssize_t kbase_show_gpuinfo(struct device *dev,
 		{ .id = GPU_ID2_PRODUCT_TNAX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT,
 		  .name = "Mali-G57" },
 		{ .id = GPU_ID2_PRODUCT_TODX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT,
-		  .name = "Mali-TODX" },
+		  .name = "Mali-G710" },
 		{ .id = GPU_ID2_PRODUCT_LODX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT,
-		  .name = "Mali-LODX" },
+		  .name = "Mali-G610" },
+		{ .id = GPU_ID2_PRODUCT_TGRX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT,
+		  .name = "Mali-G510" },
+		{ .id = GPU_ID2_PRODUCT_TVAX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT,
+		  .name = "Mali-G310" },
 	};
 	const char *product_name = "(Unknown Mali GPU)";
 	struct kbase_device *kbdev;
@@ -3237,7 +3240,8 @@ static ssize_t set_pm_poweroff(struct device *dev,
 
 	stt = &kbdev->pm.backend.shader_tick_timer;
 	stt->configured_interval = HR_TIMER_DELAY_NSEC(gpu_poweroff_time);
-	stt->configured_ticks = poweroff_shader_ticks;
+	stt->default_ticks = poweroff_shader_ticks;
+	stt->configured_ticks = stt->default_ticks;
 
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 
@@ -3275,7 +3279,7 @@ static ssize_t show_pm_poweroff(struct device *dev,
 	stt = &kbdev->pm.backend.shader_tick_timer;
 	ret = scnprintf(buf, PAGE_SIZE, "%llu %u 0\n",
 			ktime_to_ns(stt->configured_interval),
-			stt->configured_ticks);
+			stt->default_ticks);
 
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 
@@ -3929,7 +3933,7 @@ static ssize_t update_serialize_jobs_setting(struct kbase_device *kbdev,
 	return count;
 }
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 /**
  * kbasep_serialize_jobs_seq_debugfs_show - Show callback for the serialize_jobs
  *					    debugfs file
@@ -4183,15 +4187,6 @@ void kbase_protected_mode_term(struct kbase_device *kbdev)
 	kfree(kbdev->protected_dev);
 }
 
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-static int kbase_common_reg_map(struct kbase_device *kbdev)
-{
-	return 0;
-}
-static void kbase_common_reg_unmap(struct kbase_device * const kbdev)
-{
-}
-#else /* CONFIG_MALI_BIFROST_NO_MALI */
 static int kbase_common_reg_map(struct kbase_device *kbdev)
 {
 	int err = 0;
@@ -4227,7 +4222,6 @@ static void kbase_common_reg_unmap(struct kbase_device * const kbdev)
 		kbdev->reg_size = 0;
 	}
 }
-#endif /* CONFIG_MALI_BIFROST_NO_MALI */
 
 int registers_map(struct kbase_device * const kbdev)
 {
@@ -4382,7 +4376,7 @@ int kbase_device_pm_init(struct kbase_device *kbdev)
 void kbase_device_pm_term(struct kbase_device *kbdev)
 {
 #ifdef CONFIG_MALI_ARBITER_SUPPORT
-#ifdef CONFIG_OF
+#if IS_ENABLED(CONFIG_OF)
 	if (kbase_is_pv_enabled(kbdev->dev->of_node))
 		kbase_arbiter_pm_early_term(kbdev);
 	else
@@ -4551,7 +4545,7 @@ void power_control_term(struct kbase_device *kbdev)
 }
 
 #ifdef MALI_KBASE_BUILD
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 
 static void trigger_reset(struct kbase_device *kbdev)
 {
@@ -4736,9 +4730,6 @@ int kbase_device_debugfs_init(struct kbase_device *kbdev)
 		goto out;
 	}
 
-#if !MALI_CUSTOMER_RELEASE
-	kbasep_regs_dump_debugfs_init(kbdev);
-#endif /* !MALI_CUSTOMER_RELEASE */
 	kbasep_regs_history_debugfs_init(kbdev);
 
 #if !MALI_USE_CSF
@@ -4792,20 +4783,18 @@ int kbase_device_debugfs_init(struct kbase_device *kbdev)
 	kbase_ktrace_debugfs_init(kbdev);
 
 #ifdef CONFIG_MALI_BIFROST_DEVFREQ
-#ifdef CONFIG_DEVFREQ_THERMAL
+#if IS_ENABLED(CONFIG_DEVFREQ_THERMAL)
 	if (kbdev->devfreq && !kbdev->model_data)
 		kbase_ipa_debugfs_init(kbdev);
 #endif /* CONFIG_DEVFREQ_THERMAL */
 #endif /* CONFIG_MALI_BIFROST_DEVFREQ */
 
-#if MALI_USE_CSF
-	kbase_csf_debugfs_init(kbdev);
-#else
+#if !MALI_USE_CSF
 	debugfs_create_file("serialize_jobs", S_IRUGO | S_IWUSR,
 			kbdev->mali_debugfs_directory, kbdev,
 			&kbasep_serialize_jobs_debugfs_fops);
-#endif
 
+#endif
 	kbase_dvfs_status_debugfs_init(kbdev);
 
 	return 0;
@@ -4824,7 +4813,7 @@ void kbase_device_debugfs_term(struct kbase_device *kbdev)
 
 int kbase_device_coherency_init(struct kbase_device *kbdev)
 {
-#ifdef CONFIG_OF
+#if IS_ENABLED(CONFIG_OF)
 	u32 supported_coherency_bitmap =
 		kbdev->gpu_props.props.raw_props.coherency_mode;
 	const void *coherency_override_dts;
@@ -4851,7 +4840,7 @@ int kbase_device_coherency_init(struct kbase_device *kbdev)
 	kbdev->system_coherency = COHERENCY_NONE;
 
 	/* device tree may override the coherency */
-#ifdef CONFIG_OF
+#if IS_ENABLED(CONFIG_OF)
 	coherency_override_dts = of_get_property(kbdev->dev->of_node,
 						"system-coherency",
 						NULL);
@@ -4859,7 +4848,7 @@ int kbase_device_coherency_init(struct kbase_device *kbdev)
 
 		override_coherency = be32_to_cpup(coherency_override_dts);
 
-#if MALI_USE_CSF && !defined(CONFIG_MALI_BIFROST_NO_MALI)
+#if MALI_USE_CSF && !IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI)
 		/* ACE coherency mode is not supported by Driver on CSF GPUs.
 		 * Return an error to signal the invalid device tree configuration.
 		 */
@@ -5415,7 +5404,7 @@ static const struct dev_pm_ops kbase_pm_ops = {
 #endif /* KBASE_PM_RUNTIME */
 };
 
-#ifdef CONFIG_OF
+#if IS_ENABLED(CONFIG_OF)
 static const struct of_device_id kbase_dt_ids[] = {
 	{ .compatible = "arm,mali-bifrost" },
 	{ /* sentinel */ }
@@ -5430,6 +5419,7 @@ static struct platform_driver kbase_platform_driver = {
 		   .name = kbase_drv_name,
 		   .pm = &kbase_pm_ops,
 		   .of_match_table = of_match_ptr(kbase_dt_ids),
+		   .probe_type = PROBE_PREFER_ASYNCHRONOUS,
 	},
 };
 
@@ -5437,7 +5427,7 @@ static struct platform_driver kbase_platform_driver = {
  * The driver will not provide a shortcut to create the Mali platform device
  * anymore when using Device Tree.
  */
-#ifdef CONFIG_OF
+#if IS_ENABLED(CONFIG_OF)
 module_platform_driver(kbase_platform_driver);
 #else
 
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_cs_experimental.h b/drivers/gpu/arm/bifrost/mali_kbase_cs_experimental.h
index 67cd5ee1ece7..4dc09e4a7ed2 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_cs_experimental.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_cs_experimental.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_ctx_sched.c b/drivers/gpu/arm/bifrost/mali_kbase_ctx_sched.c
index c63bc8dfa70a..d06380deca41 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_ctx_sched.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_ctx_sched.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2017-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2017-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_ctx_sched.h b/drivers/gpu/arm/bifrost/mali_kbase_ctx_sched.h
index cadb73538a85..334724f60837 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_ctx_sched.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_ctx_sched.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2017-2018, 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_debug.c b/drivers/gpu/arm/bifrost/mali_kbase_debug.c
index 6caf56ca263e..6d3b1093b442 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_debug.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_debug.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2012-2014, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2014, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_debug.h b/drivers/gpu/arm/bifrost/mali_kbase_debug.h
index 87d3069d958b..5f04fca9618c 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_debug.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_debug.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2012-2015, 2017, 2020-2021 ARM Limited. All rights reserved.
@@ -40,7 +40,7 @@
 #endif				/* KBASE_DEBUG_DISABLE_ASSERTS */
 
 /** Function type that is called on an KBASE_DEBUG_ASSERT() or KBASE_DEBUG_ASSERT_MSG() */
-typedef void (kbase_debug_assert_hook) (void *);
+typedef void kbase_debug_assert_hook(void *);
 
 struct kbasep_debug_assert_cb {
 	kbase_debug_assert_hook *func;
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_debug_job_fault.c b/drivers/gpu/arm/bifrost/mali_kbase_debug_job_fault.c
index 7dfdff1b1f18..4f021b316b83 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_debug_job_fault.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_debug_job_fault.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2012-2016, 2018-2021 ARM Limited. All rights reserved.
@@ -23,7 +23,7 @@
 #include <linux/spinlock.h>
 #include <mali_kbase_hwaccess_jm.h>
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 
 static bool kbase_is_job_fault_event_pending(struct kbase_device *kbdev)
 {
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_debug_job_fault.h b/drivers/gpu/arm/bifrost/mali_kbase_debug_job_fault.h
index 63ccb3d86b23..39aeed08a20d 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_debug_job_fault.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_debug_job_fault.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2012-2016, 2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2016, 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_debug_mem_view.c b/drivers/gpu/arm/bifrost/mali_kbase_debug_mem_view.c
index 9bdb76572df0..5a99b5e5c2d6 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_debug_mem_view.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_debug_mem_view.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2013-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2013-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -29,7 +29,7 @@
 #include <linux/list.h>
 #include <linux/file.h>
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 
 struct debug_mem_mapping {
 	struct list_head node;
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_debug_mem_view.h b/drivers/gpu/arm/bifrost/mali_kbase_debug_mem_view.h
index c913d5ce36de..d03483219b08 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_debug_mem_view.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_debug_mem_view.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2013-2015, 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2013-2015, 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_debugfs_helper.c b/drivers/gpu/arm/bifrost/mali_kbase_debugfs_helper.c
index 28df887b33dc..973739fe6143 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_debugfs_helper.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_debugfs_helper.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -45,10 +45,9 @@
  *
  * Return: 0 if success, negative error code otherwise.
  */
-static int set_attr_from_string(
-	char *const buf,
-	void *const array, size_t const nelems,
-	kbase_debugfs_helper_set_attr_fn const set_attr_fn)
+static int
+set_attr_from_string(char *const buf, void *const array, size_t const nelems,
+		     kbase_debugfs_helper_set_attr_fn *const set_attr_fn)
 {
 	size_t index, err = 0;
 	char *ptr = buf;
@@ -144,7 +143,7 @@ int kbase_debugfs_string_validator(char *const buf)
 
 int kbase_debugfs_helper_set_attr_from_string(
 	const char *const buf, void *const array, size_t const nelems,
-	kbase_debugfs_helper_set_attr_fn const set_attr_fn)
+	kbase_debugfs_helper_set_attr_fn *const set_attr_fn)
 {
 	char *const wbuf = kstrdup(buf, GFP_KERNEL);
 	int err = 0;
@@ -167,9 +166,9 @@ int kbase_debugfs_helper_set_attr_from_string(
 }
 
 ssize_t kbase_debugfs_helper_get_attr_to_string(
-	char *const buf, size_t const size,
-	void *const array, size_t const nelems,
-	kbase_debugfs_helper_get_attr_fn const get_attr_fn)
+	char *const buf, size_t const size, void *const array,
+	size_t const nelems,
+	kbase_debugfs_helper_get_attr_fn *const get_attr_fn)
 {
 	ssize_t total = 0;
 	size_t index;
@@ -187,10 +186,10 @@ ssize_t kbase_debugfs_helper_get_attr_to_string(
 	return total;
 }
 
-int kbase_debugfs_helper_seq_write(struct file *const file,
-	const char __user *const ubuf, size_t const count,
-	size_t const nelems,
-	kbase_debugfs_helper_set_attr_fn const set_attr_fn)
+int kbase_debugfs_helper_seq_write(
+	struct file *const file, const char __user *const ubuf,
+	size_t const count, size_t const nelems,
+	kbase_debugfs_helper_set_attr_fn *const set_attr_fn)
 {
 	const struct seq_file *const sfile = file->private_data;
 	void *const array = sfile->private;
@@ -228,9 +227,9 @@ int kbase_debugfs_helper_seq_write(struct file *const file,
 	return err;
 }
 
-int kbase_debugfs_helper_seq_read(struct seq_file *const sfile,
-	size_t const nelems,
-	kbase_debugfs_helper_get_attr_fn const get_attr_fn)
+int kbase_debugfs_helper_seq_read(
+	struct seq_file *const sfile, size_t const nelems,
+	kbase_debugfs_helper_get_attr_fn *const get_attr_fn)
 {
 	void *const array = sfile->private;
 	size_t index;
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_debugfs_helper.h b/drivers/gpu/arm/bifrost/mali_kbase_debugfs_helper.h
index 5fcbb15b23e2..4c69d8b6991f 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_debugfs_helper.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_debugfs_helper.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -30,8 +30,8 @@
  * @index: An element index. The valid range depends on the use-case.
  * @value: Attribute value to be set.
  */
-typedef void (*kbase_debugfs_helper_set_attr_fn)(
-	void *array, size_t index, size_t value);
+typedef void kbase_debugfs_helper_set_attr_fn(void *array, size_t index,
+					      size_t value);
 
 /**
  * kbase_debugfs_helper_set_attr_from_string - Parse a string to reconfigure an
@@ -55,7 +55,7 @@ typedef void (*kbase_debugfs_helper_set_attr_fn)(
  */
 int kbase_debugfs_helper_set_attr_from_string(
 	const char *buf, void *array, size_t nelems,
-	kbase_debugfs_helper_set_attr_fn set_attr_fn);
+	kbase_debugfs_helper_set_attr_fn *set_attr_fn);
 
 /**
  * kbase_debugfs_string_validator - Validate a string to be written to a
@@ -89,8 +89,7 @@ int kbase_debugfs_string_validator(char *const buf);
  *
  * Return: Value of attribute.
  */
-typedef size_t (*kbase_debugfs_helper_get_attr_fn)(
-	void *array, size_t index);
+typedef size_t kbase_debugfs_helper_get_attr_fn(void *array, size_t index);
 
 /**
  * kbase_debugfs_helper_get_attr_to_string - Construct a formatted string
@@ -111,7 +110,7 @@ typedef size_t (*kbase_debugfs_helper_get_attr_fn)(
  */
 ssize_t kbase_debugfs_helper_get_attr_to_string(
 	char *buf, size_t size, void *array, size_t nelems,
-	kbase_debugfs_helper_get_attr_fn get_attr_fn);
+	kbase_debugfs_helper_get_attr_fn *get_attr_fn);
 
 /**
  * kbase_debugfs_helper_seq_read - Implements reads from a virtual file for an
@@ -132,8 +131,8 @@ ssize_t kbase_debugfs_helper_get_attr_to_string(
  * Return: 0 if success, negative error code otherwise.
  */
 int kbase_debugfs_helper_seq_read(
-	struct seq_file *const sfile, size_t const nelems,
-	kbase_debugfs_helper_get_attr_fn const get_attr_fn);
+	struct seq_file *sfile, size_t nelems,
+	kbase_debugfs_helper_get_attr_fn *get_attr_fn);
 
 /**
  * kbase_debugfs_helper_seq_write - Implements writes to a virtual file for an
@@ -154,10 +153,10 @@ int kbase_debugfs_helper_seq_read(
  *
  * Return: 0 if success, negative error code otherwise.
  */
-int kbase_debugfs_helper_seq_write(struct file *const file,
-	const char __user *const ubuf, size_t const count,
-	size_t const nelems,
-	kbase_debugfs_helper_set_attr_fn const set_attr_fn);
+int kbase_debugfs_helper_seq_write(struct file *file,
+	const char __user *ubuf, size_t count,
+	size_t nelems,
+	kbase_debugfs_helper_set_attr_fn *set_attr_fn);
 
 #endif  /*_KBASE_DEBUGFS_HELPER_H_ */
 
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_defs.h b/drivers/gpu/arm/bifrost/mali_kbase_defs.h
index 6cff28c90566..ce0a247cb603 100755
--- a/drivers/gpu/arm/bifrost/mali_kbase_defs.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_defs.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2011-2021 ARM Limited. All rights reserved.
@@ -32,7 +32,7 @@
 #include <mali_base_hwconfig_issues.h>
 #include <mali_kbase_mem_lowlevel.h>
 #include <mmu/mali_kbase_mmu_hw.h>
-#include <mali_kbase_instr_defs.h>
+#include <backend/gpu/mali_kbase_instr_defs.h>
 #include <mali_kbase_pm.h>
 #include <mali_kbase_gpuprops_types.h>
 #if MALI_USE_CSF
@@ -55,7 +55,7 @@
 #include "mali_kbase_fence_defs.h"
 #endif
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 #include <linux/debugfs.h>
 #endif /* CONFIG_DEBUG_FS */
 
@@ -315,10 +315,9 @@ struct kbase_clk_rate_listener;
  * sleep. No clock rate manager functions must be called from here, as
  * its lock is taken.
  */
-typedef void (*kbase_clk_rate_listener_on_change_t)(
-	struct kbase_clk_rate_listener *listener,
-	u32 clk_index,
-	u32 clk_rate_hz);
+typedef void
+kbase_clk_rate_listener_on_change_t(struct kbase_clk_rate_listener *listener,
+				    u32 clk_index, u32 clk_rate_hz);
 
 /**
  * struct kbase_clk_rate_listener - Clock frequency listener
@@ -328,7 +327,7 @@ typedef void (*kbase_clk_rate_listener_on_change_t)(
  */
 struct kbase_clk_rate_listener {
 	struct list_head node;
-	kbase_clk_rate_listener_on_change_t notify;
+	kbase_clk_rate_listener_on_change_t *notify;
 };
 
 /**
@@ -673,6 +672,7 @@ struct kbase_process {
  *                         accesses made by the driver.
  * @pm:                    Per device object for storing data for power management
  *                         framework.
+ * @fw_load_lock:          Mutex to protect firmware loading in @ref kbase_open.
  * @csf:                   CSF object for the GPU device.
  * @js_data:               Per device object encapsulating the current context of
  *                         Job Scheduler, which is global to the device and is not
@@ -911,8 +911,12 @@ struct kbase_process {
  * @dummy_job_wa.jc:        dummy job workaround job
  * @dummy_job_wa.slot:      dummy job workaround slot
  * @dummy_job_wa.flags:     dummy job workaround flags
+ * @dummy_job_wa_loaded:    Flag for indicating that the workaround blob has
+ *                          been loaded. Protected by @fw_load_lock.
  * @arb:                    Pointer to the arbiter device
  * @pcm_dev:                The priority control manager device.
+ * @oom_notifier_block:     notifier_block containing kernel-registered out-of-
+ *                          memory handler.
  */
 struct kbase_device {
 	u32 hw_quirks_sc;
@@ -934,7 +938,7 @@ struct kbase_device {
 
 	struct clk *clocks[BASE_MAX_NR_CLOCKS_REGULATORS];
 	unsigned int nr_clocks;
-#ifdef CONFIG_REGULATOR
+#if IS_ENABLED(CONFIG_REGULATOR)
 	struct regulator *regulators[BASE_MAX_NR_CLOCKS_REGULATORS];
 	unsigned int nr_regulators;
 #if (KERNEL_VERSION(4, 10, 0) <= LINUX_VERSION_CODE)
@@ -944,16 +948,6 @@ struct kbase_device {
 	char devname[DEVNAME_SIZE];
 	u32  id;
 
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-	void *model;
-	struct kmem_cache *irq_slab;
-	struct workqueue_struct *irq_workq;
-	atomic_t serving_job_irq;
-	atomic_t serving_gpu_irq;
-	atomic_t serving_mmu_irq;
-	spinlock_t reg_op_lock;
-#endif	/* CONFIG_MALI_BIFROST_NO_MALI */
-
 	struct kbase_pm_device_data pm;
 
 	struct kbase_mem_pool_group mem_pools;
@@ -1032,7 +1026,7 @@ struct kbase_device {
 	struct ipa_power_model_data *model_data;
 	struct kbase_devfreq_queue_info devfreq_queue;
 
-#ifdef CONFIG_DEVFREQ_THERMAL
+#if IS_ENABLED(CONFIG_DEVFREQ_THERMAL)
 	struct thermal_cooling_device *devfreq_cooling;
 	bool ipa_protection_mode_switched;
 	struct {
@@ -1060,7 +1054,7 @@ struct kbase_device {
 
 	atomic_t job_fault_debug;
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 	struct dentry *mali_debugfs_directory;
 	struct dentry *debugfs_ctx_directory;
 	struct dentry *debugfs_instr_directory;
@@ -1084,7 +1078,7 @@ struct kbase_device {
 
 	atomic_t ctx_num;
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 	struct kbase_io_history io_history;
 #endif /* CONFIG_DEBUG_FS */
 
@@ -1137,6 +1131,7 @@ struct kbase_device {
 	bool l2_hash_values_override;
 	u32 l2_hash_values[ASN_HASH_COUNT];
 
+	struct mutex fw_load_lock;
 #if MALI_USE_CSF
 	/* CSF object for the GPU device. */
 	struct kbase_csf_device csf;
@@ -1168,12 +1163,15 @@ struct kbase_device {
 		int slot;
 		u64 flags;
 	} dummy_job_wa;
+	bool dummy_job_wa_loaded;
 
 #ifdef CONFIG_MALI_ARBITER_SUPPORT
 		struct kbase_arbiter_device arb;
 #endif
 	/* Priority Control Manager device */
 	struct priority_control_manager_device *pcm_dev;
+
+	struct notifier_block oom_notifier_block;
 };
 
 /**
@@ -1506,6 +1504,8 @@ struct kbase_reg_zone {
  *                        evictable/reclaimable.
  * @evict_list:           List head for the list containing the allocations which
  *                        can be evicted or freed up in the shrinker callback.
+ * @evict_nents:          Total number of pages allocated by the allocations within
+ *                        @evict_list (atomic).
  * @waiting_soft_jobs:    List head for the list containing softjob atoms, which
  *                        are either waiting for the event set operation, or waiting
  *                        for the signaling of input fence or waiting for the GPU
@@ -1673,6 +1673,7 @@ struct kbase_reg_zone {
  *                        contexts, for timeline summarization.
  * @limited_core_mask:    The mask that is applied to the affinity in case of atoms
  *                        marked with BASE_JD_REQ_LIMITED_CORE_MASK.
+ * @platform_data:        Pointer to platform specific per-context data.
  *
  * A kernel base context is an entity among which the GPU is scheduled.
  * Each context has its own GPU address space.
@@ -1748,6 +1749,7 @@ struct kbase_context {
 
 	struct shrinker         reclaim;
 	struct list_head        evict_list;
+	atomic_t evict_nents;
 
 	struct list_head waiting_soft_jobs;
 	spinlock_t waiting_soft_jobs_lock;
@@ -1767,7 +1769,7 @@ struct kbase_context {
 	u64 gpu_va_end;
 	bool jit_va;
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 	char *mem_profile_data;
 	size_t mem_profile_size;
 	struct mutex mem_profile_lock;
@@ -1821,6 +1823,10 @@ struct kbase_context {
 	struct list_head tl_kctx_list_node;
 
 	u64 limited_core_mask;
+
+#if !MALI_USE_CSF
+	void *platform_data;
+#endif
 };
 
 #ifdef CONFIG_MALI_CINSTR_GWT
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_disjoint_events.c b/drivers/gpu/arm/bifrost/mali_kbase_disjoint_events.c
index 0b73f558ba06..7d6e475585ae 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_disjoint_events.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_disjoint_events.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2014, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_dma_fence.c b/drivers/gpu/arm/bifrost/mali_kbase_dma_fence.c
index 3bf80ea9601a..378f0bad9a3d 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_dma_fence.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_dma_fence.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2011-2016, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2016, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -27,7 +27,7 @@
 #include <linux/list.h>
 #include <linux/lockdep.h>
 #include <linux/mutex.h>
-#include <linux/reservation.h>
+#include <linux/version.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/workqueue.h>
@@ -247,7 +247,12 @@ kbase_dma_fence_add_reservation_callback(struct kbase_jd_atom *katom,
 	unsigned int shared_count = 0;
 	int err, i;
 
-	err = reservation_object_get_fences_rcu(resv,
+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
+	err = reservation_object_get_fences_rcu(
+#else
+	err = dma_resv_get_fences_rcu(
+#endif
+						resv,
 						&excl_fence,
 						&shared_count,
 						&shared_fences);
@@ -365,7 +370,11 @@ int kbase_dma_fence_wait(struct kbase_jd_atom *katom,
 		struct dma_resv *obj = info->resv_objs[i];
 #endif
 		if (!test_bit(i, info->dma_fence_excl_bitmap)) {
+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
 			err = reservation_object_reserve_shared(obj);
+#else
+			err = dma_resv_reserve_shared(obj, 0);
+#endif
 			if (err) {
 				dev_err(katom->kctx->kbdev->dev,
 					"Error %d reserving space for shared fence.\n", err);
@@ -379,7 +388,11 @@ int kbase_dma_fence_wait(struct kbase_jd_atom *katom,
 				goto end;
 			}
 
+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
 			reservation_object_add_shared_fence(obj, fence);
+#else
+			dma_resv_add_shared_fence(obj, fence);
+#endif
 		} else {
 			err = kbase_dma_fence_add_reservation_callback(katom, obj, true);
 			if (err) {
@@ -388,7 +401,11 @@ int kbase_dma_fence_wait(struct kbase_jd_atom *katom,
 				goto end;
 			}
 
+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
 			reservation_object_add_excl_fence(obj, fence);
+#else
+			dma_resv_add_excl_fence(obj, fence);
+#endif
 		}
 	}
 
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_dma_fence.h b/drivers/gpu/arm/bifrost/mali_kbase_dma_fence.h
index bedc8c0c5907..dc413f413265 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_dma_fence.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_dma_fence.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2010-2016, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2016, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -25,7 +25,12 @@
 #ifdef CONFIG_MALI_BIFROST_DMA_FENCE
 
 #include <linux/list.h>
+#include <linux/version.h>
+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
 #include <linux/reservation.h>
+#else
+#include <linux/dma-resv.h>
+#endif
 #include <mali_kbase_fence.h>
 
 /* Forward declaration from mali_kbase_defs.h */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_dummy_job_wa.c b/drivers/gpu/arm/bifrost/mali_kbase_dummy_job_wa.c
index e7a87812aafa..1e91ba0b2681 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_dummy_job_wa.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_dummy_job_wa.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -281,6 +281,8 @@ int kbase_dummy_job_wa_load(struct kbase_device *kbdev)
 	int err;
 	struct kbase_context *kctx;
 
+	lockdep_assert_held(&kbdev->fw_load_lock);
+
 	if (!wa_blob_load_needed(kbdev))
 		return 0;
 
@@ -426,6 +428,10 @@ void kbase_dummy_job_wa_cleanup(struct kbase_device *kbdev)
 {
 	struct kbase_context *wa_ctx;
 
+	/* return if the dummy job has not been loaded */
+	if (kbdev->dummy_job_wa_loaded == false)
+		return;
+
 	/* Can be safely called even if the file wasn't created on probe */
 	sysfs_remove_file(&kbdev->dev->kobj, &dev_attr_dummy_job_wa_info.attr);
 
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_dummy_job_wa.h b/drivers/gpu/arm/bifrost/mali_kbase_dummy_job_wa.h
index 4f3c2275ed44..8713ba1eaa6f 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_dummy_job_wa.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_dummy_job_wa.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_dvfs_debugfs.c b/drivers/gpu/arm/bifrost/mali_kbase_dvfs_debugfs.c
index ce23ede7e512..1e584deb0e33 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_dvfs_debugfs.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_dvfs_debugfs.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -23,7 +23,7 @@
 #include <mali_kbase.h>
 #include <linux/seq_file.h>
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 
 /**
  * kbasep_dvfs_utilization_debugfs_show() - Print the DVFS utilization info
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_dvfs_debugfs.h b/drivers/gpu/arm/bifrost/mali_kbase_dvfs_debugfs.h
index 080331f8bdf5..8334db7cc1ed 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_dvfs_debugfs.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_dvfs_debugfs.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_event.c b/drivers/gpu/arm/bifrost/mali_kbase_event.c
index 25a379d9f0e1..910c51170ae8 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_event.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_event.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2010-2016,2018-2021 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2016, 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_fence.c b/drivers/gpu/arm/bifrost/mali_kbase_fence.c
index d65b4ebf2535..01557cd3ba47 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_fence.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_fence.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2011-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_fence.h b/drivers/gpu/arm/bifrost/mali_kbase_fence.h
index ff7dc8144a50..f46156ba7bb1 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_fence.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_fence.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2010-2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_fence_defs.h b/drivers/gpu/arm/bifrost/mali_kbase_fence_defs.h
index 006512d461f9..7a150bdf2947 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_fence_defs.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_fence_defs.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2010-2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_fence_ops.c b/drivers/gpu/arm/bifrost/mali_kbase_fence_ops.c
index 4712ef4f0606..14ddf0308317 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_fence_ops.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_fence_ops.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_gator.h b/drivers/gpu/arm/bifrost/mali_kbase_gator.h
index 180beda91252..408ab865fcf8 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_gator.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_gator.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2011-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_gpu_memory_debugfs.c b/drivers/gpu/arm/bifrost/mali_kbase_gpu_memory_debugfs.c
index a10b2bb8a416..cb372ea52aa5 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_gpu_memory_debugfs.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_gpu_memory_debugfs.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2012-2017, 2019-2021 ARM Limited. All rights reserved.
@@ -22,7 +22,7 @@
 #include <mali_kbase.h>
 #include <device/mali_kbase_device.h>
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 /**
  * kbasep_gpu_memory_seq_show - Show callback for the @c gpu_memory debugfs file
  * @sfile: The debugfs entry
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_gpu_memory_debugfs.h b/drivers/gpu/arm/bifrost/mali_kbase_gpu_memory_debugfs.h
index 023703bf2e1e..6d5423f379d4 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_gpu_memory_debugfs.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_gpu_memory_debugfs.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2012-2014, 2016, 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_gpuprops.c b/drivers/gpu/arm/bifrost/mali_kbase_gpuprops.c
index 229188b0db9a..54cf98b4ce32 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_gpuprops.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_gpuprops.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2011-2021 ARM Limited. All rights reserved.
@@ -30,7 +30,7 @@
 #include <mali_kbase_config_defaults.h>
 #include <uapi/gpu/arm/bifrost/mali_kbase_ioctl.h>
 #include <linux/clk.h>
-#include <mali_kbase_pm_internal.h>
+#include <backend/gpu/mali_kbase_pm_internal.h>
 #include <linux/of_platform.h>
 #include <linux/moduleparam.h>
 
@@ -531,6 +531,14 @@ static int num_override_l2_hash_values;
 module_param_array(l2_hash_values, uint, &num_override_l2_hash_values, 0000);
 MODULE_PARM_DESC(l2_hash_values, "Override L2 hash values config for testing");
 
+/* Definitions for range of supported user defined hash functions for GPUs
+ * that support L2_CONFIG and not ASN_HASH features. Supported hash function
+ * range from 0b1000-0b1111 inclusive. Selection of any other values will
+ * lead to undefined behavior.
+ */
+#define USER_DEFINED_HASH_LO ((u8)0x08)
+#define USER_DEFINED_HASH_HI ((u8)0x0F)
+
 enum l2_config_override_result {
 	L2_CONFIG_OVERRIDE_FAIL = -1,
 	L2_CONFIG_OVERRIDE_NONE,
@@ -562,7 +570,11 @@ kbase_read_l2_config_from_dt(struct kbase_device *const kbdev)
 	else if (of_property_read_u8(np, "l2-size", &kbdev->l2_size_override))
 		kbdev->l2_size_override = 0;
 
-	if (override_l2_hash)
+	/* Check overriding value is supported, if not will result in
+	 * undefined behavior.
+	 */
+	if (override_l2_hash >= USER_DEFINED_HASH_LO &&
+	    override_l2_hash <= USER_DEFINED_HASH_HI)
 		kbdev->l2_hash_override = override_l2_hash;
 	else if (of_property_read_u8(np, "l2-hash", &kbdev->l2_hash_override))
 		kbdev->l2_hash_override = 0;
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_gpuprops.h b/drivers/gpu/arm/bifrost/mali_kbase_gpuprops.h
index 72f76c392fa1..b20b99b654a7 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_gpuprops.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_gpuprops.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2011-2015, 2017, 2019-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_gpuprops_types.h b/drivers/gpu/arm/bifrost/mali_kbase_gpuprops_types.h
index 1d101e0a3e0c..b8411d37a4ed 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_gpuprops_types.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_gpuprops_types.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2011-2018, 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_gwt.c b/drivers/gpu/arm/bifrost/mali_kbase_gwt.c
index 93acf8a82b4f..2a20a3da4018 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_gwt.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_gwt.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_gwt.h b/drivers/gpu/arm/bifrost/mali_kbase_gwt.h
index d85833442aa6..a55f9ccc644c 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_gwt.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_gwt.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2010-2017, 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hw.c b/drivers/gpu/arm/bifrost/mali_kbase_hw.c
index b1758d77aceb..7ad583cdba37 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hw.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hw.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2012-2021 ARM Limited. All rights reserved.
@@ -75,6 +75,12 @@ void kbase_hw_set_features_mask(struct kbase_device *kbdev)
 	case GPU_ID2_PRODUCT_LODX:
 		features = base_hw_features_tODx;
 		break;
+	case GPU_ID2_PRODUCT_TGRX:
+		features = base_hw_features_tGRx;
+		break;
+	case GPU_ID2_PRODUCT_TVAX:
+		features = base_hw_features_tVAx;
+		break;
 	default:
 		features = base_hw_features_generic;
 		break;
@@ -211,6 +217,14 @@ static const enum base_hw_issue *kbase_hw_get_issues_for_new_id(
 		{ GPU_ID2_PRODUCT_LODX,
 		  { { GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tODx_r0p0 },
 		    { U32_MAX, NULL } } },
+
+		{ GPU_ID2_PRODUCT_TGRX,
+		  { { GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tGRx_r0p0 },
+		    { U32_MAX, NULL } } },
+
+		{ GPU_ID2_PRODUCT_TVAX,
+		  { { GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tVAx_r0p0 },
+		    { U32_MAX, NULL } } },
 	};
 
 	u32 gpu_id = kbdev->gpu_props.props.raw_props.gpu_id;
@@ -360,6 +374,12 @@ int kbase_hw_set_issues_mask(struct kbase_device *kbdev)
 		case GPU_ID2_PRODUCT_LODX:
 			issues = base_hw_issues_model_tODx;
 			break;
+		case GPU_ID2_PRODUCT_TGRX:
+			issues = base_hw_issues_model_tGRx;
+			break;
+		case GPU_ID2_PRODUCT_TVAX:
+			issues = base_hw_issues_model_tVAx;
+			break;
 		default:
 			dev_err(kbdev->dev,
 				"Unknown GPU ID %x", gpu_id);
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hw.h b/drivers/gpu/arm/bifrost/mali_kbase_hw.h
index 65b417c95e13..6c04a237577c 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hw.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hw.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2012-2017, 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_backend.h b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_backend.h
index 90851e2aa85f..0da4eb258a24 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_backend.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_backend.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2014-2015, 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2015, 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_defs.h b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_defs.h
index 97a593fb6dbe..62a6ec51b17f 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_defs.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_defs.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2014, 2016-2018, 2020-2021 ARM Limited. All rights reserved.
@@ -26,7 +26,7 @@
 #ifndef _KBASE_HWACCESS_DEFS_H_
 #define _KBASE_HWACCESS_DEFS_H_
 
-#include <mali_kbase_jm_defs.h>
+#include <backend/gpu/mali_kbase_jm_defs.h>
 
 /**
  * struct kbase_hwaccess_data - object encapsulating the GPU backend specific
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_gpuprops.h b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_gpuprops.h
index 0fca83e4eb2a..71ccc91e6b9d 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_gpuprops.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_gpuprops.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2014-2015, 2018, 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2015, 2018, 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_instr.h b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_instr.h
index 959bfeb2096c..f8369536b1dc 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_instr.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_instr.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2014-2015, 2017-2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2015, 2017-2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -26,7 +26,7 @@
 #ifndef _KBASE_HWACCESS_INSTR_H_
 #define _KBASE_HWACCESS_INSTR_H_
 
-#include <mali_kbase_instr_defs.h>
+#include <backend/gpu/mali_kbase_instr_defs.h>
 
 /**
  * struct kbase_instr_hwcnt_enable - Enable hardware counter collection.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_jm.h b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_jm.h
index 0e513c757094..8689647aaa8b 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_jm.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_jm.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_pm.h b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_pm.h
index 4b2a53e960e9..36bbe2d781ab 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_pm.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_pm.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2014-2015, 2018-2021 ARM Limited. All rights reserved.
@@ -29,7 +29,7 @@
 #include <gpu/mali_kbase_gpu_regmap.h>
 #include <linux/atomic.h>
 
-#include <mali_kbase_pm_defs.h>
+#include <backend/gpu/mali_kbase_pm_defs.h>
 
 /* Forward definition - see mali_kbase.h */
 struct kbase_device;
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_time.h b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_time.h
index 8488a321c2ee..8a4ece4417e0 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_time.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_time.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2014, 2018-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt.c b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt.c
index 6bd7d5f69663..ea4893ddcf58 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_accumulator.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_accumulator.h
index fbd13a442691..4887eaa19833 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_accumulator.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_accumulator.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend.h
index a3013a616579..0b5a188ecaeb 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2018, 2020-2021 ARM Limited. All rights reserved.
@@ -56,8 +56,8 @@ struct kbase_hwcnt_backend;
  *
  * Return: Non-NULL pointer to immutable hardware counter metadata.
  */
-typedef const struct kbase_hwcnt_metadata *(*kbase_hwcnt_backend_metadata_fn)(
-	const struct kbase_hwcnt_backend_info *info);
+typedef const struct kbase_hwcnt_metadata *
+kbase_hwcnt_backend_metadata_fn(const struct kbase_hwcnt_backend_info *info);
 
 /**
  * typedef kbase_hwcnt_backend_init_fn - Initialise a counter backend.
@@ -69,16 +69,15 @@ typedef const struct kbase_hwcnt_metadata *(*kbase_hwcnt_backend_metadata_fn)(
  *
  * Return: 0 on success, else error code.
  */
-typedef int (*kbase_hwcnt_backend_init_fn)(
-	const struct kbase_hwcnt_backend_info *info,
-	struct kbase_hwcnt_backend **out_backend);
+typedef int
+kbase_hwcnt_backend_init_fn(const struct kbase_hwcnt_backend_info *info,
+			    struct kbase_hwcnt_backend **out_backend);
 
 /**
  * typedef kbase_hwcnt_backend_term_fn - Terminate a counter backend.
  * @backend: Pointer to backend to be terminated.
  */
-typedef void (*kbase_hwcnt_backend_term_fn)(
-	struct kbase_hwcnt_backend *backend);
+typedef void kbase_hwcnt_backend_term_fn(struct kbase_hwcnt_backend *backend);
 
 /**
  * typedef kbase_hwcnt_backend_timestamp_ns_fn - Get the current backend
@@ -87,8 +86,8 @@ typedef void (*kbase_hwcnt_backend_term_fn)(
  *
  * Return: Backend timestamp in nanoseconds.
  */
-typedef u64 (*kbase_hwcnt_backend_timestamp_ns_fn)(
-	struct kbase_hwcnt_backend *backend);
+typedef u64
+kbase_hwcnt_backend_timestamp_ns_fn(struct kbase_hwcnt_backend *backend);
 
 /**
  * typedef kbase_hwcnt_backend_dump_enable_fn - Start counter dumping with the
@@ -103,7 +102,7 @@ typedef u64 (*kbase_hwcnt_backend_timestamp_ns_fn)(
  *
  * Return: 0 on success, else error code.
  */
-typedef int (*kbase_hwcnt_backend_dump_enable_fn)(
+typedef int kbase_hwcnt_backend_dump_enable_fn(
 	struct kbase_hwcnt_backend *backend,
 	const struct kbase_hwcnt_enable_map *enable_map);
 
@@ -119,7 +118,7 @@ typedef int (*kbase_hwcnt_backend_dump_enable_fn)(
  *
  * Return: 0 on success, else error code.
  */
-typedef int (*kbase_hwcnt_backend_dump_enable_nolock_fn)(
+typedef int kbase_hwcnt_backend_dump_enable_nolock_fn(
 	struct kbase_hwcnt_backend *backend,
 	const struct kbase_hwcnt_enable_map *enable_map);
 
@@ -131,8 +130,8 @@ typedef int (*kbase_hwcnt_backend_dump_enable_nolock_fn)(
  * If the backend is already disabled, does nothing.
  * Any undumped counter values since the last dump get will be lost.
  */
-typedef void (*kbase_hwcnt_backend_dump_disable_fn)(
-	struct kbase_hwcnt_backend *backend);
+typedef void
+kbase_hwcnt_backend_dump_disable_fn(struct kbase_hwcnt_backend *backend);
 
 /**
  * typedef kbase_hwcnt_backend_dump_clear_fn - Reset all the current undumped
@@ -143,8 +142,8 @@ typedef void (*kbase_hwcnt_backend_dump_disable_fn)(
  *
  * Return: 0 on success, else error code.
  */
-typedef int (*kbase_hwcnt_backend_dump_clear_fn)(
-	struct kbase_hwcnt_backend *backend);
+typedef int
+kbase_hwcnt_backend_dump_clear_fn(struct kbase_hwcnt_backend *backend);
 
 /**
  * typedef kbase_hwcnt_backend_dump_request_fn - Request an asynchronous counter
@@ -158,9 +157,9 @@ typedef int (*kbase_hwcnt_backend_dump_clear_fn)(
  *
  * Return: 0 on success, else error code.
  */
-typedef int (*kbase_hwcnt_backend_dump_request_fn)(
-	struct kbase_hwcnt_backend *backend,
-	u64 *dump_time_ns);
+typedef int
+kbase_hwcnt_backend_dump_request_fn(struct kbase_hwcnt_backend *backend,
+				    u64 *dump_time_ns);
 
 /**
  * typedef kbase_hwcnt_backend_dump_wait_fn - Wait until the last requested
@@ -171,8 +170,8 @@ typedef int (*kbase_hwcnt_backend_dump_request_fn)(
  *
  * Return: 0 on success, else error code.
  */
-typedef int (*kbase_hwcnt_backend_dump_wait_fn)(
-	struct kbase_hwcnt_backend *backend);
+typedef int
+kbase_hwcnt_backend_dump_wait_fn(struct kbase_hwcnt_backend *backend);
 
 /**
  * typedef kbase_hwcnt_backend_dump_get_fn - Copy or accumulate enable the
@@ -190,11 +189,11 @@ typedef int (*kbase_hwcnt_backend_dump_wait_fn)(
  *
  * Return: 0 on success, else error code.
  */
-typedef int (*kbase_hwcnt_backend_dump_get_fn)(
-	struct kbase_hwcnt_backend *backend,
-	struct kbase_hwcnt_dump_buffer *dump_buffer,
-	const struct kbase_hwcnt_enable_map *enable_map,
-	bool accumulate);
+typedef int
+kbase_hwcnt_backend_dump_get_fn(struct kbase_hwcnt_backend *backend,
+				struct kbase_hwcnt_dump_buffer *dump_buffer,
+				const struct kbase_hwcnt_enable_map *enable_map,
+				bool accumulate);
 
 /**
  * struct kbase_hwcnt_backend_interface - Hardware counter backend virtual
@@ -218,17 +217,17 @@ typedef int (*kbase_hwcnt_backend_dump_get_fn)(
  */
 struct kbase_hwcnt_backend_interface {
 	const struct kbase_hwcnt_backend_info *info;
-	kbase_hwcnt_backend_metadata_fn metadata;
-	kbase_hwcnt_backend_init_fn init;
-	kbase_hwcnt_backend_term_fn term;
-	kbase_hwcnt_backend_timestamp_ns_fn timestamp_ns;
-	kbase_hwcnt_backend_dump_enable_fn dump_enable;
-	kbase_hwcnt_backend_dump_enable_nolock_fn dump_enable_nolock;
-	kbase_hwcnt_backend_dump_disable_fn dump_disable;
-	kbase_hwcnt_backend_dump_clear_fn dump_clear;
-	kbase_hwcnt_backend_dump_request_fn dump_request;
-	kbase_hwcnt_backend_dump_wait_fn dump_wait;
-	kbase_hwcnt_backend_dump_get_fn dump_get;
+	kbase_hwcnt_backend_metadata_fn *metadata;
+	kbase_hwcnt_backend_init_fn *init;
+	kbase_hwcnt_backend_term_fn *term;
+	kbase_hwcnt_backend_timestamp_ns_fn *timestamp_ns;
+	kbase_hwcnt_backend_dump_enable_fn *dump_enable;
+	kbase_hwcnt_backend_dump_enable_nolock_fn *dump_enable_nolock;
+	kbase_hwcnt_backend_dump_disable_fn *dump_disable;
+	kbase_hwcnt_backend_dump_clear_fn *dump_clear;
+	kbase_hwcnt_backend_dump_request_fn *dump_request;
+	kbase_hwcnt_backend_dump_wait_fn *dump_wait;
+	kbase_hwcnt_backend_dump_get_fn *dump_get;
 };
 
 #endif /* _KBASE_HWCNT_BACKEND_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf.c b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf.c
index d9592fd70529..eb9263f45cd8 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
@@ -228,7 +228,7 @@ struct kbase_hwcnt_backend_csf {
 	struct work_struct hwc_threshold_work;
 };
 
-bool kbasep_hwcnt_backend_csf_backend_exists(
+static bool kbasep_hwcnt_backend_csf_backend_exists(
 	struct kbase_hwcnt_backend_csf_info *csf_info)
 {
 	WARN_ON(!csf_info);
@@ -347,8 +347,10 @@ static void kbasep_hwcnt_backend_csf_init_layout(
 	phys_layout->shader_avail_mask = prfcnt_info->core_mask;
 
 	phys_layout->headers_per_block = KBASE_HWCNT_V5_HEADERS_PER_BLOCK;
-	phys_layout->counters_per_block = KBASE_HWCNT_V5_COUNTERS_PER_BLOCK;
-	phys_layout->values_per_block = KBASE_HWCNT_V5_VALUES_PER_BLOCK;
+	phys_layout->values_per_block =
+		prfcnt_info->prfcnt_block_size / KBASE_HWCNT_VALUE_BYTES;
+	phys_layout->counters_per_block =
+		phys_layout->values_per_block - phys_layout->headers_per_block;
 	phys_layout->offset_enable_mask = KBASE_HWCNT_V5_PRFCNT_EN_HEADER;
 }
 
@@ -1783,6 +1785,9 @@ int kbase_hwcnt_backend_csf_metadata_init(
 	gpu_info.l2_count = csf_info->prfcnt_info.l2_count;
 	gpu_info.core_mask = csf_info->prfcnt_info.core_mask;
 	gpu_info.clk_cnt = csf_info->prfcnt_info.clk_cnt;
+	gpu_info.prfcnt_values_per_block =
+		csf_info->prfcnt_info.prfcnt_block_size /
+		KBASE_HWCNT_VALUE_BYTES;
 	errcode = kbase_hwcnt_csf_metadata_create(
 		&gpu_info, csf_info->counter_set, &csf_info->metadata);
 	if (errcode)
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf.h
index 75062744753a..ce1af9a3bf5f 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf_if.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf_if.h
index b4ddd31d3cb0..f6387c2fcc2b 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf_if.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf_if.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
@@ -65,6 +65,7 @@ struct kbase_hwcnt_backend_csf_if_enable {
  *                                                 information.
  * @dump_bytes:       Bytes of GPU memory required to perform a performance
  *                    counter dump.
+ * @prfcnt_block_size Bytes of each performance counter block.
  * @l2_count:         The MMU L2 cache count.
  * @core_mask:        Shader core mask.
  * @clk_cnt:          Clock domain count in the system.
@@ -73,6 +74,7 @@ struct kbase_hwcnt_backend_csf_if_enable {
  */
 struct kbase_hwcnt_backend_csf_if_prfcnt_info {
 	size_t dump_bytes;
+	size_t prfcnt_block_size;
 	size_t l2_count;
 	u64 core_mask;
 	u8 clk_cnt;
@@ -85,7 +87,7 @@ struct kbase_hwcnt_backend_csf_if_prfcnt_info {
  *                                                          held.
  * @ctx: Non-NULL pointer to a CSF context.
  */
-typedef void (*kbase_hwcnt_backend_csf_if_assert_lock_held_fn)(
+typedef void kbase_hwcnt_backend_csf_if_assert_lock_held_fn(
 	struct kbase_hwcnt_backend_csf_if_ctx *ctx);
 
 /**
@@ -95,8 +97,9 @@ typedef void (*kbase_hwcnt_backend_csf_if_assert_lock_held_fn)(
  * @flags: Pointer to the memory location that would store the previous
  *         interrupt state.
  */
-typedef void (*kbase_hwcnt_backend_csf_if_lock_fn)(
-	struct kbase_hwcnt_backend_csf_if_ctx *ctx, unsigned long *flags);
+typedef void
+kbase_hwcnt_backend_csf_if_lock_fn(struct kbase_hwcnt_backend_csf_if_ctx *ctx,
+				   unsigned long *flags);
 
 /**
  * typedef kbase_hwcnt_backend_csf_if_unlock_fn - Release backend spinlock.
@@ -105,8 +108,9 @@ typedef void (*kbase_hwcnt_backend_csf_if_lock_fn)(
  * @flags: Previously stored interrupt state when Scheduler interrupt
  *         spinlock was acquired.
  */
-typedef void (*kbase_hwcnt_backend_csf_if_unlock_fn)(
-	struct kbase_hwcnt_backend_csf_if_ctx *ctx, unsigned long flags);
+typedef void
+kbase_hwcnt_backend_csf_if_unlock_fn(struct kbase_hwcnt_backend_csf_if_ctx *ctx,
+				     unsigned long flags);
 
 /**
  * typedef kbase_hwcnt_backend_csf_if_get_prfcnt_info_fn - Get performance
@@ -115,7 +119,7 @@ typedef void (*kbase_hwcnt_backend_csf_if_unlock_fn)(
  * @prfcnt_info:  Non-NULL pointer to struct where performance counter
  *                information should be stored.
  */
-typedef void (*kbase_hwcnt_backend_csf_if_get_prfcnt_info_fn)(
+typedef void kbase_hwcnt_backend_csf_if_get_prfcnt_info_fn(
 	struct kbase_hwcnt_backend_csf_if_ctx *ctx,
 	struct kbase_hwcnt_backend_csf_if_prfcnt_info *prfcnt_info);
 
@@ -135,7 +139,7 @@ typedef void (*kbase_hwcnt_backend_csf_if_get_prfcnt_info_fn)(
  *
  * Return: 0 on success, else error code.
  */
-typedef int (*kbase_hwcnt_backend_csf_if_ring_buf_alloc_fn)(
+typedef int kbase_hwcnt_backend_csf_if_ring_buf_alloc_fn(
 	struct kbase_hwcnt_backend_csf_if_ctx *ctx, u32 buf_count,
 	void **cpu_dump_base,
 	struct kbase_hwcnt_backend_csf_if_ring_buf **ring_buf);
@@ -157,7 +161,7 @@ typedef int (*kbase_hwcnt_backend_csf_if_ring_buf_alloc_fn)(
  * Flush cached HWC dump buffer data to ensure that all writes from GPU and CPU
  * are correctly observed.
  */
-typedef void (*kbase_hwcnt_backend_csf_if_ring_buf_sync_fn)(
+typedef void kbase_hwcnt_backend_csf_if_ring_buf_sync_fn(
 	struct kbase_hwcnt_backend_csf_if_ctx *ctx,
 	struct kbase_hwcnt_backend_csf_if_ring_buf *ring_buf,
 	u32 buf_index_first, u32 buf_index_last, bool for_cpu);
@@ -169,7 +173,7 @@ typedef void (*kbase_hwcnt_backend_csf_if_ring_buf_sync_fn)(
  * @ctx:      Non-NULL pointer to a CSF interface context.
  * @ring_buf: Non-NULL pointer to the ring buffer which to be freed.
  */
-typedef void (*kbase_hwcnt_backend_csf_if_ring_buf_free_fn)(
+typedef void kbase_hwcnt_backend_csf_if_ring_buf_free_fn(
 	struct kbase_hwcnt_backend_csf_if_ctx *ctx,
 	struct kbase_hwcnt_backend_csf_if_ring_buf *ring_buf);
 
@@ -181,7 +185,7 @@ typedef void (*kbase_hwcnt_backend_csf_if_ring_buf_free_fn)(
  *
  * Return: CSF interface timestamp in nanoseconds.
  */
-typedef u64 (*kbase_hwcnt_backend_csf_if_timestamp_ns_fn)(
+typedef u64 kbase_hwcnt_backend_csf_if_timestamp_ns_fn(
 	struct kbase_hwcnt_backend_csf_if_ctx *ctx);
 
 /**
@@ -193,7 +197,7 @@ typedef u64 (*kbase_hwcnt_backend_csf_if_timestamp_ns_fn)(
  *
  * Requires lock to be taken before calling.
  */
-typedef void (*kbase_hwcnt_backend_csf_if_dump_enable_fn)(
+typedef void kbase_hwcnt_backend_csf_if_dump_enable_fn(
 	struct kbase_hwcnt_backend_csf_if_ctx *ctx,
 	struct kbase_hwcnt_backend_csf_if_ring_buf *ring_buf,
 	struct kbase_hwcnt_backend_csf_if_enable *enable);
@@ -205,7 +209,7 @@ typedef void (*kbase_hwcnt_backend_csf_if_dump_enable_fn)(
  *
  * Requires lock to be taken before calling.
  */
-typedef void (*kbase_hwcnt_backend_csf_if_dump_disable_fn)(
+typedef void kbase_hwcnt_backend_csf_if_dump_disable_fn(
 	struct kbase_hwcnt_backend_csf_if_ctx *ctx);
 
 /**
@@ -215,7 +219,7 @@ typedef void (*kbase_hwcnt_backend_csf_if_dump_disable_fn)(
  *
  * Requires lock to be taken before calling.
  */
-typedef void (*kbase_hwcnt_backend_csf_if_dump_request_fn)(
+typedef void kbase_hwcnt_backend_csf_if_dump_request_fn(
 	struct kbase_hwcnt_backend_csf_if_ctx *ctx);
 
 /**
@@ -229,7 +233,7 @@ typedef void (*kbase_hwcnt_backend_csf_if_dump_request_fn)(
  *
  * Requires lock to be taken before calling.
  */
-typedef void (*kbase_hwcnt_backend_csf_if_get_indexes_fn)(
+typedef void kbase_hwcnt_backend_csf_if_get_indexes_fn(
 	struct kbase_hwcnt_backend_csf_if_ctx *ctx, u32 *extract_index,
 	u32 *insert_index);
 
@@ -243,7 +247,7 @@ typedef void (*kbase_hwcnt_backend_csf_if_get_indexes_fn)(
  *
  * Requires lock to be taken before calling.
  */
-typedef void (*kbase_hwcnt_backend_csf_if_set_extract_index_fn)(
+typedef void kbase_hwcnt_backend_csf_if_set_extract_index_fn(
 	struct kbase_hwcnt_backend_csf_if_ctx *ctx, u32 extract_index);
 
 /**
@@ -258,7 +262,7 @@ typedef void (*kbase_hwcnt_backend_csf_if_set_extract_index_fn)(
  *
  * Requires lock to be taken before calling.
  */
-typedef void (*kbase_hwcnt_backend_csf_if_get_gpu_cycle_count_fn)(
+typedef void kbase_hwcnt_backend_csf_if_get_gpu_cycle_count_fn(
 	struct kbase_hwcnt_backend_csf_if_ctx *ctx, u64 *cycle_counts,
 	u64 clk_enable_map);
 
@@ -288,20 +292,20 @@ typedef void (*kbase_hwcnt_backend_csf_if_get_gpu_cycle_count_fn)(
  */
 struct kbase_hwcnt_backend_csf_if {
 	struct kbase_hwcnt_backend_csf_if_ctx *ctx;
-	kbase_hwcnt_backend_csf_if_assert_lock_held_fn assert_lock_held;
-	kbase_hwcnt_backend_csf_if_lock_fn lock;
-	kbase_hwcnt_backend_csf_if_unlock_fn unlock;
-	kbase_hwcnt_backend_csf_if_get_prfcnt_info_fn get_prfcnt_info;
-	kbase_hwcnt_backend_csf_if_ring_buf_alloc_fn ring_buf_alloc;
-	kbase_hwcnt_backend_csf_if_ring_buf_sync_fn ring_buf_sync;
-	kbase_hwcnt_backend_csf_if_ring_buf_free_fn ring_buf_free;
-	kbase_hwcnt_backend_csf_if_timestamp_ns_fn timestamp_ns;
-	kbase_hwcnt_backend_csf_if_dump_enable_fn dump_enable;
-	kbase_hwcnt_backend_csf_if_dump_disable_fn dump_disable;
-	kbase_hwcnt_backend_csf_if_dump_request_fn dump_request;
-	kbase_hwcnt_backend_csf_if_get_indexes_fn get_indexes;
-	kbase_hwcnt_backend_csf_if_set_extract_index_fn set_extract_index;
-	kbase_hwcnt_backend_csf_if_get_gpu_cycle_count_fn get_gpu_cycle_count;
+	kbase_hwcnt_backend_csf_if_assert_lock_held_fn *assert_lock_held;
+	kbase_hwcnt_backend_csf_if_lock_fn *lock;
+	kbase_hwcnt_backend_csf_if_unlock_fn *unlock;
+	kbase_hwcnt_backend_csf_if_get_prfcnt_info_fn *get_prfcnt_info;
+	kbase_hwcnt_backend_csf_if_ring_buf_alloc_fn *ring_buf_alloc;
+	kbase_hwcnt_backend_csf_if_ring_buf_sync_fn *ring_buf_sync;
+	kbase_hwcnt_backend_csf_if_ring_buf_free_fn *ring_buf_free;
+	kbase_hwcnt_backend_csf_if_timestamp_ns_fn *timestamp_ns;
+	kbase_hwcnt_backend_csf_if_dump_enable_fn *dump_enable;
+	kbase_hwcnt_backend_csf_if_dump_disable_fn *dump_disable;
+	kbase_hwcnt_backend_csf_if_dump_request_fn *dump_request;
+	kbase_hwcnt_backend_csf_if_get_indexes_fn *get_indexes;
+	kbase_hwcnt_backend_csf_if_set_extract_index_fn *set_extract_index;
+	kbase_hwcnt_backend_csf_if_get_gpu_cycle_count_fn *get_gpu_cycle_count;
 };
 
 #endif /* #define _KBASE_HWCNT_BACKEND_CSF_IF_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf_if_fw.c b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf_if_fw.c
index 35f1225acaae..83ae231f523c 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf_if_fw.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf_if_fw.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
@@ -37,9 +37,7 @@
 
 #include <linux/log2.h>
 #include "mali_kbase_ccswe.h"
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-#include <backend/gpu/mali_kbase_model_dummy.h>
-#endif
+
 
 /** The number of nanoseconds in a second. */
 #define NSECS_IN_SEC 1000000000ull /* ns */
@@ -76,6 +74,7 @@ struct kbase_hwcnt_backend_csf_if_fw_ring_buf {
  * @buf_bytes:	        The size in bytes for each buffer in the ring buffer.
  * @clk_cnt:            The number of clock domains in the system.
  *                      The maximum is 64.
+ * @clk_enable_map:     Bitmask of enabled clocks
  * @rate_listener:      Clock rate listener callback state.
  * @ccswe_shader_cores: Shader cores cycle count software estimator.
  */
@@ -160,8 +159,8 @@ static void kbasep_hwcnt_backend_csf_if_fw_on_freq_change(
 /**
  * kbasep_hwcnt_backend_csf_if_fw_cc_enable() - Enable cycle count tracking
  *
- * @fw_ctx:     Non-NULL pointer to CSF firmware interface context.
- * @enable_map: Non-NULL pointer to enable map specifying enabled counters.
+ * @fw_ctx:         Non-NULL pointer to CSF firmware interface context.
+ * @clk_enable_map: Non-NULL pointer to enable map specifying enabled counters.
  */
 static void kbasep_hwcnt_backend_csf_if_fw_cc_enable(
 	struct kbase_hwcnt_backend_csf_if_fw_ctx *fw_ctx, u64 clk_enable_map)
@@ -218,20 +217,13 @@ static void kbasep_hwcnt_backend_csf_if_fw_get_prfcnt_info(
 	struct kbase_hwcnt_backend_csf_if_ctx *ctx,
 	struct kbase_hwcnt_backend_csf_if_prfcnt_info *prfcnt_info)
 {
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-	prfcnt_info->l2_count = KBASE_DUMMY_MODEL_MAX_MEMSYS_BLOCKS;
-	prfcnt_info->core_mask =
-		(1ull << KBASE_DUMMY_MODEL_MAX_SHADER_CORES) - 1;
-	prfcnt_info->dump_bytes = KBASE_DUMMY_MODEL_MAX_NUM_PERF_BLOCKS *
-				  KBASE_DUMMY_MODEL_BLOCK_SIZE;
-	prfcnt_info->clk_cnt = 1;
-	prfcnt_info->clearing_samples = false;
-#else
 	struct kbase_hwcnt_backend_csf_if_fw_ctx *fw_ctx;
 	struct kbase_device *kbdev;
 	u32 prfcnt_size;
 	u32 prfcnt_hw_size = 0;
 	u32 prfcnt_fw_size = 0;
+	u32 prfcnt_block_size = KBASE_HWCNT_V5_DEFAULT_VALUES_PER_BLOCK *
+				KBASE_HWCNT_VALUE_BYTES;
 
 	WARN_ON(!ctx);
 	WARN_ON(!prfcnt_info);
@@ -242,15 +234,23 @@ static void kbasep_hwcnt_backend_csf_if_fw_get_prfcnt_info(
 	prfcnt_hw_size = (prfcnt_size & 0xFF) << 8;
 	prfcnt_fw_size = (prfcnt_size >> 16) << 8;
 	fw_ctx->buf_bytes = prfcnt_hw_size + prfcnt_fw_size;
-	prfcnt_info->dump_bytes = fw_ctx->buf_bytes;
 
+
+	prfcnt_info->dump_bytes = fw_ctx->buf_bytes;
+	prfcnt_info->prfcnt_block_size = prfcnt_block_size;
 	prfcnt_info->l2_count = kbdev->gpu_props.props.l2_props.num_l2_slices;
 	prfcnt_info->core_mask =
 		kbdev->gpu_props.props.coherency_info.group[0].core_mask;
 
 	prfcnt_info->clk_cnt = fw_ctx->clk_cnt;
 	prfcnt_info->clearing_samples = true;
-#endif
+
+	/* Block size must be multiple of counter size. */
+	WARN_ON((prfcnt_info->prfcnt_block_size % KBASE_HWCNT_VALUE_BYTES) !=
+		0);
+	/* Total size must be multiple of block size. */
+	WARN_ON((prfcnt_info->dump_bytes % prfcnt_info->prfcnt_block_size) !=
+		0);
 }
 
 static int kbasep_hwcnt_backend_csf_if_fw_ring_buf_alloc(
@@ -339,6 +339,7 @@ static int kbasep_hwcnt_backend_csf_if_fw_ring_buf_alloc(
 	*out_ring_buf =
 		(struct kbase_hwcnt_backend_csf_if_ring_buf *)fw_ring_buf;
 
+
 	return 0;
 
 mmu_insert_failed:
@@ -682,9 +683,9 @@ static void kbasep_hwcnt_backend_csf_if_fw_get_gpu_cycle_count(
 }
 
 /**
- * @brief Destroy a CSF FW interface context.
+ * kbasep_hwcnt_backedn_csf_if_fw_cts_destroy() - Destroy a CSF FW interface context.
  *
- * @param[in,out] fw_ctx Pointer to context to destroy.
+ * @fw_ctx: Pointer to context to destroy.
  */
 static void kbasep_hwcnt_backend_csf_if_fw_ctx_destroy(
 	struct kbase_hwcnt_backend_csf_if_fw_ctx *fw_ctx)
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf_if_fw.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf_if_fw.h
index f55efb6e896b..b69668b2e822 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf_if_fw.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf_if_fw.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_jm.c b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_jm.c
index ffacaeb0a748..8e6b25936362 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_jm.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_jm.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
@@ -23,14 +23,11 @@
 #include "mali_kbase_hwcnt_gpu.h"
 #include "mali_kbase_hwcnt_types.h"
 #include "mali_kbase.h"
-#include "mali_kbase_pm_ca.h"
+#include "backend/gpu/mali_kbase_pm_ca.h"
 #include "mali_kbase_hwaccess_instr.h"
 #include "mali_kbase_hwaccess_time.h"
 #include "mali_kbase_ccswe.h"
 
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-#include "backend/gpu/mali_kbase_model_dummy.h"
-#endif
 #include "backend/gpu/mali_kbase_clk_rate_trace_mgr.h"
 
 #include "backend/gpu/mali_kbase_pm_internal.h"
@@ -108,10 +105,6 @@ kbasep_hwcnt_backend_jm_gpu_info_init(struct kbase_device *kbdev,
 	if (!kbdev || !info)
 		return -EINVAL;
 
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-	info->l2_count = KBASE_DUMMY_MODEL_MAX_MEMSYS_BLOCKS;
-	info->core_mask = (1ull << KBASE_DUMMY_MODEL_MAX_SHADER_CORES) - 1;
-#else /* CONFIG_MALI_BIFROST_NO_MALI */
 	{
 		const struct base_gpu_props *props = &kbdev->gpu_props.props;
 		const size_t l2_count = props->l2_props.num_l2_slices;
@@ -120,8 +113,9 @@ kbasep_hwcnt_backend_jm_gpu_info_init(struct kbase_device *kbdev,
 
 		info->l2_count = l2_count;
 		info->core_mask = core_mask;
+		info->prfcnt_values_per_block =
+			KBASE_HWCNT_V5_DEFAULT_VALUES_PER_BLOCK;
 	}
-#endif /* CONFIG_MALI_BIFROST_NO_MALI */
 
 	/* Determine the number of available clock domains. */
 	for (clk = 0; clk < BASE_MAX_NR_CLOCKS_REGULATORS; clk++) {
@@ -483,11 +477,6 @@ static int kbasep_hwcnt_backend_jm_dump_get(
 	struct kbase_hwcnt_backend_jm *backend_jm =
 		(struct kbase_hwcnt_backend_jm *)backend;
 	size_t clk;
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-	struct kbase_device *kbdev;
-	unsigned long flags;
-	int errcode;
-#endif
 
 	if (!backend_jm || !dst || !dst_enable_map ||
 	    (backend_jm->info->metadata != dst->metadata) ||
@@ -507,21 +496,6 @@ static int kbasep_hwcnt_backend_jm_dump_get(
 		dst->clk_cnt_buf[clk] = backend_jm->cycle_count_elapsed[clk];
 	}
 
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-	kbdev = backend_jm->kctx->kbdev;
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	/* Update the current configuration information. */
-	errcode = kbasep_hwcnt_gpu_update_curr_config(kbdev,
-		&backend_jm->curr_config);
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	if (errcode)
-		return errcode;
-#endif
-
 	return kbase_hwcnt_jm_dump_get(dst, backend_jm->cpu_dump_va,
 				       dst_enable_map, backend_jm->pm_core_mask,
 				       &backend_jm->curr_config, accumulate);
@@ -655,10 +629,6 @@ static int kbasep_hwcnt_backend_jm_create(
 	kbase_ccswe_init(&backend->ccswe_shader_cores);
 	backend->rate_listener.notify = kbasep_hwcnt_backend_jm_on_freq_change;
 
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-	/* The dummy model needs the CPU mapping. */
-	gpu_model_set_dummy_prfcnt_base_cpu(backend->cpu_dump_va);
-#endif
 
 	*out_backend = backend;
 	return 0;
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_jm.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_jm.h
index 5d1947ea4021..531951611ec4 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_jm.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_jm.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_context.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_context.h
index 403b1c5ff149..1adf2ef9e8dd 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_context.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_context.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_gpu.c b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_gpu.c
index 4fba6b6d33c2..2975269b6ee4 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_gpu.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_gpu.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
@@ -25,13 +25,6 @@
 #include <linux/bug.h>
 #include <linux/err.h>
 
-#define KBASE_HWCNT_V5_BLOCK_TYPE_COUNT 4
-#define KBASE_HWCNT_V5_HEADERS_PER_BLOCK 4
-#define KBASE_HWCNT_V5_COUNTERS_PER_BLOCK 60
-#define KBASE_HWCNT_V5_VALUES_PER_BLOCK \
-	(KBASE_HWCNT_V5_HEADERS_PER_BLOCK + KBASE_HWCNT_V5_COUNTERS_PER_BLOCK)
-/* Index of the PRFCNT_EN header into a V5 counter block */
-#define KBASE_HWCNT_V5_PRFCNT_EN_HEADER 2
 
 static void kbasep_get_fe_block_type(u64 *dst, enum kbase_hwcnt_set counter_set,
 				     bool is_csf)
@@ -160,19 +153,22 @@ static int kbasep_hwcnt_backend_gpu_metadata_create(
 	kbasep_get_fe_block_type(&blks[0].type, counter_set, is_csf);
 	blks[0].inst_cnt = 1;
 	blks[0].hdr_cnt = KBASE_HWCNT_V5_HEADERS_PER_BLOCK;
-	blks[0].ctr_cnt = KBASE_HWCNT_V5_COUNTERS_PER_BLOCK;
+	blks[0].ctr_cnt = gpu_info->prfcnt_values_per_block -
+			  KBASE_HWCNT_V5_HEADERS_PER_BLOCK;
 
 	/* One Tiler block */
 	kbasep_get_tiler_block_type(&blks[1].type, counter_set);
 	blks[1].inst_cnt = 1;
 	blks[1].hdr_cnt = KBASE_HWCNT_V5_HEADERS_PER_BLOCK;
-	blks[1].ctr_cnt = KBASE_HWCNT_V5_COUNTERS_PER_BLOCK;
+	blks[1].ctr_cnt = gpu_info->prfcnt_values_per_block -
+			  KBASE_HWCNT_V5_HEADERS_PER_BLOCK;
 
 	/* l2_count memsys blks */
 	kbasep_get_memsys_block_type(&blks[2].type, counter_set);
 	blks[2].inst_cnt = gpu_info->l2_count;
 	blks[2].hdr_cnt = KBASE_HWCNT_V5_HEADERS_PER_BLOCK;
-	blks[2].ctr_cnt = KBASE_HWCNT_V5_COUNTERS_PER_BLOCK;
+	blks[2].ctr_cnt = gpu_info->prfcnt_values_per_block -
+			  KBASE_HWCNT_V5_HEADERS_PER_BLOCK;
 
 	/*
 	 * There are as many shader cores in the system as there are bits set in
@@ -193,7 +189,8 @@ static int kbasep_hwcnt_backend_gpu_metadata_create(
 	kbasep_get_sc_block_type(&blks[3].type, counter_set, is_csf);
 	blks[3].inst_cnt = sc_block_count;
 	blks[3].hdr_cnt = KBASE_HWCNT_V5_HEADERS_PER_BLOCK;
-	blks[3].ctr_cnt = KBASE_HWCNT_V5_COUNTERS_PER_BLOCK;
+	blks[3].ctr_cnt = gpu_info->prfcnt_values_per_block -
+			  KBASE_HWCNT_V5_HEADERS_PER_BLOCK;
 
 	WARN_ON(KBASE_HWCNT_V5_BLOCK_TYPE_COUNT != 4);
 
@@ -226,7 +223,7 @@ kbasep_hwcnt_backend_jm_dump_bytes(const struct kbase_hwcnt_gpu_info *gpu_info)
 	WARN_ON(!gpu_info);
 
 	return (2 + gpu_info->l2_count + fls64(gpu_info->core_mask)) *
-	       KBASE_HWCNT_V5_VALUES_PER_BLOCK * KBASE_HWCNT_VALUE_BYTES;
+	       gpu_info->prfcnt_values_per_block * KBASE_HWCNT_VALUE_BYTES;
 }
 
 int kbase_hwcnt_jm_metadata_create(
@@ -305,6 +302,127 @@ void kbase_hwcnt_csf_metadata_destroy(
 	kbase_hwcnt_metadata_destroy(metadata);
 }
 
+int kbase_hwcnt_gpu_metadata_create_truncate_64(
+	const struct kbase_hwcnt_metadata **dst_md,
+	const struct kbase_hwcnt_metadata *src_md)
+{
+	struct kbase_hwcnt_description desc;
+	struct kbase_hwcnt_group_description group;
+	struct kbase_hwcnt_block_description
+		blks[KBASE_HWCNT_V5_BLOCK_TYPE_COUNT];
+	size_t prfcnt_values_per_block;
+	size_t blk;
+
+	if (!dst_md || !src_md || !src_md->grp_metadata ||
+	    !src_md->grp_metadata[0].blk_metadata)
+		return -EINVAL;
+
+	/* Only support 1 group count and KBASE_HWCNT_V5_BLOCK_TYPE_COUNT block
+	 * count in the metadata.
+	 */
+	if ((kbase_hwcnt_metadata_group_count(src_md) != 1) ||
+	    (kbase_hwcnt_metadata_block_count(src_md, 0) !=
+	     KBASE_HWCNT_V5_BLOCK_TYPE_COUNT))
+		return -EINVAL;
+
+	/* Get the values count in the first block. */
+	prfcnt_values_per_block =
+		kbase_hwcnt_metadata_block_values_count(src_md, 0, 0);
+
+	/* check all blocks should have same values count. */
+	for (blk = 0; blk < KBASE_HWCNT_V5_BLOCK_TYPE_COUNT; blk++) {
+		size_t val_cnt =
+			kbase_hwcnt_metadata_block_values_count(src_md, 0, blk);
+		if (val_cnt != prfcnt_values_per_block)
+			return -EINVAL;
+	}
+
+	/* Only support 64 and 128 entries per block. */
+	if ((prfcnt_values_per_block != 64) && (prfcnt_values_per_block != 128))
+		return -EINVAL;
+
+	if (prfcnt_values_per_block == 64) {
+		/* If the values per block is 64, no need to truncate. */
+		*dst_md = NULL;
+		return 0;
+	}
+
+	/* Truncate from 128 to 64 entries per block to keep API backward
+	 * compatibility.
+	 */
+	prfcnt_values_per_block = 64;
+
+	for (blk = 0; blk < KBASE_HWCNT_V5_BLOCK_TYPE_COUNT; blk++) {
+		blks[blk].type =
+			kbase_hwcnt_metadata_block_type(src_md, 0, blk);
+		blks[blk].inst_cnt = kbase_hwcnt_metadata_block_instance_count(
+			src_md, 0, blk);
+		blks[blk].hdr_cnt = kbase_hwcnt_metadata_block_headers_count(
+			src_md, 0, blk);
+		blks[blk].ctr_cnt = prfcnt_values_per_block - blks[blk].hdr_cnt;
+	}
+
+	group.type = kbase_hwcnt_metadata_group_type(src_md, 0);
+	group.blk_cnt = KBASE_HWCNT_V5_BLOCK_TYPE_COUNT;
+	group.blks = blks;
+
+	desc.grp_cnt = kbase_hwcnt_metadata_group_count(src_md);
+	desc.avail_mask = src_md->avail_mask;
+	desc.clk_cnt = src_md->clk_cnt;
+	desc.grps = &group;
+
+	return kbase_hwcnt_metadata_create(&desc, dst_md);
+}
+
+void kbase_hwcnt_dump_buffer_copy_strict_narrow(
+	struct kbase_hwcnt_dump_buffer *dst,
+	const struct kbase_hwcnt_dump_buffer *src,
+	const struct kbase_hwcnt_enable_map *dst_enable_map)
+{
+	const struct kbase_hwcnt_metadata *metadata;
+	size_t grp, blk, blk_inst;
+	size_t clk;
+
+	if (WARN_ON(!dst) || WARN_ON(!src) || WARN_ON(!dst_enable_map) ||
+	    WARN_ON(dst == src) || WARN_ON(dst->metadata == src->metadata) ||
+	    WARN_ON(dst->metadata->grp_cnt != src->metadata->grp_cnt) ||
+	    WARN_ON(src->metadata->grp_cnt != 1) ||
+	    WARN_ON(dst->metadata->grp_metadata[0].blk_cnt !=
+		    src->metadata->grp_metadata[0].blk_cnt) ||
+	    WARN_ON(dst->metadata->grp_metadata[0].blk_cnt != 4) ||
+	    WARN_ON(dst->metadata->grp_metadata[0].blk_metadata[0].ctr_cnt >
+		    src->metadata->grp_metadata[0].blk_metadata[0].ctr_cnt))
+		return;
+
+	/* Don't use src metadata since src buffer is bigger than dst buffer. */
+	metadata = dst->metadata;
+
+	kbase_hwcnt_metadata_for_each_block(metadata, grp, blk, blk_inst) {
+		u32 *dst_blk = kbase_hwcnt_dump_buffer_block_instance(
+			dst, grp, blk, blk_inst);
+		const u32 *src_blk = kbase_hwcnt_dump_buffer_block_instance(
+			src, grp, blk, blk_inst);
+		const u64 *blk_em = kbase_hwcnt_enable_map_block_instance(
+			dst_enable_map, grp, blk, blk_inst);
+		size_t val_cnt = kbase_hwcnt_metadata_block_values_count(
+			metadata, grp, blk);
+		/* Align upwards to include padding bytes */
+		val_cnt = KBASE_HWCNT_ALIGN_UPWARDS(
+			val_cnt, (KBASE_HWCNT_BLOCK_BYTE_ALIGNMENT /
+				  KBASE_HWCNT_VALUE_BYTES));
+
+		kbase_hwcnt_dump_buffer_block_copy_strict(dst_blk, src_blk,
+							  blk_em, val_cnt);
+	}
+
+	kbase_hwcnt_metadata_for_each_clock(metadata, clk) {
+		bool clk_enabled = kbase_hwcnt_clk_enable_map_enabled(
+			dst_enable_map->clk_enable_map, clk);
+
+		dst->clk_cnt_buf[clk] = clk_enabled ? src->clk_cnt_buf[clk] : 0;
+	}
+}
+
 static bool is_block_type_shader(
 	const u64 grp_type,
 	const u64 blk_type,
@@ -594,15 +712,11 @@ void kbase_hwcnt_gpu_enable_map_to_physical(
 			metadata, grp);
 		const u64 blk_type = kbase_hwcnt_metadata_block_type(
 			metadata, grp, blk);
-		const size_t blk_val_cnt =
-			kbase_hwcnt_metadata_block_values_count(
-				metadata, grp, blk);
 		const u64 *blk_map = kbase_hwcnt_enable_map_block_instance(
 			src, grp, blk, blk_inst);
 
 		if ((enum kbase_hwcnt_gpu_group_type)grp_type ==
 		    KBASE_HWCNT_GPU_GROUP_TYPE_V5) {
-			WARN_ON(blk_val_cnt != KBASE_HWCNT_V5_VALUES_PER_BLOCK);
 			switch ((enum kbase_hwcnt_gpu_v5_block_type)blk_type) {
 			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_UNDEFINED:
 				/* Nothing to do in this case. */
@@ -692,15 +806,11 @@ void kbase_hwcnt_gpu_enable_map_from_physical(
 			metadata, grp);
 		const u64 blk_type = kbase_hwcnt_metadata_block_type(
 			metadata, grp, blk);
-		const size_t blk_val_cnt =
-			kbase_hwcnt_metadata_block_values_count(
-				metadata, grp, blk);
 		u64 *blk_map = kbase_hwcnt_enable_map_block_instance(
 			dst, grp, blk, blk_inst);
 
 		if ((enum kbase_hwcnt_gpu_group_type)grp_type ==
 		    KBASE_HWCNT_GPU_GROUP_TYPE_V5) {
-			WARN_ON(blk_val_cnt != KBASE_HWCNT_V5_VALUES_PER_BLOCK);
 			switch ((enum kbase_hwcnt_gpu_v5_block_type)blk_type) {
 			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_UNDEFINED:
 				/* Nothing to do in this case. */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_gpu.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_gpu.h
index 9b846a94bc3a..50ae80d87e71 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_gpu.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_gpu.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2018, 2020-2021 ARM Limited. All rights reserved.
@@ -31,9 +31,10 @@ struct kbase_hwcnt_dump_buffer;
 
 #define KBASE_HWCNT_V5_BLOCK_TYPE_COUNT 4
 #define KBASE_HWCNT_V5_HEADERS_PER_BLOCK 4
-#define KBASE_HWCNT_V5_COUNTERS_PER_BLOCK 60
-#define KBASE_HWCNT_V5_VALUES_PER_BLOCK                                        \
-	(KBASE_HWCNT_V5_HEADERS_PER_BLOCK + KBASE_HWCNT_V5_COUNTERS_PER_BLOCK)
+#define KBASE_HWCNT_V5_DEFAULT_COUNTERS_PER_BLOCK 60
+#define KBASE_HWCNT_V5_DEFAULT_VALUES_PER_BLOCK                                \
+	(KBASE_HWCNT_V5_HEADERS_PER_BLOCK +                                    \
+	 KBASE_HWCNT_V5_DEFAULT_COUNTERS_PER_BLOCK)
 /** Index of the PRFCNT_EN header into a V5 counter block */
 #define KBASE_HWCNT_V5_PRFCNT_EN_HEADER 2
 
@@ -117,14 +118,17 @@ enum kbase_hwcnt_physical_set {
 
 /**
  * struct kbase_hwcnt_gpu_info - Information about hwcnt blocks on the GPUs.
- * @l2_count:   L2 cache count.
- * @core_mask:  Shader core mask. May be sparse.
- * @clk_cnt:    Number of clock domains available.
+ * @l2_count:                L2 cache count.
+ * @core_mask:               Shader core mask. May be sparse.
+ * @clk_cnt:                 Number of clock domains available.
+ * @prfcnt_values_per_block: Total entries (header + counters) of performance
+ *                           counter per block.
  */
 struct kbase_hwcnt_gpu_info {
 	size_t l2_count;
 	u64 core_mask;
 	u8 clk_cnt;
+	size_t prfcnt_values_per_block;
 };
 
 /**
@@ -220,6 +224,48 @@ int kbase_hwcnt_csf_metadata_create(
 void kbase_hwcnt_csf_metadata_destroy(
 	const struct kbase_hwcnt_metadata *metadata);
 
+/**
+ * kbase_hwcnt_gpu_metadata_create_truncate_64() - Create HWC metadata with HWC
+ *                                                 block entries truncated
+ *                                                 to 64.
+ *
+ * @dst_md: Non-NULL pointer to where created metadata is stored on success.
+ * @src_md: Non-NULL pointer to the HWC metadata used as the source to create
+ *          dst_md.
+ *
+ * If the total block entries in src_md is 64, metadata dst_md returns NULL
+ * since no need to truncate.
+ * if the total block entries in src_md is 128, then a new metadata with block
+ * entries truncated to 64 will be created for dst_md, which keeps the interface
+ * to user clients backward compatible.
+ * If the total block entries in src_md is other values, function returns error
+ * since it's not supported.
+ *
+ * Return: 0 on success, else error code.
+ */
+int kbase_hwcnt_gpu_metadata_create_truncate_64(
+	const struct kbase_hwcnt_metadata **dst_md,
+	const struct kbase_hwcnt_metadata *src_md);
+
+/**
+ * kbase_hwcnt_dump_buffer_copy_strict_narrow() - Copy all enabled values from
+ *                                                src to dst.
+ *
+ * @dst:            Non-NULL pointer to dst dump buffer.
+ * @src:            Non-NULL pointer to src dump buffer.
+ * @dst_enable_map: Non-NULL pointer to enable map specifying enabled values.
+ *
+ * After the operation, all non-enabled values (including padding bytes) will be
+ * zero.
+ *
+ * The dst and src have different metadata, and the dst metadata is narrower
+ * than src metadata.
+ */
+void kbase_hwcnt_dump_buffer_copy_strict_narrow(
+	struct kbase_hwcnt_dump_buffer *dst,
+	const struct kbase_hwcnt_dump_buffer *src,
+	const struct kbase_hwcnt_enable_map *dst_enable_map);
+
 /**
  * kbase_hwcnt_jm_dump_get() - Copy or accumulate enabled counters from the raw
  *                             dump buffer in src into the dump buffer
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_legacy.c b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_legacy.c
index 45cd9fb12835..58dec99864f6 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_legacy.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_legacy.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2018, 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_legacy.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_legacy.h
index deaf7eb39236..36ff44d69813 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_legacy.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_legacy.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_types.c b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_types.c
index 931fbf3f2051..492f57249291 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_types.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_types.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -23,20 +23,6 @@
 
 #include <linux/slab.h>
 
-/* Minimum alignment of each block of hardware counters */
-#define KBASE_HWCNT_BLOCK_BYTE_ALIGNMENT \
-	(KBASE_HWCNT_BITFIELD_BITS * KBASE_HWCNT_VALUE_BYTES)
-
-/**
- * KBASE_HWCNT_ALIGN_UPWARDS() - Align a value to an alignment.
- * @value:     The value to align upwards.
- * @alignment: The alignment.
- *
- * Return: A number greater than or equal to value that is aligned to alignment.
- */
-#define KBASE_HWCNT_ALIGN_UPWARDS(value, alignment) \
-	(value + ((alignment - (value % alignment)) % alignment))
-
 int kbase_hwcnt_metadata_create(
 	const struct kbase_hwcnt_description *desc,
 	const struct kbase_hwcnt_metadata **out_metadata)
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_types.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_types.h
index e775393b57dc..da1295225ccf 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_types.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_types.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2018, 2020-2021 ARM Limited. All rights reserved.
@@ -99,6 +99,21 @@
  */
 #define KBASE_HWCNT_AVAIL_MASK_BITS (sizeof(u64) * BITS_PER_BYTE)
 
+/* Minimum alignment of each block of hardware counters */
+#define KBASE_HWCNT_BLOCK_BYTE_ALIGNMENT                                       \
+	(KBASE_HWCNT_BITFIELD_BITS * KBASE_HWCNT_VALUE_BYTES)
+
+/**
+ * KBASE_HWCNT_ALIGN_UPWARDS() - Calculate next aligned value.
+ * @value:     The value to align upwards.
+ * @alignment: The alignment boundary.
+ *
+ * Return: Input value if already aligned to the specified boundary, or next
+ * (incrementing upwards) aligned value.
+ */
+#define KBASE_HWCNT_ALIGN_UPWARDS(value, alignment)                            \
+	(value + ((alignment - (value % alignment)) % alignment))
+
 /**
  * struct kbase_hwcnt_block_description - Description of one or more identical,
  *                                        contiguous, Hardware Counter Blocks.
@@ -357,8 +372,7 @@ void kbase_hwcnt_metadata_destroy(const struct kbase_hwcnt_metadata *metadata);
  * @grp:      Index of the group in the metadata.
  * @blk:      Index of the block in the group.
  *
- * Return: Number of u32 counter headers in each instance of block blk in
- *         group grp.
+ * Return: Number of counter headers in each instance of block blk in group grp.
  */
 #define kbase_hwcnt_metadata_block_headers_count(metadata, grp, blk) \
 	((metadata)->grp_metadata[(grp)].blk_metadata[(blk)].hdr_cnt)
@@ -369,19 +383,29 @@ void kbase_hwcnt_metadata_destroy(const struct kbase_hwcnt_metadata *metadata);
  * @grp:      Index of the group in the metadata.
  * @blk:      Index of the block in the group.
  *
- * Return: Number of u32 counters in each instance of block blk in group
- *         grp.
+ * Return: Number of counters in each instance of block blk in group grp.
  */
 #define kbase_hwcnt_metadata_block_counters_count(metadata, grp, blk) \
 	((metadata)->grp_metadata[(grp)].blk_metadata[(blk)].ctr_cnt)
 
+/**
+ * kbase_hwcnt_metadata_block_enable_map_stride() - Get the enable map stride.
+ * @metadata: Non-NULL pointer to metadata.
+ * @grp:      Index of the group in the metadata.
+ * @blk:      Index of the block in the group.
+ *
+ * Return: enable map stride in each instance of block blk in group grp.
+ */
+#define kbase_hwcnt_metadata_block_enable_map_stride(metadata, grp, blk)       \
+	((metadata)->grp_metadata[(grp)].blk_metadata[(blk)].enable_map_stride)
+
 /**
  * kbase_hwcnt_metadata_block_values_count() - Get the number of values.
  * @metadata: Non-NULL pointer to metadata.
  * @grp:      Index of the group in the metadata.
  * @blk:      Index of the block in the group.
  *
- * Return: Number of u32 headers plus counters in each instance of block blk
+ * Return: Number of headers plus counters in each instance of block blk
  *         in group grp.
  */
 #define kbase_hwcnt_metadata_block_values_count(metadata, grp, blk) \
@@ -777,9 +801,7 @@ void kbase_hwcnt_dump_buffer_free(struct kbase_hwcnt_dump_buffer *dump_buf);
  * kbase_hwcnt_dump_buffer_array_alloc() - Allocate an array of dump buffers.
  * @metadata:  Non-NULL pointer to metadata describing the system.
  * @n:         Number of dump buffers to allocate
- * @dump_bufs: Non-NULL pointer to dump buffer array to be initialised. Each
- *             dump buffer in the array will be initialised to undefined values,
- *             so must be used as a copy dest, or cleared before use.
+ * @dump_bufs: Non-NULL pointer to dump buffer array to be initialised.
  *
  * A single zeroed contiguous page allocation will be used for all of the
  * buffers inside the array, where:
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_virtualizer.c b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_virtualizer.c
index 4bb84890fb67..52ecb7bed03f 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_virtualizer.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_virtualizer.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_virtualizer.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_virtualizer.h
index 1bce6914f11a..e3a8137ced55 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_virtualizer.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_virtualizer.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_jd.c b/drivers/gpu/arm/bifrost/mali_kbase_jd.c
index f680a5ee144b..d780a30f230e 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_jd.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_jd.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
@@ -20,7 +20,7 @@
  */
 
 #include <linux/dma-buf.h>
-#ifdef CONFIG_COMPAT
+#if IS_ENABLED(CONFIG_COMPAT)
 #include <linux/compat.h>
 #endif
 #include <mali_kbase.h>
@@ -62,7 +62,7 @@
 static void __user *
 get_compat_pointer(struct kbase_context *kctx, const u64 p)
 {
-#ifdef CONFIG_COMPAT
+#if IS_ENABLED(CONFIG_COMPAT)
 	if (kbase_ctx_flag(kctx, KCTX_COMPAT))
 		return compat_ptr(p);
 #endif
@@ -817,7 +817,7 @@ bool jd_done_nolock(struct kbase_jd_atom *katom,
 
 KBASE_EXPORT_TEST_API(jd_done_nolock);
 
-#ifdef CONFIG_GPU_TRACEPOINTS
+#if IS_ENABLED(CONFIG_GPU_TRACEPOINTS)
 enum {
 	CORE_REQ_DEP_ONLY,
 	CORE_REQ_SOFT,
@@ -1172,7 +1172,7 @@ static bool jd_submit_atom(struct kbase_context *const kctx,
 		}
 	}
 
-#ifdef CONFIG_GPU_TRACEPOINTS
+#if IS_ENABLED(CONFIG_GPU_TRACEPOINTS)
 	katom->work_id = atomic_inc_return(&jctx->work_id);
 	trace_gpu_job_enqueue(kctx->id, katom->work_id,
 			kbasep_map_core_reqs_to_string(katom->core_req));
@@ -1675,7 +1675,7 @@ void kbase_jd_done(struct kbase_jd_atom *katom, int slot_nr,
 
 	atomic_inc(&kctx->work_count);
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 	/* a failed job happened and is waiting for dumping*/
 	if (!katom->will_fail_event_code &&
 			kbase_debug_job_fault_process(katom, katom->event_code))
@@ -1754,7 +1754,7 @@ void kbase_jd_zap_context(struct kbase_context *kctx)
 	flush_workqueue(kctx->dma_fence.wq);
 #endif
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 	kbase_debug_job_fault_kctx_unblock(kctx);
 #endif
 
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_jd_debugfs.c b/drivers/gpu/arm/bifrost/mali_kbase_jd_debugfs.c
index 2fa140cbf64a..7cf038ab12d2 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_jd_debugfs.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_jd_debugfs.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
@@ -19,7 +19,7 @@
  *
  */
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 
 #include <linux/seq_file.h>
 #include <mali_kbase.h>
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_jd_debugfs.h b/drivers/gpu/arm/bifrost/mali_kbase_jd_debugfs.h
index f183a9fee70e..8e6140c43538 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_jd_debugfs.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_jd_debugfs.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2014-2018, 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_jm.c b/drivers/gpu/arm/bifrost/mali_kbase_jm.c
index 73e9905ab036..69950508b121 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_jm.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_jm.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_jm.h b/drivers/gpu/arm/bifrost/mali_kbase_jm.h
index 47202b9e9bd3..c6b28f3a7fe8 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_jm.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_jm.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2013-2014, 2016, 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2013-2014, 2016, 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_js.c b/drivers/gpu/arm/bifrost/mali_kbase_js.c
index c16469d0a1d9..bf11c6dadd25 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_js.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_js.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2011-2021 ARM Limited. All rights reserved.
@@ -81,7 +81,7 @@ static int kbase_js_get_slot(struct kbase_device *kbdev,
 				struct kbase_jd_atom *katom);
 
 static void kbase_js_foreach_ctx_job(struct kbase_context *kctx,
-		kbasep_js_ctx_job_cb callback);
+				     kbasep_js_ctx_job_cb *callback);
 
 /* Helper for ktrace */
 #if KBASE_KTRACE_ENABLE
@@ -212,9 +212,8 @@ jsctx_rb_none_to_pull(struct kbase_context *kctx, int js)
  *
  * The HW access lock must always be held when calling this function.
  */
-static void
-jsctx_queue_foreach_prio(struct kbase_context *kctx, int js, int prio,
-		kbasep_js_ctx_job_cb callback)
+static void jsctx_queue_foreach_prio(struct kbase_context *kctx, int js,
+				     int prio, kbasep_js_ctx_job_cb *callback)
 {
 	struct jsctx_queue *queue = &kctx->jsctx_queue[prio][js];
 
@@ -273,9 +272,8 @@ jsctx_queue_foreach_prio(struct kbase_context *kctx, int js, int prio,
  * jsctx_queue_foreach_prio() to iterate over the queue and invoke @callback
  * for each entry, and remove the entry from the queue.
  */
-static inline void
-jsctx_queue_foreach(struct kbase_context *kctx, int js,
-		kbasep_js_ctx_job_cb callback)
+static inline void jsctx_queue_foreach(struct kbase_context *kctx, int js,
+				       kbasep_js_ctx_job_cb *callback)
 {
 	int prio;
 
@@ -3788,7 +3786,7 @@ static inline int trace_get_refcnt(struct kbase_device *kbdev,
  * - it will be holding kbasep_js_kctx_info::ctx::jsctx_mutex.
  */
 static void kbase_js_foreach_ctx_job(struct kbase_context *kctx,
-		kbasep_js_ctx_job_cb callback)
+				     kbasep_js_ctx_job_cb *callback)
 {
 	struct kbase_device *kbdev;
 	unsigned long flags;
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_js.h b/drivers/gpu/arm/bifrost/mali_kbase_js.h
index a4dc2079f339..96974c8c6439 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_js.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_js.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2011-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_js_ctx_attr.c b/drivers/gpu/arm/bifrost/mali_kbase_js_ctx_attr.c
index 40967cb18597..777564858b27 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_js_ctx_attr.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_js_ctx_attr.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2012-2016, 2018, 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_js_ctx_attr.h b/drivers/gpu/arm/bifrost/mali_kbase_js_ctx_attr.h
index 1477b1d55659..6f292410d159 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_js_ctx_attr.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_js_ctx_attr.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2012-2015, 2018, 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_kinstr_jm.c b/drivers/gpu/arm/bifrost/mali_kbase_kinstr_jm.c
index dfd02f493c2b..295441ddb444 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_kinstr_jm.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_kinstr_jm.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -30,7 +30,7 @@
 #include "mali_kbase.h"
 #include "mali_kbase_linux.h"
 
-#include <mali_kbase_jm_rb.h>
+#include <backend/gpu/mali_kbase_jm_rb.h>
 
 #include <asm/barrier.h>
 #include <linux/anon_inodes.h>
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_kinstr_jm.h b/drivers/gpu/arm/bifrost/mali_kbase_kinstr_jm.h
index e2588d704126..6e9a8d23ec10 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_kinstr_jm.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_kinstr_jm.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_linux.h b/drivers/gpu/arm/bifrost/mali_kbase_linux.h
index ff29337d70db..1d8d1967eee9 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_linux.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_linux.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2010-2014, 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem.c b/drivers/gpu/arm/bifrost/mali_kbase_mem.c
index 8cc3dd3bc533..208417182a22 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
@@ -28,7 +28,7 @@
 #include <linux/compat.h>
 #include <linux/version.h>
 #include <linux/log2.h>
-#ifdef CONFIG_OF
+#if IS_ENABLED(CONFIG_OF)
 #include <linux/of_platform.h>
 #endif
 
@@ -89,7 +89,7 @@ static size_t kbase_get_num_cpu_va_bits(struct kbase_context *kctx)
 #error "Unknown CPU VA width for this architecture"
 #endif
 
-#ifdef CONFIG_64BIT
+#if IS_ENABLED(CONFIG_64BIT)
 	if (kbase_ctx_flag(kctx, KCTX_COMPAT))
 		cpu_va_bits = 32;
 #endif
@@ -115,11 +115,11 @@ static struct rb_root *kbase_gpu_va_to_rbtree(struct kbase_context *kctx,
 	else {
 		u64 same_va_end;
 
-#ifdef CONFIG_64BIT
+#if IS_ENABLED(CONFIG_64BIT)
 		if (kbase_ctx_flag(kctx, KCTX_COMPAT)) {
 #endif /* CONFIG_64BIT */
 			same_va_end = KBASE_REG_ZONE_CUSTOM_VA_BASE;
-#ifdef CONFIG_64BIT
+#if IS_ENABLED(CONFIG_64BIT)
 		} else {
 			struct kbase_reg_zone *same_va_zone =
 				kbase_ctx_reg_zone_get(kctx,
@@ -755,7 +755,7 @@ int kbase_region_tracker_init(struct kbase_context *kctx)
 	kbase_ctx_reg_zone_init(kctx, KBASE_REG_ZONE_SAME_VA, same_va_base,
 				same_va_pages);
 
-#ifdef CONFIG_64BIT
+#if IS_ENABLED(CONFIG_64BIT)
 	/* 32-bit clients have custom VA zones */
 	if (kbase_ctx_flag(kctx, KCTX_COMPAT)) {
 #endif
@@ -782,7 +782,7 @@ int kbase_region_tracker_init(struct kbase_context *kctx)
 		kbase_ctx_reg_zone_init(kctx, KBASE_REG_ZONE_CUSTOM_VA,
 					KBASE_REG_ZONE_CUSTOM_VA_BASE,
 					custom_va_size);
-#ifdef CONFIG_64BIT
+#if IS_ENABLED(CONFIG_64BIT)
 	} else {
 		custom_va_size = 0;
 	}
@@ -901,7 +901,7 @@ static bool kbase_region_tracker_has_allocs(struct kbase_context *kctx)
 	return false;
 }
 
-#ifdef CONFIG_64BIT
+#if IS_ENABLED(CONFIG_64BIT)
 static int kbase_region_tracker_init_jit_64(struct kbase_context *kctx,
 		u64 jit_va_pages)
 {
@@ -1010,7 +1010,7 @@ int kbase_region_tracker_init_jit(struct kbase_context *kctx, u64 jit_va_pages,
 		goto exit_unlock;
 	}
 
-#ifdef CONFIG_64BIT
+#if IS_ENABLED(CONFIG_64BIT)
 	if (!kbase_ctx_flag(kctx, KCTX_COMPAT))
 		err = kbase_region_tracker_init_jit_64(kctx, jit_va_pages);
 #endif
@@ -1081,12 +1081,12 @@ int kbase_region_tracker_init_exec(struct kbase_context *kctx, u64 exec_va_pages
 		goto exit_unlock;
 	}
 
-#ifdef CONFIG_64BIT
+#if IS_ENABLED(CONFIG_64BIT)
 	if (kbase_ctx_flag(kctx, KCTX_COMPAT)) {
 #endif
 		/* 32-bit client: take from CUSTOM_VA zone */
 		target_zone_bits = KBASE_REG_ZONE_CUSTOM_VA;
-#ifdef CONFIG_64BIT
+#if IS_ENABLED(CONFIG_64BIT)
 	} else {
 		/* 64-bit client: take from SAME_VA zone */
 		target_zone_bits = KBASE_REG_ZONE_SAME_VA;
@@ -1180,7 +1180,7 @@ int kbase_mem_init(struct kbase_device *kbdev)
 {
 	int err = 0;
 	struct kbasep_mem_device *memdev;
-#ifdef CONFIG_OF
+#if IS_ENABLED(CONFIG_OF)
 	struct device_node *mgm_node = NULL;
 #endif
 
@@ -1208,7 +1208,7 @@ int kbase_mem_init(struct kbase_device *kbdev)
 
 	kbdev->mgm_dev = &kbase_native_mgm_dev;
 
-#ifdef CONFIG_OF
+#if IS_ENABLED(CONFIG_OF)
 	/* Check to see whether or not a platform-specific memory group manager
 	 * is configured and available.
 	 */
@@ -3163,7 +3163,7 @@ void kbase_gpu_vm_unlock(struct kbase_context *kctx)
 
 KBASE_EXPORT_TEST_API(kbase_gpu_vm_unlock);
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 struct kbase_jit_debugfs_data {
 	int (*func)(struct kbase_jit_debugfs_data *);
 	struct mutex lock;
@@ -4269,6 +4269,7 @@ void kbase_jit_free(struct kbase_context *kctx, struct kbase_va_region *reg)
 	/* This allocation can't already be on a list. */
 	WARN_ON(!list_empty(&reg->gpu_alloc->evict_node));
 	list_add(&reg->gpu_alloc->evict_node, &kctx->evict_list);
+	atomic_add(reg->gpu_alloc->nents, &kctx->evict_nents);
 
 	list_move(&reg->jit_node, &kctx->jit_pool_head);
 
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem.h b/drivers/gpu/arm/bifrost/mali_kbase_mem.h
index 8a9e93437655..b0852318e425 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
@@ -1517,7 +1517,7 @@ void kbase_sync_single_for_device(struct kbase_device *kbdev, dma_addr_t handle,
 void kbase_sync_single_for_cpu(struct kbase_device *kbdev, dma_addr_t handle,
 		size_t size, enum dma_data_direction dir);
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 /**
  * kbase_jit_debugfs_init - Add per context debugfs entry for JIT.
  * @kctx: kbase context
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_linux.c b/drivers/gpu/arm/bifrost/mali_kbase_mem_linux.c
index f58fdf3c1e3a..a1565c127563 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_linux.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_linux.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
@@ -327,7 +327,7 @@ struct kbase_va_region *kbase_mem_alloc(struct kbase_context *kctx,
 		goto bad_flags;
 	}
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 	if (unlikely(kbase_ctx_flag(kctx, KCTX_INFINITE_CACHE))) {
 		/* Mask coherency flags if infinite cache is enabled to prevent
 		 * the skipping of syncs from BASE side.
@@ -636,8 +636,6 @@ unsigned long kbase_mem_evictable_reclaim_count_objects(struct shrinker *s,
 		struct shrink_control *sc)
 {
 	struct kbase_context *kctx;
-	struct kbase_mem_phy_alloc *alloc;
-	unsigned long pages = 0;
 
 	kctx = container_of(s, struct kbase_context, reclaim);
 
@@ -648,13 +646,7 @@ unsigned long kbase_mem_evictable_reclaim_count_objects(struct shrinker *s,
 	     "Shrinker called whilst in atomic context. The caller must switch to using GFP_ATOMIC or similar. gfp_mask==%x\n",
 	     sc->gfp_mask);
 
-	mutex_lock(&kctx->jit_evict_lock);
-
-	list_for_each_entry(alloc, &kctx->evict_list, evict_node)
-		pages += alloc->nents;
-
-	mutex_unlock(&kctx->jit_evict_lock);
-	return pages;
+	return atomic_read(&kctx->evict_nents);
 }
 
 /**
@@ -686,6 +678,7 @@ unsigned long kbase_mem_evictable_reclaim_scan_objects(struct shrinker *s,
 	unsigned long freed = 0;
 
 	kctx = container_of(s, struct kbase_context, reclaim);
+
 	mutex_lock(&kctx->jit_evict_lock);
 
 	list_for_each_entry_safe(alloc, tmp, &kctx->evict_list, evict_node) {
@@ -712,6 +705,7 @@ unsigned long kbase_mem_evictable_reclaim_scan_objects(struct shrinker *s,
 
 		kbase_free_phy_pages_helper(alloc, alloc->evicted);
 		freed += alloc->evicted;
+		WARN_ON(atomic_sub_return(alloc->evicted, &kctx->evict_nents) < 0);
 		list_del_init(&alloc->evict_node);
 
 		/*
@@ -735,6 +729,8 @@ int kbase_mem_evictable_init(struct kbase_context *kctx)
 	INIT_LIST_HEAD(&kctx->evict_list);
 	mutex_init(&kctx->jit_evict_lock);
 
+	atomic_set(&kctx->evict_nents, 0);
+
 	kctx->reclaim.count_objects = kbase_mem_evictable_reclaim_count_objects;
 	kctx->reclaim.scan_objects = kbase_mem_evictable_reclaim_scan_objects;
 	kctx->reclaim.seeks = DEFAULT_SEEKS;
@@ -818,6 +814,7 @@ int kbase_mem_evictable_make(struct kbase_mem_phy_alloc *gpu_alloc)
 	 * can reclaim it.
 	 */
 	list_add(&gpu_alloc->evict_node, &kctx->evict_list);
+	atomic_add(gpu_alloc->nents, &kctx->evict_nents);
 	mutex_unlock(&kctx->jit_evict_lock);
 	kbase_mem_evictable_mark_reclaim(gpu_alloc);
 
@@ -837,6 +834,7 @@ bool kbase_mem_evictable_unmake(struct kbase_mem_phy_alloc *gpu_alloc)
 	 * First remove the allocation from the eviction list as it's no
 	 * longer eligible for eviction.
 	 */
+	WARN_ON(atomic_sub_return(gpu_alloc->nents, &kctx->evict_nents) < 0);
 	list_del_init(&gpu_alloc->evict_node);
 	mutex_unlock(&kctx->jit_evict_lock);
 
@@ -1408,7 +1406,7 @@ static struct kbase_va_region *kbase_mem_from_umm(struct kbase_context *kctx,
 	if (*flags & BASE_MEM_IMPORT_SYNC_ON_MAP_UNMAP)
 		need_sync = true;
 
-#ifdef CONFIG_64BIT
+#if IS_ENABLED(CONFIG_64BIT)
 	if (!kbase_ctx_flag(kctx, KCTX_COMPAT)) {
 		/*
 		 * 64-bit tasks require us to reserve VA on the CPU that we use
@@ -1561,7 +1559,7 @@ static struct kbase_va_region *kbase_mem_from_user_buffer(
 	if (*flags & BASE_MEM_IMPORT_SHARED)
 		shared_zone = true;
 
-#ifdef CONFIG_64BIT
+#if IS_ENABLED(CONFIG_64BIT)
 	if (!kbase_ctx_flag(kctx, KCTX_COMPAT)) {
 		/*
 		 * 64-bit tasks require us to reserve VA on the CPU that we use
@@ -1755,7 +1753,7 @@ u64 kbase_mem_alias(struct kbase_context *kctx, u64 *flags, u64 stride,
 	/* calculate the number of pages this alias will cover */
 	*num_pages = nents * stride;
 
-#ifdef CONFIG_64BIT
+#if IS_ENABLED(CONFIG_64BIT)
 	if (!kbase_ctx_flag(kctx, KCTX_COMPAT)) {
 		/* 64-bit tasks must MMAP anyway, but not expose this address to
 		 * clients
@@ -1876,7 +1874,7 @@ u64 kbase_mem_alias(struct kbase_context *kctx, u64 *flags, u64 stride,
 		}
 	}
 
-#ifdef CONFIG_64BIT
+#if IS_ENABLED(CONFIG_64BIT)
 	if (!kbase_ctx_flag(kctx, KCTX_COMPAT)) {
 		/* Bind to a cookie */
 		if (bitmap_empty(kctx->cookies, BITS_PER_LONG)) {
@@ -1911,7 +1909,7 @@ u64 kbase_mem_alias(struct kbase_context *kctx, u64 *flags, u64 stride,
 
 	return gpu_va;
 
-#ifdef CONFIG_64BIT
+#if IS_ENABLED(CONFIG_64BIT)
 no_cookie:
 #endif
 no_mmap:
@@ -1999,7 +1997,7 @@ int kbase_mem_import(struct kbase_context *kctx, enum base_mem_import_type type,
 				sizeof(user_buffer))) {
 			reg = NULL;
 		} else {
-#ifdef CONFIG_COMPAT
+#if IS_ENABLED(CONFIG_COMPAT)
 			if (kbase_ctx_flag(kctx, KCTX_COMPAT))
 				uptr = compat_ptr(user_buffer.ptr);
 			else
@@ -3191,10 +3189,8 @@ static unsigned long get_queue_doorbell_pfn(struct kbase_device *kbdev,
 	 * assigned one, otherwise a dummy page. Always return the
 	 * dummy page in no mali builds.
 	 */
-	if ((queue->doorbell_nr == KBASEP_USER_DB_NR_INVALID) ||
-			IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI))
+	if (queue->doorbell_nr == KBASEP_USER_DB_NR_INVALID)
 		return PFN_DOWN(as_phys_addr_t(kbdev->csf.dummy_db_page));
-
 	return (PFN_DOWN(kbdev->reg_start + CSF_HW_DOORBELL_PAGE_OFFSET +
 			 (u64)queue->doorbell_nr * CSF_HW_DOORBELL_PAGE_SIZE));
 }
@@ -3440,7 +3436,7 @@ static vm_fault_t kbase_csf_user_reg_vm_fault(struct vm_fault *vmf)
 	/* Don't map in the actual register page if GPU is powered down.
 	 * Always map in the dummy page in no mali builds.
 	 */
-	if (!kbdev->pm.backend.gpu_powered || IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI))
+	if (!kbdev->pm.backend.gpu_powered)
 		pfn = PFN_DOWN(as_phys_addr_t(kbdev->csf.dummy_user_reg_page));
 
 	ret = mgm_dev->ops.mgm_vmf_insert_pfn_prot(mgm_dev,
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_linux.h b/drivers/gpu/arm/bifrost/mali_kbase_mem_linux.h
index c04b7fe59b0a..36159c1b71c1 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_linux.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_linux.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2010, 2012-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_lowlevel.h b/drivers/gpu/arm/bifrost/mali_kbase_mem_lowlevel.h
index ab09ec9b2b34..3f260bf42c4b 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_lowlevel.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_lowlevel.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2012-2014, 2016-2018, 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_pool.c b/drivers/gpu/arm/bifrost/mali_kbase_mem_pool.c
index 1874a6f9afd7..a11da825e21c 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_pool.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_pool.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2015-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_debugfs.c b/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_debugfs.c
index e7d8fdc82e27..cfb43b029c6c 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_debugfs.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_debugfs.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_debugfs.h b/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_debugfs.h
index b2a94d7b775b..207b58536a58 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_debugfs.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_debugfs.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_group.c b/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_group.c
index 72a17b268502..8d7bb4d68854 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_group.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_group.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_group.h b/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_group.h
index 35333e916ae1..38fd4cad9a77 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_group.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_group.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs.c b/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs.c
index 113b69e4d410..201ff517228c 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2012-2017, 2019-2021 ARM Limited. All rights reserved.
@@ -21,7 +21,7 @@
 
 #include <mali_kbase.h>
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 
 /**
  * Show callback for the @c mem_profile debugfs file.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs.h b/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs.h
index 7b5695d44ae3..093a65e35f7a 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2012-2016, 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs_buf_size.h b/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs_buf_size.h
index 8489c550fc6b..3184a98f30ce 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs_buf_size.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs_buf_size.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2014, 2017-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mipe_gen_header.h b/drivers/gpu/arm/bifrost/mali_kbase_mipe_gen_header.h
index d1ea7ad24792..f0b385e6e51f 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mipe_gen_header.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mipe_gen_header.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mipe_proto.h b/drivers/gpu/arm/bifrost/mali_kbase_mipe_proto.h
index ee88ee69c0fc..c35ee61ce5aa 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mipe_proto.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mipe_proto.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_native_mgm.c b/drivers/gpu/arm/bifrost/mali_kbase_native_mgm.c
index 957d884b9c11..4554bee783e7 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_native_mgm.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_native_mgm.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_native_mgm.h b/drivers/gpu/arm/bifrost/mali_kbase_native_mgm.h
index f14fee42ca12..1eae2fcf98b6 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_native_mgm.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_native_mgm.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_platform_fake.c b/drivers/gpu/arm/bifrost/mali_kbase_platform_fake.c
index 02bfb256ce2a..bf525ed0ac27 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_platform_fake.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_platform_fake.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2011-2014, 2016-2017, 2020-2021 ARM Limited. All rights reserved.
@@ -25,7 +25,6 @@
 #include <linux/platform_device.h>
 #include <linux/string.h>
 
-
 /*
  * This file is included only for type definitions and functions belonging to
  * specific platform folders. Do not add dependencies with symbols that are
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_pm.c b/drivers/gpu/arm/bifrost/mali_kbase_pm.c
index 3ded47ba85c5..de100ddd8767 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_pm.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_pm.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
@@ -29,13 +29,13 @@
 #include <mali_kbase_hwcnt_context.h>
 
 #include <mali_kbase_pm.h>
-#include <mali_kbase_pm_internal.h>
+#include <backend/gpu/mali_kbase_pm_internal.h>
 
 #ifdef CONFIG_MALI_ARBITER_SUPPORT
 #include <arbiter/mali_kbase_arbiter_pm.h>
 #endif /* CONFIG_MALI_ARBITER_SUPPORT */
 
-#include <mali_kbase_clk_rate_trace_mgr.h>
+#include <backend/gpu/mali_kbase_clk_rate_trace_mgr.h>
 
 int kbase_pm_powerup(struct kbase_device *kbdev, unsigned int flags)
 {
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_pm.h b/drivers/gpu/arm/bifrost/mali_kbase_pm.h
index f7340dd4d903..980a8d19d938 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_pm.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_pm.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_regs_history_debugfs.c b/drivers/gpu/arm/bifrost/mali_kbase_regs_history_debugfs.c
index 0e7b7f033fda..d13ab10cb59b 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_regs_history_debugfs.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_regs_history_debugfs.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2014, 2016, 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2016, 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -22,7 +22,7 @@
 #include "mali_kbase.h"
 #include "mali_kbase_regs_history_debugfs.h"
 
-#if defined(CONFIG_DEBUG_FS) && !defined(CONFIG_MALI_BIFROST_NO_MALI)
+#if defined(CONFIG_DEBUG_FS) && !IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI)
 
 #include <linux/debugfs.h>
 
@@ -241,4 +241,4 @@ void kbasep_regs_history_debugfs_init(struct kbase_device *kbdev)
 			kbdev->mali_debugfs_directory, &kbdev->io_history,
 			&regs_history_fops);
 }
-#endif /* defined(CONFIG_DEBUG_FS) && !defined(CONFIG_MALI_BIFROST_NO_MALI) */
+#endif /* defined(CONFIG_DEBUG_FS) && !IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI) */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_regs_history_debugfs.h b/drivers/gpu/arm/bifrost/mali_kbase_regs_history_debugfs.h
index b202b22256c8..75fbb47d5107 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_regs_history_debugfs.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_regs_history_debugfs.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2014, 2016, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2016, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -36,7 +36,7 @@
 
 struct kbase_device;
 
-#if defined(CONFIG_DEBUG_FS) && !defined(CONFIG_MALI_BIFROST_NO_MALI)
+#if defined(CONFIG_DEBUG_FS) && !IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI)
 
 /**
  * kbase_io_history_init - initialize data struct for register access history
@@ -69,16 +69,7 @@ void kbase_io_history_dump(struct kbase_device *kbdev);
  */
 void kbasep_regs_history_debugfs_init(struct kbase_device *kbdev);
 
-#else /* defined(CONFIG_DEBUG_FS) && !defined(CONFIG_MALI_BIFROST_NO_MALI) */
-
-#define kbase_io_history_init(...) ((int)0)
-
-#define kbase_io_history_term CSTD_NOP
-
-#define kbase_io_history_dump CSTD_NOP
-
-#define kbasep_regs_history_debugfs_init CSTD_NOP
-
-#endif /* defined(CONFIG_DEBUG_FS) && !defined(CONFIG_MALI_BIFROST_NO_MALI) */
+#else /* defined(CONFIG_DEBUG_FS) && !IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI) */
+#endif /* defined(CONFIG_DEBUG_FS) && !IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI) */
 
 #endif  /*_KBASE_REGS_HISTORY_DEBUGFS_H*/
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_reset_gpu.h b/drivers/gpu/arm/bifrost/mali_kbase_reset_gpu.h
index cb8a082f6293..292a29cb8b57 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_reset_gpu.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_reset_gpu.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_smc.c b/drivers/gpu/arm/bifrost/mali_kbase_smc.c
index 82c5a10a15f5..abbe8d56d082 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_smc.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_smc.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2015, 2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2015, 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -19,7 +19,7 @@
  *
  */
 
-#ifdef CONFIG_ARM64
+#if IS_ENABLED(CONFIG_ARM64)
 
 #include <mali_kbase.h>
 #include <mali_kbase_smc.h>
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_smc.h b/drivers/gpu/arm/bifrost/mali_kbase_smc.h
index 9b89c321bf19..d0086dbf38e0 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_smc.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_smc.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2015, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2015, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -22,7 +22,7 @@
 #ifndef _KBASE_SMC_H_
 #define _KBASE_SMC_H_
 
-#ifdef CONFIG_ARM64
+#if IS_ENABLED(CONFIG_ARM64)
 
 #include <mali_kbase.h>
 
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_softjobs.c b/drivers/gpu/arm/bifrost/mali_kbase_softjobs.c
index f78063835ddd..490d9e1f0ddc 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_softjobs.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_softjobs.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2011-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_strings.c b/drivers/gpu/arm/bifrost/mali_kbase_strings.c
index f38093031494..84784be6f244 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_strings.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_strings.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2010-2016, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2016, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_strings.h b/drivers/gpu/arm/bifrost/mali_kbase_strings.h
index e6ec7f3bc050..c3f94f9267d5 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_strings.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_strings.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2010-2016, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2016, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_sync.h b/drivers/gpu/arm/bifrost/mali_kbase_sync.h
index ae3601f9bee4..e20edec67761 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_sync.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_sync.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2012-2016, 2018-2021 ARM Limited. All rights reserved.
@@ -30,10 +30,10 @@
 
 #include <linux/fdtable.h>
 #include <linux/syscalls.h>
-#ifdef CONFIG_SYNC
+#if IS_ENABLED(CONFIG_SYNC)
 #include <sync.h>
 #endif
-#ifdef CONFIG_SYNC_FILE
+#if IS_ENABLED(CONFIG_SYNC_FILE)
 #include "mali_kbase_fence_defs.h"
 #include <linux/sync_file.h>
 #endif
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_sync_android.c b/drivers/gpu/arm/bifrost/mali_kbase_sync_android.c
index e3d2e5555d23..562cf2dfa4fc 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_sync_android.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_sync_android.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2012-2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_sync_common.c b/drivers/gpu/arm/bifrost/mali_kbase_sync_common.c
index 39a68c268bd1..5ee7fc3ce72b 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_sync_common.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_sync_common.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2012-2016, 2018-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_sync_file.c b/drivers/gpu/arm/bifrost/mali_kbase_sync_file.c
index 76ce17d4bd1f..3ad64d6e37b9 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_sync_file.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_sync_file.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2012-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_trace_gpu_mem.c b/drivers/gpu/arm/bifrost/mali_kbase_trace_gpu_mem.c
index 0458e17c48a2..3088c41eb464 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_trace_gpu_mem.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_trace_gpu_mem.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_trace_gpu_mem.h b/drivers/gpu/arm/bifrost/mali_kbase_trace_gpu_mem.h
index b78b553809b5..fd871fcb352a 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_trace_gpu_mem.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_trace_gpu_mem.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -22,7 +22,7 @@
 #ifndef _KBASE_TRACE_GPU_MEM_H_
 #define _KBASE_TRACE_GPU_MEM_H_
 
-#ifdef CONFIG_TRACE_GPU_MEM
+#if IS_ENABLED(CONFIG_TRACE_GPU_MEM)
 #include <trace/events/gpu_mem.h>
 #endif
 
@@ -31,7 +31,7 @@
 static void kbase_trace_gpu_mem_usage(struct kbase_device *kbdev,
 				      struct kbase_context *kctx)
 {
-#ifdef CONFIG_TRACE_GPU_MEM
+#if IS_ENABLED(CONFIG_TRACE_GPU_MEM)
 	lockdep_assert_held(&kbdev->gpu_mem_usage_lock);
 
 	trace_gpu_mem_total(kbdev->id, DEVICE_TGID,
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_utility.h b/drivers/gpu/arm/bifrost/mali_kbase_utility.h
index 5911969d2ecd..2dad49b59f52 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_utility.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_utility.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2012-2013, 2015, 2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2013, 2015, 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_vinstr.c b/drivers/gpu/arm/bifrost/mali_kbase_vinstr.c
index bc992bb947a0..38de7f6b0467 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_vinstr.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_vinstr.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2011-2021 ARM Limited. All rights reserved.
@@ -53,6 +53,10 @@
  *                               counters.
  * @hvirt:         Hardware counter virtualizer used by vinstr.
  * @metadata:      Hardware counter metadata provided by virtualizer.
+ * @metadata_user: API compatible hardware counter metadata provided by vinstr.
+ *                 For compatibility with the user driver interface, this
+ *                 contains a "truncated" version of the HWCNT metadata limited
+ *                 to 64 entries per block. NULL when not required.
  * @lock:          Lock protecting all vinstr state.
  * @suspend_count: Suspend reference count. If non-zero, timer and worker are
  *                 prevented from being re-scheduled.
@@ -64,6 +68,7 @@
 struct kbase_vinstr_context {
 	struct kbase_hwcnt_virtualizer *hvirt;
 	const struct kbase_hwcnt_metadata *metadata;
+	const struct kbase_hwcnt_metadata *metadata_user;
 	struct mutex lock;
 	size_t suspend_count;
 	size_t client_count;
@@ -217,9 +222,18 @@ static int kbasep_vinstr_client_dump(
 	/* Copy the temp buffer to the userspace visible buffer. The strict
 	 * variant will explicitly zero any non-enabled counters to ensure
 	 * nothing except exactly what the user asked for is made visible.
+	 *
+	 * If the metadata in vinstr (vctx->metadata_user) is not NULL, it means
+	 * vinstr has the truncated metadata, so do a narrow copy since
+	 * virtualizer has a bigger buffer but user only needs part of it.
+	 * otherwise we do a full copy.
 	 */
-	kbase_hwcnt_dump_buffer_copy_strict(
-		dump_buf, tmp_buf, &vcli->enable_map);
+	if (vcli->vctx->metadata_user)
+		kbase_hwcnt_dump_buffer_copy_strict_narrow(dump_buf, tmp_buf,
+							   &vcli->enable_map);
+	else
+		kbase_hwcnt_dump_buffer_copy_strict(dump_buf, tmp_buf,
+						    &vcli->enable_map);
 
 	clk_cnt = vcli->vctx->metadata->clk_cnt;
 
@@ -422,6 +436,9 @@ static int kbasep_vinstr_client_create(
 	phys_em.mmu_l2_bm = setup->mmu_l2_bm;
 	kbase_hwcnt_gpu_enable_map_from_physical(&vcli->enable_map, &phys_em);
 
+	/* Use virtualizer's metadata to alloc tmp buffer which interacts with
+	 * the HWC virtualizer.
+	 */
 	errcode = kbase_hwcnt_dump_buffer_alloc(vctx->metadata, &vcli->tmp_buf);
 	if (errcode)
 		goto error;
@@ -429,8 +446,20 @@ static int kbasep_vinstr_client_create(
 	/* Enable all the available clk_enable_map. */
 	vcli->enable_map.clk_enable_map = (1ull << vctx->metadata->clk_cnt) - 1;
 
-	errcode = kbase_hwcnt_dump_buffer_array_alloc(
-		vctx->metadata, setup->buffer_count, &vcli->dump_bufs);
+	if (vctx->metadata_user)
+		/* Use vinstr's truncated metadata to alloc dump buffers which
+		 * interact with clients.
+		 */
+		errcode =
+			kbase_hwcnt_dump_buffer_array_alloc(vctx->metadata_user,
+							    setup->buffer_count,
+							    &vcli->dump_bufs);
+	else
+		/* Use metadata from virtualizer to allocate dump buffers  if
+		 * vinstr doesn't have the truncated metadata.
+		 */
+		errcode = kbase_hwcnt_dump_buffer_array_alloc(
+			vctx->metadata, setup->buffer_count, &vcli->dump_bufs);
 	if (errcode)
 		goto error;
 
@@ -458,6 +487,7 @@ int kbase_vinstr_init(
 	struct kbase_hwcnt_virtualizer *hvirt,
 	struct kbase_vinstr_context **out_vctx)
 {
+	int errcode;
 	struct kbase_vinstr_context *vctx;
 	const struct kbase_hwcnt_metadata *metadata;
 
@@ -474,6 +504,11 @@ int kbase_vinstr_init(
 
 	vctx->hvirt = hvirt;
 	vctx->metadata = metadata;
+	vctx->metadata_user = NULL;
+	errcode = kbase_hwcnt_gpu_metadata_create_truncate_64(
+		&vctx->metadata_user, metadata);
+	if (errcode)
+		goto err_metadata_create;
 
 	mutex_init(&vctx->lock);
 	INIT_LIST_HEAD(&vctx->clients);
@@ -483,6 +518,11 @@ int kbase_vinstr_init(
 
 	*out_vctx = vctx;
 	return 0;
+
+err_metadata_create:
+	kfree(vctx);
+
+	return errcode;
 }
 
 void kbase_vinstr_term(struct kbase_vinstr_context *vctx)
@@ -503,6 +543,9 @@ void kbase_vinstr_term(struct kbase_vinstr_context *vctx)
 		}
 	}
 
+	if (vctx->metadata_user)
+		kbase_hwcnt_metadata_destroy(vctx->metadata_user);
+
 	WARN_ON(vctx->client_count != 0);
 	kfree(vctx);
 }
@@ -963,9 +1006,14 @@ static long kbasep_vinstr_hwcnt_reader_ioctl(
 			cli, (u32 __user *)arg);
 		break;
 	case _IOC_NR(KBASE_HWCNT_READER_GET_BUFFER_SIZE):
-		rcode = put_user(
-			(u32)cli->vctx->metadata->dump_buf_bytes,
-			(u32 __user *)arg);
+		if (cli->vctx->metadata_user)
+			rcode = put_user(
+				(u32)cli->vctx->metadata_user->dump_buf_bytes,
+				(u32 __user *)arg);
+		else
+			rcode = put_user(
+				(u32)cli->vctx->metadata->dump_buf_bytes,
+				(u32 __user *)arg);
 		break;
 	case _IOC_NR(KBASE_HWCNT_READER_DUMP):
 		rcode = kbasep_vinstr_hwcnt_reader_ioctl_dump(cli);
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_vinstr.h b/drivers/gpu/arm/bifrost/mali_kbase_vinstr.h
index a20f31aaf5d0..6747ec70a406 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_vinstr.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_vinstr.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2015-2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2015-2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_linux_trace.h b/drivers/gpu/arm/bifrost/mali_linux_trace.h
index 6fe48ff2f7da..52f17390c853 100644
--- a/drivers/gpu/arm/bifrost/mali_linux_trace.h
+++ b/drivers/gpu/arm/bifrost/mali_linux_trace.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2011-2016, 2018-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_malisw.h b/drivers/gpu/arm/bifrost/mali_malisw.h
index c0640440839d..c0649f2f4be6 100644
--- a/drivers/gpu/arm/bifrost/mali_malisw.h
+++ b/drivers/gpu/arm/bifrost/mali_malisw.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2014-2015, 2018, 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mali_power_gpu_frequency_trace.c b/drivers/gpu/arm/bifrost/mali_power_gpu_frequency_trace.c
index f548b04d9a8c..1db3abe2f9f6 100644
--- a/drivers/gpu/arm/bifrost/mali_power_gpu_frequency_trace.c
+++ b/drivers/gpu/arm/bifrost/mali_power_gpu_frequency_trace.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mali_power_gpu_frequency_trace.h b/drivers/gpu/arm/bifrost/mali_power_gpu_frequency_trace.h
index d6909a4cf911..ea18fcd01f6e 100644
--- a/drivers/gpu/arm/bifrost/mali_power_gpu_frequency_trace.h
+++ b/drivers/gpu/arm/bifrost/mali_power_gpu_frequency_trace.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mmu/Kbuild b/drivers/gpu/arm/bifrost/mmu/Kbuild
new file mode 100644
index 000000000000..416432397b5c
--- /dev/null
+++ b/drivers/gpu/arm/bifrost/mmu/Kbuild
@@ -0,0 +1,30 @@
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+#
+# (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
+#
+# This program is free software and is provided to you under the terms of the
+# GNU General Public License version 2 as published by the Free Software
+# Foundation, and any use by you of this program is subject to the terms
+# of such GNU license.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can access it online at
+# http://www.gnu.org/licenses/gpl-2.0.html.
+#
+#
+
+bifrost_kbase-y += \
+    mmu/mali_kbase_mmu.o \
+    mmu/mali_kbase_mmu_hw_direct.o \
+    mmu/mali_kbase_mmu_mode_aarch64.o
+
+ifeq ($(CONFIG_MALI_CSF_SUPPORT),y)
+    bifrost_kbase-y += mmu/backend/mali_kbase_mmu_csf.o
+else
+    bifrost_kbase-y += mmu/backend/mali_kbase_mmu_jm.o
+endif
diff --git a/drivers/gpu/arm/bifrost/mmu/backend/mali_kbase_mmu_csf.c b/drivers/gpu/arm/bifrost/mmu/backend/mali_kbase_mmu_csf.c
index 8240817cc135..05253aeb9876 100644
--- a/drivers/gpu/arm/bifrost/mmu/backend/mali_kbase_mmu_csf.c
+++ b/drivers/gpu/arm/bifrost/mmu/backend/mali_kbase_mmu_csf.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -28,7 +28,7 @@
 #include <mali_kbase_ctx_sched.h>
 #include <mali_kbase_reset_gpu.h>
 #include <mali_kbase_as_fault_debugfs.h>
-#include "../mali_kbase_mmu_internal.h"
+#include <mmu/mali_kbase_mmu_internal.h>
 
 void kbase_mmu_get_as_setup(struct kbase_mmu_table *mmut,
 		struct kbase_mmu_setup * const setup)
@@ -483,6 +483,15 @@ static void kbase_mmu_gpu_fault_worker(struct work_struct *data)
 	kbase_ctx_sched_release_ctx_lock(kctx);
 
 	atomic_dec(&kbdev->faults_pending);
+
+	/* A work for GPU fault is complete.
+	 * Till reaching here, no further GPU fault will be reported.
+	 * Now clear the GPU fault to allow next GPU fault interrupt report.
+	 */
+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
+			GPU_COMMAND_CLEAR_FAULT);
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 }
 
 /**
diff --git a/drivers/gpu/arm/bifrost/mmu/backend/mali_kbase_mmu_jm.c b/drivers/gpu/arm/bifrost/mmu/backend/mali_kbase_mmu_jm.c
index ae334c182a69..01ca419af60c 100644
--- a/drivers/gpu/arm/bifrost/mmu/backend/mali_kbase_mmu_jm.c
+++ b/drivers/gpu/arm/bifrost/mmu/backend/mali_kbase_mmu_jm.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -28,7 +28,7 @@
 #include <mali_kbase_hwaccess_jm.h>
 #include <device/mali_kbase_device.h>
 #include <mali_kbase_as_fault_debugfs.h>
-#include "../mali_kbase_mmu_internal.h"
+#include <mmu/mali_kbase_mmu_internal.h>
 
 void kbase_mmu_get_as_setup(struct kbase_mmu_table *mmut,
 		struct kbase_mmu_setup * const setup)
diff --git a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu.c b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu.c
index 0761f68c1234..85e2d882521e 100644
--- a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu.c
+++ b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
@@ -29,7 +29,7 @@
 #include <gpu/mali_kbase_gpu_fault.h>
 #include <gpu/mali_kbase_gpu_regmap.h>
 #include <tl/mali_kbase_tracepoints.h>
-#include <mali_kbase_instr_defs.h>
+#include <backend/gpu/mali_kbase_instr_defs.h>
 #include <mali_kbase_ctx_sched.h>
 #include <mali_kbase_debug.h>
 #include <mali_kbase_defs.h>
@@ -982,7 +982,11 @@ static phys_addr_t kbase_mmu_alloc_pgd(struct kbase_device *kbdev,
 	int i;
 	struct page *p;
 
+#ifdef CONFIG_MALI_2MB_ALLOC
+	p = kbase_mem_pool_alloc(&kbdev->mem_pools.large[mmut->group_id]);
+#else /* CONFIG_MALI_2MB_ALLOC */
 	p = kbase_mem_pool_alloc(&kbdev->mem_pools.small[mmut->group_id]);
+#endif /* CONFIG_MALI_2MB_ALLOC */
 	if (!p)
 		return 0;
 
@@ -1019,8 +1023,12 @@ static phys_addr_t kbase_mmu_alloc_pgd(struct kbase_device *kbdev,
 	return page_to_phys(p);
 
 alloc_free:
-	kbase_mem_pool_free(&kbdev->mem_pools.small[mmut->group_id], p,
-		false);
+
+#ifdef CONFIG_MALI_2MB_ALLOC
+	kbase_mem_pool_free(&kbdev->mem_pools.large[mmut->group_id], p, false);
+#else /* CONFIG_MALI_2MB_ALLOC */
+	kbase_mem_pool_free(&kbdev->mem_pools.small[mmut->group_id], p, false);
+#endif /* CONFIG_MALI_2MB_ALLOC */
 
 	return 0;
 }
@@ -1246,7 +1254,11 @@ int kbase_mmu_insert_single_page(struct kbase_context *kctx, u64 vpfn,
 			 */
 			mutex_unlock(&kctx->mmu.mmu_lock);
 			err = kbase_mem_pool_grow(
+#ifdef CONFIG_MALI_2MB_ALLOC
+				&kbdev->mem_pools.large[
+#else
 				&kbdev->mem_pools.small[
+#endif
 					kctx->mmu.group_id],
 				MIDGARD_MMU_BOTTOMLEVEL);
 			mutex_lock(&kctx->mmu.mmu_lock);
@@ -1325,7 +1337,11 @@ static inline void cleanup_empty_pte(struct kbase_device *kbdev,
 
 	tmp_pgd = kbdev->mmu_mode->pte_to_phy_addr(*pte);
 	tmp_p = phys_to_page(tmp_pgd);
+#ifdef CONFIG_MALI_2MB_ALLOC
+	kbase_mem_pool_free(&kbdev->mem_pools.large[mmut->group_id],
+#else
 	kbase_mem_pool_free(&kbdev->mem_pools.small[mmut->group_id],
+#endif
 		tmp_p, false);
 
 	/* If the MMU tables belong to a context then we accounted the memory
@@ -1409,7 +1425,11 @@ int kbase_mmu_insert_pages_no_flush(struct kbase_device *kbdev,
 			 */
 			mutex_unlock(&mmut->mmu_lock);
 			err = kbase_mem_pool_grow(
+#ifdef CONFIG_MALI_2MB_ALLOC
+				&kbdev->mem_pools.large[mmut->group_id],
+#else
 				&kbdev->mem_pools.small[mmut->group_id],
+#endif
 				cur_level);
 			mutex_lock(&mmut->mmu_lock);
 		} while (!err);
@@ -1897,7 +1917,11 @@ static int kbase_mmu_update_pages_no_flush(struct kbase_context *kctx, u64 vpfn,
 			 */
 			mutex_unlock(&kctx->mmu.mmu_lock);
 			err = kbase_mem_pool_grow(
+#ifdef CONFIG_MALI_2MB_ALLOC
+				&kbdev->mem_pools.large[
+#else
 				&kbdev->mem_pools.small[
+#endif
 					kctx->mmu.group_id],
 				MIDGARD_MMU_BOTTOMLEVEL);
 			mutex_lock(&kctx->mmu.mmu_lock);
@@ -1992,8 +2016,11 @@ static void mmu_teardown_level(struct kbase_device *kbdev,
 	}
 
 	p = pfn_to_page(PFN_DOWN(pgd));
-
+#ifdef CONFIG_MALI_2MB_ALLOC
+	kbase_mem_pool_free(&kbdev->mem_pools.large[mmut->group_id],
+#else
 	kbase_mem_pool_free(&kbdev->mem_pools.small[mmut->group_id],
+#endif
 		p, true);
 
 	atomic_sub(1, &kbdev->memdev.used_pages);
@@ -2036,7 +2063,11 @@ int kbase_mmu_init(struct kbase_device *const kbdev,
 		int err;
 
 		err = kbase_mem_pool_grow(
+#ifdef CONFIG_MALI_2MB_ALLOC
+			&kbdev->mem_pools.large[mmut->group_id],
+#else
 			&kbdev->mem_pools.small[mmut->group_id],
+#endif
 			MIDGARD_MMU_BOTTOMLEVEL);
 		if (err) {
 			kbase_mmu_term(kbdev, mmut);
diff --git a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu.h b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu.h
index bf4fd91d27bc..a2d1a8ee8475 100644
--- a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu.h
+++ b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_hw.h b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_hw.h
index ea088e921b03..d1f1ff2befe5 100644
--- a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_hw.h
+++ b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_hw.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2014-2015, 2018-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_hw_direct.c b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_hw_direct.c
index 88fd9cf9a864..a99b98852091 100644
--- a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_hw_direct.c
+++ b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_hw_direct.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_internal.h b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_internal.h
index d3fcd3939ab6..b8cd55f9cb64 100644
--- a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_internal.h
+++ b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_internal.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_mode_aarch64.c b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_mode_aarch64.c
index fac515cea403..16b928d42e25 100644
--- a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_mode_aarch64.c
+++ b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_mode_aarch64.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2010-2014, 2016-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2014, 2016-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/platform/Kconfig b/drivers/gpu/arm/bifrost/platform/Kconfig
index ac385aa6b021..5f0118d98640 100644
--- a/drivers/gpu/arm/bifrost/platform/Kconfig
+++ b/drivers/gpu/arm/bifrost/platform/Kconfig
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2012-2013, 2017 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2012-2013, 2017, 2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/platform/devicetree/Kbuild b/drivers/gpu/arm/bifrost/platform/devicetree/Kbuild
index f151ee8680ad..2eecd6635948 100644
--- a/drivers/gpu/arm/bifrost/platform/devicetree/Kbuild
+++ b/drivers/gpu/arm/bifrost/platform/devicetree/Kbuild
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2012-2017, 2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2012-2017, 2020-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
@@ -19,6 +19,7 @@
 #
 
 bifrost_kbase-y += \
-	$(MALI_PLATFORM_DIR)/mali_kbase_config_devicetree.o \
-	$(MALI_PLATFORM_DIR)/mali_kbase_runtime_pm.o \
-	$(MALI_PLATFORM_DIR)/mali_kbase_clk_rate_trace.o
+    platform/$(MALI_PLATFORM_DIR)/mali_kbase_config_devicetree.o \
+    platform/$(MALI_PLATFORM_DIR)/mali_kbase_config_platform.o \
+    platform/$(MALI_PLATFORM_DIR)/mali_kbase_runtime_pm.o \
+    platform/$(MALI_PLATFORM_DIR)/mali_kbase_clk_rate_trace.o
diff --git a/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_clk_rate_trace.c b/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_clk_rate_trace.c
index f149554c28ed..4bcd5854d3a3 100644
--- a/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_clk_rate_trace.c
+++ b/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_clk_rate_trace.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2015, 2017-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2015, 2017-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_config_devicetree.c b/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_config_devicetree.c
index 5f300b1913e1..a0b4a434e2a7 100644
--- a/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_config_devicetree.c
+++ b/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_config_devicetree.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2015, 2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2015, 2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -19,7 +19,9 @@
  *
  */
 
+#include <mali_kbase.h>
 #include <mali_kbase_config.h>
+#include <backend/gpu/mali_kbase_pm_internal.h>
 
 static struct kbase_platform_config dummy_platform_config;
 
@@ -38,3 +40,14 @@ void kbase_platform_unregister(void)
 {
 }
 #endif
+
+#ifdef CONFIG_MALI_BIFROST_DVFS
+#if MALI_USE_CSF
+int kbase_platform_dvfs_event(struct kbase_device *kbdev, u32 utilisation)
+#else
+int kbase_platform_dvfs_event(struct kbase_device *kbdev, u32 utilisation, u32 util_gl_share, u32 util_cl_share[2])
+#endif
+{
+	return 1;
+}
+#endif /* CONFIG_MALI_BIFROST_DVFS */
diff --git a/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_config_platform.c b/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_config_platform.c
new file mode 100644
index 000000000000..63aa33ffcc4a
--- /dev/null
+++ b/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_config_platform.c
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+/*
+ *
+ * (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+#include <mali_kbase.h>
+#include <mali_kbase_defs.h>
+#include <mali_kbase_config.h>
+#include "mali_kbase_config_platform.h"
+#include <device/mali_kbase_device.h>
+#include <mali_kbase_hwaccess_time.h>
+#include <gpu/mali_kbase_gpu_regmap.h>
+
+#include <linux/kthread.h>
+#include <linux/timer.h>
+#include <linux/jiffies.h>
+#include <linux/wait.h>
+#include <linux/delay.h>
+#include <linux/gcd.h>
+#include <asm/arch_timer.h>
+
+struct kbase_platform_funcs_conf platform_funcs = {
+	.platform_init_func = NULL,
+	.platform_term_func = NULL,
+	.platform_late_init_func = NULL,
+	.platform_late_term_func = NULL,
+};
diff --git a/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_config_platform.h b/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_config_platform.h
index ee9ae52c8608..927d5c274d14 100644
--- a/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_config_platform.h
+++ b/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_config_platform.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2014-2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -33,13 +33,13 @@
  * Attached value: pointer to @ref kbase_platform_funcs_conf
  * Default value: See @ref kbase_platform_funcs_conf
  */
-#define PLATFORM_FUNCS (NULL)
+#define PLATFORM_FUNCS (&platform_funcs)
 
 #define CLK_RATE_TRACE_OPS (&clk_rate_trace_ops)
 
 extern struct kbase_pm_callback_conf pm_callbacks;
 extern struct kbase_clk_rate_trace_op_conf clk_rate_trace_ops;
-
+extern struct kbase_platform_funcs_conf platform_funcs;
 /**
  * Autosuspend delay
  *
diff --git a/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_runtime_pm.c b/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_runtime_pm.c
index 008f8a45f86d..3b84d741bc30 100644
--- a/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_runtime_pm.c
+++ b/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_runtime_pm.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2015-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2015-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -25,6 +25,7 @@
 #include <linux/clk.h>
 #include <linux/clk-provider.h>
 #include <linux/regulator/consumer.h>
+
 #include "mali_kbase_config_platform.h"
 
 static void enable_gpu_power_control(struct kbase_device *kbdev)
diff --git a/drivers/gpu/arm/bifrost/platform/rk/Kbuild b/drivers/gpu/arm/bifrost/platform/rk/Kbuild
index 7cc6c59d969f..a1e78cfc4ae7 100755
--- a/drivers/gpu/arm/bifrost/platform/rk/Kbuild
+++ b/drivers/gpu/arm/bifrost/platform/rk/Kbuild
@@ -13,5 +13,4 @@
 #
 
 bifrost_kbase-y += \
-	$(MALI_PLATFORM_DIR)/mali_kbase_config_rk.o \
-
+	platform/$(MALI_PLATFORM_DIR)/mali_kbase_config_rk.o
diff --git a/drivers/gpu/arm/bifrost/platform/vexpress/Kbuild b/drivers/gpu/arm/bifrost/platform/vexpress/Kbuild
index c1646478a9dc..e1398fde3976 100644
--- a/drivers/gpu/arm/bifrost/platform/vexpress/Kbuild
+++ b/drivers/gpu/arm/bifrost/platform/vexpress/Kbuild
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2012-2013, 2016-2017, 2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2012-2013, 2016-2017, 2020-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
@@ -19,5 +19,5 @@
 #
 
 bifrost_kbase-y += \
-	$(MALI_PLATFORM_DIR)/mali_kbase_config_vexpress.o \
-	mali_kbase_platform_fake.o
+    platform/$(MALI_PLATFORM_DIR)/mali_kbase_config_vexpress.o \
+    mali_kbase_platform_fake.o
diff --git a/drivers/gpu/arm/bifrost/platform/vexpress/mali_kbase_config_platform.h b/drivers/gpu/arm/bifrost/platform/vexpress/mali_kbase_config_platform.h
index 97fdd13f22fb..d8682db25f2b 100644
--- a/drivers/gpu/arm/bifrost/platform/vexpress/mali_kbase_config_platform.h
+++ b/drivers/gpu/arm/bifrost/platform/vexpress/mali_kbase_config_platform.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2014-2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/platform/vexpress/mali_kbase_config_vexpress.c b/drivers/gpu/arm/bifrost/platform/vexpress/mali_kbase_config_vexpress.c
index 181681797030..8add708d0f8a 100644
--- a/drivers/gpu/arm/bifrost/platform/vexpress/mali_kbase_config_vexpress.c
+++ b/drivers/gpu/arm/bifrost/platform/vexpress/mali_kbase_config_vexpress.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2011-2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -25,6 +25,8 @@
 #include <mali_kbase_config.h>
 #include "mali_kbase_config_platform.h"
 
+#include <backend/gpu/mali_kbase_pm_internal.h>
+
 #ifndef CONFIG_OF
 static struct kbase_io_resources io_resources = {
 	.job_irq_number = 68,
@@ -64,3 +66,14 @@ struct kbase_platform_config *kbase_get_platform_config(void)
 {
 	return &versatile_platform_config;
 }
+
+#ifdef CONFIG_MALI_BIFROST_DVFS
+#if MALI_USE_CSF
+int kbase_platform_dvfs_event(struct kbase_device *kbdev, u32 utilisation)
+#else
+int kbase_platform_dvfs_event(struct kbase_device *kbdev, u32 utilisation, u32 util_gl_share, u32 util_cl_share[2])
+#endif
+{
+	return 1;
+}
+#endif /* CONFIG_MALI_BIFROST_DVFS */
diff --git a/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/Kbuild b/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/Kbuild
index 51ac81b1f189..e1398fde3976 100644
--- a/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/Kbuild
+++ b/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/Kbuild
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2013-2014, 2016-2017, 2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2012-2013, 2016-2017, 2020-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
@@ -19,5 +19,5 @@
 #
 
 bifrost_kbase-y += \
-	$(MALI_PLATFORM_DIR)/mali_kbase_config_vexpress.o \
-	mali_kbase_platform_fake.o
+    platform/$(MALI_PLATFORM_DIR)/mali_kbase_config_vexpress.o \
+    mali_kbase_platform_fake.o
diff --git a/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/mali_kbase_config_platform.h b/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/mali_kbase_config_platform.h
index 97fdd13f22fb..d8682db25f2b 100644
--- a/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/mali_kbase_config_platform.h
+++ b/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/mali_kbase_config_platform.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2014-2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/mali_kbase_config_vexpress.c b/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/mali_kbase_config_vexpress.c
index 3bb5caf1bbf6..835b7587cfbf 100644
--- a/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/mali_kbase_config_vexpress.c
+++ b/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/mali_kbase_config_vexpress.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2011-2014, 2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2014, 2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -24,6 +24,8 @@
 #include <mali_kbase_defs.h>
 #include <mali_kbase_config.h>
 
+#include <backend/gpu/mali_kbase_pm_internal.h>
+
 #ifndef CONFIG_OF
 static struct kbase_io_resources io_resources = {
 	.job_irq_number = 68,
@@ -62,3 +64,14 @@ struct kbase_platform_config *kbase_get_platform_config(void)
 {
 	return &versatile_platform_config;
 }
+
+#ifdef CONFIG_MALI_BIFROST_DVFS
+#if MALI_USE_CSF
+int kbase_platform_dvfs_event(struct kbase_device *kbdev, u32 utilisation)
+#else
+int kbase_platform_dvfs_event(struct kbase_device *kbdev, u32 utilisation, u32 util_gl_share, u32 util_cl_share[2])
+#endif
+{
+	return 1;
+}
+#endif /* CONFIG_MALI_BIFROST_DVFS */
diff --git a/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/Kbuild b/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/Kbuild
index 0000b6d8307c..10f7dc8cf22c 100644
--- a/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/Kbuild
+++ b/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/Kbuild
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2012-2013, 2016-2017 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2012-2013, 2016-2017, 2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
@@ -19,6 +19,6 @@
 #
 
 bifrost_kbase-y += \
-	$(MALI_PLATFORM_DIR)/mali_kbase_config_vexpress.o \
-	$(MALI_PLATFORM_DIR)/mali_kbase_cpu_vexpress.o \
-	mali_kbase_platform_fake.o
+    platform/$(MALI_PLATFORM_DIR)/mali_kbase_config_vexpress.o \
+    platform/$(MALI_PLATFORM_DIR)/mali_kbase_cpu_vexpress.o \
+    mali_kbase_platform_fake.o
diff --git a/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_platform.h b/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_platform.h
index 97fdd13f22fb..d8682db25f2b 100644
--- a/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_platform.h
+++ b/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_platform.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2014-2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_vexpress.c b/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_vexpress.c
index a7a842abf2d1..8be30fb25bba 100644
--- a/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_vexpress.c
+++ b/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_vexpress.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2011-2014, 2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2014, 2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -24,6 +24,8 @@
 #include <mali_kbase_defs.h>
 #include <mali_kbase_config.h>
 
+#include <backend/gpu/mali_kbase_pm_internal.h>
+
 #ifndef CONFIG_OF
 static struct kbase_io_resources io_resources = {
 	.job_irq_number = 75,
@@ -62,3 +64,14 @@ struct kbase_platform_config *kbase_get_platform_config(void)
 {
 	return &versatile_platform_config;
 }
+
+#ifdef CONFIG_MALI_BIFROST_DVFS
+#if MALI_USE_CSF
+int kbase_platform_dvfs_event(struct kbase_device *kbdev, u32 utilisation)
+#else
+int kbase_platform_dvfs_event(struct kbase_device *kbdev, u32 utilisation, u32 util_gl_share, u32 util_cl_share[2])
+#endif
+{
+	return 1;
+}
+#endif /* CONFIG_MALI_BIFROST_DVFS */
diff --git a/drivers/gpu/arm/bifrost/protected_mode_switcher.h b/drivers/gpu/arm/bifrost/protected_mode_switcher.h
index d9bab5622f4b..9dd9253c7e95 100644
--- a/drivers/gpu/arm/bifrost/protected_mode_switcher.h
+++ b/drivers/gpu/arm/bifrost/protected_mode_switcher.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2017, 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/tests/Kbuild b/drivers/gpu/arm/bifrost/tests/Kbuild
index cf9d7fdc9b17..ee3de7b00652 100644
--- a/drivers/gpu/arm/bifrost/tests/Kbuild
+++ b/drivers/gpu/arm/bifrost/tests/Kbuild
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2017, 2020-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
@@ -18,6 +18,13 @@
 #
 #
 
+ccflags-y += -I$(src)/include \
+             -I$(src)
+
+subdir-ccflags-y += -I$(src)/include \
+                    -I$(src)
+
 obj-$(CONFIG_MALI_KUTF) += kutf/
-obj-$(CONFIG_MALI_IRQ_LATENCY) += mali_kutf_irq_test/
-obj-$(CONFIG_MALI_CLK_RATE_TRACE_PORTAL) += mali_kutf_clk_rate_trace/kernel/
+obj-$(CONFIG_MALI_KUTF_IRQ_TEST) += mali_kutf_irq_test/
+obj-$(CONFIG_MALI_KUTF_CLK_RATE_TRACE) += mali_kutf_clk_rate_trace/kernel/
+
diff --git a/drivers/gpu/arm/bifrost/tests/Kconfig b/drivers/gpu/arm/bifrost/tests/Kconfig
index cf2a23a7df11..820f11e65d87 100644
--- a/drivers/gpu/arm/bifrost/tests/Kconfig
+++ b/drivers/gpu/arm/bifrost/tests/Kconfig
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2017, 2020-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
@@ -18,6 +18,40 @@
 #
 #
 
-source "drivers/gpu/arm/midgard/tests/kutf/Kconfig"
-source "drivers/gpu/arm/midgard/tests/mali_kutf_irq_test/Kconfig"
-source "drivers/gpu/arm/midgard/tests/mali_kutf_clk_rate_trace/kernel/Kconfig"
+menuconfig MALI_KUTF
+	bool "Build Mali Kernel Unit Test Framework modules"
+	depends on MALI_BIFROST && MALI_BIFROST_DEBUG
+	default y if MALI_BIFROST_DEBUG
+	help
+	  This option will build the Mali testing framework modules.
+
+	  Modules:
+	   - kutf.ko
+	   - kutf_test.ko
+
+config MALI_KUTF_IRQ_TEST
+	bool "Build Mali KUTF IRQ test module"
+	depends on MALI_KUTF
+	default y
+	help
+	  This option will build the IRQ latency measurement test module.
+	  It can determine the latency of the Mali GPU IRQ on your system.
+
+	  Modules:
+	    - mali_kutf_irq_test.ko
+
+config MALI_KUTF_CLK_RATE_TRACE
+	bool "Build Mali KUTF Clock rate trace test module"
+	depends on MALI_KUTF
+	default y
+	help
+	  This option will build the clock rate trace portal test module.
+	  It can test the clocks integration into the platform and exercise some
+	  basic trace test in the system.
+
+	  Modules:
+	    - mali_kutf_clk_rate_trace_test_portal.ko
+
+
+comment "Enable MALI_BIFROST_DEBUG for KUTF modules support"
+	depends on MALI_BIFROST && !MALI_BIFROST_DEBUG && MALI_KUTF
diff --git a/drivers/gpu/arm/bifrost/tests/Mconfig b/drivers/gpu/arm/bifrost/tests/Mconfig
index e9313ef14fd1..f5fdeffe9b3c 100644
--- a/drivers/gpu/arm/bifrost/tests/Mconfig
+++ b/drivers/gpu/arm/bifrost/tests/Mconfig
@@ -1,4 +1,4 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
 # (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
 #
@@ -18,32 +18,44 @@
 #
 #
 
+menuconfig MALI_KUTF
+	bool "Build Mali Kernel Unit Test Framework modules"
+	depends on MALI_BIFROST && MALI_BIFROST_DEBUG
+	default y if BACKEND_KERNEL && MALI_BIFROST_DEBUG
+	help
+	  This option will build the Mali testing framework modules.
+
+	  Modules:
+	   - kutf.ko
+	   - kutf_test.ko
+
+config MALI_KUTF_IRQ_TEST
+	bool "Build Mali KUTF IRQ test module"
+	depends on MALI_KUTF
+	default y
+	help
+	  This option will build the IRQ latency measurement test module.
+	  It can determine the latency of the Mali GPU IRQ on your system.
+
+	  Modules:
+	    - mali_kutf_irq_test.ko
+
+config MALI_KUTF_CLK_RATE_TRACE
+	bool "Build Mali KUTF Clock rate trace test module"
+	depends on MALI_KUTF
+	default y
+	help
+	  This option will build the clock rate trace portal test module.
+	  It can test the clocks integration into the platform and exercise some
+	  basic trace test in the system.
+
+	  Modules:
+	    - mali_kutf_clk_rate_trace_test_portal.ko
+
+
+# Enable MALI_BIFROST_DEBUG for KUTF modules support
+
 config UNIT_TEST_KERNEL_MODULES
-	bool
-	default y if UNIT_TEST_CODE && BACKEND_KERNEL
-	default n
-
-config BUILD_IPA_TESTS
-	bool
-	default y if UNIT_TEST_KERNEL_MODULES && MALI_BIFROST_DEVFREQ
-	default n
-
-config BUILD_IPA_UNIT_TESTS
-	bool
-	default y if NO_MALI && BUILD_IPA_TESTS
-	default n
-
-config BUILD_CSF_TESTS
-	bool
-	default y if UNIT_TEST_KERNEL_MODULES && GPU_HAS_CSF
-	default n
-
-config BUILD_ARBIF_TESTS
-	bool
-	default y if UNIT_TEST_CODE && MALI_ARBITER_SUPPORT
-	default n
-
-config BUILD_ARBIF_KERNEL_TESTS
-	bool
-	default y if BUILD_KERNEL_MODULES && BUILD_ARBIF_TESTS
-	default n
+       bool
+       default y if UNIT_TEST_CODE && BACKEND_KERNEL
+       default n
diff --git a/drivers/gpu/arm/bifrost/tests/build.bp b/drivers/gpu/arm/bifrost/tests/build.bp
new file mode 100644
index 000000000000..9d6137d17d5f
--- /dev/null
+++ b/drivers/gpu/arm/bifrost/tests/build.bp
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+/*
+ *
+ * (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+bob_defaults {
+    name: "kernel_test_includes",
+    local_include_dirs: [
+        "include",
+        "./../../",
+        "./../",
+        "./"
+    ],
+}
+
+bob_defaults {
+    name: "kernel_test_configs",
+    mali_kutf: {
+        kbuild_options: ["CONFIG_MALI_KUTF=y"],
+    },
+    unit_test_kernel_modules: {
+        kbuild_options: ["CONFIG_UNIT_TEST_KERNEL_MODULES=y"],
+    },
+}
diff --git a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_helpers.h b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_helpers.h
index 3b8613a06f68..c4c713c838cf 100644
--- a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_helpers.h
+++ b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_helpers.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_helpers_user.h b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_helpers_user.h
index 49aad2921327..e147cbb90154 100644
--- a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_helpers_user.h
+++ b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_helpers_user.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_mem.h b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_mem.h
index 47c4beacf12f..5d4d96ef39b1 100644
--- a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_mem.h
+++ b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_mem.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2014, 2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_resultset.h b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_resultset.h
index 1f2dcfab49ec..2fb1a47a59b4 100644
--- a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_resultset.h
+++ b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_resultset.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2014, 2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_suite.h b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_suite.h
index 426e435a2c67..b9c333be8f63 100644
--- a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_suite.h
+++ b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_suite.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2014, 2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_utils.h b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_utils.h
index e5e2f02621df..18dcc3dc25f9 100644
--- a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_utils.h
+++ b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_utils.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2014, 2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/tests/kutf/Kbuild b/drivers/gpu/arm/bifrost/tests/kutf/Kbuild
index bd6540c5006e..c4790bc66c23 100644
--- a/drivers/gpu/arm/bifrost/tests/kutf/Kbuild
+++ b/drivers/gpu/arm/bifrost/tests/kutf/Kbuild
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2017, 2020-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
@@ -18,8 +18,14 @@
 #
 #
 
-ccflags-y += -I$(src)/../include
+ifeq ($(CONFIG_MALI_KUTF),y)
+obj-m += kutf.o
 
-obj-$(CONFIG_MALI_KUTF) += kutf.o
-
-kutf-y := kutf_mem.o kutf_resultset.o kutf_suite.o kutf_utils.o kutf_helpers.o kutf_helpers_user.o
+kutf-y := \
+    kutf_mem.o \
+    kutf_resultset.o \
+    kutf_suite.o \
+    kutf_utils.o \
+    kutf_helpers.o \
+    kutf_helpers_user.o
+endif
diff --git a/drivers/gpu/arm/bifrost/tests/kutf/build.bp b/drivers/gpu/arm/bifrost/tests/kutf/build.bp
index 707a0531b3b9..89edae9c5e6f 100644
--- a/drivers/gpu/arm/bifrost/tests/kutf/build.bp
+++ b/drivers/gpu/arm/bifrost/tests/kutf/build.bp
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -22,8 +22,9 @@
 bob_kernel_module {
     name: "kutf",
     defaults: [
-        "kernel_defaults",
-        "kutf_includes",
+        "mali_kbase_shared_config_defaults",
+        "kernel_test_configs",
+        "kernel_test_includes",
     ],
     srcs: [
         "Kbuild",
@@ -34,9 +35,8 @@ bob_kernel_module {
         "kutf_suite.c",
         "kutf_utils.c",
     ],
-    kbuild_options: ["CONFIG_MALI_KUTF=m"],
     enabled: false,
-    base_build_kutf: {
+    mali_kutf: {
         enabled: true,
     },
 }
diff --git a/drivers/gpu/arm/bifrost/tests/kutf/kutf_helpers.c b/drivers/gpu/arm/bifrost/tests/kutf/kutf_helpers.c
index 13923fa3121f..c07542819a01 100644
--- a/drivers/gpu/arm/bifrost/tests/kutf/kutf_helpers.c
+++ b/drivers/gpu/arm/bifrost/tests/kutf/kutf_helpers.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/tests/kutf/kutf_helpers_user.c b/drivers/gpu/arm/bifrost/tests/kutf/kutf_helpers_user.c
index 84c63be0bed7..a8b59f71c992 100644
--- a/drivers/gpu/arm/bifrost/tests/kutf/kutf_helpers_user.c
+++ b/drivers/gpu/arm/bifrost/tests/kutf/kutf_helpers_user.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/tests/kutf/kutf_mem.c b/drivers/gpu/arm/bifrost/tests/kutf/kutf_mem.c
index b005b683474c..716970abb8c4 100644
--- a/drivers/gpu/arm/bifrost/tests/kutf/kutf_mem.c
+++ b/drivers/gpu/arm/bifrost/tests/kutf/kutf_mem.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2014, 2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/tests/kutf/kutf_resultset.c b/drivers/gpu/arm/bifrost/tests/kutf/kutf_resultset.c
index 1eea08c38a85..c7572bde67ae 100644
--- a/drivers/gpu/arm/bifrost/tests/kutf/kutf_resultset.c
+++ b/drivers/gpu/arm/bifrost/tests/kutf/kutf_resultset.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2014, 2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/tests/kutf/kutf_suite.c b/drivers/gpu/arm/bifrost/tests/kutf/kutf_suite.c
index 4b1dde455e8e..67452995c1fd 100644
--- a/drivers/gpu/arm/bifrost/tests/kutf/kutf_suite.c
+++ b/drivers/gpu/arm/bifrost/tests/kutf/kutf_suite.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2014, 2017-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2017-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -1158,7 +1158,7 @@ void kutf_test_abort(struct kutf_context *context)
 }
 EXPORT_SYMBOL(kutf_test_abort);
 
-#ifdef CONFIG_DEBUG_FS
+#if IS_ENABLED(CONFIG_DEBUG_FS)
 
 /**
  * init_kutf_core() - Module entry point.
diff --git a/drivers/gpu/arm/bifrost/tests/kutf/kutf_utils.c b/drivers/gpu/arm/bifrost/tests/kutf/kutf_utils.c
index f0dad1f68ffb..c0fb3ba4c10f 100644
--- a/drivers/gpu/arm/bifrost/tests/kutf/kutf_utils.c
+++ b/drivers/gpu/arm/bifrost/tests/kutf/kutf_utils.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2014, 2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Kbuild b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Kbuild
index 00b2a41607e1..027bc27c9d3c 100644
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Kbuild
+++ b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Kbuild
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
@@ -18,8 +18,8 @@
 #
 #
 
-ccflags-y += -I$(src)/../include -I$(src)/../../../ -I$(src)/../../ -I$(src)/../../backend/gpu -I$(srctree)/drivers/staging/android
-
-obj-$(CONFIG_MALI_CLK_RATE_TRACE_PORTAL) += mali_kutf_clk_rate_trace_test_portal.o
+ifeq ($(CONFIG_MALI_KUTF_CLK_RATE_TRACE),y)
+obj-m += mali_kutf_clk_rate_trace_test_portal.o
 
 mali_kutf_clk_rate_trace_test_portal-y := mali_kutf_clk_rate_trace_test.o
+endif
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Kconfig b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Kconfig
deleted file mode 100644
index 17081ba0f6cf..000000000000
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Kconfig
+++ /dev/null
@@ -1,29 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-#
-# (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU license.
-#
-# 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.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, you can access it online at
-# http://www.gnu.org/licenses/gpl-2.0.html.
-#
-#
-
-config CONFIG_MALI_CLK_RATE_TRACE_PORTAL
- tristate "Mali GPU Clock Trace Test portal"
- depends on MALI_BIFROST && MALI_BIFROST_DEBUG && MALI_KUTF
- default m
- help
-   This option will build a test module mali_kutf_clk_rate_trace_test_portal
-   that can test the clocks integration into the platform and exercise some
-   basic trace test in the system. Choosing M here will generate a single
-   module called mali_kutf_clk_rate_trace_test_portal.
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Makefile b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Makefile
deleted file mode 100644
index 950acd89b267..000000000000
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Makefile
+++ /dev/null
@@ -1,56 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-#
-# (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU license.
-#
-# 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.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, you can access it online at
-# http://www.gnu.org/licenses/gpl-2.0.html.
-#
-#
-
-ifneq ($(KERNELRELEASE),)
-
-ccflags-y := \
-	-DMALI_UNIT_TEST=$(MALI_UNIT_TEST) \
-	-DMALI_CUSTOMER_RELEASE=$(MALI_CUSTOMER_RELEASE) \
-	-I$(src)/../../include \
-	-I$(src)/../../../../../../../include \
-	-I$(src)/../../../../ \
-	-I$(src)/../../../ \
-	-I$(src)/../../../backend/gpu \
-	-I$(src)/../../../debug \
-	-I$(src)/../../../debug/backend \
-	-I$(src)/ \
-	-I$(srctree)/drivers/staging/android \
-	-I$(srctree)/include/linux
-
-obj-m := mali_kutf_clk_rate_trace_test_portal.o
-mali_kutf_clk_rate_trace_test_portal-y := mali_kutf_clk_rate_trace_test.o
-
-else
-# linux build system bootstrap for out-of-tree module
-
-# default to building for the host
-ARCH ?= $(shell uname -m)
-
-ifeq ($(KDIR),)
-$(error Must specify KDIR to point to the kernel to target))
-endif
-
-all:
-	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) KBUILD_EXTRA_SYMBOLS="$(CURDIR)/../../kutf/Module.symvers $(CURDIR)/../../../Module.symvers" modules
-
-clean:
-	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) clean
-
-endif
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/build.bp b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/build.bp
index c16b3dea0918..225ad69c5042 100644
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/build.bp
+++ b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/build.bp
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -23,20 +23,21 @@ bob_kernel_module {
     name: "mali_kutf_clk_rate_trace_test_portal",
     defaults: [
         "mali_kbase_shared_config_defaults",
+        "kernel_test_configs",
         "kernel_test_includes",
     ],
     srcs: [
-        "../mali_kutf_clk_rate_trace_test.h",
-        "Makefile",
+        "Kbuild",
         "mali_kutf_clk_rate_trace_test.c",
+        "../mali_kutf_clk_rate_trace_test.h",
     ],
     extra_symbols: [
         "mali_kbase",
         "kutf",
     ],
     enabled: false,
-    base_build_kutf: {
+    mali_kutf_clk_rate_trace: {
+        kbuild_options: ["CONFIG_MALI_KUTF_CLK_RATE_TRACE=y"],
         enabled: true,
-        kbuild_options: ["CONFIG_MALI_CLK_RATE_TRACE_PORTAL=m"],
     },
 }
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/mali_kutf_clk_rate_trace_test.c b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/mali_kutf_clk_rate_trace_test.c
index bd091fa6bc8f..f9410a5d342a 100644
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/mali_kutf_clk_rate_trace_test.c
+++ b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/mali_kutf_clk_rate_trace_test.c
@@ -1,7 +1,7 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -32,9 +32,9 @@
 #include <linux/sched.h>
 #endif
 #include "mali_kbase.h"
-#include "mali_kbase_irq_internal.h"
-#include "mali_kbase_pm_internal.h"
-#include "mali_kbase_clk_rate_trace_mgr.h"
+#include "backend/gpu/mali_kbase_irq_internal.h"
+#include "backend/gpu/mali_kbase_pm_internal.h"
+#include "backend/gpu/mali_kbase_clk_rate_trace_mgr.h"
 
 #include <kutf/kutf_suite.h>
 #include <kutf/kutf_utils.h>
@@ -114,14 +114,15 @@ struct kbasep_cmd_name_pair {
 };
 
 struct kbasep_cmd_name_pair kbasep_portal_cmd_name_map[] = {
-			{PORTAL_CMD_GET_CLK_RATE_MGR, GET_CLK_RATE_MGR},
-			{PORTAL_CMD_GET_CLK_RATE_TRACE, GET_CLK_RATE_TRACE},
-			{PORTAL_CMD_GET_TRACE_SNAPSHOT, GET_TRACE_SNAPSHOT},
-			{PORTAL_CMD_INC_PM_CTX_CNT, INC_PM_CTX_CNT},
-			{PORTAL_CMD_DEC_PM_CTX_CNT, DEC_PM_CTX_CNT},
-			{PORTAL_CMD_CLOSE_PORTAL, CLOSE_PORTAL},
-			{PORTAL_CMD_INVOKE_NOTIFY_42KHZ, INVOKE_NOTIFY_42KHZ},
-		};
+	{ PORTAL_CMD_GET_PLATFORM, GET_PLATFORM },
+	{ PORTAL_CMD_GET_CLK_RATE_MGR, GET_CLK_RATE_MGR },
+	{ PORTAL_CMD_GET_CLK_RATE_TRACE, GET_CLK_RATE_TRACE },
+	{ PORTAL_CMD_GET_TRACE_SNAPSHOT, GET_TRACE_SNAPSHOT },
+	{ PORTAL_CMD_INC_PM_CTX_CNT, INC_PM_CTX_CNT },
+	{ PORTAL_CMD_DEC_PM_CTX_CNT, DEC_PM_CTX_CNT },
+	{ PORTAL_CMD_CLOSE_PORTAL, CLOSE_PORTAL },
+	{ PORTAL_CMD_INVOKE_NOTIFY_42KHZ, INVOKE_NOTIFY_42KHZ },
+};
 
 /* Global pointer for the kutf_portal_trace_write() to use. When
  * this pointer is engaged, new requests for create fixture will fail
@@ -137,8 +138,16 @@ static void kutf_portal_trace_write(
 	u32 index, u32 new_rate)
 {
 	struct clk_trace_snapshot *snapshot;
-	struct kutf_clk_rate_trace_fixture_data *data = container_of(
-		listener, struct kutf_clk_rate_trace_fixture_data, listener);
+	struct kutf_clk_rate_trace_fixture_data *data;
+
+	if (listener == NULL) {
+		pr_err("%s - index: %u, new_rate: %u, listener is NULL\n",
+			__func__, index, new_rate);
+		return;
+	}
+
+	data = container_of(listener, struct kutf_clk_rate_trace_fixture_data,
+		       listener);
 
 	lockdep_assert_held(&data->kbdev->pm.clk_rtm.lock);
 
@@ -180,11 +189,10 @@ static void kutf_set_pm_ctx_idle(struct kutf_context *context)
 
 	if (WARN_ON(data->pm_ctx_cnt > 0))
 		return;
-
-	kbase_pm_context_idle(data->kbdev);
 #if !MALI_USE_CSF
 	kbase_pm_release_gpu_cycle_counter(data->kbdev);
 #endif
+	kbase_pm_context_idle(data->kbdev);
 }
 
 static char const *kutf_clk_trace_do_change_pm_ctx(struct kutf_context *context,
@@ -408,6 +416,63 @@ static char const *kutf_clk_trace_do_close_portal(struct kutf_context *context,
 	return errmsg;
 }
 
+/**
+ * kutf_clk_trace_do_get_platform() - Gets platform information
+ * @context:  KUTF context
+ * @cmd:      The decoded portal input request
+ *
+ * Checks the gpu node in the device tree to see if arbitration is enabled
+ * If so determines device tree whether platform is PV or PTM
+ *
+ * Return: A string to indicate the platform (PV/PTM/GPU/UNKNOWN)
+ */
+static char const *kutf_clk_trace_do_get_platform(
+	struct kutf_context *context,
+	struct clk_trace_portal_input *cmd)
+{
+	int seq = cmd->cmd_input.u.val_u64 & 0xFF;
+	char const *errmsg = NULL;
+	const void *arbiter_if_node = NULL;
+	const void *power_node = NULL;
+	const char *platform = "GPU";
+#if defined(CONFIG_MALI_ARBITER_SUPPORT) && defined(CONFIG_OF)
+	struct kutf_clk_rate_trace_fixture_data *data = context->fixture;
+
+	arbiter_if_node =
+		of_get_property(data->kbdev->dev->of_node, "arbiter_if", NULL);
+#endif
+	if (arbiter_if_node) {
+		power_node = of_find_compatible_node(NULL, NULL,
+						     "arm,mali-gpu-power");
+		if (power_node) {
+			platform = "PV";
+		} else {
+			power_node = of_find_compatible_node(NULL, NULL,
+							     "arm,mali-ptm");
+			if (power_node)
+				platform = "PTM";
+			else
+				platform = "UNKNOWN";
+		}
+	} else {
+		platform = "GPU";
+	}
+
+	pr_debug("%s - platform is %s\n", __func__, platform);
+	snprintf(portal_msg_buf, PORTAL_MSG_LEN,
+			  "{SEQ:%d, PLATFORM:%s}", seq, platform);
+
+	WARN_ON(cmd->portal_cmd != PORTAL_CMD_GET_PLATFORM);
+
+	if (kutf_helper_send_named_str(context, "ACK", portal_msg_buf)) {
+		pr_warn("Error in sending ack for " CLOSE_PORTAL "reuquest\n");
+		errmsg = kutf_dsprintf(&context->fixture_pool,
+			"Error in sending ack for " GET_PLATFORM "request");
+	}
+
+	return errmsg;
+}
+
 static bool kutf_clk_trace_dequeue_portal_cmd(struct kutf_context *context,
 				struct clk_trace_portal_input *cmd)
 {
@@ -461,6 +526,9 @@ static bool kutf_clk_trace_process_portal_cmd(struct kutf_context *context,
 	WARN_ON(cmd->portal_cmd == PORTAL_CMD_INVALID);
 
 	switch (cmd->portal_cmd) {
+	case PORTAL_CMD_GET_PLATFORM:
+		errmsg = kutf_clk_trace_do_get_platform(context, cmd);
+		break;
 	case PORTAL_CMD_GET_CLK_RATE_MGR:
 		/* Fall through */
 	case PORTAL_CMD_GET_CLK_RATE_TRACE:
@@ -613,7 +681,7 @@ void kutf_clk_trace_barebone_check(struct kutf_context *context)
 		kutf_clk_trace_flag_result(context, KUTF_RESULT_FAIL, msg);
 	else if (!data->total_update_cnt) {
 		msg = kutf_dsprintf(&context->fixture_pool,
-				"No trace update seen during the test!");
+				    "No trace update seen during the test!");
 		kutf_clk_trace_flag_result(context, KUTF_RESULT_WARN, msg);
 	}
 }
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/mali_kutf_clk_rate_trace_test.h b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/mali_kutf_clk_rate_trace_test.h
index 600b025795df..f37efa8bd376 100644
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/mali_kutf_clk_rate_trace_test.h
+++ b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/mali_kutf_clk_rate_trace_test.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -30,6 +30,8 @@
  * enum kbasep_clk_rate_trace_req - request command to the clock rate trace
  *                                  service portal.
  *
+ * @PORTAL_CMD_GET_PLATFORM:       Request the platform that the tests are
+ *                                 to be run on.
  * @PORTAL_CMD_GET_CLK_RATE_MGR:   Request the clock trace manager internal
  *                                 data record. On a positive acknowledgement
  *                                 the prevailing clock rates and the GPU idle
@@ -73,6 +75,7 @@
  */
 /* PORTAL_CMD_INVALID must be the last one, serving the size */
 enum kbasep_clk_rate_trace_req {
+	PORTAL_CMD_GET_PLATFORM,
 	PORTAL_CMD_GET_CLK_RATE_MGR,
 	PORTAL_CMD_GET_CLK_RATE_TRACE,
 	PORTAL_CMD_GET_TRACE_SNAPSHOT,
@@ -121,6 +124,7 @@ enum kbasep_clk_rate_trace_req {
  *    Note, at the close, PM_CTX_CNT is 1. The PM_CTX_CNT will internally be
  *    dropped down to 0 as part of the portal close clean up.
  */
+#define GET_PLATFORM         "GET_PLATFORM"
 #define GET_CLK_RATE_MGR     "GET_CLK_RATE_MGR"
 #define GET_CLK_RATE_TRACE   "GET_CLK_RATE_TRACE"
 #define GET_TRACE_SNAPSHOT   "GET_TRACE_SNAPSHOT"
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Kbuild b/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Kbuild
index cc38cb84406c..213d6d5ea317 100644
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Kbuild
+++ b/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Kbuild
@@ -1,6 +1,6 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 #
-# (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2017, 2020-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
@@ -18,8 +18,8 @@
 #
 #
 
-ccflags-y += -I$(src)/../include -I$(src)/../../../ -I$(src)/../../ -I$(src)/../../backend/gpu -I$(srctree)/drivers/staging/android
-
-obj-$(CONFIG_MALI_IRQ_LATENCY) += mali_kutf_irq_test.o
+ifeq ($(CONFIG_MALI_KUTF_IRQ_TEST),y)
+obj-m += mali_kutf_irq_test.o
 
 mali_kutf_irq_test-y := mali_kutf_irq_test_main.o
+endif
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Kconfig b/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Kconfig
deleted file mode 100644
index 90f4ec0a7c7f..000000000000
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Kconfig
+++ /dev/null
@@ -1,28 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-#
-# (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU license.
-#
-# 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.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, you can access it online at
-# http://www.gnu.org/licenses/gpl-2.0.html.
-#
-#
-
-config MALI_IRQ_LATENCY
- tristate "Mali GPU IRQ latency measurement"
- depends on MALI_BIFROST && MALI_BIFROST_DEBUG && MALI_KUTF
- default m
- help
-   This option will build a test module mali_kutf_irq_test that
-   can determine the latency of the Mali GPU IRQ on your system.
-   Choosing M here will generate a single module called mali_kutf_irq_test.
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Makefile b/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Makefile
deleted file mode 100644
index cbec0d3ce8ca..000000000000
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Makefile
+++ /dev/null
@@ -1,50 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-#
-# (C) COPYRIGHT 2015, 2017-2018, 2020 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU license.
-#
-# 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.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, you can access it online at
-# http://www.gnu.org/licenses/gpl-2.0.html.
-#
-#
-
-# linux build system bootstrap for out-of-tree module
-
-# default to building for the host
-ARCH ?= $(shell uname -m)
-
-ifeq ($(KDIR),)
-$(error Must specify KDIR to point to the kernel to target))
-endif
-
-TEST_CCFLAGS := \
-	-DMALI_UNIT_TEST=$(MALI_UNIT_TEST) \
-	-DMALI_CUSTOMER_RELEASE=$(MALI_CUSTOMER_RELEASE) \
-	-DMALI_USE_CSF=$(MALI_USE_CSF) \
-	$(SCONS_CFLAGS) \
-	-I$(CURDIR)/../include \
-	-I$(CURDIR)/../../../../../../include \
-	-I$(CURDIR)/../../../ \
-	-I$(CURDIR)/../../ \
-	-I$(CURDIR)/../../backend/gpu \
-	-I$(CURDIR)/../../debug \
-	-I$(CURDIR)/../../debug/backend \
-	-I$(CURDIR)/ \
-	-I$(srctree)/drivers/staging/android \
-	-I$(srctree)/include/linux
-
-all:
-	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) $(SCONS_CONFIGS) EXTRA_CFLAGS="$(TEST_CCFLAGS)" KBUILD_EXTRA_SYMBOLS="$(CURDIR)/../kutf/Module.symvers $(CURDIR)/../../Module.symvers" modules
-
-clean:
-	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) clean
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/build.bp b/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/build.bp
index 58021c80188c..155875b9d5cc 100644
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/build.bp
+++ b/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/build.bp
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -23,6 +23,7 @@ bob_kernel_module {
     name: "mali_kutf_irq_test",
     defaults: [
         "mali_kbase_shared_config_defaults",
+        "kernel_test_configs",
         "kernel_test_includes",
     ],
     srcs: [
@@ -34,8 +35,8 @@ bob_kernel_module {
         "kutf",
     ],
     enabled: false,
-    base_build_kutf: {
+    mali_kutf_irq_test: {
+        kbuild_options: ["CONFIG_MALI_KUTF_IRQ_TEST=y"],
         enabled: true,
-        kbuild_options: ["CONFIG_MALI_IRQ_LATENCY=m"],
     },
 }
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/mali_kutf_irq_test_main.c b/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/mali_kutf_irq_test_main.c
index e9f276ec4f92..fdc543790a4f 100644
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/mali_kutf_irq_test_main.c
+++ b/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/mali_kutf_irq_test_main.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2016-2018, 2020-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/Makefile.kbase b/drivers/gpu/arm/bifrost/thirdparty/Kbuild
similarity index 82%
rename from drivers/gpu/arm/bifrost/Makefile.kbase
rename to drivers/gpu/arm/bifrost/thirdparty/Kbuild
index 6d97f197670b..558be077d483 100644
--- a/drivers/gpu/arm/bifrost/Makefile.kbase
+++ b/drivers/gpu/arm/bifrost/thirdparty/Kbuild
@@ -1,6 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2010, 2013, 2018-2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
@@ -18,4 +18,4 @@
 #
 #
 
-EXTRA_CFLAGS += -I$(ROOT) -I$(KBASE_PATH) -I$(KBASE_PATH)/platform_$(PLATFORM)
+bifrost_kbase-y += thirdparty/mali_kbase_mmap.o
diff --git a/drivers/gpu/arm/bifrost/thirdparty/mali_kbase_mmap.c b/drivers/gpu/arm/bifrost/thirdparty/mali_kbase_mmap.c
index a3b4a74ba94a..de1199a76b19 100644
--- a/drivers/gpu/arm/bifrost/thirdparty/mali_kbase_mmap.c
+++ b/drivers/gpu/arm/bifrost/thirdparty/mali_kbase_mmap.c
@@ -10,7 +10,7 @@
  */
 
 #include "linux/mman.h"
-#include "../mali_kbase.h"
+#include <mali_kbase.h>
 
 /* mali_kbase_mmap.c
  *
@@ -275,7 +275,7 @@ unsigned long kbase_context_get_unmapped_area(struct kbase_context *const kctx,
 	if ((flags & MAP_FIXED) || addr)
 		return -EINVAL;
 
-#ifdef CONFIG_64BIT
+#if IS_ENABLED(CONFIG_64BIT)
 	/* too big? */
 	if (len > TASK_SIZE - SZ_2M)
 		return -ENOMEM;
diff --git a/drivers/gpu/arm/bifrost/tl/Kbuild b/drivers/gpu/arm/bifrost/tl/Kbuild
new file mode 100644
index 000000000000..6e472dff8a78
--- /dev/null
+++ b/drivers/gpu/arm/bifrost/tl/Kbuild
@@ -0,0 +1,32 @@
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+#
+# (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
+#
+# This program is free software and is provided to you under the terms of the
+# GNU General Public License version 2 as published by the Free Software
+# Foundation, and any use by you of this program is subject to the terms
+# of such GNU license.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can access it online at
+# http://www.gnu.org/licenses/gpl-2.0.html.
+#
+#
+
+bifrost_kbase-y += \
+    tl/mali_kbase_timeline.o \
+    tl/mali_kbase_timeline_io.o \
+    tl/mali_kbase_tlstream.o \
+    tl/mali_kbase_tracepoints.o
+
+
+ifeq ($(CONFIG_MALI_CSF_SUPPORT),y)
+    bifrost_kbase-y += tl/backend/mali_kbase_timeline_csf.o
+else
+    bifrost_kbase-y += tl/backend/mali_kbase_timeline_jm.o
+endif
diff --git a/drivers/gpu/arm/bifrost/tl/backend/mali_kbase_timeline_csf.c b/drivers/gpu/arm/bifrost/tl/backend/mali_kbase_timeline_csf.c
index 7455ce28843d..a2868daea18a 100644
--- a/drivers/gpu/arm/bifrost/tl/backend/mali_kbase_timeline_csf.c
+++ b/drivers/gpu/arm/bifrost/tl/backend/mali_kbase_timeline_csf.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -19,9 +19,9 @@
  *
  */
 
-#include "../mali_kbase_tracepoints.h"
-#include "../mali_kbase_timeline.h"
-#include "../mali_kbase_timeline_priv.h"
+#include <tl/mali_kbase_tracepoints.h>
+#include <tl/mali_kbase_timeline.h>
+#include <tl/mali_kbase_timeline_priv.h>
 
 #include <mali_kbase.h>
 
diff --git a/drivers/gpu/arm/bifrost/tl/backend/mali_kbase_timeline_jm.c b/drivers/gpu/arm/bifrost/tl/backend/mali_kbase_timeline_jm.c
index 6659d2dc2eb0..9ba89f59f03b 100644
--- a/drivers/gpu/arm/bifrost/tl/backend/mali_kbase_timeline_jm.c
+++ b/drivers/gpu/arm/bifrost/tl/backend/mali_kbase_timeline_jm.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
@@ -19,9 +19,9 @@
  *
  */
 
-#include "../mali_kbase_tracepoints.h"
-#include "../mali_kbase_timeline.h"
-#include "../mali_kbase_timeline_priv.h"
+#include <tl/mali_kbase_tracepoints.h>
+#include <tl/mali_kbase_timeline.h>
+#include <tl/mali_kbase_timeline_priv.h>
 
 #include <mali_kbase.h>
 
diff --git a/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline.c b/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline.c
index 3370343f8020..dfafbccecfed 100644
--- a/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline.c
+++ b/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2015-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline.h b/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline.h
index 04653521285d..63926ebc63a5 100644
--- a/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline.h
+++ b/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2015-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline_io.c b/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline_io.c
index e3b6fbc1eaeb..eff30a07c17d 100644
--- a/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline_io.c
+++ b/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline_io.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline_priv.h b/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline_priv.h
index 8a58a13a78ea..bf2c3855434a 100644
--- a/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline_priv.h
+++ b/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline_priv.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/tl/mali_kbase_tl_serialize.h b/drivers/gpu/arm/bifrost/tl/mali_kbase_tl_serialize.h
index f8cad4a6f8f8..30d120d7599f 100644
--- a/drivers/gpu/arm/bifrost/tl/mali_kbase_tl_serialize.h
+++ b/drivers/gpu/arm/bifrost/tl/mali_kbase_tl_serialize.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/drivers/gpu/arm/bifrost/tl/mali_kbase_tlstream.c b/drivers/gpu/arm/bifrost/tl/mali_kbase_tlstream.c
index 202c12f57572..0275bad60410 100644
--- a/drivers/gpu/arm/bifrost/tl/mali_kbase_tlstream.c
+++ b/drivers/gpu/arm/bifrost/tl/mali_kbase_tlstream.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2015-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/tl/mali_kbase_tlstream.h b/drivers/gpu/arm/bifrost/tl/mali_kbase_tlstream.h
index 2d3bbc8ccac9..6660cf5bc276 100644
--- a/drivers/gpu/arm/bifrost/tl/mali_kbase_tlstream.h
+++ b/drivers/gpu/arm/bifrost/tl/mali_kbase_tlstream.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2015-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/tl/mali_kbase_tracepoints.c b/drivers/gpu/arm/bifrost/tl/mali_kbase_tracepoints.c
index ece23b318b31..2c0de0196f44 100644
--- a/drivers/gpu/arm/bifrost/tl/mali_kbase_tracepoints.c
+++ b/drivers/gpu/arm/bifrost/tl/mali_kbase_tracepoints.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0
+// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
 /*
  *
  * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
diff --git a/drivers/gpu/arm/bifrost/tl/mali_kbase_tracepoints.h b/drivers/gpu/arm/bifrost/tl/mali_kbase_tracepoints.h
index 7a8164b06291..05dce2064bd0 100644
--- a/drivers/gpu/arm/bifrost/tl/mali_kbase_tracepoints.h
+++ b/drivers/gpu/arm/bifrost/tl/mali_kbase_tracepoints.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
@@ -1932,7 +1932,7 @@ struct kbase_tlstream;
  *
  * @kbdev: Kbase device
  * @kcpu_queue: KCPU queue
- * @cqs_obj_gpu_addr: CQS Object GPU ptr
+ * @cqs_obj_gpu_addr: CQS Object GPU pointer
  * @cqs_obj_compare_value: Semaphore value that should be exceeded
  * for the WAIT to pass
  * @cqs_obj_inherit_error: Indicates the error state should be inherited into the queue or not
@@ -1969,7 +1969,7 @@ struct kbase_tlstream;
  *
  * @kbdev: Kbase device
  * @kcpu_queue: KCPU queue
- * @cqs_obj_gpu_addr: CQS Object GPU ptr
+ * @cqs_obj_gpu_addr: CQS Object GPU pointer
  */
 #if MALI_USE_CSF
 #define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_ENQUEUE_CQS_SET(	\
@@ -1999,7 +1999,7 @@ struct kbase_tlstream;
  *
  * @kbdev: Kbase device
  * @kcpu_queue: KCPU queue
- * @map_import_buf_gpu_addr: Map import buffer GPU ptr
+ * @map_import_buf_gpu_addr: Map import buffer GPU pointer
  */
 #if MALI_USE_CSF
 #define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_ENQUEUE_MAP_IMPORT(	\
@@ -2029,7 +2029,7 @@ struct kbase_tlstream;
  *
  * @kbdev: Kbase device
  * @kcpu_queue: KCPU queue
- * @map_import_buf_gpu_addr: Map import buffer GPU ptr
+ * @map_import_buf_gpu_addr: Map import buffer GPU pointer
  */
 #if MALI_USE_CSF
 #define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_ENQUEUE_UNMAP_IMPORT(	\
@@ -2059,7 +2059,7 @@ struct kbase_tlstream;
  *
  * @kbdev: Kbase device
  * @kcpu_queue: KCPU queue
- * @map_import_buf_gpu_addr: Map import buffer GPU ptr
+ * @map_import_buf_gpu_addr: Map import buffer GPU pointer
  */
 #if MALI_USE_CSF
 #define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_ENQUEUE_UNMAP_IMPORT_FORCE(	\
diff --git a/include/linux/dma-buf-test-exporter.h b/include/linux/dma-buf-test-exporter.h
new file mode 100644
index 000000000000..5a310f6270cc
--- /dev/null
+++ b/include/linux/dma-buf-test-exporter.h
@@ -0,0 +1,81 @@
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
+/*
+ *
+ * (C) COPYRIGHT 2012-2013, 2017, 2020-2021 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+#ifndef _LINUX_DMA_BUF_TEST_EXPORTER_H_
+#define _LINUX_DMA_BUF_TEST_EXPORTER_H_
+
+#include <linux/types.h>
+#include <linux/ioctl.h>
+
+#define DMA_BUF_TE_VER_MAJOR 1
+#define DMA_BUF_TE_VER_MINOR 0
+#define DMA_BUF_TE_ENQ 0x642d7465
+#define DMA_BUF_TE_ACK 0x68692100
+
+struct dma_buf_te_ioctl_version
+{
+	int op;    /**< Must be set to DMA_BUF_TE_ENQ by client, driver will set it to DMA_BUF_TE_ACK */
+	int major; /**< Major version */
+	int minor; /**< Minor version */
+};
+
+struct dma_buf_te_ioctl_alloc
+{
+	__u64 size; /* size of buffer to allocate, in pages */
+};
+
+struct dma_buf_te_ioctl_status
+{
+	/* in */
+	int fd; /* the dma_buf to query, only dma_buf objects exported by this driver is supported */
+	/* out */
+	int attached_devices; /* number of devices attached (active 'dma_buf_attach's) */
+	int device_mappings; /* number of device mappings (active 'dma_buf_map_attachment's) */
+	int cpu_mappings;    /* number of cpu mappings (active 'mmap's) */
+};
+
+struct dma_buf_te_ioctl_set_failing
+{
+	/* in */
+	int fd; /* the dma_buf to set failure mode for, only dma_buf objects exported by this driver is supported */
+
+	/* zero = no fail injection, non-zero = inject failure */
+	int fail_attach;
+	int fail_map;
+	int fail_mmap;
+};
+
+struct dma_buf_te_ioctl_fill
+{
+	int fd;
+	unsigned int value;
+};
+
+#define DMA_BUF_TE_IOCTL_BASE 'E'
+/* Below all returning 0 if successful or -errcode except DMA_BUF_TE_ALLOC which will return fd or -errcode */
+#define DMA_BUF_TE_VERSION         _IOR(DMA_BUF_TE_IOCTL_BASE, 0x00, struct dma_buf_te_ioctl_version)
+#define DMA_BUF_TE_ALLOC           _IOR(DMA_BUF_TE_IOCTL_BASE, 0x01, struct dma_buf_te_ioctl_alloc)
+#define DMA_BUF_TE_QUERY           _IOR(DMA_BUF_TE_IOCTL_BASE, 0x02, struct dma_buf_te_ioctl_status)
+#define DMA_BUF_TE_SET_FAILING     _IOW(DMA_BUF_TE_IOCTL_BASE, 0x03, struct dma_buf_te_ioctl_set_failing)
+#define DMA_BUF_TE_ALLOC_CONT      _IOR(DMA_BUF_TE_IOCTL_BASE, 0x04, struct dma_buf_te_ioctl_alloc)
+#define DMA_BUF_TE_FILL            _IOR(DMA_BUF_TE_IOCTL_BASE, 0x05, struct dma_buf_te_ioctl_fill)
+
+#endif /* _LINUX_DMA_BUF_TEST_EXPORTER_H_ */
diff --git a/include/linux/memory_group_manager.h b/include/linux/memory_group_manager.h
index 2045840e1742..c0e808b53b78 100644
--- a/include/linux/memory_group_manager.h
+++ b/include/linux/memory_group_manager.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/include/linux/priority_control_manager.h b/include/linux/priority_control_manager.h
index df3b3cd07a14..002e78b27423 100644
--- a/include/linux/priority_control_manager.h
+++ b/include/linux/priority_control_manager.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
diff --git a/include/linux/protected_memory_allocator.h b/include/linux/protected_memory_allocator.h
index 1ccb403cc0d6..1e05bb8c0207 100644
--- a/include/linux/protected_memory_allocator.h
+++ b/include/linux/protected_memory_allocator.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/include/linux/protected_mode_switcher.h b/include/linux/protected_mode_switcher.h
index d2c7eef764a9..1a3c5f786baa 100644
--- a/include/linux/protected_mode_switcher.h
+++ b/include/linux/protected_mode_switcher.h
@@ -1,7 +1,7 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
- * (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
diff --git a/include/uapi/gpu/arm/bifrost/csf/mali_base_csf_kernel.h b/include/uapi/gpu/arm/bifrost/csf/mali_base_csf_kernel.h
index 7fa874be3c92..72572e5cf319 100644
--- a/include/uapi/gpu/arm/bifrost/csf/mali_base_csf_kernel.h
+++ b/include/uapi/gpu/arm/bifrost/csf/mali_base_csf_kernel.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
diff --git a/include/uapi/gpu/arm/bifrost/csf/mali_gpu_csf_control_registers.h b/include/uapi/gpu/arm/bifrost/csf/mali_gpu_csf_control_registers.h
index 570cba81e4bc..b62a8b0eb76b 100644
--- a/include/uapi/gpu/arm/bifrost/csf/mali_gpu_csf_control_registers.h
+++ b/include/uapi/gpu/arm/bifrost/csf/mali_gpu_csf_control_registers.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
diff --git a/include/uapi/gpu/arm/bifrost/csf/mali_gpu_csf_registers.h b/include/uapi/gpu/arm/bifrost/csf/mali_gpu_csf_registers.h
index f233a0da8f17..06cc4c22de56 100644
--- a/include/uapi/gpu/arm/bifrost/csf/mali_gpu_csf_registers.h
+++ b/include/uapi/gpu/arm/bifrost/csf/mali_gpu_csf_registers.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
@@ -104,6 +104,12 @@
 #define CS_USER_INPUT_HI 0x0034 /* () CS user mode input page address, high word */
 #define CS_USER_OUTPUT_LO 0x0038 /* () CS user mode input page address, low word */
 #define CS_USER_OUTPUT_HI 0x003C /* () CS user mode input page address, high word */
+#define CS_INSTR_CONFIG 0x0040 /* () Instrumentation buffer configuration */
+#define CS_INSTR_BUFFER_SIZE 0x0044 /* () Instrumentation buffer size */
+#define CS_INSTR_BUFFER_BASE_LO 0x0048 /* () Instrumentation buffer base pointer, low word */
+#define CS_INSTR_BUFFER_BASE_HI 0x004C /* () Instrumentation buffer base pointer, high word */
+#define CS_INSTR_BUFFER_OFFSET_POINTER_LO 0x0050 /* () Instrumentation buffer pointer to insert offset, low word */
+#define CS_INSTR_BUFFER_OFFSET_POINTER_HI 0x0054 /* () Instrumentation buffer pointer to insert offset, high word */
 
 /* CS_KERNEL_OUTPUT_BLOCK register offsets */
 #define CS_ACK 0x0000 /* () CS acknowledge flags */
@@ -173,7 +179,8 @@
 #define GLB_GROUP_NUM 0x0010 /* () Number of CSG interfaces */
 #define GLB_GROUP_STRIDE 0x0014 /* () Stride between CSG interfaces */
 #define GLB_PRFCNT_SIZE 0x0018 /* () Size of CSF performance counters */
-#define GLB_INSTR_FEATURES 0x001C /* () TRACE_POINT instrumentation features */
+#define GLB_INSTR_FEATURES                                                     \
+	0x001C /* () TRACE_POINT instrumentation. (csf >= 1.1.0) */
 #define GROUP_CONTROL_0 0x1000 /* () CSG control and capabilities */
 #define GROUP_CONTROL(n) (GROUP_CONTROL_0 + (n)*256)
 #define GROUP_CONTROL_REG(n, r) (GROUP_CONTROL(n) + GROUP_CONTROL_BLOCK_REG(r))
@@ -417,6 +424,57 @@
 #define CS_USER_OUTPUT_POINTER_SET(reg_val, value) \
 	(((reg_val) & ~CS_USER_OUTPUT_POINTER_MASK) |  \
 	 (((value) << CS_USER_OUTPUT_POINTER_SHIFT) & CS_USER_OUTPUT_POINTER_MASK))
+
+/* CS_INSTR_CONFIG register */
+#define CS_INSTR_CONFIG_JASID_SHIFT (0)
+#define CS_INSTR_CONFIG_JASID_MASK ((u32)0xF << CS_INSTR_CONFIG_JASID_SHIFT)
+#define CS_INSTR_CONFIG_JASID_GET(reg_val) (((reg_val)&CS_INSTR_CONFIG_JASID_MASK) >> CS_INSTR_CONFIG_JASID_SHIFT)
+#define CS_INSTR_CONFIG_JASID_SET(reg_val, value) \
+	(((reg_val) & ~CS_INSTR_CONFIG_JASID_MASK) |  \
+	 (((value) << CS_INSTR_CONFIG_JASID_SHIFT) & CS_INSTR_CONFIG_JASID_MASK))
+#define CS_INSTR_CONFIG_EVENT_SIZE_SHIFT (4)
+#define CS_INSTR_CONFIG_EVENT_SIZE_MASK ((u32)0xF << CS_INSTR_CONFIG_EVENT_SIZE_SHIFT)
+#define CS_INSTR_CONFIG_EVENT_SIZE_GET(reg_val) \
+	(((reg_val)&CS_INSTR_CONFIG_EVENT_SIZE_MASK) >> CS_INSTR_CONFIG_EVENT_SIZE_SHIFT)
+#define CS_INSTR_CONFIG_EVENT_SIZE_SET(reg_val, value) \
+	(((reg_val) & ~CS_INSTR_CONFIG_EVENT_SIZE_MASK) |  \
+	 (((value) << CS_INSTR_CONFIG_EVENT_SIZE_SHIFT) & CS_INSTR_CONFIG_EVENT_SIZE_MASK))
+#define CS_INSTR_CONFIG_EVENT_STATE_SHIFT (16)
+#define CS_INSTR_CONFIG_EVENT_STATE_MASK ((u32)0xFF << CS_INSTR_CONFIG_EVENT_STATE_SHIFT)
+#define CS_INSTR_CONFIG_EVENT_STATE_GET(reg_val) \
+	(((reg_val)&CS_INSTR_CONFIG_EVENT_STATE_MASK) >> CS_INSTR_CONFIG_EVENT_STATE_SHIFT)
+#define CS_INSTR_CONFIG_EVENT_STATE_SET(reg_val, value) \
+	(((reg_val) & ~CS_INSTR_CONFIG_EVENT_STATE_MASK) |  \
+	 (((value) << CS_INSTR_CONFIG_EVENT_STATE_SHIFT) & CS_INSTR_CONFIG_EVENT_STATE_MASK))
+
+/* CS_INSTR_BUFFER_SIZE register */
+#define CS_INSTR_BUFFER_SIZE_SIZE_SHIFT (0)
+#define CS_INSTR_BUFFER_SIZE_SIZE_MASK ((u32)0xFFFFFFFF << CS_INSTR_BUFFER_SIZE_SIZE_SHIFT)
+#define CS_INSTR_BUFFER_SIZE_SIZE_GET(reg_val) \
+	(((reg_val)&CS_INSTR_BUFFER_SIZE_SIZE_MASK) >> CS_INSTR_BUFFER_SIZE_SIZE_SHIFT)
+#define CS_INSTR_BUFFER_SIZE_SIZE_SET(reg_val, value) \
+	(((reg_val) & ~CS_INSTR_BUFFER_SIZE_SIZE_MASK) |  \
+	 (((value) << CS_INSTR_BUFFER_SIZE_SIZE_SHIFT) & CS_INSTR_BUFFER_SIZE_SIZE_MASK))
+
+/* CS_INSTR_BUFFER_BASE register */
+#define CS_INSTR_BUFFER_BASE_POINTER_SHIFT (0)
+#define CS_INSTR_BUFFER_BASE_POINTER_MASK ((u64)0xFFFFFFFFFFFFFFFF << CS_INSTR_BUFFER_BASE_POINTER_SHIFT)
+#define CS_INSTR_BUFFER_BASE_POINTER_GET(reg_val) \
+	(((reg_val)&CS_INSTR_BUFFER_BASE_POINTER_MASK) >> CS_INSTR_BUFFER_BASE_POINTER_SHIFT)
+#define CS_INSTR_BUFFER_BASE_POINTER_SET(reg_val, value) \
+	(((reg_val) & ~CS_INSTR_BUFFER_BASE_POINTER_MASK) |  \
+	 (((value) << CS_INSTR_BUFFER_BASE_POINTER_SHIFT) & CS_INSTR_BUFFER_BASE_POINTER_MASK))
+
+/* CS_INSTR_BUFFER_OFFSET_POINTER register */
+#define CS_INSTR_BUFFER_OFFSET_POINTER_POINTER_SHIFT (0)
+#define CS_INSTR_BUFFER_OFFSET_POINTER_POINTER_MASK \
+	((u64)0xFFFFFFFFFFFFFFFF) << CS_INSTR_BUFFER_OFFSET_POINTER_POINTER_SHIFT)
+#define CS_INSTR_BUFFER_OFFSET_POINTER_POINTER_GET(reg_val) \
+	(((reg_val)&CS_INSTR_BUFFER_OFFSET_POINTER_POINTER_MASK) >> CS_INSTR_BUFFER_OFFSET_POINTER_POINTER_SHIFT)
+#define CS_INSTR_BUFFER_OFFSET_POINTER_POINTER_SET(reg_val, value) \
+	(((reg_val) & ~CS_INSTR_BUFFER_OFFSET_POINTER_POINTER_MASK) |  \
+	 (((value) << CS_INSTR_BUFFER_OFFSET_POINTER_POINTER_SHIFT) & CS_INSTR_BUFFER_OFFSET_POINTER_POINTER_MASK))
+
 /* End of CS_KERNEL_INPUT_BLOCK register set definitions */
 
 /* CS_KERNEL_OUTPUT_BLOCK register set definitions */
@@ -1401,6 +1459,22 @@
 #define GLB_IDLE_TIMER_TIMER_SOURCE_GPU_COUNTER 0x1
 /* End of GLB_IDLE_TIMER_TIMER_SOURCE values */
 
+/* GLB_INSTR_FEATURES register */
+#define GLB_INSTR_FEATURES_OFFSET_UPDATE_RATE_SHIFT (0)
+#define GLB_INSTR_FEATURES_OFFSET_UPDATE_RATE_MASK ((u32)0xF << GLB_INSTR_FEATURES_OFFSET_UPDATE_RATE_SHIFT)
+#define GLB_INSTR_FEATURES_OFFSET_UPDATE_RATE_GET(reg_val) \
+	(((reg_val)&GLB_INSTR_FEATURES_OFFSET_UPDATE_RATE_MASK) >> GLB_INSTR_FEATURES_OFFSET_UPDATE_RATE_SHIFT)
+#define GLB_INSTR_FEATURES_OFFSET_UPDATE_RATE_SET(reg_val, value) \
+	(((reg_val) & ~GLB_INSTR_FEATURES_OFFSET_UPDATE_RATE_MASK) |  \
+	 (((value) << GLB_INSTR_FEATURES_OFFSET_UPDATE_RATE_SHIFT) & GLB_INSTR_FEATURES_OFFSET_UPDATE_RATE_MASK))
+#define GLB_INSTR_FEATURES_EVENT_SIZE_MAX_SHIFT (4)
+#define GLB_INSTR_FEATURES_EVENT_SIZE_MAX_MASK ((u32)0xF << GLB_INSTR_FEATURES_EVENT_SIZE_MAX_SHIFT)
+#define GLB_INSTR_FEATURES_EVENT_SIZE_MAX_GET(reg_val) \
+	(((reg_val)&GLB_INSTR_FEATURES_EVENT_SIZE_MAX_MASK) >> GLB_INSTR_FEATURES_EVENT_SIZE_MAX_SHIFT)
+#define GLB_INSTR_FEATURES_EVENT_SIZE_MAX_SET(reg_val, value) \
+	(((reg_val) & ~GLB_INSTR_FEATURES_EVENT_SIZE_MAX_MASK) |  \
+	 (((value) << GLB_INSTR_FEATURES_EVENT_SIZE_MAX_SHIFT) & GLB_INSTR_FEATURES_EVENT_SIZE_MAX_MASK))
+
 #define CSG_STATUS_STATE (0x0018) /* CSG state status register */
 /* CSG_STATUS_STATE register */
 #define CSG_STATUS_STATE_IDLE_SHIFT (0)
diff --git a/include/uapi/gpu/arm/bifrost/csf/mali_kbase_csf_ioctl.h b/include/uapi/gpu/arm/bifrost/csf/mali_kbase_csf_ioctl.h
index 237cc2e98762..d2d7ce23491b 100644
--- a/include/uapi/gpu/arm/bifrost/csf/mali_kbase_csf_ioctl.h
+++ b/include/uapi/gpu/arm/bifrost/csf/mali_kbase_csf_ioctl.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
@@ -40,10 +40,14 @@
  * 1.4:
  * - Replace padding in kbase_ioctl_cs_get_glb_iface with
  *   instr_features member of same size
+ * 1.5:
+ * - Add ioctl 40: kbase_ioctl_cs_queue_register_ex, this is a new
+ *   queue registration call with extended format for supporting CS
+ *   trace configurations with CSF trace_command.
  */
 
 #define BASE_UK_VERSION_MAJOR 1
-#define BASE_UK_VERSION_MINOR 4
+#define BASE_UK_VERSION_MINOR 5
 
 /**
  * struct kbase_ioctl_version_check - Check version compatibility between
@@ -69,6 +73,9 @@ struct kbase_ioctl_version_check {
  * @buffer_size: Size of the buffer in bytes
  * @priority: Priority of the queue within a group when run within a process
  * @padding: Currently unused, must be zero
+ *
+ * @Note: There is an identical sub-section in kbase_ioctl_cs_queue_register_ex.
+ *        Any change of this struct should also be mirrored to the latter.
  */
 struct kbase_ioctl_cs_queue_register {
 	__u64 buffer_gpu_addr;
@@ -120,7 +127,42 @@ union kbase_ioctl_cs_queue_bind {
 #define KBASE_IOCTL_CS_QUEUE_BIND \
 	_IOWR(KBASE_IOCTL_TYPE, 39, union kbase_ioctl_cs_queue_bind)
 
-/* ioctl 40 is free to use */
+/**
+ * struct kbase_ioctl_cs_queue_register_ex - Register a GPU command queue with the
+ *                                           base back-end in extended format,
+ *                                           involving trace buffer configuration
+ *
+ * @buffer_gpu_addr: GPU address of the buffer backing the queue
+ * @buffer_size: Size of the buffer in bytes
+ * @priority: Priority of the queue within a group when run within a process
+ * @padding: Currently unused, must be zero
+ * @ex_offset_var_addr: GPU address of the trace buffer write offset variable
+ * @ex_buffer_base: Trace buffer GPU base address for the queue
+ * @ex_buffer_size: Size of the trace buffer in bytes
+ * @ex_event_size: Trace event write size, in log2 designation
+ * @ex_event_state: Trace event states configuration
+ * @ex_padding: Currently unused, must be zero
+ *
+ * @Note: There is an identical sub-section at the start of this struct to that
+ *        of @ref kbase_ioctl_cs_queue_register. Any change of this sub-section
+ *        must also be mirrored to the latter. Following the said sub-section,
+ *        the remaining fields forms the extension, marked with ex_*.
+ */
+struct kbase_ioctl_cs_queue_register_ex {
+	__u64 buffer_gpu_addr;
+	__u32 buffer_size;
+	__u8 priority;
+	__u8 padding[3];
+	__u64 ex_offset_var_addr;
+	__u64 ex_buffer_base;
+	__u32 ex_buffer_size;
+	__u8 ex_event_size;
+	__u8 ex_event_state;
+	__u8 ex_padding[2];
+};
+
+#define KBASE_IOCTL_CS_QUEUE_REGISTER_EX \
+	_IOW(KBASE_IOCTL_TYPE, 40, struct kbase_ioctl_cs_queue_register_ex)
 
 /**
  * struct kbase_ioctl_cs_queue_terminate - Terminate a GPU command queue
@@ -314,6 +356,7 @@ struct kbase_ioctl_cs_tiler_heap_term {
  * @out.total_stream_num:  Total number of CSs, summed across all groups.
  * @out.instr_features:    Instrumentation features. Bits 7:4 hold the maximum
  *                         size of events. Bits 3:0 hold the offset update rate.
+ *                         (csf >= 1.1.0)
  *
  */
 union kbase_ioctl_cs_get_glb_iface {
diff --git a/include/uapi/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_regmap_csf.h b/include/uapi/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_regmap_csf.h
index c87154fd6bd9..20417395750f 100644
--- a/include/uapi/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_regmap_csf.h
+++ b/include/uapi/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_regmap_csf.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
diff --git a/include/uapi/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_regmap_jm.h b/include/uapi/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_regmap_jm.h
index 19826683adf2..1be3541c930f 100644
--- a/include/uapi/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_regmap_jm.h
+++ b/include/uapi/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_regmap_jm.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
diff --git a/include/uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_coherency.h b/include/uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_coherency.h
index 98186d21a5e3..83d84137a034 100644
--- a/include/uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_coherency.h
+++ b/include/uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_coherency.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2015-2021 ARM Limited. All rights reserved.
diff --git a/include/uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_id.h b/include/uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_id.h
index 0145920bce1a..d093ce4f76c7 100644
--- a/include/uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_id.h
+++ b/include/uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_id.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2015-2021 ARM Limited. All rights reserved.
@@ -106,6 +106,8 @@
 #define GPU_ID2_PRODUCT_TBAX              GPU_ID2_MODEL_MAKE(9, 5)
 #define GPU_ID2_PRODUCT_TDUX              GPU_ID2_MODEL_MAKE(10, 1)
 #define GPU_ID2_PRODUCT_TODX              GPU_ID2_MODEL_MAKE(10, 2)
+#define GPU_ID2_PRODUCT_TGRX              GPU_ID2_MODEL_MAKE(10, 3)
+#define GPU_ID2_PRODUCT_TVAX              GPU_ID2_MODEL_MAKE(10, 4)
 #define GPU_ID2_PRODUCT_LODX              GPU_ID2_MODEL_MAKE(10, 7)
 
 /* Helper macro to create a GPU_ID assuming valid values for id, major,
diff --git a/include/uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_regmap.h b/include/uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_regmap.h
index 9977212ad615..84fad8d72a30 100644
--- a/include/uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_regmap.h
+++ b/include/uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_regmap.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
@@ -67,6 +67,9 @@
 #define PWR_OVERRIDE1           0x058   /* (RW) Power manager override settings */
 #define GPU_FEATURES_LO         0x060   /* (RO) GPU features, low word */
 #define GPU_FEATURES_HI         0x064   /* (RO) GPU features, high word */
+#define PRFCNT_FEATURES         0x068   /* (RO) Performance counter features */
+#define TIMESTAMP_OFFSET_LO     0x088   /* (RW) Global time stamp offset, low word */
+#define TIMESTAMP_OFFSET_HI     0x08C   /* (RW) Global time stamp offset, high word */
 #define CYCLE_COUNT_LO          0x090   /* (RO) Cycle counter, low word */
 #define CYCLE_COUNT_HI          0x094   /* (RO) Cycle counter, high word */
 #define TIMESTAMP_LO            0x098   /* (RO) Global time stamp counter, low word */
@@ -285,6 +288,13 @@
 #define AS_FAULTSTATUS_SOURCE_ID_GET(reg_val) \
 	(((reg_val)&AS_FAULTSTATUS_SOURCE_ID_MASK) >> AS_FAULTSTATUS_SOURCE_ID_SHIFT)
 
+#define PRFCNT_FEATURES_COUNTER_BLOCK_SIZE_SHIFT (0)
+#define PRFCNT_FEATURES_COUNTER_BLOCK_SIZE_MASK                                \
+	((0xFF) << PRFCNT_FEATURES_COUNTER_BLOCK_SIZE_SHIFT)
+#define PRFCNT_FEATURES_COUNTER_BLOCK_SIZE_GET(reg_val)                        \
+	(((reg_val)&PRFCNT_FEATURES_COUNTER_BLOCK_SIZE_MASK) >>                \
+	 PRFCNT_FEATURES_COUNTER_BLOCK_SIZE_SHIFT)
+
 /*
  * Begin MMU TRANSCFG register values
  */
diff --git a/include/uapi/gpu/arm/bifrost/jm/mali_base_jm_kernel.h b/include/uapi/gpu/arm/bifrost/jm/mali_base_jm_kernel.h
index cd81421b9122..749e1fa62883 100644
--- a/include/uapi/gpu/arm/bifrost/jm/mali_base_jm_kernel.h
+++ b/include/uapi/gpu/arm/bifrost/jm/mali_base_jm_kernel.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
diff --git a/include/uapi/gpu/arm/bifrost/jm/mali_kbase_jm_ioctl.h b/include/uapi/gpu/arm/bifrost/jm/mali_kbase_jm_ioctl.h
index 1eb6bcb85a5a..72d75cb34ec5 100644
--- a/include/uapi/gpu/arm/bifrost/jm/mali_kbase_jm_ioctl.h
+++ b/include/uapi/gpu/arm/bifrost/jm/mali_kbase_jm_ioctl.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
diff --git a/include/uapi/gpu/arm/bifrost/mali_base_kernel.h b/include/uapi/gpu/arm/bifrost/mali_base_kernel.h
index 554c5a39b189..a46c41f89af0 100644
--- a/include/uapi/gpu/arm/bifrost/mali_base_kernel.h
+++ b/include/uapi/gpu/arm/bifrost/mali_base_kernel.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
diff --git a/include/uapi/gpu/arm/bifrost/mali_base_mem_priv.h b/include/uapi/gpu/arm/bifrost/mali_base_mem_priv.h
index 982bd3d92dc2..304a334a4986 100644
--- a/include/uapi/gpu/arm/bifrost/mali_base_mem_priv.h
+++ b/include/uapi/gpu/arm/bifrost/mali_base_mem_priv.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2010-2015, 2020-2021 ARM Limited. All rights reserved.
diff --git a/include/uapi/gpu/arm/bifrost/mali_kbase_hwcnt_reader.h b/include/uapi/gpu/arm/bifrost/mali_kbase_hwcnt_reader.h
index 615dbb0a52fd..9baaec11e096 100644
--- a/include/uapi/gpu/arm/bifrost/mali_kbase_hwcnt_reader.h
+++ b/include/uapi/gpu/arm/bifrost/mali_kbase_hwcnt_reader.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2015, 2020-2021 ARM Limited. All rights reserved.
diff --git a/include/uapi/gpu/arm/bifrost/mali_kbase_ioctl.h b/include/uapi/gpu/arm/bifrost/mali_kbase_ioctl.h
index 5ca528a2effe..29ff32aeeb5c 100644
--- a/include/uapi/gpu/arm/bifrost/mali_kbase_ioctl.h
+++ b/include/uapi/gpu/arm/bifrost/mali_kbase_ioctl.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2017-2021 ARM Limited. All rights reserved.
diff --git a/include/uapi/gpu/arm/bifrost/mali_kbase_kinstr_jm_reader.h b/include/uapi/gpu/arm/bifrost/mali_kbase_kinstr_jm_reader.h
index cb782bde7584..72e1b9dbf245 100644
--- a/include/uapi/gpu/arm/bifrost/mali_kbase_kinstr_jm_reader.h
+++ b/include/uapi/gpu/arm/bifrost/mali_kbase_kinstr_jm_reader.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
diff --git a/include/uapi/gpu/arm/bifrost/mali_uk.h b/include/uapi/gpu/arm/bifrost/mali_uk.h
index 81cbb9e7c047..fcb6cb88980d 100644
--- a/include/uapi/gpu/arm/bifrost/mali_uk.h
+++ b/include/uapi/gpu/arm/bifrost/mali_uk.h
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  *
  * (C) COPYRIGHT 2010, 2012-2015, 2018, 2020-2021 ARM Limited. All rights reserved.

commit c2d009d2038b29abe6c7d480957112a94e6f3ff9
Author: Zhen Chen <chenzhen@rock-chips.com>
Date:   Thu Jul 22 09:40:50 2021 +0800

    MALI: bifrost: fix a bug that makes vdd_gpu abnormally low
    
    Change-Id: Ic0b785ead0da551e9e640c45b73f6686a1ec5cca
    Signed-off-by: Zhen Chen <chenzhen@rock-chips.com>

diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.c
index 1381f992364b..e64d273fa87f 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.c
@@ -56,7 +56,7 @@ static struct monitor_dev_profile mali_mdevp = {
  * This function will be called only when the opp table which is compatible with
  * "operating-points-v2-mali", is not present in the devicetree for GPU device.
  *
- * Return: Voltage value in milli volts, 0 in case of error.
+ * Return: Voltage value in uV, 0 in case of error.
  */
 static unsigned long get_voltage(struct kbase_device *kbdev, unsigned long freq)
 {
@@ -82,8 +82,8 @@ static unsigned long get_voltage(struct kbase_device *kbdev, unsigned long freq)
 	rcu_read_unlock();
 #endif
 
-	/* Return the voltage in milli volts */
-	return voltage / 1000;
+	/* Return the voltage in uV. */
+	return voltage;
 }
 
 void kbase_devfreq_opp_translate(struct kbase_device *kbdev, unsigned long freq,

commit 84f151935f507d53fcb0c5b543ea70918c8df684
Author: Zhen Chen <chenzhen@rock-chips.com>
Date:   Wed Mar 17 14:12:25 2021 +0800

    MALI: rockchip: upgrade bifrost DDK to g6p0-01eac0, from g2p0-01eac0
    
    Include a new directory include/uapi/gpu/arm/bifrost/,
    which includes some header files of bifrost device driver.
    In the original part of g6, the path is include/uapi/gpu/arm/midgard/.
    I changed the "midgard" to "bifrost", and modified the paths of the header files in .c files.
    
    I resolved some conflicts between modifications form ARM and RK, manually.
    
    In addition, introduce source files of protected_memory_allocator
    that might be needed by bifrost_device_driver into build system.
    
    Change-Id: I09d500a0fdbc5da352c81dc4fcfbffb5b7f907f5
    Signed-off-by: Zhen Chen <chenzhen@rock-chips.com>

diff --git a/Documentation/ABI/testing/sysfs-device-mali b/Documentation/ABI/testing/sysfs-device-mali
new file mode 100644
index 000000000000..1cd1819d42bc
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-device-mali
@@ -0,0 +1,284 @@
+/*
+ *
+ * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation) and any use by you of this program is subject to the terms
+ * of such GNU licence.
+ *
+ * A copy of the licence is included with the program) and can also be obtained
+ * from Free Software Foundation) Inc.) 51 Franklin Street) Fifth Floor)
+ * Boston) MA  02110-1301) USA.
+ *
+ */
+
+What:		/sys/class/misc/mali%u/device/core_mask
+Description:
+		This attribute is used to restrict number of shader core
+		available, is useful for debugging purposes. Reading
+		this attribute provides us mask of cores available.
+		Writing to it will set the current core mask.
+
+What:		/sys/class/misc/mali%u/device/debug_command
+Description:
+		This attribute is used to issue debug commands that supported
+		by the driver. On reading it provides the list of debug commands
+		that are supported, and writing back one of those commands will
+		enable that debug option.
+
+What:		/sys/class/misc/mali%u/device/dvfs_period
+Description:
+		This is used to set the DVFS sampling period to be used by the
+		driver, On reading it provides the current DVFS sampling period,
+		on writing a value we set the DVFS sampling period.
+
+What:		/sys/class/misc/mali%u/device/dummy_job_wa_info
+Description:
+		This attribute is available only with platform device that
+                supports a Job Manager based GPU that requires a GPU workaround
+		to execute the dummy fragment job on all shader cores to
+		workaround a hang issue.
+
+		Its a readonly attribute and on reading gives details on the
+		options used with the dummy workaround.
+
+What:		/sys/class/misc/mali%u/device/gpuinfo
+Description:
+		This attribute provides description of the present Mali GPU.
+		Its a read only attribute provides details like GPU family, the
+		number of cores, the hardware version and the raw product id.
+
+What:		/sys/class/misc/mali%u/device/idle_hysteresis_time
+Description:
+		This attribute is available only with mali platform
+		device-driver that supports a CSF GPU. This attribute is
+		used to set the duration value in milliseconds for the
+		configuring hysteresis field for determining GPU idle detection.
+
+What:		/sys/class/misc/mali%u/device/js_ctx_scheduling_mode
+Description:
+		This attribute is available only with platform device that
+		supports a Job Manager based GPU. This attribute is used to set
+		context scheduling priority for a job slot.
+
+		On Reading it provides the currently set job slot context
+		priority.
+
+		Writing 0 to this attribute sets it to the mode were
+		higher priority atoms will be scheduled first, regardless of
+		the context they belong to. Newly-runnable higher priority atoms
+		can preempt lower priority atoms currently running on the GPU,
+		even if they belong to a different context.
+
+		Writing 1 to this attribute set it to the mode were the
+		highest-priority atom will be chosen from each context in turn
+		using a round-robin algorithm, so priority only has an effect
+		within the context an atom belongs to. Newly-runnable higher
+		priority atoms can preempt the lower priority atoms currently
+		running on the GPU, but only if they belong to the same context.
+
+What:		/sys/class/misc/mali%u/device/js_scheduling_period
+Description:
+		This attribute is available only with platform device that
+                supports a Job Manager based GPU. Used to set the job scheduler
+		tick period in nano-seconds. The Job Scheduler determines the
+		jobs that are run on the GPU, and for how long, Job Scheduler
+		makes decisions at a regular time interval determined by value
+		in js_scheduling_period.
+
+What:		/sys/class/misc/mali%u/device/js_softstop_always
+Description:
+		This attribute is available only with platform device that
+                supports a Job Manager based GPU. Soft-stops are disabled when
+		only a single context is present, this attribute is used to
+		enable soft-stop when only a single context is present can be
+		used for debug and unit-testing purposes.
+
+What:		/sys/class/misc/mali%u/device/js_timeouts
+Description:
+		This attribute is available only with platform device that
+                supports a Job Manager based GPU. It used to set the soft stop
+		and hard stop times for the job scheduler.
+
+		Writing value 0 causes no change, or -1 to restore the
+		default timeout.
+
+		The format used to set js_timeouts is
+		"<soft_stop_ms> <soft_stop_ms_cl> <hard_stop_ms_ss>
+		<hard_stop_ms_cl> <hard_stop_ms_dumping> <reset_ms_ss>
+		<reset_ms_cl> <reset_ms_dumping>"
+
+
+What:		/sys/class/misc/mali%u/device/lp_mem_pool_max_size
+Description:
+		This attribute is used to set the maximum number of large pages
+		memory pools that the driver can contain. Large pages are of
+		size 2MB. On read it displays all the max size of all memory
+		pools and can be used to modify each individual pools as well.
+
+What:		/sys/class/misc/mali%u/device/lp_mem_pool_size
+Description:
+		This attribute is used to set the number of large memory pages
+		which should be	populated, changing this value may cause
+		existing pages to be removed from the pool, or new pages to be
+		created and then added to the pool. On read it will provide
+		pool size for all available pools and we can modify individual
+		pool.
+
+What:		/sys/class/misc/mali%u/device/mem_pool_max_size
+Description:
+		This attribute is used to set the maximum number of small pages
+		for memory pools that the driver can contain. Here small pages
+		are of size 4KB. On read it will display the max size for all
+		available pools and allows us to set max size of
+		individual pools.
+
+What:		/sys/class/misc/mali%u/device/mem_pool_size
+Description:
+		This attribute is used to set the number of small memory pages
+		which should be populated, changing this value may cause
+		existing pages to be removed from the pool, or new pages to
+		be created and then added to the pool. On read it will provide
+		pool size for all available pools and we can modify individual
+		pool.
+
+What:		/sys/class/misc/mali%u/device/device/mempool/ctx_default_max_size
+Description:
+		This attribute is used to set maximum memory pool size for
+		all the memory pool so that the maximum amount of free memory
+		that each pool can hold is identical.
+
+What:		/sys/class/misc/mali%u/device/device/mempool/lp_max_size
+Description:
+		This attribute is used to set the maximum number of large pages
+		for all memory pools that the driver can contain.
+		Large pages are of size 2MB.
+
+What:		/sys/class/misc/mali%u/device/device/mempool/max_size
+Description:
+		This attribute is used to set the maximum number of small pages
+		for all the memory pools that the driver can contain.
+		Here small pages are of size 4KB.
+
+What:		/sys/class/misc/mali%u/device/pm_poweroff
+Description:
+		This attribute contains the current values, represented as the
+		following space-separated integers:
+		??PM_GPU_POWEROFF_TICK_NS.
+		??PM_POWEROFF_TICK_SHADER.
+		??PM_POWEROFF_TICK_GPU.
+
+		Example:
+		echo 100000 4 4 > /sys/class/misc/mali0/device/pm_poweroff
+
+		Sets the following new values: 100,000ns tick, four ticks
+		for shader power down, and four ticks for GPU power down.
+
+What:		/sys/class/misc/mali%u/device/power_policy
+Description:
+		This attribute is used to find the current power policy been
+		used, reading will list the power policies available and
+		enclosed in square bracket is the current one been selected.
+
+		Example:
+		cat /sys/class/misc/mali0/device/power_policy
+		[demand] coarse_demand always_on
+
+		To switch to a different policy at runtime write the valid entry
+		name back to the attribute.
+
+		Example:
+		echo "coarse_demand" > /sys/class/misc/mali0/device/power_policy
+
+What:		/sys/class/misc/mali%u/device/progress_timeout
+Description:
+		This attribute is available only with mali platform
+		device-driver that supports a CSF GPU. This attribute
+		is used to set the progress timeout value and read the current
+		progress timeout value.
+
+		Progress timeout value is the maximum number of GPU cycles
+		without forward progress to allow to elapse before terminating a
+		GPU command queue group.
+
+What:		/sys/class/misc/mali%u/device/reset_timeout
+Description:
+		This attribute is used to set the number of milliseconds to
+		wait for the soft stop to complete for the GPU jobs before
+		proceeding with the GPU reset.
+
+What:		/sys/class/misc/mali%u/device/soft_job_timeout
+Description:
+		This attribute is available only with platform device that
+                supports a Job Manager based GPU. It used to set the timeout
+		value for waiting for any soft event to complete.
+
+What:		/sys/class/misc/mali%u/device/scheduling/serialize_jobs
+Description:
+		This attribute is available only with platform device that
+                supports a Job Manager based GPU.
+
+		Various options available under this are:
+		??none - for disabling serialization.
+		??intra-slot - Serialize atoms within a slot, only one
+				atom per job slot.
+		??inter-slot - Serialize atoms between slots, only one
+				job slot running at any time.
+		??full - it a combination of both inter and intra slot,
+				so only one atom and one job slot running
+				at any time.
+		??full-reset - full serialization and Reset the GPU after
+				each atom completion
+
+		These options are useful for debugging and investigating
+		failures and gpu hangs to narrow down atoms that could cause
+		troubles.
+
+What:		/sys/class/misc/mali%u/device/firmware_config/Compute iterator count/*
+Description:
+		This attribute is available only with mali platform
+		device-driver that supports a CSF GPU. Its a read-only attribute
+		which indicates the maximum number of Compute iterators
+		supported by the GPU.
+
+What:		/sys/class/misc/mali%u/device/firmware_config/CSHWIF count/*
+Description:
+		This attribute is available only with mali platform
+		device-driver that supports a CSF GPU. Its a read-only
+		attribute which indicates the maximum number of	CSHWIFs
+		supported by the GPU.
+
+What:		/sys/class/misc/mali%u/device/firmware_config/Fragment iterator count/*
+Description:
+		This attribute is available only with mali platform
+		device-driver that supports a CSF GPU. Its a read-only
+		attribute which indicates the maximum number of
+		Fragment iterators supported by the GPU.
+
+What:		/sys/class/misc/mali%u/device/firmware_config/Scoreboard set count/*
+Description:
+		This attribute is available only with mali platform
+		device-driver that supports a CSF GPU. Its a read-only
+		attribute which indicates the maximum number of
+		Scoreboard set supported by the GPU.
+
+What:		/sys/class/misc/mali%u/device/firmware_config/Tiler iterator count/*
+Description:
+		This attribute is available only with mali platform
+		device-driver that supports a CSF GPU. Its a read-only
+		attribute which indicates the maximum number of	Tiler iterators
+		supported by the GPU.
+
+What:		/sys/class/misc/mali%u/device/firmware_config/Log verbosity/*
+Description:
+		This attribute is available only with mali platform
+                device-driver that supports a CSF GPU.
+
+		Used to enable firmware logs, logging levels valid values
+		are indicated using 'min and 'max' attribute values
+		values that are read-only.
+
+		Log level can be set using the 'cur' read, write attribute,
+		we can use a valid log level value from min and max range values
+		and set a valid desired log level for firmware logs.
diff --git a/Documentation/devicetree/bindings/arm/mali-bifrost.txt b/Documentation/devicetree/bindings/arm/mali-bifrost.txt
index 8aaca67d3c9a..93493e833c9b 100644
--- a/Documentation/devicetree/bindings/arm/mali-bifrost.txt
+++ b/Documentation/devicetree/bindings/arm/mali-bifrost.txt
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2013-2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2013-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,8 +16,6 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
 * ARM Mali Midgard / Bifrost devices
@@ -46,12 +45,12 @@ Documentation/devicetree/bindings/regulator/regulator.txt for details.
                        This is optional.
 - operating-points-v2 : Refer to Documentation/devicetree/bindings/power/mali-opp.txt
 for details.
-- quirks_jm : Used to write to the JM_CONFIG register or equivalent.
+- quirks_gpu : Used to write to the JM_CONFIG or CSF_CONFIG register.
 	  Should be used with care. Options passed here are used to override
 	  certain default behavior. Note: This will override 'idvs-group-size'
 	  field in devicetree and module param 'corestack_driver_control',
-	  therefore if 'quirks_jm' is used then 'idvs-group-size' and
-	  'corestack_driver_control' value should be incorporated into 'quirks_jm'.
+	  therefore if 'quirks_gpu' is used then 'idvs-group-size' and
+	  'corestack_driver_control' value should be incorporated into 'quirks_gpu'.
 - quirks_sc : Used to write to the SHADER_CONFIG register.
 	  Should be used with care. Options passed here are used to override
 	  certain default behavior.
diff --git a/Documentation/devicetree/bindings/arm/memory_group_manager.txt b/Documentation/devicetree/bindings/arm/memory_group_manager.txt
index fda8f001dafb..77a94743a97b 100644
--- a/Documentation/devicetree/bindings/arm/memory_group_manager.txt
+++ b/Documentation/devicetree/bindings/arm/memory_group_manager.txt
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,8 +16,6 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
 * Arm memory group manager for Mali GPU device drivers
diff --git a/Documentation/devicetree/bindings/arm/priority_control_manager.txt b/Documentation/devicetree/bindings/arm/priority_control_manager.txt
new file mode 100644
index 000000000000..0a34896dd8ee
--- /dev/null
+++ b/Documentation/devicetree/bindings/arm/priority_control_manager.txt
@@ -0,0 +1,48 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+#
+# This program is free software and is provided to you under the terms of the
+# GNU General Public License version 2 as published by the Free Software
+# Foundation, and any use by you of this program is subject to the terms
+# of such GNU license.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can access it online at
+# http://www.gnu.org/licenses/gpl-2.0.html.
+#
+#
+
+* Arm priority control manager for Mali GPU device drivers
+
+Required properties:
+
+- compatible: Must be "arm,priority-control-manager"
+
+An example node:
+
+        gpu_priority_control_manager: priority-control-manager {
+                compatible = "arm,priority-control-manager";
+        };
+
+It must be referenced by the GPU as well, see priority-control-manager:
+
+	gpu: gpu@0x6e000000 {
+		compatible = "arm,mali-midgard";
+		reg = <0x0 0x6e000000 0x0 0x200000>;
+		interrupts = <0 168 4>, <0 168 4>, <0 168 4>;
+		interrupt-names = "JOB", "MMU", "GPU";
+		clocks = <&scpi_dvfs 2>;
+		clock-names = "clk_mali";
+		system-coherency = <31>;
+		priority-control-manager = <&gpu_priority_control_manager>;
+		operating-points = <
+			/* KHz uV */
+			50000 820000
+		>;
+	};
diff --git a/Documentation/devicetree/bindings/arm/protected_memory_allocator.txt b/Documentation/devicetree/bindings/arm/protected_memory_allocator.txt
new file mode 100644
index 000000000000..8ca5f08c6b44
--- /dev/null
+++ b/Documentation/devicetree/bindings/arm/protected_memory_allocator.txt
@@ -0,0 +1,68 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+#
+# This program is free software and is provided to you under the terms of the
+# GNU General Public License version 2 as published by the Free Software
+# Foundation, and any use by you of this program is subject to the terms
+# of such GNU license.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can access it online at
+# http://www.gnu.org/licenses/gpl-2.0.html.
+#
+#
+
+* Arm protected memory allocator for Mali GPU device drivers
+
+Required properties:
+
+- compatible: Must be "arm,protected-memory-allocator"
+
+The protected memory allocator manages allocation of physical pages of a
+reserved memory region of protected memory, therefore its device node shall
+reference a reserved memory region.
+
+In addition to that, the protected memory allocator shall be referenced
+by the GPU.
+
+A complete example configuration for the device tree:
+
+	reserved-memory {
+		#address-cells = <2>;
+		#size-cells = <2>;
+		ranges;
+
+		mali_protected: mali_protected@c0000000 {
+			compatible = "mali-reserved";
+			reg = <0x0 0xc0000000 0x0 0x1000000>;
+		};
+	};
+
+	gpu_protected_memory_allocator: protected-memory-allocator {
+		compatible = "arm,protected-memory-allocator";
+		memory-region = <&mali_protected>;
+	};
+
+	gpu_fpga: gpu@0x6e000000 {
+		compatible = "arm,mali-midgard";
+		reg = <0x0 0x6e000000 0x0 0x200000>;
+		interrupts = <0 168 4>, <0 168 4>, <0 168 4>;
+		interrupt-names = "JOB", "MMU", "GPU";
+		clocks = <&scpi_dvfs 2>;
+		clock-names = "clk_mali";
+		protected-memory-allocator = <&gpu_protected_memory_allocator>;
+		operating-points = <
+			/* KHz uV */
+			50000 820000
+		>;
+	};
+
+The protected memory allocator is gpu_protected_memory_allocator.
+It references the mali_protected reserved memory region and, in turn,
+it is referenced by the GPU as protected-memory-allocator.
diff --git a/Documentation/devicetree/bindings/power/mali-opp.txt b/Documentation/devicetree/bindings/power/mali-opp.txt
index 88999ff0a172..411c99229e95 100644
--- a/Documentation/devicetree/bindings/power/mali-opp.txt
+++ b/Documentation/devicetree/bindings/power/mali-opp.txt
@@ -1,14 +1,20 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2017, 2019 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2017, 2019-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can access it online at
+# http://www.gnu.org/licenses/gpl-2.0.html.
 #
 #
 
@@ -48,7 +54,7 @@ Optional properties:
 
 - opp-core-count: Number of cores to use for this OPP. If this is present then
   the driver will build a core mask using the available core mask provided by
-  the GPU hardware.
+  the GPU hardware. An opp-core-count value of 0 is not permitted.
 
   If neither this nor opp-core-mask are present then all shader cores will be
   used for this OPP.
diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig
index 9be024fb88ce..ec863016e7d7 100644
--- a/drivers/base/Kconfig
+++ b/drivers/base/Kconfig
@@ -171,7 +171,8 @@ config SOC_BUS
 
 source "drivers/base/regmap/Kconfig"
 
-source "drivers/base/memory_group_manager/Kconfig"
+source "drivers/base/arm/memory_group_manager/Kconfig"
+source "drivers/base/arm/protected_memory_allocator/Kconfig"
 
 config DMA_SHARED_BUFFER
 	bool
diff --git a/drivers/base/Makefile b/drivers/base/Makefile
index 4a7b6c6b1d7b..7713802d32f0 100644
--- a/drivers/base/Makefile
+++ b/drivers/base/Makefile
@@ -18,7 +18,10 @@ obj-$(CONFIG_MODULES)	+= module.o
 endif
 obj-$(CONFIG_SYS_HYPERVISOR) += hypervisor.o
 obj-$(CONFIG_REGMAP)	+= regmap/
-obj-$(CONFIG_MALI_MEMORY_GROUP_MANAGER)	+= memory_group_manager/
+
+obj-$(CONFIG_MALI_MEMORY_GROUP_MANAGER)	+= arm/memory_group_manager/
+obj-$(CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR)	+= arm/protected_memory_allocator/
+
 obj-$(CONFIG_SOC_BUS) += soc.o
 obj-$(CONFIG_PINCTRL) += pinctrl.o
 obj-$(CONFIG_DEV_COREDUMP) += devcoredump.o
diff --git a/drivers/base/memory_group_manager/Kbuild b/drivers/base/arm/memory_group_manager/Kbuild
similarity index 89%
rename from drivers/base/memory_group_manager/Kbuild
rename to drivers/base/arm/memory_group_manager/Kbuild
index a049bed07431..1b0f8b07b399 100644
--- a/drivers/base/memory_group_manager/Kbuild
+++ b/drivers/base/arm/memory_group_manager/Kbuild
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,8 +16,6 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
-obj-$(CONFIG_MALI_MEMORY_GROUP_MANAGER) := memory_group_manager.o
\ No newline at end of file
+obj-$(CONFIG_MALI_MEMORY_GROUP_MANAGER) := memory_group_manager.o
diff --git a/drivers/base/memory_group_manager/Kconfig b/drivers/base/arm/memory_group_manager/Kconfig
similarity index 91%
rename from drivers/base/memory_group_manager/Kconfig
rename to drivers/base/arm/memory_group_manager/Kconfig
index da464ec68abe..de698fa1eb4c 100644
--- a/drivers/base/memory_group_manager/Kconfig
+++ b/drivers/base/arm/memory_group_manager/Kconfig
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,8 +16,6 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
 
diff --git a/drivers/base/memory_group_manager/Makefile b/drivers/base/arm/memory_group_manager/Makefile
similarity index 72%
rename from drivers/base/memory_group_manager/Makefile
rename to drivers/base/arm/memory_group_manager/Makefile
index a5bceae12384..4f1ef727cb23 100644
--- a/drivers/base/memory_group_manager/Makefile
+++ b/drivers/base/arm/memory_group_manager/Makefile
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,8 +16,6 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
 # linux build system bootstrap for out-of-tree module
@@ -24,12 +23,15 @@
 # default to building for the host
 ARCH ?= $(shell uname -m)
 
-ifeq ($(KDIR),)
-$(error Must specify KDIR to point to the kernel to target))
-endif
+# Handle Android Common Kernel source naming
+KERNEL_SRC ?= /lib/modules/$(shell uname -r)/build
+KDIR ?= $(KERNEL_SRC)
 
 all:
-	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) EXTRA_CFLAGS="-I$(CURDIR)/../../../include" modules CONFIG_MALI_MEMORY_GROUP_MANAGER=m
+	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) EXTRA_CFLAGS="-I$(CURDIR)/../../../../include" modules CONFIG_MALI_MEMORY_GROUP_MANAGER=m
 
 clean:
 	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) clean
+
+modules_install:
+	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) modules_install
diff --git a/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu.h b/drivers/base/arm/memory_group_manager/build.bp
similarity index 66%
rename from drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu.h
rename to drivers/base/arm/memory_group_manager/build.bp
index 9516e56eda01..4eb447cc1257 100644
--- a/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu.h
+++ b/drivers/base/arm/memory_group_manager/build.bp
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,16 +17,14 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-#ifndef _KBASE_GPU_H_
-#define _KBASE_GPU_H_
-
-#include "mali_kbase_gpu_regmap.h"
-#include "mali_kbase_gpu_fault.h"
-#include "mali_kbase_gpu_coherency.h"
-#include "mali_kbase_gpu_id.h"
-
-#endif /* _KBASE_GPU_H_ */
+bob_kernel_module {
+    name: "memory_group_manager",
+    srcs: [
+        "Kbuild",
+        "memory_group_manager.c",
+    ],
+    kbuild_options: ["CONFIG_MALI_MEMORY_GROUP_MANAGER=m"],
+    defaults: ["kernel_defaults"],
+}
diff --git a/drivers/base/memory_group_manager/memory_group_manager.c b/drivers/base/arm/memory_group_manager/memory_group_manager.c
similarity index 98%
rename from drivers/base/memory_group_manager/memory_group_manager.c
rename to drivers/base/arm/memory_group_manager/memory_group_manager.c
index cbe7f0a775a1..2ce3b940ed72 100644
--- a/drivers/base/memory_group_manager/memory_group_manager.c
+++ b/drivers/base/arm/memory_group_manager/memory_group_manager.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <linux/fs.h>
@@ -481,7 +480,6 @@ static struct platform_driver memory_group_manager_driver = {
 	.remove = memory_group_manager_remove,
 	.driver = {
 		.name = "physical-memory-group-manager",
-		.owner = THIS_MODULE,
 		.of_match_table = of_match_ptr(memory_group_manager_dt_ids),
 		/*
 		 * Prevent the mgm_dev from being unbound and freed, as other's
diff --git a/drivers/base/arm/protected_memory_allocator/Kbuild b/drivers/base/arm/protected_memory_allocator/Kbuild
new file mode 100644
index 000000000000..205c5f1ee95a
--- /dev/null
+++ b/drivers/base/arm/protected_memory_allocator/Kbuild
@@ -0,0 +1,21 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
+#
+# This program is free software and is provided to you under the terms of the
+# GNU General Public License version 2 as published by the Free Software
+# Foundation, and any use by you of this program is subject to the terms
+# of such GNU license.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can access it online at
+# http://www.gnu.org/licenses/gpl-2.0.html.
+#
+#
+
+obj-$(CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR) := protected_memory_allocator.o
diff --git a/drivers/base/arm/protected_memory_allocator/Kconfig b/drivers/base/arm/protected_memory_allocator/Kconfig
new file mode 100644
index 000000000000..5ee5dcce625d
--- /dev/null
+++ b/drivers/base/arm/protected_memory_allocator/Kconfig
@@ -0,0 +1,27 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
+#
+# This program is free software and is provided to you under the terms of the
+# GNU General Public License version 2 as published by the Free Software
+# Foundation, and any use by you of this program is subject to the terms
+# of such GNU license.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can access it online at
+# http://www.gnu.org/licenses/gpl-2.0.html.
+#
+#
+
+
+config MALI_PROTECTED_MEMORY_ALLOCATOR
+	tristate "MALI_PROTECTED_MEMORY_ALLOCATOR"
+	help
+	  This option enables an example implementation of a protected memory allocator
+	  for allocation and release of pages of secure memory intended to be used
+	  by the firmware of Mali GPU device drivers.
diff --git a/drivers/base/arm/protected_memory_allocator/Makefile b/drivers/base/arm/protected_memory_allocator/Makefile
new file mode 100644
index 000000000000..93f49b5efdf2
--- /dev/null
+++ b/drivers/base/arm/protected_memory_allocator/Makefile
@@ -0,0 +1,37 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
+#
+# This program is free software and is provided to you under the terms of the
+# GNU General Public License version 2 as published by the Free Software
+# Foundation, and any use by you of this program is subject to the terms
+# of such GNU license.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can access it online at
+# http://www.gnu.org/licenses/gpl-2.0.html.
+#
+#
+
+# linux build system bootstrap for out-of-tree module
+
+# default to building for the host
+ARCH ?= $(shell uname -m)
+
+# Handle Android Common Kernel source naming
+KERNEL_SRC ?= /lib/modules/$(shell uname -r)/build
+KDIR ?= $(KERNEL_SRC)
+
+all:
+	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) EXTRA_CFLAGS="-I$(CURDIR)/../../../../include" modules CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR=m
+
+clean:
+	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) clean
+
+modules_install:
+	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) modules_install
diff --git a/drivers/base/arm/protected_memory_allocator/build.bp b/drivers/base/arm/protected_memory_allocator/build.bp
new file mode 100644
index 000000000000..ddb0510cacd6
--- /dev/null
+++ b/drivers/base/arm/protected_memory_allocator/build.bp
@@ -0,0 +1,34 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ *
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+bob_kernel_module {
+    name: "protected_memory_allocator",
+    srcs: [
+        "Kbuild",
+        "protected_memory_allocator.c",
+    ],
+    kbuild_options: ["CONFIG_MALI_PROTECTED_MEMORY_ALLOCATOR=m"],
+    defaults: ["kernel_defaults"],
+    enabled: false,
+    build_csf_only_module: {
+        enabled: true,
+    },
+}
diff --git a/drivers/base/arm/protected_memory_allocator/protected_memory_allocator.c b/drivers/base/arm/protected_memory_allocator/protected_memory_allocator.c
new file mode 100644
index 000000000000..a34b3a44fb79
--- /dev/null
+++ b/drivers/base/arm/protected_memory_allocator/protected_memory_allocator.c
@@ -0,0 +1,551 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ *
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+#include <linux/version.h>
+#include <linux/of.h>
+#include <linux/of_reserved_mem.h>
+#include <linux/platform_device.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/mm.h>
+#include <linux/io.h>
+#include <linux/protected_memory_allocator.h>
+
+/* Size of a bitfield element in bytes */
+#define BITFIELD_ELEM_SIZE sizeof(u64)
+
+/* We can track whether or not 64 pages are currently allocated in a u64 */
+#define PAGES_PER_BITFIELD_ELEM (BITFIELD_ELEM_SIZE * BITS_PER_BYTE)
+
+/* Order 6 (ie, 64) corresponds to the number of pages held in a bitfield */
+#define ORDER_OF_PAGES_PER_BITFIELD_ELEM 6
+
+/**
+ * struct simple_pma_device -	Simple implementation of a protected memory
+ *				allocator device
+ *
+ * @pma_dev:			Protected memory allocator device pointer
+ * @dev:  			Device pointer
+ * @alloc_pages_bitfield_arr:	Status of all the physical memory pages within the
+ *				protected memory region, one bit per page
+ * @rmem_base:			Base address of the reserved memory region
+ * @rmem_size:			Size of the reserved memory region, in pages
+ * @num_free_pages:		Number of free pages in the memory region
+ * @rmem_lock:			Lock to serialize the allocation and freeing of
+ *				physical pages from the protected memory region
+ */
+struct simple_pma_device {
+	struct protected_memory_allocator_device pma_dev;
+	struct device *dev;
+	u64 *allocated_pages_bitfield_arr;
+	phys_addr_t rmem_base;
+	size_t rmem_size;
+	size_t num_free_pages;
+	spinlock_t rmem_lock;
+};
+
+/**
+ * Number of elements in array 'allocated_pages_bitfield_arr'. If the number of
+ * pages required does not divide exactly by PAGES_PER_BITFIELD_ELEM, adds an
+ * extra page for the remainder.
+ */
+#define ALLOC_PAGES_BITFIELD_ARR_SIZE(num_pages) \
+	((PAGES_PER_BITFIELD_ELEM * (0 != (num_pages % PAGES_PER_BITFIELD_ELEM)) + \
+	num_pages) / PAGES_PER_BITFIELD_ELEM)
+
+/**
+ * Allocate a power-of-two number of pages, N, where
+ * 0 <= N <= ORDER_OF_PAGES_PER_BITFIELD_ELEM - 1.  ie, Up to 32 pages. The routine
+ * fills-in a pma structure and sets the appropriate bits in the allocated-pages
+ * bitfield array but assumes the caller has already determined that these are
+ * already clear.
+ *
+ * This routine always works within only a single allocated-pages bitfield element.
+ * It can be thought of as the 'small-granularity' allocator.
+ */
+static void small_granularity_alloc(struct simple_pma_device *const epma_dev,
+				    size_t alloc_bitfield_idx, size_t start_bit,
+				    size_t order,
+				    struct protected_memory_allocation *pma)
+{
+	size_t i;
+	size_t page_idx;
+	u64 *bitfield;
+	size_t alloc_pages_bitfield_size;
+
+	if (WARN_ON(!epma_dev) ||
+	    WARN_ON(!pma))
+		return;
+
+	WARN(epma_dev->rmem_size == 0, "%s: rmem_size is 0", __func__);
+	alloc_pages_bitfield_size = ALLOC_PAGES_BITFIELD_ARR_SIZE(epma_dev->rmem_size);
+
+	WARN(alloc_bitfield_idx >= alloc_pages_bitfield_size,
+	     "%s: idx>bf_size: %zu %zu", __FUNCTION__,
+	     alloc_bitfield_idx, alloc_pages_bitfield_size);
+
+	WARN((start_bit + (1 << order)) > PAGES_PER_BITFIELD_ELEM,
+	     "%s: start=%zu order=%zu ppbe=%zu",
+	     __FUNCTION__, start_bit, order, PAGES_PER_BITFIELD_ELEM);
+
+	bitfield = &epma_dev->allocated_pages_bitfield_arr[alloc_bitfield_idx];
+
+	for (i = 0; i < (1 << order); i++) {
+		/* Check the pages represented by this bit are actually free */
+		WARN (*bitfield & (1ULL << (start_bit + i)),
+		      "in %s: page not free: %zu %zu %.16llx %zu\n",
+		      __FUNCTION__, i, order, *bitfield, alloc_pages_bitfield_size);
+
+		/* Mark the pages as now allocated */
+		*bitfield |= (1ULL << (start_bit + i));
+	}
+
+	/* Compute the page index */
+	page_idx = (alloc_bitfield_idx * PAGES_PER_BITFIELD_ELEM) + start_bit;
+
+	/* Fill-in the allocation struct for the caller */
+	pma->pa = epma_dev->rmem_base + (page_idx << PAGE_SHIFT);
+	pma->order = order;
+}
+
+/**
+ * Allocate a power-of-two number of pages, N, where
+ * N >= ORDER_OF_PAGES_PER_BITFIELD_ELEM. ie, 64 pages or more. The routine fills-in
+ * a pma structure and sets the appropriate bits in the allocated-pages bitfield array
+ * but assumes the caller has already determined that these are already clear.
+ *
+ * Unlike small_granularity_alloc, this routine can work with multiple 64-page groups,
+ * ie multiple elements from the allocated-pages bitfield array. However, it always
+ * works with complete sets of these 64-page groups. It can therefore be thought of
+ * as the 'large-granularity' allocator.
+ */
+static void large_granularity_alloc(struct simple_pma_device *const epma_dev,
+				    size_t start_alloc_bitfield_idx,
+				    size_t order,
+				    struct protected_memory_allocation *pma)
+{
+	size_t i;
+	size_t num_pages_to_alloc = (size_t)1 << order;
+	size_t num_bitfield_elements_needed = num_pages_to_alloc / PAGES_PER_BITFIELD_ELEM;
+	size_t start_page_idx = start_alloc_bitfield_idx * PAGES_PER_BITFIELD_ELEM;
+
+	if (WARN_ON(!epma_dev) ||
+	    WARN_ON(!pma))
+		return;
+
+	/*
+	 * Are there anough bitfield array elements (groups of 64 pages)
+	 * between the start element and the end of the bitfield array
+	 * to fulfill the request?
+	 */
+	WARN((start_alloc_bitfield_idx + order) >= ALLOC_PAGES_BITFIELD_ARR_SIZE(epma_dev->rmem_size),
+	     "%s: start=%zu order=%zu ms=%zu",
+	     __FUNCTION__, start_alloc_bitfield_idx, order, epma_dev->rmem_size);
+
+	for (i = 0; i < num_bitfield_elements_needed; i++) {
+		u64 *bitfield = &epma_dev->allocated_pages_bitfield_arr[start_alloc_bitfield_idx + i];
+
+		/* We expect all pages that relate to this bitfield element to be free */
+		WARN((*bitfield != 0),
+		     "in %s: pages not free: i=%zu o=%zu bf=%.16llx\n",
+		     __FUNCTION__, i, order, *bitfield);
+
+		/* Mark all the pages for this element as not free */
+		*bitfield = ~0ULL;
+	}
+
+	/* Fill-in the allocation struct for the caller */
+	pma->pa = epma_dev->rmem_base + (start_page_idx  << PAGE_SHIFT);
+	pma->order = order;
+}
+
+static struct protected_memory_allocation *simple_pma_alloc_page(
+	struct protected_memory_allocator_device *pma_dev, unsigned int order)
+{
+	struct simple_pma_device *const epma_dev =
+		container_of(pma_dev, struct simple_pma_device, pma_dev);
+	struct protected_memory_allocation *pma;
+	size_t num_pages_to_alloc;
+
+	u64 *bitfields = epma_dev->allocated_pages_bitfield_arr;
+	size_t i;
+	size_t bit;
+	size_t count;
+
+	dev_dbg(epma_dev->dev, "%s(pma_dev=%px, order=%u\n",
+		__func__, (void *)pma_dev, order);
+
+	/* This is an example function that follows an extremely simple logic
+	 * and is very likely to fail to allocate memory if put under stress.
+	 *
+	 * The simple_pma_device maintains an array of u64s, with one bit used
+	 * to track the status of each page.
+	 *
+	 * In order to create a memory allocation, the allocator looks for an
+	 * adjacent group of cleared bits. This does leave the algorithm open
+	 * to fragmentation issues, but is deemed sufficient for now.
+	 * If successful, the allocator shall mark all the pages as allocated
+	 * and increment the offset accordingly.
+	 *
+	 * Allocations of 64 pages or more (order 6) can be allocated only with
+	 * 64-page alignment, in order to keep the algorithm as simple as
+	 * possible. ie, starting from bit 0 of any 64-bit page-allocation
+	 * bitfield. For this, the large-granularity allocator is utilised.
+	 *
+	 * Allocations of lower-order can only be allocated entirely within the
+	 * same group of 64 pages, with the small-ganularity allocator  (ie
+	 * always from the same 64-bit page-allocation bitfield) - again, to
+	 * keep things as simple as possible, but flexible to meet
+	 * current needs.
+	 */
+
+	num_pages_to_alloc = (size_t)1 << order;
+
+	pma = devm_kzalloc(epma_dev->dev, sizeof(*pma), GFP_KERNEL);
+	if (!pma) {
+		dev_err(epma_dev->dev, "Failed to alloc pma struct");
+		return NULL;
+	}
+
+	spin_lock(&epma_dev->rmem_lock);
+
+	if (epma_dev->num_free_pages < num_pages_to_alloc) {
+		dev_err(epma_dev->dev, "not enough free pages\n");
+		devm_kfree(epma_dev->dev, pma);
+		spin_unlock(&epma_dev->rmem_lock);
+		return NULL;
+	}
+
+	/*
+	 * For order 0-5 (ie, 1 to 32 pages) we always allocate within the same set of 64 pages
+	 * Currently, most allocations will be very small (1 page), so the more likely path
+	 * here is order < ORDER_OF_PAGES_PER_BITFIELD_ELEM.
+	 */
+	if (likely(order < ORDER_OF_PAGES_PER_BITFIELD_ELEM)) {
+		size_t alloc_pages_bitmap_size = ALLOC_PAGES_BITFIELD_ARR_SIZE(epma_dev->rmem_size);
+
+		for (i = 0; i < alloc_pages_bitmap_size; i++) {
+			count = 0;
+
+			for (bit = 0; bit < PAGES_PER_BITFIELD_ELEM; bit++) {
+				if  (0 == (bitfields[i] & (1ULL << bit))) {
+					if ((count + 1) >= num_pages_to_alloc) {
+						/*
+						 * We've found enough free, consecutive pages with which to
+						 * make an allocation
+						 */
+						small_granularity_alloc(
+							epma_dev, i,
+							bit - count, order,
+							pma);
+
+						epma_dev->num_free_pages -=
+							num_pages_to_alloc;
+
+						spin_unlock(
+							&epma_dev->rmem_lock);
+						return pma;
+					}
+
+					/* So far so good, but we need more set bits yet */
+					count++;
+				} else {
+					/*
+					 * We found an allocated page, so nothing we've seen so far can be used.
+					 * Keep looking.
+					 */
+					count = 0;
+				}
+			}
+		}
+	} else {
+		/**
+		 * For allocations of order ORDER_OF_PAGES_PER_BITFIELD_ELEM and above (>= 64 pages), we know
+		 * we'll only get allocations for whole groups of 64 pages, which hugely simplifies the task.
+		 */
+		size_t alloc_pages_bitmap_size = ALLOC_PAGES_BITFIELD_ARR_SIZE(epma_dev->rmem_size);
+
+		/* How many 64-bit bitfield elements will be needed for the allocation? */
+		size_t num_bitfield_elements_needed = num_pages_to_alloc / PAGES_PER_BITFIELD_ELEM;
+
+		count = 0;
+
+		for (i = 0; i < alloc_pages_bitmap_size; i++) {
+			/* Are all the pages free for the i'th u64 bitfield element? */
+			if (bitfields[i] == 0) {
+				count += PAGES_PER_BITFIELD_ELEM;
+
+				if (count >= (1 << order)) {
+					size_t start_idx = (i + 1) - num_bitfield_elements_needed;
+
+					large_granularity_alloc(epma_dev,
+								start_idx,
+								order, pma);
+
+					epma_dev->num_free_pages -= 1 << order;
+					spin_unlock(&epma_dev->rmem_lock);
+					return pma;
+				}
+			}
+			else
+			{
+				count = 0;
+			}
+		}
+	}
+
+	spin_unlock(&epma_dev->rmem_lock);
+	devm_kfree(epma_dev->dev, pma);
+
+	dev_err(epma_dev->dev, "not enough contiguous pages (need %zu), total free pages left %zu\n",
+		num_pages_to_alloc, epma_dev->num_free_pages);
+	return NULL;
+}
+
+static phys_addr_t simple_pma_get_phys_addr(
+	struct protected_memory_allocator_device *pma_dev,
+	struct protected_memory_allocation *pma)
+{
+	struct simple_pma_device *const epma_dev =
+		container_of(pma_dev, struct simple_pma_device, pma_dev);
+
+	dev_dbg(epma_dev->dev, "%s(pma_dev=%px, pma=%px, pa=%llx\n",
+		__func__, (void *)pma_dev, (void *)pma,
+		(unsigned long long)pma->pa);
+
+	return pma->pa;
+}
+
+static void simple_pma_free_page(
+	struct protected_memory_allocator_device *pma_dev,
+	struct protected_memory_allocation *pma)
+{
+	struct simple_pma_device *const epma_dev =
+		container_of(pma_dev, struct simple_pma_device, pma_dev);
+	size_t num_pages_in_allocation;
+	size_t offset;
+	size_t i;
+	size_t bitfield_idx;
+	size_t bitfield_start_bit;
+	size_t page_num;
+	u64 *bitfield;
+	size_t alloc_pages_bitmap_size;
+	size_t num_bitfield_elems_used_by_alloc;
+
+	WARN_ON(pma == NULL);
+
+	dev_dbg(epma_dev->dev, "%s(pma_dev=%px, pma=%px, pa=%llx\n",
+		__func__, (void *)pma_dev, (void *)pma,
+		(unsigned long long)pma->pa);
+
+	WARN_ON(pma->pa < epma_dev->rmem_base);
+
+	/* This is an example function that follows an extremely simple logic
+	 * and is vulnerable to abuse.
+	 */
+	offset = (pma->pa - epma_dev->rmem_base);
+	num_pages_in_allocation = (size_t)1 << pma->order;
+
+	/* The number of bitfield elements used by the allocation */
+	num_bitfield_elems_used_by_alloc = num_pages_in_allocation / PAGES_PER_BITFIELD_ELEM;
+
+	/* The page number of the first page of the allocation, relative to rmem_base */
+	page_num = offset >> PAGE_SHIFT;
+
+	/* Which u64 bitfield refers to this page? */
+	bitfield_idx = page_num / PAGES_PER_BITFIELD_ELEM;
+
+	alloc_pages_bitmap_size = ALLOC_PAGES_BITFIELD_ARR_SIZE(epma_dev->rmem_size);
+
+	/* Is the allocation within expected bounds? */
+	WARN_ON((bitfield_idx + num_bitfield_elems_used_by_alloc) >= alloc_pages_bitmap_size);
+
+	spin_lock(&epma_dev->rmem_lock);
+
+	if (pma->order < ORDER_OF_PAGES_PER_BITFIELD_ELEM) {
+		bitfield = &epma_dev->allocated_pages_bitfield_arr[bitfield_idx];
+
+		/* Which bit within that u64 bitfield is the lsb covering this allocation?  */
+		bitfield_start_bit = page_num % PAGES_PER_BITFIELD_ELEM;
+
+		/* Clear the bits for the pages we're now freeing */
+		*bitfield &= ~(((1ULL << num_pages_in_allocation) - 1) << bitfield_start_bit);
+	}
+	else {
+		WARN(page_num % PAGES_PER_BITFIELD_ELEM,
+		     "%s: Expecting allocs of order >= %d to be %zu-page aligned\n",
+		     __FUNCTION__, ORDER_OF_PAGES_PER_BITFIELD_ELEM, PAGES_PER_BITFIELD_ELEM);
+
+		for (i = 0; i < num_bitfield_elems_used_by_alloc; i++) {
+			bitfield = &epma_dev->allocated_pages_bitfield_arr[bitfield_idx + i];
+
+			/* We expect all bits to be set (all pages allocated) */
+			WARN((*bitfield != ~0),
+			     "%s: alloc being freed is not fully allocated: of=%zu np=%zu bf=%.16llx\n",
+			     __FUNCTION__, offset, num_pages_in_allocation, *bitfield);
+
+			/*
+			 * Now clear all the bits in the bitfield element to mark all the pages
+			 * it refers to as free.
+			 */
+			*bitfield = 0ULL;
+		}
+	}
+
+	epma_dev->num_free_pages += num_pages_in_allocation;
+	spin_unlock(&epma_dev->rmem_lock);
+	devm_kfree(epma_dev->dev, pma);
+}
+
+static int protected_memory_allocator_probe(struct platform_device *pdev)
+{
+	struct simple_pma_device *epma_dev;
+	struct device_node *np;
+	phys_addr_t rmem_base;
+	size_t rmem_size;
+	size_t alloc_bitmap_pages_arr_size;
+#if (KERNEL_VERSION(4, 15, 0) <= LINUX_VERSION_CODE)
+	struct reserved_mem *rmem;
+#endif
+
+	np = pdev->dev.of_node;
+
+	if (!np) {
+		dev_err(&pdev->dev, "device node pointer not set\n");
+		return -ENODEV;
+	}
+
+	np = of_parse_phandle(np, "memory-region", 0);
+	if (!np) {
+		dev_err(&pdev->dev, "memory-region node not set\n");
+		return -ENODEV;
+	}
+
+#if (KERNEL_VERSION(4, 15, 0) <= LINUX_VERSION_CODE)
+	rmem = of_reserved_mem_lookup(np);
+	if (rmem) {
+		rmem_base = rmem->base;
+		rmem_size = rmem->size >> PAGE_SHIFT;
+	} else
+#endif
+	{
+		of_node_put(np);
+		dev_err(&pdev->dev, "could not read reserved memory-region\n");
+		return -ENODEV;
+	}
+
+	of_node_put(np);
+	epma_dev = devm_kzalloc(&pdev->dev, sizeof(*epma_dev), GFP_KERNEL);
+	if (!epma_dev)
+		return -ENOMEM;
+
+	epma_dev->pma_dev.ops.pma_alloc_page = simple_pma_alloc_page;
+	epma_dev->pma_dev.ops.pma_get_phys_addr = simple_pma_get_phys_addr;
+	epma_dev->pma_dev.ops.pma_free_page = simple_pma_free_page;
+	epma_dev->pma_dev.owner = THIS_MODULE;
+	epma_dev->dev = &pdev->dev;
+	epma_dev->rmem_base = rmem_base;
+	epma_dev->rmem_size = rmem_size;
+	epma_dev->num_free_pages = rmem_size;
+	spin_lock_init(&epma_dev->rmem_lock);
+
+	alloc_bitmap_pages_arr_size = ALLOC_PAGES_BITFIELD_ARR_SIZE(epma_dev->rmem_size);
+
+	epma_dev->allocated_pages_bitfield_arr = devm_kzalloc(&pdev->dev,
+		alloc_bitmap_pages_arr_size * BITFIELD_ELEM_SIZE, GFP_KERNEL);
+
+	if (!epma_dev->allocated_pages_bitfield_arr) {
+		dev_err(&pdev->dev, "failed to allocate resources\n");
+		devm_kfree(&pdev->dev, epma_dev);
+		return -ENOMEM;
+	}
+
+	if (epma_dev->rmem_size % PAGES_PER_BITFIELD_ELEM) {
+		size_t extra_pages =
+			alloc_bitmap_pages_arr_size * PAGES_PER_BITFIELD_ELEM -
+			epma_dev->rmem_size;
+		size_t last_bitfield_index = alloc_bitmap_pages_arr_size - 1;
+
+		/* Mark the extra pages (that lie outside the reserved range) as
+		 * always in use.
+		 */
+		epma_dev->allocated_pages_bitfield_arr[last_bitfield_index] =
+			((1ULL << extra_pages) - 1) <<
+			(PAGES_PER_BITFIELD_ELEM - extra_pages);
+	}
+
+	platform_set_drvdata(pdev, &epma_dev->pma_dev);
+	dev_info(&pdev->dev,
+		"Protected memory allocator probed successfully\n");
+	dev_info(&pdev->dev, "Protected memory region: base=%llx num pages=%zu\n",
+		(unsigned long long)rmem_base, rmem_size);
+
+	return 0;
+}
+
+static int protected_memory_allocator_remove(struct platform_device *pdev)
+{
+	struct protected_memory_allocator_device *pma_dev =
+		platform_get_drvdata(pdev);
+	struct simple_pma_device *epma_dev;
+	struct device *dev;
+
+	if (!pma_dev)
+		return -EINVAL;
+
+	epma_dev = container_of(pma_dev, struct simple_pma_device, pma_dev);
+	dev = epma_dev->dev;
+
+	if (epma_dev->num_free_pages < epma_dev->rmem_size) {
+		dev_warn(&pdev->dev, "Leaking %zu pages of protected memory\n",
+			epma_dev->rmem_size - epma_dev->num_free_pages);
+	}
+
+	platform_set_drvdata(pdev, NULL);
+	devm_kfree(dev, epma_dev->allocated_pages_bitfield_arr);
+	devm_kfree(dev, epma_dev);
+
+	dev_info(&pdev->dev,
+		"Protected memory allocator removed successfully\n");
+
+	return 0;
+}
+
+static const struct of_device_id protected_memory_allocator_dt_ids[] = {
+	{ .compatible = "arm,protected-memory-allocator" },
+	{ /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, protected_memory_allocator_dt_ids);
+
+static struct platform_driver protected_memory_allocator_driver = {
+	.probe = protected_memory_allocator_probe,
+	.remove = protected_memory_allocator_remove,
+	.driver = {
+		.name = "simple_protected_memory_allocator",
+		.of_match_table = of_match_ptr(protected_memory_allocator_dt_ids),
+	}
+};
+
+module_platform_driver(protected_memory_allocator_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("ARM Ltd.");
+MODULE_VERSION("1.0");
diff --git a/drivers/base/memory_group_manager/build.bp b/drivers/base/memory_group_manager/build.bp
deleted file mode 100644
index 04dbfd3a51de..000000000000
--- a/drivers/base/memory_group_manager/build.bp
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- */
-
-bob_kernel_module {
-    name: "memory_group_manager",
-    srcs: [
-        "Kbuild",
-        "memory_group_manager.c",
-    ],
-    kbuild_options: ["CONFIG_MALI_MEMORY_GROUP_MANAGER=m"],
-    defaults: ["kernel_defaults"],
-}
diff --git a/drivers/gpu/arm/Kbuild b/drivers/gpu/arm/Kbuild
index 62b4706f7326..f747fc889b5b 100644
--- a/drivers/gpu/arm/Kbuild
+++ b/drivers/gpu/arm/Kbuild
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2012 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2012, 2020 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,8 +16,6 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
 obj-$(CONFIG_MALI_MIDGARD) += midgard/
diff --git a/drivers/gpu/arm/Kconfig b/drivers/gpu/arm/Kconfig
index 64ede484d1dc..398a8e50a4cd 100644
--- a/drivers/gpu/arm/Kconfig
+++ b/drivers/gpu/arm/Kconfig
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
 # (C) COPYRIGHT 2012 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,8 +16,6 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 #
 source "drivers/gpu/arm/mali400/mali/Kconfig"
diff --git a/drivers/gpu/arm/bifrost/Kbuild b/drivers/gpu/arm/bifrost/Kbuild
index c05dc8399027..8b4ece17cfe5 100644
--- a/drivers/gpu/arm/bifrost/Kbuild
+++ b/drivers/gpu/arm/bifrost/Kbuild
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2012-2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2012-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,16 +16,14 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
 # Driver version string which is returned to userspace via an ioctl
-MALI_RELEASE_NAME ?= "g2p0-01eac0"
+MALI_RELEASE_NAME ?= '"g6p0-01eac0"'
 
 # Paths required for build
 
-# make $(src) as absolute path if it isn't already, by prefixing $(srctree)
+# make $(src) as absolute path if it is not already, by prefixing $(srctree)
 src:=$(if $(patsubst /%,,$(src)),$(srctree)/$(src),$(src))
 KBASE_PATH = $(src)
 KBASE_PLATFORM_PATH = $(KBASE_PATH)/platform_dummy
@@ -32,11 +31,8 @@ UMP_PATH = $(src)/../../../base
 
 # Set up defaults if not defined by build system
 MALI_CUSTOMER_RELEASE ?= 1
-MALI_USE_CSF ?= 0
 MALI_UNIT_TEST ?= 0
-MALI_KERNEL_TEST_API ?= 0
 MALI_COVERAGE ?= 0
-MALI_JIT_PRESSURE_LIMIT_BASE ?= 1
 CONFIG_MALI_PLATFORM_NAME ?= "devicetree"
 # Experimental features (corresponding -D definition should be appended to
 # DEFINES below, e.g. for MALI_EXPERIMENTAL_FEATURE,
@@ -46,6 +42,20 @@ CONFIG_MALI_PLATFORM_NAME ?= "devicetree"
 # MALI_EXPERIMENTAL_FEATURE ?= 0
 MALI_INCREMENTAL_RENDERING ?= 0
 
+ifeq ($(CONFIG_MALI_CSF_SUPPORT),y)
+MALI_JIT_PRESSURE_LIMIT_BASE = 0
+MALI_USE_CSF = 1
+else
+MALI_JIT_PRESSURE_LIMIT_BASE ?= 1
+MALI_USE_CSF ?= 0
+endif
+
+ifneq ($(CONFIG_MALI_KUTF), n)
+MALI_KERNEL_TEST_API ?= 1
+else
+MALI_KERNEL_TEST_API ?= 0
+endif
+
 # Set up our defines, which will be passed to gcc
 DEFINES = \
 	-DMALI_CUSTOMER_RELEASE=$(MALI_CUSTOMER_RELEASE) \
@@ -53,7 +63,7 @@ DEFINES = \
 	-DMALI_KERNEL_TEST_API=$(MALI_KERNEL_TEST_API) \
 	-DMALI_UNIT_TEST=$(MALI_UNIT_TEST) \
 	-DMALI_COVERAGE=$(MALI_COVERAGE) \
-	-DMALI_RELEASE_NAME=\"$(MALI_RELEASE_NAME)\" \
+	-DMALI_RELEASE_NAME=$(MALI_RELEASE_NAME) \
 	-DMALI_JIT_PRESSURE_LIMIT_BASE=$(MALI_JIT_PRESSURE_LIMIT_BASE) \
 	-DMALI_INCREMENTAL_RENDERING=$(MALI_INCREMENTAL_RENDERING)
 
@@ -90,7 +100,6 @@ SRC := \
 	mali_kbase_config.c \
 	mali_kbase_vinstr.c \
 	mali_kbase_hwcnt.c \
-	mali_kbase_hwcnt_backend_jm.c \
 	mali_kbase_hwcnt_gpu.c \
 	mali_kbase_hwcnt_legacy.c \
 	mali_kbase_hwcnt_types.c \
@@ -104,7 +113,6 @@ SRC := \
 	mali_kbase_mem_profile_debugfs.c \
 	mmu/mali_kbase_mmu.c \
 	mmu/mali_kbase_mmu_hw_direct.c \
-	mmu/mali_kbase_mmu_mode_lpae.c \
 	mmu/mali_kbase_mmu_mode_aarch64.c \
 	mali_kbase_disjoint_events.c \
 	mali_kbase_debug_mem_view.c \
@@ -115,6 +123,7 @@ SRC := \
 	mali_kbase_strings.c \
 	mali_kbase_as_fault_debugfs.c \
 	mali_kbase_regs_history_debugfs.c \
+	mali_kbase_dvfs_debugfs.c \
 	mali_power_gpu_frequency_trace.c \
 	mali_kbase_trace_gpu_mem.c \
 	thirdparty/mali_kbase_mmap.c \
@@ -126,6 +135,8 @@ SRC := \
 
 ifeq ($(MALI_USE_CSF),1)
 	SRC += \
+		mali_kbase_hwcnt_backend_csf.c \
+		mali_kbase_hwcnt_backend_csf_if_fw.c \
 		debug/backend/mali_kbase_debug_ktrace_csf.c \
 		device/backend/mali_kbase_device_csf.c \
 		device/backend/mali_kbase_device_hw_csf.c \
@@ -135,6 +146,7 @@ ifeq ($(MALI_USE_CSF),1)
 		context/backend/mali_kbase_context_csf.c
 else
 	SRC += \
+		mali_kbase_hwcnt_backend_jm.c \
 		mali_kbase_dummy_job_wa.c \
 		mali_kbase_debug_job_fault.c \
 		mali_kbase_event.c \
@@ -156,9 +168,6 @@ ifeq ($(CONFIG_MALI_CINSTR_GWT),y)
 	SRC += mali_kbase_gwt.c
 endif
 
-ifeq ($(MALI_UNIT_TEST),1)
-	SRC += tl/mali_kbase_timeline_test.c
-endif
 
 ifeq ($(MALI_CUSTOMER_RELEASE),0)
 	SRC += mali_kbase_regs_dump_debugfs.c
diff --git a/drivers/gpu/arm/bifrost/Kconfig b/drivers/gpu/arm/bifrost/Kconfig
index 868b3d319727..fdbeafc010fb 100644
--- a/drivers/gpu/arm/bifrost/Kconfig
+++ b/drivers/gpu/arm/bifrost/Kconfig
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2012-2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2012-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,8 +16,6 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
 
@@ -31,6 +30,13 @@ menuconfig MALI_BIFROST
 	  To compile this driver as a module, choose M here:
 	  this will generate a single module, called mali_kbase.
 
+config MALI_CSF_SUPPORT
+	bool "Mali CSF based GPU support"
+	depends on MALI_BIFROST=m
+	default n
+	help
+	  Enables support for CSF based GPUs.
+
 config MALI_BIFROST_GATOR_SUPPORT
 	bool "Enable Streamline tracing support"
 	depends on MALI_BIFROST
@@ -277,10 +283,20 @@ config MALI_JOB_DUMP
 	  minimal overhead when not in use. Enable only if you know what
 	  you are doing.
 
+choice
+	prompt "Performance counters set"
+	default MALI_PRFCNT_SET_PRIMARY
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
+
+config MALI_PRFCNT_SET_PRIMARY
+	bool "Primary"
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
+	help
+	  Select this option to use primary set of performance counters.
+
 config MALI_BIFROST_PRFCNT_SET_SECONDARY
-	bool "Use secondary set of performance counters"
+	bool "Secondary"
 	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
-	default n
 	help
 	  Select this option to use secondary set of performance counters. Kernel
 	  features that depend on an access to the primary set of counters may
@@ -288,21 +304,43 @@ config MALI_BIFROST_PRFCNT_SET_SECONDARY
 	  from working optimally and may cause instrumentation tools to return
 	  bogus results.
 
-	  If unsure, say N.
+	  If unsure, use MALI_PRFCNT_SET_PRIMARY.
+
+config MALI_PRFCNT_SET_TERTIARY
+	bool "Tertiary"
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
+	help
+	  Select this option to use tertiary set of performance counters. Kernel
+	  features that depend on an access to the primary set of counters may
+	  become unavailable. Enabling this option will prevent power management
+	  from working optimally and may cause instrumentation tools to return
+	  bogus results.
+
+	  If unsure, use MALI_PRFCNT_SET_PRIMARY.
 
-config MALI_PRFCNT_SET_SECONDARY_VIA_DEBUG_FS
-	bool "Use secondary set of performance counters"
-	depends on MALI_BIFROST && MALI_BIFROST_EXPERT && !MALI_BIFROST_PRFCNT_SET_SECONDARY && DEBUG_FS
+endchoice
+
+config MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS
+	bool "Allow runtime selection of performance counters set via debugfs"
+	depends on MALI_BIFROST && MALI_BIFROST_EXPERT && DEBUG_FS
 	default n
 	help
 	  Select this option to make the secondary set of performance counters
 	  available at runtime via debugfs. Kernel features that depend on an
 	  access to the primary set of counters may become unavailable.
 
+	  If no runtime debugfs option is set, the build time counter set
+	  choice will be used.
+
 	  This feature is unsupported and unstable, and may break at any time.
 	  Enabling this option will prevent power management from working
 	  optimally and may cause instrumentation tools to return bogus results.
 
+	  No validation is done on the debugfs input. Invalid input could cause
+	  performance counter errors. Valid inputs are the values accepted by
+	  the SET_SELECT bits of the PRFCNT_CONFIG register as defined in the
+	  architecture specification.
+
 	  If unsure, say N.
 
 source "drivers/gpu/arm/midgard/platform/Kconfig"
diff --git a/drivers/gpu/arm/bifrost/Makefile b/drivers/gpu/arm/bifrost/Makefile
index 53a12094ec14..89760d9f850a 100644
--- a/drivers/gpu/arm/bifrost/Makefile
+++ b/drivers/gpu/arm/bifrost/Makefile
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2010-2019 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,24 +16,49 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
+# Handle Android Common Kernel source naming
+KERNEL_SRC ?= /lib/modules/$(shell uname -r)/build
+KDIR ?= $(KERNEL_SRC)
 
-KDIR ?= /lib/modules/$(shell uname -r)/build
+# out-of-tree
+ifeq ($(KBUILD_EXTMOD),)
+export CONFIG_MALI_MIDGARD?=m
 
-BUSLOG_PATH_RELATIVE = $(CURDIR)/../../../..
-KBASE_PATH_RELATIVE = $(CURDIR)
+ifneq ($(CONFIG_MALI_MIDGARD),n)
+export CONFIG_MALI_CSF_SUPPORT?=n
+export CONFIG_MALI_KUTF?=m
+export CONFIG_MALI_REAL_HW?=y
 
-ifeq ($(CONFIG_MALI_BUSLOG),y)
-#Add bus logger symbols
-EXTRA_SYMBOLS += $(BUSLOG_PATH_RELATIVE)/drivers/base/bus_logger/Module.symvers
+# Handle default y/m in Kconfig
+export CONFIG_MALI_BIFROST_GATOR_SUPPORT?=y
+export CONFIG_MALI_BIFROST_DEVFREQ?=n
+ifneq ($(CONFIG_PM_DEVFREQ),n)
+export CONFIG_MALI_BIFROST_DEVFREQ?=y
 endif
 
+DEFINES += -DCONFIG_MALI_MIDGARD=$(CONFIG_MALI_MIDGARD) \
+	-DCONFIG_MALI_CSF_SUPPORT=$(CONFIG_MALI_CSF_SUPPORT) \
+	-DCONFIG_MALI_KUTF=$(CONFIG_MALI_KUTF) \
+	-DCONFIG_MALI_REAL_HW=$(CONFIG_MALI_REAL_HW) \
+	-DCONFIG_MALI_GATOR_SUPPORT=$(CONFIG_MALI_BIFROST_GATOR_SUPPORT) \
+	-DCONFIG_MALI_DEVFREQ=$(CONFIG_MALI_BIFROST_DEVFREQ)
+
+export DEFINES
+
+endif
+endif
+
+KBASE_PATH_RELATIVE = $(CURDIR)
+
+
 # we get the symbols from modules using KBUILD_EXTRA_SYMBOLS to prevent warnings about unknown functions
 all:
 	$(MAKE) -C $(KDIR) M=$(CURDIR) EXTRA_CFLAGS="-I$(CURDIR)/../../../../include -I$(CURDIR)/../../../../tests/include $(SCONS_CFLAGS)" $(SCONS_CONFIGS) KBUILD_EXTRA_SYMBOLS="$(EXTRA_SYMBOLS)" modules
 
+modules_install:
+	$(MAKE) -C $(KDIR) M=$(CURDIR) modules_install
+
 clean:
 	$(MAKE) -C $(KDIR) M=$(CURDIR) clean
diff --git a/drivers/gpu/arm/bifrost/Makefile.kbase b/drivers/gpu/arm/bifrost/Makefile.kbase
index 6b0f81ee76e8..6d97f197670b 100644
--- a/drivers/gpu/arm/bifrost/Makefile.kbase
+++ b/drivers/gpu/arm/bifrost/Makefile.kbase
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2010, 2013, 2018 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2010, 2013, 2018-2020 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,9 +16,6 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
 EXTRA_CFLAGS += -I$(ROOT) -I$(KBASE_PATH) -I$(KBASE_PATH)/platform_$(PLATFORM)
-
diff --git a/drivers/gpu/arm/bifrost/Mconfig b/drivers/gpu/arm/bifrost/Mconfig
index 99ababfc2d16..7d6695d5eae7 100644
--- a/drivers/gpu/arm/bifrost/Mconfig
+++ b/drivers/gpu/arm/bifrost/Mconfig
@@ -1,17 +1,22 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2012-2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2012-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can access it online at
+# http://www.gnu.org/licenses/gpl-2.0.html.
 #
 #
-
 
 menuconfig MALI_BIFROST
 	bool "Mali Midgard series support"
@@ -22,6 +27,13 @@ menuconfig MALI_BIFROST
 	  To compile this driver as a module, choose M here:
 	  this will generate a single module, called mali_kbase.
 
+config MALI_CSF_SUPPORT
+	bool "Mali CSF based GPU support"
+	depends on MALI_BIFROST
+	default n
+	help
+	  Enables support for CSF based GPUs.
+
 config MALI_BIFROST_GATOR_SUPPORT
 	bool "Enable Streamline tracing support"
 	depends on MALI_BIFROST && !BACKEND_USER
@@ -272,6 +284,9 @@ config MALI_GEM5_BUILD
 # Instrumentation options.
 
 # config MALI_JOB_DUMP exists in the Kernel Kconfig but is configured using CINSTR_JOB_DUMP in Mconfig.
+# config MALI_PRFCNT_SET_PRIMARY exists in the Kernel Kconfig but is configured using CINSTR_PRIMARY_HWC in Mconfig.
 # config MALI_BIFROST_PRFCNT_SET_SECONDARY exists in the Kernel Kconfig but is configured using CINSTR_SECONDARY_HWC in Mconfig.
+# config MALI_PRFCNT_SET_TERTIARY exists in the Kernel Kconfig but is configured using CINSTR_TERTIARY_HWC in Mconfig.
+# config MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS exists in the Kernel Kconfig but is configured using CINSTR_HWC_SET_SELECT_VIA_DEBUG_FS in Mconfig.
 
 source "kernel/drivers/gpu/arm/midgard/tests/Mconfig"
diff --git a/drivers/gpu/arm/bifrost/arbiter/Kbuild b/drivers/gpu/arm/bifrost/arbiter/Kbuild
index 98e47bed223a..4c04cabce93c 100644
--- a/drivers/gpu/arm/bifrost/arbiter/Kbuild
+++ b/drivers/gpu/arm/bifrost/arbiter/Kbuild
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
 # (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,10 +16,8 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
-mali_kbase-y += \
+bifrost_kbase-y += \
 	arbiter/mali_kbase_arbif.o \
 	arbiter/mali_kbase_arbiter_pm.o
diff --git a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbif.c b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbif.c
index ddf1a0ce0b05..7d6ab0cd95c7 100644
--- a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbif.c
+++ b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbif.c
@@ -1,13 +1,12 @@
 // SPDX-License-Identifier: GPL-2.0
-
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,13 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
- * @file mali_kbase_arbif.c
- * Mali arbiter interface APIs to share GPU between Virtual Machines
+ * DOC: Mali arbiter interface APIs to share GPU between Virtual Machines
  */
 
 #include <mali_kbase.h>
@@ -34,29 +30,148 @@
 #include <linux/of_platform.h>
 #include "mali_kbase_arbiter_interface.h"
 
+/* Arbiter interface version against which was implemented this module */
+#define MALI_REQUIRED_KBASE_ARBITER_INTERFACE_VERSION 5
+#if MALI_REQUIRED_KBASE_ARBITER_INTERFACE_VERSION != \
+			MALI_KBASE_ARBITER_INTERFACE_VERSION
+#error "Unsupported Mali Arbiter interface version."
+#endif
+
+static void on_max_config(struct device *dev, uint32_t max_l2_slices,
+			  uint32_t max_core_mask)
+{
+	struct kbase_device *kbdev;
+
+	if (!dev) {
+		pr_err("%s(): dev is NULL", __func__);
+		return;
+	}
+
+	kbdev = dev_get_drvdata(dev);
+	if (!kbdev) {
+		dev_err(dev, "%s(): kbdev is NULL", __func__);
+		return;
+	}
+
+	if (!max_l2_slices || !max_core_mask) {
+		dev_dbg(dev,
+			"%s(): max_config ignored as one of the fields is zero",
+			__func__);
+		return;
+	}
+
+	/* set the max config info in the kbase device */
+	kbase_arbiter_set_max_config(kbdev, max_l2_slices, max_core_mask);
+}
+
+/**
+ * on_update_freq() - Updates GPU clock frequency
+ * @dev: arbiter interface device handle
+ * @freq: GPU clock frequency value reported from arbiter
+ *
+ * call back function to update GPU clock frequency with
+ * new value from arbiter
+ */
+static void on_update_freq(struct device *dev, uint32_t freq)
+{
+	struct kbase_device *kbdev;
+
+	if (!dev) {
+		pr_err("%s(): dev is NULL", __func__);
+		return;
+	}
+
+	kbdev = dev_get_drvdata(dev);
+	if (!kbdev) {
+		dev_err(dev, "%s(): kbdev is NULL", __func__);
+		return;
+	}
+
+	kbase_arbiter_pm_update_gpu_freq(&kbdev->arb.arb_freq, freq);
+}
+
+/**
+ * on_gpu_stop() - sends KBASE_VM_GPU_STOP_EVT event on VM stop
+ * @dev: arbiter interface device handle
+ *
+ * call back function to signal a GPU STOP event from arbiter interface
+ */
 static void on_gpu_stop(struct device *dev)
 {
-	struct kbase_device *kbdev = dev_get_drvdata(dev);
+	struct kbase_device *kbdev;
+
+	if (!dev) {
+		pr_err("%s(): dev is NULL", __func__);
+		return;
+	}
+
+	kbdev = dev_get_drvdata(dev);
+	if (!kbdev) {
+		dev_err(dev, "%s(): kbdev is NULL", __func__);
+		return;
+	}
 
 	KBASE_TLSTREAM_TL_ARBITER_STOP_REQUESTED(kbdev, kbdev);
 	kbase_arbiter_pm_vm_event(kbdev, KBASE_VM_GPU_STOP_EVT);
 }
 
+/**
+ * on_gpu_granted() - sends KBASE_VM_GPU_GRANTED_EVT event on GPU granted
+ * @dev: arbiter interface device handle
+ *
+ * call back function to signal a GPU GRANT event from arbiter interface
+ */
 static void on_gpu_granted(struct device *dev)
 {
-	struct kbase_device *kbdev = dev_get_drvdata(dev);
+	struct kbase_device *kbdev;
+
+	if (!dev) {
+		pr_err("%s(): dev is NULL", __func__);
+		return;
+	}
+
+	kbdev = dev_get_drvdata(dev);
+	if (!kbdev) {
+		dev_err(dev, "%s(): kbdev is NULL", __func__);
+		return;
+	}
 
 	KBASE_TLSTREAM_TL_ARBITER_GRANTED(kbdev, kbdev);
 	kbase_arbiter_pm_vm_event(kbdev, KBASE_VM_GPU_GRANTED_EVT);
 }
 
+/**
+ * on_gpu_lost() - sends KBASE_VM_GPU_LOST_EVT event  on GPU granted
+ * @dev: arbiter interface device handle
+ *
+ * call back function to signal a GPU LOST event from arbiter interface
+ */
 static void on_gpu_lost(struct device *dev)
 {
-	struct kbase_device *kbdev = dev_get_drvdata(dev);
+	struct kbase_device *kbdev;
+
+	if (!dev) {
+		pr_err("%s(): dev is NULL", __func__);
+		return;
+	}
+
+	kbdev = dev_get_drvdata(dev);
+	if (!kbdev) {
+		dev_err(dev, "%s(): kbdev is NULL", __func__);
+		return;
+	}
 
 	kbase_arbiter_pm_vm_event(kbdev, KBASE_VM_GPU_LOST_EVT);
 }
 
+/**
+ * kbase_arbif_init() - Kbase Arbiter interface initialisation.
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * Initialise Kbase Arbiter interface and assign callback functions.
+ *
+ * Return: 0 on success else a Linux error code
+ */
 int kbase_arbif_init(struct kbase_device *kbdev)
 {
 #ifdef CONFIG_OF
@@ -100,6 +215,12 @@ int kbase_arbif_init(struct kbase_device *kbdev)
 	ops.arb_vm_gpu_stop = on_gpu_stop;
 	ops.arb_vm_gpu_granted = on_gpu_granted;
 	ops.arb_vm_gpu_lost = on_gpu_lost;
+	ops.arb_vm_max_config = on_max_config;
+	ops.arb_vm_update_freq = on_update_freq;
+
+
+	kbdev->arb.arb_freq.arb_freq = 0;
+	mutex_init(&kbdev->arb.arb_freq.arb_freq_lock);
 
 	/* register kbase arbiter_if callbacks */
 	if (arb_if->vm_ops.vm_arb_register_dev) {
@@ -111,6 +232,7 @@ int kbase_arbif_init(struct kbase_device *kbdev)
 			return err;
 		}
 	}
+
 #else /* CONFIG_OF */
 	dev_dbg(kbdev->dev, "No arbiter without Device Tree support\n");
 	kbdev->arb.arb_dev = NULL;
@@ -119,6 +241,12 @@ int kbase_arbif_init(struct kbase_device *kbdev)
 	return 0;
 }
 
+/**
+ * kbase_arbif_destroy() - De-init Kbase arbiter interface
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * De-initialise Kbase arbiter interface
+ */
 void kbase_arbif_destroy(struct kbase_device *kbdev)
 {
 	struct arbiter_if_dev *arb_if = kbdev->arb.arb_if;
@@ -133,16 +261,45 @@ void kbase_arbif_destroy(struct kbase_device *kbdev)
 	kbdev->arb.arb_dev = NULL;
 }
 
+/**
+ * kbase_arbif_get_max_config() - Request max config info
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * call back function from arb interface to arbiter requesting max config info
+ */
+void kbase_arbif_get_max_config(struct kbase_device *kbdev)
+{
+	struct arbiter_if_dev *arb_if = kbdev->arb.arb_if;
+
+	if (arb_if && arb_if->vm_ops.vm_arb_get_max_config) {
+		dev_dbg(kbdev->dev, "%s\n", __func__);
+		arb_if->vm_ops.vm_arb_get_max_config(arb_if);
+	}
+}
+
+/**
+ * kbase_arbif_gpu_request() - Request GPU from
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * call back function from arb interface to arbiter requesting GPU for VM
+ */
 void kbase_arbif_gpu_request(struct kbase_device *kbdev)
 {
 	struct arbiter_if_dev *arb_if = kbdev->arb.arb_if;
 
 	if (arb_if && arb_if->vm_ops.vm_arb_gpu_request) {
 		dev_dbg(kbdev->dev, "%s\n", __func__);
+		KBASE_TLSTREAM_TL_ARBITER_REQUESTED(kbdev, kbdev);
 		arb_if->vm_ops.vm_arb_gpu_request(arb_if);
 	}
 }
 
+/**
+ * kbase_arbif_gpu_stopped() - send GPU stopped message to the arbiter
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ * @gpu_required: GPU request flag
+ *
+ */
 void kbase_arbif_gpu_stopped(struct kbase_device *kbdev, u8 gpu_required)
 {
 	struct arbiter_if_dev *arb_if = kbdev->arb.arb_if;
@@ -154,6 +311,12 @@ void kbase_arbif_gpu_stopped(struct kbase_device *kbdev, u8 gpu_required)
 	}
 }
 
+/**
+ * kbase_arbif_gpu_active() - Sends a GPU_ACTIVE message to the Arbiter
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * Informs the arbiter VM is active
+ */
 void kbase_arbif_gpu_active(struct kbase_device *kbdev)
 {
 	struct arbiter_if_dev *arb_if = kbdev->arb.arb_if;
@@ -164,6 +327,12 @@ void kbase_arbif_gpu_active(struct kbase_device *kbdev)
 	}
 }
 
+/**
+ * kbase_arbif_gpu_idle() - Inform the arbiter that the VM has gone idle
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * Informs the arbiter VM is idle
+ */
 void kbase_arbif_gpu_idle(struct kbase_device *kbdev)
 {
 	struct arbiter_if_dev *arb_if = kbdev->arb.arb_if;
diff --git a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbif.h b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbif.h
index e7e9de76c94c..710559c4fe02 100644
--- a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbif.h
+++ b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbif.h
@@ -1,28 +1,7 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, you can access it online at
- * http://www.gnu.org/licenses/gpl-2.0.html.
- *
- * SPDX-License-Identifier: GPL-2.0
- *
- *//* SPDX-License-Identifier: GPL-2.0 */
-
-/*
- *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -38,12 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- *
  */
 
 /**
- * @file
- * Mali arbiter interface APIs to share GPU between Virtual Machines
+ * DOC: Mali arbiter interface APIs to share GPU between Virtual Machines
  */
 
 #ifndef _MALI_KBASE_ARBIF_H_
@@ -94,6 +71,14 @@ int kbase_arbif_init(struct kbase_device *kbdev);
  */
 void kbase_arbif_destroy(struct kbase_device *kbdev);
 
+/**
+ * kbase_arbif_get_max_config() - Request max config info
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * call back function from arb interface to arbiter requesting max config info
+ */
+void kbase_arbif_get_max_config(struct kbase_device *kbdev);
+
 /**
  * kbase_arbif_gpu_request() - Send GPU request message to the arbiter
  * @kbdev: The kbase device structure for the device (must be a valid pointer)
diff --git a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_defs.h b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_defs.h
index 1f53cbf1a286..586c5d4f69db 100644
--- a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_defs.h
+++ b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_defs.h
@@ -1,28 +1,7 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, you can access it online at
- * http://www.gnu.org/licenses/gpl-2.0.html.
- *
- * SPDX-License-Identifier: GPL-2.0
- *
- *//* SPDX-License-Identifier: GPL-2.0 */
-
-/*
- *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -38,7 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- *
  */
 
 /**
@@ -66,7 +44,8 @@
  * @vm_resume_work:  Work item for vm_arb_wq to resume current work on GPU
  * @vm_arb_starting: Work queue resume in progress
  * @vm_arb_stopping: Work queue suspend in progress
- * @vm_arb_users_waiting: Count of users waiting for GPU
+ * @interrupts_installed: Flag set when interrupts are installed
+ * @vm_request_timer: Timer to monitor GPU request
  */
 struct kbase_arbiter_vm_state {
 	struct kbase_device *kbdev;
@@ -78,7 +57,8 @@ struct kbase_arbiter_vm_state {
 	struct work_struct vm_resume_work;
 	bool vm_arb_starting;
 	bool vm_arb_stopping;
-	int vm_arb_users_waiting;
+	bool interrupts_installed;
+	struct hrtimer vm_request_timer;
 };
 
 /**
@@ -86,10 +66,12 @@ struct kbase_arbiter_vm_state {
  *                               allocated from the probe method of Mali driver
  * @arb_if:                 Pointer to the arbiter interface device
  * @arb_dev:                Pointer to the arbiter device
+ * @arb_freq:               GPU clock frequency retrieved from arbiter.
  */
 struct kbase_arbiter_device {
 	struct arbiter_if_dev *arb_if;
 	struct device *arb_dev;
+	struct kbase_arbiter_freq arb_freq;
 };
 
 #endif /* _MALI_KBASE_ARBITER_DEFS_H_ */
diff --git a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_interface.h b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_interface.h
index 5d5d8a7d2cff..84389e828f4d 100644
--- a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_interface.h
+++ b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_interface.h
@@ -1,28 +1,7 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, you can access it online at
- * http://www.gnu.org/licenses/gpl-2.0.html.
- *
- * SPDX-License-Identifier: GPL-2.0
- *
- *//* SPDX-License-Identifier: GPL-2.0 */
-
-/*
- *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -38,7 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- *
  */
 
 /**
@@ -50,7 +28,7 @@
 #define _MALI_KBASE_ARBITER_INTERFACE_H_
 
 /**
- * @brief Mali arbiter interface version
+ *  Mali arbiter interface version
  *
  * This specifies the current version of the configuration interface. Whenever
  * the arbiter interface changes, so that integration effort is required, the
@@ -61,8 +39,15 @@
  * 1 - Added the Mali arbiter configuration interface.
  * 2 - Strip out reference code from header
  * 3 - Removed DVFS utilization interface (DVFS moved to arbiter side)
+ * 4 - Added max_config support
+ * 5 - Added GPU clock frequency reporting support from arbiter
  */
-#define MALI_KBASE_ARBITER_INTERFACE_VERSION 3
+#define MALI_KBASE_ARBITER_INTERFACE_VERSION 5
+
+/**
+ * NO_FREQ is used in case platform doesn't support reporting frequency
+ */
+#define NO_FREQ 0
 
 struct arbiter_if_dev;
 
@@ -108,6 +93,27 @@ struct arbiter_if_arb_vm_ops {
 	 * If successful, will respond with a vm_arb_gpu_stopped message.
 	 */
 	void (*arb_vm_gpu_lost)(struct device *dev);
+
+	/**
+	 * arb_vm_max_config() - Send max config info to the VM
+	 * @dev: The arbif kernel module device.
+	 * @max_l2_slices: The maximum number of L2 slices.
+	 * @max_core_mask: The largest core mask.
+	 *
+	 * Informs KBase the maximum resources that can be allocated to the
+	 * partition in use.
+	 */
+	void (*arb_vm_max_config)(struct device *dev, uint32_t max_l2_slices,
+				  uint32_t max_core_mask);
+
+	/**
+	 * arb_vm_update_freq() - GPU clock frequency has been updated
+	 * @dev: The arbif kernel module device.
+	 * @freq: GPU clock frequency value reported from arbiter
+	 *
+	 * Informs KBase that the GPU clock frequency has been updated.
+	 */
+	void (*arb_vm_update_freq)(struct device *dev, uint32_t freq);
 };
 
 /**
@@ -136,6 +142,13 @@ struct arbiter_if_vm_arb_ops {
 	 */
 	void (*vm_arb_unregister_dev)(struct arbiter_if_dev *arbif_dev);
 
+	/**
+	 * vm_arb_gpu_get_max_config() - Request the max config from the
+	 * Arbiter.
+	 * @arbif_dev: The arbiter interface we want to issue the request.
+	 */
+	void (*vm_arb_get_max_config)(struct arbiter_if_dev *arbif_dev);
+
 	/**
 	 * vm_arb_gpu_request() - Ask the arbiter interface for GPU access.
 	 * @arbif_dev: The arbiter interface we want to issue the request.
diff --git a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_pm.c b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_pm.c
index 02b5de2436ea..456cc70753cd 100644
--- a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_pm.c
+++ b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_pm.c
@@ -1,13 +1,12 @@
 // SPDX-License-Identifier: GPL-2.0
-
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,12 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
- * @file mali_kbase_arbiter_pm.c
+ * @file
  * Mali arbiter power manager state machine and APIs
  */
 
@@ -34,11 +31,34 @@
 #include <mali_kbase_hwcnt_context.h>
 #include <mali_kbase_pm_internal.h>
 #include <tl/mali_kbase_tracepoints.h>
+#include <mali_kbase_gpuprops.h>
+
+/* A dmesg warning will occur if the GPU is not granted
+ * after the following time (in milliseconds) has ellapsed.
+ */
+#define GPU_REQUEST_TIMEOUT 1000
+
+#define MAX_L2_SLICES_MASK		0xFF
+
+/* Maximum time in ms, before deferring probe incase
+ * GPU_GRANTED message is not received
+ */
+static int gpu_req_timeout = 1;
+module_param(gpu_req_timeout, int, 0644);
+MODULE_PARM_DESC(gpu_req_timeout,
+	"On a virtualized platform, if the GPU is not granted within this time(ms) kbase will defer the probe");
 
 static void kbase_arbiter_pm_vm_wait_gpu_assignment(struct kbase_device *kbdev);
 static inline bool kbase_arbiter_pm_vm_gpu_assigned_lockheld(
 	struct kbase_device *kbdev);
 
+/**
+ * kbase_arbiter_pm_vm_state_str() - Helper function to get string
+ *                                   for kbase VM state.(debug)
+ * @state: kbase VM state
+ *
+ * Return: string representation of Kbase_vm_state
+ */
 static inline const char *kbase_arbiter_pm_vm_state_str(
 	enum kbase_vm_state state)
 {
@@ -73,6 +93,13 @@ static inline const char *kbase_arbiter_pm_vm_state_str(
 	}
 }
 
+/**
+ * kbase_arbiter_pm_vm_event_str() - Helper function to get string
+ *                                   for kbase VM event.(debug)
+ * @evt: kbase VM state
+ *
+ * Return: String representation of Kbase_arbif_event
+ */
 static inline const char *kbase_arbiter_pm_vm_event_str(
 	enum kbase_arbif_evt evt)
 {
@@ -99,6 +126,13 @@ static inline const char *kbase_arbiter_pm_vm_event_str(
 	}
 }
 
+/**
+ * kbase_arbiter_pm_vm_set_state() - Sets new kbase_arbiter_vm_state
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ * @new_state: kbase VM new state
+ *
+ * This function sets the new state for the VM
+ */
 static void kbase_arbiter_pm_vm_set_state(struct kbase_device *kbdev,
 	enum kbase_vm_state new_state)
 {
@@ -107,11 +141,22 @@ static void kbase_arbiter_pm_vm_set_state(struct kbase_device *kbdev,
 	dev_dbg(kbdev->dev, "VM set_state %s -> %s",
 	kbase_arbiter_pm_vm_state_str(arb_vm_state->vm_state),
 	kbase_arbiter_pm_vm_state_str(new_state));
+
 	lockdep_assert_held(&arb_vm_state->vm_state_lock);
 	arb_vm_state->vm_state = new_state;
+	if (new_state != KBASE_VM_STATE_INITIALIZING_WITH_GPU &&
+		new_state != KBASE_VM_STATE_INITIALIZING)
+		KBASE_KTRACE_ADD(kbdev, ARB_VM_STATE, NULL, new_state);
 	wake_up(&arb_vm_state->vm_state_wait);
 }
 
+/**
+ * kbase_arbiter_pm_suspend_wq() - suspend work queue of the driver.
+ * @data: work queue
+ *
+ * Suspends work queue of the driver, when VM is in SUSPEND_PENDING or
+ * STOPPING_IDLE or STOPPING_ACTIVE state
+ */
 static void kbase_arbiter_pm_suspend_wq(struct work_struct *data)
 {
 	struct kbase_arbiter_vm_state *arb_vm_state = container_of(data,
@@ -136,6 +181,13 @@ static void kbase_arbiter_pm_suspend_wq(struct work_struct *data)
 	dev_dbg(kbdev->dev, "<%s\n", __func__);
 }
 
+/**
+ * kbase_arbiter_pm_resume_wq() -Kbase resume work queue.
+ * @data: work item
+ *
+ * Resume work queue of the driver when VM is in STARTING state,
+ * else if its in STOPPING_ACTIVE will request a stop event.
+ */
 static void kbase_arbiter_pm_resume_wq(struct work_struct *data)
 {
 	struct kbase_arbiter_vm_state *arb_vm_state = container_of(data,
@@ -157,9 +209,74 @@ static void kbase_arbiter_pm_resume_wq(struct work_struct *data)
 	}
 	arb_vm_state->vm_arb_starting = false;
 	mutex_unlock(&arb_vm_state->vm_state_lock);
+	KBASE_TLSTREAM_TL_ARBITER_STARTED(kbdev, kbdev);
 	dev_dbg(kbdev->dev, "<%s\n", __func__);
 }
 
+/**
+ * request_timer_callback() - Issue warning on request timer expiration
+ * @timer: Request hr timer data
+ *
+ * Called when the Arbiter takes too long to grant the GPU after a
+ * request has been made.  Issues a warning in dmesg.
+ *
+ * Return: Always returns HRTIMER_NORESTART
+ */
+static enum hrtimer_restart request_timer_callback(struct hrtimer *timer)
+{
+	struct kbase_arbiter_vm_state *arb_vm_state = container_of(timer,
+			struct kbase_arbiter_vm_state, vm_request_timer);
+
+	KBASE_DEBUG_ASSERT(arb_vm_state);
+	KBASE_DEBUG_ASSERT(arb_vm_state->kbdev);
+
+	dev_warn(arb_vm_state->kbdev->dev,
+		"Still waiting for GPU to be granted from Arbiter after %d ms\n",
+		GPU_REQUEST_TIMEOUT);
+	return HRTIMER_NORESTART;
+}
+
+/**
+ * start_request_timer() - Start a timer after requesting GPU
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * Start a timer to track when kbase is waiting for the GPU from the
+ * Arbiter.  If the timer expires before GPU is granted, a warning in
+ * dmesg will be issued.
+ */
+static void start_request_timer(struct kbase_device *kbdev)
+{
+	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
+
+	hrtimer_start(&arb_vm_state->vm_request_timer,
+			HR_TIMER_DELAY_MSEC(GPU_REQUEST_TIMEOUT),
+			HRTIMER_MODE_REL);
+}
+
+/**
+ * cancel_request_timer() - Stop the request timer
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * Stops the request timer once GPU has been granted.  Safe to call
+ * even if timer is no longer running.
+ */
+static void cancel_request_timer(struct kbase_device *kbdev)
+{
+	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
+
+	hrtimer_cancel(&arb_vm_state->vm_request_timer);
+}
+
+/**
+ * kbase_arbiter_pm_early_init() - Initialize arbiter for VM
+ *                                 Paravirtualized use.
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * Initialize the arbiter and other required resources during the runtime
+ * and request the GPU for the VM for the first time.
+ *
+ * Return: 0 if success, or a Linux error code
+ */
 int kbase_arbiter_pm_early_init(struct kbase_device *kbdev)
 {
 	int err;
@@ -179,12 +296,17 @@ int kbase_arbiter_pm_early_init(struct kbase_device *kbdev)
 		WQ_HIGHPRI);
 	if (!arb_vm_state->vm_arb_wq) {
 		dev_err(kbdev->dev, "Failed to allocate vm_arb workqueue\n");
+		kfree(arb_vm_state);
 		return -ENOMEM;
 	}
 	INIT_WORK(&arb_vm_state->vm_suspend_work, kbase_arbiter_pm_suspend_wq);
 	INIT_WORK(&arb_vm_state->vm_resume_work, kbase_arbiter_pm_resume_wq);
 	arb_vm_state->vm_arb_starting = false;
-	arb_vm_state->vm_arb_users_waiting = 0;
+	atomic_set(&kbdev->pm.gpu_users_waiting, 0);
+	hrtimer_init(&arb_vm_state->vm_request_timer, CLOCK_MONOTONIC,
+							HRTIMER_MODE_REL);
+	arb_vm_state->vm_request_timer.function =
+						request_timer_callback;
 	kbdev->pm.arb_vm_state = arb_vm_state;
 
 	err = kbase_arbif_init(kbdev);
@@ -192,17 +314,31 @@ int kbase_arbiter_pm_early_init(struct kbase_device *kbdev)
 		dev_err(kbdev->dev, "Failed to initialise arbif module\n");
 		goto arbif_init_fail;
 	}
+
 	if (kbdev->arb.arb_if) {
 		kbase_arbif_gpu_request(kbdev);
 		dev_dbg(kbdev->dev, "Waiting for initial GPU assignment...\n");
-		wait_event(arb_vm_state->vm_state_wait,
+		err = wait_event_timeout(arb_vm_state->vm_state_wait,
 			arb_vm_state->vm_state ==
-					KBASE_VM_STATE_INITIALIZING_WITH_GPU);
+					KBASE_VM_STATE_INITIALIZING_WITH_GPU,
+			msecs_to_jiffies(gpu_req_timeout));
+
+		if (!err) {
+			dev_dbg(kbdev->dev,
+			"Kbase probe Deferred after waiting %d ms to receive GPU_GRANT\n",
+			gpu_req_timeout);
+			err = -EPROBE_DEFER;
+			goto arbif_eprobe_defer;
+		}
+
 		dev_dbg(kbdev->dev,
 			"Waiting for initial GPU assignment - done\n");
 	}
 	return 0;
 
+arbif_eprobe_defer:
+	kbase_arbiter_pm_early_term(kbdev);
+	return err;
 arbif_init_fail:
 	destroy_workqueue(arb_vm_state->vm_arb_wq);
 	kfree(arb_vm_state);
@@ -210,36 +346,72 @@ int kbase_arbiter_pm_early_init(struct kbase_device *kbdev)
 	return err;
 }
 
+/**
+ * kbase_arbiter_pm_early_term() - Shutdown arbiter and free resources
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * Clean up all the resources
+ */
 void kbase_arbiter_pm_early_term(struct kbase_device *kbdev)
 {
 	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
 
+	cancel_request_timer(kbdev);
 	mutex_lock(&arb_vm_state->vm_state_lock);
 	if (arb_vm_state->vm_state > KBASE_VM_STATE_STOPPED_GPU_REQUESTED) {
 		kbase_pm_set_gpu_lost(kbdev, false);
 		kbase_arbif_gpu_stopped(kbdev, false);
 	}
 	mutex_unlock(&arb_vm_state->vm_state_lock);
-	kbase_arbif_destroy(kbdev);
 	destroy_workqueue(arb_vm_state->vm_arb_wq);
+	kbase_arbif_destroy(kbdev);
 	arb_vm_state->vm_arb_wq = NULL;
 	kfree(kbdev->pm.arb_vm_state);
 	kbdev->pm.arb_vm_state = NULL;
 }
 
+/**
+ * kbase_arbiter_pm_release_interrupts() - Release the GPU interrupts
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * Releases interrupts and set the interrupt flag to false
+ */
 void kbase_arbiter_pm_release_interrupts(struct kbase_device *kbdev)
 {
 	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
 
 	mutex_lock(&arb_vm_state->vm_state_lock);
-	if (!kbdev->arb.arb_if ||
-			arb_vm_state->vm_state >
-					KBASE_VM_STATE_STOPPED_GPU_REQUESTED)
+	if (arb_vm_state->interrupts_installed == true) {
+		arb_vm_state->interrupts_installed = false;
 		kbase_release_interrupts(kbdev);
+	}
+	mutex_unlock(&arb_vm_state->vm_state_lock);
+}
 
+/**
+ * kbase_arbiter_pm_install_interrupts() - Install the GPU interrupts
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * Install interrupts and set the interrupt_install flag to true.
+ */
+int kbase_arbiter_pm_install_interrupts(struct kbase_device *kbdev)
+{
+	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
+	int err;
+
+	mutex_lock(&arb_vm_state->vm_state_lock);
+	arb_vm_state->interrupts_installed = true;
+	err = kbase_install_interrupts(kbdev);
 	mutex_unlock(&arb_vm_state->vm_state_lock);
+	return err;
 }
 
+/**
+ * kbase_arbiter_pm_vm_stopped() - Handle stop state for the VM
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * Handles a stop state for the VM
+ */
 void kbase_arbiter_pm_vm_stopped(struct kbase_device *kbdev)
 {
 	bool request_gpu = false;
@@ -247,14 +419,19 @@ void kbase_arbiter_pm_vm_stopped(struct kbase_device *kbdev)
 
 	lockdep_assert_held(&arb_vm_state->vm_state_lock);
 
-	if (arb_vm_state->vm_arb_users_waiting > 0 &&
+	if (atomic_read(&kbdev->pm.gpu_users_waiting) > 0 &&
 			arb_vm_state->vm_state == KBASE_VM_STATE_STOPPING_IDLE)
 		kbase_arbiter_pm_vm_set_state(kbdev,
 			 KBASE_VM_STATE_STOPPING_ACTIVE);
 
 	dev_dbg(kbdev->dev, "%s %s\n", __func__,
 		kbase_arbiter_pm_vm_state_str(arb_vm_state->vm_state));
-	kbase_release_interrupts(kbdev);
+
+	if (arb_vm_state->interrupts_installed) {
+		arb_vm_state->interrupts_installed = false;
+		kbase_release_interrupts(kbdev);
+	}
+
 	switch (arb_vm_state->vm_state) {
 	case KBASE_VM_STATE_STOPPING_ACTIVE:
 		request_gpu = true;
@@ -275,13 +452,85 @@ void kbase_arbiter_pm_vm_stopped(struct kbase_device *kbdev)
 
 	kbase_pm_set_gpu_lost(kbdev, false);
 	kbase_arbif_gpu_stopped(kbdev, request_gpu);
+	if (request_gpu)
+		start_request_timer(kbdev);
 }
 
+void kbase_arbiter_set_max_config(struct kbase_device *kbdev,
+				  uint32_t max_l2_slices,
+				  uint32_t max_core_mask)
+{
+	struct kbase_arbiter_vm_state *arb_vm_state;
+	struct max_config_props max_config;
+
+	if (!kbdev)
+		return;
+
+	/* Mask the max_l2_slices as it is stored as 8 bits into kbase */
+	max_config.l2_slices = max_l2_slices & MAX_L2_SLICES_MASK;
+	max_config.core_mask = max_core_mask;
+	arb_vm_state = kbdev->pm.arb_vm_state;
+
+	mutex_lock(&arb_vm_state->vm_state_lock);
+	/* Just set the max_props in kbase during initialization. */
+	if (arb_vm_state->vm_state == KBASE_VM_STATE_INITIALIZING)
+		kbase_gpuprops_set_max_config(kbdev, &max_config);
+	else
+		dev_dbg(kbdev->dev, "Unexpected max_config on VM state %s",
+			kbase_arbiter_pm_vm_state_str(arb_vm_state->vm_state));
+
+	mutex_unlock(&arb_vm_state->vm_state_lock);
+}
+
+int kbase_arbiter_pm_gpu_assigned(struct kbase_device *kbdev)
+{
+	struct kbase_arbiter_vm_state *arb_vm_state;
+	int result = -EINVAL;
+
+	if (!kbdev)
+		return result;
+
+	/* First check the GPU_LOST state */
+	kbase_pm_lock(kbdev);
+	if (kbase_pm_is_gpu_lost(kbdev)) {
+		kbase_pm_unlock(kbdev);
+		return 0;
+	}
+	kbase_pm_unlock(kbdev);
+
+	/* Then the arbitration state machine */
+	arb_vm_state = kbdev->pm.arb_vm_state;
+
+	mutex_lock(&arb_vm_state->vm_state_lock);
+	switch (arb_vm_state->vm_state) {
+	case KBASE_VM_STATE_INITIALIZING:
+	case KBASE_VM_STATE_SUSPENDED:
+	case KBASE_VM_STATE_STOPPED:
+	case KBASE_VM_STATE_STOPPED_GPU_REQUESTED:
+	case KBASE_VM_STATE_SUSPEND_WAIT_FOR_GRANT:
+		result = 0;
+		break;
+	default:
+		result = 1;
+		break;
+	}
+	mutex_unlock(&arb_vm_state->vm_state_lock);
+
+	return result;
+}
+
+/**
+ * kbase_arbiter_pm_vm_gpu_start() - Handles the start state of the VM
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * Handles the start state of the VM
+ */
 static void kbase_arbiter_pm_vm_gpu_start(struct kbase_device *kbdev)
 {
 	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
 
 	lockdep_assert_held(&arb_vm_state->vm_state_lock);
+	cancel_request_timer(kbdev);
 	switch (arb_vm_state->vm_state) {
 	case KBASE_VM_STATE_INITIALIZING:
 		kbase_arbiter_pm_vm_set_state(kbdev,
@@ -289,7 +538,14 @@ static void kbase_arbiter_pm_vm_gpu_start(struct kbase_device *kbdev)
 		break;
 	case KBASE_VM_STATE_STOPPED_GPU_REQUESTED:
 		kbase_arbiter_pm_vm_set_state(kbdev, KBASE_VM_STATE_STARTING);
+		arb_vm_state->interrupts_installed = true;
 		kbase_install_interrupts(kbdev);
+		/*
+		 * GPU GRANTED received while in stop can be a result of a
+		 * repartitioning.
+		 */
+		kbase_gpuprops_req_curr_config_update(kbdev);
+		/* curr_config will be updated while resuming the PM. */
 		queue_work(arb_vm_state->vm_arb_wq,
 			&arb_vm_state->vm_resume_work);
 		break;
@@ -306,6 +562,12 @@ static void kbase_arbiter_pm_vm_gpu_start(struct kbase_device *kbdev)
 	}
 }
 
+/**
+ * kbase_arbiter_pm_vm_gpu_stop() - Handles the stop state of the VM
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * Handles the start state of the VM
+ */
 static void kbase_arbiter_pm_vm_gpu_stop(struct kbase_device *kbdev)
 {
 	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
@@ -348,6 +610,12 @@ static void kbase_arbiter_pm_vm_gpu_stop(struct kbase_device *kbdev)
 	}
 }
 
+/**
+ * kbase_gpu_lost() - Kbase signals GPU is lost on a lost event signal
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * On GPU lost event signals GPU_LOST to the aribiter
+ */
 static void kbase_gpu_lost(struct kbase_device *kbdev)
 {
 	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
@@ -396,6 +664,13 @@ static void kbase_gpu_lost(struct kbase_device *kbdev)
 	}
 }
 
+/**
+ * kbase_arbiter_pm_vm_os_suspend_ready_state() - checks if VM is ready
+ *			to be moved to suspended state.
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * Return: True if its ready to be suspended else False.
+ */
 static inline bool kbase_arbiter_pm_vm_os_suspend_ready_state(
 	struct kbase_device *kbdev)
 {
@@ -410,6 +685,14 @@ static inline bool kbase_arbiter_pm_vm_os_suspend_ready_state(
 	}
 }
 
+/**
+ * kbase_arbiter_pm_vm_os_prepare_suspend() - Prepare OS to be in suspend state
+ *                             until it receives the grant message from arbiter
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * Prepares OS to be in suspend state until it receives GRANT message
+ * from Arbiter asynchronously.
+ */
 static void kbase_arbiter_pm_vm_os_prepare_suspend(struct kbase_device *kbdev)
 {
 	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
@@ -475,6 +758,14 @@ static void kbase_arbiter_pm_vm_os_prepare_suspend(struct kbase_device *kbdev)
 	}
 }
 
+/**
+ * kbase_arbiter_pm_vm_os_resume() - Resume OS function once it receives
+ *                                   a grant message from arbiter
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * Resume OS function once it receives GRANT message
+ * from Arbiter asynchronously.
+ */
 static void kbase_arbiter_pm_vm_os_resume(struct kbase_device *kbdev)
 {
 	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
@@ -487,6 +778,7 @@ static void kbase_arbiter_pm_vm_os_resume(struct kbase_device *kbdev)
 	kbase_arbiter_pm_vm_set_state(kbdev,
 		KBASE_VM_STATE_STOPPED_GPU_REQUESTED);
 	kbase_arbif_gpu_request(kbdev);
+	start_request_timer(kbdev);
 
 	/* Release lock and block resume OS function until we have
 	 * asynchronously received the GRANT message from the Arbiter and
@@ -498,6 +790,14 @@ static void kbase_arbiter_pm_vm_os_resume(struct kbase_device *kbdev)
 	mutex_lock(&arb_vm_state->vm_state_lock);
 }
 
+/**
+ * kbase_arbiter_pm_vm_event() - Dispatch VM event to the state machine.
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ * @evt: VM event
+ *
+ * The state machine function. Receives events and transitions states
+ * according the event received and the current state
+ */
 void kbase_arbiter_pm_vm_event(struct kbase_device *kbdev,
 	enum kbase_arbif_evt evt)
 {
@@ -509,7 +809,9 @@ void kbase_arbiter_pm_vm_event(struct kbase_device *kbdev,
 	mutex_lock(&arb_vm_state->vm_state_lock);
 	dev_dbg(kbdev->dev, "%s %s\n", __func__,
 		kbase_arbiter_pm_vm_event_str(evt));
-
+	if (arb_vm_state->vm_state != KBASE_VM_STATE_INITIALIZING_WITH_GPU &&
+		arb_vm_state->vm_state != KBASE_VM_STATE_INITIALIZING)
+		KBASE_KTRACE_ADD(kbdev, ARB_VM_EVT, NULL, evt);
 	switch (evt) {
 	case KBASE_VM_GPU_GRANTED_EVT:
 		kbase_arbiter_pm_vm_gpu_start(kbdev);
@@ -542,8 +844,6 @@ void kbase_arbiter_pm_vm_event(struct kbase_device *kbdev,
 	case KBASE_VM_REF_EVENT:
 		switch (arb_vm_state->vm_state) {
 		case KBASE_VM_STATE_STARTING:
-			KBASE_TLSTREAM_TL_ARBITER_STARTED(kbdev, kbdev);
-			/* FALL THROUGH */
 		case KBASE_VM_STATE_IDLE:
 			kbase_arbiter_pm_vm_set_state(kbdev,
 			KBASE_VM_STATE_ACTIVE);
@@ -586,6 +886,12 @@ void kbase_arbiter_pm_vm_event(struct kbase_device *kbdev,
 
 KBASE_EXPORT_TEST_API(kbase_arbiter_pm_vm_event);
 
+/**
+ * kbase_arbiter_pm_vm_wait_gpu_assignment() - VM wait for a GPU assignment.
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * VM waits for a GPU assignment.
+ */
 static void kbase_arbiter_pm_vm_wait_gpu_assignment(struct kbase_device *kbdev)
 {
 	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
@@ -597,6 +903,12 @@ static void kbase_arbiter_pm_vm_wait_gpu_assignment(struct kbase_device *kbdev)
 	dev_dbg(kbdev->dev, "Waiting for GPU assignment - done\n");
 }
 
+/**
+ * kbase_arbiter_pm_vm_gpu_assigned_lockheld() - Check if VM holds VM state lock
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * Checks if the virtual machine holds VM state lock.
+ */
 static inline bool kbase_arbiter_pm_vm_gpu_assigned_lockheld(
 	struct kbase_device *kbdev)
 {
@@ -607,6 +919,19 @@ static inline bool kbase_arbiter_pm_vm_gpu_assigned_lockheld(
 		arb_vm_state->vm_state == KBASE_VM_STATE_ACTIVE);
 }
 
+/**
+ * kbase_arbiter_pm_ctx_active_handle_suspend() - Handle suspend operation for
+ *                                                arbitration mode
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ * @suspend_handler: The handler code for how to handle a suspend
+ *                   that might occur
+ *
+ * This function handles a suspend event from the driver,
+ * communicating with the arbiter and waiting synchronously for the GPU
+ * to be granted again depending on the VM state.
+ *
+ * Return: 0 on success else 1 suspend handler isn not possible.
+ */
 int kbase_arbiter_pm_ctx_active_handle_suspend(struct kbase_device *kbdev,
 	enum kbase_pm_suspend_handler suspend_handler)
 {
@@ -627,6 +952,7 @@ int kbase_arbiter_pm_ctx_active_handle_suspend(struct kbase_device *kbdev,
 				kbase_arbiter_pm_vm_set_state(kbdev,
 					KBASE_VM_STATE_STOPPED_GPU_REQUESTED);
 				kbase_arbif_gpu_request(kbdev);
+				start_request_timer(kbdev);
 			} else if (arb_vm_state->vm_state ==
 					KBASE_VM_STATE_INITIALIZING_WITH_GPU)
 				break;
@@ -660,7 +986,7 @@ int kbase_arbiter_pm_ctx_active_handle_suspend(struct kbase_device *kbdev,
 			}
 
 			/* Need to synchronously wait for GPU assignment */
-			arb_vm_state->vm_arb_users_waiting++;
+			atomic_inc(&kbdev->pm.gpu_users_waiting);
 			mutex_unlock(&arb_vm_state->vm_state_lock);
 			mutex_unlock(&kbdev->pm.lock);
 			mutex_unlock(&js_devdata->runpool_mutex);
@@ -668,9 +994,66 @@ int kbase_arbiter_pm_ctx_active_handle_suspend(struct kbase_device *kbdev,
 			mutex_lock(&js_devdata->runpool_mutex);
 			mutex_lock(&kbdev->pm.lock);
 			mutex_lock(&arb_vm_state->vm_state_lock);
-			arb_vm_state->vm_arb_users_waiting--;
+			atomic_dec(&kbdev->pm.gpu_users_waiting);
 		}
 		mutex_unlock(&arb_vm_state->vm_state_lock);
 	}
 	return res;
 }
+
+/**
+ * kbase_arbiter_pm_update_gpu_freq() - Updates GPU clock frequency received
+ * from arbiter.
+ * @arb_freq - Pointer to struchture holding GPU clock frequenecy data
+ * @freq - New frequency value
+ */
+void kbase_arbiter_pm_update_gpu_freq(struct kbase_arbiter_freq *arb_freq,
+		uint32_t freq)
+{
+	mutex_lock(&arb_freq->arb_freq_lock);
+	arb_freq->arb_freq = freq;
+	mutex_unlock(&arb_freq->arb_freq_lock);
+}
+
+/**
+ * enumerate_arb_gpu_clk() - Enumerate a GPU clock on the given index
+ * @kbdev - kbase_device pointer
+ * @index - GPU clock index
+ *
+ * Returns pointer to structure holding GPU clock frequency data reported from
+ * arbiter, only index 0 is valid.
+ */
+static void *enumerate_arb_gpu_clk(struct kbase_device *kbdev,
+		unsigned int index)
+{
+	if (index == 0)
+		return &kbdev->arb.arb_freq;
+	return NULL;
+}
+
+/**
+ * get_arb_gpu_clk_rate() - Get the current rate of GPU clock frequency value
+ * @kbdev - kbase_device pointer
+ * @index - GPU clock index
+ *
+ * Returns the GPU clock frequency value saved when gpu is granted from arbiter
+ */
+static unsigned long get_arb_gpu_clk_rate(struct kbase_device *kbdev,
+		void *gpu_clk_handle)
+{
+	uint32_t freq;
+	struct kbase_arbiter_freq *arb_dev_freq =
+			(struct kbase_arbiter_freq *) gpu_clk_handle;
+
+	mutex_lock(&arb_dev_freq->arb_freq_lock);
+	freq = arb_dev_freq->arb_freq;
+	mutex_unlock(&arb_dev_freq->arb_freq_lock);
+	return freq;
+}
+
+struct kbase_clk_rate_trace_op_conf arb_clk_rate_trace_ops = {
+	.get_gpu_clk_rate = get_arb_gpu_clk_rate,
+	.enumerate_gpu_clk = enumerate_arb_gpu_clk,
+	.gpu_clk_notifier_register = NULL,
+	.gpu_clk_notifier_unregister = NULL
+};
diff --git a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_pm.h b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_pm.h
index 3c49eb1948c5..0f74b631c76e 100644
--- a/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_pm.h
+++ b/drivers/gpu/arm/bifrost/arbiter/mali_kbase_arbiter_pm.h
@@ -1,28 +1,7 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, you can access it online at
- * http://www.gnu.org/licenses/gpl-2.0.html.
- *
- * SPDX-License-Identifier: GPL-2.0
- *
- *//* SPDX-License-Identifier: GPL-2.0 */
-
-/*
- *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -38,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
@@ -116,10 +93,18 @@ void kbase_arbiter_pm_early_term(struct kbase_device *kbdev);
  * kbase_arbiter_pm_release_interrupts() - Release the GPU interrupts
  * @kbdev: The kbase device structure for the device (must be a valid pointer)
  *
- * Releases interrupts if needed (GPU is available) otherwise does nothing
+ * Releases interrupts and set the interrupt flag to false
  */
 void kbase_arbiter_pm_release_interrupts(struct kbase_device *kbdev);
 
+/**
+ * kbase_arbiter_pm_install_interrupts() - Install the GPU interrupts
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * Install interrupts and set the interrupt_install flag to true.
+ */
+int kbase_arbiter_pm_install_interrupts(struct kbase_device *kbdev);
+
 /**
  * kbase_arbiter_pm_vm_event() - Dispatch VM event to the state machine
  * @kbdev: The kbase device structure for the device (must be a valid pointer)
@@ -156,4 +141,42 @@ int kbase_arbiter_pm_ctx_active_handle_suspend(struct kbase_device *kbdev,
  */
 void kbase_arbiter_pm_vm_stopped(struct kbase_device *kbdev);
 
+/**
+ * kbase_arbiter_set_max_config() - Set the max config data in kbase device.
+ * @kbdev: The kbase device structure for the device (must be a valid pointer).
+ * @max_l2_slices: The maximum number of L2 slices.
+ * @max_core_mask: The largest core mask.
+ *
+ * This function handles a stop event for the VM.
+ * It will update the VM state and forward the stop event to the driver.
+ */
+void kbase_arbiter_set_max_config(struct kbase_device *kbdev,
+				  uint32_t max_l2_slices,
+				  uint32_t max_core_mask);
+
+/**
+ * kbase_arbiter_pm_gpu_assigned() - Determine if this VM has access to the GPU
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
+ * Return: 0 if the VM does not have access, 1 if it does, and a negative number
+ * if an error occurred
+ */
+int kbase_arbiter_pm_gpu_assigned(struct kbase_device *kbdev);
+
+extern struct kbase_clk_rate_trace_op_conf arb_clk_rate_trace_ops;
+
+/**
+ * struct kbase_arbiter_freq - Holding the GPU clock frequency data retrieved
+ * from arbiter
+ * @arb_freq:                 GPU clock frequency value
+ * @arb_freq_lock:            Mutex protecting access to arbfreq value
+ */
+struct kbase_arbiter_freq {
+	uint32_t arb_freq;
+	struct mutex arb_freq_lock;
+};
+
+void kbase_arbiter_pm_update_gpu_freq(struct kbase_arbiter_freq *arb_freq,
+		uint32_t freq);
+
 #endif /*_MALI_KBASE_ARBITER_PM_H_ */
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/Kbuild b/drivers/gpu/arm/bifrost/backend/gpu/Kbuild
index b48ab4c51875..928766d65632 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/Kbuild
+++ b/drivers/gpu/arm/bifrost/backend/gpu/Kbuild
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,15 +16,12 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
 BACKEND += \
 	backend/gpu/mali_kbase_cache_policy_backend.c \
 	backend/gpu/mali_kbase_gpuprops_backend.c \
 	backend/gpu/mali_kbase_irq_linux.c \
-	backend/gpu/mali_kbase_instr_backend.c \
 	backend/gpu/mali_kbase_js_backend.c \
 	backend/gpu/mali_kbase_pm_backend.c \
 	backend/gpu/mali_kbase_pm_driver.c \
@@ -40,6 +38,7 @@ ifeq ($(MALI_USE_CSF),1)
 # empty
 else
 	BACKEND += \
+		backend/gpu/mali_kbase_instr_backend.c \
 		backend/gpu/mali_kbase_jm_as.c \
 		backend/gpu/mali_kbase_debug_job_fault_backend.c \
 		backend/gpu/mali_kbase_jm_hw.c \
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_backend_config.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_backend_config.h
index 4a61f96c8c7d..a6bbdbbc150c 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_backend_config.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_backend_config.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014-2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2018, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_cache_policy_backend.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_cache_policy_backend.c
index 4e07a3f9d83f..fee946478667 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_cache_policy_backend.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_cache_policy_backend.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2014-2016, 2018, 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "backend/gpu/mali_kbase_cache_policy_backend.h"
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_cache_policy_backend.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_cache_policy_backend.h
index f78ada74f605..53b9667cc669 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_cache_policy_backend.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_cache_policy_backend.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2015-2016 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2016, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,16 +17,13 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
 #ifndef _KBASE_CACHE_POLICY_BACKEND_H_
 #define _KBASE_CACHE_POLICY_BACKEND_H_
 
 #include "mali_kbase.h"
-#include "mali_base_kernel.h"
+#include <uapi/gpu/arm/bifrost/mali_base_kernel.h>
 
 /**
   * kbase_cache_set_coherency_mode() - Sets the system coherency mode
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_clk_rate_trace_mgr.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_clk_rate_trace_mgr.c
index 187d7d6f6926..7076ab4f73ee 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_clk_rate_trace_mgr.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_clk_rate_trace_mgr.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -40,6 +39,38 @@
 #define CLK_RATE_TRACE_OPS (NULL)
 #endif
 
+/**
+ * get_clk_rate_trace_callbacks() - Returns pointer to clk trace ops.
+ * @kbdev: Pointer to kbase device, used to check if arbitration is enabled
+ *         when compiled with arbiter support.
+ * Return: Pointer to clk trace ops if supported or NULL.
+ */
+static struct kbase_clk_rate_trace_op_conf *
+get_clk_rate_trace_callbacks(struct kbase_device *kbdev __maybe_unused)
+{
+	/* base case */
+	struct kbase_clk_rate_trace_op_conf *callbacks =
+		(struct kbase_clk_rate_trace_op_conf *)CLK_RATE_TRACE_OPS;
+#if defined(CONFIG_MALI_ARBITER_SUPPORT) && defined(CONFIG_OF)
+	const void *arbiter_if_node;
+
+	if (WARN_ON(!kbdev) || WARN_ON(!kbdev->dev))
+		return callbacks;
+
+	arbiter_if_node =
+		of_get_property(kbdev->dev->of_node, "arbiter_if", NULL);
+	/* Arbitration enabled, override the callback pointer.*/
+	if (arbiter_if_node)
+		callbacks = &arb_clk_rate_trace_ops;
+	else
+		dev_dbg(kbdev->dev,
+			"Arbitration supported but disabled by platform. Leaving clk rate callbacks as default.\n");
+
+#endif
+
+	return callbacks;
+}
+
 static int gpu_clk_rate_change_notifier(struct notifier_block *nb,
 			unsigned long event, void *data)
 {
@@ -70,12 +101,13 @@ static int gpu_clk_rate_change_notifier(struct notifier_block *nb,
 static int gpu_clk_data_init(struct kbase_device *kbdev,
 		void *gpu_clk_handle, unsigned int index)
 {
-	struct kbase_clk_rate_trace_op_conf *callbacks =
-		(struct kbase_clk_rate_trace_op_conf *)CLK_RATE_TRACE_OPS;
+	struct kbase_clk_rate_trace_op_conf *callbacks;
 	struct kbase_clk_data *clk_data;
 	struct kbase_clk_rate_trace_manager *clk_rtm = &kbdev->pm.clk_rtm;
 	int ret = 0;
 
+	callbacks = get_clk_rate_trace_callbacks(kbdev);
+
 	if (WARN_ON(!callbacks) ||
 	    WARN_ON(!gpu_clk_handle) ||
 	    WARN_ON(index >= BASE_MAX_NR_CLOCKS_REGULATORS))
@@ -109,8 +141,9 @@ static int gpu_clk_data_init(struct kbase_device *kbdev,
 	clk_data->clk_rate_change_nb.notifier_call =
 			gpu_clk_rate_change_notifier;
 
-	ret = callbacks->gpu_clk_notifier_register(kbdev, gpu_clk_handle,
-			&clk_data->clk_rate_change_nb);
+	if (callbacks->gpu_clk_notifier_register)
+		ret = callbacks->gpu_clk_notifier_register(kbdev,
+				gpu_clk_handle, &clk_data->clk_rate_change_nb);
 	if (ret) {
 		dev_err(kbdev->dev, "Failed to register notifier for clock enumerated at index %u", index);
 		kfree(clk_data);
@@ -121,19 +154,22 @@ static int gpu_clk_data_init(struct kbase_device *kbdev,
 
 int kbase_clk_rate_trace_manager_init(struct kbase_device *kbdev)
 {
-	struct kbase_clk_rate_trace_op_conf *callbacks =
-		(struct kbase_clk_rate_trace_op_conf *)CLK_RATE_TRACE_OPS;
+	struct kbase_clk_rate_trace_op_conf *callbacks;
 	struct kbase_clk_rate_trace_manager *clk_rtm = &kbdev->pm.clk_rtm;
 	unsigned int i;
 	int ret = 0;
 
-	/* Return early if no callbacks provided for clock rate tracing */
-	if (!callbacks)
-		return 0;
+	callbacks = get_clk_rate_trace_callbacks(kbdev);
 
 	spin_lock_init(&clk_rtm->lock);
 	INIT_LIST_HEAD(&clk_rtm->listeners);
 
+	/* Return early if no callbacks provided for clock rate tracing */
+	if (!callbacks) {
+		WRITE_ONCE(clk_rtm->clk_rate_trace_ops, NULL);
+		return 0;
+	}
+
 	clk_rtm->gpu_idle = true;
 
 	for (i = 0; i < BASE_MAX_NR_CLOCKS_REGULATORS; i++) {
@@ -151,10 +187,12 @@ int kbase_clk_rate_trace_manager_init(struct kbase_device *kbdev)
 	/* Activate clock rate trace manager if at least one GPU clock was
 	 * enumerated.
 	 */
-	if (i)
+	if (i) {
 		WRITE_ONCE(clk_rtm->clk_rate_trace_ops, callbacks);
-	else
+	} else {
 		dev_info(kbdev->dev, "No clock(s) available for rate tracing");
+		WRITE_ONCE(clk_rtm->clk_rate_trace_ops, NULL);
+	}
 
 	return 0;
 
@@ -183,9 +221,10 @@ void kbase_clk_rate_trace_manager_term(struct kbase_device *kbdev)
 		if (!clk_rtm->clks[i])
 			break;
 
-		clk_rtm->clk_rate_trace_ops->gpu_clk_notifier_unregister(
-				kbdev, clk_rtm->clks[i]->gpu_clk_handle,
-				&clk_rtm->clks[i]->clk_rate_change_nb);
+		if (clk_rtm->clk_rate_trace_ops->gpu_clk_notifier_unregister)
+			clk_rtm->clk_rate_trace_ops->gpu_clk_notifier_unregister
+			(kbdev, clk_rtm->clks[i]->gpu_clk_handle,
+			&clk_rtm->clks[i]->clk_rate_change_nb);
 		kfree(clk_rtm->clks[i]);
 	}
 
@@ -284,4 +323,3 @@ void kbase_clk_rate_trace_manager_notify_all(
 	}
 }
 KBASE_EXPORT_TEST_API(kbase_clk_rate_trace_manager_notify_all);
-
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_clk_rate_trace_mgr.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_clk_rate_trace_mgr.h
index dcafb26ea4c0..ba250bec4491 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_clk_rate_trace_mgr.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_clk_rate_trace_mgr.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,17 +17,15 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_CLK_RATE_TRACE_MGR_
 #define _KBASE_CLK_RATE_TRACE_MGR_
 
-/** The index of top clock domain in kbase_clk_rate_trace_manager:clks. */
+/* The index of top clock domain in kbase_clk_rate_trace_manager:clks. */
 #define KBASE_CLOCK_DOMAIN_TOP (0)
 
-/** The index of shader-cores clock domain in
+/* The index of shader-cores clock domain in
  * kbase_clk_rate_trace_manager:clks.
  */
 #define KBASE_CLOCK_DOMAIN_SHADER_CORES (1)
@@ -139,7 +138,7 @@ static inline void kbase_clk_rate_trace_manager_unsubscribe(
  *                                             rate listeners.
  *
  * @clk_rtm:     Clock rate manager instance.
- * @clk_index:   Clock index.
+ * @clock_index:   Clock index.
  * @new_rate:    New clock frequency(Hz)
  *
  * kbase_clk_rate_trace_manager:lock must be locked.
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_debug_job_fault_backend.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_debug_job_fault_backend.c
index 3aadcb04160c..b5ca79db5fad 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_debug_job_fault_backend.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_debug_job_fault_backend.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2012-2015, 2018-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.c
index ff561d180247..1381f992364b 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
@@ -32,20 +33,8 @@
 #endif
 
 #include <linux/version.h>
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)
 #include <linux/pm_opp.h>
-#else /* Linux >= 3.13 */
-/* In 3.13 the OPP include header file, types, and functions were all
- * renamed. Use the old filename for the include, and define the new names to
- * the old, when an old kernel is detected.
- */
-#include <linux/opp.h>
-#define dev_pm_opp opp
-#define dev_pm_opp_get_voltage opp_get_voltage
-#define dev_pm_opp_get_opp_count opp_get_opp_count
-#define dev_pm_opp_find_freq_ceil opp_find_freq_ceil
-#define dev_pm_opp_find_freq_floor opp_find_freq_floor
-#endif /* Linux >= 3.13 */
+
 #include <soc/rockchip/rockchip_ipa.h>
 #include <soc/rockchip/rockchip_opp_select.h>
 #include <soc/rockchip/rockchip_system_monitor.h>
@@ -59,22 +48,46 @@ static struct monitor_dev_profile mali_mdevp = {
 };
 
 /**
- * opp_translate - Translate nominal OPP frequency from devicetree into real
- *                 frequency and core mask
- * @kbdev:     Device pointer
- * @freq:      Nominal frequency
- * @volt:      Nominal voltage
- * @core_mask: Pointer to u64 to store core mask to
- * @freqs:     Pointer to array of frequencies
- * @volts:     Pointer to array of voltages
+ * get_voltage() - Get the voltage value corresponding to the nominal frequency
+ *                 used by devfreq.
+ * @kbdev:    Device pointer
+ * @freq:     Nominal frequency in Hz passed by devfreq.
+ *
+ * This function will be called only when the opp table which is compatible with
+ * "operating-points-v2-mali", is not present in the devicetree for GPU device.
  *
- * This function will only perform translation if an operating-points-v2-mali
- * table is present in devicetree. If one is not present then it will return an
- * untranslated frequency and all cores enabled.
+ * Return: Voltage value in milli volts, 0 in case of error.
  */
-static void opp_translate(struct kbase_device *kbdev, unsigned long freq,
-			  unsigned long volt, u64 *core_mask,
-			  unsigned long *freqs, unsigned long *volts)
+static unsigned long get_voltage(struct kbase_device *kbdev, unsigned long freq)
+{
+	struct dev_pm_opp *opp;
+	unsigned long voltage = 0;
+
+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
+	rcu_read_lock();
+#endif
+
+	opp = dev_pm_opp_find_freq_exact(kbdev->dev, freq, true);
+
+	if (IS_ERR_OR_NULL(opp))
+		dev_err(kbdev->dev, "Failed to get opp (%ld)\n", PTR_ERR(opp));
+	else {
+		voltage = dev_pm_opp_get_voltage(opp);
+#if KERNEL_VERSION(4, 11, 0) <= LINUX_VERSION_CODE
+		dev_pm_opp_put(opp);
+#endif
+	}
+
+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
+	rcu_read_unlock();
+#endif
+
+	/* Return the voltage in milli volts */
+	return voltage / 1000;
+}
+
+void kbase_devfreq_opp_translate(struct kbase_device *kbdev, unsigned long freq,
+	u64 *core_mask, unsigned long *freqs, unsigned long *volts)
 {
 	unsigned int i;
 
@@ -95,13 +108,16 @@ static void opp_translate(struct kbase_device *kbdev, unsigned long freq,
 	}
 
 	/* If failed to find OPP, return all cores enabled
-	 * and nominal frequency
+	 * and nominal frequency and the corresponding voltage.
 	 */
 	if (i == kbdev->num_opps) {
+		unsigned long voltage = get_voltage(kbdev, freq);
+
 		*core_mask = kbdev->gpu_props.props.raw_props.shader_present;
+
 		for (i = 0; i < kbdev->nr_clocks; i++) {
 			freqs[i] = freq;
-			volts[i] = volt;
+			volts[i] = voltage;
 		}
 	}
 }
@@ -120,12 +136,12 @@ kbase_devfreq_target(struct device *dev, unsigned long *target_freq, u32 flags)
 
 	nominal_freq = *target_freq;
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
 	rcu_read_lock();
 #endif
 	opp = devfreq_recommended_opp(dev, &nominal_freq, flags);
 	if (IS_ERR_OR_NULL(opp)) {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
 		rcu_read_unlock();
 #endif
 		dev_err(dev, "Failed to get opp (%ld)\n", PTR_ERR(opp));
@@ -135,12 +151,15 @@ kbase_devfreq_target(struct device *dev, unsigned long *target_freq, u32 flags)
 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
 	rcu_read_unlock();
 #endif
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
+#if KERNEL_VERSION(4, 11, 0) <= LINUX_VERSION_CODE
 	dev_pm_opp_put(opp);
 #endif
 
-	opp_translate(kbdev, nominal_freq, nominal_volt, &core_mask, freqs,
-		      volts);
+	kbase_devfreq_opp_translate(kbdev,
+				    nominal_freq,
+				    &core_mask,
+				    freqs,
+				    volts);
 
 	/*
 	 * Only update if there is a change of frequency
@@ -168,6 +187,7 @@ kbase_devfreq_target(struct device *dev, unsigned long *target_freq, u32 flags)
 #endif
 		return 0;
 	}
+
 	dev_dbg(dev, "%lu-->%lu\n", kbdev->current_nominal_freq, nominal_freq);
 
 #ifdef CONFIG_REGULATOR
@@ -285,6 +305,10 @@ kbase_devfreq_status(struct device *dev, struct devfreq_dev_status *stat)
 	stat->current_frequency = kbdev->current_nominal_freq;
 	stat->private_data = NULL;
 
+#if MALI_USE_CSF && defined CONFIG_DEVFREQ_THERMAL
+	kbase_ipa_reset_data(kbdev);
+#endif
+
 	return 0;
 }
 
@@ -296,11 +320,11 @@ static int kbase_devfreq_init_freq_table(struct kbase_device *kbdev,
 	unsigned long freq;
 	struct dev_pm_opp *opp;
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
 	rcu_read_lock();
 #endif
 	count = dev_pm_opp_get_opp_count(kbdev->dev);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
 	rcu_read_unlock();
 #endif
 	if (count < 0)
@@ -311,20 +335,20 @@ static int kbase_devfreq_init_freq_table(struct kbase_device *kbdev,
 	if (!dp->freq_table)
 		return -ENOMEM;
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
 	rcu_read_lock();
 #endif
 	for (i = 0, freq = ULONG_MAX; i < count; i++, freq--) {
 		opp = dev_pm_opp_find_freq_floor(kbdev->dev, &freq);
 		if (IS_ERR(opp))
 			break;
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
+#if KERNEL_VERSION(4, 11, 0) <= LINUX_VERSION_CODE
 		dev_pm_opp_put(opp);
-#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) */
+#endif /* KERNEL_VERSION(4, 11, 0) <= LINUX_VERSION_CODE */
 
 		dp->freq_table[i] = freq;
 	}
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
 	rcu_read_unlock();
 #endif
 
@@ -407,7 +431,7 @@ static void kbasep_devfreq_read_suspend_clock(struct kbase_device *kbdev,
 
 static int kbase_devfreq_init_core_mask_table(struct kbase_device *kbdev)
 {
-#if KERNEL_VERSION(3, 18, 0) > LINUX_VERSION_CODE || !defined(CONFIG_OF)
+#ifndef CONFIG_OF
 	/* OPP table initialization requires at least the capability to get
 	 * regulators and clocks from the device tree, as well as parsing
 	 * arrays of unsigned integer values.
@@ -541,11 +565,9 @@ static int kbase_devfreq_init_core_mask_table(struct kbase_device *kbdev)
 	kbdev->num_opps = i;
 
 	return 0;
-#endif /* KERNEL_VERSION(3, 18, 0) > LINUX_VERSION_CODE */
+#endif /* CONFIG_OF */
 }
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
-
 static const char *kbase_devfreq_req_type_name(enum kbase_devfreq_work_type type)
 {
 	const char *p;
@@ -602,12 +624,9 @@ static void kbase_devfreq_suspend_resume_worker(struct work_struct *work)
 	}
 }
 
-#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) */
-
 void kbase_devfreq_enqueue_work(struct kbase_device *kbdev,
 				       enum kbase_devfreq_work_type work_type)
 {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
 	unsigned long flags;
 
 	WARN_ON(work_type == DEVFREQ_WORK_NONE);
@@ -617,12 +636,10 @@ void kbase_devfreq_enqueue_work(struct kbase_device *kbdev,
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 	dev_dbg(kbdev->dev, "Enqueuing devfreq req: %s\n",
 		kbase_devfreq_req_type_name(work_type));
-#endif
 }
 
 static int kbase_devfreq_work_init(struct kbase_device *kbdev)
 {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
 	kbdev->devfreq_queue.req_type = DEVFREQ_WORK_NONE;
 	kbdev->devfreq_queue.acted_type = DEVFREQ_WORK_RESUME;
 
@@ -632,15 +649,12 @@ static int kbase_devfreq_work_init(struct kbase_device *kbdev)
 
 	INIT_WORK(&kbdev->devfreq_queue.work,
 			kbase_devfreq_suspend_resume_worker);
-#endif
 	return 0;
 }
 
 static void kbase_devfreq_work_term(struct kbase_device *kbdev)
 {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
 	destroy_workqueue(kbdev->devfreq_queue.workq);
-#endif
 }
 
 static unsigned long kbase_devfreq_get_static_power(struct devfreq *devfreq,
@@ -661,9 +675,9 @@ int kbase_devfreq_init(struct kbase_device *kbdev)
 	struct devfreq_cooling_power *kbase_dcp = &kbase_cooling_power;
 	struct device_node *np = kbdev->dev->of_node;
 	struct devfreq_dev_profile *dp;
+	int err;
 	struct dev_pm_opp *opp;
 	unsigned long opp_rate;
-	int err;
 	unsigned int i;
 
 	if (kbdev->nr_clocks == 0) {
@@ -726,7 +740,8 @@ int kbase_devfreq_init(struct kbase_device *kbdev)
 	}
 
 	/* devfreq_add_device only copies a few of kbdev->dev's fields, so
-	 * set drvdata explicitly so IPA models can access kbdev. */
+	 * set drvdata explicitly so IPA models can access kbdev.
+	 */
 	dev_set_drvdata(&kbdev->devfreq->dev, kbdev);
 
 	err = devfreq_register_opp_notifier(kbdev->dev, kbdev->devfreq);
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.h
index 7bcd47c70ef0..d1305d382990 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_devfreq.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014, 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _BASE_DEVFREQ_H_
@@ -44,4 +43,20 @@ void kbase_devfreq_force_freq(struct kbase_device *kbdev, unsigned long freq);
 void kbase_devfreq_enqueue_work(struct kbase_device *kbdev,
 				enum kbase_devfreq_work_type work_type);
 
+/**
+ * kbase_devfreq_opp_translate - Translate nominal OPP frequency from devicetree
+ *                               into real frequency & voltage pair, along with
+ *                               core mask
+ * @kbdev:     Device pointer
+ * @freq:      Nominal frequency
+ * @core_mask: Pointer to u64 to store core mask to
+ * @freqs:     Pointer to array of frequencies
+ * @volts:     Pointer to array of voltages
+ *
+ * This function will only perform translation if an operating-points-v2-mali
+ * table is present in devicetree. If one is not present then it will return an
+ * untranslated frequency (and corresponding voltage) and all cores enabled.
+ */
+void kbase_devfreq_opp_translate(struct kbase_device *kbdev, unsigned long freq,
+	u64 *core_mask, unsigned long *freqs, unsigned long *volts);
 #endif /* _BASE_DEVFREQ_H_ */
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_gpuprops_backend.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_gpuprops_backend.c
index 60ae0206d6a8..7542209ca247 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_gpuprops_backend.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_gpuprops_backend.c
@@ -1,12 +1,12 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -17,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -41,12 +39,13 @@ int kbase_backend_gpuprops_get(struct kbase_device *kbdev,
 
 	registers.l2_features = kbase_reg_read(kbdev,
 				GPU_CONTROL_REG(L2_FEATURES));
+	registers.core_features = 0;
 #if !MALI_USE_CSF
+	/* TGOx */
 	registers.core_features = kbase_reg_read(kbdev,
 				GPU_CONTROL_REG(CORE_FEATURES));
 #else /* !MALI_USE_CSF */
-	registers.core_features = 0;
-#endif /* !MALI_USE_CSF */
+#endif /* MALI_USE_CSF */
 	registers.tiler_features = kbase_reg_read(kbdev,
 				GPU_CONTROL_REG(TILER_FEATURES));
 	registers.mem_features = kbase_reg_read(kbdev,
@@ -105,6 +104,16 @@ int kbase_backend_gpuprops_get(struct kbase_device *kbdev,
 	registers.stack_present_hi = kbase_reg_read(kbdev,
 				GPU_CONTROL_REG(STACK_PRESENT_HI));
 
+	if (registers.gpu_id >= GPU_ID2_PRODUCT_MAKE(11, 8, 5, 2)) {
+		registers.gpu_features_lo = kbase_reg_read(kbdev,
+					GPU_CONTROL_REG(GPU_FEATURES_LO));
+		registers.gpu_features_hi = kbase_reg_read(kbdev,
+					GPU_CONTROL_REG(GPU_FEATURES_HI));
+	} else {
+		registers.gpu_features_lo = 0;
+		registers.gpu_features_hi = 0;
+	}
+
 	if (!kbase_is_gpu_removed(kbdev)) {
 		*regdump = registers;
 		return 0;
@@ -112,6 +121,32 @@ int kbase_backend_gpuprops_get(struct kbase_device *kbdev,
 		return -EIO;
 }
 
+int kbase_backend_gpuprops_get_curr_config(struct kbase_device *kbdev,
+		struct kbase_current_config_regdump *curr_config_regdump)
+{
+	if (WARN_ON(!kbdev) || WARN_ON(!curr_config_regdump))
+		return -EINVAL;
+
+	curr_config_regdump->mem_features = kbase_reg_read(kbdev,
+					GPU_CONTROL_REG(MEM_FEATURES));
+
+	curr_config_regdump->shader_present_lo = kbase_reg_read(kbdev,
+					GPU_CONTROL_REG(SHADER_PRESENT_LO));
+	curr_config_regdump->shader_present_hi = kbase_reg_read(kbdev,
+					GPU_CONTROL_REG(SHADER_PRESENT_HI));
+
+	curr_config_regdump->l2_present_lo = kbase_reg_read(kbdev,
+					GPU_CONTROL_REG(L2_PRESENT_LO));
+	curr_config_regdump->l2_present_hi = kbase_reg_read(kbdev,
+					GPU_CONTROL_REG(L2_PRESENT_HI));
+
+	if (WARN_ON(kbase_is_gpu_removed(kbdev)))
+		return -EIO;
+
+	return 0;
+
+}
+
 int kbase_backend_gpuprops_get_features(struct kbase_device *kbdev,
 					struct kbase_gpuprops_regdump *regdump)
 {
@@ -147,11 +182,15 @@ int kbase_backend_gpuprops_get_l2_features(struct kbase_device *kbdev,
 	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_L2_CONFIG)) {
 		u32 l2_features = kbase_reg_read(kbdev,
 				GPU_CONTROL_REG(L2_FEATURES));
+		u32 l2_config =
+			kbase_reg_read(kbdev, GPU_CONTROL_REG(L2_CONFIG));
+
 
 		if (kbase_is_gpu_removed(kbdev))
 			return -EIO;
 
 		regdump->l2_features = l2_features;
+		regdump->l2_config = l2_config;
 	}
 
 	return 0;
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_backend.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_backend.c
index 54b07483dee6..edc2f69e47f7 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_backend.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_backend.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /*
  * GPU backend instrumentation APIs.
  */
@@ -39,9 +36,7 @@ int kbase_instr_hwcnt_enable_internal(struct kbase_device *kbdev,
 {
 	unsigned long flags;
 	int err = -EINVAL;
-#if !MALI_USE_CSF
 	u32 irq_mask;
-#endif
 	u32 prfcnt_config;
 
 	lockdep_assert_held(&kbdev->hwaccess_lock);
@@ -58,12 +53,10 @@ int kbase_instr_hwcnt_enable_internal(struct kbase_device *kbdev,
 		goto out_err;
 	}
 
-#if !MALI_USE_CSF
 	/* Enable interrupt */
 	irq_mask = kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_IRQ_MASK));
 	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_IRQ_MASK), irq_mask |
 						PRFCNT_SAMPLE_COMPLETED);
-#endif
 
 	/* In use, this context is the owner */
 	kbdev->hwcnt.kctx = kctx;
@@ -75,36 +68,13 @@ int kbase_instr_hwcnt_enable_internal(struct kbase_device *kbdev,
 
 	/* Configure */
 	prfcnt_config = kctx->as_nr << PRFCNT_CONFIG_AS_SHIFT;
-#ifdef CONFIG_MALI_PRFCNT_SET_SECONDARY_VIA_DEBUG_FS
-	if (kbdev->hwcnt.backend.use_secondary_override)
+#ifdef CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS
+	prfcnt_config |= kbdev->hwcnt.backend.override_counter_set
+			 << PRFCNT_CONFIG_SETSELECT_SHIFT;
 #else
-	if (enable->use_secondary)
+	prfcnt_config |= enable->counter_set << PRFCNT_CONFIG_SETSELECT_SHIFT;
 #endif
-		prfcnt_config |= 1 << PRFCNT_CONFIG_SETSELECT_SHIFT;
-
-#if MALI_USE_CSF
-	kbase_reg_write(kbdev, GPU_CONTROL_MCU_REG(PRFCNT_CONFIG),
-			prfcnt_config | PRFCNT_CONFIG_MODE_OFF);
-
-	kbase_reg_write(kbdev, GPU_CONTROL_MCU_REG(PRFCNT_BASE_LO),
-					enable->dump_buffer & 0xFFFFFFFF);
-	kbase_reg_write(kbdev, GPU_CONTROL_MCU_REG(PRFCNT_BASE_HI),
-					enable->dump_buffer >> 32);
-
-	kbase_reg_write(kbdev, GPU_CONTROL_MCU_REG(PRFCNT_CSHW_EN),
-					enable->fe_bm);
 
-	kbase_reg_write(kbdev, GPU_CONTROL_MCU_REG(PRFCNT_SHADER_EN),
-					enable->shader_bm);
-	kbase_reg_write(kbdev, GPU_CONTROL_MCU_REG(PRFCNT_MMU_L2_EN),
-					enable->mmu_l2_bm);
-
-	kbase_reg_write(kbdev, GPU_CONTROL_MCU_REG(PRFCNT_TILER_EN),
-					enable->tiler_bm);
-
-	kbase_reg_write(kbdev, GPU_CONTROL_MCU_REG(PRFCNT_CONFIG),
-			prfcnt_config | PRFCNT_CONFIG_MODE_MANUAL);
-#else
 	kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_CONFIG),
 			prfcnt_config | PRFCNT_CONFIG_MODE_OFF);
 
@@ -126,7 +96,6 @@ int kbase_instr_hwcnt_enable_internal(struct kbase_device *kbdev,
 
 	kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_CONFIG),
 			prfcnt_config | PRFCNT_CONFIG_MODE_MANUAL);
-#endif
 
 	spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
 
@@ -138,7 +107,7 @@ int kbase_instr_hwcnt_enable_internal(struct kbase_device *kbdev,
 
 	err = 0;
 
-	dev_dbg(kbdev->dev, "HW counters dumping set-up for context %p", kctx);
+	dev_dbg(kbdev->dev, "HW counters dumping set-up for context %pK", kctx);
 	return err;
  out_err:
 	return err;
@@ -148,9 +117,7 @@ int kbase_instr_hwcnt_disable_internal(struct kbase_context *kctx)
 {
 	unsigned long flags, pm_flags;
 	int err = -EINVAL;
-#if !MALI_USE_CSF
 	u32 irq_mask;
-#endif
 	struct kbase_device *kbdev = kctx->kbdev;
 
 	while (1) {
@@ -185,10 +152,6 @@ int kbase_instr_hwcnt_disable_internal(struct kbase_context *kctx)
 	kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_DISABLED;
 	kbdev->hwcnt.backend.triggered = 0;
 
-#if MALI_USE_CSF
-	/* Disable the counters */
-	kbase_reg_write(kbdev, GPU_CONTROL_MCU_REG(PRFCNT_CONFIG), 0);
-#else
 	/* Disable interrupt */
 	irq_mask = kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_IRQ_MASK));
 	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_IRQ_MASK),
@@ -196,7 +159,6 @@ int kbase_instr_hwcnt_disable_internal(struct kbase_context *kctx)
 
 	/* Disable the counters */
 	kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_CONFIG), 0);
-#endif
 
 	kbdev->hwcnt.kctx = NULL;
 	kbdev->hwcnt.addr = 0ULL;
@@ -205,11 +167,10 @@ int kbase_instr_hwcnt_disable_internal(struct kbase_context *kctx)
 	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, pm_flags);
 
-	dev_dbg(kbdev->dev, "HW counters dumping disabled for context %p",
+	dev_dbg(kbdev->dev, "HW counters dumping disabled for context %pK",
 									kctx);
 
 	err = 0;
-
  out:
 	return err;
 }
@@ -229,7 +190,8 @@ int kbase_instr_hwcnt_request_dump(struct kbase_context *kctx)
 
 	if (kbdev->hwcnt.backend.state != KBASE_INSTR_STATE_IDLE) {
 		/* HW counters are disabled or another dump is ongoing, or we're
-		 * resetting */
+		 * resetting
+		 */
 		goto unlock;
 	}
 
@@ -239,44 +201,26 @@ int kbase_instr_hwcnt_request_dump(struct kbase_context *kctx)
 	 */
 	kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_DUMPING;
 
-
-#if MALI_USE_CSF
-	/* Reconfigure the dump address */
-	kbase_reg_write(kbdev, GPU_CONTROL_MCU_REG(PRFCNT_BASE_LO),
-					kbdev->hwcnt.addr & 0xFFFFFFFF);
-	kbase_reg_write(kbdev, GPU_CONTROL_MCU_REG(PRFCNT_BASE_HI),
-					kbdev->hwcnt.addr >> 32);
-#else
 	/* Reconfigure the dump address */
 	kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_BASE_LO),
 					kbdev->hwcnt.addr & 0xFFFFFFFF);
 	kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_BASE_HI),
 					kbdev->hwcnt.addr >> 32);
-#endif
 
 	/* Start dumping */
 	KBASE_KTRACE_ADD(kbdev, CORE_GPU_PRFCNT_SAMPLE, NULL,
 			kbdev->hwcnt.addr);
 
-#if MALI_USE_CSF
-	kbase_reg_write(kbdev, GPU_CONTROL_MCU_REG(GPU_COMMAND),
-					GPU_COMMAND_PRFCNT_SAMPLE);
-#else
 	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
 					GPU_COMMAND_PRFCNT_SAMPLE);
-#endif
 
-	dev_dbg(kbdev->dev, "HW counters dumping done for context %p", kctx);
+	dev_dbg(kbdev->dev, "HW counters dumping done for context %pK", kctx);
 
 	err = 0;
 
  unlock:
 	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
 
-#if MALI_USE_CSF
-	tasklet_schedule(&kbdev->hwcnt.backend.csf_hwc_irq_poll_tasklet);
-#endif
-
 	return err;
 }
 KBASE_EXPORT_SYMBOL(kbase_instr_hwcnt_request_dump);
@@ -305,86 +249,6 @@ bool kbase_instr_hwcnt_dump_complete(struct kbase_context *kctx,
 }
 KBASE_EXPORT_SYMBOL(kbase_instr_hwcnt_dump_complete);
 
-void kbasep_cache_clean_worker(struct work_struct *data)
-{
-	struct kbase_device *kbdev;
-	unsigned long flags, pm_flags;
-
-	kbdev = container_of(data, struct kbase_device,
-						hwcnt.backend.cache_clean_work);
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, pm_flags);
-	spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
-
-	/* Clean and invalidate the caches so we're sure the mmu tables for the
-	 * dump buffer is valid.
-	 */
-	KBASE_DEBUG_ASSERT(kbdev->hwcnt.backend.state ==
-					KBASE_INSTR_STATE_REQUEST_CLEAN);
-	kbase_gpu_start_cache_clean_nolock(kbdev);
-	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, pm_flags);
-
-	kbase_gpu_wait_cache_clean(kbdev);
-
-	spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
-	KBASE_DEBUG_ASSERT(kbdev->hwcnt.backend.state ==
-					KBASE_INSTR_STATE_REQUEST_CLEAN);
-	/* All finished and idle */
-	kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_IDLE;
-	kbdev->hwcnt.backend.triggered = 1;
-	wake_up(&kbdev->hwcnt.backend.wait);
-
-	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-}
-
-#if MALI_USE_CSF
-/**
- * kbasep_hwcnt_irq_poll_tasklet - tasklet to poll MCU IRQ status register
- *
- * @data: tasklet parameter which pointer to kbdev
- *
- * This tasklet poll GPU_IRQ_STATUS register in GPU_CONTROL_MCU page to check
- * PRFCNT_SAMPLE_COMPLETED bit.
- *
- * Tasklet is needed here since work_queue is too slow and cuased some test
- * cases timeout, the poll_count variable is introduced to avoid infinite
- * loop in unexpected cases, the poll_count is 1 or 2 in normal case, 128
- * should be big enough to exit the tasklet in abnormal cases.
- *
- * Return: void
- */
-static void kbasep_hwcnt_irq_poll_tasklet(unsigned long int data)
-{
-	struct kbase_device *kbdev = (struct kbase_device *)data;
-	unsigned long flags, pm_flags;
-	u32 mcu_gpu_irq_raw_status = 0;
-	u32 poll_count = 0;
-
-	while (1) {
-		spin_lock_irqsave(&kbdev->hwaccess_lock, pm_flags);
-		spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
-		mcu_gpu_irq_raw_status = kbase_reg_read(kbdev,
-			GPU_CONTROL_MCU_REG(GPU_IRQ_RAWSTAT));
-		spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, pm_flags);
-		if (mcu_gpu_irq_raw_status & PRFCNT_SAMPLE_COMPLETED) {
-			kbase_reg_write(kbdev,
-				GPU_CONTROL_MCU_REG(GPU_IRQ_CLEAR),
-				PRFCNT_SAMPLE_COMPLETED);
-			kbase_instr_hwcnt_sample_done(kbdev);
-			break;
-		} else if (poll_count++ > 128) {
-			dev_err(kbdev->dev,
-				"Err: HWC dump timeout, count: %u", poll_count);
-			/* Still call sample_done to unblock waiting thread */
-			kbase_instr_hwcnt_sample_done(kbdev);
-			break;
-		}
-	}
-}
-#endif
-
 void kbase_instr_hwcnt_sample_done(struct kbase_device *kbdev)
 {
 	unsigned long flags;
@@ -395,20 +259,10 @@ void kbase_instr_hwcnt_sample_done(struct kbase_device *kbdev)
 		kbdev->hwcnt.backend.triggered = 1;
 		wake_up(&kbdev->hwcnt.backend.wait);
 	} else if (kbdev->hwcnt.backend.state == KBASE_INSTR_STATE_DUMPING) {
-		if (kbdev->mmu_mode->flags & KBASE_MMU_MODE_HAS_NON_CACHEABLE) {
-			/* All finished and idle */
-			kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_IDLE;
-			kbdev->hwcnt.backend.triggered = 1;
-			wake_up(&kbdev->hwcnt.backend.wait);
-		} else {
-			int ret;
-			/* Always clean and invalidate the cache after a successful dump
-			 */
-			kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_REQUEST_CLEAN;
-			ret = queue_work(kbdev->hwcnt.backend.cache_clean_wq,
-						&kbdev->hwcnt.backend.cache_clean_work);
-			KBASE_DEBUG_ASSERT(ret);
-		}
+		/* All finished and idle */
+		kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_IDLE;
+		kbdev->hwcnt.backend.triggered = 1;
+		wake_up(&kbdev->hwcnt.backend.wait);
 	}
 
 	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
@@ -450,20 +304,16 @@ int kbase_instr_hwcnt_clear(struct kbase_context *kctx)
 	spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
 
 	/* Check it's the context previously set up and we're not already
-	 * dumping */
+	 * dumping
+	 */
 	if (kbdev->hwcnt.kctx != kctx || kbdev->hwcnt.backend.state !=
 							KBASE_INSTR_STATE_IDLE)
 		goto out;
 
 	/* Clear the counters */
 	KBASE_KTRACE_ADD(kbdev, CORE_GPU_PRFCNT_CLEAR, NULL, 0);
-#if MALI_USE_CSF
-	kbase_reg_write(kbdev, GPU_CONTROL_MCU_REG(GPU_COMMAND),
-					GPU_COMMAND_PRFCNT_CLEAR);
-#else
 	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
 						GPU_COMMAND_PRFCNT_CLEAR);
-#endif
 
 	err = 0;
 
@@ -475,46 +325,45 @@ KBASE_EXPORT_SYMBOL(kbase_instr_hwcnt_clear);
 
 int kbase_instr_backend_init(struct kbase_device *kbdev)
 {
-	int ret = 0;
+	spin_lock_init(&kbdev->hwcnt.lock);
 
 	kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_DISABLED;
 
 	init_waitqueue_head(&kbdev->hwcnt.backend.wait);
-	INIT_WORK(&kbdev->hwcnt.backend.cache_clean_work,
-						kbasep_cache_clean_worker);
-
-#if MALI_USE_CSF
-	tasklet_init(&kbdev->hwcnt.backend.csf_hwc_irq_poll_tasklet,
-		     kbasep_hwcnt_irq_poll_tasklet, (unsigned long int)kbdev);
-#endif
 
 	kbdev->hwcnt.backend.triggered = 0;
 
-#ifdef CONFIG_MALI_PRFCNT_SET_SECONDARY_VIA_DEBUG_FS
-	kbdev->hwcnt.backend.use_secondary_override = false;
+#ifdef CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS
+/* Use the build time option for the override default. */
+#if defined(CONFIG_MALI_BIFROST_PRFCNT_SET_SECONDARY)
+	kbdev->hwcnt.backend.override_counter_set = KBASE_HWCNT_SET_SECONDARY;
+#elif defined(CONFIG_MALI_PRFCNT_SET_TERTIARY)
+	kbdev->hwcnt.backend.override_counter_set = KBASE_HWCNT_SET_TERTIARY;
+#else
+	/* Default to primary */
+	kbdev->hwcnt.backend.override_counter_set = KBASE_HWCNT_SET_PRIMARY;
 #endif
-
-	kbdev->hwcnt.backend.cache_clean_wq =
-			alloc_workqueue("Mali cache cleaning workqueue", 0, 1);
-	if (NULL == kbdev->hwcnt.backend.cache_clean_wq)
-		ret = -EINVAL;
-
-	return ret;
+#endif
+	return 0;
 }
 
 void kbase_instr_backend_term(struct kbase_device *kbdev)
 {
-#if MALI_USE_CSF
-	tasklet_kill(&kbdev->hwcnt.backend.csf_hwc_irq_poll_tasklet);
-#endif
-	destroy_workqueue(kbdev->hwcnt.backend.cache_clean_wq);
+	CSTD_UNUSED(kbdev);
 }
 
-#ifdef CONFIG_MALI_PRFCNT_SET_SECONDARY_VIA_DEBUG_FS
+#ifdef CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS
 void kbase_instr_backend_debugfs_init(struct kbase_device *kbdev)
 {
-	debugfs_create_bool("hwcnt_use_secondary", S_IRUGO | S_IWUSR,
-		kbdev->mali_debugfs_directory,
-		&kbdev->hwcnt.backend.use_secondary_override);
+	/* No validation is done on the debugfs input. Invalid input could cause
+	 * performance counter errors. This is acceptable since this is a debug
+	 * only feature and users should know what they are doing.
+	 *
+	 * Valid inputs are the values accepted bythe SET_SELECT bits of the
+	 * PRFCNT_CONFIG register as defined in the architecture specification.
+	*/
+	debugfs_create_u8("hwcnt_set_select", S_IRUGO | S_IWUSR,
+			  kbdev->mali_debugfs_directory,
+			  (u8 *)&kbdev->hwcnt.backend.override_counter_set);
 }
 #endif
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_defs.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_defs.h
index 9f785ce16e17..05d5193b9b1c 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_defs.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_defs.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014, 2016, 2018, 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2016, 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -27,6 +26,8 @@
 #ifndef _KBASE_INSTR_DEFS_H_
 #define _KBASE_INSTR_DEFS_H_
 
+#include "../../mali_kbase_hwcnt_gpu.h"
+
 /*
  * Instrumentation State Machine States
  */
@@ -37,8 +38,6 @@ enum kbase_instr_state {
 	KBASE_INSTR_STATE_IDLE,
 	/* Hardware is currently dumping a frame. */
 	KBASE_INSTR_STATE_DUMPING,
-	/* We've requested a clean to occur on a workqueue */
-	KBASE_INSTR_STATE_REQUEST_CLEAN,
 	/* An error has occured during DUMPING (page fault). */
 	KBASE_INSTR_STATE_FAULT
 };
@@ -47,17 +46,11 @@ enum kbase_instr_state {
 struct kbase_instr_backend {
 	wait_queue_head_t wait;
 	int triggered;
-#ifdef CONFIG_MALI_PRFCNT_SET_SECONDARY_VIA_DEBUG_FS
-	bool use_secondary_override;
+#ifdef CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS
+	enum kbase_hwcnt_physical_set override_counter_set;
 #endif
 
 	enum kbase_instr_state state;
-	struct workqueue_struct *cache_clean_wq;
-	struct work_struct  cache_clean_work;
-#if MALI_USE_CSF
-	struct tasklet_struct csf_hwc_irq_poll_tasklet;
-#endif
 };
 
 #endif /* _KBASE_INSTR_DEFS_H_ */
-
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_internal.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_internal.h
index 2254b9f30d02..c0472fadb687 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_internal.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_instr_internal.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014, 2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2018, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /*
  * Backend-specific HW access instrumentation APIs
  */
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_irq_internal.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_irq_internal.h
index ca3c048b637a..bad249c9ee03 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_irq_internal.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_irq_internal.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014-2015 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2015, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_irq_linux.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_irq_linux.c
index b09db552e639..92aa4e481660 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_irq_linux.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_irq_linux.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2014-2016,2018-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
@@ -215,20 +214,21 @@ int kbase_set_custom_irq_handler(struct kbase_device *kbdev,
 	int result = 0;
 	irq_handler_t requested_irq_handler = NULL;
 
-	KBASE_DEBUG_ASSERT((JOB_IRQ_HANDLER <= irq_type) &&
-						(GPU_IRQ_HANDLER >= irq_type));
+	KBASE_DEBUG_ASSERT((irq_type >= JOB_IRQ_HANDLER) &&
+			   (irq_type <= GPU_IRQ_HANDLER));
 
 	/* Release previous handler */
 	if (kbdev->irqs[irq_type].irq)
 		free_irq(kbdev->irqs[irq_type].irq, kbase_tag(kbdev, irq_type));
 
-	requested_irq_handler = (NULL != custom_handler) ? custom_handler :
-						kbase_handler_table[irq_type];
+	requested_irq_handler = (custom_handler != NULL) ?
+					custom_handler :
+					kbase_handler_table[irq_type];
 
-	if (0 != request_irq(kbdev->irqs[irq_type].irq,
-			requested_irq_handler,
+	if (request_irq(kbdev->irqs[irq_type].irq, requested_irq_handler,
 			kbdev->irqs[irq_type].flags | IRQF_SHARED,
-			dev_name(kbdev->dev), kbase_tag(kbdev, irq_type))) {
+			dev_name(kbdev->dev),
+			kbase_tag(kbdev, irq_type)) != 0) {
 		result = -EINVAL;
 		dev_err(kbdev->dev, "Can't request interrupt %d (index %d)\n",
 					kbdev->irqs[irq_type].irq, irq_type);
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_as.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_as.c
index 9b775898dac2..57ff67b75cab 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_as.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_as.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,11 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
 /*
  * Register backend context / address space management
  */
@@ -190,8 +188,8 @@ int kbase_backend_find_and_release_free_address_space(
 			}
 
 			/* Context was retained while locks were dropped,
-			 * continue looking for free AS */
-
+			 * continue looking for free AS
+			 */
 			mutex_unlock(&js_devdata->runpool_mutex);
 			mutex_unlock(&as_js_kctx_info->ctx.jsctx_mutex);
 
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_defs.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_defs.h
index 9cccf224999e..97663c7d00eb 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_defs.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_defs.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014-2016, 2018-2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,11 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
 /*
  * Register-based HW access backend specific definitions
  */
@@ -78,9 +76,8 @@ struct slot_rb {
  * The hwaccess_lock (a spinlock) must be held when accessing this structure
  */
 struct kbase_backend_data {
-	struct slot_rb slot_rb[BASE_JM_MAX_NR_SLOTS];
-
 #if !MALI_USE_CSF
+	struct slot_rb slot_rb[BASE_JM_MAX_NR_SLOTS];
 	struct hrtimer scheduling_timer;
 
 	bool timer_running;
@@ -94,13 +91,16 @@ struct kbase_backend_data {
 /* kbase_prepare_to_reset_gpu has been called */
 #define KBASE_RESET_GPU_PREPARED        1
 /* kbase_reset_gpu has been called - the reset will now definitely happen
- * within the timeout period */
+ * within the timeout period
+ */
 #define KBASE_RESET_GPU_COMMITTED       2
 /* The GPU reset process is currently occuring (timeout has expired or
- * kbasep_try_reset_gpu_early was called) */
+ * kbasep_try_reset_gpu_early was called)
+ */
 #define KBASE_RESET_GPU_HAPPENING       3
 /* Reset the GPU silently, used when resetting the GPU as part of normal
- * behavior (e.g. when exiting protected mode). */
+ * behavior (e.g. when exiting protected mode).
+ */
 #define KBASE_RESET_GPU_SILENT          4
 	struct workqueue_struct *reset_workq;
 	struct work_struct reset_work;
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_hw.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_hw.c
index 19661c9766c6..6acacf1eeed4 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_hw.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_hw.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -41,10 +40,12 @@
 #include <mali_kbase_regs_history_debugfs.h>
 
 static void kbasep_try_reset_gpu_early_locked(struct kbase_device *kbdev);
+static u64 kbasep_apply_limited_core_mask(const struct kbase_device *kbdev,
+				const u64 affinity, const u64 limited_core_mask);
 
 static u64 kbase_job_write_affinity(struct kbase_device *kbdev,
 				base_jd_core_req core_req,
-				int js)
+				int js, const u64 limited_core_mask)
 {
 	u64 affinity;
 
@@ -73,14 +74,21 @@ static u64 kbase_job_write_affinity(struct kbase_device *kbdev,
 		 */
 		if (js == 2 && num_core_groups > 1)
 			affinity &= coherency_info->group[1].core_mask;
-		else
+		else if (num_core_groups > 1)
 			affinity &= coherency_info->group[0].core_mask;
+		else
+			affinity &= kbdev->gpu_props.curr_config.shader_present;
 	} else {
 		/* Use all cores */
 		affinity = kbdev->pm.backend.shaders_avail &
 				kbdev->pm.debug_core_mask[js];
 	}
 
+	if (core_req & BASE_JD_REQ_LIMITED_CORE_MASK) {
+		/* Limiting affinity due to BASE_JD_REQ_LIMITED_CORE_MASK by applying the limited core mask. */
+		affinity = kbasep_apply_limited_core_mask(kbdev, affinity, limited_core_mask);
+	}
+
 	if (unlikely(!affinity)) {
 #ifdef CONFIG_MALI_BIFROST_DEBUG
 		u64 shaders_ready =
@@ -90,6 +98,16 @@ static u64 kbase_job_write_affinity(struct kbase_device *kbdev,
 #endif
 
 		affinity = kbdev->pm.backend.shaders_avail;
+
+		if (core_req & BASE_JD_REQ_LIMITED_CORE_MASK) {
+			/* Limiting affinity again to make sure it only enables shader cores with backed TLS memory. */
+			affinity = kbasep_apply_limited_core_mask(kbdev, affinity, limited_core_mask);
+
+#ifdef CONFIG_MALI_BIFROST_DEBUG
+			/* affinity should never be 0 */
+			WARN_ON(!affinity);
+#endif
+		}
 	}
 
 	kbase_reg_write(kbdev, JOB_SLOT_REG(js, JS_AFFINITY_NEXT_LO),
@@ -170,7 +188,7 @@ static u64 select_job_chain(struct kbase_jd_atom *katom)
 	}
 
 	dev_dbg(kctx->kbdev->dev,
-		"Selected job chain 0x%llx for end atom %p in state %d\n",
+		"Selected job chain 0x%llx for end atom %pK in state %d\n",
 		jc, (void *)katom, (int)rp->state);
 
 	katom->jc = jc;
@@ -194,7 +212,7 @@ void kbase_job_hw_submit(struct kbase_device *kbdev,
 	/* Command register must be available */
 	KBASE_DEBUG_ASSERT(kbasep_jm_is_js_free(kbdev, js, kctx));
 
-	dev_dbg(kctx->kbdev->dev, "Write JS_HEAD_NEXT 0x%llx for atom %p\n",
+	dev_dbg(kctx->kbdev->dev, "Write JS_HEAD_NEXT 0x%llx for atom %pK\n",
 		jc_head, (void *)katom);
 
 	kbase_reg_write(kbdev, JOB_SLOT_REG(js, JS_HEAD_NEXT_LO),
@@ -202,10 +220,12 @@ void kbase_job_hw_submit(struct kbase_device *kbdev,
 	kbase_reg_write(kbdev, JOB_SLOT_REG(js, JS_HEAD_NEXT_HI),
 						jc_head >> 32);
 
-	affinity = kbase_job_write_affinity(kbdev, katom->core_req, js);
+	affinity = kbase_job_write_affinity(kbdev, katom->core_req, js,
+						kctx->limited_core_mask);
 
 	/* start MMU, medium priority, cache clean/flush on end, clean/flush on
-	 * start */
+	 * start
+	 */
 	cfg = kctx->as_nr;
 
 	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_FLUSH_REDUCTION) &&
@@ -257,7 +277,7 @@ void kbase_job_hw_submit(struct kbase_device *kbdev,
 	katom->start_timestamp = ktime_get();
 
 	/* GO ! */
-	dev_dbg(kbdev->dev, "JS: Submitting atom %p from ctx %p to js[%d] with head=0x%llx",
+	dev_dbg(kbdev->dev, "JS: Submitting atom %pK from ctx %pK to js[%d] with head=0x%llx",
 				katom, kctx, js, jc_head);
 
 	KBASE_KTRACE_ADD_JM_SLOT_INFO(kbdev, JM_SUBMIT, kctx, katom, jc_head, js,
@@ -331,7 +351,8 @@ static void kbasep_job_slot_update_head_start_timestamp(
 			/* Only update the timestamp if it's a better estimate
 			 * than what's currently stored. This is because our
 			 * estimate that accounts for the throttle time may be
-			 * too much of an overestimate */
+			 * too much of an overestimate
+			 */
 			katom->start_timestamp = end_timestamp;
 		}
 	}
@@ -374,9 +395,9 @@ void kbase_job_done(struct kbase_device *kbdev, u32 done)
 		/* treat failed slots as finished slots */
 		u32 finished = (done & 0xFFFF) | failed;
 
-		/* Note: This is inherently unfair, as we always check
-		 * for lower numbered interrupts before the higher
-		 * numbered ones.*/
+		/* Note: This is inherently unfair, as we always check for lower
+		 * numbered interrupts before the higher numbered ones.
+		 */
 		i = ffs(finished) - 1;
 		KBASE_DEBUG_ASSERT(i >= 0);
 
@@ -388,7 +409,8 @@ void kbase_job_done(struct kbase_device *kbdev, u32 done)
 
 			if (failed & (1u << i)) {
 				/* read out the job slot status code if the job
-				 * slot reported failure */
+				 * slot reported failure
+				 */
 				completion_code = kbase_reg_read(kbdev,
 					JOB_SLOT_REG(i, JS_STATUS));
 
@@ -402,7 +424,8 @@ void kbase_job_done(struct kbase_device *kbdev, u32 done)
 
 					/* Soft-stopped job - read the value of
 					 * JS<n>_TAIL so that the job chain can
-					 * be resumed */
+					 * be resumed
+					 */
 					job_tail = (u64)kbase_reg_read(kbdev,
 						JOB_SLOT_REG(i, JS_TAIL_LO)) |
 						((u64)kbase_reg_read(kbdev,
@@ -411,21 +434,26 @@ void kbase_job_done(struct kbase_device *kbdev, u32 done)
 				} else if (completion_code ==
 						BASE_JD_EVENT_NOT_STARTED) {
 					/* PRLAM-10673 can cause a TERMINATED
-					 * job to come back as NOT_STARTED, but
-					 * the error interrupt helps us detect
-					 * it */
+					 * job to come back as NOT_STARTED,
+					 * but the error interrupt helps us
+					 * detect it
+					 */
 					completion_code =
 						BASE_JD_EVENT_TERMINATED;
 				}
 
 				kbase_gpu_irq_evict(kbdev, i, completion_code);
 
-				/* Some jobs that encounter a BUS FAULT may result in corrupted
-				 * state causing future jobs to hang. Reset GPU before
-				 * allowing any other jobs on the slot to continue. */
+				/* Some jobs that encounter a BUS FAULT may
+				 * result in corrupted state causing future
+				 * jobs to hang. Reset GPU before allowing
+				 * any other jobs on the slot to continue.
+				 */
 				if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_TTRX_3076)) {
 					if (completion_code == BASE_JD_EVENT_JOB_BUS_FAULT) {
-						if (kbase_prepare_to_reset_gpu_locked(kbdev))
+						if (kbase_prepare_to_reset_gpu_locked(
+							    kbdev,
+							    RESET_FLAGS_NONE))
 							kbase_reset_gpu_locked(kbdev);
 					}
 				}
@@ -483,7 +511,8 @@ void kbase_job_done(struct kbase_device *kbdev, u32 done)
 
 				if ((rawstat >> (i + 16)) & 1) {
 					/* There is a failed job that we've
-					 * missed - add it back to active */
+					 * missed - add it back to active
+					 */
 					active |= (1u << i);
 				}
 			}
@@ -585,7 +614,8 @@ void kbasep_job_slot_soft_or_hard_stop_do_action(struct kbase_device *kbdev,
 		}
 
 		/* We are about to issue a soft stop, so mark the atom as having
-		 * been soft stopped */
+		 * been soft stopped
+		 */
 		target_katom->atom_flags |= KBASE_KATOM_FLAG_BEEN_SOFT_STOPPED;
 
 		/* Mark the point where we issue the soft-stop command */
@@ -781,7 +811,7 @@ static int softstop_start_rp_nolock(
 
 	if (!(katom->core_req & BASE_JD_REQ_START_RENDERPASS)) {
 		dev_dbg(kctx->kbdev->dev,
-			"Atom %p on job slot is not start RP\n", (void *)katom);
+			"Atom %pK on job slot is not start RP\n", (void *)katom);
 		return -EPERM;
 	}
 
@@ -794,13 +824,13 @@ static int softstop_start_rp_nolock(
 		rp->state != KBASE_JD_RP_RETRY))
 		return -EINVAL;
 
-	dev_dbg(kctx->kbdev->dev, "OOM in state %d with region %p\n",
+	dev_dbg(kctx->kbdev->dev, "OOM in state %d with region %pK\n",
 		(int)rp->state, (void *)reg);
 
 	if (WARN_ON(katom != rp->start_katom))
 		return -EINVAL;
 
-	dev_dbg(kctx->kbdev->dev, "Adding region %p to list %p\n",
+	dev_dbg(kctx->kbdev->dev, "Adding region %pK to list %pK\n",
 		(void *)reg, (void *)&rp->oom_reg_list);
 	list_move_tail(&reg->link, &rp->oom_reg_list);
 	dev_dbg(kctx->kbdev->dev, "Added region to list\n");
@@ -845,9 +875,9 @@ void kbase_jm_wait_for_zero_jobs(struct kbase_context *kctx)
 	if (timeout != 0)
 		goto exit;
 
-	if (kbase_prepare_to_reset_gpu(kbdev)) {
+	if (kbase_prepare_to_reset_gpu(kbdev, RESET_FLAGS_NONE)) {
 		dev_err(kbdev->dev,
-			"Issueing GPU soft-reset because jobs failed to be killed (within %d ms) as part of context termination (e.g. process exit)\n",
+			"Issuing GPU soft-reset because jobs failed to be killed (within %d ms) as part of context termination (e.g. process exit)\n",
 			ZAP_TIMEOUT);
 		kbase_reset_gpu(kbdev);
 	}
@@ -855,7 +885,7 @@ void kbase_jm_wait_for_zero_jobs(struct kbase_context *kctx)
 	/* Wait for the reset to complete */
 	kbase_reset_gpu_wait(kbdev);
 exit:
-	dev_dbg(kbdev->dev, "Zap: Finished Context %p", kctx);
+	dev_dbg(kbdev->dev, "Zap: Finished Context %pK", kctx);
 
 	/* Ensure that the signallers of the waitqs have finished */
 	mutex_lock(&kctx->jctx.lock);
@@ -916,7 +946,7 @@ KBASE_EXPORT_TEST_API(kbase_job_slot_term);
 void kbase_job_slot_softstop_swflags(struct kbase_device *kbdev, int js,
 			struct kbase_jd_atom *target_katom, u32 sw_flags)
 {
-	dev_dbg(kbdev->dev, "Soft-stop atom %p with flags 0x%x (s:%d)\n",
+	dev_dbg(kbdev->dev, "Soft-stop atom %pK with flags 0x%x (s:%d)\n",
 		target_katom, sw_flags, js);
 
 	KBASE_DEBUG_ASSERT(!(sw_flags & JS_COMMAND_MASK));
@@ -1020,6 +1050,33 @@ void kbase_job_check_leave_disjoint(struct kbase_device *kbdev,
 	}
 }
 
+int kbase_reset_gpu_prevent_and_wait(struct kbase_device *kbdev)
+{
+	WARN(true, "%s Not implemented for JM GPUs", __func__);
+	return -EINVAL;
+}
+
+int kbase_reset_gpu_try_prevent(struct kbase_device *kbdev)
+{
+	WARN(true, "%s Not implemented for JM GPUs", __func__);
+	return -EINVAL;
+}
+
+void kbase_reset_gpu_allow(struct kbase_device *kbdev)
+{
+	WARN(true, "%s Not implemented for JM GPUs", __func__);
+}
+
+void kbase_reset_gpu_assert_prevented(struct kbase_device *kbdev)
+{
+	WARN(true, "%s Not implemented for JM GPUs", __func__);
+}
+
+void kbase_reset_gpu_assert_failed_or_prevented(struct kbase_device *kbdev)
+{
+	WARN(true, "%s Not implemented for JM GPUs", __func__);
+}
+
 static void kbase_debug_dump_registers(struct kbase_device *kbdev)
 {
 	int i;
@@ -1086,13 +1143,15 @@ static void kbasep_reset_timeout_worker(struct work_struct *data)
 
 	/* Make sure the timer has completed - this cannot be done from
 	 * interrupt context, so this cannot be done within
-	 * kbasep_try_reset_gpu_early. */
+	 * kbasep_try_reset_gpu_early.
+	 */
 	hrtimer_cancel(&kbdev->hwaccess.backend.reset_timer);
 
 	if (kbase_pm_context_active_handle_suspend(kbdev,
 				KBASE_PM_SUSPEND_HANDLER_DONT_REACTIVATE)) {
 		/* This would re-activate the GPU. Since it's already idle,
-		 * there's no need to reset it */
+		 * there's no need to reset it
+		 */
 		atomic_set(&kbdev->hwaccess.backend.reset_gpu,
 						KBASE_RESET_GPU_NOT_PENDING);
 		kbase_disjoint_state_down(kbdev);
@@ -1113,14 +1172,16 @@ static void kbasep_reset_timeout_worker(struct work_struct *data)
 	kbdev->irq_reset_flush = true;
 
 	/* Disable IRQ to avoid IRQ handlers to kick in after releasing the
-	 * spinlock; this also clears any outstanding interrupts */
+	 * spinlock; this also clears any outstanding interrupts
+	 */
 	kbase_pm_disable_interrupts_nolock(kbdev);
 
 	spin_unlock(&kbdev->mmu_mask_change);
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 
 	/* Ensure that any IRQ handlers have finished
-	 * Must be done without any locks IRQ handlers will take */
+	 * Must be done without any locks IRQ handlers will take
+	 */
 	kbase_synchronize_irqs(kbdev);
 
 	/* Flush out any in-flight work items */
@@ -1131,7 +1192,8 @@ static void kbasep_reset_timeout_worker(struct work_struct *data)
 
 	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_TMIX_8463)) {
 		/* Ensure that L2 is not transitioning when we send the reset
-		 * command */
+		 * command
+		 */
 		while (--max_loops && kbase_pm_get_trans_cores(kbdev,
 				KBASE_PM_CORE_L2))
 			;
@@ -1146,14 +1208,16 @@ static void kbasep_reset_timeout_worker(struct work_struct *data)
 	/* All slot have been soft-stopped and we've waited
 	 * SOFT_STOP_RESET_TIMEOUT for the slots to clear, at this point we
 	 * assume that anything that is still left on the GPU is stuck there and
-	 * we'll kill it when we reset the GPU */
+	 * we'll kill it when we reset the GPU
+	 */
 
 	if (!silent)
 		dev_err(kbdev->dev, "Resetting GPU (allowing up to %d ms)",
 								RESET_TIMEOUT);
 
 	/* Output the state of some interesting registers to help in the
-	 * debugging of GPU resets */
+	 * debugging of GPU resets
+	 */
 	if (!silent)
 		kbase_debug_dump_registers(kbdev);
 
@@ -1192,7 +1256,8 @@ static void kbasep_reset_timeout_worker(struct work_struct *data)
 	kbase_pm_update_cores_state(kbdev);
 
 	/* Synchronously request and wait for those cores, because if
-	 * instrumentation is enabled it would need them immediately. */
+	 * instrumentation is enabled it would need them immediately.
+	 */
 	kbase_pm_wait_for_desired_state(kbdev);
 
 	mutex_unlock(&kbdev->pm.lock);
@@ -1269,7 +1334,8 @@ static void kbasep_try_reset_gpu_early_locked(struct kbase_device *kbdev)
 
 	/* Check that the reset has been committed to (i.e. kbase_reset_gpu has
 	 * been called), and that no other thread beat this thread to starting
-	 * the reset */
+	 * the reset
+	 */
 	if (atomic_cmpxchg(&kbdev->hwaccess.backend.reset_gpu,
 			KBASE_RESET_GPU_COMMITTED, KBASE_RESET_GPU_HAPPENING) !=
 						KBASE_RESET_GPU_COMMITTED) {
@@ -1293,6 +1359,7 @@ static void kbasep_try_reset_gpu_early(struct kbase_device *kbdev)
 /**
  * kbase_prepare_to_reset_gpu_locked - Prepare for resetting the GPU
  * @kbdev: kbase device
+ * @flags: Bitfield indicating impact of reset (see flag defines)
  *
  * This function just soft-stops all the slots to ensure that as many jobs as
  * possible are saved.
@@ -1303,10 +1370,12 @@ static void kbasep_try_reset_gpu_early(struct kbase_device *kbdev)
  *   false - Another thread is performing a reset, kbase_reset_gpu should
  *   not be called.
  */
-bool kbase_prepare_to_reset_gpu_locked(struct kbase_device *kbdev)
+bool kbase_prepare_to_reset_gpu_locked(struct kbase_device *kbdev,
+				       unsigned int flags)
 {
 	int i;
 
+	CSTD_UNUSED(flags);
 	KBASE_DEBUG_ASSERT(kbdev);
 
 #ifdef CONFIG_MALI_ARBITER_SUPPORT
@@ -1334,14 +1403,14 @@ bool kbase_prepare_to_reset_gpu_locked(struct kbase_device *kbdev)
 	return true;
 }
 
-bool kbase_prepare_to_reset_gpu(struct kbase_device *kbdev)
+bool kbase_prepare_to_reset_gpu(struct kbase_device *kbdev, unsigned int flags)
 {
-	unsigned long flags;
+	unsigned long lock_flags;
 	bool ret;
 
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	ret = kbase_prepare_to_reset_gpu_locked(kbdev);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+	spin_lock_irqsave(&kbdev->hwaccess_lock, lock_flags);
+	ret = kbase_prepare_to_reset_gpu_locked(kbdev, flags);
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, lock_flags);
 
 	return ret;
 }
@@ -1362,7 +1431,8 @@ void kbase_reset_gpu(struct kbase_device *kbdev)
 	KBASE_DEBUG_ASSERT(kbdev);
 
 	/* Note this is an assert/atomic_set because it is a software issue for
-	 * a race to be occuring here */
+	 * a race to be occurring here
+	 */
 	KBASE_DEBUG_ASSERT(atomic_read(&kbdev->hwaccess.backend.reset_gpu) ==
 						KBASE_RESET_GPU_PREPARED);
 	atomic_set(&kbdev->hwaccess.backend.reset_gpu,
@@ -1385,7 +1455,8 @@ void kbase_reset_gpu_locked(struct kbase_device *kbdev)
 	KBASE_DEBUG_ASSERT(kbdev);
 
 	/* Note this is an assert/atomic_set because it is a software issue for
-	 * a race to be occuring here */
+	 * a race to be occurring here
+	 */
 	KBASE_DEBUG_ASSERT(atomic_read(&kbdev->hwaccess.backend.reset_gpu) ==
 						KBASE_RESET_GPU_PREPARED);
 	atomic_set(&kbdev->hwaccess.backend.reset_gpu,
@@ -1460,3 +1531,21 @@ void kbase_reset_gpu_term(struct kbase_device *kbdev)
 {
 	destroy_workqueue(kbdev->hwaccess.backend.reset_workq);
 }
+
+static u64 kbasep_apply_limited_core_mask(const struct kbase_device *kbdev,
+				const u64 affinity, const u64 limited_core_mask)
+{
+	const u64 result = affinity & limited_core_mask;
+
+#ifdef CONFIG_MALI_BIFROST_DEBUG
+	dev_dbg(kbdev->dev,
+				"Limiting affinity due to BASE_JD_REQ_LIMITED_CORE_MASK from 0x%lx to 0x%lx (mask is 0x%lx)\n",
+				(unsigned long int)affinity,
+				(unsigned long int)result,
+				(unsigned long int)limited_core_mask);
+#else
+	CSTD_UNUSED(kbdev);
+#endif
+
+	return result;
+}
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_internal.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_internal.h
index cd1f9794fdc4..6761cbd9a32a 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_internal.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_internal.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2011-2016, 2018-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /*
  * Job Manager backend-specific low-level APIs.
  */
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_rb.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_rb.c
index afaaef27883d..5fdf9b63d263 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_rb.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_rb.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,11 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
 /*
  * Register-based HW access backend specific APIs
  */
@@ -40,10 +38,12 @@
 #include <backend/gpu/mali_kbase_pm_internal.h>
 
 /* Return whether the specified ringbuffer is empty. HW access lock must be
- * held */
+ * held
+ */
 #define SLOT_RB_EMPTY(rb)   (rb->write_idx == rb->read_idx)
 /* Return number of atoms currently in the specified ringbuffer. HW access lock
- * must be held */
+ * must be held
+ */
 #define SLOT_RB_ENTRIES(rb) (int)(s8)(rb->write_idx - rb->read_idx)
 
 static void kbase_gpu_release_atom(struct kbase_device *kbdev,
@@ -284,7 +284,8 @@ static void kbase_gpu_release_atom(struct kbase_device *kbdev,
 		kbase_kinstr_jm_atom_hw_release(katom);
 		/* Inform power management at start/finish of atom so it can
 		 * update its GPU utilisation metrics. Mark atom as not
-		 * submitted beforehand. */
+		 * submitted beforehand.
+		 */
 		katom->gpu_rb_state = KBASE_ATOM_GPU_RB_READY;
 		kbase_pm_metrics_update(kbdev, end_timestamp);
 
@@ -544,7 +545,8 @@ static int kbase_jm_enter_protected_mode(struct kbase_device *kbdev,
 		KBASE_TLSTREAM_AUX_PROTECTED_ENTER_START(kbdev, kbdev);
 		/* The checks in KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_PREV
 		 * should ensure that we are not already transitiong, and that
-		 * there are no atoms currently on the GPU. */
+		 * there are no atoms currently on the GPU.
+		 */
 		WARN_ON(kbdev->protected_mode_transition);
 		WARN_ON(kbase_gpu_atoms_submitted_any(kbdev));
 		/* If hwcnt is disabled, it means we didn't clean up correctly
@@ -570,19 +572,15 @@ static int kbase_jm_enter_protected_mode(struct kbase_device *kbdev,
 
 		/* We couldn't disable atomically, so kick off a worker */
 		if (!kbdev->protected_mode_hwcnt_disabled) {
-#if KERNEL_VERSION(3, 16, 0) > LINUX_VERSION_CODE
-			queue_work(system_wq,
-				&kbdev->protected_mode_hwcnt_disable_work);
-#else
-			queue_work(system_highpri_wq,
+			kbase_hwcnt_context_queue_work(
+				kbdev->hwcnt_gpu_ctx,
 				&kbdev->protected_mode_hwcnt_disable_work);
-#endif
 			return -EAGAIN;
 		}
 
-		/* Once reaching this point GPU must be
-		 * switched to protected mode or hwcnt
-		 * re-enabled. */
+		/* Once reaching this point GPU must be switched to protected
+		 * mode or hwcnt re-enabled.
+		 */
 
 		if (kbase_pm_protected_entry_override_enable(kbdev))
 			return -EAGAIN;
@@ -722,7 +720,8 @@ static int kbase_jm_exit_protected_mode(struct kbase_device *kbdev,
 		KBASE_TLSTREAM_AUX_PROTECTED_LEAVE_START(kbdev, kbdev);
 		/* The checks in KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_PREV
 		 * should ensure that we are not already transitiong, and that
-		 * there are no atoms currently on the GPU. */
+		 * there are no atoms currently on the GPU.
+		 */
 		WARN_ON(kbdev->protected_mode_transition);
 		WARN_ON(kbase_gpu_atoms_submitted_any(kbdev));
 
@@ -768,8 +767,8 @@ static int kbase_jm_exit_protected_mode(struct kbase_device *kbdev,
 			katom[idx]->event_code = BASE_JD_EVENT_JOB_INVALID;
 			kbase_gpu_mark_atom_for_return(kbdev, katom[idx]);
 			/* Only return if head atom or previous atom
-			 * already removed - as atoms must be returned
-			 * in order */
+			 * already removed - as atoms must be returned in order
+			 */
 			if (idx == 0 || katom[0]->gpu_rb_state ==
 					KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB) {
 				kbase_gpu_dequeue_atom(kbdev, js, NULL);
@@ -912,12 +911,14 @@ void kbase_backend_slot_update(struct kbase_device *kbdev)
 					kbase_gpu_mark_atom_for_return(kbdev,
 							katom[idx]);
 					/* Set EVENT_DONE so this atom will be
-					   completed, not unpulled. */
+					 * completed, not unpulled.
+					 */
 					katom[idx]->event_code =
 						BASE_JD_EVENT_DONE;
 					/* Only return if head atom or previous
 					 * atom already removed - as atoms must
-					 * be returned in order. */
+					 * be returned in order.
+					 */
 					if (idx == 0 ||	katom[0]->gpu_rb_state ==
 							KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB) {
 						kbase_gpu_dequeue_atom(kbdev, js, NULL);
@@ -948,7 +949,8 @@ void kbase_backend_slot_update(struct kbase_device *kbdev)
 
 				if (idx == 1) {
 					/* Only submit if head atom or previous
-					 * atom already submitted */
+					 * atom already submitted
+					 */
 					if ((katom[0]->gpu_rb_state !=
 						KBASE_ATOM_GPU_RB_SUBMITTED &&
 						katom[0]->gpu_rb_state !=
@@ -964,7 +966,8 @@ void kbase_backend_slot_update(struct kbase_device *kbdev)
 				}
 
 				/* If inter-slot serialization in use then don't
-				 * submit atom if any other slots are in use */
+				 * submit atom if any other slots are in use
+				 */
 				if ((kbdev->serialize_jobs &
 						KBASE_SERIALIZE_INTER_SLOT) &&
 						other_slots_busy(kbdev, js))
@@ -976,7 +979,8 @@ void kbase_backend_slot_update(struct kbase_device *kbdev)
 					break;
 #endif
 				/* Check if this job needs the cycle counter
-				 * enabled before submission */
+				 * enabled before submission
+				 */
 				if (katom[idx]->core_req & BASE_JD_REQ_PERMON)
 					kbase_pm_request_gpu_cycle_counter_l2_is_on(
 									kbdev);
@@ -987,7 +991,8 @@ void kbase_backend_slot_update(struct kbase_device *kbdev)
 
 				/* Inform power management at start/finish of
 				 * atom so it can update its GPU utilisation
-				 * metrics. */
+				 * metrics.
+				 */
 				kbase_pm_metrics_update(kbdev,
 						&katom[idx]->start_timestamp);
 
@@ -1000,7 +1005,8 @@ void kbase_backend_slot_update(struct kbase_device *kbdev)
 			case KBASE_ATOM_GPU_RB_RETURN_TO_JS:
 				/* Only return if head atom or previous atom
 				 * already removed - as atoms must be returned
-				 * in order */
+				 * in order
+				 */
 				if (idx == 0 || katom[0]->gpu_rb_state ==
 					KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB) {
 					kbase_gpu_dequeue_atom(kbdev, js, NULL);
@@ -1018,7 +1024,7 @@ void kbase_backend_run_atom(struct kbase_device *kbdev,
 				struct kbase_jd_atom *katom)
 {
 	lockdep_assert_held(&kbdev->hwaccess_lock);
-	dev_dbg(kbdev->dev, "Backend running atom %p\n", (void *)katom);
+	dev_dbg(kbdev->dev, "Backend running atom %pK\n", (void *)katom);
 
 	kbase_gpu_enqueue_atom(kbdev, katom);
 	kbase_backend_slot_update(kbdev);
@@ -1079,7 +1085,7 @@ void kbase_gpu_complete_hw(struct kbase_device *kbdev, int js,
 	struct kbase_context *kctx = katom->kctx;
 
 	dev_dbg(kbdev->dev,
-		"Atom %p completed on hw with code 0x%x and job_tail 0x%llx (s:%d)\n",
+		"Atom %pK completed on hw with code 0x%x and job_tail 0x%llx (s:%d)\n",
 		(void *)katom, completion_code, job_tail, js);
 
 	lockdep_assert_held(&kbdev->hwaccess_lock);
@@ -1103,7 +1109,8 @@ void kbase_gpu_complete_hw(struct kbase_device *kbdev, int js,
 		 * BASE_JD_REQ_SKIP_CACHE_END is set, the GPU cache is not
 		 * flushed. To prevent future evictions causing possible memory
 		 * corruption we need to flush the cache manually before any
-		 * affected memory gets reused. */
+		 * affected memory gets reused.
+		 */
 		katom->need_cache_flush_cores_retained = true;
 	}
 
@@ -1184,7 +1191,8 @@ void kbase_gpu_complete_hw(struct kbase_device *kbdev, int js,
 					katom_idx1->gpu_rb_state !=
 					KBASE_ATOM_GPU_RB_SUBMITTED) {
 				/* Can not dequeue this atom yet - will be
-				 * dequeued when atom at idx0 completes */
+				 * dequeued when atom at idx0 completes
+				 */
 				katom_idx1->event_code = BASE_JD_EVENT_STOPPED;
 				kbase_gpu_mark_atom_for_return(kbdev,
 								katom_idx1);
@@ -1197,7 +1205,7 @@ void kbase_gpu_complete_hw(struct kbase_device *kbdev, int js,
 	if (job_tail != 0 && job_tail != katom->jc) {
 		/* Some of the job has been executed */
 		dev_dbg(kbdev->dev,
-			"Update job chain address of atom %p to resume from 0x%llx\n",
+			"Update job chain address of atom %pK to resume from 0x%llx\n",
 			(void *)katom, job_tail);
 
 		katom->jc = job_tail;
@@ -1258,7 +1266,7 @@ void kbase_gpu_complete_hw(struct kbase_device *kbdev, int js,
 
 	if (katom) {
 		dev_dbg(kbdev->dev,
-			"Cross-slot dependency %p has become runnable.\n",
+			"Cross-slot dependency %pK has become runnable.\n",
 			(void *)katom);
 
 		/* Check if there are lower priority jobs to soft stop */
@@ -1271,7 +1279,8 @@ void kbase_gpu_complete_hw(struct kbase_device *kbdev, int js,
 	kbase_pm_update_state(kbdev);
 
 	/* Job completion may have unblocked other atoms. Try to update all job
-	 * slots */
+	 * slots
+	 */
 	kbase_backend_slot_update(kbdev);
 }
 
@@ -1322,7 +1331,8 @@ void kbase_backend_reset(struct kbase_device *kbdev, ktime_t *end_timestamp)
 				katom->protected_state.exit = KBASE_ATOM_EXIT_PROTECTED_CHECK;
 				/* As the atom was not removed, increment the
 				 * index so that we read the correct atom in the
-				 * next iteration. */
+				 * next iteration.
+				 */
 				atom_idx++;
 				continue;
 			}
@@ -1425,7 +1435,8 @@ bool kbase_backend_soft_hard_stop_slot(struct kbase_device *kbdev,
 		katom_idx0_valid = (katom_idx0 == katom);
 		/* If idx0 is to be removed and idx1 is on the same context,
 		 * then idx1 must also be removed otherwise the atoms might be
-		 * returned out of order */
+		 * returned out of order
+		 */
 		if (katom_idx1)
 			katom_idx1_valid = (katom_idx1 == katom) ||
 						(katom_idx0_valid &&
@@ -1472,7 +1483,8 @@ bool kbase_backend_soft_hard_stop_slot(struct kbase_device *kbdev,
 				if (kbase_reg_read(kbdev, JOB_SLOT_REG(js,
 						JS_COMMAND_NEXT)) == 0) {
 					/* idx0 has already completed - stop
-					 * idx1 if needed*/
+					 * idx1 if needed
+					 */
 					if (katom_idx1_valid) {
 						kbase_gpu_stop_atom(kbdev, js,
 								katom_idx1,
@@ -1481,7 +1493,8 @@ bool kbase_backend_soft_hard_stop_slot(struct kbase_device *kbdev,
 					}
 				} else {
 					/* idx1 is in NEXT registers - attempt
-					 * to remove */
+					 * to remove
+					 */
 					kbase_reg_write(kbdev,
 							JOB_SLOT_REG(js,
 							JS_COMMAND_NEXT),
@@ -1496,7 +1509,8 @@ bool kbase_backend_soft_hard_stop_slot(struct kbase_device *kbdev,
 							JS_HEAD_NEXT_HI))
 									!= 0) {
 						/* idx1 removed successfully,
-						 * will be handled in IRQ */
+						 * will be handled in IRQ
+						 */
 						kbase_gpu_remove_atom(kbdev,
 								katom_idx1,
 								action, true);
@@ -1510,7 +1524,8 @@ bool kbase_backend_soft_hard_stop_slot(struct kbase_device *kbdev,
 						ret = true;
 					} else if (katom_idx1_valid) {
 						/* idx0 has already completed,
-						 * stop idx1 if needed */
+						 * stop idx1 if needed
+						 */
 						kbase_gpu_stop_atom(kbdev, js,
 								katom_idx1,
 								action);
@@ -1529,7 +1544,8 @@ bool kbase_backend_soft_hard_stop_slot(struct kbase_device *kbdev,
 				 * flow was also interrupted, and this function
 				 * might not enter disjoint state e.g. if we
 				 * don't actually do a hard stop on the head
-				 * atom */
+				 * atom
+				 */
 				kbase_gpu_stop_atom(kbdev, js, katom_idx0,
 									action);
 				ret = true;
@@ -1557,7 +1573,8 @@ bool kbase_backend_soft_hard_stop_slot(struct kbase_device *kbdev,
 				ret = true;
 			} else {
 				/* idx1 is in NEXT registers - attempt to
-				 * remove */
+				 * remove
+				 */
 				kbase_reg_write(kbdev, JOB_SLOT_REG(js,
 							JS_COMMAND_NEXT),
 							JS_COMMAND_NOP);
@@ -1567,13 +1584,15 @@ bool kbase_backend_soft_hard_stop_slot(struct kbase_device *kbdev,
 				    kbase_reg_read(kbdev, JOB_SLOT_REG(js,
 						JS_HEAD_NEXT_HI)) != 0) {
 					/* idx1 removed successfully, will be
-					 * handled in IRQ once idx0 completes */
+					 * handled in IRQ once idx0 completes
+					 */
 					kbase_gpu_remove_atom(kbdev, katom_idx1,
 									action,
 									false);
 				} else {
 					/* idx0 has already completed - stop
-					 * idx1 */
+					 * idx1
+					 */
 					kbase_gpu_stop_atom(kbdev, js,
 								katom_idx1,
 								action);
@@ -1647,7 +1666,7 @@ void kbase_gpu_dump_slots(struct kbase_device *kbdev)
 
 			if (katom)
 				dev_info(kbdev->dev,
-				"  js%d idx%d : katom=%p gpu_rb_state=%d\n",
+				"  js%d idx%d : katom=%pK gpu_rb_state=%d\n",
 				js, idx, katom, katom->gpu_rb_state);
 			else
 				dev_info(kbdev->dev, "  js%d idx%d : empty\n",
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_rb.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_rb.h
index c3b9f2d85536..14da98143f74 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_rb.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_jm_rb.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014-2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2018, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,11 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
 /*
  * Register-based HW access backend specific APIs
  */
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_js_backend.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_js_backend.c
index 8187e73767be..0940bccccddd 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_js_backend.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_js_backend.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,11 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
 /*
  * Register-based HW access backend specific job scheduler APIs
  */
@@ -48,7 +46,8 @@ static inline bool timer_callback_should_run(struct kbase_device *kbdev)
 
 	/* nr_contexts_pullable is updated with the runpool_mutex. However, the
 	 * locking in the caller gives us a barrier that ensures
-	 * nr_contexts_pullable is up-to-date for reading */
+	 * nr_contexts_pullable is up-to-date for reading
+	 */
 	nr_running_ctxs = atomic_read(&kbdev->js_data.nr_contexts_runnable);
 
 #ifdef CONFIG_MALI_BIFROST_DEBUG
@@ -114,7 +113,8 @@ static enum hrtimer_restart timer_callback(struct hrtimer *timer)
 
 		if (atom != NULL) {
 			/* The current version of the model doesn't support
-			 * Soft-Stop */
+			 * Soft-Stop
+			 */
 			if (!kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_5736)) {
 				u32 ticks = atom->ticks++;
 
@@ -142,7 +142,8 @@ static enum hrtimer_restart timer_callback(struct hrtimer *timer)
 				 * new soft_stop timeout. This ensures that
 				 * atoms do not miss any of the timeouts due to
 				 * races between this worker and the thread
-				 * changing the timeouts. */
+				 * changing the timeouts.
+				 */
 				if (backend->timeouts_updated &&
 						ticks > soft_stop_ticks)
 					ticks = atom->ticks = soft_stop_ticks;
@@ -172,10 +173,11 @@ static enum hrtimer_restart timer_callback(struct hrtimer *timer)
 					 *
 					 * Similarly, if it's about to be
 					 * decreased, the last job from another
-					 * context has already finished, so it's
-					 * not too bad that we observe the older
-					 * value and register a disjoint event
-					 * when we try soft-stopping */
+					 * context has already finished, so
+					 * it's not too bad that we observe the
+					 * older value and register a disjoint
+					 * event when we try soft-stopping
+					 */
 					if (js_devdata->nr_user_contexts_running
 							>= disjoint_threshold)
 						softstop_flags |=
@@ -253,9 +255,9 @@ static enum hrtimer_restart timer_callback(struct hrtimer *timer)
 		}
 	}
 	if (reset_needed) {
-		dev_err(kbdev->dev, "JS: Job has been on the GPU for too long (JS_RESET_TICKS_SS/DUMPING timeout hit). Issueing GPU soft-reset to resolve.");
+		dev_err(kbdev->dev, "JS: Job has been on the GPU for too long (JS_RESET_TICKS_SS/DUMPING timeout hit). Issuing GPU soft-reset to resolve.");
 
-		if (kbase_prepare_to_reset_gpu_locked(kbdev))
+		if (kbase_prepare_to_reset_gpu_locked(kbdev, RESET_FLAGS_NONE))
 			kbase_reset_gpu_locked(kbdev);
 	}
 	/* the timer is re-issued if there is contexts in the run-pool */
@@ -287,11 +289,12 @@ void kbase_backend_ctx_count_changed(struct kbase_device *kbdev)
 		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
 		backend->timer_running = false;
 		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-		/* From now on, return value of timer_callback_should_run() will
-		 * also cause the timer to not requeue itself. Its return value
-		 * cannot change, because it depends on variables updated with
-		 * the runpool_mutex held, which the caller of this must also
-		 * hold */
+		/* From now on, return value of timer_callback_should_run()
+		 * will also cause the timer to not requeue itself. Its return
+		 * value cannot change, because it depends on variables updated
+		 * with the runpool_mutex held, which the caller of this must
+		 * also hold
+		 */
 		hrtimer_cancel(&backend->scheduling_timer);
 	}
 
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_js_internal.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_js_internal.h
index 6576e55d2e39..e15528d069ac 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_js_internal.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_js_internal.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014-2015 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2015, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,11 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
 /*
  * Register-based HW access backend specific job scheduler APIs
  */
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_l2_mmu_config.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_l2_mmu_config.c
index d5526caa5899..884cbd6326f1 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_l2_mmu_config.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_l2_mmu_config.c
@@ -6,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -17,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_l2_mmu_config.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_l2_mmu_config.h
index 0c779ac80d27..2dfeadb178c2 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_l2_mmu_config.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_l2_mmu_config.h
@@ -1,31 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, you can access it online at
- * http://www.gnu.org/licenses/gpl-2.0.html.
- *
- * SPDX-License-Identifier: GPL-2.0
- *
- *//* SPDX-License-Identifier: GPL-2.0 */
-/*
  * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_always_on.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_always_on.c
index e33fe0b8e415..66fb24d27b86 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_always_on.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_always_on.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2010-2015, 2018-2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2015, 2018-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /*
  * "Always on" power management policy
  */
@@ -62,6 +59,9 @@ const struct kbase_pm_policy kbase_pm_always_on_policy_ops = {
 	always_on_shaders_needed,	/* shaders_needed */
 	always_on_get_core_active,	/* get_core_active */
 	KBASE_PM_POLICY_ID_ALWAYS_ON,	/* id */
+#if MALI_USE_CSF
+	ALWAYS_ON_PM_SCHED_FLAGS,	/* pm_sched_flags */
+#endif
 };
 
 KBASE_EXPORT_TEST_API(kbase_pm_always_on_policy_ops);
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_always_on.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_always_on.h
index e7927cf82e5a..e500d46dc82d 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_always_on.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_always_on.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2011-2015,2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2015, 2018, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /*
  * "Always on" power management policy
  */
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_backend.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_backend.c
index 7b10d06c5fdb..a03078b33063 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_backend.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_backend.c
@@ -1,11 +1,12 @@
- /*
+// SPDX-License-Identifier: GPL-2.0
+/*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,11 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
 /*
  * GPU backend implementation of base kernel power management APIs
  */
@@ -156,15 +154,25 @@ int kbase_hwaccess_pm_init(struct kbase_device *kbdev)
 #endif /* CONFIG_MALI_BIFROST_DEBUG */
 	init_waitqueue_head(&kbdev->pm.backend.gpu_in_desired_state_wait);
 
+#if !MALI_USE_CSF
 	/* Initialise the metrics subsystem */
 	ret = kbasep_pm_metrics_init(kbdev);
 	if (ret)
 		return ret;
+#else
+	mutex_init(&kbdev->pm.backend.policy_change_lock);
+	kbdev->pm.backend.policy_change_clamp_state_to_off = false;
+	/* Due to dependency on kbase_ipa_control, the metrics subsystem can't
+	 * be initialized here.
+	 */
+	CSTD_UNUSED(ret);
+#endif
 
 	init_waitqueue_head(&kbdev->pm.backend.reset_done_wait);
 	kbdev->pm.backend.reset_done = false;
 
 	init_waitqueue_head(&kbdev->pm.zero_active_count_wait);
+	init_waitqueue_head(&kbdev->pm.resume_wait);
 	kbdev->pm.active_count = 0;
 
 	spin_lock_init(&kbdev->pm.backend.gpu_cycle_counter_requests_lock);
@@ -221,7 +229,9 @@ int kbase_hwaccess_pm_init(struct kbase_device *kbdev)
 	kbase_pm_policy_term(kbdev);
 	kbase_pm_ca_term(kbdev);
 workq_fail:
+#if !MALI_USE_CSF
 	kbasep_pm_metrics_term(kbdev);
+#endif
 	return -EINVAL;
 }
 
@@ -230,7 +240,8 @@ void kbase_pm_do_poweron(struct kbase_device *kbdev, bool is_resume)
 	lockdep_assert_held(&kbdev->pm.lock);
 
 	/* Turn clocks and interrupts on - no-op if we haven't done a previous
-	 * kbase_pm_clock_off() */
+	 * kbase_pm_clock_off()
+	 */
 	kbase_pm_clock_on(kbdev, is_resume);
 
 	if (!is_resume) {
@@ -248,7 +259,8 @@ void kbase_pm_do_poweron(struct kbase_device *kbdev, bool is_resume)
 	kbase_pm_update_cores_state(kbdev);
 
 	/* NOTE: We don't wait to reach the desired state, since running atoms
-	 * will wait for that state to be reached anyway */
+	 * will wait for that state to be reached anyway
+	 */
 }
 
 static void kbase_pm_gpu_poweroff_wait_wq(struct work_struct *data)
@@ -486,7 +498,15 @@ static void kbase_pm_hwcnt_disable_worker(struct work_struct *data)
 		/* PM state was updated while we were doing the disable,
 		 * so we need to undo the disable we just performed.
 		 */
+#if MALI_USE_CSF
+		unsigned long lock_flags;
+
+		kbase_csf_scheduler_spin_lock(kbdev, &lock_flags);
+#endif
 		kbase_hwcnt_context_enable(kbdev->hwcnt_gpu_ctx);
+#if MALI_USE_CSF
+		kbase_csf_scheduler_spin_unlock(kbdev, lock_flags);
+#endif
 	}
 
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
@@ -562,20 +582,35 @@ int kbase_hwaccess_pm_powerup(struct kbase_device *kbdev,
 	KBASE_DEBUG_ASSERT(!kbase_pm_is_suspending(kbdev));
 
 	/* Power up the GPU, don't enable IRQs as we are not ready to receive
-	 * them. */
+	 * them
+	 */
 	ret = kbase_pm_init_hw(kbdev, flags);
 	if (ret) {
 		kbase_pm_unlock(kbdev);
 		return ret;
 	}
-
+#if MALI_USE_CSF
+	kbdev->pm.debug_core_mask =
+		kbdev->gpu_props.props.raw_props.shader_present;
+	spin_lock_irqsave(&kbdev->hwaccess_lock, irq_flags);
+	/* Set the initial value for 'shaders_avail'. It would be later
+	 * modified only from the MCU state machine, when the shader core
+	 * allocation enable mask request has completed. So its value would
+	 * indicate the mask of cores that are currently being used by FW for
+	 * the allocation of endpoints requested by CSGs.
+	 */
+	kbdev->pm.backend.shaders_avail = kbase_pm_ca_get_core_mask(kbdev);
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, irq_flags);
+#else
 	kbdev->pm.debug_core_mask_all = kbdev->pm.debug_core_mask[0] =
 			kbdev->pm.debug_core_mask[1] =
 			kbdev->pm.debug_core_mask[2] =
 			kbdev->gpu_props.props.raw_props.shader_present;
+#endif
 
 	/* Pretend the GPU is active to prevent a power policy turning the GPU
-	 * cores off */
+	 * cores off
+	 */
 	kbdev->pm.active_count = 1;
 
 	spin_lock_irqsave(&kbdev->pm.backend.gpu_cycle_counter_requests_lock,
@@ -587,7 +622,8 @@ int kbase_hwaccess_pm_powerup(struct kbase_device *kbdev,
 								irq_flags);
 
 	/* We are ready to receive IRQ's now as power policy is set up, so
-	 * enable them now. */
+	 * enable them now.
+	 */
 #ifdef CONFIG_MALI_BIFROST_DEBUG
 	kbdev->pm.backend.driver_ready_for_irqs = true;
 #endif
@@ -620,6 +656,8 @@ void kbase_hwaccess_pm_halt(struct kbase_device *kbdev)
 	mutex_lock(&kbdev->pm.lock);
 	kbase_pm_do_poweroff(kbdev);
 	mutex_unlock(&kbdev->pm.lock);
+
+	kbase_pm_wait_for_poweroff_complete(kbdev);
 }
 
 KBASE_EXPORT_TEST_API(kbase_hwaccess_pm_halt);
@@ -634,10 +672,15 @@ void kbase_hwaccess_pm_term(struct kbase_device *kbdev)
 
 	if (kbdev->pm.backend.hwcnt_disabled) {
 		unsigned long flags;
-
+#if MALI_USE_CSF
+		kbase_csf_scheduler_spin_lock(kbdev, &flags);
+		kbase_hwcnt_context_enable(kbdev->hwcnt_gpu_ctx);
+		kbase_csf_scheduler_spin_unlock(kbdev, flags);
+#else
 		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
 		kbase_hwcnt_context_enable(kbdev->hwcnt_gpu_ctx);
 		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+#endif
 	}
 
 	/* Free any resources the policy allocated */
@@ -645,8 +688,16 @@ void kbase_hwaccess_pm_term(struct kbase_device *kbdev)
 	kbase_pm_policy_term(kbdev);
 	kbase_pm_ca_term(kbdev);
 
+#if !MALI_USE_CSF
 	/* Shut down the metrics subsystem */
 	kbasep_pm_metrics_term(kbdev);
+#else
+	if (WARN_ON(mutex_is_locked(&kbdev->pm.backend.policy_change_lock))) {
+		mutex_lock(&kbdev->pm.backend.policy_change_lock);
+		mutex_unlock(&kbdev->pm.backend.policy_change_lock);
+	}
+	mutex_destroy(&kbdev->pm.backend.policy_change_lock);
+#endif
 
 	destroy_workqueue(kbdev->pm.backend.gpu_poweroff_wait_wq);
 }
@@ -665,6 +716,17 @@ void kbase_pm_power_changed(struct kbase_device *kbdev)
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 }
 
+#if MALI_USE_CSF
+void kbase_pm_set_debug_core_mask(struct kbase_device *kbdev, u64 new_core_mask)
+{
+	lockdep_assert_held(&kbdev->hwaccess_lock);
+	lockdep_assert_held(&kbdev->pm.lock);
+
+	kbdev->pm.debug_core_mask = new_core_mask;
+	kbase_pm_update_dynamic_cores_onoff(kbdev);
+}
+KBASE_EXPORT_TEST_API(kbase_pm_set_debug_core_mask);
+#else
 void kbase_pm_set_debug_core_mask(struct kbase_device *kbdev,
 		u64 new_core_mask_js0, u64 new_core_mask_js1,
 		u64 new_core_mask_js2)
@@ -685,6 +747,7 @@ void kbase_pm_set_debug_core_mask(struct kbase_device *kbdev,
 
 	kbase_pm_update_dynamic_cores_onoff(kbdev);
 }
+#endif /* MALI_USE_CSF */
 
 void kbase_hwaccess_pm_gpu_active(struct kbase_device *kbdev)
 {
@@ -700,7 +763,8 @@ void kbase_hwaccess_pm_suspend(struct kbase_device *kbdev)
 {
 	/* Force power off the GPU and all cores (regardless of policy), only
 	 * after the PM active count reaches zero (otherwise, we risk turning it
-	 * off prematurely) */
+	 * off prematurely)
+	 */
 	kbase_pm_lock(kbdev);
 
 	kbase_pm_do_poweroff(kbdev);
@@ -735,6 +799,7 @@ void kbase_hwaccess_pm_resume(struct kbase_device *kbdev)
 	kbase_backend_timer_resume(kbdev);
 #endif /* !MALI_USE_CSF */
 
+	wake_up_all(&kbdev->pm.resume_wait);
 	kbase_pm_unlock(kbdev);
 }
 
@@ -745,6 +810,9 @@ void kbase_pm_handle_gpu_lost(struct kbase_device *kbdev)
 	ktime_t end_timestamp = ktime_get();
 	struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
 
+	if (!kbdev->arb.arb_if)
+		return;
+
 	mutex_lock(&kbdev->pm.lock);
 	mutex_lock(&arb_vm_state->vm_state_lock);
 	if (kbdev->pm.backend.gpu_powered &&
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca.c
index 984e12503009..368f89dd0c61 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2013-2018, 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -59,6 +58,14 @@ void kbase_devfreq_set_core_mask(struct kbase_device *kbdev, u64 core_mask)
 
 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
 
+#if MALI_USE_CSF
+	if (!(core_mask & kbdev->pm.debug_core_mask)) {
+		dev_err(kbdev->dev,
+			"OPP core mask 0x%llX does not intersect with debug mask 0x%llX\n",
+			core_mask, kbdev->pm.debug_core_mask);
+		goto unlock;
+	}
+#else
 	if (!(core_mask & kbdev->pm.debug_core_mask_all)) {
 		dev_err(kbdev->dev, "OPP core mask 0x%llX does not intersect with debug mask 0x%llX\n",
 				core_mask, kbdev->pm.debug_core_mask_all);
@@ -69,6 +76,7 @@ void kbase_devfreq_set_core_mask(struct kbase_device *kbdev, u64 core_mask)
 		dev_err(kbdev->dev, "Dynamic core scaling not supported as dummy job WA is enabled");
 		goto unlock;
 	}
+#endif /* MALI_USE_CSF */
 
 	pm_backend->ca_cores_enabled = core_mask;
 
@@ -80,21 +88,32 @@ void kbase_devfreq_set_core_mask(struct kbase_device *kbdev, u64 core_mask)
 	dev_dbg(kbdev->dev, "Devfreq policy : new core mask=%llX\n",
 			pm_backend->ca_cores_enabled);
 }
+KBASE_EXPORT_TEST_API(kbase_devfreq_set_core_mask);
 #endif
 
 u64 kbase_pm_ca_get_core_mask(struct kbase_device *kbdev)
 {
-#ifdef CONFIG_MALI_BIFROST_DEVFREQ
-	struct kbase_pm_backend_data *pm_backend = &kbdev->pm.backend;
+#if MALI_USE_CSF
+	u64 debug_core_mask = kbdev->pm.debug_core_mask;
+#else
+	u64 debug_core_mask = kbdev->pm.debug_core_mask_all;
 #endif
 
 	lockdep_assert_held(&kbdev->hwaccess_lock);
 
 #ifdef CONFIG_MALI_BIFROST_DEVFREQ
-	return pm_backend->ca_cores_enabled & kbdev->pm.debug_core_mask_all;
+	/*
+	 * Although in the init we let the pm_backend->ca_cores_enabled to be
+	 * the max config (it uses the base_gpu_props), at this function we need
+	 * to limit it to be a subgroup of the curr config, otherwise the
+	 * shaders state machine on the PM does not evolve.
+	 */
+	return kbdev->gpu_props.curr_config.shader_present &
+			kbdev->pm.backend.ca_cores_enabled &
+			debug_core_mask;
 #else
-	return kbdev->gpu_props.props.raw_props.shader_present &
-			kbdev->pm.debug_core_mask_all;
+	return kbdev->gpu_props.curr_config.shader_present &
+		debug_core_mask;
 #endif
 }
 
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca.h
index 5423e96725b9..c20bf6f965ee 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2011-2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2018, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca_devfreq.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca_devfreq.h
index f67ec650c981..d24bccd9e1a0 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca_devfreq.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_ca_devfreq.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_coarse_demand.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_coarse_demand.c
index 9eef44ad877f..dd8fad4f2384 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_coarse_demand.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_coarse_demand.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2012-2016, 2018-2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2016, 2018-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /*
  * "Coarse Demand" power management policy
  */
@@ -61,6 +58,9 @@ const struct kbase_pm_policy kbase_pm_coarse_demand_policy_ops = {
 	coarse_demand_shaders_needed,		/* shaders_needed */
 	coarse_demand_get_core_active,		/* get_core_active */
 	KBASE_PM_POLICY_ID_COARSE_DEMAND,	/* id */
+#if MALI_USE_CSF
+	COARSE_ON_DEMAND_PM_SCHED_FLAGS,	/* pm_sched_flags */
+#endif
 };
 
 KBASE_EXPORT_TEST_API(kbase_pm_coarse_demand_policy_ops);
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_coarse_demand.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_coarse_demand.h
index 304e5d7fa32d..f1a0e3aab24e 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_coarse_demand.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_coarse_demand.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2012-2015,2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2015, 2018, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /*
  * "Coarse Demand" power management policy
  */
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_defs.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_defs.h
index 7322c093c7b6..e7017ad14792 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_defs.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_defs.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -62,24 +61,9 @@ enum kbase_pm_core_type {
 	KBASE_PM_CORE_STACK = STACK_PRESENT_LO
 };
 
-/**
+/*
  * enum kbase_l2_core_state - The states used for the L2 cache & tiler power
  *                            state machine.
- *
- * @KBASE_L2_OFF: The L2 cache and tiler are off
- * @KBASE_L2_PEND_ON: The L2 cache and tiler are powering on
- * @KBASE_L2_RESTORE_CLOCKS: The GPU clock is restored. Conditionally used.
- * @KBASE_L2_ON_HWCNT_ENABLE: The L2 cache and tiler are on, and hwcnt is being
- *                            enabled
- * @KBASE_L2_ON: The L2 cache and tiler are on, and hwcnt is enabled
- * @KBASE_L2_ON_HWCNT_DISABLE: The L2 cache and tiler are on, and hwcnt is being
- *                             disabled
- * @KBASE_L2_SLOW_DOWN_CLOCKS: The GPU clock is set to appropriate or lowest
- *                             clock. Conditionally used.
- * @KBASE_L2_POWER_DOWN: The L2 cache and tiler are about to be powered off
- * @KBASE_L2_PEND_OFF: The L2 cache and tiler are powering off
- * @KBASE_L2_RESET_WAIT: The GPU is resetting, L2 cache and tiler power state
- *                       are unknown
  */
 enum kbase_l2_core_state {
 #define KBASEP_L2_STATE(n) KBASE_L2_ ## n,
@@ -88,24 +72,8 @@ enum kbase_l2_core_state {
 };
 
 #if MALI_USE_CSF
-/**
+/*
  * enum kbase_mcu_state - The states used for the MCU state machine.
- *
- * @KBASE_MCU_OFF:            The MCU is powered off.
- * @KBASE_MCU_PEND_ON_RELOAD: The warm boot of MCU or cold boot of MCU (with
- *                            firmware reloading) is in progress.
- * @KBASE_MCU_ON_GLB_REINIT_PEND: The MCU is enabled and Global configuration
- *                                requests have been sent to the firmware.
- * @KBASE_MCU_ON_HWCNT_ENABLE: The Global requests have completed and MCU is
- *                             now ready for use and hwcnt is being enabled.
- * @KBASE_MCU_ON:             The MCU is active and hwcnt has been enabled.
- * @KBASE_MCU_ON_HWCNT_DISABLE: The MCU is on and hwcnt is being disabled.
- * @KBASE_MCU_ON_HALT:        The MCU is on and hwcnt has been disabled,
- *                            MCU halt would be triggered.
- * @KBASE_MCU_ON_PEND_HALT:   MCU halt in progress, confirmation pending.
- * @KBASE_MCU_POWER_DOWN:     MCU halted operations, pending being disabled.
- * @KBASE_MCU_PEND_OFF:       MCU is being disabled, pending on powering off.
- * @KBASE_MCU_RESET_WAIT:     The GPU is resetting, MCU state is unknown.
  */
 enum kbase_mcu_state {
 #define KBASEP_MCU_STATE(n) KBASE_MCU_ ## n,
@@ -114,45 +82,8 @@ enum kbase_mcu_state {
 };
 #endif
 
-/**
+/*
  * enum kbase_shader_core_state - The states used for the shaders' state machine.
- *
- * @KBASE_SHADERS_OFF_CORESTACK_OFF: The shaders and core stacks are off
- * @KBASE_SHADERS_OFF_CORESTACK_PEND_ON: The shaders are off, core stacks have
- *                                       been requested to power on and hwcnt
- *                                       is being disabled
- * @KBASE_SHADERS_PEND_ON_CORESTACK_ON: Core stacks are on, shaders have been
- *                                      requested to power on. Or after doing
- *                                      partial shader on/off, checking whether
- *                                      it's the desired state.
- * @KBASE_SHADERS_ON_CORESTACK_ON: The shaders and core stacks are on, and hwcnt
- *					already enabled.
- * @KBASE_SHADERS_ON_CORESTACK_ON_RECHECK: The shaders and core stacks
- *                                      are on, hwcnt disabled, and checks
- *                                      to powering down or re-enabling
- *                                      hwcnt.
- * @KBASE_SHADERS_WAIT_OFF_CORESTACK_ON: The shaders have been requested to
- *                                       power off, but they remain on for the
- *                                       duration of the hysteresis timer
- * @KBASE_SHADERS_WAIT_GPU_IDLE: The shaders partial poweroff needs to reach
- *                               a state where jobs on the GPU are finished
- *                               including jobs currently running and in the
- *                               GPU queue because of GPU2017-861
- * @KBASE_SHADERS_WAIT_FINISHED_CORESTACK_ON: The hysteresis timer has expired
- * @KBASE_SHADERS_L2_FLUSHING_CORESTACK_ON: The core stacks are on and the
- *                                          level 2 cache is being flushed.
- * @KBASE_SHADERS_READY_OFF_CORESTACK_ON: The core stacks are on and the shaders
- *                                        are ready to be powered off.
- * @KBASE_SHADERS_PEND_OFF_CORESTACK_ON: The core stacks are on, and the shaders
- *                                       have been requested to power off
- * @KBASE_SHADERS_OFF_CORESTACK_PEND_OFF: The shaders are off, and the core stacks
- *                                        have been requested to power off
- * @KBASE_SHADERS_OFF_CORESTACK_OFF_TIMER_PEND_OFF: Shaders and corestacks are
- *                                                  off, but the tick timer
- *                                                  cancellation is still
- *                                                  pending.
- * @KBASE_SHADERS_RESET_WAIT: The GPU is resetting, shader and core stack power
- *                            states are unknown
  */
 enum kbase_shader_core_state {
 #define KBASEP_SHADER_STATE(n) KBASE_SHADERS_ ## n,
@@ -164,28 +95,40 @@ enum kbase_shader_core_state {
  * struct kbasep_pm_metrics - Metrics data collected for use by the power
  *                            management framework.
  *
- *  @time_busy: number of ns the GPU was busy executing jobs since the
- *          @time_period_start timestamp.
- *  @time_idle: number of ns since time_period_start the GPU was not executing
- *          jobs since the @time_period_start timestamp.
- *  @busy_cl: number of ns the GPU was busy executing CL jobs. Note that
- *           if two CL jobs were active for 400ns, this value would be updated
- *           with 800.
- *  @busy_gl: number of ns the GPU was busy executing GL jobs. Note that
- *           if two GL jobs were active for 400ns, this value would be updated
- *           with 800.
+ *  @time_busy: the amount of time the GPU was busy executing jobs since the
+ *          @time_period_start timestamp, in units of 256ns. This also includes
+ *          time_in_protm, the time spent in protected mode, since it's assumed
+ *          the GPU was busy 100% during this period.
+ *  @time_idle: the amount of time the GPU was not executing jobs since the
+ *              time_period_start timestamp, measured in units of 256ns.
+ *  @time_in_protm: The amount of time the GPU has spent in protected mode since
+ *                  the time_period_start timestamp, measured in units of 256ns.
+ *  @busy_cl: the amount of time the GPU was busy executing CL jobs. Note that
+ *           if two CL jobs were active for 256ns, this value would be updated
+ *           with 2 (2x256ns).
+ *  @busy_gl: the amount of time the GPU was busy executing GL jobs. Note that
+ *           if two GL jobs were active for 256ns, this value would be updated
+ *           with 2 (2x256ns).
  */
 struct kbasep_pm_metrics {
 	u32 time_busy;
 	u32 time_idle;
+#if MALI_USE_CSF
+	u32 time_in_protm;
+#else
 	u32 busy_cl[2];
 	u32 busy_gl;
+#endif
 };
 
 /**
  * struct kbasep_pm_metrics_state - State required to collect the metrics in
  *                                  struct kbasep_pm_metrics
  *  @time_period_start: time at which busy/idle measurements started
+ *  @ipa_control_client: Handle returned on registering DVFS as a
+ *                       kbase_ipa_control client
+ *  @skip_gpu_active_sanity_check: Decide whether to skip GPU_ACTIVE sanity
+ *                                 check in DVFS utilisation calculation
  *  @gpu_active: true when the GPU is executing jobs. false when
  *           not. Updated when the job scheduler informs us a job in submitted
  *           or removed from a GPU slot.
@@ -197,6 +140,7 @@ struct kbasep_pm_metrics {
  *  @values: The current values of the power management metrics. The
  *           kbase_pm_get_dvfs_metrics() function is used to compare these
  *           current values with the saved values from a previous invocation.
+ *  @initialized: tracks whether metrics_state has been initialized or not.
  *  @timer: timer to regularly make DVFS decisions based on the power
  *           management metrics.
  *  @timer_active: boolean indicating @timer is running
@@ -205,9 +149,14 @@ struct kbasep_pm_metrics {
  */
 struct kbasep_pm_metrics_state {
 	ktime_t time_period_start;
+#if MALI_USE_CSF
+	void *ipa_control_client;
+	bool skip_gpu_active_sanity_check;
+#else
 	bool gpu_active;
 	u32 active_cl_ctx[2];
 	u32 active_gl_ctx[3];
+#endif
 	spinlock_t lock;
 
 	void *platform_data;
@@ -216,6 +165,7 @@ struct kbasep_pm_metrics_state {
 	struct kbasep_pm_metrics values;
 
 #ifdef CONFIG_MALI_BIFROST_DVFS
+	bool initialized;
 	struct hrtimer timer;
 	bool timer_active;
 	struct kbasep_pm_metrics dvfs_last;
@@ -326,6 +276,8 @@ union kbase_pm_policy_data {
  * @callback_soft_reset: Optional callback to software reset the GPU. See
  *                       &struct kbase_pm_callback_conf
  * @ca_cores_enabled: Cores that are currently available
+ * @mcu_state: The current state of the micro-control unit, only applicable
+ *             to GPUs that have such a component
  * @l2_state:     The current state of the L2 cache state machine. See
  *                &enum kbase_l2_core_state
  * @l2_desired:   True if the L2 cache should be powered on by the L2 cache state
@@ -335,10 +287,10 @@ union kbase_pm_policy_data {
  * @shaders_avail: This is updated by the state machine when it is in a state
  *                 where it can write to the SHADER_PWRON or PWROFF registers
  *                 to have the same set of available cores as specified by
- *                 @shaders_desired_mask. So it would eventually have the same
- *                 value as @shaders_desired_mask and would precisely indicate
- *                 the cores that are currently available. This is internal to
- *                 shader state machine and should *not* be modified elsewhere.
+ *                 @shaders_desired_mask. So would precisely indicate the cores
+ *                 that are currently available. This is internal to shader
+ *                 state machine of JM GPUs and should *not* be modified
+ *                 elsewhere.
  * @shaders_desired_mask: This is updated by the state machine when it is in
  *                        a state where it can handle changes to the core
  *                        availability (either by DVFS or sysfs). This is
@@ -350,6 +302,16 @@ union kbase_pm_policy_data {
  *                   cores may be different, but there should be transitions in
  *                   progress that will eventually achieve this state (assuming
  *                   that the policy doesn't change its mind in the mean time).
+ * @mcu_desired: True if the micro-control unit should be powered on
+ * @policy_change_clamp_state_to_off: Signaling the backend is in PM policy
+ *                change transition, needs the mcu/L2 to be brought back to the
+ *                off state and remain in that state until the flag is cleared.
+ * @csf_pm_sched_flags: CSF Dynamic PM control flags in accordance to the
+ *                current active PM policy. This field is updated whenever a
+ *                new policy is activated.
+ * @policy_change_lock: Used to serialize the policy change calls. In CSF case,
+ *                      the change of policy may involve the scheduler to
+ *                      suspend running CSGs and then reconfigure the MCU.
  * @in_reset: True if a GPU is resetting and normal power manager operation is
  *            suspended
  * @partial_shaderoff: True if we want to partial power off shader cores,
@@ -440,9 +402,6 @@ struct kbase_pm_backend_data {
 	u64 ca_cores_enabled;
 
 #if MALI_USE_CSF
-	/* The current state of the micro-control unit, only applicable
-	 * to GPUs that has such a component
-	 */
 	enum kbase_mcu_state mcu_state;
 #endif
 	enum kbase_l2_core_state l2_state;
@@ -450,8 +409,10 @@ struct kbase_pm_backend_data {
 	u64 shaders_avail;
 	u64 shaders_desired_mask;
 #if MALI_USE_CSF
-	/* True if the micro-control unit should be powered on */
 	bool mcu_desired;
+	bool policy_change_clamp_state_to_off;
+	unsigned int csf_pm_sched_flags;
+	struct mutex policy_change_lock;
 #endif
 	bool l2_desired;
 	bool l2_always_on;
@@ -476,6 +437,23 @@ struct kbase_pm_backend_data {
 	struct work_struct gpu_clock_control_work;
 };
 
+#if MALI_USE_CSF
+/* CSF PM flag, signaling that the MCU CORE should be kept on */
+#define  CSF_DYNAMIC_PM_CORE_KEEP_ON (1 << 0)
+/* CSF PM flag, signaling no scheduler suspension on idle groups */
+#define CSF_DYNAMIC_PM_SCHED_IGNORE_IDLE (1 << 1)
+/* CSF PM flag, signaling no scheduler suspension on no runnable groups */
+#define CSF_DYNAMIC_PM_SCHED_NO_SUSPEND (1 << 2)
+
+/* The following flags corresponds to existing defined PM policies */
+#define ALWAYS_ON_PM_SCHED_FLAGS (CSF_DYNAMIC_PM_CORE_KEEP_ON | \
+				  CSF_DYNAMIC_PM_SCHED_IGNORE_IDLE | \
+				  CSF_DYNAMIC_PM_SCHED_NO_SUSPEND)
+#define COARSE_ON_DEMAND_PM_SCHED_FLAGS (0)
+#if !MALI_CUSTOMER_RELEASE
+#define ALWAYS_ON_DEMAND_PM_SCHED_FLAGS (CSF_DYNAMIC_PM_SCHED_IGNORE_IDLE)
+#endif
+#endif
 
 /* List of policy IDs */
 enum kbase_pm_policy_id {
@@ -502,11 +480,15 @@ enum kbase_pm_policy_id {
  *                      necessarily the same as its index in the list returned
  *                      by kbase_pm_list_policies().
  *                      It is used purely for debugging.
+ * @pm_sched_flags: Policy associated with CSF PM scheduling operational flags.
+ *                  Pre-defined required flags exist for each of the
+ *                  ARM released policies, such as 'always_on', 'coarse_demand'
+ *                  and etc.
  */
 struct kbase_pm_policy {
 	char *name;
 
-	/**
+	/*
 	 * Function called when the policy is selected
 	 *
 	 * This should initialize the kbdev->pm.pm_policy_data structure. It
@@ -520,7 +502,7 @@ struct kbase_pm_policy {
 	 */
 	void (*init)(struct kbase_device *kbdev);
 
-	/**
+	/*
 	 * Function called when the policy is unselected.
 	 *
 	 * @kbdev: The kbase device structure for the device (must be a
@@ -528,7 +510,7 @@ struct kbase_pm_policy {
 	 */
 	void (*term)(struct kbase_device *kbdev);
 
-	/**
+	/*
 	 * Function called to find out if shader cores are needed
 	 *
 	 * This needs to at least satisfy kbdev->pm.backend.shaders_desired,
@@ -541,7 +523,7 @@ struct kbase_pm_policy {
 	 */
 	bool (*shaders_needed)(struct kbase_device *kbdev);
 
-	/**
+	/*
 	 * Function called to get the current overall GPU power state
 	 *
 	 * This function must meet or exceed the requirements for power
@@ -555,6 +537,15 @@ struct kbase_pm_policy {
 	bool (*get_core_active)(struct kbase_device *kbdev);
 
 	enum kbase_pm_policy_id id;
+
+#if MALI_USE_CSF
+	/* Policy associated with CSF PM scheduling operational flags.
+	 * There are pre-defined required flags exist for each of the
+	 * ARM released policies, such as 'always_on', 'coarse_demand'
+	 * and etc.
+	 */
+	unsigned int pm_sched_flags;
+#endif
 };
 
 #endif /* _KBASE_PM_HWACCESS_DEFS_H_ */
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_driver.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_driver.c
index e9e30ebadc2d..6e742fb1137e 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_driver.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_driver.c
@@ -1,12 +1,12 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -17,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -32,9 +30,13 @@
 #include <mali_kbase_pm.h>
 #include <mali_kbase_config_defaults.h>
 #include <mali_kbase_smc.h>
-#if !MALI_USE_CSF
+
+#if MALI_USE_CSF
+#include <csf/ipa_control/mali_kbase_csf_ipa_control.h>
+#else
 #include <mali_kbase_hwaccess_jm.h>
 #endif /* !MALI_USE_CSF */
+
 #include <mali_kbase_reset_gpu.h>
 #include <mali_kbase_ctx_sched.h>
 #include <mali_kbase_hwcnt_context.h>
@@ -47,6 +49,9 @@
 #ifdef CONFIG_MALI_ARBITER_SUPPORT
 #include <arbiter/mali_kbase_arbiter_pm.h>
 #endif /* CONFIG_MALI_ARBITER_SUPPORT */
+#if MALI_USE_CSF
+#include <csf/ipa_control/mali_kbase_csf_ipa_control.h>
+#endif
 
 #include <linux/of.h>
 
@@ -103,13 +108,13 @@ bool kbase_pm_is_mcu_desired(struct kbase_device *kbdev)
 		return true;
 
 	/* MCU is supposed to be ON, only when scheduler.pm_active_count is
-	 * non zero. But for always_on policy also MCU needs to be ON.
-	 * GPUCORE-24926 will add the proper handling for always_on
-	 * power policy.
+	 * non zero. But for always_on policy, the MCU needs to be kept on,
+	 * unless policy changing transition needs it off.
 	 */
+
 	return (kbdev->pm.backend.mcu_desired &&
-		(kbdev->pm.backend.pm_current_policy ==
-		 &kbase_pm_always_on_policy_ops));
+		kbase_pm_no_mcu_core_pwroff(kbdev) &&
+		!kbdev->pm.backend.policy_change_clamp_state_to_off);
 }
 #endif
 
@@ -126,6 +131,11 @@ bool kbase_pm_is_l2_desired(struct kbase_device *kbdev)
 			!kbdev->pm.backend.shaders_desired)
 		return false;
 
+#if MALI_USE_CSF
+	if (kbdev->pm.backend.policy_change_clamp_state_to_off)
+		return false;
+#endif
+
 	return kbdev->pm.backend.l2_desired;
 }
 
@@ -257,7 +267,8 @@ static void mali_cci_flush_l2(struct kbase_device *kbdev)
 		GPU_CONTROL_REG(GPU_IRQ_RAWSTAT));
 
 	/* Wait for cache flush to complete before continuing, exit on
-	 * gpu resets or loop expiry. */
+	 * gpu resets or loop expiry.
+	 */
 	while (((raw & mask) == 0) && --loops) {
 		raw = kbase_reg_read(kbdev,
 					GPU_CONTROL_REG(GPU_IRQ_RAWSTAT));
@@ -396,9 +407,9 @@ u64 kbase_pm_get_present_cores(struct kbase_device *kbdev,
 
 	switch (type) {
 	case KBASE_PM_CORE_L2:
-		return kbdev->gpu_props.props.raw_props.l2_present;
+		return kbdev->gpu_props.curr_config.l2_present;
 	case KBASE_PM_CORE_SHADER:
-		return kbdev->gpu_props.props.raw_props.shader_present;
+		return kbdev->gpu_props.curr_config.shader_present;
 	case KBASE_PM_CORE_TILER:
 		return kbdev->gpu_props.props.raw_props.tiler_present;
 	case KBASE_PM_CORE_STACK:
@@ -492,14 +503,10 @@ static void kbase_pm_trigger_hwcnt_disable(struct kbase_device *kbdev)
 	 */
 	if (kbase_hwcnt_context_disable_atomic(kbdev->hwcnt_gpu_ctx)) {
 		backend->hwcnt_disabled = true;
+
 	} else {
-#if KERNEL_VERSION(3, 16, 0) > LINUX_VERSION_CODE
-		queue_work(system_wq,
-			&backend->hwcnt_disable_work);
-#else
-		queue_work(system_highpri_wq,
-			&backend->hwcnt_disable_work);
-#endif
+		kbase_hwcnt_context_queue_work(kbdev->hwcnt_gpu_ctx,
+					       &backend->hwcnt_disable_work);
 	}
 }
 
@@ -517,7 +524,8 @@ static void kbase_pm_l2_config_override(struct kbase_device *kbdev)
 	 * Skip if size and hash are not given explicitly,
 	 * which means default values are used.
 	 */
-	if ((kbdev->l2_size_override == 0) && (kbdev->l2_hash_override == 0))
+	if ((kbdev->l2_size_override == 0) && (kbdev->l2_hash_override == 0) &&
+	    (!kbdev->l2_hash_values_override))
 		return;
 
 	val = kbase_reg_read(kbdev, GPU_CONTROL_REG(L2_CONFIG));
@@ -528,13 +536,25 @@ static void kbase_pm_l2_config_override(struct kbase_device *kbdev)
 	}
 
 	if (kbdev->l2_hash_override) {
+		WARN_ON(kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_ASN_HASH));
 		val &= ~L2_CONFIG_HASH_MASK;
 		val |= (kbdev->l2_hash_override << L2_CONFIG_HASH_SHIFT);
+	} else if (kbdev->l2_hash_values_override) {
+		int i;
+
+		WARN_ON(!kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_ASN_HASH));
+		val &= ~L2_CONFIG_ASN_HASH_ENABLE_MASK;
+		val |= (0x1 << L2_CONFIG_ASN_HASH_ENABLE_SHIFT);
+
+		for (i = 0; i < ASN_HASH_COUNT; i++) {
+			dev_dbg(kbdev->dev, "Program 0x%x to ASN_HASH[%d]\n",
+				kbdev->l2_hash_values[i], i);
+			kbase_reg_write(kbdev, GPU_CONTROL_REG(ASN_HASH(i)),
+					kbdev->l2_hash_values[i]);
+		}
 	}
 
 	dev_dbg(kbdev->dev, "Program 0x%x to L2_CONFIG\n", val);
-
-	/* Write L2_CONFIG to override */
 	kbase_reg_write(kbdev, GPU_CONTROL_REG(L2_CONFIG), val);
 }
 
@@ -561,6 +581,35 @@ static const char *kbase_mcu_state_to_string(enum kbase_mcu_state state)
 		return strings[state];
 }
 
+static inline bool kbase_pm_handle_mcu_core_attr_update(struct kbase_device *kbdev)
+{
+	struct kbase_pm_backend_data *backend = &kbdev->pm.backend;
+	bool timer_update;
+	bool core_mask_update;
+
+	lockdep_assert_held(&kbdev->hwaccess_lock);
+
+	WARN_ON(backend->mcu_state != KBASE_MCU_ON);
+
+	/* This function is only for cases where the MCU managing Cores, if
+	 * the firmware mode is with host control, do nothing here.
+	 */
+	if (unlikely(kbdev->csf.firmware_hctl_core_pwr))
+		return false;
+
+	core_mask_update =
+		backend->shaders_avail != backend->shaders_desired_mask;
+
+	timer_update = kbdev->csf.mcu_core_pwroff_dur_count !=
+			kbdev->csf.mcu_core_pwroff_reg_shadow;
+
+	if (core_mask_update || timer_update)
+		kbase_csf_firmware_update_core_attr(kbdev, timer_update,
+			core_mask_update, backend->shaders_desired_mask);
+
+	return (core_mask_update || timer_update);
+}
+
 static int kbase_pm_mcu_update_state(struct kbase_device *kbdev)
 {
 	struct kbase_pm_backend_data *backend = &kbdev->pm.backend;
@@ -578,11 +627,20 @@ static int kbase_pm_mcu_update_state(struct kbase_device *kbdev)
 	}
 
 	do {
+		u64 shaders_trans = kbase_pm_get_trans_cores(kbdev, KBASE_PM_CORE_SHADER);
+		u64 shaders_ready = kbase_pm_get_ready_cores(kbdev, KBASE_PM_CORE_SHADER);
+
+		/* mask off ready from trans in case transitions finished
+		 * between the register reads
+		 */
+		shaders_trans &= ~shaders_ready;
+
 		prev_state = backend->mcu_state;
 
 		switch (backend->mcu_state) {
 		case KBASE_MCU_OFF:
 			if (kbase_pm_is_mcu_desired(kbdev) &&
+			    !backend->policy_change_clamp_state_to_off &&
 			    backend->l2_state == KBASE_L2_ON) {
 				kbase_csf_firmware_trigger_reload(kbdev);
 				backend->mcu_state = KBASE_MCU_PEND_ON_RELOAD;
@@ -591,35 +649,116 @@ static int kbase_pm_mcu_update_state(struct kbase_device *kbdev)
 
 		case KBASE_MCU_PEND_ON_RELOAD:
 			if (kbdev->csf.firmware_reloaded) {
-				kbase_csf_firmware_global_reinit(kbdev);
+				backend->shaders_desired_mask =
+					kbase_pm_ca_get_core_mask(kbdev);
+				kbase_csf_firmware_global_reinit(kbdev,
+					backend->shaders_desired_mask);
 				backend->mcu_state =
 					KBASE_MCU_ON_GLB_REINIT_PEND;
 			}
 			break;
 
 		case KBASE_MCU_ON_GLB_REINIT_PEND:
-			if (kbase_csf_firmware_global_reinit_complete(kbdev))
+			if (kbase_csf_firmware_global_reinit_complete(kbdev)) {
+				backend->shaders_avail =
+						backend->shaders_desired_mask;
+				backend->pm_shaders_core_mask = 0;
+				if (kbdev->csf.firmware_hctl_core_pwr) {
+					kbase_pm_invoke(kbdev, KBASE_PM_CORE_SHADER,
+						backend->shaders_avail, ACTION_PWRON);
+					backend->mcu_state =
+						KBASE_MCU_HCTL_SHADERS_PEND_ON;
+				} else
+					backend->mcu_state = KBASE_MCU_ON_HWCNT_ENABLE;
+			}
+			break;
+
+		case KBASE_MCU_HCTL_SHADERS_PEND_ON:
+			if (!shaders_trans &&
+			    shaders_ready == backend->shaders_avail) {
+				/* Cores now stable, notify MCU the stable mask */
+				kbase_csf_firmware_update_core_attr(kbdev,
+						false, true, shaders_ready);
+
+				backend->pm_shaders_core_mask = shaders_ready;
+				backend->mcu_state =
+					KBASE_MCU_HCTL_CORES_NOTIFY_PEND;
+			}
+			break;
+
+		case KBASE_MCU_HCTL_CORES_NOTIFY_PEND:
+			/* Wait for the acknowledgement */
+			if (kbase_csf_firmware_core_attr_updated(kbdev))
 				backend->mcu_state = KBASE_MCU_ON_HWCNT_ENABLE;
 			break;
 
 		case KBASE_MCU_ON_HWCNT_ENABLE:
 			backend->hwcnt_desired = true;
 			if (backend->hwcnt_disabled) {
+				unsigned long flags;
+
+				kbase_csf_scheduler_spin_lock(kbdev, &flags);
 				kbase_hwcnt_context_enable(
 					kbdev->hwcnt_gpu_ctx);
+				kbase_csf_scheduler_spin_unlock(kbdev, flags);
 				backend->hwcnt_disabled = false;
 			}
 			backend->mcu_state = KBASE_MCU_ON;
 			break;
 
 		case KBASE_MCU_ON:
+			backend->shaders_desired_mask = kbase_pm_ca_get_core_mask(kbdev);
+
 			if (!kbase_pm_is_mcu_desired(kbdev))
 				backend->mcu_state = KBASE_MCU_ON_HWCNT_DISABLE;
+			else if (kbdev->csf.firmware_hctl_core_pwr) {
+				/* Host control add additional Cores to be active */
+				if (backend->shaders_desired_mask & ~shaders_ready) {
+					backend->hwcnt_desired = false;
+					if (!backend->hwcnt_disabled)
+						kbase_pm_trigger_hwcnt_disable(kbdev);
+					backend->mcu_state =
+						KBASE_MCU_HCTL_MCU_ON_RECHECK;
+				}
+			} else if (kbase_pm_handle_mcu_core_attr_update(kbdev))
+				kbdev->pm.backend.mcu_state =
+					KBASE_MCU_ON_CORE_ATTR_UPDATE_PEND;
 			break;
 
-		/* ToDo. Add new state(s) if shader cores mask change for DVFS
-		 * has to be accommodated in the MCU state machine.
-		 */
+		case KBASE_MCU_HCTL_MCU_ON_RECHECK:
+			backend->shaders_desired_mask = kbase_pm_ca_get_core_mask(kbdev);
+
+			if (!backend->hwcnt_disabled) {
+				/* Wait for being disabled */
+				;
+			} else if (!kbase_pm_is_mcu_desired(kbdev)) {
+				/* Converging to MCU powering down flow */
+				backend->mcu_state = KBASE_MCU_ON_HWCNT_DISABLE;
+			} else if (backend->shaders_desired_mask & ~shaders_ready) {
+				/* set cores ready but not available to
+				 * meet SHADERS_PEND_ON check pass
+				 */
+				backend->shaders_avail =
+					(backend->shaders_desired_mask | shaders_ready);
+
+				kbase_pm_invoke(kbdev, KBASE_PM_CORE_SHADER,
+						backend->shaders_avail & ~shaders_ready,
+						ACTION_PWRON);
+				backend->mcu_state =
+					KBASE_MCU_HCTL_SHADERS_PEND_ON;
+			} else {
+				backend->mcu_state =
+					KBASE_MCU_HCTL_SHADERS_PEND_ON;
+			}
+			break;
+
+		case KBASE_MCU_ON_CORE_ATTR_UPDATE_PEND:
+			if (kbase_csf_firmware_core_attr_updated(kbdev)) {
+				backend->shaders_avail =
+					backend->shaders_desired_mask;
+				backend->mcu_state = KBASE_MCU_ON;
+			}
+			break;
 
 		case KBASE_MCU_ON_HWCNT_DISABLE:
 			if (kbase_pm_is_mcu_desired(kbdev)) {
@@ -639,14 +778,32 @@ static int kbase_pm_mcu_update_state(struct kbase_device *kbdev)
 			if (!kbase_pm_is_mcu_desired(kbdev)) {
 				kbase_csf_firmware_trigger_mcu_halt(kbdev);
 				backend->mcu_state = KBASE_MCU_ON_PEND_HALT;
-			} else if (kbase_pm_is_mcu_desired(kbdev)) {
+			} else
 				backend->mcu_state = KBASE_MCU_ON_HWCNT_ENABLE;
-			}
 			break;
 
 		case KBASE_MCU_ON_PEND_HALT:
-			if (kbase_csf_firmware_mcu_halted(kbdev))
+			if (kbase_csf_firmware_mcu_halted(kbdev)) {
+				if (kbdev->csf.firmware_hctl_core_pwr)
+					backend->mcu_state =
+						KBASE_MCU_HCTL_SHADERS_READY_OFF;
+				else
+					backend->mcu_state = KBASE_MCU_POWER_DOWN;
+			}
+			break;
+
+		case KBASE_MCU_HCTL_SHADERS_READY_OFF:
+			kbase_pm_invoke(kbdev, KBASE_PM_CORE_SHADER,
+					shaders_ready, ACTION_PWROFF);
+			backend->mcu_state =
+				KBASE_MCU_HCTL_SHADERS_PEND_OFF;
+			break;
+
+		case KBASE_MCU_HCTL_SHADERS_PEND_OFF:
+			if (!shaders_trans && !shaders_ready) {
+				backend->pm_shaders_core_mask = 0;
 				backend->mcu_state = KBASE_MCU_POWER_DOWN;
+			}
 			break;
 
 		case KBASE_MCU_POWER_DOWN:
@@ -698,8 +855,10 @@ static const char *kbase_l2_core_state_to_string(enum kbase_l2_core_state state)
 static int kbase_pm_l2_update_state(struct kbase_device *kbdev)
 {
 	struct kbase_pm_backend_data *backend = &kbdev->pm.backend;
-	u64 l2_present = kbdev->gpu_props.props.raw_props.l2_present;
+	u64 l2_present = kbdev->gpu_props.curr_config.l2_present;
+#if !MALI_USE_CSF
 	u64 tiler_present = kbdev->gpu_props.props.raw_props.tiler_present;
+#endif
 	enum kbase_l2_core_state prev_state;
 
 	lockdep_assert_held(&kbdev->hwaccess_lock);
@@ -710,10 +869,13 @@ static int kbase_pm_l2_update_state(struct kbase_device *kbdev)
 				KBASE_PM_CORE_L2);
 		u64 l2_ready = kbase_pm_get_ready_cores(kbdev,
 				KBASE_PM_CORE_L2);
+
+#if !MALI_USE_CSF
 		u64 tiler_trans = kbase_pm_get_trans_cores(kbdev,
 				KBASE_PM_CORE_TILER);
 		u64 tiler_ready = kbase_pm_get_ready_cores(kbdev,
 				KBASE_PM_CORE_TILER);
+#endif
 
 		/*
 		 * kbase_pm_get_ready_cores and kbase_pm_get_trans_cores
@@ -736,8 +898,9 @@ static int kbase_pm_l2_update_state(struct kbase_device *kbdev)
 		 * between the register reads
 		 */
 		l2_trans &= ~l2_ready;
+#if !MALI_USE_CSF
 		tiler_trans &= ~tiler_ready;
-
+#endif
 		prev_state = backend->l2_state;
 
 		switch (backend->l2_state) {
@@ -748,7 +911,7 @@ static int kbase_pm_l2_update_state(struct kbase_device *kbdev)
 				 * powering it on
 				 */
 				kbase_pm_l2_config_override(kbdev);
-
+#if !MALI_USE_CSF
 				/* L2 is required, power on.  Powering on the
 				 * tiler will also power the first L2 cache.
 				 */
@@ -762,14 +925,30 @@ static int kbase_pm_l2_update_state(struct kbase_device *kbdev)
 					kbase_pm_invoke(kbdev, KBASE_PM_CORE_L2,
 							l2_present & ~1,
 							ACTION_PWRON);
+#else
+				/* With CSF firmware, Host driver doesn't need to
+				 * handle power management with both shader and tiler cores.
+				 * The CSF firmware will power up the cores appropriately.
+				 * So only power the l2 cache explicitly.
+				 */
+				kbase_pm_invoke(kbdev, KBASE_PM_CORE_L2,
+						l2_present, ACTION_PWRON);
+#endif
 				backend->l2_state = KBASE_L2_PEND_ON;
 			}
 			break;
 
 		case KBASE_L2_PEND_ON:
+#if !MALI_USE_CSF
 			if (!l2_trans && l2_ready == l2_present && !tiler_trans
 					&& tiler_ready == tiler_present) {
-				KBASE_KTRACE_ADD(kbdev, PM_CORES_CHANGE_AVAILABLE_TILER, NULL, tiler_ready);
+				KBASE_KTRACE_ADD(kbdev, PM_CORES_CHANGE_AVAILABLE_TILER, NULL,
+						tiler_ready);
+#else
+			if (!l2_trans && l2_ready == l2_present) {
+				KBASE_KTRACE_ADD(kbdev, PM_CORES_CHANGE_AVAILABLE_L2, NULL,
+						l2_ready);
+#endif
 				/*
 				 * Ensure snoops are enabled after L2 is powered
 				 * up. Note that kbase keeps track of the snoop
@@ -948,9 +1127,11 @@ static int kbase_pm_l2_update_state(struct kbase_device *kbdev)
 				 */
 				kbase_gpu_start_cache_clean_nolock(
 						kbdev);
-
+#if !MALI_USE_CSF
 			KBASE_KTRACE_ADD(kbdev, PM_CORES_CHANGE_AVAILABLE_TILER, NULL, 0u);
-
+#else
+			KBASE_KTRACE_ADD(kbdev, PM_CORES_CHANGE_AVAILABLE_L2, NULL, 0u);
+#endif
 			backend->l2_state = KBASE_L2_PEND_OFF;
 			break;
 
@@ -1078,7 +1259,6 @@ static int kbase_pm_shaders_update_state(struct kbase_device *kbdev)
 			&kbdev->pm.backend.shader_tick_timer;
 	enum kbase_shader_core_state prev_state;
 	u64 stacks_avail = 0;
-	int err = 0;
 
 	lockdep_assert_held(&kbdev->hwaccess_lock);
 
@@ -1173,8 +1353,18 @@ static int kbase_pm_shaders_update_state(struct kbase_device *kbdev)
 				backend->pm_shaders_core_mask = shaders_ready;
 				backend->hwcnt_desired = true;
 				if (backend->hwcnt_disabled) {
+#if MALI_USE_CSF
+					unsigned long flags;
+
+					kbase_csf_scheduler_spin_lock(kbdev,
+								      &flags);
+#endif
 					kbase_hwcnt_context_enable(
 						kbdev->hwcnt_gpu_ctx);
+#if MALI_USE_CSF
+					kbase_csf_scheduler_spin_unlock(kbdev,
+									flags);
+#endif
 					backend->hwcnt_disabled = false;
 				}
 
@@ -1354,8 +1544,18 @@ static int kbase_pm_shaders_update_state(struct kbase_device *kbdev)
 				backend->pm_shaders_core_mask = 0;
 				backend->hwcnt_desired = true;
 				if (backend->hwcnt_disabled) {
+#if MALI_USE_CSF
+					unsigned long flags;
+
+					kbase_csf_scheduler_spin_lock(kbdev,
+								      &flags);
+#endif
 					kbase_hwcnt_context_enable(
 						kbdev->hwcnt_gpu_ctx);
+#if MALI_USE_CSF
+					kbase_csf_scheduler_spin_unlock(kbdev,
+									flags);
+#endif
 					backend->hwcnt_disabled = false;
 				}
 				backend->shaders_state = KBASE_SHADERS_OFF_CORESTACK_OFF_TIMER_PEND_OFF;
@@ -1382,7 +1582,7 @@ static int kbase_pm_shaders_update_state(struct kbase_device *kbdev)
 
 	} while (backend->shaders_state != prev_state);
 
-	return err;
+	return 0;
 }
 #endif
 
@@ -1647,7 +1847,8 @@ void kbase_pm_reset_complete(struct kbase_device *kbdev)
 
 /* Timeout for kbase_pm_wait_for_desired_state when wait_event_killable has
  * aborted due to a fatal signal. If the time spent waiting has exceeded this
- * threshold then there is most likely a hardware issue. */
+ * threshold then there is most likely a hardware issue.
+ */
 #define PM_TIMEOUT_MS (5000) /* 5s */
 
 static void kbase_pm_timed_out(struct kbase_device *kbdev)
@@ -1706,7 +1907,8 @@ static void kbase_pm_timed_out(struct kbase_device *kbdev)
 					L2_PWRTRANS_LO)));
 
 	dev_err(kbdev->dev, "Sending reset to GPU - all running jobs will be lost\n");
-	if (kbase_prepare_to_reset_gpu(kbdev))
+	if (kbase_prepare_to_reset_gpu(kbdev,
+				       RESET_FLAGS_HWC_UNRECOVERABLE_ERROR))
 		kbase_reset_gpu(kbdev);
 }
 
@@ -1774,7 +1976,7 @@ void kbase_pm_enable_interrupts(struct kbase_device *kbdev)
 {
 	unsigned long flags;
 
-	KBASE_DEBUG_ASSERT(NULL != kbdev);
+	KBASE_DEBUG_ASSERT(kbdev != NULL);
 	/*
 	 * Clear all interrupts,
 	 * and unmask them all.
@@ -1800,7 +2002,7 @@ KBASE_EXPORT_TEST_API(kbase_pm_enable_interrupts);
 
 void kbase_pm_disable_interrupts_nolock(struct kbase_device *kbdev)
 {
-	KBASE_DEBUG_ASSERT(NULL != kbdev);
+	KBASE_DEBUG_ASSERT(kbdev != NULL);
 	/*
 	 * Mask all interrupts,
 	 * and clear them all.
@@ -1827,6 +2029,22 @@ void kbase_pm_disable_interrupts(struct kbase_device *kbdev)
 
 KBASE_EXPORT_TEST_API(kbase_pm_disable_interrupts);
 
+#if MALI_USE_CSF
+static void update_user_reg_page_mapping(struct kbase_device *kbdev)
+{
+	lockdep_assert_held(&kbdev->pm.lock);
+
+	if (kbdev->csf.mali_file_inode) {
+		/* This would zap the pte corresponding to the mapping of User
+		 * register page for all the Kbase contexts.
+		 */
+		unmap_mapping_range(kbdev->csf.mali_file_inode->i_mapping,
+				    BASEP_MEM_CSF_USER_REG_PAGE_HANDLE,
+				    PAGE_SIZE, 1);
+	}
+}
+#endif
+
 /*
  * pmu layout:
  * 0x0000: PMU TAG (RO) (0xCAFECAFE)
@@ -1838,7 +2056,7 @@ void kbase_pm_clock_on(struct kbase_device *kbdev, bool is_resume)
 	bool reset_required = is_resume;
 	unsigned long flags;
 
-	KBASE_DEBUG_ASSERT(NULL != kbdev);
+	KBASE_DEBUG_ASSERT(kbdev != NULL);
 #if !MALI_USE_CSF
 	lockdep_assert_held(&kbdev->js_data.runpool_mutex);
 #endif /* !MALI_USE_CSF */
@@ -1876,24 +2094,39 @@ void kbase_pm_clock_on(struct kbase_device *kbdev, bool is_resume)
 	kbdev->pm.backend.gpu_powered = true;
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 
+#if MALI_USE_CSF
+	/* GPU has been turned on, can switch to actual register page */
+	update_user_reg_page_mapping(kbdev);
+#endif
+
 	if (reset_required) {
 		/* GPU state was lost, reset GPU to ensure it is in a
-		 * consistent state */
+		 * consistent state
+		 */
 		kbase_pm_init_hw(kbdev, PM_ENABLE_IRQS);
 	}
 #ifdef CONFIG_MALI_ARBITER_SUPPORT
 	else {
-		struct kbase_arbiter_vm_state *arb_vm_state =
+		if (kbdev->arb.arb_if) {
+			struct kbase_arbiter_vm_state *arb_vm_state =
 				kbdev->pm.arb_vm_state;
 
-		/* In the case that the GPU has just been granted by
-		 * the Arbiter, a reset will have already been done.
-		 * However, it is still necessary to initialize the GPU.
-		 */
-		if (arb_vm_state->vm_arb_starting)
-			kbase_pm_init_hw(kbdev, PM_ENABLE_IRQS |
-					PM_NO_RESET);
+			/* In the case that the GPU has just been granted by
+			 * the Arbiter, a reset will have already been done.
+			 * However, it is still necessary to initialize the GPU.
+			 */
+			if (arb_vm_state->vm_arb_starting)
+				kbase_pm_init_hw(kbdev, PM_ENABLE_IRQS |
+						PM_NO_RESET);
+		}
 	}
+	/*
+	 * This point means that the GPU trasitioned to ON. So there is a chance
+	 * that a repartitioning occurred. In this case the current config
+	 * should be read again.
+	 */
+	kbase_gpuprops_get_curr_config_props(kbdev,
+		&kbdev->gpu_props.curr_config);
 #endif /* CONFIG_MALI_ARBITER_SUPPORT */
 
 	mutex_lock(&kbdev->mmu_hw_mutex);
@@ -1918,6 +2151,17 @@ void kbase_pm_clock_on(struct kbase_device *kbdev, bool is_resume)
 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
 	kbdev->pm.backend.gpu_ready = true;
 	kbdev->pm.backend.l2_desired = true;
+#if MALI_USE_CSF
+	if (reset_required) {
+		/* GPU reset was done after the power on, so send the post
+		 * reset event instead. This is okay as GPU power off event
+		 * is same as pre GPU reset event.
+		 */
+		kbase_ipa_control_handle_gpu_reset_post(kbdev);
+	} else {
+		kbase_ipa_control_handle_gpu_power_on(kbdev);
+	}
+#endif
 	kbase_pm_update_state(kbdev);
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 }
@@ -1928,7 +2172,7 @@ bool kbase_pm_clock_off(struct kbase_device *kbdev)
 {
 	unsigned long flags;
 
-	KBASE_DEBUG_ASSERT(NULL != kbdev);
+	KBASE_DEBUG_ASSERT(kbdev != NULL);
 	lockdep_assert_held(&kbdev->pm.lock);
 
 	/* ASSERT that the cores should now be unavailable. No lock needed. */
@@ -1952,12 +2196,16 @@ bool kbase_pm_clock_off(struct kbase_device *kbdev)
 
 	if (atomic_read(&kbdev->faults_pending)) {
 		/* Page/bus faults are still being processed. The GPU can not
-		 * be powered off until they have completed */
+		 * be powered off until they have completed
+		 */
 		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 		return false;
 	}
 
 	kbase_pm_cache_snoop_disable(kbdev);
+#if MALI_USE_CSF
+	kbase_ipa_control_handle_gpu_power_off(kbdev);
+#endif
 
 	kbdev->pm.backend.gpu_ready = false;
 
@@ -1974,6 +2222,12 @@ bool kbase_pm_clock_off(struct kbase_device *kbdev)
 #endif
 
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+
+#if MALI_USE_CSF
+	/* GPU is about to be turned off, switch to dummy page */
+	update_user_reg_page_mapping(kbdev);
+#endif
+
 #ifdef CONFIG_MALI_ARBITER_SUPPORT
 	kbase_arbiter_pm_vm_event(kbdev, KBASE_VM_GPU_IDLE_EVENT);
 #endif /* CONFIG_MALI_ARBITER_SUPPORT */
@@ -2021,23 +2275,23 @@ static enum hrtimer_restart kbasep_reset_timeout(struct hrtimer *timer)
 	struct kbasep_reset_timeout_data *rtdata =
 		container_of(timer, struct kbasep_reset_timeout_data, timer);
 
-	rtdata->timed_out = 1;
+	rtdata->timed_out = true;
 
 	/* Set the wait queue to wake up kbase_pm_init_hw even though the reset
-	 * hasn't completed */
+	 * hasn't completed
+	 */
 	kbase_pm_reset_done(rtdata->kbdev);
 
 	return HRTIMER_NORESTART;
 }
 
-static int kbase_set_jm_quirks(struct kbase_device *kbdev, const u32 prod_id)
+static int kbase_set_gpu_quirks(struct kbase_device *kbdev, const u32 prod_id)
 {
 #if MALI_USE_CSF
-	kbdev->hw_quirks_jm = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(CSF_CONFIG));
+	kbdev->hw_quirks_gpu =
+		kbase_reg_read(kbdev, GPU_CONTROL_REG(CSF_CONFIG));
 #else
-	u32 hw_quirks_jm = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(JM_CONFIG));
+	u32 hw_quirks_gpu = kbase_reg_read(kbdev, GPU_CONTROL_REG(JM_CONFIG));
 
 	if (GPU_ID2_MODEL_MATCH_VALUE(prod_id) == GPU_ID2_PRODUCT_TMIX) {
 		/* Only for tMIx */
@@ -2051,39 +2305,38 @@ static int kbase_set_jm_quirks(struct kbase_device *kbdev, const u32 prod_id)
 		 */
 		if (coherency_features ==
 				COHERENCY_FEATURE_BIT(COHERENCY_ACE)) {
-			hw_quirks_jm |= (COHERENCY_ACE_LITE |
-					COHERENCY_ACE) <<
-					JM_FORCE_COHERENCY_FEATURES_SHIFT;
+			hw_quirks_gpu |= (COHERENCY_ACE_LITE | COHERENCY_ACE)
+					 << JM_FORCE_COHERENCY_FEATURES_SHIFT;
 		}
 	}
 
 	if (kbase_is_gpu_removed(kbdev))
 		return -EIO;
 
-	kbdev->hw_quirks_jm = hw_quirks_jm;
+	kbdev->hw_quirks_gpu = hw_quirks_gpu;
 
 #endif /* !MALI_USE_CSF */
 	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_IDVS_GROUP_SIZE)) {
 		int default_idvs_group_size = 0xF;
-		u32 tmp;
+		u32 group_size = 0;
 
-		if (of_property_read_u32(kbdev->dev->of_node,
-					"idvs-group-size", &tmp))
-			tmp = default_idvs_group_size;
+		if (of_property_read_u32(kbdev->dev->of_node, "idvs-group-size",
+					 &group_size))
+			group_size = default_idvs_group_size;
 
-		if (tmp > IDVS_GROUP_MAX_SIZE) {
+		if (group_size > IDVS_GROUP_MAX_SIZE) {
 			dev_err(kbdev->dev,
 				"idvs-group-size of %d is too large. Maximum value is %d",
-				tmp, IDVS_GROUP_MAX_SIZE);
-			tmp = default_idvs_group_size;
+				group_size, IDVS_GROUP_MAX_SIZE);
+			group_size = default_idvs_group_size;
 		}
 
-		kbdev->hw_quirks_jm |= tmp << IDVS_GROUP_SIZE_SHIFT;
+		kbdev->hw_quirks_gpu |= group_size << IDVS_GROUP_SIZE_SHIFT;
 	}
 
 #define MANUAL_POWER_CONTROL ((u32)(1 << 8))
 	if (corestack_driver_control)
-		kbdev->hw_quirks_jm |= MANUAL_POWER_CONTROL;
+		kbdev->hw_quirks_gpu |= MANUAL_POWER_CONTROL;
 
 	return 0;
 }
@@ -2137,18 +2390,17 @@ static int kbase_pm_hw_issues_detect(struct kbase_device *kbdev)
 				GPU_ID_VERSION_PRODUCT_ID_SHIFT;
 	int error = 0;
 
-	kbdev->hw_quirks_jm = 0;
+	kbdev->hw_quirks_gpu = 0;
 	kbdev->hw_quirks_sc = 0;
 	kbdev->hw_quirks_tiler = 0;
 	kbdev->hw_quirks_mmu = 0;
 
-	if (!of_property_read_u32(np, "quirks_jm",
-				&kbdev->hw_quirks_jm)) {
+	if (!of_property_read_u32(np, "quirks_gpu", &kbdev->hw_quirks_gpu)) {
 		dev_info(kbdev->dev,
-			"Found quirks_jm = [0x%x] in Devicetree\n",
-			kbdev->hw_quirks_jm);
+			 "Found quirks_gpu = [0x%x] in Devicetree\n",
+			 kbdev->hw_quirks_gpu);
 	} else {
-		error = kbase_set_jm_quirks(kbdev, prod_id);
+		error = kbase_set_gpu_quirks(kbdev, prod_id);
 		if (error)
 			return error;
 	}
@@ -2199,10 +2451,10 @@ static void kbase_pm_hw_issues_apply(struct kbase_device *kbdev)
 			kbdev->hw_quirks_mmu);
 #if MALI_USE_CSF
 	kbase_reg_write(kbdev, GPU_CONTROL_REG(CSF_CONFIG),
-			kbdev->hw_quirks_jm);
+			kbdev->hw_quirks_gpu);
 #else
 	kbase_reg_write(kbdev, GPU_CONTROL_REG(JM_CONFIG),
-			kbdev->hw_quirks_jm);
+			kbdev->hw_quirks_gpu);
 #endif
 }
 
@@ -2233,6 +2485,7 @@ void kbase_pm_cache_snoop_disable(struct kbase_device *kbdev)
 	}
 }
 
+#if !MALI_USE_CSF
 static void reenable_protected_mode_hwcnt(struct kbase_device *kbdev)
 {
 	unsigned long irq_flags;
@@ -2245,6 +2498,7 @@ static void reenable_protected_mode_hwcnt(struct kbase_device *kbdev)
 	}
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, irq_flags);
 }
+#endif
 
 static int kbase_pm_do_reset(struct kbase_device *kbdev)
 {
@@ -2271,7 +2525,7 @@ static int kbase_pm_do_reset(struct kbase_device *kbdev)
 
 	/* Initialize a structure for tracking the status of the reset */
 	rtdata.kbdev = kbdev;
-	rtdata.timed_out = 0;
+	rtdata.timed_out = false;
 
 	/* Create a timer to use as a timeout on the reset */
 	hrtimer_init_on_stack(&rtdata.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
@@ -2283,7 +2537,7 @@ static int kbase_pm_do_reset(struct kbase_device *kbdev)
 	/* Wait for the RESET_COMPLETED interrupt to be raised */
 	kbase_pm_wait_for_reset(kbdev);
 
-	if (rtdata.timed_out == 0) {
+	if (!rtdata.timed_out) {
 		/* GPU has been reset */
 		hrtimer_cancel(&rtdata.timer);
 		destroy_hrtimer_on_stack(&rtdata.timer);
@@ -2291,11 +2545,13 @@ static int kbase_pm_do_reset(struct kbase_device *kbdev)
 	}
 
 	/* No interrupt has been received - check if the RAWSTAT register says
-	 * the reset has completed */
+	 * the reset has completed
+	 */
 	if ((kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_IRQ_RAWSTAT)) &
 							RESET_COMPLETED)) {
 		/* The interrupt is set in the RAWSTAT; this suggests that the
-		 * interrupts are not getting to the CPU */
+		 * interrupts are not getting to the CPU
+		 */
 		dev_err(kbdev->dev, "Reset interrupt didn't reach CPU. Check interrupt assignments.\n");
 		/* If interrupts aren't working we can't continue. */
 		destroy_hrtimer_on_stack(&rtdata.timer);
@@ -2309,33 +2565,40 @@ static int kbase_pm_do_reset(struct kbase_device *kbdev)
 	}
 
 	/* The GPU doesn't seem to be responding to the reset so try a hard
-	 * reset */
-	dev_err(kbdev->dev, "Failed to soft-reset GPU (timed out after %d ms), now attempting a hard reset\n",
-								RESET_TIMEOUT);
-	KBASE_KTRACE_ADD(kbdev, CORE_GPU_HARD_RESET, NULL, 0);
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
-						GPU_COMMAND_HARD_RESET);
+	 * reset, but only when NOT in arbitration mode.
+	 */
+#ifdef CONFIG_MALI_ARBITER_SUPPORT
+	if (!kbdev->arb.arb_if) {
+#endif /* CONFIG_MALI_ARBITER_SUPPORT */
+		dev_err(kbdev->dev, "Failed to soft-reset GPU (timed out after %d ms), now attempting a hard reset\n",
+					RESET_TIMEOUT);
+		KBASE_KTRACE_ADD(kbdev, CORE_GPU_HARD_RESET, NULL, 0);
+		kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
+					GPU_COMMAND_HARD_RESET);
 
-	/* Restart the timer to wait for the hard reset to complete */
-	rtdata.timed_out = 0;
+		/* Restart the timer to wait for the hard reset to complete */
+		rtdata.timed_out = false;
 
-	hrtimer_start(&rtdata.timer, HR_TIMER_DELAY_MSEC(RESET_TIMEOUT),
-							HRTIMER_MODE_REL);
+		hrtimer_start(&rtdata.timer, HR_TIMER_DELAY_MSEC(RESET_TIMEOUT),
+					HRTIMER_MODE_REL);
 
-	/* Wait for the RESET_COMPLETED interrupt to be raised */
-	kbase_pm_wait_for_reset(kbdev);
+		/* Wait for the RESET_COMPLETED interrupt to be raised */
+		kbase_pm_wait_for_reset(kbdev);
 
-	if (rtdata.timed_out == 0) {
-		/* GPU has been reset */
-		hrtimer_cancel(&rtdata.timer);
-		destroy_hrtimer_on_stack(&rtdata.timer);
-		return 0;
-	}
+		if (!rtdata.timed_out) {
+			/* GPU has been reset */
+			hrtimer_cancel(&rtdata.timer);
+			destroy_hrtimer_on_stack(&rtdata.timer);
+			return 0;
+		}
 
-	destroy_hrtimer_on_stack(&rtdata.timer);
+		destroy_hrtimer_on_stack(&rtdata.timer);
 
-	dev_err(kbdev->dev, "Failed to hard-reset the GPU (timed out after %d ms)\n",
-								RESET_TIMEOUT);
+		dev_err(kbdev->dev, "Failed to hard-reset the GPU (timed out after %d ms)\n",
+					RESET_TIMEOUT);
+#ifdef CONFIG_MALI_ARBITER_SUPPORT
+	}
+#endif /* CONFIG_MALI_ARBITER_SUPPORT */
 
 	return -EINVAL;
 }
@@ -2359,7 +2622,7 @@ int kbase_pm_init_hw(struct kbase_device *kbdev, unsigned int flags)
 	unsigned long irq_flags;
 	int err = 0;
 
-	KBASE_DEBUG_ASSERT(NULL != kbdev);
+	KBASE_DEBUG_ASSERT(kbdev != NULL);
 	lockdep_assert_held(&kbdev->pm.lock);
 
 	/* Ensure the clock is on before attempting to access the hardware */
@@ -2371,7 +2634,8 @@ int kbase_pm_init_hw(struct kbase_device *kbdev, unsigned int flags)
 	}
 
 	/* Ensure interrupts are off to begin with, this also clears any
-	 * outstanding interrupts */
+	 * outstanding interrupts
+	 */
 	kbase_pm_disable_interrupts(kbdev);
 	/* Ensure cache snoops are disabled before reset. */
 	kbase_pm_cache_snoop_disable(kbdev);
@@ -2392,6 +2656,17 @@ int kbase_pm_init_hw(struct kbase_device *kbdev, unsigned int flags)
 				kbdev->protected_dev);
 
 	spin_lock_irqsave(&kbdev->hwaccess_lock, irq_flags);
+#if MALI_USE_CSF
+	if (kbdev->protected_mode) {
+		unsigned long flags;
+
+		kbase_ipa_control_protm_exited(kbdev);
+
+		kbase_csf_scheduler_spin_lock(kbdev, &flags);
+		kbase_hwcnt_backend_csf_protm_exited(&kbdev->hwcnt_gpu_iface);
+		kbase_csf_scheduler_spin_unlock(kbdev, flags);
+	}
+#endif
 	kbdev->protected_mode = false;
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, irq_flags);
 
@@ -2412,7 +2687,8 @@ int kbase_pm_init_hw(struct kbase_device *kbdev, unsigned int flags)
 			GPU_STATUS_PROTECTED_MODE_ACTIVE);
 
 	/* If cycle counter was in use re-enable it, enable_irqs will only be
-	 * false when called from kbase_pm_powerup */
+	 * false when called from kbase_pm_powerup
+	 */
 	if (kbdev->pm.backend.gpu_cycle_counter_requests &&
 						(flags & PM_ENABLE_IRQS)) {
 		kbase_pm_enable_interrupts(kbdev);
@@ -2435,12 +2711,14 @@ int kbase_pm_init_hw(struct kbase_device *kbdev, unsigned int flags)
 		kbase_pm_enable_interrupts(kbdev);
 
 exit:
+#if !MALI_USE_CSF
 	if (!kbdev->pm.backend.protected_entry_transition_override) {
 		/* Re-enable GPU hardware counters if we're resetting from
 		 * protected mode.
 		 */
 		reenable_protected_mode_hwcnt(kbdev);
 	}
+#endif
 
 	return err;
 }
@@ -2467,12 +2745,22 @@ kbase_pm_request_gpu_cycle_counter_do_request(struct kbase_device *kbdev)
 
 	spin_lock_irqsave(&kbdev->pm.backend.gpu_cycle_counter_requests_lock,
 									flags);
-
 	++kbdev->pm.backend.gpu_cycle_counter_requests;
 
-	if (1 == kbdev->pm.backend.gpu_cycle_counter_requests)
+	if (kbdev->pm.backend.gpu_cycle_counter_requests == 1)
 		kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
 					GPU_COMMAND_CYCLE_COUNT_START);
+	else {
+		/* This might happen after GPU reset.
+		 * Then counter needs to be kicked.
+		 */
+		if (!IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI) &&
+		    (!(kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_STATUS)) &
+		       GPU_STATUS_CYCLE_COUNT_ACTIVE))) {
+			kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
+					GPU_COMMAND_CYCLE_COUNT_START);
+		}
+	}
 
 	spin_unlock_irqrestore(
 			&kbdev->pm.backend.gpu_cycle_counter_requests_lock,
@@ -2488,6 +2776,8 @@ void kbase_pm_request_gpu_cycle_counter(struct kbase_device *kbdev)
 	KBASE_DEBUG_ASSERT(kbdev->pm.backend.gpu_cycle_counter_requests <
 								INT_MAX);
 
+	kbase_pm_wait_for_l2_powered(kbdev);
+
 	kbase_pm_request_gpu_cycle_counter_do_request(kbdev);
 }
 
@@ -2522,7 +2812,7 @@ void kbase_pm_release_gpu_cycle_counter_nolock(struct kbase_device *kbdev)
 
 	--kbdev->pm.backend.gpu_cycle_counter_requests;
 
-	if (0 == kbdev->pm.backend.gpu_cycle_counter_requests)
+	if (kbdev->pm.backend.gpu_cycle_counter_requests == 0)
 		kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
 					GPU_COMMAND_CYCLE_COUNT_STOP);
 
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_internal.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_internal.h
index 50ca016bbd6d..d27eb58ebcda 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_internal.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_internal.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /*
  * Power management API definitions used internally by GPU backend
  */
@@ -227,6 +224,7 @@ void kbase_pm_reset_done(struct kbase_device *kbdev);
  *
  * Return: 0 on success, error code on error
  */
+int kbase_pm_wait_for_desired_state(struct kbase_device *kbdev);
 #else
 /**
  * kbase_pm_wait_for_desired_state - Wait for the desired power state to be
@@ -250,8 +248,8 @@ void kbase_pm_reset_done(struct kbase_device *kbdev);
  *
  * Return: 0 on success, error code on error
  */
-#endif
 int kbase_pm_wait_for_desired_state(struct kbase_device *kbdev);
+#endif
 
 /**
  * kbase_pm_wait_for_l2_powered - Wait for the L2 cache to be powered on
@@ -492,7 +490,8 @@ void kbase_pm_register_access_enable(struct kbase_device *kbdev);
 void kbase_pm_register_access_disable(struct kbase_device *kbdev);
 
 /* NOTE: kbase_pm_is_suspending is in mali_kbase.h, because it is an inline
- * function */
+ * function
+ */
 
 /**
  * kbase_pm_metrics_is_active - Check if the power management metrics
@@ -536,8 +535,22 @@ void kbase_pm_get_dvfs_metrics(struct kbase_device *kbdev,
 
 #ifdef CONFIG_MALI_BIFROST_DVFS
 
+#if MALI_USE_CSF
 /**
- * kbase_platform_dvfs_event - Report utilisation to DVFS code
+ * kbase_platform_dvfs_event - Report utilisation to DVFS code for CSF GPU
+ *
+ * Function provided by platform specific code when DVFS is enabled to allow
+ * the power management metrics system to report utilisation.
+ *
+ * @kbdev:         The kbase device structure for the device (must be a
+ *                 valid pointer)
+ * @utilisation:   The current calculated utilisation by the metrics system.
+ * Return:         Returns 0 on failure and non zero on success.
+ */
+int kbase_platform_dvfs_event(struct kbase_device *kbdev, u32 utilisation);
+#else
+/**
+ * kbase_platform_dvfs_event - Report utilisation to DVFS code for JM GPU
  *
  * Function provided by platform specific code when DVFS is enabled to allow
  * the power management metrics system to report utilisation.
@@ -550,11 +563,12 @@ void kbase_pm_get_dvfs_metrics(struct kbase_device *kbdev,
  *                 group.
  * Return:         Returns 0 on failure and non zero on success.
  */
-
 int kbase_platform_dvfs_event(struct kbase_device *kbdev, u32 utilisation,
-	u32 util_gl_share, u32 util_cl_share[2]);
+			      u32 util_gl_share, u32 util_cl_share[2]);
 #endif
 
+#endif /* CONFIG_MALI_BIFROST_DVFS */
+
 void kbase_pm_power_changed(struct kbase_device *kbdev);
 
 /**
@@ -708,6 +722,72 @@ extern bool corestack_driver_control;
  */
 bool kbase_pm_is_l2_desired(struct kbase_device *kbdev);
 
+#if MALI_USE_CSF
+/**
+ * kbase_pm_is_mcu_desired - Check whether MCU is desired
+ *
+ * @kbdev: Device pointer
+ *
+ * This shall be called to check whether MCU needs to be enabled.
+ *
+ * Return: true if MCU needs to be enabled.
+ */
+bool kbase_pm_is_mcu_desired(struct kbase_device *kbdev);
+
+/**
+ * kbase_pm_idle_groups_sched_suspendable - Check whether the scheduler can be
+ *                                        suspended to low power state when all
+ *                                        the CSGs are idle
+ *
+ * @kbdev: Device pointer
+ *
+ * Return: true if allowed to enter the suspended state.
+ */
+static inline
+bool kbase_pm_idle_groups_sched_suspendable(struct kbase_device *kbdev)
+{
+	lockdep_assert_held(&kbdev->hwaccess_lock);
+
+	return !(kbdev->pm.backend.csf_pm_sched_flags &
+		 CSF_DYNAMIC_PM_SCHED_IGNORE_IDLE);
+}
+
+/**
+ * kbase_pm_no_runnables_sched_suspendable - Check whether the scheduler can be
+ *                                        suspended to low power state when
+ *                                        there are no runnable CSGs.
+ *
+ * @kbdev: Device pointer
+ *
+ * Return: true if allowed to enter the suspended state.
+ */
+static inline
+bool kbase_pm_no_runnables_sched_suspendable(struct kbase_device *kbdev)
+{
+	lockdep_assert_held(&kbdev->hwaccess_lock);
+
+	return !(kbdev->pm.backend.csf_pm_sched_flags &
+		 CSF_DYNAMIC_PM_SCHED_NO_SUSPEND);
+}
+
+/**
+ * kbase_pm_no_mcu_core_pwroff - Check whether the PM is required to keep the
+ *                               MCU core powered in accordance to the active
+ *                               power management policy
+ *
+ * @kbdev: Device pointer
+ *
+ * Return: true if the MCU is to retain powered.
+ */
+static inline bool kbase_pm_no_mcu_core_pwroff(struct kbase_device *kbdev)
+{
+	lockdep_assert_held(&kbdev->hwaccess_lock);
+
+	return kbdev->pm.backend.csf_pm_sched_flags &
+		CSF_DYNAMIC_PM_CORE_KEEP_ON;
+}
+#endif
+
 /**
  * kbase_pm_lock - Lock all necessary mutexes to perform PM actions
  *
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_l2_states.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_l2_states.h
index 12cb051db42a..d66b92841290 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_l2_states.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_l2_states.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -25,6 +24,19 @@
  * The function-like macro KBASEP_L2_STATE() must be defined before including
  * this header file. This header file can be included multiple times in the
  * same compilation unit with different definitions of KBASEP_L2_STATE().
+ *
+ * @OFF:              The L2 cache and tiler are off
+ * @PEND_ON:          The L2 cache and tiler are powering on
+ * @RESTORE_CLOCKS:   The GPU clock is restored. Conditionally used.
+ * @ON_HWCNT_ENABLE:  The L2 cache and tiler are on, and hwcnt is being enabled
+ * @ON:               The L2 cache and tiler are on, and hwcnt is enabled
+ * @ON_HWCNT_DISABLE: The L2 cache and tiler are on, and hwcnt is being disabled
+ * @SLOW_DOWN_CLOCKS: The GPU clock is set to appropriate or lowest clock.
+ *                    Conditionally used.
+ * @POWER_DOWN:       The L2 cache and tiler are about to be powered off
+ * @PEND_OFF:         The L2 cache and tiler are powering off
+ * @RESET_WAIT:       The GPU is resetting, L2 cache and tiler power state are
+ *                    unknown
  */
 KBASEP_L2_STATE(OFF)
 KBASEP_L2_STATE(PEND_ON)
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_mcu_states.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_mcu_states.h
index e163bd4f4094..eab30eb32c56 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_mcu_states.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_mcu_states.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -25,15 +24,40 @@
  * The function-like macro KBASEP_MCU_STATE() must be defined before including
  * this header file. This header file can be included multiple times in the
  * same compilation unit with different definitions of KBASEP_MCU_STATE().
+ *
+ * @OFF:                      The MCU is powered off.
+ * @PEND_ON_RELOAD:           The warm boot of MCU or cold boot of MCU (with
+ *                            firmware reloading) is in progress.
+ * @ON_GLB_REINIT_PEND:       The MCU is enabled and Global configuration
+ *                            requests have been sent to the firmware.
+ * @ON_HWCNT_ENABLE:          The Global requests have completed and MCU is now
+ *                            ready for use and hwcnt is being enabled.
+ * @ON:                       The MCU is active and hwcnt has been enabled.
+ * @ON_CORE_ATTR_UPDATE_PEND: The MCU is active and mask of enabled shader cores
+ *                            is being updated.
+ * @ON_HWCNT_DISABLE:         The MCU is on and hwcnt is being disabled.
+ * @ON_HALT:                  The MCU is on and hwcnt has been disabled, MCU
+ *                            halt would be triggered.
+ * @ON_PEND_HALT:             MCU halt in progress, confirmation pending.
+ * @POWER_DOWN:               MCU halted operations, pending being disabled.
+ * @PEND_OFF:                 MCU is being disabled, pending on powering off.
+ * @RESET_WAIT:               The GPU is resetting, MCU state is unknown.
  */
 KBASEP_MCU_STATE(OFF)
 KBASEP_MCU_STATE(PEND_ON_RELOAD)
 KBASEP_MCU_STATE(ON_GLB_REINIT_PEND)
 KBASEP_MCU_STATE(ON_HWCNT_ENABLE)
 KBASEP_MCU_STATE(ON)
+KBASEP_MCU_STATE(ON_CORE_ATTR_UPDATE_PEND)
 KBASEP_MCU_STATE(ON_HWCNT_DISABLE)
 KBASEP_MCU_STATE(ON_HALT)
 KBASEP_MCU_STATE(ON_PEND_HALT)
 KBASEP_MCU_STATE(POWER_DOWN)
 KBASEP_MCU_STATE(PEND_OFF)
 KBASEP_MCU_STATE(RESET_WAIT)
+/* Additional MCU states with HOST_CONTROL_SHADERS */
+KBASEP_MCU_STATE(HCTL_SHADERS_PEND_ON)
+KBASEP_MCU_STATE(HCTL_CORES_NOTIFY_PEND)
+KBASEP_MCU_STATE(HCTL_MCU_ON_RECHECK)
+KBASEP_MCU_STATE(HCTL_SHADERS_READY_OFF)
+KBASEP_MCU_STATE(HCTL_SHADERS_PEND_OFF)
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_metrics.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_metrics.c
index b714971ba17c..319a60bc62e8 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_metrics.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_metrics.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2011-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /*
  * Metrics for power management
  */
@@ -29,24 +26,28 @@
 #include <mali_kbase.h>
 #include <mali_kbase_pm.h>
 #include <backend/gpu/mali_kbase_pm_internal.h>
-#if !MALI_USE_CSF
+
+#if MALI_USE_CSF
+#include "mali_kbase_clk_rate_trace_mgr.h"
+#include <csf/ipa_control/mali_kbase_csf_ipa_control.h>
+#else
 #include <backend/gpu/mali_kbase_jm_rb.h>
 #endif /* !MALI_USE_CSF */
+
 #include <backend/gpu/mali_kbase_pm_defs.h>
 #include <mali_linux_trace.h>
 
-/* When VSync is being hit aim for utilisation between 70-90% */
-#define KBASE_PM_VSYNC_MIN_UTILISATION          70
-#define KBASE_PM_VSYNC_MAX_UTILISATION          90
-/* Otherwise aim for 10-40% */
-#define KBASE_PM_NO_VSYNC_MIN_UTILISATION       10
-#define KBASE_PM_NO_VSYNC_MAX_UTILISATION       40
-
 /* Shift used for kbasep_pm_metrics_data.time_busy/idle - units of (1 << 8) ns
  * This gives a maximum period between samples of 2^(32+8)/100 ns = slightly
- * under 11s. Exceeding this will cause overflow */
+ * under 11s. Exceeding this will cause overflow
+ */
 #define KBASE_PM_TIME_SHIFT			8
 
+#if MALI_USE_CSF
+/* To get the GPU_ACTIVE value in nano seconds unit */
+#define GPU_ACTIVE_SCALING_FACTOR ((u64)1E9)
+#endif
+
 #ifdef CONFIG_MALI_BIFROST_DVFS
 static enum hrtimer_restart dvfs_callback(struct hrtimer *timer)
 {
@@ -73,11 +74,45 @@ static enum hrtimer_restart dvfs_callback(struct hrtimer *timer)
 
 int kbasep_pm_metrics_init(struct kbase_device *kbdev)
 {
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
+#if MALI_USE_CSF
+	struct kbase_ipa_control_perf_counter perf_counter;
+	int err;
+
+	/* One counter group */
+	const size_t NUM_PERF_COUNTERS = 1;
 
+	KBASE_DEBUG_ASSERT(kbdev != NULL);
 	kbdev->pm.backend.metrics.kbdev = kbdev;
+	kbdev->pm.backend.metrics.time_period_start = ktime_get();
+	kbdev->pm.backend.metrics.values.time_busy = 0;
+	kbdev->pm.backend.metrics.values.time_idle = 0;
+	kbdev->pm.backend.metrics.values.time_in_protm = 0;
+
+	perf_counter.scaling_factor = GPU_ACTIVE_SCALING_FACTOR;
+
+	/* Normalize values by GPU frequency */
+	perf_counter.gpu_norm = true;
 
+	/* We need the GPU_ACTIVE counter, which is in the CSHW group */
+	perf_counter.type = KBASE_IPA_CORE_TYPE_CSHW;
+
+	/* We need the GPU_ACTIVE counter */
+	perf_counter.idx = GPU_ACTIVE_CNT_IDX;
+
+	err = kbase_ipa_control_register(
+		kbdev, &perf_counter, NUM_PERF_COUNTERS,
+		&kbdev->pm.backend.metrics.ipa_control_client);
+	if (err) {
+		dev_err(kbdev->dev,
+			"Failed to register IPA with kbase_ipa_control: err=%d",
+			err);
+		return -1;
+	}
+#else
+	KBASE_DEBUG_ASSERT(kbdev != NULL);
+	kbdev->pm.backend.metrics.kbdev = kbdev;
 	kbdev->pm.backend.metrics.time_period_start = ktime_get();
+
 	kbdev->pm.backend.metrics.gpu_active = false;
 	kbdev->pm.backend.metrics.active_cl_ctx[0] = 0;
 	kbdev->pm.backend.metrics.active_cl_ctx[1] = 0;
@@ -91,16 +126,25 @@ int kbasep_pm_metrics_init(struct kbase_device *kbdev)
 	kbdev->pm.backend.metrics.values.busy_cl[1] = 0;
 	kbdev->pm.backend.metrics.values.busy_gl = 0;
 
+#endif
 	spin_lock_init(&kbdev->pm.backend.metrics.lock);
 
 #ifdef CONFIG_MALI_BIFROST_DVFS
 	hrtimer_init(&kbdev->pm.backend.metrics.timer, CLOCK_MONOTONIC,
 							HRTIMER_MODE_REL);
 	kbdev->pm.backend.metrics.timer.function = dvfs_callback;
-
+	kbdev->pm.backend.metrics.initialized = true;
 	kbase_pm_metrics_start(kbdev);
 #endif /* CONFIG_MALI_BIFROST_DVFS */
 
+#if MALI_USE_CSF
+	/* The sanity check on the GPU_ACTIVE performance counter
+	 * is skipped for Juno platforms that have timing problems.
+	 */
+	kbdev->pm.backend.metrics.skip_gpu_active_sanity_check =
+		of_machine_is_compatible("arm,juno");
+#endif
+
 	return 0;
 }
 KBASE_EXPORT_TEST_API(kbasep_pm_metrics_init);
@@ -117,7 +161,13 @@ void kbasep_pm_metrics_term(struct kbase_device *kbdev)
 	spin_unlock_irqrestore(&kbdev->pm.backend.metrics.lock, flags);
 
 	hrtimer_cancel(&kbdev->pm.backend.metrics.timer);
+	kbdev->pm.backend.metrics.initialized = false;
 #endif /* CONFIG_MALI_BIFROST_DVFS */
+
+#if MALI_USE_CSF
+	kbase_ipa_control_unregister(
+		kbdev, kbdev->pm.backend.metrics.ipa_control_client);
+#endif
 }
 
 KBASE_EXPORT_TEST_API(kbasep_pm_metrics_term);
@@ -125,8 +175,121 @@ KBASE_EXPORT_TEST_API(kbasep_pm_metrics_term);
 /* caller needs to hold kbdev->pm.backend.metrics.lock before calling this
  * function
  */
+#if MALI_USE_CSF
+#if defined(CONFIG_MALI_BIFROST_DEVFREQ) || defined(CONFIG_MALI_BIFROST_DVFS)
+static void kbase_pm_get_dvfs_utilisation_calc(struct kbase_device *kbdev)
+{
+	int err;
+	u64 gpu_active_counter;
+	u64 protected_time;
+	ktime_t now;
+
+	lockdep_assert_held(&kbdev->pm.backend.metrics.lock);
+
+	/* Query IPA_CONTROL for the latest GPU-active and protected-time
+	 * info.
+	 */
+	err = kbase_ipa_control_query(
+		kbdev, kbdev->pm.backend.metrics.ipa_control_client,
+		&gpu_active_counter, 1, &protected_time);
+
+	/* Read the timestamp after reading the GPU_ACTIVE counter value.
+	 * This ensures the time gap between the 2 reads is consistent for
+	 * a meaningful comparison between the increment of GPU_ACTIVE and
+	 * elapsed time. The lock taken inside kbase_ipa_control_query()
+	 * function can cause lot of variation.
+	 */
+	now = ktime_get();
+
+	if (err) {
+		dev_err(kbdev->dev,
+			"Failed to query the increment of GPU_ACTIVE counter: err=%d",
+			err);
+	} else {
+		u64 diff_ns, margin_ns;
+		s64 diff_ns_signed;
+		u32 ns_time;
+		ktime_t diff = ktime_sub(
+			now, kbdev->pm.backend.metrics.time_period_start);
+
+		diff_ns_signed = ktime_to_ns(diff);
+
+		if (diff_ns_signed < 0)
+			return;
+
+		diff_ns = (u64)diff_ns_signed;
+
+		/* Use a margin value that is approximately 1% of the time
+		 * difference.
+		 */
+		margin_ns = diff_ns >> 6;
+
+		/* Calculate time difference in units of 256ns */
+		ns_time = (u32)(diff_ns >> KBASE_PM_TIME_SHIFT);
+
+#ifndef CONFIG_MALI_BIFROST_NO_MALI
+		/* The GPU_ACTIVE counter shouldn't clock-up more time than has
+		 * actually elapsed - but still some margin needs to be given
+		 * when doing the comparison. There could be some drift between
+		 * the CPU and GPU clock.
+		 *
+		 * Can do the check only in a real driver build, as an arbitrary
+		 * value for GPU_ACTIVE can be fed into dummy model in no_mali
+		 * configuration which may not correspond to the real elapsed
+		 * time.
+		 */
+		if (!kbdev->pm.backend.metrics.skip_gpu_active_sanity_check) {
+			if (gpu_active_counter > (diff_ns + margin_ns)) {
+				dev_info(
+					kbdev->dev,
+					"GPU activity takes longer than time interval: %llu ns > %llu ns",
+					(unsigned long long)gpu_active_counter,
+					(unsigned long long)diff_ns);
+			}
+		}
+#else
+		CSTD_UNUSED(margin_ns);
+#endif
+
+		/* Add protected_time to gpu_active_counter so that time in
+		 * protected mode is included in the apparent GPU active time,
+		 * then convert it from units of 1ns to units of 256ns, to
+		 * match what JM GPUs use. The assumption is made here that the
+		 * GPU is 100% busy while in protected mode, so we should add
+		 * this since the GPU can't (and thus won't) update these
+		 * counters while it's actually in protected mode.
+		 *
+		 * Perform the add after dividing each value down, to reduce
+		 * the chances of overflows.
+		 */
+		protected_time >>= KBASE_PM_TIME_SHIFT;
+		gpu_active_counter >>= KBASE_PM_TIME_SHIFT;
+		gpu_active_counter += protected_time;
+
+		/* Ensure the following equations don't go wrong if ns_time is
+		 * slightly larger than gpu_active_counter somehow
+		 */
+		gpu_active_counter = MIN(gpu_active_counter, ns_time);
+
+		kbdev->pm.backend.metrics.values.time_busy +=
+			gpu_active_counter;
+
+		kbdev->pm.backend.metrics.values.time_idle +=
+			ns_time - gpu_active_counter;
+
+		/* Also make time in protected mode available explicitly,
+		 * so users of this data have this info, too.
+		 */
+		kbdev->pm.backend.metrics.values.time_in_protm +=
+			protected_time;
+	}
+
+	kbdev->pm.backend.metrics.time_period_start = now;
+}
+#endif /* defined(CONFIG_MALI_BIFROST_DEVFREQ) || defined(CONFIG_MALI_BIFROST_DVFS) */
+#else
 static void kbase_pm_get_dvfs_utilisation_calc(struct kbase_device *kbdev,
-								ktime_t now)
+					       ktime_t now)
 {
 	ktime_t diff;
 
@@ -151,12 +314,13 @@ static void kbase_pm_get_dvfs_utilisation_calc(struct kbase_device *kbdev,
 		if (kbdev->pm.backend.metrics.active_gl_ctx[2])
 			kbdev->pm.backend.metrics.values.busy_gl += ns_time;
 	} else {
-		kbdev->pm.backend.metrics.values.time_idle += (u32) (ktime_to_ns(diff)
-							>> KBASE_PM_TIME_SHIFT);
+		kbdev->pm.backend.metrics.values.time_idle +=
+			(u32)(ktime_to_ns(diff) >> KBASE_PM_TIME_SHIFT);
 	}
 
 	kbdev->pm.backend.metrics.time_period_start = now;
 }
+#endif  /* MALI_USE_CSF */
 
 #if defined(CONFIG_MALI_BIFROST_DEVFREQ) || defined(CONFIG_MALI_BIFROST_DVFS)
 void kbase_pm_get_dvfs_metrics(struct kbase_device *kbdev,
@@ -167,14 +331,23 @@ void kbase_pm_get_dvfs_metrics(struct kbase_device *kbdev,
 	unsigned long flags;
 
 	spin_lock_irqsave(&kbdev->pm.backend.metrics.lock, flags);
+#if MALI_USE_CSF
+	kbase_pm_get_dvfs_utilisation_calc(kbdev);
+#else
 	kbase_pm_get_dvfs_utilisation_calc(kbdev, ktime_get());
+#endif
 
 	memset(diff, 0, sizeof(*diff));
 	diff->time_busy = cur->time_busy - last->time_busy;
 	diff->time_idle = cur->time_idle - last->time_idle;
+
+#if MALI_USE_CSF
+	diff->time_in_protm = cur->time_in_protm - last->time_in_protm;
+#else
 	diff->busy_cl[0] = cur->busy_cl[0] - last->busy_cl[0];
 	diff->busy_cl[1] = cur->busy_cl[1] - last->busy_cl[1];
 	diff->busy_gl = cur->busy_gl - last->busy_gl;
+#endif
 
 	*last = *cur;
 
@@ -186,26 +359,42 @@ KBASE_EXPORT_TEST_API(kbase_pm_get_dvfs_metrics);
 #ifdef CONFIG_MALI_BIFROST_DVFS
 void kbase_pm_get_dvfs_action(struct kbase_device *kbdev)
 {
-	int utilisation, util_gl_share;
-	int util_cl_share[2];
-	int busy;
+	int utilisation;
 	struct kbasep_pm_metrics *diff;
+#if !MALI_USE_CSF
+	int busy;
+	int util_gl_share;
+	int util_cl_share[2];
+#endif
 
 	KBASE_DEBUG_ASSERT(kbdev != NULL);
 
 	diff = &kbdev->pm.backend.metrics.dvfs_diff;
 
-	kbase_pm_get_dvfs_metrics(kbdev, &kbdev->pm.backend.metrics.dvfs_last, diff);
+	kbase_pm_get_dvfs_metrics(kbdev, &kbdev->pm.backend.metrics.dvfs_last,
+				  diff);
 
 	utilisation = (100 * diff->time_busy) /
 			max(diff->time_busy + diff->time_idle, 1u);
 
+#if !MALI_USE_CSF
 	busy = max(diff->busy_gl + diff->busy_cl[0] + diff->busy_cl[1], 1u);
+
 	util_gl_share = (100 * diff->busy_gl) / busy;
 	util_cl_share[0] = (100 * diff->busy_cl[0]) / busy;
 	util_cl_share[1] = (100 * diff->busy_cl[1]) / busy;
 
-	kbase_platform_dvfs_event(kbdev, utilisation, util_gl_share, util_cl_share);
+	kbase_platform_dvfs_event(kbdev, utilisation, util_gl_share,
+				  util_cl_share);
+#else
+	/* Note that, at present, we don't pass protected-mode time to the
+	 * platform here. It's unlikely to be useful, however, as the platform
+	 * probably just cares whether the GPU is busy or not; time in
+	 * protected mode is already added to busy-time at this point, though,
+	 * so we should be good.
+	 */
+	kbase_platform_dvfs_event(kbdev, utilisation);
+#endif
 }
 
 bool kbase_pm_metrics_is_active(struct kbase_device *kbdev)
@@ -226,11 +415,20 @@ KBASE_EXPORT_TEST_API(kbase_pm_metrics_is_active);
 void kbase_pm_metrics_start(struct kbase_device *kbdev)
 {
 	unsigned long flags;
+	bool update = true;
+
+	if (unlikely(!kbdev->pm.backend.metrics.initialized))
+		return;
 
 	spin_lock_irqsave(&kbdev->pm.backend.metrics.lock, flags);
-	kbdev->pm.backend.metrics.timer_active = true;
+	if (!kbdev->pm.backend.metrics.timer_active)
+		kbdev->pm.backend.metrics.timer_active = true;
+	else
+		update = false;
 	spin_unlock_irqrestore(&kbdev->pm.backend.metrics.lock, flags);
-	hrtimer_start(&kbdev->pm.backend.metrics.timer,
+
+	if (update)
+		hrtimer_start(&kbdev->pm.backend.metrics.timer,
 			HR_TIMER_DELAY_MSEC(kbdev->pm.dvfs_period),
 			HRTIMER_MODE_REL);
 }
@@ -238,11 +436,20 @@ void kbase_pm_metrics_start(struct kbase_device *kbdev)
 void kbase_pm_metrics_stop(struct kbase_device *kbdev)
 {
 	unsigned long flags;
+	bool update = true;
+
+	if (unlikely(!kbdev->pm.backend.metrics.initialized))
+		return;
 
 	spin_lock_irqsave(&kbdev->pm.backend.metrics.lock, flags);
-	kbdev->pm.backend.metrics.timer_active = false;
+	if (kbdev->pm.backend.metrics.timer_active)
+		kbdev->pm.backend.metrics.timer_active = false;
+	else
+		update = false;
 	spin_unlock_irqrestore(&kbdev->pm.backend.metrics.lock, flags);
-	hrtimer_cancel(&kbdev->pm.backend.metrics.timer);
+
+	if (update)
+		hrtimer_cancel(&kbdev->pm.backend.metrics.timer);
 }
 
 
@@ -273,7 +480,8 @@ static void kbase_pm_metrics_active_calc(struct kbase_device *kbdev)
 		struct kbase_jd_atom *katom = kbase_gpu_inspect(kbdev, js, 0);
 
 		/* Head atom may have just completed, so if it isn't running
-		 * then try the next atom */
+		 * then try the next atom
+		 */
 		if (katom && katom->gpu_rb_state != KBASE_ATOM_GPU_RB_SUBMITTED)
 			katom = kbase_gpu_inspect(kbdev, js, 1);
 
@@ -296,7 +504,6 @@ static void kbase_pm_metrics_active_calc(struct kbase_device *kbdev)
 		}
 	}
 }
-#endif /* !MALI_USE_CSF */
 
 /* called when job is submitted to or removed from a GPU slot */
 void kbase_pm_metrics_update(struct kbase_device *kbdev, ktime_t *timestamp)
@@ -313,12 +520,12 @@ void kbase_pm_metrics_update(struct kbase_device *kbdev, ktime_t *timestamp)
 		timestamp = &now;
 	}
 
-	/* Track how long CL and/or GL jobs have been busy for */
+	/* Track how much of time has been spent busy or idle. For JM GPUs,
+	 * this also evaluates how long CL and/or GL jobs have been busy for.
+	 */
 	kbase_pm_get_dvfs_utilisation_calc(kbdev, *timestamp);
 
-#if !MALI_USE_CSF
 	kbase_pm_metrics_active_calc(kbdev);
-#endif /* !MALI_USE_CSF */
-
 	spin_unlock_irqrestore(&kbdev->pm.backend.metrics.lock, flags);
 }
+#endif /* !MALI_USE_CSF */
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_policy.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_policy.c
index 48b24b1c866e..1f56ae867177 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_policy.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_policy.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -28,6 +27,11 @@
 #include <gpu/mali_kbase_gpu_regmap.h>
 #include <mali_kbase_pm.h>
 #include <backend/gpu/mali_kbase_pm_internal.h>
+#include <mali_kbase_reset_gpu.h>
+
+#if MALI_USE_CSF && defined CONFIG_MALI_BIFROST_DEBUG
+#include <csf/mali_kbase_csf_firmware.h>
+#endif
 
 static const struct kbase_pm_policy *const all_policy_list[] = {
 #ifdef CONFIG_MALI_BIFROST_NO_MALI
@@ -45,11 +49,45 @@ static const struct kbase_pm_policy *const all_policy_list[] = {
 #endif /* CONFIG_MALI_BIFROST_NO_MALI */
 };
 
+#if MALI_USE_CSF
+void kbase_pm_policy_init(struct kbase_device *kbdev)
+{
+	unsigned long flags;
+	const struct kbase_pm_policy *default_policy = all_policy_list[0];
+
+#if defined CONFIG_MALI_BIFROST_DEBUG
+	/* Use always_on policy if module param fw_debug=1 is
+	 * passed, to aid firmware debugging.
+	 */
+	if (fw_debug)
+		default_policy = &kbase_pm_always_on_policy_ops;
+#endif
+
+
+	default_policy->init(kbdev);
+
+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+	kbdev->pm.backend.pm_current_policy = default_policy;
+	kbdev->pm.backend.csf_pm_sched_flags =
+				default_policy->pm_sched_flags;
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+}
+#else /* MALI_USE_CSF */
 void kbase_pm_policy_init(struct kbase_device *kbdev)
 {
 	kbdev->pm.backend.pm_current_policy = all_policy_list[0];
+
+#if MALI_USE_CSF && defined CONFIG_MALI_BIFROST_DEBUG
+	/* Use always_on policy if module param fw_debug=1 is
+	 * passed, to aid firmware debugging.
+	 */
+	if (fw_debug)
+		kbdev->pm.backend.pm_current_policy =
+			&kbase_pm_always_on_policy_ops;
+#endif
 	kbdev->pm.backend.pm_current_policy->init(kbdev);
 }
+#endif /* MALI_USE_CSF */
 
 void kbase_pm_policy_term(struct kbase_device *kbdev)
 {
@@ -102,7 +140,8 @@ void kbase_pm_update_active(struct kbase_device *kbdev)
 		}
 	} else {
 		/* It is an error for the power policy to power off the GPU
-		 * when there are contexts active */
+		 * when there are contexts active
+		 */
 		KBASE_DEBUG_ASSERT(pm->active_count == 0);
 
 		pm->backend.poweron_required = false;
@@ -126,18 +165,20 @@ void kbase_pm_update_dynamic_cores_onoff(struct kbase_device *kbdev)
 	lockdep_assert_held(&kbdev->hwaccess_lock);
 	lockdep_assert_held(&kbdev->pm.lock);
 
-#if MALI_USE_CSF
-	/* On CSF GPUs, Host driver isn't supposed to do the power management
-	 * for shader cores. CSF firmware will power up the cores appropriately
-	 * and so from Driver's standpoint 'shaders_desired' flag shall always
-	 * remain 0.
-	 */
-	return;
-#endif
 	if (kbdev->pm.backend.pm_current_policy == NULL)
 		return;
 	if (kbdev->pm.backend.poweroff_wait_in_progress)
 		return;
+
+#if MALI_USE_CSF
+	CSTD_UNUSED(shaders_desired);
+	/* Invoke the MCU state machine to send a request to FW for updating
+	 * the mask of shader cores that can be used for allocation of
+	 * endpoints requested by CSGs.
+	 */
+	if (kbase_pm_is_mcu_desired(kbdev))
+		kbase_pm_update_state(kbdev);
+#else
 	/* In protected transition, don't allow outside shader core request
 	 * affect transition, return directly
 	 */
@@ -149,6 +190,7 @@ void kbase_pm_update_dynamic_cores_onoff(struct kbase_device *kbdev)
 	if (shaders_desired && kbase_pm_is_l2_desired(kbdev)) {
 		kbase_pm_update_state(kbdev);
 	}
+#endif
 }
 
 void kbase_pm_update_cores_state_nolock(struct kbase_device *kbdev)
@@ -164,7 +206,8 @@ void kbase_pm_update_cores_state_nolock(struct kbase_device *kbdev)
 
 	if (kbdev->pm.backend.protected_transition_override)
 		/* We are trying to change in/out of protected mode - force all
-		 * cores off so that the L2 powers down */
+		 * cores off so that the L2 powers down
+		 */
 		shaders_desired = false;
 	else
 		shaders_desired = kbdev->pm.backend.pm_current_policy->shaders_needed(kbdev);
@@ -216,20 +259,106 @@ const struct kbase_pm_policy *kbase_pm_get_policy(struct kbase_device *kbdev)
 
 KBASE_EXPORT_TEST_API(kbase_pm_get_policy);
 
+#if MALI_USE_CSF
+static int policy_change_wait_for_L2_off(struct kbase_device *kbdev)
+{
+#define WAIT_DURATION_MS (3000)
+	long remaining;
+	long timeout = kbase_csf_timeout_in_jiffies(WAIT_DURATION_MS);
+	int err = 0;
+
+	/* Wait for L2 becoming off, by which the MCU is also implicitly off
+	 * since the L2 state machine would only start its power-down
+	 * sequence when the MCU is in off state. The L2 off is required
+	 * as the tiler may need to be power cycled for MCU reconfiguration
+	 * for host control of shader cores.
+	 */
+#if KERNEL_VERSION(4, 13, 1) <= LINUX_VERSION_CODE
+	remaining = wait_event_killable_timeout(
+		kbdev->pm.backend.gpu_in_desired_state_wait,
+		kbdev->pm.backend.l2_state == KBASE_L2_OFF, timeout);
+#else
+	remaining = wait_event_timeout(
+		kbdev->pm.backend.gpu_in_desired_state_wait,
+		kbdev->pm.backend.l2_state == KBASE_L2_OFF, timeout);
+#endif
+
+	if (!remaining) {
+		err = -ETIMEDOUT;
+	} else if (remaining < 0) {
+		dev_info(kbdev->dev,
+			 "Wait for L2_off got interrupted");
+		err = (int)remaining;
+	}
+
+	dev_dbg(kbdev->dev, "%s: err=%d mcu_state=%d, L2_state=%d\n", __func__,
+		err, kbdev->pm.backend.mcu_state, kbdev->pm.backend.l2_state);
+
+	return err;
+}
+#endif
+
 void kbase_pm_set_policy(struct kbase_device *kbdev,
 				const struct kbase_pm_policy *new_policy)
 {
 	const struct kbase_pm_policy *old_policy;
 	unsigned long flags;
+#if MALI_USE_CSF
+	unsigned int new_policy_csf_pm_sched_flags;
+	bool sched_suspend;
+	bool reset_gpu = false;
+#endif
 
 	KBASE_DEBUG_ASSERT(kbdev != NULL);
 	KBASE_DEBUG_ASSERT(new_policy != NULL);
 
 	KBASE_KTRACE_ADD(kbdev, PM_SET_POLICY, NULL, new_policy->id);
 
+#if MALI_USE_CSF
+	/* Serialize calls on kbase_pm_set_policy() */
+	mutex_lock(&kbdev->pm.backend.policy_change_lock);
+
+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+	/* policy_change_clamp_state_to_off, when needed, is set/cleared in
+	 * this function, a very limited temporal scope for covering the
+	 * change transition.
+	 */
+	WARN_ON(kbdev->pm.backend.policy_change_clamp_state_to_off);
+	new_policy_csf_pm_sched_flags = new_policy->pm_sched_flags;
+
+	/* Requiring the scheduler PM suspend operation when changes involving
+	 * the always_on policy, reflected by the CSF_DYNAMIC_PM_CORE_KEEP_ON
+	 * flag bit.
+	 */
+	sched_suspend = kbdev->csf.firmware_inited &&
+			(CSF_DYNAMIC_PM_CORE_KEEP_ON &
+			 (new_policy_csf_pm_sched_flags |
+			  kbdev->pm.backend.csf_pm_sched_flags));
+
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+
+	if (sched_suspend)
+		kbase_csf_scheduler_pm_suspend(kbdev);
+
+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+	/* If the current active policy is always_on, one needs to clamp the
+	 * MCU/L2 for reaching off-state
+	 */
+	if (sched_suspend)
+		kbdev->pm.backend.policy_change_clamp_state_to_off =
+			CSF_DYNAMIC_PM_CORE_KEEP_ON & kbdev->pm.backend.csf_pm_sched_flags;
+
+	kbase_pm_update_state(kbdev);
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+
+	if (sched_suspend)
+		reset_gpu = policy_change_wait_for_L2_off(kbdev);
+#endif
+
 	/* During a policy change we pretend the GPU is active */
 	/* A suspend won't happen here, because we're in a syscall from a
-	 * userspace thread */
+	 * userspace thread
+	 */
 	kbase_pm_context_active(kbdev);
 
 	kbase_pm_lock(kbdev);
@@ -250,19 +379,40 @@ void kbase_pm_set_policy(struct kbase_device *kbdev,
 
 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
 	kbdev->pm.backend.pm_current_policy = new_policy;
+#if MALI_USE_CSF
+	kbdev->pm.backend.csf_pm_sched_flags = new_policy_csf_pm_sched_flags;
+	/* New policy in place, release the clamping on mcu/L2 off state */
+	kbdev->pm.backend.policy_change_clamp_state_to_off = false;
+	kbase_pm_update_state(kbdev);
+#endif
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 
 	/* If any core power state changes were previously attempted, but
 	 * couldn't be made because the policy was changing (current_policy was
-	 * NULL), then re-try them here. */
+	 * NULL), then re-try them here.
+	 */
 	kbase_pm_update_active(kbdev);
 	kbase_pm_update_cores_state(kbdev);
 
 	kbase_pm_unlock(kbdev);
 
 	/* Now the policy change is finished, we release our fake context active
-	 * reference */
+	 * reference
+	 */
 	kbase_pm_context_idle(kbdev);
+
+#if MALI_USE_CSF
+	/* Reverse the suspension done */
+	if (reset_gpu) {
+		dev_warn(kbdev->dev, "Resorting to GPU reset for policy change\n");
+		if (kbase_prepare_to_reset_gpu(kbdev, RESET_FLAGS_NONE))
+			kbase_reset_gpu(kbdev);
+		kbase_reset_gpu_wait(kbdev);
+	} else if (sched_suspend)
+		kbase_csf_scheduler_pm_resume(kbdev);
+
+	mutex_unlock(&kbdev->pm.backend.policy_change_lock);
+#endif
 }
 
 KBASE_EXPORT_TEST_API(kbase_pm_set_policy);
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_policy.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_policy.h
index f103ef0c01e4..a513a26ac92c 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_policy.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_policy.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2010-2015, 2018-2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2015, 2018-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_shader_states.h b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_shader_states.h
index 6cafaa171962..2276713d9987 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_shader_states.h
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_pm_shader_states.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2018-2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -26,6 +25,41 @@
  * including this header file. This header file can be included multiple
  * times in the same compilation unit with different definitions of
  * KBASEP_SHADER_STATE().
+ *
+ * @OFF_CORESTACK_OFF:                The shaders and core stacks are off
+ * @OFF_CORESTACK_PEND_ON:            The shaders are off, core stacks have been
+ *                                    requested to power on and hwcnt is being
+ *                                    disabled
+ * @PEND_ON_CORESTACK_ON:             Core stacks are on, shaders have been
+ *                                    requested to power on. Or after doing
+ *                                    partial shader on/off, checking whether
+ *                                    it's the desired state.
+ * @ON_CORESTACK_ON:                  The shaders and core stacks are on, and
+ *                                    hwcnt already enabled.
+ * @ON_CORESTACK_ON_RECHECK:          The shaders and core stacks are on, hwcnt
+ *                                    disabled, and checks to powering down or
+ *                                    re-enabling hwcnt.
+ * @WAIT_OFF_CORESTACK_ON:            The shaders have been requested to power
+ *                                    off, but they remain on for the duration
+ *                                    of the hysteresis timer
+ * @WAIT_GPU_IDLE:                    The shaders partial poweroff needs to
+ *                                    reach a state where jobs on the GPU are
+ *                                    finished including jobs currently running
+ *                                    and in the GPU queue because of
+ *                                    GPU2017-861
+ * @WAIT_FINISHED_CORESTACK_ON:       The hysteresis timer has expired
+ * @L2_FLUSHING_CORESTACK_ON:         The core stacks are on and the level 2
+ *                                    cache is being flushed.
+ * @READY_OFF_CORESTACK_ON:           The core stacks are on and the shaders are
+ *                                    ready to be powered off.
+ * @PEND_OFF_CORESTACK_ON:            The core stacks are on, and the shaders
+ *                                    have been requested to power off
+ * @OFF_CORESTACK_PEND_OFF:           The shaders are off, and the core stacks
+ *                                    have been requested to power off
+ * @OFF_CORESTACK_OFF_TIMER_PEND_OFF: Shaders and corestacks are off, but the
+ *                                    tick timer cancellation is still pending.
+ * @RESET_WAIT:                       The GPU is resetting, shader and core
+ *                                    stack power states are unknown
  */
 KBASEP_SHADER_STATE(OFF_CORESTACK_OFF)
 KBASEP_SHADER_STATE(OFF_CORESTACK_PEND_ON)
diff --git a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_time.c b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_time.c
index e19f53b2cbe8..7abb8e2c7b06 100644
--- a/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_time.c
+++ b/drivers/gpu/arm/bifrost/backend/gpu/mali_kbase_time.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2014-2016,2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2016, 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
@@ -67,14 +66,47 @@ void kbase_backend_get_gpu_time_norequest(struct kbase_device *kbdev,
 #endif
 }
 
+#if !MALI_USE_CSF
+/**
+ * timedwait_cycle_count_active() - Timed wait till CYCLE_COUNT_ACTIVE is active
+ *
+ * @kbdev: Kbase device
+ *
+ * Return: true if CYCLE_COUNT_ACTIVE is active within the timeout.
+ */
+static bool timedwait_cycle_count_active(struct kbase_device *kbdev)
+{
+#ifdef CONFIG_MALI_BIFROST_NO_MALI
+	return true;
+#else
+	bool success = false;
+	const unsigned int timeout = 100;
+	const unsigned long remaining = jiffies + msecs_to_jiffies(timeout);
+
+	while (time_is_after_jiffies(remaining)) {
+		if ((kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_STATUS)) &
+		     GPU_STATUS_CYCLE_COUNT_ACTIVE)) {
+			success = true;
+			break;
+		}
+	}
+	return success;
+#endif
+}
+#endif
+
 void kbase_backend_get_gpu_time(struct kbase_device *kbdev, u64 *cycle_counter,
 				u64 *system_time, struct timespec64 *ts)
 {
 #if !MALI_USE_CSF
 	kbase_pm_request_gpu_cycle_counter(kbdev);
+	WARN_ONCE(kbdev->pm.backend.l2_state != KBASE_L2_ON,
+		  "L2 not powered up");
+	WARN_ONCE((!timedwait_cycle_count_active(kbdev)),
+		  "Timed out on CYCLE_COUNT_ACTIVE");
 #endif
-	kbase_backend_get_gpu_time_norequest(
-		kbdev, cycle_counter, system_time, ts);
+	kbase_backend_get_gpu_time_norequest(kbdev, cycle_counter, system_time,
+					     ts);
 #if !MALI_USE_CSF
 	kbase_pm_release_gpu_cycle_counter(kbdev);
 #endif
diff --git a/drivers/gpu/arm/bifrost/build.bp b/drivers/gpu/arm/bifrost/build.bp
index b9b86184f3be..b1b52ffe9a1c 100644
--- a/drivers/gpu/arm/bifrost/build.bp
+++ b/drivers/gpu/arm/bifrost/build.bp
@@ -1,15 +1,21 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2017-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2017-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
  *
  */
 
@@ -135,8 +141,11 @@ bob_kernel_module {
     cinstr_secondary_hwc: {
         kbuild_options: ["CONFIG_MALI_BIFROST_PRFCNT_SET_SECONDARY=y"],
     },
-    cinstr_secondary_hwc_via_debug_fs: {
-        kbuild_options: ["CONFIG_MALI_PRFCNT_SET_SECONDARY_VIA_DEBUG_FS=y"],
+    cinstr_tertiary_hwc: {
+        kbuild_options: ["CONFIG_MALI_PRFCNT_SET_TERTIARY=y"],
+    },
+    cinstr_hwc_set_select_via_debug_fs: {
+        kbuild_options: ["CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS=y"],
     },
     mali_2mb_alloc: {
         kbuild_options: ["CONFIG_MALI_2MB_ALLOC=y"],
@@ -158,14 +167,20 @@ bob_kernel_module {
             "jm/*.h",
             "tl/backend/*_jm.c",
             "mmu/backend/*_jm.c",
+            "ipa/backend/*_jm.c",
+            "ipa/backend/*_jm.h",
         ],
     },
     gpu_has_csf: {
+        kbuild_options: ["CONFIG_MALI_CSF_SUPPORT=y"],
         srcs: [
             "context/backend/*_csf.c",
             "csf/*.c",
             "csf/*.h",
             "csf/Kbuild",
+            "csf/ipa_control/*.c",
+            "csf/ipa_control/*.h",
+            "csf/ipa_control/Kbuild",
             "debug/backend/*_csf.c",
             "debug/backend/*_csf.h",
             "device/backend/*_csf.c",
@@ -173,6 +188,8 @@ bob_kernel_module {
             "gpu/backend/*_csf.h",
             "tl/backend/*_csf.c",
             "mmu/backend/*_csf.c",
+            "ipa/backend/*_csf.c",
+            "ipa/backend/*_csf.h",
         ],
     },
     mali_arbiter_support: {
diff --git a/drivers/gpu/arm/bifrost/context/backend/mali_kbase_context_csf.c b/drivers/gpu/arm/bifrost/context/backend/mali_kbase_context_csf.c
index 7c68eb2f860a..c6602476284f 100644
--- a/drivers/gpu/arm/bifrost/context/backend/mali_kbase_context_csf.c
+++ b/drivers/gpu/arm/bifrost/context/backend/mali_kbase_context_csf.c
@@ -6,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -17,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -28,18 +26,17 @@
 #include <context/mali_kbase_context_internal.h>
 #include <gpu/mali_kbase_gpu_regmap.h>
 #include <mali_kbase.h>
-#include <mali_kbase_ctx_sched.h>
 #include <mali_kbase_dma_fence.h>
 #include <mali_kbase_mem_linux.h>
 #include <mali_kbase_mem_pool_group.h>
 #include <mmu/mali_kbase_mmu.h>
 #include <tl/mali_kbase_timeline.h>
-#include <tl/mali_kbase_tracepoints.h>
 
 #ifdef CONFIG_DEBUG_FS
 #include <csf/mali_kbase_csf_csg_debugfs.h>
 #include <csf/mali_kbase_csf_kcpu_debugfs.h>
 #include <csf/mali_kbase_csf_tiler_heap_debugfs.h>
+#include <csf/mali_kbase_csf_cpu_queue_debugfs.h>
 #include <mali_kbase_debug_mem_view.h>
 #include <mali_kbase_mem_pool_debugfs.h>
 
@@ -51,6 +48,7 @@ void kbase_context_debugfs_init(struct kbase_context *const kctx)
 	kbase_csf_queue_group_debugfs_init(kctx);
 	kbase_csf_kcpu_debugfs_init(kctx);
 	kbase_csf_tiler_heap_debugfs_init(kctx);
+	kbase_csf_cpu_queue_debugfs_init(kctx);
 }
 KBASE_EXPORT_SYMBOL(kbase_context_debugfs_init);
 
@@ -73,24 +71,34 @@ void kbase_context_debugfs_term(struct kbase_context *const kctx)
 KBASE_EXPORT_SYMBOL(kbase_context_debugfs_term);
 #endif /* CONFIG_DEBUG_FS */
 
+static void kbase_context_free(struct kbase_context *kctx)
+{
+	kbase_timeline_post_kbase_context_destroy(kctx);
+
+	vfree(kctx);
+}
+
 static const struct kbase_context_init context_init[] = {
-	{kbase_context_common_init, kbase_context_common_term, NULL},
-	{kbase_context_mem_pool_group_init, kbase_context_mem_pool_group_term,
-			"Memory pool goup initialization failed"},
-	{kbase_mem_evictable_init, kbase_mem_evictable_deinit,
-			"Memory evictable initialization failed"},
-	{kbase_context_mmu_init, kbase_context_mmu_term,
-			"MMU initialization failed"},
-	{kbase_context_mem_alloc_page, kbase_context_mem_pool_free,
-			"Memory alloc page failed"},
-	{kbase_region_tracker_init, kbase_region_tracker_term,
-			"Region tracker initialization failed"},
-	{kbase_sticky_resource_init, kbase_context_sticky_resource_term,
-			"Sticky resource initialization failed"},
-	{kbase_jit_init, kbase_jit_term,
-			"JIT initialization failed"},
-	{kbase_csf_ctx_init, kbase_csf_ctx_term,
-			"CSF context initialization failed"},
+	{ NULL, kbase_context_free, NULL },
+	{ kbase_context_common_init, kbase_context_common_term,
+	  "Common context initialization failed" },
+	{ kbase_context_mem_pool_group_init, kbase_context_mem_pool_group_term,
+	  "Memory pool group initialization failed" },
+	{ kbase_mem_evictable_init, kbase_mem_evictable_deinit,
+	  "Memory evictable initialization failed" },
+	{ kbase_context_mmu_init, kbase_context_mmu_term,
+	  "MMU initialization failed" },
+	{ kbase_context_mem_alloc_page, kbase_context_mem_pool_free,
+	  "Memory alloc page failed" },
+	{ kbase_region_tracker_init, kbase_region_tracker_term,
+	  "Region tracker initialization failed" },
+	{ kbase_sticky_resource_init, kbase_context_sticky_resource_term,
+	  "Sticky resource initialization failed" },
+	{ kbase_jit_init, kbase_jit_term, "JIT initialization failed" },
+	{ kbase_csf_ctx_init, kbase_csf_ctx_term,
+	  "CSF context initialization failed" },
+	{ kbase_context_add_to_dev_list, kbase_context_remove_from_dev_list,
+	  "Adding kctx to device failed" },
 };
 
 static void kbase_context_term_partial(
@@ -134,14 +142,23 @@ struct kbase_context *kbase_create_context(struct kbase_device *kbdev,
 #if defined(CONFIG_64BIT)
 	else
 		kbase_ctx_flag_set(kctx, KCTX_FORCE_SAME_VA);
-#endif /* !defined(CONFIG_64BIT) */
+#endif /* defined(CONFIG_64BIT) */
 
 	for (i = 0; i < ARRAY_SIZE(context_init); i++) {
-		int err = context_init[i].init(kctx);
+		int err = 0;
+
+		if (context_init[i].init)
+			err = context_init[i].init(kctx);
 
 		if (err) {
 			dev_err(kbdev->dev, "%s error = %d\n",
 						context_init[i].err_mes, err);
+
+			/* kctx should be freed by kbase_context_free().
+			 * Otherwise it will result in memory leak.
+			 */
+			WARN_ON(i == 0);
+
 			kbase_context_term_partial(kctx, i);
 			return NULL;
 		}
@@ -162,11 +179,18 @@ void kbase_destroy_context(struct kbase_context *kctx)
 	if (WARN_ON(!kbdev))
 		return;
 
-	/* Ensure the core is powered up for the destroy process
-	 * A suspend won't happen here, because we're in a syscall
-	 * from a userspace thread.
+	/* Context termination could happen whilst the system suspend of
+	 * the GPU device is ongoing or has completed. It has been seen on
+	 * Customer side that a hang could occur if context termination is
+	 * not blocked until the resume of GPU device.
 	 */
-	kbase_pm_context_active(kbdev);
+	while (kbase_pm_context_active_handle_suspend(
+		kbdev, KBASE_PM_SUSPEND_HANDLER_DONT_INCREASE)) {
+		dev_info(kbdev->dev,
+			 "Suspend in progress when destroying context");
+		wait_event(kbdev->pm.resume_wait,
+			   !kbase_pm_is_suspending(kbdev));
+	}
 
 	kbase_mem_pool_group_mark_dying(&kctx->mem_pools);
 
diff --git a/drivers/gpu/arm/bifrost/context/backend/mali_kbase_context_jm.c b/drivers/gpu/arm/bifrost/context/backend/mali_kbase_context_jm.c
index 0eb42589fe46..d74e31fe8ca4 100644
--- a/drivers/gpu/arm/bifrost/context/backend/mali_kbase_context_jm.c
+++ b/drivers/gpu/arm/bifrost/context/backend/mali_kbase_context_jm.c
@@ -1,12 +1,12 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -17,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -35,7 +33,6 @@
 #include <mali_kbase_mem_pool_group.h>
 #include <mmu/mali_kbase_mmu.h>
 #include <tl/mali_kbase_timeline.h>
-#include <tl/mali_kbase_tracepoints.h>
 
 #ifdef CONFIG_DEBUG_FS
 #include <mali_kbase_debug_mem_view.h>
@@ -47,14 +44,12 @@ void kbase_context_debugfs_init(struct kbase_context *const kctx)
 	kbase_mem_pool_debugfs_init(kctx->kctx_dentry, kctx);
 	kbase_jit_debugfs_init(kctx);
 	kbasep_jd_debugfs_ctx_init(kctx);
-	kbase_debug_job_fault_context_init(kctx);
 }
 KBASE_EXPORT_SYMBOL(kbase_context_debugfs_init);
 
 void kbase_context_debugfs_term(struct kbase_context *const kctx)
 {
 	debugfs_remove_recursive(kctx->kctx_dentry);
-	kbase_debug_job_fault_context_term(kctx);
 }
 KBASE_EXPORT_SYMBOL(kbase_context_debugfs_term);
 #else
@@ -73,12 +68,7 @@ KBASE_EXPORT_SYMBOL(kbase_context_debugfs_term);
 
 static int kbase_context_kbase_kinstr_jm_init(struct kbase_context *kctx)
 {
-	int ret = kbase_kinstr_jm_init(&kctx->kinstr_jm);
-
-	if (!ret)
-		return ret;
-
-	return 0;
+	return kbase_kinstr_jm_init(&kctx->kinstr_jm);
 }
 
 static void kbase_context_kbase_kinstr_jm_term(struct kbase_context *kctx)
@@ -114,12 +104,27 @@ static int kbase_context_submit_check(struct kbase_context *kctx)
 	return 0;
 }
 
+static void kbase_context_flush_jobs(struct kbase_context *kctx)
+{
+	kbase_jd_zap_context(kctx);
+	flush_workqueue(kctx->jctx.job_done_wq);
+}
+
+static void kbase_context_free(struct kbase_context *kctx)
+{
+	kbase_timeline_post_kbase_context_destroy(kctx);
+
+	vfree(kctx);
+}
+
 static const struct kbase_context_init context_init[] = {
-	{ kbase_context_common_init, kbase_context_common_term, NULL },
+	{ NULL, kbase_context_free, NULL },
+	{ kbase_context_common_init, kbase_context_common_term,
+	  "Common context initialization failed" },
 	{ kbase_dma_fence_init, kbase_dma_fence_term,
 	  "DMA fence initialization failed" },
 	{ kbase_context_mem_pool_group_init, kbase_context_mem_pool_group_term,
-	  "Memory pool goup initialization failed" },
+	  "Memory pool group initialization failed" },
 	{ kbase_mem_evictable_init, kbase_mem_evictable_deinit,
 	  "Memory evictable initialization failed" },
 	{ kbase_context_mmu_init, kbase_context_mmu_term,
@@ -134,13 +139,22 @@ static const struct kbase_context_init context_init[] = {
 	{ kbase_context_kbase_kinstr_jm_init,
 	  kbase_context_kbase_kinstr_jm_term,
 	  "JM instrumentation initialization failed" },
-	{ kbase_context_kbase_timer_setup, NULL, NULL },
+	{ kbase_context_kbase_timer_setup, NULL,
+	  "Timers initialization failed" },
 	{ kbase_event_init, kbase_event_cleanup,
 	  "Event initialization failed" },
 	{ kbasep_js_kctx_init, kbasep_js_kctx_term,
 	  "JS kctx initialization failed" },
 	{ kbase_jd_init, kbase_jd_exit, "JD initialization failed" },
-	{ kbase_context_submit_check, NULL, NULL },
+	{ kbase_context_submit_check, NULL, "Enabling job submission failed" },
+#ifdef CONFIG_DEBUG_FS
+	{ kbase_debug_job_fault_context_init,
+	  kbase_debug_job_fault_context_term,
+	  "Job fault context initialization failed" },
+#endif
+	{ NULL, kbase_context_flush_jobs, NULL },
+	{ kbase_context_add_to_dev_list, kbase_context_remove_from_dev_list,
+	  "Adding kctx to device failed" },
 };
 
 static void kbase_context_term_partial(
@@ -184,14 +198,23 @@ struct kbase_context *kbase_create_context(struct kbase_device *kbdev,
 #if defined(CONFIG_64BIT)
 	else
 		kbase_ctx_flag_set(kctx, KCTX_FORCE_SAME_VA);
-#endif /* !defined(CONFIG_64BIT) */
+#endif /* defined(CONFIG_64BIT) */
 
 	for (i = 0; i < ARRAY_SIZE(context_init); i++) {
-		int err = context_init[i].init(kctx);
+		int err = 0;
+
+		if (context_init[i].init)
+			err = context_init[i].init(kctx);
 
 		if (err) {
 			dev_err(kbdev->dev, "%s error = %d\n",
 						context_init[i].err_mes, err);
+
+			/* kctx should be freed by kbase_context_free().
+			 * Otherwise it will result in memory leak.
+			 */
+			WARN_ON(i == 0);
+
 			kbase_context_term_partial(kctx, i);
 			return NULL;
 		}
@@ -212,17 +235,27 @@ void kbase_destroy_context(struct kbase_context *kctx)
 	if (WARN_ON(!kbdev))
 		return;
 
-	/* Ensure the core is powered up for the destroy process
-	 * A suspend won't happen here, because we're in a syscall
-	 * from a userspace thread.
+	/* Context termination could happen whilst the system suspend of
+	 * the GPU device is ongoing or has completed. It has been seen on
+	 * Customer side that a hang could occur if context termination is
+	 * not blocked until the resume of GPU device.
 	 */
-	kbase_pm_context_active(kbdev);
+#ifdef CONFIG_MALI_ARBITER_SUPPORT
+	atomic_inc(&kbdev->pm.gpu_users_waiting);
+#endif /* CONFIG_MALI_ARBITER_SUPPORT */
+	while (kbase_pm_context_active_handle_suspend(
+		kbdev, KBASE_PM_SUSPEND_HANDLER_DONT_INCREASE)) {
+		dev_dbg(kbdev->dev,
+			 "Suspend in progress when destroying context");
+		wait_event(kbdev->pm.resume_wait,
+			   !kbase_pm_is_suspending(kbdev));
+	}
+#ifdef CONFIG_MALI_ARBITER_SUPPORT
+	atomic_dec(&kbdev->pm.gpu_users_waiting);
+#endif /* CONFIG_MALI_ARBITER_SUPPORT */
 
 	kbase_mem_pool_group_mark_dying(&kctx->mem_pools);
 
-	kbase_jd_zap_context(kctx);
-	flush_workqueue(kctx->jctx.job_done_wq);
-
 	kbase_context_term_partial(kctx, ARRAY_SIZE(context_init));
 
 	kbase_pm_context_idle(kbdev);
diff --git a/drivers/gpu/arm/bifrost/context/mali_kbase_context.c b/drivers/gpu/arm/bifrost/context/mali_kbase_context.c
index 83182f983467..fa4970be05ce 100644
--- a/drivers/gpu/arm/bifrost/context/mali_kbase_context.c
+++ b/drivers/gpu/arm/bifrost/context/mali_kbase_context.c
@@ -6,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -17,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -28,10 +26,8 @@
 #include <mali_kbase.h>
 #include <gpu/mali_kbase_gpu_regmap.h>
 #include <mali_kbase_mem_linux.h>
-#include <mali_kbase_dma_fence.h>
 #include <mali_kbase_ctx_sched.h>
 #include <mali_kbase_mem_pool_group.h>
-#include <tl/mali_kbase_tracepoints.h>
 #include <tl/mali_kbase_timeline.h>
 #include <mmu/mali_kbase_mmu.h>
 #include <context/mali_kbase_context_internal.h>
@@ -170,22 +166,49 @@ int kbase_context_common_init(struct kbase_context *kctx)
 	mutex_init(&kctx->legacy_hwcnt_lock);
 
 	mutex_lock(&kctx->kbdev->kctx_list_lock);
-	list_add(&kctx->kctx_list_link, &kctx->kbdev->kctx_list);
 
 	err = kbase_insert_kctx_to_process(kctx);
 	if (err)
 		dev_err(kctx->kbdev->dev,
 		"(err:%d) failed to insert kctx to kbase_process\n", err);
 
-	KBASE_TLSTREAM_TL_KBASE_NEW_CTX(kctx->kbdev, kctx->id,
-		kctx->kbdev->gpu_props.props.raw_props.gpu_id);
-	KBASE_TLSTREAM_TL_NEW_CTX(kctx->kbdev, kctx, kctx->id,
-			(u32)(kctx->tgid));
 	mutex_unlock(&kctx->kbdev->kctx_list_lock);
 
 	return err;
 }
 
+int kbase_context_add_to_dev_list(struct kbase_context *kctx)
+{
+	if (WARN_ON(!kctx))
+		return -EINVAL;
+
+	if (WARN_ON(!kctx->kbdev))
+		return -EINVAL;
+
+	mutex_lock(&kctx->kbdev->kctx_list_lock);
+	list_add(&kctx->kctx_list_link, &kctx->kbdev->kctx_list);
+	mutex_unlock(&kctx->kbdev->kctx_list_lock);
+
+	kbase_timeline_post_kbase_context_create(kctx);
+
+	return 0;
+}
+
+void kbase_context_remove_from_dev_list(struct kbase_context *kctx)
+{
+	if (WARN_ON(!kctx))
+		return;
+
+	if (WARN_ON(!kctx->kbdev))
+		return;
+
+	kbase_timeline_pre_kbase_context_destroy(kctx);
+
+	mutex_lock(&kctx->kbdev->kctx_list_lock);
+	list_del_init(&kctx->kctx_list_link);
+	mutex_unlock(&kctx->kbdev->kctx_list_lock);
+}
+
 /**
  * kbase_remove_kctx_from_process - remove a terminating context from
  *                                    the process list.
@@ -238,24 +261,9 @@ void kbase_context_common_term(struct kbase_context *kctx)
 
 	mutex_lock(&kctx->kbdev->kctx_list_lock);
 	kbase_remove_kctx_from_process(kctx);
-
-	KBASE_TLSTREAM_TL_KBASE_DEL_CTX(kctx->kbdev, kctx->id);
-
-	KBASE_TLSTREAM_TL_DEL_CTX(kctx->kbdev, kctx);
-	list_del(&kctx->kctx_list_link);
 	mutex_unlock(&kctx->kbdev->kctx_list_lock);
 
 	KBASE_KTRACE_ADD(kctx->kbdev, CORE_CTX_DESTROY, kctx, 0u);
-
-	/* Flush the timeline stream, so the user can see the termination
-	 * tracepoints being fired.
-	 * The "if" statement below is for optimization. It is safe to call
-	 * kbase_timeline_streams_flush when timeline is disabled.
-	 */
-	if (atomic_read(&kctx->kbdev->timeline_flags) != 0)
-		kbase_timeline_streams_flush(kctx->kbdev->timeline);
-
-	vfree(kctx);
 }
 
 int kbase_context_mem_pool_group_init(struct kbase_context *kctx)
@@ -273,11 +281,9 @@ void kbase_context_mem_pool_group_term(struct kbase_context *kctx)
 
 int kbase_context_mmu_init(struct kbase_context *kctx)
 {
-	kbase_mmu_init(kctx->kbdev,
-		&kctx->mmu, kctx,
+	return kbase_mmu_init(
+		kctx->kbdev, &kctx->mmu, kctx,
 		base_context_mmu_group_id_get(kctx->create_flags));
-
-	return 0;
 }
 
 void kbase_context_mmu_term(struct kbase_context *kctx)
diff --git a/drivers/gpu/arm/bifrost/context/mali_kbase_context.h b/drivers/gpu/arm/bifrost/context/mali_kbase_context.h
index e4ed8944bdd2..f18f64b172be 100644
--- a/drivers/gpu/arm/bifrost/context/mali_kbase_context.h
+++ b/drivers/gpu/arm/bifrost/context/mali_kbase_context.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2017, 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,18 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
- *//* SPDX-License-Identifier: GPL-2.0 */
-/*
- *
- * (C) COPYRIGHT 2011-2017, 2019 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
  */
 
 #ifndef _KBASE_CONTEXT_H_
@@ -117,25 +106,7 @@ static inline bool kbase_ctx_flag(struct kbase_context *kctx,
 static inline void kbase_ctx_flag_clear(struct kbase_context *kctx,
 					enum kbase_context_flags flag)
 {
-#if KERNEL_VERSION(4, 3, 0) > LINUX_VERSION_CODE
-	/*
-	 * Earlier kernel versions doesn't have atomic_andnot() or
-	 * atomic_and(). atomic_clear_mask() was only available on some
-	 * architectures and removed on arm in v3.13 on arm and arm64.
-	 *
-	 * Use a compare-exchange loop to clear the flag on pre 4.3 kernels,
-	 * when atomic_andnot() becomes available.
-	 */
-	int old, new;
-
-	do {
-		old = atomic_read(&kctx->flags);
-		new = old & ~flag;
-
-	} while (atomic_cmpxchg(&kctx->flags, old, new) != old);
-#else
 	atomic_andnot(flag, &kctx->flags);
-#endif
 }
 
 /**
diff --git a/drivers/gpu/arm/bifrost/context/mali_kbase_context_internal.h b/drivers/gpu/arm/bifrost/context/mali_kbase_context_internal.h
index 818cdbea960d..fd009b8ebc89 100644
--- a/drivers/gpu/arm/bifrost/context/mali_kbase_context_internal.h
+++ b/drivers/gpu/arm/bifrost/context/mali_kbase_context_internal.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,16 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
- *//* SPDX-License-Identifier: GPL-2.0 */
-/*
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
  */
 
 #include <mali_kbase.h>
@@ -58,3 +49,6 @@ int kbase_context_mem_alloc_page(struct kbase_context *kctx);
 void kbase_context_mem_pool_free(struct kbase_context *kctx);
 
 void kbase_context_sticky_resource_term(struct kbase_context *kctx);
+
+int kbase_context_add_to_dev_list(struct kbase_context *kctx);
+void kbase_context_remove_from_dev_list(struct kbase_context *kctx);
diff --git a/drivers/gpu/arm/bifrost/csf/Kbuild b/drivers/gpu/arm/bifrost/csf/Kbuild
index bb61811e6c85..d65b75f32525 100644
--- a/drivers/gpu/arm/bifrost/csf/Kbuild
+++ b/drivers/gpu/arm/bifrost/csf/Kbuild
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
 # (C) COPYRIGHT 2018-2020 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,11 +16,9 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
-mali_kbase-y += \
+bifrost_kbase-y += \
 	csf/mali_kbase_csf_firmware_cfg.o \
 	csf/mali_kbase_csf_trace_buffer.o \
 	csf/mali_kbase_csf.o \
@@ -33,8 +32,11 @@ mali_kbase-y += \
 	csf/mali_kbase_csf_csg_debugfs.o \
 	csf/mali_kbase_csf_kcpu_debugfs.o \
 	csf/mali_kbase_csf_protected_memory.o \
-	csf/mali_kbase_csf_tiler_heap_debugfs.o
+	csf/mali_kbase_csf_tiler_heap_debugfs.o \
+	csf/mali_kbase_csf_cpu_queue_debugfs.o
+
+bifrost_kbase-$(CONFIG_MALI_REAL_HW) += csf/mali_kbase_csf_firmware.o
 
-mali_kbase-$(CONFIG_MALI_REAL_HW) += csf/mali_kbase_csf_firmware.o
+bifrost_kbase-$(CONFIG_MALI_BIFROST_NO_MALI) += csf/mali_kbase_csf_firmware_no_mali.o
 
-mali_kbase-$(CONFIG_MALI_BIFROST_NO_MALI) += csf/mali_kbase_csf_firmware_no_mali.o
+include $(src)/csf/ipa_control/Kbuild
diff --git a/drivers/gpu/arm/bifrost/csf/ipa_control/Kbuild b/drivers/gpu/arm/bifrost/csf/ipa_control/Kbuild
new file mode 100644
index 000000000000..222e0c803572
--- /dev/null
+++ b/drivers/gpu/arm/bifrost/csf/ipa_control/Kbuild
@@ -0,0 +1,22 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+#
+# This program is free software and is provided to you under the terms of the
+# GNU General Public License version 2 as published by the Free Software
+# Foundation, and any use by you of this program is subject to the terms
+# of such GNU license.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can access it online at
+# http://www.gnu.org/licenses/gpl-2.0.html.
+#
+#
+
+bifrost_kbase-y += \
+	csf/ipa_control/mali_kbase_csf_ipa_control.o
\ No newline at end of file
diff --git a/drivers/gpu/arm/bifrost/csf/ipa_control/mali_kbase_csf_ipa_control.c b/drivers/gpu/arm/bifrost/csf/ipa_control/mali_kbase_csf_ipa_control.c
new file mode 100644
index 000000000000..7b0845c0d78c
--- /dev/null
+++ b/drivers/gpu/arm/bifrost/csf/ipa_control/mali_kbase_csf_ipa_control.c
@@ -0,0 +1,925 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ *
+ * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+#include <mali_kbase.h>
+#include "mali_kbase_clk_rate_trace_mgr.h"
+#include "mali_kbase_csf_ipa_control.h"
+
+/*
+ * Status flags from the STATUS register of the IPA Control interface.
+ */
+#define STATUS_COMMAND_ACTIVE ((u32)1 << 0)
+#define STATUS_TIMER_ACTIVE ((u32)1 << 1)
+#define STATUS_AUTO_ACTIVE ((u32)1 << 2)
+#define STATUS_PROTECTED_MODE ((u32)1 << 8)
+#define STATUS_RESET ((u32)1 << 9)
+#define STATUS_TIMER_ENABLED ((u32)1 << 31)
+
+/*
+ * Commands for the COMMAND register of the IPA Control interface.
+ */
+#define COMMAND_NOP ((u32)0)
+#define COMMAND_APPLY ((u32)1)
+#define COMMAND_CLEAR ((u32)2)
+#define COMMAND_SAMPLE ((u32)3)
+#define COMMAND_PROTECTED_ACK ((u32)4)
+#define COMMAND_RESET_ACK ((u32)5)
+
+/**
+ * Default value for the TIMER register of the IPA Control interface,
+ * expressed in milliseconds.
+ *
+ * The chosen value is a trade off between two requirements: the IPA Control
+ * interface should sample counters with a resolution in the order of
+ * milliseconds, while keeping GPU overhead as limited as possible.
+ */
+#define TIMER_DEFAULT_VALUE_MS ((u32)10) /* 10 milliseconds */
+
+/**
+ * Number of timer events per second.
+ */
+#define TIMER_EVENTS_PER_SECOND ((u32)1000 / TIMER_DEFAULT_VALUE_MS)
+
+/**
+ * Maximum number of loops polling the GPU before we assume the GPU has hung.
+ */
+#define IPA_INACTIVE_MAX_LOOPS ((unsigned int)8000000)
+
+/**
+ * Number of bits used to configure a performance counter in SELECT registers.
+ */
+#define IPA_CONTROL_SELECT_BITS_PER_CNT ((u64)8)
+
+/**
+ * Maximum value of a performance counter.
+ */
+#define MAX_PRFCNT_VALUE (((u64)1 << 48) - 1)
+
+/**
+ * struct kbase_ipa_control_listener_data - Data for the GPU clock frequency
+ *                                          listener
+ *
+ * @listener: GPU clock frequency listener.
+ * @kbdev:    Pointer to kbase device.
+ */
+struct kbase_ipa_control_listener_data {
+	struct kbase_clk_rate_listener listener;
+	struct kbase_device *kbdev;
+};
+
+static u32 timer_value(u32 gpu_rate)
+{
+	return gpu_rate / TIMER_EVENTS_PER_SECOND;
+}
+
+static int wait_status(struct kbase_device *kbdev, u32 flags)
+{
+	unsigned int max_loops = IPA_INACTIVE_MAX_LOOPS;
+	u32 status = kbase_reg_read(kbdev, IPA_CONTROL_REG(STATUS));
+
+	/*
+	 * Wait for the STATUS register to indicate that flags have been
+	 * cleared, in case a transition is pending.
+	 */
+	while (--max_loops && (status & flags))
+		status = kbase_reg_read(kbdev, IPA_CONTROL_REG(STATUS));
+	if (max_loops == 0) {
+		dev_err(kbdev->dev, "IPA_CONTROL STATUS register stuck");
+		return -EBUSY;
+	}
+
+	return 0;
+}
+
+static int apply_select_config(struct kbase_device *kbdev, u64 *select)
+{
+	int ret;
+
+	u32 select_cshw_lo = (u32)(select[KBASE_IPA_CORE_TYPE_CSHW] & U32_MAX);
+	u32 select_cshw_hi =
+		(u32)((select[KBASE_IPA_CORE_TYPE_CSHW] >> 32) & U32_MAX);
+	u32 select_memsys_lo =
+		(u32)(select[KBASE_IPA_CORE_TYPE_MEMSYS] & U32_MAX);
+	u32 select_memsys_hi =
+		(u32)((select[KBASE_IPA_CORE_TYPE_MEMSYS] >> 32) & U32_MAX);
+	u32 select_tiler_lo =
+		(u32)(select[KBASE_IPA_CORE_TYPE_TILER] & U32_MAX);
+	u32 select_tiler_hi =
+		(u32)((select[KBASE_IPA_CORE_TYPE_TILER] >> 32) & U32_MAX);
+	u32 select_shader_lo =
+		(u32)(select[KBASE_IPA_CORE_TYPE_SHADER] & U32_MAX);
+	u32 select_shader_hi =
+		(u32)((select[KBASE_IPA_CORE_TYPE_SHADER] >> 32) & U32_MAX);
+
+	kbase_reg_write(kbdev, IPA_CONTROL_REG(SELECT_CSHW_LO), select_cshw_lo);
+	kbase_reg_write(kbdev, IPA_CONTROL_REG(SELECT_CSHW_HI), select_cshw_hi);
+	kbase_reg_write(kbdev, IPA_CONTROL_REG(SELECT_MEMSYS_LO),
+			select_memsys_lo);
+	kbase_reg_write(kbdev, IPA_CONTROL_REG(SELECT_MEMSYS_HI),
+			select_memsys_hi);
+	kbase_reg_write(kbdev, IPA_CONTROL_REG(SELECT_TILER_LO),
+			select_tiler_lo);
+	kbase_reg_write(kbdev, IPA_CONTROL_REG(SELECT_TILER_HI),
+			select_tiler_hi);
+	kbase_reg_write(kbdev, IPA_CONTROL_REG(SELECT_SHADER_LO),
+			select_shader_lo);
+	kbase_reg_write(kbdev, IPA_CONTROL_REG(SELECT_SHADER_HI),
+			select_shader_hi);
+
+	ret = wait_status(kbdev, STATUS_COMMAND_ACTIVE);
+
+	if (!ret)
+		kbase_reg_write(kbdev, IPA_CONTROL_REG(COMMAND), COMMAND_APPLY);
+
+	return ret;
+}
+
+static u64 read_value_cnt(struct kbase_device *kbdev, u8 type, int select_idx)
+{
+	u32 value_lo, value_hi;
+
+	switch (type) {
+	case KBASE_IPA_CORE_TYPE_CSHW:
+		value_lo = kbase_reg_read(
+			kbdev, IPA_CONTROL_REG(VALUE_CSHW_REG_LO(select_idx)));
+		value_hi = kbase_reg_read(
+			kbdev, IPA_CONTROL_REG(VALUE_CSHW_REG_HI(select_idx)));
+		break;
+	case KBASE_IPA_CORE_TYPE_MEMSYS:
+		value_lo = kbase_reg_read(
+			kbdev,
+			IPA_CONTROL_REG(VALUE_MEMSYS_REG_LO(select_idx)));
+		value_hi = kbase_reg_read(
+			kbdev,
+			IPA_CONTROL_REG(VALUE_MEMSYS_REG_HI(select_idx)));
+		break;
+	case KBASE_IPA_CORE_TYPE_TILER:
+		value_lo = kbase_reg_read(
+			kbdev, IPA_CONTROL_REG(VALUE_TILER_REG_LO(select_idx)));
+		value_hi = kbase_reg_read(
+			kbdev, IPA_CONTROL_REG(VALUE_TILER_REG_HI(select_idx)));
+		break;
+	case KBASE_IPA_CORE_TYPE_SHADER:
+		value_lo = kbase_reg_read(
+			kbdev,
+			IPA_CONTROL_REG(VALUE_SHADER_REG_LO(select_idx)));
+		value_hi = kbase_reg_read(
+			kbdev,
+			IPA_CONTROL_REG(VALUE_SHADER_REG_HI(select_idx)));
+		break;
+	default:
+		WARN(1, "Unknown core type: %u\n", type);
+		value_lo = value_hi = 0;
+		break;
+	}
+
+	return (((u64)value_hi << 32) | value_lo);
+}
+
+static void build_select_config(struct kbase_ipa_control *ipa_ctrl,
+				u64 *select_config)
+{
+	size_t i;
+
+	for (i = 0; i < KBASE_IPA_CORE_TYPE_NUM; i++) {
+		size_t j;
+
+		select_config[i] = 0ULL;
+
+		for (j = 0; j < KBASE_IPA_CONTROL_NUM_BLOCK_COUNTERS; j++) {
+			struct kbase_ipa_control_prfcnt_config *prfcnt_config =
+				&ipa_ctrl->blocks[i].select[j];
+
+			select_config[i] |=
+				((u64)prfcnt_config->idx
+				 << (IPA_CONTROL_SELECT_BITS_PER_CNT * j));
+		}
+	}
+}
+
+static inline void calc_prfcnt_delta(struct kbase_device *kbdev,
+				     struct kbase_ipa_control_prfcnt *prfcnt,
+				     bool gpu_ready)
+{
+	u64 delta_value, raw_value;
+
+	if (gpu_ready)
+		raw_value = read_value_cnt(kbdev, (u8)prfcnt->type,
+					   prfcnt->select_idx);
+	else
+		raw_value = prfcnt->latest_raw_value;
+
+	if (raw_value < prfcnt->latest_raw_value) {
+		delta_value = (MAX_PRFCNT_VALUE - prfcnt->latest_raw_value) +
+			      raw_value;
+	} else {
+		delta_value = raw_value - prfcnt->latest_raw_value;
+	}
+
+	delta_value *= prfcnt->scaling_factor;
+
+	if (!WARN_ON_ONCE(kbdev->csf.ipa_control.cur_gpu_rate == 0))
+		if (prfcnt->gpu_norm)
+			delta_value /= kbdev->csf.ipa_control.cur_gpu_rate;
+
+	prfcnt->latest_raw_value = raw_value;
+
+	/* Accumulate the difference */
+	prfcnt->accumulated_diff += delta_value;
+}
+
+/**
+ * kbase_ipa_control_rate_change_notify - GPU frequency change callback
+ *
+ * @listener:     Clock frequency change listener.
+ * @clk_index:    Index of the clock for which the change has occurred.
+ * @clk_rate_hz:  Clock frequency(Hz).
+ *
+ * This callback notifies kbase_ipa_control about GPU frequency changes.
+ * Only top-level clock changes are meaningful. GPU frequency updates
+ * affect all performance counters which require GPU normalization
+ * in every session.
+ */
+static void
+kbase_ipa_control_rate_change_notify(struct kbase_clk_rate_listener *listener,
+				     u32 clk_index, u32 clk_rate_hz)
+{
+	if ((clk_index == KBASE_CLOCK_DOMAIN_TOP) && (clk_rate_hz != 0)) {
+		size_t i;
+		unsigned long flags;
+		struct kbase_ipa_control_listener_data *listener_data =
+			container_of(listener,
+				     struct kbase_ipa_control_listener_data,
+				     listener);
+		struct kbase_device *kbdev = listener_data->kbdev;
+		struct kbase_ipa_control *ipa_ctrl = &kbdev->csf.ipa_control;
+
+		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+
+		if (!kbdev->pm.backend.gpu_ready) {
+			dev_err(kbdev->dev,
+				"%s: GPU frequency cannot change while GPU is off",
+				__func__);
+			spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+			return;
+		}
+
+		/* Interrupts are already disabled and interrupt state is also saved */
+		spin_lock(&ipa_ctrl->lock);
+
+		for (i = 0; i < ipa_ctrl->num_active_sessions; i++) {
+			size_t j;
+			struct kbase_ipa_control_session *session = &ipa_ctrl->sessions[i];
+
+			for (j = 0; j < session->num_prfcnts; j++) {
+				struct kbase_ipa_control_prfcnt *prfcnt =
+					&session->prfcnts[j];
+
+				if (prfcnt->gpu_norm)
+					calc_prfcnt_delta(kbdev, prfcnt, true);
+			 }
+		}
+
+		ipa_ctrl->cur_gpu_rate = clk_rate_hz;
+
+		/* Update the timer for automatic sampling if active sessions
+		 * are present. Counters have already been manually sampled.
+		 */
+		if (ipa_ctrl->num_active_sessions > 0) {
+			kbase_reg_write(kbdev, IPA_CONTROL_REG(TIMER),
+					timer_value(ipa_ctrl->cur_gpu_rate));
+		}
+
+		spin_unlock(&ipa_ctrl->lock);
+
+		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+	}
+}
+
+void kbase_ipa_control_init(struct kbase_device *kbdev)
+{
+	struct kbase_ipa_control *ipa_ctrl = &kbdev->csf.ipa_control;
+	struct kbase_clk_rate_trace_manager *clk_rtm = &kbdev->pm.clk_rtm;
+	struct kbase_ipa_control_listener_data *listener_data;
+	size_t i, j;
+
+	for (i = 0; i < KBASE_IPA_CORE_TYPE_NUM; i++) {
+		for (j = 0; j < KBASE_IPA_CONTROL_NUM_BLOCK_COUNTERS; j++) {
+			ipa_ctrl->blocks[i].select[j].idx = 0;
+			ipa_ctrl->blocks[i].select[j].refcount = 0;
+		}
+		ipa_ctrl->blocks[i].num_available_counters =
+			KBASE_IPA_CONTROL_NUM_BLOCK_COUNTERS;
+	}
+
+	spin_lock_init(&ipa_ctrl->lock);
+	ipa_ctrl->num_active_sessions = 0;
+	for (i = 0; i < KBASE_IPA_CONTROL_MAX_SESSIONS; i++) {
+		ipa_ctrl->sessions[i].active = false;
+	}
+
+	listener_data = kmalloc(sizeof(struct kbase_ipa_control_listener_data),
+				GFP_KERNEL);
+	if (listener_data) {
+		listener_data->listener.notify =
+			kbase_ipa_control_rate_change_notify;
+		listener_data->kbdev = kbdev;
+		ipa_ctrl->rtm_listener_data = listener_data;
+	}
+
+	spin_lock(&clk_rtm->lock);
+	if (clk_rtm->clks[KBASE_CLOCK_DOMAIN_TOP])
+		ipa_ctrl->cur_gpu_rate =
+			clk_rtm->clks[KBASE_CLOCK_DOMAIN_TOP]->clock_val;
+	if (listener_data)
+		kbase_clk_rate_trace_manager_subscribe_no_lock(
+			clk_rtm, &listener_data->listener);
+	spin_unlock(&clk_rtm->lock);
+}
+KBASE_EXPORT_TEST_API(kbase_ipa_control_init);
+
+void kbase_ipa_control_term(struct kbase_device *kbdev)
+{
+	unsigned long flags;
+	struct kbase_clk_rate_trace_manager *clk_rtm = &kbdev->pm.clk_rtm;
+	struct kbase_ipa_control *ipa_ctrl = &kbdev->csf.ipa_control;
+	struct kbase_ipa_control_listener_data *listener_data =
+		ipa_ctrl->rtm_listener_data;
+
+	WARN_ON(ipa_ctrl->num_active_sessions);
+
+	if (listener_data)
+		kbase_clk_rate_trace_manager_unsubscribe(clk_rtm, &listener_data->listener);
+	kfree(ipa_ctrl->rtm_listener_data);
+
+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+	if (kbdev->pm.backend.gpu_powered)
+		kbase_reg_write(kbdev, IPA_CONTROL_REG(TIMER), 0);
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+}
+KBASE_EXPORT_TEST_API(kbase_ipa_control_term);
+
+int kbase_ipa_control_register(
+	struct kbase_device *kbdev,
+	const struct kbase_ipa_control_perf_counter *perf_counters,
+	size_t num_counters, void **client)
+{
+	int ret = 0;
+	size_t i, session_idx, req_counters[KBASE_IPA_CORE_TYPE_NUM];
+	bool already_configured[KBASE_IPA_CONTROL_MAX_COUNTERS];
+	bool new_config = false;
+	struct kbase_ipa_control *ipa_ctrl;
+	struct kbase_ipa_control_session *session = NULL;
+	unsigned long flags;
+
+	if (WARN_ON(kbdev == NULL) || WARN_ON(perf_counters == NULL) ||
+	    WARN_ON(client == NULL) ||
+	    WARN_ON(num_counters > KBASE_IPA_CONTROL_MAX_COUNTERS)) {
+		dev_err(kbdev->dev, "%s: wrong input arguments", __func__);
+		return -EINVAL;
+	}
+
+	kbase_pm_context_active(kbdev);
+
+	ipa_ctrl = &kbdev->csf.ipa_control;
+	spin_lock_irqsave(&ipa_ctrl->lock, flags);
+
+	if (ipa_ctrl->num_active_sessions == KBASE_IPA_CONTROL_MAX_SESSIONS) {
+		dev_err(kbdev->dev, "%s: too many sessions", __func__);
+		ret = -EBUSY;
+		goto exit;
+	}
+
+	for (i = 0; i < KBASE_IPA_CORE_TYPE_NUM; i++)
+		req_counters[i] = 0;
+
+	/*
+	 * Count how many counters would need to be configured in order to
+	 * satisfy the request. Requested counters which happen to be already
+	 * configured can be skipped.
+	 */
+	for (i = 0; i < num_counters; i++) {
+		size_t j;
+		enum kbase_ipa_core_type type = perf_counters[i].type;
+		u8 idx = perf_counters[i].idx;
+
+		if ((type >= KBASE_IPA_CORE_TYPE_NUM) ||
+		    (idx >= KBASE_IPA_CONTROL_CNT_MAX_IDX)) {
+			dev_err(kbdev->dev,
+				"%s: invalid requested type %u and/or index %u",
+				__func__, type, idx);
+			ret = -EINVAL;
+			goto exit;
+		}
+
+		for (j = 0; j < KBASE_IPA_CONTROL_NUM_BLOCK_COUNTERS; j++) {
+			struct kbase_ipa_control_prfcnt_config *prfcnt_config =
+				&ipa_ctrl->blocks[type].select[j];
+
+			if (prfcnt_config->refcount > 0) {
+				if (prfcnt_config->idx == idx) {
+					already_configured[i] = true;
+					break;
+				}
+			}
+		}
+
+		if (j == KBASE_IPA_CONTROL_NUM_BLOCK_COUNTERS) {
+			already_configured[i] = false;
+			req_counters[type]++;
+			new_config = true;
+		}
+	}
+
+	for (i = 0; i < KBASE_IPA_CORE_TYPE_NUM; i++)
+		if (req_counters[i] >
+		    ipa_ctrl->blocks[i].num_available_counters) {
+			dev_err(kbdev->dev,
+				"%s: more counters (%zu) than available (%zu) have been requested for type %zu",
+				__func__, req_counters[i],
+				ipa_ctrl->blocks[i].num_available_counters, i);
+			ret = -EINVAL;
+			goto exit;
+		}
+
+	/*
+	 * The request has been validated.
+	 * Firstly, find an available session and then set up the initial state
+	 * of the session and update the configuration of performance counters
+	 * in the internal state of kbase_ipa_control.
+	 */
+	for (session_idx = 0; session_idx < KBASE_IPA_CONTROL_MAX_SESSIONS;
+	     session_idx++) {
+		session = &ipa_ctrl->sessions[session_idx];
+		if (!session->active)
+			break;
+	}
+
+	if (!session) {
+		dev_err(kbdev->dev, "%s: wrong or corrupt session state",
+			__func__);
+		ret = -EBUSY;
+		goto exit;
+	}
+
+	for (i = 0; i < num_counters; i++) {
+		struct kbase_ipa_control_prfcnt_config *prfcnt_config;
+		size_t j;
+		u8 type = perf_counters[i].type;
+		u8 idx = perf_counters[i].idx;
+
+		for (j = 0; j < KBASE_IPA_CONTROL_NUM_BLOCK_COUNTERS; j++) {
+			prfcnt_config = &ipa_ctrl->blocks[type].select[j];
+
+			if (already_configured[i]) {
+				if ((prfcnt_config->refcount > 0) &&
+				    (prfcnt_config->idx == idx)) {
+					break;
+				}
+			} else {
+				if (prfcnt_config->refcount == 0)
+					break;
+			}
+		}
+
+		if (WARN_ON((prfcnt_config->refcount > 0 &&
+			     prfcnt_config->idx != idx) ||
+			    (j == KBASE_IPA_CONTROL_NUM_BLOCK_COUNTERS))) {
+			dev_err(kbdev->dev,
+				"%s: invalid internal state: counter already configured or no counter available to configure",
+				__func__);
+			ret = -EBUSY;
+			goto exit;
+		}
+
+		if (prfcnt_config->refcount == 0) {
+			prfcnt_config->idx = idx;
+			ipa_ctrl->blocks[type].num_available_counters--;
+		}
+
+		session->prfcnts[i].accumulated_diff = 0;
+		session->prfcnts[i].type = type;
+		session->prfcnts[i].select_idx = j;
+		session->prfcnts[i].scaling_factor =
+			perf_counters[i].scaling_factor;
+		session->prfcnts[i].gpu_norm = perf_counters[i].gpu_norm;
+
+		/* Reports to this client for GPU time spent in protected mode
+		 * should begin from the point of registration.
+		 */
+		session->last_query_time = ktime_get_ns();
+
+		/* Initially, no time has been spent in protected mode */
+		session->protm_time = 0;
+
+		prfcnt_config->refcount++;
+	}
+
+	/*
+	 * Apply new configuration, if necessary.
+	 * As a temporary solution, make sure that the GPU is on
+	 * before applying the new configuration.
+	 */
+	if (new_config) {
+		u64 select_config[KBASE_IPA_CORE_TYPE_NUM];
+
+		build_select_config(ipa_ctrl, select_config);
+		ret = apply_select_config(kbdev, select_config);
+		if (ret)
+			dev_err(kbdev->dev,
+				"%s: failed to apply SELECT configuration",
+				__func__);
+	}
+
+	if (!ret) {
+		/* Accumulator registers don't contain any sample if the timer
+		 * has not been enabled first. Take a sample manually before
+		 * enabling the timer.
+		 */
+		if (ipa_ctrl->num_active_sessions == 0) {
+			kbase_reg_write(kbdev, IPA_CONTROL_REG(COMMAND),
+					COMMAND_SAMPLE);
+			ret = wait_status(kbdev, STATUS_COMMAND_ACTIVE);
+			if (!ret) {
+				kbase_reg_write(
+					kbdev, IPA_CONTROL_REG(TIMER),
+					timer_value(ipa_ctrl->cur_gpu_rate));
+			} else {
+				dev_err(kbdev->dev,
+					"%s: failed to sample new counters",
+					__func__);
+			}
+		}
+	}
+
+	if (!ret) {
+		session->num_prfcnts = num_counters;
+		session->active = true;
+		ipa_ctrl->num_active_sessions++;
+		*client = session;
+
+		/*
+		 * Read current raw value to initialize the session.
+		 * This is necessary to put the first query in condition
+		 * to generate a correct value by calculating the difference
+		 * from the beginning of the session.
+		 */
+		for (i = 0; i < session->num_prfcnts; i++) {
+			struct kbase_ipa_control_prfcnt *prfcnt =
+				&session->prfcnts[i];
+			u64 raw_value = read_value_cnt(kbdev, (u8)prfcnt->type,
+						       prfcnt->select_idx);
+			prfcnt->latest_raw_value = raw_value;
+		}
+	}
+
+exit:
+	spin_unlock_irqrestore(&ipa_ctrl->lock, flags);
+	kbase_pm_context_idle(kbdev);
+	return ret;
+}
+KBASE_EXPORT_TEST_API(kbase_ipa_control_register);
+
+int kbase_ipa_control_unregister(struct kbase_device *kbdev, const void *client)
+{
+	struct kbase_ipa_control *ipa_ctrl;
+	struct kbase_ipa_control_session *session;
+	int ret = 0;
+	size_t i;
+	unsigned long flags;
+	bool new_config = false, valid_session = false;
+
+	if (WARN_ON(kbdev == NULL) || WARN_ON(client == NULL)) {
+		dev_err(kbdev->dev, "%s: wrong input arguments", __func__);
+		return -EINVAL;
+	}
+
+	kbase_pm_context_active(kbdev);
+
+	ipa_ctrl = &kbdev->csf.ipa_control;
+	session = (struct kbase_ipa_control_session *)client;
+
+	spin_lock_irqsave(&ipa_ctrl->lock, flags);
+
+	for (i = 0; i < KBASE_IPA_CONTROL_MAX_SESSIONS; i++) {
+		if (session == &ipa_ctrl->sessions[i]) {
+			valid_session = true;
+			break;
+		}
+	}
+
+	if (!valid_session) {
+		dev_err(kbdev->dev, "%s: invalid session handle", __func__);
+		ret = -EINVAL;
+		goto exit;
+	}
+
+	if (ipa_ctrl->num_active_sessions == 0) {
+		dev_err(kbdev->dev, "%s: no active sessions found", __func__);
+		ret = -EINVAL;
+		goto exit;
+	}
+
+	if (!session->active) {
+		dev_err(kbdev->dev, "%s: session is already inactive",
+			__func__);
+		ret = -EINVAL;
+		goto exit;
+	}
+
+	for (i = 0; i < session->num_prfcnts; i++) {
+		struct kbase_ipa_control_prfcnt_config *prfcnt_config;
+		u8 type = session->prfcnts[i].type;
+		u8 idx = session->prfcnts[i].select_idx;
+
+		prfcnt_config = &ipa_ctrl->blocks[type].select[idx];
+
+		if (!WARN_ON(prfcnt_config->refcount == 0)) {
+			prfcnt_config->refcount--;
+			if (prfcnt_config->refcount == 0) {
+				new_config = true;
+				ipa_ctrl->blocks[type].num_available_counters++;
+			}
+		}
+	}
+
+	if (new_config) {
+		u64 select_config[KBASE_IPA_CORE_TYPE_NUM];
+
+		build_select_config(ipa_ctrl, select_config);
+		ret = apply_select_config(kbdev, select_config);
+		if (ret)
+			dev_err(kbdev->dev,
+				"%s: failed to apply SELECT configuration",
+				__func__);
+	}
+
+	session->num_prfcnts = 0;
+	session->active = false;
+	ipa_ctrl->num_active_sessions--;
+
+exit:
+	spin_unlock_irqrestore(&ipa_ctrl->lock, flags);
+	kbase_pm_context_idle(kbdev);
+	return ret;
+}
+KBASE_EXPORT_TEST_API(kbase_ipa_control_unregister);
+
+int kbase_ipa_control_query(struct kbase_device *kbdev, const void *client,
+			    u64 *values, size_t num_values, u64 *protected_time)
+{
+	struct kbase_ipa_control *ipa_ctrl;
+	struct kbase_ipa_control_session *session;
+	size_t i;
+	unsigned long flags;
+	bool gpu_ready;
+
+	if (WARN_ON(kbdev == NULL) || WARN_ON(client == NULL) ||
+	    WARN_ON(values == NULL)) {
+		dev_err(kbdev->dev, "%s: wrong input arguments", __func__);
+		return -EINVAL;
+	}
+
+	ipa_ctrl = &kbdev->csf.ipa_control;
+	session = (struct kbase_ipa_control_session *)client;
+
+	if (WARN_ON(num_values < session->num_prfcnts)) {
+		dev_err(kbdev->dev,
+			"%s: not enough space (%zu) to return all counter values (%zu)",
+			__func__, num_values, session->num_prfcnts);
+		return -EINVAL;
+	}
+
+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+	gpu_ready = kbdev->pm.backend.gpu_ready;
+
+	for (i = 0; i < session->num_prfcnts; i++) {
+		struct kbase_ipa_control_prfcnt *prfcnt = &session->prfcnts[i];
+
+		calc_prfcnt_delta(kbdev, prfcnt, gpu_ready);
+		/* Return all the accumulated difference */
+		values[i] = prfcnt->accumulated_diff;
+		prfcnt->accumulated_diff = 0;
+	}
+
+	if (protected_time) {
+		u64 time_now = ktime_get_ns();
+
+		/* This is the amount of protected-mode time spent prior to
+		 * the current protm period.
+		 */
+		*protected_time = session->protm_time;
+
+		if (kbdev->protected_mode) {
+			*protected_time +=
+				time_now - MAX(session->last_query_time,
+					       ipa_ctrl->protm_start);
+		}
+		session->last_query_time = time_now;
+		session->protm_time = 0;
+	}
+
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+
+	for (i = session->num_prfcnts; i < num_values; i++)
+		values[i] = 0;
+
+	return 0;
+}
+KBASE_EXPORT_TEST_API(kbase_ipa_control_query);
+
+void kbase_ipa_control_handle_gpu_power_off(struct kbase_device *kbdev)
+{
+	struct kbase_ipa_control *ipa_ctrl = &kbdev->csf.ipa_control;
+	size_t session_idx;
+	int ret;
+
+	lockdep_assert_held(&kbdev->hwaccess_lock);
+
+	/* GPU should still be ready for use when this function gets called */
+	WARN_ON(!kbdev->pm.backend.gpu_ready);
+
+	/* Interrupts are already disabled and interrupt state is also saved */
+	spin_lock(&ipa_ctrl->lock);
+
+	/* First disable the automatic sampling through TIMER  */
+	kbase_reg_write(kbdev, IPA_CONTROL_REG(TIMER), 0);
+	ret = wait_status(kbdev, STATUS_TIMER_ENABLED);
+	if (ret) {
+		dev_err(kbdev->dev,
+			"Wait for disabling of IPA control timer failed: %d",
+			ret);
+	}
+
+	/* Now issue the manual SAMPLE command */
+	kbase_reg_write(kbdev, IPA_CONTROL_REG(COMMAND), COMMAND_SAMPLE);
+	ret = wait_status(kbdev, STATUS_COMMAND_ACTIVE);
+	if (ret) {
+		dev_err(kbdev->dev,
+			"Wait for the completion of manual sample failed: %d",
+			ret);
+	}
+
+	for (session_idx = 0; session_idx < ipa_ctrl->num_active_sessions;
+	     session_idx++) {
+		struct kbase_ipa_control_session *session =
+			&ipa_ctrl->sessions[session_idx];
+		size_t i;
+
+		for (i = 0; i < session->num_prfcnts; i++) {
+			struct kbase_ipa_control_prfcnt *prfcnt =
+				&session->prfcnts[i];
+
+			calc_prfcnt_delta(kbdev, prfcnt, true);
+		}
+	}
+
+	spin_unlock(&ipa_ctrl->lock);
+}
+
+void kbase_ipa_control_handle_gpu_power_on(struct kbase_device *kbdev)
+{
+	struct kbase_ipa_control *ipa_ctrl = &kbdev->csf.ipa_control;
+	int ret;
+
+	lockdep_assert_held(&kbdev->hwaccess_lock);
+
+	/* GPU should have become ready for use when this function gets called */
+	WARN_ON(!kbdev->pm.backend.gpu_ready);
+
+	/* Interrupts are already disabled and interrupt state is also saved */
+	spin_lock(&ipa_ctrl->lock);
+
+	/* Re-issue the APPLY command, this is actually needed only for CSHW */
+	kbase_reg_write(kbdev, IPA_CONTROL_REG(COMMAND), COMMAND_APPLY);
+	ret = wait_status(kbdev, STATUS_COMMAND_ACTIVE);
+	if (ret) {
+		dev_err(kbdev->dev,
+			"Wait for the completion of apply command failed: %d",
+			ret);
+	}
+
+	/* Re-enable the timer for periodic sampling */
+	kbase_reg_write(kbdev, IPA_CONTROL_REG(TIMER),
+			timer_value(ipa_ctrl->cur_gpu_rate));
+
+	spin_unlock(&ipa_ctrl->lock);
+}
+
+void kbase_ipa_control_handle_gpu_reset_pre(struct kbase_device *kbdev)
+{
+	/* A soft reset is treated as a power down */
+	kbase_ipa_control_handle_gpu_power_off(kbdev);
+}
+KBASE_EXPORT_TEST_API(kbase_ipa_control_handle_gpu_reset_pre);
+
+void kbase_ipa_control_handle_gpu_reset_post(struct kbase_device *kbdev)
+{
+	struct kbase_ipa_control *ipa_ctrl = &kbdev->csf.ipa_control;
+	int ret;
+	u32 status;
+
+	lockdep_assert_held(&kbdev->hwaccess_lock);
+
+	/* GPU should have become ready for use when this function gets called */
+	WARN_ON(!kbdev->pm.backend.gpu_ready);
+
+	/* Interrupts are already disabled and interrupt state is also saved */
+	spin_lock(&ipa_ctrl->lock);
+
+	/* Check the status reset bit is set before acknowledging it */
+	status = kbase_reg_read(kbdev, IPA_CONTROL_REG(STATUS));
+	if (status & STATUS_RESET) {
+		/* Acknowledge the reset command */
+		kbase_reg_write(kbdev, IPA_CONTROL_REG(COMMAND), COMMAND_RESET_ACK);
+		ret = wait_status(kbdev, STATUS_RESET);
+		if (ret) {
+			dev_err(kbdev->dev,
+				"Wait for the reset ack command failed: %d",
+				ret);
+		}
+	}
+
+	spin_unlock(&ipa_ctrl->lock);
+
+	kbase_ipa_control_handle_gpu_power_on(kbdev);
+}
+KBASE_EXPORT_TEST_API(kbase_ipa_control_handle_gpu_reset_post);
+
+#if MALI_UNIT_TEST
+void kbase_ipa_control_rate_change_notify_test(struct kbase_device *kbdev,
+					       u32 clk_index, u32 clk_rate_hz)
+{
+	struct kbase_ipa_control *ipa_ctrl = &kbdev->csf.ipa_control;
+	struct kbase_ipa_control_listener_data *listener_data =
+		ipa_ctrl->rtm_listener_data;
+
+	kbase_ipa_control_rate_change_notify(&listener_data->listener,
+					     clk_index, clk_rate_hz);
+}
+KBASE_EXPORT_TEST_API(kbase_ipa_control_rate_change_notify_test);
+#endif
+
+void kbase_ipa_control_protm_entered(struct kbase_device *kbdev)
+{
+	struct kbase_ipa_control *ipa_ctrl = &kbdev->csf.ipa_control;
+
+	lockdep_assert_held(&kbdev->hwaccess_lock);
+	ipa_ctrl->protm_start = ktime_get_ns();
+}
+
+void kbase_ipa_control_protm_exited(struct kbase_device *kbdev)
+{
+	struct kbase_ipa_control *ipa_ctrl = &kbdev->csf.ipa_control;
+	size_t i;
+	u64 time_now = ktime_get_ns();
+	u32 status;
+
+	lockdep_assert_held(&kbdev->hwaccess_lock);
+
+	for (i = 0; i < ipa_ctrl->num_active_sessions; i++) {
+		struct kbase_ipa_control_session *session =
+			&ipa_ctrl->sessions[i];
+		u64 protm_time = time_now - MAX(session->last_query_time,
+						ipa_ctrl->protm_start);
+
+		session->protm_time += protm_time;
+	}
+
+	/* Acknowledge the protected_mode bit in the IPA_CONTROL STATUS
+	 * register
+	 */
+	status = kbase_reg_read(kbdev, IPA_CONTROL_REG(STATUS));
+	if (status & STATUS_PROTECTED_MODE) {
+		int ret;
+
+		/* Acknowledge the protm command */
+		kbase_reg_write(kbdev, IPA_CONTROL_REG(COMMAND),
+				COMMAND_PROTECTED_ACK);
+		ret = wait_status(kbdev, STATUS_PROTECTED_MODE);
+		if (ret) {
+			dev_err(kbdev->dev,
+				"Wait for the protm ack command failed: %d",
+				ret);
+		}
+	}
+}
+
diff --git a/drivers/gpu/arm/bifrost/csf/ipa_control/mali_kbase_csf_ipa_control.h b/drivers/gpu/arm/bifrost/csf/ipa_control/mali_kbase_csf_ipa_control.h
new file mode 100644
index 000000000000..a828e01f9d4d
--- /dev/null
+++ b/drivers/gpu/arm/bifrost/csf/ipa_control/mali_kbase_csf_ipa_control.h
@@ -0,0 +1,244 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ *
+ * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+#ifndef _KBASE_CSF_IPA_CONTROL_H_
+#define _KBASE_CSF_IPA_CONTROL_H_
+
+#include <mali_kbase.h>
+
+/**
+ * Maximum index accepted to configure an IPA Control performance counter.
+ */
+#define KBASE_IPA_CONTROL_CNT_MAX_IDX ((u8)64 * 3)
+
+/**
+ * struct kbase_ipa_control_perf_counter - Performance counter description
+ *
+ * @scaling_factor: Scaling factor by which the counter's value shall be
+ *                  multiplied. A scaling factor of 1 corresponds to units
+ *                  of 1 second if values are normalised by GPU frequency.
+ * @gpu_norm:       Indicating whether counter values shall be normalized by
+ *                  GPU frequency. If true, returned values represent
+ *                  an interval of time expressed in seconds (when the scaling
+ *                  factor is set to 1).
+ * @type:           Type of counter block for performance counter.
+ * @idx:            Index of the performance counter inside the block.
+ *                  It may be dependent on GPU architecture.
+ *                  It cannot be greater than KBASE_IPA_CONTROL_CNT_MAX_IDX.
+ *
+ * This structure is used by clients of the IPA Control component to describe
+ * a performance counter that they intend to read. The counter is identified
+ * by block and index. In addition to that, the client also specifies how
+ * values shall be represented. Raw values are a number of GPU cycles;
+ * if normalized, they are divided by GPU frequency and become an interval
+ * of time expressed in seconds, since the GPU frequency is given in Hz.
+ * The client may specify a scaling factor to multiply counter values before
+ * they are divided by frequency, in case the unit of time of 1 second is
+ * too low in resolution. For instance: a scaling factor of 1000 implies
+ * that the returned value is a time expressed in milliseconds; a scaling
+ * factor of 1000 * 1000 implies that the returned value is a time expressed
+ * in microseconds.
+ */
+struct kbase_ipa_control_perf_counter {
+	u64 scaling_factor;
+	bool gpu_norm;
+	enum kbase_ipa_core_type type;
+	u8 idx;
+};
+
+/**
+ * kbase_ipa_control_init - Initialize the IPA Control component
+ *
+ * @kbdev: Pointer to Kbase device.
+ */
+void kbase_ipa_control_init(struct kbase_device *kbdev);
+
+/**
+ * kbase_ipa_control_term - Terminate the IPA Control component
+ *
+ * @kbdev: Pointer to Kbase device.
+ */
+void kbase_ipa_control_term(struct kbase_device *kbdev);
+
+/**
+ * kbase_ipa_control_register - Register a client to the IPA Control component
+ *
+ * @kbdev:         Pointer to Kbase device.
+ * @perf_counters: Array of performance counters the client intends to read.
+ *                 For each counter the client specifies block, index,
+ *                 scaling factor and whether it must be normalized by GPU
+ *                 frequency.
+ * @num_counters:  Number of performance counters. It cannot exceed the total
+ *                 number of counters that exist on the IPA Control interface.
+ * @client:        Handle to an opaque structure set by IPA Control if
+ *                 the registration is successful. This handle identifies
+ *                 a client's session and shall be provided in its future
+ *                 queries.
+ *
+ * A client needs to subscribe to the IPA Control component by declaring which
+ * performance counters it intends to read, and specifying a scaling factor
+ * and whether normalization is requested for each performance counter.
+ * The function shall configure the IPA Control interface accordingly and start
+ * a session for the client that made the request. A unique handle is returned
+ * if registration is successful in order to identify the client's session
+ * and be used for future queries.
+ *
+ * Return: 0 on success, negative -errno on error
+ */
+int kbase_ipa_control_register(
+	struct kbase_device *kbdev,
+	const struct kbase_ipa_control_perf_counter *perf_counters,
+	size_t num_counters, void **client);
+
+/**
+ * kbase_ipa_control_unregister - Unregister a client from IPA Control
+ *
+ * @kbdev:  Pointer to kbase device.
+ * @client: Handle to an opaque structure that identifies the client session
+ *          to terminate, as returned by kbase_ipa_control_register.
+ *
+ * Return: 0 on success, negative -errno on error
+ */
+int kbase_ipa_control_unregister(struct kbase_device *kbdev,
+				 const void *client);
+
+/**
+ * kbase_ipa_control_query - Query performance counters
+ *
+ * @kbdev:          Pointer to kbase device.
+ * @client:         Handle to an opaque structure that identifies the client
+ *                  session, as returned by kbase_ipa_control_register.
+ * @values:         Array of values queried from performance counters, whose
+ *                  length depends on the number of counters requested at
+ *                  the time of registration. Values are scaled and normalized
+ *                  and represent the difference since the last query.
+ * @num_values:     Number of entries in the array of values that has been
+ *                  passed by the caller. It must be at least equal to the
+ *                  number of performance counters the client registered itself
+ *                  to read.
+ * @protected_time: Time spent in protected mode since last query,
+ *                  expressed in nanoseconds. This pointer may be NULL if the
+ *                  client doesn't want to know about this.
+ *
+ * A client that has already opened a session by registering itself to read
+ * some performance counters may use this function to query the values of
+ * those counters. The values returned are normalized by GPU frequency if
+ * requested and then multiplied by the scaling factor provided at the time
+ * of registration. Values always represent a difference since the last query.
+ *
+ * Performance counters are not updated while the GPU operates in protected
+ * mode. For this reason, returned values may be unreliable if the GPU has
+ * been in protected mode since the last query. The function returns success
+ * in that case, but it also gives a measure of how much time has been spent
+ * in protected mode.
+ *
+ * Return: 0 on success, negative -errno on error
+ */
+int kbase_ipa_control_query(struct kbase_device *kbdev, const void *client,
+			    u64 *values, size_t num_values,
+			    u64 *protected_time);
+
+/**
+ * kbase_ipa_control_handle_gpu_power_on - Handle the GPU power on event
+ *
+ * @kbdev:          Pointer to kbase device.
+ *
+ * This function is called after GPU has been powered and is ready for use.
+ * After the GPU power on, IPA Control component needs to ensure that the
+ * counters start incrementing again.
+ */
+void kbase_ipa_control_handle_gpu_power_on(struct kbase_device *kbdev);
+
+/**
+ * kbase_ipa_control_handle_gpu_power_off - Handle the GPU power off event
+ *
+ * @kbdev:          Pointer to kbase device.
+ *
+ * This function is called just before the GPU is powered off when it is still
+ * ready for use.
+ * IPA Control component needs to be aware of the GPU power off so that it can
+ * handle the query from Clients appropriately and return meaningful values
+ * to them.
+ */
+void kbase_ipa_control_handle_gpu_power_off(struct kbase_device *kbdev);
+
+/**
+ * kbase_ipa_control_handle_gpu_reset_pre - Handle the pre GPU reset event
+ *
+ * @kbdev:          Pointer to kbase device.
+ *
+ * This function is called when the GPU is about to be reset.
+ */
+void kbase_ipa_control_handle_gpu_reset_pre(struct kbase_device *kbdev);
+
+/**
+ * kbase_ipa_control_handle_gpu_reset_post - Handle the post GPU reset event
+ *
+ * @kbdev:          Pointer to kbase device.
+ *
+ * This function is called after the GPU has been reset.
+ */
+void kbase_ipa_control_handle_gpu_reset_post(struct kbase_device *kbdev);
+
+#if MALI_UNIT_TEST
+/**
+ * kbase_ipa_control_rate_change_notify_test - Notify GPU rate change
+ *                                             (only for testing)
+ *
+ * @kbdev:       Pointer to kbase device.
+ * @clk_index:   Index of the clock for which the change has occurred.
+ * @clk_rate_hz: Clock frequency(Hz).
+ *
+ * Notify the IPA Control component about a GPU rate change.
+ */
+void kbase_ipa_control_rate_change_notify_test(struct kbase_device *kbdev,
+					       u32 clk_index, u32 clk_rate_hz);
+#endif /* MALI_UNIT_TEST */
+
+/**
+ * kbase_ipa_control_protm_entered - Tell IPA_CONTROL that protected mode
+ * has been entered.
+ *
+ * @kbdev:		Pointer to kbase device.
+ *
+ * This function provides a means through which IPA_CONTROL can be informed
+ * that the GPU has entered protected mode. Since the GPU cannot access
+ * performance counters while in this mode, this information is useful as
+ * it implies (a) the values of these registers cannot change, so theres no
+ * point trying to read them, and (b) IPA_CONTROL has a means through which
+ * to record the duration of time the GPU is in protected mode, which can
+ * then be forwarded on to clients, who may wish, for example, to assume
+ * that the GPU was busy 100% of the time while in this mode.
+ */
+void kbase_ipa_control_protm_entered(struct kbase_device *kbdev);
+
+/**
+ * kbase_ipa_control_protm_exited - Tell IPA_CONTROL that protected mode
+ * has been exited.
+ *
+ * @kbdev:		Pointer to kbase device
+ *
+ * This function provides a means through which IPA_CONTROL can be informed
+ * that the GPU has exited from protected mode.
+ */
+void kbase_ipa_control_protm_exited(struct kbase_device *kbdev);
+
+#endif /* _KBASE_CSF_IPA_CONTROL_H_ */
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf.c
index 83d7513e78d9..00f89088c7ba 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,25 +17,25 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
 #include <gpu/mali_kbase_gpu_fault.h>
-#include <mali_kbase_ctx_sched.h>
 #include <mali_kbase_reset_gpu.h>
 #include "mali_kbase_csf.h"
 #include "backend/gpu/mali_kbase_pm_internal.h"
 #include <linux/export.h>
+#include <linux/priority_control_manager.h>
 #include <linux/shmem_fs.h>
-#include "mali_gpu_csf_registers.h"
+#include <uapi/gpu/arm/bifrost/csf/mali_gpu_csf_registers.h>
 #include "mali_kbase_csf_tiler_heap.h"
 #include <mmu/mali_kbase_mmu.h>
-#include <mali_kbase_ctx_sched.h>
+#include "mali_kbase_csf_timeout.h"
+#include <csf/ipa_control/mali_kbase_csf_ipa_control.h>
 
 #define CS_REQ_EXCEPTION_MASK (CS_REQ_FAULT_MASK | CS_REQ_FATAL_MASK)
 #define CS_ACK_EXCEPTION_MASK (CS_ACK_FAULT_MASK | CS_ACK_FATAL_MASK)
+#define POWER_DOWN_LATEST_FLUSH_VALUE ((u32)1)
 
 /**
  * struct kbase_csf_event - CSF event callback.
@@ -55,6 +56,19 @@ struct kbase_csf_event {
 	void *param;
 };
 
+const u8 kbasep_csf_queue_group_priority_to_relative[BASE_QUEUE_GROUP_PRIORITY_COUNT] = {
+	KBASE_QUEUE_GROUP_PRIORITY_HIGH,
+	KBASE_QUEUE_GROUP_PRIORITY_MEDIUM,
+	KBASE_QUEUE_GROUP_PRIORITY_LOW,
+	KBASE_QUEUE_GROUP_PRIORITY_REALTIME
+};
+const u8 kbasep_csf_relative_to_queue_group_priority[KBASE_QUEUE_GROUP_PRIORITY_COUNT] = {
+	BASE_QUEUE_GROUP_PRIORITY_REALTIME,
+	BASE_QUEUE_GROUP_PRIORITY_HIGH,
+	BASE_QUEUE_GROUP_PRIORITY_MEDIUM,
+	BASE_QUEUE_GROUP_PRIORITY_LOW
+};
+
 static void put_user_pages_mmap_handle(struct kbase_context *kctx,
 			struct kbase_queue *queue)
 {
@@ -263,6 +277,7 @@ static int kernel_map_user_io_pages(struct kbase_context *kctx,
 	return ret;
 }
 
+static void term_queue_group(struct kbase_queue_group *group);
 static void get_queue(struct kbase_queue *queue);
 static void release_queue(struct kbase_queue *queue);
 
@@ -438,7 +453,7 @@ static void release_queue(struct kbase_queue *queue)
 }
 
 static void oom_event_worker(struct work_struct *data);
-static void fault_event_worker(struct work_struct *data);
+static void fatal_event_worker(struct work_struct *data);
 
 int kbase_csf_queue_register(struct kbase_context *kctx,
 			     struct kbase_ioctl_cs_queue_register *reg)
@@ -503,10 +518,13 @@ int kbase_csf_queue_register(struct kbase_context *kctx,
 	queue->sync_ptr = 0;
 	queue->sync_value = 0;
 
+	queue->sb_status = 0;
+	queue->blocked_reason = CS_STATUS_BLOCKED_REASON_REASON_UNBLOCKED;
+
 	INIT_LIST_HEAD(&queue->link);
 	INIT_LIST_HEAD(&queue->error.link);
 	INIT_WORK(&queue->oom_event_work, oom_event_worker);
-	INIT_WORK(&queue->fault_event_work, fault_event_worker);
+	INIT_WORK(&queue->fatal_event_work, fatal_event_worker);
 	list_add(&queue->link, &kctx->csf.queue_list);
 
 	region->flags |= KBASE_REG_NO_USER_FREE;
@@ -525,13 +543,26 @@ static void unbind_queue(struct kbase_context *kctx,
 void kbase_csf_queue_terminate(struct kbase_context *kctx,
 			      struct kbase_ioctl_cs_queue_terminate *term)
 {
+	struct kbase_device *kbdev = kctx->kbdev;
 	struct kbase_queue *queue;
+	int err;
+	bool reset_prevented = false;
 
-	mutex_lock(&kctx->csf.lock);
+	err = kbase_reset_gpu_prevent_and_wait(kbdev);
+	if (err)
+		dev_warn(
+			kbdev->dev,
+			"Unsuccessful GPU reset detected when terminating queue (buffer_addr=0x%.16llx), attempting to terminate regardless",
+			term->buffer_gpu_addr);
+	else
+		reset_prevented = true;
 
+	mutex_lock(&kctx->csf.lock);
 	queue = find_queue(kctx, term->buffer_gpu_addr);
 
 	if (queue) {
+		unsigned long flags;
+
 		/* As the GPU queue has been terminated by the
 		 * user space, undo the actions that were performed when the
 		 * queue was registered i.e. remove the queue from the per
@@ -555,15 +586,19 @@ void kbase_csf_queue_terminate(struct kbase_context *kctx,
 		}
 		kbase_gpu_vm_unlock(kctx);
 
-		/* Remove any pending command queue fatal from
-		 * the per-context list.
-		 */
+		spin_lock_irqsave(&kctx->csf.event_lock, flags);
+		dev_dbg(kctx->kbdev->dev,
+			"Remove any pending command queue fatal from context %pK\n",
+			(void *)kctx);
 		list_del_init(&queue->error.link);
+		spin_unlock_irqrestore(&kctx->csf.event_lock, flags);
 
 		release_queue(queue);
 	}
 
 	mutex_unlock(&kctx->csf.lock);
+	if (reset_prevented)
+		kbase_reset_gpu_allow(kbdev);
 }
 
 int kbase_csf_queue_bind(struct kbase_context *kctx, union kbase_ioctl_cs_queue_bind *bind)
@@ -678,41 +713,49 @@ void kbase_csf_ring_cs_user_doorbell(struct kbase_device *kbdev,
 }
 
 void kbase_csf_ring_cs_kernel_doorbell(struct kbase_device *kbdev,
-			struct kbase_queue *queue)
+				       int csi_index, int csg_nr,
+				       bool ring_csg_doorbell)
 {
-	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
-	struct kbase_queue_group *group = get_bound_queue_group(queue);
 	struct kbase_csf_cmd_stream_group_info *ginfo;
 	u32 value;
-	int slot;
 
-	if (WARN_ON(!group))
+	if (WARN_ON(csg_nr < 0) ||
+	    WARN_ON(csg_nr >= kbdev->csf.global_iface.group_num))
 		return;
 
-	slot = kbase_csf_scheduler_group_get_slot(group);
+	ginfo = &kbdev->csf.global_iface.groups[csg_nr];
 
-	if (WARN_ON(slot < 0))
+	if (WARN_ON(csi_index < 0) ||
+	    WARN_ON(csi_index >= ginfo->stream_num))
 		return;
 
-	ginfo = &global_iface->groups[slot];
-
 	value = kbase_csf_firmware_csg_output(ginfo, CSG_DB_ACK);
-	value ^= (1 << queue->csi_index);
+	value ^= (1 << csi_index);
 	kbase_csf_firmware_csg_input_mask(ginfo, CSG_DB_REQ, value,
-					  1 << queue->csi_index);
+					  1 << csi_index);
 
-	kbase_csf_ring_csg_doorbell(kbdev, slot);
+	if (likely(ring_csg_doorbell))
+		kbase_csf_ring_csg_doorbell(kbdev, csg_nr);
 }
 
 int kbase_csf_queue_kick(struct kbase_context *kctx,
 			 struct kbase_ioctl_cs_queue_kick *kick)
 {
+	struct kbase_device *kbdev = kctx->kbdev;
 	struct kbase_queue_group *group;
 	struct kbase_queue *queue;
 	int err = 0;
 
-	mutex_lock(&kctx->csf.lock);
+	err = kbase_reset_gpu_prevent_and_wait(kbdev);
+	if (err) {
+		dev_warn(
+			kbdev->dev,
+			"Unsuccessful GPU reset detected when kicking queue (buffer_addr=0x%.16llx)",
+			kick->buffer_gpu_addr);
+		return err;
+	}
 
+	mutex_lock(&kctx->csf.lock);
 	queue = find_queue(kctx, kick->buffer_gpu_addr);
 	if (!queue)
 		err = -EINVAL;
@@ -727,8 +770,9 @@ int kbase_csf_queue_kick(struct kbase_context *kctx,
 
 	if (!err)
 		err = kbase_csf_scheduler_queue_start(queue);
-
 	mutex_unlock(&kctx->csf.lock);
+	kbase_reset_gpu_allow(kbdev);
+
 	return err;
 }
 
@@ -758,8 +802,8 @@ static void unbind_stopped_queue(struct kbase_context *kctx,
  * @kctx:	Address of the kbase context within which the queue was created.
  * @queue:	Pointer to the queue to be unlinked.
  *
- * This function will also send the stop request to firmware for the command
- * stream if the group to which the GPU command queue was bound is scheduled.
+ * This function will also send the stop request to firmware for the CS
+ * if the group to which the GPU command queue was bound is scheduled.
  *
  * This function would be called when :-
  * - queue is being unbound. This would happen when the IO mapping
@@ -778,6 +822,7 @@ static void unbind_stopped_queue(struct kbase_context *kctx,
 
 static void unbind_queue(struct kbase_context *kctx, struct kbase_queue *queue)
 {
+	kbase_reset_gpu_assert_failed_or_prevented(kctx->kbdev);
 	lockdep_assert_held(&kctx->csf.lock);
 
 	if (queue->bind_state != KBASE_CSF_QUEUE_UNBOUND) {
@@ -794,7 +839,38 @@ void kbase_csf_queue_unbind(struct kbase_queue *queue)
 
 	lockdep_assert_held(&kctx->csf.lock);
 
-	unbind_queue(kctx, queue);
+	/* As the process itself is exiting, the termination of queue group can
+	 * be done which would be much faster than stopping of individual
+	 * queues. This would ensure a faster exit for the process especially
+	 * in the case where CSI gets stuck.
+	 * The CSI STOP request will wait for the in flight work to drain
+	 * whereas CSG TERM request would result in an immediate abort or
+	 * cancellation of the pending work.
+	 */
+	if (current->flags & PF_EXITING) {
+		struct kbase_queue_group *group = get_bound_queue_group(queue);
+
+		if (group)
+			term_queue_group(group);
+
+		WARN_ON(queue->bind_state != KBASE_CSF_QUEUE_UNBOUND);
+	} else {
+		unbind_queue(kctx, queue);
+	}
+
+	/* Free the resources, if allocated for this queue. */
+	if (queue->reg)
+		kbase_csf_free_command_stream_user_pages(kctx, queue);
+}
+
+void kbase_csf_queue_unbind_stopped(struct kbase_queue *queue)
+{
+	struct kbase_context *kctx = queue->kctx;
+
+	lockdep_assert_held(&kctx->csf.lock);
+
+	WARN_ON(queue->bind_state == KBASE_CSF_QUEUE_BOUND);
+	unbind_stopped_queue(kctx, queue);
 
 	/* Free the resources, if allocated for this queue. */
 	if (queue->reg)
@@ -827,15 +903,14 @@ static int find_free_group_handle(struct kbase_context *const kctx)
 }
 
 /**
- * iface_has_enough_streams() - Check that at least one command stream
- *				group supports a given number of streams
+ * iface_has_enough_streams() - Check that at least one CSG supports
+ *                              a given number of CS
  *
- * @kbdev:	Instance of a GPU platform device that implements a command
- *		stream front-end interface.
- * @cs_min:	Minimum number of command streams required.
+ * @kbdev:  Instance of a GPU platform device that implements a CSF interface.
+ * @cs_min: Minimum number of CSs required.
  *
- * Return: true if at least one command stream group supports the given number
- *         of command streams (or more); otherwise false.
+ * Return: true if at least one CSG supports the given number
+ *         of CSs (or more); otherwise false.
  */
 static bool iface_has_enough_streams(struct kbase_device *const kbdev,
 	u32 const cs_min)
@@ -942,9 +1017,8 @@ static int create_normal_suspend_buffer(struct kbase_context *const kctx,
  * create_protected_suspend_buffer() - Create protected-mode suspend buffer
  *					per queue group
  *
- * @kbdev:	Instance of a GPU platform device that implements a command
- *		stream front-end interface.
- * @s_buf:	Pointer to suspend buffer that is attached to queue group
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
+ * @s_buf: Pointer to suspend buffer that is attached to queue group
  *
  * Return: 0 if suspend buffer is successfully allocated and reflected to GPU
  *         MMU page table. Otherwise -ENOMEM.
@@ -1057,6 +1131,26 @@ static int create_suspend_buffers(struct kbase_context *const kctx,
 	return err;
 }
 
+/**
+ * generate_group_uid() - Makes an ID unique to all kernel base devices
+ *                        and contexts, for a queue group and CSG.
+ *
+ * Return:      A unique ID in the form of an unsigned 32-bit integer
+ */
+static u32 generate_group_uid(void)
+{
+	/* use first KBase device to store max UID */
+	struct kbase_device *kbdev = kbase_find_device(-1);
+	u32 uid = 1;
+
+	if (kbdev)
+		uid = (u32) atomic_inc_return(&kbdev->group_max_uid_in_devices);
+	else
+		WARN(1, "NULL kbase device pointer in group UID generation");
+
+	return uid;
+}
+
 /**
  * create_queue_group() - Create a queue group
  *
@@ -1068,7 +1162,7 @@ static int create_suspend_buffers(struct kbase_context *const kctx,
  * Return: a queue group handle on success, or a negative error code on failure.
  */
 static int create_queue_group(struct kbase_context *const kctx,
-	const union kbase_ioctl_cs_queue_group_create *const create)
+	union kbase_ioctl_cs_queue_group_create *const create)
 {
 	int group_handle = find_free_group_handle(kctx);
 
@@ -1099,10 +1193,14 @@ static int create_queue_group(struct kbase_context *const kctx,
 			group->tiler_max = create->in.tiler_max;
 			group->fragment_max = create->in.fragment_max;
 			group->compute_max = create->in.compute_max;
-			group->priority = create->in.priority;
+			group->priority = kbase_csf_priority_queue_group_priority_to_relative(
+				kbase_csf_priority_check(kctx->kbdev, create->in.priority));
 			group->doorbell_nr = KBASEP_USER_DB_NR_INVALID;
 			group->faulted = false;
 
+			group->group_uid = generate_group_uid();
+			create->out.group_uid = group->group_uid;
+
 			INIT_LIST_HEAD(&group->link);
 			INIT_LIST_HEAD(&group->link_to_schedule);
 			INIT_LIST_HEAD(&group->error_fatal.link);
@@ -1155,7 +1253,7 @@ int kbase_csf_queue_group_create(struct kbase_context *const kctx,
 		err = -EINVAL;
 	} else if (!iface_has_enough_streams(kctx->kbdev, create->in.cs_min)) {
 		dev_err(kctx->kbdev->dev,
-			"No CSG has at least %d streams\n",
+			"No CSG has at least %d CSs\n",
 			create->in.cs_min);
 		err = -EINVAL;
 	} else {
@@ -1217,9 +1315,8 @@ static void term_normal_suspend_buffer(struct kbase_context *const kctx,
  * term_protected_suspend_buffer() - Free normal-mode suspend buffer of
  *					queue group
  *
- * @kbdev:	Instance of a GPU platform device that implements a command
- *		stream front-end interface.
- * @s_buf:	Pointer to queue group suspend buffer to be freed
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
+ * @s_buf: Pointer to queue group suspend buffer to be freed
  */
 static void term_protected_suspend_buffer(struct kbase_device *const kbdev,
 		struct kbase_protected_suspend_buffer *s_buf)
@@ -1247,7 +1344,7 @@ void kbase_csf_term_descheduled_queue_group(struct kbase_queue_group *group)
 {
 	struct kbase_context *kctx = group->kctx;
 
-	/* Currently each group supports the same number of streams */
+	/* Currently each group supports the same number of CS */
 	u32 max_streams =
 		kctx->kbdev->csf.global_iface.groups[0].stream_num;
 	u32 i;
@@ -1288,6 +1385,7 @@ static void term_queue_group(struct kbase_queue_group *group)
 {
 	struct kbase_context *kctx = group->kctx;
 
+	kbase_reset_gpu_assert_failed_or_prevented(kctx->kbdev);
 	lockdep_assert_held(&kctx->csf.lock);
 
 	/* Stop the group and evict it from the scheduler */
@@ -1311,22 +1409,44 @@ void kbase_csf_queue_group_terminate(struct kbase_context *kctx,
 				     u8 group_handle)
 {
 	struct kbase_queue_group *group;
+	int err;
+	bool reset_prevented = false;
+	struct kbase_device *const kbdev = kctx->kbdev;
+
+	err = kbase_reset_gpu_prevent_and_wait(kbdev);
+	if (err)
+		dev_warn(
+			kbdev->dev,
+			"Unsuccessful GPU reset detected when terminating group %d, attempting to terminate regardless",
+			group_handle);
+	else
+		reset_prevented = true;
 
 	mutex_lock(&kctx->csf.lock);
 
 	group = find_queue_group(kctx, group_handle);
 
 	if (group) {
-		/* Remove any pending group fatal error from the per-context list. */
+		unsigned long flags;
+
+		spin_lock_irqsave(&kctx->csf.event_lock, flags);
+
+		dev_dbg(kbdev->dev,
+			"Remove any pending group fatal error from context %pK\n",
+			(void *)group->kctx);
+
 		list_del_init(&group->error_tiler_oom.link);
 		list_del_init(&group->error_timeout.link);
 		list_del_init(&group->error_fatal.link);
+		spin_unlock_irqrestore(&kctx->csf.event_lock, flags);
 
 		term_queue_group(group);
 		kctx->csf.queue_groups[group_handle] = NULL;
 	}
 
 	mutex_unlock(&kctx->csf.lock);
+	if (reset_prevented)
+		kbase_reset_gpu_allow(kbdev);
 
 	if (!group)
 		return;
@@ -1344,29 +1464,78 @@ int kbase_csf_queue_group_suspend(struct kbase_context *kctx,
 				  struct kbase_suspend_copy_buffer *sus_buf,
 				  u8 group_handle)
 {
-	int err = -EINVAL;
+	struct kbase_device *const kbdev = kctx->kbdev;
+	int err;
 	struct kbase_queue_group *group;
 
+	err = kbase_reset_gpu_prevent_and_wait(kbdev);
+	if (err) {
+		dev_warn(
+			kbdev->dev,
+			"Unsuccessful GPU reset detected when suspending group %d",
+			group_handle);
+		return err;
+	}
 	mutex_lock(&kctx->csf.lock);
 
 	group = find_queue_group(kctx, group_handle);
 	if (group)
 		err = kbase_csf_scheduler_group_copy_suspend_buf(group,
 								 sus_buf);
+	else
+		err = -EINVAL;
 
 	mutex_unlock(&kctx->csf.lock);
+	kbase_reset_gpu_allow(kbdev);
+
 	return err;
 }
 
 /**
- * kbase_csf_add_fatal_error_to_kctx - Add a fatal error to per-ctx error list.
+ * add_error() - Add an error to the list of errors to report to user space
+ *
+ * @kctx:  Address of a base context associated with a GPU address space.
+ * @error: Address of the item to be added to the context's pending error list.
+ * @data:  Error data to be returned to userspace.
  *
- * @group:       GPU command queue group.
- * @err_payload: Error payload to report.
+ * Does not wake up the event queue blocking a user thread in kbase_poll. This
+ * is to make it more efficient to add multiple errors.
+ *
+ * The added error must not already be on the context's list of errors waiting
+ * to be reported (e.g. because a previous error concerning the same object has
+ * not yet been reported).
  */
-static void kbase_csf_add_fatal_error_to_kctx(
-		struct kbase_queue_group *const group,
-		const struct base_gpu_queue_group_error *const err_payload)
+static void add_error(struct kbase_context *const kctx,
+		      struct kbase_csf_notification *const error,
+		      struct base_csf_notification const *const data)
+{
+	unsigned long flags;
+
+	if (WARN_ON(!kctx))
+		return;
+
+	if (WARN_ON(!error))
+		return;
+
+	if (WARN_ON(!data))
+		return;
+
+	spin_lock_irqsave(&kctx->csf.event_lock, flags);
+
+	if (!WARN_ON(!list_empty(&error->link))) {
+		error->data = *data;
+		list_add_tail(&error->link, &kctx->csf.error_list);
+		dev_dbg(kctx->kbdev->dev,
+			"Added error %pK of type %d in context %pK\n",
+			(void *)error, data->type, (void *)kctx);
+	}
+
+	spin_unlock_irqrestore(&kctx->csf.event_lock, flags);
+}
+
+void kbase_csf_add_group_fatal_error(
+	struct kbase_queue_group *const group,
+	struct base_gpu_queue_group_error const *const err_payload)
 {
 	struct base_csf_notification error;
 
@@ -1386,16 +1555,7 @@ static void kbase_csf_add_fatal_error_to_kctx(
 		}
 	};
 
-	lockdep_assert_held(&group->kctx->csf.lock);
-
-	/* If this group has already been in fatal error status,
-	 * subsequent fatal error on this group should never take place.
-	 */
-	if (!WARN_ON(!list_empty(&group->error_fatal.link))) {
-		group->error_fatal.data = error;
-		list_add_tail(&group->error_fatal.link,
-				&group->kctx->csf.error_list);
-	}
+	add_error(group->kctx, &group->error_fatal, &error);
 }
 
 void kbase_csf_active_queue_groups_reset(struct kbase_device *kbdev,
@@ -1404,7 +1564,6 @@ void kbase_csf_active_queue_groups_reset(struct kbase_device *kbdev,
 	struct list_head evicted_groups;
 	struct kbase_queue_group *group;
 	int i;
-	bool fatal_error_built = false;
 
 	INIT_LIST_HEAD(&evicted_groups);
 
@@ -1412,10 +1571,6 @@ void kbase_csf_active_queue_groups_reset(struct kbase_device *kbdev,
 
 	kbase_csf_scheduler_evict_ctx_slots(kbdev, kctx, &evicted_groups);
 	while (!list_empty(&evicted_groups)) {
-		struct kbase_csf_scheduler *scheduler =
-						&kbdev->csf.scheduler;
-		unsigned long flags;
-
 		group = list_first_entry(&evicted_groups,
 				struct kbase_queue_group, link);
 
@@ -1423,28 +1578,8 @@ void kbase_csf_active_queue_groups_reset(struct kbase_device *kbdev,
 			    kctx->tgid, kctx->id, group->handle);
 		kbase_csf_term_descheduled_queue_group(group);
 		list_del_init(&group->link);
-
-		kbase_csf_scheduler_spin_lock(kbdev, &flags);
-		if ((group == scheduler->active_protm_grp) &&
-		    group->faulted) {
-			const struct base_gpu_queue_group_error err_payload = {
-				.error_type = BASE_GPU_QUEUE_GROUP_ERROR_FATAL,
-				.payload = {
-					.fatal_group = {
-					.status = GPU_EXCEPTION_TYPE_SW_FAULT_0,
-					}
-				}
-			};
-
-			kbase_csf_add_fatal_error_to_kctx(group, &err_payload);
-			fatal_error_built = true;
-		}
-		kbase_csf_scheduler_spin_unlock(kbdev, flags);
 	}
 
-	if (fatal_error_built)
-		kbase_event_wakeup(kctx);
-
 	/* Acting on the queue groups that are pending to be terminated. */
 	for (i = 0; i < MAX_QUEUE_GROUP_NUM; i++) {
 		group = kctx->csf.queue_groups[i];
@@ -1458,6 +1593,7 @@ void kbase_csf_active_queue_groups_reset(struct kbase_device *kbdev,
 
 int kbase_csf_ctx_init(struct kbase_context *kctx)
 {
+	struct kbase_device *kbdev = kctx->kbdev;
 	int err = -ENOMEM;
 
 	INIT_LIST_HEAD(&kctx->csf.event_callback_list);
@@ -1467,6 +1603,19 @@ int kbase_csf_ctx_init(struct kbase_context *kctx)
 
 	spin_lock_init(&kctx->csf.event_lock);
 	kctx->csf.user_reg_vma = NULL;
+	mutex_lock(&kbdev->pm.lock);
+	/* The inode information for /dev/malixx file is not available at the
+	 * time of device probe as the inode is created when the device node
+	 * is created by udevd (through mknod).
+	 */
+	if (kctx->filp) {
+		if (!kbdev->csf.mali_file_inode)
+			kbdev->csf.mali_file_inode = kctx->filp->f_inode;
+
+		/* inode is unique for a file */
+		WARN_ON(kbdev->csf.mali_file_inode != kctx->filp->f_inode);
+	}
+	mutex_unlock(&kbdev->pm.lock);
 
 	/* Mark all the cookies as 'free' */
 	bitmap_fill(kctx->csf.cookies, KBASE_CSF_NUM_USER_IO_PAGES_HANDLE);
@@ -1506,6 +1655,8 @@ void kbase_csf_ctx_handle_fault(struct kbase_context *kctx,
 	int gr;
 	bool reported = false;
 	struct base_gpu_queue_group_error err_payload;
+	int err;
+	struct kbase_device *kbdev;
 
 	if (WARN_ON(!kctx))
 		return;
@@ -1513,6 +1664,14 @@ void kbase_csf_ctx_handle_fault(struct kbase_context *kctx,
 	if (WARN_ON(!fault))
 		return;
 
+	kbdev = kctx->kbdev;
+	err = kbase_reset_gpu_try_prevent(kbdev);
+	/* Regardless of whether reset failed or is currently happening, exit
+	 * early
+	 */
+	if (err)
+		return;
+
 	err_payload = (struct base_gpu_queue_group_error) {
 		.error_type = BASE_GPU_QUEUE_GROUP_ERROR_FATAL,
 		.payload = {
@@ -1531,7 +1690,7 @@ void kbase_csf_ctx_handle_fault(struct kbase_context *kctx,
 
 		if (group && group->run_state != KBASE_CSF_GROUP_TERMINATED) {
 			term_queue_group(group);
-			kbase_csf_add_fatal_error_to_kctx(group, &err_payload);
+			kbase_csf_add_group_fatal_error(group, &err_payload);
 			reported = true;
 		}
 	}
@@ -1540,11 +1699,18 @@ void kbase_csf_ctx_handle_fault(struct kbase_context *kctx,
 
 	if (reported)
 		kbase_event_wakeup(kctx);
+
+	kbase_reset_gpu_allow(kbdev);
 }
 
 void kbase_csf_ctx_term(struct kbase_context *kctx)
 {
+	struct kbase_device *kbdev = kctx->kbdev;
+	struct kbase_as *as = NULL;
+	unsigned long flags;
 	u32 i;
+	int err;
+	bool reset_prevented = false;
 
 	/* As the kbase context is terminating, its debugfs sub-directory would
 	 * have been removed already and so would be the debugfs file created
@@ -1553,8 +1719,17 @@ void kbase_csf_ctx_term(struct kbase_context *kctx)
 	 */
 	kbase_csf_event_wait_remove_all(kctx);
 
-	mutex_lock(&kctx->csf.lock);
+	/* Wait for a GPU reset if it is happening, prevent it if not happening */
+	err = kbase_reset_gpu_prevent_and_wait(kbdev);
+	if (err)
+		dev_warn(
+			kbdev->dev,
+			"Unsuccessful GPU reset detected when terminating csf context (%d_%d), attempting to terminate regardless",
+			kctx->tgid, kctx->id);
+	else
+		reset_prevented = true;
 
+	mutex_lock(&kctx->csf.lock);
 	/* Iterate through the queue groups that were not terminated by
 	 * userspace and issue the term request to firmware for them.
 	 */
@@ -1562,19 +1737,39 @@ void kbase_csf_ctx_term(struct kbase_context *kctx)
 		if (kctx->csf.queue_groups[i])
 			term_queue_group(kctx->csf.queue_groups[i]);
 	}
-
 	mutex_unlock(&kctx->csf.lock);
 
+	if (reset_prevented)
+		kbase_reset_gpu_allow(kbdev);
+
 	/* Now that all queue groups have been terminated, there can be no
 	 * more OoM or timer event interrupts but there can be inflight work
 	 * items. Destroying the wq will implicitly flush those work items.
 	 */
 	destroy_workqueue(kctx->csf.wq);
 
+	/* Wait for the firmware error work item to also finish as it could
+	 * be affecting this outgoing context also.
+	 */
+	flush_work(&kctx->kbdev->csf.fw_error_work);
+
+	/* A work item to handle page_fault/bus_fault/gpu_fault could be
+	 * pending for the outgoing context. Flush the workqueue that will
+	 * execute that work item.
+	 */
+	spin_lock_irqsave(&kctx->kbdev->hwaccess_lock, flags);
+	if (kctx->as_nr != KBASEP_AS_NR_INVALID)
+		as = &kctx->kbdev->as[kctx->as_nr];
+	spin_unlock_irqrestore(&kctx->kbdev->hwaccess_lock, flags);
+	if (as)
+		flush_workqueue(as->pf_wq);
+
 	mutex_lock(&kctx->csf.lock);
 
-	for (i = 0; i < MAX_QUEUE_GROUP_NUM; i++)
+	for (i = 0; i < MAX_QUEUE_GROUP_NUM; i++) {
 		kfree(kctx->csf.queue_groups[i]);
+		kctx->csf.queue_groups[i] = NULL;
+	}
 
 	/* Iterate through the queues that were not terminated by
 	 * userspace and do the required cleanup for them.
@@ -1623,6 +1818,9 @@ int kbase_csf_event_wait_add(struct kbase_context *kctx,
 
 		spin_lock_irqsave(&kctx->csf.event_lock, flags);
 		list_add_tail(&event->link, &kctx->csf.event_callback_list);
+		dev_dbg(kctx->kbdev->dev,
+			"Added event handler %pK with param %pK\n", event,
+			event->param);
 		spin_unlock_irqrestore(&kctx->csf.event_lock, flags);
 
 		err = 0;
@@ -1642,6 +1840,9 @@ void kbase_csf_event_wait_remove(struct kbase_context *kctx,
 	list_for_each_entry(event, &kctx->csf.event_callback_list, link) {
 		if ((event->callback == callback) && (event->param == param)) {
 			list_del(&event->link);
+			dev_dbg(kctx->kbdev->dev,
+				"Removed event handler %pK with param %pK\n",
+				event, event->param);
 			kfree(event);
 			break;
 		}
@@ -1654,19 +1855,22 @@ bool kbase_csf_read_error(struct kbase_context *kctx,
 {
 	bool got_event = true;
 	struct kbase_csf_notification *error_data = NULL;
+	unsigned long flags;
 
-	mutex_lock(&kctx->csf.lock);
+	spin_lock_irqsave(&kctx->csf.event_lock, flags);
 
 	if (likely(!list_empty(&kctx->csf.error_list))) {
 		error_data = list_first_entry(&kctx->csf.error_list,
 			struct kbase_csf_notification, link);
 		list_del_init(&error_data->link);
 		*event_data = error_data->data;
+		dev_dbg(kctx->kbdev->dev, "Dequeued error %pK in context %pK\n",
+			(void *)error_data, (void *)kctx);
 	} else {
 		got_event = false;
 	}
 
-	mutex_unlock(&kctx->csf.lock);
+	spin_unlock_irqrestore(&kctx->csf.event_lock, flags);
 
 	return got_event;
 }
@@ -1674,10 +1878,13 @@ bool kbase_csf_read_error(struct kbase_context *kctx,
 bool kbase_csf_error_pending(struct kbase_context *kctx)
 {
 	bool event_pended = false;
+	unsigned long flags;
 
-	mutex_lock(&kctx->csf.lock);
+	spin_lock_irqsave(&kctx->csf.event_lock, flags);
 	event_pended = !list_empty(&kctx->csf.error_list);
-	mutex_unlock(&kctx->csf.lock);
+	dev_dbg(kctx->kbdev->dev, "%s error is pending in context %pK\n",
+		event_pended ? "An" : "No", (void *)kctx);
+	spin_unlock_irqrestore(&kctx->csf.event_lock, flags);
 
 	return event_pended;
 }
@@ -1687,6 +1894,10 @@ void kbase_csf_event_signal(struct kbase_context *kctx, bool notify_gpu)
 	struct kbase_csf_event *event, *next_event;
 	unsigned long flags;
 
+	dev_dbg(kctx->kbdev->dev,
+		"Signal event (%s GPU notify) for context %pK\n",
+		notify_gpu ? "with" : "without", (void *)kctx);
+
 	/* First increment the signal count and wake up event thread.
 	 */
 	atomic_set(&kctx->event_count, 1);
@@ -1712,9 +1923,12 @@ void kbase_csf_event_signal(struct kbase_context *kctx, bool notify_gpu)
 
 	list_for_each_entry_safe(
 		event, next_event, &kctx->csf.event_callback_list, link) {
-		enum kbase_csf_event_callback_action action =
-			event->callback(event->param);
+		enum kbase_csf_event_callback_action action;
 
+		dev_dbg(kctx->kbdev->dev,
+			"Calling event handler %pK with param %pK\n",
+			(void *)event, event->param);
+		action = event->callback(event->param);
 		if (action == KBASE_CSF_EVENT_CALLBACK_REMOVE) {
 			list_del(&event->link);
 			kfree(event);
@@ -1734,6 +1948,9 @@ void kbase_csf_event_wait_remove_all(struct kbase_context *kctx)
 	list_for_each_entry_safe(
 		event, next_event, &kctx->csf.event_callback_list, link) {
 		list_del(&event->link);
+		dev_dbg(kctx->kbdev->dev,
+			"Removed event handler %pK with param %pK\n",
+			(void *)event, event->param);
 		kfree(event);
 	}
 
@@ -1742,19 +1959,19 @@ void kbase_csf_event_wait_remove_all(struct kbase_context *kctx)
 
 /**
  * handle_oom_event - Handle the OoM event generated by the firmware for the
- *                    command stream interface.
+ *                    CSI.
  *
  * This function will handle the OoM event request from the firmware for the
- * command stream. It will retrieve the address of heap context and heap's
- * statistics (like number of render passes in-flight) from the command
- * stream's kernel output page and pass them to the tiler heap function
- * to allocate a new chunk.
- * It will also update the command stream's kernel input page with the address
+ * CS. It will retrieve the address of heap context and heap's
+ * statistics (like number of render passes in-flight) from the CS's kernel
+ * kernel output page and pass them to the tiler heap function to allocate a
+ * new chunk.
+ * It will also update the CS's kernel input page with the address
  * of a new chunk that was allocated.
  *
  * @kctx: Pointer to the kbase context in which the tiler heap was initialized.
  * @stream: Pointer to the structure containing info provided by the firmware
- *          about the command stream interface.
+ *          about the CSI.
  *
  * Return: 0 if successfully handled the request, otherwise a negative error
  *         code on failure.
@@ -1772,6 +1989,7 @@ static int handle_oom_event(struct kbase_context *const kctx,
 	const u32 frag_end =
 		kbase_csf_firmware_cs_output(stream, CS_HEAP_FRAG_END);
 	u32 renderpasses_in_flight;
+	u32 pending_frag_count;
 	u64 new_chunk_ptr;
 	int err;
 
@@ -1782,9 +2000,10 @@ static int handle_oom_event(struct kbase_context *const kctx,
 	}
 
 	renderpasses_in_flight = vt_start - frag_end;
+	pending_frag_count = vt_end - frag_end;
 
 	err = kbase_csf_tiler_heap_alloc_new_chunk(kctx,
-		gpu_heap_va, renderpasses_in_flight, &new_chunk_ptr);
+		gpu_heap_va, renderpasses_in_flight, pending_frag_count, &new_chunk_ptr);
 
 	/* It is okay to acknowledge with a NULL chunk (firmware will then wait
 	 * for the fragment jobs to complete and release chunks)
@@ -1823,17 +2042,9 @@ static void report_tiler_oom_error(struct kbase_queue_group *group)
 						  .error_type =
 							  BASE_GPU_QUEUE_GROUP_ERROR_TILER_HEAP_OOM,
 					  } } } };
-	struct kbase_context *kctx = group->kctx;
 
-	lockdep_assert_held(&kctx->csf.lock);
-
-	/* Ignore this error if the previous one hasn't been reported */
-	if (!WARN_ON(!list_empty(&group->error_tiler_oom.link))) {
-		group->error_tiler_oom.data = error;
-		list_add_tail(&group->error_tiler_oom.link,
-			      &kctx->csf.error_list);
-		kbase_event_wakeup(kctx);
-	}
+	add_error(group->kctx, &group->error_tiler_oom, &error);
+	kbase_event_wakeup(group->kctx);
 }
 
 /**
@@ -1841,8 +2052,8 @@ static void report_tiler_oom_error(struct kbase_queue_group *group)
  *
  * @queue: Pointer to queue for which out-of-memory event was received.
  *
- * Called with the command-stream front-end locked for the affected GPU
- * virtual address space. Do not call in interrupt context.
+ * Called with the CSF locked for the affected GPU virtual address space.
+ * Do not call in interrupt context.
  *
  * Handles tiler out-of-memory for a GPU command queue and then clears the
  * notification to allow the firmware to report out-of-memory again in future.
@@ -1859,6 +2070,7 @@ static void kbase_queue_oom_event(struct kbase_queue *const queue)
 	int slot_num, err;
 	struct kbase_csf_cmd_stream_group_info const *ginfo;
 	struct kbase_csf_cmd_stream_info const *stream;
+	int csi_index = queue->csi_index;
 	u32 cs_oom_ack, cs_oom_req;
 
 	lockdep_assert_held(&kctx->csf.lock);
@@ -1887,7 +2099,7 @@ static void kbase_queue_oom_event(struct kbase_queue *const queue)
 		goto unlock;
 
 	ginfo = &kbdev->csf.global_iface.groups[slot_num];
-	stream = &ginfo->streams[queue->csi_index];
+	stream = &ginfo->streams[csi_index];
 	cs_oom_ack = kbase_csf_firmware_cs_output(stream, CS_ACK) &
 		     CS_ACK_TILER_OOM_MASK;
 	cs_oom_req = kbase_csf_firmware_cs_input_read(stream, CS_REQ) &
@@ -1918,7 +2130,7 @@ static void kbase_queue_oom_event(struct kbase_queue *const queue)
 		return;
 	}
 
-	kbase_csf_ring_cs_kernel_doorbell(kbdev, queue);
+	kbase_csf_ring_cs_kernel_doorbell(kbdev, csi_index, slot_num, true);
 unlock:
 	kbase_csf_scheduler_unlock(kbdev);
 }
@@ -1937,6 +2149,14 @@ static void oom_event_worker(struct work_struct *data)
 	struct kbase_queue *queue =
 		container_of(data, struct kbase_queue, oom_event_work);
 	struct kbase_context *kctx = queue->kctx;
+	struct kbase_device *const kbdev = kctx->kbdev;
+
+	int err = kbase_reset_gpu_try_prevent(kbdev);
+	/* Regardless of whether reset failed or is currently happening, exit
+	 * early
+	 */
+	if (err)
+		return;
 
 	mutex_lock(&kctx->csf.lock);
 
@@ -1944,20 +2164,16 @@ static void oom_event_worker(struct work_struct *data)
 	release_queue(queue);
 
 	mutex_unlock(&kctx->csf.lock);
+	kbase_reset_gpu_allow(kbdev);
 }
 
 /**
- * timer_event_worker - Timer event handler called from a workqueue.
+ * report_group_timeout_error - Report the timeout error for the group to userspace.
  *
- * @data: Pointer to a work_struct embedded in GPU command queue group data.
- *
- * Notify the event notification thread of progress timeout fault
- * for the GPU command queue group.
+ * @group: Pointer to the group for which timeout error occurred
  */
-static void timer_event_worker(struct work_struct *data)
+static void report_group_timeout_error(struct kbase_queue_group *const group)
 {
-	struct kbase_queue_group *const group =
-		container_of(data, struct kbase_queue_group, timer_event_work);
 	struct base_csf_notification const
 		error = { .type = BASE_CSF_NOTIFICATION_GPU_QUEUE_GROUP_ERROR,
 			  .payload = {
@@ -1967,19 +2183,59 @@ static void timer_event_worker(struct work_struct *data)
 						  .error_type =
 							  BASE_GPU_QUEUE_GROUP_ERROR_TIMEOUT,
 					  } } } };
+
+	dev_warn(group->kctx->kbdev->dev,
+		 "Notify the event notification thread, forward progress timeout (%llu cycles)\n",
+		 kbase_csf_timeout_get(group->kctx->kbdev));
+
+	add_error(group->kctx, &group->error_timeout, &error);
+	kbase_event_wakeup(group->kctx);
+}
+
+/**
+ * timer_event_worker - Handle the progress timeout error for the group
+ *
+ * @data: Pointer to a work_struct embedded in GPU command queue group data.
+ *
+ * Terminate the CSG and report the error to userspace
+ */
+static void timer_event_worker(struct work_struct *data)
+{
+	struct kbase_queue_group *const group =
+		container_of(data, struct kbase_queue_group, timer_event_work);
 	struct kbase_context *const kctx = group->kctx;
+	bool reset_prevented = false;
+	int err = kbase_reset_gpu_prevent_and_wait(kctx->kbdev);
+
+	if (err)
+		dev_warn(
+			kctx->kbdev->dev,
+			"Unsuccessful GPU reset detected when terminating group %d on progress timeout, attempting to terminate regardless",
+			group->handle);
+	else
+		reset_prevented = true;
 
 	mutex_lock(&kctx->csf.lock);
 
-	/* Ignore this error if the previous one hasn't been reported */
-	if (!WARN_ON(!list_empty(&group->error_timeout.link))) {
-		group->error_timeout.data = error;
-		list_add_tail(&group->error_timeout.link,
-			      &kctx->csf.error_list);
-		kbase_event_wakeup(kctx);
-	}
+	term_queue_group(group);
+	report_group_timeout_error(group);
 
 	mutex_unlock(&kctx->csf.lock);
+	if (reset_prevented)
+		kbase_reset_gpu_allow(kctx->kbdev);
+}
+
+/**
+ * handle_progress_timer_event - Progress timer timeout event handler.
+ *
+ * @group: Pointer to GPU queue group for which the timeout event is received.
+ *
+ * Enqueue a work item to terminate the group and notify the event notification
+ * thread of progress timeout fault for the GPU command queue group.
+ */
+static void handle_progress_timer_event(struct kbase_queue_group *const group)
+{
+	queue_work(group->kctx->csf.wq, &group->timer_event_work);
 }
 
 /**
@@ -1998,18 +2254,43 @@ static void protm_event_worker(struct work_struct *data)
 	kbase_csf_scheduler_group_protm_enter(group);
 }
 
+static void report_queue_fatal_error(struct kbase_queue *const queue,
+				     u32 cs_fatal, u64 cs_fatal_info,
+				     u8 group_handle)
+{
+	struct base_csf_notification error =
+		{ .type = BASE_CSF_NOTIFICATION_GPU_QUEUE_GROUP_ERROR,
+		  .payload = {
+			  .csg_error = {
+				  .handle = group_handle,
+				  .error = {
+					  .error_type =
+						  BASE_GPU_QUEUE_GROUP_QUEUE_ERROR_FATAL,
+					  .payload = {
+						  .fatal_queue = {
+							  .sideband =
+								  cs_fatal_info,
+							  .status = cs_fatal,
+							  .csi_index =
+								  queue->csi_index,
+						  } } } } } };
+
+	add_error(queue->kctx, &queue->error, &error);
+	kbase_event_wakeup(queue->kctx);
+}
+
 /**
  * handle_fault_event - Handler for CS fault.
  *
  * @queue:  Pointer to queue for which fault event was received.
  * @stream: Pointer to the structure containing info provided by the
- *          firmware about the command stream interface.
+ *          firmware about the CSI.
  *
  * Prints meaningful CS fault information.
  *
- * Return: 0 on success, otherwise a negative system code.
  */
-static int handle_fault_event(struct kbase_queue const *const queue,
+static void
+handle_fault_event(struct kbase_queue *const queue,
 		   struct kbase_csf_cmd_stream_info const *const stream)
 {
 	const u32 cs_fault = kbase_csf_firmware_cs_output(stream, CS_FAULT);
@@ -2025,6 +2306,8 @@ static int handle_fault_event(struct kbase_queue const *const queue,
 		CS_FAULT_INFO_EXCEPTION_DATA_GET(cs_fault_info);
 	struct kbase_device *const kbdev = queue->kctx->kbdev;
 
+	kbase_csf_scheduler_spin_lock_assert_held(kbdev);
+
 	dev_warn(kbdev->dev, "CSI: %d\n"
 			"CS_FAULT.EXCEPTION_TYPE: 0x%x (%s)\n"
 			"CS_FAULT.EXCEPTION_DATA: 0x%x\n"
@@ -2033,52 +2316,55 @@ static int handle_fault_event(struct kbase_queue const *const queue,
 			kbase_gpu_exception_name(cs_fault_exception_type),
 			cs_fault_exception_data, cs_fault_info_exception_data);
 
-	return -EFAULT;
+	if (cs_fault_exception_type ==
+	    CS_FAULT_EXCEPTION_TYPE_RESOURCE_EVICTION_TIMEOUT)
+		report_queue_fatal_error(queue, GPU_EXCEPTION_TYPE_SW_FAULT_2,
+					 0, queue->group->handle);
 }
 
 /**
- * report_queue_fatal_error - Report queue fatal error to user space
+ * fatal_event_worker - Handle the fatal error for the GPU queue
  *
- * @queue:         Pointer to queue for which fatal event was received.
- * @cs_fatal:      Fault information
- * @cs_fatal_info: Additional fault information
+ * @data: Pointer to a work_struct embedded in GPU command queue.
  *
- * If a queue has already been in fatal error status,
- * subsequent fatal error on the queue should never take place.
+ * Terminate the CSG and report the error to userspace.
  */
-static void report_queue_fatal_error(struct kbase_queue *const queue,
-		u32 cs_fatal, u64 cs_fatal_info)
+static void fatal_event_worker(struct work_struct *const data)
 {
-	struct base_csf_notification error = {
-		.type = BASE_CSF_NOTIFICATION_GPU_QUEUE_GROUP_ERROR,
-		.payload = {
-			.csg_error = {
-				.handle = queue->group->handle,
-				.error = {
-					.error_type =
-					BASE_GPU_QUEUE_GROUP_QUEUE_ERROR_FATAL,
-					.payload = {
-						.fatal_queue = {
-						.sideband = cs_fatal_info,
-						.status = cs_fatal,
-						.csi_index = queue->csi_index,
-						}
-					}
-				}
-			}
-		}
-	};
+	struct kbase_queue *const queue =
+		container_of(data, struct kbase_queue, fatal_event_work);
+	struct kbase_context *const kctx = queue->kctx;
+	struct kbase_device *const kbdev = kctx->kbdev;
+	struct kbase_queue_group *group;
+	u8 group_handle;
+	bool reset_prevented = false;
+	int err = kbase_reset_gpu_prevent_and_wait(kbdev);
 
-	lockdep_assert_held(&queue->kctx->csf.lock);
+	if (err)
+		dev_warn(
+			kbdev->dev,
+			"Unsuccessful GPU reset detected when terminating group to handle fatal event, attempting to terminate regardless");
+	else
+		reset_prevented = true;
 
-	/* If a queue has already been in fatal error status,
-	 * subsequent fatal error on the queue should never take place.
-	 */
-	if (!WARN_ON(!list_empty(&queue->error.link))) {
-		queue->error.data = error;
-		list_add_tail(&queue->error.link, &queue->kctx->csf.error_list);
-		kbase_event_wakeup(queue->kctx);
+	mutex_lock(&kctx->csf.lock);
+
+	group = get_bound_queue_group(queue);
+	if (!group) {
+		dev_warn(kbdev->dev, "queue not bound when handling fatal event");
+		goto unlock;
 	}
+
+	group_handle = group->handle;
+	term_queue_group(group);
+	report_queue_fatal_error(queue, queue->cs_fatal, queue->cs_fatal_info,
+				 group_handle);
+
+unlock:
+	release_queue(queue);
+	mutex_unlock(&kctx->csf.lock);
+	if (reset_prevented)
+		kbase_reset_gpu_allow(kbdev);
 }
 
 /**
@@ -2086,17 +2372,15 @@ static void report_queue_fatal_error(struct kbase_queue *const queue,
  *
  * @queue:    Pointer to queue for which fatal event was received.
  * @stream:   Pointer to the structure containing info provided by the
- *            firmware about the command stream interface.
- * @fw_error: Return true if internal firmware fatal is handled
+ *            firmware about the CSI.
  *
  * Prints meaningful CS fatal information.
- * Report queue fatal error to user space.
- *
- * Return: 0 on success otherwise a negative system error.
+ * Enqueue a work item to terminate the group and report the fatal error
+ * to user space.
  */
-static int handle_fatal_event(struct kbase_queue *const queue,
-	struct kbase_csf_cmd_stream_info const *const stream,
-	bool *fw_error)
+static void
+handle_fatal_event(struct kbase_queue *const queue,
+		   struct kbase_csf_cmd_stream_info const *const stream)
 {
 	const u32 cs_fatal = kbase_csf_firmware_cs_output(stream, CS_FATAL);
 	const u64 cs_fatal_info =
@@ -2111,7 +2395,7 @@ static int handle_fatal_event(struct kbase_queue *const queue,
 		CS_FATAL_INFO_EXCEPTION_DATA_GET(cs_fatal_info);
 	struct kbase_device *const kbdev = queue->kctx->kbdev;
 
-	lockdep_assert_held(&queue->kctx->csf.lock);
+	kbase_csf_scheduler_spin_lock_assert_held(kbdev);
 
 	dev_warn(kbdev->dev,
 		 "CSG: %d, CSI: %d\n"
@@ -2124,156 +2408,67 @@ static int handle_fatal_event(struct kbase_queue *const queue,
 		 cs_fatal_exception_data, cs_fatal_info_exception_data);
 
 	if (cs_fatal_exception_type ==
-			CS_FATAL_EXCEPTION_TYPE_FIRMWARE_INTERNAL_ERROR)
-		*fw_error = true;
-	else
-		report_queue_fatal_error(queue, cs_fatal, cs_fatal_info);
-
-	return -EFAULT;
-}
-
-/**
- * handle_internal_firmware_fatal - Handler for CS internal firmware fault.
- *
- * @kbdev:  Pointer to kbase device
- *
- * Report group fatal error to user space for all GPU command queue groups
- * in the device, terminate them and reset GPU.
- */
-static void handle_internal_firmware_fatal(struct kbase_device *const kbdev)
-{
-	int as;
-
-	for (as = 0; as < kbdev->nr_hw_address_spaces; as++) {
-		struct kbase_context *kctx;
-		struct kbase_fault fault = {
-			.status = GPU_EXCEPTION_TYPE_SW_FAULT_1,
-		};
-
-		if (as == MCU_AS_NR)
-			continue;
-
-		kctx = kbase_ctx_sched_as_to_ctx_refcount(kbdev, as);
-		if (!kctx)
-			continue;
-
-		kbase_csf_ctx_handle_fault(kctx, &fault);
-		kbase_ctx_sched_release_ctx_lock(kctx);
+			CS_FATAL_EXCEPTION_TYPE_FIRMWARE_INTERNAL_ERROR) {
+		queue_work(system_wq, &kbdev->csf.fw_error_work);
+	} else {
+		get_queue(queue);
+		queue->cs_fatal = cs_fatal;
+		queue->cs_fatal_info = cs_fatal_info;
+		if (!queue_work(queue->kctx->csf.wq, &queue->fatal_event_work))
+			release_queue(queue);
 	}
-
-	if (kbase_prepare_to_reset_gpu(kbdev))
-		kbase_reset_gpu(kbdev);
 }
 
 /**
- * fault_event_worker - Worker function for CS fault/fatal.
- *
- * @data: Pointer to a work_struct embedded in GPU command queue data.
+ * handle_queue_exception_event - Handler for CS fatal/fault exception events.
  *
- * Handle the fault and fatal exception for a GPU command queue and then
- * releases a reference that was added to prevent the queue being destroyed
- * while this work item was pending on a workqueue.
- * 
- * Report the fault and fatal exception for a GPU command queue and then
- * clears the corresponding notification fields to allow the firmware to
- * report other faults in future.
- * 
- * It may also terminate the GPU command queue group(s) and reset GPU
- * in case internal firmware CS fatal exception occurred.
+ * @queue:  Pointer to queue for which fatal/fault event was received.
+ * @cs_req: Value of the CS_REQ register from the CS's input page.
+ * @cs_ack: Value of the CS_ACK register from the CS's output page.
  */
-static void fault_event_worker(struct work_struct *const data)
+static void handle_queue_exception_event(struct kbase_queue *const queue,
+					 const u32 cs_req, const u32 cs_ack)
 {
-	struct kbase_queue *const queue =
-		container_of(data, struct kbase_queue, fault_event_work);
-
-	struct kbase_context *const kctx = queue->kctx;
-	struct kbase_device *const kbdev = kctx->kbdev;
-	struct kbase_queue_group *group;
-	int slot_num;
 	struct kbase_csf_cmd_stream_group_info const *ginfo;
 	struct kbase_csf_cmd_stream_info const *stream;
-	u32 cs_ack, cs_req;
-	int err = 0;
-	bool internal_fw_error = false;
-
-	mutex_lock(&kctx->csf.lock);
-	kbase_csf_scheduler_lock(kbdev);
-
-	group = get_bound_queue_group(queue);
-	if (!group) {
-		dev_warn(kbdev->dev, "queue not bound\n");
-		goto unlock;
-	}
-
-	slot_num = kbase_csf_scheduler_group_get_slot(group);
-
-	/* The group could have gone off slot before this work item got
-	 * a chance to execute.
-	 */
-	if (slot_num < 0) {
-		dev_warn(kbdev->dev, "invalid slot_num\n");
-		goto unlock;
-	}
+	struct kbase_context *const kctx = queue->kctx;
+	struct kbase_device *const kbdev = kctx->kbdev;
+	struct kbase_queue_group *group = queue->group;
+	int csi_index = queue->csi_index;
+	int slot_num = group->csg_nr;
 
-	/* If the bound group is on slot yet the kctx is marked with disabled
-	 * on address-space fault, the group is pending to be killed. So skip
-	 * the inflight queue exception event operation.
-	 */
-	if (kbase_ctx_flag(kctx, KCTX_AS_DISABLED_ON_FAULT)) {
-		dev_warn(kbdev->dev, "kctx is already disabled on fault\n");
-		goto unlock;
-	}
+	kbase_csf_scheduler_spin_lock_assert_held(kbdev);
 
 	ginfo = &kbdev->csf.global_iface.groups[slot_num];
-	stream = &ginfo->streams[queue->csi_index];
-	cs_ack = kbase_csf_firmware_cs_output(stream, CS_ACK);
-	cs_req = kbase_csf_firmware_cs_input_read(stream, CS_REQ);
+	stream = &ginfo->streams[csi_index];
 
 	if ((cs_ack & CS_ACK_FATAL_MASK) != (cs_req & CS_REQ_FATAL_MASK)) {
-		err = handle_fatal_event(queue, stream, &internal_fw_error);
+		handle_fatal_event(queue, stream);
 		kbase_csf_firmware_cs_input_mask(stream, CS_REQ, cs_ack,
 						 CS_REQ_FATAL_MASK);
 	}
 
 	if ((cs_ack & CS_ACK_FAULT_MASK) != (cs_req & CS_REQ_FAULT_MASK)) {
-		err |= handle_fault_event(queue, stream);
+		handle_fault_event(queue, stream);
 		kbase_csf_firmware_cs_input_mask(stream, CS_REQ, cs_ack,
 						 CS_REQ_FAULT_MASK);
-		kbase_csf_ring_cs_kernel_doorbell(kbdev, queue);
-	}
-
-	if (err) {
-		/* From 10.x.5, CS_REQ_ERROR_MODE is removed but TI2 bitfile
-		 * upload not finished. Need to remove on GPUCORE-23972
-		 */
-		kbase_csf_firmware_cs_input_mask(stream, CS_REQ, ~cs_ack,
-						CS_REQ_ERROR_MODE_MASK);
-		dev_dbg(kbdev->dev, "Slot-%d CSI-%d entering error mode\n",
-			slot_num, queue->csi_index);
+		kbase_csf_ring_cs_kernel_doorbell(kbdev, csi_index, slot_num, true);
 	}
-
-unlock:
-	release_queue(queue);
-	kbase_csf_scheduler_unlock(kbdev);
-	mutex_unlock(&kctx->csf.lock);
-
-	if (internal_fw_error)
-		handle_internal_firmware_fatal(kbdev);
 }
 
 /**
- * process_cs_interrupts - Process interrupts for a command stream.
+ * process_cs_interrupts - Process interrupts for a CS.
  *
  * @group:  Pointer to GPU command queue group data.
- * @ginfo:  The command stream group interface provided by the firmware.
- * @irqreq: CSG's IRQ request bitmask (one bit per stream).
- * @irqack: CSG's IRQ acknowledge bitmask (one bit per stream).
+ * @ginfo:  The CSG interface provided by the firmware.
+ * @irqreq: CSG's IRQ request bitmask (one bit per CS).
+ * @irqack: CSG's IRQ acknowledge bitmask (one bit per CS).
  *
  * If the interrupt request bitmask differs from the acknowledge bitmask
  * then the firmware is notifying the host of an event concerning those
- * streams indicated by bits whose value differs. The actions required
+ * CSs indicated by bits whose value differs. The actions required
  * are then determined by examining which notification flags differ between
- * the request and acknowledge registers for the individual stream(s).
+ * the request and acknowledge registers for the individual CS(s).
  */
 static void process_cs_interrupts(struct kbase_queue_group *const group,
 		      struct kbase_csf_cmd_stream_group_info const *const ginfo,
@@ -2282,6 +2477,8 @@ static void process_cs_interrupts(struct kbase_queue_group *const group,
 	struct kbase_device *const kbdev = group->kctx->kbdev;
 	u32 remaining = irqreq ^ irqack;
 	bool protm_pend = false;
+	const bool group_suspending =
+		!kbase_csf_scheduler_group_events_enabled(kbdev, group);
 
 	kbase_csf_scheduler_spin_lock_assert_held(kbdev);
 
@@ -2289,6 +2486,8 @@ static void process_cs_interrupts(struct kbase_queue_group *const group,
 		int const i = ffs(remaining) - 1;
 		struct kbase_queue *const queue = group->bound_queues[i];
 
+		remaining &= ~(1 << i);
+
 		/* The queue pointer can be NULL, but if it isn't NULL then it
 		 * cannot disappear since scheduler spinlock is held and before
 		 * freeing a bound queue it has to be first unbound which
@@ -2305,12 +2504,18 @@ static void process_cs_interrupts(struct kbase_queue_group *const group,
 
 			if ((cs_req & CS_REQ_EXCEPTION_MASK) ^
 			    (cs_ack & CS_ACK_EXCEPTION_MASK)) {
-				get_queue(queue);
 				KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, CSI_FAULT_INTERRUPT, group, queue, cs_req ^ cs_ack);
-				if (!queue_work(wq, &queue->fault_event_work))
-					release_queue(queue);
+				handle_queue_exception_event(queue, cs_req,
+							     cs_ack);
 			}
 
+			/* PROTM_PEND and TILER_OOM can be safely ignored
+			 * because they will be raised again if the group
+			 * is assigned a CSG slot in future.
+			 */
+			if (group_suspending)
+				continue;
+
 			if (((cs_req & CS_REQ_TILER_OOM_MASK) ^
 			     (cs_ack & CS_ACK_TILER_OOM_MASK))) {
 				get_queue(queue);
@@ -2337,8 +2542,6 @@ static void process_cs_interrupts(struct kbase_queue_group *const group,
 				protm_pend = true;
 			}
 		}
-
-		remaining &= ~(1 << i);
 	}
 
 	if (protm_pend)
@@ -2346,13 +2549,12 @@ static void process_cs_interrupts(struct kbase_queue_group *const group,
 }
 
 /**
- * process_csg_interrupts - Process interrupts for a command stream group.
+ * process_csg_interrupts - Process interrupts for a CSG.
  *
- * @kbdev: Instance of a GPU platform device that implements a command stream
- *         front-end interface.
- * @csg_nr: Command stream group number.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
+ * @csg_nr: CSG number.
  *
- * Handles interrupts for a command stream group and for streams within it.
+ * Handles interrupts for a CSG and for CSs within it.
  *
  * If the CSG's request register value differs from its acknowledge register
  * then the firmware is notifying the host of an event concerning the whole
@@ -2407,45 +2609,131 @@ static void process_csg_interrupts(struct kbase_device *const kbdev,
 	if (WARN_ON(kbase_csf_scheduler_group_get_slot_locked(group) != csg_nr))
 		return;
 
-	if ((req ^ ack) & CSG_REQ_SYNC_UPDATE) {
+	if ((req ^ ack) & CSG_REQ_SYNC_UPDATE_MASK) {
 		kbase_csf_firmware_csg_input_mask(ginfo,
-			CSG_REQ, ack, CSG_REQ_SYNC_UPDATE);
+			CSG_REQ, ack, CSG_REQ_SYNC_UPDATE_MASK);
 
 		KBASE_KTRACE_ADD_CSF_GRP(kbdev, CSG_SYNC_UPDATE_INTERRUPT, group, req ^ ack);
 		kbase_csf_event_signal_cpu_only(group->kctx);
 	}
 
-	/* IDLE and TILER_OOM can be safely ignored because they will be
-	 * raised again if the group is assigned a CSG slot in future.
-	 * TILER_OOM and PROGRESS_TIMER_EVENT may terminate the group.
-	 */
-	if (!kbase_csf_scheduler_group_events_enabled(kbdev, group))
-		return;
-
 	if ((req ^ ack) & CSG_REQ_IDLE_MASK) {
+		struct kbase_csf_scheduler *scheduler =	&kbdev->csf.scheduler;
+
 		kbase_csf_firmware_csg_input_mask(ginfo, CSG_REQ, ack,
 			CSG_REQ_IDLE_MASK);
 
-		set_bit(csg_nr, kbdev->csf.scheduler.csg_slots_idle_mask);
+		set_bit(csg_nr, scheduler->csg_slots_idle_mask);
 
 		KBASE_KTRACE_ADD_CSF_GRP(kbdev,  CSG_IDLE_INTERRUPT, group, req ^ ack);
 		dev_dbg(kbdev->dev, "Idle notification received for Group %u on slot %d\n",
 			 group->handle, csg_nr);
+
+		/* Check if the scheduling tick can be advanced */
+		if (kbase_csf_scheduler_all_csgs_idle(kbdev) &&
+		    !scheduler->gpu_idle_fw_timer_enabled) {
+			kbase_csf_scheduler_advance_tick_nolock(kbdev);
+		}
 	}
 
 	if ((req ^ ack) & CSG_REQ_PROGRESS_TIMER_EVENT_MASK) {
 		kbase_csf_firmware_csg_input_mask(ginfo, CSG_REQ, ack,
 			CSG_REQ_PROGRESS_TIMER_EVENT_MASK);
 
-		dev_dbg(kbdev->dev, "Timeout notification received for Group %u on slot %d\n",
-			group->handle, csg_nr);
+		dev_info(kbdev->dev,
+			"Timeout notification received for group %u of ctx %d_%d on slot %d\n",
+			group->handle, group->kctx->tgid, group->kctx->id, csg_nr);
 
-		queue_work(group->kctx->csf.wq, &group->timer_event_work);
+		handle_progress_timer_event(group);
 	}
 
 	process_cs_interrupts(group, ginfo, irqreq, irqack);
 }
 
+/**
+ * process_prfcnt_interrupts - Process performance counter interrupts.
+ *
+ * @kbdev:   Instance of a GPU platform device that implements a CSF interface.
+ * @glb_req: Global request register value.
+ * @glb_ack: Global acknowledge register value.
+ *
+ * Handles interrupts issued by the firmware that relate to the performance
+ * counters. For example, on completion of a performance counter sample. It is
+ * expected that the scheduler spinlock is already held on calling this
+ * function.
+ */
+static void process_prfcnt_interrupts(struct kbase_device *kbdev, u32 glb_req,
+				      u32 glb_ack)
+{
+	const struct kbase_csf_global_iface *const global_iface =
+		&kbdev->csf.global_iface;
+
+	lockdep_assert_held(&kbdev->csf.scheduler.interrupt_lock);
+
+	/* Process PRFCNT_SAMPLE interrupt. */
+	if (kbdev->csf.hwcnt.request_pending &&
+	    ((glb_req & GLB_REQ_PRFCNT_SAMPLE_MASK) ==
+	     (glb_ack & GLB_REQ_PRFCNT_SAMPLE_MASK))) {
+		kbdev->csf.hwcnt.request_pending = false;
+
+		dev_dbg(kbdev->dev, "PRFCNT_SAMPLE done interrupt received.");
+
+		kbase_hwcnt_backend_csf_on_prfcnt_sample(
+			&kbdev->hwcnt_gpu_iface);
+	}
+
+	/* Process PRFCNT_ENABLE interrupt. */
+	if (kbdev->csf.hwcnt.enable_pending &&
+	    ((glb_req & GLB_REQ_PRFCNT_ENABLE_MASK) ==
+	     (glb_ack & GLB_REQ_PRFCNT_ENABLE_MASK))) {
+		kbdev->csf.hwcnt.enable_pending = false;
+
+		dev_dbg(kbdev->dev,
+			"PRFCNT_ENABLE status changed interrupt received.");
+
+		if (glb_ack & GLB_REQ_PRFCNT_ENABLE_MASK)
+			kbase_hwcnt_backend_csf_on_prfcnt_enable(
+				&kbdev->hwcnt_gpu_iface);
+		else
+			kbase_hwcnt_backend_csf_on_prfcnt_disable(
+				&kbdev->hwcnt_gpu_iface);
+	}
+
+	/* Process PRFCNT_THRESHOLD interrupt. */
+	if ((glb_req ^ glb_ack) & GLB_REQ_PRFCNT_THRESHOLD_MASK) {
+		dev_dbg(kbdev->dev, "PRFCNT_THRESHOLD interrupt received.");
+
+		kbase_hwcnt_backend_csf_on_prfcnt_threshold(
+			&kbdev->hwcnt_gpu_iface);
+
+		/* Set the GLB_REQ.PRFCNT_THRESHOLD flag back to
+		 * the same value as GLB_ACK.PRFCNT_THRESHOLD
+		 * flag in order to enable reporting of another
+		 * PRFCNT_THRESHOLD event.
+		 */
+		kbase_csf_firmware_global_input_mask(
+			global_iface, GLB_REQ, glb_ack,
+			GLB_REQ_PRFCNT_THRESHOLD_MASK);
+	}
+
+	/* Process PRFCNT_OVERFLOW interrupt. */
+	if ((glb_req ^ glb_ack) & GLB_REQ_PRFCNT_OVERFLOW_MASK) {
+		dev_dbg(kbdev->dev, "PRFCNT_OVERFLOW interrupt received.");
+
+		kbase_hwcnt_backend_csf_on_prfcnt_overflow(
+			&kbdev->hwcnt_gpu_iface);
+
+		/* Set the GLB_REQ.PRFCNT_OVERFLOW flag back to
+		 * the same value as GLB_ACK.PRFCNT_OVERFLOW
+		 * flag in order to enable reporting of another
+		 * PRFCNT_OVERFLOW event.
+		 */
+		kbase_csf_firmware_global_input_mask(
+			global_iface, GLB_REQ, glb_ack,
+			GLB_REQ_PRFCNT_OVERFLOW_MASK);
+	}
+}
+
 void kbase_csf_interrupt(struct kbase_device *kbdev, u32 val)
 {
 	unsigned long flags;
@@ -2465,10 +2753,7 @@ void kbase_csf_interrupt(struct kbase_device *kbdev, u32 val)
 
 		if (!kbdev->csf.firmware_reloaded)
 			kbase_csf_firmware_reload_completed(kbdev);
-		else if (kbdev->csf.glb_init_request_pending)
-			kbase_pm_update_state(kbdev);
-
-		if (global_iface->output) {
+		else if (global_iface->output) {
 			u32 glb_req, glb_ack;
 
 			kbase_csf_scheduler_spin_lock(kbdev, &flags);
@@ -2485,8 +2770,41 @@ void kbase_csf_interrupt(struct kbase_device *kbdev, u32 val)
 				WARN_ON(!kbase_csf_scheduler_protected_mode_in_use(kbdev));
 				scheduler->active_protm_grp = NULL;
 				KBASE_KTRACE_ADD(kbdev, SCHEDULER_EXIT_PROTM, NULL, 0u);
+				kbdev->protected_mode = false;
+				kbase_ipa_control_protm_exited(kbdev);
+				kbase_hwcnt_backend_csf_protm_exited(
+					&kbdev->hwcnt_gpu_iface);
+			}
+
+			/* Handle IDLE Hysteresis notification event */
+			if ((glb_req ^ glb_ack) & GLB_REQ_IDLE_EVENT_MASK) {
+				dev_dbg(kbdev->dev, "Idle-hysteresis event flagged");
+				kbase_csf_firmware_global_input_mask(
+						global_iface, GLB_REQ, glb_ack,
+						GLB_REQ_IDLE_EVENT_MASK);
+
+				if (!atomic_read(&scheduler->non_idle_offslot_grps)) {
+					if (kbase_pm_idle_groups_sched_suspendable(kbdev))
+						queue_work(system_highpri_wq,
+							   &scheduler->gpu_idle_work);
+				} else {
+					/* Advance the scheduling tick to get
+					 * the non-idle suspended groups loaded
+					 * soon.
+					 */
+					kbase_csf_scheduler_advance_tick_nolock(
+						kbdev);
+				}
 			}
+
+			process_prfcnt_interrupts(kbdev, glb_req, glb_ack);
+
 			kbase_csf_scheduler_spin_unlock(kbdev, flags);
+
+			/* Invoke the MCU state machine as a state transition
+			 * might have completed.
+			 */
+			kbase_pm_update_state(kbdev);
 		}
 
 		if (!remaining) {
@@ -2545,3 +2863,62 @@ int kbase_csf_doorbell_mapping_init(struct kbase_device *kbdev)
 
 	return 0;
 }
+
+void kbase_csf_free_dummy_user_reg_page(struct kbase_device *kbdev)
+{
+	if (as_phys_addr_t(kbdev->csf.dummy_user_reg_page)) {
+		struct page *page = as_page(kbdev->csf.dummy_user_reg_page);
+
+		kbase_mem_pool_free(
+			&kbdev->mem_pools.small[KBASE_MEM_GROUP_CSF_FW], page,
+			false);
+	}
+}
+
+int kbase_csf_setup_dummy_user_reg_page(struct kbase_device *kbdev)
+{
+	struct tagged_addr phys;
+	struct page *page;
+	u32 *addr;
+	int ret;
+
+	kbdev->csf.dummy_user_reg_page = as_tagged(0);
+
+	ret = kbase_mem_pool_alloc_pages(
+		&kbdev->mem_pools.small[KBASE_MEM_GROUP_CSF_FW], 1, &phys,
+		false);
+
+	if (ret <= 0)
+		return ret;
+
+	page = as_page(phys);
+	addr = kmap_atomic(page);
+
+	/* Write a special value for the latest flush register inside the
+	 * dummy page
+	 */
+	addr[LATEST_FLUSH / sizeof(u32)] = POWER_DOWN_LATEST_FLUSH_VALUE;
+
+	kbase_sync_single_for_device(kbdev, kbase_dma_addr(page), sizeof(u32),
+				     DMA_BIDIRECTIONAL);
+	kunmap_atomic(addr);
+
+	kbdev->csf.dummy_user_reg_page = phys;
+
+	return 0;
+}
+
+u8 kbase_csf_priority_check(struct kbase_device *kbdev, u8 req_priority)
+{
+	struct priority_control_manager_device *pcm_device = kbdev->pcm_dev;
+	u8 out_priority = req_priority;
+
+	if (pcm_device) {
+		req_priority = kbase_csf_priority_queue_group_priority_to_relative(req_priority);
+		out_priority = pcm_device->ops.pcm_scheduler_priority_check(pcm_device, current, req_priority);
+		out_priority = kbase_csf_priority_relative_to_queue_group_priority(out_priority);
+	}
+
+	return out_priority;
+}
+
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf.h
index c183d0a32302..effd4686a444 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_CSF_H_
@@ -28,11 +27,11 @@
 #include "mali_kbase_csf_firmware.h"
 #include "mali_kbase_csf_protected_memory.h"
 
-/* Indicate invalid command stream h/w interface
+/* Indicate invalid CS h/w interface
  */
 #define KBASEP_IF_NR_INVALID ((s8)-1)
 
-/* Indicate invalid command stream group number for a GPU command queue group
+/* Indicate invalid CSG number for a GPU command queue group
  */
 #define KBASEP_CSG_NR_INVALID ((s8)-1)
 
@@ -40,13 +39,10 @@
  */
 #define KBASEP_USER_DB_NR_INVALID ((s8)-1)
 
-/* Waiting timeout for global request completion acknowledgment */
-#define GLB_REQ_WAIT_TIMEOUT_MS (300) /* 300 milliseconds */
-
-#define CSG_REQ_EP_CFG (0x1 << CSG_REQ_EP_CFG_SHIFT)
-#define CSG_REQ_SYNC_UPDATE (0x1 << CSG_REQ_SYNC_UPDATE_SHIFT)
 #define FIRMWARE_PING_INTERVAL_MS (2000) /* 2 seconds */
 
+#define FIRMWARE_IDLE_HYSTERESIS_TIME_MS (10) /* Default 10 milliseconds */
+
 /**
  * enum kbase_csf_event_callback_action - return type for CSF event callbacks.
  *
@@ -124,9 +120,9 @@ void kbase_csf_event_wait_remove(struct kbase_context *kctx,
 void kbase_csf_event_wait_remove_all(struct kbase_context *kctx);
 
 /**
- * kbase_csf_read_error - Read command stream fatal error
+ * kbase_csf_read_error - Read CS fatal error
  *
- * This function takes the command stream fatal error from context's ordered
+ * This function takes the CS fatal error from context's ordered
  * error_list, copies its contents to @event_data.
  *
  * @kctx:       The kbase context to read fatal error from
@@ -150,8 +146,8 @@ bool kbase_csf_error_pending(struct kbase_context *kctx);
  * kbase_csf_event_signal - Signal a CSF event
  *
  * This function triggers all the CSF event callbacks that are registered to
- * a given Kbase context, and also signals the thread of userspace driver
- * (front-end), waiting for the CSF event.
+ * a given Kbase context, and also signals the event handling thread of
+ * userspace driver waiting for the CSF event.
  *
  * @kctx:  The kbase context whose CSF event callbacks shall be triggered.
  * @notify_gpu: Flag to indicate if CSF firmware should be notified of the
@@ -171,8 +167,7 @@ static inline void kbase_csf_event_signal_cpu_only(struct kbase_context *kctx)
 }
 
 /**
- * kbase_csf_ctx_init - Initialize the command-stream front-end for a GPU
- *                      address space.
+ * kbase_csf_ctx_init - Initialize the CSF interface for a GPU address space.
  *
  * @kctx:	Pointer to the kbase context which is being initialized.
  *
@@ -194,8 +189,7 @@ void kbase_csf_ctx_handle_fault(struct kbase_context *kctx,
 		struct kbase_fault *fault);
 
 /**
- * kbase_csf_ctx_term - Terminate the command-stream front-end for a GPU
- *                      address space.
+ * kbase_csf_ctx_term - Terminate the CSF interface for a GPU address space.
  *
  * This function terminates any remaining CSGs and CSs which weren't destroyed
  * before context termination.
@@ -268,6 +262,16 @@ int kbase_csf_queue_bind(struct kbase_context *kctx,
  */
 void kbase_csf_queue_unbind(struct kbase_queue *queue);
 
+/**
+ * kbase_csf_queue_unbind_stopped - Unbind a GPU command queue in the case
+ *                                  where it was never started.
+ * @queue:      Pointer to queue to be unbound.
+ *
+ * Variant of kbase_csf_queue_unbind() for use on error paths for cleaning up
+ * queues that failed to fully bind.
+ */
+void kbase_csf_queue_unbind_stopped(struct kbase_queue *queue);
+
 /**
  * kbase_csf_queue_kick - Schedule a GPU command queue on the firmware
  *
@@ -280,7 +284,9 @@ void kbase_csf_queue_unbind(struct kbase_queue *queue);
 int kbase_csf_queue_kick(struct kbase_context *kctx,
 			 struct kbase_ioctl_cs_queue_kick *kick);
 
-/** Find if given the queue group handle is valid.
+/**
+ * kbase_csf_queue_group_handle_is_valid - Find if the given queue group handle
+ *                                         is valid.
  *
  * This function is used to determine if the queue group handle is valid.
  *
@@ -340,7 +346,6 @@ void kbase_csf_term_descheduled_queue_group(struct kbase_queue_group *group);
  *			suspended.
  * @sus_buf:		Pointer to the structure which contains details of the
  *			user buffer and its kernel pinned pages.
- * @size:		The size in bytes for the user provided buffer.
  * @group_handle:	Handle for the group which uniquely identifies it within
  *			the context within which it was created.
  *
@@ -350,6 +355,16 @@ void kbase_csf_term_descheduled_queue_group(struct kbase_queue_group *group);
 int kbase_csf_queue_group_suspend(struct kbase_context *kctx,
 	struct kbase_suspend_copy_buffer *sus_buf, u8 group_handle);
 
+/**
+ * kbase_csf_add_group_fatal_error - Report a fatal group error to userspace
+ *
+ * @group:       GPU command queue group.
+ * @err_payload: Error payload to report.
+ */
+void kbase_csf_add_group_fatal_error(
+	struct kbase_queue_group *const group,
+	struct base_gpu_queue_group_error const *const err_payload);
+
 /**
  * kbase_csf_interrupt - Handle interrupts issued by CSF firmware.
  *
@@ -359,55 +374,96 @@ int kbase_csf_queue_group_suspend(struct kbase_context *kctx,
 void kbase_csf_interrupt(struct kbase_device *kbdev, u32 val);
 
 /**
- * kbase_csf_doorbell_mapping_init - Initialize the bitmap of Hw doorbell pages
- *                           used to track their availability.
+ * kbase_csf_doorbell_mapping_init - Initialize the fields that facilitates
+ *                                   the update of userspace mapping of HW
+ *                                   doorbell page.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * The function creates a file and allocates a dummy page to facilitate the
+ * update of userspace mapping to point to the dummy page instead of the real
+ * HW doorbell page after the suspend of queue group.
+ *
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
+ *
+ * Return: 0 on success, or negative on failure.
  */
 int kbase_csf_doorbell_mapping_init(struct kbase_device *kbdev);
 
+/**
+ * kbase_csf_doorbell_mapping_term - Free the dummy page & close the file used
+ *                         to update the userspace mapping of HW doorbell page
+ *
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
+ */
 void kbase_csf_doorbell_mapping_term(struct kbase_device *kbdev);
 
 /**
- * kbase_csf_ring_csg_doorbell - ring the doorbell for a command stream group
- *                               interface.
+ * kbase_csf_setup_dummy_user_reg_page - Setup the dummy page that is accessed
+ *                                       instead of the User register page after
+ *                                       the GPU power down.
+ *
+ * The function allocates a dummy page which is used to replace the User
+ * register page in the userspace mapping after the power down of GPU.
+ * On the power up of GPU, the mapping is updated to point to the real
+ * User register page. The mapping is used to allow access to LATEST_FLUSH
+ * register from userspace.
+ *
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
+ *
+ * Return: 0 on success, or negative on failure.
+ */
+int kbase_csf_setup_dummy_user_reg_page(struct kbase_device *kbdev);
+
+/**
+ * kbase_csf_free_dummy_user_reg_page - Free the dummy page that was used
+ *                                 used to replace the User register page
+ *
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
+ */
+void kbase_csf_free_dummy_user_reg_page(struct kbase_device *kbdev);
+
+/**
+ * kbase_csf_ring_csg_doorbell - ring the doorbell for a CSG interface.
  *
- * The function kicks a notification on the command stream group interface to
- * firmware.
+ * The function kicks a notification on the CSG interface to firmware.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
- * @slot: Index of command stream group interface for ringing the door-bell.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
+ * @slot: Index of CSG interface for ringing the door-bell.
  */
 void kbase_csf_ring_csg_doorbell(struct kbase_device *kbdev, int slot);
 
 /**
- * kbase_csf_ring_csg_slots_doorbell - ring the doorbell for a set of command
- *                                     stream group interfaces.
+ * kbase_csf_ring_csg_slots_doorbell - ring the doorbell for a set of CSG
+ *                                     interfaces.
  *
- * The function kicks a notification on a set of command stream group
- * interfaces to firmware.
+ * The function kicks a notification on a set of CSG interfaces to firmware.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  * @slot_bitmap: bitmap for the given slots, slot-0 on bit-0, etc.
  */
 void kbase_csf_ring_csg_slots_doorbell(struct kbase_device *kbdev,
 				       u32 slot_bitmap);
 
 /**
- * kbase_csf_ring_cs_kernel_doorbell - ring the kernel doorbell for a queue
- *
- * The function kicks a notification to the firmware for the command stream
- * interface to which the queue is bound.
- *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
- * @queue: Pointer to the queue for ringing the door-bell.
+ * kbase_csf_ring_cs_kernel_doorbell - ring the kernel doorbell for a CSI
+ *                                     assigned to a GPU queue
+ *
+ * The function sends a doorbell interrupt notification to the firmware for
+ * a CSI assigned to a GPU queue.
+ *
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
+ * @csi_index: ID of the CSI assigned to the GPU queue.
+ * @csg_nr:    Index of the CSG slot assigned to the queue
+ *             group to which the GPU queue is bound.
+ * @ring_csg_doorbell: Flag to indicate if the CSG doorbell needs to be rung
+ *                     after updating the CSG_DB_REQ. So if this flag is false
+ *                     the doorbell interrupt will not be sent to FW.
+ *                     The flag is supposed be false only when the input page
+ *                     for bound GPU queues is programmed at the time of
+ *                     starting/resuming the group on a CSG slot.
  */
 void kbase_csf_ring_cs_kernel_doorbell(struct kbase_device *kbdev,
-			struct kbase_queue *queue);
+				       int csi_index, int csg_nr,
+				       bool ring_csg_doorbell);
 
 /**
  * kbase_csf_ring_cs_user_doorbell - ring the user doorbell allocated for a
@@ -416,8 +472,7 @@ void kbase_csf_ring_cs_kernel_doorbell(struct kbase_device *kbdev,
  * The function kicks a notification to the firmware on the doorbell assigned
  * to the queue.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  * @queue: Pointer to the queue for ringing the door-bell.
  */
 void kbase_csf_ring_cs_user_doorbell(struct kbase_device *kbdev,
@@ -427,9 +482,8 @@ void kbase_csf_ring_cs_user_doorbell(struct kbase_device *kbdev,
  * kbase_csf_active_queue_groups_reset - Reset the state of all active GPU
  *                            command queue groups associated with the context.
  *
- * @kbdev:     Instance of a GPU platform device that implements a command
- *             stream front-end interface.
- * @kctx:      The kbase context.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
+ * @kctx:  The kbase context.
  *
  * This function will iterate through all the active/scheduled GPU command
  * queue groups associated with the context, deschedule and mark them as
@@ -441,4 +495,54 @@ void kbase_csf_ring_cs_user_doorbell(struct kbase_device *kbdev,
 void kbase_csf_active_queue_groups_reset(struct kbase_device *kbdev,
 			struct kbase_context *kctx);
 
+/**
+ * kbase_csf_priority_check - Check the priority requested
+ *
+ * @kbdev:        Device pointer
+ * @req_priority: Requested priority
+ *
+ * This will determine whether the requested priority can be satisfied.
+ *
+ * Return: The same or lower priority than requested.
+ */
+u8 kbase_csf_priority_check(struct kbase_device *kbdev, u8 req_priority);
+
+extern const u8 kbasep_csf_queue_group_priority_to_relative[BASE_QUEUE_GROUP_PRIORITY_COUNT];
+extern const u8 kbasep_csf_relative_to_queue_group_priority[KBASE_QUEUE_GROUP_PRIORITY_COUNT];
+
+/**
+ * kbase_csf_priority_relative_to_queue_group_priority - Convert relative to base priority
+ *
+ * @priority: kbase relative priority
+ *
+ * This will convert the monotonically increasing realtive priority to the
+ * fixed base priority list.
+ *
+ * Return: base_queue_group_priority priority.
+ */
+static inline u8 kbase_csf_priority_relative_to_queue_group_priority(u8 priority)
+{
+	if (priority >= KBASE_QUEUE_GROUP_PRIORITY_COUNT)
+		priority = KBASE_QUEUE_GROUP_PRIORITY_LOW;
+	return kbasep_csf_relative_to_queue_group_priority[priority];
+}
+
+/**
+ * kbase_csf_priority_queue_group_priority_to_relative - Convert base priority to relative
+ *
+ * @priority: base_queue_group_priority priority
+ *
+ * This will convert the fixed base priority list to monotonically increasing realtive priority.
+ *
+ * Return: kbase relative priority.
+ */
+static inline u8 kbase_csf_priority_queue_group_priority_to_relative(u8 priority)
+{
+	/* Apply low priority in case of invalid priority */
+	if (priority >= BASE_QUEUE_GROUP_PRIORITY_COUNT)
+		priority = BASE_QUEUE_GROUP_PRIORITY_LOW;
+	return kbasep_csf_queue_group_priority_to_relative[priority];
+}
+
+
 #endif /* _KBASE_CSF_H_ */
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_cpu_queue_debugfs.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_cpu_queue_debugfs.c
new file mode 100644
index 000000000000..b54b2fc31939
--- /dev/null
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_cpu_queue_debugfs.c
@@ -0,0 +1,191 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ *
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+#include "mali_kbase_csf_cpu_queue_debugfs.h"
+#include <mali_kbase.h>
+#include <linux/seq_file.h>
+
+#ifdef CONFIG_DEBUG_FS
+
+bool kbase_csf_cpu_queue_read_dump_req(struct kbase_context *kctx,
+					struct base_csf_notification *req)
+{
+	if (atomic_cmpxchg(&kctx->csf.cpu_queue.dump_req_status,
+			   BASE_CSF_CPU_QUEUE_DUMP_ISSUED,
+			   BASE_CSF_CPU_QUEUE_DUMP_PENDING) !=
+		BASE_CSF_CPU_QUEUE_DUMP_ISSUED) {
+		return false;
+	}
+
+	req->type = BASE_CSF_NOTIFICATION_CPU_QUEUE_DUMP;
+	return true;
+}
+
+/**
+ * kbasep_csf_cpu_queue_debugfs_show() - Print cpu queue information for per context
+ *
+ * @file: The seq_file for printing to
+ * @data: The debugfs dentry private data, a pointer to kbase_context
+ *
+ * Return: Negative error code or 0 on success.
+ */
+static int kbasep_csf_cpu_queue_debugfs_show(struct seq_file *file, void *data)
+{
+	struct kbase_context *kctx = file->private;
+
+	mutex_lock(&kctx->csf.lock);
+	if (atomic_read(&kctx->csf.cpu_queue.dump_req_status) !=
+				BASE_CSF_CPU_QUEUE_DUMP_COMPLETE) {
+		seq_printf(file, "Dump request already started! (try again)\n");
+		mutex_unlock(&kctx->csf.lock);
+		return -EBUSY;
+	}
+
+	atomic_set(&kctx->csf.cpu_queue.dump_req_status, BASE_CSF_CPU_QUEUE_DUMP_ISSUED);
+	init_completion(&kctx->csf.cpu_queue.dump_cmp);
+	kbase_event_wakeup(kctx);
+	mutex_unlock(&kctx->csf.lock);
+
+	seq_printf(file, "CPU Queues table (version:v%u):\n", MALI_CSF_CPU_QUEUE_DEBUGFS_VERSION);
+
+	wait_for_completion_timeout(&kctx->csf.cpu_queue.dump_cmp,
+			msecs_to_jiffies(3000));
+
+	mutex_lock(&kctx->csf.lock);
+	if (kctx->csf.cpu_queue.buffer) {
+		WARN_ON(atomic_read(&kctx->csf.cpu_queue.dump_req_status) !=
+				    BASE_CSF_CPU_QUEUE_DUMP_PENDING);
+
+		seq_printf(file, "%s\n", kctx->csf.cpu_queue.buffer);
+
+		kfree(kctx->csf.cpu_queue.buffer);
+		kctx->csf.cpu_queue.buffer = NULL;
+		kctx->csf.cpu_queue.buffer_size = 0;
+	}
+	else
+		seq_printf(file, "Dump error! (time out)\n");
+
+	atomic_set(&kctx->csf.cpu_queue.dump_req_status,
+			BASE_CSF_CPU_QUEUE_DUMP_COMPLETE);
+
+	mutex_unlock(&kctx->csf.lock);
+	return 0;
+}
+
+static int kbasep_csf_cpu_queue_debugfs_open(struct inode *in, struct file *file)
+{
+	return single_open(file, kbasep_csf_cpu_queue_debugfs_show, in->i_private);
+}
+
+static const struct file_operations kbasep_csf_cpu_queue_debugfs_fops = {
+	.open = kbasep_csf_cpu_queue_debugfs_open,
+	.read = seq_read,
+	.llseek = seq_lseek,
+	.release = single_release,
+};
+
+void kbase_csf_cpu_queue_debugfs_init(struct kbase_context *kctx)
+{
+	struct dentry *file;
+
+	if (WARN_ON(!kctx || IS_ERR_OR_NULL(kctx->kctx_dentry)))
+		return;
+
+	file = debugfs_create_file("cpu_queue", 0444, kctx->kctx_dentry,
+			kctx, &kbasep_csf_cpu_queue_debugfs_fops);
+
+	if (IS_ERR_OR_NULL(file)) {
+		dev_warn(kctx->kbdev->dev,
+				"Unable to create cpu queue debugfs entry");
+	}
+
+	kctx->csf.cpu_queue.buffer = NULL;
+	kctx->csf.cpu_queue.buffer_size = 0;
+	atomic_set(&kctx->csf.cpu_queue.dump_req_status,
+		   BASE_CSF_CPU_QUEUE_DUMP_COMPLETE);
+}
+
+int kbase_csf_cpu_queue_dump(struct kbase_context *kctx,
+		u64 buffer, size_t buf_size)
+{
+	int err = 0;
+
+	size_t alloc_size = buf_size;
+	char *dump_buffer;
+
+	if (!buffer || !alloc_size)
+		goto done;
+
+	alloc_size = (alloc_size + PAGE_SIZE) & ~(PAGE_SIZE - 1);
+	dump_buffer = kzalloc(alloc_size, GFP_KERNEL);
+	if (ZERO_OR_NULL_PTR(dump_buffer)) {
+		err = -ENOMEM;
+		goto done;
+	}
+
+	WARN_ON(kctx->csf.cpu_queue.buffer != NULL);
+
+	err = copy_from_user(dump_buffer,
+			u64_to_user_ptr(buffer),
+			buf_size);
+	if (err) {
+		kfree(dump_buffer);
+		err = -EFAULT;
+		goto done;
+	}
+
+	mutex_lock(&kctx->csf.lock);
+
+	kfree(kctx->csf.cpu_queue.buffer);
+
+	if (atomic_read(&kctx->csf.cpu_queue.dump_req_status) ==
+			BASE_CSF_CPU_QUEUE_DUMP_PENDING) {
+		kctx->csf.cpu_queue.buffer = dump_buffer;
+		kctx->csf.cpu_queue.buffer_size = buf_size;
+		complete_all(&kctx->csf.cpu_queue.dump_cmp);
+	} else {
+		kfree(dump_buffer);
+	}
+
+	mutex_unlock(&kctx->csf.lock);
+done:
+	return err;
+}
+#else
+/*
+ * Stub functions for when debugfs is disabled
+ */
+void kbase_csf_cpu_queue_debugfs_init(struct kbase_context *kctx)
+{
+}
+
+bool kbase_csf_cpu_queue_read_dump_req(struct kbase_context *kctx,
+					struct base_csf_notification *req)
+{
+	return false;
+}
+
+int kbase_csf_cpu_queue_dump(struct kbase_context *kctx,
+			u64 buffer, size_t buf_size)
+{
+	return 0;
+}
+#endif /* CONFIG_DEBUG_FS */
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_cpu_queue_debugfs.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_cpu_queue_debugfs.h
new file mode 100644
index 000000000000..36336497209e
--- /dev/null
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_cpu_queue_debugfs.h
@@ -0,0 +1,90 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ *
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+#ifndef _KBASE_CSF_CPU_QUEUE_DEBUGFS_H_
+#define _KBASE_CSF_CPU_QUEUE_DEBUGFS_H_
+
+#include <asm/atomic.h>
+#include <linux/types.h>
+
+#include "mali_kbase.h"
+
+/* Forward declaration */
+struct base_csf_notification;
+
+#define MALI_CSF_CPU_QUEUE_DEBUGFS_VERSION 0
+
+/* CPU queue dump status */
+/* Dumping is done or no dumping is in progress. */
+#define BASE_CSF_CPU_QUEUE_DUMP_COMPLETE	0
+/* Dumping request is pending. */
+#define BASE_CSF_CPU_QUEUE_DUMP_PENDING		1
+/* Dumping request is issued to Userspace */
+#define BASE_CSF_CPU_QUEUE_DUMP_ISSUED		2
+
+
+/**
+ * kbase_csf_cpu_queue_debugfs_init() - Create a debugfs entry for per context cpu queue(s)
+ *
+ * @kctx: The kbase_context for which to create the debugfs entry
+ */
+void kbase_csf_cpu_queue_debugfs_init(struct kbase_context *kctx);
+
+/**
+ * kbase_csf_cpu_queue_read_dump_req - Read cpu queue dump request event
+ *
+ * @kctx: The kbase_context which cpu queue dumpped belongs to
+ * @req:  Notification with cpu queue dump request.
+ *
+ * Return: true if needs CPU queue dump, or false otherwise.
+ */
+bool kbase_csf_cpu_queue_read_dump_req(struct kbase_context *kctx,
+					struct base_csf_notification *req);
+
+/**
+ * kbase_csf_cpu_queue_dump_needed - Check the requirement for cpu queue dump
+ *
+ * @kctx: The kbase_context which cpu queue dumpped belongs to
+ *
+ * Return: true if it needs cpu queue dump, or false otherwise.
+ */
+static inline bool kbase_csf_cpu_queue_dump_needed(struct kbase_context *kctx)
+{
+#ifdef CONFIG_DEBUG_FS
+	return (atomic_read(&kctx->csf.cpu_queue.dump_req_status) ==
+		BASE_CSF_CPU_QUEUE_DUMP_ISSUED);
+#else
+	return false;
+#endif
+}
+
+/**
+ * kbase_csf_cpu_queue_dump - dump buffer containing cpu queue information to debugfs
+ *
+ * @kctx: The kbase_context which cpu queue dumpped belongs to
+ * @buffer: Buffer containing the cpu queue information.
+ * @buf_size: Buffer size.
+ *
+ * Return: Return 0 for dump successfully, or error code.
+ */
+int kbase_csf_cpu_queue_dump(struct kbase_context *kctx,
+		u64 buffer, size_t buf_size);
+#endif /* _KBASE_CSF_CPU_QUEUE_DEBUGFS_H_ */
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_csg_debugfs.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_csg_debugfs.c
index fd8329ba9422..389468307e5f 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_csg_debugfs.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_csg_debugfs.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "mali_kbase_csf_csg_debugfs.h"
@@ -29,12 +28,37 @@
 #ifdef CONFIG_DEBUG_FS
 #include "mali_kbase_csf_tl_reader.h"
 
+/**
+ * blocked_reason_to_string() - Convert blocking reason id to a string
+ *
+ * @reason_id: blocked_reason
+ *
+ * Return: Suitable string
+ */
+static const char *blocked_reason_to_string(u32 reason_id)
+{
+	/* possible blocking reasons of a cs */
+	static const char *const cs_blocked_reason[] = {
+		[CS_STATUS_BLOCKED_REASON_REASON_UNBLOCKED] = "UNBLOCKED",
+		[CS_STATUS_BLOCKED_REASON_REASON_WAIT] = "WAIT",
+		[CS_STATUS_BLOCKED_REASON_REASON_PROGRESS_WAIT] =
+			"PROGRESS_WAIT",
+		[CS_STATUS_BLOCKED_REASON_REASON_SYNC_WAIT] = "SYNC_WAIT",
+		[CS_STATUS_BLOCKED_REASON_REASON_DEFERRED] = "DEFERRED",
+		[CS_STATUS_BLOCKED_REASON_REASON_RESOURCE] = "RESOURCE",
+		[CS_STATUS_BLOCKED_REASON_REASON_FLUSH] = "FLUSH"
+	};
+
+	if (WARN_ON(reason_id >= ARRAY_SIZE(cs_blocked_reason)))
+		return "UNKNOWN_BLOCKED_REASON_ID";
+
+	return cs_blocked_reason[reason_id];
+}
+
 static void kbasep_csf_scheduler_dump_active_queue_cs_status_wait(
-		struct seq_file *file,
-		u32 wait_status,
-		u32 wait_sync_value,
-		u64 wait_sync_live_value,
-		u64 wait_sync_pointer)
+	struct seq_file *file, u32 wait_status, u32 wait_sync_value,
+	u64 wait_sync_live_value, u64 wait_sync_pointer, u32 sb_status,
+	u32 blocked_reason)
 {
 #define WAITING "Waiting"
 #define NOT_WAITING "Not waiting"
@@ -56,6 +80,11 @@ static void kbasep_csf_scheduler_dump_active_queue_cs_status_wait(
 	seq_printf(file, "SYNC_POINTER: 0x%llx\n", wait_sync_pointer);
 	seq_printf(file, "SYNC_VALUE: %d\n", wait_sync_value);
 	seq_printf(file, "SYNC_LIVE_VALUE: 0x%016llx\n", wait_sync_live_value);
+	seq_printf(file, "SB_STATUS: %u\n",
+		   CS_STATUS_SCOREBOARDS_NONZERO_GET(sb_status));
+	seq_printf(file, "BLOCKED_REASON: %s\n",
+		   blocked_reason_to_string(CS_STATUS_BLOCKED_REASON_REASON_GET(
+			   blocked_reason)));
 }
 
 /**
@@ -74,6 +103,8 @@ static void kbasep_csf_scheduler_dump_active_queue(struct seq_file *file,
 	u32 cs_active;
 	u64 wait_sync_pointer;
 	u32 wait_status, wait_sync_value;
+	u32 sb_status;
+	u32 blocked_reason;
 	struct kbase_vmap_struct *mapping;
 	u64 *evt;
 	u64 wait_sync_live_value;
@@ -109,6 +140,8 @@ static void kbasep_csf_scheduler_dump_active_queue(struct seq_file *file,
 			wait_status = queue->status_wait;
 			wait_sync_value = queue->sync_value;
 			wait_sync_pointer = queue->sync_ptr;
+			sb_status = queue->sb_status;
+			blocked_reason = queue->blocked_reason;
 
 			evt = (u64 *)kbase_phy_alloc_mapping_get(queue->kctx, wait_sync_pointer, &mapping);
 			if (evt) {
@@ -120,7 +153,8 @@ static void kbasep_csf_scheduler_dump_active_queue(struct seq_file *file,
 
 			kbasep_csf_scheduler_dump_active_queue_cs_status_wait(
 				file, wait_status, wait_sync_value,
-				wait_sync_live_value, wait_sync_pointer);
+				wait_sync_live_value, wait_sync_pointer,
+				sb_status, blocked_reason);
 		}
 	} else {
 		struct kbase_device const *const kbdev =
@@ -161,6 +195,11 @@ static void kbasep_csf_scheduler_dump_active_queue(struct seq_file *file,
 		wait_sync_pointer |= (u64)kbase_csf_firmware_cs_output(stream,
 					CS_STATUS_WAIT_SYNC_POINTER_HI) << 32;
 
+		sb_status = kbase_csf_firmware_cs_output(stream,
+							 CS_STATUS_SCOREBOARDS);
+		blocked_reason = kbase_csf_firmware_cs_output(
+			stream, CS_STATUS_BLOCKED_REASON);
+
 		evt = (u64 *)kbase_phy_alloc_mapping_get(queue->kctx, wait_sync_pointer, &mapping);
 		if (evt) {
 			wait_sync_live_value = evt[0];
@@ -171,7 +210,8 @@ static void kbasep_csf_scheduler_dump_active_queue(struct seq_file *file,
 
 		kbasep_csf_scheduler_dump_active_queue_cs_status_wait(
 			file, wait_status, wait_sync_value,
-			wait_sync_live_value, wait_sync_pointer);
+			wait_sync_live_value, wait_sync_pointer, sb_status,
+			blocked_reason);
 	}
 
 	seq_puts(file, "\n");
@@ -428,6 +468,61 @@ DEFINE_SIMPLE_ATTRIBUTE(kbasep_csf_debugfs_scheduling_timer_kick_fops,
 		&kbasep_csf_debugfs_scheduling_timer_kick_set,
 		"%llu\n");
 
+/**
+ * kbase_csf_debugfs_scheduler_suspend_get() - get if the scheduler is suspended.
+ *
+ * @data: The debugfs dentry private data, a pointer to kbase_device
+ * @val: The debugfs output value, boolean: 1 suspended, 0 otherwise
+ *
+ * Return: 0
+ */
+static int kbase_csf_debugfs_scheduler_suspend_get(
+		void *data, u64 *val)
+{
+	struct kbase_device *kbdev = data;
+	struct kbase_csf_scheduler *scheduler = &kbdev->csf.scheduler;
+
+	kbase_csf_scheduler_lock(kbdev);
+	*val = (scheduler->state == SCHED_SUSPENDED);
+	kbase_csf_scheduler_unlock(kbdev);
+
+	return 0;
+}
+
+/**
+ * kbase_csf_debugfs_scheduler_suspend_set() - set the scheduler to suspended.
+ *
+ * @data: The debugfs dentry private data, a pointer to kbase_device
+ * @val: The debugfs input value, boolean: 1 suspend, 0 otherwise
+ *
+ * Return: Negative value if already in requested state, 0 otherwise.
+ */
+static int kbase_csf_debugfs_scheduler_suspend_set(
+		void *data, u64 val)
+{
+	struct kbase_device *kbdev = data;
+	struct kbase_csf_scheduler *scheduler = &kbdev->csf.scheduler;
+	enum kbase_csf_scheduler_state state;
+
+	kbase_csf_scheduler_lock(kbdev);
+	state = scheduler->state;
+	kbase_csf_scheduler_unlock(kbdev);
+
+	if (val && (state != SCHED_SUSPENDED))
+		kbase_csf_scheduler_pm_suspend(kbdev);
+	else if (!val && (state == SCHED_SUSPENDED))
+		kbase_csf_scheduler_pm_resume(kbdev);
+	else
+		return -1;
+
+	return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(kbasep_csf_debugfs_scheduler_suspend_fops,
+		&kbase_csf_debugfs_scheduler_suspend_get,
+		&kbase_csf_debugfs_scheduler_suspend_set,
+		"%llu\n");
+
 void kbase_csf_debugfs_init(struct kbase_device *kbdev)
 {
 	debugfs_create_file("active_groups", 0444,
@@ -440,6 +535,9 @@ void kbase_csf_debugfs_init(struct kbase_device *kbdev)
 	debugfs_create_file("scheduling_timer_kick", 0200,
 			kbdev->mali_debugfs_directory, kbdev,
 			&kbasep_csf_debugfs_scheduling_timer_kick_fops);
+	debugfs_create_file("scheduler_suspend", 0644,
+			kbdev->mali_debugfs_directory, kbdev,
+			&kbasep_csf_debugfs_scheduler_suspend_fops);
 
 	kbase_csf_tl_reader_debugfs_init(kbdev);
 	kbase_csf_firmware_trace_buffer_debugfs_init(kbdev);
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_csg_debugfs.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_csg_debugfs.h
index c2e99d386f8c..c6a86b6d814b 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_csg_debugfs.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_csg_debugfs.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_CSF_CSG_DEBUGFS_H_
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_defs.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_defs.h
index 3829572a1aeb..05173990c6d8 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_defs.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_defs.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,11 +17,9 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-/* Definitions (types, defines, etcs) common to the command stream frontend.
+/* Definitions (types, defines, etcs) common to the CSF.
  * They are placed here to allow the hierarchy of header files to work.
  */
 
@@ -46,6 +45,14 @@
  */
 #define MAX_TILER_HEAPS (128)
 
+#define CSF_FIRMWARE_ENTRY_READ       (1ul << 0)
+#define CSF_FIRMWARE_ENTRY_WRITE      (1ul << 1)
+#define CSF_FIRMWARE_ENTRY_EXECUTE    (1ul << 2)
+#define CSF_FIRMWARE_ENTRY_CACHE_MODE (3ul << 3)
+#define CSF_FIRMWARE_ENTRY_PROTECTED  (1ul << 5)
+#define CSF_FIRMWARE_ENTRY_SHARED     (1ul << 30)
+#define CSF_FIRMWARE_ENTRY_ZERO       (1ul << 31)
+
 /**
  * enum kbase_csf_bind_state - bind state of the queue
  *
@@ -66,18 +73,36 @@ enum kbase_csf_queue_bind_state {
  * enum kbase_csf_reset_gpu_state - state of the gpu reset
  *
  * @KBASE_CSF_RESET_GPU_NOT_PENDING: Set when the GPU reset isn't pending
+ *
+ * @KBASE_CSF_RESET_GPU_PREPARED: Set when kbase_prepare_to_reset_gpu() has
+ * been called. This is just for debugging checks to encourage callers to call
+ * kbase_prepare_to_reset_gpu() before kbase_reset_gpu().
+ *
+ * @KBASE_CSF_RESET_GPU_COMMITTED: Set when the GPU reset process has been
+ * committed and so will definitely happen, but the procedure to reset the GPU
+ * has not yet begun. Other threads must finish accessing the HW before we
+ * reach %KBASE_CSF_RESET_GPU_HAPPENING.
+ *
  * @KBASE_CSF_RESET_GPU_HAPPENING: Set when the GPU reset process is occurring
- * @KBASE_CSF_RESET_GPU_SILENT: Set when the GPU reset process is occurring,
- * used when resetting the GPU as part of normal behavior (e.g. when exiting
- * protected mode).
+ * (silent or otherwise), and is actively accessing the HW. Any changes to the
+ * HW in other threads might get lost, overridden, or corrupted.
+ *
+ * @KBASE_CSF_RESET_GPU_COMMITTED_SILENT: Set when the GPU reset process has
+ * been committed but has not started happening. This is used when resetting
+ * the GPU as part of normal behavior (e.g. when exiting protected mode).
+ * Other threads must finish accessing the HW before we reach
+ * %KBASE_CSF_RESET_GPU_HAPPENING.
+ *
  * @KBASE_CSF_RESET_GPU_FAILED: Set when an error is encountered during the
  * GPU reset process. No more work could then be executed on GPU, unloading
  * the Driver module is the only option.
  */
 enum kbase_csf_reset_gpu_state {
 	KBASE_CSF_RESET_GPU_NOT_PENDING,
+	KBASE_CSF_RESET_GPU_PREPARED,
+	KBASE_CSF_RESET_GPU_COMMITTED,
 	KBASE_CSF_RESET_GPU_HAPPENING,
-	KBASE_CSF_RESET_GPU_SILENT,
+	KBASE_CSF_RESET_GPU_COMMITTED_SILENT,
 	KBASE_CSF_RESET_GPU_FAILED,
 };
 
@@ -86,17 +111,17 @@ enum kbase_csf_reset_gpu_state {
  *
  * @KBASE_CSF_GROUP_INACTIVE:          Group is inactive and won't be
  *                                     considered by scheduler for running on
- *                                     command stream group slot.
+ *                                     CSG slot.
  * @KBASE_CSF_GROUP_RUNNABLE:          Group is in the list of runnable groups
  *                                     and is subjected to time-slice based
  *                                     scheduling. A start request would be
  *                                     sent (or already has been sent) if the
- *                                     group is assigned the command stream
+ *                                     group is assigned the CS
  *                                     group slot for the fist time.
- * @KBASE_CSF_GROUP_IDLE:              Group is currently on a command stream
- *                                     group slot but all the command streams
- *                                     bound to the group have become either
- *                                     idle or waiting on sync object.
+ * @KBASE_CSF_GROUP_IDLE:              Group is currently on a CSG slot
+ *                                     but all the CSs bound to the group have
+ *                                     become either idle or waiting on sync
+ *                                     object.
  *                                     Group could be evicted from the slot on
  *                                     the next tick if there are no spare
  *                                     slots left after scheduling non-idle
@@ -110,12 +135,11 @@ enum kbase_csf_reset_gpu_state {
  *                                     KBASE_CSF_GROUP_SUSPENDED_ON_IDLE or
  *                                     KBASE_CSF_GROUP_SUSPENDED_ON_WAIT_SYNC
  *                                     state.
- * @KBASE_CSF_GROUP_SUSPENDED:         Group was evicted from the command
- *                                     stream group slot and is not running but
- *                                     is still in the list of runnable groups
- *                                     and subjected to time-slice based
- *                                     scheduling. A resume request would be
- *                                     sent when a command stream group slot is
+ * @KBASE_CSF_GROUP_SUSPENDED:         Group was evicted from the CSG slot
+ *                                     and is not running but is still in the
+ *                                     list of runnable groups and subjected
+ *                                     to time-slice based scheduling. A resume
+ *                                     request would be sent when a CSG slot is
  *                                     re-assigned to the group and once the
  *                                     resume is complete group would be moved
  *                                     back to the RUNNABLE state.
@@ -128,8 +152,8 @@ enum kbase_csf_reset_gpu_state {
  *                                     bound to the group is kicked it would be
  *                                     moved to the SUSPENDED state.
  * @KBASE_CSF_GROUP_SUSPENDED_ON_WAIT_SYNC: Same as GROUP_SUSPENDED_ON_IDLE
- *                                          except that at least one command
- *                                          stream bound to this group was
+ *                                          except that at least one CS
+ *                                          bound to this group was
  *                                          waiting for synchronization object
  *                                          before the suspension.
  * @KBASE_CSF_GROUP_FAULT_EVICTED:     Group is evicted from the scheduler due
@@ -185,10 +209,10 @@ enum kbase_csf_csg_slot_state {
  * enum kbase_csf_scheduler_state - state of the scheduler operational phases.
  *
  * @SCHED_BUSY:         The scheduler is busy performing on tick schedule
- *                      operations, the state of command stream group slots
+ *                      operations, the state of CSG slots
  *                      can't be changed.
  * @SCHED_INACTIVE:     The scheduler is inactive, it is allowed to modify the
- *                      state of command stream group slots by in-cycle
+ *                      state of CSG slots by in-cycle
  *                      priority scheduling.
  * @SCHED_SUSPENDED:    The scheduler is in low-power mode with scheduling
  *                      operations suspended and is not holding the power
@@ -202,6 +226,24 @@ enum kbase_csf_scheduler_state {
 	SCHED_SUSPENDED,
 };
 
+/**
+ * enum kbase_queue_group_priority - Kbase internal relative priority list.
+ *
+ * @KBASE_QUEUE_GROUP_PRIORITY_REALTIME:  The realtime queue group priority.
+ * @KBASE_QUEUE_GROUP_PRIORITY_HIGH:      The high queue group priority.
+ * @KBASE_QUEUE_GROUP_PRIORITY_MEDIUM:    The medium queue group priority.
+ * @KBASE_QUEUE_GROUP_PRIORITY_LOW:       The low queue group priority.
+ * @KBASE_QUEUE_GROUP_PRIORITY_COUNT:     The number of priority levels.
+ */
+enum kbase_queue_group_priority {
+	KBASE_QUEUE_GROUP_PRIORITY_REALTIME = 0,
+	KBASE_QUEUE_GROUP_PRIORITY_HIGH,
+	KBASE_QUEUE_GROUP_PRIORITY_MEDIUM,
+	KBASE_QUEUE_GROUP_PRIORITY_LOW,
+	KBASE_QUEUE_GROUP_PRIORITY_COUNT
+};
+
+
 /**
  * struct kbase_csf_notification - Event or error generated as part of command
  *                                 queue execution
@@ -240,37 +282,43 @@ struct kbase_csf_notification {
  * @refcount:    Reference count, stands for the number of times the queue
  *               has been referenced. The reference is taken when it is
  *               created, when it is bound to the group and also when the
- *               @oom_event_work or @fault_event_work work item is queued
+ *               @oom_event_work work item is queued
  *               for it.
  * @group:       Pointer to the group to which this queue is bound.
- * @queue_reg:   Pointer to the VA region allocated for command
- *               stream buffer.
+ * @queue_reg:   Pointer to the VA region allocated for CS buffer.
  * @oom_event_work: Work item corresponding to the out of memory event for
  *                  chunked tiler heap being used for this queue.
- * @fault_event_work: Work item corresponding to the firmware fault event.
- * @base_addr:      Base address of the command stream buffer.
- * @size:           Size of the command stream buffer.
+ * @base_addr:      Base address of the CS buffer.
+ * @size:           Size of the CS buffer.
  * @priority:       Priority of this queue within the group.
- * @bind_state:     Bind state of the queue.
- * @csi_index:      The ID of the assigned command stream hardware interface.
- * @enabled:        Indicating whether the command stream is running, or not.
- * @status_wait:    Value of CS_STATUS_WAIT register of the command stream will
- *                  be kept when the command stream gets blocked by sync wait.
+ * @bind_state:     Bind state of the queue as enum @kbase_csf_queue_bind_state
+ * @csi_index:      The ID of the assigned CS hardware interface.
+ * @enabled:        Indicating whether the CS is running, or not.
+ * @status_wait:    Value of CS_STATUS_WAIT register of the CS will
+ *                  be kept when the CS gets blocked by sync wait.
  *                  CS_STATUS_WAIT provides information on conditions queue is
  *                  blocking on. This is set when the group, to which queue is
  *                  bound, is suspended after getting blocked, i.e. in
  *                  KBASE_CSF_GROUP_SUSPENDED_ON_WAIT_SYNC state.
- * @sync_ptr:       Value of CS_STATUS_WAIT_SYNC_POINTER register of the command
- *                  stream will be kept when the command stream gets blocked by
+ * @sync_ptr:       Value of CS_STATUS_WAIT_SYNC_POINTER register of the CS
+ *                  will be kept when the CS gets blocked by
  *                  sync wait. CS_STATUS_WAIT_SYNC_POINTER contains the address
  *                  of synchronization object being waited on.
  *                  Valid only when @status_wait is set.
- * @sync_value:     Value of CS_STATUS_WAIT_SYNC_VALUE register of the command
- *                  stream will be kept when the command stream gets blocked by
+ * @sync_value:     Value of CS_STATUS_WAIT_SYNC_VALUE register of the CS
+ *                  will be kept when the CS gets blocked by
  *                  sync wait. CS_STATUS_WAIT_SYNC_VALUE contains the value
  *                  tested against the synchronization object.
  *                  Valid only when @status_wait is set.
+ * @sb_status:      Value indicates which of the scoreboard entries in the queue
+ *                  are non-zero
+ * @blocked_reason: Value shows if the queue is blocked, and if so,
+ *                  the reason why it is blocked
  * @error:          GPU command queue fatal information to pass to user space.
+ * @fatal_event_work: Work item to handle the CS fatal event reported for this
+ *                    queue.
+ * @cs_fatal_info:    Records additional information about the CS fatal event.
+ * @cs_fatal:         Records information about the CS fatal event.
  */
 struct kbase_queue {
 	struct kbase_context *kctx;
@@ -285,17 +333,21 @@ struct kbase_queue {
 	struct kbase_queue_group *group;
 	struct kbase_va_region *queue_reg;
 	struct work_struct oom_event_work;
-	struct work_struct fault_event_work;
 	u64 base_addr;
 	u32 size;
 	u8 priority;
-	u8 bind_state;
 	s8 csi_index;
+	enum kbase_csf_queue_bind_state bind_state;
 	bool enabled;
 	u32 status_wait;
 	u64 sync_ptr;
 	u32 sync_value;
+	u32 sb_status;
+	u32 blocked_reason;
 	struct kbase_csf_notification error;
+	struct work_struct fatal_event_work;
+	u64 cs_fatal_info;
+	u32 cs_fatal;
 };
 
 /**
@@ -335,9 +387,9 @@ struct kbase_protected_suspend_buffer {
  *				buffer. Protected-mode suspend buffer that is
  *				used for group context switch.
  * @handle:         Handle which identifies this queue group.
- * @csg_nr:         Number/index of the command stream group to
- *                  which this queue group is mapped; KBASEP_CSG_NR_INVALID
- *                  indicates that the queue group is not scheduled.
+ * @csg_nr:         Number/index of the CSG to which this queue group is
+ *                  mapped; KBASEP_CSG_NR_INVALID indicates that the queue
+ *                  group is not scheduled.
  * @priority:       Priority of the queue group, 0 being the highest,
  *                  BASE_QUEUE_GROUP_PRIORITY_COUNT - 1 being the lowest.
  * @tiler_max:      Maximum number of tiler endpoints the group is allowed
@@ -349,18 +401,21 @@ struct kbase_protected_suspend_buffer {
  * @tiler_mask:     Mask of tiler endpoints the group is allowed to use.
  * @fragment_mask:  Mask of fragment endpoints the group is allowed to use.
  * @compute_mask:   Mask of compute endpoints the group is allowed to use.
+ * @group_uid:      32-bit wide unsigned identifier for the group, unique
+ *                  across all kbase devices and contexts.
  * @link:           Link to this queue group in the 'runnable_groups' list of
  *                  the corresponding kctx.
  * @link_to_schedule: Link to this queue group in the list of prepared groups
  *                    to be scheduled, if the group is runnable/suspended.
  *                    If the group is idle or waiting for CQS, it would be a
  *                    link to the list of idle/blocked groups list.
- * @timer_event_work: Work item corresponding to the event generated when a task
- *                    started by a queue in this group takes too long to execute
- *                    on an endpoint.
  * @run_state:      Current state of the queue group.
  * @prepared_seq_num: Indicates the position of queue group in the list of
  *                    prepared groups to be scheduled.
+ * @scan_seq_num:     Scan out sequence number before adjusting for dynamic
+ *                    idle conditions. It is used for setting a group's
+ *                    onslot priority. It could differ from prepared_seq_number
+ *                    when there are idle groups.
  * @faulted:          Indicates that a GPU fault occurred for the queue group.
  *                    This flag persists until the fault has been queued to be
  *                    reported to userspace.
@@ -369,7 +424,7 @@ struct kbase_protected_suspend_buffer {
  *                  group.
  * @protm_event_work:   Work item corresponding to the protected mode entry
  *                      event for this queue.
- * @protm_pending_bitmap:  Bit array to keep a track of command streams that
+ * @protm_pending_bitmap:  Bit array to keep a track of CSs that
  *                         have pending protected mode entry requests.
  * @error_fatal: An error of type BASE_GPU_QUEUE_GROUP_ERROR_FATAL to be
  *               returned to userspace if such an error has occurred.
@@ -377,6 +432,8 @@ struct kbase_protected_suspend_buffer {
  *                 to be returned to userspace if such an error has occurred.
  * @error_tiler_oom: An error of type BASE_GPU_QUEUE_GROUP_ERROR_TILER_HEAP_OOM
  *                   to be returned to userspace if such an error has occurred.
+ * @timer_event_work: Work item to handle the progress timeout fatal event
+ *                    for the group.
  */
 struct kbase_queue_group {
 	struct kbase_context *kctx;
@@ -394,11 +451,13 @@ struct kbase_queue_group {
 	u64 fragment_mask;
 	u64 compute_mask;
 
+	u32 group_uid;
+
 	struct list_head link;
 	struct list_head link_to_schedule;
-	struct work_struct timer_event_work;
 	enum kbase_csf_group_state run_state;
 	u32 prepared_seq_num;
+	u32 scan_seq_num;
 	bool faulted;
 
 	struct kbase_queue *bound_queues[MAX_SUPPORTED_STREAMS_PER_GROUP];
@@ -410,6 +469,8 @@ struct kbase_queue_group {
 	struct kbase_csf_notification error_fatal;
 	struct kbase_csf_notification error_timeout;
 	struct kbase_csf_notification error_tiler_oom;
+
+	struct work_struct timer_event_work;
 };
 
 /**
@@ -442,6 +503,22 @@ struct kbase_csf_kcpu_queue_context {
 	struct list_head jit_blocked_queues;
 };
 
+/**
+ * struct kbase_csf_cpu_queue_context - Object representing the cpu queue
+ *                                      information.
+ *
+ * @buffer:     Buffer containing CPU queue information provided by Userspace.
+ * @buffer_size: The size of @buffer.
+ * @dump_req_status:  Indicates the current status for CPU queues dump request.
+ * @dump_cmp:         Dumping cpu queue completion event.
+ */
+struct kbase_csf_cpu_queue_context {
+	char *buffer;
+	size_t buffer_size;
+	atomic_t dump_req_status;
+	struct completion dump_cmp;
+};
+
 /**
  * struct kbase_csf_heap_context_allocator - Allocator of heap contexts
  *
@@ -472,18 +549,21 @@ struct kbase_csf_heap_context_allocator {
  * struct kbase_csf_tiler_heap_context - Object representing the tiler heaps
  *                                       context for a GPU address space.
  *
- * This contains all of the command-stream front-end state relating to chunked
- * tiler heaps for one @kbase_context. It is not the same as a heap context
- * structure allocated by the kernel for use by the firmware.
+ * This contains all of the CSF state relating to chunked tiler heaps for one
+ * @kbase_context. It is not the same as a heap context structure allocated by
+ * the kernel for use by the firmware.
  *
- * @lock:      Lock preventing concurrent access to the tiler heaps.
- * @list:      List of tiler heaps.
- * @ctx_alloc: Allocator for heap context structures.
+ * @lock:        Lock preventing concurrent access to the tiler heaps.
+ * @list:        List of tiler heaps.
+ * @ctx_alloc:   Allocator for heap context structures.
+ * @nr_of_heaps: Total number of tiler heaps that were added during the
+ *               life time of the context.
  */
 struct kbase_csf_tiler_heap_context {
 	struct mutex lock;
 	struct list_head list;
 	struct kbase_csf_heap_context_allocator ctx_alloc;
+	u64 nr_of_heaps;
 };
 
 /**
@@ -491,7 +571,7 @@ struct kbase_csf_tiler_heap_context {
  *                                      context for a GPU address space.
  *
  * @runnable_groups:    Lists of runnable GPU command queue groups in the kctx,
- *                      one per queue group priority level.
+ *                      one per queue group  relative-priority level.
  * @num_runnable_grps:  Total number of runnable groups across all priority
  *                      levels in @runnable_groups.
  * @idle_wait_groups:   A list of GPU command queue groups in which all enabled
@@ -500,7 +580,7 @@ struct kbase_csf_tiler_heap_context {
  * @num_idle_wait_grps: Length of the @idle_wait_groups list.
  * @sync_update_wq:     Dedicated workqueue to process work items corresponding
  *                      to the sync_update events by sync_set/sync_add
- *                      instruction execution on command streams bound to groups
+ *                      instruction execution on CSs bound to groups
  *                      of @idle_wait_groups list.
  * @sync_update_work:   work item to process the sync_update events by
  *                      sync_set / sync_add instruction execution on command
@@ -509,7 +589,7 @@ struct kbase_csf_tiler_heap_context {
  *                      'groups_to_schedule' list of scheduler instance.
  */
 struct kbase_csf_scheduler_context {
-	struct list_head runnable_groups[BASE_QUEUE_GROUP_PRIORITY_COUNT];
+	struct list_head runnable_groups[KBASE_QUEUE_GROUP_PRIORITY_COUNT];
 	u32 num_runnable_grps;
 	struct list_head idle_wait_groups;
 	u32 num_idle_wait_grps;
@@ -519,8 +599,7 @@ struct kbase_csf_scheduler_context {
 };
 
 /**
- * struct kbase_csf_context - Object representing command-stream front-end
- *                            for a GPU address space.
+ * struct kbase_csf_context - Object representing CSF for a GPU address space.
  *
  * @event_pages_head: A list of pages allocated for the event memory used by
  *                    the synchronization objects. A separate list would help
@@ -534,7 +613,7 @@ struct kbase_csf_scheduler_context {
  *                    deferred manner of a pair of User mode input/output pages
  *                    & a hardware doorbell page.
  *                    The pages are allocated when a GPU command queue is
- *                    bound to a command stream group in kbase_csf_queue_bind.
+ *                    bound to a CSG in kbase_csf_queue_bind.
  *                    This helps returning unique handles to Userspace from
  *                    kbase_csf_queue_bind and later retrieving the pointer to
  *                    queue in the mmap handler.
@@ -550,7 +629,8 @@ struct kbase_csf_scheduler_context {
  *                    userspace mapping created for them on bind operation
  *                    hasn't been removed.
  * @kcpu_queues:      Kernel CPU command queues.
- * @event_lock:       Lock protecting access to @event_callback_list
+ * @event_lock:       Lock protecting access to @event_callback_list and
+ *                    @error_list.
  * @event_callback_list: List of callbacks which are registered to serve CSF
  *                       events.
  * @tiler_heaps:      Chunked tiler memory heaps.
@@ -563,10 +643,12 @@ struct kbase_csf_scheduler_context {
  *                    of the USER register page. Currently used only for sanity
  *                    checking.
  * @sched:            Object representing the scheduler's context
- * @error_list:       List for command stream fatal errors in this context.
+ * @error_list:       List for CS fatal errors in this context.
  *                    Link of fatal error is
  *                    &struct_kbase_csf_notification.link.
- *                    @lock needs to be held to access to this list.
+ *                    @event_lock needs to be held to access this list.
+ * @cpu_queue:        CPU queue information. Only be available when DEBUG_FS
+ *                    is enabled.
  */
 struct kbase_csf_context {
 	struct list_head event_pages_head;
@@ -585,6 +667,9 @@ struct kbase_csf_context {
 	struct vm_area_struct *user_reg_vma;
 	struct kbase_csf_scheduler_context sched;
 	struct list_head error_list;
+#ifdef CONFIG_DEBUG_FS
+	struct kbase_csf_cpu_queue_context cpu_queue;
+#endif
 };
 
 /**
@@ -593,23 +678,28 @@ struct kbase_csf_context {
  * @workq:         Workqueue to execute the GPU reset work item @work.
  * @work:          Work item for performing the GPU reset.
  * @wait:          Wait queue used to wait for the GPU reset completion.
+ * @sem:           RW Semaphore to ensure no other thread attempts to use the
+ *                 GPU whilst a reset is in process. Unlike traditional
+ *                 semaphores and wait queues, this allows Linux's lockdep
+ *                 mechanism to check for deadlocks involving reset waits.
  * @state:         Tracks if the GPU reset is in progress or not.
+ *                 The state is represented by enum @kbase_csf_reset_gpu_state.
  */
 struct kbase_csf_reset_gpu {
 	struct workqueue_struct *workq;
 	struct work_struct work;
 	wait_queue_head_t wait;
+	struct rw_semaphore sem;
 	atomic_t state;
 };
 
 /**
  * struct kbase_csf_csg_slot - Object containing members for tracking the state
- *                             of command stream group slots.
- * @resident_group:   pointer to the queue group that is resident on the
- *                    command stream group slot.
- * @state:            state of the slot as per enum kbase_csf_csg_slot_state.
+ *                             of CSG slots.
+ * @resident_group:   pointer to the queue group that is resident on the CSG slot.
+ * @state:            state of the slot as per enum @kbase_csf_csg_slot_state.
  * @trigger_jiffies:  value of jiffies when change in slot state is recorded.
- * @priority:         dynamic priority assigned to command stream group slot.
+ * @priority:         dynamic priority assigned to CSG slot.
  */
 struct kbase_csf_csg_slot {
 	struct kbase_queue_group *resident_group;
@@ -620,8 +710,7 @@ struct kbase_csf_csg_slot {
 
 /**
  * struct kbase_csf_scheduler - Object representing the scheduler used for
- *                              command-stream front-end for an instance of
- *                              GPU platform device.
+ *                              CSF for an instance of GPU platform device.
  * @lock:                  Lock to serialize the scheduler operations and
  *                         access to the data members.
  * @interrupt_lock:        Lock to protect members accessed by interrupt
@@ -632,26 +721,29 @@ struct kbase_csf_csg_slot {
  * @doorbell_inuse_bitmap: Bitmap of hardware doorbell pages keeping track of
  *                         which pages are currently available for assignment
  *                         to clients.
- * @csg_inuse_bitmap:      Bitmap to keep a track of command stream group slots
+ * @csg_inuse_bitmap:      Bitmap to keep a track of CSG slots
  *                         that are currently in use.
- * @csg_slots:             The array for tracking the state of command stream
+ * @csg_slots:             The array for tracking the state of CS
  *                         group slots.
  * @runnable_kctxs:        List of Kbase contexts that have runnable command
  *                         queue groups.
  * @groups_to_schedule:    List of runnable queue groups prepared on every
- *                         scheduler tick. The dynamic priority of the command
- *                         stream group slot assigned to a group will depend
- *                         upon the position of group in the list.
+ *                         scheduler tick. The dynamic priority of the CSG
+ *                         slot assigned to a group will depend upon the
+ *                         position of group in the list.
  * @ngrp_to_schedule:      Number of groups in the @groups_to_schedule list,
  *                         incremented when a group is added to the list, used
  *                         to record the position of group in the list.
  * @num_active_address_spaces: Number of GPU address space slots that would get
  *                             used to program the groups in @groups_to_schedule
- *                             list on all the available command stream group
+ *                             list on all the available CSG
  *                             slots.
- * @num_csg_slots_for_tick:  Number of command stream group slots that can be
+ * @num_csg_slots_for_tick:  Number of CSG slots that can be
  *                           active in the given tick/tock. This depends on the
  *                           value of @num_active_address_spaces.
+ * @remaining_tick_slots:    Tracking the number of remaining available slots
+ *                           for @num_csg_slots_for_tick during the scheduling
+ *                           operation in a tick/tock.
  * @idle_groups_to_schedule: List of runnable queue groups, in which all GPU
  *                           command queues became idle or are waiting for
  *                           synchronization object, prepared on every
@@ -659,11 +751,14 @@ struct kbase_csf_csg_slot {
  *                           appended to the tail of @groups_to_schedule list
  *                           after the scan out so that the idle groups aren't
  *                           preferred for scheduling over the non-idle ones.
+ * @csg_scan_count_for_tick: CSG scanout count for assign the scan_seq_num for
+ *                           each scanned out group during scheduling operation
+ *                           in a tick/tock.
  * @total_runnable_grps:     Total number of runnable groups across all KCTXs.
  * @csgs_events_enable_mask: Use for temporary masking off asynchronous events
  *                           from firmware (such as OoM events) before a group
  *                           is suspended.
- * @csg_slots_idle_mask:     Bit array for storing the mask of command stream
+ * @csg_slots_idle_mask:     Bit array for storing the mask of CS
  *                           group slots for which idle notification was
  *                           received.
  * @csg_slots_prio_update:  Bit array for tracking slots that have an on-slot
@@ -677,39 +772,53 @@ struct kbase_csf_csg_slot {
  *                          then it will only perform scheduling under the
  *                          influence of external factors e.g., IRQs, IOCTLs.
  * @wq:                     Dedicated workqueue to execute the @tick_work.
- * @tick_work:              Work item that would perform the schedule on tick
- *                          operation to implement the time slice based
- *                          scheduling.
+ * @tick_timer:             High-resolution timer employed to schedule tick
+ *                          workqueue items (kernel-provided delayed_work
+ *                          items do not use hrtimer and for some reason do
+ *                          not provide sufficiently reliable periodicity).
+ * @tick_work:              Work item that performs the "schedule on tick"
+ *                          operation to implement timeslice-based scheduling.
  * @tock_work:              Work item that would perform the schedule on tock
  *                          operation to implement the asynchronous scheduling.
  * @ping_work:              Work item that would ping the firmware at regular
- *                          intervals, only if there is a single active command
- *                          stream group slot, to check if firmware is alive
- *                          and would initiate a reset if the ping request
- *                          isn't acknowledged.
+ *                          intervals, only if there is a single active CSG
+ *                          slot, to check if firmware is alive and would
+ *                          initiate a reset if the ping request isn't
+ *                          acknowledged.
  * @top_ctx:                Pointer to the Kbase context corresponding to the
  *                          @top_grp.
  * @top_grp:                Pointer to queue group inside @groups_to_schedule
  *                          list that was assigned the highest slot priority.
- * @head_slot_priority:     The dynamic slot priority to be used for the
- *                          queue group at the head of @groups_to_schedule
- *                          list. Once the queue group is assigned a command
- *                          stream group slot, it is removed from the list and
- *                          priority is decremented.
  * @tock_pending_request:   A "tock" request is pending: a group that is not
  *                          currently on the GPU demands to be scheduled.
  * @active_protm_grp:       Indicates if firmware has been permitted to let GPU
  *                          enter protected mode with the given group. On exit
  *                          from protected mode the pointer is reset to NULL.
+ * @gpu_idle_fw_timer_enabled: Whether the CSF scheduler has activiated the
+ *                            firmware idle hysteresis timer for preparing a
+ *                            GPU suspend on idle.
  * @gpu_idle_work:          Work item for facilitating the scheduler to bring
  *                          the GPU to a low-power mode on becoming idle.
- * @non_idle_suspended_grps: Count of suspended queue groups not idle.
+ * @non_idle_offslot_grps:  Count of off-slot non-idle groups. Reset during
+ *                          the scheduler active phase in a tick. It then
+ *                          tracks the count of non-idle groups across all the
+ *                          other phases.
+ * @non_idle_scanout_grps:  Count on the non-idle groups in the scan-out
+ *                          list at the scheduling prepare stage.
  * @pm_active_count:        Count indicating if the scheduler is owning a power
  *                          management reference count. Reference is taken when
  *                          the count becomes 1 and is dropped when the count
  *                          becomes 0. It is used to enable the power up of MCU
  *                          after GPU and L2 cache have been powered up. So when
  *                          this count is zero, MCU will not be powered up.
+ * @csg_scheduling_period_ms: Duration of Scheduling tick in milliseconds.
+ * @tick_timer_active:      Indicates whether the @tick_timer is effectively
+ *                          active or not, as the callback function of
+ *                          @tick_timer will enqueue @tick_work only if this
+ *                          flag is true. This is mainly useful for the case
+ *                          when scheduling tick needs to be advanced from
+ *                          interrupt context, without actually deactivating
+ *                          the @tick_timer first and then enqueing @tick_work.
  */
 struct kbase_csf_scheduler {
 	struct mutex lock;
@@ -723,7 +832,9 @@ struct kbase_csf_scheduler {
 	u32 ngrp_to_schedule;
 	u32 num_active_address_spaces;
 	u32 num_csg_slots_for_tick;
+	u32 remaining_tick_slots;
 	struct list_head idle_groups_to_schedule;
+	u32 csg_scan_count_for_tick;
 	u32 total_runnable_grps;
 	DECLARE_BITMAP(csgs_events_enable_mask, MAX_SUPPORTED_CSGS);
 	DECLARE_BITMAP(csg_slots_idle_mask, MAX_SUPPORTED_CSGS);
@@ -731,17 +842,21 @@ struct kbase_csf_scheduler {
 	unsigned long last_schedule;
 	bool timer_enabled;
 	struct workqueue_struct *wq;
-	struct delayed_work tick_work;
+	struct hrtimer tick_timer;
+	struct work_struct tick_work;
 	struct delayed_work tock_work;
 	struct delayed_work ping_work;
 	struct kbase_context *top_ctx;
 	struct kbase_queue_group *top_grp;
-	u8 head_slot_priority;
 	bool tock_pending_request;
 	struct kbase_queue_group *active_protm_grp;
-	struct delayed_work gpu_idle_work;
-	atomic_t non_idle_suspended_grps;
+	bool gpu_idle_fw_timer_enabled;
+	struct work_struct gpu_idle_work;
+	atomic_t non_idle_offslot_grps;
+	u32 non_idle_scanout_grps;
 	u32 pm_active_count;
+	unsigned int csg_scheduling_period_ms;
+	bool tick_timer_active;
 };
 
 /**
@@ -758,8 +873,205 @@ struct kbase_csf_scheduler {
 	GLB_PROGRESS_TIMER_TIMEOUT_SCALE)
 
 /**
- * struct kbase_csf      -  Object representing command-stream front-end for an
- *                          instance of GPU platform device.
+ * Default GLB_PWROFF_TIMER_TIMEOUT value in unit of micro-seconds.
+ */
+#define DEFAULT_GLB_PWROFF_TIMEOUT_US (800)
+
+/**
+ * In typical operations, the management of the shader core power transitions
+ * is delegated to the MCU/firmware. However, if the host driver is configured
+ * to take direct control, one needs to disable the MCU firmware GLB_PWROFF
+ * timer.
+ */
+#define DISABLE_GLB_PWROFF_TIMER (0)
+
+/* Index of the GPU_ACTIVE counter within the CSHW counter block */
+#define GPU_ACTIVE_CNT_IDX (4)
+
+/**
+ * Maximum number of sessions that can be managed by the IPA Control component.
+ */
+#if MALI_UNIT_TEST
+#define KBASE_IPA_CONTROL_MAX_SESSIONS ((size_t)8)
+#else
+#define KBASE_IPA_CONTROL_MAX_SESSIONS ((size_t)2)
+#endif
+
+/**
+ * enum kbase_ipa_core_type - Type of counter block for performance counters
+ *
+ * @KBASE_IPA_CORE_TYPE_CSHW:   CS Hardware counters.
+ * @KBASE_IPA_CORE_TYPE_MEMSYS: Memory System counters.
+ * @KBASE_IPA_CORE_TYPE_TILER:  Tiler counters.
+ * @KBASE_IPA_CORE_TYPE_SHADER: Shader Core counters.
+ * @KBASE_IPA_CORE_TYPE_NUM:    Number of core types.
+ */
+enum kbase_ipa_core_type {
+	KBASE_IPA_CORE_TYPE_CSHW = 0,
+	KBASE_IPA_CORE_TYPE_MEMSYS,
+	KBASE_IPA_CORE_TYPE_TILER,
+	KBASE_IPA_CORE_TYPE_SHADER,
+	KBASE_IPA_CORE_TYPE_NUM
+};
+
+/**
+ * Number of configurable counters per type of block on the IPA Control
+ * interface.
+ */
+#define KBASE_IPA_CONTROL_NUM_BLOCK_COUNTERS ((size_t)8)
+
+/**
+ * Total number of configurable counters existing on the IPA Control interface.
+ */
+#define KBASE_IPA_CONTROL_MAX_COUNTERS                                         \
+	((size_t)KBASE_IPA_CORE_TYPE_NUM * KBASE_IPA_CONTROL_NUM_BLOCK_COUNTERS)
+
+/**
+ * struct kbase_ipa_control_prfcnt - Session for a single performance counter
+ *
+ * @latest_raw_value: Latest raw value read from the counter.
+ * @scaling_factor:   Factor raw value shall be multiplied by.
+ * @accumulated_diff: Partial sum of scaled and normalized values from
+ *                    previous samples. This represent all the values
+ *                    that were read before the latest raw value.
+ * @type:             Type of counter block for performance counter.
+ * @select_idx:       Index of the performance counter as configured on
+ *                    the IPA Control interface.
+ * @gpu_norm:         Indicating whether values shall be normalized by
+ *                    GPU frequency. If true, returned values represent
+ *                    an interval of time expressed in seconds (when the
+ *                    scaling factor is set to 1).
+ */
+struct kbase_ipa_control_prfcnt {
+	u64 latest_raw_value;
+	u64 scaling_factor;
+	u64 accumulated_diff;
+	enum kbase_ipa_core_type type;
+	u8 select_idx;
+	bool gpu_norm;
+};
+
+/**
+ * struct kbase_ipa_control_session - Session for an IPA Control client
+ *
+ * @prfcnts:        Sessions for individual performance counters.
+ * @num_prfcnts:    Number of performance counters.
+ * @active:         Indicates whether this slot is in use or not
+ * @last_query_time:     Time of last query, in ns
+ * @protm_time:     Amount of time (in ns) that GPU has been in protected
+ */
+struct kbase_ipa_control_session {
+	struct kbase_ipa_control_prfcnt prfcnts[KBASE_IPA_CONTROL_MAX_COUNTERS];
+	size_t num_prfcnts;
+	bool active;
+	u64 last_query_time;
+	u64 protm_time;
+};
+
+/**
+ * struct kbase_ipa_control_prfcnt_config - Performance counter configuration
+ *
+ * @idx:      Index of the performance counter inside the block, as specified
+ *            in the GPU architecture.
+ * @refcount: Number of client sessions bound to this counter.
+ *
+ * This structure represents one configurable performance counter of
+ * the IPA Control interface. The entry may be mapped to a specific counter
+ * by one or more client sessions. The counter is considered to be unused
+ * if it isn't part of any client session.
+ */
+struct kbase_ipa_control_prfcnt_config {
+	u8 idx;
+	u8 refcount;
+};
+
+/**
+ * struct kbase_ipa_control_prfcnt_block - Block of performance counters
+ *
+ * @select:                 Current performance counter configuration.
+ * @num_available_counters: Number of counters that are not already configured.
+ *
+ */
+struct kbase_ipa_control_prfcnt_block {
+	struct kbase_ipa_control_prfcnt_config
+		select[KBASE_IPA_CONTROL_NUM_BLOCK_COUNTERS];
+	size_t num_available_counters;
+};
+
+/**
+ * struct kbase_ipa_control - Manager of the IPA Control interface.
+ *
+ * @blocks:              Current configuration of performance counters
+ *                       for the IPA Control interface.
+ * @sessions:            State of client sessions, storing information
+ *                       like performance counters the client subscribed to
+ *                       and latest value read from each counter.
+ * @lock:                Spinlock to serialize access by concurrent clients.
+ * @rtm_listener_data:   Private data for allocating a GPU frequency change
+ *                       listener.
+ * @num_active_sessions: Number of sessions opened by clients.
+ * @cur_gpu_rate:        Current GPU top-level operating frequency, in Hz.
+ * @rtm_listener_data:   Private data for allocating a GPU frequency change
+ *                       listener.
+ * @protm_start:         Time (in ns) at which the GPU entered protected mode
+ */
+struct kbase_ipa_control {
+	struct kbase_ipa_control_prfcnt_block blocks[KBASE_IPA_CORE_TYPE_NUM];
+	struct kbase_ipa_control_session
+		sessions[KBASE_IPA_CONTROL_MAX_SESSIONS];
+	spinlock_t lock;
+	void *rtm_listener_data;
+	size_t num_active_sessions;
+	u32 cur_gpu_rate;
+	u64 protm_start;
+};
+
+/**
+ * struct kbase_csf_firmware_interface - Interface in the MCU firmware
+ *
+ * @node:  Interface objects are on the kbase_device:csf.firmware_interfaces
+ *         list using this list_head to link them
+ * @phys:  Array of the physical (tagged) addresses making up this interface
+ * @name:  NULL-terminated string naming the interface
+ * @num_pages: Number of entries in @phys and @pma (and length of the interface)
+ * @virtual: Starting GPU virtual address this interface is mapped at
+ * @flags: bitmask of CSF_FIRMWARE_ENTRY_* conveying the interface attributes
+ * @data_start: Offset into firmware image at which the interface data starts
+ * @data_end: Offset into firmware image at which the interface data ends
+ * @kernel_map: A kernel mapping of the memory or NULL if not required to be
+ *              mapped in the kernel
+ * @pma: Array of pointers to protected memory allocations.
+ */
+struct kbase_csf_firmware_interface {
+	struct list_head node;
+	struct tagged_addr *phys;
+	char *name;
+	u32 num_pages;
+	u32 virtual;
+	u32 flags;
+	u32 data_start;
+	u32 data_end;
+	void *kernel_map;
+	struct protected_memory_allocation **pma;
+};
+
+/*
+ * struct kbase_csf_hwcnt - Object containing members for handling the dump of
+ *                          HW counters.
+ *
+ * @request_pending:        Flag set when HWC requested and used for HWC sample
+ *                          done interrupt.
+ * @enable_pending:         Flag set when HWC enable status change and used for
+ *                          enable done interrupt.
+ */
+struct kbase_csf_hwcnt {
+	bool request_pending;
+	bool enable_pending;
+};
+
+/**
+ * struct kbase_csf_device - Object representing CSF for an instance of GPU
+ *                           platform device.
  *
  * @mcu_mmu:                MMU page tables for the MCU firmware
  * @firmware_interfaces:    List of interfaces defined in the firmware image
@@ -794,6 +1106,17 @@ struct kbase_csf_scheduler {
  *                          of the real Hw doorbell page for the active GPU
  *                          command queues after they are stopped or after the
  *                          GPU is powered down.
+ * @dummy_user_reg_page:    Address of the dummy page that is mapped in place
+ *                          of the real User register page just before the GPU
+ *                          is powered down. The User register page is mapped
+ *                          in the address space of every process, that created
+ *                          a Base context, to enable the access to LATEST_FLUSH
+ *                          register from userspace.
+ * @mali_file_inode:        Pointer to the inode corresponding to mali device
+ *                          file. This is needed in order to switch to the
+ *                          @dummy_user_reg_page on GPU power down.
+ *                          All instances of the mali device file will point to
+ *                          the same inode.
  * @reg_lock:               Lock to serialize the MCU firmware related actions
  *                          that affect all contexts such as allocation of
  *                          regions from shared interface area, assignment of
@@ -806,7 +1129,7 @@ struct kbase_csf_scheduler {
  * @global_iface:           The result of parsing the global interface
  *                          structure set up by the firmware, including the
  *                          CSGs, CSs, and their properties
- * @scheduler:              The command stream scheduler instance.
+ * @scheduler:              The CS scheduler instance.
  * @reset:                  Contain members required for GPU reset handling.
  * @progress_timeout:       Maximum number of GPU clock cycles without forward
  *                          progress to allow, for all tasks running on
@@ -820,11 +1143,39 @@ struct kbase_csf_scheduler {
  *                          in GPU reset has completed.
  * @firmware_reload_needed: Flag for indicating that the firmware needs to be
  *                          reloaded as part of the GPU reset action.
+ * @firmware_hctl_core_pwr: Flag for indicating that the host diver is in
+ *                          charge of the shader core's power transitions, and
+ *                          the mcu_core_pwroff timeout feature is disabled
+ *                          (i.e. configured 0 in the register field). If
+ *                          false, the control is delegated to the MCU.
  * @firmware_reload_work:   Work item for facilitating the procedural actions
  *                          on reloading the firmware.
  * @glb_init_request_pending: Flag to indicate that Global requests have been
  *                            sent to the FW after MCU was re-enabled and their
  *                            acknowledgement is pending.
+ * @fw_error_work:          Work item for handling the firmware internal error
+ *                          fatal event.
+ * @ipa_control:            IPA Control component manager.
+ * @mcu_core_pwroff_dur_us: Sysfs attribute for the glb_pwroff timeout input
+ *                          in unit of micro-seconds. The firmware does not use
+ *                          it directly.
+ * @mcu_core_pwroff_dur_count: The counterpart of the glb_pwroff timeout input
+ *                             in interface required format, ready to be used
+ *                             directly in the firmware.
+ * @mcu_core_pwroff_reg_shadow: The actual value that has been programed into
+ *                              the glb_pwoff register. This is separated from
+ *                              the @p mcu_core_pwroff_dur_count as an update
+ *                              to the latter is asynchronous.
+ * @gpu_idle_hysteresis_ms: Sysfs attribute for the idle hysteresis time
+ *                          window in unit of ms. The firmware does not use it
+ *                          directly.
+ * @gpu_idle_dur_count:     The counterpart of the hysteresis time window in
+ *                          interface required format, ready to be used
+ *                          directly in the firmware.
+ * @fw_timeout_ms:          Timeout value (in milliseconds) used when waiting
+ *                          for any request sent to the firmware.
+ * @hwcnt:                  Contain members required for handling the dump of
+ *                          HW counters.
  */
 struct kbase_csf_device {
 	struct kbase_mmu_table mcu_mmu;
@@ -838,6 +1189,8 @@ struct kbase_csf_device {
 	struct file *db_filp;
 	u32 db_file_offsets;
 	struct tagged_addr dummy_db_page;
+	struct tagged_addr dummy_user_reg_page;
+	struct inode *mali_file_inode;
 	struct mutex reg_lock;
 	wait_queue_head_t event_wait;
 	bool interrupt_received;
@@ -849,8 +1202,18 @@ struct kbase_csf_device {
 	bool firmware_inited;
 	bool firmware_reloaded;
 	bool firmware_reload_needed;
+	bool firmware_hctl_core_pwr;
 	struct work_struct firmware_reload_work;
 	bool glb_init_request_pending;
+	struct work_struct fw_error_work;
+	struct kbase_ipa_control ipa_control;
+	u32 mcu_core_pwroff_dur_us;
+	u32 mcu_core_pwroff_dur_count;
+	u32 mcu_core_pwroff_reg_shadow;
+	u32 gpu_idle_hysteresis_ms;
+	u32 gpu_idle_dur_count;
+	unsigned int fw_timeout_ms;
+	struct kbase_csf_hwcnt hwcnt;
 };
 
 /**
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware.c
index 4a924f346685..89585bfc9716 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "mali_kbase.h"
@@ -25,29 +24,41 @@
 #include "mali_kbase_csf_trace_buffer.h"
 #include "mali_kbase_csf_timeout.h"
 #include "mali_kbase_mem.h"
-#include <mali_kbase_reset_gpu.h>
+#include "mali_kbase_reset_gpu.h"
+#include "mali_kbase_ctx_sched.h"
 #include "mali_kbase_csf_scheduler.h"
 #include "device/mali_kbase_device.h"
 #include "backend/gpu/mali_kbase_pm_internal.h"
 #include "tl/mali_kbase_timeline_priv.h"
 #include "mali_kbase_csf_tl_reader.h"
+#include "backend/gpu/mali_kbase_clk_rate_trace_mgr.h"
+#include <csf/ipa_control/mali_kbase_csf_ipa_control.h>
 
 #include <linux/list.h>
 #include <linux/slab.h>
 #include <linux/firmware.h>
 #include <linux/mman.h>
 #include <linux/string.h>
+#include <linux/mutex.h>
 #if (KERNEL_VERSION(4, 13, 0) <= LINUX_VERSION_CODE)
 #include <linux/set_memory.h>
 #endif
 #include <mmu/mali_kbase_mmu.h>
+#include <asm/arch_timer.h>
 
 #define MALI_MAX_FIRMWARE_NAME_LEN ((size_t)20)
 
+
 static char fw_name[MALI_MAX_FIRMWARE_NAME_LEN] = "mali_csffw.bin";
 module_param_string(fw_name, fw_name, sizeof(fw_name), 0644);
 MODULE_PARM_DESC(fw_name, "firmware image");
 
+/* The waiting time for firmware to boot */
+static unsigned int csf_firmware_boot_timeout_ms = 500;
+module_param(csf_firmware_boot_timeout_ms, uint, 0444);
+MODULE_PARM_DESC(csf_firmware_boot_timeout_ms,
+		 "Maximum time to wait for firmware to boot.");
+
 #ifdef CONFIG_MALI_BIFROST_DEBUG
 /* Makes Driver wait indefinitely for an acknowledgment for the different
  * requests it sends to firmware. Otherwise the timeouts interfere with the
@@ -65,14 +76,6 @@ MODULE_PARM_DESC(fw_debug,
 #define FIRMWARE_HEADER_VERSION  (0ul)
 #define FIRMWARE_HEADER_LENGTH   (0x14ul)
 
-#define CSF_FIRMWARE_ENTRY_READ       (1ul << 0)
-#define CSF_FIRMWARE_ENTRY_WRITE      (1ul << 1)
-#define CSF_FIRMWARE_ENTRY_EXECUTE    (1ul << 2)
-#define CSF_FIRMWARE_ENTRY_CACHE_MODE (3ul << 3)
-#define CSF_FIRMWARE_ENTRY_PROTECTED  (1ul << 5)
-#define CSF_FIRMWARE_ENTRY_SHARED     (1ul << 30)
-#define CSF_FIRMWARE_ENTRY_ZERO       (1ul << 31)
-
 #define CSF_FIRMWARE_ENTRY_SUPPORTED_FLAGS \
 	(CSF_FIRMWARE_ENTRY_READ | \
 	 CSF_FIRMWARE_ENTRY_WRITE | \
@@ -97,11 +100,11 @@ MODULE_PARM_DESC(fw_debug,
 
 #define TL_METADATA_ENTRY_NAME_OFFSET (0x8)
 
-#define CSF_FIRMWARE_BOOT_TIMEOUT_MS     (500)
 #define CSF_MAX_FW_STOP_LOOPS            (100000)
 
-#define CSF_GLB_REQ_CFG_MASK \
-	(GLB_REQ_CFG_ALLOC_EN_MASK | GLB_REQ_CFG_PROGRESS_TIMER_MASK)
+#define CSF_GLB_REQ_CFG_MASK                                                   \
+	(GLB_REQ_CFG_ALLOC_EN_MASK | GLB_REQ_CFG_PROGRESS_TIMER_MASK |         \
+	 GLB_REQ_CFG_PWROFF_TIMER_MASK)
 
 static inline u32 input_page_read(const u32 *const input, const u32 offset)
 {
@@ -142,41 +145,17 @@ static unsigned int entry_size(u32 header)
 {
 	return (header >> 8) & 0xFF;
 }
+static bool entry_update(u32 header)
+{
+	return (header >> 30) & 0x1;
+}
 static bool entry_optional(u32 header)
 {
 	return (header >> 31) & 0x1;
 }
 
 /**
- * struct firmware_interface - Represents an interface in the MCU firmware
- *
- * @node:  Interface objects are on the kbase_device:csf.firmware_interfaces
- *         list using this list_head to link them
- * @phys:  Array of the physical (tagged) addresses making up this interface
- * @name:  NUL-terminated string naming the interface
- * @num_pages: Number of entries in @phys (and length of the interface)
- * @virtual: Virtual address that this interface is mapped at for the GPU
- * @flags: bitmask of CSF_FIRMWARE_ENTRY_* conveying the interface attributes
- * @data_start: Offset into firmware image at which the interface data starts
- * @data_end: Offset into firmware image at which the interface data ends
- * @kernel_map: A kernel mapping of the memory or NULL if not required to be
- *              mapped in the kernel
- * @pma: Array of pointers to protected memory allocations.
- */
-struct firmware_interface {
-	struct list_head node;
-	struct tagged_addr *phys;
-	char *name;
-	u32 num_pages;
-	u32 virtual;
-	u32 flags;
-	u32 data_start;
-	u32 data_end;
-	void *kernel_map;
-	struct protected_memory_allocation **pma;
-};
-
-/**
+ * struct firmware_timeline_metadata -
  * Timeline metadata item within the MCU firmware
  *
  * @node: List head linking all timeline metadata to
@@ -200,7 +179,8 @@ struct firmware_timeline_metadata {
  */
 static int setup_shared_iface_static_region(struct kbase_device *kbdev)
 {
-	struct firmware_interface *interface = kbdev->csf.shared_interface;
+	struct kbase_csf_firmware_interface *interface =
+		kbdev->csf.shared_interface;
 	struct kbase_va_region *reg;
 	int ret = -ENOMEM;
 
@@ -258,7 +238,7 @@ static void stop_csf_firmware(struct kbase_device *kbdev)
 static void wait_for_firmware_boot(struct kbase_device *kbdev)
 {
 	const long wait_timeout =
-		kbase_csf_timeout_in_jiffies(CSF_FIRMWARE_BOOT_TIMEOUT_MS);
+		kbase_csf_timeout_in_jiffies(csf_firmware_boot_timeout_ms);
 	long remaining;
 
 	/* Firmware will generate a global interface interrupt once booting
@@ -434,7 +414,7 @@ static void load_fw_image_section(struct kbase_device *kbdev, const u8 *data,
 static int reload_fw_data_sections(struct kbase_device *kbdev)
 {
 	const u32 magic = FIRMWARE_HEADER_MAGIC;
-	struct firmware_interface *interface;
+	struct kbase_csf_firmware_interface *interface;
 	const struct firmware *firmware;
 	int ret = 0;
 
@@ -503,7 +483,7 @@ static int parse_memory_setup_entry(struct kbase_device *kbdev,
 	u32 num_pages;
 	char *name;
 	struct tagged_addr *phys = NULL;
-	struct firmware_interface *interface = NULL;
+	struct kbase_csf_firmware_interface *interface = NULL;
 	bool allocated_pages = false, protected_mode = false;
 	unsigned long mem_flags = 0;
 	u32 cache_mode = 0;
@@ -573,7 +553,7 @@ static int parse_memory_setup_entry(struct kbase_device *kbdev,
 	load_fw_image_section(kbdev, fw->data, phys, num_pages, flags,
 			data_start, data_end);
 
-	/* Allocate enough memory for the struct firmware_interface and
+	/* Allocate enough memory for the struct kbase_csf_firmware_interface and
 	 * the name of the interface. An extra byte is allocated to place a
 	 * NUL-terminator in. This should already be included according to the
 	 * specification but here we add it anyway to be robust against a
@@ -671,10 +651,7 @@ static int parse_memory_setup_entry(struct kbase_device *kbdev,
 out:
 	if (allocated_pages) {
 		if (protected_mode) {
-			if (interface) {
-				kbase_csf_protected_memory_free(kbdev,
-						interface->pma, num_pages);
-			}
+			kbase_csf_protected_memory_free(kbdev, pma, num_pages);
 		} else {
 			kbase_mem_pool_free_pages(
 				&kbdev->mem_pools.small[KBASE_MEM_GROUP_CSF_FW],
@@ -763,6 +740,11 @@ static int load_firmware_entry(struct kbase_device *kbdev,
 	const unsigned int type = entry_type(header);
 	unsigned int size = entry_size(header);
 	const bool optional = entry_optional(header);
+	/* Update is used with configuration and tracebuffer entries to
+	 * initiate a FIRMWARE_CONFIG_UPDATE, instead of triggering a
+	 * silent reset.
+	 */
+	const bool updatable = entry_update(header);
 	const u32 *entry = (void *)(fw->data + offset);
 
 	if ((offset % sizeof(*entry)) || (size % sizeof(*entry))) {
@@ -797,7 +779,7 @@ static int load_firmware_entry(struct kbase_device *kbdev,
 			return -EINVAL;
 		}
 		return kbase_csf_firmware_cfg_option_entry_parse(
-			kbdev, fw, entry, size);
+			kbdev, fw, entry, size, updatable);
 	case CSF_FIRMWARE_ENTRY_TYPE_FUTF_TEST:
 #ifndef MALI_KBASE_BUILD
 		/* FW UTF option */
@@ -818,7 +800,7 @@ static int load_firmware_entry(struct kbase_device *kbdev,
 			return -EINVAL;
 		}
 		return kbase_csf_firmware_parse_trace_buffer_entry(
-				kbdev, entry, size);
+			kbdev, entry, size, updatable);
 	case CSF_FIRMWARE_ENTRY_TYPE_TIMELINE_METADATA:
 		/* Meta data section */
 		if (size < TL_METADATA_ENTRY_NAME_OFFSET + sizeof(*entry)) {
@@ -865,7 +847,8 @@ static void free_global_iface(struct kbase_device *kbdev)
  */
 static inline void *iface_gpu_va_to_cpu(struct kbase_device *kbdev, u32 gpu_va)
 {
-	struct firmware_interface *interface = kbdev->csf.shared_interface;
+	struct kbase_csf_firmware_interface *interface =
+		kbdev->csf.shared_interface;
 	u8 *kernel_base = interface->kernel_map;
 
 	if (gpu_va < interface->virtual ||
@@ -919,7 +902,7 @@ static int parse_cmd_stream_group_info(struct kbase_device *kbdev,
 
 	if (ginfo->stream_num < MIN_SUPPORTED_STREAMS_PER_GROUP ||
 			ginfo->stream_num > MAX_SUPPORTED_STREAMS_PER_GROUP) {
-		dev_err(kbdev->dev, "CSG with %u streams out of range %u-%u",
+		dev_err(kbdev->dev, "CSG with %u CSs out of range %u-%u",
 				ginfo->stream_num,
 				MIN_SUPPORTED_STREAMS_PER_GROUP,
 				MAX_SUPPORTED_STREAMS_PER_GROUP);
@@ -930,7 +913,7 @@ static int parse_cmd_stream_group_info(struct kbase_device *kbdev,
 
 	if (ginfo->stream_num * ginfo->stream_stride > group_stride) {
 		dev_err(kbdev->dev,
-				"group stride of 0x%x exceeded by %u streams with stride 0x%x",
+				"group stride of 0x%x exceeded by %u CSs with stride 0x%x",
 				group_stride, ginfo->stream_num,
 				ginfo->stream_stride);
 		return -EINVAL;
@@ -950,7 +933,7 @@ static int parse_cmd_stream_group_info(struct kbase_device *kbdev,
 		err = parse_cmd_stream_info(kbdev, &ginfo->streams[sid],
 				stream_base);
 		if (err < 0) {
-			/* caller will free the memory for streams array */
+			/* caller will free the memory for CSs array */
 			return err;
 		}
 	}
@@ -960,7 +943,8 @@ static int parse_cmd_stream_group_info(struct kbase_device *kbdev,
 
 static u32 get_firmware_version(struct kbase_device *kbdev)
 {
-	struct firmware_interface *interface = kbdev->csf.shared_interface;
+	struct kbase_csf_firmware_interface *interface =
+		kbdev->csf.shared_interface;
 	u32 *shared_info = interface->kernel_map;
 
 	return shared_info[GLB_VERSION/4];
@@ -968,7 +952,8 @@ static u32 get_firmware_version(struct kbase_device *kbdev)
 
 static int parse_capabilities(struct kbase_device *kbdev)
 {
-	struct firmware_interface *interface = kbdev->csf.shared_interface;
+	struct kbase_csf_firmware_interface *interface =
+		kbdev->csf.shared_interface;
 	u32 *shared_info = interface->kernel_map;
 	struct kbase_csf_global_iface *iface = &kbdev->csf.global_iface;
 	unsigned int gid;
@@ -1008,6 +993,7 @@ static int parse_capabilities(struct kbase_device *kbdev)
 
 	iface->group_stride = shared_info[GLB_GROUP_STRIDE/4];
 	iface->prfcnt_size = shared_info[GLB_PRFCNT_SIZE/4];
+	iface->instr_features = shared_info[GLB_INSTR_FEATURES / 4];
 
 	if ((GROUP_CONTROL_0 +
 		(unsigned long)iface->group_num * iface->group_stride) >
@@ -1045,7 +1031,7 @@ static int parse_capabilities(struct kbase_device *kbdev)
 static inline void access_firmware_memory(struct kbase_device *kbdev,
 	u32 gpu_addr, u32 *value, const bool read)
 {
-	struct firmware_interface *interface;
+	struct kbase_csf_firmware_interface *interface;
 
 	list_for_each_entry(interface, &kbdev->csf.firmware_interfaces, node) {
 		if ((gpu_addr >= interface->virtual) &&
@@ -1217,6 +1203,69 @@ u32 kbase_csf_firmware_global_output(
 	return val;
 }
 
+/**
+ * handle_internal_firmware_fatal - Handler for CS internal firmware fault.
+ *
+ * @kbdev:  Pointer to kbase device
+ *
+ * Report group fatal error to user space for all GPU command queue groups
+ * in the device, terminate them and reset GPU.
+ */
+static void handle_internal_firmware_fatal(struct kbase_device *const kbdev)
+{
+	int as;
+
+	for (as = 0; as < kbdev->nr_hw_address_spaces; as++) {
+		unsigned long flags;
+		struct kbase_context *kctx;
+		struct kbase_fault fault;
+
+		if (as == MCU_AS_NR)
+			continue;
+
+		/* Only handle the fault for an active address space. Lock is
+		 * taken here to atomically get reference to context in an
+		 * active address space and retain its refcount.
+		 */
+		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+		kctx = kbase_ctx_sched_as_to_ctx_nolock(kbdev, as);
+
+		if (kctx) {
+			kbase_ctx_sched_retain_ctx_refcount(kctx);
+			spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+		} else {
+			spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+			continue;
+		}
+
+		fault = (struct kbase_fault) {
+			.status = GPU_EXCEPTION_TYPE_SW_FAULT_1,
+		};
+
+		kbase_csf_ctx_handle_fault(kctx, &fault);
+		kbase_ctx_sched_release_ctx_lock(kctx);
+	}
+
+	if (kbase_prepare_to_reset_gpu(kbdev,
+				       RESET_FLAGS_HWC_UNRECOVERABLE_ERROR))
+		kbase_reset_gpu(kbdev);
+}
+
+/**
+ * firmware_error_worker - Worker function for handling firmware internal error
+ *
+ * @data: Pointer to a work_struct embedded in kbase device.
+ *
+ * Handle the CS internal firmware error
+ */
+static void firmware_error_worker(struct work_struct *const data)
+{
+	struct kbase_device *const kbdev =
+		container_of(data, struct kbase_device, csf.fw_error_work);
+
+	handle_internal_firmware_fatal(kbdev);
+}
+
 static bool global_request_complete(struct kbase_device *const kbdev,
 				    u32 const req_mask)
 {
@@ -1242,7 +1291,7 @@ static int wait_for_global_request(struct kbase_device *const kbdev,
 				   u32 const req_mask)
 {
 	const long wait_timeout =
-		kbase_csf_timeout_in_jiffies(GLB_REQ_WAIT_TIMEOUT_MS);
+		kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms);
 	long remaining;
 	int err = 0;
 
@@ -1285,6 +1334,28 @@ static void enable_endpoints_global(
 	set_global_request(global_iface, GLB_REQ_CFG_ALLOC_EN_MASK);
 }
 
+static void enable_shader_poweroff_timer(struct kbase_device *const kbdev,
+	const struct kbase_csf_global_iface *const global_iface)
+{
+	u32 pwroff_reg;
+
+	if (kbdev->csf.firmware_hctl_core_pwr)
+		pwroff_reg =
+		    GLB_PWROFF_TIMER_TIMER_SOURCE_SET(DISABLE_GLB_PWROFF_TIMER,
+			       GLB_PWROFF_TIMER_TIMER_SOURCE_SYSTEM_TIMESTAMP);
+	else
+		pwroff_reg = kbdev->csf.mcu_core_pwroff_dur_count;
+
+	kbase_csf_firmware_global_input(global_iface, GLB_PWROFF_TIMER,
+					pwroff_reg);
+	set_global_request(global_iface, GLB_REQ_CFG_PWROFF_TIMER_MASK);
+
+	/* Save the programed reg value in its shadow field */
+	kbdev->csf.mcu_core_pwroff_reg_shadow = pwroff_reg;
+
+	dev_dbg(kbdev->dev, "GLB_PWROFF_TIMER set to 0x%.8x\n", pwroff_reg);
+}
+
 static void set_timeout_global(
 	const struct kbase_csf_global_iface *const global_iface,
 	u64 const timeout)
@@ -1295,29 +1366,16 @@ static void set_timeout_global(
 	set_global_request(global_iface, GLB_REQ_CFG_PROGRESS_TIMER_MASK);
 }
 
-static void set_coherency_mode(struct kbase_device *const kbdev)
-{
-	const struct kbase_csf_global_iface *const global_iface =
-		&kbdev->csf.global_iface;
-	u32 protected_mode_coherency = kbdev->system_coherency;
-
-	/* GPU is supposed to use ACE-Lite coherency mode on a fully coherent
-	 * system during protected mode execution.
-	 */
-	if (kbdev->system_coherency == COHERENCY_ACE)
-		protected_mode_coherency = COHERENCY_ACE_LITE;
-
-	kbase_csf_firmware_global_input(global_iface, GLB_PROTM_COHERENCY,
-					protected_mode_coherency);
-}
-
-static void global_init(struct kbase_device *const kbdev, u32 req_mask)
+static void global_init(struct kbase_device *const kbdev, u64 core_mask)
 {
-	u32 const ack_irq_mask = GLB_ACK_IRQ_MASK_CFG_ALLOC_EN_MASK  |
-			GLB_ACK_IRQ_MASK_PING_MASK |
-			GLB_ACK_IRQ_MASK_CFG_PROGRESS_TIMER_MASK |
-			GLB_ACK_IRQ_MASK_PROTM_ENTER_MASK |
-			GLB_ACK_IRQ_MASK_PROTM_EXIT_MASK;
+	u32 const ack_irq_mask = GLB_ACK_IRQ_MASK_CFG_ALLOC_EN_MASK |
+				 GLB_ACK_IRQ_MASK_PING_MASK |
+				 GLB_ACK_IRQ_MASK_CFG_PROGRESS_TIMER_MASK |
+				 GLB_ACK_IRQ_MASK_PROTM_ENTER_MASK |
+				 GLB_ACK_IRQ_MASK_PROTM_EXIT_MASK |
+				 GLB_ACK_IRQ_MASK_FIRMWARE_CONFIG_UPDATE_MASK |
+				 GLB_ACK_IRQ_MASK_CFG_PWROFF_TIMER_MASK |
+				 GLB_ACK_IRQ_MASK_IDLE_EVENT_MASK;
 
 	const struct kbase_csf_global_iface *const global_iface =
 		&kbdev->csf.global_iface;
@@ -1325,12 +1383,14 @@ static void global_init(struct kbase_device *const kbdev, u32 req_mask)
 
 	kbase_csf_scheduler_spin_lock(kbdev, &flags);
 
-	/* Set the cohereny mode for protected mode execution */
-	set_coherency_mode(kbdev);
+	/* Set the coherency mode for protected mode execution */
+	WARN_ON(kbdev->system_coherency == COHERENCY_ACE);
+	kbase_csf_firmware_global_input(global_iface, GLB_PROTM_COHERENCY,
+					kbdev->system_coherency);
 
-	/* Enable endpoints on all present shader cores */
-	enable_endpoints_global(global_iface,
-		kbase_pm_get_present_cores(kbdev, KBASE_PM_CORE_SHADER));
+	/* Update shader core allocation enable mask */
+	enable_endpoints_global(global_iface, core_mask);
+	enable_shader_poweroff_timer(kbdev, global_iface);
 
 	set_timeout_global(global_iface, kbase_csf_timeout_get(kbdev));
 
@@ -1346,8 +1406,7 @@ static void global_init(struct kbase_device *const kbdev, u32 req_mask)
 /**
  * global_init_on_boot - Sends a global request to control various features.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface
  *
  * Currently only the request to enable endpoints and timeout for GPU progress
  * timer is sent.
@@ -1356,19 +1415,29 @@ static void global_init(struct kbase_device *const kbdev, u32 req_mask)
  */
 static int global_init_on_boot(struct kbase_device *const kbdev)
 {
-	u32 const req_mask = CSF_GLB_REQ_CFG_MASK;
+	unsigned long flags;
+	u64 core_mask;
 
-	global_init(kbdev, req_mask);
+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+	core_mask = kbase_pm_ca_get_core_mask(kbdev);
+	kbdev->csf.firmware_hctl_core_pwr =
+				kbase_pm_no_mcu_core_pwroff(kbdev);
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+
+	global_init(kbdev, core_mask);
 
-	return wait_for_global_request(kbdev, req_mask);
+	return wait_for_global_request(kbdev, CSF_GLB_REQ_CFG_MASK);
 }
 
-void kbase_csf_firmware_global_reinit(struct kbase_device *kbdev)
+void kbase_csf_firmware_global_reinit(struct kbase_device *kbdev,
+				      u64 core_mask)
 {
 	lockdep_assert_held(&kbdev->hwaccess_lock);
 
 	kbdev->csf.glb_init_request_pending = true;
-	global_init(kbdev, CSF_GLB_REQ_CFG_MASK);
+	kbdev->csf.firmware_hctl_core_pwr =
+				kbase_pm_no_mcu_core_pwroff(kbdev);
+	global_init(kbdev, core_mask);
 }
 
 bool kbase_csf_firmware_global_reinit_complete(struct kbase_device *kbdev)
@@ -1382,7 +1451,36 @@ bool kbase_csf_firmware_global_reinit_complete(struct kbase_device *kbdev)
 	return !kbdev->csf.glb_init_request_pending;
 }
 
+void kbase_csf_firmware_update_core_attr(struct kbase_device *kbdev,
+		bool update_core_pwroff_timer, bool update_core_mask, u64 core_mask)
+{
+	unsigned long flags;
+
+	lockdep_assert_held(&kbdev->hwaccess_lock);
+
+	kbase_csf_scheduler_spin_lock(kbdev, &flags);
+	if (update_core_mask)
+		enable_endpoints_global(&kbdev->csf.global_iface, core_mask);
+	if (update_core_pwroff_timer)
+		enable_shader_poweroff_timer(kbdev, &kbdev->csf.global_iface);
+
+	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
+	kbase_csf_scheduler_spin_unlock(kbdev, flags);
+}
+
+bool kbase_csf_firmware_core_attr_updated(struct kbase_device *kbdev)
+{
+	lockdep_assert_held(&kbdev->hwaccess_lock);
+
+	return global_request_complete(kbdev, GLB_REQ_CFG_ALLOC_EN_MASK |
+					      GLB_REQ_CFG_PWROFF_TIMER_MASK);
+}
+
 /**
+ * kbase_csf_firmware_reload_worker() -
+ * reload the fw image and re-enable the MCU
+ * @work: CSF Work item for reloading the firmware.
+ *
  * This helper function will reload the firmware image and re-enable the MCU.
  * It is supposed to be called after MCU(GPU) has been reset.
  * Unlike the initial boot the firmware binary image is not parsed completely.
@@ -1449,6 +1547,130 @@ void kbase_csf_firmware_reload_completed(struct kbase_device *kbdev)
 	kbase_pm_update_state(kbdev);
 }
 
+static u32 convert_dur_to_idle_count(struct kbase_device *kbdev, const u32 dur_ms)
+{
+#define HYSTERESIS_VAL_UNIT_SHIFT (10)
+	/* Get the cntfreq_el0 value, which drives the SYSTEM_TIMESTAMP */
+	u64 freq = arch_timer_get_cntfrq();
+	u64 dur_val = dur_ms;
+	u32 cnt_val_u32, reg_val_u32;
+	bool src_system_timestamp = freq > 0;
+
+	if (!src_system_timestamp) {
+		/* Get the cycle_counter source alternative */
+		spin_lock(&kbdev->pm.clk_rtm.lock);
+		if (kbdev->pm.clk_rtm.clks[0])
+			freq = kbdev->pm.clk_rtm.clks[0]->clock_val;
+		else
+			dev_warn(kbdev->dev, "No GPU clock, unexpected intregration issue!");
+		spin_unlock(&kbdev->pm.clk_rtm.lock);
+
+		dev_info(kbdev->dev, "Can't get the timestamp frequency, "
+			 "use cycle counter format with firmware idle hysteresis!");
+	}
+
+	/* Formula for dur_val = ((dur_ms/1000) * freq_HZ) >> 10) */
+	dur_val = (dur_val * freq) >> HYSTERESIS_VAL_UNIT_SHIFT;
+	dur_val = div_u64(dur_val, 1000);
+
+	/* Interface limits the value field to S32_MAX */
+	cnt_val_u32 = (dur_val > S32_MAX) ? S32_MAX : (u32)dur_val;
+
+	reg_val_u32 = GLB_IDLE_TIMER_TIMEOUT_SET(0, cnt_val_u32);
+	/* add the source flag */
+	if (src_system_timestamp)
+		reg_val_u32 = GLB_IDLE_TIMER_TIMER_SOURCE_SET(reg_val_u32,
+				GLB_IDLE_TIMER_TIMER_SOURCE_SYSTEM_TIMESTAMP);
+	else
+		reg_val_u32 = GLB_IDLE_TIMER_TIMER_SOURCE_SET(reg_val_u32,
+				GLB_IDLE_TIMER_TIMER_SOURCE_GPU_COUNTER);
+
+	return reg_val_u32;
+}
+
+u32 kbase_csf_firmware_get_gpu_idle_hysteresis_time(struct kbase_device *kbdev)
+{
+	return kbdev->csf.gpu_idle_hysteresis_ms;
+}
+
+u32 kbase_csf_firmware_set_gpu_idle_hysteresis_time(struct kbase_device *kbdev, u32 dur)
+{
+	unsigned long flags;
+	const u32 hysteresis_val = convert_dur_to_idle_count(kbdev, dur);
+
+	kbase_csf_scheduler_spin_lock(kbdev, &flags);
+	kbdev->csf.gpu_idle_hysteresis_ms = dur;
+	kbdev->csf.gpu_idle_dur_count = hysteresis_val;
+	kbase_csf_scheduler_spin_unlock(kbdev, flags);
+
+	dev_dbg(kbdev->dev, "CSF set firmware idle hysteresis count-value: 0x%.8x",
+		hysteresis_val);
+
+	return hysteresis_val;
+}
+
+static u32 convert_dur_to_core_pwroff_count(struct kbase_device *kbdev, const u32 dur_us)
+{
+#define PWROFF_VAL_UNIT_SHIFT (10)
+	/* Get the cntfreq_el0 value, which drives the SYSTEM_TIMESTAMP */
+	u64 freq = arch_timer_get_cntfrq();
+	u64 dur_val = dur_us;
+	u32 cnt_val_u32, reg_val_u32;
+	bool src_system_timestamp = freq > 0;
+
+	if (!src_system_timestamp) {
+		/* Get the cycle_counter source alternative */
+		spin_lock(&kbdev->pm.clk_rtm.lock);
+		if (kbdev->pm.clk_rtm.clks[0])
+			freq = kbdev->pm.clk_rtm.clks[0]->clock_val;
+		else
+			dev_warn(kbdev->dev, "No GPU clock, unexpected integration issue!");
+		spin_unlock(&kbdev->pm.clk_rtm.lock);
+
+		dev_info(kbdev->dev, "Can't get the timestamp frequency, "
+			 "use cycle counter with MCU Core Poweroff timer!");
+	}
+
+	/* Formula for dur_val = ((dur_us/1e6) * freq_HZ) >> 10) */
+	dur_val = (dur_val * freq) >> HYSTERESIS_VAL_UNIT_SHIFT;
+	dur_val = div_u64(dur_val, 1000000);
+
+	/* Interface limits the value field to S32_MAX */
+	cnt_val_u32 = (dur_val > S32_MAX) ? S32_MAX : (u32)dur_val;
+
+	reg_val_u32 = GLB_PWROFF_TIMER_TIMEOUT_SET(0, cnt_val_u32);
+	/* add the source flag */
+	if (src_system_timestamp)
+		reg_val_u32 = GLB_PWROFF_TIMER_TIMER_SOURCE_SET(reg_val_u32,
+				GLB_PWROFF_TIMER_TIMER_SOURCE_SYSTEM_TIMESTAMP);
+	else
+		reg_val_u32 = GLB_PWROFF_TIMER_TIMER_SOURCE_SET(reg_val_u32,
+				GLB_PWROFF_TIMER_TIMER_SOURCE_GPU_COUNTER);
+
+	return reg_val_u32;
+}
+
+u32 kbase_csf_firmware_get_mcu_core_pwroff_time(struct kbase_device *kbdev)
+{
+	return kbdev->csf.mcu_core_pwroff_dur_us;
+}
+
+u32 kbase_csf_firmware_set_mcu_core_pwroff_time(struct kbase_device *kbdev, u32 dur)
+{
+	unsigned long flags;
+	const u32 pwroff = convert_dur_to_core_pwroff_count(kbdev, dur);
+
+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+	kbdev->csf.mcu_core_pwroff_dur_us = dur;
+	kbdev->csf.mcu_core_pwroff_dur_count = pwroff;
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+
+	dev_dbg(kbdev->dev, "MCU Core Poweroff input update: 0x%.8x", pwroff);
+
+	return pwroff;
+}
+
+
 int kbase_csf_firmware_init(struct kbase_device *kbdev)
 {
 	const struct firmware *firmware;
@@ -1474,6 +1696,7 @@ int kbase_csf_firmware_init(struct kbase_device *kbdev)
 
 	init_waitqueue_head(&kbdev->csf.event_wait);
 	kbdev->csf.interrupt_received = false;
+	kbdev->csf.fw_timeout_ms = CSF_FIRMWARE_TIMEOUT_MS;
 
 	INIT_LIST_HEAD(&kbdev->csf.firmware_interfaces);
 	INIT_LIST_HEAD(&kbdev->csf.firmware_config);
@@ -1481,9 +1704,18 @@ int kbase_csf_firmware_init(struct kbase_device *kbdev)
 	INIT_LIST_HEAD(&kbdev->csf.firmware_trace_buffers.list);
 	INIT_WORK(&kbdev->csf.firmware_reload_work,
 		  kbase_csf_firmware_reload_worker);
+	INIT_WORK(&kbdev->csf.fw_error_work, firmware_error_worker);
 
 	mutex_init(&kbdev->csf.reg_lock);
 
+	kbdev->csf.gpu_idle_hysteresis_ms = FIRMWARE_IDLE_HYSTERESIS_TIME_MS;
+	kbdev->csf.gpu_idle_dur_count = convert_dur_to_idle_count(kbdev,
+						FIRMWARE_IDLE_HYSTERESIS_TIME_MS);
+
+	kbdev->csf.mcu_core_pwroff_dur_us = DEFAULT_GLB_PWROFF_TIMEOUT_US;
+	kbdev->csf.mcu_core_pwroff_dur_count =
+		convert_dur_to_core_pwroff_count(kbdev, DEFAULT_GLB_PWROFF_TIMEOUT_US);
+
 	ret = kbase_mcu_shared_interface_region_tracker_init(kbdev);
 	if (ret != 0) {
 		dev_err(kbdev->dev, "Failed to setup the rb tree for managing shared interface segment\n");
@@ -1510,8 +1742,8 @@ int kbase_csf_firmware_init(struct kbase_device *kbdev)
 		goto error;
 	}
 
-	version_major = firmware->data[4];
-	version_minor = firmware->data[5];
+	version_minor = firmware->data[4];
+	version_major = firmware->data[5];
 
 	if (version_major != FIRMWARE_HEADER_VERSION) {
 		dev_err(kbdev->dev,
@@ -1590,6 +1822,10 @@ int kbase_csf_firmware_init(struct kbase_device *kbdev)
 	if (ret != 0)
 		goto error;
 
+	ret = kbase_csf_setup_dummy_user_reg_page(kbdev);
+	if (ret != 0)
+		goto error;
+
 	ret = kbase_csf_timeout_init(kbdev);
 	if (ret != 0)
 		goto error;
@@ -1602,6 +1838,7 @@ int kbase_csf_firmware_init(struct kbase_device *kbdev)
 	if (ret != 0)
 		goto error;
 
+
 	/* Firmware loaded successfully */
 	release_firmware(firmware);
 	KBASE_KTRACE_ADD(kbdev, FIRMWARE_BOOT, NULL,
@@ -1620,21 +1857,34 @@ void kbase_csf_firmware_term(struct kbase_device *kbdev)
 	unsigned long flags;
 	int ret = 0;
 
-	while (kbase_reset_gpu_is_active(kbdev) && !ret)
-		ret = kbase_reset_gpu_wait(kbdev);
+	cancel_work_sync(&kbdev->csf.fw_error_work);
 
-	WARN(ret, "failed to wait for GPU reset");
+	ret = kbase_reset_gpu_wait(kbdev);
 
-	/* Make sure ongoing transitions have completed */
-	kbase_pm_wait_for_desired_state(kbdev);
+	WARN(ret, "failed to wait for GPU reset");
 
 	kbase_csf_firmware_cfg_term(kbdev);
 
 	kbase_csf_timeout_term(kbdev);
 
+	kbase_csf_free_dummy_user_reg_page(kbdev);
+
+	kbase_csf_scheduler_term(kbdev);
+
+	kbase_csf_doorbell_mapping_term(kbdev);
+
+	/* Explicitly trigger the disabling of MCU through the state machine and
+	 * wait for its completion. It may not have been disabled yet due to the
+	 * power policy.
+	 */
+	kbdev->pm.backend.mcu_desired = false;
+	kbase_pm_wait_for_desired_state(kbdev);
+
+	free_global_iface(kbdev);
+
 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
 	kbdev->csf.firmware_inited = false;
-	if (kbdev->pm.backend.mcu_state != KBASE_MCU_OFF) {
+	if (WARN_ON(kbdev->pm.backend.mcu_state != KBASE_MCU_OFF)) {
 		kbdev->pm.backend.mcu_state = KBASE_MCU_OFF;
 		stop_csf_firmware(kbdev);
 	}
@@ -1642,22 +1892,15 @@ void kbase_csf_firmware_term(struct kbase_device *kbdev)
 
 	unload_mmu_tables(kbdev);
 
-	kbase_mmu_term(kbdev, &kbdev->csf.mcu_mmu);
-
-	kbase_csf_scheduler_term(kbdev);
-
-	kbase_csf_doorbell_mapping_term(kbdev);
-
-	free_global_iface(kbdev);
-
-	/* Release the address space */
-	kbdev->as_free |= MCU_AS_BITMASK;
+	kbase_csf_firmware_trace_buffers_term(kbdev);
 
 	while (!list_empty(&kbdev->csf.firmware_interfaces)) {
-		struct firmware_interface *interface;
+		struct kbase_csf_firmware_interface *interface;
 
-		interface = list_first_entry(&kbdev->csf.firmware_interfaces,
-				struct firmware_interface, node);
+		interface =
+			list_first_entry(&kbdev->csf.firmware_interfaces,
+					 struct kbase_csf_firmware_interface,
+					 node);
 		list_del(&interface->node);
 
 		vunmap(interface->kernel_map);
@@ -1687,21 +1930,67 @@ void kbase_csf_firmware_term(struct kbase_device *kbdev)
 		kfree(metadata);
 	}
 
-	kbase_csf_firmware_trace_buffers_term(kbdev);
-
 #ifndef MALI_KBASE_BUILD
 	mali_kutf_fw_utf_entry_cleanup(kbdev);
 #endif
 
-	mutex_destroy(&kbdev->csf.reg_lock);
-
 	/* This will also free up the region allocated for the shared interface
 	 * entry parsed from the firmware image.
 	 */
 	kbase_mcu_shared_interface_region_tracker_term(kbdev);
+
+	mutex_destroy(&kbdev->csf.reg_lock);
+
+	kbase_mmu_term(kbdev, &kbdev->csf.mcu_mmu);
+
+	/* Release the address space */
+	kbdev->as_free |= MCU_AS_BITMASK;
+}
+
+void kbase_csf_firmware_enable_gpu_idle_timer(struct kbase_device *kbdev)
+{
+	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
+	const u32 glb_req =
+		kbase_csf_firmware_global_input_read(global_iface, GLB_REQ);
+
+	kbase_csf_scheduler_spin_lock_assert_held(kbdev);
+
+	/* The scheduler is assumed to only call the enable when its internal
+	 * state indicates that the idle timer has previously been disabled. So
+	 * on entry the expected field values are:
+	 *   1. GLOBAL_INPUT_BLOCK.GLB_REQ.IDLE_ENABLE: 0
+	 *   2. GLOBAL_OUTPUT_BLOCK.GLB_ACK.IDLE_ENABLE: 0, or, on 1 -> 0
+	 */
+
+	if (glb_req & GLB_REQ_IDLE_ENABLE_MASK)
+		dev_err(kbdev->dev, "Incoherent scheduler state on REQ_IDLE_ENABLE!");
+
+	kbase_csf_firmware_global_input(global_iface, GLB_IDLE_TIMER,
+					kbdev->csf.gpu_idle_dur_count);
+
+	kbase_csf_firmware_global_input_mask(global_iface, GLB_REQ,
+				GLB_REQ_REQ_IDLE_ENABLE, GLB_REQ_IDLE_ENABLE_MASK);
+
+	dev_dbg(kbdev->dev, "Enabling GPU idle timer with count-value: 0x%.8x",
+		kbdev->csf.gpu_idle_dur_count);
+	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
+}
+
+void kbase_csf_firmware_disable_gpu_idle_timer(struct kbase_device *kbdev)
+{
+	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
+
+	kbase_csf_scheduler_spin_lock_assert_held(kbdev);
+
+	kbase_csf_firmware_global_input_mask(global_iface, GLB_REQ,
+					GLB_REQ_REQ_IDLE_DISABLE,
+					GLB_REQ_IDLE_DISABLE_MASK);
+	dev_dbg(kbdev->dev, "Sending request to disable gpu idle timer");
+
+	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
 }
 
-int kbase_csf_firmware_ping(struct kbase_device *const kbdev)
+void kbase_csf_firmware_ping(struct kbase_device *const kbdev)
 {
 	const struct kbase_csf_global_iface *const global_iface =
 		&kbdev->csf.global_iface;
@@ -1711,7 +2000,11 @@ int kbase_csf_firmware_ping(struct kbase_device *const kbdev)
 	set_global_request(global_iface, GLB_REQ_PING_MASK);
 	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
+}
 
+int kbase_csf_firmware_ping_wait(struct kbase_device *const kbdev)
+{
+	kbase_csf_firmware_ping(kbdev);
 	return wait_for_global_request(kbdev, GLB_REQ_PING_MASK);
 }
 
@@ -1743,51 +2036,86 @@ void kbase_csf_enter_protected_mode(struct kbase_device *kbdev)
 {
 	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
 	unsigned long flags;
-	unsigned int value;
+	int err;
 
 	kbase_csf_scheduler_spin_lock(kbdev, &flags);
-	value = kbase_csf_firmware_global_output(global_iface, GLB_ACK);
-	value ^= GLB_REQ_PROTM_ENTER_MASK;
-	kbase_csf_firmware_global_input_mask(global_iface, GLB_REQ, value,
-					     GLB_REQ_PROTM_ENTER_MASK);
+	set_global_request(global_iface, GLB_REQ_PROTM_ENTER_MASK);
 	dev_dbg(kbdev->dev, "Sending request to enter protected mode");
 	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
 
-	wait_for_global_request(kbdev, GLB_REQ_PROTM_ENTER_MASK);
+	err = wait_for_global_request(kbdev, GLB_REQ_PROTM_ENTER_MASK);
+
+	if (!err) {
+		unsigned long irq_flags;
+
+		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+		kbdev->protected_mode = true;
+		kbase_ipa_protection_mode_switch_event(kbdev);
+		kbase_ipa_control_protm_entered(kbdev);
+
+		kbase_csf_scheduler_spin_lock(kbdev, &irq_flags);
+		kbase_hwcnt_backend_csf_protm_entered(&kbdev->hwcnt_gpu_iface);
+		kbase_csf_scheduler_spin_unlock(kbdev, irq_flags);
+
+		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+	}
 }
 
 void kbase_csf_firmware_trigger_mcu_halt(struct kbase_device *kbdev)
 {
 	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
 	unsigned long flags;
-	unsigned int value;
 
 	kbase_csf_scheduler_spin_lock(kbdev, &flags);
-	value = kbase_csf_firmware_global_output(global_iface, GLB_ACK);
-	value ^= GLB_REQ_HALT_MASK;
-	kbase_csf_firmware_global_input_mask(global_iface, GLB_REQ, value,
-					     GLB_REQ_HALT_MASK);
+	set_global_request(global_iface, GLB_REQ_HALT_MASK);
 	dev_dbg(kbdev->dev, "Sending request to HALT MCU");
 	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
 }
 
+int kbase_csf_trigger_firmware_config_update(struct kbase_device *kbdev)
+{
+	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
+	unsigned long flags;
+	int err = 0;
+
+	/* Ensure GPU is powered-up until we complete config update.*/
+	kbase_pm_context_active(kbdev);
+
+	/* The 'reg_lock' is also taken and is held till the update is
+	 * complete, to ensure the config update gets serialized.
+	 */
+	mutex_lock(&kbdev->csf.reg_lock);
+	kbase_csf_scheduler_spin_lock(kbdev, &flags);
+
+	set_global_request(global_iface, GLB_REQ_FIRMWARE_CONFIG_UPDATE_MASK);
+	dev_dbg(kbdev->dev, "Sending request for FIRMWARE_CONFIG_UPDATE");
+	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
+	kbase_csf_scheduler_spin_unlock(kbdev, flags);
+
+	err = wait_for_global_request(kbdev,
+				      GLB_REQ_FIRMWARE_CONFIG_UPDATE_MASK);
+	mutex_unlock(&kbdev->csf.reg_lock);
+
+	kbase_pm_context_idle(kbdev);
+	return err;
+}
+
 /**
- * copy_grp_and_stm - Copy command stream and/or group data
+ * copy_grp_and_stm - Copy CS and/or group data
  *
- * @iface:                Global command stream front-end interface provided by
- *                        the firmware.
+ * @iface:                Global CSF interface provided by the firmware.
  * @group_data:           Pointer where to store all the group data
  *                        (sequentially).
  * @max_group_num:        The maximum number of groups to be read. Can be 0, in
  *                        which case group_data is unused.
- * @stream_data:          Pointer where to store all the stream data
+ * @stream_data:          Pointer where to store all the CS data
  *                        (sequentially).
- * @max_total_stream_num: The maximum number of streams to be read.
+ * @max_total_stream_num: The maximum number of CSs to be read.
  *                        Can be 0, in which case stream_data is unused.
  *
- * Return: Total number of command streams, summed across all groups.
+ * Return: Total number of CSs, summed across all groups.
  */
 static u32 copy_grp_and_stm(
 	const struct kbase_csf_global_iface * const iface,
@@ -1824,26 +2152,28 @@ static u32 copy_grp_and_stm(
 	return total_stream_num;
 }
 
-u32 kbase_csf_firmware_get_glb_iface(struct kbase_device *kbdev,
+u32 kbase_csf_firmware_get_glb_iface(
+	struct kbase_device *kbdev,
 	struct basep_cs_group_control *const group_data,
 	u32 const max_group_num,
 	struct basep_cs_stream_control *const stream_data,
 	u32 const max_total_stream_num, u32 *const glb_version,
-	u32 *const features, u32 *const group_num, u32 *const prfcnt_size)
+	u32 *const features, u32 *const group_num, u32 *const prfcnt_size,
+	u32 *instr_features)
 {
 	const struct kbase_csf_global_iface * const iface =
 		&kbdev->csf.global_iface;
 
-	if (WARN_ON(!glb_version) ||
-		WARN_ON(!features) ||
-		WARN_ON(!group_num) ||
-		WARN_ON(!prfcnt_size))
+	if (WARN_ON(!glb_version) || WARN_ON(!features) ||
+	    WARN_ON(!group_num) || WARN_ON(!prfcnt_size) ||
+	    WARN_ON(!instr_features))
 		return 0;
 
 	*glb_version = iface->version;
 	*features = iface->features;
 	*group_num = iface->group_num;
 	*prfcnt_size = iface->prfcnt_size;
+	*instr_features = iface->instr_features;
 
 	return copy_grp_and_stm(iface, group_data, max_group_num,
 		stream_data, max_total_stream_num);
@@ -1922,9 +2252,9 @@ int kbase_csf_firmware_mcu_shared_mapping_init(
 	mutex_lock(&kbdev->csf.reg_lock);
 	ret = kbase_add_va_region_rbtree(kbdev, va_reg, 0, num_pages, 1);
 	va_reg->flags &= ~KBASE_REG_FREE;
-	mutex_unlock(&kbdev->csf.reg_lock);
 	if (ret)
 		goto va_region_add_error;
+	mutex_unlock(&kbdev->csf.reg_lock);
 
 	gpu_map_properties &= (KBASE_REG_GPU_RD | KBASE_REG_GPU_WR);
 	gpu_map_properties |= gpu_map_prot;
@@ -1946,9 +2276,9 @@ int kbase_csf_firmware_mcu_shared_mapping_init(
 mmu_insert_pages_error:
 	mutex_lock(&kbdev->csf.reg_lock);
 	kbase_remove_va_region(va_reg);
-	mutex_unlock(&kbdev->csf.reg_lock);
 va_region_add_error:
 	kbase_free_alloced_region(va_reg);
+	mutex_unlock(&kbdev->csf.reg_lock);
 va_region_alloc_error:
 	vunmap(cpu_addr);
 vmap_error:
@@ -1962,7 +2292,8 @@ int kbase_csf_firmware_mcu_shared_mapping_init(
 	kfree(phys);
 out:
 	/* Zero-initialize the mapping to make sure that the termination
-	 * function doesn't try to unmap or free random addresses. */
+	 * function doesn't try to unmap or free random addresses.
+	 */
 	csf_mapping->phys = NULL;
 	csf_mapping->cpu_addr = NULL;
 	csf_mapping->va_reg = NULL;
@@ -1977,8 +2308,8 @@ void kbase_csf_firmware_mcu_shared_mapping_term(
 	if (csf_mapping->va_reg) {
 		mutex_lock(&kbdev->csf.reg_lock);
 		kbase_remove_va_region(csf_mapping->va_reg);
-		mutex_unlock(&kbdev->csf.reg_lock);
 		kbase_free_alloced_region(csf_mapping->va_reg);
+		mutex_unlock(&kbdev->csf.reg_lock);
 	}
 
 	if (csf_mapping->phys) {
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware.h
index 03a5217cffb0..768d42339caf 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,15 +17,13 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_CSF_FIRMWARE_H_
 #define _KBASE_CSF_FIRMWARE_H_
 
 #include "device/mali_kbase_device.h"
-#include "mali_gpu_csf_registers.h"
+#include <uapi/gpu/arm/bifrost/csf/mali_gpu_csf_registers.h>
 
 /*
  * PAGE_KERNEL_RO was only defined on 32bit ARM in 4.19 in:
@@ -71,14 +70,17 @@
 /* All implementations of the host interface with major version 0 must comply
  * with these restrictions:
  */
-/* GLB_GROUP_NUM: At least 3 command stream groups, but no more than 31 */
+/* GLB_GROUP_NUM: At least 3 CSGs, but no more than 31 */
 #define MIN_SUPPORTED_CSGS 3
 #define MAX_SUPPORTED_CSGS 31
-/* GROUP_STREAM_NUM: At least 8 command streams per CSG, but no more than 32 */
+/* GROUP_STREAM_NUM: At least 8 CSs per CSG, but no more than 32 */
 #define MIN_SUPPORTED_STREAMS_PER_GROUP 8
-/* Maximum command streams per csg. */
+/* Maximum CSs per csg. */
 #define MAX_SUPPORTED_STREAMS_PER_GROUP 32
 
+/* Waiting timeout for status change acknowledgment, in milliseconds */
+#define CSF_FIRMWARE_TIMEOUT_MS (800) /* Relaxed to 800ms from 100ms */
+
 struct kbase_device;
 
 
@@ -111,16 +113,15 @@ struct kbase_csf_trace_buffers {
 };
 
 /**
- * struct kbase_csf_cmd_stream_info - Command stream interface provided by the
- *                                    firmware.
+ * struct kbase_csf_cmd_stream_info - CSI provided by the firmware.
  *
  * @kbdev: Address of the instance of a GPU platform device that implements
  *         this interface.
- * @features: Bit field of command stream features (e.g. which types of jobs
+ * @features: Bit field of CS features (e.g. which types of jobs
  *            are supported). Bits 7:0 specify the number of work registers(-1).
  *            Bits 11:8 specify the number of scoreboard entries(-1).
- * @input: Address of command stream interface input page.
- * @output: Address of command stream interface output page.
+ * @input: Address of CSI input page.
+ * @output: Address of CSI output page.
  */
 struct kbase_csf_cmd_stream_info {
 	struct kbase_device *kbdev;
@@ -130,9 +131,9 @@ struct kbase_csf_cmd_stream_info {
 };
 
 /**
- * kbase_csf_firmware_cs_input() - Set a word in a command stream's input page
+ * kbase_csf_firmware_cs_input() - Set a word in a CS's input page
  *
- * @info: Command stream interface provided by the firmware.
+ * @info: CSI provided by the firmware.
  * @offset: Offset of the word to be written, in bytes.
  * @value: Value to be written.
  */
@@ -140,22 +141,20 @@ void kbase_csf_firmware_cs_input(
 	const struct kbase_csf_cmd_stream_info *info, u32 offset, u32 value);
 
 /**
- * kbase_csf_firmware_cs_input_read() - Read a word in a command stream's input
- *                                      page
+ * kbase_csf_firmware_cs_input_read() - Read a word in a CS's input page
  *
- * Return: Value of the word read from the command stream's input page.
+ * Return: Value of the word read from the CS's input page.
  *
- * @info: Command stream interface provided by the firmware.
+ * @info: CSI provided by the firmware.
  * @offset: Offset of the word to be read, in bytes.
  */
 u32 kbase_csf_firmware_cs_input_read(
 	const struct kbase_csf_cmd_stream_info *const info, const u32 offset);
 
 /**
- * kbase_csf_firmware_cs_input_mask() - Set part of a word in a command stream's
- *                                      input page
+ * kbase_csf_firmware_cs_input_mask() - Set part of a word in a CS's input page
  *
- * @info: Command stream interface provided by the firmware.
+ * @info: CSI provided by the firmware.
  * @offset: Offset of the word to be modified, in bytes.
  * @value: Value to be written.
  * @mask: Bitmask with the bits to be modified set.
@@ -165,19 +164,18 @@ void kbase_csf_firmware_cs_input_mask(
 	u32 value, u32 mask);
 
 /**
- * kbase_csf_firmware_cs_output() - Read a word in a command stream's output
- *                                  page
+ * kbase_csf_firmware_cs_output() - Read a word in a CS's output page
  *
- * Return: Value of the word read from the command stream's output page.
+ * Return: Value of the word read from the CS's output page.
  *
- * @info: Command stream interface provided by the firmware.
+ * @info: CSI provided by the firmware.
  * @offset: Offset of the word to be read, in bytes.
  */
 u32 kbase_csf_firmware_cs_output(
 	const struct kbase_csf_cmd_stream_info *info, u32 offset);
 /**
- * struct kbase_csf_cmd_stream_group_info - Command stream group interface
- *                                          provided by the firmware.
+ * struct kbase_csf_cmd_stream_group_info - CSG interface provided by the
+ *                                          firmware.
  *
  * @kbdev: Address of the instance of a GPU platform device that implements
  *         this interface.
@@ -185,14 +183,13 @@ u32 kbase_csf_firmware_cs_output(
  *            be ignored.
  * @input: Address of global interface input page.
  * @output: Address of global interface output page.
- * @suspend_size: Size in bytes for normal suspend buffer for the command
- *                stream group.
+ * @suspend_size: Size in bytes for normal suspend buffer for the CSG
  * @protm_suspend_size: Size in bytes for protected mode suspend buffer
- *                      for the command stream group.
- * @stream_num: Number of command streams in the command stream group.
+ *                      for the CSG.
+ * @stream_num: Number of CSs in the CSG.
  * @stream_stride: Stride in bytes in JASID0 virtual address between
- *                 command stream capability structures.
- * @streams: Address of an array of command stream capability structures.
+ *                 CS capability structures.
+ * @streams: Address of an array of CS capability structures.
  */
 struct kbase_csf_cmd_stream_group_info {
 	struct kbase_device *kbdev;
@@ -207,10 +204,9 @@ struct kbase_csf_cmd_stream_group_info {
 };
 
 /**
- * kbase_csf_firmware_csg_input() - Set a word in a command stream group's
- *                                  input page
+ * kbase_csf_firmware_csg_input() - Set a word in a CSG's input page
  *
- * @info: Command stream group interface provided by the firmware.
+ * @info: CSG interface provided by the firmware.
  * @offset: Offset of the word to be written, in bytes.
  * @value: Value to be written.
  */
@@ -219,22 +215,21 @@ void kbase_csf_firmware_csg_input(
 	u32 value);
 
 /**
- * kbase_csf_firmware_csg_input_read() - Read a word in a command stream group's
- *                                       input page
+ * kbase_csf_firmware_csg_input_read() - Read a word in a CSG's input page
  *
- * Return: Value of the word read from the command stream group's input page.
+ * Return: Value of the word read from the CSG's input page.
  *
- * @info: Command stream group interface provided by the firmware.
+ * @info: CSG interface provided by the firmware.
  * @offset: Offset of the word to be read, in bytes.
  */
 u32 kbase_csf_firmware_csg_input_read(
 	const struct kbase_csf_cmd_stream_group_info *info, u32 offset);
 
 /**
- * kbase_csf_firmware_csg_input_mask() - Set part of a word in a command stream
- *                                       group's input page
+ * kbase_csf_firmware_csg_input_mask() - Set part of a word in a CSG's
+ *                                       input page
  *
- * @info: Command stream group interface provided by the firmware.
+ * @info: CSG interface provided by the firmware.
  * @offset: Offset of the word to be modified, in bytes.
  * @value: Value to be written.
  * @mask: Bitmask with the bits to be modified set.
@@ -244,19 +239,18 @@ void kbase_csf_firmware_csg_input_mask(
 	u32 value, u32 mask);
 
 /**
- * kbase_csf_firmware_csg_output()- Read a word in a command stream group's
- *                                  output page
+ * kbase_csf_firmware_csg_output()- Read a word in a CSG's output page
  *
- * Return: Value of the word read from the command stream group's output page.
+ * Return: Value of the word read from the CSG's output page.
  *
- * @info: Command stream group interface provided by the firmware.
+ * @info: CSG interface provided by the firmware.
  * @offset: Offset of the word to be read, in bytes.
  */
 u32 kbase_csf_firmware_csg_output(
 	const struct kbase_csf_cmd_stream_group_info *info, u32 offset);
 
 /**
- * struct kbase_csf_global_iface - Global command stream front-end interface
+ * struct kbase_csf_global_iface - Global CSF interface
  *                                 provided by the firmware.
  *
  * @kbdev: Address of the instance of a GPU platform device that implements
@@ -268,11 +262,12 @@ u32 kbase_csf_firmware_csg_output(
  *            be suspended). Reserved bits should be 0, and should be ignored.
  * @input: Address of global interface input page.
  * @output: Address of global interface output page.
- * @group_num: Number of command stream groups supported.
+ * @group_num: Number of CSGs supported.
  * @group_stride: Stride in bytes in JASID0 virtual address between
- *                command stream group capability structures.
+ *                CSG capability structures.
  * @prfcnt_size: Performance counters size.
- * @groups: Address of an array of command stream group capability structures.
+ * @instr_features: Instrumentation features.
+ * @groups: Address of an array of CSG capability structures.
  */
 struct kbase_csf_global_iface {
 	struct kbase_device *kbdev;
@@ -283,13 +278,14 @@ struct kbase_csf_global_iface {
 	u32 group_num;
 	u32 group_stride;
 	u32 prfcnt_size;
+	u32 instr_features;
 	struct kbase_csf_cmd_stream_group_info *groups;
 };
 
 /**
  * kbase_csf_firmware_global_input() - Set a word in the global input page
  *
- * @iface: Command stream front-end interface provided by the firmware.
+ * @iface: CSF interface provided by the firmware.
  * @offset: Offset of the word to be written, in bytes.
  * @value: Value to be written.
  */
@@ -300,7 +296,7 @@ void kbase_csf_firmware_global_input(
  * kbase_csf_firmware_global_input_mask() - Set part of a word in the global
  *                                          input page
  *
- * @iface: Command stream front-end interface provided by the firmware.
+ * @iface: CSF interface provided by the firmware.
  * @offset: Offset of the word to be modified, in bytes.
  * @value: Value to be written.
  * @mask: Bitmask with the bits to be modified set.
@@ -314,7 +310,7 @@ void kbase_csf_firmware_global_input_mask(
  *
  * Return: Value of the word read from the global input page.
  *
- * @info: Command stream group interface provided by the firmware.
+ * @info: CSG interface provided by the firmware.
  * @offset: Offset of the word to be read, in bytes.
  */
 u32 kbase_csf_firmware_global_input_read(
@@ -325,7 +321,7 @@ u32 kbase_csf_firmware_global_input_read(
  *
  * Return: Value of the word read from the global output page.
  *
- * @iface: Command stream front-end interface provided by the firmware.
+ * @iface: CSF interface provided by the firmware.
  * @offset: Offset of the word to be read, in bytes.
  */
 u32 kbase_csf_firmware_global_output(
@@ -403,20 +399,28 @@ void kbase_csf_firmware_term(struct kbase_device *kbdev);
 /**
  * kbase_csf_firmware_ping - Send the ping request to firmware.
  *
- * The function sends the ping request to firmware to confirm it is alive.
+ * The function sends the ping request to firmware.
+ *
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
+ */
+void kbase_csf_firmware_ping(struct kbase_device *kbdev);
+
+/**
+ * kbase_csf_firmware_ping_wait - Send the ping request to firmware and waits.
+ *
+ * The function sends the ping request to firmware and waits to confirm it is
+ * alive.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  *
  * Return: 0 on success, or negative on failure.
  */
-int kbase_csf_firmware_ping(struct kbase_device *kbdev);
+int kbase_csf_firmware_ping_wait(struct kbase_device *kbdev);
 
 /**
  * kbase_csf_firmware_set_timeout - Set a hardware endpoint progress timeout.
  *
- * @kbdev:   Instance of a GPU platform device that implements a command
- *           stream front-end interface.
+ * @kbdev:   Instance of a GPU platform device that implements a CSF interface.
  * @timeout: The maximum number of GPU cycles that is allowed to elapse
  *           without forward progress before the driver terminates a GPU
  *           command queue group.
@@ -433,8 +437,7 @@ int kbase_csf_firmware_set_timeout(struct kbase_device *kbdev, u64 timeout);
  *                                  enter protected mode and wait for its
  *                                  completion.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  */
 void kbase_csf_enter_protected_mode(struct kbase_device *kbdev);
 
@@ -454,16 +457,14 @@ static inline bool kbase_csf_firmware_mcu_halted(struct kbase_device *kbdev)
  *                                       into a known internal state for warm
  *                                       boot later.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  */
 void kbase_csf_firmware_trigger_mcu_halt(struct kbase_device *kbdev);
 
 /**
  * kbase_csf_firmware_enable_mcu - Send the command to enable MCU
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  */
 static inline void kbase_csf_firmware_enable_mcu(struct kbase_device *kbdev)
 {
@@ -477,8 +478,7 @@ static inline void kbase_csf_firmware_enable_mcu(struct kbase_device *kbdev)
 /**
  * kbase_csf_firmware_disable_mcu - Send the command to disable MCU
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  */
 static inline void kbase_csf_firmware_disable_mcu(struct kbase_device *kbdev)
 {
@@ -489,8 +489,7 @@ static inline void kbase_csf_firmware_disable_mcu(struct kbase_device *kbdev)
  * kbase_csf_firmware_disable_mcu_wait - Wait for the MCU to reach disabled
  *                                       status.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  */
 void kbase_csf_firmware_disable_mcu_wait(struct kbase_device *kbdev);
 
@@ -499,8 +498,7 @@ void kbase_csf_firmware_disable_mcu_wait(struct kbase_device *kbdev);
  *                                 cold boot case firmware image would be
  *                                 reloaded from filesystem into memory.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  */
 void kbase_csf_firmware_trigger_reload(struct kbase_device *kbdev);
 
@@ -508,8 +506,7 @@ void kbase_csf_firmware_trigger_reload(struct kbase_device *kbdev);
  * kbase_csf_firmware_reload_completed - The reboot of MCU firmware has
  *                                       completed.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  */
 void kbase_csf_firmware_reload_completed(struct kbase_device *kbdev);
 
@@ -517,10 +514,11 @@ void kbase_csf_firmware_reload_completed(struct kbase_device *kbdev);
  * kbase_csf_firmware_global_reinit - Send the Global configuration requests
  *                                    after the reboot of MCU firmware.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
+ * @core_mask: Mask of the enabled shader cores.
  */
-void kbase_csf_firmware_global_reinit(struct kbase_device *kbdev);
+void kbase_csf_firmware_global_reinit(struct kbase_device *kbdev,
+				      u64 core_mask);
 
 /**
  * kbase_csf_firmware_global_reinit_complete - Check the Global configuration
@@ -529,45 +527,69 @@ void kbase_csf_firmware_global_reinit(struct kbase_device *kbdev);
  *
  * Return: true if the Global configuration requests completed otherwise false.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  */
 bool kbase_csf_firmware_global_reinit_complete(struct kbase_device *kbdev);
 
+/**
+ * kbase_csf_firmware_update_core_attr - Send the Global configuration request
+ *                                       to update the requested core attribute
+ *                                       changes.
+ *
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
+ * @update_core_pwroff_timer: If true, signal the firmware needs to update
+ *                            the MCU power-off timer value.
+ * @update_core_mask:         If true, need to do the core_mask update with
+ *                            the supplied core_mask value.
+ * @core_mask:                New core mask value if update_core_mask is true,
+ *                            otherwise unused.
+ */
+void kbase_csf_firmware_update_core_attr(struct kbase_device *kbdev,
+		bool update_core_pwroff_timer, bool update_core_mask, u64 core_mask);
+
+/**
+ * kbase_csf_firmware_core_attr_updated - Check the Global configuration
+ *                  request has completed or not, that was sent to update
+ *                  the core attributes.
+ *
+ * Return: true if the Global configuration request to update the core
+ *         attributes has completed, otherwise false.
+ *
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
+ */
+bool kbase_csf_firmware_core_attr_updated(struct kbase_device *kbdev);
+
 /**
  * Request the global control block of CSF interface capabilities
  *
- * Return: Total number of command streams, summed across all groups.
+ * Return: Total number of CSs, summed across all groups.
  *
  * @kbdev:                 Kbase device.
  * @group_data:            Pointer where to store all the group data
  *                         (sequentially).
  * @max_group_num:         The maximum number of groups to be read.
  *                         Can be 0, in which case group_data is unused.
- * @stream_data:           Pointer where to store all the stream data
+ * @stream_data:           Pointer where to store all the CS data
  *                         (sequentially).
- * @max_total_stream_num:  The maximum number of streams to be read.
+ * @max_total_stream_num:  The maximum number of CSs to be read.
  *                         Can be 0, in which case stream_data is unused.
  * @glb_version:           Where to store the global interface version.
- *                         Bits 31:16 hold the major version number and
- *                         15:0 hold the minor version number.
- *                         A higher minor version is backwards-compatible
- *                         with a lower minor version for the same major
- *                         version.
  * @features:              Where to store a bit mask of features (e.g.
  *                         whether certain types of job can be suspended).
- * @group_num:             Where to store the number of command stream groups
+ * @group_num:             Where to store the number of CSGs
  *                         supported.
  * @prfcnt_size:           Where to store the size of CSF performance counters,
  *                         in bytes. Bits 31:16 hold the size of firmware
  *                         performance counter data and 15:0 hold the size of
  *                         hardware performance counter data.
+ * @instr_features:        Instrumentation features. Bits 7:4 hold the max size
+ *                         of events. Bits 3:0 hold the offset update rate.
  */
-u32 kbase_csf_firmware_get_glb_iface(struct kbase_device *kbdev,
-	struct basep_cs_group_control *group_data, u32 max_group_num,
-	struct basep_cs_stream_control *stream_data, u32 max_total_stream_num,
-	u32 *glb_version, u32 *features, u32 *group_num, u32 *prfcnt_size);
-
+u32 kbase_csf_firmware_get_glb_iface(
+	struct kbase_device *kbdev, struct basep_cs_group_control *group_data,
+	u32 max_group_num, struct basep_cs_stream_control *stream_data,
+	u32 max_total_stream_num, u32 *glb_version, u32 *features,
+	u32 *group_num, u32 *prfcnt_size, u32 *instr_features);
 
 /**
  * Get CSF firmware header timeline metadata content
@@ -660,4 +682,125 @@ static inline long kbase_csf_timeout_in_jiffies(const unsigned int msecs)
 #endif
 }
 
+/**
+ * kbase_csf_firmware_enable_gpu_idle_timer() - Activate the idle hysteresis
+ *                                              monitoring operation
+ *
+ * Program the firmware interface with its configured hysteresis count value
+ * and enable the firmware to act on it. The Caller is
+ * assumed to hold the kbdev->csf.scheduler.interrupt_lock.
+ *
+ * @kbdev: Kbase device structure
+ */
+void kbase_csf_firmware_enable_gpu_idle_timer(struct kbase_device *kbdev);
+
+/**
+ * kbase_csf_firmware_disable_gpu_idle_timer() - Disable the idle time
+ *                                             hysteresis monitoring operation
+ *
+ * Program the firmware interface to disable the idle hysteresis timer. The
+ * Caller is assumed to hold the kbdev->csf.scheduler.interrupt_lock.
+ *
+ * @kbdev: Kbase device structure
+ */
+void kbase_csf_firmware_disable_gpu_idle_timer(struct kbase_device *kbdev);
+
+/**
+ * kbase_csf_firmware_get_gpu_idle_hysteresis_time - Get the firmware GPU idle
+ *                                               detection hysteresis duration
+ *
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
+ *
+ * Return: the internally recorded hysteresis (nominal) value.
+ */
+u32 kbase_csf_firmware_get_gpu_idle_hysteresis_time(struct kbase_device *kbdev);
+
+/**
+ * kbase_csf_firmware_set_gpu_idle_hysteresis_time - Set the firmware GPU idle
+ *                                               detection hysteresis duration
+ *
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
+ * @dur:     The duration value (unit: milliseconds) for the configuring
+ *           hysteresis field for GPU idle detection
+ *
+ * The supplied value will be recorded internally without any change. But the
+ * actual field value will be subject to hysteresis source frequency scaling
+ * and maximum value limiting. The default source will be SYSTEM_TIMESTAMP
+ * counter. But in case the platform is not able to supply it, the GPU
+ * CYCLE_COUNTER source will be used as an alternative. Bit-31 on the
+ * returned value is the source configuration flag, and it is set to '1'
+ * when CYCLE_COUNTER alternative source is used.
+ *
+ * Return: the actual internally configured hysteresis field value.
+ */
+u32 kbase_csf_firmware_set_gpu_idle_hysteresis_time(struct kbase_device *kbdev, u32 dur);
+
+/**
+ * kbase_csf_firmware_get_mcu_core_pwroff_time - Get the MCU core power-off
+ *                                               time value
+ *
+ * @kbdev:   Instance of a GPU platform device that implements a CSF interface.
+ *
+ * Return: the internally recorded MCU core power-off (nominal) value. The unit
+ *         of the value is in micro-seconds.
+ */
+u32 kbase_csf_firmware_get_mcu_core_pwroff_time(struct kbase_device *kbdev);
+
+/**
+ * kbase_csf_firmware_set_mcu_core_pwroff_time - Set the MCU core power-off
+ *                                               time value
+ *
+ * @kbdev:   Instance of a GPU platform device that implements a CSF interface.
+ * @dur:     The duration value (unit: micro-seconds) for configuring MCU
+ *           core power-off timer, when the shader cores' power
+ *           transitions are delegated to the MCU (normal operational
+ *           mode)
+ *
+ * The supplied value will be recorded internally without any change. But the
+ * actual field value will be subject to core power-off timer source frequency
+ * scaling and maximum value limiting. The default source will be
+ * SYSTEM_TIMESTAMP counter. But in case the platform is not able to supply it,
+ * the GPU CYCLE_COUNTER source will be used as an alternative. Bit-31 on the
+ * returned value is the source configuration flag, and it is set to '1'
+ * when CYCLE_COUNTER alternative source is used.
+ *
+ * The configured MCU core power-off timer will only have effect when the host
+ * driver has delegated the shader cores' power management to MCU.
+ *
+ * Return: the actual internal core power-off timer value in register defined
+ *         format.
+ */
+u32 kbase_csf_firmware_set_mcu_core_pwroff_time(struct kbase_device *kbdev, u32 dur);
+
+/**
+ * kbase_csf_interface_version - Helper function to build the full firmware
+ *                               interface version in a format compatible with
+ *                               with GLB_VERSION register
+ *
+ * @major:     major version of csf interface
+ * @minor:     minor version of csf interface
+ * @patch:     patch version of csf interface
+ *
+ * Return: firmware interface version
+ */
+static inline u32 kbase_csf_interface_version(u32 major, u32 minor, u32 patch)
+{
+	return ((major << GLB_VERSION_MAJOR_SHIFT) |
+		(minor << GLB_VERSION_MINOR_SHIFT) |
+		(patch << GLB_VERSION_PATCH_SHIFT));
+}
+
+/**
+ * kbase_csf_trigger_firmware_config_update - Send a firmware config update.
+ *
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
+ *
+ * Any changes done to firmware configuration entry or tracebuffer entry
+ * requires a GPU silent reset to reflect the configuration changes
+ * requested, but if Firmware.header.entry.bit(30) is set then we can request a
+ * FIRMWARE_CONFIG_UPDATE rather than doing a silent reset.
+ *
+ * Return: 0 if success, or negative error code on failure.
+ */
+int kbase_csf_trigger_firmware_config_update(struct kbase_device *kbdev);
 #endif
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_cfg.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_cfg.c
index d282d5ca7fc2..10bc4197f83a 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_cfg.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_cfg.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
@@ -41,6 +40,8 @@
  *               inside CSF_FIRMWARE_CFG_SYSFS_DIR_NAME directory,
  *               representing the configuration option @name.
  * @kobj_inited: kobject initialization state
+ * @updatable:   Indicates whether config items can be updated with
+ *               FIRMWARE_CONFIG_UPDATE
  * @name:        NUL-terminated string naming the option
  * @address:     The address in the firmware image of the configuration option
  * @min:         The lowest legal value of the configuration option
@@ -52,6 +53,7 @@ struct firmware_config {
 	struct kbase_device *kbdev;
 	struct kobject kobj;
 	bool kobj_inited;
+	bool updatable;
 	char *name;
 	u32 address;
 	u32 min;
@@ -142,14 +144,20 @@ static ssize_t store_fw_cfg(struct kobject *kobj,
 			return count;
 		}
 
-		/*
-		 * If there is already a GPU reset pending then inform
-		 * the User to retry the write.
+		/* If configuration update cannot be performed with
+		 * FIRMWARE_CONFIG_UPDATE then we need to do a
+		 * silent reset before we update the memory.
 		 */
-		if (kbase_reset_gpu_silent(kbdev)) {
-			spin_unlock_irqrestore(
-				&kbdev->hwaccess_lock, flags);
-			return -EAGAIN;
+		if (!config->updatable) {
+			/*
+			 * If there is already a GPU reset pending then inform
+			 * the User to retry the write.
+			 */
+			if (kbase_reset_gpu_silent(kbdev)) {
+				spin_unlock_irqrestore(&kbdev->hwaccess_lock,
+						       flags);
+				return -EAGAIN;
+			}
 		}
 
 		/*
@@ -165,10 +173,21 @@ static ssize_t store_fw_cfg(struct kobject *kobj,
 			kbdev, config->address, val);
 
 		config->cur_val = val;
+
 		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 
+		/* If we can update the config without firmware reset then
+		 * we need to just trigger FIRMWARE_CONFIG_UPDATE.
+		 */
+		if (config->updatable) {
+			ret = kbase_csf_trigger_firmware_config_update(kbdev);
+			if (ret)
+				return ret;
+		}
+
 		/* Wait for the config update to take effect */
-		kbase_reset_gpu_wait(kbdev);
+		if (!config->updatable)
+			kbase_reset_gpu_wait(kbdev);
 	} else {
 		dev_warn(kbdev->dev,
 			"Unexpected write to entry %s/%s",
@@ -254,8 +273,9 @@ void kbase_csf_firmware_cfg_term(struct kbase_device *kbdev)
 }
 
 int kbase_csf_firmware_cfg_option_entry_parse(struct kbase_device *kbdev,
-		const struct firmware *fw,
-		const u32 *entry, unsigned int size)
+					      const struct firmware *fw,
+					      const u32 *entry,
+					      unsigned int size, bool updatable)
 {
 	const char *name = (char *)&entry[3];
 	struct firmware_config *config;
@@ -270,6 +290,7 @@ int kbase_csf_firmware_cfg_option_entry_parse(struct kbase_device *kbdev,
 		return -ENOMEM;
 
 	config->kbdev = kbdev;
+	config->updatable = updatable;
 	config->name = (char *)(config+1);
 	config->address = entry[0];
 	config->min = entry[1];
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_cfg.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_cfg.h
index ab4b6ebc5296..36883abad2eb 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_cfg.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_cfg.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_CSF_FIRMWARE_CFG_H_
@@ -61,12 +60,15 @@ void kbase_csf_firmware_cfg_term(struct kbase_device *kbdev);
  *
  * Return: 0 if successful, negative error code on failure
  *
- * @kbdev: Kbase device structure
- * @fw:    Firmware image containing the section
- * @entry: Pointer to the section
- * @size:  Size (in bytes) of the section
+ * @kbdev:     Kbase device structure
+ * @fw:        Firmware image containing the section
+ * @entry:     Pointer to the section
+ * @size:      Size (in bytes) of the section
+ * @updatable: Indicates if entry can be updated with FIRMWARE_CONFIG_UPDATE
  */
 int kbase_csf_firmware_cfg_option_entry_parse(struct kbase_device *kbdev,
-		const struct firmware *fw,
-		const u32 *entry, unsigned int size);
+					      const struct firmware *fw,
+					      const u32 *entry,
+					      unsigned int size,
+					      bool updatable);
 #endif /* _KBASE_CSF_FIRMWARE_CFG_H_ */
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_no_mali.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_no_mali.c
index 7401113c5d6a..311e3bba6f43 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_no_mali.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_firmware_no_mali.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "mali_kbase.h"
@@ -26,19 +25,23 @@
 #include "mali_kbase_csf_timeout.h"
 #include "mali_kbase_mem.h"
 #include "mali_kbase_reset_gpu.h"
+#include "mali_kbase_ctx_sched.h"
 #include "device/mali_kbase_device.h"
 #include "backend/gpu/mali_kbase_pm_internal.h"
 #include "mali_kbase_csf_scheduler.h"
 #include "mmu/mali_kbase_mmu.h"
+#include "backend/gpu/mali_kbase_clk_rate_trace_mgr.h"
 
 #include <linux/list.h>
 #include <linux/slab.h>
 #include <linux/firmware.h>
 #include <linux/mman.h>
 #include <linux/string.h>
+#include <linux/mutex.h>
 #if (KERNEL_VERSION(4, 13, 0) <= LINUX_VERSION_CODE)
 #include <linux/set_memory.h>
 #endif
+#include <asm/arch_timer.h>
 
 #ifdef CONFIG_MALI_BIFROST_DEBUG
 /* Makes Driver wait indefinitely for an acknowledgment for the different
@@ -56,7 +59,7 @@ MODULE_PARM_DESC(fw_debug,
 #define DUMMY_FW_PAGE_SIZE SZ_4K
 
 /**
- * struct dummy_firmware_csi - Represents a dummy interface for MCU firmware streams
+ * struct dummy_firmware_csi - Represents a dummy interface for MCU firmware CSs
  *
  * @cs_kernel_input:  CS kernel input memory region
  * @cs_kernel_output: CS kernel output memory region
@@ -67,7 +70,7 @@ struct dummy_firmware_csi {
 };
 
 /**
- * struct dummy_firmware_csg - Represents a dummy interface for MCU firmware stream groups
+ * struct dummy_firmware_csg - Represents a dummy interface for MCU firmware CSGs
  *
  * @csg_input:  CSG kernel input memory region
  * @csg_output: CSG kernel output memory region
@@ -95,8 +98,9 @@ struct dummy_firmware_interface {
 	struct list_head node;
 } dummy_firmware_interface;
 
-#define CSF_GLB_REQ_CFG_MASK \
-	(GLB_REQ_CFG_ALLOC_EN_MASK | GLB_REQ_CFG_PROGRESS_TIMER_MASK)
+#define CSF_GLB_REQ_CFG_MASK                                                   \
+	(GLB_REQ_CFG_ALLOC_EN_MASK | GLB_REQ_CFG_PROGRESS_TIMER_MASK |         \
+	 GLB_REQ_CFG_PWROFF_TIMER_MASK)
 
 static inline u32 input_page_read(const u32 *const input, const u32 offset)
 {
@@ -233,6 +237,9 @@ static int invent_capabilities(struct kbase_device *kbdev)
 	iface->kbdev = kbdev;
 	iface->features = 0;
 	iface->prfcnt_size = 64;
+	iface->instr_features =
+		0x81; /* update rate=1, max event size = 1<<8 = 256 */
+
 	iface->group_num = ARRAY_SIZE(interface->csg);
 	iface->group_stride = 0;
 
@@ -416,6 +423,69 @@ u32 kbase_csf_firmware_global_output(
 	return val;
 }
 
+/**
+ * handle_internal_firmware_fatal - Handler for CS internal firmware fault.
+ *
+ * @kbdev:  Pointer to kbase device
+ *
+ * Report group fatal error to user space for all GPU command queue groups
+ * in the device, terminate them and reset GPU.
+ */
+static void handle_internal_firmware_fatal(struct kbase_device *const kbdev)
+{
+	int as;
+
+	for (as = 0; as < kbdev->nr_hw_address_spaces; as++) {
+		unsigned long flags;
+		struct kbase_context *kctx;
+		struct kbase_fault fault;
+
+		if (as == MCU_AS_NR)
+			continue;
+
+		/* Only handle the fault for an active address space. Lock is
+		 * taken here to atomically get reference to context in an
+		 * active address space and retain its refcount.
+		 */
+		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+		kctx = kbase_ctx_sched_as_to_ctx_nolock(kbdev, as);
+
+		if (kctx) {
+			kbase_ctx_sched_retain_ctx_refcount(kctx);
+			spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+		} else {
+			spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+			continue;
+		}
+
+		fault = (struct kbase_fault) {
+			.status = GPU_EXCEPTION_TYPE_SW_FAULT_1,
+		};
+
+		kbase_csf_ctx_handle_fault(kctx, &fault);
+		kbase_ctx_sched_release_ctx_lock(kctx);
+	}
+
+	if (kbase_prepare_to_reset_gpu(kbdev,
+				       RESET_FLAGS_HWC_UNRECOVERABLE_ERROR))
+		kbase_reset_gpu(kbdev);
+}
+
+/**
+ * firmware_error_worker - Worker function for handling firmware internal error
+ *
+ * @data: Pointer to a work_struct embedded in kbase device.
+ *
+ * Handle the CS internal firmware error
+ */
+static void firmware_error_worker(struct work_struct *const data)
+{
+	struct kbase_device *const kbdev =
+		container_of(data, struct kbase_device, csf.fw_error_work);
+
+	handle_internal_firmware_fatal(kbdev);
+}
+
 static bool global_request_complete(struct kbase_device *const kbdev,
 				    u32 const req_mask)
 {
@@ -441,7 +511,7 @@ static int wait_for_global_request(struct kbase_device *const kbdev,
 				   u32 const req_mask)
 {
 	const long wait_timeout =
-		kbase_csf_timeout_in_jiffies(GLB_REQ_WAIT_TIMEOUT_MS);
+		kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms);
 	long remaining;
 	int err = 0;
 
@@ -464,7 +534,7 @@ static void set_global_request(
 {
 	u32 glb_req;
 
-	lockdep_assert_held(&global_iface->kbdev->csf.reg_lock);
+	kbase_csf_scheduler_spin_lock_assert_held(global_iface->kbdev);
 
 	glb_req = kbase_csf_firmware_global_output(global_iface, GLB_ACK);
 	glb_req ^= req_mask;
@@ -484,6 +554,26 @@ static void enable_endpoints_global(
 	set_global_request(global_iface, GLB_REQ_CFG_ALLOC_EN_MASK);
 }
 
+static void enable_shader_poweroff_timer(struct kbase_device *const kbdev,
+		const struct kbase_csf_global_iface *const global_iface)
+{
+	u32 pwroff_reg;
+
+	if (kbdev->csf.firmware_hctl_core_pwr)
+		pwroff_reg =
+		    GLB_PWROFF_TIMER_TIMER_SOURCE_SET(DISABLE_GLB_PWROFF_TIMER,
+			GLB_PWROFF_TIMER_TIMER_SOURCE_SYSTEM_TIMESTAMP);
+	else
+		pwroff_reg = kbdev->csf.mcu_core_pwroff_dur_count;
+
+	kbase_csf_firmware_global_input(global_iface, GLB_PWROFF_TIMER,
+					pwroff_reg);
+	set_global_request(global_iface, GLB_REQ_CFG_PWROFF_TIMER_MASK);
+
+	/* Save the programed reg value in its shadow field */
+	kbdev->csf.mcu_core_pwroff_reg_shadow = pwroff_reg;
+}
+
 static void set_timeout_global(
 	const struct kbase_csf_global_iface *const global_iface,
 	u64 const timeout)
@@ -494,13 +584,16 @@ static void set_timeout_global(
 	set_global_request(global_iface, GLB_REQ_CFG_PROGRESS_TIMER_MASK);
 }
 
-static void global_init(struct kbase_device *const kbdev, u32 req_mask)
+static void global_init(struct kbase_device *const kbdev, u64 core_mask)
 {
-	u32 const ack_irq_mask = GLB_ACK_IRQ_MASK_CFG_ALLOC_EN_MASK  |
-			GLB_ACK_IRQ_MASK_PING_MASK |
-			GLB_ACK_IRQ_MASK_CFG_PROGRESS_TIMER_MASK |
-			GLB_ACK_IRQ_MASK_PROTM_ENTER_MASK |
-			GLB_ACK_IRQ_MASK_PROTM_EXIT_MASK;
+	u32 const ack_irq_mask = GLB_ACK_IRQ_MASK_CFG_ALLOC_EN_MASK |
+				 GLB_ACK_IRQ_MASK_PING_MASK |
+				 GLB_ACK_IRQ_MASK_CFG_PROGRESS_TIMER_MASK |
+				 GLB_ACK_IRQ_MASK_PROTM_ENTER_MASK |
+				 GLB_ACK_IRQ_MASK_FIRMWARE_CONFIG_UPDATE_MASK |
+				 GLB_ACK_IRQ_MASK_PROTM_EXIT_MASK |
+				 GLB_ACK_IRQ_MASK_CFG_PWROFF_TIMER_MASK |
+				 GLB_ACK_IRQ_MASK_IDLE_EVENT_MASK;
 
 	const struct kbase_csf_global_iface *const global_iface =
 		&kbdev->csf.global_iface;
@@ -508,9 +601,9 @@ static void global_init(struct kbase_device *const kbdev, u32 req_mask)
 
 	kbase_csf_scheduler_spin_lock(kbdev, &flags);
 
-	/* Enable endpoints on all present shader cores */
-	enable_endpoints_global(global_iface,
-		kbase_pm_get_present_cores(kbdev, KBASE_PM_CORE_SHADER));
+	/* Update shader core allocation enable mask */
+	enable_endpoints_global(global_iface, core_mask);
+	enable_shader_poweroff_timer(kbdev, global_iface);
 
 	set_timeout_global(global_iface, kbase_csf_timeout_get(kbdev));
 
@@ -526,8 +619,7 @@ static void global_init(struct kbase_device *const kbdev, u32 req_mask)
 /**
  * global_init_on_boot - Sends a global request to control various features.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  *
  * Currently only the request to enable endpoints and cycle counter is sent.
  *
@@ -535,19 +627,29 @@ static void global_init(struct kbase_device *const kbdev, u32 req_mask)
  */
 static int global_init_on_boot(struct kbase_device *const kbdev)
 {
-	u32 const req_mask = CSF_GLB_REQ_CFG_MASK;
+	unsigned long flags;
+	u64 core_mask;
+
+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+	core_mask = kbase_pm_ca_get_core_mask(kbdev);
+	kbdev->csf.firmware_hctl_core_pwr =
+				kbase_pm_no_mcu_core_pwroff(kbdev);
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 
-	global_init(kbdev, req_mask);
+	global_init(kbdev, core_mask);
 
-	return wait_for_global_request(kbdev, req_mask);
+	return wait_for_global_request(kbdev, CSF_GLB_REQ_CFG_MASK);
 }
 
-void kbase_csf_firmware_global_reinit(struct kbase_device *kbdev)
+void kbase_csf_firmware_global_reinit(struct kbase_device *kbdev,
+				      u64 core_mask)
 {
 	lockdep_assert_held(&kbdev->hwaccess_lock);
 
 	kbdev->csf.glb_init_request_pending = true;
-	global_init(kbdev, CSF_GLB_REQ_CFG_MASK);
+	kbdev->csf.firmware_hctl_core_pwr =
+				kbase_pm_no_mcu_core_pwroff(kbdev);
+	global_init(kbdev, core_mask);
 }
 
 bool kbase_csf_firmware_global_reinit_complete(struct kbase_device *kbdev)
@@ -561,6 +663,31 @@ bool kbase_csf_firmware_global_reinit_complete(struct kbase_device *kbdev)
 	return !kbdev->csf.glb_init_request_pending;
 }
 
+void kbase_csf_firmware_update_core_attr(struct kbase_device *kbdev,
+		bool update_core_pwroff_timer, bool update_core_mask, u64 core_mask)
+{
+	unsigned long flags;
+
+	lockdep_assert_held(&kbdev->hwaccess_lock);
+
+	kbase_csf_scheduler_spin_lock(kbdev, &flags);
+	if (update_core_mask)
+		enable_endpoints_global(&kbdev->csf.global_iface, core_mask);
+	if (update_core_pwroff_timer)
+		enable_shader_poweroff_timer(kbdev, &kbdev->csf.global_iface);
+
+	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
+	kbase_csf_scheduler_spin_unlock(kbdev, flags);
+}
+
+bool kbase_csf_firmware_core_attr_updated(struct kbase_device *kbdev)
+{
+	lockdep_assert_held(&kbdev->hwaccess_lock);
+
+	return global_request_complete(kbdev, GLB_REQ_CFG_ALLOC_EN_MASK |
+					      GLB_REQ_CFG_PWROFF_TIMER_MASK);
+}
+
 static void kbase_csf_firmware_reload_worker(struct work_struct *work)
 {
 	struct kbase_device *kbdev = container_of(work, struct kbase_device,
@@ -604,6 +731,129 @@ void kbase_csf_firmware_reload_completed(struct kbase_device *kbdev)
 	kbase_pm_update_state(kbdev);
 }
 
+static u32 convert_dur_to_idle_count(struct kbase_device *kbdev, const u32 dur_ms)
+{
+#define HYSTERESIS_VAL_UNIT_SHIFT (10)
+	/* Get the cntfreq_el0 value, which drives the SYSTEM_TIMESTAMP */
+	u64 freq = arch_timer_get_cntfrq();
+	u64 dur_val = dur_ms;
+	u32 cnt_val_u32, reg_val_u32;
+	bool src_system_timestamp = freq > 0;
+
+	if (!src_system_timestamp) {
+		/* Get the cycle_counter source alternative */
+		spin_lock(&kbdev->pm.clk_rtm.lock);
+		if (kbdev->pm.clk_rtm.clks[0])
+			freq = kbdev->pm.clk_rtm.clks[0]->clock_val;
+		else
+			dev_warn(kbdev->dev, "No GPU clock, unexpected intregration issue!");
+		spin_unlock(&kbdev->pm.clk_rtm.lock);
+
+		dev_info(kbdev->dev, "Can't get the timestamp frequency, "
+			 "use cycle counter format with firmware idle hysteresis!");
+	}
+
+	/* Formula for dur_val = ((dur_ms/1000) * freq_HZ) >> 10) */
+	dur_val = (dur_val * freq) >> HYSTERESIS_VAL_UNIT_SHIFT;
+	dur_val = div_u64(dur_val, 1000);
+
+	/* Interface limits the value field to S32_MAX */
+	cnt_val_u32 = (dur_val > S32_MAX) ? S32_MAX : (u32)dur_val;
+
+	reg_val_u32 = GLB_IDLE_TIMER_TIMEOUT_SET(0, cnt_val_u32);
+	/* add the source flag */
+	if (src_system_timestamp)
+		reg_val_u32 = GLB_IDLE_TIMER_TIMER_SOURCE_SET(reg_val_u32,
+				GLB_IDLE_TIMER_TIMER_SOURCE_SYSTEM_TIMESTAMP);
+	else
+		reg_val_u32 = GLB_IDLE_TIMER_TIMER_SOURCE_SET(reg_val_u32,
+				GLB_IDLE_TIMER_TIMER_SOURCE_GPU_COUNTER);
+
+	return reg_val_u32;
+}
+
+u32 kbase_csf_firmware_get_gpu_idle_hysteresis_time(struct kbase_device *kbdev)
+{
+	return kbdev->csf.gpu_idle_hysteresis_ms;
+}
+
+u32 kbase_csf_firmware_set_gpu_idle_hysteresis_time(struct kbase_device *kbdev, u32 dur)
+{
+	unsigned long flags;
+	const u32 hysteresis_val = convert_dur_to_idle_count(kbdev, dur);
+
+	kbase_csf_scheduler_spin_lock(kbdev, &flags);
+	kbdev->csf.gpu_idle_hysteresis_ms = dur;
+	kbdev->csf.gpu_idle_dur_count = hysteresis_val;
+	kbase_csf_scheduler_spin_unlock(kbdev, flags);
+
+	dev_dbg(kbdev->dev, "CSF set firmware idle hysteresis count-value: 0x%.8x",
+		hysteresis_val);
+
+	return hysteresis_val;
+}
+
+static u32 convert_dur_to_core_pwroff_count(struct kbase_device *kbdev, const u32 dur_us)
+{
+#define PWROFF_VAL_UNIT_SHIFT (10)
+	/* Get the cntfreq_el0 value, which drives the SYSTEM_TIMESTAMP */
+	u64 freq = arch_timer_get_cntfrq();
+	u64 dur_val = dur_us;
+	u32 cnt_val_u32, reg_val_u32;
+	bool src_system_timestamp = freq > 0;
+
+	if (!src_system_timestamp) {
+		/* Get the cycle_counter source alternative */
+		spin_lock(&kbdev->pm.clk_rtm.lock);
+		if (kbdev->pm.clk_rtm.clks[0])
+			freq = kbdev->pm.clk_rtm.clks[0]->clock_val;
+		else
+			dev_warn(kbdev->dev, "No GPU clock, unexpected integration issue!");
+		spin_unlock(&kbdev->pm.clk_rtm.lock);
+
+		dev_info(kbdev->dev, "Can't get the timestamp frequency, "
+			 "use cycle counter with MCU Core Poweroff timer!");
+	}
+
+	/* Formula for dur_val = ((dur_us/1e6) * freq_HZ) >> 10) */
+	dur_val = (dur_val * freq) >> HYSTERESIS_VAL_UNIT_SHIFT;
+	dur_val = div_u64(dur_val, 1000000);
+
+	/* Interface limits the value field to S32_MAX */
+	cnt_val_u32 = (dur_val > S32_MAX) ? S32_MAX : (u32)dur_val;
+
+	reg_val_u32 = GLB_PWROFF_TIMER_TIMEOUT_SET(0, cnt_val_u32);
+	/* add the source flag */
+	if (src_system_timestamp)
+		reg_val_u32 = GLB_PWROFF_TIMER_TIMER_SOURCE_SET(reg_val_u32,
+				GLB_PWROFF_TIMER_TIMER_SOURCE_SYSTEM_TIMESTAMP);
+	else
+		reg_val_u32 = GLB_PWROFF_TIMER_TIMER_SOURCE_SET(reg_val_u32,
+				GLB_PWROFF_TIMER_TIMER_SOURCE_GPU_COUNTER);
+
+	return reg_val_u32;
+}
+
+u32 kbase_csf_firmware_get_mcu_core_pwroff_time(struct kbase_device *kbdev)
+{
+	return kbdev->csf.mcu_core_pwroff_dur_us;
+}
+
+u32 kbase_csf_firmware_set_mcu_core_pwroff_time(struct kbase_device *kbdev, u32 dur)
+{
+	unsigned long flags;
+	const u32 pwroff = convert_dur_to_core_pwroff_count(kbdev, dur);
+
+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+	kbdev->csf.mcu_core_pwroff_dur_us = dur;
+	kbdev->csf.mcu_core_pwroff_dur_count = pwroff;
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+
+	dev_dbg(kbdev->dev, "MCU Core Poweroff input update: 0x%.8x", pwroff);
+
+	return pwroff;
+}
+
 int kbase_csf_firmware_init(struct kbase_device *kbdev)
 {
 	int ret;
@@ -623,15 +873,21 @@ int kbase_csf_firmware_init(struct kbase_device *kbdev)
 
 	init_waitqueue_head(&kbdev->csf.event_wait);
 	kbdev->csf.interrupt_received = false;
+	kbdev->csf.fw_timeout_ms = CSF_FIRMWARE_TIMEOUT_MS;
 
 	INIT_LIST_HEAD(&kbdev->csf.firmware_interfaces);
 	INIT_LIST_HEAD(&kbdev->csf.firmware_config);
 	INIT_LIST_HEAD(&kbdev->csf.firmware_trace_buffers.list);
 	INIT_WORK(&kbdev->csf.firmware_reload_work,
 		  kbase_csf_firmware_reload_worker);
+	INIT_WORK(&kbdev->csf.fw_error_work, firmware_error_worker);
 
 	mutex_init(&kbdev->csf.reg_lock);
 
+	kbdev->csf.gpu_idle_hysteresis_ms = FIRMWARE_IDLE_HYSTERESIS_TIME_MS;
+	kbdev->csf.gpu_idle_dur_count = convert_dur_to_idle_count(kbdev,
+						FIRMWARE_IDLE_HYSTERESIS_TIME_MS);
+
 	ret = kbase_mcu_shared_interface_region_tracker_init(kbdev);
 	if (ret != 0) {
 		dev_err(kbdev->dev, "Failed to setup the rb tree for managing shared interface segment\n");
@@ -659,6 +915,10 @@ int kbase_csf_firmware_init(struct kbase_device *kbdev)
 	if (ret != 0)
 		goto error;
 
+	ret = kbase_csf_setup_dummy_user_reg_page(kbdev);
+	if (ret != 0)
+		goto error;
+
 	ret = kbase_csf_scheduler_init(kbdev);
 	if (ret != 0)
 		goto error;
@@ -680,6 +940,8 @@ int kbase_csf_firmware_init(struct kbase_device *kbdev)
 
 void kbase_csf_firmware_term(struct kbase_device *kbdev)
 {
+	cancel_work_sync(&kbdev->csf.fw_error_work);
+
 	kbase_csf_timeout_term(kbdev);
 
 	/* NO_MALI: Don't stop firmware or unload MMU tables */
@@ -688,6 +950,8 @@ void kbase_csf_firmware_term(struct kbase_device *kbdev)
 
 	kbase_csf_scheduler_term(kbdev);
 
+	kbase_csf_free_dummy_user_reg_page(kbdev);
+
 	kbase_csf_doorbell_mapping_term(kbdev);
 
 	free_global_iface(kbdev);
@@ -721,7 +985,51 @@ void kbase_csf_firmware_term(struct kbase_device *kbdev)
 	kbase_mcu_shared_interface_region_tracker_term(kbdev);
 }
 
-int kbase_csf_firmware_ping(struct kbase_device *const kbdev)
+void kbase_csf_firmware_enable_gpu_idle_timer(struct kbase_device *kbdev)
+{
+	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
+	u32 glb_req;
+
+	kbase_csf_scheduler_spin_lock_assert_held(kbdev);
+
+	/* The scheduler is assumed to only call the enable when its internal
+	 * state indicates that the idle timer has previously been disabled. So
+	 * on entry the expected field values are:
+	 *   1. GLOBAL_INPUT_BLOCK.GLB_REQ.IDLE_ENABLE: 0
+	 *   2. GLOBAL_OUTPUT_BLOCK.GLB_ACK.IDLE_ENABLE: 0, or, on 1 -> 0
+	 */
+
+	glb_req = kbase_csf_firmware_global_input_read(global_iface, GLB_REQ);
+	if (glb_req & GLB_REQ_IDLE_ENABLE_MASK)
+		dev_err(kbdev->dev, "Incoherent scheduler state on REQ_IDLE_ENABLE!");
+
+	kbase_csf_firmware_global_input(global_iface, GLB_IDLE_TIMER,
+					kbdev->csf.gpu_idle_dur_count);
+
+	kbase_csf_firmware_global_input_mask(global_iface, GLB_REQ,
+				GLB_REQ_REQ_IDLE_ENABLE, GLB_REQ_IDLE_ENABLE_MASK);
+
+	dev_dbg(kbdev->dev, "Enabling GPU idle timer with count-value: 0x%.8x",
+		kbdev->csf.gpu_idle_dur_count);
+	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
+}
+
+void kbase_csf_firmware_disable_gpu_idle_timer(struct kbase_device *kbdev)
+{
+	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
+
+	kbase_csf_scheduler_spin_lock_assert_held(kbdev);
+
+	kbase_csf_firmware_global_input_mask(global_iface, GLB_REQ,
+					GLB_REQ_REQ_IDLE_DISABLE,
+					GLB_REQ_IDLE_DISABLE_MASK);
+
+	dev_dbg(kbdev->dev, "Sending request to disable gpu idle timer");
+
+	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
+}
+
+void kbase_csf_firmware_ping(struct kbase_device *const kbdev)
 {
 	const struct kbase_csf_global_iface *const global_iface =
 		&kbdev->csf.global_iface;
@@ -731,7 +1039,11 @@ int kbase_csf_firmware_ping(struct kbase_device *const kbdev)
 	set_global_request(global_iface, GLB_REQ_PING_MASK);
 	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
+}
 
+int kbase_csf_firmware_ping_wait(struct kbase_device *const kbdev)
+{
+	kbase_csf_firmware_ping(kbdev);
 	return wait_for_global_request(kbdev, GLB_REQ_PING_MASK);
 }
 
@@ -763,13 +1075,9 @@ void kbase_csf_enter_protected_mode(struct kbase_device *kbdev)
 {
 	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
 	unsigned long flags;
-	unsigned int value;
 
 	kbase_csf_scheduler_spin_lock(kbdev, &flags);
-	value = kbase_csf_firmware_global_output(global_iface, GLB_ACK);
-	value ^= GLB_REQ_PROTM_ENTER_MASK;
-	kbase_csf_firmware_global_input_mask(global_iface, GLB_REQ, value,
-					     GLB_REQ_PROTM_ENTER_MASK);
+	set_global_request(global_iface, GLB_REQ_PROTM_ENTER_MASK);
 	dev_dbg(kbdev->dev, "Sending request to enter protected mode");
 	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
@@ -781,22 +1089,41 @@ void kbase_csf_firmware_trigger_mcu_halt(struct kbase_device *kbdev)
 {
 	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
 	unsigned long flags;
-	unsigned int value;
 
 	kbase_csf_scheduler_spin_lock(kbdev, &flags);
-	value = kbase_csf_firmware_global_output(global_iface, GLB_ACK);
-	value ^= GLB_REQ_HALT_MASK;
-	kbase_csf_firmware_global_input_mask(global_iface, GLB_REQ, value,
-					     GLB_REQ_HALT_MASK);
+	set_global_request(global_iface, GLB_REQ_HALT_MASK);
 	dev_dbg(kbdev->dev, "Sending request to HALT MCU");
 	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
 	kbase_csf_scheduler_spin_unlock(kbdev, flags);
 }
 
+int kbase_csf_trigger_firmware_config_update(struct kbase_device *kbdev)
+{
+	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
+	unsigned long flags;
+	int err = 0;
+
+	/* The 'reg_lock' is also taken and is held till the update is
+	 * complete, to ensure the config update gets serialized.
+	 */
+	mutex_lock(&kbdev->csf.reg_lock);
+	kbase_csf_scheduler_spin_lock(kbdev, &flags);
+
+	set_global_request(global_iface, GLB_REQ_FIRMWARE_CONFIG_UPDATE_MASK);
+	dev_dbg(kbdev->dev, "Sending request for FIRMWARE_CONFIG_UPDATE");
+	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
+	kbase_csf_scheduler_spin_unlock(kbdev, flags);
+
+	err = wait_for_global_request(kbdev,
+				      GLB_REQ_FIRMWARE_CONFIG_UPDATE_MASK);
+	mutex_unlock(&kbdev->csf.reg_lock);
+	return err;
+}
+
 /**
- * copy_grp_and_stm - Copy command stream and/or group data
+ * copy_grp_and_stm - Copy CS and/or group data
  *
- * @iface:                Global command stream front-end interface provided by
+ * @iface:                Global CSF interface provided by
  *                        the firmware.
  * @group_data:           Pointer where to store all the group data
  *                        (sequentially).
@@ -807,7 +1134,7 @@ void kbase_csf_firmware_trigger_mcu_halt(struct kbase_device *kbdev)
  * @max_total_stream_num: The maximum number of streams to be read.
  *                        Can be 0, in which case stream_data is unused.
  *
- * Return: Total number of command streams, summed across all groups.
+ * Return: Total number of CSs, summed across all groups.
  */
 static u32 copy_grp_and_stm(
 	const struct kbase_csf_global_iface * const iface,
@@ -830,6 +1157,8 @@ static u32 copy_grp_and_stm(
 		if (i < max_group_num) {
 			group_data[i].features = iface->groups[i].features;
 			group_data[i].stream_num = iface->groups[i].stream_num;
+			group_data[i].suspend_size =
+				iface->groups[i].suspend_size;
 		}
 		for (j = 0; j < iface->groups[i].stream_num; j++) {
 			if (total_stream_num < max_total_stream_num)
@@ -842,26 +1171,28 @@ static u32 copy_grp_and_stm(
 	return total_stream_num;
 }
 
-u32 kbase_csf_firmware_get_glb_iface(struct kbase_device *kbdev,
+u32 kbase_csf_firmware_get_glb_iface(
+	struct kbase_device *kbdev,
 	struct basep_cs_group_control *const group_data,
 	u32 const max_group_num,
 	struct basep_cs_stream_control *const stream_data,
 	u32 const max_total_stream_num, u32 *const glb_version,
-	u32 *const features, u32 *const group_num, u32 *const prfcnt_size)
+	u32 *const features, u32 *const group_num, u32 *const prfcnt_size,
+	u32 *const instr_features)
 {
 	const struct kbase_csf_global_iface * const iface =
 		&kbdev->csf.global_iface;
 
-	if (WARN_ON(!glb_version) ||
-		WARN_ON(!features) ||
-		WARN_ON(!group_num) ||
-		WARN_ON(!prfcnt_size))
+	if (WARN_ON(!glb_version) || WARN_ON(!features) ||
+	    WARN_ON(!group_num) || WARN_ON(!prfcnt_size) ||
+	    WARN_ON(!instr_features))
 		return 0;
 
 	*glb_version = iface->version;
 	*features = iface->features;
 	*group_num = iface->group_num;
 	*prfcnt_size = iface->prfcnt_size;
+	*instr_features = iface->instr_features;
 
 	return copy_grp_and_stm(iface, group_data, max_group_num,
 		stream_data, max_total_stream_num);
@@ -941,9 +1272,9 @@ int kbase_csf_firmware_mcu_shared_mapping_init(
 	mutex_lock(&kbdev->csf.reg_lock);
 	ret = kbase_add_va_region_rbtree(kbdev, va_reg, 0, num_pages, 1);
 	va_reg->flags &= ~KBASE_REG_FREE;
-	mutex_unlock(&kbdev->csf.reg_lock);
 	if (ret)
 		goto va_region_add_error;
+	mutex_unlock(&kbdev->csf.reg_lock);
 
 	gpu_map_properties &= (KBASE_REG_GPU_RD | KBASE_REG_GPU_WR);
 	gpu_map_properties |= gpu_map_prot;
@@ -965,9 +1296,9 @@ int kbase_csf_firmware_mcu_shared_mapping_init(
 mmu_insert_pages_error:
 	mutex_lock(&kbdev->csf.reg_lock);
 	kbase_remove_va_region(va_reg);
-	mutex_unlock(&kbdev->csf.reg_lock);
 va_region_add_error:
 	kbase_free_alloced_region(va_reg);
+	mutex_unlock(&kbdev->csf.reg_lock);
 va_region_alloc_error:
 	vunmap(cpu_addr);
 vmap_error:
@@ -981,7 +1312,8 @@ int kbase_csf_firmware_mcu_shared_mapping_init(
 	kfree(phys);
 out:
 	/* Zero-initialize the mapping to make sure that the termination
-	 * function doesn't try to unmap or free random addresses. */
+	 * function doesn't try to unmap or free random addresses.
+	 */
 	csf_mapping->phys = NULL;
 	csf_mapping->cpu_addr = NULL;
 	csf_mapping->va_reg = NULL;
@@ -996,8 +1328,8 @@ void kbase_csf_firmware_mcu_shared_mapping_term(
 	if (csf_mapping->va_reg) {
 		mutex_lock(&kbdev->csf.reg_lock);
 		kbase_remove_va_region(csf_mapping->va_reg);
-		mutex_unlock(&kbdev->csf.reg_lock);
 		kbase_free_alloced_region(csf_mapping->va_reg);
+		mutex_unlock(&kbdev->csf.reg_lock);
 	}
 
 	if (csf_mapping->phys) {
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_heap_context_alloc.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_heap_context_alloc.c
index 087cc858c2b8..6c6d181d27e1 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_heap_context_alloc.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_heap_context_alloc.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_heap_context_alloc.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_heap_context_alloc.h
index f71ea01ed8c0..a39ee92cad24 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_heap_context_alloc.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_heap_context_alloc.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu.c
index e1263d535918..1203d2c40807 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
@@ -228,15 +227,6 @@ static int kbase_kcpu_jit_allocate_process(
 
 	/* Now start the allocation loop */
 	for (i = 0, info = alloc_info->info; i < count; i++, info++) {
-		if (kctx->jit_alloc[info->id]) {
-			/* The JIT ID is duplicated in this command. Roll back
-			 * previous allocations and fail.
-			 */
-			dev_warn(kctx->kbdev->dev, "JIT ID is duplicated\n");
-			ret = -EINVAL;
-			goto fail;
-		}
-
 		/* Create a JIT allocation */
 		reg = kbase_jit_allocate(kctx, info, true);
 		if (!reg) {
@@ -251,7 +241,7 @@ static int kbase_kcpu_jit_allocate_process(
 					u8 const*const free_ids = jit_cmd->info.jit_free.ids;
 
 					if (free_ids && *free_ids && kctx->jit_alloc[*free_ids]) {
-						/**
+						/*
 						 * A JIT free which is active
 						 * and submitted before this
 						 * command.
@@ -263,11 +253,11 @@ static int kbase_kcpu_jit_allocate_process(
 			}
 
 			if (!can_block) {
-				/**
+				/*
 				 * No prior JIT_FREE command is active. Roll
 				 * back previous allocations and fail.
 				 */
-				dev_warn_ratelimited(kctx->kbdev->dev, "JIT alloc command failed: %p\n", cmd);
+				dev_warn_ratelimited(kctx->kbdev->dev, "JIT alloc command failed: %pK\n", cmd);
 				ret = -ENOMEM;
 				goto fail;
 			}
@@ -368,6 +358,18 @@ static int kbase_kcpu_jit_allocate_prepare(
 			goto out_free;
 	}
 
+	/* Search for duplicate JIT ids */
+	for (i = 0; i < (count - 1); i++) {
+		u32 j;
+
+		for (j = (i + 1); j < count; j++) {
+			if (info[i].id == info[j].id) {
+				ret = -EINVAL;
+				goto out_free;
+			}
+		}
+	}
+
 	current_command->type = BASE_KCPU_COMMAND_TYPE_JIT_ALLOC;
 	list_add_tail(&current_command->info.jit_alloc.node,
 			&kctx->csf.kcpu_queues.jit_cmds_head);
@@ -397,7 +399,7 @@ static void kbase_kcpu_jit_allocate_finish(
 	/* Remove this command from the jit_cmds_head list */
 	list_del(&cmd->info.jit_alloc.node);
 
-	/**
+	/*
 	 * If we get to this point we must have already cleared the blocked
 	 * flag, otherwise it'd be a bug.
 	 */
@@ -420,7 +422,7 @@ static void kbase_kcpu_jit_retry_pending_allocs(struct kbase_context *kctx)
 
 	lockdep_assert_held(&kctx->csf.kcpu_queues.lock);
 
-	/**
+	/*
 	 * Reschedule all queues blocked by JIT_ALLOC commands.
 	 * NOTE: This code traverses the list of blocked queues directly. It
 	 * only works as long as the queued works are not executed at the same
@@ -432,47 +434,63 @@ static void kbase_kcpu_jit_retry_pending_allocs(struct kbase_context *kctx)
 		queue_work(kctx->csf.kcpu_queues.wq, &blocked_queue->work);
 }
 
-static int kbase_kcpu_jit_free_process(struct kbase_context *kctx,
-		struct kbase_kcpu_command *const cmd)
+static int kbase_kcpu_jit_free_process(struct kbase_kcpu_command_queue *queue,
+				       struct kbase_kcpu_command *const cmd)
 {
-	struct kbase_kcpu_command_jit_free_info *const free_info =
-			&cmd->info.jit_free;
-	u8 *ids = free_info->ids;
-	u32 count = free_info->count;
+	struct kbase_kcpu_command_jit_free_info const *const free_info =
+		&cmd->info.jit_free;
+	u8 const *const ids = free_info->ids;
+	u32 const count = free_info->count;
 	u32 i;
+	int rc = 0;
+	struct kbase_context *kctx = queue->kctx;
 
 	if (WARN_ON(!ids))
 		return -EINVAL;
 
 	lockdep_assert_held(&kctx->csf.kcpu_queues.lock);
 
-	for (i = 0; i < count; i++, ids++) {
-		if ((*ids == 0) || (kctx->jit_alloc[*ids] == NULL)) {
+	KBASE_TLSTREAM_TL_KBASE_ARRAY_BEGIN_KCPUQUEUE_EXECUTE_JIT_FREE_END(
+		queue->kctx->kbdev, queue);
+
+	for (i = 0; i < count; i++) {
+		u64 pages_used = 0;
+		int item_err = 0;
+
+		if (!kctx->jit_alloc[ids[i]]) {
 			dev_warn(kctx->kbdev->dev, "invalid JIT free ID\n");
+			rc = -EINVAL;
+			item_err = rc;
 		} else {
-			/* If the ID is valid but the allocation request
-			 * failed, still succeed this command but don't
-			 * try and free the allocation.
+			struct kbase_va_region *const reg = kctx->jit_alloc[ids[i]];
+
+			/*
+			 * If the ID is valid but the allocation request failed, still
+			 * succeed this command but don't try and free the allocation.
 			 */
-			if (kctx->jit_alloc[*ids] !=
-					KBASE_RESERVED_REG_JIT_ALLOC)
-				kbase_jit_free(kctx, kctx->jit_alloc[*ids]);
+			if (reg != KBASE_RESERVED_REG_JIT_ALLOC) {
+				pages_used = reg->gpu_alloc->nents;
+				kbase_jit_free(kctx, reg);
+			}
 
-			kctx->jit_alloc[*ids] = NULL;
+			kctx->jit_alloc[ids[i]] = NULL;
 		}
+
+		KBASE_TLSTREAM_TL_KBASE_ARRAY_ITEM_KCPUQUEUE_EXECUTE_JIT_FREE_END(
+			queue->kctx->kbdev, queue, item_err, pages_used);
 	}
 
 	/* Free the list of ids */
-	kfree(free_info->ids);
+	kfree(ids);
 
-	/**
+	/*
 	 * Remove this command from the jit_cmds_head list and retry pending
 	 * allocations.
 	 */
 	list_del(&cmd->info.jit_free.node);
 	kbase_kcpu_jit_retry_pending_allocs(kctx);
 
-	return 0;
+	return rc;
 }
 
 static int kbase_kcpu_jit_free_prepare(
@@ -520,6 +538,18 @@ static int kbase_kcpu_jit_free_prepare(
 		}
 	}
 
+	/* Search for duplicate JIT ids */
+	for (i = 0; i < (count - 1); i++) {
+		u32 j;
+
+		for (j = (i + 1); j < count; j++) {
+			if (ids[i] == ids[j]) {
+				ret = -EINVAL;
+				goto out_free;
+			}
+		}
+	}
+
 	current_command->type = BASE_KCPU_COMMAND_TYPE_JIT_FREE;
 	list_add_tail(&current_command->info.jit_free.node,
 			&kctx->csf.kcpu_queues.jit_cmds_head);
@@ -545,8 +575,8 @@ static int kbase_csf_queue_group_suspend_prepare(
 	u64 end_addr = addr + suspend_buf->size - 1;
 	u64 last_page_addr = end_addr & PAGE_MASK;
 	int nr_pages = (last_page_addr - page_addr) / PAGE_SIZE + 1;
-	int pinned_pages;
-	int ret = 0;
+	int pinned_pages = 0, ret = 0;
+	struct kbase_va_region *reg;
 
 	lockdep_assert_held(&kctx->csf.kcpu_queues.lock);
 
@@ -573,17 +603,58 @@ static int kbase_csf_queue_group_suspend_prepare(
 		goto out_clean_sus_buf;
 	}
 
-	pinned_pages = get_user_pages_fast(page_addr, nr_pages, 1,
-			sus_buf->pages);
-	if (pinned_pages < 0) {
-		ret = pinned_pages;
-		goto out_clean_pages;
-	}
-	if (pinned_pages != nr_pages) {
-		ret = -EINVAL;
-		goto out_clean_pages;
+	/* Check if the page_addr is a valid GPU VA from SAME_VA zone,
+	 * otherwise consider it is a CPU VA corresponding to the Host
+	 * memory allocated by userspace.
+	 */
+	kbase_gpu_vm_lock(kctx);
+	reg = kbase_region_tracker_find_region_enclosing_address(kctx,
+							page_addr);
+
+	if (kbase_is_region_invalid_or_free(reg)) {
+		kbase_gpu_vm_unlock(kctx);
+		pinned_pages = get_user_pages_fast(page_addr, nr_pages, 1,
+							sus_buf->pages);
+		kbase_gpu_vm_lock(kctx);
+
+		if (pinned_pages < 0) {
+			ret = pinned_pages;
+			goto out_clean_pages;
+		}
+		if (pinned_pages != nr_pages) {
+			ret = -EINVAL;
+			goto out_clean_pages;
+		}
+	} else {
+		struct tagged_addr *page_array;
+		u64 start, end, i;
+
+		if (!(reg->flags & BASE_MEM_SAME_VA) ||
+				reg->nr_pages < nr_pages ||
+				kbase_reg_current_backed_size(reg) !=
+					reg->nr_pages) {
+			ret = -EINVAL;
+			goto out_clean_pages;
+		}
+
+		start = PFN_DOWN(page_addr) - reg->start_pfn;
+		end = start + nr_pages;
+
+		if (end > reg->nr_pages) {
+			ret = -EINVAL;
+			goto out_clean_pages;
+		}
+
+		sus_buf->cpu_alloc = kbase_mem_phy_alloc_get(reg->cpu_alloc);
+		kbase_mem_phy_alloc_kernel_mapped(reg->cpu_alloc);
+		page_array = kbase_get_cpu_phy_pages(reg);
+		page_array += start;
+
+		for (i = 0; i < nr_pages; i++, page_array++)
+			sus_buf->pages[i] = as_page(*page_array);
 	}
 
+	kbase_gpu_vm_unlock(kctx);
 	current_command->type = BASE_KCPU_COMMAND_TYPE_GROUP_SUSPEND;
 	current_command->info.suspend_buf_copy.sus_buf = sus_buf;
 	current_command->info.suspend_buf_copy.group_handle =
@@ -591,9 +662,11 @@ static int kbase_csf_queue_group_suspend_prepare(
 	return ret;
 
 out_clean_pages:
+	kbase_gpu_vm_unlock(kctx);
 	kfree(sus_buf->pages);
 out_clean_sus_buf:
 	kfree(sus_buf);
+
 	return ret;
 }
 
@@ -642,13 +715,9 @@ static int kbase_kcpu_cqs_wait_process(struct kbase_device *kbdev,
 
 	lockdep_assert_held(&queue->kctx->csf.kcpu_queues.lock);
 
-	if (WARN_ON(!cqs_wait->nr_objs))
-		return -EINVAL;
-
 	if (WARN_ON(!cqs_wait->objs))
 		return -EINVAL;
 
-
 	/* Skip the CQS waits that have already been signaled when processing */
 	for (i = find_first_zero_bit(cqs_wait->signaled, cqs_wait->nr_objs); i < cqs_wait->nr_objs; i++) {
 		if (!test_bit(i, cqs_wait->signaled)) {
@@ -661,22 +730,37 @@ static int kbase_kcpu_cqs_wait_process(struct kbase_device *kbdev,
 				KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_CQS_WAIT_START(
 					kbdev, queue);
 				queue->command_started = true;
+				KBASE_KTRACE_ADD_CSF_KCPU(kbdev, CQS_WAIT_START,
+						   queue, cqs_wait->nr_objs, 0);
 			}
 
-			if (WARN_ON(!evt)) {
+			if (!evt) {
+				dev_warn(kbdev->dev,
+					"Sync memory %llx already freed", cqs_wait->objs[i].addr);
 				queue->has_error = true;
 				return -EINVAL;
 			}
 
 			sig_set = evt[BASEP_EVENT_VAL_INDEX] > cqs_wait->objs[i].val;
 			if (sig_set) {
+				bool error = false;
+
 				bitmap_set(cqs_wait->signaled, i, 1);
 				if ((cqs_wait->inherit_err_flags & (1U << i)) &&
-				    evt[BASEP_EVENT_ERR_INDEX] > 0)
+				    evt[BASEP_EVENT_ERR_INDEX] > 0) {
 					queue->has_error = true;
+					error = true;
+				}
+
+				KBASE_KTRACE_ADD_CSF_KCPU(kbdev, CQS_WAIT_END,
+						queue, cqs_wait->objs[i].addr,
+						error);
 
 				KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_CQS_WAIT_END(
-					kbdev, queue);
+					kbdev, queue,
+					queue->has_error ?
+						evt[BASEP_EVENT_ERR_INDEX] :
+						0);
 				queue->command_started = false;
 			}
 
@@ -697,12 +781,15 @@ static int kbase_kcpu_cqs_wait_prepare(struct kbase_kcpu_command_queue *queue,
 		struct base_kcpu_command_cqs_wait_info *cqs_wait_info,
 		struct kbase_kcpu_command *current_command)
 {
-	struct base_cqs_wait *objs;
+	struct base_cqs_wait_info *objs;
 	unsigned int nr_objs = cqs_wait_info->nr_objs;
 
 	lockdep_assert_held(&queue->kctx->csf.kcpu_queues.lock);
 
-	if (cqs_wait_info->nr_objs > BASEP_KCPU_CQS_MAX_NUM_OBJS)
+	if (nr_objs > BASEP_KCPU_CQS_MAX_NUM_OBJS)
+		return -EINVAL;
+
+	if (!nr_objs)
 		return -EINVAL;
 
 	objs = kcalloc(nr_objs, sizeof(*objs), GFP_KERNEL);
@@ -719,6 +806,7 @@ static int kbase_kcpu_cqs_wait_prepare(struct kbase_kcpu_command_queue *queue,
 		if (kbase_csf_event_wait_add(queue->kctx,
 				event_cqs_callback, queue)) {
 			kfree(objs);
+			queue->cqs_wait_count--;
 			return -ENOMEM;
 		}
 	}
@@ -731,8 +819,15 @@ static int kbase_kcpu_cqs_wait_prepare(struct kbase_kcpu_command_queue *queue,
 
 	current_command->info.cqs_wait.signaled = kcalloc(BITS_TO_LONGS(nr_objs),
 		sizeof(*current_command->info.cqs_wait.signaled), GFP_KERNEL);
-	if (!current_command->info.cqs_wait.signaled)
+	if (!current_command->info.cqs_wait.signaled) {
+		if (--queue->cqs_wait_count == 0) {
+			kbase_csf_event_wait_remove(queue->kctx,
+				event_cqs_callback, queue);
+		}
+
+		kfree(objs);
 		return -ENOMEM;
+	}
 
 	return 0;
 }
@@ -745,24 +840,32 @@ static void kbase_kcpu_cqs_set_process(struct kbase_device *kbdev,
 
 	lockdep_assert_held(&queue->kctx->csf.kcpu_queues.lock);
 
-	WARN_ON(!cqs_set->nr_objs);
-	WARN_ON(!cqs_set->objs);
+	if (WARN_ON(!cqs_set->objs))
+		return;
 
 	for (i = 0; i < cqs_set->nr_objs; i++) {
 		struct kbase_vmap_struct *mapping;
-		u32 *evt = (u32 *)kbase_phy_alloc_mapping_get(queue->kctx,
-					cqs_set->objs[i].addr, &mapping);
-		KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_CQS_SET(kbdev, queue);
-		if (WARN_ON(!evt))
+		u32 *evt;
+
+		evt = (u32 *)kbase_phy_alloc_mapping_get(
+			queue->kctx, cqs_set->objs[i].addr, &mapping);
+
+		KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_CQS_SET(kbdev, queue,
+								  evt ? 0 : 1);
+
+		if (!evt) {
+			dev_warn(kbdev->dev,
+				"Sync memory %llx already freed", cqs_set->objs[i].addr);
 			queue->has_error = true;
-		else {
-			if (cqs_set->propagate_flags & (1 << i))
-				evt[BASEP_EVENT_ERR_INDEX] = queue->has_error;
-			else
-				evt[BASEP_EVENT_ERR_INDEX] = false;
+		} else {
+			evt[BASEP_EVENT_ERR_INDEX] = queue->has_error;
 			/* Set to signaled */
 			evt[BASEP_EVENT_VAL_INDEX]++;
 			kbase_phy_alloc_mapping_put(queue->kctx, mapping);
+
+			KBASE_KTRACE_ADD_CSF_KCPU(kbdev, CQS_SET,
+					queue, cqs_set->objs[i].addr,
+					evt[BASEP_EVENT_ERR_INDEX]);
 		}
 	}
 
@@ -783,7 +886,10 @@ static int kbase_kcpu_cqs_set_prepare(
 
 	lockdep_assert_held(&kctx->csf.kcpu_queues.lock);
 
-	if (cqs_set_info->nr_objs > BASEP_KCPU_CQS_MAX_NUM_OBJS)
+	if (nr_objs > BASEP_KCPU_CQS_MAX_NUM_OBJS)
+		return -EINVAL;
+
+	if (!nr_objs)
 		return -EINVAL;
 
 	objs = kcalloc(nr_objs, sizeof(*objs), GFP_KERNEL);
@@ -799,8 +905,267 @@ static int kbase_kcpu_cqs_set_prepare(
 	current_command->type = BASE_KCPU_COMMAND_TYPE_CQS_SET;
 	current_command->info.cqs_set.nr_objs = nr_objs;
 	current_command->info.cqs_set.objs = objs;
-	current_command->info.cqs_set.propagate_flags =
-					cqs_set_info->propagate_flags;
+
+	return 0;
+}
+
+static void cleanup_cqs_wait_operation(struct kbase_kcpu_command_queue *queue,
+		struct kbase_kcpu_command_cqs_wait_operation_info *cqs_wait_operation)
+{
+	WARN_ON(!cqs_wait_operation->nr_objs);
+	WARN_ON(!cqs_wait_operation->objs);
+	WARN_ON(!cqs_wait_operation->signaled);
+	WARN_ON(!queue->cqs_wait_count);
+
+	if (--queue->cqs_wait_count == 0) {
+		kbase_csf_event_wait_remove(queue->kctx,
+				event_cqs_callback, queue);
+	}
+
+	kfree(cqs_wait_operation->signaled);
+	kfree(cqs_wait_operation->objs);
+	cqs_wait_operation->signaled = NULL;
+	cqs_wait_operation->objs = NULL;
+}
+
+static int kbase_kcpu_cqs_wait_operation_process(struct kbase_device *kbdev,
+		struct kbase_kcpu_command_queue *queue,
+		struct kbase_kcpu_command_cqs_wait_operation_info *cqs_wait_operation)
+{
+	u32 i;
+
+	lockdep_assert_held(&queue->kctx->csf.kcpu_queues.lock);
+
+	if (WARN_ON(!cqs_wait_operation->objs))
+		return -EINVAL;
+
+	/* Skip the CQS waits that have already been signaled when processing */
+	for (i = find_first_zero_bit(cqs_wait_operation->signaled, cqs_wait_operation->nr_objs); i < cqs_wait_operation->nr_objs; i++) {
+		if (!test_bit(i, cqs_wait_operation->signaled)) {
+			struct kbase_vmap_struct *mapping;
+			bool sig_set;
+			u64 *evt = (u64 *)kbase_phy_alloc_mapping_get(queue->kctx,
+						cqs_wait_operation->objs[i].addr, &mapping);
+
+			/* GPUCORE-28172 RDT to review */
+			if (!queue->command_started)
+				queue->command_started = true;
+
+			if (!evt) {
+				dev_warn(kbdev->dev,
+					"Sync memory %llx already freed", cqs_wait_operation->objs[i].addr);
+				queue->has_error = true;
+				return -EINVAL;
+			}
+
+			switch (cqs_wait_operation->objs[i].operation) {
+			case BASEP_CQS_WAIT_OPERATION_LE:
+				sig_set = *evt <= cqs_wait_operation->objs[i].val;
+				break;
+			case BASEP_CQS_WAIT_OPERATION_GT:
+				sig_set = *evt > cqs_wait_operation->objs[i].val;
+				break;
+			default:
+				dev_warn(kbdev->dev,
+					"Unsupported CQS wait operation %d", cqs_wait_operation->objs[i].operation);
+
+				kbase_phy_alloc_mapping_put(queue->kctx, mapping);
+				queue->has_error = true;
+
+				return -EINVAL;
+			}
+
+			/* Increment evt up to the error_state value depending on the CQS data type */
+			switch (cqs_wait_operation->objs[i].data_type) {
+			default:
+				dev_warn(kbdev->dev, "Unreachable data_type=%d", cqs_wait_operation->objs[i].data_type);
+			/* Fallthrough - hint to compiler that there's really only 2 options at present */
+			case BASEP_CQS_DATA_TYPE_U32:
+				evt = (u64 *)((u8 *)evt + sizeof(u32));
+				break;
+			case BASEP_CQS_DATA_TYPE_U64:
+				evt = (u64 *)((u8 *)evt + sizeof(u64));
+				break;
+			}
+
+			if (sig_set) {
+				bitmap_set(cqs_wait_operation->signaled, i, 1);
+				if ((cqs_wait_operation->inherit_err_flags & (1U << i)) &&
+				    *evt > 0) {
+					queue->has_error = true;
+				}
+
+				/* GPUCORE-28172 RDT to review */
+
+				queue->command_started = false;
+			}
+
+			kbase_phy_alloc_mapping_put(queue->kctx, mapping);
+
+			if (!sig_set)
+				break;
+		}
+	}
+
+	/* For the queue to progress further, all cqs objects should get
+	 * signaled.
+	 */
+	return bitmap_full(cqs_wait_operation->signaled, cqs_wait_operation->nr_objs);
+}
+
+static int kbase_kcpu_cqs_wait_operation_prepare(struct kbase_kcpu_command_queue *queue,
+		struct base_kcpu_command_cqs_wait_operation_info *cqs_wait_operation_info,
+		struct kbase_kcpu_command *current_command)
+{
+	struct base_cqs_wait_operation_info *objs;
+	unsigned int nr_objs = cqs_wait_operation_info->nr_objs;
+
+	lockdep_assert_held(&queue->kctx->csf.kcpu_queues.lock);
+
+	if (nr_objs > BASEP_KCPU_CQS_MAX_NUM_OBJS)
+		return -EINVAL;
+
+	if (!nr_objs)
+		return -EINVAL;
+
+	objs = kcalloc(nr_objs, sizeof(*objs), GFP_KERNEL);
+	if (!objs)
+		return -ENOMEM;
+
+	if (copy_from_user(objs, u64_to_user_ptr(cqs_wait_operation_info->objs),
+			nr_objs * sizeof(*objs))) {
+		kfree(objs);
+		return -ENOMEM;
+	}
+
+	if (++queue->cqs_wait_count == 1) {
+		if (kbase_csf_event_wait_add(queue->kctx,
+				event_cqs_callback, queue)) {
+			kfree(objs);
+			queue->cqs_wait_count--;
+			return -ENOMEM;
+		}
+	}
+
+	current_command->type = BASE_KCPU_COMMAND_TYPE_CQS_WAIT_OPERATION;
+	current_command->info.cqs_wait_operation.nr_objs = nr_objs;
+	current_command->info.cqs_wait_operation.objs = objs;
+	current_command->info.cqs_wait_operation.inherit_err_flags =
+					cqs_wait_operation_info->inherit_err_flags;
+
+	current_command->info.cqs_wait_operation.signaled = kcalloc(BITS_TO_LONGS(nr_objs),
+		sizeof(*current_command->info.cqs_wait_operation.signaled), GFP_KERNEL);
+	if (!current_command->info.cqs_wait_operation.signaled) {
+		if (--queue->cqs_wait_count == 0) {
+			kbase_csf_event_wait_remove(queue->kctx,
+				event_cqs_callback, queue);
+		}
+
+		kfree(objs);
+		return -ENOMEM;
+	}
+
+	return 0;
+}
+
+static void kbase_kcpu_cqs_set_operation_process(
+		struct kbase_device *kbdev,
+		struct kbase_kcpu_command_queue *queue,
+		struct kbase_kcpu_command_cqs_set_operation_info *cqs_set_operation)
+{
+	unsigned int i;
+
+	lockdep_assert_held(&queue->kctx->csf.kcpu_queues.lock);
+
+	if (WARN_ON(!cqs_set_operation->objs))
+		return;
+
+	for (i = 0; i < cqs_set_operation->nr_objs; i++) {
+		struct kbase_vmap_struct *mapping;
+		u64 *evt;
+
+		evt = (u64 *)kbase_phy_alloc_mapping_get(
+			queue->kctx, cqs_set_operation->objs[i].addr, &mapping);
+
+		/* GPUCORE-28172 RDT to review */
+
+		if (!evt) {
+			dev_warn(kbdev->dev,
+				"Sync memory %llx already freed", cqs_set_operation->objs[i].addr);
+			queue->has_error = true;
+		} else {
+			switch (cqs_set_operation->objs[i].operation) {
+			case BASEP_CQS_SET_OPERATION_ADD:
+				*evt += cqs_set_operation->objs[i].val;
+				break;
+			case BASEP_CQS_SET_OPERATION_SET:
+				*evt = cqs_set_operation->objs[i].val;
+				break;
+			default:
+				dev_warn(kbdev->dev,
+					"Unsupported CQS set operation %d", cqs_set_operation->objs[i].operation);
+				queue->has_error = true;
+				break;
+			}
+
+			/* Increment evt up to the error_state value depending on the CQS data type */
+			switch (cqs_set_operation->objs[i].data_type) {
+			default:
+				dev_warn(kbdev->dev, "Unreachable data_type=%d", cqs_set_operation->objs[i].data_type);
+			/* Fallthrough - hint to compiler that there's really only 2 options at present */
+			case BASEP_CQS_DATA_TYPE_U32:
+				evt = (u64 *)((u8 *)evt + sizeof(u32));
+				break;
+			case BASEP_CQS_DATA_TYPE_U64:
+				evt = (u64 *)((u8 *)evt + sizeof(u64));
+				break;
+			}
+
+			/* GPUCORE-28172 RDT to review */
+
+			/* Always propagate errors */
+			*evt = queue->has_error;
+
+			kbase_phy_alloc_mapping_put(queue->kctx, mapping);
+		}
+	}
+
+	kbase_csf_event_signal_notify_gpu(queue->kctx);
+
+	kfree(cqs_set_operation->objs);
+	cqs_set_operation->objs = NULL;
+}
+
+static int kbase_kcpu_cqs_set_operation_prepare(
+		struct kbase_kcpu_command_queue *kcpu_queue,
+		struct base_kcpu_command_cqs_set_operation_info *cqs_set_operation_info,
+		struct kbase_kcpu_command *current_command)
+{
+	struct kbase_context *const kctx = kcpu_queue->kctx;
+	struct base_cqs_set_operation_info *objs;
+	unsigned int nr_objs = cqs_set_operation_info->nr_objs;
+
+	lockdep_assert_held(&kctx->csf.kcpu_queues.lock);
+
+	if (nr_objs > BASEP_KCPU_CQS_MAX_NUM_OBJS)
+		return -EINVAL;
+
+	if (!nr_objs)
+		return -EINVAL;
+
+	objs = kcalloc(nr_objs, sizeof(*objs), GFP_KERNEL);
+	if (!objs)
+		return -ENOMEM;
+
+	if (copy_from_user(objs, u64_to_user_ptr(cqs_set_operation_info->objs),
+			nr_objs * sizeof(*objs))) {
+		kfree(objs);
+		return -ENOMEM;
+	}
+
+	current_command->type = BASE_KCPU_COMMAND_TYPE_CQS_SET_OPERATION;
+	current_command->info.cqs_set_operation.nr_objs = nr_objs;
+	current_command->info.cqs_set_operation.objs = objs;
 
 	return 0;
 }
@@ -819,6 +1184,9 @@ static void kbase_csf_fence_wait_callback(struct dma_fence *fence,
 	struct kbase_kcpu_command_queue *kcpu_queue = fence_info->kcpu_queue;
 	struct kbase_context *const kctx = kcpu_queue->kctx;
 
+	KBASE_KTRACE_ADD_CSF_KCPU(kctx->kbdev, FENCE_WAIT_END, kcpu_queue,
+				  fence->context, fence->seqno);
+
 	/* Resume kcpu command queue processing. */
 	queue_work(kctx->csf.kcpu_queues.wq, &kcpu_queue->work);
 }
@@ -835,8 +1203,13 @@ static void kbase_kcpu_fence_wait_cancel(
 		return;
 
 	if (kcpu_queue->fence_wait_processed) {
-		dma_fence_remove_callback(fence_info->fence,
+		bool removed = dma_fence_remove_callback(fence_info->fence,
 				&fence_info->fence_cb);
+
+		if (removed)
+			KBASE_KTRACE_ADD_CSF_KCPU(kctx->kbdev, FENCE_WAIT_END,
+					kcpu_queue, fence_info->fence->context,
+					fence_info->fence->seqno);
 	}
 
 	/* Release the reference which is kept by the kcpu_queue */
@@ -880,6 +1253,9 @@ static int kbase_kcpu_fence_wait_process(
 			&fence_info->fence_cb,
 			kbase_csf_fence_wait_callback);
 
+		KBASE_KTRACE_ADD_CSF_KCPU(kcpu_queue->kctx->kbdev,
+					  FENCE_WAIT_START, kcpu_queue,
+					  fence->context, fence->seqno);
 		fence_status = cb_err;
 		if (cb_err == 0)
 			kcpu_queue->fence_wait_processed = true;
@@ -950,6 +1326,10 @@ static int kbase_kcpu_fence_signal_process(
 			"fence_signal() failed with %d\n", ret);
 	}
 
+	KBASE_KTRACE_ADD_CSF_KCPU(kctx->kbdev, FENCE_SIGNAL, kcpu_queue,
+				  fence_info->fence->context,
+				  fence_info->fence->seqno);
+
 	dma_fence_put(fence_info->fence);
 	fence_info->fence = NULL;
 
@@ -1059,6 +1439,9 @@ static int delete_queue(struct kbase_context *kctx, u32 id)
 		struct kbase_kcpu_command_queue *queue =
 					kctx->csf.kcpu_queues.array[id];
 
+		KBASE_KTRACE_ADD_CSF_KCPU(kctx->kbdev, KCPU_QUEUE_DESTROY,
+			queue, queue->num_pending_cmds, queue->cqs_wait_count);
+
 		/* Drain the remaining work for this queue first and go past
 		 * all the waits.
 		 */
@@ -1096,7 +1479,7 @@ static void KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_JIT_ALLOC_INFO(
 	struct kbase_device *kbdev,
 	const struct kbase_kcpu_command_queue *queue,
 	const struct kbase_kcpu_command_jit_alloc_info *jit_alloc,
-	bool alloc_success)
+	int alloc_status)
 {
 	u8 i;
 
@@ -1108,8 +1491,8 @@ static void KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_JIT_ALLOC_INFO(
 		u64 gpu_alloc_addr = 0;
 		u64 mmu_flags = 0;
 
-		if (alloc_success && !WARN_ON(!reg) &&
-			!WARN_ON(reg == KBASE_RESERVED_REG_JIT_ALLOC)) {
+		if ((alloc_status == 0) && !WARN_ON(!reg) &&
+		    !WARN_ON(reg == KBASE_RESERVED_REG_JIT_ALLOC)) {
 #ifdef CONFIG_MALI_VECTOR_DUMP
 			struct tagged_addr phy = {0};
 #endif /* CONFIG_MALI_VECTOR_DUMP */
@@ -1123,7 +1506,7 @@ static void KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_JIT_ALLOC_INFO(
 #endif /* CONFIG_MALI_VECTOR_DUMP */
 		}
 		KBASE_TLSTREAM_TL_KBASE_ARRAY_ITEM_KCPUQUEUE_EXECUTE_JIT_ALLOC_END(
-			kbdev, queue, gpu_alloc_addr, mmu_flags);
+			kbdev, queue, alloc_status, gpu_alloc_addr, mmu_flags);
 	}
 }
 
@@ -1135,30 +1518,6 @@ static void KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_JIT_ALLOC_END(
 		kbdev, queue);
 }
 
-static void KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_JIT_FREE_INFO(
-	struct kbase_device *kbdev,
-	const struct kbase_kcpu_command_queue *queue,
-	const struct kbase_kcpu_command_jit_free_info *jit_free)
-{
-	u8 i;
-
-	KBASE_TLSTREAM_TL_KBASE_ARRAY_BEGIN_KCPUQUEUE_EXECUTE_JIT_FREE_END(
-		kbdev, queue);
-	for (i = 0; i < jit_free->count; i++) {
-		const u8 id = jit_free->ids[i];
-		u64 pages_used = 0;
-
-		if (id != 0) {
-			const struct kbase_va_region *reg =
-				queue->kctx->jit_alloc[id];
-			if (reg && (reg != KBASE_RESERVED_REG_JIT_ALLOC))
-				pages_used = reg->gpu_alloc->nents;
-		}
-		KBASE_TLSTREAM_TL_KBASE_ARRAY_ITEM_KCPUQUEUE_EXECUTE_JIT_FREE_END(
-			kbdev, queue, pages_used);
-	}
-}
-
 static void KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_JIT_FREE_END(
 	struct kbase_device *kbdev,
 	const struct kbase_kcpu_command_queue *queue)
@@ -1189,10 +1548,8 @@ static void kcpu_queue_process(struct kbase_kcpu_command_queue *queue,
 				queue->command_started = true;
 			}
 
-#ifdef CONFIG_SYNC_FILE
 			status = 0;
-
-
+#ifdef CONFIG_SYNC_FILE
 			if (ignore_waits) {
 				kbase_kcpu_fence_wait_cancel(queue,
 					&cmd->info.fence);
@@ -1208,11 +1565,14 @@ static void kcpu_queue_process(struct kbase_kcpu_command_queue *queue,
 #else
 			dev_warn(kbdev->dev,
 				"unexpected fence wait command found\n");
+
+			status = -EINVAL;
+			queue->has_error = true;
 #endif
 
 			if (process_next) {
 				KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_FENCE_WAIT_END(
-					kbdev, queue);
+					kbdev, queue, status < 0 ? status : 0);
 				queue->command_started = false;
 			}
 			break;
@@ -1220,16 +1580,24 @@ static void kcpu_queue_process(struct kbase_kcpu_command_queue *queue,
 			KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_FENCE_SIGNAL_START(
 				kbdev, queue);
 
+			status = 0;
+
 #ifdef CONFIG_SYNC_FILE
-			kbase_kcpu_fence_signal_process(queue,
-						&cmd->info.fence);
+			status = kbase_kcpu_fence_signal_process(
+				queue, &cmd->info.fence);
+
+			if (status < 0)
+				queue->has_error = true;
 #else
 			dev_warn(kbdev->dev,
 				"unexpected fence signal command found\n");
+
+			status = -EINVAL;
+			queue->has_error = true;
 #endif
 
 			KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_FENCE_SIGNAL_END(
-				kbdev, queue);
+				kbdev, queue, status);
 			break;
 		case BASE_KCPU_COMMAND_TYPE_CQS_WAIT:
 			status = kbase_kcpu_cqs_wait_process(kbdev, queue,
@@ -1252,48 +1620,99 @@ static void kcpu_queue_process(struct kbase_kcpu_command_queue *queue,
 			kbase_kcpu_cqs_set_process(kbdev, queue,
 				&cmd->info.cqs_set);
 
-			/* CQS sets are only traced before execution */
+			break;
+		case BASE_KCPU_COMMAND_TYPE_CQS_WAIT_OPERATION:
+			status = kbase_kcpu_cqs_wait_operation_process(kbdev, queue,
+						&cmd->info.cqs_wait_operation);
+
+			if (!status && !ignore_waits) {
+				process_next = false;
+			} else {
+				/* Either all CQS objects were signaled or
+				 * there was an error or the queue itself is
+				 * being deleted.
+				 * In all cases can move to the next command.
+				 * TBD: handle the error
+				 */
+				cleanup_cqs_wait_operation(queue,	&cmd->info.cqs_wait_operation);
+			}
+
+			break;
+		case BASE_KCPU_COMMAND_TYPE_CQS_SET_OPERATION:
+			kbase_kcpu_cqs_set_operation_process(kbdev, queue,
+				&cmd->info.cqs_set_operation);
+
 			break;
 		case BASE_KCPU_COMMAND_TYPE_ERROR_BARRIER:
 			/* Clear the queue's error state */
 			queue->has_error = false;
+
+			KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_ERROR_BARRIER(
+				kbdev, queue);
 			break;
-		case BASE_KCPU_COMMAND_TYPE_MAP_IMPORT:
+		case BASE_KCPU_COMMAND_TYPE_MAP_IMPORT: {
+			struct kbase_ctx_ext_res_meta *meta = NULL;
+
 			KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_MAP_IMPORT_START(
 				kbdev, queue);
 
 			kbase_gpu_vm_lock(queue->kctx);
-			kbase_sticky_resource_acquire(queue->kctx,
-						cmd->info.import.gpu_va);
+			meta = kbase_sticky_resource_acquire(
+				queue->kctx, cmd->info.import.gpu_va);
 			kbase_gpu_vm_unlock(queue->kctx);
 
+			if (meta == NULL) {
+				queue->has_error = true;
+				dev_warn(kbdev->dev,
+						"failed to map an external resource\n");
+			}
+
 			KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_MAP_IMPORT_END(
-				kbdev, queue);
+				kbdev, queue, meta ? 0 : 1);
 			break;
-		case BASE_KCPU_COMMAND_TYPE_UNMAP_IMPORT:
+		}
+		case BASE_KCPU_COMMAND_TYPE_UNMAP_IMPORT: {
+			bool ret;
+
 			KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_UNMAP_IMPORT_START(
 				kbdev, queue);
 
 			kbase_gpu_vm_lock(queue->kctx);
-			kbase_sticky_resource_release(queue->kctx, NULL,
-						cmd->info.import.gpu_va);
+			ret = kbase_sticky_resource_release(
+				queue->kctx, NULL, cmd->info.import.gpu_va);
 			kbase_gpu_vm_unlock(queue->kctx);
 
+			if (!ret) {
+				queue->has_error = true;
+				dev_warn(kbdev->dev,
+						"failed to release the reference. resource not found\n");
+			}
+
 			KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_UNMAP_IMPORT_END(
-				kbdev, queue);
+				kbdev, queue, ret ? 0 : 1);
 			break;
-		case BASE_KCPU_COMMAND_TYPE_UNMAP_IMPORT_FORCE:
+		}
+		case BASE_KCPU_COMMAND_TYPE_UNMAP_IMPORT_FORCE: {
+			bool ret;
+
 			KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_UNMAP_IMPORT_FORCE_START(
 					kbdev, queue);
 
 			kbase_gpu_vm_lock(queue->kctx);
-			kbase_sticky_resource_release_force(queue->kctx, NULL,
-						cmd->info.import.gpu_va);
+			ret = kbase_sticky_resource_release_force(
+				queue->kctx, NULL, cmd->info.import.gpu_va);
 			kbase_gpu_vm_unlock(queue->kctx);
 
+			if (!ret) {
+				queue->has_error = true;
+				dev_warn(kbdev->dev,
+						"failed to release the reference. resource not found\n");
+			}
+
 			KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_UNMAP_IMPORT_FORCE_END(
-					kbdev, queue);
+				kbdev, queue, ret ? 0 : 1);
 			break;
+		}
 		case BASE_KCPU_COMMAND_TYPE_JIT_ALLOC:
 		{
 			KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_JIT_ALLOC_START(
@@ -1307,7 +1726,8 @@ static void kcpu_queue_process(struct kbase_kcpu_command_queue *queue,
 					queue->has_error = true;
 
 				KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_JIT_ALLOC_INFO(
-						kbdev, queue, &cmd->info.jit_alloc, (status == 0));
+					kbdev, queue, &cmd->info.jit_alloc,
+					status);
 
 				kbase_kcpu_jit_allocate_finish(queue, cmd);
 				KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_JIT_ALLOC_END(
@@ -1319,27 +1739,64 @@ static void kcpu_queue_process(struct kbase_kcpu_command_queue *queue,
 			KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_JIT_FREE_START(
 				kbdev, queue);
 
-			KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_JIT_FREE_INFO(
-				kbdev, queue, &cmd->info.jit_free);
-
-			status = kbase_kcpu_jit_free_process(queue->kctx, cmd);
+			status = kbase_kcpu_jit_free_process(queue, cmd);
 			if (status)
 				queue->has_error = true;
 
 			KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_JIT_FREE_END(
 				kbdev, queue);
 			break;
-		case BASE_KCPU_COMMAND_TYPE_GROUP_SUSPEND:
+		case BASE_KCPU_COMMAND_TYPE_GROUP_SUSPEND: {
+			struct kbase_suspend_copy_buffer *sus_buf =
+					cmd->info.suspend_buf_copy.sus_buf;
+
+			KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_GROUP_SUSPEND_START(
+				kbdev, queue);
+
 			status = kbase_csf_queue_group_suspend_process(
-					queue->kctx,
-					cmd->info.suspend_buf_copy.sus_buf,
+					queue->kctx, sus_buf,
 					cmd->info.suspend_buf_copy.group_handle);
 			if (status)
 				queue->has_error = true;
 
-			kfree(cmd->info.suspend_buf_copy.sus_buf->pages);
-			kfree(cmd->info.suspend_buf_copy.sus_buf);
+			KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_GROUP_SUSPEND_END(
+				kbdev, queue, status);
+
+			if (!sus_buf->cpu_alloc) {
+				int i;
+
+				for (i = 0; i < sus_buf->nr_pages; i++)
+					put_page(sus_buf->pages[i]);
+			} else {
+				kbase_mem_phy_alloc_kernel_unmapped(
+					sus_buf->cpu_alloc);
+				kbase_mem_phy_alloc_put(sus_buf->cpu_alloc);
+			}
+
+			kfree(sus_buf->pages);
+			kfree(sus_buf);
+			break;
+		}
+#if MALI_UNIT_TEST
+		case BASE_KCPU_COMMAND_TYPE_SAMPLE_TIME: {
+			u64 time = ktime_get_raw_ns();
+			void *target_page = kmap(*cmd->info.sample_time.page);
+
+			if (target_page) {
+				memcpy(target_page +
+					       cmd->info.sample_time.page_offset,
+				       &time, sizeof(time));
+				kunmap(*cmd->info.sample_time.page);
+			} else {
+				dev_warn(kbdev->dev,
+					 "Could not kmap target page\n");
+				queue->has_error = true;
+			}
+			put_page(*cmd->info.sample_time.page);
+			kfree(cmd->info.sample_time.page);
 			break;
+		}
+#endif /* MALI_UNIT_TEST */
 		default:
 			dev_warn(kbdev->dev,
 				"Unrecognized command type\n");
@@ -1389,12 +1846,15 @@ static void KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_ENQUEUE_COMMAND(
 		break;
 	case BASE_KCPU_COMMAND_TYPE_CQS_WAIT:
 	{
-		const struct base_cqs_wait *waits = cmd->info.cqs_wait.objs;
+		const struct base_cqs_wait_info *waits =
+			cmd->info.cqs_wait.objs;
+		u32 inherit_err_flags = cmd->info.cqs_wait.inherit_err_flags;
 		unsigned int i;
 
 		for (i = 0; i < cmd->info.cqs_wait.nr_objs; i++) {
 			KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_ENQUEUE_CQS_WAIT(
-				kbdev, queue, waits[i].addr, waits[i].val);
+				kbdev, queue, waits[i].addr, waits[i].val,
+				(inherit_err_flags & ((u32)1 << i)) ? 1 : 0);
 		}
 		break;
 	}
@@ -1409,8 +1869,19 @@ static void KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_ENQUEUE_COMMAND(
 		}
 		break;
 	}
+	case BASE_KCPU_COMMAND_TYPE_CQS_WAIT_OPERATION:
+	{
+		/* GPUCORE-28172 RDT to review */
+		break;
+	}
+	case BASE_KCPU_COMMAND_TYPE_CQS_SET_OPERATION:
+	{
+		/* GPUCORE-28172 RDT to review */
+		break;
+	}
 	case BASE_KCPU_COMMAND_TYPE_ERROR_BARRIER:
-		/* No implemented tracepoint */
+		KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_ENQUEUE_ERROR_BARRIER(kbdev,
+									queue);
 		break;
 	case BASE_KCPU_COMMAND_TYPE_MAP_IMPORT:
 		KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_ENQUEUE_MAP_IMPORT(
@@ -1435,11 +1906,11 @@ static void KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_ENQUEUE_COMMAND(
 				&cmd->info.jit_alloc.info[i];
 
 			KBASE_TLSTREAM_TL_KBASE_ARRAY_ITEM_KCPUQUEUE_ENQUEUE_JIT_ALLOC(
-				kbdev, queue,
-				info->gpu_alloc_addr, info->va_pages,
-				info->commit_pages, info->extent, info->id,
-				info->bin_id, info->max_allocations,
-				info->flags, info->usage_id);
+				kbdev, queue, info->gpu_alloc_addr,
+				info->va_pages, info->commit_pages,
+				info->extension, info->id, info->bin_id,
+				info->max_allocations, info->flags,
+				info->usage_id);
 		}
 		KBASE_TLSTREAM_TL_KBASE_ARRAY_END_KCPUQUEUE_ENQUEUE_JIT_ALLOC(
 			kbdev, queue);
@@ -1460,8 +1931,18 @@ static void KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_ENQUEUE_COMMAND(
 		break;
 	}
 	case BASE_KCPU_COMMAND_TYPE_GROUP_SUSPEND:
-		/* No implemented tracepoint */
+		KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_ENQUEUE_GROUP_SUSPEND(
+			kbdev, queue, cmd->info.suspend_buf_copy.sus_buf,
+			cmd->info.suspend_buf_copy.group_handle);
 		break;
+#if MALI_UNIT_TEST
+	case BASE_KCPU_COMMAND_TYPE_SAMPLE_TIME:
+		/*
+		 * This is test-only KCPU command, no need to have a timeline
+		 * entry
+		 */
+		break;
+#endif /* MALI_UNIT_TEST */
 	}
 }
 
@@ -1565,6 +2046,14 @@ int kbase_csf_kcpu_queue_enqueue(struct kbase_context *kctx,
 			ret = kbase_kcpu_cqs_set_prepare(queue,
 					&command.info.cqs_set, kcpu_cmd);
 			break;
+		case BASE_KCPU_COMMAND_TYPE_CQS_WAIT_OPERATION:
+			ret = kbase_kcpu_cqs_wait_operation_prepare(queue,
+					&command.info.cqs_wait_operation, kcpu_cmd);
+			break;
+		case BASE_KCPU_COMMAND_TYPE_CQS_SET_OPERATION:
+			ret = kbase_kcpu_cqs_set_operation_prepare(queue,
+					&command.info.cqs_set_operation, kcpu_cmd);
+			break;
 		case BASE_KCPU_COMMAND_TYPE_ERROR_BARRIER:
 			kcpu_cmd->type = BASE_KCPU_COMMAND_TYPE_ERROR_BARRIER;
 			ret = 0;
@@ -1594,7 +2083,37 @@ int kbase_csf_kcpu_queue_enqueue(struct kbase_context *kctx,
 					&command.info.suspend_buf_copy,
 					kcpu_cmd);
 			break;
+#if MALI_UNIT_TEST
+		case BASE_KCPU_COMMAND_TYPE_SAMPLE_TIME: {
+			int const page_cnt = 1;
+
+			kcpu_cmd->type = BASE_KCPU_COMMAND_TYPE_SAMPLE_TIME;
+			kcpu_cmd->info.sample_time.page_addr =
+				command.info.sample_time.time & PAGE_MASK;
+			kcpu_cmd->info.sample_time.page_offset =
+				command.info.sample_time.time & ~PAGE_MASK;
+			kcpu_cmd->info.sample_time.page = kcalloc(
+				page_cnt, sizeof(struct page *), GFP_KERNEL);
+			if (!kcpu_cmd->info.sample_time.page) {
+				ret = -ENOMEM;
+			} else {
+				int pinned_pages = get_user_pages_fast(
+					kcpu_cmd->info.sample_time.page_addr,
+					page_cnt, 1,
+					kcpu_cmd->info.sample_time.page);
+
+				if (pinned_pages < 0) {
+					ret = pinned_pages;
+					kfree(kcpu_cmd->info.sample_time.page);
+				} else if (pinned_pages != page_cnt) {
+					ret = -EINVAL;
+					kfree(kcpu_cmd->info.sample_time.page);
+				}
+			}
 
+			break;
+		}
+#endif /* MALI_UNIT_TEST */
 		default:
 			dev_warn(queue->kctx->kbdev->dev,
 				"Unknown command type %u\n", command.type);
@@ -1722,6 +2241,7 @@ int kbase_csf_kcpu_queue_new(struct kbase_context *kctx,
 	INIT_LIST_HEAD(&queue->jit_blocked);
 	queue->has_error = false;
 	INIT_WORK(&queue->work, kcpu_queue_process_worker);
+	queue->id = idx;
 
 	newq->id = idx;
 
@@ -1730,6 +2250,9 @@ int kbase_csf_kcpu_queue_new(struct kbase_context *kctx,
 	 */
 	KBASE_TLSTREAM_TL_KBASE_NEW_KCPUQUEUE(
 		kctx->kbdev, queue, kctx->id, queue->num_pending_cmds);
+
+	KBASE_KTRACE_ADD_CSF_KCPU(kctx->kbdev, KCPU_QUEUE_NEW, queue,
+		queue->fence_context, 0);
 out:
 	mutex_unlock(&kctx->csf.kcpu_queues.lock);
 
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu.h
index 45c76af04c0f..86aa7dcc452e 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_CSF_KCPU_H_
@@ -48,9 +47,9 @@ struct kbase_kcpu_command_import_info {
  * struct kbase_kcpu_command_fence_info - Structure which holds information
  *		about the fence object enqueued in the kcpu command queue
  *
- * @fence_cb:
- * @fence:
- * @kcpu_queue:
+ * @fence_cb:   Fence callback
+ * @fence:      Fence
+ * @kcpu_queue: kcpu command queue
  */
 struct kbase_kcpu_command_fence_info {
 #if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
@@ -70,13 +69,10 @@ struct kbase_kcpu_command_fence_info {
  * @objs:	Array of structures which define CQS objects to be used by
  *		the kcpu command.
  * @nr_objs:	Number of CQS objects in the array.
- * @propagate_flags:  Bit-pattern for the CQSs in the array that are set
- *		      to propagate queue error-state to the flagged CQSs.
  */
 struct kbase_kcpu_command_cqs_set_info {
 	struct base_cqs_set *objs;
 	unsigned int nr_objs;
-	u32 propagate_flags;
 };
 
 /**
@@ -93,7 +89,37 @@ struct kbase_kcpu_command_cqs_set_info {
  *			queue's error-state.
  */
 struct kbase_kcpu_command_cqs_wait_info {
-	struct base_cqs_wait *objs;
+	struct base_cqs_wait_info *objs;
+	unsigned long *signaled;
+	unsigned int nr_objs;
+	u32 inherit_err_flags;
+};
+
+/**
+ * struct kbase_kcpu_command_cqs_set_operation_info - Structure which holds information
+ *				about CQS objects for the kcpu CQS timeline set command
+ *
+ * @objs:	Array of structures which define CQS timeline objects to be used by
+ *		the kcpu command.
+ * @nr_objs:	Number of CQS objects in the array.
+ */
+struct kbase_kcpu_command_cqs_set_operation_info {
+	struct base_cqs_set_operation_info *objs;
+	unsigned int nr_objs;
+};
+
+/**
+ * struct kbase_kcpu_command_cqs_wait_operation_info - Structure which holds information
+ *				about CQS objects for the kcpu CQS timeline wait command
+ *
+ * @objs:	Array of structures which define CQS timeline objects to be used by
+ *		the kcpu command.
+ * @signaled:	Bit array used to report the status of the CQS wait objects.
+ *              1 is signaled, 0 otherwise.
+ * @nr_objs:	Number of CQS objects in the array.
+ */
+struct kbase_kcpu_command_cqs_wait_operation_info {
+	struct base_cqs_wait_operation_info *objs;
 	unsigned long *signaled;
 	unsigned int nr_objs;
 	u32 inherit_err_flags;
@@ -103,7 +129,7 @@ struct kbase_kcpu_command_cqs_wait_info {
  * struct kbase_kcpu_command_jit_alloc_info - Structure which holds information
  *				needed for the kcpu command for jit allocations
  *
- * @node	Used to keep track of all JIT free/alloc commands in submission
+ * @node:	Used to keep track of all JIT free/alloc commands in submission
  *		order. This must be located in the front of this struct to
  *		match that of kbase_kcpu_command_jit_free_info.
  * @info:	Array of objects of the struct base_jit_alloc_info type which
@@ -145,12 +171,14 @@ struct kbase_kcpu_command_jit_free_info {
  *		the user buffer.
  * @nr_pages:	number of pages.
  * @offset:	offset into the pages
+ * @cpu_alloc:	Reference to physical pages of suspend buffer allocation.
  */
 struct kbase_suspend_copy_buffer {
 	size_t size;
 	struct page **pages;
 	int nr_pages;
 	size_t offset;
+	struct kbase_mem_phy_alloc *cpu_alloc;
 };
 
 /**
@@ -159,13 +187,21 @@ struct kbase_suspend_copy_buffer {
  *
  * @sus_buf:		Pointer to the structure which contains details of the
  *			user buffer and its kernel pinned pages.
- * @group_handle:	Handle to the mapping of command stream group.
+ * @group_handle:	Handle to the mapping of CSG.
  */
 struct kbase_kcpu_command_group_suspend_info {
 	struct kbase_suspend_copy_buffer *sus_buf;
 	u8 group_handle;
 };
 
+#if MALI_UNIT_TEST
+struct kbase_kcpu_command_sample_time_info {
+	u64 page_addr;
+	u64 page_offset;
+	struct page **page;
+};
+#endif /* MALI_UNIT_TEST */
+
 /**
  * struct kbase_cpu_command - Command which is to be part of the kernel
  *                            command queue
@@ -175,6 +211,14 @@ struct kbase_kcpu_command_group_suspend_info {
  *		indicates that it has been enqueued earlier.
  * @info:	Structure which holds information about the command
  *		dependent on the command type.
+ * @info.fence:            Fence
+ * @info.cqs_wait:         CQS wait
+ * @info.cqs_set:          CQS set
+ * @info.import:           import
+ * @info.jit_alloc:        jit allocation
+ * @info.jit_free:         jit deallocation
+ * @info.suspend_buf_copy: suspend buffer copy
+ * @info.sample_time:      sample time
  */
 struct kbase_kcpu_command {
 	enum base_kcpu_command_type type;
@@ -183,10 +227,15 @@ struct kbase_kcpu_command {
 		struct kbase_kcpu_command_fence_info fence;
 		struct kbase_kcpu_command_cqs_wait_info cqs_wait;
 		struct kbase_kcpu_command_cqs_set_info cqs_set;
+		struct kbase_kcpu_command_cqs_wait_operation_info cqs_wait_operation;
+		struct kbase_kcpu_command_cqs_set_operation_info cqs_set_operation;
 		struct kbase_kcpu_command_import_info import;
 		struct kbase_kcpu_command_jit_alloc_info jit_alloc;
 		struct kbase_kcpu_command_jit_free_info jit_free;
 		struct kbase_kcpu_command_group_suspend_info suspend_buf_copy;
+#if MALI_UNIT_TEST
+		struct kbase_kcpu_command_sample_time_info sample_time;
+#endif /* MALI_UNIT_TEST */
 	} info;
 };
 
@@ -201,6 +250,7 @@ struct kbase_kcpu_command {
  *				commands enqueued into a kcpu command queue;
  *				part of kernel API for processing workqueues
  * @start_offset:		Index of the command to be executed next
+ * @id:				KCPU command queue ID.
  * @num_pending_cmds:		The number of commands enqueued but not yet
  *				executed or pending
  * @cqs_wait_count:		Tracks the number of CQS wait commands enqueued
@@ -233,6 +283,7 @@ struct kbase_kcpu_command_queue {
 	struct kbase_kcpu_command commands[KBASEP_KCPU_QUEUE_SIZE];
 	struct work_struct work;
 	u8 start_offset;
+	u8 id;
 	u16 num_pending_cmds;
 	u32 cqs_wait_count;
 	u64 fence_context;
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu_debugfs.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu_debugfs.c
index 55e3b64cbe71..d59e77c2b98e 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu_debugfs.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu_debugfs.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "mali_kbase_csf_kcpu_debugfs.h"
@@ -96,7 +95,7 @@ static void kbasep_csf_kcpu_debugfs_print_queue(struct seq_file *file,
 			struct kbase_sync_fence_info info;
 
 			kbase_sync_fence_info_get(cmd->info.fence.fence, &info);
-			seq_printf(file, ",  Fence      %p %s %s",
+			seq_printf(file, ",  Fence      %pK %s %s",
 				   info.fence, info.name,
 				   kbase_sync_status_string(info.status));
 			break;
@@ -196,4 +195,3 @@ void kbase_csf_kcpu_debugfs_init(struct kbase_context *kctx)
 }
 
 #endif /* CONFIG_DEBUG_FS */
-
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu_debugfs.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu_debugfs.h
index 359fe2cb0168..58b8e34ead92 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu_debugfs.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_kcpu_debugfs.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_CSF_KCPU_DEBUGFS_H_
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_protected_memory.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_protected_memory.c
index 987cbc2fc201..09e72711d3cb 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_protected_memory.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_protected_memory.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "mali_kbase_csf_protected_memory.h"
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_protected_memory.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_protected_memory.h
index 2b459911d834..95f507f52d78 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_protected_memory.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_protected_memory.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_CSF_PROTECTED_MEMORY_H_
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_reset_gpu.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_reset_gpu.c
index f1a318d26f43..e8da0f3cccda 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_reset_gpu.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_reset_gpu.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
@@ -28,6 +27,8 @@
 #include <backend/gpu/mali_kbase_pm_internal.h>
 #include <mali_kbase_regs_history_debugfs.h>
 #include <csf/mali_kbase_csf_trace_buffer.h>
+#include <csf/ipa_control/mali_kbase_csf_ipa_control.h>
+#include <mali_kbase_reset_gpu.h>
 
 /* Waiting timeout for GPU reset to complete */
 #define GPU_RESET_TIMEOUT_MS (5000) /* 5 seconds */
@@ -37,6 +38,199 @@
 #define DUMP_HEX_CHARS_PER_LINE  \
 	(DUMP_DWORDS_PER_LINE * DUMP_HEX_CHARS_PER_DWORD)
 
+static inline bool
+kbase_csf_reset_state_is_silent(enum kbase_csf_reset_gpu_state state)
+{
+	return (state == KBASE_CSF_RESET_GPU_COMMITTED_SILENT);
+}
+
+static inline bool
+kbase_csf_reset_state_is_committed(enum kbase_csf_reset_gpu_state state)
+{
+	return (state == KBASE_CSF_RESET_GPU_COMMITTED ||
+		state == KBASE_CSF_RESET_GPU_COMMITTED_SILENT);
+}
+
+static inline bool
+kbase_csf_reset_state_is_active(enum kbase_csf_reset_gpu_state state)
+{
+	return (state == KBASE_CSF_RESET_GPU_HAPPENING);
+}
+
+/**
+ * DOC: Mechanism for coherent access to the HW with respect to GPU reset
+ *
+ * Access to the HW from non-atomic context outside of the reset thread must
+ * use kbase_reset_gpu_prevent_and_wait() / kbase_reset_gpu_try_prevent().
+ *
+ * This currently works by taking the &kbase_device's csf.reset.sem, for
+ * 'write' access by the GPU reset thread and 'read' access by every other
+ * thread. The use of this rw_semaphore means:
+ *
+ * - there will be mutual exclusion (and thus waiting) between the thread doing
+ *   reset ('writer') and threads trying to access the GPU for 'normal'
+ *   operations ('readers')
+ *
+ * - multiple threads may prevent reset from happening without serializing each
+ *   other prematurely. Note that at present the wait for reset to finish has
+ *   to be done higher up in the driver than actual GPU access, at a point
+ *   where it won't cause lock ordering issues. At such a point, some paths may
+ *   actually lead to no GPU access, but we would prefer to avoid serializing
+ *   at that level
+ *
+ * - lockdep (if enabled in the kernel) will check such uses for deadlock
+ *
+ * If instead &kbase_device's csf.reset.wait &wait_queue_head_t were used on
+ * its own, we'd also need to add a &lockdep_map and appropriate lockdep calls
+ * to make use of lockdep checking in all places where the &wait_queue_head_t
+ * is waited upon or signaled.
+ *
+ * Indeed places where we wait on &kbase_device's csf.reset.wait (such as
+ * kbase_reset_gpu_wait()) are the only places where we need extra call(s) to
+ * lockdep, and they are made on the existing rw_semaphore.
+ *
+ * For non-atomic access, the &kbase_device's csf.reset.state member should be
+ * checked instead, such as by using kbase_reset_gpu_is_active().
+ *
+ * Ideally the &rw_semaphore should be replaced in future with a single mutex
+ * that protects any access to the GPU, via reset or otherwise.
+ */
+
+int kbase_reset_gpu_prevent_and_wait(struct kbase_device *kbdev)
+{
+	down_read(&kbdev->csf.reset.sem);
+
+	if (atomic_read(&kbdev->csf.reset.state) ==
+	    KBASE_CSF_RESET_GPU_FAILED) {
+		up_read(&kbdev->csf.reset.sem);
+		return -ENOMEM;
+	}
+
+	if (WARN_ON(kbase_reset_gpu_is_active(kbdev))) {
+		up_read(&kbdev->csf.reset.sem);
+		return -EFAULT;
+	}
+
+	return 0;
+}
+KBASE_EXPORT_TEST_API(kbase_reset_gpu_prevent_and_wait);
+
+int kbase_reset_gpu_try_prevent(struct kbase_device *kbdev)
+{
+	if (!down_read_trylock(&kbdev->csf.reset.sem))
+		return -EAGAIN;
+
+	if (atomic_read(&kbdev->csf.reset.state) ==
+	    KBASE_CSF_RESET_GPU_FAILED) {
+		up_read(&kbdev->csf.reset.sem);
+		return -ENOMEM;
+	}
+
+	if (WARN_ON(kbase_reset_gpu_is_active(kbdev))) {
+		up_read(&kbdev->csf.reset.sem);
+		return -EFAULT;
+	}
+
+	return 0;
+}
+
+void kbase_reset_gpu_allow(struct kbase_device *kbdev)
+{
+	up_read(&kbdev->csf.reset.sem);
+}
+KBASE_EXPORT_TEST_API(kbase_reset_gpu_allow);
+
+void kbase_reset_gpu_assert_prevented(struct kbase_device *kbdev)
+{
+#if KERNEL_VERSION(4, 10, 0) <= LINUX_VERSION_CODE
+	lockdep_assert_held_read(&kbdev->csf.reset.sem);
+#else
+	lockdep_assert_held(&kbdev->csf.reset.sem);
+#endif
+	WARN_ON(kbase_reset_gpu_is_active(kbdev));
+}
+
+void kbase_reset_gpu_assert_failed_or_prevented(struct kbase_device *kbdev)
+{
+	if (atomic_read(&kbdev->csf.reset.state) == KBASE_CSF_RESET_GPU_FAILED)
+		return;
+
+#if KERNEL_VERSION(4, 10, 0) <= LINUX_VERSION_CODE
+	lockdep_assert_held_read(&kbdev->csf.reset.sem);
+#else
+	lockdep_assert_held(&kbdev->csf.reset.sem);
+#endif
+	WARN_ON(kbase_reset_gpu_is_active(kbdev));
+}
+
+/* Mark the reset as now happening, and synchronize with other threads that
+ * might be trying to access the GPU
+ */
+static void kbase_csf_reset_begin_hw_access_sync(
+	struct kbase_device *kbdev,
+	enum kbase_csf_reset_gpu_state initial_reset_state)
+{
+	unsigned long hwaccess_lock_flags;
+	unsigned long scheduler_spin_lock_flags;
+
+	/* Note this is a WARN/atomic_set because it is a software issue for a
+	 * race to be occurring here
+	 */
+	WARN_ON(!kbase_csf_reset_state_is_committed(initial_reset_state));
+
+	down_write(&kbdev->csf.reset.sem);
+
+	/* Threads in atomic context accessing the HW will hold one of these
+	 * locks, so synchronize with them too.
+	 */
+	spin_lock_irqsave(&kbdev->hwaccess_lock, hwaccess_lock_flags);
+	kbase_csf_scheduler_spin_lock(kbdev, &scheduler_spin_lock_flags);
+	atomic_set(&kbdev->csf.reset.state, KBASE_RESET_GPU_HAPPENING);
+	kbase_csf_scheduler_spin_unlock(kbdev, scheduler_spin_lock_flags);
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, hwaccess_lock_flags);
+}
+
+/* Mark the reset as finished and allow others threads to once more access the
+ * GPU
+ */
+static void kbase_csf_reset_end_hw_access(struct kbase_device *kbdev,
+					  int err_during_reset,
+					  bool firmware_inited)
+{
+	unsigned long hwaccess_lock_flags;
+	unsigned long scheduler_spin_lock_flags;
+
+	WARN_ON(!kbase_csf_reset_state_is_active(
+		atomic_read(&kbdev->csf.reset.state)));
+
+	/* Once again, we synchronize with atomic context threads accessing the
+	 * HW, as otherwise any actions they defer could get lost
+	 */
+	spin_lock_irqsave(&kbdev->hwaccess_lock, hwaccess_lock_flags);
+	kbase_csf_scheduler_spin_lock(kbdev, &scheduler_spin_lock_flags);
+
+	if (!err_during_reset) {
+		atomic_set(&kbdev->csf.reset.state,
+			   KBASE_CSF_RESET_GPU_NOT_PENDING);
+	} else {
+		dev_err(kbdev->dev, "Reset failed to complete");
+		atomic_set(&kbdev->csf.reset.state, KBASE_CSF_RESET_GPU_FAILED);
+	}
+
+	kbase_csf_scheduler_spin_unlock(kbdev, scheduler_spin_lock_flags);
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, hwaccess_lock_flags);
+
+	/* Invoke the scheduling tick after formally finishing the reset,
+	 * otherwise the tick might start too soon and notice that reset
+	 * is still in progress.
+	 */
+	up_write(&kbdev->csf.reset.sem);
+	wake_up(&kbdev->csf.reset.wait);
+
+	if (!err_during_reset && likely(firmware_inited))
+		kbase_csf_scheduler_enable_tick_timer(kbdev);
+}
+
 static void kbase_csf_debug_dump_registers(struct kbase_device *kbdev)
 {
 	kbase_io_history_dump(kbdev);
@@ -113,27 +307,59 @@ static void kbase_csf_dump_firmware_trace_buffer(struct kbase_device *kbdev)
 	kfree(buf);
 }
 
+/**
+ * kbase_csf_hwcnt_on_reset_error() - Sets HWCNT to appropriate state in the
+ *                                    event of an error during GPU reset.
+ * @kbdev: Pointer to KBase device
+ */
+static void kbase_csf_hwcnt_on_reset_error(struct kbase_device *kbdev)
+{
+	unsigned long flags;
+
+	/* Treat this as an unrecoverable error for HWCNT */
+	kbase_hwcnt_backend_csf_on_unrecoverable_error(&kbdev->hwcnt_gpu_iface);
+
+	/* Re-enable counters to ensure matching enable/disable pair.
+	 * This might reduce the hwcnt disable count to 0, and therefore
+	 * trigger actual re-enabling of hwcnt.
+	 * However, as the backend is now in the unrecoverable error state,
+	 * re-enabling will immediately fail and put the context into the error
+	 * state, preventing the hardware from being touched (which could have
+	 * risked a hang).
+	 */
+	kbase_csf_scheduler_spin_lock(kbdev, &flags);
+	kbase_hwcnt_context_enable(kbdev->hwcnt_gpu_ctx);
+	kbase_csf_scheduler_spin_unlock(kbdev, flags);
+}
+
 static int kbase_csf_reset_gpu_now(struct kbase_device *kbdev,
-				   bool firmware_inited)
+				   bool firmware_inited, bool silent)
 {
 	unsigned long flags;
-	bool silent = false;
 	int err;
 
-	if (atomic_read(&kbdev->csf.reset.state) == KBASE_CSF_RESET_GPU_SILENT)
-		silent = true;
-
 	WARN_ON(kbdev->irq_reset_flush);
-
-	/* Reset the scheduler state before disabling the interrupts as suspend of active
-	 * CSG slots would also be done as a part of reset.
+	/* The reset must now be happening otherwise other threads will not
+	 * have been synchronized with to stop their access to the HW
+	 */
+#if KERNEL_VERSION(5, 3, 0) <= LINUX_VERSION_CODE
+	lockdep_assert_held_write(&kbdev->csf.reset.sem);
+#elif KERNEL_VERSION(4, 10, 0) <= LINUX_VERSION_CODE
+	lockdep_assert_held_exclusive(&kbdev->csf.reset.sem);
+#else
+	lockdep_assert_held(&kbdev->csf.reset.sem);
+#endif
+	WARN_ON(!kbase_reset_gpu_is_active(kbdev));
+
+	/* Reset the scheduler state before disabling the interrupts as suspend
+	 * of active CSG slots would also be done as a part of reset.
 	 */
 	if (likely(firmware_inited))
 		kbase_csf_scheduler_reset(kbdev);
 	cancel_work_sync(&kbdev->csf.firmware_reload_work);
 
-	/* Disable GPU hardware counters.
-	 * This call will block until counters are disabled.
+	dev_dbg(kbdev->dev, "Disable GPU hardware counters.\n");
+	/* This call will block until counters are disabled.
 	 */
 	kbase_hwcnt_context_disable(kbdev->hwcnt_gpu_ctx);
 
@@ -141,7 +367,8 @@ static int kbase_csf_reset_gpu_now(struct kbase_device *kbdev,
 	spin_lock(&kbdev->mmu_mask_change);
 	kbase_pm_reset_start_locked(kbdev);
 
-	/* We're about to flush out the IRQs and their bottom halves */
+	dev_dbg(kbdev->dev,
+		"We're about to flush out the IRQs and their bottom halves\n");
 	kbdev->irq_reset_flush = true;
 
 	/* Disable IRQ to avoid IRQ handlers to kick in after releasing the
@@ -152,15 +379,16 @@ static int kbase_csf_reset_gpu_now(struct kbase_device *kbdev,
 	spin_unlock(&kbdev->mmu_mask_change);
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 
-	/* Ensure that any IRQ handlers have finished
-	 * Must be done without any locks IRQ handlers will take.
+	dev_dbg(kbdev->dev, "Ensure that any IRQ handlers have finished\n");
+	/* Must be done without any locks IRQ handlers will take.
 	 */
 	kbase_synchronize_irqs(kbdev);
 
-	/* Flush out any in-flight work items */
+	dev_dbg(kbdev->dev, "Flush out any in-flight work items\n");
 	kbase_flush_mmu_wqs(kbdev);
 
-	/* The flush has completed so reset the active indicator */
+	dev_dbg(kbdev->dev,
+		"The flush has completed so reset the active indicator\n");
 	kbdev->irq_reset_flush = false;
 
 	mutex_lock(&kbdev->pm.lock);
@@ -177,17 +405,31 @@ static int kbase_csf_reset_gpu_now(struct kbase_device *kbdev,
 			kbase_csf_dump_firmware_trace_buffer(kbdev);
 	}
 
+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+	kbase_ipa_control_handle_gpu_reset_pre(kbdev);
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+
+	/* Tell hardware counters a reset is about to occur.
+	 * If the backend is in an unrecoverable error state (e.g. due to
+	 * firmware being unresponsive) this will transition the backend out of
+	 * it, on the assumption a reset will fix whatever problem there was.
+	 */
+	kbase_hwcnt_backend_csf_on_before_reset(&kbdev->hwcnt_gpu_iface);
+
 	/* Reset the GPU */
 	err = kbase_pm_init_hw(kbdev, 0);
 
 	mutex_unlock(&kbdev->pm.lock);
 
-	if (WARN_ON(err))
+	if (WARN_ON(err)) {
+		kbase_csf_hwcnt_on_reset_error(kbdev);
 		return err;
+	}
 
 	mutex_lock(&kbdev->mmu_hw_mutex);
 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
 	kbase_ctx_sched_restore_all_as(kbdev);
+	kbase_ipa_control_handle_gpu_reset_post(kbdev);
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 	mutex_unlock(&kbdev->mmu_hw_mutex);
 
@@ -199,13 +441,15 @@ static int kbase_csf_reset_gpu_now(struct kbase_device *kbdev,
 	err = kbase_pm_wait_for_desired_state(kbdev);
 	mutex_unlock(&kbdev->pm.lock);
 
-	if (err)
+	if (WARN_ON(err)) {
+		kbase_csf_hwcnt_on_reset_error(kbdev);
 		return err;
+	}
 
 	/* Re-enable GPU hardware counters */
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+	kbase_csf_scheduler_spin_lock(kbdev, &flags);
 	kbase_hwcnt_context_enable(kbdev->hwcnt_gpu_ctx);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+	kbase_csf_scheduler_spin_unlock(kbdev, flags);
 
 	if (!silent)
 		dev_err(kbdev->dev, "Reset complete");
@@ -220,6 +464,13 @@ static void kbase_csf_reset_gpu_worker(struct work_struct *data)
 	bool firmware_inited;
 	unsigned long flags;
 	int err = 0;
+	const enum kbase_csf_reset_gpu_state initial_reset_state =
+		atomic_read(&kbdev->csf.reset.state);
+
+	/* Ensure any threads (e.g. executing the CSF scheduler) have finished
+	 * using the HW
+	 */
+	kbase_csf_reset_begin_hw_access_sync(kbdev, initial_reset_state);
 
 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
 	firmware_inited = kbdev->csf.firmware_inited;
@@ -227,56 +478,59 @@ static void kbase_csf_reset_gpu_worker(struct work_struct *data)
 
 	if (!kbase_pm_context_active_handle_suspend(kbdev,
 			KBASE_PM_SUSPEND_HANDLER_DONT_REACTIVATE)) {
-		err = kbase_csf_reset_gpu_now(kbdev, firmware_inited);
+		bool silent =
+			kbase_csf_reset_state_is_silent(initial_reset_state);
+
+		err = kbase_csf_reset_gpu_now(kbdev, firmware_inited, silent);
 		kbase_pm_context_idle(kbdev);
 	}
 
 	kbase_disjoint_state_down(kbdev);
 
-	if (!err) {
-		atomic_set(&kbdev->csf.reset.state,
-				KBASE_CSF_RESET_GPU_NOT_PENDING);
-		if (likely(firmware_inited))
-			kbase_csf_scheduler_enable_tick_timer(kbdev);
-	} else {
-		dev_err(kbdev->dev, "Reset failed to complete");
-		atomic_set(&kbdev->csf.reset.state,
-				KBASE_CSF_RESET_GPU_FAILED);
-	}
-
-	wake_up(&kbdev->csf.reset.wait);
+	/* Allow other threads to once again use the GPU */
+	kbase_csf_reset_end_hw_access(kbdev, err, firmware_inited);
 }
 
-bool kbase_prepare_to_reset_gpu(struct kbase_device *kbdev)
+bool kbase_prepare_to_reset_gpu(struct kbase_device *kbdev, unsigned int flags)
 {
+	if (flags & RESET_FLAGS_HWC_UNRECOVERABLE_ERROR)
+		kbase_hwcnt_backend_csf_on_unrecoverable_error(
+			&kbdev->hwcnt_gpu_iface);
+
 	if (atomic_cmpxchg(&kbdev->csf.reset.state,
 			KBASE_CSF_RESET_GPU_NOT_PENDING,
-			KBASE_CSF_RESET_GPU_HAPPENING) !=
-			KBASE_CSF_RESET_GPU_NOT_PENDING) {
+			KBASE_CSF_RESET_GPU_PREPARED) !=
+			KBASE_CSF_RESET_GPU_NOT_PENDING)
 		/* Some other thread is already resetting the GPU */
 		return false;
-	}
 
 	return true;
 }
 KBASE_EXPORT_TEST_API(kbase_prepare_to_reset_gpu);
 
-bool kbase_prepare_to_reset_gpu_locked(struct kbase_device *kbdev)
+bool kbase_prepare_to_reset_gpu_locked(struct kbase_device *kbdev,
+				       unsigned int flags)
 {
 	lockdep_assert_held(&kbdev->hwaccess_lock);
 
-	return kbase_prepare_to_reset_gpu(kbdev);
+	return kbase_prepare_to_reset_gpu(kbdev, flags);
 }
 
-int kbase_reset_gpu(struct kbase_device *kbdev)
+void kbase_reset_gpu(struct kbase_device *kbdev)
 {
+	/* Note this is a WARN/atomic_set because it is a software issue for
+	 * a race to be occurring here
+	 */
+	if (WARN_ON(atomic_read(&kbdev->csf.reset.state) !=
+		    KBASE_RESET_GPU_PREPARED))
+		return;
+
+	atomic_set(&kbdev->csf.reset.state, KBASE_CSF_RESET_GPU_COMMITTED);
 	dev_err(kbdev->dev, "Preparing to soft-reset GPU\n");
 
 	kbase_disjoint_state_up(kbdev);
 
 	queue_work(kbdev->csf.reset.workq, &kbdev->csf.reset.work);
-
-	return 0;
 }
 KBASE_EXPORT_TEST_API(kbase_reset_gpu);
 
@@ -291,7 +545,7 @@ int kbase_reset_gpu_silent(struct kbase_device *kbdev)
 {
 	if (atomic_cmpxchg(&kbdev->csf.reset.state,
 				KBASE_CSF_RESET_GPU_NOT_PENDING,
-				KBASE_CSF_RESET_GPU_SILENT) !=
+				KBASE_CSF_RESET_GPU_COMMITTED_SILENT) !=
 				KBASE_CSF_RESET_GPU_NOT_PENDING) {
 		/* Some other thread is already resetting the GPU */
 		return -EAGAIN;
@@ -306,23 +560,42 @@ int kbase_reset_gpu_silent(struct kbase_device *kbdev)
 
 bool kbase_reset_gpu_is_active(struct kbase_device *kbdev)
 {
-	if (atomic_read(&kbdev->csf.reset.state) ==
-			KBASE_CSF_RESET_GPU_NOT_PENDING)
-		return false;
+	enum kbase_csf_reset_gpu_state reset_state =
+		atomic_read(&kbdev->csf.reset.state);
 
-	return true;
+	/* For CSF, the reset is considered active only when the reset worker
+	 * is actually executing and other threads would have to wait for it to
+	 * complete
+	 */
+	return kbase_csf_reset_state_is_active(reset_state);
 }
 
 int kbase_reset_gpu_wait(struct kbase_device *kbdev)
 {
 	const long wait_timeout =
 		kbase_csf_timeout_in_jiffies(GPU_RESET_TIMEOUT_MS);
-	long remaining = wait_event_timeout(kbdev->csf.reset.wait,
-				(atomic_read(&kbdev->csf.reset.state) ==
-					KBASE_CSF_RESET_GPU_NOT_PENDING) ||
-				(atomic_read(&kbdev->csf.reset.state) ==
-					KBASE_CSF_RESET_GPU_FAILED),
-				wait_timeout);
+	long remaining;
+
+	/* Inform lockdep we might be trying to wait on a reset (as
+	 * would've been done with down_read() - which has no 'timeout'
+	 * variant), then use wait_event_timeout() to implement the timed
+	 * wait.
+	 *
+	 * in CONFIG_PROVE_LOCKING builds, this should catch potential 'time
+	 * bound' deadlocks such as:
+	 * - incorrect lock order with respect to others locks
+	 * - current thread has prevented reset
+	 * - current thread is executing the reset worker
+	 */
+	might_lock_read(&kbdev->csf.reset.sem);
+
+	remaining = wait_event_timeout(
+		kbdev->csf.reset.wait,
+		(atomic_read(&kbdev->csf.reset.state) ==
+		 KBASE_CSF_RESET_GPU_NOT_PENDING) ||
+			(atomic_read(&kbdev->csf.reset.state) ==
+			 KBASE_CSF_RESET_GPU_FAILED),
+		wait_timeout);
 
 	if (!remaining) {
 		dev_warn(kbdev->dev, "Timed out waiting for the GPU reset to complete");
@@ -345,6 +618,7 @@ int kbase_reset_gpu_init(struct kbase_device *kbdev)
 	INIT_WORK(&kbdev->csf.reset.work, kbase_csf_reset_gpu_worker);
 
 	init_waitqueue_head(&kbdev->csf.reset.wait);
+	init_rwsem(&kbdev->csf.reset.sem);
 
 	return 0;
 }
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_scheduler.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_scheduler.c
index a3017a7f25ba..f7a20d5f6678 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_scheduler.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_scheduler.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
@@ -25,20 +24,16 @@
 #include <mali_kbase_ctx_sched.h>
 #include <mali_kbase_reset_gpu.h>
 #include <mali_kbase_as_fault_debugfs.h>
-#include <mali_kbase_bits.h>
 #include "mali_kbase_csf.h"
 #include "../tl/mali_kbase_tracepoints.h"
 #include "backend/gpu/mali_kbase_pm_internal.h"
 #include <linux/export.h>
-#include "mali_gpu_csf_registers.h"
-#include <mali_base_kernel.h>
+#include <uapi/gpu/arm/bifrost/csf/mali_gpu_csf_registers.h>
+#include <uapi/gpu/arm/bifrost/mali_base_kernel.h>
 
 /* Value to indicate that a queue group is not groups_to_schedule list */
 #define KBASEP_GROUP_PREPARED_SEQ_NUM_INVALID (U32_MAX)
 
-/* Waiting timeout for status change acknowledgment, in milliseconds */
-#define CSF_STATE_WAIT_TIMEOUT_MS (800) /* Relaxed to 800ms from 100ms */
-
 /* Waiting timeout for scheduler state change for descheduling a CSG */
 #define CSG_SCHED_STOP_TIMEOUT_MS (50)
 
@@ -52,8 +47,6 @@
 
 /* CSF scheduler time slice value */
 #define CSF_SCHEDULER_TIME_TICK_MS (100) /* 100 milliseconds */
-#define CSF_SCHEDULER_TIME_TICK_JIFFIES \
-	msecs_to_jiffies(CSF_SCHEDULER_TIME_TICK_MS)
 
 /*
  * CSF scheduler time threshold for converting "tock" requests into "tick" if
@@ -76,17 +69,16 @@
  */
 #define CSF_SCHEDULER_TIME_TOCK_JIFFIES 1 /* 1 jiffies-time */
 
-/* Command stream suspended and is idle (empty ring buffer) */
+/* CS suspended and is idle (empty ring buffer) */
 #define CS_IDLE_FLAG (1 << 0)
 
-/* Command stream suspended and is wait for a CQS condition */
+/* CS suspended and is wait for a CQS condition */
 #define CS_WAIT_SYNC_FLAG (1 << 1)
 
-/* This is to avoid the immediate power down of GPU when then are no groups
- * left for scheduling. GPUCORE-24250 would add the proper GPU idle detection
- * logic.
+/* 2 GPU address space slots are reserved for MCU and privileged context for HW
+ * counter dumping. TODO remove the slot reserved for latter in GPUCORE-26293.
  */
-#define GPU_IDLE_POWEROFF_HYSTERESIS_DELAY msecs_to_jiffies((u32)10)
+#define NUM_RESERVED_AS_SLOTS (2)
 
 static int scheduler_group_schedule(struct kbase_queue_group *group);
 static void remove_group_from_idle_wait(struct kbase_queue_group *const group);
@@ -102,9 +94,95 @@ static struct kbase_queue_group *get_tock_top_group(
 static void scheduler_enable_tick_timer_nolock(struct kbase_device *kbdev);
 static int suspend_active_queue_groups(struct kbase_device *kbdev,
 				       unsigned long *slot_mask);
+static void schedule_in_cycle(struct kbase_queue_group *group, bool force);
 
 #define kctx_as_enabled(kctx) (!kbase_ctx_flag(kctx, KCTX_AS_DISABLED_ON_FAULT))
 
+/**
+ * tick_timer_callback() - Callback function for the scheduling tick hrtimer
+ *
+ * @timer: Pointer to the device
+ *
+ * This function will enqueue the scheduling tick work item for immediate
+ * execution, if it has not been queued already.
+ *
+ * Return: enum value to indicate that timer should not be restarted.
+ */
+static enum hrtimer_restart tick_timer_callback(struct hrtimer *timer)
+{
+	struct kbase_device *kbdev = container_of(timer, struct kbase_device,
+						  csf.scheduler.tick_timer);
+
+	kbase_csf_scheduler_advance_tick(kbdev);
+	return HRTIMER_NORESTART;
+}
+
+/**
+ * start_tick_timer() - Start the scheduling tick hrtimer.
+ *
+ * @kbdev: Pointer to the device
+ *
+ * This function will start the scheduling tick hrtimer and is supposed to
+ * be called only from the tick work item function. The tick hrtimer should
+ * should not be active already.
+ */
+static void start_tick_timer(struct kbase_device *kbdev)
+{
+	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
+	unsigned long flags;
+
+	lockdep_assert_held(&scheduler->lock);
+
+	spin_lock_irqsave(&scheduler->interrupt_lock, flags);
+	WARN_ON(scheduler->tick_timer_active);
+	if (likely(!work_pending(&scheduler->tick_work))) {
+		scheduler->tick_timer_active = true;
+
+		hrtimer_start(&scheduler->tick_timer,
+		    HR_TIMER_DELAY_MSEC(scheduler->csg_scheduling_period_ms),
+		    HRTIMER_MODE_REL);
+	}
+	spin_unlock_irqrestore(&scheduler->interrupt_lock, flags);
+}
+
+/**
+ * cancel_tick_timer() - Cancel the scheduling tick hrtimer
+ *
+ * @kbdev: Pointer to the device
+ */
+static void cancel_tick_timer(struct kbase_device *kbdev)
+{
+	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
+	unsigned long flags;
+
+	spin_lock_irqsave(&scheduler->interrupt_lock, flags);
+	scheduler->tick_timer_active = false;
+	spin_unlock_irqrestore(&scheduler->interrupt_lock, flags);
+	hrtimer_cancel(&scheduler->tick_timer);
+}
+
+/**
+ * enqueue_tick_work() - Enqueue the scheduling tick work item
+ *
+ * @kbdev: Pointer to the device
+ *
+ * This function will queue the scheduling tick work item for immediate
+ * execution. This shall only be called when both the tick hrtimer and tick
+ * work item are not active/pending.
+ */
+static void enqueue_tick_work(struct kbase_device *kbdev)
+{
+	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
+	unsigned long flags;
+
+	lockdep_assert_held(&scheduler->lock);
+
+	spin_lock_irqsave(&scheduler->interrupt_lock, flags);
+	WARN_ON(scheduler->tick_timer_active);
+	queue_work(scheduler->wq, &scheduler->tick_work);
+	spin_unlock_irqrestore(&scheduler->interrupt_lock, flags);
+}
+
 static void release_doorbell(struct kbase_device *kbdev, int doorbell_nr)
 {
 	WARN_ON(doorbell_nr >= CSF_NUM_DOORBELL);
@@ -176,7 +254,7 @@ static void assign_user_doorbell_to_queue(struct kbase_device *kbdev,
 	mutex_lock(&kbdev->csf.reg_lock);
 
 	/* If bind operation for the queue hasn't completed yet, then the
-	 * the command stream interface can't be programmed for the queue
+	 * the CSI can't be programmed for the queue
 	 * (even in stopped state) and so the doorbell also can't be assigned
 	 * to it.
 	 */
@@ -225,8 +303,7 @@ static u32 get_nr_active_csgs(struct kbase_device *kbdev)
 /**
  * csgs_active - returns true if any of CSG slots are in use
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  *
  * Return: the interface is actively engaged flag.
  */
@@ -238,7 +315,7 @@ bool csgs_active(struct kbase_device *kbdev)
 	nr_active_csgs = get_nr_active_csgs(kbdev);
 	mutex_unlock(&kbdev->csf.scheduler.lock);
 
-	/* Right now if any of the command stream group interfaces are in use
+	/* Right now if any of the CSG interfaces are in use
 	 * then we need to assume that there is some work pending.
 	 * In future when we have IDLE notifications from firmware implemented
 	 * then we would have a better idea of the pending work.
@@ -250,8 +327,7 @@ bool csgs_active(struct kbase_device *kbdev)
  * csg_slot_in_use - returns true if a queue group has been programmed on a
  *                   given CSG slot.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  * @slot:  Index/number of the CSG slot in question.
  *
  * Return: the interface is actively engaged flag.
@@ -296,6 +372,45 @@ static bool queue_group_scheduled_locked(struct kbase_queue_group *group)
 	return queue_group_scheduled(group);
 }
 
+/**
+ * scheduler_wait_protm_quit() - Wait for GPU to exit protected mode.
+ *
+ * @kbdev: Pointer to the GPU device
+ *
+ * This function waits for the GPU to exit protected mode which is confirmed
+ * when active_protm_grp is set to NULL.
+ */
+static void scheduler_wait_protm_quit(struct kbase_device *kbdev)
+{
+	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
+	long wt = kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms);
+	long remaining;
+
+	lockdep_assert_held(&scheduler->lock);
+
+	remaining = wait_event_timeout(kbdev->csf.event_wait,
+			!kbase_csf_scheduler_protected_mode_in_use(kbdev), wt);
+
+	if (!remaining)
+		dev_warn(kbdev->dev, "Timeout, protm_quit wait skipped");
+}
+
+/**
+ * scheduler_force_protm_exit() - Force GPU to exit protected mode.
+ *
+ * @kbdev: Pointer to the GPU device
+ *
+ * This function sends a ping request to the firmware and waits for the GPU
+ * to exit protected mode.
+ */
+static void scheduler_force_protm_exit(struct kbase_device *kbdev)
+{
+	lockdep_assert_held(&kbdev->csf.scheduler.lock);
+
+	kbase_csf_firmware_ping(kbdev);
+	scheduler_wait_protm_quit(kbdev);
+}
+
 /**
  * scheduler_timer_is_enabled_nolock() - Check if the scheduler wakes up
  * automatically for periodic tasks.
@@ -314,6 +429,54 @@ static bool scheduler_timer_is_enabled_nolock(struct kbase_device *kbdev)
 	return kbdev->csf.scheduler.timer_enabled;
 }
 
+static void enable_gpu_idle_fw_timer(struct kbase_device *kbdev)
+{
+	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
+	unsigned long flags;
+
+	lockdep_assert_held(&scheduler->lock);
+
+	if (scheduler->gpu_idle_fw_timer_enabled)
+		return;
+
+	spin_lock_irqsave(&scheduler->interrupt_lock, flags);
+
+	/* Update the timer_enabled flag requires holding interrupt_lock */
+	scheduler->gpu_idle_fw_timer_enabled = true;
+	kbase_csf_firmware_enable_gpu_idle_timer(kbdev);
+
+	spin_unlock_irqrestore(&scheduler->interrupt_lock, flags);
+}
+
+static void disable_gpu_idle_fw_timer_locked(struct kbase_device *kbdev)
+{
+	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
+
+	lockdep_assert_held(&scheduler->lock);
+	lockdep_assert_held(&scheduler->interrupt_lock);
+
+	/* Update of the timer_enabled flag requires holding interrupt_lock */
+	if (scheduler->gpu_idle_fw_timer_enabled) {
+		scheduler->gpu_idle_fw_timer_enabled = false;
+		kbase_csf_firmware_disable_gpu_idle_timer(kbdev);
+	}
+}
+
+static void disable_gpu_idle_fw_timer(struct kbase_device *kbdev)
+{
+	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
+	unsigned long flags;
+
+	lockdep_assert_held(&scheduler->lock);
+
+	if (!scheduler->gpu_idle_fw_timer_enabled)
+		return;
+
+	spin_lock_irqsave(&scheduler->interrupt_lock, flags);
+	disable_gpu_idle_fw_timer_locked(kbdev);
+	spin_unlock_irqrestore(&scheduler->interrupt_lock, flags);
+}
+
 static void scheduler_wakeup(struct kbase_device *kbdev, bool kick)
 {
 	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
@@ -321,7 +484,7 @@ static void scheduler_wakeup(struct kbase_device *kbdev, bool kick)
 	lockdep_assert_held(&scheduler->lock);
 
 	if (scheduler->state == SCHED_SUSPENDED) {
-		dev_info(kbdev->dev, "Re-activating the Scheduler");
+		dev_dbg(kbdev->dev, "Re-activating the Scheduler");
 		kbase_csf_scheduler_pm_active(kbdev);
 		scheduler->state = SCHED_INACTIVE;
 
@@ -367,14 +530,20 @@ static void update_idle_suspended_group_state(struct kbase_queue_group *group)
 		remove_group_from_idle_wait(group);
 		insert_group_to_runnable(scheduler, group,
 					 KBASE_CSF_GROUP_SUSPENDED);
-	} else {
-		if (group->run_state == KBASE_CSF_GROUP_SUSPENDED_ON_IDLE)
-			group->run_state = KBASE_CSF_GROUP_SUSPENDED;
-		else
-			return;
-	}
+	} else if (group->run_state == KBASE_CSF_GROUP_SUSPENDED_ON_IDLE) {
+		group->run_state = KBASE_CSF_GROUP_SUSPENDED;
+
+		/* If scheduler is not suspended and the given group's
+		 * static priority (reflected by the scan_seq_num) is inside
+		 * the current tick slot-range, schedules an async tock.
+		 */
+		if (scheduler->state != SCHED_SUSPENDED &&
+		    group->scan_seq_num < scheduler->num_csg_slots_for_tick)
+			schedule_in_cycle(group, true);
+	} else
+		return;
 
-	atomic_inc(&scheduler->non_idle_suspended_grps);
+	atomic_inc(&scheduler->non_idle_offslot_grps);
 }
 
 int kbase_csf_scheduler_group_get_slot_locked(struct kbase_queue_group *group)
@@ -456,8 +625,8 @@ static int halt_stream_sync(struct kbase_queue *queue)
 	struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
 	struct kbase_csf_cmd_stream_group_info *ginfo;
 	struct kbase_csf_cmd_stream_info *stream;
-	long remaining =
-		kbase_csf_timeout_in_jiffies(CSF_STATE_WAIT_TIMEOUT_MS);
+	int csi_index = queue->csi_index;
+	long remaining = kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms);
 
 	if (WARN_ON(!group) ||
 	    WARN_ON(!kbasep_csf_scheduler_group_is_on_slot_locked(group)))
@@ -465,7 +634,7 @@ static int halt_stream_sync(struct kbase_queue *queue)
 
 	lockdep_assert_held(&kbdev->csf.scheduler.lock);
 	ginfo = &global_iface->groups[group->csg_nr];
-	stream = &ginfo->streams[queue->csi_index];
+	stream = &ginfo->streams[csi_index];
 
 	if (CS_REQ_STATE_GET(kbase_csf_firmware_cs_input_read(stream, CS_REQ)) ==
 			CS_REQ_STATE_START) {
@@ -476,15 +645,15 @@ static int halt_stream_sync(struct kbase_queue *queue)
 
 		if (!remaining) {
 			dev_warn(kbdev->dev, "Timed out waiting for queue to start on csi %d bound to group %d on slot %d",
-				queue->csi_index, group->handle, group->csg_nr);
-			if (kbase_prepare_to_reset_gpu(kbdev))
+				 csi_index, group->handle, group->csg_nr);
+			if (kbase_prepare_to_reset_gpu(kbdev, RESET_FLAGS_NONE))
 				kbase_reset_gpu(kbdev);
 
 			return -ETIMEDOUT;
 		}
 
 		remaining =
-			kbase_csf_timeout_in_jiffies(CSF_STATE_WAIT_TIMEOUT_MS);
+			kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms);
 	}
 
 	/* Set state to STOP */
@@ -492,7 +661,7 @@ static int halt_stream_sync(struct kbase_queue *queue)
 					 CS_REQ_STATE_MASK);
 
 	KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, CSI_STOP_REQUESTED, group, queue, 0u);
-	kbase_csf_ring_cs_kernel_doorbell(kbdev, queue);
+	kbase_csf_ring_cs_kernel_doorbell(kbdev, csi_index, group->csg_nr, true);
 
 	/* Timed wait */
 	remaining = wait_event_timeout(kbdev->csf.event_wait,
@@ -502,7 +671,11 @@ static int halt_stream_sync(struct kbase_queue *queue)
 	if (!remaining) {
 		dev_warn(kbdev->dev, "Timed out waiting for queue to stop on csi %d bound to group %d on slot %d",
 			 queue->csi_index, group->handle, group->csg_nr);
-		if (kbase_prepare_to_reset_gpu(kbdev))
+
+		/* TODO GPUCORE-25328: The CSG can't be terminated, the GPU
+		 * will be reset as a work-around.
+		 */
+		if (kbase_prepare_to_reset_gpu(kbdev, RESET_FLAGS_NONE))
 			kbase_reset_gpu(kbdev);
 	}
 	return (remaining) ? 0 : -ETIMEDOUT;
@@ -536,7 +709,7 @@ static bool can_halt_stream(struct kbase_device *kbdev,
  * @queue: Pointer to the GPU queue to stop.
  *
  * This function handles stopping gpu queues for groups that are either not on
- * a command stream group slot or are on the slot but undergoing transition to
+ * a CSG slot or are on the slot but undergoing transition to
  * resume or suspend states.
  * It waits until the queue group is scheduled on a slot and starts running,
  * which is needed as groups that were suspended may need to resume all queues
@@ -576,26 +749,6 @@ static int sched_halt_stream(struct kbase_queue *queue)
 		}
 	}
 retry:
-	/* First wait for the group to reach a stable state. IDLE state is
-	 * an intermediate state that is only set by Scheduler at the start
-	 * of a tick (prior to scanout) for groups that received idle
-	 * notification, then later the idle group is moved to one of the
-	 * suspended states or the runnable state.
-	 */
-	while (group->run_state == KBASE_CSF_GROUP_IDLE) {
-		mutex_unlock(&scheduler->lock);
-		remaining = wait_event_timeout(kbdev->csf.event_wait,
-				group->run_state != KBASE_CSF_GROUP_IDLE,
-				CSF_STATE_WAIT_TIMEOUT_MS);
-		mutex_lock(&scheduler->lock);
-		if (!remaining) {
-			dev_warn(kbdev->dev,
-				 "Timed out waiting for state change of Group-%d when stopping a queue on csi %d",
-				 group->handle, queue->csi_index);
-		}
-	}
-
-	WARN_ON(group->run_state == KBASE_CSF_GROUP_IDLE);
 	/* Update the group state so that it can get scheduled soon */
 	update_idle_suspended_group_state(group);
 
@@ -618,9 +771,10 @@ static int sched_halt_stream(struct kbase_queue *queue)
 	 * CSF context is locked. Therefore, the scheduler would be
 	 * the only one to update the run_state of the group.
 	 */
-	remaining = wait_event_timeout(kbdev->csf.event_wait,
-		can_halt_stream(kbdev, group),
-		kbase_csf_timeout_in_jiffies(20 * CSF_SCHEDULER_TIME_TICK_MS));
+	remaining = wait_event_timeout(
+		kbdev->csf.event_wait, can_halt_stream(kbdev, group),
+		kbase_csf_timeout_in_jiffies(
+			20 * kbdev->csf.scheduler.csg_scheduling_period_ms));
 
 	mutex_lock(&scheduler->lock);
 
@@ -628,14 +782,14 @@ static int sched_halt_stream(struct kbase_queue *queue)
 		slot = kbase_csf_scheduler_group_get_slot(group);
 
 		/* If the group is still on slot and slot is in running state
-		 * then explicitly stop the command stream interface of the
+		 * then explicitly stop the CSI of the
 		 * queue. Otherwise there are different cases to consider
 		 *
 		 * - If the queue group was already undergoing transition to
 		 *   resume/start state when this function was entered then it
-		 *   would not have disabled the command stream interface of the
+		 *   would not have disabled the CSI of the
 		 *   queue being stopped and the previous wait would have ended
-		 *   once the slot was in a running state with command stream
+		 *   once the slot was in a running state with CS
 		 *   interface still enabled.
 		 *   Now the group is going through another transition either
 		 *   to a suspend state or to a resume state (it could have
@@ -643,17 +797,17 @@ static int sched_halt_stream(struct kbase_queue *queue)
 		 *   In both scenarios need to wait again for the group to
 		 *   come on a slot and that slot to reach the running state,
 		 *   as that would guarantee that firmware will observe the
-		 *   command stream interface as disabled.
+		 *   CSI as disabled.
 		 *
 		 * - If the queue group was either off the slot or was
 		 *   undergoing transition to suspend state on entering this
 		 *   function, then the group would have been resumed with the
-		 *   queue's command stream interface in disabled state.
+		 *   queue's CSI in disabled state.
 		 *   So now if the group is undergoing another transition
 		 *   (after the resume) then just need to wait for the state
-		 *   bits in the ACK register of command stream interface to be
+		 *   bits in the ACK register of CSI to be
 		 *   set to STOP value. It is expected that firmware will
-		 *   process the stop/disable request of the command stream
+		 *   process the stop/disable request of the CS
 		 *   interface after resuming the group before it processes
 		 *   another state change request of the group.
 		 */
@@ -678,9 +832,11 @@ static int sched_halt_stream(struct kbase_queue *queue)
 				/* Timed wait */
 				remaining = wait_event_timeout(
 					kbdev->csf.event_wait,
-					(CS_ACK_STATE_GET(kbase_csf_firmware_cs_output(stream, CS_ACK))
-					== CS_ACK_STATE_STOP),
-					CSF_STATE_WAIT_TIMEOUT_MS);
+					(CS_ACK_STATE_GET(
+						 kbase_csf_firmware_cs_output(
+							 stream, CS_ACK)) ==
+					 CS_ACK_STATE_STOP),
+					kbdev->csf.fw_timeout_ms);
 
 				if (!remaining) {
 					dev_warn(kbdev->dev,
@@ -700,21 +856,6 @@ static int sched_halt_stream(struct kbase_queue *queue)
 	return err;
 }
 
-static int wait_gpu_reset(struct kbase_device *kbdev)
-{
-	int ret = 0;
-
-	lockdep_assert_held(&kbdev->csf.scheduler.lock);
-
-	while (kbase_reset_gpu_is_active(kbdev) && !ret) {
-		mutex_unlock(&kbdev->csf.scheduler.lock);
-		ret = kbase_reset_gpu_wait(kbdev);
-		mutex_lock(&kbdev->csf.scheduler.lock);
-	}
-
-	return ret;
-}
-
 int kbase_csf_scheduler_queue_stop(struct kbase_queue *queue)
 {
 	struct kbase_device *kbdev = queue->kctx->kbdev;
@@ -725,14 +866,13 @@ int kbase_csf_scheduler_queue_stop(struct kbase_queue *queue)
 	if (WARN_ON(!group))
 		return -EINVAL;
 
+	kbase_reset_gpu_assert_failed_or_prevented(kbdev);
 	lockdep_assert_held(&queue->kctx->csf.lock);
 	mutex_lock(&kbdev->csf.scheduler.lock);
 
 	queue->enabled = false;
 	KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, CSI_STOP, group, queue, cs_enabled);
 
-	wait_gpu_reset(kbdev);
-
 	if (cs_enabled && queue_group_scheduled_locked(group)) {
 		struct kbase_csf_csg_slot *const csg_slot =
 			kbdev->csf.scheduler.csg_slots;
@@ -780,11 +920,12 @@ static void program_cs_extract_init(struct kbase_queue *queue)
 }
 
 static void program_cs(struct kbase_device *kbdev,
-		struct kbase_queue *queue)
+		struct kbase_queue *queue, bool ring_csg_doorbell)
 {
 	struct kbase_queue_group *group = queue->group;
 	struct kbase_csf_cmd_stream_group_info *ginfo;
 	struct kbase_csf_cmd_stream_info *stream;
+	int csi_index = queue->csi_index;
 	u64 user_input;
 	u64 user_output;
 
@@ -798,8 +939,8 @@ static void program_cs(struct kbase_device *kbdev,
 
 	ginfo = &kbdev->csf.global_iface.groups[group->csg_nr];
 
-	if (WARN_ON(queue->csi_index < 0) ||
-	    WARN_ON(queue->csi_index >= ginfo->stream_num))
+	if (WARN_ON(csi_index < 0) ||
+	    WARN_ON(csi_index >= ginfo->stream_num))
 		return;
 
 	assign_user_doorbell_to_queue(kbdev, queue);
@@ -811,7 +952,7 @@ static void program_cs(struct kbase_device *kbdev,
 	if (queue->enabled && queue_group_suspended_locked(group))
 		program_cs_extract_init(queue);
 
-	stream = &ginfo->streams[queue->csi_index];
+	stream = &ginfo->streams[csi_index];
 
 	kbase_csf_firmware_cs_input(stream, CS_BASE_LO,
 				    queue->base_addr & 0xFFFFFFFF);
@@ -839,8 +980,8 @@ static void program_cs(struct kbase_device *kbdev,
 	kbase_csf_firmware_cs_input(stream, CS_ACK_IRQ_MASK, ~((u32)0));
 
 	/*
-	 * Enable the CSG idle notification once the stream's ringbuffer
-	 * becomes empty or the stream becomes sync_idle, waiting sync update
+	 * Enable the CSG idle notification once the CS's ringbuffer
+	 * becomes empty or the CS becomes sync_idle, waiting sync update
 	 * or protected mode switch.
 	 */
 	kbase_csf_firmware_cs_input_mask(stream, CS_REQ,
@@ -854,7 +995,8 @@ static void program_cs(struct kbase_device *kbdev,
 
 	KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, CSI_START, group, queue, queue->enabled);
 
-	kbase_csf_ring_cs_kernel_doorbell(kbdev, queue);
+	kbase_csf_ring_cs_kernel_doorbell(kbdev, csi_index, group->csg_nr,
+					  ring_csg_doorbell);
 	update_hw_active(queue, true);
 }
 
@@ -866,6 +1008,7 @@ int kbase_csf_scheduler_queue_start(struct kbase_queue *queue)
 	int err = 0;
 	bool evicted = false;
 
+	kbase_reset_gpu_assert_prevented(kbdev);
 	lockdep_assert_held(&queue->kctx->csf.lock);
 
 	if (WARN_ON(!group || queue->bind_state != KBASE_CSF_QUEUE_BOUND))
@@ -874,12 +1017,8 @@ int kbase_csf_scheduler_queue_start(struct kbase_queue *queue)
 	mutex_lock(&kbdev->csf.scheduler.lock);
 
 	KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, QUEUE_START, group, queue, group->run_state);
-	err = wait_gpu_reset(kbdev);
 
-	if (err) {
-		dev_warn(kbdev->dev, "Unsuccessful GPU reset detected when kicking queue (csi_index=%d) of group %d",
-			 queue->csi_index, group->handle);
-	} else if (group->run_state == KBASE_CSF_GROUP_FAULT_EVICTED) {
+	if (group->run_state == KBASE_CSF_GROUP_FAULT_EVICTED) {
 		err = -EIO;
 		evicted = true;
 	} else if ((group->run_state == KBASE_CSF_GROUP_SUSPENDED_ON_WAIT_SYNC)
@@ -907,7 +1046,7 @@ int kbase_csf_scheduler_queue_start(struct kbase_queue *queue)
 					 */
 					kbase_csf_ring_cs_user_doorbell(kbdev, queue);
 				} else
-					program_cs(kbdev, queue);
+					program_cs(kbdev, queue, true);
 			}
 			queue_delayed_work(system_long_wq,
 				&kbdev->csf.scheduler.ping_work,
@@ -1031,7 +1170,7 @@ static void halt_csg_slot(struct kbase_queue_group *group, bool suspend)
 	/* When in transition, wait for it to complete */
 	if (atomic_read(&csg_slot[slot].state) == CSG_SLOT_READY2RUN) {
 		long remaining =
-		      kbase_csf_timeout_in_jiffies(CSF_STATE_WAIT_TIMEOUT_MS);
+			kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms);
 
 		dev_dbg(kbdev->dev, "slot %d wait for up-running\n", slot);
 		remaining = wait_event_timeout(kbdev->csf.event_wait,
@@ -1085,7 +1224,6 @@ static void suspend_csg_slot(struct kbase_queue_group *group)
  */
 static bool evaluate_sync_update(struct kbase_queue *queue)
 {
-	enum kbase_csf_group_state run_state;
 	struct kbase_vmap_struct *mapping;
 	bool updated = false;
 	u32 *sync_ptr;
@@ -1094,12 +1232,6 @@ static bool evaluate_sync_update(struct kbase_queue *queue)
 	if (WARN_ON(!queue))
 		return false;
 
-	run_state = queue->group->run_state;
-
-	if (WARN_ON((run_state != KBASE_CSF_GROUP_IDLE) &&
-		    (run_state != KBASE_CSF_GROUP_SUSPENDED_ON_WAIT_SYNC)))
-		return false;
-
 	lockdep_assert_held(&queue->kctx->kbdev->csf.scheduler.lock);
 
 	sync_ptr = kbase_phy_alloc_mapping_get(queue->kctx, queue->sync_ptr,
@@ -1138,7 +1270,7 @@ static bool evaluate_sync_update(struct kbase_queue *queue)
 /**
  * save_slot_cs() -  Save the state for blocked GPU command queue.
  *
- * @ginfo: Pointer to the command stream group interface used by the group
+ * @ginfo: Pointer to the CSG interface used by the group
  *         the queue is bound to.
  * @queue: Pointer to the GPU command queue.
  *
@@ -1158,8 +1290,6 @@ bool save_slot_cs(struct kbase_csf_cmd_stream_group_info const *const ginfo,
 	u32 status = kbase_csf_firmware_cs_output(stream, CS_STATUS_WAIT);
 	bool is_waiting = false;
 
-	WARN_ON(queue->group->run_state != KBASE_CSF_GROUP_IDLE);
-
 	if (CS_STATUS_WAIT_SYNC_WAIT_GET(status)) {
 		queue->status_wait = status;
 		queue->sync_ptr = kbase_csf_firmware_cs_output(stream,
@@ -1169,6 +1299,13 @@ bool save_slot_cs(struct kbase_csf_cmd_stream_group_info const *const ginfo,
 		queue->sync_value = kbase_csf_firmware_cs_output(stream,
 			CS_STATUS_WAIT_SYNC_VALUE);
 
+		queue->sb_status = CS_STATUS_SCOREBOARDS_NONZERO_GET(
+			kbase_csf_firmware_cs_output(stream,
+						     CS_STATUS_SCOREBOARDS));
+		queue->blocked_reason = CS_STATUS_BLOCKED_REASON_REASON_GET(
+			kbase_csf_firmware_cs_output(stream,
+						     CS_STATUS_BLOCKED_REASON));
+
 		if (!evaluate_sync_update(queue)) {
 			is_waiting = true;
 		} else {
@@ -1260,7 +1397,7 @@ void insert_group_to_runnable(struct kbase_csf_scheduler *const scheduler,
 
 	WARN_ON(group->run_state != KBASE_CSF_GROUP_INACTIVE);
 
-	if (WARN_ON(group->priority >= BASE_QUEUE_GROUP_PRIORITY_COUNT))
+	if (WARN_ON(group->priority >= KBASE_QUEUE_GROUP_PRIORITY_COUNT))
 		return;
 
 	group->run_state = run_state;
@@ -1285,8 +1422,7 @@ void insert_group_to_runnable(struct kbase_csf_scheduler *const scheduler,
 	     scheduler->state == SCHED_SUSPENDED)) {
 		dev_dbg(kbdev->dev, "Kicking scheduler on first runnable group\n");
 		/* Fire a scheduling to start the time-slice */
-		mod_delayed_work(kbdev->csf.scheduler.wq,
-				 &kbdev->csf.scheduler.tick_work, 0);
+		enqueue_tick_work(kbdev);
 	} else
 		schedule_in_cycle(group, false);
 
@@ -1343,11 +1479,12 @@ void remove_group_from_runnable(struct kbase_csf_scheduler *const scheduler,
 
 	WARN_ON(scheduler->total_runnable_grps == 0);
 	scheduler->total_runnable_grps--;
-	if (!scheduler->total_runnable_grps &&
-	    scheduler->state != SCHED_SUSPENDED) {
-		dev_dbg(kctx->kbdev->dev, "Scheduler idle as no runnable groups");
-		mod_delayed_work(system_wq, &scheduler->gpu_idle_work,
-				 GPU_IDLE_POWEROFF_HYSTERESIS_DELAY);
+	if (!scheduler->total_runnable_grps) {
+		dev_dbg(kctx->kbdev->dev, "Scheduler idle has no runnable groups");
+		cancel_tick_timer(kctx->kbdev);
+		WARN_ON(atomic_read(&scheduler->non_idle_offslot_grps));
+		if (scheduler->state != SCHED_SUSPENDED)
+			queue_work(system_wq, &scheduler->gpu_idle_work);
 	}
 	KBASE_KTRACE_ADD_CSF_GRP(kctx->kbdev, SCHEDULER_TOP_GRP, scheduler->top_grp,
 			scheduler->num_active_address_spaces |
@@ -1396,13 +1533,88 @@ static void deschedule_idle_wait_group(struct kbase_csf_scheduler *scheduler,
 	insert_group_to_idle_wait(group);
 }
 
-static bool confirm_cs_idle(struct kbase_queue *queue)
+static void update_offslot_non_idle_cnt_for_faulty_grp(struct kbase_queue_group *group)
+{
+	struct kbase_device *kbdev = group->kctx->kbdev;
+	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
+
+	lockdep_assert_held(&scheduler->lock);
+
+	if (group->prepared_seq_num < scheduler->non_idle_scanout_grps)
+		atomic_dec(&scheduler->non_idle_offslot_grps);
+}
+
+static void update_offslot_non_idle_cnt_for_onslot_grp(struct kbase_queue_group *group)
 {
+	struct kbase_device *kbdev = group->kctx->kbdev;
+	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
+
+	lockdep_assert_held(&scheduler->lock);
+
+	WARN_ON(group->csg_nr < 0);
+
+	if (group->prepared_seq_num < scheduler->non_idle_scanout_grps)
+		atomic_dec(&scheduler->non_idle_offslot_grps);
+}
+
+static void update_offslot_non_idle_cnt_on_grp_suspend(
+				struct kbase_queue_group *group)
+{
+	struct kbase_device *kbdev = group->kctx->kbdev;
+	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
+
+	lockdep_assert_held(&scheduler->lock);
+
+	if (scheduler->state == SCHED_BUSY) {
+		/* active phase or, async entering the protected mode */
+		if (group->prepared_seq_num >=
+		    scheduler->non_idle_scanout_grps) {
+			/* At scanout, it was tagged as on-slot idle */
+			if (group->run_state == KBASE_CSF_GROUP_SUSPENDED)
+				atomic_inc(&scheduler->non_idle_offslot_grps);
+		} else {
+			if (group->run_state != KBASE_CSF_GROUP_SUSPENDED)
+				atomic_dec(&scheduler->non_idle_offslot_grps);
+		}
+	} else {
+		/* async phases */
+		if (group->run_state == KBASE_CSF_GROUP_SUSPENDED)
+			atomic_inc(&scheduler->non_idle_offslot_grps);
+	}
+}
+
+static bool confirm_cmd_buf_empty(struct kbase_queue *queue)
+{
+	bool cs_empty;
+	bool cs_idle;
+	u32 sb_status = 0;
+
+	struct kbase_device const *const kbdev = queue->group->kctx->kbdev;
+	struct kbase_csf_global_iface const *const iface =
+		&kbdev->csf.global_iface;
+
+	u32 glb_version = iface->version;
+
 	u64 *input_addr = (u64 *)queue->user_io_addr;
 	u64 *output_addr = (u64 *)(queue->user_io_addr + PAGE_SIZE);
 
-	return (input_addr[CS_INSERT_LO / sizeof(u64)] ==
-		output_addr[CS_EXTRACT_LO / sizeof(u64)]);
+	if (glb_version >= kbase_csf_interface_version(1, 0, 0)) {
+		/* CS_STATUS_SCOREBOARD supported from CSF 1.0 */
+		struct kbase_csf_cmd_stream_group_info const *const ginfo =
+			&kbdev->csf.global_iface.groups[queue->group->csg_nr];
+		struct kbase_csf_cmd_stream_info const *const stream =
+			&ginfo->streams[queue->csi_index];
+
+		sb_status = CS_STATUS_SCOREBOARDS_NONZERO_GET(
+			kbase_csf_firmware_cs_output(stream,
+						     CS_STATUS_SCOREBOARDS));
+	}
+
+	cs_empty = (input_addr[CS_INSERT_LO / sizeof(u64)] ==
+		    output_addr[CS_EXTRACT_LO / sizeof(u64)]);
+	cs_idle = cs_empty && (!sb_status);
+
+	return cs_idle;
 }
 
 static void save_csg_slot(struct kbase_queue_group *group)
@@ -1424,48 +1636,58 @@ static void save_csg_slot(struct kbase_queue_group *group)
 
 	if (!WARN_ON((state != CSG_ACK_STATE_SUSPEND) &&
 		     (state != CSG_ACK_STATE_TERMINATE))) {
-		int i;
+		u32 max_streams = ginfo->stream_num;
+		u32 i;
+		bool sync_wait = false;
+		bool idle = kbase_csf_firmware_csg_output(ginfo, CSG_STATUS_STATE) &
+			    CSG_STATUS_STATE_IDLE_MASK;
 
 #ifdef CONFIG_MALI_BIFROST_NO_MALI
-		for (i = 0; i < MAX_SUPPORTED_STREAMS_PER_GROUP; i++)
+		for (i = 0; i < max_streams; i++)
 			update_hw_active(group->bound_queues[i], false);
 #endif
-		if (group->run_state == KBASE_CSF_GROUP_IDLE) {
-			bool sync_wait = false;
-			bool idle = true;
-
-			/* Loop through all bound CSs & save their context */
-			for (i = 0; i < MAX_SUPPORTED_STREAMS_PER_GROUP; i++) {
-				struct kbase_queue *const queue =
+		for (i = 0; idle && i < max_streams; i++) {
+			struct kbase_queue *const queue =
 					group->bound_queues[i];
 
-				if (queue && queue->enabled) {
-					if (save_slot_cs(ginfo, queue))
-						sync_wait = true;
-					else if (idle)
-						idle = confirm_cs_idle(queue);
-				}
+			if (!queue || !queue->enabled)
+				continue;
+
+			if (save_slot_cs(ginfo, queue))
+				sync_wait = true;
+			else {
+				/* Need to confirm if ringbuffer of the GPU
+				 * queue is empty or not. A race can arise
+				 * between the flush of GPU queue and suspend
+				 * of CSG. If a queue is flushed after FW has
+				 * set the IDLE bit in CSG_STATUS_STATE, then
+				 * Scheduler will incorrectly consider CSG
+				 * as idle. And there may not be any further
+				 * flush call for the GPU queue, which would
+				 * have de-idled the CSG.
+				 */
+				idle = confirm_cmd_buf_empty(queue);
 			}
+		}
 
+		if (idle) {
 			/* Take the suspended group out of the runnable_groups
 			 * list of the context and move it to the
 			 * idle_wait_groups list.
 			 */
-			if (sync_wait && idle)
+			if (sync_wait)
 				deschedule_idle_wait_group(scheduler, group);
-			else if (idle) {
+			else {
 				group->run_state =
 					KBASE_CSF_GROUP_SUSPENDED_ON_IDLE;
-				dev_dbg(kbdev->dev, "Group-%d suspended: idle\n",
+				dev_dbg(kbdev->dev, "Group-%d suspended: idle",
 					group->handle);
-			} else {
-				group->run_state = KBASE_CSF_GROUP_SUSPENDED;
-				atomic_inc(&scheduler->non_idle_suspended_grps);
 			}
 		} else {
 			group->run_state = KBASE_CSF_GROUP_SUSPENDED;
-			atomic_inc(&scheduler->non_idle_suspended_grps);
 		}
+
+		update_offslot_non_idle_cnt_on_grp_suspend(group);
 	}
 }
 
@@ -1562,10 +1784,14 @@ static void update_csg_slot_priority(struct kbase_queue_group *group, u8 prio)
 	csg_slot = &kbdev->csf.scheduler.csg_slots[slot];
 	ginfo = &kbdev->csf.global_iface.groups[slot];
 
+	/* CSGs remaining on-slot can be either idle or runnable.
+	 * This also applies in protected mode.
+	 */
 	WARN_ON(!((group->run_state == KBASE_CSF_GROUP_RUNNABLE) ||
 		(group->run_state == KBASE_CSF_GROUP_IDLE)));
 
-	group->run_state = KBASE_CSF_GROUP_RUNNABLE;
+	/* Update consumes a group from scanout */
+	update_offslot_non_idle_cnt_for_onslot_grp(group);
 
 	if (csg_slot->priority == prio)
 		return;
@@ -1578,9 +1804,9 @@ static void update_csg_slot_priority(struct kbase_queue_group *group, u8 prio)
 
 	spin_lock_irqsave(&kbdev->csf.scheduler.interrupt_lock, flags);
 	csg_req = kbase_csf_firmware_csg_output(ginfo, CSG_ACK);
-	csg_req ^= CSG_REQ_EP_CFG;
+	csg_req ^= CSG_REQ_EP_CFG_MASK;
 	kbase_csf_firmware_csg_input_mask(ginfo, CSG_REQ, csg_req,
-					  CSG_REQ_EP_CFG);
+					  CSG_REQ_EP_CFG_MASK);
 	spin_unlock_irqrestore(&kbdev->csf.scheduler.interrupt_lock, flags);
 
 	csg_slot->priority = prio;
@@ -1641,8 +1867,8 @@ static void program_csg_slot(struct kbase_queue_group *group, s8 slot,
 	mutex_unlock(&kbdev->mmu_hw_mutex);
 
 	if (kctx->as_nr == KBASEP_AS_NR_INVALID) {
-		dev_dbg(kbdev->dev, "Could not get a valid AS for group %d of context %d_%d on slot %d\n",
-			group->handle, kctx->tgid, kctx->id, slot);
+		dev_warn(kbdev->dev, "Could not get a valid AS for group %d of context %d_%d on slot %d\n",
+			 group->handle, kctx->tgid, kctx->id, slot);
 		return;
 	}
 
@@ -1659,7 +1885,7 @@ static void program_csg_slot(struct kbase_queue_group *group, s8 slot,
 		struct kbase_queue *queue = group->bound_queues[i];
 
 		if (queue)
-			program_cs(kbdev, queue);
+			program_cs(kbdev, queue, false);
 	}
 
 
@@ -1675,6 +1901,7 @@ static void program_csg_slot(struct kbase_queue_group *group, s8 slot,
 	kbase_csf_firmware_csg_input(ginfo, CSG_ALLOW_OTHER,
 				     tiler_mask & U32_MAX);
 
+
 	ep_cfg = CSG_EP_REQ_COMPUTE_EP_SET(ep_cfg, compute_max);
 	ep_cfg = CSG_EP_REQ_FRAGMENT_EP_SET(ep_cfg, fragment_max);
 	ep_cfg = CSG_EP_REQ_TILER_EP_SET(ep_cfg, tiler_max);
@@ -1704,16 +1931,13 @@ static void program_csg_slot(struct kbase_queue_group *group, s8 slot,
 
 	spin_lock_irqsave(&kbdev->csf.scheduler.interrupt_lock, flags);
 	csg_req = kbase_csf_firmware_csg_output(ginfo, CSG_ACK);
-	csg_req ^= CSG_REQ_EP_CFG;
+	csg_req ^= CSG_REQ_EP_CFG_MASK;
 	kbase_csf_firmware_csg_input_mask(ginfo, CSG_REQ, csg_req,
-					  CSG_REQ_EP_CFG);
+					  CSG_REQ_EP_CFG_MASK);
 
 	/* Set state to START/RESUME */
 	if (queue_group_suspended_locked(group)) {
 		state = CSG_REQ_STATE_RESUME;
-		if (group->run_state == KBASE_CSF_GROUP_SUSPENDED)
-			atomic_dec(
-				&kbdev->csf.scheduler.non_idle_suspended_grps);
 	} else {
 		WARN_ON(group->run_state != KBASE_CSF_GROUP_RUNNABLE);
 		state = CSG_REQ_STATE_START;
@@ -1741,6 +1965,9 @@ static void program_csg_slot(struct kbase_queue_group *group, s8 slot,
 				(state & (CSG_REQ_STATE_MASK >> CS_REQ_STATE_SHIFT)));
 
 	kbase_csf_ring_csg_doorbell(kbdev, slot);
+
+	/* Programming a slot consumes a group from scanout */
+	update_offslot_non_idle_cnt_for_onslot_grp(group);
 }
 
 static void remove_scheduled_group(struct kbase_device *kbdev,
@@ -1760,7 +1987,8 @@ static void remove_scheduled_group(struct kbase_device *kbdev,
 	group->kctx->csf.sched.ngrp_to_schedule--;
 }
 
-static void sched_evict_group(struct kbase_queue_group *group, bool fault)
+static void sched_evict_group(struct kbase_queue_group *group, bool fault,
+			      bool update_non_idle_offslot_grps_cnt)
 {
 	struct kbase_context *kctx = group->kctx;
 	struct kbase_device *kbdev = kctx->kbdev;
@@ -1771,8 +1999,10 @@ static void sched_evict_group(struct kbase_queue_group *group, bool fault)
 	if (queue_group_scheduled_locked(group)) {
 		u32 i;
 
-		if (group->run_state == KBASE_CSF_GROUP_SUSPENDED)
-			atomic_dec(&scheduler->non_idle_suspended_grps);
+		if (update_non_idle_offslot_grps_cnt &&
+		    (group->run_state == KBASE_CSF_GROUP_SUSPENDED ||
+		     group->run_state == KBASE_CSF_GROUP_RUNNABLE))
+			atomic_dec(&scheduler->non_idle_offslot_grps);
 
 		for (i = 0; i < MAX_SUPPORTED_STREAMS_PER_GROUP; i++) {
 			if (group->bound_queues[i])
@@ -1808,8 +2038,7 @@ static void sched_evict_group(struct kbase_queue_group *group, bool fault)
 static int term_group_sync(struct kbase_queue_group *group)
 {
 	struct kbase_device *kbdev = group->kctx->kbdev;
-	long remaining =
-		kbase_csf_timeout_in_jiffies(CSF_STATE_WAIT_TIMEOUT_MS);
+	long remaining = kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms);
 	int err = 0;
 
 	term_csg_slot(group);
@@ -1820,7 +2049,7 @@ static int term_group_sync(struct kbase_queue_group *group)
 	if (!remaining) {
 		dev_warn(kbdev->dev, "term request timed out for group %d on slot %d",
 			 group->handle, group->csg_nr);
-		if (kbase_prepare_to_reset_gpu(kbdev))
+		if (kbase_prepare_to_reset_gpu(kbdev, RESET_FLAGS_NONE))
 			kbase_reset_gpu(kbdev);
 		err = -ETIMEDOUT;
 	}
@@ -1836,25 +2065,24 @@ void kbase_csf_scheduler_group_deschedule(struct kbase_queue_group *group)
 		kbase_csf_timeout_in_jiffies(CSG_SCHED_STOP_TIMEOUT_MS);
 	bool force = false;
 
+	kbase_reset_gpu_assert_failed_or_prevented(kbdev);
 	lockdep_assert_held(&group->kctx->csf.lock);
 	mutex_lock(&scheduler->lock);
 
 	KBASE_KTRACE_ADD_CSF_GRP(kbdev, GROUP_DESCHEDULE, group, group->run_state);
 	while (queue_group_scheduled_locked(group)) {
 		u32 saved_state = scheduler->state;
-		bool reset = kbase_reset_gpu_is_active(kbdev);
 
 		if (!kbasep_csf_scheduler_group_is_on_slot_locked(group)) {
-			sched_evict_group(group, false);
-		} else if (reset || saved_state == SCHED_INACTIVE || force) {
+			sched_evict_group(group, false, true);
+		} else if (saved_state == SCHED_INACTIVE || force) {
 			bool as_faulty;
 
-			if (!reset)
-				term_group_sync(group);
+			term_group_sync(group);
 			/* Treat the csg been terminated */
 			as_faulty = cleanup_csg_slot(group);
 			/* remove from the scheduler list */
-			sched_evict_group(group, as_faulty);
+			sched_evict_group(group, as_faulty, false);
 		}
 
 		/* waiting scheduler state to change */
@@ -1890,9 +2118,10 @@ static int scheduler_group_schedule(struct kbase_queue_group *group)
 {
 	struct kbase_context *kctx = group->kctx;
 	struct kbase_device *kbdev = kctx->kbdev;
+	struct kbase_csf_scheduler *scheduler = &kbdev->csf.scheduler;
 
 	lockdep_assert_held(&kctx->csf.lock);
-	lockdep_assert_held(&kbdev->csf.scheduler.lock);
+	lockdep_assert_held(&scheduler->lock);
 
 	KBASE_KTRACE_ADD_CSF_GRP(kbdev, GROUP_SCHEDULE, group, group->run_state);
 	if (group->run_state == KBASE_CSF_GROUP_SUSPENDED_ON_WAIT_SYNC)
@@ -1903,11 +2132,44 @@ static int scheduler_group_schedule(struct kbase_queue_group *group)
 
 		if (group->run_state == KBASE_CSF_GROUP_SUSPENDED_ON_IDLE)
 			update_idle_suspended_group_state(group);
-		else
+		else {
+			struct kbase_queue_group *protm_grp;
+			unsigned long flags;
+
+			WARN_ON(!kbasep_csf_scheduler_group_is_on_slot_locked(
+				group));
+
 			group->run_state = KBASE_CSF_GROUP_RUNNABLE;
+
+			/* A normal mode CSG could be idle onslot during
+			 * protected mode. In this case clear the
+			 * appropriate bit in csg_slots_idle_mask.
+			 */
+			spin_lock_irqsave(&scheduler->interrupt_lock, flags);
+			protm_grp = scheduler->active_protm_grp;
+			if (protm_grp && protm_grp != group)
+				clear_bit((unsigned int)group->csg_nr,
+					  scheduler->csg_slots_idle_mask);
+			spin_unlock_irqrestore(&scheduler->interrupt_lock,
+					       flags);
+
+			/* If GPU is in protected mode then any doorbells rang
+			 * would have no effect. Check if GPU is in protected
+			 * mode and if this group has higher priority than the
+			 * active protected mode group. If so prompt the FW
+			 * to exit protected mode.
+			 */
+			if (protm_grp &&
+			    group->scan_seq_num < protm_grp->scan_seq_num) {
+				/* Prompt the FW to exit protected mode */
+				scheduler_force_protm_exit(kbdev);
+			}
+		}
 	} else if (!queue_group_scheduled_locked(group)) {
 		insert_group_to_runnable(&kbdev->csf.scheduler, group,
 			KBASE_CSF_GROUP_RUNNABLE);
+		/* A new group into the scheduler */
+		atomic_inc(&kbdev->csf.scheduler.non_idle_offslot_grps);
 	}
 
 	/* Since a group has become active now, check if GPU needs to be
@@ -1919,21 +2181,22 @@ static int scheduler_group_schedule(struct kbase_queue_group *group)
 }
 
 /**
- * set_max_csg_slots() - Set the number of available command stream group slots
+ * set_max_csg_slots() - Set the number of available CSG slots
  *
  * @kbdev: Pointer of the GPU device.
  *
- * This function would set/limit the number of command stream group slots that
- * can be used in the given tick/tock. It would be less than the total command
- * stream group slots supported by firmware if the number of GPU address space
- * slots required to utilize all the CSG slots is more than the available
+ * This function would set/limit the number of CSG slots that
+ * can be used in the given tick/tock. It would be less than the total CSG
+ * slots supported by firmware if the number of GPU address space slots
+ * required to utilize all the CSG slots is more than the available
  * address space slots.
  */
 static inline void set_max_csg_slots(struct kbase_device *kbdev)
 {
 	struct kbase_csf_scheduler *scheduler = &kbdev->csf.scheduler;
 	unsigned int total_csg_slots = kbdev->csf.global_iface.group_num;
-	unsigned int max_address_space_slots = kbdev->nr_hw_address_spaces - 1;
+	unsigned int max_address_space_slots =
+			kbdev->nr_hw_address_spaces - NUM_RESERVED_AS_SLOTS;
 
 	WARN_ON(scheduler->num_active_address_spaces > total_csg_slots);
 
@@ -1949,7 +2212,7 @@ static inline void set_max_csg_slots(struct kbase_device *kbdev)
  * @kctx: Pointer of the Kbase context.
  *
  * This function would update the counter that is tracking the number of GPU
- * address space slots that would be required to program the command stream
+ * address space slots that would be required to program the CS
  * group slots from the groups at the head of groups_to_schedule list.
  */
 static inline void count_active_address_space(struct kbase_device *kbdev,
@@ -1957,7 +2220,8 @@ static inline void count_active_address_space(struct kbase_device *kbdev,
 {
 	struct kbase_csf_scheduler *scheduler = &kbdev->csf.scheduler;
 	unsigned int total_csg_slots = kbdev->csf.global_iface.group_num;
-	unsigned int max_address_space_slots = kbdev->nr_hw_address_spaces - 1;
+	unsigned int max_address_space_slots =
+			kbdev->nr_hw_address_spaces - NUM_RESERVED_AS_SLOTS;
 
 	if (scheduler->ngrp_to_schedule <= total_csg_slots) {
 		if (kctx->csf.sched.ngrp_to_schedule == 1) {
@@ -1970,6 +2234,67 @@ static inline void count_active_address_space(struct kbase_device *kbdev,
 	}
 }
 
+/* Two schemes are used in assigning the priority to CSG slots for a given
+ * CSG from the 'groups_to_schedule' list.
+ * This is needed as an idle on-slot group is deprioritized by moving it to
+ * the tail of 'groups_to_schedule' list. As a result it can either get
+ * evicted from the CSG slot in current tick/tock dealing, or its position
+ * can be after the lower priority non-idle groups in the 'groups_to_schedule'
+ * list. The latter case can result in the on-slot subset containing both
+ * non-idle and idle CSGs, and is handled through the 2nd scheme described
+ * below.
+ *
+ * First scheme :- If all the slots are going to be occupied by the non-idle or
+ * idle groups, then a simple assignment of the priority is done as per the
+ * position of a group in the 'groups_to_schedule' list. So maximum priority
+ * gets assigned to the slot of a group which is at the head of the list.
+ * Here the 'groups_to_schedule' list would effectively be ordered as per the
+ * static priority of groups.
+ *
+ * Second scheme :- If the slots are going to be occupied by a mix of idle and
+ * non-idle groups then the priority assignment needs to ensure that the
+ * priority of a slot belonging to a higher priority idle group will always be
+ * greater than the priority of a slot belonging to a lower priority non-idle
+ * group, reflecting the original position of a group in the scan order (i.e
+ * static priority) 'scan_seq_num', which is set during the prepare phase of a
+ * tick/tock before the group is moved to 'idle_groups_to_schedule' list if it
+ * is idle.
+ * The priority range [MAX_CSG_SLOT_PRIORITY, 0] is partitioned with the first
+ * 'slots_for_tick' groups in the original scan order are assigned a priority in
+ * the subrange [MAX_CSG_SLOT_PRIORITY, MAX_CSG_SLOT_PRIORITY - slots_for_tick),
+ * whereas rest of the groups are assigned the priority in the subrange
+ * [MAX_CSG_SLOT_PRIORITY - slots_for_tick, 0]. This way even if an idle higher
+ * priority group ends up after the non-idle lower priority groups in the
+ * 'groups_to_schedule' list, it will get a higher slot priority. And this will
+ * enable the FW to quickly start the execution of higher priority group when it
+ * gets de-idled.
+ */
+static u8 get_slot_priority(struct kbase_queue_group *group)
+{
+	struct kbase_csf_scheduler *scheduler =
+		&group->kctx->kbdev->csf.scheduler;
+	u8 slot_prio;
+	u32 slots_for_tick = scheduler->num_csg_slots_for_tick;
+	u32 used_slots = slots_for_tick - scheduler->remaining_tick_slots;
+	/* Check if all the slots are going to be occupied by the non-idle or
+	 * idle groups.
+	 */
+	if (scheduler->non_idle_scanout_grps >= slots_for_tick ||
+	    !scheduler->non_idle_scanout_grps) {
+		slot_prio = (u8)(MAX_CSG_SLOT_PRIORITY - used_slots);
+	} else {
+		/* There will be a mix of idle and non-idle groups. */
+		if (group->scan_seq_num < slots_for_tick)
+			slot_prio = (u8)(MAX_CSG_SLOT_PRIORITY -
+					 group->scan_seq_num);
+		else if (MAX_CSG_SLOT_PRIORITY > (slots_for_tick + used_slots))
+			slot_prio = (u8)(MAX_CSG_SLOT_PRIORITY - (slots_for_tick + used_slots));
+		else
+			slot_prio = 0;
+	}
+	return slot_prio;
+}
+
 /**
  * update_resident_groups_priority() - Update the priority of resident groups
  *
@@ -1979,7 +2304,7 @@ static inline void count_active_address_space(struct kbase_device *kbdev,
  * that are at the head of groups_to_schedule list, preceding the first
  * non-resident group.
  *
- * This function will also adjust kbase_csf_scheduler.head_slot_priority on
+ * This function will also adjust kbase_csf_scheduler.remaining_tick_slots on
  * the priority update.
  */
 static void update_resident_groups_priority(struct kbase_device *kbdev)
@@ -2000,11 +2325,11 @@ static void update_resident_groups_priority(struct kbase_device *kbdev)
 			break;
 
 		update_csg_slot_priority(group,
-					 scheduler->head_slot_priority);
+					 get_slot_priority(group));
 
 		/* Drop the head group from the list */
 		remove_scheduled_group(kbdev, group);
-		scheduler->head_slot_priority--;
+		scheduler->remaining_tick_slots--;
 	}
 }
 
@@ -2012,14 +2337,14 @@ static void update_resident_groups_priority(struct kbase_device *kbdev)
  * program_group_on_vacant_csg_slot() - Program a non-resident group on the
  *                                      given vacant CSG slot.
  * @kbdev:    Pointer to the GPU device.
- * @slot:     Vacant command stream group slot number.
+ * @slot:     Vacant CSG slot number.
  *
  * This function will program a non-resident group at the head of
- * kbase_csf_scheduler.groups_to_schedule list on the given vacant command
- * stream group slot, provided the initial position of the non-resident
+ * kbase_csf_scheduler.groups_to_schedule list on the given vacant
+ * CSG slot, provided the initial position of the non-resident
  * group in the list is less than the number of CSG slots and there is
  * an available GPU address space slot.
- * kbase_csf_scheduler.head_slot_priority would also be adjusted after
+ * kbase_csf_scheduler.remaining_tick_slots would also be adjusted after
  * programming the slot.
  */
 static void program_group_on_vacant_csg_slot(struct kbase_device *kbdev,
@@ -2039,17 +2364,19 @@ static void program_group_on_vacant_csg_slot(struct kbase_device *kbdev,
 
 		if (!WARN_ON(ret)) {
 			if (kctx_as_enabled(group->kctx) && !group->faulted) {
-				program_csg_slot(group,
-					 slot,
-					 scheduler->head_slot_priority);
+				program_csg_slot(group, slot,
+					get_slot_priority(group));
 
 				if (likely(csg_slot_in_use(kbdev, slot))) {
 					/* Drop the head group from the list */
 					remove_scheduled_group(kbdev, group);
-					scheduler->head_slot_priority--;
+					scheduler->remaining_tick_slots--;
 				}
-			} else
+			} else {
+				update_offslot_non_idle_cnt_for_faulty_grp(
+					group);
 				remove_scheduled_group(kbdev, group);
+			}
 		}
 	}
 }
@@ -2059,15 +2386,15 @@ static void program_group_on_vacant_csg_slot(struct kbase_device *kbdev,
  *                             group and update the priority of resident groups.
  *
  * @kbdev:    Pointer to the GPU device.
- * @slot:     Vacant command stream group slot number.
+ * @slot:     Vacant CSG slot number.
  *
  * This function will first update the priority of all resident queue groups
  * that are at the head of groups_to_schedule list, preceding the first
- * non-resident group, it will then try to program the given command stream
+ * non-resident group, it will then try to program the given CS
  * group slot with the non-resident group. Finally update the priority of all
  * resident queue groups following the non-resident group.
  *
- * kbase_csf_scheduler.head_slot_priority would also be adjusted.
+ * kbase_csf_scheduler.remaining_tick_slots would also be adjusted.
  */
 static void program_vacant_csg_slot(struct kbase_device *kbdev, s8 slot)
 {
@@ -2121,12 +2448,12 @@ static bool slots_state_changed(struct kbase_device *kbdev,
  * @kbdev:    Pointer to the GPU device.
  *
  * This function will first wait for the ongoing suspension to complete on a
- * command stream group slot and will then program the vacant slot with the
+ * CSG slot and will then program the vacant slot with the
  * non-resident queue group inside the groups_to_schedule list.
  * The programming of the non-resident queue group on the vacant slot could
  * fail due to unavailability of free GPU address space slot and so the
  * programming is re-attempted after the ongoing suspension has completed
- * for all the command stream group slots.
+ * for all the CSG slots.
  * The priority of resident groups before and after the non-resident group
  * in the groups_to_schedule list would also be updated.
  * This would be repeated for all the slots undergoing suspension.
@@ -2139,11 +2466,13 @@ static void program_suspending_csg_slots(struct kbase_device *kbdev)
 	DECLARE_BITMAP(slot_mask, MAX_SUPPORTED_CSGS);
 	DECLARE_BITMAP(evicted_mask, MAX_SUPPORTED_CSGS) = {0};
 	bool suspend_wait_failed = false;
-	long remaining =
-		kbase_csf_timeout_in_jiffies(CSF_STATE_WAIT_TIMEOUT_MS);
+	long remaining = kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms);
 
 	lockdep_assert_held(&kbdev->csf.scheduler.lock);
 
+	/* In the current implementation, csgs_events_enable_mask would be used
+	 * only to indicate suspending CSGs.
+	 */
 	bitmap_complement(slot_mask, scheduler->csgs_events_enable_mask,
 		MAX_SUPPORTED_CSGS);
 
@@ -2180,7 +2509,7 @@ static void program_suspending_csg_slots(struct kbase_device *kbdev)
 					as_fault = cleanup_csg_slot(group);
 					/* If AS fault detected, evict it */
 					if (as_fault) {
-						sched_evict_group(group, true);
+						sched_evict_group(group, true, true);
 						set_bit(i, evicted_mask);
 					}
 				}
@@ -2188,13 +2517,51 @@ static void program_suspending_csg_slots(struct kbase_device *kbdev)
 				program_vacant_csg_slot(kbdev, (s8)i);
 			}
 		} else {
-			dev_warn(kbdev->dev, "Timed out waiting for CSG slots to suspend, slot_mask: 0x%*pb\n",
-				 num_groups, slot_mask);
+			u32 i;
+
+			/* Groups that have failed to suspend in time shall
+			 * raise a fatal error as they could no longer be
+			 * safely resumed.
+			 */
+			for_each_set_bit(i, slot_mask, num_groups) {
+				struct kbase_queue_group *const group =
+					scheduler->csg_slots[i].resident_group;
+
+				struct base_gpu_queue_group_error const
+					err_payload = { .error_type =
+								BASE_GPU_QUEUE_GROUP_ERROR_FATAL,
+							.payload = {
+								.fatal_group = {
+									.status =
+										GPU_EXCEPTION_TYPE_SW_FAULT_2,
+								} } };
+
+				if (unlikely(group == NULL))
+					continue;
+
+				kbase_csf_add_group_fatal_error(group,
+								&err_payload);
+				kbase_event_wakeup(group->kctx);
+
+				/* TODO GPUCORE-25328: The CSG can't be
+				 * terminated, the GPU will be reset as a
+				 * work-around.
+				 */
+				dev_warn(
+					kbdev->dev,
+					"Group %pK on slot %u failed to suspend\n",
+					(void *)group, i);
+
+				/* The group has failed suspension, stop
+				 * further examination.
+				 */
+				clear_bit(i, slot_mask);
+				set_bit(i, scheduler->csgs_events_enable_mask);
+				update_offslot_non_idle_cnt_for_onslot_grp(
+					group);
+			}
 
-			if (kbase_prepare_to_reset_gpu(kbdev))
-				kbase_reset_gpu(kbdev);
 			suspend_wait_failed = true;
-			break;
 		}
 	}
 
@@ -2202,20 +2569,24 @@ static void program_suspending_csg_slots(struct kbase_device *kbdev)
 		dev_info(kbdev->dev, "Scheduler evicting slots: 0x%*pb\n",
 			 num_groups, evicted_mask);
 
-	if (unlikely(!suspend_wait_failed)) {
+	if (likely(!suspend_wait_failed)) {
 		u32 i;
 
 		while (scheduler->ngrp_to_schedule &&
-			(scheduler->head_slot_priority > (MAX_CSG_SLOT_PRIORITY
-				- scheduler->num_csg_slots_for_tick))) {
+		       scheduler->remaining_tick_slots) {
 			i = find_first_zero_bit(scheduler->csg_inuse_bitmap,
 					num_groups);
 			if (WARN_ON(i == num_groups))
 				break;
 			program_vacant_csg_slot(kbdev, (s8)i);
-			if (WARN_ON(!csg_slot_in_use(kbdev, (int)i)))
+			if (!csg_slot_in_use(kbdev, (int)i)) {
+				dev_warn(kbdev->dev, "Couldn't use CSG slot %d despite being vacant", i);
 				break;
+			}
 		}
+	} else {
+		if (kbase_prepare_to_reset_gpu(kbdev, RESET_FLAGS_NONE))
+			kbase_reset_gpu(kbdev);
 	}
 }
 
@@ -2226,6 +2597,11 @@ static void suspend_queue_group(struct kbase_queue_group *group)
 		&group->kctx->kbdev->csf.scheduler;
 
 	spin_lock_irqsave(&scheduler->interrupt_lock, flags);
+	/* This shall be used in program_suspending_csg_slots() where we
+	 * assume that whilst CSGs are being suspended, this bitmask is not
+	 * used by anything else i.e., it indicates only the CSGs going
+	 * through suspension.
+	 */
 	clear_bit(group->csg_nr, scheduler->csgs_events_enable_mask);
 	spin_unlock_irqrestore(&scheduler->interrupt_lock, flags);
 
@@ -2240,8 +2616,7 @@ static void wait_csg_slots_start(struct kbase_device *kbdev)
 {
 	u32 num_groups = kbdev->csf.global_iface.group_num;
 	struct kbase_csf_scheduler *scheduler = &kbdev->csf.scheduler;
-	long remaining =
-		kbase_csf_timeout_in_jiffies(CSF_STATE_WAIT_TIMEOUT_MS);
+	long remaining = kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms);
 	DECLARE_BITMAP(slot_mask, MAX_SUPPORTED_CSGS) = {0};
 	u32 i;
 
@@ -2276,7 +2651,7 @@ static void wait_csg_slots_start(struct kbase_device *kbdev)
 			dev_warn(kbdev->dev, "Timed out waiting for CSG slots to start, slots: 0x%*pb\n",
 				 num_groups, slot_mask);
 
-			if (kbase_prepare_to_reset_gpu(kbdev))
+			if (kbase_prepare_to_reset_gpu(kbdev, RESET_FLAGS_NONE))
 				kbase_reset_gpu(kbdev);
 			break;
 		}
@@ -2284,48 +2659,32 @@ static void wait_csg_slots_start(struct kbase_device *kbdev)
 }
 
 /**
- * group_on_slot_is_idle() - Check if the queue group resident on a command
- *                           stream group slot is idle.
+ * group_on_slot_is_idle() - Check if the given slot has a CSG-idle state
+ *                           flagged after the completion of a CSG status
+ *                           update command
  *
  * This function is called at the start of scheduling tick to check the
- * idle status of a queue group resident on a command sream group slot.
- * The group's idleness is determined by looping over all the bound command
- * queues and checking their respective CS_STATUS_WAIT register as well as
- * the insert and extract offsets.
-
- * This function would be simplified in future after the changes under
- * consideration with MIDHARC-3065 are introduced.
+ * idle status of a queue group resident on a CSG slot.
+ * The caller must make sure the corresponding status update command has
+ * been called and completed before checking this status.
  *
  * @kbdev:  Pointer to the GPU device.
- * @group:  Pointer to the resident group on the given slot.
- * @slot:   The slot that the given group is resident on.
+ * @slot:   The given slot for checking an occupying resident group's idle
+ *          state.
  *
  * Return: true if the group resident on slot is idle, otherwise false.
  */
 static bool group_on_slot_is_idle(struct kbase_device *kbdev,
-			struct kbase_queue_group *group, unsigned long slot)
+				  unsigned long slot)
 {
 	struct kbase_csf_cmd_stream_group_info *ginfo =
 					&kbdev->csf.global_iface.groups[slot];
-	u32 i;
+	bool idle = kbase_csf_firmware_csg_output(ginfo, CSG_STATUS_STATE) &
+			CSG_STATUS_STATE_IDLE_MASK;
 
 	lockdep_assert_held(&kbdev->csf.scheduler.lock);
-	for (i = 0; i < MAX_SUPPORTED_STREAMS_PER_GROUP; i++) {
-		struct kbase_queue *queue = group->bound_queues[i];
-
-		if (queue && queue->enabled) {
-			struct kbase_csf_cmd_stream_info *stream =
-					&ginfo->streams[queue->csi_index];
-			u32 status = kbase_csf_firmware_cs_output(stream,
-							CS_STATUS_WAIT);
-
-			if (!CS_STATUS_WAIT_SYNC_WAIT_GET(status) &&
-			    !confirm_cs_idle(group->bound_queues[i]))
-				return false;
-		}
-	}
 
-	return true;
+	return idle;
 }
 
 /**
@@ -2421,8 +2780,7 @@ static void wait_csg_slots_finish_prio_update(struct kbase_device *kbdev)
 {
 	unsigned long *slot_mask =
 			kbdev->csf.scheduler.csg_slots_prio_update;
-	long wait_time =
-		kbase_csf_timeout_in_jiffies(CSF_STATE_WAIT_TIMEOUT_MS);
+	long wait_time = kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms);
 	int ret = wait_csg_slots_handshake_ack(kbdev, CSG_REQ_EP_CFG_MASK,
 					       slot_mask, wait_time);
 
@@ -2433,8 +2791,10 @@ static void wait_csg_slots_finish_prio_update(struct kbase_device *kbdev)
 		 * issue, no major consequences are expected as a
 		 * result, so just warn the case.
 		 */
-		dev_warn(kbdev->dev, "Timeout, skipping the update wait: slot mask=0x%lx",
-			 slot_mask[0]);
+		dev_warn(
+			kbdev->dev,
+			"Timeout on CSG_REQ:EP_CFG, skipping the update wait: slot mask=0x%lx",
+			slot_mask[0]);
 	}
 }
 
@@ -2446,18 +2806,27 @@ void kbase_csf_scheduler_evict_ctx_slots(struct kbase_device *kbdev,
 	u32 num_groups = kbdev->csf.global_iface.group_num;
 	u32 slot;
 	DECLARE_BITMAP(slot_mask, MAX_SUPPORTED_CSGS) = {0};
-	DECLARE_BITMAP(terminated_slot_mask, MAX_SUPPORTED_CSGS);
-	long remaining =
-		kbase_csf_timeout_in_jiffies(DEFAULT_RESET_TIMEOUT_MS);
 
 	lockdep_assert_held(&kctx->csf.lock);
 	mutex_lock(&scheduler->lock);
 
+	/* This code is only called during reset, so we don't wait for the CSG
+	 * slots to be stopped
+	 */
+	WARN_ON(!kbase_reset_gpu_is_active(kbdev));
+
 	KBASE_KTRACE_ADD(kbdev, EVICT_CTX_SLOTS, kctx, 0u);
 	for (slot = 0; slot < num_groups; slot++) {
 		group = kbdev->csf.scheduler.csg_slots[slot].resident_group;
 		if (group && group->kctx == kctx) {
+			bool as_fault;
+
 			term_csg_slot(group);
+			as_fault = cleanup_csg_slot(group);
+			/* remove the group from the scheduler list */
+			sched_evict_group(group, as_fault, false);
+			/* return the evicted group to the caller */
+			list_add_tail(&group->link, evicted_groups);
 			set_bit(slot, slot_mask);
 		}
 	}
@@ -2465,48 +2834,6 @@ void kbase_csf_scheduler_evict_ctx_slots(struct kbase_device *kbdev,
 	dev_info(kbdev->dev, "Evicting context %d_%d slots: 0x%*pb\n",
 			kctx->tgid, kctx->id, num_groups, slot_mask);
 
-	bitmap_copy(terminated_slot_mask, slot_mask, MAX_SUPPORTED_CSGS);
-	/* Only check for GPU reset once - this thread has the scheduler lock,
-	 * so even if the return value of kbase_reset_gpu_is_active changes,
-	 * no reset work would be done anyway until the scheduler lock was
-	 * released.
-	 */
-	if (!kbase_reset_gpu_is_active(kbdev)) {
-		while (remaining
-			&& !bitmap_empty(slot_mask, MAX_SUPPORTED_CSGS)) {
-			DECLARE_BITMAP(changed, MAX_SUPPORTED_CSGS);
-
-			bitmap_copy(changed, slot_mask, MAX_SUPPORTED_CSGS);
-
-			remaining = wait_event_timeout(kbdev->csf.event_wait,
-				slots_state_changed(kbdev, changed,
-					csg_slot_stopped_raw),
-				remaining);
-
-			if (remaining)
-				bitmap_andnot(slot_mask, slot_mask, changed,
-					MAX_SUPPORTED_CSGS);
-		}
-	}
-
-	for_each_set_bit(slot, terminated_slot_mask, num_groups) {
-		bool as_fault;
-
-		group = scheduler->csg_slots[slot].resident_group;
-		as_fault = cleanup_csg_slot(group);
-		/* remove the group from the scheduler list */
-		sched_evict_group(group, as_fault);
-		/* return the evicted group to the caller */
-		list_add_tail(&group->link, evicted_groups);
-	}
-
-	if (!remaining) {
-		dev_warn(kbdev->dev, "Timeout on evicting ctx slots: 0x%*pb\n",
-				num_groups, slot_mask);
-		if (kbase_prepare_to_reset_gpu(kbdev))
-			kbase_reset_gpu(kbdev);
-	}
-
 	mutex_unlock(&scheduler->lock);
 }
 
@@ -2606,17 +2933,17 @@ static void scheduler_group_check_protm_enter(struct kbase_device *const kbdev,
 
 	spin_lock_irqsave(&scheduler->interrupt_lock, flags);
 
-	/* Firmware samples the PROTM_PEND ACK bit for command streams when
+	/* Firmware samples the PROTM_PEND ACK bit for CSs when
 	 * Host sends PROTM_ENTER global request. So if PROTM_PEND ACK bit
-	 * is set for a command stream after Host has sent the PROTM_ENTER
+	 * is set for a CS after Host has sent the PROTM_ENTER
 	 * Global request, then there is no guarantee that firmware will
 	 * notice that prior to switching to protected mode. And firmware
-	 * may not again raise the PROTM_PEND interrupt for that command
-	 * stream later on. To avoid that uncertainty PROTM_PEND ACK bit
-	 * is not set for a command stream if the request to enter protected
+	 * may not again raise the PROTM_PEND interrupt for that CS
+	 * later on. To avoid that uncertainty PROTM_PEND ACK bit
+	 * is not set for a CS if the request to enter protected
 	 * mode has already been sent. It will be set later (after the exit
 	 * from protected mode has taken place) when the group to which
-	 * command stream is bound becomes the top group.
+	 * CS is bound becomes the top group.
 	 *
 	 * The actual decision of entering protected mode is hinging on the
 	 * input group is the top priority group, or, in case the previous
@@ -2647,9 +2974,13 @@ static void scheduler_group_check_protm_enter(struct kbase_device *const kbdev,
 					 * GPUCORE-21394.
 					 */
 
+					/* Disable the idle timer */
+					disable_gpu_idle_fw_timer_locked(kbdev);
+
 					/* Switch to protected mode */
 					scheduler->active_protm_grp = input_grp;
 					KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_ENTER_PROTM, input_grp, 0u);
+
 					spin_unlock_irqrestore(&scheduler->interrupt_lock, flags);
 					kbase_csf_enter_protected_mode(kbdev);
 					return;
@@ -2688,6 +3019,9 @@ static void scheduler_apply(struct kbase_device *kbdev)
 		}
 	}
 
+	/* Initialize the remaining avialable csg slots for the tick/tock */
+	scheduler->remaining_tick_slots = available_csg_slots;
+
 	/* If there are spare slots, apply heads in the list */
 	spare = (available_csg_slots > resident_cnt) ?
 		(available_csg_slots - resident_cnt) : 0;
@@ -2700,7 +3034,7 @@ static void scheduler_apply(struct kbase_device *kbdev)
 		    group->prepared_seq_num < available_csg_slots) {
 			/* One of the resident remainders */
 			update_csg_slot_priority(group,
-						scheduler->head_slot_priority);
+					get_slot_priority(group));
 		} else if (spare != 0) {
 			s8 slot = (s8)find_first_zero_bit(
 				     kbdev->csf.scheduler.csg_inuse_bitmap,
@@ -2711,11 +3045,13 @@ static void scheduler_apply(struct kbase_device *kbdev)
 
 			if (!kctx_as_enabled(group->kctx) || group->faulted) {
 				/* Drop the head group and continue */
+				update_offslot_non_idle_cnt_for_faulty_grp(
+					group);
 				remove_scheduled_group(kbdev, group);
 				continue;
 			}
 			program_csg_slot(group, slot,
-					 scheduler->head_slot_priority);
+					 get_slot_priority(group));
 			if (unlikely(!csg_slot_in_use(kbdev, slot)))
 				break;
 
@@ -2725,8 +3061,8 @@ static void scheduler_apply(struct kbase_device *kbdev)
 
 		/* Drop the head csg from the list */
 		remove_scheduled_group(kbdev, group);
-		if (scheduler->head_slot_priority)
-			scheduler->head_slot_priority--;
+		if (!WARN_ON(!scheduler->remaining_tick_slots))
+			scheduler->remaining_tick_slots--;
 	}
 
 	/* Dealing with groups currently going through suspend */
@@ -2741,7 +3077,7 @@ static void scheduler_ctx_scan_groups(struct kbase_device *kbdev,
 
 	lockdep_assert_held(&scheduler->lock);
 	if (WARN_ON(priority < 0) ||
-	    WARN_ON(priority >= BASE_QUEUE_GROUP_PRIORITY_COUNT))
+	    WARN_ON(priority >= KBASE_QUEUE_GROUP_PRIORITY_COUNT))
 		return;
 
 	if (!kctx_as_enabled(kctx))
@@ -2756,6 +3092,9 @@ static void scheduler_ctx_scan_groups(struct kbase_device *kbdev,
 		if (unlikely(group->faulted))
 			continue;
 
+		/* Set the scanout sequence number, starting from 0 */
+		group->scan_seq_num = scheduler->csg_scan_count_for_tick++;
+
 		if (queue_group_idle_locked(group)) {
 			list_add_tail(&group->link_to_schedule,
 				      &scheduler->idle_groups_to_schedule);
@@ -2872,20 +3211,20 @@ static void scheduler_rotate_ctxs(struct kbase_device *kbdev)
 }
 
 /**
- * scheduler_update_idle_slots_status() - Get the status update for the command
- *                       stream group slots for which the IDLE notification was
- *                       received previously.
+ * scheduler_update_idle_slots_status() - Get the status update for the CSG
+ *                       slots for which the IDLE notification was received
+ *                        previously.
  *
- * This function sends a CSG status update request for all the command stream
- * group slots present in the bitmap scheduler->csg_slots_idle_mask and wait
- * for the request to complete.
+ * This function sends a CSG status update request for all the CSG slots
+ * present in the bitmap scheduler->csg_slots_idle_mask and wait for the
+ * request to complete.
  * The bits set in the scheduler->csg_slots_idle_mask bitmap are cleared by
  * this function.
  *
  * @kbdev:             Pointer to the GPU device.
- * @csg_bitmap:        Bitmap of the command stream group slots for which
+ * @csg_bitmap:        Bitmap of the CSG slots for which
  *                     the status update request completed successfully.
- * @failed_csg_bitmap: Bitmap of the command stream group slots for which
+ * @failed_csg_bitmap: Bitmap of the CSG slots for which
  *                     the status update request timedout.
  */
 static void scheduler_update_idle_slots_status(struct kbase_device *kbdev,
@@ -2924,38 +3263,40 @@ static void scheduler_update_idle_slots_status(struct kbase_device *kbdev,
 	/* The groups are aggregated into a single kernel doorbell request */
 	if (!bitmap_empty(csg_bitmap, num_groups)) {
 		long wt =
-		       kbase_csf_timeout_in_jiffies(CSF_STATE_WAIT_TIMEOUT_MS);
+			kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms);
 		u32 db_slots = (u32)csg_bitmap[0];
 
 		kbase_csf_ring_csg_slots_doorbell(kbdev, db_slots);
 
 		if (wait_csg_slots_handshake_ack(kbdev,
 				CSG_REQ_STATUS_UPDATE_MASK, csg_bitmap, wt)) {
-			dev_warn(kbdev->dev, "Timeout, treat groups as not idle: slot mask=0x%lx",
-				 csg_bitmap[0]);
+			dev_warn(
+				kbdev->dev,
+				"Timeout on CSG_REQ:STATUS_UPDATE, treat groups as not idle: slot mask=0x%lx",
+				csg_bitmap[0]);
 
 			/* Store the bitmap of timed out slots */
 			bitmap_copy(failed_csg_bitmap, csg_bitmap, num_groups);
 			csg_bitmap[0] = ~csg_bitmap[0] & db_slots;
 		} else {
-                       csg_bitmap[0] = db_slots;
+			csg_bitmap[0] = db_slots;
 		}
 	}
 }
 
 /**
  * scheduler_handle_idle_slots() - Update the idle status of queue groups
- *                    resident on command stream group slots for which the
+ *                    resident on CSG slots for which the
  *                    IDLE notification was received previously.
  *
  * This function is called at the start of scheduling tick/tock to reconfirm
- * the idle status of queue groups resident on command sream group slots for
+ * the idle status of queue groups resident on CSG slots for
  * which idle notification was received previously, i.e. all the CSG slots
  * present in the bitmap scheduler->csg_slots_idle_mask.
  * The confirmation is done by sending the CSG status update request to the
- * firmware. The idleness of a CSG is determined by looping over all the
- * bound command streams and checking their respective CS_STATUS_WAIT register
- * as well as the insert and extract offset.
+ * firmware. On completion, the firmware will mark the idleness at the
+ * slot's interface CSG_STATUS_STATE register accordingly.
+ *
  * The run state of the groups resident on still idle CSG slots is changed to
  * KBASE_CSF_GROUP_IDLE and the bitmap scheduler->csg_slots_idle_mask is
  * updated accordingly.
@@ -2986,15 +3327,17 @@ static void scheduler_handle_idle_slots(struct kbase_device *kbdev)
 			continue;
 		if (WARN_ON(!group))
 			continue;
-		if (WARN_ON(group->run_state != KBASE_CSF_GROUP_RUNNABLE))
+		if (WARN_ON(group->run_state != KBASE_CSF_GROUP_RUNNABLE &&
+					group->run_state != KBASE_CSF_GROUP_IDLE))
 			continue;
-		if (WARN_ON(group->priority >= BASE_QUEUE_GROUP_PRIORITY_COUNT))
+		if (WARN_ON(group->priority >= KBASE_QUEUE_GROUP_PRIORITY_COUNT))
 			continue;
 
-		if (group_on_slot_is_idle(kbdev, group, i)) {
+		if (group_on_slot_is_idle(kbdev, i)) {
 			group->run_state = KBASE_CSF_GROUP_IDLE;
 			set_bit(i, scheduler->csg_slots_idle_mask);
-		}
+		} else
+			group->run_state = KBASE_CSF_GROUP_RUNNABLE;
 	}
 
 	bitmap_or(scheduler->csg_slots_idle_mask,
@@ -3046,7 +3389,7 @@ static struct kbase_queue_group *get_tock_top_group(
 	int i;
 
 	lockdep_assert_held(&scheduler->lock);
-	for (i = 0; i < BASE_QUEUE_GROUP_PRIORITY_COUNT; ++i) {
+	for (i = 0; i < KBASE_QUEUE_GROUP_PRIORITY_COUNT; ++i) {
 		list_for_each_entry(kctx,
 			&scheduler->runnable_kctxs, csf.link) {
 			struct kbase_queue_group *group;
@@ -3080,7 +3423,7 @@ static int suspend_active_groups_on_powerdown(struct kbase_device *kbdev,
 		dev_warn(kbdev->dev, "Timed out waiting for CSG slots to suspend on power down, slot_mask: 0x%*pb\n",
 			 kbdev->csf.global_iface.group_num, slot_mask);
 
-		if (kbase_prepare_to_reset_gpu(kbdev))
+		if (kbase_prepare_to_reset_gpu(kbdev, RESET_FLAGS_NONE))
 			kbase_reset_gpu(kbdev);
 
 		if (is_suspend) {
@@ -3094,30 +3437,73 @@ static int suspend_active_groups_on_powerdown(struct kbase_device *kbdev,
 	/* Check if the groups became active whilst the suspend was ongoing,
 	 * but only for the case where the system suspend is not in progress
 	 */
-	if (!is_suspend && atomic_read(&scheduler->non_idle_suspended_grps))
+	if (!is_suspend && atomic_read(&scheduler->non_idle_offslot_grps))
 		return -1;
 
 	return 0;
 }
 
+static bool scheduler_idle_suspendable(struct kbase_device *kbdev)
+{
+	bool suspend;
+	unsigned long flags;
+	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
+
+	lockdep_assert_held(&scheduler->lock);
+
+	if  (scheduler->state == SCHED_SUSPENDED)
+		return false;
+
+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+	if (scheduler->total_runnable_grps) {
+		spin_lock(&scheduler->interrupt_lock);
+
+		/* Check both on-slots and off-slots groups idle status */
+		suspend = kbase_csf_scheduler_all_csgs_idle(kbdev) &&
+			  !atomic_read(&scheduler->non_idle_offslot_grps) &&
+			  kbase_pm_idle_groups_sched_suspendable(kbdev);
+
+		spin_unlock(&scheduler->interrupt_lock);
+	} else
+		suspend = kbase_pm_no_runnables_sched_suspendable(kbdev);
+
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+
+	return suspend;
+}
+
 static void gpu_idle_worker(struct work_struct *work)
 {
 	struct kbase_device *kbdev = container_of(
-		work, struct kbase_device, csf.scheduler.gpu_idle_work.work);
+		work, struct kbase_device, csf.scheduler.gpu_idle_work);
 	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
 
+	if (kbase_reset_gpu_try_prevent(kbdev)) {
+		dev_warn(kbdev->dev, "Quit idle for failing to prevent gpu reset.\n");
+		return;
+	}
 	mutex_lock(&scheduler->lock);
 
-	if (!scheduler->total_runnable_grps) {
-		if (scheduler->state != SCHED_SUSPENDED) {
+	/* Cycle completed, disable the firmware idle timer */
+	disable_gpu_idle_fw_timer(kbdev);
+	if (scheduler_idle_suspendable(kbdev) &&
+	    !kbase_reset_gpu_is_active(kbdev)) {
+		int ret = suspend_active_groups_on_powerdown(kbdev, false);
+
+		if (!ret) {
+			dev_dbg(kbdev->dev, "Scheduler becomes idle suspended now");
 			scheduler_suspend(kbdev);
-			dev_info(kbdev->dev, "Scheduler now suspended");
+			cancel_tick_timer(kbdev);
+		} else {
+			dev_dbg(kbdev->dev, "Aborting suspend scheduler (grps: %d)",
+				atomic_read(&scheduler->non_idle_offslot_grps));
+			/* Bring forward the next tick */
+			kbase_csf_scheduler_advance_tick(kbdev);
 		}
-	} else {
-		dev_dbg(kbdev->dev, "Scheduler couldn't be suspended");
 	}
 
 	mutex_unlock(&scheduler->lock);
+	kbase_reset_gpu_allow(kbdev);
 }
 
 static int scheduler_prepare(struct kbase_device *kbdev)
@@ -3142,21 +3528,37 @@ static int scheduler_prepare(struct kbase_device *kbdev)
 		scheduler->ngrp_to_schedule = 0;
 	scheduler->top_ctx = NULL;
 	scheduler->top_grp = NULL;
-	scheduler->head_slot_priority = MAX_CSG_SLOT_PRIORITY;
+	scheduler->csg_scan_count_for_tick = 0;
 	WARN_ON(!list_empty(&scheduler->idle_groups_to_schedule));
 	scheduler->num_active_address_spaces = 0;
 	scheduler->num_csg_slots_for_tick = 0;
 	bitmap_zero(scheduler->csg_slots_prio_update, MAX_SUPPORTED_CSGS);
 
 	/* Scan out to run groups */
-	for (i = 0; i < BASE_QUEUE_GROUP_PRIORITY_COUNT; ++i) {
+	for (i = 0; i < KBASE_QUEUE_GROUP_PRIORITY_COUNT; ++i) {
 		struct kbase_context *kctx;
 
 		list_for_each_entry(kctx, &scheduler->runnable_kctxs, csf.link)
 			scheduler_ctx_scan_groups(kbdev, kctx, i);
 	}
 
+	/* Update this tick's non-idle groups */
+	scheduler->non_idle_scanout_grps = scheduler->ngrp_to_schedule;
+
+	/* Initial number of non-idle off-slot groups, before the scheduler's
+	 * scheduler_apply() operation. This gives a sensible start point view
+	 * of the tick. It will be subject to up/downs during the scheduler
+	 * active phase.
+	 */
+	atomic_set(&scheduler->non_idle_offslot_grps,
+		   scheduler->non_idle_scanout_grps);
+
+	/* Adds those idle but runnable groups to the scanout list */
 	scheduler_scan_idle_groups(kbdev);
+
+	/* After adding the idle CSGs, the two counts should be the same */
+	WARN_ON(scheduler->csg_scan_count_for_tick != scheduler->ngrp_to_schedule);
+
 	KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_TOP_GRP, scheduler->top_grp,
 			scheduler->num_active_address_spaces |
 			(((u64)scheduler->ngrp_to_schedule) << 32));
@@ -3166,19 +3568,29 @@ static int scheduler_prepare(struct kbase_device *kbdev)
 	return 0;
 }
 
-static void scheduler_wait_protm_quit(struct kbase_device *kbdev)
+static void scheduler_handle_idle_timer_onoff(struct kbase_device *kbdev)
 {
-	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
-	long wt = kbase_csf_timeout_in_jiffies(CSF_STATE_WAIT_TIMEOUT_MS);
-	long remaining;
+	struct kbase_csf_scheduler *scheduler = &kbdev->csf.scheduler;
 
 	lockdep_assert_held(&scheduler->lock);
 
-	remaining = wait_event_timeout(kbdev->csf.event_wait,
-			!kbase_csf_scheduler_protected_mode_in_use(kbdev), wt);
-
-	if (!remaining)
-		dev_warn(kbdev->dev, "Timeout, protm_quit wait skipped");
+	/* After the scheduler apply operation, the internal variable
+	 * scheduler->non_idle_offslot_grps reflects the end-point view
+	 * of the count at the end of the active phase.
+	 *
+	 * Any changes that follow (after the scheduler has dropped the
+	 * scheduler->lock), reflects async operations to the scheduler,
+	 * such as a group gets killed (evicted) or a new group inserted,
+	 * cqs wait-sync triggered state transtion etc.
+	 *
+	 * The condition for enable the idle timer is that there is no
+	 * non-idle groups off-slots. If there is non-idle group off-slot,
+	 * the timer should be disabled.
+	 */
+	if (atomic_read(&scheduler->non_idle_offslot_grps))
+		disable_gpu_idle_fw_timer(kbdev);
+	else
+		enable_gpu_idle_fw_timer(kbdev);
 }
 
 static void schedule_actions(struct kbase_device *kbdev)
@@ -3187,7 +3599,10 @@ static void schedule_actions(struct kbase_device *kbdev)
 	unsigned long flags;
 	struct kbase_queue_group *protm_grp;
 	int ret;
+	bool skip_idle_slots_update;
+	bool new_protm_top_grp = false;
 
+	kbase_reset_gpu_assert_prevented(kbdev);
 	lockdep_assert_held(&scheduler->lock);
 
 	ret = kbase_pm_wait_for_desired_state(kbdev);
@@ -3196,7 +3611,14 @@ static void schedule_actions(struct kbase_device *kbdev)
 		return;
 	}
 
-	scheduler_handle_idle_slots(kbdev);
+	spin_lock_irqsave(&scheduler->interrupt_lock, flags);
+	skip_idle_slots_update = kbase_csf_scheduler_protected_mode_in_use(kbdev);
+	spin_unlock_irqrestore(&scheduler->interrupt_lock, flags);
+
+	/* Skip updating on-slot idle CSGs if GPU is in protected mode. */
+	if (!skip_idle_slots_update)
+		scheduler_handle_idle_slots(kbdev);
+
 	scheduler_prepare(kbdev);
 	spin_lock_irqsave(&scheduler->interrupt_lock, flags);
 	protm_grp = scheduler->active_protm_grp;
@@ -3214,6 +3636,7 @@ static void schedule_actions(struct kbase_device *kbdev)
 	if (protm_grp && scheduler->top_grp == protm_grp) {
 		dev_dbg(kbdev->dev, "Scheduler keep protm exec: group-%d",
 			protm_grp->handle);
+		atomic_dec(&scheduler->non_idle_offslot_grps);
 	} else if (scheduler->top_grp) {
 		if (protm_grp)
 			dev_dbg(kbdev->dev, "Scheduler drop protm exec: group-%d",
@@ -3226,28 +3649,34 @@ static void schedule_actions(struct kbase_device *kbdev)
 				scheduler->top_grp->kctx->tgid,
 				scheduler->top_grp->kctx->id);
 
-			/* Due to GPUCORE-24491 only the top-group is allowed
-			 * to be on slot and all other on slot groups have to
-			 * be suspended before entering protected mode.
-			 * This would change in GPUCORE-24492.
+			/* When entering protected mode all CSG slots can be occupied
+			 * but only the protected mode CSG will be running. Any event
+			 * that would trigger the execution of an on-slot idle CSG will
+			 * need to be handled by the host during protected mode.
 			 */
-			scheduler->num_csg_slots_for_tick = 1;
+			new_protm_top_grp = true;
 		}
 
 		spin_unlock_irqrestore(&scheduler->interrupt_lock, flags);
 
 		scheduler_apply(kbdev);
+
+		/* Post-apply, all the committed groups in this tick are on
+		 * slots, time to arrange the idle timer on/off decision.
+		 */
+		scheduler_handle_idle_timer_onoff(kbdev);
+
 		/* Scheduler is dropping the exec of the previous protm_grp,
 		 * Until the protm quit completes, the GPU is effectively
 		 * locked in the secure mode.
 		 */
 		if (protm_grp)
-			scheduler_wait_protm_quit(kbdev);
+			scheduler_force_protm_exit(kbdev);
 
 		wait_csg_slots_start(kbdev);
 		wait_csg_slots_finish_prio_update(kbdev);
 
-		if (scheduler->num_csg_slots_for_tick == 1) {
+		if (new_protm_top_grp) {
 			scheduler_group_check_protm_enter(kbdev,
 						scheduler->top_grp);
 		}
@@ -3265,13 +3694,16 @@ static void schedule_on_tock(struct work_struct *work)
 					csf.scheduler.tock_work.work);
 	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
 
-	mutex_lock(&scheduler->lock);
-
-	if (kbase_reset_gpu_is_active(kbdev) ||
-	    (scheduler->state == SCHED_SUSPENDED)) {
-		mutex_unlock(&scheduler->lock);
+	int err = kbase_reset_gpu_try_prevent(kbdev);
+	/* Regardless of whether reset failed or is currently happening, exit
+	 * early
+	 */
+	if (err)
 		return;
-	}
+
+	mutex_lock(&scheduler->lock);
+	if (scheduler->state == SCHED_SUSPENDED)
+		goto exit_no_schedule_unlock;
 
 	WARN_ON(!(scheduler->state == SCHED_INACTIVE));
 	scheduler->state = SCHED_BUSY;
@@ -3288,28 +3720,38 @@ static void schedule_on_tock(struct work_struct *work)
 
 	scheduler->state = SCHED_INACTIVE;
 	mutex_unlock(&scheduler->lock);
+	kbase_reset_gpu_allow(kbdev);
 
 	dev_dbg(kbdev->dev,
 		"Waking up for event after schedule-on-tock completes.");
 	wake_up_all(&kbdev->csf.event_wait);
+	return;
+
+exit_no_schedule_unlock:
+	mutex_unlock(&scheduler->lock);
+	kbase_reset_gpu_allow(kbdev);
 }
 
 static void schedule_on_tick(struct work_struct *work)
 {
 	struct kbase_device *kbdev = container_of(work, struct kbase_device,
-					csf.scheduler.tick_work.work);
+					csf.scheduler.tick_work);
 	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
 
+	int err = kbase_reset_gpu_try_prevent(kbdev);
+	/* Regardless of whether reset failed or is currently happening, exit
+	 * early
+	 */
+	if (err)
+		return;
+
 	mutex_lock(&scheduler->lock);
 
-	if (kbase_reset_gpu_is_active(kbdev) ||
-	    (scheduler->state == SCHED_SUSPENDED)) {
-		mutex_unlock(&scheduler->lock);
-		return;
-	}
+	WARN_ON(scheduler->tick_timer_active);
+	if (scheduler->state == SCHED_SUSPENDED)
+		goto exit_no_schedule_unlock;
 
 	scheduler->state = SCHED_BUSY;
-
 	/* Do scheduling stuff */
 	scheduler_rotate(kbdev);
 
@@ -3323,17 +3765,23 @@ static void schedule_on_tick(struct work_struct *work)
 	/* Kicking next scheduling if needed */
 	if (likely(scheduler_timer_is_enabled_nolock(kbdev)) &&
 			(scheduler->total_runnable_grps > 0)) {
-		mod_delayed_work(scheduler->wq, &scheduler->tick_work,
-				  CSF_SCHEDULER_TIME_TICK_JIFFIES);
-		dev_dbg(kbdev->dev, "scheduling for next tick, num_runnable_groups:%u\n",
+		start_tick_timer(kbdev);
+		dev_dbg(kbdev->dev,
+			"scheduling for next tick, num_runnable_groups:%u\n",
 			scheduler->total_runnable_grps);
 	}
 
 	scheduler->state = SCHED_INACTIVE;
 	mutex_unlock(&scheduler->lock);
+	kbase_reset_gpu_allow(kbdev);
 
 	dev_dbg(kbdev->dev, "Waking up for event after schedule-on-tick completes.");
 	wake_up_all(&kbdev->csf.event_wait);
+	return;
+
+exit_no_schedule_unlock:
+	mutex_unlock(&scheduler->lock);
+	kbase_reset_gpu_allow(kbdev);
 }
 
 int wait_csg_slots_suspend(struct kbase_device *kbdev,
@@ -3381,7 +3829,7 @@ int wait_csg_slots_suspend(struct kbase_device *kbdev,
 					 */
 					save_csg_slot(group);
 					if (cleanup_csg_slot(group))
-						sched_evict_group(group, true);
+						sched_evict_group(group, true, true);
 				}
 			}
 		} else {
@@ -3414,8 +3862,7 @@ static int suspend_active_queue_groups(struct kbase_device *kbdev,
 		}
 	}
 
-	ret = wait_csg_slots_suspend(kbdev, slot_mask,
-			CSG_SUSPEND_ON_RESET_WAIT_TIMEOUT_MS);
+	ret = wait_csg_slots_suspend(kbdev, slot_mask, kbdev->reset_timeout_ms);
 	return ret;
 }
 
@@ -3424,31 +3871,35 @@ static int suspend_active_queue_groups_on_reset(struct kbase_device *kbdev)
 	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
 	DECLARE_BITMAP(slot_mask, MAX_SUPPORTED_CSGS) = { 0 };
 	int ret;
+	int ret2;
 
 	mutex_lock(&scheduler->lock);
 
 	ret = suspend_active_queue_groups(kbdev, slot_mask);
+
 	if (ret) {
 		dev_warn(kbdev->dev, "Timed out waiting for CSG slots to suspend before reset, slot_mask: 0x%*pb\n",
 			 kbdev->csf.global_iface.group_num, slot_mask);
 	}
 
-	if (!bitmap_empty(slot_mask, MAX_SUPPORTED_CSGS)) {
-		int ret2;
-
-		/* Need to flush the GPU cache to ensure suspend buffer
-		 * contents are not lost on reset of GPU.
-		 * Do this even if suspend operation had timedout for some of
-		 * the CSG slots.
-		 */
-		kbase_gpu_start_cache_clean(kbdev);
-		ret2 = kbase_gpu_wait_cache_clean_timeout(kbdev,
-				DEFAULT_RESET_TIMEOUT_MS);
-		if (ret2) {
-			dev_warn(kbdev->dev, "Timed out waiting for cache clean to complete before reset");
-			if (!ret)
-				ret = ret2;
-		}
+	/* Need to flush the GPU cache to ensure suspend buffer
+	 * contents are not lost on reset of GPU.
+	 * Do this even if suspend operation had timed out for some of
+	 * the CSG slots.
+	 * In case the scheduler already in suspended state, the
+	 * cache clean is required as the async reset request from
+	 * the debugfs may race against the scheduler suspend operation
+	 * due to the extra context ref-count, which prevents the
+	 * L2 powering down cache clean operation in the non racing
+	 * case.
+	 */
+	kbase_gpu_start_cache_clean(kbdev);
+	ret2 = kbase_gpu_wait_cache_clean_timeout(kbdev,
+			kbdev->reset_timeout_ms);
+	if (ret2) {
+		dev_warn(kbdev->dev, "Timed out waiting for cache clean to complete before reset");
+		if (!ret)
+			ret = ret2;
 	}
 
 	mutex_unlock(&scheduler->lock);
@@ -3465,7 +3916,9 @@ static void scheduler_inner_reset(struct kbase_device *kbdev)
 	WARN_ON(csgs_active(kbdev));
 
 	/* Cancel any potential queued delayed work(s) */
-	cancel_delayed_work_sync(&scheduler->tick_work);
+	cancel_work_sync(&kbdev->csf.scheduler.gpu_idle_work);
+	cancel_tick_timer(kbdev);
+	cancel_work_sync(&scheduler->tick_work);
 	cancel_delayed_work_sync(&scheduler->tock_work);
 	cancel_delayed_work_sync(&scheduler->ping_work);
 
@@ -3496,8 +3949,7 @@ void kbase_csf_scheduler_reset(struct kbase_device *kbdev)
 	WARN_ON(!kbase_reset_gpu_is_active(kbdev));
 
 	KBASE_KTRACE_ADD(kbdev, SCHEDULER_RESET, NULL, 0u);
-	if (!kbase_csf_scheduler_protected_mode_in_use(kbdev) &&
-	    !suspend_active_queue_groups_on_reset(kbdev)) {
+	if (!suspend_active_queue_groups_on_reset(kbdev)) {
 		/* As all groups have been successfully evicted from the CSG
 		 * slots, clear out thee scheduler data fields and return
 		 */
@@ -3542,10 +3994,23 @@ static void firmware_aliveness_monitor(struct work_struct *work)
 					csf.scheduler.ping_work.work);
 	int err;
 
-	/* Get the scheduler mutex to ensure that reset will not change while
-	 * this function is being executed as otherwise calling kbase_reset_gpu
-	 * when reset is already occurring is a programming error.
+	/* Ensure that reset will not be occurring while this function is being
+	 * executed as otherwise calling kbase_reset_gpu when reset is already
+	 * occurring is a programming error.
+	 *
+	 * We must use the 'try' variant as the Reset worker can try to flush
+	 * this workqueue, which would otherwise deadlock here if we tried to
+	 * wait for the reset (and thus ourselves) to complete.
 	 */
+	err = kbase_reset_gpu_try_prevent(kbdev);
+	if (err) {
+		/* It doesn't matter whether the value was -EAGAIN or a fatal
+		 * error, just stop processing. In case of -EAGAIN, the Reset
+		 * worker will restart the scheduler later to resume ping
+		 */
+		return;
+	}
+
 	mutex_lock(&kbdev->csf.scheduler.lock);
 
 #ifdef CONFIG_MALI_BIFROST_DEBUG
@@ -3558,9 +4023,6 @@ static void firmware_aliveness_monitor(struct work_struct *work)
 	if (kbdev->csf.scheduler.state == SCHED_SUSPENDED)
 		goto exit;
 
-	if (kbase_reset_gpu_is_active(kbdev))
-		goto exit;
-
 	if (get_nr_active_csgs(kbdev) != 1)
 		goto exit;
 
@@ -3575,10 +4037,14 @@ static void firmware_aliveness_monitor(struct work_struct *work)
 
 	kbase_pm_wait_for_desired_state(kbdev);
 
-	err = kbase_csf_firmware_ping(kbdev);
+	err = kbase_csf_firmware_ping_wait(kbdev);
 
 	if (err) {
-		if (kbase_prepare_to_reset_gpu(kbdev))
+		/* It is acceptable to enqueue a reset whilst we've prevented
+		 * them, it will happen after we've allowed them again
+		 */
+		if (kbase_prepare_to_reset_gpu(
+			    kbdev, RESET_FLAGS_HWC_UNRECOVERABLE_ERROR))
 			kbase_reset_gpu(kbdev);
 	} else if (get_nr_active_csgs(kbdev) == 1) {
 		queue_delayed_work(system_long_wq,
@@ -3589,6 +4055,8 @@ static void firmware_aliveness_monitor(struct work_struct *work)
 	kbase_pm_context_idle(kbdev);
 exit:
 	mutex_unlock(&kbdev->csf.scheduler.lock);
+	kbase_reset_gpu_allow(kbdev);
+	return;
 }
 
 int kbase_csf_scheduler_group_copy_suspend_buf(struct kbase_queue_group *group,
@@ -3597,18 +4065,12 @@ int kbase_csf_scheduler_group_copy_suspend_buf(struct kbase_queue_group *group,
 	struct kbase_context *const kctx = group->kctx;
 	struct kbase_device *const kbdev = kctx->kbdev;
 	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
-	int err;
+	int err = 0;
 
+	kbase_reset_gpu_assert_prevented(kbdev);
 	lockdep_assert_held(&kctx->csf.lock);
 	mutex_lock(&scheduler->lock);
 
-	err = wait_gpu_reset(kbdev);
-	if (err) {
-		dev_warn(kbdev->dev, "Error while waiting for the GPU reset to complete when suspending group %d on slot %d",
-			 group->handle, group->csg_nr);
-		goto exit;
-	}
-
 	if (kbasep_csf_scheduler_group_is_on_slot_locked(group)) {
 		DECLARE_BITMAP(slot_mask, MAX_SUPPORTED_CSGS) = {0};
 
@@ -3617,7 +4079,7 @@ int kbase_csf_scheduler_group_copy_suspend_buf(struct kbase_queue_group *group,
 		if (!WARN_ON(scheduler->state == SCHED_SUSPENDED))
 			suspend_queue_group(group);
 		err = wait_csg_slots_suspend(kbdev, slot_mask,
-				CSF_STATE_WAIT_TIMEOUT_MS);
+					     kbdev->csf.fw_timeout_ms);
 		if (err) {
 			dev_warn(kbdev->dev, "Timed out waiting for the group %d to suspend on slot %d",
 					group->handle, group->csg_nr);
@@ -3698,7 +4160,9 @@ static bool group_sync_updated(struct kbase_queue_group *group)
 	bool updated = false;
 	int stream;
 
-	WARN_ON(group->run_state != KBASE_CSF_GROUP_SUSPENDED_ON_WAIT_SYNC);
+	/* Groups can also be blocked on-slot during protected mode. */
+	WARN_ON(group->run_state != KBASE_CSF_GROUP_SUSPENDED_ON_WAIT_SYNC &&
+		    group->run_state != KBASE_CSF_GROUP_IDLE);
 
 	for (stream = 0; stream < MAX_SUPPORTED_STREAMS_PER_GROUP; ++stream) {
 		struct kbase_queue *const queue = group->bound_queues[stream];
@@ -3790,17 +4254,145 @@ void kbase_csf_scheduler_group_protm_enter(struct kbase_queue_group *group)
 	struct kbase_device *const kbdev = group->kctx->kbdev;
 	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
 
+	int err = kbase_reset_gpu_try_prevent(kbdev);
+	/* Regardless of whether reset failed or is currently happening, exit
+	 * early
+	 */
+	if (err)
+		return;
+
 	mutex_lock(&scheduler->lock);
 
-	/* Check if the group is now eligible for execution in protected mode
-	 * and accordingly undertake full scheduling actions as due to
-	 * GPUCORE-24491 the on slot groups other than the top group have to
-	 * be suspended first before entering protected mode.
-	 */
+	/* Check if the group is now eligible for execution in protected mode. */
 	if (scheduler_get_protm_enter_async_group(kbdev, group))
-		schedule_actions(kbdev);
+		scheduler_group_check_protm_enter(kbdev, group);
 
 	mutex_unlock(&scheduler->lock);
+	kbase_reset_gpu_allow(kbdev);
+}
+
+/**
+ * check_sync_update_for_idle_group_protm() - Check the sync wait condition
+ *                                            for all the queues bound to
+ *                                            the given group.
+ *
+ * @group:    Pointer to the group that requires evaluation.
+ *
+ * This function is called if the GPU is in protected mode and there are on
+ * slot idle groups with higher priority than the active protected mode group.
+ * This function will evaluate the sync condition, if any, of all the queues
+ * bound to the given group.
+ *
+ * Return true if the sync condition of at least one queue has been satisfied.
+ */
+static bool check_sync_update_for_idle_group_protm(
+		struct kbase_queue_group *group)
+{
+	struct kbase_device *const kbdev = group->kctx->kbdev;
+	struct kbase_csf_scheduler *const scheduler =
+				&kbdev->csf.scheduler;
+	bool sync_update_done = false;
+	int i;
+
+	lockdep_assert_held(&scheduler->lock);
+
+	for (i = 0; i < MAX_SUPPORTED_STREAMS_PER_GROUP; i++) {
+		struct kbase_queue *queue = group->bound_queues[i];
+
+		if (queue && queue->enabled && !sync_update_done) {
+			struct kbase_csf_cmd_stream_group_info *const ginfo =
+				&kbdev->csf.global_iface.groups[group->csg_nr];
+			struct kbase_csf_cmd_stream_info *const stream =
+				&ginfo->streams[queue->csi_index];
+			u32 status = kbase_csf_firmware_cs_output(
+					stream, CS_STATUS_WAIT);
+			unsigned long flags;
+
+			if (!CS_STATUS_WAIT_SYNC_WAIT_GET(status))
+				continue;
+
+			/* Save the information of sync object of the command
+			 * queue so the callback function, 'group_sync_updated'
+			 * can evaluate the sync object when it gets updated
+			 * later.
+			 */
+			queue->status_wait = status;
+			queue->sync_ptr = kbase_csf_firmware_cs_output(
+				stream, CS_STATUS_WAIT_SYNC_POINTER_LO);
+			queue->sync_ptr |= (u64)kbase_csf_firmware_cs_output(
+				stream, CS_STATUS_WAIT_SYNC_POINTER_HI) << 32;
+			queue->sync_value = kbase_csf_firmware_cs_output(
+				stream, CS_STATUS_WAIT_SYNC_VALUE);
+
+			if (!evaluate_sync_update(queue))
+				continue;
+
+			/* Update csg_slots_idle_mask and group's run_state */
+			spin_lock_irqsave(&scheduler->interrupt_lock, flags);
+			clear_bit((unsigned int)group->csg_nr,
+					scheduler->csg_slots_idle_mask);
+			spin_unlock_irqrestore(&scheduler->interrupt_lock,
+					       flags);
+			group->run_state = KBASE_CSF_GROUP_RUNNABLE;
+
+			KBASE_KTRACE_ADD_CSF_GRP(kbdev, GROUP_SYNC_UPDATE_DONE, group, 0u);
+			sync_update_done = true;
+		}
+	}
+
+	return sync_update_done;
+}
+
+/**
+ * check_sync_update_for_idle_groups_protm() - Check the sync wait condition
+ *                                             for the idle groups on slot
+ *                                             during protected mode.
+ *
+ * @kbdev:    Pointer to the GPU device
+ *
+ * This function checks the gpu queues of all the idle groups on slot during
+ * protected mode that has a higher priority than the active protected mode
+ * group.
+ *
+ * Return true if the sync condition of at least one queue in a group has been
+ * satisfied.
+ */
+static bool check_sync_update_for_idle_groups_protm(struct kbase_device *kbdev)
+{
+	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
+	struct kbase_queue_group *protm_grp;
+	bool exit_protm = false;
+	unsigned long flags;
+	u32 num_groups;
+	u32 i;
+
+	lockdep_assert_held(&scheduler->lock);
+
+	spin_lock_irqsave(&scheduler->interrupt_lock, flags);
+	protm_grp = scheduler->active_protm_grp;
+	spin_unlock_irqrestore(&scheduler->interrupt_lock, flags);
+
+	if (!protm_grp)
+		return exit_protm;
+
+	num_groups = kbdev->csf.global_iface.group_num;
+
+	for_each_set_bit(i, scheduler->csg_slots_idle_mask, num_groups) {
+		struct kbase_csf_csg_slot *csg_slot =
+					&scheduler->csg_slots[i];
+		struct kbase_queue_group *group = csg_slot->resident_group;
+
+		if (group->scan_seq_num < protm_grp->scan_seq_num) {
+			/* If sync update has been performed for the group that
+			 * has a higher priority than the protm group, then we
+			 * need to exit protected mode.
+			 */
+			if (check_sync_update_for_idle_group_protm(group))
+				exit_protm = true;
+		}
+	}
+
+	return exit_protm;
 }
 
 /**
@@ -3810,18 +4402,20 @@ void kbase_csf_scheduler_group_protm_enter(struct kbase_queue_group *group)
  * @work:    Pointer to the context-specific work item for evaluating the wait
  *           condition for all the queue groups in idle_wait_groups list.
  *
- * This function checks the gpu queues of all the groups present in
- * idle_wait_groups list of a context. If the sync wait condition
- * for at least one queue bound to the group has been satisfied then
- * the group is moved to the per context list of runnable groups so
- * that Scheduler can consider scheduling the group in next tick.
+ * This function checks the gpu queues of all the groups present in both
+ * idle_wait_groups list of a context and all on slot idle groups (if GPU
+ * is in protected mode).
+ * If the sync wait condition for at least one queue bound to the group has
+ * been satisfied then the group is moved to the per context list of
+ * runnable groups so that Scheduler can consider scheduling the group
+ * in next tick or exit protected mode.
  */
 static void check_group_sync_update_worker(struct work_struct *work)
 {
 	struct kbase_context *const kctx = container_of(work,
 		struct kbase_context, csf.sched.sync_update_work);
-	struct kbase_csf_scheduler *const scheduler =
-		&kctx->kbdev->csf.scheduler;
+	struct kbase_device *const kbdev = kctx->kbdev;
+	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
 
 	mutex_lock(&scheduler->lock);
 
@@ -3835,13 +4429,16 @@ static void check_group_sync_update_worker(struct work_struct *work)
 				 * groups list of the context.
 				 */
 				update_idle_suspended_group_state(group);
-				KBASE_KTRACE_ADD_CSF_GRP(kctx->kbdev, GROUP_SYNC_UPDATE_DONE, group, 0u);
+				KBASE_KTRACE_ADD_CSF_GRP(kbdev, GROUP_SYNC_UPDATE_DONE, group, 0u);
 			}
 		}
 	} else {
 		WARN_ON(!list_empty(&kctx->csf.sched.idle_wait_groups));
 	}
 
+	if (check_sync_update_for_idle_groups_protm(kbdev))
+		scheduler_force_protm_exit(kbdev);
+
 	mutex_unlock(&scheduler->lock);
 }
 
@@ -3862,7 +4459,7 @@ int kbase_csf_scheduler_context_init(struct kbase_context *kctx)
 	int priority;
 	int err;
 
-	for (priority = 0; priority < BASE_QUEUE_GROUP_PRIORITY_COUNT;
+	for (priority = 0; priority < KBASE_QUEUE_GROUP_PRIORITY_COUNT;
 	     ++priority) {
 		INIT_LIST_HEAD(&kctx->csf.sched.runnable_groups[priority]);
 	}
@@ -3930,11 +4527,11 @@ int kbase_csf_scheduler_init(struct kbase_device *kbdev)
 		return -ENOMEM;
 	}
 
-	INIT_DEFERRABLE_WORK(&scheduler->tick_work, schedule_on_tick);
+	INIT_WORK(&scheduler->tick_work, schedule_on_tick);
 	INIT_DEFERRABLE_WORK(&scheduler->tock_work, schedule_on_tock);
 
 	INIT_DEFERRABLE_WORK(&scheduler->ping_work, firmware_aliveness_monitor);
-	BUILD_BUG_ON(GLB_REQ_WAIT_TIMEOUT_MS >= FIRMWARE_PING_INTERVAL_MS);
+	BUILD_BUG_ON(CSF_FIRMWARE_TIMEOUT_MS >= FIRMWARE_PING_INTERVAL_MS);
 
 	mutex_init(&scheduler->lock);
 	spin_lock_init(&scheduler->interrupt_lock);
@@ -3956,10 +4553,16 @@ int kbase_csf_scheduler_init(struct kbase_device *kbdev)
 	scheduler->last_schedule = 0;
 	scheduler->tock_pending_request = false;
 	scheduler->active_protm_grp = NULL;
+	scheduler->gpu_idle_fw_timer_enabled = false;
+	scheduler->csg_scheduling_period_ms = CSF_SCHEDULER_TIME_TICK_MS;
 	scheduler_doorbell_init(kbdev);
 
-	INIT_DEFERRABLE_WORK(&scheduler->gpu_idle_work, gpu_idle_worker);
-	atomic_set(&scheduler->non_idle_suspended_grps, 0);
+	INIT_WORK(&scheduler->gpu_idle_work, gpu_idle_worker);
+	atomic_set(&scheduler->non_idle_offslot_grps, 0);
+
+	hrtimer_init(&scheduler->tick_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+	scheduler->tick_timer.function = tick_timer_callback;
+	scheduler->tick_timer_active = false;
 
 	return 0;
 }
@@ -3967,9 +4570,17 @@ int kbase_csf_scheduler_init(struct kbase_device *kbdev)
 void kbase_csf_scheduler_term(struct kbase_device *kbdev)
 {
 	if (kbdev->csf.scheduler.csg_slots) {
+		WARN_ON(atomic_read(&kbdev->csf.scheduler.non_idle_offslot_grps));
 		WARN_ON(csgs_active(kbdev));
-		cancel_delayed_work_sync(&kbdev->csf.scheduler.gpu_idle_work);
+		flush_work(&kbdev->csf.scheduler.gpu_idle_work);
+		mutex_lock(&kbdev->csf.scheduler.lock);
+		if (WARN_ON(kbdev->csf.scheduler.state != SCHED_SUSPENDED))
+			scheduler_suspend(kbdev);
+		mutex_unlock(&kbdev->csf.scheduler.lock);
 		cancel_delayed_work_sync(&kbdev->csf.scheduler.ping_work);
+		cancel_tick_timer(kbdev);
+		cancel_work_sync(&kbdev->csf.scheduler.tick_work);
+		cancel_delayed_work_sync(&kbdev->csf.scheduler.tock_work);
 		destroy_workqueue(kbdev->csf.scheduler.wq);
 		mutex_destroy(&kbdev->csf.scheduler.lock);
 		kfree(kbdev->csf.scheduler.csg_slots);
@@ -3980,8 +4591,7 @@ void kbase_csf_scheduler_term(struct kbase_device *kbdev)
 /**
  * scheduler_enable_tick_timer_nolock - Enable the scheduler tick timer.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  *
  * This function will restart the scheduler tick so that regular scheduling can
  * be resumed without any explicit trigger (like kicking of GPU queues). This
@@ -3999,11 +4609,12 @@ static void scheduler_enable_tick_timer_nolock(struct kbase_device *kbdev)
 
 	WARN_ON((scheduler->state != SCHED_INACTIVE) &&
 		(scheduler->state != SCHED_SUSPENDED));
-	WARN_ON(delayed_work_pending(&scheduler->tick_work));
 
 	if (scheduler->total_runnable_grps > 0) {
-		mod_delayed_work(scheduler->wq, &scheduler->tick_work, 0);
+		enqueue_tick_work(kbdev);
 		dev_dbg(kbdev->dev, "Re-enabling the scheduler timer\n");
+	} else if (scheduler->state != SCHED_SUSPENDED) {
+		queue_work(system_wq, &scheduler->gpu_idle_work);
 	}
 }
 
@@ -4037,16 +4648,19 @@ void kbase_csf_scheduler_timer_set_enabled(struct kbase_device *kbdev,
 	currently_enabled = scheduler_timer_is_enabled_nolock(kbdev);
 	if (currently_enabled && !enable) {
 		scheduler->timer_enabled = false;
-
-		cancel_delayed_work(&scheduler->tick_work);
+		cancel_tick_timer(kbdev);
 		cancel_delayed_work(&scheduler->tock_work);
+		mutex_unlock(&scheduler->lock);
+		/* The non-sync version to cancel the normal work item is not
+		 * available, so need to drop the lock before cancellation.
+		 */
+		cancel_work_sync(&scheduler->tick_work);
 	} else if (!currently_enabled && enable) {
 		scheduler->timer_enabled = true;
 
 		scheduler_enable_tick_timer_nolock(kbdev);
+		mutex_unlock(&scheduler->lock);
 	}
-
-	mutex_unlock(&scheduler->lock);
 }
 
 void kbase_csf_scheduler_kick(struct kbase_device *kbdev)
@@ -4059,7 +4673,7 @@ void kbase_csf_scheduler_kick(struct kbase_device *kbdev)
 		goto out;
 
 	if (scheduler->total_runnable_grps > 0) {
-		mod_delayed_work(scheduler->wq, &scheduler->tick_work, 0);
+		enqueue_tick_work(kbdev);
 		dev_dbg(kbdev->dev, "Kicking the scheduler manually\n");
 	}
 
@@ -4072,20 +4686,30 @@ void kbase_csf_scheduler_pm_suspend(struct kbase_device *kbdev)
 	struct kbase_csf_scheduler *scheduler = &kbdev->csf.scheduler;
 
 	/* Cancel any potential queued delayed work(s) */
-	cancel_delayed_work_sync(&scheduler->tick_work);
+	cancel_work_sync(&scheduler->tick_work);
 	cancel_delayed_work_sync(&scheduler->tock_work);
 
+	if (kbase_reset_gpu_prevent_and_wait(kbdev)) {
+		dev_warn(kbdev->dev,
+			 "Stop PM suspending for failing to prevent gpu reset.\n");
+		return;
+	}
+
 	mutex_lock(&scheduler->lock);
 
-	WARN_ON(!kbase_pm_is_suspending(kbdev));
+	disable_gpu_idle_fw_timer(kbdev);
 
 	if (scheduler->state != SCHED_SUSPENDED) {
 		suspend_active_groups_on_powerdown(kbdev, true);
 		dev_info(kbdev->dev, "Scheduler PM suspend");
 		scheduler_suspend(kbdev);
+		cancel_tick_timer(kbdev);
 	}
 	mutex_unlock(&scheduler->lock);
+
+	kbase_reset_gpu_allow(kbdev);
 }
+KBASE_EXPORT_TEST_API(kbase_csf_scheduler_pm_suspend);
 
 void kbase_csf_scheduler_pm_resume(struct kbase_device *kbdev)
 {
@@ -4093,8 +4717,6 @@ void kbase_csf_scheduler_pm_resume(struct kbase_device *kbdev)
 
 	mutex_lock(&scheduler->lock);
 
-	WARN_ON(kbase_pm_is_suspending(kbdev));
-
 	if (scheduler->total_runnable_grps > 0) {
 		WARN_ON(scheduler->state != SCHED_SUSPENDED);
 		dev_info(kbdev->dev, "Scheduler PM resume");
@@ -4102,6 +4724,7 @@ void kbase_csf_scheduler_pm_resume(struct kbase_device *kbdev)
 	}
 	mutex_unlock(&scheduler->lock);
 }
+KBASE_EXPORT_TEST_API(kbase_csf_scheduler_pm_resume);
 
 void kbase_csf_scheduler_pm_active(struct kbase_device *kbdev)
 {
@@ -4118,6 +4741,7 @@ void kbase_csf_scheduler_pm_active(struct kbase_device *kbdev)
 	else
 		WARN_ON(prev_count == U32_MAX);
 }
+KBASE_EXPORT_TEST_API(kbase_csf_scheduler_pm_active);
 
 void kbase_csf_scheduler_pm_idle(struct kbase_device *kbdev)
 {
@@ -4133,3 +4757,4 @@ void kbase_csf_scheduler_pm_idle(struct kbase_device *kbdev)
 	else
 		WARN_ON(prev_count == 0);
 }
+KBASE_EXPORT_TEST_API(kbase_csf_scheduler_pm_idle);
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_scheduler.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_scheduler.h
index 1b1c0681f64d..1607ff637554 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_scheduler.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_scheduler.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_CSF_SCHEDULER_H_
@@ -31,11 +30,10 @@
  *
  * @queue: Pointer to the GPU command queue to be started.
  *
- * This function would enable the start of a command stream interface, within a
- * command stream group, to which the @queue was bound.
- * If the command stream group is already scheduled and resident, the command
- * stream interface will be started right away, otherwise once the group is
- * made resident.
+ * This function would enable the start of a CSI, within a
+ * CSG, to which the @queue was bound.
+ * If the CSG is already scheduled and resident, the CSI will be started
+ * right away, otherwise once the group is made resident.
  *
  * Return: 0 on success, or negative on failure.
  */
@@ -47,8 +45,7 @@ int kbase_csf_scheduler_queue_start(struct kbase_queue *queue);
  *
  * @queue: Pointer to the GPU command queue to be stopped.
  *
- * This function would stop the command stream interface, within a command
- * stream group, to which the @queue was bound.
+ * This function would stop the CSI, within a CSG, to which @queue was bound.
  *
  * Return: 0 on success, or negative on failure.
  */
@@ -69,7 +66,7 @@ void kbase_csf_scheduler_group_protm_enter(struct kbase_queue_group *group);
 
 /**
  * kbase_csf_scheduler_group_get_slot() - Checks if a queue group is
- *                           programmed on a firmware Command Stream Group slot
+ *                           programmed on a firmware CSG slot
  *                           and returns the slot number.
  *
  * @group: The command queue group.
@@ -84,7 +81,7 @@ int kbase_csf_scheduler_group_get_slot(struct kbase_queue_group *group);
 
 /**
  * kbase_csf_scheduler_group_get_slot_locked() - Checks if a queue group is
- *                           programmed on a firmware Command Stream Group slot
+ *                           programmed on a firmware CSG slot
  *                           and returns the slot number.
  *
  * @group: The command queue group.
@@ -112,7 +109,7 @@ bool kbase_csf_scheduler_group_events_enabled(struct kbase_device *kbdev,
 
 /**
  * kbase_csf_scheduler_get_group_on_slot()- Gets the queue group that has been
- *                          programmed to a firmware Command Stream Group slot.
+ *                          programmed to a firmware CSG slot.
  *
  * @kbdev: The GPU device.
  * @slot:  The slot for which to get the queue group.
@@ -128,7 +125,7 @@ struct kbase_queue_group *kbase_csf_scheduler_get_group_on_slot(
  * kbase_csf_scheduler_group_deschedule() - Deschedule a GPU command queue
  *                                          group from the firmware.
  *
- * @group: Pointer to the queue group to be scheduled.
+ * @group: Pointer to the queue group to be descheduled.
  *
  * This function would disable the scheduling of GPU command queue group on
  * firmware.
@@ -166,10 +163,9 @@ int kbase_csf_scheduler_context_init(struct kbase_context *kctx);
 /**
  * kbase_csf_scheduler_init - Initialize the CSF scheduler
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  *
- * The scheduler does the arbitration for the command stream group slots
+ * The scheduler does the arbitration for the CSG slots
  * provided by the firmware between the GPU command queue groups created
  * by the Clients.
  *
@@ -178,7 +174,7 @@ int kbase_csf_scheduler_context_init(struct kbase_context *kctx);
 int kbase_csf_scheduler_init(struct kbase_device *kbdev);
 
 /**
- * kbase_csf_scheduler_context_init() - Terminate the context-specific part
+ * kbase_csf_scheduler_context_term() - Terminate the context-specific part
  *                                      for CSF scheduler.
  *
  * @kctx: Pointer to kbase context that is being terminated.
@@ -190,8 +186,7 @@ void kbase_csf_scheduler_context_term(struct kbase_context *kctx);
 /**
  * kbase_csf_scheduler_term - Terminate the CSF scheduler.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  *
  * This should be called when unload of firmware is done on device
  * termination.
@@ -202,8 +197,7 @@ void kbase_csf_scheduler_term(struct kbase_device *kbdev);
  * kbase_csf_scheduler_reset - Reset the state of all active GPU command
  *                             queue groups.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  *
  * This function will first iterate through all the active/scheduled GPU
  * command queue groups and suspend them (to avoid losing work for groups
@@ -223,8 +217,7 @@ void kbase_csf_scheduler_reset(struct kbase_device *kbdev);
 /**
  * kbase_csf_scheduler_enable_tick_timer - Enable the scheduler tick timer.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  *
  * This function will restart the scheduler tick so that regular scheduling can
  * be resumed without any explicit trigger (like kicking of GPU queues).
@@ -251,8 +244,7 @@ int kbase_csf_scheduler_group_copy_suspend_buf(struct kbase_queue_group *group,
 /**
  * kbase_csf_scheduler_lock - Acquire the global Scheduler lock.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  *
  * This function will take the global scheduler lock, in order to serialize
  * against the Scheduler actions, for access to CS IO pages.
@@ -265,8 +257,7 @@ static inline void kbase_csf_scheduler_lock(struct kbase_device *kbdev)
 /**
  * kbase_csf_scheduler_unlock - Release the global Scheduler lock.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  */
 static inline void kbase_csf_scheduler_unlock(struct kbase_device *kbdev)
 {
@@ -276,8 +267,7 @@ static inline void kbase_csf_scheduler_unlock(struct kbase_device *kbdev)
 /**
  * kbase_csf_scheduler_spin_lock - Acquire Scheduler interrupt spinlock.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  * @flags: Pointer to the memory location that would store the previous
  *         interrupt state.
  *
@@ -293,8 +283,7 @@ static inline void kbase_csf_scheduler_spin_lock(struct kbase_device *kbdev,
 /**
  * kbase_csf_scheduler_spin_unlock - Release Scheduler interrupt spinlock.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  * @flags: Previously stored interrupt state when Scheduler interrupt
  *         spinlock was acquired.
  */
@@ -308,8 +297,7 @@ static inline void kbase_csf_scheduler_spin_unlock(struct kbase_device *kbdev,
  * kbase_csf_scheduler_spin_lock_assert_held - Assert if the Scheduler
  *                                          interrupt spinlock is held.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  */
 static inline void
 kbase_csf_scheduler_spin_lock_assert_held(struct kbase_device *kbdev)
@@ -342,8 +330,7 @@ void kbase_csf_scheduler_timer_set_enabled(struct kbase_device *kbdev,
  *
  * Note: This function is only effective if the scheduling timer is disabled.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  */
 void kbase_csf_scheduler_kick(struct kbase_device *kbdev);
 
@@ -367,8 +354,7 @@ static inline bool kbase_csf_scheduler_protected_mode_in_use(
  * Note: This function will increase the scheduler's internal pm_active_count
  * value, ensuring that both GPU and MCU are powered for access.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  */
 void kbase_csf_scheduler_pm_active(struct kbase_device *kbdev);
 
@@ -378,16 +364,14 @@ void kbase_csf_scheduler_pm_active(struct kbase_device *kbdev);
  * Note: This function will decrease the scheduler's internal pm_active_count
  * value. On reaching 0, the MCU and GPU could be powered off.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  */
 void kbase_csf_scheduler_pm_idle(struct kbase_device *kbdev);
 
 /**
  * kbase_csf_scheduler_pm_resume - Reactivate the scheduler on system resume
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  *
  * This function will make the scheduler resume the scheduling of queue groups
  * and take the power managemenet reference, if there are any runnable groups.
@@ -397,12 +381,69 @@ void kbase_csf_scheduler_pm_resume(struct kbase_device *kbdev);
 /**
  * kbase_csf_scheduler_pm_suspend - Idle the scheduler on system suspend
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  *
  * This function will make the scheduler suspend all the running queue groups
  * and drop its power managemenet reference.
  */
 void kbase_csf_scheduler_pm_suspend(struct kbase_device *kbdev);
 
+/**
+ * kbase_csf_scheduler_all_csgs_idle() - Check if the scheduler internal
+ * runtime used slots are all tagged as idle command queue groups.
+ *
+ * @kbdev: Pointer to the device
+ *
+ * Return: true if all the used slots are tagged as idle CSGs.
+ */
+static inline bool kbase_csf_scheduler_all_csgs_idle(struct kbase_device *kbdev)
+{
+	lockdep_assert_held(&kbdev->csf.scheduler.interrupt_lock);
+	return bitmap_equal(kbdev->csf.scheduler.csg_slots_idle_mask,
+			    kbdev->csf.scheduler.csg_inuse_bitmap,
+			    kbdev->csf.global_iface.group_num);
+}
+
+/**
+ * kbase_csf_scheduler_advance_tick_nolock() - Advance the scheduling tick
+ *
+ * @kbdev: Pointer to the device
+ *
+ * This function advances the scheduling tick by enqueing the tick work item for
+ * immediate execution, but only if the tick hrtimer is active. If the timer
+ * is inactive then the tick work item is already in flight.
+ * The caller must hold the interrupt lock.
+ */
+static inline void
+kbase_csf_scheduler_advance_tick_nolock(struct kbase_device *kbdev)
+{
+	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
+
+	lockdep_assert_held(&scheduler->interrupt_lock);
+
+	if (scheduler->tick_timer_active) {
+		scheduler->tick_timer_active = false;
+		queue_work(scheduler->wq, &scheduler->tick_work);
+	}
+}
+
+/**
+ * kbase_csf_scheduler_advance_tick() - Advance the scheduling tick
+ *
+ * @kbdev: Pointer to the device
+ *
+ * This function advances the scheduling tick by enqueing the tick work item for
+ * immediate execution, but only if the tick hrtimer is active. If the timer
+ * is inactive then the tick work item is already in flight.
+ */
+static inline void kbase_csf_scheduler_advance_tick(struct kbase_device *kbdev)
+{
+	struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
+	unsigned long flags;
+
+	spin_lock_irqsave(&scheduler->interrupt_lock, flags);
+	kbase_csf_scheduler_advance_tick_nolock(kbdev);
+	spin_unlock_irqrestore(&scheduler->interrupt_lock, flags);
+}
+
 #endif /* _KBASE_CSF_SCHEDULER_H_ */
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap.c
index 60cae15bc8ef..4b402df2f1c3 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,10 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
+#include <tl/mali_kbase_tracepoints.h>
+
 #include "mali_kbase_csf_tiler_heap.h"
 #include "mali_kbase_csf_tiler_heap_def.h"
 #include "mali_kbase_csf_heap_context_alloc.h"
@@ -337,6 +338,12 @@ static void delete_heap(struct kbase_csf_tiler_heap *heap)
 		heap->gpu_va);
 
 	list_del(&heap->link);
+
+	WARN_ON(heap->chunk_count);
+	KBASE_TLSTREAM_AUX_TILER_HEAP_STATS(kctx->kbdev, kctx->id,
+		heap->heap_id, 0, 0, heap->max_chunks, heap->chunk_size, 0,
+		heap->target_in_flight, 0);
+
 	kfree(heap);
 }
 
@@ -473,11 +480,20 @@ int kbase_csf_tiler_heap_init(struct kbase_context *const kctx,
 			list_first_entry(&heap->chunks_list,
 				struct kbase_csf_tiler_heap_chunk, link);
 
+		kctx->csf.tiler_heaps.nr_of_heaps++;
+		heap->heap_id = kctx->csf.tiler_heaps.nr_of_heaps;
 		list_add(&heap->link, &kctx->csf.tiler_heaps.list);
 
 		*heap_gpu_va = heap->gpu_va;
 		*first_chunk_va = first_chunk->gpu_va;
 
+		KBASE_TLSTREAM_AUX_TILER_HEAP_STATS(
+			kctx->kbdev, kctx->id, heap->heap_id,
+			PFN_UP(heap->chunk_size * heap->max_chunks),
+			PFN_UP(heap->chunk_size * heap->chunk_count),
+			heap->max_chunks, heap->chunk_size, heap->chunk_count,
+			heap->target_in_flight, 0);
+
 		dev_dbg(kctx->kbdev->dev, "Created tiler heap 0x%llX\n",
 			heap->gpu_va);
 	}
@@ -513,49 +529,53 @@ int kbase_csf_tiler_heap_term(struct kbase_context *const kctx,
  * on the settings provided by userspace when the heap was created and the
  * heap's statistics (like number of render passes in-flight).
  *
- * @heap:         Pointer to the tiler heap.
- * @nr_in_flight: Number of render passes that are in-flight, must not be zero.
- * @new_chunk_ptr: Where to store the GPU virtual address & size of the new
- *                 chunk allocated for the heap.
+ * @heap:               Pointer to the tiler heap.
+ * @nr_in_flight:       Number of render passes that are in-flight, must not be zero.
+ * @pending_frag_count: Number of render passes in-flight with completed vertex/tiler stage.
+ *                      The minimum value is zero but it must be less or equal to
+ *                      the total number of render passes in flight
+ * @new_chunk_ptr:      Where to store the GPU virtual address & size of the new
+ *                      chunk allocated for the heap.
  *
  * Return: 0 if a new chunk was allocated otherwise an appropriate negative
  *         error code.
  */
 static int alloc_new_chunk(struct kbase_csf_tiler_heap *heap,
-		u32 nr_in_flight, u64 *new_chunk_ptr)
+		u32 nr_in_flight, u32 pending_frag_count, u64 *new_chunk_ptr)
 {
 	int err = -ENOMEM;
 
 	lockdep_assert_held(&heap->kctx->csf.tiler_heaps.lock);
 
-	if (!nr_in_flight)
+	if (WARN_ON(!nr_in_flight) ||
+		WARN_ON(pending_frag_count > nr_in_flight))
 		return -EINVAL;
 
-	if ((nr_in_flight <= heap->target_in_flight) &&
-	    (heap->chunk_count < heap->max_chunks)) {
-		/* Not exceeded the target number of render passes yet so be
-		 * generous with memory.
-		 */
-		err = create_chunk(heap, false);
-
-		if (likely(!err)) {
-			struct kbase_csf_tiler_heap_chunk *new_chunk =
-							get_last_chunk(heap);
-			if (!WARN_ON(!new_chunk)) {
-				*new_chunk_ptr =
-					encode_chunk_ptr(heap->chunk_size,
-							 new_chunk->gpu_va);
-				return 0;
+	if (nr_in_flight <= heap->target_in_flight) {
+		if (heap->chunk_count < heap->max_chunks) {
+			/* Not exceeded the target number of render passes yet so be
+			 * generous with memory.
+			 */
+			err = create_chunk(heap, false);
+
+			if (likely(!err)) {
+				struct kbase_csf_tiler_heap_chunk *new_chunk =
+								get_last_chunk(heap);
+				if (!WARN_ON(!new_chunk)) {
+					*new_chunk_ptr =
+						encode_chunk_ptr(heap->chunk_size,
+								 new_chunk->gpu_va);
+					return 0;
+				}
 			}
+		} else if (pending_frag_count > 0) {
+			err = -EBUSY;
+		} else {
+			err = -ENOMEM;
 		}
-	}
-
-	/* A new chunk wasn't allocated this time, check if the allocation can
-	 * be retried later.
-	 */
-	if (nr_in_flight > 1) {
-		/* Can retry as there are some ongoing fragment
-		 * jobs which are expected to free up chunks.
+	} else {
+		/* Reached target number of render passes in flight.
+		 * Wait for some of them to finish
 		 */
 		err = -EBUSY;
 	}
@@ -564,7 +584,7 @@ static int alloc_new_chunk(struct kbase_csf_tiler_heap *heap,
 }
 
 int kbase_csf_tiler_heap_alloc_new_chunk(struct kbase_context *kctx,
-	u64 gpu_heap_va, u32 nr_in_flight, u64 *new_chunk_ptr)
+	u64 gpu_heap_va, u32 nr_in_flight, u32 pending_frag_count, u64 *new_chunk_ptr)
 {
 	struct kbase_csf_tiler_heap *heap;
 	int err = -EINVAL;
@@ -574,8 +594,15 @@ int kbase_csf_tiler_heap_alloc_new_chunk(struct kbase_context *kctx,
 	heap = find_tiler_heap(kctx, gpu_heap_va);
 
 	if (likely(heap)) {
-		err = alloc_new_chunk(heap, nr_in_flight,
+		err = alloc_new_chunk(heap, nr_in_flight, pending_frag_count,
 			new_chunk_ptr);
+
+		KBASE_TLSTREAM_AUX_TILER_HEAP_STATS(
+			kctx->kbdev, kctx->id, heap->heap_id,
+			PFN_UP(heap->chunk_size * heap->max_chunks),
+			PFN_UP(heap->chunk_size * heap->chunk_count),
+			heap->max_chunks, heap->chunk_size, heap->chunk_count,
+			heap->target_in_flight, nr_in_flight);
 	}
 
 	mutex_unlock(&kctx->csf.tiler_heaps.lock);
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap.h
index 1a4729df6ca3..683aeca38bc3 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_CSF_TILER_HEAP_H_
@@ -97,11 +96,14 @@ int kbase_csf_tiler_heap_term(struct kbase_context *kctx, u64 gpu_heap_va);
  * It would return an appropriate error code if a new chunk couldn't be
  * allocated.
  *
- * @kctx: Pointer to the kbase context in which the tiler heap was initialized.
- * @gpu_heap_va:  GPU virtual address of the heap context.
- * @nr_in_flight: Number of render passes that are in-flight, must not be zero.
- * @new_chunk_ptr: Where to store the GPU virtual address & size of the new
- *                 chunk allocated for the heap.
+ * @kctx:               Pointer to the kbase context in which the tiler heap was initialized.
+ * @gpu_heap_va:        GPU virtual address of the heap context.
+ * @nr_in_flight:       Number of render passes that are in-flight, must not be zero.
+ * @pending_frag_count: Number of render passes in-flight with completed vertex/tiler stage.
+ *                      The minimum value is zero but it must be less or equal to
+ *                      the total number of render passes in flight
+ * @new_chunk_ptr:      Where to store the GPU virtual address & size of the new
+ *                      chunk allocated for the heap.
  *
  * Return: 0 if a new chunk was allocated otherwise an appropriate negative
  *         error code (like -EBUSY when a free chunk is expected to be
@@ -109,5 +111,5 @@ int kbase_csf_tiler_heap_term(struct kbase_context *kctx, u64 gpu_heap_va);
  *         invalid value was passed for one of the argument).
  */
 int kbase_csf_tiler_heap_alloc_new_chunk(struct kbase_context *kctx,
-	u64 gpu_heap_va, u32 nr_in_flight, u64 *new_chunk_ptr);
+	u64 gpu_heap_va, u32 nr_in_flight, u32 pending_frag_count, u64 *new_chunk_ptr);
 #endif
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_debugfs.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_debugfs.c
index 5d744b81fe4a..0f69500f01ca 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_debugfs.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_debugfs.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "mali_kbase_csf_tiler_heap_debugfs.h"
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_debugfs.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_debugfs.h
index 44c580d82068..65dfaf701845 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_debugfs.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_debugfs.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_CSF_TILER_HEAP_DEBUGFS_H_
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_def.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_def.h
index 1f9e208904a9..0bf655178fae 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_def.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tiler_heap_def.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_CSF_TILER_HEAP_DEF_H_
@@ -97,6 +96,8 @@ struct kbase_csf_tiler_heap_chunk {
  * @gpu_va:          The GPU virtual address of the heap context structure that
  *                   was allocated for the firmware. This is also used to
  *                   uniquely identify the heap.
+ * @heap_id:         Unique id representing the heap, assigned during heap
+ *                   initialization.
  * @chunks_list:     Linked list of allocated chunks.
  */
 struct kbase_csf_tiler_heap {
@@ -107,6 +108,7 @@ struct kbase_csf_tiler_heap {
 	u32 max_chunks;
 	u16 target_in_flight;
 	u64 gpu_va;
+	u64 heap_id;
 	struct list_head chunks_list;
 };
 #endif /* !_KBASE_CSF_TILER_HEAP_DEF_H_ */
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_timeout.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_timeout.c
index 495ff2850500..854aad581318 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_timeout.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_timeout.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <linux/kernel.h>
@@ -30,13 +29,13 @@
 #include "mali_kbase_config_defaults.h"
 #include "mali_kbase_csf_firmware.h"
 #include "mali_kbase_csf_timeout.h"
+#include "mali_kbase_reset_gpu.h"
 #include "backend/gpu/mali_kbase_pm_internal.h"
 
 /**
  * set_timeout - set a new global progress timeout.
  *
- * @kbdev:   Instance of a GPU platform device that implements a command
- *           stream front-end interface.
+ * @kbdev:   Instance of a GPU platform device that implements a CSF interface.
  * @timeout: the maximum number of GPU cycles without forward progress to allow
  *           to elapse before terminating a GPU command queue group.
  *
@@ -66,6 +65,9 @@ static int set_timeout(struct kbase_device *const kbdev, u64 const timeout)
  *
  * This function is called when the progress_timeout sysfs file is written to.
  * It checks the data written, and if valid updates the progress timeout value.
+ * The function also checks gpu reset status, if the gpu is in reset process,
+ * the function will return an error code (-EBUSY), and no change for timeout
+ * value.
  *
  * Return: @count if the function succeeded. An error code on failure.
  */
@@ -80,15 +82,21 @@ static ssize_t progress_timeout_store(struct device * const dev,
 	if (!kbdev)
 		return -ENODEV;
 
-	err = kstrtou64(buf, 0, &timeout);
+	err = kbase_reset_gpu_try_prevent(kbdev);
 	if (err) {
+		dev_warn(kbdev->dev,
+			 "Couldn't process progress_timeout write operation for GPU reset.\n");
+		return -EBUSY;
+	}
+
+	err = kstrtou64(buf, 0, &timeout);
+	if (err)
 		dev_err(kbdev->dev,
 			"Couldn't process progress_timeout write operation.\n"
 			"Use format <progress_timeout>\n");
-		return err;
-	}
+	else
+		err = set_timeout(kbdev, timeout);
 
-	err = set_timeout(kbdev, timeout);
 	if (!err) {
 		kbase_csf_scheduler_pm_active(kbdev);
 
@@ -99,6 +107,7 @@ static ssize_t progress_timeout_store(struct device * const dev,
 		kbase_csf_scheduler_pm_idle(kbdev);
 	}
 
+	kbase_reset_gpu_allow(kbdev);
 	if (err)
 		return err;
 
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_timeout.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_timeout.h
index d0156c09a60f..48c71818a0ab 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_timeout.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_timeout.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_CSF_TIMEOUT_H_
@@ -28,8 +27,8 @@ struct kbase_device;
 /**
  * kbase_csf_timeout_init - Initialize the progress timeout.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface. Must be zero-initialized.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
+ *         Must be zero-initialized.
  *
  * The progress timeout is the number of GPU clock cycles allowed to elapse
  * before the driver terminates a GPU command queue group in which a task is
@@ -46,8 +45,7 @@ int kbase_csf_timeout_init(struct kbase_device *kbdev);
 /**
  * kbase_csf_timeout_term - Terminate the progress timeout.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  *
  * Removes the sysfs file which allowed the timeout to be reconfigured.
  * Does nothing if called on a zero-initialized object.
@@ -57,8 +55,7 @@ void kbase_csf_timeout_term(struct kbase_device *kbdev);
 /**
  * kbase_csf_timeout_get - get the current global progress timeout.
  *
- * @kbdev: Instance of a GPU platform device that implements a command
- *         stream front-end interface.
+ * @kbdev: Instance of a GPU platform device that implements a CSF interface.
  *
  * Return: the maximum number of GPU cycles that is allowed to elapse without
  *         forward progress before the driver terminates a GPU command queue
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tl_reader.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tl_reader.c
index 5079a8e5af8c..de292c1d0ca2 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tl_reader.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tl_reader.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "mali_kbase_csf_tl_reader.h"
@@ -40,18 +39,18 @@
 #include "tl/mali_kbase_timeline_priv.h"
 #include <linux/debugfs.h>
 
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0))
+#if (KERNEL_VERSION(4, 7, 0) > LINUX_VERSION_CODE)
 #define DEFINE_DEBUGFS_ATTRIBUTE DEFINE_SIMPLE_ATTRIBUTE
 #endif
 #endif
 
-/** Name of the CSFFW timeline tracebuffer. */
+/* Name of the CSFFW timeline tracebuffer. */
 #define KBASE_CSFFW_TRACEBUFFER_NAME "timeline"
-/** Name of the timeline header metatadata */
+/* Name of the timeline header metatadata */
 #define KBASE_CSFFW_TIMELINE_HEADER_NAME "timeline_header"
 
 /**
- * CSFFW timeline message.
+ * struct kbase_csffw_tl_message - CSFFW timeline message.
  *
  * @msg_id: Message ID.
  * @timestamp: Timestamp of the event.
@@ -130,6 +129,7 @@ static void get_cpu_gpu_time(
  * kbase_ts_converter_init() - Initialize system timestamp converter.
  *
  * @self:	System Timestamp Converter instance.
+ * @kbdev:	Kbase device pointer
  *
  * Return: Zero on success, -1 otherwise.
  */
@@ -253,8 +253,9 @@ static void tl_reader_reset(struct kbase_csf_tl_reader *self)
 	self->tl_header.btc = 0;
 }
 
-void kbase_csf_tl_reader_flush_buffer(struct kbase_csf_tl_reader *self)
+int kbase_csf_tl_reader_flush_buffer(struct kbase_csf_tl_reader *self)
 {
+	int ret = 0;
 	struct kbase_device *kbdev = self->kbdev;
 	struct kbase_tlstream *stream = self->stream;
 
@@ -273,7 +274,7 @@ void kbase_csf_tl_reader_flush_buffer(struct kbase_csf_tl_reader *self)
 	/* If not running, early exit. */
 	if (!self->is_active) {
 		spin_unlock_irqrestore(&self->read_lock, flags);
-		return;
+		return -EBUSY;
 	}
 
 	/* Copying the whole buffer in a single shot. We assume
@@ -297,6 +298,7 @@ void kbase_csf_tl_reader_flush_buffer(struct kbase_csf_tl_reader *self)
 			dev_warn(
 				kbdev->dev,
 				"Unable to parse CSFFW tracebuffer event header.");
+				ret = -EBUSY;
 			break;
 		}
 
@@ -317,6 +319,7 @@ void kbase_csf_tl_reader_flush_buffer(struct kbase_csf_tl_reader *self)
 			dev_warn(kbdev->dev,
 				"event_id: %u, can't read with event_size: %u.",
 				event_id, event_size);
+				ret = -EBUSY;
 			break;
 		}
 
@@ -338,6 +341,7 @@ void kbase_csf_tl_reader_flush_buffer(struct kbase_csf_tl_reader *self)
 	}
 
 	spin_unlock_irqrestore(&self->read_lock, flags);
+	return ret;
 }
 
 static void kbasep_csf_tl_reader_read_callback(struct timer_list *timer)
@@ -420,39 +424,18 @@ static int tl_reader_init_late(
  * Update the first bit of a CSFFW tracebufer and then reset the GPU.
  * This is to make these changes visible to the MCU.
  *
- * Return: 0 on success, -EAGAIN if a GPU reset was in progress.
+ * Return: 0 on success, or negative error code for failure.
  */
 static int tl_reader_update_enable_bit(
 	struct kbase_csf_tl_reader *self,
 	bool value)
 {
-	struct kbase_device *kbdev = self->kbdev;
-	unsigned long flags;
+	int err = 0;
 
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	/* If there is already a GPU reset pending then inform
-	 * the User to retry the update.
-	 */
-	if (kbase_reset_gpu_silent(kbdev)) {
-		spin_unlock_irqrestore(
-			&kbdev->hwaccess_lock, flags);
-		dev_warn(
-			kbdev->dev,
-			"GPU reset already in progress when enabling firmware timeline.");
-		return -EAGAIN;
-	}
-
-	/* GPU reset request has been placed, now update the
-	 * firmware image. GPU reset will take place only after
-	 * hwaccess_lock is released.
-	 */
-	kbase_csf_firmware_trace_buffer_update_trace_enable_bit(
+	err = kbase_csf_firmware_trace_buffer_update_trace_enable_bit(
 		self->trace_buffer, 0, value);
 
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	return 0;
+	return err;
 }
 
 void kbase_csf_tl_reader_init(struct kbase_csf_tl_reader *self,
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tl_reader.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tl_reader.h
index f5ce9d629f55..c691871cbdc5 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tl_reader.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_tl_reader.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_CSFFW_TL_READER_H_
@@ -27,13 +26,13 @@
 #include <linux/timer.h>
 #include <asm/page.h>
 
-/** The number of pages used for CSFFW trace buffer. Can be tweaked. */
-#define KBASE_CSF_TL_BUFFER_NR_PAGES 4
-/** CSFFW Timeline read polling minimum period in milliseconds. */
+/* The number of pages used for CSFFW trace buffer. Can be tweaked. */
+#define KBASE_CSF_TL_BUFFER_NR_PAGES 128
+/* CSFFW Timeline read polling minimum period in milliseconds. */
 #define KBASE_CSF_TL_READ_INTERVAL_MIN 20
-/** CSFFW Timeline read polling default period in milliseconds. */
+/* CSFFW Timeline read polling default period in milliseconds. */
 #define KBASE_CSF_TL_READ_INTERVAL_DEFAULT 200
-/** CSFFW Timeline read polling maximum period in milliseconds. */
+/* CSFFW Timeline read polling maximum period in milliseconds. */
 #define KBASE_CSF_TL_READ_INTERVAL_MAX (60*1000)
 
 struct firmware_trace_buffer;
@@ -41,6 +40,7 @@ struct kbase_tlstream;
 struct kbase_device;
 
 /**
+ * struct kbase_ts_converter -
  * System timestamp to CPU timestamp converter state.
  *
  * @multiplier:	Numerator of the converter's fraction.
@@ -80,6 +80,7 @@ struct kbase_ts_converter {
  *                     is copied.
  * @kbdev:             KBase device.
  * @trace_buffer:      CSF Firmware timeline tracebuffer.
+ * @tl_header:         CSFFW Timeline header
  * @tl_header.data:    CSFFW Timeline header content.
  * @tl_header.size:    CSFFW Timeline header size.
  * @tl_header.btc:     CSFFW Timeline header remaining bytes to copy to
@@ -92,6 +93,7 @@ struct kbase_ts_converter {
  *                     is only valid when got_first_event is true.
  * @read_buffer:       Temporary buffer used for CSFFW timeline data
  *                     reading from the tracebufer.
+ * @read_lock:         CSFFW timeline reader lock.
  */
 struct kbase_csf_tl_reader {
 	struct timer_list read_timer;
@@ -136,9 +138,11 @@ void kbase_csf_tl_reader_term(struct kbase_csf_tl_reader *self);
  *   Flush trace from buffer into CSFFW timeline stream.
  *
  * @self:    CSFFW TL Reader instance.
+ *
+ * Return: Zero on success, negative error code (EBUSY) otherwise
  */
 
-void kbase_csf_tl_reader_flush_buffer(struct kbase_csf_tl_reader *self);
+int kbase_csf_tl_reader_flush_buffer(struct kbase_csf_tl_reader *self);
 
 /**
  * kbase_csf_tl_reader_start() -
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_trace_buffer.c b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_trace_buffer.c
index 4d68766b8b9a..afcc90b39b54 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_trace_buffer.c
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_trace_buffer.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "mali_kbase.h"
@@ -30,6 +29,12 @@
 #include <linux/list.h>
 #include <linux/mman.h>
 
+#ifdef CONFIG_DEBUG_FS
+#if (KERNEL_VERSION(4, 7, 0) > LINUX_VERSION_CODE)
+#define DEFINE_DEBUGFS_ATTRIBUTE DEFINE_SIMPLE_ATTRIBUTE
+#endif
+#endif
+
 /**
  * struct firmware_trace_buffer - Trace Buffer within the MCU firmware
  *
@@ -43,25 +48,28 @@
  * @node:         List head linking all trace buffers to
  *                kbase_device:csf.firmware_trace_buffers
  * @data_mapping: MCU shared memory mapping used for the data buffer.
+ * @updatable:    Indicates whether config items can be updated with
+ *                FIRMWARE_CONFIG_UPDATE
  * @type:         The type of the trace buffer.
  * @trace_enable_entry_count: Number of Trace Enable bits.
- * @gpu_va:       Structure containing all the Firmware addresses
- *                that are accessed by the MCU.
- * @size_address:    The address where the MCU shall read the size of
- *                   the data buffer.
- * @insert_address:  The address that shall be dereferenced by the MCU
- *                   to write the Insert offset.
- * @extract_address: The address that shall be dereferenced by the MCU
- *                   to read the Extract offset.
- * @data_address:    The address that shall be dereferenced by the MCU
- *                   to write the Trace Buffer.
- * @trace_enable:    The address where the MCU shall read the array of
- *                   Trace Enable bits describing which trace points
- *                   and features shall be enabled.
- * @cpu_va:          Structure containing CPU addresses of variables which
- *                   are permanently mapped on the CPU address space.
- * @insert_cpu_va:   CPU virtual address of the Insert variable.
- * @extract_cpu_va:  CPU virtual address of the Extract variable.
+ * @gpu_va:                 Structure containing all the Firmware addresses
+ *                          that are accessed by the MCU.
+ * @gpu_va.size_address:    The address where the MCU shall read the size of
+ *                          the data buffer.
+ * @gpu_va.insert_address:  The address that shall be dereferenced by the MCU
+ *                          to write the Insert offset.
+ * @gpu_va.extract_address: The address that shall be dereferenced by the MCU
+ *                          to read the Extract offset.
+ * @gpu_va.data_address:    The address that shall be dereferenced by the MCU
+ *                          to write the Trace Buffer.
+ * @gpu_va.trace_enable:    The address where the MCU shall read the array of
+ *                          Trace Enable bits describing which trace points
+ *                          and features shall be enabled.
+ * @cpu_va:                 Structure containing CPU addresses of variables
+ *                          which are permanently mapped on the CPU address
+ *                          space.
+ * @cpu_va.insert_cpu_va:   CPU virtual address of the Insert variable.
+ * @cpu_va.extract_cpu_va:  CPU virtual address of the Extract variable.
  * @num_pages: Size of the data buffer, in pages.
  * @trace_enable_init_mask: Initial value for the trace enable bit mask.
  * @name:  NULL terminated string which contains the name of the trace buffer.
@@ -70,6 +78,7 @@ struct firmware_trace_buffer {
 	struct kbase_device *kbdev;
 	struct list_head node;
 	struct kbase_csf_mapping data_mapping;
+	bool updatable;
 	u32 type;
 	u32 trace_enable_entry_count;
 	struct gpu_va {
@@ -106,7 +115,7 @@ struct firmware_trace_buffer_data {
 	size_t size;
 };
 
-/**
+/*
  * Table of configuration data for trace buffers.
  *
  * This table contains the configuration data for the trace buffers that are
@@ -244,7 +253,9 @@ void kbase_csf_firmware_trace_buffers_term(struct kbase_device *kbdev)
 }
 
 int kbase_csf_firmware_parse_trace_buffer_entry(struct kbase_device *kbdev,
-		const u32 *entry, unsigned int size)
+						const u32 *entry,
+						unsigned int size,
+						bool updatable)
 {
 	const char *name = (char *)&entry[7];
 	const unsigned int name_len = size - TRACE_BUFFER_ENTRY_NAME_OFFSET;
@@ -268,6 +279,7 @@ int kbase_csf_firmware_parse_trace_buffer_entry(struct kbase_device *kbdev,
 			unsigned int j;
 
 			trace_buffer->kbdev = kbdev;
+			trace_buffer->updatable = updatable;
 			trace_buffer->type = entry[0];
 			trace_buffer->gpu_va.size_address = entry[1];
 			trace_buffer->gpu_va.insert_address = entry[2];
@@ -386,9 +398,13 @@ unsigned int kbase_csf_firmware_trace_buffer_get_trace_enable_bits_count(
 }
 EXPORT_SYMBOL(kbase_csf_firmware_trace_buffer_get_trace_enable_bits_count);
 
-void kbase_csf_firmware_trace_buffer_update_trace_enable_bit(
+static void kbasep_csf_firmware_trace_buffer_update_trace_enable_bit(
 	struct firmware_trace_buffer *tb, unsigned int bit, bool value)
 {
+	struct kbase_device *kbdev = tb->kbdev;
+
+	lockdep_assert_held(&kbdev->hwaccess_lock);
+
 	if (bit < tb->trace_enable_entry_count) {
 		unsigned int trace_enable_reg_offset = bit >> 5;
 		u32 trace_enable_bit_mask = 1u << (bit & 0x1F);
@@ -408,11 +424,48 @@ void kbase_csf_firmware_trace_buffer_update_trace_enable_bit(
 		 * trace buffers, since firmware could continue to use the
 		 * value of bitmask it cached after the boot.
 		 */
-		kbase_csf_update_firmware_memory(tb->kbdev,
-			tb->gpu_va.trace_enable + trace_enable_reg_offset*4,
+		kbase_csf_update_firmware_memory(
+			kbdev,
+			tb->gpu_va.trace_enable + trace_enable_reg_offset * 4,
 			tb->trace_enable_init_mask[trace_enable_reg_offset]);
 	}
 }
+
+int kbase_csf_firmware_trace_buffer_update_trace_enable_bit(
+	struct firmware_trace_buffer *tb, unsigned int bit, bool value)
+{
+	struct kbase_device *kbdev = tb->kbdev;
+	int err = 0;
+	unsigned long flags;
+
+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+
+	/* If trace buffer update cannot be performed with
+	 * FIRMWARE_CONFIG_UPDATE then we need to do a
+	 * silent reset before we update the memory.
+	 */
+	if (!tb->updatable) {
+		/* If there is already a GPU reset pending then inform
+		 * the User to retry the update.
+		 */
+		if (kbase_reset_gpu_silent(kbdev)) {
+			dev_warn(
+				kbdev->dev,
+				"GPU reset already in progress when enabling firmware timeline.");
+			spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+			return -EAGAIN;
+		}
+	}
+
+	kbasep_csf_firmware_trace_buffer_update_trace_enable_bit(tb, bit,
+								 value);
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+
+	if (tb->updatable)
+		err = kbase_csf_trigger_firmware_config_update(kbdev);
+
+	return err;
+}
 EXPORT_SYMBOL(kbase_csf_firmware_trace_buffer_update_trace_enable_bit);
 
 bool kbase_csf_firmware_trace_buffer_is_empty(
@@ -479,8 +532,8 @@ static void update_trace_buffer_active_mask64(struct firmware_trace_buffer *tb,
 	unsigned int i;
 
 	for (i = 0; i < tb->trace_enable_entry_count; i++)
-		kbase_csf_firmware_trace_buffer_update_trace_enable_bit(tb, i,
-							(mask >> i) & 1);
+		kbasep_csf_firmware_trace_buffer_update_trace_enable_bit(
+			tb, i, (mask >> i) & 1);
 }
 
 static int set_trace_buffer_active_mask64(struct firmware_trace_buffer *tb,
@@ -490,13 +543,25 @@ static int set_trace_buffer_active_mask64(struct firmware_trace_buffer *tb,
 	unsigned long flags;
 	int err = 0;
 
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	/* If there is already a GPU reset pending, need a retry */
-	if (kbase_reset_gpu_silent(kbdev))
-		err = -EAGAIN;
-	else
+	if (!tb->updatable) {
+		/* If there is already a GPU reset pending, need a retry */
+		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+		if (kbase_reset_gpu_silent(kbdev))
+			err = -EAGAIN;
+		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+	}
+
+	if (!err) {
+		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
 		update_trace_buffer_active_mask64(tb, mask);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+
+		/* if we can update the config we need to just trigger
+		 * FIRMWARE_CONFIG_UPDATE.
+		 */
+		if (tb->updatable)
+			err = kbase_csf_trigger_firmware_config_update(kbdev);
+	}
 
 	return err;
 }
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_trace_buffer.h b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_trace_buffer.h
index 2cac55e0664d..e6babef9250c 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_trace_buffer.h
+++ b/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_trace_buffer.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_CSF_TRACE_BUFFER_H_
@@ -76,12 +75,15 @@ void kbase_csf_firmware_trace_buffers_term(struct kbase_device *kbdev);
  *
  * Return: 0 if successful, negative error code on failure.
  *
- * @kbdev: Kbase device structure
- * @entry: Pointer to the section
- * @size:  Size (in bytes) of the section
+ * @kbdev:     Kbase device structure
+ * @entry:     Pointer to the section
+ * @size:      Size (in bytes) of the section
+ * @updatable: Indicates whether config items can be updated with FIRMWARE_CONFIG_UPDATE
  */
 int kbase_csf_firmware_parse_trace_buffer_entry(struct kbase_device *kbdev,
-		const u32 *entry, unsigned int size);
+						const u32 *entry,
+						unsigned int size,
+						bool updatable);
 
 /**
  * kbase_csf_firmware_reload_trace_buffers_data -
@@ -134,9 +136,12 @@ unsigned int kbase_csf_firmware_trace_buffer_get_trace_enable_bits_count(
  * @trace_buffer: Trace buffer handle
  * @bit:          Bit to update
  * @value:        New value for the given bit
+ *
+ * Return: 0 if successful, negative error code on failure.
  */
-void kbase_csf_firmware_trace_buffer_update_trace_enable_bit(
-	struct firmware_trace_buffer *trace_buffer, unsigned int bit, bool value);
+int kbase_csf_firmware_trace_buffer_update_trace_enable_bit(
+	struct firmware_trace_buffer *trace_buffer, unsigned int bit,
+	bool value);
 
 /**
  * kbase_csf_firmware_trace_buffer_is_empty - Empty trace buffer predicate
diff --git a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_codes_csf.h b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_codes_csf.h
index 32181d711193..7ed62aa02972 100644
--- a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_codes_csf.h
+++ b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_codes_csf.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -109,6 +108,46 @@ int dummy_array[] = {
 	KBASE_KTRACE_CODE_MAKE_CODE(QUEUE_START),
 	KBASE_KTRACE_CODE_MAKE_CODE(QUEUE_STOP),
 
+	/*
+	 * KCPU queue events
+	 */
+	/* KTrace info_val == KCPU queue fence context
+	 * KCPU extra_info_val == N/A.
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(KCPU_QUEUE_NEW),
+	/* KTrace info_val == Number of pending commands in KCPU queue when
+	 * it is destroyed.
+	 * KCPU extra_info_val == Number of CQS wait operations present in
+	 * the KCPU queue when it is destroyed.
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(KCPU_QUEUE_DESTROY),
+	/* KTrace info_val == CQS event memory address
+	 * KCPU extra_info_val == Upper 32 bits of event memory, i.e. contents
+	 * of error field.
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(CQS_SET),
+	/* KTrace info_val == Number of CQS objects to be waited upon
+	 * KCPU extra_info_val == N/A.
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(CQS_WAIT_START),
+	/* KTrace info_val == CQS event memory address
+	 * KCPU extra_info_val == 1 if CQS was signaled with an error and queue
+	 * inherited the error, otherwise 0.
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(CQS_WAIT_END),
+	/* KTrace info_val == Fence context
+	 * KCPU extra_info_val == Fence seqno.
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(FENCE_SIGNAL),
+	/* KTrace info_val == Fence context
+	 * KCPU extra_info_val == Fence seqno.
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(FENCE_WAIT_START),
+	/* KTrace info_val == Fence context
+	 * KCPU extra_info_val == Fence seqno.
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(FENCE_WAIT_END),
+
 #if 0 /* Dummy section to avoid breaking formatting */
 };
 #endif
diff --git a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_codes_jm.h b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_codes_jm.h
index b201e49bd0f2..a616f2bc492d 100644
--- a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_codes_jm.h
+++ b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_codes_jm.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2011-2015,2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2015, 2018-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
diff --git a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_csf.c b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_csf.c
index 2ea901b666c2..9183520a33f0 100644
--- a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_csf.c
+++ b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_csf.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,9 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
+
 #include <mali_kbase.h>
 #include "debug/mali_kbase_debug_ktrace_internal.h"
 #include "debug/backend/mali_kbase_debug_ktrace_csf.h"
@@ -28,30 +28,30 @@
 void kbasep_ktrace_backend_format_header(char *buffer, int sz, s32 *written)
 {
 	*written += MAX(snprintf(buffer + *written, MAX(sz - *written, 0),
-			"group,slot,prio,csi"), 0);
+			"group,slot,prio,csi,kcpu"), 0);
 }
 
 void kbasep_ktrace_backend_format_msg(struct kbase_ktrace_msg *trace_msg,
 		char *buffer, int sz, s32 *written)
 {
-	const struct kbase_ktrace_backend * const be_msg = &trace_msg->backend;
+	const union kbase_ktrace_backend * const be_msg = &trace_msg->backend;
 	/* At present, no need to check for KBASE_KTRACE_FLAG_BACKEND, as the
 	 * other backend-specific flags currently imply this anyway
 	 */
 
 	/* group parts */
-	if (be_msg->flags & KBASE_KTRACE_FLAG_CSF_GROUP) {
-		const s8 slot = be_msg->csg_nr;
+	if (be_msg->gpu.flags & KBASE_KTRACE_FLAG_CSF_GROUP) {
+		const s8 slot = be_msg->gpu.csg_nr;
 		/* group,slot, */
 		*written += MAX(snprintf(buffer + *written,
 				MAX(sz - *written, 0),
-				"%u,%d,", be_msg->group_handle, slot), 0);
+				"%u,%d,", be_msg->gpu.group_handle, slot), 0);
 
 		/* prio */
 		if (slot >= 0)
 			*written += MAX(snprintf(buffer + *written,
 					MAX(sz - *written, 0),
-					"%u", be_msg->slot_prio), 0);
+					"%u", be_msg->gpu.slot_prio), 0);
 
 		/* , */
 		*written += MAX(snprintf(buffer + *written,
@@ -65,10 +65,24 @@ void kbasep_ktrace_backend_format_msg(struct kbase_ktrace_msg *trace_msg,
 	}
 
 	/* queue parts: csi */
-	if (trace_msg->backend.flags & KBASE_KTRACE_FLAG_CSF_QUEUE)
+	if (trace_msg->backend.gpu.flags & KBASE_KTRACE_FLAG_CSF_QUEUE)
 		*written += MAX(snprintf(buffer + *written,
 				MAX(sz - *written, 0),
-				"%d", be_msg->csi_index), 0);
+				"%d", be_msg->gpu.csi_index), 0);
+
+	/* , */
+	*written += MAX(snprintf(buffer + *written,
+				MAX(sz - *written, 0),
+				","), 0);
+
+	if (be_msg->gpu.flags & KBASE_KTRACE_FLAG_CSF_KCPU) {
+		/* kcpu data */
+		*written += MAX(snprintf(buffer + *written,
+				MAX(sz - *written, 0),
+				"kcpu %d (0x%llx)",
+				be_msg->kcpu.id,
+				be_msg->kcpu.extra_info_val), 0);
+	}
 
 	/* Don't end with a trailing "," - this is a 'standalone' formatted
 	 * msg, caller will handle the delimiters
@@ -95,14 +109,14 @@ void kbasep_ktrace_add_csf(struct kbase_device *kbdev,
 	else if (queue)
 		kctx = queue->kctx;
 
-	/* Fill the common part of the message (including backend.flags) */
+	/* Fill the common part of the message (including backend.gpu.flags) */
 	kbasep_ktrace_msg_init(&kbdev->ktrace, trace_msg, code, kctx, flags,
 			info_val);
 
 	/* Indicate to the common code that backend-specific parts will be
 	 * valid
 	 */
-	trace_msg->backend.flags |= KBASE_KTRACE_FLAG_BACKEND;
+	trace_msg->backend.gpu.flags |= KBASE_KTRACE_FLAG_BACKEND;
 
 	/* Fill the CSF-specific parts of the message
 	 *
@@ -111,30 +125,66 @@ void kbasep_ktrace_add_csf(struct kbase_device *kbdev,
 	 */
 
 	if (queue) {
-		trace_msg->backend.flags |= KBASE_KTRACE_FLAG_CSF_QUEUE;
-		trace_msg->backend.csi_index = queue->csi_index;
+		trace_msg->backend.gpu.flags |= KBASE_KTRACE_FLAG_CSF_QUEUE;
+		trace_msg->backend.gpu.csi_index = queue->csi_index;
 	}
 
 	if (group) {
 		const s8 slot = group->csg_nr;
 
-		trace_msg->backend.flags |= KBASE_KTRACE_FLAG_CSF_GROUP;
+		trace_msg->backend.gpu.flags |= KBASE_KTRACE_FLAG_CSF_GROUP;
 
-		trace_msg->backend.csg_nr = slot;
+		trace_msg->backend.gpu.csg_nr = slot;
 
 		if (slot >= 0) {
-			struct kbase_csf_csg_slot *csg_slot = &kbdev->csf.scheduler.csg_slots[slot];
+			struct kbase_csf_csg_slot *csg_slot =
+				&kbdev->csf.scheduler.csg_slots[slot];
 
-			trace_msg->backend.slot_prio = csg_slot->priority;
+			trace_msg->backend.gpu.slot_prio =
+				csg_slot->priority;
 		}
 		/* slot >=0 indicates whether slot_prio valid, so no need to
 		 * initialize in the case where it's invalid
 		 */
 
-		trace_msg->backend.group_handle = group->handle;
+		trace_msg->backend.gpu.group_handle = group->handle;
 	}
 
-	WARN_ON((trace_msg->backend.flags & ~KBASE_KTRACE_FLAG_ALL));
+	WARN_ON((trace_msg->backend.gpu.flags & ~KBASE_KTRACE_FLAG_ALL));
+
+	/* Done */
+	spin_unlock_irqrestore(&kbdev->ktrace.lock, irqflags);
+}
+
+void kbasep_ktrace_add_csf_kcpu(struct kbase_device *kbdev,
+				enum kbase_ktrace_code code,
+				struct kbase_kcpu_command_queue *queue,
+				u64 info_val1, u64 info_val2)
+{
+	unsigned long irqflags;
+	struct kbase_ktrace_msg *trace_msg;
+	struct kbase_context *kctx = queue->kctx;
+
+	spin_lock_irqsave(&kbdev->ktrace.lock, irqflags);
+
+	/* Reserve and update indices */
+	trace_msg = kbasep_ktrace_reserve(&kbdev->ktrace);
+
+	/* Fill the common part of the message */
+	kbasep_ktrace_msg_init(&kbdev->ktrace, trace_msg, code, kctx, 0,
+		info_val1);
+
+	/* Indicate to the common code that backend-specific parts will be
+	 * valid
+	 */
+	trace_msg->backend.gpu.flags |= KBASE_KTRACE_FLAG_BACKEND;
+
+	/* Fill the KCPU-specific parts of the message */
+	trace_msg->backend.kcpu.id = queue->id;
+	trace_msg->backend.kcpu.extra_info_val = info_val2;
+	trace_msg->backend.gpu.flags |= KBASE_KTRACE_FLAG_CSF_KCPU;
+
+	WARN_ON((trace_msg->backend.gpu.flags & ~KBASE_KTRACE_FLAG_ALL));
 
 	/* Done */
 	spin_unlock_irqrestore(&kbdev->ktrace.lock, irqflags);
diff --git a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_csf.h b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_csf.h
index b055ff82a116..62cd1bca1292 100644
--- a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_csf.h
+++ b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_csf.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_DEBUG_KTRACE_CSF_H_
@@ -28,8 +27,7 @@
  */
 #if KBASE_KTRACE_TARGET_RBUF
 /**
- * kbasep_ktrace_add_csf - internal function to add trace about Command Stream
- *                        Frontend
+ * kbasep_ktrace_add_csf - internal function to add trace about CSF
  * @kbdev:    kbase device
  * @code:     trace code
  * @group:    queue group, or NULL if no queue group
@@ -45,9 +43,33 @@ void kbasep_ktrace_add_csf(struct kbase_device *kbdev,
 		struct kbase_queue *queue, kbase_ktrace_flag_t flags,
 		u64 info_val);
 
+/**
+ * kbasep_ktrace_add_csf_kcpu - internal function to add trace about the CSF
+ *				KCPU queues.
+ * @kbdev:      kbase device
+ * @code:       trace code
+ * @queue:      queue, or NULL if no queue
+ * @info_val1:  Main infoval variable with information based on the KCPU
+ *              ktrace call. Refer to mali_kbase_debug_ktrace_codes_csf.h
+ *              for information on the infoval values.
+ * @info_val2:  Extra infoval variable with information based on the KCPU
+ *              ktrace call. Refer to mali_kbase_debug_ktrace_codes_csf.h
+ *              for information on the infoval values.
+ *
+ * PRIVATE: do not use directly. Use KBASE_KTRACE_ADD_CSF_KCPU() instead.
+ */
+void kbasep_ktrace_add_csf_kcpu(struct kbase_device *kbdev,
+				enum kbase_ktrace_code code,
+				struct kbase_kcpu_command_queue *queue,
+				u64 info_val1, u64 info_val2);
+
 #define KBASE_KTRACE_RBUF_ADD_CSF(kbdev, code, group, queue, flags, info_val) \
 	kbasep_ktrace_add_csf(kbdev, KBASE_KTRACE_CODE(code), group, queue, \
-			flags, info_val)
+	flags, info_val)
+
+#define KBASE_KTRACE_RBUF_ADD_CSF_KCPU(kbdev, code, queue, info_val1, \
+	info_val2) kbasep_ktrace_add_csf_kcpu(kbdev, KBASE_KTRACE_CODE(code), \
+	queue, info_val1, info_val2)
 
 #else /* KBASE_KTRACE_TARGET_RBUF */
 
@@ -56,12 +78,21 @@ void kbasep_ktrace_add_csf(struct kbase_device *kbdev,
 		CSTD_UNUSED(kbdev);\
 		CSTD_NOP(code);\
 		CSTD_UNUSED(group);\
-		CSTD_UNUSED(queue);		\
+		CSTD_UNUSED(queue);\
 		CSTD_UNUSED(flags);\
 		CSTD_UNUSED(info_val);\
 		CSTD_NOP(0);\
 	} while (0)
 
+#define KBASE_KTRACE_RBUF_ADD_CSF_KCPU(kbdev, code, queue, info_val1, info_val2) \
+	do {\
+		CSTD_UNUSED(kbdev);\
+		CSTD_NOP(code);\
+		CSTD_UNUSED(queue);\
+		CSTD_UNUSED(info_val1);\
+		CSTD_UNUSED(info_val2);\
+	} while (0)
+
 #endif /* KBASE_KTRACE_TARGET_RBUF */
 
 /*
@@ -75,6 +106,9 @@ void kbasep_ktrace_add_csf(struct kbase_device *kbdev,
 #define KBASE_KTRACE_FTRACE_ADD_CSF(kbdev, code, group, queue, info_val) \
 	trace_mali_##code(kbdev, group, queue, info_val)
 
+#define KBASE_KTRACE_FTRACE_ADD_KCPU(code, queue, info_val1, info_val2) \
+	trace_mali_##code(queue, info_val1, info_val2)
+
 #else /* KBASE_KTRACE_TARGET_FTRACE */
 
 #define KBASE_KTRACE_FTRACE_ADD_CSF(kbdev, code, group, queue, info_val) \
@@ -87,6 +121,14 @@ void kbasep_ktrace_add_csf(struct kbase_device *kbdev,
 		CSTD_NOP(0);\
 	} while (0)
 
+#define KBASE_KTRACE_FTRACE_ADD_KCPU(code, queue, info_val1, info_val2) \
+	do {\
+		CSTD_NOP(code);\
+		CSTD_UNUSED(queue);\
+		CSTD_UNUSED(info_val1);\
+		CSTD_UNUSED(info_val2);\
+	} while (0)
+
 #endif /* KBASE_KTRACE_TARGET_FTRACE */
 
 /*
@@ -109,7 +151,7 @@ void kbasep_ktrace_add_csf(struct kbase_device *kbdev,
  */
 #define KBASE_KTRACE_ADD_CSF_GRP(kbdev, code, group, info_val) \
 	do { \
-		/* capture values that could come from non-pure function calls */ \
+		/* capture values that could come from non-pure fn calls */ \
 		struct kbase_queue_group *__group = group; \
 		u64 __info_val = info_val; \
 		KBASE_KTRACE_RBUF_ADD_CSF(kbdev, code, __group, NULL, 0u, \
@@ -135,7 +177,7 @@ void kbasep_ktrace_add_csf(struct kbase_device *kbdev,
  */
 #define KBASE_KTRACE_ADD_CSF_GRP_Q(kbdev, code, group, queue, info_val) \
 	do { \
-		/* capture values that could come from non-pure function calls */ \
+		/* capture values that could come from non-pure fn calls */ \
 		struct kbase_queue_group *__group = group; \
 		struct kbase_queue *__queue = queue; \
 		u64 __info_val = info_val; \
@@ -145,4 +187,17 @@ void kbasep_ktrace_add_csf(struct kbase_device *kbdev,
 				__queue, __info_val); \
 	} while (0)
 
+
+#define KBASE_KTRACE_ADD_CSF_KCPU(kbdev, code, queue, info_val1, info_val2) \
+	do { \
+		/* capture values that could come from non-pure fn calls */ \
+		struct kbase_kcpu_command_queue *__queue = queue; \
+		u64 __info_val1 = info_val1; \
+		u64 __info_val2 = info_val2; \
+		KBASE_KTRACE_RBUF_ADD_CSF_KCPU(kbdev, code, __queue, \
+					       __info_val1, __info_val2); \
+		KBASE_KTRACE_FTRACE_ADD_KCPU(code, __queue, \
+					     __info_val1, __info_val2); \
+	} while (0)
+
 #endif /* _KBASE_DEBUG_KTRACE_CSF_H_ */
diff --git a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_defs_csf.h b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_defs_csf.h
index f265fe9a9753..ef75afa98585 100644
--- a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_defs_csf.h
+++ b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_defs_csf.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_DEBUG_KTRACE_DEFS_CSF_H_
@@ -38,9 +37,15 @@
  * ftrace backend now outputs kctx field (as %d_%u format).
  *
  * Add fields group, slot, prio, csi into backend-specific part.
+ *
+ * 1.2:
+ * There is a new class of KCPU traces; with this, a new KCPU column in the
+ * ringbuffer RBUF (mali_trace) between csi and info_val, which is empty
+ * for non-kcpu related traces, and usually displays the KCPU Queue ID and
+ * an extra information value. ftrace also displays these KCPU traces.
  */
 #define KBASE_KTRACE_VERSION_MAJOR 1
-#define KBASE_KTRACE_VERSION_MINOR 1
+#define KBASE_KTRACE_VERSION_MINOR 2
 
 /* indicates if the trace message has valid queue-group related info. */
 #define KBASE_KTRACE_FLAG_CSF_GROUP     (((kbase_ktrace_flag_t)1) << 0)
@@ -48,37 +53,58 @@
 /* indicates if the trace message has valid queue related info. */
 #define KBASE_KTRACE_FLAG_CSF_QUEUE     (((kbase_ktrace_flag_t)1) << 1)
 
+/* indicates if the trace message has valid KCPU-queue related info. */
+#define KBASE_KTRACE_FLAG_CSF_KCPU     (((kbase_ktrace_flag_t)1) << 2)
+
 /* Collect all the flags together for debug checking */
 #define KBASE_KTRACE_FLAG_BACKEND_ALL \
-		(KBASE_KTRACE_FLAG_CSF_GROUP | KBASE_KTRACE_FLAG_CSF_QUEUE)
-
+		(KBASE_KTRACE_FLAG_CSF_GROUP | KBASE_KTRACE_FLAG_CSF_QUEUE | \
+		 KBASE_KTRACE_FLAG_CSF_KCPU)
 
 /**
- * struct kbase_ktrace_backend - backend specific part of a trace message
- *
- * @code:         Identifies the event, refer to enum kbase_ktrace_code.
- * @flags:        indicates information about the trace message itself. Used
- *                during dumping of the message.
- * @group_handle: Handle identifying the associated queue group. Only valid
- *                when @flags contains KBASE_KTRACE_FLAG_CSF_GROUP.
- * @csg_nr:       Number/index of the associated queue group's command stream
- *                group to which it is mapped, or negative if none associated.
- *                Only valid when @flags contains KBASE_KTRACE_FLAG_CSF_GROUP.
- * @slot_prio:    The priority of the slot for the associated group, if it was
- *                scheduled. Hence, only valid when @csg_nr >=0 and @flags
- *                contains KBASE_KTRACE_FLAG_CSF_GROUP.
- * @csi_index:    ID of the associated queue's Command Stream HW interface.
- *                Only valid when @flags contains KBASE_KTRACE_FLAG_CSF_QUEUE.
+ * union kbase_ktrace_backend - backend specific part of a trace message
+ * @kcpu:           kcpu union member
+ * @kcpu.code:      Identifies the event, refer to enum kbase_ktrace_code.
+ * @kcpu.flags:     indicates information about the trace message itself. Used
+ *                  during dumping of the message.
+ * @kcpu.id:        ID of the KCPU queue.
+ * @kcpu.extra_info_val: value specific to the type of KCPU event being traced.
+ *                  Refer to the KPU specific code in enum kbase_ktrace_code in
+ *                  mali_kbase_debug_ktrace_codes_csf.h
+ * @gpu:            gpu union member
+ * @gpu.code:       Identifies the event, refer to enum kbase_ktrace_code.
+ * @gpu.flags:      indicates information about the trace message itself. Used
+ *                  during dumping of the message.
+ * @gpu.group_handle: Handle identifying the associated queue group. Only valid
+ *                  when @flags contains KBASE_KTRACE_FLAG_CSF_GROUP.
+ * @gpu.csg_nr:     Number/index of the associated queue group's CS group to
+ *                  which it is mapped, or negative if none associated. Only
+ *                  valid when @flags contains KBASE_KTRACE_FLAG_CSF_GROUP.
+ * @gpu.slot_prio:  The priority of the slot for the associated group, if it
+ *                  was scheduled. Hence, only valid when @csg_nr >=0 and
+ *                  @flags contains KBASE_KTRACE_FLAG_CSF_GROUP.
+ * @gpu.csi_index:  ID of the associated queue's CS HW interface.
+ *                  Only valid when @flags contains KBASE_KTRACE_FLAG_CSF_QUEUE.
  */
-struct kbase_ktrace_backend {
+
+union kbase_ktrace_backend {
 	/* Place 64 and 32-bit members together */
 	/* Pack smaller members together */
-	kbase_ktrace_code_t code;
-	kbase_ktrace_flag_t flags;
-	u8 group_handle;
-	s8 csg_nr;
-	u8 slot_prio;
-	s8 csi_index;
+	struct {
+		kbase_ktrace_code_t code;
+		kbase_ktrace_flag_t flags;
+		u8 id;
+		u64 extra_info_val;
+	} kcpu;
+
+	struct {
+		kbase_ktrace_code_t code;
+		kbase_ktrace_flag_t flags;
+		u8 group_handle;
+		s8 csg_nr;
+		u8 slot_prio;
+		s8 csi_index;
+	} gpu;
 };
 
 #endif /* KBASE_KTRACE_TARGET_RBUF */
diff --git a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_defs_jm.h b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_defs_jm.h
index ea8e01a87f3f..abd35ff46e06 100644
--- a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_defs_jm.h
+++ b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_defs_jm.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_DEBUG_KTRACE_DEFS_JM_H_
@@ -71,31 +70,39 @@
 		| KBASE_KTRACE_FLAG_JM_ATOM)
 
 /**
- * struct kbase_ktrace_backend - backend specific part of a trace message
+ * union kbase_ktrace_backend - backend specific part of a trace message
+ * Contains only a struct but is a union such that it is compatible with
+ * generic JM and CSF KTrace calls.
  *
- * @atom_udata:  Copy of the user data sent for the atom in base_jd_submit.
- *               Only valid if KBASE_KTRACE_FLAG_JM_ATOM is set in @flags
- * @gpu_addr:    GPU address, usually of the job-chain represented by an atom.
- * @atom_number: id of the atom for which trace message was added. Only valid
- *               if KBASE_KTRACE_FLAG_JM_ATOM is set in @flags
- * @code:        Identifies the event, refer to enum kbase_ktrace_code.
- * @flags:       indicates information about the trace message itself. Used
- *               during dumping of the message.
- * @jobslot:     job-slot for which trace message was added, valid only for
- *               job-slot management events.
- * @refcount:    reference count for the context, valid for certain events
- *               related to scheduler core and policy.
+ * @gpu:             gpu union member
+ * @gpu.atom_udata:  Copy of the user data sent for the atom in base_jd_submit.
+ *                   Only valid if KBASE_KTRACE_FLAG_JM_ATOM is set in @flags
+ * @gpu.gpu_addr:    GPU address, usually of the job-chain represented by an
+ *                   atom.
+ * @gpu.atom_number: id of the atom for which trace message was added. Only
+ *                   valid if KBASE_KTRACE_FLAG_JM_ATOM is set in @flags
+ * @gpu.code:        Identifies the event, refer to enum kbase_ktrace_code.
+ * @gpu.flags:       indicates information about the trace message itself. Used
+ *                   during dumping of the message.
+ * @gpu.jobslot:     job-slot for which trace message was added, valid only for
+ *                   job-slot management events.
+ * @gpu.refcount:    reference count for the context, valid for certain events
+ *                   related to scheduler core and policy.
  */
-struct kbase_ktrace_backend {
-	/* Place 64 and 32-bit members together */
-	u64 atom_udata[2]; /* Only valid for KBASE_KTRACE_FLAG_JM_ATOM */
-	u64 gpu_addr;
-	int atom_number; /* Only valid for KBASE_KTRACE_FLAG_JM_ATOM */
-	/* Pack smaller members together */
-	kbase_ktrace_code_t code;
-	kbase_ktrace_flag_t flags;
-	u8 jobslot;
-	u8 refcount;
+union kbase_ktrace_backend {
+	struct {
+		/* Place 64 and 32-bit members together */
+		u64 atom_udata[2]; /* Only valid for
+				    * KBASE_KTRACE_FLAG_JM_ATOM
+				    */
+		u64 gpu_addr;
+		int atom_number; /* Only valid for KBASE_KTRACE_FLAG_JM_ATOM */
+		/* Pack smaller members together */
+		kbase_ktrace_code_t code;
+		kbase_ktrace_flag_t flags;
+		u8 jobslot;
+		u8 refcount;
+	} gpu;
 };
 #endif /* KBASE_KTRACE_TARGET_RBUF */
 
diff --git a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_jm.c b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_jm.c
index 1b821281f09f..276290917a82 100644
--- a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_jm.c
+++ b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_jm.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,9 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
+
 #include <mali_kbase.h>
 #include "debug/mali_kbase_debug_ktrace_internal.h"
 #include "debug/backend/mali_kbase_debug_ktrace_jm.h"
@@ -35,38 +35,39 @@ void kbasep_ktrace_backend_format_msg(struct kbase_ktrace_msg *trace_msg,
 		char *buffer, int sz, s32 *written)
 {
 	/* katom */
-	if (trace_msg->backend.flags & KBASE_KTRACE_FLAG_JM_ATOM)
+	if (trace_msg->backend.gpu.flags & KBASE_KTRACE_FLAG_JM_ATOM)
 		*written += MAX(snprintf(buffer + *written,
 				MAX(sz - *written, 0),
 				"atom %d (ud: 0x%llx 0x%llx)",
-				trace_msg->backend.atom_number,
-				trace_msg->backend.atom_udata[0],
-				trace_msg->backend.atom_udata[1]), 0);
+				trace_msg->backend.gpu.atom_number,
+				trace_msg->backend.gpu.atom_udata[0],
+				trace_msg->backend.gpu.atom_udata[1]), 0);
 
 	/* gpu_addr */
-	if (trace_msg->backend.flags & KBASE_KTRACE_FLAG_BACKEND)
+	if (trace_msg->backend.gpu.flags & KBASE_KTRACE_FLAG_BACKEND)
 		*written += MAX(snprintf(buffer + *written,
 				MAX(sz - *written, 0),
-				",%.8llx,", trace_msg->backend.gpu_addr), 0);
+				",%.8llx,", trace_msg->backend.gpu.gpu_addr),
+				0);
 	else
 		*written += MAX(snprintf(buffer + *written,
 				MAX(sz - *written, 0),
 				",,"), 0);
 
 	/* jobslot */
-	if (trace_msg->backend.flags & KBASE_KTRACE_FLAG_JM_JOBSLOT)
+	if (trace_msg->backend.gpu.flags & KBASE_KTRACE_FLAG_JM_JOBSLOT)
 		*written += MAX(snprintf(buffer + *written,
 				MAX(sz - *written, 0),
-				"%d", trace_msg->backend.jobslot), 0);
+				"%d", trace_msg->backend.gpu.jobslot), 0);
 
 	*written += MAX(snprintf(buffer + *written, MAX(sz - *written, 0),
 				","), 0);
 
 	/* refcount */
-	if (trace_msg->backend.flags & KBASE_KTRACE_FLAG_JM_REFCOUNT)
+	if (trace_msg->backend.gpu.flags & KBASE_KTRACE_FLAG_JM_REFCOUNT)
 		*written += MAX(snprintf(buffer + *written,
 				MAX(sz - *written, 0),
-				"%d", trace_msg->backend.refcount), 0);
+				"%d", trace_msg->backend.gpu.refcount), 0);
 }
 
 void kbasep_ktrace_add_jm(struct kbase_device *kbdev,
@@ -83,30 +84,31 @@ void kbasep_ktrace_add_jm(struct kbase_device *kbdev,
 	/* Reserve and update indices */
 	trace_msg = kbasep_ktrace_reserve(&kbdev->ktrace);
 
-	/* Fill the common part of the message (including backend.flags) */
+	/* Fill the common part of the message (including backend.gpu.flags) */
 	kbasep_ktrace_msg_init(&kbdev->ktrace, trace_msg, code, kctx, flags,
 			info_val);
 
 	/* Indicate to the common code that backend-specific parts will be
 	 * valid
 	 */
-	trace_msg->backend.flags |= KBASE_KTRACE_FLAG_BACKEND;
+	trace_msg->backend.gpu.flags |= KBASE_KTRACE_FLAG_BACKEND;
 
 	/* Fill the JM-specific parts of the message */
 	if (katom) {
-		trace_msg->backend.flags |= KBASE_KTRACE_FLAG_JM_ATOM;
+		trace_msg->backend.gpu.flags |= KBASE_KTRACE_FLAG_JM_ATOM;
 
-		trace_msg->backend.atom_number = kbase_jd_atom_id(katom->kctx, katom);
-		trace_msg->backend.atom_udata[0] = katom->udata.blob[0];
-		trace_msg->backend.atom_udata[1] = katom->udata.blob[1];
+		trace_msg->backend.gpu.atom_number =
+			kbase_jd_atom_id(katom->kctx, katom);
+		trace_msg->backend.gpu.atom_udata[0] = katom->udata.blob[0];
+		trace_msg->backend.gpu.atom_udata[1] = katom->udata.blob[1];
 	}
 
-	trace_msg->backend.gpu_addr = gpu_addr;
-	trace_msg->backend.jobslot = jobslot;
+	trace_msg->backend.gpu.gpu_addr = gpu_addr;
+	trace_msg->backend.gpu.jobslot = jobslot;
 	/* Clamp refcount */
-	trace_msg->backend.refcount = MIN((unsigned int)refcount, 0xFF);
+	trace_msg->backend.gpu.refcount = MIN((unsigned int)refcount, 0xFF);
 
-	WARN_ON((trace_msg->backend.flags & ~KBASE_KTRACE_FLAG_ALL));
+	WARN_ON((trace_msg->backend.gpu.flags & ~KBASE_KTRACE_FLAG_ALL));
 
 	/* Done */
 	spin_unlock_irqrestore(&kbdev->ktrace.lock, irqflags);
diff --git a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_jm.h b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_jm.h
index adfcb1aa556e..233d06f2eae7 100644
--- a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_jm.h
+++ b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_ktrace_jm.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_DEBUG_KTRACE_JM_H_
diff --git a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_linux_ktrace_csf.h b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_linux_ktrace_csf.h
index d103e5766456..4ed175e53f49 100644
--- a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_linux_ktrace_csf.h
+++ b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_linux_ktrace_csf.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -144,4 +143,50 @@ DEFINE_MALI_CSF_GRP_Q_EVENT(QUEUE_STOP);
 
 #undef DEFINE_MALI_CSF_GRP_Q_EVENT
 
+/*
+ * KCPU queue events
+ */
+DECLARE_EVENT_CLASS(mali_csf_kcpu_queue_template,
+	TP_PROTO(struct kbase_kcpu_command_queue *queue,
+		 u64 info_val1, u64 info_val2),
+	TP_ARGS(queue, info_val1, info_val2),
+	TP_STRUCT__entry(
+		__field(u64, info_val1)
+		__field(u64, info_val2)
+		__field(pid_t, kctx_tgid)
+		__field(u32, kctx_id)
+		__field(u8, id)
+	),
+	TP_fast_assign(
+		{
+			__entry->info_val1 = info_val1;
+			__entry->info_val2 = info_val2;
+			__entry->kctx_id = queue->kctx->id;
+			__entry->kctx_tgid = queue->kctx->tgid;
+			__entry->id = queue->id;
+		}
+
+	),
+	TP_printk("kctx=%d_%u id=%u info_val1=0x%llx info_val2=0x%llx",
+			__entry->kctx_tgid, __entry->kctx_id, __entry->id,
+			__entry->info_val1, __entry->info_val2)
+);
+
+#define DEFINE_MALI_CSF_KCPU_EVENT(name)  \
+	DEFINE_EVENT(mali_csf_kcpu_queue_template, mali_##name, \
+	TP_PROTO(struct kbase_kcpu_command_queue *queue, \
+		 u64 info_val1, u64 info_val2), \
+	TP_ARGS(queue, info_val1, info_val2))
+
+DEFINE_MALI_CSF_KCPU_EVENT(KCPU_QUEUE_NEW);
+DEFINE_MALI_CSF_KCPU_EVENT(KCPU_QUEUE_DESTROY);
+DEFINE_MALI_CSF_KCPU_EVENT(CQS_SET);
+DEFINE_MALI_CSF_KCPU_EVENT(CQS_WAIT_START);
+DEFINE_MALI_CSF_KCPU_EVENT(CQS_WAIT_END);
+DEFINE_MALI_CSF_KCPU_EVENT(FENCE_SIGNAL);
+DEFINE_MALI_CSF_KCPU_EVENT(FENCE_WAIT_START);
+DEFINE_MALI_CSF_KCPU_EVENT(FENCE_WAIT_END);
+
+#undef DEFINE_MALI_CSF_KCPU_EVENT
+
 #endif /* !defined(_KBASE_DEBUG_LINUX_KTRACE_CSF_H_) || defined(TRACE_HEADER_MULTI_READ) */
diff --git a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_linux_ktrace_jm.h b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_linux_ktrace_jm.h
index 037b1edecd8e..b368a8510ad1 100644
--- a/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_linux_ktrace_jm.h
+++ b/drivers/gpu/arm/bifrost/debug/backend/mali_kbase_debug_linux_ktrace_jm.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014,2018,2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2018, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
diff --git a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace.c b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace.c
index a13c0ba20c94..443b048d6d16 100644
--- a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace.c
+++ b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,9 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
+
 #include <mali_kbase.h>
 #include "debug/mali_kbase_debug_ktrace_internal.h"
 
@@ -93,7 +93,8 @@ static void kbasep_ktrace_format_msg(struct kbase_ktrace_msg *trace_msg,
 			(int)trace_msg->timestamp.tv_sec,
 			(int)(trace_msg->timestamp.tv_nsec / 1000),
 			trace_msg->thread_id, trace_msg->cpu,
-			kbasep_ktrace_code_string[trace_msg->backend.code]), 0);
+			kbasep_ktrace_code_string[trace_msg->backend.gpu.code]),
+			0);
 
 	/* kctx part: */
 	if (trace_msg->kctx_tgid) {
@@ -171,8 +172,8 @@ void kbasep_ktrace_msg_init(struct kbase_ktrace *ktrace,
 		trace_msg->kctx_id = 0;
 	}
 	trace_msg->info_val = info_val;
-	trace_msg->backend.code = code;
-	trace_msg->backend.flags = flags;
+	trace_msg->backend.gpu.code = code;
+	trace_msg->backend.gpu.flags = flags;
 }
 
 void kbasep_ktrace_add(struct kbase_device *kbdev, enum kbase_ktrace_code code,
@@ -189,7 +190,7 @@ void kbasep_ktrace_add(struct kbase_device *kbdev, enum kbase_ktrace_code code,
 	/* Reserve and update indices */
 	trace_msg = kbasep_ktrace_reserve(&kbdev->ktrace);
 
-	/* Fill the common part of the message (including backend.flags) */
+	/* Fill the common part of the message (including backend.gpu.flags) */
 	kbasep_ktrace_msg_init(&kbdev->ktrace, trace_msg, code, kctx, flags,
 			info_val);
 
diff --git a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace.h b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace.h
index e4e2e8c35001..b7545e08ab28 100644
--- a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace.h
+++ b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
diff --git a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_codes.h b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_codes.h
index b50bceee4244..c5ca08e0a18b 100644
--- a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_codes.h
+++ b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_codes.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2011-2015,2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2015, 2018-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -115,6 +114,7 @@ int dummy_array[] = {
 	KBASE_KTRACE_CODE_MAKE_CODE(PM_CORES_CHANGE_DESIRED_TILER),
 	KBASE_KTRACE_CODE_MAKE_CODE(PM_CORES_CHANGE_AVAILABLE),
 	KBASE_KTRACE_CODE_MAKE_CODE(PM_CORES_CHANGE_AVAILABLE_TILER),
+	KBASE_KTRACE_CODE_MAKE_CODE(PM_CORES_CHANGE_AVAILABLE_L2),
 	KBASE_KTRACE_CODE_MAKE_CODE(PM_CORES_AVAILABLE),
 	KBASE_KTRACE_CODE_MAKE_CODE(PM_CORES_AVAILABLE_TILER),
 	KBASE_KTRACE_CODE_MAKE_CODE(PM_DESIRED_REACHED),
@@ -145,7 +145,14 @@ int dummy_array[] = {
 	KBASE_KTRACE_CODE_MAKE_CODE(SCHED_RETAIN_CTX_NOLOCK),
 	/* info_val == kctx->refcount */
 	KBASE_KTRACE_CODE_MAKE_CODE(SCHED_RELEASE_CTX),
-
+#ifdef CONFIG_MALI_ARBITER_SUPPORT
+	/*
+	 * Arbitration events
+	 */
+	KBASE_KTRACE_CODE_MAKE_CODE(ARB_GPU_LOST),
+	KBASE_KTRACE_CODE_MAKE_CODE(ARB_VM_STATE),
+	KBASE_KTRACE_CODE_MAKE_CODE(ARB_VM_EVT),
+#endif
 
 #if MALI_USE_CSF
 #include "debug/backend/mali_kbase_debug_ktrace_codes_csf.h"
diff --git a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_defs.h b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_defs.h
index c680feb86387..accf3cf17236 100644
--- a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_defs.h
+++ b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_defs.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_DEBUG_KTRACE_DEFS_H_
@@ -78,12 +77,18 @@ typedef u8 kbase_ktrace_code_t;
  */
 
 /*
- * struct kbase_ktrace_backend - backend specific part of a trace message
- *
- * At the very least, this must contain a kbase_ktrace_code_t 'code' member and
- * a kbase_ktrace_flag_t 'flags' member
+ * union kbase_ktrace_backend - backend specific part of a trace message.
+ * At the very least, this must contain a kbase_ktrace_code_t 'code' member
+ * and a kbase_ktrace_flag_t 'flags' inside a "gpu" sub-struct. Should a
+ * backend need several sub structs in its union to optimize the data storage
+ * for different message types, then it can use a "common initial sequence" to
+ * allow 'flags' and 'code' to pack optimally without corrupting them.
+ * Different backends need not share common initial sequences between them, they
+ * only need to ensure they have gpu.flags and gpu.code members, it
+ * is up to the backend then how to order these.
  */
-struct kbase_ktrace_backend;
+union kbase_ktrace_backend;
+
 #endif /* KBASE_KTRACE_TARGET_RBUF */
 
 #if MALI_USE_CSF
@@ -145,9 +150,9 @@ enum kbase_ktrace_code {
  * @kctx_id:   Unique identifier of the &kbase_context associated with the
  *             message. Only valid if @kctx_tgid != 0.
  * @info_val:  value specific to the type of event being traced. Refer to the
- *             specific code in enum kbase_ktrace_code
+ *             specific code in enum kbase_ktrace_code.
  * @backend:   backend-specific trace information. All backends must implement
- *             a minimum common set of members
+ *             a minimum common set of members.
  */
 struct kbase_ktrace_msg {
 	struct timespec64 timestamp;
@@ -156,8 +161,7 @@ struct kbase_ktrace_msg {
 	pid_t kctx_tgid;
 	u32 kctx_id;
 	u64 info_val;
-
-	struct kbase_ktrace_backend backend;
+	union kbase_ktrace_backend backend;
 };
 
 struct kbase_ktrace {
diff --git a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_internal.h b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_internal.h
index e450760e3426..1f0fa5ecf9ea 100644
--- a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_internal.h
+++ b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_ktrace_internal.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_DEBUG_KTRACE_INTERNAL_H_
diff --git a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_linux_ktrace.h b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_linux_ktrace.h
index 27f687faf072..4a73da50029b 100644
--- a/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_linux_ktrace.h
+++ b/drivers/gpu/arm/bifrost/debug/mali_kbase_debug_linux_ktrace.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014,2018,2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -86,6 +85,7 @@ DEFINE_MALI_ADD_EVENT(PM_CORES_AVAILABLE);
 DEFINE_MALI_ADD_EVENT(PM_CORES_AVAILABLE_TILER);
 DEFINE_MALI_ADD_EVENT(PM_CORES_CHANGE_AVAILABLE);
 DEFINE_MALI_ADD_EVENT(PM_CORES_CHANGE_AVAILABLE_TILER);
+DEFINE_MALI_ADD_EVENT(PM_CORES_CHANGE_AVAILABLE_L2);
 DEFINE_MALI_ADD_EVENT(PM_GPU_ON);
 DEFINE_MALI_ADD_EVENT(PM_GPU_OFF);
 DEFINE_MALI_ADD_EVENT(PM_SET_POLICY);
@@ -97,11 +97,17 @@ DEFINE_MALI_ADD_EVENT(PM_CONTEXT_IDLE);
 DEFINE_MALI_ADD_EVENT(PM_WAKE_WAITERS);
 DEFINE_MALI_ADD_EVENT(SCHED_RETAIN_CTX_NOLOCK);
 DEFINE_MALI_ADD_EVENT(SCHED_RELEASE_CTX);
+#ifdef CONFIG_MALI_ARBITER_SUPPORT
+
+DEFINE_MALI_ADD_EVENT(ARB_GPU_LOST);
+DEFINE_MALI_ADD_EVENT(ARB_VM_STATE);
+DEFINE_MALI_ADD_EVENT(ARB_VM_EVT);
 
+#endif
 #if MALI_USE_CSF
-#include "mali_kbase_debug_linux_ktrace_csf.h"
+#include "backend/mali_kbase_debug_linux_ktrace_csf.h"
 #else
-#include "mali_kbase_debug_linux_ktrace_jm.h"
+#include "backend/mali_kbase_debug_linux_ktrace_jm.h"
 #endif
 
 #undef DEFINE_MALI_ADD_EVENT
diff --git a/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_csf.c b/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_csf.c
index d8b3fff6a214..39a46276cf22 100644
--- a/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_csf.c
+++ b/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_csf.c
@@ -1,12 +1,12 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -17,18 +17,17 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "../mali_kbase_device_internal.h"
 #include "../mali_kbase_device.h"
 
-#include <mali_kbase_config_defaults.h>
 #include <mali_kbase_hwaccess_backend.h>
+#include <mali_kbase_hwcnt_backend_csf_if_fw.h>
 #include <mali_kbase_ctx_sched.h>
 #include <mali_kbase_reset_gpu.h>
 #include <csf/mali_kbase_csf.h>
+#include <csf/ipa_control/mali_kbase_csf_ipa_control.h>
 
 #ifdef CONFIG_MALI_BIFROST_NO_MALI
 #include <mali_kbase_model_linux.h>
@@ -36,13 +35,12 @@
 
 #include <mali_kbase.h>
 #include <backend/gpu/mali_kbase_irq_internal.h>
-#include <backend/gpu/mali_kbase_js_internal.h>
 #include <backend/gpu/mali_kbase_pm_internal.h>
+#include <backend/gpu/mali_kbase_js_internal.h>
 #include <backend/gpu/mali_kbase_clk_rate_trace_mgr.h>
 
 static void kbase_device_csf_firmware_term(struct kbase_device *kbdev)
 {
-	kbase_clk_rate_trace_manager_term(kbdev);
 	kbase_csf_firmware_term(kbdev);
 }
 
@@ -64,9 +62,6 @@ static int kbase_device_csf_firmware_init(struct kbase_device *kbdev)
 	 */
 	kbase_pm_context_idle(kbdev);
 
-	if (!err)
-		kbase_clk_rate_trace_manager_init(kbdev);
-
 	return err;
 }
 
@@ -106,6 +101,15 @@ static int kbase_backend_late_init(struct kbase_device *kbdev)
 #endif /* !CONFIG_MALI_BIFROST_NO_MALI */
 #endif /* CONFIG_MALI_BIFROST_DEBUG */
 
+	kbase_ipa_control_init(kbdev);
+
+	/* Initialise the metrics subsystem, it couldn't be initialized earlier
+	 * due to dependency on kbase_ipa_control.
+	 */
+	err = kbasep_pm_metrics_init(kbdev);
+	if (err)
+		goto fail_pm_metrics_init;
+
 	/* Do the initialisation of devfreq.
 	 * Devfreq needs backend_timer_init() for completion of its
 	 * initialisation and it also needs to catch the first callback
@@ -124,10 +128,16 @@ static int kbase_backend_late_init(struct kbase_device *kbdev)
 
 	init_waitqueue_head(&kbdev->hwaccess.backend.reset_wait);
 
+	/* kbase_pm_context_idle is called after the boot of firmware */
+
 	return 0;
 
 fail_update_l2_features:
+	kbase_backend_devfreq_term(kbdev);
 fail_devfreq_init:
+	kbasep_pm_metrics_term(kbdev);
+fail_pm_metrics_init:
+	kbase_ipa_control_term(kbdev);
 
 #ifdef CONFIG_MALI_BIFROST_DEBUG
 #ifndef CONFIG_MALI_BIFROST_NO_MALI
@@ -137,6 +147,7 @@ static int kbase_backend_late_init(struct kbase_device *kbdev)
 
 	kbase_backend_timer_term(kbdev);
 fail_timer:
+	kbase_pm_context_idle(kbdev);
 	kbase_hwaccess_pm_halt(kbdev);
 fail_pm_powerup:
 	kbase_reset_gpu_term(kbdev);
@@ -153,11 +164,84 @@ static int kbase_backend_late_init(struct kbase_device *kbdev)
 static void kbase_backend_late_term(struct kbase_device *kbdev)
 {
 	kbase_backend_devfreq_term(kbdev);
+	kbasep_pm_metrics_term(kbdev);
+	kbase_ipa_control_term(kbdev);
 	kbase_hwaccess_pm_halt(kbdev);
 	kbase_reset_gpu_term(kbdev);
 	kbase_hwaccess_pm_term(kbdev);
 }
 
+/**
+ * kbase_device_hwcnt_backend_csf_if_init - Create hardware counter backend
+ *                                          firmware interface.
+ * @kbdev:	Device pointer
+ */
+static int kbase_device_hwcnt_backend_csf_if_init(struct kbase_device *kbdev)
+{
+	return kbase_hwcnt_backend_csf_if_fw_create(
+		kbdev, &kbdev->hwcnt_backend_csf_if_fw);
+}
+
+/**
+ * kbase_device_hwcnt_backend_csf_if_term - Terminate hardware counter backend
+ *                                          firmware interface.
+ * @kbdev:	Device pointer
+ */
+static void kbase_device_hwcnt_backend_csf_if_term(struct kbase_device *kbdev)
+{
+	kbase_hwcnt_backend_csf_if_fw_destroy(&kbdev->hwcnt_backend_csf_if_fw);
+}
+
+/**
+ * kbase_device_hwcnt_backend_csf_init - Create hardware counter backend.
+ * @kbdev:	Device pointer
+ */
+
+static int kbase_device_hwcnt_backend_csf_init(struct kbase_device *kbdev)
+{
+	return kbase_hwcnt_backend_csf_create(
+		&kbdev->hwcnt_backend_csf_if_fw,
+		KBASE_HWCNT_BACKEND_CSF_RING_BUFFER_COUNT,
+		&kbdev->hwcnt_gpu_iface);
+}
+
+/**
+ * kbase_device_hwcnt_backend_csf_term - Terminate hardware counter backend.
+ * @kbdev:	Device pointer
+ */
+static void kbase_device_hwcnt_backend_csf_term(struct kbase_device *kbdev)
+{
+	kbase_hwcnt_backend_csf_destroy(&kbdev->hwcnt_gpu_iface);
+}
+
+/**
+ * kbase_device_hwcnt_backend_csf_metadata_init - Initialize hardware counter
+ *                                                metadata.
+ * @kbdev:	Device pointer
+ */
+static int
+kbase_device_hwcnt_backend_csf_metadata_init(struct kbase_device *kbdev)
+{
+	/* For CSF GPUs, HWC metadata needs to query information from CSF
+	 * firmware, so the initialization of HWC metadata only can be called
+	 * after firmware initialized, but firmware initialization depends on
+	 * HWC backend initialization, so we need to separate HWC backend
+	 * metadata initialization from HWC backend initialization.
+	 */
+	return kbase_hwcnt_backend_csf_metadata_init(&kbdev->hwcnt_gpu_iface);
+}
+
+/**
+ * kbase_device_hwcnt_backend_csf_metadata_term - Terminate hardware counter
+ *                                                metadata.
+ * @kbdev:	Device pointer
+ */
+static void
+kbase_device_hwcnt_backend_csf_metadata_term(struct kbase_device *kbdev)
+{
+	kbase_hwcnt_backend_csf_metadata_term(&kbdev->hwcnt_gpu_iface);
+}
+
 static const struct kbase_device_init dev_init[] = {
 #ifdef CONFIG_MALI_BIFROST_NO_MALI
 	{kbase_gpu_device_create, kbase_gpu_device_destroy,
@@ -178,6 +262,8 @@ static const struct kbase_device_init dev_init[] = {
 			"Populating max frequency failed"},
 	{kbase_device_misc_init, kbase_device_misc_term,
 			"Miscellaneous device initialization failed"},
+	{kbase_device_pcm_dev_init, kbase_device_pcm_dev_term,
+			"Priority control manager initialization failed"},
 	{kbase_ctx_sched_init, kbase_ctx_sched_term,
 			"Context scheduler initialization failed"},
 	{kbase_mem_init, kbase_mem_term,
@@ -195,20 +281,26 @@ static const struct kbase_device_init dev_init[] = {
 	{kbase_clk_rate_trace_manager_init,
 			kbase_clk_rate_trace_manager_term,
 			"Clock rate trace manager initialization failed"},
-	{kbase_device_hwcnt_backend_jm_init,
-			kbase_device_hwcnt_backend_jm_term,
+	{kbase_device_hwcnt_backend_csf_if_init,
+			kbase_device_hwcnt_backend_csf_if_term,
+			"GPU hwcnt backend CSF interface creation failed"},
+	{kbase_device_hwcnt_backend_csf_init,
+			kbase_device_hwcnt_backend_csf_term,
 			"GPU hwcnt backend creation failed"},
 	{kbase_device_hwcnt_context_init, kbase_device_hwcnt_context_term,
 			"GPU hwcnt context initialization failed"},
+	{kbase_backend_late_init, kbase_backend_late_term,
+			"Late backend initialization failed"},
+	{kbase_device_csf_firmware_init, kbase_device_csf_firmware_term,
+			"Firmware initialization failed"},
+	{kbase_device_hwcnt_backend_csf_metadata_init,
+			kbase_device_hwcnt_backend_csf_metadata_term,
+			"GPU hwcnt backend metadata creation failed"},
 	{kbase_device_hwcnt_virtualizer_init,
 			kbase_device_hwcnt_virtualizer_term,
 			"GPU hwcnt virtualizer initialization failed"},
 	{kbase_device_vinstr_init, kbase_device_vinstr_term,
 			"Virtual instrumentation initialization failed"},
-	{kbase_backend_late_init, kbase_backend_late_term,
-			"Late backend initialization failed"},
-	{kbase_device_csf_firmware_init, kbase_device_csf_firmware_term,
-			"Firmware initialization failed"},
 #ifdef MALI_KBASE_BUILD
 	{kbase_device_debugfs_init, kbase_device_debugfs_term,
 			"DebugFS initialization failed"},
@@ -224,12 +316,10 @@ static const struct kbase_device_init dev_init[] = {
 	 * paragraph that starts with "Word of warning", currently the
 	 * second-last paragraph.
 	 */
-	{kbase_sysfs_init, kbase_sysfs_term, "SysFS group creation failed"},
+	{kbase_sysfs_init, kbase_sysfs_term,
+			"SysFS group creation failed"},
 	{kbase_device_misc_register, kbase_device_misc_deregister,
 			"Misc device registration failed"},
-#ifdef CONFIG_MALI_BUSLOG
-	{buslog_init, buslog_term, "Bus log client registration failed"},
-#endif
 	{kbase_gpuprops_populate_user_buffer, kbase_gpuprops_free_user_buffer,
 			"GPU property population failed"},
 #endif
@@ -246,6 +336,7 @@ static void kbase_device_term_partial(struct kbase_device *kbdev,
 
 void kbase_device_term(struct kbase_device *kbdev)
 {
+	kbdev->csf.mali_file_inode = NULL;
 	kbase_device_term_partial(kbdev, ARRAY_SIZE(dev_init));
 	kbase_mem_halt(kbdev);
 }
diff --git a/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_hw_csf.c b/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_hw_csf.c
index 97bcc1d23aa3..259e42a6d3ea 100644
--- a/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_hw_csf.c
+++ b/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_hw_csf.c
@@ -1,12 +1,12 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -17,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
@@ -72,7 +70,8 @@ static bool kbase_gpu_fault_interrupt(struct kbase_device *kbdev)
 			kbase_report_gpu_fault(kbdev, status, as_nr, as_valid);
 
 			dev_err(kbdev->dev, "GPU bus fault triggering gpu-reset ...\n");
-			if (kbase_prepare_to_reset_gpu(kbdev))
+			if (kbase_prepare_to_reset_gpu(
+				    kbdev, RESET_FLAGS_HWC_UNRECOVERABLE_ERROR))
 				kbase_reset_gpu(kbdev);
 		} else {
 			/* Handle Bus fault */
@@ -108,11 +107,26 @@ void kbase_gpu_interrupt(struct kbase_device *kbdev, u32 val)
 		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 
 		kbase_csf_scheduler_spin_lock(kbdev, &flags);
-		if (!WARN_ON(!kbase_csf_scheduler_protected_mode_in_use(kbdev)))
+		if (!WARN_ON(!kbase_csf_scheduler_protected_mode_in_use(
+			    kbdev))) {
+			struct base_gpu_queue_group_error const
+				err_payload = { .error_type =
+							BASE_GPU_QUEUE_GROUP_ERROR_FATAL,
+						.payload = {
+							.fatal_group = {
+								.status =
+									GPU_EXCEPTION_TYPE_SW_FAULT_0,
+							} } };
+
 			scheduler->active_protm_grp->faulted = true;
+			kbase_csf_add_group_fatal_error(
+				scheduler->active_protm_grp, &err_payload);
+			kbase_event_wakeup(scheduler->active_protm_grp->kctx);
+		}
 		kbase_csf_scheduler_spin_unlock(kbdev, flags);
 
-		if (kbase_prepare_to_reset_gpu(kbdev))
+		if (kbase_prepare_to_reset_gpu(
+			    kbdev, RESET_FLAGS_HWC_UNRECOVERABLE_ERROR))
 			kbase_reset_gpu(kbdev);
 	}
 
diff --git a/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_hw_jm.c b/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_hw_jm.c
index a11d778071b5..33ebe0901fe2 100644
--- a/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_hw_jm.c
+++ b/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_hw_jm.c
@@ -6,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -17,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
diff --git a/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_jm.c b/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_jm.c
index 8e853eb82fa1..4f5de18d3571 100644
--- a/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_jm.c
+++ b/drivers/gpu/arm/bifrost/device/backend/mali_kbase_device_jm.c
@@ -1,12 +1,12 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -17,12 +17,11 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "../mali_kbase_device_internal.h"
 #include "../mali_kbase_device.h"
+#include "../mali_kbase_hwaccess_instr.h"
 
 #include <mali_kbase_config_defaults.h>
 #include <mali_kbase_hwaccess_backend.h>
@@ -96,9 +95,6 @@ static int kbase_backend_late_init(struct kbase_device *kbdev)
 	if (err)
 		goto fail_devfreq_init;
 
-	/* Idle the GPU and/or cores, if the policy wants it to */
-	kbase_pm_context_idle(kbdev);
-
 	/* Update gpuprops with L2_FEATURES if applicable */
 	err = kbase_gpuprops_update_l2_features(kbdev);
 	if (err)
@@ -106,9 +102,13 @@ static int kbase_backend_late_init(struct kbase_device *kbdev)
 
 	init_waitqueue_head(&kbdev->hwaccess.backend.reset_wait);
 
+	/* Idle the GPU and/or cores, if the policy wants it to */
+	kbase_pm_context_idle(kbdev);
+
 	return 0;
 
 fail_update_l2_features:
+	kbase_backend_devfreq_term(kbdev);
 fail_devfreq_init:
 	kbase_job_slot_term(kbdev);
 fail_job_slot:
@@ -121,6 +121,7 @@ static int kbase_backend_late_init(struct kbase_device *kbdev)
 
 	kbase_backend_timer_term(kbdev);
 fail_timer:
+	kbase_pm_context_idle(kbdev);
 	kbase_hwaccess_pm_halt(kbdev);
 fail_pm_powerup:
 	kbase_reset_gpu_term(kbdev);
@@ -145,6 +146,16 @@ static void kbase_backend_late_term(struct kbase_device *kbdev)
 	kbase_hwaccess_pm_term(kbdev);
 }
 
+static int kbase_device_hwcnt_backend_jm_init(struct kbase_device *kbdev)
+{
+	return kbase_hwcnt_backend_jm_create(kbdev, &kbdev->hwcnt_gpu_iface);
+}
+
+static void kbase_device_hwcnt_backend_jm_term(struct kbase_device *kbdev)
+{
+	kbase_hwcnt_backend_jm_destroy(&kbdev->hwcnt_gpu_iface);
+}
+
 static const struct kbase_device_init dev_init[] = {
 #ifdef CONFIG_MALI_BIFROST_NO_MALI
 	{kbase_gpu_device_create, kbase_gpu_device_destroy,
@@ -165,6 +176,8 @@ static const struct kbase_device_init dev_init[] = {
 			"Populating max frequency failed"},
 	{kbase_device_misc_init, kbase_device_misc_term,
 			"Miscellaneous device initialization failed"},
+	{kbase_device_pcm_dev_init, kbase_device_pcm_dev_term,
+			"Priority control manager initialization failed"},
 	{kbase_ctx_sched_init, kbase_ctx_sched_term,
 			"Context scheduler initialization failed"},
 	{kbase_mem_init, kbase_mem_term,
@@ -182,6 +195,8 @@ static const struct kbase_device_init dev_init[] = {
 	{kbase_clk_rate_trace_manager_init,
 			kbase_clk_rate_trace_manager_term,
 			"Clock rate trace manager initialization failed"},
+	{kbase_instr_backend_init, kbase_instr_backend_term,
+			"Instrumentation backend initialization failed"},
 	{kbase_device_hwcnt_backend_jm_init,
 			kbase_device_hwcnt_backend_jm_term,
 			"GPU hwcnt backend creation failed"},
@@ -214,9 +229,6 @@ static const struct kbase_device_init dev_init[] = {
 	{kbase_sysfs_init, kbase_sysfs_term, "SysFS group creation failed"},
 	{kbase_device_misc_register, kbase_device_misc_deregister,
 			"Misc device registration failed"},
-#ifdef CONFIG_MALI_BUSLOG
-	{buslog_init, buslog_term, "Bus log client registration failed"},
-#endif
 	{kbase_gpuprops_populate_user_buffer, kbase_gpuprops_free_user_buffer,
 			"GPU property population failed"},
 #endif
@@ -253,7 +265,8 @@ int kbase_device_init(struct kbase_device *kbdev)
 	for (i = 0; i < ARRAY_SIZE(dev_init); i++) {
 		err = dev_init[i].init(kbdev);
 		if (err) {
-			dev_err(kbdev->dev, "%s error = %d\n",
+			if (err != -EPROBE_DEFER)
+				dev_err(kbdev->dev, "%s error = %d\n",
 						dev_init[i].err_mes, err);
 			kbase_device_term_partial(kbdev, i);
 			break;
diff --git a/drivers/gpu/arm/bifrost/device/mali_kbase_device.c b/drivers/gpu/arm/bifrost/device/mali_kbase_device.c
index 76fb33a5e881..5e900d0fd0d4 100644
--- a/drivers/gpu/arm/bifrost/device/mali_kbase_device.c
+++ b/drivers/gpu/arm/bifrost/device/mali_kbase_device.c
@@ -1,12 +1,12 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -17,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -38,6 +36,7 @@
 #include <mali_kbase_hwaccess_instr.h>
 #include <mali_kbase_hw.h>
 #include <mali_kbase_config_defaults.h>
+#include <linux/priority_control_manager.h>
 
 #include <tl/mali_kbase_timeline.h>
 #include "mali_kbase_vinstr.h"
@@ -45,6 +44,7 @@
 #include "mali_kbase_hwcnt_virtualizer.h"
 
 #include "mali_kbase_device.h"
+#include "mali_kbase_device_internal.h"
 #include "backend/gpu/mali_kbase_pm_internal.h"
 #include "backend/gpu/mali_kbase_irq_internal.h"
 #include "mali_kbase_regs_history_debugfs.h"
@@ -106,6 +106,55 @@ static void kbase_device_all_as_term(struct kbase_device *kbdev)
 		kbase_mmu_as_term(kbdev, i);
 }
 
+int kbase_device_pcm_dev_init(struct kbase_device *const kbdev)
+{
+	int err = 0;
+
+#ifdef CONFIG_OF
+	struct device_node *prio_ctrl_node;
+
+	/* Check to see whether or not a platform specific priority control manager
+	 * is available.
+	 */
+	prio_ctrl_node = of_parse_phandle(kbdev->dev->of_node,
+			"priority-control-manager", 0);
+	if (!prio_ctrl_node) {
+		dev_info(kbdev->dev,
+			"No priority control manager is configured");
+	} else {
+		struct platform_device *const pdev =
+			of_find_device_by_node(prio_ctrl_node);
+
+		if (!pdev) {
+			dev_err(kbdev->dev,
+				"The configured priority control manager was not found");
+		} else {
+			struct priority_control_manager_device *pcm_dev =
+						platform_get_drvdata(pdev);
+			if (!pcm_dev) {
+				dev_info(kbdev->dev, "Priority control manager is not ready");
+				err = -EPROBE_DEFER;
+			} else if (!try_module_get(pcm_dev->owner)) {
+				dev_err(kbdev->dev, "Failed to get priority control manager module");
+				err = -ENODEV;
+			} else {
+				dev_info(kbdev->dev, "Priority control manager successfully loaded");
+				kbdev->pcm_dev = pcm_dev;
+			}
+		}
+		of_node_put(prio_ctrl_node);
+	}
+#endif /* CONFIG_OF */
+
+	return err;
+}
+
+void kbase_device_pcm_dev_term(struct kbase_device *const kbdev)
+{
+	if (kbdev->pcm_dev)
+		module_put(kbdev->pcm_dev->owner);
+}
+
 int kbase_device_misc_init(struct kbase_device * const kbdev)
 {
 	int err;
@@ -136,6 +185,7 @@ int kbase_device_misc_init(struct kbase_device * const kbdev)
 		}
 	}
 #endif /* CONFIG_ARM64 */
+
 	/* Get the list of workarounds for issues on the current HW
 	 * (identified by the GPU_ID register)
 	 */
@@ -152,11 +202,6 @@ int kbase_device_misc_init(struct kbase_device * const kbdev)
 	if (err)
 		goto fail;
 
-	/* On Linux 4.0+, dma coherency is determined from device tree */
-#if defined(CONFIG_ARM64) && LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)
-	set_dma_ops(kbdev->dev, &noncoherent_swiotlb_dma_ops);
-#endif
-
 	/* Workaround a pre-3.13 Linux issue, where dma_mask is NULL when our
 	 * device structure was created by device-tree
 	 */
@@ -179,8 +224,6 @@ int kbase_device_misc_init(struct kbase_device * const kbdev)
 	if (err)
 		goto dma_set_mask_failed;
 
-	spin_lock_init(&kbdev->hwcnt.lock);
-
 	err = kbase_ktrace_init(kbdev);
 	if (err)
 		goto term_as;
@@ -191,18 +234,11 @@ int kbase_device_misc_init(struct kbase_device * const kbdev)
 
 	atomic_set(&kbdev->ctx_num, 0);
 
-	err = kbase_instr_backend_init(kbdev);
-	if (err)
-		goto term_trace;
-
 	kbdev->pm.dvfs_period = DEFAULT_PM_DVFS_PERIOD;
 
 	kbdev->reset_timeout_ms = DEFAULT_RESET_TIMEOUT_MS;
 
-	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_AARCH64_MMU))
-		kbdev->mmu_mode = kbase_mmu_mode_get_aarch64();
-	else
-		kbdev->mmu_mode = kbase_mmu_mode_get_lpae();
+	kbdev->mmu_mode = kbase_mmu_mode_get_aarch64();
 
 	mutex_init(&kbdev->kctx_list_lock);
 	INIT_LIST_HEAD(&kbdev->kctx_list);
@@ -210,8 +246,7 @@ int kbase_device_misc_init(struct kbase_device * const kbdev)
 	spin_lock_init(&kbdev->hwaccess_lock);
 
 	return 0;
-term_trace:
-	kbase_ktrace_term(kbdev);
+
 term_as:
 	kbase_device_all_as_term(kbdev);
 dma_set_mask_failed:
@@ -229,8 +264,6 @@ void kbase_device_misc_term(struct kbase_device *kbdev)
 	kbase_debug_assert_register_hook(NULL, NULL);
 #endif
 
-	kbase_instr_backend_term(kbdev);
-
 	kbase_ktrace_term(kbdev);
 
 	kbase_device_all_as_term(kbdev);
@@ -253,16 +286,6 @@ void kbase_increment_device_id(void)
 	kbase_dev_nr++;
 }
 
-int kbase_device_hwcnt_backend_jm_init(struct kbase_device *kbdev)
-{
-	return kbase_hwcnt_backend_jm_create(kbdev, &kbdev->hwcnt_gpu_iface);
-}
-
-void kbase_device_hwcnt_backend_jm_term(struct kbase_device *kbdev)
-{
-	kbase_hwcnt_backend_jm_destroy(&kbdev->hwcnt_gpu_iface);
-}
-
 int kbase_device_hwcnt_context_init(struct kbase_device *kbdev)
 {
 	return kbase_hwcnt_context_init(&kbdev->hwcnt_gpu_iface,
@@ -382,7 +405,14 @@ int kbase_device_early_init(struct kbase_device *kbdev)
 	/* We're done accessing the GPU registers for now. */
 	kbase_pm_register_access_disable(kbdev);
 
+#ifdef CONFIG_MALI_ARBITER_SUPPORT
+	if (kbdev->arb.arb_if)
+		err = kbase_arbiter_pm_install_interrupts(kbdev);
+	else
+		err = kbase_install_interrupts(kbdev);
+#else
 	err = kbase_install_interrupts(kbdev);
+#endif
 	if (err)
 		goto fail_interrupts;
 
diff --git a/drivers/gpu/arm/bifrost/device/mali_kbase_device.h b/drivers/gpu/arm/bifrost/device/mali_kbase_device.h
index 33264bcc0464..3a774fc3f9b0 100644
--- a/drivers/gpu/arm/bifrost/device/mali_kbase_device.h
+++ b/drivers/gpu/arm/bifrost/device/mali_kbase_device.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
diff --git a/drivers/gpu/arm/bifrost/device/mali_kbase_device_hw.c b/drivers/gpu/arm/bifrost/device/mali_kbase_device_hw.c
index 3a75c6c05cfa..4097296952d8 100644
--- a/drivers/gpu/arm/bifrost/device/mali_kbase_device_hw.c
+++ b/drivers/gpu/arm/bifrost/device/mali_kbase_device_hw.c
@@ -6,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -17,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
diff --git a/drivers/gpu/arm/bifrost/device/mali_kbase_device_internal.h b/drivers/gpu/arm/bifrost/device/mali_kbase_device_internal.h
index 54644582eac5..067f33ce0528 100644
--- a/drivers/gpu/arm/bifrost/device/mali_kbase_device_internal.h
+++ b/drivers/gpu/arm/bifrost/device/mali_kbase_device_internal.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
@@ -43,9 +42,6 @@ void kbase_device_vinstr_term(struct kbase_device *kbdev);
 int kbase_device_timeline_init(struct kbase_device *kbdev);
 void kbase_device_timeline_term(struct kbase_device *kbdev);
 
-int kbase_device_hwcnt_backend_jm_init(struct kbase_device *kbdev);
-void kbase_device_hwcnt_backend_jm_term(struct kbase_device *kbdev);
-
 int kbase_device_hwcnt_context_init(struct kbase_device *kbdev);
 void kbase_device_hwcnt_context_term(struct kbase_device *kbdev);
 
diff --git a/drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_fault_csf.c b/drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_fault_csf.c
index f7e9b125ba8b..ab0e3264615c 100644
--- a/drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_fault_csf.c
+++ b/drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_fault_csf.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
-#include "csf/mali_gpu_csf_registers.h"
+#include <uapi/gpu/arm/bifrost/csf/mali_gpu_csf_registers.h>
 #include "../mali_kbase_gpu_fault.h"
 
 const char *kbase_gpu_exception_name(u32 const exception_code)
@@ -29,14 +28,14 @@ const char *kbase_gpu_exception_name(u32 const exception_code)
 	const char *e;
 
 	switch (exception_code) {
-	/* Command Stream exceptions */
+	/* CS exceptions */
 	case CS_FAULT_EXCEPTION_TYPE_CS_RESOURCE_TERMINATED:
 		e = "CS_RESOURCE_TERMINATED";
 		break;
 	case CS_FAULT_EXCEPTION_TYPE_CS_INHERIT_FAULT:
 		e = "CS_INHERIT_FAULT";
 		break;
-	/* Command Stream fatal exceptions */
+	/* CS fatal exceptions */
 	case CS_FATAL_EXCEPTION_TYPE_CS_CONFIG_FAULT:
 		e = "CS_CONFIG_FAULT";
 		break;
diff --git a/drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_fault_jm.c b/drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_fault_jm.c
index 56f541516489..110e5b3244b7 100644
--- a/drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_fault_jm.c
+++ b/drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_fault_jm.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
diff --git a/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu.c b/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu.c
index 3128db4cabfc..92aa59373bcd 100644
--- a/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu.c
+++ b/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,11 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
 #include <mali_kbase_defs.h>
+#include <gpu/mali_kbase_gpu_fault.h>
 
 const char *kbase_gpu_access_type_name(u32 fault_status)
 {
diff --git a/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_fault.h b/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_fault.h
index e63c3881a3ca..9f4dc66bed94 100644
--- a/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_fault.h
+++ b/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_fault.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,15 +17,14 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_GPU_FAULT_H_
 #define _KBASE_GPU_FAULT_H_
 
-/** Returns the name associated with a Mali exception code
- *
+/**
+ * kbase_gpu_exception_name() -
+ * Returns the name associated with a Mali exception code
  * @exception_code: exception code
  *
  * This function is called from the interrupt handler when a GPU fault occurs.
diff --git a/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_regmap.h b/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_regmap.h
index d8066f43768b..8e5941ed3f3f 100644
--- a/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_regmap.h
+++ b/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_regmap.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,413 +17,17 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_GPU_REGMAP_H_
 #define _KBASE_GPU_REGMAP_H_
 
-#include "mali_kbase_gpu_coherency.h"
-#include "mali_kbase_gpu_id.h"
-#if MALI_USE_CSF
-#include "backend/mali_kbase_gpu_regmap_csf.h"
-#else
-#include "backend/mali_kbase_gpu_regmap_jm.h"
-#endif
-
-/* Begin Register Offsets */
-/* GPU control registers */
-
-#define GPU_CONTROL_BASE        0x0000
-#define GPU_CONTROL_REG(r)      (GPU_CONTROL_BASE + (r))
-#define GPU_ID                  0x000   /* (RO) GPU and revision identifier */
-#define L2_FEATURES             0x004   /* (RO) Level 2 cache features */
-#define TILER_FEATURES          0x00C   /* (RO) Tiler Features */
-#define MEM_FEATURES            0x010   /* (RO) Memory system features */
-#define MMU_FEATURES            0x014   /* (RO) MMU features */
-#define AS_PRESENT              0x018   /* (RO) Address space slots present */
-#define GPU_IRQ_RAWSTAT         0x020   /* (RW) */
-#define GPU_IRQ_CLEAR           0x024   /* (WO) */
-#define GPU_IRQ_MASK            0x028   /* (RW) */
-#define GPU_IRQ_STATUS          0x02C   /* (RO) */
-
-#define GPU_COMMAND             0x030   /* (WO) */
-#define GPU_STATUS              0x034   /* (RO) */
-
-#define GPU_DBGEN               (1 << 8)    /* DBGEN wire status */
-
-#define GPU_FAULTSTATUS         0x03C   /* (RO) GPU exception type and fault status */
-#define GPU_FAULTADDRESS_LO     0x040   /* (RO) GPU exception fault address, low word */
-#define GPU_FAULTADDRESS_HI     0x044   /* (RO) GPU exception fault address, high word */
-
-#define L2_CONFIG               0x048   /* (RW) Level 2 cache configuration */
-
-#define GROUPS_L2_COHERENT      (1 << 0) /* Cores groups are l2 coherent */
-#define SUPER_L2_COHERENT       (1 << 1) /* Shader cores within a core
-					  * supergroup are l2 coherent
-					  */
-
-#define PWR_KEY                 0x050   /* (WO) Power manager key register */
-#define PWR_OVERRIDE0           0x054   /* (RW) Power manager override settings */
-#define PWR_OVERRIDE1           0x058   /* (RW) Power manager override settings */
-
-#define CYCLE_COUNT_LO          0x090   /* (RO) Cycle counter, low word */
-#define CYCLE_COUNT_HI          0x094   /* (RO) Cycle counter, high word */
-#define TIMESTAMP_LO            0x098   /* (RO) Global time stamp counter, low word */
-#define TIMESTAMP_HI            0x09C   /* (RO) Global time stamp counter, high word */
-
-#define THREAD_MAX_THREADS      0x0A0   /* (RO) Maximum number of threads per core */
-#define THREAD_MAX_WORKGROUP_SIZE 0x0A4 /* (RO) Maximum workgroup size */
-#define THREAD_MAX_BARRIER_SIZE 0x0A8   /* (RO) Maximum threads waiting at a barrier */
-#define THREAD_FEATURES         0x0AC   /* (RO) Thread features */
-#define THREAD_TLS_ALLOC        0x310   /* (RO) Number of threads per core that TLS must be allocated for */
-
-#define TEXTURE_FEATURES_0      0x0B0   /* (RO) Support flags for indexed texture formats 0..31 */
-#define TEXTURE_FEATURES_1      0x0B4   /* (RO) Support flags for indexed texture formats 32..63 */
-#define TEXTURE_FEATURES_2      0x0B8   /* (RO) Support flags for indexed texture formats 64..95 */
-#define TEXTURE_FEATURES_3      0x0BC   /* (RO) Support flags for texture order */
-
-#define TEXTURE_FEATURES_REG(n) GPU_CONTROL_REG(TEXTURE_FEATURES_0 + ((n) << 2))
-
-#define SHADER_PRESENT_LO       0x100   /* (RO) Shader core present bitmap, low word */
-#define SHADER_PRESENT_HI       0x104   /* (RO) Shader core present bitmap, high word */
-
-#define TILER_PRESENT_LO        0x110   /* (RO) Tiler core present bitmap, low word */
-#define TILER_PRESENT_HI        0x114   /* (RO) Tiler core present bitmap, high word */
-
-#define L2_PRESENT_LO           0x120   /* (RO) Level 2 cache present bitmap, low word */
-#define L2_PRESENT_HI           0x124   /* (RO) Level 2 cache present bitmap, high word */
-
-#define STACK_PRESENT_LO        0xE00   /* (RO) Core stack present bitmap, low word */
-#define STACK_PRESENT_HI        0xE04   /* (RO) Core stack present bitmap, high word */
-
-#define SHADER_READY_LO         0x140   /* (RO) Shader core ready bitmap, low word */
-#define SHADER_READY_HI         0x144   /* (RO) Shader core ready bitmap, high word */
-
-#define TILER_READY_LO          0x150   /* (RO) Tiler core ready bitmap, low word */
-#define TILER_READY_HI          0x154   /* (RO) Tiler core ready bitmap, high word */
-
-#define L2_READY_LO             0x160   /* (RO) Level 2 cache ready bitmap, low word */
-#define L2_READY_HI             0x164   /* (RO) Level 2 cache ready bitmap, high word */
-
-#define STACK_READY_LO          0xE10   /* (RO) Core stack ready bitmap, low word */
-#define STACK_READY_HI          0xE14   /* (RO) Core stack ready bitmap, high word */
-
-#define SHADER_PWRON_LO         0x180   /* (WO) Shader core power on bitmap, low word */
-#define SHADER_PWRON_HI         0x184   /* (WO) Shader core power on bitmap, high word */
-
-#define TILER_PWRON_LO          0x190   /* (WO) Tiler core power on bitmap, low word */
-#define TILER_PWRON_HI          0x194   /* (WO) Tiler core power on bitmap, high word */
-
-#define L2_PWRON_LO             0x1A0   /* (WO) Level 2 cache power on bitmap, low word */
-#define L2_PWRON_HI             0x1A4   /* (WO) Level 2 cache power on bitmap, high word */
-
-#define STACK_PWRON_LO          0xE20   /* (RO) Core stack power on bitmap, low word */
-#define STACK_PWRON_HI          0xE24   /* (RO) Core stack power on bitmap, high word */
-
-#define SHADER_PWROFF_LO        0x1C0   /* (WO) Shader core power off bitmap, low word */
-#define SHADER_PWROFF_HI        0x1C4   /* (WO) Shader core power off bitmap, high word */
-
-#define TILER_PWROFF_LO         0x1D0   /* (WO) Tiler core power off bitmap, low word */
-#define TILER_PWROFF_HI         0x1D4   /* (WO) Tiler core power off bitmap, high word */
-
-#define L2_PWROFF_LO            0x1E0   /* (WO) Level 2 cache power off bitmap, low word */
-#define L2_PWROFF_HI            0x1E4   /* (WO) Level 2 cache power off bitmap, high word */
-
-#define STACK_PWROFF_LO         0xE30   /* (RO) Core stack power off bitmap, low word */
-#define STACK_PWROFF_HI         0xE34   /* (RO) Core stack power off bitmap, high word */
-
-#define SHADER_PWRTRANS_LO      0x200   /* (RO) Shader core power transition bitmap, low word */
-#define SHADER_PWRTRANS_HI      0x204   /* (RO) Shader core power transition bitmap, high word */
-
-#define TILER_PWRTRANS_LO       0x210   /* (RO) Tiler core power transition bitmap, low word */
-#define TILER_PWRTRANS_HI       0x214   /* (RO) Tiler core power transition bitmap, high word */
-
-#define L2_PWRTRANS_LO          0x220   /* (RO) Level 2 cache power transition bitmap, low word */
-#define L2_PWRTRANS_HI          0x224   /* (RO) Level 2 cache power transition bitmap, high word */
-
-#define STACK_PWRTRANS_LO       0xE40   /* (RO) Core stack power transition bitmap, low word */
-#define STACK_PWRTRANS_HI       0xE44   /* (RO) Core stack power transition bitmap, high word */
-
-#define SHADER_PWRACTIVE_LO     0x240   /* (RO) Shader core active bitmap, low word */
-#define SHADER_PWRACTIVE_HI     0x244   /* (RO) Shader core active bitmap, high word */
-
-#define TILER_PWRACTIVE_LO      0x250   /* (RO) Tiler core active bitmap, low word */
-#define TILER_PWRACTIVE_HI      0x254   /* (RO) Tiler core active bitmap, high word */
-
-#define L2_PWRACTIVE_LO         0x260   /* (RO) Level 2 cache active bitmap, low word */
-#define L2_PWRACTIVE_HI         0x264   /* (RO) Level 2 cache active bitmap, high word */
-
-#define COHERENCY_FEATURES      0x300   /* (RO) Coherency features present */
-#define COHERENCY_ENABLE        0x304   /* (RW) Coherency enable */
-
-#define SHADER_CONFIG           0xF04   /* (RW) Shader core configuration (implementation-specific) */
-#define TILER_CONFIG            0xF08   /* (RW) Tiler core configuration (implementation-specific) */
-#define L2_MMU_CONFIG           0xF0C   /* (RW) L2 cache and MMU configuration (implementation-specific) */
-
-/* Job control registers */
-
-#define JOB_CONTROL_BASE        0x1000
-
-#define JOB_CONTROL_REG(r)      (JOB_CONTROL_BASE + (r))
-
-#define JOB_IRQ_RAWSTAT         0x000   /* Raw interrupt status register */
-#define JOB_IRQ_CLEAR           0x004   /* Interrupt clear register */
-#define JOB_IRQ_MASK            0x008   /* Interrupt mask register */
-#define JOB_IRQ_STATUS          0x00C   /* Interrupt status register */
-
-/* MMU control registers */
-
-#define MEMORY_MANAGEMENT_BASE  0x2000
-#define MMU_REG(r)              (MEMORY_MANAGEMENT_BASE + (r))
-
-#define MMU_IRQ_RAWSTAT         0x000   /* (RW) Raw interrupt status register */
-#define MMU_IRQ_CLEAR           0x004   /* (WO) Interrupt clear register */
-#define MMU_IRQ_MASK            0x008   /* (RW) Interrupt mask register */
-#define MMU_IRQ_STATUS          0x00C   /* (RO) Interrupt status register */
-
-#define MMU_AS0                 0x400   /* Configuration registers for address space 0 */
-#define MMU_AS1                 0x440   /* Configuration registers for address space 1 */
-#define MMU_AS2                 0x480   /* Configuration registers for address space 2 */
-#define MMU_AS3                 0x4C0   /* Configuration registers for address space 3 */
-#define MMU_AS4                 0x500   /* Configuration registers for address space 4 */
-#define MMU_AS5                 0x540   /* Configuration registers for address space 5 */
-#define MMU_AS6                 0x580   /* Configuration registers for address space 6 */
-#define MMU_AS7                 0x5C0   /* Configuration registers for address space 7 */
-#define MMU_AS8                 0x600   /* Configuration registers for address space 8 */
-#define MMU_AS9                 0x640   /* Configuration registers for address space 9 */
-#define MMU_AS10                0x680   /* Configuration registers for address space 10 */
-#define MMU_AS11                0x6C0   /* Configuration registers for address space 11 */
-#define MMU_AS12                0x700   /* Configuration registers for address space 12 */
-#define MMU_AS13                0x740   /* Configuration registers for address space 13 */
-#define MMU_AS14                0x780   /* Configuration registers for address space 14 */
-#define MMU_AS15                0x7C0   /* Configuration registers for address space 15 */
-
-/* MMU address space control registers */
-
-#define MMU_AS_REG(n, r)        (MMU_REG(MMU_AS0 + ((n) << 6)) + (r))
-
-#define AS_TRANSTAB_LO         0x00	/* (RW) Translation Table Base Address for address space n, low word */
-#define AS_TRANSTAB_HI         0x04	/* (RW) Translation Table Base Address for address space n, high word */
-#define AS_MEMATTR_LO          0x08	/* (RW) Memory attributes for address space n, low word. */
-#define AS_MEMATTR_HI          0x0C	/* (RW) Memory attributes for address space n, high word. */
-#define AS_LOCKADDR_LO         0x10	/* (RW) Lock region address for address space n, low word */
-#define AS_LOCKADDR_HI         0x14	/* (RW) Lock region address for address space n, high word */
-#define AS_COMMAND             0x18	/* (WO) MMU command register for address space n */
-#define AS_FAULTSTATUS         0x1C	/* (RO) MMU fault status register for address space n */
-#define AS_FAULTADDRESS_LO     0x20	/* (RO) Fault Address for address space n, low word */
-#define AS_FAULTADDRESS_HI     0x24	/* (RO) Fault Address for address space n, high word */
-#define AS_STATUS              0x28	/* (RO) Status flags for address space n */
-
-/* (RW) Translation table configuration for address space n, low word */
-#define AS_TRANSCFG_LO         0x30
-/* (RW) Translation table configuration for address space n, high word */
-#define AS_TRANSCFG_HI         0x34
-/* (RO) Secondary fault address for address space n, low word */
-#define AS_FAULTEXTRA_LO       0x38
-/* (RO) Secondary fault address for address space n, high word */
-#define AS_FAULTEXTRA_HI       0x3C
-
-/* End Register Offsets */
+#include <uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_regmap.h>
 
 /* Include POWER_CHANGED_SINGLE in debug builds for use in irq latency test. */
 #ifdef CONFIG_MALI_BIFROST_DEBUG
+#undef GPU_IRQ_REG_ALL
 #define GPU_IRQ_REG_ALL (GPU_IRQ_REG_COMMON | POWER_CHANGED_SINGLE)
-#else /* CONFIG_MALI_BIFROST_DEBUG */
-#define GPU_IRQ_REG_ALL (GPU_IRQ_REG_COMMON)
 #endif /* CONFIG_MALI_BIFROST_DEBUG */
 
-/*
- * MMU_IRQ_RAWSTAT register values. Values are valid also for
- * MMU_IRQ_CLEAR, MMU_IRQ_MASK, MMU_IRQ_STATUS registers.
- */
-
-#define MMU_PAGE_FAULT_FLAGS    16
-
-/* Macros returning a bitmask to retrieve page fault or bus error flags from
- * MMU registers */
-#define MMU_PAGE_FAULT(n)       (1UL << (n))
-#define MMU_BUS_ERROR(n)        (1UL << ((n) + MMU_PAGE_FAULT_FLAGS))
-
-/*
- * Begin LPAE MMU TRANSTAB register values
- */
-#define AS_TRANSTAB_LPAE_ADDR_SPACE_MASK   0xfffff000
-#define AS_TRANSTAB_LPAE_ADRMODE_UNMAPPED  (0u << 0)
-#define AS_TRANSTAB_LPAE_ADRMODE_IDENTITY  (1u << 1)
-#define AS_TRANSTAB_LPAE_ADRMODE_TABLE     (3u << 0)
-#define AS_TRANSTAB_LPAE_READ_INNER        (1u << 2)
-#define AS_TRANSTAB_LPAE_SHARE_OUTER       (1u << 4)
-
-#define AS_TRANSTAB_LPAE_ADRMODE_MASK      0x00000003
-
-/*
- * Begin AARCH64 MMU TRANSTAB register values
- */
-#define MMU_HW_OUTA_BITS 40
-#define AS_TRANSTAB_BASE_MASK ((1ULL << MMU_HW_OUTA_BITS) - (1ULL << 4))
-
-/*
- * Begin MMU STATUS register values
- */
-#define AS_STATUS_AS_ACTIVE 0x01
-
-#define AS_FAULTSTATUS_EXCEPTION_CODE_MASK                      (0x7<<3)
-#define AS_FAULTSTATUS_EXCEPTION_CODE_TRANSLATION_FAULT         (0x0<<3)
-#define AS_FAULTSTATUS_EXCEPTION_CODE_PERMISSION_FAULT          (0x1<<3)
-#define AS_FAULTSTATUS_EXCEPTION_CODE_TRANSTAB_BUS_FAULT        (0x2<<3)
-#define AS_FAULTSTATUS_EXCEPTION_CODE_ACCESS_FLAG               (0x3<<3)
-#define AS_FAULTSTATUS_EXCEPTION_CODE_ADDRESS_SIZE_FAULT        (0x4<<3)
-#define AS_FAULTSTATUS_EXCEPTION_CODE_MEMORY_ATTRIBUTES_FAULT   (0x5<<3)
-
-#define AS_FAULTSTATUS_EXCEPTION_TYPE_SHIFT 0
-#define AS_FAULTSTATUS_EXCEPTION_TYPE_MASK (0xFF << AS_FAULTSTATUS_EXCEPTION_TYPE_SHIFT)
-#define AS_FAULTSTATUS_EXCEPTION_TYPE_GET(reg_val) \
-	(((reg_val)&AS_FAULTSTATUS_EXCEPTION_TYPE_MASK) >> AS_FAULTSTATUS_EXCEPTION_TYPE_SHIFT)
-#define AS_FAULTSTATUS_EXCEPTION_TYPE_TRANSLATION_FAULT_0 0xC0
-
-#define AS_FAULTSTATUS_ACCESS_TYPE_SHIFT 8
-#define AS_FAULTSTATUS_ACCESS_TYPE_MASK (0x3 << AS_FAULTSTATUS_ACCESS_TYPE_SHIFT)
-#define AS_FAULTSTATUS_ACCESS_TYPE_GET(reg_val) \
-	(((reg_val)&AS_FAULTSTATUS_ACCESS_TYPE_MASK) >> AS_FAULTSTATUS_ACCESS_TYPE_SHIFT)
-
-#define AS_FAULTSTATUS_ACCESS_TYPE_ATOMIC       (0x0)
-#define AS_FAULTSTATUS_ACCESS_TYPE_EX           (0x1)
-#define AS_FAULTSTATUS_ACCESS_TYPE_READ         (0x2)
-#define AS_FAULTSTATUS_ACCESS_TYPE_WRITE        (0x3)
-
-#define AS_FAULTSTATUS_SOURCE_ID_SHIFT 16
-#define AS_FAULTSTATUS_SOURCE_ID_MASK (0xFFFF << AS_FAULTSTATUS_SOURCE_ID_SHIFT)
-#define AS_FAULTSTATUS_SOURCE_ID_GET(reg_val) \
-	(((reg_val)&AS_FAULTSTATUS_SOURCE_ID_MASK) >> AS_FAULTSTATUS_SOURCE_ID_SHIFT)
-
-/*
- * Begin MMU TRANSCFG register values
- */
-#define AS_TRANSCFG_ADRMODE_LEGACY      0
-#define AS_TRANSCFG_ADRMODE_UNMAPPED    1
-#define AS_TRANSCFG_ADRMODE_IDENTITY    2
-#define AS_TRANSCFG_ADRMODE_AARCH64_4K  6
-#define AS_TRANSCFG_ADRMODE_AARCH64_64K 8
-
-#define AS_TRANSCFG_ADRMODE_MASK        0xF
-
-/*
- * Begin TRANSCFG register values
- */
-#define AS_TRANSCFG_PTW_MEMATTR_MASK (3ull << 24)
-#define AS_TRANSCFG_PTW_MEMATTR_NON_CACHEABLE (1ull << 24)
-#define AS_TRANSCFG_PTW_MEMATTR_WRITE_BACK (2ull << 24)
-
-#define AS_TRANSCFG_PTW_SH_MASK ((3ull << 28))
-#define AS_TRANSCFG_PTW_SH_OS (2ull << 28)
-#define AS_TRANSCFG_PTW_SH_IS (3ull << 28)
-#define AS_TRANSCFG_R_ALLOCATE (1ull << 30)
-
-/*
- * Begin Command Values
- */
-
-/* AS_COMMAND register commands */
-#define AS_COMMAND_NOP         0x00	/* NOP Operation */
-#define AS_COMMAND_UPDATE      0x01	/* Broadcasts the values in AS_TRANSTAB and ASn_MEMATTR to all MMUs */
-#define AS_COMMAND_LOCK        0x02	/* Issue a lock region command to all MMUs */
-#define AS_COMMAND_UNLOCK      0x03	/* Issue a flush region command to all MMUs */
-#define AS_COMMAND_FLUSH       0x04	/* Flush all L2 caches then issue a flush region command to all MMUs
-					   (deprecated - only for use with T60x) */
-#define AS_COMMAND_FLUSH_PT    0x04	/* Flush all L2 caches then issue a flush region command to all MMUs */
-#define AS_COMMAND_FLUSH_MEM   0x05	/* Wait for memory accesses to complete, flush all the L1s cache then
-					   flush all L2 caches then issue a flush region command to all MMUs */
-
-/* GPU_STATUS values */
-#define GPU_STATUS_PRFCNT_ACTIVE            (1 << 2)    /* Set if the performance counters are active. */
-#define GPU_STATUS_PROTECTED_MODE_ACTIVE    (1 << 7)    /* Set if protected mode is active */
-
-/* PRFCNT_CONFIG register values */
-#define PRFCNT_CONFIG_MODE_SHIFT        0 /* Counter mode position. */
-#define PRFCNT_CONFIG_AS_SHIFT          4 /* Address space bitmap position. */
-#define PRFCNT_CONFIG_SETSELECT_SHIFT   8 /* Set select position. */
-
-/* The performance counters are disabled. */
-#define PRFCNT_CONFIG_MODE_OFF          0
-/* The performance counters are enabled, but are only written out when a
- * PRFCNT_SAMPLE command is issued using the GPU_COMMAND register.
- */
-#define PRFCNT_CONFIG_MODE_MANUAL       1
-/* The performance counters are enabled, and are written out each time a tile
- * finishes rendering.
- */
-#define PRFCNT_CONFIG_MODE_TILE         2
-
-/* AS<n>_MEMATTR values from MMU_MEMATTR_STAGE1: */
-/* Use GPU implementation-defined caching policy. */
-#define AS_MEMATTR_IMPL_DEF_CACHE_POLICY 0x88ull
-/* The attribute set to force all resources to be cached. */
-#define AS_MEMATTR_FORCE_TO_CACHE_ALL    0x8Full
-/* Inner write-alloc cache setup, no outer caching */
-#define AS_MEMATTR_WRITE_ALLOC           0x8Dull
-
-/* Use GPU implementation-defined  caching policy. */
-#define AS_MEMATTR_LPAE_IMPL_DEF_CACHE_POLICY 0x48ull
-/* The attribute set to force all resources to be cached. */
-#define AS_MEMATTR_LPAE_FORCE_TO_CACHE_ALL    0x4Full
-/* Inner write-alloc cache setup, no outer caching */
-#define AS_MEMATTR_LPAE_WRITE_ALLOC           0x4Dull
-/* Set to implementation defined, outer caching */
-#define AS_MEMATTR_LPAE_OUTER_IMPL_DEF        0x88ull
-/* Set to write back memory, outer caching */
-#define AS_MEMATTR_LPAE_OUTER_WA              0x8Dull
-/* There is no LPAE support for non-cacheable, since the memory type is always
- * write-back.
- * Marking this setting as reserved for LPAE
- */
-#define AS_MEMATTR_LPAE_NON_CACHEABLE_RESERVED
-
-/* L2_MMU_CONFIG register */
-#define L2_MMU_CONFIG_ALLOW_SNOOP_DISPARITY_SHIFT       (23)
-#define L2_MMU_CONFIG_ALLOW_SNOOP_DISPARITY             (0x1 << L2_MMU_CONFIG_ALLOW_SNOOP_DISPARITY_SHIFT)
-
-/* End L2_MMU_CONFIG register */
-
-/* THREAD_* registers */
-
-/* THREAD_FEATURES IMPLEMENTATION_TECHNOLOGY values */
-#define IMPLEMENTATION_UNSPECIFIED  0
-#define IMPLEMENTATION_SILICON      1
-#define IMPLEMENTATION_FPGA         2
-#define IMPLEMENTATION_MODEL        3
-
-/* Default values when registers are not supported by the implemented hardware */
-#define THREAD_MT_DEFAULT     256
-#define THREAD_MWS_DEFAULT    256
-#define THREAD_MBS_DEFAULT    256
-#define THREAD_MR_DEFAULT     1024
-#define THREAD_MTQ_DEFAULT    4
-#define THREAD_MTGS_DEFAULT   10
-
-/* End THREAD_* registers */
-
-/* SHADER_CONFIG register */
-#define SC_LS_ALLOW_ATTR_TYPES      (1ul << 16)
-#define SC_TLS_HASH_ENABLE          (1ul << 17)
-#define SC_LS_ATTR_CHECK_DISABLE    (1ul << 18)
-#define SC_VAR_ALGORITHM            (1ul << 29)
-/* End SHADER_CONFIG register */
-
-/* TILER_CONFIG register */
-#define TC_CLOCK_GATE_OVERRIDE      (1ul << 0)
-/* End TILER_CONFIG register */
-
-/* L2_CONFIG register */
-#define L2_CONFIG_SIZE_SHIFT        16
-#define L2_CONFIG_SIZE_MASK         (0xFFul << L2_CONFIG_SIZE_SHIFT)
-#define L2_CONFIG_HASH_SHIFT        24
-#define L2_CONFIG_HASH_MASK         (0xFFul << L2_CONFIG_HASH_SHIFT)
-/* End L2_CONFIG register */
-
-/* IDVS_GROUP register */
-#define IDVS_GROUP_SIZE_SHIFT (16)
-#define IDVS_GROUP_MAX_SIZE (0x3F)
-
 #endif /* _KBASE_GPU_REGMAP_H_ */
diff --git a/drivers/gpu/arm/bifrost/ipa/Kbuild b/drivers/gpu/arm/bifrost/ipa/Kbuild
index 04aa9d82d7c5..4faa325732c7 100644
--- a/drivers/gpu/arm/bifrost/ipa/Kbuild
+++ b/drivers/gpu/arm/bifrost/ipa/Kbuild
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2016-2018 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2016-2018, 2020 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,14 +16,20 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
 bifrost_kbase-y += \
 	ipa/mali_kbase_ipa_simple.o \
-	ipa/mali_kbase_ipa.o \
-	ipa/mali_kbase_ipa_vinstr_g7x.o \
-	ipa/mali_kbase_ipa_vinstr_common.o
+	ipa/mali_kbase_ipa.o
 
 bifrost_kbase-$(CONFIG_DEBUG_FS) += ipa/mali_kbase_ipa_debugfs.o
+
+ifeq ($(MALI_USE_CSF),1)
+	bifrost_kbase-y += \
+		ipa/backend/mali_kbase_ipa_counter_csf.o \
+		ipa/backend/mali_kbase_ipa_counter_common_csf.o
+else
+	bifrost_kbase-y += \
+		ipa/backend/mali_kbase_ipa_counter_jm.o \
+		ipa/backend/mali_kbase_ipa_counter_common_jm.o
+endif
diff --git a/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_csf.c b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_csf.c
new file mode 100644
index 000000000000..89bba49a7c98
--- /dev/null
+++ b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_csf.c
@@ -0,0 +1,457 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ *
+ * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+#include "mali_kbase_ipa_counter_common_csf.h"
+#include "ipa/mali_kbase_ipa_debugfs.h"
+
+#define DEFAULT_SCALING_FACTOR 5
+
+/* If the value of GPU_ACTIVE is below this, use the simple model
+ * instead, to avoid extrapolating small amounts of counter data across
+ * large sample periods.
+ */
+#define DEFAULT_MIN_SAMPLE_CYCLES 10000
+
+/* Typical value for the sampling interval is expected to be less than 100ms,
+ * So 5 seconds is a reasonable upper limit for the time gap between the
+ * 2 samples.
+ */
+#define MAX_SAMPLE_INTERVAL_MS ((s64)5000)
+
+/* Maximum increment that is expected for a counter value during a sampling
+ * interval is derived assuming
+ * - max sampling interval of 1 second.
+ * - max GPU frequency of 2 GHz.
+ * - max number of cores as 32.
+ * - max increment of 4 in per core counter value at every clock cycle.
+ *
+ * So max increment = 2 * 10^9 * 32 * 4 = ~2^38.
+ * If a counter increases by an amount greater than this value, then an error
+ * will be returned and the simple power model will be used.
+ */
+#define MAX_COUNTER_INCREMENT (((u64)1 << 38) - 1)
+
+static inline s64 kbase_ipa_add_saturate(s64 a, s64 b)
+{
+	s64 rtn;
+
+	if (a > 0 && (S64_MAX - a) < b)
+		rtn = S64_MAX;
+	else if (a < 0 && (S64_MIN - a) > b)
+		rtn = S64_MIN;
+	else
+		rtn = a + b;
+
+	return rtn;
+}
+
+static s64 kbase_ipa_group_energy(s32 coeff, u64 counter_value)
+{
+	/* Range: 0 < counter_value < 2^38 */
+
+	/* Range: -2^59 < ret < 2^59 (as -2^21 < coeff < 2^21) */
+	return counter_value * (s64)coeff;
+}
+
+/**
+ * kbase_ipa_attach_ipa_control() - register with kbase_ipa_control
+ * @model_data: Pointer to counter model data
+ *
+ * Register IPA counter model as a client of kbase_ipa_control, which
+ * provides an interface to retreive the accumulated value of hardware
+ * counters to calculate energy consumption.
+ *
+ * Return: 0 on success, or an error code.
+ */
+static int
+kbase_ipa_attach_ipa_control(struct kbase_ipa_counter_model_data *model_data)
+{
+	struct kbase_device *kbdev = model_data->kbdev;
+	struct kbase_ipa_control_perf_counter *perf_counters;
+	u32 cnt_idx = 0;
+	int err;
+	size_t i;
+
+	/* Value for GPU_ACTIVE counter also needs to be queried. It is required
+	 * for the normalization of top-level and shader core counters.
+	 */
+	model_data->num_counters = 1 + model_data->num_top_level_cntrs +
+				   model_data->num_shader_cores_cntrs;
+
+	perf_counters = kcalloc(model_data->num_counters,
+				sizeof(*perf_counters), GFP_KERNEL);
+
+	if (!perf_counters) {
+		dev_err(kbdev->dev,
+			"Failed to allocate memory for perf_counters array");
+		return -ENOMEM;
+	}
+
+	/* Fill in the description for GPU_ACTIVE counter which is always
+	 * needed, as mentioned above, regardless of the energy model used
+	 * by the CSF GPUs.
+	 */
+	perf_counters[cnt_idx].type = KBASE_IPA_CORE_TYPE_CSHW;
+	perf_counters[cnt_idx].idx = GPU_ACTIVE_CNT_IDX;
+	perf_counters[cnt_idx].gpu_norm = false;
+	perf_counters[cnt_idx].scaling_factor = 1;
+	cnt_idx++;
+
+	for (i = 0; i < model_data->num_top_level_cntrs; ++i) {
+		const struct kbase_ipa_counter *counter =
+			&model_data->top_level_cntrs_def[i];
+
+		perf_counters[cnt_idx].type = counter->counter_block_type;
+		perf_counters[cnt_idx].idx = counter->counter_block_offset;
+		perf_counters[cnt_idx].gpu_norm = false;
+		perf_counters[cnt_idx].scaling_factor = 1;
+		cnt_idx++;
+	}
+
+	for (i = 0; i < model_data->num_shader_cores_cntrs; ++i) {
+		const struct kbase_ipa_counter *counter =
+			&model_data->shader_cores_cntrs_def[i];
+
+		perf_counters[cnt_idx].type = counter->counter_block_type;
+		perf_counters[cnt_idx].idx = counter->counter_block_offset;
+		perf_counters[cnt_idx].gpu_norm = false;
+		perf_counters[cnt_idx].scaling_factor = 1;
+		cnt_idx++;
+	}
+
+	err = kbase_ipa_control_register(kbdev, perf_counters,
+					 model_data->num_counters,
+					 &model_data->ipa_control_client);
+	if (err)
+		dev_err(kbdev->dev,
+			"Failed to register IPA with kbase_ipa_control");
+
+	kfree(perf_counters);
+	return err;
+}
+
+/**
+ * kbase_ipa_detach_ipa_control() - De-register from kbase_ipa_control.
+ * @model_data: Pointer to counter model data
+ */
+static void
+kbase_ipa_detach_ipa_control(struct kbase_ipa_counter_model_data *model_data)
+{
+	if (model_data->ipa_control_client) {
+		kbase_ipa_control_unregister(model_data->kbdev,
+					     model_data->ipa_control_client);
+		model_data->ipa_control_client = NULL;
+	}
+}
+
+static int calculate_coeff(struct kbase_ipa_counter_model_data *model_data,
+			   const struct kbase_ipa_counter *const cnt_defs,
+			   size_t num_counters, s32 *counter_coeffs,
+			   u64 *counter_values, u32 active_cycles, u32 *coeffp)
+{
+	u64 coeff = 0, coeff_mul = 0;
+	s64 total_energy = 0;
+	size_t i;
+
+	/* Range for the 'counter_value' is [0, 2^38)
+	 * Range for the 'coeff' is [-2^21, 2^21]
+	 * So range for the 'group_energy' is [-2^59, 2^59) and range for the
+	 * 'total_energy' is +/- 2^59 * number of IPA groups (~16), i.e.
+	 * [-2^63, 2^63).
+	 */
+	for (i = 0; i < num_counters; i++) {
+		s32 coeff = counter_coeffs[i];
+		u64 counter_value = counter_values[i];
+		s64 group_energy = kbase_ipa_group_energy(coeff, counter_value);
+
+		if (counter_value > MAX_COUNTER_INCREMENT) {
+			dev_warn(model_data->kbdev->dev,
+				 "Increment in counter %s more than expected",
+				 cnt_defs[i].name);
+			return -ERANGE;
+		}
+
+		total_energy =
+			kbase_ipa_add_saturate(total_energy, group_energy);
+	}
+
+	/* Range: 0 <= coeff < 2^63 */
+	if (total_energy >= 0)
+		coeff = total_energy;
+	else
+		dev_dbg(model_data->kbdev->dev,
+			"Energy value came negative as %lld", total_energy);
+
+	/* Range: 0 <= coeff < 2^63 (because active_cycles >= 1). However, this
+	 * can be constrained further: the value of counters that are being
+	 * used for dynamic power estimation can only increment by about 128
+	 * maximum per clock cycle. This is because max number of shader
+	 * cores is expected to be 32 (max number of L2 slices is expected to
+	 * be 8) and some counters (per shader core) like SC_BEATS_RD_TEX_EXT &
+	 * SC_EXEC_STARVE_ARITH can increment by 4 every clock cycle.
+	 * Each "beat" is defined as 128 bits and each shader core can
+	 * (currently) do 512 bits read and 512 bits write to/from the L2
+	 * cache per cycle, so the SC_BEATS_RD_TEX_EXT counter can increment
+	 * [0, 4] per shader core per cycle.
+	 * We can thus write the range of 'coeff' in terms of active_cycles:
+	 *
+	 * coeff = SUM(coeffN * counterN * num_cores_for_counterN)
+	 * coeff <= SUM(coeffN * counterN) * max_cores
+	 * coeff <= num_IPA_groups * max_coeff * max_counter * max_cores
+	 *       (substitute max_counter = 2^2 * active_cycles)
+	 * coeff <= num_IPA_groups * max_coeff * 2^2 * active_cycles * max_cores
+	 * coeff <=    2^4         *    2^21   * 2^2 * active_cycles * 2^5
+	 * coeff <= 2^32 * active_cycles
+	 *
+	 * So after the division: 0 <= coeff <= 2^32
+	 */
+	coeff = div_u64(coeff, active_cycles);
+
+	/* Not all models were derived at the same reference voltage. Voltage
+	 * scaling is done by multiplying by V^2, so we need to *divide* by
+	 * Vref^2 here.
+	 * Range: 0 <= coeff <= 2^35
+	 */
+	coeff = div_u64(coeff * 1000, max(model_data->reference_voltage, 1));
+	/* Range: 0 <= coeff <= 2^38 */
+	coeff = div_u64(coeff * 1000, max(model_data->reference_voltage, 1));
+
+	/* Scale by user-specified integer factor.
+	 * Range: 0 <= coeff_mul < 2^43
+	 */
+	coeff_mul = coeff * model_data->scaling_factor;
+
+	/* The power models have results with units
+	 * mW/(MHz V^2), i.e. nW/(Hz V^2). With precision of 1/1000000, this
+	 * becomes fW/(Hz V^2), which are the units of coeff_mul. However,
+	 * kbase_scale_dynamic_power() expects units of pW/(Hz V^2), so divide
+	 * by 1000.
+	 * Range: 0 <= coeff_mul < 2^33
+	 */
+	coeff_mul = div_u64(coeff_mul, 1000u);
+
+	/* Clamp to a sensible range - 2^16 gives about 14W at 400MHz/750mV */
+	*coeffp = clamp(coeff_mul, (u64)0, (u64)1 << 16);
+
+	return 0;
+}
+
+int kbase_ipa_counter_dynamic_coeff(struct kbase_ipa_model *model, u32 *coeffp)
+{
+	struct kbase_ipa_counter_model_data *model_data =
+		(struct kbase_ipa_counter_model_data *)model->model_data;
+	struct kbase_device *kbdev = model->kbdev;
+	s32 *counter_coeffs_p = model_data->counter_coeffs;
+	u64 *cnt_values_p = model_data->counter_values;
+	const u64 num_counters = model_data->num_counters;
+	u32 active_cycles;
+	ktime_t now, diff;
+	s64 diff_ms;
+	int ret;
+
+	lockdep_assert_held(&kbdev->ipa.lock);
+
+	/* The last argument is supposed to be a pointer to the location that
+	 * will store the time for which GPU has been in protected mode since
+	 * last query. This can be passed as NULL as counter model itself will
+	 * not be used when GPU enters protected mode, as IPA is supposed to
+	 * switch to the simple power model.
+	 */
+	ret = kbase_ipa_control_query(kbdev,
+				      model_data->ipa_control_client,
+				      cnt_values_p, num_counters, NULL);
+	if (WARN_ON(ret))
+		return ret;
+
+	now = ktime_get();
+	diff = ktime_sub(now, kbdev->ipa.last_sample_time);
+	diff_ms = ktime_to_ms(diff);
+
+	kbdev->ipa.last_sample_time = now;
+
+	/* The counter values cannot be relied upon if the sampling interval was
+	 * too long. Typically this will happen when the polling is started
+	 * after the temperature has risen above a certain trip point. After
+	 * that regular calls every 25-100 ms interval are expected.
+	 */
+	if (diff_ms > MAX_SAMPLE_INTERVAL_MS) {
+		dev_dbg(kbdev->dev,
+			"Last sample was taken %lld milli seconds ago",
+			diff_ms);
+		return -EOVERFLOW;
+	}
+
+	/* Range: 0 (GPU not used at all), to the max sampling interval, say
+	 * 1 seconds, * max GPU frequency (GPU 100% utilized).
+	 * 0 <= active_cycles <= 1 * ~2GHz
+	 * 0 <= active_cycles < 2^31
+	 */
+	if (*cnt_values_p > U32_MAX) {
+		dev_warn(kbdev->dev,
+			 "Increment in GPU_ACTIVE counter more than expected");
+		return -ERANGE;
+	}
+
+	active_cycles = (u32)*cnt_values_p;
+
+	/* If the value of the active_cycles is less than the threshold, then
+	 * return an error so that IPA framework can approximate using the
+	 * cached simple model results instead. This may be more accurate
+	 * than extrapolating using a very small counter dump.
+	 */
+	if (active_cycles < (u32)max(model_data->min_sample_cycles, 0))
+		return -ENODATA;
+
+	/* Range: 1 <= active_cycles < 2^31 */
+	active_cycles = max(1u, active_cycles);
+
+	cnt_values_p++;
+	ret = calculate_coeff(model_data, model_data->top_level_cntrs_def,
+			      model_data->num_top_level_cntrs,
+			      counter_coeffs_p, cnt_values_p, active_cycles,
+			      &coeffp[KBASE_IPA_BLOCK_TYPE_TOP_LEVEL]);
+	if (ret)
+		return ret;
+
+	cnt_values_p += model_data->num_top_level_cntrs;
+	counter_coeffs_p += model_data->num_top_level_cntrs;
+	ret = calculate_coeff(model_data, model_data->shader_cores_cntrs_def,
+			      model_data->num_shader_cores_cntrs,
+			      counter_coeffs_p, cnt_values_p, active_cycles,
+			      &coeffp[KBASE_IPA_BLOCK_TYPE_SHADER_CORES]);
+
+	return ret;
+}
+
+void kbase_ipa_counter_reset_data(struct kbase_ipa_model *model)
+{
+	struct kbase_ipa_counter_model_data *model_data =
+		(struct kbase_ipa_counter_model_data *)model->model_data;
+	u64 *cnt_values_p = model_data->counter_values;
+	const u64 num_counters = model_data->num_counters;
+	int ret;
+
+	lockdep_assert_held(&model->kbdev->ipa.lock);
+
+	ret = kbase_ipa_control_query(model->kbdev,
+				      model_data->ipa_control_client,
+				      cnt_values_p, num_counters, NULL);
+	WARN_ON(ret);
+}
+
+int kbase_ipa_counter_common_model_init(struct kbase_ipa_model *model,
+		const struct kbase_ipa_counter *top_level_cntrs_def,
+		size_t num_top_level_cntrs,
+		const struct kbase_ipa_counter *shader_cores_cntrs_def,
+		size_t num_shader_cores_cntrs,
+		s32 reference_voltage)
+{
+	struct kbase_ipa_counter_model_data *model_data;
+	s32 *counter_coeffs_p;
+	int err = 0;
+	size_t i;
+
+	if (!model || !top_level_cntrs_def || !shader_cores_cntrs_def ||
+	    !num_top_level_cntrs || !num_shader_cores_cntrs)
+		return -EINVAL;
+
+	model_data = kzalloc(sizeof(*model_data), GFP_KERNEL);
+	if (!model_data)
+		return -ENOMEM;
+
+	model_data->kbdev = model->kbdev;
+
+	model_data->top_level_cntrs_def = top_level_cntrs_def;
+	model_data->num_top_level_cntrs = num_top_level_cntrs;
+
+	model_data->shader_cores_cntrs_def = shader_cores_cntrs_def;
+	model_data->num_shader_cores_cntrs = num_shader_cores_cntrs;
+
+	model->model_data = (void *)model_data;
+
+	counter_coeffs_p = model_data->counter_coeffs;
+
+	for (i = 0; i < model_data->num_top_level_cntrs; ++i) {
+		const struct kbase_ipa_counter *counter =
+			&model_data->top_level_cntrs_def[i];
+
+		*counter_coeffs_p = counter->coeff_default_value;
+
+		err = kbase_ipa_model_add_param_s32(
+			model, counter->name, counter_coeffs_p, 1, false);
+		if (err)
+			goto exit;
+
+		counter_coeffs_p++;
+	}
+
+	for (i = 0; i < model_data->num_shader_cores_cntrs; ++i) {
+		const struct kbase_ipa_counter *counter =
+			&model_data->shader_cores_cntrs_def[i];
+
+		*counter_coeffs_p = counter->coeff_default_value;
+
+		err = kbase_ipa_model_add_param_s32(
+			model, counter->name, counter_coeffs_p, 1, false);
+		if (err)
+			goto exit;
+
+		counter_coeffs_p++;
+	}
+
+	model_data->scaling_factor = DEFAULT_SCALING_FACTOR;
+	err = kbase_ipa_model_add_param_s32(
+		model, "scale", &model_data->scaling_factor, 1, false);
+	if (err)
+		goto exit;
+
+	model_data->min_sample_cycles = DEFAULT_MIN_SAMPLE_CYCLES;
+	err = kbase_ipa_model_add_param_s32(model, "min_sample_cycles",
+					    &model_data->min_sample_cycles, 1,
+					    false);
+	if (err)
+		goto exit;
+
+	model_data->reference_voltage = reference_voltage;
+	err = kbase_ipa_model_add_param_s32(model, "reference_voltage",
+					    &model_data->reference_voltage, 1,
+					    false);
+	if (err)
+		goto exit;
+
+	err = kbase_ipa_attach_ipa_control(model_data);
+
+exit:
+	if (err) {
+		kbase_ipa_model_param_free_all(model);
+		kfree(model_data);
+	}
+	return err;
+}
+
+void kbase_ipa_counter_common_model_term(struct kbase_ipa_model *model)
+{
+	struct kbase_ipa_counter_model_data *model_data =
+		(struct kbase_ipa_counter_model_data *)model->model_data;
+
+	kbase_ipa_detach_ipa_control(model_data);
+	kfree(model_data);
+}
diff --git a/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_csf.h b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_csf.h
new file mode 100644
index 000000000000..8e299314d7de
--- /dev/null
+++ b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_csf.h
@@ -0,0 +1,159 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ *
+ * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+#ifndef _KBASE_IPA_COUNTER_COMMON_CSF_H_
+#define _KBASE_IPA_COUNTER_COMMON_CSF_H_
+
+#include "mali_kbase.h"
+#include "csf/ipa_control/mali_kbase_csf_ipa_control.h"
+
+/* Maximum number of HW counters used by the IPA counter model. */
+#define KBASE_IPA_MAX_COUNTER_DEF_NUM 24
+
+struct kbase_ipa_counter_model_data;
+
+/**
+ * struct kbase_ipa_counter_model_data - IPA counter model context per device
+ * @kbdev:               Pointer to kbase device
+ * @ipa_control_client:  Handle returned on registering IPA counter model as a
+ *                       client of kbase_ipa_control.
+ * @top_level_cntrs_def: Array of description of HW counters used by the IPA
+ *                       counter model for top-level.
+ * @num_top_level_cntrs: Number of elements in @top_level_cntrs_def array.
+ * @shader_cores_cntrs_def: Array of description of HW counters used by the IPA
+ *                       counter model for shader cores.
+ * @num_shader_cores_cntrs: Number of elements in @shader_cores_cntrs_def array.
+ * @counter_coeffs:      Buffer to store coefficient value used for HW counters
+ * @counter_values:      Buffer to store the accumulated value of HW counters
+ *                       retreived from kbase_ipa_control.
+ * @num_counters:        Number of counters queried from kbase_ipa_control.
+ * @reference_voltage:   voltage, in mV, of the operating point used when
+ *                       deriving the power model coefficients. Range approx
+ *                       0.1V - 5V (~= 8V): 2^7 <= reference_voltage <= 2^13
+ * @scaling_factor:      User-specified power scaling factor. This is an
+ *                       integer, which is multiplied by the power coefficient
+ *                       just before OPP scaling.
+ *                       Range approx 0-32: 0 < scaling_factor < 2^5
+ * @min_sample_cycles:   If the value of the GPU_ACTIVE counter (the number of
+ *                       cycles the GPU was working) is less than
+ *                       min_sample_cycles, the counter model will return an
+ *                       error, causing the IPA framework to approximate using
+ *                       the cached simple model results instead. This may be
+ *                       more accurate than extrapolating using a very small
+ *                       counter dump.
+ */
+struct kbase_ipa_counter_model_data {
+	struct kbase_device *kbdev;
+	void *ipa_control_client;
+	const struct kbase_ipa_counter *top_level_cntrs_def;
+	size_t num_top_level_cntrs;
+	const struct kbase_ipa_counter *shader_cores_cntrs_def;
+	size_t num_shader_cores_cntrs;
+	s32 counter_coeffs[KBASE_IPA_MAX_COUNTER_DEF_NUM];
+	u64 counter_values[KBASE_IPA_MAX_COUNTER_DEF_NUM];
+	u64 num_counters;
+	s32 reference_voltage;
+	s32 scaling_factor;
+	s32 min_sample_cycles;
+};
+
+/**
+ * struct kbase_ipa_counter - represents a single HW counter used by IPA model
+ * @name:                 Name of the HW counter used by IPA counter model
+ *                        for energy estimation.
+ * @coeff_default_value:  Default value of coefficient for the counter.
+ *                        Coefficients are interpreted as fractions where the
+ *                        denominator is 1000000.
+ * @counter_block_offset: Index to the counter within the counter block of
+ *                        type @counter_block_type.
+ * @counter_block_type:   Type of the counter block.
+ */
+struct kbase_ipa_counter {
+	const char *name;
+	s32 coeff_default_value;
+	u32 counter_block_offset;
+	enum kbase_ipa_core_type counter_block_type;
+};
+
+/**
+ * kbase_ipa_counter_dynamic_coeff() - calculate dynamic power based on HW counters
+ * @model:		pointer to instantiated model
+ * @coeffp:		pointer to location where calculated power, in
+ *			pW/(Hz V^2), is stored for top level and shader cores.
+ *
+ * This is a GPU-agnostic implementation of the get_dynamic_coeff()
+ * function of an IPA model. It relies on the model being populated
+ * with GPU-specific attributes at initialization time.
+ *
+ * Return: 0 on success, or an error code.
+ */
+int kbase_ipa_counter_dynamic_coeff(struct kbase_ipa_model *model, u32 *coeffp);
+
+/**
+ * kbase_ipa_counter_reset_data() - Reset the counters data used for dynamic
+ *                                  power estimation
+ * @model:		pointer to instantiated model
+ *
+ * Retrieve the accumulated value of HW counters from the kbase_ipa_control
+ * component, without doing any processing, which is effectively a reset as the
+ * next call to kbase_ipa_counter_dynamic_coeff() will see the increment in
+ * counter values from this point onwards.
+ */
+void kbase_ipa_counter_reset_data(struct kbase_ipa_model *model);
+
+/**
+ * kbase_ipa_counter_common_model_init() - initialize ipa power model
+ * @model:		 Pointer to the ipa power model to initialize
+ * @top_level_cntrs_def: Array corresponding to the HW counters used in the
+ *                       top level counter model, contains the counter index,
+ *                       default value of the coefficient.
+ * @num_top_level_cntrs: Number of elements in the array @top_level_cntrs_def
+ * @shader_cores_cntrs_def: Array corresponding to the HW counters used in the
+ *                       shader cores counter model, contains the counter index,
+ *                       default value of the coefficient.
+ * @num_shader_cores_cntrs: Number of elements in the array
+ *                          @shader_cores_cntrs_def.
+ * @reference_voltage:   voltage, in mV, of the operating point used when
+ *                       deriving the power model coefficients.
+ *
+ * This function performs initialization steps common for ipa counter based
+ * model of all CSF GPUs. The set of counters and their respective weights
+ * could be different for each GPU. The tuple of counter index and weight
+ * is passed via  @top_level_cntrs_def and @shader_cores_cntrs_def array.
+ *
+ * Return: 0 on success, error code otherwise
+ */
+int kbase_ipa_counter_common_model_init(struct kbase_ipa_model *model,
+		const struct kbase_ipa_counter *top_level_cntrs_def,
+		size_t num_top_level_cntrs,
+		const struct kbase_ipa_counter *shader_cores_cntrs_def,
+		size_t num_shader_cores_cntrs,
+		s32 reference_voltage);
+/**
+ * kbase_ipa_counter_common_model_term() - terminate ipa power model
+ * @model: ipa power model to terminate
+ *
+ * This function performs all necessary steps to terminate ipa power model
+ * including clean up of resources allocated to hold model data.
+ */
+void kbase_ipa_counter_common_model_term(struct kbase_ipa_model *model);
+
+#endif /* _KBASE_IPA_COUNTER_COMMON_CSF_H_ */
diff --git a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_vinstr_common.c b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_jm.c
similarity index 97%
rename from drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_vinstr_common.c
rename to drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_jm.c
index 702db1623101..076dcd0266df 100644
--- a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_vinstr_common.c
+++ b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_jm.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2017-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-#include "mali_kbase_ipa_vinstr_common.h"
-#include "mali_kbase_ipa_debugfs.h"
+#include "mali_kbase_ipa_counter_common_jm.h"
+#include "ipa/mali_kbase_ipa_debugfs.h"
 
 #define DEFAULT_SCALING_FACTOR 5
 
@@ -273,6 +272,12 @@ int kbase_ipa_vinstr_dynamic_coeff(struct kbase_ipa_model *model, u32 *coeffp)
 	return err;
 }
 
+void kbase_ipa_vinstr_reset_data(struct kbase_ipa_model *model)
+{
+	/* Currently not implemented */
+	WARN_ON_ONCE(1);
+}
+
 int kbase_ipa_vinstr_common_model_init(struct kbase_ipa_model *model,
 				       const struct kbase_ipa_group *ipa_groups_def,
 				       size_t ipa_group_size,
diff --git a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_vinstr_common.h b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_jm.h
similarity index 88%
rename from drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_vinstr_common.h
rename to drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_jm.h
index 46e3cd4bc6e1..24602beed3d2 100644
--- a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_vinstr_common.h
+++ b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_common_jm.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2017-2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2017-2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-#ifndef _KBASE_IPA_VINSTR_COMMON_H_
-#define _KBASE_IPA_VINSTR_COMMON_H_
+#ifndef _KBASE_IPA_COUNTER_COMMON_JM_H_
+#define _KBASE_IPA_COUNTER_COMMON_JM_H_
 
 #include "mali_kbase.h"
 #include "mali_kbase_hwcnt_virtualizer.h"
@@ -47,6 +46,7 @@ typedef u32 (*kbase_ipa_get_active_cycles_callback)(struct kbase_ipa_model_vinst
 /**
  * struct kbase_ipa_model_vinstr_data - IPA context per device
  * @kbdev:               pointer to kbase device
+ * @group_values:        values of coefficients for IPA groups
  * @groups_def:          Array of IPA groups.
  * @groups_def_num:      Number of elements in the array of IPA groups.
  * @get_active_cycles:   Callback to return number of active cycles during
@@ -102,7 +102,7 @@ struct kbase_ipa_group {
  * @model_data:		pointer to model data
  * @coeff:		model coefficient. Unity is ~2^20, so range approx
  *			+/- 4.0: -2^22 < coeff < 2^22
- * @counter		offset in bytes of the counter used to calculate energy
+ * @counter:		offset in bytes of the counter used to calculate energy
  *			for IPA group
  *
  * Calculate energy estimation based on hardware counter `counter'
@@ -149,7 +149,7 @@ s64 kbase_ipa_single_counter(
 
 /**
  * attach_vinstr() - attach a vinstr_buffer to an IPA model.
- * @model_data		pointer to model data
+ * @model_data:		pointer to model data
  *
  * Attach a vinstr_buffer to an IPA model. The vinstr_buffer
  * allows access to the hardware counters used to calculate
@@ -161,7 +161,7 @@ int kbase_ipa_attach_vinstr(struct kbase_ipa_model_vinstr_data *model_data);
 
 /**
  * detach_vinstr() - detach a vinstr_buffer from an IPA model.
- * @model_data		pointer to model data
+ * @model_data:		pointer to model data
  *
  * Detach a vinstr_buffer from an IPA model.
  */
@@ -181,6 +181,19 @@ void kbase_ipa_detach_vinstr(struct kbase_ipa_model_vinstr_data *model_data);
  */
 int kbase_ipa_vinstr_dynamic_coeff(struct kbase_ipa_model *model, u32 *coeffp);
 
+/**
+ * kbase_ipa_vinstr_reset_data() - Reset the counters data used for dynamic
+ *                                 power estimation
+ * @model:		pointer to instantiated model
+ *
+ * Currently it is not implemented for JM GPUs.
+ * When implemented it is expected to retrieve the accumulated value of HW
+ * counters from the Vinstr component, without doing any processing, which is
+ * effectively a reset as the next call to kbase_ipa_counter_dynamic_coeff()
+ * will see the increment in counter values from this point onwards.
+ */
+void kbase_ipa_vinstr_reset_data(struct kbase_ipa_model *model);
+
 /**
  * kbase_ipa_vinstr_common_model_init() - initialize ipa power model
  * @model:		ipa power model to initialize
@@ -214,4 +227,4 @@ int kbase_ipa_vinstr_common_model_init(struct kbase_ipa_model *model,
  */
 void kbase_ipa_vinstr_common_model_term(struct kbase_ipa_model *model);
 
-#endif /* _KBASE_IPA_VINSTR_COMMON_H_ */
+#endif /* _KBASE_IPA_COUNTER_COMMON_JM_H_ */
diff --git a/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_csf.c b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_csf.c
new file mode 100644
index 000000000000..9326b0195544
--- /dev/null
+++ b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_csf.c
@@ -0,0 +1,164 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ *
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+#include "mali_kbase_ipa_counter_common_csf.h"
+#include "mali_kbase.h"
+
+/* MEMSYS counter block offsets */
+#define L2_RD_MSG_IN            (16)
+#define L2_EXT_WRITE_NOSNP_FULL (43)
+
+/* SC counter block offsets */
+#define FRAG_QUADS_EZS_UPDATE   (13)
+#define EXEC_INSTR_FMA          (27)
+#define TEX_FILT_NUM_OPS        (39)
+#define LS_MEM_READ_SHORT       (45)
+#define LS_MEM_WRITE_SHORT      (47)
+#define VARY_SLOT_16            (51)
+
+/* Tiler counter block offsets */
+#define IDVS_POS_SHAD_STALL     (23)
+#define PREFETCH_STALL          (25)
+#define VFETCH_POS_READ_WAIT    (29)
+#define IDVS_VAR_SHAD_STALL     (38)
+
+#define COUNTER_DEF(cnt_name, coeff, cnt_idx, block_type)	\
+	{							\
+		.name = cnt_name,				\
+		.coeff_default_value = coeff,			\
+		.counter_block_offset = cnt_idx,		\
+		.counter_block_type = block_type,		\
+	}
+
+#define CSHW_COUNTER_DEF(cnt_name, coeff, cnt_idx)	\
+	COUNTER_DEF(cnt_name, coeff, cnt_idx, KBASE_IPA_CORE_TYPE_CSHW)
+
+#define MEMSYS_COUNTER_DEF(cnt_name, coeff, cnt_idx)	\
+	COUNTER_DEF(cnt_name, coeff, cnt_idx, KBASE_IPA_CORE_TYPE_MEMSYS)
+
+#define SC_COUNTER_DEF(cnt_name, coeff, cnt_idx)	\
+	COUNTER_DEF(cnt_name, coeff, cnt_idx, KBASE_IPA_CORE_TYPE_SHADER)
+
+#define TILER_COUNTER_DEF(cnt_name, coeff, cnt_idx)	\
+	COUNTER_DEF(cnt_name, coeff, cnt_idx, KBASE_IPA_CORE_TYPE_TILER)
+
+/* Table of description of HW counters used by IPA counter model.
+ *
+ * This table provides a description of each performance counter
+ * used by the top level counter model for energy estimation.
+ */
+static const struct kbase_ipa_counter ipa_top_level_cntrs_def_todx[] = {
+	MEMSYS_COUNTER_DEF("l2_rd_msg_in", 295631, L2_RD_MSG_IN),
+	MEMSYS_COUNTER_DEF("l2_ext_write_nosnp_ull", 325168, L2_EXT_WRITE_NOSNP_FULL),
+
+	TILER_COUNTER_DEF("prefetch_stall", 145435, PREFETCH_STALL),
+	TILER_COUNTER_DEF("idvs_var_shad_stall", -171917, IDVS_VAR_SHAD_STALL),
+	TILER_COUNTER_DEF("idvs_pos_shad_stall", 109980, IDVS_POS_SHAD_STALL),
+	TILER_COUNTER_DEF("vfetch_pos_read_wait", -119118, VFETCH_POS_READ_WAIT),
+};
+
+ /* This table provides a description of each performance counter
+  * used by the shader cores counter model for energy estimation.
+  */
+ static const struct kbase_ipa_counter ipa_shader_core_cntrs_def_todx[] = {
+	SC_COUNTER_DEF("exec_instr_fma", 505449, EXEC_INSTR_FMA),
+	SC_COUNTER_DEF("tex_filt_num_operations", 574869, TEX_FILT_NUM_OPS),
+	SC_COUNTER_DEF("ls_mem_read_short", 60917, LS_MEM_READ_SHORT),
+	SC_COUNTER_DEF("frag_quads_ezs_update", 694555, FRAG_QUADS_EZS_UPDATE),
+	SC_COUNTER_DEF("ls_mem_write_short", 698290, LS_MEM_WRITE_SHORT),
+	SC_COUNTER_DEF("vary_slot_16", 181069, VARY_SLOT_16),
+};
+
+#define IPA_POWER_MODEL_OPS(gpu, init_token) \
+	const struct kbase_ipa_model_ops kbase_ ## gpu ## _ipa_model_ops = { \
+		.name = "mali-" #gpu "-power-model", \
+		.init = kbase_ ## init_token ## _power_model_init, \
+		.term = kbase_ipa_counter_common_model_term, \
+		.get_dynamic_coeff = kbase_ipa_counter_dynamic_coeff, \
+		.reset_counter_data = kbase_ipa_counter_reset_data, \
+	}; \
+	KBASE_EXPORT_TEST_API(kbase_ ## gpu ## _ipa_model_ops)
+
+#define STANDARD_POWER_MODEL(gpu, reference_voltage) \
+	static int kbase_ ## gpu ## _power_model_init(\
+			struct kbase_ipa_model *model) \
+	{ \
+		BUILD_BUG_ON((1 + \
+			      ARRAY_SIZE(ipa_top_level_cntrs_def_ ## gpu) +\
+			      ARRAY_SIZE(ipa_shader_core_cntrs_def_ ## gpu)) > \
+			      KBASE_IPA_MAX_COUNTER_DEF_NUM); \
+		return kbase_ipa_counter_common_model_init(model, \
+			ipa_top_level_cntrs_def_ ## gpu, \
+			ARRAY_SIZE(ipa_top_level_cntrs_def_ ## gpu), \
+			ipa_shader_core_cntrs_def_ ## gpu, \
+			ARRAY_SIZE(ipa_shader_core_cntrs_def_ ## gpu), \
+			(reference_voltage)); \
+	} \
+	IPA_POWER_MODEL_OPS(gpu, gpu)
+
+
+#define ALIAS_POWER_MODEL(gpu, as_gpu) \
+	IPA_POWER_MODEL_OPS(gpu, as_gpu)
+
+/* Reference voltage value is 750 mV.
+ */
+STANDARD_POWER_MODEL(todx, 750);
+
+/* Assuming LODX is an alias of TODX for IPA */
+ALIAS_POWER_MODEL(lodx, todx);
+
+static const struct kbase_ipa_model_ops *ipa_counter_model_ops[] = {
+	&kbase_todx_ipa_model_ops,
+	&kbase_lodx_ipa_model_ops
+};
+
+const struct kbase_ipa_model_ops *kbase_ipa_counter_model_ops_find(
+		struct kbase_device *kbdev, const char *name)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(ipa_counter_model_ops); ++i) {
+		const struct kbase_ipa_model_ops *ops =
+			ipa_counter_model_ops[i];
+
+		if (!strcmp(ops->name, name))
+			return ops;
+	}
+
+	dev_err(kbdev->dev, "power model \'%s\' not found\n", name);
+
+	return NULL;
+}
+
+const char *kbase_ipa_counter_model_name_from_id(u32 gpu_id)
+{
+	const u32 prod_id = (gpu_id & GPU_ID_VERSION_PRODUCT_ID) >>
+			GPU_ID_VERSION_PRODUCT_ID_SHIFT;
+
+	switch (GPU_ID2_MODEL_MATCH_VALUE(prod_id)) {
+	case GPU_ID2_PRODUCT_TODX:
+		return "mali-todx-power-model";
+	case GPU_ID2_PRODUCT_LODX:
+		return "mali-lodx-power-model";
+	default:
+		return NULL;
+	}
+}
diff --git a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_vinstr_g7x.c b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_jm.c
similarity index 86%
rename from drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_vinstr_g7x.c
rename to drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_jm.c
index 83174eb66ded..8d33b139169f 100644
--- a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_vinstr_g7x.c
+++ b/drivers/gpu/arm/bifrost/ipa/backend/mali_kbase_ipa_counter_jm.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2016-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2016-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,14 +17,15 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
+
 #include <linux/thermal.h>
 
-#include "mali_kbase_ipa_vinstr_common.h"
+#include "mali_kbase_ipa_counter_common_jm.h"
 #include "mali_kbase.h"
-
+#ifdef CONFIG_MALI_BIFROST_NO_MALI
+#include <backend/gpu/mali_kbase_model_dummy.h>
+#endif
 
 /* Performance counter blocks base offsets */
 #define JM_BASE             (0 * KBASE_IPA_NR_BYTES_PER_BLOCK)
@@ -94,10 +96,15 @@ static u32 kbase_g7x_power_model_get_memsys_counter(struct kbase_ipa_model_vinst
 static u32 kbase_g7x_power_model_get_sc_counter(struct kbase_ipa_model_vinstr_data *model_data,
 						u32 counter_block_offset)
 {
+#ifdef CONFIG_MALI_BIFROST_NO_MALI
+	const u32 sc_base = MEMSYS_BASE +
+		(KBASE_DUMMY_MODEL_MAX_MEMSYS_BLOCKS *
+		 KBASE_IPA_NR_BYTES_PER_BLOCK);
+#else
 	const u32 sc_base = MEMSYS_BASE +
 		(model_data->kbdev->gpu_props.props.l2_props.num_l2_slices *
 		 KBASE_IPA_NR_BYTES_PER_BLOCK);
-
+#endif
 	return sc_base + counter_block_offset;
 }
 
@@ -178,7 +185,7 @@ static u32 kbase_g7x_get_active_cycles(
 	return kbase_ipa_single_counter(model_data, 1, counter);
 }
 
-/** Table of IPA group definitions.
+/* Table of IPA group definitions.
  *
  * For each IPA group, this table defines a function to access the given performance block counter (or counters,
  * if the operation needs to be iterated on multiple blocks) and calculate energy estimation.
@@ -455,6 +462,7 @@ static const struct kbase_ipa_group ipa_groups_def_tbax[] = {
 		.init = kbase_ ## init_token ## _power_model_init, \
 		.term = kbase_ipa_vinstr_common_model_term, \
 		.get_dynamic_coeff = kbase_ipa_vinstr_dynamic_coeff, \
+		.reset_counter_data = kbase_ipa_vinstr_reset_data, \
 	}; \
 	KBASE_EXPORT_TEST_API(kbase_ ## gpu ## _ipa_model_ops)
 
@@ -488,3 +496,68 @@ STANDARD_POWER_MODEL(tbax, 1000);
 ALIAS_POWER_MODEL(g52, g76);
 /* tnax is an alias of g77 (TTRX) for IPA */
 ALIAS_POWER_MODEL(tnax, g77);
+
+static const struct kbase_ipa_model_ops *ipa_counter_model_ops[] = {
+	&kbase_g71_ipa_model_ops,
+	&kbase_g72_ipa_model_ops,
+	&kbase_g76_ipa_model_ops,
+	&kbase_g52_ipa_model_ops,
+	&kbase_g52_r1_ipa_model_ops,
+	&kbase_g51_ipa_model_ops,
+	&kbase_g77_ipa_model_ops,
+	&kbase_tnax_ipa_model_ops,
+	&kbase_tbex_ipa_model_ops,
+	&kbase_tbax_ipa_model_ops
+};
+
+const struct kbase_ipa_model_ops *kbase_ipa_counter_model_ops_find(
+		struct kbase_device *kbdev, const char *name)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(ipa_counter_model_ops); ++i) {
+		const struct kbase_ipa_model_ops *ops =
+			ipa_counter_model_ops[i];
+
+		if (!strcmp(ops->name, name))
+			return ops;
+	}
+
+	dev_err(kbdev->dev, "power model \'%s\' not found\n", name);
+
+	return NULL;
+}
+
+const char *kbase_ipa_counter_model_name_from_id(u32 gpu_id)
+{
+	const u32 prod_id = (gpu_id & GPU_ID_VERSION_PRODUCT_ID) >>
+			GPU_ID_VERSION_PRODUCT_ID_SHIFT;
+
+	switch (GPU_ID2_MODEL_MATCH_VALUE(prod_id)) {
+	case GPU_ID2_PRODUCT_TMIX:
+		return "mali-g71-power-model";
+	case GPU_ID2_PRODUCT_THEX:
+		return "mali-g72-power-model";
+	case GPU_ID2_PRODUCT_TNOX:
+		return "mali-g76-power-model";
+	case GPU_ID2_PRODUCT_TSIX:
+		return "mali-g51-power-model";
+	case GPU_ID2_PRODUCT_TGOX:
+		if ((gpu_id & GPU_ID2_VERSION_MAJOR) ==
+				(0 << GPU_ID2_VERSION_MAJOR_SHIFT))
+			/* g52 aliased to g76 power-model's ops */
+			return "mali-g52-power-model";
+		else
+			return "mali-g52_r1-power-model";
+	case GPU_ID2_PRODUCT_TNAX:
+		return "mali-tnax-power-model";
+	case GPU_ID2_PRODUCT_TTRX:
+		return "mali-g77-power-model";
+	case GPU_ID2_PRODUCT_TBEX:
+		return "mali-tbex-power-model";
+	case GPU_ID2_PRODUCT_TBAX:
+		return "mali-tbax-power-model";
+	default:
+		return NULL;
+	}
+}
diff --git a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa.c b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa.c
index 67adb65306dd..e86a94317b0b 100644
--- a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa.c
+++ b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2016-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,9 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
+
 #include <linux/thermal.h>
 #include <linux/devfreq_cooling.h>
 #include <linux/of.h>
@@ -27,31 +27,19 @@
 #include "mali_kbase_ipa_debugfs.h"
 #include "mali_kbase_ipa_simple.h"
 #include "backend/gpu/mali_kbase_pm_internal.h"
-
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0))
+#include "backend/gpu/mali_kbase_devfreq.h"
 #include <linux/pm_opp.h>
-#else
-#include <linux/opp.h>
-#define dev_pm_opp_find_freq_exact opp_find_freq_exact
-#define dev_pm_opp_get_voltage opp_get_voltage
-#define dev_pm_opp opp
-#endif
 
 #define KBASE_IPA_FALLBACK_MODEL_NAME "mali-simple-power-model"
 
-static const struct kbase_ipa_model_ops *kbase_ipa_all_model_ops[] = {
-	&kbase_simple_ipa_model_ops,
-	&kbase_g71_ipa_model_ops,
-	&kbase_g72_ipa_model_ops,
-	&kbase_g76_ipa_model_ops,
-	&kbase_g52_ipa_model_ops,
-	&kbase_g52_r1_ipa_model_ops,
-	&kbase_g51_ipa_model_ops,
-	&kbase_g77_ipa_model_ops,
-	&kbase_tnax_ipa_model_ops,
-	&kbase_tbex_ipa_model_ops,
-	&kbase_tbax_ipa_model_ops
-};
+/* Polling by thermal governor starts when the temperature exceeds the certain
+ * trip point. In order to have meaningful value for the counters, when the
+ * polling starts and first call to kbase_get_real_power() is made, it is
+ * required to reset the counter values every now and then.
+ * It is reasonable to do the reset every second if no polling is being done,
+ * the counter model implementation also assumes max sampling interval of 1 sec.
+ */
+#define RESET_INTERVAL_MS ((s64)1000)
 
 int kbase_ipa_model_recalculate(struct kbase_ipa_model *model)
 {
@@ -72,55 +60,24 @@ int kbase_ipa_model_recalculate(struct kbase_ipa_model *model)
 }
 
 const struct kbase_ipa_model_ops *kbase_ipa_model_ops_find(struct kbase_device *kbdev,
-							    const char *name)
+							   const char *name)
 {
-	int i;
-
-	for (i = 0; i < ARRAY_SIZE(kbase_ipa_all_model_ops); ++i) {
-		const struct kbase_ipa_model_ops *ops = kbase_ipa_all_model_ops[i];
+	if (!strcmp(name, kbase_simple_ipa_model_ops.name))
+		return &kbase_simple_ipa_model_ops;
 
-		if (!strcmp(ops->name, name))
-			return ops;
-	}
-
-	dev_err(kbdev->dev, "power model \'%s\' not found\n", name);
-
-	return NULL;
+	return kbase_ipa_counter_model_ops_find(kbdev, name);
 }
 KBASE_EXPORT_TEST_API(kbase_ipa_model_ops_find);
 
 const char *kbase_ipa_model_name_from_id(u32 gpu_id)
 {
-	const u32 prod_id = (gpu_id & GPU_ID_VERSION_PRODUCT_ID) >>
-			GPU_ID_VERSION_PRODUCT_ID_SHIFT;
-
-	switch (GPU_ID2_MODEL_MATCH_VALUE(prod_id)) {
-	case GPU_ID2_PRODUCT_TMIX:
-		return "mali-g71-power-model";
-	case GPU_ID2_PRODUCT_THEX:
-		return "mali-g72-power-model";
-	case GPU_ID2_PRODUCT_TNOX:
-		return "mali-g76-power-model";
-	case GPU_ID2_PRODUCT_TSIX:
-		return "mali-g51-power-model";
-	case GPU_ID2_PRODUCT_TGOX:
-		if ((gpu_id & GPU_ID2_VERSION_MAJOR) ==
-				(0 << GPU_ID2_VERSION_MAJOR_SHIFT))
-			/* g52 aliased to g76 power-model's ops */
-			return "mali-g52-power-model";
-		else
-			return "mali-g52_r1-power-model";
-	case GPU_ID2_PRODUCT_TNAX:
-		return "mali-tnax-power-model";
-	case GPU_ID2_PRODUCT_TTRX:
-		return "mali-g77-power-model";
-	case GPU_ID2_PRODUCT_TBEX:
-		return "mali-tbex-power-model";
-	case GPU_ID2_PRODUCT_TBAX:
-		return "mali-tbax-power-model";
-	default:
+	const char* model_name =
+		kbase_ipa_counter_model_name_from_id(gpu_id);
+
+	if (!model_name)
 		return KBASE_IPA_FALLBACK_MODEL_NAME;
-	}
+	else
+		return model_name;
 }
 KBASE_EXPORT_TEST_API(kbase_ipa_model_name_from_id);
 
@@ -367,6 +324,8 @@ int kbase_ipa_init(struct kbase_device *kbdev)
 		kbdev->ipa.configured_model = default_model;
 	}
 
+	kbdev->ipa.last_sample_time = ktime_get();
+
 end:
 	if (err)
 		kbase_ipa_term_locked(kbdev);
@@ -421,7 +380,8 @@ static u32 kbase_scale_dynamic_power(const u32 c, const u32 freq,
 	const u32 v2f = v2f_big / 1000;
 
 	/* Range (working backwards from next line): 0 < v2fc < 2^23 uW.
-	 * Must be < 2^42 to avoid overflowing the return value. */
+	 * Must be < 2^42 to avoid overflowing the return value.
+	 */
 	const u64 v2fc = (u64) c * (u64) v2f;
 
 	/* Range: 0 < v2fc / 1000 < 2^13 mW */
@@ -517,8 +477,9 @@ static u32 get_static_power_locked(struct kbase_device *kbdev,
 	return power;
 }
 
-#if defined(CONFIG_MALI_PWRSOFT_765) || \
-	LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)
+#if KERNEL_VERSION(5, 10, 0) > LINUX_VERSION_CODE
+#if defined(CONFIG_MALI_PWRSOFT_765) ||                                        \
+	KERNEL_VERSION(4, 10, 0) <= LINUX_VERSION_CODE
 static unsigned long kbase_get_static_power(struct devfreq *df,
 					    unsigned long voltage)
 #else
@@ -527,8 +488,8 @@ static unsigned long kbase_get_static_power(unsigned long voltage)
 {
 	struct kbase_ipa_model *model;
 	u32 power = 0;
-#if defined(CONFIG_MALI_PWRSOFT_765) || \
-	LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)
+#if defined(CONFIG_MALI_PWRSOFT_765) ||                                        \
+	KERNEL_VERSION(4, 10, 0) <= LINUX_VERSION_CODE
 	struct kbase_device *kbdev = dev_get_drvdata(&df->dev);
 #else
 	struct kbase_device *kbdev = kbase_find_device(-1);
@@ -544,16 +505,66 @@ static unsigned long kbase_get_static_power(unsigned long voltage)
 
 	mutex_unlock(&kbdev->ipa.lock);
 
-#if !(defined(CONFIG_MALI_PWRSOFT_765) || \
-	LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0))
+#if !(defined(CONFIG_MALI_PWRSOFT_765) ||                                      \
+	KERNEL_VERSION(4, 10, 0) <= LINUX_VERSION_CODE)
 	kbase_release_device(kbdev);
 #endif
 
 	return power;
 }
+#endif /* KERNEL_VERSION(5, 10, 0) > LINUX_VERSION_CODE */
+
+/**
+ * opp_translate_freq_voltage() - Translate nominal OPP frequency from
+ *                                devicetree into the real frequency for
+ *                                top-level and shader cores.
+ * @kbdev:            Device pointer
+ * @nominal_freq:     Nominal frequency in Hz.
+ * @nominal_voltage:  Nominal voltage, in mV.
+ * @freqs:            Pointer to array of real frequency values.
+ * @volts:            Pointer to array of voltages.
+ *
+ * If there are 2 clock domains, then top-level and shader cores can operate
+ * at different frequency and voltage level. The nominal frequency ("opp-hz")
+ * used by devfreq from the devicetree may not be same as the real frequency
+ * at which top-level and shader cores are operating, so a translation is
+ * needed.
+ * Nominal voltage shall always be same as the real voltage for top-level.
+ */
+static void opp_translate_freq_voltage(struct kbase_device *kbdev,
+				       unsigned long nominal_freq,
+				       unsigned long nominal_voltage,
+				       unsigned long *freqs,
+				       unsigned long *volts)
+{
+#ifndef CONFIG_MALI_BIFROST_NO_MALI
+	u64 core_mask;
+
+	kbase_devfreq_opp_translate(kbdev, nominal_freq, &core_mask,
+				    freqs, volts);
+	CSTD_UNUSED(core_mask);
+
+	if (kbdev->nr_clocks == 1) {
+		freqs[KBASE_IPA_BLOCK_TYPE_SHADER_CORES] =
+			freqs[KBASE_IPA_BLOCK_TYPE_TOP_LEVEL];
+		volts[KBASE_IPA_BLOCK_TYPE_SHADER_CORES] =
+			volts[KBASE_IPA_BLOCK_TYPE_TOP_LEVEL];
+	}
+#else
+	/* An arbitrary voltage and frequency value can be chosen for testing
+	 * in no mali configuration which may not match with any OPP level.
+	 */
+	freqs[KBASE_IPA_BLOCK_TYPE_TOP_LEVEL] = nominal_freq;
+	volts[KBASE_IPA_BLOCK_TYPE_TOP_LEVEL] = nominal_voltage;
+
+	freqs[KBASE_IPA_BLOCK_TYPE_SHADER_CORES] = nominal_freq;
+	volts[KBASE_IPA_BLOCK_TYPE_SHADER_CORES] = nominal_voltage;
+#endif
+}
 
-#if defined(CONFIG_MALI_PWRSOFT_765) || \
-	LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)
+#if KERNEL_VERSION(5, 10, 0) > LINUX_VERSION_CODE
+#if defined(CONFIG_MALI_PWRSOFT_765) ||                                        \
+	KERNEL_VERSION(4, 10, 0) <= LINUX_VERSION_CODE
 static unsigned long kbase_get_dynamic_power(struct devfreq *df,
 					     unsigned long freq,
 					     unsigned long voltage)
@@ -563,10 +574,13 @@ static unsigned long kbase_get_dynamic_power(unsigned long freq,
 #endif
 {
 	struct kbase_ipa_model *model;
-	u32 power_coeff = 0, power = 0;
+	unsigned long freqs[KBASE_IPA_BLOCK_TYPE_NUM] = {0};
+	unsigned long volts[KBASE_IPA_BLOCK_TYPE_NUM] = {0};
+	u32 power_coeffs[KBASE_IPA_BLOCK_TYPE_NUM] = {0};
+	u32 power = 0;
 	int err = 0;
-#if defined(CONFIG_MALI_PWRSOFT_765) || \
-	LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)
+#if defined(CONFIG_MALI_PWRSOFT_765) ||                                        \
+	KERNEL_VERSION(4, 10, 0) <= LINUX_VERSION_CODE
 	struct kbase_device *kbdev = dev_get_drvdata(&df->dev);
 #else
 	struct kbase_device *kbdev = kbase_find_device(-1);
@@ -579,34 +593,53 @@ static unsigned long kbase_get_dynamic_power(unsigned long freq,
 
 	model = kbdev->ipa.fallback_model;
 
-	err = model->ops->get_dynamic_coeff(model, &power_coeff);
-
-	if (!err)
-		power = kbase_scale_dynamic_power(power_coeff, freq, voltage);
-	else
+	err = model->ops->get_dynamic_coeff(model, power_coeffs);
+
+	if (!err) {
+		opp_translate_freq_voltage(kbdev, freq, voltage, freqs, volts);
+
+		power = kbase_scale_dynamic_power(
+			power_coeffs[KBASE_IPA_BLOCK_TYPE_TOP_LEVEL],
+			freqs[KBASE_IPA_BLOCK_TYPE_TOP_LEVEL],
+			volts[KBASE_IPA_BLOCK_TYPE_TOP_LEVEL]);
+
+		/* Here unlike kbase_get_real_power(), shader core frequency is
+		 * used for the scaling as simple power model is used to obtain
+		 * the value of dynamic coefficient (which is is a fixed value
+		 * retrieved from the device tree).
+		 */
+		power += kbase_scale_dynamic_power(
+			 power_coeffs[KBASE_IPA_BLOCK_TYPE_SHADER_CORES],
+			 freqs[KBASE_IPA_BLOCK_TYPE_SHADER_CORES],
+			 volts[KBASE_IPA_BLOCK_TYPE_SHADER_CORES]);
+	} else
 		dev_err_ratelimited(kbdev->dev,
 				    "Model %s returned error code %d\n",
 				    model->ops->name, err);
 
 	mutex_unlock(&kbdev->ipa.lock);
 
-#if !(defined(CONFIG_MALI_PWRSOFT_765) || \
-	LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0))
+#if !(defined(CONFIG_MALI_PWRSOFT_765) ||                                      \
+	KERNEL_VERSION(4, 10, 0) <= LINUX_VERSION_CODE)
 	kbase_release_device(kbdev);
 #endif
 
 	return power;
 }
+#endif /* KERNEL_VERSION(5, 10, 0) > LINUX_VERSION_CODE */
 
 int kbase_get_real_power_locked(struct kbase_device *kbdev, u32 *power,
 				unsigned long freq,
 				unsigned long voltage)
 {
 	struct kbase_ipa_model *model;
-	u32 power_coeff = 0;
-	int err = 0;
+	unsigned long freqs[KBASE_IPA_BLOCK_TYPE_NUM] = {0};
+	unsigned long volts[KBASE_IPA_BLOCK_TYPE_NUM] = {0};
+	u32 power_coeffs[KBASE_IPA_BLOCK_TYPE_NUM] = {0};
 	struct kbasep_pm_metrics diff;
 	u64 total_time;
+	bool skip_utilization_scaling = false;
+	int err = 0;
 
 	lockdep_assert_held(&kbdev->ipa.lock);
 
@@ -614,30 +647,62 @@ int kbase_get_real_power_locked(struct kbase_device *kbdev, u32 *power,
 
 	model = get_current_model(kbdev);
 
-	err = model->ops->get_dynamic_coeff(model, &power_coeff);
+	err = model->ops->get_dynamic_coeff(model, power_coeffs);
 
 	/* If the counter model returns an error (e.g. switching back to
 	 * protected mode and failing to read counters, or a counter sample
 	 * with too few cycles), revert to the fallback model.
 	 */
 	if (err && model != kbdev->ipa.fallback_model) {
+		/* No meaningful scaling for GPU utilization can be done if
+		 * the sampling interval was too long. This is equivalent to
+		 * assuming GPU was busy throughout (similar to what is done
+		 * during protected mode).
+		 */
+		if (err == -EOVERFLOW)
+			skip_utilization_scaling = true;
+
 		model = kbdev->ipa.fallback_model;
-		err = model->ops->get_dynamic_coeff(model, &power_coeff);
+		err = model->ops->get_dynamic_coeff(model, power_coeffs);
 	}
 
-	if (err)
+	if (WARN_ON(err))
 		return err;
 
-	*power = kbase_scale_dynamic_power(power_coeff, freq, voltage);
+	opp_translate_freq_voltage(kbdev, freq, voltage, freqs, volts);
 
-	/* time_busy / total_time cannot be >1, so assigning the 64-bit
-	 * result of div_u64 to *power cannot overflow.
-	 */
-	total_time = diff.time_busy + (u64) diff.time_idle;
-	*power = div_u64(*power * (u64) diff.time_busy,
-			 max(total_time, 1ull));
+	*power = kbase_scale_dynamic_power(
+			power_coeffs[KBASE_IPA_BLOCK_TYPE_TOP_LEVEL],
+			freqs[KBASE_IPA_BLOCK_TYPE_TOP_LEVEL],
+			volts[KBASE_IPA_BLOCK_TYPE_TOP_LEVEL]);
+
+	if (power_coeffs[KBASE_IPA_BLOCK_TYPE_SHADER_CORES]) {
+		unsigned long freq = freqs[KBASE_IPA_BLOCK_TYPE_SHADER_CORES];
 
-	*power += get_static_power_locked(kbdev, model, voltage);
+		/* As per the HW team, the top-level frequency needs to be used
+		 * for the scaling if the counter based model was used as
+		 * counter values are normalized with the GPU_ACTIVE counter
+		 * value, which increments at the rate of top-level frequency.
+		 */
+		if (model != kbdev->ipa.fallback_model)
+			freq = freqs[KBASE_IPA_BLOCK_TYPE_TOP_LEVEL];
+
+		*power += kbase_scale_dynamic_power(
+				power_coeffs[KBASE_IPA_BLOCK_TYPE_SHADER_CORES],
+				freq, volts[KBASE_IPA_BLOCK_TYPE_SHADER_CORES]);
+	}
+
+	if (!skip_utilization_scaling) {
+		/* time_busy / total_time cannot be >1, so assigning the 64-bit
+		 * result of div_u64 to *power cannot overflow.
+		 */
+		total_time = diff.time_busy + (u64) diff.time_idle;
+		*power = div_u64(*power * (u64) diff.time_busy,
+				 max(total_time, 1ull));
+	}
+
+	*power += get_static_power_locked(kbdev, model,
+				volts[KBASE_IPA_BLOCK_TYPE_TOP_LEVEL]);
 
 	return err;
 }
@@ -661,12 +726,42 @@ int kbase_get_real_power(struct devfreq *df, u32 *power,
 }
 KBASE_EXPORT_TEST_API(kbase_get_real_power);
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 0)
-struct devfreq_cooling_ops kbase_ipa_power_model_ops = {
-#else
 struct devfreq_cooling_power kbase_ipa_power_model_ops = {
-#endif
+#if KERNEL_VERSION(5, 10, 0) > LINUX_VERSION_CODE
 	.get_static_power = &kbase_get_static_power,
 	.get_dynamic_power = &kbase_get_dynamic_power,
+#endif /* KERNEL_VERSION(5, 10, 0) > LINUX_VERSION_CODE */
+#if defined(CONFIG_MALI_PWRSOFT_765) ||                                        \
+	KERNEL_VERSION(4, 10, 0) <= LINUX_VERSION_CODE
+	.get_real_power = &kbase_get_real_power,
+#endif
 };
 KBASE_EXPORT_TEST_API(kbase_ipa_power_model_ops);
+
+void kbase_ipa_reset_data(struct kbase_device *kbdev)
+{
+	ktime_t now, diff;
+	s64 elapsed_time;
+
+	mutex_lock(&kbdev->ipa.lock);
+
+	now = ktime_get();
+	diff = ktime_sub(now, kbdev->ipa.last_sample_time);
+	elapsed_time = ktime_to_ms(diff);
+
+	if (elapsed_time > RESET_INTERVAL_MS) {
+		struct kbasep_pm_metrics diff;
+		struct kbase_ipa_model *model;
+
+		kbase_pm_get_dvfs_metrics(
+			kbdev, &kbdev->ipa.last_metrics, &diff);
+
+		model = get_current_model(kbdev);
+		if (model != kbdev->ipa.fallback_model)
+			model->ops->reset_counter_data(model);
+
+		kbdev->ipa.last_sample_time = ktime_get();
+	}
+
+	mutex_unlock(&kbdev->ipa.lock);
+}
diff --git a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa.h b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa.h
index f43f3d9416b4..beceb6ce7b55 100644
--- a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa.h
+++ b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2016-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_IPA_H_
@@ -27,6 +26,20 @@
 
 struct devfreq;
 
+/**
+ * enum kbase_ipa_block_type - Type of block for which power estimation is done.
+ *
+ * @KBASE_IPA_BLOCK_TYPE_TOP_LEVEL:    Top-level block, that covers CSHW,
+ *                                     MEMSYS, Tiler.
+ * @KBASE_IPA_BLOCK_TYPE_SHADER_CORES: All Shader cores.
+ * @KBASE_IPA_BLOCK_TYPE_NUM:          Number of blocks.
+ */
+enum kbase_ipa_block_type {
+	KBASE_IPA_BLOCK_TYPE_TOP_LEVEL,
+	KBASE_IPA_BLOCK_TYPE_SHADER_CORES,
+	KBASE_IPA_BLOCK_TYPE_NUM
+};
+
 /**
  * struct kbase_ipa_model - Object describing a particular IPA model.
  * @kbdev:                    pointer to kbase device
@@ -89,7 +102,8 @@ struct kbase_ipa_model_ops {
 	int (*init)(struct kbase_ipa_model *model);
 	/* Called immediately after init(), or when a parameter is changed, so
 	 * that any coefficients derived from model parameters can be
-	 * recalculated. */
+	 * recalculated
+	 */
 	int (*recalculate)(struct kbase_ipa_model *model);
 	void (*term)(struct kbase_ipa_model *model);
 	/*
@@ -101,7 +115,9 @@ struct kbase_ipa_model_ops {
 	 * is then scaled by the IPA framework according to the current OPP's
 	 * frequency and voltage.
 	 *
-	 * Return: 0 on success, or an error code.
+	 * Return: 0 on success, or an error code. -EOVERFLOW error code will
+	 * indicate that sampling interval was too large and no meaningful
+	 * scaling for GPU utiliation can be done.
 	 */
 	int (*get_dynamic_coeff)(struct kbase_ipa_model *model, u32 *coeffp);
 	/*
@@ -115,6 +131,18 @@ struct kbase_ipa_model_ops {
 	 * Return: 0 on success, or an error code.
 	 */
 	int (*get_static_coeff)(struct kbase_ipa_model *model, u32 *coeffp);
+
+	/*
+	 * reset_counter_data() - Reset the HW counter data used for calculating
+	 *                        dynamic power coefficient
+	 * @model:		  pointer to model
+	 *
+	 * This method is currently applicable only to the counter based model.
+	 * The next call to get_dynamic_coeff() will have to calculate the
+	 * dynamic power coefficient based on the HW counter data generated
+	 * from this point onwards.
+	 */
+	void (*reset_counter_data)(struct kbase_ipa_model *model);
 };
 
 /**
@@ -163,6 +191,17 @@ int kbase_ipa_model_recalculate(struct kbase_ipa_model *model);
 const struct kbase_ipa_model_ops *kbase_ipa_model_ops_find(struct kbase_device *kbdev,
 							   const char *name);
 
+/**
+ * kbase_ipa_counter_model_ops_find - Lookup an IPA counter model using its name
+ * @kbdev:      pointer to kbase device
+ * @name:       name of counter model to lookup
+ *
+ * Return: Pointer to counter model's 'ops' structure, or NULL if the lookup
+ *         failed.
+ */
+const struct kbase_ipa_model_ops *kbase_ipa_counter_model_ops_find(
+	struct kbase_device *kbdev, const char *name);
+
 /**
  * kbase_ipa_model_name_from_id - Find the best model for a given GPU ID
  * @gpu_id:     GPU ID of GPU the model will be used for
@@ -172,6 +211,16 @@ const struct kbase_ipa_model_ops *kbase_ipa_model_ops_find(struct kbase_device *
  */
 const char *kbase_ipa_model_name_from_id(u32 gpu_id);
 
+/**
+ * kbase_ipa_counter_model_name_from_id - Find the best counter model for a
+ *                                        given GPU ID
+ * @gpu_id:     GPU ID of GPU the counter model will be used for
+ *
+ * Return: The name of the appropriate counter-based model, or NULL if the
+ *         no counter model exists.
+ */
+const char *kbase_ipa_counter_model_name_from_id(u32 gpu_id);
+
 /**
  * kbase_ipa_init_model - Initilaize the particular IPA model
  * @kbdev:      pointer to kbase device
@@ -183,7 +232,7 @@ const char *kbase_ipa_model_name_from_id(u32 gpu_id);
  * Return: pointer to kbase_ipa_model on success, NULL on error
  */
 struct kbase_ipa_model *kbase_ipa_init_model(struct kbase_device *kbdev,
-					     const struct kbase_ipa_model_ops *ops);
+					const struct kbase_ipa_model_ops *ops);
 /**
  * kbase_ipa_term_model - Terminate the particular IPA model
  * @model:      pointer to the IPA model object, already initialized
@@ -202,17 +251,6 @@ void kbase_ipa_term_model(struct kbase_ipa_model *model);
  */
 void kbase_ipa_protection_mode_switch_event(struct kbase_device *kbdev);
 
-extern const struct kbase_ipa_model_ops kbase_g71_ipa_model_ops;
-extern const struct kbase_ipa_model_ops kbase_g72_ipa_model_ops;
-extern const struct kbase_ipa_model_ops kbase_g76_ipa_model_ops;
-extern const struct kbase_ipa_model_ops kbase_g52_ipa_model_ops;
-extern const struct kbase_ipa_model_ops kbase_g52_r1_ipa_model_ops;
-extern const struct kbase_ipa_model_ops kbase_g51_ipa_model_ops;
-extern const struct kbase_ipa_model_ops kbase_g77_ipa_model_ops;
-extern const struct kbase_ipa_model_ops kbase_tnax_ipa_model_ops;
-extern const struct kbase_ipa_model_ops kbase_tbex_ipa_model_ops;
-extern const struct kbase_ipa_model_ops kbase_tbax_ipa_model_ops;
-
 /**
  * kbase_get_real_power() - get the real power consumption of the GPU
  * @df: dynamic voltage and frequency scaling information for the GPU.
@@ -238,11 +276,20 @@ int kbase_get_real_power_locked(struct kbase_device *kbdev, u32 *power,
 				unsigned long voltage);
 #endif /* MALI_UNIT_TEST */
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 0)
-extern struct devfreq_cooling_ops kbase_ipa_power_model_ops;
-#else
 extern struct devfreq_cooling_power kbase_ipa_power_model_ops;
-#endif
+
+/**
+ * kbase_ipa_reset_data() - Reset the data required for power estimation.
+ * @kbdev:  Pointer to kbase device.
+ *
+ * This function is called to ensure a meaningful baseline for
+ * kbase_get_real_power(), when thermal governor starts the polling, and
+ * that is achieved by updating the GPU utilization metrics and retrieving
+ * the accumulated value of HW counters.
+ * Basically this function collects all the data required for power estimation
+ * but does not process it.
+ */
+void kbase_ipa_reset_data(struct kbase_device *kbdev);
 
 #else /* !(defined(CONFIG_MALI_BIFROST_DEVFREQ) && defined(CONFIG_DEVFREQ_THERMAL)) */
 
diff --git a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_debugfs.c b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_debugfs.c
index 30a3b7d1b3be..2672146e8e1d 100644
--- a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_debugfs.c
+++ b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_debugfs.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2017-2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2017-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <linux/debugfs.h>
@@ -28,7 +27,7 @@
 #include "mali_kbase_ipa.h"
 #include "mali_kbase_ipa_debugfs.h"
 
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0))
+#if (KERNEL_VERSION(4, 7, 0) > LINUX_VERSION_CODE)
 #define DEFINE_DEBUGFS_ATTRIBUTE DEFINE_SIMPLE_ATTRIBUTE
 #endif
 
@@ -160,7 +159,8 @@ int kbase_ipa_model_param_add(struct kbase_ipa_model *model, const char *name,
 		return -ENOMEM;
 
 	/* 'name' is stack-allocated for array elements, so copy it into
-	 * heap-allocated storage */
+	 * heap-allocated storage
+	 */
 	param->name = kstrdup(name, GFP_KERNEL);
 
 	if (!param->name) {
diff --git a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_debugfs.h b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_debugfs.h
index a983d9c14216..189b43c609d6 100644
--- a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_debugfs.h
+++ b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_debugfs.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_IPA_DEBUGFS_H_
@@ -63,6 +62,9 @@ static inline int kbase_ipa_model_param_add(struct kbase_ipa_model *model,
 static inline void kbase_ipa_model_param_free_all(struct kbase_ipa_model *model)
 { }
 
+static inline void kbase_ipa_model_param_set_s32(struct kbase_ipa_model *model,
+						 const char *name, s32 val)
+{ }
 #endif /* CONFIG_DEBUG_FS */
 
 #endif /* _KBASE_IPA_DEBUGFS_H_ */
diff --git a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_simple.c b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_simple.c
index 9a11ee5b1e74..dce685a3b072 100644
--- a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_simple.c
+++ b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_simple.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2016-2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2016-2018, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <linux/freezer.h>
@@ -35,20 +34,18 @@
 #include "mali_kbase_ipa_simple.h"
 #include "mali_kbase_ipa_debugfs.h"
 
-#if MALI_UNIT_TEST
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)
-static unsigned long dummy_temp;
+/* This is used if the dynamic power for top-level is estimated separately
+ * through the counter model. To roughly match the contribution of top-level
+ * power in the total dynamic power, when calculated through counter model,
+ * this scalar is used for the dynamic coefficient specified in the device tree
+ * for simple power model. This value was provided by the HW team after
+ * taking all the power data collected and dividing top level power by shader
+ * core power and then averaging it across all samples.
+ */
+#define TOP_LEVEL_DYN_COEFF_SCALER (3)
 
-static int kbase_simple_power_model_get_dummy_temp(
-	struct thermal_zone_device *tz,
-	unsigned long *temp)
-{
-	*temp = READ_ONCE(dummy_temp);
-	return 0;
-}
+#if MALI_UNIT_TEST
 
-#else
 static int dummy_temp;
 
 static int kbase_simple_power_model_get_dummy_temp(
@@ -58,7 +55,6 @@ static int kbase_simple_power_model_get_dummy_temp(
 	*temp = READ_ONCE(dummy_temp);
 	return 0;
 }
-#endif
 
 /* Intercept calls to the kernel function using a macro */
 #ifdef thermal_zone_get_temp
@@ -144,16 +140,13 @@ static u32 calculate_temp_scaling_factor(s32 ts[4], s64 t)
 
 /* We can't call thermal_zone_get_temp() directly in model_static_coeff(),
  * because we don't know if tz->lock is held in the same thread. So poll it in
- * a separate thread to get around this. */
+ * a separate thread to get around this.
+ */
 static int poll_temperature(void *data)
 {
 	struct kbase_ipa_model_simple_data *model_data =
 			(struct kbase_ipa_model_simple_data *) data;
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)
-	unsigned long temp;
-#else
 	int temp;
-#endif
 
 	set_freezable();
 
@@ -213,7 +206,21 @@ static int model_dynamic_coeff(struct kbase_ipa_model *model, u32 *coeffp)
 	struct kbase_ipa_model_simple_data *model_data =
 		(struct kbase_ipa_model_simple_data *) model->model_data;
 
+#if MALI_USE_CSF
+	/* On CSF GPUs, the dynamic power for top-level and shader cores is
+	 * estimated separately. Currently there is a single dynamic
+	 * coefficient value provided in the device tree for simple model.
+	 * As per the discussion with HW team the coefficient value needs to
+	 * be scaled down for top-level to limit its contribution in the
+	 * total dyanmic power.
+	 */
+	coeffp[KBASE_IPA_BLOCK_TYPE_TOP_LEVEL] =
+		model_data->dynamic_coefficient / TOP_LEVEL_DYN_COEFF_SCALER;
+	coeffp[KBASE_IPA_BLOCK_TYPE_SHADER_CORES] =
+		model_data->dynamic_coefficient;
+#else
 	*coeffp = model_data->dynamic_coefficient;
+#endif
 
 	return 0;
 }
diff --git a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_simple.h b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_simple.h
index 84534e07ec55..40cf0d151a32 100644
--- a/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_simple.h
+++ b/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa_simple.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_IPA_SIMPLE_H_
diff --git a/drivers/gpu/arm/bifrost/jm/mali_kbase_jm_defs.h b/drivers/gpu/arm/bifrost/jm/mali_kbase_jm_defs.h
index 4fb5d1d9c410..8b3e03f15964 100644
--- a/drivers/gpu/arm/bifrost/jm/mali_kbase_jm_defs.h
+++ b/drivers/gpu/arm/bifrost/jm/mali_kbase_jm_defs.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /*
  * Definitions (types, defines, etcs) specific to Job Manager Kbase.
  * They are placed here to allow the hierarchy of header files to work.
@@ -409,6 +406,16 @@ struct kbase_ext_res {
  *                         sync through soft jobs and for the implicit
  *                         synchronization required on access to external
  *                         resources.
+ * @dma_fence.fence_in:    Input fence
+ * @dma_fence.fence:       Points to the dma-buf output fence for this atom.
+ * @dma_fence.context:     The dma-buf fence context number for this atom. A
+ *                         unique context number is allocated to each katom in
+ *                         the context on context creation.
+ * @dma_fence.seqno:       The dma-buf fence sequence number for this atom. This
+ *                         is increased every time this katom uses dma-buf fence
+ * @dma_fence.callbacks:   List of all callbacks set up to wait on other fences
+ * @dma_fence.dep_count:   Atomic counter of number of outstandind dma-buf fence
+ *                         dependencies for this atom.
  * @event_code:            Event code for the job chain represented by the atom,
  *                         both HW and low-level SW events are represented by
  *                         event codes.
@@ -443,6 +450,8 @@ struct kbase_ext_res {
  * @blocked:               flag indicating that atom's resubmission to GPU is
  *                         blocked till the work item is scheduled to return the
  *                         atom to JS.
+ * @seq_nr:                user-space sequence number, to order atoms in some
+ *                         temporal order
  * @pre_dep:               Pointer to atom that this atom has same-slot
  *                         dependency on
  * @post_dep:              Pointer to atom that has same-slot dependency on
@@ -477,11 +486,19 @@ struct kbase_ext_res {
  *                         when transitioning into or out of protected mode.
  *                         Atom will be either entering or exiting the
  *                         protected mode.
+ * @protected_state.enter: entering the protected mode.
+ * @protected_state.exit:  exiting the protected mode.
  * @runnable_tree_node:    The node added to context's job slot specific rb tree
  *                         when the atom becomes runnable.
  * @age:                   Age of atom relative to other atoms in the context,
  *                         is snapshot of the age_count counter in kbase
  *                         context.
+ * @jobslot: Job slot to use when BASE_JD_REQ_JOB_SLOT is specified.
+ * @renderpass_id:Renderpass identifier used to associate an atom that has
+ *                 BASE_JD_REQ_START_RENDERPASS set in its core requirements
+ *                 with an atom that has BASE_JD_REQ_END_RENDERPASS set.
+ * @jc_fragment:          Set of GPU fragment job chains
+ * @retry_count:          TODO: Not used,to be removed
  */
 struct kbase_jd_atom {
 	struct work_struct work;
@@ -516,7 +533,6 @@ struct kbase_jd_atom {
 		 * when working with this sub struct
 		 */
 #if defined(CONFIG_SYNC_FILE)
-		/* Input fence */
 #if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 		struct fence *fence_in;
 #else
@@ -539,14 +555,7 @@ struct kbase_jd_atom {
 #else
 		struct dma_fence *fence;
 #endif
-		/* The dma-buf fence context number for this atom. A unique
-		 * context number is allocated to each katom in the context on
-		 * context creation.
-		 */
 		unsigned int context;
-		/* The dma-buf fence sequence number for this atom. This is
-		 * increased every time this katom uses dma-buf fence.
-		 */
 		atomic_t seqno;
 		/* This contains a list of all callbacks set up to wait on
 		 * other fences.  This atom must be held back from JS until all
@@ -608,7 +617,6 @@ struct kbase_jd_atom {
 
 	atomic_t blocked;
 
-	/* user-space sequence number, to order atoms in some temporal order */
 	u64 seq_nr;
 
 	struct kbase_jd_atom *pre_dep;
@@ -781,6 +789,7 @@ struct kbase_jd_renderpass {
  * @jit_pending_alloc:        A list of just-in-time memory allocation
  *                            soft-jobs which will be reattempted after the
  *                            impending free of other active allocations.
+ * @max_priority:             Max priority level allowed for this context.
  */
 struct kbase_jd_context {
 	struct mutex lock;
@@ -801,6 +810,7 @@ struct kbase_jd_context {
 
 	struct list_head jit_atoms_head;
 	struct list_head jit_pending_alloc;
+	int max_priority;
 };
 
 /**
diff --git a/drivers/gpu/arm/bifrost/jm/mali_kbase_jm_js.h b/drivers/gpu/arm/bifrost/jm/mali_kbase_jm_js.h
index 6c222ceae8ee..e3275369b459 100644
--- a/drivers/gpu/arm/bifrost/jm/mali_kbase_jm_js.h
+++ b/drivers/gpu/arm/bifrost/jm/mali_kbase_jm_js.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -32,6 +31,7 @@
 
 /**
  * kbasep_js_devdata_init - Initialize the Job Scheduler
+ * @kbdev: The kbase_device to operate on
  *
  * The struct kbasep_js_device_data sub-structure of kbdev must be zero
  * initialized before passing to the kbasep_js_devdata_init() function. This is
@@ -41,6 +41,7 @@ int kbasep_js_devdata_init(struct kbase_device * const kbdev);
 
 /**
  * kbasep_js_devdata_halt - Halt the Job Scheduler.
+ * @kbdev: The kbase_device to operate on
  *
  * It is safe to call this on kbdev even if it the kbasep_js_device_data
  * sub-structure was never initialized/failed initialization, to give efficient
@@ -58,6 +59,7 @@ void kbasep_js_devdata_halt(struct kbase_device *kbdev);
 
 /**
  * kbasep_js_devdata_term - Terminate the Job Scheduler
+ * @kbdev: The kbase_device to operate on
  *
  * It is safe to call this on kbdev even if it the kbasep_js_device_data
  * sub-structure was never initialized/failed initialization, to give efficient
@@ -75,6 +77,7 @@ void kbasep_js_devdata_term(struct kbase_device *kbdev);
 /**
  * kbasep_js_kctx_init - Initialize the Scheduling Component of a
  *                       struct kbase_context on the Job Scheduler.
+ * @kctx:  The kbase_context to operate on
  *
  * This effectively registers a struct kbase_context with a Job Scheduler.
  *
@@ -89,6 +92,7 @@ int kbasep_js_kctx_init(struct kbase_context *const kctx);
 /**
  * kbasep_js_kctx_term - Terminate the Scheduling Component of a
  *                       struct kbase_context on the Job Scheduler
+ * @kctx:  The kbase_context to operate on
  *
  * This effectively de-registers a struct kbase_context from its Job Scheduler
  *
@@ -108,6 +112,8 @@ void kbasep_js_kctx_term(struct kbase_context *kctx);
  * kbasep_js_add_job - Add a job chain to the Job Scheduler,
  *                     and take necessary actions to
  *                     schedule the context/run the job.
+ * @kctx:  The kbase_context to operate on
+ * @atom: Atom to add
  *
  * This atomically does the following:
  * * Update the numbers of jobs information
@@ -151,7 +157,10 @@ bool kbasep_js_add_job(struct kbase_context *kctx, struct kbase_jd_atom *atom);
 /**
  * kbasep_js_remove_job - Remove a job chain from the Job Scheduler,
  *                        except for its 'retained state'.
- *
+ * @kbdev: The kbase_device to operate on
+ * @kctx:  The kbase_context to operate on
+ * @atom: Atom to remove
+*
  * Completely removing a job requires several calls:
  * * kbasep_js_copy_atom_retained_state(), to capture the 'retained state' of
  *   the atom
@@ -185,6 +194,9 @@ void kbasep_js_remove_job(struct kbase_device *kbdev,
  * kbasep_js_remove_cancelled_job - Completely remove a job chain from the
  *                                  Job Scheduler, in the case
  *                                  where the job chain was cancelled.
+ * @kbdev: The kbase_device to operate on
+ * @kctx:  The kbase_context to operate on
+ * @katom: Atom to remove
  *
  * This is a variant of kbasep_js_remove_job() that takes care of removing all
  * of the retained state too. This is generally useful for cancelled atoms,
@@ -215,6 +227,9 @@ bool kbasep_js_remove_cancelled_job(struct kbase_device *kbdev,
  * kbasep_js_runpool_requeue_or_kill_ctx - Handling the requeuing/killing of a
  *                                         context that was evicted from the
  *                                         policy queue or runpool.
+ * @kbdev: The kbase_device to operate on
+ * @kctx:  The kbase_context to operate on
+ * @has_pm_ref: tells whether to release Power Manager active reference
  *
  * This should be used whenever handing off a context that has been evicted
  * from the policy queue or the runpool:
@@ -242,6 +257,8 @@ void kbasep_js_runpool_requeue_or_kill_ctx(struct kbase_device *kbdev,
 /**
  * kbasep_js_runpool_release_ctx - Release a refcount of a context being busy,
  *                                 allowing it to be scheduled out.
+ * @kbdev: The kbase_device to operate on
+ * @kctx:  The kbase_context to operate on
  *
  * When the refcount reaches zero and the context might be scheduled out
  * (depending on whether the Scheduling Policy has deemed it so, or if it has
@@ -296,6 +313,9 @@ void kbasep_js_runpool_release_ctx(struct kbase_device *kbdev,
  * kbasep_js_runpool_release_ctx_and_katom_retained_state -  Variant of
  * kbasep_js_runpool_release_ctx() that handles additional
  * actions from completing an atom.
+ * @kbdev:                KBase device
+ * @kctx:                 KBase context
+ * @katom_retained_state: Retained state from the atom
  *
  * This is usually called as part of completing an atom and releasing the
  * refcount on the context held by the atom.
@@ -315,8 +335,12 @@ void kbasep_js_runpool_release_ctx_and_katom_retained_state(
 		struct kbasep_js_atom_retained_state *katom_retained_state);
 
 /**
- * kbasep_js_runpool_release_ctx_nolock -  Variant of
- * kbase_js_runpool_release_ctx() that assumes that
+ * kbasep_js_runpool_release_ctx_nolock -
+ * Variant of kbase_js_runpool_release_ctx() w/out locks
+ * @kbdev: KBase device
+ * @kctx:  KBase context
+ *
+ * Variant of kbase_js_runpool_release_ctx() that assumes that
  * kbasep_js_device_data::runpool_mutex and
  * kbasep_js_kctx_info::ctx::jsctx_mutex are held by the caller, and does not
  * attempt to schedule new contexts.
@@ -326,6 +350,8 @@ void kbasep_js_runpool_release_ctx_nolock(struct kbase_device *kbdev,
 
 /**
  * kbasep_js_schedule_privileged_ctx -  Schedule in a privileged context
+ * @kbdev: KBase device
+ * @kctx:  KBase context
  *
  * This schedules a context in regardless of the context priority.
  * If the runpool is full, a context will be forced out of the runpool and the
@@ -351,6 +377,8 @@ void kbasep_js_schedule_privileged_ctx(struct kbase_device *kbdev,
 /**
  * kbasep_js_release_privileged_ctx -  Release a privileged context,
  * allowing it to be scheduled out.
+ * @kbdev: KBase device
+ * @kctx:  KBase context
  *
  * See kbasep_js_runpool_release_ctx for potential side effects.
  *
@@ -368,6 +396,7 @@ void kbasep_js_release_privileged_ctx(struct kbase_device *kbdev,
 
 /**
  * kbase_js_try_run_jobs -  Try to submit the next job on each slot
+ * @kbdev: KBase device
  *
  * The following locks may be used:
  * * kbasep_js_device_data::runpool_mutex
@@ -378,6 +407,7 @@ void kbase_js_try_run_jobs(struct kbase_device *kbdev);
 /**
  * kbasep_js_suspend -  Suspend the job scheduler during a Power Management
  *                      Suspend event.
+ * @kbdev: KBase device
  *
  * Causes all contexts to be removed from the runpool, and prevents any
  * contexts from (re)entering the runpool.
@@ -401,6 +431,7 @@ void kbasep_js_suspend(struct kbase_device *kbdev);
 /**
  * kbasep_js_resume - Resume the Job Scheduler after a Power Management
  *                    Resume event.
+ * @kbdev: KBase device
  *
  * This restores the actions from kbasep_js_suspend():
  * * Schedules contexts back into the runpool
@@ -412,7 +443,7 @@ void kbasep_js_resume(struct kbase_device *kbdev);
  * kbase_js_dep_resolved_submit - Submit an atom to the job scheduler.
  *
  * @kctx:  Context pointer
- * @atom:  Pointer to the atom to submit
+ * @katom:  Pointer to the atom to submit
  *
  * The atom is enqueued on the context's ringbuffer. The caller must have
  * ensured that all dependencies can be represented in the ringbuffer.
@@ -457,7 +488,7 @@ struct kbase_jd_atom *kbase_js_pull(struct kbase_context *kctx, int js);
  * kbase_js_unpull - Return an atom to the job scheduler ringbuffer.
  *
  * @kctx:  Context pointer
- * @atom:  Pointer to the atom to unpull
+ * @katom:  Pointer to the atom to unpull
  *
  * An atom is 'unpulled' if execution is stopped but intended to be returned to
  * later. The most common reason for this is that the atom has been
@@ -584,7 +615,6 @@ void kbase_js_set_timeouts(struct kbase_device *kbdev);
  */
 void kbase_js_set_ctx_priority(struct kbase_context *kctx, int new_priority);
 
-
 /**
  * kbase_js_update_ctx_priority - update the context priority
  *
@@ -603,6 +633,8 @@ void kbase_js_update_ctx_priority(struct kbase_context *kctx);
 /**
  * kbasep_js_is_submit_allowed - Check that a context is allowed to submit
  *                               jobs on this policy
+ * @js_devdata: KBase Job Scheduler Device Data
+ * @kctx:       KBase context
  *
  * The purpose of this abstraction is to hide the underlying data size,
  * and wrap up the long repeated line of code.
@@ -625,13 +657,15 @@ static inline bool kbasep_js_is_submit_allowed(
 	test_bit = (u16) (1u << kctx->as_nr);
 
 	is_allowed = (bool) (js_devdata->runpool_irq.submit_allowed & test_bit);
-	dev_dbg(kctx->kbdev->dev, "JS: submit %s allowed on %p (as=%d)",
+	dev_dbg(kctx->kbdev->dev, "JS: submit %s allowed on %pK (as=%d)",
 			is_allowed ? "is" : "isn't", (void *)kctx, kctx->as_nr);
 	return is_allowed;
 }
 
 /**
  * kbasep_js_set_submit_allowed - Allow a context to submit jobs on this policy
+ * @js_devdata: KBase Job Scheduler Device Data
+ * @kctx:       KBase context
  *
  * The purpose of this abstraction is to hide the underlying data size,
  * and wrap up the long repeated line of code.
@@ -650,7 +684,7 @@ static inline void kbasep_js_set_submit_allowed(
 
 	set_bit = (u16) (1u << kctx->as_nr);
 
-	dev_dbg(kctx->kbdev->dev, "JS: Setting Submit Allowed on %p (as=%d)",
+	dev_dbg(kctx->kbdev->dev, "JS: Setting Submit Allowed on %pK (as=%d)",
 			kctx, kctx->as_nr);
 
 	js_devdata->runpool_irq.submit_allowed |= set_bit;
@@ -659,6 +693,8 @@ static inline void kbasep_js_set_submit_allowed(
 /**
  * kbasep_js_clear_submit_allowed - Prevent a context from submitting more
  *                                  jobs on this policy
+ * @js_devdata: KBase Job Scheduler Device Data
+ * @kctx:       KBase context
  *
  * The purpose of this abstraction is to hide the underlying data size,
  * and wrap up the long repeated line of code.
@@ -679,13 +715,17 @@ static inline void kbasep_js_clear_submit_allowed(
 	clear_bit = (u16) (1u << kctx->as_nr);
 	clear_mask = ~clear_bit;
 
-	dev_dbg(kctx->kbdev->dev, "JS: Clearing Submit Allowed on %p (as=%d)",
+	dev_dbg(kctx->kbdev->dev, "JS: Clearing Submit Allowed on %pK (as=%d)",
 			kctx, kctx->as_nr);
 
 	js_devdata->runpool_irq.submit_allowed &= clear_mask;
 }
 
 /**
+ * kbasep_js_atom_retained_state_init_invalid -
+ * Create an initial 'invalid' atom retained state
+ * @retained_state: pointer where to create and initialize the state
+ *
  * Create an initial 'invalid' atom retained state, that requires no
  * atom-related work to be done on releasing with
  * kbasep_js_runpool_release_ctx_and_katom_retained_state()
@@ -699,6 +739,10 @@ static inline void kbasep_js_atom_retained_state_init_invalid(
 }
 
 /**
+ * kbasep_js_atom_retained_state_copy() - Copy atom state
+ * @retained_state: where to copy
+ * @katom:          where to copy from
+ *
  * Copy atom state that can be made available after jd_done_nolock() is called
  * on that atom.
  */
@@ -743,7 +787,7 @@ static inline bool kbasep_js_has_atom_finished(
  *  kbasep_js_atom_retained_state_is_valid - Determine whether a struct
  *                                           kbasep_js_atom_retained_state
  *                                           is valid
- * @katom_retained_state        the atom's retained state to check
+ * @katom_retained_state:        the atom's retained state to check
  *
  * An invalid struct kbasep_js_atom_retained_state is allowed, and indicates
  * that the code should just ignore it.
@@ -759,6 +803,8 @@ static inline bool kbasep_js_atom_retained_state_is_valid(
 
 /**
  * kbase_js_runpool_inc_context_count - Increment number of running contexts.
+ * @kbdev: KBase device
+ * @kctx:  KBase context
  *
  * The following locking conditions are made on the caller:
  * * The caller must hold the kbasep_js_kctx_info::ctx::jsctx_mutex.
@@ -795,6 +841,8 @@ static inline void kbase_js_runpool_inc_context_count(
 /**
  * kbase_js_runpool_dec_context_count - decrement number of running contexts.
  *
+ * @kbdev: KBase device
+ * @kctx:  KBase context
  * The following locking conditions are made on the caller:
  * * The caller must hold the kbasep_js_kctx_info::ctx::jsctx_mutex.
  * * The caller must hold the kbasep_js_device_data::runpool_mutex
@@ -889,4 +937,17 @@ static inline base_jd_prio kbasep_js_sched_prio_to_atom_prio(int sched_prio)
 	return kbasep_js_relative_priority_to_atom[prio_idx];
 }
 
+/**
+ * kbase_js_priority_check - Check the priority requested
+ *
+ * @kbdev:    Device pointer
+ * @priority: Requested priority
+ *
+ * This will determine whether the requested priority can be satisfied.
+ *
+ * Return: The same or lower priority than requested.
+ */
+
+base_jd_prio kbase_js_priority_check(struct kbase_device *kbdev, base_jd_prio priority);
+
 #endif	/* _KBASE_JM_JS_H_ */
diff --git a/drivers/gpu/arm/bifrost/jm/mali_kbase_js_defs.h b/drivers/gpu/arm/bifrost/jm/mali_kbase_js_defs.h
index 900ecd2c1b8d..68660a9709c3 100644
--- a/drivers/gpu/arm/bifrost/jm/mali_kbase_js_defs.h
+++ b/drivers/gpu/arm/bifrost/jm/mali_kbase_js_defs.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2011-2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,33 +17,15 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
 /**
- * @file mali_kbase_js.h
- * Job Scheduler Type Definitions
+ * DOC: Job Scheduler Type Definitions
  */
 
 #ifndef _KBASE_JS_DEFS_H_
 #define _KBASE_JS_DEFS_H_
 
-/**
- * @addtogroup base_api
- * @{
- */
-
-/**
- * @addtogroup base_kbase_api
- * @{
- */
-
-/**
- * @addtogroup kbase_js
- * @{
- */
 /* Forward decls */
 struct kbase_device;
 struct kbase_jd_atom;
@@ -50,11 +33,14 @@ struct kbase_jd_atom;
 
 typedef u32 kbase_context_flags;
 
-/** Callback function run on all of a context's jobs registered with the Job
- * Scheduler */
-typedef void (*kbasep_js_ctx_job_cb)(struct kbase_device *kbdev, struct kbase_jd_atom *katom);
+/*
+ * typedef kbasep_js_ctx_job_cb - Callback function run on all of a context's
+ * jobs registered with the Job Scheduler
+ */
+typedef void (*kbasep_js_ctx_job_cb)(struct kbase_device *kbdev,
+				     struct kbase_jd_atom *katom);
 
-/**
+/*
  * @brief Maximum number of jobs that can be submitted to a job slot whilst
  * inside the IRQ handler.
  *
@@ -65,7 +51,15 @@ typedef void (*kbasep_js_ctx_job_cb)(struct kbase_device *kbdev, struct kbase_jd
 #define KBASE_JS_MAX_JOB_SUBMIT_PER_SLOT_PER_IRQ 2
 
 /**
- * @brief Context attributes
+ * enum kbasep_js_ctx_attr - Context attributes
+ * @KBASEP_JS_CTX_ATTR_COMPUTE: Attribute indicating a context that contains
+ *                              Compute jobs.
+ * @KBASEP_JS_CTX_ATTR_NON_COMPUTE: Attribute indicating a context that contains
+ * 	Non-Compute jobs.
+ * @KBASEP_JS_CTX_ATTR_COMPUTE_ALL_CORES: Attribute indicating that a context
+ * 	contains compute-job atoms that aren't restricted to a coherent group,
+ * 	and can run on all cores.
+ * @KBASEP_JS_CTX_ATTR_COUNT: Must be the last in the enum
  *
  * Each context attribute can be thought of as a boolean value that caches some
  * state information about either the runpool, or the context:
@@ -82,61 +76,70 @@ typedef void (*kbasep_js_ctx_job_cb)(struct kbase_device *kbdev, struct kbase_jd
  * - The runpool holds a refcount of how many contexts in the runpool have this
  * attribute.
  * - The context holds a refcount of how many atoms have this attribute.
+ *
+ * KBASEP_JS_CTX_ATTR_COMPUTE:
+ * Attribute indicating a context that contains Compute jobs. That is,
+ * the context has jobs of type @ref BASE_JD_REQ_ONLY_COMPUTE
+ *
+ * @note A context can be both 'Compute' and 'Non Compute' if it contains
+ * both types of jobs.
+ *
+ * KBASEP_JS_CTX_ATTR_NON_COMPUTE:
+ * Attribute indicating a context that contains Non-Compute jobs. That is,
+ * the context has some jobs that are \b not of type @ref
+ * BASE_JD_REQ_ONLY_COMPUTE.
+ *
+ * @note A context can be both 'Compute' and 'Non Compute' if it contains
+ * both types of jobs.
+ *
+ * KBASEP_JS_CTX_ATTR_COMPUTE_ALL_CORES:
+ * Attribute indicating that a context contains compute-job atoms that
+ * aren't restricted to a coherent group, and can run on all cores.
+ *
+ * Specifically, this is when the atom's \a core_req satisfy:
+ * - (\a core_req & (BASE_JD_REQ_CS | BASE_JD_REQ_ONLY_COMPUTE | BASE_JD_REQ_T) // uses slot 1 or slot 2
+ * - && !(\a core_req & BASE_JD_REQ_COHERENT_GROUP) // not restricted to coherent groups
+ *
+ * Such atoms could be blocked from running if one of the coherent groups
+ * is being used by another job slot, so tracking this context attribute
+ * allows us to prevent such situations.
+ *
+ * @note This doesn't take into account the 1-coregroup case, where all
+ * compute atoms would effectively be able to run on 'all cores', but
+ * contexts will still not always get marked with this attribute. Instead,
+ * it is the caller's responsibility to take into account the number of
+ * coregroups when interpreting this attribute.
+ *
+ * @note Whilst Tiler atoms are normally combined with
+ * BASE_JD_REQ_COHERENT_GROUP, it is possible to send such atoms without
+ * BASE_JD_REQ_COHERENT_GROUP set. This is an unlikely case, but it's easy
+ * enough to handle anyway.
+ *
+ *
  */
 enum kbasep_js_ctx_attr {
-	/** Attribute indicating a context that contains Compute jobs. That is,
-	 * the context has jobs of type @ref BASE_JD_REQ_ONLY_COMPUTE
-	 *
-	 * @note A context can be both 'Compute' and 'Non Compute' if it contains
-	 * both types of jobs.
-	 */
 	KBASEP_JS_CTX_ATTR_COMPUTE,
-
-	/** Attribute indicating a context that contains Non-Compute jobs. That is,
-	 * the context has some jobs that are \b not of type @ref
-	 * BASE_JD_REQ_ONLY_COMPUTE.
-	 *
-	 * @note A context can be both 'Compute' and 'Non Compute' if it contains
-	 * both types of jobs.
-	 */
 	KBASEP_JS_CTX_ATTR_NON_COMPUTE,
-
-	/** Attribute indicating that a context contains compute-job atoms that
-	 * aren't restricted to a coherent group, and can run on all cores.
-	 *
-	 * Specifically, this is when the atom's \a core_req satisfy:
-	 * - (\a core_req & (BASE_JD_REQ_CS | BASE_JD_REQ_ONLY_COMPUTE | BASE_JD_REQ_T) // uses slot 1 or slot 2
-	 * - && !(\a core_req & BASE_JD_REQ_COHERENT_GROUP) // not restricted to coherent groups
-	 *
-	 * Such atoms could be blocked from running if one of the coherent groups
-	 * is being used by another job slot, so tracking this context attribute
-	 * allows us to prevent such situations.
-	 *
-	 * @note This doesn't take into account the 1-coregroup case, where all
-	 * compute atoms would effectively be able to run on 'all cores', but
-	 * contexts will still not always get marked with this attribute. Instead,
-	 * it is the caller's responsibility to take into account the number of
-	 * coregroups when interpreting this attribute.
-	 *
-	 * @note Whilst Tiler atoms are normally combined with
-	 * BASE_JD_REQ_COHERENT_GROUP, it is possible to send such atoms without
-	 * BASE_JD_REQ_COHERENT_GROUP set. This is an unlikely case, but it's easy
-	 * enough to handle anyway.
-	 */
 	KBASEP_JS_CTX_ATTR_COMPUTE_ALL_CORES,
-
-	/** Must be the last in the enum */
 	KBASEP_JS_CTX_ATTR_COUNT
 };
 
 enum {
-	/** Bit indicating that new atom should be started because this atom completed */
+	/*
+	 * Bit indicating that new atom should be started because this atom
+	 * completed
+	 */
 	KBASE_JS_ATOM_DONE_START_NEW_ATOMS = (1u << 0),
-	/** Bit indicating that the atom was evicted from the JS_NEXT registers */
+	/*
+	 * Bit indicating that the atom was evicted from the JS_NEXT registers
+	 */
 	KBASE_JS_ATOM_DONE_EVICTED_FROM_NEXT = (1u << 1)
 };
 
-/** Combination of KBASE_JS_ATOM_DONE_<...> bits */
+/**
+ * typedef kbasep_js_atom_done_code - Combination of KBASE_JS_ATOM_DONE_<...>
+ * bits
+ */
 typedef u32 kbasep_js_atom_done_code;
 
 /*
@@ -168,7 +171,9 @@ enum {
  * Internal atom priority defines for kbase_jd_atom::sched_prio
  */
 enum {
-	KBASE_JS_ATOM_SCHED_PRIO_HIGH = 0,
+	KBASE_JS_ATOM_SCHED_PRIO_FIRST = 0,
+	KBASE_JS_ATOM_SCHED_PRIO_REALTIME = KBASE_JS_ATOM_SCHED_PRIO_FIRST,
+	KBASE_JS_ATOM_SCHED_PRIO_HIGH,
 	KBASE_JS_ATOM_SCHED_PRIO_MED,
 	KBASE_JS_ATOM_SCHED_PRIO_LOW,
 	KBASE_JS_ATOM_SCHED_PRIO_COUNT,
@@ -183,7 +188,70 @@ enum {
 #define KBASE_JS_ATOM_SCHED_PRIO_DEFAULT KBASE_JS_ATOM_SCHED_PRIO_MED
 
 /**
- * @brief KBase Device Data Job Scheduler sub-structure
+ * struct kbasep_js_device_data - KBase Device Data Job Scheduler sub-structure
+ * @runpool_irq: Sub-structure to collect together Job Scheduling data used in
+ *	IRQ context. The hwaccess_lock must be held when accessing.
+ * @runpool_irq.submit_allowed: Bitvector indicating whether a currently
+ * 	scheduled context is allowed to submit jobs. When bit 'N' is set in
+ * 	this, it indicates whether the context bound to address space 'N' is
+ * 	allowed to submit jobs.
+ * @runpool_irq.ctx_attr_ref_count: Array of Context Attributes Ref_counters:
+ * 	  Each is large enough to hold a refcount of the number of contexts
+ * 	that can fit into the runpool. This is currently BASE_MAX_NR_AS.
+ * 	  Note that when BASE_MAX_NR_AS==16 we need 5 bits (not 4) to store
+ * 	the refcount. Hence, it's not worthwhile reducing this to
+ * 	bit-manipulation on u32s to save space (where in contrast, 4 bit
+ * 	sub-fields would be easy to do and would save space).
+ * 	  Whilst this must not become negative, the sign bit is used for:
+ * 	- error detection in debug builds
+ * 	- Optimization: it is undefined for a signed int to overflow, and so
+ * 	the compiler can optimize for that never happening (thus, no masking
+ * 	is required on updating the variable)
+ * @runpool_irq.slot_affinities: Affinity management and tracking. Bitvector
+ *	to aid affinity checking. Element 'n' bit 'i' indicates that slot 'n'
+ *	is using core i (i.e. slot_affinity_refcount[n][i] > 0)
+ * @runpool_irq.slot_affinity_refcount: Array of fefcount for each core owned
+ *	by each slot. Used to generate the slot_affinities array of bitvectors.
+ *	  The value of the refcount will not exceed BASE_JM_SUBMIT_SLOTS,
+ *	because it is refcounted only when a job is definitely about to be
+ *	submitted to a slot, and is de-refcounted immediately after a job
+ *	finishes
+ * @schedule_sem: Scheduling semaphore. This must be held when calling
+ *	kbase_jm_kick()
+ * @ctx_list_pullable: List of contexts that can currently be pulled from
+ * @ctx_list_unpullable: List of contexts that can not currently be pulled
+ *	from, but have jobs currently running.
+ * @nr_user_contexts_running: Number of currently scheduled user contexts
+ *	(excluding ones that are not submitting jobs)
+ * @nr_all_contexts_running: Number of currently scheduled contexts (including
+ *	ones that are not submitting jobs)
+ * @js_reqs: Core Requirements to match up with base_js_atom's core_req memeber
+ *	@note This is a write-once member, and so no locking is required to
+ *	read
+ * @scheduling_period_ns:	Value for JS_SCHEDULING_PERIOD_NS
+ * @soft_stop_ticks:		Value for JS_SOFT_STOP_TICKS
+ * @soft_stop_ticks_cl:		Value for JS_SOFT_STOP_TICKS_CL
+ * @hard_stop_ticks_ss:		Value for JS_HARD_STOP_TICKS_SS
+ * @hard_stop_ticks_cl:		Value for JS_HARD_STOP_TICKS_CL
+ * @hard_stop_ticks_dumping:	Value for JS_HARD_STOP_TICKS_DUMPING
+ * @gpu_reset_ticks_ss:		Value for JS_RESET_TICKS_SS
+ * @gpu_reset_ticks_cl:		Value for JS_RESET_TICKS_CL
+ * @gpu_reset_ticks_dumping:	Value for JS_RESET_TICKS_DUMPING
+ * @ctx_timeslice_ns:		Value for JS_CTX_TIMESLICE_NS
+ * @suspended_soft_jobs_list:	List of suspended soft jobs
+ * @softstop_always:		Support soft-stop on a single context
+ * @init_status:The initialized-flag is placed at the end, to avoid
+ * 	cache-pollution (we should only be using this during init/term paths).
+ * 	@note This is a write-once member, and so no locking is required to
+ * 	read
+ * @nr_contexts_pullable:Number of contexts that can currently be pulled from
+ * @nr_contexts_runnable:Number of contexts that can either be pulled from or
+ * 	arecurrently running
+ * @soft_job_timeout_ms:Value for JS_SOFT_JOB_TIMEOUT
+ * @queue_mutex: Queue Lock, used to access the Policy's queue of contexts
+ * 	independently of the Run Pool.
+ *	Of course, you don't need the Run Pool lock to access this.
+ * @runpool_mutex: Run Pool mutex, for managing contexts within the runpool.
  *
  * This encapsulates the current context of the Job Scheduler on a particular
  * device. This context is global to the device, and is not tied to any
@@ -191,121 +259,49 @@ enum {
  *
  * nr_contexts_running and as_free are optimized for packing together (by making
  * them smaller types than u32). The operations on them should rarely involve
- * masking. The use of signed types for arithmetic indicates to the compiler that
- * the value will not rollover (which would be undefined behavior), and so under
- * the Total License model, it is free to make optimizations based on that (i.e.
- * to remove masking).
+ * masking. The use of signed types for arithmetic indicates to the compiler
+ * that the value will not rollover (which would be undefined behavior), and so
+ * under the Total License model, it is free to make optimizations based on
+ * that (i.e. to remove masking).
  */
 struct kbasep_js_device_data {
-	/* Sub-structure to collect together Job Scheduling data used in IRQ
-	 * context. The hwaccess_lock must be held when accessing. */
 	struct runpool_irq {
-		/** Bitvector indicating whether a currently scheduled context is allowed to submit jobs.
-		 * When bit 'N' is set in this, it indicates whether the context bound to address space
-		 * 'N' is allowed to submit jobs.
-		 */
 		u16 submit_allowed;
-
-		/** Context Attributes:
-		 * Each is large enough to hold a refcount of the number of contexts
-		 * that can fit into the runpool. This is currently BASE_MAX_NR_AS
-		 *
-		 * Note that when BASE_MAX_NR_AS==16 we need 5 bits (not 4) to store
-		 * the refcount. Hence, it's not worthwhile reducing this to
-		 * bit-manipulation on u32s to save space (where in contrast, 4 bit
-		 * sub-fields would be easy to do and would save space).
-		 *
-		 * Whilst this must not become negative, the sign bit is used for:
-		 * - error detection in debug builds
-		 * - Optimization: it is undefined for a signed int to overflow, and so
-		 * the compiler can optimize for that never happening (thus, no masking
-		 * is required on updating the variable) */
 		s8 ctx_attr_ref_count[KBASEP_JS_CTX_ATTR_COUNT];
-
-		/*
-		 * Affinity management and tracking
-		 */
-		/** Bitvector to aid affinity checking. Element 'n' bit 'i' indicates
-		 * that slot 'n' is using core i (i.e. slot_affinity_refcount[n][i] > 0) */
 		u64 slot_affinities[BASE_JM_MAX_NR_SLOTS];
-		/** Refcount for each core owned by each slot. Used to generate the
-		 * slot_affinities array of bitvectors
-		 *
-		 * The value of the refcount will not exceed BASE_JM_SUBMIT_SLOTS,
-		 * because it is refcounted only when a job is definitely about to be
-		 * submitted to a slot, and is de-refcounted immediately after a job
-		 * finishes */
 		s8 slot_affinity_refcount[BASE_JM_MAX_NR_SLOTS][64];
 	} runpool_irq;
-
-	/**
-	 * Scheduling semaphore. This must be held when calling
-	 * kbase_jm_kick()
-	 */
 	struct semaphore schedule_sem;
-
-	/**
-	 * List of contexts that can currently be pulled from
-	 */
-	struct list_head ctx_list_pullable[BASE_JM_MAX_NR_SLOTS][KBASE_JS_ATOM_SCHED_PRIO_COUNT];
-	/**
-	 * List of contexts that can not currently be pulled from, but have
-	 * jobs currently running.
-	 */
-	struct list_head ctx_list_unpullable[BASE_JM_MAX_NR_SLOTS][KBASE_JS_ATOM_SCHED_PRIO_COUNT];
-
-	/** Number of currently scheduled user contexts (excluding ones that are not submitting jobs) */
+	struct list_head ctx_list_pullable[BASE_JM_MAX_NR_SLOTS]
+					  [KBASE_JS_ATOM_SCHED_PRIO_COUNT];
+	struct list_head ctx_list_unpullable[BASE_JM_MAX_NR_SLOTS]
+					    [KBASE_JS_ATOM_SCHED_PRIO_COUNT];
 	s8 nr_user_contexts_running;
-	/** Number of currently scheduled contexts (including ones that are not submitting jobs) */
 	s8 nr_all_contexts_running;
-
-	/** Core Requirements to match up with base_js_atom's core_req memeber
-	 * @note This is a write-once member, and so no locking is required to read */
 	base_jd_core_req js_reqs[BASE_JM_MAX_NR_SLOTS];
 
-	u32 scheduling_period_ns;    /*< Value for JS_SCHEDULING_PERIOD_NS */
-	u32 soft_stop_ticks;	     /*< Value for JS_SOFT_STOP_TICKS */
-	u32 soft_stop_ticks_cl;	     /*< Value for JS_SOFT_STOP_TICKS_CL */
-	u32 hard_stop_ticks_ss;	     /*< Value for JS_HARD_STOP_TICKS_SS */
-	u32 hard_stop_ticks_cl;	     /*< Value for JS_HARD_STOP_TICKS_CL */
-	u32 hard_stop_ticks_dumping; /*< Value for JS_HARD_STOP_TICKS_DUMPING */
-	u32 gpu_reset_ticks_ss;	     /*< Value for JS_RESET_TICKS_SS */
-	u32 gpu_reset_ticks_cl;	     /*< Value for JS_RESET_TICKS_CL */
-	u32 gpu_reset_ticks_dumping; /*< Value for JS_RESET_TICKS_DUMPING */
-	u32 ctx_timeslice_ns;		 /**< Value for JS_CTX_TIMESLICE_NS */
+	u32 scheduling_period_ns;
+	u32 soft_stop_ticks;
+	u32 soft_stop_ticks_cl;
+	u32 hard_stop_ticks_ss;
+	u32 hard_stop_ticks_cl;
+	u32 hard_stop_ticks_dumping;
+	u32 gpu_reset_ticks_ss;
+	u32 gpu_reset_ticks_cl;
+	u32 gpu_reset_ticks_dumping;
+	u32 ctx_timeslice_ns;
 
-	/** List of suspended soft jobs */
 	struct list_head suspended_soft_jobs_list;
 
 #ifdef CONFIG_MALI_BIFROST_DEBUG
-	/* Support soft-stop on a single context */
 	bool softstop_always;
 #endif				/* CONFIG_MALI_BIFROST_DEBUG */
-
-	/** The initalized-flag is placed at the end, to avoid cache-pollution (we should
-	 * only be using this during init/term paths).
-	 * @note This is a write-once member, and so no locking is required to read */
 	int init_status;
-
-	/* Number of contexts that can currently be pulled from */
 	u32 nr_contexts_pullable;
-
-	/* Number of contexts that can either be pulled from or are currently
-	 * running */
 	atomic_t nr_contexts_runnable;
-
-	/** Value for JS_SOFT_JOB_TIMEOUT */
 	atomic_t soft_job_timeout_ms;
-
-	/**
-	 * Queue Lock, used to access the Policy's queue of contexts
-	 * independently of the Run Pool.
-	 *
-	 * Of course, you don't need the Run Pool lock to access this.
-	 */
 	struct mutex queue_mutex;
-
-	/**
+	/*
 	 * Run Pool mutex, for managing contexts within the runpool.
 	 * Unless otherwise specified, you must hold this lock whilst accessing
 	 * any members that follow
@@ -317,61 +313,59 @@ struct kbasep_js_device_data {
 };
 
 /**
- * @brief KBase Context Job Scheduling information structure
+ * struct kbasep_js_kctx_info - KBase Context Job Scheduling information
+ *	structure
+ * @ctx: Job Scheduler Context information sub-structure.Its members are
+ *	accessed regardless of whether the context is:
+ *	- In the Policy's Run Pool
+ *	- In the Policy's Queue
+ *	- Not queued nor in the Run Pool.
+ *	You must obtain the @ctx.jsctx_mutex before accessing any other members
+ *	of this substructure.
+ *	You may not access any of its members from IRQ context.
+ * @ctx.jsctx_mutex: Job Scheduler Context lock
+ * @ctx.nr_jobs: Number of jobs <b>ready to run</b> - does \em not include
+ *	the jobs waiting in the dispatcher, and dependency-only
+ *	jobs. See kbase_jd_context::job_nr for such jobs
+ * @ctx.ctx_attr_ref_count: Context Attributes ref count. Each is large enough
+ *	to hold a refcount of the number of atoms on the context.
+ * @ctx.is_scheduled_wait: Wait queue to wait for KCTX_SHEDULED flag state
+ *	changes.
+ * @ctx.ctx_list_entry: Link implementing JS queues. Context can be present on
+ *	one list per job slot.
+ * @init_status: The initalized-flag is placed at the end, to avoid
+ *	cache-pollution (we should only be using this during init/term paths)
  *
  * This is a substructure in the struct kbase_context that encapsulates all the
  * scheduling information.
  */
 struct kbasep_js_kctx_info {
-
-	/**
-	 * Job Scheduler Context information sub-structure. These members are
-	 * accessed regardless of whether the context is:
-	 * - In the Policy's Run Pool
-	 * - In the Policy's Queue
-	 * - Not queued nor in the Run Pool.
-	 *
-	 * You must obtain the jsctx_mutex before accessing any other members of
-	 * this substructure.
-	 *
-	 * You may not access any of these members from IRQ context.
-	 */
 	struct kbase_jsctx {
-		struct mutex jsctx_mutex;		    /**< Job Scheduler Context lock */
+		struct mutex jsctx_mutex;
 
-		/** Number of jobs <b>ready to run</b> - does \em not include the jobs waiting in
-		 * the dispatcher, and dependency-only jobs. See kbase_jd_context::job_nr
-		 * for such jobs*/
 		u32 nr_jobs;
-
-		/** Context Attributes:
-		 * Each is large enough to hold a refcount of the number of atoms on
-		 * the context. **/
 		u32 ctx_attr_ref_count[KBASEP_JS_CTX_ATTR_COUNT];
-
-		/**
-		 * Wait queue to wait for KCTX_SHEDULED flag state changes.
-		 * */
 		wait_queue_head_t is_scheduled_wait;
-
-		/** Link implementing JS queues. Context can be present on one
-		 * list per job slot
-		 */
 		struct list_head ctx_list_entry[BASE_JM_MAX_NR_SLOTS];
 	} ctx;
-
-	/* The initalized-flag is placed at the end, to avoid cache-pollution (we should
-	 * only be using this during init/term paths) */
 	int init_status;
 };
 
-/** Subset of atom state that can be available after jd_done_nolock() is called
+/**
+ * struct kbasep_js_atom_retained_state - Subset of atom state.
+ * @event_code: to determine whether the atom has finished
+ * @core_req: core requirements
+ * @sched_priority: priority
+ * @device_nr: Core group atom was executed on
+ *
+ * Subset of atom state that can be available after jd_done_nolock() is called
  * on that atom. A copy must be taken via kbasep_js_atom_retained_state_copy(),
- * because the original atom could disappear. */
+ * because the original atom could disappear.
+ */
 struct kbasep_js_atom_retained_state {
-	/** Event code - to determine whether the atom has finished */
+	/* Event code - to determine whether the atom has finished */
 	enum base_jd_event_code event_code;
-	/** core requirements */
+	/* core requirements */
 	base_jd_core_req core_req;
 	/* priority */
 	int sched_priority;
@@ -380,30 +374,23 @@ struct kbasep_js_atom_retained_state {
 
 };
 
-/**
+/*
  * Value signifying 'no retry on a slot required' for:
  * - kbase_js_atom_retained_state::retry_submit_on_slot
  * - kbase_jd_atom::retry_submit_on_slot
  */
 #define KBASEP_JS_RETRY_SUBMIT_SLOT_INVALID (-1)
 
-/**
- * base_jd_core_req value signifying 'invalid' for a kbase_jd_atom_retained_state.
- *
- * @see kbase_atom_retained_state_is_valid()
+/*
+ * base_jd_core_req value signifying 'invalid' for a
+ * kbase_jd_atom_retained_state. See kbase_atom_retained_state_is_valid()
  */
 #define KBASEP_JS_ATOM_RETAINED_STATE_CORE_REQ_INVALID BASE_JD_REQ_DEP
 
-/**
- * @brief The JS timer resolution, in microseconds
- *
+/*
+ * The JS timer resolution, in microseconds
  * Any non-zero difference in time will be at least this size.
  */
 #define KBASEP_JS_TICK_RESOLUTION_US 1
 
-
-	  /** @} *//* end group kbase_js */
-	  /** @} *//* end group base_kbase_api */
-	  /** @} *//* end group base_api */
-
-#endif				/* _KBASE_JS_DEFS_H_ */
+#endif /* _KBASE_JS_DEFS_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_base_hwconfig_features.h b/drivers/gpu/arm/bifrost/mali_base_hwconfig_features.h
index 0dc08381bee6..bdc769fd4f06 100644
--- a/drivers/gpu/arm/bifrost/mali_base_hwconfig_features.h
+++ b/drivers/gpu/arm/bifrost/mali_base_hwconfig_features.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /* AUTOMATICALLY GENERATED FILE. If you want to amend the issues/features,
@@ -50,12 +49,12 @@ enum base_hw_feature {
 	BASE_HW_FEATURE_FLUSH_REDUCTION,
 	BASE_HW_FEATURE_COHERENCY_REG,
 	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
-	BASE_HW_FEATURE_AARCH64_MMU,
 	BASE_HW_FEATURE_TLS_HASHING,
 	BASE_HW_FEATURE_THREAD_GROUP_SPLIT,
 	BASE_HW_FEATURE_CLEAN_ONLY_SAFE,
 	BASE_HW_FEATURE_IDVS_GROUP_SIZE,
 	BASE_HW_FEATURE_L2_CONFIG,
+	BASE_HW_FEATURE_ASN_HASH,
 	BASE_HW_FEATURE_END
 };
 
@@ -85,7 +84,6 @@ static const enum base_hw_feature base_hw_features_tMIx[] = {
 	BASE_HW_FEATURE_THREAD_GROUP_SPLIT,
 	BASE_HW_FEATURE_FLUSH_REDUCTION,
 	BASE_HW_FEATURE_COHERENCY_REG,
-	BASE_HW_FEATURE_AARCH64_MMU,
 	BASE_HW_FEATURE_END
 };
 
@@ -112,7 +110,6 @@ static const enum base_hw_feature base_hw_features_tHEx[] = {
 	BASE_HW_FEATURE_FLUSH_REDUCTION,
 	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
 	BASE_HW_FEATURE_COHERENCY_REG,
-	BASE_HW_FEATURE_AARCH64_MMU,
 	BASE_HW_FEATURE_END
 };
 
@@ -139,7 +136,6 @@ static const enum base_hw_feature base_hw_features_tSIx[] = {
 	BASE_HW_FEATURE_FLUSH_REDUCTION,
 	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
 	BASE_HW_FEATURE_COHERENCY_REG,
-	BASE_HW_FEATURE_AARCH64_MMU,
 	BASE_HW_FEATURE_END
 };
 
@@ -166,7 +162,6 @@ static const enum base_hw_feature base_hw_features_tDVx[] = {
 	BASE_HW_FEATURE_FLUSH_REDUCTION,
 	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
 	BASE_HW_FEATURE_COHERENCY_REG,
-	BASE_HW_FEATURE_AARCH64_MMU,
 	BASE_HW_FEATURE_END
 };
 
@@ -193,7 +188,6 @@ static const enum base_hw_feature base_hw_features_tNOx[] = {
 	BASE_HW_FEATURE_FLUSH_REDUCTION,
 	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
 	BASE_HW_FEATURE_COHERENCY_REG,
-	BASE_HW_FEATURE_AARCH64_MMU,
 	BASE_HW_FEATURE_TLS_HASHING,
 	BASE_HW_FEATURE_IDVS_GROUP_SIZE,
 	BASE_HW_FEATURE_END
@@ -222,7 +216,6 @@ static const enum base_hw_feature base_hw_features_tGOx[] = {
 	BASE_HW_FEATURE_FLUSH_REDUCTION,
 	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
 	BASE_HW_FEATURE_COHERENCY_REG,
-	BASE_HW_FEATURE_AARCH64_MMU,
 	BASE_HW_FEATURE_TLS_HASHING,
 	BASE_HW_FEATURE_IDVS_GROUP_SIZE,
 	BASE_HW_FEATURE_END
@@ -250,7 +243,6 @@ static const enum base_hw_feature base_hw_features_tTRx[] = {
 	BASE_HW_FEATURE_FLUSH_REDUCTION,
 	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
 	BASE_HW_FEATURE_COHERENCY_REG,
-	BASE_HW_FEATURE_AARCH64_MMU,
 	BASE_HW_FEATURE_IDVS_GROUP_SIZE,
 	BASE_HW_FEATURE_CLEAN_ONLY_SAFE,
 	BASE_HW_FEATURE_END
@@ -278,7 +270,6 @@ static const enum base_hw_feature base_hw_features_tNAx[] = {
 	BASE_HW_FEATURE_FLUSH_REDUCTION,
 	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
 	BASE_HW_FEATURE_COHERENCY_REG,
-	BASE_HW_FEATURE_AARCH64_MMU,
 	BASE_HW_FEATURE_IDVS_GROUP_SIZE,
 	BASE_HW_FEATURE_CLEAN_ONLY_SAFE,
 	BASE_HW_FEATURE_END
@@ -306,7 +297,6 @@ static const enum base_hw_feature base_hw_features_tBEx[] = {
 	BASE_HW_FEATURE_FLUSH_REDUCTION,
 	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
 	BASE_HW_FEATURE_COHERENCY_REG,
-	BASE_HW_FEATURE_AARCH64_MMU,
 	BASE_HW_FEATURE_IDVS_GROUP_SIZE,
 	BASE_HW_FEATURE_L2_CONFIG,
 	BASE_HW_FEATURE_CLEAN_ONLY_SAFE,
@@ -335,7 +325,6 @@ static const enum base_hw_feature base_hw_features_tBAx[] = {
 	BASE_HW_FEATURE_FLUSH_REDUCTION,
 	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
 	BASE_HW_FEATURE_COHERENCY_REG,
-	BASE_HW_FEATURE_AARCH64_MMU,
 	BASE_HW_FEATURE_IDVS_GROUP_SIZE,
 	BASE_HW_FEATURE_L2_CONFIG,
 	BASE_HW_FEATURE_CLEAN_ONLY_SAFE,
@@ -364,7 +353,6 @@ static const enum base_hw_feature base_hw_features_tDUx[] = {
 	BASE_HW_FEATURE_FLUSH_REDUCTION,
 	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
 	BASE_HW_FEATURE_COHERENCY_REG,
-	BASE_HW_FEATURE_AARCH64_MMU,
 	BASE_HW_FEATURE_IDVS_GROUP_SIZE,
 	BASE_HW_FEATURE_L2_CONFIG,
 	BASE_HW_FEATURE_CLEAN_ONLY_SAFE,
@@ -393,123 +381,10 @@ static const enum base_hw_feature base_hw_features_tODx[] = {
 	BASE_HW_FEATURE_FLUSH_REDUCTION,
 	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
 	BASE_HW_FEATURE_COHERENCY_REG,
-	BASE_HW_FEATURE_AARCH64_MMU,
-	BASE_HW_FEATURE_L2_CONFIG,
-	BASE_HW_FEATURE_CLEAN_ONLY_SAFE,
-	BASE_HW_FEATURE_END
-};
-
-static const enum base_hw_feature base_hw_features_tGRx[] = {
-	BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION,
-	BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS,
-	BASE_HW_FEATURE_XAFFINITY,
-	BASE_HW_FEATURE_WARPING,
-	BASE_HW_FEATURE_INTERPIPE_REG_ALIASING,
-	BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS,
-	BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL,
-	BASE_HW_FEATURE_BRNDOUT_CC,
-	BASE_HW_FEATURE_BRNDOUT_KILL,
-	BASE_HW_FEATURE_LD_ST_LEA_TEX,
-	BASE_HW_FEATURE_LD_ST_TILEBUFFER,
-	BASE_HW_FEATURE_LINEAR_FILTER_FLOAT,
-	BASE_HW_FEATURE_MRT,
-	BASE_HW_FEATURE_MSAA_16X,
-	BASE_HW_FEATURE_NEXT_INSTRUCTION_TYPE,
-	BASE_HW_FEATURE_OUT_OF_ORDER_EXEC,
-	BASE_HW_FEATURE_T7XX_PAIRING_RULES,
-	BASE_HW_FEATURE_TEST4_DATUM_MODE,
-	BASE_HW_FEATURE_FLUSH_REDUCTION,
-	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
-	BASE_HW_FEATURE_COHERENCY_REG,
-	BASE_HW_FEATURE_AARCH64_MMU,
-	BASE_HW_FEATURE_L2_CONFIG,
-	BASE_HW_FEATURE_CLEAN_ONLY_SAFE,
-	BASE_HW_FEATURE_END
-};
-
-static const enum base_hw_feature base_hw_features_tVAx[] = {
-	BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION,
-	BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS,
-	BASE_HW_FEATURE_XAFFINITY,
-	BASE_HW_FEATURE_WARPING,
-	BASE_HW_FEATURE_INTERPIPE_REG_ALIASING,
-	BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS,
-	BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL,
-	BASE_HW_FEATURE_BRNDOUT_CC,
-	BASE_HW_FEATURE_BRNDOUT_KILL,
-	BASE_HW_FEATURE_LD_ST_LEA_TEX,
-	BASE_HW_FEATURE_LD_ST_TILEBUFFER,
-	BASE_HW_FEATURE_LINEAR_FILTER_FLOAT,
-	BASE_HW_FEATURE_MRT,
-	BASE_HW_FEATURE_MSAA_16X,
-	BASE_HW_FEATURE_NEXT_INSTRUCTION_TYPE,
-	BASE_HW_FEATURE_OUT_OF_ORDER_EXEC,
-	BASE_HW_FEATURE_T7XX_PAIRING_RULES,
-	BASE_HW_FEATURE_TEST4_DATUM_MODE,
-	BASE_HW_FEATURE_FLUSH_REDUCTION,
-	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
-	BASE_HW_FEATURE_COHERENCY_REG,
-	BASE_HW_FEATURE_AARCH64_MMU,
 	BASE_HW_FEATURE_L2_CONFIG,
 	BASE_HW_FEATURE_CLEAN_ONLY_SAFE,
 	BASE_HW_FEATURE_END
 };
 
-static const enum base_hw_feature base_hw_features_tTUx[] = {
-	BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION,
-	BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS,
-	BASE_HW_FEATURE_XAFFINITY,
-	BASE_HW_FEATURE_WARPING,
-	BASE_HW_FEATURE_INTERPIPE_REG_ALIASING,
-	BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS,
-	BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL,
-	BASE_HW_FEATURE_BRNDOUT_CC,
-	BASE_HW_FEATURE_BRNDOUT_KILL,
-	BASE_HW_FEATURE_LD_ST_LEA_TEX,
-	BASE_HW_FEATURE_LD_ST_TILEBUFFER,
-	BASE_HW_FEATURE_LINEAR_FILTER_FLOAT,
-	BASE_HW_FEATURE_MRT,
-	BASE_HW_FEATURE_MSAA_16X,
-	BASE_HW_FEATURE_NEXT_INSTRUCTION_TYPE,
-	BASE_HW_FEATURE_OUT_OF_ORDER_EXEC,
-	BASE_HW_FEATURE_T7XX_PAIRING_RULES,
-	BASE_HW_FEATURE_TEST4_DATUM_MODE,
-	BASE_HW_FEATURE_FLUSH_REDUCTION,
-	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
-	BASE_HW_FEATURE_COHERENCY_REG,
-	BASE_HW_FEATURE_AARCH64_MMU,
-	BASE_HW_FEATURE_L2_CONFIG,
-	BASE_HW_FEATURE_CLEAN_ONLY_SAFE,
-	BASE_HW_FEATURE_END
-};
-
-static const enum base_hw_feature base_hw_features_tE2x[] = {
-	BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION,
-	BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS,
-	BASE_HW_FEATURE_XAFFINITY,
-	BASE_HW_FEATURE_WARPING,
-	BASE_HW_FEATURE_INTERPIPE_REG_ALIASING,
-	BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS,
-	BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL,
-	BASE_HW_FEATURE_BRNDOUT_CC,
-	BASE_HW_FEATURE_BRNDOUT_KILL,
-	BASE_HW_FEATURE_LD_ST_LEA_TEX,
-	BASE_HW_FEATURE_LD_ST_TILEBUFFER,
-	BASE_HW_FEATURE_LINEAR_FILTER_FLOAT,
-	BASE_HW_FEATURE_MRT,
-	BASE_HW_FEATURE_MSAA_16X,
-	BASE_HW_FEATURE_NEXT_INSTRUCTION_TYPE,
-	BASE_HW_FEATURE_OUT_OF_ORDER_EXEC,
-	BASE_HW_FEATURE_T7XX_PAIRING_RULES,
-	BASE_HW_FEATURE_TEST4_DATUM_MODE,
-	BASE_HW_FEATURE_FLUSH_REDUCTION,
-	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
-	BASE_HW_FEATURE_COHERENCY_REG,
-	BASE_HW_FEATURE_AARCH64_MMU,
-	BASE_HW_FEATURE_IDVS_GROUP_SIZE,
-	BASE_HW_FEATURE_L2_CONFIG,
-	BASE_HW_FEATURE_CLEAN_ONLY_SAFE,
-	BASE_HW_FEATURE_END
-};
 
 #endif /* _BASE_HWCONFIG_FEATURES_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_base_hwconfig_issues.h b/drivers/gpu/arm/bifrost/mali_base_hwconfig_issues.h
index c1ad3ac40705..a61eeb2ca200 100644
--- a/drivers/gpu/arm/bifrost/mali_base_hwconfig_issues.h
+++ b/drivers/gpu/arm/bifrost/mali_base_hwconfig_issues.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /* AUTOMATICALLY GENERATED FILE. If you want to amend the issues/features,
@@ -608,77 +607,5 @@ static const enum base_hw_issue base_hw_issues_model_tODx[] = {
 	BASE_HW_ISSUE_END
 };
 
-static const enum base_hw_issue base_hw_issues_tGRx_r0p0[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_TSIX_2033,
-	BASE_HW_ISSUE_TTRX_1337,
-	BASE_HW_ISSUE_GPU2019_3212,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_model_tGRx[] = {
-	BASE_HW_ISSUE_5736,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_TSIX_2033,
-	BASE_HW_ISSUE_TTRX_1337,
-	BASE_HW_ISSUE_GPU2019_3212,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_tVAx_r0p0[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_TSIX_2033,
-	BASE_HW_ISSUE_TTRX_1337,
-	BASE_HW_ISSUE_GPU2019_3212,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_model_tVAx[] = {
-	BASE_HW_ISSUE_5736,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_TSIX_2033,
-	BASE_HW_ISSUE_TTRX_1337,
-	BASE_HW_ISSUE_GPU2019_3212,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_tTUx_r0p0[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_TSIX_2033,
-	BASE_HW_ISSUE_TTRX_1337,
-	BASE_HW_ISSUE_GPU2019_3212,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_model_tTUx[] = {
-	BASE_HW_ISSUE_5736,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_TSIX_2033,
-	BASE_HW_ISSUE_TTRX_1337,
-	BASE_HW_ISSUE_GPU2019_3212,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_tE2x_r0p0[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_TSIX_2033,
-	BASE_HW_ISSUE_TTRX_1337,
-	BASE_HW_ISSUE_TTRX_921,
-	BASE_HW_ISSUE_TTRX_3414,
-	BASE_HW_ISSUE_TTRX_3083,
-	BASE_HW_ISSUE_GPU2019_3212,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_model_tE2x[] = {
-	BASE_HW_ISSUE_5736,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_TSIX_2033,
-	BASE_HW_ISSUE_TTRX_1337,
-	BASE_HW_ISSUE_TTRX_3414,
-	BASE_HW_ISSUE_TTRX_3083,
-	BASE_HW_ISSUE_GPU2019_3212,
-	BASE_HW_ISSUE_END
-};
 
 #endif /* _BASE_HWCONFIG_ISSUES_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase.h b/drivers/gpu/arm/bifrost/mali_kbase.h
index 8189d02ab910..52dfbe4f6e7f 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 #ifndef _KBASE_H_
 #define _KBASE_H_
 
@@ -38,7 +35,7 @@
 #include <linux/mutex.h>
 #include <linux/rwsem.h>
 #include <linux/sched.h>
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0))
+#if (KERNEL_VERSION(4, 11, 0) <= LINUX_VERSION_CODE)
 #include <linux/sched/mm.h>
 #endif
 #include <linux/slab.h>
@@ -48,7 +45,7 @@
 #include <linux/workqueue.h>
 #include <linux/interrupt.h>
 
-#include "mali_base_kernel.h"
+#include <uapi/gpu/arm/bifrost/mali_base_kernel.h>
 #include <mali_kbase_linux.h>
 
 /*
@@ -67,7 +64,7 @@
 #include "mali_kbase_gpu_memory_debugfs.h"
 #include "mali_kbase_mem_profile_debugfs.h"
 #include "mali_kbase_gpuprops.h"
-#include "mali_kbase_ioctl.h"
+#include <uapi/gpu/arm/bifrost/mali_kbase_ioctl.h>
 #if !MALI_USE_CSF
 #include "mali_kbase_debug_job_fault.h"
 #include "mali_kbase_jd_debugfs.h"
@@ -93,11 +90,11 @@
 #endif
 
 #if MALI_USE_CSF
-/* Physical memory group ID for command stream frontend user I/O.
+/* Physical memory group ID for CSF user I/O.
  */
 #define KBASE_MEM_GROUP_CSF_IO BASE_MEM_GROUP_DEFAULT
 
-/* Physical memory group ID for command stream frontend firmware.
+/* Physical memory group ID for CSF firmware.
  */
 #define KBASE_MEM_GROUP_CSF_FW BASE_MEM_GROUP_DEFAULT
 #endif
@@ -155,9 +152,9 @@ void kbase_release_device(struct kbase_device *kbdev);
  * the flag @ref KBASE_REG_TILER_ALIGN_TOP (check the flags of the kbase
  * region):
  * - alignment offset is set to the difference between the kbase region
- * extent (converted from the original value in pages to bytes) and the kbase
+ * extension (converted from the original value in pages to bytes) and the kbase
  * region initial_commit (also converted from the original value in pages to
- * bytes); alignment mask is set to the kbase region extent in bytes and
+ * bytes); alignment mask is set to the kbase region extension in bytes and
  * decremented by 1.
  *
  * Return: if successful, address of the unmapped area aligned as required;
@@ -216,10 +213,6 @@ void registers_unmap(struct kbase_device *kbdev);
 
 int kbase_device_coherency_init(struct kbase_device *kbdev);
 
-#ifdef CONFIG_MALI_BUSLOG
-int buslog_init(struct kbase_device *kbdev);
-void buslog_term(struct kbase_device *kbdev);
-#endif
 
 #if !MALI_USE_CSF
 int kbase_jd_init(struct kbase_context *kctx);
@@ -413,13 +406,15 @@ void kbasep_as_do_poke(struct work_struct *work);
 
 /**
  * Check whether a system suspend is in progress, or has already been suspended
+ * @kbdev: The kbase device structure for the device
  *
  * The caller should ensure that either kbdev->pm.active_count_lock is held, or
  * a dmb was executed recently (to ensure the value is most
  * up-to-date). However, without a lock the value could change afterwards.
  *
- * @return false if a suspend is not in progress
- * @return !=false otherwise
+ * Return:
+ * * false if a suspend is not in progress
+ * * !=false otherwise
  */
 static inline bool kbase_pm_is_suspending(struct kbase_device *kbdev)
 {
@@ -456,7 +451,11 @@ static inline bool kbase_pm_is_gpu_lost(struct kbase_device *kbdev)
 static inline void kbase_pm_set_gpu_lost(struct kbase_device *kbdev,
 	bool gpu_lost)
 {
-	atomic_set(&kbdev->pm.gpu_lost, (gpu_lost ? 1 : 0));
+	const int new_val = (gpu_lost ? 1 : 0);
+	const int cur_val = atomic_xchg(&kbdev->pm.gpu_lost, new_val);
+
+	if (new_val != cur_val)
+		KBASE_KTRACE_ADD(kbdev, ARB_GPU_LOST, NULL, new_val);
 }
 #endif
 
@@ -496,6 +495,8 @@ void kbase_pm_metrics_stop(struct kbase_device *kbdev);
 /**
  * Return the atom's ID, as was originally supplied by userspace in
  * base_jd_atom::atom_number
+ * @kctx:  KBase context pointer
+ * @katom: Atome for which to return ID
  */
 static inline int kbase_jd_atom_id(struct kbase_context *kctx, struct kbase_jd_atom *katom)
 {
@@ -547,7 +548,7 @@ static inline struct kbase_jd_atom *kbase_jd_atom_from_id(
  * The disjoint event counter is also incremented immediately whenever a job is soft stopped
  * and during context creation.
  *
- * @param kbdev The kbase device
+ * @kbdev: The kbase device
  *
  * Return: 0 on success and non-zero value on failure.
  */
@@ -557,7 +558,7 @@ void kbase_disjoint_init(struct kbase_device *kbdev);
  * Increase the count of disjoint events
  * called when a disjoint event has happened
  *
- * @param kbdev The kbase device
+ * @kbdev: The kbase device
  */
 void kbase_disjoint_event(struct kbase_device *kbdev);
 
@@ -567,14 +568,14 @@ void kbase_disjoint_event(struct kbase_device *kbdev);
  * This should be called when something happens which could be disjoint if the GPU
  * is in a disjoint state. The state refcount keeps track of this.
  *
- * @param kbdev The kbase device
+ * @kbdev: The kbase device
  */
 void kbase_disjoint_event_potential(struct kbase_device *kbdev);
 
 /**
  * Returns the count of disjoint events
  *
- * @param kbdev The kbase device
+ * @kbdev: The kbase device
  * @return the count of disjoint events
  */
 u32 kbase_disjoint_event_get(struct kbase_device *kbdev);
@@ -586,7 +587,7 @@ u32 kbase_disjoint_event_get(struct kbase_device *kbdev);
  * eventually after the disjoint state has completed @ref kbase_disjoint_state_down
  * should be called
  *
- * @param kbdev The kbase device
+ * @kbdev: The kbase device
  */
 void kbase_disjoint_state_up(struct kbase_device *kbdev);
 
@@ -597,10 +598,34 @@ void kbase_disjoint_state_up(struct kbase_device *kbdev);
  *
  * Called after @ref kbase_disjoint_state_up once the disjoint state is over
  *
- * @param kbdev The kbase device
+ * @kbdev: The kbase device
  */
 void kbase_disjoint_state_down(struct kbase_device *kbdev);
 
+/**
+ * kbase_device_pcm_dev_init() - Initialize the priority control manager device
+ *
+ * @kbdev: Pointer to the structure for the kbase device
+ *
+ * Pointer to the priority control manager device is retrieved from the device
+ * tree and a reference is taken on the module implementing the callbacks for
+ * priority control manager operations.
+ *
+ * Return: 0 if successful, or an error code on failure
+ */
+int kbase_device_pcm_dev_init(struct kbase_device *const kbdev);
+
+/**
+ * kbase_device_pcm_dev_term() - Performs priority control manager device
+ *                               deinitialization.
+ *
+ * @kbdev: Pointer to the structure for the kbase device
+ *
+ * Reference is released on the module implementing the callbacks for priority
+ * control manager operations.
+ */
+void kbase_device_pcm_dev_term(struct kbase_device *const kbdev);
+
 /**
  * If a job is soft stopped and the number of contexts is >= this value
  * it is reported as a disjoint event
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_as_fault_debugfs.c b/drivers/gpu/arm/bifrost/mali_kbase_as_fault_debugfs.c
index 76bbfffe03a0..18ca56cb7cec 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_as_fault_debugfs.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_as_fault_debugfs.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2016-2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2016-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <linux/debugfs.h>
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_as_fault_debugfs.h b/drivers/gpu/arm/bifrost/mali_kbase_as_fault_debugfs.h
index 58d7fcf030a4..a9cf99c0aa55 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_as_fault_debugfs.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_as_fault_debugfs.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2016 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2016, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_AS_FAULT_DEBUG_FS_H
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_bits.h b/drivers/gpu/arm/bifrost/mali_kbase_bits.h
index 2c110937a792..6f6dba1b2a02 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_bits.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_bits.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,17 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
- *//* SPDX-License-Identifier: GPL-2.0 */
-/*
- *
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
  */
 
 #ifndef _KBASE_BITS_H_
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_cache_policy.c b/drivers/gpu/arm/bifrost/mali_kbase_cache_policy.c
index 27a03cf02138..7f266aa53cac 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_cache_policy.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_cache_policy.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2012-2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2018, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /*
  * Cache Policy API.
  */
@@ -58,10 +55,11 @@ void kbase_sync_single_for_device(struct kbase_device *kbdev, dma_addr_t handle,
 {
 	dma_sync_single_for_device(kbdev->dev, handle, size, dir);
 }
-
+KBASE_EXPORT_TEST_API(kbase_sync_single_for_device);
 
 void kbase_sync_single_for_cpu(struct kbase_device *kbdev, dma_addr_t handle,
 		size_t size, enum dma_data_direction dir)
 {
 	dma_sync_single_for_cpu(kbdev->dev, handle, size, dir);
 }
+KBASE_EXPORT_TEST_API(kbase_sync_single_for_cpu);
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_cache_policy.h b/drivers/gpu/arm/bifrost/mali_kbase_cache_policy.h
index 8a1e5291bf5f..6799492be822 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_cache_policy.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_cache_policy.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2012-2013, 2015 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2013, 2015, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /*
  * Cache Policy API.
  */
@@ -30,7 +27,7 @@
 #define _KBASE_CACHE_POLICY_H_
 
 #include "mali_kbase.h"
-#include "mali_base_kernel.h"
+#include <uapi/gpu/arm/bifrost/mali_base_kernel.h>
 
 /**
  * kbase_cache_enabled - Choose the cache policy for a specific region
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_caps.h b/drivers/gpu/arm/bifrost/mali_kbase_caps.h
index b201a60fa6e3..478a3177e8ec 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_caps.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_caps.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,15 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
 /**
- * @file mali_kbase_caps.h
- *
- * Driver Capability Queries.
+ * DOC: Driver Capability Queries.
  */
 
 #ifndef _KBASE_CAPS_H_
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_ccswe.c b/drivers/gpu/arm/bifrost/mali_kbase_ccswe.c
index 87d5aaa6bb5d..624482ad6c15 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_ccswe.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_ccswe.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "mali_kbase_ccswe.h"
@@ -50,7 +49,6 @@ void kbase_ccswe_init(struct kbase_ccswe *self)
 
 	spin_lock_init(&self->access);
 }
-KBASE_EXPORT_TEST_API(kbase_ccswe_init);
 
 u64 kbase_ccswe_cycle_at(struct kbase_ccswe *self, u64 timestamp_ns)
 {
@@ -63,7 +61,6 @@ u64 kbase_ccswe_cycle_at(struct kbase_ccswe *self, u64 timestamp_ns)
 
 	return result;
 }
-KBASE_EXPORT_TEST_API(kbase_ccswe_cycle_at);
 
 void kbase_ccswe_freq_change(
 	struct kbase_ccswe *self, u64 timestamp_ns, u32 gpu_freq)
@@ -87,7 +84,6 @@ void kbase_ccswe_freq_change(
 exit:
 	spin_unlock_irqrestore(&self->access, flags);
 }
-KBASE_EXPORT_TEST_API(kbase_ccswe_freq_change);
 
 void kbase_ccswe_reset(struct kbase_ccswe *self)
 {
@@ -102,4 +98,3 @@ void kbase_ccswe_reset(struct kbase_ccswe *self)
 
 	spin_unlock_irqrestore(&self->access, flags);
 }
-
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_ccswe.h b/drivers/gpu/arm/bifrost/mali_kbase_ccswe.h
index 3a7cf73d9eac..5c440b8473d3 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_ccswe.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_ccswe.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_CCSWE_H_
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_config.c b/drivers/gpu/arm/bifrost/mali_kbase_config.c
index ce7070d1d634..fe71526fdf96 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_config.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_config.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2011-2015,2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2015, 2017, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 #include <mali_kbase.h>
 #include <mali_kbase_defs.h>
 #include <mali_kbase_config_defaults.h>
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_config.h b/drivers/gpu/arm/bifrost/mali_kbase_config.h
index 57456e2b90db..fe21cf5fa69f 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_config.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_config.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2010-2017, 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2017, 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,15 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /**
- * @file mali_kbase_config.h
- * Configuration API and Attributes for KBase
+ * DOC: Configuration API and Attributes for KBase
  */
 
 #ifndef _KBASE_CONFIG_H_
@@ -35,26 +31,11 @@
 #include <mali_kbase_backend_config.h>
 #include <linux/rbtree.h>
 
-/**
- * @addtogroup base_api
- * @{
- */
-
-/**
- * @addtogroup base_kbase_api
- * @{
- */
-
-/**
- * @addtogroup kbase_config Configuration API and Attributes
- * @{
- */
-
 /* Forward declaration of struct kbase_device */
 struct kbase_device;
 
 /**
- * kbase_platform_funcs_conf - Specifies platform init/term function pointers
+ * struct kbase_platform_funcs_conf - Specifies platform init/term function pointers
  *
  * Specifies the functions pointers for platform specific initialization and
  * termination. By default no functions are required. No additional platform
@@ -62,7 +43,7 @@ struct kbase_device;
  */
 struct kbase_platform_funcs_conf {
 	/**
-	 * platform_init_func - platform specific init function pointer
+	 * @platform_init_func: platform specific init function pointer
 	 * @kbdev - kbase_device pointer
 	 *
 	 * Returns 0 on success, negative error code otherwise.
@@ -77,7 +58,7 @@ struct kbase_platform_funcs_conf {
 	 */
 	int (*platform_init_func)(struct kbase_device *kbdev);
 	/**
-	 * platform_term_func - platform specific termination function pointer
+	 * @platform_term_func: platform specific termination function pointer
 	 * @kbdev - kbase_device pointer
 	 *
 	 * Function pointer for platform specific termination or NULL if no
@@ -241,14 +222,15 @@ struct kbase_gpu_clk_notifier_data {
 };
 
 /**
- * kbase_clk_rate_trace_op_conf - Specifies GPU clock rate trace operations.
+ * struct kbase_clk_rate_trace_op_conf - Specifies GPU clock rate trace
+ * operations.
  *
  * Specifies the functions pointers for platform specific GPU clock rate trace
  * operations. By default no functions are required.
  */
 struct kbase_clk_rate_trace_op_conf {
 	/**
-	 * enumerate_gpu_clk - Enumerate a GPU clock on the given index
+	 * @enumerate_gpu_clk: Enumerate a GPU clock on the given index
 	 * @kbdev - kbase_device pointer
 	 * @index - GPU clock index
 	 *
@@ -262,7 +244,7 @@ struct kbase_clk_rate_trace_op_conf {
 		unsigned int index);
 
 	/**
-	 * get_gpu_clk_rate - Get the current rate for an enumerated clock.
+	 * @get_gpu_clk_rate: Get the current rate for an enumerated clock.
 	 * @kbdev          - kbase_device pointer
 	 * @gpu_clk_handle - Handle unique to the enumerated GPU clock
 	 *
@@ -272,7 +254,7 @@ struct kbase_clk_rate_trace_op_conf {
 		void *gpu_clk_handle);
 
 	/**
-	 * gpu_clk_notifier_register - Register a clock rate change notifier.
+	 * @gpu_clk_notifier_register: Register a clock rate change notifier.
 	 * @kbdev          - kbase_device pointer
 	 * @gpu_clk_handle - Handle unique to the enumerated GPU clock
 	 * @nb             - notifier block containing the callback function
@@ -291,7 +273,7 @@ struct kbase_clk_rate_trace_op_conf {
 		void *gpu_clk_handle, struct notifier_block *nb);
 
 	/**
-	 * gpu_clk_notifier_unregister - Unregister clock rate change notifier
+	 * @gpu_clk_notifier_unregister: Unregister clock rate change notifier
 	 * @kbdev          - kbase_device pointer
 	 * @gpu_clk_handle - Handle unique to the enumerated GPU clock
 	 * @nb             - notifier block containing the callback function
@@ -335,7 +317,7 @@ struct kbase_platform_config {
 #endif /* CONFIG_OF */
 
 /**
- * @brief Gets the pointer to platform config.
+ * kbase_get_platform_config - Gets the pointer to platform config.
  *
  * @return Pointer to the platform config
  */
@@ -386,8 +368,4 @@ int kbase_platform_register(void);
 void kbase_platform_unregister(void);
 #endif
 
-	  /** @} *//* end group kbase_config */
-	  /** @} *//* end group base_kbase_api */
-	  /** @} *//* end group base_api */
-
 #endif				/* _KBASE_CONFIG_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_config_defaults.h b/drivers/gpu/arm/bifrost/mali_kbase_config_defaults.h
index e079281127ab..aad8e6c88e61 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_config_defaults.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_config_defaults.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2013-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2013-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,14 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
- * @file mali_kbase_config_defaults.h
- *
- * Default values for configuration settings
+ * DOC: Default values for configuration settings
  *
  */
 
@@ -88,29 +85,38 @@ enum {
 };
 
 /**
- * Default period for DVFS sampling
+ * Default period for DVFS sampling (can be overridden by platform header)
  */
+#ifndef DEFAULT_PM_DVFS_PERIOD
 #define DEFAULT_PM_DVFS_PERIOD 100 /* 100ms */
+#endif
 
 /**
  * Power Management poweroff tick granuality. This is in nanoseconds to
- * allow HR timer support.
+ * allow HR timer support (can be overridden by platform header).
  *
  * On each scheduling tick, the power manager core may decide to:
  * -# Power off one or more shader cores
  * -# Power off the entire GPU
  */
+#ifndef DEFAULT_PM_GPU_POWEROFF_TICK_NS
 #define DEFAULT_PM_GPU_POWEROFF_TICK_NS (400000) /* 400us */
+#endif
 
 /**
  * Power Manager number of ticks before shader cores are powered off
+ * (can be overridden by platform header).
  */
+#ifndef DEFAULT_PM_POWEROFF_TICK_SHADER
 #define DEFAULT_PM_POWEROFF_TICK_SHADER (2) /* 400-800us */
+#endif
 
 /**
- * Default scheduling tick granuality
+ * Default scheduling tick granuality (can be overridden by platform header)
  */
+#ifndef DEFAULT_JS_SCHEDULING_PERIOD_NS
 #define DEFAULT_JS_SCHEDULING_PERIOD_NS    (100000000u) /* 100ms */
+#endif
 
 /**
  * Default minimum number of scheduling ticks before jobs are soft-stopped.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_core_linux.c b/drivers/gpu/arm/bifrost/mali_kbase_core_linux.c
index 071b9236dee0..42539832b05e 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_core_linux.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_core_linux.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
@@ -37,9 +36,9 @@
 #include <backend/gpu/mali_kbase_model_dummy.h>
 #endif /* CONFIG_MALI_BIFROST_NO_MALI */
 #include "mali_kbase_mem_profile_debugfs_buf_size.h"
-#include "mali_kbase_debug_mem_view.h"
 #include "mali_kbase_mem.h"
 #include "mali_kbase_mem_pool_debugfs.h"
+#include "mali_kbase_mem_pool_group.h"
 #include "mali_kbase_debugfs_helper.h"
 #if !MALI_CUSTOMER_RELEASE
 #include "mali_kbase_regs_dump_debugfs.h"
@@ -50,12 +49,11 @@
 #if !MALI_USE_CSF
 #include <mali_kbase_hwaccess_jm.h>
 #endif /* !MALI_USE_CSF */
-#ifdef CONFIG_MALI_PRFCNT_SET_SECONDARY_VIA_DEBUG_FS
+#ifdef CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS
 #include <mali_kbase_hwaccess_instr.h>
 #endif
-#include <mali_kbase_ctx_sched.h>
 #include <mali_kbase_reset_gpu.h>
-#include "mali_kbase_ioctl.h"
+#include <uapi/gpu/arm/bifrost/mali_kbase_ioctl.h>
 #if !MALI_USE_CSF
 #include "mali_kbase_kinstr_jm.h"
 #endif
@@ -66,8 +64,8 @@
 #if MALI_USE_CSF
 #include "csf/mali_kbase_csf_firmware.h"
 #include "csf/mali_kbase_csf_tiler_heap.h"
-#include "csf/mali_kbase_csf_kcpu_debugfs.h"
 #include "csf/mali_kbase_csf_csg_debugfs.h"
+#include "csf/mali_kbase_csf_cpu_queue_debugfs.h"
 #endif
 #ifdef CONFIG_MALI_ARBITER_SUPPORT
 #include "arbiter/mali_kbase_arbiter_pm.h"
@@ -79,6 +77,7 @@
 #include "mali_kbase_gwt.h"
 #endif
 #include "mali_kbase_pm_internal.h"
+#include "mali_kbase_dvfs_debugfs.h"
 
 #include <linux/module.h>
 #include <linux/init.h>
@@ -110,13 +109,8 @@
 #include <mali_kbase_config.h>
 
 
-#if (KERNEL_VERSION(3, 13, 0) <= LINUX_VERSION_CODE)
 #include <linux/pm_opp.h>
 #include <soc/rockchip/rockchip_opp_select.h>
-#else
-#include <linux/opp.h>
-#endif
-
 #include <linux/pm_runtime.h>
 
 #include <tl/mali_kbase_timeline.h>
@@ -135,7 +129,9 @@
 #define KERNEL_SIDE_DDK_VERSION_STRING "K:" MALI_RELEASE_NAME "(GPL)"
 
 /**
- * Kernel min/maj <=> API Version
+ * KBASE_API_VERSION - KBase API Version
+ * @major: Kernel major version
+ * @minor: Kernel minor version
  */
 #define KBASE_API_VERSION(major, minor) ((((major) & 0xFFF) << 20)  | \
 					 (((minor) & 0xFFF) << 8) | \
@@ -145,33 +141,14 @@
 #define KBASE_API_MAJ(api_version) ((api_version >> 20) & 0xFFF)
 
 /**
- * mali_kbase_api_version_to_maj_min - convert an api_version to a min/maj pair
- *
- * @api_version: API version to convert
- * @major:  Major version number (must not exceed 12 bits)
- * @minor:  Major version number (must not exceed 12 bits)
- */
-void mali_kbase_api_version_to_maj_min(unsigned long api_version, u16 *maj, u16 *min)
-{
-	if (WARN_ON(!maj))
-		return;
-
-	if (WARN_ON(!min))
-		return;
-
-	*maj = KBASE_API_MAJ(api_version);
-	*min = KBASE_API_MIN(api_version);
-}
-
-/**
- * kbase capabilities table
+ * typedef mali_kbase_capability_def - kbase capabilities table
  */
 typedef struct mali_kbase_capability_def {
 	u16 required_major;
 	u16 required_minor;
 } mali_kbase_capability_def;
 
-/**
+/*
  * This must be kept in-sync with mali_kbase_cap
  *
  * TODO: The alternative approach would be to embed the cap enum values
@@ -435,25 +412,6 @@ static int kbase_api_handshake_dummy(struct kbase_file *kfile,
 	return -EPERM;
 }
 
-/**
- * enum mali_error - Mali error codes shared with userspace
- *
- * This is subset of those common Mali errors that can be returned to userspace.
- * Values of matching user and kernel space enumerators MUST be the same.
- * MALI_ERROR_NONE is guaranteed to be 0.
- *
- * @MALI_ERROR_NONE: Success
- * @MALI_ERROR_OUT_OF_GPU_MEMORY: Not used in the kernel driver
- * @MALI_ERROR_OUT_OF_MEMORY: Memory allocation failure
- * @MALI_ERROR_FUNCTION_FAILED: Generic error code
- */
-enum mali_error {
-	MALI_ERROR_NONE = 0,
-	MALI_ERROR_OUT_OF_GPU_MEMORY,
-	MALI_ERROR_OUT_OF_MEMORY,
-	MALI_ERROR_FUNCTION_FAILED,
-};
-
 static struct kbase_device *to_kbase_device(struct device *dev)
 {
 	return dev_get_drvdata(dev);
@@ -531,9 +489,9 @@ void kbase_release_device(struct kbase_device *kbdev)
 EXPORT_SYMBOL(kbase_release_device);
 
 #ifdef CONFIG_DEBUG_FS
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0) && \
-		!(LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 28) && \
-		LINUX_VERSION_CODE < KERNEL_VERSION(4, 5, 0))
+#if KERNEL_VERSION(4, 6, 0) > LINUX_VERSION_CODE &&                            \
+	!(KERNEL_VERSION(4, 4, 28) <= LINUX_VERSION_CODE &&                    \
+	  KERNEL_VERSION(4, 5, 0) > LINUX_VERSION_CODE)
 /*
  * Older versions, before v4.6, of the kernel doesn't have
  * kstrtobool_from_user(), except longterm 4.4.y which had it added in 4.4.28
@@ -892,10 +850,8 @@ static int kbase_api_mem_alloc(struct kbase_context *kctx,
 	}
 #endif
 
-	reg = kbase_mem_alloc(kctx, alloc->in.va_pages,
-			alloc->in.commit_pages,
-			alloc->in.extent,
-			&flags, &gpu_va);
+	reg = kbase_mem_alloc(kctx, alloc->in.va_pages, alloc->in.commit_pages,
+			      alloc->in.extension, &flags, &gpu_va);
 
 	if (!reg)
 		return -ENOMEM;
@@ -1195,10 +1151,7 @@ static int kbase_api_mem_alias(struct kbase_context *kctx,
 	u64 flags;
 	int err;
 
-	if (alias->in.nents == 0 || alias->in.nents > 2048)
-		return -EINVAL;
-
-	if (alias->in.stride > (U64_MAX / 2048))
+	if (alias->in.nents == 0 || alias->in.nents > BASE_MEM_ALIAS_MAX_ENTS)
 		return -EINVAL;
 
 	ai = vmalloc(sizeof(*ai) * alias->in.nents);
@@ -1402,18 +1355,6 @@ static int kbase_api_sticky_resource_unmap(struct kbase_context *kctx,
 }
 
 #if MALI_UNIT_TEST
-static int kbase_api_tlstream_test(struct kbase_context *kctx,
-		struct kbase_ioctl_tlstream_test *test)
-{
-	kbase_timeline_test(
-			kctx->kbdev,
-			test->tpw_count,
-			test->msg_delay,
-			test->msg_count,
-			test->aux_msg);
-
-	return 0;
-}
 
 static int kbase_api_tlstream_stats(struct kbase_context *kctx,
 		struct kbase_ioctl_tlstream_stats *stats)
@@ -1553,14 +1494,11 @@ static int kbase_ioctl_cs_get_glb_iface(struct kbase_context *kctx,
 	}
 
 	if (!err) {
-		param->out.total_stream_num =
-			kbase_csf_firmware_get_glb_iface(kctx->kbdev,
-				group_data, max_group_num,
-				stream_data, max_total_stream_num,
-				&param->out.glb_version, &param->out.features,
-				&param->out.group_num, &param->out.prfcnt_size);
-
-		param->out.padding = 0;
+		param->out.total_stream_num = kbase_csf_firmware_get_glb_iface(
+			kctx->kbdev, group_data, max_group_num, stream_data,
+			max_total_stream_num, &param->out.glb_version,
+			&param->out.features, &param->out.group_num,
+			&param->out.prfcnt_size, &param->out.instr_features);
 
 		if (copy_to_user(user_groups, group_data,
 			MIN(max_group_num, param->out.group_num) *
@@ -1578,56 +1516,109 @@ static int kbase_ioctl_cs_get_glb_iface(struct kbase_context *kctx,
 	kfree(stream_data);
 	return err;
 }
+
+static int kbasep_ioctl_cs_cpu_queue_dump(struct kbase_context *kctx,
+			struct kbase_ioctl_cs_cpu_queue_info *cpu_queue_info)
+{
+	return kbase_csf_cpu_queue_dump(kctx, cpu_queue_info->buffer,
+					cpu_queue_info->size);
+}
+
 #endif /* MALI_USE_CSF */
 
-#define KBASE_HANDLE_IOCTL(cmd, function, arg)    \
-	do {                                          \
-		BUILD_BUG_ON(_IOC_DIR(cmd) != _IOC_NONE); \
-		return function(arg);                     \
+static int kbasep_ioctl_context_priority_check(struct kbase_context *kctx,
+			struct kbase_ioctl_context_priority_check *priority_check)
+{
+#if MALI_USE_CSF
+	priority_check->priority = kbase_csf_priority_check(kctx->kbdev, priority_check->priority);
+#else
+	base_jd_prio req_priority = (base_jd_prio)priority_check->priority;
+
+	priority_check->priority = (u8)kbase_js_priority_check(kctx->kbdev, req_priority);
+#endif
+	return 0;
+}
+
+#define KBASE_HANDLE_IOCTL(cmd, function, arg)                                 \
+	do {                                                                   \
+		int ret;                                                       \
+		BUILD_BUG_ON(_IOC_DIR(cmd) != _IOC_NONE);                      \
+		dev_dbg(arg->kbdev->dev, "Enter ioctl %s\n", #function);       \
+		ret = function(arg);                                           \
+		dev_dbg(arg->kbdev->dev, "Return %d from ioctl %s\n", ret,     \
+			#function);                                            \
+		return ret;                                                    \
 	} while (0)
 
-#define KBASE_HANDLE_IOCTL_IN(cmd, function, type, arg)    \
-	do {                                                   \
-		type param;                                        \
-		int err;                                           \
-		BUILD_BUG_ON(_IOC_DIR(cmd) != _IOC_WRITE);         \
-		BUILD_BUG_ON(sizeof(param) != _IOC_SIZE(cmd));     \
-		err = copy_from_user(&param, uarg, sizeof(param)); \
-		if (err)                                           \
-			return -EFAULT;                                \
-		return function(arg, &param);                      \
+#define KBASE_HANDLE_IOCTL_IN(cmd, function, type, arg)                        \
+	do {                                                                   \
+		type param;                                                    \
+		int ret, err;                                                  \
+		dev_dbg(arg->kbdev->dev, "Enter ioctl %s\n", #function);       \
+		BUILD_BUG_ON(_IOC_DIR(cmd) != _IOC_WRITE);                     \
+		BUILD_BUG_ON(sizeof(param) != _IOC_SIZE(cmd));                 \
+		err = copy_from_user(&param, uarg, sizeof(param));             \
+		if (err)                                                       \
+			return -EFAULT;                                        \
+		ret = function(arg, &param);                                   \
+		dev_dbg(arg->kbdev->dev, "Return %d from ioctl %s\n", ret,     \
+			#function);                                            \
+		return ret;                                                    \
 	} while (0)
 
-#define KBASE_HANDLE_IOCTL_OUT(cmd, function, type, arg)   \
-	do {                                                   \
-		type param;                                        \
-		int ret, err;                                      \
-		BUILD_BUG_ON(_IOC_DIR(cmd) != _IOC_READ);          \
-		BUILD_BUG_ON(sizeof(param) != _IOC_SIZE(cmd));     \
-		memset(&param, 0, sizeof(param));                  \
-		ret = function(arg, &param);                       \
-		err = copy_to_user(uarg, &param, sizeof(param));   \
-		if (err)                                           \
-			return -EFAULT;                                \
-		return ret;                                        \
+#define KBASE_HANDLE_IOCTL_OUT(cmd, function, type, arg)                       \
+	do {                                                                   \
+		type param;                                                    \
+		int ret, err;                                                  \
+		dev_dbg(arg->kbdev->dev, "Enter ioctl %s\n", #function);       \
+		BUILD_BUG_ON(_IOC_DIR(cmd) != _IOC_READ);                      \
+		BUILD_BUG_ON(sizeof(param) != _IOC_SIZE(cmd));                 \
+		memset(&param, 0, sizeof(param));                              \
+		ret = function(arg, &param);                                   \
+		err = copy_to_user(uarg, &param, sizeof(param));               \
+		if (err)                                                       \
+			return -EFAULT;                                        \
+		dev_dbg(arg->kbdev->dev, "Return %d from ioctl %s\n", ret,     \
+			#function);                                            \
+		return ret;                                                    \
 	} while (0)
 
-#define KBASE_HANDLE_IOCTL_INOUT(cmd, function, type, arg)     \
-	do {                                                       \
-		type param;                                            \
-		int ret, err;                                          \
-		BUILD_BUG_ON(_IOC_DIR(cmd) != (_IOC_WRITE|_IOC_READ)); \
-		BUILD_BUG_ON(sizeof(param) != _IOC_SIZE(cmd));         \
-		err = copy_from_user(&param, uarg, sizeof(param));     \
-		if (err)                                               \
-			return -EFAULT;                                    \
-		ret = function(arg, &param);                           \
-		err = copy_to_user(uarg, &param, sizeof(param));       \
-		if (err)                                               \
-			return -EFAULT;                                    \
-		return ret;                                            \
+#define KBASE_HANDLE_IOCTL_INOUT(cmd, function, type, arg)                     \
+	do {                                                                   \
+		type param;                                                    \
+		int ret, err;                                                  \
+		dev_dbg(arg->kbdev->dev, "Enter ioctl %s\n", #function);       \
+		BUILD_BUG_ON(_IOC_DIR(cmd) != (_IOC_WRITE | _IOC_READ));       \
+		BUILD_BUG_ON(sizeof(param) != _IOC_SIZE(cmd));                 \
+		err = copy_from_user(&param, uarg, sizeof(param));             \
+		if (err)                                                       \
+			return -EFAULT;                                        \
+		ret = function(arg, &param);                                   \
+		err = copy_to_user(uarg, &param, sizeof(param));               \
+		if (err)                                                       \
+			return -EFAULT;                                        \
+		dev_dbg(arg->kbdev->dev, "Return %d from ioctl %s\n", ret,     \
+			#function);                                            \
+		return ret;                                                    \
 	} while (0)
 
+static int kbasep_ioctl_set_limited_core_count(struct kbase_context *kctx,
+			struct kbase_ioctl_set_limited_core_count *set_limited_core_count)
+{
+	const u64 shader_core_mask =
+		kbase_pm_get_present_cores(kctx->kbdev, KBASE_PM_CORE_SHADER);
+	const u64 limited_core_mask =
+		((u64)1 << (set_limited_core_count->max_core_count)) - 1;
+
+	if ((shader_core_mask & limited_core_mask) == 0) {
+		/* At least one shader core must be available after applying the mask */
+		return -EINVAL;
+	}
+
+	kctx->limited_core_mask = limited_core_mask;
+	return 0;
+}
+
 static long kbase_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 {
 	struct kbase_file *const kfile = filp->private_data;
@@ -1981,14 +1972,14 @@ static long kbase_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 				union kbase_ioctl_cs_get_glb_iface,
 				kctx);
 		break;
-#endif /* MALI_USE_CSF */
-#if MALI_UNIT_TEST
-	case KBASE_IOCTL_TLSTREAM_TEST:
-		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_TLSTREAM_TEST,
-				kbase_api_tlstream_test,
-				struct kbase_ioctl_tlstream_test,
+	case KBASE_IOCTL_CS_CPU_QUEUE_DUMP:
+		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_CS_CPU_QUEUE_DUMP,
+				kbasep_ioctl_cs_cpu_queue_dump,
+				struct kbase_ioctl_cs_cpu_queue_info,
 				kctx);
 		break;
+#endif /* MALI_USE_CSF */
+#if MALI_UNIT_TEST
 	case KBASE_IOCTL_TLSTREAM_STATS:
 		KBASE_HANDLE_IOCTL_OUT(KBASE_IOCTL_TLSTREAM_STATS,
 				kbase_api_tlstream_stats,
@@ -1996,6 +1987,18 @@ static long kbase_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 				kctx);
 		break;
 #endif /* MALI_UNIT_TEST */
+	case KBASE_IOCTL_CONTEXT_PRIORITY_CHECK:
+		KBASE_HANDLE_IOCTL_INOUT(KBASE_IOCTL_CONTEXT_PRIORITY_CHECK,
+				kbasep_ioctl_context_priority_check,
+				struct kbase_ioctl_context_priority_check,
+				kctx);
+		break;
+	case KBASE_IOCTL_SET_LIMITED_CORE_COUNT:
+		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_SET_LIMITED_CORE_COUNT,
+				kbasep_ioctl_set_limited_core_count,
+				struct kbase_ioctl_set_limited_core_count,
+				kctx);
+		break;
 	}
 
 	dev_warn(kbdev->dev, "Unknown ioctl 0x%x nr:%d", cmd, _IOC_NR(cmd));
@@ -2023,13 +2026,17 @@ static ssize_t kbase_read(struct file *filp, char __user *buf, size_t count, lof
 		read_error = kbase_csf_read_error(kctx, &event_data);
 
 	if (!read_event && !read_error) {
+		bool dump = kbase_csf_cpu_queue_read_dump_req(kctx,
+							&event_data);
 		/* This condition is not treated as an error.
 		 * It is possible that event handling thread was woken up due
 		 * to a fault/error that occurred for a queue group, but before
 		 * the corresponding fault data was read by the thread the
 		 * queue group was already terminated by the userspace.
 		 */
-		dev_dbg(kctx->kbdev->dev, "Neither event nor error signaled");
+		if (!dump)
+			dev_dbg(kctx->kbdev->dev,
+				"Neither event nor error signaled");
 	}
 
 	if (copy_to_user(buf, &event_data, data_size) != 0) {
@@ -2108,7 +2115,8 @@ static unsigned int kbase_poll(struct file *filp, poll_table *wait)
 void kbase_event_wakeup(struct kbase_context *kctx)
 {
 	KBASE_DEBUG_ASSERT(kctx);
-
+	dev_dbg(kctx->kbdev->dev, "Waking event queue for context %pK\n",
+		(void *)kctx);
 	wake_up_interruptible(&kctx->event_queue);
 }
 
@@ -2120,7 +2128,8 @@ int kbase_event_pending(struct kbase_context *ctx)
 	WARN_ON_ONCE(!ctx);
 
 	return (atomic_read(&ctx->event_count) != 0) ||
-		kbase_csf_error_pending(ctx);
+		kbase_csf_error_pending(ctx) ||
+		kbase_csf_cpu_queue_dump_needed(ctx);
 }
 #else
 int kbase_event_pending(struct kbase_context *ctx)
@@ -2303,6 +2312,7 @@ static DEVICE_ATTR(power_policy, S_IRUGO | S_IWUSR, show_policy, set_policy);
 static ssize_t show_core_mask(struct device *dev, struct device_attribute *attr, char * const buf)
 {
 	struct kbase_device *kbdev;
+	unsigned long flags;
 	ssize_t ret = 0;
 
 	kbdev = to_kbase_device(dev);
@@ -2310,6 +2320,19 @@ static ssize_t show_core_mask(struct device *dev, struct device_attribute *attr,
 	if (!kbdev)
 		return -ENODEV;
 
+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+
+#if MALI_USE_CSF
+	ret += scnprintf(buf + ret, PAGE_SIZE - ret,
+			 "Current debug core mask : 0x%llX\n",
+			 kbdev->pm.debug_core_mask);
+	ret += scnprintf(buf + ret, PAGE_SIZE - ret,
+			 "Current desired core mask : 0x%llX\n",
+			 kbase_pm_ca_get_core_mask(kbdev));
+	ret += scnprintf(buf + ret, PAGE_SIZE - ret,
+			 "Current in use core mask : 0x%llX\n",
+			 kbdev->pm.backend.shaders_avail);
+#else
 	ret += scnprintf(buf + ret, PAGE_SIZE - ret,
 			"Current core mask (JS0) : 0x%llX\n",
 			kbdev->pm.debug_core_mask[0]);
@@ -2319,10 +2342,14 @@ static ssize_t show_core_mask(struct device *dev, struct device_attribute *attr,
 	ret += scnprintf(buf + ret, PAGE_SIZE - ret,
 			"Current core mask (JS2) : 0x%llX\n",
 			kbdev->pm.debug_core_mask[2]);
+#endif /* MALI_USE_CSF */
+
 	ret += scnprintf(buf + ret, PAGE_SIZE - ret,
 			"Available core mask : 0x%llX\n",
 			kbdev->gpu_props.props.raw_props.shader_present);
 
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+
 	return ret;
 }
 
@@ -2341,17 +2368,35 @@ static ssize_t show_core_mask(struct device *dev, struct device_attribute *attr,
 static ssize_t set_core_mask(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
 {
 	struct kbase_device *kbdev;
+#if MALI_USE_CSF
+	u64 new_core_mask;
+#else
 	u64 new_core_mask[3];
-	int items, i;
+	u64 group0_core_mask;
+	int i;
+#endif /* MALI_USE_CSF */
+
+	int items;
 	ssize_t err = count;
 	unsigned long flags;
-	u64 shader_present, group0_core_mask;
+	u64 shader_present;
 
 	kbdev = to_kbase_device(dev);
 
 	if (!kbdev)
 		return -ENODEV;
 
+#if MALI_USE_CSF
+	items = sscanf(buf, "%llx", &new_core_mask);
+
+	if (items != 1) {
+		dev_err(kbdev->dev,
+			"Couldn't process core mask write operation.\n"
+			"Use format <core_mask>\n");
+		err = -EINVAL;
+		goto end;
+	}
+#else
 	items = sscanf(buf, "%llx %llx %llx",
 			&new_core_mask[0], &new_core_mask[1],
 			&new_core_mask[2]);
@@ -2366,11 +2411,35 @@ static ssize_t set_core_mask(struct device *dev, struct device_attribute *attr,
 
 	if (items == 1)
 		new_core_mask[1] = new_core_mask[2] = new_core_mask[0];
+#endif
 
 	mutex_lock(&kbdev->pm.lock);
 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
 
 	shader_present = kbdev->gpu_props.props.raw_props.shader_present;
+
+#if MALI_USE_CSF
+	if ((new_core_mask & shader_present) != new_core_mask) {
+		dev_err(dev,
+			"Invalid core mask 0x%llX: Includes non-existent cores (present = 0x%llX)",
+			new_core_mask, shader_present);
+		err = -EINVAL;
+		goto unlock;
+
+	} else if (!(new_core_mask & shader_present &
+		     kbdev->pm.backend.ca_cores_enabled)) {
+		dev_err(dev,
+			"Invalid core mask 0x%llX: No intersection with currently available cores (present = 0x%llX, CA enabled = 0x%llX\n",
+			new_core_mask,
+			kbdev->gpu_props.props.raw_props.shader_present,
+			kbdev->pm.backend.ca_cores_enabled);
+		err = -EINVAL;
+		goto unlock;
+	}
+
+	if (kbdev->pm.debug_core_mask != new_core_mask)
+		kbase_pm_set_debug_core_mask(kbdev, new_core_mask);
+#else
 	group0_core_mask = kbdev->gpu_props.props.coherency_info.group[0].core_mask;
 
 	for (i = 0; i < 3; ++i) {
@@ -2405,6 +2474,7 @@ static ssize_t set_core_mask(struct device *dev, struct device_attribute *attr,
 		kbase_pm_set_debug_core_mask(kbdev, new_core_mask[0],
 				new_core_mask[1], new_core_mask[2]);
 	}
+#endif /* MALI_USE_CSF */
 
 unlock:
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
@@ -2740,7 +2810,8 @@ static ssize_t set_js_scheduling_period(struct device *dev,
 
 	/* If no contexts have been scheduled since js_timeouts was last written
 	 * to, the new timeouts might not have been latched yet. So check if an
-	 * update is pending and use the new values if necessary. */
+	 * update is pending and use the new values if necessary.
+	 */
 
 	/* Use previous 'new' scheduling period as a base if present. */
 	old_period = js_data->scheduling_period_ns;
@@ -3015,25 +3086,15 @@ static ssize_t kbase_show_gpuinfo(struct device *dev,
 		{ .id = GPU_ID2_PRODUCT_TBEX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT,
 		  .name = "Mali-G78" },
 		{ .id = GPU_ID2_PRODUCT_TBAX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT,
-		  .name = "Mali-TBAX" },
+		  .name = "Mali-G78AE" },
 		{ .id = GPU_ID2_PRODUCT_LBEX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT,
 		  .name = "Mali-G68" },
 		{ .id = GPU_ID2_PRODUCT_TNAX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT,
 		  .name = "Mali-G57" },
 		{ .id = GPU_ID2_PRODUCT_TODX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT,
 		  .name = "Mali-TODX" },
-		{ .id = GPU_ID2_PRODUCT_TGRX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT,
-		  .name = "Mali-TGRX" },
-		{ .id = GPU_ID2_PRODUCT_TVAX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT,
-		  .name = "Mali-TVAX" },
 		{ .id = GPU_ID2_PRODUCT_LODX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT,
 		  .name = "Mali-LODX" },
-		{ .id = GPU_ID2_PRODUCT_TTUX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT,
-		  .name = "Mali-TTUX" },
-		{ .id = GPU_ID2_PRODUCT_LTUX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT,
-		  .name = "Mali-LTUX" },
-		{ .id = GPU_ID2_PRODUCT_TE2X >> GPU_ID_VERSION_PRODUCT_ID_SHIFT,
-		  .name = "Mali-TE2X" },
 	};
 	const char *product_name = "(Unknown Mali GPU)";
 	struct kbase_device *kbdev;
@@ -3224,6 +3285,75 @@ static ssize_t show_pm_poweroff(struct device *dev,
 static DEVICE_ATTR(pm_poweroff, S_IRUGO | S_IWUSR, show_pm_poweroff,
 		set_pm_poweroff);
 
+#if MALI_USE_CSF
+/**
+ * set_idle_hysteresis_time - Store callback for CSF idle_hysteresis_time
+ *                            sysfs file.
+ * @dev:   The device with sysfs file is for
+ * @attr:  The attributes of the sysfs file
+ * @buf:   The value written to the sysfs file
+ * @count: The number of bytes written to the sysfs file
+ *
+ * This function is called when the idle_hysteresis_time sysfs file is
+ * written to.
+ *
+ * This file contains values of the idle idle hysteresis duration.
+ *
+ * Return: @count if the function succeeded. An error code on failure.
+ */
+static ssize_t set_idle_hysteresis_time(struct device *dev,
+		struct device_attribute *attr, const char *buf, size_t count)
+{
+	struct kbase_device *kbdev;
+	u32 dur;
+
+	kbdev = to_kbase_device(dev);
+	if (!kbdev)
+		return -ENODEV;
+
+	if (kstrtou32(buf, 0, &dur)) {
+		dev_err(kbdev->dev, "Couldn't process idle_hysteresis_time write operation.\n"
+				"Use format <idle_hysteresis_time>\n");
+		return -EINVAL;
+	}
+
+	kbase_csf_firmware_set_gpu_idle_hysteresis_time(kbdev, dur);
+
+	return count;
+}
+
+/**
+ * show_idle_hysteresis_time - Show callback for CSF idle_hysteresis_time
+ *                             sysfs entry.
+ * @dev:  The device this sysfs file is for.
+ * @attr: The attributes of the sysfs file.
+ * @buf:  The output buffer to receive the GPU information.
+ *
+ * This function is called to get the current idle hysteresis duration in ms.
+ *
+ * Return: The number of bytes output to @buf.
+ */
+static ssize_t show_idle_hysteresis_time(struct device *dev,
+		struct device_attribute *attr, char * const buf)
+{
+	struct kbase_device *kbdev;
+	ssize_t ret;
+	u32 dur;
+
+	kbdev = to_kbase_device(dev);
+	if (!kbdev)
+		return -ENODEV;
+
+	dur = kbase_csf_firmware_get_gpu_idle_hysteresis_time(kbdev);
+	ret = scnprintf(buf, PAGE_SIZE, "%u\n", dur);
+
+	return ret;
+}
+
+static DEVICE_ATTR(idle_hysteresis_time, S_IRUGO | S_IWUSR,
+		show_idle_hysteresis_time, set_idle_hysteresis_time);
+#endif
+
 /**
  * set_reset_timeout - Store callback for the reset_timeout sysfs file.
  * @dev:   The device with sysfs file is for
@@ -3460,6 +3590,203 @@ static ssize_t set_lp_mem_pool_max_size(struct device *dev,
 static DEVICE_ATTR(lp_mem_pool_max_size, S_IRUGO | S_IWUSR, show_lp_mem_pool_max_size,
 		set_lp_mem_pool_max_size);
 
+/**
+ * show_simplified_mem_pool_max_size - Show the maximum size for the memory
+ *                                     pool 0 of small (4KiB) pages.
+ * @dev:  The device this sysfs file is for.
+ * @attr: The attributes of the sysfs file.
+ * @buf:  The output buffer to receive the max size.
+ *
+ * This function is called to get the maximum size for the memory pool 0 of
+ * small (4KiB) pages. It is assumed that the maximum size value is same for
+ * all the pools.
+ *
+ * Return: The number of bytes output to @buf.
+ */
+static ssize_t show_simplified_mem_pool_max_size(struct device *dev,
+		struct device_attribute *attr, char * const buf)
+{
+	struct kbase_device *const kbdev = to_kbase_device(dev);
+
+	if (!kbdev)
+		return -ENODEV;
+
+	return kbase_debugfs_helper_get_attr_to_string(buf, PAGE_SIZE,
+		kbdev->mem_pools.small, 1, kbase_mem_pool_debugfs_max_size);
+}
+
+/**
+ * set_simplified_mem_pool_max_size - Set the same maximum size for all the
+ *                                    memory pools of small (4KiB) pages.
+ * @dev:   The device with sysfs file is for
+ * @attr:  The attributes of the sysfs file
+ * @buf:   The value written to the sysfs file
+ * @count: The number of bytes written to the sysfs file
+ *
+ * This function is called to set the same maximum size for all the memory
+ * pools of small (4KiB) pages.
+ *
+ * Return: The number of bytes output to @buf.
+ */
+static ssize_t set_simplified_mem_pool_max_size(struct device *dev,
+		struct device_attribute *attr, const char *buf, size_t count)
+{
+	struct kbase_device *const kbdev = to_kbase_device(dev);
+	unsigned long new_size;
+	int gid;
+	int err;
+
+	if (!kbdev)
+		return -ENODEV;
+
+	err = kstrtoul(buf, 0, &new_size);
+	if (err)
+		return -EINVAL;
+
+	for (gid = 0; gid < MEMORY_GROUP_MANAGER_NR_GROUPS; ++gid)
+		kbase_mem_pool_debugfs_set_max_size(
+			kbdev->mem_pools.small, gid, (size_t)new_size);
+
+	return count;
+}
+
+static DEVICE_ATTR(max_size, 0600, show_simplified_mem_pool_max_size,
+		set_simplified_mem_pool_max_size);
+
+/**
+ * show_simplified_lp_mem_pool_max_size - Show the maximum size for the memory
+ *                                        pool 0 of large (2MiB) pages.
+ * @dev:  The device this sysfs file is for.
+ * @attr: The attributes of the sysfs file.
+ * @buf:  The output buffer to receive the total current pool size.
+ *
+ * This function is called to get the maximum size for the memory pool 0 of
+ * large (2MiB) pages. It is assumed that the maximum size value is same for
+ * all the pools.
+ *
+ * Return: The number of bytes output to @buf.
+ */
+static ssize_t show_simplified_lp_mem_pool_max_size(struct device *dev,
+		struct device_attribute *attr, char * const buf)
+{
+	struct kbase_device *const kbdev = to_kbase_device(dev);
+
+	if (!kbdev)
+		return -ENODEV;
+
+	return kbase_debugfs_helper_get_attr_to_string(buf, PAGE_SIZE,
+		kbdev->mem_pools.large, 1, kbase_mem_pool_debugfs_max_size);
+}
+
+/**
+ * set_simplified_lp_mem_pool_max_size - Set the same maximum size for all the
+ *                                       memory pools of large (2MiB) pages.
+ * @dev:   The device with sysfs file is for
+ * @attr:  The attributes of the sysfs file
+ * @buf:   The value written to the sysfs file
+ * @count: The number of bytes written to the sysfs file
+ *
+ * This function is called to set the same maximum size for all the memory
+ * pools of large (2MiB) pages.
+ *
+ * Return: The number of bytes output to @buf.
+ */
+static ssize_t set_simplified_lp_mem_pool_max_size(struct device *dev,
+		struct device_attribute *attr, const char *buf, size_t count)
+{
+	struct kbase_device *const kbdev = to_kbase_device(dev);
+	unsigned long new_size;
+	int gid;
+	int err;
+
+	if (!kbdev)
+		return -ENODEV;
+
+	err = kstrtoul(buf, 0, &new_size);
+	if (err)
+		return -EINVAL;
+
+	for (gid = 0; gid < MEMORY_GROUP_MANAGER_NR_GROUPS; ++gid)
+		kbase_mem_pool_debugfs_set_max_size(
+			kbdev->mem_pools.large, gid, (size_t)new_size);
+
+	return count;
+}
+
+static DEVICE_ATTR(lp_max_size, 0600, show_simplified_lp_mem_pool_max_size,
+		set_simplified_lp_mem_pool_max_size);
+
+/**
+ * show_simplified_ctx_default_max_size - Show the default maximum size for the
+ *                                        memory pool 0 of small (4KiB) pages.
+ * @dev:  The device this sysfs file is for.
+ * @attr: The attributes of the sysfs file.
+ * @buf:  The output buffer to receive the pool size.
+ *
+ * This function is called to get the default ctx maximum size for the memory
+ * pool 0 of small (4KiB) pages. It is assumed that maximum size value is same
+ * for all the pools. The maximum size for the pool of large (2MiB) pages will
+ * be same as max size of the pool of small (4KiB) pages in terms of bytes.
+ *
+ * Return: The number of bytes output to @buf.
+ */
+static ssize_t show_simplified_ctx_default_max_size(struct device *dev,
+		struct device_attribute *attr, char * const buf)
+{
+	struct kbase_device *kbdev = to_kbase_device(dev);
+	size_t max_size;
+
+	if (!kbdev)
+		return -ENODEV;
+
+	max_size = kbase_mem_pool_config_debugfs_max_size(
+			kbdev->mem_pool_defaults.small, 0);
+
+	return scnprintf(buf, PAGE_SIZE, "%zu\n", max_size);
+}
+
+/**
+ * set_simplified_ctx_default_max_size - Set the same default maximum size for
+ *                                       all the pools created for new
+ *                                       contexts. This covers the pool of
+ *                                       large pages as well and its max size
+ *                                       will be same as max size of the pool
+ *                                       of small pages in terms of bytes.
+ * @dev:  The device this sysfs file is for.
+ * @attr: The attributes of the sysfs file.
+ * @buf:  The value written to the sysfs file.
+ * @count: The number of bytes written to the sysfs file.
+ *
+ * This function is called to set the same maximum size for all pools created
+ * for new contexts.
+ *
+ * Return: @count if the function succeeded. An error code on failure.
+ */
+static ssize_t set_simplified_ctx_default_max_size(struct device *dev,
+		struct device_attribute *attr, const char *buf, size_t count)
+{
+	struct kbase_device *kbdev;
+	unsigned long new_size;
+	int err;
+
+	kbdev = to_kbase_device(dev);
+	if (!kbdev)
+		return -ENODEV;
+
+	err = kstrtoul(buf, 0, &new_size);
+	if (err)
+		return -EINVAL;
+
+	kbase_mem_pool_group_config_set_max_size(
+		&kbdev->mem_pool_defaults, (size_t)new_size);
+
+	return count;
+}
+
+static DEVICE_ATTR(ctx_default_max_size, 0600,
+		show_simplified_ctx_default_max_size,
+		set_simplified_ctx_default_max_size);
+
 #if !MALI_USE_CSF
 /**
  * show_js_ctx_scheduling_mode - Show callback for js_ctx_scheduling_mode sysfs
@@ -3767,21 +4094,28 @@ static void kbasep_protected_mode_hwcnt_disable_worker(struct work_struct *data)
 {
 	struct kbase_device *kbdev = container_of(data, struct kbase_device,
 		protected_mode_hwcnt_disable_work);
+	spinlock_t *backend_lock;
 	unsigned long flags;
 
 	bool do_disable;
 
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+#if MALI_USE_CSF
+	backend_lock = &kbdev->csf.scheduler.interrupt_lock;
+#else
+	backend_lock = &kbdev->hwaccess_lock;
+#endif
+
+	spin_lock_irqsave(backend_lock, flags);
 	do_disable = !kbdev->protected_mode_hwcnt_desired &&
 		!kbdev->protected_mode_hwcnt_disabled;
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+	spin_unlock_irqrestore(backend_lock, flags);
 
 	if (!do_disable)
 		return;
 
 	kbase_hwcnt_context_disable(kbdev->hwcnt_gpu_ctx);
 
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+	spin_lock_irqsave(backend_lock, flags);
 	do_disable = !kbdev->protected_mode_hwcnt_desired &&
 		!kbdev->protected_mode_hwcnt_disabled;
 
@@ -3801,9 +4135,10 @@ static void kbasep_protected_mode_hwcnt_disable_worker(struct work_struct *data)
 		kbase_hwcnt_context_enable(kbdev->hwcnt_gpu_ctx);
 	}
 
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+	spin_unlock_irqrestore(backend_lock, flags);
 }
 
+#ifndef PLATFORM_PROTECTED_CALLBACKS
 static int kbasep_protected_mode_enable(struct protected_mode_device *pdev)
 {
 	struct kbase_device *kbdev = pdev->data;
@@ -3823,6 +4158,9 @@ static const struct protected_mode_ops kbasep_native_protected_ops = {
 	.protected_mode_disable = kbasep_protected_mode_disable
 };
 
+#define PLATFORM_PROTECTED_CALLBACKS (&kbasep_native_protected_ops)
+#endif /* PLATFORM_PROTECTED_CALLBACKS */
+
 int kbase_protected_mode_init(struct kbase_device *kbdev)
 {
 	/* Use native protected ops */
@@ -3831,7 +4169,7 @@ int kbase_protected_mode_init(struct kbase_device *kbdev)
 	if (!kbdev->protected_dev)
 		return -ENOMEM;
 	kbdev->protected_dev->data = kbdev;
-	kbdev->protected_ops = &kbasep_native_protected_ops;
+	kbdev->protected_ops = PLATFORM_PROTECTED_CALLBACKS;
 	INIT_WORK(&kbdev->protected_mode_hwcnt_disable_work,
 		kbasep_protected_mode_hwcnt_disable_worker);
 	kbdev->protected_mode_hwcnt_desired = true;
@@ -3999,6 +4337,7 @@ int kbase_device_pm_init(struct kbase_device *kbdev)
 	u32 gpu_model_id;
 
 	if (kbase_is_pv_enabled(kbdev->dev->of_node)) {
+		dev_info(kbdev->dev, "Arbitration interface enabled\n");
 		if (kbase_is_pm_enabled(kbdev->dev->of_node)) {
 			/* Arbitration AND power management invalid */
 			dev_err(kbdev->dev, "Invalid combination of arbitration AND power management\n");
@@ -4022,13 +4361,16 @@ int kbase_device_pm_init(struct kbase_device *kbdev)
 			gpu_model_id = GPU_ID2_MODEL_MATCH_VALUE(product_id);
 
 			if (gpu_model_id != GPU_ID2_PRODUCT_TGOX
-				&& gpu_model_id != GPU_ID2_PRODUCT_TNOX) {
+				&& gpu_model_id != GPU_ID2_PRODUCT_TNOX
+				&& gpu_model_id != GPU_ID2_PRODUCT_TBAX) {
 				kbase_arbiter_pm_early_term(kbdev);
 				dev_err(kbdev->dev, "GPU platform not suitable for arbitration\n");
 				return -EPERM;
 			}
 		}
 	} else {
+		kbdev->arb.arb_if = NULL;
+		kbdev->arb.arb_dev = NULL;
 		err = power_control_init(kbdev);
 	}
 #else
@@ -4053,7 +4395,7 @@ void kbase_device_pm_term(struct kbase_device *kbdev)
 
 int power_control_init(struct kbase_device *kbdev)
 {
-#if KERNEL_VERSION(3, 18, 0) > LINUX_VERSION_CODE || !defined(CONFIG_OF)
+#ifndef CONFIG_OF
 	/* Power control initialization requires at least the capability to get
 	 * regulators and clocks from the device tree, as well as parsing
 	 * arrays of unsigned integer values.
@@ -4143,6 +4485,11 @@ int power_control_init(struct kbase_device *kbdev)
 	kbdev->nr_clocks = i;
 	dev_dbg(&pdev->dev, "Clocks probed: %u\n", kbdev->nr_clocks);
 
+	/* Any error in parsing the OPP table from the device file
+	 * shall be ignored. The fact that the table may be absent or wrong
+	 * on the device tree of the platform shouldn't prevent the driver
+	 * from completing its initialization.
+	 */
 #if defined(CONFIG_PM_OPP)
 #if ((KERNEL_VERSION(4, 10, 0) <= LINUX_VERSION_CODE) && \
 	defined(CONFIG_REGULATOR))
@@ -4152,16 +4499,14 @@ int power_control_init(struct kbase_device *kbdev)
 	}
 #endif /* (KERNEL_VERSION(4, 10, 0) <= LINUX_VERSION_CODE */
 #ifdef CONFIG_ARCH_ROCKCHIP
-	err = kbase_platform_rk_init_opp_table(kbdev);
-	if (err)
-		dev_err(kbdev->dev, "Failed to init_opp_table (%d)\n", err);
+       err = kbase_platform_rk_init_opp_table(kbdev);
+       if (err)
+               dev_err(kbdev->dev, "Failed to init_opp_table (%d)\n", err);
 #else
 	err = dev_pm_opp_of_add_table(kbdev->dev);
 	CSTD_UNUSED(err);
 #endif
 #endif /* CONFIG_PM_OPP */
-
-#endif /* KERNEL_VERSION(4, 4, 0) > LINUX_VERSION_CODE */
 	return 0;
 
 clocks_probe_defer:
@@ -4170,19 +4515,13 @@ int power_control_init(struct kbase_device *kbdev)
 		regulator_put(kbdev->regulators[i]);
 #endif
 	return err;
+#endif /* CONFIG_OF */
 }
 
 void power_control_term(struct kbase_device *kbdev)
 {
 	unsigned int i;
 
-#if (KERNEL_VERSION(4, 4, 0) > LINUX_VERSION_CODE && \
-	!defined(LSK_OPPV2_BACKPORT))
-#if KERNEL_VERSION(3, 19, 0) <= LINUX_VERSION_CODE
-	of_free_opp_table(kbdev->dev);
-#endif
-#else
-
 #if defined(CONFIG_PM_OPP)
 	dev_pm_opp_of_remove_table(kbdev->dev);
 #if ((KERNEL_VERSION(4, 10, 0) <= LINUX_VERSION_CODE) && \
@@ -4192,8 +4531,6 @@ void power_control_term(struct kbase_device *kbdev)
 #endif /* (KERNEL_VERSION(4, 10, 0) <= LINUX_VERSION_CODE */
 #endif /* CONFIG_PM_OPP */
 
-#endif /* KERNEL_VERSION(4, 4, 0) > LINUX_VERSION_CODE */
-
 	for (i = 0; i < BASE_MAX_NR_CLOCKS_REGULATORS; i++) {
 		if (kbdev->clocks[i]) {
 			clk_unprepare(kbdev->clocks[i]);
@@ -4203,15 +4540,14 @@ void power_control_term(struct kbase_device *kbdev)
 			break;
 	}
 
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)) && defined(CONFIG_OF) \
-			&& defined(CONFIG_REGULATOR)
+#if defined(CONFIG_OF) && defined(CONFIG_REGULATOR)
 	for (i = 0; i < BASE_MAX_NR_CLOCKS_REGULATORS; i++) {
 		if (kbdev->regulators[i]) {
 			regulator_put(kbdev->regulators[i]);
 			kbdev->regulators[i] = NULL;
 		}
 	}
-#endif /* LINUX_VERSION_CODE >= 3, 12, 0 */
+#endif
 }
 
 #ifdef MALI_KBASE_BUILD
@@ -4220,7 +4556,7 @@ void power_control_term(struct kbase_device *kbdev)
 static void trigger_reset(struct kbase_device *kbdev)
 {
 	kbase_pm_context_active(kbdev);
-	if (kbase_prepare_to_reset_gpu(kbdev))
+	if (kbase_prepare_to_reset_gpu(kbdev, RESET_FLAGS_NONE))
 		kbase_reset_gpu(kbdev);
 	kbase_pm_context_idle(kbdev);
 }
@@ -4248,7 +4584,7 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_##type##_quirks, type##_quirks_get,\
 MAKE_QUIRK_ACCESSORS(sc);
 MAKE_QUIRK_ACCESSORS(tiler);
 MAKE_QUIRK_ACCESSORS(mmu);
-MAKE_QUIRK_ACCESSORS(jm);
+MAKE_QUIRK_ACCESSORS(gpu);
 
 static ssize_t kbase_device_debugfs_reset_write(struct file *file,
 		const char __user *ubuf, size_t count, loff_t *ppos)
@@ -4369,7 +4705,9 @@ int kbase_device_debugfs_init(struct kbase_device *kbdev)
 	kbdev->mali_debugfs_directory = debugfs_create_dir(kbdev->devname,
 			NULL);
 	if (!kbdev->mali_debugfs_directory) {
-		dev_err(kbdev->dev, "Couldn't create mali debugfs directory\n");
+		dev_err(kbdev->dev,
+			"Couldn't create mali debugfs directory: %s\n",
+			kbdev->devname);
 		err = -ENOMEM;
 		goto out;
 	}
@@ -4409,11 +4747,12 @@ int kbase_device_debugfs_init(struct kbase_device *kbdev)
 
 	kbasep_gpu_memory_debugfs_init(kbdev);
 	kbase_as_fault_debugfs_init(kbdev);
-#ifdef CONFIG_MALI_PRFCNT_SET_SECONDARY_VIA_DEBUG_FS
+#ifdef CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS
 	kbase_instr_backend_debugfs_init(kbdev);
 #endif
 	/* fops_* variables created by invocations of macro
-	 * MAKE_QUIRK_ACCESSORS() above. */
+	 * MAKE_QUIRK_ACCESSORS() above.
+	 */
 	debugfs_create_file("quirks_sc", 0644,
 			kbdev->mali_debugfs_directory, kbdev,
 			&fops_sc_quirks);
@@ -4423,9 +4762,8 @@ int kbase_device_debugfs_init(struct kbase_device *kbdev)
 	debugfs_create_file("quirks_mmu", 0644,
 			kbdev->mali_debugfs_directory, kbdev,
 			&fops_mmu_quirks);
-	debugfs_create_file("quirks_jm", 0644,
-			kbdev->mali_debugfs_directory, kbdev,
-			&fops_jm_quirks);
+	debugfs_create_file("quirks_gpu", 0644, kbdev->mali_debugfs_directory,
+			    kbdev, &fops_gpu_quirks);
 
 	debugfs_create_bool("infinite_cache", mode,
 			debugfs_ctx_defaults_directory,
@@ -4468,6 +4806,8 @@ int kbase_device_debugfs_init(struct kbase_device *kbdev)
 			&kbasep_serialize_jobs_debugfs_fops);
 #endif
 
+	kbase_dvfs_status_debugfs_init(kbdev);
+
 	return 0;
 
 out:
@@ -4519,6 +4859,17 @@ int kbase_device_coherency_init(struct kbase_device *kbdev)
 
 		override_coherency = be32_to_cpup(coherency_override_dts);
 
+#if MALI_USE_CSF && !defined(CONFIG_MALI_BIFROST_NO_MALI)
+		/* ACE coherency mode is not supported by Driver on CSF GPUs.
+		 * Return an error to signal the invalid device tree configuration.
+		 */
+		if (override_coherency == COHERENCY_ACE) {
+			dev_err(kbdev->dev,
+				"ACE coherency not supported, wrong DT configuration");
+			return -EINVAL;
+		}
+#endif
+
 		if ((override_coherency <= COHERENCY_NONE) &&
 			(supported_coherency_bitmap &
 			 COHERENCY_FEATURE_BIT(override_coherency))) {
@@ -4542,40 +4893,149 @@ int kbase_device_coherency_init(struct kbase_device *kbdev)
 	return 0;
 }
 
-#ifdef CONFIG_MALI_BUSLOG
 
-/* Callback used by the kbase bus logger client, to initiate a GPU reset
- * when the bus log is restarted.  GPU reset is used as reference point
- * in HW bus log analyses.
+#if MALI_USE_CSF
+/**
+ * csg_scheduling_period_store - Store callback for the csg_scheduling_period
+ * sysfs file.
+ * @dev:   The device with sysfs file is for
+ * @attr:  The attributes of the sysfs file
+ * @buf:   The value written to the sysfs file
+ * @count: The number of bytes written to the sysfs file
+ *
+ * This function is called when the csg_scheduling_period sysfs file is written
+ * to. It checks the data written, and if valid updates the reset timeout.
+ *
+ * Return: @count if the function succeeded. An error code on failure.
  */
-static void kbase_logging_started_cb(void *data)
+static ssize_t csg_scheduling_period_store(struct device *dev,
+					   struct device_attribute *attr,
+					   const char *buf, size_t count)
 {
-	struct kbase_device *kbdev = (struct kbase_device *)data;
+	struct kbase_device *kbdev;
+	int ret;
+	unsigned int csg_scheduling_period;
 
-	if (kbase_prepare_to_reset_gpu(kbdev))
-		kbase_reset_gpu(kbdev);
-	dev_info(kbdev->dev, "KBASE - Bus logger restarted\n");
+	kbdev = to_kbase_device(dev);
+	if (!kbdev)
+		return -ENODEV;
+
+	ret = kstrtouint(buf, 0, &csg_scheduling_period);
+	if (ret || csg_scheduling_period == 0) {
+		dev_err(kbdev->dev,
+			"Couldn't process csg_scheduling_period write operation.\n"
+			"Use format 'csg_scheduling_period_ms', and csg_scheduling_period_ms > 0\n");
+		return -EINVAL;
+	}
+
+	kbase_csf_scheduler_lock(kbdev);
+	kbdev->csf.scheduler.csg_scheduling_period_ms = csg_scheduling_period;
+	dev_dbg(kbdev->dev, "CSG scheduling period: %ums\n",
+		csg_scheduling_period);
+	kbase_csf_scheduler_unlock(kbdev);
+
+	return count;
 }
 
-int buslog_init(struct kbase_device *kbdev)
+/**
+ * csg_scheduling_period_show - Show callback for the csg_scheduling_period
+ * sysfs entry.
+ * @dev:  The device this sysfs file is for.
+ * @attr: The attributes of the sysfs file.
+ * @buf:  The output buffer to receive the GPU information.
+ *
+ * This function is called to get the current reset timeout.
+ *
+ * Return: The number of bytes output to @buf.
+ */
+static ssize_t csg_scheduling_period_show(struct device *dev,
+					  struct device_attribute *attr,
+					  char *const buf)
 {
-	int err = 0;
+	struct kbase_device *kbdev;
+	ssize_t ret;
 
-	err = bl_core_client_register(kbdev->devname,
-					kbase_logging_started_cb,
-					kbdev, &kbdev->buslogger,
-					THIS_MODULE, NULL);
-	if (err == 0)
-		bl_core_set_threshold(kbdev->buslogger, 1024*1024*1024);
+	kbdev = to_kbase_device(dev);
+	if (!kbdev)
+		return -ENODEV;
 
-	return err;
+	ret = scnprintf(buf, PAGE_SIZE, "%u\n",
+			kbdev->csf.scheduler.csg_scheduling_period_ms);
+
+	return ret;
 }
 
-void buslog_term(struct kbase_device *kbdev)
+static DEVICE_ATTR(csg_scheduling_period, 0644, csg_scheduling_period_show,
+		   csg_scheduling_period_store);
+
+/**
+ * fw_timeout_store - Store callback for the fw_timeout sysfs file.
+ * @dev:   The device with sysfs file is for
+ * @attr:  The attributes of the sysfs file
+ * @buf:   The value written to the sysfs file
+ * @count: The number of bytes written to the sysfs file
+ *
+ * This function is called when the fw_timeout sysfs file is written to. It
+ * checks the data written, and if valid updates the reset timeout.
+ *
+ * Return: @count if the function succeeded. An error code on failure.
+ */
+static ssize_t fw_timeout_store(struct device *dev,
+				struct device_attribute *attr, const char *buf,
+				size_t count)
 {
-	bl_core_client_unregister(kbdev->buslogger);
+	struct kbase_device *kbdev;
+	int ret;
+	unsigned int fw_timeout;
+
+	kbdev = to_kbase_device(dev);
+	if (!kbdev)
+		return -ENODEV;
+
+	ret = kstrtouint(buf, 0, &fw_timeout);
+	if (ret || fw_timeout == 0) {
+		dev_err(kbdev->dev, "%s\n%s\n%u",
+			"Couldn't process fw_timeout write operation.",
+			"Use format 'fw_timeout_ms', and fw_timeout_ms > 0",
+			FIRMWARE_PING_INTERVAL_MS);
+		return -EINVAL;
+	}
+
+	kbase_csf_scheduler_lock(kbdev);
+	kbdev->csf.fw_timeout_ms = fw_timeout;
+	kbase_csf_scheduler_unlock(kbdev);
+	dev_dbg(kbdev->dev, "Firmware timeout: %ums\n", fw_timeout);
+
+	return count;
 }
-#endif
+
+/**
+ * fw_timeout_show - Show callback for the firmware timeout sysfs entry.
+ * @dev:  The device this sysfs file is for.
+ * @attr: The attributes of the sysfs file.
+ * @buf:  The output buffer to receive the GPU information.
+ *
+ * This function is called to get the current reset timeout.
+ *
+ * Return: The number of bytes output to @buf.
+ */
+static ssize_t fw_timeout_show(struct device *dev,
+			       struct device_attribute *attr, char *const buf)
+{
+	struct kbase_device *kbdev;
+	ssize_t ret;
+
+	kbdev = to_kbase_device(dev);
+	if (!kbdev)
+		return -ENODEV;
+
+	ret = scnprintf(buf, PAGE_SIZE, "%u\n", kbdev->csf.fw_timeout_ms);
+
+	return ret;
+}
+
+static DEVICE_ATTR(fw_timeout, 0644, fw_timeout_show, fw_timeout_store);
+#endif /* MALI_USE_CSF */
 
 static struct attribute *kbase_scheduling_attrs[] = {
 #if !MALI_USE_CSF
@@ -4598,9 +5058,15 @@ static struct attribute *kbase_attrs[] = {
 	&dev_attr_gpuinfo.attr,
 	&dev_attr_dvfs_period.attr,
 	&dev_attr_pm_poweroff.attr,
+#if MALI_USE_CSF
+	&dev_attr_idle_hysteresis_time.attr,
+#endif
 	&dev_attr_reset_timeout.attr,
 #if !MALI_USE_CSF
 	&dev_attr_js_scheduling_period.attr,
+#else
+	&dev_attr_csg_scheduling_period.attr,
+	&dev_attr_fw_timeout.attr,
 #endif /* !MALI_USE_CSF */
 	&dev_attr_power_policy.attr,
 	&dev_attr_core_mask.attr,
@@ -4614,12 +5080,25 @@ static struct attribute *kbase_attrs[] = {
 	NULL
 };
 
+static struct attribute *kbase_mempool_attrs[] = {
+	&dev_attr_max_size.attr,
+	&dev_attr_lp_max_size.attr,
+	&dev_attr_ctx_default_max_size.attr,
+	NULL
+};
+
 #define SYSFS_SCHEDULING_GROUP "scheduling"
 static const struct attribute_group kbase_scheduling_attr_group = {
 	.name = SYSFS_SCHEDULING_GROUP,
 	.attrs = kbase_scheduling_attrs,
 };
 
+#define SYSFS_MEMPOOL_GROUP "mempool"
+static const struct attribute_group kbase_mempool_attr_group = {
+	.name = SYSFS_MEMPOOL_GROUP,
+	.attrs = kbase_mempool_attrs,
+};
+
 static const struct attribute_group kbase_attr_group = {
 	.attrs = kbase_attrs,
 };
@@ -4635,15 +5114,28 @@ int kbase_sysfs_init(struct kbase_device *kbdev)
 	kbdev->mdev.mode = 0666;
 
 	err = sysfs_create_group(&kbdev->dev->kobj, &kbase_attr_group);
-	if (!err) {
-		err = sysfs_create_group(&kbdev->dev->kobj,
-					 &kbase_scheduling_attr_group);
-		if (err) {
-			dev_err(kbdev->dev, "Creation of %s sysfs group failed",
-				SYSFS_SCHEDULING_GROUP);
-			sysfs_remove_group(&kbdev->dev->kobj,
-					   &kbase_attr_group);
-		}
+	if (err)
+		return err;
+
+	err = sysfs_create_group(&kbdev->dev->kobj,
+			&kbase_scheduling_attr_group);
+	if (err) {
+		dev_err(kbdev->dev, "Creation of %s sysfs group failed",
+			SYSFS_SCHEDULING_GROUP);
+		sysfs_remove_group(&kbdev->dev->kobj,
+			&kbase_attr_group);
+		return err;
+	}
+
+	err = sysfs_create_group(&kbdev->dev->kobj,
+			&kbase_mempool_attr_group);
+	if (err) {
+		dev_err(kbdev->dev, "Creation of %s sysfs group failed",
+			SYSFS_MEMPOOL_GROUP);
+		sysfs_remove_group(&kbdev->dev->kobj,
+			&kbase_scheduling_attr_group);
+		sysfs_remove_group(&kbdev->dev->kobj,
+			&kbase_attr_group);
 	}
 
 	return err;
@@ -4651,6 +5143,7 @@ int kbase_sysfs_init(struct kbase_device *kbdev)
 
 void kbase_sysfs_term(struct kbase_device *kbdev)
 {
+	sysfs_remove_group(&kbdev->dev->kobj, &kbase_mempool_attr_group);
 	sysfs_remove_group(&kbdev->dev->kobj, &kbase_scheduling_attr_group);
 	sysfs_remove_group(&kbdev->dev->kobj, &kbase_attr_group);
 	put_device(kbdev->dev);
@@ -4710,7 +5203,8 @@ static int kbase_platform_device_probe(struct platform_device *pdev)
 
 	if (err) {
 		if (err == -EPROBE_DEFER)
-			dev_err(kbdev->dev, "Device initialization Deferred\n");
+			dev_info(kbdev->dev,
+				"Device initialization Deferred\n");
 		else
 			dev_err(kbdev->dev, "Device initialization failed\n");
 
@@ -4752,8 +5246,11 @@ static int kbase_device_suspend(struct device *dev)
 
 	kbase_pm_suspend(kbdev);
 
-#if defined(CONFIG_MALI_BIFROST_DEVFREQ) && \
-		(LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
+#ifdef CONFIG_MALI_BIFROST_DVFS
+	kbase_pm_metrics_stop(kbdev);
+#endif
+
+#ifdef CONFIG_MALI_BIFROST_DEVFREQ
 	dev_dbg(dev, "Callback %s\n", __func__);
 	if (kbdev->devfreq) {
 		kbase_devfreq_enqueue_work(kbdev, DEVFREQ_WORK_SUSPEND);
@@ -4781,8 +5278,11 @@ static int kbase_device_resume(struct device *dev)
 
 	kbase_pm_resume(kbdev);
 
-#if defined(CONFIG_MALI_BIFROST_DEVFREQ) && \
-		(LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
+#ifdef CONFIG_MALI_BIFROST_DVFS
+	kbase_pm_metrics_start(kbdev);
+#endif
+
+#ifdef CONFIG_MALI_BIFROST_DEVFREQ
 	dev_dbg(dev, "Callback %s\n", __func__);
 	if (kbdev->devfreq) {
 		mutex_lock(&kbdev->pm.lock);
@@ -4814,8 +5314,13 @@ static int kbase_device_runtime_suspend(struct device *dev)
 	if (!kbdev)
 		return -ENODEV;
 
-#if defined(CONFIG_MALI_BIFROST_DEVFREQ) && \
-		(LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
+	dev_dbg(dev, "Callback %s\n", __func__);
+
+#ifdef CONFIG_MALI_BIFROST_DVFS
+	kbase_pm_metrics_stop(kbdev);
+#endif
+
+#ifdef CONFIG_MALI_BIFROST_DEVFREQ
 	if (kbdev->devfreq)
 		kbase_devfreq_enqueue_work(kbdev, DEVFREQ_WORK_SUSPEND);
 #endif
@@ -4853,8 +5358,11 @@ static int kbase_device_runtime_resume(struct device *dev)
 		dev_dbg(dev, "runtime resume\n");
 	}
 
-#if defined(CONFIG_MALI_BIFROST_DEVFREQ) && \
-		(LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
+#ifdef CONFIG_MALI_BIFROST_DVFS
+	kbase_pm_metrics_start(kbdev);
+#endif
+
+#ifdef CONFIG_MALI_BIFROST_DEVFREQ
 	if (kbdev->devfreq)
 		kbase_devfreq_enqueue_work(kbdev, DEVFREQ_WORK_RESUME);
 #endif
@@ -4920,7 +5428,6 @@ static struct platform_driver kbase_platform_driver = {
 	.remove = kbase_platform_device_remove,
 	.driver = {
 		   .name = kbase_drv_name,
-		   .owner = THIS_MODULE,
 		   .pm = &kbase_pm_ops,
 		   .of_match_table = of_match_ptr(kbase_dt_ids),
 	},
@@ -4965,6 +5472,7 @@ MODULE_LICENSE("GPL");
 MODULE_VERSION(MALI_RELEASE_NAME " (UK version " \
 		__stringify(BASE_UK_VERSION_MAJOR) "." \
 		__stringify(BASE_UK_VERSION_MINOR) ")");
+MODULE_SOFTDEP("pre: memory_group_manager");
 
 #define CREATE_TRACE_POINTS
 /* Create the trace points (otherwise we just get code to call a tracepoint) */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_cs_experimental.h b/drivers/gpu/arm/bifrost/mali_kbase_cs_experimental.h
index caba2cd7a0e3..67cd5ee1ece7 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_cs_experimental.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_cs_experimental.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,18 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
- *//* SPDX-License-Identifier: GPL-2.0 */
-
-/*
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
  */
 
 #ifndef _KBASE_CS_EXPERIMENTAL_H_
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_ctx_sched.c b/drivers/gpu/arm/bifrost/mali_kbase_ctx_sched.c
index 750dbd8c3924..c63bc8dfa70a 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_ctx_sched.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_ctx_sched.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2017-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,13 +17,9 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
-#include <mali_kbase_config_defaults.h>
-
 #include <mali_kbase_defs.h>
 #include "mali_kbase_ctx_sched.h"
 #include "tl/mali_kbase_tracepoints.h"
@@ -46,7 +43,8 @@ int kbase_ctx_sched_init(struct kbase_device *kbdev)
 	int as_present = (1U << kbdev->nr_hw_address_spaces) - 1;
 
 	/* These two must be recalculated if nr_hw_address_spaces changes
-	 * (e.g. for HW workarounds) */
+	 * (e.g. for HW workarounds)
+	 */
 	kbdev->nr_user_address_spaces = kbdev->nr_hw_address_spaces;
 	kbdev->as_free = as_present; /* All ASs initially free */
 
@@ -261,7 +259,7 @@ struct kbase_context *kbase_ctx_sched_as_to_ctx_refcount(
 
 	found_kctx = kbdev->as_to_kctx[as_nr];
 
-	if (found_kctx != NULL)
+	if (!WARN_ON(found_kctx == NULL))
 		kbase_ctx_sched_retain_ctx_refcount(found_kctx);
 
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
@@ -275,23 +273,35 @@ struct kbase_context *kbase_ctx_sched_as_to_ctx(struct kbase_device *kbdev,
 	unsigned long flags;
 	struct kbase_context *found_kctx;
 
+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+
+	found_kctx = kbase_ctx_sched_as_to_ctx_nolock(kbdev, as_nr);
+
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+
+	return found_kctx;
+}
+
+struct kbase_context *kbase_ctx_sched_as_to_ctx_nolock(
+		struct kbase_device *kbdev, size_t as_nr)
+{
+	struct kbase_context *found_kctx;
+
 	if (WARN_ON(kbdev == NULL))
 		return NULL;
 
 	if (WARN_ON(as_nr >= BASE_MAX_NR_AS))
 		return NULL;
 
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+	lockdep_assert_held(&kbdev->hwaccess_lock);
 
 	found_kctx = kbdev->as_to_kctx[as_nr];
 
 	if (found_kctx) {
-		if (WARN_ON(atomic_read(&found_kctx->refcount) <= 0))
+		if (atomic_read(&found_kctx->refcount) <= 0)
 			found_kctx = NULL;
 	}
 
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
 	return found_kctx;
 }
 
@@ -353,3 +363,40 @@ void kbase_ctx_sched_release_ctx_lock(struct kbase_context *kctx)
 
 	spin_unlock_irqrestore(&kctx->kbdev->hwaccess_lock, flags);
 }
+
+#if MALI_USE_CSF
+bool kbase_ctx_sched_inc_refcount_if_as_valid(struct kbase_context *kctx)
+{
+	struct kbase_device *kbdev;
+	bool added_ref = false;
+	unsigned long flags;
+
+	if (WARN_ON(kctx == NULL))
+		return added_ref;
+
+	kbdev = kctx->kbdev;
+
+	if (WARN_ON(kbdev == NULL))
+		return added_ref;
+
+	mutex_lock(&kbdev->mmu_hw_mutex);
+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+
+	if ((kctx->as_nr != KBASEP_AS_NR_INVALID) &&
+	    (kctx == kbdev->as_to_kctx[kctx->as_nr])) {
+		atomic_inc(&kctx->refcount);
+
+		if (kbdev->as_free & (1u << kctx->as_nr))
+			kbdev->as_free &= ~(1u << kctx->as_nr);
+
+		KBASE_KTRACE_ADD(kbdev, SCHED_RETAIN_CTX_NOLOCK, kctx,
+				 kbase_ktrace_get_ctx_refcnt(kctx));
+		added_ref = true;
+	}
+
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+	mutex_unlock(&kbdev->mmu_hw_mutex);
+
+	return added_ref;
+}
+#endif
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_ctx_sched.h b/drivers/gpu/arm/bifrost/mali_kbase_ctx_sched.h
index 1affa719e6dc..cadb73538a85 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_ctx_sched.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_ctx_sched.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2017-2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2017-2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_CTX_SCHED_H_
@@ -26,7 +25,7 @@
 #include <mali_kbase.h>
 
 /**
- * The Context Scheduler manages address space assignment and reference
+ * DOC: The Context Scheduler manages address space assignment and reference
  * counting to kbase_context. The interface has been designed to minimise
  * interactions between the Job Scheduler and Power Management/MMU to support
  * the existing Job Scheduler interface.
@@ -41,7 +40,7 @@
  */
 
 /**
- * kbase_ctx_sched_init - Initialise the context scheduler
+ * kbase_ctx_sched_init() - Initialise the context scheduler
  * @kbdev: The device for which the context scheduler needs to be initialised
  *
  * This must be called during device initialisation. The number of hardware
@@ -167,6 +166,21 @@ struct kbase_context *kbase_ctx_sched_as_to_ctx_refcount(
 struct kbase_context *kbase_ctx_sched_as_to_ctx(struct kbase_device *kbdev,
 		size_t as_nr);
 
+/**
+ * kbase_ctx_sched_as_to_ctx_nolock - Lookup a context based on its current
+ * address space.
+ * @kbdev: The device for which the returned context must belong
+ * @as_nr: address space assigned to the context of interest
+ *
+ * The following lock must be held by the caller:
+ * * kbase_device::hwaccess_lock
+ *
+ * Return: a valid struct kbase_context on success or NULL on failure,
+ * indicating that no context was found in as_nr.
+ */
+struct kbase_context *kbase_ctx_sched_as_to_ctx_nolock(
+		struct kbase_device *kbdev, size_t as_nr);
+
 /**
  * kbase_ctx_sched_inc_refcount_nolock - Refcount a context as being busy,
  * preventing it from being scheduled out.
@@ -206,4 +220,22 @@ bool kbase_ctx_sched_inc_refcount(struct kbase_context *kctx);
  */
 void kbase_ctx_sched_release_ctx_lock(struct kbase_context *kctx);
 
+#if MALI_USE_CSF
+/**
+ * kbase_ctx_sched_inc_refcount_if_as_valid - Refcount the context if it has GPU
+ *                                            address space slot assigned to it.
+ *
+ * @kctx: Context to be refcounted
+ *
+ * This function takes a reference on the context if it has a GPU address space
+ * slot assigned to it. The address space slot will not be available for
+ * re-assignment until the reference is released.
+ *
+ * Return: true if refcount succeeded and the address space slot will not be
+ * reassigned, false if the refcount failed (because the address space slot
+ * was not assigned).
+ */
+bool kbase_ctx_sched_inc_refcount_if_as_valid(struct kbase_context *kctx);
+#endif
+
 #endif /* _KBASE_CTX_SCHED_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_debug.c b/drivers/gpu/arm/bifrost/mali_kbase_debug.c
index 118f787fb74c..6caf56ca263e 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_debug.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_debug.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2012-2014 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2014, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 #include <mali_kbase.h>
 
 static struct kbasep_debug_assert_cb kbasep_debug_assert_registered_cb = {
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_debug.h b/drivers/gpu/arm/bifrost/mali_kbase_debug.h
index f33413908405..87d3069d958b 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_debug.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_debug.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2012-2015, 2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2015, 2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 #ifndef _KBASE_DEBUG_H
 #define _KBASE_DEBUG_H
 
@@ -51,9 +48,9 @@ struct kbasep_debug_assert_cb {
 };
 
 /**
- * @def KBASEP_DEBUG_PRINT_TRACE
- * @brief Private macro containing the format of the trace to display before every message
- * @sa KBASE_DEBUG_SKIP_TRACE, KBASE_DEBUG_SKIP_FUNCTION_NAME
+ * KBASEP_DEBUG_PRINT_TRACE - Private macro containing the format of the trace
+ * to display before every message @sa KBASE_DEBUG_SKIP_TRACE,
+ * KBASE_DEBUG_SKIP_FUNCTION_NAME
  */
 #if !KBASE_DEBUG_SKIP_TRACE
 #define KBASEP_DEBUG_PRINT_TRACE \
@@ -68,21 +65,22 @@ struct kbasep_debug_assert_cb {
 #endif
 
 /**
- * @def KBASEP_DEBUG_ASSERT_OUT(trace, function, ...)
- * @brief (Private) system printing function associated to the @ref KBASE_DEBUG_ASSERT_MSG event.
- * @param trace location in the code from where the message is printed
- * @param function function from where the message is printed
- * @param ... Format string followed by format arguments.
+ * KBASEP_DEBUG_ASSERT_OUT(trace, function, ...) - (Private) system printing
+ * function associated to the @ref KBASE_DEBUG_ASSERT_MSG event.
+ * @trace: location in the code from where the message is printed
+ * @function: function from where the message is printed
+ * @...: Format string followed by format arguments.
+ *
  * @note function parameter cannot be concatenated with other strings
  */
 /* Select the correct system output function*/
 #ifdef CONFIG_MALI_BIFROST_DEBUG
-#define KBASEP_DEBUG_ASSERT_OUT(trace, function, ...)\
-		do { \
-			pr_err("Mali<ASSERT>: %s function:%s ", trace, function);\
-			pr_err(__VA_ARGS__);\
-			pr_err("\n");\
-		} while (false)
+#define KBASEP_DEBUG_ASSERT_OUT(trace, function, ...)                          \
+	do {                                                                   \
+		pr_err("Mali<ASSERT>: %s function:%s ", trace, function);      \
+		pr_err(__VA_ARGS__);                                           \
+		pr_err("\n");                                                  \
+	} while (false)
 #else
 #define KBASEP_DEBUG_ASSERT_OUT(trace, function, ...) CSTD_NOP()
 #endif
@@ -94,12 +92,12 @@ struct kbasep_debug_assert_cb {
 #endif
 
 /**
- * @def KBASE_DEBUG_ASSERT(expr)
- * @brief Calls @ref KBASE_PRINT_ASSERT and prints the expression @a expr if @a expr is false
+ * KBASE_DEBUG_ASSERT(expr) - Calls @ref KBASE_PRINT_ASSERT and prints the
+ * expression @a expr if @a expr is false
+ * @expr: Boolean expression
  *
  * @note This macro does nothing if the flag @ref KBASE_DEBUG_DISABLE_ASSERTS is set to 1
  *
- * @param expr Boolean expression
  */
 #define KBASE_DEBUG_ASSERT(expr) \
 	KBASE_DEBUG_ASSERT_MSG(expr, #expr)
@@ -107,15 +105,15 @@ struct kbasep_debug_assert_cb {
 #if KBASE_DEBUG_DISABLE_ASSERTS
 #define KBASE_DEBUG_ASSERT_MSG(expr, ...) CSTD_NOP()
 #else
-	/**
-	 * @def KBASE_DEBUG_ASSERT_MSG(expr, ...)
-	 * @brief Calls @ref KBASEP_DEBUG_ASSERT_OUT and prints the given message if @a expr is false
-	 *
-	 * @note This macro does nothing if the flag @ref KBASE_DEBUG_DISABLE_ASSERTS is set to 1
-	 *
-	 * @param expr Boolean expression
-	 * @param ...  Message to display when @a expr is false, as a format string followed by format arguments.
-	 */
+/**
+ * KBASE_DEBUG_ASSERT_MSG() - Calls @ref KBASEP_DEBUG_ASSERT_OUT and prints the
+ * given message if @a expr is false
+ * @expr: Boolean expression
+ * @...:  Message to display when @a expr is false, as a format string followed
+ *        by format arguments.
+ *
+ * This macro does nothing if the flag KBASE_DEBUG_DISABLE_ASSERTS is set to 1
+ */
 #define KBASE_DEBUG_ASSERT_MSG(expr, ...) \
 		do { \
 			if (!(expr)) { \
@@ -127,10 +125,8 @@ struct kbasep_debug_assert_cb {
 #endif				/* KBASE_DEBUG_DISABLE_ASSERTS */
 
 /**
- * @def KBASE_DEBUG_CODE( X )
- * @brief Executes the code inside the macro only in debug mode
- *
- * @param X Code to compile only in debug mode.
+ * KBASE_DEBUG_CODE( X ) - Executes the code inside the macro only in debug mode
+ * @X: Code to compile only in debug mode.
  */
 #ifdef CONFIG_MALI_BIFROST_DEBUG
 #define KBASE_DEBUG_CODE(X) X
@@ -141,7 +137,9 @@ struct kbasep_debug_assert_cb {
 /** @} */
 
 /**
- * @brief Register a function to call on ASSERT
+ * kbase_debug_assert_register_hook - Register a function to call on ASSERT
+ * @func: the function to call when an assert is triggered.
+ * @param: the parameter to pass to \a func when calling it
  *
  * Such functions will \b only be called during Debug mode, and for debugging
  * features \b only. Do not rely on them to be called in general use.
@@ -151,13 +149,12 @@ struct kbasep_debug_assert_cb {
  * @note This function is not thread-safe, and should only be used to
  * register/deregister once in the module's lifetime.
  *
- * @param[in] func the function to call when an assert is triggered.
- * @param[in] param the parameter to pass to \a func when calling it
  */
 void kbase_debug_assert_register_hook(kbase_debug_assert_hook *func, void *param);
 
 /**
- * @brief Call a debug assert hook previously registered with kbase_debug_assert_register_hook()
+ * kbasep_debug_assert_call_hook - Call a debug assert hook previously
+ * registered with kbase_debug_assert_register_hook()
  *
  * @note This function is not thread-safe with respect to multiple threads
  * registering functions and parameters with
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_debug_job_fault.c b/drivers/gpu/arm/bifrost/mali_kbase_debug_job_fault.c
index dbc774d56ab4..7dfdff1b1f18 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_debug_job_fault.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_debug_job_fault.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2012-2016, 2018-2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2016, 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
@@ -518,23 +517,24 @@ void kbase_debug_job_fault_dev_term(struct kbase_device *kbdev)
 /*
  *  Initialize the relevant data structure per context
  */
-void kbase_debug_job_fault_context_init(struct kbase_context *kctx)
+int kbase_debug_job_fault_context_init(struct kbase_context *kctx)
 {
 
 	/* We need allocate double size register range
 	 * Because this memory will keep the register address and value
 	 */
 	kctx->reg_dump = vmalloc(0x4000 * 2);
-	if (kctx->reg_dump == NULL)
-		return;
-
-	if (kbase_debug_job_fault_reg_snapshot_init(kctx, 0x4000) == false) {
-		vfree(kctx->reg_dump);
-		kctx->reg_dump = NULL;
+	if (kctx->reg_dump != NULL) {
+		if (kbase_debug_job_fault_reg_snapshot_init(kctx, 0x4000) ==
+		    false) {
+			vfree(kctx->reg_dump);
+			kctx->reg_dump = NULL;
+		}
+		INIT_LIST_HEAD(&kctx->job_fault_resume_event_list);
+		atomic_set(&kctx->job_fault_count, 0);
 	}
-	INIT_LIST_HEAD(&kctx->job_fault_resume_event_list);
-	atomic_set(&kctx->job_fault_count, 0);
 
+	return 0;
 }
 
 /*
@@ -549,6 +549,14 @@ void kbase_debug_job_fault_kctx_unblock(struct kbase_context *kctx)
 {
 	WARN_ON(!kbase_ctx_flag(kctx, KCTX_DYING));
 
+	/* Return early if the job fault part of the kbase_device is not
+	 * initialized yet. An error can happen during the device probe after
+	 * the privileged Kbase context was created for the HW counter dumping
+	 * but before the job fault part is initialized.
+	 */
+	if (!kctx->kbdev->job_fault_resume_workq)
+		return;
+
 	kbase_ctx_remove_pending_event(kctx);
 }
 
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_debug_job_fault.h b/drivers/gpu/arm/bifrost/mali_kbase_debug_job_fault.h
index ef69627cdce8..63ccb3d86b23 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_debug_job_fault.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_debug_job_fault.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2012-2016, 2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2016, 2018, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_DEBUG_JOB_FAULT_H
@@ -54,8 +53,9 @@ void kbase_debug_job_fault_dev_term(struct kbase_device *kbdev);
  * kbase_debug_job_fault_context_init - Initialize the relevant
  *		data structure per context
  * @kctx: KBase context pointer
+ * @return 0 on success
  */
-void kbase_debug_job_fault_context_init(struct kbase_context *kctx);
+int kbase_debug_job_fault_context_init(struct kbase_context *kctx);
 
 /**
  * kbase_debug_job_fault_context_term - Release the relevant
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_debug_mem_view.c b/drivers/gpu/arm/bifrost/mali_kbase_debug_mem_view.c
index 478813705a41..9bdb76572df0 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_debug_mem_view.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_debug_mem_view.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2013-2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2013-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -32,10 +31,6 @@
 
 #ifdef CONFIG_DEBUG_FS
 
-#if (KERNEL_VERSION(4, 1, 0) > LINUX_VERSION_CODE)
-#define get_file_rcu(x) atomic_long_inc_not_zero(&(x)->f_count)
-#endif
-
 struct debug_mem_mapping {
 	struct list_head node;
 
@@ -179,6 +174,13 @@ static int debug_mem_zone_open(struct rb_root *rbtree,
 			/* Empty region - ignore */
 			continue;
 
+		if (reg->flags & KBASE_REG_PROTECTED) {
+			/* CPU access to protected memory is forbidden - so
+			 * skip this GPU virtual region.
+			 */
+			continue;
+		}
+
 		mapping = kmalloc(sizeof(*mapping), GFP_KERNEL);
 		if (!mapping) {
 			ret = -ENOMEM;
@@ -222,19 +224,19 @@ static int debug_mem_open(struct inode *i, struct file *file)
 	kbase_gpu_vm_lock(kctx);
 
 	ret = debug_mem_zone_open(&kctx->reg_rbtree_same, mem_data);
-	if (0 != ret) {
+	if (ret != 0) {
 		kbase_gpu_vm_unlock(kctx);
 		goto out;
 	}
 
 	ret = debug_mem_zone_open(&kctx->reg_rbtree_custom, mem_data);
-	if (0 != ret) {
+	if (ret != 0) {
 		kbase_gpu_vm_unlock(kctx);
 		goto out;
 	}
 
 	ret = debug_mem_zone_open(&kctx->reg_rbtree_exec, mem_data);
-	if (0 != ret) {
+	if (ret != 0) {
 		kbase_gpu_vm_unlock(kctx);
 		goto out;
 	}
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_debug_mem_view.h b/drivers/gpu/arm/bifrost/mali_kbase_debug_mem_view.h
index b948b7cd9dd4..c913d5ce36de 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_debug_mem_view.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_debug_mem_view.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2013-2015, 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2013-2015, 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_DEBUG_MEM_VIEW_H
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_debugfs_helper.c b/drivers/gpu/arm/bifrost/mali_kbase_debugfs_helper.c
index 37e507b164c5..28df887b33dc 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_debugfs_helper.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_debugfs_helper.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <linux/debugfs.h>
@@ -90,6 +89,59 @@ static int set_attr_from_string(
 	return err;
 }
 
+int kbase_debugfs_string_validator(char *const buf)
+{
+	size_t index;
+	int err = 0;
+	char *ptr = buf;
+
+	for (index = 0; *ptr; ++index) {
+		unsigned long test_number;
+		size_t len;
+
+		/* Drop leading spaces */
+		while (*ptr == ' ')
+			ptr++;
+
+		/* Strings passed into the validator will be NULL terminated
+		 * by nature, so here strcspn only needs to delimit by
+		 * newlines, spaces and NULL terminator (delimited natively).
+		 */
+		len = strcspn(ptr, "\n ");
+		if (len == 0) {
+			/* No more values (allow this) */
+			break;
+		}
+
+		/* Substitute a nul terminator for a space character to make
+		 * the substring valid for kstrtoul, and then replace it back.
+		 */
+		if (ptr[len] == ' ') {
+			ptr[len] = '\0';
+			err = kstrtoul(ptr, 0, &test_number);
+			ptr[len] = ' ';
+
+			/* len should only be incremented if there is a valid
+			 * number to follow - otherwise this will skip over
+			 * the NULL terminator in cases with no ending newline
+			 */
+			len++;
+		} else {
+			/* This would occur at the last element before a space
+			 * or a NULL terminator.
+			 */
+			err = kstrtoul(ptr, 0, &test_number);
+		}
+
+		if (err)
+			break;
+		/* Skip the substring (including any premature nul terminator)
+		 */
+		ptr += len;
+	}
+	return err;
+}
+
 int kbase_debugfs_helper_set_attr_from_string(
 	const char *const buf, void *const array, size_t const nelems,
 	kbase_debugfs_helper_set_attr_fn const set_attr_fn)
@@ -100,6 +152,13 @@ int kbase_debugfs_helper_set_attr_from_string(
 	if (!wbuf)
 		return -ENOMEM;
 
+	/* validate string before actually writing values */
+	err = kbase_debugfs_string_validator(wbuf);
+	if (err) {
+		kfree(wbuf);
+		return err;
+	}
+
 	err = set_attr_from_string(wbuf, array, nelems,
 		set_attr_fn);
 
@@ -154,6 +213,14 @@ int kbase_debugfs_helper_seq_write(struct file *const file,
 	}
 
 	buf[count] = '\0';
+
+	/* validate string before actually writing values */
+	err = kbase_debugfs_string_validator(buf);
+	if (err) {
+		kfree(buf);
+		return err;
+	}
+
 	err = set_attr_from_string(buf,
 		array, nelems, set_attr_fn);
 	kfree(buf);
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_debugfs_helper.h b/drivers/gpu/arm/bifrost/mali_kbase_debugfs_helper.h
index c3c9efa14e65..5fcbb15b23e2 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_debugfs_helper.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_debugfs_helper.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_DEBUGFS_HELPER_H_
@@ -58,6 +57,29 @@ int kbase_debugfs_helper_set_attr_from_string(
 	const char *buf, void *array, size_t nelems,
 	kbase_debugfs_helper_set_attr_fn set_attr_fn);
 
+/**
+ * kbase_debugfs_string_validator - Validate a string to be written to a
+ *                                  debugfs file for any incorrect formats
+ *                                  or wrong values.
+ *
+ * This function is to be used before any writes to debugfs values are done
+ * such that any strings with erroneous values (such as octal 09 or
+ * hexadecimal 0xGH are fully ignored) - without this validation, any correct
+ * values before the first incorrect one will still be entered into the
+ * debugfs file. This essentially iterates the values through kstrtoul to see
+ * if it is valid.
+ *
+ * It is largely similar to set_attr_from_string to iterate through the values
+ * of the input string. This function also requires the input string to be
+ * writable.
+ *
+ * @buf: Null-terminated string to validate.
+ *
+ * Return: 0 with no error, else -22 (the invalid return value of kstrtoul) if
+ *         any value in the string was wrong or with an incorrect format.
+ */
+int kbase_debugfs_string_validator(char *const buf);
+
 /**
  * typedef kbase_debugfs_helper_get_attr_fn - Type of function to get an
  *                                            attribute value from an array
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_defs.h b/drivers/gpu/arm/bifrost/mali_kbase_defs.h
index 980cf09500ef..6cff28c90566 100755
--- a/drivers/gpu/arm/bifrost/mali_kbase_defs.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_defs.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2011-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,17 +17,11 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /**
- * @file mali_kbase_defs.h
- *
- * Defintions (types, defines, etcs) common to Kbase. They are placed here to
- * allow the hierarchy of header files to work.
+ * DOC: Defintions (types, defines, etcs) common to Kbase. They are placed here
+ * to allow the hierarchy of header files to work.
  */
 
 #ifndef _KBASE_DEFS_H_
@@ -40,7 +35,11 @@
 #include <mali_kbase_instr_defs.h>
 #include <mali_kbase_pm.h>
 #include <mali_kbase_gpuprops_types.h>
+#if MALI_USE_CSF
+#include <mali_kbase_hwcnt_backend_csf.h>
+#else
 #include <mali_kbase_hwcnt_backend_jm.h>
+#endif
 #include <protected_mode_switcher.h>
 
 #include <linux/atomic.h>
@@ -49,9 +48,6 @@
 #include <linux/file.h>
 #include <linux/sizes.h>
 
-#ifdef CONFIG_MALI_BUSLOG
-#include <linux/bus_logger.h>
-#endif
 
 #if defined(CONFIG_SYNC)
 #include <sync.h>
@@ -75,8 +71,7 @@
 #include <linux/regulator/consumer.h>
 #include <linux/memory_group_manager.h>
 
-#if defined(CONFIG_PM_RUNTIME) || \
-	(defined(CONFIG_PM) && LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0))
+#if defined(CONFIG_PM_RUNTIME) || defined(CONFIG_PM)
 #define KBASE_PM_RUNTIME 1
 #endif
 
@@ -123,6 +118,11 @@
  */
 #define KBASE_LOCK_REGION_MIN_SIZE_LOG2 (15)
 
+/**
+ * Maximum number of GPU memory region zones
+ */
+#define KBASE_REG_ZONE_MAX 4ul
+
 #include "mali_kbase_hwaccess_defs.h"
 
 /* Maximum number of pages of memory that require a permanent mapping, per
@@ -138,24 +138,28 @@
  */
 #define KBASE_HWCNT_GPU_VIRTUALIZER_DUMP_THRESHOLD_NS (200 * NSEC_PER_USEC)
 
+#if MALI_USE_CSF
+/* The buffer count of CSF hwcnt backend ring buffer, which is used when CSF
+ * hwcnt backend allocate the ring buffer to communicate with CSF firmware for
+ * HWC dump samples.
+ * To meet the hardware requirement, this number MUST be power of 2, otherwise,
+ * CSF hwcnt backend creation will be failed.
+ */
+#define KBASE_HWCNT_BACKEND_CSF_RING_BUFFER_COUNT (128)
+#endif
+
 /* Maximum number of clock/regulator pairs that may be referenced by
  * the device node.
  * This is dependent on support for of_property_read_u64_array() in the
  * kernel.
  */
-#if (KERNEL_VERSION(4, 0, 0) <= LINUX_VERSION_CODE) || \
-			defined(LSK_OPPV2_BACKPORT)
 #define BASE_MAX_NR_CLOCKS_REGULATORS (2)
-#else
-#define BASE_MAX_NR_CLOCKS_REGULATORS (1)
-#endif
 
 /* Forward declarations */
 struct kbase_context;
 struct kbase_device;
 struct kbase_as;
 struct kbase_mmu_setup;
-struct kbase_ipa_model_vinstr_data;
 struct kbase_kinstr_jm;
 
 /**
@@ -179,11 +183,7 @@ struct kbase_io_access {
  * @buf: array of kbase_io_access
  */
 struct kbase_io_history {
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
 	bool enabled;
-#else
-	u32 enabled;
-#endif
 
 	spinlock_t lock;
 	size_t count;
@@ -305,7 +305,7 @@ struct kbasep_mem_device {
 struct kbase_clk_rate_listener;
 
 /**
- * kbase_clk_rate_listener_on_change_t() - Frequency change callback
+ * typedef kbase_clk_rate_listener_on_change_t() - Frequency change callback
  *
  * @listener:     Clock frequency change listener.
  * @clk_index:    Index of the clock for which the change has occurred.
@@ -355,74 +355,62 @@ struct kbase_clk_rate_trace_manager {
 };
 
 /**
- * Data stored per device for power management.
- *
- * This structure contains data for the power management framework. There is one
- * instance of this structure per device in the system.
+ * struct kbase_pm_device_data - Data stored per device for power management.
+ * @lock: The lock protecting Power Management structures accessed outside of
+ * IRQ.
+ * This lock must also be held whenever the GPU is being powered on or
+ * off.
+ * @active_count: The reference count of active contexts on this device. Note
+ * 	that some code paths keep shaders/the tiler powered whilst this is 0.
+ * 	Use kbase_pm_is_active() instead to check for such cases.
+ * @suspending: Flag indicating suspending/suspended
+ * @gpu_lost: Flag indicating gpu lost
+ * 	This structure contains data for the power management framework. There
+ * 	is one instance of this structure per device in the system.
+ * @zero_active_count_wait: Wait queue set when active_count == 0
+ * @resume_wait: system resume of GPU device.
+ * @debug_core_mask: Bit masks identifying the available shader cores that are
+ * 	specified via sysfs. One mask per job slot.
+ * @debug_core_mask_all: Bit masks identifying the available shader cores that
+ * 	are specified via sysfs.
+ * @callback_power_runtime_init: Callback for initializing the runtime power
+ * 	management. Return 0 on success, else error code
+ * @callback_power_runtime_term: Callback for terminating the runtime power
+ * 	management.
+ * @dvfs_period: Time in milliseconds between each dvfs sample
+ * @backend: KBase PM backend data
+ * @arb_vm_state: The state of the arbiter VM machine
+ * @gpu_users_waiting: Used by virtualization to notify the arbiter that there
+ * 	are users waiting for the GPU so that it can request and resume the
+ * 	driver.
+ * @clk_rtm: The state of the GPU clock rate trace manager
  */
 struct kbase_pm_device_data {
-	/**
-	 * The lock protecting Power Management structures accessed outside of
-	 * IRQ.
-	 *
-	 * This lock must also be held whenever the GPU is being powered on or
-	 * off.
-	 */
 	struct mutex lock;
-
-	/**
-	 * The reference count of active contexts on this device. Note that
-	 * some code paths keep shaders/the tiler powered whilst this is 0. Use
-	 * kbase_pm_is_active() instead to check for such cases.
-	 */
 	int active_count;
-	/** Flag indicating suspending/suspended */
 	bool suspending;
 #ifdef CONFIG_MALI_ARBITER_SUPPORT
-	/* Flag indicating gpu lost */
 	atomic_t gpu_lost;
 #endif /* CONFIG_MALI_ARBITER_SUPPORT */
-	/* Wait queue set when active_count == 0 */
 	wait_queue_head_t zero_active_count_wait;
+	wait_queue_head_t resume_wait;
 
-	/**
-	 * Bit masks identifying the available shader cores that are specified
-	 * via sysfs. One mask per job slot.
-	 */
+#if MALI_USE_CSF
+	u64 debug_core_mask;
+#else
+	/* One mask per job slot. */
 	u64 debug_core_mask[BASE_JM_MAX_NR_SLOTS];
 	u64 debug_core_mask_all;
+#endif /* MALI_USE_CSF */
 
-	/**
-	 * Callback for initializing the runtime power management.
-	 *
-	 * @param kbdev The kbase device
-	 *
-	 * @return 0 on success, else error code
-	 */
-	 int (*callback_power_runtime_init)(struct kbase_device *kbdev);
-
-	/**
-	 * Callback for terminating the runtime power management.
-	 *
-	 * @param kbdev The kbase device
-	 */
+	int (*callback_power_runtime_init)(struct kbase_device *kbdev);
 	void (*callback_power_runtime_term)(struct kbase_device *kbdev);
-
-	/* Time in milliseconds between each dvfs sample */
 	u32 dvfs_period;
-
 	struct kbase_pm_backend_data backend;
-
 #ifdef CONFIG_MALI_ARBITER_SUPPORT
-	/**
-	 * The state of the arbiter VM machine
-	 */
 	struct kbase_arbiter_vm_state *arb_vm_state;
+	atomic_t gpu_users_waiting;
 #endif /* CONFIG_MALI_ARBITER_SUPPORT */
-
-	/**
-	 * The state of the GPU clock rate trace manager
-	 */
 	struct kbase_clk_rate_trace_manager clk_rtm;
 };
 
@@ -563,7 +551,6 @@ struct kbase_mmu_mode {
 	unsigned long flags;
 };
 
-struct kbase_mmu_mode const *kbase_mmu_mode_get_lpae(void);
 struct kbase_mmu_mode const *kbase_mmu_mode_get_aarch64(void);
 
 #define DEVNAME_SIZE	16
@@ -633,8 +620,8 @@ struct kbase_process {
  *                         issues present in the GPU.
  * @hw_quirks_mmu:         Configuration to be used for the MMU as per the HW
  *                         issues present in the GPU.
- * @hw_quirks_jm:          Configuration to be used for the Job Manager as per
- *                         the HW issues present in the GPU.
+ * @hw_quirks_gpu:         Configuration to be used for the Job Manager or CSF/MCU
+ *                         subsystems as per the HW issues present in the GPU.
  * @entry:                 Links the device instance to the global list of GPU
  *                         devices. The list would have as many entries as there
  *                         are GPU device instances.
@@ -651,6 +638,8 @@ struct kbase_process {
  * @irqs:                  Array containing IRQ resource info for 3 types of
  *                         interrupts : Job scheduling, MMU & GPU events (like
  *                         power management, cache etc.)
+ * @irqs.irq:              irq number
+ * @irqs.flags:            irq flags
  * @clocks:                Pointer to the input clock resources referenced by
  *                         the GPU device node.
  * @nr_clocks:             Number of clocks set in the clocks array.
@@ -684,6 +673,7 @@ struct kbase_process {
  *                         accesses made by the driver.
  * @pm:                    Per device object for storing data for power management
  *                         framework.
+ * @csf:                   CSF object for the GPU device.
  * @js_data:               Per device object encapsulating the current context of
  *                         Job Scheduler, which is global to the device and is not
  *                         tied to any particular struct kbase_context running on
@@ -711,11 +701,21 @@ struct kbase_process {
  * @disjoint_event:        struct for keeping track of the disjoint information,
  *                         that whether the GPU is in a disjoint state and the
  *                         number of disjoint events that have occurred on GPU.
+ * @disjoint_event.count:  disjoint event count
+ * @disjoint_event.state:  disjoint event state
  * @nr_hw_address_spaces:  Number of address spaces actually available in the
  *                         GPU, remains constant after driver initialisation.
  * @nr_user_address_spaces: Number of address spaces available to user contexts
+ * @hwcnt_backend_csf_if_fw: Firmware interface to access CSF GPU performance
+ *                         counters.
  * @hwcnt:                  Structure used for instrumentation and HW counters
  *                         dumping
+ * @hwcnt.lock:            The lock should be used when accessing any of the
+ *                         following members
+ * @hwcnt.kctx:            kbase context
+ * @hwcnt.addr:            HW counter address
+ * @hwcnt.addr_bytes:      HW counter size in bytes
+ * @hwcnt.backend:         Kbase instrumentation backend
  * @hwcnt_gpu_iface:       Backend interface for GPU hardware counter access.
  * @hwcnt_gpu_ctx:         Context for GPU hardware counter access.
  *                         @hwaccess_lock must be held when calling
@@ -726,6 +726,7 @@ struct kbase_process {
  *                         are enabled. If zero, there is no timeline client and
  *                         therefore timeline is disabled.
  * @timeline:              Timeline context created per device.
+ * @ktrace:                kbase device's ktrace
  * @trace_lock:            Lock to serialize the access to trace buffer.
  * @trace_first_out:       Index/offset in the trace buffer at which the first
  *                         unread message is present.
@@ -751,6 +752,8 @@ struct kbase_process {
  *                         including any contexts that might be created for
  *                         hardware counters.
  * @kctx_list_lock:        Lock protecting concurrent accesses to @kctx_list.
+ * @group_max_uid_in_devices: Max value of any queue group UID in any kernel
+ *                            context in the kbase device.
  * @devfreq_profile:       Describes devfreq profile for the Mali GPU device, passed
  *                         to devfreq_add_device() to add devfreq feature to Mali
  *                         GPU device.
@@ -779,6 +782,7 @@ struct kbase_process {
  *                         table in devicetree.
  * @num_opps:              Number of operating performance points available for the Mali
  *                         GPU device.
+ * @last_devfreq_metrics:  last PM metrics
  * @devfreq_queue:         Per device object for storing data that manages devfreq
  *                         suspend & resume request queue and the related items.
  * @devfreq_cooling:       Pointer returned on registering devfreq cooling device
@@ -789,6 +793,17 @@ struct kbase_process {
  *                         previously entered protected mode.
  * @ipa:                   Top level structure for IPA, containing pointers to both
  *                         configured & fallback models.
+ * @ipa.lock:              Access to this struct must be with ipa.lock held
+ * @ipa.configured_model:  ipa model to use
+ * @ipa.fallback_model:    ipa fallback model
+ * @ipa.last_metrics:      Values of the PM utilization metrics from last time
+ *                         the power model was invoked. The utilization is
+ *                         calculated as the difference between last_metrics
+ *                         and the current values.
+ * @ipa.force_fallback_model: true if use of fallback model has been forced by
+ *                            the User
+ * @ipa.last_sample_time:  Records the time when counters, used for dynamic
+ *                         energy estimation, were last sampled.
  * @previous_frequency:    Previous frequency of GPU clock used for
  *                         BASE_HW_ISSUE_GPU2017_1336 workaround, This clock is
  *                         restored when L2 is powered on.
@@ -797,6 +812,7 @@ struct kbase_process {
  * @mali_debugfs_directory: Root directory for the debugfs files created by the driver
  * @debugfs_ctx_directory: Directory inside the @mali_debugfs_directory containing
  *                         a sub-directory for every context.
+ * @debugfs_instr_directory: Instrumentation debugfs directory
  * @debugfs_as_read_bitmap: bitmap of address spaces for which the bus or page fault
  *                         has occurred.
  * @job_fault_wq:          Waitqueue to block the job fault dumping daemon till the
@@ -813,6 +829,8 @@ struct kbase_process {
  * @job_fault_event_lock:  Lock to protect concurrent accesses to @job_fault_event_list
  * @regs_dump_debugfs_data: Contains the offset of register to be read through debugfs
  *                         file "read_register".
+ * @regs_dump_debugfs_data.reg_offset: Contains the offset of register to be
+ *                         read through debugfs file "read_register".
  * @ctx_num:               Total number of contexts created for the device.
  * @io_history:            Pointer to an object keeping a track of all recent
  *                         register accesses. The history of register accesses
@@ -871,6 +889,8 @@ struct kbase_process {
  *                          Job Scheduler
  * @l2_size_override:       Used to set L2 cache size via device tree blob
  * @l2_hash_override:       Used to set L2 cache hash via device tree blob
+ * @l2_hash_values_override: true if @l2_hash_values is valid.
+ * @l2_hash_values:         Used to set L2 asn_hash via device tree blob
  * @process_root:           rb_tree root node for maintaining a rb_tree of
  *                          kbase_process based on key tgid(thread group ID).
  * @dma_buf_root:           rb_tree root node for maintaining a rb_tree of
@@ -885,12 +905,20 @@ struct kbase_process {
  * @gpu_mem_usage_lock:     This spinlock should be held while accounting
  *                          @total_gpu_pages for both native and dma-buf imported
  *                          allocations.
+ * @dummy_job_wa:           struct for dummy job execution workaround for the
+ *                          GPU hang issue
+ * @dummy_job_wa.ctx:       dummy job workaround context
+ * @dummy_job_wa.jc:        dummy job workaround job
+ * @dummy_job_wa.slot:      dummy job workaround slot
+ * @dummy_job_wa.flags:     dummy job workaround flags
+ * @arb:                    Pointer to the arbiter device
+ * @pcm_dev:                The priority control manager device.
  */
 struct kbase_device {
 	u32 hw_quirks_sc;
 	u32 hw_quirks_tiler;
 	u32 hw_quirks_mmu;
-	u32 hw_quirks_jm;
+	u32 hw_quirks_gpu;
 
 	struct list_head entry;
 	struct device *dev;
@@ -953,8 +981,10 @@ struct kbase_device {
 	s8 nr_hw_address_spaces;
 	s8 nr_user_address_spaces;
 
+#if MALI_USE_CSF
+	struct kbase_hwcnt_backend_csf_if hwcnt_backend_csf_if_fw;
+#else
 	struct kbase_hwcnt {
-		/* The lock should be used when accessing any of the following members */
 		spinlock_t lock;
 
 		struct kbase_context *kctx;
@@ -963,6 +993,7 @@ struct kbase_device {
 
 		struct kbase_instr_backend backend;
 	} hwcnt;
+#endif
 
 	struct kbase_hwcnt_backend_interface hwcnt_gpu_iface;
 	struct kbase_hwcnt_context *hwcnt_gpu_ctx;
@@ -985,6 +1016,7 @@ struct kbase_device {
 
 	struct list_head        kctx_list;
 	struct mutex            kctx_list_lock;
+	atomic_t                group_max_uid_in_devices;
 
 #ifdef CONFIG_MALI_BIFROST_DEVFREQ
 	struct devfreq_dev_profile devfreq_profile;
@@ -998,16 +1030,10 @@ struct kbase_device {
 	struct kbasep_pm_metrics last_devfreq_metrics;
 	struct monitor_dev_info *mdev_info;
 	struct ipa_power_model_data *model_data;
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
 	struct kbase_devfreq_queue_info devfreq_queue;
-#endif
 
 #ifdef CONFIG_DEVFREQ_THERMAL
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 0)
-	struct devfreq_cooling_device *devfreq_cooling;
-#else
 	struct thermal_cooling_device *devfreq_cooling;
-#endif
 	bool ipa_protection_mode_switched;
 	struct {
 		/* Access to this struct must be with ipa.lock held */
@@ -1020,11 +1046,13 @@ struct kbase_device {
 		 * the difference between last_metrics and the current values.
 		 */
 		struct kbasep_pm_metrics last_metrics;
-		/* Model data to pass to ipa_gpu_active/idle() */
-		struct kbase_ipa_model_vinstr_data *model_data;
 
 		/* true if use of fallback model has been forced by the User */
 		bool force_fallback_model;
+		/* Records the time when counters, used for dynamic energy
+		 * estimation, were last sampled.
+		 */
+		ktime_t last_sample_time;
 	} ipa;
 #endif /* CONFIG_DEVFREQ_THERMAL */
 #endif /* CONFIG_MALI_BIFROST_DEVFREQ */
@@ -1049,7 +1077,7 @@ struct kbase_device {
 
 #if !MALI_CUSTOMER_RELEASE
 	struct {
-		u16 reg_offset;
+		u32 reg_offset;
 	} regs_dump_debugfs_data;
 #endif /* !MALI_CUSTOMER_RELEASE */
 #endif /* CONFIG_DEBUG_FS */
@@ -1066,8 +1094,7 @@ struct kbase_device {
 
 	bool poweroff_pending;
 
-
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
+#if (KERNEL_VERSION(4, 4, 0) <= LINUX_VERSION_CODE)
 	bool infinite_cache_active_default;
 #else
 	u32 infinite_cache_active_default;
@@ -1096,9 +1123,6 @@ struct kbase_device {
 
 	struct work_struct protected_mode_hwcnt_disable_work;
 
-#ifdef CONFIG_MALI_BUSLOG
-	struct bus_logger_client *buslogger;
-#endif
 
 	bool irq_reset_flush;
 
@@ -1110,9 +1134,11 @@ struct kbase_device {
 
 	u8 l2_size_override;
 	u8 l2_hash_override;
+	bool l2_hash_values_override;
+	u32 l2_hash_values[ASN_HASH_COUNT];
 
 #if MALI_USE_CSF
-	/* Command-stream front-end for the device. */
+	/* CSF object for the GPU device. */
 	struct kbase_csf_device csf;
 #else
 	struct kbasep_js_device_data js_data;
@@ -1144,9 +1170,10 @@ struct kbase_device {
 	} dummy_job_wa;
 
 #ifdef CONFIG_MALI_ARBITER_SUPPORT
-		/* Pointer to the arbiter device */
 		struct kbase_arbiter_device arb;
 #endif
+	/* Priority Control Manager device */
+	struct priority_control_manager_device *pcm_dev;
 };
 
 /**
@@ -1198,7 +1225,7 @@ struct kbase_file {
 	unsigned long         api_version;
 	atomic_t              setup_state;
 };
-
+#if MALI_JIT_PRESSURE_LIMIT_BASE
 /**
  * enum kbase_context_flags - Flags for kbase contexts
  *
@@ -1258,6 +1285,9 @@ struct kbase_file {
  * refcount for the context drops to 0 or on when the address spaces are
  * re-enabled on GPU reset or power cycle.
  *
+ * @KCTX_JPL_ENABLED: Set when JIT physical page limit is less than JIT virtual
+ * address page limit, so we must take care to not exceed the physical limit
+ *
  * All members need to be separate bits. This enum is intended for use in a
  * bitmask where multiple values get OR-ed together.
  */
@@ -1278,14 +1308,90 @@ enum kbase_context_flags {
 	KCTX_PULLED_SINCE_ACTIVE_JS1 = 1U << 13,
 	KCTX_PULLED_SINCE_ACTIVE_JS2 = 1U << 14,
 	KCTX_AS_DISABLED_ON_FAULT = 1U << 15,
-#if MALI_JIT_PRESSURE_LIMIT_BASE
-	/*
-	 * Set when JIT physical page limit is less than JIT virtual address
-	 * page limit, so we must take care to not exceed the physical limit
-	 */
 	KCTX_JPL_ENABLED = 1U << 16,
-#endif /* !MALI_JIT_PRESSURE_LIMIT_BASE */
 };
+#else
+/**
+ * enum kbase_context_flags - Flags for kbase contexts
+ *
+ * @KCTX_COMPAT: Set when the context process is a compat process, 32-bit
+ * process on a 64-bit kernel.
+ *
+ * @KCTX_RUNNABLE_REF: Set when context is counted in
+ * kbdev->js_data.nr_contexts_runnable. Must hold queue_mutex when accessing.
+ *
+ * @KCTX_ACTIVE: Set when the context is active.
+ *
+ * @KCTX_PULLED: Set when last kick() caused atoms to be pulled from this
+ * context.
+ *
+ * @KCTX_MEM_PROFILE_INITIALIZED: Set when the context's memory profile has been
+ * initialized.
+ *
+ * @KCTX_INFINITE_CACHE: Set when infinite cache is to be enabled for new
+ * allocations. Existing allocations will not change.
+ *
+ * @KCTX_SUBMIT_DISABLED: Set to prevent context from submitting any jobs.
+ *
+ * @KCTX_PRIVILEGED:Set if the context uses an address space and should be kept
+ * scheduled in.
+ *
+ * @KCTX_SCHEDULED: Set when the context is scheduled on the Run Pool.
+ * This is only ever updated whilst the jsctx_mutex is held.
+ *
+ * @KCTX_DYING: Set when the context process is in the process of being evicted.
+ *
+ * @KCTX_NO_IMPLICIT_SYNC: Set when explicit Android fences are in use on this
+ * context, to disable use of implicit dma-buf fences. This is used to avoid
+ * potential synchronization deadlocks.
+ *
+ * @KCTX_FORCE_SAME_VA: Set when BASE_MEM_SAME_VA should be forced on memory
+ * allocations. For 64-bit clients it is enabled by default, and disabled by
+ * default on 32-bit clients. Being able to clear this flag is only used for
+ * testing purposes of the custom zone allocation on 64-bit user-space builds,
+ * where we also require more control than is available through e.g. the JIT
+ * allocation mechanism. However, the 64-bit user-space client must still
+ * reserve a JIT region using KBASE_IOCTL_MEM_JIT_INIT
+ *
+ * @KCTX_PULLED_SINCE_ACTIVE_JS0: Set when the context has had an atom pulled
+ * from it for job slot 0. This is reset when the context first goes active or
+ * is re-activated on that slot.
+ *
+ * @KCTX_PULLED_SINCE_ACTIVE_JS1: Set when the context has had an atom pulled
+ * from it for job slot 1. This is reset when the context first goes active or
+ * is re-activated on that slot.
+ *
+ * @KCTX_PULLED_SINCE_ACTIVE_JS2: Set when the context has had an atom pulled
+ * from it for job slot 2. This is reset when the context first goes active or
+ * is re-activated on that slot.
+ *
+ * @KCTX_AS_DISABLED_ON_FAULT: Set when the GPU address space is disabled for
+ * the context due to unhandled page(or bus) fault. It is cleared when the
+ * refcount for the context drops to 0 or on when the address spaces are
+ * re-enabled on GPU reset or power cycle.
+ *
+ * All members need to be separate bits. This enum is intended for use in a
+ * bitmask where multiple values get OR-ed together.
+ */
+enum kbase_context_flags {
+	KCTX_COMPAT = 1U << 0,
+	KCTX_RUNNABLE_REF = 1U << 1,
+	KCTX_ACTIVE = 1U << 2,
+	KCTX_PULLED = 1U << 3,
+	KCTX_MEM_PROFILE_INITIALIZED = 1U << 4,
+	KCTX_INFINITE_CACHE = 1U << 5,
+	KCTX_SUBMIT_DISABLED = 1U << 6,
+	KCTX_PRIVILEGED = 1U << 7,
+	KCTX_SCHEDULED = 1U << 8,
+	KCTX_DYING = 1U << 9,
+	KCTX_NO_IMPLICIT_SYNC = 1U << 10,
+	KCTX_FORCE_SAME_VA = 1U << 11,
+	KCTX_PULLED_SINCE_ACTIVE_JS0 = 1U << 12,
+	KCTX_PULLED_SINCE_ACTIVE_JS1 = 1U << 13,
+	KCTX_PULLED_SINCE_ACTIVE_JS2 = 1U << 14,
+	KCTX_AS_DISABLED_ON_FAULT = 1U << 15,
+};
+#endif /* MALI_JIT_PRESSURE_LIMIT_BASE */
 
 struct kbase_sub_alloc {
 	struct list_head link;
@@ -1293,6 +1399,21 @@ struct kbase_sub_alloc {
 	DECLARE_BITMAP(sub_pages, SZ_2M / SZ_4K);
 };
 
+/**
+ * struct kbase_reg_zone - Information about GPU memory region zones
+ * @base_pfn: Page Frame Number in GPU virtual address space for the start of
+ *            the Zone
+ * @va_size_pages: Size of the Zone in pages
+ *
+ * Track information about a zone KBASE_REG_ZONE() and related macros.
+ * In future, this could also store the &rb_root that are currently in
+ * &kbase_context
+ */
+struct kbase_reg_zone {
+	u64 base_pfn;
+	u64 va_size_pages;
+};
+
 /**
  * struct kbase_context - Kernel base context
  *
@@ -1343,6 +1464,7 @@ struct kbase_sub_alloc {
  * @reg_rbtree_exec:      RB tree of the memory regions allocated from the EXEC_VA
  *                        zone of the GPU virtual address space. Used for GPU-executable
  *                        allocations which don't need the SAME_VA property.
+ * @reg_zone:             Zone information for the reg_rbtree_<...> members.
  * @cookies:              Bitmask containing of BITS_PER_LONG bits, used mainly for
  *                        SAME_VA allocations to defer the reservation of memory region
  *                        (from the GPU virtual address space) from base_mem_alloc
@@ -1367,6 +1489,7 @@ struct kbase_sub_alloc {
  *                        which actually created the context. This is usually,
  *                        but not necessarily, the same as the thread which
  *                        opened the device file /dev/malixx instance.
+ * @csf:                  kbase csf context
  * @jctx:                 object encapsulating all the Job dispatcher related state,
  *                        including the array of atoms.
  * @used_pages:           Keeps a track of the number of 4KB physical pages in use
@@ -1393,6 +1516,8 @@ struct kbase_sub_alloc {
  *                        waiting atoms and the waitqueue to process the work item
  *                        queued for the atoms blocked on the signaling of dma-buf
  *                        fences.
+ * @dma_fence.waiting_resource: list head for the list of dma-buf fence
+ * @dma_fence.wq:         waitqueue to process the work item queued
  * @as_nr:                id of the address space being used for the scheduled in
  *                        context. This is effectively part of the Run Pool, because
  *                        it only has a valid setting (!=KBASEP_AS_NR_INVALID) whilst
@@ -1418,9 +1543,6 @@ struct kbase_sub_alloc {
  *                        created the context. Used for accounting the physical
  *                        pages used for GPU allocations, done for the context,
  *                        to the memory consumed by the process.
- * @same_va_end:          End address of the SAME_VA zone (in 4KB page units)
- * @exec_va_start:        Start address of the EXEC_VA zone (in 4KB page units)
- *                        or U64_MAX if the EXEC_VA zone is uninitialized.
  * @gpu_va_end:           End address of the GPU va space (in 4KB page units)
  * @jit_va:               Indicates if a JIT_VA zone has been created.
  * @mem_profile_data:     Buffer containing the profiling information provided by
@@ -1547,6 +1669,10 @@ struct kbase_sub_alloc {
  * @atoms_count:          Number of GPU atoms currently in use, per priority
  * @create_flags:         Flags used in context creation.
  * @kinstr_jm:            Kernel job manager instrumentation context handle
+ * @tl_kctx_list_node:    List item into the device timeline's list of
+ *                        contexts, for timeline summarization.
+ * @limited_core_mask:    The mask that is applied to the affinity in case of atoms
+ *                        marked with BASE_JD_REQ_LIMITED_CORE_MASK.
  *
  * A kernel base context is an entity among which the GPU is scheduled.
  * Each context has its own GPU address space.
@@ -1584,6 +1710,7 @@ struct kbase_context {
 	struct rb_root reg_rbtree_same;
 	struct rb_root reg_rbtree_custom;
 	struct rb_root reg_rbtree_exec;
+	struct kbase_reg_zone reg_zone[KBASE_REG_ZONE_MAX];
 
 #if MALI_USE_CSF
 	struct kbase_csf_context csf;
@@ -1637,8 +1764,6 @@ struct kbase_context {
 
 	spinlock_t         mm_update_lock;
 	struct mm_struct __rcu *process_mm;
-	u64 same_va_end;
-	u64 exec_va_start;
 	u64 gpu_va_end;
 	bool jit_va;
 
@@ -1693,6 +1818,9 @@ struct kbase_context {
 #if !MALI_USE_CSF
 	struct kbase_kinstr_jm *kinstr_jm;
 #endif
+	struct list_head tl_kctx_list_node;
+
+	u64 limited_core_mask;
 };
 
 #ifdef CONFIG_MALI_CINSTR_GWT
@@ -1779,29 +1907,4 @@ static inline bool kbase_device_is_cpu_coherent(struct kbase_device *kbdev)
 /* Maximum number of loops polling the GPU for an AS command to complete before we assume the GPU has hung */
 #define KBASE_AS_INACTIVE_MAX_LOOPS     100000000
 
-/* JobDescriptorHeader - taken from the architecture specifications, the layout
- * is currently identical for all GPU archs. */
-struct job_descriptor_header {
-	u32 exception_status;
-	u32 first_incomplete_task;
-	u64 fault_pointer;
-	u8 job_descriptor_size : 1;
-	u8 job_type : 7;
-	u8 job_barrier : 1;
-	u8 _reserved_01 : 1;
-	u8 _reserved_1 : 1;
-	u8 _reserved_02 : 1;
-	u8 _reserved_03 : 1;
-	u8 _reserved_2 : 1;
-	u8 _reserved_04 : 1;
-	u8 _reserved_05 : 1;
-	u16 job_index;
-	u16 job_dependency_index_1;
-	u16 job_dependency_index_2;
-	union {
-		u64 _64;
-		u32 _32;
-	} next_job;
-};
-
 #endif				/* _KBASE_DEFS_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_disjoint_events.c b/drivers/gpu/arm/bifrost/mali_kbase_disjoint_events.c
index b5ac414b1223..0b73f558ba06 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_disjoint_events.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_disjoint_events.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2014, 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_dma_fence.c b/drivers/gpu/arm/bifrost/mali_kbase_dma_fence.c
index 1fac5e3e68f1..3bf80ea9601a 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_dma_fence.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_dma_fence.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2011-2016, 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /* Include mali_kbase_dma_fence.h before checking for CONFIG_MALI_BIFROST_DMA_FENCE as
@@ -56,7 +55,7 @@ static int
 kbase_dma_fence_lock_reservations(struct kbase_dma_fence_resv_info *info,
 				  struct ww_acquire_ctx *ctx)
 {
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0))
+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
 	struct reservation_object *content_res = NULL;
 #else
 	struct dma_resv *content_res = NULL;
@@ -206,7 +205,7 @@ kbase_dma_fence_work(struct work_struct *pwork)
 }
 
 static void
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 kbase_dma_fence_cb(struct fence *fence, struct fence_cb *cb)
 #else
 kbase_dma_fence_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
@@ -226,7 +225,7 @@ kbase_dma_fence_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
 		kbase_dma_fence_queue_work(katom);
 }
 
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0))
+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
 static int
 kbase_dma_fence_add_reservation_callback(struct kbase_jd_atom *katom,
 					 struct reservation_object *resv,
@@ -238,7 +237,7 @@ kbase_dma_fence_add_reservation_callback(struct kbase_jd_atom *katom,
 					 bool exclusive)
 #endif
 {
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 	struct fence *excl_fence = NULL;
 	struct fence **shared_fences = NULL;
 #else
@@ -302,7 +301,7 @@ kbase_dma_fence_add_reservation_callback(struct kbase_jd_atom *katom,
 	return err;
 }
 
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0))
+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
 void kbase_dma_fence_add_reservation(struct reservation_object *resv,
 				     struct kbase_dma_fence_resv_info *info,
 				     bool exclusive)
@@ -331,7 +330,7 @@ int kbase_dma_fence_wait(struct kbase_jd_atom *katom,
 			 struct kbase_dma_fence_resv_info *info)
 {
 	int err, i;
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 	struct fence *fence;
 #else
 	struct dma_fence *fence;
@@ -360,7 +359,7 @@ int kbase_dma_fence_wait(struct kbase_jd_atom *katom,
 	}
 
 	for (i = 0; i < info->dma_fence_resv_count; i++) {
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0))
+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
 		struct reservation_object *obj = info->resv_objs[i];
 #else
 		struct dma_resv *obj = info->resv_objs[i];
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_dma_fence.h b/drivers/gpu/arm/bifrost/mali_kbase_dma_fence.h
index 3ac8186328a1..bedc8c0c5907 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_dma_fence.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_dma_fence.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2010-2016, 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_DMA_FENCE_H_
@@ -44,7 +43,7 @@ struct kbase_context;
  * reservation objects.
  */
 struct kbase_dma_fence_resv_info {
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0))
+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
 	struct reservation_object **resv_objs;
 #else
 	struct dma_resv **resv_objs;
@@ -63,7 +62,7 @@ struct kbase_dma_fence_resv_info {
  * reservation_objects. At the same time keeps track of which objects require
  * exclusive access in dma_fence_excl_bitmap.
  */
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0))
+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
 void kbase_dma_fence_add_reservation(struct reservation_object *resv,
 				     struct kbase_dma_fence_resv_info *info,
 				     bool exclusive);
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_dummy_job_wa.c b/drivers/gpu/arm/bifrost/mali_kbase_dummy_job_wa.c
index a5a7ad744a8e..e7a87812aafa 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_dummy_job_wa.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_dummy_job_wa.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_dummy_job_wa.h b/drivers/gpu/arm/bifrost/mali_kbase_dummy_job_wa.h
index e19495055b48..4f3c2275ed44 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_dummy_job_wa.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_dummy_job_wa.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_DUMMY_JOB_WORKAROUND_
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_dvfs_debugfs.c b/drivers/gpu/arm/bifrost/mali_kbase_dvfs_debugfs.c
new file mode 100644
index 000000000000..ce23ede7e512
--- /dev/null
+++ b/drivers/gpu/arm/bifrost/mali_kbase_dvfs_debugfs.c
@@ -0,0 +1,98 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ *
+ * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+#include "mali_kbase_dvfs_debugfs.h"
+#include <mali_kbase.h>
+#include <linux/seq_file.h>
+
+#ifdef CONFIG_DEBUG_FS
+
+/**
+ * kbasep_dvfs_utilization_debugfs_show() - Print the DVFS utilization info
+ *
+ * @file: The seq_file for printing to
+ * @data: The debugfs dentry private data, a pointer to kbase_context
+ *
+ * Return: Negative error code or 0 on success.
+ */
+static int kbasep_dvfs_utilization_debugfs_show(struct seq_file *file, void *data)
+{
+	struct kbase_device *kbdev = file->private;
+
+#if MALI_USE_CSF
+	seq_printf(file, "busy_time: %u idle_time: %u protm_time: %u\n",
+		   kbdev->pm.backend.metrics.values.time_busy,
+		   kbdev->pm.backend.metrics.values.time_idle,
+		   kbdev->pm.backend.metrics.values.time_in_protm);
+#else
+	seq_printf(file, "busy_time: %u idle_time: %u\n",
+		   kbdev->pm.backend.metrics.values.time_busy,
+		   kbdev->pm.backend.metrics.values.time_idle);
+#endif
+
+	return 0;
+}
+
+static int kbasep_dvfs_utilization_debugfs_open(struct inode *in,
+						struct file *file)
+{
+	return single_open(file, kbasep_dvfs_utilization_debugfs_show,
+			   in->i_private);
+}
+
+static const struct file_operations kbasep_dvfs_utilization_debugfs_fops = {
+	.open = kbasep_dvfs_utilization_debugfs_open,
+	.read = seq_read,
+	.llseek = seq_lseek,
+	.release = single_release,
+};
+
+void kbase_dvfs_status_debugfs_init(struct kbase_device *kbdev)
+{
+	struct dentry *file;
+#if (KERNEL_VERSION(4, 7, 0) <= LINUX_VERSION_CODE)
+	const mode_t mode = 0444;
+#else
+	const mode_t mode = 0400;
+#endif
+
+	if (WARN_ON(!kbdev || IS_ERR_OR_NULL(kbdev->mali_debugfs_directory)))
+		return;
+
+	file = debugfs_create_file("dvfs_utilization", mode,
+				   kbdev->mali_debugfs_directory, kbdev,
+				   &kbasep_dvfs_utilization_debugfs_fops);
+
+	if (IS_ERR_OR_NULL(file)) {
+		dev_warn(kbdev->dev,
+			 "Unable to create dvfs debugfs entry");
+	}
+}
+
+#else
+/*
+ * Stub functions for when debugfs is disabled
+ */
+void kbase_dvfs_status_debugfs_init(struct kbase_device *kbdev)
+{
+}
+
+#endif /* CONFIG_DEBUG_FS */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_dvfs_debugfs.h b/drivers/gpu/arm/bifrost/mali_kbase_dvfs_debugfs.h
new file mode 100644
index 000000000000..080331f8bdf5
--- /dev/null
+++ b/drivers/gpu/arm/bifrost/mali_kbase_dvfs_debugfs.h
@@ -0,0 +1,35 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ *
+ * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+#ifndef _KBASE_DVFS_DEBUGFS_H_
+#define _KBASE_DVFS_DEBUGFS_H_
+
+/* Forward declaration */
+struct kbase_device;
+
+/**
+ * kbase_dvfs_status_debugfs_init() - Create a debugfs entry for DVFS queries
+ *
+ * @kbdev: Pointer to the GPU device for which to create the debugfs entry
+ */
+void kbase_dvfs_status_debugfs_init(struct kbase_device *kbdev);
+
+#endif /* _KBASE_DVFS_DEBUGFS_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_event.c b/drivers/gpu/arm/bifrost/mali_kbase_event.c
index 5adb80f9bbd2..25a379d9f0e1 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_event.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_event.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2010-2016,2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2016,2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 #include <mali_kbase.h>
 #include <mali_kbase_debug.h>
 #include <tl/mali_kbase_tracepoints.h>
@@ -45,7 +42,7 @@ static struct base_jd_udata kbase_event_process(struct kbase_context *kctx, stru
 	KBASE_TLSTREAM_TL_DEL_ATOM(kbdev, katom);
 
 	katom->status = KBASE_JD_ATOM_STATE_UNUSED;
-	dev_dbg(kbdev->dev, "Atom %p status to unused\n", (void *)katom);
+	dev_dbg(kbdev->dev, "Atom %pK status to unused\n", (void *)katom);
 	wake_up(&katom->completed);
 
 	return data;
@@ -82,7 +79,7 @@ int kbase_event_dequeue(struct kbase_context *ctx, struct base_jd_event_v2 *ueve
 
 	mutex_unlock(&ctx->event_mutex);
 
-	dev_dbg(ctx->kbdev->dev, "event dequeuing %p\n", (void *)atom);
+	dev_dbg(ctx->kbdev->dev, "event dequeuing %pK\n", (void *)atom);
 	uevent->event_code = atom->event_code;
 
 	uevent->atom_number = (atom - ctx->jctx.atoms);
@@ -154,7 +151,8 @@ static int kbase_event_coalesce(struct kbase_context *kctx)
 	const int event_count = kctx->event_coalesce_count;
 
 	/* Join the list of pending events onto the tail of the main list
-	   and reset it */
+	 * and reset it
+	 */
 	list_splice_tail_init(&kctx->event_coalesce_list, &kctx->event_list);
 	kctx->event_coalesce_count = 0;
 
@@ -166,11 +164,11 @@ void kbase_event_post(struct kbase_context *ctx, struct kbase_jd_atom *atom)
 {
 	struct kbase_device *kbdev = ctx->kbdev;
 
-	dev_dbg(kbdev->dev, "Posting event for atom %p\n", (void *)atom);
+	dev_dbg(kbdev->dev, "Posting event for atom %pK\n", (void *)atom);
 
 	if (WARN_ON(atom->status != KBASE_JD_ATOM_STATE_COMPLETED)) {
 		dev_warn(kbdev->dev,
-				"%s: Atom %d (%p) not completed (status %d)\n",
+				"%s: Atom %d (%pK) not completed (status %d)\n",
 				__func__,
 				kbase_jd_atom_id(atom->kctx, atom),
 				atom->kctx,
@@ -237,7 +235,7 @@ int kbase_event_init(struct kbase_context *kctx)
 	kctx->event_coalesce_count = 0;
 	kctx->event_workq = alloc_workqueue("kbase_event", WQ_MEM_RECLAIM, 1);
 
-	if (NULL == kctx->event_workq)
+	if (kctx->event_workq == NULL)
 		return -EINVAL;
 
 	return 0;
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_fence.c b/drivers/gpu/arm/bifrost/mali_kbase_fence.c
index 5e04acf87892..d65b4ebf2535 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_fence.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_fence.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2011-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <linux/atomic.h>
@@ -29,7 +28,7 @@
 /* Spin lock protecting all Mali fences as fence->lock. */
 static DEFINE_SPINLOCK(kbase_fence_lock);
 
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 struct fence *
 kbase_fence_out_new(struct kbase_jd_atom *katom)
 #else
@@ -37,7 +36,7 @@ struct dma_fence *
 kbase_fence_out_new(struct kbase_jd_atom *katom)
 #endif
 {
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 	struct fence *fence;
 #else
 	struct dma_fence *fence;
@@ -98,7 +97,7 @@ kbase_fence_free_callbacks(struct kbase_jd_atom *katom)
 	return res;
 }
 
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 int
 kbase_fence_add_callback(struct kbase_jd_atom *katom,
 			 struct fence *fence,
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_fence.h b/drivers/gpu/arm/bifrost/mali_kbase_fence.h
index f319d9e1dce6..ff7dc8144a50 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_fence.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_fence.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2010-2018, 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_FENCE_H_
@@ -35,7 +34,7 @@
 #include "mali_kbase_fence_defs.h"
 #include "mali_kbase.h"
 
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 extern const struct fence_ops kbase_fence_ops;
 #else
 extern const struct dma_fence_ops kbase_fence_ops;
@@ -49,7 +48,7 @@ extern const struct dma_fence_ops kbase_fence_ops;
 * @node:     List head for linking this callback to the katom
 */
 struct kbase_fence_cb {
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 	struct fence_cb fence_cb;
 	struct fence *fence;
 #else
@@ -66,7 +65,7 @@ struct kbase_fence_cb {
  *
  * return: A new fence object on success, NULL on failure.
  */
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 struct fence *kbase_fence_out_new(struct kbase_jd_atom *katom);
 #else
 struct dma_fence *kbase_fence_out_new(struct kbase_jd_atom *katom);
@@ -169,7 +168,7 @@ static inline int kbase_fence_out_signal(struct kbase_jd_atom *katom,
  * Return: 0 on success: fence was either already signaled, or callback was
  * set up. Negative error code is returned on error.
  */
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 int kbase_fence_add_callback(struct kbase_jd_atom *katom,
 			     struct fence *fence,
 			     fence_func_t callback);
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_fence_defs.h b/drivers/gpu/arm/bifrost/mali_kbase_fence_defs.h
index 303029639d38..006512d461f9 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_fence_defs.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_fence_defs.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2010-2018, 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_FENCE_DEFS_H_
@@ -30,7 +29,7 @@
 
 #include <linux/version.h>
 
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 
 #include <linux/fence.h>
 
@@ -53,7 +52,7 @@
 
 #include <linux/dma-fence.h>
 
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0))
+#if (KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE)
 #define dma_fence_get_status(a) (dma_fence_is_signaled(a) ? \
 	(a)->status ?: 1 \
 	: 0)
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_fence_ops.c b/drivers/gpu/arm/bifrost/mali_kbase_fence_ops.c
index c4703748bec6..4712ef4f0606 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_fence_ops.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_fence_ops.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <linux/atomic.h>
@@ -26,7 +25,7 @@
 #include <mali_kbase.h>
 
 static const char *
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 kbase_fence_get_driver_name(struct fence *fence)
 #else
 kbase_fence_get_driver_name(struct dma_fence *fence)
@@ -36,7 +35,7 @@ kbase_fence_get_driver_name(struct dma_fence *fence)
 }
 
 static const char *
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 kbase_fence_get_timeline_name(struct fence *fence)
 #else
 kbase_fence_get_timeline_name(struct dma_fence *fence)
@@ -46,7 +45,7 @@ kbase_fence_get_timeline_name(struct dma_fence *fence)
 }
 
 static bool
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 kbase_fence_enable_signaling(struct fence *fence)
 #else
 kbase_fence_enable_signaling(struct dma_fence *fence)
@@ -56,7 +55,7 @@ kbase_fence_enable_signaling(struct dma_fence *fence)
 }
 
 static void
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 kbase_fence_fence_value_str(struct fence *fence, char *str, int size)
 #else
 kbase_fence_fence_value_str(struct dma_fence *fence, char *str, int size)
@@ -69,7 +68,7 @@ kbase_fence_fence_value_str(struct dma_fence *fence, char *str, int size)
 #endif
 }
 
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 const struct fence_ops kbase_fence_ops = {
 	.wait = fence_default_wait,
 #else
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_gator.h b/drivers/gpu/arm/bifrost/mali_kbase_gator.h
index 579c7b6ff3aa..180beda91252 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_gator.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_gator.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2011-2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /* NB taken from gator  */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_gpu_memory_debugfs.c b/drivers/gpu/arm/bifrost/mali_kbase_gpu_memory_debugfs.c
index 569abd920fde..a10b2bb8a416 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_gpu_memory_debugfs.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_gpu_memory_debugfs.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2012-2017, 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2017, 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,24 +17,23 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
 #include <device/mali_kbase_device.h>
 
 #ifdef CONFIG_DEBUG_FS
-/** Show callback for the @c gpu_memory debugfs file.
+/**
+ * kbasep_gpu_memory_seq_show - Show callback for the @c gpu_memory debugfs file
+ * @sfile: The debugfs entry
+ * @data: Data associated with the entry
  *
  * This function is called to get the contents of the @c gpu_memory debugfs
  * file. This is a report of current gpu memory usage.
  *
- * @param sfile The debugfs entry
- * @param data Data associated with the entry
- *
- * @return 0 if successfully prints data in debugfs entry file
- *         -1 if it encountered an error
+ * Return:
+ * * 0 if successfully prints data in debugfs entry file
+ * * -1 if it encountered an error
  */
 
 static int kbasep_gpu_memory_seq_show(struct seq_file *sfile, void *data)
@@ -54,8 +54,9 @@ static int kbasep_gpu_memory_seq_show(struct seq_file *sfile, void *data)
 		mutex_lock(&kbdev->kctx_list_lock);
 		list_for_each_entry(kctx, &kbdev->kctx_list, kctx_list_link) {
 			/* output the memory usage and cap for each kctx
-			* opened on this device */
-			seq_printf(sfile, "  %s-0x%p %10u\n",
+			* opened on this device
+			*/
+			seq_printf(sfile, "  %s-0x%pK %10u\n",
 				"kctx",
 				kctx,
 				atomic_read(&(kctx->used_pages)));
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_gpu_memory_debugfs.h b/drivers/gpu/arm/bifrost/mali_kbase_gpu_memory_debugfs.h
index a45dabbb680f..023703bf2e1e 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_gpu_memory_debugfs.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_gpu_memory_debugfs.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2012-2014, 2016, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2014, 2016, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,15 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /**
- * @file mali_kbase_gpu_memory_debugfs.h
- * Header file for gpu_memory entry in debugfs
+ * DOC: Header file for gpu_memory entry in debugfs
  *
  */
 
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_gpuprops.c b/drivers/gpu/arm/bifrost/mali_kbase_gpuprops.c
index 020b5d853608..229188b0db9a 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_gpuprops.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_gpuprops.c
@@ -1,12 +1,12 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2011-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -17,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /*
  * Base kernel property query APIs
  */
@@ -32,7 +28,7 @@
 #include <mali_kbase_gpuprops.h>
 #include <mali_kbase_hwaccess_gpuprops.h>
 #include <mali_kbase_config_defaults.h>
-#include "mali_kbase_ioctl.h"
+#include <uapi/gpu/arm/bifrost/mali_kbase_ioctl.h>
 #include <linux/clk.h>
 #include <mali_kbase_pm_internal.h>
 #include <linux/of_platform.h>
@@ -48,7 +44,7 @@ static void kbase_gpuprops_construct_coherent_groups(
 	u64 first_set, first_set_prev;
 	u32 num_groups = 0;
 
-	KBASE_DEBUG_ASSERT(NULL != props);
+	KBASE_DEBUG_ASSERT(props != NULL);
 
 	props->coherency_info.coherency = props->raw_props.mem_features;
 	props->coherency_info.num_core_groups = hweight64(props->raw_props.l2_present);
@@ -107,6 +103,71 @@ static void kbase_gpuprops_construct_coherent_groups(
 	props->coherency_info.num_groups = num_groups;
 }
 
+/**
+ * kbase_gpuprops_get_curr_config_props - Get the current allocated resources
+ * @kbdev:       The &struct kbase_device structure for the device
+ * @curr_config: The &struct curr_config_props structure to receive the result
+ *
+ * Fill the &struct curr_config_props structure with values from the GPU
+ * configuration registers.
+ *
+ * Return: Zero on success, Linux error code on failure
+ */
+int kbase_gpuprops_get_curr_config_props(struct kbase_device *kbdev,
+	struct curr_config_props * const curr_config)
+{
+	struct kbase_current_config_regdump curr_config_regdump;
+	int err;
+
+	if (WARN_ON(!kbdev) || WARN_ON(!curr_config))
+		return -EINVAL;
+
+	/* If update not needed just return. */
+	if (!curr_config->update_needed)
+		return 0;
+
+	/* Dump relevant registers */
+	err = kbase_backend_gpuprops_get_curr_config(kbdev,
+						     &curr_config_regdump);
+	if (err)
+		return err;
+
+	curr_config->l2_slices =
+		KBASE_UBFX32(curr_config_regdump.mem_features, 8U, 4) + 1;
+
+	curr_config->l2_present =
+		((u64) curr_config_regdump.l2_present_hi << 32) +
+		curr_config_regdump.l2_present_lo;
+
+	curr_config->shader_present =
+		((u64) curr_config_regdump.shader_present_hi << 32) +
+		curr_config_regdump.shader_present_lo;
+
+	curr_config->num_cores = hweight64(curr_config->shader_present);
+
+	curr_config->update_needed = false;
+
+	return 0;
+}
+
+/**
+ * kbase_gpuprops_req_curr_config_update - Request Current Config Update
+ * @kbdev: The &struct kbase_device structure for the device
+ *
+ * Requests the current configuration to be updated next time the
+ * kbase_gpuprops_get_curr_config_props() is called.
+ *
+ * Return: Zero on success, Linux error code on failure
+ */
+int kbase_gpuprops_req_curr_config_update(struct kbase_device *kbdev)
+{
+	if (WARN_ON(!kbdev))
+		return -EINVAL;
+
+	kbdev->gpu_props.curr_config.update_needed = true;
+	return 0;
+}
+
 /**
  * kbase_gpuprops_get_props - Get the GPU configuration
  * @gpu_props: The &struct base_gpu_props structure
@@ -124,8 +185,8 @@ static int kbase_gpuprops_get_props(struct base_gpu_props * const gpu_props,
 	int i;
 	int err;
 
-	KBASE_DEBUG_ASSERT(NULL != kbdev);
-	KBASE_DEBUG_ASSERT(NULL != gpu_props);
+	KBASE_DEBUG_ASSERT(kbdev != NULL);
+	KBASE_DEBUG_ASSERT(gpu_props != NULL);
 
 	/* Dump relevant registers */
 	err = kbase_backend_gpuprops_get(kbdev, &regdump);
@@ -166,6 +227,10 @@ static int kbase_gpuprops_get_props(struct base_gpu_props * const gpu_props,
 	gpu_props->raw_props.thread_features = regdump.thread_features;
 	gpu_props->raw_props.thread_tls_alloc = regdump.thread_tls_alloc;
 
+	gpu_props->raw_props.gpu_features =
+		((u64) regdump.gpu_features_hi << 32) +
+		regdump.gpu_features_lo;
+
 	return 0;
 }
 
@@ -182,6 +247,59 @@ void kbase_gpuprops_update_core_props_gpu_id(
 		KBASE_UBFX32(gpu_props->raw_props.gpu_id, 16U, 16);
 }
 
+/**
+ * kbase_gpuprops_update_max_config_props - Updates the max config properties in
+ * the base_gpu_props.
+ * @base_props: The &struct base_gpu_props structure
+ * @kbdev:      The &struct kbase_device structure for the device
+ *
+ * Updates the &struct base_gpu_props structure with the max config properties.
+ */
+static void kbase_gpuprops_update_max_config_props(
+	struct base_gpu_props * const base_props, struct kbase_device *kbdev)
+{
+	int l2_n = 0;
+
+	if (WARN_ON(!kbdev) || WARN_ON(!base_props))
+		return;
+
+	/* return if the max_config is not set during arbif initialization */
+	if (kbdev->gpu_props.max_config.core_mask == 0)
+		return;
+
+	/*
+	 * Set the base_props with the maximum config values to ensure that the
+	 * user space will always be based on the maximum resources available.
+	 */
+	base_props->l2_props.num_l2_slices =
+		kbdev->gpu_props.max_config.l2_slices;
+	base_props->raw_props.shader_present =
+		kbdev->gpu_props.max_config.core_mask;
+	/*
+	 * Update l2_present in the raw data to be consistent with the
+	 * max_config.l2_slices number.
+	 */
+	base_props->raw_props.l2_present = 0;
+	for (l2_n = 0; l2_n < base_props->l2_props.num_l2_slices; l2_n++) {
+		base_props->raw_props.l2_present <<= 1;
+		base_props->raw_props.l2_present |= 0x1;
+	}
+	/*
+	 * Update the coherency_info data using just one core group. For
+	 * architectures where the max_config is provided by the arbiter it is
+	 * not necessary to split the shader core groups in different coherent
+	 * groups.
+	 */
+	base_props->coherency_info.coherency =
+		base_props->raw_props.mem_features;
+	base_props->coherency_info.num_core_groups = 1;
+	base_props->coherency_info.num_groups = 1;
+	base_props->coherency_info.group[0].core_mask =
+		kbdev->gpu_props.max_config.core_mask;
+	base_props->coherency_info.group[0].num_cores =
+		hweight32(kbdev->gpu_props.max_config.core_mask);
+}
+
 /**
  * kbase_gpuprops_calculate_props - Calculate the derived properties
  * @gpu_props: The &struct base_gpu_props structure
@@ -195,7 +313,6 @@ static void kbase_gpuprops_calculate_props(
 {
 	int i;
 	u32 gpu_id;
-	u32 product_id;
 
 	/* Populate the base_gpu_props structure */
 	kbase_gpuprops_update_core_props_gpu_id(gpu_props);
@@ -218,7 +335,8 @@ static void kbase_gpuprops_calculate_props(
 
 	/* Field with number of l2 slices is added to MEM_FEATURES register
 	 * since t76x. Below code assumes that for older GPU reserved bits will
-	 * be read as zero. */
+	 * be read as zero.
+	 */
 	gpu_props->l2_props.num_l2_slices =
 		KBASE_UBFX32(gpu_props->raw_props.mem_features, 8U, 4) + 1;
 
@@ -251,8 +369,6 @@ static void kbase_gpuprops_calculate_props(
 	 * Workaround for the incorrectly applied THREAD_FEATURES to tDUx.
 	 */
 	gpu_id = kbdev->gpu_props.props.raw_props.gpu_id;
-	product_id = gpu_id & GPU_ID_VERSION_PRODUCT_ID;
-	product_id >>= GPU_ID_VERSION_PRODUCT_ID_SHIFT;
 
 #if MALI_USE_CSF
 	gpu_props->thread_props.max_registers =
@@ -299,8 +415,30 @@ static void kbase_gpuprops_calculate_props(
 		gpu_props->thread_props.max_task_queue = THREAD_MTQ_DEFAULT;
 		gpu_props->thread_props.max_thread_group_split = THREAD_MTGS_DEFAULT;
 	}
-	/* Initialize the coherent_group structure for each group */
-	kbase_gpuprops_construct_coherent_groups(gpu_props);
+
+	/*
+	 * If the maximum resources allocated information is available it is
+	 * necessary to update the base_gpu_props with the max_config info to
+	 * the userspace. This is applicable to systems that receive this
+	 * information from the arbiter.
+	 */
+	if (kbdev->gpu_props.max_config.core_mask)
+		/* Update the max config properties in the base_gpu_props */
+		kbase_gpuprops_update_max_config_props(gpu_props,
+						       kbdev);
+	else
+		/* Initialize the coherent_group structure for each group */
+		kbase_gpuprops_construct_coherent_groups(gpu_props);
+}
+
+void kbase_gpuprops_set_max_config(struct kbase_device *kbdev,
+	const struct max_config_props *max_config)
+{
+	if (WARN_ON(!kbdev) || WARN_ON(!max_config))
+		return;
+
+	kbdev->gpu_props.max_config.l2_slices = max_config->l2_slices;
+	kbdev->gpu_props.max_config.core_mask = max_config->core_mask;
 }
 
 void kbase_gpuprops_set(struct kbase_device *kbdev)
@@ -308,7 +446,8 @@ void kbase_gpuprops_set(struct kbase_device *kbdev)
 	struct kbase_gpu_props *gpu_props;
 	struct gpu_raw_gpu_props *raw;
 
-	KBASE_DEBUG_ASSERT(NULL != kbdev);
+	if (WARN_ON(!kbdev))
+		return;
 	gpu_props = &kbdev->gpu_props;
 	raw = &gpu_props->props.raw_props;
 
@@ -328,9 +467,19 @@ void kbase_gpuprops_set(struct kbase_device *kbdev)
 	gpu_props->mmu.pa_bits = KBASE_UBFX32(raw->mmu_features, 8U, 8);
 
 	gpu_props->num_cores = hweight64(raw->shader_present);
-	gpu_props->num_core_groups = hweight64(raw->l2_present);
+	gpu_props->num_core_groups =
+		gpu_props->props.coherency_info.num_core_groups;
 	gpu_props->num_address_spaces = hweight32(raw->as_present);
 	gpu_props->num_job_slots = hweight32(raw->js_present);
+
+	/*
+	 * Current configuration is used on HW interactions so that the maximum
+	 * config is just used for user space avoiding interactions with parts
+	 * of the hardware that might not be allocated to the kbase instance at
+	 * that moment.
+	 */
+	kbase_gpuprops_req_curr_config_update(kbdev);
+	kbase_gpuprops_get_curr_config_props(kbdev, &gpu_props->curr_config);
 }
 
 int kbase_gpuprops_set_features(struct kbase_device *kbdev)
@@ -368,13 +517,26 @@ int kbase_gpuprops_set_features(struct kbase_device *kbdev)
  * in sysfs.
  */
 static u8 override_l2_size;
-module_param(override_l2_size, byte, 0);
+module_param(override_l2_size, byte, 0000);
 MODULE_PARM_DESC(override_l2_size, "Override L2 size config for testing");
 
 static u8 override_l2_hash;
-module_param(override_l2_hash, byte, 0);
+module_param(override_l2_hash, byte, 0000);
 MODULE_PARM_DESC(override_l2_hash, "Override L2 hash config for testing");
 
+static u32 l2_hash_values[ASN_HASH_COUNT] = {
+	0,
+};
+static int num_override_l2_hash_values;
+module_param_array(l2_hash_values, uint, &num_override_l2_hash_values, 0000);
+MODULE_PARM_DESC(l2_hash_values, "Override L2 hash values config for testing");
+
+enum l2_config_override_result {
+	L2_CONFIG_OVERRIDE_FAIL = -1,
+	L2_CONFIG_OVERRIDE_NONE,
+	L2_CONFIG_OVERRIDE_OK,
+};
+
 /**
  * kbase_read_l2_config_from_dt - Read L2 configuration
  * @kbdev: The kbase device for which to get the L2 configuration.
@@ -383,15 +545,17 @@ MODULE_PARM_DESC(override_l2_hash, "Override L2 hash config for testing");
  * Override values in module parameters take priority over override values in
  * device tree.
  *
- * Return: true if either size or hash was overridden, false if no overrides
- * were found.
+ * Return: L2_CONFIG_OVERRIDE_OK if either size or hash, or both was properly
+ *         overridden, L2_CONFIG_OVERRIDE_NONE if no overrides are provided.
+ *         L2_CONFIG_OVERRIDE_FAIL otherwise.
  */
-static bool kbase_read_l2_config_from_dt(struct kbase_device * const kbdev)
+static enum l2_config_override_result
+kbase_read_l2_config_from_dt(struct kbase_device *const kbdev)
 {
 	struct device_node *np = kbdev->dev->of_node;
 
 	if (!np)
-		return false;
+		return L2_CONFIG_OVERRIDE_NONE;
 
 	if (override_l2_size)
 		kbdev->l2_size_override = override_l2_size;
@@ -403,10 +567,41 @@ static bool kbase_read_l2_config_from_dt(struct kbase_device * const kbdev)
 	else if (of_property_read_u8(np, "l2-hash", &kbdev->l2_hash_override))
 		kbdev->l2_hash_override = 0;
 
-	if (kbdev->l2_size_override || kbdev->l2_hash_override)
-		return true;
+	kbdev->l2_hash_values_override = false;
+	if (num_override_l2_hash_values) {
+		int i;
+
+		kbdev->l2_hash_values_override = true;
+		for (i = 0; i < num_override_l2_hash_values; i++)
+			kbdev->l2_hash_values[i] = l2_hash_values[i];
+	} else if (!of_property_read_u32_array(np, "l2-hash-values",
+					       kbdev->l2_hash_values,
+					       ASN_HASH_COUNT))
+		kbdev->l2_hash_values_override = true;
+
+	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_ASN_HASH) &&
+	    (kbdev->l2_hash_override)) {
+		dev_err(kbdev->dev, "l2-hash not supported\n");
+		return L2_CONFIG_OVERRIDE_FAIL;
+	}
+
+	if (!kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_ASN_HASH) &&
+	    (kbdev->l2_hash_values_override)) {
+		dev_err(kbdev->dev, "l2-hash-values not supported\n");
+		return L2_CONFIG_OVERRIDE_FAIL;
+	}
+
+	if (kbdev->l2_hash_override && kbdev->l2_hash_values_override) {
+		dev_err(kbdev->dev,
+			"both l2-hash & l2-hash-values not supported\n");
+		return L2_CONFIG_OVERRIDE_FAIL;
+	}
+
+	if (kbdev->l2_size_override || kbdev->l2_hash_override ||
+	    kbdev->l2_hash_values_override)
+		return L2_CONFIG_OVERRIDE_OK;
 
-	return false;
+	return L2_CONFIG_OVERRIDE_NONE;
 }
 
 int kbase_gpuprops_update_l2_features(struct kbase_device *kbdev)
@@ -418,8 +613,25 @@ int kbase_gpuprops_update_l2_features(struct kbase_device *kbdev)
 		struct base_gpu_props *gpu_props = &kbdev->gpu_props.props;
 
 		/* Check for L2 cache size & hash overrides */
-		if (!kbase_read_l2_config_from_dt(kbdev))
-			return 0;
+		switch (kbase_read_l2_config_from_dt(kbdev)) {
+		case L2_CONFIG_OVERRIDE_FAIL:
+			err = -EIO;
+			goto exit;
+		case L2_CONFIG_OVERRIDE_NONE:
+			goto exit;
+		default:
+			break;
+		}
+
+		/* pm.active_count is expected to be 1 here, which is set in
+		 * kbase_hwaccess_pm_powerup().
+		 */
+		WARN_ON(kbdev->pm.active_count != 1);
+		/* The new settings for L2 cache can only be applied when it is
+		 * off, so first do the power down.
+		 */
+		kbase_pm_context_idle(kbdev);
+		kbase_pm_wait_for_desired_state(kbdev);
 
 		/* Need L2 to get powered to reflect to L2_FEATURES */
 		kbase_pm_context_active(kbdev);
@@ -430,21 +642,21 @@ int kbase_gpuprops_update_l2_features(struct kbase_device *kbdev)
 		/* Dump L2_FEATURES register */
 		err = kbase_backend_gpuprops_get_l2_features(kbdev, &regdump);
 		if (err)
-			goto idle_gpu;
+			goto exit;
 
 		dev_info(kbdev->dev, "Reflected L2_FEATURES is 0x%x\n",
-				regdump.l2_features);
+			 regdump.l2_features);
+		dev_info(kbdev->dev, "Reflected L2_CONFIG is 0x%08x\n",
+			 regdump.l2_config);
+
 
 		/* Update gpuprops with reflected L2_FEATURES */
 		gpu_props->raw_props.l2_features = regdump.l2_features;
 		gpu_props->l2_props.log2_cache_size =
 			KBASE_UBFX32(gpu_props->raw_props.l2_features, 16U, 8);
-
-idle_gpu:
-		/* Let GPU idle */
-		kbase_pm_context_idle(kbdev);
 	}
 
+exit:
 	return err;
 }
 
@@ -524,7 +736,7 @@ static struct {
 	PROP(RAW_THREAD_FEATURES,         raw_props.thread_features),
 	PROP(RAW_THREAD_TLS_ALLOC,        raw_props.thread_tls_alloc),
 	PROP(RAW_COHERENCY_MODE,          raw_props.coherency_mode),
-
+	PROP(RAW_GPU_FEATURES,            raw_props.gpu_features),
 	PROP(COHERENCY_NUM_GROUPS,        coherency_info.num_groups),
 	PROP(COHERENCY_NUM_CORE_GROUPS,   coherency_info.num_core_groups),
 	PROP(COHERENCY_COHERENCY,         coherency_info.coherency),
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_gpuprops.h b/drivers/gpu/arm/bifrost/mali_kbase_gpuprops.h
index 5eee7948381a..72f76c392fa1 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_gpuprops.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_gpuprops.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2015, 2017, 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,29 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
- *//* SPDX-License-Identifier: GPL-2.0 */
-/*
- *
- * (C) COPYRIGHT 2011-2015, 2017, 2019-2020 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
  */
 
-
-
 /**
- * @file mali_kbase_gpuprops.h
- * Base kernel property query APIs
+ * DOC: Base kernel property query APIs
  */
 
 #ifndef _KBASE_GPUPROPS_H_
@@ -64,11 +46,10 @@ struct kbase_device;
 	(((u32)(value) >> (u32)(offset)) & (u32)((1ULL << (u32)(size)) - 1))
 
 /**
- * @brief Set up Kbase GPU properties.
+ * kbase_gpuprops_set - Set up Kbase GPU properties.
+ * @kbdev: The struct kbase_device structure for the device
  *
  * Set up Kbase GPU properties with information from the GPU registers
- *
- * @param kbdev		The struct kbase_device structure for the device
  */
 void kbase_gpuprops_set(struct kbase_device *kbdev);
 
@@ -89,6 +70,8 @@ int kbase_gpuprops_set_features(struct kbase_device *kbdev);
  * @kbdev:   Device pointer
  *
  * This function updates l2_features and the log2 cache size.
+ * The function expects GPU to be powered up and value of pm.active_count
+ * to be 1.
  *
  * Return: Zero on success, Linux error code for failure
  */
@@ -132,4 +115,38 @@ int kbase_device_populate_max_freq(struct kbase_device *kbdev);
 void kbase_gpuprops_update_core_props_gpu_id(
 	struct base_gpu_props * const gpu_props);
 
+/**
+ * kbase_gpuprops_set_max_config - Set the max config information
+ * @kbdev:       Device pointer
+ * @max_config:  Maximum configuration data to be updated
+ *
+ * This function sets max_config in the kbase_gpu_props.
+ */
+void kbase_gpuprops_set_max_config(struct kbase_device *kbdev,
+	const struct max_config_props *max_config);
+
+/**
+ * kbase_gpuprops_get_curr_config_props - Get the current allocated resources
+ * @kbdev: The &struct kbase_device structure for the device
+ * @curr_config: The &struct curr_config_props structure to receive the result
+ *
+ * Fill the &struct curr_config_props structure with values from the GPU
+ * configuration registers.
+ *
+ * Return: Zero on success, Linux error code on failure
+ */
+int kbase_gpuprops_get_curr_config_props(struct kbase_device *kbdev,
+	struct curr_config_props * const curr_config);
+
+/**
+ * kbase_gpuprops_req_curr_config_update - Request Current Config Update
+ * @kbdev: The &struct kbase_device structure for the device
+ *
+ * Requests the current configuration to be updated next time the
+ * kbase_gpuprops_get_curr_config_props() is called.
+ *
+ * Return: Zero on success, Linux error code on failure
+ */
+int kbase_gpuprops_req_curr_config_update(struct kbase_device *kbdev);
+
 #endif				/* _KBASE_GPUPROPS_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_gpuprops_types.h b/drivers/gpu/arm/bifrost/mali_kbase_gpuprops_types.h
index ec6f1c39ccb0..1d101e0a3e0c 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_gpuprops_types.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_gpuprops_types.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2011-2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,21 +17,16 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /**
- * @file mali_kbase_gpuprops_types.h
- * Base kernel property query APIs
+ * DOC: Base kernel property query APIs
  */
 
 #ifndef _KBASE_GPUPROPS_TYPES_H_
 #define _KBASE_GPUPROPS_TYPES_H_
 
-#include "mali_base_kernel.h"
+#include <uapi/gpu/arm/bifrost/mali_base_kernel.h>
 
 #define KBASE_GPU_SPEED_MHZ    123
 #define KBASE_GPU_PC_SIZE_LOG2 24U
@@ -38,6 +34,7 @@
 struct kbase_gpuprops_regdump {
 	u32 gpu_id;
 	u32 l2_features;
+	u32 l2_config;
 	u32 core_features;
 	u32 tiler_features;
 	u32 mem_features;
@@ -60,6 +57,30 @@ struct kbase_gpuprops_regdump {
 	u32 stack_present_lo;
 	u32 stack_present_hi;
 	u32 coherency_features;
+	u32 gpu_features_lo;
+	u32 gpu_features_hi;
+};
+
+/**
+ * struct kbase_current_config_regdump - Register dump for current resources
+ *                                       allocated to the GPU.
+ * @mem_features: Memory system features. Contains information about the
+ *                features of the memory system. Used here to get the L2 slice
+ *                count.
+ * @shader_present_lo: Shader core present bitmap. Low word.
+ * @shader_present_hi: Shader core present bitmap. High word.
+ * @l2_present_lo: L2 cache present bitmap. Low word.
+ * @l2_present_hi: L2 cache present bitmap. High word.
+ *
+ * Register dump structure used to store the resgisters data realated to the
+ * current resources allocated to the GPU.
+ */
+struct kbase_current_config_regdump {
+	u32 mem_features;
+	u32 shader_present_lo;
+	u32 shader_present_hi;
+	u32 l2_present_lo;
+	u32 l2_present_hi;
 };
 
 struct kbase_gpu_cache_props {
@@ -76,6 +97,50 @@ struct kbase_gpu_mmu_props {
 	u8 pa_bits;
 };
 
+/**
+ * struct max_config_props - Properties based on the maximum resources
+ *                           available.
+ * @l2_slices: Maximum number of L2 slices that can be assinged to the GPU
+ *             during runtime.
+ * @padding:   Padding to a multiple of 64 bits.
+ * @core_mask: Largest core mask bitmap that can be assigned to the GPU during
+ *             runtime.
+ *
+ * Properties based on the maximum resources available (not necessarly
+ * allocated at that moment). Used to provide the maximum configuration to the
+ * userspace allowing the applications to allocate enough resources in case the
+ * real allocated resources change.
+ */
+struct max_config_props {
+	u8 l2_slices;
+	u8 padding[3];
+	u32 core_mask;
+};
+
+/**
+ * struct curr_config_props - Properties based on the current resources
+ *                            allocated to the GPU.
+ * @l2_present:     Current L2 present bitmap that is allocated to the GPU.
+ * @shader_present: Current shader present bitmap that is allocated to the GPU.
+ * @num_cores:      Current number of shader cores allocated to the GPU.
+ * @l2_slices:      Current number of L2 slices allocated to the GPU.
+ * @update_needed:  Defines if it is necessary to re-read the registers to
+ *                  update the current allocated resources.
+ * @padding:        Padding to a multiple of 64 bits.
+ *
+ * Properties based on the current resource available. Used for operations with
+ * hardware interactions to avoid using userspace data that can be based on
+ * the maximum resource available.
+ */
+struct curr_config_props {
+	u64 l2_present;
+	u64 shader_present;
+	u16 num_cores;
+	u8 l2_slices;
+	bool update_needed;
+	u8 padding[4];
+};
+
 struct kbase_gpu_props {
 	/* kernel-only properties */
 	u8 num_cores;
@@ -88,6 +153,12 @@ struct kbase_gpu_props {
 	struct kbase_gpu_mem_props mem;
 	struct kbase_gpu_mmu_props mmu;
 
+	/* Properties based on the current resource available */
+	struct curr_config_props curr_config;
+
+	/* Properties based on the maximum resource available */
+	struct max_config_props max_config;
+
 	/* Properties shared with userspace */
 	struct base_gpu_props props;
 
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_gwt.c b/drivers/gpu/arm/bifrost/mali_kbase_gwt.c
index 91dc4dbc0800..93acf8a82b4f 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_gwt.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_gwt.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "mali_kbase_gwt.h"
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_gwt.h b/drivers/gpu/arm/bifrost/mali_kbase_gwt.h
index 7e7746e64915..d85833442aa6 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_gwt.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_gwt.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,15 +17,13 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #if !defined(_KBASE_GWT_H)
 #define _KBASE_GWT_H
 
 #include <mali_kbase.h>
-#include <mali_kbase_ioctl.h>
+#include <uapi/gpu/arm/bifrost/mali_kbase_ioctl.h>
 
 /**
  * kbase_gpu_gwt_start - Start the GPU write tracking
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hw.c b/drivers/gpu/arm/bifrost/mali_kbase_hw.c
index dc58ffb931be..b1758d77aceb 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hw.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hw.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2012-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /*
  * Run-time work-arounds helpers
  */
@@ -78,20 +75,6 @@ void kbase_hw_set_features_mask(struct kbase_device *kbdev)
 	case GPU_ID2_PRODUCT_LODX:
 		features = base_hw_features_tODx;
 		break;
-	case GPU_ID2_PRODUCT_TGRX:
-		features = base_hw_features_tGRx;
-		break;
-	case GPU_ID2_PRODUCT_TVAX:
-		features = base_hw_features_tVAx;
-		break;
-	case GPU_ID2_PRODUCT_TTUX:
-		/* Fallthrough */
-	case GPU_ID2_PRODUCT_LTUX:
-		features = base_hw_features_tTUx;
-		break;
-	case GPU_ID2_PRODUCT_TE2X:
-		features = base_hw_features_tE2x;
-		break;
 	default:
 		features = base_hw_features_generic;
 		break;
@@ -143,109 +126,91 @@ static const enum base_hw_issue *kbase_hw_get_issues_for_new_id(
 	};
 
 	static const struct base_hw_product base_hw_products[] = {
-		{GPU_ID2_PRODUCT_TMIX,
-		 {{GPU_ID2_VERSION_MAKE(0, 0, 1),
-		   base_hw_issues_tMIx_r0p0_05dev0},
-		  {GPU_ID2_VERSION_MAKE(0, 0, 2), base_hw_issues_tMIx_r0p0},
-		  {GPU_ID2_VERSION_MAKE(0, 1, 0), base_hw_issues_tMIx_r0p1},
-		  {U32_MAX /* sentinel value */, NULL} } },
-
-		{GPU_ID2_PRODUCT_THEX,
-		 {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tHEx_r0p0},
-		  {GPU_ID2_VERSION_MAKE(0, 0, 1), base_hw_issues_tHEx_r0p0},
-		  {GPU_ID2_VERSION_MAKE(0, 1, 0), base_hw_issues_tHEx_r0p1},
-		  {GPU_ID2_VERSION_MAKE(0, 1, 1), base_hw_issues_tHEx_r0p1},
-		  {GPU_ID2_VERSION_MAKE(0, 2, 0), base_hw_issues_tHEx_r0p2},
-		  {GPU_ID2_VERSION_MAKE(0, 3, 0), base_hw_issues_tHEx_r0p3},
-		  {U32_MAX, NULL} } },
-
-		{GPU_ID2_PRODUCT_TSIX,
-		 {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tSIx_r0p0},
-		  {GPU_ID2_VERSION_MAKE(0, 0, 1), base_hw_issues_tSIx_r0p0},
-		  {GPU_ID2_VERSION_MAKE(0, 1, 0), base_hw_issues_tSIx_r0p1},
-		  {GPU_ID2_VERSION_MAKE(1, 0, 0), base_hw_issues_tSIx_r1p0},
-		  {GPU_ID2_VERSION_MAKE(1, 1, 0), base_hw_issues_tSIx_r1p1},
-		  {U32_MAX, NULL} } },
-
-		{GPU_ID2_PRODUCT_TDVX,
-		 {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tDVx_r0p0},
-		  {U32_MAX, NULL} } },
-
-		{GPU_ID2_PRODUCT_TNOX,
-		 {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tNOx_r0p0},
-		  {U32_MAX, NULL} } },
-
-		{GPU_ID2_PRODUCT_TGOX,
-		 {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tGOx_r0p0},
-		  {GPU_ID2_VERSION_MAKE(1, 0, 0), base_hw_issues_tGOx_r1p0},
-		  {U32_MAX, NULL} } },
-
-		{GPU_ID2_PRODUCT_TTRX,
-		 {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tTRx_r0p0},
-		  {GPU_ID2_VERSION_MAKE(0, 0, 3), base_hw_issues_tTRx_r0p0},
-		  {GPU_ID2_VERSION_MAKE(0, 1, 0), base_hw_issues_tTRx_r0p1},
-		  {GPU_ID2_VERSION_MAKE(0, 1, 1), base_hw_issues_tTRx_r0p1},
-		  {GPU_ID2_VERSION_MAKE(0, 2, 0), base_hw_issues_tTRx_r0p2},
-		  {U32_MAX, NULL} } },
-
-		{GPU_ID2_PRODUCT_TNAX,
-		 {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tNAx_r0p0},
-		  {GPU_ID2_VERSION_MAKE(0, 0, 3), base_hw_issues_tNAx_r0p0},
-		  {GPU_ID2_VERSION_MAKE(0, 0, 4), base_hw_issues_tNAx_r0p0},
-		  {GPU_ID2_VERSION_MAKE(0, 0, 5), base_hw_issues_tNAx_r0p0},
-		  {GPU_ID2_VERSION_MAKE(0, 1, 0), base_hw_issues_tNAx_r0p1},
-		  {GPU_ID2_VERSION_MAKE(0, 1, 1), base_hw_issues_tNAx_r0p1},
-		  {U32_MAX, NULL} } },
-
-		{GPU_ID2_PRODUCT_LBEX,
-		 {{GPU_ID2_VERSION_MAKE(1, 0, 0), base_hw_issues_lBEx_r1p0},
-		  {GPU_ID2_VERSION_MAKE(1, 1, 0), base_hw_issues_lBEx_r1p1},
-		  {U32_MAX, NULL} } },
-
-		{GPU_ID2_PRODUCT_TBEX,
-		 {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tBEx_r0p0},
-		  {GPU_ID2_VERSION_MAKE(0, 0, 3), base_hw_issues_tBEx_r0p0},
-		  {GPU_ID2_VERSION_MAKE(0, 1, 0), base_hw_issues_tBEx_r0p1},
-		  {GPU_ID2_VERSION_MAKE(1, 0, 0), base_hw_issues_tBEx_r1p0},
-		  {U32_MAX, NULL} } },
-
-		{GPU_ID2_PRODUCT_TBAX,
-		 {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tBAx_r0p0},
-		  {GPU_ID2_VERSION_MAKE(0, 0, 3), base_hw_issues_tBAx_r0p0},
-		  {GPU_ID2_VERSION_MAKE(1, 0, 0), base_hw_issues_tBAx_r1p0},
-		  {U32_MAX, NULL} } },
-
-		{GPU_ID2_PRODUCT_TDUX,
-		 {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tDUx_r0p0},
-		  {U32_MAX, NULL} } },
-
-		{GPU_ID2_PRODUCT_TODX,
-		 {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tODx_r0p0},
-		  {U32_MAX, NULL} } },
-
-		{GPU_ID2_PRODUCT_LODX,
-		 {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tODx_r0p0},
-		  {U32_MAX, NULL} } },
-
-		{GPU_ID2_PRODUCT_TGRX,
-		 {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tGRx_r0p0},
-		  {U32_MAX, NULL} } },
-
-		{GPU_ID2_PRODUCT_TVAX,
-		 {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tVAx_r0p0},
-		  {U32_MAX, NULL} } },
-
-		{GPU_ID2_PRODUCT_TTUX,
-		 {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tTUx_r0p0},
-		  {U32_MAX, NULL} } },
-
-		{GPU_ID2_PRODUCT_LTUX,
-		 {{GPU_ID2_VERSION_MAKE(3, 0, 0), base_hw_issues_tTUx_r0p0},
-		  {U32_MAX, NULL} } },
-
-		{GPU_ID2_PRODUCT_TE2X,
-		 {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tE2x_r0p0},
-		  {U32_MAX, NULL} } },
+		{ GPU_ID2_PRODUCT_TMIX,
+		  { { GPU_ID2_VERSION_MAKE(0, 0, 1),
+		      base_hw_issues_tMIx_r0p0_05dev0 },
+		    { GPU_ID2_VERSION_MAKE(0, 0, 2), base_hw_issues_tMIx_r0p0 },
+		    { GPU_ID2_VERSION_MAKE(0, 1, 0), base_hw_issues_tMIx_r0p1 },
+		    { U32_MAX /* sentinel value */, NULL } } },
+
+		{ GPU_ID2_PRODUCT_THEX,
+		  { { GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tHEx_r0p0 },
+		    { GPU_ID2_VERSION_MAKE(0, 0, 1), base_hw_issues_tHEx_r0p0 },
+		    { GPU_ID2_VERSION_MAKE(0, 1, 0), base_hw_issues_tHEx_r0p1 },
+		    { GPU_ID2_VERSION_MAKE(0, 1, 1), base_hw_issues_tHEx_r0p1 },
+		    { GPU_ID2_VERSION_MAKE(0, 2, 0), base_hw_issues_tHEx_r0p2 },
+		    { GPU_ID2_VERSION_MAKE(0, 3, 0), base_hw_issues_tHEx_r0p3 },
+		    { U32_MAX, NULL } } },
+
+		{ GPU_ID2_PRODUCT_TSIX,
+		  { { GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tSIx_r0p0 },
+		    { GPU_ID2_VERSION_MAKE(0, 0, 1), base_hw_issues_tSIx_r0p0 },
+		    { GPU_ID2_VERSION_MAKE(0, 1, 0), base_hw_issues_tSIx_r0p1 },
+		    { GPU_ID2_VERSION_MAKE(1, 0, 0), base_hw_issues_tSIx_r1p0 },
+		    { GPU_ID2_VERSION_MAKE(1, 1, 0), base_hw_issues_tSIx_r1p1 },
+		    { U32_MAX, NULL } } },
+
+		{ GPU_ID2_PRODUCT_TDVX,
+		  { { GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tDVx_r0p0 },
+		    { U32_MAX, NULL } } },
+
+		{ GPU_ID2_PRODUCT_TNOX,
+		  { { GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tNOx_r0p0 },
+		    { U32_MAX, NULL } } },
+
+		{ GPU_ID2_PRODUCT_TGOX,
+		  { { GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tGOx_r0p0 },
+		    { GPU_ID2_VERSION_MAKE(1, 0, 0), base_hw_issues_tGOx_r1p0 },
+		    { U32_MAX, NULL } } },
+
+		{ GPU_ID2_PRODUCT_TTRX,
+		  { { GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tTRx_r0p0 },
+		    { GPU_ID2_VERSION_MAKE(0, 0, 3), base_hw_issues_tTRx_r0p0 },
+		    { GPU_ID2_VERSION_MAKE(0, 1, 0), base_hw_issues_tTRx_r0p1 },
+		    { GPU_ID2_VERSION_MAKE(0, 1, 1), base_hw_issues_tTRx_r0p1 },
+		    { GPU_ID2_VERSION_MAKE(0, 2, 0), base_hw_issues_tTRx_r0p2 },
+		    { U32_MAX, NULL } } },
+
+		{ GPU_ID2_PRODUCT_TNAX,
+		  { { GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tNAx_r0p0 },
+		    { GPU_ID2_VERSION_MAKE(0, 0, 3), base_hw_issues_tNAx_r0p0 },
+		    { GPU_ID2_VERSION_MAKE(0, 0, 4), base_hw_issues_tNAx_r0p0 },
+		    { GPU_ID2_VERSION_MAKE(0, 0, 5), base_hw_issues_tNAx_r0p0 },
+		    { GPU_ID2_VERSION_MAKE(0, 1, 0), base_hw_issues_tNAx_r0p1 },
+		    { GPU_ID2_VERSION_MAKE(0, 1, 1), base_hw_issues_tNAx_r0p1 },
+		    { U32_MAX, NULL } } },
+
+		{ GPU_ID2_PRODUCT_LBEX,
+		  { { GPU_ID2_VERSION_MAKE(1, 0, 0), base_hw_issues_lBEx_r1p0 },
+		    { GPU_ID2_VERSION_MAKE(1, 1, 0), base_hw_issues_lBEx_r1p1 },
+		    { U32_MAX, NULL } } },
+
+		{ GPU_ID2_PRODUCT_TBEX,
+		  { { GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tBEx_r0p0 },
+		    { GPU_ID2_VERSION_MAKE(0, 0, 3), base_hw_issues_tBEx_r0p0 },
+		    { GPU_ID2_VERSION_MAKE(0, 1, 0), base_hw_issues_tBEx_r0p1 },
+		    { GPU_ID2_VERSION_MAKE(1, 0, 0), base_hw_issues_tBEx_r1p0 },
+		    { U32_MAX, NULL } } },
+
+		{ GPU_ID2_PRODUCT_TBAX,
+		  { { GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tBAx_r0p0 },
+		    { GPU_ID2_VERSION_MAKE(0, 0, 1), base_hw_issues_tBAx_r0p0 },
+		    { GPU_ID2_VERSION_MAKE(0, 0, 2), base_hw_issues_tBAx_r0p0 },
+		    { U32_MAX, NULL } } },
+
+		{ GPU_ID2_PRODUCT_TDUX,
+		  { { GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tDUx_r0p0 },
+		    { U32_MAX, NULL } } },
+
+		{ GPU_ID2_PRODUCT_TODX,
+		  { { GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tODx_r0p0 },
+		    { GPU_ID2_VERSION_MAKE(0, 0, 4), base_hw_issues_tODx_r0p0 },
+		    { GPU_ID2_VERSION_MAKE(0, 0, 5), base_hw_issues_tODx_r0p0 },
+		    { U32_MAX, NULL } } },
+
+		{ GPU_ID2_PRODUCT_LODX,
+		  { { GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tODx_r0p0 },
+		    { U32_MAX, NULL } } },
 	};
 
 	u32 gpu_id = kbdev->gpu_props.props.raw_props.gpu_id;
@@ -278,8 +243,8 @@ static const enum base_hw_issue *kbase_hw_get_issues_for_new_id(
 			}
 
 			/* Check whether this is a candidate for most recent
-				known version not later than the actual
-				version. */
+			 * known version not later than the actual version.
+			 */
 			if ((version > product->map[v].version) &&
 				(product->map[v].version >= fallback_version)) {
 #if MALI_CUSTOMER_RELEASE
@@ -296,7 +261,8 @@ static const enum base_hw_issue *kbase_hw_get_issues_for_new_id(
 
 		if ((issues == NULL) && (fallback_issues != NULL)) {
 			/* Fall back to the issue set of the most recent known
-				version not later than the actual version. */
+			 * version not later than the actual version.
+			 */
 			issues = fallback_issues;
 
 #if MALI_CUSTOMER_RELEASE
@@ -349,7 +315,8 @@ int kbase_hw_set_issues_mask(struct kbase_device *kbdev)
 
 #if !MALI_CUSTOMER_RELEASE
 		/* The GPU ID might have been replaced with the last
-			known version of the same GPU. */
+		 * known version of the same GPU.
+		 */
 		gpu_id = kbdev->gpu_props.props.raw_props.gpu_id;
 #endif
 	} else {
@@ -393,19 +360,6 @@ int kbase_hw_set_issues_mask(struct kbase_device *kbdev)
 		case GPU_ID2_PRODUCT_LODX:
 			issues = base_hw_issues_model_tODx;
 			break;
-		case GPU_ID2_PRODUCT_TGRX:
-			issues = base_hw_issues_model_tGRx;
-			break;
-		case GPU_ID2_PRODUCT_TVAX:
-			issues = base_hw_issues_model_tVAx;
-			break;
-		case GPU_ID2_PRODUCT_TTUX:
-		case GPU_ID2_PRODUCT_LTUX:
-			issues = base_hw_issues_model_tTUx;
-			break;
-		case GPU_ID2_PRODUCT_TE2X:
-			issues = base_hw_issues_model_tE2x;
-			break;
 		default:
 			dev_err(kbdev->dev,
 				"Unknown GPU ID %x", gpu_id);
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hw.h b/drivers/gpu/arm/bifrost/mali_kbase_hw.h
index f386b1624317..65b417c95e13 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hw.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hw.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2012-2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,15 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /**
- * @file
- * Run-time work-arounds helpers
+ * DOC: Run-time work-arounds helpers
  */
 
 #ifndef _KBASE_HW_H_
@@ -33,13 +29,17 @@
 #include "mali_kbase_defs.h"
 
 /**
- * @brief Tell whether a work-around should be enabled
+ * Tell whether a work-around should be enabled
+ * @kbdev: Device pointer
+ * @issue: issue to be checked
  */
 #define kbase_hw_has_issue(kbdev, issue)\
 	test_bit(issue, &(kbdev)->hw_issues_mask[0])
 
 /**
- * @brief Tell whether a feature is supported
+ * Tell whether a feature is supported
+ * @kbdev: Device pointer
+ * @feature: feature to be checked
  */
 #define kbase_hw_has_feature(kbdev, feature)\
 	test_bit(feature, &(kbdev)->hw_features_mask[0])
@@ -63,7 +63,8 @@
 int kbase_hw_set_issues_mask(struct kbase_device *kbdev);
 
 /**
- * @brief Set the features mask depending on the GPU ID
+ * Set the features mask depending on the GPU ID
+ * @kbdev: Device pointer
  */
 void kbase_hw_set_features_mask(struct kbase_device *kbdev);
 
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_backend.h b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_backend.h
index 89df2519ab97..90851e2aa85f 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_backend.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_backend.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014-2015, 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2015, 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,11 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
 /*
  * HW access backend common APIs
  */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_defs.h b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_defs.h
index 124a2d9cf0c3..97a593fb6dbe 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_defs.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_defs.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014, 2016, 2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2016-2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,14 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
 /**
- * @file mali_kbase_hwaccess_gpu_defs.h
- * HW access common definitions
+ * DOC: HW access common definitions
  */
 
 #ifndef _KBASE_HWACCESS_DEFS_H_
@@ -43,7 +40,9 @@
  * @backend:         GPU backend specific data for HW access layer
  */
 struct kbase_hwaccess_data {
+#if !MALI_USE_CSF
 	struct kbase_context *active_kctx[BASE_JM_MAX_NR_SLOTS];
+#endif
 
 	struct kbase_backend_data backend;
 };
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_gpuprops.h b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_gpuprops.h
index 3ae0dbe6886d..0fca83e4eb2a 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_gpuprops.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_gpuprops.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2015, 2018, 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,25 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
- *//* SPDX-License-Identifier: GPL-2.0 */
-/*
- *
- * (C) COPYRIGHT 2014-2015, 2018, 2019-2020 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
  */
 
-
 /**
  * Base kernel property query backend APIs
  */
@@ -55,6 +39,23 @@
 int kbase_backend_gpuprops_get(struct kbase_device *kbdev,
 					struct kbase_gpuprops_regdump *regdump);
 
+/**
+ * kbase_backend_gpuprops_get_curr_config() - Fill @curr_config_regdump with
+ *                                            relevant GPU properties read from
+ *                                            the GPU registers.
+ * @kbdev:               Device pointer.
+ * @curr_config_regdump: Pointer to struct kbase_current_config_regdump
+ *                       structure.
+ *
+ * The caller should ensure that GPU remains powered-on during this function and
+ * the caller must ensure this function returns success before using the values
+ * returned in the curr_config_regdump in any part of the kernel.
+ *
+ * Return: Zero for succeess or a Linux error code
+ */
+int kbase_backend_gpuprops_get_curr_config(struct kbase_device *kbdev,
+		struct kbase_current_config_regdump *curr_config_regdump);
+
 /**
  * kbase_backend_gpuprops_get_features - Fill @regdump with GPU properties read
  *                                       from GPU
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_instr.h b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_instr.h
index 4fd2e3549268..959bfeb2096c 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_instr.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_instr.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2014-2015, 2017-2018, 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /*
  * HW Access instrumentation common APIs
  */
@@ -39,8 +36,7 @@
  * @shader_bm:         counters selection bitmask (Shader).
  * @tiler_bm:          counters selection bitmask (Tiler).
  * @mmu_l2_bm:         counters selection bitmask (MMU_L2).
- * @use_secondary:     use secondary performance counters set for applicable
- *                     counter blocks.
+ * @counter_set:       the performance counter set to use.
  */
 struct kbase_instr_hwcnt_enable {
 	u64 dump_buffer;
@@ -49,7 +45,7 @@ struct kbase_instr_hwcnt_enable {
 	u32 shader_bm;
 	u32 tiler_bm;
 	u32 mmu_l2_bm;
-	bool use_secondary;
+	u8 counter_set;
 };
 
 /**
@@ -139,7 +135,7 @@ int kbase_instr_backend_init(struct kbase_device *kbdev);
  */
 void kbase_instr_backend_term(struct kbase_device *kbdev);
 
-#ifdef CONFIG_MALI_PRFCNT_SET_SECONDARY_VIA_DEBUG_FS
+#ifdef CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS
 /**
  * kbase_instr_backend_debugfs_init() - Add a debugfs entry for the
  *                                      hardware counter set.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_jm.h b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_jm.h
index f6ce17e4180f..0e513c757094 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_jm.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_jm.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,11 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
 /*
  * HW access job manager common APIs
  */
@@ -31,7 +29,7 @@
 /**
  * kbase_backend_run_atom() - Run an atom on the GPU
  * @kbdev:	Device pointer
- * @atom:	Atom to run
+ * @katom:	Atom to run
  *
  * Caller must hold the HW access lock
  */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_pm.h b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_pm.h
index bbaf6eaf8d88..4b2a53e960e9 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_pm.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_pm.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014-2015, 2018-2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2015, 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,14 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
 /**
- * @file mali_kbase_hwaccess_pm.h
- * HW access power manager common APIs
+ * DOC: HW access power manager common APIs
  */
 
 #ifndef _KBASE_HWACCESS_PM_H_
@@ -80,24 +77,21 @@ int kbase_hwaccess_pm_powerup(struct kbase_device *kbdev,
  * the time this function returns, regardless of whether or not the active power
  * policy asks for the GPU to be powered off.
  *
- * @param kbdev The kbase device structure for the device (must be a valid
- *              pointer)
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
  */
 void kbase_hwaccess_pm_halt(struct kbase_device *kbdev);
 
 /**
  * Perform any backend-specific actions to suspend the GPU
  *
- * @param kbdev The kbase device structure for the device (must be a valid
- *              pointer)
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
  */
 void kbase_hwaccess_pm_suspend(struct kbase_device *kbdev);
 
 /**
  * Perform any backend-specific actions to resume the GPU from a suspend
  *
- * @param kbdev The kbase device structure for the device (must be a valid
- *              pointer)
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
  */
 void kbase_hwaccess_pm_resume(struct kbase_device *kbdev);
 
@@ -105,8 +99,7 @@ void kbase_hwaccess_pm_resume(struct kbase_device *kbdev);
  * Perform any required actions for activating the GPU. Called when the first
  * context goes active.
  *
- * @param kbdev The kbase device structure for the device (must be a valid
- *              pointer)
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
  */
 void kbase_hwaccess_pm_gpu_active(struct kbase_device *kbdev);
 
@@ -114,35 +107,43 @@ void kbase_hwaccess_pm_gpu_active(struct kbase_device *kbdev);
  * Perform any required actions for idling the GPU. Called when the last
  * context goes idle.
  *
- * @param kbdev The kbase device structure for the device (must be a valid
- *              pointer)
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
  */
 void kbase_hwaccess_pm_gpu_idle(struct kbase_device *kbdev);
 
-
+#if MALI_USE_CSF
+/**
+ * Set the debug core mask.
+ *
+ * This determines which cores the power manager is allowed to use.
+ *
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ * @new_core_mask: The core mask to use
+ */
+void kbase_pm_set_debug_core_mask(struct kbase_device *kbdev,
+				  u64 new_core_mask);
+#else
 /**
  * Set the debug core mask.
  *
  * This determines which cores the power manager is allowed to use.
  *
- * @param kbdev         The kbase device structure for the device (must be a
- *                      valid pointer)
- * @param new_core_mask_js0 The core mask to use for job slot 0
- * @param new_core_mask_js0 The core mask to use for job slot 1
- * @param new_core_mask_js0 The core mask to use for job slot 2
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ * @new_core_mask_js0: The core mask to use for job slot 0
+ * @new_core_mask_js1: The core mask to use for job slot 1
+ * @new_core_mask_js2: The core mask to use for job slot 2
  */
 void kbase_pm_set_debug_core_mask(struct kbase_device *kbdev,
 		u64 new_core_mask_js0, u64 new_core_mask_js1,
 		u64 new_core_mask_js2);
-
+#endif /* MALI_USE_CSF */
 
 /**
  * Get the current policy.
  *
  * Returns the policy that is currently active.
  *
- * @param kbdev The kbase device structure for the device (must be a valid
- *              pointer)
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
  *
  * @return The current policy
  */
@@ -152,10 +153,9 @@ const struct kbase_pm_ca_policy
 /**
  * Change the policy to the one specified.
  *
- * @param kbdev  The kbase device structure for the device (must be a valid
- *               pointer)
- * @param policy The policy to change to (valid pointer returned from
- *               @ref kbase_pm_ca_list_policies)
+ * @kbdev:  The kbase device structure for the device (must be a valid pointer)
+ * @policy: The policy to change to (valid pointer returned from
+ *          @ref kbase_pm_ca_list_policies)
  */
 void kbase_pm_ca_set_policy(struct kbase_device *kbdev,
 				const struct kbase_pm_ca_policy *policy);
@@ -163,23 +163,20 @@ void kbase_pm_ca_set_policy(struct kbase_device *kbdev,
 /**
  * Retrieve a static list of the available policies.
  *
- * @param[out] policies An array pointer to take the list of policies. This may
- *                      be NULL. The contents of this array must not be
- *                      modified.
+ * @policies: An array pointer to take the list of policies. This may be NULL.
+ *            The contents of this array must not be modified.
  *
  * @return The number of policies
  */
 int
 kbase_pm_ca_list_policies(const struct kbase_pm_ca_policy * const **policies);
 
-
 /**
  * Get the current policy.
  *
  * Returns the policy that is currently active.
  *
- * @param kbdev The kbase device structure for the device (must be a valid
- *              pointer)
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
  *
  * @return The current policy
  */
@@ -188,9 +185,9 @@ const struct kbase_pm_policy *kbase_pm_get_policy(struct kbase_device *kbdev);
 /**
  * Change the policy to the one specified.
  *
- * @param kbdev  The kbase device structure for the device (must be a valid
+ * @kbdev:  The kbase device structure for the device (must be a valid
  *               pointer)
- * @param policy The policy to change to (valid pointer returned from
+ * @policy: The policy to change to (valid pointer returned from
  *               @ref kbase_pm_list_policies)
  */
 void kbase_pm_set_policy(struct kbase_device *kbdev,
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_time.h b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_time.h
index 94b7551b865e..8488a321c2ee 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_time.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwaccess_time.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014,2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,13 +16,6 @@
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
- *
- * SPDX-License-Identifier: GPL-2.0
- *
- */
-
-
-/**
  *
  */
 
@@ -30,10 +24,10 @@
 
 /**
  * kbase_backend_get_gpu_time() - Get current GPU time
- * @kbdev:		Device pointer
- * @cycle_counter:	Pointer to u64 to store cycle counter in
- * @system_time:	Pointer to u64 to store system time in
- * @ts:			Pointer to struct timespec to store current monotonic
+ * @kbdev:              Device pointer
+ * @cycle_counter:      Pointer to u64 to store cycle counter in.
+ * @system_time:        Pointer to u64 to store system time in
+ * @ts:                 Pointer to struct timespec to store current monotonic
  *			time in
  */
 void kbase_backend_get_gpu_time(struct kbase_device *kbdev, u64 *cycle_counter,
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt.c b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt.c
index 2708af78b292..6bd7d5f69663 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2018, 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -28,9 +27,6 @@
 #include "mali_kbase_hwcnt_accumulator.h"
 #include "mali_kbase_hwcnt_backend.h"
 #include "mali_kbase_hwcnt_types.h"
-#include "mali_malisw.h"
-#include "mali_kbase_debug.h"
-#include "mali_kbase_linux.h"
 
 #include <linux/mutex.h>
 #include <linux/spinlock.h>
@@ -51,6 +47,7 @@ enum kbase_hwcnt_accum_state {
 
 /**
  * struct kbase_hwcnt_accumulator - Hardware counter accumulator structure.
+ * @metadata:               Pointer to immutable hwcnt metadata.
  * @backend:                Pointer to created counter backend.
  * @state:                  The current state of the accumulator.
  *                           - State transition from disabled->enabled or
@@ -89,6 +86,7 @@ enum kbase_hwcnt_accum_state {
  *                             accum_lock.
  */
 struct kbase_hwcnt_accumulator {
+	const struct kbase_hwcnt_metadata *metadata;
 	struct kbase_hwcnt_backend *backend;
 	enum kbase_hwcnt_accum_state state;
 	struct kbase_hwcnt_enable_map enable_map;
@@ -117,6 +115,10 @@ struct kbase_hwcnt_accumulator {
  *                    state_lock.
  *                  - Can be read while holding either lock.
  * @accum:         Hardware counter accumulator structure.
+ * @wq:            Centralized workqueue for users of hardware counters to
+ *                 submit async hardware counter related work. Never directly
+ *                 called, but it's expected that a lot of the functions in this
+ *                 API will end up called from the enqueued async work.
  */
 struct kbase_hwcnt_context {
 	const struct kbase_hwcnt_backend_interface *iface;
@@ -125,6 +127,7 @@ struct kbase_hwcnt_context {
 	struct mutex accum_lock;
 	bool accum_inited;
 	struct kbase_hwcnt_accumulator accum;
+	struct workqueue_struct *wq;
 };
 
 int kbase_hwcnt_context_init(
@@ -138,7 +141,7 @@ int kbase_hwcnt_context_init(
 
 	hctx = kzalloc(sizeof(*hctx), GFP_KERNEL);
 	if (!hctx)
-		return -ENOMEM;
+		goto err_alloc_hctx;
 
 	hctx->iface = iface;
 	spin_lock_init(&hctx->state_lock);
@@ -146,11 +149,21 @@ int kbase_hwcnt_context_init(
 	mutex_init(&hctx->accum_lock);
 	hctx->accum_inited = false;
 
+	hctx->wq =
+		alloc_workqueue("mali_kbase_hwcnt", WQ_HIGHPRI | WQ_UNBOUND, 0);
+	if (!hctx->wq)
+		goto err_alloc_workqueue;
+
 	*out_hctx = hctx;
 
 	return 0;
+
+	destroy_workqueue(hctx->wq);
+err_alloc_workqueue:
+	kfree(hctx);
+err_alloc_hctx:
+	return -ENOMEM;
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_context_init);
 
 void kbase_hwcnt_context_term(struct kbase_hwcnt_context *hctx)
 {
@@ -159,9 +172,13 @@ void kbase_hwcnt_context_term(struct kbase_hwcnt_context *hctx)
 
 	/* Make sure we didn't leak the accumulator */
 	WARN_ON(hctx->accum_inited);
+
+	/* We don't expect any work to be pending on this workqueue.
+	 * Regardless, this will safely drain and complete the work.
+	 */
+	destroy_workqueue(hctx->wq);
 	kfree(hctx);
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_context_term);
 
 /**
  * kbasep_hwcnt_accumulator_term() - Terminate the accumulator for the context.
@@ -197,22 +214,23 @@ static int kbasep_hwcnt_accumulator_init(struct kbase_hwcnt_context *hctx)
 	if (errcode)
 		goto error;
 
+	hctx->accum.metadata = hctx->iface->metadata(hctx->iface->info);
 	hctx->accum.state = ACCUM_STATE_ERROR;
 
-	errcode = kbase_hwcnt_enable_map_alloc(
-		hctx->iface->metadata, &hctx->accum.enable_map);
+	errcode = kbase_hwcnt_enable_map_alloc(hctx->accum.metadata,
+					       &hctx->accum.enable_map);
 	if (errcode)
 		goto error;
 
 	hctx->accum.enable_map_any_enabled = false;
 
-	errcode = kbase_hwcnt_dump_buffer_alloc(
-		hctx->iface->metadata, &hctx->accum.accum_buf);
+	errcode = kbase_hwcnt_dump_buffer_alloc(hctx->accum.metadata,
+						&hctx->accum.accum_buf);
 	if (errcode)
 		goto error;
 
-	errcode = kbase_hwcnt_enable_map_alloc(
-		hctx->iface->metadata, &hctx->accum.scratch_map);
+	errcode = kbase_hwcnt_enable_map_alloc(hctx->accum.metadata,
+					       &hctx->accum.scratch_map);
 	if (errcode)
 		goto error;
 
@@ -366,8 +384,8 @@ static int kbasep_hwcnt_accumulator_dump(
 	WARN_ON(!hctx);
 	WARN_ON(!ts_start_ns);
 	WARN_ON(!ts_end_ns);
-	WARN_ON(dump_buf && (dump_buf->metadata != hctx->iface->metadata));
-	WARN_ON(new_map && (new_map->metadata != hctx->iface->metadata));
+	WARN_ON(dump_buf && (dump_buf->metadata != hctx->accum.metadata));
+	WARN_ON(new_map && (new_map->metadata != hctx->accum.metadata));
 	WARN_ON(!hctx->accum_inited);
 	lockdep_assert_held(&hctx->accum_lock);
 
@@ -609,7 +627,6 @@ int kbase_hwcnt_accumulator_acquire(
 
 	return 0;
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_accumulator_acquire);
 
 void kbase_hwcnt_accumulator_release(struct kbase_hwcnt_accumulator *accum)
 {
@@ -644,7 +661,6 @@ void kbase_hwcnt_accumulator_release(struct kbase_hwcnt_accumulator *accum)
 	spin_unlock_irqrestore(&hctx->state_lock, flags);
 	mutex_unlock(&hctx->accum_lock);
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_accumulator_release);
 
 void kbase_hwcnt_context_disable(struct kbase_hwcnt_context *hctx)
 {
@@ -663,7 +679,6 @@ void kbase_hwcnt_context_disable(struct kbase_hwcnt_context *hctx)
 
 	mutex_unlock(&hctx->accum_lock);
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_context_disable);
 
 bool kbase_hwcnt_context_disable_atomic(struct kbase_hwcnt_context *hctx)
 {
@@ -692,7 +707,6 @@ bool kbase_hwcnt_context_disable_atomic(struct kbase_hwcnt_context *hctx)
 
 	return atomic_disabled;
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_context_disable_atomic);
 
 void kbase_hwcnt_context_enable(struct kbase_hwcnt_context *hctx)
 {
@@ -712,7 +726,6 @@ void kbase_hwcnt_context_enable(struct kbase_hwcnt_context *hctx)
 
 	spin_unlock_irqrestore(&hctx->state_lock, flags);
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_context_enable);
 
 const struct kbase_hwcnt_metadata *kbase_hwcnt_context_metadata(
 	struct kbase_hwcnt_context *hctx)
@@ -720,9 +733,17 @@ const struct kbase_hwcnt_metadata *kbase_hwcnt_context_metadata(
 	if (!hctx)
 		return NULL;
 
-	return hctx->iface->metadata;
+	return hctx->iface->metadata(hctx->iface->info);
+}
+
+bool kbase_hwcnt_context_queue_work(struct kbase_hwcnt_context *hctx,
+				    struct work_struct *work)
+{
+	if (WARN_ON(!hctx) || WARN_ON(!work))
+		return false;
+
+	return queue_work(hctx->wq, work);
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_context_metadata);
 
 int kbase_hwcnt_accumulator_set_counters(
 	struct kbase_hwcnt_accumulator *accum,
@@ -739,8 +760,8 @@ int kbase_hwcnt_accumulator_set_counters(
 
 	hctx = container_of(accum, struct kbase_hwcnt_context, accum);
 
-	if ((new_map->metadata != hctx->iface->metadata) ||
-	    (dump_buf && (dump_buf->metadata != hctx->iface->metadata)))
+	if ((new_map->metadata != hctx->accum.metadata) ||
+	    (dump_buf && (dump_buf->metadata != hctx->accum.metadata)))
 		return -EINVAL;
 
 	mutex_lock(&hctx->accum_lock);
@@ -752,7 +773,6 @@ int kbase_hwcnt_accumulator_set_counters(
 
 	return errcode;
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_accumulator_set_counters);
 
 int kbase_hwcnt_accumulator_dump(
 	struct kbase_hwcnt_accumulator *accum,
@@ -768,7 +788,7 @@ int kbase_hwcnt_accumulator_dump(
 
 	hctx = container_of(accum, struct kbase_hwcnt_context, accum);
 
-	if (dump_buf && (dump_buf->metadata != hctx->iface->metadata))
+	if (dump_buf && (dump_buf->metadata != hctx->accum.metadata))
 		return -EINVAL;
 
 	mutex_lock(&hctx->accum_lock);
@@ -780,7 +800,6 @@ int kbase_hwcnt_accumulator_dump(
 
 	return errcode;
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_accumulator_dump);
 
 u64 kbase_hwcnt_accumulator_timestamp_ns(struct kbase_hwcnt_accumulator *accum)
 {
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_accumulator.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_accumulator.h
index eb82ea4bfd14..fbd13a442691 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_accumulator.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_accumulator.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend.h
index 3a921b754b55..a3013a616579 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -41,11 +40,25 @@ struct kbase_hwcnt_dump_buffer;
 struct kbase_hwcnt_backend_info;
 
 /*
- * struct kbase_hwcnt_backend_info - Opaque pointer to a hardware counter
- *                                   backend, used to perform dumps.
+ * struct kbase_hwcnt_backend - Opaque pointer to a hardware counter
+ *                              backend, used to perform dumps.
  */
 struct kbase_hwcnt_backend;
 
+/*
+ * typedef kbase_hwcnt_backend_metadata_fn - Get the immutable hardware counter
+ *                                           metadata that describes the layout
+ *                                           of the counter data structures.
+ * @info:        Non-NULL pointer to backend info.
+ *
+ * Multiple calls to this function with the same info are guaranteed to return
+ * the same metadata object each time.
+ *
+ * Return: Non-NULL pointer to immutable hardware counter metadata.
+ */
+typedef const struct kbase_hwcnt_metadata *(*kbase_hwcnt_backend_metadata_fn)(
+	const struct kbase_hwcnt_backend_info *info);
+
 /**
  * typedef kbase_hwcnt_backend_init_fn - Initialise a counter backend.
  * @info:        Non-NULL pointer to backend info.
@@ -171,9 +184,9 @@ typedef int (*kbase_hwcnt_backend_dump_wait_fn)(
  * @accumulate:  True if counters should be accumulated into dump_buffer, rather
  *               than copied.
  *
- * If the backend is not enabled, returns an error.
- * If a dump is in progress (i.e. dump_wait has not yet returned successfully)
- * then the resultant contents of the dump buffer will be undefined.
+ * The resultant contents of the dump buffer are only well defined if a prior
+ * call to dump_wait returned successfully, and a new dump has not yet been
+ * requested by a call to dump_request.
  *
  * Return: 0 on success, else error code.
  */
@@ -186,9 +199,10 @@ typedef int (*kbase_hwcnt_backend_dump_get_fn)(
 /**
  * struct kbase_hwcnt_backend_interface - Hardware counter backend virtual
  *                                        interface.
- * @metadata:           Immutable hardware counter metadata.
  * @info:               Immutable info used to initialise an instance of the
  *                      backend.
+ * @metadata:           Function ptr to get the immutable hardware counter
+ *                      metadata.
  * @init:               Function ptr to initialise an instance of the backend.
  * @term:               Function ptr to terminate an instance of the backend.
  * @timestamp_ns:       Function ptr to get the current backend timestamp.
@@ -203,8 +217,8 @@ typedef int (*kbase_hwcnt_backend_dump_get_fn)(
  *                      buffer.
  */
 struct kbase_hwcnt_backend_interface {
-	const struct kbase_hwcnt_metadata *metadata;
 	const struct kbase_hwcnt_backend_info *info;
+	kbase_hwcnt_backend_metadata_fn metadata;
 	kbase_hwcnt_backend_init_fn init;
 	kbase_hwcnt_backend_term_fn term;
 	kbase_hwcnt_backend_timestamp_ns_fn timestamp_ns;
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf.c b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf.c
new file mode 100644
index 000000000000..d9592fd70529
--- /dev/null
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf.c
@@ -0,0 +1,1859 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ *
+ * (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+#include "mali_kbase_hwcnt_backend_csf.h"
+#include "mali_kbase_hwcnt_gpu.h"
+#include "mali_kbase_hwcnt_types.h"
+
+#include <linux/log2.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/wait.h>
+#include <linux/workqueue.h>
+#include <linux/completion.h>
+
+#ifndef BASE_MAX_NR_CLOCKS_REGULATORS
+#define BASE_MAX_NR_CLOCKS_REGULATORS 2
+#endif
+
+/**
+ * enum kbase_hwcnt_backend_csf_dump_state - HWC CSF backend dumping states.
+ *
+ * @KBASE_HWCNT_BACKEND_CSF_DUMP_IDLE: Initial state, or the state if there is
+ * an error.
+ *
+ * @KBASE_HWCNT_BACKEND_CSF_DUMP_REQUESTED: A dump has been requested and we are
+ * waiting for an ACK, this ACK could come from either PRFCNT_ACK,
+ * PROTMODE_ENTER_ACK, or if an error occurs.
+ *
+ * @KBASE_HWCNT_BACKEND_CSF_DUMP_QUERYING_INSERT: Checking the insert
+ * immediately after receiving the ACK, so we know which index corresponds to
+ * the buffer we requested.
+ *
+ * @KBASE_HWCNT_BACKEND_CSF_DUMP_WORKER_LAUNCHED: The insert has been saved and
+ * now we have kicked off the worker.
+ *
+ * @KBASE_HWCNT_BACKEND_CSF_DUMP_ACCUMULATING: The insert has been saved and now
+ * we have kicked off the worker to accumulate up to that insert and then copy
+ * the delta to the user buffer to prepare for dump_get().
+ *
+ * @KBASE_HWCNT_BACKEND_CSF_DUMP_COMPLETED: The dump completed successfully.
+ *
+ * Valid state transitions:
+ * IDLE -> REQUESTED (on dump request)
+ * REQUESTED -> QUERYING_INSERT (on dump ack)
+ * QUERYING_INSERT -> WORKER_LAUNCHED (on worker submission)
+ * WORKER_LAUNCHED -> ACCUMULATING (while the worker is accumulating)
+ * ACCUMULATING -> COMPLETED (on accumulation completion)
+ * COMPLETED -> REQUESTED (on dump request)
+ * COMPLETED -> IDLE (on disable)
+ * ANY -> IDLE (on error)
+ */
+enum kbase_hwcnt_backend_csf_dump_state {
+	KBASE_HWCNT_BACKEND_CSF_DUMP_IDLE,
+	KBASE_HWCNT_BACKEND_CSF_DUMP_REQUESTED,
+	KBASE_HWCNT_BACKEND_CSF_DUMP_QUERYING_INSERT,
+	KBASE_HWCNT_BACKEND_CSF_DUMP_WORKER_LAUNCHED,
+	KBASE_HWCNT_BACKEND_CSF_DUMP_ACCUMULATING,
+	KBASE_HWCNT_BACKEND_CSF_DUMP_COMPLETED,
+};
+
+/**
+ * enum kbase_hwcnt_backend_csf_enable_state - HWC CSF backend enable states.
+ *
+ * @KBASE_HWCNT_BACKEND_CSF_DISABLED: Initial state, and the state when backend
+ * is disabled.
+ *
+ * @KBASE_HWCNT_BACKEND_CSF_TRANSITIONING_TO_ENABLED: Enable request is in
+ * progress, waiting for firmware acknowledgment.
+ *
+ * @KBASE_HWCNT_BACKEND_CSF_ENABLED: Enable request has been acknowledged,
+ * enable is done.
+ *
+ * @KBASE_HWCNT_BACKEND_CSF_TRANSITIONING_TO_DISABLED: Disable request is in
+ * progress, waiting for firmware acknowledgment.
+ *
+ * @KBASE_HWCNT_BACKEND_CSF_DISABLED_WAIT_FOR_WORKER: Disable request has been
+ * acknowledged, waiting for dump workers to be finished.
+ *
+ * @KBASE_HWCNT_BACKEND_CSF_UNRECOVERABLE_ERROR_WAIT_FOR_WORKER: An
+ * unrecoverable error happened, waiting for dump workers to be finished.
+ *
+ * @KBASE_HWCNT_BACKEND_CSF_UNRECOVERABLE_ERROR:  An unrecoverable error
+ * happened, and dump workers have finished, waiting for reset.
+ *
+ * Valid state transitions:
+ * DISABLED -> TRANSITIONING_TO_ENABLED (on enable)
+ * TRANSITIONING_TO_ENABLED -> ENABLED (on enable ack)
+ * ENABLED -> TRANSITIONING_TO_DISABLED (on disable)
+ * TRANSITIONING_TO_DISABLED -> DISABLED_WAIT_FOR_WORKER (on disable ack)
+ * DISABLED_WAIT_FOR_WORKER -> DISABLED (after workers are flushed)
+ * DISABLED -> UNRECOVERABLE_ERROR (on unrecoverable error)
+ * ANY but DISABLED -> UNRECOVERABLE_ERROR_WAIT_FOR_WORKER (on unrecoverable
+ *                                                          error)
+ * UNRECOVERABLE_ERROR -> DISABLED (on before reset)
+ */
+enum kbase_hwcnt_backend_csf_enable_state {
+	KBASE_HWCNT_BACKEND_CSF_DISABLED,
+	KBASE_HWCNT_BACKEND_CSF_TRANSITIONING_TO_ENABLED,
+	KBASE_HWCNT_BACKEND_CSF_ENABLED,
+	KBASE_HWCNT_BACKEND_CSF_TRANSITIONING_TO_DISABLED,
+	KBASE_HWCNT_BACKEND_CSF_DISABLED_WAIT_FOR_WORKER,
+	KBASE_HWCNT_BACKEND_CSF_UNRECOVERABLE_ERROR_WAIT_FOR_WORKER,
+	KBASE_HWCNT_BACKEND_CSF_UNRECOVERABLE_ERROR,
+};
+
+/**
+ * struct kbase_hwcnt_backend_csf_info - Information used to create an instance
+ *                                       of a CSF hardware counter backend.
+ * @backend:                      Pointer to access CSF backend.
+ * @fw_in_protected_mode:         True if FW is running in protected mode, else
+ *                                false.
+ * @unrecoverable_error_happened: True if an recoverable error happened, else
+ *                                false.
+ * @csf_if:                       CSF interface object pointer.
+ * @ring_buf_cnt:                 Dump buffer count in the ring buffer.
+ * @counter_set:                  The performance counter set to use.
+ * @metadata:                     Hardware counter metadata.
+ * @prfcnt_info:                  Performance counter information.
+ */
+struct kbase_hwcnt_backend_csf_info {
+	struct kbase_hwcnt_backend_csf *backend;
+	bool fw_in_protected_mode;
+	bool unrecoverable_error_happened;
+	struct kbase_hwcnt_backend_csf_if *csf_if;
+	u32 ring_buf_cnt;
+	enum kbase_hwcnt_set counter_set;
+	const struct kbase_hwcnt_metadata *metadata;
+	struct kbase_hwcnt_backend_csf_if_prfcnt_info prfcnt_info;
+};
+
+/**
+ * struct kbase_hwcnt_csf_physical_layout - HWC sample memory physical layout
+ *                                          information.
+ * @fe_cnt:             Front end block count.
+ * @tiler_cnt:          Tiler block count.
+ * @mmu_l2_cnt:         Memory system(MMU and L2 cache) block count.
+ * @shader_cnt:         Shader Core block count.
+ * @block_cnt:          Total block count (sum of all other block counts).
+ * @shader_avail_mask:  Bitmap of all shader cores in the system.
+ * @offset_enable_mask: Offset of enable mask in the block.
+ * @headers_per_block:  Header size per block.
+ * @counters_per_block: Counters size per block.
+ * @values_per_block:   Total size per block.
+ */
+struct kbase_hwcnt_csf_physical_layout {
+	size_t fe_cnt;
+	size_t tiler_cnt;
+	size_t mmu_l2_cnt;
+	size_t shader_cnt;
+	size_t block_cnt;
+	u64 shader_avail_mask;
+	size_t offset_enable_mask;
+	size_t headers_per_block;
+	size_t counters_per_block;
+	size_t values_per_block;
+};
+
+/**
+ * struct kbase_hwcnt_backend_csf - Instance of a CSF hardware counter backend.
+ * @info:                       CSF Info used to create the backend.
+ * @dump_state:                 The dumping state of the backend.
+ * @enable_state:               The CSF backend internal enabled state.
+ * @insert_index_to_accumulate: The insert index in the ring buffer which need
+ *                              to accumulate up to.
+ * @enable_state_waitq:         Wait queue object used to notify the enable
+ *                              changing flag is done.
+ * @to_user_buf:                HWC sample buffer for client user.
+ * @accum_buf:                  HWC sample buffer used as an internal
+ *                              accumulator.
+ * @old_sample_buf:             HWC sample buffer to save the previous values
+ *                              for delta calculation.
+ * @ring_buf:                   Opaque pointer for ring buffer object.
+ * @ring_buf_cpu_base:          CPU base address of the allocated ring buffer.
+ * @clk_enable_map:             The enable map specifying enabled clock domains.
+ * @cycle_count_elapsed:        Cycle count elapsed for a given sample period.
+ * @prev_cycle_count:           Previous cycle count to calculate the cycle
+ *                              count for sample period.
+ * @phys_layout:                Physical memory layout information of HWC
+ *                              sample buffer.
+ * @dump_completed:             Completion signaled by the dump worker when
+ *                              it is completed accumulating up to the
+ *                              insert_index_to_accumulate.
+ *                              Should be initialized to the "complete" state.
+ * @hwc_dump_workq:             Single threaded work queue for HWC workers
+ *                              execution.
+ * @hwc_dump_work:              Worker to accumulate samples.
+ * @hwc_threshold_work:         Worker for consuming available samples when
+ *                              threshold interrupt raised.
+ */
+struct kbase_hwcnt_backend_csf {
+	struct kbase_hwcnt_backend_csf_info *info;
+	enum kbase_hwcnt_backend_csf_dump_state dump_state;
+	enum kbase_hwcnt_backend_csf_enable_state enable_state;
+	u32 insert_index_to_accumulate;
+	wait_queue_head_t enable_state_waitq;
+	u32 *to_user_buf;
+	u32 *accum_buf;
+	u32 *old_sample_buf;
+	struct kbase_hwcnt_backend_csf_if_ring_buf *ring_buf;
+	void *ring_buf_cpu_base;
+	u64 clk_enable_map;
+	u64 cycle_count_elapsed[BASE_MAX_NR_CLOCKS_REGULATORS];
+	u64 prev_cycle_count[BASE_MAX_NR_CLOCKS_REGULATORS];
+	struct kbase_hwcnt_csf_physical_layout phys_layout;
+	struct completion dump_completed;
+	struct workqueue_struct *hwc_dump_workq;
+	struct work_struct hwc_dump_work;
+	struct work_struct hwc_threshold_work;
+};
+
+bool kbasep_hwcnt_backend_csf_backend_exists(
+	struct kbase_hwcnt_backend_csf_info *csf_info)
+{
+	WARN_ON(!csf_info);
+	csf_info->csf_if->assert_lock_held(csf_info->csf_if->ctx);
+	return (csf_info->backend != NULL);
+}
+
+/**
+ * kbasep_hwcnt_backend_csf_cc_initial_sample() - Initialize cycle count
+ *                                                tracking.
+ *
+ * @backend_csf: Non-NULL pointer to backend.
+ * @enable_map:  Non-NULL pointer to enable map specifying enabled counters.
+ */
+static void kbasep_hwcnt_backend_csf_cc_initial_sample(
+	struct kbase_hwcnt_backend_csf *backend_csf,
+	const struct kbase_hwcnt_enable_map *enable_map)
+{
+	u64 clk_enable_map = enable_map->clk_enable_map;
+	u64 cycle_counts[BASE_MAX_NR_CLOCKS_REGULATORS];
+	size_t clk;
+
+	/* Read cycle count from CSF interface for both clock domains. */
+	backend_csf->info->csf_if->get_gpu_cycle_count(
+		backend_csf->info->csf_if->ctx, cycle_counts, clk_enable_map);
+
+	kbase_hwcnt_metadata_for_each_clock(enable_map->metadata, clk) {
+		if (kbase_hwcnt_clk_enable_map_enabled(clk_enable_map, clk))
+			backend_csf->prev_cycle_count[clk] = cycle_counts[clk];
+	}
+
+	/* Keep clk_enable_map for dump_request. */
+	backend_csf->clk_enable_map = clk_enable_map;
+}
+
+static void
+kbasep_hwcnt_backend_csf_cc_update(struct kbase_hwcnt_backend_csf *backend_csf)
+{
+	u64 cycle_counts[BASE_MAX_NR_CLOCKS_REGULATORS];
+	size_t clk;
+
+	backend_csf->info->csf_if->assert_lock_held(
+		backend_csf->info->csf_if->ctx);
+
+	backend_csf->info->csf_if->get_gpu_cycle_count(
+		backend_csf->info->csf_if->ctx, cycle_counts,
+		backend_csf->clk_enable_map);
+
+	kbase_hwcnt_metadata_for_each_clock(backend_csf->info->metadata, clk) {
+		if (kbase_hwcnt_clk_enable_map_enabled(
+			    backend_csf->clk_enable_map, clk)) {
+			backend_csf->cycle_count_elapsed[clk] =
+				cycle_counts[clk] -
+				backend_csf->prev_cycle_count[clk];
+			backend_csf->prev_cycle_count[clk] = cycle_counts[clk];
+		}
+	}
+}
+
+/* CSF backend implementation of kbase_hwcnt_backend_timestamp_ns_fn */
+static u64
+kbasep_hwcnt_backend_csf_timestamp_ns(struct kbase_hwcnt_backend *backend)
+{
+	struct kbase_hwcnt_backend_csf *backend_csf =
+		(struct kbase_hwcnt_backend_csf *)backend;
+
+	if (!backend_csf || !backend_csf->info || !backend_csf->info->csf_if)
+		return 0;
+
+	return backend_csf->info->csf_if->timestamp_ns(
+		backend_csf->info->csf_if->ctx);
+}
+
+/** kbasep_hwcnt_backend_csf_process_enable_map() - Process the enable_map to
+ *                                                  guarantee headers are
+ *                                                  enabled if any counter is
+ *                                                  required.
+ *@phys_enable_map: HWC physical enable map to be processed.
+ */
+static void kbasep_hwcnt_backend_csf_process_enable_map(
+	struct kbase_hwcnt_physical_enable_map *phys_enable_map)
+{
+	WARN_ON(!phys_enable_map);
+
+	/* Enable header if any counter is required from user, the header is
+	 * controlled by bit 0 of the enable mask.
+	 */
+	if (phys_enable_map->fe_bm)
+		phys_enable_map->fe_bm |= 1;
+
+	if (phys_enable_map->tiler_bm)
+		phys_enable_map->tiler_bm |= 1;
+
+	if (phys_enable_map->mmu_l2_bm)
+		phys_enable_map->mmu_l2_bm |= 1;
+
+	if (phys_enable_map->shader_bm)
+		phys_enable_map->shader_bm |= 1;
+}
+
+static void kbasep_hwcnt_backend_csf_init_layout(
+	const struct kbase_hwcnt_backend_csf_if_prfcnt_info *prfcnt_info,
+	struct kbase_hwcnt_csf_physical_layout *phys_layout)
+{
+	WARN_ON(!prfcnt_info);
+	WARN_ON(!phys_layout);
+
+	phys_layout->fe_cnt = 1;
+	phys_layout->tiler_cnt = 1;
+	phys_layout->mmu_l2_cnt = prfcnt_info->l2_count;
+	phys_layout->shader_cnt = fls64(prfcnt_info->core_mask);
+	phys_layout->block_cnt = phys_layout->fe_cnt + phys_layout->tiler_cnt +
+				 phys_layout->mmu_l2_cnt +
+				 phys_layout->shader_cnt;
+
+	phys_layout->shader_avail_mask = prfcnt_info->core_mask;
+
+	phys_layout->headers_per_block = KBASE_HWCNT_V5_HEADERS_PER_BLOCK;
+	phys_layout->counters_per_block = KBASE_HWCNT_V5_COUNTERS_PER_BLOCK;
+	phys_layout->values_per_block = KBASE_HWCNT_V5_VALUES_PER_BLOCK;
+	phys_layout->offset_enable_mask = KBASE_HWCNT_V5_PRFCNT_EN_HEADER;
+}
+
+static void kbasep_hwcnt_backend_csf_reset_internal_buffers(
+	struct kbase_hwcnt_backend_csf *backend_csf)
+{
+	memset(backend_csf->to_user_buf, 0,
+	       backend_csf->info->prfcnt_info.dump_bytes);
+	memset(backend_csf->accum_buf, 0,
+	       backend_csf->info->prfcnt_info.dump_bytes);
+	memset(backend_csf->old_sample_buf, 0,
+	       backend_csf->info->prfcnt_info.dump_bytes);
+}
+
+static void kbasep_hwcnt_backend_csf_zero_sample_prfcnt_en_header(
+	struct kbase_hwcnt_backend_csf *backend_csf, u32 *sample)
+{
+	u32 block_idx;
+	const struct kbase_hwcnt_csf_physical_layout *phys_layout;
+	u32 *block_buf;
+
+	phys_layout = &backend_csf->phys_layout;
+
+	for (block_idx = 0; block_idx < phys_layout->block_cnt; block_idx++) {
+		block_buf = sample + block_idx * phys_layout->values_per_block;
+		block_buf[phys_layout->offset_enable_mask] = 0;
+	}
+}
+
+static void kbasep_hwcnt_backend_csf_zero_all_prfcnt_en_header(
+	struct kbase_hwcnt_backend_csf *backend_csf)
+{
+	u32 idx;
+	u32 *sample;
+	char *cpu_dump_base;
+	size_t dump_bytes = backend_csf->info->prfcnt_info.dump_bytes;
+
+	cpu_dump_base = (char *)backend_csf->ring_buf_cpu_base;
+
+	for (idx = 0; idx < backend_csf->info->ring_buf_cnt; idx++) {
+		sample = (u32 *)&cpu_dump_base[idx * dump_bytes];
+		kbasep_hwcnt_backend_csf_zero_sample_prfcnt_en_header(
+			backend_csf, sample);
+	}
+}
+
+static void kbasep_hwcnt_backend_csf_update_user_sample(
+	struct kbase_hwcnt_backend_csf *backend_csf)
+{
+	/* Copy the data into the sample and wait for the user to get it. */
+	memcpy(backend_csf->to_user_buf, backend_csf->accum_buf,
+	       backend_csf->info->prfcnt_info.dump_bytes);
+
+	/* After copied data into user sample, clear the accumulator values to
+	 * prepare for the next accumulator, such as the next request or
+	 * threshold.
+	 */
+	memset(backend_csf->accum_buf, 0,
+	       backend_csf->info->prfcnt_info.dump_bytes);
+}
+
+static void kbasep_hwcnt_backend_csf_accumulate_sample(
+	const struct kbase_hwcnt_csf_physical_layout *phys_layout,
+	size_t dump_bytes, u32 *accum_buf, const u32 *old_sample_buf,
+	const u32 *new_sample_buf, bool clearing_samples)
+{
+	size_t block_idx, ctr_idx;
+	const u32 *old_block = old_sample_buf;
+	const u32 *new_block = new_sample_buf;
+	u32 *acc_block = accum_buf;
+
+	for (block_idx = 0; block_idx < phys_layout->block_cnt; block_idx++) {
+		const u32 old_enable_mask =
+			old_block[phys_layout->offset_enable_mask];
+		const u32 new_enable_mask =
+			new_block[phys_layout->offset_enable_mask];
+
+		if (new_enable_mask == 0) {
+			/* Hardware block was unavailable or we didn't turn on
+			 * any counters. Do nothing.
+			 */
+		} else {
+			/* Hardware block was available and it had some counters
+			 * enabled. We need to update the accumulation buffer.
+			 */
+
+			/* Unconditionally copy the headers. */
+			memcpy(acc_block, new_block,
+			       phys_layout->headers_per_block *
+				       KBASE_HWCNT_VALUE_BYTES);
+
+			/* Accumulate counter samples
+			 *
+			 * When accumulating samples we need to take into
+			 * account whether the counter sampling method involves
+			 * clearing counters back to zero after each sample is
+			 * taken.
+			 *
+			 * The intention for CSF was that all HW should use
+			 * counters which wrap to zero when their maximum value
+			 * is reached. This, combined with non-clearing
+			 * sampling, enables multiple concurrent users to
+			 * request samples without interfering with each other.
+			 *
+			 * However some early HW may not support wrapping
+			 * counters, for these GPUs counters must be cleared on
+			 * sample to avoid loss of data due to counters
+			 * saturating at their maximum value.
+			 */
+			if (!clearing_samples) {
+				if (old_enable_mask == 0) {
+					/* Hardware block was previously
+					 * unavailable. Accumulate the new
+					 * counters only, as we know previous
+					 * values are zeroes.
+					 */
+					for (ctr_idx =
+						     phys_layout
+							     ->headers_per_block;
+					     ctr_idx <
+					     phys_layout->values_per_block;
+					     ctr_idx++) {
+						acc_block[ctr_idx] +=
+							new_block[ctr_idx];
+					}
+				} else {
+					/* Hardware block was previously
+					 * available. Accumulate the delta
+					 * between old and new counter values.
+					 */
+					for (ctr_idx =
+						     phys_layout
+							     ->headers_per_block;
+					     ctr_idx <
+					     phys_layout->values_per_block;
+					     ctr_idx++) {
+						acc_block[ctr_idx] +=
+							new_block[ctr_idx] -
+							old_block[ctr_idx];
+					}
+				}
+			} else {
+				for (ctr_idx = phys_layout->headers_per_block;
+				     ctr_idx < phys_layout->values_per_block;
+				     ctr_idx++) {
+					acc_block[ctr_idx] +=
+						new_block[ctr_idx];
+				}
+			}
+		}
+		old_block += phys_layout->values_per_block;
+		new_block += phys_layout->values_per_block;
+		acc_block += phys_layout->values_per_block;
+	}
+
+	WARN_ON(old_block !=
+		old_sample_buf + dump_bytes / KBASE_HWCNT_VALUE_BYTES);
+	WARN_ON(new_block !=
+		new_sample_buf + dump_bytes / KBASE_HWCNT_VALUE_BYTES);
+	WARN_ON(acc_block != accum_buf + dump_bytes / KBASE_HWCNT_VALUE_BYTES);
+	(void)dump_bytes;
+}
+
+static void kbasep_hwcnt_backend_csf_accumulate_samples(
+	struct kbase_hwcnt_backend_csf *backend_csf, u32 extract_index_to_start,
+	u32 insert_index_to_stop)
+{
+	u32 raw_idx;
+	unsigned long flags;
+	u8 *cpu_dump_base = (u8 *)backend_csf->ring_buf_cpu_base;
+	const size_t ring_buf_cnt = backend_csf->info->ring_buf_cnt;
+	const size_t buf_dump_bytes = backend_csf->info->prfcnt_info.dump_bytes;
+	bool clearing_samples = backend_csf->info->prfcnt_info.clearing_samples;
+	u32 *old_sample_buf = backend_csf->old_sample_buf;
+	u32 *new_sample_buf;
+
+	if (extract_index_to_start == insert_index_to_stop)
+		/* No samples to accumulate. Early out. */
+		return;
+
+	/* Sync all the buffers to CPU side before read the data. */
+	backend_csf->info->csf_if->ring_buf_sync(backend_csf->info->csf_if->ctx,
+						 backend_csf->ring_buf,
+						 extract_index_to_start,
+						 insert_index_to_stop, true);
+
+	/* Consider u32 wrap case, '!=' is used here instead of '<' operator */
+	for (raw_idx = extract_index_to_start; raw_idx != insert_index_to_stop;
+	     raw_idx++) {
+		/* The logical "&" acts as a modulo operation since buf_count
+		 * must be a power of two.
+		 */
+		const u32 buf_idx = raw_idx & (ring_buf_cnt - 1);
+
+		new_sample_buf =
+			(u32 *)&cpu_dump_base[buf_idx * buf_dump_bytes];
+
+		kbasep_hwcnt_backend_csf_accumulate_sample(
+			&backend_csf->phys_layout, buf_dump_bytes,
+			backend_csf->accum_buf, old_sample_buf, new_sample_buf,
+			clearing_samples);
+
+		old_sample_buf = new_sample_buf;
+	}
+
+	/* Save the newest buffer as the old buffer for next time. */
+	memcpy(backend_csf->old_sample_buf, new_sample_buf, buf_dump_bytes);
+
+	/* Reset the prfcnt_en header on each sample before releasing them. */
+	for (raw_idx = extract_index_to_start; raw_idx != insert_index_to_stop;
+	     raw_idx++) {
+		const u32 buf_idx = raw_idx & (ring_buf_cnt - 1);
+		u32 *sample = (u32 *)&cpu_dump_base[buf_idx * buf_dump_bytes];
+
+		kbasep_hwcnt_backend_csf_zero_sample_prfcnt_en_header(
+			backend_csf, sample);
+	}
+
+	/* Sync zeroed buffers to avoid coherency issues on future use. */
+	backend_csf->info->csf_if->ring_buf_sync(backend_csf->info->csf_if->ctx,
+						 backend_csf->ring_buf,
+						 extract_index_to_start,
+						 insert_index_to_stop, false);
+
+	/* After consuming all samples between extract_idx and insert_idx,
+	 * set the raw extract index to insert_idx so that the sample buffers
+	 * can be released back to the ring buffer pool.
+	 */
+	backend_csf->info->csf_if->lock(backend_csf->info->csf_if->ctx, &flags);
+	backend_csf->info->csf_if->set_extract_index(
+		backend_csf->info->csf_if->ctx, insert_index_to_stop);
+	backend_csf->info->csf_if->unlock(backend_csf->info->csf_if->ctx,
+					  flags);
+}
+
+static void kbasep_hwcnt_backend_csf_change_es_and_wake_waiters(
+	struct kbase_hwcnt_backend_csf *backend_csf,
+	enum kbase_hwcnt_backend_csf_enable_state new_state)
+{
+	backend_csf->info->csf_if->assert_lock_held(
+		backend_csf->info->csf_if->ctx);
+
+	if (backend_csf->enable_state != new_state) {
+		backend_csf->enable_state = new_state;
+
+		wake_up(&backend_csf->enable_state_waitq);
+	}
+}
+
+/**
+ * kbasep_hwcnt_backend_csf_dump_worker() - HWC dump worker.
+ * @work: Work structure.
+ *
+ * To accumulate all available samples in the ring buffer when a request has
+ * been done.
+ *
+ */
+static void kbasep_hwcnt_backend_csf_dump_worker(struct work_struct *work)
+{
+	unsigned long flags;
+	struct kbase_hwcnt_backend_csf *backend_csf;
+	u32 insert_index_to_acc;
+	u32 extract_index;
+	u32 insert_index;
+
+	WARN_ON(!work);
+	backend_csf = container_of(work, struct kbase_hwcnt_backend_csf,
+				   hwc_dump_work);
+	backend_csf->info->csf_if->lock(backend_csf->info->csf_if->ctx, &flags);
+	/* Assert the backend is not destroyed. */
+	WARN_ON(backend_csf != backend_csf->info->backend);
+
+	/* The backend was disabled or had an error while the worker was being
+	 * launched.
+	 */
+	if (backend_csf->enable_state != KBASE_HWCNT_BACKEND_CSF_ENABLED) {
+		WARN_ON(backend_csf->dump_state !=
+			KBASE_HWCNT_BACKEND_CSF_DUMP_IDLE);
+		WARN_ON(!completion_done(&backend_csf->dump_completed));
+		backend_csf->info->csf_if->unlock(
+			backend_csf->info->csf_if->ctx, flags);
+		return;
+	}
+
+	WARN_ON(backend_csf->dump_state !=
+		KBASE_HWCNT_BACKEND_CSF_DUMP_WORKER_LAUNCHED);
+
+	backend_csf->dump_state = KBASE_HWCNT_BACKEND_CSF_DUMP_ACCUMULATING;
+	insert_index_to_acc = backend_csf->insert_index_to_accumulate;
+
+	/* Read the raw extract and insert indexes from the CSF interface. */
+	backend_csf->info->csf_if->get_indexes(backend_csf->info->csf_if->ctx,
+					       &extract_index, &insert_index);
+
+	backend_csf->info->csf_if->unlock(backend_csf->info->csf_if->ctx,
+					  flags);
+
+	/* Accumulate up to the insert we grabbed at the prfcnt request
+	 * interrupt.
+	 */
+	kbasep_hwcnt_backend_csf_accumulate_samples(backend_csf, extract_index,
+						    insert_index_to_acc);
+
+	/* Copy to the user buffer so if a threshold interrupt fires
+	 * between now and get(), the accumulations are untouched.
+	 */
+	kbasep_hwcnt_backend_csf_update_user_sample(backend_csf);
+
+	/* Dump done, set state back to COMPLETED for next request. */
+	backend_csf->info->csf_if->lock(backend_csf->info->csf_if->ctx, &flags);
+	/* Assert the backend is not destroyed. */
+	WARN_ON(backend_csf != backend_csf->info->backend);
+
+	/* The backend was disabled or had an error while we were accumulating.
+	 */
+	if (backend_csf->enable_state != KBASE_HWCNT_BACKEND_CSF_ENABLED) {
+		WARN_ON(backend_csf->dump_state !=
+			KBASE_HWCNT_BACKEND_CSF_DUMP_IDLE);
+		WARN_ON(!completion_done(&backend_csf->dump_completed));
+		backend_csf->info->csf_if->unlock(
+			backend_csf->info->csf_if->ctx, flags);
+		return;
+	}
+
+	WARN_ON(backend_csf->dump_state !=
+		KBASE_HWCNT_BACKEND_CSF_DUMP_ACCUMULATING);
+
+	/* Our work here is done - set the wait object and unblock waiters. */
+	backend_csf->dump_state = KBASE_HWCNT_BACKEND_CSF_DUMP_COMPLETED;
+	complete_all(&backend_csf->dump_completed);
+	backend_csf->info->csf_if->unlock(backend_csf->info->csf_if->ctx,
+					  flags);
+}
+
+/**
+ * kbasep_hwcnt_backend_csf_threshold_worker() - Threshold worker.
+ *
+ * @work: Work structure.
+ *
+ * Called when a HWC threshold interrupt raised to consume all available samples
+ * in the ring buffer.
+ */
+static void kbasep_hwcnt_backend_csf_threshold_worker(struct work_struct *work)
+{
+	unsigned long flags;
+	struct kbase_hwcnt_backend_csf *backend_csf;
+	u32 extract_index;
+	u32 insert_index;
+
+	WARN_ON(!work);
+
+	backend_csf = container_of(work, struct kbase_hwcnt_backend_csf,
+				   hwc_threshold_work);
+	backend_csf->info->csf_if->lock(backend_csf->info->csf_if->ctx, &flags);
+
+	/* Assert the backend is not destroyed. */
+	WARN_ON(backend_csf != backend_csf->info->backend);
+
+	/* Read the raw extract and insert indexes from the CSF interface. */
+	backend_csf->info->csf_if->get_indexes(backend_csf->info->csf_if->ctx,
+					       &extract_index, &insert_index);
+
+	/* The backend was disabled or had an error while the worker was being
+	 * launched.
+	 */
+	if (backend_csf->enable_state != KBASE_HWCNT_BACKEND_CSF_ENABLED) {
+		backend_csf->info->csf_if->unlock(
+			backend_csf->info->csf_if->ctx, flags);
+		return;
+	}
+
+	/* Early out if we are not in the IDLE state or COMPLETED state, as this
+	 * means a concurrent dump is in progress and we don't want to
+	 * interfere.
+	 */
+	if ((backend_csf->dump_state != KBASE_HWCNT_BACKEND_CSF_DUMP_IDLE) &&
+	    (backend_csf->dump_state !=
+	     KBASE_HWCNT_BACKEND_CSF_DUMP_COMPLETED)) {
+		backend_csf->info->csf_if->unlock(
+			backend_csf->info->csf_if->ctx, flags);
+		return;
+	}
+	backend_csf->info->csf_if->unlock(backend_csf->info->csf_if->ctx,
+					  flags);
+
+	/* Accumulate everything we possibly can. We grabbed the insert index
+	 * immediately after we acquired the lock but before we checked whether
+	 * a concurrent dump was triggered. This ensures that if a concurrent
+	 * dump was triggered between releasing the lock and now, we know for a
+	 * fact that our insert will not exceed the concurrent dump's
+	 * insert_to_accumulate, so we don't risk accumulating too much data.
+	 */
+	kbasep_hwcnt_backend_csf_accumulate_samples(backend_csf, extract_index,
+						    insert_index);
+
+	/* No need to wake up anything since it is not a user dump request. */
+}
+
+static void kbase_hwcnt_backend_csf_submit_dump_worker(
+	struct kbase_hwcnt_backend_csf_info *csf_info)
+{
+	u32 extract_index;
+
+	WARN_ON(!csf_info);
+	csf_info->csf_if->assert_lock_held(csf_info->csf_if->ctx);
+
+	WARN_ON(!kbasep_hwcnt_backend_csf_backend_exists(csf_info));
+	WARN_ON(csf_info->backend->enable_state !=
+		KBASE_HWCNT_BACKEND_CSF_ENABLED);
+	WARN_ON(csf_info->backend->dump_state !=
+		KBASE_HWCNT_BACKEND_CSF_DUMP_QUERYING_INSERT);
+
+	/* Save insert index now so that the dump worker only accumulates the
+	 * HWC data associated with this request. Extract index is not stored
+	 * as that needs to be checked when accumulating to prevent re-reading
+	 * buffers that have already been read and returned to the GPU.
+	 */
+	csf_info->csf_if->get_indexes(
+		csf_info->csf_if->ctx, &extract_index,
+		&csf_info->backend->insert_index_to_accumulate);
+	csf_info->backend->dump_state =
+		KBASE_HWCNT_BACKEND_CSF_DUMP_WORKER_LAUNCHED;
+
+	/* Submit the accumulator task into the work queue. */
+	queue_work(csf_info->backend->hwc_dump_workq,
+		   &csf_info->backend->hwc_dump_work);
+}
+
+static void kbasep_hwcnt_backend_csf_get_physical_enable(
+	struct kbase_hwcnt_backend_csf *backend_csf,
+	const struct kbase_hwcnt_enable_map *enable_map,
+	struct kbase_hwcnt_backend_csf_if_enable *enable)
+{
+	enum kbase_hwcnt_physical_set phys_counter_set;
+	struct kbase_hwcnt_physical_enable_map phys_enable_map;
+
+	kbase_hwcnt_gpu_enable_map_to_physical(&phys_enable_map, enable_map);
+
+	/* process the enable_map to guarantee the block header is enabled which
+	 * is needed for delta calculation.
+	 */
+	kbasep_hwcnt_backend_csf_process_enable_map(&phys_enable_map);
+
+	kbase_hwcnt_gpu_set_to_physical(&phys_counter_set,
+					backend_csf->info->counter_set);
+
+	/* Use processed enable_map to enable HWC in HW level. */
+	enable->fe_bm = phys_enable_map.fe_bm;
+	enable->shader_bm = phys_enable_map.shader_bm;
+	enable->tiler_bm = phys_enable_map.tiler_bm;
+	enable->mmu_l2_bm = phys_enable_map.mmu_l2_bm;
+	enable->counter_set = phys_counter_set;
+	enable->clk_enable_map = enable_map->clk_enable_map;
+}
+
+/* CSF backend implementation of kbase_hwcnt_backend_dump_enable_nolock_fn */
+static int kbasep_hwcnt_backend_csf_dump_enable_nolock(
+	struct kbase_hwcnt_backend *backend,
+	const struct kbase_hwcnt_enable_map *enable_map)
+{
+	struct kbase_hwcnt_backend_csf *backend_csf =
+		(struct kbase_hwcnt_backend_csf *)backend;
+	struct kbase_hwcnt_backend_csf_if_enable enable;
+
+	if (!backend_csf || !enable_map ||
+	    (enable_map->metadata != backend_csf->info->metadata))
+		return -EINVAL;
+
+	backend_csf->info->csf_if->assert_lock_held(
+		backend_csf->info->csf_if->ctx);
+
+	kbasep_hwcnt_backend_csf_get_physical_enable(backend_csf, enable_map,
+						     &enable);
+
+	/* enable_state should be DISABLED before we transfer it to enabled */
+	if (backend_csf->enable_state != KBASE_HWCNT_BACKEND_CSF_DISABLED)
+		return -EIO;
+
+	backend_csf->dump_state = KBASE_HWCNT_BACKEND_CSF_DUMP_IDLE;
+	WARN_ON(!completion_done(&backend_csf->dump_completed));
+	kbasep_hwcnt_backend_csf_change_es_and_wake_waiters(
+		backend_csf, KBASE_HWCNT_BACKEND_CSF_TRANSITIONING_TO_ENABLED);
+
+	backend_csf->info->csf_if->dump_enable(backend_csf->info->csf_if->ctx,
+					       backend_csf->ring_buf, &enable);
+
+	kbasep_hwcnt_backend_csf_cc_initial_sample(backend_csf, enable_map);
+
+	return 0;
+}
+
+/* CSF backend implementation of kbase_hwcnt_backend_dump_enable_fn */
+static int kbasep_hwcnt_backend_csf_dump_enable(
+	struct kbase_hwcnt_backend *backend,
+	const struct kbase_hwcnt_enable_map *enable_map)
+{
+	int errcode;
+	unsigned long flags;
+	struct kbase_hwcnt_backend_csf *backend_csf =
+		(struct kbase_hwcnt_backend_csf *)backend;
+
+	if (!backend_csf)
+		return -EINVAL;
+
+	backend_csf->info->csf_if->lock(backend_csf->info->csf_if->ctx, &flags);
+	errcode = kbasep_hwcnt_backend_csf_dump_enable_nolock(backend,
+							      enable_map);
+	backend_csf->info->csf_if->unlock(backend_csf->info->csf_if->ctx,
+					  flags);
+	return errcode;
+}
+
+static void kbasep_hwcnt_backend_csf_wait_enable_transition_complete(
+	struct kbase_hwcnt_backend_csf *backend_csf, unsigned long *lock_flags)
+{
+	backend_csf->info->csf_if->assert_lock_held(
+		backend_csf->info->csf_if->ctx);
+
+	while ((backend_csf->enable_state ==
+		KBASE_HWCNT_BACKEND_CSF_TRANSITIONING_TO_ENABLED) ||
+	       (backend_csf->enable_state ==
+		KBASE_HWCNT_BACKEND_CSF_TRANSITIONING_TO_DISABLED)) {
+		backend_csf->info->csf_if->unlock(
+			backend_csf->info->csf_if->ctx, *lock_flags);
+
+		wait_event(
+			backend_csf->enable_state_waitq,
+			(backend_csf->enable_state !=
+			 KBASE_HWCNT_BACKEND_CSF_TRANSITIONING_TO_ENABLED) &&
+				(backend_csf->enable_state !=
+				 KBASE_HWCNT_BACKEND_CSF_TRANSITIONING_TO_DISABLED));
+
+		backend_csf->info->csf_if->lock(backend_csf->info->csf_if->ctx,
+						lock_flags);
+	}
+}
+
+/* CSF backend implementation of kbase_hwcnt_backend_dump_disable_fn */
+static void
+kbasep_hwcnt_backend_csf_dump_disable(struct kbase_hwcnt_backend *backend)
+{
+	unsigned long flags;
+	struct kbase_hwcnt_backend_csf *backend_csf =
+		(struct kbase_hwcnt_backend_csf *)backend;
+	bool do_disable = false;
+
+	WARN_ON(!backend_csf);
+
+	backend_csf->info->csf_if->lock(backend_csf->info->csf_if->ctx, &flags);
+
+	/* Make sure we wait until any previous enable or disable have completed
+	 * before doing anything.
+	 */
+	kbasep_hwcnt_backend_csf_wait_enable_transition_complete(backend_csf,
+								 &flags);
+
+	if (backend_csf->enable_state == KBASE_HWCNT_BACKEND_CSF_DISABLED ||
+	    backend_csf->enable_state ==
+		    KBASE_HWCNT_BACKEND_CSF_UNRECOVERABLE_ERROR) {
+		/* If we are already disabled or in an unrecoverable error
+		 * state, there is nothing for us to do.
+		 */
+		backend_csf->info->csf_if->unlock(
+			backend_csf->info->csf_if->ctx, flags);
+		return;
+	}
+
+	if (backend_csf->enable_state == KBASE_HWCNT_BACKEND_CSF_ENABLED) {
+		kbasep_hwcnt_backend_csf_change_es_and_wake_waiters(
+			backend_csf,
+			KBASE_HWCNT_BACKEND_CSF_TRANSITIONING_TO_DISABLED);
+		backend_csf->dump_state = KBASE_HWCNT_BACKEND_CSF_DUMP_IDLE;
+		complete_all(&backend_csf->dump_completed);
+		/* Only disable if we were previously enabled - in all other
+		 * cases the call to disable will have already been made.
+		 */
+		do_disable = true;
+	}
+
+	WARN_ON(backend_csf->dump_state != KBASE_HWCNT_BACKEND_CSF_DUMP_IDLE);
+	WARN_ON(!completion_done(&backend_csf->dump_completed));
+
+	backend_csf->info->csf_if->unlock(backend_csf->info->csf_if->ctx,
+					  flags);
+
+	/* Block until any async work has completed. We have transitioned out of
+	 * the ENABLED state so we can guarantee no new work will concurrently
+	 * be submitted.
+	 */
+	flush_workqueue(backend_csf->hwc_dump_workq);
+
+	backend_csf->info->csf_if->lock(backend_csf->info->csf_if->ctx, &flags);
+
+	if (do_disable)
+		backend_csf->info->csf_if->dump_disable(
+			backend_csf->info->csf_if->ctx);
+
+	kbasep_hwcnt_backend_csf_wait_enable_transition_complete(backend_csf,
+								 &flags);
+
+	switch (backend_csf->enable_state) {
+	case KBASE_HWCNT_BACKEND_CSF_DISABLED_WAIT_FOR_WORKER:
+		kbasep_hwcnt_backend_csf_change_es_and_wake_waiters(
+			backend_csf, KBASE_HWCNT_BACKEND_CSF_DISABLED);
+		break;
+	case KBASE_HWCNT_BACKEND_CSF_UNRECOVERABLE_ERROR_WAIT_FOR_WORKER:
+		kbasep_hwcnt_backend_csf_change_es_and_wake_waiters(
+			backend_csf,
+			KBASE_HWCNT_BACKEND_CSF_UNRECOVERABLE_ERROR);
+		break;
+	default:
+		WARN_ON(true);
+		break;
+	}
+
+	backend_csf->info->csf_if->unlock(backend_csf->info->csf_if->ctx,
+					  flags);
+
+	/* After disable, zero the header of all buffers in the ring buffer back
+	 * to 0 to prepare for the next enable.
+	 */
+	kbasep_hwcnt_backend_csf_zero_all_prfcnt_en_header(backend_csf);
+
+	/* Sync zeroed buffers to avoid coherency issues on future use. */
+	backend_csf->info->csf_if->ring_buf_sync(
+		backend_csf->info->csf_if->ctx, backend_csf->ring_buf, 0,
+		backend_csf->info->ring_buf_cnt, false);
+
+	/* Reset accumulator, old_sample_buf and user_sample to all-0 to prepare
+	 * for next enable.
+	 */
+	kbasep_hwcnt_backend_csf_reset_internal_buffers(backend_csf);
+}
+
+/* CSF backend implementation of kbase_hwcnt_backend_dump_request_fn */
+static int
+kbasep_hwcnt_backend_csf_dump_request(struct kbase_hwcnt_backend *backend,
+				      u64 *dump_time_ns)
+{
+	unsigned long flags;
+	struct kbase_hwcnt_backend_csf *backend_csf =
+		(struct kbase_hwcnt_backend_csf *)backend;
+	bool do_request = false;
+
+	if (!backend_csf)
+		return -EINVAL;
+
+	backend_csf->info->csf_if->lock(backend_csf->info->csf_if->ctx, &flags);
+
+	/* If we're transitioning to enabled there's nothing to accumulate, and
+	 * the user dump buffer is already zeroed. We can just short circuit to
+	 * the DUMP_COMPLETED state.
+	 */
+	if (backend_csf->enable_state ==
+	    KBASE_HWCNT_BACKEND_CSF_TRANSITIONING_TO_ENABLED) {
+		backend_csf->dump_state =
+			KBASE_HWCNT_BACKEND_CSF_DUMP_COMPLETED;
+		*dump_time_ns = kbasep_hwcnt_backend_csf_timestamp_ns(backend);
+		kbasep_hwcnt_backend_csf_cc_update(backend_csf);
+		backend_csf->info->csf_if->unlock(
+			backend_csf->info->csf_if->ctx, flags);
+		return 0;
+	}
+
+	/* Otherwise, make sure we're already enabled. */
+	if (backend_csf->enable_state != KBASE_HWCNT_BACKEND_CSF_ENABLED) {
+		backend_csf->info->csf_if->unlock(
+			backend_csf->info->csf_if->ctx, flags);
+		return -EIO;
+	}
+
+	/* Make sure that this is either the first request since enable or the
+	 * previous dump has completed, so we can avoid midway through a dump.
+	 */
+	if ((backend_csf->dump_state != KBASE_HWCNT_BACKEND_CSF_DUMP_IDLE) &&
+	    (backend_csf->dump_state !=
+	     KBASE_HWCNT_BACKEND_CSF_DUMP_COMPLETED)) {
+		backend_csf->info->csf_if->unlock(
+			backend_csf->info->csf_if->ctx, flags);
+		/* HWC is disabled or another dump is ongoing, or we are on
+		 * fault.
+		 */
+		return -EIO;
+	}
+
+	/* Reset the completion so dump_wait() has something to wait on. */
+	reinit_completion(&backend_csf->dump_completed);
+
+	if ((backend_csf->enable_state == KBASE_HWCNT_BACKEND_CSF_ENABLED) &&
+	    !backend_csf->info->fw_in_protected_mode) {
+		/* Only do the request if we are fully enabled and not in
+		 * protected mode.
+		 */
+		backend_csf->dump_state =
+			KBASE_HWCNT_BACKEND_CSF_DUMP_REQUESTED;
+		do_request = true;
+	} else {
+		/* Skip the request and waiting for ack and go straight to
+		 * checking the insert and kicking off the worker to do the dump
+		 */
+		backend_csf->dump_state =
+			KBASE_HWCNT_BACKEND_CSF_DUMP_QUERYING_INSERT;
+	}
+
+	/* CSF firmware might enter protected mode now, but still call request.
+	 * That is fine, as we changed state while holding the lock, so the
+	 * protected mode enter function will query the insert and launch the
+	 * dumping worker.
+	 * At some point we will get the dump request ACK saying a dump is done,
+	 * but we can ignore it if we are not in the REQUESTED state and process
+	 * it in next round dumping worker.
+	 */
+
+	*dump_time_ns = kbasep_hwcnt_backend_csf_timestamp_ns(backend);
+	kbasep_hwcnt_backend_csf_cc_update(backend_csf);
+
+	if (do_request)
+		backend_csf->info->csf_if->dump_request(
+			backend_csf->info->csf_if->ctx);
+	else
+		kbase_hwcnt_backend_csf_submit_dump_worker(backend_csf->info);
+
+	backend_csf->info->csf_if->unlock(backend_csf->info->csf_if->ctx,
+					  flags);
+	return 0;
+}
+
+/* CSF backend implementation of kbase_hwcnt_backend_dump_wait_fn */
+static int
+kbasep_hwcnt_backend_csf_dump_wait(struct kbase_hwcnt_backend *backend)
+{
+	unsigned long flags;
+	struct kbase_hwcnt_backend_csf *backend_csf =
+		(struct kbase_hwcnt_backend_csf *)backend;
+	int errcode;
+
+	if (!backend_csf)
+		return -EINVAL;
+
+	wait_for_completion(&backend_csf->dump_completed);
+
+	backend_csf->info->csf_if->lock(backend_csf->info->csf_if->ctx, &flags);
+	/* Make sure the last dump actually succeeded. */
+	errcode = (backend_csf->dump_state ==
+		   KBASE_HWCNT_BACKEND_CSF_DUMP_COMPLETED) ?
+			  0 :
+			  -EIO;
+	backend_csf->info->csf_if->unlock(backend_csf->info->csf_if->ctx,
+					  flags);
+
+	return errcode;
+}
+
+/* CSF backend implementation of kbase_hwcnt_backend_dump_clear_fn */
+static int
+kbasep_hwcnt_backend_csf_dump_clear(struct kbase_hwcnt_backend *backend)
+{
+	struct kbase_hwcnt_backend_csf *backend_csf =
+		(struct kbase_hwcnt_backend_csf *)backend;
+	int errcode;
+	u64 ts;
+
+	if (!backend_csf)
+		return -EINVAL;
+
+	/* Request a dump so we can clear all current counters. */
+	errcode = kbasep_hwcnt_backend_csf_dump_request(backend, &ts);
+	if (!errcode)
+		/* Wait for the manual dump or auto dump to be done and
+		 * accumulator to be updated.
+		 */
+		errcode = kbasep_hwcnt_backend_csf_dump_wait(backend);
+
+	return errcode;
+}
+
+/* CSF backend implementation of kbase_hwcnt_backend_dump_get_fn */
+static int kbasep_hwcnt_backend_csf_dump_get(
+	struct kbase_hwcnt_backend *backend,
+	struct kbase_hwcnt_dump_buffer *dst,
+	const struct kbase_hwcnt_enable_map *dst_enable_map, bool accumulate)
+{
+	struct kbase_hwcnt_backend_csf *backend_csf =
+		(struct kbase_hwcnt_backend_csf *)backend;
+	int ret;
+	size_t clk;
+
+	if (!backend_csf || !dst || !dst_enable_map ||
+	    (backend_csf->info->metadata != dst->metadata) ||
+	    (dst_enable_map->metadata != dst->metadata))
+		return -EINVAL;
+
+	kbase_hwcnt_metadata_for_each_clock(dst_enable_map->metadata, clk) {
+		if (!kbase_hwcnt_clk_enable_map_enabled(
+			    dst_enable_map->clk_enable_map, clk))
+			continue;
+
+		/* Extract elapsed cycle count for each clock domain. */
+		dst->clk_cnt_buf[clk] = backend_csf->cycle_count_elapsed[clk];
+	}
+
+	/* We just return the user buffer without checking the current state,
+	 * as it is undefined to call this function without a prior succeeding
+	 * one to dump_wait().
+	 */
+	ret = kbase_hwcnt_csf_dump_get(dst, backend_csf->to_user_buf,
+				       dst_enable_map, accumulate);
+
+	return ret;
+}
+
+/**
+ * kbasep_hwcnt_backend_csf_destroy() - Destroy CSF backend.
+ * @backend_csf: Pointer to CSF backend to destroy.
+ *
+ * Can be safely called on a backend in any state of partial construction.
+ *
+ */
+static void
+kbasep_hwcnt_backend_csf_destroy(struct kbase_hwcnt_backend_csf *backend_csf)
+{
+	if (!backend_csf)
+		return;
+
+	destroy_workqueue(backend_csf->hwc_dump_workq);
+
+	backend_csf->info->csf_if->ring_buf_free(backend_csf->info->csf_if->ctx,
+						 backend_csf->ring_buf);
+
+	kfree(backend_csf->accum_buf);
+	backend_csf->accum_buf = NULL;
+
+	kfree(backend_csf->old_sample_buf);
+	backend_csf->old_sample_buf = NULL;
+
+	kfree(backend_csf->to_user_buf);
+	backend_csf->to_user_buf = NULL;
+
+	kfree(backend_csf);
+}
+
+/**
+ * kbasep_hwcnt_backend_csf_create() - Create a CSF backend instance.
+ *
+ * @csf_info:    Non-NULL pointer to backend info.
+ * @out_backend: Non-NULL pointer to where backend is stored on success.
+ * Return: 0 on success, else error code.
+ */
+static int
+kbasep_hwcnt_backend_csf_create(struct kbase_hwcnt_backend_csf_info *csf_info,
+				struct kbase_hwcnt_backend_csf **out_backend)
+{
+	struct kbase_hwcnt_backend_csf *backend_csf = NULL;
+	int errcode = -ENOMEM;
+
+	WARN_ON(!csf_info);
+	WARN_ON(!out_backend);
+
+	backend_csf = kzalloc(sizeof(*backend_csf), GFP_KERNEL);
+	if (!backend_csf)
+		goto alloc_error;
+
+	backend_csf->info = csf_info;
+	kbasep_hwcnt_backend_csf_init_layout(&csf_info->prfcnt_info,
+					     &backend_csf->phys_layout);
+
+	backend_csf->accum_buf =
+		kzalloc(csf_info->prfcnt_info.dump_bytes, GFP_KERNEL);
+	if (!backend_csf->accum_buf)
+		goto err_alloc_acc_buf;
+
+	backend_csf->old_sample_buf =
+		kzalloc(csf_info->prfcnt_info.dump_bytes, GFP_KERNEL);
+	if (!backend_csf->old_sample_buf)
+		goto err_alloc_pre_sample_buf;
+
+	backend_csf->to_user_buf =
+		kzalloc(csf_info->prfcnt_info.dump_bytes, GFP_KERNEL);
+	if (!backend_csf->to_user_buf)
+		goto err_alloc_user_sample_buf;
+
+	errcode = csf_info->csf_if->ring_buf_alloc(
+		csf_info->csf_if->ctx, csf_info->ring_buf_cnt,
+		&backend_csf->ring_buf_cpu_base, &backend_csf->ring_buf);
+	if (errcode)
+		goto err_ring_buf_alloc;
+
+	/* Zero all performance enable header to prepare for first enable. */
+	kbasep_hwcnt_backend_csf_zero_all_prfcnt_en_header(backend_csf);
+
+	/* Sync zeroed buffers to avoid coherency issues on use. */
+	backend_csf->info->csf_if->ring_buf_sync(
+		backend_csf->info->csf_if->ctx, backend_csf->ring_buf, 0,
+		backend_csf->info->ring_buf_cnt, false);
+
+	init_completion(&backend_csf->dump_completed);
+
+	init_waitqueue_head(&backend_csf->enable_state_waitq);
+
+	/* Allocate a single threaded work queue for dump worker and threshold
+	 * worker.
+	 */
+	backend_csf->hwc_dump_workq =
+		alloc_workqueue("mali_hwc_dump_wq", WQ_HIGHPRI | WQ_UNBOUND, 1);
+	if (!backend_csf->hwc_dump_workq)
+		goto err_alloc_workqueue;
+
+	INIT_WORK(&backend_csf->hwc_dump_work,
+		  kbasep_hwcnt_backend_csf_dump_worker);
+	INIT_WORK(&backend_csf->hwc_threshold_work,
+		  kbasep_hwcnt_backend_csf_threshold_worker);
+
+	backend_csf->enable_state = KBASE_HWCNT_BACKEND_CSF_DISABLED;
+	backend_csf->dump_state = KBASE_HWCNT_BACKEND_CSF_DUMP_IDLE;
+	complete_all(&backend_csf->dump_completed);
+
+	*out_backend = backend_csf;
+	return 0;
+
+	destroy_workqueue(backend_csf->hwc_dump_workq);
+err_alloc_workqueue:
+	backend_csf->info->csf_if->ring_buf_free(backend_csf->info->csf_if->ctx,
+						 backend_csf->ring_buf);
+err_ring_buf_alloc:
+	kfree(backend_csf->to_user_buf);
+	backend_csf->to_user_buf = NULL;
+err_alloc_user_sample_buf:
+	kfree(backend_csf->old_sample_buf);
+	backend_csf->old_sample_buf = NULL;
+err_alloc_pre_sample_buf:
+	kfree(backend_csf->accum_buf);
+	backend_csf->accum_buf = NULL;
+err_alloc_acc_buf:
+	kfree(backend_csf);
+alloc_error:
+	return errcode;
+}
+
+/* CSF backend implementation of kbase_hwcnt_backend_init_fn */
+static int
+kbasep_hwcnt_backend_csf_init(const struct kbase_hwcnt_backend_info *info,
+			      struct kbase_hwcnt_backend **out_backend)
+{
+	unsigned long flags;
+	struct kbase_hwcnt_backend_csf *backend_csf = NULL;
+	struct kbase_hwcnt_backend_csf_info *csf_info =
+		(struct kbase_hwcnt_backend_csf_info *)info;
+	int errcode;
+	bool success = false;
+
+	if (!info || !out_backend)
+		return -EINVAL;
+
+	/* Create the backend. */
+	errcode = kbasep_hwcnt_backend_csf_create(csf_info, &backend_csf);
+	if (errcode)
+		return errcode;
+
+	/* If it was not created before, attach it to csf_info.
+	 * Use spin lock to avoid concurrent initialization.
+	 */
+	backend_csf->info->csf_if->lock(backend_csf->info->csf_if->ctx, &flags);
+	if (csf_info->backend == NULL) {
+		csf_info->backend = backend_csf;
+		*out_backend = (struct kbase_hwcnt_backend *)backend_csf;
+		success = true;
+		if (csf_info->unrecoverable_error_happened)
+			backend_csf->enable_state =
+				KBASE_HWCNT_BACKEND_CSF_UNRECOVERABLE_ERROR;
+	}
+	backend_csf->info->csf_if->unlock(backend_csf->info->csf_if->ctx,
+					  flags);
+
+	/* Destroy the new created backend if the backend has already created
+	 * before. In normal case, this won't happen if the client call init()
+	 * function properly.
+	 */
+	if (!success) {
+		kbasep_hwcnt_backend_csf_destroy(backend_csf);
+		return -EBUSY;
+	}
+
+	return 0;
+}
+
+/* CSF backend implementation of kbase_hwcnt_backend_term_fn */
+static void kbasep_hwcnt_backend_csf_term(struct kbase_hwcnt_backend *backend)
+{
+	unsigned long flags;
+	struct kbase_hwcnt_backend_csf *backend_csf =
+		(struct kbase_hwcnt_backend_csf *)backend;
+
+	if (!backend)
+		return;
+
+	kbasep_hwcnt_backend_csf_dump_disable(backend);
+
+	/* Set the backend in csf_info to NULL so we won't handle any external
+	 * notification anymore since we are terminating.
+	 */
+	backend_csf->info->csf_if->lock(backend_csf->info->csf_if->ctx, &flags);
+	backend_csf->info->backend = NULL;
+	backend_csf->info->csf_if->unlock(backend_csf->info->csf_if->ctx,
+					  flags);
+
+	kbasep_hwcnt_backend_csf_destroy(backend_csf);
+}
+
+/**
+ * kbasep_hwcnt_backend_csf_info_destroy() - Destroy a CSF backend info.
+ * @info: Pointer to info to destroy.
+ *
+ * Can be safely called on a backend info in any state of partial construction.
+ *
+ */
+static void kbasep_hwcnt_backend_csf_info_destroy(
+	const struct kbase_hwcnt_backend_csf_info *info)
+{
+	if (!info)
+		return;
+
+	/* The backend should be destroyed before the info object destroy. */
+	WARN_ON(info->backend != NULL);
+
+	/* The metadata should be destroyed before the info object destroy. */
+	WARN_ON(info->metadata != NULL);
+
+	kfree(info);
+}
+
+/**
+ * kbasep_hwcnt_backend_csf_info_create() - Create a CSF backend info.
+ *
+ * @csf_if:        Non-NULL pointer to a hwcnt backend CSF interface structure
+ *                 used to create backend interface.
+ * @ring_buf_cnt: The buffer count of the CSF hwcnt backend ring buffer.
+ *                MUST be power of 2.
+ * @out_info:     Non-NULL pointer to where info is stored on success.
+ * @return 0 on success, else error code.
+ */
+static int kbasep_hwcnt_backend_csf_info_create(
+	struct kbase_hwcnt_backend_csf_if *csf_if, u32 ring_buf_cnt,
+	const struct kbase_hwcnt_backend_csf_info **out_info)
+{
+	struct kbase_hwcnt_backend_csf_info *info = NULL;
+
+	WARN_ON(!csf_if);
+	WARN_ON(!out_info);
+	WARN_ON(!is_power_of_2(ring_buf_cnt));
+
+	info = kzalloc(sizeof(*info), GFP_KERNEL);
+	if (!info)
+		return -ENOMEM;
+
+#if defined(CONFIG_MALI_BIFROST_PRFCNT_SET_SECONDARY)
+	info->counter_set = KBASE_HWCNT_SET_SECONDARY;
+#elif defined(CONFIG_MALI_PRFCNT_SET_TERTIARY)
+	info->counter_set = KBASE_HWCNT_SET_TERTIARY;
+#else
+	/* Default to primary */
+	info->counter_set = KBASE_HWCNT_SET_PRIMARY;
+#endif
+
+	info->backend = NULL;
+	info->csf_if = csf_if;
+	info->ring_buf_cnt = ring_buf_cnt;
+	info->fw_in_protected_mode = false;
+	info->unrecoverable_error_happened = false;
+
+	*out_info = info;
+
+	return 0;
+}
+
+/* CSF backend implementation of kbase_hwcnt_backend_metadata_fn */
+static const struct kbase_hwcnt_metadata *
+kbasep_hwcnt_backend_csf_metadata(const struct kbase_hwcnt_backend_info *info)
+{
+	if (!info)
+		return NULL;
+
+	WARN_ON(!((const struct kbase_hwcnt_backend_csf_info *)info)->metadata);
+
+	return ((const struct kbase_hwcnt_backend_csf_info *)info)->metadata;
+}
+
+static void kbasep_hwcnt_backend_csf_handle_unrecoverable_error(
+	struct kbase_hwcnt_backend_csf *backend_csf)
+{
+	bool do_disable = false;
+
+	backend_csf->info->csf_if->assert_lock_held(
+		backend_csf->info->csf_if->ctx);
+
+	/* We are already in or transitioning to the unrecoverable error state.
+	 * Early out.
+	 */
+	if ((backend_csf->enable_state ==
+	     KBASE_HWCNT_BACKEND_CSF_UNRECOVERABLE_ERROR) ||
+	    (backend_csf->enable_state ==
+	     KBASE_HWCNT_BACKEND_CSF_UNRECOVERABLE_ERROR_WAIT_FOR_WORKER))
+		return;
+
+	/* If we are disabled, we know we have no pending workers, so skip the
+	 * waiting state.
+	 */
+	if (backend_csf->enable_state == KBASE_HWCNT_BACKEND_CSF_DISABLED) {
+		kbasep_hwcnt_backend_csf_change_es_and_wake_waiters(
+			backend_csf,
+			KBASE_HWCNT_BACKEND_CSF_UNRECOVERABLE_ERROR);
+		return;
+	}
+
+	/* Trigger a disable only if we are not already transitioning to
+	 * disabled, we don't want to disable twice if an unrecoverable error
+	 * happens while we are disabling.
+	 */
+	do_disable = (backend_csf->enable_state !=
+		      KBASE_HWCNT_BACKEND_CSF_TRANSITIONING_TO_DISABLED);
+
+	kbasep_hwcnt_backend_csf_change_es_and_wake_waiters(
+		backend_csf,
+		KBASE_HWCNT_BACKEND_CSF_UNRECOVERABLE_ERROR_WAIT_FOR_WORKER);
+
+	/* Transition the dump to the IDLE state and unblock any waiters. The
+	 * IDLE state signifies an error.
+	 */
+	backend_csf->dump_state = KBASE_HWCNT_BACKEND_CSF_DUMP_IDLE;
+	complete_all(&backend_csf->dump_completed);
+
+	/* Trigger a disable only if we are not already transitioning to
+	 * disabled, - we don't want to disable twice if an unrecoverable error
+	 * happens while we are disabling.
+	 */
+	if (do_disable)
+		backend_csf->info->csf_if->dump_disable(
+			backend_csf->info->csf_if->ctx);
+}
+
+static void kbasep_hwcnt_backend_csf_handle_recoverable_error(
+	struct kbase_hwcnt_backend_csf *backend_csf)
+{
+	backend_csf->info->csf_if->assert_lock_held(
+		backend_csf->info->csf_if->ctx);
+
+	switch (backend_csf->enable_state) {
+	case KBASE_HWCNT_BACKEND_CSF_DISABLED:
+	case KBASE_HWCNT_BACKEND_CSF_DISABLED_WAIT_FOR_WORKER:
+	case KBASE_HWCNT_BACKEND_CSF_TRANSITIONING_TO_DISABLED:
+	case KBASE_HWCNT_BACKEND_CSF_UNRECOVERABLE_ERROR:
+	case KBASE_HWCNT_BACKEND_CSF_UNRECOVERABLE_ERROR_WAIT_FOR_WORKER:
+		/* Already disabled or disabling, or in an unrecoverable error.
+		 * Nothing to be done to handle the error.
+		 */
+		return;
+	case KBASE_HWCNT_BACKEND_CSF_TRANSITIONING_TO_ENABLED:
+		/* A seemingly recoverable error that occurs while we are
+		 * transitioning to enabled is probably unrecoverable.
+		 */
+		kbasep_hwcnt_backend_csf_handle_unrecoverable_error(
+			backend_csf);
+		return;
+	case KBASE_HWCNT_BACKEND_CSF_ENABLED:
+		/* Start transitioning to the disabled state. We can't wait for
+		 * it as this recoverable error might be triggered from an
+		 * interrupt. The wait will be done in the eventual call to
+		 * disable().
+		 */
+		kbasep_hwcnt_backend_csf_change_es_and_wake_waiters(
+			backend_csf,
+			KBASE_HWCNT_BACKEND_CSF_TRANSITIONING_TO_DISABLED);
+		/* Transition the dump to the IDLE state and unblock any
+		 * waiters. The IDLE state signifies an error.
+		 */
+		backend_csf->dump_state = KBASE_HWCNT_BACKEND_CSF_DUMP_IDLE;
+		complete_all(&backend_csf->dump_completed);
+
+		backend_csf->info->csf_if->dump_disable(
+			backend_csf->info->csf_if->ctx);
+		return;
+	}
+}
+
+void kbase_hwcnt_backend_csf_protm_entered(
+	struct kbase_hwcnt_backend_interface *iface)
+{
+	struct kbase_hwcnt_backend_csf_info *csf_info =
+		(struct kbase_hwcnt_backend_csf_info *)iface->info;
+
+	csf_info->csf_if->assert_lock_held(csf_info->csf_if->ctx);
+	csf_info->fw_in_protected_mode = true;
+
+	/* Call on_prfcnt_sample() to trigger collection of the protected mode
+	 * entry auto-sample if there is currently a pending dump request.
+	 */
+	kbase_hwcnt_backend_csf_on_prfcnt_sample(iface);
+}
+
+void kbase_hwcnt_backend_csf_protm_exited(
+	struct kbase_hwcnt_backend_interface *iface)
+{
+	struct kbase_hwcnt_backend_csf_info *csf_info;
+
+	csf_info = (struct kbase_hwcnt_backend_csf_info *)iface->info;
+
+	csf_info->csf_if->assert_lock_held(csf_info->csf_if->ctx);
+	csf_info->fw_in_protected_mode = false;
+}
+
+void kbase_hwcnt_backend_csf_on_unrecoverable_error(
+	struct kbase_hwcnt_backend_interface *iface)
+{
+	unsigned long flags;
+	struct kbase_hwcnt_backend_csf_info *csf_info;
+
+	csf_info = (struct kbase_hwcnt_backend_csf_info *)iface->info;
+
+	csf_info->csf_if->lock(csf_info->csf_if->ctx, &flags);
+	csf_info->unrecoverable_error_happened = true;
+	/* Early out if the backend does not exist. */
+	if (!kbasep_hwcnt_backend_csf_backend_exists(csf_info)) {
+		csf_info->csf_if->unlock(csf_info->csf_if->ctx, flags);
+		return;
+	}
+
+	kbasep_hwcnt_backend_csf_handle_unrecoverable_error(csf_info->backend);
+
+	csf_info->csf_if->unlock(csf_info->csf_if->ctx, flags);
+}
+
+void kbase_hwcnt_backend_csf_on_before_reset(
+	struct kbase_hwcnt_backend_interface *iface)
+{
+	unsigned long flags;
+	struct kbase_hwcnt_backend_csf_info *csf_info;
+	struct kbase_hwcnt_backend_csf *backend_csf;
+
+	csf_info = (struct kbase_hwcnt_backend_csf_info *)iface->info;
+
+	csf_info->csf_if->lock(csf_info->csf_if->ctx, &flags);
+	csf_info->unrecoverable_error_happened = false;
+	/* Early out if the backend does not exist. */
+	if (!kbasep_hwcnt_backend_csf_backend_exists(csf_info)) {
+		csf_info->csf_if->unlock(csf_info->csf_if->ctx, flags);
+		return;
+	}
+	backend_csf = csf_info->backend;
+
+	if ((backend_csf->enable_state != KBASE_HWCNT_BACKEND_CSF_DISABLED) &&
+	    (backend_csf->enable_state !=
+	     KBASE_HWCNT_BACKEND_CSF_UNRECOVERABLE_ERROR)) {
+		/* Before a reset occurs, we must either have been disabled
+		 * (else we lose data) or we should have encountered an
+		 * unrecoverable error. Either way, we will have disabled the
+		 * interface and waited for any workers that might have still
+		 * been in flight.
+		 * If not in these states, fire off one more disable to make
+		 * sure everything is turned off before the power is pulled.
+		 * We can't wait for this disable to complete, but it doesn't
+		 * really matter, the power is being pulled.
+		 */
+		kbasep_hwcnt_backend_csf_handle_unrecoverable_error(
+			csf_info->backend);
+	}
+
+	/* A reset is the only way to exit the unrecoverable error state */
+	if (backend_csf->enable_state ==
+	    KBASE_HWCNT_BACKEND_CSF_UNRECOVERABLE_ERROR) {
+		kbasep_hwcnt_backend_csf_change_es_and_wake_waiters(
+			backend_csf, KBASE_HWCNT_BACKEND_CSF_DISABLED);
+	}
+
+	csf_info->csf_if->unlock(csf_info->csf_if->ctx, flags);
+}
+
+void kbase_hwcnt_backend_csf_on_prfcnt_sample(
+	struct kbase_hwcnt_backend_interface *iface)
+{
+	struct kbase_hwcnt_backend_csf_info *csf_info;
+	struct kbase_hwcnt_backend_csf *backend_csf;
+
+	csf_info = (struct kbase_hwcnt_backend_csf_info *)iface->info;
+	csf_info->csf_if->assert_lock_held(csf_info->csf_if->ctx);
+
+	/* Early out if the backend does not exist. */
+	if (!kbasep_hwcnt_backend_csf_backend_exists(csf_info))
+		return;
+	backend_csf = csf_info->backend;
+
+	/* If the current state is not REQUESTED, this HWC sample will be
+	 * skipped and processed in next dump_request.
+	 */
+	if (backend_csf->dump_state != KBASE_HWCNT_BACKEND_CSF_DUMP_REQUESTED)
+		return;
+	backend_csf->dump_state = KBASE_HWCNT_BACKEND_CSF_DUMP_QUERYING_INSERT;
+
+	kbase_hwcnt_backend_csf_submit_dump_worker(csf_info);
+}
+
+void kbase_hwcnt_backend_csf_on_prfcnt_threshold(
+	struct kbase_hwcnt_backend_interface *iface)
+{
+	struct kbase_hwcnt_backend_csf_info *csf_info;
+	struct kbase_hwcnt_backend_csf *backend_csf;
+
+	csf_info = (struct kbase_hwcnt_backend_csf_info *)iface->info;
+	csf_info->csf_if->assert_lock_held(csf_info->csf_if->ctx);
+
+	/* Early out if the backend does not exist. */
+	if (!kbasep_hwcnt_backend_csf_backend_exists(csf_info))
+		return;
+	backend_csf = csf_info->backend;
+
+	if (backend_csf->enable_state == KBASE_HWCNT_BACKEND_CSF_ENABLED)
+		/* Submit the threshold work into the work queue to consume the
+		 * available samples.
+		 */
+		queue_work(backend_csf->hwc_dump_workq,
+			   &backend_csf->hwc_threshold_work);
+}
+
+void kbase_hwcnt_backend_csf_on_prfcnt_overflow(
+	struct kbase_hwcnt_backend_interface *iface)
+{
+	struct kbase_hwcnt_backend_csf_info *csf_info;
+
+	csf_info = (struct kbase_hwcnt_backend_csf_info *)iface->info;
+	csf_info->csf_if->assert_lock_held(csf_info->csf_if->ctx);
+
+	/* Early out if the backend does not exist. */
+	if (!kbasep_hwcnt_backend_csf_backend_exists(csf_info))
+		return;
+
+	/* Called when an overflow occurs. We treat this as a recoverable error,
+	 * so we start transitioning to the disabled state.
+	 * We could try and handle it while enabled, but in a real system we
+	 * never expect an overflow to occur so there is no point implementing
+	 * complex recovery code when we can just turn ourselves off instead for
+	 * a while.
+	 */
+	kbasep_hwcnt_backend_csf_handle_recoverable_error(csf_info->backend);
+}
+
+void kbase_hwcnt_backend_csf_on_prfcnt_enable(
+	struct kbase_hwcnt_backend_interface *iface)
+{
+	struct kbase_hwcnt_backend_csf_info *csf_info;
+	struct kbase_hwcnt_backend_csf *backend_csf;
+
+	csf_info = (struct kbase_hwcnt_backend_csf_info *)iface->info;
+	csf_info->csf_if->assert_lock_held(csf_info->csf_if->ctx);
+
+	/* Early out if the backend does not exist. */
+	if (!kbasep_hwcnt_backend_csf_backend_exists(csf_info))
+		return;
+	backend_csf = csf_info->backend;
+
+	if (backend_csf->enable_state ==
+	    KBASE_HWCNT_BACKEND_CSF_TRANSITIONING_TO_ENABLED) {
+		kbasep_hwcnt_backend_csf_change_es_and_wake_waiters(
+			backend_csf, KBASE_HWCNT_BACKEND_CSF_ENABLED);
+	} else if (backend_csf->enable_state ==
+		   KBASE_HWCNT_BACKEND_CSF_ENABLED) {
+		/* Unexpected, but we are already in the right state so just
+		 * ignore it.
+		 */
+	} else {
+		/* Unexpected state change, assume everything is broken until
+		 * we reset.
+		 */
+		kbasep_hwcnt_backend_csf_handle_unrecoverable_error(
+			csf_info->backend);
+	}
+}
+
+void kbase_hwcnt_backend_csf_on_prfcnt_disable(
+	struct kbase_hwcnt_backend_interface *iface)
+{
+	struct kbase_hwcnt_backend_csf_info *csf_info;
+	struct kbase_hwcnt_backend_csf *backend_csf;
+
+	csf_info = (struct kbase_hwcnt_backend_csf_info *)iface->info;
+	csf_info->csf_if->assert_lock_held(csf_info->csf_if->ctx);
+
+	/* Early out if the backend does not exist. */
+	if (!kbasep_hwcnt_backend_csf_backend_exists(csf_info))
+		return;
+	backend_csf = csf_info->backend;
+
+	if (backend_csf->enable_state ==
+	    KBASE_HWCNT_BACKEND_CSF_TRANSITIONING_TO_DISABLED) {
+		kbasep_hwcnt_backend_csf_change_es_and_wake_waiters(
+			backend_csf,
+			KBASE_HWCNT_BACKEND_CSF_DISABLED_WAIT_FOR_WORKER);
+	} else if (backend_csf->enable_state ==
+		   KBASE_HWCNT_BACKEND_CSF_DISABLED) {
+		/* Unexpected, but we are already in the right state so just
+		 * ignore it.
+		 */
+	} else {
+		/* Unexpected state change, assume everything is broken until
+		 * we reset.
+		 */
+		kbasep_hwcnt_backend_csf_handle_unrecoverable_error(
+			csf_info->backend);
+	}
+}
+
+int kbase_hwcnt_backend_csf_metadata_init(
+	struct kbase_hwcnt_backend_interface *iface)
+{
+	int errcode;
+	struct kbase_hwcnt_backend_csf_info *csf_info;
+	struct kbase_hwcnt_gpu_info gpu_info;
+
+	if (!iface)
+		return -EINVAL;
+
+	csf_info = (struct kbase_hwcnt_backend_csf_info *)iface->info;
+
+	WARN_ON(!csf_info->csf_if->get_prfcnt_info);
+
+	csf_info->csf_if->get_prfcnt_info(csf_info->csf_if->ctx,
+					  &csf_info->prfcnt_info);
+
+	/* The clock domain counts should not exceed the number of maximum
+	 * number of clock regulators.
+	 */
+	if (csf_info->prfcnt_info.clk_cnt > BASE_MAX_NR_CLOCKS_REGULATORS)
+		return -EIO;
+
+	gpu_info.l2_count = csf_info->prfcnt_info.l2_count;
+	gpu_info.core_mask = csf_info->prfcnt_info.core_mask;
+	gpu_info.clk_cnt = csf_info->prfcnt_info.clk_cnt;
+	errcode = kbase_hwcnt_csf_metadata_create(
+		&gpu_info, csf_info->counter_set, &csf_info->metadata);
+	if (errcode)
+		return errcode;
+
+	/*
+	 * Dump abstraction size should be exactly the same size and layout as
+	 * the physical dump size, for backwards compatibility.
+	 */
+	WARN_ON(csf_info->prfcnt_info.dump_bytes !=
+		csf_info->metadata->dump_buf_bytes);
+
+	return 0;
+}
+
+void kbase_hwcnt_backend_csf_metadata_term(
+	struct kbase_hwcnt_backend_interface *iface)
+{
+	struct kbase_hwcnt_backend_csf_info *csf_info;
+
+	if (!iface)
+		return;
+
+	csf_info = (struct kbase_hwcnt_backend_csf_info *)iface->info;
+	if (csf_info->metadata) {
+		kbase_hwcnt_csf_metadata_destroy(csf_info->metadata);
+		csf_info->metadata = NULL;
+	}
+}
+
+int kbase_hwcnt_backend_csf_create(struct kbase_hwcnt_backend_csf_if *csf_if,
+				   u32 ring_buf_cnt,
+				   struct kbase_hwcnt_backend_interface *iface)
+{
+	int errcode;
+	const struct kbase_hwcnt_backend_csf_info *info = NULL;
+
+	if (!iface || !csf_if)
+		return -EINVAL;
+
+	/* The buffer count must be power of 2 */
+	if (!is_power_of_2(ring_buf_cnt))
+		return -EINVAL;
+
+	errcode = kbasep_hwcnt_backend_csf_info_create(csf_if, ring_buf_cnt,
+						       &info);
+	if (errcode)
+		return errcode;
+
+	iface->info = (struct kbase_hwcnt_backend_info *)info;
+	iface->metadata = kbasep_hwcnt_backend_csf_metadata;
+	iface->init = kbasep_hwcnt_backend_csf_init;
+	iface->term = kbasep_hwcnt_backend_csf_term;
+	iface->timestamp_ns = kbasep_hwcnt_backend_csf_timestamp_ns;
+	iface->dump_enable = kbasep_hwcnt_backend_csf_dump_enable;
+	iface->dump_enable_nolock = kbasep_hwcnt_backend_csf_dump_enable_nolock;
+	iface->dump_disable = kbasep_hwcnt_backend_csf_dump_disable;
+	iface->dump_clear = kbasep_hwcnt_backend_csf_dump_clear;
+	iface->dump_request = kbasep_hwcnt_backend_csf_dump_request;
+	iface->dump_wait = kbasep_hwcnt_backend_csf_dump_wait;
+	iface->dump_get = kbasep_hwcnt_backend_csf_dump_get;
+
+	return 0;
+}
+
+void kbase_hwcnt_backend_csf_destroy(struct kbase_hwcnt_backend_interface *iface)
+{
+	if (!iface)
+		return;
+
+	kbasep_hwcnt_backend_csf_info_destroy(
+		(const struct kbase_hwcnt_backend_csf_info *)iface->info);
+	memset(iface, 0, sizeof(*iface));
+}
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf.h
new file mode 100644
index 000000000000..75062744753a
--- /dev/null
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf.h
@@ -0,0 +1,162 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ *
+ * (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+/**
+ * Concrete implementation of mali_kbase_hwcnt_backend interface for CSF
+ * backend.
+ */
+
+#ifndef _KBASE_HWCNT_BACKEND_CSF_H_
+#define _KBASE_HWCNT_BACKEND_CSF_H_
+
+#include "mali_kbase_hwcnt_backend.h"
+#include "mali_kbase_hwcnt_backend_csf_if.h"
+
+/**
+ * kbase_hwcnt_backend_csf_create() - Create a CSF hardware counter backend
+ *                                    interface.
+ * @csf_if:       Non-NULL pointer to a hwcnt backend CSF interface structure
+ *                used to create backend interface.
+ * @ring_buf_cnt: The buffer count of CSF hwcnt backend, used when allocate ring
+ *                buffer, MUST be power of 2.
+ * @iface:        Non-NULL pointer to backend interface structure that is filled
+ *                in on creation success.
+ *
+ * Calls to iface->dump_enable_nolock() require the CSF Scheduler IRQ lock.
+ *
+ * Return: 0 on success, else error code.
+ */
+int kbase_hwcnt_backend_csf_create(struct kbase_hwcnt_backend_csf_if *csf_if,
+				   u32 ring_buf_cnt,
+				   struct kbase_hwcnt_backend_interface *iface);
+
+/**
+ * kbase_hwcnt_backend_csf_metadata_init() - Initialize the metadata for a CSF
+ *                                           hardware counter backend.
+ * @iface: Non-NULL pointer to backend interface structure
+ * Return: 0 on success, else error code.
+ */
+int kbase_hwcnt_backend_csf_metadata_init(
+	struct kbase_hwcnt_backend_interface *iface);
+
+/**
+ * kbase_hwcnt_backend_csf_metadata_term() - Terminate the metadata for a CSF
+ *                                           hardware counter backend.
+ * @iface: Non-NULL pointer to backend interface structure.
+ */
+void kbase_hwcnt_backend_csf_metadata_term(
+	struct kbase_hwcnt_backend_interface *iface);
+
+/**
+ * kbase_hwcnt_backend_csf_destroy() - Destroy a CSF hardware counter backend
+ *                                     interface.
+ * @iface: Pointer to interface to destroy.
+ *
+ * Can be safely called on an all-zeroed interface, or on an already destroyed
+ * interface.
+ */
+void kbase_hwcnt_backend_csf_destroy(
+	struct kbase_hwcnt_backend_interface *iface);
+
+/**
+ * kbase_hwcnt_backend_csf_protm_entered() - CSF HWC backend function to receive
+ *                                           notification that protected mode
+ *                                           has been entered.
+ * @iface: Non-NULL pointer to HWC backend interface.
+ */
+void kbase_hwcnt_backend_csf_protm_entered(
+	struct kbase_hwcnt_backend_interface *iface);
+
+/**
+ * kbase_hwcnt_backend_csf_protm_exited() - CSF HWC backend function to receive
+ *                                          notification that protected mode has
+ *                                          been exited.
+ * @iface: Non-NULL pointer to HWC backend interface.
+ */
+void kbase_hwcnt_backend_csf_protm_exited(
+	struct kbase_hwcnt_backend_interface *iface);
+
+/**
+ * kbase_hwcnt_backend_csf_on_unrecoverable_error() - CSF HWC backend function
+ *                                                    called when unrecoverable
+ *                                                    errors are detected.
+ * @iface: Non-NULL pointer to HWC backend interface.
+ *
+ * This should be called on encountering errors that can only be recovered from
+ * with reset, or that may put HWC logic in state that could result in hang. For
+ * example, on bus error, or when FW becomes unresponsive.
+ */
+void kbase_hwcnt_backend_csf_on_unrecoverable_error(
+	struct kbase_hwcnt_backend_interface *iface);
+
+/**
+ * kbase_hwcnt_backend_csf_on_before_reset() - CSF HWC backend function to be
+ *                                             called immediately before a
+ *                                             reset. Takes us out of the
+ *                                             unrecoverable error state, if we
+ *                                             were in it.
+ * @iface: Non-NULL pointer to HWC backend interface.
+ */
+void kbase_hwcnt_backend_csf_on_before_reset(
+	struct kbase_hwcnt_backend_interface *iface);
+
+/**
+ * kbase_hwcnt_backend_csf_on_prfcnt_sample() - CSF performance counter sample
+ *                                              complete interrupt handler.
+ * @iface: Non-NULL pointer to HWC backend interface.
+ */
+void kbase_hwcnt_backend_csf_on_prfcnt_sample(
+	struct kbase_hwcnt_backend_interface *iface);
+
+/**
+ * kbase_hwcnt_backend_csf_on_prfcnt_threshold() - CSF performance counter
+ *                                                 buffer reach threshold
+ *                                                 interrupt handler.
+ * @iface: Non-NULL pointer to HWC backend interface.
+ */
+void kbase_hwcnt_backend_csf_on_prfcnt_threshold(
+	struct kbase_hwcnt_backend_interface *iface);
+
+/**
+ * kbase_hwcnt_backend_csf_on_prfcnt_overflow() - CSF performance counter buffer
+ *                                                overflow interrupt handler.
+ * @iface: Non-NULL pointer to HWC backend interface.
+ */
+void kbase_hwcnt_backend_csf_on_prfcnt_overflow(
+	struct kbase_hwcnt_backend_interface *iface);
+
+/**
+ * kbase_hwcnt_backend_csf_on_prfcnt_enable() - CSF performance counter enabled
+ *                                              interrupt handler.
+ * @iface: Non-NULL pointer to HWC backend interface.
+ */
+void kbase_hwcnt_backend_csf_on_prfcnt_enable(
+	struct kbase_hwcnt_backend_interface *iface);
+
+/**
+ * kbase_hwcnt_backend_csf_on_prfcnt_disable() - CSF performance counter
+ *                                               disabled interrupt handler.
+ * @iface: Non-NULL pointer to HWC backend interface.
+ */
+void kbase_hwcnt_backend_csf_on_prfcnt_disable(
+	struct kbase_hwcnt_backend_interface *iface);
+
+#endif /* _KBASE_HWCNT_BACKEND_CSF_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf_if.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf_if.h
new file mode 100644
index 000000000000..b4ddd31d3cb0
--- /dev/null
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf_if.h
@@ -0,0 +1,307 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ *
+ * (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+/*
+ * Virtual interface for CSF hardware counter backend.
+ */
+
+#ifndef _KBASE_HWCNT_BACKEND_CSF_IF_H_
+#define _KBASE_HWCNT_BACKEND_CSF_IF_H_
+
+#include <linux/types.h>
+
+/**
+ * struct kbase_hwcnt_backend_csf_if_ctx - Opaque pointer to a CSF interface
+ *                                         context.
+ */
+struct kbase_hwcnt_backend_csf_if_ctx;
+
+/**
+ * struct kbase_hwcnt_backend_csf_if_ring_buf - Opaque pointer to a CSF
+ *                                              interface ring buffer.
+ */
+struct kbase_hwcnt_backend_csf_if_ring_buf;
+
+/**
+ * struct kbase_hwcnt_backend_csf_if_enable - enable hardware counter collection
+ *                                            structure.
+ * @fe_bm:          Front End counters selection bitmask.
+ * @shader_bm:      Shader counters selection bitmask.
+ * @tiler_bm:       Tiler counters selection bitmask.
+ * @mmu_l2_bm:      MMU_L2 counters selection bitmask.
+ * @counter_set:    The performance counter set to enable.
+ * @clk_enable_map: An array of u64 bitfields, each bit of which enables cycle
+ *                  counter for a given clock domain.
+ */
+struct kbase_hwcnt_backend_csf_if_enable {
+	u32 fe_bm;
+	u32 shader_bm;
+	u32 tiler_bm;
+	u32 mmu_l2_bm;
+	u8 counter_set;
+	u64 clk_enable_map;
+};
+
+/**
+ * struct kbase_hwcnt_backend_csf_if_prfcnt_info - Performance counter
+ *                                                 information.
+ * @dump_bytes:       Bytes of GPU memory required to perform a performance
+ *                    counter dump.
+ * @l2_count:         The MMU L2 cache count.
+ * @core_mask:        Shader core mask.
+ * @clk_cnt:          Clock domain count in the system.
+ * @clearing_samples: Indicates whether counters are cleared after each sample
+ *                    is taken.
+ */
+struct kbase_hwcnt_backend_csf_if_prfcnt_info {
+	size_t dump_bytes;
+	size_t l2_count;
+	u64 core_mask;
+	u8 clk_cnt;
+	bool clearing_samples;
+};
+
+/**
+ * typedef kbase_hwcnt_backend_csf_if_assert_lock_held_fn - Assert that the
+ *                                                          backend spinlock is
+ *                                                          held.
+ * @ctx: Non-NULL pointer to a CSF context.
+ */
+typedef void (*kbase_hwcnt_backend_csf_if_assert_lock_held_fn)(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx);
+
+/**
+ * typedef kbase_hwcnt_backend_csf_if_lock_fn - Acquire backend spinlock.
+ *
+ * @ctx:   Non-NULL pointer to a CSF context.
+ * @flags: Pointer to the memory location that would store the previous
+ *         interrupt state.
+ */
+typedef void (*kbase_hwcnt_backend_csf_if_lock_fn)(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx, unsigned long *flags);
+
+/**
+ * typedef kbase_hwcnt_backend_csf_if_unlock_fn - Release backend spinlock.
+ *
+ * @ctx:   Non-NULL pointer to a CSF context.
+ * @flags: Previously stored interrupt state when Scheduler interrupt
+ *         spinlock was acquired.
+ */
+typedef void (*kbase_hwcnt_backend_csf_if_unlock_fn)(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx, unsigned long flags);
+
+/**
+ * typedef kbase_hwcnt_backend_csf_if_get_prfcnt_info_fn - Get performance
+ *                                                         counter information.
+ * @ctx:          Non-NULL pointer to a CSF context.
+ * @prfcnt_info:  Non-NULL pointer to struct where performance counter
+ *                information should be stored.
+ */
+typedef void (*kbase_hwcnt_backend_csf_if_get_prfcnt_info_fn)(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx,
+	struct kbase_hwcnt_backend_csf_if_prfcnt_info *prfcnt_info);
+
+/**
+ * typedef kbase_hwcnt_backend_csf_if_ring_buf_alloc_fn - Allocate a ring buffer
+ *                                                        for CSF interface.
+ * @ctx:           Non-NULL pointer to a CSF context.
+ * @buf_count:     The buffer count in the ring buffer to be allocated,
+ *                 MUST be power of 2.
+ * @cpu_dump_base: Non-NULL pointer to where ring buffer CPU base address is
+ *                 stored when success.
+ * @ring_buf:      Non-NULL pointer to where ring buffer is stored when success.
+ *
+ * A ring buffer is needed by the CSF interface to do manual HWC sample and
+ * automatic HWC samples, the buffer count in the ring buffer MUST be power
+ * of 2 to meet the hardware requirement.
+ *
+ * Return: 0 on success, else error code.
+ */
+typedef int (*kbase_hwcnt_backend_csf_if_ring_buf_alloc_fn)(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx, u32 buf_count,
+	void **cpu_dump_base,
+	struct kbase_hwcnt_backend_csf_if_ring_buf **ring_buf);
+
+/**
+ * typedef kbase_hwcnt_backend_csf_if_ring_buf_sync_fn - Sync HWC dump buffers
+ *                                                       memory.
+ * @ctx:             Non-NULL pointer to a CSF context.
+ * @ring_buf:        Non-NULL pointer to the ring buffer.
+ * @buf_index_first: The first buffer index in the ring buffer to be synced,
+ *                   inclusive.
+ * @buf_index_last:  The last buffer index in the ring buffer to be synced,
+ *                   exclusive.
+ * @for_cpu:         The direction of sync to be applied, set to true when CPU
+ *                   cache needs invalidating before reading the buffer, and set
+ *                   to false after CPU writes to flush these before this memory
+ *                   is overwritten by the GPU.
+ *
+ * Flush cached HWC dump buffer data to ensure that all writes from GPU and CPU
+ * are correctly observed.
+ */
+typedef void (*kbase_hwcnt_backend_csf_if_ring_buf_sync_fn)(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx,
+	struct kbase_hwcnt_backend_csf_if_ring_buf *ring_buf,
+	u32 buf_index_first, u32 buf_index_last, bool for_cpu);
+
+/**
+ * typedef kbase_hwcnt_backend_csf_if_ring_buf_free_fn - Free a ring buffer for
+ *                                                       the CSF interface.
+ *
+ * @ctx:      Non-NULL pointer to a CSF interface context.
+ * @ring_buf: Non-NULL pointer to the ring buffer which to be freed.
+ */
+typedef void (*kbase_hwcnt_backend_csf_if_ring_buf_free_fn)(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx,
+	struct kbase_hwcnt_backend_csf_if_ring_buf *ring_buf);
+
+/**
+ * typedef kbase_hwcnt_backend_csf_if_timestamp_ns_fn - Get the current
+ *                                                      timestamp of the CSF
+ *                                                      interface.
+ * @ctx: Non-NULL pointer to a CSF interface context.
+ *
+ * Return: CSF interface timestamp in nanoseconds.
+ */
+typedef u64 (*kbase_hwcnt_backend_csf_if_timestamp_ns_fn)(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx);
+
+/**
+ * typedef kbase_hwcnt_backend_csf_if_dump_enable_fn - Setup and enable hardware
+ *                                                     counter in CSF interface.
+ * @ctx:      Non-NULL pointer to a CSF interface context.
+ * @ring_buf: Non-NULL pointer to the ring buffer which used to setup the HWC.
+ * @enable:   Non-NULL pointer to the enable map of HWC.
+ *
+ * Requires lock to be taken before calling.
+ */
+typedef void (*kbase_hwcnt_backend_csf_if_dump_enable_fn)(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx,
+	struct kbase_hwcnt_backend_csf_if_ring_buf *ring_buf,
+	struct kbase_hwcnt_backend_csf_if_enable *enable);
+
+/**
+ * typedef kbase_hwcnt_backend_csf_if_dump_disable_fn - Disable hardware counter
+ *                                                      in CSF interface.
+ * @ctx: Non-NULL pointer to a CSF interface context.
+ *
+ * Requires lock to be taken before calling.
+ */
+typedef void (*kbase_hwcnt_backend_csf_if_dump_disable_fn)(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx);
+
+/**
+ * typedef kbase_hwcnt_backend_csf_if_dump_request_fn - Request a HWC dump.
+ *
+ * @ctx: Non-NULL pointer to the interface context.
+ *
+ * Requires lock to be taken before calling.
+ */
+typedef void (*kbase_hwcnt_backend_csf_if_dump_request_fn)(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx);
+
+/**
+ * typedef kbase_hwcnt_backend_csf_if_get_indexes_fn - Get current extract and
+ *                                                     insert indexes of the
+ *                                                     ring buffer.
+ *
+ * @ctx:           Non-NULL pointer to a CSF interface context.
+ * @extract_index: Non-NULL pointer where current extract index to be saved.
+ * @insert_index:  Non-NULL pointer where current insert index to be saved.
+ *
+ * Requires lock to be taken before calling.
+ */
+typedef void (*kbase_hwcnt_backend_csf_if_get_indexes_fn)(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx, u32 *extract_index,
+	u32 *insert_index);
+
+/**
+ * typedef kbase_hwcnt_backend_csf_if_set_extract_index_fn - Update the extract
+ *                                                           index of the ring
+ *                                                           buffer.
+ *
+ * @ctx:            Non-NULL pointer to a CSF interface context.
+ * @extract_index:  New extract index to be set.
+ *
+ * Requires lock to be taken before calling.
+ */
+typedef void (*kbase_hwcnt_backend_csf_if_set_extract_index_fn)(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx, u32 extract_index);
+
+/**
+ * typedef kbase_hwcnt_backend_csf_if_get_gpu_cycle_count_fn - Get the current
+ *                                                             GPU cycle count.
+ * @ctx:            Non-NULL pointer to a CSF interface context.
+ * @cycle_counts:   Non-NULL pointer to an array where cycle counts to be saved,
+ *                  the array size should be at least as big as the number of
+ *                  clock domains returned by get_prfcnt_info interface.
+ * @clk_enable_map: An array of bitfields, each bit specifies an enabled clock
+ *                  domain.
+ *
+ * Requires lock to be taken before calling.
+ */
+typedef void (*kbase_hwcnt_backend_csf_if_get_gpu_cycle_count_fn)(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx, u64 *cycle_counts,
+	u64 clk_enable_map);
+
+/**
+ * struct kbase_hwcnt_backend_csf_if - Hardware counter backend CSF virtual
+ *                                     interface.
+ * @ctx:                 CSF interface context.
+ * @assert_lock_held:    Function ptr to assert backend spinlock is held.
+ * @lock:                Function ptr to acquire backend spinlock.
+ * @unlock:              Function ptr to release backend spinlock.
+ * @get_prfcnt_info:     Function ptr to get performance counter related
+ *                       information.
+ * @ring_buf_alloc:      Function ptr to allocate ring buffer for CSF HWC.
+ * @ring_buf_sync:       Function ptr to sync ring buffer to CPU.
+ * @ring_buf_free:       Function ptr to free ring buffer for CSF HWC.
+ * @timestamp_ns:        Function ptr to get the current CSF interface
+ *                       timestamp.
+ * @dump_enable:         Function ptr to enable dumping.
+ * @dump_enable_nolock:  Function ptr to enable dumping while the
+ *                       backend-specific spinlock is already held.
+ * @dump_disable:        Function ptr to disable dumping.
+ * @dump_request:        Function ptr to request a dump.
+ * @get_indexes:         Function ptr to get extract and insert indexes of the
+ *                       ring buffer.
+ * @set_extract_index:   Function ptr to set extract index of ring buffer.
+ * @get_gpu_cycle_count: Function ptr to get the GPU cycle count.
+ */
+struct kbase_hwcnt_backend_csf_if {
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx;
+	kbase_hwcnt_backend_csf_if_assert_lock_held_fn assert_lock_held;
+	kbase_hwcnt_backend_csf_if_lock_fn lock;
+	kbase_hwcnt_backend_csf_if_unlock_fn unlock;
+	kbase_hwcnt_backend_csf_if_get_prfcnt_info_fn get_prfcnt_info;
+	kbase_hwcnt_backend_csf_if_ring_buf_alloc_fn ring_buf_alloc;
+	kbase_hwcnt_backend_csf_if_ring_buf_sync_fn ring_buf_sync;
+	kbase_hwcnt_backend_csf_if_ring_buf_free_fn ring_buf_free;
+	kbase_hwcnt_backend_csf_if_timestamp_ns_fn timestamp_ns;
+	kbase_hwcnt_backend_csf_if_dump_enable_fn dump_enable;
+	kbase_hwcnt_backend_csf_if_dump_disable_fn dump_disable;
+	kbase_hwcnt_backend_csf_if_dump_request_fn dump_request;
+	kbase_hwcnt_backend_csf_if_get_indexes_fn get_indexes;
+	kbase_hwcnt_backend_csf_if_set_extract_index_fn set_extract_index;
+	kbase_hwcnt_backend_csf_if_get_gpu_cycle_count_fn get_gpu_cycle_count;
+};
+
+#endif /* #define _KBASE_HWCNT_BACKEND_CSF_IF_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf_if_fw.c b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf_if_fw.c
new file mode 100644
index 000000000000..35f1225acaae
--- /dev/null
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf_if_fw.c
@@ -0,0 +1,786 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ *
+ * (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+/*
+ * CSF GPU HWC backend firmware interface APIs.
+ */
+
+#include <mali_kbase.h>
+#include <gpu/mali_kbase_gpu_regmap.h>
+#include <device/mali_kbase_device.h>
+#include "mali_kbase_hwcnt_gpu.h"
+#include "mali_kbase_hwcnt_types.h"
+#include <uapi/gpu/arm/bifrost/csf/mali_gpu_csf_registers.h>
+
+#include "csf/mali_kbase_csf_firmware.h"
+#include "mali_kbase_hwcnt_backend_csf_if_fw.h"
+#include "mali_kbase_hwaccess_time.h"
+#include "backend/gpu/mali_kbase_clk_rate_trace_mgr.h"
+
+#include <linux/log2.h>
+#include "mali_kbase_ccswe.h"
+#ifdef CONFIG_MALI_BIFROST_NO_MALI
+#include <backend/gpu/mali_kbase_model_dummy.h>
+#endif
+
+/** The number of nanoseconds in a second. */
+#define NSECS_IN_SEC 1000000000ull /* ns */
+
+/* Ring buffer virtual address start at 4GB  */
+#define KBASE_HWC_CSF_RING_BUFFER_VA_START (1ull << 32)
+
+/**
+ * struct kbase_hwcnt_backend_csf_if_fw_ring_buf - ring buffer for CSF interface
+ *                                                 used to save the manual and
+ *                                                 auto HWC samples from
+ *                                                 firmware.
+ * @gpu_dump_base: Starting GPU base address of the ring buffer.
+ * @cpu_dump_base: Starting CPU address for the mapping.
+ * @buf_count:     Buffer count in the ring buffer, MUST be power of 2.
+ * @as_nr:         Address space number for the memory mapping.
+ * @phys:          Physical memory allocation used by the mapping.
+ * @num_pages:     Size of the mapping, in memory pages.
+ */
+struct kbase_hwcnt_backend_csf_if_fw_ring_buf {
+	u64 gpu_dump_base;
+	void *cpu_dump_base;
+	size_t buf_count;
+	u32 as_nr;
+	struct tagged_addr *phys;
+	size_t num_pages;
+};
+
+/**
+ * struct kbase_hwcnt_backend_csf_if_fw_ctx - Firmware context for the CSF
+ *                                            interface, used to communicate
+ *                                            with firmware.
+ * @kbdev:              KBase device.
+ * @buf_bytes:	        The size in bytes for each buffer in the ring buffer.
+ * @clk_cnt:            The number of clock domains in the system.
+ *                      The maximum is 64.
+ * @rate_listener:      Clock rate listener callback state.
+ * @ccswe_shader_cores: Shader cores cycle count software estimator.
+ */
+struct kbase_hwcnt_backend_csf_if_fw_ctx {
+	struct kbase_device *kbdev;
+	size_t buf_bytes;
+	u8 clk_cnt;
+	u64 clk_enable_map;
+	struct kbase_clk_rate_listener rate_listener;
+	struct kbase_ccswe ccswe_shader_cores;
+};
+
+static void kbasep_hwcnt_backend_csf_if_fw_assert_lock_held(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx)
+{
+	struct kbase_hwcnt_backend_csf_if_fw_ctx *fw_ctx;
+	struct kbase_device *kbdev;
+
+	WARN_ON(!ctx);
+
+	fw_ctx = (struct kbase_hwcnt_backend_csf_if_fw_ctx *)ctx;
+	kbdev = fw_ctx->kbdev;
+
+	kbase_csf_scheduler_spin_lock_assert_held(kbdev);
+}
+
+static void
+kbasep_hwcnt_backend_csf_if_fw_lock(struct kbase_hwcnt_backend_csf_if_ctx *ctx,
+				    unsigned long *flags)
+{
+	struct kbase_hwcnt_backend_csf_if_fw_ctx *fw_ctx;
+	struct kbase_device *kbdev;
+
+	WARN_ON(!ctx);
+
+	fw_ctx = (struct kbase_hwcnt_backend_csf_if_fw_ctx *)ctx;
+	kbdev = fw_ctx->kbdev;
+
+	kbase_csf_scheduler_spin_lock(kbdev, flags);
+}
+
+static void kbasep_hwcnt_backend_csf_if_fw_unlock(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx, unsigned long flags)
+{
+	struct kbase_hwcnt_backend_csf_if_fw_ctx *fw_ctx;
+	struct kbase_device *kbdev;
+
+	WARN_ON(!ctx);
+
+	fw_ctx = (struct kbase_hwcnt_backend_csf_if_fw_ctx *)ctx;
+	kbdev = fw_ctx->kbdev;
+
+	kbase_csf_scheduler_spin_lock_assert_held(kbdev);
+	kbase_csf_scheduler_spin_unlock(kbdev, flags);
+}
+
+/**
+ * kbasep_hwcnt_backend_csf_if_fw_on_freq_change() - On freq change callback
+ *
+ * @rate_listener:    Callback state
+ * @clk_index:        Clock index
+ * @clk_rate_hz:      Clock frequency(hz)
+ */
+static void kbasep_hwcnt_backend_csf_if_fw_on_freq_change(
+	struct kbase_clk_rate_listener *rate_listener, u32 clk_index,
+	u32 clk_rate_hz)
+{
+	struct kbase_hwcnt_backend_csf_if_fw_ctx *fw_ctx =
+		container_of(rate_listener,
+			     struct kbase_hwcnt_backend_csf_if_fw_ctx,
+			     rate_listener);
+	u64 timestamp_ns;
+
+	if (clk_index != KBASE_CLOCK_DOMAIN_SHADER_CORES)
+		return;
+
+	timestamp_ns = ktime_get_raw_ns();
+	kbase_ccswe_freq_change(&fw_ctx->ccswe_shader_cores, timestamp_ns,
+				clk_rate_hz);
+}
+
+/**
+ * kbasep_hwcnt_backend_csf_if_fw_cc_enable() - Enable cycle count tracking
+ *
+ * @fw_ctx:     Non-NULL pointer to CSF firmware interface context.
+ * @enable_map: Non-NULL pointer to enable map specifying enabled counters.
+ */
+static void kbasep_hwcnt_backend_csf_if_fw_cc_enable(
+	struct kbase_hwcnt_backend_csf_if_fw_ctx *fw_ctx, u64 clk_enable_map)
+{
+	struct kbase_device *kbdev = fw_ctx->kbdev;
+
+	if (kbase_hwcnt_clk_enable_map_enabled(
+		    clk_enable_map, KBASE_CLOCK_DOMAIN_SHADER_CORES)) {
+		/* software estimation for non-top clock domains */
+		struct kbase_clk_rate_trace_manager *rtm = &kbdev->pm.clk_rtm;
+		const struct kbase_clk_data *clk_data =
+			rtm->clks[KBASE_CLOCK_DOMAIN_SHADER_CORES];
+		u32 cur_freq;
+		unsigned long flags;
+		u64 timestamp_ns;
+
+		timestamp_ns = ktime_get_raw_ns();
+
+		spin_lock_irqsave(&rtm->lock, flags);
+
+		cur_freq = (u32)clk_data->clock_val;
+		kbase_ccswe_reset(&fw_ctx->ccswe_shader_cores);
+		kbase_ccswe_freq_change(&fw_ctx->ccswe_shader_cores,
+					timestamp_ns, cur_freq);
+
+		kbase_clk_rate_trace_manager_subscribe_no_lock(
+			rtm, &fw_ctx->rate_listener);
+
+		spin_unlock_irqrestore(&rtm->lock, flags);
+	}
+
+	fw_ctx->clk_enable_map = clk_enable_map;
+}
+
+/**
+ * kbasep_hwcnt_backend_csf_if_fw_cc_disable() - Disable cycle count tracking
+ *
+ * @fw_ctx:     Non-NULL pointer to CSF firmware interface context.
+ */
+static void kbasep_hwcnt_backend_csf_if_fw_cc_disable(
+	struct kbase_hwcnt_backend_csf_if_fw_ctx *fw_ctx)
+{
+	struct kbase_device *kbdev = fw_ctx->kbdev;
+	struct kbase_clk_rate_trace_manager *rtm = &kbdev->pm.clk_rtm;
+	u64 clk_enable_map = fw_ctx->clk_enable_map;
+
+	if (kbase_hwcnt_clk_enable_map_enabled(clk_enable_map,
+					       KBASE_CLOCK_DOMAIN_SHADER_CORES))
+		kbase_clk_rate_trace_manager_unsubscribe(
+			rtm, &fw_ctx->rate_listener);
+}
+
+static void kbasep_hwcnt_backend_csf_if_fw_get_prfcnt_info(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx,
+	struct kbase_hwcnt_backend_csf_if_prfcnt_info *prfcnt_info)
+{
+#ifdef CONFIG_MALI_BIFROST_NO_MALI
+	prfcnt_info->l2_count = KBASE_DUMMY_MODEL_MAX_MEMSYS_BLOCKS;
+	prfcnt_info->core_mask =
+		(1ull << KBASE_DUMMY_MODEL_MAX_SHADER_CORES) - 1;
+	prfcnt_info->dump_bytes = KBASE_DUMMY_MODEL_MAX_NUM_PERF_BLOCKS *
+				  KBASE_DUMMY_MODEL_BLOCK_SIZE;
+	prfcnt_info->clk_cnt = 1;
+	prfcnt_info->clearing_samples = false;
+#else
+	struct kbase_hwcnt_backend_csf_if_fw_ctx *fw_ctx;
+	struct kbase_device *kbdev;
+	u32 prfcnt_size;
+	u32 prfcnt_hw_size = 0;
+	u32 prfcnt_fw_size = 0;
+
+	WARN_ON(!ctx);
+	WARN_ON(!prfcnt_info);
+
+	fw_ctx = (struct kbase_hwcnt_backend_csf_if_fw_ctx *)ctx;
+	kbdev = fw_ctx->kbdev;
+	prfcnt_size = kbdev->csf.global_iface.prfcnt_size;
+	prfcnt_hw_size = (prfcnt_size & 0xFF) << 8;
+	prfcnt_fw_size = (prfcnt_size >> 16) << 8;
+	fw_ctx->buf_bytes = prfcnt_hw_size + prfcnt_fw_size;
+	prfcnt_info->dump_bytes = fw_ctx->buf_bytes;
+
+	prfcnt_info->l2_count = kbdev->gpu_props.props.l2_props.num_l2_slices;
+	prfcnt_info->core_mask =
+		kbdev->gpu_props.props.coherency_info.group[0].core_mask;
+
+	prfcnt_info->clk_cnt = fw_ctx->clk_cnt;
+	prfcnt_info->clearing_samples = true;
+#endif
+}
+
+static int kbasep_hwcnt_backend_csf_if_fw_ring_buf_alloc(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx, u32 buf_count,
+	void **cpu_dump_base,
+	struct kbase_hwcnt_backend_csf_if_ring_buf **out_ring_buf)
+{
+	struct kbase_device *kbdev;
+	struct tagged_addr *phys;
+	struct page **page_list;
+	void *cpu_addr;
+	int ret;
+	int i;
+	size_t num_pages;
+	u64 flags;
+	struct kbase_hwcnt_backend_csf_if_fw_ring_buf *fw_ring_buf;
+
+	pgprot_t cpu_map_prot = PAGE_KERNEL;
+	u64 gpu_va_base = KBASE_HWC_CSF_RING_BUFFER_VA_START;
+
+	struct kbase_hwcnt_backend_csf_if_fw_ctx *fw_ctx =
+		(struct kbase_hwcnt_backend_csf_if_fw_ctx *)ctx;
+
+	WARN_ON(!ctx);
+	WARN_ON(!cpu_dump_base);
+	WARN_ON(!out_ring_buf);
+
+	kbdev = fw_ctx->kbdev;
+
+	/* The buffer count must be power of 2 */
+	if (!is_power_of_2(buf_count))
+		return -EINVAL;
+
+	/* alignment failure */
+	if (gpu_va_base & (2048 - 1))
+		return -EINVAL;
+
+	fw_ring_buf = kzalloc(sizeof(*fw_ring_buf), GFP_KERNEL);
+	if (!fw_ring_buf)
+		return -ENOMEM;
+
+	num_pages = PFN_UP(fw_ctx->buf_bytes * buf_count);
+	phys = kmalloc_array(num_pages, sizeof(*phys), GFP_KERNEL);
+	if (!phys)
+		goto phys_alloc_error;
+
+	page_list = kmalloc_array(num_pages, sizeof(*page_list), GFP_KERNEL);
+	if (!page_list)
+		goto page_list_alloc_error;
+
+	/* Get physical page for the buffer */
+	ret = kbase_mem_pool_alloc_pages(
+		&kbdev->mem_pools.small[KBASE_MEM_GROUP_CSF_FW], num_pages,
+		phys, false);
+	if (ret != num_pages)
+		goto phys_mem_pool_alloc_error;
+
+	/* Get the CPU virtual address */
+	for (i = 0; i < num_pages; i++)
+		page_list[i] = as_page(phys[i]);
+
+	cpu_addr = vmap(page_list, num_pages, VM_MAP, cpu_map_prot);
+	if (!cpu_addr)
+		goto vmap_error;
+
+	flags = KBASE_REG_GPU_WR | KBASE_REG_GPU_NX |
+		KBASE_REG_MEMATTR_INDEX(AS_MEMATTR_INDEX_NON_CACHEABLE);
+
+	/* Update MMU table */
+	ret = kbase_mmu_insert_pages(kbdev, &kbdev->csf.mcu_mmu,
+				     gpu_va_base >> PAGE_SHIFT, phys, num_pages,
+				     flags, MCU_AS_NR, KBASE_MEM_GROUP_CSF_FW);
+	if (ret)
+		goto mmu_insert_failed;
+
+	kfree(page_list);
+
+	fw_ring_buf->gpu_dump_base = gpu_va_base;
+	fw_ring_buf->cpu_dump_base = cpu_addr;
+	fw_ring_buf->phys = phys;
+	fw_ring_buf->num_pages = num_pages;
+	fw_ring_buf->buf_count = buf_count;
+	fw_ring_buf->as_nr = MCU_AS_NR;
+
+	*cpu_dump_base = fw_ring_buf->cpu_dump_base;
+	*out_ring_buf =
+		(struct kbase_hwcnt_backend_csf_if_ring_buf *)fw_ring_buf;
+
+	return 0;
+
+mmu_insert_failed:
+	vunmap(cpu_addr);
+vmap_error:
+	kbase_mem_pool_free_pages(
+		&kbdev->mem_pools.small[KBASE_MEM_GROUP_CSF_FW], num_pages,
+		phys, false, false);
+phys_mem_pool_alloc_error:
+	kfree(page_list);
+page_list_alloc_error:
+	kfree(phys);
+phys_alloc_error:
+	kfree(fw_ring_buf);
+	return -ENOMEM;
+}
+
+static void kbasep_hwcnt_backend_csf_if_fw_ring_buf_sync(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx,
+	struct kbase_hwcnt_backend_csf_if_ring_buf *ring_buf,
+	u32 buf_index_first, u32 buf_index_last, bool for_cpu)
+{
+	struct kbase_hwcnt_backend_csf_if_fw_ring_buf *fw_ring_buf =
+		(struct kbase_hwcnt_backend_csf_if_fw_ring_buf *)ring_buf;
+	struct kbase_hwcnt_backend_csf_if_fw_ctx *fw_ctx =
+		(struct kbase_hwcnt_backend_csf_if_fw_ctx *)ctx;
+	size_t i;
+	size_t pg_first;
+	size_t pg_last;
+	u64 start_address;
+	u64 stop_address;
+	u32 ring_buf_index_first;
+	u32 ring_buf_index_last;
+
+	WARN_ON(!ctx);
+	WARN_ON(!ring_buf);
+
+	/* The index arguments for this function form an inclusive, exclusive
+	 * range.
+	 * However, when masking back to the available buffers we will make this
+	 * inclusive at both ends so full flushes are not 0 -> 0.
+	 */
+	ring_buf_index_first = buf_index_first & (fw_ring_buf->buf_count - 1);
+	ring_buf_index_last =
+		(buf_index_last - 1) & (fw_ring_buf->buf_count - 1);
+
+	/* The start address is the offset of the first buffer. */
+	start_address = fw_ctx->buf_bytes * ring_buf_index_first;
+	pg_first = start_address >> PAGE_SHIFT;
+
+	/* The stop address is the last byte in the final buffer. */
+	stop_address = (fw_ctx->buf_bytes * (ring_buf_index_last + 1)) - 1;
+	pg_last = stop_address >> PAGE_SHIFT;
+
+	/* Check whether the buffer range wraps. */
+	if (start_address > stop_address) {
+		/* sync the first part to the end of ring buffer. */
+		for (i = pg_first; i < fw_ring_buf->num_pages; i++) {
+			struct page *pg = as_page(fw_ring_buf->phys[i]);
+
+			if (for_cpu) {
+				kbase_sync_single_for_cpu(fw_ctx->kbdev,
+							  kbase_dma_addr(pg),
+							  PAGE_SIZE,
+							  DMA_BIDIRECTIONAL);
+			} else {
+				kbase_sync_single_for_device(fw_ctx->kbdev,
+							     kbase_dma_addr(pg),
+							     PAGE_SIZE,
+							     DMA_BIDIRECTIONAL);
+			}
+		}
+
+		/* second part starts from page 0. */
+		pg_first = 0;
+	}
+
+	for (i = pg_first; i <= pg_last; i++) {
+		struct page *pg = as_page(fw_ring_buf->phys[i]);
+
+		if (for_cpu) {
+			kbase_sync_single_for_cpu(fw_ctx->kbdev,
+						  kbase_dma_addr(pg), PAGE_SIZE,
+						  DMA_BIDIRECTIONAL);
+		} else {
+			kbase_sync_single_for_device(fw_ctx->kbdev,
+						     kbase_dma_addr(pg),
+						     PAGE_SIZE,
+						     DMA_BIDIRECTIONAL);
+		}
+	}
+}
+
+static u64 kbasep_hwcnt_backend_csf_if_fw_timestamp_ns(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx)
+{
+	CSTD_UNUSED(ctx);
+	return ktime_get_raw_ns();
+}
+
+static void kbasep_hwcnt_backend_csf_if_fw_ring_buf_free(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx,
+	struct kbase_hwcnt_backend_csf_if_ring_buf *ring_buf)
+{
+	struct kbase_hwcnt_backend_csf_if_fw_ring_buf *fw_ring_buf =
+		(struct kbase_hwcnt_backend_csf_if_fw_ring_buf *)ring_buf;
+	struct kbase_hwcnt_backend_csf_if_fw_ctx *fw_ctx =
+		(struct kbase_hwcnt_backend_csf_if_fw_ctx *)ctx;
+
+	if (!fw_ring_buf)
+		return;
+
+	if (fw_ring_buf->phys) {
+		u64 gpu_va_base = KBASE_HWC_CSF_RING_BUFFER_VA_START;
+
+		WARN_ON(kbase_mmu_teardown_pages(
+			fw_ctx->kbdev, &fw_ctx->kbdev->csf.mcu_mmu,
+			gpu_va_base >> PAGE_SHIFT, fw_ring_buf->num_pages,
+			MCU_AS_NR));
+
+		vunmap(fw_ring_buf->cpu_dump_base);
+
+		kbase_mem_pool_free_pages(
+			&fw_ctx->kbdev->mem_pools.small[KBASE_MEM_GROUP_CSF_FW],
+			fw_ring_buf->num_pages, fw_ring_buf->phys, false,
+			false);
+
+		kfree(fw_ring_buf->phys);
+
+		kfree(fw_ring_buf);
+	}
+}
+
+static void kbasep_hwcnt_backend_csf_if_fw_dump_enable(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx,
+	struct kbase_hwcnt_backend_csf_if_ring_buf *ring_buf,
+	struct kbase_hwcnt_backend_csf_if_enable *enable)
+{
+	u32 prfcnt_config;
+	struct kbase_device *kbdev;
+	struct kbase_csf_global_iface *global_iface;
+	struct kbase_hwcnt_backend_csf_if_fw_ctx *fw_ctx =
+		(struct kbase_hwcnt_backend_csf_if_fw_ctx *)ctx;
+	struct kbase_hwcnt_backend_csf_if_fw_ring_buf *fw_ring_buf =
+		(struct kbase_hwcnt_backend_csf_if_fw_ring_buf *)ring_buf;
+
+	WARN_ON(!ctx);
+	WARN_ON(!ring_buf);
+	WARN_ON(!enable);
+	kbasep_hwcnt_backend_csf_if_fw_assert_lock_held(ctx);
+
+	kbdev = fw_ctx->kbdev;
+	global_iface = &kbdev->csf.global_iface;
+
+	/* Configure */
+	prfcnt_config = fw_ring_buf->buf_count;
+	prfcnt_config |= enable->counter_set << PRFCNT_CONFIG_SETSELECT_SHIFT;
+
+	/* Configure the ring buffer base address */
+	kbase_csf_firmware_global_input(global_iface, GLB_PRFCNT_JASID,
+					fw_ring_buf->as_nr);
+	kbase_csf_firmware_global_input(global_iface, GLB_PRFCNT_BASE_LO,
+					fw_ring_buf->gpu_dump_base & U32_MAX);
+	kbase_csf_firmware_global_input(global_iface, GLB_PRFCNT_BASE_HI,
+					fw_ring_buf->gpu_dump_base >> 32);
+
+	/* Set extract position to 0 */
+	kbase_csf_firmware_global_input(global_iface, GLB_PRFCNT_EXTRACT, 0);
+
+	/* Configure the enable bitmap */
+	kbase_csf_firmware_global_input(global_iface, GLB_PRFCNT_CSF_EN,
+					enable->fe_bm);
+	kbase_csf_firmware_global_input(global_iface, GLB_PRFCNT_SHADER_EN,
+					enable->shader_bm);
+	kbase_csf_firmware_global_input(global_iface, GLB_PRFCNT_MMU_L2_EN,
+					enable->mmu_l2_bm);
+	kbase_csf_firmware_global_input(global_iface, GLB_PRFCNT_TILER_EN,
+					enable->tiler_bm);
+
+	/* Configure the HWC set and buffer size */
+	kbase_csf_firmware_global_input(global_iface, GLB_PRFCNT_CONFIG,
+					prfcnt_config);
+
+	kbdev->csf.hwcnt.enable_pending = true;
+
+	/* Unmask the interrupts */
+	kbase_csf_firmware_global_input_mask(
+		global_iface, GLB_ACK_IRQ_MASK,
+		GLB_ACK_IRQ_MASK_PRFCNT_SAMPLE_MASK,
+		GLB_ACK_IRQ_MASK_PRFCNT_SAMPLE_MASK);
+	kbase_csf_firmware_global_input_mask(
+		global_iface, GLB_ACK_IRQ_MASK,
+		GLB_ACK_IRQ_MASK_PRFCNT_THRESHOLD_MASK,
+		GLB_ACK_IRQ_MASK_PRFCNT_THRESHOLD_MASK);
+	kbase_csf_firmware_global_input_mask(
+		global_iface, GLB_ACK_IRQ_MASK,
+		GLB_ACK_IRQ_MASK_PRFCNT_OVERFLOW_MASK,
+		GLB_ACK_IRQ_MASK_PRFCNT_OVERFLOW_MASK);
+	kbase_csf_firmware_global_input_mask(
+		global_iface, GLB_ACK_IRQ_MASK,
+		GLB_ACK_IRQ_MASK_PRFCNT_ENABLE_MASK,
+		GLB_ACK_IRQ_MASK_PRFCNT_ENABLE_MASK);
+
+	/* Enable the HWC */
+	kbase_csf_firmware_global_input_mask(global_iface, GLB_REQ,
+					     (1 << GLB_REQ_PRFCNT_ENABLE_SHIFT),
+					     GLB_REQ_PRFCNT_ENABLE_MASK);
+	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
+
+	prfcnt_config = kbase_csf_firmware_global_input_read(global_iface,
+							     GLB_PRFCNT_CONFIG);
+
+	kbasep_hwcnt_backend_csf_if_fw_cc_enable(fw_ctx,
+						 enable->clk_enable_map);
+}
+
+static void kbasep_hwcnt_backend_csf_if_fw_dump_disable(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx)
+{
+	struct kbase_device *kbdev;
+	struct kbase_csf_global_iface *global_iface;
+	struct kbase_hwcnt_backend_csf_if_fw_ctx *fw_ctx =
+		(struct kbase_hwcnt_backend_csf_if_fw_ctx *)ctx;
+
+	WARN_ON(!ctx);
+	kbasep_hwcnt_backend_csf_if_fw_assert_lock_held(ctx);
+
+	kbdev = fw_ctx->kbdev;
+	global_iface = &kbdev->csf.global_iface;
+
+	/* Disable the HWC */
+	kbdev->csf.hwcnt.enable_pending = true;
+	kbase_csf_firmware_global_input_mask(global_iface, GLB_REQ, 0,
+					     GLB_REQ_PRFCNT_ENABLE_MASK);
+	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
+
+	/* mask the interrupts */
+	kbase_csf_firmware_global_input_mask(
+		global_iface, GLB_ACK_IRQ_MASK, 0,
+		GLB_ACK_IRQ_MASK_PRFCNT_SAMPLE_MASK);
+	kbase_csf_firmware_global_input_mask(
+		global_iface, GLB_ACK_IRQ_MASK, 0,
+		GLB_ACK_IRQ_MASK_PRFCNT_THRESHOLD_MASK);
+	kbase_csf_firmware_global_input_mask(
+		global_iface, GLB_ACK_IRQ_MASK, 0,
+		GLB_ACK_IRQ_MASK_PRFCNT_OVERFLOW_MASK);
+
+	/* In case we have a previous request in flight when the disable
+	 * happens.
+	 */
+	kbdev->csf.hwcnt.request_pending = false;
+
+	kbasep_hwcnt_backend_csf_if_fw_cc_disable(fw_ctx);
+}
+
+static void kbasep_hwcnt_backend_csf_if_fw_dump_request(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx)
+{
+	u32 glb_req;
+	struct kbase_device *kbdev;
+	struct kbase_csf_global_iface *global_iface;
+	struct kbase_hwcnt_backend_csf_if_fw_ctx *fw_ctx =
+		(struct kbase_hwcnt_backend_csf_if_fw_ctx *)ctx;
+
+	WARN_ON(!ctx);
+	kbasep_hwcnt_backend_csf_if_fw_assert_lock_held(ctx);
+
+	kbdev = fw_ctx->kbdev;
+	global_iface = &kbdev->csf.global_iface;
+
+	/* Trigger dumping */
+	kbdev->csf.hwcnt.request_pending = true;
+	glb_req = kbase_csf_firmware_global_input_read(global_iface, GLB_REQ);
+	glb_req ^= GLB_REQ_PRFCNT_SAMPLE_MASK;
+	kbase_csf_firmware_global_input_mask(global_iface, GLB_REQ, glb_req,
+					     GLB_REQ_PRFCNT_SAMPLE_MASK);
+	kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
+}
+
+static void kbasep_hwcnt_backend_csf_if_fw_get_indexes(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx, u32 *extract_index,
+	u32 *insert_index)
+{
+	struct kbase_hwcnt_backend_csf_if_fw_ctx *fw_ctx =
+		(struct kbase_hwcnt_backend_csf_if_fw_ctx *)ctx;
+
+	WARN_ON(!ctx);
+	WARN_ON(!extract_index);
+	WARN_ON(!insert_index);
+	kbasep_hwcnt_backend_csf_if_fw_assert_lock_held(ctx);
+
+	*extract_index = kbase_csf_firmware_global_input_read(
+		&fw_ctx->kbdev->csf.global_iface, GLB_PRFCNT_EXTRACT);
+	*insert_index = kbase_csf_firmware_global_output(
+		&fw_ctx->kbdev->csf.global_iface, GLB_PRFCNT_INSERT);
+}
+
+static void kbasep_hwcnt_backend_csf_if_fw_set_extract_index(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx, u32 extract_idx)
+{
+	struct kbase_hwcnt_backend_csf_if_fw_ctx *fw_ctx =
+		(struct kbase_hwcnt_backend_csf_if_fw_ctx *)ctx;
+
+	WARN_ON(!ctx);
+	kbasep_hwcnt_backend_csf_if_fw_assert_lock_held(ctx);
+
+	/* Set the raw extract index to release the buffer back to the ring
+	 * buffer.
+	 */
+	kbase_csf_firmware_global_input(&fw_ctx->kbdev->csf.global_iface,
+					GLB_PRFCNT_EXTRACT, extract_idx);
+}
+
+static void kbasep_hwcnt_backend_csf_if_fw_get_gpu_cycle_count(
+	struct kbase_hwcnt_backend_csf_if_ctx *ctx, u64 *cycle_counts,
+	u64 clk_enable_map)
+{
+	struct kbase_hwcnt_backend_csf_if_fw_ctx *fw_ctx =
+		(struct kbase_hwcnt_backend_csf_if_fw_ctx *)ctx;
+	u8 clk;
+	u64 timestamp_ns = ktime_get_raw_ns();
+
+	WARN_ON(!ctx);
+	WARN_ON(!cycle_counts);
+	kbasep_hwcnt_backend_csf_if_fw_assert_lock_held(ctx);
+
+	for (clk = 0; clk < fw_ctx->clk_cnt; clk++) {
+		if (!(clk_enable_map & (1ull << clk)))
+			continue;
+
+		if (clk == KBASE_CLOCK_DOMAIN_TOP) {
+			/* Read cycle count for top clock domain. */
+			kbase_backend_get_gpu_time_norequest(
+				fw_ctx->kbdev, &cycle_counts[clk], NULL, NULL);
+		} else {
+			/* Estimate cycle count for non-top clock domain. */
+			cycle_counts[clk] = kbase_ccswe_cycle_at(
+				&fw_ctx->ccswe_shader_cores, timestamp_ns);
+		}
+	}
+}
+
+/**
+ * @brief Destroy a CSF FW interface context.
+ *
+ * @param[in,out] fw_ctx Pointer to context to destroy.
+ */
+static void kbasep_hwcnt_backend_csf_if_fw_ctx_destroy(
+	struct kbase_hwcnt_backend_csf_if_fw_ctx *fw_ctx)
+{
+	if (!fw_ctx)
+		return;
+
+	kfree(fw_ctx);
+}
+
+/**
+ * kbasep_hwcnt_backend_csf_if_fw_ctx_create() - Create a CSF Firmware context.
+ *
+ * @kbdev:   Non_NULL pointer to kbase device.
+ * @out_ctx: Non-NULL pointer to where info is stored on success.
+ * Return: 0 on success, else error code.
+ */
+static int kbasep_hwcnt_backend_csf_if_fw_ctx_create(
+	struct kbase_device *kbdev,
+	struct kbase_hwcnt_backend_csf_if_fw_ctx **out_ctx)
+{
+	u8 clk;
+	int errcode = -ENOMEM;
+	struct kbase_hwcnt_backend_csf_if_fw_ctx *ctx = NULL;
+
+	WARN_ON(!kbdev);
+	WARN_ON(!out_ctx);
+
+	ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
+	if (!ctx)
+		goto error;
+
+	ctx->kbdev = kbdev;
+
+	/* Determine the number of available clock domains. */
+	for (clk = 0; clk < BASE_MAX_NR_CLOCKS_REGULATORS; clk++) {
+		if (kbdev->pm.clk_rtm.clks[clk] == NULL)
+			break;
+	}
+	ctx->clk_cnt = clk;
+
+	ctx->clk_enable_map = 0;
+	kbase_ccswe_init(&ctx->ccswe_shader_cores);
+	ctx->rate_listener.notify =
+		kbasep_hwcnt_backend_csf_if_fw_on_freq_change;
+
+	*out_ctx = ctx;
+
+	return 0;
+error:
+	kbasep_hwcnt_backend_csf_if_fw_ctx_destroy(ctx);
+	return errcode;
+}
+
+void kbase_hwcnt_backend_csf_if_fw_destroy(
+	struct kbase_hwcnt_backend_csf_if *if_fw)
+{
+	if (!if_fw)
+		return;
+
+	kbasep_hwcnt_backend_csf_if_fw_ctx_destroy(
+		(struct kbase_hwcnt_backend_csf_if_fw_ctx *)if_fw->ctx);
+	memset(if_fw, 0, sizeof(*if_fw));
+}
+
+int kbase_hwcnt_backend_csf_if_fw_create(
+	struct kbase_device *kbdev, struct kbase_hwcnt_backend_csf_if *if_fw)
+{
+	int errcode;
+	struct kbase_hwcnt_backend_csf_if_fw_ctx *ctx = NULL;
+
+	if (!kbdev || !if_fw)
+		return -EINVAL;
+
+	errcode = kbasep_hwcnt_backend_csf_if_fw_ctx_create(kbdev, &ctx);
+	if (errcode)
+		return errcode;
+
+	if_fw->ctx = (struct kbase_hwcnt_backend_csf_if_ctx *)ctx;
+	if_fw->assert_lock_held =
+		kbasep_hwcnt_backend_csf_if_fw_assert_lock_held;
+	if_fw->lock = kbasep_hwcnt_backend_csf_if_fw_lock;
+	if_fw->unlock = kbasep_hwcnt_backend_csf_if_fw_unlock;
+	if_fw->get_prfcnt_info = kbasep_hwcnt_backend_csf_if_fw_get_prfcnt_info;
+	if_fw->ring_buf_alloc = kbasep_hwcnt_backend_csf_if_fw_ring_buf_alloc;
+	if_fw->ring_buf_sync = kbasep_hwcnt_backend_csf_if_fw_ring_buf_sync;
+	if_fw->ring_buf_free = kbasep_hwcnt_backend_csf_if_fw_ring_buf_free;
+	if_fw->timestamp_ns = kbasep_hwcnt_backend_csf_if_fw_timestamp_ns;
+	if_fw->dump_enable = kbasep_hwcnt_backend_csf_if_fw_dump_enable;
+	if_fw->dump_disable = kbasep_hwcnt_backend_csf_if_fw_dump_disable;
+	if_fw->dump_request = kbasep_hwcnt_backend_csf_if_fw_dump_request;
+	if_fw->get_gpu_cycle_count =
+		kbasep_hwcnt_backend_csf_if_fw_get_gpu_cycle_count;
+	if_fw->get_indexes = kbasep_hwcnt_backend_csf_if_fw_get_indexes;
+	if_fw->set_extract_index =
+		kbasep_hwcnt_backend_csf_if_fw_set_extract_index;
+
+	return 0;
+}
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf_if_fw.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf_if_fw.h
new file mode 100644
index 000000000000..f55efb6e896b
--- /dev/null
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_csf_if_fw.h
@@ -0,0 +1,50 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ *
+ * (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+/*
+ * Concrete implementation of kbase_hwcnt_backend_csf_if interface for CSF FW
+ */
+
+#ifndef _KBASE_HWCNT_BACKEND_CSF_IF_FW_H_
+#define _KBASE_HWCNT_BACKEND_CSF_IF_FW_H_
+
+#include "mali_kbase_hwcnt_backend_csf_if.h"
+
+/**
+ * kbase_hwcnt_backend_csf_if_fw_create() - Create a firmware CSF interface
+ *                                          of hardware counter backend.
+ * @kbdev: Non-NULL pointer to Kbase device.
+ * @if_fw: Non-NULL pointer to backend interface structure that is filled in on
+ *         creation success.
+ * Return: 0 on success, else error code.
+ */
+int kbase_hwcnt_backend_csf_if_fw_create(
+	struct kbase_device *kbdev, struct kbase_hwcnt_backend_csf_if *if_fw);
+
+/**
+ * kbase_hwcnt_backend_csf_if_fw_destroy() - Destroy a firmware CSF interface of
+ *                                           hardware counter backend.
+ * @if_fw: Pointer to a CSF interface to destroy.
+ */
+void kbase_hwcnt_backend_csf_if_fw_destroy(
+	struct kbase_hwcnt_backend_csf_if *if_fw);
+
+#endif /* _KBASE_HWCNT_BACKEND_CSF_IF_FW_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_jm.c b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_jm.c
index 9f65de41694f..ffacaeb0a748 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_jm.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_jm.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "mali_kbase_hwcnt_backend_jm.h"
@@ -34,25 +33,20 @@
 #endif
 #include "backend/gpu/mali_kbase_clk_rate_trace_mgr.h"
 
-#if MALI_USE_CSF
-#include "mali_kbase_ctx_sched.h"
-#else
 #include "backend/gpu/mali_kbase_pm_internal.h"
-#endif
 
 /**
  * struct kbase_hwcnt_backend_jm_info - Information used to create an instance
  *                                      of a JM hardware counter backend.
  * @kbdev:         KBase device.
- * @use_secondary: True if secondary performance counters should be used,
- *                 else false. Ignored if secondary counters are not supported.
+ * @counter_set:   The performance counter set to use.
  * @metadata:      Hardware counter metadata.
  * @dump_bytes:    Bytes of GPU memory required to perform a
  *                 hardware counter dump.
  */
 struct kbase_hwcnt_backend_jm_info {
 	struct kbase_device *kbdev;
-	bool use_secondary;
+	enum kbase_hwcnt_set counter_set;
 	const struct kbase_hwcnt_metadata *metadata;
 	size_t dump_bytes;
 };
@@ -68,6 +62,8 @@ struct kbase_hwcnt_backend_jm_info {
  * @enabled:          True if dumping has been enabled, else false.
  * @pm_core_mask:     PM state sync-ed shaders core mask for the enabled
  *                    dumping.
+ * @curr_config:      Current allocated hardware resources to correctly map the src
+ *                    raw dump buffer to the dst dump buffer.
  * @clk_enable_map:   The enable map specifying enabled clock domains.
  * @cycle_count_elapsed:
  *                    Cycle count elapsed for a given sample period.
@@ -87,6 +83,7 @@ struct kbase_hwcnt_backend_jm {
 	struct kbase_vmap_struct *vmap;
 	bool enabled;
 	u64 pm_core_mask;
+	struct kbase_hwcnt_curr_config curr_config;
 	u64 clk_enable_map;
 	u64 cycle_count_elapsed[BASE_MAX_NR_CLOCKS_REGULATORS];
 	u64 prev_cycle_count[BASE_MAX_NR_CLOCKS_REGULATORS];
@@ -94,6 +91,48 @@ struct kbase_hwcnt_backend_jm {
 	struct kbase_ccswe ccswe_shader_cores;
 };
 
+/**
+ * kbasep_hwcnt_backend_jm_gpu_info_init() - Initialise an info structure used
+ *                                           to create the hwcnt metadata.
+ * @kbdev: Non-NULL pointer to kbase device.
+ * @info:  Non-NULL pointer to data structure to be filled in.
+ *
+ * The initialised info struct will only be valid for use while kbdev is valid.
+ */
+static int
+kbasep_hwcnt_backend_jm_gpu_info_init(struct kbase_device *kbdev,
+				      struct kbase_hwcnt_gpu_info *info)
+{
+	size_t clk;
+
+	if (!kbdev || !info)
+		return -EINVAL;
+
+#ifdef CONFIG_MALI_BIFROST_NO_MALI
+	info->l2_count = KBASE_DUMMY_MODEL_MAX_MEMSYS_BLOCKS;
+	info->core_mask = (1ull << KBASE_DUMMY_MODEL_MAX_SHADER_CORES) - 1;
+#else /* CONFIG_MALI_BIFROST_NO_MALI */
+	{
+		const struct base_gpu_props *props = &kbdev->gpu_props.props;
+		const size_t l2_count = props->l2_props.num_l2_slices;
+		const size_t core_mask =
+			props->coherency_info.group[0].core_mask;
+
+		info->l2_count = l2_count;
+		info->core_mask = core_mask;
+	}
+#endif /* CONFIG_MALI_BIFROST_NO_MALI */
+
+	/* Determine the number of available clock domains. */
+	for (clk = 0; clk < BASE_MAX_NR_CLOCKS_REGULATORS; clk++) {
+		if (kbdev->pm.clk_rtm.clks[clk] == NULL)
+			break;
+	}
+	info->clk_cnt = clk;
+
+	return 0;
+}
+
 /**
  * kbasep_hwcnt_backend_jm_on_freq_change() - On freq change callback
  *
@@ -121,7 +160,7 @@ static void kbasep_hwcnt_backend_jm_on_freq_change(
 /**
  * kbasep_hwcnt_backend_jm_cc_enable() - Enable cycle count tracking
  *
- * @backend:      Non-NULL pointer to backend.
+ * @backend_jm:      Non-NULL pointer to backend.
  * @enable_map:   Non-NULL pointer to enable map specifying enabled counters.
  * @timestamp_ns: Timestamp(ns) when HWCNT were enabled.
  */
@@ -136,10 +175,8 @@ static void kbasep_hwcnt_backend_jm_cc_enable(
 
 	if (kbase_hwcnt_clk_enable_map_enabled(
 		    clk_enable_map, KBASE_CLOCK_DOMAIN_TOP)) {
-#if !MALI_USE_CSF
 		/* turn on the cycle counter */
 		kbase_pm_request_gpu_cycle_counter_l2_is_on(kbdev);
-#endif
 		/* Read cycle count for top clock domain. */
 		kbase_backend_get_gpu_time_norequest(
 			kbdev, &cycle_count, NULL, NULL);
@@ -183,7 +220,7 @@ static void kbasep_hwcnt_backend_jm_cc_enable(
 /**
  * kbasep_hwcnt_backend_jm_cc_disable() - Disable cycle count tracking
  *
- * @backend:      Non-NULL pointer to backend.
+ * @backend_jm:      Non-NULL pointer to backend.
  */
 static void kbasep_hwcnt_backend_jm_cc_disable(
 	struct kbase_hwcnt_backend_jm *backend_jm)
@@ -192,13 +229,12 @@ static void kbasep_hwcnt_backend_jm_cc_disable(
 	struct kbase_clk_rate_trace_manager *rtm = &kbdev->pm.clk_rtm;
 	u64 clk_enable_map = backend_jm->clk_enable_map;
 
-#if !MALI_USE_CSF
 	if (kbase_hwcnt_clk_enable_map_enabled(
 		clk_enable_map, KBASE_CLOCK_DOMAIN_TOP)) {
 		/* turn off the cycle counter */
 		kbase_pm_release_gpu_cycle_counter(kbdev);
 	}
-#endif
+
 	if (kbase_hwcnt_clk_enable_map_enabled(
 		clk_enable_map, KBASE_CLOCK_DOMAIN_SHADER_CORES)) {
 
@@ -208,6 +244,37 @@ static void kbasep_hwcnt_backend_jm_cc_disable(
 }
 
 
+/**
+ * kbasep_hwcnt_gpu_update_curr_config() - Update the destination buffer with
+ *                                        current config information.
+ * @kbdev:       Non-NULL pointer to kbase device.
+ * @curr_config: Non-NULL pointer to return the current configuration of
+ *               hardware allocated to the GPU.
+ *
+ * The current configuration information is used for architectures where the
+ * max_config interface is available from the Arbiter. In this case the current
+ * allocated hardware is not always the same, so the current config information
+ * is used to correctly map the current allocated resources to the memory layout
+ * that is copied to the user space.
+ *
+ * Return: 0 on success, else error code.
+ */
+static int kbasep_hwcnt_gpu_update_curr_config(
+	struct kbase_device *kbdev,
+	struct kbase_hwcnt_curr_config *curr_config)
+{
+	if (WARN_ON(!kbdev) || WARN_ON(!curr_config))
+		return -EINVAL;
+
+	lockdep_assert_held(&kbdev->hwaccess_lock);
+
+	curr_config->num_l2_slices =
+		kbdev->gpu_props.curr_config.l2_slices;
+	curr_config->shader_present =
+		kbdev->gpu_props.curr_config.shader_present;
+	return 0;
+}
+
 /* JM backend implementation of kbase_hwcnt_backend_timestamp_ns_fn */
 static u64 kbasep_hwcnt_backend_jm_timestamp_ns(
 	struct kbase_hwcnt_backend *backend)
@@ -226,7 +293,8 @@ static int kbasep_hwcnt_backend_jm_dump_enable_nolock(
 		(struct kbase_hwcnt_backend_jm *)backend;
 	struct kbase_context *kctx;
 	struct kbase_device *kbdev;
-	struct kbase_hwcnt_physical_enable_map phys;
+	struct kbase_hwcnt_physical_enable_map phys_enable_map;
+	enum kbase_hwcnt_physical_set phys_counter_set;
 	struct kbase_instr_hwcnt_enable enable;
 	u64 timestamp_ns;
 
@@ -239,23 +307,33 @@ static int kbasep_hwcnt_backend_jm_dump_enable_nolock(
 
 	lockdep_assert_held(&kbdev->hwaccess_lock);
 
-	kbase_hwcnt_gpu_enable_map_to_physical(&phys, enable_map);
+	kbase_hwcnt_gpu_enable_map_to_physical(&phys_enable_map, enable_map);
+
+	kbase_hwcnt_gpu_set_to_physical(&phys_counter_set,
+					backend_jm->info->counter_set);
 
-	enable.fe_bm = phys.fe_bm;
-	enable.shader_bm = phys.shader_bm;
-	enable.tiler_bm = phys.tiler_bm;
-	enable.mmu_l2_bm = phys.mmu_l2_bm;
-	enable.use_secondary = backend_jm->info->use_secondary;
+	enable.fe_bm = phys_enable_map.fe_bm;
+	enable.shader_bm = phys_enable_map.shader_bm;
+	enable.tiler_bm = phys_enable_map.tiler_bm;
+	enable.mmu_l2_bm = phys_enable_map.mmu_l2_bm;
+	enable.counter_set = phys_counter_set;
 	enable.dump_buffer = backend_jm->gpu_dump_va;
 	enable.dump_buffer_bytes = backend_jm->info->dump_bytes;
 
 	timestamp_ns = kbasep_hwcnt_backend_jm_timestamp_ns(backend);
 
+	/* Update the current configuration information. */
+	errcode = kbasep_hwcnt_gpu_update_curr_config(kbdev,
+						      &backend_jm->curr_config);
+	if (errcode)
+		goto error;
+
 	errcode = kbase_instr_hwcnt_enable_internal(kbdev, kctx, &enable);
 	if (errcode)
 		goto error;
 
 	backend_jm->pm_core_mask = kbase_pm_ca_get_instr_core_mask(kbdev);
+
 	backend_jm->enabled = true;
 
 	kbasep_hwcnt_backend_jm_cc_enable(backend_jm, enable_map, timestamp_ns);
@@ -336,7 +414,7 @@ static int kbasep_hwcnt_backend_jm_dump_request(
 	size_t clk;
 	int ret;
 
-	if (!backend_jm || !backend_jm->enabled)
+	if (!backend_jm || !backend_jm->enabled || !dump_time_ns)
 		return -EINVAL;
 
 	kbdev = backend_jm->kctx->kbdev;
@@ -405,6 +483,11 @@ static int kbasep_hwcnt_backend_jm_dump_get(
 	struct kbase_hwcnt_backend_jm *backend_jm =
 		(struct kbase_hwcnt_backend_jm *)backend;
 	size_t clk;
+#ifdef CONFIG_MALI_BIFROST_NO_MALI
+	struct kbase_device *kbdev;
+	unsigned long flags;
+	int errcode;
+#endif
 
 	if (!backend_jm || !dst || !dst_enable_map ||
 	    (backend_jm->info->metadata != dst->metadata) ||
@@ -424,9 +507,24 @@ static int kbasep_hwcnt_backend_jm_dump_get(
 		dst->clk_cnt_buf[clk] = backend_jm->cycle_count_elapsed[clk];
 	}
 
-	return kbase_hwcnt_gpu_dump_get(
-		dst, backend_jm->cpu_dump_va, dst_enable_map,
-		backend_jm->pm_core_mask, accumulate);
+#ifdef CONFIG_MALI_BIFROST_NO_MALI
+	kbdev = backend_jm->kctx->kbdev;
+
+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+
+	/* Update the current configuration information. */
+	errcode = kbasep_hwcnt_gpu_update_curr_config(kbdev,
+		&backend_jm->curr_config);
+
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+
+	if (errcode)
+		return errcode;
+#endif
+
+	return kbase_hwcnt_jm_dump_get(dst, backend_jm->cpu_dump_va,
+				       dst_enable_map, backend_jm->pm_core_mask,
+				       &backend_jm->curr_config, accumulate);
 }
 
 /**
@@ -454,10 +552,8 @@ static int kbasep_hwcnt_backend_jm_dump_alloc(
 	flags = BASE_MEM_PROT_CPU_RD |
 		BASE_MEM_PROT_GPU_WR |
 		BASEP_MEM_PERMANENT_KERNEL_MAPPING |
-		BASE_MEM_CACHED_CPU;
-
-	if (kctx->kbdev->mmu_mode->flags & KBASE_MMU_MODE_HAS_NON_CACHEABLE)
-		flags |= BASE_MEM_UNCACHED_GPU;
+		BASE_MEM_CACHED_CPU |
+		BASE_MEM_UNCACHED_GPU;
 
 	nr_pages = PFN_UP(info->dump_bytes);
 
@@ -496,9 +592,6 @@ static void kbasep_hwcnt_backend_jm_destroy(
 		return;
 
 	if (backend->kctx) {
-#if MALI_USE_CSF
-		unsigned long flags;
-#endif
 		struct kbase_context *kctx = backend->kctx;
 		struct kbase_device *kbdev = kctx->kbdev;
 
@@ -509,13 +602,7 @@ static void kbasep_hwcnt_backend_jm_destroy(
 			kbasep_hwcnt_backend_jm_dump_free(
 				kctx, backend->gpu_dump_va);
 
-#if MALI_USE_CSF
-		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-		kbase_ctx_sched_release_ctx(kctx);
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-#else
 		kbasep_js_release_privileged_ctx(kbdev, kctx);
-#endif
 		kbase_destroy_context(kctx);
 	}
 
@@ -533,9 +620,6 @@ static int kbasep_hwcnt_backend_jm_create(
 	const struct kbase_hwcnt_backend_jm_info *info,
 	struct kbase_hwcnt_backend_jm **out_backend)
 {
-#if MALI_USE_CSF
-	unsigned long flags;
-#endif
 	int errcode;
 	struct kbase_device *kbdev;
 	struct kbase_hwcnt_backend_jm *backend = NULL;
@@ -556,17 +640,7 @@ static int kbasep_hwcnt_backend_jm_create(
 	if (!backend->kctx)
 		goto alloc_error;
 
-#if MALI_USE_CSF
-	kbase_pm_context_active(kbdev);
-	mutex_lock(&kbdev->mmu_hw_mutex);
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	kbase_ctx_sched_retain_ctx(backend->kctx);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-	mutex_unlock(&kbdev->mmu_hw_mutex);
-	kbase_pm_context_idle(kbdev);
-#else
 	kbasep_js_schedule_privileged_ctx(kbdev, backend->kctx);
-#endif
 
 	errcode = kbasep_hwcnt_backend_jm_dump_alloc(
 		info, backend->kctx, &backend->gpu_dump_va);
@@ -596,6 +670,16 @@ static int kbasep_hwcnt_backend_jm_create(
 	return errcode;
 }
 
+/* JM backend implementation of kbase_hwcnt_backend_metadata_fn */
+static const struct kbase_hwcnt_metadata *
+kbasep_hwcnt_backend_jm_metadata(const struct kbase_hwcnt_backend_info *info)
+{
+	if (!info)
+		return NULL;
+
+	return ((const struct kbase_hwcnt_backend_jm_info *)info)->metadata;
+}
+
 /* JM backend implementation of kbase_hwcnt_backend_init_fn */
 static int kbasep_hwcnt_backend_jm_init(
 	const struct kbase_hwcnt_backend_info *info,
@@ -640,7 +724,7 @@ static void kbasep_hwcnt_backend_jm_info_destroy(
 	if (!info)
 		return;
 
-	kbase_hwcnt_gpu_metadata_destroy(info->metadata);
+	kbase_hwcnt_jm_metadata_destroy(info->metadata);
 	kfree(info);
 }
 
@@ -662,7 +746,7 @@ static int kbasep_hwcnt_backend_jm_info_create(
 	WARN_ON(!kbdev);
 	WARN_ON(!out_info);
 
-	errcode = kbase_hwcnt_gpu_info_init(kbdev, &hwcnt_gpu_info);
+	errcode = kbasep_hwcnt_backend_jm_gpu_info_init(kbdev, &hwcnt_gpu_info);
 	if (errcode)
 		return errcode;
 
@@ -673,15 +757,18 @@ static int kbasep_hwcnt_backend_jm_info_create(
 	info->kbdev = kbdev;
 
 #ifdef CONFIG_MALI_BIFROST_PRFCNT_SET_SECONDARY
-	info->use_secondary = true;
+	info->counter_set = KBASE_HWCNT_SET_SECONDARY;
+#elif defined(CONFIG_MALI_PRFCNT_SET_TERTIARY)
+	info->counter_set = KBASE_HWCNT_SET_TERTIARY;
 #else
-	info->use_secondary = false;
+	/* Default to primary */
+	info->counter_set = KBASE_HWCNT_SET_PRIMARY;
 #endif
 
-	errcode = kbase_hwcnt_gpu_metadata_create(
-		&hwcnt_gpu_info, info->use_secondary,
-		&info->metadata,
-		&info->dump_bytes);
+	errcode = kbase_hwcnt_jm_metadata_create(&hwcnt_gpu_info,
+						 info->counter_set,
+						 &info->metadata,
+						 &info->dump_bytes);
 	if (errcode)
 		goto error;
 
@@ -708,8 +795,8 @@ int kbase_hwcnt_backend_jm_create(
 	if (errcode)
 		return errcode;
 
-	iface->metadata = info->metadata;
 	iface->info = (struct kbase_hwcnt_backend_info *)info;
+	iface->metadata = kbasep_hwcnt_backend_jm_metadata;
 	iface->init = kbasep_hwcnt_backend_jm_init;
 	iface->term = kbasep_hwcnt_backend_jm_term;
 	iface->timestamp_ns = kbasep_hwcnt_backend_jm_timestamp_ns;
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_jm.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_jm.h
index f15faeba704a..5d1947ea4021 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_jm.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_backend_jm.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2018, 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_context.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_context.h
index bc50ad12c2f4..403b1c5ff149 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_context.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_context.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
@@ -28,6 +27,7 @@
 #define _KBASE_HWCNT_CONTEXT_H_
 
 #include <linux/types.h>
+#include <linux/workqueue.h>
 
 struct kbase_hwcnt_backend_interface;
 struct kbase_hwcnt_context;
@@ -66,7 +66,7 @@ const struct kbase_hwcnt_metadata *kbase_hwcnt_context_metadata(
 
 /**
  * kbase_hwcnt_context_disable() - Increment the disable count of the context.
- * @hctx: Pointer to the hardware counter context.
+ * @hctx: Non-NULL pointer to the hardware counter context.
  *
  * If a call to this function increments the disable count from 0 to 1, and
  * an accumulator has been acquired, then a counter dump will be performed
@@ -84,7 +84,7 @@ void kbase_hwcnt_context_disable(struct kbase_hwcnt_context *hctx);
  * kbase_hwcnt_context_disable_atomic() - Increment the disable count of the
  *                                        context if possible in an atomic
  *                                        context.
- * @hctx: Pointer to the hardware counter context.
+ * @hctx: Non-NULL pointer to the hardware counter context.
  *
  * This function will only succeed if hardware counters are effectively already
  * disabled, i.e. there is no accumulator, the disable count is already
@@ -99,7 +99,7 @@ bool kbase_hwcnt_context_disable_atomic(struct kbase_hwcnt_context *hctx);
 
 /**
  * kbase_hwcnt_context_enable() - Decrement the disable count of the context.
- * @hctx: Pointer to the hardware counter context.
+ * @hctx: Non-NULL pointer to the hardware counter context.
  *
  * If a call to this function decrements the disable count from 1 to 0, and
  * an accumulator has been acquired, then counters will be re-enabled via the
@@ -116,4 +116,36 @@ bool kbase_hwcnt_context_disable_atomic(struct kbase_hwcnt_context *hctx);
  */
 void kbase_hwcnt_context_enable(struct kbase_hwcnt_context *hctx);
 
+/**
+ * kbase_hwcnt_context_queue_work() - Queue hardware counter related async
+ *                                    work on a workqueue specialized for
+ *                                    hardware counters.
+ * @hctx: Non-NULL pointer to the hardware counter context.
+ * @work: Non-NULL pointer to work to queue.
+ *
+ * Return: false if work was already on a queue, true otherwise.
+ *
+ * Performance counter related work is high priority, short running, and
+ * generally CPU locality is unimportant. There is no standard workqueue that
+ * can service this flavor of work.
+ *
+ * Rather than have each user of counters define their own workqueue, we have
+ * a centralized one in here that anybody using this hardware counter API
+ * should use.
+ *
+ * Before the context is destroyed, all work submitted must have been completed.
+ * Given that the work enqueued via this function is likely to be hardware
+ * counter related and will therefore use the context object, this is likely
+ * to be behavior that will occur naturally.
+ *
+ * Historical note: prior to this centralized workqueue, the system_highpri_wq
+ * was used. This was generally fine, except when a particularly long running,
+ * higher priority thread ended up scheduled on the enqueuing CPU core. Given
+ * that hardware counters requires tight integration with power management,
+ * this meant progress through the power management states could be stalled
+ * for however long that higher priority thread took.
+ */
+bool kbase_hwcnt_context_queue_work(struct kbase_hwcnt_context *hctx,
+				    struct work_struct *work);
+
 #endif /* _KBASE_HWCNT_CONTEXT_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_gpu.c b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_gpu.c
index 499f3bc23bec..4fba6b6d33c2 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_gpu.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_gpu.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,16 +17,13 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "mali_kbase_hwcnt_gpu.h"
 #include "mali_kbase_hwcnt_types.h"
-#include "mali_kbase.h"
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-#include "backend/gpu/mali_kbase_model_dummy.h"
-#endif
+
+#include <linux/bug.h>
+#include <linux/err.h>
 
 #define KBASE_HWCNT_V5_BLOCK_TYPE_COUNT 4
 #define KBASE_HWCNT_V5_HEADERS_PER_BLOCK 4
@@ -35,20 +33,102 @@
 /* Index of the PRFCNT_EN header into a V5 counter block */
 #define KBASE_HWCNT_V5_PRFCNT_EN_HEADER 2
 
+static void kbasep_get_fe_block_type(u64 *dst, enum kbase_hwcnt_set counter_set,
+				     bool is_csf)
+{
+	switch (counter_set) {
+	case KBASE_HWCNT_SET_PRIMARY:
+		*dst = KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FE;
+		break;
+	case KBASE_HWCNT_SET_SECONDARY:
+		if (is_csf) {
+			*dst = KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FE2;
+		} else {
+			*dst = KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_UNDEFINED;
+		}
+		break;
+	case KBASE_HWCNT_SET_TERTIARY:
+		if (is_csf) {
+			*dst = KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FE3;
+		} else {
+			*dst = KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_UNDEFINED;
+		}
+		break;
+	default:
+		WARN_ON(true);
+	}
+}
+
+static void kbasep_get_tiler_block_type(u64 *dst,
+					enum kbase_hwcnt_set counter_set)
+{
+	switch (counter_set) {
+	case KBASE_HWCNT_SET_PRIMARY:
+		*dst = KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_TILER;
+		break;
+	case KBASE_HWCNT_SET_SECONDARY:
+	case KBASE_HWCNT_SET_TERTIARY:
+		*dst = KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_UNDEFINED;
+		break;
+	default:
+		WARN_ON(true);
+	}
+}
+
+static void kbasep_get_sc_block_type(u64 *dst, enum kbase_hwcnt_set counter_set,
+				     bool is_csf)
+{
+	switch (counter_set) {
+	case KBASE_HWCNT_SET_PRIMARY:
+		*dst = KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC;
+		break;
+	case KBASE_HWCNT_SET_SECONDARY:
+		*dst = KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC2;
+		break;
+	case KBASE_HWCNT_SET_TERTIARY:
+		if (is_csf) {
+			*dst = KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC3;
+		} else {
+			*dst = KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_UNDEFINED;
+		}
+		break;
+	default:
+		WARN_ON(true);
+	}
+}
+
+static void kbasep_get_memsys_block_type(u64 *dst,
+					 enum kbase_hwcnt_set counter_set)
+{
+	switch (counter_set) {
+	case KBASE_HWCNT_SET_PRIMARY:
+		*dst = KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS;
+		break;
+	case KBASE_HWCNT_SET_SECONDARY:
+		*dst = KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS2;
+		break;
+	case KBASE_HWCNT_SET_TERTIARY:
+		*dst = KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_UNDEFINED;
+		break;
+	default:
+		WARN_ON(true);
+	}
+}
+
 /**
- * kbasep_hwcnt_backend_gpu_metadata_v5_create() - Create hardware counter
- *                                                 metadata for a v5 GPU.
- * @v5_info:       Non-NULL pointer to hwcnt info for a v5 GPU.
- * @use_secondary: True if secondary performance counters should be used, else
- *                 false. Ignored if secondary counters are not supported.
+ * kbasep_hwcnt_backend_gpu_metadata_create() - Create hardware counter metadata
+ *                                              for the GPU.
+ * @gpu_info:      Non-NULL pointer to hwcnt info for current GPU.
+ * @is_csf:        true for CSF GPU, otherwise false.
+ * @counter_set:   The performance counter set to use.
  * @metadata:      Non-NULL pointer to where created metadata is stored
  *                 on success.
  *
  * Return: 0 on success, else error code.
  */
-static int kbasep_hwcnt_backend_gpu_metadata_v5_create(
-	const struct kbase_hwcnt_gpu_v5_info *v5_info,
-	bool use_secondary,
+static int kbasep_hwcnt_backend_gpu_metadata_create(
+	const struct kbase_hwcnt_gpu_info *gpu_info, const bool is_csf,
+	enum kbase_hwcnt_set counter_set,
 	const struct kbase_hwcnt_metadata **metadata)
 {
 	struct kbase_hwcnt_description desc;
@@ -58,13 +138,13 @@ static int kbasep_hwcnt_backend_gpu_metadata_v5_create(
 	size_t non_sc_block_count;
 	size_t sc_block_count;
 
-	WARN_ON(!v5_info);
+	WARN_ON(!gpu_info);
 	WARN_ON(!metadata);
 
 	/* Calculate number of block instances that aren't shader cores */
-	non_sc_block_count = 2 + v5_info->l2_count;
+	non_sc_block_count = 2 + gpu_info->l2_count;
 	/* Calculate number of block instances that are shader cores */
-	sc_block_count = fls64(v5_info->core_mask);
+	sc_block_count = fls64(gpu_info->core_mask);
 
 	/*
 	 * A system can have up to 64 shader cores, but the 64-bit
@@ -76,23 +156,21 @@ static int kbasep_hwcnt_backend_gpu_metadata_v5_create(
 	if ((sc_block_count + non_sc_block_count) > KBASE_HWCNT_AVAIL_MASK_BITS)
 		return -EINVAL;
 
-	/* One Job Manager block */
-	blks[0].type = KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_JM;
+	/* One Front End block */
+	kbasep_get_fe_block_type(&blks[0].type, counter_set, is_csf);
 	blks[0].inst_cnt = 1;
 	blks[0].hdr_cnt = KBASE_HWCNT_V5_HEADERS_PER_BLOCK;
 	blks[0].ctr_cnt = KBASE_HWCNT_V5_COUNTERS_PER_BLOCK;
 
 	/* One Tiler block */
-	blks[1].type = KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_TILER;
+	kbasep_get_tiler_block_type(&blks[1].type, counter_set);
 	blks[1].inst_cnt = 1;
 	blks[1].hdr_cnt = KBASE_HWCNT_V5_HEADERS_PER_BLOCK;
 	blks[1].ctr_cnt = KBASE_HWCNT_V5_COUNTERS_PER_BLOCK;
 
 	/* l2_count memsys blks */
-	blks[2].type = use_secondary ?
-		KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS2 :
-		KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS;
-	blks[2].inst_cnt = v5_info->l2_count;
+	kbasep_get_memsys_block_type(&blks[2].type, counter_set);
+	blks[2].inst_cnt = gpu_info->l2_count;
 	blks[2].hdr_cnt = KBASE_HWCNT_V5_HEADERS_PER_BLOCK;
 	blks[2].ctr_cnt = KBASE_HWCNT_V5_COUNTERS_PER_BLOCK;
 
@@ -112,9 +190,7 @@ static int kbasep_hwcnt_backend_gpu_metadata_v5_create(
 	 * requirements, and embed the core mask into the availability mask so
 	 * we can determine later which shader cores physically exist.
 	 */
-	blks[3].type = use_secondary ?
-		KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC2 :
-		KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC;
+	kbasep_get_sc_block_type(&blks[3].type, counter_set, is_csf);
 	blks[3].inst_cnt = sc_block_count;
 	blks[3].hdr_cnt = KBASE_HWCNT_V5_HEADERS_PER_BLOCK;
 	blks[3].ctr_cnt = KBASE_HWCNT_V5_COUNTERS_PER_BLOCK;
@@ -127,72 +203,35 @@ static int kbasep_hwcnt_backend_gpu_metadata_v5_create(
 
 	desc.grp_cnt = 1;
 	desc.grps = &group;
-	desc.clk_cnt = v5_info->clk_cnt;
+	desc.clk_cnt = gpu_info->clk_cnt;
 
 	/* The JM, Tiler, and L2s are always available, and are before cores */
 	desc.avail_mask = (1ull << non_sc_block_count) - 1;
 	/* Embed the core mask directly in the availability mask */
-	desc.avail_mask |= (v5_info->core_mask << non_sc_block_count);
+	desc.avail_mask |= (gpu_info->core_mask << non_sc_block_count);
 
 	return kbase_hwcnt_metadata_create(&desc, metadata);
 }
 
 /**
- * kbasep_hwcnt_backend_gpu_v5_dump_bytes() - Get the raw dump buffer size for a
- *                                            V5 GPU.
- * @v5_info: Non-NULL pointer to hwcnt info for a v5 GPU.
+ * kbasep_hwcnt_backend_jm_dump_bytes() - Get the raw dump buffer size for the
+ *                                        GPU.
+ * @gpu_info: Non-NULL pointer to hwcnt info for the GPU.
  *
- * Return: Size of buffer the V5 GPU needs to perform a counter dump.
+ * Return: Size of buffer the GPU needs to perform a counter dump.
  */
-static size_t kbasep_hwcnt_backend_gpu_v5_dump_bytes(
-	const struct kbase_hwcnt_gpu_v5_info *v5_info)
-{
-	WARN_ON(!v5_info);
-	return (2 + v5_info->l2_count + fls64(v5_info->core_mask)) *
-		KBASE_HWCNT_V5_VALUES_PER_BLOCK *
-		KBASE_HWCNT_VALUE_BYTES;
-}
-
-int kbase_hwcnt_gpu_info_init(
-	struct kbase_device *kbdev,
-	struct kbase_hwcnt_gpu_info *info)
+static size_t
+kbasep_hwcnt_backend_jm_dump_bytes(const struct kbase_hwcnt_gpu_info *gpu_info)
 {
-	size_t clk;
+	WARN_ON(!gpu_info);
 
-	if (!kbdev || !info)
-		return -EINVAL;
-
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-	/* NO_MALI uses V5 layout, regardless of the underlying platform. */
-	info->type = KBASE_HWCNT_GPU_GROUP_TYPE_V5;
-	info->v5.l2_count = KBASE_DUMMY_MODEL_MAX_MEMSYS_BLOCKS;
-	info->v5.core_mask = (1ull << KBASE_DUMMY_MODEL_MAX_SHADER_CORES) - 1;
-#else
-	{
-		const struct base_gpu_props *props = &kbdev->gpu_props.props;
-		const size_t l2_count = props->l2_props.num_l2_slices;
-		const size_t core_mask =
-			props->coherency_info.group[0].core_mask;
-
-		info->type = KBASE_HWCNT_GPU_GROUP_TYPE_V5;
-		info->v5.l2_count = l2_count;
-		info->v5.core_mask = core_mask;
-	}
-#endif
-
-	/* Determine the number of available clock domains. */
-	for (clk = 0; clk < BASE_MAX_NR_CLOCKS_REGULATORS; clk++) {
-		if (kbdev->pm.clk_rtm.clks[clk] == NULL)
-			break;
-	}
-	info->v5.clk_cnt = clk;
-
-	return 0;
+	return (2 + gpu_info->l2_count + fls64(gpu_info->core_mask)) *
+	       KBASE_HWCNT_V5_VALUES_PER_BLOCK * KBASE_HWCNT_VALUE_BYTES;
 }
 
-int kbase_hwcnt_gpu_metadata_create(
-	const struct kbase_hwcnt_gpu_info *info,
-	bool use_secondary,
+int kbase_hwcnt_jm_metadata_create(
+	const struct kbase_hwcnt_gpu_info *gpu_info,
+	enum kbase_hwcnt_set counter_set,
 	const struct kbase_hwcnt_metadata **out_metadata,
 	size_t *out_dump_bytes)
 {
@@ -200,16 +239,19 @@ int kbase_hwcnt_gpu_metadata_create(
 	const struct kbase_hwcnt_metadata *metadata;
 	size_t dump_bytes;
 
-	if (!info || !out_metadata || !out_dump_bytes)
+	if (!gpu_info || !out_metadata || !out_dump_bytes)
 		return -EINVAL;
 
-	if (info->type == KBASE_HWCNT_GPU_GROUP_TYPE_V5) {
-		dump_bytes = kbasep_hwcnt_backend_gpu_v5_dump_bytes(&info->v5);
-		errcode = kbasep_hwcnt_backend_gpu_metadata_v5_create(
-			&info->v5, use_secondary, &metadata);
-	} else {
-		return -EINVAL;
-	}
+	/*
+	 * For architectures where a max_config interface is available
+	 * from the arbiter, the v5 dump bytes and the metadata v5 are
+	 * based on the maximum possible allocation of the HW in the
+	 * GPU cause it needs to be prepared for the worst case where
+	 * all the available L2 cache and Shader cores are allocated.
+	 */
+	dump_bytes = kbasep_hwcnt_backend_jm_dump_bytes(gpu_info);
+	errcode = kbasep_hwcnt_backend_gpu_metadata_create(
+		gpu_info, false, counter_set, &metadata);
 	if (errcode)
 		return errcode;
 
@@ -224,9 +266,37 @@ int kbase_hwcnt_gpu_metadata_create(
 
 	return 0;
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_gpu_metadata_create);
 
-void kbase_hwcnt_gpu_metadata_destroy(
+void kbase_hwcnt_jm_metadata_destroy(const struct kbase_hwcnt_metadata *metadata)
+{
+	if (!metadata)
+		return;
+
+	kbase_hwcnt_metadata_destroy(metadata);
+}
+
+int kbase_hwcnt_csf_metadata_create(
+	const struct kbase_hwcnt_gpu_info *gpu_info,
+	enum kbase_hwcnt_set counter_set,
+	const struct kbase_hwcnt_metadata **out_metadata)
+{
+	int errcode;
+	const struct kbase_hwcnt_metadata *metadata;
+
+	if (!gpu_info || !out_metadata)
+		return -EINVAL;
+
+	errcode = kbasep_hwcnt_backend_gpu_metadata_create(
+		gpu_info, true, counter_set, &metadata);
+	if (errcode)
+		return errcode;
+
+	*out_metadata = metadata;
+
+	return 0;
+}
+
+void kbase_hwcnt_csf_metadata_destroy(
 	const struct kbase_hwcnt_metadata *metadata)
 {
 	if (!metadata)
@@ -234,7 +304,6 @@ void kbase_hwcnt_gpu_metadata_destroy(
 
 	kbase_hwcnt_metadata_destroy(metadata);
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_gpu_metadata_destroy);
 
 static bool is_block_type_shader(
 	const u64 grp_type,
@@ -248,24 +317,48 @@ static bool is_block_type_shader(
 		return false;
 
 	if (blk_type == KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC ||
-	    blk_type == KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC2)
+	    blk_type == KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC2 ||
+	    blk_type == KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC3)
 		is_shader = true;
 
 	return is_shader;
 }
 
-int kbase_hwcnt_gpu_dump_get(
-	struct kbase_hwcnt_dump_buffer *dst,
-	void *src,
-	const struct kbase_hwcnt_enable_map *dst_enable_map,
-	u64 pm_core_mask,
-	bool accumulate)
+static bool is_block_type_l2_cache(
+	const u64 grp_type,
+	const u64 blk_type)
+{
+	bool is_l2_cache = false;
+
+	switch (grp_type) {
+	case KBASE_HWCNT_GPU_GROUP_TYPE_V5:
+		if (blk_type == KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS ||
+		    blk_type == KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS2)
+			is_l2_cache = true;
+		break;
+	default:
+		/* Warn on unknown group type */
+		WARN_ON(true);
+	}
+
+	return is_l2_cache;
+}
+
+int kbase_hwcnt_jm_dump_get(struct kbase_hwcnt_dump_buffer *dst, void *src,
+			    const struct kbase_hwcnt_enable_map *dst_enable_map,
+			    u64 pm_core_mask,
+			    const struct kbase_hwcnt_curr_config *curr_config,
+			    bool accumulate)
 {
 	const struct kbase_hwcnt_metadata *metadata;
 	const u32 *dump_src;
 	size_t src_offset, grp, blk, blk_inst;
 	u64 core_mask = pm_core_mask;
 
+	/* Variables to deal with the current configuration */
+	int l2_count = 0;
+	bool hw_res_available = true;
+
 	if (!dst || !src || !dst_enable_map ||
 	    (dst_enable_map->metadata != dst->metadata))
 		return -EINVAL;
@@ -287,15 +380,43 @@ int kbase_hwcnt_gpu_dump_get(
 		const bool is_shader_core = is_block_type_shader(
 			kbase_hwcnt_metadata_group_type(metadata, grp),
 			blk_type, blk);
+		const bool is_l2_cache = is_block_type_l2_cache(
+			kbase_hwcnt_metadata_group_type(metadata, grp),
+			blk_type);
+
+		/*
+		 * If l2 blocks is greater than the current allocated number of
+		 * L2 slices, there is no hw allocated to that block.
+		 */
+		if (is_l2_cache) {
+			l2_count++;
+			if (l2_count > curr_config->num_l2_slices)
+				hw_res_available = false;
+			else
+				hw_res_available = true;
+		}
+		/*
+		 * For the shader cores, the current shader_mask allocated is
+		 * always a subgroup of the maximum shader_mask, so after
+		 * jumping any L2 cache not available the available shader cores
+		 * will always have a matching set of blk instances available to
+		 * accumulate them.
+		 */
+		else {
+			hw_res_available = true;
+		}
 
-		/* Early out if no values in the dest block are enabled */
+		/*
+		 * Early out if no values in the dest block are enabled or if
+		 * the resource target of the block is not available in the HW.
+		 */
 		if (kbase_hwcnt_enable_map_block_enabled(
 			dst_enable_map, grp, blk, blk_inst)) {
 			u32 *dst_blk = kbase_hwcnt_dump_buffer_block_instance(
 				dst, grp, blk, blk_inst);
 			const u32 *src_blk = dump_src + src_offset;
 
-			if (!is_shader_core || (core_mask & 1)) {
+			if ((!is_shader_core || (core_mask & 1)) && hw_res_available) {
 				if (accumulate) {
 					kbase_hwcnt_dump_buffer_block_accumulate(
 						dst_blk, src_blk, hdr_cnt,
@@ -311,14 +432,60 @@ int kbase_hwcnt_gpu_dump_get(
 			}
 		}
 
-		src_offset += (hdr_cnt + ctr_cnt);
+		/* Just increase the src_offset if the HW is available */
+		if (hw_res_available)
+			src_offset += (hdr_cnt + ctr_cnt);
 		if (is_shader_core)
 			core_mask = core_mask >> 1;
 	}
 
 	return 0;
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_gpu_dump_get);
+
+int kbase_hwcnt_csf_dump_get(struct kbase_hwcnt_dump_buffer *dst, void *src,
+			     const struct kbase_hwcnt_enable_map *dst_enable_map,
+			     bool accumulate)
+{
+	const struct kbase_hwcnt_metadata *metadata;
+	const u32 *dump_src;
+	size_t src_offset, grp, blk, blk_inst;
+
+	if (!dst || !src || !dst_enable_map ||
+	    (dst_enable_map->metadata != dst->metadata))
+		return -EINVAL;
+
+	metadata = dst->metadata;
+	dump_src = (const u32 *)src;
+	src_offset = 0;
+
+	kbase_hwcnt_metadata_for_each_block(metadata, grp, blk, blk_inst) {
+		const size_t hdr_cnt = kbase_hwcnt_metadata_block_headers_count(
+			metadata, grp, blk);
+		const size_t ctr_cnt =
+			kbase_hwcnt_metadata_block_counters_count(metadata, grp,
+								  blk);
+
+		/* Early out if no values in the dest block are enabled */
+		if (kbase_hwcnt_enable_map_block_enabled(dst_enable_map, grp,
+							 blk, blk_inst)) {
+			u32 *dst_blk = kbase_hwcnt_dump_buffer_block_instance(
+				dst, grp, blk, blk_inst);
+			const u32 *src_blk = dump_src + src_offset;
+
+			if (accumulate) {
+				kbase_hwcnt_dump_buffer_block_accumulate(
+					dst_blk, src_blk, hdr_cnt, ctr_cnt);
+			} else {
+				kbase_hwcnt_dump_buffer_block_copy(
+					dst_blk, src_blk, (hdr_cnt + ctr_cnt));
+			}
+		}
+
+		src_offset += (hdr_cnt + ctr_cnt);
+	}
+
+	return 0;
+}
 
 /**
  * kbasep_hwcnt_backend_gpu_block_map_to_physical() - Convert from a block
@@ -437,7 +604,12 @@ void kbase_hwcnt_gpu_enable_map_to_physical(
 		    KBASE_HWCNT_GPU_GROUP_TYPE_V5) {
 			WARN_ON(blk_val_cnt != KBASE_HWCNT_V5_VALUES_PER_BLOCK);
 			switch ((enum kbase_hwcnt_gpu_v5_block_type)blk_type) {
-			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_JM:
+			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_UNDEFINED:
+				/* Nothing to do in this case. */
+				break;
+			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FE:
+			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FE2:
+			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FE3:
 				fe_bm |= *blk_map;
 				break;
 			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_TILER:
@@ -445,6 +617,7 @@ void kbase_hwcnt_gpu_enable_map_to_physical(
 				break;
 			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC:
 			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC2:
+			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC3:
 				shader_bm |= *blk_map;
 				break;
 			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS:
@@ -468,7 +641,24 @@ void kbase_hwcnt_gpu_enable_map_to_physical(
 	dst->mmu_l2_bm =
 		kbasep_hwcnt_backend_gpu_block_map_to_physical(mmu_l2_bm, 0);
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_gpu_enable_map_to_physical);
+
+void kbase_hwcnt_gpu_set_to_physical(enum kbase_hwcnt_physical_set *dst,
+				     enum kbase_hwcnt_set src)
+{
+	switch (src) {
+	case KBASE_HWCNT_SET_PRIMARY:
+		*dst = KBASE_HWCNT_PHYSICAL_SET_PRIMARY;
+		break;
+	case KBASE_HWCNT_SET_SECONDARY:
+		*dst = KBASE_HWCNT_PHYSICAL_SET_SECONDARY;
+		break;
+	case KBASE_HWCNT_SET_TERTIARY:
+		*dst = KBASE_HWCNT_PHYSICAL_SET_TERTIARY;
+		break;
+	default:
+		WARN_ON(true);
+	}
+}
 
 void kbase_hwcnt_gpu_enable_map_from_physical(
 	struct kbase_hwcnt_enable_map *dst,
@@ -512,7 +702,12 @@ void kbase_hwcnt_gpu_enable_map_from_physical(
 		    KBASE_HWCNT_GPU_GROUP_TYPE_V5) {
 			WARN_ON(blk_val_cnt != KBASE_HWCNT_V5_VALUES_PER_BLOCK);
 			switch ((enum kbase_hwcnt_gpu_v5_block_type)blk_type) {
-			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_JM:
+			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_UNDEFINED:
+				/* Nothing to do in this case. */
+				break;
+			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FE:
+			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FE2:
+			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FE3:
 				*blk_map = fe_bm;
 				break;
 			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_TILER:
@@ -520,6 +715,7 @@ void kbase_hwcnt_gpu_enable_map_from_physical(
 				break;
 			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC:
 			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC2:
+			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC3:
 				*blk_map = shader_bm;
 				break;
 			case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS:
@@ -534,7 +730,6 @@ void kbase_hwcnt_gpu_enable_map_from_physical(
 		}
 	}
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_gpu_enable_map_from_physical);
 
 void kbase_hwcnt_gpu_patch_dump_headers(
 	struct kbase_hwcnt_dump_buffer *buf,
@@ -568,4 +763,3 @@ void kbase_hwcnt_gpu_patch_dump_headers(
 		}
 	}
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_gpu_patch_dump_headers);
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_gpu.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_gpu.h
index f0d51763f7f7..9b846a94bc3a 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_gpu.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_gpu.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_HWCNT_GPU_H_
@@ -30,34 +29,67 @@ struct kbase_hwcnt_metadata;
 struct kbase_hwcnt_enable_map;
 struct kbase_hwcnt_dump_buffer;
 
+#define KBASE_HWCNT_V5_BLOCK_TYPE_COUNT 4
+#define KBASE_HWCNT_V5_HEADERS_PER_BLOCK 4
+#define KBASE_HWCNT_V5_COUNTERS_PER_BLOCK 60
+#define KBASE_HWCNT_V5_VALUES_PER_BLOCK                                        \
+	(KBASE_HWCNT_V5_HEADERS_PER_BLOCK + KBASE_HWCNT_V5_COUNTERS_PER_BLOCK)
+/** Index of the PRFCNT_EN header into a V5 counter block */
+#define KBASE_HWCNT_V5_PRFCNT_EN_HEADER 2
+
 /**
  * enum kbase_hwcnt_gpu_group_type - GPU hardware counter group types, used to
  *                                   identify metadata groups.
  * @KBASE_HWCNT_GPU_GROUP_TYPE_V5: GPU V5 group type.
  */
 enum kbase_hwcnt_gpu_group_type {
-	KBASE_HWCNT_GPU_GROUP_TYPE_V5 = 0x10,
+	KBASE_HWCNT_GPU_GROUP_TYPE_V5,
 };
 
 /**
  * enum kbase_hwcnt_gpu_v5_block_type - GPU V5 hardware counter block types,
  *                                      used to identify metadata blocks.
- * @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_JM:      Job Manager block.
- * @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_TILER:   Tiler block.
- * @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC:      Shader Core block.
- * @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC2:     Secondary Shader Core block.
- * @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS:  Memsys block.
- * @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS2: Secondary Memsys block.
+ * @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_UNDEFINED: Undefined block (e.g. if a
+ *                                                counter set that a block
+ *                                                doesn't support is used).
+ * @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FE:        Front End block (Job manager
+ *                                                or CSF HW).
+ * @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FE2:       Secondary Front End block (Job
+ *                                                manager or CSF HW).
+ * @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FE3:       Tertiary Front End block (Job
+ *                                                manager or CSF HW).
+ * @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_TILER:     Tiler block.
+ * @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC:        Shader Core block.
+ * @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC2:       Secondary Shader Core block.
+ * @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC3:       Tertiary Shader Core block.
+ * @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS:    Memsys block.
+ * @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS2:   Secondary Memsys block.
  */
 enum kbase_hwcnt_gpu_v5_block_type {
-	KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_JM = 0x40,
+	KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_UNDEFINED,
+	KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FE,
+	KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FE2,
+	KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FE3,
 	KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_TILER,
 	KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC,
 	KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC2,
+	KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC3,
 	KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS,
 	KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS2,
 };
 
+/**
+ * enum kbase_hwcnt_set - GPU hardware counter sets
+ * @KBASE_HWCNT_SET_PRIMARY:   The Primary set of counters
+ * @KBASE_HWCNT_SET_SECONDARY: The Secondary set of counters
+ * @KBASE_HWCNT_SET_TERTIARY:  The Tertiary set of counters
+ */
+enum kbase_hwcnt_set {
+	KBASE_HWCNT_SET_PRIMARY,
+	KBASE_HWCNT_SET_SECONDARY,
+	KBASE_HWCNT_SET_TERTIARY,
+};
+
 /**
  * struct kbase_hwcnt_physical_enable_map - Representation of enable map
  *                                          directly used by GPU.
@@ -73,48 +105,77 @@ struct kbase_hwcnt_physical_enable_map {
 	u32 mmu_l2_bm;
 };
 
+/*
+ * Values for Hardware Counter SET_SELECT value.
+ * Directly passed to HW.
+ */
+enum kbase_hwcnt_physical_set {
+	KBASE_HWCNT_PHYSICAL_SET_PRIMARY = 0,
+	KBASE_HWCNT_PHYSICAL_SET_SECONDARY = 1,
+	KBASE_HWCNT_PHYSICAL_SET_TERTIARY = 2,
+};
+
 /**
- * struct kbase_hwcnt_gpu_v5_info - Information about hwcnt blocks on v5 GPUs.
+ * struct kbase_hwcnt_gpu_info - Information about hwcnt blocks on the GPUs.
  * @l2_count:   L2 cache count.
  * @core_mask:  Shader core mask. May be sparse.
  * @clk_cnt:    Number of clock domains available.
  */
-struct kbase_hwcnt_gpu_v5_info {
+struct kbase_hwcnt_gpu_info {
 	size_t l2_count;
 	u64 core_mask;
 	u8 clk_cnt;
 };
 
 /**
- * struct kbase_hwcnt_gpu_info - Tagged union with information about the current
- *                               GPU's hwcnt blocks.
- * @type: GPU type.
- * @v5:   Info filled in if a v5 GPU.
- */
-struct kbase_hwcnt_gpu_info {
-	enum kbase_hwcnt_gpu_group_type type;
-	struct kbase_hwcnt_gpu_v5_info v5;
-};
-
-/**
- * kbase_hwcnt_gpu_info_init() - Initialise an info structure used to create the
- *                               hwcnt metadata.
- * @kbdev: Non-NULL pointer to kbase device.
- * @info:  Non-NULL pointer to data structure to be filled in.
+ * struct kbase_hwcnt_curr_config - Current Configuration of HW allocated to the
+ *                                  GPU.
+ * @num_l2_slices:  Current number of L2 slices allocated to the GPU.
+ * @shader_present: Current shader present bitmap that is allocated to the GPU.
+ *
+ * For architectures with the max_config interface available from the Arbiter,
+ * the current resources allocated may change during runtime due to a
+ * re-partitioning (possible with partition manager). Thus, the HWC needs to be
+ * prepared to report any possible set of counters. For this reason the memory
+ * layout in the userspace is based on the maximum possible allocation. On the
+ * other hand, each partition has just the view of its currently allocated
+ * resources. Therefore, it is necessary to correctly map the dumped HWC values
+ * from the registers into this maximum memory layout so that it can be exposed
+ * to the userspace side correctly.
+ *
+ * For L2 cache just the number is enough once the allocated ones will be
+ * accumulated on the first L2 slots available in the destination buffer.
  *
- * The initialised info struct will only be valid for use while kbdev is valid.
+ * For the correct mapping of the shader cores it is necessary to jump all the
+ * L2 cache slots in the destination buffer that are not allocated. But, it is
+ * not necessary to add any logic to map the shader cores bitmap into the memory
+ * layout because the shader_present allocated will always be a subset of the
+ * maximum shader_present. It is possible because:
+ * 1 - Partitions are made of slices and they are always ordered from the ones
+ *     with more shader cores to the ones with less.
+ * 2 - The shader cores in a slice are always contiguous.
+ * 3 - A partition can only have a contiguous set of slices allocated to it.
+ * So, for example, if 4 slices are available in total, 1 with 4 cores, 2 with
+ * 3 cores and 1 with 2 cores. The maximum possible shader_present would be:
+ * 0x0011|0111|0111|1111 -> note the order and that the shader cores are
+ *                          contiguous in any slice.
+ * Supposing that a partition takes the two slices in the middle, the current
+ * config shader_present for this partition would be:
+ * 0x0111|0111 -> note that this is a subset of the maximum above and the slices
+ *                are contiguous.
+ * Therefore, by directly copying any subset of the maximum possible
+ * shader_present the mapping is already achieved.
  */
-int kbase_hwcnt_gpu_info_init(
-	struct kbase_device *kbdev,
-	struct kbase_hwcnt_gpu_info *info);
+struct kbase_hwcnt_curr_config {
+	size_t num_l2_slices;
+	u64 shader_present;
+};
 
 /**
- * kbase_hwcnt_gpu_metadata_create() - Create hardware counter metadata for the
- *                                     current GPU.
- * @info:           Non-NULL pointer to info struct initialised by
- *                  kbase_hwcnt_gpu_info_init.
- * @use_secondary:  True if secondary performance counters should be used, else
- *                  false. Ignored if secondary counters are not supported.
+ * kbase_hwcnt_jm_metadata_create() - Create hardware counter metadata for the
+ *                                    JM GPUs.
+ * @info:           Non-NULL pointer to info struct.
+ * @counter_set:    The performance counter set used.
  * @out_metadata:   Non-NULL pointer to where created metadata is stored on
  *                  success.
  * @out_dump_bytes: Non-NULL pointer to where the size of the GPU counter dump
@@ -122,44 +183,91 @@ int kbase_hwcnt_gpu_info_init(
  *
  * Return: 0 on success, else error code.
  */
-int kbase_hwcnt_gpu_metadata_create(
+int kbase_hwcnt_jm_metadata_create(
 	const struct kbase_hwcnt_gpu_info *info,
-	bool use_secondary,
+	enum kbase_hwcnt_set counter_set,
 	const struct kbase_hwcnt_metadata **out_metadata,
 	size_t *out_dump_bytes);
 
 /**
- * kbase_hwcnt_gpu_metadata_destroy() - Destroy GPU hardware counter metadata.
+ * kbase_hwcnt_jm_metadata_destroy() - Destroy JM GPU hardware counter metadata.
+ *
  * @metadata: Pointer to metadata to destroy.
  */
-void kbase_hwcnt_gpu_metadata_destroy(
+void kbase_hwcnt_jm_metadata_destroy(
 	const struct kbase_hwcnt_metadata *metadata);
 
 /**
- * kbase_hwcnt_gpu_dump_get() - Copy or accumulate enabled counters from the raw
+ * kbase_hwcnt_csf_metadata_create() - Create hardware counter metadata for the
+ *                                     CSF GPUs.
+ * @info:           Non-NULL pointer to info struct.
+ * @counter_set:    The performance counter set used.
+ * @out_metadata:   Non-NULL pointer to where created metadata is stored on
+ *                  success.
+ *
+ * Return: 0 on success, else error code.
+ */
+int kbase_hwcnt_csf_metadata_create(
+	const struct kbase_hwcnt_gpu_info *info,
+	enum kbase_hwcnt_set counter_set,
+	const struct kbase_hwcnt_metadata **out_metadata);
+
+/**
+ * kbase_hwcnt_csf_metadata_destroy() - Destroy CSF GPU hardware counter
+ *                                      metadata.
+ * @metadata: Pointer to metadata to destroy.
+ */
+void kbase_hwcnt_csf_metadata_destroy(
+	const struct kbase_hwcnt_metadata *metadata);
+
+/**
+ * kbase_hwcnt_jm_dump_get() - Copy or accumulate enabled counters from the raw
+ *                             dump buffer in src into the dump buffer
+ *                             abstraction in dst.
+ * @dst:            Non-NULL pointer to dst dump buffer.
+ * @src:            Non-NULL pointer to src raw dump buffer, of same length
+ *                  as returned in out_dump_bytes parameter of
+ *                  kbase_hwcnt_jm_metadata_create.
+ * @dst_enable_map: Non-NULL pointer to enable map specifying enabled values.
+ * @pm_core_mask:   PM state synchronized shaders core mask with the dump.
+ * @curr_config:    Current allocated hardware resources to correctly map the
+ *                  src raw dump buffer to the dst dump buffer.
+ * @accumulate:     True if counters in src should be accumulated into dst,
+ *                  rather than copied.
+ *
+ * The dst and dst_enable_map MUST have been created from the same metadata as
+ * returned from the call to kbase_hwcnt_jm_metadata_create as was used to get
+ * the length of src.
+ *
+ * Return: 0 on success, else error code.
+ */
+int kbase_hwcnt_jm_dump_get(struct kbase_hwcnt_dump_buffer *dst, void *src,
+			    const struct kbase_hwcnt_enable_map *dst_enable_map,
+			    const u64 pm_core_mask,
+			    const struct kbase_hwcnt_curr_config *curr_config,
+			    bool accumulate);
+
+/**
+ * kbase_hwcnt_csf_dump_get() - Copy or accumulate enabled counters from the raw
  *                              dump buffer in src into the dump buffer
  *                              abstraction in dst.
  * @dst:            Non-NULL pointer to dst dump buffer.
  * @src:            Non-NULL pointer to src raw dump buffer, of same length
  *                  as returned in out_dump_bytes parameter of
- *                  kbase_hwcnt_gpu_metadata_create.
+ *                  kbase_hwcnt_csf_metadata_create.
  * @dst_enable_map: Non-NULL pointer to enable map specifying enabled values.
- * @pm_core_mask:   PM state synchronized shaders core mask with the dump.
  * @accumulate:     True if counters in src should be accumulated into dst,
  *                  rather than copied.
  *
  * The dst and dst_enable_map MUST have been created from the same metadata as
- * returned from the call to kbase_hwcnt_gpu_metadata_create as was used to get
+ * returned from the call to kbase_hwcnt_csf_metadata_create as was used to get
  * the length of src.
  *
  * Return: 0 on success, else error code.
  */
-int kbase_hwcnt_gpu_dump_get(
-	struct kbase_hwcnt_dump_buffer *dst,
-	void *src,
-	const struct kbase_hwcnt_enable_map *dst_enable_map,
-	const u64 pm_core_mask,
-	bool accumulate);
+int kbase_hwcnt_csf_dump_get(struct kbase_hwcnt_dump_buffer *dst, void *src,
+			     const struct kbase_hwcnt_enable_map *dst_enable_map,
+			     bool accumulate);
 
 /**
  * kbase_hwcnt_gpu_enable_map_to_physical() - Convert an enable map abstraction
@@ -168,7 +276,7 @@ int kbase_hwcnt_gpu_dump_get(
  * @src: Non-NULL pointer to src enable map abstraction.
  *
  * The src must have been created from a metadata returned from a call to
- * kbase_hwcnt_gpu_metadata_create.
+ * kbase_hwcnt_jm_metadata_create or kbase_hwcnt_csf_metadata_create.
  *
  * This is a lossy conversion, as the enable map abstraction has one bit per
  * individual counter block value, but the physical enable map uses 1 bit for
@@ -178,6 +286,16 @@ void kbase_hwcnt_gpu_enable_map_to_physical(
 	struct kbase_hwcnt_physical_enable_map *dst,
 	const struct kbase_hwcnt_enable_map *src);
 
+/**
+ * kbase_hwcnt_gpu_set_to_physical() - Map counter set selection to physical
+ *                                     SET_SELECT value.
+ *
+ * @dst: Non-NULL pointer to dst physical SET_SELECT value.
+ * @src: Non-NULL pointer to src counter set selection.
+ */
+void kbase_hwcnt_gpu_set_to_physical(enum kbase_hwcnt_physical_set *dst,
+				     enum kbase_hwcnt_set src);
+
 /**
  * kbase_hwcnt_gpu_enable_map_from_physical() - Convert a physical enable map to
  *                                              an enable map abstraction.
@@ -185,7 +303,7 @@ void kbase_hwcnt_gpu_enable_map_to_physical(
  * @src: Non-NULL pointer to src physical enable map.
  *
  * The dst must have been created from a metadata returned from a call to
- * kbase_hwcnt_gpu_metadata_create.
+ * kbase_hwcnt_jm_metadata_create or kbase_hwcnt_csf_metadata_create.
  *
  * This is a lossy conversion, as the physical enable map can technically
  * support counter blocks with 128 counters each, but no hardware actually uses
@@ -204,7 +322,7 @@ void kbase_hwcnt_gpu_enable_map_from_physical(
  * @enable_map: Non-NULL pointer to enable map.
  *
  * The buf and enable_map must have been created from a metadata returned from
- * a call to kbase_hwcnt_gpu_metadata_create.
+ * a call to kbase_hwcnt_jm_metadata_create or kbase_hwcnt_csf_metadata_create.
  *
  * This function should be used before handing off a dump buffer over the
  * kernel-user boundary, to ensure the header is accurate for the enable map
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_legacy.c b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_legacy.c
index 794ef39e365c..45cd9fb12835 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_legacy.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_legacy.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,15 +17,13 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "mali_kbase_hwcnt_legacy.h"
 #include "mali_kbase_hwcnt_virtualizer.h"
 #include "mali_kbase_hwcnt_types.h"
 #include "mali_kbase_hwcnt_gpu.h"
-#include "mali_kbase_ioctl.h"
+#include <uapi/gpu/arm/bifrost/mali_kbase_ioctl.h>
 
 #include <linux/slab.h>
 #include <linux/uaccess.h>
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_legacy.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_legacy.h
index 7a610ae378a2..deaf7eb39236 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_legacy.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_legacy.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_types.c b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_types.c
index 2b9fe02acd75..931fbf3f2051 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_types.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_types.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2018, 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,11 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "mali_kbase_hwcnt_types.h"
-#include "mali_kbase.h"
+
+#include <linux/slab.h>
 
 /* Minimum alignment of each block of hardware counters */
 #define KBASE_HWCNT_BLOCK_BYTE_ALIGNMENT \
@@ -175,13 +175,11 @@ int kbase_hwcnt_metadata_create(
 	*out_metadata = metadata;
 	return 0;
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_metadata_create);
 
 void kbase_hwcnt_metadata_destroy(const struct kbase_hwcnt_metadata *metadata)
 {
 	kfree(metadata);
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_metadata_destroy);
 
 int kbase_hwcnt_enable_map_alloc(
 	const struct kbase_hwcnt_metadata *metadata,
@@ -205,7 +203,6 @@ int kbase_hwcnt_enable_map_alloc(
 	enable_map->hwcnt_enable_map = enable_map_buf;
 	return 0;
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_enable_map_alloc);
 
 void kbase_hwcnt_enable_map_free(struct kbase_hwcnt_enable_map *enable_map)
 {
@@ -216,7 +213,6 @@ void kbase_hwcnt_enable_map_free(struct kbase_hwcnt_enable_map *enable_map)
 	enable_map->hwcnt_enable_map = NULL;
 	enable_map->metadata = NULL;
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_enable_map_free);
 
 int kbase_hwcnt_dump_buffer_alloc(
 	const struct kbase_hwcnt_metadata *metadata,
@@ -243,7 +239,6 @@ int kbase_hwcnt_dump_buffer_alloc(
 
 	return 0;
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_dump_buffer_alloc);
 
 void kbase_hwcnt_dump_buffer_free(struct kbase_hwcnt_dump_buffer *dump_buf)
 {
@@ -253,7 +248,6 @@ void kbase_hwcnt_dump_buffer_free(struct kbase_hwcnt_dump_buffer *dump_buf)
 	kfree(dump_buf->dump_buf);
 	memset(dump_buf, 0, sizeof(*dump_buf));
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_dump_buffer_free);
 
 int kbase_hwcnt_dump_buffer_array_alloc(
 	const struct kbase_hwcnt_metadata *metadata,
@@ -309,7 +303,6 @@ int kbase_hwcnt_dump_buffer_array_alloc(
 
 	return 0;
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_dump_buffer_array_alloc);
 
 void kbase_hwcnt_dump_buffer_array_free(
 	struct kbase_hwcnt_dump_buffer_array *dump_bufs)
@@ -321,7 +314,6 @@ void kbase_hwcnt_dump_buffer_array_free(
 	free_pages(dump_bufs->page_addr, dump_bufs->page_order);
 	memset(dump_bufs, 0, sizeof(*dump_bufs));
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_dump_buffer_array_free);
 
 void kbase_hwcnt_dump_buffer_zero(
 	struct kbase_hwcnt_dump_buffer *dst,
@@ -356,7 +348,6 @@ void kbase_hwcnt_dump_buffer_zero(
 	memset(dst->clk_cnt_buf, 0,
 		sizeof(*dst->clk_cnt_buf) * metadata->clk_cnt);
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_dump_buffer_zero);
 
 void kbase_hwcnt_dump_buffer_zero_strict(
 	struct kbase_hwcnt_dump_buffer *dst)
@@ -369,7 +360,6 @@ void kbase_hwcnt_dump_buffer_zero_strict(
 	memset(dst->clk_cnt_buf, 0,
 		sizeof(*dst->clk_cnt_buf) * dst->metadata->clk_cnt);
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_dump_buffer_zero_strict);
 
 void kbase_hwcnt_dump_buffer_zero_non_enabled(
 	struct kbase_hwcnt_dump_buffer *dst,
@@ -409,7 +399,6 @@ void kbase_hwcnt_dump_buffer_zero_non_enabled(
 		}
 	}
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_dump_buffer_zero_non_enabled);
 
 void kbase_hwcnt_dump_buffer_copy(
 	struct kbase_hwcnt_dump_buffer *dst,
@@ -455,7 +444,6 @@ void kbase_hwcnt_dump_buffer_copy(
 			dst->clk_cnt_buf[clk] = src->clk_cnt_buf[clk];
 	}
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_dump_buffer_copy);
 
 void kbase_hwcnt_dump_buffer_copy_strict(
 	struct kbase_hwcnt_dump_buffer *dst,
@@ -502,7 +490,6 @@ void kbase_hwcnt_dump_buffer_copy_strict(
 		dst->clk_cnt_buf[clk] = clk_enabled ? src->clk_cnt_buf[clk] : 0;
 	}
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_dump_buffer_copy_strict);
 
 void kbase_hwcnt_dump_buffer_accumulate(
 	struct kbase_hwcnt_dump_buffer *dst,
@@ -552,7 +539,6 @@ void kbase_hwcnt_dump_buffer_accumulate(
 			dst->clk_cnt_buf[clk] += src->clk_cnt_buf[clk];
 	}
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_dump_buffer_accumulate);
 
 void kbase_hwcnt_dump_buffer_accumulate_strict(
 	struct kbase_hwcnt_dump_buffer *dst,
@@ -601,4 +587,3 @@ void kbase_hwcnt_dump_buffer_accumulate_strict(
 			dst->clk_cnt_buf[clk] = 0;
 	}
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_dump_buffer_accumulate_strict);
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_types.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_types.h
index 3394b1271cc8..e775393b57dc 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_types.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_types.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
@@ -85,7 +84,6 @@
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <linux/types.h>
-#include "mali_malisw.h"
 
 /* Number of bytes in each bitfield */
 #define KBASE_HWCNT_BITFIELD_BYTES (sizeof(u64))
@@ -1115,10 +1113,10 @@ static inline void kbase_hwcnt_dump_buffer_block_accumulate_strict(
 }
 
 /**
- * @brief Iterate over each clock domain in the metadata.
+ * Iterate over each clock domain in the metadata.
  *
- * @param[in] md          Non-NULL pointer to metadata.
- * @param[in] clk         size_t variable used as clock iterator.
+ * @md:          Non-NULL pointer to metadata.
+ * @clk:         size_t variable used as clock iterator.
  */
 #define kbase_hwcnt_metadata_for_each_clock(md, clk)    \
 	for ((clk) = 0; (clk) < (md)->clk_cnt; (clk)++)
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_virtualizer.c b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_virtualizer.c
index 917e47cda0f9..4bb84890fb67 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_virtualizer.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_virtualizer.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,17 +17,12 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "mali_kbase_hwcnt_virtualizer.h"
 #include "mali_kbase_hwcnt_accumulator.h"
 #include "mali_kbase_hwcnt_context.h"
 #include "mali_kbase_hwcnt_types.h"
-#include "mali_malisw.h"
-#include "mali_kbase_debug.h"
-#include "mali_kbase_linux.h"
 
 #include <linux/mutex.h>
 #include <linux/slab.h>
@@ -87,7 +83,6 @@ const struct kbase_hwcnt_metadata *kbase_hwcnt_virtualizer_metadata(
 
 	return hvirt->metadata;
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_virtualizer_metadata);
 
 /**
  * kbasep_hwcnt_virtualizer_client_free - Free a virtualizer client's memory.
@@ -496,7 +491,6 @@ int kbase_hwcnt_virtualizer_client_set_counters(
 
 	return errcode;
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_virtualizer_client_set_counters);
 
 /**
  * kbasep_hwcnt_virtualizer_client_dump - Perform a dump of the client's
@@ -686,7 +680,6 @@ int kbase_hwcnt_virtualizer_client_dump(
 
 	return errcode;
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_virtualizer_client_dump);
 
 int kbase_hwcnt_virtualizer_client_create(
 	struct kbase_hwcnt_virtualizer *hvirt,
@@ -719,7 +712,6 @@ int kbase_hwcnt_virtualizer_client_create(
 	*out_hvcli = hvcli;
 	return 0;
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_virtualizer_client_create);
 
 void kbase_hwcnt_virtualizer_client_destroy(
 	struct kbase_hwcnt_virtualizer_client *hvcli)
@@ -735,7 +727,6 @@ void kbase_hwcnt_virtualizer_client_destroy(
 
 	kbasep_hwcnt_virtualizer_client_free(hvcli);
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_virtualizer_client_destroy);
 
 int kbase_hwcnt_virtualizer_init(
 	struct kbase_hwcnt_context *hctx,
@@ -766,7 +757,6 @@ int kbase_hwcnt_virtualizer_init(
 	*out_hvirt = virt;
 	return 0;
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_virtualizer_init);
 
 void kbase_hwcnt_virtualizer_term(
 	struct kbase_hwcnt_virtualizer *hvirt)
@@ -787,4 +777,12 @@ void kbase_hwcnt_virtualizer_term(
 
 	kfree(hvirt);
 }
-KBASE_EXPORT_TEST_API(kbase_hwcnt_virtualizer_term);
+
+bool kbase_hwcnt_virtualizer_queue_work(struct kbase_hwcnt_virtualizer *hvirt,
+					struct work_struct *work)
+{
+	if (WARN_ON(!hvirt) || WARN_ON(!work))
+		return false;
+
+	return kbase_hwcnt_context_queue_work(hvirt->hctx, work);
+}
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_virtualizer.h b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_virtualizer.h
index 8f628c3306fc..1bce6914f11a 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_virtualizer.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_virtualizer.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
@@ -31,6 +30,7 @@
 #define _KBASE_HWCNT_VIRTUALIZER_H_
 
 #include <linux/types.h>
+#include <linux/workqueue.h>
 
 struct kbase_hwcnt_context;
 struct kbase_hwcnt_virtualizer;
@@ -142,4 +142,19 @@ int kbase_hwcnt_virtualizer_client_dump(
 	u64 *ts_end_ns,
 	struct kbase_hwcnt_dump_buffer *dump_buf);
 
+/**
+ * kbase_hwcnt_virtualizer_queue_work() - Queue hardware counter related async
+ *                                        work on a workqueue specialized for
+ *                                        hardware counters.
+ * @hvirt: Non-NULL pointer to the hardware counter virtualizer.
+ * @work:  Non-NULL pointer to work to queue.
+ *
+ * Return: false if work was already on a queue, true otherwise.
+ *
+ * This is a convenience function that directly calls the underlying
+ * kbase_hwcnt_context's kbase_hwcnt_context_queue_work.
+ */
+bool kbase_hwcnt_virtualizer_queue_work(struct kbase_hwcnt_virtualizer *hvirt,
+					struct work_struct *work);
+
 #endif /* _KBASE_HWCNT_VIRTUALIZER_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_jd.c b/drivers/gpu/arm/bifrost/mali_kbase_jd.c
index d0674d1bd8f4..f680a5ee144b 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_jd.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_jd.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 #include <linux/dma-buf.h>
 #ifdef CONFIG_COMPAT
 #include <linux/compat.h>
@@ -30,6 +27,7 @@
 #include <linux/random.h>
 #include <linux/version.h>
 #include <linux/ratelimit.h>
+#include <linux/priority_control_manager.h>
 
 #include <mali_kbase_jm.h>
 #include <mali_kbase_kinstr_jm.h>
@@ -44,13 +42,9 @@
 
 #define beenthere(kctx, f, a...)  dev_dbg(kctx->kbdev->dev, "%s:" f, __func__, ##a)
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)
-/* random32 was renamed to prandom_u32 in 3.8 */
-#define prandom_u32 random32
-#endif
-
 /* Return whether katom will run on the GPU or not. Currently only soft jobs and
- * dependency-only atoms do not run on the GPU */
+ * dependency-only atoms do not run on the GPU
+ */
 #define IS_GPU_ATOM(katom) (!((katom->core_req & BASE_JD_REQ_SOFT_JOB) ||  \
 			((katom->core_req & BASE_JD_REQ_ATOM_TYPE) ==    \
 							BASE_JD_REQ_DEP)))
@@ -80,7 +74,7 @@ static void jd_mark_atom_complete(struct kbase_jd_atom *katom)
 {
 	katom->status = KBASE_JD_ATOM_STATE_COMPLETED;
 	kbase_kinstr_jm_atom_complete(katom);
-	dev_dbg(katom->kctx->kbdev->dev, "Atom %p status to completed\n",
+	dev_dbg(katom->kctx->kbdev->dev, "Atom %pK status to completed\n",
 		(void *)katom);
 }
 
@@ -95,7 +89,7 @@ static bool jd_run_atom(struct kbase_jd_atom *katom)
 {
 	struct kbase_context *kctx = katom->kctx;
 
-	dev_dbg(kctx->kbdev->dev, "JD run atom %p in kctx %p\n",
+	dev_dbg(kctx->kbdev->dev, "JD run atom %pK in kctx %pK\n",
 		(void *)katom, (void *)kctx);
 
 	KBASE_DEBUG_ASSERT(katom->status != KBASE_JD_ATOM_STATE_UNUSED);
@@ -105,23 +99,23 @@ static bool jd_run_atom(struct kbase_jd_atom *katom)
 		trace_sysgraph(SGR_SUBMIT, kctx->id,
 				kbase_jd_atom_id(katom->kctx, katom));
 		jd_mark_atom_complete(katom);
-		return 0;
+		return false;
 	} else if (katom->core_req & BASE_JD_REQ_SOFT_JOB) {
 		/* Soft-job */
 		if (katom->will_fail_event_code) {
 			kbase_finish_soft_job(katom);
 			jd_mark_atom_complete(katom);
-			return 0;
+			return false;
 		}
 		if (kbase_process_soft_job(katom) == 0) {
 			kbase_finish_soft_job(katom);
 			jd_mark_atom_complete(katom);
 		}
-		return 0;
+		return false;
 	}
 
 	katom->status = KBASE_JD_ATOM_STATE_IN_JS;
-	dev_dbg(kctx->kbdev->dev, "Atom %p status to in JS\n", (void *)katom);
+	dev_dbg(kctx->kbdev->dev, "Atom %pK status to in JS\n", (void *)katom);
 	/* Queue an action about whether we should try scheduling a context */
 	return kbasep_js_add_job(kctx, katom);
 }
@@ -243,7 +237,8 @@ static int kbase_jd_pre_external_resources(struct kbase_jd_atom *katom, const st
 
 	/* copy user buffer to the end of our real buffer.
 	 * Make sure the struct sizes haven't changed in a way
-	 * we don't support */
+	 * we don't support
+	 */
 	BUILD_BUG_ON(sizeof(*input_extres) > sizeof(*katom->extres));
 	input_extres = (struct base_external_resource *)
 			(((unsigned char *)katom->extres) +
@@ -259,13 +254,14 @@ static int kbase_jd_pre_external_resources(struct kbase_jd_atom *katom, const st
 
 #ifdef CONFIG_MALI_BIFROST_DMA_FENCE
 	if (implicit_sync) {
-		info.resv_objs = kmalloc_array(katom->nr_extres,
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0))
-					sizeof(struct reservation_object *),
+		info.resv_objs =
+			kmalloc_array(katom->nr_extres,
+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
+				      sizeof(struct reservation_object *),
 #else
-					sizeof(struct dma_resv *),
+				      sizeof(struct dma_resv *),
 #endif
-					GFP_KERNEL);
+				      GFP_KERNEL);
 		if (!info.resv_objs) {
 			err_ret_val = -ENOMEM;
 			goto early_err_out;
@@ -319,7 +315,7 @@ static int kbase_jd_pre_external_resources(struct kbase_jd_atom *katom, const st
 #ifdef CONFIG_MALI_BIFROST_DMA_FENCE
 		if (implicit_sync &&
 		    reg->gpu_alloc->type == KBASE_MEM_TYPE_IMPORTED_UMM) {
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0))
+#if (KERNEL_VERSION(5, 4, 0) > LINUX_VERSION_CODE)
 			struct reservation_object *resv;
 #else
 			struct dma_resv *resv;
@@ -336,7 +332,7 @@ static int kbase_jd_pre_external_resources(struct kbase_jd_atom *katom, const st
 		 * at least not before the first write) as we overwrite elements
 		 * as we loop and could be overwriting ourself, so no writes
 		 * until the last read for an element.
-		 * */
+		 */
 		katom->extres[res_no].gpu_address = reg->start_pfn << PAGE_SHIFT; /* save the start_pfn (as an address, not pfn) to use fast lookup later */
 		katom->extres[res_no].alloc = alloc;
 	}
@@ -463,9 +459,6 @@ static inline void jd_resolve_dep(struct list_head *out_list,
 #endif /* CONFIG_MALI_BIFROST_DMA_FENCE */
 
 			if (dep_satisfied) {
-				trace_sysgraph(SGR_DEP_RES,
-				   dep_atom->kctx->id,
-				   kbase_jd_atom_id(katom->kctx, dep_atom));
 				dep_atom->in_jd_list = true;
 				list_add_tail(&dep_atom->jd_item, out_list);
 			}
@@ -489,7 +482,8 @@ static inline void jd_resolve_dep(struct list_head *out_list,
 static bool is_dep_valid(struct kbase_jd_atom *katom)
 {
 	/* If there's no dependency then this is 'valid' from the perspective of
-	 * early dependency submission */
+	 * early dependency submission
+	 */
 	if (!katom)
 		return true;
 
@@ -498,7 +492,8 @@ static bool is_dep_valid(struct kbase_jd_atom *katom)
 		return false;
 
 	/* If dependency has completed and has failed or will fail then it is
-	 * not valid */
+	 * not valid
+	 */
 	if (katom->status >= KBASE_JD_ATOM_STATE_HW_COMPLETED &&
 			(katom->event_code != BASE_JD_EVENT_DONE ||
 			katom->will_fail_event_code))
@@ -552,10 +547,6 @@ static void jd_try_submitting_deps(struct list_head *out_list,
 #endif /* CONFIG_MALI_BIFROST_DMA_FENCE */
 
 				if (dep0_valid && dep1_valid && dep_satisfied) {
-					trace_sysgraph(SGR_DEP_RES,
-					    dep_atom->kctx->id,
-					    kbase_jd_atom_id(dep_atom->kctx,
-					    dep_atom));
 					dep_atom->in_jd_list = true;
 					list_add(&dep_atom->jd_item, out_list);
 				}
@@ -640,8 +631,8 @@ static void jd_update_jit_usage(struct kbase_jd_atom *katom)
 			u64 addr_end;
 
 			if (reg->flags & KBASE_REG_TILER_ALIGN_TOP) {
-				const unsigned long extent_bytes = reg->extent
-					<< PAGE_SHIFT;
+				const unsigned long extension_bytes =
+					reg->extension << PAGE_SHIFT;
 				const u64 low_ptr = ptr[LOW];
 				const u64 high_ptr = ptr[HIGH];
 
@@ -662,8 +653,8 @@ static void jd_update_jit_usage(struct kbase_jd_atom *katom)
 				 * this, but here to avoid future maintenance
 				 * hazards
 				 */
-				WARN_ON(!is_power_of_2(extent_bytes));
-				addr_end = ALIGN(read_val, extent_bytes);
+				WARN_ON(!is_power_of_2(extension_bytes));
+				addr_end = ALIGN(read_val, extension_bytes);
 			} else {
 				addr_end = read_val = READ_ONCE(*ptr);
 			}
@@ -735,7 +726,8 @@ bool jd_done_nolock(struct kbase_jd_atom *katom,
 #endif /* MALI_JIT_PRESSURE_LIMIT_BASE */
 
 	/* This is needed in case an atom is failed due to being invalid, this
-	 * can happen *before* the jobs that the atom depends on have completed */
+	 * can happen *before* the jobs that the atom depends on have completed
+	 */
 	for (i = 0; i < 2; i++) {
 		if (kbase_jd_katom_dep_atom(&katom->dep[i])) {
 			list_del(&katom->dep_item[i]);
@@ -766,7 +758,7 @@ bool jd_done_nolock(struct kbase_jd_atom *katom,
 			list_del(runnable_jobs.next);
 			node->in_jd_list = false;
 
-			dev_dbg(kctx->kbdev->dev, "List node %p has status %d\n",
+			dev_dbg(kctx->kbdev->dev, "List node %pK has status %d\n",
 				node, node->status);
 
 			KBASE_DEBUG_ASSERT(node->status != KBASE_JD_ATOM_STATE_UNUSED);
@@ -793,7 +785,8 @@ bool jd_done_nolock(struct kbase_jd_atom *katom,
 					!node->will_fail_event_code) {
 				/* Node successfully submitted, try submitting
 				 * dependencies as they may now be representable
-				 * in JS */
+				 * in JS
+				 */
 				jd_try_submitting_deps(&runnable_jobs, node);
 			}
 		}
@@ -809,10 +802,14 @@ bool jd_done_nolock(struct kbase_jd_atom *katom,
 
 		/* Decrement and check the TOTAL number of jobs. This includes
 		 * those not tracked by the scheduler: 'not ready to run' and
-		 * 'dependency-only' jobs. */
+		 * 'dependency-only' jobs.
+		 */
 		if (--kctx->jctx.job_nr == 0)
-			wake_up(&kctx->jctx.zero_jobs_wait);	/* All events are safely queued now, and we can signal any waiter
-								 * that we've got no more jobs (so we can be safely terminated) */
+			/* All events are safely queued now, and we can signal
+			 * any waiter that we've got no more jobs (so we can be
+			 * safely terminated)
+			 */
+			wake_up(&kctx->jctx.zero_jobs_wait);
 	}
 
 	return need_to_try_schedule_context;
@@ -904,13 +901,14 @@ static bool jd_submit_atom(struct kbase_context *const kctx,
 	unsigned long flags;
 	enum kbase_jd_atom_state status;
 
-	dev_dbg(kbdev->dev, "User did JD submit atom %p\n", (void *)katom);
+	dev_dbg(kbdev->dev, "User did JD submit atom %pK\n", (void *)katom);
 
 	/* Update the TOTAL number of jobs. This includes those not tracked by
-	 * the scheduler: 'not ready to run' and 'dependency-only' jobs. */
+	 * the scheduler: 'not ready to run' and 'dependency-only' jobs.
+	 */
 	jctx->job_nr++;
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
+#if KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE
 	katom->start_timestamp.tv64 = 0;
 #else
 	katom->start_timestamp = 0;
@@ -978,12 +976,13 @@ static bool jd_submit_atom(struct kbase_context *const kctx,
 				katom->event_code = BASE_JD_EVENT_JOB_CONFIG_FAULT;
 				katom->status = KBASE_JD_ATOM_STATE_COMPLETED;
 				dev_dbg(kbdev->dev,
-					"Atom %p status to completed\n",
+					"Atom %pK status to completed\n",
 					(void *)katom);
 
 				/* Wrong dependency setup. Atom will be sent
 				 * back to user space. Do not record any
-				 * dependencies. */
+				 * dependencies.
+				 */
 				jd_trace_atom_submit(kctx, katom, NULL);
 
 				return jd_done_nolock(katom, NULL);
@@ -1020,7 +1019,7 @@ static bool jd_submit_atom(struct kbase_context *const kctx,
 			/* Atom has completed, propagate the error code if any */
 			katom->event_code = dep_atom->event_code;
 			katom->status = KBASE_JD_ATOM_STATE_QUEUED;
-			dev_dbg(kbdev->dev, "Atom %p status to queued\n",
+			dev_dbg(kbdev->dev, "Atom %pK status to queued\n",
 				(void *)katom);
 
 			/* This atom will be sent back to user space.
@@ -1053,6 +1052,8 @@ static bool jd_submit_atom(struct kbase_context *const kctx,
 
 			return jd_done_nolock(katom, NULL);
 		}
+
+		katom->will_fail_event_code = katom->event_code;
 	}
 
 	/* These must occur after the above loop to ensure that an atom
@@ -1061,13 +1062,16 @@ static bool jd_submit_atom(struct kbase_context *const kctx,
 	 */
 	katom->event_code = BASE_JD_EVENT_DONE;
 	katom->status = KBASE_JD_ATOM_STATE_QUEUED;
-	dev_dbg(kbdev->dev, "Atom %p status to queued\n", (void *)katom);
+	dev_dbg(kbdev->dev, "Atom %pK status to queued\n", (void *)katom);
 
 	/* For invalid priority, be most lenient and choose the default */
 	sched_prio = kbasep_js_atom_prio_to_sched_prio(user_atom->prio);
 	if (sched_prio == KBASE_JS_ATOM_SCHED_PRIO_INVALID)
 		sched_prio = KBASE_JS_ATOM_SCHED_PRIO_DEFAULT;
-	katom->sched_priority = sched_prio;
+
+	/* Cap the priority to jctx.max_priority */
+	katom->sched_priority = (sched_prio < kctx->jctx.max_priority) ?
+			kctx->jctx.max_priority : sched_prio;
 
 	/* Create a new atom. */
 	jd_trace_atom_submit(kctx, katom, &katom->sched_priority);
@@ -1195,7 +1199,7 @@ static bool jd_submit_atom(struct kbase_context *const kctx,
 		bool need_to_try_schedule_context;
 
 		katom->status = KBASE_JD_ATOM_STATE_IN_JS;
-		dev_dbg(kctx->kbdev->dev, "Atom %p status to in JS\n",
+		dev_dbg(kctx->kbdev->dev, "Atom %pK status to in JS\n",
 			(void *)katom);
 
 		need_to_try_schedule_context = kbasep_js_add_job(kctx, katom);
@@ -1266,7 +1270,7 @@ int kbase_jd_submit(struct kbase_context *kctx,
 
 		if (unlikely(jd_atom_is_v2)) {
 			if (copy_from_user(&user_atom.jc, user_addr, sizeof(struct base_jd_atom_v2)) != 0) {
-				dev_err(kbdev->dev,
+				dev_dbg(kbdev->dev,
 					"Invalid atom address %p passed to job_submit\n",
 					user_addr);
 				err = -EFAULT;
@@ -1277,7 +1281,7 @@ int kbase_jd_submit(struct kbase_context *kctx,
 			user_atom.seq_nr = 0;
 		} else {
 			if (copy_from_user(&user_atom, user_addr, stride) != 0) {
-				dev_err(kbdev->dev,
+				dev_dbg(kbdev->dev,
 					"Invalid atom address %p passed to job_submit\n",
 					user_addr);
 				err = -EFAULT;
@@ -1416,7 +1420,7 @@ void kbase_jd_done_worker(struct work_struct *data)
 	js_kctx_info = &kctx->jctx.sched_info;
 	js_devdata = &kbdev->js_data;
 
-	dev_dbg(kbdev->dev, "Enter atom %p done worker for kctx %p\n",
+	dev_dbg(kbdev->dev, "Enter atom %pK done worker for kctx %pK\n",
 		(void *)katom, (void *)kctx);
 
 	KBASE_KTRACE_ADD_JM(kbdev, JD_DONE_WORKER, kctx, katom, katom->jc, 0);
@@ -1440,7 +1444,7 @@ void kbase_jd_done_worker(struct work_struct *data)
 	if (katom->event_code == BASE_JD_EVENT_STOPPED) {
 		unsigned long flags;
 
-		dev_dbg(kbdev->dev, "Atom %p has been promoted to stopped\n",
+		dev_dbg(kbdev->dev, "Atom %pK has been promoted to stopped\n",
 			(void *)katom);
 		mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
 		mutex_unlock(&js_devdata->queue_mutex);
@@ -1448,7 +1452,7 @@ void kbase_jd_done_worker(struct work_struct *data)
 		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
 
 		katom->status = KBASE_JD_ATOM_STATE_IN_JS;
-		dev_dbg(kctx->kbdev->dev, "Atom %p status to in JS\n",
+		dev_dbg(kctx->kbdev->dev, "Atom %pK status to in JS\n",
 			(void *)katom);
 		kbase_js_unpull(kctx, katom);
 
@@ -1533,7 +1537,9 @@ void kbase_jd_done_worker(struct work_struct *data)
 	mutex_unlock(&jctx->lock);
 
 	/* Job is now no longer running, so can now safely release the context
-	 * reference, and handle any actions that were logged against the atom's retained state */
+	 * reference, and handle any actions that were logged against the
+	 * atom's retained state
+	 */
 
 	kbasep_js_runpool_release_ctx_and_katom_retained_state(kbdev, kctx, &katom_retained_state);
 
@@ -1541,7 +1547,8 @@ void kbase_jd_done_worker(struct work_struct *data)
 
 	if (!atomic_dec_return(&kctx->work_count)) {
 		/* If worker now idle then post all events that jd_done_nolock()
-		 * has queued */
+		 * has queued
+		 */
 		mutex_lock(&jctx->lock);
 		while (!list_empty(&kctx->completed_jobs)) {
 			struct kbase_jd_atom *atom = list_entry(
@@ -1561,7 +1568,7 @@ void kbase_jd_done_worker(struct work_struct *data)
 
 	KBASE_KTRACE_ADD_JM(kbdev, JD_DONE_WORKER_END, kctx, NULL, cache_jc, 0);
 
-	dev_dbg(kbdev->dev, "Leave atom %p done worker for kctx %p\n",
+	dev_dbg(kbdev->dev, "Leave atom %pK done worker for kctx %pK\n",
 		(void *)katom, (void *)kctx);
 }
 
@@ -1616,7 +1623,8 @@ static void jd_cancel_worker(struct work_struct *data)
 	need_to_try_schedule_context = jd_done_nolock(katom, NULL);
 	/* Because we're zapping, we're not adding any more jobs to this ctx, so no need to
 	 * schedule the context. There's also no need for the jsctx_mutex to have been taken
-	 * around this too. */
+	 * around this too.
+	 */
 	KBASE_DEBUG_ASSERT(!need_to_try_schedule_context);
 
 	/* katom may have been freed now, do not use! */
@@ -1685,12 +1693,12 @@ void kbase_jd_cancel(struct kbase_device *kbdev, struct kbase_jd_atom *katom)
 {
 	struct kbase_context *kctx;
 
-	KBASE_DEBUG_ASSERT(NULL != kbdev);
-	KBASE_DEBUG_ASSERT(NULL != katom);
+	KBASE_DEBUG_ASSERT(kbdev != NULL);
+	KBASE_DEBUG_ASSERT(katom != NULL);
 	kctx = katom->kctx;
-	KBASE_DEBUG_ASSERT(NULL != kctx);
+	KBASE_DEBUG_ASSERT(kctx != NULL);
 
-	dev_dbg(kbdev->dev, "JD: cancelling atom %p\n", (void *)katom);
+	dev_dbg(kbdev->dev, "JD: cancelling atom %pK\n", (void *)katom);
 	KBASE_KTRACE_ADD_JM(kbdev, JD_CANCEL, kctx, katom, katom->jc, 0);
 
 	/* This should only be done from a context that is not scheduled */
@@ -1759,12 +1767,15 @@ int kbase_jd_init(struct kbase_context *kctx)
 {
 	int i;
 	int mali_err = 0;
+	struct priority_control_manager_device *pcm_device = NULL;
 
 	KBASE_DEBUG_ASSERT(kctx);
+	pcm_device = kctx->kbdev->pcm_dev;
+	kctx->jctx.max_priority = KBASE_JS_ATOM_SCHED_PRIO_REALTIME;
 
 	kctx->jctx.job_done_wq = alloc_workqueue("mali_jd",
 			WQ_HIGHPRI | WQ_UNBOUND, 1);
-	if (NULL == kctx->jctx.job_done_wq) {
+	if (kctx->jctx.job_done_wq == NULL) {
 		mali_err = -ENOMEM;
 		goto out1;
 	}
@@ -1800,6 +1811,11 @@ int kbase_jd_init(struct kbase_context *kctx)
 	INIT_LIST_HEAD(&kctx->completed_jobs);
 	atomic_set(&kctx->work_count, 0);
 
+	/* Check if there are platform rules for maximum priority */
+	if (pcm_device)
+		kctx->jctx.max_priority = pcm_device->ops.pcm_scheduler_priority_check(
+				pcm_device, current, KBASE_JS_ATOM_SCHED_PRIO_REALTIME);
+
 	return 0;
 
  out1:
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_jd_debugfs.c b/drivers/gpu/arm/bifrost/mali_kbase_jd_debugfs.c
index 6b0c36d6b93f..2fa140cbf64a 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_jd_debugfs.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_jd_debugfs.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifdef CONFIG_DEBUG_FS
@@ -29,7 +28,7 @@
 #if defined(CONFIG_SYNC) || defined(CONFIG_SYNC_FILE)
 #include <mali_kbase_sync.h>
 #endif
-#include <mali_kbase_ioctl.h>
+#include <uapi/gpu/arm/bifrost/mali_kbase_ioctl.h>
 
 struct kbase_jd_debugfs_depinfo {
 	u8 id;
@@ -47,13 +46,13 @@ static void kbase_jd_debugfs_fence_info(struct kbase_jd_atom *atom,
 	case BASE_JD_REQ_SOFT_FENCE_TRIGGER:
 		res = kbase_sync_fence_out_info_get(atom, &info);
 		if (res == 0)
-			seq_printf(sfile, "Sa([%p]%d) ",
+			seq_printf(sfile, "Sa([%pK]%d) ",
 				   info.fence, info.status);
 		break;
 	case BASE_JD_REQ_SOFT_FENCE_WAIT:
 		res = kbase_sync_fence_in_info_get(atom, &info);
 		if (res == 0)
-			seq_printf(sfile, "Wa([%p]%d) ",
+			seq_printf(sfile, "Wa([%pK]%d) ",
 				   info.fence, info.status);
 		break;
 	default:
@@ -66,42 +65,40 @@ static void kbase_jd_debugfs_fence_info(struct kbase_jd_atom *atom,
 		struct kbase_fence_cb *cb;
 
 		if (atom->dma_fence.fence) {
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 			struct fence *fence = atom->dma_fence.fence;
 #else
 			struct dma_fence *fence = atom->dma_fence.fence;
 #endif
 
 			seq_printf(sfile,
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 8, 0))
-					"Sd(%u#%u: %s) ",
+#if (KERNEL_VERSION(4, 8, 0) > LINUX_VERSION_CODE)
+				   "Sd(%u#%u: %s) ",
 #else
-					"Sd(%llu#%u: %s) ",
+				   "Sd(%llu#%u: %s) ",
 #endif
-					fence->context,
-					fence->seqno,
-					dma_fence_is_signaled(fence) ?
-						"signaled" : "active");
+				   fence->context, fence->seqno,
+				   dma_fence_is_signaled(fence) ? "signaled" :
+								  "active");
 		}
 
 		list_for_each_entry(cb, &atom->dma_fence.callbacks,
 				    node) {
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 			struct fence *fence = cb->fence;
 #else
 			struct dma_fence *fence = cb->fence;
 #endif
 
 			seq_printf(sfile,
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 8, 0))
-					"Wd(%u#%u: %s) ",
+#if (KERNEL_VERSION(4, 8, 0) > LINUX_VERSION_CODE)
+				   "Wd(%u#%u: %s) ",
 #else
-					"Wd(%llu#%u: %s) ",
+				   "Wd(%llu#%u: %s) ",
 #endif
-					fence->context,
-					fence->seqno,
-					dma_fence_is_signaled(fence) ?
-						"signaled" : "active");
+				   fence->context, fence->seqno,
+				   dma_fence_is_signaled(fence) ? "signaled" :
+								  "active");
 		}
 	}
 #endif /* CONFIG_MALI_BIFROST_DMA_FENCE */
@@ -180,7 +177,8 @@ static int kbasep_jd_debugfs_atoms_show(struct seq_file *sfile, void *data)
 
 		/* start_timestamp is cleared as soon as the atom leaves UNUSED state
 		 * and set before a job is submitted to the h/w, a non-zero value means
-		 * it is valid */
+		 * it is valid
+		 */
 		if (ktime_to_ns(atom->start_timestamp))
 			start_timestamp = ktime_to_ns(
 					ktime_sub(ktime_get(), atom->start_timestamp));
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_jd_debugfs.h b/drivers/gpu/arm/bifrost/mali_kbase_jd_debugfs.h
index 697bdef4d434..f183a9fee70e 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_jd_debugfs.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_jd_debugfs.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014-2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,13 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
- * @file mali_kbase_jd_debugfs.h
- * Header file for job dispatcher-related entries in debugfs
+ * DOC: Header file for job dispatcher-related entries in debugfs
  */
 
 #ifndef _KBASE_JD_DEBUGFS_H
@@ -38,7 +36,7 @@ struct kbase_context;
 /**
  * kbasep_jd_debugfs_ctx_init() - Add debugfs entries for JD system
  *
- * @kctx Pointer to kbase_context
+ * @kctx: Pointer to kbase_context
  */
 void kbasep_jd_debugfs_ctx_init(struct kbase_context *kctx);
 
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_jm.c b/drivers/gpu/arm/bifrost/mali_kbase_jm.c
index fb15a8c1727a..73e9905ab036 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_jm.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_jm.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,11 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
 /*
  * HW access job manager common APIs
  */
@@ -47,7 +45,7 @@ static bool kbase_jm_next_job(struct kbase_device *kbdev, int js,
 
 	kctx = kbdev->hwaccess.active_kctx[js];
 	dev_dbg(kbdev->dev,
-		"Trying to run the next %d jobs in kctx %p (s:%d)\n",
+		"Trying to run the next %d jobs in kctx %pK (s:%d)\n",
 		nr_jobs_to_submit, (void *)kctx, js);
 
 	if (!kctx)
@@ -110,7 +108,6 @@ void kbase_jm_try_kick_all(struct kbase_device *kbdev)
 		up(&js_devdata->schedule_sem);
 	}
 }
-#endif /* !MALI_USE_CSF */
 
 void kbase_jm_idle_ctx(struct kbase_device *kbdev, struct kbase_context *kctx)
 {
@@ -120,20 +117,19 @@ void kbase_jm_idle_ctx(struct kbase_device *kbdev, struct kbase_context *kctx)
 
 	for (js = 0; js < BASE_JM_MAX_NR_SLOTS; js++) {
 		if (kbdev->hwaccess.active_kctx[js] == kctx) {
-			dev_dbg(kbdev->dev, "Marking kctx %p as inactive (s:%d)\n",
+			dev_dbg(kbdev->dev, "Marking kctx %pK as inactive (s:%d)\n",
 					(void *)kctx, js);
 			kbdev->hwaccess.active_kctx[js] = NULL;
 		}
 	}
 }
 
-#if !MALI_USE_CSF
 struct kbase_jd_atom *kbase_jm_return_atom_to_js(struct kbase_device *kbdev,
 				struct kbase_jd_atom *katom)
 {
 	lockdep_assert_held(&kbdev->hwaccess_lock);
 
-	dev_dbg(kbdev->dev, "Atom %p is returning with event code 0x%x\n",
+	dev_dbg(kbdev->dev, "Atom %pK is returning with event code 0x%x\n",
 		(void *)katom, katom->event_code);
 
 	if (katom->event_code != BASE_JD_EVENT_STOPPED &&
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_jm.h b/drivers/gpu/arm/bifrost/mali_kbase_jm.h
index b3fd421a1ff3..47202b9e9bd3 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_jm.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_jm.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014, 2016, 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2013-2014, 2016, 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,11 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
 /*
  * Job manager common APIs
  */
@@ -76,6 +74,7 @@ void kbase_jm_try_kick(struct kbase_device *kbdev, u32 js_mask);
 void kbase_jm_try_kick_all(struct kbase_device *kbdev);
 #endif /* !MALI_USE_CSF */
 
+#if !MALI_USE_CSF
 /**
  * kbase_jm_idle_ctx() - Mark a context as idle.
  * @kbdev:	Device pointer
@@ -91,7 +90,6 @@ void kbase_jm_try_kick_all(struct kbase_device *kbdev);
  */
 void kbase_jm_idle_ctx(struct kbase_device *kbdev, struct kbase_context *kctx);
 
-#if !MALI_USE_CSF
 /**
  * kbase_jm_return_atom_to_js() - Return an atom to the job scheduler that has
  *				  been soft-stopped or will fail due to a
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_js.c b/drivers/gpu/arm/bifrost/mali_kbase_js.c
index 9b338eb66531..c16469d0a1d9 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_js.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_js.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2011-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /*
  * Job Scheduler Implementation
  */
@@ -37,6 +34,7 @@
 
 #include "mali_kbase_jm.h"
 #include "mali_kbase_hwaccess_jm.h"
+#include <linux/priority_control_manager.h>
 
 /*
  * Private types
@@ -45,26 +43,30 @@
 /* Bitpattern indicating the result of releasing a context */
 enum {
 	/* The context was descheduled - caller should try scheduling in a new
-	 * one to keep the runpool full */
+	 * one to keep the runpool full
+	 */
 	KBASEP_JS_RELEASE_RESULT_WAS_DESCHEDULED = (1u << 0),
 	/* Ctx attributes were changed - caller should try scheduling all
-	 * contexts */
+	 * contexts
+	 */
 	KBASEP_JS_RELEASE_RESULT_SCHED_ALL = (1u << 1)
 };
 
 typedef u32 kbasep_js_release_result;
 
 const int kbasep_js_atom_priority_to_relative[BASE_JD_NR_PRIO_LEVELS] = {
-	KBASE_JS_ATOM_SCHED_PRIO_MED, /* BASE_JD_PRIO_MEDIUM */
-	KBASE_JS_ATOM_SCHED_PRIO_HIGH, /* BASE_JD_PRIO_HIGH */
-	KBASE_JS_ATOM_SCHED_PRIO_LOW  /* BASE_JD_PRIO_LOW */
+	KBASE_JS_ATOM_SCHED_PRIO_MED,      /* BASE_JD_PRIO_MEDIUM */
+	KBASE_JS_ATOM_SCHED_PRIO_HIGH,     /* BASE_JD_PRIO_HIGH */
+	KBASE_JS_ATOM_SCHED_PRIO_LOW,      /* BASE_JD_PRIO_LOW */
+	KBASE_JS_ATOM_SCHED_PRIO_REALTIME  /* BASE_JD_PRIO_REALTIME */
 };
 
 const base_jd_prio
 kbasep_js_relative_priority_to_atom[KBASE_JS_ATOM_SCHED_PRIO_COUNT] = {
-	BASE_JD_PRIO_HIGH,   /* KBASE_JS_ATOM_SCHED_PRIO_HIGH */
-	BASE_JD_PRIO_MEDIUM, /* KBASE_JS_ATOM_SCHED_PRIO_MED */
-	BASE_JD_PRIO_LOW     /* KBASE_JS_ATOM_SCHED_PRIO_LOW */
+	BASE_JD_PRIO_REALTIME,   /* KBASE_JS_ATOM_SCHED_PRIO_REALTIME */
+	BASE_JD_PRIO_HIGH,       /* KBASE_JS_ATOM_SCHED_PRIO_HIGH */
+	BASE_JD_PRIO_MEDIUM,     /* KBASE_JS_ATOM_SCHED_PRIO_MED */
+	BASE_JD_PRIO_LOW         /* KBASE_JS_ATOM_SCHED_PRIO_LOW */
 };
 
 
@@ -160,7 +162,7 @@ jsctx_rb_none_to_pull_prio(struct kbase_context *kctx, int js, int prio)
 	none_to_pull = RB_EMPTY_ROOT(&rb->runnable_tree);
 
 	dev_dbg(kctx->kbdev->dev,
-		"Slot %d (prio %d) is %spullable in kctx %p\n",
+		"Slot %d (prio %d) is %spullable in kctx %pK\n",
 		js, prio, none_to_pull ? "not " : "", kctx);
 
 	return none_to_pull;
@@ -184,7 +186,7 @@ jsctx_rb_none_to_pull(struct kbase_context *kctx, int js)
 
 	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
 
-	for (prio = KBASE_JS_ATOM_SCHED_PRIO_HIGH;
+	for (prio = KBASE_JS_ATOM_SCHED_PRIO_FIRST;
 		prio < KBASE_JS_ATOM_SCHED_PRIO_COUNT; prio++) {
 		if (!jsctx_rb_none_to_pull_prio(kctx, js, prio))
 			return false;
@@ -234,7 +236,7 @@ jsctx_queue_foreach_prio(struct kbase_context *kctx, int js, int prio,
 			WARN_ON(!(entry->core_req &
 				BASE_JD_REQ_END_RENDERPASS));
 			dev_dbg(kctx->kbdev->dev,
-				"Del runnable atom %p from X_DEP list\n",
+				"Del runnable atom %pK from X_DEP list\n",
 				(void *)entry);
 
 			list_del(&entry->queue);
@@ -250,7 +252,7 @@ jsctx_queue_foreach_prio(struct kbase_context *kctx, int js, int prio,
 		WARN_ON(!(entry->atom_flags &
 			KBASE_KATOM_FLAG_JSCTX_IN_X_DEP_LIST));
 		dev_dbg(kctx->kbdev->dev,
-			"Del blocked atom %p from X_DEP list\n",
+			"Del blocked atom %pK from X_DEP list\n",
 			(void *)entry);
 
 		list_del(queue->x_dep_head.next);
@@ -277,7 +279,7 @@ jsctx_queue_foreach(struct kbase_context *kctx, int js,
 {
 	int prio;
 
-	for (prio = KBASE_JS_ATOM_SCHED_PRIO_HIGH;
+	for (prio = KBASE_JS_ATOM_SCHED_PRIO_FIRST;
 		prio < KBASE_JS_ATOM_SCHED_PRIO_COUNT; prio++)
 		jsctx_queue_foreach_prio(kctx, js, prio, callback);
 }
@@ -301,7 +303,7 @@ jsctx_rb_peek_prio(struct kbase_context *kctx, int js, int prio)
 
 	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
 	dev_dbg(kctx->kbdev->dev,
-		"Peeking runnable tree of kctx %p for prio %d (s:%d)\n",
+		"Peeking runnable tree of kctx %pK for prio %d (s:%d)\n",
 		(void *)kctx, prio, js);
 
 	node = rb_first(&rb->runnable_tree);
@@ -319,7 +321,7 @@ jsctx_rb_peek_prio(struct kbase_context *kctx, int js, int prio)
  * @js:   Job slot id to check.
  *
  * Check the ring buffers for all priorities, starting from
- * KBASE_JS_ATOM_SCHED_PRIO_HIGH, for the specified @js and @prio and return a
+ * KBASE_JS_ATOM_SCHED_PRIO_REALTIME, for the specified @js and @prio and return a
  * pointer to the next atom, unless all the priority's ring buffers are empty.
  *
  * Caller must hold the hwaccess_lock.
@@ -333,7 +335,7 @@ jsctx_rb_peek(struct kbase_context *kctx, int js)
 
 	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
 
-	for (prio = KBASE_JS_ATOM_SCHED_PRIO_HIGH;
+	for (prio = KBASE_JS_ATOM_SCHED_PRIO_FIRST;
 		prio < KBASE_JS_ATOM_SCHED_PRIO_COUNT; prio++) {
 		struct kbase_jd_atom *katom;
 
@@ -363,7 +365,7 @@ jsctx_rb_pull(struct kbase_context *kctx, struct kbase_jd_atom *katom)
 
 	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
 
-	dev_dbg(kctx->kbdev->dev, "Erasing atom %p from runnable tree of kctx %p\n",
+	dev_dbg(kctx->kbdev->dev, "Erasing atom %pK from runnable tree of kctx %pK\n",
 		(void *)katom, (void *)kctx);
 
 	/* Atoms must be pulled in the correct order. */
@@ -385,7 +387,7 @@ jsctx_tree_add(struct kbase_context *kctx, struct kbase_jd_atom *katom)
 
 	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
 
-	dev_dbg(kbdev->dev, "Adding atom %p to runnable tree of kctx %p (s:%d)\n",
+	dev_dbg(kbdev->dev, "Adding atom %pK to runnable tree of kctx %pK (s:%d)\n",
 		(void *)katom, (void *)kctx, js);
 
 	while (*new) {
@@ -448,7 +450,8 @@ int kbasep_js_devdata_init(struct kbase_device * const kbdev)
 
 #ifdef CONFIG_MALI_BIFROST_DEBUG
 	/* Soft-stop will be disabled on a single context by default unless
-	 * softstop_always is set */
+	 * softstop_always is set
+	 */
 	jsdd->softstop_always = false;
 #endif				/* CONFIG_MALI_BIFROST_DEBUG */
 	jsdd->nr_all_contexts_running = 0;
@@ -531,14 +534,15 @@ int kbasep_js_devdata_init(struct kbase_device * const kbdev)
 			kbdev->gpu_props.props.raw_props.js_features[i]);
 
 	/* On error, we could continue on: providing none of the below resources
-	 * rely on the ones above */
+	 * rely on the ones above
+	 */
 
 	mutex_init(&jsdd->runpool_mutex);
 	mutex_init(&jsdd->queue_mutex);
 	sema_init(&jsdd->schedule_sem, 1);
 
 	for (i = 0; i < kbdev->gpu_props.num_job_slots; ++i) {
-		for (j = 0; j < KBASE_JS_ATOM_SCHED_PRIO_COUNT; ++j) {
+		for (j = KBASE_JS_ATOM_SCHED_PRIO_FIRST; j < KBASE_JS_ATOM_SCHED_PRIO_COUNT; ++j) {
 			INIT_LIST_HEAD(&jsdd->ctx_list_pullable[i][j]);
 			INIT_LIST_HEAD(&jsdd->ctx_list_unpullable[i][j]);
 		}
@@ -595,16 +599,18 @@ int kbasep_js_kctx_init(struct kbase_context *const kctx)
 			sizeof(js_kctx_info->ctx.ctx_attr_ref_count));
 
 	/* Initially, the context is disabled from submission until the create
-	 * flags are set */
+	 * flags are set
+	 */
 	kbase_ctx_flag_set(kctx, KCTX_SUBMIT_DISABLED);
 
 	/* On error, we could continue on: providing none of the below resources
-	 * rely on the ones above */
+	 * rely on the ones above
+	 */
 	mutex_init(&js_kctx_info->ctx.jsctx_mutex);
 
 	init_waitqueue_head(&js_kctx_info->ctx.is_scheduled_wait);
 
-	for (i = 0; i < KBASE_JS_ATOM_SCHED_PRIO_COUNT; i++) {
+	for (i = KBASE_JS_ATOM_SCHED_PRIO_FIRST; i < KBASE_JS_ATOM_SCHED_PRIO_COUNT; i++) {
 		for (j = 0; j < BASE_JM_MAX_NR_SLOTS; j++) {
 			INIT_LIST_HEAD(&kctx->jsctx_queue[i][j].x_dep_head);
 			kctx->jsctx_queue[i][j].runnable_tree = RB_ROOT;
@@ -678,7 +684,7 @@ static bool kbase_js_ctx_list_add_pullable_nolock(struct kbase_device *kbdev,
 	bool ret = false;
 
 	lockdep_assert_held(&kbdev->hwaccess_lock);
-	dev_dbg(kbdev->dev, "Add pullable tail kctx %p (s:%d)\n",
+	dev_dbg(kbdev->dev, "Add pullable tail kctx %pK (s:%d)\n",
 		(void *)kctx, js);
 
 	if (!list_empty(&kctx->jctx.sched_info.ctx.ctx_list_entry[js]))
@@ -720,7 +726,7 @@ static bool kbase_js_ctx_list_add_pullable_head_nolock(
 	bool ret = false;
 
 	lockdep_assert_held(&kbdev->hwaccess_lock);
-	dev_dbg(kbdev->dev, "Add pullable head kctx %p (s:%d)\n",
+	dev_dbg(kbdev->dev, "Add pullable head kctx %pK (s:%d)\n",
 		(void *)kctx, js);
 
 	if (!list_empty(&kctx->jctx.sched_info.ctx.ctx_list_entry[js]))
@@ -796,7 +802,7 @@ static bool kbase_js_ctx_list_add_unpullable_nolock(struct kbase_device *kbdev,
 	bool ret = false;
 
 	lockdep_assert_held(&kbdev->hwaccess_lock);
-	dev_dbg(kbdev->dev, "Add unpullable tail kctx %p (s:%d)\n",
+	dev_dbg(kbdev->dev, "Add unpullable tail kctx %pK (s:%d)\n",
 		(void *)kctx, js);
 
 	list_move_tail(&kctx->jctx.sched_info.ctx.ctx_list_entry[js],
@@ -879,7 +885,7 @@ static struct kbase_context *kbase_js_ctx_list_pop_head_nolock(
 
 	lockdep_assert_held(&kbdev->hwaccess_lock);
 
-	for (i = 0; i < KBASE_JS_ATOM_SCHED_PRIO_COUNT; i++) {
+	for (i = KBASE_JS_ATOM_SCHED_PRIO_FIRST; i < KBASE_JS_ATOM_SCHED_PRIO_COUNT; i++) {
 		if (list_empty(&kbdev->js_data.ctx_list_pullable[js][i]))
 			continue;
 
@@ -889,7 +895,7 @@ static struct kbase_context *kbase_js_ctx_list_pop_head_nolock(
 
 		list_del_init(&kctx->jctx.sched_info.ctx.ctx_list_entry[js]);
 		dev_dbg(kbdev->dev,
-			"Popped %p from the pullable queue (s:%d)\n",
+			"Popped %pK from the pullable queue (s:%d)\n",
 			(void *)kctx, js);
 		return kctx;
 	}
@@ -943,25 +949,25 @@ static bool kbase_js_ctx_pullable(struct kbase_context *kctx, int js,
 
 	if (is_scheduled) {
 		if (!kbasep_js_is_submit_allowed(js_devdata, kctx)) {
-			dev_dbg(kbdev->dev, "JS: No submit allowed for kctx %p\n",
+			dev_dbg(kbdev->dev, "JS: No submit allowed for kctx %pK\n",
 				(void *)kctx);
 			return false;
 		}
 	}
 	katom = jsctx_rb_peek(kctx, js);
 	if (!katom) {
-		dev_dbg(kbdev->dev, "JS: No pullable atom in kctx %p (s:%d)\n",
+		dev_dbg(kbdev->dev, "JS: No pullable atom in kctx %pK (s:%d)\n",
 			(void *)kctx, js);
 		return false; /* No pullable atoms */
 	}
 	if (kctx->blocked_js[js][katom->sched_priority]) {
 		dev_dbg(kbdev->dev,
-			"JS: kctx %p is blocked from submitting atoms at priority %d (s:%d)\n",
+			"JS: kctx %pK is blocked from submitting atoms at priority %d (s:%d)\n",
 			(void *)kctx, katom->sched_priority, js);
 		return false;
 	}
 	if (atomic_read(&katom->blocked)) {
-		dev_dbg(kbdev->dev, "JS: Atom %p is blocked in js_ctx_pullable\n",
+		dev_dbg(kbdev->dev, "JS: Atom %pK is blocked in js_ctx_pullable\n",
 			(void *)katom);
 		return false; /* next atom blocked */
 	}
@@ -970,20 +976,20 @@ static bool kbase_js_ctx_pullable(struct kbase_context *kctx, int js,
 				KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB ||
 				katom->x_pre_dep->will_fail_event_code) {
 			dev_dbg(kbdev->dev,
-				"JS: X pre-dep %p is not present in slot FIFO or will fail\n",
+				"JS: X pre-dep %pK is not present in slot FIFO or will fail\n",
 				(void *)katom->x_pre_dep);
 			return false;
 		}
 		if ((katom->atom_flags & KBASE_KATOM_FLAG_FAIL_BLOCKER) &&
 			kbase_backend_nr_atoms_on_slot(kctx->kbdev, js)) {
 			dev_dbg(kbdev->dev,
-				"JS: Atom %p has cross-slot fail dependency and atoms on slot (s:%d)\n",
+				"JS: Atom %pK has cross-slot fail dependency and atoms on slot (s:%d)\n",
 				(void *)katom, js);
 			return false;
 		}
 	}
 
-	dev_dbg(kbdev->dev, "JS: Atom %p is pullable in kctx %p (s:%d)\n",
+	dev_dbg(kbdev->dev, "JS: Atom %pK is pullable in kctx %pK (s:%d)\n",
 		(void *)katom, (void *)kctx, js);
 
 	return true;
@@ -1007,7 +1013,7 @@ static bool kbase_js_dep_validate(struct kbase_context *kctx,
 			int dep_prio = dep_atom->sched_priority;
 
 			dev_dbg(kbdev->dev,
-				"Checking dep %d of atom %p (s:%d) on %p (s:%d)\n",
+				"Checking dep %d of atom %pK (s:%d) on %pK (s:%d)\n",
 				i, (void *)katom, js, (void *)dep_atom, dep_js);
 
 			/* Dependent atom must already have been submitted */
@@ -1020,7 +1026,8 @@ static bool kbase_js_dep_validate(struct kbase_context *kctx,
 			}
 
 			/* Dependencies with different priorities can't
-			  be represented in the ringbuffer */
+			 * be represented in the ringbuffer
+			 */
 			if (prio != dep_prio) {
 				dev_dbg(kbdev->dev,
 					"Different atom priorities\n");
@@ -1030,7 +1037,8 @@ static bool kbase_js_dep_validate(struct kbase_context *kctx,
 
 			if (js == dep_js) {
 				/* Only one same-slot dependency can be
-				 * represented in the ringbuffer */
+				 * represented in the ringbuffer
+				 */
 				if (has_dep) {
 					dev_dbg(kbdev->dev,
 						"Too many same-slot deps\n");
@@ -1038,7 +1046,8 @@ static bool kbase_js_dep_validate(struct kbase_context *kctx,
 					break;
 				}
 				/* Each dependee atom can only have one
-				 * same-slot dependency */
+				 * same-slot dependency
+				 */
 				if (dep_atom->post_dep) {
 					dev_dbg(kbdev->dev,
 						"Too many same-slot successors\n");
@@ -1048,7 +1057,8 @@ static bool kbase_js_dep_validate(struct kbase_context *kctx,
 				has_dep = true;
 			} else {
 				/* Only one cross-slot dependency can be
-				 * represented in the ringbuffer */
+				 * represented in the ringbuffer
+				 */
 				if (has_x_dep) {
 					dev_dbg(kbdev->dev,
 						"Too many cross-slot deps\n");
@@ -1056,7 +1066,8 @@ static bool kbase_js_dep_validate(struct kbase_context *kctx,
 					break;
 				}
 				/* Each dependee atom can only have one
-				 * cross-slot dependency */
+				 * cross-slot dependency
+				 */
 				if (dep_atom->x_post_dep) {
 					dev_dbg(kbdev->dev,
 						"Too many cross-slot successors\n");
@@ -1064,7 +1075,8 @@ static bool kbase_js_dep_validate(struct kbase_context *kctx,
 					break;
 				}
 				/* The dependee atom can not already be in the
-				 * HW access ringbuffer */
+				 * HW access ringbuffer
+				 */
 				if (dep_atom->gpu_rb_state !=
 					KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB) {
 					dev_dbg(kbdev->dev,
@@ -1074,7 +1086,8 @@ static bool kbase_js_dep_validate(struct kbase_context *kctx,
 					break;
 				}
 				/* The dependee atom can not already have
-				 * completed */
+				 * completed
+				 */
 				if (dep_atom->status !=
 						KBASE_JD_ATOM_STATE_IN_JS) {
 					dev_dbg(kbdev->dev,
@@ -1092,7 +1105,8 @@ static bool kbase_js_dep_validate(struct kbase_context *kctx,
 	}
 
 	/* If dependencies can be represented by ringbuffer then clear them from
-	 * atom structure */
+	 * atom structure
+	 */
 	if (ret) {
 		for (i = 0; i < 2; i++) {
 			struct kbase_jd_atom *dep_atom = katom->dep[i].atom;
@@ -1101,7 +1115,7 @@ static bool kbase_js_dep_validate(struct kbase_context *kctx,
 				int dep_js = kbase_js_get_slot(kbdev, dep_atom);
 
 				dev_dbg(kbdev->dev,
-					"Clearing dep %d of atom %p (s:%d) on %p (s:%d)\n",
+					"Clearing dep %d of atom %pK (s:%d) on %pK (s:%d)\n",
 					i, (void *)katom, js, (void *)dep_atom,
 					dep_js);
 
@@ -1116,7 +1130,7 @@ static bool kbase_js_dep_validate(struct kbase_context *kctx,
 					katom->atom_flags |=
 						KBASE_KATOM_FLAG_X_DEP_BLOCKED;
 
-					dev_dbg(kbdev->dev, "Set X_DEP flag on atom %p\n",
+					dev_dbg(kbdev->dev, "Set X_DEP flag on atom %pK\n",
 						(void *)katom);
 
 					katom->x_pre_dep = dep_atom;
@@ -1140,7 +1154,7 @@ static bool kbase_js_dep_validate(struct kbase_context *kctx,
 		}
 	} else {
 		dev_dbg(kbdev->dev,
-			"Deps of atom %p (s:%d) could not be represented\n",
+			"Deps of atom %pK (s:%d) could not be represented\n",
 			(void *)katom, js);
 	}
 
@@ -1181,7 +1195,7 @@ void kbase_js_update_ctx_priority(struct kbase_context *kctx)
 		/* Determine the new priority for context, as per the priority
 		 * of currently in-use atoms.
 		 */
-		for (prio = KBASE_JS_ATOM_SCHED_PRIO_HIGH;
+		for (prio = KBASE_JS_ATOM_SCHED_PRIO_FIRST;
 			prio < KBASE_JS_ATOM_SCHED_PRIO_COUNT; prio++) {
 			if (kctx->atoms_count[prio]) {
 				new_priority = prio;
@@ -1192,6 +1206,7 @@ void kbase_js_update_ctx_priority(struct kbase_context *kctx)
 
 	kbase_js_set_ctx_priority(kctx, new_priority);
 }
+KBASE_EXPORT_TEST_API(kbase_js_update_ctx_priority);
 
 /**
  * js_add_start_rp() - Add an atom that starts a renderpass to the job scheduler
@@ -1222,7 +1237,7 @@ static int js_add_start_rp(struct kbase_jd_atom *const start_katom)
 	if (rp->state != KBASE_JD_RP_COMPLETE)
 		return -EINVAL;
 
-	dev_dbg(kctx->kbdev->dev, "JS add start atom %p of RP %d\n",
+	dev_dbg(kctx->kbdev->dev, "JS add start atom %pK of RP %d\n",
 		(void *)start_katom, start_katom->renderpass_id);
 
 	/* The following members are read when updating the job slot
@@ -1265,7 +1280,7 @@ static int js_add_end_rp(struct kbase_jd_atom *const end_katom)
 
 	rp = &kctx->jctx.renderpasses[end_katom->renderpass_id];
 
-	dev_dbg(kbdev->dev, "JS add end atom %p in state %d of RP %d\n",
+	dev_dbg(kbdev->dev, "JS add end atom %pK in state %d of RP %d\n",
 		(void *)end_katom, (int)rp->state, end_katom->renderpass_id);
 
 	if (rp->state == KBASE_JD_RP_COMPLETE)
@@ -1332,7 +1347,7 @@ bool kbasep_js_add_job(struct kbase_context *kctx,
 	/* Refcount ctx.nr_jobs */
 	KBASE_DEBUG_ASSERT(js_kctx_info->ctx.nr_jobs < U32_MAX);
 	++(js_kctx_info->ctx.nr_jobs);
-	dev_dbg(kbdev->dev, "Add atom %p to kctx %p; now %d in ctx\n",
+	dev_dbg(kbdev->dev, "Add atom %pK to kctx %pK; now %d in ctx\n",
 		(void *)atom, (void *)kctx, js_kctx_info->ctx.nr_jobs);
 
 	/* Lock for state available during IRQ */
@@ -1345,13 +1360,14 @@ bool kbasep_js_add_job(struct kbase_context *kctx,
 		/* Dependencies could not be represented */
 		--(js_kctx_info->ctx.nr_jobs);
 		dev_dbg(kbdev->dev,
-			"Remove atom %p from kctx %p; now %d in ctx\n",
+			"Remove atom %pK from kctx %pK; now %d in ctx\n",
 			(void *)atom, (void *)kctx, js_kctx_info->ctx.nr_jobs);
 
 		/* Setting atom status back to queued as it still has unresolved
-		 * dependencies */
+		 * dependencies
+		 */
 		atom->status = KBASE_JD_ATOM_STATE_QUEUED;
-		dev_dbg(kbdev->dev, "Atom %p status to queued\n", (void *)atom);
+		dev_dbg(kbdev->dev, "Atom %pK status to queued\n", (void *)atom);
 
 		/* Undo the count, as the atom will get added again later but
 		 * leave the context priority adjusted or boosted, in case if
@@ -1389,7 +1405,8 @@ bool kbasep_js_add_job(struct kbase_context *kctx,
 					kbdev, kctx, atom->slot_nr);
 	}
 	/* If this context is active and the atom is the first on its slot,
-	 * kick the job manager to attempt to fast-start the atom */
+	 * kick the job manager to attempt to fast-start the atom
+	 */
 	if (enqueue_required && kctx ==
 			kbdev->hwaccess.active_kctx[atom->slot_nr])
 		kbase_jm_try_kick(kbdev, 1 << atom->slot_nr);
@@ -1404,22 +1421,25 @@ bool kbasep_js_add_job(struct kbase_context *kctx,
 		if (kbase_ctx_flag(kctx, KCTX_DYING)) {
 			/* A job got added while/after kbase_job_zap_context()
 			 * was called on a non-scheduled context. Kill that job
-			 * by killing the context. */
+			 * by killing the context.
+			 */
 			kbasep_js_runpool_requeue_or_kill_ctx(kbdev, kctx,
 					false);
 		} else if (js_kctx_info->ctx.nr_jobs == 1) {
 			/* Handle Refcount going from 0 to 1: schedule the
-			 * context on the Queue */
+			 * context on the Queue
+			 */
 			KBASE_DEBUG_ASSERT(!kbase_ctx_flag(kctx, KCTX_SCHEDULED));
-			dev_dbg(kbdev->dev, "JS: Enqueue Context %p", kctx);
+			dev_dbg(kbdev->dev, "JS: Enqueue Context %pK", kctx);
 
-			/* Queue was updated - caller must try to
-			 * schedule the head context */
+			/* Queue was updated - caller must try to schedule the
+			 * head context
+			 */
 			WARN_ON(!enqueue_required);
 		}
 	}
 out_unlock:
-	dev_dbg(kbdev->dev, "Enqueue of kctx %p is %srequired\n",
+	dev_dbg(kbdev->dev, "Enqueue of kctx %pK is %srequired\n",
 		kctx, enqueue_required ? "" : "not ");
 
 	mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
@@ -1448,7 +1468,7 @@ void kbasep_js_remove_job(struct kbase_device *kbdev,
 	KBASE_DEBUG_ASSERT(js_kctx_info->ctx.nr_jobs > 0);
 	--(js_kctx_info->ctx.nr_jobs);
 	dev_dbg(kbdev->dev,
-		"Remove atom %p from kctx %p; now %d in ctx\n",
+		"Remove atom %pK from kctx %pK; now %d in ctx\n",
 		(void *)atom, (void *)kctx, js_kctx_info->ctx.nr_jobs);
 
 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
@@ -1478,7 +1498,8 @@ bool kbasep_js_remove_cancelled_job(struct kbase_device *kbdev,
 	 *
 	 * This is because it returns false for soft-stopped atoms, but we
 	 * want to override that, because we're cancelling an atom regardless of
-	 * whether it was soft-stopped or not */
+	 * whether it was soft-stopped or not
+	 */
 	attr_state_changed = kbasep_js_ctx_attr_ctx_release_atom(kbdev, kctx,
 			&katom_retained_state);
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
@@ -1525,7 +1546,8 @@ static kbasep_js_release_result kbasep_js_run_jobs_after_ctx_and_atom_release(
 
 	if (js_devdata->nr_user_contexts_running != 0 && runpool_ctx_attr_change) {
 		/* A change in runpool ctx attributes might mean we can
-		 * run more jobs than before  */
+		 * run more jobs than before
+		 */
 		result = KBASEP_JS_RELEASE_RESULT_SCHED_ALL;
 
 		KBASE_KTRACE_ADD_JM_SLOT(kbdev, JD_DONE_TRY_RUN_NEXT_JOB,
@@ -1624,7 +1646,8 @@ static kbasep_js_release_result kbasep_js_runpool_release_ctx_internal(
 
 	/* Make a set of checks to see if the context should be scheduled out.
 	 * Note that there'll always be at least 1 reference to the context
-	 * which was previously acquired by kbasep_js_schedule_ctx(). */
+	 * which was previously acquired by kbasep_js_schedule_ctx().
+	 */
 	if (new_ref_count == 1 &&
 		(!kbasep_js_is_submit_allowed(js_devdata, kctx) ||
 #ifdef CONFIG_MALI_ARBITER_SUPPORT
@@ -1635,8 +1658,9 @@ static kbasep_js_release_result kbasep_js_runpool_release_ctx_internal(
 		int slot;
 
 		/* Last reference, and we've been told to remove this context
-		 * from the Run Pool */
-		dev_dbg(kbdev->dev, "JS: RunPool Remove Context %p because refcount=%d, jobs=%d, allowed=%d",
+		 * from the Run Pool
+		 */
+		dev_dbg(kbdev->dev, "JS: RunPool Remove Context %pK because refcount=%d, jobs=%d, allowed=%d",
 				kctx, new_ref_count, js_kctx_info->ctx.nr_jobs,
 				kbasep_js_is_submit_allowed(js_devdata, kctx));
 
@@ -1646,7 +1670,7 @@ static kbasep_js_release_result kbasep_js_runpool_release_ctx_internal(
 
 		for (slot = 0; slot < num_slots; slot++) {
 			if (kbdev->hwaccess.active_kctx[slot] == kctx) {
-				dev_dbg(kbdev->dev, "Marking kctx %p as inactive (s:%d)\n",
+				dev_dbg(kbdev->dev, "Marking kctx %pK as inactive (s:%d)\n",
 					(void *)kctx, slot);
 				kbdev->hwaccess.active_kctx[slot] = NULL;
 			}
@@ -1662,7 +1686,8 @@ static kbasep_js_release_result kbasep_js_runpool_release_ctx_internal(
 			kbasep_js_ctx_attr_runpool_release_ctx(kbdev, kctx);
 
 		/* Releasing the context and katom retained state can allow
-		 * more jobs to run */
+		 * more jobs to run
+		 */
 		release_result |=
 			kbasep_js_run_jobs_after_ctx_and_atom_release(kbdev,
 						kctx, katom_retained_state,
@@ -1702,7 +1727,8 @@ static kbasep_js_release_result kbasep_js_runpool_release_ctx_internal(
 		kbase_ctx_flag_clear(kctx, KCTX_SCHEDULED);
 		/* Signal any waiter that the context is not scheduled, so is
 		 * safe for termination - once the jsctx_mutex is also dropped,
-		 * and jobs have finished. */
+		 * and jobs have finished.
+		 */
 		wake_up(&js_kctx_info->ctx.is_scheduled_wait);
 
 		/* Queue an action to occur after we've dropped the lock */
@@ -1744,9 +1770,10 @@ void kbasep_js_runpool_requeue_or_kill_ctx(struct kbase_device *kbdev,
 
 	if (kbase_ctx_flag(kctx, KCTX_DYING)) {
 		/* Dying: don't requeue, but kill all jobs on the context. This
-		 * happens asynchronously */
+		 * happens asynchronously
+		 */
 		dev_dbg(kbdev->dev,
-			"JS: ** Killing Context %p on RunPool Remove **", kctx);
+			"JS: ** Killing Context %pK on RunPool Remove **", kctx);
 		kbase_js_foreach_ctx_job(kctx, &kbase_jd_cancel);
 	}
 }
@@ -1798,7 +1825,8 @@ void kbasep_js_runpool_release_ctx(struct kbase_device *kbdev,
 }
 
 /* Variant of kbasep_js_runpool_release_ctx() that doesn't call into
- * kbase_js_sched_all() */
+ * kbase_js_sched_all()
+ */
 static void kbasep_js_runpool_release_ctx_no_schedule(
 		struct kbase_device *kbdev, struct kbase_context *kctx)
 {
@@ -1851,7 +1879,7 @@ static bool kbasep_js_schedule_ctx(struct kbase_device *kbdev,
 	bool kctx_suspended = false;
 	int as_nr;
 
-	dev_dbg(kbdev->dev, "Scheduling kctx %p (s:%d)\n", kctx, js);
+	dev_dbg(kbdev->dev, "Scheduling kctx %pK (s:%d)\n", kctx, js);
 
 	js_devdata = &kbdev->js_data;
 	js_kctx_info = &kctx->jctx.sched_info;
@@ -1867,7 +1895,8 @@ static bool kbasep_js_schedule_ctx(struct kbase_device *kbdev,
 				kbdev, kctx);
 		if (as_nr != KBASEP_AS_NR_INVALID) {
 			/* Attempt to retain the context again, this should
-			 * succeed */
+			 * succeed
+			 */
 			mutex_lock(&kbdev->mmu_hw_mutex);
 			spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
 			as_nr = kbase_ctx_sched_retain_ctx(kctx);
@@ -1926,7 +1955,8 @@ static bool kbasep_js_schedule_ctx(struct kbase_device *kbdev,
 	KBASE_TLSTREAM_TL_RET_AS_CTX(kbdev, &kbdev->as[kctx->as_nr], kctx);
 
 	/* Cause any future waiter-on-termination to wait until the context is
-	 * descheduled */
+	 * descheduled
+	 */
 	wake_up(&js_kctx_info->ctx.is_scheduled_wait);
 
 	/* Re-check for suspending: a suspend could've occurred, and all the
@@ -1939,7 +1969,8 @@ static bool kbasep_js_schedule_ctx(struct kbase_device *kbdev,
 	 * was taken (i.e. this condition doesn't execute), then the
 	 * kbasep_js_suspend() code will cleanup this context instead (by virtue
 	 * of it being called strictly after the suspend flag is set, and will
-	 * wait for this lock to drop) */
+	 * wait for this lock to drop)
+	 */
 #ifdef CONFIG_MALI_ARBITER_SUPPORT
 	if (kbase_pm_is_suspending(kbdev) || kbase_pm_is_gpu_lost(kbdev)) {
 #else
@@ -1967,13 +1998,15 @@ static bool kbasep_js_schedule_ctx(struct kbase_device *kbdev,
 	mutex_unlock(&js_devdata->runpool_mutex);
 	mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
 	/* Note: after this point, the context could potentially get scheduled
-	 * out immediately */
+	 * out immediately
+	 */
 
 	if (kctx_suspended) {
 		/* Finishing forcing out the context due to a suspend. Use a
 		 * variant of kbasep_js_runpool_release_ctx() that doesn't
 		 * schedule a new context, to prevent a risk of recursion back
-		 * into this function */
+		 * into this function
+		 */
 		kbasep_js_runpool_release_ctx_no_schedule(kbdev, kctx);
 		return false;
 	}
@@ -1992,7 +2025,7 @@ static bool kbase_js_use_ctx(struct kbase_device *kbdev,
 			kbase_backend_use_ctx_sched(kbdev, kctx, js)) {
 
 		dev_dbg(kbdev->dev,
-			"kctx %p already has ASID - mark as active (s:%d)\n",
+			"kctx %pK already has ASID - mark as active (s:%d)\n",
 			(void *)kctx, js);
 
 		if (kbdev->hwaccess.active_kctx[js] != kctx) {
@@ -2059,7 +2092,8 @@ void kbasep_js_schedule_privileged_ctx(struct kbase_device *kbdev,
 			kbase_js_sync_timers(kbdev);
 
 		/* Fast-starting requires the jsctx_mutex to be dropped,
-		 * because it works on multiple ctxs */
+		 * because it works on multiple ctxs
+		 */
 		mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
 		mutex_unlock(&js_devdata->queue_mutex);
 
@@ -2071,7 +2105,8 @@ void kbasep_js_schedule_privileged_ctx(struct kbase_device *kbdev,
 			   kbase_ctx_flag(kctx, KCTX_SCHEDULED));
 	} else {
 		/* Already scheduled in - We need to retain it to keep the
-		 * corresponding address space */
+		 * corresponding address space
+		 */
 		WARN_ON(!kbase_ctx_sched_inc_refcount(kctx));
 		mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
 		mutex_unlock(&js_devdata->queue_mutex);
@@ -2116,7 +2151,8 @@ void kbasep_js_suspend(struct kbase_device *kbdev)
 	js_devdata->runpool_irq.submit_allowed = 0;
 
 	/* Retain each of the contexts, so we can cause it to leave even if it
-	 * had no refcount to begin with */
+	 * had no refcount to begin with
+	 */
 	for (i = BASE_MAX_NR_AS - 1; i >= 0; --i) {
 		struct kbase_context *kctx = kbdev->as_to_kctx[i];
 
@@ -2137,7 +2173,8 @@ void kbasep_js_suspend(struct kbase_device *kbdev)
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 
 	/* De-ref the previous retain to ensure each context gets pulled out
-	 * sometime later. */
+	 * sometime later.
+	 */
 	for (i = 0;
 		 i < BASE_MAX_NR_AS;
 		 ++i, retained = retained >> 1) {
@@ -2148,7 +2185,8 @@ void kbasep_js_suspend(struct kbase_device *kbdev)
 	}
 
 	/* Caller must wait for all Power Manager active references to be
-	 * dropped */
+	 * dropped
+	 */
 }
 
 void kbasep_js_resume(struct kbase_device *kbdev)
@@ -2162,7 +2200,7 @@ void kbasep_js_resume(struct kbase_device *kbdev)
 
 	mutex_lock(&js_devdata->queue_mutex);
 	for (js = 0; js < kbdev->gpu_props.num_job_slots; js++) {
-		for (prio = KBASE_JS_ATOM_SCHED_PRIO_HIGH;
+		for (prio = KBASE_JS_ATOM_SCHED_PRIO_FIRST;
 			prio < KBASE_JS_ATOM_SCHED_PRIO_COUNT; prio++) {
 			struct kbase_context *kctx, *n;
 			unsigned long flags;
@@ -2283,7 +2321,8 @@ bool kbase_js_dep_resolved_submit(struct kbase_context *kctx,
 	lockdep_assert_held(&kctx->jctx.lock);
 
 	/* If slot will transition from unpullable to pullable then add to
-	 * pullable list */
+	 * pullable list
+	 */
 	if (jsctx_rb_none_to_pull(kctx, katom->slot_nr)) {
 		enqueue_required = true;
 	} else {
@@ -2297,7 +2336,7 @@ bool kbase_js_dep_resolved_submit(struct kbase_context *kctx,
 		int js = katom->slot_nr;
 		struct jsctx_queue *queue = &kctx->jsctx_queue[prio][js];
 
-		dev_dbg(kctx->kbdev->dev, "Add atom %p to X_DEP list (s:%d)\n",
+		dev_dbg(kctx->kbdev->dev, "Add atom %pK to X_DEP list (s:%d)\n",
 			(void *)katom, js);
 
 		list_add_tail(&katom->queue, &queue->x_dep_head);
@@ -2307,7 +2346,7 @@ bool kbase_js_dep_resolved_submit(struct kbase_context *kctx,
 			add_required = false;
 		}
 	} else {
-		dev_dbg(kctx->kbdev->dev, "Atom %p not added to X_DEP list\n",
+		dev_dbg(kctx->kbdev->dev, "Atom %pK not added to X_DEP list\n",
 			(void *)katom);
 	}
 
@@ -2321,7 +2360,7 @@ bool kbase_js_dep_resolved_submit(struct kbase_context *kctx,
 	}
 
 	dev_dbg(kctx->kbdev->dev,
-		"Enqueue of kctx %p is %srequired to submit atom %p\n",
+		"Enqueue of kctx %pK is %srequired to submit atom %pK\n",
 		kctx, enqueue_required ? "" : "not ", katom);
 
 	return enqueue_required;
@@ -2348,7 +2387,7 @@ static void kbase_js_move_to_tree(struct kbase_jd_atom *katom)
 
 		if (!kbase_js_atom_blocked_on_x_dep(katom)) {
 			dev_dbg(kctx->kbdev->dev,
-				"Del atom %p from X_DEP list in js_move_to_tree\n",
+				"Del atom %pK from X_DEP list in js_move_to_tree\n",
 				(void *)katom);
 
 			list_del(&katom->queue);
@@ -2366,7 +2405,7 @@ static void kbase_js_move_to_tree(struct kbase_jd_atom *katom)
 			}
 		} else {
 			dev_dbg(kctx->kbdev->dev,
-				"Atom %p blocked on x-dep in js_move_to_tree\n",
+				"Atom %pK blocked on x-dep in js_move_to_tree\n",
 				(void *)katom);
 			break;
 		}
@@ -2409,10 +2448,8 @@ static void kbase_js_evict_deps(struct kbase_context *kctx,
 				KBASE_KATOM_FLAG_JSCTX_IN_X_DEP_LIST))) {
 		/* Remove dependency.*/
 		x_dep->atom_flags &= ~KBASE_KATOM_FLAG_X_DEP_BLOCKED;
-		trace_sysgraph(SGR_DEP_RES, kctx->id,
-				kbase_jd_atom_id(kctx, x_dep));
 
-		dev_dbg(kctx->kbdev->dev, "Cleared X_DEP flag on atom %p\n",
+		dev_dbg(kctx->kbdev->dev, "Cleared X_DEP flag on atom %pK\n",
 			(void *)x_dep);
 
 		/* Fail if it had a data dependency. */
@@ -2434,14 +2471,14 @@ struct kbase_jd_atom *kbase_js_pull(struct kbase_context *kctx, int js)
 	KBASE_DEBUG_ASSERT(kctx);
 
 	kbdev = kctx->kbdev;
-	dev_dbg(kbdev->dev, "JS: pulling an atom from kctx %p (s:%d)\n",
+	dev_dbg(kbdev->dev, "JS: pulling an atom from kctx %pK (s:%d)\n",
 		(void *)kctx, js);
 
 	js_devdata = &kbdev->js_data;
 	lockdep_assert_held(&kbdev->hwaccess_lock);
 
 	if (!kbasep_js_is_submit_allowed(js_devdata, kctx)) {
-		dev_dbg(kbdev->dev, "JS: No submit allowed for kctx %p\n",
+		dev_dbg(kbdev->dev, "JS: No submit allowed for kctx %pK\n",
 			(void *)kctx);
 		return NULL;
 	}
@@ -2454,25 +2491,26 @@ struct kbase_jd_atom *kbase_js_pull(struct kbase_context *kctx, int js)
 
 	katom = jsctx_rb_peek(kctx, js);
 	if (!katom) {
-		dev_dbg(kbdev->dev, "JS: No pullable atom in kctx %p (s:%d)\n",
+		dev_dbg(kbdev->dev, "JS: No pullable atom in kctx %pK (s:%d)\n",
 			(void *)kctx, js);
 		return NULL;
 	}
 	if (kctx->blocked_js[js][katom->sched_priority]) {
 		dev_dbg(kbdev->dev,
-			"JS: kctx %p is blocked from submitting atoms at priority %d (s:%d)\n",
+			"JS: kctx %pK is blocked from submitting atoms at priority %d (s:%d)\n",
 			(void *)kctx, katom->sched_priority, js);
 		return NULL;
 	}
 	if (atomic_read(&katom->blocked)) {
-		dev_dbg(kbdev->dev, "JS: Atom %p is blocked in js_pull\n",
+		dev_dbg(kbdev->dev, "JS: Atom %pK is blocked in js_pull\n",
 			(void *)katom);
 		return NULL;
 	}
 
 	/* Due to ordering restrictions when unpulling atoms on failure, we do
 	 * not allow multiple runs of fail-dep atoms from the same context to be
-	 * present on the same slot */
+	 * present on the same slot
+	 */
 	if (katom->pre_dep && atomic_read(&kctx->atoms_pulled_slot[js])) {
 		struct kbase_jd_atom *prev_atom =
 				kbase_backend_inspect_tail(kbdev, js);
@@ -2486,14 +2524,14 @@ struct kbase_jd_atom *kbase_js_pull(struct kbase_context *kctx, int js)
 				KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB ||
 				katom->x_pre_dep->will_fail_event_code)	{
 			dev_dbg(kbdev->dev,
-				"JS: X pre-dep %p is not present in slot FIFO or will fail\n",
+				"JS: X pre-dep %pK is not present in slot FIFO or will fail\n",
 				(void *)katom->x_pre_dep);
 			return NULL;
 		}
 		if ((katom->atom_flags & KBASE_KATOM_FLAG_FAIL_BLOCKER) &&
 				kbase_backend_nr_atoms_on_slot(kbdev, js)) {
 			dev_dbg(kbdev->dev,
-				"JS: Atom %p has cross-slot fail dependency and atoms on slot (s:%d)\n",
+				"JS: Atom %pK has cross-slot fail dependency and atoms on slot (s:%d)\n",
 				(void *)katom, js);
 			return NULL;
 		}
@@ -2518,7 +2556,7 @@ struct kbase_jd_atom *kbase_js_pull(struct kbase_context *kctx, int js)
 
 	katom->ticks = 0;
 
-	dev_dbg(kbdev->dev, "JS: successfully pulled atom %p from kctx %p (s:%d)\n",
+	dev_dbg(kbdev->dev, "JS: successfully pulled atom %pK from kctx %pK (s:%d)\n",
 		(void *)katom, (void *)kctx, js);
 
 	return katom;
@@ -2561,7 +2599,7 @@ static void js_return_of_start_rp(struct kbase_jd_atom *const start_katom)
 		return;
 
 	dev_dbg(kctx->kbdev->dev,
-		"JS return start atom %p in state %d of RP %d\n",
+		"JS return start atom %pK in state %d of RP %d\n",
 		(void *)start_katom, (int)rp->state,
 		start_katom->renderpass_id);
 
@@ -2589,7 +2627,7 @@ static void js_return_of_start_rp(struct kbase_jd_atom *const start_katom)
 	/* Prevent the tiler job being pulled for execution in the
 	 * job scheduler again.
 	 */
-	dev_dbg(kbdev->dev, "Blocking start atom %p\n",
+	dev_dbg(kbdev->dev, "Blocking start atom %pK\n",
 		(void *)start_katom);
 	atomic_inc(&start_katom->blocked);
 
@@ -2601,14 +2639,14 @@ static void js_return_of_start_rp(struct kbase_jd_atom *const start_katom)
 	/* Was the fragment job chain submitted to kbase yet? */
 	end_katom = rp->end_katom;
 	if (end_katom) {
-		dev_dbg(kctx->kbdev->dev, "JS return add end atom %p\n",
+		dev_dbg(kctx->kbdev->dev, "JS return add end atom %pK\n",
 			(void *)end_katom);
 
 		if (rp->state == KBASE_JD_RP_RETRY_OOM) {
 			/* Allow the end of the renderpass to be pulled for
 			 * execution again to continue incremental rendering.
 			 */
-			dev_dbg(kbdev->dev, "Unblocking end atom %p\n",
+			dev_dbg(kbdev->dev, "Unblocking end atom %pK\n",
 				(void *)end_katom);
 			atomic_dec(&end_katom->blocked);
 			WARN_ON(!(end_katom->atom_flags &
@@ -2670,7 +2708,7 @@ static void js_return_of_end_rp(struct kbase_jd_atom *const end_katom)
 		return;
 
 	dev_dbg(kctx->kbdev->dev,
-		"JS return end atom %p in state %d of RP %d\n",
+		"JS return end atom %pK in state %d of RP %d\n",
 		(void *)end_katom, (int)rp->state, end_katom->renderpass_id);
 
 	if (WARN_ON(rp->state != KBASE_JD_RP_OOM &&
@@ -2692,14 +2730,14 @@ static void js_return_of_end_rp(struct kbase_jd_atom *const end_katom)
 		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 
 		dev_dbg(kbdev->dev,
-			"Reset backing to %zu pages for region %p\n",
+			"Reset backing to %zu pages for region %pK\n",
 			reg->threshold_pages, (void *)reg);
 
 		if (!WARN_ON(reg->flags & KBASE_REG_VA_FREED))
 			kbase_mem_shrink(kctx, reg, reg->threshold_pages);
 
 		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-		dev_dbg(kbdev->dev, "Deleting region %p from list\n",
+		dev_dbg(kbdev->dev, "Deleting region %pK from list\n",
 			(void *)reg);
 		list_del_init(&reg->link);
 		kbase_va_region_alloc_put(kctx, reg);
@@ -2717,7 +2755,7 @@ static void js_return_of_end_rp(struct kbase_jd_atom *const end_katom)
 	 */
 	start_katom = rp->start_katom;
 	if (!WARN_ON(!start_katom)) {
-		dev_dbg(kbdev->dev, "Unblocking start atom %p\n",
+		dev_dbg(kbdev->dev, "Unblocking start atom %pK\n",
 			(void *)start_katom);
 		atomic_dec(&start_katom->blocked);
 		(void)kbase_js_ctx_list_add_pullable_head_nolock(kbdev, kctx,
@@ -2743,7 +2781,7 @@ static void js_return_worker(struct work_struct *data)
 	unsigned long flags;
 	base_jd_core_req core_req = katom->core_req;
 
-	dev_dbg(kbdev->dev, "%s for atom %p with event code 0x%x\n",
+	dev_dbg(kbdev->dev, "%s for atom %pK with event code 0x%x\n",
 		__func__, (void *)katom, katom->event_code);
 
 	if (katom->event_code != BASE_JD_EVENT_END_RP_DONE)
@@ -2771,13 +2809,15 @@ static void js_return_worker(struct work_struct *data)
 		timer_sync |= kbase_js_ctx_list_remove_nolock(kbdev, kctx, js);
 
 	/* If this slot has been blocked due to soft-stopped atoms, and all
-	 * atoms have now been processed, then unblock the slot */
+	 * atoms have now been processed, then unblock the slot
+	 */
 	if (!kctx->atoms_pulled_slot_pri[js][prio] &&
 			kctx->blocked_js[js][prio]) {
 		kctx->blocked_js[js][prio] = false;
 
 		/* Only mark the slot as pullable if the context is not idle -
-		 * that case is handled below */
+		 * that case is handled below
+		 */
 		if (atomic_read(&kctx->atoms_pulled) &&
 				kbase_js_ctx_pullable(kctx, js, true))
 			timer_sync |= kbase_js_ctx_list_add_pullable_nolock(
@@ -2786,12 +2826,12 @@ static void js_return_worker(struct work_struct *data)
 
 	if (!atomic_read(&kctx->atoms_pulled)) {
 		dev_dbg(kbdev->dev,
-			"No atoms currently pulled from context %p\n",
+			"No atoms currently pulled from context %pK\n",
 			(void *)kctx);
 
 		if (!kctx->slots_pullable) {
 			dev_dbg(kbdev->dev,
-				"Context %p %s counted as runnable\n",
+				"Context %pK %s counted as runnable\n",
 				(void *)kctx,
 				kbase_ctx_flag(kctx, KCTX_RUNNABLE_REF) ?
 					"is" : "isn't");
@@ -2827,7 +2867,7 @@ static void js_return_worker(struct work_struct *data)
 
 	if (context_idle) {
 		dev_dbg(kbdev->dev,
-			"Context %p %s counted as active\n",
+			"Context %pK %s counted as active\n",
 			(void *)kctx,
 			kbase_ctx_flag(kctx, KCTX_ACTIVE) ?
 				"is" : "isn't");
@@ -2866,13 +2906,13 @@ static void js_return_worker(struct work_struct *data)
 
 	kbase_backend_complete_wq_post_sched(kbdev, core_req);
 
-	dev_dbg(kbdev->dev, "Leaving %s for atom %p\n",
+	dev_dbg(kbdev->dev, "Leaving %s for atom %pK\n",
 		__func__, (void *)katom);
 }
 
 void kbase_js_unpull(struct kbase_context *kctx, struct kbase_jd_atom *katom)
 {
-	dev_dbg(kctx->kbdev->dev, "Unpulling atom %p in kctx %p\n",
+	dev_dbg(kctx->kbdev->dev, "Unpulling atom %pK in kctx %pK\n",
 		(void *)katom, (void *)kctx);
 
 	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
@@ -2927,7 +2967,7 @@ static bool js_complete_start_rp(struct kbase_context *kctx,
 		return false;
 
 	dev_dbg(kctx->kbdev->dev,
-		"Start atom %p is done in state %d of RP %d\n",
+		"Start atom %pK is done in state %d of RP %d\n",
 		(void *)start_katom, (int)rp->state,
 		start_katom->renderpass_id);
 
@@ -2939,7 +2979,7 @@ static bool js_complete_start_rp(struct kbase_context *kctx,
 		unsigned long flags;
 
 		dev_dbg(kctx->kbdev->dev,
-			"Start atom %p completed before soft-stop\n",
+			"Start atom %pK completed before soft-stop\n",
 			(void *)start_katom);
 
 		kbase_gpu_vm_lock(kctx);
@@ -2951,7 +2991,7 @@ static bool js_complete_start_rp(struct kbase_context *kctx,
 						 struct kbase_va_region, link);
 
 			WARN_ON(reg->flags & KBASE_REG_VA_FREED);
-			dev_dbg(kctx->kbdev->dev, "Deleting region %p from list\n",
+			dev_dbg(kctx->kbdev->dev, "Deleting region %pK from list\n",
 				(void *)reg);
 			list_del_init(&reg->link);
 			kbase_va_region_alloc_put(kctx, reg);
@@ -2961,7 +3001,7 @@ static bool js_complete_start_rp(struct kbase_context *kctx,
 		kbase_gpu_vm_unlock(kctx);
 	} else {
 		dev_dbg(kctx->kbdev->dev,
-			"Start atom %p did not exceed memory threshold\n",
+			"Start atom %pK did not exceed memory threshold\n",
 			(void *)start_katom);
 
 		WARN_ON(rp->state != KBASE_JD_RP_START &&
@@ -2978,7 +3018,7 @@ static bool js_complete_start_rp(struct kbase_context *kctx,
 			/* Allow the end of the renderpass to be pulled for
 			 * execution again to continue incremental rendering.
 			 */
-			dev_dbg(kbdev->dev, "Unblocking end atom %p!\n",
+			dev_dbg(kbdev->dev, "Unblocking end atom %pK!\n",
 				(void *)end_katom);
 			atomic_dec(&end_katom->blocked);
 
@@ -3022,7 +3062,7 @@ static void js_complete_end_rp(struct kbase_context *kctx,
 	if (WARN_ON(rp->end_katom != end_katom))
 		return;
 
-	dev_dbg(kbdev->dev, "End atom %p is done in state %d of RP %d\n",
+	dev_dbg(kbdev->dev, "End atom %pK is done in state %d of RP %d\n",
 		(void *)end_katom, (int)rp->state, end_katom->renderpass_id);
 
 	if (WARN_ON(rp->state == KBASE_JD_RP_COMPLETE) ||
@@ -3056,7 +3096,7 @@ bool kbase_js_complete_atom_wq(struct kbase_context *kctx,
 	kbdev = kctx->kbdev;
 	atom_slot = katom->slot_nr;
 
-	dev_dbg(kbdev->dev, "%s for atom %p (s:%d)\n",
+	dev_dbg(kbdev->dev, "%s for atom %pK (s:%d)\n",
 		__func__, (void *)katom, atom_slot);
 
 	/* Update the incremental rendering state machine.
@@ -3075,7 +3115,7 @@ bool kbase_js_complete_atom_wq(struct kbase_context *kctx,
 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
 
 	if (katom->atom_flags & KBASE_KATOM_FLAG_JSCTX_IN_TREE) {
-		dev_dbg(kbdev->dev, "Atom %p is in runnable_tree\n",
+		dev_dbg(kbdev->dev, "Atom %pK is in runnable_tree\n",
 			(void *)katom);
 
 		context_idle = !atomic_dec_return(&kctx->atoms_pulled);
@@ -3091,11 +3131,12 @@ bool kbase_js_complete_atom_wq(struct kbase_context *kctx,
 		}
 
 		/* If this slot has been blocked due to soft-stopped atoms, and
-		 * all atoms have now been processed, then unblock the slot */
+		 * all atoms have now been processed, then unblock the slot
+		 */
 		if (!kctx->atoms_pulled_slot_pri[atom_slot][prio]
 				&& kctx->blocked_js[atom_slot][prio]) {
 			dev_dbg(kbdev->dev,
-				"kctx %p is no longer blocked from submitting on slot %d at priority %d\n",
+				"kctx %pK is no longer blocked from submitting on slot %d at priority %d\n",
 				(void *)kctx, atom_slot, prio);
 
 			kctx->blocked_js[atom_slot][prio] = false;
@@ -3149,7 +3190,7 @@ bool kbase_js_complete_atom_wq(struct kbase_context *kctx,
 	 * jd_done_worker().
 	 */
 	if (context_idle) {
-		dev_dbg(kbdev->dev, "kctx %p is no longer active\n",
+		dev_dbg(kbdev->dev, "kctx %pK is no longer active\n",
 			(void *)kctx);
 		kbase_ctx_flag_clear(kctx, KCTX_ACTIVE);
 	}
@@ -3200,7 +3241,7 @@ static bool js_end_rp_is_complete(struct kbase_jd_atom *const end_katom)
 		return true;
 
 	dev_dbg(kbdev->dev,
-		"JS complete end atom %p in state %d of RP %d\n",
+		"JS complete end atom %pK in state %d of RP %d\n",
 		(void *)end_katom, (int)rp->state,
 		end_katom->renderpass_id);
 
@@ -3229,7 +3270,7 @@ struct kbase_jd_atom *kbase_js_complete_atom(struct kbase_jd_atom *katom,
 	struct kbase_jd_atom *x_dep = katom->x_post_dep;
 
 	kbdev = kctx->kbdev;
-	dev_dbg(kbdev->dev, "Atom %p complete in kctx %p (post-dep %p)\n",
+	dev_dbg(kbdev->dev, "Atom %pK complete in kctx %pK (post-dep %pK)\n",
 		(void *)katom, (void *)kctx, (void *)x_dep);
 
 	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
@@ -3245,7 +3286,7 @@ struct kbase_jd_atom *kbase_js_complete_atom(struct kbase_jd_atom *katom,
 		katom->event_code = katom->will_fail_event_code;
 
 	katom->status = KBASE_JD_ATOM_STATE_HW_COMPLETED;
-	dev_dbg(kbdev->dev, "Atom %p status to HW completed\n", (void *)katom);
+	dev_dbg(kbdev->dev, "Atom %pK status to HW completed\n", (void *)katom);
 
 	if (katom->event_code != BASE_JD_EVENT_DONE) {
 		kbase_js_evict_deps(kctx, katom, katom->slot_nr,
@@ -3267,9 +3308,7 @@ struct kbase_jd_atom *kbase_js_complete_atom(struct kbase_jd_atom *katom,
 		bool was_pullable = kbase_js_ctx_pullable(kctx, x_dep->slot_nr,
 				false);
 		x_dep->atom_flags &= ~KBASE_KATOM_FLAG_X_DEP_BLOCKED;
-		trace_sysgraph(SGR_DEP_RES, kctx->id,
-				kbase_jd_atom_id(katom->kctx, x_dep));
-		dev_dbg(kbdev->dev, "Cleared X_DEP flag on atom %p\n",
+		dev_dbg(kbdev->dev, "Cleared X_DEP flag on atom %pK\n",
 			(void *)x_dep);
 
 		kbase_js_move_to_tree(x_dep);
@@ -3280,13 +3319,13 @@ struct kbase_jd_atom *kbase_js_complete_atom(struct kbase_jd_atom *katom,
 					x_dep->slot_nr);
 
 		if (x_dep->atom_flags & KBASE_KATOM_FLAG_JSCTX_IN_TREE) {
-			dev_dbg(kbdev->dev, "Atom %p is in runnable tree\n",
+			dev_dbg(kbdev->dev, "Atom %pK is in runnable tree\n",
 				(void *)x_dep);
 			return x_dep;
 		}
 	} else {
 		dev_dbg(kbdev->dev,
-			"No cross-slot dep to unblock for atom %p\n",
+			"No cross-slot dep to unblock for atom %pK\n",
 			(void *)katom);
 	}
 
@@ -3317,13 +3356,13 @@ bool kbase_js_atom_blocked_on_x_dep(struct kbase_jd_atom *const katom)
 
 	if (!(katom->atom_flags &
 			KBASE_KATOM_FLAG_X_DEP_BLOCKED)) {
-		dev_dbg(kbdev->dev, "Atom %p is not blocked on a cross-slot dependency",
+		dev_dbg(kbdev->dev, "Atom %pK is not blocked on a cross-slot dependency",
 			(void *)katom);
 		return false;
 	}
 
 	if (!(katom->core_req & BASE_JD_REQ_END_RENDERPASS)) {
-		dev_dbg(kbdev->dev, "Atom %p is blocked on a cross-slot dependency",
+		dev_dbg(kbdev->dev, "Atom %pK is blocked on a cross-slot dependency",
 			(void *)katom);
 		return true;
 	}
@@ -3349,12 +3388,12 @@ bool kbase_js_atom_blocked_on_x_dep(struct kbase_jd_atom *const katom)
 	 * if it only depends on the tiler job chain.
 	 */
 	if (katom->x_pre_dep != rp->start_katom) {
-		dev_dbg(kbdev->dev, "Dependency is on %p not start atom %p\n",
+		dev_dbg(kbdev->dev, "Dependency is on %pK not start atom %pK\n",
 			(void *)katom->x_pre_dep, (void *)rp->start_katom);
 		return true;
 	}
 
-	dev_dbg(kbdev->dev, "Ignoring cross-slot dep on atom %p\n",
+	dev_dbg(kbdev->dev, "Ignoring cross-slot dep on atom %pK\n",
 		(void *)katom->x_pre_dep);
 
 	return false;
@@ -3368,7 +3407,7 @@ void kbase_js_sched(struct kbase_device *kbdev, int js_mask)
 	bool ctx_waiting[BASE_JM_MAX_NR_SLOTS];
 	int js;
 
-	dev_dbg(kbdev->dev, "%s kbdev %p mask 0x%x\n",
+	dev_dbg(kbdev->dev, "%s kbdev %pK mask 0x%x\n",
 		__func__, (void *)kbdev, (unsigned int)js_mask);
 
 	js_devdata = &kbdev->js_data;
@@ -3403,7 +3442,7 @@ void kbase_js_sched(struct kbase_device *kbdev, int js_mask)
 				context_idle = true;
 
 				dev_dbg(kbdev->dev,
-					"kctx %p is not active (s:%d)\n",
+					"kctx %pK is not active (s:%d)\n",
 					(void *)kctx, js);
 
 				if (kbase_pm_context_active_handle_suspend(
@@ -3412,7 +3451,8 @@ void kbase_js_sched(struct kbase_device *kbdev, int js_mask)
 					dev_dbg(kbdev->dev,
 						"Suspend pending (s:%d)\n", js);
 					/* Suspend pending - return context to
-					 * queue and stop scheduling */
+					 * queue and stop scheduling
+					 */
 					mutex_lock(
 					&kctx->jctx.sched_info.ctx.jsctx_mutex);
 					if (kbase_js_ctx_list_add_pullable_head(
@@ -3432,7 +3472,7 @@ void kbase_js_sched(struct kbase_device *kbdev, int js_mask)
 					&kctx->jctx.sched_info.ctx.jsctx_mutex);
 
 				dev_dbg(kbdev->dev,
-					"kctx %p cannot be used at this time\n",
+					"kctx %pK cannot be used at this time\n",
 					kctx);
 
 				spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
@@ -3474,7 +3514,7 @@ void kbase_js_sched(struct kbase_device *kbdev, int js_mask)
 				bool pullable;
 
 				dev_dbg(kbdev->dev,
-					"No atoms pulled from kctx %p (s:%d)\n",
+					"No atoms pulled from kctx %pK (s:%d)\n",
 					(void *)kctx, js);
 
 				pullable = kbase_js_ctx_pullable(kctx, js,
@@ -3483,7 +3523,8 @@ void kbase_js_sched(struct kbase_device *kbdev, int js_mask)
 				/* Failed to pull jobs - push to head of list.
 				 * Unless this context is already 'active', in
 				 * which case it's effectively already scheduled
-				 * so push it to the back of the list. */
+				 * so push it to the back of the list.
+				 */
 				if (pullable && kctx == last_active[js] &&
 						kbase_ctx_flag(kctx,
 						(KCTX_PULLED_SINCE_ACTIVE_JS0 <<
@@ -3508,7 +3549,8 @@ void kbase_js_sched(struct kbase_device *kbdev, int js_mask)
 				 * slot, then we need to remove the active
 				 * marker to prevent it from submitting atoms in
 				 * the IRQ handler, which would prevent this
-				 * context from making progress. */
+				 * context from making progress.
+				 */
 				if (last_active[js] && kctx != last_active[js]
 						&& kbase_js_ctx_pullable(
 						last_active[js], js, true))
@@ -3534,7 +3576,7 @@ void kbase_js_sched(struct kbase_device *kbdev, int js_mask)
 				break; /* Could not run atoms on this slot */
 			}
 
-			dev_dbg(kbdev->dev, "Push kctx %p to back of list\n",
+			dev_dbg(kbdev->dev, "Push kctx %pK to back of list\n",
 				(void *)kctx);
 			if (kbase_js_ctx_pullable(kctx, js, true))
 				timer_sync |=
@@ -3556,7 +3598,7 @@ void kbase_js_sched(struct kbase_device *kbdev, int js_mask)
 	for (js = 0; js < BASE_JM_MAX_NR_SLOTS; js++) {
 		if (kbdev->hwaccess.active_kctx[js] == last_active[js] &&
 				ctx_waiting[js]) {
-			dev_dbg(kbdev->dev, "Marking kctx %p as inactive (s:%d)\n",
+			dev_dbg(kbdev->dev, "Marking kctx %pK as inactive (s:%d)\n",
 					(void *)last_active[js], js);
 			kbdev->hwaccess.active_kctx[js] = NULL;
 		}
@@ -3580,13 +3622,14 @@ void kbase_js_zap_context(struct kbase_context *kctx)
 
 	/* First, atomically do the following:
 	 * - mark the context as dying
-	 * - try to evict it from the queue */
+	 * - try to evict it from the queue
+	 */
 	mutex_lock(&kctx->jctx.lock);
 	mutex_lock(&js_devdata->queue_mutex);
 	mutex_lock(&js_kctx_info->ctx.jsctx_mutex);
 	kbase_ctx_flag_set(kctx, KCTX_DYING);
 
-	dev_dbg(kbdev->dev, "Zap: Try Evict Ctx %p", kctx);
+	dev_dbg(kbdev->dev, "Zap: Try Evict Ctx %pK", kctx);
 
 	/*
 	 * At this point we know:
@@ -3650,13 +3693,14 @@ void kbase_js_zap_context(struct kbase_context *kctx)
 
 		KBASE_KTRACE_ADD_JM(kbdev, JM_ZAP_NON_SCHEDULED, kctx, NULL, 0u, kbase_ctx_flag(kctx, KCTX_SCHEDULED));
 
-		dev_dbg(kbdev->dev, "Zap: Ctx %p scheduled=0", kctx);
+		dev_dbg(kbdev->dev, "Zap: Ctx %pK scheduled=0", kctx);
 
 		/* Only cancel jobs when we evicted from the
 		 * queue. No Power Manager active reference was held.
 		 *
-		 * Having is_dying set ensures that this kills, and
-		 * doesn't requeue */
+		 * Having is_dying set ensures that this kills, and doesn't
+		 * requeue
+		 */
 		kbasep_js_runpool_requeue_or_kill_ctx(kbdev, kctx, false);
 
 		mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
@@ -3667,9 +3711,10 @@ void kbase_js_zap_context(struct kbase_context *kctx)
 		bool was_retained;
 
 		/* Case c: didn't evict, but it is scheduled - it's in the Run
-		 * Pool */
+		 * Pool
+		 */
 		KBASE_KTRACE_ADD_JM(kbdev, JM_ZAP_SCHEDULED, kctx, NULL, 0u, kbase_ctx_flag(kctx, KCTX_SCHEDULED));
-		dev_dbg(kbdev->dev, "Zap: Ctx %p is in RunPool", kctx);
+		dev_dbg(kbdev->dev, "Zap: Ctx %pK is in RunPool", kctx);
 
 		/* Disable the ctx from submitting any more jobs */
 		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
@@ -3678,18 +3723,21 @@ void kbase_js_zap_context(struct kbase_context *kctx)
 
 		/* Retain and (later) release the context whilst it is is now
 		 * disallowed from submitting jobs - ensures that someone
-		 * somewhere will be removing the context later on */
+		 * somewhere will be removing the context later on
+		 */
 		was_retained = kbase_ctx_sched_inc_refcount_nolock(kctx);
 
 		/* Since it's scheduled and we have the jsctx_mutex, it must be
-		 * retained successfully */
+		 * retained successfully
+		 */
 		KBASE_DEBUG_ASSERT(was_retained);
 
-		dev_dbg(kbdev->dev, "Zap: Ctx %p Kill Any Running jobs", kctx);
+		dev_dbg(kbdev->dev, "Zap: Ctx %pK Kill Any Running jobs", kctx);
 
 		/* Cancel any remaining running jobs for this kctx - if any.
 		 * Submit is disallowed which takes effect immediately, so no
-		 * more new jobs will appear after we do this. */
+		 * more new jobs will appear after we do this.
+		 */
 		kbase_backend_jm_kill_running_jobs_from_kctx(kctx);
 
 		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
@@ -3697,7 +3745,7 @@ void kbase_js_zap_context(struct kbase_context *kctx)
 		mutex_unlock(&js_devdata->queue_mutex);
 		mutex_unlock(&kctx->jctx.lock);
 
-		dev_dbg(kbdev->dev, "Zap: Ctx %p Release (may or may not schedule out immediately)",
+		dev_dbg(kbdev->dev, "Zap: Ctx %pK Release (may or may not schedule out immediately)",
 									kctx);
 
 		kbasep_js_runpool_release_ctx(kbdev, kctx);
@@ -3711,7 +3759,8 @@ void kbase_js_zap_context(struct kbase_context *kctx)
 	 * to be destroyed, and the context to be de-scheduled (if it was on the
 	 * runpool).
 	 *
-	 * kbase_jd_zap_context() will do this. */
+	 * kbase_jd_zap_context() will do this.
+	 */
 }
 
 static inline int trace_get_refcnt(struct kbase_device *kbdev,
@@ -3758,3 +3807,18 @@ static void kbase_js_foreach_ctx_job(struct kbase_context *kctx,
 
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 }
+
+base_jd_prio kbase_js_priority_check(struct kbase_device *kbdev, base_jd_prio priority)
+{
+	struct priority_control_manager_device *pcm_device = kbdev->pcm_dev;
+	int req_priority, out_priority;
+	base_jd_prio out_jd_priority = priority;
+
+	if (pcm_device)	{
+		req_priority = kbasep_js_atom_prio_to_sched_prio(priority);
+		out_priority = pcm_device->ops.pcm_scheduler_priority_check(pcm_device, current, req_priority);
+		out_jd_priority = kbasep_js_sched_prio_to_atom_prio(out_priority);
+	}
+	return out_jd_priority;
+}
+
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_js.h b/drivers/gpu/arm/bifrost/mali_kbase_js.h
index 541acd4afed7..a4dc2079f339 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_js.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_js.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2011-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,15 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /**
- * @file mali_kbase_js.h
- * Job Scheduler APIs.
+ * DOC: Job Scheduler APIs.
  */
 
 #ifndef _KBASE_JS_H_
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_js_ctx_attr.c b/drivers/gpu/arm/bifrost/mali_kbase_js_ctx_attr.c
index 141d04a385cb..40967cb18597 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_js_ctx_attr.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_js_ctx_attr.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2012-2016, 2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2016, 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,11 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
 #include <mali_kbase.h>
 #include <mali_kbase_config.h>
 
@@ -29,8 +27,11 @@
  */
 
 /**
- * @brief Check whether a ctx has a certain attribute, and if so, retain that
+ * Check whether a ctx has a certain attribute, and if so, retain that
  * attribute on the runpool.
+ * @kbdev: Device pointer
+ * @kctx:  KBase context
+ * @attribute: Atribute to check/retain
  *
  * Requires:
  * - jsctx mutex
@@ -75,8 +76,11 @@ static bool kbasep_js_ctx_attr_runpool_retain_attr(struct kbase_device *kbdev, s
 }
 
 /**
- * @brief Check whether a ctx has a certain attribute, and if so, release that
+ * Check whether a ctx has a certain attribute, and if so, release that
  * attribute on the runpool.
+ * @kbdev: Device pointer
+ * @kctx:  KBase context
+ * @attribute: Atribute to release
  *
  * Requires:
  * - jsctx mutex
@@ -120,8 +124,11 @@ static bool kbasep_js_ctx_attr_runpool_release_attr(struct kbase_device *kbdev,
 }
 
 /**
- * @brief Retain a certain attribute on a ctx, also retaining it on the runpool
+ * Retain a certain attribute on a ctx, also retaining it on the runpool
  * if the context is scheduled.
+ * @kbdev: Device pointer
+ * @kctx:  KBase context
+ * @attribute: Atribute to retain
  *
  * Requires:
  * - jsctx mutex
@@ -156,9 +163,12 @@ static bool kbasep_js_ctx_attr_ctx_retain_attr(struct kbase_device *kbdev, struc
 	return runpool_state_changed;
 }
 
-/*
- * @brief Release a certain attribute on a ctx, also releasing it from the runpool
+/**
+ * Release a certain attribute on a ctx, also releasing it from the runpool
  * if the context is scheduled.
+ * @kbdev: Device pointer
+ * @kctx:  KBase context
+ * @attribute: Atribute to release
  *
  * Requires:
  * - jsctx mutex
@@ -211,7 +221,8 @@ void kbasep_js_ctx_attr_runpool_retain_ctx(struct kbase_device *kbdev, struct kb
 
 			/* We don't need to know about state changed, because retaining a
 			 * context occurs on scheduling it, and that itself will also try
-			 * to run new atoms */
+			 * to run new atoms
+			 */
 			CSTD_UNUSED(runpool_state_changed);
 		}
 	}
@@ -251,9 +262,9 @@ void kbasep_js_ctx_attr_ctx_retain_atom(struct kbase_device *kbdev, struct kbase
 		runpool_state_changed |= kbasep_js_ctx_attr_ctx_retain_attr(kbdev, kctx, KBASEP_JS_CTX_ATTR_COMPUTE_ALL_CORES);
 	}
 
-	/* We don't need to know about state changed, because retaining an
-	 * atom occurs on adding it, and that itself will also try to run
-	 * new atoms */
+	/* We don't need to know about state changed, because retaining an atom
+	 * occurs on adding it, and that itself will also try to run new atoms
+	 */
 	CSTD_UNUSED(runpool_state_changed);
 }
 
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_js_ctx_attr.h b/drivers/gpu/arm/bifrost/mali_kbase_js_ctx_attr.h
index 25fd39787c71..1477b1d55659 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_js_ctx_attr.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_js_ctx_attr.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2012-2015, 2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2015, 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,37 +17,19 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /**
- * @file mali_kbase_js_ctx_attr.h
- * Job Scheduler Context Attribute APIs
+ * DOC: Job Scheduler Context Attribute APIs
  */
 
 #ifndef _KBASE_JS_CTX_ATTR_H_
 #define _KBASE_JS_CTX_ATTR_H_
 
-/**
- * @addtogroup base_api
- * @{
- */
-
-/**
- * @addtogroup base_kbase_api
- * @{
- */
-
-/**
- * @addtogroup kbase_js
- * @{
- */
-
 /**
  * Retain all attributes of a context
+ * @kbdev: KBase device
+ * @kctx:  KBase context
  *
  * This occurs on scheduling in the context on the runpool (but after
  * is_scheduled is set)
@@ -60,6 +43,8 @@ void kbasep_js_ctx_attr_runpool_retain_ctx(struct kbase_device *kbdev, struct kb
 
 /**
  * Release all attributes of a context
+ * @kbdev: KBase device
+ * @kctx:  KBase context
  *
  * This occurs on scheduling out the context from the runpool (but before
  * is_scheduled is cleared)
@@ -79,6 +64,9 @@ bool kbasep_js_ctx_attr_runpool_release_ctx(struct kbase_device *kbdev, struct k
 
 /**
  * Retain all attributes of an atom
+ * @kbdev: KBase device
+ * @kctx:  KBase context
+ * @katom: Atom
  *
  * This occurs on adding an atom to a context
  *
@@ -90,6 +78,9 @@ void kbasep_js_ctx_attr_ctx_retain_atom(struct kbase_device *kbdev, struct kbase
 
 /**
  * Release all attributes of an atom, given its retained state.
+ * @kbdev: KBase device
+ * @kctx:  KBase context
+ * @katom_retained_state: Retained state
  *
  * This occurs after (permanently) removing an atom from a context
  *
@@ -107,7 +98,7 @@ void kbasep_js_ctx_attr_ctx_retain_atom(struct kbase_device *kbdev, struct kbase
  */
 bool kbasep_js_ctx_attr_ctx_release_atom(struct kbase_device *kbdev, struct kbase_context *kctx, struct kbasep_js_atom_retained_state *katom_retained_state);
 
-/**
+/*
  * Requires:
  * - runpool_irq spinlock
  */
@@ -122,7 +113,7 @@ static inline s8 kbasep_js_ctx_attr_count_on_runpool(struct kbase_device *kbdev,
 	return js_devdata->runpool_irq.ctx_attr_ref_count[attribute];
 }
 
-/**
+/*
  * Requires:
  * - runpool_irq spinlock
  */
@@ -132,7 +123,7 @@ static inline bool kbasep_js_ctx_attr_is_attr_on_runpool(struct kbase_device *kb
 	return (bool) kbasep_js_ctx_attr_count_on_runpool(kbdev, attribute);
 }
 
-/**
+/*
  * Requires:
  * - jsctx mutex
  */
@@ -148,8 +139,4 @@ static inline bool kbasep_js_ctx_attr_is_attr_on_ctx(struct kbase_context *kctx,
 	return (bool) (js_kctx_info->ctx.ctx_attr_ref_count[attribute]);
 }
 
-	  /** @} *//* end group kbase_js */
-	  /** @} *//* end group base_kbase_api */
-	  /** @} *//* end group base_api */
-
 #endif				/* _KBASE_JS_DEFS_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_kinstr_jm.c b/drivers/gpu/arm/bifrost/mali_kbase_kinstr_jm.c
index 8457d6cf9ede..dfd02f493c2b 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_kinstr_jm.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_kinstr_jm.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -26,7 +25,7 @@
  */
 
 #include "mali_kbase_kinstr_jm.h"
-#include "mali_kbase_kinstr_jm_reader.h"
+#include <uapi/gpu/arm/bifrost/mali_kbase_kinstr_jm_reader.h>
 
 #include "mali_kbase.h"
 #include "mali_kbase_linux.h"
@@ -38,6 +37,7 @@
 #include <linux/circ_buf.h>
 #include <linux/fs.h>
 #include <linux/kref.h>
+#include <linux/ktime.h>
 #include <linux/log2.h>
 #include <linux/mutex.h>
 #include <linux/rculist_bl.h>
@@ -69,15 +69,9 @@ typedef unsigned int __poll_t;
 /* Allows us to perform ASM goto for the tracing
  * https://www.kernel.org/doc/Documentation/static-keys.txt
  */
-#if KERNEL_VERSION(4, 3, 0) <= LINUX_VERSION_CODE
 DEFINE_STATIC_KEY_FALSE(basep_kinstr_jm_reader_static_key);
-#else
-struct static_key basep_kinstr_jm_reader_static_key = STATIC_KEY_INIT_FALSE;
-#define static_branch_inc(key) static_key_slow_inc(key)
-#define static_branch_dec(key) static_key_slow_dec(key)
-#endif /* KERNEL_VERSION(4 ,3, 0) <= LINUX_VERSION_CODE */
 
-#define KBASE_KINSTR_JM_VERSION 1
+#define KBASE_KINSTR_JM_VERSION 2
 
 /**
  * struct kbase_kinstr_jm - The context for the kernel job manager atom tracing
@@ -105,6 +99,11 @@ struct kbase_kinstr_jm {
  *             KBASE_KINSTR_JM_ATOM_STATE_FLAG_* defines.
  * @reserved:  Reserved for future use.
  * @data:      Extra data for the state change. Active member depends on state.
+ * @data.start:      Extra data for the state change. Active member depends on
+ *                   state.
+ * @data.start.slot: Extra data for the state change. Active member depends on
+ *                   state.
+ * @data.padding:    Padding
  *
  * We can add new fields to the structure and old user code will gracefully
  * ignore the new fields.
@@ -847,7 +846,7 @@ void kbasep_kinstr_jm_atom_state(
 
 	switch (state) {
 	case KBASE_KINSTR_JM_READER_ATOM_STATE_START:
-		change.data.start.slot = katom->jobslot;
+		change.data.start.slot = katom->slot_nr;
 		break;
 	default:
 		break;
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_kinstr_jm.h b/drivers/gpu/arm/bifrost/mali_kbase_kinstr_jm.h
index 555edfeef77c..e2588d704126 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_kinstr_jm.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_kinstr_jm.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2019,2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -64,7 +63,7 @@
 #ifndef _KBASE_KINSTR_JM_H_
 #define _KBASE_KINSTR_JM_H_
 
-#include "mali_kbase_kinstr_jm_reader.h"
+#include <uapi/gpu/arm/bifrost/mali_kbase_kinstr_jm_reader.h>
 
 #ifdef __KERNEL__
 #include <linux/version.h>
@@ -127,14 +126,7 @@ void kbasep_kinstr_jm_atom_state(
  * shouldn't be changed externally, but if you do, make sure you use
  * a static_key_inc()/static_key_dec() pair.
  */
-#if KERNEL_VERSION(4, 3, 0) <= LINUX_VERSION_CODE
 extern struct static_key_false basep_kinstr_jm_reader_static_key;
-#else
-/* Pre-4.3 kernels have a different API for static keys, but work
- * mostly the same with less type safety. */
-extern struct static_key basep_kinstr_jm_reader_static_key;
-#define static_branch_unlikely(key) static_key_false(key)
-#endif /* KERNEL_VERSION(4, 3, 0) <= LINUX_VERSION_CODE */
 
 /**
  * kbase_kinstr_jm_atom_state() - Signifies that an atom has changed state
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_linux.h b/drivers/gpu/arm/bifrost/mali_kbase_linux.h
index 003ac9e68a76..ff29337d70db 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_linux.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_linux.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2010-2014 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2014, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,15 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /**
- * @file mali_kbase_linux.h
- * Base kernel APIs, Linux implementation.
+ * DOC: Base kernel APIs, Linux implementation.
  */
 
 #ifndef _KBASE_LINUX_H_
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem.c b/drivers/gpu/arm/bifrost/mali_kbase_mem.c
index ce52f6a78fcd..8cc3dd3bc533 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
@@ -99,27 +98,34 @@ static size_t kbase_get_num_cpu_va_bits(struct kbase_context *kctx)
 }
 
 /* This function finds out which RB tree the given pfn from the GPU VA belongs
- * to based on the memory zone the pfn refers to */
+ * to based on the memory zone the pfn refers to
+ */
 static struct rb_root *kbase_gpu_va_to_rbtree(struct kbase_context *kctx,
 								    u64 gpu_pfn)
 {
 	struct rb_root *rbtree = NULL;
+	struct kbase_reg_zone *exec_va_zone =
+		kbase_ctx_reg_zone_get(kctx, KBASE_REG_ZONE_EXEC_VA);
 
 	/* The gpu_pfn can only be greater than the starting pfn of the EXEC_VA
 	 * zone if this has been initialized.
 	 */
-	if (gpu_pfn >= kctx->exec_va_start)
+	if (gpu_pfn >= exec_va_zone->base_pfn)
 		rbtree = &kctx->reg_rbtree_exec;
 	else {
 		u64 same_va_end;
 
 #ifdef CONFIG_64BIT
-		if (kbase_ctx_flag(kctx, KCTX_COMPAT))
+		if (kbase_ctx_flag(kctx, KCTX_COMPAT)) {
 #endif /* CONFIG_64BIT */
 			same_va_end = KBASE_REG_ZONE_CUSTOM_VA_BASE;
 #ifdef CONFIG_64BIT
-		else
-			same_va_end = kctx->same_va_end;
+		} else {
+			struct kbase_reg_zone *same_va_zone =
+				kbase_ctx_reg_zone_get(kctx,
+						       KBASE_REG_ZONE_SAME_VA);
+			same_va_end = kbase_reg_zone_end_pfn(same_va_zone);
+		}
 #endif /* CONFIG_64BIT */
 
 		if (gpu_pfn >= same_va_end)
@@ -229,7 +235,7 @@ struct kbase_va_region *kbase_region_tracker_find_region_enclosing_address(
 	u64 gpu_pfn = gpu_addr >> PAGE_SHIFT;
 	struct rb_root *rbtree = NULL;
 
-	KBASE_DEBUG_ASSERT(NULL != kctx);
+	KBASE_DEBUG_ASSERT(kctx != NULL);
 
 	lockdep_assert_held(&kctx->reg_lock);
 
@@ -289,7 +295,8 @@ static struct kbase_va_region *kbase_region_tracker_find_region_meeting_reqs(
 	struct rb_root *rbtree = NULL;
 
 	/* Note that this search is a linear search, as we do not have a target
-	   address in mind, so does not benefit from the rbtree search */
+	 * address in mind, so does not benefit from the rbtree search
+	 */
 	rbtree = reg_reqs->rbtree;
 
 	for (rbnode = rb_first(rbtree); rbnode; rbnode = rb_next(rbnode)) {
@@ -304,7 +311,8 @@ static struct kbase_va_region *kbase_region_tracker_find_region_meeting_reqs(
 			 *   (start_pfn + align_mask) & ~(align_mask)
 			 *
 			 * Otherwise, it aligns to n*align + offset, for the
-			 * lowest value n that makes this still >start_pfn */
+			 * lowest value n that makes this still >start_pfn
+			 */
 			start_pfn += align_mask;
 			start_pfn -= (start_pfn - align_offset) & (align_mask);
 
@@ -342,7 +350,8 @@ static struct kbase_va_region *kbase_region_tracker_find_region_meeting_reqs(
 }
 
 /**
- * @brief Remove a region object from the global list.
+ * Remove a region object from the global list.
+ * @reg: Region object to remove
  *
  * The region reg is removed, possibly by merging with other free and
  * compatible adjacent regions.  It must be called with the context
@@ -368,8 +377,9 @@ int kbase_remove_va_region(struct kbase_va_region *reg)
 	if (rbprev) {
 		prev = rb_entry(rbprev, struct kbase_va_region, rblink);
 		if (prev->flags & KBASE_REG_FREE) {
-			/* We're compatible with the previous VMA,
-			 * merge with it */
+			/* We're compatible with the previous VMA, merge with
+			 * it
+			 */
 			WARN_ON((prev->flags & KBASE_REG_ZONE_MASK) !=
 					    (reg->flags & KBASE_REG_ZONE_MASK));
 			prev->nr_pages += reg->nr_pages;
@@ -512,8 +522,8 @@ int kbase_add_va_region(struct kbase_context *kctx,
 	int gpu_pc_bits =
 		kbdev->gpu_props.props.core_props.log2_program_counter_size;
 
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-	KBASE_DEBUG_ASSERT(NULL != reg);
+	KBASE_DEBUG_ASSERT(kctx != NULL);
+	KBASE_DEBUG_ASSERT(reg != NULL);
 
 	lockdep_assert_held(&kctx->reg_lock);
 
@@ -620,8 +630,8 @@ int kbase_add_va_region_rbtree(struct kbase_device *kbdev,
 			WARN(align > 1, "%s with align %lx might not be honored for KBASE_REG_TILER_ALIGN_TOP memory",
 					__func__,
 					(unsigned long)align);
-			align_mask  = reg->extent - 1;
-			align_offset = reg->extent - reg->initial_commit;
+			align_mask = reg->extension - 1;
+			align_offset = reg->extension - reg->initial_commit;
 		}
 #endif /* !MALI_USE_CSF */
 
@@ -646,7 +656,7 @@ int kbase_add_va_region_rbtree(struct kbase_device *kbdev,
 	return err;
 }
 
-/**
+/*
  * @brief Initialize the internal region tracker data structure.
  */
 static void kbase_region_tracker_ds_init(struct kbase_context *kctx,
@@ -726,21 +736,24 @@ int kbase_region_tracker_init(struct kbase_context *kctx)
 	u64 custom_va_size = KBASE_REG_ZONE_CUSTOM_VA_SIZE;
 	u64 gpu_va_limit = (1ULL << kctx->kbdev->gpu_props.mmu.va_bits) >> PAGE_SHIFT;
 	u64 same_va_pages;
+	u64 same_va_base = 1u;
 	int err;
 
 	/* Take the lock as kbase_free_alloced_region requires it */
 	kbase_gpu_vm_lock(kctx);
 
-	same_va_pages = (1ULL << (same_va_bits - PAGE_SHIFT)) - 1;
+	same_va_pages = (1ULL << (same_va_bits - PAGE_SHIFT)) - same_va_base;
 	/* all have SAME_VA */
-	same_va_reg = kbase_alloc_free_region(&kctx->reg_rbtree_same, 1,
-			same_va_pages,
-			KBASE_REG_ZONE_SAME_VA);
+	same_va_reg =
+		kbase_alloc_free_region(&kctx->reg_rbtree_same, same_va_base,
+					same_va_pages, KBASE_REG_ZONE_SAME_VA);
 
 	if (!same_va_reg) {
 		err = -ENOMEM;
 		goto fail_unlock;
 	}
+	kbase_ctx_reg_zone_init(kctx, KBASE_REG_ZONE_SAME_VA, same_va_base,
+				same_va_pages);
 
 #ifdef CONFIG_64BIT
 	/* 32-bit clients have custom VA zones */
@@ -766,17 +779,23 @@ int kbase_region_tracker_init(struct kbase_context *kctx)
 			err = -ENOMEM;
 			goto fail_free_same_va;
 		}
+		kbase_ctx_reg_zone_init(kctx, KBASE_REG_ZONE_CUSTOM_VA,
+					KBASE_REG_ZONE_CUSTOM_VA_BASE,
+					custom_va_size);
 #ifdef CONFIG_64BIT
 	} else {
 		custom_va_size = 0;
 	}
 #endif
+	/* EXEC_VA zone's codepaths are slightly easier when its base_pfn is
+	 * initially U64_MAX
+	 */
+	kbase_ctx_reg_zone_init(kctx, KBASE_REG_ZONE_EXEC_VA, U64_MAX, 0u);
+	/* Other zones are 0: kbase_create_context() uses vzalloc */
 
 	kbase_region_tracker_ds_init(kctx, same_va_reg, custom_va_reg);
 
-	kctx->same_va_end = same_va_pages + 1;
-	kctx->gpu_va_end = kctx->same_va_end + custom_va_size;
-	kctx->exec_va_start = U64_MAX;
+	kctx->gpu_va_end = same_va_base + same_va_pages + custom_va_size;
 	kctx->jit_va = false;
 
 #if MALI_USE_CSF
@@ -793,44 +812,147 @@ int kbase_region_tracker_init(struct kbase_context *kctx)
 	return err;
 }
 
+static bool kbase_has_exec_va_zone_locked(struct kbase_context *kctx)
+{
+	struct kbase_reg_zone *exec_va_zone;
+
+	lockdep_assert_held(&kctx->reg_lock);
+	exec_va_zone = kbase_ctx_reg_zone_get(kctx, KBASE_REG_ZONE_EXEC_VA);
+
+	return (exec_va_zone->base_pfn != U64_MAX);
+}
+
+bool kbase_has_exec_va_zone(struct kbase_context *kctx)
+{
+	bool has_exec_va_zone;
+
+	kbase_gpu_vm_lock(kctx);
+	has_exec_va_zone = kbase_has_exec_va_zone_locked(kctx);
+	kbase_gpu_vm_unlock(kctx);
+
+	return has_exec_va_zone;
+}
+
+/**
+ * Determine if any allocations have been made on a context's region tracker
+ * @kctx: KBase context
+ *
+ * Check the context to determine if any allocations have been made yet from
+ * any of its zones. This check should be done before resizing a zone, e.g. to
+ * make space to add a second zone.
+ *
+ * Whilst a zone without allocations can be resized whilst other zones have
+ * allocations, we still check all of @kctx 's zones anyway: this is a stronger
+ * guarantee and should be adhered to when creating new zones anyway.
+ *
+ * Allocations from kbdev zones are not counted.
+ *
+ * Return: true if any allocs exist on any zone, false otherwise
+ */
+static bool kbase_region_tracker_has_allocs(struct kbase_context *kctx)
+{
+	unsigned int zone_idx;
+
+	lockdep_assert_held(&kctx->reg_lock);
+
+	for (zone_idx = 0; zone_idx < KBASE_REG_ZONE_MAX; ++zone_idx) {
+		struct kbase_reg_zone *zone;
+		struct kbase_va_region *reg;
+		u64 zone_base_addr;
+		unsigned long zone_bits = KBASE_REG_ZONE(zone_idx);
+		unsigned long reg_zone;
+
+		zone = kbase_ctx_reg_zone_get(kctx, zone_bits);
+		zone_base_addr = zone->base_pfn << PAGE_SHIFT;
+
+		reg = kbase_region_tracker_find_region_base_address(
+			kctx, zone_base_addr);
+
+		if (!zone->va_size_pages) {
+			WARN(reg,
+			     "Should not have found a region that starts at 0x%.16llx for zone 0x%lx",
+			     (unsigned long long)zone_base_addr, zone_bits);
+			continue;
+		}
+
+		if (WARN(!reg,
+			 "There should always be a region that starts at 0x%.16llx for zone 0x%lx, couldn't find it",
+			 (unsigned long long)zone_base_addr, zone_bits))
+			return true; /* Safest return value */
+
+		reg_zone = reg->flags & KBASE_REG_ZONE_MASK;
+		if (WARN(reg_zone != zone_bits,
+			 "The region that starts at 0x%.16llx should be in zone 0x%lx but was found in the wrong zone 0x%lx",
+			 (unsigned long long)zone_base_addr, zone_bits,
+			 reg_zone))
+			return true; /* Safest return value */
+
+		/* Unless the region is completely free, of the same size as
+		 * the original zone, then it has allocs
+		 */
+		if ((!(reg->flags & KBASE_REG_FREE)) ||
+		    (reg->nr_pages != zone->va_size_pages))
+			return true;
+	}
+
+	/* All zones are the same size as originally made, so there are no
+	 * allocs
+	 */
+	return false;
+}
+
 #ifdef CONFIG_64BIT
 static int kbase_region_tracker_init_jit_64(struct kbase_context *kctx,
 		u64 jit_va_pages)
 {
-	struct kbase_va_region *same_va;
+	struct kbase_va_region *same_va_reg;
+	struct kbase_reg_zone *same_va_zone;
+	u64 same_va_zone_base_addr;
+	const unsigned long same_va_zone_bits = KBASE_REG_ZONE_SAME_VA;
 	struct kbase_va_region *custom_va_reg;
+	u64 jit_va_start;
 
 	lockdep_assert_held(&kctx->reg_lock);
 
-	/* First verify that a JIT_VA zone has not been created already. */
-	if (kctx->jit_va)
-		return -EINVAL;
-
 	/*
-	 * Modify the same VA free region after creation. Be careful to ensure
-	 * that allocations haven't been made as they could cause an overlap
-	 * to happen with existing same VA allocations and the custom VA zone.
+	 * Modify the same VA free region after creation. The caller has
+	 * ensured that allocations haven't been made, as any allocations could
+	 * cause an overlap to happen with existing same VA allocations and the
+	 * custom VA zone.
 	 */
-	same_va = kbase_region_tracker_find_region_base_address(kctx,
-			PAGE_SIZE);
-	if (!same_va)
+	same_va_zone = kbase_ctx_reg_zone_get(kctx, same_va_zone_bits);
+	same_va_zone_base_addr = same_va_zone->base_pfn << PAGE_SHIFT;
+
+	same_va_reg = kbase_region_tracker_find_region_base_address(
+		kctx, same_va_zone_base_addr);
+	if (WARN(!same_va_reg,
+		 "Already found a free region at the start of every zone, but now cannot find any region for zone base 0x%.16llx zone 0x%lx",
+		 (unsigned long long)same_va_zone_base_addr, same_va_zone_bits))
 		return -ENOMEM;
 
-	if (same_va->nr_pages < jit_va_pages || kctx->same_va_end < jit_va_pages)
+	/* kbase_region_tracker_has_allocs() in the caller has already ensured
+	 * that all of the zones have no allocs, so no need to check that again
+	 * on same_va_reg
+	 */
+	WARN_ON((!(same_va_reg->flags & KBASE_REG_FREE)) ||
+		same_va_reg->nr_pages != same_va_zone->va_size_pages);
+
+	if (same_va_reg->nr_pages < jit_va_pages ||
+	    same_va_zone->va_size_pages < jit_va_pages)
 		return -ENOMEM;
 
 	/* It's safe to adjust the same VA zone now */
-	same_va->nr_pages -= jit_va_pages;
-	kctx->same_va_end -= jit_va_pages;
+	same_va_reg->nr_pages -= jit_va_pages;
+	same_va_zone->va_size_pages -= jit_va_pages;
+	jit_va_start = kbase_reg_zone_end_pfn(same_va_zone);
 
 	/*
 	 * Create a custom VA zone at the end of the VA for allocations which
 	 * JIT can use so it doesn't have to allocate VA from the kernel.
 	 */
-	custom_va_reg = kbase_alloc_free_region(&kctx->reg_rbtree_custom,
-				kctx->same_va_end,
-				jit_va_pages,
-				KBASE_REG_ZONE_CUSTOM_VA);
+	custom_va_reg =
+		kbase_alloc_free_region(&kctx->reg_rbtree_custom, jit_va_start,
+					jit_va_pages, KBASE_REG_ZONE_CUSTOM_VA);
 
 	/*
 	 * The context will be destroyed if we fail here so no point
@@ -838,6 +960,11 @@ static int kbase_region_tracker_init_jit_64(struct kbase_context *kctx,
 	 */
 	if (!custom_va_reg)
 		return -ENOMEM;
+	/* Since this is 64-bit, the custom zone will not have been
+	 * initialized, so initialize it now
+	 */
+	kbase_ctx_reg_zone_init(kctx, KBASE_REG_ZONE_CUSTOM_VA, jit_va_start,
+				jit_va_pages);
 
 	kbase_region_tracker_insert(custom_va_reg);
 	return 0;
@@ -866,6 +993,23 @@ int kbase_region_tracker_init_jit(struct kbase_context *kctx, u64 jit_va_pages,
 
 	kbase_gpu_vm_lock(kctx);
 
+	/* Verify that a JIT_VA zone has not been created already. */
+	if (kctx->jit_va) {
+		err = -EINVAL;
+		goto exit_unlock;
+	}
+
+	/* If in 64-bit, we always lookup the SAME_VA zone. To ensure it has no
+	 * allocs, we can ensure there are no allocs anywhere.
+	 *
+	 * This check is also useful in 32-bit, just to make sure init of the
+	 * zone is always done before any allocs.
+	 */
+	if (kbase_region_tracker_has_allocs(kctx)) {
+		err = -ENOMEM;
+		goto exit_unlock;
+	}
+
 #ifdef CONFIG_64BIT
 	if (!kbase_ctx_flag(kctx, KCTX_COMPAT))
 		err = kbase_region_tracker_init_jit_64(kctx, jit_va_pages);
@@ -887,6 +1031,7 @@ int kbase_region_tracker_init_jit(struct kbase_context *kctx, u64 jit_va_pages,
 #endif /* MALI_JIT_PRESSURE_LIMIT_BASE */
 	}
 
+exit_unlock:
 	kbase_gpu_vm_unlock(kctx);
 
 	return err;
@@ -894,24 +1039,33 @@ int kbase_region_tracker_init_jit(struct kbase_context *kctx, u64 jit_va_pages,
 
 int kbase_region_tracker_init_exec(struct kbase_context *kctx, u64 exec_va_pages)
 {
-	struct kbase_va_region *shrinking_va_reg;
 	struct kbase_va_region *exec_va_reg;
-	u64 exec_va_start, exec_va_base_addr;
+	struct kbase_reg_zone *exec_va_zone;
+	struct kbase_reg_zone *target_zone;
+	struct kbase_va_region *target_reg;
+	u64 target_zone_base_addr;
+	unsigned long target_zone_bits;
+	u64 exec_va_start;
 	int err;
 
-	/* The EXEC_VA zone shall be created by making space at the end of the
-	 * address space. Firstly, verify that the number of EXEC_VA pages
-	 * requested by the client is reasonable and then make sure that it is
-	 * not greater than the address space itself before calculating the base
-	 * address of the new zone.
+	/* The EXEC_VA zone shall be created by making space either:
+	 * - for 64-bit clients, at the end of the process's address space
+	 * - for 32-bit clients, in the CUSTOM zone
+	 *
+	 * Firstly, verify that the number of EXEC_VA pages requested by the
+	 * client is reasonable and then make sure that it is not greater than
+	 * the address space itself before calculating the base address of the
+	 * new zone.
 	 */
 	if (exec_va_pages == 0 || exec_va_pages > KBASE_REG_ZONE_EXEC_VA_MAX_PAGES)
 		return -EINVAL;
 
 	kbase_gpu_vm_lock(kctx);
 
-	/* First verify that a JIT_VA zone has not been created already. */
-	if (kctx->jit_va) {
+	/* Verify that we've not already created a EXEC_VA zone, and that the
+	 * EXEC_VA zone must come before JIT's CUSTOM_VA.
+	 */
+	if (kbase_has_exec_va_zone_locked(kctx) || kctx->jit_va) {
 		err = -EPERM;
 		goto exit_unlock;
 	}
@@ -921,28 +1075,50 @@ int kbase_region_tracker_init_exec(struct kbase_context *kctx, u64 exec_va_pages
 		goto exit_unlock;
 	}
 
-	exec_va_start = kctx->gpu_va_end - exec_va_pages;
-	exec_va_base_addr = exec_va_start << PAGE_SHIFT;
-
-	shrinking_va_reg = kbase_region_tracker_find_region_enclosing_address(kctx,
-			exec_va_base_addr);
-	if (!shrinking_va_reg) {
+	/* Verify no allocations have already been made */
+	if (kbase_region_tracker_has_allocs(kctx)) {
 		err = -ENOMEM;
 		goto exit_unlock;
 	}
 
-	/* Make sure that the EXEC_VA region is still uninitialized */
-	if ((shrinking_va_reg->flags & KBASE_REG_ZONE_MASK) ==
-			KBASE_REG_ZONE_EXEC_VA) {
-		err = -EPERM;
+#ifdef CONFIG_64BIT
+	if (kbase_ctx_flag(kctx, KCTX_COMPAT)) {
+#endif
+		/* 32-bit client: take from CUSTOM_VA zone */
+		target_zone_bits = KBASE_REG_ZONE_CUSTOM_VA;
+#ifdef CONFIG_64BIT
+	} else {
+		/* 64-bit client: take from SAME_VA zone */
+		target_zone_bits = KBASE_REG_ZONE_SAME_VA;
+	}
+#endif
+	target_zone = kbase_ctx_reg_zone_get(kctx, target_zone_bits);
+	target_zone_base_addr = target_zone->base_pfn << PAGE_SHIFT;
+
+	target_reg = kbase_region_tracker_find_region_base_address(
+		kctx, target_zone_base_addr);
+	if (WARN(!target_reg,
+		 "Already found a free region at the start of every zone, but now cannot find any region for zone base 0x%.16llx zone 0x%lx",
+		 (unsigned long long)target_zone_base_addr, target_zone_bits)) {
+		err = -ENOMEM;
 		goto exit_unlock;
 	}
+	/* kbase_region_tracker_has_allocs() above has already ensured that all
+	 * of the zones have no allocs, so no need to check that again on
+	 * target_reg
+	 */
+	WARN_ON((!(target_reg->flags & KBASE_REG_FREE)) ||
+		target_reg->nr_pages != target_zone->va_size_pages);
 
-	if (shrinking_va_reg->nr_pages <= exec_va_pages) {
+	if (target_reg->nr_pages <= exec_va_pages ||
+	    target_zone->va_size_pages <= exec_va_pages) {
 		err = -ENOMEM;
 		goto exit_unlock;
 	}
 
+	/* Taken from the end of the target zone */
+	exec_va_start = kbase_reg_zone_end_pfn(target_zone) - exec_va_pages;
+
 	exec_va_reg = kbase_alloc_free_region(&kctx->reg_rbtree_exec,
 			exec_va_start,
 			exec_va_pages,
@@ -951,13 +1127,17 @@ int kbase_region_tracker_init_exec(struct kbase_context *kctx, u64 exec_va_pages
 		err = -ENOMEM;
 		goto exit_unlock;
 	}
+	/* Update EXEC_VA zone
+	 *
+	 * not using kbase_ctx_reg_zone_init() - it was already initialized
+	 */
+	exec_va_zone = kbase_ctx_reg_zone_get(kctx, KBASE_REG_ZONE_EXEC_VA);
+	exec_va_zone->base_pfn = exec_va_start;
+	exec_va_zone->va_size_pages = exec_va_pages;
 
-	shrinking_va_reg->nr_pages -= exec_va_pages;
-#ifdef CONFIG_64BIT
-	if (!kbase_ctx_flag(kctx, KCTX_COMPAT))
-		kctx->same_va_end -= exec_va_pages;
-#endif
-	kctx->exec_va_start = exec_va_start;
+	/* Update target zone and corresponding region */
+	target_reg->nr_pages -= exec_va_pages;
+	target_zone->va_size_pages -= exec_va_pages;
 
 	kbase_region_tracker_insert(exec_va_reg);
 	err = 0;
@@ -1108,7 +1288,11 @@ void kbase_mem_term(struct kbase_device *kbdev)
 KBASE_EXPORT_TEST_API(kbase_mem_term);
 
 /**
- * @brief Allocate a free region object.
+ * Allocate a free region object.
+ * @rbtree:    Backlink to the red-black tree of memory regions.
+ * @start_pfn: The Page Frame Number in GPU virtual address space.
+ * @nr_pages:  The size of the region in pages.
+ * @zone:      KBASE_REG_ZONE_CUSTOM_VA or KBASE_REG_ZONE_SAME_VA
  *
  * The allocated object is not part of any list yet, and is flagged as
  * KBASE_REG_FREE. No mapping is allocated yet.
@@ -1181,7 +1365,8 @@ static struct kbase_context *kbase_reg_flags_to_kctx(
 }
 
 /**
- * @brief Free a region object.
+ * Free a region object.
+ * @reg: Region
  *
  * The described region must be freed of any mapping.
  *
@@ -1208,7 +1393,7 @@ void kbase_free_alloced_region(struct kbase_va_region *reg)
 		if (WARN_ON(kbase_is_region_invalid(reg)))
 			return;
 
-		dev_dbg(kctx->kbdev->dev, "Freeing memory region %p\n",
+		dev_dbg(kctx->kbdev->dev, "Freeing memory region %pK\n",
 			(void *)reg);
 #if MALI_USE_CSF
 		if (reg->flags & KBASE_REG_CSF_EVENT)
@@ -1293,8 +1478,8 @@ int kbase_gpu_mmap(struct kbase_context *kctx, struct kbase_va_region *reg, u64
 	else
 		attr = KBASE_REG_MEMATTR_INDEX(AS_MEMATTR_INDEX_WRITE_ALLOC);
 
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-	KBASE_DEBUG_ASSERT(NULL != reg);
+	KBASE_DEBUG_ASSERT(kctx != NULL);
+	KBASE_DEBUG_ASSERT(reg != NULL);
 
 	err = kbase_add_va_region(kctx, reg, addr, nr_pages, align);
 	if (err)
@@ -1320,7 +1505,9 @@ int kbase_gpu_mmap(struct kbase_context *kctx, struct kbase_va_region *reg, u64
 				if (err)
 					goto bad_insert;
 
-				kbase_mem_phy_alloc_gpu_mapped(alloc->imported.alias.aliased[i].alloc);
+				/* Note: mapping count is tracked at alias
+				 * creation time
+				 */
 			} else {
 				err = kbase_mmu_insert_single_page(kctx,
 					reg->start_pfn + i * stride,
@@ -1379,13 +1566,6 @@ int kbase_gpu_mmap(struct kbase_context *kctx, struct kbase_va_region *reg, u64
 				 reg->start_pfn, reg->nr_pages,
 				 kctx->as_nr);
 
-	if (alloc->type == KBASE_MEM_TYPE_ALIAS) {
-		KBASE_DEBUG_ASSERT(alloc->imported.alias.aliased);
-		while (i--)
-			if (alloc->imported.alias.aliased[i].alloc)
-				kbase_mem_phy_alloc_gpu_unmapped(alloc->imported.alias.aliased[i].alloc);
-	}
-
 	kbase_remove_va_region(reg);
 
 	return err;
@@ -1399,7 +1579,6 @@ static void kbase_jd_user_buf_unmap(struct kbase_context *kctx,
 int kbase_gpu_munmap(struct kbase_context *kctx, struct kbase_va_region *reg)
 {
 	int err = 0;
-	size_t i;
 
 	if (reg->start_pfn == 0)
 		return 0;
@@ -1424,10 +1603,9 @@ int kbase_gpu_munmap(struct kbase_context *kctx, struct kbase_va_region *reg)
 	/* Update tracking, and other cleanup, depending on memory type. */
 	switch (reg->gpu_alloc->type) {
 	case KBASE_MEM_TYPE_ALIAS:
-		KBASE_DEBUG_ASSERT(reg->gpu_alloc->imported.alias.aliased);
-		for (i = 0; i < reg->gpu_alloc->imported.alias.nents; i++)
-			if (reg->gpu_alloc->imported.alias.aliased[i].alloc)
-				kbase_mem_phy_alloc_gpu_unmapped(reg->gpu_alloc->imported.alias.aliased[i].alloc);
+		/* We mark the source allocs as unmapped from the GPU when
+		 * putting reg's allocs
+		 */
 		break;
 	case KBASE_MEM_TYPE_IMPORTED_USER_BUF: {
 			struct kbase_alloc_import_user_buf *user_buf =
@@ -1736,9 +1914,9 @@ int kbase_mem_free_region(struct kbase_context *kctx, struct kbase_va_region *re
 {
 	int err;
 
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-	KBASE_DEBUG_ASSERT(NULL != reg);
-	dev_dbg(kctx->kbdev->dev, "%s %p in kctx %p\n",
+	KBASE_DEBUG_ASSERT(kctx != NULL);
+	KBASE_DEBUG_ASSERT(reg != NULL);
+	dev_dbg(kctx->kbdev->dev, "%s %pK in kctx %pK\n",
 		__func__, (void *)reg, (void *)kctx);
 	lockdep_assert_held(&kctx->reg_lock);
 
@@ -1784,7 +1962,9 @@ int kbase_mem_free_region(struct kbase_context *kctx, struct kbase_va_region *re
 KBASE_EXPORT_TEST_API(kbase_mem_free_region);
 
 /**
- * @brief Free the region from the GPU and unregister it.
+ * Free the region from the GPU and unregister it.
+ * @kctx:  KBase context
+ * @gpu_addr: GPU address to free
  *
  * This function implements the free operation on a memory segment.
  * It will loudly fail if called with outstanding mappings.
@@ -1795,7 +1975,7 @@ int kbase_mem_free(struct kbase_context *kctx, u64 gpu_addr)
 	struct kbase_va_region *reg;
 
 	KBASE_DEBUG_ASSERT(kctx != NULL);
-	dev_dbg(kctx->kbdev->dev, "%s 0x%llx in kctx %p\n",
+	dev_dbg(kctx->kbdev->dev, "%s 0x%llx in kctx %pK\n",
 		__func__, gpu_addr, (void *)kctx);
 
 	if ((gpu_addr & ~PAGE_MASK) && (gpu_addr >= PAGE_SIZE)) {
@@ -1803,7 +1983,7 @@ int kbase_mem_free(struct kbase_context *kctx, u64 gpu_addr)
 		return -EINVAL;
 	}
 
-	if (0 == gpu_addr) {
+	if (gpu_addr == 0) {
 		dev_warn(kctx->kbdev->dev, "gpu_addr 0 is reserved for the ringbuffer and it's an error to try to free it using kbase_mem_free\n");
 		return -EINVAL;
 	}
@@ -1856,7 +2036,7 @@ KBASE_EXPORT_TEST_API(kbase_mem_free);
 int kbase_update_region_flags(struct kbase_context *kctx,
 		struct kbase_va_region *reg, unsigned long flags)
 {
-	KBASE_DEBUG_ASSERT(NULL != reg);
+	KBASE_DEBUG_ASSERT(reg != NULL);
 	KBASE_DEBUG_ASSERT((flags & ~((1ul << BASE_MEM_FLAGS_NR_BITS) - 1)) == 0);
 
 	reg->flags |= kbase_cache_enabled(flags, reg->nr_pages);
@@ -1988,7 +2168,8 @@ int kbase_alloc_phy_pages_helper(struct kbase_mem_phy_alloc *alloc,
 		&kctx->kbdev->memdev.used_pages);
 
 	/* Increase mm counters before we allocate pages so that this
-	 * allocation is visible to the OOM killer */
+	 * allocation is visible to the OOM killer
+	 */
 	kbase_process_page_usage_inc(kctx, nr_pages_requested);
 
 	tp = alloc->pages + alloc->nents;
@@ -2392,7 +2573,7 @@ int kbase_free_phy_pages_helper(
 	}
 
 	/* early out if nothing to do */
-	if (0 == nr_pages_to_free)
+	if (nr_pages_to_free == 0)
 		return 0;
 
 	start_free = alloc->pages + alloc->nents - nr_pages_to_free;
@@ -2591,6 +2772,7 @@ void kbase_free_phy_pages_helper_locked(struct kbase_mem_phy_alloc *alloc,
 		kbase_trace_gpu_mem_usage_dec(kctx->kbdev, kctx, freed);
 	}
 }
+KBASE_EXPORT_TEST_API(kbase_free_phy_pages_helper_locked);
 
 #if MALI_USE_CSF
 /**
@@ -2640,8 +2822,10 @@ void kbase_mem_kref_free(struct kref *kref)
 		aliased = alloc->imported.alias.aliased;
 		if (aliased) {
 			for (i = 0; i < alloc->imported.alias.nents; i++)
-				if (aliased[i].alloc)
+				if (aliased[i].alloc) {
+					kbase_mem_phy_alloc_gpu_unmapped(aliased[i].alloc);
 					kbase_mem_phy_alloc_put(aliased[i].alloc);
+				}
 			vfree(aliased);
 		}
 		break;
@@ -2692,7 +2876,7 @@ KBASE_EXPORT_TEST_API(kbase_mem_kref_free);
 
 int kbase_alloc_phy_pages(struct kbase_va_region *reg, size_t vsize, size_t size)
 {
-	KBASE_DEBUG_ASSERT(NULL != reg);
+	KBASE_DEBUG_ASSERT(reg != NULL);
 	KBASE_DEBUG_ASSERT(vsize > 0);
 
 	/* validate user provided arguments */
@@ -2705,7 +2889,7 @@ int kbase_alloc_phy_pages(struct kbase_va_region *reg, size_t vsize, size_t size
 	if ((size_t) vsize > ((size_t) -1 / sizeof(*reg->cpu_alloc->pages)))
 		goto out_term;
 
-	KBASE_DEBUG_ASSERT(0 != vsize);
+	KBASE_DEBUG_ASSERT(vsize != 0);
 
 	if (kbase_alloc_phy_pages_helper(reg->cpu_alloc, size) != 0)
 		goto out_term;
@@ -2755,7 +2939,7 @@ bool kbase_check_alloc_flags(unsigned long flags)
 
 #if !MALI_USE_CSF
 	/* GPU executable memory also cannot have the top of its initial
-	 * commit aligned to 'extent'
+	 * commit aligned to 'extension'
 	 */
 	if ((flags & BASE_MEM_PROT_GPU_EX) && (flags &
 			BASE_MEM_TILER_ALIGN_TOP))
@@ -2777,7 +2961,8 @@ bool kbase_check_alloc_flags(unsigned long flags)
 #endif /* !MALI_USE_CSF */
 
 	/* GPU should have at least read or write access otherwise there is no
-	   reason for allocating. */
+	 * reason for allocating.
+	 */
 	if ((flags & (BASE_MEM_PROT_GPU_RD | BASE_MEM_PROT_GPU_WR)) == 0)
 		return false;
 
@@ -2785,14 +2970,15 @@ bool kbase_check_alloc_flags(unsigned long flags)
 	if ((flags & BASE_MEM_IMPORT_SHARED) == BASE_MEM_IMPORT_SHARED)
 		return false;
 
-	/* BASE_MEM_IMPORT_SYNC_ON_MAP_UNMAP is only valid for imported
-	 * memory */
+	/* BASE_MEM_IMPORT_SYNC_ON_MAP_UNMAP is only valid for imported memory
+	 */
 	if ((flags & BASE_MEM_IMPORT_SYNC_ON_MAP_UNMAP) ==
 			BASE_MEM_IMPORT_SYNC_ON_MAP_UNMAP)
 		return false;
 
 	/* Should not combine BASE_MEM_COHERENT_LOCAL with
-	 * BASE_MEM_COHERENT_SYSTEM */
+	 * BASE_MEM_COHERENT_SYSTEM
+	 */
 	if ((flags & (BASE_MEM_COHERENT_LOCAL | BASE_MEM_COHERENT_SYSTEM)) ==
 			(BASE_MEM_COHERENT_LOCAL | BASE_MEM_COHERENT_SYSTEM))
 		return false;
@@ -2825,7 +3011,8 @@ bool kbase_check_import_flags(unsigned long flags)
 #endif /* !MALI_USE_CSF */
 
 	/* GPU should have at least read or write access otherwise there is no
-	   reason for importing. */
+	 * reason for importing.
+	 */
 	if ((flags & (BASE_MEM_PROT_GPU_RD | BASE_MEM_PROT_GPU_WR)) == 0)
 		return false;
 
@@ -2837,19 +3024,19 @@ bool kbase_check_import_flags(unsigned long flags)
 }
 
 int kbase_check_alloc_sizes(struct kbase_context *kctx, unsigned long flags,
-		u64 va_pages, u64 commit_pages, u64 large_extent)
+			    u64 va_pages, u64 commit_pages, u64 large_extension)
 {
 	struct device *dev = kctx->kbdev->dev;
 	int gpu_pc_bits = kctx->kbdev->gpu_props.props.core_props.log2_program_counter_size;
 	u64 gpu_pc_pages_max = 1ULL << gpu_pc_bits >> PAGE_SHIFT;
 	struct kbase_va_region test_reg;
 
-	/* kbase_va_region's extent member can be of variable size, so check against that type */
-	test_reg.extent = large_extent;
+	/* kbase_va_region's extension member can be of variable size, so check against that type */
+	test_reg.extension = large_extension;
 
 #define KBASE_MSG_PRE "GPU allocation attempted with "
 
-	if (0 == va_pages) {
+	if (va_pages == 0) {
 		dev_warn(dev, KBASE_MSG_PRE "0 va_pages!");
 		return -EINVAL;
 	}
@@ -2861,7 +3048,8 @@ int kbase_check_alloc_sizes(struct kbase_context *kctx, unsigned long flags,
 	}
 
 	/* Note: commit_pages is checked against va_pages during
-	 * kbase_alloc_phy_pages() */
+	 * kbase_alloc_phy_pages()
+	 */
 
 	/* Limit GPU executable allocs to GPU PC size */
 	if ((flags & BASE_MEM_PROT_GPU_EX) && (va_pages > gpu_pc_pages_max)) {
@@ -2872,25 +3060,30 @@ int kbase_check_alloc_sizes(struct kbase_context *kctx, unsigned long flags,
 		return -EINVAL;
 	}
 
-	if ((flags & BASE_MEM_GROW_ON_GPF) && (test_reg.extent == 0)) {
-		dev_warn(dev, KBASE_MSG_PRE "BASE_MEM_GROW_ON_GPF but extent == 0\n");
+	if ((flags & BASE_MEM_GROW_ON_GPF) && (test_reg.extension == 0)) {
+		dev_warn(dev, KBASE_MSG_PRE
+			 "BASE_MEM_GROW_ON_GPF but extension == 0\n");
 		return -EINVAL;
 	}
 
 #if !MALI_USE_CSF
-	if ((flags & BASE_MEM_TILER_ALIGN_TOP) && (test_reg.extent == 0)) {
-		dev_warn(dev, KBASE_MSG_PRE "BASE_MEM_TILER_ALIGN_TOP but extent == 0\n");
+	if ((flags & BASE_MEM_TILER_ALIGN_TOP) && (test_reg.extension == 0)) {
+		dev_warn(dev, KBASE_MSG_PRE
+			 "BASE_MEM_TILER_ALIGN_TOP but extension == 0\n");
 		return -EINVAL;
 	}
 
 	if (!(flags & (BASE_MEM_GROW_ON_GPF | BASE_MEM_TILER_ALIGN_TOP)) &&
-			test_reg.extent != 0) {
-		dev_warn(dev, KBASE_MSG_PRE "neither BASE_MEM_GROW_ON_GPF nor BASE_MEM_TILER_ALIGN_TOP set but extent != 0\n");
+	    test_reg.extension != 0) {
+		dev_warn(
+			dev, KBASE_MSG_PRE
+			"neither BASE_MEM_GROW_ON_GPF nor BASE_MEM_TILER_ALIGN_TOP set but extension != 0\n");
 		return -EINVAL;
 	}
 #else
-	if (!(flags & BASE_MEM_GROW_ON_GPF) && test_reg.extent != 0) {
-		dev_warn(dev, KBASE_MSG_PRE "BASE_MEM_GROW_ON_GPF not set but extent != 0\n");
+	if (!(flags & BASE_MEM_GROW_ON_GPF) && test_reg.extension != 0) {
+		dev_warn(dev, KBASE_MSG_PRE
+			 "BASE_MEM_GROW_ON_GPF not set but extension != 0\n");
 		return -EINVAL;
 	}
 #endif /* !MALI_USE_CSF */
@@ -2899,28 +3092,36 @@ int kbase_check_alloc_sizes(struct kbase_context *kctx, unsigned long flags,
 	/* BASE_MEM_TILER_ALIGN_TOP memory has a number of restrictions */
 	if (flags & BASE_MEM_TILER_ALIGN_TOP) {
 #define KBASE_MSG_PRE_FLAG KBASE_MSG_PRE "BASE_MEM_TILER_ALIGN_TOP and "
-		unsigned long small_extent;
-
-		if (large_extent > BASE_MEM_TILER_ALIGN_TOP_EXTENT_MAX_PAGES) {
-			dev_warn(dev, KBASE_MSG_PRE_FLAG "extent==%lld pages exceeds limit %lld",
-					(unsigned long long)large_extent,
-					BASE_MEM_TILER_ALIGN_TOP_EXTENT_MAX_PAGES);
+		unsigned long small_extension;
+
+		if (large_extension >
+		    BASE_MEM_TILER_ALIGN_TOP_EXTENSION_MAX_PAGES) {
+			dev_warn(dev,
+				 KBASE_MSG_PRE_FLAG
+				 "extension==%lld pages exceeds limit %lld",
+				 (unsigned long long)large_extension,
+				 BASE_MEM_TILER_ALIGN_TOP_EXTENSION_MAX_PAGES);
 			return -EINVAL;
 		}
 		/* For use with is_power_of_2, which takes unsigned long, so
-		 * must ensure e.g. on 32-bit kernel it'll fit in that type */
-		small_extent = (unsigned long)large_extent;
+		 * must ensure e.g. on 32-bit kernel it'll fit in that type
+		 */
+		small_extension = (unsigned long)large_extension;
 
-		if (!is_power_of_2(small_extent)) {
-			dev_warn(dev, KBASE_MSG_PRE_FLAG "extent==%ld not a non-zero power of 2",
-					small_extent);
+		if (!is_power_of_2(small_extension)) {
+			dev_warn(dev,
+				 KBASE_MSG_PRE_FLAG
+				 "extension==%ld not a non-zero power of 2",
+				 small_extension);
 			return -EINVAL;
 		}
 
-		if (commit_pages > large_extent) {
-			dev_warn(dev, KBASE_MSG_PRE_FLAG "commit_pages==%ld exceeds extent==%ld",
-					(unsigned long)commit_pages,
-					(unsigned long)large_extent);
+		if (commit_pages > large_extension) {
+			dev_warn(dev,
+				 KBASE_MSG_PRE_FLAG
+				 "commit_pages==%ld exceeds extension==%ld",
+				 (unsigned long)commit_pages,
+				 (unsigned long)large_extension);
 			return -EINVAL;
 		}
 #undef KBASE_MSG_PRE_FLAG
@@ -2939,7 +3140,8 @@ int kbase_check_alloc_sizes(struct kbase_context *kctx, unsigned long flags,
 }
 
 /**
- * @brief Acquire the per-context region list lock
+ * Acquire the per-context region list lock
+ * @kctx:  KBase context
  */
 void kbase_gpu_vm_lock(struct kbase_context *kctx)
 {
@@ -2950,7 +3152,8 @@ void kbase_gpu_vm_lock(struct kbase_context *kctx)
 KBASE_EXPORT_TEST_API(kbase_gpu_vm_lock);
 
 /**
- * @brief Release the per-context region list lock
+ * Release the per-context region list lock
+ * @kctx:  KBase context
  */
 void kbase_gpu_vm_unlock(struct kbase_context *kctx)
 {
@@ -3013,7 +3216,7 @@ static ssize_t kbase_jit_debugfs_common_read(struct file *file,
 		}
 
 		size = scnprintf(data->buffer, sizeof(data->buffer),
-				"%llu,%llu,%llu", data->active_value,
+				"%llu,%llu,%llu\n", data->active_value,
 				data->pool_value, data->destroy_value);
 	}
 
@@ -3311,7 +3514,7 @@ static bool meet_size_and_tiler_align_top_requirements(
 
 #if !MALI_USE_CSF
 	if (meet_reqs && (info->flags & BASE_JIT_ALLOC_MEM_TILER_ALIGN_TOP)) {
-		size_t align = info->extent;
+		size_t align = info->extension;
 		size_t align_mask = align - 1;
 
 		if ((walker->start_pfn + info->commit_pages) & align_mask)
@@ -3366,20 +3569,20 @@ static int kbase_mem_jit_trim_pages_from_region(struct kbase_context *kctx,
 			KBASE_GPU_ALLOCATED_OBJECT_ALIGN_BYTES);
 	} else if (reg->flags & KBASE_REG_TILER_ALIGN_TOP) {
 		/* The GPU could report being ready to write to the next
-		 * 'extent' sized chunk, but didn't actually write to it, so we
-		 * can report up to 'extent' size pages more than the backed
+		 * 'extension' sized chunk, but didn't actually write to it, so we
+		 * can report up to 'extension' size pages more than the backed
 		 * size.
 		 *
 		 * Note, this is allowed to exceed reg->nr_pages.
 		 */
-		max_allowed_pages += reg->extent;
+		max_allowed_pages += reg->extension;
 
 		/* Also note that in these GPUs, the GPU may make a large (>1
 		 * page) initial allocation but not actually write out to all
 		 * of it. Hence it might report that a much higher amount of
 		 * memory was used than actually was written to. This does not
 		 * result in a real warning because on growing this memory we
-		 * round up the size of the allocation up to an 'extent' sized
+		 * round up the size of the allocation up to an 'extension' sized
 		 * chunk, hence automatically bringing the backed size up to
 		 * the reported size.
 		 */
@@ -3605,7 +3808,7 @@ static int kbase_jit_grow(struct kbase_context *kctx,
 
 	/* Update attributes of JIT allocation taken from the pool */
 	reg->initial_commit = info->commit_pages;
-	reg->extent = info->extent;
+	reg->extension = info->extension;
 
 update_failed:
 	return ret;
@@ -3963,7 +4166,7 @@ struct kbase_va_region *kbase_jit_allocate(struct kbase_context *kctx,
 		kbase_gpu_vm_unlock(kctx);
 
 		reg = kbase_mem_alloc(kctx, info->va_pages, info->commit_pages,
-				info->extent, &flags, &gpu_addr);
+				      info->extension, &flags, &gpu_addr);
 		if (!reg) {
 			/* Most likely not enough GPU virtual space left for
 			 * the new JIT allocation.
@@ -4031,8 +4234,11 @@ void kbase_jit_free(struct kbase_context *kctx, struct kbase_va_region *reg)
 			div_u64(old_pages * (100 - kctx->trim_level), 100));
 		u64 delta = old_pages - new_size;
 
-		if (delta)
+		if (delta) {
+			mutex_lock(&kctx->reg_lock);
 			kbase_mem_shrink(kctx, reg, old_pages - delta);
+			mutex_unlock(&kctx->reg_lock);
+		}
 	}
 
 #if MALI_JIT_PRESSURE_LIMIT_BASE
@@ -4248,17 +4454,6 @@ void kbase_jit_report_update_pressure(struct kbase_context *kctx,
 }
 #endif /* MALI_JIT_PRESSURE_LIMIT_BASE */
 
-bool kbase_has_exec_va_zone(struct kbase_context *kctx)
-{
-	bool has_exec_va_zone;
-
-	kbase_gpu_vm_lock(kctx);
-	has_exec_va_zone = (kctx->exec_va_start != U64_MAX);
-	kbase_gpu_vm_unlock(kctx);
-
-	return has_exec_va_zone;
-}
-
 #if MALI_USE_CSF
 static void kbase_jd_user_buf_unpin_pages(struct kbase_mem_phy_alloc *alloc)
 {
@@ -4297,7 +4492,7 @@ int kbase_jd_user_buf_pin_pages(struct kbase_context *kctx,
 	if (WARN_ON(reg->gpu_alloc->imported.user_buf.mm != current->mm))
 		return -EINVAL;
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0)
+#if KERNEL_VERSION(4, 6, 0) > LINUX_VERSION_CODE
 	pinned_pages = get_user_pages(NULL, mm,
 			address,
 			alloc->imported.user_buf.nr_pages,
@@ -4309,13 +4504,13 @@ KERNEL_VERSION(4, 5, 0) > LINUX_VERSION_CODE
 			reg->flags & KBASE_REG_GPU_WR,
 			0, pages, NULL);
 #endif
-#elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
+#elif KERNEL_VERSION(4, 9, 0) > LINUX_VERSION_CODE
 	pinned_pages = get_user_pages_remote(NULL, mm,
 			address,
 			alloc->imported.user_buf.nr_pages,
 			reg->flags & KBASE_REG_GPU_WR,
 			0, pages, NULL);
-#elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
+#elif KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE
 	pinned_pages = get_user_pages_remote(NULL, mm,
 			address,
 			alloc->imported.user_buf.nr_pages,
@@ -4507,7 +4702,8 @@ struct kbase_mem_phy_alloc *kbase_map_external_resource(
 			goto exit;
 
 		reg->gpu_alloc->imported.user_buf.current_mapping_usage_count++;
-		if (1 == reg->gpu_alloc->imported.user_buf.current_mapping_usage_count) {
+		if (reg->gpu_alloc->imported.user_buf
+			    .current_mapping_usage_count == 1) {
 			err = kbase_jd_user_buf_map(kctx, reg);
 			if (err) {
 				reg->gpu_alloc->imported.user_buf.current_mapping_usage_count--;
@@ -4542,7 +4738,7 @@ void kbase_unmap_external_resource(struct kbase_context *kctx,
 	case KBASE_MEM_TYPE_IMPORTED_USER_BUF: {
 		alloc->imported.user_buf.current_mapping_usage_count--;
 
-		if (0 == alloc->imported.user_buf.current_mapping_usage_count) {
+		if (alloc->imported.user_buf.current_mapping_usage_count == 0) {
 			bool writeable = true;
 
 			if (!kbase_is_region_invalid_or_free(reg) &&
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem.h b/drivers/gpu/arm/bifrost/mali_kbase_mem.h
index 2238fbfe9e99..8a9e93437655 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,15 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /**
- * @file mali_kbase_mem.h
- * Base kernel memory APIs
+ * DOC: Base kernel memory APIs
  */
 
 #ifndef _KBASE_MEM_H_
@@ -35,7 +31,7 @@
 #endif
 
 #include <linux/kref.h>
-#include "mali_base_kernel.h"
+#include <uapi/gpu/arm/bifrost/mali_base_kernel.h>
 #include <mali_kbase_hw.h>
 #include "mali_kbase_pm.h"
 #include "mali_kbase_defs.h"
@@ -48,10 +44,13 @@ static inline void kbase_process_page_usage_inc(struct kbase_context *kctx,
 /* Part of the workaround for uTLB invalid pages is to ensure we grow/shrink tmem by 4 pages at a time */
 #define KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_LOG2_HW_ISSUE_8316 (2)	/* round to 4 pages */
 
-/* Part of the workaround for PRLAM-9630 requires us to grow/shrink memory by 8 pages.
-The MMU reads in 8 page table entries from memory at a time, if we have more than one page fault within the same 8 pages and
-page tables are updated accordingly, the MMU does not re-read the page table entries from memory for the subsequent page table
-updates and generates duplicate page faults as the page table information used by the MMU is not valid.   */
+/* Part of the workaround for PRLAM-9630 requires us to grow/shrink memory by
+ * 8 pages. The MMU reads in 8 page table entries from memory at a time, if we
+ * have more than one page fault within the same 8 pages and page tables are
+ * updated accordingly, the MMU does not re-read the page table entries from
+ * memory for the subsequent page table updates and generates duplicate page
+ * faults as the page table information used by the MMU is not valid.
+ */
 #define KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_LOG2_HW_ISSUE_9630 (3)	/* round to 8 pages */
 
 #define KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_LOG2 (0)	/* round to 1 page */
@@ -60,7 +59,8 @@ updates and generates duplicate page faults as the page table information used b
 #define KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES (1u << KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_LOG2)
 #define KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_HW_ISSUE_8316 (1u << KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_LOG2_HW_ISSUE_8316)
 #define KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_HW_ISSUE_9630 (1u << KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_LOG2_HW_ISSUE_9630)
-/**
+
+/*
  * A CPU mapping
  */
 struct kbase_cpu_mapping {
@@ -81,16 +81,15 @@ enum kbase_memory_type {
 };
 
 /* internal structure, mirroring base_mem_aliasing_info,
- * but with alloc instead of a gpu va (handle) */
+ * but with alloc instead of a gpu va (handle)
+ */
 struct kbase_aliased {
 	struct kbase_mem_phy_alloc *alloc; /* NULL for special, non-NULL for native */
 	u64 offset; /* in pages */
 	u64 length; /* in pages */
 };
 
-/**
- * @brief Physical pages tracking object properties
-  */
+/* Physical pages tracking object properties */
 #define KBASE_MEM_PHY_ALLOC_ACCESSED_CACHED  (1u << 0)
 #define KBASE_MEM_PHY_ALLOC_LARGE            (1u << 1)
 
@@ -105,7 +104,13 @@ struct kbase_aliased {
  * updated as part of the change.
  *
  * @kref: number of users of this alloc
- * @gpu_mappings: count number of times mapped on the GPU
+ * @gpu_mappings: count number of times mapped on the GPU. Indicates the number
+ *                of references there are to the physical pages from different
+ *                GPU VA regions.
+ * @kernel_mappings: count number of times mapped on the CPU, specifically in
+ *                   the kernel. Indicates the number of references there are
+ *                   to the physical pages to prevent flag changes or shrink
+ *                   while maps are still held.
  * @nents: 0..N
  * @pages: N elements, only 0..nents are valid
  * @mappings: List of CPU mappings of this physical memory allocation.
@@ -128,6 +133,7 @@ struct kbase_aliased {
 struct kbase_mem_phy_alloc {
 	struct kref           kref;
 	atomic_t              gpu_mappings;
+	atomic_t              kernel_mappings;
 	size_t                nents;
 	struct tagged_addr    *pages;
 	struct list_head      mappings;
@@ -211,12 +217,36 @@ static inline void kbase_mem_phy_alloc_gpu_unmapped(struct kbase_mem_phy_alloc *
 	KBASE_DEBUG_ASSERT(alloc);
 	/* we only track mappings of NATIVE buffers */
 	if (alloc->type == KBASE_MEM_TYPE_NATIVE)
-		if (0 > atomic_dec_return(&alloc->gpu_mappings)) {
+		if (atomic_dec_return(&alloc->gpu_mappings) < 0) {
 			pr_err("Mismatched %s:\n", __func__);
 			dump_stack();
 		}
 }
 
+/**
+ * kbase_mem_phy_alloc_kernel_mapped - Increment kernel_mappings
+ * counter for a memory region to prevent commit and flag changes
+ *
+ * @alloc:  Pointer to physical pages tracking object
+ */
+static inline void
+kbase_mem_phy_alloc_kernel_mapped(struct kbase_mem_phy_alloc *alloc)
+{
+	atomic_inc(&alloc->kernel_mappings);
+}
+
+/**
+ * kbase_mem_phy_alloc_kernel_unmapped - Decrement kernel_mappings
+ * counter for a memory region to allow commit and flag changes
+ *
+ * @alloc:  Pointer to physical pages tracking object
+ */
+static inline void
+kbase_mem_phy_alloc_kernel_unmapped(struct kbase_mem_phy_alloc *alloc)
+{
+	WARN_ON(atomic_dec_return(&alloc->kernel_mappings) < 0);
+}
+
 /**
  * kbase_mem_is_imported - Indicate whether a memory type is imported
  *
@@ -249,7 +279,7 @@ static inline struct kbase_mem_phy_alloc *kbase_mem_phy_alloc_put(struct kbase_m
 }
 
 /**
- * A GPU memory region, and attributes for CPU mappings.
+ * struct kbase_va_region - A GPU memory region, and attributes for CPU mappings
  *
  * @rblink: Node in a red-black tree of memory regions within the same zone of
  *          the GPU's virtual address space.
@@ -263,13 +293,31 @@ static inline struct kbase_mem_phy_alloc *kbase_mem_phy_alloc_put(struct kbase_m
  * @threshold_pages: If non-zero and the amount of memory committed to a region
  *                   that can grow on page fault exceeds this number of pages
  *                   then the driver switches to incremental rendering.
- * @extent:    Number of pages allocated on page fault.
+ * @flags:           Flags
+ * @extension:    Number of pages allocated on page fault.
  * @cpu_alloc: The physical memory we mmap to the CPU when mapping this region.
  * @gpu_alloc: The physical memory we mmap to the GPU when mapping this region.
  * @jit_node:     Links to neighboring regions in the just-in-time memory pool.
  * @jit_usage_id: The last just-in-time memory usage ID for this region.
  * @jit_bin_id:   The just-in-time memory bin this region came from.
  * @va_refcnt:    Number of users of this region. Protected by reg_lock.
+ * @heap_info_gpu_addr: Pointer to an object in GPU memory defining an end of
+ *                      an allocated region
+ *                      The object can be one of:
+ *                      - u32 value defining the size of the region
+ *                      - u64 pointer first unused byte in the region
+ *                      The interpretation of the object depends on
+ *                      BASE_JIT_ALLOC_HEAP_INFO_IS_SIZE flag in
+ *                      jit_info_flags - if it is set, the heap info object
+ *                      should be interpreted as size.
+ * @used_pages: The current estimate of the number of pages used, which in
+ *              normal use is either:
+ *              - the initial estimate == va_pages
+ *              - the actual pages used, as found by a JIT usage report
+ *              Note that since the value is calculated from GPU memory after a
+ *              JIT usage report, at any point in time it is allowed to take a
+ *              random value that is no greater than va_pages (e.g. it may be
+ *              greater than gpu_alloc->nents)
  */
 struct kbase_va_region {
 	struct rb_node rblink;
@@ -309,8 +357,13 @@ struct kbase_va_region {
 #define KBASE_REG_SHARE_BOTH        (1ul << 10)
 
 /* Space for 4 different zones */
-#define KBASE_REG_ZONE_MASK         (3ul << 11)
-#define KBASE_REG_ZONE(x)           (((x) & 3) << 11)
+#define KBASE_REG_ZONE_MASK         ((KBASE_REG_ZONE_MAX - 1ul) << 11)
+#define KBASE_REG_ZONE(x)           (((x) & (KBASE_REG_ZONE_MAX - 1ul)) << 11)
+#define KBASE_REG_ZONE_IDX(x)       (((x) & KBASE_REG_ZONE_MASK) >> 11)
+
+#if ((KBASE_REG_ZONE_MAX - 1) & 0x3) != (KBASE_REG_ZONE_MAX - 1)
+#error KBASE_REG_ZONE_MAX too large for allocation of KBASE_REG_<...> bits
+#endif
 
 /* GPU read access */
 #define KBASE_REG_GPU_RD            (1ul<<13)
@@ -341,8 +394,9 @@ struct kbase_va_region {
 #endif
 
 #if !MALI_USE_CSF
-/* The top of the initial commit is aligned to extent pages.
- * Extent must be a power of 2 */
+/* The top of the initial commit is aligned to extension pages.
+ * Extent must be a power of 2
+ */
 #define KBASE_REG_TILER_ALIGN_TOP   (1ul << 23)
 #else
 /* Bit 23 is reserved.
@@ -416,7 +470,7 @@ struct kbase_va_region {
 #endif
 
 	unsigned long flags;
-	size_t extent;
+	size_t extension;
 	struct kbase_mem_phy_alloc *cpu_alloc;
 	struct kbase_mem_phy_alloc *gpu_alloc;
 	struct list_head jit_node;
@@ -495,7 +549,7 @@ static inline struct kbase_va_region *kbase_va_region_alloc_get(
 	WARN_ON(!region->va_refcnt);
 
 	/* non-atomic as kctx->reg_lock is held */
-	dev_dbg(kctx->kbdev->dev, "va_refcnt %d before get %p\n",
+	dev_dbg(kctx->kbdev->dev, "va_refcnt %d before get %pK\n",
 		region->va_refcnt, (void *)region);
 	region->va_refcnt++;
 
@@ -512,7 +566,7 @@ static inline struct kbase_va_region *kbase_va_region_alloc_put(
 
 	/* non-atomic as kctx->reg_lock is held */
 	region->va_refcnt--;
-	dev_dbg(kctx->kbdev->dev, "va_refcnt %d after put %p\n",
+	dev_dbg(kctx->kbdev->dev, "va_refcnt %d after put %pK\n",
 		region->va_refcnt, (void *)region);
 	if (!region->va_refcnt)
 		kbase_region_refcnt_free(region);
@@ -604,6 +658,7 @@ static inline struct kbase_mem_phy_alloc *kbase_alloc_create(
 
 	kref_init(&alloc->kref);
 	atomic_set(&alloc->gpu_mappings, 0);
+	atomic_set(&alloc->kernel_mappings, 0);
 	alloc->nents = 0;
 	alloc->pages = (void *)(alloc + 1);
 	INIT_LIST_HEAD(&alloc->mappings);
@@ -1043,7 +1098,9 @@ struct kbase_va_region *kbase_find_region_enclosing_address(
 		struct rb_root *rbtree, u64 gpu_addr);
 
 /**
- * @brief Check that a pointer is actually a valid region.
+ * Check that a pointer is actually a valid region.
+ * @kctx: kbase context containing the region
+ * @gpu_addr: pointer to check
  *
  * Must be called with context lock held.
  */
@@ -1072,7 +1129,7 @@ bool kbase_check_import_flags(unsigned long flags);
  * @flags:        The flags passed from user space
  * @va_pages:     The size of the requested region, in pages.
  * @commit_pages: Number of pages to commit initially.
- * @extent:       Number of pages to grow by on GPU page fault and/or alignment
+ * @extension:       Number of pages to grow by on GPU page fault and/or alignment
  *                (depending on flags)
  *
  * Makes checks on the size parameters passed in from user space for a memory
@@ -1081,7 +1138,7 @@ bool kbase_check_import_flags(unsigned long flags);
  * Return: 0 if sizes are valid for these flags, negative error code otherwise
  */
 int kbase_check_alloc_sizes(struct kbase_context *kctx, unsigned long flags,
-		u64 va_pages, u64 commit_pages, u64 extent);
+			    u64 va_pages, u64 commit_pages, u64 extension);
 
 /**
  * kbase_update_region_flags - Convert user space flags to kernel region flags
@@ -1104,14 +1161,21 @@ void kbase_gpu_vm_unlock(struct kbase_context *kctx);
 int kbase_alloc_phy_pages(struct kbase_va_region *reg, size_t vsize, size_t size);
 
 /**
- * @brief Register region and map it on the GPU.
+ * Register region and map it on the GPU.
+ * @kctx: kbase context containing the region
+ * @reg: the region to add
+ * @addr: the address to insert the region at
+ * @nr_pages: the number of pages in the region
+ * @align: the minimum alignment in pages
  *
  * Call kbase_add_va_region() and map the region on the GPU.
  */
 int kbase_gpu_mmap(struct kbase_context *kctx, struct kbase_va_region *reg, u64 addr, size_t nr_pages, size_t align);
 
 /**
- * @brief Remove the region from the GPU and unregister it.
+ * Remove the region from the GPU and unregister it.
+ * @kctx:  KBase context
+ * @reg:   The region to remove
  *
  * Must be called with context lock held.
  */
@@ -1400,7 +1464,8 @@ static inline void kbase_set_dma_addr(struct page *p, dma_addr_t dma_addr)
 		/* on 32-bit ARM with LPAE dma_addr_t becomes larger, but the
 		 * private field stays the same. So we have to be clever and
 		 * use the fact that we only store DMA addresses of whole pages,
-		 * so the low bits should be zero */
+		 * so the low bits should be zero
+		 */
 		KBASE_DEBUG_ASSERT(!(dma_addr & (PAGE_SIZE - 1)));
 		set_page_private(p, dma_addr >> PAGE_SHIFT);
 	} else {
@@ -1959,4 +2024,76 @@ int kbase_mem_copy_to_pinned_user_pages(struct page **dest_pages,
 		void *src_page, size_t *to_copy, unsigned int nr_pages,
 		unsigned int *target_page_nr, size_t offset);
 
+/**
+ * kbase_ctx_reg_zone_end_pfn - return the end Page Frame Number of @zone
+ * @zone: zone to query
+ *
+ * Return: The end of the zone corresponding to @zone
+ */
+static inline u64 kbase_reg_zone_end_pfn(struct kbase_reg_zone *zone)
+{
+	return zone->base_pfn + zone->va_size_pages;
+}
+
+/**
+ * kbase_ctx_reg_zone_init - initialize a zone in @kctx
+ * @kctx: Pointer to kbase context
+ * @zone_bits: A KBASE_REG_ZONE_<...> to initialize
+ * @base_pfn: Page Frame Number in GPU virtual address space for the start of
+ *            the Zone
+ * @va_size_pages: Size of the Zone in pages
+ */
+static inline void kbase_ctx_reg_zone_init(struct kbase_context *kctx,
+					   unsigned long zone_bits,
+					   u64 base_pfn, u64 va_size_pages)
+{
+	struct kbase_reg_zone *zone;
+
+	lockdep_assert_held(&kctx->reg_lock);
+	WARN_ON((zone_bits & KBASE_REG_ZONE_MASK) != zone_bits);
+
+	zone = &kctx->reg_zone[KBASE_REG_ZONE_IDX(zone_bits)];
+	*zone = (struct kbase_reg_zone){
+		.base_pfn = base_pfn, .va_size_pages = va_size_pages,
+	};
+}
+
+/**
+ * kbase_ctx_reg_zone_get_nolock - get a zone from @kctx where the caller does
+ *                                 not have @kctx 's region lock
+ * @kctx: Pointer to kbase context
+ * @zone_bits: A KBASE_REG_ZONE_<...> to retrieve
+ *
+ * This should only be used in performance-critical paths where the code is
+ * resilient to a race with the zone changing.
+ *
+ * Return: The zone corresponding to @zone_bits
+ */
+static inline struct kbase_reg_zone *
+kbase_ctx_reg_zone_get_nolock(struct kbase_context *kctx,
+			      unsigned long zone_bits)
+{
+	WARN_ON((zone_bits & KBASE_REG_ZONE_MASK) != zone_bits);
+
+	return &kctx->reg_zone[KBASE_REG_ZONE_IDX(zone_bits)];
+}
+
+/**
+ * kbase_ctx_reg_zone_get - get a zone from @kctx
+ * @kctx: Pointer to kbase context
+ * @zone_bits: A KBASE_REG_ZONE_<...> to retrieve
+ *
+ * The get is not refcounted - there is no corresponding 'put' operation
+ *
+ * Return: The zone corresponding to @zone_bits
+ */
+static inline struct kbase_reg_zone *
+kbase_ctx_reg_zone_get(struct kbase_context *kctx, unsigned long zone_bits)
+{
+	lockdep_assert_held(&kctx->reg_lock);
+	WARN_ON((zone_bits & KBASE_REG_ZONE_MASK) != zone_bits);
+
+	return &kctx->reg_zone[KBASE_REG_ZONE_IDX(zone_bits)];
+}
+
 #endif				/* _KBASE_MEM_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_linux.c b/drivers/gpu/arm/bifrost/mali_kbase_mem_linux.c
index 99b5b852667e..f58fdf3c1e3a 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_linux.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_linux.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,15 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /**
- * @file mali_kbase_mem_linux.c
- * Base kernel memory APIs, Linux implementation.
+ * DOC: Base kernel memory APIs, Linux implementation.
  */
 
 #include <linux/compat.h>
@@ -35,10 +31,9 @@
 #include <linux/fs.h>
 #include <linux/version.h>
 #include <linux/dma-mapping.h>
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)) && \
-	(LINUX_VERSION_CODE < KERNEL_VERSION(4, 8, 0))
+#if (KERNEL_VERSION(4, 8, 0) > LINUX_VERSION_CODE)
 #include <linux/dma-attrs.h>
-#endif /* LINUX_VERSION_CODE >= 3.5.0 && < 4.8.0 */
+#endif /* LINUX_VERSION_CODE < 4.8.0 */
 #include <linux/dma-buf.h>
 #include <linux/shrinker.h>
 #include <linux/cache.h>
@@ -47,10 +42,11 @@
 #include <mali_kbase.h>
 #include <mali_kbase_mem_linux.h>
 #include <tl/mali_kbase_tracepoints.h>
-#include <mali_kbase_ioctl.h>
+#include <uapi/gpu/arm/bifrost/mali_kbase_ioctl.h>
 #include <mmu/mali_kbase_mmu.h>
 #include <mali_kbase_caps.h>
 #include <mali_kbase_trace_gpu_mem.h>
+#include <mali_kbase_reset_gpu.h>
 
 #if ((KERNEL_VERSION(5, 3, 0) <= LINUX_VERSION_CODE) || \
 	(KERNEL_VERSION(5, 0, 0) > LINUX_VERSION_CODE))
@@ -296,8 +292,8 @@ void kbase_phy_alloc_mapping_put(struct kbase_context *kctx,
 }
 
 struct kbase_va_region *kbase_mem_alloc(struct kbase_context *kctx,
-		u64 va_pages, u64 commit_pages, u64 extent, u64 *flags,
-		u64 *gpu_va)
+					u64 va_pages, u64 commit_pages,
+					u64 extension, u64 *flags, u64 *gpu_va)
 {
 	int zone;
 	struct kbase_va_region *reg;
@@ -309,8 +305,9 @@ struct kbase_va_region *kbase_mem_alloc(struct kbase_context *kctx,
 	KBASE_DEBUG_ASSERT(gpu_va);
 
 	dev = kctx->kbdev->dev;
-	dev_dbg(dev, "Allocating %lld va_pages, %lld commit_pages, %lld extent, 0x%llX flags\n",
-		va_pages, commit_pages, extent, *flags);
+	dev_dbg(dev,
+		"Allocating %lld va_pages, %lld commit_pages, %lld extension, 0x%llX flags\n",
+		va_pages, commit_pages, extension, *flags);
 
 #if MALI_USE_CSF
 	*gpu_va = 0; /* return 0 on failure */
@@ -356,7 +353,8 @@ struct kbase_va_region *kbase_mem_alloc(struct kbase_context *kctx,
 		*flags &= ~BASE_MEM_COHERENT_SYSTEM;
 	}
 
-	if (kbase_check_alloc_sizes(kctx, *flags, va_pages, commit_pages, extent))
+	if (kbase_check_alloc_sizes(kctx, *flags, va_pages, commit_pages,
+				    extension))
 		goto bad_sizes;
 
 #ifdef CONFIG_MALI_MEMORY_FULLY_BACKED
@@ -413,15 +411,16 @@ struct kbase_va_region *kbase_mem_alloc(struct kbase_context *kctx,
 		reg->threshold_pages = 0;
 
 	if (*flags & BASE_MEM_GROW_ON_GPF) {
-		/* kbase_check_alloc_sizes() already checks extent is valid for
-		 * assigning to reg->extent */
-		reg->extent = extent;
+		/* kbase_check_alloc_sizes() already checks extension is valid for
+		 * assigning to reg->extension
+		 */
+		reg->extension = extension;
 #if !MALI_USE_CSF
 	} else if (*flags & BASE_MEM_TILER_ALIGN_TOP) {
-		reg->extent = extent;
+		reg->extension = extension;
 #endif /* !MALI_USE_CSF */
 	} else {
-		reg->extent = 0;
+		reg->extension = 0;
 	}
 
 	if (kbase_alloc_phy_pages(reg, va_pages, commit_pages) != 0) {
@@ -448,14 +447,6 @@ struct kbase_va_region *kbase_mem_alloc(struct kbase_context *kctx,
 		}
 	}
 
-#if MALI_USE_CSF
-	if (reg->flags & KBASE_REG_CSF_EVENT) {
-		WARN_ON(!(*flags & BASE_MEM_SAME_VA));
-
-		kbase_link_event_mem_page(kctx, reg);
-	}
-#endif
-
 	/* mmap needed to setup VA? */
 	if (*flags & BASE_MEM_SAME_VA) {
 		unsigned long cookie, cookie_nr;
@@ -503,13 +494,6 @@ struct kbase_va_region *kbase_mem_alloc(struct kbase_context *kctx,
 
 no_mmap:
 no_cookie:
-#if MALI_USE_CSF
-	if (reg->flags & KBASE_REG_CSF_EVENT) {
-		kbase_gpu_vm_lock(kctx);
-		kbase_unlink_event_mem_page(kctx, reg);
-		kbase_gpu_vm_unlock(kctx);
-	}
-#endif
 no_kern_mapping:
 no_mem:
 #if MALI_JIT_PRESSURE_LIMIT_BASE
@@ -657,6 +641,13 @@ unsigned long kbase_mem_evictable_reclaim_count_objects(struct shrinker *s,
 
 	kctx = container_of(s, struct kbase_context, reclaim);
 
+	WARN((sc->gfp_mask & __GFP_ATOMIC),
+	     "Shrinkers cannot be called for GFP_ATOMIC allocations. Check kernel mm for problems. gfp_mask==%x\n",
+	     sc->gfp_mask);
+	WARN(in_atomic(),
+	     "Shrinker called whilst in atomic context. The caller must switch to using GFP_ATOMIC or similar. gfp_mask==%x\n",
+	     sc->gfp_mask);
+
 	mutex_lock(&kctx->jit_evict_lock);
 
 	list_for_each_entry(alloc, &kctx->evict_list, evict_node)
@@ -739,35 +730,18 @@ unsigned long kbase_mem_evictable_reclaim_scan_objects(struct shrinker *s,
 	return freed;
 }
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 12, 0)
-static int kbase_mem_evictable_reclaim_shrink(struct shrinker *s,
-		struct shrink_control *sc)
-{
-	if (sc->nr_to_scan == 0)
-		return kbase_mem_evictable_reclaim_count_objects(s, sc);
-
-	return kbase_mem_evictable_reclaim_scan_objects(s, sc);
-}
-#endif
-
 int kbase_mem_evictable_init(struct kbase_context *kctx)
 {
 	INIT_LIST_HEAD(&kctx->evict_list);
 	mutex_init(&kctx->jit_evict_lock);
 
-	/* Register shrinker */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 12, 0)
-	kctx->reclaim.shrink = kbase_mem_evictable_reclaim_shrink;
-#else
 	kctx->reclaim.count_objects = kbase_mem_evictable_reclaim_count_objects;
 	kctx->reclaim.scan_objects = kbase_mem_evictable_reclaim_scan_objects;
-#endif
 	kctx->reclaim.seeks = DEFAULT_SEEKS;
 	/* Kernel versions prior to 3.1 :
-	 * struct shrinker does not define batch */
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
+	 * struct shrinker does not define batch
+	 */
 	kctx->reclaim.batch = 0;
-#endif
 	register_shrinker(&kctx->reclaim);
 	return 0;
 }
@@ -945,10 +919,18 @@ int kbase_mem_flags_change(struct kbase_context *kctx, u64 gpu_addr, unsigned in
 	prev_needed = (KBASE_REG_DONT_NEED & reg->flags) == KBASE_REG_DONT_NEED;
 	new_needed = (BASE_MEM_DONT_NEED & flags) == BASE_MEM_DONT_NEED;
 	if (prev_needed != new_needed) {
-		/* Aliased allocations can't be made ephemeral */
+		/* Aliased allocations can't be shrunk as the code doesn't
+		 * support looking up:
+		 * - all physical pages assigned to different GPU VAs
+		 * - CPU mappings for the physical pages at different vm_pgoff
+		 *   (==GPU VA) locations.
+		 */
 		if (atomic_read(&reg->cpu_alloc->gpu_mappings) > 1)
 			goto out_unlock;
 
+		if (atomic_read(&reg->cpu_alloc->kernel_mappings) > 0)
+			goto out_unlock;
+
 		if (new_needed) {
 			/* Only native allocations can be marked not needed */
 			if (reg->cpu_alloc->type != KBASE_MEM_TYPE_NATIVE) {
@@ -1122,7 +1104,7 @@ int kbase_mem_do_sync_imported(struct kbase_context *kctx,
 				dir);
 #endif /* KBASE_MEM_ION_SYNC_WORKAROUND */
 		break;
-	};
+	}
 
 	if (unlikely(ret))
 		dev_warn(kctx->kbdev->dev,
@@ -1483,7 +1465,7 @@ static struct kbase_va_region *kbase_mem_from_umm(struct kbase_context *kctx,
 	reg->gpu_alloc->imported.umm.current_mapping_usage_count = 0;
 	reg->gpu_alloc->imported.umm.need_sync = need_sync;
 	reg->gpu_alloc->imported.umm.kctx = kctx;
-	reg->extent = 0;
+	reg->extension = 0;
 
 	if (!IS_ENABLED(CONFIG_MALI_DMA_BUF_MAP_ON_DEMAND)) {
 		int err;
@@ -1536,6 +1518,7 @@ static struct kbase_va_region *kbase_mem_from_user_buffer(
 	u32 cache_line_alignment = kbase_get_cache_line_alignment(kctx->kbdev);
 	struct kbase_alloc_import_user_buf *user_buf;
 	struct page **pages = NULL;
+	int write;
 
 	/* Flag supported only for dma-buf imported memory */
 	if (*flags & BASE_MEM_IMPORT_SYNC_ON_MAP_UNMAP)
@@ -1649,22 +1632,22 @@ static struct kbase_va_region *kbase_mem_from_user_buffer(
 
 	down_read(kbase_mem_get_process_mmap_lock());
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0)
+	write = reg->flags & (KBASE_REG_CPU_WR | KBASE_REG_GPU_WR);
+
+#if KERNEL_VERSION(4, 6, 0) > LINUX_VERSION_CODE
 	faulted_pages = get_user_pages(current, current->mm, address, *va_pages,
 #if KERNEL_VERSION(4, 4, 168) <= LINUX_VERSION_CODE && \
 KERNEL_VERSION(4, 5, 0) > LINUX_VERSION_CODE
-			reg->flags & KBASE_REG_GPU_WR ? FOLL_WRITE : 0,
-			pages, NULL);
+			write ? FOLL_WRITE : 0, pages, NULL);
 #else
-			reg->flags & KBASE_REG_GPU_WR, 0, pages, NULL);
+			write, 0, pages, NULL);
 #endif
-#elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
+#elif KERNEL_VERSION(4, 9, 0) > LINUX_VERSION_CODE
 	faulted_pages = get_user_pages(address, *va_pages,
-			reg->flags & KBASE_REG_GPU_WR, 0, pages, NULL);
+			write, 0, pages, NULL);
 #else
 	faulted_pages = get_user_pages(address, *va_pages,
-			reg->flags & KBASE_REG_GPU_WR ? FOLL_WRITE : 0,
-			pages, NULL);
+			write ? FOLL_WRITE : 0, pages, NULL);
 #endif
 
 	up_read(kbase_mem_get_process_mmap_lock());
@@ -1673,7 +1656,7 @@ KERNEL_VERSION(4, 5, 0) > LINUX_VERSION_CODE
 		goto fault_mismatch;
 
 	reg->gpu_alloc->nents = 0;
-	reg->extent = 0;
+	reg->extension = 0;
 
 	if (pages) {
 		struct device *dev = kctx->kbdev->dev;
@@ -1775,7 +1758,8 @@ u64 kbase_mem_alias(struct kbase_context *kctx, u64 *flags, u64 stride,
 #ifdef CONFIG_64BIT
 	if (!kbase_ctx_flag(kctx, KCTX_COMPAT)) {
 		/* 64-bit tasks must MMAP anyway, but not expose this address to
-		 * clients */
+		 * clients
+		 */
 		*flags |= BASE_MEM_NEED_MMAP;
 		reg = kbase_alloc_free_region(&kctx->reg_rbtree_same, 0,
 				*num_pages,
@@ -1821,7 +1805,8 @@ u64 kbase_mem_alias(struct kbase_context *kctx, u64 *flags, u64 stride,
 				goto bad_handle; /* must be > 0 */
 			if (ai[i].length > stride)
 				goto bad_handle; /* can't be larger than the
-						    stride */
+						  * stride
+						  */
 			reg->gpu_alloc->imported.alias.aliased[i].length = ai[i].length;
 		} else {
 			struct kbase_va_region *aliasing_reg;
@@ -1836,6 +1821,15 @@ u64 kbase_mem_alias(struct kbase_context *kctx, u64 *flags, u64 stride,
 				goto bad_handle; /* Not found/already free */
 			if (aliasing_reg->flags & KBASE_REG_DONT_NEED)
 				goto bad_handle; /* Ephemeral region */
+			if (aliasing_reg->flags & KBASE_REG_NO_USER_FREE)
+				goto bad_handle; /* JIT regions can't be
+						  * aliased. NO_USER_FREE flag
+						  * covers the entire lifetime
+						  * of JIT regions. The other
+						  * types of regions covered
+						  * by this flag also shall
+						  * not be aliased.
+						  */
 			if (!(aliasing_reg->flags & KBASE_REG_GPU_CACHED))
 				goto bad_handle; /* GPU uncached memory */
 			if (!aliasing_reg->gpu_alloc)
@@ -1843,16 +1837,18 @@ u64 kbase_mem_alias(struct kbase_context *kctx, u64 *flags, u64 stride,
 			if (aliasing_reg->gpu_alloc->type != KBASE_MEM_TYPE_NATIVE)
 				goto bad_handle; /* Not a native alloc */
 			if (coherent != ((aliasing_reg->flags & KBASE_REG_SHARE_BOTH) != 0))
-				goto bad_handle;
-				/* Non-coherent memory cannot alias
-				   coherent memory, and vice versa.*/
+				goto bad_handle; /* Non-coherent memory cannot
+						  * alias coherent memory, and
+						  * vice versa.
+						  */
 
 			/* check size against stride */
 			if (!ai[i].length)
 				goto bad_handle; /* must be > 0 */
 			if (ai[i].length > stride)
 				goto bad_handle; /* can't be larger than the
-						    stride */
+						  * stride
+						  */
 
 			alloc = aliasing_reg->gpu_alloc;
 
@@ -1865,6 +1861,18 @@ u64 kbase_mem_alias(struct kbase_context *kctx, u64 *flags, u64 stride,
 			reg->gpu_alloc->imported.alias.aliased[i].alloc = kbase_mem_phy_alloc_get(alloc);
 			reg->gpu_alloc->imported.alias.aliased[i].length = ai[i].length;
 			reg->gpu_alloc->imported.alias.aliased[i].offset = ai[i].offset;
+
+			/* Ensure the underlying alloc is marked as being
+			 * mapped at >1 different GPU VA immediately, even
+			 * though mapping might not happen until later.
+			 *
+			 * Otherwise, we would (incorrectly) allow shrinking of
+			 * the source region (aliasing_reg) and so freeing the
+			 * physical pages (without freeing the entire alloc)
+			 * whilst we still hold an implicit reference on those
+			 * physical pages.
+			 */
+			kbase_mem_phy_alloc_gpu_mapped(alloc);
 		}
 	}
 
@@ -1908,6 +1916,10 @@ u64 kbase_mem_alias(struct kbase_context *kctx, u64 *flags, u64 stride,
 #endif
 no_mmap:
 bad_handle:
+	/* Marking the source allocs as not being mapped on the GPU and putting
+	 * them is handled by putting reg's allocs, so no rollback of those
+	 * actions is done here.
+	 */
 	kbase_gpu_vm_unlock(kctx);
 no_aliased_array:
 invalid_flags:
@@ -2161,9 +2173,20 @@ int kbase_mem_commit(struct kbase_context *kctx, u64 gpu_addr, u64 new_pages)
 	if (new_pages > reg->nr_pages)
 		goto out_unlock;
 
-	/* can't be mapped more than once on the GPU */
+	/* Can't shrink when physical pages are mapped to different GPU
+	 * VAs. The code doesn't support looking up:
+	 * - all physical pages assigned to different GPU VAs
+	 * - CPU mappings for the physical pages at different vm_pgoff
+	 *   (==GPU VA) locations.
+	 *
+	 * Note that for Native allocs mapped at multiple GPU VAs, growth of
+	 * such allocs is not a supported use-case.
+	 */
 	if (atomic_read(&reg->gpu_alloc->gpu_mappings) > 1)
 		goto out_unlock;
+
+	if (atomic_read(&reg->cpu_alloc->kernel_mappings) > 0)
+		goto out_unlock;
 	/* can't grow regions which are ephemeral */
 	if (reg->flags & KBASE_REG_DONT_NEED)
 		goto out_unlock;
@@ -2463,11 +2486,7 @@ static int kbase_cpu_mmap(struct kbase_context *kctx,
 	 * See MIDBASE-1057
 	 */
 
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0))
 	vma->vm_flags |= VM_DONTCOPY | VM_DONTDUMP | VM_DONTEXPAND | VM_IO;
-#else
-	vma->vm_flags |= VM_DONTCOPY | VM_DONTEXPAND | VM_RESERVED | VM_IO;
-#endif
 	vma->vm_ops = &kbase_vm_ops;
 	vma->vm_private_data = map;
 
@@ -2648,7 +2667,8 @@ static int kbasep_reg_mmap(struct kbase_context *kctx,
 		/* incorrect mmap size */
 		/* leave the cookie for a potential later
 		 * mapping, or to be reclaimed later when the
-		 * context is freed */
+		 * context is freed
+		 */
 		err = -ENOMEM;
 		goto out;
 	}
@@ -2677,6 +2697,11 @@ static int kbasep_reg_mmap(struct kbase_context *kctx,
 	kctx->pending_regions[cookie] = NULL;
 	bitmap_set(kctx->cookies, cookie, 1);
 
+#if MALI_USE_CSF
+	if (reg->flags & KBASE_REG_CSF_EVENT)
+		kbase_link_event_mem_page(kctx, reg);
+#endif
+
 	/*
 	 * Overwrite the offset with the region start_pfn, so we effectively
 	 * map from offset 0 in the region. However subtract the aligned
@@ -2696,7 +2721,7 @@ int kbase_context_mmap(struct kbase_context *const kctx,
 {
 	struct kbase_va_region *reg = NULL;
 	void *kaddr = NULL;
-	size_t nr_pages = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
+	size_t nr_pages = vma_pages(vma);
 	int err = 0;
 	int free_on_close = 0;
 	struct device *dev = kctx->kbdev->dev;
@@ -2709,7 +2734,7 @@ int kbase_context_mmap(struct kbase_context *const kctx,
 	if (!(vma->vm_flags & VM_WRITE))
 		vma->vm_flags &= ~VM_MAYWRITE;
 
-	if (0 == nr_pages) {
+	if (nr_pages == 0) {
 		err = -EINVAL;
 		goto out;
 	}
@@ -2730,7 +2755,8 @@ int kbase_context_mmap(struct kbase_context *const kctx,
 	/* if not the MTP, verify that the MTP has been mapped */
 	rcu_read_lock();
 	/* catches both when the special page isn't present or
-	 * when we've forked */
+	 * when we've forked
+	 */
 	if (rcu_dereference(kctx->process_mm) != current->mm) {
 		err = -EINVAL;
 		rcu_read_unlock();
@@ -2747,7 +2773,7 @@ int kbase_context_mmap(struct kbase_context *const kctx,
 	case PFN_DOWN(BASE_MEM_MMU_DUMP_HANDLE):
 		/* MMU dump */
 		err = kbase_mmu_dump_mmap(kctx, vma, &reg, &kaddr);
-		if (0 != err)
+		if (err != 0)
 			goto out_unlock;
 		/* free the region on munmap */
 		free_on_close = 1;
@@ -2770,7 +2796,7 @@ int kbase_context_mmap(struct kbase_context *const kctx,
 	     PFN_DOWN(BASE_MEM_FIRST_FREE_ADDRESS) - 1: {
 		err = kbasep_reg_mmap(kctx, vma, &reg, &nr_pages,
 							&aligned_offset);
-		if (0 != err)
+		if (err != 0)
 			goto out_unlock;
 		/* free the region on munmap */
 		free_on_close = 1;
@@ -2843,8 +2869,21 @@ int kbase_context_mmap(struct kbase_context *const kctx,
 
 	if (vma->vm_pgoff == PFN_DOWN(BASE_MEM_MMU_DUMP_HANDLE)) {
 		/* MMU dump - userspace should now have a reference on
-		 * the pages, so we can now free the kernel mapping */
+		 * the pages, so we can now free the kernel mapping
+		 */
 		vfree(kaddr);
+		/* CPU mapping of GPU allocations have GPU VA as the vm_pgoff
+		 * and that is used to shrink the mapping when the commit size
+		 * is reduced. So vm_pgoff for CPU mapping created to get the
+		 * snapshot of GPU page tables shall not match with any GPU VA.
+		 * That can be ensured by setting vm_pgoff as vma->vm_start
+		 * because,
+		 * - GPU VA of any SAME_VA allocation cannot match with
+		 *   vma->vm_start, as CPU VAs are unique.
+		 * - GPU VA of CUSTOM_VA allocations are outside the CPU
+		 *   virtual address space.
+		 */
+		vma->vm_pgoff = PFN_DOWN(vma->vm_start);
 	}
 
 out_unlock:
@@ -2939,8 +2978,8 @@ static int kbase_vmap_phy_pages(struct kbase_context *kctx,
 
 	/* Note: enforcing a RO prot_request onto prot is not done, since:
 	 * - CPU-arch-specific integration required
-	 * - kbase_vmap() requires no access checks to be made/enforced */
-
+	 * - kbase_vmap() requires no access checks to be made/enforced
+	 */
 	cpu_addr = vmap(pages, page_count, VM_MAP, prot);
 
 	kfree(pages);
@@ -2961,6 +3000,7 @@ static int kbase_vmap_phy_pages(struct kbase_context *kctx,
 	if (map->sync_needed)
 		kbase_sync_mem_regions(kctx, map, KBASE_SYNC_TO_CPU);
 
+	kbase_mem_phy_alloc_kernel_mapped(reg->cpu_alloc);
 	return 0;
 }
 
@@ -3016,7 +3056,8 @@ void *kbase_vmap(struct kbase_context *kctx, u64 gpu_addr, size_t size,
 	 * be made.
 	 *
 	 * As mentioned in kbase_vmap_prot() this means that a kernel-side
-	 * CPU-RO mapping is not enforced to allow this to work */
+	 * CPU-RO mapping is not enforced to allow this to work
+	 */
 	return kbase_vmap_prot(kctx, gpu_addr, size, 0u, map);
 }
 KBASE_EXPORT_TEST_API(kbase_vmap);
@@ -3030,6 +3071,7 @@ static void kbase_vunmap_phy_pages(struct kbase_context *kctx,
 	if (map->sync_needed)
 		kbase_sync_mem_regions(kctx, map, KBASE_SYNC_TO_DEVICE);
 
+	kbase_mem_phy_alloc_kernel_unmapped(map->cpu_alloc);
 	map->offset_in_page = 0;
 	map->cpu_pages = NULL;
 	map->gpu_pages = NULL;
@@ -3048,7 +3090,7 @@ KBASE_EXPORT_TEST_API(kbase_vunmap);
 
 static void kbasep_add_mm_counter(struct mm_struct *mm, int member, long value)
 {
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0))
+#if (KERNEL_VERSION(4, 19, 0) <= LINUX_VERSION_CODE)
 	/* To avoid the build breakage due to an unexported kernel symbol
 	 * 'mm_trace_rss_stat' from later kernels, i.e. from V4.19.0 onwards,
 	 * we inline here the equivalent of 'add_mm_counter()' from linux
@@ -3132,11 +3174,7 @@ static int kbase_tracking_page_setup(struct kbase_context *kctx, struct vm_area_
 
 	/* no real access */
 	vma->vm_flags &= ~(VM_READ | VM_MAYREAD | VM_WRITE | VM_MAYWRITE | VM_EXEC | VM_MAYEXEC);
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0))
 	vma->vm_flags |= VM_DONTCOPY | VM_DONTEXPAND | VM_DONTDUMP | VM_IO;
-#else
-	vma->vm_flags |= VM_DONTCOPY | VM_DONTEXPAND | VM_RESERVED | VM_IO;
-#endif
 	vma->vm_ops = &kbase_vm_special_ops;
 	vma->vm_private_data = kctx;
 
@@ -3171,16 +3209,32 @@ static void kbase_csf_user_io_pages_vm_close(struct vm_area_struct *vma)
 {
 	struct kbase_queue *queue = vma->vm_private_data;
 	struct kbase_context *kctx;
+	struct kbase_device *kbdev;
+	int err;
+	bool reset_prevented = false;
 
 	if (WARN_ON(!queue))
 		return;
 
 	kctx = queue->kctx;
+	kbdev = kctx->kbdev;
+
+	err = kbase_reset_gpu_prevent_and_wait(kbdev);
+	if (err)
+		dev_warn(
+			kbdev->dev,
+			"Unsuccessful GPU reset detected when unbinding queue (csi_index=%d), attempting to unbind regardless",
+			queue->csi_index);
+	else
+		reset_prevented = true;
 
 	mutex_lock(&kctx->csf.lock);
 	kbase_csf_queue_unbind(queue);
 	mutex_unlock(&kctx->csf.lock);
 
+	if (reset_prevented)
+		kbase_reset_gpu_allow(kbdev);
+
 	/* Now as the vma is closed, drop the reference on mali device file */
 	fput(kctx->filp);
 }
@@ -3282,7 +3336,7 @@ static int kbase_csf_cpu_mmap_user_io_pages(struct kbase_context *kctx,
 {
 	unsigned long cookie =
 		vma->vm_pgoff - PFN_DOWN(BASEP_MEM_CSF_USER_IO_PAGES_HANDLE);
-	size_t nr_pages = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
+	size_t nr_pages = vma_pages(vma);
 	struct kbase_queue *queue;
 	int err = 0;
 
@@ -3315,11 +3369,7 @@ static int kbase_csf_cpu_mmap_user_io_pages(struct kbase_context *kctx,
 	if (err)
 		goto map_failed;
 
-#if (KERNEL_VERSION(3, 7, 0) <= LINUX_VERSION_CODE)
 	vma->vm_flags |= VM_DONTCOPY | VM_DONTDUMP | VM_DONTEXPAND | VM_IO;
-#else
-	vma->vm_flags |= VM_DONTCOPY | VM_DONTEXPAND | VM_RESERVED | VM_IO;
-#endif
 	/* TODO use VM_MIXEDMAP, since it is more appropriate as both types of
 	 * memory with and without "struct page" backing are being inserted here.
 	 * Hw Doorbell pages comes from the device register area so kernel does
@@ -3342,7 +3392,13 @@ static int kbase_csf_cpu_mmap_user_io_pages(struct kbase_context *kctx,
 	return 0;
 
 map_failed:
-	kbase_csf_queue_unbind(queue);
+	/* The queue cannot have got to KBASE_CSF_QUEUE_BOUND state if we
+	 * reached here, so safe to use a variant of unbind that only works on
+	 * stopped queues
+	 *
+	 * This is so we don't enter the CSF scheduler from this path.
+	 */
+	kbase_csf_queue_unbind_stopped(queue);
 
 	return err;
 }
@@ -3367,8 +3423,10 @@ static vm_fault_t kbase_csf_user_reg_vm_fault(struct vm_fault *vmf)
 #endif
 	struct kbase_context *kctx = vma->vm_private_data;
 	struct kbase_device *kbdev = kctx->kbdev;
+	struct memory_group_manager_device *mgm_dev = kbdev->mgm_dev;
 	unsigned long pfn = PFN_DOWN(kbdev->reg_start + USER_BASE);
 	size_t nr_pages = PFN_DOWN(vma->vm_end - vma->vm_start);
+	vm_fault_t ret = VM_FAULT_SIGBUS;
 
 	/* Few sanity checks up front */
 	if (WARN_ON(nr_pages != 1) ||
@@ -3377,11 +3435,22 @@ static vm_fault_t kbase_csf_user_reg_vm_fault(struct vm_fault *vmf)
 			PFN_DOWN(BASEP_MEM_CSF_USER_REG_PAGE_HANDLE)))
 		return VM_FAULT_SIGBUS;
 
-	/* TODO: check PM state here and don't map in the actual register page
-	 * if GPU is powered down or is about to be powered down.
+	mutex_lock(&kbdev->pm.lock);
+
+	/* Don't map in the actual register page if GPU is powered down.
+	 * Always map in the dummy page in no mali builds.
 	 */
+	if (!kbdev->pm.backend.gpu_powered || IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI))
+		pfn = PFN_DOWN(as_phys_addr_t(kbdev->csf.dummy_user_reg_page));
+
+	ret = mgm_dev->ops.mgm_vmf_insert_pfn_prot(mgm_dev,
+						   KBASE_MEM_GROUP_CSF_FW, vma,
+						   vma->vm_start, pfn,
+						   vma->vm_page_prot);
 
-	return vmf_insert_pfn_prot(vma, vma->vm_start, pfn, vma->vm_page_prot);
+	mutex_unlock(&kbdev->pm.lock);
+
+	return ret;
 }
 
 static const struct vm_operations_struct kbase_csf_user_reg_vm_ops = {
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_linux.h b/drivers/gpu/arm/bifrost/mali_kbase_mem_linux.h
index 85e030ab751a..c04b7fe59b0a 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_linux.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_linux.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2010, 2012-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010, 2012-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,21 +17,16 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /**
- * @file mali_kbase_mem_linux.h
  * Base kernel memory APIs, Linux implementation.
  */
 
 #ifndef _KBASE_MEM_LINUX_H_
 #define _KBASE_MEM_LINUX_H_
 
-/** A HWC dump mapping */
+/* A HWC dump mapping */
 struct kbase_hwc_dma_mapping {
 	void       *cpu_va;
 	dma_addr_t  dma_pa;
@@ -43,7 +39,7 @@ struct kbase_hwc_dma_mapping {
  * @kctx:         The kernel context
  * @va_pages:     The number of pages of virtual address space to reserve
  * @commit_pages: The number of physical pages to allocate upfront
- * @extent:       The number of extra pages to allocate on each GPU fault which
+ * @extension:       The number of extra pages to allocate on each GPU fault which
  *                grows the region.
  * @flags:        bitmask of BASE_MEM_* flags to convey special requirements &
  *                properties for the new allocation.
@@ -53,8 +49,8 @@ struct kbase_hwc_dma_mapping {
  * Return: 0 on success or error code
  */
 struct kbase_va_region *kbase_mem_alloc(struct kbase_context *kctx,
-		u64 va_pages, u64 commit_pages, u64 extent, u64 *flags,
-		u64 *gpu_va);
+					u64 va_pages, u64 commit_pages,
+					u64 extension, u64 *flags, u64 *gpu_va);
 
 /**
  * kbase_mem_query - Query properties of a GPU memory region
@@ -468,11 +464,11 @@ static inline vm_fault_t vmf_insert_pfn_prot(struct vm_area_struct *vma,
  */
 static inline struct rw_semaphore *kbase_mem_get_process_mmap_lock(void)
 {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 8, 0)
+#if KERNEL_VERSION(5, 8, 0) > LINUX_VERSION_CODE
 	return &current->mm->mmap_sem;
-#else /* LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0) */
+#else /* KERNEL_VERSION(5, 8, 0) > LINUX_VERSION_CODE */
 	return &current->mm->mmap_lock;
-#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(5, 8, 0) */
+#endif /* KERNEL_VERSION(5, 8, 0) > LINUX_VERSION_CODE */
 }
 
 #endif				/* _KBASE_MEM_LINUX_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_lowlevel.h b/drivers/gpu/arm/bifrost/mali_kbase_mem_lowlevel.h
index 70116030f233..ab09ec9b2b34 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_lowlevel.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_lowlevel.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2012-2014,2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2014, 2016-2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 #ifndef _KBASE_MEM_LOWLEVEL_H
 #define _KBASE_MEM_LOWLEVEL_H
 
@@ -31,9 +28,7 @@
 
 #include <linux/dma-mapping.h>
 
-/**
- * @brief Flags for kbase_phy_allocator_pages_alloc
- */
+/* Flags for kbase_phy_allocator_pages_alloc */
 #define KBASE_PHY_PAGES_FLAG_DEFAULT (0)	/** Default allocation flag */
 #define KBASE_PHY_PAGES_FLAG_CLEAR   (1 << 0)	/** Clear the pages after allocation */
 #define KBASE_PHY_PAGES_FLAG_POISON  (1 << 1)	/** Fill the memory with a poison value */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_pool.c b/drivers/gpu/arm/bifrost/mali_kbase_mem_pool.c
index 0723e32e2003..1874a6f9afd7 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_pool.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_pool.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2015-2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2015-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
@@ -154,20 +153,12 @@ static void kbase_mem_pool_spill(struct kbase_mem_pool *next_pool,
 struct page *kbase_mem_alloc_page(struct kbase_mem_pool *pool)
 {
 	struct page *p;
-	gfp_t gfp;
+	gfp_t gfp = GFP_HIGHUSER | __GFP_ZERO;
 	struct kbase_device *const kbdev = pool->kbdev;
 	struct device *const dev = kbdev->dev;
 	dma_addr_t dma_addr;
 	int i;
 
-#if defined(CONFIG_ARM) && !defined(CONFIG_HAVE_DMA_ATTRS) && \
-	LINUX_VERSION_CODE < KERNEL_VERSION(3, 5, 0)
-	/* DMA cache sync fails for HIGHMEM before 3.5 on ARM */
-	gfp = GFP_USER | __GFP_ZERO;
-#else
-	gfp = GFP_HIGHUSER | __GFP_ZERO;
-#endif
-
 	/* don't warn on higher order failures */
 	if (pool->order)
 		gfp |= __GFP_NOWARN;
@@ -318,7 +309,7 @@ void kbase_mem_pool_set_max_size(struct kbase_mem_pool *pool, size_t max_size)
 
 	kbase_mem_pool_unlock(pool);
 }
-
+KBASE_EXPORT_TEST_API(kbase_mem_pool_set_max_size);
 
 static unsigned long kbase_mem_pool_reclaim_count_objects(struct shrinker *s,
 		struct shrink_control *sc)
@@ -364,17 +355,6 @@ static unsigned long kbase_mem_pool_reclaim_scan_objects(struct shrinker *s,
 	return freed;
 }
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 12, 0)
-static int kbase_mem_pool_reclaim_shrink(struct shrinker *s,
-		struct shrink_control *sc)
-{
-	if (sc->nr_to_scan == 0)
-		return kbase_mem_pool_reclaim_count_objects(s, sc);
-
-	return kbase_mem_pool_reclaim_scan_objects(s, sc);
-}
-#endif
-
 int kbase_mem_pool_init(struct kbase_mem_pool *pool,
 		const struct kbase_mem_pool_config *config,
 		unsigned int order,
@@ -398,19 +378,13 @@ int kbase_mem_pool_init(struct kbase_mem_pool *pool,
 	spin_lock_init(&pool->pool_lock);
 	INIT_LIST_HEAD(&pool->page_list);
 
-	/* Register shrinker */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 12, 0)
-	pool->reclaim.shrink = kbase_mem_pool_reclaim_shrink;
-#else
 	pool->reclaim.count_objects = kbase_mem_pool_reclaim_count_objects;
 	pool->reclaim.scan_objects = kbase_mem_pool_reclaim_scan_objects;
-#endif
 	pool->reclaim.seeks = DEFAULT_SEEKS;
 	/* Kernel versions prior to 3.1 :
-	 * struct shrinker does not define batch */
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
+	 * struct shrinker does not define batch
+	 */
 	pool->reclaim.batch = 0;
-#endif
 	register_shrinker(&pool->reclaim);
 
 	pool_dbg(pool, "initialized\n");
@@ -830,8 +804,8 @@ void kbase_mem_pool_free_pages_locked(struct kbase_mem_pool *pool,
 		nr_to_pool = kbase_mem_pool_capacity(pool);
 		nr_to_pool = min(nr_pages, nr_to_pool);
 
-		kbase_mem_pool_add_array_locked(pool, nr_pages, pages, false,
-				dirty);
+		kbase_mem_pool_add_array_locked(pool, nr_to_pool, pages, false,
+						dirty);
 
 		i += nr_to_pool;
 	}
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_debugfs.c b/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_debugfs.c
index 5879fdf85b1d..e7d8fdc82e27 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_debugfs.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_debugfs.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2014-2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <linux/debugfs.h>
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_debugfs.h b/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_debugfs.h
index 2932945b3185..b2a94d7b775b 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_debugfs.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_debugfs.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014-2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_MEM_POOL_DEBUGFS_H_
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_group.c b/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_group.c
index aa2554805b5b..72a17b268502 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_group.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_group.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_group.h b/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_group.h
index 0484f5940ad1..35333e916ae1 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_group.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_pool_group.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_MEM_POOL_GROUP_H_
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs.c b/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs.c
index 85723f825054..113b69e4d410 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2012-2017, 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2017, 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,23 +17,23 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
 
 #ifdef CONFIG_DEBUG_FS
 
-/** Show callback for the @c mem_profile debugfs file.
+/**
+ * Show callback for the @c mem_profile debugfs file.
  *
  * This function is called to get the contents of the @c mem_profile debugfs
  * file. This is a report of current memory usage and distribution in userspace.
  *
- * @param sfile The debugfs entry
- * @param data Data associated with the entry
+ * @sfile: The debugfs entry
+ * @data:  Data associated with the entry
  *
- * @return 0 if it successfully prints data in debugfs entry file, non-zero otherwise
+ * Return: 0 if it successfully prints data in debugfs entry file, non-zero
+ * otherwise
  */
 static int kbasep_mem_profile_seq_show(struct seq_file *sfile, void *data)
 {
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs.h b/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs.h
index 1462247c3bca..7b5695d44ae3 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2012-2016 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2016, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,14 +17,9 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /**
- * @file mali_kbase_mem_profile_debugfs.h
  * Header file for mem profiles entries in debugfs
  *
  */
@@ -35,12 +31,17 @@
 #include <linux/seq_file.h>
 
 /**
- * @brief Remove entry from Mali memory profile debugfs
+ * Remove entry from Mali memory profile debugfs
+ * @kctx: The context whose debugfs file @p data should be removed from
  */
 void kbasep_mem_profile_debugfs_remove(struct kbase_context *kctx);
 
 /**
- * @brief Insert @p data to the debugfs file so it can be read by userspace
+ * Insert @p data to the debugfs file so it can be read by userspace
+ * @kctx: The context whose debugfs file @p data should be inserted to
+ * @data: A NULL-terminated string to be inserted to the debugfs file,
+ *             without the trailing new line character
+ * @size: The length of the @p data string
  *
  * The function takes ownership of @p data and frees it later when new data
  * is inserted.
@@ -48,10 +49,6 @@ void kbasep_mem_profile_debugfs_remove(struct kbase_context *kctx);
  * If the debugfs entry corresponding to the @p kctx doesn't exist,
  * an attempt will be made to create it.
  *
- * @param kctx The context whose debugfs file @p data should be inserted to
- * @param data A NULL-terminated string to be inserted to the debugfs file,
- *             without the trailing new line character
- * @param size The length of the @p data string
  * @return 0 if @p data inserted correctly
  *         -EAGAIN in case of error
  * @post @ref mem_profile_initialized will be set to @c true
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs_buf_size.h b/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs_buf_size.h
index d55cc854c415..8489c550fc6b 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs_buf_size.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mem_profile_debugfs_buf_size.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014, 2018-2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2017-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,9 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
- * @file mali_kbase_mem_profile_debugfs_buf_size.h
  * Header file for the size of the buffer to accumulate the histogram report text in
  */
 
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mipe_gen_header.h b/drivers/gpu/arm/bifrost/mali_kbase_mipe_gen_header.h
index 72acadfae993..d1ea7ad24792 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mipe_gen_header.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mipe_gen_header.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /* THIS FILE IS AUTOGENERATED BY mali_trace_generator.py.
@@ -40,14 +39,14 @@
  * defined. See documentation below:
  */
 
-/**
+/*
  * The name of the variable where the result BLOB will be stored.
  */
 #if !defined(MIPE_HEADER_BLOB_VAR_NAME)
 #error "MIPE_HEADER_BLOB_VAR_NAME must be defined!"
 #endif
 
-/**
+/*
  * A compiler attribute for the BLOB variable.
  *
  * e.g. __attribute__((section("my_section")))
@@ -58,6 +57,17 @@
 #define MIPE_HEADER_BLOB_VAR_ATTRIBUTE
 #endif
 
+/**
+ * A compiler attribute for packing structures
+ *
+ * e.g. __packed
+ *
+ * Default value is __attribute__((__packed__))
+ */
+#if !defined(MIPE_HEADER_PACKED_ATTRIBUTE)
+#define MIPE_HEADER_PACKED_ATTRIBUTE __attribute__((__packed__))
+#endif
+
 /**
  * MIPE stream id.
  *
@@ -67,7 +77,7 @@
 #error "MIPE_HEADER_STREAM_ID must be defined!"
 #endif
 
-/**
+/*
  * MIPE packet class.
  *
  * See enum tl_packet_class.
@@ -76,7 +86,7 @@
 #error "MIPE_HEADER_PKT_CLASS must be defined!"
 #endif
 
-/**
+/*
  * The list of tracepoints to process.
  *
  * It should be defined as follows:
@@ -95,14 +105,14 @@
 #error "MIPE_HEADER_TRACEPOINT_LIST must be defined!"
 #endif
 
-/**
+/*
  * The number of entries in MIPE_HEADER_TRACEPOINT_LIST.
  */
 #if !defined(MIPE_HEADER_TRACEPOINT_LIST_SIZE)
 #error "MIPE_HEADER_TRACEPOINT_LIST_SIZE must be defined!"
 #endif
 
-/**
+/*
  * The list of enums to process.
  *
  * It should be defined as follows:
@@ -119,7 +129,7 @@
  */
 #if defined(MIPE_HEADER_ENUM_LIST)
 
-/**
+/*
  * Tracepoint message ID used for enums declaration.
  */
 #if !defined(MIPE_HEADER_ENUM_MSG_ID)
@@ -151,7 +161,7 @@ const struct
 		char _arg_types[sizeof(arg_types)];	\
 		u32  _size_arg_names;		\
 		char _arg_names[sizeof(arg_names)];	\
-	} __attribute__ ((__packed__)) __ ## name;
+	} MIPE_HEADER_PACKED_ATTRIBUTE __ ## name;
 
 #define ENUM_DESC(arg_name, value)					\
 	struct {							\
@@ -161,13 +171,13 @@ const struct
 		u32 _value;						\
 		u32 _value_str_len;					\
 		char _value_str[sizeof(#value)];			\
-	} __attribute__ ((__packed__)) __ ## arg_name ## _ ## value;
+	} MIPE_HEADER_PACKED_ATTRIBUTE __ ## arg_name ## _ ## value;
 
 	MIPE_HEADER_TRACEPOINT_LIST
 	MIPE_HEADER_ENUM_LIST
 #undef TRACEPOINT_DESC
 #undef ENUM_DESC
-} __attribute__((packed)) MIPE_HEADER_BLOB_VAR_NAME MIPE_HEADER_BLOB_VAR_ATTRIBUTE = {
+} MIPE_HEADER_PACKED_ATTRIBUTE MIPE_HEADER_BLOB_VAR_NAME MIPE_HEADER_BLOB_VAR_ATTRIBUTE = {
 	._mipe_w0 = MIPE_PACKET_HEADER_W0(
 		TL_PACKET_FAMILY_TL,
 		MIPE_HEADER_PKT_CLASS,
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_mipe_proto.h b/drivers/gpu/arm/bifrost/mali_kbase_mipe_proto.h
index 54667cfc6304..ee88ee69c0fc 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_mipe_proto.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_mipe_proto.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /* THIS FILE IS AUTOGENERATED BY mali_trace_generator.py.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_native_mgm.c b/drivers/gpu/arm/bifrost/mali_kbase_native_mgm.c
index 38ae46e0ddf1..957d884b9c11 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_native_mgm.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_native_mgm.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <linux/gfp.h>
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_native_mgm.h b/drivers/gpu/arm/bifrost/mali_kbase_native_mgm.h
index 431b1f4cb5db..f14fee42ca12 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_native_mgm.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_native_mgm.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_NATIVE_MGM_H_
@@ -25,7 +24,7 @@
 
 #include <linux/memory_group_manager.h>
 
-/**
+/*
  * kbase_native_mgm_dev - Native memory group manager device
  *
  * An implementation of the memory group manager interface that is intended for
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_platform_fake.c b/drivers/gpu/arm/bifrost/mali_kbase_platform_fake.c
index fbb090e6c21f..02bfb256ce2a 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_platform_fake.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_platform_fake.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2011-2014, 2016-2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2014, 2016-2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <linux/errno.h>
@@ -41,14 +40,13 @@ static struct platform_device *mali_device;
 
 #ifndef CONFIG_OF
 /**
- * @brief Convert data in struct kbase_io_resources struct to Linux-specific resources
+ * Convert data in struct kbase_io_resources struct to Linux-specific resources
+ * @io_resources:      Input IO resource data
+ * @linux_resources:  Pointer to output array of Linux resource structures
  *
  * Function converts data in struct kbase_io_resources struct to an array of Linux resource structures. Note that function
  * assumes that size of linux_resource array is at least PLATFORM_CONFIG_RESOURCE_COUNT.
  * Resources are put in fixed order: I/O memory region, job IRQ, MMU IRQ, GPU IRQ.
- *
- * @param[in]  io_resource      Input IO resource data
- * @param[out] linux_resources  Pointer to output array of Linux resource structures
  */
 static void kbasep_config_parse_io_resources(const struct kbase_io_resources *io_resources, struct resource *const linux_resources)
 {
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_pm.c b/drivers/gpu/arm/bifrost/mali_kbase_pm.c
index 630ab1550045..3ded47ba85c5 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_pm.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_pm.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,15 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /**
- * @file mali_kbase_pm.c
- * Base kernel power management APIs
+ * DOC: Base kernel power management APIs
  */
 
 #include <mali_kbase.h>
@@ -191,7 +187,8 @@ void kbase_pm_driver_suspend(struct kbase_device *kbdev)
 
 #if !MALI_USE_CSF
 	/* Suspend job scheduler and associated components, so that it releases all
-	 * the PM active count references */
+	 * the PM active count references
+	 */
 	kbasep_js_suspend(kbdev);
 #else
 	kbase_csf_scheduler_pm_suspend(kbdev);
@@ -259,9 +256,15 @@ void kbase_pm_driver_resume(struct kbase_device *kbdev, bool arb_gpu_start)
 	kbase_pm_context_idle(kbdev);
 
 	/* Re-enable GPU hardware counters */
+#if MALI_USE_CSF
+	kbase_csf_scheduler_spin_lock(kbdev, &flags);
+	kbase_hwcnt_context_enable(kbdev->hwcnt_gpu_ctx);
+	kbase_csf_scheduler_spin_unlock(kbdev, flags);
+#else
 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
 	kbase_hwcnt_context_enable(kbdev->hwcnt_gpu_ctx);
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+#endif
 
 	/* Resume vinstr */
 	kbase_vinstr_resume(kbdev->vinstr_ctx);
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_pm.h b/drivers/gpu/arm/bifrost/mali_kbase_pm.h
index 13565186c11f..f7340dd4d903 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_pm.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_pm.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,14 +17,9 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /**
- * @file mali_kbase_pm.h
  * Power management API definitions
  */
 
@@ -66,12 +62,12 @@ int kbase_pm_powerup(struct kbase_device *kbdev, unsigned int flags);
 
 /**
  * Halt the power management framework.
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ *
  * Should ensure that no new interrupts are generated,
  * but allow any currently running interrupt handlers to complete successfully.
  * The GPU is forced off by the time this function returns, regardless of
  * whether or not the active power policy asks for the GPU to be powered off.
- *
- * @param kbdev     The kbase device structure for the device (must be a valid pointer)
  */
 void kbase_pm_halt(struct kbase_device *kbdev);
 
@@ -161,6 +157,7 @@ void kbase_pm_context_idle(struct kbase_device *kbdev);
 /**
  * Suspend the GPU and prevent any further register accesses to it from Kernel
  * threads.
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
  *
  * This is called in response to an OS suspend event, and calls into the various
  * kbase components to complete the suspend.
@@ -168,21 +165,18 @@ void kbase_pm_context_idle(struct kbase_device *kbdev);
  * @note the mechanisms used here rely on all user-space threads being frozen
  * by the OS before we suspend. Otherwise, an IOCTL could occur that powers up
  * the GPU e.g. via atom submission.
- *
- * @param kbdev     The kbase device structure for the device (must be a valid pointer)
  */
 void kbase_pm_suspend(struct kbase_device *kbdev);
 
 /**
  * Resume the GPU, allow register accesses to it, and resume running atoms on
  * the GPU.
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
  *
  * This is called in response to an OS resume event, and calls into the various
  * kbase components to complete the resume.
  *
  * Also called when using VM arbiter, when GPU access has been granted.
- *
- * @param kbdev     The kbase device structure for the device (must be a valid pointer)
  */
 void kbase_pm_resume(struct kbase_device *kbdev);
 
@@ -199,8 +193,7 @@ void kbase_pm_vsync_callback(int buffer_updated, void *data);
 
 /**
  * kbase_pm_driver_suspend() - Put GPU and driver in suspend state
- * @param kbdev     The kbase device structure for the device
- *                  (must be a valid pointer)
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
  *
  * Suspend the GPU and prevent any further register accesses to it from Kernel
  * threads.
@@ -219,8 +212,8 @@ void kbase_pm_driver_suspend(struct kbase_device *kbdev);
 
 /**
  * kbase_pm_driver_resume() - Put GPU and driver in resume
- * @param kbdev     The kbase device structure for the device
- *                  (must be a valid pointer)
+ * @kbdev: The kbase device structure for the device (must be a valid pointer)
+ * @arb_gpu_start: Arbiter has notified we can use GPU
  *
  * Resume the GPU, allow register accesses to it, and resume running atoms on
  * the GPU.
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_regs_history_debugfs.c b/drivers/gpu/arm/bifrost/mali_kbase_regs_history_debugfs.c
index 7b86c58440db..0e7b7f033fda 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_regs_history_debugfs.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_regs_history_debugfs.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2014, 2016, 2019-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "mali_kbase.h"
@@ -118,7 +117,7 @@ void kbase_io_history_add(struct kbase_io_history *h,
 void kbase_io_history_dump(struct kbase_device *kbdev)
 {
 	struct kbase_io_history *const h = &kbdev->io_history;
-	u16 i;
+	size_t i;
 	size_t iters;
 	unsigned long flags;
 
@@ -136,7 +135,7 @@ void kbase_io_history_dump(struct kbase_device *kbdev)
 			&h->buf[(h->count - iters + i) % h->size];
 		char const access = (io->addr & 1) ? 'w' : 'r';
 
-		dev_err(kbdev->dev, "%6i: %c: reg 0x%016lx val %08x\n", i,
+		dev_err(kbdev->dev, "%6zu: %c: reg 0x%016lx val %08x\n", i,
 			access, (unsigned long)(io->addr & ~0x1), io->value);
 	}
 
@@ -180,7 +179,7 @@ DEFINE_SIMPLE_ATTRIBUTE(regs_history_size_fops,
 static int regs_history_show(struct seq_file *sfile, void *data)
 {
 	struct kbase_io_history *const h = sfile->private;
-	u16 i;
+	size_t i;
 	size_t iters;
 	unsigned long flags;
 
@@ -199,8 +198,8 @@ static int regs_history_show(struct seq_file *sfile, void *data)
 			&h->buf[(h->count - iters + i) % h->size];
 		char const access = (io->addr & 1) ? 'w' : 'r';
 
-		seq_printf(sfile, "%6i: %c: reg 0x%016lx val %08x\n", i, access,
-				(unsigned long)(io->addr & ~0x1), io->value);
+		seq_printf(sfile, "%6zu: %c: reg 0x%016lx val %08x\n", i,
+			   access, (unsigned long)(io->addr & ~0x1), io->value);
 	}
 
 	spin_unlock_irqrestore(&h->lock, flags);
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_regs_history_debugfs.h b/drivers/gpu/arm/bifrost/mali_kbase_regs_history_debugfs.h
index 200c0c2d8de8..b202b22256c8 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_regs_history_debugfs.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_regs_history_debugfs.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2014, 2016, 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_reset_gpu.h b/drivers/gpu/arm/bifrost/mali_kbase_reset_gpu.h
index 61bbb0b48490..cb8a082f6293 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_reset_gpu.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_reset_gpu.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,16 +17,142 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_RESET_GPU_H_
 #define _KBASE_RESET_GPU_H_
 
+/**
+ * kbase_reset_gpu_prevent_and_wait - Prevent GPU resets from starting whilst
+ *                                    the current thread is accessing the GPU,
+ *                                    and wait for any in-flight reset to
+ *                                    finish.
+ * @kbdev: Device pointer
+ *
+ * This should be used when a potential access to the HW is going to be made
+ * from a non-atomic context.
+ *
+ * It will wait for any in-flight reset to finish before returning. Hence,
+ * correct lock ordering must be observed with respect to the calling thread
+ * and the reset worker thread.
+ *
+ * This does not synchronize general access to the HW, and so multiple threads
+ * can prevent GPU reset concurrently, whilst not being serialized. This is
+ * advantageous as the threads can make this call at points where they do not
+ * know for sure yet whether they will indeed access the GPU (for example, to
+ * respect lock ordering), without unnecessarily blocking others.
+ *
+ * Threads must still use other synchronization to ensure they access the HW
+ * consistently, at a point where they are certain it needs to be accessed.
+ *
+ * On success, ensure that when access to the GPU by the caller thread has
+ * finished, that it calls kbase_reset_gpu_allow() again to allow resets to
+ * happen.
+ *
+ * This may return a failure in cases such as a previous failure to reset the
+ * GPU within a reasonable time. If that happens, the GPU might be
+ * non-operational and the caller should not attempt any further access.
+ *
+ * Note:
+ * For atomic context, instead check kbase_reset_gpu_is_active().
+ *
+ * Return: 0 on success, or negative error code on failure.
+ */
+int kbase_reset_gpu_prevent_and_wait(struct kbase_device *kbdev);
+
+/**
+ * kbase_reset_gpu_try_prevent - Attempt to prevent GPU resets from starting
+ *                               whilst the current thread is accessing the
+ *                               GPU, unless a reset is already in progress.
+ * @kbdev: Device pointer
+ *
+ * Similar to kbase_reset_gpu_prevent_and_wait(), but it does not wait for an
+ * existing reset to complete. This can be used on codepaths that the Reset
+ * worker waits on, where use of kbase_reset_gpu_prevent_and_wait() would
+ * otherwise deadlock.
+ *
+ * Instead, a reset that is currently happening will cause this function to
+ * return an error code indicating that, and further resets will not have been
+ * prevented.
+ *
+ * In such cases, the caller must check for -EAGAIN, and take similar actions
+ * as for handling reset in atomic context. That is, they must cancel any
+ * actions that depended on reset being prevented, possibly deferring them
+ * until after the reset.
+ *
+ * Otherwise a successful return means that the caller can continue its actions
+ * safely in the knowledge that reset is prevented, and the reset worker will
+ * correctly wait instead of deadlocking against this thread.
+ *
+ * On success, ensure that when access to the GPU by the caller thread has
+ * finished, that it calls kbase_reset_gpu_allow() again to allow resets to
+ * happen.
+ *
+ * Refer to kbase_reset_gpu_prevent_and_wait() for more information.
+ *
+ * Return: 0 on success. -EAGAIN if a reset is currently happening. Other
+ * negative error codes on failure.
+ */
+int kbase_reset_gpu_try_prevent(struct kbase_device *kbdev);
+
+/**
+ * kbase_reset_gpu_allow - Allow GPU resets to happen again after having been
+ *                         previously prevented.
+ * @kbdev: Device pointer
+ *
+ * This should be used when a potential access to the HW has finished from a
+ * non-atomic context.
+ *
+ * It must be used from the same thread that originally made a previously call
+ * to kbase_reset_gpu_prevent_and_wait(). It must not be deferred to another
+ * thread.
+ */
+void kbase_reset_gpu_allow(struct kbase_device *kbdev);
+
+/**
+ * kbase_reset_gpu_assert_prevented - Make debugging checks that GPU reset is
+ *                                    currently prevented by the current
+ *                                    thread.
+ * @kbdev: Device pointer
+ *
+ * Make debugging checks that the current thread has made a call to
+ * kbase_reset_gpu_prevent_and_wait(), but has yet to make a subsequent call to
+ * kbase_reset_gpu_allow().
+ *
+ * CONFIG_LOCKDEP is required to prove that reset is indeed
+ * prevented. Otherwise only limited debugging checks can be made.
+ */
+void kbase_reset_gpu_assert_prevented(struct kbase_device *kbdev);
+
+/**
+ * kbase_reset_gpu_assert_failed_or_prevented - Make debugging checks that
+ *                                              either GPU reset previously
+ *                                              failed, or is currently
+ *                                              prevented.
+ *
+ * @kbdev: Device pointer
+ *
+ * As with kbase_reset_gpu_assert_prevented(), but also allow for paths where
+ * reset was not prevented due to a failure, yet we still need to execute the
+ * cleanup code following.
+ *
+ * Cleanup code following this call must handle any inconsistent state modified
+ * by the failed GPU reset, and must timeout any blocking operations instead of
+ * waiting forever.
+ */
+void kbase_reset_gpu_assert_failed_or_prevented(struct kbase_device *kbdev);
+
+/**
+ * Flags for kbase_prepare_to_reset_gpu
+ */
+#define RESET_FLAGS_NONE ((unsigned int)0)
+/* This reset should be treated as an unrecoverable error by HW counter logic */
+#define RESET_FLAGS_HWC_UNRECOVERABLE_ERROR ((unsigned int)(1 << 0))
+
 /**
  * kbase_prepare_to_reset_gpu_locked - Prepare for resetting the GPU.
  * @kbdev: Device pointer
+ * @flags: Bitfield indicating impact of reset (see flag defines)
  *
  * Caller is expected to hold the kbdev->hwaccess_lock.
  *
@@ -34,18 +161,20 @@
  * - false - Another thread is performing a reset, kbase_reset_gpu should
  *           not be called.
  */
-bool kbase_prepare_to_reset_gpu_locked(struct kbase_device *kbdev);
+bool kbase_prepare_to_reset_gpu_locked(struct kbase_device *kbdev,
+				       unsigned int flags);
 
 /**
  * kbase_prepare_to_reset_gpu - Prepare for resetting the GPU.
  * @kbdev: Device pointer
- *
+ * @flags: Bitfield indicating impact of reset (see flag defines)
+
  * Return: a boolean which should be interpreted as follows:
  * - true  - Prepared for reset, kbase_reset_gpu should be called.
  * - false - Another thread is performing a reset, kbase_reset_gpu should
  *           not be called.
  */
-bool kbase_prepare_to_reset_gpu(struct kbase_device *kbdev);
+bool kbase_prepare_to_reset_gpu(struct kbase_device *kbdev, unsigned int flags);
 
 /**
  * kbase_reset_gpu - Reset the GPU
@@ -95,8 +224,13 @@ int kbase_reset_gpu_silent(struct kbase_device *kbdev);
  * kbase_reset_gpu_is_active - Reports if the GPU is being reset
  * @kbdev: Device pointer
  *
- * Return: True if the GPU is in the process of being reset (or if the reset of
- * GPU failed, not applicable to Job Manager GPUs).
+ * Any changes made to the HW when this returns true may be lost, overwritten
+ * or corrupted.
+ *
+ * Note that unless appropriate locks are held when using this function, the
+ * state could change immediately afterwards.
+ *
+ * Return: True if the GPU is in the process of being reset.
  */
 bool kbase_reset_gpu_is_active(struct kbase_device *kbdev);
 
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_smc.c b/drivers/gpu/arm/bifrost/mali_kbase_smc.c
index b5c7b1289846..82c5a10a15f5 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_smc.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_smc.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2015, 2018, 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifdef CONFIG_ARM64
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_smc.h b/drivers/gpu/arm/bifrost/mali_kbase_smc.h
index 221eb21a8c7f..9b89c321bf19 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_smc.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_smc.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2015 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2015, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 #ifndef _KBASE_SMC_H_
 #define _KBASE_SMC_H_
 
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_softjobs.c b/drivers/gpu/arm/bifrost/mali_kbase_softjobs.c
index c164719b3d7b..f78063835ddd 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_softjobs.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_softjobs.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2011-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 #include <mali_kbase.h>
 
 #include <linux/dma-buf.h>
@@ -30,7 +27,7 @@
 #include <mali_kbase_sync.h>
 #endif
 #include <linux/dma-mapping.h>
-#include <mali_base_kernel.h>
+#include <uapi/gpu/arm/bifrost/mali_base_kernel.h>
 #include <mali_kbase_hwaccess_time.h>
 #include <mali_kbase_kinstr_jm.h>
 #include <mali_kbase_mem_linux.h>
@@ -45,9 +42,7 @@
 
 #if !MALI_USE_CSF
 /**
- * @file mali_kbase_softjobs.c
- *
- * This file implements the logic behind software only jobs that are
+ * DOC: This file implements the logic behind software only jobs that are
  * executed within the driver rather than being handed over to the GPU.
  */
 
@@ -138,7 +133,7 @@ static int kbase_dump_cpu_gpu_time(struct kbase_jd_atom *katom)
 	void *user_result;
 	struct timespec64 ts;
 	struct base_dump_cpu_gpu_counters data;
-	u64 system_time;
+	u64 system_time = 0ULL;
 	u64 cycle_counter;
 	u64 jc = katom->jc;
 	struct kbase_context *kctx = katom->kctx;
@@ -148,7 +143,11 @@ static int kbase_dump_cpu_gpu_time(struct kbase_jd_atom *katom)
 
 	/* Take the PM active reference as late as possible - otherwise, it could
 	 * delay suspend until we process the atom (which may be at the end of a
-	 * long chain of dependencies */
+	 * long chain of dependencies
+	 */
+#ifdef CONFIG_MALI_ARBITER_SUPPORT
+	atomic_inc(&kctx->kbdev->pm.gpu_users_waiting);
+#endif /* CONFIG_MALI_ARBITER_SUPPORT */
 	pm_active_err = kbase_pm_context_active_handle_suspend(kctx->kbdev, KBASE_PM_SUSPEND_HANDLER_DONT_REACTIVATE);
 	if (pm_active_err) {
 		struct kbasep_js_device_data *js_devdata = &kctx->kbdev->js_data;
@@ -166,6 +165,10 @@ static int kbase_dump_cpu_gpu_time(struct kbase_jd_atom *katom)
 
 		return pm_active_err;
 	}
+#ifdef CONFIG_MALI_ARBITER_SUPPORT
+	else
+		atomic_dec(&kctx->kbdev->pm.gpu_users_waiting);
+#endif /* CONFIG_MALI_ARBITER_SUPPORT */
 
 	kbase_backend_get_gpu_time(kctx->kbdev, &cycle_counter, &system_time,
 									&ts);
@@ -183,7 +186,8 @@ static int kbase_dump_cpu_gpu_time(struct kbase_jd_atom *katom)
 	/* GPU_WR access is checked on the range for returning the result to
 	 * userspace for the following reasons:
 	 * - security, this is currently how imported user bufs are checked.
-	 * - userspace ddk guaranteed to assume region was mapped as GPU_WR */
+	 * - userspace ddk guaranteed to assume region was mapped as GPU_WR
+	 */
 	user_result = kbase_vmap_prot(kctx, jc, sizeof(data), KBASE_REG_GPU_WR, &map);
 	if (!user_result)
 		return 0;
@@ -294,7 +298,7 @@ static void kbase_fence_debug_check_atom(struct kbase_jd_atom *katom)
 
 				if (!kbase_sync_fence_in_info_get(dep, &info)) {
 					dev_warn(dev,
-						 "\tVictim trigger atom %d fence [%p] %s: %s\n",
+						 "\tVictim trigger atom %d fence [%pK] %s: %s\n",
 						 kbase_jd_atom_id(kctx, dep),
 						 info.fence,
 						 info.name,
@@ -323,11 +327,11 @@ static void kbase_fence_debug_wait_timeout(struct kbase_jd_atom *katom)
 		return;
 	}
 
-	dev_warn(dev, "ctx %d_%d: Atom %d still waiting for fence [%p] after %dms\n",
+	dev_warn(dev, "ctx %d_%d: Atom %d still waiting for fence [%pK] after %dms\n",
 		 kctx->tgid, kctx->id,
 		 kbase_jd_atom_id(kctx, katom),
 		 info.fence, timeout_ms);
-	dev_warn(dev, "\tGuilty fence [%p] %s: %s\n",
+	dev_warn(dev, "\tGuilty fence [%pK] %s: %s\n",
 		 info.fence, info.name,
 		 kbase_sync_status_string(info.status));
 
@@ -715,7 +719,8 @@ static int kbase_debug_copy_prepare(struct kbase_jd_atom *katom)
 
 out_cleanup:
 	/* Frees allocated memory for kbase_debug_copy_job struct, including
-	 * members, and sets jc to 0 */
+	 * members, and sets jc to 0
+	 */
 	kbase_debug_copy_finish(katom);
 	kfree(user_buffers);
 
@@ -723,7 +728,7 @@ static int kbase_debug_copy_prepare(struct kbase_jd_atom *katom)
 }
 #endif /* !MALI_USE_CSF */
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)
+#if KERNEL_VERSION(5, 6, 0) <= LINUX_VERSION_CODE
 static void *dma_buf_kmap_page(struct kbase_mem_phy_alloc *gpu_alloc,
 	unsigned long page_num, struct page **page)
 {
@@ -804,16 +809,16 @@ int kbase_mem_copy_from_extres(struct kbase_context *kctx,
 		dma_to_copy = min(dma_buf->size,
 			(size_t)(buf_data->nr_extres_pages * PAGE_SIZE));
 		ret = dma_buf_begin_cpu_access(dma_buf,
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0) && !defined(CONFIG_CHROMEOS)
-				0, dma_to_copy,
+#if KERNEL_VERSION(4, 6, 0) > LINUX_VERSION_CODE && !defined(CONFIG_CHROMEOS)
+					       0, dma_to_copy,
 #endif
-				DMA_FROM_DEVICE);
+					       DMA_FROM_DEVICE);
 		if (ret)
 			goto out_unlock;
 
 		for (i = 0; i < dma_to_copy/PAGE_SIZE &&
 				target_page_nr < buf_data->nr_pages; i++) {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)
+#if KERNEL_VERSION(5, 6, 0) <= LINUX_VERSION_CODE
 			struct page *pg;
 			void *extres_page = dma_buf_kmap_page(gpu_alloc, i, &pg);
 #else
@@ -825,20 +830,20 @@ int kbase_mem_copy_from_extres(struct kbase_context *kctx,
 						buf_data->nr_pages,
 						&target_page_nr, offset);
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)
+#if KERNEL_VERSION(5, 6, 0) <= LINUX_VERSION_CODE
 				kunmap(pg);
 #else
 				dma_buf_kunmap(dma_buf, i, extres_page);
 #endif
 				if (ret)
-					goto out_unlock;
+					break;
 			}
 		}
 		dma_buf_end_cpu_access(dma_buf,
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0) && !defined(CONFIG_CHROMEOS)
-				0, dma_to_copy,
+#if KERNEL_VERSION(4, 6, 0) > LINUX_VERSION_CODE && !defined(CONFIG_CHROMEOS)
+				       0, dma_to_copy,
 #endif
-				DMA_FROM_DEVICE);
+				       DMA_FROM_DEVICE);
 		break;
 	}
 	default:
@@ -926,11 +931,6 @@ int kbasep_jit_alloc_validate(struct kbase_context *kctx,
 
 #if !MALI_USE_CSF
 
-#if (KERNEL_VERSION(3, 18, 63) > LINUX_VERSION_CODE)
-#define offsetofend(TYPE, MEMBER) \
-	(offsetof(TYPE, MEMBER) + sizeof(((TYPE *)0)->MEMBER))
-#endif
-
 /*
  * Sizes of user data to copy for each just-in-time memory interface version
  *
@@ -1006,10 +1006,10 @@ static int kbase_jit_allocate_prepare(struct kbase_jd_atom *katom)
 		ret = kbasep_jit_alloc_validate(kctx, info);
 		if (ret)
 			goto free_info;
-		KBASE_TLSTREAM_TL_ATTRIB_ATOM_JITALLOCINFO(kbdev, katom,
-			info->va_pages, info->commit_pages, info->extent,
-			info->id, info->bin_id, info->max_allocations,
-			info->flags, info->usage_id);
+		KBASE_TLSTREAM_TL_ATTRIB_ATOM_JITALLOCINFO(
+			kbdev, katom, info->va_pages, info->commit_pages,
+			info->extension, info->id, info->bin_id,
+			info->max_allocations, info->flags, info->usage_id);
 	}
 
 	katom->jit_blocked = false;
@@ -1024,7 +1024,7 @@ static int kbase_jit_allocate_prepare(struct kbase_jd_atom *katom)
 	 * though the region is valid it doesn't represent the
 	 * same thing it used to.
 	 *
-	 * Complete validation of va_pages, commit_pages and extent
+	 * Complete validation of va_pages, commit_pages and extension
 	 * isn't done here as it will be done during the call to
 	 * kbase_mem_alloc.
 	 */
@@ -1100,7 +1100,7 @@ static int kbase_jit_allocate_process(struct kbase_jd_atom *katom)
 	}
 
 #if MALI_JIT_PRESSURE_LIMIT_BASE
-	/**
+	/*
 	 * If this is the only JIT_ALLOC atom in-flight or if JIT pressure limit
 	 * is disabled at the context scope, then bypass JIT pressure limit
 	 * logic in kbase_jit_allocate().
@@ -1228,10 +1228,10 @@ static int kbase_jit_allocate_process(struct kbase_jd_atom *katom)
 			 MIDGARD_MMU_BOTTOMLEVEL, kctx->jit_group_id);
 #endif
 
-		KBASE_TLSTREAM_TL_ATTRIB_ATOM_JIT(kbdev, katom,
-			info->gpu_alloc_addr, new_addr, info->flags,
-			entry_mmu_flags, info->id, info->commit_pages,
-			info->extent, info->va_pages);
+		KBASE_TLSTREAM_TL_ATTRIB_ATOM_JIT(
+			kbdev, katom, info->gpu_alloc_addr, new_addr,
+			info->flags, entry_mmu_flags, info->id,
+			info->commit_pages, info->extension, info->va_pages);
 		kbase_vunmap(kctx, &mapping);
 
 		kbase_trace_jit_report_gpu_mem(kctx, reg,
@@ -1429,41 +1429,27 @@ static int kbase_ext_res_prepare(struct kbase_jd_atom *katom)
 	struct base_external_resource_list *ext_res;
 	u64 count = 0;
 	size_t copy_size;
-	int ret;
 
 	user_ext_res = (__user struct base_external_resource_list *)
 			(uintptr_t) katom->jc;
 
 	/* Fail the job if there is no info structure */
-	if (!user_ext_res) {
-		ret = -EINVAL;
-		goto fail;
-	}
+	if (!user_ext_res)
+		return -EINVAL;
 
-	if (copy_from_user(&count, &user_ext_res->count, sizeof(u64)) != 0) {
-		ret = -EINVAL;
-		goto fail;
-	}
+	if (copy_from_user(&count, &user_ext_res->count, sizeof(u64)) != 0)
+		return -EINVAL;
 
 	/* Is the number of external resources in range? */
-	if (!count || count > BASE_EXT_RES_COUNT_MAX) {
-		ret = -EINVAL;
-		goto fail;
-	}
+	if (!count || count > BASE_EXT_RES_COUNT_MAX)
+		return -EINVAL;
 
 	/* Copy the information for safe access and future storage */
 	copy_size = sizeof(*ext_res);
 	copy_size += sizeof(struct base_external_resource) * (count - 1);
-	ext_res = kzalloc(copy_size, GFP_KERNEL);
-	if (!ext_res) {
-		ret = -ENOMEM;
-		goto fail;
-	}
-
-	if (copy_from_user(ext_res, user_ext_res, copy_size) != 0) {
-		ret = -EINVAL;
-		goto free_info;
-	}
+	ext_res = memdup_user(user_ext_res, copy_size);
+	if (IS_ERR(ext_res))
+		return PTR_ERR(ext_res);
 
 	/*
 	 * Overwrite the count with the first value incase it was changed
@@ -1474,11 +1460,6 @@ static int kbase_ext_res_prepare(struct kbase_jd_atom *katom)
 	katom->softjob_data = ext_res;
 
 	return 0;
-
-free_info:
-	kfree(ext_res);
-fail:
-	return ret;
 }
 
 static void kbase_ext_res_process(struct kbase_jd_atom *katom, bool map)
@@ -1654,7 +1635,9 @@ int kbase_prepare_soft_job(struct kbase_jd_atom *katom)
 			struct base_fence fence;
 			int fd;
 
-			if (0 != copy_from_user(&fence, (__user void *)(uintptr_t) katom->jc, sizeof(fence)))
+			if (copy_from_user(&fence,
+					   (__user void *)(uintptr_t)katom->jc,
+					   sizeof(fence)) != 0)
 				return -EINVAL;
 
 			fd = kbase_sync_fence_out_create(katom,
@@ -1663,7 +1646,8 @@ int kbase_prepare_soft_job(struct kbase_jd_atom *katom)
 				return -EINVAL;
 
 			fence.basep.fd = fd;
-			if (0 != copy_to_user((__user void *)(uintptr_t) katom->jc, &fence, sizeof(fence))) {
+			if (copy_to_user((__user void *)(uintptr_t)katom->jc,
+					 &fence, sizeof(fence)) != 0) {
 				kbase_sync_fence_out_remove(katom);
 				kbase_sync_fence_close_fd(fd);
 				fence.basep.fd = -EINVAL;
@@ -1676,7 +1660,9 @@ int kbase_prepare_soft_job(struct kbase_jd_atom *katom)
 			struct base_fence fence;
 			int ret;
 
-			if (0 != copy_from_user(&fence, (__user void *)(uintptr_t) katom->jc, sizeof(fence)))
+			if (copy_from_user(&fence,
+					   (__user void *)(uintptr_t)katom->jc,
+					   sizeof(fence)) != 0)
 				return -EINVAL;
 
 			/* Get a reference to the fence object */
@@ -1795,6 +1781,9 @@ void kbase_resume_suspended_soft_jobs(struct kbase_device *kbdev)
 		if (kbase_process_soft_job(katom_iter) == 0) {
 			kbase_finish_soft_job(katom_iter);
 			resched |= jd_done_nolock(katom_iter, NULL);
+#ifdef CONFIG_MALI_ARBITER_SUPPORT
+			atomic_dec(&kbdev->pm.gpu_users_waiting);
+#endif /* CONFIG_MALI_ARBITER_SUPPORT */
 		}
 		mutex_unlock(&kctx->jctx.lock);
 	}
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_strings.c b/drivers/gpu/arm/bifrost/mali_kbase_strings.c
index 22caa4a6d814..f38093031494 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_strings.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_strings.c
@@ -1,11 +1,12 @@
- /*
+// SPDX-License-Identifier: GPL-2.0
+/*
  *
- * (C) COPYRIGHT 2010-2016 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2016, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,9 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
+
 #include "mali_kbase_strings.h"
 
 #define KBASE_DRV_NAME "mali"
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_strings.h b/drivers/gpu/arm/bifrost/mali_kbase_strings.h
index d2f1825314fe..e6ec7f3bc050 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_strings.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_strings.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2010-2016 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2016, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 extern const char kbase_drv_name[];
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_sync.h b/drivers/gpu/arm/bifrost/mali_kbase_sync.h
index 4e5ab3ca557a..ae3601f9bee4 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_sync.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_sync.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2012-2016, 2018-2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2016, 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,14 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
- * @file mali_kbase_sync.h
- *
- * This file contains our internal "API" for explicit fences.
+ * DOC: This file contains our internal "API" for explicit fences.
  * It hides the implementation details of the actual explicit fence mechanism
  * used (Android fences or sync file with DMA fences).
  */
@@ -31,6 +28,7 @@
 #ifndef MALI_KBASE_SYNC_H
 #define MALI_KBASE_SYNC_H
 
+#include <linux/fdtable.h>
 #include <linux/syscalls.h>
 #ifdef CONFIG_SYNC
 #include <sync.h>
@@ -165,7 +163,9 @@ void kbase_sync_fence_out_remove(struct kbase_jd_atom *katom);
  */
 static inline void kbase_sync_fence_close_fd(int fd)
 {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 17, 0)
+#if KERNEL_VERSION(5, 11, 0) <= LINUX_VERSION_CODE
+	close_fd(fd);
+#elif KERNEL_VERSION(4, 17, 0) <= LINUX_VERSION_CODE
 	ksys_close(fd);
 #else
 	sys_close(fd);
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_sync_android.c b/drivers/gpu/arm/bifrost/mali_kbase_sync_android.c
index 41f740a7bc8c..e3d2e5555d23 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_sync_android.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_sync_android.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2012-2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2017, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -50,15 +49,6 @@ struct mali_sync_pt {
 	int result;
 };
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
-/* For backwards compatibility with kernels before 3.17. After 3.17
- * sync_pt_parent is included in the kernel. */
-static inline struct sync_timeline *sync_pt_parent(struct sync_pt *pt)
-{
-	return pt->parent;
-}
-#endif
-
 static struct mali_sync_timeline *to_mali_sync_timeline(
 						struct sync_timeline *timeline)
 {
@@ -196,6 +186,7 @@ int kbase_sync_fence_stream_create(const char *name, int *const out_fd)
 	return 0;
 }
 
+#if !MALI_USE_CSF
 /* Allocates a sync point within the timeline.
  *
  * The timeline must be the one allocated by kbase_sync_timeline_alloc
@@ -225,10 +216,6 @@ int kbase_sync_fence_out_create(struct kbase_jd_atom *katom, int tl_fd)
 	struct sync_timeline *tl;
 	struct sync_pt *pt;
 	struct sync_fence *fence;
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 7, 0)
-	struct files_struct *files;
-	struct fdtable *fdt;
-#endif
 	int fd;
 	struct file *tl_file;
 
@@ -259,29 +246,11 @@ int kbase_sync_fence_out_create(struct kbase_jd_atom *katom, int tl_fd)
 	/* from here the fence owns the sync_pt */
 
 	/* create a fd representing the fence */
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0)
 	fd = get_unused_fd_flags(O_RDWR | O_CLOEXEC);
 	if (fd < 0) {
 		sync_fence_put(fence);
 		goto out;
 	}
-#else
-	fd = get_unused_fd();
-	if (fd < 0) {
-		sync_fence_put(fence);
-		goto out;
-	}
-
-	files = current->files;
-	spin_lock(&files->file_lock);
-	fdt = files_fdtable(files);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)
-	__set_close_on_exec(fd, fdt);
-#else
-	FD_SET(fd, fdt->close_on_exec);
-#endif
-	spin_unlock(&files->file_lock);
-#endif  /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0) */
 
 	/* bind fence to the new fd */
 	sync_fence_install(fence, fd);
@@ -289,7 +258,8 @@ int kbase_sync_fence_out_create(struct kbase_jd_atom *katom, int tl_fd)
 	katom->fence = sync_fence_fdget(fd);
 	if (katom->fence == NULL) {
 		/* The only way the fence can be NULL is if userspace closed it
-		 * for us, so we don't need to clear it up */
+		 * for us, so we don't need to clear it up
+		 */
 		fd = -EINVAL;
 		goto out;
 	}
@@ -305,6 +275,7 @@ int kbase_sync_fence_in_from_fd(struct kbase_jd_atom *katom, int fd)
 	katom->fence = sync_fence_fdget(fd);
 	return katom->fence ? 0 : -ENOENT;
 }
+#endif /* !MALI_USE_CSF */
 
 int kbase_sync_fence_validate(int fd)
 {
@@ -318,6 +289,7 @@ int kbase_sync_fence_validate(int fd)
 	return 0;
 }
 
+#if !MALI_USE_CSF
 /* Returns true if the specified timeline is allocated by Mali */
 static int kbase_sync_timeline_is_ours(struct sync_timeline *timeline)
 {
@@ -376,22 +348,14 @@ kbase_sync_fence_out_trigger(struct kbase_jd_atom *katom, int result)
 	if (!katom->fence)
 		return BASE_JD_EVENT_JOB_CANCELLED;
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
-	if (!list_is_singular(&katom->fence->pt_list_head)) {
-#else
 	if (katom->fence->num_fences != 1) {
-#endif
 		/* Not exactly one item in the list - so it didn't (directly)
-		 * come from us */
+		 * come from us
+		 */
 		return BASE_JD_EVENT_JOB_CANCELLED;
 	}
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
-	pt = list_first_entry(&katom->fence->pt_list_head,
-			      struct sync_pt, pt_list);
-#else
 	pt = container_of(katom->fence->cbs[0].sync_pt, struct sync_pt, base);
-#endif
 	timeline = sync_pt_parent(pt);
 
 	if (!kbase_sync_timeline_is_ours(timeline)) {
@@ -413,11 +377,7 @@ static inline int kbase_fence_get_status(struct sync_fence *fence)
 	if (!fence)
 		return -ENOENT;
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
-	return fence->status;
-#else
 	return atomic_read(&fence->status);
-#endif
 }
 
 static void kbase_fence_wait_callback(struct sync_fence *fence,
@@ -461,7 +421,8 @@ int kbase_sync_fence_in_wait(struct kbase_jd_atom *katom)
 	if (ret < 0) {
 		katom->event_code = BASE_JD_EVENT_JOB_CANCELLED;
 		/* We should cause the dependent jobs in the bag to be failed,
-		 * to do this we schedule the work queue to complete this job */
+		 * to do this we schedule the work queue to complete this job
+		 */
 		INIT_WORK(&katom->work, kbase_sync_fence_wait_worker);
 		queue_work(katom->kctx->jctx.job_done_wq, &katom->work);
 	}
@@ -473,7 +434,8 @@ void kbase_sync_fence_in_cancel_wait(struct kbase_jd_atom *katom)
 {
 	if (sync_fence_cancel_async(katom->fence, &katom->sync_waiter) != 0) {
 		/* The wait wasn't cancelled - leave the cleanup for
-		 * kbase_fence_wait_callback */
+		 * kbase_fence_wait_callback
+		 */
 		return;
 	}
 
@@ -540,3 +502,4 @@ void kbase_sync_fence_in_dump(struct kbase_jd_atom *katom)
 		sync_fence_wait(katom->fence, 1);
 }
 #endif
+#endif /* !MALI_USE_CSF */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_sync_common.c b/drivers/gpu/arm/bifrost/mali_kbase_sync_common.c
index 866894bd0f94..39a68c268bd1 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_sync_common.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_sync_common.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2012-2016, 2018-2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2016, 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
- * @file mali_kbase_sync_common.c
+ * @file
  *
  * Common code for our explicit fence functionality
  */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_sync_file.c b/drivers/gpu/arm/bifrost/mali_kbase_sync_file.c
index 271873b9fe29..76ce17d4bd1f 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_sync_file.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_sync_file.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2012-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -62,7 +61,7 @@ int kbase_sync_fence_stream_create(const char *name, int *const out_fd)
 #if !MALI_USE_CSF
 int kbase_sync_fence_out_create(struct kbase_jd_atom *katom, int stream_fd)
 {
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 	struct fence *fence;
 #else
 	struct dma_fence *fence;
@@ -107,7 +106,7 @@ int kbase_sync_fence_out_create(struct kbase_jd_atom *katom, int stream_fd)
 
 int kbase_sync_fence_in_from_fd(struct kbase_jd_atom *katom, int fd)
 {
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 	struct fence *fence = sync_file_get_fence(fd);
 #else
 	struct dma_fence *fence = sync_file_get_fence(fd);
@@ -124,7 +123,7 @@ int kbase_sync_fence_in_from_fd(struct kbase_jd_atom *katom, int fd)
 
 int kbase_sync_fence_validate(int fd)
 {
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 	struct fence *fence = sync_file_get_fence(fd);
 #else
 	struct dma_fence *fence = sync_file_get_fence(fd);
@@ -160,7 +159,7 @@ kbase_sync_fence_out_trigger(struct kbase_jd_atom *katom, int result)
 	return (result != 0) ? BASE_JD_EVENT_JOB_CANCELLED : BASE_JD_EVENT_DONE;
 }
 
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 static void kbase_fence_wait_callback(struct fence *fence,
 				      struct fence_cb *cb)
 #else
@@ -203,7 +202,7 @@ static void kbase_fence_wait_callback(struct dma_fence *fence,
 int kbase_sync_fence_in_wait(struct kbase_jd_atom *katom)
 {
 	int err;
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 	struct fence *fence;
 #else
 	struct dma_fence *fence;
@@ -236,8 +235,8 @@ int kbase_sync_fence_in_wait(struct kbase_jd_atom *katom)
 		katom->event_code = BASE_JD_EVENT_JOB_CANCELLED;
 
 		/* We should cause the dependent jobs in the bag to be failed,
-		 * to do this we schedule the work queue to complete this job */
-
+		 * to do this we schedule the work queue to complete this job
+		 */
 		INIT_WORK(&katom->work, kbase_sync_fence_wait_worker);
 		queue_work(katom->kctx->jctx.job_done_wq, &katom->work);
 	}
@@ -249,7 +248,8 @@ void kbase_sync_fence_in_cancel_wait(struct kbase_jd_atom *katom)
 {
 	if (!kbase_fence_free_callbacks(katom)) {
 		/* The wait wasn't cancelled -
-		 * leave the cleanup for kbase_fence_wait_callback */
+		 * leave the cleanup for kbase_fence_wait_callback
+		 */
 		return;
 	}
 
@@ -325,7 +325,7 @@ void kbase_sync_fence_info_get(struct dma_fence *fence,
 int kbase_sync_fence_in_info_get(struct kbase_jd_atom *katom,
 				 struct kbase_sync_fence_info *info)
 {
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 	struct fence *fence;
 #else
 	struct dma_fence *fence;
@@ -345,7 +345,7 @@ int kbase_sync_fence_in_info_get(struct kbase_jd_atom *katom,
 int kbase_sync_fence_out_info_get(struct kbase_jd_atom *katom,
 				  struct kbase_sync_fence_info *info)
 {
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
+#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
 	struct fence *fence;
 #else
 	struct dma_fence *fence;
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_trace_gpu_mem.c b/drivers/gpu/arm/bifrost/mali_kbase_trace_gpu_mem.c
index 7669895b3c5d..0458e17c48a2 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_trace_gpu_mem.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_trace_gpu_mem.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
@@ -127,31 +126,31 @@ static bool kbase_capture_dma_buf_mapping(struct kbase_context *kctx,
 	}
 
 	if (unique_buf_imported) {
-		struct kbase_dma_buf *buf_node =
-			kzalloc(sizeof(*buf_node), GFP_KERNEL);
+		struct kbase_dma_buf *new_buf_node =
+			kzalloc(sizeof(*new_buf_node), GFP_KERNEL);
 
-		if (buf_node == NULL) {
+		if (new_buf_node == NULL) {
 			dev_err(kctx->kbdev->dev, "Error allocating memory for kbase_dma_buf\n");
 			/* Dont account for it if we fail to allocate memory */
 			unique_buf_imported = false;
 		} else {
 			struct rb_node **new = &(root->rb_node), *parent = NULL;
 
-			buf_node->dma_buf = dma_buf;
-			buf_node->import_count = 1;
+			new_buf_node->dma_buf = dma_buf;
+			new_buf_node->import_count = 1;
 			while (*new) {
-				struct kbase_dma_buf *node;
+				struct kbase_dma_buf *new_node;
 
 				parent = *new;
-				node = rb_entry(parent, struct kbase_dma_buf,
-						dma_buf_node);
-				if (dma_buf < node->dma_buf)
+				new_node = rb_entry(parent, struct kbase_dma_buf,
+						   dma_buf_node);
+				if (dma_buf < new_node->dma_buf)
 					new = &(*new)->rb_left;
 				else
 					new = &(*new)->rb_right;
 			}
-			rb_link_node(&buf_node->dma_buf_node, parent, new);
-			rb_insert_color(&buf_node->dma_buf_node, root);
+			rb_link_node(&new_buf_node->dma_buf_node, parent, new);
+			rb_insert_color(&new_buf_node->dma_buf_node, root);
 		}
 	} else if (!WARN_ON(!buf_node)) {
 		buf_node->import_count++;
@@ -220,8 +219,3 @@ void kbase_add_dma_buf_usage(struct kbase_context *kctx,
 
 	mutex_unlock(&kbdev->dma_buf_lock);
 }
-
-#if !defined(CONFIG_TRACE_GPU_MEM) && !MALI_CUSTOMER_RELEASE
-#define CREATE_TRACE_POINTS
-#include "mali_gpu_mem_trace.h"
-#endif
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_trace_gpu_mem.h b/drivers/gpu/arm/bifrost/mali_kbase_trace_gpu_mem.h
index 7e95956f3132..b78b553809b5 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_trace_gpu_mem.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_trace_gpu_mem.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_TRACE_GPU_MEM_H_
@@ -25,8 +24,6 @@
 
 #ifdef CONFIG_TRACE_GPU_MEM
 #include <trace/events/gpu_mem.h>
-#elif !MALI_CUSTOMER_RELEASE
-#include "mali_gpu_mem_trace.h"
 #endif
 
 #define DEVICE_TGID ((u32) 0U)
@@ -34,9 +31,9 @@
 static void kbase_trace_gpu_mem_usage(struct kbase_device *kbdev,
 				      struct kbase_context *kctx)
 {
+#ifdef CONFIG_TRACE_GPU_MEM
 	lockdep_assert_held(&kbdev->gpu_mem_usage_lock);
 
-#if defined(CONFIG_TRACE_GPU_MEM) || !MALI_CUSTOMER_RELEASE
 	trace_gpu_mem_total(kbdev->id, DEVICE_TGID,
 			    kbdev->total_gpu_pages << PAGE_SHIFT);
 
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_utility.h b/drivers/gpu/arm/bifrost/mali_kbase_utility.h
index 8d4f044376a9..5911969d2ecd 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_utility.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_utility.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2012-2013, 2015, 2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2012-2013, 2015, 2018, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 #ifndef _KBASE_UTILITY_H
 #define _KBASE_UTILITY_H
 
@@ -32,7 +29,7 @@
 static inline void kbase_timer_setup(struct timer_list *timer,
 				     void (*callback)(struct timer_list *timer))
 {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0)
+#if KERNEL_VERSION(4, 14, 0) > LINUX_VERSION_CODE
 	setup_timer(timer, (void (*)(unsigned long)) callback,
 			(unsigned long) timer);
 #else
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_vinstr.c b/drivers/gpu/arm/bifrost/mali_kbase_vinstr.c
index 3b0e2d6855ce..bc992bb947a0 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_vinstr.c
+++ b/drivers/gpu/arm/bifrost/mali_kbase_vinstr.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2011-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,16 +17,14 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "mali_kbase_vinstr.h"
 #include "mali_kbase_hwcnt_virtualizer.h"
 #include "mali_kbase_hwcnt_types.h"
-#include "mali_kbase_hwcnt_reader.h"
+#include <uapi/gpu/arm/bifrost/mali_kbase_hwcnt_reader.h>
 #include "mali_kbase_hwcnt_gpu.h"
-#include "mali_kbase_ioctl.h"
+#include <uapi/gpu/arm/bifrost/mali_kbase_ioctl.h>
 #include "mali_malisw.h"
 #include "mali_kbase_debug.h"
 
@@ -33,6 +32,7 @@
 #include <linux/fcntl.h>
 #include <linux/fs.h>
 #include <linux/hrtimer.h>
+#include <linux/log2.h>
 #include <linux/mm.h>
 #include <linux/mutex.h>
 #include <linux/poll.h>
@@ -359,11 +359,7 @@ static enum hrtimer_restart kbasep_vinstr_dump_timer(struct hrtimer *timer)
 	 * cancelled, and the worker itself won't reschedule this timer if
 	 * suspend_count != 0.
 	 */
-#if KERNEL_VERSION(3, 16, 0) > LINUX_VERSION_CODE
-	queue_work(system_wq, &vctx->dump_work);
-#else
-	queue_work(system_highpri_wq, &vctx->dump_work);
-#endif
+	kbase_hwcnt_virtualizer_queue_work(vctx->hvirt, &vctx->dump_work);
 	return HRTIMER_NORESTART;
 }
 
@@ -389,7 +385,7 @@ static void kbasep_vinstr_client_destroy(struct kbase_vinstr_client *vcli)
  *                                 the vinstr context.
  * @vctx:     Non-NULL pointer to vinstr context.
  * @setup:    Non-NULL pointer to hardware counter ioctl setup structure.
- *            setup->buffer_count must not be 0.
+ *            setup->buffer_count must not be 0 and must be a power of 2.
  * @out_vcli: Non-NULL pointer to where created client will be stored on
  *            success.
  *
@@ -407,6 +403,7 @@ static int kbasep_vinstr_client_create(
 	WARN_ON(!vctx);
 	WARN_ON(!setup);
 	WARN_ON(setup->buffer_count == 0);
+	WARN_ON(!is_power_of_2(setup->buffer_count));
 
 	vcli = kzalloc(sizeof(*vcli), GFP_KERNEL);
 	if (!vcli)
@@ -565,11 +562,8 @@ void kbase_vinstr_resume(struct kbase_vinstr_context *vctx)
 			}
 
 			if (has_periodic_clients)
-#if KERNEL_VERSION(3, 16, 0) > LINUX_VERSION_CODE
-				queue_work(system_wq, &vctx->dump_work);
-#else
-				queue_work(system_highpri_wq, &vctx->dump_work);
-#endif
+				kbase_hwcnt_virtualizer_queue_work(
+					vctx->hvirt, &vctx->dump_work);
 		}
 	}
 
@@ -586,7 +580,8 @@ int kbase_vinstr_hwcnt_reader_setup(
 
 	if (!vctx || !setup ||
 	    (setup->buffer_count == 0) ||
-	    (setup->buffer_count > MAX_BUFFER_COUNT))
+	    (setup->buffer_count > MAX_BUFFER_COUNT) ||
+	    !is_power_of_2(setup->buffer_count))
 		return -EINVAL;
 
 	errcode = kbasep_vinstr_client_create(vctx, setup, &vcli);
@@ -719,7 +714,9 @@ static long kbasep_vinstr_hwcnt_reader_ioctl_get_buffer(
 	if (unlikely(copy_to_user(buffer, meta, min_size)))
 		return -EFAULT;
 
-	atomic_inc(&cli->meta_idx);
+	/* Compare exchange meta idx to protect against concurrent getters */
+	if (meta_idx != atomic_cmpxchg(&cli->meta_idx, meta_idx, meta_idx + 1))
+		return -EBUSY;
 
 	return 0;
 }
@@ -791,7 +788,13 @@ static long kbasep_vinstr_hwcnt_reader_ioctl_put_buffer(
 		goto out;
 	}
 
-	atomic_inc(&cli->read_idx);
+	/* Compare exchange read idx to protect against concurrent putters */
+	if (read_idx !=
+	    atomic_cmpxchg(&cli->read_idx, read_idx, read_idx + 1)) {
+		ret = -EPERM;
+		goto out;
+	}
+
 out:
 	if (unlikely(kbuf != stack_kbuf))
 		kfree(kbuf);
@@ -823,11 +826,8 @@ static long kbasep_vinstr_hwcnt_reader_ioctl_set_interval(
 	 * worker is already queued.
 	 */
 	if ((interval != 0) && (cli->vctx->suspend_count == 0))
-#if KERNEL_VERSION(3, 16, 0) > LINUX_VERSION_CODE
-		queue_work(system_wq, &cli->vctx->dump_work);
-#else
-		queue_work(system_highpri_wq, &cli->vctx->dump_work);
-#endif
+		kbase_hwcnt_virtualizer_queue_work(cli->vctx->hvirt,
+						   &cli->vctx->dump_work);
 
 	mutex_unlock(&cli->vctx->lock);
 
@@ -898,11 +898,12 @@ static long kbasep_vinstr_hwcnt_reader_ioctl_get_api_version(
 	struct kbase_vinstr_client *cli, unsigned long arg, size_t size)
 {
 	long ret = -EINVAL;
-	u8 clk_cnt = cli->vctx->metadata->clk_cnt;
 
 	if (size == sizeof(u32)) {
 		ret = put_user(HWCNT_READER_API, (u32 __user *)arg);
 	} else if (size == sizeof(struct kbase_hwcnt_reader_api_version)) {
+		u8 clk_cnt = cli->vctx->metadata->clk_cnt;
+		unsigned long bytes = 0;
 		struct kbase_hwcnt_reader_api_version api_version = {
 			.version = HWCNT_READER_API,
 			.features = KBASE_HWCNT_READER_API_VERSION_NO_FEATURE,
@@ -915,8 +916,16 @@ static long kbasep_vinstr_hwcnt_reader_ioctl_get_api_version(
 			api_version.features |=
 			    KBASE_HWCNT_READER_API_VERSION_FEATURE_CYCLES_SHADER_CORES;
 
-		ret = copy_to_user(
+		bytes = copy_to_user(
 			(void __user *)arg, &api_version, sizeof(api_version));
+
+		/* copy_to_user returns zero in case of success.
+		 * If it fails, it returns the number of bytes that could NOT be copied
+		 */
+		if (bytes == 0)
+			ret = 0;
+		else
+			ret = -EFAULT;
 	}
 	return ret;
 }
@@ -1042,7 +1051,16 @@ static int kbasep_vinstr_hwcnt_reader_mmap(
 		return -EINVAL;
 
 	vm_size = vma->vm_end - vma->vm_start;
-	size = cli->dump_bufs.buf_cnt * cli->vctx->metadata->dump_buf_bytes;
+
+	/* The mapping is allowed to span the entirety of the page allocation,
+	 * not just the chunk where the dump buffers are allocated.
+	 * This accommodates the corner case where the combined size of the
+	 * dump buffers is smaller than a single page.
+	 * This does not pose a security risk as the pages are zeroed on
+	 * allocation, and anything out of bounds of the dump buffers is never
+	 * written to.
+	 */
+	size = (1ull << cli->dump_bufs.page_order) * PAGE_SIZE;
 
 	if (vma->vm_pgoff > (size >> PAGE_SHIFT))
 		return -EINVAL;
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_vinstr.h b/drivers/gpu/arm/bifrost/mali_kbase_vinstr.h
index 81d315f95567..a20f31aaf5d0 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_vinstr.h
+++ b/drivers/gpu/arm/bifrost/mali_kbase_vinstr.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2015-2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2015-2018, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
diff --git a/drivers/gpu/arm/bifrost/mali_linux_trace.h b/drivers/gpu/arm/bifrost/mali_linux_trace.h
index be812f62c862..6fe48ff2f7da 100644
--- a/drivers/gpu/arm/bifrost/mali_linux_trace.h
+++ b/drivers/gpu/arm/bifrost/mali_linux_trace.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2011-2016, 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2016, 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #undef TRACE_SYSTEM
@@ -31,7 +30,7 @@
 #if defined(CONFIG_MALI_BIFROST_GATOR_SUPPORT)
 #define MALI_JOB_SLOTS_EVENT_CHANGED
 
-/**
+/*
  * mali_job_slots_event - Reports change of job slot status.
  * @gpu_id:   Kbase device id
  * @event_id: ORed together bitfields representing a type of event,
@@ -348,10 +347,7 @@ TRACE_EVENT(mali_jit_report,
 #endif /* MALI_JIT_PRESSURE_LIMIT_BASE */
 #endif /* !MALI_USE_CSF */
 
-#if (KERNEL_VERSION(4, 1, 0) <= LINUX_VERSION_CODE)
 TRACE_DEFINE_ENUM(KBASE_JIT_REPORT_ON_ALLOC_OR_FREE);
-#endif
-
 #if MALI_JIT_PRESSURE_LIMIT_BASE
 /* trace_mali_jit_report_pressure
  *
@@ -393,7 +389,6 @@ TRACE_EVENT(mali_jit_report_pressure,
 /* Enum of sysgraph message IDs */
 enum sysgraph_msg {
 	SGR_ARRIVE,
-	SGR_DEP_RES,
 	SGR_SUBMIT,
 	SGR_COMPLETE,
 	SGR_POST,
@@ -421,7 +416,7 @@ TRACE_EVENT(sysgraph,
 		__entry->message    = message;
 		__entry->atom_id    = atom_id;
 	),
-	TP_printk("msg=%u proc_id=%u, param1=%d\n", __entry->message,
+	TP_printk("msg=%u proc_id=%u, param1=%d", __entry->message,
 		 __entry->proc_id,  __entry->atom_id)
 );
 
@@ -447,7 +442,7 @@ TRACE_EVENT(sysgraph_gpu,
 		__entry->atom_id    = atom_id;
 		__entry->js         = js;
 	),
-	TP_printk("msg=%u proc_id=%u, param1=%d, param2=%d\n",
+	TP_printk("msg=%u proc_id=%u, param1=%d, param2=%d",
 		  __entry->message,  __entry->proc_id,
 		  __entry->atom_id, __entry->js)
 );
@@ -536,7 +531,7 @@ TRACE_EVENT(mali_jit_trim,
 	TP_printk("freed_pages=%zu", __entry->freed_pages)
 );
 
-#include "mali_kbase_debug_linux_ktrace.h"
+#include "debug/mali_kbase_debug_linux_ktrace.h"
 
 #endif /* _TRACE_MALI_H */
 
diff --git a/drivers/gpu/arm/bifrost/mali_malisw.h b/drivers/gpu/arm/bifrost/mali_malisw.h
index 3a4db10bdb3d..c0640440839d 100644
--- a/drivers/gpu/arm/bifrost/mali_malisw.h
+++ b/drivers/gpu/arm/bifrost/mali_malisw.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014-2015, 2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2015, 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
@@ -28,26 +27,11 @@
 #define _MALISW_H_
 
 #include <linux/version.h>
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)
-#define U8_MAX          ((u8)~0U)
-#define S8_MAX          ((s8)(U8_MAX>>1))
-#define S8_MIN          ((s8)(-S8_MAX - 1))
-#define U16_MAX         ((u16)~0U)
-#define S16_MAX         ((s16)(U16_MAX>>1))
-#define S16_MIN         ((s16)(-S16_MAX - 1))
-#define U32_MAX         ((u32)~0U)
-#define S32_MAX         ((s32)(U32_MAX>>1))
-#define S32_MIN         ((s32)(-S32_MAX - 1))
-#define U64_MAX         ((u64)~0ULL)
-#define S64_MAX         ((s64)(U64_MAX>>1))
-#define S64_MIN         ((s64)(-S64_MAX - 1))
-#endif /* LINUX_VERSION_CODE */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 5, 0)
-#define SIZE_MAX        (~(size_t)0)
-#endif /* LINUX_VERSION_CODE */
 
 /**
  * MIN - Return the lesser of two values.
+ * @x: value1
+ * @y: value2
  *
  * As a macro it may evaluate its arguments more than once.
  * Refer to MAX macro for more details
@@ -55,7 +39,9 @@
 #define MIN(x, y)	((x) < (y) ? (x) : (y))
 
 /**
- * MAX -  Return the greater of two values.
+ * MAX - Return the greater of two values.
+ * @x: value1
+ * @y: value2
  *
  * As a macro it may evaluate its arguments more than once.
  * If called on the same two arguments as MIN it is guaranteed to return
@@ -67,24 +53,27 @@
 #define MAX(x, y)	((x) < (y) ? (y) : (x))
 
 /**
- * @hideinitializer
- * Function-like macro for suppressing unused variable warnings. Where possible
- * such variables should be removed; this macro is present for cases where we
- * much support API backwards compatibility.
+ * Function-like macro for suppressing unused variable warnings.
+ * @x: unused variable
+ *
+ * Where possible such variables should be removed; this macro is present for
+ * cases where we much support API backwards compatibility.
  */
 #define CSTD_UNUSED(x)	((void)(x))
 
 /**
- * @hideinitializer
- * Function-like macro for use where "no behavior" is desired. This is useful
- * when compile time macros turn a function-like macro in to a no-op, but
- * where having no statement is otherwise invalid.
+ * Function-like macro for use where "no behavior" is desired.
+ * @...: no-op
+ *
+ * This is useful when compile time macros turn a function-like macro in to a
+ * no-op, but where having no statement is otherwise invalid.
  */
 #define CSTD_NOP(...)	((void)#__VA_ARGS__)
 
 /**
- * @hideinitializer
  * Function-like macro for stringizing a single level macro.
+ * @x: macro's value
+ *
  * @code
  * #define MY_MACRO 32
  * CSTD_STR1( MY_MACRO )
@@ -94,10 +83,11 @@
 #define CSTD_STR1(x)	#x
 
 /**
- * @hideinitializer
- * Function-like macro for stringizing a macro's value. This should not be used
- * if the macro is defined in a way which may have no value; use the
- * alternative @c CSTD_STR2N macro should be used instead.
+ * Function-like macro for stringizing a macro's value.
+ * @x: macro's value
+ *
+ * This should not be used if the macro is defined in a way which may have no
+ * value; use the alternative @c CSTD_STR2N macro should be used instead.
  * @code
  * #define MY_MACRO 32
  * CSTD_STR2( MY_MACRO )
diff --git a/drivers/gpu/arm/bifrost/mali_power_gpu_frequency_trace.c b/drivers/gpu/arm/bifrost/mali_power_gpu_frequency_trace.c
index b6fb5a094fab..f548b04d9a8c 100644
--- a/drivers/gpu/arm/bifrost/mali_power_gpu_frequency_trace.c
+++ b/drivers/gpu/arm/bifrost/mali_power_gpu_frequency_trace.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /* Create the trace point if not configured in kernel */
diff --git a/drivers/gpu/arm/bifrost/mali_power_gpu_frequency_trace.h b/drivers/gpu/arm/bifrost/mali_power_gpu_frequency_trace.h
index 3b90ae437db9..d6909a4cf911 100644
--- a/drivers/gpu/arm/bifrost/mali_power_gpu_frequency_trace.h
+++ b/drivers/gpu/arm/bifrost/mali_power_gpu_frequency_trace.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _TRACE_POWER_GPU_FREQUENCY_MALI
diff --git a/drivers/gpu/arm/bifrost/mmu/backend/mali_kbase_mmu_csf.c b/drivers/gpu/arm/bifrost/mmu/backend/mali_kbase_mmu_csf.c
index 1d106999228a..8240817cc135 100644
--- a/drivers/gpu/arm/bifrost/mmu/backend/mali_kbase_mmu_csf.c
+++ b/drivers/gpu/arm/bifrost/mmu/backend/mali_kbase_mmu_csf.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,18 +17,15 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
- * Base kernel MMU management specific for CSF GPU.
+ * DOC: Base kernel MMU management specific for CSF GPU.
  */
 
 #include <mali_kbase.h>
 #include <gpu/mali_kbase_gpu_fault.h>
 #include <mali_kbase_ctx_sched.h>
-#include <mali_kbase_hwaccess_jm.h>
 #include <mali_kbase_reset_gpu.h>
 #include <mali_kbase_as_fault_debugfs.h>
 #include "../mali_kbase_mmu_internal.h"
@@ -70,17 +68,36 @@ void kbase_mmu_get_as_setup(struct kbase_mmu_table *mmut,
 static void submit_work_pagefault(struct kbase_device *kbdev, u32 as_nr,
 		struct kbase_fault *fault)
 {
+	unsigned long flags;
 	struct kbase_as *const as = &kbdev->as[as_nr];
+	struct kbase_context *kctx;
 
-	as->pf_data = (struct kbase_fault) {
-		.status = fault->status,
-		.addr = fault->addr,
-	};
+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+	kctx = kbase_ctx_sched_as_to_ctx_nolock(kbdev, as_nr);
 
-	if (kbase_ctx_sched_as_to_ctx_refcount(kbdev, as_nr)) {
-		WARN_ON(!queue_work(as->pf_wq, &as->work_pagefault));
-		atomic_inc(&kbdev->faults_pending);
+	if (kctx) {
+		kbase_ctx_sched_retain_ctx_refcount(kctx);
+
+		as->pf_data = (struct kbase_fault) {
+			.status = fault->status,
+			.addr = fault->addr,
+		};
+
+		/*
+		 * A page fault work item could already be pending for the
+		 * context's address space, when the page fault occurs for
+		 * MCU's address space.
+		 */
+		if (!queue_work(as->pf_wq, &as->work_pagefault))
+			kbase_ctx_sched_release_ctx(kctx);
+		else {
+			dev_dbg(kbdev->dev,
+				"Page fault is already pending for as %u\n",
+				as_nr);
+			atomic_inc(&kbdev->faults_pending);
+		}
 	}
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 }
 
 void kbase_mmu_report_mcu_as_fault_and_reset(struct kbase_device *kbdev,
@@ -107,11 +124,11 @@ void kbase_mmu_report_mcu_as_fault_and_reset(struct kbase_device *kbdev,
 
 	/* Report MMU fault for all address spaces (except MCU_AS_NR) */
 	for (as_no = 1; as_no < kbdev->nr_hw_address_spaces; as_no++)
-		if (kbase_ctx_sched_as_to_ctx(kbdev, as_no))
-			submit_work_pagefault(kbdev, as_no, fault);
+		submit_work_pagefault(kbdev, as_no, fault);
 
 	/* GPU reset is required to recover */
-	if (kbase_prepare_to_reset_gpu(kbdev))
+	if (kbase_prepare_to_reset_gpu(kbdev,
+				       RESET_FLAGS_HWC_UNRECOVERABLE_ERROR))
 		kbase_reset_gpu(kbdev);
 }
 KBASE_EXPORT_TEST_API(kbase_mmu_report_mcu_as_fault_and_reset);
@@ -172,7 +189,7 @@ void kbase_gpu_report_bus_fault_and_kill(struct kbase_context *kctx,
 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 }
 
-/**
+/*
  * The caller must ensure it's retained the ctx to prevent it from being
  * scheduled out whilst it's being worked on.
  */
@@ -483,18 +500,25 @@ static void submit_work_gpufault(struct kbase_device *kbdev, u32 status,
 {
 	unsigned long flags;
 	struct kbase_as *const as = &kbdev->as[as_nr];
+	struct kbase_context *kctx;
 
 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	as->gf_data = (struct kbase_fault) {
+	kctx = kbase_ctx_sched_as_to_ctx_nolock(kbdev, as_nr);
+
+	if (kctx) {
+		kbase_ctx_sched_retain_ctx_refcount(kctx);
+
+		as->gf_data = (struct kbase_fault) {
 			.status = status,
 			.addr = address,
-	};
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+		};
 
-	if (kbase_ctx_sched_as_to_ctx_refcount(kbdev, as_nr)) {
-		WARN_ON(!queue_work(as->pf_wq, &as->work_gpufault));
-		atomic_inc(&kbdev->faults_pending);
+		if (WARN_ON(!queue_work(as->pf_wq, &as->work_gpufault)))
+			kbase_ctx_sched_release_ctx(kctx);
+		else
+			atomic_inc(&kbdev->faults_pending);
 	}
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
 }
 
 void kbase_mmu_gpu_fault_interrupt(struct kbase_device *kbdev, u32 status,
diff --git a/drivers/gpu/arm/bifrost/mmu/backend/mali_kbase_mmu_jm.c b/drivers/gpu/arm/bifrost/mmu/backend/mali_kbase_mmu_jm.c
index b0187a46b733..ae334c182a69 100644
--- a/drivers/gpu/arm/bifrost/mmu/backend/mali_kbase_mmu_jm.c
+++ b/drivers/gpu/arm/bifrost/mmu/backend/mali_kbase_mmu_jm.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
- * Base kernel MMU management specific for Job Manager GPU.
+ * DOC: Base kernel MMU management specific for Job Manager GPU.
  */
 
 #include <mali_kbase.h>
@@ -97,7 +96,7 @@ void kbase_gpu_report_bus_fault_and_kill(struct kbase_context *kctx,
 				 KBASE_MMU_FAULT_TYPE_BUS_UNEXPECTED);
 }
 
-/**
+/*
  * The caller must ensure it's retained the ctx to prevent it from being
  * scheduled out whilst it's being worked on.
  */
@@ -144,6 +143,7 @@ void kbase_mmu_report_fault_and_kill(struct kbase_context *kctx,
 		kctx->pid);
 
 	/* hardware counters dump fault handling */
+	spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
 	if ((kbdev->hwcnt.kctx) && (kbdev->hwcnt.kctx->as_nr == as_no) &&
 			(kbdev->hwcnt.backend.state ==
 						KBASE_INSTR_STATE_DUMPING)) {
@@ -152,6 +152,7 @@ void kbase_mmu_report_fault_and_kill(struct kbase_context *kctx,
 					kbdev->hwcnt.addr_bytes)))
 			kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_FAULT;
 	}
+	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
 
 	/* Stop the kctx from submitting more jobs and cause it to be scheduled
 	 * out/rescheduled - this will occur on releasing the context's refcount
@@ -200,10 +201,12 @@ static void kbase_mmu_interrupt_process(struct kbase_device *kbdev,
 		struct kbase_context *kctx, struct kbase_as *as,
 		struct kbase_fault *fault)
 {
+	unsigned long flags;
+
 	lockdep_assert_held(&kbdev->hwaccess_lock);
 
 	dev_dbg(kbdev->dev,
-		"Entering %s kctx %p, as %p\n",
+		"Entering %s kctx %pK, as %pK\n",
 		__func__, (void *)kctx, (void *)as);
 
 	if (!kctx) {
@@ -237,11 +240,13 @@ static void kbase_mmu_interrupt_process(struct kbase_device *kbdev,
 		 * hw counters dumping in progress, signal the
 		 * other thread that it failed
 		 */
+  		spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
 		if ((kbdev->hwcnt.kctx == kctx) &&
 		    (kbdev->hwcnt.backend.state ==
 					KBASE_INSTR_STATE_DUMPING))
 			kbdev->hwcnt.backend.state =
 						KBASE_INSTR_STATE_FAULT;
+  		spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
 
 		/*
 		 * Stop the kctx from submitting more jobs and cause it
@@ -250,14 +255,10 @@ static void kbase_mmu_interrupt_process(struct kbase_device *kbdev,
 		 */
 		kbasep_js_clear_submit_allowed(js_devdata, kctx);
 
-		if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_AARCH64_MMU))
-			dev_warn(kbdev->dev,
-					"Bus error in AS%d at VA=0x%016llx, IPA=0x%016llx\n",
-					as->number, fault->addr,
-					fault->extra_addr);
-		else
-			dev_warn(kbdev->dev, "Bus error in AS%d at 0x%016llx\n",
-					as->number, fault->addr);
+		dev_warn(kbdev->dev,
+				"Bus error in AS%d at VA=0x%016llx, IPA=0x%016llx\n",
+				as->number, fault->addr,
+				fault->extra_addr);
 
 		/*
 		 * We need to switch to UNMAPPED mode - but we do this in a
@@ -271,7 +272,7 @@ static void kbase_mmu_interrupt_process(struct kbase_device *kbdev,
 	}
 
 	dev_dbg(kbdev->dev,
-		"Leaving %s kctx %p, as %p\n",
+		"Leaving %s kctx %pK, as %pK\n",
 		__func__, (void *)kctx, (void *)as);
 }
 
@@ -370,14 +371,11 @@ void kbase_mmu_interrupt(struct kbase_device *kbdev, u32 irq_stat)
 		/* record the fault status */
 		fault->status = kbase_reg_read(kbdev, MMU_AS_REG(as_no,
 				AS_FAULTSTATUS));
-
-		if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_AARCH64_MMU)) {
-			fault->extra_addr = kbase_reg_read(kbdev,
-					MMU_AS_REG(as_no, AS_FAULTEXTRA_HI));
-			fault->extra_addr <<= 32;
-			fault->extra_addr |= kbase_reg_read(kbdev,
-					MMU_AS_REG(as_no, AS_FAULTEXTRA_LO));
-		}
+		fault->extra_addr = kbase_reg_read(kbdev,
+				MMU_AS_REG(as_no, AS_FAULTEXTRA_HI));
+		fault->extra_addr <<= 32;
+		fault->extra_addr |= kbase_reg_read(kbdev,
+				MMU_AS_REG(as_no, AS_FAULTEXTRA_LO));
 
 		if (kbase_as_has_bus_fault(as, fault)) {
 			/* Mark bus fault as handled.
@@ -418,7 +416,7 @@ int kbase_mmu_switch_to_ir(struct kbase_context *const kctx,
 	struct kbase_va_region *const reg)
 {
 	dev_dbg(kctx->kbdev->dev,
-		"Switching to incremental rendering for region %p\n",
+		"Switching to incremental rendering for region %pK\n",
 		(void *)reg);
 	return kbase_job_slot_softstop_start_rp(kctx, reg);
 }
diff --git a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu.c b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu.c
index a5cda009426d..0761f68c1234 100644
--- a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu.c
+++ b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,13 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
- * @file mali_kbase_mmu.c
- * Base kernel MMU management.
+ * DOC: Base kernel MMU management.
  */
 
 #include <linux/kernel.h>
@@ -37,8 +35,6 @@
 #include <mali_kbase_defs.h>
 #include <mali_kbase_hw.h>
 #include <mmu/mali_kbase_mmu_hw.h>
-#include <mali_kbase_hwaccess_jm.h>
-#include <mali_kbase_hwaccess_time.h>
 #include <mali_kbase_mem.h>
 #include <mali_kbase_reset_gpu.h>
 #include <mmu/mali_kbase_mmu.h>
@@ -84,21 +80,20 @@ static void kbase_mmu_flush_invalidate_no_ctx(struct kbase_device *kbdev,
 		u64 vpfn, size_t nr, bool sync, int as_nr);
 
 /**
- * kbase_mmu_sync_pgd - sync page directory to memory
+ * kbase_mmu_sync_pgd() - sync page directory to memory when needed.
  * @kbdev:	Device pointer.
  * @handle:	Address of DMA region.
  * @size:       Size of the region to sync.
  *
  * This should be called after each page directory update.
  */
-
 static void kbase_mmu_sync_pgd(struct kbase_device *kbdev,
 		dma_addr_t handle, size_t size)
 {
-	/* If page table is not coherent then ensure the gpu can read
+	/* In non-coherent system, ensure the GPU can read
 	 * the pages from memory
 	 */
-	if (kbdev->system_coherency != COHERENCY_ACE)
+	if (kbdev->system_coherency == COHERENCY_NONE)
 		dma_sync_single_for_device(kbdev->dev, handle, size,
 				DMA_TO_DEVICE);
 }
@@ -119,7 +114,7 @@ static int kbase_mmu_update_pages_no_flush(struct kbase_context *kctx, u64 vpfn,
 /**
  * reg_grow_calc_extra_pages() - Calculate the number of backed pages to add to
  *                               a region on a GPU page fault
- *
+ * @kbdev:         KBase device
  * @reg:           The region that will be backed with more pages
  * @fault_rel_pfn: PFN of the fault relative to the start of the region
  *
@@ -135,20 +130,21 @@ static int kbase_mmu_update_pages_no_flush(struct kbase_context *kctx, u64 vpfn,
 static size_t reg_grow_calc_extra_pages(struct kbase_device *kbdev,
 		struct kbase_va_region *reg, size_t fault_rel_pfn)
 {
-	size_t multiple = reg->extent;
+	size_t multiple = reg->extension;
 	size_t reg_current_size = kbase_reg_current_backed_size(reg);
 	size_t minimum_extra = fault_rel_pfn - reg_current_size + 1;
 	size_t remainder;
 
 	if (!multiple) {
-		dev_warn(kbdev->dev,
-			"VA Region 0x%llx extent was 0, allocator needs to set this properly for KBASE_REG_PF_GROW\n",
+		dev_warn(
+			kbdev->dev,
+			"VA Region 0x%llx extension was 0, allocator needs to set this properly for KBASE_REG_PF_GROW\n",
 			((unsigned long long)reg->start_pfn) << PAGE_SHIFT);
 		return minimum_extra;
 	}
 
 	/* Calculate the remainder to subtract from minimum_extra to make it
-	 * the desired (rounded down) multiple of the extent.
+	 * the desired (rounded down) multiple of the extension.
 	 * Depending on reg's flags, the base used for calculating multiples is
 	 * different
 	 */
@@ -565,7 +561,7 @@ void kbase_mmu_page_fault_worker(struct work_struct *data)
 
 	kbdev = container_of(faulting_as, struct kbase_device, as[as_no]);
 	dev_dbg(kbdev->dev,
-		"Entering %s %p, fault_pfn %lld, as_no %d\n",
+		"Entering %s %pK, fault_pfn %lld, as_no %d\n",
 		__func__, (void *)data, fault_pfn, as_no);
 
 	/* Grab the context that was already refcounted in kbase_mmu_interrupt()
@@ -638,21 +634,13 @@ void kbase_mmu_page_fault_worker(struct work_struct *data)
 		goto fault_done;
 
 	case AS_FAULTSTATUS_EXCEPTION_CODE_ADDRESS_SIZE_FAULT:
-		if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_AARCH64_MMU))
-			kbase_mmu_report_fault_and_kill(kctx, faulting_as,
-					"Address size fault", fault);
-		else
-			kbase_mmu_report_fault_and_kill(kctx, faulting_as,
-					"Unknown fault code", fault);
+		kbase_mmu_report_fault_and_kill(kctx, faulting_as,
+				"Address size fault", fault);
 		goto fault_done;
 
 	case AS_FAULTSTATUS_EXCEPTION_CODE_MEMORY_ATTRIBUTES_FAULT:
-		if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_AARCH64_MMU))
-			kbase_mmu_report_fault_and_kill(kctx, faulting_as,
-					"Memory attributes fault", fault);
-		else
-			kbase_mmu_report_fault_and_kill(kctx, faulting_as,
-					"Unknown fault code", fault);
+		kbase_mmu_report_fault_and_kill(kctx, faulting_as,
+				"Memory attributes fault", fault);
 		goto fault_done;
 
 	default:
@@ -718,6 +706,10 @@ void kbase_mmu_page_fault_worker(struct work_struct *data)
 		goto fault_done;
 	}
 
+	if (AS_FAULTSTATUS_ACCESS_TYPE_GET(fault_status) ==
+		AS_FAULTSTATUS_ACCESS_TYPE_READ)
+		dev_warn(kbdev->dev, "Grow on pagefault while reading");
+
 	/* find the size we need to grow it by
 	 * we know the result fit in a size_t due to
 	 * kbase_region_tracker_find_region_enclosing_address
@@ -852,7 +844,7 @@ void kbase_mmu_page_fault_worker(struct work_struct *data)
 
 			if (kbase_mmu_switch_to_ir(kctx, region) >= 0) {
 				dev_dbg(kctx->kbdev->dev,
-					"Get region %p for IR\n",
+					"Get region %pK for IR\n",
 					(void *)region);
 				kbase_va_region_alloc_get(kctx, region);
 			}
@@ -980,7 +972,7 @@ void kbase_mmu_page_fault_worker(struct work_struct *data)
 	release_ctx(kbdev, kctx);
 
 	atomic_dec(&kbdev->faults_pending);
-	dev_dbg(kbdev->dev, "Leaving page_fault_worker %p\n", (void *)data);
+	dev_dbg(kbdev->dev, "Leaving page_fault_worker %pK\n", (void *)data);
 }
 
 static phys_addr_t kbase_mmu_alloc_pgd(struct kbase_device *kbdev,
@@ -1557,7 +1549,7 @@ static void kbase_mmu_flush_invalidate_noretain(struct kbase_context *kctx,
 		 */
 		dev_err(kbdev->dev, "Flush for GPU page table update did not complete. Issuing GPU soft-reset to recover\n");
 
-		if (kbase_prepare_to_reset_gpu_locked(kbdev))
+		if (kbase_prepare_to_reset_gpu_locked(kbdev, RESET_FLAGS_NONE))
 			kbase_reset_gpu_locked(kbdev);
 	}
 }
@@ -1570,10 +1562,29 @@ static void kbase_mmu_flush_invalidate_as(struct kbase_device *kbdev,
 {
 	int err;
 	u32 op;
+	bool gpu_powered;
+	unsigned long flags;
+
+	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
+	gpu_powered = kbdev->pm.backend.gpu_powered;
+	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
+
+	/* GPU is off so there's no need to perform flush/invalidate.
+	 * But even if GPU is not actually powered down, after gpu_powered flag
+	 * was set to false, it is still safe to skip the flush/invalidate.
+	 * The TLB invalidation will anyways be performed due to AS_COMMAND_UPDATE
+	 * which is sent when address spaces are restored after gpu_powered flag
+	 * is set to true. Flushing of L2 cache is certainly not required as L2
+	 * cache is definitely off if gpu_powered is false.
+	 */
+	if (!gpu_powered)
+		return;
 
 	if (kbase_pm_context_active_handle_suspend(kbdev,
 				KBASE_PM_SUSPEND_HANDLER_DONT_REACTIVATE)) {
-		/* GPU is off so there's no need to perform flush/invalidate */
+		/* GPU has just been powered off due to system suspend.
+		 * So again, no need to perform flush/invalidate.
+		 */
 		return;
 	}
 
@@ -1592,9 +1603,10 @@ static void kbase_mmu_flush_invalidate_as(struct kbase_device *kbdev,
 		/* Flush failed to complete, assume the GPU has hung and
 		 * perform a reset to recover
 		 */
-		dev_err(kbdev->dev, "Flush for GPU page table update did not complete. Issueing GPU soft-reset to recover\n");
+		dev_err(kbdev->dev, "Flush for GPU page table update did not complete. Issuing GPU soft-reset to recover\n");
 
-		if (kbase_prepare_to_reset_gpu(kbdev))
+		if (kbase_prepare_to_reset_gpu(
+			    kbdev, RESET_FLAGS_HWC_UNRECOVERABLE_ERROR))
 			kbase_reset_gpu(kbdev);
 	}
 
@@ -1627,10 +1639,10 @@ static void kbase_mmu_flush_invalidate(struct kbase_context *kctx,
 	kbdev = kctx->kbdev;
 #if !MALI_USE_CSF
 	mutex_lock(&kbdev->js_data.queue_mutex);
-#endif /* !MALI_USE_CSF */
 	ctx_is_in_runpool = kbase_ctx_sched_inc_refcount(kctx);
-#if !MALI_USE_CSF
 	mutex_unlock(&kbdev->js_data.queue_mutex);
+#else
+	ctx_is_in_runpool = kbase_ctx_sched_inc_refcount_if_as_valid(kctx);
 #endif /* !MALI_USE_CSF */
 
 	if (ctx_is_in_runpool) {
@@ -1673,6 +1685,7 @@ void kbase_mmu_disable(struct kbase_context *kctx)
 	KBASE_DEBUG_ASSERT(kctx->as_nr != KBASEP_AS_NR_INVALID);
 
 	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
+	lockdep_assert_held(&kctx->kbdev->mmu_hw_mutex);
 
 	/*
 	 * The address space is being disabled, drain all knowledge of it out
diff --git a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu.h b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu.h
index f2613e881dac..bf4fd91d27bc 100644
--- a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu.h
+++ b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_MMU_H_
diff --git a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_hw.h b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_hw.h
index e6eef86d7ac0..ea088e921b03 100644
--- a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_hw.h
+++ b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_hw.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014-2015, 2018-2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2015, 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
@@ -39,6 +38,11 @@ struct kbase_context;
 
 /**
  * enum kbase_mmu_fault_type - MMU fault type descriptor.
+ * @KBASE_MMU_FAULT_TYPE_UNKNOWN:         unknown fault
+ * @KBASE_MMU_FAULT_TYPE_PAGE:            page fault
+ * @KBASE_MMU_FAULT_TYPE_BUS:             nus fault
+ * @KBASE_MMU_FAULT_TYPE_PAGE_UNEXPECTED: page_unexpected fault
+ * @KBASE_MMU_FAULT_TYPE_BUS_UNEXPECTED:  bus_unexpected fault
  */
 enum kbase_mmu_fault_type {
 	KBASE_MMU_FAULT_TYPE_UNKNOWN = 0,
diff --git a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_hw_direct.c b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_hw_direct.c
index a820ab24ac05..88fd9cf9a864 100644
--- a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_hw_direct.c
+++ b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_hw_direct.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2014-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <linux/bitops.h>
@@ -26,7 +25,6 @@
 #include <mmu/mali_kbase_mmu_hw.h>
 #include <tl/mali_kbase_tracepoints.h>
 #include <device/mali_kbase_device.h>
-#include <mali_kbase_as_fault_debugfs.h>
 
 /**
  * lock_region() - Generate lockaddr to lock memory region in MMU
@@ -126,38 +124,33 @@ void kbase_mmu_hw_configure(struct kbase_device *kbdev, struct kbase_as *as)
 	struct kbase_mmu_setup *current_setup = &as->current_setup;
 	u64 transcfg = 0;
 
-	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_AARCH64_MMU)) {
-		transcfg = current_setup->transcfg;
+	transcfg = current_setup->transcfg;
 
-		/* Set flag AS_TRANSCFG_PTW_MEMATTR_WRITE_BACK
-		 * Clear PTW_MEMATTR bits
-		 */
-		transcfg &= ~AS_TRANSCFG_PTW_MEMATTR_MASK;
-		/* Enable correct PTW_MEMATTR bits */
-		transcfg |= AS_TRANSCFG_PTW_MEMATTR_WRITE_BACK;
-		/* Ensure page-tables reads use read-allocate cache-policy in
-		 * the L2
-		 */
-		transcfg |= AS_TRANSCFG_R_ALLOCATE;
-
-		if (kbdev->system_coherency == COHERENCY_ACE) {
-			/* Set flag AS_TRANSCFG_PTW_SH_OS (outer shareable)
-			 * Clear PTW_SH bits
-			 */
-			transcfg = (transcfg & ~AS_TRANSCFG_PTW_SH_MASK);
-			/* Enable correct PTW_SH bits */
-			transcfg = (transcfg | AS_TRANSCFG_PTW_SH_OS);
-		}
+	/* Set flag AS_TRANSCFG_PTW_MEMATTR_WRITE_BACK
+	 * Clear PTW_MEMATTR bits
+	 */
+	transcfg &= ~AS_TRANSCFG_PTW_MEMATTR_MASK;
+	/* Enable correct PTW_MEMATTR bits */
+	transcfg |= AS_TRANSCFG_PTW_MEMATTR_WRITE_BACK;
+	/* Ensure page-tables reads use read-allocate cache-policy in
+	 * the L2
+	 */
+	transcfg |= AS_TRANSCFG_R_ALLOCATE;
 
-		kbase_reg_write(kbdev, MMU_AS_REG(as->number, AS_TRANSCFG_LO),
-				transcfg);
-		kbase_reg_write(kbdev, MMU_AS_REG(as->number, AS_TRANSCFG_HI),
-				(transcfg >> 32) & 0xFFFFFFFFUL);
-	} else {
-		if (kbdev->system_coherency == COHERENCY_ACE)
-			current_setup->transtab |= AS_TRANSTAB_LPAE_SHARE_OUTER;
+	if (kbdev->system_coherency != COHERENCY_NONE) {
+		/* Set flag AS_TRANSCFG_PTW_SH_OS (outer shareable)
+		 * Clear PTW_SH bits
+		 */
+		transcfg = (transcfg & ~AS_TRANSCFG_PTW_SH_MASK);
+		/* Enable correct PTW_SH bits */
+		transcfg = (transcfg | AS_TRANSCFG_PTW_SH_OS);
 	}
 
+	kbase_reg_write(kbdev, MMU_AS_REG(as->number, AS_TRANSCFG_LO),
+			transcfg);
+	kbase_reg_write(kbdev, MMU_AS_REG(as->number, AS_TRANSCFG_HI),
+			(transcfg >> 32) & 0xFFFFFFFFUL);
+
 	kbase_reg_write(kbdev, MMU_AS_REG(as->number, AS_TRANSTAB_LO),
 			current_setup->transtab & 0xFFFFFFFFUL);
 	kbase_reg_write(kbdev, MMU_AS_REG(as->number, AS_TRANSTAB_HI),
diff --git a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_internal.h b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_internal.h
index 8ecb14d72327..d3fcd3939ab6 100644
--- a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_internal.h
+++ b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_internal.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KBASE_MMU_INTERNAL_H_
diff --git a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_mode_aarch64.c b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_mode_aarch64.c
index 02493e9b2621..fac515cea403 100644
--- a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_mode_aarch64.c
+++ b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_mode_aarch64.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2010-2014, 2016-2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2014, 2016-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "mali_kbase.h"
@@ -48,25 +47,7 @@
  */
 static inline void page_table_entry_set(u64 *pte, u64 phy)
 {
-#if KERNEL_VERSION(3, 18, 13) <= LINUX_VERSION_CODE
 	WRITE_ONCE(*pte, phy);
-#else
-#ifdef CONFIG_64BIT
-	barrier();
-	*pte = phy;
-	barrier();
-#elif defined(CONFIG_ARM)
-	barrier();
-	asm volatile("ldrd r0, [%1]\n\t"
-		     "strd r0, %0\n\t"
-		     : "=m" (*pte)
-		     : "r" (&phy)
-		     : "r0", "r1");
-	barrier();
-#else
-#error "64-bit atomic write must be implemented for your architecture"
-#endif
-#endif
 }
 
 static void mmu_update(struct kbase_device *kbdev, struct kbase_mmu_table *mmut,
diff --git a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_mode_lpae.c b/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_mode_lpae.c
deleted file mode 100644
index 91a2d7ac4dcb..000000000000
--- a/drivers/gpu/arm/bifrost/mmu/mali_kbase_mmu_mode_lpae.c
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2019 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, you can access it online at
- * http://www.gnu.org/licenses/gpl-2.0.html.
- *
- * SPDX-License-Identifier: GPL-2.0
- *
- */
-
-
-#include "mali_kbase.h"
-#include <gpu/mali_kbase_gpu_regmap.h>
-#include "mali_kbase_defs.h"
-
-#define ENTRY_TYPE_MASK     3ULL
-#define ENTRY_IS_ATE        1ULL
-#define ENTRY_IS_INVAL      2ULL
-#define ENTRY_IS_PTE        3ULL
-
-#define ENTRY_ATTR_BITS (7ULL << 2)	/* bits 4:2 */
-#define ENTRY_RD_BIT (1ULL << 6)
-#define ENTRY_WR_BIT (1ULL << 7)
-#define ENTRY_SHARE_BITS (3ULL << 8)	/* bits 9:8 */
-#define ENTRY_ACCESS_BIT (1ULL << 10)
-#define ENTRY_NX_BIT (1ULL << 54)
-
-#define ENTRY_FLAGS_MASK (ENTRY_ATTR_BITS | ENTRY_RD_BIT | ENTRY_WR_BIT | \
-		ENTRY_SHARE_BITS | ENTRY_ACCESS_BIT | ENTRY_NX_BIT)
-
-/* Helper Function to perform assignment of page table entries, to
- * ensure the use of strd, which is required on LPAE systems.
- */
-static inline void page_table_entry_set(u64 *pte, u64 phy)
-{
-#if KERNEL_VERSION(3, 18, 13) <= LINUX_VERSION_CODE
-	WRITE_ONCE(*pte, phy);
-#else
-#ifdef CONFIG_64BIT
-	barrier();
-	*pte = phy;
-	barrier();
-#elif defined(CONFIG_ARM)
-	barrier();
-	asm volatile("ldrd r0, [%1]\n\t"
-		     "strd r0, %0\n\t"
-		     : "=m" (*pte)
-		     : "r" (&phy)
-		     : "r0", "r1");
-	barrier();
-#else
-#error "64-bit atomic write must be implemented for your architecture"
-#endif
-#endif
-}
-
-static void mmu_get_as_setup(struct kbase_mmu_table *mmut,
-		struct kbase_mmu_setup * const setup)
-{
-	/* Set up the required caching policies at the correct indices
-	 * in the memattr register.
-	 */
-	setup->memattr =
-		(AS_MEMATTR_LPAE_IMPL_DEF_CACHE_POLICY <<
-		(AS_MEMATTR_INDEX_IMPL_DEF_CACHE_POLICY * 8)) |
-		(AS_MEMATTR_LPAE_FORCE_TO_CACHE_ALL    <<
-		(AS_MEMATTR_INDEX_FORCE_TO_CACHE_ALL * 8))    |
-		(AS_MEMATTR_LPAE_WRITE_ALLOC           <<
-		(AS_MEMATTR_INDEX_WRITE_ALLOC * 8))           |
-		(AS_MEMATTR_LPAE_OUTER_IMPL_DEF        <<
-		(AS_MEMATTR_INDEX_OUTER_IMPL_DEF * 8))        |
-		(AS_MEMATTR_LPAE_OUTER_WA              <<
-		(AS_MEMATTR_INDEX_OUTER_WA * 8))              |
-		0; /* The other indices are unused for now */
-
-	setup->transtab = ((u64)mmut->pgd &
-		((0xFFFFFFFFULL << 32) | AS_TRANSTAB_LPAE_ADDR_SPACE_MASK)) |
-		AS_TRANSTAB_LPAE_ADRMODE_TABLE |
-		AS_TRANSTAB_LPAE_READ_INNER;
-
-	setup->transcfg = 0;
-}
-
-static void mmu_update(struct kbase_device *kbdev,
-		struct kbase_mmu_table *mmut,
-		int as_nr)
-{
-	struct kbase_as *as;
-	struct kbase_mmu_setup *current_setup;
-
-	if (WARN_ON(as_nr == KBASEP_AS_NR_INVALID))
-		return;
-
-	as = &kbdev->as[as_nr];
-	current_setup = &as->current_setup;
-
-	mmu_get_as_setup(mmut, current_setup);
-
-	/* Apply the address space setting */
-	kbase_mmu_hw_configure(kbdev, as);
-}
-
-static void mmu_disable_as(struct kbase_device *kbdev, int as_nr)
-{
-	struct kbase_as * const as = &kbdev->as[as_nr];
-	struct kbase_mmu_setup * const current_setup = &as->current_setup;
-
-	current_setup->transtab = AS_TRANSTAB_LPAE_ADRMODE_UNMAPPED;
-
-	/* Apply the address space setting */
-	kbase_mmu_hw_configure(kbdev, as);
-}
-
-static phys_addr_t pte_to_phy_addr(u64 entry)
-{
-	if (!(entry & 1))
-		return 0;
-
-	return entry & ~0xFFF;
-}
-
-static int ate_is_valid(u64 ate, int const level)
-{
-	return ((ate & ENTRY_TYPE_MASK) == ENTRY_IS_ATE);
-}
-
-static int pte_is_valid(u64 pte, int const level)
-{
-	return ((pte & ENTRY_TYPE_MASK) == ENTRY_IS_PTE);
-}
-
-/*
- * Map KBASE_REG flags to MMU flags
- */
-static u64 get_mmu_flags(unsigned long flags)
-{
-	u64 mmu_flags;
-	unsigned long memattr_idx;
-
-	memattr_idx = KBASE_REG_MEMATTR_VALUE(flags);
-	if (WARN(memattr_idx == AS_MEMATTR_INDEX_NON_CACHEABLE,
-			"Legacy Mode MMU cannot honor GPU non-cachable memory, will use default instead\n"))
-		memattr_idx = AS_MEMATTR_INDEX_DEFAULT;
-	/* store mem_attr index as 4:2, noting that:
-	 * - macro called above ensures 3 bits already
-	 * - all AS_MEMATTR_INDEX_<...> macros only use 3 bits
-	 */
-	mmu_flags = memattr_idx << 2;
-
-	/* write perm if requested */
-	mmu_flags |= (flags & KBASE_REG_GPU_WR) ? ENTRY_WR_BIT : 0;
-	/* read perm if requested */
-	mmu_flags |= (flags & KBASE_REG_GPU_RD) ? ENTRY_RD_BIT : 0;
-	/* nx if requested */
-	mmu_flags |= (flags & KBASE_REG_GPU_NX) ? ENTRY_NX_BIT : 0;
-
-	if (flags & KBASE_REG_SHARE_BOTH) {
-		/* inner and outer shareable */
-		mmu_flags |= SHARE_BOTH_BITS;
-	} else if (flags & KBASE_REG_SHARE_IN) {
-		/* inner shareable coherency */
-		mmu_flags |= SHARE_INNER_BITS;
-	}
-
-	return mmu_flags;
-}
-
-static void entry_set_ate(u64 *entry,
-		struct tagged_addr phy,
-		unsigned long flags,
-		int const level)
-{
-	page_table_entry_set(entry, as_phys_addr_t(phy) | get_mmu_flags(flags) |
-			     ENTRY_IS_ATE);
-}
-
-static void entry_set_pte(u64 *entry, phys_addr_t phy)
-{
-	page_table_entry_set(entry, (phy & ~0xFFF) | ENTRY_IS_PTE);
-}
-
-static void entry_invalidate(u64 *entry)
-{
-	page_table_entry_set(entry, ENTRY_IS_INVAL);
-}
-
-static struct kbase_mmu_mode const lpae_mode = {
-	.update = mmu_update,
-	.get_as_setup = mmu_get_as_setup,
-	.disable_as = mmu_disable_as,
-	.pte_to_phy_addr = pte_to_phy_addr,
-	.ate_is_valid = ate_is_valid,
-	.pte_is_valid = pte_is_valid,
-	.entry_set_ate = entry_set_ate,
-	.entry_set_pte = entry_set_pte,
-	.entry_invalidate = entry_invalidate,
-	.flags = 0
-};
-
-struct kbase_mmu_mode const *kbase_mmu_mode_get_lpae(void)
-{
-	return &lpae_mode;
-}
diff --git a/drivers/gpu/arm/bifrost/platform/Kconfig b/drivers/gpu/arm/bifrost/platform/Kconfig
index ef9fb963ecf5..ac385aa6b021 100644
--- a/drivers/gpu/arm/bifrost/platform/Kconfig
+++ b/drivers/gpu/arm/bifrost/platform/Kconfig
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
 # (C) COPYRIGHT 2012-2013, 2017 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,16 +16,11 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
-
-
 # Add your platform specific Kconfig file here
 #
 # "drivers/gpu/arm/midgard/platform/xxx/Kconfig"
 #
 # Where xxx is the platform name is the name set in MALI_PLATFORM_NAME
 #
-
diff --git a/drivers/gpu/arm/bifrost/platform/devicetree/Kbuild b/drivers/gpu/arm/bifrost/platform/devicetree/Kbuild
index 78343c0570d1..f151ee8680ad 100644
--- a/drivers/gpu/arm/bifrost/platform/devicetree/Kbuild
+++ b/drivers/gpu/arm/bifrost/platform/devicetree/Kbuild
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
 # (C) COPYRIGHT 2012-2017, 2020 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,11 +16,9 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
-mali_kbase-y += \
+bifrost_kbase-y += \
 	$(MALI_PLATFORM_DIR)/mali_kbase_config_devicetree.o \
 	$(MALI_PLATFORM_DIR)/mali_kbase_runtime_pm.o \
 	$(MALI_PLATFORM_DIR)/mali_kbase_clk_rate_trace.o
diff --git a/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_clk_rate_trace.c b/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_clk_rate_trace.c
index 11a8b77dca06..f149554c28ed 100644
--- a/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_clk_rate_trace.c
+++ b/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_clk_rate_trace.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2015, 2017-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
@@ -25,18 +24,45 @@
 #include <linux/clk.h>
 #include "mali_kbase_config_platform.h"
 
+#if MALI_USE_CSF
+#include <asm/arch_timer.h>
+#endif
+
 static void *enumerate_gpu_clk(struct kbase_device *kbdev,
 		unsigned int index)
 {
 	if (index >= kbdev->nr_clocks)
 		return NULL;
 
+#if MALI_USE_CSF
+	if (of_machine_is_compatible("arm,juno"))
+		WARN_ON(kbdev->nr_clocks != 1);
+#endif
+
 	return kbdev->clocks[index];
 }
 
 static unsigned long get_gpu_clk_rate(struct kbase_device *kbdev,
 		void *gpu_clk_handle)
 {
+#if MALI_USE_CSF
+	/* On Juno fpga platforms, the GPU clock rate is reported as 600 MHZ at
+	 * the boot time. Then after the first call to kbase_devfreq_target()
+	 * the clock rate is reported as 450 MHZ and the frequency does not
+	 * change after that. But the actual frequency at which GPU operates
+	 * is always 50 MHz, which is equal to the frequency of system counter
+	 * and HW counters also increment at the same rate.
+	 * DVFS, which is a client of kbase_ipa_control, needs normalization of
+	 * GPU_ACTIVE counter to calculate the time for which GPU has been busy.
+	 * So for the correct normalization need to return the system counter
+	 * frequency value.
+	 * This is a reasonable workaround as the frequency value remains same
+	 * throughout. It can be removed after GPUCORE-25693.
+	 */
+	if (of_machine_is_compatible("arm,juno"))
+		return arch_timer_get_cntfrq();
+#endif
+
 	return clk_get_rate((struct clk *)gpu_clk_handle);
 }
 
@@ -51,12 +77,23 @@ static int gpu_clk_notifier_register(struct kbase_device *kbdev,
 	     sizeof(((struct kbase_gpu_clk_notifier_data *)0)->gpu_clk_handle),
 	     "mismatch in the size of clk member");
 
+#if MALI_USE_CSF
+	/* Frequency is fixed on Juno platforms */
+	if (of_machine_is_compatible("arm,juno"))
+		return 0;
+#endif
+
 	return clk_notifier_register((struct clk *)gpu_clk_handle, nb);
 }
 
 static void gpu_clk_notifier_unregister(struct kbase_device *kbdev,
 		void *gpu_clk_handle, struct notifier_block *nb)
 {
+#if MALI_USE_CSF
+	if (of_machine_is_compatible("arm,juno"))
+		return;
+#endif
+
 	clk_notifier_unregister((struct clk *)gpu_clk_handle, nb);
 }
 
diff --git a/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_config_devicetree.c b/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_config_devicetree.c
index ccefddf882fd..5f300b1913e1 100644
--- a/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_config_devicetree.c
+++ b/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_config_devicetree.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2015, 2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2015, 2017, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase_config.h>
diff --git a/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_config_platform.h b/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_config_platform.h
index 2137b425c1ab..ee9ae52c8608 100644
--- a/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_config_platform.h
+++ b/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_config_platform.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2014-2017, 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
diff --git a/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_runtime_pm.c b/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_runtime_pm.c
index 8772edb56f73..008f8a45f86d 100644
--- a/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_runtime_pm.c
+++ b/drivers/gpu/arm/bifrost/platform/devicetree/mali_kbase_runtime_pm.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2015, 2017-2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2015-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <mali_kbase.h>
diff --git a/drivers/gpu/arm/bifrost/platform/vexpress/Kbuild b/drivers/gpu/arm/bifrost/platform/vexpress/Kbuild
index 6780e4c9433b..c1646478a9dc 100644
--- a/drivers/gpu/arm/bifrost/platform/vexpress/Kbuild
+++ b/drivers/gpu/arm/bifrost/platform/vexpress/Kbuild
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2012-2013, 2016-2017 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2012-2013, 2016-2017, 2020 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,10 +16,8 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
-mali_kbase-y += \
+bifrost_kbase-y += \
 	$(MALI_PLATFORM_DIR)/mali_kbase_config_vexpress.o \
 	mali_kbase_platform_fake.o
diff --git a/drivers/gpu/arm/bifrost/platform/vexpress/mali_kbase_config_platform.h b/drivers/gpu/arm/bifrost/platform/vexpress/mali_kbase_config_platform.h
index fac3cd52182f..97fdd13f22fb 100644
--- a/drivers/gpu/arm/bifrost/platform/vexpress/mali_kbase_config_platform.h
+++ b/drivers/gpu/arm/bifrost/platform/vexpress/mali_kbase_config_platform.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2017, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
diff --git a/drivers/gpu/arm/bifrost/platform/vexpress/mali_kbase_config_vexpress.c b/drivers/gpu/arm/bifrost/platform/vexpress/mali_kbase_config_vexpress.c
index d165ce262814..181681797030 100644
--- a/drivers/gpu/arm/bifrost/platform/vexpress/mali_kbase_config_vexpress.c
+++ b/drivers/gpu/arm/bifrost/platform/vexpress/mali_kbase_config_vexpress.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2011-2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2017, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 #include <linux/ioport.h>
 #include <mali_kbase.h>
 #include <mali_kbase_defs.h>
diff --git a/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/Kbuild b/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/Kbuild
index 51b408efd48a..51ac81b1f189 100644
--- a/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/Kbuild
+++ b/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/Kbuild
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2013-2014, 2016-2017 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2013-2014, 2016-2017, 2020 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,10 +16,8 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
-mali_kbase-y += \
+bifrost_kbase-y += \
 	$(MALI_PLATFORM_DIR)/mali_kbase_config_vexpress.o \
 	mali_kbase_platform_fake.o
diff --git a/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/mali_kbase_config_platform.h b/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/mali_kbase_config_platform.h
index fac3cd52182f..97fdd13f22fb 100644
--- a/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/mali_kbase_config_platform.h
+++ b/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/mali_kbase_config_platform.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2017, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
diff --git a/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/mali_kbase_config_vexpress.c b/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/mali_kbase_config_vexpress.c
index efca0a5b3493..3bb5caf1bbf6 100644
--- a/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/mali_kbase_config_vexpress.c
+++ b/drivers/gpu/arm/bifrost/platform/vexpress_1xv7_a57/mali_kbase_config_vexpress.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2011-2014, 2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2014, 2017, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <linux/ioport.h>
diff --git a/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/Kbuild b/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/Kbuild
index e07709c9b1a5..0000b6d8307c 100644
--- a/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/Kbuild
+++ b/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/Kbuild
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
 # (C) COPYRIGHT 2012-2013, 2016-2017 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,11 +16,9 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
-mali_kbase-y += \
+bifrost_kbase-y += \
 	$(MALI_PLATFORM_DIR)/mali_kbase_config_vexpress.o \
 	$(MALI_PLATFORM_DIR)/mali_kbase_cpu_vexpress.o \
 	mali_kbase_platform_fake.o
diff --git a/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_platform.h b/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_platform.h
index fac3cd52182f..97fdd13f22fb 100644
--- a/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_platform.h
+++ b/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_platform.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014-2017, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /**
diff --git a/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_vexpress.c b/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_vexpress.c
index b6714b95b776..a7a842abf2d1 100644
--- a/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_vexpress.c
+++ b/drivers/gpu/arm/bifrost/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_vexpress.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2011-2014, 2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2011-2014, 2017, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,8 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 #include <linux/ioport.h>
 #include <mali_kbase.h>
 #include <mali_kbase_defs.h>
diff --git a/drivers/gpu/arm/bifrost/protected_mode_switcher.h b/drivers/gpu/arm/bifrost/protected_mode_switcher.h
index 8778d812aea0..d9bab5622f4b 100644
--- a/drivers/gpu/arm/bifrost/protected_mode_switcher.h
+++ b/drivers/gpu/arm/bifrost/protected_mode_switcher.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2017, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _PROTECTED_MODE_SWITCH_H_
@@ -28,35 +27,23 @@ struct protected_mode_device;
 /**
  * struct protected_mode_ops - Callbacks for protected mode switch operations
  *
- * @protected_mode_enable:  Callback to enable protected mode for device
+ * @protected_mode_enable:  Callback to enable protected mode for device, and
+ *                          reset device
+ *                          Returns 0 on success, non-zero on error
  * @protected_mode_disable: Callback to disable protected mode for device
+ *                          Returns 0 on success, non-zero on error
  */
 struct protected_mode_ops {
-	/**
-	 * protected_mode_enable() - Enable protected mode on device
-	 * @dev:	The struct device
-	 *
-	 * Return: 0 on success, non-zero on error
-	 */
 	int (*protected_mode_enable)(
 			struct protected_mode_device *protected_dev);
-
-	/**
-	 * protected_mode_disable() - Disable protected mode on device, and
-	 *                            reset device
-	 * @dev:	The struct device
-	 *
-	 * Return: 0 on success, non-zero on error
-	 */
 	int (*protected_mode_disable)(
 			struct protected_mode_device *protected_dev);
 };
 
 /**
  * struct protected_mode_device - Device structure for protected mode devices
- *
- * @ops  - Callbacks associated with this device
- * @data - Pointer to device private data
+ * @ops:  Callbacks associated with this device
+ * @data: Pointer to device private data
  *
  * This structure should be registered with the platform device using
  * platform_set_drvdata().
diff --git a/drivers/gpu/arm/bifrost/tests/Kbuild b/drivers/gpu/arm/bifrost/tests/Kbuild
index c26bef780781..cf9d7fdc9b17 100644
--- a/drivers/gpu/arm/bifrost/tests/Kbuild
+++ b/drivers/gpu/arm/bifrost/tests/Kbuild
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
 # (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,8 +16,6 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
 obj-$(CONFIG_MALI_KUTF) += kutf/
diff --git a/drivers/gpu/arm/bifrost/tests/Kconfig b/drivers/gpu/arm/bifrost/tests/Kconfig
index 83a4d7764a50..cf2a23a7df11 100644
--- a/drivers/gpu/arm/bifrost/tests/Kconfig
+++ b/drivers/gpu/arm/bifrost/tests/Kconfig
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
 # (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,8 +16,6 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
 source "drivers/gpu/arm/midgard/tests/kutf/Kconfig"
diff --git a/drivers/gpu/arm/bifrost/tests/Mconfig b/drivers/gpu/arm/bifrost/tests/Mconfig
index bba96b3d9e48..e9313ef14fd1 100644
--- a/drivers/gpu/arm/bifrost/tests/Mconfig
+++ b/drivers/gpu/arm/bifrost/tests/Mconfig
@@ -1,19 +1,26 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2018-2020 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can access it online at
+# http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
 #
 
 config UNIT_TEST_KERNEL_MODULES
 	bool
-	default y if UNIT_TEST_CODE && BUILD_KERNEL_MODULES
+	default y if UNIT_TEST_CODE && BACKEND_KERNEL
 	default n
 
 config BUILD_IPA_TESTS
@@ -33,6 +40,10 @@ config BUILD_CSF_TESTS
 
 config BUILD_ARBIF_TESTS
 	bool
-	default y if UNIT_TEST_KERNEL_MODULES && MALI_ARBITER_SUPPORT
+	default y if UNIT_TEST_CODE && MALI_ARBITER_SUPPORT
 	default n
 
+config BUILD_ARBIF_KERNEL_TESTS
+	bool
+	default y if BUILD_KERNEL_MODULES && BUILD_ARBIF_TESTS
+	default n
diff --git a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_helpers.h b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_helpers.h
index 858b9c38b49a..3b8613a06f68 100644
--- a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_helpers.h
+++ b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_helpers.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KERNEL_UTF_HELPERS_H_
diff --git a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_helpers_user.h b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_helpers_user.h
index 3b1300e1ce6f..49aad2921327 100644
--- a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_helpers_user.h
+++ b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_helpers_user.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KERNEL_UTF_HELPERS_USER_H_
@@ -63,7 +62,8 @@ struct kutf_helper_named_val {
  * unrecoverable)
  *
  * Positive values indicate correct access but invalid parsing (can be
- * recovered from assuming data in the future is correct) */
+ * recovered from assuming data in the future is correct)
+ */
 enum kutf_helper_err {
 	/* No error - must be zero */
 	KUTF_HELPER_ERR_NONE = 0,
@@ -71,14 +71,16 @@ enum kutf_helper_err {
 	KUTF_HELPER_ERR_INVALID_NAME,
 	/* Named value parsing of string or u64 type encountered extra
 	 * characters after the value (after the last digit for a u64 type or
-	 * after the string end delimiter for string type) */
+	 * after the string end delimiter for string type)
+	 */
 	KUTF_HELPER_ERR_CHARS_AFTER_VAL,
 	/* Named value parsing of string type couldn't find the string end
 	 * delimiter.
 	 *
 	 * This cannot be encountered when the NAME="value" message exceeds the
 	 * textbuf's maximum line length, because such messages are not checked
-	 * for an end string delimiter */
+	 * for an end string delimiter
+	 */
 	KUTF_HELPER_ERR_NO_END_DELIMITER,
 	/* Named value didn't parse as any of the known types */
 	KUTF_HELPER_ERR_INVALID_VALUE,
@@ -122,7 +124,8 @@ int kutf_helper_max_str_len_for_kern(const char *val_name, int kern_buf_sz);
  *
  * Any failure will be logged on the suite's current test fixture
  *
- * Returns 0 on success, non-zero on failure */
+ * Returns 0 on success, non-zero on failure
+ */
 int kutf_helper_send_named_str(struct kutf_context *context,
 		const char *val_name, const char *val_str);
 
@@ -138,7 +141,8 @@ int kutf_helper_send_named_str(struct kutf_context *context,
  *
  * Returns 0 on success. Negative value on failure to receive from the 'run'
  * file, positive value indicates an enum kutf_helper_err value for correct
- * reception of data but invalid parsing */
+ * reception of data but invalid parsing
+ */
 int kutf_helper_receive_named_val(
 		struct kutf_context *context,
 		struct kutf_helper_named_val *named_val);
@@ -165,7 +169,8 @@ int kutf_helper_receive_named_val(
  * - return value will be 0 to indicate success
  *
  * The rationale behind this is that we'd prefer to continue the rest of the
- * test with failures propagated, rather than hitting a timeout */
+ * test with failures propagated, rather than hitting a timeout
+ */
 int kutf_helper_receive_check_val(
 		struct kutf_helper_named_val *named_val,
 		struct kutf_context *context,
diff --git a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_mem.h b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_mem.h
index 988559de1edf..47c4beacf12f 100644
--- a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_mem.h
+++ b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_mem.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014, 2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2017, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KERNEL_UTF_MEM_H_
diff --git a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_resultset.h b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_resultset.h
index 49ebeb4ec546..1f2dcfab49ec 100644
--- a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_resultset.h
+++ b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_resultset.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014, 2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2017, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KERNEL_UTF_RESULTSET_H_
diff --git a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_suite.h b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_suite.h
index 8d75f506f9eb..426e435a2c67 100644
--- a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_suite.h
+++ b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_suite.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014, 2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2017, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KERNEL_UTF_SUITE_H_
@@ -264,9 +263,10 @@ struct kutf_suite {
 	struct list_head               test_list;
 };
 
-/* ============================================================================
-	Application functions
-============================================================================ */
+/** ===========================================================================
+ * Application functions
+ * ============================================================================
+ */
 
 /**
  * kutf_create_application() - Create an in kernel test application.
@@ -284,9 +284,10 @@ struct kutf_application *kutf_create_application(const char *name);
  */
 void kutf_destroy_application(struct kutf_application *app);
 
-/* ============================================================================
-	Suite functions
-============================================================================ */
+/**============================================================================
+ * Suite functions
+ * ============================================================================
+ */
 
 /**
  * kutf_create_suite() - Create a kernel test suite.
@@ -416,10 +417,10 @@ void kutf_add_test_with_filters_and_data(
 		unsigned int filters,
 		union kutf_callback_data test_data);
 
-
-/* ============================================================================
-	Test functions
-============================================================================ */
+/** ===========================================================================
+ * Test functions
+ * ============================================================================
+ */
 /**
  * kutf_test_log_result_external() - Log a result which has been created
  *                                   externally into a in a standard form
diff --git a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_utils.h b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_utils.h
index 25b8285500d7..e5e2f02621df 100644
--- a/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_utils.h
+++ b/drivers/gpu/arm/bifrost/tests/include/kutf/kutf_utils.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2014, 2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2017, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KERNEL_UTF_UTILS_H_
diff --git a/drivers/gpu/arm/bifrost/tests/kutf/Kbuild b/drivers/gpu/arm/bifrost/tests/kutf/Kbuild
index 2531d41ca28d..bd6540c5006e 100644
--- a/drivers/gpu/arm/bifrost/tests/kutf/Kbuild
+++ b/drivers/gpu/arm/bifrost/tests/kutf/Kbuild
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,8 +16,6 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
 ccflags-y += -I$(src)/../include
diff --git a/drivers/gpu/arm/bifrost/tests/kutf/Kconfig b/drivers/gpu/arm/bifrost/tests/kutf/Kconfig
index 0cdb474c06a3..7ea95b600160 100644
--- a/drivers/gpu/arm/bifrost/tests/kutf/Kconfig
+++ b/drivers/gpu/arm/bifrost/tests/kutf/Kconfig
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,11 +16,8 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
-
 config MALI_KUTF
  tristate "Mali Kernel Unit Test Framework"
  default m
diff --git a/drivers/gpu/arm/bifrost/tests/kutf/Makefile b/drivers/gpu/arm/bifrost/tests/kutf/Makefile
index d848e8774bd0..041f5394bf32 100644
--- a/drivers/gpu/arm/bifrost/tests/kutf/Makefile
+++ b/drivers/gpu/arm/bifrost/tests/kutf/Makefile
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2014-2017, 2020 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,8 +16,6 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
 # linux build system bootstrap for out-of-tree module
diff --git a/drivers/gpu/arm/bifrost/tests/kutf/build.bp b/drivers/gpu/arm/bifrost/tests/kutf/build.bp
index 32eab143e669..707a0531b3b9 100644
--- a/drivers/gpu/arm/bifrost/tests/kutf/build.bp
+++ b/drivers/gpu/arm/bifrost/tests/kutf/build.bp
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2018-2020 ARM Limited. All rights reserved.
@@ -5,11 +6,16 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
  *
  */
 
diff --git a/drivers/gpu/arm/bifrost/tests/kutf/kutf_helpers.c b/drivers/gpu/arm/bifrost/tests/kutf/kutf_helpers.c
index 4463b04792f5..13923fa3121f 100644
--- a/drivers/gpu/arm/bifrost/tests/kutf/kutf_helpers.c
+++ b/drivers/gpu/arm/bifrost/tests/kutf/kutf_helpers.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /* Kernel UTF test helpers */
diff --git a/drivers/gpu/arm/bifrost/tests/kutf/kutf_helpers_user.c b/drivers/gpu/arm/bifrost/tests/kutf/kutf_helpers_user.c
index 108fa82d9b21..84c63be0bed7 100644
--- a/drivers/gpu/arm/bifrost/tests/kutf/kutf_helpers_user.c
+++ b/drivers/gpu/arm/bifrost/tests/kutf/kutf_helpers_user.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /* Kernel UTF test helpers that mirror those for kutf-userside */
@@ -42,7 +41,8 @@ static const char *get_val_type_name(enum kutf_helper_valtype valtype)
 	 * a) "<0 comparison on unsigned type" warning - if we did both upper
 	 *    and lower bound check
 	 * b) incorrect range checking if it was a signed type - if we did
-	 *    upper bound check only */
+	 *    upper bound check only
+	 */
 	unsigned int type_idx = (unsigned int)valtype;
 
 	if (type_idx >= (unsigned int)KUTF_HELPER_VALTYPE_COUNT)
@@ -54,7 +54,8 @@ static const char *get_val_type_name(enum kutf_helper_valtype valtype)
 /* Check up to str_len chars of val_str to see if it's a valid value name:
  *
  * - Has between 1 and KUTF_HELPER_MAX_VAL_NAME_LEN characters before the \0 terminator
- * - And, each char is in the character set [A-Z0-9_] */
+ * - And, each char is in the character set [A-Z0-9_]
+ */
 static int validate_val_name(const char *val_str, int str_len)
 {
 	int i = 0;
@@ -87,7 +88,8 @@ static int validate_val_name(const char *val_str, int str_len)
  * e.g. "str"
  *
  * That is, before any '\\', '\n' or '"' characters. This is so we don't have
- * to escape the string */
+ * to escape the string
+ */
 static int find_quoted_string_valid_len(const char *str)
 {
 	char *ptr;
@@ -207,7 +209,8 @@ int kutf_helper_send_named_str(struct kutf_context *context,
 	str_buf_sz = val_name_len + start_delim_len + val_str_len + end_delim_len + 1;
 
 	/* Using kmalloc() here instead of mempool since we know we need to free
-	 * before we return */
+	 * before we return
+	 */
 	str_buf = kmalloc(str_buf_sz, GFP_KERNEL);
 	if (!str_buf) {
 		errmsg = kutf_dsprintf(&context->fixture_pool,
@@ -218,7 +221,8 @@ int kutf_helper_send_named_str(struct kutf_context *context,
 	copy_ptr = str_buf;
 
 	/* Manually copy each string component instead of snprintf because
-	 * val_str may need to end early, and less error path handling */
+	 * val_str may need to end early, and less error path handling
+	 */
 
 	/* name */
 	memcpy(copy_ptr, val_name, val_name_len);
@@ -331,7 +335,8 @@ int kutf_helper_receive_named_val(
 		/* possibly a number value - strtoull will parse it */
 		err = kstrtoull(recv_str, 0, &u64val);
 		/* unlike userspace can't get an end ptr, but if kstrtoull()
-		 * reads characters after the number it'll report -EINVAL */
+		 * reads characters after the number it'll report -EINVAL
+		 */
 		if (!err) {
 			int len_remain = strnlen(recv_str, recv_sz);
 
@@ -399,7 +404,8 @@ int kutf_helper_receive_check_val(
 		goto out_fail_and_fixup;
 	}
 
-	if (strcmp(named_val->val_name, expect_val_name) != 0) {
+	if (named_val->val_name != NULL &&
+			strcmp(named_val->val_name, expect_val_name) != 0) {
 		const char *msg = kutf_dsprintf(&context->fixture_pool,
 				"Expecting to receive value named '%s' but got '%s'",
 				expect_val_name, named_val->val_name);
diff --git a/drivers/gpu/arm/bifrost/tests/kutf/kutf_mem.c b/drivers/gpu/arm/bifrost/tests/kutf/kutf_mem.c
index fd98beaeb84a..b005b683474c 100644
--- a/drivers/gpu/arm/bifrost/tests/kutf/kutf_mem.c
+++ b/drivers/gpu/arm/bifrost/tests/kutf/kutf_mem.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2014, 2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2017, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /* Kernel UTF memory management functions */
diff --git a/drivers/gpu/arm/bifrost/tests/kutf/kutf_resultset.c b/drivers/gpu/arm/bifrost/tests/kutf/kutf_resultset.c
index 94ecfa4421e1..1eea08c38a85 100644
--- a/drivers/gpu/arm/bifrost/tests/kutf/kutf_resultset.c
+++ b/drivers/gpu/arm/bifrost/tests/kutf/kutf_resultset.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2014, 2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2017, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /* Kernel UTF result management functions */
diff --git a/drivers/gpu/arm/bifrost/tests/kutf/kutf_suite.c b/drivers/gpu/arm/bifrost/tests/kutf/kutf_suite.c
index 9dc6e2b4bad4..4b1dde455e8e 100644
--- a/drivers/gpu/arm/bifrost/tests/kutf/kutf_suite.c
+++ b/drivers/gpu/arm/bifrost/tests/kutf/kutf_suite.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2014, 2017-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,11 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /* Kernel UTF suite, test and fixture management including user to kernel
- * interaction */
+ * interaction
+ */
 
 #include <linux/list.h>
 #include <linux/slab.h>
@@ -598,7 +598,7 @@ static int create_fixture_variant(struct kutf_test_function *test_func,
 		goto fail_file;
 	}
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0)
+#if KERNEL_VERSION(4, 7, 0) <= LINUX_VERSION_CODE
 	tmp = debugfs_create_file_unsafe(
 #else
 	tmp = debugfs_create_file(
@@ -634,7 +634,7 @@ static void kutf_remove_test_variant(struct kutf_test_fixture *test_fix)
 	kfree(test_fix);
 }
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 5, 0)
+#if KERNEL_VERSION(5, 5, 0) <= LINUX_VERSION_CODE
 /* Adapting to the upstream debugfs_create_x32() change */
 static int ktufp_u32_get(void *data, u64 *val)
 {
@@ -679,7 +679,7 @@ void kutf_add_test_with_filters_and_data(
 	}
 
 	test_func->filters = filters;
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 5, 0)
+#if KERNEL_VERSION(5, 5, 0) <= LINUX_VERSION_CODE
 	tmp = debugfs_create_file_unsafe("filters", S_IROTH, test_func->dir,
 					 &test_func->filters, &kutfp_fops_x32_ro);
 #else
@@ -692,7 +692,7 @@ void kutf_add_test_with_filters_and_data(
 	}
 
 	test_func->test_id = id;
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 5, 0)
+#if KERNEL_VERSION(5, 5, 0) <= LINUX_VERSION_CODE
 	debugfs_create_u32("test_id", S_IROTH, test_func->dir,
                        &test_func->test_id);
 #else
diff --git a/drivers/gpu/arm/bifrost/tests/kutf/kutf_utils.c b/drivers/gpu/arm/bifrost/tests/kutf/kutf_utils.c
index 7f5ac517fdb4..f0dad1f68ffb 100644
--- a/drivers/gpu/arm/bifrost/tests/kutf/kutf_utils.c
+++ b/drivers/gpu/arm/bifrost/tests/kutf/kutf_utils.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2014, 2017 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2014, 2017, 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /* Kernel UTF utility functions */
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Kbuild b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Kbuild
index f5565d30f9cf..00b2a41607e1 100644
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Kbuild
+++ b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Kbuild
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
 # (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,8 +16,6 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
 ccflags-y += -I$(src)/../include -I$(src)/../../../ -I$(src)/../../ -I$(src)/../../backend/gpu -I$(srctree)/drivers/staging/android
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Kconfig b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Kconfig
index 8196e4cc6b37..17081ba0f6cf 100644
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Kconfig
+++ b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Kconfig
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
 # (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,8 +16,6 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
 config CONFIG_MALI_CLK_RATE_TRACE_PORTAL
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Makefile b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Makefile
index 71c78b84830c..950acd89b267 100644
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Makefile
+++ b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/Makefile
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
 # (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,8 +16,6 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
 ifneq ($(KERNELRELEASE),)
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/build.bp b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/build.bp
index 0cc2904db542..c16b3dea0918 100644
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/build.bp
+++ b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/build.bp
@@ -1,14 +1,22 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
+ *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
  */
 
 bob_kernel_module {
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/mali_kutf_clk_rate_trace_test.c b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/mali_kutf_clk_rate_trace_test.c
index d74a278bffa7..bd091fa6bc8f 100644
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/mali_kutf_clk_rate_trace_test.c
+++ b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/kernel/mali_kutf_clk_rate_trace_test.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <linux/fdtable.h>
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/mali_kutf_clk_rate_trace_test.h b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/mali_kutf_clk_rate_trace_test.h
index f46afd5086bd..600b025795df 100644
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/mali_kutf_clk_rate_trace_test.h
+++ b/drivers/gpu/arm/bifrost/tests/mali_kutf_clk_rate_trace/mali_kutf_clk_rate_trace_test.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _KUTF_CLK_RATE_TRACE_TEST_H_
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Kbuild b/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Kbuild
index ca8c51273b4c..cc38cb84406c 100644
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Kbuild
+++ b/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Kbuild
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,8 +16,6 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
 ccflags-y += -I$(src)/../include -I$(src)/../../../ -I$(src)/../../ -I$(src)/../../backend/gpu -I$(srctree)/drivers/staging/android
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Kconfig b/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Kconfig
index 78283307713d..90f4ec0a7c7f 100644
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Kconfig
+++ b/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Kconfig
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
-# (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
+# (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,8 +16,6 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
 config MALI_IRQ_LATENCY
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Makefile b/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Makefile
index bc4d654a90ca..cbec0d3ce8ca 100644
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Makefile
+++ b/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/Makefile
@@ -1,10 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
 #
 # (C) COPYRIGHT 2015, 2017-2018, 2020 ARM Limited. All rights reserved.
 #
 # This program is free software and is provided to you under the terms of the
 # GNU General Public License version 2 as published by the Free Software
 # Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
+# of such GNU license.
 #
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,8 +16,6 @@
 # along with this program; if not, you can access it online at
 # http://www.gnu.org/licenses/gpl-2.0.html.
 #
-# SPDX-License-Identifier: GPL-2.0
-#
 #
 
 # linux build system bootstrap for out-of-tree module
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/build.bp b/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/build.bp
index 90efdcf9ad9c..58021c80188c 100644
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/build.bp
+++ b/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/build.bp
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2018-2020 ARM Limited. All rights reserved.
@@ -5,11 +6,16 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
  *
  */
 
diff --git a/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/mali_kutf_irq_test_main.c b/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/mali_kutf_irq_test_main.c
index 5f27c3a7e9b2..e9f276ec4f92 100644
--- a/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/mali_kutf_irq_test_main.c
+++ b/drivers/gpu/arm/bifrost/tests/mali_kutf_irq_test/mali_kutf_irq_test_main.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2016-2018, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2016-2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include <linux/module.h>
@@ -25,8 +24,8 @@
 #include <linux/interrupt.h>
 
 #include "mali_kbase.h"
-#include <midgard/device/mali_kbase_device.h>
-#include <midgard/backend/gpu/mali_kbase_pm_internal.h>
+#include <device/mali_kbase_device.h>
+#include <backend/gpu/mali_kbase_pm_internal.h>
 
 #include <kutf/kutf_suite.h>
 #include <kutf/kutf_utils.h>
@@ -242,7 +241,7 @@ int mali_kutf_irq_test_main_init(void)
 
 	irq_app = kutf_create_application("irq");
 
-	if (NULL == irq_app) {
+	if (irq_app == NULL) {
 		pr_warn("Creation of test application failed!\n");
 		return -ENOMEM;
 	}
@@ -251,7 +250,7 @@ int mali_kutf_irq_test_main_init(void)
 			1, mali_kutf_irq_default_create_fixture,
 			mali_kutf_irq_default_remove_fixture);
 
-	if (NULL == suite) {
+	if (suite == NULL) {
 		pr_warn("Creation of test suite failed!\n");
 		kutf_destroy_application(irq_app);
 		return -ENOMEM;
diff --git a/drivers/gpu/arm/bifrost/thirdparty/mali_kbase_mmap.c b/drivers/gpu/arm/bifrost/thirdparty/mali_kbase_mmap.c
index cd90ea0ec285..a3b4a74ba94a 100644
--- a/drivers/gpu/arm/bifrost/thirdparty/mali_kbase_mmap.c
+++ b/drivers/gpu/arm/bifrost/thirdparty/mali_kbase_mmap.c
@@ -1,24 +1,4 @@
 /*
- *
- * (C) COPYRIGHT ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, you can access it online at
- * http://www.gnu.org/licenses/gpl-2.0.html.
- *
- * SPDX-License-Identifier: GPL-2.0
- *
- *//*
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
@@ -209,7 +189,8 @@ static unsigned long kbase_unmapped_area_topdown(struct vm_unmapped_area_info
 			return -ENOMEM;
 		if (gap_start <= high_limit && gap_end - gap_start >= length) {
 			/* We found a suitable gap. Clip it with the original
-			 * high_limit. */
+			 * high_limit.
+			 */
 			if (gap_end > info->high_limit)
 				gap_end = info->high_limit;
 
@@ -270,6 +251,26 @@ unsigned long kbase_context_get_unmapped_area(struct kbase_context *const kctx,
 	bool is_same_4gb_page = false;
 	unsigned long ret;
 
+	/* the 'nolock' form is used here:
+	 * - the base_pfn of the SAME_VA zone does not change
+	 * - in normal use, va_size_pages is constant once the first allocation
+	 *   begins
+	 *
+	 * However, in abnormal use this function could be processing whilst
+	 * another new zone is being setup in a different thread (e.g. to
+	 * borrow part of the SAME_VA zone). In the worst case, this path may
+	 * witness a higher SAME_VA end_pfn than the code setting up the new
+	 * zone.
+	 *
+	 * This is safe because once we reach the main allocation functions,
+	 * we'll see the updated SAME_VA end_pfn and will determine that there
+	 * is no free region at the address found originally by too large a
+	 * same_va_end_addr here, and will fail the allocation gracefully.
+	 */
+	struct kbase_reg_zone *zone =
+		kbase_ctx_reg_zone_get_nolock(kctx, KBASE_REG_ZONE_SAME_VA);
+	u64 same_va_end_addr = kbase_reg_zone_end_pfn(zone) << PAGE_SHIFT;
+
 	/* err on fixed address */
 	if ((flags & MAP_FIXED) || addr)
 		return -EINVAL;
@@ -280,9 +281,8 @@ unsigned long kbase_context_get_unmapped_area(struct kbase_context *const kctx,
 		return -ENOMEM;
 
 	if (!kbase_ctx_flag(kctx, KCTX_COMPAT)) {
-
-		high_limit = min_t(unsigned long, mm->mmap_base,
-				(kctx->same_va_end << PAGE_SHIFT));
+		high_limit =
+			min_t(unsigned long, mm->mmap_base, same_va_end_addr);
 
 		/* If there's enough (> 33 bits) of GPU VA space, align
 		 * to 2MB boundaries.
@@ -319,18 +319,22 @@ unsigned long kbase_context_get_unmapped_area(struct kbase_context *const kctx,
 				}
 #if !MALI_USE_CSF
 			} else if (reg->flags & KBASE_REG_TILER_ALIGN_TOP) {
-				unsigned long extent_bytes =
-				     (unsigned long)(reg->extent << PAGE_SHIFT);
+				unsigned long extension_bytes =
+					(unsigned long)(reg->extension
+							<< PAGE_SHIFT);
 				/* kbase_check_alloc_sizes() already satisfies
 				 * these checks, but they're here to avoid
 				 * maintenance hazards due to the assumptions
-				 * involved */
-				WARN_ON(reg->extent > (ULONG_MAX >> PAGE_SHIFT));
+				 * involved
+				 */
+				WARN_ON(reg->extension >
+					(ULONG_MAX >> PAGE_SHIFT));
 				WARN_ON(reg->initial_commit > (ULONG_MAX >> PAGE_SHIFT));
-				WARN_ON(!is_power_of_2(extent_bytes));
-				align_mask = extent_bytes - 1;
+				WARN_ON(!is_power_of_2(extension_bytes));
+				align_mask = extension_bytes - 1;
 				align_offset =
-				      extent_bytes - (reg->initial_commit << PAGE_SHIFT);
+					extension_bytes -
+					(reg->initial_commit << PAGE_SHIFT);
 #endif /* !MALI_USE_CSF */
 			} else if (reg->flags & KBASE_REG_GPU_VA_SAME_4GB_PAGE) {
 				is_same_4gb_page = true;
@@ -354,11 +358,10 @@ unsigned long kbase_context_get_unmapped_area(struct kbase_context *const kctx,
 			is_same_4gb_page);
 
 	if (IS_ERR_VALUE(ret) && high_limit == mm->mmap_base &&
-			high_limit < (kctx->same_va_end << PAGE_SHIFT)) {
+	    high_limit < same_va_end_addr) {
 		/* Retry above mmap_base */
 		info.low_limit = mm->mmap_base;
-		info.high_limit = min_t(u64, TASK_SIZE,
-					(kctx->same_va_end << PAGE_SHIFT));
+		info.high_limit = min_t(u64, TASK_SIZE, same_va_end_addr);
 
 		ret = kbase_unmapped_area_topdown(&info, is_shader_code,
 				is_same_4gb_page);
diff --git a/drivers/gpu/arm/bifrost/tl/backend/mali_kbase_timeline_csf.c b/drivers/gpu/arm/bifrost/tl/backend/mali_kbase_timeline_csf.c
index abaa6bb12b9d..7455ce28843d 100644
--- a/drivers/gpu/arm/bifrost/tl/backend/mali_kbase_timeline_csf.c
+++ b/drivers/gpu/arm/bifrost/tl/backend/mali_kbase_timeline_csf.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "../mali_kbase_tracepoints.h"
@@ -60,7 +59,7 @@ void kbase_create_timeline_objects(struct kbase_device *kbdev)
 	/* Lock the context list, to ensure no changes to the list are made
 	 * while we're summarizing the contexts and their contents.
 	 */
-	mutex_lock(&kbdev->kctx_list_lock);
+	mutex_lock(&timeline->tl_kctx_list_lock);
 
 	/* Hold the scheduler lock while we emit the current state
 	 * We also need to continue holding the lock until after the first body
@@ -90,7 +89,7 @@ void kbase_create_timeline_objects(struct kbase_device *kbdev)
 	mutex_unlock(&kbdev->csf.scheduler.lock);
 
 	/* For each context in the device... */
-	list_for_each_entry(kctx, &kbdev->kctx_list, kctx_list_link) {
+	list_for_each_entry(kctx, &timeline->tl_kctx_list, tl_kctx_list_node) {
 		size_t i;
 		struct kbase_tlstream *body =
 			&timeline->streams[TL_STREAM_TYPE_OBJ];
@@ -160,9 +159,9 @@ void kbase_create_timeline_objects(struct kbase_device *kbdev)
 		 * this iteration of the loop, so will start to correctly update
 		 * the object model state.
 		 */
-	};
+	}
 
-	mutex_unlock(&kbdev->kctx_list_lock);
+	mutex_unlock(&timeline->tl_kctx_list_lock);
 
 	/* Static object are placed into summary packet that needs to be
 	 * transmitted first. Flush all streams to make it available to
diff --git a/drivers/gpu/arm/bifrost/tl/backend/mali_kbase_timeline_jm.c b/drivers/gpu/arm/bifrost/tl/backend/mali_kbase_timeline_jm.c
index c368ac7288da..6659d2dc2eb0 100644
--- a/drivers/gpu/arm/bifrost/tl/backend/mali_kbase_timeline_jm.c
+++ b/drivers/gpu/arm/bifrost/tl/backend/mali_kbase_timeline_jm.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "../mali_kbase_tracepoints.h"
@@ -66,16 +65,16 @@ void kbase_create_timeline_objects(struct kbase_device *kbdev)
 	/* Lock the context list, to ensure no changes to the list are made
 	 * while we're summarizing the contexts and their contents.
 	 */
-	mutex_lock(&kbdev->kctx_list_lock);
+	mutex_lock(&timeline->tl_kctx_list_lock);
 
 	/* For each context in the device... */
-	list_for_each_entry(kctx, &kbdev->kctx_list, kctx_list_link) {
+	list_for_each_entry(kctx, &timeline->tl_kctx_list, tl_kctx_list_node) {
 		/* Summarize the context itself */
 		__kbase_tlstream_tl_new_ctx(summary,
 				kctx,
 				kctx->id,
 				(u32)(kctx->tgid));
-	};
+	}
 
 	/* Reset body stream buffers while holding the kctx lock.
 	 * This ensures we can't fire both summary and normal tracepoints for
@@ -87,11 +86,11 @@ void kbase_create_timeline_objects(struct kbase_device *kbdev)
 	 */
 	kbase_timeline_streams_body_reset(timeline);
 
-	mutex_unlock(&kbdev->kctx_list_lock);
+	mutex_unlock(&timeline->tl_kctx_list_lock);
 
 	/* Static object are placed into summary packet that needs to be
 	 * transmitted first. Flush all streams to make it available to
 	 * user space.
 	 */
 	kbase_timeline_streams_flush(timeline);
-}
\ No newline at end of file
+}
diff --git a/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline.c b/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline.c
index 8d8834fdcda6..3370343f8020 100644
--- a/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline.c
+++ b/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2015-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2015-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "mali_kbase_timeline.h"
@@ -116,7 +115,7 @@ int kbase_timeline_init(struct kbase_timeline **timeline,
 	if (!timeline || !timeline_flags)
 		return -EINVAL;
 
-	result = kzalloc(sizeof(*result), GFP_KERNEL);
+	result = vzalloc(sizeof(*result));
 	if (!result)
 		return -ENOMEM;
 
@@ -128,6 +127,10 @@ int kbase_timeline_init(struct kbase_timeline **timeline,
 		kbase_tlstream_init(&result->streams[i], i,
 			&result->event_queue);
 
+	/* Initialize the kctx list */
+	mutex_init(&result->tl_kctx_list_lock);
+	INIT_LIST_HEAD(&result->tl_kctx_list);
+
 	/* Initialize autoflush timer. */
 	atomic_set(&result->autoflush_timer_active, 0);
 	kbase_timer_setup(&result->autoflush_timer,
@@ -154,10 +157,12 @@ void kbase_timeline_term(struct kbase_timeline *timeline)
 	kbase_csf_tl_reader_term(&timeline->csf_tl_reader);
 #endif
 
+	WARN_ON(!list_empty(&timeline->tl_kctx_list));
+
 	for (i = (enum tl_stream_type)0; i < TL_STREAM_TYPE_COUNT; i++)
 		kbase_tlstream_term(&timeline->streams[i]);
 
-	kfree(timeline);
+	vfree(timeline);
 }
 
 #ifdef CONFIG_MALI_BIFROST_DEVFREQ
@@ -172,11 +177,7 @@ static void kbase_tlstream_current_devfreq_target(struct kbase_device *kbdev)
 		unsigned long cur_freq = 0;
 
 		mutex_lock(&devfreq->lock);
-#if KERNEL_VERSION(4, 3, 0) > LINUX_VERSION_CODE
-		cur_freq = kbdev->current_nominal_freq;
-#else
 		cur_freq = devfreq->last_status.current_frequency;
-#endif
 		KBASE_TLSTREAM_AUX_DEVFREQ_TARGET(kbdev, (u64)cur_freq);
 		mutex_unlock(&devfreq->lock);
 	}
@@ -185,7 +186,7 @@ static void kbase_tlstream_current_devfreq_target(struct kbase_device *kbdev)
 
 int kbase_timeline_io_acquire(struct kbase_device *kbdev, u32 flags)
 {
-	int ret;
+	int ret = 0;
 	u32 timeline_flags = TLSTREAM_ENABLED | flags;
 	struct kbase_timeline *timeline = kbdev->timeline;
 
@@ -261,19 +262,30 @@ int kbase_timeline_io_acquire(struct kbase_device *kbdev, u32 flags)
 		ret = -EBUSY;
 	}
 
+	if (ret >= 0)
+		timeline->last_acquire_time = ktime_get();
+
 	return ret;
 }
 
-void kbase_timeline_streams_flush(struct kbase_timeline *timeline)
+int kbase_timeline_streams_flush(struct kbase_timeline *timeline)
 {
 	enum tl_stream_type stype;
-
+	bool has_bytes = false;
+	size_t nbytes = 0;
 #if MALI_USE_CSF
-	kbase_csf_tl_reader_flush_buffer(&timeline->csf_tl_reader);
+	int ret = kbase_csf_tl_reader_flush_buffer(&timeline->csf_tl_reader);
+
+	if (ret > 0)
+		has_bytes = true;
 #endif
 
-	for (stype = 0; stype < TL_STREAM_TYPE_COUNT; stype++)
-		kbase_tlstream_flush_stream(&timeline->streams[stype]);
+	for (stype = 0; stype < TL_STREAM_TYPE_COUNT; stype++) {
+		nbytes = kbase_tlstream_flush_stream(&timeline->streams[stype]);
+		if (nbytes > 0)
+			has_bytes = true;
+	}
+	return has_bytes ? 0 : -EIO;
 }
 
 void kbase_timeline_streams_body_reset(struct kbase_timeline *timeline)
@@ -288,6 +300,74 @@ void kbase_timeline_streams_body_reset(struct kbase_timeline *timeline)
 #endif
 }
 
+void kbase_timeline_pre_kbase_context_destroy(struct kbase_context *kctx)
+{
+	struct kbase_device *const kbdev = kctx->kbdev;
+	struct kbase_timeline *timeline = kbdev->timeline;
+
+	/* Remove the context from the list to ensure we don't try and
+	 * summarize a context that is being destroyed.
+	 *
+	 * It's unsafe to try and summarize a context being destroyed as the
+	 * locks we might normally attempt to acquire, and the data structures
+	 * we would normally attempt to traverse could already be destroyed.
+	 *
+	 * In the case where the tlstream is acquired between this pre destroy
+	 * call and the post destroy call, we will get a context destroy
+	 * tracepoint without the corresponding context create tracepoint,
+	 * but this will not affect the correctness of the object model.
+	 */
+	mutex_lock(&timeline->tl_kctx_list_lock);
+	list_del_init(&kctx->tl_kctx_list_node);
+	mutex_unlock(&timeline->tl_kctx_list_lock);
+}
+
+void kbase_timeline_post_kbase_context_create(struct kbase_context *kctx)
+{
+	struct kbase_device *const kbdev = kctx->kbdev;
+	struct kbase_timeline *timeline = kbdev->timeline;
+
+	/* On context create, add the context to the list to ensure it is
+	 * summarized when timeline is acquired
+	 */
+	mutex_lock(&timeline->tl_kctx_list_lock);
+
+	list_add(&kctx->tl_kctx_list_node, &timeline->tl_kctx_list);
+
+	/* Fire the tracepoints with the lock held to ensure the tracepoints
+	 * are either fired before or after the summarization,
+	 * never in parallel with it. If fired in parallel, we could get
+	 * duplicate creation tracepoints.
+	 */
+#if MALI_USE_CSF
+	KBASE_TLSTREAM_TL_KBASE_NEW_CTX(
+		kbdev, kctx->id, kbdev->gpu_props.props.raw_props.gpu_id);
+#endif
+	/* Trace with the AOM tracepoint even in CSF for dumping */
+	KBASE_TLSTREAM_TL_NEW_CTX(kbdev, kctx, kctx->id, 0);
+
+	mutex_unlock(&timeline->tl_kctx_list_lock);
+}
+
+void kbase_timeline_post_kbase_context_destroy(struct kbase_context *kctx)
+{
+	struct kbase_device *const kbdev = kctx->kbdev;
+
+	/* Trace with the AOM tracepoint even in CSF for dumping */
+	KBASE_TLSTREAM_TL_DEL_CTX(kbdev, kctx);
+#if MALI_USE_CSF
+	KBASE_TLSTREAM_TL_KBASE_DEL_CTX(kbdev, kctx->id);
+#endif
+
+	/* Flush the timeline stream, so the user can see the termination
+	 * tracepoints being fired.
+	 * The "if" statement below is for optimization. It is safe to call
+	 * kbase_timeline_streams_flush when timeline is disabled.
+	 */
+	if (atomic_read(&kbdev->timeline_flags) != 0)
+		kbase_timeline_streams_flush(kbdev->timeline);
+}
+
 #if MALI_UNIT_TEST
 void kbase_timeline_stats(struct kbase_timeline *timeline,
 		u32 *bytes_collected, u32 *bytes_generated)
diff --git a/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline.h b/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline.h
index cd48411b45cf..04653521285d 100644
--- a/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline.h
+++ b/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2015-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2015-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #if !defined(_KBASE_TIMELINE_H)
@@ -70,8 +69,10 @@ int kbase_timeline_io_acquire(struct kbase_device *kbdev, u32 flags);
  * @timeline:     Timeline instance
  *
  * Function will flush pending data in all timeline streams.
+ *
+ * Return: Zero on success, errno on failure.
  */
-void kbase_timeline_streams_flush(struct kbase_timeline *timeline);
+int kbase_timeline_streams_flush(struct kbase_timeline *timeline);
 
 /**
  * kbase_timeline_streams_body_reset - reset timeline body streams.
@@ -81,33 +82,31 @@ void kbase_timeline_streams_flush(struct kbase_timeline *timeline);
  */
 void kbase_timeline_streams_body_reset(struct kbase_timeline *timeline);
 
-#if MALI_UNIT_TEST
 /**
- * kbase_timeline_test - start timeline stream data generator
- * @kbdev:     Kernel common context
- * @tpw_count: Number of trace point writers in each context
- * @msg_delay: Time delay in milliseconds between trace points written by one
- *             writer
- * @msg_count: Number of trace points written by one writer
- * @aux_msg:   If non-zero aux messages will be included
+ * kbase_timeline_post_kbase_context_create - Inform timeline that a new KBase
+ *                                            Context has been created.
+ * @kctx:    KBase Context
+ */
+void kbase_timeline_post_kbase_context_create(struct kbase_context *kctx);
+
+/**
+ * kbase_timeline_pre_kbase_context_destroy - Inform timeline that a KBase
+ *                                            Context is about to be destroyed.
+ * @kctx:    KBase Context
+ */
+void kbase_timeline_pre_kbase_context_destroy(struct kbase_context *kctx);
+
+/**
+ * kbase_timeline_post_kbase_context_destroy - Inform timeline that a KBase
+ *                                             Context has been destroyed.
+ * @kctx:    KBase Context
  *
- * This test starts a requested number of asynchronous writers in both IRQ and
- * thread context. Each writer will generate required number of test
- * tracepoints (tracepoints with embedded information about writer that
- * should be verified by user space reader). Tracepoints will be emitted in
- * all timeline body streams. If aux_msg is non-zero writer will also
- * generate not testable tracepoints (tracepoints without information about
- * writer). These tracepoints are used to check correctness of remaining
- * timeline message generating functions. Writer will wait requested time
- * between generating another set of messages. This call blocks until all
- * writers finish.
+ * Should be called immediately before the memory is freed, and the context ID
+ * and kbdev pointer should still be valid.
  */
-void kbase_timeline_test(
-	struct kbase_device *kbdev,
-	unsigned int tpw_count,
-	unsigned int msg_delay,
-	unsigned int msg_count,
-	int          aux_msg);
+void kbase_timeline_post_kbase_context_destroy(struct kbase_context *kctx);
+
+#if MALI_UNIT_TEST
 
 /**
  * kbase_timeline_stats - read timeline stream statistics
diff --git a/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline_io.c b/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline_io.c
index 724f5fa23725..e3b6fbc1eaeb 100644
--- a/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline_io.c
+++ b/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline_io.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,35 +17,38 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "mali_kbase_timeline_priv.h"
 #include "mali_kbase_tlstream.h"
 #include "mali_kbase_tracepoints.h"
+#include "mali_kbase_timeline.h"
 
+#include <linux/delay.h>
 #include <linux/poll.h>
 
 /* The timeline stream file operations functions. */
-static ssize_t kbasep_timeline_io_read(
-		struct file *filp,
-		char __user *buffer,
-		size_t      size,
-		loff_t      *f_pos);
-static unsigned int kbasep_timeline_io_poll(struct file *filp, poll_table *wait);
+static ssize_t kbasep_timeline_io_read(struct file *filp, char __user *buffer,
+				       size_t size, loff_t *f_pos);
+static unsigned int kbasep_timeline_io_poll(struct file *filp,
+					    poll_table *wait);
 static int kbasep_timeline_io_release(struct inode *inode, struct file *filp);
+static int kbasep_timeline_io_fsync(struct file *filp, loff_t start, loff_t end,
+				    int datasync);
 
 /* The timeline stream file operations structure. */
 const struct file_operations kbasep_tlstream_fops = {
 	.owner = THIS_MODULE,
 	.release = kbasep_timeline_io_release,
-	.read    = kbasep_timeline_io_read,
-	.poll    = kbasep_timeline_io_poll,
+	.read = kbasep_timeline_io_read,
+	.poll = kbasep_timeline_io_poll,
+	.fsync = kbasep_timeline_io_fsync,
 };
 
 /**
- * kbasep_timeline_io_packet_pending - check timeline streams for pending packets
+ * kbasep_timeline_io_packet_pending - check timeline streams for pending
+ *                                     packets
+ *
  * @timeline:      Timeline instance
  * @ready_stream:  Pointer to variable where stream will be placed
  * @rb_idx_raw:    Pointer to variable where read buffer index will be placed
@@ -56,10 +60,10 @@ const struct file_operations kbasep_tlstream_fops = {
  *
  * Return: non-zero if any of timeline streams has at last one packet ready
  */
-static int kbasep_timeline_io_packet_pending(
-		struct kbase_timeline  *timeline,
-		struct kbase_tlstream **ready_stream,
-		unsigned int           *rb_idx_raw)
+static int
+kbasep_timeline_io_packet_pending(struct kbase_timeline *timeline,
+				  struct kbase_tlstream **ready_stream,
+				  unsigned int *rb_idx_raw)
 {
 	enum tl_stream_type i;
 
@@ -78,27 +82,24 @@ static int kbasep_timeline_io_packet_pending(
 			*ready_stream = stream;
 			return 1;
 		}
-
 	}
 
 	return 0;
 }
 
 /**
- * kbasep_timeline_has_header_data() -
- *	check timeline headers for pending packets
+ * kbasep_timeline_has_header_data() - check timeline headers for pending
+ *                                     packets
  *
  * @timeline:      Timeline instance
  *
  * Return: non-zero if any of timeline headers has at last one packet ready.
  */
-static int kbasep_timeline_has_header_data(
-	struct kbase_timeline *timeline)
+static int kbasep_timeline_has_header_data(struct kbase_timeline *timeline)
 {
-	return timeline->obj_header_btc
-		|| timeline->aux_header_btc
+	return timeline->obj_header_btc || timeline->aux_header_btc
 #if MALI_USE_CSF
-		|| timeline->csf_tl_reader.tl_header.btc
+	       || timeline->csf_tl_reader.tl_header.btc
 #endif
 		;
 }
@@ -116,11 +117,9 @@ static int kbasep_timeline_has_header_data(
  *
  * Returns: 0 if success, -1 otherwise.
  */
-static inline int copy_stream_header(
-	char __user *buffer, size_t size, ssize_t *copy_len,
-	const char *hdr,
-	size_t hdr_size,
-	size_t *hdr_btc)
+static inline int copy_stream_header(char __user *buffer, size_t size,
+				     ssize_t *copy_len, const char *hdr,
+				     size_t hdr_size, size_t *hdr_btc)
 {
 	const size_t offset = hdr_size - *hdr_btc;
 	const size_t copy_size = MIN(size - *copy_len, *hdr_btc);
@@ -142,6 +141,7 @@ static inline int copy_stream_header(
 
 /**
  * kbasep_timeline_copy_header - copy timeline headers to the user
+ *
  * @timeline:    Timeline instance
  * @buffer:      Pointer to the buffer provided by user
  * @size:        Maximum amount of data that can be stored in the buffer
@@ -154,36 +154,30 @@ static inline int copy_stream_header(
  *
  * Returns: 0 if success, -1 if copy_to_user has failed.
  */
-static inline int kbasep_timeline_copy_headers(
-	struct kbase_timeline *timeline,
-	char __user *buffer,
-	size_t size,
-	ssize_t *copy_len)
+static inline int kbasep_timeline_copy_headers(struct kbase_timeline *timeline,
+					       char __user *buffer, size_t size,
+					       ssize_t *copy_len)
 {
-	if (copy_stream_header(buffer, size, copy_len,
-			obj_desc_header,
-			obj_desc_header_size,
-			&timeline->obj_header_btc))
+	if (copy_stream_header(buffer, size, copy_len, obj_desc_header,
+			       obj_desc_header_size, &timeline->obj_header_btc))
 		return -1;
 
-	if (copy_stream_header(buffer, size, copy_len,
-			aux_desc_header,
-			aux_desc_header_size,
-			&timeline->aux_header_btc))
+	if (copy_stream_header(buffer, size, copy_len, aux_desc_header,
+			       aux_desc_header_size, &timeline->aux_header_btc))
 		return -1;
 #if MALI_USE_CSF
 	if (copy_stream_header(buffer, size, copy_len,
-			timeline->csf_tl_reader.tl_header.data,
-			timeline->csf_tl_reader.tl_header.size,
-			&timeline->csf_tl_reader.tl_header.btc))
+			       timeline->csf_tl_reader.tl_header.data,
+			       timeline->csf_tl_reader.tl_header.size,
+			       &timeline->csf_tl_reader.tl_header.btc))
 		return -1;
 #endif
 	return 0;
 }
 
-
 /**
  * kbasep_timeline_io_read - copy data from streams to buffer provided by user
+ *
  * @filp:   Pointer to file structure
  * @buffer: Pointer to the buffer provided by user
  * @size:   Maximum amount of data that can be stored in the buffer
@@ -191,11 +185,8 @@ static inline int kbasep_timeline_copy_headers(
  *
  * Return: number of bytes stored in the buffer
  */
-static ssize_t kbasep_timeline_io_read(
-		struct file *filp,
-		char __user *buffer,
-		size_t      size,
-		loff_t      *f_pos)
+static ssize_t kbasep_timeline_io_read(struct file *filp, char __user *buffer,
+				       size_t size, loff_t *f_pos)
 {
 	ssize_t copy_len = 0;
 	struct kbase_timeline *timeline;
@@ -206,25 +197,25 @@ static ssize_t kbasep_timeline_io_read(
 	if (WARN_ON(!filp->private_data))
 		return -EFAULT;
 
-	timeline = (struct kbase_timeline *) filp->private_data;
+	timeline = (struct kbase_timeline *)filp->private_data;
 
 	if (!buffer)
 		return -EINVAL;
 
-	if ((*f_pos < 0) || (size < PACKET_SIZE))
+	if (*f_pos < 0)
 		return -EINVAL;
 
 	mutex_lock(&timeline->reader_lock);
 
 	while (copy_len < size) {
 		struct kbase_tlstream *stream = NULL;
-		unsigned int        rb_idx_raw = 0;
-		unsigned int        wb_idx_raw;
-		unsigned int        rb_idx;
-		size_t              rb_size;
+		unsigned int rb_idx_raw = 0;
+		unsigned int wb_idx_raw;
+		unsigned int rb_idx;
+		size_t rb_size;
 
-		if (kbasep_timeline_copy_headers(
-			    timeline, buffer, size, &copy_len)) {
+		if (kbasep_timeline_copy_headers(timeline, buffer, size,
+						 &copy_len)) {
 			copy_len = -EFAULT;
 			break;
 		}
@@ -236,17 +227,13 @@ static ssize_t kbasep_timeline_io_read(
 		 */
 		if (copy_len > 0) {
 			if (!kbasep_timeline_io_packet_pending(
-						timeline,
-						&stream,
-						&rb_idx_raw))
+				    timeline, &stream, &rb_idx_raw))
 				break;
 		} else {
 			if (wait_event_interruptible(
-						timeline->event_queue,
-						kbasep_timeline_io_packet_pending(
-							timeline,
-							&stream,
-							&rb_idx_raw))) {
+				    timeline->event_queue,
+				    kbasep_timeline_io_packet_pending(
+					    timeline, &stream, &rb_idx_raw))) {
 				copy_len = -ERESTARTSYS;
 				break;
 			}
@@ -264,10 +251,8 @@ static ssize_t kbasep_timeline_io_read(
 		rb_size = atomic_read(&stream->buffer[rb_idx].size);
 		if (rb_size > size - copy_len)
 			break;
-		if (copy_to_user(
-					&buffer[copy_len],
-					stream->buffer[rb_idx].data,
-					rb_size)) {
+		if (copy_to_user(&buffer[copy_len], stream->buffer[rb_idx].data,
+				 rb_size)) {
 			copy_len = -EFAULT;
 			break;
 		}
@@ -309,7 +294,7 @@ static ssize_t kbasep_timeline_io_read(
 static unsigned int kbasep_timeline_io_poll(struct file *filp, poll_table *wait)
 {
 	struct kbase_tlstream *stream;
-	unsigned int        rb_idx;
+	unsigned int rb_idx;
 	struct kbase_timeline *timeline;
 
 	KBASE_DEBUG_ASSERT(filp);
@@ -318,7 +303,7 @@ static unsigned int kbasep_timeline_io_poll(struct file *filp, poll_table *wait)
 	if (WARN_ON(!filp->private_data))
 		return -EFAULT;
 
-	timeline = (struct kbase_timeline *) filp->private_data;
+	timeline = (struct kbase_timeline *)filp->private_data;
 
 	/* If there are header bytes to copy, read will not block */
 	if (kbasep_timeline_has_header_data(timeline))
@@ -340,6 +325,8 @@ static unsigned int kbasep_timeline_io_poll(struct file *filp, poll_table *wait)
 static int kbasep_timeline_io_release(struct inode *inode, struct file *filp)
 {
 	struct kbase_timeline *timeline;
+	ktime_t elapsed_time;
+	s64 elapsed_time_ms, time_to_sleep;
 
 	KBASE_DEBUG_ASSERT(inode);
 	KBASE_DEBUG_ASSERT(filp);
@@ -347,7 +334,19 @@ static int kbasep_timeline_io_release(struct inode *inode, struct file *filp)
 
 	CSTD_UNUSED(inode);
 
-	timeline = (struct kbase_timeline *) filp->private_data;
+	timeline = (struct kbase_timeline *)filp->private_data;
+
+	/* Get the amount of time passed since the timeline was acquired and ensure
+	 * we sleep for long enough such that it has been at least
+	 * TIMELINE_HYSTERESIS_TIMEOUT_MS amount of time between acquire and release.
+	 * This prevents userspace from spamming acquire and release too quickly.
+	 */
+	elapsed_time = ktime_sub(ktime_get(), timeline->last_acquire_time);
+	elapsed_time_ms = ktime_to_ms(elapsed_time);
+	time_to_sleep = MIN(TIMELINE_HYSTERESIS_TIMEOUT_MS,
+	                    TIMELINE_HYSTERESIS_TIMEOUT_MS - elapsed_time_ms);
+	if (time_to_sleep > 0)
+		msleep(time_to_sleep);
 
 #if MALI_USE_CSF
 	kbase_csf_tl_reader_stop(&timeline->csf_tl_reader);
@@ -360,3 +359,20 @@ static int kbasep_timeline_io_release(struct inode *inode, struct file *filp)
 	atomic_set(timeline->timeline_flags, 0);
 	return 0;
 }
+
+static int kbasep_timeline_io_fsync(struct file *filp, loff_t start, loff_t end,
+				    int datasync)
+{
+	struct kbase_timeline *timeline;
+
+	CSTD_UNUSED(start);
+	CSTD_UNUSED(end);
+	CSTD_UNUSED(datasync);
+
+	if (WARN_ON(!filp->private_data))
+		return -EFAULT;
+
+	timeline = (struct kbase_timeline *)filp->private_data;
+
+	return kbase_timeline_streams_flush(timeline);
+}
diff --git a/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline_priv.h b/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline_priv.h
index 35eec467af90..8a58a13a78ea 100644
--- a/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline_priv.h
+++ b/drivers/gpu/arm/bifrost/tl/mali_kbase_timeline_priv.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #if !defined(_KBASE_TIMELINE_PRIV_H)
@@ -35,9 +34,16 @@
 #include <linux/atomic.h>
 #include <linux/mutex.h>
 
+/* The minimum amount of time timeline must be acquired for before release is
+ * allowed, to prevent DoS attacks.
+ */
+#define TIMELINE_HYSTERESIS_TIMEOUT_MS ((s64)500)
+
 /**
  * struct kbase_timeline - timeline state structure
  * @streams:                The timeline streams generated by kernel
+ * @tl_kctx_list:           List of contexts for timeline.
+ * @tl_kctx_list_lock:      Lock to protect @tl_kctx_list.
  * @autoflush_timer:        Autoflush timer
  * @autoflush_timer_active: If non-zero autoflush timer is active
  * @reader_lock:            Reader lock. Only one reader is allowed to
@@ -48,9 +54,13 @@
  *                          otherwise. See kbase_timeline_io_acquire().
  * @obj_header_btc:         Remaining bytes to copy for the object stream header
  * @aux_header_btc:         Remaining bytes to copy for the aux stream header
+ * @last_acquire_time:      The time at which timeline was last acquired.
+ * @csf_tl_reader:          CSFFW timeline reader
  */
 struct kbase_timeline {
 	struct kbase_tlstream streams[TL_STREAM_TYPE_COUNT];
+	struct list_head  tl_kctx_list;
+	struct mutex      tl_kctx_list_lock;
 	struct timer_list autoflush_timer;
 	atomic_t          autoflush_timer_active;
 	struct mutex      reader_lock;
@@ -61,6 +71,7 @@ struct kbase_timeline {
 	atomic_t         *timeline_flags;
 	size_t            obj_header_btc;
 	size_t            aux_header_btc;
+	ktime_t           last_acquire_time;
 #if MALI_USE_CSF
 	struct kbase_csf_tl_reader csf_tl_reader;
 #endif
diff --git a/drivers/gpu/arm/bifrost/tl/mali_kbase_tl_serialize.h b/drivers/gpu/arm/bifrost/tl/mali_kbase_tl_serialize.h
index 3e378279cf2c..f8cad4a6f8f8 100644
--- a/drivers/gpu/arm/bifrost/tl/mali_kbase_tl_serialize.h
+++ b/drivers/gpu/arm/bifrost/tl/mali_kbase_tl_serialize.h
@@ -1,3 +1,4 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
  * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
@@ -5,7 +6,7 @@
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #if !defined(_KBASE_TL_SERIALIZE_H)
diff --git a/drivers/gpu/arm/bifrost/tl/mali_kbase_tlstream.c b/drivers/gpu/arm/bifrost/tl/mali_kbase_tlstream.c
index f4239cfafb9d..202c12f57572 100644
--- a/drivers/gpu/arm/bifrost/tl/mali_kbase_tlstream.c
+++ b/drivers/gpu/arm/bifrost/tl/mali_kbase_tlstream.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2015-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2015-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #include "mali_kbase_tlstream.h"
@@ -57,20 +56,19 @@ static void kbasep_packet_header_setup(
  * @numbered:   non-zero if the stream is numbered
  *
  * Function updates mutable part of packet header in the given buffer.
- * Note that value of data_size must not including size of the header.
+ * Note that value of data_size must not include size of the header.
  */
 static void kbasep_packet_header_update(
 		char  *buffer,
 		size_t data_size,
 		int    numbered)
 {
-	u32 word0;
 	u32 word1 = MIPE_PACKET_HEADER_W1((u32)data_size, !!numbered);
 
 	KBASE_DEBUG_ASSERT(buffer);
-	CSTD_UNUSED(word0);
 
-	memcpy(&buffer[sizeof(word0)], &word1, sizeof(word1));
+	/* we copy the contents of word1 to its respective position in the buffer */
+	memcpy(&buffer[sizeof(u32)], &word1, sizeof(word1));
 }
 
 /**
@@ -149,12 +147,12 @@ void kbase_tlstream_init(
 	unsigned int i;
 
 	KBASE_DEBUG_ASSERT(stream);
-	KBASE_DEBUG_ASSERT(TL_STREAM_TYPE_COUNT > stream_type);
+	KBASE_DEBUG_ASSERT(stream_type < TL_STREAM_TYPE_COUNT);
 
 	spin_lock_init(&stream->lock);
 
 	/* All packets carrying tracepoints shall be numbered. */
-	if (TL_PACKET_TYPE_BODY == tl_stream_cfg[stream_type].pkt_type)
+	if (tl_stream_cfg[stream_type].pkt_type == TL_PACKET_TYPE_BODY)
 		stream->numbered = 1;
 	else
 		stream->numbered = 0;
@@ -217,7 +215,8 @@ static size_t kbasep_tlstream_msgbuf_submit(
 
 	/* Increasing write buffer index will expose this packet to the reader.
 	 * As stream->lock is not taken on reader side we must make sure memory
-	 * is updated correctly before this will happen. */
+	 * is updated correctly before this will happen.
+	 */
 	smp_wmb();
 	atomic_inc(&stream->wbi);
 
@@ -251,7 +250,7 @@ char *kbase_tlstream_msgbuf_acquire(
 	wb_size    = atomic_read(&stream->buffer[wb_idx].size);
 
 	/* Select next buffer if data will not fit into current one. */
-	if (PACKET_SIZE < wb_size + msg_size) {
+	if (wb_size + msg_size > PACKET_SIZE) {
 		wb_size = kbasep_tlstream_msgbuf_submit(
 				stream, wb_idx_raw, wb_size);
 		wb_idx  = (wb_idx_raw + 1) % PACKET_COUNT;
@@ -277,7 +276,7 @@ void kbase_tlstream_msgbuf_release(
 	spin_unlock_irqrestore(&stream->lock, flags);
 }
 
-void kbase_tlstream_flush_stream(
+size_t kbase_tlstream_flush_stream(
 	struct kbase_tlstream *stream)
 {
 	unsigned long    flags;
@@ -286,6 +285,7 @@ void kbase_tlstream_flush_stream(
 	size_t           wb_size;
 	size_t           min_size = PACKET_HEADER_SIZE;
 
+
 	if (stream->numbered)
 		min_size += PACKET_NUMBER_SIZE;
 
@@ -300,7 +300,14 @@ void kbase_tlstream_flush_stream(
 				stream, wb_idx_raw, wb_size);
 		wb_idx = (wb_idx_raw + 1) % PACKET_COUNT;
 		atomic_set(&stream->buffer[wb_idx].size, wb_size);
+	} else {
+		/* we return that there is no bytes to be read.*/
+		/* Timeline io fsync will use this info the decide whether
+		 * fsync should return an error
+		 */
+		wb_size = 0;
 	}
+
 	spin_unlock_irqrestore(&stream->lock, flags);
+	return wb_size;
 }
-
diff --git a/drivers/gpu/arm/bifrost/tl/mali_kbase_tlstream.h b/drivers/gpu/arm/bifrost/tl/mali_kbase_tlstream.h
index faf88d676b5d..2d3bbc8ccac9 100644
--- a/drivers/gpu/arm/bifrost/tl/mali_kbase_tlstream.h
+++ b/drivers/gpu/arm/bifrost/tl/mali_kbase_tlstream.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2015-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2015-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #if !defined(_KBASE_TLSTREAM_H)
@@ -44,6 +43,8 @@
  * struct kbase_tlstream - timeline stream structure
  * @lock:              Message order lock
  * @buffer:            Array of buffers
+ * @buffer.size:       Number of bytes in buffer
+ * @buffer.data:       Buffer's data
  * @wbi:               Write buffer index
  * @rbi:               Read buffer index
  * @numbered:          If non-zero stream's packets are sequentially numbered
@@ -76,8 +77,8 @@ struct kbase_tlstream {
 	spinlock_t lock;
 
 	struct {
-		atomic_t size;              /* number of bytes in buffer */
-		char     data[PACKET_SIZE]; /* buffer's data */
+		atomic_t size;
+		char data[PACKET_SIZE];
 	} buffer[PACKET_COUNT];
 
 	atomic_t wbi;
@@ -162,8 +163,10 @@ void kbase_tlstream_msgbuf_release(struct kbase_tlstream *stream,
  * @stream:     Pointer to the stream structure
  *
  * Flush pending data in the timeline stream.
+ *
+ * Return: Number of bytes available flushed and available to be read
+ *
  */
-void kbase_tlstream_flush_stream(struct kbase_tlstream *stream);
+size_t kbase_tlstream_flush_stream(struct kbase_tlstream *stream);
 
 #endif /* _KBASE_TLSTREAM_H */
-
diff --git a/drivers/gpu/arm/bifrost/tl/mali_kbase_tracepoints.c b/drivers/gpu/arm/bifrost/tl/mali_kbase_tracepoints.c
index de76fa57051e..ece23b318b31 100644
--- a/drivers/gpu/arm/bifrost/tl/mali_kbase_tracepoints.c
+++ b/drivers/gpu/arm/bifrost/tl/mali_kbase_tracepoints.c
@@ -1,11 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -70,6 +69,7 @@ enum tl_msg_id_obj {
 	KBASE_TL_ARBITER_STARTED,
 	KBASE_TL_ARBITER_STOP_REQUESTED,
 	KBASE_TL_ARBITER_STOPPED,
+	KBASE_TL_ARBITER_REQUESTED,
 	KBASE_JD_GPU_SOFT_RESET,
 	KBASE_TL_KBASE_NEW_DEVICE,
 	KBASE_TL_KBASE_DEVICE_PROGRAM_CSG,
@@ -87,6 +87,8 @@ enum tl_msg_id_obj {
 	KBASE_TL_KBASE_KCPUQUEUE_ENQUEUE_MAP_IMPORT,
 	KBASE_TL_KBASE_KCPUQUEUE_ENQUEUE_UNMAP_IMPORT,
 	KBASE_TL_KBASE_KCPUQUEUE_ENQUEUE_UNMAP_IMPORT_FORCE,
+	KBASE_TL_KBASE_KCPUQUEUE_ENQUEUE_ERROR_BARRIER,
+	KBASE_TL_KBASE_KCPUQUEUE_ENQUEUE_GROUP_SUSPEND,
 	KBASE_TL_KBASE_ARRAY_BEGIN_KCPUQUEUE_ENQUEUE_JIT_ALLOC,
 	KBASE_TL_KBASE_ARRAY_ITEM_KCPUQUEUE_ENQUEUE_JIT_ALLOC,
 	KBASE_TL_KBASE_ARRAY_END_KCPUQUEUE_ENQUEUE_JIT_ALLOC,
@@ -114,7 +116,9 @@ enum tl_msg_id_obj {
 	KBASE_TL_KBASE_ARRAY_BEGIN_KCPUQUEUE_EXECUTE_JIT_FREE_END,
 	KBASE_TL_KBASE_ARRAY_ITEM_KCPUQUEUE_EXECUTE_JIT_FREE_END,
 	KBASE_TL_KBASE_ARRAY_END_KCPUQUEUE_EXECUTE_JIT_FREE_END,
-	KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_ERRORBARRIER,
+	KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_ERROR_BARRIER,
+	KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_GROUP_SUSPEND_START,
+	KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_GROUP_SUSPEND_END,
 	KBASE_TL_KBASE_CSFFW_TLSTREAM_OVERFLOW,
 	KBASE_TL_KBASE_CSFFW_RESET,
 	KBASE_OBJ_MSG_COUNT,
@@ -131,6 +135,7 @@ enum tl_msg_id_aux {
 	KBASE_AUX_PROTECTED_LEAVE_START,
 	KBASE_AUX_PROTECTED_LEAVE_END,
 	KBASE_AUX_JIT_STATS,
+	KBASE_AUX_TILER_HEAP_STATS,
 	KBASE_AUX_EVENT_JOB_SLOT,
 	KBASE_AUX_MSG_COUNT,
 };
@@ -284,6 +289,10 @@ enum tl_msg_id_aux {
 		"Driver has stopped using gpu", \
 		"@p", \
 		"gpu") \
+	TRACEPOINT_DESC(KBASE_TL_ARBITER_REQUESTED, \
+		"Driver has requested the arbiter for gpu access", \
+		"@p", \
+		"gpu") \
 	TRACEPOINT_DESC(KBASE_JD_GPU_SOFT_RESET, \
 		"gpu soft reset", \
 		"@p", \
@@ -334,8 +343,8 @@ enum tl_msg_id_aux {
 		"kcpu_queue,fence") \
 	TRACEPOINT_DESC(KBASE_TL_KBASE_KCPUQUEUE_ENQUEUE_CQS_WAIT, \
 		"KCPU Queue enqueues Wait on Cross Queue Sync Object", \
-		"@pLI", \
-		"kcpu_queue,cqs_obj_gpu_addr,cqs_obj_compare_value") \
+		"@pLII", \
+		"kcpu_queue,cqs_obj_gpu_addr,cqs_obj_compare_value,cqs_obj_inherit_error") \
 	TRACEPOINT_DESC(KBASE_TL_KBASE_KCPUQUEUE_ENQUEUE_CQS_SET, \
 		"KCPU Queue enqueues Set on Cross Queue Sync Object", \
 		"@pL", \
@@ -352,6 +361,14 @@ enum tl_msg_id_aux {
 		"KCPU Queue enqueues Unmap Import ignoring reference count", \
 		"@pL", \
 		"kcpu_queue,map_import_buf_gpu_addr") \
+	TRACEPOINT_DESC(KBASE_TL_KBASE_KCPUQUEUE_ENQUEUE_ERROR_BARRIER, \
+		"KCPU Queue enqueues Error Barrier", \
+		"@p", \
+		"kcpu_queue") \
+	TRACEPOINT_DESC(KBASE_TL_KBASE_KCPUQUEUE_ENQUEUE_GROUP_SUSPEND, \
+		"KCPU Queue enqueues Group Suspend", \
+		"@ppI", \
+		"kcpu_queue,group_suspend_buf,gpu_cmdq_grp_handle") \
 	TRACEPOINT_DESC(KBASE_TL_KBASE_ARRAY_BEGIN_KCPUQUEUE_ENQUEUE_JIT_ALLOC, \
 		"Begin array of KCPU Queue enqueues JIT Alloc", \
 		"@p", \
@@ -382,52 +399,52 @@ enum tl_msg_id_aux {
 		"kcpu_queue") \
 	TRACEPOINT_DESC(KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_FENCE_SIGNAL_END, \
 		"KCPU Queue ends a Signal on Fence", \
-		"@p", \
-		"kcpu_queue") \
+		"@pI", \
+		"kcpu_queue,execute_error") \
 	TRACEPOINT_DESC(KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_FENCE_WAIT_START, \
 		"KCPU Queue starts a Wait on Fence", \
 		"@p", \
 		"kcpu_queue") \
 	TRACEPOINT_DESC(KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_FENCE_WAIT_END, \
 		"KCPU Queue ends a Wait on Fence", \
-		"@p", \
-		"kcpu_queue") \
+		"@pI", \
+		"kcpu_queue,execute_error") \
 	TRACEPOINT_DESC(KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_CQS_WAIT_START, \
 		"KCPU Queue starts a Wait on an array of Cross Queue Sync Objects", \
 		"@p", \
 		"kcpu_queue") \
 	TRACEPOINT_DESC(KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_CQS_WAIT_END, \
 		"KCPU Queue ends a Wait on an array of Cross Queue Sync Objects", \
-		"@p", \
-		"kcpu_queue") \
+		"@pI", \
+		"kcpu_queue,execute_error") \
 	TRACEPOINT_DESC(KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_CQS_SET, \
 		"KCPU Queue executes a Set on an array of Cross Queue Sync Objects", \
-		"@p", \
-		"kcpu_queue") \
+		"@pI", \
+		"kcpu_queue,execute_error") \
 	TRACEPOINT_DESC(KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_MAP_IMPORT_START, \
 		"KCPU Queue starts a Map Import", \
 		"@p", \
 		"kcpu_queue") \
 	TRACEPOINT_DESC(KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_MAP_IMPORT_END, \
 		"KCPU Queue ends a Map Import", \
-		"@p", \
-		"kcpu_queue") \
+		"@pI", \
+		"kcpu_queue,execute_error") \
 	TRACEPOINT_DESC(KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_UNMAP_IMPORT_START, \
 		"KCPU Queue starts an Unmap Import", \
 		"@p", \
 		"kcpu_queue") \
 	TRACEPOINT_DESC(KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_UNMAP_IMPORT_END, \
 		"KCPU Queue ends an Unmap Import", \
-		"@p", \
-		"kcpu_queue") \
+		"@pI", \
+		"kcpu_queue,execute_error") \
 	TRACEPOINT_DESC(KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_UNMAP_IMPORT_FORCE_START, \
 		"KCPU Queue starts an Unmap Import ignoring reference count", \
 		"@p", \
 		"kcpu_queue") \
 	TRACEPOINT_DESC(KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_UNMAP_IMPORT_FORCE_END, \
 		"KCPU Queue ends an Unmap Import ignoring reference count", \
-		"@p", \
-		"kcpu_queue") \
+		"@pI", \
+		"kcpu_queue,execute_error") \
 	TRACEPOINT_DESC(KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_JIT_ALLOC_START, \
 		"KCPU Queue starts an array of JIT Allocs", \
 		"@p", \
@@ -438,8 +455,8 @@ enum tl_msg_id_aux {
 		"kcpu_queue") \
 	TRACEPOINT_DESC(KBASE_TL_KBASE_ARRAY_ITEM_KCPUQUEUE_EXECUTE_JIT_ALLOC_END, \
 		"Array item of KCPU Queue ends an array of JIT Allocs", \
-		"@pLL", \
-		"kcpu_queue,jit_alloc_gpu_alloc_addr,jit_alloc_mmu_flags") \
+		"@pILL", \
+		"kcpu_queue,execute_error,jit_alloc_gpu_alloc_addr,jit_alloc_mmu_flags") \
 	TRACEPOINT_DESC(KBASE_TL_KBASE_ARRAY_END_KCPUQUEUE_EXECUTE_JIT_ALLOC_END, \
 		"End array of KCPU Queue ends an array of JIT Allocs", \
 		"@p", \
@@ -454,16 +471,24 @@ enum tl_msg_id_aux {
 		"kcpu_queue") \
 	TRACEPOINT_DESC(KBASE_TL_KBASE_ARRAY_ITEM_KCPUQUEUE_EXECUTE_JIT_FREE_END, \
 		"Array item of KCPU Queue ends an array of JIT Frees", \
-		"@pL", \
-		"kcpu_queue,jit_free_pages_used") \
+		"@pIL", \
+		"kcpu_queue,execute_error,jit_free_pages_used") \
 	TRACEPOINT_DESC(KBASE_TL_KBASE_ARRAY_END_KCPUQUEUE_EXECUTE_JIT_FREE_END, \
 		"End array of KCPU Queue ends an array of JIT Frees", \
 		"@p", \
 		"kcpu_queue") \
-	TRACEPOINT_DESC(KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_ERRORBARRIER, \
+	TRACEPOINT_DESC(KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_ERROR_BARRIER, \
 		"KCPU Queue executes an Error Barrier", \
 		"@p", \
 		"kcpu_queue") \
+	TRACEPOINT_DESC(KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_GROUP_SUSPEND_START, \
+		"KCPU Queue starts a group suspend", \
+		"@p", \
+		"kcpu_queue") \
+	TRACEPOINT_DESC(KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_GROUP_SUSPEND_END, \
+		"KCPU Queue ends a group suspend", \
+		"@pI", \
+		"kcpu_queue,execute_error") \
 	TRACEPOINT_DESC(KBASE_TL_KBASE_CSFFW_TLSTREAM_OVERFLOW, \
 		"An overflow has happened with the CSFFW Timeline stream", \
 		"@LL", \
@@ -521,6 +546,10 @@ const size_t  obj_desc_header_size = sizeof(__obj_desc_header);
 		"per-bin JIT statistics", \
 		"@IIIIII", \
 		"ctx_nr,bid,max_allocs,allocs,va_pages,ph_pages") \
+	TRACEPOINT_DESC(KBASE_AUX_TILER_HEAP_STATS, \
+		"Tiler Heap statistics", \
+		"@ILIIIIIII", \
+		"ctx_nr,heap_id,va_pages,ph_pages,max_chunks,chunk_size,chunk_count,target_in_flight,nr_in_flight") \
 	TRACEPOINT_DESC(KBASE_AUX_EVENT_JOB_SLOT, \
 		"event on a given job slot", \
 		"@pIII", \
@@ -1541,6 +1570,28 @@ void __kbase_tlstream_tl_arbiter_stopped(
 	kbase_tlstream_msgbuf_release(stream, acq_flags);
 }
 
+void __kbase_tlstream_tl_arbiter_requested(
+	struct kbase_tlstream *stream,
+	const void *gpu)
+{
+	const u32 msg_id = KBASE_TL_ARBITER_REQUESTED;
+	const size_t msg_size = sizeof(msg_id) + sizeof(u64)
+		+ sizeof(gpu)
+		;
+	char *buffer;
+	unsigned long acq_flags;
+	size_t pos = 0;
+
+	buffer = kbase_tlstream_msgbuf_acquire(stream, msg_size, &acq_flags);
+
+	pos = kbasep_serialize_bytes(buffer, pos, &msg_id, sizeof(msg_id));
+	pos = kbasep_serialize_timestamp(buffer, pos);
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &gpu, sizeof(gpu));
+
+	kbase_tlstream_msgbuf_release(stream, acq_flags);
+}
+
 void __kbase_tlstream_jd_gpu_soft_reset(
 	struct kbase_tlstream *stream,
 	const void *gpu)
@@ -1797,6 +1848,60 @@ void __kbase_tlstream_aux_jit_stats(
 	kbase_tlstream_msgbuf_release(stream, acq_flags);
 }
 
+void __kbase_tlstream_aux_tiler_heap_stats(
+	struct kbase_tlstream *stream,
+	u32 ctx_nr,
+	u64 heap_id,
+	u32 va_pages,
+	u32 ph_pages,
+	u32 max_chunks,
+	u32 chunk_size,
+	u32 chunk_count,
+	u32 target_in_flight,
+	u32 nr_in_flight)
+{
+	const u32 msg_id = KBASE_AUX_TILER_HEAP_STATS;
+	const size_t msg_size = sizeof(msg_id) + sizeof(u64)
+		+ sizeof(ctx_nr)
+		+ sizeof(heap_id)
+		+ sizeof(va_pages)
+		+ sizeof(ph_pages)
+		+ sizeof(max_chunks)
+		+ sizeof(chunk_size)
+		+ sizeof(chunk_count)
+		+ sizeof(target_in_flight)
+		+ sizeof(nr_in_flight)
+		;
+	char *buffer;
+	unsigned long acq_flags;
+	size_t pos = 0;
+
+	buffer = kbase_tlstream_msgbuf_acquire(stream, msg_size, &acq_flags);
+
+	pos = kbasep_serialize_bytes(buffer, pos, &msg_id, sizeof(msg_id));
+	pos = kbasep_serialize_timestamp(buffer, pos);
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &ctx_nr, sizeof(ctx_nr));
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &heap_id, sizeof(heap_id));
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &va_pages, sizeof(va_pages));
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &ph_pages, sizeof(ph_pages));
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &max_chunks, sizeof(max_chunks));
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &chunk_size, sizeof(chunk_size));
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &chunk_count, sizeof(chunk_count));
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &target_in_flight, sizeof(target_in_flight));
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &nr_in_flight, sizeof(nr_in_flight));
+
+	kbase_tlstream_msgbuf_release(stream, acq_flags);
+}
+
 void __kbase_tlstream_aux_event_job_slot(
 	struct kbase_tlstream *stream,
 	const void *ctx,
@@ -2125,13 +2230,15 @@ void __kbase_tlstream_tl_kbase_kcpuqueue_enqueue_cqs_wait(
 	struct kbase_tlstream *stream,
 	const void *kcpu_queue,
 	u64 cqs_obj_gpu_addr,
-	u32 cqs_obj_compare_value)
+	u32 cqs_obj_compare_value,
+	u32 cqs_obj_inherit_error)
 {
 	const u32 msg_id = KBASE_TL_KBASE_KCPUQUEUE_ENQUEUE_CQS_WAIT;
 	const size_t msg_size = sizeof(msg_id) + sizeof(u64)
 		+ sizeof(kcpu_queue)
 		+ sizeof(cqs_obj_gpu_addr)
 		+ sizeof(cqs_obj_compare_value)
+		+ sizeof(cqs_obj_inherit_error)
 		;
 	char *buffer;
 	unsigned long acq_flags;
@@ -2147,6 +2254,8 @@ void __kbase_tlstream_tl_kbase_kcpuqueue_enqueue_cqs_wait(
 		pos, &cqs_obj_gpu_addr, sizeof(cqs_obj_gpu_addr));
 	pos = kbasep_serialize_bytes(buffer,
 		pos, &cqs_obj_compare_value, sizeof(cqs_obj_compare_value));
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &cqs_obj_inherit_error, sizeof(cqs_obj_inherit_error));
 
 	kbase_tlstream_msgbuf_release(stream, acq_flags);
 }
@@ -2255,6 +2364,58 @@ void __kbase_tlstream_tl_kbase_kcpuqueue_enqueue_unmap_import_force(
 	kbase_tlstream_msgbuf_release(stream, acq_flags);
 }
 
+void __kbase_tlstream_tl_kbase_kcpuqueue_enqueue_error_barrier(
+	struct kbase_tlstream *stream,
+	const void *kcpu_queue)
+{
+	const u32 msg_id = KBASE_TL_KBASE_KCPUQUEUE_ENQUEUE_ERROR_BARRIER;
+	const size_t msg_size = sizeof(msg_id) + sizeof(u64)
+		+ sizeof(kcpu_queue)
+		;
+	char *buffer;
+	unsigned long acq_flags;
+	size_t pos = 0;
+
+	buffer = kbase_tlstream_msgbuf_acquire(stream, msg_size, &acq_flags);
+
+	pos = kbasep_serialize_bytes(buffer, pos, &msg_id, sizeof(msg_id));
+	pos = kbasep_serialize_timestamp(buffer, pos);
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &kcpu_queue, sizeof(kcpu_queue));
+
+	kbase_tlstream_msgbuf_release(stream, acq_flags);
+}
+
+void __kbase_tlstream_tl_kbase_kcpuqueue_enqueue_group_suspend(
+	struct kbase_tlstream *stream,
+	const void *kcpu_queue,
+	const void *group_suspend_buf,
+	u32 gpu_cmdq_grp_handle)
+{
+	const u32 msg_id = KBASE_TL_KBASE_KCPUQUEUE_ENQUEUE_GROUP_SUSPEND;
+	const size_t msg_size = sizeof(msg_id) + sizeof(u64)
+		+ sizeof(kcpu_queue)
+		+ sizeof(group_suspend_buf)
+		+ sizeof(gpu_cmdq_grp_handle)
+		;
+	char *buffer;
+	unsigned long acq_flags;
+	size_t pos = 0;
+
+	buffer = kbase_tlstream_msgbuf_acquire(stream, msg_size, &acq_flags);
+
+	pos = kbasep_serialize_bytes(buffer, pos, &msg_id, sizeof(msg_id));
+	pos = kbasep_serialize_timestamp(buffer, pos);
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &kcpu_queue, sizeof(kcpu_queue));
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &group_suspend_buf, sizeof(group_suspend_buf));
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &gpu_cmdq_grp_handle, sizeof(gpu_cmdq_grp_handle));
+
+	kbase_tlstream_msgbuf_release(stream, acq_flags);
+}
+
 void __kbase_tlstream_tl_kbase_array_begin_kcpuqueue_enqueue_jit_alloc(
 	struct kbase_tlstream *stream,
 	const void *kcpu_queue)
@@ -2451,11 +2612,13 @@ void __kbase_tlstream_tl_kbase_kcpuqueue_execute_fence_signal_start(
 
 void __kbase_tlstream_tl_kbase_kcpuqueue_execute_fence_signal_end(
 	struct kbase_tlstream *stream,
-	const void *kcpu_queue)
+	const void *kcpu_queue,
+	u32 execute_error)
 {
 	const u32 msg_id = KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_FENCE_SIGNAL_END;
 	const size_t msg_size = sizeof(msg_id) + sizeof(u64)
 		+ sizeof(kcpu_queue)
+		+ sizeof(execute_error)
 		;
 	char *buffer;
 	unsigned long acq_flags;
@@ -2467,6 +2630,8 @@ void __kbase_tlstream_tl_kbase_kcpuqueue_execute_fence_signal_end(
 	pos = kbasep_serialize_timestamp(buffer, pos);
 	pos = kbasep_serialize_bytes(buffer,
 		pos, &kcpu_queue, sizeof(kcpu_queue));
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &execute_error, sizeof(execute_error));
 
 	kbase_tlstream_msgbuf_release(stream, acq_flags);
 }
@@ -2495,11 +2660,13 @@ void __kbase_tlstream_tl_kbase_kcpuqueue_execute_fence_wait_start(
 
 void __kbase_tlstream_tl_kbase_kcpuqueue_execute_fence_wait_end(
 	struct kbase_tlstream *stream,
-	const void *kcpu_queue)
+	const void *kcpu_queue,
+	u32 execute_error)
 {
 	const u32 msg_id = KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_FENCE_WAIT_END;
 	const size_t msg_size = sizeof(msg_id) + sizeof(u64)
 		+ sizeof(kcpu_queue)
+		+ sizeof(execute_error)
 		;
 	char *buffer;
 	unsigned long acq_flags;
@@ -2511,6 +2678,8 @@ void __kbase_tlstream_tl_kbase_kcpuqueue_execute_fence_wait_end(
 	pos = kbasep_serialize_timestamp(buffer, pos);
 	pos = kbasep_serialize_bytes(buffer,
 		pos, &kcpu_queue, sizeof(kcpu_queue));
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &execute_error, sizeof(execute_error));
 
 	kbase_tlstream_msgbuf_release(stream, acq_flags);
 }
@@ -2539,11 +2708,13 @@ void __kbase_tlstream_tl_kbase_kcpuqueue_execute_cqs_wait_start(
 
 void __kbase_tlstream_tl_kbase_kcpuqueue_execute_cqs_wait_end(
 	struct kbase_tlstream *stream,
-	const void *kcpu_queue)
+	const void *kcpu_queue,
+	u32 execute_error)
 {
 	const u32 msg_id = KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_CQS_WAIT_END;
 	const size_t msg_size = sizeof(msg_id) + sizeof(u64)
 		+ sizeof(kcpu_queue)
+		+ sizeof(execute_error)
 		;
 	char *buffer;
 	unsigned long acq_flags;
@@ -2555,17 +2726,21 @@ void __kbase_tlstream_tl_kbase_kcpuqueue_execute_cqs_wait_end(
 	pos = kbasep_serialize_timestamp(buffer, pos);
 	pos = kbasep_serialize_bytes(buffer,
 		pos, &kcpu_queue, sizeof(kcpu_queue));
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &execute_error, sizeof(execute_error));
 
 	kbase_tlstream_msgbuf_release(stream, acq_flags);
 }
 
 void __kbase_tlstream_tl_kbase_kcpuqueue_execute_cqs_set(
 	struct kbase_tlstream *stream,
-	const void *kcpu_queue)
+	const void *kcpu_queue,
+	u32 execute_error)
 {
 	const u32 msg_id = KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_CQS_SET;
 	const size_t msg_size = sizeof(msg_id) + sizeof(u64)
 		+ sizeof(kcpu_queue)
+		+ sizeof(execute_error)
 		;
 	char *buffer;
 	unsigned long acq_flags;
@@ -2577,6 +2752,8 @@ void __kbase_tlstream_tl_kbase_kcpuqueue_execute_cqs_set(
 	pos = kbasep_serialize_timestamp(buffer, pos);
 	pos = kbasep_serialize_bytes(buffer,
 		pos, &kcpu_queue, sizeof(kcpu_queue));
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &execute_error, sizeof(execute_error));
 
 	kbase_tlstream_msgbuf_release(stream, acq_flags);
 }
@@ -2605,11 +2782,13 @@ void __kbase_tlstream_tl_kbase_kcpuqueue_execute_map_import_start(
 
 void __kbase_tlstream_tl_kbase_kcpuqueue_execute_map_import_end(
 	struct kbase_tlstream *stream,
-	const void *kcpu_queue)
+	const void *kcpu_queue,
+	u32 execute_error)
 {
 	const u32 msg_id = KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_MAP_IMPORT_END;
 	const size_t msg_size = sizeof(msg_id) + sizeof(u64)
 		+ sizeof(kcpu_queue)
+		+ sizeof(execute_error)
 		;
 	char *buffer;
 	unsigned long acq_flags;
@@ -2621,6 +2800,8 @@ void __kbase_tlstream_tl_kbase_kcpuqueue_execute_map_import_end(
 	pos = kbasep_serialize_timestamp(buffer, pos);
 	pos = kbasep_serialize_bytes(buffer,
 		pos, &kcpu_queue, sizeof(kcpu_queue));
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &execute_error, sizeof(execute_error));
 
 	kbase_tlstream_msgbuf_release(stream, acq_flags);
 }
@@ -2649,11 +2830,13 @@ void __kbase_tlstream_tl_kbase_kcpuqueue_execute_unmap_import_start(
 
 void __kbase_tlstream_tl_kbase_kcpuqueue_execute_unmap_import_end(
 	struct kbase_tlstream *stream,
-	const void *kcpu_queue)
+	const void *kcpu_queue,
+	u32 execute_error)
 {
 	const u32 msg_id = KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_UNMAP_IMPORT_END;
 	const size_t msg_size = sizeof(msg_id) + sizeof(u64)
 		+ sizeof(kcpu_queue)
+		+ sizeof(execute_error)
 		;
 	char *buffer;
 	unsigned long acq_flags;
@@ -2665,6 +2848,8 @@ void __kbase_tlstream_tl_kbase_kcpuqueue_execute_unmap_import_end(
 	pos = kbasep_serialize_timestamp(buffer, pos);
 	pos = kbasep_serialize_bytes(buffer,
 		pos, &kcpu_queue, sizeof(kcpu_queue));
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &execute_error, sizeof(execute_error));
 
 	kbase_tlstream_msgbuf_release(stream, acq_flags);
 }
@@ -2693,11 +2878,13 @@ void __kbase_tlstream_tl_kbase_kcpuqueue_execute_unmap_import_force_start(
 
 void __kbase_tlstream_tl_kbase_kcpuqueue_execute_unmap_import_force_end(
 	struct kbase_tlstream *stream,
-	const void *kcpu_queue)
+	const void *kcpu_queue,
+	u32 execute_error)
 {
 	const u32 msg_id = KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_UNMAP_IMPORT_FORCE_END;
 	const size_t msg_size = sizeof(msg_id) + sizeof(u64)
 		+ sizeof(kcpu_queue)
+		+ sizeof(execute_error)
 		;
 	char *buffer;
 	unsigned long acq_flags;
@@ -2709,6 +2896,8 @@ void __kbase_tlstream_tl_kbase_kcpuqueue_execute_unmap_import_force_end(
 	pos = kbasep_serialize_timestamp(buffer, pos);
 	pos = kbasep_serialize_bytes(buffer,
 		pos, &kcpu_queue, sizeof(kcpu_queue));
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &execute_error, sizeof(execute_error));
 
 	kbase_tlstream_msgbuf_release(stream, acq_flags);
 }
@@ -2760,12 +2949,14 @@ void __kbase_tlstream_tl_kbase_array_begin_kcpuqueue_execute_jit_alloc_end(
 void __kbase_tlstream_tl_kbase_array_item_kcpuqueue_execute_jit_alloc_end(
 	struct kbase_tlstream *stream,
 	const void *kcpu_queue,
+	u32 execute_error,
 	u64 jit_alloc_gpu_alloc_addr,
 	u64 jit_alloc_mmu_flags)
 {
 	const u32 msg_id = KBASE_TL_KBASE_ARRAY_ITEM_KCPUQUEUE_EXECUTE_JIT_ALLOC_END;
 	const size_t msg_size = sizeof(msg_id) + sizeof(u64)
 		+ sizeof(kcpu_queue)
+		+ sizeof(execute_error)
 		+ sizeof(jit_alloc_gpu_alloc_addr)
 		+ sizeof(jit_alloc_mmu_flags)
 		;
@@ -2779,6 +2970,8 @@ void __kbase_tlstream_tl_kbase_array_item_kcpuqueue_execute_jit_alloc_end(
 	pos = kbasep_serialize_timestamp(buffer, pos);
 	pos = kbasep_serialize_bytes(buffer,
 		pos, &kcpu_queue, sizeof(kcpu_queue));
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &execute_error, sizeof(execute_error));
 	pos = kbasep_serialize_bytes(buffer,
 		pos, &jit_alloc_gpu_alloc_addr, sizeof(jit_alloc_gpu_alloc_addr));
 	pos = kbasep_serialize_bytes(buffer,
@@ -2856,11 +3049,13 @@ void __kbase_tlstream_tl_kbase_array_begin_kcpuqueue_execute_jit_free_end(
 void __kbase_tlstream_tl_kbase_array_item_kcpuqueue_execute_jit_free_end(
 	struct kbase_tlstream *stream,
 	const void *kcpu_queue,
+	u32 execute_error,
 	u64 jit_free_pages_used)
 {
 	const u32 msg_id = KBASE_TL_KBASE_ARRAY_ITEM_KCPUQUEUE_EXECUTE_JIT_FREE_END;
 	const size_t msg_size = sizeof(msg_id) + sizeof(u64)
 		+ sizeof(kcpu_queue)
+		+ sizeof(execute_error)
 		+ sizeof(jit_free_pages_used)
 		;
 	char *buffer;
@@ -2873,6 +3068,8 @@ void __kbase_tlstream_tl_kbase_array_item_kcpuqueue_execute_jit_free_end(
 	pos = kbasep_serialize_timestamp(buffer, pos);
 	pos = kbasep_serialize_bytes(buffer,
 		pos, &kcpu_queue, sizeof(kcpu_queue));
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &execute_error, sizeof(execute_error));
 	pos = kbasep_serialize_bytes(buffer,
 		pos, &jit_free_pages_used, sizeof(jit_free_pages_used));
 
@@ -2901,13 +3098,59 @@ void __kbase_tlstream_tl_kbase_array_end_kcpuqueue_execute_jit_free_end(
 	kbase_tlstream_msgbuf_release(stream, acq_flags);
 }
 
-void __kbase_tlstream_tl_kbase_kcpuqueue_execute_errorbarrier(
+void __kbase_tlstream_tl_kbase_kcpuqueue_execute_error_barrier(
+	struct kbase_tlstream *stream,
+	const void *kcpu_queue)
+{
+	const u32 msg_id = KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_ERROR_BARRIER;
+	const size_t msg_size = sizeof(msg_id) + sizeof(u64)
+		+ sizeof(kcpu_queue)
+		;
+	char *buffer;
+	unsigned long acq_flags;
+	size_t pos = 0;
+
+	buffer = kbase_tlstream_msgbuf_acquire(stream, msg_size, &acq_flags);
+
+	pos = kbasep_serialize_bytes(buffer, pos, &msg_id, sizeof(msg_id));
+	pos = kbasep_serialize_timestamp(buffer, pos);
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &kcpu_queue, sizeof(kcpu_queue));
+
+	kbase_tlstream_msgbuf_release(stream, acq_flags);
+}
+
+void __kbase_tlstream_tl_kbase_kcpuqueue_execute_group_suspend_start(
 	struct kbase_tlstream *stream,
 	const void *kcpu_queue)
 {
-	const u32 msg_id = KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_ERRORBARRIER;
+	const u32 msg_id = KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_GROUP_SUSPEND_START;
+	const size_t msg_size = sizeof(msg_id) + sizeof(u64)
+		+ sizeof(kcpu_queue)
+		;
+	char *buffer;
+	unsigned long acq_flags;
+	size_t pos = 0;
+
+	buffer = kbase_tlstream_msgbuf_acquire(stream, msg_size, &acq_flags);
+
+	pos = kbasep_serialize_bytes(buffer, pos, &msg_id, sizeof(msg_id));
+	pos = kbasep_serialize_timestamp(buffer, pos);
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &kcpu_queue, sizeof(kcpu_queue));
+
+	kbase_tlstream_msgbuf_release(stream, acq_flags);
+}
+
+void __kbase_tlstream_tl_kbase_kcpuqueue_execute_group_suspend_end(
+	struct kbase_tlstream *stream,
+	const void *kcpu_queue,
+	u32 execute_error)
+{
+	const u32 msg_id = KBASE_TL_KBASE_KCPUQUEUE_EXECUTE_GROUP_SUSPEND_END;
 	const size_t msg_size = sizeof(msg_id) + sizeof(u64)
 		+ sizeof(kcpu_queue)
+		+ sizeof(execute_error)
 		;
 	char *buffer;
 	unsigned long acq_flags;
@@ -2919,6 +3162,8 @@ void __kbase_tlstream_tl_kbase_kcpuqueue_execute_errorbarrier(
 	pos = kbasep_serialize_timestamp(buffer, pos);
 	pos = kbasep_serialize_bytes(buffer,
 		pos, &kcpu_queue, sizeof(kcpu_queue));
+	pos = kbasep_serialize_bytes(buffer,
+		pos, &execute_error, sizeof(execute_error));
 
 	kbase_tlstream_msgbuf_release(stream, acq_flags);
 }
diff --git a/drivers/gpu/arm/bifrost/tl/mali_kbase_tracepoints.h b/drivers/gpu/arm/bifrost/tl/mali_kbase_tracepoints.h
index 5651f0a0fc57..7a8164b06291 100644
--- a/drivers/gpu/arm/bifrost/tl/mali_kbase_tracepoints.h
+++ b/drivers/gpu/arm/bifrost/tl/mali_kbase_tracepoints.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -238,6 +237,9 @@ void __kbase_tlstream_tl_arbiter_stop_requested(
 void __kbase_tlstream_tl_arbiter_stopped(
 	struct kbase_tlstream *stream,
 	const void *gpu);
+void __kbase_tlstream_tl_arbiter_requested(
+	struct kbase_tlstream *stream,
+	const void *gpu);
 void __kbase_tlstream_jd_gpu_soft_reset(
 	struct kbase_tlstream *stream,
 	const void *gpu);
@@ -277,6 +279,17 @@ void __kbase_tlstream_aux_jit_stats(
 	u32 allocs,
 	u32 va_pages,
 	u32 ph_pages);
+void __kbase_tlstream_aux_tiler_heap_stats(
+	struct kbase_tlstream *stream,
+	u32 ctx_nr,
+	u64 heap_id,
+	u32 va_pages,
+	u32 ph_pages,
+	u32 max_chunks,
+	u32 chunk_size,
+	u32 chunk_count,
+	u32 target_in_flight,
+	u32 nr_in_flight);
 void __kbase_tlstream_aux_event_job_slot(
 	struct kbase_tlstream *stream,
 	const void *ctx,
@@ -332,7 +345,8 @@ void __kbase_tlstream_tl_kbase_kcpuqueue_enqueue_cqs_wait(
 	struct kbase_tlstream *stream,
 	const void *kcpu_queue,
 	u64 cqs_obj_gpu_addr,
-	u32 cqs_obj_compare_value);
+	u32 cqs_obj_compare_value,
+	u32 cqs_obj_inherit_error);
 void __kbase_tlstream_tl_kbase_kcpuqueue_enqueue_cqs_set(
 	struct kbase_tlstream *stream,
 	const void *kcpu_queue,
@@ -349,6 +363,14 @@ void __kbase_tlstream_tl_kbase_kcpuqueue_enqueue_unmap_import_force(
 	struct kbase_tlstream *stream,
 	const void *kcpu_queue,
 	u64 map_import_buf_gpu_addr);
+void __kbase_tlstream_tl_kbase_kcpuqueue_enqueue_error_barrier(
+	struct kbase_tlstream *stream,
+	const void *kcpu_queue);
+void __kbase_tlstream_tl_kbase_kcpuqueue_enqueue_group_suspend(
+	struct kbase_tlstream *stream,
+	const void *kcpu_queue,
+	const void *group_suspend_buf,
+	u32 gpu_cmdq_grp_handle);
 void __kbase_tlstream_tl_kbase_array_begin_kcpuqueue_enqueue_jit_alloc(
 	struct kbase_tlstream *stream,
 	const void *kcpu_queue);
@@ -382,40 +404,47 @@ void __kbase_tlstream_tl_kbase_kcpuqueue_execute_fence_signal_start(
 	const void *kcpu_queue);
 void __kbase_tlstream_tl_kbase_kcpuqueue_execute_fence_signal_end(
 	struct kbase_tlstream *stream,
-	const void *kcpu_queue);
+	const void *kcpu_queue,
+	u32 execute_error);
 void __kbase_tlstream_tl_kbase_kcpuqueue_execute_fence_wait_start(
 	struct kbase_tlstream *stream,
 	const void *kcpu_queue);
 void __kbase_tlstream_tl_kbase_kcpuqueue_execute_fence_wait_end(
 	struct kbase_tlstream *stream,
-	const void *kcpu_queue);
+	const void *kcpu_queue,
+	u32 execute_error);
 void __kbase_tlstream_tl_kbase_kcpuqueue_execute_cqs_wait_start(
 	struct kbase_tlstream *stream,
 	const void *kcpu_queue);
 void __kbase_tlstream_tl_kbase_kcpuqueue_execute_cqs_wait_end(
 	struct kbase_tlstream *stream,
-	const void *kcpu_queue);
+	const void *kcpu_queue,
+	u32 execute_error);
 void __kbase_tlstream_tl_kbase_kcpuqueue_execute_cqs_set(
 	struct kbase_tlstream *stream,
-	const void *kcpu_queue);
+	const void *kcpu_queue,
+	u32 execute_error);
 void __kbase_tlstream_tl_kbase_kcpuqueue_execute_map_import_start(
 	struct kbase_tlstream *stream,
 	const void *kcpu_queue);
 void __kbase_tlstream_tl_kbase_kcpuqueue_execute_map_import_end(
 	struct kbase_tlstream *stream,
-	const void *kcpu_queue);
+	const void *kcpu_queue,
+	u32 execute_error);
 void __kbase_tlstream_tl_kbase_kcpuqueue_execute_unmap_import_start(
 	struct kbase_tlstream *stream,
 	const void *kcpu_queue);
 void __kbase_tlstream_tl_kbase_kcpuqueue_execute_unmap_import_end(
 	struct kbase_tlstream *stream,
-	const void *kcpu_queue);
+	const void *kcpu_queue,
+	u32 execute_error);
 void __kbase_tlstream_tl_kbase_kcpuqueue_execute_unmap_import_force_start(
 	struct kbase_tlstream *stream,
 	const void *kcpu_queue);
 void __kbase_tlstream_tl_kbase_kcpuqueue_execute_unmap_import_force_end(
 	struct kbase_tlstream *stream,
-	const void *kcpu_queue);
+	const void *kcpu_queue,
+	u32 execute_error);
 void __kbase_tlstream_tl_kbase_kcpuqueue_execute_jit_alloc_start(
 	struct kbase_tlstream *stream,
 	const void *kcpu_queue);
@@ -425,6 +454,7 @@ void __kbase_tlstream_tl_kbase_array_begin_kcpuqueue_execute_jit_alloc_end(
 void __kbase_tlstream_tl_kbase_array_item_kcpuqueue_execute_jit_alloc_end(
 	struct kbase_tlstream *stream,
 	const void *kcpu_queue,
+	u32 execute_error,
 	u64 jit_alloc_gpu_alloc_addr,
 	u64 jit_alloc_mmu_flags);
 void __kbase_tlstream_tl_kbase_array_end_kcpuqueue_execute_jit_alloc_end(
@@ -439,13 +469,21 @@ void __kbase_tlstream_tl_kbase_array_begin_kcpuqueue_execute_jit_free_end(
 void __kbase_tlstream_tl_kbase_array_item_kcpuqueue_execute_jit_free_end(
 	struct kbase_tlstream *stream,
 	const void *kcpu_queue,
+	u32 execute_error,
 	u64 jit_free_pages_used);
 void __kbase_tlstream_tl_kbase_array_end_kcpuqueue_execute_jit_free_end(
 	struct kbase_tlstream *stream,
 	const void *kcpu_queue);
-void __kbase_tlstream_tl_kbase_kcpuqueue_execute_errorbarrier(
+void __kbase_tlstream_tl_kbase_kcpuqueue_execute_error_barrier(
+	struct kbase_tlstream *stream,
+	const void *kcpu_queue);
+void __kbase_tlstream_tl_kbase_kcpuqueue_execute_group_suspend_start(
 	struct kbase_tlstream *stream,
 	const void *kcpu_queue);
+void __kbase_tlstream_tl_kbase_kcpuqueue_execute_group_suspend_end(
+	struct kbase_tlstream *stream,
+	const void *kcpu_queue,
+	u32 execute_error);
 void __kbase_tlstream_tl_kbase_csffw_tlstream_overflow(
 	struct kbase_tlstream *stream,
 	u64 csffw_timestamp,
@@ -1265,6 +1303,25 @@ struct kbase_tlstream;
 				gpu);	\
 	} while (0)
 
+/**
+ * KBASE_TLSTREAM_TL_ARBITER_REQUESTED -
+ *   Driver has requested the arbiter for gpu access
+ *
+ * @kbdev: Kbase device
+ * @gpu: Name of the GPU object
+ */
+#define KBASE_TLSTREAM_TL_ARBITER_REQUESTED(	\
+	kbdev,	\
+	gpu	\
+	)	\
+	do {	\
+		int enabled = atomic_read(&kbdev->timeline_flags);	\
+		if (enabled & TLSTREAM_ENABLED)	\
+			__kbase_tlstream_tl_arbiter_requested(	\
+				__TL_DISPATCH_STREAM(kbdev, obj),	\
+				gpu);	\
+	} while (0)
+
 /**
  * KBASE_TLSTREAM_JD_GPU_SOFT_RESET -
  *   gpu soft reset
@@ -1474,6 +1531,42 @@ struct kbase_tlstream;
 				ctx_nr, bid, max_allocs, allocs, va_pages, ph_pages);	\
 	} while (0)
 
+/**
+ * KBASE_TLSTREAM_AUX_TILER_HEAP_STATS -
+ *   Tiler Heap statistics
+ *
+ * @kbdev: Kbase device
+ * @ctx_nr: Kernel context number
+ * @heap_id: Unique id used to represent a heap under a context
+ * @va_pages: Number of virtual pages allocated in this bin
+ * @ph_pages: Number of physical pages allocated in this bin
+ * @max_chunks: The maximum number of chunks that the heap should be allowed to use
+ * @chunk_size: Size of each chunk in tiler heap, in bytes
+ * @chunk_count: The number of chunks currently allocated in the tiler heap
+ * @target_in_flight: Number of render-passes that the driver should attempt
+ * to keep in flight for which allocation of new chunks is allowed
+ * @nr_in_flight: Number of render-passes that are in flight
+ */
+#define KBASE_TLSTREAM_AUX_TILER_HEAP_STATS(	\
+	kbdev,	\
+	ctx_nr,	\
+	heap_id,	\
+	va_pages,	\
+	ph_pages,	\
+	max_chunks,	\
+	chunk_size,	\
+	chunk_count,	\
+	target_in_flight,	\
+	nr_in_flight	\
+	)	\
+	do {	\
+		int enabled = atomic_read(&kbdev->timeline_flags);	\
+		if (enabled & TLSTREAM_ENABLED)	\
+			__kbase_tlstream_aux_tiler_heap_stats(	\
+				__TL_DISPATCH_STREAM(kbdev, aux),	\
+				ctx_nr, heap_id, va_pages, ph_pages, max_chunks, chunk_size, chunk_count, target_in_flight, nr_in_flight);	\
+	} while (0)
+
 /**
  * KBASE_TLSTREAM_AUX_EVENT_JOB_SLOT -
  *   event on a given job slot
@@ -1842,27 +1935,30 @@ struct kbase_tlstream;
  * @cqs_obj_gpu_addr: CQS Object GPU ptr
  * @cqs_obj_compare_value: Semaphore value that should be exceeded
  * for the WAIT to pass
+ * @cqs_obj_inherit_error: Indicates the error state should be inherited into the queue or not
  */
 #if MALI_USE_CSF
 #define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_ENQUEUE_CQS_WAIT(	\
 	kbdev,	\
 	kcpu_queue,	\
 	cqs_obj_gpu_addr,	\
-	cqs_obj_compare_value	\
+	cqs_obj_compare_value,	\
+	cqs_obj_inherit_error	\
 	)	\
 	do {	\
 		int enabled = atomic_read(&kbdev->timeline_flags);	\
 		if (enabled & BASE_TLSTREAM_ENABLE_CSF_TRACEPOINTS)	\
 			__kbase_tlstream_tl_kbase_kcpuqueue_enqueue_cqs_wait(	\
 				__TL_DISPATCH_STREAM(kbdev, obj),	\
-				kcpu_queue, cqs_obj_gpu_addr, cqs_obj_compare_value);	\
+				kcpu_queue, cqs_obj_gpu_addr, cqs_obj_compare_value, cqs_obj_inherit_error);	\
 	} while (0)
 #else
 #define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_ENQUEUE_CQS_WAIT(	\
 	kbdev,	\
 	kcpu_queue,	\
 	cqs_obj_gpu_addr,	\
-	cqs_obj_compare_value	\
+	cqs_obj_compare_value,	\
+	cqs_obj_inherit_error	\
 	)	\
 	do { } while (0)
 #endif /* MALI_USE_CSF */
@@ -1987,6 +2083,66 @@ struct kbase_tlstream;
 	do { } while (0)
 #endif /* MALI_USE_CSF */
 
+/**
+ * KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_ENQUEUE_ERROR_BARRIER -
+ *   KCPU Queue enqueues Error Barrier
+ *
+ * @kbdev: Kbase device
+ * @kcpu_queue: KCPU queue
+ */
+#if MALI_USE_CSF
+#define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_ENQUEUE_ERROR_BARRIER(	\
+	kbdev,	\
+	kcpu_queue	\
+	)	\
+	do {	\
+		int enabled = atomic_read(&kbdev->timeline_flags);	\
+		if (enabled & BASE_TLSTREAM_ENABLE_CSF_TRACEPOINTS)	\
+			__kbase_tlstream_tl_kbase_kcpuqueue_enqueue_error_barrier(	\
+				__TL_DISPATCH_STREAM(kbdev, obj),	\
+				kcpu_queue);	\
+	} while (0)
+#else
+#define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_ENQUEUE_ERROR_BARRIER(	\
+	kbdev,	\
+	kcpu_queue	\
+	)	\
+	do { } while (0)
+#endif /* MALI_USE_CSF */
+
+/**
+ * KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_ENQUEUE_GROUP_SUSPEND -
+ *   KCPU Queue enqueues Group Suspend
+ *
+ * @kbdev: Kbase device
+ * @kcpu_queue: KCPU queue
+ * @group_suspend_buf: Pointer to the suspend buffer structure
+ * @gpu_cmdq_grp_handle: GPU Command Queue Group handle which will match userspace
+ */
+#if MALI_USE_CSF
+#define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_ENQUEUE_GROUP_SUSPEND(	\
+	kbdev,	\
+	kcpu_queue,	\
+	group_suspend_buf,	\
+	gpu_cmdq_grp_handle	\
+	)	\
+	do {	\
+		int enabled = atomic_read(&kbdev->timeline_flags);	\
+		if (enabled & BASE_TLSTREAM_ENABLE_CSF_TRACEPOINTS)	\
+			__kbase_tlstream_tl_kbase_kcpuqueue_enqueue_group_suspend(	\
+				__TL_DISPATCH_STREAM(kbdev, obj),	\
+				kcpu_queue, group_suspend_buf, gpu_cmdq_grp_handle);	\
+	} while (0)
+#else
+#define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_ENQUEUE_GROUP_SUSPEND(	\
+	kbdev,	\
+	kcpu_queue,	\
+	group_suspend_buf,	\
+	gpu_cmdq_grp_handle	\
+	)	\
+	do { } while (0)
+#endif /* MALI_USE_CSF */
+
 /**
  * KBASE_TLSTREAM_TL_KBASE_ARRAY_BEGIN_KCPUQUEUE_ENQUEUE_JIT_ALLOC -
  *   Begin array of KCPU Queue enqueues JIT Alloc
@@ -2223,23 +2379,26 @@ struct kbase_tlstream;
  *
  * @kbdev: Kbase device
  * @kcpu_queue: KCPU queue
+ * @execute_error: Non-zero error code if KCPU Queue item completed with error, else zero
  */
 #if MALI_USE_CSF
 #define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_FENCE_SIGNAL_END(	\
 	kbdev,	\
-	kcpu_queue	\
+	kcpu_queue,	\
+	execute_error	\
 	)	\
 	do {	\
 		int enabled = atomic_read(&kbdev->timeline_flags);	\
 		if (enabled & BASE_TLSTREAM_ENABLE_CSF_TRACEPOINTS)	\
 			__kbase_tlstream_tl_kbase_kcpuqueue_execute_fence_signal_end(	\
 				__TL_DISPATCH_STREAM(kbdev, obj),	\
-				kcpu_queue);	\
+				kcpu_queue, execute_error);	\
 	} while (0)
 #else
 #define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_FENCE_SIGNAL_END(	\
 	kbdev,	\
-	kcpu_queue	\
+	kcpu_queue,	\
+	execute_error	\
 	)	\
 	do { } while (0)
 #endif /* MALI_USE_CSF */
@@ -2277,23 +2436,26 @@ struct kbase_tlstream;
  *
  * @kbdev: Kbase device
  * @kcpu_queue: KCPU queue
+ * @execute_error: Non-zero error code if KCPU Queue item completed with error, else zero
  */
 #if MALI_USE_CSF
 #define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_FENCE_WAIT_END(	\
 	kbdev,	\
-	kcpu_queue	\
+	kcpu_queue,	\
+	execute_error	\
 	)	\
 	do {	\
 		int enabled = atomic_read(&kbdev->timeline_flags);	\
 		if (enabled & BASE_TLSTREAM_ENABLE_CSF_TRACEPOINTS)	\
 			__kbase_tlstream_tl_kbase_kcpuqueue_execute_fence_wait_end(	\
 				__TL_DISPATCH_STREAM(kbdev, obj),	\
-				kcpu_queue);	\
+				kcpu_queue, execute_error);	\
 	} while (0)
 #else
 #define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_FENCE_WAIT_END(	\
 	kbdev,	\
-	kcpu_queue	\
+	kcpu_queue,	\
+	execute_error	\
 	)	\
 	do { } while (0)
 #endif /* MALI_USE_CSF */
@@ -2331,23 +2493,26 @@ struct kbase_tlstream;
  *
  * @kbdev: Kbase device
  * @kcpu_queue: KCPU queue
+ * @execute_error: Non-zero error code if KCPU Queue item completed with error, else zero
  */
 #if MALI_USE_CSF
 #define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_CQS_WAIT_END(	\
 	kbdev,	\
-	kcpu_queue	\
+	kcpu_queue,	\
+	execute_error	\
 	)	\
 	do {	\
 		int enabled = atomic_read(&kbdev->timeline_flags);	\
 		if (enabled & BASE_TLSTREAM_ENABLE_CSF_TRACEPOINTS)	\
 			__kbase_tlstream_tl_kbase_kcpuqueue_execute_cqs_wait_end(	\
 				__TL_DISPATCH_STREAM(kbdev, obj),	\
-				kcpu_queue);	\
+				kcpu_queue, execute_error);	\
 	} while (0)
 #else
 #define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_CQS_WAIT_END(	\
 	kbdev,	\
-	kcpu_queue	\
+	kcpu_queue,	\
+	execute_error	\
 	)	\
 	do { } while (0)
 #endif /* MALI_USE_CSF */
@@ -2358,23 +2523,26 @@ struct kbase_tlstream;
  *
  * @kbdev: Kbase device
  * @kcpu_queue: KCPU queue
+ * @execute_error: Non-zero error code if KCPU Queue item completed with error, else zero
  */
 #if MALI_USE_CSF
 #define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_CQS_SET(	\
 	kbdev,	\
-	kcpu_queue	\
+	kcpu_queue,	\
+	execute_error	\
 	)	\
 	do {	\
 		int enabled = atomic_read(&kbdev->timeline_flags);	\
 		if (enabled & BASE_TLSTREAM_ENABLE_CSF_TRACEPOINTS)	\
 			__kbase_tlstream_tl_kbase_kcpuqueue_execute_cqs_set(	\
 				__TL_DISPATCH_STREAM(kbdev, obj),	\
-				kcpu_queue);	\
+				kcpu_queue, execute_error);	\
 	} while (0)
 #else
 #define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_CQS_SET(	\
 	kbdev,	\
-	kcpu_queue	\
+	kcpu_queue,	\
+	execute_error	\
 	)	\
 	do { } while (0)
 #endif /* MALI_USE_CSF */
@@ -2412,23 +2580,26 @@ struct kbase_tlstream;
  *
  * @kbdev: Kbase device
  * @kcpu_queue: KCPU queue
+ * @execute_error: Non-zero error code if KCPU Queue item completed with error, else zero
  */
 #if MALI_USE_CSF
 #define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_MAP_IMPORT_END(	\
 	kbdev,	\
-	kcpu_queue	\
+	kcpu_queue,	\
+	execute_error	\
 	)	\
 	do {	\
 		int enabled = atomic_read(&kbdev->timeline_flags);	\
 		if (enabled & BASE_TLSTREAM_ENABLE_CSF_TRACEPOINTS)	\
 			__kbase_tlstream_tl_kbase_kcpuqueue_execute_map_import_end(	\
 				__TL_DISPATCH_STREAM(kbdev, obj),	\
-				kcpu_queue);	\
+				kcpu_queue, execute_error);	\
 	} while (0)
 #else
 #define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_MAP_IMPORT_END(	\
 	kbdev,	\
-	kcpu_queue	\
+	kcpu_queue,	\
+	execute_error	\
 	)	\
 	do { } while (0)
 #endif /* MALI_USE_CSF */
@@ -2466,23 +2637,26 @@ struct kbase_tlstream;
  *
  * @kbdev: Kbase device
  * @kcpu_queue: KCPU queue
+ * @execute_error: Non-zero error code if KCPU Queue item completed with error, else zero
  */
 #if MALI_USE_CSF
 #define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_UNMAP_IMPORT_END(	\
 	kbdev,	\
-	kcpu_queue	\
+	kcpu_queue,	\
+	execute_error	\
 	)	\
 	do {	\
 		int enabled = atomic_read(&kbdev->timeline_flags);	\
 		if (enabled & BASE_TLSTREAM_ENABLE_CSF_TRACEPOINTS)	\
 			__kbase_tlstream_tl_kbase_kcpuqueue_execute_unmap_import_end(	\
 				__TL_DISPATCH_STREAM(kbdev, obj),	\
-				kcpu_queue);	\
+				kcpu_queue, execute_error);	\
 	} while (0)
 #else
 #define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_UNMAP_IMPORT_END(	\
 	kbdev,	\
-	kcpu_queue	\
+	kcpu_queue,	\
+	execute_error	\
 	)	\
 	do { } while (0)
 #endif /* MALI_USE_CSF */
@@ -2520,23 +2694,26 @@ struct kbase_tlstream;
  *
  * @kbdev: Kbase device
  * @kcpu_queue: KCPU queue
+ * @execute_error: Non-zero error code if KCPU Queue item completed with error, else zero
  */
 #if MALI_USE_CSF
 #define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_UNMAP_IMPORT_FORCE_END(	\
 	kbdev,	\
-	kcpu_queue	\
+	kcpu_queue,	\
+	execute_error	\
 	)	\
 	do {	\
 		int enabled = atomic_read(&kbdev->timeline_flags);	\
 		if (enabled & BASE_TLSTREAM_ENABLE_CSF_TRACEPOINTS)	\
 			__kbase_tlstream_tl_kbase_kcpuqueue_execute_unmap_import_force_end(	\
 				__TL_DISPATCH_STREAM(kbdev, obj),	\
-				kcpu_queue);	\
+				kcpu_queue, execute_error);	\
 	} while (0)
 #else
 #define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_UNMAP_IMPORT_FORCE_END(	\
 	kbdev,	\
-	kcpu_queue	\
+	kcpu_queue,	\
+	execute_error	\
 	)	\
 	do { } while (0)
 #endif /* MALI_USE_CSF */
@@ -2601,6 +2778,7 @@ struct kbase_tlstream;
  *
  * @kbdev: Kbase device
  * @kcpu_queue: KCPU queue
+ * @execute_error: Non-zero error code if KCPU Queue item completed with error, else zero
  * @jit_alloc_gpu_alloc_addr: The JIT allocated GPU virtual address
  * @jit_alloc_mmu_flags: The MMU flags for the JIT allocation
  */
@@ -2608,6 +2786,7 @@ struct kbase_tlstream;
 #define KBASE_TLSTREAM_TL_KBASE_ARRAY_ITEM_KCPUQUEUE_EXECUTE_JIT_ALLOC_END(	\
 	kbdev,	\
 	kcpu_queue,	\
+	execute_error,	\
 	jit_alloc_gpu_alloc_addr,	\
 	jit_alloc_mmu_flags	\
 	)	\
@@ -2616,12 +2795,13 @@ struct kbase_tlstream;
 		if (enabled & BASE_TLSTREAM_ENABLE_CSF_TRACEPOINTS)	\
 			__kbase_tlstream_tl_kbase_array_item_kcpuqueue_execute_jit_alloc_end(	\
 				__TL_DISPATCH_STREAM(kbdev, obj),	\
-				kcpu_queue, jit_alloc_gpu_alloc_addr, jit_alloc_mmu_flags);	\
+				kcpu_queue, execute_error, jit_alloc_gpu_alloc_addr, jit_alloc_mmu_flags);	\
 	} while (0)
 #else
 #define KBASE_TLSTREAM_TL_KBASE_ARRAY_ITEM_KCPUQUEUE_EXECUTE_JIT_ALLOC_END(	\
 	kbdev,	\
 	kcpu_queue,	\
+	execute_error,	\
 	jit_alloc_gpu_alloc_addr,	\
 	jit_alloc_mmu_flags	\
 	)	\
@@ -2715,6 +2895,7 @@ struct kbase_tlstream;
  *
  * @kbdev: Kbase device
  * @kcpu_queue: KCPU queue
+ * @execute_error: Non-zero error code if KCPU Queue item completed with error, else zero
  * @jit_free_pages_used: The actual number of pages used by the JIT
  * allocation
  */
@@ -2722,6 +2903,7 @@ struct kbase_tlstream;
 #define KBASE_TLSTREAM_TL_KBASE_ARRAY_ITEM_KCPUQUEUE_EXECUTE_JIT_FREE_END(	\
 	kbdev,	\
 	kcpu_queue,	\
+	execute_error,	\
 	jit_free_pages_used	\
 	)	\
 	do {	\
@@ -2729,12 +2911,13 @@ struct kbase_tlstream;
 		if (enabled & BASE_TLSTREAM_ENABLE_CSF_TRACEPOINTS)	\
 			__kbase_tlstream_tl_kbase_array_item_kcpuqueue_execute_jit_free_end(	\
 				__TL_DISPATCH_STREAM(kbdev, obj),	\
-				kcpu_queue, jit_free_pages_used);	\
+				kcpu_queue, execute_error, jit_free_pages_used);	\
 	} while (0)
 #else
 #define KBASE_TLSTREAM_TL_KBASE_ARRAY_ITEM_KCPUQUEUE_EXECUTE_JIT_FREE_END(	\
 	kbdev,	\
 	kcpu_queue,	\
+	execute_error,	\
 	jit_free_pages_used	\
 	)	\
 	do { } while (0)
@@ -2768,32 +2951,89 @@ struct kbase_tlstream;
 #endif /* MALI_USE_CSF */
 
 /**
- * KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_ERRORBARRIER -
+ * KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_ERROR_BARRIER -
  *   KCPU Queue executes an Error Barrier
  *
  * @kbdev: Kbase device
  * @kcpu_queue: KCPU queue
  */
 #if MALI_USE_CSF
-#define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_ERRORBARRIER(	\
+#define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_ERROR_BARRIER(	\
 	kbdev,	\
 	kcpu_queue	\
 	)	\
 	do {	\
 		int enabled = atomic_read(&kbdev->timeline_flags);	\
 		if (enabled & BASE_TLSTREAM_ENABLE_CSF_TRACEPOINTS)	\
-			__kbase_tlstream_tl_kbase_kcpuqueue_execute_errorbarrier(	\
+			__kbase_tlstream_tl_kbase_kcpuqueue_execute_error_barrier(	\
 				__TL_DISPATCH_STREAM(kbdev, obj),	\
 				kcpu_queue);	\
 	} while (0)
 #else
-#define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_ERRORBARRIER(	\
+#define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_ERROR_BARRIER(	\
 	kbdev,	\
 	kcpu_queue	\
 	)	\
 	do { } while (0)
 #endif /* MALI_USE_CSF */
 
+/**
+ * KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_GROUP_SUSPEND_START -
+ *   KCPU Queue starts a group suspend
+ *
+ * @kbdev: Kbase device
+ * @kcpu_queue: KCPU queue
+ */
+#if MALI_USE_CSF
+#define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_GROUP_SUSPEND_START(	\
+	kbdev,	\
+	kcpu_queue	\
+	)	\
+	do {	\
+		int enabled = atomic_read(&kbdev->timeline_flags);	\
+		if (enabled & BASE_TLSTREAM_ENABLE_CSF_TRACEPOINTS)	\
+			__kbase_tlstream_tl_kbase_kcpuqueue_execute_group_suspend_start(	\
+				__TL_DISPATCH_STREAM(kbdev, obj),	\
+				kcpu_queue);	\
+	} while (0)
+#else
+#define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_GROUP_SUSPEND_START(	\
+	kbdev,	\
+	kcpu_queue	\
+	)	\
+	do { } while (0)
+#endif /* MALI_USE_CSF */
+
+/**
+ * KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_GROUP_SUSPEND_END -
+ *   KCPU Queue ends a group suspend
+ *
+ * @kbdev: Kbase device
+ * @kcpu_queue: KCPU queue
+ * @execute_error: Non-zero error code if KCPU Queue item completed with error, else zero
+ */
+#if MALI_USE_CSF
+#define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_GROUP_SUSPEND_END(	\
+	kbdev,	\
+	kcpu_queue,	\
+	execute_error	\
+	)	\
+	do {	\
+		int enabled = atomic_read(&kbdev->timeline_flags);	\
+		if (enabled & BASE_TLSTREAM_ENABLE_CSF_TRACEPOINTS)	\
+			__kbase_tlstream_tl_kbase_kcpuqueue_execute_group_suspend_end(	\
+				__TL_DISPATCH_STREAM(kbdev, obj),	\
+				kcpu_queue, execute_error);	\
+	} while (0)
+#else
+#define KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_GROUP_SUSPEND_END(	\
+	kbdev,	\
+	kcpu_queue,	\
+	execute_error	\
+	)	\
+	do { } while (0)
+#endif /* MALI_USE_CSF */
+
 /**
  * KBASE_TLSTREAM_TL_KBASE_CSFFW_TLSTREAM_OVERFLOW -
  *   An overflow has happened with the CSFFW Timeline stream
diff --git a/include/linux/memory_group_manager.h b/include/linux/memory_group_manager.h
index b1ac253d9e15..2045840e1742 100644
--- a/include/linux/memory_group_manager.h
+++ b/include/linux/memory_group_manager.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 #ifndef _MEMORY_GROUP_MANAGER_H_
diff --git a/include/linux/priority_control_manager.h b/include/linux/priority_control_manager.h
new file mode 100644
index 000000000000..df3b3cd07a14
--- /dev/null
+++ b/include/linux/priority_control_manager.h
@@ -0,0 +1,77 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ *
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+#ifndef _PRIORITY_CONTROL_MANAGER_H_
+#define _PRIORITY_CONTROL_MANAGER_H_
+
+#include <linux/mm.h>
+#include <linux/of.h>
+#include <linux/version.h>
+
+struct priority_control_manager_device;
+
+/**
+ * struct priority_control_manager_ops - Callbacks for priority control manager operations
+ *
+ * @pcm_scheduler_priority_check: Callback to check if scheduling priority level can be requested
+ */
+struct priority_control_manager_ops {
+	/**
+	 * pcm_scheduler_priority_check: This function can be used to check what priority its work
+	 *                               would be treated as based on the requested_priority value.
+	 *
+	 * @pcm_dev:                     The priority control manager through which the request is
+	 *                               being made.
+	 * @task:                        The task struct of the process requesting the priority check.
+	 * @requested_priority:          The priority level being requested.
+	 *
+	 * The returned value will be:
+	 *   The same as requested_priority if the process has permission to use requested_priority
+	 *   A lower priority value if the process does not have permission to use requested_priority
+	 *
+	 * requested_priority has the following value range:
+	 *   0-3 : Priority level, 0 being highest and 3 being lowest
+	 *
+	 * Return: The priority that would actually be given, could be lower than requested_priority
+	 */
+	int (*pcm_scheduler_priority_check)(
+		struct priority_control_manager_device *pcm_dev,
+		struct task_struct *task, int requested_priority);
+};
+
+/**
+ * struct priority_control_manager_device - Device structure for priority
+ *                                          control manager
+ *
+ * @ops:   Callbacks associated with this device
+ * @data:  Pointer to device private data
+ * @owner: Pointer to the module owner
+ *
+ * This structure should be registered with the platform device using
+ * platform_set_drvdata().
+ */
+struct priority_control_manager_device {
+	struct priority_control_manager_ops ops;
+	void *data;
+	struct module *owner;
+};
+
+#endif /* _PRIORITY_CONTROL_MANAGER_H_ */
diff --git a/include/linux/protected_memory_allocator.h b/include/linux/protected_memory_allocator.h
new file mode 100644
index 000000000000..1ccb403cc0d6
--- /dev/null
+++ b/include/linux/protected_memory_allocator.h
@@ -0,0 +1,109 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ *
+ * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+#ifndef _PROTECTED_MEMORY_ALLOCATOR_H_
+#define _PROTECTED_MEMORY_ALLOCATOR_H_
+
+#include <linux/mm.h>
+
+/**
+ * struct protected_memory_allocation - Protected memory allocation
+ *
+ * @pa:    Physical address of the protected memory allocation.
+ * @order: Size of memory allocation in pages, as a base-2 logarithm.
+ */
+struct protected_memory_allocation {
+	phys_addr_t pa;
+	unsigned int order;
+};
+
+struct protected_memory_allocator_device;
+
+/**
+ * struct protected_memory_allocator_ops - Callbacks for protected memory
+ *                                         allocator operations
+ *
+ * @pma_alloc_page:    Callback to allocate protected memory
+ * @pma_get_phys_addr: Callback to get the physical address of an allocation
+ * @pma_free_page:     Callback to free protected memory
+ */
+struct protected_memory_allocator_ops {
+	/**
+	 * pma_alloc_page - Allocate protected memory pages
+	 *
+	 * @pma_dev: The protected memory allocator the request is being made
+	 *           through.
+	 * @order:   How many pages to allocate, as a base-2 logarithm.
+	 *
+	 * Return: Pointer to allocated memory, or NULL if allocation failed.
+	 */
+	struct protected_memory_allocation *(*pma_alloc_page)(
+		struct protected_memory_allocator_device *pma_dev,
+		unsigned int order);
+
+	/**
+	 * pma_get_phys_addr - Get the physical address of the protected memory
+	 *                     allocation
+	 *
+	 * @pma_dev: The protected memory allocator the request is being made
+	 *           through.
+	 * @pma:     The protected memory allocation whose physical address
+	 *           shall be retrieved
+	 *
+	 * Return: The physical address of the given allocation.
+	 */
+	phys_addr_t (*pma_get_phys_addr)(
+		struct protected_memory_allocator_device *pma_dev,
+		struct protected_memory_allocation *pma);
+
+	/**
+	 * pma_free_page - Free a page of memory
+	 *
+	 * @pma_dev: The protected memory allocator the request is being made
+	 *           through.
+	 * @pma:     The protected memory allocation to free.
+	 */
+	void (*pma_free_page)(
+		struct protected_memory_allocator_device *pma_dev,
+		struct protected_memory_allocation *pma);
+};
+
+/**
+ * struct protected_memory_allocator_device - Device structure for protected
+ *                                            memory allocator
+ *
+ * @ops:   Callbacks associated with this device
+ * @owner: Pointer to the module owner
+ *
+ * In order for a system integrator to provide custom behaviors for protected
+ * memory operations performed by the kbase module (controller driver),
+ * they shall provide a platform-specific driver module which implements
+ * this interface.
+ *
+ * This structure should be registered with the platform device using
+ * platform_set_drvdata().
+ */
+struct protected_memory_allocator_device {
+	struct protected_memory_allocator_ops ops;
+	struct module *owner;
+};
+
+#endif /* _PROTECTED_MEMORY_ALLOCATOR_H_ */
diff --git a/include/linux/protected_mode_switcher.h b/include/linux/protected_mode_switcher.h
new file mode 100644
index 000000000000..d2c7eef764a9
--- /dev/null
+++ b/include/linux/protected_mode_switcher.h
@@ -0,0 +1,68 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ *
+ * (C) COPYRIGHT 2017, 2020 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+#ifndef _PROTECTED_MODE_SWITCH_H_
+#define _PROTECTED_MODE_SWITCH_H_
+
+struct protected_mode_device;
+
+/**
+ * struct protected_mode_ops - Callbacks for protected mode switch operations
+ *
+ * @protected_mode_enable:  Callback to enable protected mode for device
+ * @protected_mode_disable: Callback to disable protected mode for device
+ */
+struct protected_mode_ops {
+	/**
+	 * protected_mode_enable() - Enable protected mode on device
+	 * @dev:	The struct device
+	 *
+	 * Return: 0 on success, non-zero on error
+	 */
+	int (*protected_mode_enable)(
+			struct protected_mode_device *protected_dev);
+
+	/**
+	 * protected_mode_disable() - Disable protected mode on device, and
+	 *                            reset device
+	 * @dev:	The struct device
+	 *
+	 * Return: 0 on success, non-zero on error
+	 */
+	int (*protected_mode_disable)(
+			struct protected_mode_device *protected_dev);
+};
+
+/**
+ * struct protected_mode_device - Device structure for protected mode devices
+ *
+ * @ops  - Callbacks associated with this device
+ * @data - Pointer to device private data
+ *
+ * This structure should be registered with the platform device using
+ * platform_set_drvdata().
+ */
+struct protected_mode_device {
+	struct protected_mode_ops ops;
+	void *data;
+};
+
+#endif /* _PROTECTED_MODE_SWITCH_H_ */
diff --git a/include/uapi/gpu/arm/bifrost/backend/gpu/mali_kbase_model_dummy.h b/include/uapi/gpu/arm/bifrost/backend/gpu/mali_kbase_model_dummy.h
new file mode 100644
index 000000000000..61da0717abf0
--- /dev/null
+++ b/include/uapi/gpu/arm/bifrost/backend/gpu/mali_kbase_model_dummy.h
@@ -0,0 +1,53 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ *
+ * (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+/*
+ * Dummy Model interface
+ */
+
+#ifndef _UAPI_KBASE_MODEL_DUMMY_H_
+#define _UAPI_KBASE_MODEL_DUMMY_H_
+
+#include <linux/types.h>
+
+#define KBASE_DUMMY_MODEL_COUNTER_HEADER_DWORDS (4)
+#define KBASE_DUMMY_MODEL_COUNTER_PER_CORE      (60)
+#define KBASE_DUMMY_MODEL_COUNTER_PER_CORE_TYPE  \
+		(64*KBASE_DUMMY_MODEL_COUNTER_PER_CORE)
+#define KBASE_DUMMY_MODEL_COUNTERS_PER_BIT      (4)
+#define KBASE_DUMMY_MODEL_COUNTER_ENABLED(enable_mask, ctr_idx) \
+	(enable_mask & (1 << (ctr_idx / KBASE_DUMMY_MODEL_COUNTERS_PER_BIT)))
+
+#define KBASE_DUMMY_MODEL_HEADERS_PER_BLOCK 4
+#define KBASE_DUMMY_MODEL_COUNTERS_PER_BLOCK 60
+#define KBASE_DUMMY_MODEL_VALUES_PER_BLOCK                                     \
+	(KBASE_DUMMY_MODEL_COUNTERS_PER_BLOCK +                                \
+	 KBASE_DUMMY_MODEL_HEADERS_PER_BLOCK)
+#define KBASE_DUMMY_MODEL_BLOCK_SIZE                                           \
+	(KBASE_DUMMY_MODEL_VALUES_PER_BLOCK * sizeof(__u32))
+#define KBASE_DUMMY_MODEL_MAX_MEMSYS_BLOCKS      8
+#define KBASE_DUMMY_MODEL_MAX_SHADER_CORES       32
+#define KBASE_DUMMY_MODEL_MAX_NUM_PERF_BLOCKS    \
+	(1 + 1 + KBASE_DUMMY_MODEL_MAX_MEMSYS_BLOCKS + KBASE_DUMMY_MODEL_MAX_SHADER_CORES)
+#define KBASE_DUMMY_MODEL_COUNTER_TOTAL          \
+	(KBASE_DUMMY_MODEL_MAX_NUM_PERF_BLOCKS * KBASE_DUMMY_MODEL_COUNTER_PER_CORE_TYPE)
+
+#endif /* _UAPI_KBASE_MODEL_DUMMY_H_ */
diff --git a/drivers/gpu/arm/bifrost/csf/mali_base_csf_kernel.h b/include/uapi/gpu/arm/bifrost/csf/mali_base_csf_kernel.h
similarity index 63%
rename from drivers/gpu/arm/bifrost/csf/mali_base_csf_kernel.h
rename to include/uapi/gpu/arm/bifrost/csf/mali_base_csf_kernel.h
index 301146cbedd3..7fa874be3c92 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_base_csf_kernel.h
+++ b/include/uapi/gpu/arm/bifrost/csf/mali_base_csf_kernel.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,12 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-#ifndef _BASE_CSF_KERNEL_H_
-#define _BASE_CSF_KERNEL_H_
+#ifndef _UAPI_BASE_CSF_KERNEL_H_
+#define _UAPI_BASE_CSF_KERNEL_H_
+
+#include <linux/types.h>
 
 /* Memory allocation, access/hint flags.
  *
@@ -204,7 +205,7 @@
 /**
  * Valid set of just-in-time memory allocation flags
  */
-#define BASE_JIT_ALLOC_VALID_FLAGS ((u8)0)
+#define BASE_JIT_ALLOC_VALID_FLAGS ((__u8)0)
 
 /* Flags to pass to ::base_context_init.
  * Flags can be ORed together to enable multiple things.
@@ -212,7 +213,7 @@
  * These share the same space as BASEP_CONTEXT_FLAG_*, and so must
  * not collide with them.
  */
-typedef u32 base_context_create_flags;
+typedef __u32 base_context_create_flags;
 
 /* No flags set */
 #define BASE_CONTEXT_CREATE_FLAG_NONE ((base_context_create_flags)0)
@@ -229,11 +230,10 @@ typedef u32 base_context_create_flags;
 #define BASE_CONTEXT_SYSTEM_MONITOR_SUBMIT_DISABLED \
 	((base_context_create_flags)1 << 1)
 
-/* Create CSF event thread.
+/* Base context creates a CSF event notification thread.
  *
- * The creation of a CSF event thread is conditional and only allowed in
- * unit tests for the moment, in order to avoid clashes with the existing
- * Base unit tests.
+ * The creation of a CSF event notification thread is conditional but
+ * mandatory for the handling of CSF events.
  */
 #define BASE_CONTEXT_CSF_EVENT_THREAD ((base_context_create_flags)1 << 2)
 
@@ -290,25 +290,75 @@ typedef u32 base_context_create_flags;
 
 #define BASE_QUEUE_MAX_PRIORITY (15U)
 
-/* CQS Sync object is an array of u32 event_mem[2], error field index is 1 */
+/* CQS Sync object is an array of __u32 event_mem[2], error field index is 1 */
 #define BASEP_EVENT_VAL_INDEX (0U)
 #define BASEP_EVENT_ERR_INDEX (1U)
 
 /* The upper limit for number of objects that could be waited/set per command.
  * This limit is now enforced as internally the error inherit inputs are
- * converted to 32-bit flags in a u32 variable occupying a previously padding
+ * converted to 32-bit flags in a __u32 variable occupying a previously padding
  * field.
  */
 #define BASEP_KCPU_CQS_MAX_NUM_OBJS ((size_t)32)
 
+#if MALI_UNIT_TEST
+/**
+ * enum base_kcpu_command_type - Kernel CPU queue command type.
+ * @BASE_KCPU_COMMAND_TYPE_FENCE_SIGNAL:       fence_signal,
+ * @BASE_KCPU_COMMAND_TYPE_FENCE_WAIT:         fence_wait,
+ * @BASE_KCPU_COMMAND_TYPE_CQS_WAIT:           cqs_wait,
+ * @BASE_KCPU_COMMAND_TYPE_CQS_SET:            cqs_set,
+ * @BASE_KCPU_COMMAND_TYPE_CQS_WAIT_OPERATION: cqs_wait_operation,
+ * @BASE_KCPU_COMMAND_TYPE_CQS_SET_OPERATION:  cqs_set_operation,
+ * @BASE_KCPU_COMMAND_TYPE_MAP_IMPORT:         map_import,
+ * @BASE_KCPU_COMMAND_TYPE_UNMAP_IMPORT:       unmap_import,
+ * @BASE_KCPU_COMMAND_TYPE_UNMAP_IMPORT_FORCE: unmap_import_force,
+ * @BASE_KCPU_COMMAND_TYPE_JIT_ALLOC:          jit_alloc,
+ * @BASE_KCPU_COMMAND_TYPE_JIT_FREE:           jit_free,
+ * @BASE_KCPU_COMMAND_TYPE_GROUP_SUSPEND:      group_suspend,
+ * @BASE_KCPU_COMMAND_TYPE_ERROR_BARRIER:      error_barrier,
+ * @BASE_KCPU_COMMAND_TYPE_SAMPLE_TIME:        sample_time,
+ */
+enum base_kcpu_command_type {
+	BASE_KCPU_COMMAND_TYPE_FENCE_SIGNAL,
+	BASE_KCPU_COMMAND_TYPE_FENCE_WAIT,
+	BASE_KCPU_COMMAND_TYPE_CQS_WAIT,
+	BASE_KCPU_COMMAND_TYPE_CQS_SET,
+	BASE_KCPU_COMMAND_TYPE_CQS_WAIT_OPERATION,
+	BASE_KCPU_COMMAND_TYPE_CQS_SET_OPERATION,
+	BASE_KCPU_COMMAND_TYPE_MAP_IMPORT,
+	BASE_KCPU_COMMAND_TYPE_UNMAP_IMPORT,
+	BASE_KCPU_COMMAND_TYPE_UNMAP_IMPORT_FORCE,
+	BASE_KCPU_COMMAND_TYPE_JIT_ALLOC,
+	BASE_KCPU_COMMAND_TYPE_JIT_FREE,
+	BASE_KCPU_COMMAND_TYPE_GROUP_SUSPEND,
+	BASE_KCPU_COMMAND_TYPE_ERROR_BARRIER,
+	BASE_KCPU_COMMAND_TYPE_SAMPLE_TIME,
+};
+#else
 /**
  * enum base_kcpu_command_type - Kernel CPU queue command type.
+ * @BASE_KCPU_COMMAND_TYPE_FENCE_SIGNAL:       fence_signal,
+ * @BASE_KCPU_COMMAND_TYPE_FENCE_WAIT:         fence_wait,
+ * @BASE_KCPU_COMMAND_TYPE_CQS_WAIT:           cqs_wait,
+ * @BASE_KCPU_COMMAND_TYPE_CQS_SET:            cqs_set,
+ * @BASE_KCPU_COMMAND_TYPE_CQS_WAIT_OPERATION: cqs_wait_operation,
+ * @BASE_KCPU_COMMAND_TYPE_CQS_SET_OPERATION:  cqs_set_operation,
+ * @BASE_KCPU_COMMAND_TYPE_MAP_IMPORT:         map_import,
+ * @BASE_KCPU_COMMAND_TYPE_UNMAP_IMPORT:       unmap_import,
+ * @BASE_KCPU_COMMAND_TYPE_UNMAP_IMPORT_FORCE: unmap_import_force,
+ * @BASE_KCPU_COMMAND_TYPE_JIT_ALLOC:          jit_alloc,
+ * @BASE_KCPU_COMMAND_TYPE_JIT_FREE:           jit_free,
+ * @BASE_KCPU_COMMAND_TYPE_GROUP_SUSPEND:      group_suspend,
+ * @BASE_KCPU_COMMAND_TYPE_ERROR_BARRIER:      error_barrier,
  */
 enum base_kcpu_command_type {
 	BASE_KCPU_COMMAND_TYPE_FENCE_SIGNAL,
 	BASE_KCPU_COMMAND_TYPE_FENCE_WAIT,
 	BASE_KCPU_COMMAND_TYPE_CQS_WAIT,
 	BASE_KCPU_COMMAND_TYPE_CQS_SET,
+	BASE_KCPU_COMMAND_TYPE_CQS_WAIT_OPERATION,
+	BASE_KCPU_COMMAND_TYPE_CQS_SET_OPERATION,
 	BASE_KCPU_COMMAND_TYPE_MAP_IMPORT,
 	BASE_KCPU_COMMAND_TYPE_UNMAP_IMPORT,
 	BASE_KCPU_COMMAND_TYPE_UNMAP_IMPORT_FORCE,
@@ -317,17 +367,20 @@ enum base_kcpu_command_type {
 	BASE_KCPU_COMMAND_TYPE_GROUP_SUSPEND,
 	BASE_KCPU_COMMAND_TYPE_ERROR_BARRIER,
 };
+#endif /* MALI_UNIT_TEST */
 
 /**
  * enum base_queue_group_priority - Priority of a GPU Command Queue Group.
- * @BASE_QUEUE_GROUP_PRIORITY_HIGH:   GPU Command Queue Group is of high
- *                                    priority.
- * @BASE_QUEUE_GROUP_PRIORITY_MEDIUM: GPU Command Queue Group is of medium
- *                                    priority.
- * @BASE_QUEUE_GROUP_PRIORITY_LOW:    GPU Command Queue Group is of low
- *                                    priority.
- * @BASE_QUEUE_GROUP_PRIORITY_COUNT:  Number of GPU Command Queue Group
- *                                    priority levels.
+ * @BASE_QUEUE_GROUP_PRIORITY_HIGH:     GPU Command Queue Group is of high
+ *                                      priority.
+ * @BASE_QUEUE_GROUP_PRIORITY_MEDIUM:   GPU Command Queue Group is of medium
+ *                                      priority.
+ * @BASE_QUEUE_GROUP_PRIORITY_LOW:      GPU Command Queue Group is of low
+ *                                      priority.
+ * @BASE_QUEUE_GROUP_PRIORITY_REALTIME: GPU Command Queue Group is of real-time
+ *                                      priority.
+ * @BASE_QUEUE_GROUP_PRIORITY_COUNT:    Number of GPU Command Queue Group
+ *                                      priority levels.
  *
  * Currently this is in order of highest to lowest, but if new levels are added
  * then those new levels may be out of order to preserve the ABI compatibility
@@ -342,33 +395,123 @@ enum base_queue_group_priority {
 	BASE_QUEUE_GROUP_PRIORITY_HIGH = 0,
 	BASE_QUEUE_GROUP_PRIORITY_MEDIUM,
 	BASE_QUEUE_GROUP_PRIORITY_LOW,
+	BASE_QUEUE_GROUP_PRIORITY_REALTIME,
 	BASE_QUEUE_GROUP_PRIORITY_COUNT
 };
 
 struct base_kcpu_command_fence_info {
-	u64 fence;
+	__u64 fence;
 };
 
-struct base_cqs_wait {
-	u64 addr;
-	u32 val;
-	u32 padding;
+struct base_cqs_wait_info {
+	__u64 addr;
+	__u32 val;
+	__u32 padding;
 };
 
 struct base_kcpu_command_cqs_wait_info {
-	u64 objs;
-	u32 nr_objs;
-	u32 inherit_err_flags;
+	__u64 objs;
+	__u32 nr_objs;
+	__u32 inherit_err_flags;
 };
 
 struct base_cqs_set {
-	u64 addr;
+	__u64 addr;
 };
 
 struct base_kcpu_command_cqs_set_info {
-	u64 objs;
-	u32 nr_objs;
-	u32 propagate_flags;
+	__u64 objs;
+	__u32 nr_objs;
+	__u32 padding;
+};
+
+/**
+ * basep_cqs_data_type - Enumeration of CQS Data Types
+ *
+ * @BASEP_CQS_DATA_TYPE_U32: The Data Type of a CQS Object's value
+ *                           is an unsigned 32-bit integer
+ * @BASEP_CQS_DATA_TYPE_U64: The Data Type of a CQS Object's value
+ *                           is an unsigned 64-bit integer
+ */
+typedef enum PACKED {
+	BASEP_CQS_DATA_TYPE_U32 = 0,
+	BASEP_CQS_DATA_TYPE_U64 = 1,
+} basep_cqs_data_type;
+
+/**
+ * basep_cqs_wait_operation_op - Enumeration of CQS Object Wait
+ *                                Operation conditions
+ *
+ * @BASEP_CQS_WAIT_OPERATION_LE: CQS Wait Operation indicating that a
+ *                                wait will be satisfied when a CQS Object's
+ *                                value is Less than or Equal to
+ *                                the Wait Operation value
+ * @BASEP_CQS_WAIT_OPERATION_GT: CQS Wait Operation indicating that a
+ *                                wait will be satisfied when a CQS Object's
+ *                                value is Greater than the Wait Operation value
+ */
+typedef enum {
+	BASEP_CQS_WAIT_OPERATION_LE = 0,
+	BASEP_CQS_WAIT_OPERATION_GT = 1,
+} basep_cqs_wait_operation_op;
+
+struct base_cqs_wait_operation_info {
+	__u64 addr;
+	__u64 val;
+	__u8 operation;
+	__u8 data_type;
+	__u8 padding[6];
+};
+
+/**
+ * struct base_kcpu_command_cqs_wait_operation_info - structure which contains information
+ *		about the Timeline CQS wait objects
+ *
+ * @objs:              An array of Timeline CQS waits.
+ * @nr_objs:           Number of Timeline CQS waits in the array.
+ * @inherit_err_flags: Bit-pattern for the CQSs in the array who's error field
+ *                     to be served as the source for importing into the
+ *                     queue's error-state.
+ */
+struct base_kcpu_command_cqs_wait_operation_info {
+	__u64 objs;
+	__u32 nr_objs;
+	__u32 inherit_err_flags;
+};
+
+/**
+ * basep_cqs_set_operation_op - Enumeration of CQS Set Operations
+ *
+ * @BASEP_CQS_SET_OPERATION_ADD: CQS Set operation for adding a value
+ *                                to a synchronization object
+ * @BASEP_CQS_SET_OPERATION_SET: CQS Set operation for setting the value
+ *                                of a synchronization object
+ */
+typedef enum {
+	BASEP_CQS_SET_OPERATION_ADD = 0,
+	BASEP_CQS_SET_OPERATION_SET = 1,
+} basep_cqs_set_operation_op;
+
+struct base_cqs_set_operation_info {
+	__u64 addr;
+	__u64 val;
+	__u8 operation;
+	__u8 data_type;
+	__u8 padding[6];
+};
+
+/**
+ * struct base_kcpu_command_cqs_set_operation_info - structure which contains information
+ *		about the Timeline CQS set objects
+ *
+ * @objs:    An array of Timeline CQS sets.
+ * @nr_objs: Number of Timeline CQS sets in the array.
+ * @padding: Structure padding, unused bytes.
+ */
+struct base_kcpu_command_cqs_set_operation_info {
+	__u64 objs;
+	__u32 nr_objs;
+	__u32 padding;
 };
 
 /**
@@ -378,7 +521,7 @@ struct base_kcpu_command_cqs_set_info {
  * @handle:	Address of imported user buffer.
  */
 struct base_kcpu_command_import_info {
-	u64 handle;
+	__u64 handle;
 };
 
 /**
@@ -391,9 +534,9 @@ struct base_kcpu_command_import_info {
  * @padding:	Padding to a multiple of 64 bits.
  */
 struct base_kcpu_command_jit_alloc_info {
-	u64 info;
-	u8 count;
-	u8 padding[7];
+	__u64 info;
+	__u8 count;
+	__u8 padding[7];
 };
 
 /**
@@ -405,9 +548,9 @@ struct base_kcpu_command_jit_alloc_info {
  * @padding:	Padding to a multiple of 64 bits.
  */
 struct base_kcpu_command_jit_free_info {
-	u64 ids;
-	u8 count;
-	u8 padding[7];
+	__u64 ids;
+	__u8 count;
+	__u8 padding[7];
 };
 
 /**
@@ -416,52 +559,71 @@ struct base_kcpu_command_jit_free_info {
  *
  * @buffer:		Pointer to an array of elements of the type char.
  * @size:		Number of elements in the @buffer array.
- * @group_handle:	Handle to the mapping of command stream group.
+ * @group_handle:	Handle to the mapping of CSG.
  * @padding:		padding to a multiple of 64 bits.
  */
 struct base_kcpu_command_group_suspend_info {
-	u64 buffer;
-	u32 size;
-	u8 group_handle;
-	u8 padding[3];
+	__u64 buffer;
+	__u32 size;
+	__u8 group_handle;
+	__u8 padding[3];
 };
 
+#if MALI_UNIT_TEST
+struct base_kcpu_command_sample_time_info {
+	__u64 time;
+};
+#endif /* MALI_UNIT_TEST */
+
 /**
  * struct base_kcpu_command - kcpu command.
- *
  * @type:	type of the kcpu command, one enum base_kcpu_command_type
+ * @padding:	padding to a multiple of 64 bits
  * @info:	structure which contains information about the kcpu command;
  *		actual type is determined by @p type
- * @padding:	padding to a multiple of 64 bits
+ * @info.fence:            Fence
+ * @info.cqs_wait:         CQS wait
+ * @info.cqs_set:          CQS set
+ * @info.import:           import
+ * @info.jit_alloc:        jit allocation
+ * @info.jit_free:         jit deallocation
+ * @info.suspend_buf_copy: suspend buffer copy
+ * @info.sample_time:      sample time
+ * @info.padding:          padding
  */
 struct base_kcpu_command {
-	u8 type;
-	u8 padding[sizeof(u64) - sizeof(u8)];
+	__u8 type;
+	__u8 padding[sizeof(__u64) - sizeof(__u8)];
 	union {
 		struct base_kcpu_command_fence_info fence;
 		struct base_kcpu_command_cqs_wait_info cqs_wait;
 		struct base_kcpu_command_cqs_set_info cqs_set;
+		struct base_kcpu_command_cqs_wait_operation_info cqs_wait_operation;
+		struct base_kcpu_command_cqs_set_operation_info cqs_set_operation;
 		struct base_kcpu_command_import_info import;
 		struct base_kcpu_command_jit_alloc_info jit_alloc;
 		struct base_kcpu_command_jit_free_info jit_free;
 		struct base_kcpu_command_group_suspend_info suspend_buf_copy;
-		u64 padding[2]; /* No sub-struct should be larger */
+#if MALI_UNIT_TEST
+		struct base_kcpu_command_sample_time_info sample_time;
+#endif /* MALI_UNIT_TEST */
+		__u64 padding[2]; /* No sub-struct should be larger */
 	} info;
 };
 
 /**
- * struct basep_cs_stream_control - Command Stream interface capabilities.
+ * struct basep_cs_stream_control - CSI capabilities.
  *
  * @features: Features of this stream
  * @padding:  Padding to a multiple of 64 bits.
  */
 struct basep_cs_stream_control {
-	u32 features;
-	u32 padding;
+	__u32 features;
+	__u32 padding;
 };
 
 /**
- * struct basep_cs_group_control - Command Stream Group interface capabilities.
+ * struct basep_cs_group_control - CSG interface capabilities.
  *
  * @features:     Features of this group
  * @stream_num:   Number of streams in this group
@@ -469,10 +631,10 @@ struct basep_cs_stream_control {
  * @padding:      Padding to a multiple of 64 bits.
  */
 struct basep_cs_group_control {
-	u32 features;
-	u32 stream_num;
-	u32 suspend_size;
-	u32 padding;
+	__u32 features;
+	__u32 stream_num;
+	__u32 suspend_size;
+	__u32 padding;
 };
 
 /**
@@ -487,9 +649,9 @@ struct basep_cs_group_control {
  * @padding:      Padding to make multiple of 64bits
  */
 struct base_gpu_queue_group_error_fatal_payload {
-	u64 sideband;
-	u32 status;
-	u32 padding;
+	__u64 sideband;
+	__u32 status;
+	__u32 padding;
 };
 
 /**
@@ -505,10 +667,10 @@ struct base_gpu_queue_group_error_fatal_payload {
  * @padding:      Padding to make multiple of 64bits
  */
 struct base_gpu_queue_error_fatal_payload {
-	u64 sideband;
-	u32 status;
-	u8 csi_index;
-	u8 padding[3];
+	__u64 sideband;
+	__u32 status;
+	__u8 csi_index;
+	__u8 padding[3];
 };
 
 /**
@@ -536,19 +698,17 @@ enum base_gpu_queue_group_error_type {
 
 /**
  * struct base_gpu_queue_group_error - Unrecoverable fault information
- *
- * @error_type:   Error type of @base_gpu_queue_group_error_type
- *                indicating which field in union payload is filled
- * @padding:      Unused bytes for 64bit boundary
- * @fatal_group:  Unrecoverable fault error associated with
- *                GPU command queue group
- * @fatal_queue:  Unrecoverable fault error associated with command queue
- *
- * @payload:      Input Payload
+ * @error_type:          Error type of @base_gpu_queue_group_error_type
+ *                       indicating which field in union payload is filled
+ * @padding:             Unused bytes for 64bit boundary
+ * @payload:             Input Payload
+ * @payload.fatal_group: Unrecoverable fault error associated with
+ *                       GPU command queue group
+ * @payload.fatal_queue: Unrecoverable fault error associated with command queue
  */
 struct base_gpu_queue_group_error {
-	u8 error_type;
-	u8 padding[7];
+	__u8 error_type;
+	__u8 padding[7];
 	union {
 		struct base_gpu_queue_group_error_fatal_payload fatal_group;
 		struct base_gpu_queue_error_fatal_payload fatal_queue;
@@ -561,6 +721,8 @@ struct base_gpu_queue_group_error {
  * @BASE_CSF_NOTIFICATION_EVENT:                 Notification with kernel event
  * @BASE_CSF_NOTIFICATION_GPU_QUEUE_GROUP_ERROR: Notification with GPU fatal
  *                                               error
+ * @BASE_CSF_NOTIFICATION_CPU_QUEUE_DUMP:        Notification with dumping cpu
+ *                                               queue
  * @BASE_CSF_NOTIFICATION_COUNT:                 The number of notification type
  *
  * This type is used for &struct_base_csf_notification.type.
@@ -568,31 +730,36 @@ struct base_gpu_queue_group_error {
 enum base_csf_notification_type {
 	BASE_CSF_NOTIFICATION_EVENT = 0,
 	BASE_CSF_NOTIFICATION_GPU_QUEUE_GROUP_ERROR,
+	BASE_CSF_NOTIFICATION_CPU_QUEUE_DUMP,
 	BASE_CSF_NOTIFICATION_COUNT
 };
 
 /**
  * struct base_csf_notification - Event or error notification
  *
- * @type:         Notification type of @base_csf_notification_type
- * @padding:      Padding for 64bit boundary
- * @handle:       Handle of GPU command queue group associated with fatal error
- * @error:        Unrecoverable fault error
- * @align:        To fit the struct into a 64-byte cache line
+ * @type:                      Notification type of @base_csf_notification_type
+ * @padding:                   Padding for 64bit boundary
+ * @payload:                   Input Payload
+ * @payload.align:             To fit the struct into a 64-byte cache line
+ * @payload.csg_error:         CSG error
+ * @payload.csg_error.handle:  Handle of GPU command queue group associated with
+ *                             fatal error
+ * @payload.csg_error.padding: Padding
+ * @payload.csg_error.error:   Unrecoverable fault error
  *
- * @payload:      Input Payload
  */
 struct base_csf_notification {
-	u8 type;
-	u8 padding[7];
+	__u8 type;
+	__u8 padding[7];
 	union {
 		struct {
-			u8 handle;
-			u8 padding[7];
+			__u8 handle;
+			__u8 padding[7];
 			struct base_gpu_queue_group_error error;
 		} csg_error;
-		u8 align[56];
+
+		__u8 align[56];
 	} payload;
 };
 
-#endif /* _BASE_CSF_KERNEL_H_ */
+#endif /* _UAPI_BASE_CSF_KERNEL_H_ */
diff --git a/drivers/gpu/arm/bifrost/csf/mali_gpu_csf_control_registers.h b/include/uapi/gpu/arm/bifrost/csf/mali_gpu_csf_control_registers.h
similarity index 76%
rename from drivers/gpu/arm/bifrost/csf/mali_gpu_csf_control_registers.h
rename to include/uapi/gpu/arm/bifrost/csf/mali_gpu_csf_control_registers.h
index 4fff80ca4023..570cba81e4bc 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_gpu_csf_control_registers.h
+++ b/include/uapi/gpu/arm/bifrost/csf/mali_gpu_csf_control_registers.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,18 +17,16 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
  * This header was autogenerated, it should not be edited.
  */
 
-#ifndef _GPU_CSF_CONTROL_REGISTERS_H_
-#define _GPU_CSF_CONTROL_REGISTERS_H_
+#ifndef _UAPI_GPU_CSF_CONTROL_REGISTERS_H_
+#define _UAPI_GPU_CSF_CONTROL_REGISTERS_H_
 
 /* GPU_REGISTERS register offsets */
 #define GPU_CONTROL_MCU 0x3000 /* () MCU control registers */
 
-#endif /* _GPU_CSF_CONTROL_REGISTERS_H_ */
+#endif /* _UAPI_GPU_CSF_CONTROL_REGISTERS_H_ */
diff --git a/drivers/gpu/arm/bifrost/csf/mali_gpu_csf_registers.h b/include/uapi/gpu/arm/bifrost/csf/mali_gpu_csf_registers.h
similarity index 87%
rename from drivers/gpu/arm/bifrost/csf/mali_gpu_csf_registers.h
rename to include/uapi/gpu/arm/bifrost/csf/mali_gpu_csf_registers.h
index 5c03445f3c79..f233a0da8f17 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_gpu_csf_registers.h
+++ b/include/uapi/gpu/arm/bifrost/csf/mali_gpu_csf_registers.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2018-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2018-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,16 +17,14 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
  * This header was autogenerated, it should not be edited.
  */
 
-#ifndef _GPU_CSF_REGISTERS_H_
-#define _GPU_CSF_REGISTERS_H_
+#ifndef _UAPI_GPU_CSF_REGISTERS_H_
+#define _UAPI_GPU_CSF_REGISTERS_H_
 
 /*
  * Begin register sets
@@ -91,8 +90,8 @@
 #define DB_BLK_DOORBELL 0x0000 /* (WO) Doorbell request */
 
 /* CS_KERNEL_INPUT_BLOCK register offsets */
-#define CS_REQ 0x0000 /* () Command stream request flags */
-#define CS_CONFIG 0x0004 /* () Command stream configuration */
+#define CS_REQ 0x0000 /* () CS request flags */
+#define CS_CONFIG 0x0004 /* () CS configuration */
 #define CS_ACK_IRQ_MASK 0x000C /* () Command steam interrupt mask */
 #define CS_BASE_LO 0x0010 /* () Base pointer for the ring buffer, low word */
 #define CS_BASE_HI 0x0014 /* () Base pointer for the ring buffer, high word */
@@ -107,14 +106,16 @@
 #define CS_USER_OUTPUT_HI 0x003C /* () CS user mode input page address, high word */
 
 /* CS_KERNEL_OUTPUT_BLOCK register offsets */
-#define CS_ACK 0x0000 /* () Command stream acknowledge flags */
+#define CS_ACK 0x0000 /* () CS acknowledge flags */
 #define CS_STATUS_CMD_PTR_LO 0x0040 /* () Program pointer current value, low word */
 #define CS_STATUS_CMD_PTR_HI 0x0044 /* () Program pointer current value, high word */
 #define CS_STATUS_WAIT 0x0048 /* () Wait condition status register */
-#define CS_STATUS_REQ_RESOURCE 0x004C /* () Indicates the resources requested by the command stream */
+#define CS_STATUS_REQ_RESOURCE 0x004C /* () Indicates the resources requested by the CS */
 #define CS_STATUS_WAIT_SYNC_POINTER_LO 0x0050 /* () Sync object pointer, low word */
 #define CS_STATUS_WAIT_SYNC_POINTER_HI 0x0054 /* () Sync object pointer, high word */
 #define CS_STATUS_WAIT_SYNC_VALUE 0x0058 /* () Sync object test value */
+#define CS_STATUS_SCOREBOARDS 0x005C /* () Scoreboard status */
+#define CS_STATUS_BLOCKED_REASON 0x0060 /* () Blocked reason */
 #define CS_FAULT 0x0080 /* () Recoverable fault information */
 #define CS_FATAL 0x0084 /* () Unrecoverable fault information */
 #define CS_FAULT_INFO_LO 0x0088 /* () Additional information about a recoverable fault, low word */
@@ -136,13 +137,13 @@
 /* CS_USER_OUTPUT_BLOCK register offsets */
 #define CS_EXTRACT_LO 0x0000 /* () Current extract offset for ring buffer, low word */
 #define CS_EXTRACT_HI 0x0004 /* () Current extract offset for ring buffer, high word */
-#define CS_ACTIVE 0x0008 /* () Initial extract offset when the command stream is started */
+#define CS_ACTIVE 0x0008 /* () Initial extract offset when the CS is started */
 
 /* CSG_INPUT_BLOCK register offsets */
 #define CSG_REQ 0x0000 /* () CSG request */
 #define CSG_ACK_IRQ_MASK 0x0004 /* () Global acknowledge interrupt mask */
 #define CSG_DB_REQ 0x0008 /* () Global doorbell request */
-#define CSG_IRQ_ACK 0x000C /* () Command stream IRQ acknowledge */
+#define CSG_IRQ_ACK 0x000C /* () CS IRQ acknowledge */
 #define CSG_ALLOW_COMPUTE_LO 0x0020 /* () Allowed compute endpoints, low word */
 #define CSG_ALLOW_COMPUTE_HI 0x0024 /* () Allowed compute endpoints, high word */
 #define CSG_ALLOW_FRAGMENT_LO 0x0028 /* () Allowed fragment endpoints, low word */
@@ -154,11 +155,12 @@
 #define CSG_PROTM_SUSPEND_BUF_LO 0x0048 /* () Protected mode suspend buffer, low word */
 #define CSG_PROTM_SUSPEND_BUF_HI 0x004C /* () Protected mode suspend buffer, high word */
 #define CSG_CONFIG 0x0050 /* () CSG configuration options */
+#define CSG_ITER_TRACE_CONFIG 0x0054 /* () CSG trace configuration */
 
 /* CSG_OUTPUT_BLOCK register offsets */
-#define CSG_ACK 0x0000 /* () Command stream group acknowledge flags */
-#define CSG_DB_ACK 0x0008 /* () Command stream kernel doorbell acknowledge flags */
-#define CSG_IRQ_REQ 0x000C /* () Command stream interrupt request flags */
+#define CSG_ACK 0x0000 /* () CSG acknowledge flags */
+#define CSG_DB_ACK 0x0008 /* () CS kernel doorbell acknowledge flags */
+#define CSG_IRQ_REQ 0x000C /* () CS interrupt request flags */
 #define CSG_STATUS_EP_CURRENT 0x0010 /* () Endpoint allocation status register */
 #define CSG_STATUS_EP_REQ 0x0014 /* () Endpoint request status register */
 #define CSG_RESOURCE_DEP 0x001C /* () Current resource dependencies */
@@ -171,18 +173,19 @@
 #define GLB_GROUP_NUM 0x0010 /* () Number of CSG interfaces */
 #define GLB_GROUP_STRIDE 0x0014 /* () Stride between CSG interfaces */
 #define GLB_PRFCNT_SIZE 0x0018 /* () Size of CSF performance counters */
+#define GLB_INSTR_FEATURES 0x001C /* () TRACE_POINT instrumentation features */
 #define GROUP_CONTROL_0 0x1000 /* () CSG control and capabilities */
 #define GROUP_CONTROL(n) (GROUP_CONTROL_0 + (n)*256)
 #define GROUP_CONTROL_REG(n, r) (GROUP_CONTROL(n) + GROUP_CONTROL_BLOCK_REG(r))
 #define GROUP_CONTROL_COUNT 16
 
 /* STREAM_CONTROL_BLOCK register offsets */
-#define STREAM_FEATURES 0x0000 /* () Command Stream interface features */
+#define STREAM_FEATURES 0x0000 /* () CSI features */
 #define STREAM_INPUT_VA 0x0004 /* () Address of CS_KERNEL_INPUT_BLOCK */
 #define STREAM_OUTPUT_VA 0x0008 /* () Address of CS_KERNEL_OUTPUT_BLOCK */
 
 /* GROUP_CONTROL_BLOCK register offsets */
-#define GROUP_FEATURES 0x0000 /* () Command Stream Group interface features */
+#define GROUP_FEATURES 0x0000 /* () CSG interface features */
 #define GROUP_INPUT_VA 0x0004 /* () Address of CSG_INPUT_BLOCK */
 #define GROUP_OUTPUT_VA 0x0008 /* () Address of CSG_OUTPUT_BLOCK */
 #define GROUP_SUSPEND_SIZE 0x000C /* () Size of CSG suspend buffer */
@@ -207,6 +210,7 @@
 #define GLB_PRFCNT_JASID 0x0024 /* () Performance counter address space */
 #define GLB_PRFCNT_BASE_LO 0x0028 /* () Performance counter buffer address, low word */
 #define GLB_PRFCNT_BASE_HI 0x002C /* () Performance counter buffer address, high word */
+#define GLB_PRFCNT_EXTRACT 0x0030 /* () Performance counter buffer extract index */
 #define GLB_PRFCNT_CONFIG 0x0040 /* () Performance counter configuration */
 #define GLB_PRFCNT_CSG_SELECT 0x0044 /* () CSG performance counting enable */
 #define GLB_PRFCNT_FW_EN 0x0048 /* () Performance counter enable for firmware */
@@ -228,12 +232,20 @@
 #define GLB_DB_ACK 0x0008 /* () Global doorbell acknowledge */
 #define GLB_HALT_STATUS 0x0010 /* () Global halt status */
 #define GLB_PRFCNT_STATUS 0x0014 /* () Performance counter status */
+#define GLB_PRFCNT_INSERT 0x0018 /* () Performance counter buffer insert index */
 #define GLB_DEBUG_FWUTF_RESULT 0x0FE0 /* () Firmware debug test result */
 #define GLB_DEBUG_ACK 0x0FFC /* () Global debug acknowledge */
 
+/* USER register offsets */
+#define LATEST_FLUSH 0x0000 /* () Flush ID of latest clean-and-invalidate operation */
+
 /* End register offsets */
 
 /* CS_KERNEL_INPUT_BLOCK register set definitions */
+/* GLB_VERSION register */
+#define GLB_VERSION_PATCH_SHIFT (0)
+#define GLB_VERSION_MINOR_SHIFT (16)
+#define GLB_VERSION_MAJOR_SHIFT (24)
 
 /* CS_REQ register */
 #define CS_REQ_STATE_SHIFT 0
@@ -251,15 +263,6 @@
 #define CS_REQ_EXTRACT_EVENT_SET(reg_val, value) \
 	(((reg_val) & ~CS_REQ_EXTRACT_EVENT_MASK) | (((value) << CS_REQ_EXTRACT_EVENT_SHIFT) & CS_REQ_EXTRACT_EVENT_MASK))
 
-/* From 10.x.5, CS_REQ_ERROR_MODE is removed but TI2 bitfile upload not finished.
- * Need to remove on GPUCORE-23972
- */
-#define CS_REQ_ERROR_MODE_SHIFT 5
-#define CS_REQ_ERROR_MODE_MASK (0x1 << CS_REQ_ERROR_MODE_SHIFT)
-#define CS_REQ_ERROR_MODE_GET(reg_val) ((reg_val & CS_REQ_ERROR_MODE_MASK) >> CS_REQ_ERROR_MODE_SHIFT)
-#define CS_REQ_ERROR_MODE_SET(reg_val, value) \
-         ((reg_val & ~CS_REQ_ERROR_MODE_MASK) | ((value << CS_REQ_ERROR_MODE_SHIFT) & CS_REQ_ERROR_MODE_MASK))
-
 #define CS_REQ_IDLE_SYNC_WAIT_SHIFT 8
 #define CS_REQ_IDLE_SYNC_WAIT_MASK (0x1 << CS_REQ_IDLE_SYNC_WAIT_SHIFT)
 #define CS_REQ_IDLE_SYNC_WAIT_GET(reg_val) (((reg_val)&CS_REQ_IDLE_SYNC_WAIT_MASK) >> CS_REQ_IDLE_SYNC_WAIT_SHIFT)
@@ -551,6 +554,39 @@
 	(((reg_val) & ~CS_STATUS_WAIT_SYNC_VALUE_VALUE_MASK) |  \
 	 (((value) << CS_STATUS_WAIT_SYNC_VALUE_VALUE_SHIFT) & CS_STATUS_WAIT_SYNC_VALUE_VALUE_MASK))
 
+/* CS_STATUS_SCOREBOARDS register */
+#define CS_STATUS_SCOREBOARDS_NONZERO_SHIFT (0)
+#define CS_STATUS_SCOREBOARDS_NONZERO_MASK                                     \
+	((0xFFFF) << CS_STATUS_SCOREBOARDS_NONZERO_SHIFT)
+#define CS_STATUS_SCOREBOARDS_NONZERO_GET(reg_val)                             \
+	(((reg_val)&CS_STATUS_SCOREBOARDS_NONZERO_MASK) >>                     \
+	 CS_STATUS_SCOREBOARDS_NONZERO_SHIFT)
+#define CS_STATUS_SCOREBOARDS_NONZERO_SET(reg_val, value)                      \
+	(((reg_val) & ~CS_STATUS_SCOREBOARDS_NONZERO_MASK) |                   \
+	 (((value) << CS_STATUS_SCOREBOARDS_NONZERO_SHIFT) &                   \
+	  CS_STATUS_SCOREBOARDS_NONZERO_MASK))
+
+/* CS_STATUS_BLOCKED_REASON register */
+#define CS_STATUS_BLOCKED_REASON_REASON_SHIFT (0)
+#define CS_STATUS_BLOCKED_REASON_REASON_MASK                                   \
+	((0xF) << CS_STATUS_BLOCKED_REASON_REASON_SHIFT)
+#define CS_STATUS_BLOCKED_REASON_REASON_GET(reg_val)                           \
+	(((reg_val)&CS_STATUS_BLOCKED_REASON_REASON_MASK) >>                   \
+	 CS_STATUS_BLOCKED_REASON_REASON_SHIFT)
+#define CS_STATUS_BLOCKED_REASON_REASON_SET(reg_val, value)                    \
+	(((reg_val) & ~CS_STATUS_BLOCKED_REASON_REASON_MASK) |                 \
+	 (((value) << CS_STATUS_BLOCKED_REASON_REASON_SHIFT) &                 \
+	  CS_STATUS_BLOCKED_REASON_REASON_MASK))
+/* CS_STATUS_BLOCKED_REASON_reason values */
+#define CS_STATUS_BLOCKED_REASON_REASON_UNBLOCKED 0x0
+#define CS_STATUS_BLOCKED_REASON_REASON_WAIT 0x1
+#define CS_STATUS_BLOCKED_REASON_REASON_PROGRESS_WAIT 0x2
+#define CS_STATUS_BLOCKED_REASON_REASON_SYNC_WAIT 0x3
+#define CS_STATUS_BLOCKED_REASON_REASON_DEFERRED 0x4
+#define CS_STATUS_BLOCKED_REASON_REASON_RESOURCE 0x5
+#define CS_STATUS_BLOCKED_REASON_REASON_FLUSH 0x6
+/* End of CS_STATUS_BLOCKED_REASON_reason values */
+
 /* CS_FAULT register */
 #define CS_FAULT_EXCEPTION_TYPE_SHIFT 0
 #define CS_FAULT_EXCEPTION_TYPE_MASK (0xFF << CS_FAULT_EXCEPTION_TYPE_SHIFT)
@@ -1060,6 +1096,16 @@
 #define GLB_REQ_PING_GET(reg_val) (((reg_val)&GLB_REQ_PING_MASK) >> GLB_REQ_PING_SHIFT)
 #define GLB_REQ_PING_SET(reg_val, value) \
 	(((reg_val) & ~GLB_REQ_PING_MASK) | (((value) << GLB_REQ_PING_SHIFT) & GLB_REQ_PING_MASK))
+#define GLB_REQ_FIRMWARE_CONFIG_UPDATE_SHIFT 9
+#define GLB_REQ_FIRMWARE_CONFIG_UPDATE_MASK                                    \
+	(0x1 << GLB_REQ_FIRMWARE_CONFIG_UPDATE_SHIFT)
+#define GLB_REQ_FIRMWARE_CONFIG_UPDATE_GET(reg_val)                            \
+	(((reg_val)&GLB_REQ_FIRMWARE_CONFIG_UPDATE_MASK) >>                    \
+	 GLB_REQ_FIRMWARE_CONFIG_UPDATE_SHIFT)
+#define GLB_REQ_FIRMWARE_CONFIG_UPDATE_SET(reg_val, value)                     \
+	(((reg_val) & ~GLB_REQ_FIRMWARE_CONFIG_UPDATE_MASK) |                  \
+	 (((value) << GLB_REQ_FIRMWARE_CONFIG_UPDATE_SHIFT) &                  \
+	  GLB_REQ_FIRMWARE_CONFIG_UPDATE_MASK))
 #define GLB_REQ_INACTIVE_COMPUTE_SHIFT 20
 #define GLB_REQ_INACTIVE_COMPUTE_MASK (0x1 << GLB_REQ_INACTIVE_COMPUTE_SHIFT)
 #define GLB_REQ_INACTIVE_COMPUTE_GET(reg_val) \
@@ -1085,6 +1131,24 @@
 #define GLB_REQ_PROTM_EXIT_GET(reg_val) (((reg_val)&GLB_REQ_PROTM_EXIT_MASK) >> GLB_REQ_PROTM_EXIT_SHIFT)
 #define GLB_REQ_PROTM_EXIT_SET(reg_val, value) \
 	(((reg_val) & ~GLB_REQ_PROTM_EXIT_MASK) | (((value) << GLB_REQ_PROTM_EXIT_SHIFT) & GLB_REQ_PROTM_EXIT_MASK))
+#define GLB_REQ_PRFCNT_THRESHOLD_SHIFT 24
+#define GLB_REQ_PRFCNT_THRESHOLD_MASK (0x1 << GLB_REQ_PRFCNT_THRESHOLD_SHIFT)
+#define GLB_REQ_PRFCNT_THRESHOLD_GET(reg_val) \
+	(((reg_val)&GLB_REQ_PRFCNT_THRESHOLD_MASK) >> \
+	 GLB_REQ_PRFCNT_THRESHOLD_SHIFT)
+#define GLB_REQ_PRFCNT_THRESHOLD_SET(reg_val, value) \
+	(((reg_val) & ~GLB_REQ_PRFCNT_THRESHOLD_MASK) | \
+	 (((value) << GLB_REQ_PRFCNT_THRESHOLD_SHIFT) & \
+	  GLB_REQ_PRFCNT_THRESHOLD_MASK))
+#define GLB_REQ_PRFCNT_OVERFLOW_SHIFT 25
+#define GLB_REQ_PRFCNT_OVERFLOW_MASK (0x1 << GLB_REQ_PRFCNT_OVERFLOW_SHIFT)
+#define GLB_REQ_PRFCNT_OVERFLOW_GET(reg_val) \
+	(((reg_val)&GLB_REQ_PRFCNT_OVERFLOW_MASK) >> \
+	 GLB_REQ_PRFCNT_OVERFLOW_SHIFT)
+#define GLB_REQ_PRFCNT_OVERFLOW_SET(reg_val, value) \
+	(((reg_val) & ~GLB_REQ_PRFCNT_OVERFLOW_MASK) | \
+	 (((value) << GLB_REQ_PRFCNT_OVERFLOW_SHIFT) & \
+	  GLB_REQ_PRFCNT_OVERFLOW_MASK))
 #define GLB_REQ_DEBUG_CSF_REQ_SHIFT 30
 #define GLB_REQ_DEBUG_CSF_REQ_MASK (0x1 << GLB_REQ_DEBUG_CSF_REQ_SHIFT)
 #define GLB_REQ_DEBUG_CSF_REQ_GET(reg_val) (((reg_val)&GLB_REQ_DEBUG_CSF_REQ_MASK) >> GLB_REQ_DEBUG_CSF_REQ_SHIFT)
@@ -1160,6 +1224,16 @@
 #define GLB_ACK_IRQ_MASK_PING_SET(reg_val, value) \
 	(((reg_val) & ~GLB_ACK_IRQ_MASK_PING_MASK) |  \
 	 (((value) << GLB_ACK_IRQ_MASK_PING_SHIFT) & GLB_ACK_IRQ_MASK_PING_MASK))
+#define GLB_ACK_IRQ_MASK_FIRMWARE_CONFIG_UPDATE_SHIFT 9
+#define GLB_ACK_IRQ_MASK_FIRMWARE_CONFIG_UPDATE_MASK                           \
+	(0x1 << GLB_ACK_IRQ_MASK_FIRMWARE_CONFIG_UPDATE_SHIFT)
+#define GLB_ACK_IRQ_MASK_FIRMWARE_CONFIG_UPDATE_GET(reg_val)                   \
+	(((reg_val)&GLB_ACK_IRQ_MASK_FIRMWARE_CONFIG_UPDATE_MASK) >>           \
+	 GLB_ACK_IRQ_MASK_FIRMWARE_CONFIG_UPDATE_SHIFT)
+#define GLB_ACK_IRQ_MASK_FIRMWARE_CONFIG_UPDATE_SET(reg_val, value)            \
+	(((reg_val) & ~GLB_ACK_IRQ_MASK_FIRMWARE_CONFIG_UPDATE_MASK) |         \
+	 (((value) << GLB_ACK_IRQ_MASK_FIRMWARE_CONFIG_UPDATE_SHIFT) &         \
+	  GLB_ACK_IRQ_MASK_FIRMWARE_CONFIG_UPDATE_MASK))
 #define GLB_ACK_IRQ_MASK_INACTIVE_COMPUTE_SHIFT 20
 #define GLB_ACK_IRQ_MASK_INACTIVE_COMPUTE_MASK (0x1 << GLB_ACK_IRQ_MASK_INACTIVE_COMPUTE_SHIFT)
 #define GLB_ACK_IRQ_MASK_INACTIVE_COMPUTE_GET(reg_val) \
@@ -1188,6 +1262,26 @@
 #define GLB_ACK_IRQ_MASK_PROTM_EXIT_SET(reg_val, value) \
 	(((reg_val) & ~GLB_ACK_IRQ_MASK_PROTM_EXIT_MASK) |  \
 	 (((value) << GLB_ACK_IRQ_MASK_PROTM_EXIT_SHIFT) & GLB_ACK_IRQ_MASK_PROTM_EXIT_MASK))
+#define GLB_ACK_IRQ_MASK_PRFCNT_THRESHOLD_SHIFT 24
+#define GLB_ACK_IRQ_MASK_PRFCNT_THRESHOLD_MASK \
+	(0x1 << GLB_ACK_IRQ_MASK_PRFCNT_THRESHOLD_SHIFT)
+#define GLB_ACK_IRQ_MASK_PRFCNT_THRESHOLD_GET(reg_val) \
+	(((reg_val)&GLB_ACK_IRQ_MASK_PRFCNT_THRESHOLD_MASK) >> \
+	 GLB_ACK_IRQ_MASK_PRFCNT_THRESHOLD_SHIFT)
+#define GLB_ACK_IRQ_MASK_PRFCNT_THRESHOLD_SET(reg_val, value) \
+	(((reg_val) & ~GLB_ACK_IRQ_MASK_PRFCNT_THRESHOLD_MASK) | \
+	 (((value) << GLB_ACK_IRQ_MASK_PRFCNT_THRESHOLD_SHIFT) & \
+	  GLB_ACK_IRQ_MASK_PRFCNT_THRESHOLD_MASK))
+#define GLB_ACK_IRQ_MASK_PRFCNT_OVERFLOW_SHIFT 25
+#define GLB_ACK_IRQ_MASK_PRFCNT_OVERFLOW_MASK \
+	(0x1 << GLB_ACK_IRQ_MASK_PRFCNT_OVERFLOW_SHIFT)
+#define GLB_ACK_IRQ_MASK_PRFCNT_OVERFLOW_GET(reg_val) \
+	(((reg_val)&GLB_ACK_IRQ_MASK_PRFCNT_OVERFLOW_MASK) >> \
+	 GLB_ACK_IRQ_MASK_PRFCNT_OVERFLOW_SHIFT)
+#define GLB_ACK_IRQ_MASK_PRFCNT_OVERFLOW_SET(reg_val, value) \
+	(((reg_val) & ~GLB_ACK_IRQ_MASK_PRFCNT_OVERFLOW_MASK) | \
+	 (((value) << GLB_ACK_IRQ_MASK_PRFCNT_OVERFLOW_SHIFT) & \
+	  GLB_ACK_IRQ_MASK_PRFCNT_OVERFLOW_MASK))
 #define GLB_ACK_IRQ_MASK_DEBUG_CSF_REQ_SHIFT 30
 #define GLB_ACK_IRQ_MASK_DEBUG_CSF_REQ_MASK (0x1 << GLB_ACK_IRQ_MASK_DEBUG_CSF_REQ_SHIFT)
 #define GLB_ACK_IRQ_MASK_DEBUG_CSF_REQ_GET(reg_val) \
@@ -1212,6 +1306,26 @@
 	(((reg_val) & ~GLB_PROGRESS_TIMER_TIMEOUT_MASK) |  \
 	 (((value) << GLB_PROGRESS_TIMER_TIMEOUT_SHIFT) & GLB_PROGRESS_TIMER_TIMEOUT_MASK))
 
+/* GLB_PWROFF_TIMER register */
+#define GLB_PWROFF_TIMER_TIMEOUT_SHIFT 0
+#define GLB_PWROFF_TIMER_TIMEOUT_MASK (0x7FFFFFFF << GLB_PWROFF_TIMER_TIMEOUT_SHIFT)
+#define GLB_PWROFF_TIMER_TIMEOUT_GET(reg_val) \
+	(((reg_val)&GLB_PWROFF_TIMER_TIMEOUT_MASK) >> GLB_PWROFF_TIMER_TIMEOUT_SHIFT)
+#define GLB_PWROFF_TIMER_TIMEOUT_SET(reg_val, value) \
+	(((reg_val) & ~GLB_PWROFF_TIMER_TIMEOUT_MASK) |  \
+	 (((value) << GLB_PWROFF_TIMER_TIMEOUT_SHIFT) & GLB_PWROFF_TIMER_TIMEOUT_MASK))
+#define GLB_PWROFF_TIMER_TIMER_SOURCE_SHIFT 31
+#define GLB_PWROFF_TIMER_TIMER_SOURCE_MASK (0x1 << GLB_PWROFF_TIMER_TIMER_SOURCE_SHIFT)
+#define GLB_PWROFF_TIMER_TIMER_SOURCE_GET(reg_val) \
+	(((reg_val)&GLB_PWROFF_TIMER_TIMER_SOURCE_MASK) >> GLB_PWROFF_TIMER_TIMER_SOURCE_SHIFT)
+#define GLB_PWROFF_TIMER_TIMER_SOURCE_SET(reg_val, value) \
+	(((reg_val) & ~GLB_PWROFF_TIMER_TIMER_SOURCE_MASK) |  \
+	 (((value) << GLB_PWROFF_TIMER_TIMER_SOURCE_SHIFT) & GLB_PWROFF_TIMER_TIMER_SOURCE_MASK))
+/* GLB_PWROFF_TIMER_TIMER_SOURCE values */
+#define GLB_PWROFF_TIMER_TIMER_SOURCE_SYSTEM_TIMESTAMP 0x0
+#define GLB_PWROFF_TIMER_TIMER_SOURCE_GPU_COUNTER 0x1
+/* End of GLB_PWROFF_TIMER_TIMER_SOURCE values */
+
 /* GLB_ALLOC_EN register */
 #define GLB_ALLOC_EN_MASK_SHIFT 0
 #define GLB_ALLOC_EN_MASK_MASK (0xFFFFFFFFFFFFFFFF << GLB_ALLOC_EN_MASK_SHIFT)
@@ -1249,4 +1363,52 @@
 	(((reg_val) & ~GLB_ACK_CFG_ALLOC_EN_MASK) | (((value) << GLB_ACK_CFG_ALLOC_EN_SHIFT) & GLB_ACK_CFG_ALLOC_EN_MASK))
 /* End of GLB_OUTPUT_BLOCK register set definitions */
 
-#endif /* _GPU_CSF_REGISTERS_H_ */
+/* The following register and fields are for headers before 10.x.7/11.x.4 */
+#define GLB_REQ_IDLE_ENABLE_SHIFT (10)
+#define GLB_REQ_REQ_IDLE_ENABLE (1 << GLB_REQ_IDLE_ENABLE_SHIFT)
+#define GLB_REQ_REQ_IDLE_DISABLE (0 << GLB_REQ_IDLE_ENABLE_SHIFT)
+#define GLB_REQ_IDLE_ENABLE_MASK (0x1 << GLB_REQ_IDLE_ENABLE_SHIFT)
+#define GLB_REQ_IDLE_DISABLE_MASK (0x1 << GLB_REQ_IDLE_ENABLE_SHIFT)
+#define GLB_REQ_IDLE_EVENT_SHIFT (26)
+#define GLB_REQ_IDLE_EVENT_MASK (0x1 << GLB_REQ_IDLE_EVENT_SHIFT)
+#define GLB_ACK_IDLE_ENABLE_SHIFT (10)
+#define GLB_ACK_ACK_IDLE_ENABLE (1 << GLB_ACK_IDLE_ENABLE_SHIFT)
+#define GLB_ACK_ACK_IDLE_DISABLE (0 << GLB_ACK_IDLE_ENABLE_SHIFT)
+#define GLB_ACK_IDLE_ENABLE_MASK (0x1 << GLB_ACK_IDLE_ENABLE_SHIFT)
+#define GLB_ACK_IDLE_EVENT_SHIFT (26)
+#define GLB_ACK_IDLE_EVENT_MASK (0x1 << GLB_REQ_IDLE_EVENT_SHIFT)
+
+#define GLB_ACK_IRQ_MASK_IDLE_EVENT_SHIFT (26)
+#define GLB_ACK_IRQ_MASK_IDLE_EVENT_MASK (0x1 << GLB_ACK_IRQ_MASK_IDLE_EVENT_SHIFT)
+
+#define GLB_IDLE_TIMER (0x0080)
+/* GLB_IDLE_TIMER register */
+#define GLB_IDLE_TIMER_TIMEOUT_SHIFT (0)
+#define GLB_IDLE_TIMER_TIMEOUT_MASK ((0x7FFFFFFF) << GLB_IDLE_TIMER_TIMEOUT_SHIFT)
+#define GLB_IDLE_TIMER_TIMEOUT_GET(reg_val) (((reg_val)&GLB_IDLE_TIMER_TIMEOUT_MASK) >> GLB_IDLE_TIMER_TIMEOUT_SHIFT)
+#define GLB_IDLE_TIMER_TIMEOUT_SET(reg_val, value) \
+	(((reg_val) & ~GLB_IDLE_TIMER_TIMEOUT_MASK) |  \
+	 (((value) << GLB_IDLE_TIMER_TIMEOUT_SHIFT) & GLB_IDLE_TIMER_TIMEOUT_MASK))
+#define GLB_IDLE_TIMER_TIMER_SOURCE_SHIFT (31)
+#define GLB_IDLE_TIMER_TIMER_SOURCE_MASK ((0x1) << GLB_IDLE_TIMER_TIMER_SOURCE_SHIFT)
+#define GLB_IDLE_TIMER_TIMER_SOURCE_GET(reg_val) \
+	(((reg_val)&GLB_IDLE_TIMER_TIMER_SOURCE_MASK) >> GLB_IDLE_TIMER_TIMER_SOURCE_SHIFT)
+#define GLB_IDLE_TIMER_TIMER_SOURCE_SET(reg_val, value) \
+	(((reg_val) & ~GLB_IDLE_TIMER_TIMER_SOURCE_MASK) |  \
+	 (((value) << GLB_IDLE_TIMER_TIMER_SOURCE_SHIFT) & GLB_IDLE_TIMER_TIMER_SOURCE_MASK))
+/* GLB_IDLE_TIMER_TIMER_SOURCE values */
+#define GLB_IDLE_TIMER_TIMER_SOURCE_SYSTEM_TIMESTAMP 0x0
+#define GLB_IDLE_TIMER_TIMER_SOURCE_GPU_COUNTER 0x1
+/* End of GLB_IDLE_TIMER_TIMER_SOURCE values */
+
+#define CSG_STATUS_STATE (0x0018) /* CSG state status register */
+/* CSG_STATUS_STATE register */
+#define CSG_STATUS_STATE_IDLE_SHIFT (0)
+#define CSG_STATUS_STATE_IDLE_MASK ((0x1) << CSG_STATUS_STATE_IDLE_SHIFT)
+#define CSG_STATUS_STATE_IDLE_GET(reg_val) \
+	(((reg_val)&CSG_STATUS_STATE_IDLE_MASK) >> CSG_STATUS_STATE_IDLE_SHIFT)
+#define CSG_STATUS_STATE_IDLE_SET(reg_val, value) \
+	(((reg_val) & ~CSG_STATUS_STATE_IDLE_MASK) |  \
+	(((value) << CSG_STATUS_STATE_IDLE_SHIFT) & CSG_STATUS_STATE_IDLE_MASK))
+
+#endif /* _UAPI_GPU_CSF_REGISTERS_H_ */
diff --git a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_ioctl.h b/include/uapi/gpu/arm/bifrost/csf/mali_kbase_csf_ioctl.h
similarity index 61%
rename from drivers/gpu/arm/bifrost/csf/mali_kbase_csf_ioctl.h
rename to include/uapi/gpu/arm/bifrost/csf/mali_kbase_csf_ioctl.h
index e9bb8d299754..237cc2e98762 100644
--- a/drivers/gpu/arm/bifrost/csf/mali_kbase_csf_ioctl.h
+++ b/include/uapi/gpu/arm/bifrost/csf/mali_kbase_csf_ioctl.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-#ifndef _KBASE_CSF_IOCTL_H_
-#define _KBASE_CSF_IOCTL_H_
+#ifndef _UAPI_KBASE_CSF_IOCTL_H_
+#define _UAPI_KBASE_CSF_IOCTL_H_
 
 #include <asm-generic/ioctl.h>
 #include <linux/types.h>
@@ -29,10 +28,22 @@
 /*
  * 1.0:
  * - CSF IOCTL header separated from JM
+ * 1.1:
+ * - Add a new priority level BASE_QUEUE_GROUP_PRIORITY_REALTIME
+ * - Add ioctl 54: This controls the priority setting.
+ * 1.2:
+ * - Add new CSF GPU_FEATURES register into the property structure
+ *   returned by KBASE_IOCTL_GET_GPUPROPS
+ * 1.3:
+ * - Add __u32 group_uid member to
+ *   &struct_kbase_ioctl_cs_queue_group_create.out
+ * 1.4:
+ * - Replace padding in kbase_ioctl_cs_get_glb_iface with
+ *   instr_features member of same size
  */
 
 #define BASE_UK_VERSION_MAJOR 1
-#define BASE_UK_VERSION_MINOR 0
+#define BASE_UK_VERSION_MINOR 4
 
 /**
  * struct kbase_ioctl_version_check - Check version compatibility between
@@ -46,9 +57,6 @@ struct kbase_ioctl_version_check {
 	__u16 minor;
 };
 
-#define KBASE_IOCTL_VERSION_CHECK \
-	_IOWR(KBASE_IOCTL_TYPE, 52, struct kbase_ioctl_version_check)
-
 #define KBASE_IOCTL_VERSION_CHECK_RESERVED \
 	_IOWR(KBASE_IOCTL_TYPE, 0, struct kbase_ioctl_version_check)
 
@@ -88,16 +96,14 @@ struct kbase_ioctl_cs_queue_kick {
 /**
  * union kbase_ioctl_cs_queue_bind - Bind a GPU command queue to a group
  *
- * @buffer_gpu_addr: GPU address of the buffer backing the queue
- * @group_handle: Handle of the group to which the queue should be bound
- * @csi_index: Index of the CSF interface the queue should be bound to
- * @padding: Currently unused, must be zero
- * @mmap_handle: Handle to be used for creating the mapping of command stream
- *               input/output pages
- *
- * @in: Input parameters
- * @out: Output parameters
- *
+ * @in:                 Input parameters
+ * @in.buffer_gpu_addr: GPU address of the buffer backing the queue
+ * @in.group_handle:    Handle of the group to which the queue should be bound
+ * @in.csi_index:       Index of the CSF interface the queue should be bound to
+ * @in.padding:         Currently unused, must be zero
+ * @out:                Output parameters
+ * @out.mmap_handle:    Handle to be used for creating the mapping of CS
+ *                      input/output pages
  */
 union kbase_ioctl_cs_queue_bind {
 	struct {
@@ -130,24 +136,23 @@ struct kbase_ioctl_cs_queue_terminate {
 
 /**
  * union kbase_ioctl_cs_queue_group_create - Create a GPU command queue group
- *
- * @tiler_mask:		Mask of tiler endpoints the group is allowed to use.
- * @fragment_mask:	Mask of fragment endpoints the group is allowed to use.
- * @compute_mask:	Mask of compute endpoints the group is allowed to use.
- * @cs_min:		Minimum number of command streams required.
- * @priority:		Queue group's priority within a process.
- * @tiler_max:		Maximum number of tiler endpoints the group is allowed
- *			to use.
- * @fragment_max:	Maximum number of fragment endpoints the group is
- *			allowed to use.
- * @compute_max:	Maximum number of compute endpoints the group is allowed
- *			to use.
- * @padding:		Currently unused, must be zero
- * @group_handle:	Handle of a newly created queue group.
- *
- * @in: Input parameters
- * @out: Output parameters
- *
+ * @in:               Input parameters
+ * @in.tiler_mask:    Mask of tiler endpoints the group is allowed to use.
+ * @in.fragment_mask: Mask of fragment endpoints the group is allowed to use.
+ * @in.compute_mask:  Mask of compute endpoints the group is allowed to use.
+ * @in.cs_min:        Minimum number of CSs required.
+ * @in.priority:      Queue group's priority within a process.
+ * @in.tiler_max:     Maximum number of tiler endpoints the group is allowed
+ *                    to use.
+ * @in.fragment_max:  Maximum number of fragment endpoints the group is
+ *                    allowed to use.
+ * @in.compute_max:   Maximum number of compute endpoints the group is allowed
+ *                    to use.
+ * @in.padding:       Currently unused, must be zero
+ * @out:              Output parameters
+ * @out.group_handle: Handle of a newly created queue group.
+ * @out.padding:      Currently unused, must be zero
+ * @out.group_uid:    UID of the queue group available to base.
  */
 union kbase_ioctl_cs_queue_group_create {
 	struct {
@@ -164,7 +169,8 @@ union kbase_ioctl_cs_queue_group_create {
 	} in;
 	struct {
 		__u8 group_handle;
-		__u8 padding[7];
+		__u8 padding[3];
+		__u32 group_uid;
 	} out;
 };
 
@@ -238,23 +244,21 @@ struct kbase_ioctl_kcpu_queue_enqueue {
 
 /**
  * union kbase_ioctl_cs_tiler_heap_init - Initialize chunked tiler memory heap
- *
- * @chunk_size: Size of each chunk.
- * @initial_chunks: Initial number of chunks that heap will be created with.
- * @max_chunks: Maximum number of chunks that the heap is allowed to use.
- * @target_in_flight: Number of render-passes that the driver should attempt to
- *                    keep in flight for which allocation of new chunks is
- *                    allowed.
- * @group_id: Group ID to be used for physical allocations.
- * @gpu_heap_va: GPU VA (virtual address) of Heap context that was set up for
- *               the heap.
- * @first_chunk_va: GPU VA of the first chunk allocated for the heap, actually
- *                  points to the header of heap chunk and not to the low
- *                  address of free memory in the chunk.
- *
- * @in: Input parameters
- * @out: Output parameters
- *
+ * @in:                Input parameters
+ * @in.chunk_size:     Size of each chunk.
+ * @in.initial_chunks: Initial number of chunks that heap will be created with.
+ * @in.max_chunks:     Maximum number of chunks that the heap is allowed to use.
+ * @in.target_in_flight: Number of render-passes that the driver should attempt to
+ *                     keep in flight for which allocation of new chunks is
+ *                     allowed.
+ * @in.group_id:       Group ID to be used for physical allocations.
+ * @in.padding:        Padding
+ * @out:               Output parameters
+ * @out.gpu_heap_va:   GPU VA (virtual address) of Heap context that was set up
+ *                     for the heap.
+ * @out.first_chunk_va: GPU VA of the first chunk allocated for the heap,
+ *                     actually points to the header of heap chunk and not to
+ *                     the low address of free memory in the chunk.
  */
 union kbase_ioctl_cs_tiler_heap_init {
 	struct {
@@ -291,28 +295,25 @@ struct kbase_ioctl_cs_tiler_heap_term {
  * union kbase_ioctl_cs_get_glb_iface - Request the global control block
  *                                        of CSF interface capabilities
  *
- * @max_group_num:        The maximum number of groups to be read. Can be 0, in
- *                        which case groups_ptr is unused.
- * @max_total_stream_num: The maximum number of streams to be read. Can be 0, in
- *                        which case streams_ptr is unused.
- * @groups_ptr:       Pointer where to store all the group data (sequentially).
- * @streams_ptr:      Pointer where to store all the stream data (sequentially).
- * @glb_version:      Global interface version. Bits 31:16 hold the major
- *                    version number and 15:0 hold the minor version number.
- *                    A higher minor version is backwards-compatible with a
- *                    lower minor version for the same major version.
- * @features:         Bit mask of features (e.g. whether certain types of job
- *                    can be suspended).
- * @group_num:        Number of command stream groups supported.
- * @prfcnt_size:      Size of CSF performance counters, in bytes. Bits 31:16
- *                    hold the size of firmware performance counter data
- *                    and 15:0 hold the size of hardware performance counter
- *                    data.
- * @total_stream_num: Total number of command streams, summed across all groups.
- * @padding:          Will be zeroed.
- *
- * @in: Input parameters
- * @out: Output parameters
+ * @in:                    Input parameters
+ * @in.max_group_num:      The maximum number of groups to be read. Can be 0, in
+ *                         which case groups_ptr is unused.
+ * @in.max_total_stream    _num: The maximum number of CSs to be read. Can be 0, in
+ *                         which case streams_ptr is unused.
+ * @in.groups_ptr:         Pointer where to store all the group data (sequentially).
+ * @in.streams_ptr:        Pointer where to store all the CS data (sequentially).
+ * @out:                   Output parameters
+ * @out.glb_version:       Global interface version.
+ * @out.features:          Bit mask of features (e.g. whether certain types of job
+ *                         can be suspended).
+ * @out.group_num:         Number of CSGs supported.
+ * @out.prfcnt_size:       Size of CSF performance counters, in bytes. Bits 31:16
+ *                         hold the size of firmware performance counter data
+ *                         and 15:0 hold the size of hardware performance counter
+ *                         data.
+ * @out.total_stream_num:  Total number of CSs, summed across all groups.
+ * @out.instr_features:    Instrumentation features. Bits 7:4 hold the maximum
+ *                         size of events. Bits 3:0 hold the offset update rate.
  *
  */
 union kbase_ioctl_cs_get_glb_iface {
@@ -328,13 +329,24 @@ union kbase_ioctl_cs_get_glb_iface {
 		__u32 group_num;
 		__u32 prfcnt_size;
 		__u32 total_stream_num;
-		__u32 padding;
+		__u32 instr_features;
 	} out;
 };
 
 #define KBASE_IOCTL_CS_GET_GLB_IFACE \
 	_IOWR(KBASE_IOCTL_TYPE, 51, union kbase_ioctl_cs_get_glb_iface)
 
+struct kbase_ioctl_cs_cpu_queue_info {
+	__u64 buffer;
+	__u64 size;
+};
+
+#define KBASE_IOCTL_VERSION_CHECK \
+	_IOWR(KBASE_IOCTL_TYPE, 52, struct kbase_ioctl_version_check)
+
+#define KBASE_IOCTL_CS_CPU_QUEUE_DUMP \
+	_IOW(KBASE_IOCTL_TYPE, 53, struct kbase_ioctl_cs_cpu_queue_info)
+
 /***************
  * test ioctls *
  ***************/
@@ -357,12 +369,11 @@ struct kbase_ioctl_cs_event_memory_write {
 
 /**
  * union kbase_ioctl_cs_event_memory_read - Read an event memory address
- * @cpu_addr: Memory address to read
- * @value: Value read
- * @padding: Currently unused, must be zero
- *
  * @in: Input parameters
+ * @in.cpu_addr: Memory address to read
  * @out: Output parameters
+ * @out.value: Value read
+ * @out.padding: Currently unused, must be zero
  */
 union kbase_ioctl_cs_event_memory_read {
 	struct {
@@ -376,4 +387,4 @@ union kbase_ioctl_cs_event_memory_read {
 
 #endif /* MALI_UNIT_TEST */
 
-#endif /* _KBASE_CSF_IOCTL_H_ */
+#endif /* _UAPI_KBASE_CSF_IOCTL_H_ */
diff --git a/drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_regmap_csf.h b/include/uapi/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_regmap_csf.h
similarity index 78%
rename from drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_regmap_csf.h
rename to include/uapi/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_regmap_csf.h
index ff6e4ae47184..c87154fd6bd9 100644
--- a/drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_regmap_csf.h
+++ b/include/uapi/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_regmap_csf.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,20 +17,53 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-#ifndef _KBASE_GPU_REGMAP_CSF_H_
-#define _KBASE_GPU_REGMAP_CSF_H_
+#ifndef _UAPI_KBASE_GPU_REGMAP_CSF_H_
+#define _UAPI_KBASE_GPU_REGMAP_CSF_H_
+
+#include <linux/types.h>
 
-#if !MALI_USE_CSF
+#if !MALI_USE_CSF && defined(__KERNEL__)
 #error "Cannot be compiled with JM"
 #endif
 
-#include "csf/mali_gpu_csf_control_registers.h"
-#define GPU_CONTROL_MCU_REG(r)  (GPU_CONTROL_MCU + (r))
+/* IPA control registers */
+
+#define IPA_CONTROL_BASE       0x40000
+#define IPA_CONTROL_REG(r)     (IPA_CONTROL_BASE+(r))
+#define COMMAND                0x000 /* (WO) Command register */
+#define STATUS                 0x004 /* (RO) Status register */
+#define TIMER                  0x008 /* (RW) Timer control register */
+
+#define SELECT_CSHW_LO         0x010 /* (RW) Counter select for CS hardware, low word */
+#define SELECT_CSHW_HI         0x014 /* (RW) Counter select for CS hardware, high word */
+#define SELECT_MEMSYS_LO       0x018 /* (RW) Counter select for Memory system, low word */
+#define SELECT_MEMSYS_HI       0x01C /* (RW) Counter select for Memory system, high word */
+#define SELECT_TILER_LO        0x020 /* (RW) Counter select for Tiler cores, low word */
+#define SELECT_TILER_HI        0x024 /* (RW) Counter select for Tiler cores, high word */
+#define SELECT_SHADER_LO       0x028 /* (RW) Counter select for Shader cores, low word */
+#define SELECT_SHADER_HI       0x02C /* (RW) Counter select for Shader cores, high word */
+
+/* Accumulated counter values for CS hardware */
+#define VALUE_CSHW_BASE        0x100
+#define VALUE_CSHW_REG_LO(n)   (VALUE_CSHW_BASE + ((n) << 3))       /* (RO) Counter value #n, low word */
+#define VALUE_CSHW_REG_HI(n)   (VALUE_CSHW_BASE + ((n) << 3) + 4)   /* (RO) Counter value #n, high word */
 
+/* Accumulated counter values for memory system */
+#define VALUE_MEMSYS_BASE      0x140
+#define VALUE_MEMSYS_REG_LO(n) (VALUE_MEMSYS_BASE + ((n) << 3))     /* (RO) Counter value #n, low word */
+#define VALUE_MEMSYS_REG_HI(n) (VALUE_MEMSYS_BASE + ((n) << 3) + 4) /* (RO) Counter value #n, high word */
+
+#define VALUE_TILER_BASE       0x180
+#define VALUE_TILER_REG_LO(n)  (VALUE_TILER_BASE + ((n) << 3))      /* (RO) Counter value #n, low word */
+#define VALUE_TILER_REG_HI(n)  (VALUE_TILER_BASE + ((n) << 3) + 4)  /* (RO) Counter value #n, high word */
+
+#define VALUE_SHADER_BASE      0x1C0
+#define VALUE_SHADER_REG_LO(n) (VALUE_SHADER_BASE + ((n) << 3))     /* (RO) Counter value #n, low word */
+#define VALUE_SHADER_REG_HI(n) (VALUE_SHADER_BASE + ((n) << 3) + 4) /* (RO) Counter value #n, high word */
+
+#include "../../csf/mali_gpu_csf_control_registers.h"
 
 /* Set to implementation defined, outer caching */
 #define AS_MEMATTR_AARCH64_OUTER_IMPL_DEF 0x88ull
@@ -68,13 +102,14 @@
 /* Normal memory, shared between MCU and Host */
 #define AS_MEMATTR_INDEX_SHARED                6
 
-/* Configuration bits for the Command Stream Frontend. */
+/* Configuration bits for the CSF. */
 #define CSF_CONFIG 0xF00
 
 /* CSF_CONFIG register */
 #define CSF_CONFIG_FORCE_COHERENCY_FEATURES_SHIFT 2
 
 /* GPU control registers */
+#define CORE_FEATURES           0x008   /* () Shader Core Features */
 #define MCU_CONTROL             0x700
 #define MCU_STATUS              0x704
 
@@ -95,7 +130,7 @@
 				 */
 
 #define PRFCNT_CSHW_EN   0x06C  /* (RW) Performance counter
-				 * enable for Command Stream Hardware
+				 * enable for CS Hardware
 				 */
 
 #define PRFCNT_SHADER_EN 0x070  /* (RW) Performance counter enable
@@ -128,7 +163,7 @@
  */
 #define GPU_COMMAND_RESET_PAYLOAD_FAST_RESET 0x00
 
-/* This will leave the state of active command streams UNDEFINED, but will leave the external bus in a defined and
+/* This will leave the state of active CSs UNDEFINED, but will leave the external bus in a defined and
  * idle state.
  */
 #define GPU_COMMAND_RESET_PAYLOAD_SOFT_RESET 0x01
@@ -154,7 +189,7 @@
 
 /* GPU_COMMAND command + payload */
 #define GPU_COMMAND_CODE_PAYLOAD(opcode, payload) \
-	((u32)opcode | ((u32)payload << 8))
+	((__u32)opcode | ((__u32)payload << 8))
 
 /* Final GPU_COMMAND form */
 /* No operation, nothing happens */
@@ -245,9 +280,12 @@
 #define GPU_FAULTSTATUS_ACCESS_TYPE_WRITE 0x3
 /* End of GPU_FAULTSTATUS_ACCESS_TYPE values */
 
-/* TODO: Remove once 10.x.6 headers became available */
-#define GPU_EXCEPTION_TYPE_SW_FAULT_0 ((u8)0x70)
-#define GPU_EXCEPTION_TYPE_SW_FAULT_1 ((u8)0x71)
+/* Implementation-dependent exception codes used to indicate CSG
+ * and CS errors that are not specified in the specs.
+ */
+#define GPU_EXCEPTION_TYPE_SW_FAULT_0 ((__u8)0x70)
+#define GPU_EXCEPTION_TYPE_SW_FAULT_1 ((__u8)0x71)
+#define GPU_EXCEPTION_TYPE_SW_FAULT_2 ((__u8)0x72)
 
 /* GPU_FAULTSTATUS_EXCEPTION_TYPE values */
 #define GPU_FAULTSTATUS_EXCEPTION_TYPE_OK 0x00
@@ -294,4 +332,4 @@
 /* GPU_CONTROL_MCU.GPU_IRQ_RAWSTAT */
 #define PRFCNT_SAMPLE_COMPLETED (1 << 16)   /* Set when performance count sample has completed */
 
-#endif /* _KBASE_GPU_REGMAP_CSF_H_ */
+#endif /* _UAPI_KBASE_GPU_REGMAP_CSF_H_ */
diff --git a/drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_regmap_jm.h b/include/uapi/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_regmap_jm.h
similarity index 97%
rename from drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_regmap_jm.h
rename to include/uapi/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_regmap_jm.h
index c9c2fbd49058..19826683adf2 100644
--- a/drivers/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_regmap_jm.h
+++ b/include/uapi/gpu/arm/bifrost/gpu/backend/mali_kbase_gpu_regmap_jm.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2019-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,14 +17,12 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-#ifndef _KBASE_GPU_REGMAP_JM_H_
-#define _KBASE_GPU_REGMAP_JM_H_
+#ifndef _UAPI_KBASE_GPU_REGMAP_JM_H_
+#define _UAPI_KBASE_GPU_REGMAP_JM_H_
 
-#if MALI_USE_CSF
+#if MALI_USE_CSF && defined(__KERNEL__)
 #error "Cannot be compiled with CSF"
 #endif
 
@@ -139,8 +138,8 @@
 #define JS_AFFINITY_LO         0x10	/* (RO) Core affinity mask for job slot n, low word */
 #define JS_AFFINITY_HI         0x14	/* (RO) Core affinity mask for job slot n, high word */
 #define JS_CONFIG              0x18	/* (RO) Configuration settings for job slot n */
-#define JS_XAFFINITY           0x1C	/* (RO) Extended affinity mask for job
-					   slot n */
+/* (RO) Extended affinity mask for job slot n*/
+#define JS_XAFFINITY           0x1C
 
 #define JS_COMMAND             0x20	/* (WO) Command register for job slot n */
 #define JS_STATUS              0x24	/* (RO) Status register for job slot n */
@@ -151,8 +150,8 @@
 #define JS_AFFINITY_NEXT_LO    0x50	/* (RW) Next core affinity mask for job slot n, low word */
 #define JS_AFFINITY_NEXT_HI    0x54	/* (RW) Next core affinity mask for job slot n, high word */
 #define JS_CONFIG_NEXT         0x58	/* (RW) Next configuration settings for job slot n */
-#define JS_XAFFINITY_NEXT      0x5C	/* (RW) Next extended affinity mask for
-					   job slot n */
+/* (RW) Next extended affinity mask for job slot n */
+#define JS_XAFFINITY_NEXT      0x5C
 
 #define JS_COMMAND_NEXT        0x60	/* (RW) Next command register for job slot n */
 
@@ -285,4 +284,4 @@
 #define GPU_IRQ_REG_COMMON (GPU_FAULT | MULTIPLE_GPU_FAULTS | RESET_COMPLETED \
 		| POWER_CHANGED_ALL | PRFCNT_SAMPLE_COMPLETED)
 
-#endif /* _KBASE_GPU_REGMAP_JM_H_ */
+#endif /* _UAPI_KBASE_GPU_REGMAP_JM_H_ */
diff --git a/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_coherency.h b/include/uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_coherency.h
similarity index 77%
rename from drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_coherency.h
rename to include/uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_coherency.h
index bb2b1613aa47..98186d21a5e3 100644
--- a/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_coherency.h
+++ b/include/uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_coherency.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2015-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2015-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,16 +17,14 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-#ifndef _KBASE_GPU_COHERENCY_H_
-#define _KBASE_GPU_COHERENCY_H_
+#ifndef _UAPI_KBASE_GPU_COHERENCY_H_
+#define _UAPI_KBASE_GPU_COHERENCY_H_
 
 #define COHERENCY_ACE_LITE 0
 #define COHERENCY_ACE      1
 #define COHERENCY_NONE     31
 #define COHERENCY_FEATURE_BIT(x) (1 << (x))
 
-#endif /* _KBASE_GPU_COHERENCY_H_ */
+#endif /* _UAPI_KBASE_GPU_COHERENCY_H_ */
diff --git a/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_id.h b/include/uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_id.h
similarity index 72%
rename from drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_id.h
rename to include/uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_id.h
index 31d55264c67f..0145920bce1a 100644
--- a/drivers/gpu/arm/bifrost/gpu/mali_kbase_gpu_id.h
+++ b/include/uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_id.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2015-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2015-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,12 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-#ifndef _KBASE_GPU_ID_H_
-#define _KBASE_GPU_ID_H_
+#ifndef _UAPI_KBASE_GPU_ID_H_
+#define _UAPI_KBASE_GPU_ID_H_
+
+#include <linux/types.h>
 
 /* GPU_ID register */
 #define GPU_ID_VERSION_STATUS_SHIFT       0
@@ -53,19 +54,21 @@
 								GPU_ID2_VERSION_STATUS)
 
 /* Helper macro to create a partial GPU_ID (new format) that defines
-   a product ignoring its version. */
+ * a product ignoring its version.
+ */
 #define GPU_ID2_PRODUCT_MAKE(arch_major, arch_minor, arch_rev, product_major) \
-		((((u32)arch_major) << GPU_ID2_ARCH_MAJOR_SHIFT)  | \
-		 (((u32)arch_minor) << GPU_ID2_ARCH_MINOR_SHIFT)  | \
-		 (((u32)arch_rev) << GPU_ID2_ARCH_REV_SHIFT)      | \
-		 (((u32)product_major) << GPU_ID2_PRODUCT_MAJOR_SHIFT))
+		((((__u32)arch_major) << GPU_ID2_ARCH_MAJOR_SHIFT)  | \
+		 (((__u32)arch_minor) << GPU_ID2_ARCH_MINOR_SHIFT)  | \
+		 (((__u32)arch_rev) << GPU_ID2_ARCH_REV_SHIFT)      | \
+		 (((__u32)product_major) << GPU_ID2_PRODUCT_MAJOR_SHIFT))
 
 /* Helper macro to create a partial GPU_ID (new format) that specifies the
-   revision (major, minor, status) of a product */
+ * revision (major, minor, status) of a product
+ */
 #define GPU_ID2_VERSION_MAKE(version_major, version_minor, version_status) \
-		((((u32)version_major) << GPU_ID2_VERSION_MAJOR_SHIFT)  | \
-		 (((u32)version_minor) << GPU_ID2_VERSION_MINOR_SHIFT)  | \
-		 (((u32)version_status) << GPU_ID2_VERSION_STATUS_SHIFT))
+		((((__u32)version_major) << GPU_ID2_VERSION_MAJOR_SHIFT)  | \
+		 (((__u32)version_minor) << GPU_ID2_VERSION_MINOR_SHIFT)  | \
+		 (((__u32)version_status) << GPU_ID2_VERSION_STATUS_SHIFT))
 
 /* Helper macro to create a complete GPU_ID (new format) */
 #define GPU_ID2_MAKE(arch_major, arch_minor, arch_rev, product_major, \
@@ -76,16 +79,18 @@
 			version_status))
 
 /* Helper macro to create a partial GPU_ID (new format) that identifies
-   a particular GPU model by its arch_major and product_major. */
+ * a particular GPU model by its arch_major and product_major.
+ */
 #define GPU_ID2_MODEL_MAKE(arch_major, product_major) \
-		((((u32)arch_major) << GPU_ID2_ARCH_MAJOR_SHIFT)  | \
-		(((u32)product_major) << GPU_ID2_PRODUCT_MAJOR_SHIFT))
+		((((__u32)arch_major) << GPU_ID2_ARCH_MAJOR_SHIFT)  | \
+		(((__u32)product_major) << GPU_ID2_PRODUCT_MAJOR_SHIFT))
 
 /* Strip off the non-relevant bits from a product_id value and make it suitable
-   for comparison against the GPU_ID2_PRODUCT_xxx values which identify a GPU
-   model. */
+ * for comparison against the GPU_ID2_PRODUCT_xxx values which identify a GPU
+ * model.
+ */
 #define GPU_ID2_MODEL_MATCH_VALUE(product_id) \
-		((((u32)product_id) << GPU_ID2_PRODUCT_MAJOR_SHIFT) & \
+		((((__u32)product_id) << GPU_ID2_PRODUCT_MAJOR_SHIFT) & \
 		    GPU_ID2_PRODUCT_MODEL)
 
 #define GPU_ID2_PRODUCT_TMIX              GPU_ID2_MODEL_MAKE(6, 0)
@@ -101,19 +106,15 @@
 #define GPU_ID2_PRODUCT_TBAX              GPU_ID2_MODEL_MAKE(9, 5)
 #define GPU_ID2_PRODUCT_TDUX              GPU_ID2_MODEL_MAKE(10, 1)
 #define GPU_ID2_PRODUCT_TODX              GPU_ID2_MODEL_MAKE(10, 2)
-#define GPU_ID2_PRODUCT_TGRX              GPU_ID2_MODEL_MAKE(10, 3)
-#define GPU_ID2_PRODUCT_TVAX              GPU_ID2_MODEL_MAKE(10, 4)
 #define GPU_ID2_PRODUCT_LODX              GPU_ID2_MODEL_MAKE(10, 7)
-#define GPU_ID2_PRODUCT_TTUX              GPU_ID2_MODEL_MAKE(11, 2)
-#define GPU_ID2_PRODUCT_LTUX              GPU_ID2_MODEL_MAKE(11, 3)
-#define GPU_ID2_PRODUCT_TE2X              GPU_ID2_MODEL_MAKE(11, 1)
 
 /* Helper macro to create a GPU_ID assuming valid values for id, major,
-   minor, status */
+ * minor, status
+ */
 #define GPU_ID_MAKE(id, major, minor, status) \
-		((((u32)id) << GPU_ID_VERSION_PRODUCT_ID_SHIFT) | \
-		(((u32)major) << GPU_ID_VERSION_MAJOR_SHIFT) |   \
-		(((u32)minor) << GPU_ID_VERSION_MINOR_SHIFT) |   \
-		(((u32)status) << GPU_ID_VERSION_STATUS_SHIFT))
+		((((__u32)id) << GPU_ID_VERSION_PRODUCT_ID_SHIFT) | \
+		(((__u32)major) << GPU_ID_VERSION_MAJOR_SHIFT) |   \
+		(((__u32)minor) << GPU_ID_VERSION_MINOR_SHIFT) |   \
+		(((__u32)status) << GPU_ID_VERSION_STATUS_SHIFT))
 
-#endif /* _KBASE_GPU_ID_H_ */
+#endif /* _UAPI_KBASE_GPU_ID_H_ */
diff --git a/include/uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_regmap.h b/include/uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_regmap.h
new file mode 100644
index 000000000000..9977212ad615
--- /dev/null
+++ b/include/uapi/gpu/arm/bifrost/gpu/mali_kbase_gpu_regmap.h
@@ -0,0 +1,424 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ *
+ * (C) COPYRIGHT 2021 ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU license.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you can access it online at
+ * http://www.gnu.org/licenses/gpl-2.0.html.
+ *
+ */
+
+#ifndef _UAPI_KBASE_GPU_REGMAP_H_
+#define _UAPI_KBASE_GPU_REGMAP_H_
+
+#include "mali_kbase_gpu_coherency.h"
+#include "mali_kbase_gpu_id.h"
+#if MALI_USE_CSF
+#include "backend/mali_kbase_gpu_regmap_csf.h"
+#else
+#include "backend/mali_kbase_gpu_regmap_jm.h"
+#endif
+
+/* Begin Register Offsets */
+/* GPU control registers */
+
+#define GPU_CONTROL_BASE        0x0000
+#define GPU_CONTROL_REG(r)      (GPU_CONTROL_BASE + (r))
+#define GPU_ID                  0x000   /* (RO) GPU and revision identifier */
+#define L2_FEATURES             0x004   /* (RO) Level 2 cache features */
+#define TILER_FEATURES          0x00C   /* (RO) Tiler Features */
+#define MEM_FEATURES            0x010   /* (RO) Memory system features */
+#define MMU_FEATURES            0x014   /* (RO) MMU features */
+#define AS_PRESENT              0x018   /* (RO) Address space slots present */
+#define GPU_IRQ_RAWSTAT         0x020   /* (RW) */
+#define GPU_IRQ_CLEAR           0x024   /* (WO) */
+#define GPU_IRQ_MASK            0x028   /* (RW) */
+#define GPU_IRQ_STATUS          0x02C   /* (RO) */
+
+#define GPU_COMMAND             0x030   /* (WO) */
+#define GPU_STATUS              0x034   /* (RO) */
+
+#define GPU_DBGEN               (1 << 8)    /* DBGEN wire status */
+
+#define GPU_FAULTSTATUS         0x03C   /* (RO) GPU exception type and fault status */
+#define GPU_FAULTADDRESS_LO     0x040   /* (RO) GPU exception fault address, low word */
+#define GPU_FAULTADDRESS_HI     0x044   /* (RO) GPU exception fault address, high word */
+
+#define L2_CONFIG               0x048   /* (RW) Level 2 cache configuration */
+
+#define GROUPS_L2_COHERENT      (1 << 0) /* Cores groups are l2 coherent */
+#define SUPER_L2_COHERENT       (1 << 1) /* Shader cores within a core
+					  * supergroup are l2 coherent
+					  */
+
+#define PWR_KEY                 0x050   /* (WO) Power manager key register */
+#define PWR_OVERRIDE0           0x054   /* (RW) Power manager override settings */
+#define PWR_OVERRIDE1           0x058   /* (RW) Power manager override settings */
+#define GPU_FEATURES_LO         0x060   /* (RO) GPU features, low word */
+#define GPU_FEATURES_HI         0x064   /* (RO) GPU features, high word */
+#define CYCLE_COUNT_LO          0x090   /* (RO) Cycle counter, low word */
+#define CYCLE_COUNT_HI          0x094   /* (RO) Cycle counter, high word */
+#define TIMESTAMP_LO            0x098   /* (RO) Global time stamp counter, low word */
+#define TIMESTAMP_HI            0x09C   /* (RO) Global time stamp counter, high word */
+
+#define THREAD_MAX_THREADS      0x0A0   /* (RO) Maximum number of threads per core */
+#define THREAD_MAX_WORKGROUP_SIZE 0x0A4 /* (RO) Maximum workgroup size */
+#define THREAD_MAX_BARRIER_SIZE 0x0A8   /* (RO) Maximum threads waiting at a barrier */
+#define THREAD_FEATURES         0x0AC   /* (RO) Thread features */
+#define THREAD_TLS_ALLOC        0x310   /* (RO) Number of threads per core that TLS must be allocated for */
+
+#define TEXTURE_FEATURES_0      0x0B0   /* (RO) Support flags for indexed texture formats 0..31 */
+#define TEXTURE_FEATURES_1      0x0B4   /* (RO) Support flags for indexed texture formats 32..63 */
+#define TEXTURE_FEATURES_2      0x0B8   /* (RO) Support flags for indexed texture formats 64..95 */
+#define TEXTURE_FEATURES_3      0x0BC   /* (RO) Support flags for texture order */
+
+#define TEXTURE_FEATURES_REG(n) GPU_CONTROL_REG(TEXTURE_FEATURES_0 + ((n) << 2))
+
+#define SHADER_PRESENT_LO       0x100   /* (RO) Shader core present bitmap, low word */
+#define SHADER_PRESENT_HI       0x104   /* (RO) Shader core present bitmap, high word */
+
+#define TILER_PRESENT_LO        0x110   /* (RO) Tiler core present bitmap, low word */
+#define TILER_PRESENT_HI        0x114   /* (RO) Tiler core present bitmap, high word */
+
+#define L2_PRESENT_LO           0x120   /* (RO) Level 2 cache present bitmap, low word */
+#define L2_PRESENT_HI           0x124   /* (RO) Level 2 cache present bitmap, high word */
+
+#define STACK_PRESENT_LO        0xE00   /* (RO) Core stack present bitmap, low word */
+#define STACK_PRESENT_HI        0xE04   /* (RO) Core stack present bitmap, high word */
+
+#define SHADER_READY_LO         0x140   /* (RO) Shader core ready bitmap, low word */
+#define SHADER_READY_HI         0x144   /* (RO) Shader core ready bitmap, high word */
+
+#define TILER_READY_LO          0x150   /* (RO) Tiler core ready bitmap, low word */
+#define TILER_READY_HI          0x154   /* (RO) Tiler core ready bitmap, high word */
+
+#define L2_READY_LO             0x160   /* (RO) Level 2 cache ready bitmap, low word */
+#define L2_READY_HI             0x164   /* (RO) Level 2 cache ready bitmap, high word */
+
+#define STACK_READY_LO          0xE10   /* (RO) Core stack ready bitmap, low word */
+#define STACK_READY_HI          0xE14   /* (RO) Core stack ready bitmap, high word */
+
+#define SHADER_PWRON_LO         0x180   /* (WO) Shader core power on bitmap, low word */
+#define SHADER_PWRON_HI         0x184   /* (WO) Shader core power on bitmap, high word */
+
+#define TILER_PWRON_LO          0x190   /* (WO) Tiler core power on bitmap, low word */
+#define TILER_PWRON_HI          0x194   /* (WO) Tiler core power on bitmap, high word */
+
+#define L2_PWRON_LO             0x1A0   /* (WO) Level 2 cache power on bitmap, low word */
+#define L2_PWRON_HI             0x1A4   /* (WO) Level 2 cache power on bitmap, high word */
+
+#define STACK_PWRON_LO          0xE20   /* (RO) Core stack power on bitmap, low word */
+#define STACK_PWRON_HI          0xE24   /* (RO) Core stack power on bitmap, high word */
+
+#define SHADER_PWROFF_LO        0x1C0   /* (WO) Shader core power off bitmap, low word */
+#define SHADER_PWROFF_HI        0x1C4   /* (WO) Shader core power off bitmap, high word */
+
+#define TILER_PWROFF_LO         0x1D0   /* (WO) Tiler core power off bitmap, low word */
+#define TILER_PWROFF_HI         0x1D4   /* (WO) Tiler core power off bitmap, high word */
+
+#define L2_PWROFF_LO            0x1E0   /* (WO) Level 2 cache power off bitmap, low word */
+#define L2_PWROFF_HI            0x1E4   /* (WO) Level 2 cache power off bitmap, high word */
+
+#define STACK_PWROFF_LO         0xE30   /* (RO) Core stack power off bitmap, low word */
+#define STACK_PWROFF_HI         0xE34   /* (RO) Core stack power off bitmap, high word */
+
+#define SHADER_PWRTRANS_LO      0x200   /* (RO) Shader core power transition bitmap, low word */
+#define SHADER_PWRTRANS_HI      0x204   /* (RO) Shader core power transition bitmap, high word */
+
+#define TILER_PWRTRANS_LO       0x210   /* (RO) Tiler core power transition bitmap, low word */
+#define TILER_PWRTRANS_HI       0x214   /* (RO) Tiler core power transition bitmap, high word */
+
+#define L2_PWRTRANS_LO          0x220   /* (RO) Level 2 cache power transition bitmap, low word */
+#define L2_PWRTRANS_HI          0x224   /* (RO) Level 2 cache power transition bitmap, high word */
+
+#define ASN_HASH_0              0x02C0 /* (RW) ASN hash function argument 0 */
+#define ASN_HASH(n)             (ASN_HASH_0 + (n)*4)
+#define ASN_HASH_COUNT          3
+
+#define STACK_PWRTRANS_LO       0xE40   /* (RO) Core stack power transition bitmap, low word */
+#define STACK_PWRTRANS_HI       0xE44   /* (RO) Core stack power transition bitmap, high word */
+
+#define SHADER_PWRACTIVE_LO     0x240   /* (RO) Shader core active bitmap, low word */
+#define SHADER_PWRACTIVE_HI     0x244   /* (RO) Shader core active bitmap, high word */
+
+#define TILER_PWRACTIVE_LO      0x250   /* (RO) Tiler core active bitmap, low word */
+#define TILER_PWRACTIVE_HI      0x254   /* (RO) Tiler core active bitmap, high word */
+
+#define L2_PWRACTIVE_LO         0x260   /* (RO) Level 2 cache active bitmap, low word */
+#define L2_PWRACTIVE_HI         0x264   /* (RO) Level 2 cache active bitmap, high word */
+
+#define COHERENCY_FEATURES      0x300   /* (RO) Coherency features present */
+#define COHERENCY_ENABLE        0x304   /* (RW) Coherency enable */
+
+#define SHADER_CONFIG           0xF04   /* (RW) Shader core configuration (implementation-specific) */
+#define TILER_CONFIG            0xF08   /* (RW) Tiler core configuration (implementation-specific) */
+#define L2_MMU_CONFIG           0xF0C   /* (RW) L2 cache and MMU configuration (implementation-specific) */
+
+/* Job control registers */
+
+#define JOB_CONTROL_BASE        0x1000
+
+#define JOB_CONTROL_REG(r)      (JOB_CONTROL_BASE + (r))
+
+#define JOB_IRQ_RAWSTAT         0x000   /* Raw interrupt status register */
+#define JOB_IRQ_CLEAR           0x004   /* Interrupt clear register */
+#define JOB_IRQ_MASK            0x008   /* Interrupt mask register */
+#define JOB_IRQ_STATUS          0x00C   /* Interrupt status register */
+
+/* MMU control registers */
+
+#define MEMORY_MANAGEMENT_BASE  0x2000
+#define MMU_REG(r)              (MEMORY_MANAGEMENT_BASE + (r))
+
+#define MMU_IRQ_RAWSTAT         0x000   /* (RW) Raw interrupt status register */
+#define MMU_IRQ_CLEAR           0x004   /* (WO) Interrupt clear register */
+#define MMU_IRQ_MASK            0x008   /* (RW) Interrupt mask register */
+#define MMU_IRQ_STATUS          0x00C   /* (RO) Interrupt status register */
+
+#define MMU_AS0                 0x400   /* Configuration registers for address space 0 */
+#define MMU_AS1                 0x440   /* Configuration registers for address space 1 */
+#define MMU_AS2                 0x480   /* Configuration registers for address space 2 */
+#define MMU_AS3                 0x4C0   /* Configuration registers for address space 3 */
+#define MMU_AS4                 0x500   /* Configuration registers for address space 4 */
+#define MMU_AS5                 0x540   /* Configuration registers for address space 5 */
+#define MMU_AS6                 0x580   /* Configuration registers for address space 6 */
+#define MMU_AS7                 0x5C0   /* Configuration registers for address space 7 */
+#define MMU_AS8                 0x600   /* Configuration registers for address space 8 */
+#define MMU_AS9                 0x640   /* Configuration registers for address space 9 */
+#define MMU_AS10                0x680   /* Configuration registers for address space 10 */
+#define MMU_AS11                0x6C0   /* Configuration registers for address space 11 */
+#define MMU_AS12                0x700   /* Configuration registers for address space 12 */
+#define MMU_AS13                0x740   /* Configuration registers for address space 13 */
+#define MMU_AS14                0x780   /* Configuration registers for address space 14 */
+#define MMU_AS15                0x7C0   /* Configuration registers for address space 15 */
+
+/* MMU address space control registers */
+
+#define MMU_AS_REG(n, r)        (MMU_REG(MMU_AS0 + ((n) << 6)) + (r))
+
+#define AS_TRANSTAB_LO         0x00	/* (RW) Translation Table Base Address for address space n, low word */
+#define AS_TRANSTAB_HI         0x04	/* (RW) Translation Table Base Address for address space n, high word */
+#define AS_MEMATTR_LO          0x08	/* (RW) Memory attributes for address space n, low word. */
+#define AS_MEMATTR_HI          0x0C	/* (RW) Memory attributes for address space n, high word. */
+#define AS_LOCKADDR_LO         0x10	/* (RW) Lock region address for address space n, low word */
+#define AS_LOCKADDR_HI         0x14	/* (RW) Lock region address for address space n, high word */
+#define AS_COMMAND             0x18	/* (WO) MMU command register for address space n */
+#define AS_FAULTSTATUS         0x1C	/* (RO) MMU fault status register for address space n */
+#define AS_FAULTADDRESS_LO     0x20	/* (RO) Fault Address for address space n, low word */
+#define AS_FAULTADDRESS_HI     0x24	/* (RO) Fault Address for address space n, high word */
+#define AS_STATUS              0x28	/* (RO) Status flags for address space n */
+
+/* (RW) Translation table configuration for address space n, low word */
+#define AS_TRANSCFG_LO         0x30
+/* (RW) Translation table configuration for address space n, high word */
+#define AS_TRANSCFG_HI         0x34
+/* (RO) Secondary fault address for address space n, low word */
+#define AS_FAULTEXTRA_LO       0x38
+/* (RO) Secondary fault address for address space n, high word */
+#define AS_FAULTEXTRA_HI       0x3C
+
+/* End Register Offsets */
+
+#define GPU_IRQ_REG_ALL (GPU_IRQ_REG_COMMON)
+
+/*
+ * MMU_IRQ_RAWSTAT register values. Values are valid also for
+ * MMU_IRQ_CLEAR, MMU_IRQ_MASK, MMU_IRQ_STATUS registers.
+ */
+
+#define MMU_PAGE_FAULT_FLAGS    16
+
+/* Macros returning a bitmask to retrieve page fault or bus error flags from
+ * MMU registers
+ */
+#define MMU_PAGE_FAULT(n)       (1UL << (n))
+#define MMU_BUS_ERROR(n)        (1UL << ((n) + MMU_PAGE_FAULT_FLAGS))
+
+/*
+ * Begin AARCH64 MMU TRANSTAB register values
+ */
+#define MMU_HW_OUTA_BITS 40
+#define AS_TRANSTAB_BASE_MASK ((1ULL << MMU_HW_OUTA_BITS) - (1ULL << 4))
+
+/*
+ * Begin MMU STATUS register values
+ */
+#define AS_STATUS_AS_ACTIVE 0x01
+
+#define AS_FAULTSTATUS_EXCEPTION_CODE_MASK                      (0x7<<3)
+#define AS_FAULTSTATUS_EXCEPTION_CODE_TRANSLATION_FAULT         (0x0<<3)
+#define AS_FAULTSTATUS_EXCEPTION_CODE_PERMISSION_FAULT          (0x1<<3)
+#define AS_FAULTSTATUS_EXCEPTION_CODE_TRANSTAB_BUS_FAULT        (0x2<<3)
+#define AS_FAULTSTATUS_EXCEPTION_CODE_ACCESS_FLAG               (0x3<<3)
+#define AS_FAULTSTATUS_EXCEPTION_CODE_ADDRESS_SIZE_FAULT        (0x4<<3)
+#define AS_FAULTSTATUS_EXCEPTION_CODE_MEMORY_ATTRIBUTES_FAULT   (0x5<<3)
+
+#define AS_FAULTSTATUS_EXCEPTION_TYPE_SHIFT 0
+#define AS_FAULTSTATUS_EXCEPTION_TYPE_MASK (0xFF << AS_FAULTSTATUS_EXCEPTION_TYPE_SHIFT)
+#define AS_FAULTSTATUS_EXCEPTION_TYPE_GET(reg_val) \
+	(((reg_val)&AS_FAULTSTATUS_EXCEPTION_TYPE_MASK) >> AS_FAULTSTATUS_EXCEPTION_TYPE_SHIFT)
+#define AS_FAULTSTATUS_EXCEPTION_TYPE_TRANSLATION_FAULT_0 0xC0
+
+#define AS_FAULTSTATUS_ACCESS_TYPE_SHIFT 8
+#define AS_FAULTSTATUS_ACCESS_TYPE_MASK (0x3 << AS_FAULTSTATUS_ACCESS_TYPE_SHIFT)
+#define AS_FAULTSTATUS_ACCESS_TYPE_GET(reg_val) \
+	(((reg_val)&AS_FAULTSTATUS_ACCESS_TYPE_MASK) >> AS_FAULTSTATUS_ACCESS_TYPE_SHIFT)
+
+#define AS_FAULTSTATUS_ACCESS_TYPE_ATOMIC       (0x0)
+#define AS_FAULTSTATUS_ACCESS_TYPE_EX           (0x1)
+#define AS_FAULTSTATUS_ACCESS_TYPE_READ         (0x2)
+#define AS_FAULTSTATUS_ACCESS_TYPE_WRITE        (0x3)
+
+#define AS_FAULTSTATUS_SOURCE_ID_SHIFT 16
+#define AS_FAULTSTATUS_SOURCE_ID_MASK (0xFFFF << AS_FAULTSTATUS_SOURCE_ID_SHIFT)
+#define AS_FAULTSTATUS_SOURCE_ID_GET(reg_val) \
+	(((reg_val)&AS_FAULTSTATUS_SOURCE_ID_MASK) >> AS_FAULTSTATUS_SOURCE_ID_SHIFT)
+
+/*
+ * Begin MMU TRANSCFG register values
+ */
+#define AS_TRANSCFG_ADRMODE_LEGACY      0
+#define AS_TRANSCFG_ADRMODE_UNMAPPED    1
+#define AS_TRANSCFG_ADRMODE_IDENTITY    2
+#define AS_TRANSCFG_ADRMODE_AARCH64_4K  6
+#define AS_TRANSCFG_ADRMODE_AARCH64_64K 8
+
+#define AS_TRANSCFG_ADRMODE_MASK        0xF
+
+/*
+ * Begin TRANSCFG register values
+ */
+#define AS_TRANSCFG_PTW_MEMATTR_MASK (3ull << 24)
+#define AS_TRANSCFG_PTW_MEMATTR_NON_CACHEABLE (1ull << 24)
+#define AS_TRANSCFG_PTW_MEMATTR_WRITE_BACK (2ull << 24)
+
+#define AS_TRANSCFG_PTW_SH_MASK ((3ull << 28))
+#define AS_TRANSCFG_PTW_SH_OS (2ull << 28)
+#define AS_TRANSCFG_PTW_SH_IS (3ull << 28)
+#define AS_TRANSCFG_R_ALLOCATE (1ull << 30)
+
+/*
+ * Begin Command Values
+ */
+
+/* AS_COMMAND register commands */
+#define AS_COMMAND_NOP         0x00	/* NOP Operation */
+#define AS_COMMAND_UPDATE      0x01	/* Broadcasts the values in AS_TRANSTAB and ASn_MEMATTR to all MMUs */
+#define AS_COMMAND_LOCK        0x02	/* Issue a lock region command to all MMUs */
+#define AS_COMMAND_UNLOCK      0x03	/* Issue a flush region command to all MMUs */
+/* Flush all L2 caches then issue a flush region command to all MMUs
+ * (deprecated - only for use with T60x)
+ */
+#define AS_COMMAND_FLUSH 0x04
+/* Flush all L2 caches then issue a flush region command to all MMUs */
+#define AS_COMMAND_FLUSH_PT 0x04
+/* Wait for memory accesses to complete, flush all the L1s cache then flush all
+ * L2 caches then issue a flush region command to all MMUs
+ */
+#define AS_COMMAND_FLUSH_MEM 0x05
+
+/* GPU_STATUS values */
+#define GPU_STATUS_PRFCNT_ACTIVE            (1 << 2)    /* Set if the performance counters are active. */
+#define GPU_STATUS_CYCLE_COUNT_ACTIVE       (1 << 6)    /* Set if the cycle counter is active. */
+#define GPU_STATUS_PROTECTED_MODE_ACTIVE    (1 << 7)    /* Set if protected mode is active */
+
+/* PRFCNT_CONFIG register values */
+#define PRFCNT_CONFIG_MODE_SHIFT        0 /* Counter mode position. */
+#define PRFCNT_CONFIG_AS_SHIFT          4 /* Address space bitmap position. */
+#define PRFCNT_CONFIG_SETSELECT_SHIFT   8 /* Set select position. */
+
+/* The performance counters are disabled. */
+#define PRFCNT_CONFIG_MODE_OFF          0
+/* The performance counters are enabled, but are only written out when a
+ * PRFCNT_SAMPLE command is issued using the GPU_COMMAND register.
+ */
+#define PRFCNT_CONFIG_MODE_MANUAL       1
+/* The performance counters are enabled, and are written out each time a tile
+ * finishes rendering.
+ */
+#define PRFCNT_CONFIG_MODE_TILE         2
+
+/* AS<n>_MEMATTR values from MMU_MEMATTR_STAGE1: */
+/* Use GPU implementation-defined caching policy. */
+#define AS_MEMATTR_IMPL_DEF_CACHE_POLICY 0x88ull
+/* The attribute set to force all resources to be cached. */
+#define AS_MEMATTR_FORCE_TO_CACHE_ALL    0x8Full
+/* Inner write-alloc cache setup, no outer caching */
+#define AS_MEMATTR_WRITE_ALLOC           0x8Dull
+
+/* Use GPU implementation-defined  caching policy. */
+#define AS_MEMATTR_LPAE_IMPL_DEF_CACHE_POLICY 0x48ull
+/* The attribute set to force all resources to be cached. */
+#define AS_MEMATTR_LPAE_FORCE_TO_CACHE_ALL    0x4Full
+/* Inner write-alloc cache setup, no outer caching */
+#define AS_MEMATTR_LPAE_WRITE_ALLOC           0x4Dull
+/* Set to implementation defined, outer caching */
+#define AS_MEMATTR_LPAE_OUTER_IMPL_DEF        0x88ull
+/* Set to write back memory, outer caching */
+#define AS_MEMATTR_LPAE_OUTER_WA              0x8Dull
+/* There is no LPAE support for non-cacheable, since the memory type is always
+ * write-back.
+ * Marking this setting as reserved for LPAE
+ */
+#define AS_MEMATTR_LPAE_NON_CACHEABLE_RESERVED
+
+/* L2_MMU_CONFIG register */
+#define L2_MMU_CONFIG_ALLOW_SNOOP_DISPARITY_SHIFT       (23)
+#define L2_MMU_CONFIG_ALLOW_SNOOP_DISPARITY             (0x1 << L2_MMU_CONFIG_ALLOW_SNOOP_DISPARITY_SHIFT)
+
+/* End L2_MMU_CONFIG register */
+
+/* THREAD_* registers */
+
+/* THREAD_FEATURES IMPLEMENTATION_TECHNOLOGY values */
+#define IMPLEMENTATION_UNSPECIFIED  0
+#define IMPLEMENTATION_SILICON      1
+#define IMPLEMENTATION_FPGA         2
+#define IMPLEMENTATION_MODEL        3
+
+/* Default values when registers are not supported by the implemented hardware */
+#define THREAD_MT_DEFAULT     256
+#define THREAD_MWS_DEFAULT    256
+#define THREAD_MBS_DEFAULT    256
+#define THREAD_MR_DEFAULT     1024
+#define THREAD_MTQ_DEFAULT    4
+#define THREAD_MTGS_DEFAULT   10
+
+/* End THREAD_* registers */
+
+/* SHADER_CONFIG register */
+#define SC_LS_ALLOW_ATTR_TYPES      (1ul << 16)
+#define SC_TLS_HASH_ENABLE          (1ul << 17)
+#define SC_LS_ATTR_CHECK_DISABLE    (1ul << 18)
+#define SC_VAR_ALGORITHM            (1ul << 29)
+/* End SHADER_CONFIG register */
+
+/* TILER_CONFIG register */
+#define TC_CLOCK_GATE_OVERRIDE      (1ul << 0)
+/* End TILER_CONFIG register */
+
+/* L2_CONFIG register */
+#define L2_CONFIG_SIZE_SHIFT        16
+#define L2_CONFIG_SIZE_MASK         (0xFFul << L2_CONFIG_SIZE_SHIFT)
+#define L2_CONFIG_HASH_SHIFT        24
+#define L2_CONFIG_HASH_MASK         (0xFFul << L2_CONFIG_HASH_SHIFT)
+#define L2_CONFIG_ASN_HASH_ENABLE_SHIFT        24
+#define L2_CONFIG_ASN_HASH_ENABLE_MASK         (1ul << L2_CONFIG_ASN_HASH_ENABLE_SHIFT)
+/* End L2_CONFIG register */
+
+/* IDVS_GROUP register */
+#define IDVS_GROUP_SIZE_SHIFT (16)
+#define IDVS_GROUP_MAX_SIZE (0x3F)
+
+#endif /* _UAPI_KBASE_GPU_REGMAP_H_ */
diff --git a/drivers/gpu/arm/bifrost/jm/mali_base_jm_kernel.h b/include/uapi/gpu/arm/bifrost/jm/mali_base_jm_kernel.h
similarity index 80%
rename from drivers/gpu/arm/bifrost/jm/mali_base_jm_kernel.h
rename to include/uapi/gpu/arm/bifrost/jm/mali_base_jm_kernel.h
index 9367cc5431cf..cd81421b9122 100644
--- a/drivers/gpu/arm/bifrost/jm/mali_base_jm_kernel.h
+++ b/include/uapi/gpu/arm/bifrost/jm/mali_base_jm_kernel.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2019-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,11 +17,12 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
-#ifndef _BASE_JM_KERNEL_H_
-#define _BASE_JM_KERNEL_H_
+
+#ifndef _UAPI_BASE_JM_KERNEL_H_
+#define _UAPI_BASE_JM_KERNEL_H_
+
+#include <linux/types.h>
 
 /* Memory allocation, access/hint flags.
  *
@@ -121,9 +123,9 @@
 #define BASE_MEM_RESERVED_BIT_19 ((base_mem_alloc_flags)1 << 19)
 
 /**
- * Memory starting from the end of the initial commit is aligned to 'extent'
- * pages, where 'extent' must be a power of 2 and no more than
- * BASE_MEM_TILER_ALIGN_TOP_EXTENT_MAX_PAGES
+ * Memory starting from the end of the initial commit is aligned to 'extension'
+ * pages, where 'extension' must be a power of 2 and no more than
+ * BASE_MEM_TILER_ALIGN_TOP_EXTENSION_MAX_PAGES
  */
 #define BASE_MEM_TILER_ALIGN_TOP ((base_mem_alloc_flags)1 << 20)
 
@@ -201,14 +203,14 @@
 						BASE_MEM_COOKIE_BASE)
 
 /* Similar to BASE_MEM_TILER_ALIGN_TOP, memory starting from the end of the
- * initial commit is aligned to 'extent' pages, where 'extent' must be a power
- * of 2 and no more than BASE_MEM_TILER_ALIGN_TOP_EXTENT_MAX_PAGES
+ * initial commit is aligned to 'extension' pages, where 'extension' must be a power
+ * of 2 and no more than BASE_MEM_TILER_ALIGN_TOP_EXTENSION_MAX_PAGES
  */
 #define BASE_JIT_ALLOC_MEM_TILER_ALIGN_TOP  (1 << 0)
 
 /**
- * If set, the heap info address points to a u32 holding the used size in bytes;
- * otherwise it points to a u64 holding the lowest address of unused memory.
+ * If set, the heap info address points to a __u32 holding the used size in bytes;
+ * otherwise it points to a __u64 holding the lowest address of unused memory.
  */
 #define BASE_JIT_ALLOC_HEAP_INFO_IS_SIZE  (1 << 1)
 
@@ -230,7 +232,7 @@
  * These share the same space as BASEP_CONTEXT_FLAG_*, and so must
  * not collide with them.
  */
-typedef u32 base_context_create_flags;
+typedef __u32 base_context_create_flags;
 
 /* No flags set */
 #define BASE_CONTEXT_CREATE_FLAG_NONE ((base_context_create_flags)0)
@@ -320,7 +322,7 @@ typedef u32 base_context_create_flags;
  * @blob: per-job data array
  */
 struct base_jd_udata {
-	u64 blob[2];
+	__u64 blob[2];
 };
 
 /**
@@ -333,7 +335,7 @@ struct base_jd_udata {
  * When the flag is set for a particular dependency to signal that it is an
  * ordering only dependency then errors will not be propagated.
  */
-typedef u8 base_jd_dep_type;
+typedef __u8 base_jd_dep_type;
 
 #define BASE_JD_DEP_TYPE_INVALID  (0)       /**< Invalid dependency */
 #define BASE_JD_DEP_TYPE_DATA     (1U << 0) /**< Data dependency */
@@ -349,7 +351,7 @@ typedef u8 base_jd_dep_type;
  * Special case is ::BASE_JD_REQ_DEP, which is used to express complex
  * dependencies, and that doesn't execute anything on the hardware.
  */
-typedef u32 base_jd_core_req;
+typedef __u32 base_jd_core_req;
 
 /* Requirements that come from the HW */
 
@@ -581,6 +583,13 @@ typedef u32 base_jd_core_req;
  */
 #define BASE_JD_REQ_END_RENDERPASS ((base_jd_core_req)1 << 19)
 
+/* SW-only requirement: The atom needs to run on a limited core mask affinity.
+ *
+ * If this bit is set then the kbase_context.limited_core_mask will be applied
+ * to the affinity.
+ */
+#define BASE_JD_REQ_LIMITED_CORE_MASK ((base_jd_core_req)1 << 20)
+
 /* These requirement bits are currently unused in base_jd_core_req
  */
 #define BASEP_JD_REQ_RESERVED \
@@ -591,7 +600,7 @@ typedef u32 base_jd_core_req;
 	BASE_JD_REQ_FS_AFBC | BASE_JD_REQ_PERMON | \
 	BASE_JD_REQ_SKIP_CACHE_START | BASE_JD_REQ_SKIP_CACHE_END | \
 	BASE_JD_REQ_JOB_SLOT | BASE_JD_REQ_START_RENDERPASS | \
-	BASE_JD_REQ_END_RENDERPASS))
+	BASE_JD_REQ_END_RENDERPASS | BASE_JD_REQ_LIMITED_CORE_MASK))
 
 /* Mask of all bits in base_jd_core_req that control the type of the atom.
  *
@@ -636,7 +645,7 @@ enum kbase_jd_atom_state {
 /**
  * typedef base_atom_id - Type big enough to store an atom number in.
  */
-typedef u8 base_atom_id;
+typedef __u8 base_atom_id;
 
 /**
  * struct base_dependency -
@@ -699,10 +708,10 @@ struct base_dependency {
  * BASE_JD_REQ_END_RENDERPASS is set in the base_jd_core_req.
  */
 struct base_jd_fragment {
-	u64 norm_read_norm_write;
-	u64 norm_read_forced_write;
-	u64 forced_read_forced_write;
-	u64 forced_read_norm_write;
+	__u64 norm_read_norm_write;
+	__u64 norm_read_forced_write;
+	__u64 forced_read_forced_write;
+	__u64 forced_read_norm_write;
 };
 
 /**
@@ -742,7 +751,7 @@ struct base_jd_fragment {
  * the same context. See KBASE_JS_SYSTEM_PRIORITY_MODE and
  * KBASE_JS_PROCESS_LOCAL_PRIORITY_MODE for more details.
  */
-typedef u8 base_jd_prio;
+typedef __u8 base_jd_prio;
 
 /* Medium atom priority. This is a priority higher than BASE_JD_PRIO_LOW */
 #define BASE_JD_PRIO_MEDIUM  ((base_jd_prio)0)
@@ -752,11 +761,15 @@ typedef u8 base_jd_prio;
 #define BASE_JD_PRIO_HIGH    ((base_jd_prio)1)
 /* Low atom priority. */
 #define BASE_JD_PRIO_LOW     ((base_jd_prio)2)
+/* Real-Time atom priority. This is a priority higher than BASE_JD_PRIO_HIGH,
+ * BASE_JD_PRIO_MEDIUM, and BASE_JD_PRIO_LOW
+ */
+#define BASE_JD_PRIO_REALTIME    ((base_jd_prio)3)
 
 /* Count of the number of priority levels. This itself is not a valid
  * base_jd_prio setting
  */
-#define BASE_JD_NR_PRIO_LEVELS 3
+#define BASE_JD_NR_PRIO_LEVELS 4
 
 /**
  * struct base_jd_atom_v2 - Node of a dependency graph used to submit a
@@ -789,32 +802,32 @@ typedef u8 base_jd_prio;
  * @padding:       Unused. Must be zero.
  *
  * This structure has changed since UK 10.2 for which base_jd_core_req was a
- * u16 value.
+ * __u16 value.
  *
- * In UK 10.3 a core_req field of a u32 type was added to the end of the
- * structure, and the place in the structure previously occupied by u16
+ * In UK 10.3 a core_req field of a __u32 type was added to the end of the
+ * structure, and the place in the structure previously occupied by __u16
  * core_req was kept but renamed to compat_core_req.
  *
- * From UK 11.20 - compat_core_req is now occupied by u8 jit_id[2].
+ * From UK 11.20 - compat_core_req is now occupied by __u8 jit_id[2].
  * Compatibility with UK 10.x from UK 11.y is not handled because
  * the major version increase prevents this.
  *
  * For UK 11.20 jit_id[2] must be initialized to zero.
  */
 struct base_jd_atom_v2 {
-	u64 jc;
+	__u64 jc;
 	struct base_jd_udata udata;
-	u64 extres_list;
-	u16 nr_extres;
-	u8 jit_id[2];
+	__u64 extres_list;
+	__u16 nr_extres;
+	__u8 jit_id[2];
 	struct base_dependency pre_dep[2];
 	base_atom_id atom_number;
 	base_jd_prio prio;
-	u8 device_nr;
-	u8 jobslot;
+	__u8 device_nr;
+	__u8 jobslot;
 	base_jd_core_req core_req;
-	u8 renderpass_id;
-	u8 padding[7];
+	__u8 renderpass_id;
+	__u8 padding[7];
 };
 
 /**
@@ -849,20 +862,20 @@ struct base_jd_atom_v2 {
  * @padding:       Unused. Must be zero.
  */
 typedef struct base_jd_atom {
-	u64 seq_nr;
-	u64 jc;
+	__u64 seq_nr;
+	__u64 jc;
 	struct base_jd_udata udata;
-	u64 extres_list;
-	u16 nr_extres;
-	u8 jit_id[2];
+	__u64 extres_list;
+	__u16 nr_extres;
+	__u8 jit_id[2];
 	struct base_dependency pre_dep[2];
 	base_atom_id atom_number;
 	base_jd_prio prio;
-	u8 device_nr;
-	u8 jobslot;
+	__u8 device_nr;
+	__u8 jobslot;
 	base_jd_core_req core_req;
-	u8 renderpass_id;
-	u8 padding[7];
+	__u8 renderpass_id;
+	__u8 padding[7];
 } base_jd_atom;
 
 /* Job chain event code bits
@@ -912,6 +925,109 @@ enum {
  *                                         Such codes are never returned to
  *                                         user-space.
  * @BASE_JD_EVENT_RANGE_KERNEL_ONLY_END: End of kernel-only status codes.
+ * @BASE_JD_EVENT_DONE: atom has completed successfull
+ * @BASE_JD_EVENT_JOB_CONFIG_FAULT: Atom dependencies configuration error which
+ *                                  shall result in a failed atom
+ * @BASE_JD_EVENT_JOB_POWER_FAULT:  The job could not be executed because the
+ *                                  part of the memory system required to access
+ *                                  job descriptors was not powered on
+ * @BASE_JD_EVENT_JOB_READ_FAULT:   Reading a job descriptor into the Job
+ *                                  manager failed
+ * @BASE_JD_EVENT_JOB_WRITE_FAULT:  Writing a job descriptor from the Job
+ *                                  manager failed
+ * @BASE_JD_EVENT_JOB_AFFINITY_FAULT: The job could not be executed because the
+ *                                    specified affinity mask does not intersect
+ *                                    any available cores
+ * @BASE_JD_EVENT_JOB_BUS_FAULT:    A bus access failed while executing a job
+ * @BASE_JD_EVENT_INSTR_INVALID_PC: A shader instruction with an illegal program
+ *                                  counter was executed.
+ * @BASE_JD_EVENT_INSTR_INVALID_ENC: A shader instruction with an illegal
+ *                                  encoding was executed.
+ * @BASE_JD_EVENT_INSTR_TYPE_MISMATCH: A shader instruction was executed where
+ *                                  the instruction encoding did not match the
+ *                                  instruction type encoded in the program
+ *                                  counter.
+ * @BASE_JD_EVENT_INSTR_OPERAND_FAULT: A shader instruction was executed that
+ *                                  contained invalid combinations of operands.
+ * @BASE_JD_EVENT_INSTR_TLS_FAULT:  A shader instruction was executed that tried
+ *                                  to access the thread local storage section
+ *                                  of another thread.
+ * @BASE_JD_EVENT_INSTR_ALIGN_FAULT: A shader instruction was executed that
+ *                                  tried to do an unsupported unaligned memory
+ *                                  access.
+ * @BASE_JD_EVENT_INSTR_BARRIER_FAULT: A shader instruction was executed that
+ *                                  failed to complete an instruction barrier.
+ * @BASE_JD_EVENT_DATA_INVALID_FAULT: Any data structure read as part of the job
+ *                                  contains invalid combinations of data.
+ * @BASE_JD_EVENT_TILE_RANGE_FAULT: Tile or fragment shading was asked to
+ *                                  process a tile that is entirely outside the
+ *                                  bounding box of the frame.
+ * @BASE_JD_EVENT_STATE_FAULT:      Matches ADDR_RANGE_FAULT. A virtual address
+ *                                  has been found that exceeds the virtual
+ *                                  address range.
+ * @BASE_JD_EVENT_OUT_OF_MEMORY:    The tiler ran out of memory when executing a job.
+ * @BASE_JD_EVENT_UNKNOWN:          If multiple jobs in a job chain fail, only
+ *                                  the first one the reports an error will set
+ *                                  and return full error information.
+ *                                  Subsequent failing jobs will not update the
+ *                                  error status registers, and may write an
+ *                                  error status of UNKNOWN.
+ * @BASE_JD_EVENT_DELAYED_BUS_FAULT: The GPU received a bus fault for access to
+ *                                  physical memory where the original virtual
+ *                                  address is no longer available.
+ * @BASE_JD_EVENT_SHAREABILITY_FAULT: Matches GPU_SHAREABILITY_FAULT. A cache
+ *                                  has detected that the same line has been
+ *                                  accessed as both shareable and non-shareable
+ *                                  memory from inside the GPU.
+ * @BASE_JD_EVENT_TRANSLATION_FAULT_LEVEL1: A memory access hit an invalid table
+ *                                  entry at level 1 of the translation table.
+ * @BASE_JD_EVENT_TRANSLATION_FAULT_LEVEL2: A memory access hit an invalid table
+ *                                  entry at level 2 of the translation table.
+ * @BASE_JD_EVENT_TRANSLATION_FAULT_LEVEL3: A memory access hit an invalid table
+ *                                  entry at level 3 of the translation table.
+ * @BASE_JD_EVENT_TRANSLATION_FAULT_LEVEL4: A memory access hit an invalid table
+ *                                  entry at level 4 of the translation table.
+ * @BASE_JD_EVENT_PERMISSION_FAULT: A memory access could not be allowed due to
+ *                                  the permission flags set in translation
+ *                                  table
+ * @BASE_JD_EVENT_TRANSTAB_BUS_FAULT_LEVEL1: A bus fault occurred while reading
+ *                                  level 0 of the translation tables.
+ * @BASE_JD_EVENT_TRANSTAB_BUS_FAULT_LEVEL2: A bus fault occurred while reading
+ *                                  level 1 of the translation tables.
+ * @BASE_JD_EVENT_TRANSTAB_BUS_FAULT_LEVEL3: A bus fault occurred while reading
+ *                                  level 2 of the translation tables.
+ * @BASE_JD_EVENT_TRANSTAB_BUS_FAULT_LEVEL4: A bus fault occurred while reading
+ *                                  level 3 of the translation tables.
+ * @BASE_JD_EVENT_ACCESS_FLAG:      Matches ACCESS_FLAG_0. A memory access hit a
+ *                                  translation table entry with the ACCESS_FLAG
+ *                                  bit set to zero in level 0 of the
+ *                                  page table, and the DISABLE_AF_FAULT flag
+ *                                  was not set.
+ * @BASE_JD_EVENT_MEM_GROWTH_FAILED: raised for JIT_ALLOC atoms that failed to
+ *                                   grow memory on demand
+ * @BASE_JD_EVENT_JOB_CANCELLED: raised when this atom was hard-stopped or its
+ *                               dependencies failed
+ * @BASE_JD_EVENT_JOB_INVALID: raised for many reasons, including invalid data
+ *                             in the atom which overlaps with
+ *                             BASE_JD_EVENT_JOB_CONFIG_FAULT, or if the
+ *                             platform doesn't support the feature specified in
+ *                             the atom.
+ * @BASE_JD_EVENT_PM_EVENT:   TODO: remove as it's not used
+ * @BASE_JD_EVENT_TIMED_OUT:   TODO: remove as it's not used
+ * @BASE_JD_EVENT_BAG_INVALID:   TODO: remove as it's not used
+ * @BASE_JD_EVENT_PROGRESS_REPORT:   TODO: remove as it's not used
+ * @BASE_JD_EVENT_BAG_DONE:   TODO: remove as it's not used
+ * @BASE_JD_EVENT_DRV_TERMINATED: this is a special event generated to indicate
+ *                                to userspace that the KBase context has been
+ *                                destroyed and Base should stop listening for
+ *                                further events
+ * @BASE_JD_EVENT_REMOVED_FROM_NEXT: raised when an atom that was configured in
+ *                                   the GPU has to be retried (but it has not
+ *                                   started) due to e.g., GPU reset
+ * @BASE_JD_EVENT_END_RP_DONE: this is used for incremental rendering to signal
+ *                             the completion of a renderpass. This value
+ *                             shouldn't be returned to userspace but I haven't
+ *                             seen where it is reset back to JD_EVENT_DONE.
  *
  * HW and low-level SW events are represented by event codes.
  * The status of jobs which succeeded are also represented by
@@ -1058,6 +1174,11 @@ struct base_jd_event_v2 {
  * struct base_dump_cpu_gpu_counters - Structure for
  *                                     BASE_JD_REQ_SOFT_DUMP_CPU_GPU_COUNTERS
  *                                     jobs.
+ * @system_time:   gpu timestamp
+ * @cycle_counter: gpu cycle count
+ * @sec:           cpu time(sec)
+ * @usec:          cpu time(usec)
+ * @padding:       padding
  *
  * This structure is stored into the memory pointed to by the @jc field
  * of &struct base_jd_atom.
@@ -1069,11 +1190,11 @@ struct base_jd_event_v2 {
  */
 
 struct base_dump_cpu_gpu_counters {
-	u64 system_time;
-	u64 cycle_counter;
-	u64 sec;
-	u32 usec;
-	u8 padding[36];
+	__u64 system_time;
+	__u64 cycle_counter;
+	__u64 sec;
+	__u32 usec;
+	__u8 padding[36];
 };
 
-#endif /* _BASE_JM_KERNEL_H_ */
+#endif /* _UAPI_BASE_JM_KERNEL_H_ */
diff --git a/drivers/gpu/arm/bifrost/jm/mali_kbase_jm_ioctl.h b/include/uapi/gpu/arm/bifrost/jm/mali_kbase_jm_ioctl.h
similarity index 93%
rename from drivers/gpu/arm/bifrost/jm/mali_kbase_jm_ioctl.h
rename to include/uapi/gpu/arm/bifrost/jm/mali_kbase_jm_ioctl.h
index 305a9eb221ae..1eb6bcb85a5a 100644
--- a/drivers/gpu/arm/bifrost/jm/mali_kbase_jm_ioctl.h
+++ b/include/uapi/gpu/arm/bifrost/jm/mali_kbase_jm_ioctl.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-#ifndef _KBASE_JM_IOCTL_H_
-#define _KBASE_JM_IOCTL_H_
+#ifndef _UAPI_KBASE_JM_IOCTL_H_
+#define _UAPI_KBASE_JM_IOCTL_H_
 
 #include <asm-generic/ioctl.h>
 #include <linux/types.h>
@@ -106,17 +105,23 @@
  *   'scheduling'.
  * 11.25:
  * - Enabled JIT pressure limit in base/kbase by default
- * 11.26:
+ * 11.26
  * - Added kinstr_jm API
- * 11.27:
+ * 11.27
  * - Backwards compatible extension to HWC ioctl.
  * 11.28:
  * - Added kernel side cache ops needed hint
  * 11.29:
  * - Reserve ioctl 52
+ * 11.30:
+ * - Add a new priority level BASE_JD_PRIO_REALTIME
+ * - Add ioctl 54: This controls the priority setting.
+ * 11.31:
+ * - Added BASE_JD_REQ_LIMITED_CORE_MASK.
+ * - Added ioctl 55: set_limited_core_count.
  */
 #define BASE_UK_VERSION_MAJOR 11
-#define BASE_UK_VERSION_MINOR 29
+#define BASE_UK_VERSION_MINOR 31
 
 /**
  * struct kbase_ioctl_version_check - Check version compatibility between
@@ -133,8 +138,6 @@ struct kbase_ioctl_version_check {
 #define KBASE_IOCTL_VERSION_CHECK \
 	_IOWR(KBASE_IOCTL_TYPE, 0, struct kbase_ioctl_version_check)
 
-#define KBASE_IOCTL_VERSION_CHECK_RESERVED \
-	_IOWR(KBASE_IOCTL_TYPE, 52, struct kbase_ioctl_version_check)
 
 /**
  * struct kbase_ioctl_job_submit - Submit jobs/atoms to the kernel
@@ -213,4 +216,8 @@ union kbase_kinstr_jm_fd {
 #define KBASE_IOCTL_KINSTR_JM_FD \
 	_IOWR(KBASE_IOCTL_TYPE, 51, union kbase_kinstr_jm_fd)
 
-#endif /* _KBASE_JM_IOCTL_H_ */
+
+#define KBASE_IOCTL_VERSION_CHECK_RESERVED \
+	_IOWR(KBASE_IOCTL_TYPE, 52, struct kbase_ioctl_version_check)
+
+#endif /* _UAPI_KBASE_JM_IOCTL_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_base_kernel.h b/include/uapi/gpu/arm/bifrost/mali_base_kernel.h
similarity index 72%
rename from drivers/gpu/arm/bifrost/mali_base_kernel.h
rename to include/uapi/gpu/arm/bifrost/mali_base_kernel.h
index 086171adb6e5..554c5a39b189 100644
--- a/drivers/gpu/arm/bifrost/mali_base_kernel.h
+++ b/include/uapi/gpu/arm/bifrost/mali_base_kernel.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2010-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,48 +17,52 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /*
  * Base structures shared with the kernel.
  */
 
-#ifndef _BASE_KERNEL_H_
-#define _BASE_KERNEL_H_
+#ifndef _UAPI_BASE_KERNEL_H_
+#define _UAPI_BASE_KERNEL_H_
+
+#include <linux/types.h>
 
 struct base_mem_handle {
 	struct {
-		u64 handle;
+		__u64 handle;
 	} basep;
 };
 
 #include "mali_base_mem_priv.h"
-#include "gpu/mali_kbase_gpu_coherency.h"
 #include "gpu/mali_kbase_gpu_id.h"
+#include "gpu/mali_kbase_gpu_coherency.h"
 
 #define BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS 4
 
 #define BASE_MAX_COHERENT_GROUPS 16
 
-#if defined CDBG_ASSERT
+#if defined(CDBG_ASSERT)
 #define LOCAL_ASSERT CDBG_ASSERT
-#elif defined KBASE_DEBUG_ASSERT
+#elif defined(KBASE_DEBUG_ASSERT)
 #define LOCAL_ASSERT KBASE_DEBUG_ASSERT
 #else
+#if defined(__KERNEL__)
 #error assert macro not defined!
+#else
+#define LOCAL_ASSERT(...)	((void)#__VA_ARGS__)
+#endif
 #endif
 
 #if defined(PAGE_MASK) && defined(PAGE_SHIFT)
 #define LOCAL_PAGE_SHIFT PAGE_SHIFT
 #define LOCAL_PAGE_LSB ~PAGE_MASK
 #else
-#include <osu/mali_osu.h>
+#ifndef OSU_CONFIG_CPU_PAGE_SIZE_LOG2
+#define OSU_CONFIG_CPU_PAGE_SIZE_LOG2 12
+#endif
 
-#if defined OSU_CONFIG_CPU_PAGE_SIZE_LOG2
+#if defined(OSU_CONFIG_CPU_PAGE_SIZE_LOG2)
 #define LOCAL_PAGE_SHIFT OSU_CONFIG_CPU_PAGE_SIZE_LOG2
 #define LOCAL_PAGE_LSB ((1ul << OSU_CONFIG_CPU_PAGE_SIZE_LOG2) - 1)
 #else
@@ -85,7 +90,7 @@ struct base_mem_handle {
  * More flags can be added to this list, as long as they don't clash
  * (see BASE_MEM_FLAGS_NR_BITS for the number of the first free bit).
  */
-typedef u32 base_mem_alloc_flags;
+typedef __u32 base_mem_alloc_flags;
 
 /* A mask for all the flags which are modifiable via the base_mem_set_flags
  * interface.
@@ -121,7 +126,7 @@ typedef u32 base_mem_alloc_flags;
  */
 enum base_mem_import_type {
 	BASE_MEM_IMPORT_TYPE_INVALID = 0,
-	/**
+	/*
 	 * Import type with value 1 is deprecated.
 	 */
 	BASE_MEM_IMPORT_TYPE_UMM = 2,
@@ -138,8 +143,8 @@ enum base_mem_import_type {
  */
 
 struct base_mem_import_user_buffer {
-	u64 ptr;
-	u64 length;
+	__u64 ptr;
+	__u64 length;
 };
 
 /* Mask to detect 4GB boundary alignment */
@@ -147,15 +152,15 @@ struct base_mem_import_user_buffer {
 /* Mask to detect 4GB boundary (in page units) alignment */
 #define BASE_MEM_PFN_MASK_4GB  (BASE_MEM_MASK_4GB >> LOCAL_PAGE_SHIFT)
 
-/* Limit on the 'extent' parameter for an allocation with the
+/* Limit on the 'extension' parameter for an allocation with the
  * BASE_MEM_TILER_ALIGN_TOP flag set
  *
  * This is the same as the maximum limit for a Buffer Descriptor's chunk size
  */
-#define BASE_MEM_TILER_ALIGN_TOP_EXTENT_MAX_PAGES_LOG2 \
-		(21u - (LOCAL_PAGE_SHIFT))
-#define BASE_MEM_TILER_ALIGN_TOP_EXTENT_MAX_PAGES \
-		(1ull << (BASE_MEM_TILER_ALIGN_TOP_EXTENT_MAX_PAGES_LOG2))
+#define BASE_MEM_TILER_ALIGN_TOP_EXTENSION_MAX_PAGES_LOG2                      \
+	(21u - (LOCAL_PAGE_SHIFT))
+#define BASE_MEM_TILER_ALIGN_TOP_EXTENSION_MAX_PAGES                           \
+	(1ull << (BASE_MEM_TILER_ALIGN_TOP_EXTENSION_MAX_PAGES_LOG2))
 
 /* Bit mask of cookies used for for memory allocation setup */
 #define KBASE_COOKIE_MASK  ~1UL /* bit 0 is reserved */
@@ -163,7 +168,7 @@ struct base_mem_import_user_buffer {
 /* Maximum size allowed in a single KBASE_IOCTL_MEM_ALLOC call */
 #define KBASE_MEM_ALLOC_MAX_SIZE ((8ull << 30) >> PAGE_SHIFT) /* 8 GB */
 
-/**
+/*
  * struct base_fence - Cross-device synchronisation fence.
  *
  * A fence is used to signal when the GPU has finished accessing a resource that
@@ -200,8 +205,8 @@ struct base_fence {
  */
 struct base_mem_aliasing_info {
 	struct base_mem_handle handle;
-	u64 offset;
-	u64 length;
+	__u64 offset;
+	__u64 length;
 };
 
 /* Maximum percentage of just-in-time memory allocation trimming to perform
@@ -223,11 +228,11 @@ struct base_mem_aliasing_info {
  * An array of structures was not supported
  */
 struct base_jit_alloc_info_10_2 {
-	u64 gpu_alloc_addr;
-	u64 va_pages;
-	u64 commit_pages;
-	u64 extent;
-	u8 id;
+	__u64 gpu_alloc_addr;
+	__u64 va_pages;
+	__u64 commit_pages;
+	__u64 extension;
+	__u8 id;
 };
 
 /* base_jit_alloc_info introduced by kernel driver version 11.5, and in use up
@@ -250,16 +255,16 @@ struct base_jit_alloc_info_10_2 {
  * 11.10: Arrays of this structure are supported
  */
 struct base_jit_alloc_info_11_5 {
-	u64 gpu_alloc_addr;
-	u64 va_pages;
-	u64 commit_pages;
-	u64 extent;
-	u8 id;
-	u8 bin_id;
-	u8 max_allocations;
-	u8 flags;
-	u8 padding[2];
-	u16 usage_id;
+	__u64 gpu_alloc_addr;
+	__u64 va_pages;
+	__u64 commit_pages;
+	__u64 extension;
+	__u8 id;
+	__u8 bin_id;
+	__u8 max_allocations;
+	__u8 flags;
+	__u8 padding[2];
+	__u16 usage_id;
 };
 
 /**
@@ -270,7 +275,7 @@ struct base_jit_alloc_info_11_5 {
  * @va_pages:                   The minimum number of virtual pages required.
  * @commit_pages:               The minimum number of physical pages which
  *                              should back the allocation.
- * @extent:                     Granularity of physical pages to grow the
+ * @extension:                     Granularity of physical pages to grow the
  *                              allocation by during a fault.
  * @id:                         Unique ID provided by the caller, this is used
  *                              to pair allocation and free requests.
@@ -305,17 +310,17 @@ struct base_jit_alloc_info_11_5 {
  * 11.20: added @heap_info_gpu_addr
  */
 struct base_jit_alloc_info {
-	u64 gpu_alloc_addr;
-	u64 va_pages;
-	u64 commit_pages;
-	u64 extent;
-	u8 id;
-	u8 bin_id;
-	u8 max_allocations;
-	u8 flags;
-	u8 padding[2];
-	u16 usage_id;
-	u64 heap_info_gpu_addr;
+	__u64 gpu_alloc_addr;
+	__u64 va_pages;
+	__u64 commit_pages;
+	__u64 extension;
+	__u8 id;
+	__u8 bin_id;
+	__u8 max_allocations;
+	__u8 flags;
+	__u8 padding[2];
+	__u16 usage_id;
+	__u64 heap_info_gpu_addr;
 };
 
 enum base_external_resource_access {
@@ -324,7 +329,7 @@ enum base_external_resource_access {
 };
 
 struct base_external_resource {
-	u64 ext_resource;
+	__u64 ext_resource;
 };
 
 
@@ -342,13 +347,13 @@ struct base_external_resource {
  *                                      sized at allocation time.
  */
 struct base_external_resource_list {
-	u64 count;
+	__u64 count;
 	struct base_external_resource ext_res[1];
 };
 
 struct base_jd_debug_copy_buffer {
-	u64 address;
-	u64 size;
+	__u64 address;
+	__u64 size;
 	struct base_external_resource extres;
 };
 
@@ -460,7 +465,7 @@ struct base_jd_debug_copy_buffer {
  * population count, since faulty cores may be disabled during production,
  * producing a non-contiguous mask.
  *
- * The memory requirements for this algorithm can be determined either by a u64
+ * The memory requirements for this algorithm can be determined either by a __u64
  * population count on the L2_PRESENT mask (a LUT helper already is
  * required for the above), or simple assumption that there can be no more than
  * 16 coherent groups, since core groups are typically 4 cores.
@@ -469,165 +474,170 @@ struct base_jd_debug_copy_buffer {
 #define BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS 4
 
 #define BASE_MAX_COHERENT_GROUPS 16
-
+/**
+ * struct mali_base_gpu_core_props - GPU core props info
+ * @product_id: Pro specific value.
+ * @version_status: Status of the GPU release. No defined values, but starts at
+ * 	0 and increases by one for each release status (alpha, beta, EAC, etc.).
+ * 	4 bit values (0-15).
+ * @minor_revision: Minor release number of the GPU. "P" part of an "RnPn"
+ * 	release number.
+ * 	8 bit values (0-255).
+ * @major_revision: Major release number of the GPU. "R" part of an "RnPn"
+ * 	release number.
+ * 	4 bit values (0-15).
+ * @padding: padding to allign to 8-byte
+ * @gpu_freq_khz_max: The maximum GPU frequency. Reported to applications by
+ * 	clGetDeviceInfo()
+ * @log2_program_counter_size: Size of the shader program counter, in bits.
+ * @texture_features: TEXTURE_FEATURES_x registers, as exposed by the GPU. This
+ * 	is a bitpattern where a set bit indicates that the format is supported.
+ * 	Before using a texture format, it is recommended that the corresponding
+ * 	bit be checked.
+ * @gpu_available_memory_size: Theoretical maximum memory available to the GPU.
+ * 	It is unlikely that a client will be able to allocate all of this memory
+ * 	for their own purposes, but this at least provides an upper bound on the
+ * 	memory available to the GPU.
+ * 	This is required for OpenCL's clGetDeviceInfo() call when
+ * 	CL_DEVICE_GLOBAL_MEM_SIZE is requested, for OpenCL GPU devices. The
+ * 	client will not be expecting to allocate anywhere near this value.
+ * @num_exec_engines: The number of execution engines.
+ */
 struct mali_base_gpu_core_props {
-	/**
-	 * Product specific value.
-	 */
-	u32 product_id;
-
-	/**
-	 * Status of the GPU release.
-	 * No defined values, but starts at 0 and increases by one for each
-	 * release status (alpha, beta, EAC, etc.).
-	 * 4 bit values (0-15).
-	 */
-	u16 version_status;
-
-	/**
-	 * Minor release number of the GPU. "P" part of an "RnPn" release number.
-     * 8 bit values (0-255).
-	 */
-	u16 minor_revision;
-
-	/**
-	 * Major release number of the GPU. "R" part of an "RnPn" release number.
-     * 4 bit values (0-15).
-	 */
-	u16 major_revision;
-
-	u16 padding;
-
-	/* The maximum GPU frequency. Reported to applications by
-	 * clGetDeviceInfo()
-	 */
-	u32 gpu_freq_khz_max;
-
-	/**
-	 * Size of the shader program counter, in bits.
-	 */
-	u32 log2_program_counter_size;
-
-	/**
-	 * TEXTURE_FEATURES_x registers, as exposed by the GPU. This is a
-	 * bitpattern where a set bit indicates that the format is supported.
-	 *
-	 * Before using a texture format, it is recommended that the corresponding
-	 * bit be checked.
-	 */
-	u32 texture_features[BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS];
-
-	/**
-	 * Theoretical maximum memory available to the GPU. It is unlikely that a
-	 * client will be able to allocate all of this memory for their own
-	 * purposes, but this at least provides an upper bound on the memory
-	 * available to the GPU.
-	 *
-	 * This is required for OpenCL's clGetDeviceInfo() call when
-	 * CL_DEVICE_GLOBAL_MEM_SIZE is requested, for OpenCL GPU devices. The
-	 * client will not be expecting to allocate anywhere near this value.
-	 */
-	u64 gpu_available_memory_size;
-
-	/**
-	 * The number of execution engines.
-	 */
-	u8 num_exec_engines;
+	__u32 product_id;
+	__u16 version_status;
+	__u16 minor_revision;
+	__u16 major_revision;
+	__u16 padding;
+	__u32 gpu_freq_khz_max;
+	__u32 log2_program_counter_size;
+	__u32 texture_features[BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS];
+	__u64 gpu_available_memory_size;
+	__u8 num_exec_engines;
 };
 
-/**
- *
+/*
  * More information is possible - but associativity and bus width are not
  * required by upper-level apis.
  */
 struct mali_base_gpu_l2_cache_props {
-	u8 log2_line_size;
-	u8 log2_cache_size;
-	u8 num_l2_slices; /* Number of L2C slices. 1 or higher */
-	u8 padding[5];
+	__u8 log2_line_size;
+	__u8 log2_cache_size;
+	__u8 num_l2_slices; /* Number of L2C slices. 1 or higher */
+	__u8 padding[5];
 };
 
 struct mali_base_gpu_tiler_props {
-	u32 bin_size_bytes;	/* Max is 4*2^15 */
-	u32 max_active_levels;	/* Max is 2^15 */
+	__u32 bin_size_bytes;	/* Max is 4*2^15 */
+	__u32 max_active_levels;	/* Max is 2^15 */
 };
 
 /**
- * GPU threading system details.
+ * struct mali_base_gpu_thread_props - GPU threading system details.
+ * @max_threads: Max. number of threads per core
+ * @max_workgroup_size:     Max. number of threads per workgroup
+ * @max_barrier_size:       Max. number of threads that can synchronize on a
+ *                          simple barrier
+ * @max_registers:          Total size [1..65535] of the register file available
+ *                          per core.
+ * @max_task_queue:         Max. tasks [1..255] which may be sent to a core
+ *                          before it becomes blocked.
+ * @max_thread_group_split: Max. allowed value [1..15] of the Thread Group Split
+ *                          field.
+ * @impl_tech:              0 = Not specified, 1 = Silicon, 2 = FPGA,
+ *                          3 = SW Model/Emulation
+ * @padding:                padding to allign to 8-byte
+ * @tls_alloc:              Number of threads per core that TLS must be
+ *                          allocated for
  */
 struct mali_base_gpu_thread_props {
-	u32 max_threads;            /* Max. number of threads per core */
-	u32 max_workgroup_size;     /* Max. number of threads per workgroup */
-	u32 max_barrier_size;       /* Max. number of threads that can synchronize on a simple barrier */
-	u16 max_registers;          /* Total size [1..65535] of the register file available per core. */
-	u8  max_task_queue;         /* Max. tasks [1..255] which may be sent to a core before it becomes blocked. */
-	u8  max_thread_group_split; /* Max. allowed value [1..15] of the Thread Group Split field. */
-	u8  impl_tech;              /* 0 = Not specified, 1 = Silicon, 2 = FPGA, 3 = SW Model/Emulation */
-	u8  padding[3];
-	u32 tls_alloc;              /* Number of threads per core that TLS must
-				     * be allocated for
-				     */
+	__u32 max_threads;
+	__u32 max_workgroup_size;
+	__u32 max_barrier_size;
+	__u16 max_registers;
+	__u8 max_task_queue;
+	__u8 max_thread_group_split;
+	__u8 impl_tech;
+	__u8  padding[3];
+	__u32 tls_alloc;
 };
 
 /**
  * struct mali_base_gpu_coherent_group - descriptor for a coherent group
+ * @core_mask: Core restriction mask required for the group
+ * @num_cores: Number of cores in the group
+ * @padding:   padding to allign to 8-byte
  *
  * \c core_mask exposes all cores in that coherent group, and \c num_cores
- * provides a cached population-count for that mask.
+ * 	provides a cached population-count for that mask.
  *
  * @note Whilst all cores are exposed in the mask, not all may be available to
- * the application, depending on the Kernel Power policy.
+ * 	the application, depending on the Kernel Power policy.
  *
- * @note if u64s must be 8-byte aligned, then this structure has 32-bits of wastage.
+ * @note if u64s must be 8-byte aligned, then this structure has 32-bits of
+ * 	wastage.
  */
 struct mali_base_gpu_coherent_group {
-	u64 core_mask;	       /**< Core restriction mask required for the group */
-	u16 num_cores;	       /**< Number of cores in the group */
-	u16 padding[3];
+	__u64 core_mask;
+	__u16 num_cores;
+	__u16 padding[3];
 };
 
 /**
  * struct mali_base_gpu_coherent_group_info - Coherency group information
+ * @num_groups: Number of coherent groups in the GPU.
+ * @num_core_groups: Number of core groups (coherent or not) in the GPU.
+ * 	Equivalent to the number of L2 Caches.
+ * 	  The GPU Counter dumping writes 2048 bytes per core group, regardless
+ * 	of whether the core groups are coherent or not. Hence this member is
+ * 	needed to calculate how much memory is required for dumping.
+ * 	  @note Do not use it to work out how many valid elements are in the
+ * 	group[] member. Use num_groups instead.
+ * @coherency: Coherency features of the memory, accessed by gpu_mem_features
+ * 	methods
+ * @padding: padding to allign to 8-byte
+ * @group: Descriptors of coherent groups
  *
  * Note that the sizes of the members could be reduced. However, the \c group
- * member might be 8-byte aligned to ensure the u64 core_mask is 8-byte
+ * member might be 8-byte aligned to ensure the __u64 core_mask is 8-byte
  * aligned, thus leading to wastage if the other members sizes were reduced.
  *
  * The groups are sorted by core mask. The core masks are non-repeating and do
  * not intersect.
  */
 struct mali_base_gpu_coherent_group_info {
-	u32 num_groups;
-
-	/**
-	 * Number of core groups (coherent or not) in the GPU. Equivalent to the number of L2 Caches.
-	 *
-	 * The GPU Counter dumping writes 2048 bytes per core group, regardless of
-	 * whether the core groups are coherent or not. Hence this member is needed
-	 * to calculate how much memory is required for dumping.
-	 *
-	 * @note Do not use it to work out how many valid elements are in the
-	 * group[] member. Use num_groups instead.
-	 */
-	u32 num_core_groups;
-
-	/**
-	 * Coherency features of the memory, accessed by gpu_mem_features
-	 * methods
-	 */
-	u32 coherency;
-
-	u32 padding;
-
-	/**
-	 * Descriptors of coherent groups
-	 */
+	__u32 num_groups;
+	__u32 num_core_groups;
+	__u32 coherency;
+	__u32 padding;
 	struct mali_base_gpu_coherent_group group[BASE_MAX_COHERENT_GROUPS];
 };
 
 /**
  * struct gpu_raw_gpu_props - A complete description of the GPU's Hardware
  *                            Configuration Discovery registers.
+ * @shader_present: Shader core present bitmap
+ * @tiler_present: Tiler core present bitmap
+ * @l2_present: Level 2 cache present bitmap
+ * @stack_present: Core stack present bitmap
+ * @l2_features: L2 features
+ * @core_features: Core features
+ * @mem_features: Mem features
+ * @mmu_features: Mmu features
+ * @as_present: Bitmap of address spaces present
+ * @js_present: Job slots present
+ * @js_features: Array of job slot features.
+ * @tiler_features: Tiler features
+ * @texture_features: TEXTURE_FEATURES_x registers, as exposed by the GPU
+ * @gpu_id: GPU and revision identifier
+ * @thread_max_threads: Maximum number of threads per core
+ * @thread_max_workgroup_size: Maximum number of threads per workgroup
+ * @thread_max_barrier_size: Maximum number of threads per barrier
+ * @thread_features: Thread features
+ * @coherency_mode: Note: This is the _selected_ coherency mode rather than the
+ * 	available modes as exposed in the coherency_features register
+ * @thread_tls_alloc: Number of threads per core that TLS must be allocated for
+ * @gpu_features: GPU features
  *
  * The information is presented inefficiently for access. For frequent access,
  * the values should be better expressed in an unpacked form in the
@@ -642,55 +652,58 @@ struct mali_base_gpu_coherent_group_info {
  *
  */
 struct gpu_raw_gpu_props {
-	u64 shader_present;
-	u64 tiler_present;
-	u64 l2_present;
-	u64 stack_present;
-
-	u32 l2_features;
-	u32 core_features;
-	u32 mem_features;
-	u32 mmu_features;
+	__u64 shader_present;
+	__u64 tiler_present;
+	__u64 l2_present;
+	__u64 stack_present;
+	__u32 l2_features;
+	__u32 core_features;
+	__u32 mem_features;
+	__u32 mmu_features;
 
-	u32 as_present;
+	__u32 as_present;
 
-	u32 js_present;
-	u32 js_features[GPU_MAX_JOB_SLOTS];
-	u32 tiler_features;
-	u32 texture_features[BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS];
+	__u32 js_present;
+	__u32 js_features[GPU_MAX_JOB_SLOTS];
+	__u32 tiler_features;
+	__u32 texture_features[BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS];
 
-	u32 gpu_id;
+	__u32 gpu_id;
 
-	u32 thread_max_threads;
-	u32 thread_max_workgroup_size;
-	u32 thread_max_barrier_size;
-	u32 thread_features;
+	__u32 thread_max_threads;
+	__u32 thread_max_workgroup_size;
+	__u32 thread_max_barrier_size;
+	__u32 thread_features;
 
 	/*
 	 * Note: This is the _selected_ coherency mode rather than the
 	 * available modes as exposed in the coherency_features register.
 	 */
-	u32 coherency_mode;
+	__u32 coherency_mode;
 
-	u32 thread_tls_alloc;
+	__u32 thread_tls_alloc;
+	__u64 gpu_features;
 };
 
 /**
  * struct base_gpu_props - Return structure for base_get_gpu_props().
+ * @core_props:     Core props.
+ * @l2_props:       L2 props.
+ * @unused_1:       Keep for backwards compatibility.
+ * @tiler_props:    Tiler props.
+ * @thread_props:   Thread props.
+ * @raw_props:      This member is large, likely to be 128 bytes.
+ * @coherency_info: This must be last member of the structure.
  *
  * NOTE: the raw_props member in this data structure contains the register
  * values from which the value of the other members are derived. The derived
  * members exist to allow for efficient access and/or shielding the details
  * of the layout of the registers.
- *
- * @unused_1:       Keep for backwards compatibility.
- * @raw_props:      This member is large, likely to be 128 bytes.
- * @coherency_info: This must be last member of the structure.
- */
+ * */
 struct base_gpu_props {
 	struct mali_base_gpu_core_props core_props;
 	struct mali_base_gpu_l2_cache_props l2_props;
-	u64 unused_1;
+	__u64 unused_1;
 	struct mali_base_gpu_tiler_props tiler_props;
 	struct mali_base_gpu_thread_props thread_props;
 	struct gpu_raw_gpu_props raw_props;
@@ -712,7 +725,7 @@ struct base_gpu_props {
  *
  * Return: group ID(0~15) extracted from the parameter
  */
-static inline int base_mem_group_id_get(base_mem_alloc_flags flags)
+static __inline__ int base_mem_group_id_get(base_mem_alloc_flags flags)
 {
 	LOCAL_ASSERT((flags & ~BASE_MEM_FLAGS_INPUT_MASK) == 0);
 	return (int)((flags & BASE_MEM_GROUP_ID_MASK) >>
@@ -731,7 +744,7 @@ static inline int base_mem_group_id_get(base_mem_alloc_flags flags)
  * The return value can be combined with other flags against base_mem_alloc
  * to identify a specific memory group.
  */
-static inline base_mem_alloc_flags base_mem_group_id_set(int id)
+static __inline__ base_mem_alloc_flags base_mem_group_id_set(int id)
 {
 	if ((id < 0) || (id >= BASE_MEM_GROUP_COUNT)) {
 		/* Set to default value when id is out of range. */
@@ -752,7 +765,7 @@ static inline base_mem_alloc_flags base_mem_group_id_set(int id)
  *
  * Return: Bitmask of flags to pass to base_context_init.
  */
-static inline base_context_create_flags base_context_mmu_group_id_set(
+static __inline__ base_context_create_flags base_context_mmu_group_id_set(
 	int const group_id)
 {
 	LOCAL_ASSERT(group_id >= 0);
@@ -772,7 +785,7 @@ static inline base_context_create_flags base_context_mmu_group_id_set(
  *
  * Return: Physical memory group ID. Valid range is 0..(BASE_MEM_GROUP_COUNT-1).
  */
-static inline int base_context_mmu_group_id_get(
+static __inline__ int base_context_mmu_group_id_get(
 	base_context_create_flags const flags)
 {
 	LOCAL_ASSERT(flags == (flags & BASEP_CONTEXT_CREATE_ALLOWED_FLAGS));
@@ -804,4 +817,10 @@ static inline int base_context_mmu_group_id_get(
 		BASE_TIMEINFO_KERNEL_SOURCE_FLAG | \
 		BASE_TIMEINFO_USER_SOURCE_FLAG)
 
-#endif				/* _BASE_KERNEL_H_ */
+/* Maximum number of source allocations allowed to create an alias allocation.
+ * This needs to be 4096 * 6 to allow cube map arrays with up to 4096 array
+ * layers, since each cube map in the array will have 6 faces.
+ */
+#define BASE_MEM_ALIAS_MAX_ENTS ((size_t)24576)
+
+#endif /* _UAPI_BASE_KERNEL_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_base_mem_priv.h b/include/uapi/gpu/arm/bifrost/mali_base_mem_priv.h
similarity index 81%
rename from drivers/gpu/arm/bifrost/mali_base_mem_priv.h
rename to include/uapi/gpu/arm/bifrost/mali_base_mem_priv.h
index 844a025b715d..982bd3d92dc2 100644
--- a/drivers/gpu/arm/bifrost/mali_base_mem_priv.h
+++ b/include/uapi/gpu/arm/bifrost/mali_base_mem_priv.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2010-2015, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010-2015, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,14 +17,14 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
+#ifndef _UAPI_BASE_MEM_PRIV_H_
+#define _UAPI_BASE_MEM_PRIV_H_
 
+#include <linux/types.h>
 
-#ifndef _BASE_MEM_PRIV_H_
-#define _BASE_MEM_PRIV_H_
+#include "mali_base_kernel.h"
 
 #define BASE_SYNCSET_OP_MSYNC	(1U << 0)
 #define BASE_SYNCSET_OP_CSYNC	(1U << 1)
@@ -48,10 +49,10 @@
  */
 struct basep_syncset {
 	struct base_mem_handle mem_handle;
-	u64 user_addr;
-	u64 size;
-	u8 type;
-	u8 padding[7];
+	__u64 user_addr;
+	__u64 size;
+	__u8 type;
+	__u8 padding[7];
 };
 
-#endif
+#endif /* _UAPI_BASE_MEM_PRIV_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_reader.h b/include/uapi/gpu/arm/bifrost/mali_kbase_hwcnt_reader.h
similarity index 83%
rename from drivers/gpu/arm/bifrost/mali_kbase_hwcnt_reader.h
rename to include/uapi/gpu/arm/bifrost/mali_kbase_hwcnt_reader.h
index 8cd3835595f7..615dbb0a52fd 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_hwcnt_reader.h
+++ b/include/uapi/gpu/arm/bifrost/mali_kbase_hwcnt_reader.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2015, 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2015, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,21 +17,20 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-#ifndef _KBASE_HWCNT_READER_H_
-#define _KBASE_HWCNT_READER_H_
+#ifndef _UAPI_KBASE_HWCNT_READER_H_
+#define _UAPI_KBASE_HWCNT_READER_H_
 
 #include <stddef.h>
+#include <linux/types.h>
 
 /* The ids of ioctl commands. */
 #define KBASE_HWCNT_READER 0xBE
-#define KBASE_HWCNT_READER_GET_HWVER       _IOR(KBASE_HWCNT_READER, 0x00, u32)
-#define KBASE_HWCNT_READER_GET_BUFFER_SIZE _IOR(KBASE_HWCNT_READER, 0x01, u32)
-#define KBASE_HWCNT_READER_DUMP            _IOW(KBASE_HWCNT_READER, 0x10, u32)
-#define KBASE_HWCNT_READER_CLEAR           _IOW(KBASE_HWCNT_READER, 0x11, u32)
+#define KBASE_HWCNT_READER_GET_HWVER       _IOR(KBASE_HWCNT_READER, 0x00, __u32)
+#define KBASE_HWCNT_READER_GET_BUFFER_SIZE _IOR(KBASE_HWCNT_READER, 0x01, __u32)
+#define KBASE_HWCNT_READER_DUMP            _IOW(KBASE_HWCNT_READER, 0x10, __u32)
+#define KBASE_HWCNT_READER_CLEAR           _IOW(KBASE_HWCNT_READER, 0x11, __u32)
 #define KBASE_HWCNT_READER_GET_BUFFER      _IOC(_IOC_READ, KBASE_HWCNT_READER, 0x20,\
 		offsetof(struct kbase_hwcnt_reader_metadata, cycles))
 #define KBASE_HWCNT_READER_GET_BUFFER_WITH_CYCLES      _IOR(KBASE_HWCNT_READER, 0x20,\
@@ -39,10 +39,10 @@
 		offsetof(struct kbase_hwcnt_reader_metadata, cycles))
 #define KBASE_HWCNT_READER_PUT_BUFFER_WITH_CYCLES      _IOW(KBASE_HWCNT_READER, 0x21,\
 		struct kbase_hwcnt_reader_metadata)
-#define KBASE_HWCNT_READER_SET_INTERVAL    _IOW(KBASE_HWCNT_READER, 0x30, u32)
-#define KBASE_HWCNT_READER_ENABLE_EVENT    _IOW(KBASE_HWCNT_READER, 0x40, u32)
-#define KBASE_HWCNT_READER_DISABLE_EVENT   _IOW(KBASE_HWCNT_READER, 0x41, u32)
-#define KBASE_HWCNT_READER_GET_API_VERSION _IOW(KBASE_HWCNT_READER, 0xFF, u32)
+#define KBASE_HWCNT_READER_SET_INTERVAL    _IOW(KBASE_HWCNT_READER, 0x30, __u32)
+#define KBASE_HWCNT_READER_ENABLE_EVENT    _IOW(KBASE_HWCNT_READER, 0x40, __u32)
+#define KBASE_HWCNT_READER_DISABLE_EVENT   _IOW(KBASE_HWCNT_READER, 0x41, __u32)
+#define KBASE_HWCNT_READER_GET_API_VERSION _IOW(KBASE_HWCNT_READER, 0xFF, __u32)
 #define KBASE_HWCNT_READER_GET_API_VERSION_WITH_FEATURES \
 		_IOW(KBASE_HWCNT_READER, 0xFF, \
 		     struct kbase_hwcnt_reader_api_version)
@@ -54,8 +54,8 @@
  * @shader_cores:  the cycles that have elapsed on the GPU shader cores
  */
 struct kbase_hwcnt_reader_metadata_cycles {
-	u64 top;
-	u64 shader_cores;
+	__u64 top;
+	__u64 shader_cores;
 };
 
 /**
@@ -66,9 +66,9 @@ struct kbase_hwcnt_reader_metadata_cycles {
  * @cycles:     the GPU cycles that occurred since the last sample
  */
 struct kbase_hwcnt_reader_metadata {
-	u64 timestamp;
-	u32 event_id;
-	u32 buffer_idx;
+	__u64 timestamp;
+	__u32 event_id;
+	__u32 buffer_idx;
 	struct kbase_hwcnt_reader_metadata_cycles cycles;
 };
 
@@ -85,22 +85,21 @@ enum base_hwcnt_reader_event {
 	BASE_HWCNT_READER_EVENT_PERIODIC,
 	BASE_HWCNT_READER_EVENT_PREJOB,
 	BASE_HWCNT_READER_EVENT_POSTJOB,
-
 	BASE_HWCNT_READER_EVENT_COUNT
 };
 
+#define KBASE_HWCNT_READER_API_VERSION_NO_FEATURE (0)
+#define KBASE_HWCNT_READER_API_VERSION_FEATURE_CYCLES_TOP (1 << 0)
+#define KBASE_HWCNT_READER_API_VERSION_FEATURE_CYCLES_SHADER_CORES (1 << 1)
 /**
  * struct kbase_hwcnt_reader_api_version - hwcnt reader API version
- * @versoin:  API version
+ * @version:  API version
  * @features: available features in this API version
  */
-#define KBASE_HWCNT_READER_API_VERSION_NO_FEATURE                  (0)
-#define KBASE_HWCNT_READER_API_VERSION_FEATURE_CYCLES_TOP          (1 << 0)
-#define KBASE_HWCNT_READER_API_VERSION_FEATURE_CYCLES_SHADER_CORES (1 << 1)
 struct kbase_hwcnt_reader_api_version {
-	u32 version;
-	u32 features;
+	__u32 version;
+	__u32 features;
 };
 
-#endif /* _KBASE_HWCNT_READER_H_ */
+#endif /* _UAPI_KBASE_HWCNT_READER_H_ */
 
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_ioctl.h b/include/uapi/gpu/arm/bifrost/mali_kbase_ioctl.h
similarity index 84%
rename from drivers/gpu/arm/bifrost/mali_kbase_ioctl.h
rename to include/uapi/gpu/arm/bifrost/mali_kbase_ioctl.h
index fed45100b4be..5ca528a2effe 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_ioctl.h
+++ b/include/uapi/gpu/arm/bifrost/mali_kbase_ioctl.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2017-2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2017-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,12 +17,10 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-#ifndef _KBASE_IOCTL_H_
-#define _KBASE_IOCTL_H_
+#ifndef _UAPI_KBASE_IOCTL_H_
+#define _UAPI_KBASE_IOCTL_H_
 
 #ifdef __cpluscplus
 extern "C" {
@@ -65,16 +64,16 @@ struct kbase_ioctl_set_flags {
  * @flags may be used in the future to request a different format for the
  * buffer. With @flags == 0 the following format is used.
  *
- * The buffer will be filled with pairs of values, a u32 key identifying the
+ * The buffer will be filled with pairs of values, a __u32 key identifying the
  * property followed by the value. The size of the value is identified using
  * the bottom bits of the key. The value then immediately followed the key and
  * is tightly packed (there is no padding). All keys and values are
  * little-endian.
  *
- * 00 = u8
- * 01 = u16
- * 10 = u32
- * 11 = u64
+ * 00 = __u8
+ * 01 = __u16
+ * 10 = __u32
+ * 11 = __u64
  */
 struct kbase_ioctl_get_gpuprops {
 	__u64 buffer;
@@ -87,22 +86,20 @@ struct kbase_ioctl_get_gpuprops {
 
 /**
  * union kbase_ioctl_mem_alloc - Allocate memory on the GPU
- *
- * @va_pages: The number of pages of virtual address space to reserve
- * @commit_pages: The number of physical pages to allocate
- * @extent: The number of extra pages to allocate on each GPU fault which grows
- *          the region
- * @flags: Flags
- * @gpu_va: The GPU virtual address which is allocated
- *
  * @in: Input parameters
+ * @in.va_pages: The number of pages of virtual address space to reserve
+ * @in.commit_pages: The number of physical pages to allocate
+ * @in.extension: The number of extra pages to allocate on each GPU fault which grows the region
+ * @in.flags: Flags
  * @out: Output parameters
+ * @out.flags: Flags
+ * @out.gpu_va: The GPU virtual address which is allocated
  */
 union kbase_ioctl_mem_alloc {
 	struct {
 		__u64 va_pages;
 		__u64 commit_pages;
-		__u64 extent;
+		__u64 extension;
 		__u64 flags;
 	} in;
 	struct {
@@ -116,14 +113,13 @@ union kbase_ioctl_mem_alloc {
 
 /**
  * struct kbase_ioctl_mem_query - Query properties of a GPU memory region
- * @gpu_addr: A GPU address contained within the region
- * @query: The type of query
- * @value: The result of the query
- *
- * Use a %KBASE_MEM_QUERY_xxx flag as input for @query.
- *
  * @in: Input parameters
+ * @in.gpu_addr: A GPU address contained within the region
+ * @in.query: The type of query
  * @out: Output parameters
+ * @out.value: The result of the query
+ *
+ * Use a %KBASE_MEM_QUERY_xxx flag as input for @query.
  */
 union kbase_ioctl_mem_query {
 	struct {
@@ -138,9 +134,9 @@ union kbase_ioctl_mem_query {
 #define KBASE_IOCTL_MEM_QUERY \
 	_IOWR(KBASE_IOCTL_TYPE, 6, union kbase_ioctl_mem_query)
 
-#define KBASE_MEM_QUERY_COMMIT_SIZE	((u64)1)
-#define KBASE_MEM_QUERY_VA_SIZE		((u64)2)
-#define KBASE_MEM_QUERY_FLAGS		((u64)3)
+#define KBASE_MEM_QUERY_COMMIT_SIZE	((__u64)1)
+#define KBASE_MEM_QUERY_VA_SIZE		((__u64)2)
+#define KBASE_MEM_QUERY_FLAGS		((__u64)3)
 
 /**
  * struct kbase_ioctl_mem_free - Free a memory region
@@ -343,13 +339,12 @@ struct kbase_ioctl_mem_sync {
 /**
  * union kbase_ioctl_mem_find_cpu_offset - Find the offset of a CPU pointer
  *
- * @gpu_addr: The GPU address of the memory region
- * @cpu_addr: The CPU address to locate
- * @size: A size in bytes to validate is contained within the region
- * @offset: The offset from the start of the memory region to @cpu_addr
- *
  * @in: Input parameters
+ * @in.gpu_addr: The GPU address of the memory region
+ * @in.cpu_addr: The CPU address to locate
+ * @in.size: A size in bytes to validate is contained within the region
  * @out: Output parameters
+ * @out.offset: The offset from the start of the memory region to @cpu_addr
  */
 union kbase_ioctl_mem_find_cpu_offset {
 	struct {
@@ -414,15 +409,15 @@ struct kbase_ioctl_mem_commit {
 
 /**
  * union kbase_ioctl_mem_alias - Create an alias of memory regions
- * @flags: Flags, see BASE_MEM_xxx
- * @stride: Bytes between start of each memory region
- * @nents: The number of regions to pack together into the alias
- * @aliasing_info: Pointer to an array of struct base_mem_aliasing_info
- * @gpu_va: Address of the new alias
- * @va_pages: Size of the new alias
- *
  * @in: Input parameters
+ * @in.flags: Flags, see BASE_MEM_xxx
+ * @in.stride: Bytes between start of each memory region
+ * @in.nents: The number of regions to pack together into the alias
+ * @in.aliasing_info: Pointer to an array of struct base_mem_aliasing_info
  * @out: Output parameters
+ * @out.flags: Flags, see BASE_MEM_xxx
+ * @out.gpu_va: Address of the new alias
+ * @out.va_pages: Size of the new alias
  */
 union kbase_ioctl_mem_alias {
 	struct {
@@ -443,15 +438,15 @@ union kbase_ioctl_mem_alias {
 
 /**
  * union kbase_ioctl_mem_import - Import memory for use by the GPU
- * @flags: Flags, see BASE_MEM_xxx
- * @phandle: Handle to the external memory
- * @type: Type of external memory, see base_mem_import_type
- * @padding: Amount of extra VA pages to append to the imported buffer
- * @gpu_va: Address of the new alias
- * @va_pages: Size of the new alias
- *
  * @in: Input parameters
+ * @in.flags: Flags, see BASE_MEM_xxx
+ * @in.phandle: Handle to the external memory
+ * @in.type: Type of external memory, see base_mem_import_type
+ * @in.padding: Amount of extra VA pages to append to the imported buffer
  * @out: Output parameters
+ * @out.flags: Flags, see BASE_MEM_xxx
+ * @out.gpu_va: Address of the new alias
+ * @out.va_pages: Size of the new alias
  */
 union kbase_ioctl_mem_import {
 	struct {
@@ -534,7 +529,7 @@ struct kbase_ioctl_mem_profile_add {
 /**
  * struct kbase_ioctl_sticky_resource_map - Permanently map an external resource
  * @count: Number of resources
- * @address: Array of u64 GPU addresses of the external resources to map
+ * @address: Array of __u64 GPU addresses of the external resources to map
  */
 struct kbase_ioctl_sticky_resource_map {
 	__u64 count;
@@ -548,7 +543,7 @@ struct kbase_ioctl_sticky_resource_map {
  * struct kbase_ioctl_sticky_resource_map - Unmap a resource mapped which was
  *                                          previously permanently mapped
  * @count: Number of resources
- * @address: Array of u64 GPU addresses of the external resources to unmap
+ * @address: Array of __u64 GPU addresses of the external resources to unmap
  */
 struct kbase_ioctl_sticky_resource_unmap {
 	__u64 count;
@@ -564,15 +559,13 @@ struct kbase_ioctl_sticky_resource_unmap {
  *                                                   the given gpu address and
  *                                                   the offset of that address
  *                                                   into the region
- *
- * @gpu_addr: GPU virtual address
- * @size: Size in bytes within the region
- * @start: Address of the beginning of the memory region enclosing @gpu_addr
- *         for the length of @offset bytes
- * @offset: The offset from the start of the memory region to @gpu_addr
- *
  * @in: Input parameters
+ * @in.gpu_addr: GPU virtual address
+ * @in.size: Size in bytes within the region
  * @out: Output parameters
+ * @out.start: Address of the beginning of the memory region enclosing @gpu_addr
+ *             for the length of @offset bytes
+ * @out.offset: The offset from the start of the memory region to @gpu_addr
  */
 union kbase_ioctl_mem_find_gpu_start_and_offset {
 	struct {
@@ -588,7 +581,6 @@ union kbase_ioctl_mem_find_gpu_start_and_offset {
 #define KBASE_IOCTL_MEM_FIND_GPU_START_AND_OFFSET \
 	_IOWR(KBASE_IOCTL_TYPE, 31, union kbase_ioctl_mem_find_gpu_start_and_offset)
 
-
 #define KBASE_IOCTL_CINSTR_GWT_START \
 	_IO(KBASE_IOCTL_TYPE, 33)
 
@@ -597,14 +589,15 @@ union kbase_ioctl_mem_find_gpu_start_and_offset {
 
 /**
  * union kbase_ioctl_gwt_dump - Used to collect all GPU write fault addresses.
- * @addr_buffer: Address of buffer to hold addresses of gpu modified areas.
- * @size_buffer: Address of buffer to hold size of modified areas (in pages)
- * @len: Number of addresses the buffers can hold.
- * @more_data_available: Status indicating if more addresses are available.
- * @no_of_addr_collected: Number of addresses collected into addr_buffer.
- *
  * @in: Input parameters
+ * @in.addr_buffer: Address of buffer to hold addresses of gpu modified areas.
+ * @in.size_buffer: Address of buffer to hold size of modified areas (in pages)
+ * @in.len: Number of addresses the buffers can hold.
+ * @in.padding: padding
  * @out: Output parameters
+ * @out.no_of_addr_collected: Number of addresses collected into addr_buffer.
+ * @out.more_data_available: Status indicating if more addresses are available.
+ * @out.padding: padding
  *
  * This structure is used when performing a call to dump GPU write fault
  * addresses.
@@ -642,18 +635,15 @@ struct kbase_ioctl_mem_exec_init {
 /**
  * union kbase_ioctl_get_cpu_gpu_timeinfo - Request zero or more types of
  *                                          cpu/gpu time (counter values)
- *
- * @request_flags: Bit-flags indicating the requested types.
- * @paddings:      Unused, size alignment matching the out.
- * @sec:           Integer field of the monotonic time, unit in seconds.
- * @nsec:          Fractional sec of the monotonic time, in nano-seconds.
- * @padding:       Unused, for u64 alignment
- * @timestamp:     System wide timestamp (counter) value.
- * @cycle_counter: GPU cycle counter value.
- *
  * @in: Input parameters
+ * @in.request_flags: Bit-flags indicating the requested types.
+ * @in.paddings:      Unused, size alignment matching the out.
  * @out: Output parameters
- *
+ * @out.sec:           Integer field of the monotonic time, unit in seconds.
+ * @out.nsec:          Fractional sec of the monotonic time, in nano-seconds.
+ * @out.padding:       Unused, for __u64 alignment
+ * @out.timestamp:     System wide timestamp (counter) value.
+ * @out.cycle_counter: GPU cycle counter value.
  */
 union kbase_ioctl_get_cpu_gpu_timeinfo {
 	struct {
@@ -672,6 +662,31 @@ union kbase_ioctl_get_cpu_gpu_timeinfo {
 #define KBASE_IOCTL_GET_CPU_GPU_TIMEINFO \
 	_IOWR(KBASE_IOCTL_TYPE, 50, union kbase_ioctl_get_cpu_gpu_timeinfo)
 
+/**
+ * struct kbase_ioctl_context_priority_check - Check the max possible priority
+ * @priority: Input priority & output priority
+ */
+
+struct kbase_ioctl_context_priority_check {
+	__u8 priority;
+};
+
+#define KBASE_IOCTL_CONTEXT_PRIORITY_CHECK \
+	_IOWR(KBASE_IOCTL_TYPE, 54, struct kbase_ioctl_context_priority_check)
+
+/**
+ * struct kbase_ioctl_set_limited_core_count - Set the limited core count.
+ *
+ * @max_core_count: Maximum core count
+ */
+struct kbase_ioctl_set_limited_core_count {
+	__u8 max_core_count;
+};
+
+#define KBASE_IOCTL_SET_LIMITED_CORE_COUNT \
+	_IOW(KBASE_IOCTL_TYPE, 55, struct kbase_ioctl_set_limited_core_count)
+
+
 /***************
  * test ioctls *
  ***************/
@@ -682,23 +697,6 @@ union kbase_ioctl_get_cpu_gpu_timeinfo {
 
 #define KBASE_IOCTL_TEST_TYPE (KBASE_IOCTL_TYPE + 1)
 
-/**
- * struct kbase_ioctl_tlstream_test - Start a timeline stream test
- *
- * @tpw_count: number of trace point writers in each context
- * @msg_delay: time delay between tracepoints from one writer in milliseconds
- * @msg_count: number of trace points written by one writer
- * @aux_msg:   if non-zero aux messages will be included
- */
-struct kbase_ioctl_tlstream_test {
-	__u32 tpw_count;
-	__u32 msg_delay;
-	__u32 msg_count;
-	__u32 aux_msg;
-};
-
-#define KBASE_IOCTL_TLSTREAM_TEST \
-	_IOW(KBASE_IOCTL_TEST_TYPE, 1, struct kbase_ioctl_tlstream_test)
 
 /**
  * struct kbase_ioctl_tlstream_stats - Read tlstream stats for test purposes
@@ -826,13 +824,13 @@ struct kbase_ioctl_tlstream_stats {
 #define KBASE_GPUPROP_TEXTURE_FEATURES_3		80
 #define KBASE_GPUPROP_RAW_TEXTURE_FEATURES_3		81
 
-#define KBASE_GPUPROP_NUM_EXEC_ENGINES                  82
+#define KBASE_GPUPROP_NUM_EXEC_ENGINES			82
 
 #define KBASE_GPUPROP_RAW_THREAD_TLS_ALLOC		83
 #define KBASE_GPUPROP_TLS_ALLOC				84
-
+#define KBASE_GPUPROP_RAW_GPU_FEATURES			85
 #ifdef __cpluscplus
 }
 #endif
 
-#endif
+#endif /* _UAPI_KBASE_IOCTL_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_kbase_kinstr_jm_reader.h b/include/uapi/gpu/arm/bifrost/mali_kbase_kinstr_jm_reader.h
similarity index 91%
rename from drivers/gpu/arm/bifrost/mali_kbase_kinstr_jm_reader.h
rename to include/uapi/gpu/arm/bifrost/mali_kbase_kinstr_jm_reader.h
index e267e6bc44de..cb782bde7584 100644
--- a/drivers/gpu/arm/bifrost/mali_kbase_kinstr_jm_reader.h
+++ b/include/uapi/gpu/arm/bifrost/mali_kbase_kinstr_jm_reader.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2020 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,8 +17,6 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
 /*
@@ -35,8 +34,8 @@
  *    8. Close the file descriptor
  */
 
-#ifndef _KBASE_KINSTR_JM_READER_H_
-#define _KBASE_KINSTR_JM_READER_H_
+#ifndef _UAPI_KBASE_KINSTR_JM_READER_H_
+#define _UAPI_KBASE_KINSTR_JM_READER_H_
 
 /**
  * enum kbase_kinstr_jm_reader_atom_state - Determines the work state of an atom
@@ -67,4 +66,4 @@ enum kbase_kinstr_jm_reader_atom_state {
 	KBASE_KINSTR_JM_READER_ATOM_STATE_COUNT
 };
 
-#endif /* _KBASE_KINSTR_JM_READER_H_ */
+#endif /* _UAPI_KBASE_KINSTR_JM_READER_H_ */
diff --git a/drivers/gpu/arm/bifrost/mali_uk.h b/include/uapi/gpu/arm/bifrost/mali_uk.h
similarity index 69%
rename from drivers/gpu/arm/bifrost/mali_uk.h
rename to include/uapi/gpu/arm/bifrost/mali_uk.h
index 701f3909042f..81cbb9e7c047 100644
--- a/drivers/gpu/arm/bifrost/mali_uk.h
+++ b/include/uapi/gpu/arm/bifrost/mali_uk.h
@@ -1,11 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
 /*
  *
- * (C) COPYRIGHT 2010, 2012-2015, 2018 ARM Limited. All rights reserved.
+ * (C) COPYRIGHT 2010, 2012-2015, 2018, 2020-2021 ARM Limited. All rights reserved.
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
  * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
+ * of such GNU license.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,32 +17,22 @@
  * along with this program; if not, you can access it online at
  * http://www.gnu.org/licenses/gpl-2.0.html.
  *
- * SPDX-License-Identifier: GPL-2.0
- *
  */
 
-
-
 /**
- * @file mali_uk.h
  * Types and definitions that are common across OSs for both the user
  * and kernel side of the User-Kernel interface.
  */
 
-#ifndef _UK_H_
-#define _UK_H_
+#ifndef _UAPI_UK_H_
+#define _UAPI_UK_H_
 
 #ifdef __cplusplus
 extern "C" {
-#endif				/* __cplusplus */
-
-/**
- * @addtogroup base_api
- * @{
- */
+#endif /* __cplusplus */
 
 /**
- * @defgroup uk_api User-Kernel Interface API
+ * DOC: uk_api User-Kernel Interface API
  *
  * The User-Kernel Interface abstracts the communication mechanism between the user and kernel-side code of device
  * drivers developed as part of the Midgard DDK. Currently that includes the Base driver.
@@ -51,12 +42,16 @@ extern "C" {
  *
  * This API is internal to the Midgard DDK and is not exposed to any applications.
  *
- * @{
  */
 
 /**
- * These are identifiers for kernel-side drivers implementing a UK interface, aka UKK clients. The
- * UK module maps this to an OS specific device name, e.g. "gpu_base" -> "GPU0:". Specify this
+ * enum uk_client_id - These are identifiers for kernel-side drivers
+ * implementing a UK interface, aka UKK clients.
+ * @UK_CLIENT_MALI_T600_BASE: Value used to identify the Base driver UK client.
+ * @UK_CLIENT_COUNT:          The number of uk clients supported. This must be
+ *                            the last member of the enum
+ *
+ * The UK module maps this to an OS specific device name, e.g. "gpu_base" -> "GPU0:". Specify this
  * identifier to select a UKK client to the uku_open() function.
  *
  * When a new UKK client driver is created a new identifier needs to be added to the uk_client_id
@@ -65,20 +60,11 @@ extern "C" {
  *
  */
 enum uk_client_id {
-	/**
-	 * Value used to identify the Base driver UK client.
-	 */
 	UK_CLIENT_MALI_T600_BASE,
-
-	/** The number of uk clients supported. This must be the last member of the enum */
 	UK_CLIENT_COUNT
 };
 
-/** @} end group uk_api */
-
-/** @} *//* end group base_api */
-
 #ifdef __cplusplus
 }
-#endif				/* __cplusplus */
-#endif				/* _UK_H_ */
+#endif /* __cplusplus */
+#endif /* _UAPI_UK_H_ */

commit 50bd39f72778cf0f7b295d650d1303dd4bdbb5c6
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Fri Jul 9 18:23:11 2021 +0800

    drm: rockchip: use dma-buf-cache
    
    Change-Id: I6a34a5a4f33e54b7459461bcfa84f03a831d2f65
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index fc268eefd211..0cd9d48dbff5 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -21,7 +21,7 @@
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_of.h>
 #include <linux/devfreq.h>
-#include <linux/dma-buf.h>
+#include <linux/dma-buf-cache.h>
 #include <linux/dma-mapping.h>
 #include <linux/dma-iommu.h>
 #include <linux/genalloc.h>
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
index d456b223f143..a0595561f5ea 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
@@ -17,7 +17,7 @@
 #include <drm/drm_gem.h>
 #include <drm/drm_vma_manager.h>
 
-#include <linux/dma-buf.h>
+#include <linux/dma-buf-cache.h>
 #include <linux/genalloc.h>
 #include <linux/iommu.h>
 #include <linux/pagemap.h>

commit 36514da674cb71553472a66704eae5981035c44c
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Fri Jul 9 10:00:21 2021 +0800

    dma-buf: support to cache dma-buf-attachment
    
    This patch try to fix this issue by caching the dma-buf attachments and
    stores the cache list to dtor_data of dma-buf structor. The dma-buf
    attach with cache will try to find cached attachment first and return
    the valid instance.
    
    This patch also store the deattch operation to dtor of dma-buf structor
    by dma_buf_set_destructor.
    
    Change-Id: I4778c3328825f6c04f5d2608994e62fe3478bf1b
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/dma-buf/Kconfig b/drivers/dma-buf/Kconfig
index cc70e8bee874..414a05a8b7aa 100644
--- a/drivers/dma-buf/Kconfig
+++ b/drivers/dma-buf/Kconfig
@@ -1,5 +1,12 @@
 menu "DMABUF options"
 
+config DMABUF_CACHE
+	bool "DMABUF cache attachment"
+	default n
+	help
+	  This option support to store attachments in a list and destroy them by
+	  set to a callback list in the dtor of dma-buf.
+
 config SYNC_FILE
 	bool "Explicit Synchronization Framework"
 	default n
diff --git a/drivers/dma-buf/Makefile b/drivers/dma-buf/Makefile
index c33bf8863147..87048e5d5aba 100644
--- a/drivers/dma-buf/Makefile
+++ b/drivers/dma-buf/Makefile
@@ -1,3 +1,4 @@
 obj-y := dma-buf.o dma-fence.o dma-fence-array.o reservation.o seqno-fence.o
+obj-$(CONFIG_DMABUF_CACHE)	+= dma-buf-cache.o
 obj-$(CONFIG_SYNC_FILE)		+= sync_file.o
 obj-$(CONFIG_SW_SYNC)		+= sw_sync.o sync_debug.o
diff --git a/drivers/dma-buf/dma-buf-cache.c b/drivers/dma-buf/dma-buf-cache.c
new file mode 100644
index 000000000000..79f35d359241
--- /dev/null
+++ b/drivers/dma-buf/dma-buf-cache.c
@@ -0,0 +1,171 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co. Ltd.
+ */
+
+#include <linux/slab.h>
+#include <linux/dma-buf.h>
+#undef CONFIG_DMABUF_CACHE
+#include <linux/dma-buf-cache.h>
+
+struct dma_buf_cache_list {
+	struct list_head head;
+	struct mutex lock;
+};
+
+struct dma_buf_cache {
+	struct list_head list;
+	struct dma_buf_attachment *attach;
+	enum dma_data_direction direction;
+	struct sg_table *sg_table;
+};
+
+static int dma_buf_cache_destructor(struct dma_buf *dmabuf, void *dtor_data)
+{
+	struct dma_buf_cache_list *data;
+	struct dma_buf_cache *cache, *tmp;
+
+	data = dmabuf->dtor_data;
+
+	mutex_lock(&data->lock);
+	list_for_each_entry_safe(cache, tmp, &data->head, list) {
+		if (cache->sg_table)
+			dma_buf_unmap_attachment(cache->attach,
+						 cache->sg_table,
+						 cache->direction);
+
+		dma_buf_detach(dmabuf, cache->attach);
+		list_del(&cache->list);
+		kfree(cache);
+
+	}
+	mutex_unlock(&data->lock);
+
+	kfree(data);
+	return 0;
+}
+
+static struct dma_buf_cache *
+dma_buf_cache_get_cache(struct dma_buf_attachment *attach)
+{
+	struct dma_buf_cache_list *data;
+	struct dma_buf_cache *cache;
+	struct dma_buf *dmabuf = attach->dmabuf;
+
+	if (dmabuf->dtor != dma_buf_cache_destructor)
+		return NULL;
+
+	data = dmabuf->dtor_data;
+
+	mutex_lock(&data->lock);
+	list_for_each_entry(cache, &data->head, list) {
+		if (cache->attach == attach) {
+			mutex_unlock(&data->lock);
+			return cache;
+		}
+	}
+	mutex_unlock(&data->lock);
+
+	return NULL;
+}
+
+void dma_buf_cache_detach(struct dma_buf *dmabuf,
+			  struct dma_buf_attachment *attach)
+{
+	struct dma_buf_cache *cache;
+
+	cache = dma_buf_cache_get_cache(attach);
+	if (!cache)
+		dma_buf_detach(dmabuf, attach);
+}
+EXPORT_SYMBOL(dma_buf_cache_detach);
+
+struct dma_buf_attachment *dma_buf_cache_attach(struct dma_buf *dmabuf,
+						struct device *dev)
+{
+	struct dma_buf_cache_list *data;
+	struct dma_buf_cache *cache;
+
+	if (!dmabuf->dtor) {
+		data = kzalloc(sizeof(*data), GFP_KERNEL);
+		if (!data)
+			return ERR_PTR(-ENOMEM);
+
+		mutex_init(&data->lock);
+		INIT_LIST_HEAD(&data->head);
+
+		dma_buf_set_destructor(dmabuf, dma_buf_cache_destructor, data);
+	}
+
+	if (dmabuf->dtor && dmabuf->dtor != dma_buf_cache_destructor)
+		return dma_buf_attach(dmabuf, dev);
+
+	data = dmabuf->dtor_data;
+
+	mutex_lock(&data->lock);
+	list_for_each_entry(cache, &data->head, list) {
+		if (cache->attach->dev == dev) {
+			/* Already attached */
+			mutex_unlock(&data->lock);
+			return cache->attach;
+		}
+	}
+	mutex_unlock(&data->lock);
+
+	cache = kzalloc(sizeof(*cache), GFP_KERNEL);
+	if (!cache)
+		return ERR_PTR(-ENOMEM);
+
+	/* Cache attachment */
+	cache->attach = dma_buf_attach(dmabuf, dev);
+
+	mutex_lock(&data->lock);
+	list_add(&cache->list, &data->head);
+	mutex_unlock(&data->lock);
+
+	return cache->attach;
+}
+EXPORT_SYMBOL(dma_buf_cache_attach);
+
+void dma_buf_cache_unmap_attachment(struct dma_buf_attachment *attach,
+				    struct sg_table *sg_table,
+				    enum dma_data_direction direction)
+{
+	struct dma_buf_cache *cache;
+
+	cache = dma_buf_cache_get_cache(attach);
+	if (!cache)
+		dma_buf_unmap_attachment(attach, sg_table, direction);
+}
+EXPORT_SYMBOL(dma_buf_cache_unmap_attachment);
+
+struct sg_table *dma_buf_cache_map_attachment(struct dma_buf_attachment *attach,
+					      enum dma_data_direction direction)
+{
+	struct dma_buf_cache *cache;
+
+	cache = dma_buf_cache_get_cache(attach);
+	if (!cache)
+		return dma_buf_map_attachment(attach, direction);
+
+	if (cache->sg_table) {
+		/* Already mapped */
+		if (cache->direction == direction)
+			return cache->sg_table;
+
+		/* Different directions */
+		dma_buf_unmap_attachment(attach, cache->sg_table,
+					 cache->direction);
+
+	}
+
+	/* Cache map */
+	cache->sg_table = dma_buf_map_attachment(attach, direction);
+	cache->direction = direction;
+
+	if (!cache->sg_table)
+		return ERR_PTR(-ENOMEM);
+
+	return cache->sg_table;
+}
+EXPORT_SYMBOL(dma_buf_cache_map_attachment);
diff --git a/include/linux/dma-buf-cache.h b/include/linux/dma-buf-cache.h
new file mode 100644
index 000000000000..d97545560990
--- /dev/null
+++ b/include/linux/dma-buf-cache.h
@@ -0,0 +1,32 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co. Ltd.
+ */
+#ifndef _LINUX_DMA_BUF_CACHE_H
+#define _LINUX_DMA_BUF_CACHE_H
+
+#include <linux/dma-buf.h>
+
+extern void dma_buf_cache_detach(struct dma_buf *dmabuf,
+				 struct dma_buf_attachment *attach);
+
+extern void dma_buf_cache_unmap_attachment(struct dma_buf_attachment *attach,
+					   struct sg_table *sg_table,
+					   enum dma_data_direction direction);
+
+extern struct dma_buf_attachment *
+dma_buf_cache_attach(struct dma_buf *dmabuf, struct device *dev);
+
+extern struct sg_table *
+dma_buf_cache_map_attachment(struct dma_buf_attachment *attach,
+			     enum dma_data_direction direction);
+
+#ifdef CONFIG_DMABUF_CACHE
+/* Replace dma-buf apis to cached apis */
+#define dma_buf_attach dma_buf_cache_attach
+#define dma_buf_detach dma_buf_cache_detach
+#define dma_buf_map_attachment dma_buf_cache_map_attachment
+#define dma_buf_unmap_attachment dma_buf_cache_unmap_attachment
+#endif
+
+#endif /* _LINUX_DMA_BUF_CACHE_H */

commit 38ec06730e44b2166e87fecca9e36380080801ac
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Wed Oct 27 09:53:15 2021 +0200

    Linux 4.19.214
    
    Link: https://lore.kernel.org/r/20211025190926.680827862@linuxfoundation.org
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index ac86ad939880..358b07946bd1 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 213
+SUBLEVEL = 214
 EXTRAVERSION =
 NAME = "People's Front"
 

commit 0b7d55ca605e611aceeadf7c29c75808faae951a
Author: Nick Desaulniers <ndesaulniers@google.com>
Date:   Wed Sep 8 19:25:59 2021 +0100

    ARM: 9122/1: select HAVE_FUTEX_CMPXCHG
    
    commit 9d417cbe36eee7afdd85c2e871685f8dab7c2dba upstream.
    
    tglx notes:
      This function [futex_detect_cmpxchg] is only needed when an
      architecture has to runtime discover whether the CPU supports it or
      not.  ARM has unconditional support for this, so the obvious thing to
      do is the below.
    
    Fixes linkage failure from Clang randconfigs:
    kernel/futex.o:(.text.fixup+0x5c): relocation truncated to fit: R_ARM_JUMP24 against `.init.text'
    and boot failures for CONFIG_THUMB2_KERNEL.
    
    Link: https://github.com/ClangBuiltLinux/linux/issues/325
    
    Comments from Nick Desaulniers:
    
     See-also: 03b8c7b623c8 ("futex: Allow architectures to skip
     futex_atomic_cmpxchg_inatomic() test")
    
    Reported-by: Arnd Bergmann <arnd@arndb.de>
    Reported-by: Nathan Chancellor <nathan@kernel.org>
    Suggested-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
    Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Nathan Chancellor <nathan@kernel.org>
    Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
    Cc: stable@vger.kernel.org # v3.14+
    Reviewed-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 1877da816f65..d89d013f586c 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -70,6 +70,7 @@ config ARM
 	select HAVE_FTRACE_MCOUNT_RECORD if (!XIP_KERNEL)
 	select HAVE_FUNCTION_GRAPH_TRACER if (!THUMB2_KERNEL)
 	select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
+	select HAVE_FUTEX_CMPXCHG if FUTEX
 	select HAVE_GCC_PLUGINS
 	select HAVE_GENERIC_DMA_COHERENT
 	select HAVE_HW_BREAKPOINT if (PERF_EVENTS && (CPU_V6 || CPU_V6K || CPU_V7))

commit 3de1ed125fc4c35bf7abb08260646100a6dcb04e
Author: Steven Rostedt (VMware) <rostedt@goodmis.org>
Date:   Mon Oct 18 15:44:12 2021 -0400

    tracing: Have all levels of checks prevent recursion
    
    commit ed65df63a39a3f6ed04f7258de8b6789e5021c18 upstream.
    
    While writing an email explaining the "bit = 0" logic for a discussion on
    making ftrace_test_recursion_trylock() disable preemption, I discovered a
    path that makes the "not do the logic if bit is zero" unsafe.
    
    The recursion logic is done in hot paths like the function tracer. Thus,
    any code executed causes noticeable overhead. Thus, tricks are done to try
    to limit the amount of code executed. This included the recursion testing
    logic.
    
    Having recursion testing is important, as there are many paths that can
    end up in an infinite recursion cycle when tracing every function in the
    kernel. Thus protection is needed to prevent that from happening.
    
    Because it is OK to recurse due to different running context levels (e.g.
    an interrupt preempts a trace, and then a trace occurs in the interrupt
    handler), a set of bits are used to know which context one is in (normal,
    softirq, irq and NMI). If a recursion occurs in the same level, it is
    prevented*.
    
    Then there are infrastructure levels of recursion as well. When more than
    one callback is attached to the same function to trace, it calls a loop
    function to iterate over all the callbacks. Both the callbacks and the
    loop function have recursion protection. The callbacks use the
    "ftrace_test_recursion_trylock()" which has a "function" set of context
    bits to test, and the loop function calls the internal
    trace_test_and_set_recursion() directly, with an "internal" set of bits.
    
    If an architecture does not implement all the features supported by ftrace
    then the callbacks are never called directly, and the loop function is
    called instead, which will implement the features of ftrace.
    
    Since both the loop function and the callbacks do recursion protection, it
    was seemed unnecessary to do it in both locations. Thus, a trick was made
    to have the internal set of recursion bits at a more significant bit
    location than the function bits. Then, if any of the higher bits were set,
    the logic of the function bits could be skipped, as any new recursion
    would first have to go through the loop function.
    
    This is true for architectures that do not support all the ftrace
    features, because all functions being traced must first go through the
    loop function before going to the callbacks. But this is not true for
    architectures that support all the ftrace features. That's because the
    loop function could be called due to two callbacks attached to the same
    function, but then a recursion function inside the callback could be
    called that does not share any other callback, and it will be called
    directly.
    
    i.e.
    
     traced_function_1: [ more than one callback tracing it ]
       call loop_func
    
     loop_func:
       trace_recursion set internal bit
       call callback
    
     callback:
       trace_recursion [ skipped because internal bit is set, return 0 ]
       call traced_function_2
    
     traced_function_2: [ only traced by above callback ]
       call callback
    
     callback:
       trace_recursion [ skipped because internal bit is set, return 0 ]
       call traced_function_2
    
     [ wash, rinse, repeat, BOOM! out of shampoo! ]
    
    Thus, the "bit == 0 skip" trick is not safe, unless the loop function is
    call for all functions.
    
    Since we want to encourage architectures to implement all ftrace features,
    having them slow down due to this extra logic may encourage the
    maintainers to update to the latest ftrace features. And because this
    logic is only safe for them, remove it completely.
    
     [*] There is on layer of recursion that is allowed, and that is to allow
         for the transition between interrupt context (normal -> softirq ->
         irq -> NMI), because a trace may occur before the context update is
         visible to the trace recursion logic.
    
    Link: https://lore.kernel.org/all/609b565a-ed6e-a1da-f025-166691b5d994@linux.alibaba.com/
    Link: https://lkml.kernel.org/r/20211018154412.09fcad3c@gandalf.local.home
    
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Petr Mladek <pmladek@suse.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: "James E.J. Bottomley" <James.Bottomley@hansenpartnership.com>
    Cc: Helge Deller <deller@gmx.de>
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Paul Walmsley <paul.walmsley@sifive.com>
    Cc: Palmer Dabbelt <palmer@dabbelt.com>
    Cc: Albert Ou <aou@eecs.berkeley.edu>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Josh Poimboeuf <jpoimboe@redhat.com>
    Cc: Jiri Kosina <jikos@kernel.org>
    Cc: Miroslav Benes <mbenes@suse.cz>
    Cc: Joe Lawrence <joe.lawrence@redhat.com>
    Cc: Colin Ian King <colin.king@canonical.com>
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: "Peter Zijlstra (Intel)" <peterz@infradead.org>
    Cc: Nicholas Piggin <npiggin@gmail.com>
    Cc: Jisheng Zhang <jszhang@kernel.org>
    Cc: =?utf-8?b?546L6LSH?= <yun.wang@linux.alibaba.com>
    Cc: Guo Ren <guoren@kernel.org>
    Cc: stable@vger.kernel.org
    Fixes: edc15cafcbfa3 ("tracing: Avoid unnecessary multiple recursion checks")
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index c5c8aafa29cf..998d141488a9 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -6327,7 +6327,7 @@ __ftrace_ops_list_func(unsigned long ip, unsigned long parent_ip,
 	struct ftrace_ops *op;
 	int bit;
 
-	bit = trace_test_and_set_recursion(TRACE_LIST_START, TRACE_LIST_MAX);
+	bit = trace_test_and_set_recursion(TRACE_LIST_START);
 	if (bit < 0)
 		return;
 
@@ -6399,7 +6399,7 @@ static void ftrace_ops_assist_func(unsigned long ip, unsigned long parent_ip,
 {
 	int bit;
 
-	bit = trace_test_and_set_recursion(TRACE_LIST_START, TRACE_LIST_MAX);
+	bit = trace_test_and_set_recursion(TRACE_LIST_START);
 	if (bit < 0)
 		return;
 
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index afaeef6c15b3..2c4068d8776e 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -467,23 +467,8 @@ struct tracer {
  *  When function tracing occurs, the following steps are made:
  *   If arch does not support a ftrace feature:
  *    call internal function (uses INTERNAL bits) which calls...
- *   If callback is registered to the "global" list, the list
- *    function is called and recursion checks the GLOBAL bits.
- *    then this function calls...
  *   The function callback, which can use the FTRACE bits to
  *    check for recursion.
- *
- * Now if the arch does not suppport a feature, and it calls
- * the global list function which calls the ftrace callback
- * all three of these steps will do a recursion protection.
- * There's no reason to do one if the previous caller already
- * did. The recursion that we are protecting against will
- * go through the same steps again.
- *
- * To prevent the multiple recursion checks, if a recursion
- * bit is set that is higher than the MAX bit of the current
- * check, then we know that the check was made by the previous
- * caller, and we can skip the current check.
  */
 enum {
 	TRACE_BUFFER_BIT,
@@ -496,12 +481,14 @@ enum {
 	TRACE_FTRACE_NMI_BIT,
 	TRACE_FTRACE_IRQ_BIT,
 	TRACE_FTRACE_SIRQ_BIT,
+	TRACE_FTRACE_TRANSITION_BIT,
 
-	/* INTERNAL_BITs must be greater than FTRACE_BITs */
+	/* Internal use recursion bits */
 	TRACE_INTERNAL_BIT,
 	TRACE_INTERNAL_NMI_BIT,
 	TRACE_INTERNAL_IRQ_BIT,
 	TRACE_INTERNAL_SIRQ_BIT,
+	TRACE_INTERNAL_TRANSITION_BIT,
 
 	TRACE_BRANCH_BIT,
 /*
@@ -534,12 +521,6 @@ enum {
 
 	TRACE_GRAPH_DEPTH_START_BIT,
 	TRACE_GRAPH_DEPTH_END_BIT,
-
-	/*
-	 * When transitioning between context, the preempt_count() may
-	 * not be correct. Allow for a single recursion to cover this case.
-	 */
-	TRACE_TRANSITION_BIT,
 };
 
 #define trace_recursion_set(bit)	do { (current)->trace_recursion |= (1<<(bit)); } while (0)
@@ -559,12 +540,18 @@ enum {
 #define TRACE_CONTEXT_BITS	4
 
 #define TRACE_FTRACE_START	TRACE_FTRACE_BIT
-#define TRACE_FTRACE_MAX	((1 << (TRACE_FTRACE_START + TRACE_CONTEXT_BITS)) - 1)
 
 #define TRACE_LIST_START	TRACE_INTERNAL_BIT
-#define TRACE_LIST_MAX		((1 << (TRACE_LIST_START + TRACE_CONTEXT_BITS)) - 1)
 
-#define TRACE_CONTEXT_MASK	TRACE_LIST_MAX
+#define TRACE_CONTEXT_MASK	((1 << (TRACE_LIST_START + TRACE_CONTEXT_BITS)) - 1)
+
+enum {
+	TRACE_CTX_NMI,
+	TRACE_CTX_IRQ,
+	TRACE_CTX_SOFTIRQ,
+	TRACE_CTX_NORMAL,
+	TRACE_CTX_TRANSITION,
+};
 
 static __always_inline int trace_get_context_bit(void)
 {
@@ -572,59 +559,48 @@ static __always_inline int trace_get_context_bit(void)
 
 	if (in_interrupt()) {
 		if (in_nmi())
-			bit = 0;
+			bit = TRACE_CTX_NMI;
 
 		else if (in_irq())
-			bit = 1;
+			bit = TRACE_CTX_IRQ;
 		else
-			bit = 2;
+			bit = TRACE_CTX_SOFTIRQ;
 	} else
-		bit = 3;
+		bit = TRACE_CTX_NORMAL;
 
 	return bit;
 }
 
-static __always_inline int trace_test_and_set_recursion(int start, int max)
+static __always_inline int trace_test_and_set_recursion(int start)
 {
 	unsigned int val = current->trace_recursion;
 	int bit;
 
-	/* A previous recursion check was made */
-	if ((val & TRACE_CONTEXT_MASK) > max)
-		return 0;
-
 	bit = trace_get_context_bit() + start;
 	if (unlikely(val & (1 << bit))) {
 		/*
 		 * It could be that preempt_count has not been updated during
 		 * a switch between contexts. Allow for a single recursion.
 		 */
-		bit = TRACE_TRANSITION_BIT;
+		bit = start + TRACE_CTX_TRANSITION;
 		if (trace_recursion_test(bit))
 			return -1;
 		trace_recursion_set(bit);
 		barrier();
-		return bit + 1;
+		return bit;
 	}
 
-	/* Normal check passed, clear the transition to allow it again */
-	trace_recursion_clear(TRACE_TRANSITION_BIT);
-
 	val |= 1 << bit;
 	current->trace_recursion = val;
 	barrier();
 
-	return bit + 1;
+	return bit;
 }
 
 static __always_inline void trace_clear_recursion(int bit)
 {
 	unsigned int val = current->trace_recursion;
 
-	if (!bit)
-		return;
-
-	bit--;
 	bit = 1 << bit;
 	val &= ~bit;
 
diff --git a/kernel/trace/trace_functions.c b/kernel/trace/trace_functions.c
index b611cd36e22d..4e8acfe3437f 100644
--- a/kernel/trace/trace_functions.c
+++ b/kernel/trace/trace_functions.c
@@ -138,7 +138,7 @@ function_trace_call(unsigned long ip, unsigned long parent_ip,
 	pc = preempt_count();
 	preempt_disable_notrace();
 
-	bit = trace_test_and_set_recursion(TRACE_FTRACE_START, TRACE_FTRACE_MAX);
+	bit = trace_test_and_set_recursion(TRACE_FTRACE_START);
 	if (bit < 0)
 		goto out;
 

commit a9831afa2dc8a18205403907c41aa4e0950ac611
Author: Yanfei Xu <yanfei.xu@windriver.com>
Date:   Sun Sep 26 12:53:13 2021 +0800

    net: mdiobus: Fix memory leak in __mdiobus_register
    
    commit ab609f25d19858513919369ff3d9a63c02cd9e2e upstream.
    
    Once device_register() failed, we should call put_device() to
    decrement reference count for cleanup. Or it will cause memory
    leak.
    
    BUG: memory leak
    unreferenced object 0xffff888114032e00 (size 256):
      comm "kworker/1:3", pid 2960, jiffies 4294943572 (age 15.920s)
      hex dump (first 32 bytes):
        00 00 00 00 00 00 00 00 08 2e 03 14 81 88 ff ff  ................
        08 2e 03 14 81 88 ff ff 90 76 65 82 ff ff ff ff  .........ve.....
      backtrace:
        [<ffffffff8265cfab>] kmalloc include/linux/slab.h:591 [inline]
        [<ffffffff8265cfab>] kzalloc include/linux/slab.h:721 [inline]
        [<ffffffff8265cfab>] device_private_init drivers/base/core.c:3203 [inline]
        [<ffffffff8265cfab>] device_add+0x89b/0xdf0 drivers/base/core.c:3253
        [<ffffffff828dd643>] __mdiobus_register+0xc3/0x450 drivers/net/phy/mdio_bus.c:537
        [<ffffffff828cb835>] __devm_mdiobus_register+0x75/0xf0 drivers/net/phy/mdio_devres.c:87
        [<ffffffff82b92a00>] ax88772_init_mdio drivers/net/usb/asix_devices.c:676 [inline]
        [<ffffffff82b92a00>] ax88772_bind+0x330/0x480 drivers/net/usb/asix_devices.c:786
        [<ffffffff82baa33f>] usbnet_probe+0x3ff/0xdf0 drivers/net/usb/usbnet.c:1745
        [<ffffffff82c36e17>] usb_probe_interface+0x177/0x370 drivers/usb/core/driver.c:396
        [<ffffffff82661d17>] call_driver_probe drivers/base/dd.c:517 [inline]
        [<ffffffff82661d17>] really_probe.part.0+0xe7/0x380 drivers/base/dd.c:596
        [<ffffffff826620bc>] really_probe drivers/base/dd.c:558 [inline]
        [<ffffffff826620bc>] __driver_probe_device+0x10c/0x1e0 drivers/base/dd.c:751
        [<ffffffff826621ba>] driver_probe_device+0x2a/0x120 drivers/base/dd.c:781
        [<ffffffff82662a26>] __device_attach_driver+0xf6/0x140 drivers/base/dd.c:898
        [<ffffffff8265eca7>] bus_for_each_drv+0xb7/0x100 drivers/base/bus.c:427
        [<ffffffff826625a2>] __device_attach+0x122/0x260 drivers/base/dd.c:969
        [<ffffffff82660916>] bus_probe_device+0xc6/0xe0 drivers/base/bus.c:487
        [<ffffffff8265cd0b>] device_add+0x5fb/0xdf0 drivers/base/core.c:3359
        [<ffffffff82c343b9>] usb_set_configuration+0x9d9/0xb90 drivers/usb/core/message.c:2170
        [<ffffffff82c4473c>] usb_generic_driver_probe+0x8c/0xc0 drivers/usb/core/generic.c:238
    
    BUG: memory leak
    unreferenced object 0xffff888116f06900 (size 32):
      comm "kworker/0:2", pid 2670, jiffies 4294944448 (age 7.160s)
      hex dump (first 32 bytes):
        75 73 62 2d 30 30 31 3a 30 30 33 00 00 00 00 00  usb-001:003.....
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<ffffffff81484516>] kstrdup+0x36/0x70 mm/util.c:60
        [<ffffffff814845a3>] kstrdup_const+0x53/0x80 mm/util.c:83
        [<ffffffff82296ba2>] kvasprintf_const+0xc2/0x110 lib/kasprintf.c:48
        [<ffffffff82358d4b>] kobject_set_name_vargs+0x3b/0xe0 lib/kobject.c:289
        [<ffffffff826575f3>] dev_set_name+0x63/0x90 drivers/base/core.c:3147
        [<ffffffff828dd63b>] __mdiobus_register+0xbb/0x450 drivers/net/phy/mdio_bus.c:535
        [<ffffffff828cb835>] __devm_mdiobus_register+0x75/0xf0 drivers/net/phy/mdio_devres.c:87
        [<ffffffff82b92a00>] ax88772_init_mdio drivers/net/usb/asix_devices.c:676 [inline]
        [<ffffffff82b92a00>] ax88772_bind+0x330/0x480 drivers/net/usb/asix_devices.c:786
        [<ffffffff82baa33f>] usbnet_probe+0x3ff/0xdf0 drivers/net/usb/usbnet.c:1745
        [<ffffffff82c36e17>] usb_probe_interface+0x177/0x370 drivers/usb/core/driver.c:396
        [<ffffffff82661d17>] call_driver_probe drivers/base/dd.c:517 [inline]
        [<ffffffff82661d17>] really_probe.part.0+0xe7/0x380 drivers/base/dd.c:596
        [<ffffffff826620bc>] really_probe drivers/base/dd.c:558 [inline]
        [<ffffffff826620bc>] __driver_probe_device+0x10c/0x1e0 drivers/base/dd.c:751
        [<ffffffff826621ba>] driver_probe_device+0x2a/0x120 drivers/base/dd.c:781
        [<ffffffff82662a26>] __device_attach_driver+0xf6/0x140 drivers/base/dd.c:898
        [<ffffffff8265eca7>] bus_for_each_drv+0xb7/0x100 drivers/base/bus.c:427
        [<ffffffff826625a2>] __device_attach+0x122/0x260 drivers/base/dd.c:969
    
    Reported-by: syzbot+398e7dc692ddbbb4cfec@syzkaller.appspotmail.com
    Signed-off-by: Yanfei Xu <yanfei.xu@windriver.com>
    Reviewed-by: Andrew Lunn <andrew@lunn.ch>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c
index 3207da2224f6..f31a822bf4cc 100644
--- a/drivers/net/phy/mdio_bus.c
+++ b/drivers/net/phy/mdio_bus.c
@@ -388,6 +388,7 @@ int __mdiobus_register(struct mii_bus *bus, struct module *owner)
 	err = device_register(&bus->dev);
 	if (err) {
 		pr_err("mii_bus %s failed to register\n", bus->id);
+		put_device(&bus->dev);
 		return -EINVAL;
 	}
 

commit 629e870ca473bbf3ec2429d441efb0406869783d
Author: Dexuan Cui <decui@microsoft.com>
Date:   Thu Oct 7 21:35:46 2021 -0700

    scsi: core: Fix shost->cmd_per_lun calculation in scsi_add_host_with_dma()
    
    commit 50b6cb3516365cb69753b006be2b61c966b70588 upstream.
    
    After commit ea2f0f77538c ("scsi: core: Cap scsi_host cmd_per_lun at
    can_queue"), a 416-CPU VM running on Hyper-V hangs during boot because the
    hv_storvsc driver sets scsi_driver.can_queue to an integer value that
    exceeds SHRT_MAX, and hence scsi_add_host_with_dma() sets
    shost->cmd_per_lun to a negative "short" value.
    
    Use min_t(int, ...) to work around the issue.
    
    Link: https://lore.kernel.org/r/20211008043546.6006-1-decui@microsoft.com
    Fixes: ea2f0f77538c ("scsi: core: Cap scsi_host cmd_per_lun at can_queue")
    Cc: stable@vger.kernel.org
    Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
    Reviewed-by: Ming Lei <ming.lei@redhat.com>
    Reviewed-by: John Garry <john.garry@huawei.com>
    Signed-off-by: Dexuan Cui <decui@microsoft.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index f3194d634f7f..b3d6ea92b4f7 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -218,7 +218,8 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev,
 		goto fail;
 	}
 
-	shost->cmd_per_lun = min_t(short, shost->cmd_per_lun,
+	/* Use min_t(int, ...) in case shost->can_queue exceeds SHRT_MAX */
+	shost->cmd_per_lun = min_t(int, shost->cmd_per_lun,
 				   shost->can_queue);
 
 	error = scsi_init_sense_cache(shost);

commit 1360f9cde7eaaea4e6b48ab4ec544c706dbc6a8a
Author: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Date:   Tue Oct 12 17:29:35 2021 +0300

    ALSA: hda: avoid write to STATESTS if controller is in reset
    
    [ Upstream commit b37a15188eae9d4c49c5bb035e0c8d4058e4d9b3 ]
    
    The snd_hdac_bus_reset_link() contains logic to clear STATESTS register
    before performing controller reset. This code dates back to an old
    bugfix in commit e8a7f136f5ed ("[ALSA] hda-intel - Improve HD-audio
    codec probing robustness"). Originally the code was added to
    azx_reset().
    
    The code was moved around in commit a41d122449be ("ALSA: hda - Embed bus
    into controller object") and ended up to snd_hdac_bus_reset_link() and
    called primarily via snd_hdac_bus_init_chip().
    
    The logic to clear STATESTS is correct when snd_hdac_bus_init_chip() is
    called when controller is not in reset. In this case, STATESTS can be
    cleared. This can be useful e.g. when forcing a controller reset to retry
    codec probe. A normal non-power-on reset will not clear the bits.
    
    However, this old logic is problematic when controller is already in
    reset. The HDA specification states that controller must be taken out of
    reset before writing to registers other than GCTL.CRST (1.0a spec,
    3.3.7). The write to STATESTS in snd_hdac_bus_reset_link() will be lost
    if the controller is already in reset per the HDA specification mentioned.
    
    This has been harmless on older hardware. On newer generation of Intel
    PCIe based HDA controllers, if configured to report issues, this write
    will emit an unsupported request error. If ACPI Platform Error Interface
    (APEI) is enabled in kernel, this will end up to kernel log.
    
    Fix the code in snd_hdac_bus_reset_link() to only clear the STATESTS if
    the function is called when controller is not in reset. Otherwise
    clearing the bits is not possible and should be skipped.
    
    Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
    Link: https://lore.kernel.org/r/20211012142935.3731820-1-kai.vehmanen@linux.intel.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/hda/hdac_controller.c b/sound/hda/hdac_controller.c
index 74244d8e2909..a65e8c0c630d 100644
--- a/sound/hda/hdac_controller.c
+++ b/sound/hda/hdac_controller.c
@@ -390,8 +390,9 @@ int snd_hdac_bus_reset_link(struct hdac_bus *bus, bool full_reset)
 	if (!full_reset)
 		goto skip_reset;
 
-	/* clear STATESTS */
-	snd_hdac_chip_writew(bus, STATESTS, STATESTS_INT_MASK);
+	/* clear STATESTS if not in reset */
+	if (snd_hdac_chip_readb(bus, GCTL) & AZX_GCTL_RESET)
+		snd_hdac_chip_writew(bus, STATESTS, STATESTS_INT_MASK);
 
 	/* reset controller */
 	snd_hdac_bus_enter_link_reset(bus);

commit f7db1bc1cdb809fdd65d50485fb67bd418eadbd5
Author: Prashant Malani <pmalani@chromium.org>
Date:   Tue Sep 28 03:19:34 2021 -0700

    platform/x86: intel_scu_ipc: Update timeout value in comment
    
    [ Upstream commit a0c5814b9933f25ecb6de169483c5b88cf632bca ]
    
    The comment decribing the IPC timeout hadn't been updated when the
    actual timeout was changed from 3 to 5 seconds in
    commit a7d53dbbc70a ("platform/x86: intel_scu_ipc: Increase virtual
    timeout from 3 to 5 seconds") .
    
    Since the value is anyway updated to 10s now, take this opportunity to
    update the value in the comment too.
    
    Signed-off-by: Prashant Malani <pmalani@chromium.org>
    Cc: Benson Leung <bleung@chromium.org>
    Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
    Link: https://lore.kernel.org/r/20210928101932.2543937-4-pmalani@chromium.org
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/platform/x86/intel_scu_ipc.c b/drivers/platform/x86/intel_scu_ipc.c
index 54f131bec192..0d28576756ac 100644
--- a/drivers/platform/x86/intel_scu_ipc.c
+++ b/drivers/platform/x86/intel_scu_ipc.c
@@ -183,7 +183,7 @@ static inline int busy_loop(struct intel_scu_ipc_dev *scu)
 	return 0;
 }
 
-/* Wait till ipc ioc interrupt is received or timeout in 3 HZ */
+/* Wait till ipc ioc interrupt is received or timeout in 10 HZ */
 static inline int ipc_wait_for_interrupt(struct intel_scu_ipc_dev *scu)
 {
 	int status;

commit a5b34409d3fc52114c828be4adbc30744fa3258b
Author: Zheyu Ma <zheyuma97@gmail.com>
Date:   Sat Oct 9 11:33:49 2021 +0000

    isdn: mISDN: Fix sleeping function called from invalid context
    
    [ Upstream commit 6510e80a0b81b5d814e3aea6297ba42f5e76f73c ]
    
    The driver can call card->isac.release() function from an atomic
    context.
    
    Fix this by calling this function after releasing the lock.
    
    The following log reveals it:
    
    [   44.168226 ] BUG: sleeping function called from invalid context at kernel/workqueue.c:3018
    [   44.168941 ] in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 5475, name: modprobe
    [   44.169574 ] INFO: lockdep is turned off.
    [   44.169899 ] irq event stamp: 0
    [   44.170160 ] hardirqs last  enabled at (0): [<0000000000000000>] 0x0
    [   44.170627 ] hardirqs last disabled at (0): [<ffffffff814209ed>] copy_process+0x132d/0x3e00
    [   44.171240 ] softirqs last  enabled at (0): [<ffffffff81420a1a>] copy_process+0x135a/0x3e00
    [   44.171852 ] softirqs last disabled at (0): [<0000000000000000>] 0x0
    [   44.172318 ] Preemption disabled at:
    [   44.172320 ] [<ffffffffa009b0a9>] nj_release+0x69/0x500 [netjet]
    [   44.174441 ] Call Trace:
    [   44.174630 ]  dump_stack_lvl+0xa8/0xd1
    [   44.174912 ]  dump_stack+0x15/0x17
    [   44.175166 ]  ___might_sleep+0x3a2/0x510
    [   44.175459 ]  ? nj_release+0x69/0x500 [netjet]
    [   44.175791 ]  __might_sleep+0x82/0xe0
    [   44.176063 ]  ? start_flush_work+0x20/0x7b0
    [   44.176375 ]  start_flush_work+0x33/0x7b0
    [   44.176672 ]  ? trace_irq_enable_rcuidle+0x85/0x170
    [   44.177034 ]  ? kasan_quarantine_put+0xaa/0x1f0
    [   44.177372 ]  ? kasan_quarantine_put+0xaa/0x1f0
    [   44.177711 ]  __flush_work+0x11a/0x1a0
    [   44.177991 ]  ? flush_work+0x20/0x20
    [   44.178257 ]  ? lock_release+0x13c/0x8f0
    [   44.178550 ]  ? __kasan_check_write+0x14/0x20
    [   44.178872 ]  ? do_raw_spin_lock+0x148/0x360
    [   44.179187 ]  ? read_lock_is_recursive+0x20/0x20
    [   44.179530 ]  ? __kasan_check_read+0x11/0x20
    [   44.179846 ]  ? do_raw_spin_unlock+0x55/0x900
    [   44.180168 ]  ? ____kasan_slab_free+0x116/0x140
    [   44.180505 ]  ? _raw_spin_unlock_irqrestore+0x41/0x60
    [   44.180878 ]  ? skb_queue_purge+0x1a3/0x1c0
    [   44.181189 ]  ? kfree+0x13e/0x290
    [   44.181438 ]  flush_work+0x17/0x20
    [   44.181695 ]  mISDN_freedchannel+0xe8/0x100
    [   44.182006 ]  isac_release+0x210/0x260 [mISDNipac]
    [   44.182366 ]  nj_release+0xf6/0x500 [netjet]
    [   44.182685 ]  nj_remove+0x48/0x70 [netjet]
    [   44.182989 ]  pci_device_remove+0xa9/0x250
    
    Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/isdn/hardware/mISDN/netjet.c b/drivers/isdn/hardware/mISDN/netjet.c
index 448370da2c3f..4a342daac98d 100644
--- a/drivers/isdn/hardware/mISDN/netjet.c
+++ b/drivers/isdn/hardware/mISDN/netjet.c
@@ -963,8 +963,8 @@ nj_release(struct tiger_hw *card)
 		nj_disable_hwirq(card);
 		mode_tiger(&card->bc[0], ISDN_P_NONE);
 		mode_tiger(&card->bc[1], ISDN_P_NONE);
-		card->isac.release(&card->isac);
 		spin_unlock_irqrestore(&card->lock, flags);
+		card->isac.release(&card->isac);
 		release_region(card->base, card->base_s);
 		card->base_s = 0;
 	}

commit 207f6c3a82e19626aedad6e2f9aa0bb348495447
Author: Herve Codina <herve.codina@bootlin.com>
Date:   Fri Oct 8 12:34:40 2021 +0200

    ARM: dts: spear3xx: Fix gmac node
    
    [ Upstream commit 6636fec29cdf6665bd219564609e8651f6ddc142 ]
    
    On SPEAr3xx, ethernet driver is not compatible with the SPEAr600
    one.
    Indeed, SPEAr3xx uses an earlier version of this IP (v3.40) and
    needs some driver tuning compare to SPEAr600.
    
    The v3.40 IP support was added to stmmac driver and this patch
    fixes this issue and use the correct compatible string for
    SPEAr3xx
    
    Signed-off-by: Herve Codina <herve.codina@bootlin.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/spear3xx.dtsi b/arch/arm/boot/dts/spear3xx.dtsi
index 118135d75899..4e4166d96b26 100644
--- a/arch/arm/boot/dts/spear3xx.dtsi
+++ b/arch/arm/boot/dts/spear3xx.dtsi
@@ -53,7 +53,7 @@
 		};
 
 		gmac: eth@e0800000 {
-			compatible = "st,spear600-gmac";
+			compatible = "snps,dwmac-3.40a";
 			reg = <0xe0800000 0x8000>;
 			interrupts = <23 22>;
 			interrupt-names = "macirq", "eth_wake_irq";

commit cfe8c4a4d6eb21af53504c6b85393de2f8345685
Author: Herve Codina <herve.codina@bootlin.com>
Date:   Fri Oct 8 12:34:39 2021 +0200

    net: stmmac: add support for dwmac 3.40a
    
    [ Upstream commit 9cb1d19f47fafad7dcf7c8564e633440c946cfd7 ]
    
    dwmac 3.40a is an old ip version that can be found on SPEAr3xx soc.
    
    Signed-off-by: Herve Codina <herve.codina@bootlin.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
index fad503820e04..b3365b34cac7 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
@@ -71,6 +71,7 @@ static int dwmac_generic_probe(struct platform_device *pdev)
 
 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/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
index 2b800ce1d5bf..05f5084158bf 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
@@ -469,6 +469,14 @@ stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
 		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")) {

commit f03a8a85e91580f7881b24c24ab2e4e37d8080b1
Author: Filipe Manana <fdmanana@suse.com>
Date:   Fri Oct 1 13:52:30 2021 +0100

    btrfs: deal with errors when checking if a dir entry exists during log replay
    
    [ Upstream commit 77a5b9e3d14cbce49ceed2766b2003c034c066dc ]
    
    Currently inode_in_dir() ignores errors returned from
    btrfs_lookup_dir_index_item() and from btrfs_lookup_dir_item(), treating
    any errors as if the directory entry does not exists in the fs/subvolume
    tree, which is obviously not correct, as we can get errors such as -EIO
    when reading extent buffers while searching the fs/subvolume's tree.
    
    Fix that by making inode_in_dir() return the errors and making its only
    caller, add_inode_ref(), deal with returned errors as well.
    
    Signed-off-by: Filipe Manana <fdmanana@suse.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index e0fc8c094846..c856c32cc926 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -881,9 +881,11 @@ static noinline int drop_one_dir_item(struct btrfs_trans_handle *trans,
 }
 
 /*
- * helper function to see if a given name and sequence number found
- * in an inode back reference are already in a directory and correctly
- * point to this inode
+ * See if a given name and sequence number found in an inode back reference are
+ * already in a directory and correctly point to this inode.
+ *
+ * Returns: < 0 on error, 0 if the directory entry does not exists and 1 if it
+ * exists.
  */
 static noinline int inode_in_dir(struct btrfs_root *root,
 				 struct btrfs_path *path,
@@ -892,29 +894,35 @@ static noinline int inode_in_dir(struct btrfs_root *root,
 {
 	struct btrfs_dir_item *di;
 	struct btrfs_key location;
-	int match = 0;
+	int ret = 0;
 
 	di = btrfs_lookup_dir_index_item(NULL, root, path, dirid,
 					 index, name, name_len, 0);
-	if (di && !IS_ERR(di)) {
+	if (IS_ERR(di)) {
+		if (PTR_ERR(di) != -ENOENT)
+			ret = PTR_ERR(di);
+		goto out;
+	} else if (di) {
 		btrfs_dir_item_key_to_cpu(path->nodes[0], di, &location);
 		if (location.objectid != objectid)
 			goto out;
-	} else
+	} else {
 		goto out;
-	btrfs_release_path(path);
+	}
 
+	btrfs_release_path(path);
 	di = btrfs_lookup_dir_item(NULL, root, path, dirid, name, name_len, 0);
-	if (di && !IS_ERR(di)) {
-		btrfs_dir_item_key_to_cpu(path->nodes[0], di, &location);
-		if (location.objectid != objectid)
-			goto out;
-	} else
+	if (IS_ERR(di)) {
+		ret = PTR_ERR(di);
 		goto out;
-	match = 1;
+	} else if (di) {
+		btrfs_dir_item_key_to_cpu(path->nodes[0], di, &location);
+		if (location.objectid == objectid)
+			ret = 1;
+	}
 out:
 	btrfs_release_path(path);
-	return match;
+	return ret;
 }
 
 /*
@@ -1421,10 +1429,12 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans,
 		if (ret)
 			goto out;
 
-		/* if we already have a perfect match, we're done */
-		if (!inode_in_dir(root, path, btrfs_ino(BTRFS_I(dir)),
-					btrfs_ino(BTRFS_I(inode)), ref_index,
-					name, namelen)) {
+		ret = inode_in_dir(root, path, btrfs_ino(BTRFS_I(dir)),
+				   btrfs_ino(BTRFS_I(inode)), ref_index,
+				   name, namelen);
+		if (ret < 0) {
+			goto out;
+		} else if (ret == 0) {
 			/*
 			 * look for a conflicting back reference in the
 			 * metadata. if we find one we have to unlink that name
@@ -1483,6 +1493,7 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans,
 
 			btrfs_update_inode(trans, root, inode);
 		}
+		/* Else, ret == 1, we already have a perfect match, we're done. */
 
 		ref_ptr = (unsigned long)(ref_ptr + ref_struct_size) + namelen;
 		kfree(name);

commit 4eda4cf24c9b1f2792697c9841f4ee480824cc86
Author: Brendan Higgins <brendanhiggins@google.com>
Date:   Wed Sep 29 14:27:09 2021 -0700

    gcc-plugins/structleak: add makefile var for disabling structleak
    
    [ Upstream commit 554afc3b9797511e3245864e32aebeb6abbab1e3 ]
    
    KUnit and structleak don't play nice, so add a makefile variable for
    enabling structleak when it complains.
    
    Co-developed-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: Brendan Higgins <brendanhiggins@google.com>
    Reviewed-by: David Gow <davidgow@google.com>
    Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/scripts/Makefile.gcc-plugins b/scripts/Makefile.gcc-plugins
index 0a482f341576..93ca13e4f8f9 100644
--- a/scripts/Makefile.gcc-plugins
+++ b/scripts/Makefile.gcc-plugins
@@ -17,6 +17,10 @@ gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK_VERBOSE)	\
 		+= -fplugin-arg-structleak_plugin-verbose
 gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL)	\
 		+= -fplugin-arg-structleak_plugin-byref-all
+ifdef CONFIG_GCC_PLUGIN_STRUCTLEAK
+    DISABLE_STRUCTLEAK_PLUGIN += -fplugin-arg-structleak_plugin-disable
+endif
+export DISABLE_STRUCTLEAK_PLUGIN
 gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK)		\
 		+= -DSTRUCTLEAK_PLUGIN
 

commit c2eec4bd849f754e6e0e89652256b2034943319a
Author: Vegard Nossum <vegard.nossum@gmail.com>
Date:   Tue Oct 5 22:54:54 2021 +0200

    netfilter: Kconfig: use 'default y' instead of 'm' for bool config option
    
    commit 77076934afdcd46516caf18ed88b2f88025c9ddb upstream.
    
    This option, NF_CONNTRACK_SECMARK, is a bool, so it can never be 'm'.
    
    Fixes: 33b8e77605620 ("[NETFILTER]: Add CONFIG_NETFILTER_ADVANCED option")
    Signed-off-by: Vegard Nossum <vegard.nossum@oracle.com>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/netfilter/Kconfig b/net/netfilter/Kconfig
index e0fb56d67d42..56cddadb65d0 100644
--- a/net/netfilter/Kconfig
+++ b/net/netfilter/Kconfig
@@ -93,7 +93,7 @@ config NF_CONNTRACK_MARK
 config NF_CONNTRACK_SECMARK
 	bool  'Connection tracking security mark support'
 	depends on NETWORK_SECMARK
-	default m if NETFILTER_ADVANCED=n
+	default y if NETFILTER_ADVANCED=n
 	help
 	  This option enables security markings to be applied to
 	  connections.  Typically they are copied to connections from

commit 7d91adc0ccb060ce564103315189466eb822cc6a
Author: Xiaolong Huang <butterflyhuangxx@gmail.com>
Date:   Fri Oct 8 14:58:30 2021 +0800

    isdn: cpai: check ctr->cnr to avoid array index out of bound
    
    commit 1f3e2e97c003f80c4b087092b225c8787ff91e4d upstream.
    
    The cmtp_add_connection() would add a cmtp session to a controller
    and run a kernel thread to process cmtp.
    
            __module_get(THIS_MODULE);
            session->task = kthread_run(cmtp_session, session, "kcmtpd_ctr_%d",
                                                                    session->num);
    
    During this process, the kernel thread would call detach_capi_ctr()
    to detach a register controller. if the controller
    was not attached yet, detach_capi_ctr() would
    trigger an array-index-out-bounds bug.
    
    [   46.866069][ T6479] UBSAN: array-index-out-of-bounds in
    drivers/isdn/capi/kcapi.c:483:21
    [   46.867196][ T6479] index -1 is out of range for type 'capi_ctr *[32]'
    [   46.867982][ T6479] CPU: 1 PID: 6479 Comm: kcmtpd_ctr_0 Not tainted
    5.15.0-rc2+ #8
    [   46.869002][ T6479] Hardware name: QEMU Standard PC (i440FX + PIIX,
    1996), BIOS 1.14.0-2 04/01/2014
    [   46.870107][ T6479] Call Trace:
    [   46.870473][ T6479]  dump_stack_lvl+0x57/0x7d
    [   46.870974][ T6479]  ubsan_epilogue+0x5/0x40
    [   46.871458][ T6479]  __ubsan_handle_out_of_bounds.cold+0x43/0x48
    [   46.872135][ T6479]  detach_capi_ctr+0x64/0xc0
    [   46.872639][ T6479]  cmtp_session+0x5c8/0x5d0
    [   46.873131][ T6479]  ? __init_waitqueue_head+0x60/0x60
    [   46.873712][ T6479]  ? cmtp_add_msgpart+0x120/0x120
    [   46.874256][ T6479]  kthread+0x147/0x170
    [   46.874709][ T6479]  ? set_kthread_struct+0x40/0x40
    [   46.875248][ T6479]  ret_from_fork+0x1f/0x30
    [   46.875773][ T6479]
    
    Signed-off-by: Xiaolong Huang <butterflyhuangxx@gmail.com>
    Acked-by: Arnd Bergmann <arnd@arndb.de>
    Link: https://lore.kernel.org/r/20211008065830.305057-1-butterflyhuangxx@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/isdn/capi/kcapi.c b/drivers/isdn/capi/kcapi.c
index 18de41a266eb..aa625b7ddcce 100644
--- a/drivers/isdn/capi/kcapi.c
+++ b/drivers/isdn/capi/kcapi.c
@@ -565,6 +565,11 @@ int detach_capi_ctr(struct capi_ctr *ctr)
 
 	ctr_down(ctr, CAPI_CTR_DETACHED);
 
+	if (ctr->cnr < 1 || ctr->cnr - 1 >= CAPI_MAXCONTR) {
+		err = -EINVAL;
+		goto unlock_out;
+	}
+
 	if (capi_controller[ctr->cnr - 1] != ctr) {
 		err = -EINVAL;
 		goto unlock_out;

commit 1ac0d736c8ae9b59ab44e4e80ad73c8fba5c6132
Author: Lin Ma <linma@zju.edu.cn>
Date:   Thu Oct 7 19:44:30 2021 +0200

    nfc: nci: fix the UAF of rf_conn_info object
    
    commit 1b1499a817c90fd1ce9453a2c98d2a01cca0e775 upstream.
    
    The nci_core_conn_close_rsp_packet() function will release the conn_info
    with given conn_id. However, it needs to set the rf_conn_info to NULL to
    prevent other routines like nci_rf_intf_activated_ntf_packet() to trigger
    the UAF.
    
    Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Signed-off-by: Lin Ma <linma@zju.edu.cn>
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/nfc/nci/rsp.c b/net/nfc/nci/rsp.c
index e3bbf1937d0e..7681f89dc312 100644
--- a/net/nfc/nci/rsp.c
+++ b/net/nfc/nci/rsp.c
@@ -289,6 +289,8 @@ static void nci_core_conn_close_rsp_packet(struct nci_dev *ndev,
 							 ndev->cur_conn_id);
 		if (conn_info) {
 			list_del(&conn_info->list);
+			if (conn_info == ndev->rf_conn_info)
+				ndev->rf_conn_info = NULL;
 			devm_kfree(&ndev->nfc_dev->dev, conn_info);
 		}
 	}

commit 21e23e4c02fc9aa1f4b037f30e47d215d1a27f21
Author: Miaohe Lin <linmiaohe@huawei.com>
Date:   Mon Oct 18 15:15:55 2021 -0700

    mm, slub: fix mismatch between reconstructed freelist depth and cnt
    
    commit 899447f669da76cc3605665e1a95ee877bc464cc upstream.
    
    If object's reuse is delayed, it will be excluded from the reconstructed
    freelist.  But we forgot to adjust the cnt accordingly.  So there will
    be a mismatch between reconstructed freelist depth and cnt.  This will
    lead to free_debug_processing() complaining about freelist count or a
    incorrect slub inuse count.
    
    Link: https://lkml.kernel.org/r/20210916123920.48704-3-linmiaohe@huawei.com
    Fixes: c3895391df38 ("kasan, slub: fix handling of kasan_slab_free hook")
    Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
    Reviewed-by: Vlastimil Babka <vbabka@suse.cz>
    Cc: Andrey Konovalov <andreyknvl@gmail.com>
    Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
    Cc: Bharata B Rao <bharata@linux.ibm.com>
    Cc: Christoph Lameter <cl@linux.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Faiyaz Mohammed <faiyazm@codeaurora.org>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Pekka Enberg <penberg@kernel.org>
    Cc: Roman Gushchin <guro@fb.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/mm/slub.c b/mm/slub.c
index b6c5c8fd265d..499fb073d1ff 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -1392,7 +1392,8 @@ static __always_inline bool slab_free_hook(struct kmem_cache *s, void *x)
 }
 
 static inline bool slab_free_freelist_hook(struct kmem_cache *s,
-					   void **head, void **tail)
+					   void **head, void **tail,
+					   int *cnt)
 {
 /*
  * Compiler cannot detect this function can be removed if slab_free_hook()
@@ -1421,6 +1422,12 @@ static inline bool slab_free_freelist_hook(struct kmem_cache *s,
 			*head = object;
 			if (!*tail)
 				*tail = object;
+		} else {
+			/*
+			 * Adjust the reconstructed freelist depth
+			 * accordingly if object's reuse is delayed.
+			 */
+			--(*cnt);
 		}
 	} while (object != old_tail);
 
@@ -2988,7 +2995,7 @@ static __always_inline void slab_free(struct kmem_cache *s, struct page *page,
 	 * With KASAN enabled slab_free_freelist_hook modifies the freelist
 	 * to remove objects, whose reuse must be delayed.
 	 */
-	if (slab_free_freelist_hook(s, &head, &tail))
+	if (slab_free_freelist_hook(s, &head, &tail, &cnt))
 		do_slab_free(s, page, head, tail, cnt, addr);
 }
 

commit 6e56a74b7ebc110f139a03948a78c50ea474370c
Author: Takashi Iwai <tiwai@suse.de>
Date:   Wed Oct 6 16:17:12 2021 +0200

    ASoC: DAPM: Fix missing kctl change notifications
    
    commit 5af82c81b2c49cfb1cad84d9eb6eab0e3d1c4842 upstream.
    
    The put callback of a kcontrol is supposed to return 1 when the value
    is changed, and this will be notified to user-space.  However, some
    DAPM kcontrols always return 0 (except for errors), hence the
    user-space misses the update of a control value.
    
    This patch corrects the behavior by properly returning 1 when the
    value gets updated.
    
    Reported-and-tested-by: Hans de Goede <hdegoede@redhat.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Link: https://lore.kernel.org/r/20211006141712.2439-1-tiwai@suse.de
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index 4e99d9986f11..0f3489359d34 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -2515,6 +2515,7 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
 				const char *pin, int status)
 {
 	struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
+	int ret = 0;
 
 	dapm_assert_locked(dapm);
 
@@ -2527,13 +2528,14 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
 		dapm_mark_dirty(w, "pin configuration");
 		dapm_widget_invalidate_input_paths(w);
 		dapm_widget_invalidate_output_paths(w);
+		ret = 1;
 	}
 
 	w->connected = status;
 	if (status == 0)
 		w->force = 0;
 
-	return 0;
+	return ret;
 }
 
 /**
@@ -3461,14 +3463,15 @@ int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol,
 {
 	struct snd_soc_card *card = snd_kcontrol_chip(kcontrol);
 	const char *pin = (const char *)kcontrol->private_value;
+	int ret;
 
 	if (ucontrol->value.integer.value[0])
-		snd_soc_dapm_enable_pin(&card->dapm, pin);
+		ret = snd_soc_dapm_enable_pin(&card->dapm, pin);
 	else
-		snd_soc_dapm_disable_pin(&card->dapm, pin);
+		ret = snd_soc_dapm_disable_pin(&card->dapm, pin);
 
 	snd_soc_dapm_sync(&card->dapm);
-	return 0;
+	return ret;
 }
 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_pin_switch);
 
@@ -3858,7 +3861,7 @@ static int snd_soc_dapm_dai_link_put(struct snd_kcontrol *kcontrol,
 
 	w->params_select = ucontrol->value.enumerated.item[0];
 
-	return 0;
+	return 1;
 }
 
 static void

commit 7e72ec9f1e97d4711944d2289e29a05ce67baac0
Author: Steven Clarkson <sc@lambdal.com>
Date:   Thu Oct 14 06:35:54 2021 -0700

    ALSA: hda/realtek: Add quirk for Clevo PC50HS
    
    commit aef454b40288158b850aab13e3d2a8c406779401 upstream.
    
    Apply existing PCI quirk to the Clevo PC50HS and related models to fix
    audio output on the built in speakers.
    
    Signed-off-by: Steven Clarkson <sc@lambdal.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20211014133554.1326741-1-sc@lambdal.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 650439286208..2161c57d26c5 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -2521,6 +2521,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x65e5, "Clevo PC50D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
+	SND_PCI_QUIRK(0x1558, 0x65f1, "Clevo PC50HS", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),

commit c32cec9ee6593f222257cdac1445c334e6e6fe33
Author: Brendan Grieve <brendan@grieve.com.au>
Date:   Fri Oct 15 10:53:35 2021 +0800

    ALSA: usb-audio: Provide quirk for Sennheiser GSP670 Headset
    
    commit 3c414eb65c294719a91a746260085363413f91c1 upstream.
    
    As per discussion at: https://github.com/szszoke/sennheiser-gsp670-pulseaudio-profile/issues/13
    
    The GSP670 has 2 playback and 1 recording device that by default are
    detected in an incompatible order for alsa. This may have been done to make
    it compatible for the console by the manufacturer and only affects the
    latest firmware which uses its own ID.
    
    This quirk will resolve this by reordering the channels.
    
    Signed-off-by: Brendan Grieve <brendan@grieve.com.au>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20211015025335.196592-1-brendan@grieve.com.au
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h
index 81304c2c1124..1e0d94603692 100644
--- a/sound/usb/quirks-table.h
+++ b/sound/usb/quirks-table.h
@@ -3583,5 +3583,37 @@ ALC1220_VB_DESKTOP(0x26ce, 0x0a01), /* Asrock TRX40 Creator */
 		}
 	}
 },
+{
+	/*
+	 * Sennheiser GSP670
+	 * Change order of interfaces loaded
+	 */
+	USB_DEVICE(0x1395, 0x0300),
+	.bInterfaceClass = USB_CLASS_PER_INTERFACE,
+	.driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
+		.ifnum = QUIRK_ANY_INTERFACE,
+		.type = QUIRK_COMPOSITE,
+		.data = &(const struct snd_usb_audio_quirk[]) {
+			// Communication
+			{
+				.ifnum = 3,
+				.type = QUIRK_AUDIO_STANDARD_INTERFACE
+			},
+			// Recording
+			{
+				.ifnum = 4,
+				.type = QUIRK_AUDIO_STANDARD_INTERFACE
+			},
+			// Main
+			{
+				.ifnum = 1,
+				.type = QUIRK_AUDIO_STANDARD_INTERFACE
+			},
+			{
+				.ifnum = -1
+			}
+		}
+	}
+},
 
 #undef USB_DEVICE_VENDOR_SPEC

commit c1ba20965b59c2eeb54a845ca5cab4fc7bcf9735
Author: Matthew Wilcox (Oracle) <willy@infradead.org>
Date:   Mon Oct 18 15:16:12 2021 -0700

    vfs: check fd has read access in kernel_read_file_from_fd()
    
    commit 032146cda85566abcd1c4884d9d23e4e30a07e9a upstream.
    
    If we open a file without read access and then pass the fd to a syscall
    whose implementation calls kernel_read_file_from_fd(), we get a warning
    from __kernel_read():
    
            if (WARN_ON_ONCE(!(file->f_mode & FMODE_READ)))
    
    This currently affects both finit_module() and kexec_file_load(), but it
    could affect other syscalls in the future.
    
    Link: https://lkml.kernel.org/r/20211007220110.600005-1-willy@infradead.org
    Fixes: b844f0ecbc56 ("vfs: define kernel_copy_file_from_fd()")
    Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
    Reported-by: Hao Sun <sunhao.th@gmail.com>
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Mimi Zohar <zohar@linux.ibm.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/exec.c b/fs/exec.c
index 6eea921a7e72..e87e3c020c61 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -984,7 +984,7 @@ int kernel_read_file_from_fd(int fd, void **buf, loff_t *size, loff_t max_size,
 	struct fd f = fdget(fd);
 	int ret = -EBADF;
 
-	if (!f.file)
+	if (!f.file || !(f.file->f_mode & FMODE_READ))
 		goto out;
 
 	ret = kernel_read_file(f.file, buf, size, max_size, id);

commit 257a2956f5d840a2b8b46e32eddba26fdbb89888
Author: Lukas Bulwahn <lukas.bulwahn@gmail.com>
Date:   Mon Oct 18 15:16:09 2021 -0700

    elfcore: correct reference to CONFIG_UML
    
    commit b0e901280d9860a0a35055f220e8e457f300f40a upstream.
    
    Commit 6e7b64b9dd6d ("elfcore: fix building with clang") introduces
    special handling for two architectures, ia64 and User Mode Linux.
    However, the wrong name, i.e., CONFIG_UM, for the intended Kconfig
    symbol for User-Mode Linux was used.
    
    Although the directory for User Mode Linux is ./arch/um; the Kconfig
    symbol for this architecture is called CONFIG_UML.
    
    Luckily, ./scripts/checkkconfigsymbols.py warns on non-existing configs:
    
      UM
      Referencing files: include/linux/elfcore.h
      Similar symbols: UML, NUMA
    
    Correct the name of the config to the intended one.
    
    [akpm@linux-foundation.org: fix um/x86_64, per Catalin]
      Link: https://lkml.kernel.org/r/20211006181119.2851441-1-catalin.marinas@arm.com
      Link: https://lkml.kernel.org/r/YV6pejGzLy5ppEpt@arm.com
    
    Link: https://lkml.kernel.org/r/20211006082209.417-1-lukas.bulwahn@gmail.com
    Fixes: 6e7b64b9dd6d ("elfcore: fix building with clang")
    Signed-off-by: Lukas Bulwahn <lukas.bulwahn@gmail.com>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Nathan Chancellor <nathan@kernel.org>
    Cc: Nick Desaulniers <ndesaulniers@google.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Barret Rhoden <brho@google.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/elfcore.h b/include/linux/elfcore.h
index b81f9e1d74b0..9d249dfbab72 100644
--- a/include/linux/elfcore.h
+++ b/include/linux/elfcore.h
@@ -58,7 +58,7 @@ static inline int elf_core_copy_task_xfpregs(struct task_struct *t, elf_fpxregse
 }
 #endif
 
-#if defined(CONFIG_UM) || defined(CONFIG_IA64)
+#if (defined(CONFIG_UML) && defined(CONFIG_X86_32)) || defined(CONFIG_IA64)
 /*
  * These functions parameterize elf_core_dump in fs/binfmt_elf.c to write out
  * extra segments containing the gate DSO contents.  Dumping its

commit 7623b1035ca2d17bde0f6a086ad6844a34648df1
Author: Valentin Vidic <vvidic@valentin-vidic.from.hr>
Date:   Mon Oct 18 15:15:42 2021 -0700

    ocfs2: mount fails with buffer overflow in strlen
    
    commit b15fa9224e6e1239414525d8d556d824701849fc upstream.
    
    Starting with kernel 5.11 built with CONFIG_FORTIFY_SOURCE mouting an
    ocfs2 filesystem with either o2cb or pcmk cluster stack fails with the
    trace below.  Problem seems to be that strings for cluster stack and
    cluster name are not guaranteed to be null terminated in the disk
    representation, while strlcpy assumes that the source string is always
    null terminated.  This causes a read outside of the source string
    triggering the buffer overflow detection.
    
      detected buffer overflow in strlen
      ------------[ cut here ]------------
      kernel BUG at lib/string.c:1149!
      invalid opcode: 0000 [#1] SMP PTI
      CPU: 1 PID: 910 Comm: mount.ocfs2 Not tainted 5.14.0-1-amd64 #1
        Debian 5.14.6-2
      RIP: 0010:fortify_panic+0xf/0x11
      ...
      Call Trace:
       ocfs2_initialize_super.isra.0.cold+0xc/0x18 [ocfs2]
       ocfs2_fill_super+0x359/0x19b0 [ocfs2]
       mount_bdev+0x185/0x1b0
       legacy_get_tree+0x27/0x40
       vfs_get_tree+0x25/0xb0
       path_mount+0x454/0xa20
       __x64_sys_mount+0x103/0x140
       do_syscall_64+0x3b/0xc0
       entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Link: https://lkml.kernel.org/r/20210929180654.32460-1-vvidic@valentin-vidic.from.hr
    Signed-off-by: Valentin Vidic <vvidic@valentin-vidic.from.hr>
    Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
    Cc: Mark Fasheh <mark@fasheh.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Cc: Junxiao Bi <junxiao.bi@oracle.com>
    Cc: Changwei Ge <gechangwei@live.cn>
    Cc: Gang He <ghe@suse.com>
    Cc: Jun Piao <piaojun@huawei.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c
index 09bc2cf5f61c..b5aa60430a6a 100644
--- a/fs/ocfs2/super.c
+++ b/fs/ocfs2/super.c
@@ -2205,11 +2205,17 @@ static int ocfs2_initialize_super(struct super_block *sb,
 	}
 
 	if (ocfs2_clusterinfo_valid(osb)) {
+		/*
+		 * ci_stack and ci_cluster in ocfs2_cluster_info may not be null
+		 * terminated, so make sure no overflow happens here by using
+		 * memcpy. Destination strings will always be null terminated
+		 * because osb is allocated using kzalloc.
+		 */
 		osb->osb_stackflags =
 			OCFS2_RAW_SB(di)->s_cluster_info.ci_stackflags;
-		strlcpy(osb->osb_cluster_stack,
+		memcpy(osb->osb_cluster_stack,
 		       OCFS2_RAW_SB(di)->s_cluster_info.ci_stack,
-		       OCFS2_STACK_LABEL_LEN + 1);
+		       OCFS2_STACK_LABEL_LEN);
 		if (strlen(osb->osb_cluster_stack) != OCFS2_STACK_LABEL_LEN) {
 			mlog(ML_ERROR,
 			     "couldn't mount because of an invalid "
@@ -2218,9 +2224,9 @@ static int ocfs2_initialize_super(struct super_block *sb,
 			status = -EINVAL;
 			goto bail;
 		}
-		strlcpy(osb->osb_cluster_name,
+		memcpy(osb->osb_cluster_name,
 			OCFS2_RAW_SB(di)->s_cluster_info.ci_cluster,
-			OCFS2_CLUSTER_NAME_LEN + 1);
+			OCFS2_CLUSTER_NAME_LEN);
 	} else {
 		/* The empty string is identical with classic tools that
 		 * don't know about s_cluster_info. */

commit a3a089c241cd49b33a8cdd7fcb37cc87a086912a
Author: Jan Kara <jack@suse.cz>
Date:   Mon Oct 18 15:15:39 2021 -0700

    ocfs2: fix data corruption after conversion from inline format
    
    commit 5314454ea3ff6fc746eaf71b9a7ceebed52888fa upstream.
    
    Commit 6dbf7bb55598 ("fs: Don't invalidate page buffers in
    block_write_full_page()") uncovered a latent bug in ocfs2 conversion
    from inline inode format to a normal inode format.
    
    The code in ocfs2_convert_inline_data_to_extents() attempts to zero out
    the whole cluster allocated for file data by grabbing, zeroing, and
    dirtying all pages covering this cluster.  However these pages are
    beyond i_size, thus writeback code generally ignores these dirty pages
    and no blocks were ever actually zeroed on the disk.
    
    This oversight was fixed by commit 693c241a5f6a ("ocfs2: No need to zero
    pages past i_size.") for standard ocfs2 write path, inline conversion
    path was apparently forgotten; the commit log also has a reasoning why
    the zeroing actually is not needed.
    
    After commit 6dbf7bb55598, things became worse as writeback code stopped
    invalidating buffers on pages beyond i_size and thus these pages end up
    with clean PageDirty bit but with buffers attached to these pages being
    still dirty.  So when a file is converted from inline format, then
    writeback triggers, and then the file is grown so that these pages
    become valid, the invalid dirtiness state is preserved,
    mark_buffer_dirty() does nothing on these pages (buffers are already
    dirty) but page is never written back because it is clean.  So data
    written to these pages is lost once pages are reclaimed.
    
    Simple reproducer for the problem is:
    
      xfs_io -f -c "pwrite 0 2000" -c "pwrite 2000 2000" -c "fsync" \
        -c "pwrite 4000 2000" ocfs2_file
    
    After unmounting and mounting the fs again, you can observe that end of
    'ocfs2_file' has lost its contents.
    
    Fix the problem by not doing the pointless zeroing during conversion
    from inline format similarly as in the standard write path.
    
    [akpm@linux-foundation.org: fix whitespace, per Joseph]
    
    Link: https://lkml.kernel.org/r/20210930095405.21433-1-jack@suse.cz
    Fixes: 6dbf7bb55598 ("fs: Don't invalidate page buffers in block_write_full_page()")
    Signed-off-by: Jan Kara <jack@suse.cz>
    Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
    Tested-by: Joseph Qi <joseph.qi@linux.alibaba.com>
    Acked-by: Gang He <ghe@suse.com>
    Cc: Mark Fasheh <mark@fasheh.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Cc: Junxiao Bi <junxiao.bi@oracle.com>
    Cc: Changwei Ge <gechangwei@live.cn>
    Cc: Jun Piao <piaojun@huawei.com>
    Cc: "Markov, Andrey" <Markov.Andrey@Dell.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c
index ff0e083ce2a1..046f5e3c9622 100644
--- a/fs/ocfs2/alloc.c
+++ b/fs/ocfs2/alloc.c
@@ -7048,7 +7048,7 @@ void ocfs2_set_inode_data_inline(struct inode *inode, struct ocfs2_dinode *di)
 int ocfs2_convert_inline_data_to_extents(struct inode *inode,
 					 struct buffer_head *di_bh)
 {
-	int ret, i, has_data, num_pages = 0;
+	int ret, has_data, num_pages = 0;
 	int need_free = 0;
 	u32 bit_off, num;
 	handle_t *handle;
@@ -7057,26 +7057,17 @@ int ocfs2_convert_inline_data_to_extents(struct inode *inode,
 	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
 	struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data;
 	struct ocfs2_alloc_context *data_ac = NULL;
-	struct page **pages = NULL;
-	loff_t end = osb->s_clustersize;
+	struct page *page = NULL;
 	struct ocfs2_extent_tree et;
 	int did_quota = 0;
 
 	has_data = i_size_read(inode) ? 1 : 0;
 
 	if (has_data) {
-		pages = kcalloc(ocfs2_pages_per_cluster(osb->sb),
-				sizeof(struct page *), GFP_NOFS);
-		if (pages == NULL) {
-			ret = -ENOMEM;
-			mlog_errno(ret);
-			return ret;
-		}
-
 		ret = ocfs2_reserve_clusters(osb, 1, &data_ac);
 		if (ret) {
 			mlog_errno(ret);
-			goto free_pages;
+			goto out;
 		}
 	}
 
@@ -7096,7 +7087,8 @@ int ocfs2_convert_inline_data_to_extents(struct inode *inode,
 	}
 
 	if (has_data) {
-		unsigned int page_end;
+		unsigned int page_end = min_t(unsigned, PAGE_SIZE,
+							osb->s_clustersize);
 		u64 phys;
 
 		ret = dquot_alloc_space_nodirty(inode,
@@ -7120,15 +7112,8 @@ int ocfs2_convert_inline_data_to_extents(struct inode *inode,
 		 */
 		block = phys = ocfs2_clusters_to_blocks(inode->i_sb, bit_off);
 
-		/*
-		 * Non sparse file systems zero on extend, so no need
-		 * to do that now.
-		 */
-		if (!ocfs2_sparse_alloc(osb) &&
-		    PAGE_SIZE < osb->s_clustersize)
-			end = PAGE_SIZE;
-
-		ret = ocfs2_grab_eof_pages(inode, 0, end, pages, &num_pages);
+		ret = ocfs2_grab_eof_pages(inode, 0, page_end, &page,
+					   &num_pages);
 		if (ret) {
 			mlog_errno(ret);
 			need_free = 1;
@@ -7139,20 +7124,15 @@ int ocfs2_convert_inline_data_to_extents(struct inode *inode,
 		 * This should populate the 1st page for us and mark
 		 * it up to date.
 		 */
-		ret = ocfs2_read_inline_data(inode, pages[0], di_bh);
+		ret = ocfs2_read_inline_data(inode, page, di_bh);
 		if (ret) {
 			mlog_errno(ret);
 			need_free = 1;
 			goto out_unlock;
 		}
 
-		page_end = PAGE_SIZE;
-		if (PAGE_SIZE > osb->s_clustersize)
-			page_end = osb->s_clustersize;
-
-		for (i = 0; i < num_pages; i++)
-			ocfs2_map_and_dirty_page(inode, handle, 0, page_end,
-						 pages[i], i > 0, &phys);
+		ocfs2_map_and_dirty_page(inode, handle, 0, page_end, page, 0,
+					 &phys);
 	}
 
 	spin_lock(&oi->ip_lock);
@@ -7183,8 +7163,8 @@ int ocfs2_convert_inline_data_to_extents(struct inode *inode,
 	}
 
 out_unlock:
-	if (pages)
-		ocfs2_unlock_and_free_pages(pages, num_pages);
+	if (page)
+		ocfs2_unlock_and_free_pages(&page, num_pages);
 
 out_commit:
 	if (ret < 0 && did_quota)
@@ -7208,8 +7188,6 @@ int ocfs2_convert_inline_data_to_extents(struct inode *inode,
 out:
 	if (data_ac)
 		ocfs2_free_alloc_context(data_ac);
-free_pages:
-	kfree(pages);
 	return ret;
 }
 

commit adbda14730aacce41c0d3596415aa39ad63eafd9
Author: Zheyu Ma <zheyuma97@gmail.com>
Date:   Thu Oct 14 06:28:33 2021 +0000

    can: peak_pci: peak_pci_remove(): fix UAF
    
    commit 949fe9b35570361bc6ee2652f89a0561b26eec98 upstream.
    
    When remove the module peek_pci, referencing 'chan' again after
    releasing 'dev' will cause UAF.
    
    Fix this by releasing 'dev' later.
    
    The following log reveals it:
    
    [   35.961814 ] BUG: KASAN: use-after-free in peak_pci_remove+0x16f/0x270 [peak_pci]
    [   35.963414 ] Read of size 8 at addr ffff888136998ee8 by task modprobe/5537
    [   35.965513 ] Call Trace:
    [   35.965718 ]  dump_stack_lvl+0xa8/0xd1
    [   35.966028 ]  print_address_description+0x87/0x3b0
    [   35.966420 ]  kasan_report+0x172/0x1c0
    [   35.966725 ]  ? peak_pci_remove+0x16f/0x270 [peak_pci]
    [   35.967137 ]  ? trace_irq_enable_rcuidle+0x10/0x170
    [   35.967529 ]  ? peak_pci_remove+0x16f/0x270 [peak_pci]
    [   35.967945 ]  __asan_report_load8_noabort+0x14/0x20
    [   35.968346 ]  peak_pci_remove+0x16f/0x270 [peak_pci]
    [   35.968752 ]  pci_device_remove+0xa9/0x250
    
    Fixes: e6d9c80b7ca1 ("can: peak_pci: add support of some new PEAK-System PCI cards")
    Link: https://lore.kernel.org/all/1634192913-15639-1-git-send-email-zheyuma97@gmail.com
    Cc: stable@vger.kernel.org
    Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/can/sja1000/peak_pci.c b/drivers/net/can/sja1000/peak_pci.c
index a97b81d1d0da..e989841b411f 100644
--- a/drivers/net/can/sja1000/peak_pci.c
+++ b/drivers/net/can/sja1000/peak_pci.c
@@ -739,16 +739,15 @@ static void peak_pci_remove(struct pci_dev *pdev)
 		struct net_device *prev_dev = chan->prev_dev;
 
 		dev_info(&pdev->dev, "removing device %s\n", dev->name);
+		/* do that only for first channel */
+		if (!prev_dev && chan->pciec_card)
+			peak_pciec_remove(chan->pciec_card);
 		unregister_sja1000dev(dev);
 		free_sja1000dev(dev);
 		dev = prev_dev;
 
-		if (!dev) {
-			/* do that only for first channel */
-			if (chan->pciec_card)
-				peak_pciec_remove(chan->pciec_card);
+		if (!dev)
 			break;
-		}
 		priv = netdev_priv(dev);
 		chan = priv->priv;
 	}

commit ad77f660805b6da06f4ddc6b937104d029c9ad38
Author: Stephane Grosjean <s.grosjean@peak-system.com>
Date:   Wed Sep 29 16:21:10 2021 +0200

    can: peak_usb: pcan_usb_fd_decode_status(): fix back to ERROR_ACTIVE state notification
    
    commit 3d031abc7e7249573148871180c28ecedb5e27df upstream.
    
    This corrects the lack of notification of a return to ERROR_ACTIVE
    state for USB - CANFD devices from PEAK-System.
    
    Fixes: 0a25e1f4f185 ("can: peak_usb: add support for PEAK new CANFD USB adapters")
    Link: https://lore.kernel.org/all/20210929142111.55757-1-s.grosjean@peak-system.com
    Cc: stable@vger.kernel.org
    Signed-off-by: Stephane Grosjean <s.grosjean@peak-system.com>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_fd.c b/drivers/net/can/usb/peak_usb/pcan_usb_fd.c
index 40ac37fe9dcd..d27141b9eda0 100644
--- a/drivers/net/can/usb/peak_usb/pcan_usb_fd.c
+++ b/drivers/net/can/usb/peak_usb/pcan_usb_fd.c
@@ -559,11 +559,10 @@ static int pcan_usb_fd_decode_status(struct pcan_usb_fd_if *usb_if,
 	} else if (sm->channel_p_w_b & PUCAN_BUS_WARNING) {
 		new_state = CAN_STATE_ERROR_WARNING;
 	} else {
-		/* no error bit (so, no error skb, back to active state) */
-		dev->can.state = CAN_STATE_ERROR_ACTIVE;
+		/* back to (or still in) ERROR_ACTIVE state */
+		new_state = CAN_STATE_ERROR_ACTIVE;
 		pdev->bec.txerr = 0;
 		pdev->bec.rxerr = 0;
-		return 0;
 	}
 
 	/* state hasn't changed */

commit 258dabfaa82a2afccc8cd0c935121e3cb5533ef6
Author: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Date:   Fri Sep 24 16:55:56 2021 +0900

    can: rcar_can: fix suspend/resume
    
    commit f7c05c3987dcfde9a4e8c2d533db013fabebca0d upstream.
    
    If the driver was not opened, rcar_can_suspend() should not call
    clk_disable() because the clock was not enabled.
    
    Fixes: fd1159318e55 ("can: add Renesas R-Car CAN driver")
    Link: https://lore.kernel.org/all/20210924075556.223685-1-yoshihiro.shimoda.uh@renesas.com
    Cc: stable@vger.kernel.org
    Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
    Tested-by: Ayumi Nakamichi <ayumi.nakamichi.kf@renesas.com>
    Reviewed-by: Ulrich Hecht <uli+renesas@fpond.eu>
    Tested-by: Biju Das <biju.das.jz@bp.renesas.com>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/can/rcar/rcar_can.c b/drivers/net/can/rcar/rcar_can.c
index 771a46083739..963da8eda168 100644
--- a/drivers/net/can/rcar/rcar_can.c
+++ b/drivers/net/can/rcar/rcar_can.c
@@ -857,10 +857,12 @@ static int __maybe_unused rcar_can_suspend(struct device *dev)
 	struct rcar_can_priv *priv = netdev_priv(ndev);
 	u16 ctlr;
 
-	if (netif_running(ndev)) {
-		netif_stop_queue(ndev);
-		netif_device_detach(ndev);
-	}
+	if (!netif_running(ndev))
+		return 0;
+
+	netif_stop_queue(ndev);
+	netif_device_detach(ndev);
+
 	ctlr = readw(&priv->regs->ctlr);
 	ctlr |= RCAR_CAN_CTLR_CANM_HALT;
 	writew(ctlr, &priv->regs->ctlr);
@@ -879,6 +881,9 @@ static int __maybe_unused rcar_can_resume(struct device *dev)
 	u16 ctlr;
 	int err;
 
+	if (!netif_running(ndev))
+		return 0;
+
 	err = clk_enable(priv->clk);
 	if (err) {
 		netdev_err(ndev, "clk_enable() failed, error %d\n", err);
@@ -892,10 +897,9 @@ static int __maybe_unused rcar_can_resume(struct device *dev)
 	writew(ctlr, &priv->regs->ctlr);
 	priv->can.state = CAN_STATE_ERROR_ACTIVE;
 
-	if (netif_running(ndev)) {
-		netif_device_attach(ndev);
-		netif_start_queue(ndev);
-	}
+	netif_device_attach(ndev);
+	netif_start_queue(ndev);
+
 	return 0;
 }
 

commit b06ad258e01389ca3ff13bc180f3fcd6a608f1cd
Author: Peng Li <lipeng321@huawei.com>
Date:   Tue Oct 19 22:16:35 2021 +0800

    net: hns3: disable sriov before unload hclge layer
    
    [ Upstream commit 0dd8a25f355b4df2d41c08df1716340854c7d4c5 ]
    
    HNS3 driver includes hns3.ko, hnae3.ko and hclge.ko.
    hns3.ko includes network stack and pci_driver, hclge.ko includes
    HW device action, algo_ops and timer task, hnae3.ko includes some
    register function.
    
    When SRIOV is enable and hclge.ko is removed, HW device is unloaded
    but VF still exists, PF will not reply VF mbx messages, and cause
    errors.
    
    This patch fix it by disable SRIOV before remove hclge.ko.
    
    Fixes: e2cb1dec9779 ("net: hns3: Add HNS3 VF HCL(Hardware Compatibility Layer) Support")
    Signed-off-by: Peng Li <lipeng321@huawei.com>
    Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.c b/drivers/net/ethernet/hisilicon/hns3/hnae3.c
index f9259e568fa0..b250d0fe9ac5 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.c
@@ -10,6 +10,27 @@ static LIST_HEAD(hnae3_ae_algo_list);
 static LIST_HEAD(hnae3_client_list);
 static LIST_HEAD(hnae3_ae_dev_list);
 
+void hnae3_unregister_ae_algo_prepare(struct hnae3_ae_algo *ae_algo)
+{
+	const struct pci_device_id *pci_id;
+	struct hnae3_ae_dev *ae_dev;
+
+	if (!ae_algo)
+		return;
+
+	list_for_each_entry(ae_dev, &hnae3_ae_dev_list, node) {
+		if (!hnae3_get_bit(ae_dev->flag, HNAE3_DEV_INITED_B))
+			continue;
+
+		pci_id = pci_match_id(ae_algo->pdev_id_table, ae_dev->pdev);
+		if (!pci_id)
+			continue;
+		if (IS_ENABLED(CONFIG_PCI_IOV))
+			pci_disable_sriov(ae_dev->pdev);
+	}
+}
+EXPORT_SYMBOL(hnae3_unregister_ae_algo_prepare);
+
 /* we are keeping things simple and using single lock for all the
  * list. This is a non-critical code so other updations, if happen
  * in parallel, can wait.
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
index 5e1a7ab06c63..866e9f293b4c 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
@@ -516,6 +516,7 @@ struct hnae3_handle {
 int hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev);
 void hnae3_unregister_ae_dev(struct hnae3_ae_dev *ae_dev);
 
+void hnae3_unregister_ae_algo_prepare(struct hnae3_ae_algo *ae_algo);
 void hnae3_unregister_ae_algo(struct hnae3_ae_algo *ae_algo);
 void hnae3_register_ae_algo(struct hnae3_ae_algo *ae_algo);
 
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
index 16ab000454f9..2c334b56fd42 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
@@ -6387,6 +6387,7 @@ static int hclge_init(void)
 
 static void hclge_exit(void)
 {
+	hnae3_unregister_ae_algo_prepare(&ae_algo);
 	hnae3_unregister_ae_algo(&ae_algo);
 }
 module_init(hclge_init);

commit 90de4351b679a6432a0e40ddafa8414f3481b8aa
Author: Guangbin Huang <huangguangbin2@huawei.com>
Date:   Tue Oct 19 22:16:30 2021 +0800

    net: hns3: add limit ets dwrr bandwidth cannot be 0
    
    [ Upstream commit 731797fdffa3d083db536e2fdd07ceb050bb40b1 ]
    
    If ets dwrr bandwidth of tc is set to 0, the hardware will switch to SP
    mode. In this case, this tc may occupy all the tx bandwidth if it has
    huge traffic, so it violates the purpose of the user setting.
    
    To fix this problem, limit the ets dwrr bandwidth must greater than 0.
    
    Fixes: cacde272dd00 ("net: hns3: Add hclge_dcb module for the support of DCB feature")
    Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c
index dd935cd1fb44..865d27aea7d7 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c
@@ -96,6 +96,15 @@ static int hclge_ets_validate(struct hclge_dev *hdev, struct ieee_ets *ets,
 				*changed = true;
 			break;
 		case IEEE_8021QAZ_TSA_ETS:
+			/* The hardware will switch to sp mode if bandwidth is
+			 * 0, so limit ets bandwidth must be greater than 0.
+			 */
+			if (!ets->tc_tx_bw[i]) {
+				dev_err(&hdev->pdev->dev,
+					"tc%u ets bw cannot be 0\n", i);
+				return -EINVAL;
+			}
+
 			if (hdev->tm_info.tc_info[i].tc_sch_mode !=
 				HCLGE_SCH_MODE_DWRR)
 				*changed = true;

commit e003fdb9077522d8b46c26d5c4a4afba73d7a14b
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Mon Oct 4 00:56:06 2021 -0700

    NIOS2: irqflags: rename a redefined register name
    
    [ Upstream commit 4cce60f15c04d69eff6ffc539ab09137dbe15070 ]
    
    Both arch/nios2/ and drivers/mmc/host/tmio_mmc.c define a macro
    with the name "CTL_STATUS". Change the one in arch/nios2/ to be
    "CTL_FSTATUS" (flags status) to eliminate the build warning.
    
    In file included from ../drivers/mmc/host/tmio_mmc.c:22:
    drivers/mmc/host/tmio_mmc.h:31: warning: "CTL_STATUS" redefined
       31 | #define CTL_STATUS 0x1c
    arch/nios2/include/asm/registers.h:14: note: this is the location of the previous definition
       14 | #define CTL_STATUS      0
    
    Fixes: b31ebd8055ea ("nios2: Nios2 registers")
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Cc: Dinh Nguyen <dinguyen@kernel.org>
    Signed-off-by: Dinh Nguyen <dinguyen@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/nios2/include/asm/irqflags.h b/arch/nios2/include/asm/irqflags.h
index 75ab92e639f8..0338fcb88203 100644
--- a/arch/nios2/include/asm/irqflags.h
+++ b/arch/nios2/include/asm/irqflags.h
@@ -22,7 +22,7 @@
 
 static inline unsigned long arch_local_save_flags(void)
 {
-	return RDCTL(CTL_STATUS);
+	return RDCTL(CTL_FSTATUS);
 }
 
 /*
@@ -31,7 +31,7 @@ static inline unsigned long arch_local_save_flags(void)
  */
 static inline void arch_local_irq_restore(unsigned long flags)
 {
-	WRCTL(CTL_STATUS, flags);
+	WRCTL(CTL_FSTATUS, flags);
 }
 
 static inline void arch_local_irq_disable(void)
diff --git a/arch/nios2/include/asm/registers.h b/arch/nios2/include/asm/registers.h
index 615bce19b546..33824f2ad1ab 100644
--- a/arch/nios2/include/asm/registers.h
+++ b/arch/nios2/include/asm/registers.h
@@ -24,7 +24,7 @@
 #endif
 
 /* control register numbers */
-#define CTL_STATUS	0
+#define CTL_FSTATUS	0
 #define CTL_ESTATUS	1
 #define CTL_BSTATUS	2
 #define CTL_IENABLE	3

commit 58753ea5af096fb513ca758aab97262ca6fe8ac9
Author: Vegard Nossum <vegard.nossum@oracle.com>
Date:   Fri Oct 15 15:07:54 2021 +0200

    lan78xx: select CRC32
    
    [ Upstream commit 46393d61a328d7c4e3264252dae891921126c674 ]
    
    Fix the following build/link error by adding a dependency on the CRC32
    routines:
    
      ld: drivers/net/usb/lan78xx.o: in function `lan78xx_set_multicast':
      lan78xx.c:(.text+0x48cf): undefined reference to `crc32_le'
    
    The actual use of crc32_le() comes indirectly through ether_crc().
    
    Fixes: 55d7de9de6c30 ("Microchip's LAN7800 family USB 2/3 to 10/100/1000 Ethernet device driver")
    Signed-off-by: Vegard Nossum <vegard.nossum@oracle.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig
index cc2fd1957765..23fa0e2a75ff 100644
--- a/drivers/net/usb/Kconfig
+++ b/drivers/net/usb/Kconfig
@@ -116,6 +116,7 @@ config USB_LAN78XX
 	select PHYLIB
 	select MICROCHIP_PHY
 	select FIXED_PHY
+	select CRC32
 	help
 	  This option adds support for Microchip LAN78XX based USB 2
 	  & USB 3 10/100/1000 Ethernet adapters.

commit a88bf750a4355261ed868151f90703de6b05343b
Author: Antoine Tenart <atenart@kernel.org>
Date:   Tue Oct 12 16:54:37 2021 +0200

    netfilter: ipvs: make global sysctl readonly in non-init netns
    
    [ Upstream commit 174c376278949c44aad89c514a6b5db6cee8db59 ]
    
    Because the data pointer of net/ipv4/vs/debug_level is not updated per
    netns, it must be marked as read-only in non-init netns.
    
    Fixes: c6d2d445d8de ("IPVS: netns, final patch enabling network name space.")
    Signed-off-by: Antoine Tenart <atenart@kernel.org>
    Acked-by: Julian Anastasov <ja@ssi.bg>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c
index 6208fa09fe71..3bf8d7f3cdc3 100644
--- a/net/netfilter/ipvs/ip_vs_ctl.c
+++ b/net/netfilter/ipvs/ip_vs_ctl.c
@@ -3955,6 +3955,11 @@ static int __net_init ip_vs_control_net_init_sysctl(struct netns_ipvs *ipvs)
 	tbl[idx++].data = &ipvs->sysctl_conn_reuse_mode;
 	tbl[idx++].data = &ipvs->sysctl_schedule_icmp;
 	tbl[idx++].data = &ipvs->sysctl_ignore_tunneled;
+#ifdef CONFIG_IP_VS_DEBUG
+	/* Global sysctls must be ro in non-init netns */
+	if (!net_eq(net, &init_net))
+		tbl[idx++].mode = 0444;
+#endif
 
 	ipvs->sysctl_hdr = register_net_sysctl(net, "net/ipv4/vs", tbl);
 	if (ipvs->sysctl_hdr == NULL) {

commit 0e06bd70979d1cfaf60b5ecfe624aa7354e574e5
Author: Shengjiu Wang <shengjiu.wang@nxp.com>
Date:   Wed Oct 13 13:17:04 2021 +0800

    ASoC: wm8960: Fix clock configuration on slave mode
    
    [ Upstream commit 6b9b546dc00797c74bef491668ce5431ff54e1e2 ]
    
    There is a noise issue for 8kHz sample rate on slave mode.
    Compared with master mode, the difference is the DACDIV
    setting, after correcting the DACDIV, the noise is gone.
    
    There is no noise issue for 48kHz sample rate, because
    the default value of DACDIV is correct for 48kHz.
    
    So wm8960_configure_clocking() should be functional for
    ADC and DAC function even if it is slave mode.
    
    In order to be compatible for old use case, just add
    condition for checking that sysclk is zero with
    slave mode.
    
    Fixes: 0e50b51aa22f ("ASoC: wm8960: Let wm8960 driver configure its bit clock and frame clock")
    Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>
    Acked-by: Charles Keepax <ckeepax@opensource.cirrus.com>
    Link: https://lore.kernel.org/r/1634102224-3922-1-git-send-email-shengjiu.wang@nxp.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c
index 88e869d16714..abd5c12764f0 100644
--- a/sound/soc/codecs/wm8960.c
+++ b/sound/soc/codecs/wm8960.c
@@ -755,9 +755,16 @@ static int wm8960_configure_clocking(struct snd_soc_component *component)
 	int i, j, k;
 	int ret;
 
-	if (!(iface1 & (1<<6))) {
-		dev_dbg(component->dev,
-			"Codec is slave mode, no need to configure clock\n");
+	/*
+	 * For Slave mode clocking should still be configured,
+	 * so this if statement should be removed, but some platform
+	 * may not work if the sysclk is not configured, to avoid such
+	 * compatible issue, just add '!wm8960->sysclk' condition in
+	 * this if statement.
+	 */
+	if (!(iface1 & (1 << 6)) && !wm8960->sysclk) {
+		dev_warn(component->dev,
+			 "slave mode, but proceeding with no clock configuration\n");
 		return 0;
 	}
 

commit db9aadf3bb8d7c1def4813f142cba9cf94be2999
Author: Gerald Schaefer <gerald.schaefer@linux.ibm.com>
Date:   Wed Oct 6 22:19:43 2021 +0200

    dma-debug: fix sg checks in debug_dma_map_sg()
    
    [ Upstream commit 293d92cbbd2418ca2ba43fed07f1b92e884d1c77 ]
    
    The following warning occurred sporadically on s390:
    DMA-API: nvme 0006:00:00.0: device driver maps memory from kernel text or rodata [addr=0000000048cc5e2f] [len=131072]
    WARNING: CPU: 4 PID: 825 at kernel/dma/debug.c:1083 check_for_illegal_area+0xa8/0x138
    
    It is a false-positive warning, due to broken logic in debug_dma_map_sg().
    check_for_illegal_area() checks for overlay of sg elements with kernel text
    or rodata. It is called with sg_dma_len(s) instead of s->length as
    parameter. After the call to ->map_sg(), sg_dma_len() will contain the
    length of possibly combined sg elements in the DMA address space, and not
    the individual sg element length, which would be s->length.
    
    The check will then use the physical start address of an sg element, and
    add the DMA length for the overlap check, which could result in the false
    warning, because the DMA length can be larger than the actual single sg
    element length.
    
    In addition, the call to check_for_illegal_area() happens in the iteration
    over mapped_ents, which will not include all individual sg elements if
    any of them were combined in ->map_sg().
    
    Fix this by using s->length instead of sg_dma_len(s). Also put the call to
    check_for_illegal_area() in a separate loop, iterating over all the
    individual sg elements ("nents" instead of "mapped_ents").
    
    While at it, as suggested by Robin Murphy, also move check_for_stack()
    inside the new loop, as it is similarly concerned with validating the
    individual sg elements.
    
    Link: https://lore.kernel.org/lkml/20210705185252.4074653-1-gerald.schaefer@linux.ibm.com
    Fixes: 884d05970bfb ("dma-debug: use sg_dma_len accessor")
    Signed-off-by: Gerald Schaefer <gerald.schaefer@linux.ibm.com>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/dma/debug.c b/kernel/dma/debug.c
index 3a2397444076..1c82b0d25498 100644
--- a/kernel/dma/debug.c
+++ b/kernel/dma/debug.c
@@ -1422,6 +1422,12 @@ void debug_dma_map_sg(struct device *dev, struct scatterlist *sg,
 	if (unlikely(dma_debug_disabled()))
 		return;
 
+	for_each_sg(sg, s, nents, i) {
+		check_for_stack(dev, sg_page(s), s->offset);
+		if (!PageHighMem(sg_page(s)))
+			check_for_illegal_area(dev, sg_virt(s), s->length);
+	}
+
 	for_each_sg(sg, s, mapped_ents, i) {
 		entry = dma_entry_alloc();
 		if (!entry)
@@ -1437,12 +1443,6 @@ void debug_dma_map_sg(struct device *dev, struct scatterlist *sg,
 		entry->sg_call_ents   = nents;
 		entry->sg_mapped_ents = mapped_ents;
 
-		check_for_stack(dev, sg_page(s), s->offset);
-
-		if (!PageHighMem(sg_page(s))) {
-			check_for_illegal_area(dev, sg_virt(s), sg_dma_len(s));
-		}
-
 		check_sg_segment(dev, s);
 
 		add_dma_entry(entry);

commit 2559f9ee946c3c909e4750efdb2009137fe0676d
Author: Benjamin Coddington <bcodding@redhat.com>
Date:   Wed Oct 6 13:20:44 2021 -0400

    NFSD: Keep existing listeners on portlist error
    
    [ Upstream commit c20106944eb679fa3ab7e686fe5f6ba30fbc51e5 ]
    
    If nfsd has existing listening sockets without any processes, then an error
    returned from svc_create_xprt() for an additional transport will remove
    those existing listeners.  We're seeing this in practice when userspace
    attempts to create rpcrdma transports without having the rpcrdma modules
    present before creating nfsd kernel processes.  Fix this by checking for
    existing sockets before calling nfsd_destroy().
    
    Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
index cb69660d0779..ff9899cc9913 100644
--- a/fs/nfsd/nfsctl.c
+++ b/fs/nfsd/nfsctl.c
@@ -788,7 +788,10 @@ static ssize_t __write_ports_addxprt(char *buf, struct net *net)
 		svc_xprt_put(xprt);
 	}
 out_err:
-	nfsd_destroy(net);
+	if (!list_empty(&nn->nfsd_serv->sv_permsocks))
+		nn->nfsd_serv->sv_nrthreads--;
+	 else
+		nfsd_destroy(net);
 	return err;
 }
 

commit 7b314283ede3fe13957b90a764f753215224aac0
Author: Guenter Roeck <linux@roeck-us.net>
Date:   Sun Aug 1 10:36:59 2021 -0700

    xtensa: xtfpga: Try software restart before simulating CPU reset
    
    [ Upstream commit 012e974501a270d8dfd4ee2039e1fdf7579c907e ]
    
    Rebooting xtensa images loaded with the '-kernel' option in qemu does
    not work. When executing a reboot command, the qemu session either hangs
    or experiences an endless sequence of error messages.
    
      Kernel panic - not syncing: Unrecoverable error in exception handler
    
    Reset code jumps to the CPU restart address, but Linux can not recover
    from there because code and data in the kernel init sections have been
    discarded and overwritten at this point.
    
    XTFPGA platforms have a means to reset the CPU by writing 0xdead into a
    specific FPGA IO address. When used in QEMU the kernel image loaded with
    the '-kernel' option gets restored to its original state allowing the
    machine to boot successfully.
    
    Use that mechanism to attempt a platform reset. If it does not work,
    fall back to the existing mechanism.
    
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/xtensa/platforms/xtfpga/setup.c b/arch/xtensa/platforms/xtfpga/setup.c
index 982e7c22e7ca..db5122765f16 100644
--- a/arch/xtensa/platforms/xtfpga/setup.c
+++ b/arch/xtensa/platforms/xtfpga/setup.c
@@ -54,8 +54,12 @@ void platform_power_off(void)
 
 void platform_restart(void)
 {
-	/* Flush and reset the mmu, simulate a processor reset, and
-	 * jump to the reset vector. */
+	/* Try software reset first. */
+	WRITE_ONCE(*(u32 *)XTFPGA_SWRST_VADDR, 0xdead);
+
+	/* If software reset did not work, flush and reset the mmu,
+	 * simulate a processor reset, and jump to the reset vector.
+	 */
 	cpu_reset();
 	/* control never gets here */
 }

commit 1c21a8df144f1edb3b6f5f24559825780c227a7d
Author: Max Filippov <jcmvbkbc@gmail.com>
Date:   Tue Oct 5 11:36:01 2021 -0700

    xtensa: xtfpga: use CONFIG_USE_OF instead of CONFIG_OF
    
    [ Upstream commit f3d7c2cdf6dc0d5402ec29c3673893b3542c5ad1 ]
    
    Use platform data to initialize xtfpga device drivers when CONFIG_USE_OF
    is not selected. This fixes xtfpga networking when CONFIG_USE_OF is not
    selected but CONFIG_OF is.
    
    Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/xtensa/platforms/xtfpga/setup.c b/arch/xtensa/platforms/xtfpga/setup.c
index 42285f35d313..982e7c22e7ca 100644
--- a/arch/xtensa/platforms/xtfpga/setup.c
+++ b/arch/xtensa/platforms/xtfpga/setup.c
@@ -85,7 +85,7 @@ void __init platform_calibrate_ccount(void)
 
 #endif
 
-#ifdef CONFIG_OF
+#ifdef CONFIG_USE_OF
 
 static void __init xtfpga_clk_setup(struct device_node *np)
 {
@@ -303,4 +303,4 @@ static int __init xtavnet_init(void)
  */
 arch_initcall(xtavnet_init);
 
-#endif /* CONFIG_OF */
+#endif /* CONFIG_USE_OF */

commit 7ca378b09a5f7e5dd6af8b5d9953aad7105a85fa
Author: Eugen Hristev <eugen.hristev@microchip.com>
Date:   Thu Sep 2 15:13:58 2021 +0300

    ARM: dts: at91: sama5d2_som1_ek: disable ISC node by default
    
    [ Upstream commit 4348cc10da6377a86940beb20ad357933b8f91bb ]
    
    Without a sensor node, the ISC will simply fail to probe, as the
    corresponding port node is missing.
    It is then logical to disable the node in the devicetree.
    If we add a port with a connection to a sensor endpoint, ISC can be enabled.
    
    Signed-off-by: Eugen Hristev <eugen.hristev@microchip.com>
    Signed-off-by: Nicolas Ferre <nicolas.ferre@microchip.com>
    Link: https://lore.kernel.org/r/20210902121358.503589-1-eugen.hristev@microchip.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/at91-sama5d27_som1_ek.dts b/arch/arm/boot/dts/at91-sama5d27_som1_ek.dts
index e86e0c00eb6b..f37af915a37e 100644
--- a/arch/arm/boot/dts/at91-sama5d27_som1_ek.dts
+++ b/arch/arm/boot/dts/at91-sama5d27_som1_ek.dts
@@ -106,7 +106,6 @@
 			isc: isc@f0008000 {
 				pinctrl-names = "default";
 				pinctrl-0 = <&pinctrl_isc_base &pinctrl_isc_data_8bit &pinctrl_isc_data_9_10 &pinctrl_isc_data_11_12>;
-				status = "okay";
 			};
 
 			spi0: spi@f8000000 {

commit b84613bfeb68eb9a30ad6b1ebd7426f115106135
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Wed Oct 27 09:33:49 2021 +0800

    ASoC: rockchip: Kconfig: Remove unused PREALLOC_BUFFER_SIZE
    
    This reverts part of commit 213457f1ef8f
    ("ASoC: rockchip: pcm: Adjust min/max value for pcm config").
    
    Instead, pass module option 'prealloc_buffer_size_kbytes'
    to specify it. any details please refer to:
    Documentation/sound/alsa-configuration.rst
    
    e.g. 32 kbytes prealloc buffer size:
    
    "snd_soc_core.prealloc_buffer_size_kbytes=32"
    
    Change-Id: I3788620807c4e94d3e9c15ef224b76266722dcc1
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/sound/soc/rockchip/Kconfig b/sound/soc/rockchip/Kconfig
index 186c40b7048d..efd5b797a1c2 100644
--- a/sound/soc/rockchip/Kconfig
+++ b/sound/soc/rockchip/Kconfig
@@ -6,14 +6,6 @@ config SND_SOC_ROCKCHIP
 	  the Rockchip SoCs' Audio interfaces. You will also need to
 	  select the audio interfaces to support below.
 
-config SND_SOC_ROCKCHIP_PREALLOC_BUFFER_SIZE
-	int "Default prealloc buffer size (kbytes)"
-	depends on SND_SOC_ROCKCHIP
-	default "512"
-	help
-	  The default value is 512 kilobytes. Only change this if you know
-	  what you are doing.
-
 config SND_SOC_ROCKCHIP_AUDIO_PWM
 	tristate "Rockchip Audio PWM Driver"
 	depends on CLKDEV_LOOKUP && SND_SOC_ROCKCHIP

commit e8ce286fac5ba4fcedf9f857ce786d9949bbd4fc
Author: Su Yuefu <yuefu.su@rock-chips.com>
Date:   Tue Oct 26 18:08:47 2021 +0800

    media: i2c: add sc223a sensor driver
    
    Signed-off-by: Su Yuefu <yuefu.su@rock-chips.com>
    Change-Id: Ib7b04474b80318889bc356c25506cc8e1497902a

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index f8c0921f10dd..3252c63a9ae6 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -1802,6 +1802,17 @@ config VIDEO_SC2239
 	  To compile this driver as a module, choose M here: the
 	  module will be called sc2239.
 
+config VIDEO_SC223A
+	tristate "SmartSens SC223A sensor support"
+	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
+	depends on MEDIA_CAMERA_SUPPORT
+	select V4L2_FWNODE
+	help
+	  Support for the SmartSens SC223A sensor.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called sc223a.
+
 config VIDEO_SC2310
 	tristate "SmartSens SC2310 sensor support"
 	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index 3e40b2f3bd89..6e62bc83461d 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -194,6 +194,7 @@ obj-$(CONFIG_VIDEO_SC200AI)	+= sc200ai.o
 obj-$(CONFIG_VIDEO_SC210IOT)	+= sc210iot.o
 obj-$(CONFIG_VIDEO_SC2232)	+= sc2232.o
 obj-$(CONFIG_VIDEO_SC2239)	+= sc2239.o
+obj-$(CONFIG_VIDEO_SC223A)	+= sc223a.o
 obj-$(CONFIG_VIDEO_SC2310)	+= sc2310.o
 obj-$(CONFIG_VIDEO_SC2335)	+= sc2335.o
 obj-$(CONFIG_VIDEO_SC401AI)	+= sc401ai.o
diff --git a/drivers/media/i2c/sc223a.c b/drivers/media/i2c/sc223a.c
new file mode 100644
index 000000000000..838491d32430
--- /dev/null
+++ b/drivers/media/i2c/sc223a.c
@@ -0,0 +1,1490 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * sc223a driver
+ *
+ * Copyright (C) 2020 Cnd Electronics Co., Ltd.
+ *
+ * V0.0X01.0X01 first version.
+ */
+
+#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 <linux/rk-preisp.h>
+#include <media/media-entity.h>
+#include <media/v4l2-async.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-subdev.h>
+#include <linux/pinctrl/consumer.h>
+
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x01)
+
+#ifndef V4L2_CID_DIGITAL_GAIN
+#define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
+#endif
+
+#define SC223A_LANES			2
+#define SC223A_BITS_PER_SAMPLE		10
+#define SC223A_LINK_FREQ_371		371250000// 742.5Mbps
+
+#define PIXEL_RATE_WITH_371M_10BIT		(SC223A_LINK_FREQ_371 * 2 * \
+					SC223A_LANES / SC223A_BITS_PER_SAMPLE)
+#define SC223A_XVCLK_FREQ		27000000
+
+#define CHIP_ID				0xcb3e
+#define SC223A_REG_CHIP_ID		0x3107
+
+#define SC223A_REG_CTRL_MODE		0x0100
+#define SC223A_MODE_SW_STANDBY		0x0
+#define SC223A_MODE_STREAMING		BIT(0)
+
+#define SC223A_REG_EXPOSURE_H		0x3e00
+#define SC223A_REG_EXPOSURE_M		0x3e01
+#define SC223A_REG_EXPOSURE_L		0x3e02
+#define SC223A_REG_SEXPOSURE_H		0x3e22
+#define SC223A_REG_SEXPOSURE_M		0x3e04
+#define SC223A_REG_SEXPOSURE_L		0x3e05
+#define	SC223A_EXPOSURE_MIN		1
+#define	SC223A_EXPOSURE_STEP		1
+#define SC223A_VTS_MAX			0x7fff
+
+#define SC223A_REG_DIG_GAIN		0x3e06
+#define SC223A_REG_DIG_FINE_GAIN	0x3e07
+#define SC223A_REG_ANA_GAIN		0x3e09
+#define SC223A_REG_SDIG_GAIN		0x3e10
+#define SC223A_REG_SDIG_FINE_GAIN	0x3e11
+#define SC223A_REG_SANA_GAIN		0x3e12
+#define SC223A_REG_SANA_FINE_GAIN	0x3e13
+#define SC223A_GAIN_MIN		0x0040
+#define SC223A_GAIN_MAX		(54 * 32 * 64)
+#define SC223A_GAIN_STEP		1
+#define SC223A_GAIN_DEFAULT		0x0800
+#define SC223A_LGAIN			0
+#define SC223A_SGAIN			1
+
+#define SC223A_REG_GROUP_HOLD		0x3812
+#define SC223A_GROUP_HOLD_START	0x00
+#define SC223A_GROUP_HOLD_END		0x30
+
+#define SC223A_REG_HIGH_TEMP_H		0x3974
+#define SC223A_REG_HIGH_TEMP_L		0x3975
+
+#define SC223A_REG_TEST_PATTERN	0x4501
+#define SC223A_TEST_PATTERN_BIT_MASK	BIT(3)
+
+#define SC223A_REG_VTS_H		0x320e
+#define SC223A_REG_VTS_L		0x320f
+
+#define SC223A_FLIP_MIRROR_REG		0x3221
+
+#define SC223A_FETCH_AGAIN_H(VAL)		(((VAL) >> 8) & 0x03)
+#define SC223A_FETCH_AGAIN_L(VAL)		((VAL) & 0xFF)
+
+#define SC223A_FETCH_MIRROR(VAL, ENABLE)	(ENABLE ? VAL | 0x06 : VAL & 0xf9)
+#define SC223A_FETCH_FLIP(VAL, ENABLE)		(ENABLE ? VAL | 0x60 : VAL & 0x9f)
+
+#define REG_DELAY			0xFFFE
+#define REG_NULL			0xFFFF
+
+#define SC223A_REG_VALUE_08BIT		1
+#define SC223A_REG_VALUE_16BIT		2
+#define SC223A_REG_VALUE_24BIT		3
+
+#define OF_CAMERA_PINCTRL_STATE_DEFAULT	"rockchip,camera_default"
+#define OF_CAMERA_PINCTRL_STATE_SLEEP	"rockchip,camera_sleep"
+#define OF_CAMERA_HDR_MODE		"rockchip,camera-hdr-mode"
+#define SC223A_NAME			"sc223a"
+
+static const char * const sc223a_supply_names[] = {
+	"avdd",		/* Analog power */
+	"dovdd",	/* Digital I/O power */
+	"dvdd",		/* Digital core power */
+};
+
+#define SC223A_NUM_SUPPLIES ARRAY_SIZE(sc223a_supply_names)
+
+enum sc223a_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 sc223a_mode {
+	u32 bus_fmt;
+	u32 width;
+	u32 height;
+	struct v4l2_fract max_fps;
+	u32 hts_def;
+	u32 vts_def;
+	u32 exp_def;
+	const struct regval *reg_list;
+	u32 hdr_mode;
+	u32 vc[PAD_MAX];
+};
+
+struct sc223a {
+	struct i2c_client	*client;
+	struct clk		*xvclk;
+	struct gpio_desc	*reset_gpio;
+	struct gpio_desc	*pwdn_gpio;
+	struct regulator_bulk_data supplies[SC223A_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	*test_pattern;
+	struct mutex		mutex;
+	bool			streaming;
+	bool			power_on;
+	const struct sc223a_mode *cur_mode;
+	u32			module_index;
+	const char		*module_facing;
+	const char		*module_name;
+	const char		*len_name;
+	u32			cur_vts;
+	bool			has_init_exp;
+	struct preisp_hdrae_exp_s init_hdrae_exp;
+};
+
+#define to_sc223a(sd) container_of(sd, struct sc223a, subdev)
+
+/*
+ * Xclk 24Mhz
+ */
+static const struct regval sc223a_global_regs[] = {
+	{REG_NULL, 0x00},
+};
+
+/*
+ * Xclk 24Mhz
+ * max_framerate 90fps
+ * mipi_datarate per lane 1008Mbps, 4lane
+ */
+static const struct regval sc223a_linear_10_1920x1080_regs[] = {
+	{0x0100, 0x00},
+	{0x36e9, 0x80},
+	{0x37f9, 0x80},
+	{0x301f, 0x01},
+	{0x3253, 0x0c},
+	{0x3281, 0x80},
+	{0x3301, 0x08},
+	{0x3302, 0x12},
+	{0x3306, 0xb0},
+	{0x3309, 0x60},
+	{0x330a, 0x01},
+	{0x330b, 0x60},
+	{0x330d, 0x20},
+	{0x331e, 0x41},
+	{0x331f, 0x51},
+	{0x3320, 0x0a},
+	{0x3326, 0x0e},
+	{0x3333, 0x10},
+	{0x3334, 0x40},
+	{0x335d, 0x60},
+	{0x335e, 0x06},
+	{0x335f, 0x08},
+	{0x3364, 0x56},
+	{0x337a, 0x06},
+	{0x337b, 0x0e},
+	{0x337c, 0x02},
+	{0x337d, 0x0a},
+	{0x3390, 0x03},
+	{0x3391, 0x0f},
+	{0x3392, 0x1f},
+	{0x3393, 0x08},
+	{0x3394, 0x08},
+	{0x3395, 0x08},
+	{0x3396, 0x41},
+	{0x3397, 0x47},
+	{0x3398, 0x5f},
+	{0x3399, 0x08},
+	{0x339a, 0x10},
+	{0x339b, 0x38},
+	{0x339c, 0x3c},
+	{0x33a2, 0x04},
+	{0x33a3, 0x0a},
+	{0x33ad, 0x18},
+	{0x33af, 0x40},
+	{0x33b1, 0x80},
+	{0x33b3, 0x20},
+	{0x349f, 0x02},
+	{0x34a6, 0x41},
+	{0x34a7, 0x47},
+	{0x34a8, 0x20},
+	{0x34a9, 0x20},
+	{0x34f8, 0x5f},
+	{0x34f9, 0x20},
+	{0x3630, 0xc0},
+	{0x3631, 0x86},
+	{0x3632, 0x26},
+	{0x3633, 0x32},
+	{0x363a, 0x84},
+	{0x3641, 0x3a},
+	{0x3670, 0x4e},
+	{0x3674, 0xc0},
+	{0x3675, 0xc0},
+	{0x3676, 0xc0},
+	{0x3677, 0x86},
+	{0x3678, 0x8b},
+	{0x3679, 0x8c},
+	{0x367c, 0x47},
+	{0x367d, 0x5f},
+	{0x367e, 0x47},
+	{0x367f, 0x5f},
+	{0x3690, 0x42},
+	{0x3691, 0x43},
+	{0x3692, 0x63},
+	{0x3699, 0x84},
+	{0x369a, 0x8c},
+	{0x369b, 0xa4},
+	{0x369c, 0x41},
+	{0x369d, 0x47},
+	{0x36a2, 0x41},
+	{0x36a3, 0x47},
+	{0x370f, 0x01},
+	{0x3721, 0x6c},
+	{0x3722, 0x09},
+	{0x3725, 0xa4},
+	{0x37b0, 0x09},
+	{0x37b1, 0x09},
+	{0x37b2, 0x05},
+	{0x37b3, 0x41},
+	{0x37b4, 0x5f},
+	{0x3901, 0x02},
+	{0x3e01, 0x8c},
+	{0x4509, 0x28},
+	{0x4518, 0x00},
+	{0x5799, 0x06},
+	{0x5ae0, 0xfe},
+	{0x5ae1, 0x40},
+	{0x5ae2, 0x38},
+	{0x5ae3, 0x30},
+	{0x5ae4, 0x28},
+	{0x5ae5, 0x38},
+	{0x5ae6, 0x30},
+	{0x5ae7, 0x28},
+	{0x5ae8, 0x3f},
+	{0x5ae9, 0x34},
+	{0x5aea, 0x2c},
+	{0x5aeb, 0x3f},
+	{0x5aec, 0x34},
+	{0x5aed, 0x2c},
+	{0x5aee, 0xfe},
+	{0x5aef, 0x40},
+	{0x5af4, 0x38},
+	{0x5af5, 0x30},
+	{0x5af6, 0x28},
+	{0x5af7, 0x38},
+	{0x5af8, 0x30},
+	{0x5af9, 0x28},
+	{0x5afa, 0x3f},
+	{0x5afb, 0x34},
+	{0x5afc, 0x2c},
+	{0x5afd, 0x3f},
+	{0x5afe, 0x34},
+	{0x5aff, 0x2c},
+	{0x36e9, 0x20},
+	{0x37f9, 0x27},
+	{0x0100, 0x01},
+	{REG_NULL, 0x00},
+};
+
+static const struct sc223a_mode supported_modes[] = {
+	{
+		.width = 1920,
+		.height = 1080,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x0080,
+		.hts_def = 0x44C * 2,
+		.vts_def = 0x0465,
+		.bus_fmt = MEDIA_BUS_FMT_SBGGR10_1X10,
+		.reg_list = sc223a_linear_10_1920x1080_regs,
+		.hdr_mode = NO_HDR,
+		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0,
+	}
+};
+
+static const s64 link_freq_menu_items[] = {
+	SC223A_LINK_FREQ_371
+};
+
+static const char * const sc223a_test_pattern_menu[] = {
+	"Disabled",
+	"Vertical Color Bar Type 1",
+	"Vertical Color Bar Type 2",
+	"Vertical Color Bar Type 3",
+	"Vertical Color Bar Type 4"
+};
+
+/* Write registers up to 4 at a time */
+static int sc223a_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;
+
+	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 sc223a_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 = sc223a_write_reg(client, regs[i].addr,
+					SC223A_REG_VALUE_08BIT, regs[i].val);
+
+	return ret;
+}
+
+/* Read registers up to 4 at a time */
+static int sc223a_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 *)&reg_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 sc223a_set_gain_reg(struct sc223a *sc223a, u32 gain)
+{
+	struct device *dev = &sc223a->client->dev;
+	u8 again_reg, dgain_reg;
+	u8 dgain_f_reg;
+	int ret = 0;
+
+	if (gain < 0xe8) {/* 1 - 1.81 gain */
+		if (gain < 0x80)
+			dev_info(dev, "The minimum gain reg value is 0x80\n");
+		again_reg = 0x00;
+		dgain_reg = 0x00;
+		dgain_f_reg = gain;
+	} else if (gain < 0x1cf) {/* 1.81 - 3.62 gain */
+		again_reg = 0x40;
+		dgain_reg = 0x00;
+		dgain_f_reg = (gain * 100) / 181;
+	} else if (gain < 0x39e) {/* 3.62 - 7.24 gain */
+		again_reg = 0x48;
+		dgain_reg = 0x00;
+		dgain_f_reg = ((gain >> 1) * 100) / 181;
+	} else if (gain < 0x73d) {/* 7.24 - 14.48 gain */
+		again_reg = 0x49;
+		dgain_reg = 0x00;
+		dgain_f_reg = ((gain >> 2) * 100) / 181;
+	} else if (gain < 0xe7a) {/* 14.48 - 28.96 gain */
+		again_reg = 0x4B;
+		dgain_reg = 0x00;
+		dgain_f_reg = ((gain >> 3) * 100) / 181;
+	} else if (gain < 0x1cf5) {/* 28.96 - 57.92 gain */
+		again_reg = 0x4F;
+		dgain_reg = 0x00;
+		dgain_f_reg = ((gain >> 4) * 100) / 181;
+	} else if (gain < 0x3985) {/* 57.92 - 115.84 gain */
+		again_reg = 0x5F;
+		dgain_reg = 0x00;
+		dgain_f_reg = ((gain >> 5) * 100) / 181;
+	} else if (gain < 0x73d7) {/* 115.84 - 231.68 gain */
+		again_reg = 0x5F;
+		dgain_reg = 0x01;
+		dgain_f_reg = ((gain >> 6) * 100) / 181;
+	} else {/* 231.68 gain */
+		again_reg = 0x5F;
+		dgain_reg = 0x03;
+		dgain_f_reg = 0x80;
+	}
+	ret = sc223a_write_reg(sc223a->client,
+		SC223A_REG_DIG_GAIN,
+		SC223A_REG_VALUE_08BIT,
+		dgain_reg);
+	ret |= sc223a_write_reg(sc223a->client,
+		SC223A_REG_DIG_FINE_GAIN,
+		SC223A_REG_VALUE_08BIT,
+		dgain_f_reg);
+	ret |= sc223a_write_reg(sc223a->client,
+		SC223A_REG_ANA_GAIN,
+		SC223A_REG_VALUE_08BIT,
+		again_reg);
+
+	return ret;
+}
+
+static int sc223a_get_reso_dist(const struct sc223a_mode *mode,
+				 struct v4l2_mbus_framefmt *framefmt)
+{
+	return abs(mode->width - framefmt->width) +
+		abs(mode->height - framefmt->height);
+}
+
+static const struct sc223a_mode *
+sc223a_find_best_fit(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 < ARRAY_SIZE(supported_modes); i++) {
+		dist = sc223a_get_reso_dist(&supported_modes[i], framefmt);
+		if (cur_best_fit_dist == -1 || dist < cur_best_fit_dist) {
+			cur_best_fit_dist = dist;
+			cur_best_fit = i;
+		}
+	}
+
+	return &supported_modes[cur_best_fit];
+}
+
+static int sc223a_set_fmt(struct v4l2_subdev *sd,
+			   struct v4l2_subdev_pad_config *cfg,
+			   struct v4l2_subdev_format *fmt)
+{
+	struct sc223a *sc223a = to_sc223a(sd);
+	const struct sc223a_mode *mode;
+	s64 h_blank, vblank_def;
+
+	mutex_lock(&sc223a->mutex);
+
+	mode = sc223a_find_best_fit(fmt);
+	fmt->format.code = mode->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(&sc223a->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		sc223a->cur_mode = mode;
+		h_blank = mode->hts_def - mode->width;
+		__v4l2_ctrl_modify_range(sc223a->hblank, h_blank,
+					 h_blank, 1, h_blank);
+		vblank_def = mode->vts_def - mode->height;
+		__v4l2_ctrl_modify_range(sc223a->vblank, vblank_def,
+					 SC223A_VTS_MAX - mode->height,
+					 1, vblank_def);
+	}
+
+	mutex_unlock(&sc223a->mutex);
+
+	return 0;
+}
+
+static int sc223a_get_fmt(struct v4l2_subdev *sd,
+			   struct v4l2_subdev_pad_config *cfg,
+			   struct v4l2_subdev_format *fmt)
+{
+	struct sc223a *sc223a = to_sc223a(sd);
+	const struct sc223a_mode *mode = sc223a->cur_mode;
+
+	mutex_lock(&sc223a->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(&sc223a->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		fmt->format.width = mode->width;
+		fmt->format.height = mode->height;
+		fmt->format.code = mode->bus_fmt;
+		fmt->format.field = V4L2_FIELD_NONE;
+		/* format info: width/height/data type/virctual channel */
+		if (fmt->pad < PAD_MAX && mode->hdr_mode != NO_HDR)
+			fmt->reserved[0] = mode->vc[fmt->pad];
+		else
+			fmt->reserved[0] = mode->vc[PAD0];
+	}
+	mutex_unlock(&sc223a->mutex);
+
+	return 0;
+}
+
+static int sc223a_enum_mbus_code(struct v4l2_subdev *sd,
+				  struct v4l2_subdev_pad_config *cfg,
+				  struct v4l2_subdev_mbus_code_enum *code)
+{
+	struct sc223a *sc223a = to_sc223a(sd);
+
+	if (code->index != 0)
+		return -EINVAL;
+	code->code = sc223a->cur_mode->bus_fmt;
+
+	return 0;
+}
+
+static int sc223a_enum_frame_sizes(struct v4l2_subdev *sd,
+				    struct v4l2_subdev_pad_config *cfg,
+				    struct v4l2_subdev_frame_size_enum *fse)
+{
+	if (fse->index >= ARRAY_SIZE(supported_modes))
+		return -EINVAL;
+
+	if (fse->code != supported_modes[0].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;
+
+	return 0;
+}
+
+static int sc223a_enable_test_pattern(struct sc223a *sc223a, u32 pattern)
+{
+	u32 val = 0;
+	int ret = 0;
+
+	ret = sc223a_read_reg(sc223a->client, SC223A_REG_TEST_PATTERN,
+			       SC223A_REG_VALUE_08BIT, &val);
+	if (pattern)
+		val |= SC223A_TEST_PATTERN_BIT_MASK;
+	else
+		val &= ~SC223A_TEST_PATTERN_BIT_MASK;
+
+	ret |= sc223a_write_reg(sc223a->client, SC223A_REG_TEST_PATTERN,
+				 SC223A_REG_VALUE_08BIT, val);
+	return ret;
+}
+
+static int sc223a_g_frame_interval(struct v4l2_subdev *sd,
+				    struct v4l2_subdev_frame_interval *fi)
+{
+	struct sc223a *sc223a = to_sc223a(sd);
+	const struct sc223a_mode *mode = sc223a->cur_mode;
+
+	mutex_lock(&sc223a->mutex);
+	fi->interval = mode->max_fps;
+	mutex_unlock(&sc223a->mutex);
+
+	return 0;
+}
+
+static int sc223a_g_mbus_config(struct v4l2_subdev *sd,
+				 struct v4l2_mbus_config *config)
+{
+	struct sc223a *sc223a = to_sc223a(sd);
+	const struct sc223a_mode *mode = sc223a->cur_mode;
+	u32 val = 1 << (SC223A_LANES - 1) |
+		V4L2_MBUS_CSI2_CHANNEL_0 |
+		V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
+
+	if (mode->hdr_mode != NO_HDR)
+		val |= V4L2_MBUS_CSI2_CHANNEL_1;
+	if (mode->hdr_mode == HDR_X3)
+		val |= V4L2_MBUS_CSI2_CHANNEL_2;
+
+	config->type = V4L2_MBUS_CSI2;
+	config->flags = val;
+
+	return 0;
+}
+
+static void sc223a_get_module_inf(struct sc223a *sc223a,
+				   struct rkmodule_inf *inf)
+{
+	memset(inf, 0, sizeof(*inf));
+	strscpy(inf->base.sensor, SC223A_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, sc223a->module_name,
+		sizeof(inf->base.module));
+	strscpy(inf->base.lens, sc223a->len_name, sizeof(inf->base.lens));
+}
+
+static long sc223a_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	struct sc223a *sc223a = to_sc223a(sd);
+	struct rkmodule_hdr_cfg *hdr;
+	u32 i, h, w;
+	long ret = 0;
+	u32 stream = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		sc223a_get_module_inf(sc223a, (struct rkmodule_inf *)arg);
+		break;
+	case RKMODULE_GET_HDR_CFG:
+		hdr = (struct rkmodule_hdr_cfg *)arg;
+		hdr->esp.mode = HDR_NORMAL_VC;
+		hdr->hdr_mode = sc223a->cur_mode->hdr_mode;
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr = (struct rkmodule_hdr_cfg *)arg;
+		w = sc223a->cur_mode->width;
+		h = sc223a->cur_mode->height;
+		for (i = 0; i < ARRAY_SIZE(supported_modes); i++) {
+			if (w == supported_modes[i].width &&
+			    h == supported_modes[i].height &&
+			    supported_modes[i].hdr_mode == hdr->hdr_mode) {
+				sc223a->cur_mode = &supported_modes[i];
+				break;
+			}
+		}
+		if (i == ARRAY_SIZE(supported_modes)) {
+			dev_err(&sc223a->client->dev,
+				"not find hdr mode:%d %dx%d config\n",
+				hdr->hdr_mode, w, h);
+			ret = -EINVAL;
+		} else {
+			w = sc223a->cur_mode->hts_def - sc223a->cur_mode->width;
+			h = sc223a->cur_mode->vts_def - sc223a->cur_mode->height;
+			__v4l2_ctrl_modify_range(sc223a->hblank, w, w, 1, w);
+			__v4l2_ctrl_modify_range(sc223a->vblank, h,
+						 SC223A_VTS_MAX - sc223a->cur_mode->height, 1, h);
+		}
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+
+		stream = *((u32 *)arg);
+
+		if (stream)
+			ret = sc223a_write_reg(sc223a->client, SC223A_REG_CTRL_MODE,
+				 SC223A_REG_VALUE_08BIT, SC223A_MODE_STREAMING);
+		else
+			ret = sc223a_write_reg(sc223a->client, SC223A_REG_CTRL_MODE,
+				 SC223A_REG_VALUE_08BIT, SC223A_MODE_SW_STANDBY);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+
+#ifdef CONFIG_COMPAT
+static long sc223a_compat_ioctl32(struct v4l2_subdev *sd,
+				   unsigned int cmd, unsigned long arg)
+{
+	void __user *up = compat_ptr(arg);
+	struct rkmodule_inf *inf;
+	struct rkmodule_hdr_cfg *hdr;
+	long ret;
+	u32 stream = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		inf = kzalloc(sizeof(*inf), GFP_KERNEL);
+		if (!inf) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = sc223a_ioctl(sd, cmd, inf);
+		if (!ret) {
+			ret = copy_to_user(up, inf, sizeof(*inf));
+			if (ret)
+				return -EFAULT;
+		}
+		kfree(inf);
+		break;
+	case RKMODULE_GET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = sc223a_ioctl(sd, cmd, hdr);
+		if (!ret) {
+			ret = copy_to_user(up, hdr, sizeof(*hdr));
+			if (ret)
+				return -EFAULT;
+		}
+		kfree(hdr);
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		if (copy_from_user(hdr, up, sizeof(*hdr)))
+			return -EFAULT;
+
+		ret = sc223a_ioctl(sd, cmd, hdr);
+		kfree(hdr);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		if (copy_from_user(&stream, up, sizeof(u32)))
+			return -EFAULT;
+
+		ret = sc223a_ioctl(sd, cmd, &stream);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+#endif
+
+static int __sc223a_start_stream(struct sc223a *sc223a)
+{
+	int ret;
+
+	ret = sc223a_write_array(sc223a->client, sc223a->cur_mode->reg_list);
+	if (ret)
+		return ret;
+
+	/* In case these controls are set before streaming */
+	ret = __v4l2_ctrl_handler_setup(&sc223a->ctrl_handler);
+	if (ret)
+		return ret;
+	if (sc223a->has_init_exp && sc223a->cur_mode->hdr_mode != NO_HDR) {
+		ret = sc223a_ioctl(&sc223a->subdev, PREISP_CMD_SET_HDRAE_EXP,
+			&sc223a->init_hdrae_exp);
+		if (ret) {
+			dev_err(&sc223a->client->dev,
+				"init exp fail in hdr mode\n");
+			return ret;
+		}
+	}
+
+	return sc223a_write_reg(sc223a->client, SC223A_REG_CTRL_MODE,
+				 SC223A_REG_VALUE_08BIT, SC223A_MODE_STREAMING);
+}
+
+static int __sc223a_stop_stream(struct sc223a *sc223a)
+{
+	sc223a->has_init_exp = false;
+	return sc223a_write_reg(sc223a->client, SC223A_REG_CTRL_MODE,
+				 SC223A_REG_VALUE_08BIT, SC223A_MODE_SW_STANDBY);
+}
+
+static int sc223a_s_stream(struct v4l2_subdev *sd, int on)
+{
+	struct sc223a *sc223a = to_sc223a(sd);
+	struct i2c_client *client = sc223a->client;
+	int ret = 0;
+
+	mutex_lock(&sc223a->mutex);
+	on = !!on;
+	if (on == sc223a->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 = __sc223a_start_stream(sc223a);
+		if (ret) {
+			v4l2_err(sd, "start stream failed while write regs\n");
+			pm_runtime_put(&client->dev);
+			goto unlock_and_return;
+		}
+	} else {
+		__sc223a_stop_stream(sc223a);
+		pm_runtime_put(&client->dev);
+	}
+
+	sc223a->streaming = on;
+
+unlock_and_return:
+	mutex_unlock(&sc223a->mutex);
+
+	return ret;
+}
+
+static int sc223a_s_power(struct v4l2_subdev *sd, int on)
+{
+	struct sc223a *sc223a = to_sc223a(sd);
+	struct i2c_client *client = sc223a->client;
+	int ret = 0;
+
+	mutex_lock(&sc223a->mutex);
+
+	/* If the power state is not modified - no work to do. */
+	if (sc223a->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;
+		}
+
+		ret = sc223a_write_array(sc223a->client, sc223a_global_regs);
+		if (ret) {
+			v4l2_err(sd, "could not set init registers\n");
+			pm_runtime_put_noidle(&client->dev);
+			goto unlock_and_return;
+		}
+
+		sc223a->power_on = true;
+	} else {
+		pm_runtime_put(&client->dev);
+		sc223a->power_on = false;
+	}
+
+unlock_and_return:
+	mutex_unlock(&sc223a->mutex);
+
+	return ret;
+}
+
+/* Calculate the delay in us by clock rate and clock cycles */
+static inline u32 sc223a_cal_delay(u32 cycles)
+{
+	return DIV_ROUND_UP(cycles, SC223A_XVCLK_FREQ / 1000 / 1000);
+}
+
+static int __sc223a_power_on(struct sc223a *sc223a)
+{
+	int ret;
+	u32 delay_us;
+	struct device *dev = &sc223a->client->dev;
+
+	if (!IS_ERR_OR_NULL(sc223a->pins_default)) {
+		ret = pinctrl_select_state(sc223a->pinctrl,
+					   sc223a->pins_default);
+		if (ret < 0)
+			dev_err(dev, "could not set pins\n");
+	}
+	ret = clk_set_rate(sc223a->xvclk, SC223A_XVCLK_FREQ);
+	if (ret < 0)
+		dev_warn(dev, "Failed to set xvclk rate (24MHz)\n");
+	if (clk_get_rate(sc223a->xvclk) != SC223A_XVCLK_FREQ)
+		dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n");
+	ret = clk_prepare_enable(sc223a->xvclk);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable xvclk\n");
+		return ret;
+	}
+	if (!IS_ERR(sc223a->reset_gpio))
+		gpiod_set_value_cansleep(sc223a->reset_gpio, 0);
+
+	ret = regulator_bulk_enable(SC223A_NUM_SUPPLIES, sc223a->supplies);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable regulators\n");
+		goto disable_clk;
+	}
+
+	if (!IS_ERR(sc223a->reset_gpio))
+		gpiod_set_value_cansleep(sc223a->reset_gpio, 1);
+
+	usleep_range(500, 1000);
+	if (!IS_ERR(sc223a->pwdn_gpio))
+		gpiod_set_value_cansleep(sc223a->pwdn_gpio, 1);
+
+	if (!IS_ERR(sc223a->reset_gpio))
+		usleep_range(6000, 8000);
+	else
+		usleep_range(12000, 16000);
+
+	/* 8192 cycles prior to first SCCB transaction */
+	delay_us = sc223a_cal_delay(8192);
+	usleep_range(delay_us, delay_us * 2);
+
+	return 0;
+
+disable_clk:
+	clk_disable_unprepare(sc223a->xvclk);
+
+	return ret;
+}
+
+static void __sc223a_power_off(struct sc223a *sc223a)
+{
+	int ret;
+	struct device *dev = &sc223a->client->dev;
+
+	if (!IS_ERR(sc223a->pwdn_gpio))
+		gpiod_set_value_cansleep(sc223a->pwdn_gpio, 0);
+	clk_disable_unprepare(sc223a->xvclk);
+	if (!IS_ERR(sc223a->reset_gpio))
+		gpiod_set_value_cansleep(sc223a->reset_gpio, 0);
+	if (!IS_ERR_OR_NULL(sc223a->pins_sleep)) {
+		ret = pinctrl_select_state(sc223a->pinctrl,
+					   sc223a->pins_sleep);
+		if (ret < 0)
+			dev_dbg(dev, "could not set pins\n");
+	}
+	regulator_bulk_disable(SC223A_NUM_SUPPLIES, sc223a->supplies);
+}
+
+static int sc223a_runtime_resume(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct sc223a *sc223a = to_sc223a(sd);
+
+	return __sc223a_power_on(sc223a);
+}
+
+static int sc223a_runtime_suspend(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct sc223a *sc223a = to_sc223a(sd);
+
+	__sc223a_power_off(sc223a);
+
+	return 0;
+}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static int sc223a_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
+{
+	struct sc223a *sc223a = to_sc223a(sd);
+	struct v4l2_mbus_framefmt *try_fmt =
+				v4l2_subdev_get_try_format(sd, fh->pad, 0);
+	const struct sc223a_mode *def_mode = &supported_modes[0];
+
+	mutex_lock(&sc223a->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->field = V4L2_FIELD_NONE;
+
+	mutex_unlock(&sc223a->mutex);
+	/* No crop or compose */
+
+	return 0;
+}
+#endif
+
+static int sc223a_enum_frame_interval(struct v4l2_subdev *sd,
+				       struct v4l2_subdev_pad_config *cfg,
+				       struct v4l2_subdev_frame_interval_enum *fie)
+{
+	if (fie->index >= ARRAY_SIZE(supported_modes))
+		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;
+	return 0;
+}
+
+static const struct dev_pm_ops sc223a_pm_ops = {
+	SET_RUNTIME_PM_OPS(sc223a_runtime_suspend,
+			   sc223a_runtime_resume, NULL)
+};
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static const struct v4l2_subdev_internal_ops sc223a_internal_ops = {
+	.open = sc223a_open,
+};
+#endif
+
+static const struct v4l2_subdev_core_ops sc223a_core_ops = {
+	.s_power = sc223a_s_power,
+	.ioctl = sc223a_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = sc223a_compat_ioctl32,
+#endif
+};
+
+static const struct v4l2_subdev_video_ops sc223a_video_ops = {
+	.s_stream = sc223a_s_stream,
+	.g_frame_interval = sc223a_g_frame_interval,
+	.g_mbus_config = sc223a_g_mbus_config,
+};
+
+static const struct v4l2_subdev_pad_ops sc223a_pad_ops = {
+	.enum_mbus_code = sc223a_enum_mbus_code,
+	.enum_frame_size = sc223a_enum_frame_sizes,
+	.enum_frame_interval = sc223a_enum_frame_interval,
+	.get_fmt = sc223a_get_fmt,
+	.set_fmt = sc223a_set_fmt,
+};
+
+static const struct v4l2_subdev_ops sc223a_subdev_ops = {
+	.core	= &sc223a_core_ops,
+	.video	= &sc223a_video_ops,
+	.pad	= &sc223a_pad_ops,
+};
+
+static int sc223a_set_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct sc223a *sc223a = container_of(ctrl->handler,
+					       struct sc223a, ctrl_handler);
+	struct i2c_client *client = sc223a->client;
+	s64 max;
+	int ret = 0;
+	u32 val = 0;
+	u32 reg = 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 = sc223a->cur_mode->height + ctrl->val - 4;
+
+		__v4l2_ctrl_modify_range(sc223a->exposure,
+					 sc223a->exposure->minimum, max,
+					 sc223a->exposure->step,
+					 sc223a->exposure->default_value);
+		break;
+	}
+
+	if (!pm_runtime_get_if_in_use(&client->dev))
+		return 0;
+
+	switch (ctrl->id) {
+	case V4L2_CID_EXPOSURE:
+		if (sc223a->cur_mode->hdr_mode == NO_HDR) {
+			val = ctrl->val < 2;
+
+			ret = sc223a_read_reg(sc223a->client, SC223A_REG_EXPOSURE_H,
+						SC223A_REG_VALUE_08BIT, &reg);
+			ret |= sc223a_write_reg(sc223a->client,
+						SC223A_REG_EXPOSURE_H,
+						SC223A_REG_VALUE_08BIT,
+						((val >> 12) | (reg & 0xF0)));
+
+			ret |= sc223a_write_reg(sc223a->client,
+						SC223A_REG_EXPOSURE_M,
+						SC223A_REG_VALUE_08BIT,
+						((val >> 4) & 0xFF));
+
+			ret |= sc223a_read_reg(sc223a->client, SC223A_REG_EXPOSURE_L,
+						SC223A_REG_VALUE_08BIT, &reg);
+			ret |= sc223a_write_reg(sc223a->client,
+						SC223A_REG_EXPOSURE_L,
+						SC223A_REG_VALUE_08BIT,
+						(((val & 0x0f) << 4) | (reg & 0x0F)));
+		}
+		break;
+	case V4L2_CID_ANALOGUE_GAIN:
+		if (sc223a->cur_mode->hdr_mode == NO_HDR)
+			ret = sc223a_set_gain_reg(sc223a, ctrl->val);
+		break;
+	case V4L2_CID_VBLANK:
+		ret = sc223a_write_reg(sc223a->client,
+					SC223A_REG_VTS_H,
+					SC223A_REG_VALUE_08BIT,
+					(ctrl->val + sc223a->cur_mode->height) >> 8);
+		ret |= sc223a_write_reg(sc223a->client,
+					 SC223A_REG_VTS_L,
+					 SC223A_REG_VALUE_08BIT,
+					 (ctrl->val + sc223a->cur_mode->height) & 0xff);
+		sc223a->cur_vts = ctrl->val + sc223a->cur_mode->height;
+		break;
+	case V4L2_CID_TEST_PATTERN:
+		ret = sc223a_enable_test_pattern(sc223a, ctrl->val);
+		break;
+	case V4L2_CID_HFLIP:
+		ret = sc223a_read_reg(sc223a->client, SC223A_FLIP_MIRROR_REG,
+				       SC223A_REG_VALUE_08BIT, &val);
+		ret |= sc223a_write_reg(sc223a->client, SC223A_FLIP_MIRROR_REG,
+					 SC223A_REG_VALUE_08BIT,
+					 SC223A_FETCH_MIRROR(val, ctrl->val));
+		break;
+	case V4L2_CID_VFLIP:
+		ret = sc223a_read_reg(sc223a->client, SC223A_FLIP_MIRROR_REG,
+				       SC223A_REG_VALUE_08BIT, &val);
+		ret |= sc223a_write_reg(sc223a->client, SC223A_FLIP_MIRROR_REG,
+					 SC223A_REG_VALUE_08BIT,
+					 SC223A_FETCH_FLIP(val, 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 sc223a_ctrl_ops = {
+	.s_ctrl = sc223a_set_ctrl,
+};
+
+static int sc223a_initialize_controls(struct sc223a *sc223a)
+{
+	const struct sc223a_mode *mode;
+	struct v4l2_ctrl_handler *handler;
+	struct v4l2_ctrl *ctrl;
+	s64 exposure_max, vblank_def;
+	u32 h_blank;
+	int ret;
+
+	handler = &sc223a->ctrl_handler;
+	mode = sc223a->cur_mode;
+	ret = v4l2_ctrl_handler_init(handler, 9);
+	if (ret)
+		return ret;
+	handler->lock = &sc223a->mutex;
+
+	ctrl = v4l2_ctrl_new_int_menu(handler, NULL, V4L2_CID_LINK_FREQ,
+				      0, 0, link_freq_menu_items);
+	if (ctrl)
+		ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+
+	v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE,
+			  0, PIXEL_RATE_WITH_371M_10BIT, 1, PIXEL_RATE_WITH_371M_10BIT);
+
+	h_blank = mode->hts_def - mode->width;
+	sc223a->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
+					    h_blank, h_blank, 1, h_blank);
+	if (sc223a->hblank)
+		sc223a->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+	vblank_def = mode->vts_def - mode->height;
+	sc223a->vblank = v4l2_ctrl_new_std(handler, &sc223a_ctrl_ops,
+					    V4L2_CID_VBLANK, vblank_def,
+					    SC223A_VTS_MAX - mode->height,
+					    1, vblank_def);
+	exposure_max = mode->vts_def - 4;
+	sc223a->exposure = v4l2_ctrl_new_std(handler, &sc223a_ctrl_ops,
+					      V4L2_CID_EXPOSURE, SC223A_EXPOSURE_MIN,
+					      exposure_max, SC223A_EXPOSURE_STEP,
+					      mode->exp_def);
+	sc223a->anal_gain = v4l2_ctrl_new_std(handler, &sc223a_ctrl_ops,
+					       V4L2_CID_ANALOGUE_GAIN, SC223A_GAIN_MIN,
+					       SC223A_GAIN_MAX, SC223A_GAIN_STEP,
+					       SC223A_GAIN_DEFAULT);
+	sc223a->test_pattern = v4l2_ctrl_new_std_menu_items(handler,
+							    &sc223a_ctrl_ops,
+					V4L2_CID_TEST_PATTERN,
+					ARRAY_SIZE(sc223a_test_pattern_menu) - 1,
+					0, 0, sc223a_test_pattern_menu);
+	v4l2_ctrl_new_std(handler, &sc223a_ctrl_ops,
+				V4L2_CID_HFLIP, 0, 1, 1, 0);
+
+	v4l2_ctrl_new_std(handler, &sc223a_ctrl_ops,
+				V4L2_CID_VFLIP, 0, 1, 1, 0);
+
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(&sc223a->client->dev,
+			"Failed to init controls(%d)\n", ret);
+		goto err_free_handler;
+	}
+
+	sc223a->subdev.ctrl_handler = handler;
+	sc223a->has_init_exp = false;
+
+	return 0;
+
+err_free_handler:
+	v4l2_ctrl_handler_free(handler);
+
+	return ret;
+}
+
+static int sc223a_check_sensor_id(struct sc223a *sc223a,
+				   struct i2c_client *client)
+{
+	struct device *dev = &sc223a->client->dev;
+	u32 id = 0;
+	int ret;
+
+	ret = sc223a_read_reg(client, SC223A_REG_CHIP_ID,
+			       SC223A_REG_VALUE_16BIT, &id);
+	if (id != CHIP_ID) {
+		dev_err(dev, "Unexpected sensor id(%06x), ret(%d)\n", id, ret);
+		return -ENODEV;
+	}
+
+	dev_info(dev, "Detected OV%06x sensor\n", CHIP_ID);
+
+	return 0;
+}
+
+static int sc223a_configure_regulators(struct sc223a *sc223a)
+{
+	unsigned int i;
+
+	for (i = 0; i < SC223A_NUM_SUPPLIES; i++)
+		sc223a->supplies[i].supply = sc223a_supply_names[i];
+
+	return devm_regulator_bulk_get(&sc223a->client->dev,
+				       SC223A_NUM_SUPPLIES,
+				       sc223a->supplies);
+}
+
+static int sc223a_probe(struct i2c_client *client,
+			 const struct i2c_device_id *id)
+{
+	struct device *dev = &client->dev;
+	struct device_node *node = dev->of_node;
+	struct sc223a *sc223a;
+	struct v4l2_subdev *sd;
+	char facing[2];
+	int ret;
+	u32 i, hdr_mode = 0;
+
+	dev_info(dev, "driver version: %02x.%02x.%02x",
+		 DRIVER_VERSION >> 16,
+		 (DRIVER_VERSION & 0xff00) >> 8,
+		 DRIVER_VERSION & 0x00ff);
+
+	sc223a = devm_kzalloc(dev, sizeof(*sc223a), GFP_KERNEL);
+	if (!sc223a)
+		return -ENOMEM;
+
+	of_property_read_u32(node, OF_CAMERA_HDR_MODE, &hdr_mode);
+	ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
+				   &sc223a->module_index);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
+				       &sc223a->module_facing);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME,
+				       &sc223a->module_name);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME,
+				       &sc223a->len_name);
+	if (ret) {
+		dev_err(dev, "could not get module information!\n");
+		return -EINVAL;
+	}
+
+	sc223a->client = client;
+	for (i = 0; i < ARRAY_SIZE(supported_modes); i++) {
+		if (hdr_mode == supported_modes[i].hdr_mode) {
+			sc223a->cur_mode = &supported_modes[i];
+			break;
+		}
+	}
+	if (i == ARRAY_SIZE(supported_modes))
+		sc223a->cur_mode = &supported_modes[0];
+
+	sc223a->xvclk = devm_clk_get(dev, "xvclk");
+	if (IS_ERR(sc223a->xvclk)) {
+		dev_err(dev, "Failed to get xvclk\n");
+		return -EINVAL;
+	}
+
+	sc223a->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+	if (IS_ERR(sc223a->reset_gpio))
+		dev_warn(dev, "Failed to get reset-gpios\n");
+
+	sc223a->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW);
+	if (IS_ERR(sc223a->pwdn_gpio))
+		dev_warn(dev, "Failed to get pwdn-gpios\n");
+
+	sc223a->pinctrl = devm_pinctrl_get(dev);
+	if (!IS_ERR(sc223a->pinctrl)) {
+		sc223a->pins_default =
+			pinctrl_lookup_state(sc223a->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_DEFAULT);
+		if (IS_ERR(sc223a->pins_default))
+			dev_err(dev, "could not get default pinstate\n");
+
+		sc223a->pins_sleep =
+			pinctrl_lookup_state(sc223a->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_SLEEP);
+		if (IS_ERR(sc223a->pins_sleep))
+			dev_err(dev, "could not get sleep pinstate\n");
+	} else {
+		dev_err(dev, "no pinctrl\n");
+	}
+
+	ret = sc223a_configure_regulators(sc223a);
+	if (ret) {
+		dev_err(dev, "Failed to get power regulators\n");
+		return ret;
+	}
+
+	mutex_init(&sc223a->mutex);
+
+	sd = &sc223a->subdev;
+	v4l2_i2c_subdev_init(sd, client, &sc223a_subdev_ops);
+	ret = sc223a_initialize_controls(sc223a);
+	if (ret)
+		goto err_destroy_mutex;
+
+	ret = __sc223a_power_on(sc223a);
+	if (ret)
+		goto err_free_handler;
+
+	ret = sc223a_check_sensor_id(sc223a, client);
+	if (ret)
+		goto err_power_off;
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+	sd->internal_ops = &sc223a_internal_ops;
+	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
+		     V4L2_SUBDEV_FL_HAS_EVENTS;
+#endif
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	sc223a->pad.flags = MEDIA_PAD_FL_SOURCE;
+	sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
+	ret = media_entity_pads_init(&sd->entity, 1, &sc223a->pad);
+	if (ret < 0)
+		goto err_power_off;
+#endif
+
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(sc223a->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s",
+		 sc223a->module_index, facing,
+		 SC223A_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:
+	__sc223a_power_off(sc223a);
+err_free_handler:
+	v4l2_ctrl_handler_free(&sc223a->ctrl_handler);
+err_destroy_mutex:
+	mutex_destroy(&sc223a->mutex);
+
+	return ret;
+}
+
+static int sc223a_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct sc223a *sc223a = to_sc223a(sd);
+
+	v4l2_async_unregister_subdev(sd);
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	media_entity_cleanup(&sd->entity);
+#endif
+	v4l2_ctrl_handler_free(&sc223a->ctrl_handler);
+	mutex_destroy(&sc223a->mutex);
+
+	pm_runtime_disable(&client->dev);
+	if (!pm_runtime_status_suspended(&client->dev))
+		__sc223a_power_off(sc223a);
+	pm_runtime_set_suspended(&client->dev);
+
+	return 0;
+}
+
+#if IS_ENABLED(CONFIG_OF)
+static const struct of_device_id sc223a_of_match[] = {
+	{ .compatible = "smartsens,sc223a" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, sc223a_of_match);
+#endif
+
+static const struct i2c_device_id sc223a_match_id[] = {
+	{ "smartsens,sc223a", 0 },
+	{ },
+};
+
+static struct i2c_driver sc223a_i2c_driver = {
+	.driver = {
+		.name = SC223A_NAME,
+		.pm = &sc223a_pm_ops,
+		.of_match_table = of_match_ptr(sc223a_of_match),
+	},
+	.probe		= &sc223a_probe,
+	.remove		= &sc223a_remove,
+	.id_table	= sc223a_match_id,
+};
+
+static int __init sensor_mod_init(void)
+{
+	return i2c_add_driver(&sc223a_i2c_driver);
+}
+
+static void __exit sensor_mod_exit(void)
+{
+	i2c_del_driver(&sc223a_i2c_driver);
+}
+
+device_initcall_sync(sensor_mod_init);
+module_exit(sensor_mod_exit);
+
+MODULE_DESCRIPTION("smartsens sc223a sensor driver");
+MODULE_LICENSE("GPL v2");

commit 43f90e774d808127cb9d56325523ca80ba9f2f46
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Fri Oct 22 15:02:28 2021 +0800

    drm/rockchip: vop2: Reset plane->rotation to DRM_MODE_ROTATE_0
    
    Some application(e.g Kwin) may use it as a default rotation.
    We should set it a valid rotation here.
    
    Change-Id: Idef8fa5097b54710e2ead32a197d5d1e6bf78d94
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 4ab074fec7d8..4d8ab6698a3f 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -3379,6 +3379,7 @@ static void vop2_atomic_plane_reset(struct drm_plane *plane)
 	plane->state->plane = plane;
 	plane->state->zpos = win->zpos;
 	plane->state->alpha = DRM_BLEND_ALPHA_OPAQUE;
+	plane->state->rotation = DRM_MODE_ROTATE_0;
 }
 
 static struct drm_plane_state *vop2_atomic_plane_duplicate_state(struct drm_plane *plane)

commit 790f77f1a1d49e0edbc007316a56921afe76a0b7
Author: Finley Xiao <finley.xiao@rock-chips.com>
Date:   Tue Oct 19 17:08:24 2021 +0800

    arm64: dts: rockchip: rk3568: Add vop-frame-bw-dmc-freq
    
    Fix vop POST_BUF_EMPTY irq err when rotate screen.
    
    Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
    Change-Id: I3c0d5c52efa8612ce6bf24f6748ccab7c1c05a57

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index 94751f30bf48..4cda4c1d5e06 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -2152,8 +2152,13 @@
 		operating-points-v2 = <&dmc_opp_table>;
 		vop-bw-dmc-freq = <
 		/* min_bw(MB/s) max_bw(MB/s) freq(KHz) */
-			0	572	324000
-			573	99999	528000
+			0	286	324000
+			287	99999	528000
+		>;
+		vop-frame-bw-dmc-freq = <
+		/* min_bw(MB/s) max_bw(MB/s) freq(KHz) */
+			0	620	324000
+			621	99999	780000
 		>;
 		cpu-bw-dmc-freq = <
 		/* min_bw(MB/s) max_bw(MB/s) freq(KHz) */

commit 4163c2ca8566491d2b9d5b9b694030e95656d34d
Author: Finley Xiao <finley.xiao@rock-chips.com>
Date:   Tue Oct 19 17:07:52 2021 +0800

    PM / devfreq: rockchip_dmc: Change frequency according to vop frame bandwidth
    
    Sometimes the vop line bandwidth is not high, the vop also report
    buf empty err, and the frame bandwidth is high at this time, so change
    ddr frequency according to frame bandwidth can fix the error.
    
    Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
    Change-Id: Ia893a07def99aaaa4da421b6d619a8fd3eec9745

diff --git a/drivers/devfreq/rockchip_dmc.c b/drivers/devfreq/rockchip_dmc.c
index 17d07d05489f..d75c21e51854 100644
--- a/drivers/devfreq/rockchip_dmc.c
+++ b/drivers/devfreq/rockchip_dmc.c
@@ -138,6 +138,7 @@ struct rockchip_dmcfreq {
 	struct notifier_block status_nb;
 	struct list_head video_info_list;
 	struct freq_map_table *vop_bw_tbl;
+	struct freq_map_table *vop_frame_bw_tbl;
 	struct freq_map_table *cpu_bw_tbl;
 	struct work_struct boost_work;
 	struct input_handler input_handler;
@@ -2486,13 +2487,15 @@ void rockchip_dmcfreq_vop_bandwidth_update(struct devfreq *devfreq,
 	if (!dmcfreq)
 		return;
 
+	dev_dbg(dmcfreq->dev, "line bw=%u, frame bw=%u, pn=%u\n",
+		line_bw_mbyte, frame_bw_mbyte, plane_num);
+
 	if (!dmcfreq->vop_pn_rl_tbl || !dmcfreq->set_msch_readlatency)
 		goto vop_bw_tbl;
 	for (i = 0; dmcfreq->vop_pn_rl_tbl[i].rl != CPUFREQ_TABLE_END; i++) {
 		if (plane_num >= dmcfreq->vop_pn_rl_tbl[i].pn)
 			readlatency = dmcfreq->vop_pn_rl_tbl[i].rl;
 	}
-	dev_dbg(dmcfreq->dev, "pn=%u\n", plane_num);
 	if (readlatency) {
 		cancel_delayed_work_sync(&dmcfreq->msch_rl_work);
 		dmcfreq->is_msch_rl_work_started = false;
@@ -2507,21 +2510,26 @@ void rockchip_dmcfreq_vop_bandwidth_update(struct devfreq *devfreq,
 
 vop_bw_tbl:
 	if (!dmcfreq->auto_freq_en || !dmcfreq->vop_bw_tbl)
-		return;
-
+		goto vop_frame_bw_tbl;
 	for (i = 0; dmcfreq->vop_bw_tbl[i].freq != CPUFREQ_TABLE_END; i++) {
 		if (line_bw_mbyte >= dmcfreq->vop_bw_tbl[i].min)
 			target = dmcfreq->vop_bw_tbl[i].freq;
 	}
 
-	dev_dbg(dmcfreq->dev, "bw=%u\n", line_bw_mbyte);
-
-	if (!target || target == dmcfreq->vop_req_rate)
-		return;
+vop_frame_bw_tbl:
+	if (!dmcfreq->auto_freq_en || !dmcfreq->vop_frame_bw_tbl)
+		goto next;
+	for (i = 0; dmcfreq->vop_frame_bw_tbl[i].freq != CPUFREQ_TABLE_END;
+	     i++) {
+		if (frame_bw_mbyte >= dmcfreq->vop_frame_bw_tbl[i].min) {
+			if (target < dmcfreq->vop_frame_bw_tbl[i].freq)
+				target = dmcfreq->vop_frame_bw_tbl[i].freq;
+		}
+	}
 
+next:
 	vop_last_rate = dmcfreq->vop_req_rate;
 	dmcfreq->vop_req_rate = target;
-
 	if (target > vop_last_rate)
 		rockchip_dmcfreq_update_target(dmcfreq);
 }
@@ -2896,7 +2904,9 @@ static void rockchip_dmcfreq_parse_dt(struct rockchip_dmcfreq *dmcfreq)
 	if (rockchip_get_freq_map_talbe(np, "cpu-bw-dmc-freq",
 					&dmcfreq->cpu_bw_tbl))
 		dev_dbg(dev, "failed to get cpu bandwidth to dmc rate\n");
-
+	if (rockchip_get_freq_map_talbe(np, "vop-frame-bw-dmc-freq",
+					&dmcfreq->vop_frame_bw_tbl))
+		dev_dbg(dev, "failed to get vop frame bandwidth to dmc rate\n");
 	if (rockchip_get_freq_map_talbe(np, "vop-bw-dmc-freq",
 					&dmcfreq->vop_bw_tbl))
 		dev_err(dev, "failed to get vop bandwidth to dmc rate\n");

commit 15201ca7b3f8c596425b231d8603ab5c6061a688
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Fri Oct 15 15:55:58 2021 +0800

    drm/rockchip: vop2: add calculate current frame data size
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: Ie9c92c651b8c379c77aac941d03bf3f772ed7eea

diff --git a/drivers/devfreq/rockchip_dmc.c b/drivers/devfreq/rockchip_dmc.c
index e053f527da19..17d07d05489f 100644
--- a/drivers/devfreq/rockchip_dmc.c
+++ b/drivers/devfreq/rockchip_dmc.c
@@ -2468,7 +2468,8 @@ static void rockchip_dmcfreq_msch_rl_init(struct rockchip_dmcfreq *dmcfreq)
 }
 
 void rockchip_dmcfreq_vop_bandwidth_update(struct devfreq *devfreq,
-					   unsigned int bw_mbyte,
+					   unsigned int line_bw_mbyte,
+					   unsigned int frame_bw_mbyte,
 					   unsigned int plane_num)
 {
 	struct device *dev;
@@ -2509,11 +2510,11 @@ void rockchip_dmcfreq_vop_bandwidth_update(struct devfreq *devfreq,
 		return;
 
 	for (i = 0; dmcfreq->vop_bw_tbl[i].freq != CPUFREQ_TABLE_END; i++) {
-		if (bw_mbyte >= dmcfreq->vop_bw_tbl[i].min)
+		if (line_bw_mbyte >= dmcfreq->vop_bw_tbl[i].min)
 			target = dmcfreq->vop_bw_tbl[i].freq;
 	}
 
-	dev_dbg(dmcfreq->dev, "bw=%u\n", bw_mbyte);
+	dev_dbg(dmcfreq->dev, "bw=%u\n", line_bw_mbyte);
 
 	if (!target || target == dmcfreq->vop_req_rate)
 		return;
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h
index 1f57aadcd0ab..ca32e0300cb7 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h
@@ -54,6 +54,7 @@ struct rockchip_crtc_funcs {
 	void (*disable_vblank)(struct drm_crtc *crtc);
 	size_t (*bandwidth)(struct drm_crtc *crtc,
 			    struct drm_crtc_state *crtc_state,
+			    size_t *frame_bw_mbyte,
 			    unsigned int *plane_num_total);
 	void (*cancel_pending_vblank)(struct drm_crtc *crtc,
 				      struct drm_file *file_priv);
@@ -70,7 +71,8 @@ struct rockchip_crtc_funcs {
 struct rockchip_atomic_commit {
 	struct drm_atomic_state *state;
 	struct drm_device *dev;
-	size_t bandwidth;
+	size_t line_bw_mbyte;
+	size_t frame_bw_mbyte;
 	unsigned int plane_num;
 };
 
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
index a400c1782aec..5e4df7401342 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
@@ -232,7 +232,8 @@ static void rockchip_drm_output_poll_changed(struct drm_device *dev)
 
 static int rockchip_drm_bandwidth_atomic_check(struct drm_device *dev,
 					       struct drm_atomic_state *state,
-					       size_t *bandwidth,
+					       size_t *line_bw_mbyte,
+					       size_t *frame_bw_mbyte,
 					       unsigned int *plane_num)
 {
 	struct rockchip_drm_private *priv = dev->dev_private;
@@ -241,14 +242,16 @@ static int rockchip_drm_bandwidth_atomic_check(struct drm_device *dev,
 	struct drm_crtc *crtc;
 	int i, ret = 0;
 
-	*bandwidth = 0;
+	*line_bw_mbyte = 0;
+	*frame_bw_mbyte = 0;
 	*plane_num = 0;
 	for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
 		funcs = priv->crtc_funcs[drm_crtc_index(crtc)];
 
 		if (funcs && funcs->bandwidth)
-			*bandwidth += funcs->bandwidth(crtc, crtc_state,
-						       plane_num);
+			*line_bw_mbyte += funcs->bandwidth(crtc, crtc_state,
+							   frame_bw_mbyte,
+							   plane_num);
 	}
 
 	/*
@@ -262,7 +265,7 @@ static int rockchip_drm_bandwidth_atomic_check(struct drm_device *dev,
 
 	if (priv->devfreq)
 		ret = rockchip_dmcfreq_vop_bandwidth_request(priv->devfreq,
-							     *bandwidth);
+							     *line_bw_mbyte);
 
 	return ret;
 }
@@ -385,7 +388,8 @@ rockchip_atomic_commit_complete(struct rockchip_atomic_commit *commit)
 	struct drm_atomic_state *state = commit->state;
 	struct drm_device *dev = commit->dev;
 	struct rockchip_drm_private *prv = dev->dev_private;
-	size_t bandwidth = commit->bandwidth;
+	size_t line_bw_mbyte = commit->line_bw_mbyte;
+	size_t frame_bw_mbyte = commit->frame_bw_mbyte;
 	unsigned int plane_num = commit->plane_num;
 
 	/*
@@ -421,7 +425,7 @@ rockchip_atomic_commit_complete(struct rockchip_atomic_commit *commit)
 			prv->devfreq = NULL;
 	}
 	if (prv->devfreq)
-		rockchip_dmcfreq_vop_bandwidth_update(prv->devfreq, bandwidth,
+		rockchip_dmcfreq_vop_bandwidth_update(prv->devfreq, line_bw_mbyte, frame_bw_mbyte,
 						      plane_num);
 
 	mutex_lock(&prv->ovl_lock);
@@ -458,7 +462,8 @@ static int rockchip_drm_atomic_commit(struct drm_device *dev,
 {
 	struct rockchip_drm_private *private = dev->dev_private;
 	struct rockchip_atomic_commit *commit;
-	size_t bandwidth;
+	size_t line_bw_mbyte;
+	size_t frame_bw_mbyte;
 	unsigned int plane_num;
 	int ret;
 
@@ -470,14 +475,16 @@ static int rockchip_drm_atomic_commit(struct drm_device *dev,
 	if (ret)
 		return ret;
 
-	ret = rockchip_drm_bandwidth_atomic_check(dev, state, &bandwidth,
+	ret = rockchip_drm_bandwidth_atomic_check(dev, state,
+						  &line_bw_mbyte,
+						  &frame_bw_mbyte,
 						  &plane_num);
 	if (ret) {
 		/*
 		 * TODO:
 		 * Just report bandwidth can't support now.
 		 */
-		DRM_ERROR("vop bandwidth too large %zd\n", bandwidth);
+		DRM_ERROR("vop bandwidth too large %zd\n", line_bw_mbyte);
 	}
 
 	ret = drm_atomic_helper_swap_state(state, true);
@@ -494,7 +501,8 @@ static int rockchip_drm_atomic_commit(struct drm_device *dev,
 
 	commit->dev = dev;
 	commit->state = state;
-	commit->bandwidth = bandwidth;
+	commit->line_bw_mbyte = line_bw_mbyte;
+	commit->frame_bw_mbyte = frame_bw_mbyte;
 	commit->plane_num = plane_num;
 
 	if (async) {
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index fc41d9dd9428..766782c143b1 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -2663,6 +2663,7 @@ static u64 vop_calc_max_bandwidth(struct vop_bandwidth *bw, int start,
 
 static size_t vop_crtc_bandwidth(struct drm_crtc *crtc,
 				 struct drm_crtc_state *crtc_state,
+				 size_t *frame_bw_mbyte,
 				 unsigned int *plane_num_total)
 {
 	struct drm_display_mode *adjusted_mode = &crtc_state->adjusted_mode;
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 848e2f665d49..4ab074fec7d8 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -3992,6 +3992,7 @@ static u64 vop2_calc_max_bandwidth(struct vop2_bandwidth *bw, int start,
 
 static size_t vop2_crtc_bandwidth(struct drm_crtc *crtc,
 				  struct drm_crtc_state *crtc_state,
+				  size_t *frame_bw_mbyte,
 				  unsigned int *plane_num_total)
 {
 	struct drm_display_mode *adjusted_mode = &crtc_state->adjusted_mode;
@@ -4003,7 +4004,7 @@ static size_t vop2_crtc_bandwidth(struct drm_crtc *crtc,
 	struct drm_plane_state *pstate;
 	struct vop2_bandwidth *pbandwidth;
 	struct drm_plane *plane;
-	uint64_t bandwidth;
+	uint64_t line_bandwidth;
 	int8_t cnt = 0, plane_num = 0;
 #if defined(CONFIG_ROCKCHIP_DRM_DEBUG)
 	struct vop_dump_list *pos, *n;
@@ -4036,29 +4037,39 @@ static size_t vop2_crtc_bandwidth(struct drm_crtc *crtc,
 	if (!pbandwidth)
 		return -ENOMEM;
 	drm_atomic_crtc_state_for_each_plane(plane, crtc_state) {
+		int act_w, act_h, bpp, afbc_fac;
+
 		pstate = drm_atomic_get_new_plane_state(state, plane);
 		if (!pstate || pstate->crtc != crtc || !pstate->fb)
 			continue;
+		/* This is an empirical value, if it's afbc format, the frame buffer size div 2 */
+		afbc_fac = rockchip_afbc(plane, pstate->fb->modifier) ? 2 : 1;
 
 		vpstate = to_vop2_plane_state(pstate);
 		pbandwidth[cnt].y1 = vpstate->dest.y1;
 		pbandwidth[cnt].y2 = vpstate->dest.y2;
-		pbandwidth[cnt++].bandwidth = vop2_plane_line_bandwidth(pstate);
+		pbandwidth[cnt++].bandwidth = vop2_plane_line_bandwidth(pstate) / afbc_fac;
+
+		act_w = drm_rect_width(&pstate->src) >> 16;
+		act_h = drm_rect_height(&pstate->src) >> 16;
+		bpp = pstate->fb->format->bpp[0];
+
+		*frame_bw_mbyte += act_w * act_h / 1000 * bpp / 8 * adjusted_mode->vrefresh / afbc_fac / 1000;
 	}
 
 	sort(pbandwidth, cnt, sizeof(pbandwidth[0]), vop2_bandwidth_cmp, NULL);
 
-	bandwidth = vop2_calc_max_bandwidth(pbandwidth, 0, cnt, vdisplay);
+	line_bandwidth = vop2_calc_max_bandwidth(pbandwidth, 0, cnt, vdisplay);
 	kfree(pbandwidth);
 	/*
-	 * bandwidth(MB/s)
-	 *    = line_bandwidth / line_time
+	 * line_bandwidth(MB/s)
+	 *    = line_bandwidth(Byte) / line_time(s)
 	 *    = line_bandwidth(Byte) * clock(KHZ) / 1000 / htotal
 	 */
-	bandwidth *= clock;
-	do_div(bandwidth, htotal * 1000);
+	line_bandwidth *= clock;
+	do_div(line_bandwidth, htotal * 1000);
 
-	return bandwidth;
+	return line_bandwidth;
 }
 
 static void vop2_crtc_close(struct drm_crtc *crtc)
diff --git a/include/soc/rockchip/rockchip_dmc.h b/include/soc/rockchip/rockchip_dmc.h
index b2a74003bd3c..0fcaaef63933 100644
--- a/include/soc/rockchip/rockchip_dmc.h
+++ b/include/soc/rockchip/rockchip_dmc.h
@@ -39,9 +39,9 @@ int rockchip_dmcfreq_wait_complete(void);
 int rockchip_dmcfreq_vop_bandwidth_request(struct devfreq *devfreq,
 					   unsigned int bw_mbyte);
 void rockchip_dmcfreq_vop_bandwidth_update(struct devfreq *devfreq,
-					   unsigned int bw_mbyte,
+					   unsigned int line_bw_mbyte,
+					   unsigned int frame_bw_mbyte,
 					   unsigned int plane_num);
-
 #else
 static inline void rockchip_dmcfreq_lock(void)
 {
@@ -69,7 +69,8 @@ rockchip_dmcfreq_vop_bandwidth_request(struct devfreq *devfreq,
 
 static inline void
 rockchip_dmcfreq_vop_bandwidth_update(struct devfreq *devfreq,
-				      unsigned int bw_mbyte,
+				      unsigned int line_bw_mbyte,
+				      unsigned int frame_bw_mbyte,
 				      unsigned int plane_num)
 {
 }

commit 7bda16fadff110db133a4f4d8bc0b00df8009e30
Author: Yiqing Zeng <zack.zeng@rock-chips.com>
Date:   Tue Oct 26 10:13:26 2021 +0800

    media: i2c: sc5239 fix logic gain error
    
    sc5239 have logic gain for analog, it can improve the image quality for
    raw data.
    
    Signed-off-by: Yiqing Zeng <zack.zeng@rock-chips.com>
    Change-Id: I03a17f21d1457aa60a7438b4a4895493e879be28

diff --git a/drivers/media/i2c/sc5239.c b/drivers/media/i2c/sc5239.c
index 544d70677ec4..90f036a5ec67 100644
--- a/drivers/media/i2c/sc5239.c
+++ b/drivers/media/i2c/sc5239.c
@@ -558,7 +558,7 @@ static inline int sc5239_write_reg(struct sc5239 *sc5239, u16 addr, u8 value)
 	return ret;
 }
 
-static void sc5239_get_gain_reg(u32 total_gain, u32 *again, u32 *again_fine,
+static void sc5239_get_gain_reg(struct sc5239 *sc5239, u32 total_gain, u32 *again, u32 *again_fine,
 					 u32 *dgain, u32 *dgain_fine)
 {
 	if (total_gain < 0x40) {/* 1 ~ 2 gain */
@@ -576,12 +576,12 @@ static void sc5239_get_gain_reg(u32 total_gain, u32 *again, u32 *again_fine,
 		*again_fine = total_gain >> 2;
 		*dgain = 0x00;
 		*dgain_fine = 0x80;
-	} else if (total_gain < 0x200) {/* 8 ~ 16 gain */
-		*again = 0x01F;
+	} else if (total_gain <= 0x1F8) {/* 8 ~ 15.75 gain */
+		*again = 0x1F;
 		*again_fine = total_gain >> 3;
 		*dgain = 0x00;
 		*dgain_fine = 0x80;
-	} else if (total_gain < 0x400) {/* 16 ~ 32 gain */
+	} else if (total_gain < 0x400) {/* 15.75 ~ 32 gain */
 		*again = 0x1F;
 		*again_fine = 0x3F;
 		*dgain = 0x00;
@@ -593,7 +593,7 @@ static void sc5239_get_gain_reg(u32 total_gain, u32 *again, u32 *again_fine,
 		*dgain_fine = total_gain >> 3;
 	} else if (total_gain < 0x1000) {/* 64 ~ 128 gain */
 		*again = 0x1F;
-		*dgain_fine = 0x3F;
+		*again_fine = 0x3F;
 		*dgain = 0x03;
 		*dgain_fine = total_gain >> 4;
 	} else if (total_gain < 0x2000) {/* 128 ~ 256 gain */
@@ -601,12 +601,79 @@ static void sc5239_get_gain_reg(u32 total_gain, u32 *again, u32 *again_fine,
 		*again_fine = 0x3F;
 		*dgain = 0x07;
 		*dgain_fine = total_gain >> 5;
-	} else if (total_gain < 0x4000) {/* 256 ~ 512 gain */
+	} else if (total_gain < 0x4000) {/* 256 ~ 496 gain */
 		*again = 0x1F;
 		*again_fine = 0x3F;
 		*dgain = 0x0F;
 		*dgain_fine = total_gain >> 6;
 	}
+
+	if (sc5239->cur_mode->hdr_mode == NO_HDR) {
+		if (total_gain < 0x40) {/* 1 ~ 2 gain */
+			sc5239_write_reg(sc5239, 0x3301, 0x1c);
+			sc5239_write_reg(sc5239, 0x3630, 0x30);
+			sc5239_write_reg(sc5239, 0x3633, 0x23);
+			sc5239_write_reg(sc5239, 0x3622, 0xf6);
+			sc5239_write_reg(sc5239, 0x363a, 0x83);
+		} else if (total_gain < 0x80) {/* 2 ~ 4 gain */
+			sc5239_write_reg(sc5239, 0x3301, 0x26);
+			sc5239_write_reg(sc5239, 0x3630, 0x23);
+			sc5239_write_reg(sc5239, 0x3633, 0x33);
+			sc5239_write_reg(sc5239, 0x3622, 0xf6);
+			sc5239_write_reg(sc5239, 0x363a, 0x87);
+		} else if (total_gain < 0x100) {/* 4 ~ 8 gain */
+			sc5239_write_reg(sc5239, 0x3301, 0x2c);
+			sc5239_write_reg(sc5239, 0x3630, 0x24);
+			sc5239_write_reg(sc5239, 0x3633, 0x43);
+			sc5239_write_reg(sc5239, 0x3622, 0xf6);
+			sc5239_write_reg(sc5239, 0x363a, 0x9f);
+		} else if (total_gain <= 0x1F8) {/* 8 ~ 15.75 gain */
+			sc5239_write_reg(sc5239, 0x3301, 0x38);
+			sc5239_write_reg(sc5239, 0x3630, 0x28);
+			sc5239_write_reg(sc5239, 0x3633, 0x43);
+			sc5239_write_reg(sc5239, 0x3622, 0xf6);
+			sc5239_write_reg(sc5239, 0x363a, 0x9f);
+		} else {
+			sc5239_write_reg(sc5239, 0x3301, 0x44);
+			sc5239_write_reg(sc5239, 0x3630, 0x19);
+			sc5239_write_reg(sc5239, 0x3633, 0x55);
+			sc5239_write_reg(sc5239, 0x3622, 0x16);
+			sc5239_write_reg(sc5239, 0x363a, 0x9f);
+		}
+	} else if (sc5239->cur_mode->hdr_mode == HDR_X2) {
+		if (total_gain < 0x40) {/* 1 ~ 2 gain */
+			sc5239_write_reg(sc5239, 0x3301, 0x20);
+			sc5239_write_reg(sc5239, 0x3630, 0x30);
+			sc5239_write_reg(sc5239, 0x3633, 0x34);
+			sc5239_write_reg(sc5239, 0x3622, 0xf6);
+			sc5239_write_reg(sc5239, 0x363a, 0x83);
+		} else if (total_gain < 0x80) {/* 2 ~ 4 gain */
+			sc5239_write_reg(sc5239, 0x3301, 0x28);
+			sc5239_write_reg(sc5239, 0x3630, 0x34);
+			sc5239_write_reg(sc5239, 0x3633, 0x35);
+			sc5239_write_reg(sc5239, 0x3622, 0xf6);
+			sc5239_write_reg(sc5239, 0x363a, 0x87);
+		} else if (total_gain < 0x100) {/* 4 ~ 8 gain */
+			sc5239_write_reg(sc5239, 0x3301, 0x28);
+			sc5239_write_reg(sc5239, 0x3630, 0x24);
+			sc5239_write_reg(sc5239, 0x3633, 0x35);
+			sc5239_write_reg(sc5239, 0x3622, 0xf6);
+			sc5239_write_reg(sc5239, 0x363a, 0x9f);
+		} else if (total_gain <= 0x1F8) {/* 8 ~ 15.75 gain */
+			sc5239_write_reg(sc5239, 0x3301, 0x48);
+			sc5239_write_reg(sc5239, 0x3630, 0x16);
+			sc5239_write_reg(sc5239, 0x3633, 0x45);
+			sc5239_write_reg(sc5239, 0x3622, 0xf6);
+			sc5239_write_reg(sc5239, 0x363a, 0x9f);
+		} else {
+			sc5239_write_reg(sc5239, 0x3301, 0x48);
+			sc5239_write_reg(sc5239, 0x3630, 0x09);
+			sc5239_write_reg(sc5239, 0x3633, 0x46);
+			sc5239_write_reg(sc5239, 0x3622, 0x16);
+			sc5239_write_reg(sc5239, 0x363a, 0x9f);
+
+		}
+	}
 }
 
 static int sc5239_set_ctrl(struct v4l2_ctrl *ctrl)
@@ -646,7 +713,7 @@ static int sc5239_set_ctrl(struct v4l2_ctrl *ctrl)
 		if (sc5239->cur_mode->hdr_mode != NO_HDR)
 			return ret;
 		dev_dbg(sc5239->dev, "set again 0x%x\n", ctrl->val);
-		sc5239_get_gain_reg(ctrl->val, &again, &again_fine, &dgain, &dgain_fine);
+		sc5239_get_gain_reg(sc5239, ctrl->val, &again, &again_fine, &dgain, &dgain_fine);
 		ret |= sc5239_write_reg(sc5239, SC5239_REG_LONG_DGAIN, dgain);
 		ret |= sc5239_write_reg(sc5239, SC5239_REG_LONG_FINE_DGAIN, dgain_fine);
 		ret |= sc5239_write_reg(sc5239, SC5239_REG_LONG_AGAIN, again);
@@ -910,8 +977,8 @@ static int sc5239_set_hdrae(struct sc5239 *sc5239,
 	ret |= sc5239_write_reg(sc5239, SC5239_REG_EXP_SHORT_H, (s_exp_time >> 4));
 
 	// set gain reg
-	sc5239_get_gain_reg(l_t_gain, &l_again, &l_again_fine, &l_dgain, &l_dgain_fine);
-	sc5239_get_gain_reg(s_t_gain, &s_again, &s_again_fine, &s_dgain, &s_dgain_fine);
+	sc5239_get_gain_reg(sc5239, l_t_gain, &l_again, &l_again_fine, &l_dgain, &l_dgain_fine);
+	sc5239_get_gain_reg(sc5239, s_t_gain, &s_again, &s_again_fine, &s_dgain, &s_dgain_fine);
 
 	ret |= sc5239_write_reg(sc5239, SC5239_REG_LONG_DGAIN, l_dgain);
 	ret |= sc5239_write_reg(sc5239, SC5239_REG_LONG_FINE_DGAIN, l_dgain_fine);

commit f4e8f555a4db802cf08b5c152dbe1e3b1da44efe
Author: Algea Cao <algea.cao@rock-chips.com>
Date:   Mon Oct 25 16:19:27 2021 +0800

    drm/rockchip: dw_hdmi: Add rk356x hdmitx phy pll cfg
    
    After testing, if use previous hdmitx pll cfg , rk356x some
    chips will appear 297M tmds clock output abnormal. After
    signal testing, it was decided to update the vendor
    recommended pll cfg.
    
    Signed-off-by: Algea Cao <algea.cao@rock-chips.com>
    Change-Id: If1ca2f9e5922c9b95b1d90055640daafcacc2301

diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
index 2dad274e2d44..6735680d410a 100644
--- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
+++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
@@ -260,6 +260,94 @@ static const struct dw_hdmi_mpll_config rockchip_mpll_cfg[] = {
 	}
 };
 
+static const struct dw_hdmi_mpll_config rockchip_mpll_cfg_rk356x[] = {
+	{
+		30666000, {
+			{ 0x00b3, 0x0000 },
+			{ 0x2153, 0x0000 },
+			{ 0x40f3, 0x0000 },
+		},
+	},  {
+		36800000, {
+			{ 0x00b3, 0x0000 },
+			{ 0x2153, 0x0000 },
+			{ 0x40a2, 0x0001 },
+		},
+	},  {
+		46000000, {
+			{ 0x00b3, 0x0000 },
+			{ 0x2142, 0x0001 },
+			{ 0x40a2, 0x0001 },
+		},
+	},  {
+		61333000, {
+			{ 0x0072, 0x0001 },
+			{ 0x2142, 0x0001 },
+			{ 0x40a2, 0x0001 },
+		},
+	},  {
+		73600000, {
+			{ 0x0072, 0x0001 },
+			{ 0x2142, 0x0001 },
+			{ 0x4061, 0x0002 },
+		},
+	},  {
+		92000000, {
+			{ 0x0072, 0x0001 },
+			{ 0x2145, 0x0002 },
+			{ 0x4061, 0x0002 },
+		},
+	},  {
+		122666000, {
+			{ 0x0051, 0x0002 },
+			{ 0x2145, 0x0002 },
+			{ 0x4061, 0x0002 },
+		},
+	},  {
+		147200000, {
+			{ 0x0051, 0x0002 },
+			{ 0x2145, 0x0002 },
+			{ 0x4064, 0x0003 },
+		},
+	},  {
+		184000000, {
+			{ 0x0051, 0x0002 },
+			{ 0x214c, 0x0003 },
+			{ 0x4064, 0x0003 },
+		},
+	},  {
+		226666000, {
+			{ 0x0040, 0x0003 },
+			{ 0x214c, 0x0003 },
+			{ 0x4064, 0x0003 },
+		},
+	},  {
+		272000000, {
+			{ 0x0040, 0x0003 },
+			{ 0x214c, 0x0003 },
+			{ 0x5a64, 0x0003 },
+		},
+	},  {
+		340000000, {
+			{ 0x0040, 0x0002 },
+			{ 0x3b4c, 0x0003 },
+			{ 0x5a64, 0x0003 },
+		},
+	},  {
+		600000000, {
+			{ 0x1a40, 0x0003 },
+			{ 0x3b4c, 0x0003 },
+			{ 0x5a64, 0x0003 },
+		},
+	},  {
+		~0UL, {
+			{ 0x0000, 0x0000 },
+			{ 0x0000, 0x0000 },
+			{ 0x0000, 0x0000 },
+		},
+	}
+};
+
 static const struct dw_hdmi_mpll_config rockchip_mpll_cfg_420[] = {
 	{
 		30666000, {
@@ -349,6 +437,19 @@ static const struct dw_hdmi_curr_ctrl rockchip_cur_ctr[] = {
 	}
 };
 
+static const struct dw_hdmi_curr_ctrl rockchip_cur_ctr_rk356x[] = {
+	/*      pixelclk    bpp8    bpp10   bpp12 */
+	{
+		272000000, { 0x0000, 0x0000, 0x0000 },
+	},  {
+		340000000, { 0x0001, 0x0000, 0x0000 },
+	},  {
+		600000000, { 0x0000, 0x0000, 0x0000 },
+	},  {
+		~0UL,      { 0x0000, 0x0000, 0x0000},
+	}
+};
+
 static struct dw_hdmi_phy_config rockchip_phy_config[] = {
 	/*pixelclk   symbol   term   vlev*/
 	{ 74250000,  0x8009, 0x0004, 0x0272},
@@ -1527,9 +1628,9 @@ static struct rockchip_hdmi_chip_data rk3568_chip_data = {
 
 static const struct dw_hdmi_plat_data rk3568_hdmi_drv_data = {
 	.mode_valid = dw_hdmi_rockchip_mode_valid,
-	.mpll_cfg   = rockchip_mpll_cfg,
+	.mpll_cfg   = rockchip_mpll_cfg_rk356x,
 	.mpll_cfg_420 = rockchip_mpll_cfg_420,
-	.cur_ctr    = rockchip_cur_ctr,
+	.cur_ctr    = rockchip_cur_ctr_rk356x,
 	.phy_config = rockchip_phy_config,
 	.phy_data = &rk3568_chip_data,
 	.ycbcr_420_allowed = true,

commit 05332f7eb9d73049750baa7a65546c1769012c8e
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Wed Oct 13 17:10:14 2021 +0800

    media: rockchip: isp: sync multi vir dev stream on/off
    
    Change-Id: I851b0390952a4f3921405a7cd24b8af7fbaff532
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/bridge.c b/drivers/media/platform/rockchip/isp/bridge.c
index 946e3c8bb138..ccc22147eb50 100644
--- a/drivers/media/platform/rockchip/isp/bridge.c
+++ b/drivers/media/platform/rockchip/isp/bridge.c
@@ -1051,14 +1051,7 @@ static int bridge_start(struct rkisp_bridge_device *dev)
 	dev->ops->config(dev);
 	rkisp_start_spstream(sp_stream);
 
-	if (!dev->ispdev->hw_dev->is_mi_update) {
-		rkisp_config_dmatx_valid_buf(dev->ispdev);
-		force_cfg_update(dev->ispdev);
-		rkisp_update_spstream_buf(sp_stream);
-		hdr_update_dmatx_buf(dev->ispdev);
-	}
 	dev->ispdev->skip_frame = 0;
-	rkisp_stats_first_ddr_config(&dev->ispdev->stats_vdev);
 	dev->en = true;
 
 	ispdev->cap_dev.is_done_early = false;
@@ -1272,11 +1265,13 @@ static int bridge_s_rx_buffer(struct v4l2_subdev *sd,
 static int bridge_s_stream(struct v4l2_subdev *sd, int on)
 {
 	struct rkisp_bridge_device *dev = v4l2_get_subdevdata(sd);
+	struct rkisp_hw_dev *hw = dev->ispdev->hw_dev;
 	int ret = 0;
 
 	v4l2_dbg(1, rkisp_debug, sd,
 		 "%s %d\n", __func__, on);
 
+	mutex_lock(&hw->dev_lock);
 	if (on) {
 		memset(&dev->dbg, 0, sizeof(dev->dbg));
 		atomic_inc(&dev->ispdev->cap_dev.refcnt);
@@ -1286,6 +1281,7 @@ static int bridge_s_stream(struct v4l2_subdev *sd, int on)
 			ret = bridge_stop_stream(sd);
 		atomic_dec(&dev->ispdev->cap_dev.refcnt);
 	}
+	mutex_unlock(&hw->dev_lock);
 
 	return ret;
 }
diff --git a/drivers/media/platform/rockchip/isp/capture.c b/drivers/media/platform/rockchip/isp/capture.c
index 4709e0c70343..28ab550aa84b 100644
--- a/drivers/media/platform/rockchip/isp/capture.c
+++ b/drivers/media/platform/rockchip/isp/capture.c
@@ -124,7 +124,9 @@ void hdr_destroy_buf(struct rkisp_device *dev)
 	if (atomic_read(&dev->cap_dev.refcnt) > 1 ||
 	    !dev->active_sensor ||
 	    (dev->active_sensor &&
-	     dev->active_sensor->mbus.type != V4L2_MBUS_CSI2))
+	     dev->active_sensor->mbus.type != V4L2_MBUS_CSI2) ||
+	    (dev->isp_inp & INP_CIF) ||
+	    (dev->isp_ver != ISP_V20 && dev->isp_ver != ISP_V21))
 		return;
 
 	atomic_set(&dev->hdr.refcnt, 0);
@@ -156,7 +158,8 @@ int hdr_update_dmatx_buf(struct rkisp_device *dev)
 	if (!dev->active_sensor ||
 	    (dev->active_sensor &&
 	     dev->active_sensor->mbus.type != V4L2_MBUS_CSI2) ||
-	    (dev->isp_inp & INP_CIF))
+	    (dev->isp_inp & INP_CIF) ||
+	    (dev->isp_ver != ISP_V20 && dev->isp_ver != ISP_V21))
 		return 0;
 
 	for (i = RKISP_STREAM_DMATX0; i <= RKISP_STREAM_DMATX2; i++) {
@@ -223,7 +226,8 @@ int hdr_config_dmatx(struct rkisp_device *dev)
 	    !dev->active_sensor ||
 	    (dev->active_sensor &&
 	     dev->active_sensor->mbus.type != V4L2_MBUS_CSI2) ||
-	    (dev->isp_inp & INP_CIF))
+	    (dev->isp_inp & INP_CIF) ||
+	    (dev->isp_ver != ISP_V20 && dev->isp_ver != ISP_V21))
 		return 0;
 
 	rkisp_create_hdr_buf(dev);
@@ -291,7 +295,8 @@ void hdr_stop_dmatx(struct rkisp_device *dev)
 	    !dev->active_sensor ||
 	    (dev->active_sensor &&
 	     dev->active_sensor->mbus.type != V4L2_MBUS_CSI2) ||
-	    (dev->isp_inp & INP_CIF))
+	    (dev->isp_inp & INP_CIF) ||
+	    (dev->isp_ver != ISP_V20 && dev->isp_ver != ISP_V21))
 		return;
 
 	if (dev->hdr.op_mode == HDR_FRAMEX2_DDR ||
@@ -343,7 +348,12 @@ void rkisp_config_dmatx_valid_buf(struct rkisp_device *dev)
 	struct rkisp_device *isp;
 	u32 i, j;
 
-	if (!hw->dummy_buf.mem_priv)
+	if (!hw->dummy_buf.mem_priv ||
+	    !dev->active_sensor ||
+	    (dev->active_sensor &&
+	     dev->active_sensor->mbus.type != V4L2_MBUS_CSI2) ||
+	    (dev->isp_inp & INP_CIF) ||
+	    (dev->isp_ver != ISP_V20 && dev->isp_ver != ISP_V21))
 		return;
 	/* dmatx buf update by mi force or oneself frame end,
 	 * for async dmatx enable need to update to valid buf first.
diff --git a/drivers/media/platform/rockchip/isp/capture_v1x.c b/drivers/media/platform/rockchip/isp/capture_v1x.c
index 2230bd24b5d8..40232c9c9d6c 100644
--- a/drivers/media/platform/rockchip/isp/capture_v1x.c
+++ b/drivers/media/platform/rockchip/isp/capture_v1x.c
@@ -383,6 +383,7 @@ static struct streams_ops rkisp_mp_streams_ops = {
 	.set_data_path = mp_set_data_path,
 	.is_stream_stopped = mp_is_stream_stopped,
 	.update_mi = update_mi,
+	.frame_end = mi_frame_end,
 };
 
 static struct streams_ops rkisp_sp_streams_ops = {
@@ -393,6 +394,7 @@ static struct streams_ops rkisp_sp_streams_ops = {
 	.set_data_path = sp_set_data_path,
 	.is_stream_stopped = sp_is_stream_stopped,
 	.update_mi = update_mi,
+	.frame_end = mi_frame_end,
 };
 
 /*
@@ -516,17 +518,8 @@ static void rkisp_stream_stop(struct rkisp_stream *stream)
 static int rkisp_start(struct rkisp_stream *stream)
 {
 	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);
 	ret = stream->ops->config_mi(stream);
@@ -534,19 +527,6 @@ static int rkisp_start(struct rkisp_stream *stream)
 		return ret;
 
 	stream->ops->enable_mi(stream);
-	/* It's safe to config ACTIVE and SHADOW regs for the
-	 * first stream. While when the second is starting, do NOT
-	 * force_cfg_update() because it also update the first one.
-	 *
-	 * The latter case would drop one more buf(that is 2) since
-	 * there's not buf in shadow when the second FE received. This's
-	 * also required because the second FE maybe corrupt especially
-	 * when run at 120fps.
-	 */
-	if (is_update) {
-		force_cfg_update(dev);
-		mi_frame_end(stream);
-	}
 	stream->streaming = true;
 
 	return 0;
diff --git a/drivers/media/platform/rockchip/isp/capture_v20.c b/drivers/media/platform/rockchip/isp/capture_v20.c
index a1ddb05e77b5..85916f885b94 100644
--- a/drivers/media/platform/rockchip/isp/capture_v20.c
+++ b/drivers/media/platform/rockchip/isp/capture_v20.c
@@ -17,7 +17,6 @@
 
 static int mi_frame_end(struct rkisp_stream *stream);
 static void rkisp_buf_queue(struct vb2_buffer *vb);
-static int rkisp_create_dummy_buf(struct rkisp_stream *stream);
 
 static const struct capture_fmt dmatx_fmts[] = {
 	/* raw */
@@ -1072,8 +1071,10 @@ static int mi_frame_end(struct rkisp_stream *stream)
 		if (stream->id == RKISP_STREAM_MP || stream->id == RKISP_STREAM_SP)
 			stream->dbg.delay = ns - dev->isp_sdev.frm_timestamp;
 
-		if (is_rdbk_stream(stream) &&
-		    dev->dmarx_dev.trigger == T_MANUAL) {
+		if (!stream->streaming) {
+			vb2_buffer_done(vb2_buf, VB2_BUF_STATE_ERROR);
+		} else if (is_rdbk_stream(stream) &&
+			   dev->dmarx_dev.trigger == T_MANUAL) {
 			if (stream->id == RKISP_STREAM_DMATX0) {
 				if (cap->rdbk_buf[RDBK_L]) {
 					v4l2_err(&dev->v4l2_dev,
@@ -1220,29 +1221,8 @@ static int rkisp_start(struct rkisp_stream *stream)
 {
 	void __iomem *base = stream->ispdev->base_addr;
 	struct rkisp_device *dev = stream->ispdev;
-	bool is_update = false;
 	int ret;
 
-	/*
-	 * MP/SP/MPFBC/DMATX need mi_cfg_upd to update shadow reg
-	 * MP/SP/MPFBC will update each other when frame end, but
-	 * MPFBC will limit MP/SP function: resize need to close,
-	 * output yuv format only 422 and 420 than two-plane mode,
-	 * and 422 or 420 is limit to MPFBC output format,
-	 * default 422. MPFBC need start before MP/SP.
-	 * DMATX will not update MP/SP/MPFBC, so it need update
-	 * togeter with other.
-	 */
-	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->id == RKISP_STREAM_SP && stream->out_isp_fmt.fmt_type == FMT_FBCGAIN)
-		is_update = false;
-
 	/* only MP support HDR mode, SP want to with HDR need
 	 * to start after MP.
 	 */
@@ -1256,22 +1236,6 @@ static int rkisp_start(struct rkisp_stream *stream)
 		return ret;
 
 	stream->ops->enable_mi(stream);
-	/* It's safe to config ACTIVE and SHADOW regs for the
-	 * first stream. While when the second is starting, do NOT
-	 * force_cfg_update() because it also update the first one.
-	 *
-	 * The latter case would drop one more buf(that is 2) since
-	 * there's not buf in shadow when the second FE received. This's
-	 * also required because the second FE maybe corrupt especially
-	 * when run at 120fps.
-	 */
-	if (is_update && !dev->br_dev.en) {
-		rkisp_stats_first_ddr_config(&dev->stats_vdev);
-		rkisp_config_dmatx_valid_buf(dev);
-		force_cfg_update(dev);
-		mi_frame_end(stream);
-		hdr_update_dmatx_buf(dev);
-	}
 	stream->streaming = true;
 
 	return 0;
@@ -1321,7 +1285,7 @@ static int rkisp_queue_setup(struct vb2_queue *queue,
 	v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, "%s count %d, size %d\n",
 		 v4l2_type_names[queue->type], *num_buffers, sizes[0]);
 
-	return rkisp_create_dummy_buf(stream);
+	return 0;
 }
 
 /*
@@ -1455,12 +1419,14 @@ static void rkisp_stop_streaming(struct vb2_queue *queue)
 	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->id != RKISP_STREAM_SP || stream->out_isp_fmt.fmt_type != FMT_FBCGAIN) {
 		if (!stream->streaming)
-			return;
+			goto end;
 		rkisp_stream_stop(stream);
 	}
 
@@ -1485,6 +1451,8 @@ static void rkisp_stop_streaming(struct vb2_queue *queue)
 	rkisp_destroy_dummy_buf(stream);
 	atomic_dec(&dev->cap_dev.refcnt);
 	stream->start_stream = false;
+end:
+	mutex_unlock(&dev->hw_dev->dev_lock);
 }
 
 static int rkisp_stream_start(struct rkisp_stream *stream)
@@ -1534,12 +1502,16 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count)
 	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 (stream->id != RKISP_STREAM_SP || stream->out_isp_fmt.fmt_type != FMT_FBCGAIN) {
-		if (WARN_ON(stream->streaming))
+		if (WARN_ON(stream->streaming)) {
+			mutex_unlock(&dev->hw_dev->dev_lock);
 			return -EBUSY;
+		}
 	}
 
 	memset(&stream->dbg, 0, sizeof(stream->dbg));
@@ -1575,6 +1547,10 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count)
 		stream->u.sp.field_rec = RKISP_FIELD_INVAL;
 	}
 
+	ret = rkisp_create_dummy_buf(stream);
+	if (ret < 0)
+		goto buffer_done;
+
 	/* enable clocks/power-domains */
 	ret = dev->pipe.open(&dev->pipe, &node->vdev.entity, true);
 	if (ret < 0) {
@@ -1608,6 +1584,8 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count)
 	}
 
 	stream->start_stream = true;
+
+	mutex_unlock(&dev->hw_dev->dev_lock);
 	return 0;
 
 pipe_stream_off:
@@ -1622,6 +1600,7 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count)
 	destroy_buf_queue(stream, VB2_BUF_STATE_QUEUED);
 	atomic_dec(&dev->cap_dev.refcnt);
 	stream->streaming = false;
+	mutex_unlock(&dev->hw_dev->dev_lock);
 	return ret;
 }
 
@@ -1646,7 +1625,7 @@ static int rkisp_init_vb2_queue(struct vb2_queue *q,
 	q->buf_struct_size = sizeof(struct rkisp_buffer);
 	q->min_buffers_needed = CIF_ISP_REQ_BUFS_MIN;
 	q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
-	q->lock = &stream->ispdev->apilock;
+	q->lock = &stream->apilock;
 	q->dev = stream->ispdev->hw_dev->dev;
 	q->allow_cache_hints = 1;
 	q->bidirectional = 1;
diff --git a/drivers/media/platform/rockchip/isp/capture_v21.c b/drivers/media/platform/rockchip/isp/capture_v21.c
index b5370329d99c..cc79c1a453cc 100644
--- a/drivers/media/platform/rockchip/isp/capture_v21.c
+++ b/drivers/media/platform/rockchip/isp/capture_v21.c
@@ -17,7 +17,6 @@
 
 static int mi_frame_end(struct rkisp_stream *stream);
 static void rkisp_buf_queue(struct vb2_buffer *vb);
-static int rkisp_create_dummy_buf(struct rkisp_stream *stream);
 
 static const struct capture_fmt dmatx_fmts[] = {
 	/* raw */
@@ -910,8 +909,10 @@ static int mi_frame_end(struct rkisp_stream *stream)
 		if (stream->id == RKISP_STREAM_MP || stream->id == RKISP_STREAM_SP)
 			stream->dbg.delay = ns - dev->isp_sdev.frm_timestamp;
 
-		if (is_rdbk_stream(stream) &&
-		    dev->dmarx_dev.trigger == T_MANUAL) {
+		if (!stream->streaming) {
+			vb2_buffer_done(vb2_buf, VB2_BUF_STATE_ERROR);
+		} else if (is_rdbk_stream(stream) &&
+			   dev->dmarx_dev.trigger == T_MANUAL) {
 			if (stream->id == RKISP_STREAM_DMATX0) {
 				if (cap->rdbk_buf[RDBK_L]) {
 					v4l2_err(&dev->v4l2_dev,
@@ -998,9 +999,12 @@ static void rkisp_stream_stop(struct rkisp_stream *stream)
 	if ((!dev->hw_dev->is_single && stream->id != RKISP_STREAM_MP &&
 	     stream->id != RKISP_STREAM_SP) || dev->hw_dev->is_single)
 		stream->ops->stop_mi(stream);
-	if (atomic_read(&dev->cap_dev.refcnt) == 1)
+
+	if (stream->id == RKISP_STREAM_MP || stream->id == RKISP_STREAM_SP)
 		hdr_stop_dmatx(dev);
-	if (dev->isp_state & ISP_START) {
+
+	if (dev->isp_state & ISP_START &&
+	    !stream->ops->is_stream_stopped(dev->base_addr)) {
 		ret = wait_event_timeout(stream->done,
 					 !stream->streaming,
 					 msecs_to_jiffies(500));
@@ -1052,29 +1056,11 @@ static int rkisp_start(struct rkisp_stream *stream)
 		return ret;
 
 	stream->ops->enable_mi(stream);
-	/* It's safe to config ACTIVE and SHADOW regs for the
-	 * first stream. While when the second is starting, do NOT
-	 * force_cfg_update() because it also update the first one.
-	 *
-	 * The latter case would drop one more buf(that is 2) since
-	 * there's not buf in shadow when the second FE received. This's
-	 * also required because the second FE maybe corrupt especially
-	 * when run at 120fps.
-	 */
-	if (is_update) {
-		rkisp_stats_first_ddr_config(&dev->stats_vdev);
+	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;
-	}
-	mutex_lock(&dev->hw_dev->dev_lock);
-	if (!dev->hw_dev->is_mi_update && is_update) {
-		force_cfg_update(dev);
-		if (dev->hw_dev->is_single)
-			mi_frame_end(stream);
-		hdr_update_dmatx_buf(dev);
-	}
-	mutex_unlock(&dev->hw_dev->dev_lock);
 	stream->streaming = true;
 
 	return 0;
@@ -1113,7 +1099,7 @@ static int rkisp_queue_setup(struct vb2_queue *queue,
 	v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, "%s count %d, size %d\n",
 		 v4l2_type_names[queue->type], *num_buffers, sizes[0]);
 
-	return rkisp_create_dummy_buf(stream);
+	return 0;
 }
 
 /*
@@ -1233,15 +1219,13 @@ static void rkisp_stop_streaming(struct vb2_queue *queue)
 	struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
 	int ret;
 
-	mutex_lock(&dev->apilock);
+	mutex_lock(&dev->hw_dev->dev_lock);
 
 	v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
 		 "%s %d\n", __func__, stream->id);
 
-	if (!stream->streaming) {
-		mutex_unlock(&dev->apilock);
-		return;
-	}
+	if (!stream->streaming)
+		goto end;
 
 	rkisp_stream_stop(stream);
 	if (stream->id == RKISP_STREAM_MP ||
@@ -1263,7 +1247,8 @@ static void rkisp_stop_streaming(struct vb2_queue *queue)
 	rkisp_destroy_dummy_buf(stream);
 	atomic_dec(&dev->cap_dev.refcnt);
 
-	mutex_unlock(&dev->apilock);
+end:
+	mutex_unlock(&dev->hw_dev->dev_lock);
 }
 
 static int rkisp_stream_start(struct rkisp_stream *stream)
@@ -1313,13 +1298,13 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count)
 	struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
 	int ret = -1;
 
-	mutex_lock(&dev->apilock);
+	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->apilock);
+		mutex_unlock(&dev->hw_dev->dev_lock);
 		return -EBUSY;
 	}
 
@@ -1355,6 +1340,10 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count)
 		stream->u.sp.field_rec = RKISP_FIELD_INVAL;
 	}
 
+	ret = rkisp_create_dummy_buf(stream);
+	if (ret < 0)
+		goto buffer_done;
+
 	/* enable clocks/power-domains */
 	ret = dev->pipe.open(&dev->pipe, &node->vdev.entity, true);
 	if (ret < 0) {
@@ -1384,7 +1373,7 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count)
 		}
 	}
 
-	mutex_unlock(&dev->apilock);
+	mutex_unlock(&dev->hw_dev->dev_lock);
 	return 0;
 
 pipe_stream_off:
@@ -1399,7 +1388,7 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count)
 	destroy_buf_queue(stream, VB2_BUF_STATE_QUEUED);
 	atomic_dec(&dev->cap_dev.refcnt);
 	stream->streaming = false;
-	mutex_unlock(&dev->apilock);
+	mutex_unlock(&dev->hw_dev->dev_lock);
 	return ret;
 }
 
diff --git a/drivers/media/platform/rockchip/isp/capture_v2x.h b/drivers/media/platform/rockchip/isp/capture_v2x.h
index 3dd401b66a4a..f3a58529a3db 100644
--- a/drivers/media/platform/rockchip/isp/capture_v2x.h
+++ b/drivers/media/platform/rockchip/isp/capture_v2x.h
@@ -29,6 +29,8 @@ static inline int rkisp_register_stream_v20(struct rkisp_device *dev) { return 0
 static inline void rkisp_unregister_stream_v20(struct rkisp_device *dev) {}
 static inline void rkisp_mi_v20_isr(u32 mis_val, struct rkisp_device *dev) {}
 static inline void rkisp_mipi_v20_isr(u32 phy, u32 packet, u32 overflow, u32 state, struct rkisp_device *dev) {}
+
+static inline void rkisp_update_spstream_buf(struct rkisp_stream *stream) {}
 #endif
 
 #if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V21)
diff --git a/drivers/media/platform/rockchip/isp/common.c b/drivers/media/platform/rockchip/isp/common.c
index 8654a453e6e4..f0bd64f60a66 100644
--- a/drivers/media/platform/rockchip/isp/common.c
+++ b/drivers/media/platform/rockchip/isp/common.c
@@ -272,7 +272,6 @@ int rkisp_alloc_common_dummy_buf(struct rkisp_device *dev)
 	u32 i, j, size = 0;
 	int ret = 0;
 
-	mutex_lock(&hw->dev_lock);
 	if (dummy_buf->mem_priv)
 		goto end;
 
@@ -306,7 +305,6 @@ int rkisp_alloc_common_dummy_buf(struct rkisp_device *dev)
 end:
 	if (ret < 0)
 		v4l2_err(&dev->v4l2_dev, "%s failed:%d\n", __func__, ret);
-	mutex_unlock(&hw->dev_lock);
 	return ret;
 }
 
@@ -314,15 +312,12 @@ void rkisp_free_common_dummy_buf(struct rkisp_device *dev)
 {
 	struct rkisp_hw_dev *hw = dev->hw_dev;
 
-	mutex_lock(&hw->dev_lock);
 	if (atomic_read(&hw->refcnt) ||
 	    atomic_read(&dev->cap_dev.refcnt) > 1)
-		goto end;
+		return;
 
 	if (hw->is_mmu)
 		rkisp_free_page_dummy_buf(dev);
 	else
 		rkisp_free_buffer(dev, &hw->dummy_buf);
-end:
-	mutex_unlock(&hw->dev_lock);
 }
diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c
index c609b26268ef..f7101ed60ea9 100644
--- a/drivers/media/platform/rockchip/isp/rkisp.c
+++ b/drivers/media/platform/rockchip/isp/rkisp.c
@@ -1416,7 +1416,7 @@ static void rkisp_start_3a_run(struct rkisp_device *dev)
 	struct v4l2_event ev = {
 		.type = CIFISP_V4L2_EVENT_STREAM_START,
 	};
-	int ret;
+	int ret = 1000;
 
 	if (!rkisp_is_need_3a(dev) || dev->isp_ver == ISP_V20 ||
 	    !params_vdev->is_subs_evt)
@@ -1428,13 +1428,13 @@ static void rkisp_start_3a_run(struct rkisp_device *dev)
 	 */
 	ret = wait_event_timeout(dev->sync_onoff,
 			params_vdev->streamon && !params_vdev->first_params,
-			msecs_to_jiffies(1000));
+			msecs_to_jiffies(ret));
 	if (!ret)
 		v4l2_warn(&dev->v4l2_dev,
 			  "waiting on params stream on event timeout\n");
 	else
 		v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
-			 "Waiting for 3A on use %d ms\n", 1000 - ret);
+			 "Waiting for 3A on use %d ms\n", 1000 - jiffies_to_msecs(ret));
 }
 
 static void rkisp_stop_3a_run(struct rkisp_device *dev)
@@ -1444,7 +1444,7 @@ static void rkisp_stop_3a_run(struct rkisp_device *dev)
 	struct v4l2_event ev = {
 		.type = CIFISP_V4L2_EVENT_STREAM_STOP,
 	};
-	int ret;
+	int ret = 1000;
 
 	if (!rkisp_is_need_3a(dev) || dev->isp_ver == ISP_V20 ||
 	    !params_vdev->is_subs_evt)
@@ -1452,13 +1452,13 @@ static void rkisp_stop_3a_run(struct rkisp_device *dev)
 
 	v4l2_event_queue(vdev, &ev);
 	ret = wait_event_timeout(dev->sync_onoff, !params_vdev->streamon,
-				 msecs_to_jiffies(1000));
+				 msecs_to_jiffies(ret));
 	if (!ret)
 		v4l2_warn(&dev->v4l2_dev,
 			  "waiting on params stream off event timeout\n");
 	else
 		v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
-			 "Waiting for 3A off use %d ms\n", 1000 - ret);
+			 "Waiting for 3A off use %d ms\n", 1000 - jiffies_to_msecs(ret));
 }
 
 /* Mess register operations to stop isp */
@@ -2212,6 +2212,33 @@ static void rkisp_isp_read_add_fifo_data(struct rkisp_device *dev)
 		 dev->emd_data_fifo[idx].frame_id);
 }
 
+static void rkisp_global_update_mi(struct rkisp_device *dev)
+{
+	struct rkisp_stream *stream;
+	int i;
+
+	if (dev->hw_dev->is_mi_update)
+		return;
+
+	rkisp_stats_first_ddr_config(&dev->stats_vdev);
+	rkisp_config_dmatx_valid_buf(dev);
+
+	force_cfg_update(dev);
+
+	hdr_update_dmatx_buf(dev);
+	if (dev->br_dev.en && dev->isp_ver == ISP_V20) {
+		stream = &dev->cap_dev.stream[RKISP_STREAM_SP];
+		rkisp_update_spstream_buf(stream);
+	}
+	if (dev->hw_dev->is_single) {
+		for (i = 0; i < RKISP_MAX_STREAM; i++) {
+			stream = &dev->cap_dev.stream[i];
+			if (stream->streaming && !stream->next_buf)
+				stream->ops->frame_end(stream);
+		}
+	}
+}
+
 static int rkisp_isp_sd_s_stream(struct v4l2_subdev *sd, int on)
 {
 	struct rkisp_device *isp_dev = sd_to_isp_dev(sd);
@@ -2222,22 +2249,19 @@ static int rkisp_isp_sd_s_stream(struct v4l2_subdev *sd, int on)
 			isp_dev->irq_ends_mask == (ISP_FRAME_END | ISP_FRAME_IN) &&
 			(!IS_HDR_RDBK(isp_dev->rd_mode) ||
 			 isp_dev->isp_state & ISP_STOP), msecs_to_jiffies(5));
-		mutex_lock(&isp_dev->hw_dev->dev_lock);
 		rkisp_isp_stop(isp_dev);
 		atomic_dec(&isp_dev->hw_dev->refcnt);
-		mutex_unlock(&isp_dev->hw_dev->dev_lock);
 		rkisp_params_stream_stop(&isp_dev->params_vdev);
 		return 0;
 	}
 
 	rkisp_start_3a_run(isp_dev);
 	memset(&isp_dev->isp_sdev.dbg, 0, sizeof(isp_dev->isp_sdev.dbg));
-	mutex_lock(&isp_dev->hw_dev->dev_lock);
 	atomic_inc(&isp_dev->hw_dev->refcnt);
 	atomic_set(&isp_dev->isp_sdev.frm_sync_seq, 0);
+	rkisp_global_update_mi(isp_dev);
 	rkisp_config_cif(isp_dev);
 	rkisp_isp_start(isp_dev);
-	mutex_unlock(&isp_dev->hw_dev->dev_lock);
 	rkisp_rdbk_trigger_event(isp_dev, T_CMD_QUEUE, NULL);
 	return 0;
 }

commit 193fab7512d388e28a76f612be8eeee9ea05b478
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Wed Oct 20 15:11:24 2021 +0800

    media: rockchip: ispp: remove tnr iir first frame skip
    
    Change-Id: Iac599ac81059c92f929ccd0997d32e419c338642
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/ispp/dev.h b/drivers/media/platform/rockchip/ispp/dev.h
index b39e2a5b1945..d55413b7337f 100644
--- a/drivers/media/platform/rockchip/ispp/dev.h
+++ b/drivers/media/platform/rockchip/ispp/dev.h
@@ -56,8 +56,5 @@ struct rkispp_device {
 	bool stream_sync;
 
 	void (*irq_hdl)(u32 mis, struct rkispp_device *dev);
-
-	u32 first_frame_dma;
-	bool is_first;
 };
 #endif
diff --git a/drivers/media/platform/rockchip/ispp/ispp.c b/drivers/media/platform/rockchip/ispp/ispp.c
index ad9a12025c71..c30041d589e8 100644
--- a/drivers/media/platform/rockchip/ispp/ispp.c
+++ b/drivers/media/platform/rockchip/ispp/ispp.c
@@ -273,8 +273,6 @@ static int rkispp_sd_s_stream(struct v4l2_subdev *sd, int on)
 		 "s_stream on:%d\n", on);
 
 	if (on) {
-		dev->is_first = true;
-		dev->first_frame_dma = -1;
 		ispp_sdev->state = ISPP_START;
 		ispp_sdev->frm_sync_seq = -1;
 		ispp_sdev->frame_timestamp = 0;
diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c
index cb732d15cb9c..51287e38c64f 100644
--- a/drivers/media/platform/rockchip/ispp/stream.c
+++ b/drivers/media/platform/rockchip/ispp/stream.c
@@ -2848,11 +2848,6 @@ static void nr_work_event(struct rkispp_device *dev,
 			dbuf = vdev->nr.cur_rd->dbuf[GROUP_BUF_PIC];
 			dummy = dbuf_to_dummy(dbuf, &vdev->tnr.buf.iir, size);
 			val = dummy->dma_addr;
-			if (dev->is_first && dev->first_frame_dma != -1) {
-				val = dev->first_frame_dma;
-				dev->first_frame_dma = -1;
-				dev->is_first = false;
-			}
 			rkispp_write(dev, RKISPP_NR_ADDR_BASE_Y, val);
 			val += vdev->nr.uv_offset;
 			rkispp_write(dev, RKISPP_NR_ADDR_BASE_UV, val);
@@ -3084,13 +3079,6 @@ static void tnr_work_event(struct rkispp_device *dev,
 	if (!buf_rd && !buf_wr && is_isr) {
 		vdev->tnr.is_end = true;
 
-		if (dev->is_first && vdev->tnr.nxt_rd) {
-			struct rkispp_isp_buf_pool *tbuf = get_pool_buf(dev, vdev->tnr.nxt_rd);
-
-			dev->first_frame_dma = tbuf->dma[GROUP_BUF_PIC];
-			rkispp_set_bits(dev, RKISPP_TNR_CTRL, 0, SW_TNR_1ST_FRM);
-		}
-
 		if (vdev->tnr.cur_rd) {
 			/* tnr read buf return to isp */
 			if (sd) {
@@ -3171,7 +3159,8 @@ static void tnr_work_event(struct rkispp_device *dev,
 		vdev->tnr.cur_rd = vdev->tnr.nxt_rd;
 		vdev->tnr.nxt_rd = buf_rd;
 		/* first buf for 3to1 using twice */
-		if (!is_3to1 || dev->is_first)
+		if (!is_3to1 ||
+		    (rkispp_read(dev, RKISPP_TNR_CTRL) & SW_TNR_1ST_FRM))
 			vdev->tnr.cur_rd = vdev->tnr.nxt_rd;
 	} else if (vdev->tnr.is_end && !list_empty(list)) {
 		/* tnr read buf from list
@@ -3230,7 +3219,7 @@ static void tnr_work_event(struct rkispp_device *dev,
 				val = buf->dma[GROUP_BUF_GAIN];
 				rkispp_write(dev, RKISPP_TNR_GAIN_NXT_Y_BASE, val);
 
-				if (dev->is_first)
+				if (rkispp_read(dev, RKISPP_TNR_CTRL) & SW_TNR_1ST_FRM)
 					vdev->tnr.cur_rd = NULL;
 			}
 		}

commit 01bbe48cae39c524bcbbd9235ab908a24e5f9724
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Wed Oct 20 10:58:04 2021 +0800

    media: rockchip: isp/ispp sync alloc buf with dma sg case
    
    Change-Id: If4c80315efd9ce3ac80de3ec72d537ca1c27776d
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/common.c b/drivers/media/platform/rockchip/isp/common.c
index e677eda7b0da..8654a453e6e4 100644
--- a/drivers/media/platform/rockchip/isp/common.c
+++ b/drivers/media/platform/rockchip/isp/common.c
@@ -98,6 +98,7 @@ int rkisp_alloc_buffer(struct rkisp_device *dev,
 	if (dev->hw_dev->is_dma_sg_ops) {
 		sg_tbl = (struct sg_table *)g_ops->cookie(mem_priv);
 		buf->dma_addr = sg_dma_address(sg_tbl->sgl);
+		g_ops->prepare(mem_priv);
 	} else {
 		buf->dma_addr = *((dma_addr_t *)g_ops->cookie(mem_priv));
 	}
diff --git a/drivers/media/platform/rockchip/ispp/common.c b/drivers/media/platform/rockchip/ispp/common.c
index 14adef4b2c44..65ce74ffb689 100644
--- a/drivers/media/platform/rockchip/ispp/common.c
+++ b/drivers/media/platform/rockchip/ispp/common.c
@@ -90,6 +90,7 @@ int rkispp_allow_buffer(struct rkispp_device *dev,
 	if (dev->hw_dev->is_dma_sg_ops) {
 		sg_tbl = (struct sg_table *)g_ops->cookie(mem_priv);
 		buf->dma_addr = sg_dma_address(sg_tbl->sgl);
+		g_ops->prepare(mem_priv);
 	} else {
 		buf->dma_addr = *((dma_addr_t *)g_ops->cookie(mem_priv));
 	}

commit 4ab1b65d869580dc97fccc684b63ee23e48b037b
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Wed Sep 29 16:41:32 2021 +0800

    media: rockchip: isp/ispp to version v1.7.0
    
    Change-Id: I3c07a83f9e5a4e7b2bfee30cc5e36c252ecc429f
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/version.h b/drivers/media/platform/rockchip/isp/version.h
index 762ac7d9e210..3566dff7ec60 100644
--- a/drivers/media/platform/rockchip/isp/version.h
+++ b/drivers/media/platform/rockchip/isp/version.h
@@ -152,6 +152,23 @@
  * 8.frame buffer done early
  * 9.fix set pdaf in dpcc error
  * 10.add v-blank to procfs
+ *
+ * v1.7.0:
+ * 1.off unused interrupt of csi
+ * 2.fix sp no output when hdr dynamic switch
+ * 3.check the output status of statistics v2x
+ * 4.selfpath bytesperline 16 align
+ * 5.compiled with differe hardware version
+ * 6.add frame loss info to procfs
+ * 7.remove associated of cproc and ie
+ * 8.fix input crop config for isp21 multi device
+ * 9.enable soft reset for other isp version
+ * 10.rawrd support uncompact mode
+ * 11.fix default params config for mode switch
+ * 12.before frame start to update bridge mi
+ * 13.disable tmo interrupt
+ * 14.fix bottom image for debayer with extend line
+ * 15.unregister dmarx at driver remove
  */
 
 #define RKISP_DRIVER_VERSION RKISP_API_VERSION
diff --git a/drivers/media/platform/rockchip/ispp/version.h b/drivers/media/platform/rockchip/ispp/version.h
index df445daad02e..78db99ffa454 100644
--- a/drivers/media/platform/rockchip/ispp/version.h
+++ b/drivers/media/platform/rockchip/ispp/version.h
@@ -113,6 +113,14 @@
  * 6. fbc error handle
  * 7. first frame handle for multi dev
  * 8. fix driver mode sync with ispserver
+ *
+ * v1.7.0
+ * 1. off unused interrupt
+ * 2. fix monitor switch if don't power off
+ * 3. frame start to check stream output buffer
+ * 4. add frame loss info to procfs
+ * 5. fix monitor no working
+ * 6. disable scl dma write if no output buffer
  */
 
 #define RKISPP_DRIVER_VERSION ISPP_API_VERSION
diff --git a/include/uapi/linux/rkisp2-config.h b/include/uapi/linux/rkisp2-config.h
index 1e3d3c996481..3005af710588 100644
--- a/include/uapi/linux/rkisp2-config.h
+++ b/include/uapi/linux/rkisp2-config.h
@@ -10,7 +10,7 @@
 #include <linux/types.h>
 #include <linux/v4l2-controls.h>
 
-#define RKISP_API_VERSION		KERNEL_VERSION(1, 6, 2)
+#define RKISP_API_VERSION		KERNEL_VERSION(1, 7, 0)
 
 /****************ISP SUBDEV IOCTL*****************************/
 
diff --git a/include/uapi/linux/rkispp-config.h b/include/uapi/linux/rkispp-config.h
index b77b79ab3908..0448e3acdeb3 100644
--- a/include/uapi/linux/rkispp-config.h
+++ b/include/uapi/linux/rkispp-config.h
@@ -9,7 +9,7 @@
 #include <linux/types.h>
 #include <linux/v4l2-controls.h>
 
-#define ISPP_API_VERSION		KERNEL_VERSION(1, 6, 2)
+#define ISPP_API_VERSION		KERNEL_VERSION(1, 7, 0)
 
 #define ISPP_ID_TNR			(0)
 #define ISPP_ID_NR			(1)

commit 9539d807c250ca878cd291d0b2526cfaa6badaa0
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Fri Oct 8 14:16:45 2021 +0800

    media: rockchip: isp: rawwr and rawrd memory mode
    
    Three mode:
    0: raw12/raw10/raw8 8bit memory compact
    1: raw12/raw10 16bit memory one pixel
       big endian for rv1126/rv1109
       |15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
       | 3| 2| 1| 0| -| -| -| -|11|10| 9| 8| 7| 6| 5| 4|
       little align for rk356x
       |15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
       | -| -| -| -|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
    2: raw12/raw10 16bit memory one pixel
       big align for rv1126/rv1109/rk356x
       |15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
       |11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0| -| -| -| -|
    
    Change-Id: Iabd5600d1a880057f0a20e187b15d337079a14c6
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/capture.c b/drivers/media/platform/rockchip/isp/capture.c
index 34d8b5073646..4709e0c70343 100644
--- a/drivers/media/platform/rockchip/isp/capture.c
+++ b/drivers/media/platform/rockchip/isp/capture.c
@@ -217,6 +217,7 @@ int hdr_config_dmatx(struct rkisp_device *dev)
 {
 	struct rkisp_stream *stream;
 	struct v4l2_pix_format_mplane pixm;
+	u32 memory = 0;
 
 	if (atomic_inc_return(&dev->hdr.refcnt) > 1 ||
 	    !dev->active_sensor ||
@@ -266,6 +267,7 @@ int hdr_config_dmatx(struct rkisp_device *dev)
 			stream->ops->config_mi(stream);
 
 		if (!dev->dmarx_dev.trigger) {
+			memory = stream->memory;
 			pixm = stream->out_fmt;
 			stream = &dev->dmarx_dev.stream[RKISP_STREAM_RAWRD2];
 			rkisp_dmarx_set_fmt(stream, pixm);
@@ -274,7 +276,7 @@ int hdr_config_dmatx(struct rkisp_device *dev)
 	}
 
 	if (dev->hdr.op_mode != HDR_NORMAL && !dev->dmarx_dev.trigger) {
-		raw_rd_ctrl(dev->base_addr, dev->csi_dev.memory << 2);
+		raw_rd_ctrl(dev->base_addr, memory << 2);
 		if (pixm.width && pixm.height)
 			rkisp_rawrd_set_pic_size(dev, pixm.width, pixm.height);
 	}
@@ -957,7 +959,7 @@ static int rkisp_set_fmt(struct rkisp_stream *stream,
 
 		if ((dev->isp_ver == ISP_V20 ||
 		     dev->isp_ver == ISP_V21) &&
-		    !dev->csi_dev.memory &&
+		    !stream->memory &&
 		    fmt->fmt_type == FMT_BAYER &&
 		    stream->id != RKISP_STREAM_MP &&
 		    stream->id != RKISP_STREAM_SP)
@@ -1132,6 +1134,50 @@ static int rkisp_enum_framesizes(struct file *file, void *prov,
 	return 0;
 }
 
+static long rkisp_ioctl_default(struct file *file, void *fh,
+				bool valid_prio, unsigned int cmd, void *arg)
+{
+	struct rkisp_stream *stream = video_drvdata(file);
+	long ret = 0;
+
+	if (!arg)
+		return -EINVAL;
+
+	switch (cmd) {
+	case RKISP_CMD_GET_CSI_MEMORY_MODE:
+		if (stream->id != RKISP_STREAM_DMATX0 &&
+		    stream->id != RKISP_STREAM_DMATX1 &&
+		    stream->id != RKISP_STREAM_DMATX2 &&
+		    stream->id != RKISP_STREAM_DMATX3)
+			ret = -EINVAL;
+		else if (stream->memory == 0)
+			*(int *)arg = CSI_MEM_COMPACT;
+		else if (stream->memory == SW_CSI_RAW_WR_SIMG_MODE)
+			*(int *)arg = CSI_MEM_WORD_BIG_ALIGN;
+		else
+			*(int *)arg = CSI_MEM_WORD_LITTLE_ALIGN;
+		break;
+	case RKISP_CMD_SET_CSI_MEMORY_MODE:
+		if (stream->id != RKISP_STREAM_DMATX0 &&
+		    stream->id != RKISP_STREAM_DMATX1 &&
+		    stream->id != RKISP_STREAM_DMATX2 &&
+		    stream->id != RKISP_STREAM_DMATX3)
+			ret = -EINVAL;
+		else if (*(int *)arg == CSI_MEM_COMPACT)
+			stream->memory = 0;
+		else if (*(int *)arg == CSI_MEM_WORD_BIG_ALIGN)
+			stream->memory = SW_CSI_RAW_WR_SIMG_MODE;
+		else
+			stream->memory =
+				SW_CSI_RWA_WR_SIMG_SWP | SW_CSI_RAW_WR_SIMG_MODE;
+		break;
+	default:
+		ret = -EINVAL;
+	}
+
+	return ret;
+}
+
 static int rkisp_enum_frameintervals(struct file *file, void *fh,
 				     struct v4l2_frmivalenum *fival)
 {
@@ -1337,6 +1383,7 @@ static const struct v4l2_ioctl_ops rkisp_v4l2_ioctl_ops = {
 	.vidioc_querycap = rkisp_querycap,
 	.vidioc_enum_frameintervals = rkisp_enum_frameintervals,
 	.vidioc_enum_framesizes = rkisp_enum_framesizes,
+	.vidioc_default = rkisp_ioctl_default,
 };
 
 void rkisp_unregister_stream_vdev(struct rkisp_stream *stream)
diff --git a/drivers/media/platform/rockchip/isp/capture.h b/drivers/media/platform/rockchip/isp/capture.h
index c1755386e96d..3fe566dcc070 100644
--- a/drivers/media/platform/rockchip/isp/capture.h
+++ b/drivers/media/platform/rockchip/isp/capture.h
@@ -225,6 +225,7 @@ struct rkisp_stream {
 	unsigned int burst;
 	atomic_t sequence;
 	struct frame_debug_info dbg;
+	u32 memory;
 	union {
 		struct rkisp_stream_sp sp;
 		struct rkisp_stream_mp mp;
diff --git a/drivers/media/platform/rockchip/isp/capture_v20.c b/drivers/media/platform/rockchip/isp/capture_v20.c
index e865c790206f..a1ddb05e77b5 100644
--- a/drivers/media/platform/rockchip/isp/capture_v20.c
+++ b/drivers/media/platform/rockchip/isp/capture_v20.c
@@ -543,7 +543,7 @@ static int dmatx3_config_mi(struct rkisp_stream *stream)
 	vc = csi->sink[CSI_SRC_CH4 - 1].index;
 	raw_wr_ctrl(stream,
 		SW_CSI_RAW_WR_CH_EN(vc) |
-		csi->memory |
+		stream->memory |
 		SW_CSI_RAW_WR_EN_ORG);
 	mi_set_y_size(stream, in_size);
 	mi_frame_end(stream);
@@ -587,7 +587,7 @@ static int dmatx2_config_mi(struct rkisp_stream *stream)
 		raw_wr_set_pic_offs(stream, 0);
 		vc = csi->sink[CSI_SRC_CH3 - 1].index;
 		val = SW_CSI_RAW_WR_CH_EN(vc);
-		val |= csi->memory;
+		val |= stream->memory;
 		if (dev->hdr.op_mode != HDR_NORMAL)
 			val |= SW_CSI_RAW_WR_EN_ORG;
 		raw_wr_ctrl(stream, val);
@@ -631,7 +631,7 @@ static int dmatx1_config_mi(struct rkisp_stream *stream)
 		raw_wr_set_pic_offs(stream, 0);
 		vc = csi->sink[CSI_SRC_CH2 - 1].index;
 		val = SW_CSI_RAW_WR_CH_EN(vc);
-		val |= csi->memory;
+		val |= stream->memory;
 		if (dev->hdr.op_mode != HDR_NORMAL)
 			val |= SW_CSI_RAW_WR_EN_ORG;
 		raw_wr_ctrl(stream, val);
@@ -679,7 +679,7 @@ static int dmatx0_config_mi(struct rkisp_stream *stream)
 		raw_wr_set_pic_offs(dmatx, 0);
 		vc = csi->sink[CSI_SRC_CH1 - 1].index;
 		val = SW_CSI_RAW_WR_CH_EN(vc);
-		val |= csi->memory;
+		val |= stream->memory;
 		if (dev->hdr.op_mode != HDR_NORMAL)
 			val |= SW_CSI_RAW_WR_EN_ORG;
 		raw_wr_ctrl(dmatx, val);
diff --git a/drivers/media/platform/rockchip/isp/capture_v21.c b/drivers/media/platform/rockchip/isp/capture_v21.c
index 38961520f4c2..b5370329d99c 100644
--- a/drivers/media/platform/rockchip/isp/capture_v21.c
+++ b/drivers/media/platform/rockchip/isp/capture_v21.c
@@ -503,7 +503,7 @@ static int dmatx3_config_mi(struct rkisp_stream *stream)
 	vc = csi->sink[CSI_SRC_CH4 - 1].index;
 	raw_wr_ctrl(stream,
 		SW_CSI_RAW_WR_CH_EN(vc) |
-		csi->memory |
+		stream->memory |
 		SW_CSI_RAW_WR_EN_ORG);
 	stream->u.dmatx.is_config = true;
 	v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
@@ -548,7 +548,7 @@ static int dmatx2_config_mi(struct rkisp_stream *stream)
 		mi_raw_length(stream);
 		vc = csi->sink[CSI_SRC_CH3 - 1].index;
 		val = SW_CSI_RAW_WR_CH_EN(vc);
-		val |= csi->memory;
+		val |= stream->memory;
 		if (dev->hdr.op_mode != HDR_NORMAL)
 			val |= SW_CSI_RAW_WR_EN_ORG;
 		raw_wr_ctrl(stream, val);
@@ -591,7 +591,7 @@ static int dmatx0_config_mi(struct rkisp_stream *stream)
 		mi_raw_length(stream);
 		vc = csi->sink[CSI_SRC_CH1 - 1].index;
 		val = SW_CSI_RAW_WR_CH_EN(vc);
-		val |= csi->memory;
+		val |= stream->memory;
 		if (dev->hdr.op_mode != HDR_NORMAL)
 			val |= SW_CSI_RAW_WR_EN_ORG;
 		raw_wr_ctrl(stream, val);
diff --git a/drivers/media/platform/rockchip/isp/csi.h b/drivers/media/platform/rockchip/isp/csi.h
index 1c21cf85cd66..4a8c7020078b 100644
--- a/drivers/media/platform/rockchip/isp/csi.h
+++ b/drivers/media/platform/rockchip/isp/csi.h
@@ -61,7 +61,6 @@ struct sink_info {
  * sink: csi link enable flags
  * mipi_di: Data Identifier (vc[7:6],dt[5:0])
  * tx_first: flags for dmatx first Y_STATE irq
- * memory: compact or big/little endian byte order for tx/rx
  */
 struct rkisp_csi_device {
 	struct rkisp_device *ispdev;
@@ -73,7 +72,6 @@ struct rkisp_csi_device {
 	u32 irq_cnt;
 	u8 mipi_di[CSI_PAD_MAX - 1];
 	u8 tx_first[HDR_DMA_MAX];
-	u8 memory;
 };
 
 int rkisp_register_csi_subdev(struct rkisp_device *dev,
diff --git a/drivers/media/platform/rockchip/isp/dmarx.c b/drivers/media/platform/rockchip/isp/dmarx.c
index 1ed365000a23..0abfb03c98ee 100644
--- a/drivers/media/platform/rockchip/isp/dmarx.c
+++ b/drivers/media/platform/rockchip/isp/dmarx.c
@@ -347,7 +347,7 @@ static int rawrd_config_mi(struct rkisp_stream *stream)
 		val |= CIF_CSI2_DT_RAW12;
 	}
 	rkisp_write(dev, CSI2RX_RAW_RD_CTRL,
-		    dev->csi_dev.memory << 2, false);
+		    stream->memory << 2, false);
 	rkisp_write(dev, CSI2RX_DATA_IDS_1, val, false);
 	rkisp_rawrd_set_pic_size(dev, stream->out_fmt.width,
 				 stream->out_fmt.height);
@@ -739,7 +739,7 @@ static int rkisp_set_fmt(struct rkisp_stream *stream,
 		if ((stream->ispdev->isp_ver == ISP_V20 ||
 		     stream->ispdev->isp_ver == ISP_V21) &&
 		    fmt->fmt_type == FMT_BAYER &&
-		    !stream->ispdev->csi_dev.memory &&
+		    !stream->memory &&
 		    stream->id != RKISP_STREAM_DMARX)
 			bytesperline = ALIGN(width * fmt->bpp[i] / 8, 256);
 		else
@@ -854,6 +854,45 @@ static int rkisp_querycap(struct file *file, void *priv,
 	return 0;
 }
 
+static long rkisp_ioctl_default(struct file *file, void *fh,
+				bool valid_prio, unsigned int cmd, void *arg)
+{
+	struct rkisp_stream *stream = video_drvdata(file);
+	long ret = 0;
+
+	switch (cmd) {
+	case RKISP_CMD_GET_CSI_MEMORY_MODE:
+		if (stream->id != RKISP_STREAM_RAWRD0 &&
+		    stream->id != RKISP_STREAM_RAWRD1 &&
+		    stream->id != RKISP_STREAM_RAWRD2)
+			ret = -EINVAL;
+		else if (stream->memory == 0)
+			*(int *)arg = CSI_MEM_COMPACT;
+		else if (stream->memory == SW_CSI_RAW_WR_SIMG_MODE)
+			*(int *)arg = CSI_MEM_WORD_BIG_ALIGN;
+		else
+			*(int *)arg = CSI_MEM_WORD_LITTLE_ALIGN;
+		break;
+	case RKISP_CMD_SET_CSI_MEMORY_MODE:
+		if (stream->id != RKISP_STREAM_RAWRD0 &&
+		    stream->id != RKISP_STREAM_RAWRD1 &&
+		    stream->id != RKISP_STREAM_RAWRD2)
+			ret = -EINVAL;
+		else if (*(int *)arg == CSI_MEM_COMPACT)
+			stream->memory = 0;
+		else if (*(int *)arg == CSI_MEM_WORD_BIG_ALIGN)
+			stream->memory = SW_CSI_RAW_WR_SIMG_MODE;
+		else
+			stream->memory =
+				SW_CSI_RWA_WR_SIMG_SWP | SW_CSI_RAW_WR_SIMG_MODE;
+		break;
+	default:
+		ret = -EINVAL;
+	}
+
+	return ret;
+}
+
 static const struct v4l2_ioctl_ops rkisp_dmarx_ioctl = {
 	.vidioc_reqbufs = vb2_ioctl_reqbufs,
 	.vidioc_querybuf = vb2_ioctl_querybuf,
@@ -869,6 +908,7 @@ static const struct v4l2_ioctl_ops rkisp_dmarx_ioctl = {
 	.vidioc_s_fmt_vid_out_mplane = rkisp_s_fmt_vid_out_mplane,
 	.vidioc_g_fmt_vid_out_mplane = rkisp_g_fmt_vid_out_mplane,
 	.vidioc_querycap = rkisp_querycap,
+	.vidioc_default = rkisp_ioctl_default,
 };
 
 static void rkisp_unregister_dmarx_video(struct rkisp_stream *stream)
diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c
index 8e42e4353ae4..c609b26268ef 100644
--- a/drivers/media/platform/rockchip/isp/rkisp.c
+++ b/drivers/media/platform/rockchip/isp/rkisp.c
@@ -2462,15 +2462,6 @@ static long rkisp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 	case RKISP_CMD_TRIGGER_READ_BACK:
 		rkisp_rdbk_trigger_event(isp_dev, T_CMD_QUEUE, arg);
 		break;
-	case RKISP_CMD_CSI_MEMORY_MODE:
-		if (*((int *)arg) == CSI_MEM_BYTE_BE)
-			isp_dev->csi_dev.memory = SW_CSI_RWA_WR_SIMG_SWP |
-						SW_CSI_RAW_WR_SIMG_MODE;
-		else if (*((int *)arg) == CSI_MEM_BYTE_LE)
-			isp_dev->csi_dev.memory = SW_CSI_RAW_WR_SIMG_MODE;
-		else
-			isp_dev->csi_dev.memory = 0;
-		break;
 	case RKISP_CMD_GET_SHARED_BUF:
 		resmem = (struct rkisp_thunderboot_resmem *)arg;
 		resmem->resmem_padr = isp_dev->resmem_pa;
@@ -2548,7 +2539,6 @@ static long rkisp_compat_ioctl32(struct v4l2_subdev *sd,
 	struct rkisp_thunderboot_shmem shmem;
 	struct isp2x_buf_idxfd idxfd;
 	long ret = 0;
-	int mode;
 
 	if (!up && cmd != RKISP_CMD_FREE_SHARED_BUF)
 		return -EINVAL;
@@ -2559,11 +2549,6 @@ static long rkisp_compat_ioctl32(struct v4l2_subdev *sd,
 			return -EFAULT;
 		ret = rkisp_ioctl(sd, cmd, &trigger);
 		break;
-	case RKISP_CMD_CSI_MEMORY_MODE:
-		if (copy_from_user(&mode, up, sizeof(int)))
-			return -EFAULT;
-		ret = rkisp_ioctl(sd, cmd, &mode);
-		break;
 	case RKISP_CMD_GET_SHARED_BUF:
 		ret = rkisp_ioctl(sd, cmd, &resmem);
 		if (!ret && copy_to_user(up, &resmem, sizeof(resmem)))
diff --git a/include/uapi/linux/rkisp2-config.h b/include/uapi/linux/rkisp2-config.h
index 9932b44e89e1..1e3d3c996481 100644
--- a/include/uapi/linux/rkisp2-config.h
+++ b/include/uapi/linux/rkisp2-config.h
@@ -12,12 +12,11 @@
 
 #define RKISP_API_VERSION		KERNEL_VERSION(1, 6, 2)
 
+/****************ISP SUBDEV IOCTL*****************************/
+
 #define RKISP_CMD_TRIGGER_READ_BACK \
 	_IOW('V', BASE_VIDIOC_PRIVATE + 0, struct isp2x_csi_trigger)
 
-#define RKISP_CMD_CSI_MEMORY_MODE \
-	_IOW('V', BASE_VIDIOC_PRIVATE + 1, int)
-
 #define RKISP_CMD_GET_SHARED_BUF \
 	_IOR('V', BASE_VIDIOC_PRIVATE + 2, struct rkisp_thunderboot_resmem)
 
@@ -36,6 +35,16 @@
 #define RKISP_CMD_GET_FBCBUF_FD \
 	_IOR('V', BASE_VIDIOC_PRIVATE + 7, struct isp2x_buf_idxfd)
 
+/****************ISP VIDEO IOCTL******************************/
+
+#define RKISP_CMD_GET_CSI_MEMORY_MODE \
+	_IOR('V', BASE_VIDIOC_PRIVATE + 100, int)
+
+#define RKISP_CMD_SET_CSI_MEMORY_MODE \
+	_IOW('V', BASE_VIDIOC_PRIVATE + 101, int)
+
+/*************************************************************/
+
 #define ISP2X_ID_DPCC			(0)
 #define ISP2X_ID_BLS			(1)
 #define ISP2X_ID_SDG			(2)
@@ -231,11 +240,25 @@ struct isp2x_csi_trigger {
 	enum isp2x_trigger_mode mode;
 } __attribute__ ((packed));
 
-enum isp2x_csi_memory {
+/* isp csi dmatx/dmarx memory mode
+ * 0: raw12/raw10/raw8 8bit memory compact
+ * 1: raw12/raw10 16bit memory one pixel
+ *    big endian for rv1126/rv1109
+ *    |15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
+ *    | 3| 2| 1| 0| -| -| -| -|11|10| 9| 8| 7| 6| 5| 4|
+ *    little align for rk356x
+ *    |15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
+ *    | -| -| -| -|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
+ * 2: raw12/raw10 16bit memory one pixel
+ *    big align for rv1126/rv1109/rk356x
+ *    |15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
+ *    |11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0| -| -| -| -|
+ */
+enum isp_csi_memory {
 	CSI_MEM_COMPACT = 0,
-	CSI_MEM_BYTE_BE,
-	CSI_MEM_BYTE_LE,
-	CSI_MEM_MAX,
+	CSI_MEM_WORD_BIG_END = 1,
+	CSI_MEM_WORD_LITTLE_ALIGN = 1,
+	CSI_MEM_WORD_BIG_ALIGN = 2,
 };
 
 struct isp2x_ispgain_buf {

commit 03d58d32a511ed6ccb2ddd9a4594e5b8206c9369
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Sat Oct 9 17:23:28 2021 +0800

    media: rockchip: cif support config memory mode
    
    cif memory mode
     0: raw12/raw10/raw8 8bit memory compact
     1: raw12/raw10 16bit memory one pixel
        low align for rv1126/rv1109/rk356x
        |15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
        | -| -| -| -|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
     2: raw12/raw10 16bit memory one pixel
        high align for rv1126/rv1109/rk356x
        |15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
        |11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0| -| -| -| -|
    
     note: rv1109/rv1126/rk356x dvp only support uncompact mode,
           and can be set low align or high align
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I59d619645650dfa10c9b2c168d8c741292f9f90f

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index 4eeea1cb100c..1cfc74089633 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -1826,7 +1826,9 @@ static int rkcif_csi_channel_init(struct rkcif_stream *stream,
 		channel->vc = stream->vc;
 	else
 		channel->vc = channel->id;
-
+	v4l2_dbg(3, rkcif_debug, &dev->v4l2_dev,
+		 "%s: channel width %d, height %d, virtual_width %d, vc %d\n", __func__,
+		 channel->width, channel->height, channel->virtual_width, channel->vc);
 	return 0;
 }
 
@@ -1941,7 +1943,10 @@ static int rkcif_csi_channel_set(struct rkcif_stream *stream,
 		else
 			val &= ~LVDS_COMPACT;
 	}
-
+	if (stream->is_high_align)
+		val |= CSI_ENABLE_MIPI_HIGH_ALIGN;
+	else
+		val &= ~CSI_ENABLE_MIPI_HIGH_ALIGN;
 	rkcif_write_register(dev, get_reg_index_of_id_ctrl0(channel->id), val);
 
 	return 0;
@@ -2944,12 +2949,21 @@ static int rkcif_stream_start(struct rkcif_stream *stream)
 	      | stream->cif_fmt_in->dvp_fmt_val
 	      | xfer_mode | yc_swap | multi_id_en
 	      | multi_id_sel | multi_id_mode | bt1120_edge_mode;
+
+	if (stream->is_high_align)
+		val |= CIF_HIGH_ALIGN;
+	else
+		val &= ~CIF_HIGH_ALIGN;
 	rkcif_write_register(dev, CIF_REG_DVP_FOR, val);
 
 	val = stream->pixm.width;
 	if (stream->cif_fmt_in->fmt_type == CIF_FMT_TYPE_RAW) {
 		fmt = find_output_fmt(stream, stream->pixm.pixelformat);
-		val = stream->pixm.width * rkcif_cal_raw_vir_line_ratio(stream, fmt);
+		if (fmt->fmt_type == CIF_FMT_TYPE_RAW &&
+		    fmt->csi_fmt_val == CSI_WRDDR_TYPE_RAW8)
+			val = ALIGN(stream->pixm.width * fmt->raw_bpp / 8, 256);
+		else
+			val = stream->pixm.width * rkcif_cal_raw_vir_line_ratio(stream, fmt);
 	}
 	rkcif_write_register(dev, CIF_REG_DVP_VIR_LINE_WIDTH, val);
 	rkcif_write_register(dev, CIF_REG_DVP_SET_SIZE,
@@ -3410,10 +3424,19 @@ void rkcif_stream_init(struct rkcif_device *dev, u32 id)
 	stream->crop_dyn_en = false;
 	stream->crop_mask = 0x0;
 
-	if (dev->chip_id >= CHIP_RV1126_CIF)
-		stream->is_compact = true;
-	else
-		stream->is_compact = false;
+	if (dev->inf_id == RKCIF_DVP) {
+		if (dev->chip_id <= CHIP_RK3568_CIF)
+			stream->is_compact = false;
+		else
+			stream->is_compact = true;
+	} else {
+		if (dev->chip_id >= CHIP_RV1126_CIF)
+			stream->is_compact = true;
+		else
+			stream->is_compact = false;
+	}
+
+	stream->is_high_align = false;
 
 	if (dev->chip_id == CHIP_RV1126_CIF ||
 	    dev->chip_id == CHIP_RV1126_CIF_LITE)
@@ -3846,42 +3869,53 @@ static int rkcif_g_selection(struct file *file, void *fh,
 	return -EINVAL;
 }
 
-static int rkcif_g_ctrl(struct file *file, void *fh,
-			   struct v4l2_control *ctrl)
-{
-	struct rkcif_stream *stream = video_drvdata(file);
-
-	switch (ctrl->id) {
-	case V4L2_CID_CIF_DATA_COMPACT:
-		if (stream->is_compact)
-			ctrl->value = CSI_MEM_COMPACT;
-		else
-			ctrl->value = CSI_MEM_BYTE_LE;
-		break;
-	default:
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-static int rkcif_s_ctrl(struct file *file, void *fh,
-			   struct v4l2_control *ctrl)
+static long rkcif_ioctl_default(struct file *file, void *fh,
+				    bool valid_prio, unsigned int cmd, void *arg)
 {
 	struct rkcif_stream *stream = video_drvdata(file);
 	struct rkcif_device *dev = stream->cifdev;
+	const struct cif_input_fmt *in_fmt;
+	struct v4l2_rect rect;
+	int vc = 0;
 
-	if (stream->state == RKCIF_STATE_STREAMING) {
-		v4l2_err(&dev->v4l2_dev, "set failed, the stream is streaming\n");
-		return -EBUSY;
-	}
-
-	switch (ctrl->id) {
-	case V4L2_CID_CIF_DATA_COMPACT:
-		if (ctrl->value == CSI_LVDS_MEM_COMPACT)
+	switch (cmd) {
+	case RKCIF_CMD_GET_CSI_MEMORY_MODE:
+		if (stream->is_compact) {
+			*(int *)arg = CSI_LVDS_MEM_COMPACT;
+		} else {
+			if (stream->is_high_align)
+				*(int *)arg = CSI_LVDS_MEM_WORD_HIGH_ALIGN;
+			else
+				*(int *)arg = CSI_LVDS_MEM_WORD_LOW_ALIGN;
+		}
+		break;
+	case RKCIF_CMD_SET_CSI_MEMORY_MODE:
+		if (dev->terminal_sensor.sd) {
+			in_fmt = get_input_fmt(dev->terminal_sensor.sd, &rect, 0, &vc);
+			if (in_fmt == NULL) {
+				v4l2_err(&dev->v4l2_dev, "can't get sensor input format\n");
+				return -EINVAL;
+			}
+		} else {
+			v4l2_err(&dev->v4l2_dev, "can't get sensor device\n");
+			return -EINVAL;
+		}
+		if (*(int *)arg == CSI_LVDS_MEM_COMPACT) {
+			if (((dev->inf_id == RKCIF_DVP && dev->chip_id <= CHIP_RK3568_CIF) ||
+			    (dev->inf_id == RKCIF_MIPI_LVDS && dev->chip_id < CHIP_RV1126_CIF)) &&
+			    in_fmt->csi_fmt_val != CSI_WRDDR_TYPE_RAW8) {
+				v4l2_err(&dev->v4l2_dev, "device not support compact\n");
+				return -EINVAL;
+			}
 			stream->is_compact = true;
-		else
+			stream->is_high_align = false;
+		} else if (*(int *)arg == CSI_LVDS_MEM_WORD_HIGH_ALIGN) {
 			stream->is_compact = false;
+			stream->is_high_align = true;
+		} else {
+			stream->is_compact = false;
+			stream->is_high_align = false;
+		}
 		break;
 	default:
 		return -EINVAL;
@@ -3913,8 +3947,7 @@ static const struct v4l2_ioctl_ops rkcif_v4l2_ioctl_ops = {
 	.vidioc_g_selection = rkcif_g_selection,
 	.vidioc_enum_frameintervals = rkcif_enum_frameintervals,
 	.vidioc_enum_framesizes = rkcif_enum_framesizes,
-	.vidioc_g_ctrl = rkcif_g_ctrl,
-	.vidioc_s_ctrl = rkcif_s_ctrl,
+	.vidioc_default = rkcif_ioctl_default,
 };
 
 static void rkcif_unregister_stream_vdev(struct rkcif_stream *stream)
diff --git a/drivers/media/platform/rockchip/cif/dev.c b/drivers/media/platform/rockchip/cif/dev.c
index 8c66d1704249..ba5cdf82266a 100644
--- a/drivers/media/platform/rockchip/cif/dev.c
+++ b/drivers/media/platform/rockchip/cif/dev.c
@@ -152,6 +152,64 @@ static ssize_t rkcif_store_dummybuf_mode(struct device *dev,
 	return len;
 }
 
+/* show the compact mode of each stream in stream index order,
+ * 1 for compact, 0 for 16bit
+ */
+static ssize_t rkcif_show_memory_mode(struct device *dev,
+					      struct device_attribute *attr,
+					      char *buf)
+{
+	struct rkcif_device *cif_dev = (struct rkcif_device *)dev_get_drvdata(dev);
+	int ret;
+
+	ret = snprintf(buf, PAGE_SIZE,
+		       "stream[0~3] %d %d %d %d, 0(low align) 1(high align) 2(compact)\n",
+		       cif_dev->stream[0].is_compact ? 2 : (cif_dev->stream[0].is_high_align ? 1 : 0),
+		       cif_dev->stream[1].is_compact ? 2 : (cif_dev->stream[1].is_high_align ? 1 : 0),
+		       cif_dev->stream[2].is_compact ? 2 : (cif_dev->stream[2].is_high_align ? 1 : 0),
+		       cif_dev->stream[3].is_compact ? 2 : (cif_dev->stream[3].is_high_align ? 1 : 0));
+	return ret;
+}
+
+static ssize_t rkcif_store_memory_mode(struct device *dev,
+					       struct device_attribute *attr,
+					       const char *buf, size_t len)
+{
+	struct rkcif_device *cif_dev = (struct rkcif_device *)dev_get_drvdata(dev);
+	int i, index;
+	char val[4];
+
+	if (buf) {
+		index = 0;
+		for (i = 0; i < len; i++) {
+			if (buf[i] == ' ') {
+				continue;
+			} else if (buf[i] == '\0') {
+				break;
+			} else {
+				val[index] = buf[i];
+				index++;
+				if (index == 4)
+					break;
+			}
+		}
+
+		for (i = 0; i < index; i++) {
+			if (cif_dev->stream[i].is_compact) {
+				dev_info(cif_dev->dev, "stream[%d] set memory align fail, is compact mode\n",
+					 i);
+				continue;
+			}
+			if (val[i] - '0' == 0)
+				cif_dev->stream[i].is_high_align = false;
+			else
+				cif_dev->stream[i].is_high_align = true;
+		}
+	}
+
+	return len;
+}
+
 static DEVICE_ATTR(compact_test, S_IWUSR | S_IRUSR,
 		   rkcif_show_compact_mode, rkcif_store_compact_mode);
 
@@ -161,11 +219,15 @@ static DEVICE_ATTR(wait_line, S_IWUSR | S_IRUSR,
 static DEVICE_ATTR(is_use_dummybuf, S_IWUSR | S_IRUSR,
 		   rkcif_show_dummybuf_mode, rkcif_store_dummybuf_mode);
 
+static DEVICE_ATTR(is_high_align, S_IWUSR | S_IRUSR,
+		   rkcif_show_memory_mode, rkcif_store_memory_mode);
+
 
 static struct attribute *dev_attrs[] = {
 	&dev_attr_compact_test.attr,
 	&dev_attr_wait_line.attr,
 	&dev_attr_is_use_dummybuf.attr,
+	&dev_attr_is_high_align.attr,
 	NULL,
 };
 
diff --git a/drivers/media/platform/rockchip/cif/dev.h b/drivers/media/platform/rockchip/cif/dev.h
index 9b4573fac866..d8d65675c3da 100644
--- a/drivers/media/platform/rockchip/cif/dev.h
+++ b/drivers/media/platform/rockchip/cif/dev.h
@@ -447,6 +447,7 @@ struct rkcif_stream {
 	bool				is_line_inten;
 	bool				is_can_stop;
 	bool				is_buf_active;
+	bool				is_high_align;
 };
 
 struct rkcif_lvds_subdev {
diff --git a/drivers/media/platform/rockchip/cif/regs.h b/drivers/media/platform/rockchip/cif/regs.h
index b8f1f01f515a..44a8f392db18 100644
--- a/drivers/media/platform/rockchip/cif/regs.h
+++ b/drivers/media/platform/rockchip/cif/regs.h
@@ -432,6 +432,7 @@ enum cif_reg_index {
 #define BT656_1120_MULTI_ID_1_MASK	~(0x03 << 12)
 #define BT656_1120_MULTI_ID_2_MASK	~(0x03 << 20)
 #define BT656_1120_MULTI_ID_3_MASK	~(0x03 << 28)
+#define	CIF_HIGH_ALIGN			(0x01 << 18)
 
 /* CIF_SCL_CTRL */
 #define ENABLE_SCL_DOWN			(0x01 << 0)
@@ -515,6 +516,7 @@ enum cif_reg_index {
 #define CSI_YUV_INPUT_ORDER_VYUY	(0x1 << 16)
 #define CSI_YUV_INPUT_ORDER_YUYV	(0x2 << 16)
 #define CSI_YUV_INPUT_ORDER_YVYU	(0x3 << 16)
+#define CSI_ENABLE_MIPI_HIGH_ALIGN	(0x1 << 31)
 
 #define LVDS_ENABLE_CAPTURE		(0x1 << 16)
 #define LVDS_MODE(mode)			(((mode) & 0x7) << 17)
diff --git a/include/uapi/linux/rkcif-config.h b/include/uapi/linux/rkcif-config.h
index 9e05f3abf273..0fa5f040f321 100644
--- a/include/uapi/linux/rkcif-config.h
+++ b/include/uapi/linux/rkcif-config.h
@@ -11,12 +11,31 @@
 
 #define RKCIF_API_VERSION		KERNEL_VERSION(0, 1, 0xa)
 
-#define V4L2_CID_CIF_DATA_COMPACT	(V4L2_CID_PRIVATE_BASE + 0)
+#define RKCIF_CMD_GET_CSI_MEMORY_MODE \
+	_IOR('V', BASE_VIDIOC_PRIVATE + 0, int)
+
+#define RKCIF_CMD_SET_CSI_MEMORY_MODE \
+	_IOW('V', BASE_VIDIOC_PRIVATE + 1, int)
+
+/* cif memory mode
+ * 0: raw12/raw10/raw8 8bit memory compact
+ * 1: raw12/raw10 16bit memory one pixel
+ *    low align for rv1126/rv1109/rk356x
+ *    |15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
+ *    | -| -| -| -|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
+ * 2: raw12/raw10 16bit memory one pixel
+ *    high align for rv1126/rv1109/rk356x
+ *    |15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
+ *    |11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0| -| -| -| -|
+ *
+ * note: rv1109/rv1126/rk356x dvp only support uncompact mode,
+ *       and can be set low align or high align
+ */
 
 enum cif_csi_lvds_memory {
-	CSI_LVDS_MEM_16BITS = 0,
-	CSI_LVDS_MEM_COMPACT,
-	CSI_LVDS_MEM_MAX,
+	CSI_LVDS_MEM_COMPACT = 0,
+	CSI_LVDS_MEM_WORD_LOW_ALIGN = 1,
+	CSI_LVDS_MEM_WORD_HIGH_ALIGN = 2,
 };
 
 #endif

commit ecb04d26a35209645683a3d33dae9168b163bf92
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Tue Oct 19 17:19:59 2021 +0800

    drm/rockchip: ebc_dev: release version v2.13
    
    create independent workqueqe to do auto refresh work
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: I71421e4391fe9c1f85023b08057d75a4e11e9c85

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index 56f88d714864..9e7e1f483c5c 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -21,51 +21,51 @@ __initcall_ebc_init6s:
 	.p2align 3,,7
 	.type	get_auto_image, %function
 get_auto_image:
-.LFB2811:
+.LFB2812:
 	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
-	.loc 1 457 0
+	.loc 1 458 0
 	.cfi_startproc
 .LVL0:
-	.loc 1 458 0
+	.loc 1 459 0
 	adrp	x5, .LANCHOR0
-	.loc 1 466 0
+	.loc 1 467 0
 	ldrb	w11, [x4, 48]
 .LVL1:
-	.loc 1 458 0
+	.loc 1 459 0
 	ldr	x16, [x5, #:lo12:.LANCHOR0]
-	.loc 1 470 0
+	.loc 1 471 0
 	add	x16, x16, 24
 	ldr	w18, [x16, 156]
-	.loc 1 476 0
+	.loc 1 477 0
 	ldp	w12, w17, [x16, 84]
-	.loc 1 478 0
+	.loc 1 479 0
 	str	wzr, [x4, 52]
 .LVL2:
-	.loc 1 484 0
+	.loc 1 485 0
 	cmp	w17, 0
 	ble	.L54
 	lsr	w12, w12, 3
 .LVL3:
-	.loc 1 457 0
+	.loc 1 458 0
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
 	sub	w15, w12, #1
-	.loc 1 484 0
+	.loc 1 485 0
 	mov	w14, 0
 .LVL4:
 	add	x15, x15, 1
-	.loc 1 457 0
+	.loc 1 458 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	lsl	x30, x15, 3
 	lsl	x15, x15, 2
 	stp	x19, x20, [sp, 16]
 	stp	x21, x22, [sp, 32]
-	.loc 1 496 0
+	.loc 1 497 0
 	mov	w13, 1
-	.loc 1 457 0
+	.loc 1 458 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 19, -48
 	.cfi_offset 20, -40
@@ -76,9 +76,9 @@ get_auto_image:
 .LVL5:
 	.p2align 2
 .L26:
-	.loc 1 485 0
-	cbz	w18, .L3
 	.loc 1 486 0
+	cbz	w18, .L3
+	.loc 1 487 0
 	ldp	w5, w10, [x16, 84]
 .LVL6:
 	sub	w10, w10, #1
@@ -91,306 +91,306 @@ get_auto_image:
 	add	x10, x10, 2
 .LVL8:
 	add	x6, x3, 8
-	.loc 1 490 0 discriminator 1
+	.loc 1 491 0 discriminator 1
 	mov	x9, 0
 	cbz	w12, .L5
 	.p2align 2
 .L42:
-	.loc 1 493 0
+	.loc 1 494 0
 	ldr	w7, [x1, x9, lsl 2]
 .LVL9:
-	.loc 1 494 0
+	.loc 1 495 0
 	ldr	w5, [x2, x9, lsl 2]
 .LVL10:
-	.loc 1 495 0
+	.loc 1 496 0
 	cmp	w7, w5
 	beq	.L7
-	.loc 1 497 0
+	.loc 1 498 0
 	eor	w8, w7, w5
-	.loc 1 496 0
+	.loc 1 497 0
 	str	w13, [x4, 52]
-	.loc 1 492 0
+	.loc 1 493 0
 	mov	w19, 0
-	.loc 1 498 0
+	.loc 1 499 0
 	tst	x8, 15
 	beq	.L8
-	.loc 1 499 0
+	.loc 1 500 0
 	ldrb	w21, [x6, -8]
-	.loc 1 501 0
+	.loc 1 502 0
 	ubfiz	w19, w5, 8, 8
 	ldr	x22, [x4, 128]
 	add	w19, w19, w7, uxtb
-	.loc 1 503 0
+	.loc 1 504 0
 	add	w20, w21, 1
-	.loc 1 501 0
+	.loc 1 502 0
 	add	x19, x22, x19
-	.loc 1 500 0
+	.loc 1 501 0
 	lsl	w21, w21, 16
-	.loc 1 503 0
-	and	w20, w20, 255
 	.loc 1 504 0
+	and	w20, w20, 255
+	.loc 1 505 0
 	cmp	w11, w20
-	.loc 1 501 0
+	.loc 1 502 0
 	ldrb	w19, [x19, w21, sxtw]
 	and	w19, w19, 3
-	.loc 1 504 0
+	.loc 1 505 0
 	beq	.L58
 .L9:
-	.loc 1 508 0
+	.loc 1 509 0
 	strb	w20, [x6, -8]
 .L8:
-	.loc 1 511 0
+	.loc 1 512 0
 	tst	w8, 240
 	beq	.L10
-	.loc 1 514 0
+	.loc 1 515 0
 	lsr	w20, w5, 4
-	.loc 1 512 0
+	.loc 1 513 0
 	ldrb	w21, [x6, -7]
-	.loc 1 514 0
+	.loc 1 515 0
 	ubfx	x22, x7, 4, 8
 	ubfiz	w20, w20, 8, 8
 	add	w20, w20, w22
 	ldr	x22, [x4, 128]
-	.loc 1 513 0
+	.loc 1 514 0
 	lsl	w23, w21, 16
-	.loc 1 516 0
+	.loc 1 517 0
 	add	w21, w21, 1
-	.loc 1 514 0
+	.loc 1 515 0
 	add	x20, x22, x20
-	.loc 1 516 0
-	and	w21, w21, 255
 	.loc 1 517 0
+	and	w21, w21, 255
+	.loc 1 518 0
 	cmp	w11, w21
-	.loc 1 514 0
-	ldrb	w20, [x20, w23, sxtw]
 	.loc 1 515 0
+	ldrb	w20, [x20, w23, sxtw]
+	.loc 1 516 0
 	ubfiz	w20, w20, 2, 2
 	orr	w19, w20, w19
-	.loc 1 517 0
+	.loc 1 518 0
 	beq	.L59
 .L11:
-	.loc 1 521 0
+	.loc 1 522 0
 	strb	w21, [x6, -7]
 .L10:
-	.loc 1 524 0
+	.loc 1 525 0
 	tst	w8, 3840
 	beq	.L12
-	.loc 1 525 0
+	.loc 1 526 0
 	ldrb	w22, [x6, -6]
-	.loc 1 527 0
+	.loc 1 528 0
 	and	w21, w5, 65280
 	ldr	x23, [x4, 128]
 	ubfx	x20, x7, 8, 8
 	orr	w20, w20, w21
-	.loc 1 529 0
+	.loc 1 530 0
 	add	w21, w22, 1
-	.loc 1 526 0
+	.loc 1 527 0
 	lsl	w22, w22, 16
-	.loc 1 529 0
+	.loc 1 530 0
 	and	w21, w21, 255
-	.loc 1 527 0
+	.loc 1 528 0
 	add	x20, x23, x20, uxth
-	.loc 1 530 0
+	.loc 1 531 0
 	cmp	w11, w21
-	.loc 1 527 0
-	ldrb	w20, [x20, w22, sxtw]
 	.loc 1 528 0
+	ldrb	w20, [x20, w22, sxtw]
+	.loc 1 529 0
 	ubfiz	w20, w20, 4, 2
 	orr	w19, w20, w19
-	.loc 1 530 0
+	.loc 1 531 0
 	beq	.L60
 .L13:
-	.loc 1 534 0
+	.loc 1 535 0
 	strb	w21, [x6, -6]
 .L12:
-	.loc 1 537 0
+	.loc 1 538 0
 	tst	w8, 61440
 	beq	.L14
-	.loc 1 540 0
+	.loc 1 541 0
 	lsr	w20, w5, 12
-	.loc 1 538 0
+	.loc 1 539 0
 	ldrb	w21, [x6, -5]
-	.loc 1 540 0
+	.loc 1 541 0
 	ubfx	x22, x7, 12, 8
 	ubfiz	w20, w20, 8, 8
 	add	w20, w20, w22
 	ldr	x22, [x4, 128]
-	.loc 1 539 0
+	.loc 1 540 0
 	lsl	w23, w21, 16
-	.loc 1 542 0
+	.loc 1 543 0
 	add	w21, w21, 1
-	.loc 1 540 0
+	.loc 1 541 0
 	add	x20, x22, x20
-	.loc 1 542 0
-	and	w21, w21, 255
 	.loc 1 543 0
+	and	w21, w21, 255
+	.loc 1 544 0
 	cmp	w11, w21
-	.loc 1 540 0
-	ldrb	w20, [x20, w23, sxtw]
 	.loc 1 541 0
+	ldrb	w20, [x20, w23, sxtw]
+	.loc 1 542 0
 	ubfiz	w20, w20, 6, 2
 	orr	w19, w20, w19
-	.loc 1 543 0
+	.loc 1 544 0
 	beq	.L61
 .L15:
-	.loc 1 547 0
+	.loc 1 548 0
 	strb	w21, [x6, -5]
 .L14:
-	.loc 1 550 0
+	.loc 1 551 0
 	strb	w19, [x10, -2]
-	.loc 1 553 0
+	.loc 1 554 0
 	tst	w8, 983040
-	.loc 1 552 0
-	mov	w19, 0
 	.loc 1 553 0
+	mov	w19, 0
+	.loc 1 554 0
 	beq	.L16
-	.loc 1 556 0
+	.loc 1 557 0
 	lsr	w19, w5, 16
-	.loc 1 554 0
+	.loc 1 555 0
 	ldrb	w20, [x6, -4]
-	.loc 1 556 0
+	.loc 1 557 0
 	ubfx	x21, x7, 16, 8
 	ubfiz	w19, w19, 8, 8
 	add	w19, w19, w21
 	ldr	x21, [x4, 128]
-	.loc 1 555 0
+	.loc 1 556 0
 	lsl	w22, w20, 16
-	.loc 1 558 0
+	.loc 1 559 0
 	add	w20, w20, 1
-	.loc 1 556 0
+	.loc 1 557 0
 	add	x19, x21, x19
-	.loc 1 558 0
-	and	w20, w20, 255
 	.loc 1 559 0
+	and	w20, w20, 255
+	.loc 1 560 0
 	cmp	w11, w20
-	.loc 1 556 0
+	.loc 1 557 0
 	ldrb	w19, [x19, w22, sxtw]
 	and	w19, w19, 3
-	.loc 1 559 0
+	.loc 1 560 0
 	beq	.L62
 .L17:
-	.loc 1 563 0
+	.loc 1 564 0
 	strb	w20, [x6, -4]
 .L16:
-	.loc 1 566 0
+	.loc 1 567 0
 	tst	w8, 15728640
 	beq	.L18
-	.loc 1 569 0
+	.loc 1 570 0
 	lsr	w20, w5, 20
-	.loc 1 567 0
+	.loc 1 568 0
 	ldrb	w21, [x6, -3]
-	.loc 1 569 0
+	.loc 1 570 0
 	ubfx	x22, x7, 20, 8
 	ubfiz	w20, w20, 8, 8
 	add	w20, w20, w22
 	ldr	x22, [x4, 128]
-	.loc 1 568 0
+	.loc 1 569 0
 	lsl	w23, w21, 16
-	.loc 1 571 0
+	.loc 1 572 0
 	add	w21, w21, 1
-	.loc 1 569 0
+	.loc 1 570 0
 	add	x20, x22, x20
-	.loc 1 571 0
-	and	w21, w21, 255
 	.loc 1 572 0
+	and	w21, w21, 255
+	.loc 1 573 0
 	cmp	w11, w21
-	.loc 1 569 0
-	ldrb	w20, [x20, w23, sxtw]
 	.loc 1 570 0
+	ldrb	w20, [x20, w23, sxtw]
+	.loc 1 571 0
 	ubfiz	w20, w20, 2, 2
 	orr	w19, w20, w19
-	.loc 1 572 0
+	.loc 1 573 0
 	beq	.L63
 .L19:
-	.loc 1 576 0
+	.loc 1 577 0
 	strb	w21, [x6, -3]
 .L18:
-	.loc 1 579 0
+	.loc 1 580 0
 	tst	w8, 251658240
 	beq	.L20
-	.loc 1 580 0
+	.loc 1 581 0
 	ldrb	w22, [x6, -2]
-	.loc 1 582 0
+	.loc 1 583 0
 	lsr	w20, w5, 24
 	mov	w21, w20
 	lsr	w24, w7, 24
 	ldr	x23, [x4, 128]
 	add	w20, w24, w21, lsl 8
-	.loc 1 584 0
+	.loc 1 585 0
 	add	w21, w22, 1
-	.loc 1 581 0
-	lsl	w22, w22, 16
 	.loc 1 582 0
+	lsl	w22, w22, 16
+	.loc 1 583 0
 	add	x20, x23, x20
-	.loc 1 584 0
-	and	w21, w21, 255
 	.loc 1 585 0
+	and	w21, w21, 255
+	.loc 1 586 0
 	cmp	w11, w21
-	.loc 1 582 0
-	ldrb	w20, [x20, w22, sxtw]
 	.loc 1 583 0
+	ldrb	w20, [x20, w22, sxtw]
+	.loc 1 584 0
 	ubfiz	w20, w20, 4, 2
 	orr	w19, w20, w19
-	.loc 1 585 0
+	.loc 1 586 0
 	beq	.L64
 .L21:
-	.loc 1 589 0
+	.loc 1 590 0
 	strb	w21, [x6, -2]
 .L20:
-	.loc 1 592 0
+	.loc 1 593 0
 	tst	w8, -268435456
 	beq	.L22
-	.loc 1 593 0
+	.loc 1 594 0
 	ldrb	w21, [x6, -1]
-	.loc 1 595 0
+	.loc 1 596 0
 	lsr	w8, w5, 28
 .LVL11:
 	mov	w20, w8
 	lsr	w23, w7, 28
 	ldr	x22, [x4, 128]
 	add	w8, w23, w20, lsl 8
-	.loc 1 597 0
+	.loc 1 598 0
 	add	w20, w21, 1
-	.loc 1 594 0
-	lsl	w21, w21, 16
 	.loc 1 595 0
+	lsl	w21, w21, 16
+	.loc 1 596 0
 	add	x8, x22, x8
-	.loc 1 597 0
-	and	w20, w20, 255
 	.loc 1 598 0
+	and	w20, w20, 255
+	.loc 1 599 0
 	cmp	w11, w20
-	.loc 1 595 0
-	ldrb	w8, [x8, w21, sxtw]
 	.loc 1 596 0
+	ldrb	w8, [x8, w21, sxtw]
+	.loc 1 597 0
 	ubfiz	w8, w8, 6, 2
 	orr	w19, w8, w19
-	.loc 1 598 0
+	.loc 1 599 0
 	beq	.L65
 .L23:
-	.loc 1 602 0
+	.loc 1 603 0
 	strb	w20, [x6, -1]
 .LVL12:
 .L22:
-	.loc 1 605 0
-	str	w5, [x2, x9, lsl 2]
 	.loc 1 606 0
+	str	w5, [x2, x9, lsl 2]
+	.loc 1 607 0
 	strb	w19, [x10, -1]
 .L24:
 	add	x9, x9, 1
 	add	x10, x10, 2
 	add	x6, x6, 8
-	.loc 1 490 0 discriminator 2
+	.loc 1 491 0 discriminator 2
 	cmp	w12, w9
 	bgt	.L42
 	add	x3, x3, x30
 	add	x2, x2, x15
 	add	x1, x1, x15
 .L5:
-	.loc 1 484 0 discriminator 2
+	.loc 1 485 0 discriminator 2
 	add	w14, w14, 1
 	cmp	w17, w14
 	bne	.L26
-	.loc 1 618 0
+	.loc 1 619 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
@@ -410,100 +410,100 @@ get_auto_image:
 	.p2align 3
 .L65:
 	.cfi_restore_state
-	.loc 1 600 0
+	.loc 1 601 0
 	and	w5, w5, 268435455
 .LVL14:
 	and	w7, w7, -268435456
 .LVL15:
 	orr	w5, w7, w5
 .LVL16:
-	.loc 1 599 0
+	.loc 1 600 0
 	mov	w20, 0
 	b	.L23
 .LVL17:
 	.p2align 3
 .L64:
-	.loc 1 587 0
+	.loc 1 588 0
 	and	w5, w5, -251658241
 .LVL18:
 	and	w20, w7, 251658240
 	orr	w5, w20, w5
 .LVL19:
-	.loc 1 586 0
+	.loc 1 587 0
 	mov	w21, 0
 	b	.L21
 	.p2align 3
 .L62:
-	.loc 1 561 0
+	.loc 1 562 0
 	and	w20, w7, 983040
 	and	w5, w5, -983041
 .LVL20:
 	orr	w5, w20, w5
 .LVL21:
-	.loc 1 560 0
+	.loc 1 561 0
 	mov	w20, 0
 	b	.L17
 	.p2align 3
 .L63:
-	.loc 1 574 0
+	.loc 1 575 0
 	and	w5, w5, -15728641
 .LVL22:
 	and	w20, w7, 15728640
 	orr	w5, w20, w5
 .LVL23:
-	.loc 1 573 0
+	.loc 1 574 0
 	mov	w21, 0
 	b	.L19
 	.p2align 3
 .L61:
-	.loc 1 545 0
+	.loc 1 546 0
 	and	w5, w5, -61441
 .LVL24:
 	and	w20, w7, 61440
 	orr	w5, w20, w5
 .LVL25:
-	.loc 1 544 0
+	.loc 1 545 0
 	mov	w21, 0
 	b	.L15
 	.p2align 3
 .L59:
-	.loc 1 519 0
+	.loc 1 520 0
 	and	w5, w5, -241
 .LVL26:
 	and	w20, w7, 240
 	orr	w5, w20, w5
 .LVL27:
-	.loc 1 518 0
+	.loc 1 519 0
 	mov	w21, 0
 	b	.L11
 	.p2align 3
 .L60:
-	.loc 1 532 0
+	.loc 1 533 0
 	and	w5, w5, -3841
 .LVL28:
 	and	w20, w7, 3840
 	orr	w5, w20, w5
 .LVL29:
-	.loc 1 531 0
+	.loc 1 532 0
 	mov	w21, 0
 	b	.L13
 	.p2align 3
 .L58:
-	.loc 1 506 0
+	.loc 1 507 0
 	bfi	w5, w7, 0, 4
-	.loc 1 505 0
+	.loc 1 506 0
 	mov	w20, 0
 	b	.L9
 	.p2align 3
 .L7:
-	.loc 1 609 0
-	strb	wzr, [x10, -2]
 	.loc 1 610 0
+	strb	wzr, [x10, -2]
+	.loc 1 611 0
 	strb	wzr, [x10, -1]
 	b	.L24
 	.p2align 3
 .L3:
-	.loc 1 488 0
+	.loc 1 489 0
 	ldr	w10, [x16, 84]
 	mul	w10, w14, w10
 	lsr	w10, w10, 2
@@ -523,32 +523,32 @@ get_auto_image:
 	.cfi_restore 30
 	ret
 	.cfi_endproc
-.LFE2811:
+.LFE2812:
 	.size	get_auto_image, .-get_auto_image
 	.align	2
 	.p2align 3,,7
 	.type	get_overlay_image, %function
 get_overlay_image:
-.LFB2812:
-	.loc 1 622 0
+.LFB2813:
+	.loc 1 623 0
 	.cfi_startproc
 .LVL32:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
 	.cfi_offset 30, -88
-	.loc 1 623 0
+	.loc 1 624 0
 	adrp	x5, .LANCHOR0
-	.loc 1 622 0
+	.loc 1 623 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 623 0
+	.loc 1 624 0
 	ldr	x17, [x5, #:lo12:.LANCHOR0]
-	.loc 1 622 0
+	.loc 1 623 0
 	stp	x19, x20, [sp, 16]
-	.loc 1 635 0
+	.loc 1 636 0
 	add	x17, x17, 24
-	.loc 1 622 0
+	.loc 1 623 0
 	stp	x21, x22, [sp, 32]
 	stp	x23, x24, [sp, 48]
 	stp	x25, x26, [sp, 64]
@@ -562,14 +562,14 @@ get_overlay_image:
 	.cfi_offset 25, -32
 	.cfi_offset 26, -24
 	.cfi_offset 27, -16
-	.loc 1 641 0
+	.loc 1 642 0
 	ldp	w11, w18, [x17, 84]
-	.loc 1 635 0
+	.loc 1 636 0
 	ldr	w30, [x17, 156]
-	.loc 1 643 0
+	.loc 1 644 0
 	str	wzr, [x4, 52]
 .LVL33:
-	.loc 1 649 0
+	.loc 1 650 0
 	cmp	w18, 0
 	ble	.L66
 	lsr	w11, w11, 3
@@ -577,21 +577,21 @@ get_overlay_image:
 	mov	w13, 0
 .LVL35:
 	sub	w16, w11, #1
-	.loc 1 661 0
+	.loc 1 662 0
 	mov	w12, 1
 	add	x16, x16, 1
-	.loc 1 799 0
+	.loc 1 800 0
 	mov	w15, -268435456
 	lsl	x19, x16, 3
 	lsl	x16, x16, 2
-	.loc 1 781 0
+	.loc 1 782 0
 	mov	w14, 251658240
 .LVL36:
 	.p2align 2
 .L99:
-	.loc 1 650 0
-	cbz	w30, .L68
 	.loc 1 651 0
+	cbz	w30, .L68
+	.loc 1 652 0
 	ldp	w5, w10, [x17, 84]
 .LVL37:
 	sub	w10, w10, #1
@@ -604,390 +604,390 @@ get_overlay_image:
 	add	x10, x10, 2
 .LVL39:
 	add	x7, x3, 8
-	.loc 1 655 0 discriminator 1
+	.loc 1 656 0 discriminator 1
 	mov	x9, 0
 	cbz	w11, .L70
 	.p2align 2
 .L131:
-	.loc 1 658 0
+	.loc 1 659 0
 	ldr	w5, [x1, x9, lsl 2]
 .LVL40:
-	.loc 1 659 0
+	.loc 1 660 0
 	ldr	w6, [x2, x9, lsl 2]
 .LVL41:
-	.loc 1 660 0
+	.loc 1 661 0
 	cmp	w5, w6
 	beq	.L72
-	.loc 1 662 0
+	.loc 1 663 0
 	eor	w8, w5, w6
-	.loc 1 661 0
+	.loc 1 662 0
 	str	w12, [x4, 52]
-	.loc 1 657 0
+	.loc 1 658 0
 	mov	w20, 0
-	.loc 1 663 0
+	.loc 1 664 0
 	tst	x8, 15
 	beq	.L73
-	.loc 1 665 0
+	.loc 1 666 0
 	ldrb	w21, [x7, -8]
-	.loc 1 667 0
+	.loc 1 668 0
 	ubfiz	w20, w6, 8, 8
 	ldr	x23, [x4, 128]
 	add	w20, w20, w5, uxtb
-	.loc 1 673 0
+	.loc 1 674 0
 	ldrb	w22, [x4, 48]
-	.loc 1 666 0
-	lsl	w25, w21, 16
 	.loc 1 667 0
+	lsl	w25, w21, 16
+	.loc 1 668 0
 	add	x20, x23, x20
-	.loc 1 671 0
+	.loc 1 672 0
 	ldrb	w24, [x4, 49]
-	.loc 1 670 0
-	ands	w23, w5, 15
 	.loc 1 671 0
+	ands	w23, w5, 15
+	.loc 1 672 0
 	ccmp	w23, 15, 4, ne
-	.loc 1 669 0
+	.loc 1 670 0
 	add	w21, w21, 1
-	.loc 1 667 0
+	.loc 1 668 0
 	ldrb	w20, [x20, w25, sxtw]
-	.loc 1 669 0
+	.loc 1 670 0
 	and	w21, w21, 255
-	.loc 1 671 0
+	.loc 1 672 0
 	csel	w22, w22, w24, ne
-	.loc 1 667 0
+	.loc 1 668 0
 	and	w20, w20, 3
-	.loc 1 674 0
+	.loc 1 675 0
 	cmp	w22, w21
 	beq	.L143
 .L75:
-	.loc 1 678 0
+	.loc 1 679 0
 	strb	w21, [x7, -8]
 .L73:
-	.loc 1 681 0
+	.loc 1 682 0
 	tst	w8, 240
 	beq	.L76
-	.loc 1 683 0
+	.loc 1 684 0
 	ldrb	w22, [x7, -7]
-	.loc 1 685 0
+	.loc 1 686 0
 	lsr	w21, w6, 4
 	ubfx	x23, x5, 4, 8
 	ubfiz	w21, w21, 8, 8
 	ldr	x24, [x4, 128]
 	add	w21, w21, w23
-	.loc 1 684 0
+	.loc 1 685 0
 	lsl	w27, w22, 16
-	.loc 1 682 0
+	.loc 1 683 0
 	and	w25, w5, 240
-	.loc 1 685 0
+	.loc 1 686 0
 	add	x24, x24, x21
-	.loc 1 687 0
+	.loc 1 688 0
 	add	w21, w22, 1
-	.loc 1 691 0
+	.loc 1 692 0
 	ldrb	w23, [x4, 48]
-	.loc 1 688 0
-	cmp	w25, 240
 	.loc 1 689 0
+	cmp	w25, 240
+	.loc 1 690 0
 	ldrb	w26, [x4, 49]
 	ccmp	w25, 0, 4, ne
-	.loc 1 685 0
+	.loc 1 686 0
 	ldrb	w22, [x24, w27, sxtw]
-	.loc 1 687 0
+	.loc 1 688 0
 	and	w21, w21, 255
-	.loc 1 689 0
+	.loc 1 690 0
 	csel	w23, w23, w26, ne
-	.loc 1 692 0
+	.loc 1 693 0
 	cmp	w23, w21
-	.loc 1 686 0
+	.loc 1 687 0
 	ubfiz	w22, w22, 2, 2
 	orr	w20, w22, w20
-	.loc 1 692 0
+	.loc 1 693 0
 	beq	.L144
 .L78:
-	.loc 1 696 0
+	.loc 1 697 0
 	strb	w21, [x7, -7]
 .L76:
-	.loc 1 699 0
+	.loc 1 700 0
 	tst	w8, 3840
 	beq	.L79
-	.loc 1 701 0
+	.loc 1 702 0
 	ldrb	w21, [x7, -6]
-	.loc 1 703 0
+	.loc 1 704 0
 	and	w23, w6, 65280
 	ldr	x24, [x4, 128]
 	ubfx	x22, x5, 8, 8
 	orr	w22, w22, w23
-	.loc 1 700 0
+	.loc 1 701 0
 	and	w23, w5, 3840
-	.loc 1 702 0
+	.loc 1 703 0
 	lsl	w26, w21, 16
-	.loc 1 707 0
+	.loc 1 708 0
 	ldrb	w25, [x4, 49]
-	.loc 1 703 0
+	.loc 1 704 0
 	add	x22, x24, x22, uxth
-	.loc 1 706 0
+	.loc 1 707 0
 	cmp	w23, 3840
-	.loc 1 709 0
+	.loc 1 710 0
 	ldrb	w24, [x4, 48]
-	.loc 1 707 0
+	.loc 1 708 0
 	ccmp	w23, 0, 4, ne
-	.loc 1 705 0
+	.loc 1 706 0
 	add	w21, w21, 1
-	.loc 1 703 0
+	.loc 1 704 0
 	ldrb	w22, [x22, w26, sxtw]
-	.loc 1 705 0
+	.loc 1 706 0
 	and	w21, w21, 255
-	.loc 1 707 0
+	.loc 1 708 0
 	csel	w24, w24, w25, ne
-	.loc 1 710 0
+	.loc 1 711 0
 	cmp	w24, w21
-	.loc 1 704 0
+	.loc 1 705 0
 	ubfiz	w22, w22, 4, 2
 	orr	w20, w22, w20
-	.loc 1 710 0
+	.loc 1 711 0
 	beq	.L145
 .L81:
-	.loc 1 714 0
+	.loc 1 715 0
 	strb	w21, [x7, -6]
 .L79:
-	.loc 1 717 0
+	.loc 1 718 0
 	tst	w8, 61440
 	beq	.L82
-	.loc 1 719 0
+	.loc 1 720 0
 	ldrb	w22, [x7, -5]
-	.loc 1 721 0
+	.loc 1 722 0
 	lsr	w21, w6, 12
 	ubfx	x23, x5, 12, 8
 	ubfiz	w21, w21, 8, 8
 	ldr	x24, [x4, 128]
 	add	w21, w21, w23
-	.loc 1 720 0
+	.loc 1 721 0
 	lsl	w27, w22, 16
-	.loc 1 718 0
+	.loc 1 719 0
 	and	w25, w5, 61440
-	.loc 1 721 0
+	.loc 1 722 0
 	add	x24, x24, x21
-	.loc 1 723 0
+	.loc 1 724 0
 	add	w21, w22, 1
-	.loc 1 727 0
+	.loc 1 728 0
 	ldrb	w23, [x4, 48]
-	.loc 1 724 0
-	cmp	w25, 61440
 	.loc 1 725 0
+	cmp	w25, 61440
+	.loc 1 726 0
 	ldrb	w26, [x4, 49]
 	ccmp	w25, 0, 4, ne
-	.loc 1 721 0
+	.loc 1 722 0
 	ldrb	w22, [x24, w27, sxtw]
-	.loc 1 723 0
+	.loc 1 724 0
 	and	w21, w21, 255
-	.loc 1 725 0
+	.loc 1 726 0
 	csel	w23, w23, w26, ne
-	.loc 1 728 0
+	.loc 1 729 0
 	cmp	w23, w21
-	.loc 1 722 0
+	.loc 1 723 0
 	ubfiz	w22, w22, 6, 2
 	orr	w20, w22, w20
-	.loc 1 728 0
+	.loc 1 729 0
 	beq	.L146
 .L84:
-	.loc 1 732 0
+	.loc 1 733 0
 	strb	w21, [x7, -5]
 .L82:
-	.loc 1 735 0
+	.loc 1 736 0
 	strb	w20, [x10, -2]
-	.loc 1 738 0
+	.loc 1 739 0
 	tst	w8, 983040
-	.loc 1 737 0
-	mov	w20, 0
 	.loc 1 738 0
+	mov	w20, 0
+	.loc 1 739 0
 	beq	.L85
-	.loc 1 742 0
+	.loc 1 743 0
 	lsr	w20, w6, 16
-	.loc 1 740 0
+	.loc 1 741 0
 	ldrb	w21, [x7, -4]
-	.loc 1 742 0
+	.loc 1 743 0
 	ubfx	x22, x5, 16, 8
 	ubfiz	w20, w20, 8, 8
 	add	w20, w20, w22
 	ldr	x22, [x4, 128]
-	.loc 1 741 0
+	.loc 1 742 0
 	lsl	w25, w21, 16
-	.loc 1 739 0
+	.loc 1 740 0
 	and	w23, w5, 983040
-	.loc 1 742 0
+	.loc 1 743 0
 	add	x20, x22, x20
-	.loc 1 746 0
+	.loc 1 747 0
 	ldrb	w24, [x4, 49]
-	.loc 1 745 0
+	.loc 1 746 0
 	cmp	w23, 983040
-	.loc 1 748 0
+	.loc 1 749 0
 	ldrb	w22, [x4, 48]
-	.loc 1 746 0
+	.loc 1 747 0
 	ccmp	w23, 0, 4, ne
-	.loc 1 744 0
+	.loc 1 745 0
 	add	w21, w21, 1
-	.loc 1 742 0
+	.loc 1 743 0
 	ldrb	w20, [x20, w25, sxtw]
-	.loc 1 744 0
+	.loc 1 745 0
 	and	w21, w21, 255
-	.loc 1 746 0
+	.loc 1 747 0
 	csel	w22, w22, w24, ne
-	.loc 1 742 0
+	.loc 1 743 0
 	and	w20, w20, 3
-	.loc 1 749 0
+	.loc 1 750 0
 	cmp	w22, w21
 	beq	.L147
 .L87:
-	.loc 1 753 0
+	.loc 1 754 0
 	strb	w21, [x7, -4]
 .L85:
-	.loc 1 756 0
+	.loc 1 757 0
 	tst	w8, 15728640
 	beq	.L88
-	.loc 1 758 0
+	.loc 1 759 0
 	ldrb	w22, [x7, -3]
-	.loc 1 760 0
+	.loc 1 761 0
 	lsr	w21, w6, 20
 	ubfx	x23, x5, 20, 8
 	ubfiz	w21, w21, 8, 8
 	ldr	x24, [x4, 128]
 	add	w21, w21, w23
-	.loc 1 759 0
+	.loc 1 760 0
 	lsl	w27, w22, 16
-	.loc 1 757 0
+	.loc 1 758 0
 	and	w25, w5, 15728640
-	.loc 1 760 0
+	.loc 1 761 0
 	add	x24, x24, x21
-	.loc 1 762 0
+	.loc 1 763 0
 	add	w21, w22, 1
-	.loc 1 766 0
+	.loc 1 767 0
 	ldrb	w23, [x4, 48]
-	.loc 1 763 0
-	cmp	w25, 15728640
 	.loc 1 764 0
+	cmp	w25, 15728640
+	.loc 1 765 0
 	ldrb	w26, [x4, 49]
 	ccmp	w25, 0, 4, ne
-	.loc 1 760 0
+	.loc 1 761 0
 	ldrb	w22, [x24, w27, sxtw]
-	.loc 1 762 0
+	.loc 1 763 0
 	and	w21, w21, 255
-	.loc 1 764 0
+	.loc 1 765 0
 	csel	w23, w23, w26, ne
-	.loc 1 767 0
+	.loc 1 768 0
 	cmp	w23, w21
-	.loc 1 761 0
+	.loc 1 762 0
 	ubfiz	w22, w22, 2, 2
 	orr	w20, w22, w20
-	.loc 1 767 0
+	.loc 1 768 0
 	beq	.L148
 .L90:
-	.loc 1 771 0
+	.loc 1 772 0
 	strb	w21, [x7, -3]
 .L88:
-	.loc 1 774 0
+	.loc 1 775 0
 	tst	w8, 251658240
 	beq	.L91
-	.loc 1 776 0
+	.loc 1 777 0
 	ldrb	w21, [x7, -2]
-	.loc 1 778 0
+	.loc 1 779 0
 	lsr	w22, w6, 24
 	lsr	w25, w5, 24
 	mov	w23, w22
 	ldr	x24, [x4, 128]
 	add	w22, w25, w23, lsl 8
-	.loc 1 777 0
+	.loc 1 778 0
 	lsl	w26, w21, 16
-	.loc 1 784 0
+	.loc 1 785 0
 	ldrb	w23, [x4, 48]
-	.loc 1 778 0
+	.loc 1 779 0
 	add	x22, x24, x22
-	.loc 1 782 0
+	.loc 1 783 0
 	ldrb	w25, [x4, 49]
-	.loc 1 781 0
+	.loc 1 782 0
 	ands	w24, w5, 251658240
-	.loc 1 780 0
+	.loc 1 781 0
 	add	w21, w21, 1
-	.loc 1 782 0
+	.loc 1 783 0
 	ccmp	w24, w14, 4, ne
-	.loc 1 780 0
+	.loc 1 781 0
 	and	w21, w21, 255
-	.loc 1 778 0
+	.loc 1 779 0
 	ldrb	w22, [x22, w26, sxtw]
-	.loc 1 782 0
+	.loc 1 783 0
 	csel	w23, w23, w25, ne
-	.loc 1 785 0
+	.loc 1 786 0
 	cmp	w23, w21
-	.loc 1 779 0
+	.loc 1 780 0
 	ubfiz	w22, w22, 4, 2
 	orr	w20, w22, w20
-	.loc 1 785 0
+	.loc 1 786 0
 	beq	.L149
 .L93:
-	.loc 1 789 0
+	.loc 1 790 0
 	strb	w21, [x7, -2]
 .L91:
-	.loc 1 792 0
+	.loc 1 793 0
 	tst	w8, -268435456
 	beq	.L94
-	.loc 1 794 0
+	.loc 1 795 0
 	ldrb	w8, [x7, -1]
 .LVL42:
-	.loc 1 796 0
+	.loc 1 797 0
 	lsr	w22, w5, 28
 	ldr	x23, [x4, 128]
 	lsr	w21, w6, 28
 	add	w21, w22, w21, lsl 8
-	.loc 1 799 0
+	.loc 1 800 0
 	ands	w5, w5, -268435456
 .LVL43:
-	.loc 1 795 0
-	lsl	w24, w8, 16
 	.loc 1 796 0
+	lsl	w24, w8, 16
+	.loc 1 797 0
 	add	x21, x23, x21
-	.loc 1 802 0
+	.loc 1 803 0
 	ldrb	w22, [x4, 48]
-	.loc 1 800 0
+	.loc 1 801 0
 	ccmp	w5, w15, 4, ne
 	ldrb	w23, [x4, 49]
-	.loc 1 798 0
+	.loc 1 799 0
 	add	w8, w8, 1
-	.loc 1 796 0
+	.loc 1 797 0
 	ldrb	w21, [x21, w24, sxtw]
-	.loc 1 798 0
+	.loc 1 799 0
 	and	w8, w8, 255
-	.loc 1 800 0
+	.loc 1 801 0
 	csel	w22, w22, w23, ne
-	.loc 1 803 0
+	.loc 1 804 0
 	cmp	w22, w8
-	.loc 1 797 0
+	.loc 1 798 0
 	ubfiz	w21, w21, 6, 2
 	orr	w20, w21, w20
-	.loc 1 803 0
+	.loc 1 804 0
 	beq	.L150
 .L96:
-	.loc 1 807 0
+	.loc 1 808 0
 	strb	w8, [x7, -1]
 .LVL44:
 .L94:
-	.loc 1 810 0
-	str	w6, [x2, x9, lsl 2]
 	.loc 1 811 0
+	str	w6, [x2, x9, lsl 2]
+	.loc 1 812 0
 	strb	w20, [x10, -1]
 .L97:
 	add	x9, x9, 1
 	add	x10, x10, 2
 	add	x7, x7, 8
-	.loc 1 655 0 discriminator 2
+	.loc 1 656 0 discriminator 2
 	cmp	w11, w9
 	bgt	.L131
 	add	x3, x3, x19
 	add	x2, x2, x16
 	add	x1, x1, x16
 .L70:
-	.loc 1 649 0 discriminator 2
+	.loc 1 650 0 discriminator 2
 	add	w13, w13, 1
 	cmp	w18, w13
 	bne	.L99
 .L66:
-	.loc 1 823 0
+	.loc 1 824 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
@@ -1011,100 +1011,100 @@ get_overlay_image:
 	.p2align 3
 .L149:
 	.cfi_restore_state
-	.loc 1 787 0
+	.loc 1 788 0
 	and	w6, w6, -251658241
 .LVL45:
-	.loc 1 786 0
-	mov	w21, 0
 	.loc 1 787 0
+	mov	w21, 0
+	.loc 1 788 0
 	orr	w6, w24, w6
 .LVL46:
 	b	.L93
 .LVL47:
 	.p2align 3
 .L150:
-	.loc 1 805 0
+	.loc 1 806 0
 	and	w6, w6, 268435455
 .LVL48:
-	.loc 1 804 0
-	mov	w8, 0
 	.loc 1 805 0
+	mov	w8, 0
+	.loc 1 806 0
 	orr	w6, w5, w6
 .LVL49:
 	b	.L96
 .LVL50:
 	.p2align 3
 .L148:
-	.loc 1 769 0
+	.loc 1 770 0
 	and	w6, w6, -15728641
 .LVL51:
-	.loc 1 768 0
-	mov	w21, 0
 	.loc 1 769 0
+	mov	w21, 0
+	.loc 1 770 0
 	orr	w6, w25, w6
 .LVL52:
 	b	.L90
 	.p2align 3
 .L146:
-	.loc 1 730 0
+	.loc 1 731 0
 	and	w6, w6, -61441
 .LVL53:
-	.loc 1 729 0
-	mov	w21, 0
 	.loc 1 730 0
+	mov	w21, 0
+	.loc 1 731 0
 	orr	w6, w25, w6
 .LVL54:
 	b	.L84
 	.p2align 3
 .L147:
-	.loc 1 751 0
+	.loc 1 752 0
 	and	w6, w6, -983041
 .LVL55:
-	.loc 1 750 0
-	mov	w21, 0
 	.loc 1 751 0
+	mov	w21, 0
+	.loc 1 752 0
 	orr	w6, w23, w6
 .LVL56:
 	b	.L87
 	.p2align 3
 .L145:
-	.loc 1 712 0
+	.loc 1 713 0
 	and	w6, w6, -3841
 .LVL57:
-	.loc 1 711 0
-	mov	w21, 0
 	.loc 1 712 0
+	mov	w21, 0
+	.loc 1 713 0
 	orr	w6, w23, w6
 .LVL58:
 	b	.L81
 	.p2align 3
 .L143:
-	.loc 1 676 0
+	.loc 1 677 0
 	bfi	w6, w23, 0, 4
-	.loc 1 675 0
+	.loc 1 676 0
 	mov	w21, 0
 	b	.L75
 	.p2align 3
 .L144:
-	.loc 1 694 0
+	.loc 1 695 0
 	and	w6, w6, -241
 .LVL59:
-	.loc 1 693 0
-	mov	w21, 0
 	.loc 1 694 0
+	mov	w21, 0
+	.loc 1 695 0
 	orr	w6, w25, w6
 .LVL60:
 	b	.L78
 	.p2align 3
 .L72:
-	.loc 1 814 0
-	strb	wzr, [x10, -2]
 	.loc 1 815 0
+	strb	wzr, [x10, -2]
+	.loc 1 816 0
 	strb	wzr, [x10, -1]
 	b	.L97
 	.p2align 3
 .L68:
-	.loc 1 653 0
+	.loc 1 654 0
 	ldr	w10, [x17, 84]
 	mul	w10, w13, w10
 	lsr	w10, w10, 2
@@ -1112,62 +1112,62 @@ get_overlay_image:
 .LVL61:
 	b	.L71
 	.cfi_endproc
-.LFE2812:
+.LFE2813:
 	.size	get_overlay_image, .-get_overlay_image
 	.align	2
 	.p2align 3,,7
 	.type	waveform_open, %function
 waveform_open:
-.LFB2835:
-	.loc 1 2011 0
+.LFB2836:
+	.loc 1 2012 0
 	.cfi_startproc
 .LVL62:
-	.loc 1 2015 0
+	.loc 1 2016 0
 	mov	w0, 0
 .LVL63:
-	.loc 1 2012 0
+	.loc 1 2013 0
 	str	xzr, [x1, 104]
-	.loc 1 2015 0
+	.loc 1 2016 0
 	ret
 	.cfi_endproc
-.LFE2835:
+.LFE2836:
 	.size	waveform_open, .-waveform_open
 	.section	.exit.text,"ax",@progbits
 	.align	2
 	.type	ebc_exit, %function
 ebc_exit:
-.LFB2855:
-	.loc 1 2588 0
+.LFB2856:
+	.loc 1 2591 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2589 0
+	.loc 1 2592 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2588 0
+	.loc 1 2591 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2589 0
+	.loc 1 2592 0
 	bl	platform_driver_unregister
 .LVL64:
-	.loc 1 2590 0
+	.loc 1 2593 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2855:
+.LFE2856:
 	.size	ebc_exit, .-ebc_exit
 	.text
 	.align	2
 	.p2align 3,,7
 	.type	ebc_resume, %function
 ebc_resume:
-.LFB2853:
-	.loc 1 2550 0
+.LFB2854:
+	.loc 1 2553 0
 	.cfi_startproc
 .LVL65:
 	stp	x29, x30, [sp, -32]!
@@ -1178,17 +1178,17 @@ ebc_resume:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-.LBB938:
-.LBB939:
+.LBB934:
+.LBB935:
 	.file 2 "./include/linux/device.h"
 	.loc 2 1181 0
 	ldr	x19, [x0, 184]
-.LBE939:
-.LBE938:
-	.loc 1 2554 0
+.LBE935:
+.LBE934:
+	.loc 1 2557 0
 	ldr	x1, [x19, 16]
-.LBB940:
-.LBB941:
+.LBB936:
+.LBB937:
 	.file 3 "drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic.h"
 	.loc 3 45 0
 	mov	x0, x1
@@ -1196,17 +1196,17 @@ ebc_resume:
 	ldr	x1, [x1, 48]
 	blr	x1
 .LVL67:
-.LBE941:
-.LBE940:
-	.loc 1 2555 0
-	str	wzr, [x19, 796]
-	.loc 1 2556 0
+.LBE937:
+.LBE936:
+	.loc 1 2558 0
+	str	wzr, [x19, 804]
+	.loc 1 2559 0
 	ldr	x0, [x19, 288]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
 .LVL68:
-	.loc 1 2559 0
+	.loc 1 2562 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -1216,85 +1216,85 @@ ebc_resume:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2853:
+.LFE2854:
 	.size	ebc_resume, .-ebc_resume
 	.align	2
 	.p2align 3,,7
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
-.LFB2828:
-	.loc 1 1671 0
+.LFB2829:
+	.loc 1 1672 0
 	.cfi_startproc
 .LVL69:
-	.loc 1 1672 0
+	.loc 1 1673 0
 	adrp	x0, .LANCHOR0
 .LVL70:
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1674 0
+	.loc 1 1675 0
 	ldr	w2, [x0, 624]
 	cbnz	w2, .L165
 	ret
 	.p2align 3
 .L165:
-	.loc 1 1671 0
+	.loc 1 1672 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-.LBB942:
-.LBB943:
+.LBB938:
+.LBB939:
 	.file 4 "./include/linux/wakelock.h"
 	.loc 4 68 0
 	add	x0, x0, 416
-.LBE943:
-.LBE942:
-	.loc 1 1671 0
+.LBE939:
+.LBE938:
+	.loc 1 1672 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1675 0
+	.loc 1 1676 0
 	str	wzr, [x0, 208]
-.LBB945:
-.LBB944:
+.LBB941:
+.LBB940:
 	.loc 4 68 0
 	bl	__pm_relax
 .LVL71:
-.LBE944:
-.LBE945:
-	.loc 1 1680 0
+.LBE940:
+.LBE941:
+	.loc 1 1681 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2828:
+.LFE2829:
 	.size	ebc_vdd_power_timeout, .-ebc_vdd_power_timeout
 	.align	2
 	.p2align 3,,7
 	.type	ebc_remove, %function
 ebc_remove:
-.LFB2851:
-	.loc 1 2526 0
+.LFB2852:
+	.loc 1 2529 0
 	.cfi_startproc
 .LVL72:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2527 0
+	.loc 1 2530 0
 	adrp	x0, .LANCHOR1
 .LVL73:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2526 0
+	.loc 1 2529 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2527 0
+	.loc 1 2530 0
 	add	x0, x0, 224
-	.loc 1 2526 0
-	.loc 1 2527 0
+	.loc 1 2529 0
+	.loc 1 2530 0
 	bl	misc_deregister
 .LVL74:
-	.loc 1 2530 0
+	.loc 1 2533 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -1302,14 +1302,14 @@ ebc_remove:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2851:
+.LFE2852:
 	.size	ebc_remove, .-ebc_remove
 	.align	2
 	.p2align 3,,7
 	.type	ebc_mmap, %function
 ebc_mmap:
-.LFB2832:
-	.loc 1 1957 0
+.LFB2833:
+	.loc 1 1958 0
 	.cfi_startproc
 .LVL75:
 	stp	x29, x30, [sp, -32]!
@@ -1320,33 +1320,33 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1957 0
+	.loc 1 1958 0
 	mov	x19, x1
-	.loc 1 1960 0
+	.loc 1 1961 0
 	bl	ebc_phy_buf_base_get
 .LVL76:
-	.loc 1 1963 0
+	.loc 1 1964 0
 	lsr	x2, x0, 12
-	.loc 1 1961 0
+	.loc 1 1962 0
 	mov	x6, 16384
-	.loc 1 1963 0
+	.loc 1 1964 0
 	mov	x0, x19
-	.loc 1 1961 0
+	.loc 1 1962 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 1963 0
+	.loc 1 1964 0
 	ldp	x1, x3, [x19]
-	.loc 1 1961 0
+	.loc 1 1962 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 1963 0
+	.loc 1 1964 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
 .LVL77:
-	.loc 1 1966 0
+	.loc 1 1967 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 1969 0
+	.loc 1 1970 0
 	ldr	x19, [sp, 16]
 .LVL78:
 	csel	w0, w0, w1, eq
@@ -1357,54 +1357,54 @@ ebc_mmap:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2832:
+.LFE2833:
 	.size	ebc_mmap, .-ebc_mmap
 	.align	2
 	.p2align 3,,7
 	.type	waveform_mmap, %function
 waveform_mmap:
-.LFB2834:
-	.loc 1 1995 0
+.LFB2835:
+	.loc 1 1996 0
 	.cfi_startproc
 .LVL79:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1996 0
+	.loc 1 1997 0
 	adrp	x2, .LANCHOR0
-	.loc 1 2000 0
+	.loc 1 2001 0
 	mov	x7, 16384
-	.loc 1 2002 0
+	.loc 1 2003 0
 	mov	x0, x1
 .LVL80:
-	.loc 1 1995 0
+	.loc 1 1996 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1999 0
-	ldr	x2, [x2, #:lo12:.LANCHOR0]
 	.loc 1 2000 0
+	ldr	x2, [x2, #:lo12:.LANCHOR0]
+	.loc 1 2001 0
 	movk	x7, 0x404, lsl 16
 	ldp	x4, x5, [x1, 72]
-	.loc 1 2002 0
+	.loc 1 2003 0
 	ldp	x6, x3, [x1]
-	.loc 1 2000 0
+	.loc 1 2001 0
 	orr	x5, x5, x7
-	.loc 1 1999 0
-	ldr	x2, [x2, 216]
 	.loc 1 2000 0
+	ldr	x2, [x2, 216]
+	.loc 1 2001 0
 	str	x5, [x1, 80]
-	.loc 1 2002 0
+	.loc 1 2003 0
 	sub	x3, x3, x6
 	mov	x1, x6
 .LVL81:
 	lsr	x2, x2, 12
 	bl	remap_pfn_range
 .LVL82:
-	.loc 1 2005 0
+	.loc 1 2006 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 2008 0
+	.loc 1 2009 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1412,23 +1412,23 @@ waveform_mmap:
 	csel	w0, w0, w1, eq
 	ret
 	.cfi_endproc
-.LFE2834:
+.LFE2835:
 	.size	waveform_mmap, .-waveform_mmap
 	.align	2
 	.p2align 3,,7
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
-.LFB2831:
-	.loc 1 1756 0
+.LFB2832:
+	.loc 1 1757 0
 	.cfi_startproc
 .LVL83:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 1766 0
+	.loc 1 1767 0
 	cmp	w1, 28672
-	.loc 1 1756 0
+	.loc 1 1757 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -1442,15 +1442,15 @@ ebc_io_ctl:
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
 	.cfi_offset 23, -112
-	.loc 1 1756 0
+	.loc 1 1757 0
 	mov	x21, x2
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 1758 0
+	.loc 1 1759 0
 	adrp	x0, .LANCHOR0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1766 0
+	.loc 1 1767 0
 	bcc	.L177
 	mov	w0, 28675
 	cmp	w1, w0
@@ -1460,7 +1460,7 @@ ebc_io_ctl:
 	cmp	w0, 1
 	bls	.L178
 .L177:
-	.loc 1 1782 0
+	.loc 1 1783 0
 	mov	w0, 28677
 	cmp	w1, w0
 	beq	.L181
@@ -1476,13 +1476,13 @@ ebc_io_ctl:
 	mov	w0, 28683
 	cmp	w1, w0
 	bne	.L180
-	.loc 1 1934 0
+	.loc 1 1935 0
 	bl	ebc_empty_buf_get
 .LVL85:
 	mov	x23, x0
-	.loc 1 1935 0
+	.loc 1 1936 0
 	cbz	x0, .L201
-	.loc 1 1937 0
+	.loc 1 1938 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 408]
@@ -1493,18 +1493,18 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL86:
-	.loc 1 1938 0
+	.loc 1 1939 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL87:
 	sub	w0, w20, w0
+.LBB942:
+.LBB943:
+.LBB944:
+.LBB945:
 .LBB946:
 .LBB947:
 .LBB948:
-.LBB949:
-.LBB950:
-.LBB951:
-.LBB952:
 	.file 5 "./arch/arm64/include/asm/current.h"
 	.loc 5 19 0
 #APP
@@ -1513,27 +1513,27 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL88:
 #NO_APP
-.LBE952:
-.LBE951:
+.LBE948:
+.LBE947:
 	.file 6 "./arch/arm64/include/asm/uaccess.h"
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE950:
-.LBE949:
-.LBE948:
-.LBE947:
 .LBE946:
-	.loc 1 1940 0
+.LBE945:
+.LBE944:
+.LBE943:
+.LBE942:
+	.loc 1 1941 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 1939 0
+	.loc 1 1940 0
 	str	w0, [x29, 104]
-	.loc 1 1941 0
+	.loc 1 1942 0
 	stp	w4, w1, [x29, 112]
-.LBB977:
-.LBB974:
-.LBB971:
-.LBB961:
-.LBB959:
+.LBB973:
+.LBB970:
+.LBB967:
+.LBB957:
+.LBB955:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL89:
@@ -1541,47 +1541,47 @@ ebc_io_ctl:
 	tbnz	x3, 21, .L238
 .LVL90:
 .L304:
-.LBB953:
-.LBB954:
-.LBB955:
+.LBB949:
+.LBB950:
+.LBB951:
 	.file 7 "./include/asm-generic/bitops/non-atomic.h"
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL91:
+.LBE951:
+.LBE950:
+.LBE949:
 .LBE955:
-.LBE954:
-.LBE953:
-.LBE959:
-.LBE961:
-.LBE971:
-.LBE974:
-.LBE977:
-	.loc 1 1757 0
+.LBE957:
+.LBE967:
+.LBE970:
+.LBE973:
+	.loc 1 1758 0
 	mov	x0, x21
 .LVL92:
-.LBB978:
-.LBB975:
-.LBB972:
-.LBB962:
-.LBB960:
+.LBB974:
+.LBB971:
+.LBB968:
+.LBB958:
+.LBB956:
 	.loc 6 84 0
 	tbz	x2, 26, .L239
 .LVL93:
 .L238:
-.LBB956:
-.LBB957:
-.LBB958:
+.LBB952:
+.LBB953:
+.LBB954:
 	.file 8 "./include/linux/bitops.h"
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL94:
-.LBE958:
-.LBE957:
+.LBE954:
+.LBE953:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL95:
 .L239:
-.LBE956:
+.LBE952:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1594,46 +1594,46 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL96:
 #NO_APP
-.LBE960:
-.LBE962:
+.LBE956:
+.LBE958:
 	.file 9 "./include/linux/uaccess.h"
 	.loc 9 132 0
 	mov	x22, 44
 	cbnz	x0, .L312
 .L240:
-.LBE972:
-.LBE975:
-.LBE978:
-	.loc 1 1943 0
+.LBE968:
+.LBE971:
+.LBE974:
+	.loc 1 1944 0
 	mov	x0, x23
 .LVL97:
 	bl	ebc_buf_release
 .LVL98:
-	.loc 1 1944 0
+	.loc 1 1945 0
 	b	.L176
 .LVL99:
 	.p2align 3
 .L178:
-	.loc 1 1773 0
-	cbnz	x21, .L177
 	.loc 1 1774 0
+	cbnz	x21, .L177
+	.loc 1 1775 0
 	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
 .LVL100:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC1
-	.loc 1 1775 0
+	.loc 1 1776 0
 	mov	x22, -14
-	.loc 1 1774 0
+	.loc 1 1775 0
 	bl	_dev_err
 .LVL101:
-	.loc 1 1775 0
+	.loc 1 1776 0
 	b	.L176
 .LVL102:
 	.p2align 3
 .L310:
-	.loc 1 1782 0
+	.loc 1 1783 0
 	mov	w0, 28674
 	cmp	w1, w0
 	beq	.L183
@@ -1644,23 +1644,23 @@ ebc_io_ctl:
 	mov	w0, 28676
 	cmp	w1, w0
 	bne	.L180
-	.loc 1 1866 0
+	.loc 1 1867 0
 	ldr	x0, [x20, 288]
-	.loc 1 1865 0
-	mov	w2, 1
-	str	w2, [x20, 804]
 	.loc 1 1866 0
+	mov	w2, 1
+	str	w2, [x20, 812]
+	.loc 1 1867 0
 	adrp	x1, .LC2
 .LVL103:
-	.loc 1 1867 0
+	.loc 1 1868 0
 	mov	x22, 0
-	.loc 1 1866 0
+	.loc 1 1867 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
 .LVL104:
 	.p2align 2
 .L176:
-	.loc 1 1954 0
+	.loc 1 1955 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
 .LVL105:
@@ -1688,19 +1688,19 @@ ebc_io_ctl:
 	.p2align 3
 .L313:
 	.cfi_restore_state
-	.loc 1 1782 0
+	.loc 1 1783 0
 	cmp	w1, 28672
 	beq	.L185
 	mov	w0, 28673
 	cmp	w1, w0
 	bne	.L180
+.LBB975:
+.LBB976:
+.LBB977:
+.LBB978:
 .LBB979:
 .LBB980:
 .LBB981:
-.LBB982:
-.LBB983:
-.LBB984:
-.LBB985:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1708,8 +1708,8 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL109:
 #NO_APP
-.LBE985:
-.LBE984:
+.LBE981:
+.LBE980:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
@@ -1719,19 +1719,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L315
 .LVL111:
 .L206:
-.LBB986:
-.LBB987:
-.LBB988:
+.LBB982:
+.LBB983:
+.LBB984:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL112:
-.LBE988:
-.LBE987:
+.LBE984:
+.LBE983:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL113:
 .L207:
-.LBE986:
+.LBE982:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1744,23 +1744,23 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL114:
 #NO_APP
-.LBE983:
-.LBE982:
+.LBE979:
+.LBE978:
 	.loc 9 114 0
 	cbz	x0, .L209
+.LBB990:
+.LBB991:
+.LBB992:
+.LBB993:
 .LBB994:
-.LBB995:
-.LBB996:
-.LBB997:
-.LBB998:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL115:
-.LBE998:
-.LBE997:
-.LBE996:
-.LBB999:
-.LBB1000:
+.LBE994:
+.LBE993:
+.LBE992:
+.LBB995:
+.LBB996:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1768,13 +1768,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL116:
 #NO_APP
-.LBE1000:
-.LBE999:
-.LBB1001:
+.LBE996:
+.LBE995:
+.LBB997:
 	.loc 6 254 0
 	and	x0, x0, x21
 .LVL117:
-.LBE1001:
+.LBE997:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1789,8 +1789,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE995:
-.LBE994:
+.LBE991:
+.LBE990:
 	.loc 9 116 0
 	mov	x2, 44
 	add	x0, x29, 104
@@ -1799,75 +1799,75 @@ ebc_io_ctl:
 .LVL120:
 	.loc 9 118 0
 	cbnz	x0, .L209
-.LBE981:
-.LBE980:
-.LBE979:
-	.loc 1 1820 0
+.LBE977:
+.LBE976:
+.LBE975:
+	.loc 1 1821 0
 	bl	ebc_phy_buf_base_get
 .LVL121:
 	ldrsw	x1, [x29, 104]
-	.loc 1 1821 0
+	.loc 1 1822 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
 .LVL122:
 	mov	x21, x0
 .LVL123:
-	.loc 1 1822 0
-	cbz	x0, .L216
 	.loc 1 1823 0
+	cbz	x0, .L216
+	.loc 1 1824 0
 	ldr	w5, [x29, 108]
-	.loc 1 1832 0
+	.loc 1 1833 0
 	add	x20, x20, 184
-	.loc 1 1827 0
+	.loc 1 1828 0
 	ldp	w4, w2, [x29, 124]
-	.loc 1 1823 0
+	.loc 1 1824 0
 	str	w5, [x21, 40]
-	.loc 1 1828 0
+	.loc 1 1829 0
 	ldp	w3, w1, [x29, 132]
-	.loc 1 1827 0
-	stp	w4, w2, [x21, 48]
 	.loc 1 1828 0
+	stp	w4, w2, [x21, 48]
+	.loc 1 1829 0
 	stp	w3, w1, [x21, 56]
-	.loc 1 1830 0
+	.loc 1 1831 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL124:
-	.loc 1 1832 0
+	.loc 1 1833 0
 	ldr	w0, [x20, 96]
 	cbz	w0, .L316
 .L211:
-	.loc 1 1836 0
+	.loc 1 1837 0
 	ldr	w0, [x21, 40]
 	cmp	w0, 18
 	beq	.L317
-	.loc 1 1836 0 is_stmt 0 discriminator 3
+	.loc 1 1837 0 is_stmt 0 discriminator 3
 	cmp	w0, 20
 	bne	.L216
 .L213:
-	.loc 1 1837 0 is_stmt 1
+	.loc 1 1838 0 is_stmt 1
 	mov	w0, 1
 	str	w0, [x20, 204]
-.LBB1008:
-.LBB1009:
-	.loc 1 1838 0
+.LBB1004:
+.LBB1005:
+	.loc 1 1839 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
 .LVL125:
 	adrp	x0, .LANCHOR1
-.LBB1010:
+.LBB1006:
 	add	x0, x0, :lo12:.LANCHOR1
 	add	x21, x0, 328
 	b	.L217
 	.p2align 3
 .L318:
 .LVL126:
-	.loc 1 1838 0 is_stmt 0 discriminator 5
+	.loc 1 1839 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L216
-	.loc 1 1838 0 discriminator 7
+	.loc 1 1839 0 discriminator 7
 	bl	schedule
 .LVL127:
 .L217:
-	.loc 1 1838 0 discriminator 9
+	.loc 1 1839 0 discriminator 9
 	add	x1, x29, 64
 	mov	w2, 1
 	mov	x0, x21
@@ -1875,8 +1875,8 @@ ebc_io_ctl:
 .LVL128:
 	ldr	w1, [x20, 204]
 	cbnz	w1, .L318
-.LBE1010:
-	.loc 1 1838 0 discriminator 4
+.LBE1006:
+	.loc 1 1839 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
 	bl	finish_wait
@@ -1888,15 +1888,15 @@ ebc_io_ctl:
 .LVL130:
 	.p2align 3
 .L193:
-.LBE1009:
-.LBE1008:
-	.loc 1 1921 0 is_stmt 1
+.LBE1005:
+.LBE1004:
+	.loc 1 1922 0 is_stmt 1
 	bl	ebc_empty_buf_get
 .LVL131:
 	mov	x23, x0
-	.loc 1 1922 0
+	.loc 1 1923 0
 	cbz	x0, .L201
-	.loc 1 1924 0
+	.loc 1 1925 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 344]
@@ -1906,20 +1906,20 @@ ebc_io_ctl:
 .LVL132:
 	.p2align 3
 .L311:
-	.loc 1 1782 0
+	.loc 1 1783 0
 	mov	w0, 28678
 	cmp	w1, w0
 	beq	.L191
 	mov	w0, 28679
 	cmp	w1, w0
 	bne	.L180
+.LBB1010:
+.LBB1011:
+.LBB1012:
+.LBB1013:
 .LBB1014:
 .LBB1015:
 .LBB1016:
-.LBB1017:
-.LBB1018:
-.LBB1019:
-.LBB1020:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1927,8 +1927,8 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL133:
 #NO_APP
-.LBE1020:
-.LBE1019:
+.LBE1016:
+.LBE1015:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
@@ -1938,19 +1938,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L319
 .LVL135:
 .L218:
-.LBB1021:
-.LBB1022:
-.LBB1023:
+.LBB1017:
+.LBB1018:
+.LBB1019:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL136:
-.LBE1023:
-.LBE1022:
+.LBE1019:
+.LBE1018:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL137:
 .L219:
-.LBE1021:
+.LBE1017:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1963,23 +1963,23 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL138:
 #NO_APP
-.LBE1018:
-.LBE1017:
+.LBE1014:
+.LBE1013:
 	.loc 9 114 0
 	cbz	x0, .L209
+.LBB1025:
+.LBB1026:
+.LBB1027:
+.LBB1028:
 .LBB1029:
-.LBB1030:
-.LBB1031:
-.LBB1032:
-.LBB1033:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL139:
-.LBE1033:
-.LBE1032:
-.LBE1031:
-.LBB1034:
-.LBB1035:
+.LBE1029:
+.LBE1028:
+.LBE1027:
+.LBB1030:
+.LBB1031:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1987,13 +1987,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL140:
 #NO_APP
-.LBE1035:
-.LBE1034:
-.LBB1036:
+.LBE1031:
+.LBE1030:
+.LBB1032:
 	.loc 6 254 0
 	and	x0, x0, x21
 .LVL141:
-.LBE1036:
+.LBE1032:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -2008,8 +2008,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1030:
-.LBE1029:
+.LBE1026:
+.LBE1025:
 	.loc 9 116 0
 	mov	x2, 44
 	add	x0, x29, 104
@@ -2018,39 +2018,39 @@ ebc_io_ctl:
 .LVL144:
 	.loc 9 118 0
 	cbnz	x0, .L209
-.LBE1016:
-.LBE1015:
-.LBE1014:
-	.loc 1 1847 0
+.LBE1012:
+.LBE1011:
+.LBE1010:
+	.loc 1 1848 0
 	bl	ebc_osd_buf_clone
 .LVL145:
 	mov	x1, x0
-	.loc 1 1848 0
-	cbz	x0, .L216
 	.loc 1 1849 0
+	cbz	x0, .L216
+	.loc 1 1850 0
 	ldr	w6, [x29, 108]
-	.loc 1 1858 0
+	.loc 1 1859 0
 	add	x20, x20, 184
-	.loc 1 1853 0
+	.loc 1 1854 0
 	ldp	w5, w3, [x29, 124]
-	.loc 1 1849 0
+	.loc 1 1850 0
 	str	w6, [x1, 40]
-	.loc 1 1854 0
+	.loc 1 1855 0
 	ldp	w4, w2, [x29, 132]
-	.loc 1 1853 0
-	stp	w5, w3, [x1, 48]
 	.loc 1 1854 0
+	stp	w5, w3, [x1, 48]
+	.loc 1 1855 0
 	stp	w4, w2, [x1, 56]
-	.loc 1 1856 0
+	.loc 1 1857 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL146:
-	.loc 1 1858 0
+	.loc 1 1859 0
 	ldr	w0, [x20, 96]
 	cbnz	w0, .L216
-	.loc 1 1859 0
+	.loc 1 1860 0
 	mov	w2, 1
 	str	w2, [x20, 96]
-	.loc 1 1860 0
+	.loc 1 1861 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -2062,22 +2062,22 @@ ebc_io_ctl:
 .LVL148:
 	.p2align 3
 .L312:
-.LBB1043:
-.LBB976:
-.LBB973:
+.LBB1039:
+.LBB972:
+.LBB969:
+.LBB959:
+.LBB960:
+.LBB961:
+.LBB962:
 .LBB963:
-.LBB964:
-.LBB965:
-.LBB966:
-.LBB967:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL149:
-.LBE967:
-.LBE966:
-.LBE965:
-.LBB968:
-.LBB969:
+.LBE963:
+.LBE962:
+.LBE961:
+.LBB964:
+.LBB965:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2085,13 +2085,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL150:
 #NO_APP
-.LBE969:
-.LBE968:
-.LBB970:
+.LBE965:
+.LBE964:
+.LBB966:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL151:
-.LBE970:
+.LBE966:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL152:
@@ -2107,8 +2107,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE964:
-.LBE963:
+.LBE960:
+.LBE959:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
@@ -2120,25 +2120,25 @@ ebc_io_ctl:
 .LVL156:
 	.p2align 3
 .L191:
-.LBE973:
-.LBE976:
-.LBE1043:
-	.loc 1 1784 0
+.LBE969:
+.LBE972:
+.LBE1039:
+	.loc 1 1785 0
 	bl	ebc_osd_buf_get
 .LVL157:
-	.loc 1 1785 0
+	.loc 1 1786 0
 	cbz	x0, .L201
-	.loc 1 1788 0
+	.loc 1 1789 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL158:
+.LBB1040:
+.LBB1041:
+.LBB1042:
+.LBB1043:
 .LBB1044:
 .LBB1045:
 .LBB1046:
-.LBB1047:
-.LBB1048:
-.LBB1049:
-.LBB1050:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2146,32 +2146,32 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL159:
 #NO_APP
-.LBE1050:
-.LBE1049:
-	.loc 6 85 0
-	ldr	w3, [x2, 52]
-.LBE1048:
-.LBE1047:
 .LBE1046:
 .LBE1045:
+	.loc 6 85 0
+	ldr	w3, [x2, 52]
 .LBE1044:
-	.loc 1 1788 0
+.LBE1043:
+.LBE1042:
+.LBE1041:
+.LBE1040:
+	.loc 1 1789 0
 	sub	w0, w22, w0
-	.loc 1 1793 0
+	.loc 1 1794 0
 	ldr	w1, [x20, 176]
-	.loc 1 1792 0
+	.loc 1 1793 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1791 0
+	.loc 1 1792 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1793 0
+	.loc 1 1794 0
 	str	w1, [x29, 120]
-	.loc 1 1790 0
+	.loc 1 1791 0
 	str	w0, [x29, 104]
-.LBB1077:
-.LBB1074:
-.LBB1071:
-.LBB1060:
-.LBB1057:
+.LBB1073:
+.LBB1070:
+.LBB1067:
+.LBB1056:
+.LBB1053:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL160:
@@ -2179,19 +2179,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L320
 .LVL161:
 .L197:
-.LBB1051:
-.LBB1052:
-.LBB1053:
+.LBB1047:
+.LBB1048:
+.LBB1049:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL162:
-.LBE1053:
-.LBE1052:
+.LBE1049:
+.LBE1048:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL163:
 .L198:
-.LBE1051:
+.LBE1047:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2204,24 +2204,24 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL164:
 #NO_APP
-.LBE1057:
-.LBE1060:
+.LBE1053:
+.LBE1056:
 	.loc 9 132 0
 	mov	x22, 44
 	cbz	x0, .L176
+.LBB1057:
+.LBB1058:
+.LBB1059:
+.LBB1060:
 .LBB1061:
-.LBB1062:
-.LBB1063:
-.LBB1064:
-.LBB1065:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL165:
-.LBE1065:
-.LBE1064:
-.LBE1063:
-.LBB1066:
-.LBB1067:
+.LBE1061:
+.LBE1060:
+.LBE1059:
+.LBB1062:
+.LBB1063:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2229,13 +2229,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL166:
 #NO_APP
-.LBE1067:
-.LBE1066:
-.LBB1068:
+.LBE1063:
+.LBE1062:
+.LBB1064:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL167:
-.LBE1068:
+.LBE1064:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL168:
@@ -2251,8 +2251,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1062:
-.LBE1061:
+.LBE1058:
+.LBE1057:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
@@ -2264,16 +2264,16 @@ ebc_io_ctl:
 .LVL172:
 	.p2align 3
 .L187:
-.LBE1071:
-.LBE1074:
-.LBE1077:
+.LBE1067:
+.LBE1070:
+.LBE1073:
+.LBB1074:
+.LBB1075:
+.LBB1076:
+.LBB1077:
 .LBB1078:
 .LBB1079:
 .LBB1080:
-.LBB1081:
-.LBB1082:
-.LBB1083:
-.LBB1084:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2281,22 +2281,22 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL173:
 #NO_APP
-.LBE1084:
-.LBE1083:
-	.loc 6 85 0
-	ldr	w2, [x0, 52]
-.LBE1082:
-.LBE1081:
 .LBE1080:
 .LBE1079:
+	.loc 6 85 0
+	ldr	w2, [x0, 52]
 .LBE1078:
-	.loc 1 1874 0
+.LBE1077:
+.LBE1076:
+.LBE1075:
+.LBE1074:
+	.loc 1 1875 0
 	add	x22, x20, 248
-.LBB1113:
 .LBB1109:
 .LBB1105:
-.LBB1094:
-.LBB1091:
+.LBB1101:
+.LBB1090:
+.LBB1087:
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
 .LVL174:
@@ -2304,19 +2304,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L321
 .LVL175:
 .L221:
-.LBB1085:
-.LBB1086:
-.LBB1087:
+.LBB1081:
+.LBB1082:
+.LBB1083:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL176:
-.LBE1087:
-.LBE1086:
+.LBE1083:
+.LBE1082:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL177:
 .L222:
-.LBE1085:
+.LBE1081:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2330,22 +2330,22 @@ ebc_io_ctl:
 .LVL178:
 #NO_APP
 	mov	x3, x0
-.LBE1091:
-.LBE1094:
+.LBE1087:
+.LBE1090:
 	.loc 9 114 0
 	cbz	x0, .L250
+.LBB1091:
+.LBB1092:
+.LBB1093:
+.LBB1094:
 .LBB1095:
-.LBB1096:
-.LBB1097:
-.LBB1098:
-.LBB1099:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LBE1099:
-.LBE1098:
-.LBE1097:
-.LBB1100:
-.LBB1101:
+.LBE1095:
+.LBE1094:
+.LBE1093:
+.LBB1096:
+.LBB1097:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2353,13 +2353,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL179:
 #NO_APP
-.LBE1101:
-.LBE1100:
-.LBB1102:
+.LBE1097:
+.LBE1096:
+.LBB1098:
 	.loc 6 254 0
 	and	x0, x0, x21
 .LVL180:
-.LBE1102:
+.LBE1098:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -2374,8 +2374,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1096:
-.LBE1095:
+.LBE1092:
+.LBE1091:
 	.loc 9 116 0
 	mov	x2, 4
 	mov	x0, x22
@@ -2384,52 +2384,52 @@ ebc_io_ctl:
 .LVL183:
 	.loc 9 118 0
 	cbnz	x0, .L322
+.LBE1101:
 .LBE1105:
 .LBE1109:
-.LBE1113:
-	.loc 1 1878 0
+	.loc 1 1879 0
 	add	x20, x20, 184
 	ldr	w2, [x20, 64]
 	ldr	x0, [x20, 104]
 .LVL184:
-	.loc 1 1879 0
+	.loc 1 1880 0
 	mov	x22, 0
-	.loc 1 1878 0
+	.loc 1 1879 0
 	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	_dev_info
 .LVL185:
-	.loc 1 1879 0
+	.loc 1 1880 0
 	b	.L176
 .LVL186:
 	.p2align 3
 .L181:
-	.loc 1 1871 0
+	.loc 1 1872 0
 	ldr	x0, [x20, 288]
 	adrp	x1, .LC3
 .LVL187:
-	.loc 1 1869 0
-	str	wzr, [x20, 804]
-	.loc 1 1872 0
-	mov	x22, 0
 	.loc 1 1870 0
-	str	wzr, [x20, 808]
+	str	wzr, [x20, 812]
+	.loc 1 1873 0
+	mov	x22, 0
 	.loc 1 1871 0
+	str	wzr, [x20, 816]
+	.loc 1 1872 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
 .LVL188:
-	.loc 1 1872 0
+	.loc 1 1873 0
 	b	.L176
 .LVL189:
 	.p2align 3
 .L189:
-	.loc 1 1908 0
+	.loc 1 1909 0
 	bl	ebc_empty_buf_get
 .LVL190:
 	mov	x23, x0
-	.loc 1 1909 0
+	.loc 1 1910 0
 	cbz	x0, .L201
-	.loc 1 1911 0
+	.loc 1 1912 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 336]
@@ -2439,13 +2439,13 @@ ebc_io_ctl:
 .LVL191:
 	.p2align 3
 .L194:
-	.loc 1 1895 0
+	.loc 1 1896 0
 	bl	ebc_empty_buf_get
 .LVL192:
 	mov	x23, x0
-	.loc 1 1896 0
+	.loc 1 1897 0
 	cbz	x0, .L201
-	.loc 1 1898 0
+	.loc 1 1899 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 328]
@@ -2454,18 +2454,18 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL193:
-	.loc 1 1899 0
+	.loc 1 1900 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL194:
 	sub	w0, w20, w0
+.LBB1110:
+.LBB1111:
+.LBB1112:
+.LBB1113:
 .LBB1114:
 .LBB1115:
 .LBB1116:
-.LBB1117:
-.LBB1118:
-.LBB1119:
-.LBB1120:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2473,26 +2473,26 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL195:
 #NO_APP
-.LBE1120:
-.LBE1119:
-	.loc 6 85 0
-	ldr	w3, [x2, 52]
-.LBE1118:
-.LBE1117:
 .LBE1116:
 .LBE1115:
+	.loc 6 85 0
+	ldr	w3, [x2, 52]
 .LBE1114:
-	.loc 1 1902 0
+.LBE1113:
+.LBE1112:
+.LBE1111:
+.LBE1110:
+	.loc 1 1903 0
 	ldp	w4, w1, [x22, 84]
-	.loc 1 1900 0
-	str	w0, [x29, 104]
 	.loc 1 1901 0
+	str	w0, [x29, 104]
+	.loc 1 1902 0
 	stp	w1, w4, [x29, 112]
-.LBB1125:
-.LBB1124:
-.LBB1123:
-.LBB1122:
 .LBB1121:
+.LBB1120:
+.LBB1119:
+.LBB1118:
+.LBB1117:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL196:
@@ -2502,18 +2502,18 @@ ebc_io_ctl:
 .LVL197:
 	.p2align 3
 .L183:
+.LBE1117:
+.LBE1118:
+.LBE1119:
+.LBE1120:
 .LBE1121:
-.LBE1122:
-.LBE1123:
-.LBE1124:
-.LBE1125:
+.LBB1122:
+.LBB1123:
+.LBB1124:
+.LBB1125:
 .LBB1126:
 .LBB1127:
 .LBB1128:
-.LBB1129:
-.LBB1130:
-.LBB1131:
-.LBB1132:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2521,31 +2521,31 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL198:
 #NO_APP
-.LBE1132:
-.LBE1131:
-	.loc 6 85 0
-	ldr	w3, [x2, 52]
-.LBE1130:
-.LBE1129:
 .LBE1128:
 .LBE1127:
+	.loc 6 85 0
+	ldr	w3, [x2, 52]
 .LBE1126:
-	.loc 1 1885 0
+.LBE1125:
+.LBE1124:
+.LBE1123:
+.LBE1122:
+	.loc 1 1886 0
 	ldp	w1, w0, [x20, 116]
 .LVL199:
 	stp	w1, w0, [x29, 140]
-	.loc 1 1882 0
+	.loc 1 1883 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 1881 0
+	.loc 1 1882 0
 	stp	w5, w6, [x29, 112]
-	.loc 1 1883 0
+	.loc 1 1884 0
 	ldr	w4, [x20, 176]
 	str	w4, [x29, 120]
-.LBB1161:
 .LBB1157:
 .LBB1153:
-.LBB1142:
-.LBB1139:
+.LBB1149:
+.LBB1138:
+.LBB1135:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL200:
@@ -2553,19 +2553,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L323
 .LVL201:
 .L225:
-.LBB1133:
-.LBB1134:
-.LBB1135:
+.LBB1129:
+.LBB1130:
+.LBB1131:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL202:
-.LBE1135:
-.LBE1134:
+.LBE1131:
+.LBE1130:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL203:
 .L226:
-.LBE1133:
+.LBE1129:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2578,64 +2578,64 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL204:
 #NO_APP
-.LBE1139:
-.LBE1142:
+.LBE1135:
+.LBE1138:
 	.loc 9 132 0
 	cbnz	x0, .L227
 .L228:
+.LBE1149:
 .LBE1153:
 .LBE1157:
-.LBE1161:
-	.loc 1 1888 0
+	.loc 1 1889 0
 	ldr	x0, [x20, 288]
 .LVL205:
 	adrp	x1, .LC5
 .LVL206:
-	.loc 1 1889 0
+	.loc 1 1890 0
 	mov	x22, -14
-	.loc 1 1888 0
+	.loc 1 1889 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
 .LVL207:
-	.loc 1 1889 0
+	.loc 1 1890 0
 	b	.L176
 .LVL208:
 	.p2align 3
 .L180:
-	.loc 1 1949 0
+	.loc 1 1950 0
 	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
 .LVL209:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
-	.loc 1 1950 0
+	.loc 1 1951 0
 	mov	x22, 0
-	.loc 1 1949 0
+	.loc 1 1950 0
 	bl	_dev_err
 .LVL210:
-	.loc 1 1953 0
+	.loc 1 1954 0
 	b	.L176
 .LVL211:
 	.p2align 3
 .L185:
-	.loc 1 1798 0
+	.loc 1 1799 0
 	bl	ebc_empty_buf_get
 .LVL212:
 	mov	x23, x0
-	.loc 1 1799 0
+	.loc 1 1800 0
 	cbz	x0, .L201
-	.loc 1 1802 0
+	.loc 1 1803 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL213:
+.LBB1158:
+.LBB1159:
+.LBB1160:
+.LBB1161:
 .LBB1162:
 .LBB1163:
 .LBB1164:
-.LBB1165:
-.LBB1166:
-.LBB1167:
-.LBB1168:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2643,32 +2643,32 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL214:
 #NO_APP
-.LBE1168:
-.LBE1167:
-	.loc 6 85 0
-	ldr	w3, [x2, 52]
-.LBE1166:
-.LBE1165:
 .LBE1164:
 .LBE1163:
+	.loc 6 85 0
+	ldr	w3, [x2, 52]
 .LBE1162:
-	.loc 1 1802 0
+.LBE1161:
+.LBE1160:
+.LBE1159:
+.LBE1158:
+	.loc 1 1803 0
 	sub	w0, w22, w0
-	.loc 1 1807 0
+	.loc 1 1808 0
 	ldr	w1, [x20, 176]
-	.loc 1 1806 0
+	.loc 1 1807 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1805 0
+	.loc 1 1806 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1807 0
+	.loc 1 1808 0
 	str	w1, [x29, 120]
-	.loc 1 1804 0
+	.loc 1 1805 0
 	str	w0, [x29, 104]
-.LBB1197:
 .LBB1193:
 .LBB1189:
-.LBB1178:
-.LBB1175:
+.LBB1185:
+.LBB1174:
+.LBB1171:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL215:
@@ -2676,19 +2676,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L324
 .LVL216:
 .L202:
-.LBB1169:
-.LBB1170:
-.LBB1171:
+.LBB1165:
+.LBB1166:
+.LBB1167:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL217:
-.LBE1171:
-.LBE1170:
+.LBE1167:
+.LBE1166:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL218:
 .L203:
-.LBE1169:
+.LBE1165:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2701,268 +2701,268 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL219:
 #NO_APP
-.LBE1175:
-.LBE1178:
+.LBE1171:
+.LBE1174:
 	.loc 9 132 0
 	cbnz	x0, .L204
 .L205:
+.LBE1185:
 .LBE1189:
 .LBE1193:
-.LBE1197:
-	.loc 1 1811 0
+	.loc 1 1812 0
 	mov	x0, x23
 .LVL220:
-	.loc 1 1812 0
+	.loc 1 1813 0
 	mov	x22, -14
-	.loc 1 1811 0
+	.loc 1 1812 0
 	bl	ebc_buf_release
 .LVL221:
-	.loc 1 1812 0
+	.loc 1 1813 0
 	b	.L176
 .LVL222:
 	.p2align 3
 .L319:
-.LBB1198:
-.LBB1041:
-.LBB1039:
+.LBB1194:
 .LBB1037:
-.LBB1027:
-.LBB1024:
-.LBB1025:
-.LBB1026:
+.LBB1035:
+.LBB1033:
+.LBB1023:
+.LBB1020:
+.LBB1021:
+.LBB1022:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1026:
-.LBE1025:
-.LBE1024:
-.LBE1027:
+.LBE1022:
+.LBE1021:
+.LBE1020:
+.LBE1023:
+.LBE1033:
+.LBE1035:
 .LBE1037:
-.LBE1039:
-.LBE1041:
-.LBE1198:
-	.loc 1 1757 0
+.LBE1194:
+	.loc 1 1758 0
 	mov	x0, x21
 .LVL223:
-.LBB1199:
-.LBB1042:
-.LBB1040:
+.LBB1195:
 .LBB1038:
-.LBB1028:
+.LBB1036:
+.LBB1034:
+.LBB1024:
 	.loc 6 84 0
 	tbz	x2, 26, .L219
 	b	.L218
 .LVL224:
 	.p2align 3
 .L315:
-.LBE1028:
+.LBE1024:
+.LBE1034:
+.LBE1036:
 .LBE1038:
-.LBE1040:
-.LBE1042:
-.LBE1199:
-.LBB1200:
-.LBB1006:
-.LBB1004:
+.LBE1195:
+.LBB1196:
 .LBB1002:
-.LBB992:
-.LBB989:
-.LBB990:
-.LBB991:
+.LBB1000:
+.LBB998:
+.LBB988:
+.LBB985:
+.LBB986:
+.LBB987:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE991:
-.LBE990:
-.LBE989:
-.LBE992:
+.LBE987:
+.LBE986:
+.LBE985:
+.LBE988:
+.LBE998:
+.LBE1000:
 .LBE1002:
-.LBE1004:
-.LBE1006:
-.LBE1200:
-	.loc 1 1757 0
+.LBE1196:
+	.loc 1 1758 0
 	mov	x0, x21
 .LVL225:
-.LBB1201:
-.LBB1007:
-.LBB1005:
+.LBB1197:
 .LBB1003:
-.LBB993:
+.LBB1001:
+.LBB999:
+.LBB989:
 	.loc 6 84 0
 	tbz	x2, 26, .L207
 	b	.L206
 .LVL226:
 	.p2align 3
 .L323:
-.LBE993:
+.LBE989:
+.LBE999:
+.LBE1001:
 .LBE1003:
-.LBE1005:
-.LBE1007:
-.LBE1201:
-.LBB1202:
-.LBB1158:
+.LBE1197:
+.LBB1198:
 .LBB1154:
-.LBB1143:
-.LBB1140:
+.LBB1150:
+.LBB1139:
 .LBB1136:
-.LBB1137:
-.LBB1138:
+.LBB1132:
+.LBB1133:
+.LBB1134:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL227:
-.LBE1138:
-.LBE1137:
+.LBE1134:
+.LBE1133:
+.LBE1132:
 .LBE1136:
-.LBE1140:
-.LBE1143:
+.LBE1139:
+.LBE1150:
 .LBE1154:
-.LBE1158:
-.LBE1202:
-	.loc 1 1757 0
+.LBE1198:
+	.loc 1 1758 0
 	mov	x0, x21
 .LVL228:
-.LBB1203:
-.LBB1159:
+.LBB1199:
 .LBB1155:
-.LBB1144:
-.LBB1141:
+.LBB1151:
+.LBB1140:
+.LBB1137:
 	.loc 6 84 0
 	tbz	x2, 26, .L226
 	b	.L225
 .LVL229:
 	.p2align 3
 .L321:
-.LBE1141:
-.LBE1144:
+.LBE1137:
+.LBE1140:
+.LBE1151:
 .LBE1155:
-.LBE1159:
-.LBE1203:
-.LBB1204:
-.LBB1110:
+.LBE1199:
+.LBB1200:
 .LBB1106:
-.LBB1103:
-.LBB1092:
+.LBB1102:
+.LBB1099:
 .LBB1088:
-.LBB1089:
-.LBB1090:
+.LBB1084:
+.LBB1085:
+.LBB1086:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1090:
-.LBE1089:
+.LBE1086:
+.LBE1085:
+.LBE1084:
 .LBE1088:
-.LBE1092:
-.LBE1103:
+.LBE1099:
+.LBE1102:
 .LBE1106:
-.LBE1110:
-.LBE1204:
-	.loc 1 1757 0
+.LBE1200:
+	.loc 1 1758 0
 	mov	x0, x21
 .LVL230:
-.LBB1205:
-.LBB1111:
+.LBB1201:
 .LBB1107:
-.LBB1104:
-.LBB1093:
+.LBB1103:
+.LBB1100:
+.LBB1089:
 	.loc 6 84 0
 	tbz	x2, 26, .L222
 	b	.L221
 .LVL231:
 	.p2align 3
 .L324:
-.LBE1093:
-.LBE1104:
+.LBE1089:
+.LBE1100:
+.LBE1103:
 .LBE1107:
-.LBE1111:
-.LBE1205:
-.LBB1206:
-.LBB1194:
+.LBE1201:
+.LBB1202:
 .LBB1190:
-.LBB1179:
-.LBB1176:
+.LBB1186:
+.LBB1175:
 .LBB1172:
-.LBB1173:
-.LBB1174:
+.LBB1168:
+.LBB1169:
+.LBB1170:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL232:
-.LBE1174:
-.LBE1173:
+.LBE1170:
+.LBE1169:
+.LBE1168:
 .LBE1172:
-.LBE1176:
-.LBE1179:
+.LBE1175:
+.LBE1186:
 .LBE1190:
-.LBE1194:
-.LBE1206:
-	.loc 1 1757 0
+.LBE1202:
+	.loc 1 1758 0
 	mov	x0, x21
 .LVL233:
-.LBB1207:
-.LBB1195:
+.LBB1203:
 .LBB1191:
-.LBB1180:
-.LBB1177:
+.LBB1187:
+.LBB1176:
+.LBB1173:
 	.loc 6 84 0
 	tbz	x2, 26, .L203
 	b	.L202
 .LVL234:
 	.p2align 3
 .L320:
-.LBE1177:
-.LBE1180:
+.LBE1173:
+.LBE1176:
+.LBE1187:
 .LBE1191:
-.LBE1195:
-.LBE1207:
-.LBB1208:
-.LBB1075:
-.LBB1072:
-.LBB1069:
-.LBB1058:
+.LBE1203:
+.LBB1204:
+.LBB1071:
+.LBB1068:
+.LBB1065:
 .LBB1054:
-.LBB1055:
-.LBB1056:
+.LBB1050:
+.LBB1051:
+.LBB1052:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL235:
-.LBE1056:
-.LBE1055:
+.LBE1052:
+.LBE1051:
+.LBE1050:
 .LBE1054:
-.LBE1058:
-.LBE1069:
-.LBE1072:
-.LBE1075:
-.LBE1208:
-	.loc 1 1757 0
+.LBE1065:
+.LBE1068:
+.LBE1071:
+.LBE1204:
+	.loc 1 1758 0
 	mov	x0, x21
 .LVL236:
-.LBB1209:
-.LBB1076:
-.LBB1073:
-.LBB1070:
-.LBB1059:
+.LBB1205:
+.LBB1072:
+.LBB1069:
+.LBB1066:
+.LBB1055:
 	.loc 6 84 0
 	tbz	x2, 26, .L198
 	b	.L197
 .LVL237:
 	.p2align 3
 .L227:
-.LBE1059:
-.LBE1070:
-.LBE1073:
-.LBE1076:
-.LBE1209:
-.LBB1210:
-.LBB1160:
+.LBE1055:
+.LBE1066:
+.LBE1069:
+.LBE1072:
+.LBE1205:
+.LBB1206:
 .LBB1156:
+.LBB1152:
+.LBB1141:
+.LBB1142:
+.LBB1143:
+.LBB1144:
 .LBB1145:
-.LBB1146:
-.LBB1147:
-.LBB1148:
-.LBB1149:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL238:
-.LBE1149:
-.LBE1148:
-.LBE1147:
-.LBB1150:
-.LBB1151:
+.LBE1145:
+.LBE1144:
+.LBE1143:
+.LBB1146:
+.LBB1147:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2970,13 +2970,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL239:
 #NO_APP
-.LBE1151:
-.LBE1150:
-.LBB1152:
+.LBE1147:
+.LBE1146:
+.LBB1148:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL240:
-.LBE1152:
+.LBE1148:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL241:
@@ -2992,44 +2992,44 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1146:
-.LBE1145:
+.LBE1142:
+.LBE1141:
 	.loc 9 134 0
 	mov	x2, 44
 	add	x1, x29, 104
 .LVL243:
 	bl	__arch_copy_to_user
 .LVL244:
+.LBE1152:
 .LBE1156:
-.LBE1160:
-.LBE1210:
-	.loc 1 1887 0
+.LBE1206:
+	.loc 1 1888 0
 	cbnz	x0, .L228
-.LBB1211:
-.LBB1011:
+.LBB1207:
+.LBB1007:
 	mov	x22, 0
 	b	.L176
 .LVL245:
 	.p2align 3
 .L204:
-.LBE1011:
-.LBE1211:
-.LBB1212:
-.LBB1196:
+.LBE1007:
+.LBE1207:
+.LBB1208:
 .LBB1192:
+.LBB1188:
+.LBB1177:
+.LBB1178:
+.LBB1179:
+.LBB1180:
 .LBB1181:
-.LBB1182:
-.LBB1183:
-.LBB1184:
-.LBB1185:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL246:
-.LBE1185:
-.LBE1184:
-.LBE1183:
-.LBB1186:
-.LBB1187:
+.LBE1181:
+.LBE1180:
+.LBE1179:
+.LBB1182:
+.LBB1183:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -3037,13 +3037,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL247:
 #NO_APP
-.LBE1187:
-.LBE1186:
-.LBB1188:
+.LBE1183:
+.LBE1182:
+.LBB1184:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL248:
-.LBE1188:
+.LBE1184:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL249:
@@ -3059,38 +3059,38 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1182:
-.LBE1181:
+.LBE1178:
+.LBE1177:
 	.loc 9 134 0
 	mov	x2, 44
 	add	x1, x29, 104
 .LVL251:
 	bl	__arch_copy_to_user
 .LVL252:
+.LBE1188:
 .LBE1192:
-.LBE1196:
-.LBE1212:
-	.loc 1 1810 0
+.LBE1208:
+	.loc 1 1811 0
 	cbnz	w0, .L205
-.LBB1213:
-.LBB1012:
+.LBB1209:
+.LBB1008:
 	mov	x22, 0
 	b	.L176
 .LVL253:
 	.p2align 3
 .L209:
-.LBE1012:
-.LBE1213:
-	.loc 1 1818 0
+.LBE1008:
+.LBE1209:
+	.loc 1 1819 0
 	mov	x22, -14
 	b	.L176
 .LVL254:
 	.p2align 3
 .L316:
-	.loc 1 1833 0
+	.loc 1 1834 0
 	mov	w2, 1
 	str	w2, [x20, 96]
-	.loc 1 1834 0
+	.loc 1 1835 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -3100,25 +3100,25 @@ ebc_io_ctl:
 	b	.L211
 	.p2align 3
 .L317:
-	.loc 1 1836 0 discriminator 1
-	ldr	w0, [x20, 608]
+	.loc 1 1837 0 discriminator 1
+	ldr	w0, [x20, 616]
 	cbz	w0, .L213
-.LBB1214:
-.LBB1013:
+.LBB1210:
+.LBB1009:
 	mov	x22, 0
 	b	.L176
 .LVL256:
 .L201:
-.LBE1013:
-.LBE1214:
-	.loc 1 1786 0
+.LBE1009:
+.LBE1210:
+	.loc 1 1787 0
 	mov	x22, -1
 	b	.L176
 .LVL257:
 .L250:
-.LBB1215:
-.LBB1112:
+.LBB1211:
 .LBB1108:
+.LBB1104:
 	.loc 9 112 0
 	mov	x0, 4
 .LVL258:
@@ -3131,22 +3131,22 @@ ebc_io_ctl:
 .LVL260:
 	bl	memset
 .LVL261:
+.LBE1104:
 .LBE1108:
-.LBE1112:
-.LBE1215:
-	.loc 1 1875 0
+.LBE1211:
+	.loc 1 1876 0
 	ldr	x0, [x20, 288]
 	adrp	x1, .LC4
-	.loc 1 1876 0
+	.loc 1 1877 0
 	mov	x22, -14
-	.loc 1 1875 0
+	.loc 1 1876 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
 .LVL262:
-	.loc 1 1876 0
+	.loc 1 1877 0
 	b	.L176
 .L314:
-	.loc 1 1954 0
+	.loc 1 1955 0
 	bl	__stack_chk_fail
 .LVL263:
 .L322:
@@ -3155,33 +3155,33 @@ ebc_io_ctl:
 .LVL264:
 	b	.L223
 	.cfi_endproc
-.LFE2831:
+.LFE2832:
 	.size	ebc_io_ctl, .-ebc_io_ctl
 	.align	2
 	.p2align 3,,7
 	.type	frame_done_callback, %function
 frame_done_callback:
-.LFB2823:
-	.loc 1 1183 0
+.LFB2824:
+	.loc 1 1184 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 1184 0
+	.loc 1 1185 0
 	adrp	x1, .LANCHOR0
-	.loc 1 1183 0
+	.loc 1 1184 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 1184 0
+	.loc 1 1185 0
 	ldr	x20, [x1, #:lo12:.LANCHOR0]
-	.loc 1 1183 0
+	.loc 1 1184 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 1187 0
+	.loc 1 1188 0
 	add	x19, x20, 184
 	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
@@ -3192,40 +3192,40 @@ frame_done_callback:
 	cmp	w0, 1
 	bls	.L327
 .L326:
-	.loc 1 1207 0
+	.loc 1 1208 0
 	ldr	w0, [x19, 56]
 	cbnz	w0, .L332
-	.loc 1 1213 0
+	.loc 1 1214 0
 	ldr	x0, [x19, 104]
-	.loc 1 1212 0
+	.loc 1 1213 0
 	mov	w20, 1
-	.loc 1 1211 0
+	.loc 1 1212 0
 	str	wzr, [x19, 44]
-	.loc 1 1213 0
+	.loc 1 1214 0
 	adrp	x1, .LC9
-	.loc 1 1212 0
-	str	w20, [x19, 92]
 	.loc 1 1213 0
-	add	x1, x1, :lo12:.LC9
+	str	w20, [x19, 92]
 	.loc 1 1214 0
+	add	x1, x1, :lo12:.LC9
+	.loc 1 1215 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
-	.loc 1 1213 0
+	.loc 1 1214 0
 	bl	_dev_info
 .LVL265:
-	.loc 1 1214 0
+	.loc 1 1215 0
 	mov	w2, w20
 	add	x0, x19, 352
 	mov	w1, w20
 	bl	__wake_up_sync
 .LVL266:
-	.loc 1 1215 0
+	.loc 1 1216 0
 	mov	w2, w20
 	mov	w1, w20
 	add	x0, x19, 304
 	bl	__wake_up_sync
 .LVL267:
-	.loc 1 1219 0
+	.loc 1 1220 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -3240,15 +3240,15 @@ frame_done_callback:
 	.p2align 3
 .L327:
 	.cfi_restore_state
-	.loc 1 1192 0
+	.loc 1 1193 0
 	ldr	w0, [x19, 52]
 	cbz	w0, .L328
-	.loc 1 1193 0
+	.loc 1 1194 0
 	add	x1, x1, :lo12:.LANCHOR0
 	ldr	x0, [x1, 8]
 	bl	wake_up_process
 .LVL268:
-	.loc 1 1219 0
+	.loc 1 1220 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -3263,23 +3263,23 @@ frame_done_callback:
 	.p2align 3
 .L328:
 	.cfi_restore_state
-	.loc 1 1196 0
+	.loc 1 1197 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC8
 	add	x1, x1, :lo12:.LC8
-	.loc 1 1201 0
+	.loc 1 1202 0
 	mov	w21, 1
-	.loc 1 1196 0
+	.loc 1 1197 0
 	bl	_dev_info
 .LVL269:
-	.loc 1 1198 0
+	.loc 1 1199 0
 	ldp	w3, w2, [x20, 108]
 	mov	w1, 0
 	ldr	x0, [x19, 168]
 	mul	w2, w3, w2
 	bl	memset
 .LVL270:
-	.loc 1 1199 0
+	.loc 1 1200 0
 	adrp	x2, jiffies
 	add	x0, x20, 688
 	mov	x1, 402653184
@@ -3287,11 +3287,11 @@ frame_done_callback:
 	add	x1, x2, x1
 	bl	mod_timer
 .LVL271:
-	.loc 1 1201 0
+	.loc 1 1202 0
 	str	w21, [x19, 92]
-	.loc 1 1200 0
+	.loc 1 1201 0
 	str	wzr, [x19, 44]
-	.loc 1 1202 0
+	.loc 1 1203 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
 	mov	w2, w21
@@ -3299,13 +3299,13 @@ frame_done_callback:
 	add	x0, x19, 352
 	bl	__wake_up_sync
 .LVL272:
-	.loc 1 1203 0
+	.loc 1 1204 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x19, 304
 	bl	__wake_up_sync
 .LVL273:
-	.loc 1 1219 0
+	.loc 1 1220 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -3320,16 +3320,16 @@ frame_done_callback:
 	.p2align 3
 .L332:
 	.cfi_restore_state
-	.loc 1 1209 0
+	.loc 1 1210 0
 	add	x1, x1, :lo12:.LANCHOR0
-	.loc 1 1208 0
+	.loc 1 1209 0
 	mov	w0, 1
 	str	w0, [x19, 44]
-	.loc 1 1209 0
+	.loc 1 1210 0
 	ldr	x0, [x1, 8]
 	bl	wake_up_process
 .LVL274:
-	.loc 1 1219 0
+	.loc 1 1220 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -3341,14 +3341,14 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2823:
+.LFE2824:
 	.size	frame_done_callback, .-frame_done_callback
 	.align	2
 	.p2align 3,,7
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
-.LFB2829:
-	.loc 1 1683 0
+.LFB2830:
+	.loc 1 1684 0
 	.cfi_startproc
 .LVL275:
 	stp	x29, x30, [sp, -16]!
@@ -3357,33 +3357,33 @@ ebc_frame_timeout:
 	.cfi_offset 30, -8
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1684 0
+	.loc 1 1685 0
 	bl	frame_done_callback
 .LVL276:
-	.loc 1 1686 0
+	.loc 1 1687 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2829:
+.LFE2830:
 	.size	ebc_frame_timeout, .-ebc_frame_timeout
 	.align	2
 	.p2align 3,,7
 	.type	ebc_lut_update, %function
 ebc_lut_update:
-.LFB2824:
-	.loc 1 1222 0
+.LFB2825:
+	.loc 1 1223 0
 	.cfi_startproc
 .LVL277:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 1224 0
+	.loc 1 1225 0
 	mov	w3, 25
-	.loc 1 1222 0
+	.loc 1 1223 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x21, x22, [sp, 32]
@@ -3393,56 +3393,56 @@ ebc_lut_update:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -48
 	.cfi_offset 20, -40
-	.loc 1 1224 0
+	.loc 1 1225 0
 	add	x1, x29, 64
-	.loc 1 1222 0
+	.loc 1 1223 0
 	adrp	x19, __stack_chk_guard
 	add	x0, x19, :lo12:__stack_chk_guard
 .LVL278:
-	.loc 1 1228 0
+	.loc 1 1229 0
 	ldr	x2, [x21, 16]
-	.loc 1 1224 0
+	.loc 1 1225 0
 	str	w3, [x1, -12]!
 .LVL279:
-	.loc 1 1222 0
+	.loc 1 1223 0
 	ldr	x3, [x0]
 	str	x3, [x29, 56]
 	mov	x3,0
-.LBB1216:
-.LBB1217:
+.LBB1212:
+.LBB1213:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
 .LVL280:
 	mov	w20, w0
-.LBE1217:
-.LBE1216:
-	.loc 1 1229 0
+.LBE1213:
+.LBE1212:
+	.loc 1 1230 0
 	cbnz	w0, .L336
 .LVL281:
-	.loc 1 1230 0
-	ldr	w2, [x29, 52]
 	.loc 1 1231 0
+	ldr	w2, [x29, 52]
+	.loc 1 1232 0
 	add	x22, x21, 184
-	.loc 1 1230 0
+	.loc 1 1231 0
 	tbnz	w2, #31, .L360
-	.loc 1 1234 0
+	.loc 1 1235 0
 	cmp	w2, 50
 	bgt	.L361
 .L338:
-	.loc 1 1242 0
+	.loc 1 1243 0
 	ldr	x0, [x22, 104]
 	adrp	x1, .LC13
 	add	x1, x1, :lo12:.LC13
 	bl	_dev_info
 .LVL282:
-	.loc 1 1245 0
+	.loc 1 1246 0
 	ldr	x0, [x22, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 23
 	bls	.L362
-	.loc 1 1301 0
+	.loc 1 1302 0
 	ldr	w2, [x29, 52]
 .L359:
 	mov	w1, 7
@@ -3452,10 +3452,10 @@ ebc_lut_update:
 	cbnz	w0, .L351
 	.p2align 2
 .L354:
-	.loc 1 1306 0
+	.loc 1 1307 0
 	cbnz	w20, .L352
 .L335:
-	.loc 1 1312 0
+	.loc 1 1313 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	w0, w20
 	ldr	x2, [x29, 56]
@@ -3479,11 +3479,11 @@ ebc_lut_update:
 	.p2align 3
 .L362:
 	.cfi_restore_state
-	.loc 1 1245 0
+	.loc 1 1246 0
 	adrp	x1, .L341
-	.loc 1 1247 0
+	.loc 1 1248 0
 	ldr	w2, [x29, 52]
-	.loc 1 1245 0
+	.loc 1 1246 0
 	add	x1, x1, :lo12:.L341
 	ldrb	w0, [x1,w0,uxtw]
 	adr	x1, .Lrtx341
@@ -3522,7 +3522,7 @@ ebc_lut_update:
 .LVL286:
 	.p2align 3
 .L336:
-	.loc 1 1240 0
+	.loc 1 1241 0
 	add	x22, x21, 184
 	mov	w2, w0
 	adrp	x1, .LC12
@@ -3534,20 +3534,20 @@ ebc_lut_update:
 	b	.L338
 	.p2align 3
 .L361:
-	.loc 1 1235 0
+	.loc 1 1236 0
 	ldr	x0, [x22, 104]
 	adrp	x1, .LC11
 	add	x1, x1, :lo12:.LC11
 	bl	_dev_info
 .LVL288:
-	.loc 1 1236 0
+	.loc 1 1237 0
 	mov	w2, 50
 	str	w2, [x29, 52]
 .LVL289:
 	b	.L338
 	.p2align 3
 .L350:
-	.loc 1 1247 0
+	.loc 1 1248 0
 	mov	w1, 1
 	add	x0, x21, 296
 	bl	epd_lut_get
@@ -3555,20 +3555,20 @@ ebc_lut_update:
 	cbz	w0, .L354
 	.p2align 2
 .L351:
-	.loc 1 1236 0
+	.loc 1 1237 0
 	mov	w20, -1
 .L352:
-	.loc 1 1307 0
+	.loc 1 1308 0
 	ldr	x0, [x22, 104]
 	adrp	x1, .LC14
 	add	x1, x1, :lo12:.LC14
 	bl	_dev_err
 .LVL291:
-	.loc 1 1308 0
+	.loc 1 1309 0
 	b	.L335
 	.p2align 3
 .L344:
-	.loc 1 1287 0
+	.loc 1 1288 0
 	mov	w1, 9
 	add	x0, x21, 296
 	bl	epd_lut_get
@@ -3577,7 +3577,7 @@ ebc_lut_update:
 	b	.L354
 	.p2align 3
 .L345:
-	.loc 1 1292 0
+	.loc 1 1293 0
 	mov	w1, 10
 	add	x0, x21, 296
 	bl	epd_lut_get
@@ -3586,7 +3586,7 @@ ebc_lut_update:
 	b	.L354
 	.p2align 3
 .L342:
-	.loc 1 1261 0
+	.loc 1 1262 0
 	mov	w1, 5
 	add	x0, x21, 296
 	bl	epd_lut_get
@@ -3595,7 +3595,7 @@ ebc_lut_update:
 	b	.L354
 	.p2align 3
 .L343:
-	.loc 1 1282 0
+	.loc 1 1283 0
 	mov	w1, 8
 	add	x0, x21, 296
 	bl	epd_lut_get
@@ -3604,7 +3604,7 @@ ebc_lut_update:
 	b	.L354
 	.p2align 3
 .L346:
-	.loc 1 1297 0
+	.loc 1 1298 0
 	mov	w1, 11
 	add	x0, x21, 296
 	bl	epd_lut_get
@@ -3613,7 +3613,7 @@ ebc_lut_update:
 	b	.L354
 	.p2align 3
 .L347:
-	.loc 1 1266 0
+	.loc 1 1267 0
 	mov	w1, 6
 	add	x0, x21, 296
 	bl	epd_lut_get
@@ -3622,7 +3622,7 @@ ebc_lut_update:
 	b	.L354
 	.p2align 3
 .L348:
-	.loc 1 1272 0
+	.loc 1 1273 0
 	mov	w1, 4
 	add	x0, x21, 296
 	bl	epd_lut_get
@@ -3631,7 +3631,7 @@ ebc_lut_update:
 	b	.L354
 	.p2align 3
 .L349:
-	.loc 1 1277 0
+	.loc 1 1278 0
 	mov	w1, 3
 	add	x0, x21, 296
 	bl	epd_lut_get
@@ -3640,45 +3640,45 @@ ebc_lut_update:
 	b	.L354
 	.p2align 3
 .L360:
-	.loc 1 1231 0
+	.loc 1 1232 0
 	ldr	x0, [x22, 104]
 	adrp	x1, .LC10
 	add	x1, x1, :lo12:.LC10
 	bl	_dev_info
 .LVL300:
-	.loc 1 1232 0
+	.loc 1 1233 0
 	str	wzr, [x29, 52]
 	mov	w2, 0
 	b	.L338
 .L363:
-	.loc 1 1312 0
+	.loc 1 1313 0
 	bl	__stack_chk_fail
 .LVL301:
 	.cfi_endproc
-.LFE2824:
+.LFE2825:
 	.size	ebc_lut_update, .-ebc_lut_update
 	.align	2
 	.p2align 3,,7
 	.type	ebc_buf_state_read, %function
 ebc_buf_state_read:
-.LFB2843:
-	.loc 1 2122 0
+.LFB2844:
+	.loc 1 2123 0
 	.cfi_startproc
 .LVL302:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2123 0
+	.loc 1 2124 0
 	mov	x0, x2
 .LVL303:
-	.loc 1 2122 0
+	.loc 1 2123 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2123 0
+	.loc 1 2124 0
 	bl	ebc_buf_state_show
 .LVL304:
-	.loc 1 2124 0
+	.loc 1 2125 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3686,39 +3686,39 @@ ebc_buf_state_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2843:
+.LFE2844:
 	.size	ebc_buf_state_read, .-ebc_buf_state_read
 	.align	2
 	.p2align 3,,7
 	.type	ebc_state_read, %function
 ebc_state_read:
-.LFB2842:
-	.loc 1 2113 0
+.LFB2843:
+	.loc 1 2114 0
 	.cfi_startproc
 .LVL305:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2114 0
+	.loc 1 2115 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2113 0
+	.loc 1 2114 0
 	mov	x0, x2
 .LVL306:
-	.loc 1 2114 0
+	.loc 1 2115 0
 	adrp	x1, .LC15
 .LVL307:
-	.loc 1 2113 0
+	.loc 1 2114 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2114 0
+	.loc 1 2115 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL308:
 	add	x1, x1, :lo12:.LC15
 	ldr	w2, [x2, 624]
 	bl	sprintf
 .LVL309:
-	.loc 1 2115 0
+	.loc 1 2116 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3726,14 +3726,14 @@ ebc_state_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2842:
+.LFE2843:
 	.size	ebc_state_read, .-ebc_state_read
 	.align	2
 	.p2align 3,,7
 	.type	ebc_version_read, %function
 ebc_version_read:
-.LFB2841:
-	.loc 1 2104 0
+.LFB2842:
+	.loc 1 2105 0
 	.cfi_startproc
 .LVL310:
 	stp	x29, x30, [sp, -16]!
@@ -3742,22 +3742,22 @@ ebc_version_read:
 	.cfi_offset 30, -8
 	mov	x0, x2
 .LVL311:
-	.loc 1 2105 0
+	.loc 1 2106 0
 	adrp	x1, .LC17
 .LVL312:
 	adrp	x2, .LC16
 .LVL313:
-	.loc 1 2104 0
+	.loc 1 2105 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2105 0
+	.loc 1 2106 0
 	add	x2, x2, :lo12:.LC16
-	.loc 1 2104 0
 	.loc 1 2105 0
+	.loc 1 2106 0
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
 .LVL314:
-	.loc 1 2106 0
+	.loc 1 2107 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3765,53 +3765,53 @@ ebc_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2841:
+.LFE2842:
 	.size	ebc_version_read, .-ebc_version_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
-.LFB2839:
-	.loc 1 2068 0
+.LFB2840:
+	.loc 1 2069 0
 	.cfi_startproc
 .LVL315:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 2069 0
+	.loc 1 2070 0
 	adrp	x0, .LANCHOR0
 .LVL316:
-	.loc 1 2068 0
+	.loc 1 2069 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2072 0
+	.loc 1 2073 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2068 0
+	.loc 1 2069 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2068 0
+	.loc 1 2069 0
 	mov	x19, x2
-	.loc 1 2072 0
+	.loc 1 2073 0
 	ldr	x1, [x0, 16]
 .LVL317:
-.LBB1218:
-.LBB1219:
+.LBB1214:
+.LBB1215:
 	.loc 3 55 0
 	mov	x0, x1
 	ldr	x1, [x1, 64]
 	blr	x1
 .LVL318:
-.LBE1219:
-.LBE1218:
-	.loc 1 2074 0
+.LBE1215:
+.LBE1214:
+	.loc 1 2075 0
 	mov	w2, w0
 	adrp	x1, .LC15
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
 .LVL319:
-	.loc 1 2075 0
+	.loc 1 2076 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL320:
@@ -3822,40 +3822,40 @@ pmic_vcom_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2839:
+.LFE2840:
 	.size	pmic_vcom_read, .-pmic_vcom_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_temp_read, %function
 pmic_temp_read:
-.LFB2838:
-	.loc 1 2054 0
+.LFB2839:
+	.loc 1 2055 0
 	.cfi_startproc
 .LVL321:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 2055 0
+	.loc 1 2056 0
 	adrp	x0, .LANCHOR0
 .LVL322:
-	.loc 1 2054 0
+	.loc 1 2055 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2058 0
+	.loc 1 2059 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-.LBB1220:
-.LBB1221:
+.LBB1216:
+.LBB1217:
 	.loc 3 50 0
 	add	x1, x29, 36
 .LVL323:
-.LBE1221:
-.LBE1220:
-	.loc 1 2054 0
+.LBE1217:
+.LBE1216:
+	.loc 1 2055 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 2054 0
+	.loc 1 2055 0
 	adrp	x19, __stack_chk_guard
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x20, x2
@@ -3863,25 +3863,25 @@ pmic_temp_read:
 	str	x2, [x29, 40]
 	mov	x2,0
 .LVL324:
-	.loc 1 2058 0
+	.loc 1 2059 0
 	ldr	x2, [x0, 16]
-.LBB1223:
-.LBB1222:
+.LBB1219:
+.LBB1218:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
 .LVL325:
-.LBE1222:
-.LBE1223:
-	.loc 1 2060 0
+.LBE1218:
+.LBE1219:
+	.loc 1 2061 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC15
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
 .LVL326:
-	.loc 1 2061 0
+	.loc 1 2062 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
@@ -3903,32 +3903,32 @@ pmic_temp_read:
 	bl	__stack_chk_fail
 .LVL329:
 	.cfi_endproc
-.LFE2838:
+.LFE2839:
 	.size	pmic_temp_read, .-pmic_temp_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_name_read, %function
 pmic_name_read:
-.LFB2837:
-	.loc 1 2043 0
+.LFB2838:
+	.loc 1 2044 0
 	.cfi_startproc
 .LVL330:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2044 0
+	.loc 1 2045 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2043 0
+	.loc 1 2044 0
 	mov	x0, x2
 .LVL331:
-	.loc 1 2046 0
+	.loc 1 2047 0
 	adrp	x1, .LC17
 .LVL332:
-	.loc 1 2043 0
+	.loc 1 2044 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2046 0
+	.loc 1 2047 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL333:
 	add	x1, x1, :lo12:.LC17
@@ -3936,7 +3936,7 @@ pmic_name_read:
 	add	x2, x2, 8
 	bl	sprintf
 .LVL334:
-	.loc 1 2047 0
+	.loc 1 2048 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3944,24 +3944,24 @@ pmic_name_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2837:
+.LFE2838:
 	.size	pmic_name_read, .-pmic_name_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
-.LFB2840:
-	.loc 1 2080 0
+.LFB2841:
+	.loc 1 2081 0
 	.cfi_startproc
 .LVL335:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 2081 0
+	.loc 1 2082 0
 	adrp	x0, .LANCHOR0
 .LVL336:
-	.loc 1 2080 0
+	.loc 1 2081 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -3971,37 +3971,37 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 2080 0
+	.loc 1 2081 0
 	add	x1, x19, :lo12:__stack_chk_guard
 .LVL337:
 	mov	x21, x2
-	.loc 1 2081 0
+	.loc 1 2082 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
 .LVL338:
-	.loc 1 2080 0
+	.loc 1 2081 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
 .LVL339:
 	mov	x20, x3
-	.loc 1 2084 0
+	.loc 1 2085 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
 .LVL340:
-	.loc 1 2085 0
+	.loc 1 2086 0
 	cbnz	w0, .L385
 .LVL341:
-	.loc 1 2089 0
+	.loc 1 2090 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
 .LVL342:
-	.loc 1 2090 0
+	.loc 1 2091 0
 	cbnz	w0, .L386
 .L378:
-	.loc 1 2096 0
+	.loc 1 2097 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
 .LVL343:
@@ -4026,47 +4026,47 @@ pmic_vcom_write:
 	.p2align 3
 .L385:
 	.cfi_restore_state
-	.loc 1 2086 0
+	.loc 1 2087 0
 	ldr	x0, [x22]
 	adrp	x1, .LC18
 	mov	x2, x21
 	add	x1, x1, :lo12:.LC18
-	.loc 1 2087 0
+	.loc 1 2088 0
 	mov	x20, -1
 .LVL346:
-	.loc 1 2086 0
+	.loc 1 2087 0
 	bl	_dev_err
 .LVL347:
-	.loc 1 2087 0
+	.loc 1 2088 0
 	b	.L378
 .LVL348:
 	.p2align 3
 .L386:
-	.loc 1 2091 0
+	.loc 1 2092 0
 	ldr	x0, [x22]
 	adrp	x1, .LC19
-	.loc 1 2092 0
+	.loc 1 2093 0
 	mov	x20, -1
 .LVL349:
-	.loc 1 2091 0
+	.loc 1 2092 0
 	add	x1, x1, :lo12:.LC19
 	bl	_dev_err
 .LVL350:
-	.loc 1 2092 0
+	.loc 1 2093 0
 	b	.L378
 .L387:
-	.loc 1 2096 0
+	.loc 1 2097 0
 	bl	__stack_chk_fail
 .LVL351:
 	.cfi_endproc
-.LFE2840:
+.LFE2841:
 	.size	pmic_vcom_write, .-pmic_vcom_write
 	.align	2
 	.p2align 3,,7
 	.type	waveform_version_read, %function
 waveform_version_read:
-.LFB2836:
-	.loc 1 2032 0
+.LFB2837:
+	.loc 1 2033 0
 	.cfi_startproc
 .LVL352:
 	stp	x29, x30, [sp, -32]!
@@ -4077,19 +4077,19 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2032 0
-	mov	x19, x2
 	.loc 1 2033 0
+	mov	x19, x2
+	.loc 1 2034 0
 	bl	epd_lut_get_wf_version
 .LVL353:
-	.loc 1 2035 0
+	.loc 1 2036 0
 	mov	x2, x0
 	adrp	x1, .LC17
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
 .LVL354:
-	.loc 1 2036 0
+	.loc 1 2037 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL355:
@@ -4100,96 +4100,96 @@ waveform_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2836:
+.LFE2837:
 	.size	waveform_version_read, .-waveform_version_read
 	.section	.init.text,"ax",@progbits
 	.align	2
 	.type	ebc_init, %function
 ebc_init:
-.LFB2854:
-	.loc 1 2583 0
+.LFB2855:
+	.loc 1 2586 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2584 0
+	.loc 1 2587 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2583 0
+	.loc 1 2586 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2584 0
+	.loc 1 2587 0
 	bl	__platform_driver_register
 .LVL356:
-	.loc 1 2585 0
+	.loc 1 2588 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2854:
+.LFE2855:
 	.size	ebc_init, .-ebc_init
 	.text
 	.align	2
 	.p2align 3,,7
 	.type	direct_mode_data_change, %function
 direct_mode_data_change:
-.LFB2815:
-	.loc 1 904 0
+.LFB2816:
+	.loc 1 905 0
 	.cfi_startproc
 .LVL357:
-	.loc 1 905 0
+	.loc 1 906 0
 	ldr	w13, [x3, 88]
 .LVL358:
 	cbnz	w13, .L426
-.LBB1242:
-.LBB1243:
-	.loc 1 869 0
+.LBB1238:
+.LBB1239:
+	.loc 1 870 0
 	adrp	x5, .LANCHOR0
-	.loc 1 875 0
+	.loc 1 876 0
 	ldrb	w7, [x3, 48]
 	ldr	w4, [x3, 56]
-	.loc 1 869 0
+	.loc 1 870 0
 	ldr	x15, [x5, #:lo12:.LANCHOR0]
-	.loc 1 876 0
+	.loc 1 877 0
 	ldr	x3, [x3, 128]
 .LVL359:
-	.loc 1 875 0
+	.loc 1 876 0
 	sub	w7, w7, w4
 .LVL360:
-	.loc 1 877 0
+	.loc 1 878 0
 	add	x15, x15, 24
-	.loc 1 876 0
+	.loc 1 877 0
 	lsl	w7, w7, 16
 .LVL361:
 	add	x7, x3, x7, sxtw
 .LVL362:
-	.loc 1 880 0
+	.loc 1 881 0
 	ldr	w16, [x15, 88]
-	.loc 1 879 0
+	.loc 1 880 0
 	ldr	w3, [x15, 84]
-	.loc 1 877 0
+	.loc 1 878 0
 	ldr	w17, [x15, 156]
 .LVL363:
-	.loc 1 885 0
+	.loc 1 886 0
 	cmp	w16, 0
-	.loc 1 879 0
+	.loc 1 880 0
 	lsr	w12, w3, 3
 .LVL364:
-	.loc 1 885 0
+	.loc 1 886 0
 	ble	.L414
 	sub	w14, w12, #1
 	add	x14, x14, 1
 	lsl	x14, x14, 2
-	.loc 1 886 0
+	.loc 1 887 0
 	cbz	w17, .L400
 .LVL365:
 	.p2align 2
 .L427:
-	.loc 1 887 0
+	.loc 1 888 0
 	ldr	w10, [x15, 88]
 .LVL366:
 	sub	w10, w10, #1
@@ -4199,105 +4199,105 @@ direct_mode_data_change:
 	add	x10, x0, x10
 .LVL367:
 .L401:
-	.loc 1 891 0
+	.loc 1 892 0
 	cbz	w12, .L402
 	mov	x5, 0
 	.p2align 2
 .L403:
-	.loc 1 893 0
+	.loc 1 894 0
 	ldr	w3, [x2, x5, lsl 2]
-	.loc 1 892 0
+	.loc 1 893 0
 	ldr	w4, [x1, x5, lsl 2]
 	add	x5, x5, 1
 .LVL368:
-.LBB1244:
-.LBB1245:
-	.loc 1 133 0
+.LBB1240:
+.LBB1241:
+	.loc 1 134 0
 	and	w9, w3, 65280
-.LBE1245:
-.LBE1244:
-	.loc 1 891 0
+.LBE1241:
+.LBE1240:
+	.loc 1 892 0
 	cmp	w12, w5
 .LVL369:
-	.loc 1 895 0
+	.loc 1 896 0
 	and	w6, w4, 65535
-.LBB1250:
 .LBB1246:
-	.loc 1 132 0
-	ubfiz	w8, w3, 8, 8
+.LBB1242:
 	.loc 1 133 0
+	ubfiz	w8, w3, 8, 8
+	.loc 1 134 0
 	add	w9, w9, w6, lsr 8
-	.loc 1 132 0
+	.loc 1 133 0
 	add	w6, w8, w6, uxtb
+.LBE1242:
 .LBE1246:
-.LBE1250:
-	.loc 1 896 0
+	.loc 1 897 0
 	lsr	w3, w3, 16
 .LVL370:
 	lsr	w4, w4, 16
-.LBB1251:
-.LBB1252:
-	.loc 1 132 0
-	ubfiz	w8, w3, 8, 8
+.LBB1247:
+.LBB1248:
 	.loc 1 133 0
+	ubfiz	w8, w3, 8, 8
+	.loc 1 134 0
 	and	w3, w3, 65280
-.LBE1252:
-.LBE1251:
-.LBB1256:
-.LBB1247:
-	.loc 1 132 0
-	ldrb	w11, [x7, w6, sxtw]
+.LBE1248:
 .LBE1247:
-.LBE1256:
-.LBB1257:
-.LBB1253:
+.LBB1252:
+.LBB1243:
 	.loc 1 133 0
+	ldrb	w11, [x7, w6, sxtw]
+.LBE1243:
+.LBE1252:
+.LBB1253:
+.LBB1249:
+	.loc 1 134 0
 	add	w3, w3, w4, lsr 8
+.LBE1249:
 .LBE1253:
-.LBE1257:
-.LBB1258:
-.LBB1248:
-	ldrb	w9, [x7, w9, sxtw]
-.LBE1248:
-.LBE1258:
-.LBB1259:
 .LBB1254:
-	.loc 1 132 0
-	add	w6, w8, w4, uxtb
+.LBB1244:
+	ldrb	w9, [x7, w9, sxtw]
+.LBE1244:
 .LBE1254:
-.LBE1259:
-.LBB1260:
-.LBB1249:
-	orr	w4, w11, w9, lsl 4
-.LBE1249:
-.LBE1260:
-	.loc 1 895 0
-	strb	w4, [x10], 2
-.LBB1261:
 .LBB1255:
+.LBB1250:
 	.loc 1 133 0
+	add	w6, w8, w4, uxtb
+.LBE1250:
+.LBE1255:
+.LBB1256:
+.LBB1245:
+	orr	w4, w11, w9, lsl 4
+.LBE1245:
+.LBE1256:
+	.loc 1 896 0
+	strb	w4, [x10], 2
+.LBB1257:
+.LBB1251:
+	.loc 1 134 0
 	ldrb	w3, [x7, w3, sxtw]
-	.loc 1 132 0
+	.loc 1 133 0
 	ldrb	w4, [x7, w6, sxtw]
 	orr	w3, w4, w3, lsl 4
-.LBE1255:
-.LBE1261:
-	.loc 1 896 0
+.LBE1251:
+.LBE1257:
+	.loc 1 897 0
 	strb	w3, [x10, -1]
-	.loc 1 891 0
+	.loc 1 892 0
 	bgt	.L403
 	add	x1, x1, x14
 	add	x2, x2, x14
 .L402:
-	.loc 1 885 0
+	.loc 1 886 0
 	add	w13, w13, 1
 	cmp	w16, w13
 	beq	.L414
 	ldr	w3, [x15, 84]
-	.loc 1 886 0
+	.loc 1 887 0
 	cbnz	w17, .L427
 .L400:
-	.loc 1 889 0
+	.loc 1 890 0
 	mul	w10, w13, w3
 .LVL371:
 	lsr	w10, w10, 2
@@ -4306,43 +4306,43 @@ direct_mode_data_change:
 	b	.L401
 .LVL373:
 .L426:
-.LBE1243:
-.LBE1242:
-.LBB1262:
-.LBB1263:
-.LBB1264:
-	.loc 1 830 0
+.LBE1239:
+.LBE1238:
+.LBB1258:
+.LBB1259:
+.LBB1260:
+	.loc 1 831 0
 	adrp	x7, .LANCHOR0
-	.loc 1 836 0
+	.loc 1 837 0
 	ldrb	w4, [x3, 48]
 	ldr	w6, [x3, 56]
-	.loc 1 830 0
+	.loc 1 831 0
 	ldr	x13, [x7, #:lo12:.LANCHOR0]
 .LVL374:
-	.loc 1 837 0
+	.loc 1 838 0
 	ldr	x5, [x3, 128]
-	.loc 1 836 0
+	.loc 1 837 0
 	sub	w3, w4, w6
 .LVL375:
-	.loc 1 838 0
+	.loc 1 839 0
 	add	x13, x13, 24
-	.loc 1 837 0
+	.loc 1 838 0
 	lsl	w3, w3, 16
 .LVL376:
 	add	x3, x5, x3, sxtw
 .LVL377:
-	.loc 1 841 0
+	.loc 1 842 0
 	ldr	w15, [x13, 88]
-	.loc 1 840 0
+	.loc 1 841 0
 	ldr	w5, [x13, 84]
-	.loc 1 838 0
+	.loc 1 839 0
 	ldr	w16, [x13, 156]
 .LVL378:
-	.loc 1 846 0
+	.loc 1 847 0
 	cmp	w15, 0
-	.loc 1 840 0
+	.loc 1 841 0
 	lsr	w14, w5, 4
-	.loc 1 846 0
+	.loc 1 847 0
 	ble	.L414
 	sub	w11, w14, #1
 	mov	x10, x2
@@ -4353,11 +4353,11 @@ direct_mode_data_change:
 	lsl	x11, x11, 3
 	mov	w12, 0
 .LVL381:
-	.loc 1 847 0
+	.loc 1 848 0
 	cbz	w16, .L417
 .LVL382:
 .L430:
-	.loc 1 848 0
+	.loc 1 849 0
 	ldr	w4, [x13, 88]
 .LVL383:
 	sub	w4, w4, #1
@@ -4367,12 +4367,12 @@ direct_mode_data_change:
 	add	x4, x0, x4
 .LVL384:
 .L418:
-	.loc 1 852 0
+	.loc 1 853 0
 	cbz	w14, .L428
-.LBE1264:
-.LBE1263:
-.LBE1262:
-	.loc 1 904 0
+.LBE1260:
+.LBE1259:
+.LBE1258:
+	.loc 1 905 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -4381,179 +4381,179 @@ direct_mode_data_change:
 	.cfi_def_cfa_register 29
 	.p2align 2
 .L419:
-.LBB1309:
-.LBB1307:
 .LBB1305:
-	.loc 1 852 0
+.LBB1303:
+.LBB1301:
+	.loc 1 853 0
 	mov	x5, 0
 	.p2align 2
 .L399:
-	.loc 1 854 0
+	.loc 1 855 0
 	ldr	x2, [x10, x5]
 .LVL385:
 	add	x4, x4, 4
-	.loc 1 853 0
+	.loc 1 854 0
 	ldr	x1, [x9, x5]
 .LVL386:
 	add	x5, x5, 8
-	.loc 1 856 0
+	.loc 1 857 0
 	and	w7, w2, 65535
-	.loc 1 852 0
+	.loc 1 853 0
 	cmp	x11, x5
-	.loc 1 856 0
+	.loc 1 857 0
 	and	w6, w1, 65535
-.LBB1265:
-.LBB1266:
-	.loc 1 132 0
-	ubfiz	w30, w7, 8, 8
+.LBB1261:
+.LBB1262:
 	.loc 1 133 0
+	ubfiz	w30, w7, 8, 8
+	.loc 1 134 0
 	and	w7, w7, 65280
-	.loc 1 132 0
-	add	w30, w30, w6, uxtb
 	.loc 1 133 0
+	add	w30, w30, w6, uxtb
+	.loc 1 134 0
 	add	w7, w7, w6, lsr 8
-.LBE1266:
-.LBE1265:
-	.loc 1 857 0
+.LBE1262:
+.LBE1261:
+	.loc 1 858 0
 	lsr	w8, w2, 16
 	lsr	w6, w1, 16
-.LBB1270:
-.LBB1271:
-	.loc 1 132 0
-	ubfiz	w18, w8, 8, 8
-.LBE1271:
-.LBE1270:
-.LBB1277:
+.LBB1266:
 .LBB1267:
-	ldrb	w30, [x3, w30, sxtw]
-.LBE1267:
-.LBE1277:
-.LBB1278:
-.LBB1272:
 	.loc 1 133 0
-	and	w8, w8, 65280
-.LBE1272:
-.LBE1278:
-.LBB1279:
+	ubfiz	w18, w8, 8, 8
+.LBE1267:
+.LBE1266:
+.LBB1273:
+.LBB1263:
+	ldrb	w30, [x3, w30, sxtw]
+.LBE1263:
+.LBE1273:
+.LBB1274:
 .LBB1268:
-	ldrb	w17, [x3, w7, sxtw]
+	.loc 1 134 0
+	and	w8, w8, 65280
 .LBE1268:
-.LBE1279:
-.LBB1280:
-.LBB1273:
-	.loc 1 132 0
-	add	w18, w18, w6, uxtb
+.LBE1274:
+.LBB1275:
+.LBB1264:
+	ldrb	w17, [x3, w7, sxtw]
+.LBE1264:
+.LBE1275:
+.LBB1276:
+.LBB1269:
 	.loc 1 133 0
+	add	w18, w18, w6, uxtb
+	.loc 1 134 0
 	add	w8, w8, w6, lsr 8
-.LBE1273:
-.LBE1280:
-	.loc 1 858 0
+.LBE1269:
+.LBE1276:
+	.loc 1 859 0
 	ubfx	x7, x2, 32, 16
 	ubfx	x6, x1, 32, 16
-	.loc 1 859 0
+	.loc 1 860 0
 	lsr	x2, x2, 48
 .LVL387:
-.LBB1281:
-.LBB1269:
-	.loc 1 132 0
+.LBB1277:
+.LBB1265:
+	.loc 1 133 0
 	orr	w17, w30, w17, lsl 4
-.LBE1269:
-.LBE1281:
-	.loc 1 856 0
+.LBE1265:
+.LBE1277:
+	.loc 1 857 0
 	strb	w17, [x4, -4]
-.LBB1282:
-.LBB1283:
-	.loc 1 132 0
-	ubfiz	w17, w7, 8, 8
+.LBB1278:
+.LBB1279:
 	.loc 1 133 0
+	ubfiz	w17, w7, 8, 8
+	.loc 1 134 0
 	and	w7, w7, 65280
-.LBE1283:
-.LBE1282:
-.LBB1289:
-.LBB1274:
+.LBE1279:
+.LBE1278:
+.LBB1285:
+.LBB1270:
 	ldrb	w8, [x3, w8, sxtw]
-.LBE1274:
-.LBE1289:
-.LBB1290:
-.LBB1284:
-	.loc 1 132 0
+.LBE1270:
+.LBE1285:
+.LBB1286:
+.LBB1280:
+	.loc 1 133 0
 	add	w17, w17, w6, uxtb
-.LBE1284:
-.LBE1290:
-.LBB1291:
-.LBB1275:
+.LBE1280:
+.LBE1286:
+.LBB1287:
+.LBB1271:
 	ldrb	w18, [x3, w18, sxtw]
-.LBE1275:
-.LBE1291:
-.LBB1292:
-.LBB1285:
-	.loc 1 133 0
+.LBE1271:
+.LBE1287:
+.LBB1288:
+.LBB1281:
+	.loc 1 134 0
 	add	w6, w7, w6, lsr 8
-.LBE1285:
-.LBE1292:
-	.loc 1 859 0
+.LBE1281:
+.LBE1288:
+	.loc 1 860 0
 	lsr	x1, x1, 48
 .LVL388:
-.LBB1293:
-.LBB1276:
-	.loc 1 132 0
+.LBB1289:
+.LBB1272:
+	.loc 1 133 0
 	orr	w7, w18, w8, lsl 4
-.LBE1276:
-.LBE1293:
-	.loc 1 857 0
+.LBE1272:
+.LBE1289:
+	.loc 1 858 0
 	strb	w7, [x4, -3]
-.LBB1294:
-.LBB1295:
-	.loc 1 132 0
-	ubfiz	w7, w2, 8, 8
+.LBB1290:
+.LBB1291:
 	.loc 1 133 0
+	ubfiz	w7, w2, 8, 8
+	.loc 1 134 0
 	and	w2, w2, 65280
-.LBE1295:
-.LBE1294:
-.LBB1299:
-.LBB1286:
+.LBE1291:
+.LBE1290:
+.LBB1295:
+.LBB1282:
 	ldrb	w8, [x3, w6, sxtw]
-.LBE1286:
-.LBE1299:
-.LBB1300:
+.LBE1282:
+.LBE1295:
 .LBB1296:
-	.loc 1 132 0
+.LBB1292:
+	.loc 1 133 0
 	add	w6, w7, w1, uxtb
+.LBE1292:
 .LBE1296:
-.LBE1300:
-.LBB1301:
-.LBB1287:
-	ldrb	w17, [x3, w17, sxtw]
-.LBE1287:
-.LBE1301:
-.LBB1302:
 .LBB1297:
-	.loc 1 133 0
-	add	w1, w2, w1, lsr 8
+.LBB1283:
+	ldrb	w17, [x3, w17, sxtw]
+.LBE1283:
 .LBE1297:
-.LBE1302:
-.LBB1303:
-.LBB1288:
-	.loc 1 132 0
-	orr	w2, w17, w8, lsl 4
-.LBE1288:
-.LBE1303:
-	.loc 1 858 0
-	strb	w2, [x4, -2]
-.LBB1304:
 .LBB1298:
+.LBB1293:
+	.loc 1 134 0
+	add	w1, w2, w1, lsr 8
+.LBE1293:
+.LBE1298:
+.LBB1299:
+.LBB1284:
 	.loc 1 133 0
+	orr	w2, w17, w8, lsl 4
+.LBE1284:
+.LBE1299:
+	.loc 1 859 0
+	strb	w2, [x4, -2]
+.LBB1300:
+.LBB1294:
+	.loc 1 134 0
 	ldrb	w1, [x3, w1, sxtw]
-	.loc 1 132 0
+	.loc 1 133 0
 	ldrb	w2, [x3, w6, sxtw]
 	orr	w1, w2, w1, lsl 4
-.LBE1298:
-.LBE1304:
-	.loc 1 859 0
+.LBE1294:
+.LBE1300:
+	.loc 1 860 0
 	strb	w1, [x4, -1]
-	.loc 1 852 0
+	.loc 1 853 0
 	bne	.L399
-	.loc 1 846 0
+	.loc 1 847 0
 	add	w12, w12, 1
 	add	x9, x9, x11
 	add	x10, x10, x11
@@ -4561,9 +4561,9 @@ direct_mode_data_change:
 	beq	.L392
 .L429:
 	ldr	w5, [x13, 84]
-	.loc 1 847 0
-	cbz	w16, .L396
 	.loc 1 848 0
+	cbz	w16, .L396
+	.loc 1 849 0
 	ldr	w4, [x13, 88]
 .LVL389:
 	sub	w4, w4, #1
@@ -4572,18 +4572,18 @@ direct_mode_data_change:
 	lsr	w4, w4, 2
 	add	x4, x0, x4
 .LVL390:
-	.loc 1 852 0
+	.loc 1 853 0
 	cbnz	w14, .L419
 .L425:
-	.loc 1 846 0
+	.loc 1 847 0
 	add	w12, w12, 1
 	cmp	w15, w12
 	bne	.L429
 .L392:
+.LBE1301:
+.LBE1303:
 .LBE1305:
-.LBE1307:
-.LBE1309:
-	.loc 1 909 0
+	.loc 1 910 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -4591,10 +4591,10 @@ direct_mode_data_change:
 	ret
 .LVL391:
 .L417:
-.LBB1310:
-.LBB1308:
 .LBB1306:
-	.loc 1 850 0
+.LBB1304:
+.LBB1302:
+	.loc 1 851 0
 	mul	w4, w12, w5
 .LVL392:
 	lsr	w4, w4, 2
@@ -4612,7 +4612,7 @@ direct_mode_data_change:
 	lsr	w4, w4, 2
 	add	x4, x0, x4
 .LVL396:
-	.loc 1 852 0
+	.loc 1 853 0
 	cbnz	w14, .L419
 	b	.L425
 .LVL397:
@@ -4620,45 +4620,45 @@ direct_mode_data_change:
 	.cfi_def_cfa 31, 0
 	.cfi_restore 29
 	.cfi_restore 30
-	.loc 1 846 0
+	.loc 1 847 0
 	add	w12, w12, 1
 	cmp	w15, w12
 	beq	.L414
 	ldr	w5, [x13, 84]
-	.loc 1 847 0
+	.loc 1 848 0
 	cbz	w16, .L417
 	b	.L430
 .LVL398:
 	.p2align 3
 .L414:
 	ret
+.LBE1302:
+.LBE1304:
 .LBE1306:
-.LBE1308:
-.LBE1310:
 	.cfi_endproc
-.LFE2815:
+.LFE2816:
 	.size	direct_mode_data_change, .-direct_mode_data_change
 	.align	2
 	.p2align 3,,7
 	.type	direct_mode_data_change_part, %function
 direct_mode_data_change_part:
-.LFB2818:
-	.loc 1 998 0
+.LFB2819:
+	.loc 1 999 0
 	.cfi_startproc
 .LVL399:
 	stp	x29, x30, [sp, -80]!
 	.cfi_def_cfa_offset 80
 	.cfi_offset 29, -80
 	.cfi_offset 30, -72
-.LBB1329:
-.LBB1330:
-.LBB1331:
-	.loc 1 957 0
+.LBB1325:
+.LBB1326:
+.LBB1327:
+	.loc 1 958 0
 	adrp	x5, .LANCHOR0
-.LBE1331:
-.LBE1330:
-.LBE1329:
-	.loc 1 998 0
+.LBE1327:
+.LBE1326:
+.LBE1325:
+	.loc 1 999 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -4672,60 +4672,60 @@ direct_mode_data_change_part:
 	.cfi_offset 23, -32
 	.cfi_offset 24, -24
 	.cfi_offset 25, -16
-	.loc 1 999 0
+	.loc 1 1000 0
 	ldr	w16, [x3, 88]
 .LVL400:
 	cbnz	w16, .L535
-.LBB1344:
-.LBB1345:
-	.loc 1 916 0
+.LBB1340:
+.LBB1341:
+	.loc 1 917 0
 	ldr	x18, [x5, #:lo12:.LANCHOR0]
-	.loc 1 921 0
+	.loc 1 922 0
 	ldrb	w14, [x3, 48]
 	ldr	w4, [x3, 56]
-	.loc 1 923 0
+	.loc 1 924 0
 	add	x18, x18, 24
-	.loc 1 922 0
+	.loc 1 923 0
 	ldr	x3, [x3, 128]
 .LVL401:
-	.loc 1 921 0
+	.loc 1 922 0
 	sub	w14, w14, w4
 .LVL402:
-	.loc 1 926 0
+	.loc 1 927 0
 	ldr	w30, [x18, 88]
-	.loc 1 922 0
+	.loc 1 923 0
 	lsl	w14, w14, 16
 .LVL403:
-	.loc 1 923 0
+	.loc 1 924 0
 	ldr	w19, [x18, 156]
-	.loc 1 922 0
+	.loc 1 923 0
 	add	x14, x3, x14, sxtw
 .LVL404:
-	.loc 1 925 0
+	.loc 1 926 0
 	ldr	w3, [x18, 84]
 .LVL405:
-	.loc 1 931 0
+	.loc 1 932 0
 	cmp	w30, 0
-	.loc 1 925 0
+	.loc 1 926 0
 	lsr	w9, w3, 3
 .LVL406:
-	.loc 1 931 0
+	.loc 1 932 0
 	ble	.L431
 	sub	w17, w9, #1
-.LBB1346:
-.LBB1347:
-	.loc 1 138 0
+.LBB1342:
+.LBB1343:
+	.loc 1 139 0
 	mov	w15, 3
 	add	x17, x17, 1
 	lsl	x17, x17, 2
-.LBE1347:
-.LBE1346:
-	.loc 1 932 0
+.LBE1343:
+.LBE1342:
+	.loc 1 933 0
 	cbz	w19, .L461
 .LVL407:
 	.p2align 2
 .L536:
-	.loc 1 933 0
+	.loc 1 934 0
 	ldr	w13, [x18, 88]
 .LVL408:
 	sub	w13, w13, #1
@@ -4735,177 +4735,177 @@ direct_mode_data_change_part:
 	add	x13, x0, x13
 .LVL409:
 .L462:
-	.loc 1 937 0
+	.loc 1 938 0
 	cbz	w9, .L463
 	add	x13, x13, 2
 .LVL410:
 	mov	x10, 0
 	.p2align 2
 .L476:
-	.loc 1 939 0
+	.loc 1 940 0
 	ldr	w6, [x2, x10, lsl 2]
-.LBB1353:
-.LBB1354:
-	.loc 1 142 0
+.LBB1349:
+.LBB1350:
+	.loc 1 143 0
 	mov	w4, 0
-.LBE1354:
-.LBE1353:
-	.loc 1 938 0
+.LBE1350:
+.LBE1349:
+	.loc 1 939 0
 	ldr	w7, [x1, x10, lsl 2]
-.LBB1359:
-.LBB1348:
-	.loc 1 142 0
+.LBB1355:
+.LBB1344:
+	.loc 1 143 0
 	mov	w5, 0
-.LBE1348:
-.LBE1359:
-	.loc 1 941 0
+.LBE1344:
+.LBE1355:
+	.loc 1 942 0
 	and	w20, w6, 65535
 	and	w12, w7, 65535
-.LBB1360:
-.LBB1355:
-	.loc 1 153 0
+.LBB1356:
+.LBB1351:
+	.loc 1 154 0
 	and	w3, w20, 65280
 	add	w8, w3, w12, lsr 8
-.LBE1355:
-.LBE1360:
-	.loc 1 942 0
+.LBE1351:
+.LBE1356:
+	.loc 1 943 0
 	lsr	w3, w6, 16
-.LBB1361:
-.LBB1349:
-	.loc 1 152 0
+.LBB1357:
+.LBB1345:
+	.loc 1 153 0
 	ubfiz	w23, w3, 8, 8
-.LBE1349:
-.LBE1361:
-	.loc 1 942 0
+.LBE1345:
+.LBE1357:
+	.loc 1 943 0
 	and	w3, w3, 65535
 	lsr	w11, w7, 16
-.LBB1362:
-.LBB1356:
-	.loc 1 152 0
-	ubfiz	w24, w6, 8, 8
-.LBE1356:
-.LBE1362:
-.LBB1363:
-.LBB1350:
+.LBB1358:
+.LBB1352:
 	.loc 1 153 0
+	ubfiz	w24, w6, 8, 8
+.LBE1352:
+.LBE1358:
+.LBB1359:
+.LBB1346:
+	.loc 1 154 0
 	and	w21, w3, 65280
-.LBE1350:
-.LBE1363:
-.LBB1364:
-.LBB1357:
-	.loc 1 139 0
+.LBE1346:
+.LBE1359:
+.LBB1360:
+.LBB1353:
+	.loc 1 140 0
 	eor	w25, w20, w12
-	.loc 1 152 0
+	.loc 1 153 0
 	add	w24, w24, w12, uxtb
-.LBE1357:
-.LBE1364:
-.LBB1365:
-.LBB1351:
+.LBE1353:
+.LBE1360:
+.LBB1361:
+.LBB1347:
 	add	w23, w23, w11, uxtb
-	.loc 1 139 0
+	.loc 1 140 0
 	eor	w22, w3, w11
-	.loc 1 153 0
+	.loc 1 154 0
 	add	w21, w21, w11, lsr 8
-.LBE1351:
-.LBE1365:
-	.loc 1 940 0
+.LBE1347:
+.LBE1361:
+	.loc 1 941 0
 	cmp	w7, w6
 	beq	.L464
-.LBB1366:
-.LBB1358:
-	.loc 1 141 0
+.LBB1362:
+.LBB1354:
+	.loc 1 142 0
 	cmp	w20, w12
 	beq	.L465
-	.loc 1 138 0
+	.loc 1 139 0
 	tst	x25, 15
-	.loc 1 153 0
+	.loc 1 154 0
 	ldrb	w6, [x14, w8, sxtw]
-	.loc 1 138 0
+	.loc 1 139 0
 	csel	w4, w15, wzr, ne
-	.loc 1 146 0
+	.loc 1 147 0
 	tst	w25, 240
 	orr	w7, w4, 12
-	.loc 1 152 0
+	.loc 1 153 0
 	ldrb	w8, [x14, w24, sxtw]
-	.loc 1 146 0
+	.loc 1 147 0
 	csel	w4, w7, w4, ne
-	.loc 1 148 0
+	.loc 1 149 0
 	tst	w25, 3840
 	orr	w7, w4, 48
 	csel	w4, w7, w4, ne
-	.loc 1 150 0
+	.loc 1 151 0
 	tst	w25, 61440
 	orr	w7, w4, -64
-	.loc 1 152 0
+	.loc 1 153 0
 	orr	w6, w8, w6, lsl 4
-	.loc 1 150 0
+	.loc 1 151 0
 	and	w7, w7, 255
 	csel	w4, w7, w4, ne
-	.loc 1 152 0
+	.loc 1 153 0
 	and	w4, w6, w4
 	and	w4, w4, 255
 .L465:
-.LBE1358:
-.LBE1366:
-	.loc 1 941 0
+.LBE1354:
+.LBE1362:
+	.loc 1 942 0
 	strb	w4, [x13, -2]
-.LBB1367:
-.LBB1352:
-	.loc 1 141 0
+.LBB1363:
+.LBB1348:
+	.loc 1 142 0
 	cmp	w3, w11
 	beq	.L470
-	.loc 1 138 0
+	.loc 1 139 0
 	tst	x22, 15
-	.loc 1 152 0
+	.loc 1 153 0
 	ldrb	w6, [x14, w23, sxtw]
-	.loc 1 138 0
+	.loc 1 139 0
 	csel	w3, w15, wzr, ne
-	.loc 1 146 0
+	.loc 1 147 0
 	tst	w22, 240
 	orr	w4, w3, 12
-	.loc 1 153 0
+	.loc 1 154 0
 	ldrb	w5, [x14, w21, sxtw]
-	.loc 1 146 0
+	.loc 1 147 0
 	csel	w3, w4, w3, ne
-	.loc 1 148 0
+	.loc 1 149 0
 	tst	w22, 3840
 	orr	w4, w3, 48
 	csel	w3, w4, w3, ne
-	.loc 1 150 0
+	.loc 1 151 0
 	tst	w22, 61440
 	orr	w4, w3, -64
-	.loc 1 152 0
+	.loc 1 153 0
 	orr	w5, w6, w5, lsl 4
-	.loc 1 150 0
+	.loc 1 151 0
 	and	w4, w4, 255
 	csel	w3, w4, w3, ne
-	.loc 1 152 0
+	.loc 1 153 0
 	and	w3, w5, w3
 	and	w5, w3, 255
 .L470:
-.LBE1352:
-.LBE1367:
-	.loc 1 942 0
+.LBE1348:
+.LBE1363:
+	.loc 1 943 0
 	strb	w5, [x13, -1]
 .L475:
 	add	x10, x10, 1
 	add	x13, x13, 2
-	.loc 1 937 0
+	.loc 1 938 0
 	cmp	w9, w10
 	bgt	.L476
 	add	x1, x1, x17
 	add	x2, x2, x17
 .LVL411:
 .L463:
-	.loc 1 931 0
+	.loc 1 932 0
 	add	w16, w16, 1
 	cmp	w30, w16
 	beq	.L431
 	ldr	w3, [x18, 84]
-	.loc 1 932 0
+	.loc 1 933 0
 	cbnz	w19, .L536
 .L461:
-	.loc 1 935 0
+	.loc 1 936 0
 	mul	w13, w16, w3
 .LVL412:
 	lsr	w13, w13, 2
@@ -4915,15 +4915,15 @@ direct_mode_data_change_part:
 .LVL414:
 	.p2align 3
 .L464:
-	.loc 1 945 0
+	.loc 1 946 0
 	strh	wzr, [x13, -2]
 	b	.L475
 .LVL415:
 	.p2align 3
 .L431:
-.LBE1345:
-.LBE1344:
-	.loc 1 1003 0
+.LBE1341:
+.LBE1340:
+	.loc 1 1004 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 .LVL416:
@@ -4947,42 +4947,42 @@ direct_mode_data_change_part:
 .LVL419:
 .L535:
 	.cfi_restore_state
-.LBB1368:
-.LBB1343:
-.LBB1342:
-	.loc 1 957 0
+.LBB1364:
+.LBB1339:
+.LBB1338:
+	.loc 1 958 0
 	ldr	x14, [x5, #:lo12:.LANCHOR0]
-	.loc 1 962 0
+	.loc 1 963 0
 	ldrb	w7, [x3, 48]
 	ldr	w4, [x3, 56]
-	.loc 1 964 0
+	.loc 1 965 0
 	add	x14, x14, 24
-	.loc 1 963 0
+	.loc 1 964 0
 	ldr	x3, [x3, 128]
 .LVL420:
-	.loc 1 962 0
+	.loc 1 963 0
 	sub	w7, w7, w4
 .LVL421:
-	.loc 1 967 0
+	.loc 1 968 0
 	ldr	w15, [x14, 88]
-	.loc 1 963 0
+	.loc 1 964 0
 	lsl	w7, w7, 16
 .LVL422:
-	.loc 1 964 0
+	.loc 1 965 0
 	ldr	w16, [x14, 156]
 .LVL423:
-	.loc 1 963 0
+	.loc 1 964 0
 	add	x7, x3, x7, sxtw
 .LVL424:
-	.loc 1 966 0
+	.loc 1 967 0
 	ldr	w3, [x14, 84]
 .LVL425:
-	.loc 1 972 0
+	.loc 1 973 0
 	cmp	w15, 0
-	.loc 1 966 0
+	.loc 1 967 0
 	lsr	w11, w3, 4
 .LVL426:
-	.loc 1 972 0
+	.loc 1 973 0
 	ble	.L431
 	sub	w13, w11, #1
 	mov	x9, x2
@@ -4993,18 +4993,18 @@ direct_mode_data_change_part:
 	lsl	x13, x13, 3
 	mov	w12, 0
 .LVL429:
-.LBB1332:
-.LBB1333:
-	.loc 1 138 0
+.LBB1328:
+.LBB1329:
+	.loc 1 139 0
 	mov	w10, 3
-.LBE1333:
-.LBE1332:
-	.loc 1 973 0
+.LBE1329:
+.LBE1328:
+	.loc 1 974 0
 	cbz	w16, .L435
 .LVL430:
 	.p2align 2
 .L537:
-	.loc 1 974 0
+	.loc 1 975 0
 	ldr	w1, [x14, 88]
 .LVL431:
 	sub	w1, w1, #1
@@ -5014,271 +5014,271 @@ direct_mode_data_change_part:
 	add	x3, x0, x3
 .LVL432:
 .L436:
-	.loc 1 978 0
+	.loc 1 979 0
 	cbz	w11, .L437
 	add	x3, x3, 4
 .LVL433:
 	mov	x5, 0
 	.p2align 2
 .L460:
-	.loc 1 979 0
+	.loc 1 980 0
 	ldr	x1, [x8, x5, lsl 3]
 .LVL434:
-	.loc 1 980 0
+	.loc 1 981 0
 	ldr	x2, [x9, x5, lsl 3]
 .LVL435:
-	.loc 1 981 0
+	.loc 1 982 0
 	cmp	x1, x2
 	beq	.L438
-	.loc 1 982 0
+	.loc 1 983 0
 	and	w17, w2, 65535
 	and	w6, w1, 65535
 .LVL436:
-.LBB1335:
-.LBB1336:
-	.loc 1 142 0
+.LBB1331:
+.LBB1332:
+	.loc 1 143 0
 	mov	w4, 0
-	.loc 1 141 0
+	.loc 1 142 0
 	cmp	w17, w6
 	beq	.L439
-	.loc 1 139 0
+	.loc 1 140 0
 	eor	w18, w17, w6
 .LVL437:
-	.loc 1 152 0
-	ubfiz	w19, w17, 8, 8
 	.loc 1 153 0
+	ubfiz	w19, w17, 8, 8
+	.loc 1 154 0
 	and	w17, w17, 65280
-	.loc 1 152 0
+	.loc 1 153 0
 	add	w19, w19, w6, uxtb
-	.loc 1 138 0
+	.loc 1 139 0
 	tst	x18, 15
-	.loc 1 153 0
+	.loc 1 154 0
 	add	w6, w17, w6, lsr 8
-	.loc 1 138 0
+	.loc 1 139 0
 	csel	w4, w10, wzr, ne
-	.loc 1 146 0
+	.loc 1 147 0
 	tst	w18, 240
 	orr	w17, w4, 12
-	.loc 1 152 0
+	.loc 1 153 0
 	ldrb	w19, [x7, w19, sxtw]
-	.loc 1 146 0
+	.loc 1 147 0
 	csel	w4, w17, w4, ne
-	.loc 1 148 0
+	.loc 1 149 0
 	tst	w18, 3840
 	orr	w17, w4, 48
-	.loc 1 153 0
+	.loc 1 154 0
 	ldrb	w6, [x7, w6, sxtw]
-	.loc 1 148 0
+	.loc 1 149 0
 	csel	w4, w17, w4, ne
-	.loc 1 150 0
+	.loc 1 151 0
 	tst	w18, 61440
 	orr	w17, w4, -64
 	and	w17, w17, 255
-	.loc 1 152 0
+	.loc 1 153 0
 	orr	w6, w19, w6, lsl 4
-	.loc 1 150 0
+	.loc 1 151 0
 	csel	w4, w17, w4, ne
-	.loc 1 152 0
+	.loc 1 153 0
 	and	w4, w6, w4
 	and	w4, w4, 255
 .LVL438:
 .L439:
-.LBE1336:
-.LBE1335:
-	.loc 1 982 0
-	strb	w4, [x3, -4]
+.LBE1332:
+.LBE1331:
 	.loc 1 983 0
+	strb	w4, [x3, -4]
+	.loc 1 984 0
 	lsr	w17, w2, 16
 	lsr	w6, w1, 16
-.LBB1337:
-.LBB1338:
-	.loc 1 142 0
+.LBB1333:
+.LBB1334:
+	.loc 1 143 0
 	mov	w4, 0
-	.loc 1 141 0
+	.loc 1 142 0
 	cmp	w17, w6
 	beq	.L444
-	.loc 1 139 0
+	.loc 1 140 0
 	eor	w18, w17, w6
 .LVL439:
-	.loc 1 152 0
-	ubfiz	w19, w17, 8, 8
 	.loc 1 153 0
+	ubfiz	w19, w17, 8, 8
+	.loc 1 154 0
 	and	w17, w17, 65280
-	.loc 1 152 0
+	.loc 1 153 0
 	add	w19, w19, w6, uxtb
-	.loc 1 138 0
+	.loc 1 139 0
 	tst	x18, 15
-	.loc 1 153 0
+	.loc 1 154 0
 	add	w6, w17, w6, lsr 8
-	.loc 1 138 0
+	.loc 1 139 0
 	csel	w4, w10, wzr, ne
-	.loc 1 146 0
+	.loc 1 147 0
 	tst	w18, 240
 	orr	w17, w4, 12
-	.loc 1 152 0
+	.loc 1 153 0
 	ldrb	w19, [x7, w19, sxtw]
-	.loc 1 146 0
+	.loc 1 147 0
 	csel	w4, w17, w4, ne
-	.loc 1 148 0
+	.loc 1 149 0
 	tst	w18, 3840
 	orr	w17, w4, 48
-	.loc 1 153 0
+	.loc 1 154 0
 	ldrb	w6, [x7, w6, sxtw]
-	.loc 1 148 0
+	.loc 1 149 0
 	csel	w4, w17, w4, ne
-	.loc 1 150 0
+	.loc 1 151 0
 	tst	w18, 61440
 	orr	w17, w4, -64
 	and	w17, w17, 255
-	.loc 1 152 0
+	.loc 1 153 0
 	orr	w6, w19, w6, lsl 4
-	.loc 1 150 0
+	.loc 1 151 0
 	csel	w4, w17, w4, ne
-	.loc 1 152 0
+	.loc 1 153 0
 	and	w4, w6, w4
 	and	w4, w4, 255
 .LVL440:
 .L444:
-.LBE1338:
-.LBE1337:
-	.loc 1 983 0
-	strb	w4, [x3, -3]
+.LBE1334:
+.LBE1333:
 	.loc 1 984 0
+	strb	w4, [x3, -3]
+	.loc 1 985 0
 	ubfx	x17, x2, 32, 16
 	ubfx	x6, x1, 32, 16
-.LBB1339:
-.LBB1340:
-	.loc 1 142 0
+.LBB1335:
+.LBB1336:
+	.loc 1 143 0
 	mov	w4, 0
-	.loc 1 141 0
+	.loc 1 142 0
 	cmp	w17, w6
 	beq	.L449
-	.loc 1 139 0
+	.loc 1 140 0
 	eor	w18, w17, w6
 .LVL441:
-	.loc 1 152 0
-	ubfiz	w19, w17, 8, 8
 	.loc 1 153 0
+	ubfiz	w19, w17, 8, 8
+	.loc 1 154 0
 	and	w17, w17, 65280
-	.loc 1 152 0
+	.loc 1 153 0
 	add	w19, w19, w6, uxtb
-	.loc 1 138 0
+	.loc 1 139 0
 	tst	x18, 15
-	.loc 1 153 0
+	.loc 1 154 0
 	add	w6, w17, w6, lsr 8
-	.loc 1 138 0
+	.loc 1 139 0
 	csel	w4, w10, wzr, ne
-	.loc 1 146 0
+	.loc 1 147 0
 	tst	w18, 240
 	orr	w17, w4, 12
-	.loc 1 152 0
+	.loc 1 153 0
 	ldrb	w19, [x7, w19, sxtw]
-	.loc 1 146 0
+	.loc 1 147 0
 	csel	w4, w17, w4, ne
-	.loc 1 148 0
+	.loc 1 149 0
 	tst	w18, 3840
 	orr	w17, w4, 48
-	.loc 1 153 0
+	.loc 1 154 0
 	ldrb	w6, [x7, w6, sxtw]
-	.loc 1 148 0
+	.loc 1 149 0
 	csel	w4, w17, w4, ne
-	.loc 1 150 0
+	.loc 1 151 0
 	tst	w18, 61440
 	orr	w17, w4, -64
 	and	w17, w17, 255
-	.loc 1 152 0
+	.loc 1 153 0
 	orr	w6, w19, w6, lsl 4
-	.loc 1 150 0
+	.loc 1 151 0
 	csel	w4, w17, w4, ne
-	.loc 1 152 0
+	.loc 1 153 0
 	and	w4, w6, w4
 	and	w4, w4, 255
 .LVL442:
 .L449:
-.LBE1340:
-.LBE1339:
-	.loc 1 984 0
-	strb	w4, [x3, -2]
+.LBE1336:
+.LBE1335:
 	.loc 1 985 0
+	strb	w4, [x3, -2]
+	.loc 1 986 0
 	lsr	x2, x2, 48
 .LVL443:
 	lsr	x1, x1, 48
 .LVL444:
-.LBB1341:
-.LBB1334:
-	.loc 1 142 0
+.LBB1337:
+.LBB1330:
+	.loc 1 143 0
 	mov	w4, 0
-	.loc 1 141 0
+	.loc 1 142 0
 	cmp	w2, w1
 	beq	.L454
-	.loc 1 139 0
+	.loc 1 140 0
 	eor	w6, w2, w1
 .LVL445:
-	.loc 1 152 0
-	ubfiz	w4, w2, 8, 8
 	.loc 1 153 0
+	ubfiz	w4, w2, 8, 8
+	.loc 1 154 0
 	and	w2, w2, 65280
-	.loc 1 152 0
+	.loc 1 153 0
 	add	w4, w4, w1, uxtb
-	.loc 1 138 0
+	.loc 1 139 0
 	tst	x6, 15
-	.loc 1 153 0
+	.loc 1 154 0
 	add	w1, w2, w1, lsr 8
-	.loc 1 138 0
+	.loc 1 139 0
 	csel	w2, w10, wzr, ne
-	.loc 1 146 0
+	.loc 1 147 0
 	tst	w6, 240
 	orr	w18, w2, 12
 .LVL446:
-	.loc 1 152 0
+	.loc 1 153 0
 	ldrb	w17, [x7, w4, sxtw]
-	.loc 1 146 0
+	.loc 1 147 0
 	csel	w2, w18, w2, ne
-	.loc 1 148 0
+	.loc 1 149 0
 	tst	w6, 3840
 	orr	w18, w2, 48
-	.loc 1 153 0
+	.loc 1 154 0
 	ldrb	w4, [x7, w1, sxtw]
-	.loc 1 148 0
+	.loc 1 149 0
 	csel	w2, w18, w2, ne
-	.loc 1 150 0
+	.loc 1 151 0
 	tst	w6, 61440
 	orr	w1, w2, -64
 	and	w1, w1, 255
-	.loc 1 152 0
+	.loc 1 153 0
 	orr	w4, w17, w4, lsl 4
-	.loc 1 150 0
+	.loc 1 151 0
 	csel	w2, w1, w2, ne
-	.loc 1 152 0
+	.loc 1 153 0
 	and	w2, w4, w2
 	and	w4, w2, 255
 .LVL447:
 .L454:
-.LBE1334:
-.LBE1341:
-	.loc 1 985 0
+.LBE1330:
+.LBE1337:
+	.loc 1 986 0
 	strb	w4, [x3, -1]
 .LVL448:
 .L459:
 	add	x5, x5, 1
 	add	x3, x3, 4
-	.loc 1 978 0
+	.loc 1 979 0
 	cmp	w11, w5
 	bgt	.L460
 	add	x8, x8, x13
 	add	x9, x9, x13
 .LVL449:
 .L437:
-	.loc 1 972 0
+	.loc 1 973 0
 	add	w12, w12, 1
 	cmp	w15, w12
 	beq	.L431
 	ldr	w3, [x14, 84]
 .LVL450:
-	.loc 1 973 0
+	.loc 1 974 0
 	cbnz	w16, .L537
 .L435:
-	.loc 1 976 0
+	.loc 1 977 0
 	mul	w3, w12, w3
 	lsr	w3, w3, 2
 	add	x3, x0, x3
@@ -5287,46 +5287,46 @@ direct_mode_data_change_part:
 .LVL452:
 	.p2align 3
 .L438:
-	.loc 1 988 0
+	.loc 1 989 0
 	str	wzr, [x3, -4]
 	b	.L459
-.LBE1342:
-.LBE1343:
-.LBE1368:
+.LBE1338:
+.LBE1339:
+.LBE1364:
 	.cfi_endproc
-.LFE2818:
+.LFE2819:
 	.size	direct_mode_data_change_part, .-direct_mode_data_change_part
 	.align	2
 	.p2align 3,,7
 	.type	flip.isra.7, %function
 flip.isra.7:
-.LFB2863:
-	.loc 1 1005 0
+.LFB2864:
+	.loc 1 1006 0
 	.cfi_startproc
 .LVL453:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 1009 0
+	.loc 1 1010 0
 	sxtw	x2, w1
-	.loc 1 1005 0
+	.loc 1 1006 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 1005 0
+	.loc 1 1006 0
 	mov	x20, x0
-	.loc 1 1007 0
+	.loc 1 1008 0
 	ldr	w19, [x0, 72]
-	.loc 1 1009 0
+	.loc 1 1010 0
 	ldr	x0, [x0]
 .LVL454:
-.LBB1369:
-.LBB1370:
-.LBB1371:
-.LBB1372:
+.LBB1365:
+.LBB1366:
+.LBB1367:
+.LBB1368:
 	.file 10 "./include/linux/dma-mapping.h"
 	.loc 10 266 0
 	cbz	x0, .L541
@@ -5337,37 +5337,37 @@ flip.isra.7:
 	cmp	x3, 0
 	csel	x3, x4, x3, eq
 .L539:
-.LBE1372:
-.LBE1371:
+.LBE1368:
+.LBE1367:
 	.loc 10 434 0
 	ldr	x5, [x3, 88]
 	sxtw	x19, w19
 	cbz	x5, .L540
-.LBE1370:
-.LBE1369:
-	.loc 1 1009 0
+.LBE1366:
+.LBE1365:
+	.loc 1 1010 0
 	add	x4, x19, x19, lsl 1
-.LBB1378:
-.LBB1375:
+.LBB1374:
+.LBB1371:
 	.loc 10 435 0
 	mov	w3, 1
-.LBE1375:
-.LBE1378:
-	.loc 1 1009 0
+.LBE1371:
+.LBE1374:
+	.loc 1 1010 0
 	add	x4, x20, x4, lsl 3
-.LBB1379:
-.LBB1376:
+.LBB1375:
+.LBB1372:
 	.loc 10 435 0
 	ldr	x1, [x4, 32]
 	blr	x5
 .LVL455:
 .L540:
-.LBE1376:
-.LBE1379:
-	.loc 1 1010 0
+.LBE1372:
+.LBE1375:
+	.loc 1 1011 0
 	ldr	x5, [x20, 8]
-.LBB1380:
-.LBB1381:
+.LBB1376:
+.LBB1377:
 	.file 11 "drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.h"
 	.loc 11 57 0
 	mov	w4, 0
@@ -5375,29 +5375,29 @@ flip.isra.7:
 	mov	w2, 0
 	mov	x0, x5
 	mov	w1, 0
-.LBE1381:
-.LBE1380:
-	.loc 1 1011 0
+.LBE1377:
+.LBE1376:
+	.loc 1 1012 0
 	add	x19, x19, x19, lsl 1
-.LBB1384:
-.LBB1382:
+.LBB1380:
+.LBB1378:
 	.loc 11 57 0
 	ldr	x5, [x5, 64]
-.LBE1382:
-.LBE1384:
-	.loc 1 1011 0
+.LBE1378:
+.LBE1380:
+	.loc 1 1012 0
 	add	x19, x20, x19, lsl 3
-.LBB1385:
-.LBB1383:
+.LBB1381:
+.LBB1379:
 	.loc 11 57 0
 	blr	x5
 .LVL456:
-.LBE1383:
-.LBE1385:
-	.loc 1 1011 0
+.LBE1379:
+.LBE1381:
+	.loc 1 1012 0
 	ldr	x1, [x20, 8]
-.LBB1386:
-.LBB1387:
+.LBB1382:
+.LBB1383:
 	.loc 11 62 0
 	mov	w2, 0
 	mov	x0, x1
@@ -5405,26 +5405,26 @@ flip.isra.7:
 	ldr	w1, [x19, 32]
 	blr	x3
 .LVL457:
-.LBE1387:
-.LBE1386:
-	.loc 1 1012 0
+.LBE1383:
+.LBE1382:
+	.loc 1 1013 0
 	ldr	x2, [x20, 8]
-.LBB1388:
-.LBB1389:
+.LBB1384:
+.LBB1385:
 	.loc 11 77 0
 	mov	w1, 1
 	mov	x0, x2
 	ldr	x2, [x2, 96]
 	blr	x2
 .LVL458:
-.LBE1389:
-.LBE1388:
-	.loc 1 1013 0
+.LBE1385:
+.LBE1384:
+	.loc 1 1014 0
 	ldr	w1, [x20, 72]
 	mov	w0, 1
 	sub	w0, w0, w1
 	str	w0, [x20, 72]
-	.loc 1 1014 0
+	.loc 1 1015 0
 	ldp	x19, x20, [sp, 16]
 .LVL459:
 	ldp	x29, x30, [sp], 32
@@ -5439,27 +5439,27 @@ flip.isra.7:
 	.p2align 3
 .L541:
 	.cfi_restore_state
-.LBB1390:
-.LBB1377:
-.LBB1374:
+.LBB1386:
 .LBB1373:
+.LBB1370:
+.LBB1369:
 	.loc 10 268 0
 	adrp	x3, dummy_dma_ops
 	add	x3, x3, :lo12:dummy_dma_ops
 	b	.L539
+.LBE1369:
+.LBE1370:
 .LBE1373:
-.LBE1374:
-.LBE1377:
-.LBE1390:
+.LBE1386:
 	.cfi_endproc
-.LFE2863:
+.LFE2864:
 	.size	flip.isra.7, .-flip.isra.7
 	.align	2
 	.p2align 3,,7
 	.type	ebc_frame_start, %function
 ebc_frame_start:
-.LFB2821:
-	.loc 1 1023 0
+.LFB2822:
+	.loc 1 1024 0
 	.cfi_startproc
 .LVL461:
 	stp	x29, x30, [sp, -48]!
@@ -5471,16 +5471,16 @@ ebc_frame_start:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 1025 0
+	.loc 1 1026 0
 	add	x19, x0, 184
-	.loc 1 1023 0
+	.loc 1 1024 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 1023 0
-	mov	x20, x0
 	.loc 1 1024 0
+	mov	x20, x0
+	.loc 1 1025 0
 	add	x21, x0, 24
-	.loc 1 1027 0
+	.loc 1 1028 0
 	ldr	x1, [x19, 224]
 	ldr	w0, [x1, 40]
 .LVL462:
@@ -5491,35 +5491,35 @@ ebc_frame_start:
 	cbz	w0, .L550
 	cmp	w0, 1
 	bne	.L547
-	.loc 1 1029 0
+	.loc 1 1030 0
 	ldr	x0, [x19, 184]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
 	ldr	x3, [x19, 168]
 	bl	get_overlay_image
 .LVL463:
-	.loc 1 1034 0
+	.loc 1 1035 0
 	ldr	w0, [x19, 52]
 	cbz	w0, .L552
-.LBB1391:
-.LBB1392:
-	.loc 1 1018 0
-	str	wzr, [x21, 72]
+.LBB1387:
+.LBB1388:
 	.loc 1 1019 0
+	str	wzr, [x21, 72]
+	.loc 1 1020 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
 .LVL464:
-.LBE1392:
-.LBE1391:
-	.loc 1 1036 0
+.LBE1388:
+.LBE1387:
+	.loc 1 1037 0
 	ldp	x1, x2, [x19, 144]
 	mov	x4, x19
 	ldr	x3, [x19, 168]
 	ldr	x0, [x19, 192]
 	bl	get_overlay_image
 .LVL465:
-	.loc 1 1104 0
+	.loc 1 1105 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 .LVL466:
@@ -5536,40 +5536,40 @@ ebc_frame_start:
 	.p2align 3
 .L548:
 	.cfi_restore_state
-	.loc 1 1027 0
+	.loc 1 1028 0
 	sub	w0, w0, #22
 	cmp	w0, 1
 	bhi	.L547
 .L550:
-	.loc 1 1049 0
+	.loc 1 1050 0
 	ldr	x0, [x19, 184]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
 	ldr	x3, [x19, 168]
 	bl	get_auto_image
 .LVL468:
-	.loc 1 1054 0
+	.loc 1 1055 0
 	ldr	w0, [x19, 52]
 	cbz	w0, .L554
-.LBB1393:
-.LBB1394:
-	.loc 1 1018 0
-	str	wzr, [x21, 72]
+.LBB1389:
+.LBB1390:
 	.loc 1 1019 0
+	str	wzr, [x21, 72]
+	.loc 1 1020 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
 .LVL469:
-.LBE1394:
-.LBE1393:
-	.loc 1 1056 0
+.LBE1390:
+.LBE1389:
+	.loc 1 1057 0
 	ldp	x1, x2, [x19, 144]
 	mov	x4, x19
 	ldr	x3, [x19, 168]
 	ldr	x0, [x19, 192]
 	bl	get_auto_image
 .LVL470:
-	.loc 1 1104 0
+	.loc 1 1105 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 .LVL471:
@@ -5586,46 +5586,46 @@ ebc_frame_start:
 	.p2align 3
 .L547:
 	.cfi_restore_state
-	.loc 1 1092 0
+	.loc 1 1093 0
 	ldr	x2, [x19, 216]
-	.loc 1 1090 0
+	.loc 1 1091 0
 	mov	x3, x19
-	.loc 1 1089 0
+	.loc 1 1090 0
 	ldrb	w0, [x19, 48]
 	str	w0, [x19, 56]
-	.loc 1 1090 0
+	.loc 1 1091 0
 	ldr	x0, [x19, 184]
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change
 .LVL473:
-.LBB1395:
-.LBB1396:
-	.loc 1 1018 0
-	str	wzr, [x21, 72]
+.LBB1391:
+.LBB1392:
 	.loc 1 1019 0
+	str	wzr, [x21, 72]
+	.loc 1 1020 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
 .LVL474:
-.LBE1396:
-.LBE1395:
-	.loc 1 1095 0
-	ldr	w0, [x19, 56]
+.LBE1392:
+.LBE1391:
 	.loc 1 1096 0
-	mov	x3, x19
+	ldr	w0, [x19, 56]
 	.loc 1 1097 0
+	mov	x3, x19
+	.loc 1 1098 0
 	ldp	x2, x1, [x19, 216]
-	.loc 1 1095 0
+	.loc 1 1096 0
 	sub	w0, w0, #1
 	str	w0, [x19, 56]
-	.loc 1 1096 0
+	.loc 1 1097 0
 	ldr	x0, [x19, 192]
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
 .LVL475:
-	.loc 1 1104 0
+	.loc 1 1105 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 .LVL476:
@@ -5642,46 +5642,46 @@ ebc_frame_start:
 	.p2align 3
 .L549:
 	.cfi_restore_state
-	.loc 1 1079 0
+	.loc 1 1080 0
 	ldr	x2, [x19, 216]
-	.loc 1 1077 0
+	.loc 1 1078 0
 	mov	x3, x19
-	.loc 1 1076 0
+	.loc 1 1077 0
 	ldrb	w0, [x19, 48]
 	str	w0, [x19, 56]
-	.loc 1 1077 0
+	.loc 1 1078 0
 	ldr	x0, [x19, 184]
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change_part
 .LVL478:
-.LBB1397:
-.LBB1398:
-	.loc 1 1018 0
-	str	wzr, [x21, 72]
+.LBB1393:
+.LBB1394:
 	.loc 1 1019 0
+	str	wzr, [x21, 72]
+	.loc 1 1020 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
 .LVL479:
-.LBE1398:
-.LBE1397:
-	.loc 1 1082 0
-	ldr	w0, [x19, 56]
+.LBE1394:
+.LBE1393:
 	.loc 1 1083 0
-	mov	x3, x19
+	ldr	w0, [x19, 56]
 	.loc 1 1084 0
+	mov	x3, x19
+	.loc 1 1085 0
 	ldp	x2, x1, [x19, 216]
-	.loc 1 1082 0
+	.loc 1 1083 0
 	sub	w0, w0, #1
 	str	w0, [x19, 56]
-	.loc 1 1083 0
+	.loc 1 1084 0
 	ldr	x0, [x19, 192]
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part
 .LVL480:
-	.loc 1 1104 0
+	.loc 1 1105 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 .LVL481:
@@ -5698,7 +5698,7 @@ ebc_frame_start:
 	.p2align 3
 .L554:
 	.cfi_restore_state
-	.loc 1 1062 0
+	.loc 1 1063 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	adrp	x1, .LC21
@@ -5706,9 +5706,9 @@ ebc_frame_start:
 	add	x1, x1, :lo12:.LC21
 	bl	_dev_info
 .LVL483:
-	.loc 1 1063 0
+	.loc 1 1064 0
 	str	wzr, [x19, 44]
-	.loc 1 1104 0
+	.loc 1 1105 0
 	ldp	x19, x20, [sp, 16]
 .LVL484:
 	ldr	x21, [sp, 32]
@@ -5725,7 +5725,7 @@ ebc_frame_start:
 	.p2align 3
 .L552:
 	.cfi_restore_state
-	.loc 1 1042 0
+	.loc 1 1043 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	adrp	x1, .LC20
@@ -5733,9 +5733,9 @@ ebc_frame_start:
 	add	x1, x1, :lo12:.LC20
 	bl	_dev_info
 .LVL486:
-	.loc 1 1043 0
+	.loc 1 1044 0
 	str	wzr, [x19, 44]
-	.loc 1 1104 0
+	.loc 1 1105 0
 	ldp	x19, x20, [sp, 16]
 .LVL487:
 	ldr	x21, [sp, 32]
@@ -5748,23 +5748,23 @@ ebc_frame_start:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2821:
+.LFE2822:
 	.size	ebc_frame_start, .-ebc_frame_start
 	.align	2
 	.p2align 3,,7
 	.type	ebc_auto_tast_function, %function
 ebc_auto_tast_function:
-.LFB2822:
-	.loc 1 1107 0
+.LFB2823:
+	.loc 1 1108 0
 	.cfi_startproc
 .LVL488:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
 	.cfi_offset 30, -88
-	.loc 1 1108 0
+	.loc 1 1109 0
 	adrp	x1, .LANCHOR0
-	.loc 1 1107 0
+	.loc 1 1108 0
 	adrp	x0, __stack_chk_guard
 .LVL489:
 	add	x0, x0, :lo12:__stack_chk_guard
@@ -5775,45 +5775,39 @@ ebc_auto_tast_function:
 	.cfi_offset 20, -72
 	adrp	x20, .LANCHOR1
 	stp	x21, x22, [sp, 32]
-	.loc 1 1113 0
+	.loc 1 1114 0
 	add	x20, x20, :lo12:.LANCHOR1
 	.cfi_offset 21, -64
 	.cfi_offset 22, -56
-	.loc 1 1108 0
+	.loc 1 1109 0
 	ldr	x22, [x1, #:lo12:.LANCHOR0]
 .LVL490:
-	.loc 1 1113 0
+	.loc 1 1114 0
 	add	x20, x20, 376
-	.loc 1 1107 0
+	.loc 1 1108 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
-.LBB1399:
-.LBB1400:
-.LBB1401:
+.LBB1395:
+.LBB1396:
+.LBB1397:
 	.file 12 "./include/linux/compiler.h"
 	.loc 12 288 0
 	mov	x24, 2
-.LBE1401:
-.LBE1400:
-.LBE1399:
-	.loc 1 1107 0
-	stp	x25, x26, [sp, 64]
+.LBE1397:
+.LBE1396:
+.LBE1395:
+	.loc 1 1108 0
+	str	x25, [sp, 64]
 	.cfi_offset 25, -32
-	.cfi_offset 26, -24
-	.loc 1 1109 0
-	add	x21, x22, 24
 	.loc 1 1110 0
+	add	x21, x22, 24
+	.loc 1 1111 0
 	add	x19, x22, 184
-	add	x26, x22, 744
-	.loc 1 1107 0
-	ldr	x1, [x0]
-	str	x1, [x29, 88]
-	mov	x1,0
-	adrp	x25, system_wq
-.LBB1406:
-.LBB1403:
-.LBB1404:
+	add	x25, x22, 744
+.LBB1402:
+.LBB1399:
+.LBB1400:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -5821,42 +5815,46 @@ ebc_auto_tast_function:
 // 0 "" 2
 .LVL491:
 #NO_APP
+.LBE1400:
+.LBE1399:
+.LBE1402:
+	.loc 1 1108 0
+	ldr	x1, [x0]
+	str	x1, [x29, 88]
+	mov	x1,0
 	b	.L570
 	.p2align 3
 .L586:
-.LBE1404:
-.LBE1403:
-.LBE1406:
-	.loc 1 1172 0
+	.loc 1 1173 0
 	cmp	w0, 1
 	beq	.L585
 .L569:
-	.loc 1 1175 0
+	.loc 1 1176 0
 	mov	x0, x20
 	bl	up
 .LVL492:
-	.loc 1 1176 0
+	.loc 1 1177 0
 	bl	schedule
 .LVL493:
 .L570:
-	.loc 1 1113 0
+	.loc 1 1114 0
 	mov	x0, x20
 	bl	down
 .LVL494:
-.LBB1407:
-.LBB1405:
-.LBB1402:
+.LBB1403:
+.LBB1401:
+.LBB1398:
 	.loc 12 288 0
 	str	x24, [x23, 32]
-.LBE1402:
-.LBE1405:
-.LBE1407:
-	.loc 1 1117 0
+.LBE1398:
+.LBE1401:
+.LBE1403:
+	.loc 1 1118 0
 #APP
-// 1117 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
+// 1118 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
 	dmb ish
 // 0 "" 2
-	.loc 1 1118 0
+	.loc 1 1119 0
 #NO_APP
 	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
@@ -5867,12 +5865,12 @@ ebc_auto_tast_function:
 	cbz	w0, .L563
 	cmp	w0, 1
 	bne	.L560
-	.loc 1 1120 0
+	.loc 1 1121 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
 	bl	flip.isra.7
 .LVL495:
-	.loc 1 1121 0
+	.loc 1 1122 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
@@ -5882,74 +5880,70 @@ ebc_auto_tast_function:
 	bl	get_overlay_image
 .LVL496:
 .L565:
-	.loc 1 1169 0
+	.loc 1 1170 0
 	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
-	.loc 1 1170 0
-	sub	w1, w0, #22
 	.loc 1 1171 0
+	sub	w1, w0, #22
+	.loc 1 1172 0
 	cmp	w0, 0
 	ccmp	w1, 1, 0, ne
 	bhi	.L586
-.LBB1408:
-.LBB1409:
-.LBB1410:
-.LBB1411:
+.LBB1404:
+.LBB1405:
 	.file 13 "./include/linux/workqueue.h"
 	.loc 13 518 0
-	ldr	x1, [x25, #:lo12:system_wq]
-	mov	x2, x26
+	ldr	x1, [x19, 608]
+	mov	x2, x25
 	mov	w0, 8
 	bl	queue_work_on
 .LVL497:
 	b	.L569
 	.p2align 3
 .L561:
-.LBE1411:
-.LBE1410:
-.LBE1409:
-.LBE1408:
-	.loc 1 1118 0
+.LBE1405:
+.LBE1404:
+	.loc 1 1119 0
 	sub	w0, w0, #22
 	cmp	w0, 1
 	bls	.L563
 .L560:
-	.loc 1 1157 0
-	ldr	w1, [x19, 56]
 	.loc 1 1158 0
+	ldr	w1, [x19, 56]
+	.loc 1 1159 0
 	mov	x0, x21
-	.loc 1 1157 0
+	.loc 1 1158 0
 	sub	w1, w1, #1
 	str	w1, [x19, 56]
-	.loc 1 1158 0
+	.loc 1 1159 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.7
 .LVL498:
-	.loc 1 1159 0
+	.loc 1 1160 0
 	ldr	w0, [x19, 56]
 	cbz	w0, .L565
-	.loc 1 1161 0
+	.loc 1 1162 0
 	ldrsw	x0, [x21, 72]
 	mov	x3, x19
-	.loc 1 1162 0
+	.loc 1 1163 0
 	ldp	x2, x1, [x19, 216]
-	.loc 1 1161 0
+	.loc 1 1162 0
 	add	x0, x19, x0, lsl 3
 	ldr	x1, [x1, 16]
 	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
 .LVL499:
-	.loc 1 1165 0
+	.loc 1 1166 0
 	b	.L565
 	.p2align 3
 .L563:
-	.loc 1 1130 0
+	.loc 1 1131 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
 	bl	flip.isra.7
 .LVL500:
-	.loc 1 1131 0
+	.loc 1 1132 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
@@ -5958,70 +5952,66 @@ ebc_auto_tast_function:
 	ldr	x0, [x0, 184]
 	bl	get_auto_image
 .LVL501:
-	.loc 1 1136 0
+	.loc 1 1137 0
 	b	.L565
 	.p2align 3
 .L562:
-	.loc 1 1147 0
-	ldr	w1, [x19, 56]
 	.loc 1 1148 0
+	ldr	w1, [x19, 56]
+	.loc 1 1149 0
 	mov	x0, x21
-	.loc 1 1147 0
+	.loc 1 1148 0
 	sub	w1, w1, #1
 	str	w1, [x19, 56]
-	.loc 1 1148 0
+	.loc 1 1149 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.7
 .LVL502:
-	.loc 1 1149 0
+	.loc 1 1150 0
 	ldr	w0, [x19, 56]
 	cbz	w0, .L565
-	.loc 1 1151 0
+	.loc 1 1152 0
 	ldrsw	x0, [x21, 72]
 	mov	x3, x19
-	.loc 1 1152 0
+	.loc 1 1153 0
 	ldp	x2, x1, [x19, 216]
-	.loc 1 1151 0
+	.loc 1 1152 0
 	add	x0, x19, x0, lsl 3
 	ldr	x1, [x1, 16]
 	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part
 .LVL503:
-	.loc 1 1155 0
+	.loc 1 1156 0
 	b	.L565
 	.p2align 3
 .L585:
-	.loc 1 1172 0 discriminator 1
-	ldr	w0, [x19, 620]
+	.loc 1 1173 0 discriminator 1
+	ldr	w0, [x19, 628]
 	cbz	w0, .L569
-	.loc 1 1172 0 is_stmt 0 discriminator 2
-	ldr	w0, [x19, 624]
+	.loc 1 1173 0 is_stmt 0 discriminator 2
+	ldr	w0, [x19, 632]
 	cbz	w0, .L569
-.LBB1415:
-.LBB1414:
-.LBB1413:
-.LBB1412:
+.LBB1407:
+.LBB1406:
 	.loc 13 518 0 is_stmt 1
-	ldr	x1, [x25, #:lo12:system_wq]
-	mov	x2, x26
+	ldr	x1, [x19, 608]
+	mov	x2, x25
 	mov	w0, 8
 	bl	queue_work_on
 .LVL504:
 	b	.L569
-.LBE1412:
-.LBE1413:
-.LBE1414:
-.LBE1415:
+.LBE1406:
+.LBE1407:
 	.cfi_endproc
-.LFE2822:
+.LFE2823:
 	.size	ebc_auto_tast_function, .-ebc_auto_tast_function
 	.align	2
 	.p2align 3,,7
 	.type	ebc_power_set.part.8, %function
 ebc_power_set.part.8:
-.LFB2864:
-	.loc 1 182 0
+.LFB2865:
+	.loc 1 183 0
 	.cfi_startproc
 .LVL505:
 	stp	x29, x30, [sp, -32]!
@@ -6033,45 +6023,45 @@ ebc_power_set.part.8:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-	.loc 1 182 0
+	.loc 1 183 0
 	mov	x19, x0
-	.loc 1 199 0
-	str	w1, [x0, 384]
 	.loc 1 200 0
+	str	w1, [x0, 384]
+	.loc 1 201 0
 	ldr	x1, [x0, 8]
 .LVL506:
-.LBB1416:
-.LBB1417:
+.LBB1408:
+.LBB1409:
 	.loc 11 51 0
 	mov	x0, x1
 .LVL507:
 	ldr	x1, [x1, 56]
 	blr	x1
 .LVL508:
-.LBE1417:
-.LBE1416:
-	.loc 1 201 0
+.LBE1409:
+.LBE1408:
+	.loc 1 202 0
 	ldr	x2, [x19, 16]
-.LBB1418:
-.LBB1419:
+.LBB1410:
+.LBB1411:
 	.loc 3 35 0
 	mov	w1, 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
 .LVL509:
-.LBE1419:
-.LBE1418:
-	.loc 1 202 0
+.LBE1411:
+.LBE1410:
+	.loc 1 203 0
 	ldr	w0, [x19, 624]
 	cbnz	w0, .L593
-	.loc 1 206 0
+	.loc 1 207 0
 	ldr	x0, [x19]
 	adrp	x1, .LC22
 	add	x1, x1, :lo12:.LC22
 	bl	_dev_info
 .LVL510:
-	.loc 1 210 0
+	.loc 1 211 0
 	ldp	x19, x20, [sp, 16]
 .LVL511:
 	ldp	x29, x30, [sp], 32
@@ -6086,23 +6076,23 @@ ebc_power_set.part.8:
 	.p2align 3
 .L593:
 	.cfi_restore_state
-	.loc 1 203 0
+	.loc 1 204 0
 	str	wzr, [x19, 624]
-.LBB1420:
-.LBB1421:
+.LBB1412:
+.LBB1413:
 	.loc 4 68 0
 	add	x0, x19, 416
 	bl	__pm_relax
 .LVL513:
-.LBE1421:
-.LBE1420:
-	.loc 1 206 0
+.LBE1413:
+.LBE1412:
+	.loc 1 207 0
 	ldr	x0, [x19]
 	adrp	x1, .LC22
 	add	x1, x1, :lo12:.LC22
 	bl	_dev_info
 .LVL514:
-	.loc 1 210 0
+	.loc 1 211 0
 	ldp	x19, x20, [sp, 16]
 .LVL515:
 	ldp	x29, x30, [sp], 32
@@ -6113,14 +6103,14 @@ ebc_power_set.part.8:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2864:
+.LFE2865:
 	.size	ebc_power_set.part.8, .-ebc_power_set.part.8
 	.align	2
 	.p2align 3,,7
 	.type	ebc_suspend, %function
 ebc_suspend:
-.LFB2852:
-	.loc 1 2533 0
+.LFB2853:
+	.loc 1 2536 0
 	.cfi_startproc
 .LVL516:
 	stp	x29, x30, [sp, -32]!
@@ -6132,40 +6122,40 @@ ebc_suspend:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-.LBB1422:
-.LBB1423:
+.LBB1414:
+.LBB1415:
 	.loc 2 1181 0
 	ldr	x20, [x0, 184]
-.LBE1423:
-.LBE1422:
-	.loc 1 2537 0
+.LBE1415:
+.LBE1414:
+	.loc 1 2540 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 200]
 .LVL517:
 	cmp	w0, 1
 	beq	.L597
 .L595:
-	.loc 1 2541 0
+	.loc 1 2544 0
 	mov	w0, 1
-	str	w0, [x19, 612]
-	.loc 1 2543 0
+	str	w0, [x19, 620]
+	.loc 1 2546 0
 	ldr	x1, [x20, 16]
-.LBB1424:
-.LBB1425:
+.LBB1416:
+.LBB1417:
 	.loc 3 40 0
 	mov	x0, x1
 	ldr	x1, [x1, 40]
 	blr	x1
 .LVL518:
-.LBE1425:
-.LBE1424:
-	.loc 1 2544 0
+.LBE1417:
+.LBE1416:
+	.loc 1 2547 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC24
 	add	x1, x1, :lo12:.LC24
 	bl	_dev_info
 .LVL519:
-	.loc 1 2547 0
+	.loc 1 2550 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -6179,7 +6169,7 @@ ebc_suspend:
 	.p2align 3
 .L597:
 	.cfi_restore_state
-	.loc 1 2538 0
+	.loc 1 2541 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
@@ -6188,46 +6178,46 @@ ebc_suspend:
 	add	x1, x1, :lo12:.LC23
 	bl	_dev_info
 .LVL520:
-.LBB1426:
-.LBB1427:
+.LBB1418:
+.LBB1419:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
 .LVL521:
 	b	.L595
-.LBE1427:
-.LBE1426:
+.LBE1419:
+.LBE1418:
 	.cfi_endproc
-.LFE2852:
+.LFE2853:
 	.size	ebc_suspend, .-ebc_suspend
 	.align	2
 	.p2align 3,,7
 	.type	ebc_probe, %function
 ebc_probe:
-.LFB2850:
-	.loc 1 2397 0
+.LFB2851:
+	.loc 1 2400 0
 	.cfi_startproc
 .LVL522:
 	stp	x29, x30, [sp, -208]!
 	.cfi_def_cfa_offset 208
 	.cfi_offset 29, -208
 	.cfi_offset 30, -200
-.LBB1578:
-.LBB1579:
+.LBB1570:
+.LBB1571:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
-.LBE1579:
-.LBE1578:
-	.loc 1 2397 0
+.LBE1571:
+.LBE1570:
+	.loc 1 2400 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 2398 0
+	.loc 1 2401 0
 	add	x22, x0, 16
-	.loc 1 2397 0
+	.loc 1 2400 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -160
 	.cfi_offset 24, -152
@@ -6243,62 +6233,62 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 2397 0
+	.loc 1 2400 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
-.LBB1581:
-.LBB1580:
+.LBB1573:
+.LBB1572:
 	.loc 2 711 0
 	mov	x0, x22
-	mov	x1, 816
+	mov	x1, 824
 	bl	devm_kmalloc
 .LVL524:
-.LBE1580:
-.LBE1581:
-	.loc 1 2413 0
+.LBE1572:
+.LBE1573:
+	.loc 1 2416 0
 	cbz	x0, .L648
-	.loc 1 2417 0
+	.loc 1 2420 0
 	adrp	x24, .LANCHOR0
 	mov	x20, x0
-	.loc 1 2419 0
+	.loc 1 2422 0
 	adrp	x1, .LC25
 	mov	w2, 0
-	.loc 1 2417 0
+	.loc 1 2420 0
 	str	x0, [x24, #:lo12:.LANCHOR0]
-	.loc 1 2419 0
+	.loc 1 2422 0
 	add	x1, x1, :lo12:.LC25
 	ldr	x0, [x22, 752]
-	.loc 1 2416 0
-	str	x22, [x20]
 	.loc 1 2419 0
+	str	x22, [x20]
+	.loc 1 2422 0
 	bl	of_parse_phandle
 .LVL525:
-	.loc 1 2420 0
+	.loc 1 2423 0
 	cbz	x0, .L693
-	.loc 1 2425 0
+	.loc 1 2428 0
 	bl	of_find_device_by_node
 .LVL526:
-	.loc 1 2427 0
+	.loc 1 2430 0
 	cbz	x0, .L602
-.LBB1582:
-.LBB1583:
-.LBB1584:
+.LBB1574:
+.LBB1575:
+.LBB1576:
 	.loc 2 1181 0
 	ldr	x0, [x0, 200]
 .LVL527:
-.LBE1584:
-.LBE1583:
-.LBE1582:
-	.loc 1 2430 0
+.LBE1576:
+.LBE1575:
+.LBE1574:
+	.loc 1 2433 0
 	str	x0, [x20, 8]
-	.loc 1 2431 0
+	.loc 1 2434 0
 	cbz	x0, .L602
-	.loc 1 2433 0
+	.loc 1 2436 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 2435 0
+	.loc 1 2438 0
 	add	x2, x29, 96
 	adrp	x1, .LC27
 	add	x1, x1, :lo12:.LC27
@@ -6307,42 +6297,42 @@ ebc_probe:
 .LVL528:
 	mov	x21, x0
 .LVL529:
-	.loc 1 2436 0
+	.loc 1 2439 0
 	ldrsw	x0, [x29, 96]
 .LVL530:
 	lsr	x0, x0, 2
 .LVL531:
 	str	w0, [x29, 96]
 .LVL532:
-	.loc 1 2437 0
+	.loc 1 2440 0
 	cmp	w0, 0
 	beq	.L603
-	.loc 1 2442 0 discriminator 1
+	.loc 1 2445 0 discriminator 1
 	mov	w19, 0
 .LVL533:
 	bgt	.L677
 	b	.L605
 	.p2align 3
 .L606:
-	.loc 1 2450 0
+	.loc 1 2453 0
 	bl	of_find_i2c_device_by_node
 .LVL534:
-	.loc 1 2452 0
+	.loc 1 2455 0
 	cbz	x0, .L694
-.LBB1585:
-.LBB1586:
-.LBB1587:
+.LBB1577:
+.LBB1578:
+.LBB1579:
 	.loc 2 1181 0
 	ldr	x0, [x0, 216]
 .LVL535:
-.LBE1587:
-.LBE1586:
-.LBE1585:
-	.loc 1 2457 0
+.LBE1579:
+.LBE1578:
+.LBE1577:
+	.loc 1 2460 0
 	str	x0, [x20, 16]
-	.loc 1 2458 0
+	.loc 1 2461 0
 	cbnz	x0, .L695
-	.loc 1 2442 0 discriminator 2
+	.loc 1 2445 0 discriminator 2
 	ldr	w0, [x29, 96]
 	add	w19, w19, 1
 .LVL536:
@@ -6350,24 +6340,24 @@ ebc_probe:
 	ble	.L610
 .L677:
 	ldr	w0, [x21], 4
-	.loc 1 2444 0
+	.loc 1 2447 0
 	rev	w0, w0
 	bl	of_find_node_by_phandle
 .LVL537:
-	.loc 1 2445 0
+	.loc 1 2448 0
 	cbnz	x0, .L606
-	.loc 1 2446 0
+	.loc 1 2449 0
 	adrp	x1, .LC29
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC29
-	.loc 1 2447 0
+	.loc 1 2450 0
 	mov	w25, -19
-	.loc 1 2446 0
+	.loc 1 2449 0
 	bl	_dev_err
 .LVL538:
 	.p2align 2
 .L598:
-	.loc 1 2523 0
+	.loc 1 2526 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w25
 .LVL539:
@@ -6405,7 +6395,7 @@ ebc_probe:
 	.p2align 3
 .L695:
 	.cfi_restore_state
-	.loc 1 2459 0
+	.loc 1 2462 0
 	adrp	x1, .LC31
 	mov	w2, w19
 	add	x1, x1, :lo12:.LC31
@@ -6413,65 +6403,65 @@ ebc_probe:
 	bl	_dev_info
 .LVL546:
 .L605:
-	.loc 1 2464 0
+	.loc 1 2467 0
 	ldr	x0, [x20, 16]
 	cbz	x0, .L610
-	.loc 1 2470 0
+	.loc 1 2473 0
 	add	x19, x20, 184
 .LVL547:
-	.loc 1 2472 0
+	.loc 1 2475 0
 	add	x21, x20, 24
 .LVL548:
-	.loc 1 2470 0
+	.loc 1 2473 0
 	str	x22, [x19, 104]
-.LBB1588:
-.LBB1589:
-.LBB1590:
-.LBB1591:
-.LBB1592:
+.LBB1580:
+.LBB1581:
+.LBB1582:
+.LBB1583:
+.LBB1584:
 	.file 14 "./include/linux/of.h"
 	.loc 14 499 0
 	adrp	x1, .LC33
-.LBE1592:
-.LBE1591:
-.LBE1590:
-.LBE1589:
-.LBE1588:
-	.loc 1 2472 0
+.LBE1584:
+.LBE1583:
+.LBE1582:
+.LBE1581:
+.LBE1580:
+	.loc 1 2475 0
 	str	x22, [x20, 24]
-.LBB1662:
-.LBB1659:
-.LBB1599:
-.LBB1596:
-.LBB1593:
+.LBB1654:
+.LBB1651:
+.LBB1591:
+.LBB1588:
+.LBB1585:
 	.loc 14 499 0
 	mov	x4, 0
-.LBE1593:
-.LBE1596:
-.LBE1599:
-.LBE1659:
-.LBE1662:
-	.loc 1 2473 0
+.LBE1585:
+.LBE1588:
+.LBE1591:
+.LBE1651:
+.LBE1654:
+	.loc 1 2476 0
 	ldr	x2, [x20, 8]
-.LBB1663:
-.LBB1660:
-.LBB1600:
-.LBB1597:
-.LBB1594:
+.LBB1655:
+.LBB1652:
+.LBB1592:
+.LBB1589:
+.LBB1586:
 	.loc 14 499 0
 	add	x1, x1, :lo12:.LC33
-.LBE1594:
-.LBE1597:
-.LBE1600:
-.LBE1660:
-.LBE1663:
-	.loc 1 2474 0
+.LBE1586:
+.LBE1589:
+.LBE1592:
+.LBE1652:
+.LBE1655:
+	.loc 1 2477 0
 	stp	x2, x0, [x21, 8]
-.LBB1664:
-.LBB1661:
-.LBB1601:
-.LBB1598:
-.LBB1595:
+.LBB1656:
+.LBB1653:
+.LBB1593:
+.LBB1590:
+.LBB1587:
 	.loc 14 499 0
 	mov	x3, 1
 	ldr	x0, [x22, 752]
@@ -6480,12 +6470,12 @@ ebc_probe:
 .LVL549:
 	.loc 14 501 0
 	tbnz	w0, #31, .L612
-.LBE1595:
-.LBE1598:
-.LBE1601:
-.LBB1602:
-.LBB1603:
-.LBB1604:
+.LBE1587:
+.LBE1590:
+.LBE1593:
+.LBB1594:
+.LBB1595:
+.LBB1596:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC57
@@ -6497,12 +6487,12 @@ ebc_probe:
 .LVL550:
 	.loc 14 501 0
 	tbnz	w0, #31, .L612
-.LBE1604:
-.LBE1603:
-.LBE1602:
-.LBB1605:
-.LBB1606:
-.LBB1607:
+.LBE1596:
+.LBE1595:
+.LBE1594:
+.LBB1597:
+.LBB1598:
+.LBB1599:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC58
@@ -6514,12 +6504,12 @@ ebc_probe:
 .LVL551:
 	.loc 14 501 0
 	tbnz	w0, #31, .L612
-.LBE1607:
-.LBE1606:
-.LBE1605:
-.LBB1608:
-.LBB1609:
-.LBB1610:
+.LBE1599:
+.LBE1598:
+.LBE1597:
+.LBB1600:
+.LBB1601:
+.LBB1602:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC59
@@ -6531,12 +6521,12 @@ ebc_probe:
 .LVL552:
 	.loc 14 501 0
 	tbnz	w0, #31, .L612
-.LBE1610:
-.LBE1609:
-.LBE1608:
-.LBB1611:
-.LBB1612:
-.LBB1613:
+.LBE1602:
+.LBE1601:
+.LBE1600:
+.LBB1603:
+.LBB1604:
+.LBB1605:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC60
@@ -6548,12 +6538,12 @@ ebc_probe:
 .LVL553:
 	.loc 14 501 0
 	tbnz	w0, #31, .L612
-.LBE1613:
-.LBE1612:
-.LBE1611:
-.LBB1614:
-.LBB1615:
-.LBB1616:
+.LBE1605:
+.LBE1604:
+.LBE1603:
+.LBB1606:
+.LBB1607:
+.LBB1608:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC61
@@ -6565,12 +6555,12 @@ ebc_probe:
 .LVL554:
 	.loc 14 501 0
 	tbnz	w0, #31, .L612
-.LBE1616:
-.LBE1615:
-.LBE1614:
-.LBB1617:
-.LBB1618:
-.LBB1619:
+.LBE1608:
+.LBE1607:
+.LBE1606:
+.LBB1609:
+.LBB1610:
+.LBB1611:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC62
@@ -6582,12 +6572,12 @@ ebc_probe:
 .LVL555:
 	.loc 14 501 0
 	tbnz	w0, #31, .L612
-.LBE1619:
-.LBE1618:
-.LBE1617:
-.LBB1620:
-.LBB1621:
-.LBB1622:
+.LBE1611:
+.LBE1610:
+.LBE1609:
+.LBB1612:
+.LBB1613:
+.LBB1614:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC63
@@ -6599,12 +6589,12 @@ ebc_probe:
 .LVL556:
 	.loc 14 501 0
 	tbnz	w0, #31, .L612
-.LBE1622:
-.LBE1621:
-.LBE1620:
-.LBB1623:
-.LBB1624:
-.LBB1625:
+.LBE1614:
+.LBE1613:
+.LBE1612:
+.LBB1615:
+.LBB1616:
+.LBB1617:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC64
@@ -6616,12 +6606,12 @@ ebc_probe:
 .LVL557:
 	.loc 14 501 0
 	tbnz	w0, #31, .L612
-.LBE1625:
-.LBE1624:
-.LBE1623:
-.LBB1626:
-.LBB1627:
-.LBB1628:
+.LBE1617:
+.LBE1616:
+.LBE1615:
+.LBB1618:
+.LBB1619:
+.LBB1620:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC65
@@ -6633,12 +6623,12 @@ ebc_probe:
 .LVL558:
 	.loc 14 501 0
 	tbnz	w0, #31, .L612
-.LBE1628:
-.LBE1627:
-.LBE1626:
-.LBB1629:
-.LBB1630:
-.LBB1631:
+.LBE1620:
+.LBE1619:
+.LBE1618:
+.LBB1621:
+.LBB1622:
+.LBB1623:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC66
@@ -6650,12 +6640,12 @@ ebc_probe:
 .LVL559:
 	.loc 14 501 0
 	tbnz	w0, #31, .L612
-.LBE1631:
-.LBE1630:
-.LBE1629:
-.LBB1632:
-.LBB1633:
-.LBB1634:
+.LBE1623:
+.LBE1622:
+.LBE1621:
+.LBB1624:
+.LBB1625:
+.LBB1626:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC67
@@ -6667,12 +6657,12 @@ ebc_probe:
 .LVL560:
 	.loc 14 501 0
 	tbnz	w0, #31, .L612
-.LBE1634:
-.LBE1633:
-.LBE1632:
-.LBB1635:
-.LBB1636:
-.LBB1637:
+.LBE1626:
+.LBE1625:
+.LBE1624:
+.LBB1627:
+.LBB1628:
+.LBB1629:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC68
@@ -6684,12 +6674,12 @@ ebc_probe:
 .LVL561:
 	.loc 14 501 0
 	tbnz	w0, #31, .L612
-.LBE1637:
-.LBE1636:
-.LBE1635:
-.LBB1638:
-.LBB1639:
-.LBB1640:
+.LBE1629:
+.LBE1628:
+.LBE1627:
+.LBB1630:
+.LBB1631:
+.LBB1632:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC69
@@ -6701,12 +6691,12 @@ ebc_probe:
 .LVL562:
 	.loc 14 501 0
 	tbnz	w0, #31, .L612
-.LBE1640:
-.LBE1639:
-.LBE1638:
-.LBB1641:
-.LBB1642:
-.LBB1643:
+.LBE1632:
+.LBE1631:
+.LBE1630:
+.LBB1633:
+.LBB1634:
+.LBB1635:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC70
@@ -6718,12 +6708,12 @@ ebc_probe:
 .LVL563:
 	.loc 14 501 0
 	tbnz	w0, #31, .L612
-.LBE1643:
-.LBE1642:
-.LBE1641:
-.LBB1644:
-.LBB1645:
-.LBB1646:
+.LBE1635:
+.LBE1634:
+.LBE1633:
+.LBB1636:
+.LBB1637:
+.LBB1638:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC71
@@ -6735,15 +6725,15 @@ ebc_probe:
 .LVL564:
 	.loc 14 501 0
 	tbz	w0, #31, .L638
-.LBE1646:
-.LBE1645:
-.LBE1644:
-	.loc 1 1738 0
+.LBE1638:
+.LBE1637:
+.LBE1636:
+	.loc 1 1739 0
 	str	wzr, [x21, 148]
 .L638:
-.LBB1647:
-.LBB1648:
-.LBB1649:
+.LBB1639:
+.LBB1640:
+.LBB1641:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC34
@@ -6755,15 +6745,15 @@ ebc_probe:
 .LVL565:
 	.loc 14 501 0
 	tbz	w0, #31, .L639
-.LBE1649:
-.LBE1648:
-.LBE1647:
-	.loc 1 1741 0
+.LBE1641:
+.LBE1640:
+.LBE1639:
+	.loc 1 1742 0
 	str	wzr, [x21, 152]
 .L639:
-.LBB1650:
-.LBB1651:
-.LBB1652:
+.LBB1642:
+.LBB1643:
+.LBB1644:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC35
@@ -6775,15 +6765,15 @@ ebc_probe:
 .LVL566:
 	.loc 14 501 0
 	tbz	w0, #31, .L640
-.LBE1652:
-.LBE1651:
-.LBE1650:
-	.loc 1 1744 0
+.LBE1644:
+.LBE1643:
+.LBE1642:
+	.loc 1 1745 0
 	str	wzr, [x21, 156]
 .L640:
-.LBB1653:
-.LBB1654:
-.LBB1655:
+.LBB1645:
+.LBB1646:
+.LBB1647:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC36
@@ -6795,15 +6785,15 @@ ebc_probe:
 .LVL567:
 	.loc 14 501 0
 	tbz	w0, #31, .L641
-.LBE1655:
-.LBE1654:
-.LBE1653:
-	.loc 1 1747 0
+.LBE1647:
+.LBE1646:
+.LBE1645:
+	.loc 1 1748 0
 	str	wzr, [x21, 92]
 .L641:
-.LBB1656:
-.LBB1657:
-.LBB1658:
+.LBB1648:
+.LBB1649:
+.LBB1650:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC37
@@ -6815,94 +6805,94 @@ ebc_probe:
 .LVL568:
 	.loc 14 501 0
 	tbz	w0, #31, .L642
-.LBE1658:
-.LBE1657:
-.LBE1656:
-	.loc 1 1750 0
+.LBE1650:
+.LBE1649:
+.LBE1648:
+	.loc 1 1751 0
 	str	wzr, [x21, 96]
 .L642:
-.LBE1661:
-.LBE1664:
-	.loc 1 2482 0
+.LBE1653:
+.LBE1656:
+	.loc 1 2485 0
 	ldr	w0, [x21, 88]
-.LBB1665:
-.LBB1666:
-	.loc 1 2199 0
+.LBB1657:
+.LBB1658:
+	.loc 1 2200 0
 	mov	w2, 0
-.LBE1666:
-.LBE1665:
-	.loc 1 2482 0
+.LBE1658:
+.LBE1657:
+	.loc 1 2485 0
 	str	w0, [x19, 68]
-	.loc 1 2483 0
+	.loc 1 2486 0
 	ldr	w1, [x21, 84]
 	str	w1, [x19, 72]
-	.loc 1 2486 0
+	.loc 1 2489 0
 	tst	x1, 15
-	.loc 1 2484 0
+	.loc 1 2487 0
 	mul	w0, w0, w1
-	.loc 1 2486 0
+	.loc 1 2489 0
 	cset	w1, eq
 	str	w1, [x19, 88]
-.LBB1690:
-.LBB1685:
-	.loc 1 2199 0
+.LBB1682:
+.LBB1677:
+	.loc 1 2200 0
 	adrp	x1, .LC38
 	add	x1, x1, :lo12:.LC38
-.LBE1685:
-.LBE1690:
-	.loc 1 2484 0
+.LBE1677:
+.LBE1682:
+	.loc 1 2487 0
 	lsr	w3, w0, 1
-	.loc 1 2485 0
+	.loc 1 2488 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x19, 20]
-.LBB1691:
-.LBB1686:
-	.loc 1 2190 0
+.LBB1683:
+.LBB1678:
+	.loc 1 2191 0
 	ldr	x26, [x20]
 .LVL569:
-	.loc 1 2199 0
+	.loc 1 2200 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL570:
-	.loc 1 2200 0
+	.loc 1 2201 0
 	cbz	x0, .L649
-	.loc 1 2203 0
+	.loc 1 2204 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL571:
 	mov	w25, w0
-	.loc 1 2205 0
+	.loc 1 2206 0
 	cbnz	w0, .L697
-.LBB1667:
-.LBB1668:
+.LBB1659:
+.LBB1660:
 	.file 15 "./include/linux/ioport.h"
 	.loc 15 204 0
 	ldp	x1, x2, [x29, 104]
-.LBE1668:
-.LBE1667:
-	.loc 1 2210 0
+.LBE1660:
+.LBE1659:
+	.loc 1 2211 0
 	str	x1, [x20, 184]
-	.loc 1 2213 0
+	.loc 1 2214 0
 	mov	x3, 1
 	mov	x0, x26
-.LBB1670:
-.LBB1669:
+.LBB1662:
+.LBB1661:
 	.loc 15 204 0
 	add	x2, x2, 1
 	sub	x2, x2, x1
-.LBE1669:
-.LBE1670:
-	.loc 1 2211 0
+.LBE1661:
+.LBE1662:
+	.loc 1 2212 0
 	str	w2, [x19, 16]
-	.loc 1 2213 0
+	.loc 1 2214 0
 	sxtw	x2, w2
 	bl	devm_memremap
 .LVL572:
 	str	x0, [x19, 8]
-	.loc 1 2215 0
+	.loc 1 2216 0
 	cbz	x0, .L620
-	.loc 1 2223 0
+	.loc 1 2224 0
 	mov	x1, x0
 	ldr	w2, [x19, 16]
 	ldr	x0, [x20, 184]
@@ -6910,68 +6900,68 @@ ebc_probe:
 	mov	w3, 2097152
 	bl	ebc_buf_init
 .LVL573:
-	.loc 1 2224 0
+	.loc 1 2225 0
 	cbnz	w0, .L620
-	.loc 1 2229 0
-	ldr	x0, [x19, 8]
 	.loc 1 2230 0
+	ldr	x0, [x19, 8]
+	.loc 1 2231 0
 	mov	x5, 1048576
 	str	x5, [x21, 40]
-.LBB1671:
-.LBB1672:
+.LBB1663:
+.LBB1664:
 	.loc 2 711 0
 	mov	w2, 32960
-.LBE1672:
-.LBE1671:
-	.loc 1 2229 0
+.LBE1664:
+.LBE1663:
+	.loc 1 2230 0
 	add	x6, x0, 10485760
 	str	x6, [x21, 24]
 	add	x4, x0, 11534336
-	.loc 1 2235 0
+	.loc 1 2236 0
 	add	x1, x0, 12582912
-	.loc 1 2231 0
+	.loc 1 2232 0
 	ldr	x3, [x20, 184]
-.LBB1676:
-.LBB1673:
+.LBB1668:
+.LBB1665:
 	.loc 2 711 0
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
-.LBE1673:
-.LBE1676:
-	.loc 1 2231 0
+.LBE1665:
+.LBE1668:
+	.loc 1 2232 0
 	add	x7, x3, 10485760
 	str	x7, [x21, 32]
-	.loc 1 2232 0
+	.loc 1 2233 0
 	str	x6, [x19, 184]
-	.loc 1 2231 0
+	.loc 1 2232 0
 	add	x3, x3, 11534336
-	.loc 1 2230 0
-	str	x5, [x21, 64]
 	.loc 1 2231 0
+	str	x5, [x21, 64]
+	.loc 1 2232 0
 	stp	x4, x3, [x21, 48]
-	.loc 1 2235 0
+	.loc 1 2236 0
 	str	x1, [x19, 128]
-.LBB1677:
-.LBB1674:
+.LBB1669:
+.LBB1666:
 	.loc 2 711 0
 	ldrsw	x1, [x19, 20]
-.LBE1674:
-.LBE1677:
-	.loc 1 2232 0
+.LBE1666:
+.LBE1669:
+	.loc 1 2233 0
 	str	x4, [x19, 192]
-.LBB1678:
-.LBB1675:
+.LBB1670:
+.LBB1667:
 	.loc 2 711 0
 	bl	devm_kmalloc
 .LVL574:
-.LBE1675:
-.LBE1678:
-	.loc 1 2238 0
-	str	x0, [x19, 144]
+.LBE1667:
+.LBE1670:
 	.loc 1 2239 0
+	str	x0, [x19, 144]
+	.loc 1 2240 0
 	cbz	x0, .L620
-.LBB1679:
-.LBB1680:
+.LBB1671:
+.LBB1672:
 	.loc 2 711 0
 	ldrsw	x1, [x19, 20]
 	mov	w2, 32960
@@ -6979,14 +6969,14 @@ ebc_probe:
 	mov	x0, x26
 	bl	devm_kmalloc
 .LVL575:
-.LBE1680:
-.LBE1679:
-	.loc 1 2241 0
-	str	x0, [x19, 152]
+.LBE1672:
+.LBE1671:
 	.loc 1 2242 0
+	str	x0, [x19, 152]
+	.loc 1 2243 0
 	cbz	x0, .L620
-.LBB1681:
-.LBB1682:
+.LBB1673:
+.LBB1674:
 	.loc 2 711 0
 	ldrsw	x1, [x19, 20]
 	mov	w2, 32960
@@ -6994,16 +6984,16 @@ ebc_probe:
 	mov	x0, x26
 	bl	devm_kmalloc
 .LVL576:
-.LBE1682:
-.LBE1681:
-	.loc 1 2244 0
-	str	x0, [x19, 160]
+.LBE1674:
+.LBE1673:
 	.loc 1 2245 0
+	str	x0, [x19, 160]
+	.loc 1 2246 0
 	cbz	x0, .L620
-	.loc 1 2252 0
+	.loc 1 2253 0
 	ldp	w1, w0, [x21, 84]
-.LBB1683:
-.LBB1684:
+.LBB1675:
+.LBB1676:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
@@ -7011,228 +7001,243 @@ ebc_probe:
 	mov	x0, x26
 	bl	devm_kmalloc
 .LVL577:
-.LBE1684:
-.LBE1683:
-	.loc 1 2252 0
-	str	x0, [x19, 168]
+.LBE1676:
+.LBE1675:
 	.loc 1 2253 0
+	str	x0, [x19, 168]
+	.loc 1 2254 0
 	cbz	x0, .L620
-	.loc 1 2255 0
+	.loc 1 2256 0
 	ldp	w2, w1, [x21, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
 .LVL578:
-	.loc 1 2256 0
+	.loc 1 2257 0
 	ldrsw	x2, [x19, 20]
 	mov	w1, 255
 	ldr	x0, [x19, 160]
 	bl	memset
 .LVL579:
-.LBE1686:
-.LBE1691:
-.LBB1692:
-.LBB1693:
-	.loc 1 2147 0
+.LBE1678:
+.LBE1683:
+.LBB1684:
+.LBB1685:
+	.loc 1 2148 0
 	ldr	x26, [x19, 104]
 .LVL580:
-	.loc 1 2153 0
+	.loc 1 2154 0
 	adrp	x1, .LC40
 	mov	w2, 0
 	add	x1, x1, :lo12:.LC40
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL581:
-	.loc 1 2154 0
+	.loc 1 2155 0
 	cbz	x0, .L650
-	.loc 1 2157 0
+	.loc 1 2158 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL582:
 	mov	w25, w0
-	.loc 1 2159 0
+	.loc 1 2160 0
 	cbz	w0, .L698
 .L621:
-.LBE1693:
-.LBE1692:
-	.loc 1 2498 0
+.LBE1685:
+.LBE1684:
+	.loc 1 2501 0
 	adrp	x1, .LC73
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC73
 	bl	_dev_err
 .LVL583:
-	.loc 1 2499 0
+	.loc 1 2502 0
 	b	.L598
 .LVL584:
 	.p2align 3
 .L612:
-	.loc 1 2480 0
+	.loc 1 2483 0
 	mov	w25, -22
-	.loc 1 2479 0
-	adrp	x1, .LC77
+	.loc 1 2482 0
+	adrp	x1, .LC79
 	mov	w2, w25
-	add	x1, x1, :lo12:.LC77
+	add	x1, x1, :lo12:.LC79
 	mov	x0, x22
 	bl	_dev_err
 .LVL585:
-	.loc 1 2480 0
+	.loc 1 2483 0
 	b	.L598
 .LVL586:
 	.p2align 3
 .L694:
-	.loc 1 2453 0
+	.loc 1 2456 0
 	adrp	x1, .LC30
 	mov	x0, x22
 .LVL587:
 	add	x1, x1, :lo12:.LC30
-	.loc 1 2454 0
+	.loc 1 2457 0
 	mov	w25, -19
-	.loc 1 2453 0
+	.loc 1 2456 0
 	bl	_dev_err
 .LVL588:
-	.loc 1 2454 0
+	.loc 1 2457 0
 	b	.L598
 .LVL589:
 	.p2align 3
 .L610:
-	.loc 1 2465 0
+	.loc 1 2468 0
 	adrp	x1, .LC32
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC32
-	.loc 1 2466 0
+	.loc 1 2469 0
 	mov	w25, -517
-	.loc 1 2465 0
+	.loc 1 2468 0
 	bl	_dev_err
 .LVL590:
-	.loc 1 2466 0
+	.loc 1 2469 0
 	b	.L598
 .LVL591:
 	.p2align 3
 .L697:
-.LBB1702:
-.LBB1687:
-	.loc 1 2206 0
+.LBB1694:
+.LBB1679:
+	.loc 1 2207 0
 	adrp	x1, .LC39
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC39
 	bl	_dev_err
 .LVL592:
 .L617:
-.LBE1687:
-.LBE1702:
-	.loc 1 2491 0
+.LBE1679:
+.LBE1694:
+	.loc 1 2494 0
 	adrp	x1, .LC72
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC72
 	bl	_dev_err
 .LVL593:
-	.loc 1 2492 0
+	.loc 1 2495 0
 	b	.L598
 .LVL594:
 .L698:
-.LBB1703:
-.LBB1698:
-	.loc 1 2168 0
+.LBB1695:
+.LBB1690:
+	.loc 1 2169 0
 	mov	x0, x26
 	mov	x3, 1
-.LBB1694:
-.LBB1695:
+.LBB1686:
+.LBB1687:
 	.loc 15 204 0
 	ldp	x1, x26, [x29, 104]
 .LVL595:
-.LBE1695:
-.LBE1694:
-	.loc 1 2165 0
+.LBE1687:
+.LBE1686:
+	.loc 1 2166 0
 	str	x1, [x19, 32]
-.LBB1697:
-.LBB1696:
+.LBB1689:
+.LBB1688:
 	.loc 15 204 0
 	add	x26, x26, 1
 	sub	x26, x26, x1
-.LBE1696:
-.LBE1697:
-	.loc 1 2166 0
+.LBE1688:
+.LBE1689:
+	.loc 1 2167 0
 	str	w26, [x19, 40]
-	.loc 1 2168 0
+	.loc 1 2169 0
 	sxtw	x2, w26
 	bl	devm_memremap
 .LVL596:
 	str	x0, [x19, 208]
-	.loc 1 2170 0
+	.loc 1 2171 0
 	cbz	x0, .L699
-	.loc 1 2175 0
+	.loc 1 2176 0
 	bl	epd_lut_from_mem_init
 .LVL597:
-	.loc 1 2176 0
+	.loc 1 2177 0
 	tbnz	w0, #31, .L700
 .L623:
-.LBE1698:
-.LBE1703:
-.LBB1704:
-.LBB1705:
-	.loc 1 2265 0
+.LBE1690:
+.LBE1695:
+.LBB1696:
+.LBB1697:
+	.loc 1 2266 0
 	add	x0, x20, 752
 	mov	x1, 68719476704
 	str	x1, [x19, 560]
-	.loc 1 2267 0
+	.loc 1 2270 0
 	add	x24, x24, :lo12:.LANCHOR0
-.LBB1706:
-.LBB1707:
-.LBB1708:
-.LBB1709:
-.LBB1710:
+.LBB1698:
+.LBB1699:
+.LBB1700:
+.LBB1701:
+.LBB1702:
 	.loc 12 288 0
 	str	x0, [x20, 752]
-.LBE1710:
-.LBE1709:
-.LBE1708:
-.LBE1707:
-.LBE1706:
-	.loc 1 2263 0
-	mov	w26, 99
-.LBB1712:
-.LBB1711:
+.LBE1702:
+.LBE1701:
+.LBE1700:
+.LBE1699:
+.LBE1698:
+	.loc 1 2267 0
+	adrp	x5, .LC74
+.LBB1704:
+.LBB1703:
 	.file 16 "./include/linux/list.h"
 	.loc 16 29 0
 	str	x0, [x0, 8]
-.LBE1711:
-.LBE1712:
-	.loc 1 2265 0
+.LBE1703:
+.LBE1704:
+	.loc 1 2266 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x19, 584]
 	.loc 1 2267 0
-	adrp	x3, .LC74
+	add	x5, x5, :lo12:.LC74
+	mov	w1, 14
+	mov	x4, 0
+	mov	x3, 0
+	mov	w2, 1
+	movk	w1, 0xa, lsl 16
+	.loc 1 2264 0
+	mov	w26, 99
+	.loc 1 2267 0
+	adrp	x0, .LC75
+	.loc 1 2264 0
+	str	w26, [x29, 104]
+	.loc 1 2267 0
+	add	x0, x0, :lo12:.LC75
+	bl	__alloc_workqueue_key
+.LVL598:
+	str	x0, [x19, 608]
+	.loc 1 2270 0
+	adrp	x3, .LC76
 	mov	w2, -1
-	add	x3, x3, :lo12:.LC74
+	add	x3, x3, :lo12:.LC76
 	mov	x1, x19
 	adrp	x0, ebc_auto_tast_function
-	.loc 1 2263 0
-	str	w26, [x29, 104]
-	.loc 1 2267 0
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
-.LVL598:
+.LVL599:
 	str	x0, [x24, 8]
-	.loc 1 2268 0
+	.loc 1 2271 0
 	cmn	x0, #4096
 	bhi	.L701
-	.loc 1 2272 0
+	.loc 1 2275 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
-.LVL599:
-	.loc 1 2273 0
+.LVL600:
+	.loc 1 2276 0
 	ldr	x2, [x24, 8]
-.LBB1713:
-.LBB1714:
+.LBB1705:
+.LBB1706:
 	.file 17 "./arch/arm64/include/asm/atomic_lse.h"
 	.loc 17 47 0
 	mov	w0, 1
-.LVL600:
-	add	x1, x2, 48
 .LVL601:
+	add	x1, x2, 48
+.LVL602:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -7260,49 +7265,49 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL602:
+.LVL603:
 #NO_APP
-.LBE1714:
-.LBE1713:
-.LBB1715:
-	.loc 1 2276 0
+.LBE1706:
+.LBE1705:
+.LBB1707:
+	.loc 1 2279 0
 	adrp	x3, .LC45
 	adrp	x0, ebc_thread
-.LVL603:
+.LVL604:
 	add	x3, x3, :lo12:.LC45
 	mov	w2, -1
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x19
-.LBE1715:
-	.loc 1 2275 0
+.LBE1707:
+	.loc 1 2278 0
 	str	w26, [x29, 104]
-.LBB1716:
-	.loc 1 2276 0
+.LBB1708:
+	.loc 1 2279 0
 	bl	kthread_create_on_node
-.LVL604:
-	mov	x24, x0
 .LVL605:
+	mov	x24, x0
+.LVL606:
 	cmn	x0, #4096
 	bhi	.L625
 	bl	wake_up_process
-.LVL606:
-.LBE1716:
+.LVL607:
+.LBE1708:
 	str	x24, [x19, 136]
-	.loc 1 2281 0
+	.loc 1 2284 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x24
 	bl	sched_setscheduler_nocheck
-.LVL607:
-	.loc 1 2282 0
+.LVL608:
+	.loc 1 2285 0
 	ldr	x2, [x19, 136]
-.LBB1717:
-.LBB1718:
+.LBB1709:
+.LBB1710:
 	.loc 17 47 0
 	mov	w0, 1
-.LVL608:
-	add	x1, x2, 48
 .LVL609:
+	add	x1, x2, 48
+.LVL610:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -7330,62 +7335,62 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL610:
+.LVL611:
 #NO_APP
-.LBE1718:
-.LBE1717:
-.LBE1705:
-.LBE1704:
-.LBB1721:
-.LBB1722:
-	.loc 1 2291 0
+.LBE1710:
+.LBE1709:
+.LBE1697:
+.LBE1696:
+.LBB1713:
+.LBB1714:
+	.loc 1 2294 0
 	mov	w0, -1
-.LVL611:
+.LVL612:
 	str	w0, [x19, 64]
-.LBB1723:
-.LBB1724:
+.LBB1715:
+.LBB1716:
 	.loc 4 39 0
 	add	x0, x20, 416
-.LVL612:
-.LBE1724:
-.LBE1723:
-	.loc 1 2295 0
+.LVL613:
+.LBE1716:
+.LBE1715:
+	.loc 1 2298 0
 	str	wzr, [x19, 44]
-	.loc 1 2294 0
+	.loc 1 2297 0
 	str	wzr, [x19, 96]
-.LBB1729:
-.LBB1725:
+.LBB1721:
+.LBB1717:
 	.loc 4 43 0
 	adrp	x1, .LC46
-.LBE1725:
-.LBE1729:
-	.loc 1 2290 0
+.LBE1717:
+.LBE1721:
+	.loc 1 2293 0
 	str	wzr, [x19, 200]
-.LBB1730:
-.LBB1726:
+.LBB1722:
+.LBB1718:
 	.loc 4 43 0
 	add	x1, x1, :lo12:.LC46
-.LBE1726:
-.LBE1730:
-	.loc 1 2292 0
-	str	wzr, [x19, 608]
-	.loc 1 2302 0
+.LBE1718:
+.LBE1722:
+	.loc 1 2295 0
+	str	wzr, [x19, 616]
+	.loc 1 2305 0
 	add	x24, x20, 632
-.LVL613:
-	.loc 1 2293 0
-	str	wzr, [x19, 612]
-	.loc 1 2303 0
+.LVL614:
+	.loc 1 2296 0
+	str	wzr, [x19, 620]
+	.loc 1 2306 0
 	adrp	x26, jiffies
-.LBB1731:
-.LBB1727:
+.LBB1723:
+.LBB1719:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0]
-.LBE1727:
-.LBE1731:
-	.loc 1 2303 0
+.LBE1719:
+.LBE1723:
+	.loc 1 2306 0
 	mov	x27, 268435455
-.LBB1732:
-.LBB1728:
+.LBB1724:
+.LBB1720:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0, 16]
 	stp	xzr, xzr, [x0, 32]
@@ -7403,12 +7408,12 @@ ebc_probe:
 	str	x1, [x20, 416]
 	.loc 4 45 0
 	bl	wakeup_source_add
-.LVL614:
-.LBE1728:
-.LBE1732:
-	.loc 1 2299 0
-	str	wzr, [x19, 440]
+.LVL615:
+.LBE1720:
+.LBE1724:
 	.loc 1 2302 0
+	str	wzr, [x19, 440]
+	.loc 1 2305 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -7416,17 +7421,17 @@ ebc_probe:
 	adrp	x1, ebc_vdd_power_timeout
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
-.LVL615:
-	.loc 1 2303 0
+.LVL616:
+	.loc 1 2306 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
-	.loc 1 2306 0
+	.loc 1 2309 0
 	add	x24, x20, 688
-	.loc 1 2303 0
+	.loc 1 2306 0
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL616:
-	.loc 1 2306 0
+.LVL617:
+	.loc 1 2309 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -7434,613 +7439,613 @@ ebc_probe:
 	adrp	x1, ebc_frame_timeout
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
-.LVL617:
-	.loc 1 2307 0
+.LVL618:
+	.loc 1 2310 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL618:
-.LBE1722:
-.LBE1721:
-.LBB1733:
-.LBB1734:
-	.loc 1 2317 0
+.LVL619:
+.LBE1714:
+.LBE1713:
+.LBB1725:
+.LBB1726:
+	.loc 1 2320 0
 	adrp	x0, saved_command_line
 	adrp	x1, .LC47
-	.loc 1 2314 0
-	stp	wzr, wzr, [x29, 100]
-.LVL619:
 	.loc 1 2317 0
+	stp	wzr, wzr, [x29, 100]
+.LVL620:
+	.loc 1 2320 0
 	add	x1, x1, :lo12:.LC47
 	ldr	x24, [x0, #:lo12:saved_command_line]
 	mov	x0, x24
 	bl	strstr
-.LVL620:
-	.loc 1 2318 0
+.LVL621:
+	.loc 1 2321 0
 	adrp	x1, .LC48
-	.loc 1 2317 0
+	.loc 1 2320 0
 	mov	x26, x0
-.LVL621:
-	.loc 1 2318 0
+.LVL622:
+	.loc 1 2321 0
 	add	x1, x1, :lo12:.LC48
 	mov	x0, x24
 	bl	strstr
-.LVL622:
-	mov	x28, x0
 .LVL623:
-	.loc 1 2323 0
+	mov	x28, x0
+.LVL624:
+	.loc 1 2326 0
 	cbz	x26, .L626
-	.loc 1 2324 0
+	.loc 1 2327 0
 	add	x2, x29, 100
 	adrp	x1, .LC49
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC49
 	bl	sscanf
-.LVL624:
-	.loc 1 2325 0
+.LVL625:
+	.loc 1 2328 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
 	bls	.L702
 .L626:
-	.loc 1 2337 0
+	.loc 1 2340 0
 	mov	w24, 0
-.LVL625:
-	mov	x27, 0
 .LVL626:
-	.loc 1 2321 0
-	mov	x26, 0
+	mov	x27, 0
 .LVL627:
-	.loc 1 2337 0
-	cbz	x28, .L646
+	.loc 1 2324 0
+	mov	x26, 0
 .LVL628:
+	.loc 1 2340 0
+	cbz	x28, .L646
+.LVL629:
 .L645:
-	.loc 1 2338 0
+	.loc 1 2341 0
 	add	x2, x29, 104
 	mov	x0, x28
 	adrp	x1, .LC52
 	add	x1, x1, :lo12:.LC52
 	bl	sscanf
-.LVL629:
-	.loc 1 2316 0
-	mov	w28, 0
 .LVL630:
-	.loc 1 2339 0
+	.loc 1 2319 0
+	mov	w28, 0
+.LVL631:
+	.loc 1 2342 0
 	ldr	w2, [x29, 104]
-	.loc 1 2321 0
+	.loc 1 2324 0
 	mov	x26, 0
-.LVL631:
-	.loc 1 2339 0
+.LVL632:
+	.loc 1 2342 0
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
 	bls	.L703
 .L630:
-	.loc 1 2351 0
+	.loc 1 2354 0
 	cbnz	w24, .L629
-.LVL632:
+.LVL633:
 .L646:
-	.loc 1 2352 0
+	.loc 1 2355 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC55
 	add	x1, x1, :lo12:.LC55
 	bl	_dev_info
-.LVL633:
-	.loc 1 2353 0
+.LVL634:
+	.loc 1 2356 0
 	ldr	x0, [x20, 16]
 	bl	ebc_pmic_verity_vcom
-.LVL634:
-.LBB1735:
-.LBB1736:
-	.loc 1 1658 0
-	bl	ebc_empty_buf_get
 .LVL635:
-	mov	x24, x0
-.LVL636:
+.LBB1727:
+.LBB1728:
 	.loc 1 1659 0
+	bl	ebc_empty_buf_get
+.LVL636:
+	mov	x24, x0
+.LVL637:
+	.loc 1 1660 0
 	ldp	w2, w0, [x20, 108]
 	mov	w1, 255
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memset
-.LVL637:
-	.loc 1 1662 0
+.LVL638:
+	.loc 1 1663 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 1660 0
+	.loc 1 1661 0
 	mov	w0, 17
 	str	w0, [x24, 40]
-	.loc 1 1665 0
+	.loc 1 1666 0
 	mov	x0, x24
-	.loc 1 1663 0
+	.loc 1 1664 0
 	ldr	w1, [x20, 108]
 	str	w1, [x24, 56]
-	.loc 1 1664 0
+	.loc 1 1665 0
 	ldr	w1, [x20, 112]
 	str	w1, [x24, 60]
-	.loc 1 1665 0
+	.loc 1 1666 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL638:
+.LVL639:
 .L632:
-.LBE1736:
-.LBE1735:
-	.loc 1 2370 0
+.LBE1728:
+.LBE1727:
+	.loc 1 2373 0
 	cbnz	w28, .L704
 .L634:
-	.loc 1 2383 0
+	.loc 1 2386 0
 	ldr	w0, [x19, 96]
 	adrp	x21, .LANCHOR1
 	cbz	w0, .L705
 .L636:
-	.loc 1 2388 0
+	.loc 1 2391 0
 	cbz	x27, .L637
-	.loc 1 2389 0
+	.loc 1 2392 0
 	mov	x0, x27
 	bl	kfree
-.LVL639:
+.LVL640:
 .L637:
-	.loc 1 2390 0
+	.loc 1 2393 0
 	cbz	x26, .L628
-	.loc 1 2391 0
+	.loc 1 2394 0
 	mov	x0, x26
 	bl	kfree
-.LVL640:
+.LVL641:
 .L628:
-.LBE1734:
-.LBE1733:
-.LBB1747:
-.LBB1748:
-.LBB1749:
+.LBE1726:
+.LBE1725:
+.LBB1739:
+.LBB1740:
+.LBB1741:
 	.loc 2 1186 0
 	str	x20, [x22, 184]
-.LBE1749:
-.LBE1748:
-.LBE1747:
-.LBB1750:
-.LBB1751:
-	.loc 1 2130 0
+.LBE1741:
+.LBE1740:
+.LBE1739:
+.LBB1742:
+.LBB1743:
+	.loc 1 2131 0
 	add	x21, x21, :lo12:.LANCHOR1
 	add	x0, x21, 224
-	.loc 1 2131 0
+	.loc 1 2132 0
 	add	x22, x21, 512
-	.loc 1 2130 0
-	bl	misc_register
-.LVL641:
 	.loc 1 2131 0
-	add	x0, x21, 400
 	bl	misc_register
 .LVL642:
-	.loc 1 2133 0
-	ldr	x0, [x20, 288]
-	add	x1, x21, 480
-	bl	device_create_file
+	.loc 1 2132 0
+	add	x0, x21, 400
+	bl	misc_register
 .LVL643:
 	.loc 1 2134 0
 	ldr	x0, [x20, 288]
-	mov	x1, x22
+	add	x1, x21, 480
 	bl	device_create_file
 .LVL644:
 	.loc 1 2135 0
 	ldr	x0, [x20, 288]
-	add	x1, x21, 544
+	mov	x1, x22
 	bl	device_create_file
 .LVL645:
 	.loc 1 2136 0
 	ldr	x0, [x20, 288]
-	add	x1, x21, 576
+	add	x1, x21, 544
 	bl	device_create_file
 .LVL646:
 	.loc 1 2137 0
 	ldr	x0, [x20, 288]
-	add	x1, x21, 608
+	add	x1, x21, 576
 	bl	device_create_file
 .LVL647:
 	.loc 1 2138 0
 	ldr	x0, [x20, 288]
-	add	x1, x21, 640
+	add	x1, x21, 608
 	bl	device_create_file
 .LVL648:
 	.loc 1 2139 0
 	ldr	x0, [x20, 288]
-	add	x1, x21, 672
+	add	x1, x21, 640
 	bl	device_create_file
 .LVL649:
-.LBE1751:
-.LBE1750:
-	.loc 1 2520 0
+	.loc 1 2140 0
+	ldr	x0, [x20, 288]
+	add	x1, x21, 672
+	bl	device_create_file
+.LVL650:
+.LBE1743:
+.LBE1742:
+	.loc 1 2523 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LC16
 	adrp	x1, .LC56
 	add	x2, x2, :lo12:.LC16
 	add	x1, x1, :lo12:.LC56
 	bl	_dev_info
-.LVL650:
-	.loc 1 2522 0
-	b	.L598
 .LVL651:
+	.loc 1 2525 0
+	b	.L598
+.LVL652:
 .L705:
-.LBB1752:
-.LBB1743:
-	.loc 1 2384 0
+.LBB1744:
+.LBB1735:
+	.loc 1 2387 0
 	mov	w2, 1
 	str	w2, [x19, 96]
-	.loc 1 2385 0
+	.loc 1 2388 0
 	add	x0, x21, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL652:
-	b	.L636
 .LVL653:
+	b	.L636
+.LVL654:
 .L702:
-	.loc 1 2327 0
+	.loc 1 2330 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC50
 	add	x1, x1, :lo12:.LC50
 	bl	_dev_info
-.LVL654:
-	.loc 1 2328 0
+.LVL655:
+	.loc 1 2331 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
-.LBB1737:
-.LBB1738:
-.LBB1739:
+.LBB1729:
+.LBB1730:
+.LBB1731:
 	.file 18 "./include/linux/slab.h"
 	.loc 18 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL655:
-	mov	x27, x0
 .LVL656:
-.LBE1739:
-.LBE1738:
-.LBE1737:
-	.loc 1 2329 0
+	mov	x27, x0
+.LVL657:
+.LBE1731:
+.LBE1730:
+.LBE1729:
+	.loc 1 2332 0
 	cbz	x0, .L706
-	.loc 1 2333 0
+	.loc 1 2336 0
 	ldp	w2, w1, [x21, 84]
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 100]
-.LVL657:
-	sub	x1, x1, x3
 .LVL658:
+	sub	x1, x1, x3
+.LVL659:
 	ldr	x3, [x19, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL659:
-	.loc 1 2337 0
+.LVL660:
+	.loc 1 2340 0
 	cbnz	x28, .L707
-	.loc 1 2316 0
+	.loc 1 2319 0
 	mov	w28, 0
-.LVL660:
-	.loc 1 2321 0
-	mov	x26, 0
 .LVL661:
+	.loc 1 2324 0
+	mov	x26, 0
+.LVL662:
 .L629:
-	.loc 1 2358 0
+	.loc 1 2361 0
 	bl	ebc_empty_buf_get
-.LVL662:
-	mov	x24, x0
 .LVL663:
-	.loc 1 2359 0
+	mov	x24, x0
+.LVL664:
+	.loc 1 2362 0
 	cbz	x0, .L632
-	.loc 1 2360 0
+	.loc 1 2363 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL664:
-	.loc 1 2363 0
+.LVL665:
+	.loc 1 2366 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2361 0
+	.loc 1 2364 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2366 0
+	.loc 1 2369 0
 	mov	x0, x24
-	.loc 1 2364 0
+	.loc 1 2367 0
 	ldr	w1, [x21, 84]
 	str	w1, [x24, 56]
-	.loc 1 2365 0
+	.loc 1 2368 0
 	ldr	w1, [x21, 88]
 	str	w1, [x24, 60]
-	.loc 1 2366 0
+	.loc 1 2369 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL665:
-	b	.L632
 .LVL666:
+	b	.L632
+.LVL667:
 .L703:
-	.loc 1 2341 0
+	.loc 1 2344 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC53
 	add	x1, x1, :lo12:.LC53
 	bl	_dev_info
-.LVL667:
-	.loc 1 2342 0
+.LVL668:
+	.loc 1 2345 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
-.LBB1740:
-.LBB1741:
-.LBB1742:
+.LBB1732:
+.LBB1733:
+.LBB1734:
 	.loc 18 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL668:
+.LVL669:
 	mov	x26, x0
-.LBE1742:
-.LBE1741:
-.LBE1740:
-	.loc 1 2343 0
+.LBE1734:
+.LBE1733:
+.LBE1732:
+	.loc 1 2346 0
 	cbz	x0, .L708
-	.loc 1 2347 0
+	.loc 1 2350 0
 	ldp	w2, w1, [x21, 84]
-	.loc 1 2340 0
+	.loc 1 2343 0
 	mov	w28, 1
-	.loc 1 2347 0
+	.loc 1 2350 0
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
-.LVL669:
-	sub	x1, x1, x3
 .LVL670:
+	sub	x1, x1, x3
+.LVL671:
 	ldr	x3, [x19, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL671:
-	b	.L630
 .LVL672:
+	b	.L630
+.LVL673:
 .L602:
-.LBE1743:
-.LBE1752:
-	.loc 1 2428 0
+.LBE1735:
+.LBE1744:
+	.loc 1 2431 0
 	mov	w25, -517
 	b	.L598
-.LVL673:
+.LVL674:
 .L620:
-.LBB1753:
-.LBB1688:
-	.loc 1 2216 0
+.LBB1745:
+.LBB1680:
+	.loc 1 2217 0
 	mov	w25, -12
 	b	.L617
-.LVL674:
+.LVL675:
 .L704:
-.LBE1688:
-.LBE1753:
-.LBB1754:
-.LBB1744:
-	.loc 1 2371 0
+.LBE1680:
+.LBE1745:
+.LBB1746:
+.LBB1736:
+	.loc 1 2374 0
 	bl	ebc_empty_buf_get
-.LVL675:
-	mov	x24, x0
 .LVL676:
-	.loc 1 2372 0
+	mov	x24, x0
+.LVL677:
+	.loc 1 2375 0
 	cbz	x0, .L634
-	.loc 1 2373 0
+	.loc 1 2376 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL677:
-	.loc 1 2376 0
+.LVL678:
+	.loc 1 2379 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2374 0
+	.loc 1 2377 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2377 0
+	.loc 1 2380 0
 	ldr	w0, [x21, 84]
 	str	w0, [x24, 56]
-	.loc 1 2379 0
+	.loc 1 2382 0
 	mov	x0, x24
-	.loc 1 2378 0
+	.loc 1 2381 0
 	ldr	w1, [x21, 88]
 	str	w1, [x24, 60]
-	.loc 1 2379 0
+	.loc 1 2382 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL678:
-	b	.L634
 .LVL679:
+	b	.L634
+.LVL680:
 .L648:
-.LBE1744:
-.LBE1754:
-	.loc 1 2414 0
+.LBE1736:
+.LBE1746:
+	.loc 1 2417 0
 	mov	w25, -12
 	b	.L598
-.LVL680:
+.LVL681:
 .L603:
-	.loc 1 2438 0
+	.loc 1 2441 0
 	adrp	x1, .LC28
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC28
-	.loc 1 2439 0
+	.loc 1 2442 0
 	mov	w25, -22
-	.loc 1 2438 0
+	.loc 1 2441 0
 	bl	_dev_err
-.LVL681:
-	.loc 1 2439 0
-	b	.L598
 .LVL682:
+	.loc 1 2442 0
+	b	.L598
+.LVL683:
 .L700:
-.LBB1755:
-.LBB1699:
-	.loc 1 2177 0
+.LBB1747:
+.LBB1691:
+	.loc 1 2178 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC42
 	add	x1, x1, :lo12:.LC42
 	bl	_dev_err
-.LVL683:
-	.loc 1 2178 0
+.LVL684:
+	.loc 1 2179 0
 	ldr	x0, [x19, 104]
 	mov	w2, w26
 	ldr	x1, [x19, 208]
 	bl	epd_lut_from_file_init
-.LVL684:
-	.loc 1 2179 0
-	tbz	w0, #31, .L623
+.LVL685:
 	.loc 1 2180 0
+	tbz	w0, #31, .L623
+	.loc 1 2181 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC43
-	.loc 1 2181 0
+	.loc 1 2182 0
 	mov	w25, -1
-	.loc 1 2180 0
+	.loc 1 2181 0
 	add	x1, x1, :lo12:.LC43
 	bl	_dev_err
-.LVL685:
+.LVL686:
 	b	.L621
 	.p2align 3
 .L701:
-.LBE1699:
-.LBE1755:
-.LBB1756:
-.LBB1719:
-	.loc 1 2269 0
+.LBE1691:
+.LBE1747:
+.LBB1748:
+.LBB1711:
+	.loc 1 2272 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC44
 	add	x1, x1, :lo12:.LC44
 	bl	_dev_err
-.LVL686:
+.LVL687:
 .L624:
-.LBE1719:
-.LBE1756:
-	.loc 1 2505 0
-	adrp	x1, .LC76
+.LBE1711:
+.LBE1748:
+	.loc 1 2508 0
+	adrp	x1, .LC78
 	mov	x0, x22
-	add	x1, x1, :lo12:.LC76
-	.loc 1 2506 0
+	add	x1, x1, :lo12:.LC78
+	.loc 1 2509 0
 	mov	w25, -1
-	.loc 1 2505 0
+	.loc 1 2508 0
 	bl	_dev_err
-.LVL687:
-	.loc 1 2506 0
-	b	.L598
 .LVL688:
+	.loc 1 2509 0
+	b	.L598
+.LVL689:
 .L625:
-.LBB1757:
-.LBB1720:
-	.loc 1 2278 0
+.LBB1749:
+.LBB1712:
+	.loc 1 2281 0
 	ldr	x0, [x19, 104]
-.LVL689:
-	adrp	x1, .LC75
-	.loc 1 2276 0
+.LVL690:
+	adrp	x1, .LC77
+	.loc 1 2279 0
 	str	x24, [x19, 136]
-	.loc 1 2278 0
-	add	x1, x1, :lo12:.LC75
+	.loc 1 2281 0
+	add	x1, x1, :lo12:.LC77
 	bl	_dev_err
-.LVL690:
-	b	.L624
 .LVL691:
+	b	.L624
+.LVL692:
 .L693:
-.LBE1720:
-.LBE1757:
-	.loc 1 2421 0
+.LBE1712:
+.LBE1749:
+	.loc 1 2424 0
 	adrp	x1, .LC26
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC26
-	.loc 1 2422 0
+	.loc 1 2425 0
 	mov	w25, -19
-	.loc 1 2421 0
+	.loc 1 2424 0
 	bl	_dev_err
-.LVL692:
-	.loc 1 2422 0
-	b	.L598
 .LVL693:
+	.loc 1 2425 0
+	b	.L598
+.LVL694:
 .L649:
-.LBB1758:
-.LBB1689:
-	.loc 1 2201 0
+.LBB1750:
+.LBB1681:
+	.loc 1 2202 0
 	mov	w25, -19
 	b	.L617
-.LVL694:
+.LVL695:
 .L650:
-.LBE1689:
-.LBE1758:
-.LBB1759:
-.LBB1700:
-	.loc 1 2155 0
+.LBE1681:
+.LBE1750:
+.LBB1751:
+.LBB1692:
+	.loc 1 2156 0
 	mov	w25, -19
 	b	.L621
-.LVL695:
+.LVL696:
 .L708:
-.LBE1700:
-.LBE1759:
-.LBB1760:
-.LBB1745:
-	.loc 1 2344 0
+.LBE1692:
+.LBE1751:
+.LBB1752:
+.LBB1737:
+	.loc 1 2347 0
 	ldr	x0, [x19, 104]
-.LVL696:
+.LVL697:
 	adrp	x1, .LC54
 	adrp	x21, .LANCHOR1
 	add	x1, x1, :lo12:.LC54
 	bl	_dev_err
-.LVL697:
-	b	.L628
 .LVL698:
+	b	.L628
+.LVL699:
 .L699:
-.LBE1745:
-.LBE1760:
-.LBB1761:
-.LBB1701:
-	.loc 1 2171 0
+.LBE1737:
+.LBE1752:
+.LBB1753:
+.LBB1693:
+	.loc 1 2172 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
 	adrp	x1, .LC41
-	mov	w3, 2171
+	mov	w3, 2172
 	add	x2, x2, 32
 	add	x1, x1, :lo12:.LC41
-	.loc 1 2172 0
+	.loc 1 2173 0
 	mov	w25, -12
-	.loc 1 2171 0
+	.loc 1 2172 0
 	bl	_dev_err
-.LVL699:
-	b	.L621
 .LVL700:
+	b	.L621
+.LVL701:
 .L696:
-.LBE1701:
-.LBE1761:
-	.loc 1 2523 0
+.LBE1693:
+.LBE1753:
+	.loc 1 2526 0
 	bl	__stack_chk_fail
-.LVL701:
+.LVL702:
 .L707:
-.LBB1762:
-.LBB1746:
-	.loc 1 2326 0
+.LBB1754:
+.LBB1738:
+	.loc 1 2329 0
 	mov	w24, 1
-.LVL702:
-	b	.L645
 .LVL703:
+	b	.L645
+.LVL704:
 .L706:
-	.loc 1 2330 0
+	.loc 1 2333 0
 	ldr	x0, [x19, 104]
-.LVL704:
+.LVL705:
 	adrp	x1, .LC51
 	adrp	x21, .LANCHOR1
 	add	x1, x1, :lo12:.LC51
 	bl	_dev_err
-.LVL705:
+.LVL706:
 	b	.L628
-.LBE1746:
-.LBE1762:
+.LBE1738:
+.LBE1754:
 	.cfi_endproc
-.LFE2850:
+.LFE2851:
 	.size	ebc_probe, .-ebc_probe
 	.align	2
 	.p2align 3,,7
 	.type	ebc_power_set.constprop.11, %function
 ebc_power_set.constprop.11:
-.LFB2869:
-	.loc 1 182 0
+.LFB2870:
+	.loc 1 183 0
 	.cfi_startproc
-.LVL706:
+.LVL707:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -8050,51 +8055,51 @@ ebc_power_set.constprop.11:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-	.loc 1 188 0
+	.loc 1 189 0
 	add	x20, x0, 184
-	.loc 1 182 0
+	.loc 1 183 0
 	mov	x19, x0
-	.loc 1 188 0
+	.loc 1 189 0
 	ldr	w0, [x20, 440]
-.LVL707:
+.LVL708:
 	cbz	w0, .L712
 .L710:
-	.loc 1 192 0
+	.loc 1 193 0
 	mov	w1, 1
 	str	w1, [x20, 200]
-	.loc 1 193 0
+	.loc 1 194 0
 	ldr	x2, [x19, 16]
-.LBB1763:
-.LBB1764:
+.LBB1755:
+.LBB1756:
 	.loc 3 30 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL708:
-.LBE1764:
-.LBE1763:
-	.loc 1 194 0
+.LVL709:
+.LBE1756:
+.LBE1755:
+	.loc 1 195 0
 	ldr	x2, [x19, 8]
-.LBB1765:
-.LBB1766:
+.LBB1757:
+.LBB1758:
 	.loc 11 46 0
 	add	x1, x19, 24
 	mov	x0, x2
 	ldr	x2, [x2, 48]
 	blr	x2
-.LVL709:
-.LBE1766:
-.LBE1765:
-	.loc 1 195 0
+.LVL710:
+.LBE1758:
+.LBE1757:
+	.loc 1 196 0
 	ldr	x0, [x19]
-	adrp	x1, .LC78
-	add	x1, x1, :lo12:.LC78
+	adrp	x1, .LC80
+	add	x1, x1, :lo12:.LC80
 	bl	_dev_info
-.LVL710:
-	.loc 1 210 0
+.LVL711:
+	.loc 1 211 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
-.LVL711:
+.LVL712:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -8103,431 +8108,431 @@ ebc_power_set.constprop.11:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL712:
+.LVL713:
 	.p2align 3
 .L712:
 	.cfi_restore_state
-	.loc 1 189 0
+	.loc 1 190 0
 	mov	w0, 1
 	str	w0, [x20, 440]
-.LBB1767:
-.LBB1768:
+.LBB1759:
+.LBB1760:
 	.loc 4 58 0
 	add	x0, x19, 416
 	bl	__pm_stay_awake
-.LVL713:
+.LVL714:
 	b	.L710
-.LBE1768:
-.LBE1767:
+.LBE1760:
+.LBE1759:
 	.cfi_endproc
-.LFE2869:
+.LFE2870:
 	.size	ebc_power_set.constprop.11, .-ebc_power_set.constprop.11
 	.align	2
 	.p2align 3,,7
 	.type	ebc_open, %function
 ebc_open:
-.LFB2868:
+.LFB2869:
 	.cfi_startproc
 	mov	w0, 0
 	str	xzr, [x1, 104]
 	ret
 	.cfi_endproc
-.LFE2868:
+.LFE2869:
 	.size	ebc_open, .-ebc_open
 	.align	2
 	.p2align 3,,7
 	.global	refresh_new_image2
 	.type	refresh_new_image2, %function
 refresh_new_image2:
-.LFB2807:
-	.loc 1 215 0
+.LFB2808:
+	.loc 1 216 0
 	.cfi_startproc
-.LVL714:
-	.loc 1 222 0
-	ldp	w16, w5, [x4, 68]
 .LVL715:
+	.loc 1 223 0
+	ldp	w16, w5, [x4, 68]
+.LVL716:
 	cmp	w5, 0
 	add	w11, w5, 7
 	csel	w11, w11, w5, lt
-.LVL716:
-	.loc 1 224 0
+.LVL717:
+	.loc 1 225 0
 	cmp	w16, 0
-	.loc 1 222 0
+	.loc 1 223 0
 	asr	w11, w11, 3
-.LVL717:
-	.loc 1 224 0
+.LVL718:
+	.loc 1 225 0
 	ble	.L714
 	sub	w14, w11, #1
 	mov	w15, 0
-.LVL718:
+.LVL719:
 	add	x14, x14, 1
-	.loc 1 269 0
+	.loc 1 270 0
 	mov	w13, 234881024
 	lsl	x17, x14, 3
 	lsl	x14, x14, 2
-	.loc 1 275 0
+	.loc 1 276 0
 	mov	w12, -536870912
-.LVL719:
+.LVL720:
 	.p2align 2
 .L716:
-	.loc 1 225 0 discriminator 1
+	.loc 1 226 0 discriminator 1
 	mov	x6, 0
 	cmp	w11, 0
 	bgt	.L737
 	b	.L734
-.LVL720:
+.LVL721:
 	.p2align 3
 .L717:
-	.loc 1 238 0
+	.loc 1 239 0
 	tst	x5, 65280
 	bne	.L718
-	.loc 1 239 0
+	.loc 1 240 0
 	and	w10, w4, 240
 	cmp	w10, 224
 	beq	.L739
-	.loc 1 242 0
+	.loc 1 243 0
 	orr	w7, w7, 240
 .L718:
-	.loc 1 244 0
+	.loc 1 245 0
 	tst	x5, 16711680
 	bne	.L720
-	.loc 1 245 0
+	.loc 1 246 0
 	and	w10, w4, 3840
 	cmp	w10, 3584
 	beq	.L740
-	.loc 1 248 0
+	.loc 1 249 0
 	orr	w7, w7, 3840
 .L720:
-	.loc 1 250 0
+	.loc 1 251 0
 	tst	x5, 4278190080
 	bne	.L722
-	.loc 1 251 0
+	.loc 1 252 0
 	and	w10, w4, 61440
 	cmp	w10, 57344
 	beq	.L741
-	.loc 1 254 0
+	.loc 1 255 0
 	orr	w7, w7, 61440
 .L722:
-	.loc 1 256 0
+	.loc 1 257 0
 	tst	x5, 1095216660480
 	bne	.L724
-	.loc 1 257 0
+	.loc 1 258 0
 	and	w10, w4, 983040
 	cmp	w10, 917504
 	beq	.L742
-	.loc 1 260 0
+	.loc 1 261 0
 	orr	w7, w7, 983040
 .L724:
-	.loc 1 262 0
+	.loc 1 263 0
 	tst	x5, 280375465082880
 	bne	.L726
-	.loc 1 263 0
+	.loc 1 264 0
 	and	w10, w4, 15728640
 	cmp	w10, 14680064
 	beq	.L743
-	.loc 1 266 0
+	.loc 1 267 0
 	orr	w7, w7, 15728640
 .L726:
-	.loc 1 268 0
+	.loc 1 269 0
 	tst	x5, 71776119061217280
 	bne	.L728
-	.loc 1 269 0
+	.loc 1 270 0
 	and	w10, w4, 251658240
 	cmp	w10, w13
 	beq	.L744
-	.loc 1 272 0
+	.loc 1 273 0
 	orr	w7, w7, 251658240
 .L728:
-	.loc 1 274 0
+	.loc 1 275 0
 	tst	x5, -72057594037927936
 	bne	.L730
-	.loc 1 275 0
+	.loc 1 276 0
 	and	w5, w4, -268435456
-.LVL721:
+.LVL722:
 	cmp	w5, w12
 	beq	.L745
-	.loc 1 278 0
+	.loc 1 279 0
 	orr	w7, w7, -268435456
-.LVL722:
+.LVL723:
 .L730:
-	.loc 1 282 0 discriminator 2
+	.loc 1 283 0 discriminator 2
 	and	w4, w4, w9
-.LVL723:
+.LVL724:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
-	.loc 1 283 0 discriminator 2
+	.loc 1 284 0 discriminator 2
 	str	w4, [x0, x6, lsl 2]
 	add	x6, x6, 1
-	.loc 1 225 0 discriminator 2
+	.loc 1 226 0 discriminator 2
 	cmp	w11, w6
 	ble	.L746
-.LVL724:
+.LVL725:
 .L737:
-	.loc 1 226 0
+	.loc 1 227 0
 	ldr	x5, [x3, x6, lsl 3]
-	.loc 1 230 0
+	.loc 1 231 0
 	mov	w7, 0
-	.loc 1 227 0
-	ldr	w4, [x1, x6, lsl 2]
-.LVL725:
 	.loc 1 228 0
+	ldr	w4, [x1, x6, lsl 2]
+.LVL726:
+	.loc 1 229 0
 	ldr	w8, [x0, x6, lsl 2]
-	.loc 1 232 0
+	.loc 1 233 0
 	and	x10, x5, 255
-	.loc 1 229 0
+	.loc 1 230 0
 	ldr	w9, [x2, x6, lsl 2]
-.LVL726:
-	.loc 1 232 0
-	cbnz	x10, .L717
 .LVL727:
 	.loc 1 233 0
+	cbnz	x10, .L717
+.LVL728:
+	.loc 1 234 0
 	and	w10, w4, 15
-	.loc 1 236 0
+	.loc 1 237 0
 	mov	w7, 15
-	.loc 1 233 0
+	.loc 1 234 0
 	cmp	w10, 14
 	bne	.L717
-	.loc 1 234 0
+	.loc 1 235 0
 	orr	w8, w8, w7
-.LVL728:
-	.loc 1 230 0
-	mov	w7, 0
 .LVL729:
+	.loc 1 231 0
+	mov	w7, 0
+.LVL730:
 	b	.L717
 	.p2align 3
 .L744:
-	.loc 1 270 0
+	.loc 1 271 0
 	orr	w8, w8, 251658240
 	b	.L728
-.LVL730:
+.LVL731:
 	.p2align 3
 .L745:
-	.loc 1 276 0
+	.loc 1 277 0
 	orr	w8, w8, -268435456
-.LVL731:
-	.loc 1 282 0
-	and	w4, w4, w9
 .LVL732:
+	.loc 1 283 0
+	and	w4, w4, w9
+.LVL733:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
-	.loc 1 283 0
+	.loc 1 284 0
 	str	w4, [x0, x6, lsl 2]
 	add	x6, x6, 1
-	.loc 1 225 0
+	.loc 1 226 0
 	cmp	w11, w6
 	bgt	.L737
-.LVL733:
+.LVL734:
 	.p2align 2
 .L746:
 	add	x3, x3, x17
 	add	x1, x1, x14
 	add	x2, x2, x14
 	add	x0, x0, x14
-.LVL734:
+.LVL735:
 .L734:
-	.loc 1 224 0 discriminator 2
+	.loc 1 225 0 discriminator 2
 	add	w15, w15, 1
 	cmp	w16, w15
 	bne	.L716
 .L714:
 	ret
-.LVL735:
+.LVL736:
 	.p2align 3
 .L740:
-	.loc 1 246 0
+	.loc 1 247 0
 	orr	w8, w8, 3840
 	b	.L720
 	.p2align 3
 .L741:
-	.loc 1 252 0
+	.loc 1 253 0
 	orr	w8, w8, 61440
 	b	.L722
 	.p2align 3
 .L742:
-	.loc 1 258 0
+	.loc 1 259 0
 	orr	w8, w8, 983040
 	b	.L724
 	.p2align 3
 .L743:
-	.loc 1 264 0
+	.loc 1 265 0
 	orr	w8, w8, 15728640
 	b	.L726
 	.p2align 3
 .L739:
-	.loc 1 240 0
+	.loc 1 241 0
 	orr	w8, w8, 240
 	b	.L718
 	.cfi_endproc
-.LFE2807:
+.LFE2808:
 	.size	refresh_new_image2, .-refresh_new_image2
 	.align	2
 	.p2align 3,,7
 	.global	refresh_new_image_auto
 	.type	refresh_new_image_auto, %function
 refresh_new_image_auto:
-.LFB2808:
-	.loc 1 290 0
+.LFB2809:
+	.loc 1 291 0
 	.cfi_startproc
-.LVL736:
-	.loc 1 297 0
+.LVL737:
+	.loc 1 298 0
 	ldp	w13, w4, [x3, 68]
 	cmp	w4, 0
 	add	w9, w4, 7
 	csel	w9, w9, w4, lt
-.LVL737:
-	.loc 1 299 0
+.LVL738:
+	.loc 1 300 0
 	cmp	w13, 0
-	.loc 1 297 0
+	.loc 1 298 0
 	asr	w9, w9, 3
-.LVL738:
-	.loc 1 299 0
+.LVL739:
+	.loc 1 300 0
 	ble	.L747
 	sub	w12, w9, #1
 	mov	w11, 0
-.LVL739:
+.LVL740:
 	add	x12, x12, 1
-	.loc 1 307 0
+	.loc 1 308 0
 	mov	w10, 15
 	lsl	x14, x12, 3
 	lsl	x12, x12, 2
 	.p2align 2
 .L749:
-	.loc 1 300 0 discriminator 1
+	.loc 1 301 0 discriminator 1
 	mov	x6, 0
 	cmp	w9, 0
 	ble	.L760
 	.p2align 2
 .L762:
-	.loc 1 301 0
+	.loc 1 302 0
 	ldr	x4, [x2, x6, lsl 3]
-.LVL740:
-	.loc 1 303 0
+.LVL741:
+	.loc 1 304 0
 	ldr	w7, [x0, x6, lsl 2]
-	.loc 1 302 0
+	.loc 1 303 0
 	ldr	w3, [x1, x6, lsl 2]
-.LVL741:
-	.loc 1 306 0
-	and	x5, x4, 255
+.LVL742:
 	.loc 1 307 0
+	and	x5, x4, 255
+	.loc 1 308 0
 	cmp	x5, 0
-.LVL742:
+.LVL743:
 	eor	w5, w3, w7
 	csel	w3, wzr, w10, ne
-.LVL743:
-	.loc 1 310 0
+.LVL744:
+	.loc 1 311 0
 	orr	w8, w3, 240
 	tst	x4, 65280
 	csel	w3, w8, w3, eq
-	.loc 1 313 0
+	.loc 1 314 0
 	tst	x4, 16711680
 	orr	w8, w3, 3840
 	csel	w3, w8, w3, eq
-	.loc 1 316 0
+	.loc 1 317 0
 	tst	x4, 4278190080
 	orr	w8, w3, 61440
 	csel	w3, w8, w3, eq
-	.loc 1 319 0
+	.loc 1 320 0
 	tst	x4, 1095216660480
 	orr	w8, w3, 983040
 	csel	w3, w8, w3, eq
-	.loc 1 322 0
+	.loc 1 323 0
 	tst	x4, 280375465082880
 	orr	w8, w3, 15728640
 	csel	w3, w8, w3, eq
-	.loc 1 325 0
+	.loc 1 326 0
 	tst	x4, 71776119061217280
 	orr	w8, w3, 251658240
 	csel	w3, w8, w3, eq
-	.loc 1 328 0
+	.loc 1 329 0
 	tst	x4, -72057594037927936
 	orr	w4, w3, -268435456
-.LVL744:
+.LVL745:
 	csel	w3, w4, w3, eq
 	and	w3, w5, w3
-.LVL745:
-	.loc 1 331 0
-	eor	w3, w3, w7
+.LVL746:
 	.loc 1 332 0
+	eor	w3, w3, w7
+	.loc 1 333 0
 	str	w3, [x0, x6, lsl 2]
 	add	x6, x6, 1
-	.loc 1 300 0
+	.loc 1 301 0
 	cmp	w9, w6
 	bgt	.L762
 	add	x2, x2, x14
 	add	x1, x1, x12
 	add	x0, x0, x12
-.LVL746:
+.LVL747:
 .L760:
-	.loc 1 299 0 discriminator 2
+	.loc 1 300 0 discriminator 2
 	add	w11, w11, 1
 	cmp	w13, w11
 	bne	.L749
 .L747:
 	ret
 	.cfi_endproc
-.LFE2808:
+.LFE2809:
 	.size	refresh_new_image_auto, .-refresh_new_image_auto
 	.align	2
 	.p2align 3,,7
 	.global	new_buffer_refresh
 	.type	new_buffer_refresh, %function
 new_buffer_refresh:
-.LFB2809:
-	.loc 1 338 0
+.LFB2810:
+	.loc 1 339 0
 	.cfi_startproc
-.LVL747:
+.LVL748:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 339 0
+	.loc 1 340 0
 	adrp	x1, .LANCHOR0
-	.loc 1 338 0
+	.loc 1 339 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 342 0
+	.loc 1 343 0
 	adrp	x20, .LANCHOR1
-	.loc 1 339 0
+	.loc 1 340 0
 	ldr	x19, [x1, #:lo12:.LANCHOR0]
-.LVL748:
-	.loc 1 342 0
-	add	x0, x20, :lo12:.LANCHOR1
 .LVL749:
+	.loc 1 343 0
+	add	x0, x20, :lo12:.LANCHOR1
+.LVL750:
 	add	x0, x0, 704
 	bl	down_write
-.LVL750:
-	.loc 1 340 0
-	add	x19, x19, 184
 .LVL751:
-	.loc 1 343 0
+	.loc 1 341 0
+	add	x19, x19, 184
+.LVL752:
+	.loc 1 344 0
 	ldr	x0, [x19, 224]
 	ldr	w5, [x0, 40]
-	.loc 1 344 0
-	sub	w1, w5, #22
 	.loc 1 345 0
+	sub	w1, w5, #22
+	.loc 1 346 0
 	cmp	w5, 0
 	ccmp	w1, 1, 0, ne
 	bls	.L768
-	.loc 1 351 0
+	.loc 1 352 0
 	ldr	x1, [x0, 16]
 	mov	x4, x19
 	ldp	x2, x3, [x19, 160]
 	ldr	x0, [x19, 144]
 	bl	refresh_new_image2
-.LVL752:
-	.loc 1 356 0
+.LVL753:
+	.loc 1 357 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 704
 	bl	up_write
-.LVL753:
-	.loc 1 357 0
-	ldp	x19, x20, [sp, 16]
 .LVL754:
+	.loc 1 358 0
+	ldp	x19, x20, [sp, 16]
+.LVL755:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -8536,25 +8541,25 @@ new_buffer_refresh:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL755:
+.LVL756:
 	.p2align 3
 .L768:
 	.cfi_restore_state
-	.loc 1 346 0
+	.loc 1 347 0
 	ldr	x1, [x0, 16]
 	mov	x3, x19
 	ldr	x2, [x19, 168]
 	ldr	x0, [x19, 144]
 	bl	refresh_new_image_auto
-.LVL756:
-	.loc 1 356 0
+.LVL757:
+	.loc 1 357 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 704
 	bl	up_write
-.LVL757:
-	.loc 1 357 0
-	ldp	x19, x20, [sp, 16]
 .LVL758:
+	.loc 1 358 0
+	ldp	x19, x20, [sp, 16]
+.LVL759:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -8563,23 +8568,23 @@ new_buffer_refresh:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2809:
+.LFE2810:
 	.size	new_buffer_refresh, .-new_buffer_refresh
 	.align	2
 	.p2align 3,,7
 	.type	ebc_thread, %function
 ebc_thread:
-.LFB2826:
-	.loc 1 1338 0
+.LFB2827:
+	.loc 1 1339 0
 	.cfi_startproc
-.LVL759:
+.LVL760:
 	stp	x29, x30, [sp, -224]!
 	.cfi_def_cfa_offset 224
 	.cfi_offset 29, -224
 	.cfi_offset 30, -216
-	.loc 1 1339 0
+	.loc 1 1340 0
 	adrp	x1, .LANCHOR0
-	.loc 1 1338 0
+	.loc 1 1339 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -8593,19 +8598,19 @@ ebc_thread:
 	adrp	x21, .LANCHOR1
 	stp	x27, x28, [sp, 80]
 	add	x0, x22, :lo12:__stack_chk_guard
-.LVL760:
-	.loc 1 1339 0
-	ldr	x20, [x1, #:lo12:.LANCHOR0]
 .LVL761:
-.LBB1791:
-.LBB1792:
-.LBB1793:
-	.loc 1 1646 0
+	.loc 1 1340 0
+	ldr	x20, [x1, #:lo12:.LANCHOR0]
+.LVL762:
+.LBB1783:
+.LBB1784:
+.LBB1785:
+	.loc 1 1647 0
 	add	x21, x21, :lo12:.LANCHOR1
-.LBE1793:
-.LBE1792:
-.LBE1791:
-	.loc 1 1338 0
+.LBE1785:
+.LBE1784:
+.LBE1783:
+	.loc 1 1339 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 23, -176
 	.cfi_offset 24, -168
@@ -8613,93 +8618,93 @@ ebc_thread:
 	.cfi_offset 28, -136
 	.cfi_offset 25, -160
 	.cfi_offset 26, -152
-.LBB1798:
-.LBB1796:
-.LBB1794:
-	.loc 1 1646 0
+.LBB1790:
+.LBB1788:
+.LBB1786:
+	.loc 1 1647 0
 	add	x19, x21, 304
-.LBE1794:
-.LBE1796:
-.LBE1798:
-	.loc 1 1340 0
+.LBE1786:
+.LBE1788:
+.LBE1790:
+	.loc 1 1341 0
 	add	x28, x20, 184
-	.loc 1 1343 0
+	.loc 1 1344 0
 	mov	w23, 0
-.LVL762:
-	.loc 1 1338 0
+.LVL763:
+	.loc 1 1339 0
 	ldr	x1, [x0]
 	str	x1, [x29, 216]
 	mov	x1,0
-.LVL763:
+.LVL764:
 	.p2align 2
 .L770:
-	.loc 1 1348 0
-	ldr	w0, [x28, 616]
+	.loc 1 1349 0
+	ldr	w0, [x28, 624]
 	cbnz	w0, .L906
 .L771:
-	.loc 1 1354 0
+	.loc 1 1355 0
 	bl	ebc_dsp_buf_get
-.LVL764:
+.LVL765:
 	mov	x24, x0
-	.loc 1 1356 0
+	.loc 1 1357 0
 	cbz	x0, .L773
-	.loc 1 1356 0 is_stmt 0 discriminator 1
+	.loc 1 1357 0 is_stmt 0 discriminator 1
 	ldr	x1, [x0, 8]
 	cbz	x1, .L773
-	.loc 1 1357 0 is_stmt 1
+	.loc 1 1358 0 is_stmt 1
 	ldr	w1, [x0, 40]
 	cmp	w1, 20
 	beq	.L907
-	.loc 1 1361 0
-	ldr	x2, [x28, 608]
-	cbz	x2, .L776
 	.loc 1 1362 0
+	ldr	x2, [x28, 616]
+	cbz	x2, .L776
+	.loc 1 1363 0
 	cmp	w1, 19
 	beq	.L908
-	.loc 1 1367 0
+	.loc 1 1368 0
 	mov	w2, 18
 	tst	w1, w2
 	beq	.L899
-	.loc 1 1368 0
+	.loc 1 1369 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC80
-	add	x1, x1, :lo12:.LC80
+	adrp	x1, .LC82
+	add	x1, x1, :lo12:.LC82
 	bl	_dev_info
-.LVL765:
+.LVL766:
 .L775:
-	.loc 1 1401 0
+	.loc 1 1402 0
 	adrp	x25, jiffies
-.LVL766:
+.LVL767:
 	mov	x1, 402653184
 	add	x0, x20, 632
 	ldr	x2, [x25, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL767:
-	.loc 1 1403 0
+.LVL768:
+	.loc 1 1404 0
 	ldr	w0, [x28, 444]
 	cbz	w0, .L782
 	ldr	x0, [x28, 216]
 .L783:
-	.loc 1 1406 0
+	.loc 1 1407 0
 	ldr	w2, [x0, 40]
 	ldr	w3, [x24, 40]
 	cmp	w3, w2
 	beq	.L784
-	.loc 1 1407 0
+	.loc 1 1408 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC82
-	add	x1, x1, :lo12:.LC82
+	adrp	x1, .LC84
+	add	x1, x1, :lo12:.LC84
 	bl	_dev_info
-.LVL768:
-	.loc 1 1408 0
+.LVL769:
+	.loc 1 1409 0
 	ldr	w0, [x28, 44]
 	cmp	w0, 1
 	beq	.L909
 .L900:
 	ldr	w2, [x24, 40]
 .L784:
-	.loc 1 1415 0
+	.loc 1 1416 0
 	cmp	w2, 13
 	bgt	.L791
 	cmp	w2, 12
@@ -8711,294 +8716,294 @@ ebc_thread:
 	cbz	w2, .L794
 	cmp	w2, 1
 	bne	.L790
-	.loc 1 1417 0
-	ldr	w0, [x28, 620]
-	cbz	w0, .L797
 	.loc 1 1418 0
-	str	w2, [x28, 624]
-	.loc 1 1427 0
+	ldr	w0, [x28, 628]
+	cbz	w0, .L797
+	.loc 1 1419 0
+	str	w2, [x28, 632]
+	.loc 1 1428 0
 	add	x0, x21, 704
 	bl	down_write
-.LVL769:
-	.loc 1 1428 0
+.LVL770:
+	.loc 1 1429 0
 	str	x24, [x28, 224]
-	.loc 1 1430 0
+	.loc 1 1431 0
 	ldr	x2, [x28, 216]
 	ldr	w0, [x2, 40]
-	.loc 1 1433 0
+	.loc 1 1434 0
 	cmp	w0, 1
-	.loc 1 1432 0
-	sub	w1, w0, #22
 	.loc 1 1433 0
+	sub	w1, w0, #22
+	.loc 1 1434 0
 	ccmp	w1, 1, 0, hi
 	bls	.L910
-	.loc 1 1434 0
+	.loc 1 1435 0
 	ldr	x1, [x2, 16]
 	ldr	x0, [x28, 144]
 	ldrsw	x2, [x28, 20]
 	bl	memcpy
-.LVL770:
-	.loc 1 1435 0
+.LVL771:
+	.loc 1 1436 0
 	ldr	x0, [x28, 216]
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x28, 152]
 	bl	memcpy
-.LVL771:
-	.loc 1 1436 0
+.LVL772:
+	.loc 1 1437 0
 	ldr	x0, [x28, 216]
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x28, 160]
 	bl	memcpy
-.LVL772:
+.LVL773:
 	ldr	x0, [x28, 224]
 .L800:
-.LBB1799:
-.LBB1800:
-	.loc 1 378 0
+.LBB1791:
+.LBB1792:
+	.loc 1 379 0
 	ldp	w3, w15, [x0, 48]
-	.loc 1 437 0
+	.loc 1 438 0
 	mov	w14, 234881024
-	.loc 1 379 0
+	.loc 1 380 0
 	ldp	w2, w18, [x0, 56]
-	.loc 1 376 0
+	.loc 1 377 0
 	cmp	w3, 0
-	.loc 1 381 0
+	.loc 1 382 0
 	ldr	w1, [x20, 256]
-	.loc 1 376 0
+	.loc 1 377 0
 	add	w16, w3, 7
 	csel	w16, w16, w3, lt
-	.loc 1 377 0
+	.loc 1 378 0
 	add	w9, w2, 7
 	cmp	w2, 0
-	.loc 1 381 0
+	.loc 1 382 0
 	add	w17, w1, 7
-	.loc 1 377 0
+	.loc 1 378 0
 	csel	w9, w9, w2, lt
-	.loc 1 381 0
+	.loc 1 382 0
 	cmp	w1, 0
 	csel	w17, w17, w1, lt
-	.loc 1 377 0
+	.loc 1 378 0
 	asr	w9, w9, 3
-	.loc 1 381 0
+	.loc 1 382 0
 	asr	w17, w17, 3
-.LVL773:
-	.loc 1 377 0
-	add	w9, w9, 1
 .LVL774:
+	.loc 1 378 0
+	add	w9, w9, 1
+.LVL775:
 	ldr	w1, [x20, 252]
-	.loc 1 384 0
+	.loc 1 385 0
 	cmp	w9, w17
-.LBE1800:
-.LBE1799:
-	.loc 1 1443 0
+.LBE1792:
+.LBE1791:
+	.loc 1 1444 0
 	ldr	x12, [x0, 16]
-.LBB1805:
-.LBB1801:
-	.loc 1 384 0
+.LBB1797:
+.LBB1793:
+	.loc 1 385 0
 	sub	w0, w17, #1
 	csel	w9, w0, w9, ge
-.LVL775:
-	.loc 1 386 0
+.LVL776:
+	.loc 1 387 0
 	cmp	w1, w18
 	sub	w1, w1, #1
-	.loc 1 443 0
+	.loc 1 444 0
 	mov	w13, -536870912
-	.loc 1 386 0
+	.loc 1 387 0
 	csel	w18, w1, w18, le
-	.loc 1 376 0
+	.loc 1 377 0
 	asr	w16, w16, 3
-.LVL776:
+.LVL777:
 	mul	w5, w15, w17
-	.loc 1 388 0
+	.loc 1 389 0
 	cmp	w15, w18
-.LBE1801:
-.LBE1805:
-	.loc 1 1443 0
-	ldr	x8, [x28, 144]
+.LBE1793:
+.LBE1797:
 	.loc 1 1444 0
+	ldr	x8, [x28, 144]
+	.loc 1 1445 0
 	ldp	x11, x10, [x28, 160]
-.LBB1806:
-.LBB1802:
-	.loc 1 388 0
+.LBB1798:
+.LBB1794:
+	.loc 1 389 0
 	bgt	.L808
-.LVL777:
+.LVL778:
 	.p2align 2
 .L882:
-	.loc 1 393 0
+	.loc 1 394 0
 	mov	w4, w16
 	cmp	w16, w9
 	ble	.L883
 	b	.L825
-.LVL778:
+.LVL779:
 	.p2align 3
 .L809:
-	.loc 1 406 0
+	.loc 1 407 0
 	tst	x2, 65280
 	bne	.L810
-	.loc 1 407 0
+	.loc 1 408 0
 	and	w27, w1, 240
 	cmp	w27, 224
 	beq	.L911
-	.loc 1 410 0
+	.loc 1 411 0
 	orr	w25, w25, 240
 .L810:
-	.loc 1 412 0
+	.loc 1 413 0
 	tst	x2, 16711680
 	bne	.L812
-	.loc 1 413 0
+	.loc 1 414 0
 	and	w27, w1, 3840
 	cmp	w27, 3584
 	beq	.L912
-	.loc 1 416 0
+	.loc 1 417 0
 	orr	w25, w25, 3840
 .L812:
-	.loc 1 418 0
+	.loc 1 419 0
 	tst	x2, 4278190080
 	bne	.L814
-	.loc 1 419 0
+	.loc 1 420 0
 	and	w27, w1, 61440
 	cmp	w27, 57344
 	beq	.L913
-	.loc 1 422 0
+	.loc 1 423 0
 	orr	w25, w25, 61440
 .L814:
-	.loc 1 424 0
+	.loc 1 425 0
 	tst	x2, 1095216660480
 	bne	.L816
-	.loc 1 425 0
+	.loc 1 426 0
 	and	w27, w1, 983040
 	cmp	w27, 917504
 	beq	.L914
-	.loc 1 428 0
+	.loc 1 429 0
 	orr	w25, w25, 983040
 .L816:
-	.loc 1 430 0
+	.loc 1 431 0
 	tst	x2, 280375465082880
 	bne	.L818
-	.loc 1 431 0
+	.loc 1 432 0
 	and	w27, w1, 15728640
 	cmp	w27, 14680064
 	beq	.L915
-	.loc 1 434 0
+	.loc 1 435 0
 	orr	w25, w25, 15728640
 .L818:
-	.loc 1 436 0
+	.loc 1 437 0
 	tst	x2, 71776119061217280
 	bne	.L820
-	.loc 1 437 0
+	.loc 1 438 0
 	and	w27, w1, 251658240
 	cmp	w27, w14
 	beq	.L916
-	.loc 1 440 0
+	.loc 1 441 0
 	orr	w25, w25, 251658240
 .L820:
-	.loc 1 442 0
+	.loc 1 443 0
 	tst	x2, -72057594037927936
 	bne	.L822
-	.loc 1 443 0
+	.loc 1 444 0
 	and	w2, w1, -268435456
-.LVL779:
+.LVL780:
 	cmp	w2, w13
 	beq	.L917
-	.loc 1 446 0
+	.loc 1 447 0
 	orr	w25, w25, -268435456
-.LVL780:
+.LVL781:
 .L822:
-	.loc 1 449 0
+	.loc 1 450 0
 	and	w1, w1, w26
-.LVL781:
-	.loc 1 393 0
+.LVL782:
+	.loc 1 394 0
 	add	w4, w4, 1
 	eor	w1, w1, w3
 	cmp	w4, w9
 	and	w1, w1, w25
-	.loc 1 449 0
-	eor	w1, w3, w1
 	.loc 1 450 0
+	eor	w1, w3, w1
+	.loc 1 451 0
 	str	w1, [x8, x0]
-	.loc 1 393 0
+	.loc 1 394 0
 	bgt	.L825
-.LVL782:
+.LVL783:
 .L883:
-	.loc 1 394 0
+	.loc 1 395 0
 	sxtw	x0, w4
-.LVL783:
-	.loc 1 398 0
+.LVL784:
+	.loc 1 399 0
 	mov	w25, 0
-	.loc 1 397 0
+	.loc 1 398 0
 	lsl	x1, x0, 3
-	.loc 1 394 0
+	.loc 1 395 0
 	lsl	x0, x0, 2
-.LVL784:
-	.loc 1 397 0
+.LVL785:
+	.loc 1 398 0
 	add	x1, x1, x5, sxtw 3
 	add	x0, x0, x5, sxtw 2
 	ldr	x2, [x10, x1]
-	.loc 1 394 0
-	ldr	w3, [x8, x0]
 	.loc 1 395 0
+	ldr	w3, [x8, x0]
+	.loc 1 396 0
 	ldr	w1, [x12, x0]
-	.loc 1 400 0
+	.loc 1 401 0
 	and	x27, x2, 255
-	.loc 1 396 0
+	.loc 1 397 0
 	ldr	w26, [x11, x0]
-.LVL785:
-	.loc 1 400 0
-	cbnz	x27, .L809
 .LVL786:
 	.loc 1 401 0
+	cbnz	x27, .L809
+.LVL787:
+	.loc 1 402 0
 	and	w27, w1, 15
-	.loc 1 404 0
+	.loc 1 405 0
 	mov	w25, 15
-	.loc 1 401 0
+	.loc 1 402 0
 	cmp	w27, 14
 	bne	.L809
-	.loc 1 402 0
+	.loc 1 403 0
 	orr	w3, w3, w25
-.LVL787:
-	.loc 1 398 0
-	mov	w25, 0
 .LVL788:
-	b	.L809
+	.loc 1 399 0
+	mov	w25, 0
 .LVL789:
+	b	.L809
+.LVL790:
 	.p2align 3
 .L773:
-.LBE1802:
-.LBE1806:
-	.loc 1 1633 0
+.LBE1794:
+.LBE1798:
+	.loc 1 1634 0
 	ldr	w0, [x28, 44]
-.LVL790:
+.LVL791:
 	cmp	w0, 1
 	beq	.L918
-	.loc 1 1642 0
+	.loc 1 1643 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
 	beq	.L919
-.LVL791:
+.LVL792:
 .L902:
 	ldr	w0, [x28, 96]
-.LVL792:
-	.loc 1 1645 0
+.LVL793:
+	.loc 1 1646 0
 	cbz	w0, .L920
 .L858:
-.LVL793:
+.LVL794:
 .L848:
-	.loc 1 1647 0
+	.loc 1 1648 0
 	str	wzr, [x28, 96]
 .L924:
-	.loc 1 1348 0
-	ldr	w0, [x28, 616]
-.LVL794:
+	.loc 1 1349 0
+	ldr	w0, [x28, 624]
+.LVL795:
 	cbz	w0, .L771
 .L906:
-	.loc 1 1349 0
+	.loc 1 1350 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
 	beq	.L921
 .L772:
-	.loc 1 1652 0
+	.loc 1 1653 0
 	add	x22, x22, :lo12:__stack_chk_guard
 	mov	w0, 0
 	ldr	x2, [x29, 216]
@@ -9006,12 +9011,12 @@ ebc_thread:
 	eor	x1, x2, x1
 	cbnz	x1, .L922
 	ldp	x19, x20, [sp, 16]
-.LVL795:
+.LVL796:
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
-.LVL796:
-	ldp	x25, x26, [sp, 64]
 .LVL797:
+	ldp	x25, x26, [sp, 64]
+.LVL798:
 	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 224
 	.cfi_remember_state
@@ -9029,155 +9034,155 @@ ebc_thread:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL798:
+.LVL799:
 	.p2align 3
 .L920:
 	.cfi_restore_state
-.LBB1807:
-.LBB1797:
-	.loc 1 1646 0 discriminator 1
+.LBB1799:
+.LBB1789:
+	.loc 1 1647 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL799:
+.LVL800:
 	b	.L859
 	.p2align 3
 .L923:
-.LVL800:
-.LBB1795:
-	.loc 1 1646 0 is_stmt 0 discriminator 5
+.LVL801:
+.LBB1787:
+	.loc 1 1647 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L848
-	.loc 1 1646 0 discriminator 7
+	.loc 1 1647 0 discriminator 7
 	bl	schedule
-.LVL801:
+.LVL802:
 .L859:
-	.loc 1 1646 0 discriminator 9
+	.loc 1 1647 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL802:
+.LVL803:
 	ldr	w1, [x28, 96]
 	cbz	w1, .L923
-.LBE1795:
-	.loc 1 1646 0 discriminator 4
+.LBE1787:
+	.loc 1 1647 0 discriminator 4
 	add	x1, x29, 112
 	mov	x0, x19
 	bl	finish_wait
-.LVL803:
-.LBE1797:
-.LBE1807:
-	.loc 1 1647 0 is_stmt 1 discriminator 4
+.LVL804:
+.LBE1789:
+.LBE1799:
+	.loc 1 1648 0 is_stmt 1 discriminator 4
 	str	wzr, [x28, 96]
 	b	.L924
-.LVL804:
+.LVL805:
 	.p2align 3
 .L782:
-	.loc 1 1404 0
+	.loc 1 1405 0
 	mov	x0, x24
 	str	x24, [x28, 216]
 	b	.L783
-.LVL805:
+.LVL806:
 	.p2align 3
 .L776:
-	.loc 1 1377 0
+	.loc 1 1378 0
 	cmp	w1, 18
 	ccmp	w1, 21, 4, ne
 	bne	.L780
-	.loc 1 1378 0
-	str	wzr, [x28, 624]
+	.loc 1 1379 0
+	str	wzr, [x28, 632]
 	b	.L775
-.LVL806:
+.LVL807:
 	.p2align 3
 .L796:
-	.loc 1 1415 0
+	.loc 1 1416 0
 	cmp	w2, 23
 	ble	.L794
 .L790:
-	.loc 1 1596 0
+	.loc 1 1597 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC90
-	add	x1, x1, :lo12:.LC90
+	adrp	x1, .LC92
+	add	x1, x1, :lo12:.LC92
 	bl	_dev_err
-.LVL807:
-	.loc 1 1597 0
-	mov	x0, x24
 .LVL808:
+	.loc 1 1598 0
+	mov	x0, x24
+.LVL809:
 .L899:
 	bl	ebc_remove_from_dsp_buf_list
-.LVL809:
-	.loc 1 1598 0
+.LVL810:
+	.loc 1 1599 0
 	mov	x0, x24
 	bl	ebc_buf_release
-.LVL810:
-	.loc 1 1600 0
-	b	.L770
 .LVL811:
+	.loc 1 1601 0
+	b	.L770
+.LVL812:
 	.p2align 3
 .L791:
-	.loc 1 1415 0
+	.loc 1 1416 0
 	cmp	w2, 21
 	bgt	.L796
 	cmp	w2, 16
 	bge	.L863
 .L793:
 	mov	w8, 0
-.LVL812:
+.LVL813:
 .L792:
-	.loc 1 1524 0
+	.loc 1 1525 0
 	ldr	x26, [x28, 216]
-.LVL813:
-	.loc 1 1526 0
+.LVL814:
+	.loc 1 1527 0
 	ldr	w0, [x26, 40]
 	sub	w1, w0, #22
-	.loc 1 1528 0
+	.loc 1 1529 0
 	cmp	w1, 1
 	ccmp	w0, 1, 0, hi
 	bhi	.L831
-	.loc 1 1532 0
+	.loc 1 1533 0
 	add	x0, x29, 152
 	str	x0, [x28, 216]
-	.loc 1 1533 0
+	.loc 1 1534 0
 	ldr	x0, [x28, 152]
 	str	x0, [x29, 168]
 .L831:
-	.loc 1 1538 0
-	str	wzr, [x28, 92]
 	.loc 1 1539 0
+	str	wzr, [x28, 92]
+	.loc 1 1540 0
 	str	x24, [x28, 224]
-	.loc 1 1542 0
+	.loc 1 1543 0
 	ldr	w0, [x24, 40]
 	sub	w0, w0, #2
-	.loc 1 1541 0
+	.loc 1 1542 0
 	cmp	w0, 14
 	bhi	.L832
-	.loc 1 1544 0
+	.loc 1 1545 0
 	ldr	x0, [x28, 216]
-.LBB1808:
-.LBB1809:
-	.loc 1 1323 0
+.LBB1800:
+.LBB1801:
+	.loc 1 1324 0
 	ldr	w1, [x28, 20]
-.LBE1809:
-.LBE1808:
-	.loc 1 1543 0
+.LBE1801:
+.LBE1800:
+	.loc 1 1544 0
 	ldr	x4, [x24, 16]
-.LBB1812:
-.LBB1810:
-	.loc 1 1323 0
+.LBB1804:
+.LBB1802:
+	.loc 1 1324 0
 	cmp	w1, 0
-.LBE1810:
-.LBE1812:
-	.loc 1 1544 0
+.LBE1802:
+.LBE1804:
+	.loc 1 1545 0
 	ldr	x5, [x0, 16]
-.LBB1813:
-.LBB1811:
-	.loc 1 1323 0
+.LBB1805:
+.LBB1803:
+	.loc 1 1324 0
 	add	w0, w1, 7
 	csel	w0, w0, w1, lt
 	asr	w0, w0, 3
 	cmp	w0, 0
 	ble	.L833
-	.loc 1 1327 0
+	.loc 1 1328 0
 	ldr	x2, [x4]
 	ldr	x1, [x5]
 	cmp	x2, x1
@@ -9189,247 +9194,247 @@ ebc_thread:
 	b	.L835
 	.p2align 3
 .L836:
-	.loc 1 1324 0
+	.loc 1 1325 0
 	ldr	x3, [x4, x0]
 	add	x0, x0, 8
-	.loc 1 1325 0
+	.loc 1 1326 0
 	add	x2, x5, x0
-	.loc 1 1327 0
+	.loc 1 1328 0
 	ldr	x2, [x2, -8]
 	cmp	x3, x2
 	bne	.L832
 .L835:
-	.loc 1 1323 0
+	.loc 1 1324 0
 	cmp	x1, x0
 	bne	.L836
 .L833:
-.LBE1811:
-.LBE1813:
-	.loc 1 1546 0
+.LBE1803:
+.LBE1805:
+	.loc 1 1547 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC93
-	add	x1, x1, :lo12:.LC93
+	adrp	x1, .LC95
+	add	x1, x1, :lo12:.LC95
 	bl	_dev_info
-.LVL814:
-	.loc 1 1548 0
+.LVL815:
+	.loc 1 1549 0
 	str	x26, [x28, 216]
-	.loc 1 1607 0
+	.loc 1 1608 0
 	ldr	x0, [x28, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
 	bne	.L844
-.LVL815:
+.LVL816:
 .L926:
-	.loc 1 1610 0
+	.loc 1 1611 0
 	ldr	x0, [x28, 104]
-	.loc 1 1608 0
-	mov	w25, 1
-.LVL816:
 	.loc 1 1609 0
-	str	wzr, [x28, 204]
-	.loc 1 1610 0
-	adrp	x1, .LC91
-	.loc 1 1608 0
-	str	w25, [x28, 616]
-	.loc 1 1610 0
-	add	x1, x1, :lo12:.LC91
-	bl	_dev_info
+	mov	w25, 1
 .LVL817:
+	.loc 1 1610 0
+	str	wzr, [x28, 204]
+	.loc 1 1611 0
+	adrp	x1, .LC93
+	.loc 1 1609 0
+	str	w25, [x28, 624]
 	.loc 1 1611 0
+	add	x1, x1, :lo12:.LC93
+	bl	_dev_info
+.LVL818:
+	.loc 1 1612 0
 	mov	w2, w25
 	mov	w1, w25
 	add	x0, x21, 328
 	bl	__wake_up_sync
-.LVL818:
-	.loc 1 1622 0
+.LVL819:
+	.loc 1 1623 0
 	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL819:
-	.loc 1 1624 0
+.LVL820:
+	.loc 1 1625 0
 	ldr	w0, [x28, 444]
 	cbz	w0, .L846
-.LVL820:
+.LVL821:
 	.p2align 2
 .L928:
-	.loc 1 1625 0
+	.loc 1 1626 0
 	ldr	x0, [x28, 216]
 	bl	ebc_buf_release
-.LVL821:
-	b	.L847
 .LVL822:
+	b	.L847
+.LVL823:
 	.p2align 3
 .L863:
-	.loc 1 1515 0
+	.loc 1 1516 0
 	mov	w8, 1
-.LVL823:
-	b	.L792
 .LVL824:
+	b	.L792
+.LVL825:
 	.p2align 3
 .L907:
+	.loc 1 1360 0
+	str	wzr, [x28, 628]
 	.loc 1 1359 0
-	str	wzr, [x28, 620]
-	.loc 1 1358 0
-	str	wzr, [x28, 624]
+	str	wzr, [x28, 632]
 	b	.L775
-.LVL825:
+.LVL826:
 	.p2align 3
 .L832:
-	.loc 1 1554 0
+	.loc 1 1555 0
 	cbnz	w8, .L867
-	.loc 1 1558 0
+	.loc 1 1559 0
 	ldr	w0, [x28, 64]
 	cmp	w0, 0
 	ble	.L837
-	.loc 1 1559 0
-	add	w23, w23, 1
 	.loc 1 1560 0
+	add	w23, w23, 1
+	.loc 1 1561 0
 	cmp	w0, w23
 	bgt	.L837
-	.loc 1 1561 0
-	mov	w0, 2
 	.loc 1 1562 0
+	mov	w0, 2
+	.loc 1 1563 0
 	mov	w23, 0
-	.loc 1 1561 0
+	.loc 1 1562 0
 	str	w0, [x24, 40]
 .L837:
-	.loc 1 1566 0
+	.loc 1 1567 0
 	ldr	w0, [x28, 200]
 	cbz	w0, .L925
 .L838:
-	.loc 1 1569 0
+	.loc 1 1570 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL826:
+.LVL827:
 	cbz	w0, .L839
 .L933:
-	.loc 1 1570 0
+	.loc 1 1571 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC87
-	add	x1, x1, :lo12:.LC87
+	adrp	x1, .LC89
+	add	x1, x1, :lo12:.LC89
 	bl	_dev_err
-.LVL827:
-	.loc 1 1572 0
-	str	x26, [x28, 216]
 .LVL828:
+	.loc 1 1573 0
+	str	x26, [x28, 216]
+.LVL829:
 .L805:
-	.loc 1 1607 0
+	.loc 1 1608 0
 	ldr	x0, [x28, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
 	beq	.L926
 .L844:
-	.loc 1 1613 0
+	.loc 1 1614 0
 	cmp	w0, 18
 	beq	.L927
 .L845:
-	.loc 1 1622 0
+	.loc 1 1623 0
 	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL829:
-	.loc 1 1624 0
+.LVL830:
+	.loc 1 1625 0
 	ldr	w0, [x28, 444]
 	cbnz	w0, .L928
 .L846:
-	.loc 1 1627 0
+	.loc 1 1628 0
 	mov	w0, 1
 	str	w0, [x28, 444]
 .L847:
-	.loc 1 1629 0
+	.loc 1 1630 0
 	ldr	x0, [x28, 224]
 	str	x0, [x28, 216]
-	.loc 1 1630 0
+	.loc 1 1631 0
 	b	.L770
 	.p2align 3
 .L918:
-.LBB1814:
-	.loc 1 1634 0 discriminator 1
+.LBB1806:
+	.loc 1 1635 0 discriminator 1
 	ldr	w0, [x28, 96]
 	cbnz	w0, .L848
-.LBB1815:
-	.loc 1 1634 0 is_stmt 0 discriminator 3
+.LBB1807:
+	.loc 1 1635 0 is_stmt 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL830:
+.LVL831:
 	b	.L852
 	.p2align 3
 .L929:
-.LBB1816:
-	.loc 1 1634 0 discriminator 7
+.LBB1808:
+	.loc 1 1635 0 discriminator 7
 	ldr	w1, [x28, 96]
 	cbnz	w1, .L849
-.LVL831:
-	.loc 1 1634 0 discriminator 9
+.LVL832:
+	.loc 1 1635 0 discriminator 9
 	cbnz	x0, .L902
-	.loc 1 1634 0 discriminator 11
+	.loc 1 1635 0 discriminator 11
 	bl	schedule
-.LVL832:
+.LVL833:
 .L852:
-	.loc 1 1634 0 discriminator 13
+	.loc 1 1635 0 discriminator 13
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL833:
+.LVL834:
 	ldr	w1, [x28, 44]
 	cbnz	w1, .L929
 .L849:
-.LBE1816:
-	.loc 1 1634 0 discriminator 8
+.LBE1808:
+	.loc 1 1635 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL834:
+.LVL835:
 	ldr	w0, [x28, 44]
-.LBE1815:
-.LBE1814:
-	.loc 1 1637 0 is_stmt 1 discriminator 8
+.LBE1807:
+.LBE1806:
+	.loc 1 1638 0 is_stmt 1 discriminator 8
 	cbnz	w0, .L902
-	.loc 1 1642 0
+	.loc 1 1643 0
 	ldr	w0, [x28, 200]
 	cmp	w0, 1
 	bne	.L902
 	.p2align 2
 .L919:
-.LBB1817:
-.LBB1818:
+.LBB1809:
+.LBB1810:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
-.LVL835:
-	b	.L902
 .LVL836:
+	b	.L902
+.LVL837:
 	.p2align 3
 .L780:
-.LBE1818:
-.LBE1817:
-	.loc 1 1380 0
-	ldr	w0, [x28, 624]
-.LVL837:
+.LBE1810:
+.LBE1809:
+	.loc 1 1381 0
+	ldr	w0, [x28, 632]
+.LVL838:
 	cmp	w0, 0
 	ccmp	w1, 1, 4, ne
 	beq	.L775
-	.loc 1 1381 0
+	.loc 1 1382 0
 	add	x25, x21, 704
-.LVL838:
+.LVL839:
 	mov	x0, x25
 	bl	down_write
-.LVL839:
-	.loc 1 1382 0
+.LVL840:
+	.loc 1 1383 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x24, 16]
 	ldr	x0, [x28, 160]
 	bl	memcpy
-.LVL840:
-	.loc 1 1383 0
-	mov	x0, x24
-	bl	ebc_remove_from_dsp_buf_list
 .LVL841:
 	.loc 1 1384 0
 	mov	x0, x24
-	bl	ebc_buf_release
+	bl	ebc_remove_from_dsp_buf_list
 .LVL842:
-	.loc 1 1386 0
+	.loc 1 1385 0
+	mov	x0, x24
+	bl	ebc_buf_release
+.LVL843:
+	.loc 1 1387 0
 	ldr	x1, [x28, 224]
 	mov	x4, x28
 	ldr	x0, [x28, 144]
@@ -9437,546 +9442,546 @@ ebc_thread:
 	ldr	w5, [x1, 40]
 	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
-.LVL843:
-	.loc 1 1389 0
-	mov	x0, x25
-	bl	up_write
 .LVL844:
 	.loc 1 1390 0
+	mov	x0, x25
+	bl	up_write
+.LVL845:
+	.loc 1 1391 0
 	ldr	w0, [x28, 44]
 	cbnz	w0, .L770
-	.loc 1 1393 0
+	.loc 1 1394 0
 	ldr	w0, [x28, 200]
-	.loc 1 1391 0
-	mov	w1, 1
 	.loc 1 1392 0
+	mov	w1, 1
+	.loc 1 1393 0
 	str	wzr, [x28, 92]
-	.loc 1 1391 0
+	.loc 1 1392 0
 	str	w1, [x28, 44]
-	.loc 1 1393 0
+	.loc 1 1394 0
 	cbz	w0, .L930
 .L781:
-	.loc 1 1395 0
+	.loc 1 1396 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC81
+	adrp	x1, .LC83
 	ldrb	w2, [x28, 48]
-	add	x1, x1, :lo12:.LC81
+	add	x1, x1, :lo12:.LC83
 	bl	_dev_info
-.LVL845:
-	.loc 1 1396 0
+.LVL846:
+	.loc 1 1397 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL846:
+.LVL847:
 	b	.L770
 	.p2align 3
 .L794:
-	.loc 1 1466 0
+	.loc 1 1467 0
 	add	x0, x21, 704
 	bl	down_write
-.LVL847:
-	.loc 1 1472 0
+.LVL848:
+	.loc 1 1473 0
 	ldr	x0, [x28, 216]
-	.loc 1 1467 0
+	.loc 1 1468 0
 	str	x24, [x28, 224]
-	.loc 1 1473 0
+	.loc 1 1474 0
 	ldr	w0, [x0, 40]
 	sub	w1, w0, #22
-	.loc 1 1475 0
+	.loc 1 1476 0
 	cmp	w1, 1
 	ccmp	w0, 1, 0, hi
 	bls	.L827
-	.loc 1 1476 0
+	.loc 1 1477 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x24, 16]
 	ldr	x0, [x28, 144]
 	bl	memcpy
-.LVL848:
-	.loc 1 1477 0
+.LVL849:
+	.loc 1 1478 0
 	ldr	x0, [x28, 216]
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x28, 152]
 	bl	memcpy
-.LVL849:
-	.loc 1 1483 0
+.LVL850:
+	.loc 1 1484 0
 	add	x0, x21, 704
 	bl	up_write
-.LVL850:
-	.loc 1 1485 0
+.LVL851:
+	.loc 1 1486 0
 	ldr	w0, [x28, 44]
 	cbnz	w0, .L805
-	.loc 1 1486 0
+	.loc 1 1487 0
 	mov	w0, 1
 	str	w0, [x28, 44]
-	.loc 1 1488 0
+	.loc 1 1489 0
 	ldr	w0, [x28, 200]
-	.loc 1 1487 0
-	str	wzr, [x28, 92]
 	.loc 1 1488 0
+	str	wzr, [x28, 92]
+	.loc 1 1489 0
 	cbz	w0, .L931
 .L829:
-	.loc 1 1490 0
+	.loc 1 1491 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL851:
+.LVL852:
 	cmn	w0, #1
 	beq	.L932
 .L830:
-	.loc 1 1498 0
+	.loc 1 1499 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC88
-	.loc 1 1495 0
+	adrp	x1, .LC90
+	.loc 1 1496 0
 	ldr	w3, [x28, 112]
-	.loc 1 1498 0
-	add	x1, x1, :lo12:.LC88
-	.loc 1 1495 0
+	.loc 1 1499 0
+	add	x1, x1, :lo12:.LC90
+	.loc 1 1496 0
 	strb	w3, [x28, 48]
-.LVL852:
+.LVL853:
 .L901:
-	.loc 1 1498 0
+	.loc 1 1499 0
 	and	w2, w3, 255
-	.loc 1 1496 0
+	.loc 1 1497 0
 	lsr	w3, w3, 8
 	strb	w3, [x28, 49]
-	.loc 1 1498 0
-	bl	_dev_info
-.LVL853:
 	.loc 1 1499 0
+	bl	_dev_info
+.LVL854:
+	.loc 1 1500 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL854:
-	b	.L805
 .LVL855:
+	b	.L805
+.LVL856:
 .L827:
-	.loc 1 1480 0
+	.loc 1 1481 0
 	ldr	x1, [x24, 16]
 	mov	x3, x28
 	ldr	x0, [x28, 144]
 	ldr	x2, [x28, 168]
 	bl	refresh_new_image_auto
-.LVL856:
-	.loc 1 1483 0
+.LVL857:
+	.loc 1 1484 0
 	add	x0, x21, 704
 	bl	up_write
-.LVL857:
-	.loc 1 1485 0
+.LVL858:
+	.loc 1 1486 0
 	ldr	w0, [x28, 44]
 	cbnz	w0, .L805
-	.loc 1 1486 0
+	.loc 1 1487 0
 	mov	w0, 1
 	str	w0, [x28, 44]
-	.loc 1 1488 0
+	.loc 1 1489 0
 	ldr	w0, [x28, 200]
-	.loc 1 1487 0
-	str	wzr, [x28, 92]
 	.loc 1 1488 0
+	str	wzr, [x28, 92]
+	.loc 1 1489 0
 	cbnz	w0, .L829
 .L931:
-	.loc 1 1489 0
+	.loc 1 1490 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.11
-.LVL858:
-	.loc 1 1490 0
+.LVL859:
+	.loc 1 1491 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL859:
+.LVL860:
 	cmn	w0, #1
 	bne	.L830
 .L932:
-	.loc 1 1491 0
+	.loc 1 1492 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC87
-	add	x1, x1, :lo12:.LC87
+	adrp	x1, .LC89
+	add	x1, x1, :lo12:.LC89
 	bl	_dev_err
-.LVL860:
-	.loc 1 1492 0
-	b	.L805
 .LVL861:
+	.loc 1 1493 0
+	b	.L805
+.LVL862:
 	.p2align 3
 .L867:
-	.loc 1 1566 0
+	.loc 1 1567 0
 	ldr	w0, [x28, 200]
-	.loc 1 1555 0
+	.loc 1 1556 0
 	mov	w23, 0
-	.loc 1 1566 0
+	.loc 1 1567 0
 	cbnz	w0, .L838
 .L925:
-	.loc 1 1567 0
+	.loc 1 1568 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.11
-.LVL862:
-	.loc 1 1569 0
+.LVL863:
+	.loc 1 1570 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL863:
+.LVL864:
 	cbnz	w0, .L933
 .L839:
-	.loc 1 1581 0
+	.loc 1 1582 0
 	ldr	x0, [x28, 224]
-	adrp	x1, .LC89
-	.loc 1 1578 0
+	adrp	x1, .LC91
+	.loc 1 1579 0
 	ldr	w3, [x28, 112]
-	.loc 1 1581 0
-	add	x1, x1, :lo12:.LC89
-	.loc 1 1578 0
+	.loc 1 1582 0
+	add	x1, x1, :lo12:.LC91
+	.loc 1 1579 0
 	strb	w3, [x28, 48]
-	.loc 1 1581 0
+	.loc 1 1582 0
 	and	w3, w3, 255
 	ldr	w2, [x0, 40]
 	ldr	x0, [x28, 104]
 	bl	_dev_info
-.LVL864:
-	.loc 1 1582 0
+.LVL865:
+	.loc 1 1583 0
 	mov	w0, 1
 	str	w0, [x28, 44]
-	.loc 1 1583 0
+	.loc 1 1584 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL865:
-	.loc 1 1585 0
+.LVL866:
+	.loc 1 1586 0
 	ldr	x1, [x25, #:lo12:jiffies]
 	add	x0, x20, 688
 	str	x0, [x29, 104]
 	add	x1, x1, 900
 	bl	mod_timer
-.LVL866:
-.LBB1819:
-	.loc 1 1586 0
+.LVL867:
+.LBB1811:
+	.loc 1 1587 0
 	ldr	w0, [x28, 92]
 	cbz	w0, .L934
 .L842:
-.LVL867:
+.LVL868:
 .L840:
-.LBE1819:
-	.loc 1 1588 0 discriminator 11
+.LBE1811:
+	.loc 1 1589 0 discriminator 11
 	ldr	x2, [x25, #:lo12:jiffies]
 	mov	x1, 402653184
 	ldr	x0, [x29, 104]
-.LVL868:
+.LVL869:
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL869:
-	.loc 1 1589 0 discriminator 11
+.LVL870:
+	.loc 1 1590 0 discriminator 11
 	str	wzr, [x28, 92]
-	.loc 1 1591 0 discriminator 11
+	.loc 1 1592 0 discriminator 11
 	str	x26, [x28, 216]
-	.loc 1 1593 0 discriminator 11
+	.loc 1 1594 0 discriminator 11
 	b	.L805
-.LVL870:
+.LVL871:
 .L797:
-	.loc 1 1421 0
+	.loc 1 1422 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC85
-	add	x1, x1, :lo12:.LC85
+	adrp	x1, .LC87
+	add	x1, x1, :lo12:.LC87
 	bl	_dev_info
-.LVL871:
-	.loc 1 1422 0
-	mov	x0, x24
-	bl	ebc_remove_from_dsp_buf_list
 .LVL872:
 	.loc 1 1423 0
 	mov	x0, x24
-	bl	ebc_buf_release
+	bl	ebc_remove_from_dsp_buf_list
 .LVL873:
-	.loc 1 1425 0
+	.loc 1 1424 0
+	mov	x0, x24
+	bl	ebc_buf_release
+.LVL874:
+	.loc 1 1426 0
 	b	.L770
 .L909:
-	.loc 1 1409 0
+	.loc 1 1410 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC83
-	add	x1, x1, :lo12:.LC83
+	adrp	x1, .LC85
+	add	x1, x1, :lo12:.LC85
 	bl	_dev_info
-.LVL874:
-.LBB1823:
-	.loc 1 1410 0
+.LVL875:
+.LBB1815:
+	.loc 1 1411 0
 	ldr	w0, [x28, 92]
 	cbz	w0, .L935
 .L788:
-.LVL875:
+.LVL876:
 .L786:
-.LBE1823:
-	.loc 1 1411 0 discriminator 11
+.LBE1815:
+	.loc 1 1412 0 discriminator 11
 	ldr	x0, [x28, 104]
-.LVL876:
-	adrp	x1, .LC84
-	add	x1, x1, :lo12:.LC84
-	bl	_dev_info
 .LVL877:
+	adrp	x1, .LC86
+	add	x1, x1, :lo12:.LC86
+	bl	_dev_info
+.LVL878:
 	b	.L900
 .L910:
-	.loc 1 1439 0
+	.loc 1 1440 0
 	cmp	w0, 0
 	mov	x0, x24
 	ccmp	w1, 1, 0, ne
 	bhi	.L800
-	.loc 1 1440 0
+	.loc 1 1441 0
 	ldrsw	x2, [x28, 20]
 	ldp	x1, x0, [x28, 152]
 	bl	memcpy
-.LVL878:
+.LVL879:
 	ldr	x0, [x28, 224]
 	b	.L800
-.LVL879:
+.LVL880:
 	.p2align 3
 .L917:
-.LBB1827:
-.LBB1803:
-	.loc 1 444 0
+.LBB1819:
+.LBB1795:
+	.loc 1 445 0
 	orr	w3, w3, -268435456
-.LVL880:
-	.loc 1 449 0
-	and	w1, w1, w26
 .LVL881:
-	eor	w1, w1, w3
+	.loc 1 450 0
+	and	w1, w1, w26
 .LVL882:
-	.loc 1 393 0
+	eor	w1, w1, w3
+.LVL883:
+	.loc 1 394 0
 	add	w4, w4, 1
 	and	w1, w1, w25
 	cmp	w4, w9
-	.loc 1 449 0
-	eor	w1, w3, w1
 	.loc 1 450 0
+	eor	w1, w3, w1
+	.loc 1 451 0
 	str	w1, [x8, x0]
-	.loc 1 393 0
+	.loc 1 394 0
 	ble	.L883
-.LVL883:
+.LVL884:
 	.p2align 2
 .L825:
-	.loc 1 388 0
+	.loc 1 389 0
 	add	w15, w15, 1
 	add	w5, w5, w17
 	cmp	w15, w18
 	ble	.L882
 .L808:
-.LBE1803:
-.LBE1827:
-	.loc 1 1446 0
+.LBE1795:
+.LBE1819:
+	.loc 1 1447 0
 	add	x0, x21, 704
 	bl	up_write
-.LVL884:
-	.loc 1 1447 0
+.LVL885:
+	.loc 1 1448 0
 	ldr	w0, [x28, 44]
 	cbnz	w0, .L805
-	.loc 1 1448 0
+	.loc 1 1449 0
 	mov	w0, 1
 	str	w0, [x28, 44]
-	.loc 1 1450 0
+	.loc 1 1451 0
 	ldr	w0, [x28, 200]
-	.loc 1 1449 0
-	str	wzr, [x28, 92]
 	.loc 1 1450 0
+	str	wzr, [x28, 92]
+	.loc 1 1451 0
 	cbz	w0, .L936
 .L826:
-	.loc 1 1452 0
+	.loc 1 1453 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL885:
+.LVL886:
 	cmn	w0, #1
 	beq	.L805
-	.loc 1 1456 0
+	.loc 1 1457 0
 	ldr	w3, [x28, 112]
-	.loc 1 1459 0
-	adrp	x1, .LC86
-	.loc 1 1456 0
+	.loc 1 1460 0
+	adrp	x1, .LC88
+	.loc 1 1457 0
 	strb	w3, [x28, 48]
-	.loc 1 1459 0
-	add	x1, x1, :lo12:.LC86
+	.loc 1 1460 0
+	add	x1, x1, :lo12:.LC88
 	ldr	x0, [x28, 104]
 	b	.L901
-.LVL886:
+.LVL887:
 	.p2align 3
 .L911:
-.LBB1828:
-.LBB1804:
-	.loc 1 408 0
+.LBB1820:
+.LBB1796:
+	.loc 1 409 0
 	orr	w3, w3, 240
 	b	.L810
 	.p2align 3
 .L912:
-	.loc 1 414 0
+	.loc 1 415 0
 	orr	w3, w3, 3840
 	b	.L812
 	.p2align 3
 .L913:
-	.loc 1 420 0
+	.loc 1 421 0
 	orr	w3, w3, 61440
 	b	.L814
 	.p2align 3
 .L914:
-	.loc 1 426 0
+	.loc 1 427 0
 	orr	w3, w3, 983040
 	b	.L816
 	.p2align 3
 .L915:
-	.loc 1 432 0
+	.loc 1 433 0
 	orr	w3, w3, 15728640
 	b	.L818
 	.p2align 3
 .L916:
-	.loc 1 438 0
+	.loc 1 439 0
 	orr	w3, w3, 251658240
 	b	.L820
-.LVL887:
+.LVL888:
 .L927:
-.LBE1804:
-.LBE1828:
-	.loc 1 1617 0
+.LBE1796:
+.LBE1820:
+	.loc 1 1618 0
 	ldr	x0, [x28, 104]
-	.loc 1 1615 0
+	.loc 1 1616 0
 	mov	w25, 1
-.LVL888:
-	.loc 1 1614 0
-	str	wzr, [x28, 204]
-	.loc 1 1617 0
-	adrp	x1, .LC92
+.LVL889:
 	.loc 1 1615 0
-	str	w25, [x28, 608]
-	.loc 1 1617 0
-	add	x1, x1, :lo12:.LC92
+	str	wzr, [x28, 204]
+	.loc 1 1618 0
+	adrp	x1, .LC94
 	.loc 1 1616 0
-	str	wzr, [x28, 624]
+	str	w25, [x28, 616]
+	.loc 1 1618 0
+	add	x1, x1, :lo12:.LC94
 	.loc 1 1617 0
-	bl	_dev_info
-.LVL889:
+	str	wzr, [x28, 632]
 	.loc 1 1618 0
-	mov	x0, 2
-	bl	ebc_notify
+	bl	_dev_info
 .LVL890:
 	.loc 1 1619 0
+	mov	x0, 2
+	bl	ebc_notify
+.LVL891:
+	.loc 1 1620 0
 	mov	w2, w25
 	mov	w1, w25
 	add	x0, x21, 328
 	bl	__wake_up_sync
-.LVL891:
-	b	.L845
 .LVL892:
+	b	.L845
+.LVL893:
 .L908:
-	.loc 1 1363 0
-	str	wzr, [x28, 608]
 	.loc 1 1364 0
+	str	wzr, [x28, 616]
+	.loc 1 1365 0
 	mov	x0, 3
-.LVL893:
-	bl	ebc_notify
 .LVL894:
-	.loc 1 1365 0
+	bl	ebc_notify
+.LVL895:
+	.loc 1 1366 0
 	ldr	x0, [x28, 104]
-	adrp	x1, .LC79
-	add	x1, x1, :lo12:.LC79
+	adrp	x1, .LC81
+	add	x1, x1, :lo12:.LC81
 	bl	_dev_info
-.LVL895:
-	b	.L775
 .LVL896:
+	b	.L775
+.LVL897:
 .L934:
-.LBB1829:
-.LBB1820:
 .LBB1821:
-	.loc 1 1586 0 discriminator 1
+.LBB1812:
+.LBB1813:
+	.loc 1 1587 0 discriminator 1
 	add	x27, x21, 352
-.LBE1821:
+.LBE1813:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL897:
+.LVL898:
 	b	.L843
 	.p2align 3
 .L937:
-.LVL898:
-.LBB1822:
-	.loc 1 1586 0 is_stmt 0 discriminator 5
+.LVL899:
+.LBB1814:
+	.loc 1 1587 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L840
-	.loc 1 1586 0 discriminator 7
+	.loc 1 1587 0 discriminator 7
 	bl	schedule
-.LVL899:
+.LVL900:
 .L843:
-	.loc 1 1586 0 discriminator 9
+	.loc 1 1587 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x27
 	bl	prepare_to_wait_event
-.LVL900:
+.LVL901:
 	ldr	w1, [x28, 92]
 	cbz	w1, .L937
-.LBE1822:
-	.loc 1 1586 0 discriminator 4
+.LBE1814:
+	.loc 1 1587 0 discriminator 4
 	mov	x0, x27
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL901:
-	b	.L840
 .LVL902:
+	b	.L840
+.LVL903:
 .L935:
-.LBE1820:
-.LBE1829:
-.LBB1830:
-.LBB1824:
-.LBB1825:
-	.loc 1 1410 0 is_stmt 1 discriminator 1
+.LBE1812:
+.LBE1821:
+.LBB1822:
+.LBB1816:
+.LBB1817:
+	.loc 1 1411 0 is_stmt 1 discriminator 1
 	add	x26, x21, 352
-.LVL903:
-.LBE1825:
+.LVL904:
+.LBE1817:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL904:
+.LVL905:
 	b	.L789
 	.p2align 3
 .L938:
-.LVL905:
-.LBB1826:
-	.loc 1 1410 0 is_stmt 0 discriminator 5
+.LVL906:
+.LBB1818:
+	.loc 1 1411 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L786
-	.loc 1 1410 0 discriminator 7
+	.loc 1 1411 0 discriminator 7
 	bl	schedule
-.LVL906:
+.LVL907:
 .L789:
-	.loc 1 1410 0 discriminator 9
+	.loc 1 1411 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x26
 	bl	prepare_to_wait_event
-.LVL907:
+.LVL908:
 	ldr	w1, [x28, 92]
 	cbz	w1, .L938
-.LBE1826:
-	.loc 1 1410 0 discriminator 4
+.LBE1818:
+	.loc 1 1411 0 discriminator 4
 	mov	x0, x26
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL908:
-	b	.L786
 .LVL909:
+	b	.L786
+.LVL910:
 .L921:
-.LBE1824:
-.LBE1830:
-.LBB1831:
-.LBB1832:
+.LBE1816:
+.LBE1822:
+.LBB1823:
+.LBB1824:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
-.LVL910:
+.LVL911:
 	b	.L772
 .L936:
-.LBE1832:
-.LBE1831:
-	.loc 1 1451 0 is_stmt 1
+.LBE1824:
+.LBE1823:
+	.loc 1 1452 0 is_stmt 1
 	mov	x0, x20
 	bl	ebc_power_set.constprop.11
-.LVL911:
-	b	.L826
 .LVL912:
+	b	.L826
+.LVL913:
 .L930:
-	.loc 1 1394 0
+	.loc 1 1395 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.11
-.LVL913:
-	b	.L781
 .LVL914:
+	b	.L781
+.LVL915:
 .L922:
-	.loc 1 1652 0
+	.loc 1 1653 0
 	bl	__stack_chk_fail
-.LVL915:
+.LVL916:
 	.cfi_endproc
-.LFE2826:
+.LFE2827:
 	.size	ebc_thread, .-ebc_thread
 	.data
 	.align	3
@@ -9987,7 +9992,7 @@ ebc_driver:
 	.xword	ebc_probe
 	.xword	ebc_remove
 	.zero	24
-	.xword	.LC94
+	.xword	.LC96
 	.zero	32
 	.xword	ebc_match
 	.zero	64
@@ -10035,13 +10040,13 @@ ebc_auto_thread_sem:
 waveform_misc:
 	.word	244
 	.zero	4
-	.xword	.LC102
+	.xword	.LC104
 	.xword	waveform_ops
 	.zero	56
 	.type	dev_attr_waveform_version, %object
 	.size	dev_attr_waveform_version, 32
 dev_attr_waveform_version:
-	.xword	.LC101
+	.xword	.LC103
 	.hword	292
 	.zero	6
 	.xword	waveform_version_read
@@ -10049,7 +10054,7 @@ dev_attr_waveform_version:
 	.type	dev_attr_pmic_name, %object
 	.size	dev_attr_pmic_name, 32
 dev_attr_pmic_name:
-	.xword	.LC100
+	.xword	.LC102
 	.hword	292
 	.zero	6
 	.xword	pmic_name_read
@@ -10057,7 +10062,7 @@ dev_attr_pmic_name:
 	.type	dev_attr_pmic_temp, %object
 	.size	dev_attr_pmic_temp, 32
 dev_attr_pmic_temp:
-	.xword	.LC99
+	.xword	.LC101
 	.hword	292
 	.zero	6
 	.xword	pmic_temp_read
@@ -10065,7 +10070,7 @@ dev_attr_pmic_temp:
 	.type	dev_attr_pmic_vcom, %object
 	.size	dev_attr_pmic_vcom, 32
 dev_attr_pmic_vcom:
-	.xword	.LC98
+	.xword	.LC100
 	.hword	420
 	.zero	6
 	.xword	pmic_vcom_read
@@ -10073,7 +10078,7 @@ dev_attr_pmic_vcom:
 	.type	dev_attr_ebc_version, %object
 	.size	dev_attr_ebc_version, 32
 dev_attr_ebc_version:
-	.xword	.LC97
+	.xword	.LC99
 	.hword	292
 	.zero	6
 	.xword	ebc_version_read
@@ -10081,7 +10086,7 @@ dev_attr_ebc_version:
 	.type	dev_attr_ebc_state, %object
 	.size	dev_attr_ebc_state, 32
 dev_attr_ebc_state:
-	.xword	.LC96
+	.xword	.LC98
 	.hword	292
 	.zero	6
 	.xword	ebc_state_read
@@ -10089,7 +10094,7 @@ dev_attr_ebc_state:
 	.type	dev_attr_ebc_buf_state, %object
 	.size	dev_attr_ebc_buf_state, 32
 dev_attr_ebc_buf_state:
-	.xword	.LC95
+	.xword	.LC97
 	.hword	292
 	.zero	6
 	.xword	ebc_buf_state_read
@@ -10118,24 +10123,24 @@ ebc_auto_task:
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.34990, %object
-	.size	__func__.34990, 11
-__func__.34990:
+	.type	__func__.34997, %object
+	.size	__func__.34997, 11
+__func__.34997:
 	.string	"ebc_io_ctl"
 	.align	3
 	.set	.LANCHOR3,. + 0
-	.type	__func__.34778, %object
-	.size	__func__.34778, 16
-__func__.34778:
+	.type	__func__.34785, %object
+	.size	__func__.34785, 16
+__func__.34785:
 	.string	"ebc_frame_start"
-	.type	__func__.35300, %object
-	.size	__func__.35300, 12
-__func__.35300:
+	.type	__func__.35307, %object
+	.size	__func__.35307, 12
+__func__.35307:
 	.string	"ebc_suspend"
 	.zero	4
-	.type	__func__.35234, %object
-	.size	__func__.35234, 19
-__func__.35234:
+	.type	__func__.35241, %object
+	.size	__func__.35241, 19
+__func__.35241:
 	.string	"ebc_lut_table_init"
 	.zero	5
 	.type	ebc_match, %object
@@ -10175,9 +10180,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init2592, %object
-	.size	__addressable_ebc_init2592, 8
-__addressable_ebc_init2592:
+	.type	__addressable_ebc_init2595, %object
+	.size	__addressable_ebc_init2595, 8
+__addressable_ebc_init2595:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -10235,7 +10240,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC16:
-	.string	"2.12"
+	.string	"2.13"
 	.zero	3
 .LC17:
 	.string	"%s\n"
@@ -10402,89 +10407,94 @@ __exitcall_ebc_exit:
 	.string	"lut table init failed\n"
 	.zero	1
 .LC74:
+	.string	"auto-refresh-wq"
+.LC75:
+	.string	"%s"
+	.zero	5
+.LC76:
 	.string	"ebc_task"
 	.zero	7
-.LC75:
+.LC77:
 	.string	"failed to run ebc thread\n"
 	.zero	6
-.LC76:
+.LC78:
 	.string	"task init failed\n"
 	.zero	6
-.LC77:
+.LC79:
 	.string	"failed to probe panel: %d\n"
 	.zero	5
-.LC78:
+.LC80:
 	.string	"ebc hw power on\n"
 	.zero	7
-.LC79:
+.LC81:
 	.string	"early resume\n"
 	.zero	2
-.LC80:
+.LC82:
 	.string	"refresh suspend logo\n"
 	.zero	2
-.LC81:
+.LC83:
 	.string	"overlay mode start, update background, frame_total=%d\n"
 	.zero	1
-.LC82:
+.LC84:
 	.string	"change display mode from %d to %d\n"
 	.zero	5
-.LC83:
+.LC85:
 	.string	"ebc is busy now, waiting prev refresh mode end...\n"
 	.zero	5
-.LC84:
+.LC86:
 	.string	"prev refresh mode end\n"
 	.zero	1
-.LC85:
+.LC87:
 	.string	"overlay disabled, drop EPD_OVERLAY frame\n"
 	.zero	6
-.LC86:
+.LC88:
 	.string	"overlay mode start, frame_total=%d\n"
 	.zero	4
-.LC87:
+.LC89:
 	.string	"ebc_lut_update err\n"
 	.zero	4
-.LC88:
+.LC90:
 	.string	"auto mode start, frame_total=%d\n"
 	.zero	7
-.LC89:
+.LC91:
 	.string	"frame start, mode = %d, framecount = %d\n"
 	.zero	7
-.LC90:
+.LC92:
 	.string	"ebc buffer mode %d error!!!\n"
 	.zero	3
-.LC91:
+.LC93:
 	.string	"power off\n"
 	.zero	5
-.LC92:
+.LC94:
 	.string	"early suspend\n"
 	.zero	1
-.LC93:
+.LC95:
 	.string	"check_part_mode==0, no need refresh\n"
 	.zero	3
-.LC94:
+.LC96:
 	.string	"ebc-dev"
-.LC95:
+.LC97:
 	.string	"ebc_buf_state"
 	.zero	2
-.LC96:
+.LC98:
 	.string	"ebc_state"
 	.zero	6
-.LC97:
+.LC99:
 	.string	"ebc_version"
 	.zero	4
-.LC98:
+.LC100:
 	.string	"pmic_vcom"
 	.zero	6
-.LC99:
+.LC101:
 	.string	"pmic_temp"
 	.zero	6
-.LC100:
+.LC102:
 	.string	"pmic_name"
 	.zero	6
-.LC101:
+.LC103:
 	.string	"waveform_version"
 	.zero	7
-.LC102:
+.LC104:
 	.string	"waveform"
 	.text
 .Letext0:
@@ -10686,16 +10696,16 @@ __exitcall_ebc_exit:
 	.file 214 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x14756
+	.4byte	0x147f3
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF3299
+	.4byte	.LASF3314
 	.byte	0x1
-	.4byte	.LASF3300
-	.4byte	.LASF3301
-	.4byte	.Ldebug_ranges0+0x1190
+	.4byte	.LASF3315
+	.4byte	.LASF3316
+	.4byte	.Ldebug_ranges0+0x1160
 	.8byte	0
 	.4byte	.Ldebug_line0
 	.uleb128 0x2
@@ -11398,73 +11408,73 @@ __exitcall_ebc_exit:
 	.4byte	.LASF98
 	.byte	0x1f
 	.2byte	0x70e
-	.4byte	0x757b
+	.4byte	0x75eb
 	.byte	0
 	.uleb128 0x1b
 	.4byte	.LASF99
 	.byte	0x1f
 	.2byte	0x70f
-	.4byte	0x887e
+	.4byte	0x88ee
 	.byte	0x8
 	.uleb128 0x1b
 	.4byte	.LASF100
 	.byte	0x1f
 	.2byte	0x710
-	.4byte	0x88a8
+	.4byte	0x8918
 	.byte	0x10
 	.uleb128 0x1b
 	.4byte	.LASF101
 	.byte	0x1f
 	.2byte	0x711
-	.4byte	0x88cc
+	.4byte	0x893c
 	.byte	0x18
 	.uleb128 0x1b
 	.4byte	.LASF102
 	.byte	0x1f
 	.2byte	0x712
-	.4byte	0x7928
+	.4byte	0x7998
 	.byte	0x20
 	.uleb128 0x1b
 	.4byte	.LASF103
 	.byte	0x1f
 	.2byte	0x713
-	.4byte	0x7928
+	.4byte	0x7998
 	.byte	0x28
 	.uleb128 0x1b
 	.4byte	.LASF104
 	.byte	0x1f
 	.2byte	0x714
-	.4byte	0x88e6
+	.4byte	0x8956
 	.byte	0x30
 	.uleb128 0x1b
 	.4byte	.LASF105
 	.byte	0x1f
 	.2byte	0x715
-	.4byte	0x88e6
+	.4byte	0x8956
 	.byte	0x38
 	.uleb128 0x1b
 	.4byte	.LASF106
 	.byte	0x1f
 	.2byte	0x716
-	.4byte	0x890b
+	.4byte	0x897b
 	.byte	0x40
 	.uleb128 0x1b
 	.4byte	.LASF107
 	.byte	0x1f
 	.2byte	0x717
-	.4byte	0x892a
+	.4byte	0x899a
 	.byte	0x48
 	.uleb128 0x1b
 	.4byte	.LASF108
 	.byte	0x1f
 	.2byte	0x718
-	.4byte	0x892a
+	.4byte	0x899a
 	.byte	0x50
 	.uleb128 0x1b
 	.4byte	.LASF109
 	.byte	0x1f
 	.2byte	0x719
-	.4byte	0x8944
+	.4byte	0x89b4
 	.byte	0x58
 	.uleb128 0x1b
 	.4byte	.LASF110
@@ -11476,115 +11486,115 @@ __exitcall_ebc_exit:
 	.4byte	.LASF111
 	.byte	0x1f
 	.2byte	0x71b
-	.4byte	0x895e
+	.4byte	0x89ce
 	.byte	0x68
 	.uleb128 0x1b
 	.4byte	.LASF112
 	.byte	0x1f
 	.2byte	0x71c
-	.4byte	0x8978
+	.4byte	0x89e8
 	.byte	0x70
 	.uleb128 0x1b
 	.4byte	.LASF113
 	.byte	0x1f
 	.2byte	0x71d
-	.4byte	0x895e
+	.4byte	0x89ce
 	.byte	0x78
 	.uleb128 0x1b
 	.4byte	.LASF114
 	.byte	0x1f
 	.2byte	0x71e
-	.4byte	0x899c
+	.4byte	0x8a0c
 	.byte	0x80
 	.uleb128 0x1b
 	.4byte	.LASF115
 	.byte	0x1f
 	.2byte	0x71f
-	.4byte	0x89bb
+	.4byte	0x8a2b
 	.byte	0x88
 	.uleb128 0x1b
 	.4byte	.LASF116
 	.byte	0x1f
 	.2byte	0x720
-	.4byte	0x89da
+	.4byte	0x8a4a
 	.byte	0x90
 	.uleb128 0x1b
 	.4byte	.LASF117
 	.byte	0x1f
 	.2byte	0x721
-	.4byte	0x8a08
+	.4byte	0x8a78
 	.byte	0x98
 	.uleb128 0x1b
 	.4byte	.LASF118
 	.byte	0x1f
 	.2byte	0x722
-	.4byte	0x59fe
+	.4byte	0x5a6e
 	.byte	0xa0
 	.uleb128 0x1b
 	.4byte	.LASF119
 	.byte	0x1f
 	.2byte	0x723
-	.4byte	0x8a1d
+	.4byte	0x8a8d
 	.byte	0xa8
 	.uleb128 0x1b
 	.4byte	.LASF120
 	.byte	0x1f
 	.2byte	0x724
-	.4byte	0x89da
+	.4byte	0x8a4a
 	.byte	0xb0
 	.uleb128 0x1b
 	.4byte	.LASF121
 	.byte	0x1f
 	.2byte	0x725
-	.4byte	0x8a46
+	.4byte	0x8ab6
 	.byte	0xb8
 	.uleb128 0x1b
 	.4byte	.LASF122
 	.byte	0x1f
 	.2byte	0x726
-	.4byte	0x8a6f
+	.4byte	0x8adf
 	.byte	0xc0
 	.uleb128 0x1b
 	.4byte	.LASF123
 	.byte	0x1f
 	.2byte	0x727
-	.4byte	0x8a99
+	.4byte	0x8b09
 	.byte	0xc8
 	.uleb128 0x1b
 	.4byte	.LASF124
 	.byte	0x1f
 	.2byte	0x728
-	.4byte	0x8abd
+	.4byte	0x8b2d
 	.byte	0xd0
 	.uleb128 0x1b
 	.4byte	.LASF125
 	.byte	0x1f
 	.2byte	0x72a
-	.4byte	0x8b81
+	.4byte	0x8bf1
 	.byte	0xd8
 	.uleb128 0x1b
 	.4byte	.LASF126
 	.byte	0x1f
 	.2byte	0x72e
-	.4byte	0x8baf
+	.4byte	0x8c1f
 	.byte	0xe0
 	.uleb128 0x1b
 	.4byte	.LASF127
 	.byte	0x1f
 	.2byte	0x730
-	.4byte	0x8bd8
+	.4byte	0x8c48
 	.byte	0xe8
 	.uleb128 0x1b
 	.4byte	.LASF128
 	.byte	0x1f
 	.2byte	0x732
-	.4byte	0x8bd8
+	.4byte	0x8c48
 	.byte	0xf0
 	.uleb128 0x1b
 	.4byte	.LASF129
 	.byte	0x1f
 	.2byte	0x734
-	.4byte	0x899c
+	.4byte	0x8a0c
 	.byte	0xf8
 	.uleb128 0x1c
 	.4byte	.LASF130
@@ -11634,7 +11644,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF136
 	.byte	0x21
 	.byte	0x3e
-	.4byte	0x67c8
+	.4byte	0x6838
 	.byte	0x8
 	.byte	0
 	.uleb128 0x15
@@ -12390,7 +12400,7 @@ __exitcall_ebc_exit:
 	.byte	0x12
 	.4byte	0xc6
 	.uleb128 0x2a
-	.4byte	.LASF988
+	.4byte	.LASF1002
 	.byte	0
 	.byte	0x2d
 	.2byte	0x1b1
@@ -13857,19 +13867,19 @@ __exitcall_ebc_exit:
 	.4byte	.LASF424
 	.byte	0x1f
 	.2byte	0x26b
-	.4byte	0x7c3c
+	.4byte	0x7cac
 	.byte	0x10
 	.uleb128 0x1b
 	.4byte	.LASF425
 	.byte	0x1f
 	.2byte	0x26c
-	.4byte	0x7c3c
+	.4byte	0x7cac
 	.byte	0x18
 	.uleb128 0x1b
 	.4byte	.LASF426
 	.byte	0x1f
 	.2byte	0x26f
-	.4byte	0x7db5
+	.4byte	0x7e25
 	.byte	0x20
 	.uleb128 0x1b
 	.4byte	.LASF427
@@ -13881,7 +13891,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF428
 	.byte	0x1f
 	.2byte	0x271
-	.4byte	0x5176
+	.4byte	0x51e6
 	.byte	0x30
 	.uleb128 0x1b
 	.4byte	.LASF429
@@ -13896,7 +13906,7 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0x40
 	.uleb128 0x23
-	.4byte	0x7ba2
+	.4byte	0x7c12
 	.byte	0x48
 	.uleb128 0x1b
 	.4byte	.LASF431
@@ -13968,7 +13978,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF442
 	.byte	0x1f
 	.2byte	0x295
-	.4byte	0x4e36
+	.4byte	0x4ea6
 	.byte	0xa0
 	.uleb128 0x1b
 	.4byte	.LASF443
@@ -13998,7 +14008,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF447
 	.byte	0x1f
 	.2byte	0x29d
-	.4byte	0x7dc0
+	.4byte	0x7e30
 	.2byte	0x100
 	.uleb128 0x1c
 	.4byte	.LASF448
@@ -14037,7 +14047,7 @@ __exitcall_ebc_exit:
 	.4byte	0x3a7
 	.2byte	0x130
 	.uleb128 0x2f
-	.4byte	0x7bc4
+	.4byte	0x7c34
 	.2byte	0x140
 	.uleb128 0x1c
 	.4byte	.LASF454
@@ -14073,19 +14083,19 @@ __exitcall_ebc_exit:
 	.4byte	.LASF459
 	.byte	0x1f
 	.2byte	0x2b3
-	.4byte	0x7dc6
+	.4byte	0x7e36
 	.2byte	0x170
 	.uleb128 0x1c
 	.4byte	.LASF460
 	.byte	0x1f
 	.2byte	0x2b4
-	.4byte	0x7e0e
+	.4byte	0x7e7e
 	.2byte	0x178
 	.uleb128 0x1c
 	.4byte	.LASF461
 	.byte	0x1f
 	.2byte	0x2b5
-	.4byte	0x5071
+	.4byte	0x50e1
 	.2byte	0x180
 	.uleb128 0x1c
 	.4byte	.LASF462
@@ -14094,7 +14104,7 @@ __exitcall_ebc_exit:
 	.4byte	0x3a7
 	.2byte	0x250
 	.uleb128 0x2f
-	.4byte	0x7be6
+	.4byte	0x7c56
 	.2byte	0x260
 	.uleb128 0x1c
 	.4byte	.LASF463
@@ -14112,19 +14122,19 @@ __exitcall_ebc_exit:
 	.4byte	.LASF465
 	.byte	0x1f
 	.2byte	0x2c3
-	.4byte	0x7e19
+	.4byte	0x7e89
 	.2byte	0x270
 	.uleb128 0x1c
 	.4byte	.LASF466
 	.byte	0x1f
 	.2byte	0x2c7
-	.4byte	0x7e24
+	.4byte	0x7e94
 	.2byte	0x278
 	.uleb128 0x1c
 	.4byte	.LASF467
 	.byte	0x1f
 	.2byte	0x2cb
-	.4byte	0x7e2f
+	.4byte	0x7e9f
 	.2byte	0x280
 	.uleb128 0x1c
 	.4byte	.LASF468
@@ -14308,31 +14318,31 @@ __exitcall_ebc_exit:
 	.4byte	.LASF488
 	.byte	0x1f
 	.2byte	0x589
-	.4byte	0x848e
+	.4byte	0x84fe
 	.byte	0x28
 	.uleb128 0x1b
 	.4byte	.LASF489
 	.byte	0x1f
 	.2byte	0x58a
-	.4byte	0x8664
+	.4byte	0x86d4
 	.byte	0x30
 	.uleb128 0x1b
 	.4byte	.LASF490
 	.byte	0x1f
 	.2byte	0x58b
-	.4byte	0x866a
+	.4byte	0x86da
 	.byte	0x38
 	.uleb128 0x1b
 	.4byte	.LASF491
 	.byte	0x1f
 	.2byte	0x58c
-	.4byte	0x8670
+	.4byte	0x86e0
 	.byte	0x40
 	.uleb128 0x1b
 	.4byte	.LASF492
 	.byte	0x1f
 	.2byte	0x58d
-	.4byte	0x8680
+	.4byte	0x86f0
 	.byte	0x48
 	.uleb128 0x1b
 	.4byte	.LASF493
@@ -14362,7 +14372,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF497
 	.byte	0x1f
 	.2byte	0x592
-	.4byte	0x4e36
+	.4byte	0x4ea6
 	.byte	0x70
 	.uleb128 0x1b
 	.4byte	.LASF498
@@ -14386,31 +14396,31 @@ __exitcall_ebc_exit:
 	.4byte	.LASF501
 	.byte	0x1f
 	.2byte	0x598
-	.4byte	0x8690
+	.4byte	0x8700
 	.byte	0xb0
 	.uleb128 0x1b
 	.4byte	.LASF502
 	.byte	0x1f
 	.2byte	0x59a
-	.4byte	0x86a6
+	.4byte	0x8716
 	.byte	0xb8
 	.uleb128 0x1b
 	.4byte	.LASF503
 	.byte	0x1f
 	.2byte	0x59b
-	.4byte	0x8779
+	.4byte	0x87e9
 	.byte	0xc0
 	.uleb128 0x1b
 	.4byte	.LASF504
 	.byte	0x1f
 	.2byte	0x59e
-	.4byte	0x8789
+	.4byte	0x87f9
 	.byte	0xc8
 	.uleb128 0x1b
 	.4byte	.LASF505
 	.byte	0x1f
 	.2byte	0x5a1
-	.4byte	0x8794
+	.4byte	0x8804
 	.byte	0xd0
 	.uleb128 0x1b
 	.4byte	.LASF506
@@ -14434,19 +14444,19 @@ __exitcall_ebc_exit:
 	.4byte	.LASF509
 	.byte	0x1f
 	.2byte	0x5a6
-	.4byte	0x7b86
+	.4byte	0x7bf6
 	.byte	0xf8
 	.uleb128 0x1c
 	.4byte	.LASF510
 	.byte	0x1f
 	.2byte	0x5a7
-	.4byte	0x4866
+	.4byte	0x48d6
 	.2byte	0x100
 	.uleb128 0x1c
 	.4byte	.LASF511
 	.byte	0x1f
 	.2byte	0x5a8
-	.4byte	0x879f
+	.4byte	0x880f
 	.2byte	0x108
 	.uleb128 0x1c
 	.4byte	.LASF512
@@ -14464,25 +14474,25 @@ __exitcall_ebc_exit:
 	.4byte	.LASF514
 	.byte	0x1f
 	.2byte	0x5ab
-	.4byte	0x7581
+	.4byte	0x75f1
 	.2byte	0x128
 	.uleb128 0x1c
 	.4byte	.LASF515
 	.byte	0x1f
 	.2byte	0x5ad
-	.4byte	0x8336
+	.4byte	0x83a6
 	.2byte	0x268
 	.uleb128 0x1c
 	.4byte	.LASF516
 	.byte	0x1f
 	.2byte	0x5af
-	.4byte	0x87a5
+	.4byte	0x8815
 	.2byte	0x420
 	.uleb128 0x1c
 	.4byte	.LASF517
 	.byte	0x1f
 	.2byte	0x5b0
-	.4byte	0x5d74
+	.4byte	0x5de4
 	.2byte	0x440
 	.uleb128 0x1c
 	.4byte	.LASF518
@@ -14536,7 +14546,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF526
 	.byte	0x1f
 	.2byte	0x5cd
-	.4byte	0x4bbc
+	.4byte	0x4c2c
 	.2byte	0x4a0
 	.uleb128 0x1c
 	.4byte	.LASF527
@@ -14572,19 +14582,19 @@ __exitcall_ebc_exit:
 	.4byte	.LASF532
 	.byte	0x1f
 	.2byte	0x5e1
-	.4byte	0x5a36
+	.4byte	0x5aa6
 	.2byte	0x508
 	.uleb128 0x1c
 	.4byte	.LASF533
 	.byte	0x1f
 	.2byte	0x5e7
-	.4byte	0x4cf6
+	.4byte	0x4d66
 	.2byte	0x540
 	.uleb128 0x1c
 	.4byte	.LASF534
 	.byte	0x1f
 	.2byte	0x5e8
-	.4byte	0x4cf6
+	.4byte	0x4d66
 	.2byte	0x580
 	.uleb128 0x30
 	.string	"rcu"
@@ -15240,19 +15250,19 @@ __exitcall_ebc_exit:
 	.4byte	.LASF594
 	.byte	0x48
 	.2byte	0x2ba
-	.4byte	0x45f8
+	.4byte	0x4668
 	.byte	0x88
 	.uleb128 0x2b
 	.string	"se"
 	.byte	0x48
 	.2byte	0x2bb
-	.4byte	0x4227
+	.4byte	0x4297
 	.byte	0xc0
 	.uleb128 0x30
 	.string	"rt"
 	.byte	0x48
 	.2byte	0x2bc
-	.4byte	0x4354
+	.4byte	0x43c4
 	.2byte	0x2c0
 	.uleb128 0x1c
 	.4byte	.LASF595
@@ -15282,13 +15292,13 @@ __exitcall_ebc_exit:
 	.4byte	.LASF599
 	.byte	0x48
 	.2byte	0x2c5
-	.4byte	0x4603
+	.4byte	0x4673
 	.2byte	0x330
 	.uleb128 0x30
 	.string	"dl"
 	.byte	0x48
 	.2byte	0x2c7
-	.4byte	0x43f7
+	.4byte	0x4467
 	.2byte	0x338
 	.uleb128 0x1c
 	.4byte	.LASF600
@@ -15324,7 +15334,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF605
 	.byte	0x48
 	.2byte	0x2e0
-	.4byte	0x4522
+	.4byte	0x4592
 	.2byte	0x43c
 	.uleb128 0x1c
 	.4byte	.LASF606
@@ -15336,7 +15346,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF607
 	.byte	0x48
 	.2byte	0x2e2
-	.4byte	0x460e
+	.4byte	0x467e
 	.2byte	0x450
 	.uleb128 0x1c
 	.4byte	.LASF608
@@ -15372,7 +15382,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF613
 	.byte	0x48
 	.2byte	0x2ed
-	.4byte	0x3fa5
+	.4byte	0x4015
 	.2byte	0x478
 	.uleb128 0x1c
 	.4byte	.LASF558
@@ -15384,37 +15394,37 @@ __exitcall_ebc_exit:
 	.4byte	.LASF614
 	.byte	0x48
 	.2byte	0x2f1
-	.4byte	0x34b1
+	.4byte	0x3521
 	.2byte	0x4a8
 	.uleb128 0x1c
 	.4byte	.LASF615
 	.byte	0x48
 	.2byte	0x2f2
-	.4byte	0x34e2
+	.4byte	0x3552
 	.2byte	0x4d0
 	.uleb128 0x30
 	.string	"mm"
 	.byte	0x48
 	.2byte	0x2f5
-	.4byte	0x4637
+	.4byte	0x46a7
 	.2byte	0x4e8
 	.uleb128 0x1c
 	.4byte	.LASF616
 	.byte	0x48
 	.2byte	0x2f6
-	.4byte	0x4637
+	.4byte	0x46a7
 	.2byte	0x4f0
 	.uleb128 0x1c
 	.4byte	.LASF617
 	.byte	0x48
 	.2byte	0x2f9
-	.4byte	0x3c80
+	.4byte	0x3cf0
 	.2byte	0x4f8
 	.uleb128 0x1c
 	.4byte	.LASF618
 	.byte	0x48
 	.2byte	0x2fc
-	.4byte	0x3de0
+	.4byte	0x3e50
 	.2byte	0x520
 	.uleb128 0x1c
 	.4byte	.LASF619
@@ -15627,13 +15637,13 @@ __exitcall_ebc_exit:
 	.4byte	.LASF646
 	.byte	0x48
 	.2byte	0x357
-	.4byte	0x463d
+	.4byte	0x46ad
 	.2byte	0x600
 	.uleb128 0x1c
 	.4byte	.LASF647
 	.byte	0x48
 	.2byte	0x358
-	.4byte	0x4643
+	.4byte	0x46b3
 	.2byte	0x608
 	.uleb128 0x1c
 	.4byte	.LASF648
@@ -15651,19 +15661,19 @@ __exitcall_ebc_exit:
 	.4byte	.LASF650
 	.byte	0x48
 	.2byte	0x35c
-	.4byte	0x4678
+	.4byte	0x46e8
 	.2byte	0x668
 	.uleb128 0x1c
 	.4byte	.LASF651
 	.byte	0x48
 	.2byte	0x35f
-	.4byte	0x467e
+	.4byte	0x46ee
 	.2byte	0x670
 	.uleb128 0x1c
 	.4byte	.LASF652
 	.byte	0x48
 	.2byte	0x362
-	.4byte	0x467e
+	.4byte	0x46ee
 	.2byte	0x678
 	.uleb128 0x1c
 	.4byte	.LASF653
@@ -15687,7 +15697,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF656
 	.byte	0x48
 	.2byte	0x36c
-	.4byte	0x4684
+	.4byte	0x46f4
 	.2byte	0x698
 	.uleb128 0x1c
 	.4byte	.LASF657
@@ -15699,7 +15709,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF658
 	.byte	0x48
 	.2byte	0x36f
-	.4byte	0x3f40
+	.4byte	0x3fb0
 	.2byte	0x6a8
 	.uleb128 0x1c
 	.4byte	.LASF659
@@ -15741,43 +15751,43 @@ __exitcall_ebc_exit:
 	.4byte	.LASF665
 	.byte	0x48
 	.2byte	0x386
-	.4byte	0x3f71
+	.4byte	0x3fe1
 	.2byte	0x6f0
 	.uleb128 0x1c
 	.4byte	.LASF666
 	.byte	0x48
 	.2byte	0x387
-	.4byte	0x468a
+	.4byte	0x46fa
 	.2byte	0x708
 	.uleb128 0x1c
 	.4byte	.LASF667
 	.byte	0x48
 	.2byte	0x38d
-	.4byte	0x47d2
+	.4byte	0x4842
 	.2byte	0x738
 	.uleb128 0x1c
 	.4byte	.LASF668
 	.byte	0x48
 	.2byte	0x390
-	.4byte	0x47d2
+	.4byte	0x4842
 	.2byte	0x740
 	.uleb128 0x1c
 	.4byte	.LASF669
 	.byte	0x48
 	.2byte	0x393
-	.4byte	0x47d2
+	.4byte	0x4842
 	.2byte	0x748
 	.uleb128 0x1c
 	.4byte	.LASF670
 	.byte	0x48
 	.2byte	0x39c
-	.4byte	0x47d8
+	.4byte	0x4848
 	.2byte	0x750
 	.uleb128 0x1c
 	.4byte	.LASF671
 	.byte	0x48
 	.2byte	0x39e
-	.4byte	0x47ed
+	.4byte	0x485d
 	.2byte	0x760
 	.uleb128 0x1c
 	.4byte	.LASF672
@@ -15795,55 +15805,55 @@ __exitcall_ebc_exit:
 	.string	"fs"
 	.byte	0x48
 	.2byte	0x3a9
-	.4byte	0x47f8
+	.4byte	0x4868
 	.2byte	0x778
 	.uleb128 0x1c
 	.4byte	.LASF674
 	.byte	0x48
 	.2byte	0x3ac
-	.4byte	0x4803
+	.4byte	0x4873
 	.2byte	0x780
 	.uleb128 0x1c
 	.4byte	.LASF675
 	.byte	0x48
 	.2byte	0x3af
-	.4byte	0x480e
+	.4byte	0x487e
 	.2byte	0x788
 	.uleb128 0x1c
 	.4byte	.LASF676
 	.byte	0x48
 	.2byte	0x3b2
-	.4byte	0x4819
+	.4byte	0x4889
 	.2byte	0x790
 	.uleb128 0x1c
 	.4byte	.LASF677
 	.byte	0x48
 	.2byte	0x3b3
-	.4byte	0x4824
+	.4byte	0x4894
 	.2byte	0x798
 	.uleb128 0x1c
 	.4byte	.LASF678
 	.byte	0x48
 	.2byte	0x3b4
-	.4byte	0x38e5
+	.4byte	0x3955
 	.2byte	0x7a0
 	.uleb128 0x1c
 	.4byte	.LASF679
 	.byte	0x48
 	.2byte	0x3b5
-	.4byte	0x38e5
+	.4byte	0x3955
 	.2byte	0x7a8
 	.uleb128 0x1c
 	.4byte	.LASF680
 	.byte	0x48
 	.2byte	0x3b7
-	.4byte	0x38e5
+	.4byte	0x3955
 	.2byte	0x7b0
 	.uleb128 0x1c
 	.4byte	.LASF219
 	.byte	0x48
 	.2byte	0x3b8
-	.4byte	0x3c5b
+	.4byte	0x3ccb
 	.2byte	0x7b8
 	.uleb128 0x1c
 	.4byte	.LASF681
@@ -15873,13 +15883,13 @@ __exitcall_ebc_exit:
 	.4byte	.LASF685
 	.byte	0x48
 	.2byte	0x3bf
-	.4byte	0x482f
+	.4byte	0x489f
 	.2byte	0x7f0
 	.uleb128 0x1c
 	.4byte	.LASF686
 	.byte	0x48
 	.2byte	0x3c4
-	.4byte	0x3859
+	.4byte	0x38c9
 	.2byte	0x7f8
 	.uleb128 0x1c
 	.4byte	.LASF687
@@ -15909,13 +15919,13 @@ __exitcall_ebc_exit:
 	.4byte	.LASF691
 	.byte	0x48
 	.2byte	0x3d0
-	.4byte	0x4544
+	.4byte	0x45b4
 	.2byte	0x820
 	.uleb128 0x1c
 	.4byte	.LASF692
 	.byte	0x48
 	.2byte	0x3d4
-	.4byte	0x3532
+	.4byte	0x35a2
 	.2byte	0x828
 	.uleb128 0x1c
 	.4byte	.LASF693
@@ -15927,7 +15937,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF694
 	.byte	0x48
 	.2byte	0x3d8
-	.4byte	0x483a
+	.4byte	0x48aa
 	.2byte	0x840
 	.uleb128 0x1c
 	.4byte	.LASF695
@@ -15939,31 +15949,31 @@ __exitcall_ebc_exit:
 	.4byte	.LASF696
 	.byte	0x48
 	.2byte	0x403
-	.4byte	0x4845
+	.4byte	0x48b5
 	.2byte	0x850
 	.uleb128 0x1c
 	.4byte	.LASF697
 	.byte	0x48
 	.2byte	0x407
-	.4byte	0x4850
+	.4byte	0x48c0
 	.2byte	0x858
 	.uleb128 0x1c
 	.4byte	.LASF698
 	.byte	0x48
 	.2byte	0x40b
-	.4byte	0x485b
+	.4byte	0x48cb
 	.2byte	0x860
 	.uleb128 0x1c
 	.4byte	.LASF699
 	.byte	0x48
 	.2byte	0x40d
-	.4byte	0x4866
+	.4byte	0x48d6
 	.2byte	0x868
 	.uleb128 0x1c
 	.4byte	.LASF700
 	.byte	0x48
 	.2byte	0x40f
-	.4byte	0x48fd
+	.4byte	0x496d
 	.2byte	0x870
 	.uleb128 0x1c
 	.4byte	.LASF701
@@ -15975,13 +15985,13 @@ __exitcall_ebc_exit:
 	.4byte	.LASF702
 	.byte	0x48
 	.2byte	0x413
-	.4byte	0x4903
+	.4byte	0x4973
 	.2byte	0x880
 	.uleb128 0x1c
 	.4byte	.LASF703
 	.byte	0x48
 	.2byte	0x415
-	.4byte	0x3e77
+	.4byte	0x3ee7
 	.2byte	0x888
 	.uleb128 0x1c
 	.4byte	.LASF704
@@ -16011,7 +16021,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF708
 	.byte	0x48
 	.2byte	0x424
-	.4byte	0x389e
+	.4byte	0x390e
 	.2byte	0x8e8
 	.uleb128 0x1c
 	.4byte	.LASF709
@@ -16035,7 +16045,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF712
 	.byte	0x48
 	.2byte	0x42c
-	.4byte	0x490e
+	.4byte	0x497e
 	.2byte	0x900
 	.uleb128 0x1c
 	.4byte	.LASF713
@@ -16047,13 +16057,13 @@ __exitcall_ebc_exit:
 	.4byte	.LASF714
 	.byte	0x48
 	.2byte	0x435
-	.4byte	0x4919
+	.4byte	0x4989
 	.2byte	0x918
 	.uleb128 0x1c
 	.4byte	.LASF715
 	.byte	0x48
 	.2byte	0x437
-	.4byte	0x4924
+	.4byte	0x4994
 	.2byte	0x920
 	.uleb128 0x1c
 	.4byte	.LASF716
@@ -16065,13 +16075,13 @@ __exitcall_ebc_exit:
 	.4byte	.LASF717
 	.byte	0x48
 	.2byte	0x43a
-	.4byte	0x492f
+	.4byte	0x499f
 	.2byte	0x938
 	.uleb128 0x1c
 	.4byte	.LASF718
 	.byte	0x48
 	.2byte	0x43d
-	.4byte	0x4935
+	.4byte	0x49a5
 	.2byte	0x940
 	.uleb128 0x1c
 	.4byte	.LASF719
@@ -16089,7 +16099,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF721
 	.byte	0x48
 	.2byte	0x47d
-	.4byte	0x4950
+	.4byte	0x49c0
 	.2byte	0x980
 	.uleb128 0x1c
 	.4byte	.LASF722
@@ -16113,7 +16123,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF725
 	.byte	0x48
 	.2byte	0x487
-	.4byte	0x3e6f
+	.4byte	0x3edf
 	.2byte	0x998
 	.uleb128 0x30
 	.string	"rcu"
@@ -16125,19 +16135,19 @@ __exitcall_ebc_exit:
 	.4byte	.LASF726
 	.byte	0x48
 	.2byte	0x48c
-	.4byte	0x495b
+	.4byte	0x49cb
 	.2byte	0x9a8
 	.uleb128 0x1c
 	.4byte	.LASF727
 	.byte	0x48
 	.2byte	0x48e
-	.4byte	0x3e3e
+	.4byte	0x3eae
 	.2byte	0x9b0
 	.uleb128 0x1c
 	.4byte	.LASF728
 	.byte	0x48
 	.2byte	0x491
-	.4byte	0x4966
+	.4byte	0x49d6
 	.2byte	0x9c0
 	.uleb128 0x1c
 	.4byte	.LASF729
@@ -16185,7 +16195,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF736
 	.byte	0x48
 	.2byte	0x4e4
-	.4byte	0x4971
+	.4byte	0x49e1
 	.2byte	0x9f8
 	.uleb128 0x1c
 	.4byte	.LASF737
@@ -16209,19 +16219,19 @@ __exitcall_ebc_exit:
 	.4byte	.LASF740
 	.byte	0x48
 	.2byte	0x4ec
-	.4byte	0x4971
+	.4byte	0x49e1
 	.2byte	0xa10
 	.uleb128 0x1c
 	.4byte	.LASF741
 	.byte	0x48
 	.2byte	0x4f0
-	.4byte	0x497c
+	.4byte	0x49ec
 	.2byte	0xa18
 	.uleb128 0x1c
 	.4byte	.LASF742
 	.byte	0x48
 	.2byte	0x4f4
-	.4byte	0x49d1
+	.4byte	0x4a41
 	.2byte	0xa20
 	.uleb128 0x1c
 	.4byte	.LASF743
@@ -16239,7 +16249,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF745
 	.byte	0x48
 	.2byte	0x502
-	.4byte	0x4a44
+	.4byte	0x4ab4
 	.2byte	0xa38
 	.uleb128 0x1c
 	.4byte	.LASF746
@@ -16254,10 +16264,10 @@ __exitcall_ebc_exit:
 	.4byte	0x458
 	.2byte	0xa48
 	.uleb128 0x2f
-	.4byte	0x4581
+	.4byte	0x45f1
 	.2byte	0xa50
 	.uleb128 0x2f
-	.4byte	0x45c7
+	.4byte	0x4637
 	.2byte	0xa58
 	.uleb128 0x1c
 	.4byte	.LASF748
@@ -16789,71 +16799,120 @@ __exitcall_ebc_exit:
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x331a
-	.uleb128 0x15
+	.uleb128 0x38
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0xd
+	.2byte	0x13a
+	.4byte	0x3395
+	.uleb128 0xc
 	.4byte	.LASF825
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF826
+	.byte	0x4
+	.uleb128 0xc
+	.4byte	.LASF827
+	.byte	0x8
+	.uleb128 0xc
+	.4byte	.LASF828
+	.byte	0x10
+	.uleb128 0xc
+	.4byte	.LASF829
+	.byte	0x20
+	.uleb128 0xc
+	.4byte	.LASF830
+	.byte	0x40
+	.uleb128 0xc
+	.4byte	.LASF831
+	.byte	0x80
+	.uleb128 0x35
+	.4byte	.LASF832
+	.4byte	0x10000
+	.uleb128 0x35
+	.4byte	.LASF833
+	.4byte	0x20000
+	.uleb128 0x35
+	.4byte	.LASF834
+	.4byte	0x40000
+	.uleb128 0x35
+	.4byte	.LASF835
+	.4byte	0x80000
+	.uleb128 0x39
+	.4byte	.LASF836
+	.2byte	0x200
+	.uleb128 0xc
+	.4byte	.LASF837
+	.byte	0x4
+	.uleb128 0x39
+	.4byte	.LASF838
+	.2byte	0x100
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF839
 	.byte	0xd
 	.2byte	0x187
 	.4byte	0x331f
 	.uleb128 0x15
-	.4byte	.LASF826
+	.4byte	.LASF840
 	.byte	0xd
 	.2byte	0x188
 	.4byte	0x331f
 	.uleb128 0x15
-	.4byte	.LASF827
+	.4byte	.LASF841
 	.byte	0xd
 	.2byte	0x189
 	.4byte	0x331f
 	.uleb128 0x15
-	.4byte	.LASF828
+	.4byte	.LASF842
 	.byte	0xd
 	.2byte	0x18a
 	.4byte	0x331f
 	.uleb128 0x15
-	.4byte	.LASF829
+	.4byte	.LASF843
 	.byte	0xd
 	.2byte	0x18b
 	.4byte	0x331f
 	.uleb128 0x15
-	.4byte	.LASF830
+	.4byte	.LASF844
 	.byte	0xd
 	.2byte	0x18c
 	.4byte	0x331f
 	.uleb128 0x15
-	.4byte	.LASF831
+	.4byte	.LASF845
 	.byte	0xd
 	.2byte	0x18d
 	.4byte	0x331f
 	.uleb128 0xd
-	.4byte	.LASF832
+	.4byte	.LASF846
 	.byte	0x4
 	.byte	0x56
 	.byte	0x13
-	.4byte	0x3392
+	.4byte	0x3402
 	.uleb128 0xe
-	.4byte	.LASF833
+	.4byte	.LASF847
 	.byte	0x56
 	.byte	0x14
 	.4byte	0x37c
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF834
+	.4byte	.LASF848
 	.byte	0x56
 	.byte	0x15
-	.4byte	0x3379
+	.4byte	0x33e9
 	.uleb128 0x8
-	.4byte	.LASF835
+	.4byte	.LASF849
 	.byte	0x57
 	.byte	0x19
 	.4byte	0x15a
 	.uleb128 0x8
-	.4byte	.LASF836
+	.4byte	.LASF850
 	.byte	0x57
 	.byte	0x1a
 	.4byte	0x15a
 	.uleb128 0x8
-	.4byte	.LASF837
+	.4byte	.LASF851
 	.byte	0x57
 	.byte	0x1c
 	.4byte	0x15a
@@ -16861,101 +16920,101 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x57
 	.byte	0x21
-	.4byte	0x33d3
+	.4byte	0x3443
 	.uleb128 0x20
 	.string	"pte"
 	.byte	0x57
 	.byte	0x21
-	.4byte	0x339d
+	.4byte	0x340d
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF838
+	.4byte	.LASF852
 	.byte	0x57
 	.byte	0x21
-	.4byte	0x33be
+	.4byte	0x342e
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x57
 	.byte	0x26
-	.4byte	0x33f3
+	.4byte	0x3463
 	.uleb128 0x20
 	.string	"pmd"
 	.byte	0x57
 	.byte	0x26
-	.4byte	0x33a8
+	.4byte	0x3418
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF839
+	.4byte	.LASF853
 	.byte	0x57
 	.byte	0x26
-	.4byte	0x33de
+	.4byte	0x344e
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x57
 	.byte	0x31
-	.4byte	0x3413
+	.4byte	0x3483
 	.uleb128 0x20
 	.string	"pgd"
 	.byte	0x57
 	.byte	0x31
-	.4byte	0x33b3
+	.4byte	0x3423
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF840
+	.4byte	.LASF854
 	.byte	0x57
 	.byte	0x31
-	.4byte	0x33fe
+	.4byte	0x346e
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x57
 	.byte	0x35
-	.4byte	0x3433
+	.4byte	0x34a3
 	.uleb128 0xe
-	.4byte	.LASF841
+	.4byte	.LASF855
 	.byte	0x57
 	.byte	0x35
-	.4byte	0x339d
+	.4byte	0x340d
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF842
+	.4byte	.LASF856
 	.byte	0x57
 	.byte	0x35
-	.4byte	0x341e
+	.4byte	0x348e
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x58
 	.byte	0xf
-	.4byte	0x3453
+	.4byte	0x34c3
 	.uleb128 0x20
 	.string	"pgd"
 	.byte	0x58
 	.byte	0xf
-	.4byte	0x3413
+	.4byte	0x3483
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF843
+	.4byte	.LASF857
 	.byte	0x58
 	.byte	0xf
-	.4byte	0x343e
+	.4byte	0x34ae
 	.uleb128 0x8
-	.4byte	.LASF844
+	.4byte	.LASF858
 	.byte	0x59
 	.byte	0x2a
-	.4byte	0x3469
+	.4byte	0x34d9
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x346f
+	.4byte	0x34df
 	.uleb128 0xd
-	.4byte	.LASF845
+	.4byte	.LASF859
 	.byte	0x40
 	.byte	0x5a
 	.byte	0x47
-	.4byte	0x34ac
+	.4byte	0x351c
 	.uleb128 0xe
 	.4byte	.LASF171
 	.byte	0x5a
@@ -16963,32 +17022,32 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x23
-	.4byte	0x53d0
+	.4byte	0x5440
 	.byte	0x8
 	.uleb128 0x23
-	.4byte	0x5402
+	.4byte	0x5472
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF846
+	.4byte	.LASF860
 	.byte	0x5a
 	.byte	0xb8
 	.4byte	0x37c
 	.byte	0x34
 	.uleb128 0xe
-	.4byte	.LASF847
+	.4byte	.LASF861
 	.byte	0x5a
 	.byte	0xbb
-	.4byte	0x4971
+	.4byte	0x49e1
 	.byte	0x38
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x346f
+	.4byte	0x34df
 	.uleb128 0xd
-	.4byte	.LASF848
+	.4byte	.LASF862
 	.byte	0x28
 	.byte	0x5b
 	.byte	0x55
-	.4byte	0x34e2
+	.4byte	0x3552
 	.uleb128 0xe
 	.4byte	.LASF590
 	.byte	0x5b
@@ -16996,88 +17055,88 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF849
+	.4byte	.LASF863
 	.byte	0x5b
 	.byte	0x57
 	.4byte	0x3a7
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF850
+	.4byte	.LASF864
 	.byte	0x5b
 	.byte	0x58
 	.4byte	0x3a7
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF851
+	.4byte	.LASF865
 	.byte	0x18
 	.byte	0x5c
 	.byte	0x24
-	.4byte	0x3513
+	.4byte	0x3583
 	.uleb128 0xe
-	.4byte	.LASF852
+	.4byte	.LASF866
 	.byte	0x5c
 	.byte	0x25
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF853
+	.4byte	.LASF867
 	.byte	0x5c
 	.byte	0x26
-	.4byte	0x3513
+	.4byte	0x3583
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF854
+	.4byte	.LASF868
 	.byte	0x5c
 	.byte	0x27
-	.4byte	0x3513
+	.4byte	0x3583
 	.byte	0x10
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x34e2
+	.4byte	0x3552
 	.uleb128 0xd
-	.4byte	.LASF855
+	.4byte	.LASF869
 	.byte	0x8
 	.byte	0x5c
 	.byte	0x2b
-	.4byte	0x3532
+	.4byte	0x35a2
 	.uleb128 0xe
-	.4byte	.LASF851
+	.4byte	.LASF865
 	.byte	0x5c
 	.byte	0x2c
-	.4byte	0x3513
+	.4byte	0x3583
 	.byte	0
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF856
+	.4byte	.LASF870
 	.byte	0x10
 	.byte	0x5c
 	.byte	0x39
-	.4byte	0x3557
+	.4byte	0x35c7
 	.uleb128 0xe
-	.4byte	.LASF855
+	.4byte	.LASF869
 	.byte	0x5c
 	.byte	0x3a
-	.4byte	0x3519
+	.4byte	0x3589
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF857
+	.4byte	.LASF871
 	.byte	0x5c
 	.byte	0x3b
-	.4byte	0x3513
+	.4byte	0x3583
 	.byte	0x8
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF858
+	.4byte	.LASF872
 	.byte	0x5d
 	.byte	0x47
 	.4byte	0x458
 	.uleb128 0x19
-	.4byte	.LASF859
+	.4byte	.LASF873
 	.byte	0x5d
 	.byte	0x48
-	.4byte	0x356d
+	.4byte	0x35dd
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x30
@@ -17085,55 +17144,55 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.4byte	0x6d
 	.uleb128 0x1f
-	.4byte	.LASF860
+	.4byte	.LASF874
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x5d
 	.byte	0x5d
-	.4byte	0x35a2
+	.4byte	0x3612
 	.uleb128 0xc
-	.4byte	.LASF861
+	.4byte	.LASF875
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF862
+	.4byte	.LASF876
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF863
+	.4byte	.LASF877
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF864
+	.4byte	.LASF878
 	.byte	0x3
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x5c
-	.4byte	0x35b2
+	.4byte	0x3622
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x35a2
+	.4byte	0x3612
 	.uleb128 0x19
-	.4byte	.LASF865
+	.4byte	.LASF879
 	.byte	0x5d
 	.byte	0x64
-	.4byte	0x35b2
+	.4byte	0x3622
 	.uleb128 0x19
-	.4byte	.LASF866
+	.4byte	.LASF880
 	.byte	0x5d
 	.byte	0x66
-	.4byte	0x3579
+	.4byte	0x35e9
 	.uleb128 0xd
-	.4byte	.LASF867
+	.4byte	.LASF881
 	.byte	0x20
 	.byte	0x5e
 	.byte	0x9
-	.4byte	0x35f2
+	.4byte	0x3662
 	.uleb128 0xe
-	.4byte	.LASF868
+	.4byte	.LASF882
 	.byte	0x5e
 	.byte	0xa
-	.4byte	0x34e2
+	.4byte	0x3552
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF194
@@ -17143,55 +17202,55 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF869
+	.4byte	.LASF883
 	.byte	0x10
 	.byte	0x5e
 	.byte	0xe
-	.4byte	0x3617
+	.4byte	0x3687
 	.uleb128 0xe
 	.4byte	.LASF136
 	.byte	0x5e
 	.byte	0xf
-	.4byte	0x3519
+	.4byte	0x3589
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF64
 	.byte	0x5e
 	.byte	0x10
-	.4byte	0x3617
+	.4byte	0x3687
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x35cd
+	.4byte	0x363d
 	.uleb128 0x1f
-	.4byte	.LASF870
+	.4byte	.LASF884
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x54
 	.byte	0xbe
-	.4byte	0x363a
+	.4byte	0x36aa
 	.uleb128 0xc
-	.4byte	.LASF871
+	.4byte	.LASF885
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF872
+	.4byte	.LASF886
 	.byte	0x1
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF873
+	.4byte	.LASF887
 	.byte	0x48
 	.byte	0x5f
 	.byte	0x6f
-	.4byte	0x36a7
+	.4byte	0x3717
 	.uleb128 0xe
-	.4byte	.LASF868
+	.4byte	.LASF882
 	.byte	0x5f
 	.byte	0x70
-	.4byte	0x35cd
+	.4byte	0x363d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF874
+	.4byte	.LASF888
 	.byte	0x5f
 	.byte	0x71
 	.4byte	0x313b
@@ -17200,13 +17259,13 @@ __exitcall_ebc_exit:
 	.4byte	.LASF790
 	.byte	0x5f
 	.byte	0x72
-	.4byte	0x36bc
+	.4byte	0x372c
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF875
+	.4byte	.LASF889
 	.byte	0x5f
 	.byte	0x73
-	.4byte	0x372f
+	.4byte	0x379f
 	.byte	0x30
 	.uleb128 0xe
 	.4byte	.LASF578
@@ -17215,13 +17274,13 @@ __exitcall_ebc_exit:
 	.4byte	0x110
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF876
+	.4byte	.LASF890
 	.byte	0x5f
 	.byte	0x75
 	.4byte	0x110
 	.byte	0x39
 	.uleb128 0xe
-	.4byte	.LASF877
+	.4byte	.LASF891
 	.byte	0x5f
 	.byte	0x76
 	.4byte	0x110
@@ -17234,31 +17293,31 @@ __exitcall_ebc_exit:
 	.byte	0x40
 	.byte	0
 	.uleb128 0x14
-	.4byte	0x361d
-	.4byte	0x36b6
+	.4byte	0x368d
+	.4byte	0x3726
 	.uleb128 0x11
-	.4byte	0x36b6
+	.4byte	0x3726
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x363a
+	.4byte	0x36aa
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x36a7
+	.4byte	0x3717
 	.uleb128 0xd
-	.4byte	.LASF878
+	.4byte	.LASF892
 	.byte	0x40
 	.byte	0x5f
 	.byte	0x99
-	.4byte	0x372f
+	.4byte	0x379f
 	.uleb128 0xe
-	.4byte	.LASF879
+	.4byte	.LASF893
 	.byte	0x5f
 	.byte	0x9a
-	.4byte	0x381b
+	.4byte	0x388b
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF880
+	.4byte	.LASF894
 	.byte	0x5f
 	.byte	0x9b
 	.4byte	0x6d
@@ -17276,25 +17335,25 @@ __exitcall_ebc_exit:
 	.4byte	0x16fc
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF881
+	.4byte	.LASF895
 	.byte	0x5f
 	.byte	0x9e
-	.4byte	0x36b6
+	.4byte	0x3726
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF882
+	.4byte	.LASF896
 	.byte	0x5f
 	.byte	0x9f
-	.4byte	0x35f2
+	.4byte	0x3662
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF883
+	.4byte	.LASF897
 	.byte	0x5f
 	.byte	0xa0
-	.4byte	0x3826
+	.4byte	0x3896
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF884
+	.4byte	.LASF898
 	.byte	0x5f
 	.byte	0xa1
 	.4byte	0x313b
@@ -17302,13 +17361,13 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x36c2
+	.4byte	0x3732
 	.uleb128 0x26
-	.4byte	.LASF885
+	.4byte	.LASF899
 	.2byte	0x240
 	.byte	0x5f
 	.byte	0xcc
-	.4byte	0x381b
+	.4byte	0x388b
 	.uleb128 0xe
 	.4byte	.LASF116
 	.byte	0x5f
@@ -17322,19 +17381,19 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF886
+	.4byte	.LASF900
 	.byte	0x5f
 	.byte	0xcf
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF887
+	.4byte	.LASF901
 	.byte	0x5f
 	.byte	0xd0
 	.4byte	0x6d
 	.byte	0xc
-	.uleb128 0x38
-	.4byte	.LASF888
+	.uleb128 0x3a
+	.4byte	.LASF902
 	.byte	0x5f
 	.byte	0xd1
 	.4byte	0x6d
@@ -17342,8 +17401,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x1f
 	.byte	0x10
-	.uleb128 0x38
-	.4byte	.LASF889
+	.uleb128 0x3a
+	.4byte	.LASF903
 	.byte	0x5f
 	.byte	0xd2
 	.4byte	0x6d
@@ -17351,8 +17410,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x1e
 	.byte	0x10
-	.uleb128 0x38
-	.4byte	.LASF890
+	.uleb128 0x3a
+	.4byte	.LASF904
 	.byte	0x5f
 	.byte	0xd3
 	.4byte	0x6d
@@ -17360,8 +17419,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x1d
 	.byte	0x10
-	.uleb128 0x38
-	.4byte	.LASF891
+	.uleb128 0x3a
+	.4byte	.LASF905
 	.byte	0x5f
 	.byte	0xd4
 	.4byte	0x6d
@@ -17370,116 +17429,116 @@ __exitcall_ebc_exit:
 	.byte	0x1c
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF892
+	.4byte	.LASF906
 	.byte	0x5f
 	.byte	0xd6
 	.4byte	0x6d
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF893
+	.4byte	.LASF907
 	.byte	0x5f
 	.byte	0xd7
 	.4byte	0xb4
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF894
+	.4byte	.LASF908
 	.byte	0x5f
 	.byte	0xd8
 	.4byte	0xb4
 	.byte	0x1a
 	.uleb128 0xe
-	.4byte	.LASF895
+	.4byte	.LASF909
 	.byte	0x5f
 	.byte	0xd9
 	.4byte	0x6d
 	.byte	0x1c
 	.uleb128 0xe
-	.4byte	.LASF896
+	.4byte	.LASF910
 	.byte	0x5f
 	.byte	0xdb
 	.4byte	0x313b
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF897
+	.4byte	.LASF911
 	.byte	0x5f
 	.byte	0xdc
-	.4byte	0x36b6
+	.4byte	0x3726
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF898
+	.4byte	.LASF912
 	.byte	0x5f
 	.byte	0xdd
 	.4byte	0x313b
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF899
+	.4byte	.LASF913
 	.byte	0x5f
 	.byte	0xde
-	.4byte	0x36b6
+	.4byte	0x3726
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF900
+	.4byte	.LASF914
 	.byte	0x5f
 	.byte	0xdf
-	.4byte	0x382c
+	.4byte	0x389c
 	.byte	0x40
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3735
+	.4byte	0x37a5
 	.uleb128 0x16
 	.4byte	0x313b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3821
+	.4byte	0x3891
 	.uleb128 0x5
-	.4byte	0x36c2
-	.4byte	0x383c
+	.4byte	0x3732
+	.4byte	0x38ac
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x7
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF901
+	.4byte	.LASF915
 	.byte	0x5f
 	.2byte	0x135
 	.4byte	0x6d
 	.uleb128 0x24
-	.4byte	.LASF902
+	.4byte	.LASF916
 	.uleb128 0x15
-	.4byte	.LASF903
+	.4byte	.LASF917
 	.byte	0x5f
 	.2byte	0x15c
-	.4byte	0x3848
+	.4byte	0x38b8
 	.uleb128 0xd
 	.4byte	.LASF686
 	.byte	0x10
 	.byte	0x60
 	.byte	0x1c
-	.4byte	0x387e
+	.4byte	0x38ee
 	.uleb128 0xe
-	.4byte	.LASF904
+	.4byte	.LASF918
 	.byte	0x60
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF905
+	.4byte	.LASF919
 	.byte	0x60
 	.byte	0x1e
-	.4byte	0x3883
+	.4byte	0x38f3
 	.byte	0x8
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF906
+	.4byte	.LASF920
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x387e
+	.4byte	0x38ee
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x61
 	.byte	0x62
-	.4byte	0x389e
+	.4byte	0x390e
 	.uleb128 0xe
 	.4byte	.LASF366
 	.byte	0x61
@@ -17488,32 +17547,32 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF907
+	.4byte	.LASF921
 	.byte	0x61
 	.byte	0x62
-	.4byte	0x3889
+	.4byte	0x38f9
 	.uleb128 0x19
-	.4byte	.LASF908
+	.4byte	.LASF922
 	.byte	0x61
 	.byte	0x63
-	.4byte	0x389e
+	.4byte	0x390e
 	.uleb128 0x5
-	.4byte	0x389e
-	.4byte	0x38c4
+	.4byte	0x390e
+	.4byte	0x3934
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x4
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF909
+	.4byte	.LASF923
 	.byte	0x61
 	.2byte	0x19a
-	.4byte	0x38b4
+	.4byte	0x3924
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x62
 	.byte	0x5a
-	.4byte	0x38e5
+	.4byte	0x3955
 	.uleb128 0x20
 	.string	"sig"
 	.byte	0x62
@@ -17522,45 +17581,45 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF910
+	.4byte	.LASF924
 	.byte	0x62
 	.byte	0x5c
-	.4byte	0x38d0
-	.uleb128 0x39
-	.4byte	.LASF1089
+	.4byte	0x3940
+	.uleb128 0x3b
+	.4byte	.LASF1103
 	.byte	0x8
 	.byte	0x63
 	.byte	0x8
-	.4byte	0x3913
+	.4byte	0x3983
 	.uleb128 0x22
-	.4byte	.LASF911
+	.4byte	.LASF925
 	.byte	0x63
 	.byte	0x9
 	.4byte	0xc6
 	.uleb128 0x22
-	.4byte	.LASF912
+	.4byte	.LASF926
 	.byte	0x63
 	.byte	0xa
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF913
+	.4byte	.LASF927
 	.byte	0x63
 	.byte	0xb
-	.4byte	0x38f0
+	.4byte	0x3960
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x63
 	.byte	0x39
-	.4byte	0x393f
+	.4byte	0x39af
 	.uleb128 0xe
-	.4byte	.LASF914
+	.4byte	.LASF928
 	.byte	0x63
 	.byte	0x3a
 	.4byte	0x1b0
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF915
+	.4byte	.LASF929
 	.byte	0x63
 	.byte	0x3b
 	.4byte	0x1bb
@@ -17570,27 +17629,27 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0x63
 	.byte	0x3f
-	.4byte	0x3978
+	.4byte	0x39e8
 	.uleb128 0xe
-	.4byte	.LASF916
+	.4byte	.LASF930
 	.byte	0x63
 	.byte	0x40
 	.4byte	0x208
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF917
+	.4byte	.LASF931
 	.byte	0x63
 	.byte	0x41
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF918
+	.4byte	.LASF932
 	.byte	0x63
 	.byte	0x42
-	.4byte	0x3913
+	.4byte	0x3983
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF919
+	.4byte	.LASF933
 	.byte	0x63
 	.byte	0x43
 	.4byte	0xc6
@@ -17600,57 +17659,57 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x63
 	.byte	0x47
-	.4byte	0x39a5
+	.4byte	0x3a15
 	.uleb128 0xe
-	.4byte	.LASF914
+	.4byte	.LASF928
 	.byte	0x63
 	.byte	0x48
 	.4byte	0x1b0
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF915
+	.4byte	.LASF929
 	.byte	0x63
 	.byte	0x49
 	.4byte	0x1bb
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF918
+	.4byte	.LASF932
 	.byte	0x63
 	.byte	0x4a
-	.4byte	0x3913
+	.4byte	0x3983
 	.byte	0x8
 	.byte	0
 	.uleb128 0xf
 	.byte	0x20
 	.byte	0x63
 	.byte	0x4e
-	.4byte	0x39ea
+	.4byte	0x3a5a
 	.uleb128 0xe
-	.4byte	.LASF914
+	.4byte	.LASF928
 	.byte	0x63
 	.byte	0x4f
 	.4byte	0x1b0
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF915
+	.4byte	.LASF929
 	.byte	0x63
 	.byte	0x50
 	.4byte	0x1bb
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF920
+	.4byte	.LASF934
 	.byte	0x63
 	.byte	0x51
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF921
+	.4byte	.LASF935
 	.byte	0x63
 	.byte	0x52
 	.4byte	0x1fd
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF922
+	.4byte	.LASF936
 	.byte	0x63
 	.byte	0x53
 	.4byte	0x1fd
@@ -17660,21 +17719,21 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0x63
 	.byte	0x6b
-	.4byte	0x3a17
+	.4byte	0x3a87
 	.uleb128 0xe
-	.4byte	.LASF923
+	.4byte	.LASF937
 	.byte	0x63
 	.byte	0x6c
-	.4byte	0x3a17
+	.4byte	0x3a87
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF924
+	.4byte	.LASF938
 	.byte	0x63
 	.byte	0x6d
 	.4byte	0x458
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF925
+	.4byte	.LASF939
 	.byte	0x63
 	.byte	0x6e
 	.4byte	0x458
@@ -17682,7 +17741,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x3a27
+	.4byte	0x3a97
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x7
@@ -17691,15 +17750,15 @@ __exitcall_ebc_exit:
 	.byte	0xc
 	.byte	0x63
 	.byte	0x71
-	.4byte	0x3a48
+	.4byte	0x3ab8
 	.uleb128 0xe
-	.4byte	.LASF926
+	.4byte	.LASF940
 	.byte	0x63
 	.byte	0x72
-	.4byte	0x3a17
+	.4byte	0x3a87
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF927
+	.4byte	.LASF941
 	.byte	0x63
 	.byte	0x73
 	.4byte	0xd2
@@ -17709,45 +17768,45 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0x63
 	.byte	0x64
-	.4byte	0x3a72
+	.4byte	0x3ae2
 	.uleb128 0x22
-	.4byte	.LASF928
+	.4byte	.LASF942
 	.byte	0x63
 	.byte	0x69
 	.4byte	0xa2
 	.uleb128 0x22
-	.4byte	.LASF929
+	.4byte	.LASF943
 	.byte	0x63
 	.byte	0x6f
-	.4byte	0x39ea
+	.4byte	0x3a5a
 	.uleb128 0x22
-	.4byte	.LASF930
+	.4byte	.LASF944
 	.byte	0x63
 	.byte	0x74
-	.4byte	0x3a27
+	.4byte	0x3a97
 	.byte	0
 	.uleb128 0xf
 	.byte	0x20
 	.byte	0x63
 	.byte	0x57
-	.4byte	0x3a8d
+	.4byte	0x3afd
 	.uleb128 0xe
-	.4byte	.LASF931
+	.4byte	.LASF945
 	.byte	0x63
 	.byte	0x58
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x23
-	.4byte	0x3a48
+	.4byte	0x3ab8
 	.byte	0x8
 	.byte	0
 	.uleb128 0xf
 	.byte	0x10
 	.byte	0x63
 	.byte	0x79
-	.4byte	0x3aae
+	.4byte	0x3b1e
 	.uleb128 0xe
-	.4byte	.LASF932
+	.4byte	.LASF946
 	.byte	0x63
 	.byte	0x7a
 	.4byte	0x199
@@ -17763,21 +17822,21 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x63
 	.byte	0x7f
-	.4byte	0x3adb
+	.4byte	0x3b4b
 	.uleb128 0xe
-	.4byte	.LASF933
+	.4byte	.LASF947
 	.byte	0x63
 	.byte	0x80
 	.4byte	0x458
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF934
+	.4byte	.LASF948
 	.byte	0x63
 	.byte	0x81
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF935
+	.4byte	.LASF949
 	.byte	0x63
 	.byte	0x82
 	.4byte	0x6d
@@ -17787,153 +17846,153 @@ __exitcall_ebc_exit:
 	.byte	0x70
 	.byte	0x63
 	.byte	0x35
-	.4byte	0x3b3c
+	.4byte	0x3bac
 	.uleb128 0x22
-	.4byte	.LASF936
+	.4byte	.LASF950
 	.byte	0x63
 	.byte	0x36
-	.4byte	0x3b3c
+	.4byte	0x3bac
 	.uleb128 0x22
-	.4byte	.LASF937
+	.4byte	.LASF951
 	.byte	0x63
 	.byte	0x3c
-	.4byte	0x391e
+	.4byte	0x398e
 	.uleb128 0x22
-	.4byte	.LASF938
+	.4byte	.LASF952
 	.byte	0x63
 	.byte	0x44
-	.4byte	0x393f
+	.4byte	0x39af
 	.uleb128 0x28
 	.string	"_rt"
 	.byte	0x63
 	.byte	0x4b
-	.4byte	0x3978
+	.4byte	0x39e8
 	.uleb128 0x22
-	.4byte	.LASF939
+	.4byte	.LASF953
 	.byte	0x63
 	.byte	0x54
-	.4byte	0x39a5
+	.4byte	0x3a15
 	.uleb128 0x22
-	.4byte	.LASF940
+	.4byte	.LASF954
 	.byte	0x63
 	.byte	0x76
-	.4byte	0x3a72
+	.4byte	0x3ae2
 	.uleb128 0x22
-	.4byte	.LASF941
+	.4byte	.LASF955
 	.byte	0x63
 	.byte	0x7c
-	.4byte	0x3a8d
+	.4byte	0x3afd
 	.uleb128 0x22
-	.4byte	.LASF942
+	.4byte	.LASF956
 	.byte	0x63
 	.byte	0x83
-	.4byte	0x3aae
+	.4byte	0x3b1e
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xc6
-	.4byte	0x3b4c
+	.4byte	0x3bbc
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1b
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF943
+	.4byte	.LASF957
 	.byte	0x80
 	.byte	0x63
 	.byte	0x2b
-	.4byte	0x3b89
+	.4byte	0x3bf9
 	.uleb128 0xe
-	.4byte	.LASF944
+	.4byte	.LASF958
 	.byte	0x63
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF945
+	.4byte	.LASF959
 	.byte	0x63
 	.byte	0x2e
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF946
+	.4byte	.LASF960
 	.byte	0x63
 	.byte	0x2f
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF947
+	.4byte	.LASF961
 	.byte	0x63
 	.byte	0x84
-	.4byte	0x3adb
+	.4byte	0x3b4b
 	.byte	0x10
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF948
+	.4byte	.LASF962
 	.byte	0x63
 	.byte	0x85
-	.4byte	0x3b4c
+	.4byte	0x3bbc
 	.uleb128 0xd
-	.4byte	.LASF949
+	.4byte	.LASF963
 	.byte	0x98
 	.byte	0x64
 	.byte	0x10
-	.4byte	0x3c55
+	.4byte	0x3cc5
 	.uleb128 0xe
-	.4byte	.LASF950
+	.4byte	.LASF964
 	.byte	0x64
 	.byte	0x11
-	.4byte	0x3392
+	.4byte	0x3402
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF951
+	.4byte	.LASF965
 	.byte	0x64
 	.byte	0x12
 	.4byte	0x37c
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF952
+	.4byte	.LASF966
 	.byte	0x64
 	.byte	0x13
 	.4byte	0x37c
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF953
+	.4byte	.LASF967
 	.byte	0x64
 	.byte	0x18
 	.4byte	0x558
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF954
+	.4byte	.LASF968
 	.byte	0x64
 	.byte	0x1e
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF955
+	.4byte	.LASF969
 	.byte	0x64
 	.byte	0x1f
 	.4byte	0x29
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF956
+	.4byte	.LASF970
 	.byte	0x64
 	.byte	0x20
 	.4byte	0x558
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF957
+	.4byte	.LASF971
 	.byte	0x64
 	.byte	0x23
-	.4byte	0x8779
+	.4byte	0x87e9
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF958
+	.4byte	.LASF972
 	.byte	0x64
 	.byte	0x24
-	.4byte	0x8779
+	.4byte	0x87e9
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF959
+	.4byte	.LASF973
 	.byte	0x64
 	.byte	0x28
 	.4byte	0x3eb
@@ -17945,16 +18004,16 @@ __exitcall_ebc_exit:
 	.4byte	0x2410
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF960
+	.4byte	.LASF974
 	.byte	0x64
 	.byte	0x2d
 	.4byte	0x558
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF961
+	.4byte	.LASF975
 	.byte	0x64
 	.byte	0x31
-	.4byte	0x958d
+	.4byte	0x95fd
 	.byte	0x60
 	.uleb128 0xe
 	.4byte	.LASF130
@@ -17971,15 +18030,15 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3b94
+	.4byte	0x3c04
 	.uleb128 0xd
-	.4byte	.LASF952
+	.4byte	.LASF966
 	.byte	0x18
 	.byte	0x65
 	.byte	0x1a
-	.4byte	0x3c80
+	.4byte	0x3cf0
 	.uleb128 0xe
-	.4byte	.LASF962
+	.4byte	.LASF976
 	.byte	0x65
 	.byte	0x1b
 	.4byte	0x3a7
@@ -17988,7 +18047,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF676
 	.byte	0x65
 	.byte	0x1c
-	.4byte	0x38e5
+	.4byte	0x3955
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
@@ -17996,140 +18055,140 @@ __exitcall_ebc_exit:
 	.byte	0x28
 	.byte	0x66
 	.byte	0x22
-	.4byte	0x3ca5
+	.4byte	0x3d15
 	.uleb128 0xe
-	.4byte	.LASF963
+	.4byte	.LASF977
 	.byte	0x66
 	.byte	0x23
 	.4byte	0x15a
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF964
+	.4byte	.LASF978
 	.byte	0x66
 	.byte	0x24
-	.4byte	0x3ca5
+	.4byte	0x3d15
 	.byte	0x8
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x3cb5
-	.4byte	0x3cb5
+	.4byte	0x3d25
+	.4byte	0x3d25
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3cbb
+	.4byte	0x3d2b
 	.uleb128 0x1d
-	.4byte	.LASF965
+	.4byte	.LASF979
 	.byte	0xd8
 	.byte	0x5a
 	.2byte	0x10e
-	.4byte	0x3de0
+	.4byte	0x3e50
 	.uleb128 0x1b
-	.4byte	.LASF966
+	.4byte	.LASF980
 	.byte	0x5a
 	.2byte	0x111
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF967
+	.4byte	.LASF981
 	.byte	0x5a
 	.2byte	0x112
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF968
+	.4byte	.LASF982
 	.byte	0x5a
 	.2byte	0x116
-	.4byte	0x3cb5
+	.4byte	0x3d25
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF969
+	.4byte	.LASF983
 	.byte	0x5a
 	.2byte	0x116
-	.4byte	0x3cb5
+	.4byte	0x3d25
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF970
+	.4byte	.LASF984
 	.byte	0x5a
 	.2byte	0x118
-	.4byte	0x34e2
+	.4byte	0x3552
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF971
+	.4byte	.LASF985
 	.byte	0x5a
 	.2byte	0x120
 	.4byte	0x29
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF972
+	.4byte	.LASF986
 	.byte	0x5a
 	.2byte	0x124
-	.4byte	0x4637
+	.4byte	0x46a7
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF973
+	.4byte	.LASF987
 	.byte	0x5a
 	.2byte	0x125
-	.4byte	0x3433
+	.4byte	0x34a3
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF974
+	.4byte	.LASF988
 	.byte	0x5a
 	.2byte	0x126
 	.4byte	0x29
 	.byte	0x50
 	.uleb128 0x23
-	.4byte	0x558e
+	.4byte	0x55fe
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF975
+	.4byte	.LASF989
 	.byte	0x5a
 	.2byte	0x13e
 	.4byte	0x3a7
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF976
+	.4byte	.LASF990
 	.byte	0x5a
 	.2byte	0x140
-	.4byte	0x55b5
+	.4byte	0x5625
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF977
+	.4byte	.LASF991
 	.byte	0x5a
 	.2byte	0x143
-	.4byte	0x56ab
+	.4byte	0x571b
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF978
+	.4byte	.LASF992
 	.byte	0x5a
 	.2byte	0x146
 	.4byte	0x29
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF979
+	.4byte	.LASF993
 	.byte	0x5a
 	.2byte	0x148
-	.4byte	0x555c
+	.4byte	0x55cc
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF980
+	.4byte	.LASF994
 	.byte	0x5a
 	.2byte	0x149
 	.4byte	0x458
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF981
+	.4byte	.LASF995
 	.byte	0x5a
 	.2byte	0x14b
 	.4byte	0x558
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF982
+	.4byte	.LASF996
 	.byte	0x5a
 	.2byte	0x152
-	.4byte	0x5562
+	.4byte	0x55d2
 	.byte	0xb8
 	.uleb128 0x1b
 	.4byte	.LASF130
@@ -18157,13 +18216,13 @@ __exitcall_ebc_exit:
 	.byte	0xd0
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF983
+	.4byte	.LASF997
 	.byte	0x18
 	.byte	0x66
 	.byte	0x33
-	.4byte	0x3e05
+	.4byte	0x3e75
 	.uleb128 0xe
-	.4byte	.LASF984
+	.4byte	.LASF998
 	.byte	0x66
 	.byte	0x34
 	.4byte	0xc6
@@ -18172,116 +18231,116 @@ __exitcall_ebc_exit:
 	.4byte	.LASF383
 	.byte	0x66
 	.byte	0x35
-	.4byte	0x3e05
+	.4byte	0x3e75
 	.byte	0x4
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xc6
-	.4byte	0x3e15
+	.4byte	0x3e85
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x4
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF985
+	.4byte	.LASF999
 	.byte	0x28
 	.byte	0x66
 	.byte	0x39
-	.4byte	0x3e2e
+	.4byte	0x3e9e
 	.uleb128 0xe
 	.4byte	.LASF383
 	.byte	0x66
 	.byte	0x3a
-	.4byte	0x3e2e
+	.4byte	0x3e9e
 	.byte	0
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x558
-	.4byte	0x3e3e
+	.4byte	0x3eae
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x4
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF986
+	.4byte	.LASF1000
 	.byte	0x10
 	.byte	0x66
 	.byte	0x3d
-	.4byte	0x3e6f
+	.4byte	0x3edf
 	.uleb128 0xe
-	.4byte	.LASF845
+	.4byte	.LASF859
 	.byte	0x66
 	.byte	0x3e
-	.4byte	0x3469
+	.4byte	0x34d9
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF884
+	.4byte	.LASF898
 	.byte	0x66
 	.byte	0x40
 	.4byte	0xd2
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF987
+	.4byte	.LASF1001
 	.byte	0x66
 	.byte	0x41
 	.4byte	0xd2
 	.byte	0xc
 	.byte	0
-	.uleb128 0x3a
-	.4byte	.LASF989
+	.uleb128 0x3c
+	.4byte	.LASF1003
 	.byte	0
 	.byte	0x66
 	.byte	0x49
 	.uleb128 0xd
-	.4byte	.LASF990
+	.4byte	.LASF1004
 	.byte	0x40
 	.byte	0x67
 	.byte	0xc
-	.4byte	0x3ee4
+	.4byte	0x3f54
 	.uleb128 0xe
-	.4byte	.LASF991
+	.4byte	.LASF1005
 	.byte	0x67
 	.byte	0xf
 	.4byte	0x15a
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF992
+	.4byte	.LASF1006
 	.byte	0x67
 	.byte	0x11
 	.4byte	0x15a
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF993
+	.4byte	.LASF1007
 	.byte	0x67
 	.byte	0x13
 	.4byte	0x15a
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF994
+	.4byte	.LASF1008
 	.byte	0x67
 	.byte	0x15
 	.4byte	0x15a
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF995
+	.4byte	.LASF1009
 	.byte	0x67
 	.byte	0x17
 	.4byte	0x15a
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF996
+	.4byte	.LASF1010
 	.byte	0x67
 	.byte	0x1f
 	.4byte	0x15a
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF997
+	.4byte	.LASF1011
 	.byte	0x67
 	.byte	0x25
 	.4byte	0x15a
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF998
+	.4byte	.LASF1012
 	.byte	0x67
 	.byte	0x2e
 	.4byte	0x15a
@@ -18291,9 +18350,9 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x68
 	.byte	0x6d
-	.4byte	0x3f03
+	.4byte	0x3f73
 	.uleb128 0x22
-	.4byte	.LASF999
+	.4byte	.LASF1013
 	.byte	0x68
 	.byte	0x6e
 	.4byte	0xf4
@@ -18308,24 +18367,24 @@ __exitcall_ebc_exit:
 	.byte	0x20
 	.byte	0x68
 	.byte	0x3e
-	.4byte	0x3f40
+	.4byte	0x3fb0
 	.uleb128 0xe
-	.4byte	.LASF1000
+	.4byte	.LASF1014
 	.byte	0x68
 	.byte	0x4b
 	.4byte	0xd2
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1001
+	.4byte	.LASF1015
 	.byte	0x68
 	.byte	0x5a
 	.4byte	0xd2
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1002
+	.4byte	.LASF1016
 	.byte	0x68
 	.byte	0x7c
-	.4byte	0x3ee4
+	.4byte	0x3f54
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF171
@@ -18339,7 +18398,7 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0x48
 	.byte	0xed
-	.4byte	0x3f71
+	.4byte	0x3fe1
 	.uleb128 0xe
 	.4byte	.LASF653
 	.byte	0x48
@@ -18360,11 +18419,11 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1003
+	.4byte	.LASF1017
 	.byte	0x18
 	.byte	0x48
 	.byte	0xff
-	.4byte	0x3fa5
+	.4byte	0x4015
 	.uleb128 0x1b
 	.4byte	.LASF653
 	.byte	0x48
@@ -18378,7 +18437,7 @@ __exitcall_ebc_exit:
 	.4byte	0x15a
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1004
+	.4byte	.LASF1018
 	.byte	0x48
 	.2byte	0x102
 	.4byte	0xff
@@ -18389,326 +18448,326 @@ __exitcall_ebc_exit:
 	.byte	0x20
 	.byte	0x48
 	.2byte	0x128
-	.4byte	0x3fe7
+	.4byte	0x4057
 	.uleb128 0x1b
-	.4byte	.LASF1005
+	.4byte	.LASF1019
 	.byte	0x48
 	.2byte	0x12d
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1006
+	.4byte	.LASF1020
 	.byte	0x48
 	.2byte	0x130
 	.4byte	0xff
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1007
+	.4byte	.LASF1021
 	.byte	0x48
 	.2byte	0x135
 	.4byte	0xff
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1008
+	.4byte	.LASF1022
 	.byte	0x48
 	.2byte	0x138
 	.4byte	0xff
 	.byte	0x18
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1009
+	.4byte	.LASF1023
 	.byte	0x10
 	.byte	0x48
 	.2byte	0x14b
-	.4byte	0x400f
+	.4byte	0x407f
 	.uleb128 0x1b
-	.4byte	.LASF1010
+	.4byte	.LASF1024
 	.byte	0x48
 	.2byte	0x14c
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1011
+	.4byte	.LASF1025
 	.byte	0x48
 	.2byte	0x14d
 	.4byte	0x13f
 	.byte	0x8
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1012
+	.4byte	.LASF1026
 	.byte	0x8
 	.byte	0x48
 	.2byte	0x166
-	.4byte	0x4037
+	.4byte	0x40a7
 	.uleb128 0x1b
-	.4byte	.LASF1013
+	.4byte	.LASF1027
 	.byte	0x48
 	.2byte	0x167
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1014
+	.4byte	.LASF1028
 	.byte	0x48
 	.2byte	0x168
 	.4byte	0x6d
 	.byte	0x4
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1015
+	.4byte	.LASF1029
 	.byte	0x40
 	.byte	0x48
 	.2byte	0x197
-	.4byte	0x40ba
+	.4byte	0x412a
 	.uleb128 0x1b
-	.4byte	.LASF1016
+	.4byte	.LASF1030
 	.byte	0x48
 	.2byte	0x198
 	.4byte	0x15a
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1017
+	.4byte	.LASF1031
 	.byte	0x48
 	.2byte	0x199
 	.4byte	0x15a
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1018
+	.4byte	.LASF1032
 	.byte	0x48
 	.2byte	0x19a
 	.4byte	0x15a
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1019
+	.4byte	.LASF1033
 	.byte	0x48
 	.2byte	0x19b
 	.4byte	0x13f
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1020
+	.4byte	.LASF1034
 	.byte	0x48
 	.2byte	0x19c
 	.4byte	0x13f
 	.byte	0x1c
 	.uleb128 0x1b
-	.4byte	.LASF1021
+	.4byte	.LASF1035
 	.byte	0x48
 	.2byte	0x19d
 	.4byte	0x29
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1022
+	.4byte	.LASF1036
 	.byte	0x48
 	.2byte	0x19e
 	.4byte	0x29
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1023
+	.4byte	.LASF1037
 	.byte	0x48
 	.2byte	0x19f
 	.4byte	0x29
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1012
+	.4byte	.LASF1026
 	.byte	0x48
 	.2byte	0x1a0
-	.4byte	0x400f
+	.4byte	0x407f
 	.byte	0x38
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1024
+	.4byte	.LASF1038
 	.byte	0xd8
 	.byte	0x48
 	.2byte	0x1a3
-	.4byte	0x4227
+	.4byte	0x4297
 	.uleb128 0x1b
-	.4byte	.LASF1025
+	.4byte	.LASF1039
 	.byte	0x48
 	.2byte	0x1a5
 	.4byte	0x15a
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1026
+	.4byte	.LASF1040
 	.byte	0x48
 	.2byte	0x1a6
 	.4byte	0x15a
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1027
+	.4byte	.LASF1041
 	.byte	0x48
 	.2byte	0x1a7
 	.4byte	0x15a
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1028
+	.4byte	.LASF1042
 	.byte	0x48
 	.2byte	0x1a8
 	.4byte	0x15a
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1029
+	.4byte	.LASF1043
 	.byte	0x48
 	.2byte	0x1a9
 	.4byte	0x15a
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1030
+	.4byte	.LASF1044
 	.byte	0x48
 	.2byte	0x1aa
 	.4byte	0x15a
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1031
+	.4byte	.LASF1045
 	.byte	0x48
 	.2byte	0x1ac
 	.4byte	0x15a
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1032
+	.4byte	.LASF1046
 	.byte	0x48
 	.2byte	0x1ad
 	.4byte	0x15a
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1033
+	.4byte	.LASF1047
 	.byte	0x48
 	.2byte	0x1ae
 	.4byte	0x14f
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1034
+	.4byte	.LASF1048
 	.byte	0x48
 	.2byte	0x1b0
 	.4byte	0x15a
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1035
+	.4byte	.LASF1049
 	.byte	0x48
 	.2byte	0x1b1
 	.4byte	0x15a
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1036
+	.4byte	.LASF1050
 	.byte	0x48
 	.2byte	0x1b2
 	.4byte	0x15a
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1037
+	.4byte	.LASF1051
 	.byte	0x48
 	.2byte	0x1b3
 	.4byte	0x15a
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1038
+	.4byte	.LASF1052
 	.byte	0x48
 	.2byte	0x1b5
 	.4byte	0x15a
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1039
+	.4byte	.LASF1053
 	.byte	0x48
 	.2byte	0x1b6
 	.4byte	0x15a
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1040
+	.4byte	.LASF1054
 	.byte	0x48
 	.2byte	0x1b7
 	.4byte	0x15a
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1041
+	.4byte	.LASF1055
 	.byte	0x48
 	.2byte	0x1b8
 	.4byte	0x15a
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1042
+	.4byte	.LASF1056
 	.byte	0x48
 	.2byte	0x1b9
 	.4byte	0x15a
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF1043
+	.4byte	.LASF1057
 	.byte	0x48
 	.2byte	0x1bb
 	.4byte	0x15a
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1044
+	.4byte	.LASF1058
 	.byte	0x48
 	.2byte	0x1bc
 	.4byte	0x15a
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF1045
+	.4byte	.LASF1059
 	.byte	0x48
 	.2byte	0x1bd
 	.4byte	0x15a
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF1046
+	.4byte	.LASF1060
 	.byte	0x48
 	.2byte	0x1be
 	.4byte	0x15a
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF1047
+	.4byte	.LASF1061
 	.byte	0x48
 	.2byte	0x1bf
 	.4byte	0x15a
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF1048
+	.4byte	.LASF1062
 	.byte	0x48
 	.2byte	0x1c0
 	.4byte	0x15a
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF1049
+	.4byte	.LASF1063
 	.byte	0x48
 	.2byte	0x1c1
 	.4byte	0x15a
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF1050
+	.4byte	.LASF1064
 	.byte	0x48
 	.2byte	0x1c2
 	.4byte	0x15a
 	.byte	0xc8
 	.uleb128 0x1b
-	.4byte	.LASF1051
+	.4byte	.LASF1065
 	.byte	0x48
 	.2byte	0x1c3
 	.4byte	0x15a
 	.byte	0xd0
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF1052
+	.4byte	.LASF1066
 	.2byte	0x200
 	.byte	0x48
 	.2byte	0x1c7
-	.4byte	0x4343
+	.4byte	0x43b3
 	.uleb128 0x1b
-	.4byte	.LASF1053
+	.4byte	.LASF1067
 	.byte	0x48
 	.2byte	0x1c9
-	.4byte	0x3fe7
+	.4byte	0x4057
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1054
+	.4byte	.LASF1068
 	.byte	0x48
 	.2byte	0x1ca
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1055
+	.4byte	.LASF1069
 	.byte	0x48
 	.2byte	0x1cb
-	.4byte	0x34e2
+	.4byte	0x3552
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1056
+	.4byte	.LASF1070
 	.byte	0x48
 	.2byte	0x1cc
 	.4byte	0x3a7
@@ -18720,43 +18779,43 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1057
+	.4byte	.LASF1071
 	.byte	0x48
 	.2byte	0x1cf
 	.4byte	0x15a
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1004
+	.4byte	.LASF1018
 	.byte	0x48
 	.2byte	0x1d0
 	.4byte	0x15a
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1058
+	.4byte	.LASF1072
 	.byte	0x48
 	.2byte	0x1d1
 	.4byte	0x15a
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1059
+	.4byte	.LASF1073
 	.byte	0x48
 	.2byte	0x1d2
 	.4byte	0x15a
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1060
+	.4byte	.LASF1074
 	.byte	0x48
 	.2byte	0x1d4
 	.4byte	0x15a
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1061
+	.4byte	.LASF1075
 	.byte	0x48
 	.2byte	0x1d6
-	.4byte	0x40ba
+	.4byte	0x412a
 	.byte	0x70
 	.uleb128 0x1c
-	.4byte	.LASF1062
+	.4byte	.LASF1076
 	.byte	0x48
 	.2byte	0x1d9
 	.4byte	0xc6
@@ -18765,25 +18824,25 @@ __exitcall_ebc_exit:
 	.4byte	.LASF640
 	.byte	0x48
 	.2byte	0x1da
-	.4byte	0x4343
+	.4byte	0x43b3
 	.2byte	0x150
 	.uleb128 0x1c
-	.4byte	.LASF1063
+	.4byte	.LASF1077
 	.byte	0x48
 	.2byte	0x1dc
-	.4byte	0x434e
+	.4byte	0x43be
 	.2byte	0x158
 	.uleb128 0x1c
-	.4byte	.LASF1064
+	.4byte	.LASF1078
 	.byte	0x48
 	.2byte	0x1de
-	.4byte	0x434e
+	.4byte	0x43be
 	.2byte	0x160
 	.uleb128 0x30
 	.string	"avg"
 	.byte	0x48
 	.2byte	0x1e8
-	.4byte	0x4037
+	.4byte	0x40a7
 	.2byte	0x180
 	.uleb128 0x1c
 	.4byte	.LASF130
@@ -18812,38 +18871,38 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4227
+	.4byte	0x4297
 	.uleb128 0x24
-	.4byte	.LASF1063
+	.4byte	.LASF1077
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4349
+	.4byte	0x43b9
 	.uleb128 0x1d
-	.4byte	.LASF1065
+	.4byte	.LASF1079
 	.byte	0x50
 	.byte	0x48
 	.2byte	0x1f1
-	.4byte	0x43f1
+	.4byte	0x4461
 	.uleb128 0x1b
-	.4byte	.LASF1066
+	.4byte	.LASF1080
 	.byte	0x48
 	.2byte	0x1f2
 	.4byte	0x3a7
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1067
+	.4byte	.LASF1081
 	.byte	0x48
 	.2byte	0x1f3
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1068
+	.4byte	.LASF1082
 	.byte	0x48
 	.2byte	0x1f4
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1069
+	.4byte	.LASF1083
 	.byte	0x48
 	.2byte	0x1f5
 	.4byte	0x6d
@@ -18855,16 +18914,16 @@ __exitcall_ebc_exit:
 	.4byte	0xb4
 	.byte	0x24
 	.uleb128 0x1b
-	.4byte	.LASF1070
+	.4byte	.LASF1084
 	.byte	0x48
 	.2byte	0x1f7
 	.4byte	0xb4
 	.byte	0x26
 	.uleb128 0x1b
-	.4byte	.LASF1071
+	.4byte	.LASF1085
 	.byte	0x48
 	.2byte	0x1f9
-	.4byte	0x43f1
+	.4byte	0x4461
 	.byte	0x28
 	.uleb128 0x1b
 	.4byte	.LASF130
@@ -18893,57 +18952,57 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4354
+	.4byte	0x43c4
 	.uleb128 0x1d
-	.4byte	.LASF1072
+	.4byte	.LASF1086
 	.byte	0xe8
 	.byte	0x48
 	.2byte	0x208
-	.4byte	0x44e4
+	.4byte	0x4554
 	.uleb128 0x1b
-	.4byte	.LASF851
+	.4byte	.LASF865
 	.byte	0x48
 	.2byte	0x209
-	.4byte	0x34e2
+	.4byte	0x3552
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1073
+	.4byte	.LASF1087
 	.byte	0x48
 	.2byte	0x210
 	.4byte	0x15a
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1074
+	.4byte	.LASF1088
 	.byte	0x48
 	.2byte	0x211
 	.4byte	0x15a
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1075
+	.4byte	.LASF1089
 	.byte	0x48
 	.2byte	0x212
 	.4byte	0x15a
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1076
+	.4byte	.LASF1090
 	.byte	0x48
 	.2byte	0x213
 	.4byte	0x15a
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1077
+	.4byte	.LASF1091
 	.byte	0x48
 	.2byte	0x214
 	.4byte	0x15a
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1078
+	.4byte	.LASF1092
 	.byte	0x48
 	.2byte	0x21b
 	.4byte	0x14f
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1079
+	.4byte	.LASF1093
 	.byte	0x48
 	.2byte	0x21c
 	.4byte	0x15a
@@ -18954,8 +19013,8 @@ __exitcall_ebc_exit:
 	.2byte	0x21d
 	.4byte	0x6d
 	.byte	0x50
-	.uleb128 0x3b
-	.4byte	.LASF1080
+	.uleb128 0x3d
+	.4byte	.LASF1094
 	.byte	0x48
 	.2byte	0x237
 	.4byte	0x6d
@@ -18963,8 +19022,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x1f
 	.byte	0x54
-	.uleb128 0x3b
-	.4byte	.LASF1081
+	.uleb128 0x3d
+	.4byte	.LASF1095
 	.byte	0x48
 	.2byte	0x238
 	.4byte	0x6d
@@ -18972,8 +19031,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x1e
 	.byte	0x54
-	.uleb128 0x3b
-	.4byte	.LASF1082
+	.uleb128 0x3d
+	.4byte	.LASF1096
 	.byte	0x48
 	.2byte	0x239
 	.4byte	0x6d
@@ -18981,8 +19040,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x1d
 	.byte	0x54
-	.uleb128 0x3b
-	.4byte	.LASF1083
+	.uleb128 0x3d
+	.4byte	.LASF1097
 	.byte	0x48
 	.2byte	0x23a
 	.4byte	0x6d
@@ -18990,8 +19049,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x1c
 	.byte	0x54
-	.uleb128 0x3b
-	.4byte	.LASF1084
+	.uleb128 0x3d
+	.4byte	.LASF1098
 	.byte	0x48
 	.2byte	0x23b
 	.4byte	0x6d
@@ -19000,23 +19059,23 @@ __exitcall_ebc_exit:
 	.byte	0x1b
 	.byte	0x54
 	.uleb128 0x1b
-	.4byte	.LASF1085
+	.4byte	.LASF1099
 	.byte	0x48
 	.2byte	0x241
-	.4byte	0x363a
+	.4byte	0x36aa
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1086
+	.4byte	.LASF1100
 	.byte	0x48
 	.2byte	0x24a
-	.4byte	0x363a
+	.4byte	0x36aa
 	.byte	0xa0
 	.byte	0
 	.uleb128 0x2e
 	.byte	0x4
 	.byte	0x48
 	.2byte	0x271
-	.4byte	0x4522
+	.4byte	0x4592
 	.uleb128 0x1b
 	.4byte	.LASF678
 	.byte	0x48
@@ -19024,13 +19083,13 @@ __exitcall_ebc_exit:
 	.4byte	0x110
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1087
+	.4byte	.LASF1101
 	.byte	0x48
 	.2byte	0x273
 	.4byte	0x110
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF1088
+	.4byte	.LASF1102
 	.byte	0x48
 	.2byte	0x274
 	.4byte	0x110
@@ -19042,44 +19101,44 @@ __exitcall_ebc_exit:
 	.4byte	0x110
 	.byte	0x3
 	.byte	0
-	.uleb128 0x3c
-	.4byte	.LASF1090
+	.uleb128 0x3e
+	.4byte	.LASF1104
 	.byte	0x4
 	.byte	0x48
 	.2byte	0x270
-	.4byte	0x4544
-	.uleb128 0x3d
+	.4byte	0x45b4
+	.uleb128 0x3f
 	.string	"b"
 	.byte	0x48
 	.2byte	0x278
-	.4byte	0x44e4
-	.uleb128 0x3d
+	.4byte	0x4554
+	.uleb128 0x3f
 	.string	"s"
 	.byte	0x48
 	.2byte	0x279
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1091
+	.4byte	.LASF1105
 	.byte	0x8
 	.byte	0x48
 	.2byte	0x283
-	.4byte	0x455f
+	.4byte	0x45cf
 	.uleb128 0x1b
 	.4byte	.LASF64
 	.byte	0x48
 	.2byte	0x284
-	.4byte	0x455f
+	.4byte	0x45cf
 	.byte	0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4544
+	.4byte	0x45b4
 	.uleb128 0x2e
 	.byte	0x8
 	.byte	0x48
 	.2byte	0x510
-	.4byte	0x457c
+	.4byte	0x45ec
 	.uleb128 0x1b
 	.4byte	.LASF130
 	.byte	0x48
@@ -19087,36 +19146,36 @@ __exitcall_ebc_exit:
 	.4byte	0x15a
 	.byte	0
 	.byte	0
-	.uleb128 0x3e
+	.uleb128 0x40
 	.byte	0
 	.byte	0x48
 	.2byte	0x510
-	.uleb128 0x3f
+	.uleb128 0x41
 	.byte	0x8
 	.byte	0x48
 	.2byte	0x510
-	.4byte	0x45ab
-	.uleb128 0x40
-	.4byte	.LASF1243
+	.4byte	0x461b
+	.uleb128 0x42
+	.4byte	.LASF1257
 	.byte	0x48
 	.2byte	0x510
 	.4byte	0x6d
 	.byte	0x4
 	.byte	0x1
 	.byte	0x1f
-	.uleb128 0x41
-	.4byte	.LASF1092
+	.uleb128 0x43
+	.4byte	.LASF1106
 	.byte	0x48
 	.2byte	0x510
-	.4byte	0x4565
+	.4byte	0x45d5
 	.uleb128 0x29
-	.4byte	0x457c
+	.4byte	0x45ec
 	.byte	0
 	.uleb128 0x2e
 	.byte	0x8
 	.byte	0x48
 	.2byte	0x513
-	.4byte	0x45c2
+	.4byte	0x4632
 	.uleb128 0x1b
 	.4byte	.LASF131
 	.byte	0x48
@@ -19124,88 +19183,88 @@ __exitcall_ebc_exit:
 	.4byte	0x15a
 	.byte	0
 	.byte	0
-	.uleb128 0x3e
+	.uleb128 0x40
 	.byte	0
 	.byte	0x48
 	.2byte	0x513
-	.uleb128 0x3f
+	.uleb128 0x41
 	.byte	0x8
 	.byte	0x48
 	.2byte	0x513
-	.4byte	0x45ee
-	.uleb128 0x41
-	.4byte	.LASF1093
+	.4byte	0x465e
+	.uleb128 0x43
+	.4byte	.LASF1107
 	.byte	0x48
 	.2byte	0x513
 	.4byte	0x6d
-	.uleb128 0x41
-	.4byte	.LASF1094
+	.uleb128 0x43
+	.4byte	.LASF1108
 	.byte	0x48
 	.2byte	0x513
-	.4byte	0x45ab
+	.4byte	0x461b
 	.uleb128 0x29
-	.4byte	0x45c2
+	.4byte	0x4632
 	.byte	0
 	.uleb128 0x24
 	.4byte	.LASF594
 	.uleb128 0x3
-	.4byte	0x45ee
+	.4byte	0x465e
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x45f3
+	.4byte	0x4663
 	.uleb128 0x24
-	.4byte	.LASF1095
+	.4byte	.LASF1109
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x45fe
+	.4byte	0x466e
 	.uleb128 0x24
-	.4byte	.LASF1096
+	.4byte	.LASF1110
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4609
+	.4byte	0x4679
 	.uleb128 0x1a
-	.4byte	.LASF1097
+	.4byte	.LASF1111
 	.2byte	0x378
 	.byte	0x5a
 	.2byte	0x166
-	.4byte	0x4637
+	.4byte	0x46a7
 	.uleb128 0x23
-	.4byte	0x5714
+	.4byte	0x5784
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1098
+	.4byte	.LASF1112
 	.byte	0x5a
 	.2byte	0x206
-	.4byte	0x5a3c
+	.4byte	0x5aac
 	.2byte	0x378
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4614
+	.4byte	0x4684
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x2329
 	.uleb128 0x5
 	.4byte	0x3eb
-	.4byte	0x4653
+	.4byte	0x46c3
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1099
+	.4byte	.LASF1113
 	.byte	0x20
 	.byte	0x69
 	.byte	0x1a
-	.4byte	0x4678
+	.4byte	0x46e8
 	.uleb128 0xe
-	.4byte	.LASF1100
+	.4byte	.LASF1114
 	.byte	0x69
 	.byte	0x1b
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1101
+	.4byte	.LASF1115
 	.byte	0x69
 	.byte	0x1c
 	.4byte	0x15bf
@@ -19213,7 +19272,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4653
+	.4byte	0x46c3
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc6
@@ -19222,7 +19281,7 @@ __exitcall_ebc_exit:
 	.4byte	0x15a
 	.uleb128 0x5
 	.4byte	0x3a7
-	.4byte	0x469a
+	.4byte	0x470a
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
@@ -19232,7 +19291,7 @@ __exitcall_ebc_exit:
 	.byte	0xa8
 	.byte	0x6a
 	.byte	0x74
-	.4byte	0x47cd
+	.4byte	0x483d
 	.uleb128 0xe
 	.4byte	.LASF580
 	.byte	0x6a
@@ -19252,106 +19311,106 @@ __exitcall_ebc_exit:
 	.4byte	0x2430
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1102
+	.4byte	.LASF1116
 	.byte	0x6a
 	.byte	0x7f
 	.4byte	0x2410
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF1103
+	.4byte	.LASF1117
 	.byte	0x6a
 	.byte	0x80
 	.4byte	0x2430
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1104
+	.4byte	.LASF1118
 	.byte	0x6a
 	.byte	0x81
 	.4byte	0x2410
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF1105
+	.4byte	.LASF1119
 	.byte	0x6a
 	.byte	0x82
 	.4byte	0x2430
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1106
+	.4byte	.LASF1120
 	.byte	0x6a
 	.byte	0x83
 	.4byte	0x2410
 	.byte	0x1c
 	.uleb128 0xe
-	.4byte	.LASF1107
+	.4byte	.LASF1121
 	.byte	0x6a
 	.byte	0x84
 	.4byte	0x2430
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1108
+	.4byte	.LASF1122
 	.byte	0x6a
 	.byte	0x85
 	.4byte	0x6d
 	.byte	0x24
 	.uleb128 0xe
-	.4byte	.LASF1109
+	.4byte	.LASF1123
 	.byte	0x6a
 	.byte	0x86
-	.4byte	0x5b4b
+	.4byte	0x5bbb
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1110
+	.4byte	.LASF1124
 	.byte	0x6a
 	.byte	0x87
-	.4byte	0x5b4b
+	.4byte	0x5bbb
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1111
+	.4byte	.LASF1125
 	.byte	0x6a
 	.byte	0x88
-	.4byte	0x5b4b
+	.4byte	0x5bbb
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF1112
+	.4byte	.LASF1126
 	.byte	0x6a
 	.byte	0x89
-	.4byte	0x5b4b
+	.4byte	0x5bbb
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF1113
+	.4byte	.LASF1127
 	.byte	0x6a
 	.byte	0x8a
-	.4byte	0x5b4b
+	.4byte	0x5bbb
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF1114
+	.4byte	.LASF1128
 	.byte	0x6a
 	.byte	0x8c
 	.4byte	0x96
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF958
+	.4byte	.LASF972
 	.byte	0x6a
 	.byte	0x8e
-	.4byte	0x8779
+	.4byte	0x87e9
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF1115
+	.4byte	.LASF1129
 	.byte	0x6a
 	.byte	0x8f
-	.4byte	0x8779
+	.4byte	0x87e9
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF1116
+	.4byte	.LASF1130
 	.byte	0x6a
 	.byte	0x90
-	.4byte	0x8779
+	.4byte	0x87e9
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF1117
+	.4byte	.LASF1131
 	.byte	0x6a
 	.byte	0x91
-	.4byte	0x8779
+	.4byte	0x87e9
 	.byte	0x70
 	.uleb128 0xe
 	.4byte	.LASF747
@@ -19360,35 +19419,35 @@ __exitcall_ebc_exit:
 	.4byte	0x458
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF1118
+	.4byte	.LASF1132
 	.byte	0x6a
 	.byte	0x96
-	.4byte	0x3c55
+	.4byte	0x3cc5
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF1119
+	.4byte	.LASF1133
 	.byte	0x6a
 	.byte	0x97
-	.4byte	0x5a36
+	.4byte	0x5aa6
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF1120
+	.4byte	.LASF1134
 	.byte	0x6a
 	.byte	0x98
-	.4byte	0x966e
+	.4byte	0x96de
 	.byte	0x90
 	.uleb128 0x23
-	.4byte	0x964f
+	.4byte	0x96bf
 	.byte	0x98
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x469a
+	.4byte	0x470a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x47cd
+	.4byte	0x483d
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x47e8
+	.4byte	0x4858
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
@@ -19397,82 +19456,82 @@ __exitcall_ebc_exit:
 	.4byte	.LASF671
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x47e8
+	.4byte	0x4858
 	.uleb128 0x24
-	.4byte	.LASF1121
+	.4byte	.LASF1135
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x47f3
+	.4byte	0x4863
 	.uleb128 0x24
-	.4byte	.LASF1122
+	.4byte	.LASF1136
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x47fe
+	.4byte	0x486e
 	.uleb128 0x24
 	.4byte	.LASF675
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4809
+	.4byte	0x4879
 	.uleb128 0x24
-	.4byte	.LASF1123
+	.4byte	.LASF1137
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4814
+	.4byte	0x4884
 	.uleb128 0x24
-	.4byte	.LASF1124
+	.4byte	.LASF1138
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x481f
+	.4byte	0x488f
 	.uleb128 0x24
 	.4byte	.LASF685
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x482a
+	.4byte	0x489a
 	.uleb128 0x24
-	.4byte	.LASF1125
+	.4byte	.LASF1139
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4835
+	.4byte	0x48a5
 	.uleb128 0x24
 	.4byte	.LASF696
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4840
+	.4byte	0x48b0
 	.uleb128 0x24
-	.4byte	.LASF1126
+	.4byte	.LASF1140
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x484b
+	.4byte	0x48bb
 	.uleb128 0x24
 	.4byte	.LASF698
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4856
+	.4byte	0x48c6
 	.uleb128 0x24
 	.4byte	.LASF699
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4861
+	.4byte	0x48d1
 	.uleb128 0xd
 	.4byte	.LASF700
 	.byte	0x78
 	.byte	0x6b
 	.byte	0x63
-	.4byte	0x48fd
+	.4byte	0x496d
 	.uleb128 0xe
-	.4byte	.LASF1127
+	.4byte	.LASF1141
 	.byte	0x6b
 	.byte	0x64
 	.4byte	0x558
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1128
+	.4byte	.LASF1142
 	.byte	0x6b
 	.byte	0x65
 	.4byte	0x37c
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1129
+	.4byte	.LASF1143
 	.byte	0x6b
 	.byte	0x66
 	.4byte	0x37c
@@ -19484,43 +19543,43 @@ __exitcall_ebc_exit:
 	.4byte	0xe65
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1130
+	.4byte	.LASF1144
 	.byte	0x6b
 	.byte	0x6b
 	.4byte	0xb4
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF1131
+	.4byte	.LASF1145
 	.byte	0x6b
 	.byte	0x70
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1132
+	.4byte	.LASF1146
 	.byte	0x6b
 	.byte	0x71
 	.4byte	0x29
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1133
+	.4byte	.LASF1147
 	.byte	0x6b
 	.byte	0x73
-	.4byte	0x4dd9
+	.4byte	0x4e49
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1134
+	.4byte	.LASF1148
 	.byte	0x6b
 	.byte	0x74
-	.4byte	0x5e49
+	.4byte	0x5eb9
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF1135
+	.4byte	.LASF1149
 	.byte	0x6b
 	.byte	0x75
 	.4byte	0x3d2
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF1136
+	.4byte	.LASF1150
 	.byte	0x6b
 	.byte	0x77
 	.4byte	0x320b
@@ -19528,100 +19587,100 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x486c
+	.4byte	0x48dc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3b89
+	.4byte	0x3bf9
 	.uleb128 0x24
-	.4byte	.LASF1137
+	.4byte	.LASF1151
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4909
+	.4byte	0x4979
 	.uleb128 0x24
-	.4byte	.LASF1138
+	.4byte	.LASF1152
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4914
+	.4byte	0x4984
 	.uleb128 0x24
-	.4byte	.LASF1139
+	.4byte	.LASF1153
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x491f
+	.4byte	0x498f
 	.uleb128 0x24
-	.4byte	.LASF1140
+	.4byte	.LASF1154
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x492a
+	.4byte	0x499a
 	.uleb128 0x5
-	.4byte	0x4945
-	.4byte	0x4945
+	.4byte	0x49b5
+	.4byte	0x49b5
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x494b
+	.4byte	0x49bb
 	.uleb128 0x24
-	.4byte	.LASF1141
+	.4byte	.LASF1155
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3f03
+	.4byte	0x3f73
 	.uleb128 0x24
-	.4byte	.LASF1142
+	.4byte	.LASF1156
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4956
+	.4byte	0x49c6
 	.uleb128 0x24
-	.4byte	.LASF1143
+	.4byte	.LASF1157
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4961
+	.4byte	0x49d1
 	.uleb128 0x24
-	.4byte	.LASF847
+	.4byte	.LASF861
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x496c
+	.4byte	0x49dc
 	.uleb128 0x24
-	.4byte	.LASF1144
+	.4byte	.LASF1158
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4977
+	.4byte	0x49e7
 	.uleb128 0xd
-	.4byte	.LASF1145
+	.4byte	.LASF1159
 	.byte	0x40
 	.byte	0x6c
 	.byte	0x4a
-	.4byte	0x49d1
+	.4byte	0x4a41
 	.uleb128 0xe
 	.4byte	.LASF578
 	.byte	0x6c
 	.byte	0x4b
-	.4byte	0x4e93
+	.4byte	0x4f03
 	.byte	0
 	.uleb128 0x23
-	.4byte	0x4efe
+	.4byte	0x4f6e
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1146
+	.4byte	.LASF1160
 	.byte	0x6c
 	.byte	0x59
-	.4byte	0x4f16
+	.4byte	0x4f86
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1147
+	.4byte	.LASF1161
 	.byte	0x6c
 	.byte	0x5a
 	.4byte	0x29
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1148
+	.4byte	.LASF1162
 	.byte	0x6c
 	.byte	0x5c
-	.4byte	0x4f71
+	.4byte	0x4fe1
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1062
+	.4byte	.LASF1076
 	.byte	0x6c
 	.byte	0x5d
 	.4byte	0x6d
@@ -19629,27 +19688,27 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4982
+	.4byte	0x49f2
 	.uleb128 0xd
-	.4byte	.LASF1149
+	.4byte	.LASF1163
 	.byte	0x40
 	.byte	0x6d
 	.byte	0x22
-	.4byte	0x4a44
+	.4byte	0x4ab4
 	.uleb128 0xe
 	.4byte	.LASF64
 	.byte	0x6d
 	.byte	0x23
-	.4byte	0x4a44
+	.4byte	0x4ab4
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1150
+	.4byte	.LASF1164
 	.byte	0x6d
 	.byte	0x24
 	.4byte	0x458
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF987
+	.4byte	.LASF1001
 	.byte	0x6d
 	.byte	0x25
 	.4byte	0x29
@@ -19661,25 +19720,25 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1151
+	.4byte	.LASF1165
 	.byte	0x6d
 	.byte	0x27
-	.4byte	0x5a57
+	.4byte	0x5ac7
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1152
+	.4byte	.LASF1166
 	.byte	0x6d
 	.byte	0x28
 	.4byte	0x6d
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1153
+	.4byte	.LASF1167
 	.byte	0x6d
 	.byte	0x29
 	.4byte	0x346
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1154
+	.4byte	.LASF1168
 	.byte	0x6d
 	.byte	0x2a
 	.4byte	0x30bc
@@ -19687,79 +19746,79 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x49d7
+	.4byte	0x4a47
 	.uleb128 0x15
-	.4byte	.LASF1155
+	.4byte	.LASF1169
 	.byte	0x48
 	.2byte	0x5d0
-	.4byte	0x463d
-	.uleb128 0x42
-	.4byte	.LASF1156
+	.4byte	0x46ad
+	.uleb128 0x44
+	.4byte	.LASF1170
 	.2byte	0x4000
 	.byte	0x48
 	.2byte	0x68b
-	.4byte	0x4a7d
-	.uleb128 0x41
+	.4byte	0x4aed
+	.uleb128 0x43
 	.4byte	.LASF759
 	.byte	0x48
 	.2byte	0x68d
 	.4byte	0x24a7
-	.uleb128 0x41
+	.uleb128 0x43
 	.4byte	.LASF579
 	.byte	0x48
 	.2byte	0x692
-	.4byte	0x4a7d
+	.4byte	0x4aed
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0x4a8e
-	.uleb128 0x43
+	.4byte	0x4afe
+	.uleb128 0x45
 	.4byte	0x4f
 	.2byte	0x7ff
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF1157
+	.4byte	.LASF1171
 	.byte	0x48
 	.2byte	0x699
-	.4byte	0x4a7d
+	.4byte	0x4aed
 	.uleb128 0xd
-	.4byte	.LASF1158
+	.4byte	.LASF1172
 	.byte	0x88
 	.byte	0x6e
 	.byte	0x18
-	.4byte	0x4b73
+	.4byte	0x4be3
 	.uleb128 0xe
-	.4byte	.LASF1159
+	.4byte	.LASF1173
 	.byte	0x6e
 	.byte	0x19
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF904
+	.4byte	.LASF918
 	.byte	0x6e
 	.byte	0x1a
 	.4byte	0x28f
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1160
+	.4byte	.LASF1174
 	.byte	0x6e
 	.byte	0x1b
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1161
+	.4byte	.LASF1175
 	.byte	0x6e
 	.byte	0x1c
 	.4byte	0x304
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF1162
+	.4byte	.LASF1176
 	.byte	0x6e
 	.byte	0x1d
 	.4byte	0x15a
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1163
+	.4byte	.LASF1177
 	.byte	0x6e
 	.byte	0x1e
 	.4byte	0x15a
@@ -19777,7 +19836,7 @@ __exitcall_ebc_exit:
 	.4byte	0x284
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1164
+	.4byte	.LASF1178
 	.byte	0x6e
 	.byte	0x29
 	.4byte	0x284
@@ -19795,50 +19854,50 @@ __exitcall_ebc_exit:
 	.4byte	0x2430
 	.byte	0x34
 	.uleb128 0xe
-	.4byte	.LASF987
+	.4byte	.LASF1001
 	.byte	0x6e
 	.byte	0x2c
 	.4byte	0x2d8
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF1165
+	.4byte	.LASF1179
 	.byte	0x6e
 	.byte	0x2d
 	.4byte	0xa27
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF1166
+	.4byte	.LASF1180
 	.byte	0x6e
 	.byte	0x2e
 	.4byte	0xa27
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF1167
+	.4byte	.LASF1181
 	.byte	0x6e
 	.byte	0x2f
 	.4byte	0xa27
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF1168
+	.4byte	.LASF1182
 	.byte	0x6e
 	.byte	0x30
 	.4byte	0xa27
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF1169
+	.4byte	.LASF1183
 	.byte	0x6e
 	.byte	0x31
 	.4byte	0x15a
 	.byte	0x80
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1170
+	.4byte	.LASF1184
 	.byte	0x20
 	.byte	0x6f
 	.byte	0xc
-	.4byte	0x4bbc
+	.4byte	0x4c2c
 	.uleb128 0xe
-	.4byte	.LASF1171
+	.4byte	.LASF1185
 	.byte	0x6f
 	.byte	0xd
 	.4byte	0x330
@@ -19850,50 +19909,50 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1172
+	.4byte	.LASF1186
 	.byte	0x6f
 	.byte	0x17
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1173
+	.4byte	.LASF1187
 	.byte	0x6f
 	.byte	0x1e
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1174
+	.4byte	.LASF1188
 	.byte	0x6f
 	.byte	0x21
-	.4byte	0x4971
+	.4byte	0x49e1
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1175
+	.4byte	.LASF1189
 	.byte	0x40
 	.byte	0x6f
 	.byte	0x3c
-	.4byte	0x4c28
+	.4byte	0x4c98
 	.uleb128 0xe
-	.4byte	.LASF1176
+	.4byte	.LASF1190
 	.byte	0x6f
 	.byte	0x3d
-	.4byte	0x4c48
+	.4byte	0x4cb8
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1177
+	.4byte	.LASF1191
 	.byte	0x6f
 	.byte	0x3f
-	.4byte	0x4c48
+	.4byte	0x4cb8
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1178
+	.4byte	.LASF1192
 	.byte	0x6f
 	.byte	0x42
 	.4byte	0x199
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1179
+	.4byte	.LASF1193
 	.byte	0x6f
 	.byte	0x43
 	.4byte	0xc6
@@ -19905,7 +19964,7 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0x1c
 	.uleb128 0xe
-	.4byte	.LASF962
+	.4byte	.LASF976
 	.byte	0x6f
 	.byte	0x47
 	.4byte	0x3a7
@@ -19917,57 +19976,57 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1180
+	.4byte	.LASF1194
 	.byte	0x6f
 	.byte	0x4d
-	.4byte	0x4c4e
+	.4byte	0x4cbe
 	.byte	0x38
 	.byte	0
 	.uleb128 0x14
 	.4byte	0x29
-	.4byte	0x4c3c
+	.4byte	0x4cac
 	.uleb128 0x11
-	.4byte	0x4c3c
+	.4byte	0x4cac
 	.uleb128 0x11
-	.4byte	0x4c42
+	.4byte	0x4cb2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4bbc
+	.4byte	0x4c2c
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4b73
+	.4byte	0x4be3
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4c28
+	.4byte	0x4c98
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x558
 	.uleb128 0xd
-	.4byte	.LASF1181
+	.4byte	.LASF1195
 	.byte	0x18
 	.byte	0x70
 	.byte	0x1c
-	.4byte	0x4c79
+	.4byte	0x4ce9
 	.uleb128 0xe
-	.4byte	.LASF962
+	.4byte	.LASF976
 	.byte	0x70
 	.byte	0x1d
 	.4byte	0x3a7
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1182
+	.4byte	.LASF1196
 	.byte	0x70
 	.byte	0x1f
 	.4byte	0x199
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1183
+	.4byte	.LASF1197
 	.byte	0x10
 	.byte	0x70
 	.byte	0x22
-	.4byte	0x4c9e
+	.4byte	0x4d0e
 	.uleb128 0x20
 	.string	"rcu"
 	.byte	0x70
@@ -19978,24 +20037,24 @@ __exitcall_ebc_exit:
 	.string	"lru"
 	.byte	0x70
 	.byte	0x25
-	.4byte	0x4c9e
+	.4byte	0x4d0e
 	.byte	0x10
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x4cad
-	.4byte	0x4cad
-	.uleb128 0x44
+	.4byte	0x4d1d
+	.4byte	0x4d1d
+	.uleb128 0x46
 	.4byte	0x4f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4c54
+	.4byte	0x4cc4
 	.uleb128 0xd
-	.4byte	.LASF1184
+	.4byte	.LASF1198
 	.byte	0x40
 	.byte	0x70
 	.byte	0x28
-	.4byte	0x4cf0
+	.4byte	0x4d60
 	.uleb128 0xe
 	.4byte	.LASF116
 	.byte	0x70
@@ -20006,16 +20065,16 @@ __exitcall_ebc_exit:
 	.string	"lru"
 	.byte	0x70
 	.byte	0x2c
-	.4byte	0x4c54
+	.4byte	0x4cc4
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1185
+	.4byte	.LASF1199
 	.byte	0x70
 	.byte	0x2f
-	.4byte	0x4cf0
+	.4byte	0x4d60
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1182
+	.4byte	.LASF1196
 	.byte	0x70
 	.byte	0x31
 	.4byte	0x199
@@ -20023,33 +20082,33 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4c79
+	.4byte	0x4ce9
 	.uleb128 0xd
-	.4byte	.LASF1186
+	.4byte	.LASF1200
 	.byte	0x20
 	.byte	0x70
 	.byte	0x34
-	.4byte	0x4d33
+	.4byte	0x4da3
 	.uleb128 0xe
-	.4byte	.LASF868
+	.4byte	.LASF882
 	.byte	0x70
 	.byte	0x35
-	.4byte	0x4d33
+	.4byte	0x4da3
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF962
+	.4byte	.LASF976
 	.byte	0x70
 	.byte	0x37
 	.4byte	0x3a7
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1187
+	.4byte	.LASF1201
 	.byte	0x70
 	.byte	0x38
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1188
+	.4byte	.LASF1202
 	.byte	0x70
 	.byte	0x39
 	.4byte	0x2b0
@@ -20057,7 +20116,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4cb3
+	.4byte	0x4d23
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xe65
@@ -20065,9 +20124,9 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x71
 	.byte	0x63
-	.4byte	0x4d5e
+	.4byte	0x4dce
 	.uleb128 0x22
-	.4byte	.LASF1189
+	.4byte	.LASF1203
 	.byte	0x71
 	.byte	0x64
 	.4byte	0x3a7
@@ -20078,11 +20137,11 @@ __exitcall_ebc_exit:
 	.4byte	0x41c
 	.byte	0
 	.uleb128 0x26
-	.4byte	.LASF1190
+	.4byte	.LASF1204
 	.2byte	0x240
 	.byte	0x71
 	.byte	0x5c
-	.4byte	0x4dd3
+	.4byte	0x4e43
 	.uleb128 0xe
 	.4byte	.LASF261
 	.byte	0x71
@@ -20090,7 +20149,7 @@ __exitcall_ebc_exit:
 	.4byte	0x96
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF884
+	.4byte	.LASF898
 	.byte	0x71
 	.byte	0x5e
 	.4byte	0x96
@@ -20102,7 +20161,7 @@ __exitcall_ebc_exit:
 	.4byte	0x96
 	.byte	0x2
 	.uleb128 0xe
-	.4byte	.LASF1191
+	.4byte	.LASF1205
 	.byte	0x71
 	.byte	0x60
 	.4byte	0x96
@@ -20111,71 +20170,71 @@ __exitcall_ebc_exit:
 	.4byte	.LASF640
 	.byte	0x71
 	.byte	0x61
-	.4byte	0x4dd3
+	.4byte	0x4e43
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1192
+	.4byte	.LASF1206
 	.byte	0x71
 	.byte	0x62
-	.4byte	0x4e0a
+	.4byte	0x4e7a
 	.byte	0x10
 	.uleb128 0x23
-	.4byte	0x4d3f
+	.4byte	0x4daf
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1193
+	.4byte	.LASF1207
 	.byte	0x71
 	.byte	0x67
-	.4byte	0x4e10
+	.4byte	0x4e80
 	.byte	0x28
 	.uleb128 0x27
-	.4byte	.LASF1194
+	.4byte	.LASF1208
 	.byte	0x71
 	.byte	0x68
-	.4byte	0x4e20
+	.4byte	0x4e90
 	.2byte	0x228
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4d5e
+	.4byte	0x4dce
 	.uleb128 0xd
-	.4byte	.LASF1195
+	.4byte	.LASF1209
 	.byte	0x10
 	.byte	0x71
 	.byte	0x70
-	.4byte	0x4e0a
+	.4byte	0x4e7a
 	.uleb128 0xe
-	.4byte	.LASF1196
+	.4byte	.LASF1210
 	.byte	0x71
 	.byte	0x71
 	.4byte	0xe65
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1171
+	.4byte	.LASF1185
 	.byte	0x71
 	.byte	0x72
 	.4byte	0x330
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1197
+	.4byte	.LASF1211
 	.byte	0x71
 	.byte	0x73
-	.4byte	0x4dd3
+	.4byte	0x4e43
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4dd9
+	.4byte	0x4e49
 	.uleb128 0x5
 	.4byte	0x458
-	.4byte	0x4e20
+	.4byte	0x4e90
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3f
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0x4e36
+	.4byte	0x4ea6
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
@@ -20184,11 +20243,11 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1198
+	.4byte	.LASF1212
 	.byte	0x30
 	.byte	0x72
 	.byte	0x1e
-	.4byte	0x4e8b
+	.4byte	0x4efb
 	.uleb128 0xe
 	.4byte	.LASF383
 	.byte	0x72
@@ -20220,50 +20279,50 @@ __exitcall_ebc_exit:
 	.4byte	0x2f05
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1199
+	.4byte	.LASF1213
 	.byte	0x72
 	.byte	0x31
 	.4byte	0x199
 	.byte	0x28
 	.byte	0
-	.uleb128 0x3a
-	.4byte	.LASF1200
+	.uleb128 0x3c
+	.4byte	.LASF1214
 	.byte	0
 	.byte	0x73
 	.byte	0x18
 	.uleb128 0x1f
-	.4byte	.LASF1201
+	.4byte	.LASF1215
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x6c
 	.byte	0x40
-	.4byte	0x4ebc
+	.4byte	0x4f2c
 	.uleb128 0xc
-	.4byte	.LASF1202
+	.4byte	.LASF1216
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1203
+	.4byte	.LASF1217
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1204
+	.4byte	.LASF1218
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF1205
+	.4byte	.LASF1219
 	.byte	0x3
 	.byte	0
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x6c
 	.byte	0x4e
-	.4byte	0x4edd
+	.4byte	0x4f4d
 	.uleb128 0xe
-	.4byte	.LASF1206
+	.4byte	.LASF1220
 	.byte	0x6c
 	.byte	0x4f
-	.4byte	0x4e8b
+	.4byte	0x4efb
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1207
+	.4byte	.LASF1221
 	.byte	0x6c
 	.byte	0x50
 	.4byte	0x29
@@ -20273,15 +20332,15 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0x6c
 	.byte	0x53
-	.4byte	0x4efe
+	.4byte	0x4f6e
 	.uleb128 0xe
-	.4byte	.LASF1208
+	.4byte	.LASF1222
 	.byte	0x6c
 	.byte	0x54
 	.4byte	0x41c
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1209
+	.4byte	.LASF1223
 	.byte	0x6c
 	.byte	0x55
 	.4byte	0x29
@@ -20291,28 +20350,28 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0x6c
 	.byte	0x4d
-	.4byte	0x4f11
+	.4byte	0x4f81
 	.uleb128 0x29
-	.4byte	0x4ebc
+	.4byte	0x4f2c
 	.uleb128 0x29
-	.4byte	0x4edd
+	.4byte	0x4f4d
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1210
+	.4byte	.LASF1224
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4f11
+	.4byte	0x4f81
 	.uleb128 0xd
-	.4byte	.LASF1211
+	.4byte	.LASF1225
 	.byte	0x30
 	.byte	0x6c
 	.byte	0x60
-	.4byte	0x4f71
+	.4byte	0x4fe1
 	.uleb128 0xe
-	.4byte	.LASF1210
+	.4byte	.LASF1224
 	.byte	0x6c
 	.byte	0x61
-	.4byte	0x4f16
+	.4byte	0x4f86
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF71
@@ -20327,13 +20386,13 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1212
+	.4byte	.LASF1226
 	.byte	0x6c
 	.byte	0x64
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1213
+	.4byte	.LASF1227
 	.byte	0x6c
 	.byte	0x65
 	.4byte	0x2b0
@@ -20342,35 +20401,35 @@ __exitcall_ebc_exit:
 	.4byte	.LASF64
 	.byte	0x6c
 	.byte	0x67
-	.4byte	0x4f71
+	.4byte	0x4fe1
 	.byte	0x28
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4f1c
+	.4byte	0x4f8c
 	.uleb128 0xd
-	.4byte	.LASF1214
+	.4byte	.LASF1228
 	.byte	0x8
 	.byte	0x6c
 	.byte	0x72
-	.4byte	0x4f90
+	.4byte	0x5000
 	.uleb128 0xe
-	.4byte	.LASF1215
+	.4byte	.LASF1229
 	.byte	0x6c
 	.byte	0x73
-	.4byte	0x4f95
+	.4byte	0x5005
 	.byte	0
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1215
+	.4byte	.LASF1229
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4f90
+	.4byte	0x5000
 	.uleb128 0xf
 	.byte	0x18
 	.byte	0x74
 	.byte	0x1c
-	.4byte	0x4fc7
+	.4byte	0x5037
 	.uleb128 0x20
 	.string	"id"
 	.byte	0x74
@@ -20378,7 +20437,7 @@ __exitcall_ebc_exit:
 	.4byte	0x39c
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1216
+	.4byte	.LASF1230
 	.byte	0x74
 	.byte	0x1e
 	.4byte	0x458
@@ -20391,23 +20450,23 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1217
+	.4byte	.LASF1231
 	.byte	0x74
 	.byte	0x20
-	.4byte	0x4f9b
+	.4byte	0x500b
 	.uleb128 0x8
-	.4byte	.LASF1218
+	.4byte	.LASF1232
 	.byte	0x74
 	.byte	0x2f
 	.4byte	0x4b7
 	.uleb128 0xd
-	.4byte	.LASF1219
+	.4byte	.LASF1233
 	.byte	0x10
 	.byte	0x74
 	.byte	0x31
-	.4byte	0x5001
+	.4byte	0x5071
 	.uleb128 0xe
-	.4byte	.LASF1220
+	.4byte	.LASF1234
 	.byte	0x74
 	.byte	0x32
 	.4byte	0xc6
@@ -20416,31 +20475,31 @@ __exitcall_ebc_exit:
 	.string	"fn"
 	.byte	0x74
 	.byte	0x33
-	.4byte	0x4fd2
+	.4byte	0x5042
 	.byte	0x8
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1221
+	.4byte	.LASF1235
 	.byte	0x74
 	.byte	0x38
 	.4byte	0x500
 	.uleb128 0x19
-	.4byte	.LASF1222
+	.4byte	.LASF1236
 	.byte	0x74
 	.byte	0x38
 	.4byte	0x500
 	.uleb128 0x19
-	.4byte	.LASF1223
+	.4byte	.LASF1237
 	.byte	0x74
 	.byte	0x39
 	.4byte	0x37c
 	.uleb128 0x19
-	.4byte	.LASF1219
+	.4byte	.LASF1233
 	.byte	0x74
 	.byte	0x3d
-	.4byte	0x4fdd
+	.4byte	0x504d
 	.uleb128 0x8
-	.4byte	.LASF1224
+	.4byte	.LASF1238
 	.byte	0x5a
 	.byte	0x1a
 	.4byte	0xc6
@@ -20448,7 +20507,7 @@ __exitcall_ebc_exit:
 	.byte	0x28
 	.byte	0x5a
 	.byte	0x51
-	.4byte	0x5071
+	.4byte	0x50e1
 	.uleb128 0x20
 	.string	"lru"
 	.byte	0x5a
@@ -20456,13 +20515,13 @@ __exitcall_ebc_exit:
 	.4byte	0x3a7
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1225
+	.4byte	.LASF1239
 	.byte	0x5a
 	.byte	0x59
-	.4byte	0x5176
+	.4byte	0x51e6
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF880
+	.4byte	.LASF894
 	.byte	0x5a
 	.byte	0x5a
 	.4byte	0x29
@@ -20475,64 +20534,64 @@ __exitcall_ebc_exit:
 	.byte	0x20
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1226
+	.4byte	.LASF1240
 	.byte	0xd0
 	.byte	0x1f
 	.2byte	0x1a7
-	.4byte	0x5176
+	.4byte	0x51e6
 	.uleb128 0x1b
-	.4byte	.LASF1227
+	.4byte	.LASF1241
 	.byte	0x1f
 	.2byte	0x1a8
 	.4byte	0x1c7f
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1228
+	.4byte	.LASF1242
 	.byte	0x1f
 	.2byte	0x1a9
-	.4byte	0x4dd9
+	.4byte	0x4e49
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1229
+	.4byte	.LASF1243
 	.byte	0x1f
 	.2byte	0x1aa
 	.4byte	0x37c
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1230
+	.4byte	.LASF1244
 	.byte	0x1f
 	.2byte	0x1ab
-	.4byte	0x3532
+	.4byte	0x35a2
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1231
+	.4byte	.LASF1245
 	.byte	0x1f
 	.2byte	0x1ac
-	.4byte	0x4e36
+	.4byte	0x4ea6
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1232
+	.4byte	.LASF1246
 	.byte	0x1f
 	.2byte	0x1ae
 	.4byte	0x29
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1233
+	.4byte	.LASF1247
 	.byte	0x1f
 	.2byte	0x1b0
 	.4byte	0x29
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1234
+	.4byte	.LASF1248
 	.byte	0x1f
 	.2byte	0x1b1
 	.4byte	0x29
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1235
+	.4byte	.LASF1249
 	.byte	0x1f
 	.2byte	0x1b2
-	.4byte	0x7a13
+	.4byte	0x7a83
 	.byte	0x78
 	.uleb128 0x1b
 	.4byte	.LASF171
@@ -20541,34 +20600,34 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1236
+	.4byte	.LASF1250
 	.byte	0x1f
 	.2byte	0x1b4
 	.4byte	0xe65
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF1171
+	.4byte	.LASF1185
 	.byte	0x1f
 	.2byte	0x1b5
 	.4byte	0x330
 	.byte	0x8c
 	.uleb128 0x1b
-	.4byte	.LASF1189
+	.4byte	.LASF1203
 	.byte	0x1f
 	.2byte	0x1b6
 	.4byte	0x3a7
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1237
+	.4byte	.LASF1251
 	.byte	0x1f
 	.2byte	0x1b7
 	.4byte	0x458
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF1238
+	.4byte	.LASF1252
 	.byte	0x1f
 	.2byte	0x1b8
-	.4byte	0x5dc5
+	.4byte	0x5e35
 	.byte	0xa8
 	.uleb128 0x1b
 	.4byte	.LASF130
@@ -20597,26 +20656,26 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5071
+	.4byte	0x50e1
 	.uleb128 0xf
 	.byte	0x10
 	.byte	0x5a
 	.byte	0x66
-	.4byte	0x51a9
+	.4byte	0x5219
 	.uleb128 0xe
 	.4byte	.LASF64
 	.byte	0x5a
 	.byte	0x67
-	.4byte	0x3469
+	.4byte	0x34d9
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1151
+	.4byte	.LASF1165
 	.byte	0x5a
 	.byte	0x69
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1239
+	.4byte	.LASF1253
 	.byte	0x5a
 	.byte	0x6a
 	.4byte	0xc6
@@ -20626,22 +20685,22 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x5a
 	.byte	0x64
-	.4byte	0x51c2
+	.4byte	0x5232
 	.uleb128 0x22
-	.4byte	.LASF1240
+	.4byte	.LASF1254
 	.byte	0x5a
 	.byte	0x65
 	.4byte	0x3a7
 	.uleb128 0x29
-	.4byte	0x517c
+	.4byte	0x51ec
 	.byte	0
 	.uleb128 0xf
 	.byte	0x4
 	.byte	0x5a
 	.byte	0x77
-	.4byte	0x51f8
-	.uleb128 0x38
-	.4byte	.LASF1241
+	.4byte	0x5268
+	.uleb128 0x3a
+	.4byte	.LASF1255
 	.byte	0x5a
 	.byte	0x78
 	.4byte	0x6d
@@ -20649,8 +20708,8 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x10
 	.byte	0
-	.uleb128 0x38
-	.4byte	.LASF1242
+	.uleb128 0x3a
+	.4byte	.LASF1256
 	.byte	0x5a
 	.byte	0x79
 	.4byte	0x6d
@@ -20658,8 +20717,8 @@ __exitcall_ebc_exit:
 	.byte	0xf
 	.byte	0x1
 	.byte	0
-	.uleb128 0x38
-	.4byte	.LASF1243
+	.uleb128 0x3a
+	.4byte	.LASF1257
 	.byte	0x5a
 	.byte	0x7a
 	.4byte	0x6d
@@ -20672,74 +20731,74 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x5a
 	.byte	0x74
-	.4byte	0x521c
+	.4byte	0x528c
 	.uleb128 0x22
-	.4byte	.LASF1244
+	.4byte	.LASF1258
 	.byte	0x5a
 	.byte	0x75
 	.4byte	0x458
 	.uleb128 0x22
-	.4byte	.LASF1245
+	.4byte	.LASF1259
 	.byte	0x5a
 	.byte	0x76
 	.4byte	0x29
 	.uleb128 0x29
-	.4byte	0x51c2
+	.4byte	0x5232
 	.byte	0
 	.uleb128 0xf
 	.byte	0x28
 	.byte	0x5a
 	.byte	0x63
-	.4byte	0x5249
+	.4byte	0x52b9
 	.uleb128 0x23
-	.4byte	0x51a9
+	.4byte	0x5219
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1246
+	.4byte	.LASF1260
 	.byte	0x5a
 	.byte	0x71
-	.4byte	0x524e
+	.4byte	0x52be
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1247
+	.4byte	.LASF1261
 	.byte	0x5a
 	.byte	0x73
 	.4byte	0x458
 	.byte	0x18
 	.uleb128 0x23
-	.4byte	0x51f8
+	.4byte	0x5268
 	.byte	0x20
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1248
+	.4byte	.LASF1262
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5249
+	.4byte	0x52b9
 	.uleb128 0xf
 	.byte	0x10
 	.byte	0x5a
 	.byte	0x7e
-	.4byte	0x528d
+	.4byte	0x52fd
 	.uleb128 0xe
-	.4byte	.LASF1249
+	.4byte	.LASF1263
 	.byte	0x5a
 	.byte	0x7f
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1250
+	.4byte	.LASF1264
 	.byte	0x5a
 	.byte	0x82
 	.4byte	0x96
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1251
+	.4byte	.LASF1265
 	.byte	0x5a
 	.byte	0x83
 	.4byte	0x96
 	.byte	0x9
 	.uleb128 0xe
-	.4byte	.LASF1252
+	.4byte	.LASF1266
 	.byte	0x5a
 	.byte	0x84
 	.4byte	0x37c
@@ -20749,21 +20808,21 @@ __exitcall_ebc_exit:
 	.byte	0x20
 	.byte	0x5a
 	.byte	0x86
-	.4byte	0x52ba
+	.4byte	0x532a
 	.uleb128 0xe
-	.4byte	.LASF1253
+	.4byte	.LASF1267
 	.byte	0x5a
 	.byte	0x87
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1254
+	.4byte	.LASF1268
 	.byte	0x5a
 	.byte	0x88
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1255
+	.4byte	.LASF1269
 	.byte	0x5a
 	.byte	0x89
 	.4byte	0x3a7
@@ -20773,14 +20832,14 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x5a
 	.byte	0x8f
-	.4byte	0x52d9
+	.4byte	0x5349
 	.uleb128 0x22
-	.4byte	.LASF1256
+	.4byte	.LASF1270
 	.byte	0x5a
 	.byte	0x90
-	.4byte	0x4637
+	.4byte	0x46a7
 	.uleb128 0x22
-	.4byte	.LASF1257
+	.4byte	.LASF1271
 	.byte	0x5a
 	.byte	0x91
 	.4byte	0x37c
@@ -20789,27 +20848,27 @@ __exitcall_ebc_exit:
 	.byte	0x28
 	.byte	0x5a
 	.byte	0x8b
-	.4byte	0x5318
+	.4byte	0x5388
 	.uleb128 0xe
-	.4byte	.LASF1258
+	.4byte	.LASF1272
 	.byte	0x5a
 	.byte	0x8c
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1259
+	.4byte	.LASF1273
 	.byte	0x5a
 	.byte	0x8d
-	.4byte	0x345e
+	.4byte	0x34ce
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1260
+	.4byte	.LASF1274
 	.byte	0x5a
 	.byte	0x8e
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0x23
-	.4byte	0x52ba
+	.4byte	0x532a
 	.byte	0x18
 	.uleb128 0x20
 	.string	"ptl"
@@ -20822,52 +20881,52 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0x5a
 	.byte	0x99
-	.4byte	0x5345
+	.4byte	0x53b5
 	.uleb128 0xe
-	.4byte	.LASF1261
+	.4byte	.LASF1275
 	.byte	0x5a
 	.byte	0x9b
-	.4byte	0x53ca
+	.4byte	0x543a
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1262
+	.4byte	.LASF1276
 	.byte	0x5a
 	.byte	0x9c
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1263
+	.4byte	.LASF1277
 	.byte	0x5a
 	.byte	0x9d
 	.4byte	0x29
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1264
+	.4byte	.LASF1278
 	.byte	0xc8
 	.byte	0x75
 	.byte	0x72
-	.4byte	0x53ca
+	.4byte	0x543a
 	.uleb128 0xe
-	.4byte	.LASF1265
+	.4byte	.LASF1279
 	.byte	0x75
 	.byte	0x73
-	.4byte	0xc884
+	.4byte	0xc8f4
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1266
+	.4byte	.LASF1280
 	.byte	0x75
 	.byte	0x74
-	.4byte	0xc8c4
+	.4byte	0xc934
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1267
+	.4byte	.LASF1281
 	.byte	0x75
 	.byte	0x75
-	.4byte	0xc818
+	.4byte	0xc888
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1268
+	.4byte	.LASF1282
 	.byte	0x75
 	.byte	0x76
 	.4byte	0x2b0
@@ -20876,25 +20935,25 @@ __exitcall_ebc_exit:
 	.string	"res"
 	.byte	0x75
 	.byte	0x77
-	.4byte	0x974c
+	.4byte	0x97bc
 	.byte	0x40
 	.uleb128 0x20
 	.string	"ref"
 	.byte	0x75
 	.byte	0x78
-	.4byte	0xc69f
+	.4byte	0xc70f
 	.byte	0xa0
 	.uleb128 0xe
-	.4byte	.LASF1269
+	.4byte	.LASF1283
 	.byte	0x75
 	.byte	0x79
-	.4byte	0xc8e5
+	.4byte	0xc955
 	.byte	0xa8
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x75
 	.byte	0x7a
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.byte	0xb0
 	.uleb128 0xe
 	.4byte	.LASF794
@@ -20906,29 +20965,29 @@ __exitcall_ebc_exit:
 	.4byte	.LASF193
 	.byte	0x75
 	.byte	0x7c
-	.4byte	0xc861
+	.4byte	0xc8d1
 	.byte	0xc0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5345
+	.4byte	0x53b5
 	.uleb128 0x21
 	.byte	0x28
 	.byte	0x5a
 	.byte	0x50
-	.4byte	0x5402
+	.4byte	0x5472
 	.uleb128 0x29
-	.4byte	0x5038
+	.4byte	0x50a8
 	.uleb128 0x29
-	.4byte	0x521c
+	.4byte	0x528c
 	.uleb128 0x29
-	.4byte	0x5254
+	.4byte	0x52c4
 	.uleb128 0x29
-	.4byte	0x528d
+	.4byte	0x52fd
 	.uleb128 0x29
-	.4byte	0x52d9
+	.4byte	0x5349
 	.uleb128 0x29
-	.4byte	0x5318
+	.4byte	0x5388
 	.uleb128 0x22
 	.4byte	.LASF70
 	.byte	0x5a
@@ -20939,168 +20998,168 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x5a
 	.byte	0xa4
-	.4byte	0x5437
+	.4byte	0x54a7
 	.uleb128 0x22
-	.4byte	.LASF1270
+	.4byte	.LASF1284
 	.byte	0x5a
 	.byte	0xa9
 	.4byte	0x37c
 	.uleb128 0x22
-	.4byte	.LASF1271
+	.4byte	.LASF1285
 	.byte	0x5a
 	.byte	0xb1
 	.4byte	0x6d
 	.uleb128 0x22
-	.4byte	.LASF882
+	.4byte	.LASF896
 	.byte	0x5a
 	.byte	0xb3
 	.4byte	0x6d
 	.uleb128 0x22
-	.4byte	.LASF1272
+	.4byte	.LASF1286
 	.byte	0x5a
 	.byte	0xb4
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF1273
+	.4byte	.LASF1287
 	.2byte	0x100
 	.byte	0x1f
 	.2byte	0x395
-	.4byte	0x5557
+	.4byte	0x55c7
 	.uleb128 0x2b
 	.string	"f_u"
 	.byte	0x1f
 	.2byte	0x399
-	.4byte	0x7eed
+	.4byte	0x7f5d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1274
+	.4byte	.LASF1288
 	.byte	0x1f
 	.2byte	0x39a
 	.4byte	0x2118
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1275
+	.4byte	.LASF1289
 	.byte	0x1f
 	.2byte	0x39b
 	.4byte	0x1c7f
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1276
+	.4byte	.LASF1290
 	.byte	0x1f
 	.2byte	0x39c
-	.4byte	0x7dc6
+	.4byte	0x7e36
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1277
+	.4byte	.LASF1291
 	.byte	0x1f
 	.2byte	0x3a2
 	.4byte	0xe65
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1278
+	.4byte	.LASF1292
 	.byte	0x1f
 	.2byte	0x3a3
-	.4byte	0x7602
+	.4byte	0x7672
 	.byte	0x34
 	.uleb128 0x1b
-	.4byte	.LASF1279
+	.4byte	.LASF1293
 	.byte	0x1f
 	.2byte	0x3a4
 	.4byte	0x558
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1280
+	.4byte	.LASF1294
 	.byte	0x1f
 	.2byte	0x3a5
 	.4byte	0x6d
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1281
+	.4byte	.LASF1295
 	.byte	0x1f
 	.2byte	0x3a6
 	.4byte	0x33b
 	.byte	0x44
 	.uleb128 0x1b
-	.4byte	.LASF1282
+	.4byte	.LASF1296
 	.byte	0x1f
 	.2byte	0x3a7
 	.4byte	0x246a
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1283
+	.4byte	.LASF1297
 	.byte	0x1f
 	.2byte	0x3a8
 	.4byte	0x2d8
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1284
+	.4byte	.LASF1298
 	.byte	0x1f
 	.2byte	0x3a9
-	.4byte	0x7e35
+	.4byte	0x7ea5
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1285
+	.4byte	.LASF1299
 	.byte	0x1f
 	.2byte	0x3aa
-	.4byte	0x47d2
+	.4byte	0x4842
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1286
+	.4byte	.LASF1300
 	.byte	0x1f
 	.2byte	0x3ab
-	.4byte	0x7e91
+	.4byte	0x7f01
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF1287
+	.4byte	.LASF1301
 	.byte	0x1f
 	.2byte	0x3ad
 	.4byte	0x15a
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF1288
+	.4byte	.LASF1302
 	.byte	0x1f
 	.2byte	0x3af
 	.4byte	0x458
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF1237
+	.4byte	.LASF1251
 	.byte	0x1f
 	.2byte	0x3b2
 	.4byte	0x458
 	.byte	0xc8
 	.uleb128 0x1b
-	.4byte	.LASF1289
+	.4byte	.LASF1303
 	.byte	0x1f
 	.2byte	0x3b6
 	.4byte	0x3a7
 	.byte	0xd0
 	.uleb128 0x1b
-	.4byte	.LASF1290
+	.4byte	.LASF1304
 	.byte	0x1f
 	.2byte	0x3b7
 	.4byte	0x3a7
 	.byte	0xe0
 	.uleb128 0x1b
-	.4byte	.LASF1291
+	.4byte	.LASF1305
 	.byte	0x1f
 	.2byte	0x3b9
-	.4byte	0x5176
+	.4byte	0x51e6
 	.byte	0xf0
 	.uleb128 0x1b
-	.4byte	.LASF1292
+	.4byte	.LASF1306
 	.byte	0x1f
 	.2byte	0x3ba
-	.4byte	0x5dc5
+	.4byte	0x5e35
 	.byte	0xf8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x5437
+	.4byte	0x54a7
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5437
+	.4byte	0x54a7
 	.uleb128 0x2a
-	.4byte	.LASF982
+	.4byte	.LASF996
 	.byte	0
 	.byte	0x5a
 	.2byte	0x105
@@ -21108,124 +21167,124 @@ __exitcall_ebc_exit:
 	.byte	0x20
 	.byte	0x5a
 	.2byte	0x131
-	.4byte	0x558e
+	.4byte	0x55fe
 	.uleb128 0x2b
 	.string	"rb"
 	.byte	0x5a
 	.2byte	0x132
-	.4byte	0x34e2
+	.4byte	0x3552
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1293
+	.4byte	.LASF1307
 	.byte	0x5a
 	.2byte	0x133
 	.4byte	0x29
 	.byte	0x18
 	.byte	0
-	.uleb128 0x3f
+	.uleb128 0x41
 	.byte	0x20
 	.byte	0x5a
 	.2byte	0x130
-	.4byte	0x55b0
-	.uleb128 0x41
-	.4byte	.LASF1294
+	.4byte	0x5620
+	.uleb128 0x43
+	.4byte	.LASF1308
 	.byte	0x5a
 	.2byte	0x134
-	.4byte	0x556b
-	.uleb128 0x41
-	.4byte	.LASF1295
+	.4byte	0x55db
+	.uleb128 0x43
+	.4byte	.LASF1309
 	.byte	0x5a
 	.2byte	0x135
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF976
+	.4byte	.LASF990
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x55b0
+	.4byte	0x5620
 	.uleb128 0x1d
-	.4byte	.LASF1296
+	.4byte	.LASF1310
 	.byte	0x88
 	.byte	0x76
 	.2byte	0x195
-	.4byte	0x56a6
+	.4byte	0x5716
 	.uleb128 0x1b
 	.4byte	.LASF111
 	.byte	0x76
 	.2byte	0x196
-	.4byte	0xc9fd
+	.4byte	0xca6d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1297
+	.4byte	.LASF1311
 	.byte	0x76
 	.2byte	0x197
-	.4byte	0xc9fd
+	.4byte	0xca6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1298
+	.4byte	.LASF1312
 	.byte	0x76
 	.2byte	0x198
-	.4byte	0xca17
+	.4byte	0xca87
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1299
+	.4byte	.LASF1313
 	.byte	0x76
 	.2byte	0x199
-	.4byte	0xca2c
+	.4byte	0xca9c
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1300
+	.4byte	.LASF1314
 	.byte	0x76
 	.2byte	0x19a
-	.4byte	0xca41
+	.4byte	0xcab1
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1301
+	.4byte	.LASF1315
 	.byte	0x76
 	.2byte	0x19b
-	.4byte	0xca5b
+	.4byte	0xcacb
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1302
+	.4byte	.LASF1316
 	.byte	0x76
 	.2byte	0x19d
-	.4byte	0xca76
+	.4byte	0xcae6
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1303
+	.4byte	.LASF1317
 	.byte	0x76
 	.2byte	0x19f
-	.4byte	0xca8b
+	.4byte	0xcafb
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1304
+	.4byte	.LASF1318
 	.byte	0x76
 	.2byte	0x1a3
-	.4byte	0xca41
+	.4byte	0xcab1
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1305
+	.4byte	.LASF1319
 	.byte	0x76
 	.2byte	0x1a6
-	.4byte	0xca41
+	.4byte	0xcab1
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1306
+	.4byte	.LASF1320
 	.byte	0x76
 	.2byte	0x1ab
-	.4byte	0xcab4
+	.4byte	0xcb24
 	.byte	0x50
 	.uleb128 0x1b
 	.4byte	.LASF265
 	.byte	0x76
 	.2byte	0x1b1
-	.4byte	0xcac9
+	.4byte	0xcb39
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1307
+	.4byte	.LASF1321
 	.byte	0x76
 	.2byte	0x1cf
-	.4byte	0xcae3
+	.4byte	0xcb53
 	.byte	0x60
 	.uleb128 0x1b
 	.4byte	.LASF130
@@ -21253,16 +21312,16 @@ __exitcall_ebc_exit:
 	.byte	0x80
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x55bb
+	.4byte	0x562b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x56a6
+	.4byte	0x5716
 	.uleb128 0x1d
-	.4byte	.LASF1308
+	.4byte	.LASF1322
 	.byte	0x10
 	.byte	0x5a
 	.2byte	0x15a
-	.4byte	0x56d9
+	.4byte	0x5749
 	.uleb128 0x1b
 	.4byte	.LASF759
 	.byte	0x5a
@@ -21273,56 +21332,56 @@ __exitcall_ebc_exit:
 	.4byte	.LASF64
 	.byte	0x5a
 	.2byte	0x15c
-	.4byte	0x56d9
+	.4byte	0x5749
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x56b1
+	.4byte	0x5721
 	.uleb128 0x1d
-	.4byte	.LASF1309
+	.4byte	.LASF1323
 	.byte	0x38
 	.byte	0x5a
 	.2byte	0x15f
-	.4byte	0x5714
+	.4byte	0x5784
 	.uleb128 0x1b
-	.4byte	.LASF1310
+	.4byte	.LASF1324
 	.byte	0x5a
 	.2byte	0x160
 	.4byte	0x37c
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1311
+	.4byte	.LASF1325
 	.byte	0x5a
 	.2byte	0x161
-	.4byte	0x56b1
+	.4byte	0x5721
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1312
+	.4byte	.LASF1326
 	.byte	0x5a
 	.2byte	0x162
-	.4byte	0x4653
+	.4byte	0x46c3
 	.byte	0x18
 	.byte	0
-	.uleb128 0x45
+	.uleb128 0x47
 	.2byte	0x378
 	.byte	0x5a
 	.2byte	0x167
-	.4byte	0x59db
+	.4byte	0x5a4b
 	.uleb128 0x1b
 	.4byte	.LASF109
 	.byte	0x5a
 	.2byte	0x168
-	.4byte	0x3cb5
+	.4byte	0x3d25
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1313
+	.4byte	.LASF1327
 	.byte	0x5a
 	.2byte	0x169
-	.4byte	0x3519
+	.4byte	0x3589
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1314
+	.4byte	.LASF1328
 	.byte	0x5a
 	.2byte	0x16a
 	.4byte	0x15a
@@ -21331,28 +21390,28 @@ __exitcall_ebc_exit:
 	.4byte	.LASF118
 	.byte	0x5a
 	.2byte	0x16c
-	.4byte	0x59fe
+	.4byte	0x5a6e
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1315
+	.4byte	.LASF1329
 	.byte	0x5a
 	.2byte	0x170
 	.4byte	0x29
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1316
+	.4byte	.LASF1330
 	.byte	0x5a
 	.2byte	0x171
 	.4byte	0x29
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1317
+	.4byte	.LASF1331
 	.byte	0x5a
 	.2byte	0x177
 	.4byte	0x29
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1318
+	.4byte	.LASF1332
 	.byte	0x5a
 	.2byte	0x178
 	.4byte	0x29
@@ -21361,136 +21420,136 @@ __exitcall_ebc_exit:
 	.string	"pgd"
 	.byte	0x5a
 	.2byte	0x179
-	.4byte	0x5a04
+	.4byte	0x5a74
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1319
+	.4byte	.LASF1333
 	.byte	0x5a
 	.2byte	0x184
 	.4byte	0x37c
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1320
+	.4byte	.LASF1334
 	.byte	0x5a
 	.2byte	0x18d
 	.4byte	0x37c
 	.byte	0x4c
 	.uleb128 0x1b
-	.4byte	.LASF1321
+	.4byte	.LASF1335
 	.byte	0x5a
 	.2byte	0x190
 	.4byte	0x558
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1322
+	.4byte	.LASF1336
 	.byte	0x5a
 	.2byte	0x192
 	.4byte	0xc6
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1323
+	.4byte	.LASF1337
 	.byte	0x5a
 	.2byte	0x194
 	.4byte	0xe65
 	.byte	0x5c
 	.uleb128 0x1b
-	.4byte	.LASF1324
+	.4byte	.LASF1338
 	.byte	0x5a
 	.2byte	0x197
-	.4byte	0x4e36
+	.4byte	0x4ea6
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1325
+	.4byte	.LASF1339
 	.byte	0x5a
 	.2byte	0x199
 	.4byte	0x3a7
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1326
+	.4byte	.LASF1340
 	.byte	0x5a
 	.2byte	0x1a0
 	.4byte	0x29
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF1327
+	.4byte	.LASF1341
 	.byte	0x5a
 	.2byte	0x1a1
 	.4byte	0x29
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF1328
+	.4byte	.LASF1342
 	.byte	0x5a
 	.2byte	0x1a3
 	.4byte	0x29
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF960
+	.4byte	.LASF974
 	.byte	0x5a
 	.2byte	0x1a4
 	.4byte	0x29
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF1329
+	.4byte	.LASF1343
 	.byte	0x5a
 	.2byte	0x1a5
 	.4byte	0x29
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF1330
+	.4byte	.LASF1344
 	.byte	0x5a
 	.2byte	0x1a6
 	.4byte	0x29
 	.byte	0xc8
 	.uleb128 0x1b
-	.4byte	.LASF1331
+	.4byte	.LASF1345
 	.byte	0x5a
 	.2byte	0x1a7
 	.4byte	0x29
 	.byte	0xd0
 	.uleb128 0x1b
-	.4byte	.LASF1332
+	.4byte	.LASF1346
 	.byte	0x5a
 	.2byte	0x1a8
 	.4byte	0x29
 	.byte	0xd8
 	.uleb128 0x1b
-	.4byte	.LASF1333
+	.4byte	.LASF1347
 	.byte	0x5a
 	.2byte	0x1a9
 	.4byte	0x29
 	.byte	0xe0
 	.uleb128 0x1b
-	.4byte	.LASF1334
+	.4byte	.LASF1348
 	.byte	0x5a
 	.2byte	0x1ab
 	.4byte	0xe65
 	.byte	0xe8
 	.uleb128 0x1b
-	.4byte	.LASF1335
+	.4byte	.LASF1349
 	.byte	0x5a
 	.2byte	0x1ac
 	.4byte	0x29
 	.byte	0xf0
 	.uleb128 0x1b
-	.4byte	.LASF1336
+	.4byte	.LASF1350
 	.byte	0x5a
 	.2byte	0x1ac
 	.4byte	0x29
 	.byte	0xf8
 	.uleb128 0x1c
-	.4byte	.LASF1337
+	.4byte	.LASF1351
 	.byte	0x5a
 	.2byte	0x1ac
 	.4byte	0x29
 	.2byte	0x100
 	.uleb128 0x1c
-	.4byte	.LASF1338
+	.4byte	.LASF1352
 	.byte	0x5a
 	.2byte	0x1ac
 	.4byte	0x29
 	.2byte	0x108
 	.uleb128 0x1c
-	.4byte	.LASF1339
+	.4byte	.LASF1353
 	.byte	0x5a
 	.2byte	0x1ad
 	.4byte	0x29
@@ -21502,58 +21561,58 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.2byte	0x118
 	.uleb128 0x1c
-	.4byte	.LASF1340
+	.4byte	.LASF1354
 	.byte	0x5a
 	.2byte	0x1ad
 	.4byte	0x29
 	.2byte	0x120
 	.uleb128 0x1c
-	.4byte	.LASF1341
+	.4byte	.LASF1355
 	.byte	0x5a
 	.2byte	0x1ae
 	.4byte	0x29
 	.2byte	0x128
 	.uleb128 0x1c
-	.4byte	.LASF1342
+	.4byte	.LASF1356
 	.byte	0x5a
 	.2byte	0x1ae
 	.4byte	0x29
 	.2byte	0x130
 	.uleb128 0x1c
-	.4byte	.LASF1343
+	.4byte	.LASF1357
 	.byte	0x5a
 	.2byte	0x1ae
 	.4byte	0x29
 	.2byte	0x138
 	.uleb128 0x1c
-	.4byte	.LASF1344
+	.4byte	.LASF1358
 	.byte	0x5a
 	.2byte	0x1ae
 	.4byte	0x29
 	.2byte	0x140
 	.uleb128 0x1c
-	.4byte	.LASF1345
+	.4byte	.LASF1359
 	.byte	0x5a
 	.2byte	0x1b0
-	.4byte	0x5a0a
+	.4byte	0x5a7a
 	.2byte	0x148
 	.uleb128 0x1c
 	.4byte	.LASF618
 	.byte	0x5a
 	.2byte	0x1b6
-	.4byte	0x3e15
+	.4byte	0x3e85
 	.2byte	0x2b8
 	.uleb128 0x1c
-	.4byte	.LASF1346
+	.4byte	.LASF1360
 	.byte	0x5a
 	.2byte	0x1b8
-	.4byte	0x5a1f
+	.4byte	0x5a8f
 	.2byte	0x2e0
 	.uleb128 0x1c
-	.4byte	.LASF1347
+	.4byte	.LASF1361
 	.byte	0x5a
 	.2byte	0x1bb
-	.4byte	0x4fc7
+	.4byte	0x5037
 	.2byte	0x2e8
 	.uleb128 0x1c
 	.4byte	.LASF171
@@ -21562,28 +21621,28 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.2byte	0x300
 	.uleb128 0x1c
-	.4byte	.LASF1309
+	.4byte	.LASF1323
 	.byte	0x5a
 	.2byte	0x1bf
-	.4byte	0x5a25
+	.4byte	0x5a95
 	.2byte	0x308
 	.uleb128 0x1c
-	.4byte	.LASF1348
+	.4byte	.LASF1362
 	.byte	0x5a
 	.2byte	0x1c1
 	.4byte	0x37c
 	.2byte	0x310
 	.uleb128 0x1c
-	.4byte	.LASF1349
+	.4byte	.LASF1363
 	.byte	0x5a
 	.2byte	0x1c4
 	.4byte	0xe65
 	.2byte	0x314
 	.uleb128 0x1c
-	.4byte	.LASF1350
+	.4byte	.LASF1364
 	.byte	0x5a
 	.2byte	0x1c5
-	.4byte	0x5a30
+	.4byte	0x5aa0
 	.2byte	0x318
 	.uleb128 0x1c
 	.4byte	.LASF98
@@ -21592,31 +21651,31 @@ __exitcall_ebc_exit:
 	.4byte	0x2f05
 	.2byte	0x320
 	.uleb128 0x1c
-	.4byte	.LASF1119
+	.4byte	.LASF1133
 	.byte	0x5a
 	.2byte	0x1d4
-	.4byte	0x5a36
+	.4byte	0x5aa6
 	.2byte	0x328
 	.uleb128 0x1c
-	.4byte	.LASF1351
+	.4byte	.LASF1365
 	.byte	0x5a
 	.2byte	0x1d7
-	.4byte	0x555c
+	.4byte	0x55cc
 	.2byte	0x330
 	.uleb128 0x1c
-	.4byte	.LASF1352
+	.4byte	.LASF1366
 	.byte	0x5a
 	.2byte	0x1f1
 	.4byte	0x37c
 	.2byte	0x338
 	.uleb128 0x1c
-	.4byte	.LASF1214
+	.4byte	.LASF1228
 	.byte	0x5a
 	.2byte	0x1f6
-	.4byte	0x4f77
+	.4byte	0x4fe7
 	.2byte	0x340
 	.uleb128 0x1c
-	.4byte	.LASF1353
+	.4byte	.LASF1367
 	.byte	0x5a
 	.2byte	0x1fa
 	.4byte	0x320b
@@ -21624,9 +21683,9 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x14
 	.4byte	0x29
-	.4byte	0x59fe
+	.4byte	0x5a6e
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
@@ -21638,61 +21697,61 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x59db
+	.4byte	0x5a4b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3413
+	.4byte	0x3483
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0x5a1a
+	.4byte	0x5a8a
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2d
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1354
+	.4byte	.LASF1368
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5a1a
+	.4byte	0x5a8a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x56df
+	.4byte	0x574f
 	.uleb128 0x24
-	.4byte	.LASF1355
+	.4byte	.LASF1369
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5a2b
+	.4byte	0x5a9b
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x23eb
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0x5a4b
-	.uleb128 0x44
+	.4byte	0x5abb
+	.uleb128 0x46
 	.4byte	0x4f
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF1356
+	.4byte	.LASF1370
 	.byte	0x5a
 	.2byte	0x209
-	.4byte	0x4614
+	.4byte	0x4684
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3469
+	.4byte	0x34d9
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5a63
+	.4byte	0x5ad3
 	.uleb128 0x1d
-	.4byte	.LASF1357
+	.4byte	.LASF1371
 	.byte	0x68
 	.byte	0x76
 	.2byte	0x163
-	.4byte	0x5b27
+	.4byte	0x5b97
 	.uleb128 0x2b
 	.string	"vma"
 	.byte	0x76
 	.2byte	0x164
-	.4byte	0x3cb5
+	.4byte	0x3d25
 	.byte	0
 	.uleb128 0x1b
 	.4byte	.LASF171
@@ -21701,19 +21760,19 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1171
+	.4byte	.LASF1185
 	.byte	0x76
 	.2byte	0x166
 	.4byte	0x330
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF1358
+	.4byte	.LASF1372
 	.byte	0x76
 	.2byte	0x167
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1359
+	.4byte	.LASF1373
 	.byte	0x76
 	.2byte	0x168
 	.4byte	0x29
@@ -21722,68 +21781,68 @@ __exitcall_ebc_exit:
 	.string	"pmd"
 	.byte	0x76
 	.2byte	0x169
-	.4byte	0xc8be
+	.4byte	0xc92e
 	.byte	0x20
 	.uleb128 0x2b
 	.string	"pud"
 	.byte	0x76
 	.2byte	0x16b
-	.4byte	0xc9c2
+	.4byte	0xca32
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1360
+	.4byte	.LASF1374
 	.byte	0x76
 	.2byte	0x16e
-	.4byte	0x33d3
+	.4byte	0x3443
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1361
+	.4byte	.LASF1375
 	.byte	0x76
 	.2byte	0x170
-	.4byte	0x3469
+	.4byte	0x34d9
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1174
+	.4byte	.LASF1188
 	.byte	0x76
 	.2byte	0x171
-	.4byte	0x4971
+	.4byte	0x49e1
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF845
+	.4byte	.LASF859
 	.byte	0x76
 	.2byte	0x172
-	.4byte	0x3469
+	.4byte	0x34d9
 	.byte	0x48
 	.uleb128 0x2b
 	.string	"pte"
 	.byte	0x76
 	.2byte	0x178
-	.4byte	0xc9c8
+	.4byte	0xca38
 	.byte	0x50
 	.uleb128 0x2b
 	.string	"ptl"
 	.byte	0x76
 	.2byte	0x17c
-	.4byte	0x4d39
+	.4byte	0x4da9
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1362
+	.4byte	.LASF1376
 	.byte	0x76
 	.2byte	0x180
-	.4byte	0x345e
+	.4byte	0x34ce
 	.byte	0x60
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1363
+	.4byte	.LASF1377
 	.byte	0x77
 	.byte	0x16
 	.4byte	0xc6
 	.uleb128 0xd
-	.4byte	.LASF1364
+	.4byte	.LASF1378
 	.byte	0x8
 	.byte	0x77
 	.byte	0x18
-	.4byte	0x5b4b
+	.4byte	0x5bbb
 	.uleb128 0x20
 	.string	"cap"
 	.byte	0x77
@@ -21792,28 +21851,28 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1365
+	.4byte	.LASF1379
 	.byte	0x77
 	.byte	0x1a
-	.4byte	0x5b32
+	.4byte	0x5ba2
 	.uleb128 0x3
-	.4byte	0x5b4b
+	.4byte	0x5bbb
 	.uleb128 0x19
-	.4byte	.LASF1366
+	.4byte	.LASF1380
 	.byte	0x77
 	.byte	0x2d
-	.4byte	0x5b56
+	.4byte	0x5bc6
 	.uleb128 0x19
-	.4byte	.LASF1367
+	.4byte	.LASF1381
 	.byte	0x77
 	.byte	0x2e
-	.4byte	0x5b56
+	.4byte	0x5bc6
 	.uleb128 0xd
-	.4byte	.LASF1368
+	.4byte	.LASF1382
 	.byte	0x18
 	.byte	0x78
 	.byte	0x10
-	.4byte	0x5ba2
+	.4byte	0x5c12
 	.uleb128 0xe
 	.4byte	.LASF116
 	.byte	0x78
@@ -21834,43 +21893,43 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1369
+	.4byte	.LASF1383
 	.byte	0x38
 	.byte	0x79
 	.byte	0x11
-	.4byte	0x5bf7
+	.4byte	0x5c67
 	.uleb128 0xe
-	.4byte	.LASF1370
+	.4byte	.LASF1384
 	.byte	0x79
 	.byte	0x12
 	.4byte	0xf4
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1371
+	.4byte	.LASF1385
 	.byte	0x79
 	.byte	0x14
 	.4byte	0xf4
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1372
+	.4byte	.LASF1386
 	.byte	0x79
 	.byte	0x16
 	.4byte	0xf4
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1373
+	.4byte	.LASF1387
 	.byte	0x79
 	.byte	0x17
-	.4byte	0x5bf7
+	.4byte	0x5c67
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1374
+	.4byte	.LASF1388
 	.byte	0x79
 	.byte	0x18
 	.4byte	0xd2
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1375
+	.4byte	.LASF1389
 	.byte	0x79
 	.byte	0x19
 	.4byte	0xca8
@@ -21878,37 +21937,37 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xf4
-	.4byte	0x5c07
+	.4byte	0x5c77
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF1376
+	.4byte	.LASF1390
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x7a
 	.byte	0xf
-	.4byte	0x5c30
+	.4byte	0x5ca0
 	.uleb128 0xc
-	.4byte	.LASF1377
+	.4byte	.LASF1391
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1378
+	.4byte	.LASF1392
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1379
+	.4byte	.LASF1393
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF1380
+	.4byte	.LASF1394
 	.byte	0x3
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1381
+	.4byte	.LASF1395
 	.byte	0x8
 	.byte	0x7b
 	.byte	0x14
-	.4byte	0x5c49
+	.4byte	0x5cb9
 	.uleb128 0xe
 	.4byte	.LASF759
 	.byte	0x7b
@@ -21917,108 +21976,108 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF1382
+	.4byte	.LASF1396
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x7c
 	.byte	0x1d
-	.4byte	0x5c6c
+	.4byte	0x5cdc
 	.uleb128 0xc
-	.4byte	.LASF1383
+	.4byte	.LASF1397
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1384
+	.4byte	.LASF1398
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1385
+	.4byte	.LASF1399
 	.byte	0x2
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1386
+	.4byte	.LASF1400
 	.byte	0x40
 	.byte	0x7c
 	.byte	0x20
-	.4byte	0x5cc1
+	.4byte	0x5d31
 	.uleb128 0xe
-	.4byte	.LASF1387
+	.4byte	.LASF1401
 	.byte	0x7c
 	.byte	0x21
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1388
+	.4byte	.LASF1402
 	.byte	0x7c
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1389
+	.4byte	.LASF1403
 	.byte	0x7c
 	.byte	0x23
 	.4byte	0x15bf
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1390
+	.4byte	.LASF1404
 	.byte	0x7c
 	.byte	0x25
 	.4byte	0xc6
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1391
+	.4byte	.LASF1405
 	.byte	0x7c
 	.byte	0x26
 	.4byte	0x41c
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1392
+	.4byte	.LASF1406
 	.byte	0x7c
 	.byte	0x28
-	.4byte	0x5c49
+	.4byte	0x5cb9
 	.byte	0x38
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1393
+	.4byte	.LASF1407
 	.byte	0x88
 	.byte	0x7d
 	.byte	0xc
-	.4byte	0x5d0a
+	.4byte	0x5d7a
 	.uleb128 0x20
 	.string	"rss"
 	.byte	0x7d
 	.byte	0xd
-	.4byte	0x5c6c
+	.4byte	0x5cdc
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1394
+	.4byte	.LASF1408
 	.byte	0x7d
 	.byte	0xe
-	.4byte	0x3573
+	.4byte	0x35e3
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF1395
+	.4byte	.LASF1409
 	.byte	0x7d
 	.byte	0xf
-	.4byte	0x4e36
+	.4byte	0x4ea6
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF1396
+	.4byte	.LASF1410
 	.byte	0x7d
 	.byte	0x10
-	.4byte	0x5c30
+	.4byte	0x5ca0
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF1397
+	.4byte	.LASF1411
 	.byte	0x7d
 	.byte	0x11
 	.4byte	0xc6
 	.byte	0x80
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1398
+	.4byte	.LASF1412
 	.byte	0x10
 	.byte	0x7e
 	.byte	0xa
-	.4byte	0x5d2e
+	.4byte	0x5d9e
 	.uleb128 0x20
 	.string	"fn"
 	.byte	0x7e
@@ -22036,78 +22095,78 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x7f
 	.byte	0x17
-	.4byte	0x5d41
+	.4byte	0x5db1
 	.uleb128 0x20
 	.string	"b"
 	.byte	0x7f
 	.byte	0x18
-	.4byte	0x5d41
+	.4byte	0x5db1
 	.byte	0
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x8b
-	.4byte	0x5d51
+	.4byte	0x5dc1
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1399
+	.4byte	.LASF1413
 	.byte	0x7f
 	.byte	0x19
-	.4byte	0x5d2e
+	.4byte	0x5d9e
 	.uleb128 0x3
-	.4byte	0x5d51
+	.4byte	0x5dc1
 	.uleb128 0xf
 	.byte	0x10
 	.byte	0x80
 	.byte	0x18
-	.4byte	0x5d74
+	.4byte	0x5de4
 	.uleb128 0x20
 	.string	"b"
 	.byte	0x80
 	.byte	0x19
-	.4byte	0x5d41
+	.4byte	0x5db1
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1400
+	.4byte	.LASF1414
 	.byte	0x80
 	.byte	0x1a
-	.4byte	0x5d61
+	.4byte	0x5dd1
 	.uleb128 0x3
-	.4byte	0x5d74
+	.4byte	0x5de4
 	.uleb128 0x19
-	.4byte	.LASF1401
+	.4byte	.LASF1415
 	.byte	0x80
 	.byte	0x29
-	.4byte	0x5d5c
+	.4byte	0x5dcc
 	.uleb128 0x19
-	.4byte	.LASF1402
+	.4byte	.LASF1416
 	.byte	0x80
 	.byte	0x2a
-	.4byte	0x5d7f
+	.4byte	0x5def
 	.uleb128 0x5
 	.4byte	0x11a
-	.4byte	0x5daa
+	.4byte	0x5e1a
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x5d9a
+	.4byte	0x5e0a
 	.uleb128 0x19
-	.4byte	.LASF1403
+	.4byte	.LASF1417
 	.byte	0x80
 	.byte	0x51
-	.4byte	0x5daa
+	.4byte	0x5e1a
 	.uleb128 0x19
-	.4byte	.LASF1404
+	.4byte	.LASF1418
 	.byte	0x80
 	.byte	0x52
-	.4byte	0x5daa
+	.4byte	0x5e1a
 	.uleb128 0x8
-	.4byte	.LASF1405
+	.4byte	.LASF1419
 	.byte	0x81
 	.byte	0x8
 	.4byte	0x13f
@@ -22115,57 +22174,57 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x6b
 	.byte	0x53
-	.4byte	0x5def
+	.4byte	0x5e5f
 	.uleb128 0x22
-	.4byte	.LASF1406
+	.4byte	.LASF1420
 	.byte	0x6b
 	.byte	0x54
 	.4byte	0x3a7
 	.uleb128 0x22
-	.4byte	.LASF1407
+	.4byte	.LASF1421
 	.byte	0x6b
 	.byte	0x55
-	.4byte	0x524e
+	.4byte	0x52be
 	.byte	0
 	.uleb128 0x21
 	.byte	0x10
 	.byte	0x6b
 	.byte	0x57
-	.4byte	0x5e0e
+	.4byte	0x5e7e
 	.uleb128 0x22
-	.4byte	.LASF1408
+	.4byte	.LASF1422
 	.byte	0x6b
 	.byte	0x58
 	.4byte	0x3eb
 	.uleb128 0x22
-	.4byte	.LASF1409
+	.4byte	.LASF1423
 	.byte	0x6b
 	.byte	0x59
 	.4byte	0x41c
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1410
+	.4byte	.LASF1424
 	.byte	0x38
 	.byte	0x6b
 	.byte	0x49
-	.4byte	0x5e49
+	.4byte	0x5eb9
 	.uleb128 0x20
 	.string	"q"
 	.byte	0x6b
 	.byte	0x4a
-	.4byte	0x497c
+	.4byte	0x49ec
 	.byte	0
 	.uleb128 0x20
 	.string	"ioc"
 	.byte	0x6b
 	.byte	0x4b
-	.4byte	0x48fd
+	.4byte	0x496d
 	.byte	0x8
 	.uleb128 0x23
-	.4byte	0x5dd0
+	.4byte	0x5e40
 	.byte	0x10
 	.uleb128 0x23
-	.4byte	0x5def
+	.4byte	0x5e5f
 	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF171
@@ -22176,45 +22235,45 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5e0e
+	.4byte	0x5e7e
 	.uleb128 0x19
-	.4byte	.LASF1411
+	.4byte	.LASF1425
 	.byte	0x82
 	.byte	0xb
 	.4byte	0x6d
 	.uleb128 0xd
-	.4byte	.LASF1412
+	.4byte	.LASF1426
 	.byte	0x18
 	.byte	0x83
 	.byte	0x5c
-	.4byte	0x5e8b
+	.4byte	0x5efb
 	.uleb128 0xe
-	.4byte	.LASF1413
+	.4byte	.LASF1427
 	.byte	0x83
 	.byte	0x5d
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1414
+	.4byte	.LASF1428
 	.byte	0x83
 	.byte	0x5e
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1415
+	.4byte	.LASF1429
 	.byte	0x83
 	.byte	0x5f
 	.4byte	0x29
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1416
+	.4byte	.LASF1430
 	.byte	0x38
 	.byte	0x83
 	.byte	0x62
-	.4byte	0x5ebc
+	.4byte	0x5f2c
 	.uleb128 0xe
-	.4byte	.LASF1417
+	.4byte	.LASF1431
 	.byte	0x83
 	.byte	0x63
 	.4byte	0x199
@@ -22229,87 +22288,87 @@ __exitcall_ebc_exit:
 	.4byte	.LASF396
 	.byte	0x83
 	.byte	0x65
-	.4byte	0x5ebc
+	.4byte	0x5f2c
 	.byte	0x10
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x199
-	.4byte	0x5ecc
+	.4byte	0x5f3c
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x4
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1418
+	.4byte	.LASF1432
 	.byte	0x1f
 	.byte	0x49
-	.4byte	0x5e5a
+	.4byte	0x5eca
 	.uleb128 0x19
-	.4byte	.LASF1419
+	.4byte	.LASF1433
 	.byte	0x1f
 	.byte	0x4b
 	.4byte	0x6d
 	.uleb128 0x19
-	.4byte	.LASF1420
+	.4byte	.LASF1434
 	.byte	0x1f
 	.byte	0x4c
-	.4byte	0x5e8b
+	.4byte	0x5efb
 	.uleb128 0x19
-	.4byte	.LASF1421
+	.4byte	.LASF1435
 	.byte	0x1f
 	.byte	0x4d
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF1422
+	.4byte	.LASF1436
 	.byte	0x1f
 	.byte	0x4d
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF1423
+	.4byte	.LASF1437
 	.byte	0x1f
 	.byte	0x4e
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF1424
+	.4byte	.LASF1438
 	.byte	0x1f
 	.byte	0x4f
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF1425
+	.4byte	.LASF1439
 	.byte	0x1f
 	.byte	0x50
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF1426
+	.4byte	.LASF1440
 	.byte	0x1f
 	.byte	0x51
 	.4byte	0xc6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5f35
+	.4byte	0x5fa5
 	.uleb128 0x1d
-	.4byte	.LASF1427
+	.4byte	.LASF1441
 	.byte	0x28
 	.byte	0x1f
 	.2byte	0x137
-	.4byte	0x5f9e
+	.4byte	0x600e
 	.uleb128 0x1b
-	.4byte	.LASF1428
+	.4byte	.LASF1442
 	.byte	0x1f
 	.2byte	0x138
-	.4byte	0x555c
+	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1429
+	.4byte	.LASF1443
 	.byte	0x1f
 	.2byte	0x13d
 	.4byte	0x2d8
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1430
+	.4byte	.LASF1444
 	.byte	0x1f
 	.2byte	0x13e
-	.4byte	0x764d
+	.4byte	0x76bd
 	.byte	0x10
 	.uleb128 0x1b
 	.4byte	.LASF360
@@ -22318,118 +22377,118 @@ __exitcall_ebc_exit:
 	.4byte	0x458
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1431
+	.4byte	.LASF1445
 	.byte	0x1f
 	.2byte	0x140
 	.4byte	0xc6
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1432
+	.4byte	.LASF1446
 	.byte	0x1f
 	.2byte	0x141
 	.4byte	0x11f
 	.byte	0x24
 	.uleb128 0x1b
-	.4byte	.LASF1433
+	.4byte	.LASF1447
 	.byte	0x1f
 	.2byte	0x142
 	.4byte	0x11f
 	.byte	0x26
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1434
+	.4byte	.LASF1448
 	.byte	0x50
 	.byte	0x1f
 	.byte	0xd9
-	.4byte	0x6017
+	.4byte	0x6087
 	.uleb128 0xe
-	.4byte	.LASF1435
+	.4byte	.LASF1449
 	.byte	0x1f
 	.byte	0xda
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1436
+	.4byte	.LASF1450
 	.byte	0x1f
 	.byte	0xdb
 	.4byte	0x28f
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1437
+	.4byte	.LASF1451
 	.byte	0x1f
 	.byte	0xdc
 	.4byte	0x2410
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1438
+	.4byte	.LASF1452
 	.byte	0x1f
 	.byte	0xdd
 	.4byte	0x2430
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF1439
+	.4byte	.LASF1453
 	.byte	0x1f
 	.byte	0xde
 	.4byte	0x2d8
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1440
+	.4byte	.LASF1454
 	.byte	0x1f
 	.byte	0xdf
 	.4byte	0xa27
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1441
+	.4byte	.LASF1455
 	.byte	0x1f
 	.byte	0xe0
 	.4byte	0xa27
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1442
+	.4byte	.LASF1456
 	.byte	0x1f
 	.byte	0xe1
 	.4byte	0xa27
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF1443
+	.4byte	.LASF1457
 	.byte	0x1f
 	.byte	0xe8
-	.4byte	0x555c
+	.4byte	0x55cc
 	.byte	0x48
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x224
-	.4byte	0x6027
+	.4byte	0x6097
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x5
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x6017
+	.4byte	0x6087
 	.uleb128 0x19
-	.4byte	.LASF1444
+	.4byte	.LASF1458
 	.byte	0x84
 	.byte	0x45
-	.4byte	0x6027
+	.4byte	0x6097
 	.uleb128 0x19
-	.4byte	.LASF1445
+	.4byte	.LASF1459
 	.byte	0x84
 	.byte	0x5a
 	.4byte	0xc6
 	.uleb128 0xd
-	.4byte	.LASF1446
+	.4byte	.LASF1460
 	.byte	0x68
 	.byte	0x84
 	.byte	0x63
-	.4byte	0x6067
+	.4byte	0x60d7
 	.uleb128 0xe
-	.4byte	.LASF1447
+	.4byte	.LASF1461
 	.byte	0x84
 	.byte	0x64
-	.4byte	0x6067
+	.4byte	0x60d7
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1448
+	.4byte	.LASF1462
 	.byte	0x84
 	.byte	0x65
 	.4byte	0x29
@@ -22437,390 +22496,390 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x3a7
-	.4byte	0x6077
+	.4byte	0x60e7
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x5
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1449
+	.4byte	.LASF1463
 	.byte	0
 	.byte	0x84
 	.byte	0x71
-	.4byte	0x608e
+	.4byte	0x60fe
 	.uleb128 0x20
 	.string	"x"
 	.byte	0x84
 	.byte	0x72
-	.4byte	0x608e
+	.4byte	0x60fe
 	.byte	0
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x609d
-	.uleb128 0x44
+	.4byte	0x610d
+	.uleb128 0x46
 	.4byte	0x4f
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF1450
+	.4byte	.LASF1464
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x84
 	.byte	0x87
-	.4byte	0x6108
+	.4byte	0x6178
 	.uleb128 0xc
-	.4byte	.LASF1451
+	.4byte	.LASF1465
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1452
+	.4byte	.LASF1466
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1453
+	.4byte	.LASF1467
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1454
+	.4byte	.LASF1468
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF1455
+	.4byte	.LASF1469
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF1456
+	.4byte	.LASF1470
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF1457
+	.4byte	.LASF1471
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF1458
+	.4byte	.LASF1472
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF1459
+	.4byte	.LASF1473
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF1460
+	.4byte	.LASF1474
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF1461
+	.4byte	.LASF1475
 	.byte	0x9
 	.uleb128 0xc
-	.4byte	.LASF1462
+	.4byte	.LASF1476
 	.byte	0xa
 	.uleb128 0xc
-	.4byte	.LASF1463
+	.4byte	.LASF1477
 	.byte	0xb
 	.uleb128 0xc
-	.4byte	.LASF1464
+	.4byte	.LASF1478
 	.byte	0xc
 	.uleb128 0xc
-	.4byte	.LASF1465
+	.4byte	.LASF1479
 	.byte	0xd
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF1466
+	.4byte	.LASF1480
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x84
 	.byte	0x9f
-	.4byte	0x61eb
+	.4byte	0x625b
 	.uleb128 0xc
-	.4byte	.LASF1467
+	.4byte	.LASF1481
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1468
+	.4byte	.LASF1482
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1469
+	.4byte	.LASF1483
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1470
+	.4byte	.LASF1484
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF1471
+	.4byte	.LASF1485
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF1472
+	.4byte	.LASF1486
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF1473
+	.4byte	.LASF1487
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF1474
+	.4byte	.LASF1488
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF1475
+	.4byte	.LASF1489
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF1476
+	.4byte	.LASF1490
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF1477
+	.4byte	.LASF1491
 	.byte	0x9
 	.uleb128 0xc
-	.4byte	.LASF1478
+	.4byte	.LASF1492
 	.byte	0xa
 	.uleb128 0xc
-	.4byte	.LASF1479
+	.4byte	.LASF1493
 	.byte	0xb
 	.uleb128 0xc
-	.4byte	.LASF1480
+	.4byte	.LASF1494
 	.byte	0xc
 	.uleb128 0xc
-	.4byte	.LASF1481
+	.4byte	.LASF1495
 	.byte	0xd
 	.uleb128 0xc
-	.4byte	.LASF1482
+	.4byte	.LASF1496
 	.byte	0xe
 	.uleb128 0xc
-	.4byte	.LASF1483
+	.4byte	.LASF1497
 	.byte	0xf
 	.uleb128 0xc
-	.4byte	.LASF1484
+	.4byte	.LASF1498
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF1485
+	.4byte	.LASF1499
 	.byte	0x11
 	.uleb128 0xc
-	.4byte	.LASF1486
+	.4byte	.LASF1500
 	.byte	0x12
 	.uleb128 0xc
-	.4byte	.LASF1487
+	.4byte	.LASF1501
 	.byte	0x13
 	.uleb128 0xc
-	.4byte	.LASF1488
+	.4byte	.LASF1502
 	.byte	0x14
 	.uleb128 0xc
-	.4byte	.LASF1489
+	.4byte	.LASF1503
 	.byte	0x15
 	.uleb128 0xc
-	.4byte	.LASF1490
+	.4byte	.LASF1504
 	.byte	0x16
 	.uleb128 0xc
-	.4byte	.LASF1491
+	.4byte	.LASF1505
 	.byte	0x17
 	.uleb128 0xc
-	.4byte	.LASF1492
+	.4byte	.LASF1506
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF1493
+	.4byte	.LASF1507
 	.byte	0x19
 	.uleb128 0xc
-	.4byte	.LASF1494
+	.4byte	.LASF1508
 	.byte	0x1a
 	.uleb128 0xc
-	.4byte	.LASF1495
+	.4byte	.LASF1509
 	.byte	0x1b
 	.uleb128 0xc
-	.4byte	.LASF1496
+	.4byte	.LASF1510
 	.byte	0x1c
 	.uleb128 0xc
-	.4byte	.LASF1497
+	.4byte	.LASF1511
 	.byte	0x1d
 	.uleb128 0xc
-	.4byte	.LASF1498
+	.4byte	.LASF1512
 	.byte	0x1e
 	.uleb128 0xc
-	.4byte	.LASF1499
+	.4byte	.LASF1513
 	.byte	0x1f
 	.uleb128 0xc
-	.4byte	.LASF1500
+	.4byte	.LASF1514
 	.byte	0x20
 	.uleb128 0xc
-	.4byte	.LASF1501
+	.4byte	.LASF1515
 	.byte	0x21
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1502
+	.4byte	.LASF1516
 	.byte	0x20
 	.byte	0x84
 	.byte	0xea
-	.4byte	0x6210
+	.4byte	0x6280
 	.uleb128 0xe
-	.4byte	.LASF1503
+	.4byte	.LASF1517
 	.byte	0x84
 	.byte	0xf3
 	.4byte	0x3f
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1504
+	.4byte	.LASF1518
 	.byte	0x84
 	.byte	0xf4
 	.4byte	0x3f
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1505
+	.4byte	.LASF1519
 	.byte	0x88
 	.byte	0x84
 	.byte	0xf7
-	.4byte	0x6259
+	.4byte	0x62c9
 	.uleb128 0xe
-	.4byte	.LASF1506
+	.4byte	.LASF1520
 	.byte	0x84
 	.byte	0xf8
-	.4byte	0x6259
+	.4byte	0x62c9
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1507
+	.4byte	.LASF1521
 	.byte	0x84
 	.byte	0xf9
-	.4byte	0x61eb
+	.4byte	0x625b
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF1508
+	.4byte	.LASF1522
 	.byte	0x84
 	.byte	0xfb
 	.4byte	0x558
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF1509
+	.4byte	.LASF1523
 	.byte	0x84
 	.byte	0xfd
 	.4byte	0x29
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF1510
+	.4byte	.LASF1524
 	.byte	0x84
 	.byte	0xff
-	.4byte	0x63d5
+	.4byte	0x6445
 	.byte	0x80
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x3a7
-	.4byte	0x6269
+	.4byte	0x62d9
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x4
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF1511
+	.4byte	.LASF1525
 	.2byte	0x1680
 	.byte	0x84
 	.2byte	0x284
-	.4byte	0x63d5
+	.4byte	0x6445
 	.uleb128 0x1b
-	.4byte	.LASF1512
+	.4byte	.LASF1526
 	.byte	0x84
 	.2byte	0x285
-	.4byte	0x6768
+	.4byte	0x67d8
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1513
+	.4byte	.LASF1527
 	.byte	0x84
 	.2byte	0x286
-	.4byte	0x6778
+	.4byte	0x67e8
 	.2byte	0x1380
 	.uleb128 0x1c
-	.4byte	.LASF1514
+	.4byte	.LASF1528
 	.byte	0x84
 	.2byte	0x287
 	.4byte	0xc6
 	.2byte	0x13c0
 	.uleb128 0x1c
-	.4byte	.LASF1515
+	.4byte	.LASF1529
 	.byte	0x84
 	.2byte	0x2a0
 	.4byte	0x29
 	.2byte	0x13c8
 	.uleb128 0x1c
-	.4byte	.LASF1516
+	.4byte	.LASF1530
 	.byte	0x84
 	.2byte	0x2a1
 	.4byte	0x29
 	.2byte	0x13d0
 	.uleb128 0x1c
-	.4byte	.LASF1517
+	.4byte	.LASF1531
 	.byte	0x84
 	.2byte	0x2a2
 	.4byte	0x29
 	.2byte	0x13d8
 	.uleb128 0x1c
-	.4byte	.LASF1518
+	.4byte	.LASF1532
 	.byte	0x84
 	.2byte	0x2a4
 	.4byte	0xc6
 	.2byte	0x13e0
 	.uleb128 0x1c
-	.4byte	.LASF1519
+	.4byte	.LASF1533
 	.byte	0x84
 	.2byte	0x2a5
 	.4byte	0x15bf
 	.2byte	0x13e8
 	.uleb128 0x1c
-	.4byte	.LASF1520
+	.4byte	.LASF1534
 	.byte	0x84
 	.2byte	0x2a6
 	.4byte	0x15bf
 	.2byte	0x1400
 	.uleb128 0x1c
-	.4byte	.LASF1521
+	.4byte	.LASF1535
 	.byte	0x84
 	.2byte	0x2a7
 	.4byte	0x2f05
 	.2byte	0x1418
 	.uleb128 0x1c
-	.4byte	.LASF1522
+	.4byte	.LASF1536
 	.byte	0x84
 	.2byte	0x2a9
 	.4byte	0xc6
 	.2byte	0x1420
 	.uleb128 0x1c
-	.4byte	.LASF1523
+	.4byte	.LASF1537
 	.byte	0x84
 	.2byte	0x2aa
-	.4byte	0x64b6
+	.4byte	0x6526
 	.2byte	0x1424
 	.uleb128 0x1c
-	.4byte	.LASF1524
+	.4byte	.LASF1538
 	.byte	0x84
 	.2byte	0x2ac
 	.4byte	0xc6
 	.2byte	0x1428
 	.uleb128 0x1c
-	.4byte	.LASF1525
+	.4byte	.LASF1539
 	.byte	0x84
 	.2byte	0x2af
 	.4byte	0xc6
 	.2byte	0x142c
 	.uleb128 0x1c
-	.4byte	.LASF1526
+	.4byte	.LASF1540
 	.byte	0x84
 	.2byte	0x2b0
-	.4byte	0x64b6
+	.4byte	0x6526
 	.2byte	0x1430
 	.uleb128 0x1c
-	.4byte	.LASF1527
+	.4byte	.LASF1541
 	.byte	0x84
 	.2byte	0x2b1
 	.4byte	0x15bf
 	.2byte	0x1438
 	.uleb128 0x1c
-	.4byte	.LASF1528
+	.4byte	.LASF1542
 	.byte	0x84
 	.2byte	0x2b2
 	.4byte	0x2f05
 	.2byte	0x1450
 	.uleb128 0x1c
-	.4byte	.LASF1529
+	.4byte	.LASF1543
 	.byte	0x84
 	.2byte	0x2b8
 	.4byte	0x29
 	.2byte	0x1458
 	.uleb128 0x1c
-	.4byte	.LASF1530
+	.4byte	.LASF1544
 	.byte	0x84
 	.2byte	0x2c3
-	.4byte	0x6077
+	.4byte	0x60e7
 	.2byte	0x1480
 	.uleb128 0x1c
-	.4byte	.LASF1531
+	.4byte	.LASF1545
 	.byte	0x84
 	.2byte	0x2c4
 	.4byte	0xe65
 	.2byte	0x1480
 	.uleb128 0x1c
-	.4byte	.LASF1505
+	.4byte	.LASF1519
 	.byte	0x84
 	.2byte	0x2d7
-	.4byte	0x6210
+	.4byte	0x6280
 	.2byte	0x1488
 	.uleb128 0x1c
 	.4byte	.LASF171
@@ -22829,38 +22888,38 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.2byte	0x1510
 	.uleb128 0x1c
-	.4byte	.LASF1532
+	.4byte	.LASF1546
 	.byte	0x84
 	.2byte	0x2db
-	.4byte	0x6077
+	.4byte	0x60e7
 	.2byte	0x1540
 	.uleb128 0x1c
-	.4byte	.LASF1533
+	.4byte	.LASF1547
 	.byte	0x84
 	.2byte	0x2de
-	.4byte	0x6788
+	.4byte	0x67f8
 	.2byte	0x1540
 	.uleb128 0x1c
-	.4byte	.LASF1534
+	.4byte	.LASF1548
 	.byte	0x84
 	.2byte	0x2df
-	.4byte	0x678e
+	.4byte	0x67fe
 	.2byte	0x1548
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6269
+	.4byte	0x62d9
 	.uleb128 0x13
-	.4byte	.LASF1535
+	.4byte	.LASF1549
 	.byte	0x84
 	.2byte	0x110
 	.4byte	0x6d
 	.uleb128 0x1d
-	.4byte	.LASF1536
+	.4byte	.LASF1550
 	.byte	0x50
 	.byte	0x84
 	.2byte	0x11d
-	.4byte	0x6429
+	.4byte	0x6499
 	.uleb128 0x1b
 	.4byte	.LASF383
 	.byte	0x84
@@ -22868,171 +22927,171 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1537
+	.4byte	.LASF1551
 	.byte	0x84
 	.2byte	0x11f
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF1178
+	.4byte	.LASF1192
 	.byte	0x84
 	.2byte	0x120
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1506
+	.4byte	.LASF1520
 	.byte	0x84
 	.2byte	0x123
-	.4byte	0x6429
+	.4byte	0x6499
 	.byte	0x10
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x3a7
-	.4byte	0x6439
+	.4byte	0x64a9
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1538
+	.4byte	.LASF1552
 	.byte	0x60
 	.byte	0x84
 	.2byte	0x126
-	.4byte	0x646e
+	.4byte	0x64de
 	.uleb128 0x2b
 	.string	"pcp"
 	.byte	0x84
 	.2byte	0x127
-	.4byte	0x63e7
+	.4byte	0x6457
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1539
+	.4byte	.LASF1553
 	.byte	0x84
 	.2byte	0x12d
 	.4byte	0x106
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1540
+	.4byte	.LASF1554
 	.byte	0x84
 	.2byte	0x12e
-	.4byte	0x646e
+	.4byte	0x64de
 	.byte	0x51
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x106
-	.4byte	0x647e
+	.4byte	0x64ee
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xc
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1541
+	.4byte	.LASF1555
 	.byte	0x22
 	.byte	0x84
 	.2byte	0x132
-	.4byte	0x64a6
+	.4byte	0x6516
 	.uleb128 0x1b
-	.4byte	.LASF1539
+	.4byte	.LASF1553
 	.byte	0x84
 	.2byte	0x133
 	.4byte	0x106
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1542
+	.4byte	.LASF1556
 	.byte	0x84
 	.2byte	0x134
-	.4byte	0x64a6
+	.4byte	0x6516
 	.byte	0x1
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x106
-	.4byte	0x64b6
+	.4byte	0x6526
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x20
 	.byte	0
 	.uleb128 0x1e
-	.4byte	.LASF1543
+	.4byte	.LASF1557
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x84
 	.2byte	0x139
-	.4byte	0x64e0
+	.4byte	0x6550
 	.uleb128 0xc
-	.4byte	.LASF1544
+	.4byte	.LASF1558
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1545
+	.4byte	.LASF1559
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1546
+	.4byte	.LASF1560
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF1547
+	.4byte	.LASF1561
 	.byte	0x3
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF1548
+	.4byte	.LASF1562
 	.2byte	0x680
 	.byte	0x84
 	.2byte	0x172
-	.4byte	0x66ae
+	.4byte	0x671e
 	.uleb128 0x1b
-	.4byte	.LASF1549
+	.4byte	.LASF1563
 	.byte	0x84
 	.2byte	0x176
-	.4byte	0x66ae
+	.4byte	0x671e
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1550
+	.4byte	.LASF1564
 	.byte	0x84
 	.2byte	0x178
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1551
+	.4byte	.LASF1565
 	.byte	0x84
 	.2byte	0x183
-	.4byte	0x66be
+	.4byte	0x672e
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1552
+	.4byte	.LASF1566
 	.byte	0x84
 	.2byte	0x188
-	.4byte	0x63d5
+	.4byte	0x6445
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1553
+	.4byte	.LASF1567
 	.byte	0x84
 	.2byte	0x189
-	.4byte	0x66ce
+	.4byte	0x673e
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1554
+	.4byte	.LASF1568
 	.byte	0x84
 	.2byte	0x18c
 	.4byte	0x2b0
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1555
+	.4byte	.LASF1569
 	.byte	0x84
 	.2byte	0x198
 	.4byte	0x29
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1556
+	.4byte	.LASF1570
 	.byte	0x84
 	.2byte	0x1c3
 	.4byte	0x29
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1557
+	.4byte	.LASF1571
 	.byte	0x84
 	.2byte	0x1c4
 	.4byte	0x29
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1558
+	.4byte	.LASF1572
 	.byte	0x84
 	.2byte	0x1c5
 	.4byte	0x29
@@ -23044,28 +23103,28 @@ __exitcall_ebc_exit:
 	.4byte	0x56
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1559
+	.4byte	.LASF1573
 	.byte	0x84
 	.2byte	0x1cf
 	.4byte	0x29
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1560
+	.4byte	.LASF1574
 	.byte	0x84
 	.2byte	0x1d7
 	.4byte	0xc6
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1530
+	.4byte	.LASF1544
 	.byte	0x84
 	.2byte	0x1da
-	.4byte	0x6077
+	.4byte	0x60e7
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF1446
+	.4byte	.LASF1460
 	.byte	0x84
 	.2byte	0x1dd
-	.4byte	0x66d4
+	.4byte	0x6744
 	.byte	0xc0
 	.uleb128 0x1c
 	.4byte	.LASF171
@@ -23080,76 +23139,76 @@ __exitcall_ebc_exit:
 	.4byte	0xe65
 	.2byte	0x540
 	.uleb128 0x1c
-	.4byte	.LASF1532
+	.4byte	.LASF1546
 	.byte	0x84
 	.2byte	0x1e6
-	.4byte	0x6077
+	.4byte	0x60e7
 	.2byte	0x580
 	.uleb128 0x1c
-	.4byte	.LASF1561
+	.4byte	.LASF1575
 	.byte	0x84
 	.2byte	0x1ed
 	.4byte	0x29
 	.2byte	0x580
 	.uleb128 0x1c
-	.4byte	.LASF1562
+	.4byte	.LASF1576
 	.byte	0x84
 	.2byte	0x1f1
 	.4byte	0x29
 	.2byte	0x588
 	.uleb128 0x1c
-	.4byte	.LASF1563
+	.4byte	.LASF1577
 	.byte	0x84
 	.2byte	0x1f3
 	.4byte	0x3f
 	.2byte	0x590
 	.uleb128 0x1c
-	.4byte	.LASF1564
+	.4byte	.LASF1578
 	.byte	0x84
 	.2byte	0x1fc
 	.4byte	0x6d
 	.2byte	0x5a0
 	.uleb128 0x1c
-	.4byte	.LASF1565
+	.4byte	.LASF1579
 	.byte	0x84
 	.2byte	0x1fd
 	.4byte	0x6d
 	.2byte	0x5a4
 	.uleb128 0x1c
-	.4byte	.LASF1566
+	.4byte	.LASF1580
 	.byte	0x84
 	.2byte	0x1fe
 	.4byte	0xc6
 	.2byte	0x5a8
 	.uleb128 0x1c
-	.4byte	.LASF1567
+	.4byte	.LASF1581
 	.byte	0x84
 	.2byte	0x203
 	.4byte	0x2b0
 	.2byte	0x5ac
 	.uleb128 0x1c
-	.4byte	.LASF1568
+	.4byte	.LASF1582
 	.byte	0x84
 	.2byte	0x206
 	.4byte	0x2b0
 	.2byte	0x5ad
 	.uleb128 0x1c
-	.4byte	.LASF1569
+	.4byte	.LASF1583
 	.byte	0x84
 	.2byte	0x208
-	.4byte	0x6077
+	.4byte	0x60e7
 	.2byte	0x5c0
 	.uleb128 0x1c
-	.4byte	.LASF1534
+	.4byte	.LASF1548
 	.byte	0x84
 	.2byte	0x20a
-	.4byte	0x66e4
+	.4byte	0x6754
 	.2byte	0x5c0
 	.uleb128 0x1c
-	.4byte	.LASF1570
+	.4byte	.LASF1584
 	.byte	0x84
 	.2byte	0x20b
-	.4byte	0x66f4
+	.4byte	0x6764
 	.2byte	0x628
 	.uleb128 0x1c
 	.4byte	.LASF130
@@ -23178,55 +23237,55 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0x66be
+	.4byte	0x672e
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x199
-	.4byte	0x66ce
+	.4byte	0x673e
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6439
+	.4byte	0x64a9
 	.uleb128 0x5
-	.4byte	0x6042
-	.4byte	0x66e4
+	.4byte	0x60b2
+	.4byte	0x6754
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xa
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x558
-	.4byte	0x66f4
+	.4byte	0x6764
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xc
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x558
-	.4byte	0x6703
-	.uleb128 0x44
+	.4byte	0x6773
+	.uleb128 0x46
 	.4byte	0x4f
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1571
+	.4byte	.LASF1585
 	.byte	0x10
 	.byte	0x84
 	.2byte	0x25f
-	.4byte	0x672b
+	.4byte	0x679b
 	.uleb128 0x1b
-	.4byte	.LASF1548
+	.4byte	.LASF1562
 	.byte	0x84
 	.2byte	0x260
-	.4byte	0x672b
+	.4byte	0x679b
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1572
+	.4byte	.LASF1586
 	.byte	0x84
 	.2byte	0x261
 	.4byte	0xc6
@@ -23234,69 +23293,69 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x64e0
+	.4byte	0x6550
 	.uleb128 0x1d
-	.4byte	.LASF1573
+	.4byte	.LASF1587
 	.byte	0x40
 	.byte	0x84
 	.2byte	0x272
-	.4byte	0x674c
+	.4byte	0x67bc
 	.uleb128 0x1b
-	.4byte	.LASF1574
+	.4byte	.LASF1588
 	.byte	0x84
 	.2byte	0x273
-	.4byte	0x674c
+	.4byte	0x67bc
 	.byte	0
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x6703
-	.4byte	0x675c
+	.4byte	0x6773
+	.4byte	0x67cc
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF1575
+	.4byte	.LASF1589
 	.byte	0x84
 	.2byte	0x278
-	.4byte	0x3469
+	.4byte	0x34d9
 	.uleb128 0x5
-	.4byte	0x64e0
-	.4byte	0x6778
+	.4byte	0x6550
+	.4byte	0x67e8
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x6731
-	.4byte	0x6788
+	.4byte	0x67a1
+	.4byte	0x67f8
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x647e
+	.4byte	0x64ee
 	.uleb128 0x5
 	.4byte	0x558
-	.4byte	0x679e
+	.4byte	0x680e
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x20
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1576
+	.4byte	.LASF1590
 	.byte	0x21
 	.byte	0x33
-	.4byte	0x67a9
+	.4byte	0x6819
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x67af
+	.4byte	0x681f
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x67c8
+	.4byte	0x6838
 	.uleb128 0x11
-	.4byte	0x67c8
+	.4byte	0x6838
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
@@ -23304,208 +23363,208 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x67ce
+	.4byte	0x683e
 	.uleb128 0xd
-	.4byte	.LASF1577
+	.4byte	.LASF1591
 	.byte	0x18
 	.byte	0x21
 	.byte	0x36
-	.4byte	0x67ff
+	.4byte	0x686f
 	.uleb128 0xe
-	.4byte	.LASF1578
+	.4byte	.LASF1592
 	.byte	0x21
 	.byte	0x37
-	.4byte	0x679e
+	.4byte	0x680e
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF64
 	.byte	0x21
 	.byte	0x38
-	.4byte	0x67c8
+	.4byte	0x6838
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1579
+	.4byte	.LASF1593
 	.byte	0x21
 	.byte	0x39
 	.4byte	0xc6
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1580
+	.4byte	.LASF1594
 	.byte	0x38
 	.byte	0x21
 	.byte	0x41
-	.4byte	0x6824
+	.4byte	0x6894
 	.uleb128 0xe
-	.4byte	.LASF1581
+	.4byte	.LASF1595
 	.byte	0x21
 	.byte	0x42
-	.4byte	0x4e36
+	.4byte	0x4ea6
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF136
 	.byte	0x21
 	.byte	0x43
-	.4byte	0x67c8
+	.4byte	0x6838
 	.byte	0x30
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1582
+	.4byte	.LASF1596
 	.byte	0x21
 	.byte	0xee
-	.4byte	0x67ff
+	.4byte	0x686f
 	.uleb128 0x15
-	.4byte	.LASF1583
+	.4byte	.LASF1597
 	.byte	0x84
 	.2byte	0x368
 	.4byte	0xc6
 	.uleb128 0x5
 	.4byte	0xc6
-	.4byte	0x684b
+	.4byte	0x68bb
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF1584
+	.4byte	.LASF1598
 	.byte	0x84
 	.2byte	0x394
-	.4byte	0x683b
+	.4byte	0x68ab
 	.uleb128 0x15
-	.4byte	.LASF1585
+	.4byte	.LASF1599
 	.byte	0x84
 	.2byte	0x3a0
 	.4byte	0x500
 	.uleb128 0x15
-	.4byte	.LASF1586
+	.4byte	.LASF1600
 	.byte	0x84
 	.2byte	0x3a5
-	.4byte	0x6269
+	.4byte	0x62d9
 	.uleb128 0x1d
-	.4byte	.LASF1587
+	.4byte	.LASF1601
 	.byte	0x10
 	.byte	0x84
 	.2byte	0x469
-	.4byte	0x6897
+	.4byte	0x6907
 	.uleb128 0x1b
-	.4byte	.LASF1588
+	.4byte	.LASF1602
 	.byte	0x84
 	.2byte	0x476
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1589
+	.4byte	.LASF1603
 	.byte	0x84
 	.2byte	0x479
-	.4byte	0x6897
+	.4byte	0x6907
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x29
 	.uleb128 0x15
-	.4byte	.LASF1587
+	.4byte	.LASF1601
 	.byte	0x84
 	.2byte	0x493
-	.4byte	0x68a9
+	.4byte	0x6919
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x68af
+	.4byte	0x691f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x686f
+	.4byte	0x68df
 	.uleb128 0x15
-	.4byte	.LASF1590
+	.4byte	.LASF1604
 	.byte	0x84
 	.2byte	0x4ea
 	.4byte	0xc6
 	.uleb128 0xd
-	.4byte	.LASF1591
+	.4byte	.LASF1605
 	.byte	0x28
 	.byte	0x85
 	.byte	0x7
-	.4byte	0x6922
+	.4byte	0x6992
 	.uleb128 0xe
-	.4byte	.LASF1592
+	.4byte	.LASF1606
 	.byte	0x85
 	.byte	0x8
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1593
+	.4byte	.LASF1607
 	.byte	0x85
 	.byte	0x9
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1594
+	.4byte	.LASF1608
 	.byte	0x85
 	.byte	0xa
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1595
+	.4byte	.LASF1609
 	.byte	0x85
 	.byte	0xb
 	.4byte	0xc6
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF1596
+	.4byte	.LASF1610
 	.byte	0x85
 	.byte	0xc
 	.4byte	0x15e8
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1597
+	.4byte	.LASF1611
 	.byte	0x85
 	.byte	0xd
 	.4byte	0x15e8
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1598
+	.4byte	.LASF1612
 	.byte	0x85
 	.byte	0xe
 	.4byte	0x15e8
 	.byte	0x20
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x68c1
-	.4byte	0x6932
+	.4byte	0x6931
+	.4byte	0x69a2
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x7
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1591
+	.4byte	.LASF1605
 	.byte	0x85
 	.byte	0x11
-	.4byte	0x6922
+	.4byte	0x6992
 	.uleb128 0x19
-	.4byte	.LASF1599
+	.4byte	.LASF1613
 	.byte	0x86
 	.byte	0x11
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF1600
+	.4byte	.LASF1614
 	.byte	0x86
 	.byte	0x1c
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF1601
+	.4byte	.LASF1615
 	.byte	0x86
 	.byte	0x24
 	.4byte	0x29
 	.uleb128 0x15
-	.4byte	.LASF1602
+	.4byte	.LASF1616
 	.byte	0x87
 	.2byte	0x259
 	.4byte	0x330
 	.uleb128 0xd
-	.4byte	.LASF1603
+	.4byte	.LASF1617
 	.byte	0x28
 	.byte	0x88
 	.byte	0x14
-	.4byte	0x69a7
+	.4byte	0x6a17
 	.uleb128 0xe
 	.4byte	.LASF116
 	.byte	0x88
@@ -23519,110 +23578,110 @@ __exitcall_ebc_exit:
 	.4byte	0x14f
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF962
+	.4byte	.LASF976
 	.byte	0x88
 	.byte	0x18
 	.4byte	0x3a7
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1245
+	.4byte	.LASF1259
 	.byte	0x88
 	.byte	0x1a
-	.4byte	0x69a7
+	.4byte	0x6a17
 	.byte	0x20
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x12f
 	.uleb128 0x19
-	.4byte	.LASF1604
+	.4byte	.LASF1618
 	.byte	0x88
 	.byte	0x1d
 	.4byte	0xc6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x69be
+	.4byte	0x6a2e
 	.uleb128 0x1d
-	.4byte	.LASF1605
+	.4byte	.LASF1619
 	.byte	0xd0
 	.byte	0x89
 	.2byte	0x126
-	.4byte	0x6a68
+	.4byte	0x6ad8
 	.uleb128 0x1b
-	.4byte	.LASF1606
+	.4byte	.LASF1620
 	.byte	0x89
 	.2byte	0x127
 	.4byte	0x3eb
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1607
+	.4byte	.LASF1621
 	.byte	0x89
 	.2byte	0x128
 	.4byte	0x3a7
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1608
+	.4byte	.LASF1622
 	.byte	0x89
 	.2byte	0x129
 	.4byte	0x3a7
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1609
+	.4byte	.LASF1623
 	.byte	0x89
 	.2byte	0x12a
 	.4byte	0x3a7
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1610
+	.4byte	.LASF1624
 	.byte	0x89
 	.2byte	0x12b
 	.4byte	0x246a
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1611
+	.4byte	.LASF1625
 	.byte	0x89
 	.2byte	0x12c
 	.4byte	0xe65
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1612
+	.4byte	.LASF1626
 	.byte	0x89
 	.2byte	0x12d
 	.4byte	0x37c
 	.byte	0x64
 	.uleb128 0x1b
-	.4byte	.LASF1613
+	.4byte	.LASF1627
 	.byte	0x89
 	.2byte	0x12e
 	.4byte	0x20e7
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1614
+	.4byte	.LASF1628
 	.byte	0x89
 	.2byte	0x12f
-	.4byte	0x6aeb
+	.4byte	0x6b5b
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1615
+	.4byte	.LASF1629
 	.byte	0x89
 	.2byte	0x130
 	.4byte	0x2d8
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1616
+	.4byte	.LASF1630
 	.byte	0x89
 	.2byte	0x131
 	.4byte	0x29
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1617
+	.4byte	.LASF1631
 	.byte	0x89
 	.2byte	0x132
-	.4byte	0x6b15
+	.4byte	0x6b85
 	.byte	0x88
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1618
+	.4byte	.LASF1632
 	.byte	0x8a
 	.byte	0x14
 	.4byte	0x1bb
@@ -23630,38 +23689,38 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x8a
 	.byte	0x16
-	.4byte	0x6a88
+	.4byte	0x6af8
 	.uleb128 0x20
 	.string	"val"
 	.byte	0x8a
 	.byte	0x17
-	.4byte	0x6a68
+	.4byte	0x6ad8
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1619
+	.4byte	.LASF1633
 	.byte	0x8a
 	.byte	0x18
-	.4byte	0x6a73
+	.4byte	0x6ae3
 	.uleb128 0x1f
-	.4byte	.LASF1620
+	.4byte	.LASF1634
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x89
 	.byte	0x36
-	.4byte	0x6ab6
+	.4byte	0x6b26
 	.uleb128 0xc
-	.4byte	.LASF1621
+	.4byte	.LASF1635
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1622
+	.4byte	.LASF1636
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1623
+	.4byte	.LASF1637
 	.byte	0x2
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1624
+	.4byte	.LASF1638
 	.byte	0x89
 	.byte	0x42
 	.4byte	0xed
@@ -23669,7 +23728,7 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x89
 	.byte	0x45
-	.4byte	0x6aeb
+	.4byte	0x6b5b
 	.uleb128 0x28
 	.string	"uid"
 	.byte	0x89
@@ -23681,196 +23740,196 @@ __exitcall_ebc_exit:
 	.byte	0x47
 	.4byte	0x2430
 	.uleb128 0x22
-	.4byte	.LASF1625
+	.4byte	.LASF1639
 	.byte	0x89
 	.byte	0x48
-	.4byte	0x6a88
+	.4byte	0x6af8
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1626
+	.4byte	.LASF1640
 	.byte	0x8
 	.byte	0x89
 	.byte	0x44
-	.4byte	0x6b0a
+	.4byte	0x6b7a
 	.uleb128 0x23
-	.4byte	0x6ac1
+	.4byte	0x6b31
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF193
 	.byte	0x89
 	.byte	0x4a
-	.4byte	0x6a93
+	.4byte	0x6b03
 	.byte	0x4
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1627
+	.4byte	.LASF1641
 	.byte	0x89
 	.byte	0xc1
 	.4byte	0xe65
 	.uleb128 0xd
-	.4byte	.LASF1628
+	.4byte	.LASF1642
 	.byte	0x48
 	.byte	0x89
 	.byte	0xcd
-	.4byte	0x6b8e
+	.4byte	0x6bfe
 	.uleb128 0xe
-	.4byte	.LASF1629
+	.4byte	.LASF1643
 	.byte	0x89
 	.byte	0xce
-	.4byte	0x6ab6
+	.4byte	0x6b26
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1630
+	.4byte	.LASF1644
 	.byte	0x89
 	.byte	0xcf
-	.4byte	0x6ab6
+	.4byte	0x6b26
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1631
+	.4byte	.LASF1645
 	.byte	0x89
 	.byte	0xd0
-	.4byte	0x6ab6
+	.4byte	0x6b26
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1632
+	.4byte	.LASF1646
 	.byte	0x89
 	.byte	0xd1
-	.4byte	0x6ab6
+	.4byte	0x6b26
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1633
+	.4byte	.LASF1647
 	.byte	0x89
 	.byte	0xd2
-	.4byte	0x6ab6
+	.4byte	0x6b26
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1634
+	.4byte	.LASF1648
 	.byte	0x89
 	.byte	0xd3
-	.4byte	0x6ab6
+	.4byte	0x6b26
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1635
+	.4byte	.LASF1649
 	.byte	0x89
 	.byte	0xd4
-	.4byte	0x6ab6
+	.4byte	0x6b26
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1636
+	.4byte	.LASF1650
 	.byte	0x89
 	.byte	0xd5
 	.4byte	0x9d2
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF1637
+	.4byte	.LASF1651
 	.byte	0x89
 	.byte	0xd6
 	.4byte	0x9d2
 	.byte	0x40
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1638
+	.4byte	.LASF1652
 	.byte	0x48
 	.byte	0x89
 	.byte	0xde
-	.4byte	0x6c07
+	.4byte	0x6c77
 	.uleb128 0xe
-	.4byte	.LASF1639
+	.4byte	.LASF1653
 	.byte	0x89
 	.byte	0xdf
-	.4byte	0x6c49
+	.4byte	0x6cb9
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1640
+	.4byte	.LASF1654
 	.byte	0x89
 	.byte	0xe0
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1641
+	.4byte	.LASF1655
 	.byte	0x89
 	.byte	0xe2
 	.4byte	0x3a7
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1642
+	.4byte	.LASF1656
 	.byte	0x89
 	.byte	0xe3
 	.4byte	0x29
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1643
+	.4byte	.LASF1657
 	.byte	0x89
 	.byte	0xe4
 	.4byte	0x6d
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1644
+	.4byte	.LASF1658
 	.byte	0x89
 	.byte	0xe5
 	.4byte	0x6d
 	.byte	0x2c
 	.uleb128 0xe
-	.4byte	.LASF1645
+	.4byte	.LASF1659
 	.byte	0x89
 	.byte	0xe6
-	.4byte	0x6ab6
+	.4byte	0x6b26
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1646
+	.4byte	.LASF1660
 	.byte	0x89
 	.byte	0xe7
-	.4byte	0x6ab6
+	.4byte	0x6b26
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF1647
+	.4byte	.LASF1661
 	.byte	0x89
 	.byte	0xe8
 	.4byte	0x458
 	.byte	0x40
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1648
+	.4byte	.LASF1662
 	.byte	0x20
 	.byte	0x89
 	.2byte	0x1c4
-	.4byte	0x6c49
+	.4byte	0x6cb9
 	.uleb128 0x1b
-	.4byte	.LASF1649
+	.4byte	.LASF1663
 	.byte	0x89
 	.2byte	0x1c5
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1650
+	.4byte	.LASF1664
 	.byte	0x89
 	.2byte	0x1c6
-	.4byte	0x7253
+	.4byte	0x72c3
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1651
+	.4byte	.LASF1665
 	.byte	0x89
 	.2byte	0x1c7
-	.4byte	0x757b
+	.4byte	0x75eb
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1652
+	.4byte	.LASF1666
 	.byte	0x89
 	.2byte	0x1c8
-	.4byte	0x6c49
+	.4byte	0x6cb9
 	.byte	0x18
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6c07
+	.4byte	0x6c77
 	.uleb128 0x1a
-	.4byte	.LASF1653
+	.4byte	.LASF1667
 	.2byte	0x180
 	.byte	0x89
 	.2byte	0x109
-	.4byte	0x6c78
+	.4byte	0x6ce8
 	.uleb128 0x1b
-	.4byte	.LASF1654
+	.4byte	.LASF1668
 	.byte	0x89
 	.2byte	0x10a
 	.4byte	0x2f51
@@ -23879,74 +23938,74 @@ __exitcall_ebc_exit:
 	.4byte	.LASF59
 	.byte	0x89
 	.2byte	0x10b
-	.4byte	0x6c78
+	.4byte	0x6ce8
 	.byte	0x40
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x696a
-	.4byte	0x6c88
+	.4byte	0x69da
+	.4byte	0x6cf8
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x7
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF1653
+	.4byte	.LASF1667
 	.byte	0x89
 	.2byte	0x10e
-	.4byte	0x6c4f
+	.4byte	0x6cbf
 	.uleb128 0x1d
-	.4byte	.LASF1655
+	.4byte	.LASF1669
 	.byte	0x50
 	.byte	0x89
 	.2byte	0x136
-	.4byte	0x6d24
+	.4byte	0x6d94
 	.uleb128 0x1b
-	.4byte	.LASF1656
+	.4byte	.LASF1670
 	.byte	0x89
 	.2byte	0x137
-	.4byte	0x6d3d
+	.4byte	0x6dad
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1657
+	.4byte	.LASF1671
 	.byte	0x89
 	.2byte	0x138
-	.4byte	0x6d3d
+	.4byte	0x6dad
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1658
+	.4byte	.LASF1672
 	.byte	0x89
 	.2byte	0x139
-	.4byte	0x6d3d
+	.4byte	0x6dad
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1659
+	.4byte	.LASF1673
 	.byte	0x89
 	.2byte	0x13a
-	.4byte	0x6d3d
+	.4byte	0x6dad
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1660
+	.4byte	.LASF1674
 	.byte	0x89
 	.2byte	0x13b
-	.4byte	0x6d52
+	.4byte	0x6dc2
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1661
+	.4byte	.LASF1675
 	.byte	0x89
 	.2byte	0x13c
-	.4byte	0x6d52
+	.4byte	0x6dc2
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1662
+	.4byte	.LASF1676
 	.byte	0x89
 	.2byte	0x13d
-	.4byte	0x6d52
+	.4byte	0x6dc2
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1663
+	.4byte	.LASF1677
 	.byte	0x89
 	.2byte	0x13e
-	.4byte	0x6d72
+	.4byte	0x6de2
 	.byte	0x38
 	.uleb128 0x1b
 	.4byte	.LASF130
@@ -23962,10 +24021,10 @@ __exitcall_ebc_exit:
 	.byte	0x48
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x6c94
+	.4byte	0x6d04
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x6d3d
+	.4byte	0x6dad
 	.uleb128 0x11
 	.4byte	0x20e7
 	.uleb128 0x11
@@ -23973,101 +24032,101 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6d29
+	.4byte	0x6d99
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x6d52
+	.4byte	0x6dc2
 	.uleb128 0x11
-	.4byte	0x69b8
+	.4byte	0x6a28
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6d43
+	.4byte	0x6db3
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x6d6c
+	.4byte	0x6ddc
 	.uleb128 0x11
 	.4byte	0x20e7
 	.uleb128 0x11
-	.4byte	0x6d6c
+	.4byte	0x6ddc
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6aeb
+	.4byte	0x6b5b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6d58
+	.4byte	0x6dc8
 	.uleb128 0x1d
-	.4byte	.LASF1664
+	.4byte	.LASF1678
 	.byte	0x68
 	.byte	0x89
 	.2byte	0x145
-	.4byte	0x6e2f
+	.4byte	0x6e9f
 	.uleb128 0x1b
-	.4byte	.LASF1665
+	.4byte	.LASF1679
 	.byte	0x89
 	.2byte	0x146
-	.4byte	0x6d52
+	.4byte	0x6dc2
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1666
+	.4byte	.LASF1680
 	.byte	0x89
 	.2byte	0x147
-	.4byte	0x6e48
+	.4byte	0x6eb8
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1667
+	.4byte	.LASF1681
 	.byte	0x89
 	.2byte	0x148
-	.4byte	0x6e59
+	.4byte	0x6ec9
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1668
+	.4byte	.LASF1682
 	.byte	0x89
 	.2byte	0x149
-	.4byte	0x6d52
+	.4byte	0x6dc2
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1669
+	.4byte	.LASF1683
 	.byte	0x89
 	.2byte	0x14a
-	.4byte	0x6d52
+	.4byte	0x6dc2
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1670
+	.4byte	.LASF1684
 	.byte	0x89
 	.2byte	0x14b
-	.4byte	0x6d52
+	.4byte	0x6dc2
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1671
+	.4byte	.LASF1685
 	.byte	0x89
 	.2byte	0x14c
-	.4byte	0x6d3d
+	.4byte	0x6dad
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1672
+	.4byte	.LASF1686
 	.byte	0x89
 	.2byte	0x14f
-	.4byte	0x6e74
+	.4byte	0x6ee4
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1673
+	.4byte	.LASF1687
 	.byte	0x89
 	.2byte	0x150
-	.4byte	0x6e94
+	.4byte	0x6f04
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1674
+	.4byte	.LASF1688
 	.byte	0x89
 	.2byte	0x152
-	.4byte	0x6eae
+	.4byte	0x6f1e
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1663
+	.4byte	.LASF1677
 	.byte	0x89
 	.2byte	0x154
-	.4byte	0x6d72
+	.4byte	0x6de2
 	.byte	0x50
 	.uleb128 0x1b
 	.4byte	.LASF130
@@ -24083,10 +24142,10 @@ __exitcall_ebc_exit:
 	.byte	0x60
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x6d78
+	.4byte	0x6de8
 	.uleb128 0x14
-	.4byte	0x69b8
-	.4byte	0x6e48
+	.4byte	0x6a28
+	.4byte	0x6eb8
 	.uleb128 0x11
 	.4byte	0x20e7
 	.uleb128 0x11
@@ -24094,161 +24153,161 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6e34
+	.4byte	0x6ea4
 	.uleb128 0x10
-	.4byte	0x6e59
+	.4byte	0x6ec9
 	.uleb128 0x11
-	.4byte	0x69b8
+	.4byte	0x6a28
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6e4e
+	.4byte	0x6ebe
 	.uleb128 0x14
-	.4byte	0x6e6e
-	.4byte	0x6e6e
+	.4byte	0x6ede
+	.4byte	0x6ede
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6ab6
+	.4byte	0x6b26
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6e5f
+	.4byte	0x6ecf
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x6e8e
+	.4byte	0x6efe
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x6e8e
+	.4byte	0x6efe
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6a88
+	.4byte	0x6af8
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6e7a
+	.4byte	0x6eea
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x6eae
+	.4byte	0x6f1e
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x6e6e
+	.4byte	0x6ede
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6e9a
+	.4byte	0x6f0a
 	.uleb128 0x1d
-	.4byte	.LASF1675
+	.4byte	.LASF1689
 	.byte	0x78
 	.byte	0x89
 	.2byte	0x15d
-	.4byte	0x6f92
+	.4byte	0x7002
 	.uleb128 0x1b
-	.4byte	.LASF1676
+	.4byte	.LASF1690
 	.byte	0x89
 	.2byte	0x15e
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1677
+	.4byte	.LASF1691
 	.byte	0x89
 	.2byte	0x15f
 	.4byte	0x15a
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1678
+	.4byte	.LASF1692
 	.byte	0x89
 	.2byte	0x160
 	.4byte	0x15a
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1679
+	.4byte	.LASF1693
 	.byte	0x89
 	.2byte	0x161
 	.4byte	0x15a
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1680
+	.4byte	.LASF1694
 	.byte	0x89
 	.2byte	0x162
 	.4byte	0x15a
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1681
+	.4byte	.LASF1695
 	.byte	0x89
 	.2byte	0x163
 	.4byte	0x15a
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1682
+	.4byte	.LASF1696
 	.byte	0x89
 	.2byte	0x164
 	.4byte	0x15a
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1683
+	.4byte	.LASF1697
 	.byte	0x89
 	.2byte	0x165
 	.4byte	0x14f
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1684
+	.4byte	.LASF1698
 	.byte	0x89
 	.2byte	0x167
 	.4byte	0x14f
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1685
+	.4byte	.LASF1699
 	.byte	0x89
 	.2byte	0x168
 	.4byte	0xc6
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1686
+	.4byte	.LASF1700
 	.byte	0x89
 	.2byte	0x169
 	.4byte	0xc6
 	.byte	0x4c
 	.uleb128 0x1b
-	.4byte	.LASF1687
+	.4byte	.LASF1701
 	.byte	0x89
 	.2byte	0x16a
 	.4byte	0x15a
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1688
+	.4byte	.LASF1702
 	.byte	0x89
 	.2byte	0x16b
 	.4byte	0x15a
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1689
+	.4byte	.LASF1703
 	.byte	0x89
 	.2byte	0x16c
 	.4byte	0x15a
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1690
+	.4byte	.LASF1704
 	.byte	0x89
 	.2byte	0x16d
 	.4byte	0x14f
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1691
+	.4byte	.LASF1705
 	.byte	0x89
 	.2byte	0x16e
 	.4byte	0xc6
 	.byte	0x70
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1692
+	.4byte	.LASF1706
 	.byte	0x38
 	.byte	0x89
 	.2byte	0x191
-	.4byte	0x7022
+	.4byte	0x7092
 	.uleb128 0x1b
 	.4byte	.LASF171
 	.byte	0x89
@@ -24256,37 +24315,37 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1693
+	.4byte	.LASF1707
 	.byte	0x89
 	.2byte	0x193
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF1694
+	.4byte	.LASF1708
 	.byte	0x89
 	.2byte	0x195
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1695
+	.4byte	.LASF1709
 	.byte	0x89
 	.2byte	0x196
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF1696
+	.4byte	.LASF1710
 	.byte	0x89
 	.2byte	0x197
 	.4byte	0x6d
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1697
+	.4byte	.LASF1711
 	.byte	0x89
 	.2byte	0x198
 	.4byte	0x6d
 	.byte	0x14
 	.uleb128 0x1b
-	.4byte	.LASF1698
+	.4byte	.LASF1712
 	.byte	0x89
 	.2byte	0x199
 	.4byte	0x6d
@@ -24298,52 +24357,52 @@ __exitcall_ebc_exit:
 	.4byte	0xff
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1169
+	.4byte	.LASF1183
 	.byte	0x89
 	.2byte	0x19b
 	.4byte	0x31a
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1699
+	.4byte	.LASF1713
 	.byte	0x89
 	.2byte	0x19c
 	.4byte	0x31a
 	.byte	0x30
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1700
+	.4byte	.LASF1714
 	.byte	0xb0
 	.byte	0x89
 	.2byte	0x19f
-	.4byte	0x704a
+	.4byte	0x70ba
 	.uleb128 0x1b
-	.4byte	.LASF1701
+	.4byte	.LASF1715
 	.byte	0x89
 	.2byte	0x1a0
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1702
+	.4byte	.LASF1716
 	.byte	0x89
 	.2byte	0x1a1
-	.4byte	0x704a
+	.4byte	0x70ba
 	.byte	0x8
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x6f92
-	.4byte	0x705a
+	.4byte	0x7002
+	.4byte	0x70ca
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1703
+	.4byte	.LASF1717
 	.byte	0x20
 	.byte	0x89
 	.2byte	0x1a5
-	.4byte	0x70d0
+	.4byte	0x7140
 	.uleb128 0x1b
-	.4byte	.LASF1704
+	.4byte	.LASF1718
 	.byte	0x89
 	.2byte	0x1a6
 	.4byte	0xc6
@@ -24355,113 +24414,113 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF1705
+	.4byte	.LASF1719
 	.byte	0x89
 	.2byte	0x1a8
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1706
+	.4byte	.LASF1720
 	.byte	0x89
 	.2byte	0x1aa
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF1707
+	.4byte	.LASF1721
 	.byte	0x89
 	.2byte	0x1ab
 	.4byte	0x6d
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1708
+	.4byte	.LASF1722
 	.byte	0x89
 	.2byte	0x1ac
 	.4byte	0x6d
 	.byte	0x14
 	.uleb128 0x1b
-	.4byte	.LASF1709
+	.4byte	.LASF1723
 	.byte	0x89
 	.2byte	0x1ad
 	.4byte	0x6d
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1710
+	.4byte	.LASF1724
 	.byte	0x89
 	.2byte	0x1ae
 	.4byte	0x6d
 	.byte	0x1c
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1711
+	.4byte	.LASF1725
 	.byte	0x68
 	.byte	0x89
 	.2byte	0x1b2
-	.4byte	0x7187
+	.4byte	0x71f7
 	.uleb128 0x1b
-	.4byte	.LASF1712
+	.4byte	.LASF1726
 	.byte	0x89
 	.2byte	0x1b3
-	.4byte	0x71aa
+	.4byte	0x721a
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1713
+	.4byte	.LASF1727
 	.byte	0x89
 	.2byte	0x1b4
-	.4byte	0x6d3d
+	.4byte	0x6dad
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1714
+	.4byte	.LASF1728
 	.byte	0x89
 	.2byte	0x1b5
-	.4byte	0x71c4
+	.4byte	0x7234
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1715
+	.4byte	.LASF1729
 	.byte	0x89
 	.2byte	0x1b6
-	.4byte	0x71c4
+	.4byte	0x7234
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1716
+	.4byte	.LASF1730
 	.byte	0x89
 	.2byte	0x1b7
-	.4byte	0x6d3d
+	.4byte	0x6dad
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1717
+	.4byte	.LASF1731
 	.byte	0x89
 	.2byte	0x1b8
-	.4byte	0x71e9
+	.4byte	0x7259
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1718
+	.4byte	.LASF1732
 	.byte	0x89
 	.2byte	0x1b9
-	.4byte	0x720e
+	.4byte	0x727e
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1719
+	.4byte	.LASF1733
 	.byte	0x89
 	.2byte	0x1ba
-	.4byte	0x722d
+	.4byte	0x729d
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1720
+	.4byte	.LASF1734
 	.byte	0x89
 	.2byte	0x1bc
-	.4byte	0x720e
+	.4byte	0x727e
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1721
+	.4byte	.LASF1735
 	.byte	0x89
 	.2byte	0x1bd
-	.4byte	0x724d
+	.4byte	0x72bd
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1722
+	.4byte	.LASF1736
 	.byte	0x89
 	.2byte	0x1be
-	.4byte	0x71c4
+	.4byte	0x7234
 	.byte	0x50
 	.uleb128 0x1b
 	.4byte	.LASF130
@@ -24477,10 +24536,10 @@ __exitcall_ebc_exit:
 	.byte	0x60
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x70d0
+	.4byte	0x7140
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x71aa
+	.4byte	0x721a
 	.uleb128 0x11
 	.4byte	0x20e7
 	.uleb128 0x11
@@ -24492,10 +24551,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x718c
+	.4byte	0x71fc
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x71c4
+	.4byte	0x7234
 	.uleb128 0x11
 	.4byte	0x20e7
 	.uleb128 0x11
@@ -24503,83 +24562,83 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x71b0
+	.4byte	0x7220
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x71e3
+	.4byte	0x7253
 	.uleb128 0x11
 	.4byte	0x20e7
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0x71e3
+	.4byte	0x7253
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x705a
+	.4byte	0x70ca
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x71ca
+	.4byte	0x723a
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x7208
+	.4byte	0x7278
 	.uleb128 0x11
 	.4byte	0x20e7
 	.uleb128 0x11
-	.4byte	0x6aeb
+	.4byte	0x6b5b
 	.uleb128 0x11
-	.4byte	0x7208
+	.4byte	0x7278
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6eb4
+	.4byte	0x6f24
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x71ef
+	.4byte	0x725f
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x722d
+	.4byte	0x729d
 	.uleb128 0x11
 	.4byte	0x20e7
 	.uleb128 0x11
-	.4byte	0x6d6c
+	.4byte	0x6ddc
 	.uleb128 0x11
-	.4byte	0x7208
+	.4byte	0x7278
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7214
+	.4byte	0x7284
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x7247
+	.4byte	0x72b7
 	.uleb128 0x11
 	.4byte	0x20e7
 	.uleb128 0x11
-	.4byte	0x7247
+	.4byte	0x72b7
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7022
+	.4byte	0x7092
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7233
+	.4byte	0x72a3
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6d24
+	.4byte	0x6d94
 	.uleb128 0x1a
 	.4byte	.LASF163
 	.2byte	0x380
 	.byte	0x8b
 	.2byte	0x14c
-	.4byte	0x757b
+	.4byte	0x75eb
 	.uleb128 0x1b
 	.4byte	.LASF578
 	.byte	0x8b
 	.2byte	0x14d
-	.4byte	0xd3fb
+	.4byte	0xd46b
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF962
+	.4byte	.LASF976
 	.byte	0x8b
 	.2byte	0x150
 	.4byte	0x3a7
@@ -24588,58 +24647,58 @@ __exitcall_ebc_exit:
 	.4byte	.LASF265
 	.byte	0x8b
 	.2byte	0x153
-	.4byte	0xd2a1
+	.4byte	0xd311
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1723
+	.4byte	.LASF1737
 	.byte	0x8b
 	.2byte	0x156
-	.4byte	0xd2b1
+	.4byte	0xd321
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1724
+	.4byte	.LASF1738
 	.byte	0x8b
 	.2byte	0x157
-	.4byte	0xd372
+	.4byte	0xd3e2
 	.byte	0xd0
 	.uleb128 0x1b
-	.4byte	.LASF1725
+	.4byte	.LASF1739
 	.byte	0x8b
 	.2byte	0x158
 	.4byte	0x56
 	.byte	0xd8
 	.uleb128 0x1b
-	.4byte	.LASF1726
+	.4byte	.LASF1740
 	.byte	0x8b
 	.2byte	0x159
 	.4byte	0x56
 	.byte	0xe0
 	.uleb128 0x1b
-	.4byte	.LASF1727
+	.4byte	.LASF1741
 	.byte	0x8b
 	.2byte	0x15a
-	.4byte	0x91ee
+	.4byte	0x925e
 	.byte	0xe8
 	.uleb128 0x1b
-	.4byte	.LASF1728
+	.4byte	.LASF1742
 	.byte	0x8b
 	.2byte	0x15d
-	.4byte	0xd4e4
+	.4byte	0xd554
 	.byte	0xf0
 	.uleb128 0x1b
-	.4byte	.LASF1729
+	.4byte	.LASF1743
 	.byte	0x8b
 	.2byte	0x15e
-	.4byte	0xd4ea
+	.4byte	0xd55a
 	.byte	0xf8
 	.uleb128 0x1c
-	.4byte	.LASF1730
+	.4byte	.LASF1744
 	.byte	0x8b
 	.2byte	0x15f
 	.4byte	0x6d
 	.2byte	0x100
 	.uleb128 0x1c
-	.4byte	.LASF1731
+	.4byte	.LASF1745
 	.byte	0x8b
 	.2byte	0x167
 	.4byte	0x246a
@@ -24648,244 +24707,244 @@ __exitcall_ebc_exit:
 	.string	"kp"
 	.byte	0x8b
 	.2byte	0x169
-	.4byte	0xd4f0
+	.4byte	0xd560
 	.2byte	0x128
 	.uleb128 0x1c
-	.4byte	.LASF1732
+	.4byte	.LASF1746
 	.byte	0x8b
 	.2byte	0x16a
 	.4byte	0x6d
 	.2byte	0x130
 	.uleb128 0x1c
-	.4byte	.LASF1733
+	.4byte	.LASF1747
 	.byte	0x8b
 	.2byte	0x16d
 	.4byte	0x6d
 	.2byte	0x134
 	.uleb128 0x1c
-	.4byte	.LASF1734
+	.4byte	.LASF1748
 	.byte	0x8b
 	.2byte	0x16e
-	.4byte	0xd4e4
+	.4byte	0xd554
 	.2byte	0x138
 	.uleb128 0x1c
-	.4byte	.LASF1735
+	.4byte	.LASF1749
 	.byte	0x8b
 	.2byte	0x16f
-	.4byte	0xd4ea
+	.4byte	0xd55a
 	.2byte	0x140
 	.uleb128 0x1c
-	.4byte	.LASF1736
+	.4byte	.LASF1750
 	.byte	0x8b
 	.2byte	0x182
 	.4byte	0x2b0
 	.2byte	0x148
 	.uleb128 0x1c
-	.4byte	.LASF1737
+	.4byte	.LASF1751
 	.byte	0x8b
 	.2byte	0x184
 	.4byte	0x2b0
 	.2byte	0x149
 	.uleb128 0x1c
-	.4byte	.LASF1738
+	.4byte	.LASF1752
 	.byte	0x8b
 	.2byte	0x187
-	.4byte	0xd4e4
+	.4byte	0xd554
 	.2byte	0x150
 	.uleb128 0x1c
-	.4byte	.LASF1739
+	.4byte	.LASF1753
 	.byte	0x8b
 	.2byte	0x188
-	.4byte	0xd4ea
+	.4byte	0xd55a
 	.2byte	0x158
 	.uleb128 0x1c
-	.4byte	.LASF1740
+	.4byte	.LASF1754
 	.byte	0x8b
 	.2byte	0x189
 	.4byte	0x6d
 	.2byte	0x160
 	.uleb128 0x1c
-	.4byte	.LASF1741
+	.4byte	.LASF1755
 	.byte	0x8b
 	.2byte	0x18c
 	.4byte	0x6d
 	.2byte	0x164
 	.uleb128 0x1c
-	.4byte	.LASF1742
+	.4byte	.LASF1756
 	.byte	0x8b
 	.2byte	0x18d
-	.4byte	0xd51b
+	.4byte	0xd58b
 	.2byte	0x168
 	.uleb128 0x1c
-	.4byte	.LASF1743
+	.4byte	.LASF1757
 	.byte	0x8b
 	.2byte	0x190
 	.4byte	0x4a1
 	.2byte	0x170
 	.uleb128 0x1c
-	.4byte	.LASF1744
+	.4byte	.LASF1758
 	.byte	0x8b
 	.2byte	0x193
-	.4byte	0xd44d
+	.4byte	0xd4bd
 	.2byte	0x180
 	.uleb128 0x1c
-	.4byte	.LASF1745
+	.4byte	.LASF1759
 	.byte	0x8b
 	.2byte	0x194
-	.4byte	0xd44d
+	.4byte	0xd4bd
 	.2byte	0x1d0
 	.uleb128 0x1c
-	.4byte	.LASF1746
+	.4byte	.LASF1760
 	.byte	0x8b
 	.2byte	0x197
-	.4byte	0xd223
+	.4byte	0xd293
 	.2byte	0x220
 	.uleb128 0x1c
-	.4byte	.LASF1747
+	.4byte	.LASF1761
 	.byte	0x8b
 	.2byte	0x199
 	.4byte	0x29
 	.2byte	0x248
 	.uleb128 0x1c
-	.4byte	.LASF1748
+	.4byte	.LASF1762
 	.byte	0x8b
 	.2byte	0x19d
 	.4byte	0x6d
 	.2byte	0x250
 	.uleb128 0x1c
-	.4byte	.LASF1749
+	.4byte	.LASF1763
 	.byte	0x8b
 	.2byte	0x19e
 	.4byte	0x3a7
 	.2byte	0x258
 	.uleb128 0x1c
-	.4byte	.LASF1750
+	.4byte	.LASF1764
 	.byte	0x8b
 	.2byte	0x19f
-	.4byte	0xd521
+	.4byte	0xd591
 	.2byte	0x268
 	.uleb128 0x1c
-	.4byte	.LASF1751
+	.4byte	.LASF1765
 	.byte	0x8b
 	.2byte	0x1a4
-	.4byte	0xd527
+	.4byte	0xd597
 	.2byte	0x270
 	.uleb128 0x1c
-	.4byte	.LASF1752
+	.4byte	.LASF1766
 	.byte	0x8b
 	.2byte	0x1a5
-	.4byte	0xd4a9
+	.4byte	0xd519
 	.2byte	0x278
 	.uleb128 0x1c
-	.4byte	.LASF1753
+	.4byte	.LASF1767
 	.byte	0x8b
 	.2byte	0x1a8
-	.4byte	0xd532
+	.4byte	0xd5a2
 	.2byte	0x290
 	.uleb128 0x1c
-	.4byte	.LASF1754
+	.4byte	.LASF1768
 	.byte	0x8b
 	.2byte	0x1ab
-	.4byte	0xd53d
+	.4byte	0xd5ad
 	.2byte	0x298
 	.uleb128 0x1c
-	.4byte	.LASF1755
+	.4byte	.LASF1769
 	.byte	0x8b
 	.2byte	0x1b0
 	.4byte	0x21e
 	.2byte	0x2a0
 	.uleb128 0x1c
-	.4byte	.LASF1756
+	.4byte	.LASF1770
 	.byte	0x8b
 	.2byte	0x1b4
 	.4byte	0x458
 	.2byte	0x2a8
 	.uleb128 0x1c
-	.4byte	.LASF1757
+	.4byte	.LASF1771
 	.byte	0x8b
 	.2byte	0x1b5
 	.4byte	0x6d
 	.2byte	0x2b0
 	.uleb128 0x1c
-	.4byte	.LASF1758
+	.4byte	.LASF1772
 	.byte	0x8b
 	.2byte	0x1b9
 	.4byte	0x6d
 	.2byte	0x2b4
 	.uleb128 0x1c
-	.4byte	.LASF1759
+	.4byte	.LASF1773
 	.byte	0x8b
 	.2byte	0x1ba
-	.4byte	0xd543
+	.4byte	0xd5b3
 	.2byte	0x2b8
 	.uleb128 0x1c
-	.4byte	.LASF1760
+	.4byte	.LASF1774
 	.byte	0x8b
 	.2byte	0x1bd
 	.4byte	0xef6
 	.2byte	0x2c0
 	.uleb128 0x1c
-	.4byte	.LASF1761
+	.4byte	.LASF1775
 	.byte	0x8b
 	.2byte	0x1be
 	.4byte	0x6d
 	.2byte	0x2c8
 	.uleb128 0x1c
-	.4byte	.LASF1762
+	.4byte	.LASF1776
 	.byte	0x8b
 	.2byte	0x1c1
 	.4byte	0x6d
 	.2byte	0x2cc
 	.uleb128 0x1c
-	.4byte	.LASF1763
+	.4byte	.LASF1777
 	.byte	0x8b
 	.2byte	0x1c2
-	.4byte	0xbb97
+	.4byte	0xbc07
 	.2byte	0x2d0
 	.uleb128 0x1c
-	.4byte	.LASF1764
+	.4byte	.LASF1778
 	.byte	0x8b
 	.2byte	0x1c5
-	.4byte	0xd54e
+	.4byte	0xd5be
 	.2byte	0x2d8
 	.uleb128 0x1c
-	.4byte	.LASF1765
+	.4byte	.LASF1779
 	.byte	0x8b
 	.2byte	0x1c6
 	.4byte	0x6d
 	.2byte	0x2e0
 	.uleb128 0x1c
-	.4byte	.LASF1766
+	.4byte	.LASF1780
 	.byte	0x8b
 	.2byte	0x1c7
-	.4byte	0xd55f
+	.4byte	0xd5cf
 	.2byte	0x2e8
 	.uleb128 0x1c
-	.4byte	.LASF1767
+	.4byte	.LASF1781
 	.byte	0x8b
 	.2byte	0x1c8
 	.4byte	0x6d
 	.2byte	0x2f0
 	.uleb128 0x1c
-	.4byte	.LASF1768
+	.4byte	.LASF1782
 	.byte	0x8b
 	.2byte	0x1d9
 	.4byte	0x3a7
 	.2byte	0x2f8
 	.uleb128 0x1c
-	.4byte	.LASF1769
+	.4byte	.LASF1783
 	.byte	0x8b
 	.2byte	0x1db
 	.4byte	0x3a7
 	.2byte	0x308
 	.uleb128 0x1c
-	.4byte	.LASF1770
+	.4byte	.LASF1784
 	.byte	0x8b
 	.2byte	0x1de
 	.4byte	0x4b7
 	.2byte	0x318
 	.uleb128 0x1c
-	.4byte	.LASF1771
+	.4byte	.LASF1785
 	.byte	0x8b
 	.2byte	0x1e0
 	.4byte	0x37c
@@ -24917,13 +24976,13 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7259
+	.4byte	0x72c9
 	.uleb128 0x1a
-	.4byte	.LASF1772
+	.4byte	.LASF1786
 	.2byte	0x140
 	.byte	0x89
 	.2byte	0x20f
-	.4byte	0x75d2
+	.4byte	0x7642
 	.uleb128 0x1b
 	.4byte	.LASF171
 	.byte	0x89
@@ -24931,81 +24990,81 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1773
+	.4byte	.LASF1787
 	.byte	0x89
 	.2byte	0x211
-	.4byte	0x4e36
+	.4byte	0x4ea6
 	.byte	0x8
 	.uleb128 0x1b
 	.4byte	.LASF674
 	.byte	0x89
 	.2byte	0x212
-	.4byte	0x75d2
+	.4byte	0x7642
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1774
+	.4byte	.LASF1788
 	.byte	0x89
 	.2byte	0x213
-	.4byte	0x75e2
+	.4byte	0x7652
 	.byte	0x50
 	.uleb128 0x30
 	.string	"ops"
 	.byte	0x89
 	.2byte	0x214
-	.4byte	0x75f2
+	.4byte	0x7662
 	.2byte	0x128
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x1c7f
-	.4byte	0x75e2
+	.4byte	0x7652
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x6b8e
-	.4byte	0x75f2
+	.4byte	0x6bfe
+	.4byte	0x7662
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x7253
-	.4byte	0x7602
+	.4byte	0x72c3
+	.4byte	0x7672
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x1e
-	.4byte	.LASF1775
+	.4byte	.LASF1789
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x1f
 	.2byte	0x125
-	.4byte	0x7638
+	.4byte	0x76a8
 	.uleb128 0xc
-	.4byte	.LASF1776
+	.4byte	.LASF1790
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1777
+	.4byte	.LASF1791
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1778
+	.4byte	.LASF1792
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF1779
+	.4byte	.LASF1793
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF1780
+	.4byte	.LASF1794
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF1781
+	.4byte	.LASF1795
 	.byte	0x5
 	.byte	0
 	.uleb128 0x10
-	.4byte	0x764d
+	.4byte	0x76bd
 	.uleb128 0x11
-	.4byte	0x5f2f
+	.4byte	0x5f9f
 	.uleb128 0x11
 	.4byte	0x199
 	.uleb128 0x11
@@ -25013,138 +25072,138 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7638
+	.4byte	0x76a8
 	.uleb128 0x1d
-	.4byte	.LASF1782
+	.4byte	.LASF1796
 	.byte	0xc8
 	.byte	0x1f
 	.2byte	0x162
-	.4byte	0x77a6
+	.4byte	0x7816
 	.uleb128 0x1b
-	.4byte	.LASF1783
+	.4byte	.LASF1797
 	.byte	0x1f
 	.2byte	0x163
-	.4byte	0x77ca
+	.4byte	0x783a
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1784
+	.4byte	.LASF1798
 	.byte	0x1f
 	.2byte	0x164
-	.4byte	0x77e4
+	.4byte	0x7854
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1785
+	.4byte	.LASF1799
 	.byte	0x1f
 	.2byte	0x167
-	.4byte	0x77fe
+	.4byte	0x786e
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1786
+	.4byte	.LASF1800
 	.byte	0x1f
 	.2byte	0x16a
-	.4byte	0x7813
+	.4byte	0x7883
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1787
+	.4byte	.LASF1801
 	.byte	0x1f
 	.2byte	0x170
-	.4byte	0x7837
+	.4byte	0x78a7
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1788
+	.4byte	.LASF1802
 	.byte	0x1f
 	.2byte	0x173
-	.4byte	0x7870
+	.4byte	0x78e0
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1789
+	.4byte	.LASF1803
 	.byte	0x1f
 	.2byte	0x176
-	.4byte	0x78a3
+	.4byte	0x7913
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1790
+	.4byte	.LASF1804
 	.byte	0x1f
 	.2byte	0x17b
-	.4byte	0x78bd
+	.4byte	0x792d
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1791
+	.4byte	.LASF1805
 	.byte	0x1f
 	.2byte	0x17c
-	.4byte	0x78d8
+	.4byte	0x7948
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1792
+	.4byte	.LASF1806
 	.byte	0x1f
 	.2byte	0x17d
-	.4byte	0x78f2
+	.4byte	0x7962
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1793
+	.4byte	.LASF1807
 	.byte	0x1f
 	.2byte	0x17e
-	.4byte	0x7903
+	.4byte	0x7973
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1794
+	.4byte	.LASF1808
 	.byte	0x1f
 	.2byte	0x17f
-	.4byte	0x7928
+	.4byte	0x7998
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1795
+	.4byte	.LASF1809
 	.byte	0x1f
 	.2byte	0x184
-	.4byte	0x794c
+	.4byte	0x79bc
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1796
+	.4byte	.LASF1810
 	.byte	0x1f
 	.2byte	0x186
-	.4byte	0x7966
+	.4byte	0x79d6
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1797
+	.4byte	.LASF1811
 	.byte	0x1f
 	.2byte	0x187
-	.4byte	0x7903
+	.4byte	0x7973
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1798
+	.4byte	.LASF1812
 	.byte	0x1f
 	.2byte	0x188
-	.4byte	0x7813
+	.4byte	0x7883
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1799
+	.4byte	.LASF1813
 	.byte	0x1f
 	.2byte	0x189
-	.4byte	0x7985
+	.4byte	0x79f5
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1800
+	.4byte	.LASF1814
 	.byte	0x1f
 	.2byte	0x18b
-	.4byte	0x79a6
+	.4byte	0x7a16
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF1801
+	.4byte	.LASF1815
 	.byte	0x1f
 	.2byte	0x18c
-	.4byte	0x79c0
+	.4byte	0x7a30
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1802
+	.4byte	.LASF1816
 	.byte	0x1f
 	.2byte	0x18f
-	.4byte	0x79f0
+	.4byte	0x7a60
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF1803
+	.4byte	.LASF1817
 	.byte	0x1f
 	.2byte	0x191
-	.4byte	0x7a01
+	.4byte	0x7a71
 	.byte	0xa0
 	.uleb128 0x1b
 	.4byte	.LASF130
@@ -25172,61 +25231,61 @@ __exitcall_ebc_exit:
 	.byte	0xc0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x7653
+	.4byte	0x76c3
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x77bf
+	.4byte	0x782f
 	.uleb128 0x11
-	.4byte	0x3469
+	.4byte	0x34d9
 	.uleb128 0x11
-	.4byte	0x77bf
+	.4byte	0x782f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x77c5
+	.4byte	0x7835
 	.uleb128 0x24
-	.4byte	.LASF1804
+	.4byte	.LASF1818
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x77ab
+	.4byte	0x781b
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x77e4
+	.4byte	0x7854
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
-	.4byte	0x3469
+	.4byte	0x34d9
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x77d0
+	.4byte	0x7840
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x77fe
+	.4byte	0x786e
 	.uleb128 0x11
-	.4byte	0x5176
+	.4byte	0x51e6
 	.uleb128 0x11
-	.4byte	0x77bf
+	.4byte	0x782f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x77ea
+	.4byte	0x785a
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x7813
+	.4byte	0x7883
 	.uleb128 0x11
-	.4byte	0x3469
+	.4byte	0x34d9
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7804
+	.4byte	0x7874
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x7837
+	.4byte	0x78a7
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
-	.4byte	0x5176
+	.4byte	0x51e6
 	.uleb128 0x11
 	.4byte	0x3cc
 	.uleb128 0x11
@@ -25234,14 +25293,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7819
+	.4byte	0x7889
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x786a
+	.4byte	0x78da
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
-	.4byte	0x5176
+	.4byte	0x51e6
 	.uleb128 0x11
 	.4byte	0x2d8
 	.uleb128 0x11
@@ -25249,23 +25308,23 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
-	.4byte	0x5a57
+	.4byte	0x5ac7
 	.uleb128 0x11
-	.4byte	0x786a
+	.4byte	0x78da
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x458
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x783d
+	.4byte	0x78ad
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x78a3
+	.4byte	0x7913
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
-	.4byte	0x5176
+	.4byte	0x51e6
 	.uleb128 0x11
 	.4byte	0x2d8
 	.uleb128 0x11
@@ -25273,28 +25332,28 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
-	.4byte	0x3469
+	.4byte	0x34d9
 	.uleb128 0x11
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7876
+	.4byte	0x78e6
 	.uleb128 0x14
 	.4byte	0x30f
-	.4byte	0x78bd
+	.4byte	0x792d
 	.uleb128 0x11
-	.4byte	0x5176
+	.4byte	0x51e6
 	.uleb128 0x11
 	.4byte	0x30f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x78a9
+	.4byte	0x7919
 	.uleb128 0x10
-	.4byte	0x78d8
+	.4byte	0x7948
 	.uleb128 0x11
-	.4byte	0x3469
+	.4byte	0x34d9
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
@@ -25302,73 +25361,73 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x78c3
+	.4byte	0x7933
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x78f2
+	.4byte	0x7962
 	.uleb128 0x11
-	.4byte	0x3469
+	.4byte	0x34d9
 	.uleb128 0x11
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x78de
+	.4byte	0x794e
 	.uleb128 0x10
-	.4byte	0x7903
+	.4byte	0x7973
 	.uleb128 0x11
-	.4byte	0x3469
+	.4byte	0x34d9
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x78f8
+	.4byte	0x7968
 	.uleb128 0x14
 	.4byte	0x2ee
-	.4byte	0x791d
+	.4byte	0x798d
 	.uleb128 0x11
-	.4byte	0x5f2f
+	.4byte	0x5f9f
 	.uleb128 0x11
-	.4byte	0x791d
+	.4byte	0x798d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7923
+	.4byte	0x7993
 	.uleb128 0x24
-	.4byte	.LASF1805
+	.4byte	.LASF1819
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7909
+	.4byte	0x7979
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x794c
+	.4byte	0x79bc
 	.uleb128 0x11
-	.4byte	0x5176
+	.4byte	0x51e6
 	.uleb128 0x11
-	.4byte	0x3469
+	.4byte	0x34d9
 	.uleb128 0x11
-	.4byte	0x3469
+	.4byte	0x34d9
 	.uleb128 0x11
-	.4byte	0x5c07
+	.4byte	0x5c77
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x792e
+	.4byte	0x799e
 	.uleb128 0x14
 	.4byte	0x2b0
-	.4byte	0x7966
+	.4byte	0x79d6
 	.uleb128 0x11
-	.4byte	0x3469
+	.4byte	0x34d9
 	.uleb128 0x11
-	.4byte	0x63db
+	.4byte	0x644b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7952
+	.4byte	0x79c2
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x7985
+	.4byte	0x79f5
 	.uleb128 0x11
-	.4byte	0x3469
+	.4byte	0x34d9
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
@@ -25376,210 +25435,210 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x796c
+	.4byte	0x79dc
 	.uleb128 0x10
-	.4byte	0x79a0
+	.4byte	0x7a10
 	.uleb128 0x11
-	.4byte	0x3469
+	.4byte	0x34d9
 	.uleb128 0x11
-	.4byte	0x79a0
+	.4byte	0x7a10
 	.uleb128 0x11
-	.4byte	0x79a0
+	.4byte	0x7a10
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x2b0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x798b
+	.4byte	0x79fb
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x79c0
+	.4byte	0x7a30
 	.uleb128 0x11
-	.4byte	0x5176
+	.4byte	0x51e6
 	.uleb128 0x11
-	.4byte	0x3469
+	.4byte	0x34d9
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x79ac
+	.4byte	0x7a1c
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x79df
+	.4byte	0x7a4f
 	.uleb128 0x11
-	.4byte	0x79df
+	.4byte	0x7a4f
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
-	.4byte	0x79ea
+	.4byte	0x7a5a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x79e5
+	.4byte	0x7a55
 	.uleb128 0x24
-	.4byte	.LASF1806
+	.4byte	.LASF1820
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x30f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x79c6
+	.4byte	0x7a36
 	.uleb128 0x10
-	.4byte	0x7a01
+	.4byte	0x7a71
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x79f6
+	.4byte	0x7a66
 	.uleb128 0x15
-	.4byte	.LASF1807
+	.4byte	.LASF1821
 	.byte	0x1f
 	.2byte	0x199
-	.4byte	0x77a6
+	.4byte	0x7816
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x77a6
+	.4byte	0x7816
 	.uleb128 0x1d
-	.4byte	.LASF1808
+	.4byte	.LASF1822
 	.byte	0xf8
 	.byte	0x1f
 	.2byte	0x1c6
-	.4byte	0x7b86
+	.4byte	0x7bf6
 	.uleb128 0x1b
-	.4byte	.LASF1809
+	.4byte	.LASF1823
 	.byte	0x1f
 	.2byte	0x1c7
 	.4byte	0x284
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1810
+	.4byte	.LASF1824
 	.byte	0x1f
 	.2byte	0x1c8
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF1811
+	.4byte	.LASF1825
 	.byte	0x1f
 	.2byte	0x1c9
 	.4byte	0x1c7f
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1812
+	.4byte	.LASF1826
 	.byte	0x1f
 	.2byte	0x1ca
 	.4byte	0x20e7
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1813
+	.4byte	.LASF1827
 	.byte	0x1f
 	.2byte	0x1cb
 	.4byte	0x246a
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1814
+	.4byte	.LASF1828
 	.byte	0x1f
 	.2byte	0x1cc
 	.4byte	0x458
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1815
+	.4byte	.LASF1829
 	.byte	0x1f
 	.2byte	0x1cd
 	.4byte	0x458
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1816
+	.4byte	.LASF1830
 	.byte	0x1f
 	.2byte	0x1ce
 	.4byte	0xc6
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1817
+	.4byte	.LASF1831
 	.byte	0x1f
 	.2byte	0x1cf
 	.4byte	0x2b0
 	.byte	0x4c
 	.uleb128 0x1b
-	.4byte	.LASF1818
+	.4byte	.LASF1832
 	.byte	0x1f
 	.2byte	0x1d1
 	.4byte	0x3a7
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1819
+	.4byte	.LASF1833
 	.byte	0x1f
 	.2byte	0x1d3
-	.4byte	0x7b86
+	.4byte	0x7bf6
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1820
+	.4byte	.LASF1834
 	.byte	0x1f
 	.2byte	0x1d4
 	.4byte	0x6d
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1821
+	.4byte	.LASF1835
 	.byte	0x1f
 	.2byte	0x1d5
 	.4byte	0x110
 	.byte	0x6c
 	.uleb128 0x1b
-	.4byte	.LASF1822
+	.4byte	.LASF1836
 	.byte	0x1f
 	.2byte	0x1d6
-	.4byte	0x7b91
+	.4byte	0x7c01
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1823
+	.4byte	.LASF1837
 	.byte	0x1f
 	.2byte	0x1d8
 	.4byte	0x6d
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1824
+	.4byte	.LASF1838
 	.byte	0x1f
 	.2byte	0x1d9
 	.4byte	0xc6
 	.byte	0x7c
 	.uleb128 0x1b
-	.4byte	.LASF1825
+	.4byte	.LASF1839
 	.byte	0x1f
 	.2byte	0x1da
-	.4byte	0x7b9c
+	.4byte	0x7c0c
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1826
+	.4byte	.LASF1840
 	.byte	0x1f
 	.2byte	0x1db
-	.4byte	0x497c
+	.4byte	0x49ec
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF1827
+	.4byte	.LASF1841
 	.byte	0x1f
 	.2byte	0x1dc
-	.4byte	0x4866
+	.4byte	0x48d6
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1828
+	.4byte	.LASF1842
 	.byte	0x1f
 	.2byte	0x1dd
 	.4byte	0x3a7
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF1829
+	.4byte	.LASF1843
 	.byte	0x1f
 	.2byte	0x1e4
 	.4byte	0x29
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF1830
+	.4byte	.LASF1844
 	.byte	0x1f
 	.2byte	0x1e7
 	.4byte	0xc6
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF1831
+	.4byte	.LASF1845
 	.byte	0x1f
 	.2byte	0x1e9
 	.4byte	0x246a
@@ -25611,233 +25670,233 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7a19
+	.4byte	0x7a89
 	.uleb128 0x24
-	.4byte	.LASF1832
+	.4byte	.LASF1846
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7b8c
+	.4byte	0x7bfc
 	.uleb128 0x24
-	.4byte	.LASF1833
+	.4byte	.LASF1847
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7b97
-	.uleb128 0x3f
+	.4byte	0x7c07
+	.uleb128 0x41
 	.byte	0x4
 	.byte	0x1f
 	.2byte	0x280
-	.4byte	0x7bc4
-	.uleb128 0x41
-	.4byte	.LASF1834
+	.4byte	0x7c34
+	.uleb128 0x43
+	.4byte	.LASF1848
 	.byte	0x1f
 	.2byte	0x281
 	.4byte	0x74
-	.uleb128 0x41
-	.4byte	.LASF1835
+	.uleb128 0x43
+	.4byte	.LASF1849
 	.byte	0x1f
 	.2byte	0x282
 	.4byte	0x6d
 	.byte	0
-	.uleb128 0x3f
+	.uleb128 0x41
 	.byte	0x10
 	.byte	0x1f
 	.2byte	0x2a7
-	.4byte	0x7be6
-	.uleb128 0x41
-	.4byte	.LASF1836
+	.4byte	0x7c56
+	.uleb128 0x43
+	.4byte	.LASF1850
 	.byte	0x1f
 	.2byte	0x2a8
 	.4byte	0x3d2
-	.uleb128 0x41
-	.4byte	.LASF1837
+	.uleb128 0x43
+	.4byte	.LASF1851
 	.byte	0x1f
 	.2byte	0x2a9
 	.4byte	0x41c
 	.byte	0
-	.uleb128 0x3f
+	.uleb128 0x41
 	.byte	0x8
 	.byte	0x1f
 	.2byte	0x2b7
-	.4byte	0x7c2c
-	.uleb128 0x41
-	.4byte	.LASF1838
+	.4byte	0x7c9c
+	.uleb128 0x43
+	.4byte	.LASF1852
 	.byte	0x1f
 	.2byte	0x2b8
-	.4byte	0x495b
-	.uleb128 0x41
-	.4byte	.LASF1839
+	.4byte	0x49cb
+	.uleb128 0x43
+	.4byte	.LASF1853
 	.byte	0x1f
 	.2byte	0x2b9
-	.4byte	0x7b86
-	.uleb128 0x41
-	.4byte	.LASF1840
+	.4byte	0x7bf6
+	.uleb128 0x43
+	.4byte	.LASF1854
 	.byte	0x1f
 	.2byte	0x2ba
-	.4byte	0x7c31
-	.uleb128 0x41
-	.4byte	.LASF1841
+	.4byte	0x7ca1
+	.uleb128 0x43
+	.4byte	.LASF1855
 	.byte	0x1f
 	.2byte	0x2bb
 	.4byte	0x21e
-	.uleb128 0x41
-	.4byte	.LASF1842
+	.uleb128 0x43
+	.4byte	.LASF1856
 	.byte	0x1f
 	.2byte	0x2bc
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1843
+	.4byte	.LASF1857
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7c2c
+	.4byte	0x7c9c
 	.uleb128 0x24
-	.4byte	.LASF1844
+	.4byte	.LASF1858
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7c37
+	.4byte	0x7ca7
 	.uleb128 0x1a
-	.4byte	.LASF1845
+	.4byte	.LASF1859
 	.2byte	0x100
 	.byte	0x1f
 	.2byte	0x73c
-	.4byte	0x7db0
+	.4byte	0x7e20
 	.uleb128 0x1b
-	.4byte	.LASF1846
+	.4byte	.LASF1860
 	.byte	0x1f
 	.2byte	0x73d
-	.4byte	0x8bf7
+	.4byte	0x8c67
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1847
+	.4byte	.LASF1861
 	.byte	0x1f
 	.2byte	0x73e
-	.4byte	0x8c1c
+	.4byte	0x8c8c
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1848
+	.4byte	.LASF1862
 	.byte	0x1f
 	.2byte	0x73f
-	.4byte	0x8c36
+	.4byte	0x8ca6
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1849
+	.4byte	.LASF1863
 	.byte	0x1f
 	.2byte	0x740
-	.4byte	0x8c55
+	.4byte	0x8cc5
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1850
+	.4byte	.LASF1864
 	.byte	0x1f
 	.2byte	0x741
-	.4byte	0x8c6f
+	.4byte	0x8cdf
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1851
+	.4byte	.LASF1865
 	.byte	0x1f
 	.2byte	0x743
-	.4byte	0x8c8e
+	.4byte	0x8cfe
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1852
+	.4byte	.LASF1866
 	.byte	0x1f
 	.2byte	0x745
-	.4byte	0x8cb2
+	.4byte	0x8d22
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1853
+	.4byte	.LASF1867
 	.byte	0x1f
 	.2byte	0x746
-	.4byte	0x8cd1
+	.4byte	0x8d41
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1854
+	.4byte	.LASF1868
 	.byte	0x1f
 	.2byte	0x747
-	.4byte	0x8ceb
+	.4byte	0x8d5b
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1855
+	.4byte	.LASF1869
 	.byte	0x1f
 	.2byte	0x748
-	.4byte	0x8d0a
+	.4byte	0x8d7a
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1856
+	.4byte	.LASF1870
 	.byte	0x1f
 	.2byte	0x749
-	.4byte	0x8d29
+	.4byte	0x8d99
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1857
+	.4byte	.LASF1871
 	.byte	0x1f
 	.2byte	0x74a
-	.4byte	0x8ceb
+	.4byte	0x8d5b
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1858
+	.4byte	.LASF1872
 	.byte	0x1f
 	.2byte	0x74b
-	.4byte	0x8d4d
+	.4byte	0x8dbd
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1859
+	.4byte	.LASF1873
 	.byte	0x1f
 	.2byte	0x74c
-	.4byte	0x8d76
+	.4byte	0x8de6
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1860
+	.4byte	.LASF1874
 	.byte	0x1f
 	.2byte	0x74e
-	.4byte	0x8d96
+	.4byte	0x8e06
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1861
+	.4byte	.LASF1875
 	.byte	0x1f
 	.2byte	0x74f
-	.4byte	0x8db5
+	.4byte	0x8e25
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1862
+	.4byte	.LASF1876
 	.byte	0x1f
 	.2byte	0x750
-	.4byte	0x8ddf
+	.4byte	0x8e4f
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1863
+	.4byte	.LASF1877
 	.byte	0x1f
 	.2byte	0x751
-	.4byte	0x8dfe
+	.4byte	0x8e6e
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF1864
+	.4byte	.LASF1878
 	.byte	0x1f
 	.2byte	0x752
-	.4byte	0x8e28
+	.4byte	0x8e98
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1865
+	.4byte	.LASF1879
 	.byte	0x1f
 	.2byte	0x754
-	.4byte	0x8e4d
+	.4byte	0x8ebd
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF1866
+	.4byte	.LASF1880
 	.byte	0x1f
 	.2byte	0x755
-	.4byte	0x8e76
+	.4byte	0x8ee6
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF1867
+	.4byte	.LASF1881
 	.byte	0x1f
 	.2byte	0x758
-	.4byte	0x8d29
+	.4byte	0x8d99
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF1868
+	.4byte	.LASF1882
 	.byte	0x1f
 	.2byte	0x759
-	.4byte	0x8e95
+	.4byte	0x8f05
 	.byte	0xb0
 	.uleb128 0x1b
 	.4byte	.LASF130
@@ -25865,44 +25924,44 @@ __exitcall_ebc_exit:
 	.byte	0xd0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x7c42
+	.4byte	0x7cb2
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7db0
+	.4byte	0x7e20
 	.uleb128 0x24
-	.4byte	.LASF1869
+	.4byte	.LASF1883
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7dbb
+	.4byte	0x7e2b
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x7c9
 	.uleb128 0x1d
-	.4byte	.LASF1870
+	.4byte	.LASF1884
 	.byte	0x38
 	.byte	0x1f
 	.2byte	0x450
-	.4byte	0x7e0e
+	.4byte	0x7e7e
 	.uleb128 0x1b
-	.4byte	.LASF1871
+	.4byte	.LASF1885
 	.byte	0x1f
 	.2byte	0x451
 	.4byte	0xe65
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1872
+	.4byte	.LASF1886
 	.byte	0x1f
 	.2byte	0x452
 	.4byte	0x3a7
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1873
+	.4byte	.LASF1887
 	.byte	0x1f
 	.2byte	0x453
 	.4byte	0x3a7
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1874
+	.4byte	.LASF1888
 	.byte	0x1f
 	.2byte	0x454
 	.4byte	0x3a7
@@ -25910,28 +25969,28 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7dcc
+	.4byte	0x7e3c
 	.uleb128 0x24
-	.4byte	.LASF1875
+	.4byte	.LASF1889
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7e14
+	.4byte	0x7e84
 	.uleb128 0x24
-	.4byte	.LASF1876
+	.4byte	.LASF1890
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7e1f
+	.4byte	0x7e8f
 	.uleb128 0x24
-	.4byte	.LASF1877
+	.4byte	.LASF1891
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7e2a
+	.4byte	0x7e9a
 	.uleb128 0x1d
-	.4byte	.LASF1878
+	.4byte	.LASF1892
 	.byte	0x20
 	.byte	0x1f
 	.2byte	0x376
-	.4byte	0x7e91
+	.4byte	0x7f01
 	.uleb128 0x1b
 	.4byte	.LASF116
 	.byte	0x1f
@@ -25942,7 +26001,7 @@ __exitcall_ebc_exit:
 	.string	"pid"
 	.byte	0x1f
 	.2byte	0x378
-	.4byte	0x463d
+	.4byte	0x46ad
 	.byte	0x8
 	.uleb128 0x1b
 	.4byte	.LASF549
@@ -25957,99 +26016,99 @@ __exitcall_ebc_exit:
 	.4byte	0x2410
 	.byte	0x14
 	.uleb128 0x1b
-	.4byte	.LASF1104
+	.4byte	.LASF1118
 	.byte	0x1f
 	.2byte	0x37a
 	.4byte	0x2410
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1879
+	.4byte	.LASF1893
 	.byte	0x1f
 	.2byte	0x37b
 	.4byte	0xc6
 	.byte	0x1c
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1880
+	.4byte	.LASF1894
 	.byte	0x20
 	.byte	0x1f
 	.2byte	0x381
-	.4byte	0x7eed
+	.4byte	0x7f5d
 	.uleb128 0x1b
-	.4byte	.LASF1881
+	.4byte	.LASF1895
 	.byte	0x1f
 	.2byte	0x382
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF987
+	.4byte	.LASF1001
 	.byte	0x1f
 	.2byte	0x383
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1882
+	.4byte	.LASF1896
 	.byte	0x1f
 	.2byte	0x384
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF1883
+	.4byte	.LASF1897
 	.byte	0x1f
 	.2byte	0x387
 	.4byte	0x6d
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1884
+	.4byte	.LASF1898
 	.byte	0x1f
 	.2byte	0x388
 	.4byte	0x6d
 	.byte	0x14
 	.uleb128 0x1b
-	.4byte	.LASF1885
+	.4byte	.LASF1899
 	.byte	0x1f
 	.2byte	0x389
 	.4byte	0x2d8
 	.byte	0x18
 	.byte	0
-	.uleb128 0x3f
+	.uleb128 0x41
 	.byte	0x10
 	.byte	0x1f
 	.2byte	0x396
-	.4byte	0x7f0f
-	.uleb128 0x41
-	.4byte	.LASF1886
+	.4byte	0x7f7f
+	.uleb128 0x43
+	.4byte	.LASF1900
 	.byte	0x1f
 	.2byte	0x397
 	.4byte	0x2f16
-	.uleb128 0x41
-	.4byte	.LASF1887
+	.uleb128 0x43
+	.4byte	.LASF1901
 	.byte	0x1f
 	.2byte	0x398
 	.4byte	0x41c
 	.byte	0
 	.uleb128 0x13
-	.4byte	.LASF1888
+	.4byte	.LASF1902
 	.byte	0x1f
 	.2byte	0x3ee
 	.4byte	0x458
 	.uleb128 0x1d
-	.4byte	.LASF1889
+	.4byte	.LASF1903
 	.byte	0x20
 	.byte	0x1f
 	.2byte	0x3f2
-	.4byte	0x7f5d
+	.4byte	0x7fcd
 	.uleb128 0x1b
-	.4byte	.LASF1890
+	.4byte	.LASF1904
 	.byte	0x1f
 	.2byte	0x3f3
-	.4byte	0x80a4
+	.4byte	0x8114
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1891
+	.4byte	.LASF1905
 	.byte	0x1f
 	.2byte	0x3f4
-	.4byte	0x80b5
+	.4byte	0x8125
 	.byte	0x8
 	.uleb128 0x1b
 	.4byte	.LASF130
@@ -26065,139 +26124,139 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x7f1b
+	.4byte	0x7f8b
 	.uleb128 0x10
-	.4byte	0x7f72
+	.4byte	0x7fe2
 	.uleb128 0x11
-	.4byte	0x7f72
+	.4byte	0x7fe2
 	.uleb128 0x11
-	.4byte	0x7f72
+	.4byte	0x7fe2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7f78
+	.4byte	0x7fe8
 	.uleb128 0x1d
-	.4byte	.LASF1892
+	.4byte	.LASF1906
 	.byte	0xe8
 	.byte	0x1f
 	.2byte	0x42c
-	.4byte	0x80a4
+	.4byte	0x8114
 	.uleb128 0x1b
-	.4byte	.LASF1893
+	.4byte	.LASF1907
 	.byte	0x1f
 	.2byte	0x42d
-	.4byte	0x7f72
+	.4byte	0x7fe2
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1894
+	.4byte	.LASF1908
 	.byte	0x1f
 	.2byte	0x42e
 	.4byte	0x3a7
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1895
+	.4byte	.LASF1909
 	.byte	0x1f
 	.2byte	0x42f
 	.4byte	0x3eb
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1896
+	.4byte	.LASF1910
 	.byte	0x1f
 	.2byte	0x430
 	.4byte	0x3a7
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1897
+	.4byte	.LASF1911
 	.byte	0x1f
 	.2byte	0x431
-	.4byte	0x7f0f
+	.4byte	0x7f7f
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1898
+	.4byte	.LASF1912
 	.byte	0x1f
 	.2byte	0x432
 	.4byte	0x6d
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1899
+	.4byte	.LASF1913
 	.byte	0x1f
 	.2byte	0x433
 	.4byte	0x96
 	.byte	0x44
 	.uleb128 0x1b
-	.4byte	.LASF1900
+	.4byte	.LASF1914
 	.byte	0x1f
 	.2byte	0x434
 	.4byte	0x6d
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1901
+	.4byte	.LASF1915
 	.byte	0x1f
 	.2byte	0x435
 	.4byte	0xc6
 	.byte	0x4c
 	.uleb128 0x1b
-	.4byte	.LASF1902
+	.4byte	.LASF1916
 	.byte	0x1f
 	.2byte	0x436
 	.4byte	0x15bf
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1903
+	.4byte	.LASF1917
 	.byte	0x1f
 	.2byte	0x437
-	.4byte	0x555c
+	.4byte	0x55cc
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1904
+	.4byte	.LASF1918
 	.byte	0x1f
 	.2byte	0x438
 	.4byte	0x2d8
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1905
+	.4byte	.LASF1919
 	.byte	0x1f
 	.2byte	0x439
 	.4byte	0x2d8
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1906
+	.4byte	.LASF1920
 	.byte	0x1f
 	.2byte	0x43b
-	.4byte	0x8324
+	.4byte	0x8394
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1907
+	.4byte	.LASF1921
 	.byte	0x1f
 	.2byte	0x43d
 	.4byte	0x29
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF1908
+	.4byte	.LASF1922
 	.byte	0x1f
 	.2byte	0x43e
 	.4byte	0x29
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1909
+	.4byte	.LASF1923
 	.byte	0x1f
 	.2byte	0x440
-	.4byte	0x832a
+	.4byte	0x839a
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF1910
+	.4byte	.LASF1924
 	.byte	0x1f
 	.2byte	0x441
-	.4byte	0x8330
+	.4byte	0x83a0
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF1911
+	.4byte	.LASF1925
 	.byte	0x1f
 	.2byte	0x449
-	.4byte	0x829a
+	.4byte	0x830a
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF1912
+	.4byte	.LASF1926
 	.byte	0x1f
 	.2byte	0x44b
 	.4byte	0x3a7
@@ -26217,74 +26276,74 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7f62
+	.4byte	0x7fd2
 	.uleb128 0x10
-	.4byte	0x80b5
+	.4byte	0x8125
 	.uleb128 0x11
-	.4byte	0x7f72
+	.4byte	0x7fe2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x80aa
+	.4byte	0x811a
 	.uleb128 0x1d
-	.4byte	.LASF1913
+	.4byte	.LASF1927
 	.byte	0x58
 	.byte	0x1f
 	.2byte	0x3fa
-	.4byte	0x8158
+	.4byte	0x81c8
 	.uleb128 0x1b
-	.4byte	.LASF1914
+	.4byte	.LASF1928
 	.byte	0x1f
 	.2byte	0x3fb
-	.4byte	0x8171
+	.4byte	0x81e1
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1915
+	.4byte	.LASF1929
 	.byte	0x1f
 	.2byte	0x3fc
-	.4byte	0x8186
+	.4byte	0x81f6
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1916
+	.4byte	.LASF1930
 	.byte	0x1f
 	.2byte	0x3fd
-	.4byte	0x819b
+	.4byte	0x820b
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1917
+	.4byte	.LASF1931
 	.byte	0x1f
 	.2byte	0x3fe
-	.4byte	0x81ac
+	.4byte	0x821c
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1918
+	.4byte	.LASF1932
 	.byte	0x1f
 	.2byte	0x3ff
-	.4byte	0x80b5
+	.4byte	0x8125
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1919
+	.4byte	.LASF1933
 	.byte	0x1f
 	.2byte	0x400
-	.4byte	0x81c6
+	.4byte	0x8236
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1920
+	.4byte	.LASF1934
 	.byte	0x1f
 	.2byte	0x401
-	.4byte	0x81db
+	.4byte	0x824b
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1921
+	.4byte	.LASF1935
 	.byte	0x1f
 	.2byte	0x402
-	.4byte	0x81fa
+	.4byte	0x826a
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1922
+	.4byte	.LASF1936
 	.byte	0x1f
 	.2byte	0x403
-	.4byte	0x8210
+	.4byte	0x8280
 	.byte	0x40
 	.uleb128 0x1b
 	.4byte	.LASF130
@@ -26300,69 +26359,69 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x80bb
+	.4byte	0x812b
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8171
+	.4byte	0x81e1
 	.uleb128 0x11
-	.4byte	0x7f72
+	.4byte	0x7fe2
 	.uleb128 0x11
-	.4byte	0x7f72
+	.4byte	0x7fe2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x815d
+	.4byte	0x81cd
 	.uleb128 0x14
 	.4byte	0x29
-	.4byte	0x8186
+	.4byte	0x81f6
 	.uleb128 0x11
-	.4byte	0x7f72
+	.4byte	0x7fe2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8177
+	.4byte	0x81e7
 	.uleb128 0x14
-	.4byte	0x7f0f
-	.4byte	0x819b
+	.4byte	0x7f7f
+	.4byte	0x820b
 	.uleb128 0x11
-	.4byte	0x7f0f
+	.4byte	0x7f7f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x818c
+	.4byte	0x81fc
 	.uleb128 0x10
-	.4byte	0x81ac
+	.4byte	0x821c
 	.uleb128 0x11
-	.4byte	0x7f0f
+	.4byte	0x7f7f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x81a1
+	.4byte	0x8211
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x81c6
+	.4byte	0x8236
 	.uleb128 0x11
-	.4byte	0x7f72
+	.4byte	0x7fe2
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x81b2
+	.4byte	0x8222
 	.uleb128 0x14
 	.4byte	0x2b0
-	.4byte	0x81db
+	.4byte	0x824b
 	.uleb128 0x11
-	.4byte	0x7f72
+	.4byte	0x7fe2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x81cc
+	.4byte	0x823c
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x81fa
+	.4byte	0x826a
 	.uleb128 0x11
-	.4byte	0x7f72
+	.4byte	0x7fe2
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -26370,23 +26429,23 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x81e1
+	.4byte	0x8251
 	.uleb128 0x10
-	.4byte	0x8210
+	.4byte	0x8280
 	.uleb128 0x11
-	.4byte	0x7f72
+	.4byte	0x7fe2
 	.uleb128 0x11
-	.4byte	0x786a
+	.4byte	0x78da
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8200
+	.4byte	0x8270
 	.uleb128 0xd
-	.4byte	.LASF1923
+	.4byte	.LASF1937
 	.byte	0x20
 	.byte	0x8c
 	.byte	0xa
-	.4byte	0x8247
+	.4byte	0x82b7
 	.uleb128 0xe
 	.4byte	.LASF578
 	.byte	0x8c
@@ -26397,45 +26456,45 @@ __exitcall_ebc_exit:
 	.4byte	.LASF98
 	.byte	0x8c
 	.byte	0xc
-	.4byte	0x824c
+	.4byte	0x82bc
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF962
+	.4byte	.LASF976
 	.byte	0x8c
 	.byte	0xd
 	.4byte	0x3a7
 	.byte	0x10
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1924
+	.4byte	.LASF1938
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8247
+	.4byte	0x82b7
 	.uleb128 0xd
-	.4byte	.LASF1925
+	.4byte	.LASF1939
 	.byte	0x8
 	.byte	0x8c
 	.byte	0x11
-	.4byte	0x826b
+	.4byte	0x82db
 	.uleb128 0xe
 	.4byte	.LASF98
 	.byte	0x8c
 	.byte	0x12
-	.4byte	0x8270
+	.4byte	0x82e0
 	.byte	0
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1926
+	.4byte	.LASF1940
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x826b
+	.4byte	0x82db
 	.uleb128 0x2e
 	.byte	0x18
 	.byte	0x1f
 	.2byte	0x445
-	.4byte	0x829a
+	.4byte	0x830a
 	.uleb128 0x1b
-	.4byte	.LASF1853
+	.4byte	.LASF1867
 	.byte	0x1f
 	.2byte	0x446
 	.4byte	0x3a7
@@ -26447,65 +26506,65 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x10
 	.byte	0
-	.uleb128 0x3f
+	.uleb128 0x41
 	.byte	0x20
 	.byte	0x1f
 	.2byte	0x442
-	.4byte	0x82c8
-	.uleb128 0x41
-	.4byte	.LASF1927
+	.4byte	0x8338
+	.uleb128 0x43
+	.4byte	.LASF1941
 	.byte	0x1f
 	.2byte	0x443
-	.4byte	0x8216
-	.uleb128 0x41
-	.4byte	.LASF1928
+	.4byte	0x8286
+	.uleb128 0x43
+	.4byte	.LASF1942
 	.byte	0x1f
 	.2byte	0x444
-	.4byte	0x8252
-	.uleb128 0x3d
+	.4byte	0x82c2
+	.uleb128 0x3f
 	.string	"afs"
 	.byte	0x1f
 	.2byte	0x448
-	.4byte	0x8276
+	.4byte	0x82e6
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1929
+	.4byte	.LASF1943
 	.byte	0x30
 	.byte	0x1f
 	.2byte	0x521
-	.4byte	0x8324
+	.4byte	0x8394
 	.uleb128 0x1b
-	.4byte	.LASF1930
+	.4byte	.LASF1944
 	.byte	0x1f
 	.2byte	0x522
 	.4byte	0xe85
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1931
+	.4byte	.LASF1945
 	.byte	0x1f
 	.2byte	0x523
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1932
+	.4byte	.LASF1946
 	.byte	0x1f
 	.2byte	0x524
 	.4byte	0xc6
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF1933
+	.4byte	.LASF1947
 	.byte	0x1f
 	.2byte	0x525
-	.4byte	0x8324
+	.4byte	0x8394
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1934
+	.4byte	.LASF1948
 	.byte	0x1f
 	.2byte	0x526
-	.4byte	0x555c
+	.4byte	0x55cc
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1935
+	.4byte	.LASF1949
 	.byte	0x1f
 	.2byte	0x527
 	.4byte	0x41c
@@ -26513,51 +26572,51 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x82c8
+	.4byte	0x8338
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7f5d
+	.4byte	0x7fcd
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8158
+	.4byte	0x81c8
 	.uleb128 0x1a
-	.4byte	.LASF1936
+	.4byte	.LASF1950
 	.2byte	0x1b8
 	.byte	0x1f
 	.2byte	0x57d
-	.4byte	0x836c
+	.4byte	0x83dc
 	.uleb128 0x1b
-	.4byte	.LASF1243
+	.4byte	.LASF1257
 	.byte	0x1f
 	.2byte	0x57e
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1937
+	.4byte	.LASF1951
 	.byte	0x1f
 	.2byte	0x57f
 	.4byte	0x15bf
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1395
+	.4byte	.LASF1409
 	.byte	0x1f
 	.2byte	0x580
-	.4byte	0x836c
+	.4byte	0x83dc
 	.byte	0x20
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x5cc1
-	.4byte	0x837c
+	.4byte	0x5d31
+	.4byte	0x83ec
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1938
+	.4byte	.LASF1952
 	.byte	0x68
 	.byte	0x1f
 	.2byte	0x8ac
-	.4byte	0x848e
+	.4byte	0x84fe
 	.uleb128 0x1b
 	.4byte	.LASF265
 	.byte	0x1f
@@ -26565,91 +26624,91 @@ __exitcall_ebc_exit:
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1939
+	.4byte	.LASF1953
 	.byte	0x1f
 	.2byte	0x8ae
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1940
+	.4byte	.LASF1954
 	.byte	0x1f
 	.2byte	0x8b4
-	.4byte	0x90bd
+	.4byte	0x912d
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1941
+	.4byte	.LASF1955
 	.byte	0x1f
 	.2byte	0x8b6
-	.4byte	0x90e6
+	.4byte	0x9156
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1942
+	.4byte	.LASF1956
 	.byte	0x1f
 	.2byte	0x8b8
-	.4byte	0x90f1
+	.4byte	0x9161
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1943
+	.4byte	.LASF1957
 	.byte	0x1f
 	.2byte	0x8b9
-	.4byte	0x8f11
+	.4byte	0x8f81
 	.byte	0x28
 	.uleb128 0x1b
 	.4byte	.LASF98
 	.byte	0x1f
 	.2byte	0x8ba
-	.4byte	0x757b
+	.4byte	0x75eb
 	.byte	0x30
 	.uleb128 0x1b
 	.4byte	.LASF64
 	.byte	0x1f
 	.2byte	0x8bb
-	.4byte	0x848e
+	.4byte	0x84fe
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1944
+	.4byte	.LASF1958
 	.byte	0x1f
 	.2byte	0x8bc
 	.4byte	0x3d2
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1945
+	.4byte	.LASF1959
 	.byte	0x1f
 	.2byte	0x8be
 	.4byte	0xe11
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1946
+	.4byte	.LASF1960
 	.byte	0x1f
 	.2byte	0x8bf
 	.4byte	0xe11
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1947
+	.4byte	.LASF1961
 	.byte	0x1f
 	.2byte	0x8c0
 	.4byte	0xe11
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1948
+	.4byte	.LASF1962
 	.byte	0x1f
 	.2byte	0x8c1
-	.4byte	0x90f7
+	.4byte	0x9167
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1949
+	.4byte	.LASF1963
 	.byte	0x1f
 	.2byte	0x8c3
 	.4byte	0xe11
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1950
+	.4byte	.LASF1964
 	.byte	0x1f
 	.2byte	0x8c4
 	.4byte	0xe11
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1951
+	.4byte	.LASF1965
 	.byte	0x1f
 	.2byte	0x8c5
 	.4byte	0xe11
@@ -26681,192 +26740,192 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x837c
+	.4byte	0x83ec
 	.uleb128 0x1a
-	.4byte	.LASF1952
+	.4byte	.LASF1966
 	.2byte	0x110
 	.byte	0x1f
 	.2byte	0x78f
-	.4byte	0x865f
+	.4byte	0x86cf
 	.uleb128 0x1b
-	.4byte	.LASF1953
+	.4byte	.LASF1967
 	.byte	0x1f
 	.2byte	0x790
-	.4byte	0x8eaa
+	.4byte	0x8f1a
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1954
+	.4byte	.LASF1968
 	.byte	0x1f
 	.2byte	0x791
-	.4byte	0x8ebb
+	.4byte	0x8f2b
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1955
+	.4byte	.LASF1969
 	.byte	0x1f
 	.2byte	0x793
-	.4byte	0x8ed1
+	.4byte	0x8f41
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1956
+	.4byte	.LASF1970
 	.byte	0x1f
 	.2byte	0x794
-	.4byte	0x8eeb
+	.4byte	0x8f5b
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1957
+	.4byte	.LASF1971
 	.byte	0x1f
 	.2byte	0x795
-	.4byte	0x8f00
+	.4byte	0x8f70
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1958
+	.4byte	.LASF1972
 	.byte	0x1f
 	.2byte	0x796
-	.4byte	0x8ebb
+	.4byte	0x8f2b
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1959
+	.4byte	.LASF1973
 	.byte	0x1f
 	.2byte	0x797
-	.4byte	0x8f11
+	.4byte	0x8f81
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1960
+	.4byte	.LASF1974
 	.byte	0x1f
 	.2byte	0x798
-	.4byte	0x6d3d
+	.4byte	0x6dad
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1961
+	.4byte	.LASF1975
 	.byte	0x1f
 	.2byte	0x799
-	.4byte	0x8f26
+	.4byte	0x8f96
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1962
+	.4byte	.LASF1976
 	.byte	0x1f
 	.2byte	0x79a
-	.4byte	0x8f26
+	.4byte	0x8f96
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1963
+	.4byte	.LASF1977
 	.byte	0x1f
 	.2byte	0x79b
-	.4byte	0x8f26
+	.4byte	0x8f96
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1964
+	.4byte	.LASF1978
 	.byte	0x1f
 	.2byte	0x79c
-	.4byte	0x8f26
+	.4byte	0x8f96
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1965
+	.4byte	.LASF1979
 	.byte	0x1f
 	.2byte	0x79d
-	.4byte	0x8f4b
+	.4byte	0x8fbb
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1966
+	.4byte	.LASF1980
 	.byte	0x1f
 	.2byte	0x79e
-	.4byte	0x8f6a
+	.4byte	0x8fda
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1967
+	.4byte	.LASF1981
 	.byte	0x1f
 	.2byte	0x79f
-	.4byte	0x8f8e
+	.4byte	0x8ffe
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1968
+	.4byte	.LASF1982
 	.byte	0x1f
 	.2byte	0x7a0
 	.4byte	0x316c
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1969
+	.4byte	.LASF1983
 	.byte	0x1f
 	.2byte	0x7a1
-	.4byte	0x8fa4
+	.4byte	0x9014
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1970
+	.4byte	.LASF1984
 	.byte	0x1f
 	.2byte	0x7a2
-	.4byte	0x8f11
+	.4byte	0x8f81
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF1971
+	.4byte	.LASF1985
 	.byte	0x1f
 	.2byte	0x7a3
-	.4byte	0x8fba
+	.4byte	0x902a
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1972
+	.4byte	.LASF1986
 	.byte	0x1f
 	.2byte	0x7a5
-	.4byte	0x8fd4
+	.4byte	0x9044
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF1973
+	.4byte	.LASF1987
 	.byte	0x1f
 	.2byte	0x7a6
-	.4byte	0x8ff3
+	.4byte	0x9063
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF1974
+	.4byte	.LASF1988
 	.byte	0x1f
 	.2byte	0x7a7
-	.4byte	0x8fd4
+	.4byte	0x9044
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF1975
+	.4byte	.LASF1989
 	.byte	0x1f
 	.2byte	0x7a8
-	.4byte	0x8fd4
+	.4byte	0x9044
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF1976
+	.4byte	.LASF1990
 	.byte	0x1f
 	.2byte	0x7a9
-	.4byte	0x8fd4
+	.4byte	0x9044
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF1977
+	.4byte	.LASF1991
 	.byte	0x1f
 	.2byte	0x7ab
-	.4byte	0x901c
+	.4byte	0x908c
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF1978
+	.4byte	.LASF1992
 	.byte	0x1f
 	.2byte	0x7ac
-	.4byte	0x9045
+	.4byte	0x90b5
 	.byte	0xc8
 	.uleb128 0x1b
-	.4byte	.LASF1979
+	.4byte	.LASF1993
 	.byte	0x1f
 	.2byte	0x7ad
-	.4byte	0x9060
+	.4byte	0x90d0
 	.byte	0xd0
 	.uleb128 0x1b
-	.4byte	.LASF1980
+	.4byte	.LASF1994
 	.byte	0x1f
 	.2byte	0x7af
-	.4byte	0x907f
+	.4byte	0x90ef
 	.byte	0xd8
 	.uleb128 0x1b
-	.4byte	.LASF1981
+	.4byte	.LASF1995
 	.byte	0x1f
 	.2byte	0x7b0
-	.4byte	0x9099
+	.4byte	0x9109
 	.byte	0xe0
 	.uleb128 0x1b
-	.4byte	.LASF1982
+	.4byte	.LASF1996
 	.byte	0x1f
 	.2byte	0x7b2
-	.4byte	0x9099
+	.4byte	0x9109
 	.byte	0xe8
 	.uleb128 0x1b
 	.4byte	.LASF130
@@ -26894,72 +26953,72 @@ __exitcall_ebc_exit:
 	.2byte	0x108
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x8494
+	.4byte	0x8504
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x865f
+	.4byte	0x86cf
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6e2f
+	.4byte	0x6e9f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7187
+	.4byte	0x71f7
 	.uleb128 0x24
-	.4byte	.LASF1983
+	.4byte	.LASF1997
 	.uleb128 0x3
-	.4byte	0x8676
+	.4byte	0x86e6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x867b
+	.4byte	0x86eb
 	.uleb128 0x24
-	.4byte	.LASF1984
+	.4byte	.LASF1998
 	.uleb128 0x3
-	.4byte	0x8686
+	.4byte	0x86f6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8696
+	.4byte	0x8706
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x868b
+	.4byte	0x86fb
 	.uleb128 0x24
-	.4byte	.LASF1985
+	.4byte	.LASF1999
 	.uleb128 0x3
-	.4byte	0x869c
+	.4byte	0x870c
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x86a1
+	.4byte	0x8711
 	.uleb128 0x32
 	.string	"key"
 	.byte	0xd0
 	.byte	0x8d
 	.byte	0x9b
-	.4byte	0x8779
+	.4byte	0x87e9
 	.uleb128 0xe
 	.4byte	.LASF580
 	.byte	0x8d
 	.byte	0x9c
-	.4byte	0x3392
+	.4byte	0x3402
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1986
+	.4byte	.LASF2000
 	.byte	0x8d
 	.byte	0x9d
-	.4byte	0x93c3
+	.4byte	0x9433
 	.byte	0x4
 	.uleb128 0x23
-	.4byte	0x94be
+	.4byte	0x952e
 	.byte	0x8
 	.uleb128 0x20
 	.string	"sem"
 	.byte	0x8d
 	.byte	0xa2
-	.4byte	0x4e36
+	.4byte	0x4ea6
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1118
+	.4byte	.LASF1132
 	.byte	0x8d
 	.byte	0xa3
-	.4byte	0x9575
+	.4byte	0x95e5
 	.byte	0x50
 	.uleb128 0xe
 	.4byte	.LASF747
@@ -26968,10 +27027,10 @@ __exitcall_ebc_exit:
 	.4byte	0x458
 	.byte	0x58
 	.uleb128 0x23
-	.4byte	0x94dd
+	.4byte	0x954d
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF1987
+	.4byte	.LASF2001
 	.byte	0x8d
 	.byte	0xa9
 	.4byte	0x9d2
@@ -26989,19 +27048,19 @@ __exitcall_ebc_exit:
 	.4byte	0x2430
 	.byte	0x74
 	.uleb128 0xe
-	.4byte	.LASF1988
+	.4byte	.LASF2002
 	.byte	0x8d
 	.byte	0xac
-	.4byte	0x93ce
+	.4byte	0x943e
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF1989
+	.4byte	.LASF2003
 	.byte	0x8d
 	.byte	0xad
 	.4byte	0xb4
 	.byte	0x7c
 	.uleb128 0xe
-	.4byte	.LASF1990
+	.4byte	.LASF2004
 	.byte	0x8d
 	.byte	0xae
 	.4byte	0xb4
@@ -27019,92 +27078,92 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0x88
 	.uleb128 0x23
-	.4byte	0x951d
+	.4byte	0x958d
 	.byte	0x90
 	.uleb128 0x23
-	.4byte	0x9557
+	.4byte	0x95c7
 	.byte	0xa8
 	.uleb128 0xe
-	.4byte	.LASF1991
+	.4byte	.LASF2005
 	.byte	0x8d
 	.byte	0xea
-	.4byte	0x957b
+	.4byte	0x95eb
 	.byte	0xc8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x86ac
+	.4byte	0x871c
 	.uleb128 0x24
-	.4byte	.LASF1992
+	.4byte	.LASF2006
 	.uleb128 0x3
-	.4byte	0x877f
+	.4byte	0x87ef
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8784
+	.4byte	0x87f4
 	.uleb128 0x24
-	.4byte	.LASF1993
+	.4byte	.LASF2007
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x878f
+	.4byte	0x87ff
 	.uleb128 0x24
-	.4byte	.LASF1994
+	.4byte	.LASF2008
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x879a
+	.4byte	0x880a
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x87b5
+	.4byte	0x8825
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1f
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1995
+	.4byte	.LASF2009
 	.byte	0x18
 	.byte	0x1f
 	.2byte	0x6c5
-	.4byte	0x87f7
+	.4byte	0x8867
 	.uleb128 0x1b
-	.4byte	.LASF1996
+	.4byte	.LASF2010
 	.byte	0x1f
 	.2byte	0x6c6
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1997
+	.4byte	.LASF2011
 	.byte	0x1f
 	.2byte	0x6c7
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF1998
+	.4byte	.LASF2012
 	.byte	0x1f
 	.2byte	0x6c8
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1999
+	.4byte	.LASF2013
 	.byte	0x1f
 	.2byte	0x6c9
-	.4byte	0x87f7
+	.4byte	0x8867
 	.byte	0x10
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5ba2
+	.4byte	0x5c12
 	.uleb128 0x13
-	.4byte	.LASF2000
+	.4byte	.LASF2014
 	.byte	0x1f
 	.2byte	0x6e7
-	.4byte	0x8809
+	.4byte	0x8879
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x880f
+	.4byte	0x887f
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8837
+	.4byte	0x88a7
 	.uleb128 0x11
-	.4byte	0x8837
+	.4byte	0x88a7
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
@@ -27118,18 +27177,18 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x883d
+	.4byte	0x88ad
 	.uleb128 0x1d
-	.4byte	.LASF2001
+	.4byte	.LASF2015
 	.byte	0x10
 	.byte	0x1f
 	.2byte	0x6ea
-	.4byte	0x8865
+	.4byte	0x88d5
 	.uleb128 0x1b
-	.4byte	.LASF2002
+	.4byte	.LASF2016
 	.byte	0x1f
 	.2byte	0x6eb
-	.4byte	0x87fd
+	.4byte	0x886d
 	.byte	0
 	.uleb128 0x2b
 	.string	"pos"
@@ -27140,9 +27199,9 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x14
 	.4byte	0x2d8
-	.4byte	0x887e
+	.4byte	0x88ee
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
 	.4byte	0x2d8
 	.uleb128 0x11
@@ -27150,72 +27209,72 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8865
+	.4byte	0x88d5
 	.uleb128 0x14
 	.4byte	0x2ee
-	.4byte	0x88a2
+	.4byte	0x8912
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
 	.4byte	0x21e
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0x88a2
+	.4byte	0x8912
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x2d8
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8884
+	.4byte	0x88f4
 	.uleb128 0x14
 	.4byte	0x2ee
-	.4byte	0x88cc
+	.4byte	0x893c
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0x88a2
+	.4byte	0x8912
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x88ae
+	.4byte	0x891e
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x88e6
+	.4byte	0x8956
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
-	.4byte	0x8837
+	.4byte	0x88a7
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x88d2
+	.4byte	0x8942
 	.uleb128 0x14
 	.4byte	0x244
-	.4byte	0x8900
+	.4byte	0x8970
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
-	.4byte	0x8900
+	.4byte	0x8970
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8906
+	.4byte	0x8976
 	.uleb128 0x24
-	.4byte	.LASF2003
+	.4byte	.LASF2017
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x88ec
+	.4byte	0x895c
 	.uleb128 0x14
 	.4byte	0x199
-	.4byte	0x892a
+	.4byte	0x899a
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
@@ -27223,45 +27282,45 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8911
+	.4byte	0x8981
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8944
+	.4byte	0x89b4
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
-	.4byte	0x3cb5
+	.4byte	0x3d25
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8930
+	.4byte	0x89a0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x895e
+	.4byte	0x89ce
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x894a
+	.4byte	0x89ba
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8978
+	.4byte	0x89e8
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
-	.4byte	0x7f0f
+	.4byte	0x7f7f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8964
+	.4byte	0x89d4
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x899c
+	.4byte	0x8a0c
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
 	.4byte	0x2d8
 	.uleb128 0x11
@@ -27271,70 +27330,70 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x897e
+	.4byte	0x89ee
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x89bb
+	.4byte	0x8a2b
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x89a2
+	.4byte	0x8a12
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x89da
+	.4byte	0x8a4a
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0x7f72
+	.4byte	0x7fe2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x89c1
+	.4byte	0x8a31
 	.uleb128 0x14
 	.4byte	0x2ee
-	.4byte	0x8a08
+	.4byte	0x8a78
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
-	.4byte	0x3469
+	.4byte	0x34d9
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0x88a2
+	.4byte	0x8912
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x89e0
+	.4byte	0x8a50
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8a1d
+	.4byte	0x8a8d
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8a0e
+	.4byte	0x8a7e
 	.uleb128 0x14
 	.4byte	0x2ee
-	.4byte	0x8a46
+	.4byte	0x8ab6
 	.uleb128 0x11
-	.4byte	0x495b
+	.4byte	0x49cb
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
-	.4byte	0x88a2
+	.4byte	0x8912
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
@@ -27342,16 +27401,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8a23
+	.4byte	0x8a93
 	.uleb128 0x14
 	.4byte	0x2ee
-	.4byte	0x8a6f
+	.4byte	0x8adf
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
-	.4byte	0x88a2
+	.4byte	0x8912
 	.uleb128 0x11
-	.4byte	0x495b
+	.4byte	0x49cb
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
@@ -27359,30 +27418,30 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8a4c
+	.4byte	0x8abc
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8a93
+	.4byte	0x8b03
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
 	.4byte	0x199
 	.uleb128 0x11
-	.4byte	0x8a93
+	.4byte	0x8b03
 	.uleb128 0x11
-	.4byte	0x786a
+	.4byte	0x78da
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7f72
+	.4byte	0x7fe2
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8a75
+	.4byte	0x8ae5
 	.uleb128 0x14
 	.4byte	0x199
-	.4byte	0x8abd
+	.4byte	0x8b2d
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -27392,23 +27451,23 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8a9f
+	.4byte	0x8b0f
 	.uleb128 0x10
-	.4byte	0x8ad3
+	.4byte	0x8b43
 	.uleb128 0x11
-	.4byte	0x8ad3
+	.4byte	0x8b43
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8ad9
+	.4byte	0x8b49
 	.uleb128 0xd
-	.4byte	.LASF2004
+	.4byte	.LASF2018
 	.byte	0x80
 	.byte	0x8e
 	.byte	0x10
-	.4byte	0x8b81
+	.4byte	0x8bf1
 	.uleb128 0x20
 	.string	"buf"
 	.byte	0x8e
@@ -27416,13 +27475,13 @@ __exitcall_ebc_exit:
 	.4byte	0x21e
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF987
+	.4byte	.LASF1001
 	.byte	0x8e
 	.byte	0x12
 	.4byte	0x2e3
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2005
+	.4byte	.LASF2019
 	.byte	0x8e
 	.byte	0x13
 	.4byte	0x2e3
@@ -27434,25 +27493,25 @@ __exitcall_ebc_exit:
 	.4byte	0x2e3
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2006
+	.4byte	.LASF2020
 	.byte	0x8e
 	.byte	0x15
 	.4byte	0x2e3
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF880
+	.4byte	.LASF894
 	.byte	0x8e
 	.byte	0x16
 	.4byte	0x2d8
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2007
+	.4byte	.LASF2021
 	.byte	0x8e
 	.byte	0x17
 	.4byte	0x2d8
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1725
+	.4byte	.LASF1739
 	.byte	0x8e
 	.byte	0x18
 	.4byte	0x15a
@@ -27467,19 +27526,19 @@ __exitcall_ebc_exit:
 	.string	"op"
 	.byte	0x8e
 	.byte	0x1a
-	.4byte	0x96b6
+	.4byte	0x9726
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2008
+	.4byte	.LASF2022
 	.byte	0x8e
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF1273
+	.4byte	.LASF1287
 	.byte	0x8e
 	.byte	0x1c
-	.4byte	0x96bc
+	.4byte	0x972c
 	.byte	0x70
 	.uleb128 0xe
 	.4byte	.LASF360
@@ -27490,16 +27549,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8ac3
+	.4byte	0x8b33
 	.uleb128 0x14
 	.4byte	0x2ee
-	.4byte	0x8baf
+	.4byte	0x8c1f
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
 	.4byte	0x2d8
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
 	.4byte	0x2d8
 	.uleb128 0x11
@@ -27509,16 +27568,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8b87
+	.4byte	0x8bf7
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8bd8
+	.4byte	0x8c48
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
 	.4byte	0x2d8
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
 	.4byte	0x2d8
 	.uleb128 0x11
@@ -27526,10 +27585,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8bb5
+	.4byte	0x8c25
 	.uleb128 0x14
 	.4byte	0x1995
-	.4byte	0x8bf7
+	.4byte	0x8c67
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.uleb128 0x11
@@ -27539,26 +27598,26 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8bde
+	.4byte	0x8c4e
 	.uleb128 0x14
 	.4byte	0x56
-	.4byte	0x8c16
+	.4byte	0x8c86
 	.uleb128 0x11
 	.4byte	0x1995
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x8c16
+	.4byte	0x8c86
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5d0a
+	.4byte	0x5d7a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8bfd
+	.4byte	0x8c6d
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8c36
+	.4byte	0x8ca6
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.uleb128 0x11
@@ -27566,10 +27625,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8c22
+	.4byte	0x8c92
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8c55
+	.4byte	0x8cc5
 	.uleb128 0x11
 	.4byte	0x2264
 	.uleb128 0x11
@@ -27579,10 +27638,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8c3c
+	.4byte	0x8cac
 	.uleb128 0x14
-	.4byte	0x7c3c
-	.4byte	0x8c6f
+	.4byte	0x7cac
+	.4byte	0x8cdf
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.uleb128 0x11
@@ -27590,10 +27649,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8c5b
+	.4byte	0x8ccb
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8c8e
+	.4byte	0x8cfe
 	.uleb128 0x11
 	.4byte	0x1995
 	.uleb128 0x11
@@ -27603,10 +27662,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8c75
+	.4byte	0x8ce5
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8cb2
+	.4byte	0x8d22
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.uleb128 0x11
@@ -27618,10 +27677,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8c94
+	.4byte	0x8d04
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8cd1
+	.4byte	0x8d41
 	.uleb128 0x11
 	.4byte	0x1995
 	.uleb128 0x11
@@ -27631,10 +27690,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8cb8
+	.4byte	0x8d28
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8ceb
+	.4byte	0x8d5b
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.uleb128 0x11
@@ -27642,10 +27701,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8cd7
+	.4byte	0x8d47
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8d0a
+	.4byte	0x8d7a
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.uleb128 0x11
@@ -27655,10 +27714,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8cf1
+	.4byte	0x8d61
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8d29
+	.4byte	0x8d99
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.uleb128 0x11
@@ -27668,10 +27727,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8d10
+	.4byte	0x8d80
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8d4d
+	.4byte	0x8dbd
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.uleb128 0x11
@@ -27683,10 +27742,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8d2f
+	.4byte	0x8d9f
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8d76
+	.4byte	0x8de6
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.uleb128 0x11
@@ -27700,41 +27759,41 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8d53
+	.4byte	0x8dc3
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8d90
+	.4byte	0x8e00
 	.uleb128 0x11
 	.4byte	0x1995
 	.uleb128 0x11
-	.4byte	0x8d90
+	.4byte	0x8e00
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5f9e
+	.4byte	0x600e
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8d7c
+	.4byte	0x8dec
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8db5
+	.4byte	0x8e25
 	.uleb128 0x11
 	.4byte	0x2264
 	.uleb128 0x11
 	.4byte	0x1995
 	.uleb128 0x11
-	.4byte	0x8d90
+	.4byte	0x8e00
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8d9c
+	.4byte	0x8e0c
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8dd9
+	.4byte	0x8e49
 	.uleb128 0x11
 	.4byte	0x2112
 	.uleb128 0x11
-	.4byte	0x8dd9
+	.4byte	0x8e49
 	.uleb128 0x11
 	.4byte	0x13f
 	.uleb128 0x11
@@ -27742,13 +27801,13 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4a9a
+	.4byte	0x4b0a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8dbb
+	.4byte	0x8e2b
 	.uleb128 0x14
 	.4byte	0x2ee
-	.4byte	0x8dfe
+	.4byte	0x8e6e
 	.uleb128 0x11
 	.4byte	0x1995
 	.uleb128 0x11
@@ -27758,14 +27817,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8de5
+	.4byte	0x8e55
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8e22
+	.4byte	0x8e92
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x8e22
+	.4byte	0x8e92
 	.uleb128 0x11
 	.4byte	0x15a
 	.uleb128 0x11
@@ -27773,17 +27832,17 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x87b5
+	.4byte	0x8825
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8e04
+	.4byte	0x8e74
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8e47
+	.4byte	0x8eb7
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x8e47
+	.4byte	0x8eb7
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
@@ -27792,16 +27851,16 @@ __exitcall_ebc_exit:
 	.4byte	0xa27
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8e2e
+	.4byte	0x8e9e
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8e76
+	.4byte	0x8ee6
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.uleb128 0x11
 	.4byte	0x1995
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
@@ -27809,39 +27868,39 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8e53
+	.4byte	0x8ec3
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8e95
+	.4byte	0x8f05
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x7c3c
+	.4byte	0x7cac
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8e7c
+	.4byte	0x8eec
 	.uleb128 0x14
 	.4byte	0x1c7f
-	.4byte	0x8eaa
+	.4byte	0x8f1a
 	.uleb128 0x11
 	.4byte	0x20e7
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8e9b
+	.4byte	0x8f0b
 	.uleb128 0x10
-	.4byte	0x8ebb
+	.4byte	0x8f2b
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8eb0
+	.4byte	0x8f20
 	.uleb128 0x10
-	.4byte	0x8ed1
+	.4byte	0x8f41
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.uleb128 0x11
@@ -27849,90 +27908,90 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8ec1
+	.4byte	0x8f31
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8eeb
+	.4byte	0x8f5b
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x77bf
+	.4byte	0x782f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8ed7
+	.4byte	0x8f47
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8f00
+	.4byte	0x8f70
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8ef1
+	.4byte	0x8f61
 	.uleb128 0x10
-	.4byte	0x8f11
+	.4byte	0x8f81
 	.uleb128 0x11
 	.4byte	0x20e7
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8f06
+	.4byte	0x8f76
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8f26
+	.4byte	0x8f96
 	.uleb128 0x11
 	.4byte	0x20e7
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8f17
+	.4byte	0x8f87
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8f40
+	.4byte	0x8fb0
 	.uleb128 0x11
 	.4byte	0x1995
 	.uleb128 0x11
-	.4byte	0x8f40
+	.4byte	0x8fb0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8f46
+	.4byte	0x8fb6
 	.uleb128 0x24
-	.4byte	.LASF2009
+	.4byte	.LASF2023
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8f2c
+	.4byte	0x8f9c
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8f6a
+	.4byte	0x8fda
 	.uleb128 0x11
 	.4byte	0x20e7
 	.uleb128 0x11
-	.4byte	0x467e
+	.4byte	0x46ee
 	.uleb128 0x11
 	.4byte	0x21e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8f51
+	.4byte	0x8fc1
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8f8e
+	.4byte	0x8ffe
 	.uleb128 0x11
 	.4byte	0x2264
 	.uleb128 0x11
 	.4byte	0x20e7
 	.uleb128 0x11
-	.4byte	0x467e
+	.4byte	0x46ee
 	.uleb128 0x11
 	.4byte	0x21e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8f70
+	.4byte	0x8fe0
 	.uleb128 0x10
-	.4byte	0x8fa4
+	.4byte	0x9014
 	.uleb128 0x11
 	.4byte	0x458
 	.uleb128 0x11
@@ -27940,9 +27999,9 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8f94
+	.4byte	0x9004
 	.uleb128 0x10
-	.4byte	0x8fba
+	.4byte	0x902a
 	.uleb128 0x11
 	.4byte	0x20e7
 	.uleb128 0x11
@@ -27950,34 +28009,34 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8faa
+	.4byte	0x901a
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8fd4
+	.4byte	0x9044
 	.uleb128 0x11
-	.4byte	0x8ad3
+	.4byte	0x8b43
 	.uleb128 0x11
 	.4byte	0x1995
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8fc0
+	.4byte	0x9030
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8ff3
+	.4byte	0x9063
 	.uleb128 0x11
 	.4byte	0x2264
 	.uleb128 0x11
-	.4byte	0x8ad3
+	.4byte	0x8b43
 	.uleb128 0x11
 	.4byte	0x1995
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8fda
+	.4byte	0x904a
 	.uleb128 0x14
 	.4byte	0x2ee
-	.4byte	0x901c
+	.4byte	0x908c
 	.uleb128 0x11
 	.4byte	0x20e7
 	.uleb128 0x11
@@ -27991,10 +28050,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8ff9
+	.4byte	0x9069
 	.uleb128 0x14
 	.4byte	0x2ee
-	.4byte	0x9045
+	.4byte	0x90b5
 	.uleb128 0x11
 	.4byte	0x20e7
 	.uleb128 0x11
@@ -28008,48 +28067,48 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9022
+	.4byte	0x9092
 	.uleb128 0x14
-	.4byte	0x905a
-	.4byte	0x905a
+	.4byte	0x90ca
+	.4byte	0x90ca
 	.uleb128 0x11
 	.4byte	0x1c7f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x69b8
+	.4byte	0x6a28
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x904b
+	.4byte	0x90bb
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x907f
+	.4byte	0x90ef
 	.uleb128 0x11
 	.4byte	0x20e7
 	.uleb128 0x11
-	.4byte	0x3469
+	.4byte	0x34d9
 	.uleb128 0x11
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9066
+	.4byte	0x90d6
 	.uleb128 0x14
 	.4byte	0x199
-	.4byte	0x9099
+	.4byte	0x9109
 	.uleb128 0x11
 	.4byte	0x20e7
 	.uleb128 0x11
-	.4byte	0x4c42
+	.4byte	0x4cb2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9085
+	.4byte	0x90f5
 	.uleb128 0x14
 	.4byte	0x1995
-	.4byte	0x90bd
+	.4byte	0x912d
 	.uleb128 0x11
-	.4byte	0x848e
+	.4byte	0x84fe
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -28059,14 +28118,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x909f
+	.4byte	0x910f
 	.uleb128 0x14
 	.4byte	0x1995
-	.4byte	0x90e6
+	.4byte	0x9156
 	.uleb128 0x11
 	.4byte	0x2264
 	.uleb128 0x11
-	.4byte	0x848e
+	.4byte	0x84fe
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -28076,25 +28135,25 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x90c3
+	.4byte	0x9133
 	.uleb128 0x16
 	.4byte	0x458
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x90ec
+	.4byte	0x915c
 	.uleb128 0x5
 	.4byte	0xe11
-	.4byte	0x9107
+	.4byte	0x9177
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2010
+	.4byte	.LASF2024
 	.byte	0x60
 	.byte	0x8f
 	.byte	0x42
-	.4byte	0x91e2
+	.4byte	0x9252
 	.uleb128 0xe
 	.4byte	.LASF265
 	.byte	0x8f
@@ -28111,34 +28170,34 @@ __exitcall_ebc_exit:
 	.4byte	.LASF640
 	.byte	0x8f
 	.byte	0x45
-	.4byte	0x91ee
+	.4byte	0x925e
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2011
+	.4byte	.LASF2025
 	.byte	0x8f
 	.byte	0x46
-	.4byte	0xa0dc
+	.4byte	0xa14c
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2012
+	.4byte	.LASF2026
 	.byte	0x8f
 	.byte	0x47
-	.4byte	0xa167
+	.4byte	0xa1d7
 	.byte	0x28
 	.uleb128 0x20
 	.string	"sd"
 	.byte	0x8f
 	.byte	0x48
-	.4byte	0x99c1
+	.4byte	0x9a31
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2013
+	.4byte	.LASF2027
 	.byte	0x8f
 	.byte	0x49
-	.4byte	0xa040
+	.4byte	0xa0b0
 	.byte	0x38
-	.uleb128 0x38
-	.4byte	.LASF2014
+	.uleb128 0x3a
+	.4byte	.LASF2028
 	.byte	0x8f
 	.byte	0x4d
 	.4byte	0x6d
@@ -28146,8 +28205,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x1f
 	.byte	0x3c
-	.uleb128 0x38
-	.4byte	.LASF2015
+	.uleb128 0x3a
+	.4byte	.LASF2029
 	.byte	0x8f
 	.byte	0x4e
 	.4byte	0x6d
@@ -28155,8 +28214,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x1e
 	.byte	0x3c
-	.uleb128 0x38
-	.4byte	.LASF2016
+	.uleb128 0x3a
+	.4byte	.LASF2030
 	.byte	0x8f
 	.byte	0x4f
 	.4byte	0x6d
@@ -28164,8 +28223,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x1d
 	.byte	0x3c
-	.uleb128 0x38
-	.4byte	.LASF2017
+	.uleb128 0x3a
+	.4byte	.LASF2031
 	.byte	0x8f
 	.byte	0x50
 	.4byte	0x6d
@@ -28173,8 +28232,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x1c
 	.byte	0x3c
-	.uleb128 0x38
-	.4byte	.LASF2018
+	.uleb128 0x3a
+	.4byte	.LASF2032
 	.byte	0x8f
 	.byte	0x51
 	.4byte	0x6d
@@ -28208,110 +28267,110 @@ __exitcall_ebc_exit:
 	.byte	0x58
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF2019
+	.4byte	.LASF2033
 	.byte	0x1f
 	.2byte	0x93b
-	.4byte	0x91ee
+	.4byte	0x925e
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9107
+	.4byte	0x9177
 	.uleb128 0x15
-	.4byte	.LASF2020
+	.4byte	.LASF2034
 	.byte	0x1f
 	.2byte	0xa1e
-	.4byte	0x524e
+	.4byte	0x52be
 	.uleb128 0x15
-	.4byte	.LASF2021
+	.4byte	.LASF2035
 	.byte	0x1f
 	.2byte	0xa36
 	.4byte	0x20e7
 	.uleb128 0x15
-	.4byte	.LASF2022
+	.4byte	.LASF2036
 	.byte	0x1f
 	.2byte	0xa5b
 	.4byte	0x7c9
 	.uleb128 0x15
-	.4byte	.LASF2023
+	.4byte	.LASF2037
 	.byte	0x1f
 	.2byte	0xa5c
 	.4byte	0x7c9
 	.uleb128 0x5
 	.4byte	0x5c
-	.4byte	0x9234
+	.4byte	0x92a4
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x9224
-	.uleb128 0x46
-	.4byte	.LASF3030
+	.4byte	0x9294
+	.uleb128 0x48
+	.4byte	.LASF3045
 	.byte	0x1f
 	.2byte	0xba2
-	.4byte	0x9234
+	.4byte	0x92a4
 	.uleb128 0x15
-	.4byte	.LASF2024
+	.4byte	.LASF2038
 	.byte	0x1f
 	.2byte	0xc7d
 	.4byte	0x7c9
 	.uleb128 0x15
-	.4byte	.LASF2025
+	.4byte	.LASF2039
 	.byte	0x1f
 	.2byte	0xc89
-	.4byte	0x7db0
+	.4byte	0x7e20
 	.uleb128 0x15
-	.4byte	.LASF2026
+	.4byte	.LASF2040
 	.byte	0x1f
 	.2byte	0xc9a
-	.4byte	0x7db0
+	.4byte	0x7e20
 	.uleb128 0x15
-	.4byte	.LASF2027
+	.4byte	.LASF2041
 	.byte	0x1f
 	.2byte	0xcec
 	.4byte	0x1d68
 	.uleb128 0x15
-	.4byte	.LASF2028
+	.4byte	.LASF2042
 	.byte	0x1f
 	.2byte	0xcf0
 	.4byte	0x7c9
 	.uleb128 0x15
-	.4byte	.LASF2029
+	.4byte	.LASF2043
 	.byte	0x1f
 	.2byte	0xcf1
-	.4byte	0x7db0
+	.4byte	0x7e20
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x2e3
 	.uleb128 0x8
-	.4byte	.LASF2030
+	.4byte	.LASF2044
 	.byte	0x90
 	.byte	0x28
-	.4byte	0x929e
+	.4byte	0x930e
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x92c1
+	.4byte	0x9331
 	.uleb128 0x11
-	.4byte	0x92c1
+	.4byte	0x9331
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
 	.4byte	0x458
 	.uleb128 0x11
-	.4byte	0x928d
+	.4byte	0x92fd
 	.uleb128 0x11
-	.4byte	0x88a2
+	.4byte	0x8912
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x92c7
+	.4byte	0x9337
 	.uleb128 0xd
-	.4byte	.LASF2031
+	.4byte	.LASF2045
 	.byte	0x40
 	.byte	0x90
 	.byte	0x71
-	.4byte	0x9340
+	.4byte	0x93b0
 	.uleb128 0xe
-	.4byte	.LASF2032
+	.4byte	.LASF2046
 	.byte	0x90
 	.byte	0x73
 	.4byte	0x56
@@ -28323,62 +28382,62 @@ __exitcall_ebc_exit:
 	.4byte	0x458
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2033
+	.4byte	.LASF2047
 	.byte	0x90
 	.byte	0x75
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF904
+	.4byte	.LASF918
 	.byte	0x90
 	.byte	0x76
 	.4byte	0x28f
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2034
+	.4byte	.LASF2048
 	.byte	0x90
 	.byte	0x77
-	.4byte	0x92c1
+	.4byte	0x9331
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2030
+	.4byte	.LASF2044
 	.byte	0x90
 	.byte	0x78
-	.4byte	0x9365
+	.4byte	0x93d5
 	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF106
 	.byte	0x90
 	.byte	0x79
-	.4byte	0x936b
+	.4byte	0x93db
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2035
+	.4byte	.LASF2049
 	.byte	0x90
 	.byte	0x7a
 	.4byte	0x458
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2036
+	.4byte	.LASF2050
 	.byte	0x90
 	.byte	0x7b
 	.4byte	0x458
 	.byte	0x38
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2037
+	.4byte	.LASF2051
 	.byte	0x20
 	.byte	0x90
 	.byte	0x5f
-	.4byte	0x9365
+	.4byte	0x93d5
 	.uleb128 0xe
-	.4byte	.LASF2038
+	.4byte	.LASF2052
 	.byte	0x90
 	.byte	0x60
 	.4byte	0x37c
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1101
+	.4byte	.LASF1115
 	.byte	0x90
 	.byte	0x61
 	.4byte	0x15bf
@@ -28386,10 +28445,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9293
+	.4byte	0x9303
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9340
+	.4byte	0x93b0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x2410
@@ -28397,89 +28456,89 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.4byte	0x2430
 	.uleb128 0x5
-	.4byte	0x92c7
-	.4byte	0x9388
+	.4byte	0x9337
+	.4byte	0x93f8
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2039
+	.4byte	.LASF2053
 	.byte	0x90
 	.byte	0xca
-	.4byte	0x937d
+	.4byte	0x93ed
 	.uleb128 0xd
-	.4byte	.LASF2040
+	.4byte	.LASF2054
 	.byte	0x10
 	.byte	0x91
 	.byte	0x1a
-	.4byte	0x93b8
+	.4byte	0x9428
 	.uleb128 0xe
-	.4byte	.LASF1192
+	.4byte	.LASF1206
 	.byte	0x91
 	.byte	0x1b
-	.4byte	0x93bd
+	.4byte	0x942d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2041
+	.4byte	.LASF2055
 	.byte	0x91
 	.byte	0x1c
 	.4byte	0x29
 	.byte	0x8
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF2042
+	.4byte	.LASF2056
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x93b8
+	.4byte	0x9428
 	.uleb128 0x8
-	.4byte	.LASF2043
+	.4byte	.LASF2057
 	.byte	0x8d
 	.byte	0x21
 	.4byte	0x2f9
 	.uleb128 0x8
-	.4byte	.LASF2044
+	.4byte	.LASF2058
 	.byte	0x8d
 	.byte	0x24
 	.4byte	0x304
 	.uleb128 0xd
-	.4byte	.LASF2045
+	.4byte	.LASF2059
 	.byte	0x18
 	.byte	0x8d
 	.byte	0x58
-	.4byte	0x940a
+	.4byte	0x947a
 	.uleb128 0xe
 	.4byte	.LASF193
 	.byte	0x8d
 	.byte	0x59
-	.4byte	0x9414
+	.4byte	0x9484
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2046
+	.4byte	.LASF2060
 	.byte	0x8d
 	.byte	0x5a
 	.4byte	0x56
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2047
+	.4byte	.LASF2061
 	.byte	0x8d
 	.byte	0x5b
 	.4byte	0x2e3
 	.byte	0x10
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF2048
+	.4byte	.LASF2062
 	.uleb128 0x3
-	.4byte	0x940a
+	.4byte	0x947a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x940a
-	.uleb128 0x39
-	.4byte	.LASF2049
+	.4byte	0x947a
+	.uleb128 0x3b
+	.4byte	.LASF2063
 	.byte	0x20
 	.byte	0x8d
 	.byte	0x5e
-	.4byte	0x943d
+	.4byte	0x94ad
 	.uleb128 0x22
-	.4byte	.LASF2050
+	.4byte	.LASF2064
 	.byte	0x8d
 	.byte	0x5f
 	.4byte	0x458
@@ -28487,96 +28546,96 @@ __exitcall_ebc_exit:
 	.4byte	.LASF794
 	.byte	0x8d
 	.byte	0x60
-	.4byte	0x9442
+	.4byte	0x94b2
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x941a
+	.4byte	0x948a
 	.uleb128 0x5
 	.4byte	0x458
-	.4byte	0x9452
+	.4byte	0x94c2
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF2051
+	.4byte	.LASF2065
 	.byte	0x8d
 	.byte	0x83
-	.4byte	0x945d
+	.4byte	0x94cd
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9463
+	.4byte	0x94d3
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9481
+	.4byte	0x94f1
 	.uleb128 0x11
-	.4byte	0x8779
+	.4byte	0x87e9
 	.uleb128 0x11
-	.4byte	0x9481
+	.4byte	0x94f1
 	.uleb128 0x11
-	.4byte	0x9487
+	.4byte	0x94f7
 	.uleb128 0x11
-	.4byte	0x8779
+	.4byte	0x87e9
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x940f
+	.4byte	0x947f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x943d
+	.4byte	0x94ad
 	.uleb128 0xd
-	.4byte	.LASF2052
+	.4byte	.LASF2066
 	.byte	0x18
 	.byte	0x8d
 	.byte	0x88
-	.4byte	0x94be
+	.4byte	0x952e
 	.uleb128 0xe
-	.4byte	.LASF2053
+	.4byte	.LASF2067
 	.byte	0x8d
 	.byte	0x89
-	.4byte	0x9452
+	.4byte	0x94c2
 	.byte	0
 	.uleb128 0x20
 	.string	"key"
 	.byte	0x8d
 	.byte	0x8a
-	.4byte	0x8779
+	.4byte	0x87e9
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2054
+	.4byte	.LASF2068
 	.byte	0x8d
 	.byte	0x8b
-	.4byte	0x9414
+	.4byte	0x9484
 	.byte	0x10
 	.byte	0
 	.uleb128 0x21
 	.byte	0x18
 	.byte	0x8d
 	.byte	0x9e
-	.4byte	0x94dd
+	.4byte	0x954d
 	.uleb128 0x22
-	.4byte	.LASF2055
+	.4byte	.LASF2069
 	.byte	0x8d
 	.byte	0x9f
 	.4byte	0x3a7
 	.uleb128 0x22
-	.4byte	.LASF2056
+	.4byte	.LASF2070
 	.byte	0x8d
 	.byte	0xa0
-	.4byte	0x34e2
+	.4byte	0x3552
 	.byte	0
 	.uleb128 0x21
 	.byte	0x8
 	.byte	0x8d
 	.byte	0xa5
-	.4byte	0x94fc
+	.4byte	0x956c
 	.uleb128 0x22
-	.4byte	.LASF2057
+	.4byte	.LASF2071
 	.byte	0x8d
 	.byte	0xa6
 	.4byte	0x9d2
 	.uleb128 0x22
-	.4byte	.LASF2058
+	.4byte	.LASF2072
 	.byte	0x8d
 	.byte	0xa7
 	.4byte	0x9d2
@@ -28585,15 +28644,15 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x8d
 	.byte	0xcc
-	.4byte	0x951d
+	.4byte	0x958d
 	.uleb128 0xe
 	.4byte	.LASF193
 	.byte	0x8d
 	.byte	0xcd
-	.4byte	0x9414
+	.4byte	0x9484
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2046
+	.4byte	.LASF2060
 	.byte	0x8d
 	.byte	0xce
 	.4byte	0x21e
@@ -28603,65 +28662,65 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0x8d
 	.byte	0xca
-	.4byte	0x9536
+	.4byte	0x95a6
 	.uleb128 0x22
-	.4byte	.LASF2059
+	.4byte	.LASF2073
 	.byte	0x8d
 	.byte	0xcb
-	.4byte	0x93d9
+	.4byte	0x9449
 	.uleb128 0x29
-	.4byte	0x94fc
+	.4byte	0x956c
 	.byte	0
 	.uleb128 0xf
 	.byte	0x20
 	.byte	0x8d
 	.byte	0xd8
-	.4byte	0x9557
+	.4byte	0x95c7
 	.uleb128 0xe
-	.4byte	.LASF2060
+	.4byte	.LASF2074
 	.byte	0x8d
 	.byte	0xda
 	.4byte	0x3a7
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2061
+	.4byte	.LASF2075
 	.byte	0x8d
 	.byte	0xdb
-	.4byte	0x9393
+	.4byte	0x9403
 	.byte	0x10
 	.byte	0
 	.uleb128 0x21
 	.byte	0x20
 	.byte	0x8d
 	.byte	0xd6
-	.4byte	0x9570
+	.4byte	0x95e0
 	.uleb128 0x22
-	.4byte	.LASF2062
+	.4byte	.LASF2076
 	.byte	0x8d
 	.byte	0xd7
-	.4byte	0x941a
+	.4byte	0x948a
 	.uleb128 0x29
-	.4byte	0x9536
+	.4byte	0x95a6
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF2063
+	.4byte	.LASF2077
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9570
+	.4byte	0x95e0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x948d
+	.4byte	0x94fd
 	.uleb128 0x15
-	.4byte	.LASF2064
+	.4byte	.LASF2078
 	.byte	0x8d
 	.2byte	0x190
-	.4byte	0x937d
+	.4byte	0x93ed
 	.uleb128 0xd
-	.4byte	.LASF2065
+	.4byte	.LASF2079
 	.byte	0x28
 	.byte	0x92
 	.byte	0xf
-	.4byte	0x95ee
+	.4byte	0x965e
 	.uleb128 0xe
 	.4byte	.LASF116
 	.byte	0x92
@@ -28669,31 +28728,31 @@ __exitcall_ebc_exit:
 	.4byte	0xe33
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2066
+	.4byte	.LASF2080
 	.byte	0x92
 	.byte	0x12
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF2067
+	.4byte	.LASF2081
 	.byte	0x92
 	.byte	0x13
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2068
+	.4byte	.LASF2082
 	.byte	0x92
 	.byte	0x14
 	.4byte	0xc6
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF2069
+	.4byte	.LASF2083
 	.byte	0x92
 	.byte	0x15
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2070
+	.4byte	.LASF2084
 	.byte	0x92
 	.byte	0x16
 	.4byte	0x29
@@ -28706,21 +28765,21 @@ __exitcall_ebc_exit:
 	.byte	0x20
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2071
+	.4byte	.LASF2085
 	.byte	0x92
 	.byte	0x4a
-	.4byte	0x958d
+	.4byte	0x95fd
 	.uleb128 0x19
-	.4byte	.LASF2072
+	.4byte	.LASF2086
 	.byte	0x64
 	.byte	0x3b
-	.4byte	0x3b94
+	.4byte	0x3c04
 	.uleb128 0xd
-	.4byte	.LASF1120
+	.4byte	.LASF1134
 	.byte	0x8
 	.byte	0x6a
 	.byte	0x1e
-	.4byte	0x9635
+	.4byte	0x96a5
 	.uleb128 0xe
 	.4byte	.LASF580
 	.byte	0x6a
@@ -28728,7 +28787,7 @@ __exitcall_ebc_exit:
 	.4byte	0x37c
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2073
+	.4byte	.LASF2087
 	.byte	0x6a
 	.byte	0x20
 	.4byte	0xc6
@@ -28737,27 +28796,27 @@ __exitcall_ebc_exit:
 	.string	"gid"
 	.byte	0x6a
 	.byte	0x21
-	.4byte	0x9635
+	.4byte	0x96a5
 	.byte	0x8
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x2430
-	.4byte	0x9644
-	.uleb128 0x44
+	.4byte	0x96b4
+	.uleb128 0x46
 	.4byte	0x4f
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2074
+	.4byte	.LASF2088
 	.byte	0x6a
 	.byte	0x3d
-	.4byte	0x9604
+	.4byte	0x9674
 	.uleb128 0x21
 	.byte	0x10
 	.byte	0x6a
 	.byte	0x9a
-	.4byte	0x966e
+	.4byte	0x96de
 	.uleb128 0x22
-	.4byte	.LASF2075
+	.4byte	.LASF2089
 	.byte	0x6a
 	.byte	0x9b
 	.4byte	0xc6
@@ -28769,114 +28828,114 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9604
+	.4byte	0x9674
 	.uleb128 0xd
-	.4byte	.LASF2076
+	.4byte	.LASF2090
 	.byte	0x20
 	.byte	0x8e
 	.byte	0x20
-	.4byte	0x96b1
+	.4byte	0x9721
 	.uleb128 0xe
-	.4byte	.LASF1881
+	.4byte	.LASF1895
 	.byte	0x8e
 	.byte	0x21
-	.4byte	0x96d6
+	.4byte	0x9746
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2077
+	.4byte	.LASF2091
 	.byte	0x8e
 	.byte	0x22
-	.4byte	0x96ec
+	.4byte	0x975c
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF64
 	.byte	0x8e
 	.byte	0x23
-	.4byte	0x970b
+	.4byte	0x977b
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2078
+	.4byte	.LASF2092
 	.byte	0x8e
 	.byte	0x24
-	.4byte	0x9725
+	.4byte	0x9795
 	.byte	0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x9674
+	.4byte	0x96e4
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x96b1
+	.4byte	0x9721
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5557
+	.4byte	0x55c7
 	.uleb128 0x14
 	.4byte	0x458
-	.4byte	0x96d6
+	.4byte	0x9746
 	.uleb128 0x11
-	.4byte	0x8ad3
+	.4byte	0x8b43
 	.uleb128 0x11
-	.4byte	0x88a2
+	.4byte	0x8912
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x96c2
+	.4byte	0x9732
 	.uleb128 0x10
-	.4byte	0x96ec
+	.4byte	0x975c
 	.uleb128 0x11
-	.4byte	0x8ad3
+	.4byte	0x8b43
 	.uleb128 0x11
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x96dc
+	.4byte	0x974c
 	.uleb128 0x14
 	.4byte	0x458
-	.4byte	0x970b
+	.4byte	0x977b
 	.uleb128 0x11
-	.4byte	0x8ad3
+	.4byte	0x8b43
 	.uleb128 0x11
 	.4byte	0x458
 	.uleb128 0x11
-	.4byte	0x88a2
+	.4byte	0x8912
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x96f2
+	.4byte	0x9762
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9725
+	.4byte	0x9795
 	.uleb128 0x11
-	.4byte	0x8ad3
+	.4byte	0x8b43
 	.uleb128 0x11
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9711
+	.4byte	0x9781
 	.uleb128 0x19
-	.4byte	.LASF2079
+	.4byte	.LASF2093
 	.byte	0x93
 	.byte	0x28
 	.4byte	0x1995
 	.uleb128 0x19
-	.4byte	.LASF2080
+	.4byte	.LASF2094
 	.byte	0x94
 	.byte	0x18
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF2081
+	.4byte	.LASF2095
 	.byte	0x94
 	.byte	0x38
 	.4byte	0x29
 	.uleb128 0xd
-	.4byte	.LASF2082
+	.4byte	.LASF2096
 	.byte	0x60
 	.byte	0xf
 	.byte	0x14
-	.4byte	0x97e9
+	.4byte	0x9859
 	.uleb128 0xe
-	.4byte	.LASF1881
+	.4byte	.LASF1895
 	.byte	0xf
 	.byte	0x15
 	.4byte	0x351
@@ -28909,19 +28968,19 @@ __exitcall_ebc_exit:
 	.4byte	.LASF640
 	.byte	0xf
 	.byte	0x1a
-	.4byte	0x97ee
+	.4byte	0x985e
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF642
 	.byte	0xf
 	.byte	0x1a
-	.4byte	0x97ee
+	.4byte	0x985e
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2034
+	.4byte	.LASF2048
 	.byte	0xf
 	.byte	0x1a
-	.4byte	0x97ee
+	.4byte	0x985e
 	.byte	0x38
 	.uleb128 0xe
 	.4byte	.LASF130
@@ -28949,74 +29008,74 @@ __exitcall_ebc_exit:
 	.byte	0x58
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x974c
+	.4byte	0x97bc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x974c
+	.4byte	0x97bc
 	.uleb128 0x19
-	.4byte	.LASF2083
+	.4byte	.LASF2097
 	.byte	0xf
 	.byte	0xaf
-	.4byte	0x974c
+	.4byte	0x97bc
 	.uleb128 0x19
-	.4byte	.LASF2084
+	.4byte	.LASF2098
 	.byte	0xf
 	.byte	0xb0
-	.4byte	0x974c
+	.4byte	0x97bc
 	.uleb128 0x32
 	.string	"idr"
 	.byte	0x18
 	.byte	0x95
 	.byte	0x13
-	.4byte	0x983b
+	.4byte	0x98ab
 	.uleb128 0xe
-	.4byte	.LASF2085
+	.4byte	.LASF2099
 	.byte	0x95
 	.byte	0x14
-	.4byte	0x4dd9
+	.4byte	0x4e49
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2086
+	.4byte	.LASF2100
 	.byte	0x95
 	.byte	0x15
 	.4byte	0x6d
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2087
+	.4byte	.LASF2101
 	.byte	0x95
 	.byte	0x16
 	.4byte	0x6d
 	.byte	0x14
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2088
+	.4byte	.LASF2102
 	.byte	0x80
 	.byte	0x95
 	.byte	0xe0
-	.4byte	0x9854
+	.4byte	0x98c4
 	.uleb128 0xe
-	.4byte	.LASF2089
+	.4byte	.LASF2103
 	.byte	0x95
 	.byte	0xe1
 	.4byte	0x17e
 	.byte	0
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2088
+	.4byte	.LASF2102
 	.byte	0x95
 	.byte	0xe4
-	.4byte	0x985f
+	.4byte	0x98cf
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x983b
+	.4byte	0x98ab
 	.uleb128 0xd
-	.4byte	.LASF2090
+	.4byte	.LASF2104
 	.byte	0x18
 	.byte	0x96
 	.byte	0x54
-	.4byte	0x9896
+	.4byte	0x9906
 	.uleb128 0xe
-	.4byte	.LASF2091
+	.4byte	.LASF2105
 	.byte	0x96
 	.byte	0x55
 	.4byte	0x29
@@ -29025,26 +29084,26 @@ __exitcall_ebc_exit:
 	.4byte	.LASF641
 	.byte	0x96
 	.byte	0x57
-	.4byte	0x3519
+	.4byte	0x3589
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1192
+	.4byte	.LASF1206
 	.byte	0x96
 	.byte	0x5d
-	.4byte	0x9902
+	.4byte	0x9972
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2092
+	.4byte	.LASF2106
 	.byte	0x60
 	.byte	0x96
 	.byte	0xbd
-	.4byte	0x9902
+	.4byte	0x9972
 	.uleb128 0x20
 	.string	"kn"
 	.byte	0x96
 	.byte	0xbf
-	.4byte	0x99c1
+	.4byte	0x9a31
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF171
@@ -29053,37 +29112,37 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2093
+	.4byte	.LASF2107
 	.byte	0x96
 	.byte	0xc3
-	.4byte	0x980a
+	.4byte	0x987a
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2094
+	.4byte	.LASF2108
 	.byte	0x96
 	.byte	0xc4
 	.4byte	0x13f
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2095
+	.4byte	.LASF2109
 	.byte	0x96
 	.byte	0xc5
 	.4byte	0x13f
 	.byte	0x2c
 	.uleb128 0xe
-	.4byte	.LASF2096
+	.4byte	.LASF2110
 	.byte	0x96
 	.byte	0xc6
-	.4byte	0x9c78
+	.4byte	0x9ce8
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2097
+	.4byte	.LASF2111
 	.byte	0x96
 	.byte	0xc9
 	.4byte	0x3a7
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2098
+	.4byte	.LASF2112
 	.byte	0x96
 	.byte	0xcb
 	.4byte	0x15bf
@@ -29091,26 +29150,26 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9896
+	.4byte	0x9906
 	.uleb128 0xd
-	.4byte	.LASF2099
+	.4byte	.LASF2113
 	.byte	0x8
 	.byte	0x96
 	.byte	0x60
-	.4byte	0x9921
+	.4byte	0x9991
 	.uleb128 0xe
-	.4byte	.LASF2100
+	.4byte	.LASF2114
 	.byte	0x96
 	.byte	0x61
-	.4byte	0x99c1
+	.4byte	0x9a31
 	.byte	0
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2101
+	.4byte	.LASF2115
 	.byte	0x80
 	.byte	0x96
 	.byte	0x83
-	.4byte	0x99c1
+	.4byte	0x9a31
 	.uleb128 0xe
 	.4byte	.LASF383
 	.byte	0x96
@@ -29118,7 +29177,7 @@ __exitcall_ebc_exit:
 	.4byte	0x37c
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF882
+	.4byte	.LASF896
 	.byte	0x96
 	.byte	0x85
 	.4byte	0x37c
@@ -29127,7 +29186,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF640
 	.byte	0x96
 	.byte	0x8f
-	.4byte	0x99c1
+	.4byte	0x9a31
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF265
@@ -29139,7 +29198,7 @@ __exitcall_ebc_exit:
 	.string	"rb"
 	.byte	0x96
 	.byte	0x92
-	.4byte	0x34e2
+	.4byte	0x3552
 	.byte	0x18
 	.uleb128 0x20
 	.string	"ns"
@@ -29154,10 +29213,10 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0x38
 	.uleb128 0x23
-	.4byte	0x9b13
+	.4byte	0x9b83
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2102
+	.4byte	.LASF2116
 	.byte	0x96
 	.byte	0x9c
 	.4byte	0x458
@@ -29166,7 +29225,7 @@ __exitcall_ebc_exit:
 	.string	"id"
 	.byte	0x96
 	.byte	0x9e
-	.4byte	0x9af7
+	.4byte	0x9b67
 	.byte	0x68
 	.uleb128 0xe
 	.4byte	.LASF171
@@ -29175,108 +29234,108 @@ __exitcall_ebc_exit:
 	.4byte	0xb4
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF904
+	.4byte	.LASF918
 	.byte	0x96
 	.byte	0xa0
 	.4byte	0x28f
 	.byte	0x72
 	.uleb128 0xe
-	.4byte	.LASF1434
+	.4byte	.LASF1448
 	.byte	0x96
 	.byte	0xa1
-	.4byte	0x9b42
+	.4byte	0x9bb2
 	.byte	0x78
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9921
+	.4byte	0x9991
 	.uleb128 0xd
-	.4byte	.LASF2103
+	.4byte	.LASF2117
 	.byte	0x20
 	.byte	0x96
 	.byte	0x64
-	.4byte	0x9a04
+	.4byte	0x9a74
 	.uleb128 0x20
 	.string	"ops"
 	.byte	0x96
 	.byte	0x65
-	.4byte	0x9ac5
+	.4byte	0x9b35
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF111
 	.byte	0x96
 	.byte	0x66
-	.4byte	0x9ad0
+	.4byte	0x9b40
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF987
+	.4byte	.LASF1001
 	.byte	0x96
 	.byte	0x67
 	.4byte	0x2d8
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2104
+	.4byte	.LASF2118
 	.byte	0x96
 	.byte	0x68
-	.4byte	0x99c1
+	.4byte	0x9a31
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2105
+	.4byte	.LASF2119
 	.byte	0x70
 	.byte	0x96
 	.byte	0xe2
-	.4byte	0x9ac0
+	.4byte	0x9b30
 	.uleb128 0xe
 	.4byte	.LASF111
 	.byte	0x96
 	.byte	0xe7
-	.4byte	0x9d41
+	.4byte	0x9db1
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF113
 	.byte	0x96
 	.byte	0xe8
-	.4byte	0x9d52
+	.4byte	0x9dc2
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2106
+	.4byte	.LASF2120
 	.byte	0x96
 	.byte	0xf5
-	.4byte	0x9725
+	.4byte	0x9795
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2107
+	.4byte	.LASF2121
 	.byte	0x96
 	.byte	0xf7
-	.4byte	0x96d6
+	.4byte	0x9746
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2108
+	.4byte	.LASF2122
 	.byte	0x96
 	.byte	0xf8
-	.4byte	0x970b
+	.4byte	0x977b
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2109
+	.4byte	.LASF2123
 	.byte	0x96
 	.byte	0xf9
-	.4byte	0x96ec
+	.4byte	0x975c
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF100
 	.byte	0x96
 	.byte	0xfb
-	.4byte	0x9d76
+	.4byte	0x9de6
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF2110
+	.4byte	.LASF2124
 	.byte	0x96
 	.2byte	0x105
 	.4byte	0x2e3
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF2111
+	.4byte	.LASF2125
 	.byte	0x96
 	.2byte	0x10c
 	.4byte	0x2b0
@@ -29285,19 +29344,19 @@ __exitcall_ebc_exit:
 	.4byte	.LASF101
 	.byte	0x96
 	.2byte	0x10d
-	.4byte	0x9d76
+	.4byte	0x9de6
 	.byte	0x48
 	.uleb128 0x1b
 	.4byte	.LASF106
 	.byte	0x96
 	.2byte	0x110
-	.4byte	0x9d90
+	.4byte	0x9e00
 	.byte	0x50
 	.uleb128 0x1b
 	.4byte	.LASF109
 	.byte	0x96
 	.2byte	0x113
-	.4byte	0x9daa
+	.4byte	0x9e1a
 	.byte	0x58
 	.uleb128 0x1b
 	.4byte	.LASF130
@@ -29313,20 +29372,20 @@ __exitcall_ebc_exit:
 	.byte	0x68
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x9a04
+	.4byte	0x9a74
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9ac0
+	.4byte	0x9b30
 	.uleb128 0x24
-	.4byte	.LASF2112
+	.4byte	.LASF2126
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9acb
+	.4byte	0x9b3b
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x96
 	.byte	0x6d
-	.4byte	0x9af7
+	.4byte	0x9b67
 	.uleb128 0x20
 	.string	"ino"
 	.byte	0x96
@@ -29334,20 +29393,20 @@ __exitcall_ebc_exit:
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2113
+	.4byte	.LASF2127
 	.byte	0x96
 	.byte	0x75
 	.4byte	0x13f
 	.byte	0x4
 	.byte	0
-	.uleb128 0x39
-	.4byte	.LASF2114
+	.uleb128 0x3b
+	.4byte	.LASF2128
 	.byte	0x8
 	.byte	0x96
 	.byte	0x6c
-	.4byte	0x9b13
+	.4byte	0x9b83
 	.uleb128 0x29
-	.4byte	0x9ad6
+	.4byte	0x9b46
 	.uleb128 0x28
 	.string	"id"
 	.byte	0x96
@@ -29358,69 +29417,69 @@ __exitcall_ebc_exit:
 	.byte	0x20
 	.byte	0x96
 	.byte	0x96
-	.4byte	0x9b3d
+	.4byte	0x9bad
 	.uleb128 0x28
 	.string	"dir"
 	.byte	0x96
 	.byte	0x97
-	.4byte	0x9865
+	.4byte	0x98d5
 	.uleb128 0x22
-	.4byte	.LASF1855
+	.4byte	.LASF1869
 	.byte	0x96
 	.byte	0x98
-	.4byte	0x9908
+	.4byte	0x9978
 	.uleb128 0x22
-	.4byte	.LASF2115
+	.4byte	.LASF2129
 	.byte	0x96
 	.byte	0x99
-	.4byte	0x99c7
+	.4byte	0x9a37
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF2116
+	.4byte	.LASF2130
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9b3d
+	.4byte	0x9bad
 	.uleb128 0xd
-	.4byte	.LASF2117
+	.4byte	.LASF2131
 	.byte	0x50
 	.byte	0x96
 	.byte	0xab
-	.4byte	0x9bcd
+	.4byte	0x9c3d
 	.uleb128 0xe
-	.4byte	.LASF1966
+	.4byte	.LASF1980
 	.byte	0x96
 	.byte	0xac
-	.4byte	0x9be6
+	.4byte	0x9c56
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1972
+	.4byte	.LASF1986
 	.byte	0x96
 	.byte	0xad
-	.4byte	0x9c00
+	.4byte	0x9c70
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1856
+	.4byte	.LASF1870
 	.byte	0x96
 	.byte	0xaf
-	.4byte	0x9c1f
+	.4byte	0x9c8f
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1857
+	.4byte	.LASF1871
 	.byte	0x96
 	.byte	0xb1
-	.4byte	0x9c34
+	.4byte	0x9ca4
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1859
+	.4byte	.LASF1873
 	.byte	0x96
 	.byte	0xb2
-	.4byte	0x9c53
+	.4byte	0x9cc3
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1975
+	.4byte	.LASF1989
 	.byte	0x96
 	.byte	0xb4
-	.4byte	0x9c72
+	.4byte	0x9ce2
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF130
@@ -29449,33 +29508,33 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9be6
+	.4byte	0x9c56
 	.uleb128 0x11
-	.4byte	0x9902
+	.4byte	0x9972
 	.uleb128 0x11
-	.4byte	0x467e
+	.4byte	0x46ee
 	.uleb128 0x11
 	.4byte	0x21e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9bcd
+	.4byte	0x9c3d
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9c00
+	.4byte	0x9c70
 	.uleb128 0x11
-	.4byte	0x8ad3
+	.4byte	0x8b43
 	.uleb128 0x11
-	.4byte	0x9902
+	.4byte	0x9972
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9bec
+	.4byte	0x9c5c
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9c1f
+	.4byte	0x9c8f
 	.uleb128 0x11
-	.4byte	0x99c1
+	.4byte	0x9a31
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
@@ -29483,71 +29542,71 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9c06
+	.4byte	0x9c76
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9c34
+	.4byte	0x9ca4
 	.uleb128 0x11
-	.4byte	0x99c1
+	.4byte	0x9a31
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9c25
+	.4byte	0x9c95
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9c53
+	.4byte	0x9cc3
 	.uleb128 0x11
-	.4byte	0x99c1
+	.4byte	0x9a31
 	.uleb128 0x11
-	.4byte	0x99c1
+	.4byte	0x9a31
 	.uleb128 0x11
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9c3a
+	.4byte	0x9caa
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9c72
+	.4byte	0x9ce2
 	.uleb128 0x11
-	.4byte	0x8ad3
+	.4byte	0x8b43
 	.uleb128 0x11
-	.4byte	0x99c1
+	.4byte	0x9a31
 	.uleb128 0x11
-	.4byte	0x9902
+	.4byte	0x9972
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9c59
+	.4byte	0x9cc9
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9b48
+	.4byte	0x9bb8
 	.uleb128 0xd
-	.4byte	.LASF2118
+	.4byte	.LASF2132
 	.byte	0x98
 	.byte	0x96
 	.byte	0xce
-	.4byte	0x9d2c
+	.4byte	0x9d9c
 	.uleb128 0x20
 	.string	"kn"
 	.byte	0x96
 	.byte	0xd0
-	.4byte	0x99c1
+	.4byte	0x9a31
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1273
+	.4byte	.LASF1287
 	.byte	0x96
 	.byte	0xd1
-	.4byte	0x555c
+	.4byte	0x55cc
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2004
+	.4byte	.LASF2018
 	.byte	0x96
 	.byte	0xd2
-	.4byte	0x8ad3
+	.4byte	0x8b43
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2102
+	.4byte	.LASF2116
 	.byte	0x96
 	.byte	0xd3
 	.4byte	0x458
@@ -29559,37 +29618,37 @@ __exitcall_ebc_exit:
 	.4byte	0x246a
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2119
+	.4byte	.LASF2133
 	.byte	0x96
 	.byte	0xd7
 	.4byte	0x246a
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2038
+	.4byte	.LASF2052
 	.byte	0x96
 	.byte	0xd8
 	.4byte	0xc6
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF962
+	.4byte	.LASF976
 	.byte	0x96
 	.byte	0xd9
 	.4byte	0x3a7
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2120
+	.4byte	.LASF2134
 	.byte	0x96
 	.byte	0xda
 	.4byte	0x21e
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2110
+	.4byte	.LASF2124
 	.byte	0x96
 	.byte	0xdc
 	.4byte	0x2e3
 	.byte	0x80
-	.uleb128 0x38
-	.4byte	.LASF2121
+	.uleb128 0x3a
+	.4byte	.LASF2135
 	.byte	0x96
 	.byte	0xdd
 	.4byte	0x2b0
@@ -29597,8 +29656,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x7
 	.byte	0x88
-	.uleb128 0x38
-	.4byte	.LASF2122
+	.uleb128 0x3a
+	.4byte	.LASF2136
 	.byte	0x96
 	.byte	0xde
 	.4byte	0x2b0
@@ -29607,37 +29666,37 @@ __exitcall_ebc_exit:
 	.byte	0x6
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF977
+	.4byte	.LASF991
 	.byte	0x96
 	.byte	0xdf
-	.4byte	0x56ab
+	.4byte	0x571b
 	.byte	0x90
 	.byte	0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9d3b
+	.4byte	0x9dab
 	.uleb128 0x11
-	.4byte	0x9d3b
+	.4byte	0x9dab
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9c7e
+	.4byte	0x9cee
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9d2c
+	.4byte	0x9d9c
 	.uleb128 0x10
-	.4byte	0x9d52
+	.4byte	0x9dc2
 	.uleb128 0x11
-	.4byte	0x9d3b
+	.4byte	0x9dab
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9d47
+	.4byte	0x9db7
 	.uleb128 0x14
 	.4byte	0x2ee
-	.4byte	0x9d76
+	.4byte	0x9de6
 	.uleb128 0x11
-	.4byte	0x9d3b
+	.4byte	0x9dab
 	.uleb128 0x11
 	.4byte	0x21e
 	.uleb128 0x11
@@ -29647,121 +29706,121 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9d58
+	.4byte	0x9dc8
 	.uleb128 0x14
 	.4byte	0x244
-	.4byte	0x9d90
+	.4byte	0x9e00
 	.uleb128 0x11
-	.4byte	0x9d3b
+	.4byte	0x9dab
 	.uleb128 0x11
-	.4byte	0x8900
+	.4byte	0x8970
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9d7c
+	.4byte	0x9dec
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9daa
+	.4byte	0x9e1a
 	.uleb128 0x11
-	.4byte	0x9d3b
+	.4byte	0x9dab
 	.uleb128 0x11
-	.4byte	0x3cb5
+	.4byte	0x3d25
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9d96
+	.4byte	0x9e06
 	.uleb128 0x1f
-	.4byte	.LASF2123
+	.4byte	.LASF2137
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x97
 	.byte	0x1a
-	.4byte	0x9dd3
+	.4byte	0x9e43
 	.uleb128 0xc
-	.4byte	.LASF2124
+	.4byte	.LASF2138
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2125
+	.4byte	.LASF2139
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2126
+	.4byte	.LASF2140
 	.byte	0x2
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2127
+	.4byte	.LASF2141
 	.byte	0x30
 	.byte	0x97
 	.byte	0x27
-	.4byte	0x9e28
+	.4byte	0x9e98
 	.uleb128 0xe
 	.4byte	.LASF193
 	.byte	0x97
 	.byte	0x28
-	.4byte	0x9db0
+	.4byte	0x9e20
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2128
+	.4byte	.LASF2142
 	.byte	0x97
 	.byte	0x29
-	.4byte	0x9e32
+	.4byte	0x9ea2
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2129
+	.4byte	.LASF2143
 	.byte	0x97
 	.byte	0x2a
-	.4byte	0x90f1
+	.4byte	0x9161
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2130
+	.4byte	.LASF2144
 	.byte	0x97
 	.byte	0x2b
-	.4byte	0x9e52
+	.4byte	0x9ec2
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2131
+	.4byte	.LASF2145
 	.byte	0x97
 	.byte	0x2c
-	.4byte	0x9e5d
+	.4byte	0x9ecd
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2132
+	.4byte	.LASF2146
 	.byte	0x97
 	.byte	0x2d
 	.4byte	0x2f35
 	.byte	0x28
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x9dd3
+	.4byte	0x9e43
 	.uleb128 0x16
 	.4byte	0x2b0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9e2d
+	.4byte	0x9e9d
 	.uleb128 0x14
 	.4byte	0x30bc
-	.4byte	0x9e47
+	.4byte	0x9eb7
 	.uleb128 0x11
-	.4byte	0x9e47
+	.4byte	0x9eb7
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9e4d
+	.4byte	0x9ebd
 	.uleb128 0x24
-	.4byte	.LASF2133
+	.4byte	.LASF2147
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9e38
+	.4byte	0x9ea8
 	.uleb128 0x16
 	.4byte	0x30bc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9e58
+	.4byte	0x9ec8
 	.uleb128 0xd
-	.4byte	.LASF2134
+	.4byte	.LASF2148
 	.byte	0x10
 	.byte	0x98
 	.byte	0x1e
-	.4byte	0x9e88
+	.4byte	0x9ef8
 	.uleb128 0xe
 	.4byte	.LASF265
 	.byte	0x98
@@ -29769,18 +29828,18 @@ __exitcall_ebc_exit:
 	.4byte	0x56
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF904
+	.4byte	.LASF918
 	.byte	0x98
 	.byte	0x20
 	.4byte	0x28f
 	.byte	0x8
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2135
+	.4byte	.LASF2149
 	.byte	0x28
 	.byte	0x98
 	.byte	0x54
-	.4byte	0x9ed1
+	.4byte	0x9f41
 	.uleb128 0xe
 	.4byte	.LASF265
 	.byte	0x98
@@ -29788,75 +29847,75 @@ __exitcall_ebc_exit:
 	.4byte	0x56
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2136
+	.4byte	.LASF2150
 	.byte	0x98
 	.byte	0x56
-	.4byte	0x9ef5
+	.4byte	0x9f65
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2137
+	.4byte	.LASF2151
 	.byte	0x98
 	.byte	0x58
-	.4byte	0x9f6f
+	.4byte	0x9fdf
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2138
+	.4byte	.LASF2152
 	.byte	0x98
 	.byte	0x5a
-	.4byte	0x9f75
+	.4byte	0x9fe5
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2139
+	.4byte	.LASF2153
 	.byte	0x98
 	.byte	0x5b
-	.4byte	0x9f7b
+	.4byte	0x9feb
 	.byte	0x20
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x9e88
+	.4byte	0x9ef8
 	.uleb128 0x14
 	.4byte	0x28f
-	.4byte	0x9eef
+	.4byte	0x9f5f
 	.uleb128 0x11
-	.4byte	0x91ee
+	.4byte	0x925e
 	.uleb128 0x11
-	.4byte	0x9eef
+	.4byte	0x9f5f
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9e63
+	.4byte	0x9ed3
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9ed6
+	.4byte	0x9f46
 	.uleb128 0x14
 	.4byte	0x28f
-	.4byte	0x9f14
+	.4byte	0x9f84
 	.uleb128 0x11
-	.4byte	0x91ee
+	.4byte	0x925e
 	.uleb128 0x11
-	.4byte	0x9f14
+	.4byte	0x9f84
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9f1a
+	.4byte	0x9f8a
 	.uleb128 0xd
-	.4byte	.LASF2140
+	.4byte	.LASF2154
 	.byte	0x38
 	.byte	0x98
 	.byte	0xa1
-	.4byte	0x9f6f
+	.4byte	0x9fdf
 	.uleb128 0xe
-	.4byte	.LASF2115
+	.4byte	.LASF2129
 	.byte	0x98
 	.byte	0xa2
-	.4byte	0x9e63
+	.4byte	0x9ed3
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF987
+	.4byte	.LASF1001
 	.byte	0x98
 	.byte	0xa3
 	.4byte	0x2e3
@@ -29871,39 +29930,39 @@ __exitcall_ebc_exit:
 	.4byte	.LASF100
 	.byte	0x98
 	.byte	0xa5
-	.4byte	0x9fa9
+	.4byte	0xa019
 	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF101
 	.byte	0x98
 	.byte	0xa7
-	.4byte	0x9fa9
+	.4byte	0xa019
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF109
 	.byte	0x98
 	.byte	0xa9
-	.4byte	0x9fcd
+	.4byte	0xa03d
 	.byte	0x30
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9efb
+	.4byte	0x9f6b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9eef
+	.4byte	0x9f5f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9f14
+	.4byte	0x9f84
 	.uleb128 0x14
 	.4byte	0x2ee
-	.4byte	0x9fa9
+	.4byte	0xa019
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
-	.4byte	0x91ee
+	.4byte	0x925e
 	.uleb128 0x11
-	.4byte	0x9f14
+	.4byte	0x9f84
 	.uleb128 0x11
 	.4byte	0x21e
 	.uleb128 0x11
@@ -29913,63 +29972,63 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9f81
+	.4byte	0x9ff1
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9fcd
+	.4byte	0xa03d
 	.uleb128 0x11
-	.4byte	0x555c
+	.4byte	0x55cc
 	.uleb128 0x11
-	.4byte	0x91ee
+	.4byte	0x925e
 	.uleb128 0x11
-	.4byte	0x9f14
+	.4byte	0x9f84
 	.uleb128 0x11
-	.4byte	0x3cb5
+	.4byte	0x3d25
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9faf
+	.4byte	0xa01f
 	.uleb128 0xd
-	.4byte	.LASF2141
+	.4byte	.LASF2155
 	.byte	0x10
 	.byte	0x98
 	.byte	0xd6
-	.4byte	0x9ff8
+	.4byte	0xa068
 	.uleb128 0xe
-	.4byte	.LASF2078
+	.4byte	.LASF2092
 	.byte	0x98
 	.byte	0xd7
-	.4byte	0xa016
+	.4byte	0xa086
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2142
+	.4byte	.LASF2156
 	.byte	0x98
 	.byte	0xd8
-	.4byte	0xa03a
+	.4byte	0xa0aa
 	.byte	0x8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x9fd3
+	.4byte	0xa043
 	.uleb128 0x14
 	.4byte	0x2ee
-	.4byte	0xa016
+	.4byte	0xa086
 	.uleb128 0x11
-	.4byte	0x91ee
+	.4byte	0x925e
 	.uleb128 0x11
-	.4byte	0x9eef
+	.4byte	0x9f5f
 	.uleb128 0x11
 	.4byte	0x21e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9ffd
+	.4byte	0xa06d
 	.uleb128 0x14
 	.4byte	0x2ee
-	.4byte	0xa03a
+	.4byte	0xa0aa
 	.uleb128 0x11
-	.4byte	0x91ee
+	.4byte	0x925e
 	.uleb128 0x11
-	.4byte	0x9eef
+	.4byte	0x9f5f
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
@@ -29977,59 +30036,59 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa01c
+	.4byte	0xa08c
 	.uleb128 0xd
-	.4byte	.LASF2013
+	.4byte	.LASF2027
 	.byte	0x4
 	.byte	0x99
 	.byte	0x15
-	.4byte	0xa059
+	.4byte	0xa0c9
 	.uleb128 0xe
-	.4byte	.LASF1127
+	.4byte	.LASF1141
 	.byte	0x99
 	.byte	0x16
-	.4byte	0x3392
+	.4byte	0x3402
 	.byte	0
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2143
+	.4byte	.LASF2157
 	.byte	0x8f
 	.byte	0x26
 	.4byte	0x500
 	.uleb128 0x19
-	.4byte	.LASF2144
+	.4byte	.LASF2158
 	.byte	0x8f
 	.byte	0x2a
 	.4byte	0x15a
 	.uleb128 0xd
-	.4byte	.LASF2011
+	.4byte	.LASF2025
 	.byte	0xa0
 	.byte	0x8f
 	.byte	0xcb
-	.4byte	0xa0dc
+	.4byte	0xa14c
 	.uleb128 0xe
-	.4byte	.LASF962
+	.4byte	.LASF976
 	.byte	0x8f
 	.byte	0xcc
 	.4byte	0x3a7
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2145
+	.4byte	.LASF2159
 	.byte	0x8f
 	.byte	0xcd
 	.4byte	0xe65
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2146
+	.4byte	.LASF2160
 	.byte	0x8f
 	.byte	0xce
-	.4byte	0x9107
+	.4byte	0x9177
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2147
+	.4byte	.LASF2161
 	.byte	0x8f
 	.byte	0xcf
-	.4byte	0xa370
+	.4byte	0xa3e0
 	.byte	0x78
 	.uleb128 0xe
 	.4byte	.LASF130
@@ -30058,48 +30117,48 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa06f
+	.4byte	0xa0df
 	.uleb128 0xd
-	.4byte	.LASF2148
+	.4byte	.LASF2162
 	.byte	0x50
 	.byte	0x8f
 	.byte	0x91
-	.4byte	0xa167
+	.4byte	0xa1d7
 	.uleb128 0xe
 	.4byte	.LASF113
 	.byte	0x8f
 	.byte	0x92
-	.4byte	0xa178
+	.4byte	0xa1e8
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2141
+	.4byte	.LASF2155
 	.byte	0x8f
 	.byte	0x93
-	.4byte	0xa17e
+	.4byte	0xa1ee
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2149
+	.4byte	.LASF2163
 	.byte	0x8f
 	.byte	0x94
-	.4byte	0x9f75
+	.4byte	0x9fe5
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2150
+	.4byte	.LASF2164
 	.byte	0x8f
 	.byte	0x95
-	.4byte	0xa199
+	.4byte	0xa209
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2151
+	.4byte	.LASF2165
 	.byte	0x8f
 	.byte	0x96
-	.4byte	0xa1ae
+	.4byte	0xa21e
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2152
+	.4byte	.LASF2166
 	.byte	0x8f
 	.byte	0x97
-	.4byte	0xa1c9
+	.4byte	0xa239
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF130
@@ -30128,83 +30187,83 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa0e2
+	.4byte	0xa152
 	.uleb128 0x10
-	.4byte	0xa178
+	.4byte	0xa1e8
 	.uleb128 0x11
-	.4byte	0x91ee
+	.4byte	0x925e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa16d
+	.4byte	0xa1dd
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9ff8
+	.4byte	0xa068
 	.uleb128 0x14
-	.4byte	0xa193
-	.4byte	0xa193
+	.4byte	0xa203
+	.4byte	0xa203
 	.uleb128 0x11
-	.4byte	0x91ee
+	.4byte	0x925e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9e28
+	.4byte	0x9e98
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa184
+	.4byte	0xa1f4
 	.uleb128 0x14
 	.4byte	0x30bc
-	.4byte	0xa1ae
+	.4byte	0xa21e
 	.uleb128 0x11
-	.4byte	0x91ee
+	.4byte	0x925e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa19f
+	.4byte	0xa20f
 	.uleb128 0x10
-	.4byte	0xa1c9
+	.4byte	0xa239
 	.uleb128 0x11
-	.4byte	0x91ee
+	.4byte	0x925e
 	.uleb128 0x11
-	.4byte	0x9371
+	.4byte	0x93e1
 	.uleb128 0x11
-	.4byte	0x9377
+	.4byte	0x93e7
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa1b4
+	.4byte	0xa224
 	.uleb128 0x26
-	.4byte	.LASF2153
+	.4byte	.LASF2167
 	.2byte	0x1220
 	.byte	0x8f
 	.byte	0x9f
-	.4byte	0xa21c
+	.4byte	0xa28c
 	.uleb128 0xe
-	.4byte	.LASF2154
+	.4byte	.LASF2168
 	.byte	0x8f
 	.byte	0xa0
-	.4byte	0xa21c
+	.4byte	0xa28c
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2155
+	.4byte	.LASF2169
 	.byte	0x8f
 	.byte	0xa1
-	.4byte	0xa22c
+	.4byte	0xa29c
 	.byte	0x18
 	.uleb128 0x27
-	.4byte	.LASF2156
+	.4byte	.LASF2170
 	.byte	0x8f
 	.byte	0xa2
 	.4byte	0xc6
 	.2byte	0x218
-	.uleb128 0x47
+	.uleb128 0x49
 	.string	"buf"
 	.byte	0x8f
 	.byte	0xa3
-	.4byte	0xa23c
+	.4byte	0xa2ac
 	.2byte	0x21c
 	.uleb128 0x27
-	.4byte	.LASF2157
+	.4byte	.LASF2171
 	.byte	0x8f
 	.byte	0xa4
 	.4byte	0xc6
@@ -30212,144 +30271,144 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x21e
-	.4byte	0xa22c
+	.4byte	0xa29c
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x21e
-	.4byte	0xa23c
+	.4byte	0xa2ac
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3f
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0xa24d
-	.uleb128 0x43
+	.4byte	0xa2bd
+	.uleb128 0x45
 	.4byte	0x4f
 	.2byte	0xfff
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2158
+	.4byte	.LASF2172
 	.byte	0x18
 	.byte	0x8f
 	.byte	0xa7
-	.4byte	0xa27e
+	.4byte	0xa2ee
 	.uleb128 0xe
-	.4byte	.LASF905
+	.4byte	.LASF919
 	.byte	0x8f
 	.byte	0xa8
-	.4byte	0xa29d
+	.4byte	0xa30d
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF265
 	.byte	0x8f
 	.byte	0xa9
-	.4byte	0xa2bc
+	.4byte	0xa32c
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2159
+	.4byte	.LASF2173
 	.byte	0x8f
 	.byte	0xaa
-	.4byte	0xa2e6
+	.4byte	0xa356
 	.byte	0x10
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xa24d
+	.4byte	0xa2bd
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xa297
+	.4byte	0xa307
 	.uleb128 0x11
-	.4byte	0xa0dc
+	.4byte	0xa14c
 	.uleb128 0x11
-	.4byte	0x91ee
+	.4byte	0x925e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa283
+	.4byte	0xa2f3
 	.uleb128 0x3
-	.4byte	0xa297
+	.4byte	0xa307
 	.uleb128 0x14
 	.4byte	0x56
-	.4byte	0xa2b6
+	.4byte	0xa326
 	.uleb128 0x11
-	.4byte	0xa0dc
+	.4byte	0xa14c
 	.uleb128 0x11
-	.4byte	0x91ee
+	.4byte	0x925e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa2a2
+	.4byte	0xa312
 	.uleb128 0x3
-	.4byte	0xa2b6
+	.4byte	0xa326
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xa2da
+	.4byte	0xa34a
 	.uleb128 0x11
-	.4byte	0xa0dc
+	.4byte	0xa14c
 	.uleb128 0x11
-	.4byte	0x91ee
+	.4byte	0x925e
 	.uleb128 0x11
-	.4byte	0xa2da
+	.4byte	0xa34a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa1cf
+	.4byte	0xa23f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa2c1
+	.4byte	0xa331
 	.uleb128 0x3
-	.4byte	0xa2e0
+	.4byte	0xa350
 	.uleb128 0xd
-	.4byte	.LASF2160
+	.4byte	.LASF2174
 	.byte	0x20
 	.byte	0x8f
 	.byte	0xae
-	.4byte	0xa31c
+	.4byte	0xa38c
 	.uleb128 0xe
-	.4byte	.LASF2115
+	.4byte	.LASF2129
 	.byte	0x8f
 	.byte	0xaf
-	.4byte	0x9e63
+	.4byte	0x9ed3
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2078
+	.4byte	.LASF2092
 	.byte	0x8f
 	.byte	0xb0
-	.4byte	0xa33b
+	.4byte	0xa3ab
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2142
+	.4byte	.LASF2156
 	.byte	0x8f
 	.byte	0xb2
-	.4byte	0xa35f
+	.4byte	0xa3cf
 	.byte	0x18
 	.byte	0
 	.uleb128 0x14
 	.4byte	0x2ee
-	.4byte	0xa335
+	.4byte	0xa3a5
 	.uleb128 0x11
-	.4byte	0x91ee
+	.4byte	0x925e
 	.uleb128 0x11
-	.4byte	0xa335
+	.4byte	0xa3a5
 	.uleb128 0x11
 	.4byte	0x21e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa2eb
+	.4byte	0xa35b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa31c
+	.4byte	0xa38c
 	.uleb128 0x14
 	.4byte	0x2ee
-	.4byte	0xa35f
+	.4byte	0xa3cf
 	.uleb128 0x11
-	.4byte	0x91ee
+	.4byte	0x925e
 	.uleb128 0x11
-	.4byte	0xa335
+	.4byte	0xa3a5
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
@@ -30357,280 +30416,280 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa341
+	.4byte	0xa3b1
 	.uleb128 0x19
-	.4byte	.LASF2161
+	.4byte	.LASF2175
 	.byte	0x8f
 	.byte	0xb6
-	.4byte	0x9ff8
+	.4byte	0xa068
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa27e
+	.4byte	0xa2ee
 	.uleb128 0x19
-	.4byte	.LASF2162
+	.4byte	.LASF2176
 	.byte	0x8f
 	.byte	0xf5
-	.4byte	0x91ee
+	.4byte	0x925e
 	.uleb128 0x19
-	.4byte	.LASF2163
+	.4byte	.LASF2177
 	.byte	0x8f
 	.byte	0xf7
-	.4byte	0x91ee
+	.4byte	0x925e
 	.uleb128 0x19
-	.4byte	.LASF2164
+	.4byte	.LASF2178
 	.byte	0x8f
 	.byte	0xf9
-	.4byte	0x91ee
+	.4byte	0x925e
 	.uleb128 0x19
-	.4byte	.LASF2165
+	.4byte	.LASF2179
 	.byte	0x8f
 	.byte	0xfb
-	.4byte	0x91ee
+	.4byte	0x925e
 	.uleb128 0x19
-	.4byte	.LASF2166
+	.4byte	.LASF2180
 	.byte	0x8f
 	.byte	0xfd
-	.4byte	0x91ee
+	.4byte	0x925e
 	.uleb128 0xd
-	.4byte	.LASF2167
+	.4byte	.LASF2181
 	.byte	0x20
 	.byte	0x9a
 	.byte	0x27
-	.4byte	0xa3de
+	.4byte	0xa44e
 	.uleb128 0xe
-	.4byte	.LASF2168
+	.4byte	.LASF2182
 	.byte	0x9a
 	.byte	0x28
 	.4byte	0x458
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2169
+	.4byte	.LASF2183
 	.byte	0x9a
 	.byte	0x29
 	.4byte	0x3a7
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2170
+	.4byte	.LASF2184
 	.byte	0x9a
 	.byte	0x2a
-	.4byte	0xa040
+	.4byte	0xa0b0
 	.byte	0x18
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2171
+	.4byte	.LASF2185
 	.byte	0x9b
 	.byte	0x22
 	.4byte	0x4b7
 	.uleb128 0x19
-	.4byte	.LASF2172
+	.4byte	.LASF2186
 	.byte	0x9b
 	.byte	0x23
 	.4byte	0x4b7
 	.uleb128 0x19
-	.4byte	.LASF2173
+	.4byte	.LASF2187
 	.byte	0x9b
 	.byte	0x39
 	.4byte	0x579
 	.uleb128 0xd
-	.4byte	.LASF2174
+	.4byte	.LASF2188
 	.byte	0x4
 	.byte	0x9b
 	.byte	0x3e
-	.4byte	0xa418
+	.4byte	0xa488
 	.uleb128 0xe
-	.4byte	.LASF2038
+	.4byte	.LASF2052
 	.byte	0x9b
 	.byte	0x3f
 	.4byte	0xc6
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF2175
+	.4byte	.LASF2189
 	.byte	0x9b
 	.byte	0x40
-	.4byte	0xa3ff
+	.4byte	0xa46f
 	.uleb128 0x1d
-	.4byte	.LASF2176
+	.4byte	.LASF2190
 	.byte	0xb8
 	.byte	0x9b
 	.2byte	0x122
-	.4byte	0xa55c
+	.4byte	0xa5cc
 	.uleb128 0x1b
-	.4byte	.LASF2177
+	.4byte	.LASF2191
 	.byte	0x9b
 	.2byte	0x123
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2178
+	.4byte	.LASF2192
 	.byte	0x9b
 	.2byte	0x124
-	.4byte	0xa863
+	.4byte	0xa8d3
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2179
+	.4byte	.LASF2193
 	.byte	0x9b
 	.2byte	0x125
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2180
+	.4byte	.LASF2194
 	.byte	0x9b
 	.2byte	0x126
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF2181
+	.4byte	.LASF2195
 	.byte	0x9b
 	.2byte	0x127
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2182
+	.4byte	.LASF2196
 	.byte	0x9b
 	.2byte	0x128
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF2183
+	.4byte	.LASF2197
 	.byte	0x9b
 	.2byte	0x129
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF2184
+	.4byte	.LASF2198
 	.byte	0x9b
 	.2byte	0x12a
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF2185
+	.4byte	.LASF2199
 	.byte	0x9b
 	.2byte	0x12b
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF2186
+	.4byte	.LASF2200
 	.byte	0x9b
 	.2byte	0x12c
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF2187
+	.4byte	.LASF2201
 	.byte	0x9b
 	.2byte	0x12d
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF2188
+	.4byte	.LASF2202
 	.byte	0x9b
 	.2byte	0x12e
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF2189
+	.4byte	.LASF2203
 	.byte	0x9b
 	.2byte	0x12f
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF2190
+	.4byte	.LASF2204
 	.byte	0x9b
 	.2byte	0x130
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF2191
+	.4byte	.LASF2205
 	.byte	0x9b
 	.2byte	0x131
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF2192
+	.4byte	.LASF2206
 	.byte	0x9b
 	.2byte	0x132
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF2193
+	.4byte	.LASF2207
 	.byte	0x9b
 	.2byte	0x133
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF2194
+	.4byte	.LASF2208
 	.byte	0x9b
 	.2byte	0x134
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF2195
+	.4byte	.LASF2209
 	.byte	0x9b
 	.2byte	0x135
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF2196
+	.4byte	.LASF2210
 	.byte	0x9b
 	.2byte	0x136
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF2197
+	.4byte	.LASF2211
 	.byte	0x9b
 	.2byte	0x137
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF2198
+	.4byte	.LASF2212
 	.byte	0x9b
 	.2byte	0x138
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF2199
+	.4byte	.LASF2213
 	.byte	0x9b
 	.2byte	0x139
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0xb0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xa423
+	.4byte	0xa493
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa576
+	.4byte	0xa5e6
 	.uleb128 0x1a
-	.4byte	.LASF2200
+	.4byte	.LASF2214
 	.2byte	0x3b0
 	.byte	0x2
 	.2byte	0x407
-	.4byte	0xa84d
+	.4byte	0xa8bd
 	.uleb128 0x1b
 	.4byte	.LASF640
 	.byte	0x2
 	.2byte	0x408
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0x2b
 	.string	"p"
 	.byte	0x2
 	.2byte	0x40a
-	.4byte	0xb56e
+	.4byte	0xb5de
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2146
+	.4byte	.LASF2160
 	.byte	0x2
 	.2byte	0x40c
-	.4byte	0x9107
+	.4byte	0x9177
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2201
+	.4byte	.LASF2215
 	.byte	0x2
 	.2byte	0x40d
 	.4byte	0x56
@@ -30639,7 +30698,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF193
 	.byte	0x2
 	.2byte	0x40e
-	.4byte	0xb135
+	.4byte	0xb1a5
 	.byte	0x78
 	.uleb128 0x1b
 	.4byte	.LASF575
@@ -30651,142 +30710,142 @@ __exitcall_ebc_exit:
 	.string	"bus"
 	.byte	0x2
 	.2byte	0x414
-	.4byte	0xadd7
+	.4byte	0xae47
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF2202
+	.4byte	.LASF2216
 	.byte	0x2
 	.2byte	0x415
-	.4byte	0xaf4b
+	.4byte	0xafbb
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF2203
+	.4byte	.LASF2217
 	.byte	0x2
 	.2byte	0x417
 	.4byte	0x458
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF2204
+	.4byte	.LASF2218
 	.byte	0x2
 	.2byte	0x419
 	.4byte	0x458
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF2205
+	.4byte	.LASF2219
 	.byte	0x2
 	.2byte	0x41b
-	.4byte	0xb4d9
+	.4byte	0xb549
 	.byte	0xc0
 	.uleb128 0x1c
-	.4byte	.LASF2206
+	.4byte	.LASF2220
 	.byte	0x2
 	.2byte	0x41c
-	.4byte	0xa910
+	.4byte	0xa980
 	.2byte	0x128
 	.uleb128 0x1c
-	.4byte	.LASF2207
+	.4byte	.LASF2221
 	.byte	0x2
 	.2byte	0x41d
-	.4byte	0xb574
+	.4byte	0xb5e4
 	.2byte	0x260
 	.uleb128 0x1c
-	.4byte	.LASF2208
+	.4byte	.LASF2222
 	.byte	0x2
 	.2byte	0x420
-	.4byte	0xb676
+	.4byte	0xb6e6
 	.2byte	0x268
 	.uleb128 0x1c
-	.4byte	.LASF2209
+	.4byte	.LASF2223
 	.byte	0x2
 	.2byte	0x423
-	.4byte	0xb681
+	.4byte	0xb6f1
 	.2byte	0x270
 	.uleb128 0x1c
-	.4byte	.LASF2210
+	.4byte	.LASF2224
 	.byte	0x2
 	.2byte	0x426
 	.4byte	0x3a7
 	.2byte	0x278
 	.uleb128 0x1c
-	.4byte	.LASF2211
+	.4byte	.LASF2225
 	.byte	0x2
 	.2byte	0x42c
-	.4byte	0xb7b9
+	.4byte	0xb829
 	.2byte	0x288
 	.uleb128 0x1c
-	.4byte	.LASF2212
+	.4byte	.LASF2226
 	.byte	0x2
 	.2byte	0x42d
-	.4byte	0x4684
+	.4byte	0x46f4
 	.2byte	0x290
 	.uleb128 0x1c
-	.4byte	.LASF2213
+	.4byte	.LASF2227
 	.byte	0x2
 	.2byte	0x42e
 	.4byte	0x15a
 	.2byte	0x298
 	.uleb128 0x1c
-	.4byte	.LASF2214
+	.4byte	.LASF2228
 	.byte	0x2
 	.2byte	0x433
 	.4byte	0x15a
 	.2byte	0x2a0
 	.uleb128 0x1c
-	.4byte	.LASF2215
+	.4byte	.LASF2229
 	.byte	0x2
 	.2byte	0x434
 	.4byte	0x29
 	.2byte	0x2a8
 	.uleb128 0x1c
-	.4byte	.LASF2216
+	.4byte	.LASF2230
 	.byte	0x2
 	.2byte	0x436
-	.4byte	0xb7bf
+	.4byte	0xb82f
 	.2byte	0x2b0
 	.uleb128 0x1c
-	.4byte	.LASF2217
+	.4byte	.LASF2231
 	.byte	0x2
 	.2byte	0x438
 	.4byte	0x3a7
 	.2byte	0x2b8
 	.uleb128 0x1c
-	.4byte	.LASF2218
+	.4byte	.LASF2232
 	.byte	0x2
 	.2byte	0x43a
-	.4byte	0xb7ca
+	.4byte	0xb83a
 	.2byte	0x2c8
 	.uleb128 0x1c
-	.4byte	.LASF2219
+	.4byte	.LASF2233
 	.byte	0x2
 	.2byte	0x43d
-	.4byte	0xb7d5
+	.4byte	0xb845
 	.2byte	0x2d0
 	.uleb128 0x1c
-	.4byte	.LASF2220
+	.4byte	.LASF2234
 	.byte	0x2
 	.2byte	0x440
-	.4byte	0xb7e0
+	.4byte	0xb850
 	.2byte	0x2d8
 	.uleb128 0x1c
-	.4byte	.LASF2221
+	.4byte	.LASF2235
 	.byte	0x2
 	.2byte	0x442
-	.4byte	0xadaa
+	.4byte	0xae1a
 	.2byte	0x2e0
 	.uleb128 0x1c
-	.4byte	.LASF2222
+	.4byte	.LASF2236
 	.byte	0x2
 	.2byte	0x444
-	.4byte	0xb894
+	.4byte	0xb904
 	.2byte	0x2f0
 	.uleb128 0x1c
-	.4byte	.LASF2223
+	.4byte	.LASF2237
 	.byte	0x2
 	.2byte	0x445
-	.4byte	0xb4a9
+	.4byte	0xb519
 	.2byte	0x2f8
 	.uleb128 0x1c
-	.4byte	.LASF2224
+	.4byte	.LASF2238
 	.byte	0x2
 	.2byte	0x447
 	.4byte	0x284
@@ -30798,55 +30857,55 @@ __exitcall_ebc_exit:
 	.4byte	0x13f
 	.2byte	0x304
 	.uleb128 0x1c
-	.4byte	.LASF2225
+	.4byte	.LASF2239
 	.byte	0x2
 	.2byte	0x44a
 	.4byte	0xe65
 	.2byte	0x308
 	.uleb128 0x1c
-	.4byte	.LASF2226
+	.4byte	.LASF2240
 	.byte	0x2
 	.2byte	0x44b
 	.4byte	0x3a7
 	.2byte	0x310
 	.uleb128 0x1c
-	.4byte	.LASF2227
+	.4byte	.LASF2241
 	.byte	0x2
 	.2byte	0x44d
-	.4byte	0xa3ad
+	.4byte	0xa41d
 	.2byte	0x320
 	.uleb128 0x1c
-	.4byte	.LASF2228
+	.4byte	.LASF2242
 	.byte	0x2
 	.2byte	0x44e
-	.4byte	0xb325
+	.4byte	0xb395
 	.2byte	0x340
 	.uleb128 0x1c
-	.4byte	.LASF2229
+	.4byte	.LASF2243
 	.byte	0x2
 	.2byte	0x44f
-	.4byte	0xaf2b
+	.4byte	0xaf9b
 	.2byte	0x348
 	.uleb128 0x1c
 	.4byte	.LASF113
 	.byte	0x2
 	.2byte	0x451
-	.4byte	0xa863
+	.4byte	0xa8d3
 	.2byte	0x350
 	.uleb128 0x1c
-	.4byte	.LASF2230
+	.4byte	.LASF2244
 	.byte	0x2
 	.2byte	0x452
-	.4byte	0xb89f
+	.4byte	0xb90f
 	.2byte	0x358
 	.uleb128 0x1c
-	.4byte	.LASF2231
+	.4byte	.LASF2245
 	.byte	0x2
 	.2byte	0x453
-	.4byte	0xb8aa
+	.4byte	0xb91a
 	.2byte	0x360
 	.uleb128 0x33
-	.4byte	.LASF2232
+	.4byte	.LASF2246
 	.byte	0x2
 	.2byte	0x455
 	.4byte	0x2b0
@@ -30855,7 +30914,7 @@ __exitcall_ebc_exit:
 	.byte	0x7
 	.2byte	0x368
 	.uleb128 0x33
-	.4byte	.LASF2233
+	.4byte	.LASF2247
 	.byte	0x2
 	.2byte	0x456
 	.4byte	0x2b0
@@ -30864,7 +30923,7 @@ __exitcall_ebc_exit:
 	.byte	0x6
 	.2byte	0x368
 	.uleb128 0x33
-	.4byte	.LASF2234
+	.4byte	.LASF2248
 	.byte	0x2
 	.2byte	0x457
 	.4byte	0x2b0
@@ -30873,7 +30932,7 @@ __exitcall_ebc_exit:
 	.byte	0x5
 	.2byte	0x368
 	.uleb128 0x33
-	.4byte	.LASF2235
+	.4byte	.LASF2249
 	.byte	0x2
 	.2byte	0x458
 	.4byte	0x2b0
@@ -30906,13 +30965,13 @@ __exitcall_ebc_exit:
 	.4byte	0x15a
 	.2byte	0x388
 	.uleb128 0x1c
-	.4byte	.LASF2236
+	.4byte	.LASF2250
 	.byte	0x2
 	.2byte	0x45e
 	.4byte	0x15a
 	.2byte	0x390
 	.uleb128 0x1c
-	.4byte	.LASF2237
+	.4byte	.LASF2251
 	.byte	0x2
 	.2byte	0x45f
 	.4byte	0x15a
@@ -30931,67 +30990,67 @@ __exitcall_ebc_exit:
 	.2byte	0x3a8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xa576
+	.4byte	0xa5e6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa561
+	.4byte	0xa5d1
 	.uleb128 0x10
-	.4byte	0xa863
+	.4byte	0xa8d3
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa858
+	.4byte	0xa8c8
 	.uleb128 0x1e
-	.4byte	.LASF2238
+	.4byte	.LASF2252
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x9b
 	.2byte	0x1fc
-	.4byte	0xa893
+	.4byte	0xa903
 	.uleb128 0xc
-	.4byte	.LASF2239
+	.4byte	.LASF2253
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2240
+	.4byte	.LASF2254
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2241
+	.4byte	.LASF2255
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2242
+	.4byte	.LASF2256
 	.byte	0x3
 	.byte	0
 	.uleb128 0x1e
-	.4byte	.LASF2243
+	.4byte	.LASF2257
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x9b
 	.2byte	0x212
-	.4byte	0xa8c3
+	.4byte	0xa933
 	.uleb128 0xc
-	.4byte	.LASF2244
+	.4byte	.LASF2258
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2245
+	.4byte	.LASF2259
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2246
+	.4byte	.LASF2260
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2247
+	.4byte	.LASF2261
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2248
+	.4byte	.LASF2262
 	.byte	0x4
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF2249
+	.4byte	.LASF2263
 	.byte	0x20
 	.byte	0x9b
 	.2byte	0x21e
-	.4byte	0xa905
+	.4byte	0xa975
 	.uleb128 0x1b
 	.4byte	.LASF116
 	.byte	0x9b
@@ -30999,43 +31058,43 @@ __exitcall_ebc_exit:
 	.4byte	0xe65
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1127
+	.4byte	.LASF1141
 	.byte	0x9b
 	.2byte	0x220
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF2250
+	.4byte	.LASF2264
 	.byte	0x9b
 	.2byte	0x222
 	.4byte	0x3a7
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2251
+	.4byte	.LASF2265
 	.byte	0x9b
 	.2byte	0x225
-	.4byte	0xa90a
+	.4byte	0xa97a
 	.byte	0x18
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF2252
+	.4byte	.LASF2266
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa905
+	.4byte	0xa975
 	.uleb128 0x1a
-	.4byte	.LASF2253
+	.4byte	.LASF2267
 	.2byte	0x138
 	.byte	0x9b
 	.2byte	0x249
-	.4byte	0xac0b
+	.4byte	0xac7b
 	.uleb128 0x1b
-	.4byte	.LASF2254
+	.4byte	.LASF2268
 	.byte	0x9b
 	.2byte	0x24a
-	.4byte	0xa418
+	.4byte	0xa488
 	.byte	0
-	.uleb128 0x3b
-	.4byte	.LASF2255
+	.uleb128 0x3d
+	.4byte	.LASF2269
 	.byte	0x9b
 	.2byte	0x24b
 	.4byte	0x6d
@@ -31043,8 +31102,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x1f
 	.byte	0x4
-	.uleb128 0x3b
-	.4byte	.LASF2256
+	.uleb128 0x3d
+	.4byte	.LASF2270
 	.byte	0x9b
 	.2byte	0x24c
 	.4byte	0x6d
@@ -31052,8 +31111,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x1e
 	.byte	0x4
-	.uleb128 0x3b
-	.4byte	.LASF2257
+	.uleb128 0x3d
+	.4byte	.LASF2271
 	.byte	0x9b
 	.2byte	0x24d
 	.4byte	0x2b0
@@ -31061,8 +31120,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x5
 	.byte	0x4
-	.uleb128 0x3b
-	.4byte	.LASF2258
+	.uleb128 0x3d
+	.4byte	.LASF2272
 	.byte	0x9b
 	.2byte	0x24e
 	.4byte	0x2b0
@@ -31070,8 +31129,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x4
 	.byte	0x4
-	.uleb128 0x3b
-	.4byte	.LASF2259
+	.uleb128 0x3d
+	.4byte	.LASF2273
 	.byte	0x9b
 	.2byte	0x24f
 	.4byte	0x2b0
@@ -31079,8 +31138,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x3
 	.byte	0x4
-	.uleb128 0x3b
-	.4byte	.LASF2260
+	.uleb128 0x3d
+	.4byte	.LASF2274
 	.byte	0x9b
 	.2byte	0x250
 	.4byte	0x2b0
@@ -31088,8 +31147,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x2
 	.byte	0x4
-	.uleb128 0x3b
-	.4byte	.LASF2261
+	.uleb128 0x3d
+	.4byte	.LASF2275
 	.byte	0x9b
 	.2byte	0x251
 	.4byte	0x2b0
@@ -31097,8 +31156,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x1
 	.byte	0x4
-	.uleb128 0x3b
-	.4byte	.LASF2262
+	.uleb128 0x3d
+	.4byte	.LASF2276
 	.byte	0x9b
 	.2byte	0x252
 	.4byte	0x2b0
@@ -31106,8 +31165,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0
 	.byte	0x4
-	.uleb128 0x3b
-	.4byte	.LASF2263
+	.uleb128 0x3d
+	.4byte	.LASF2277
 	.byte	0x9b
 	.2byte	0x253
 	.4byte	0x2b0
@@ -31115,8 +31174,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x7
 	.byte	0x5
-	.uleb128 0x3b
-	.4byte	.LASF2264
+	.uleb128 0x3d
+	.4byte	.LASF2278
 	.byte	0x9b
 	.2byte	0x254
 	.4byte	0x2b0
@@ -31125,7 +31184,7 @@ __exitcall_ebc_exit:
 	.byte	0x6
 	.byte	0x5
 	.uleb128 0x1b
-	.4byte	.LASF2265
+	.4byte	.LASF2279
 	.byte	0x9b
 	.2byte	0x255
 	.4byte	0x13f
@@ -31143,19 +31202,19 @@ __exitcall_ebc_exit:
 	.4byte	0x3a7
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1099
+	.4byte	.LASF1113
 	.byte	0x9b
 	.2byte	0x259
-	.4byte	0x4653
+	.4byte	0x46c3
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2266
+	.4byte	.LASF2280
 	.byte	0x9b
 	.2byte	0x25a
-	.4byte	0xad0d
+	.4byte	0xad7d
 	.byte	0x40
-	.uleb128 0x3b
-	.4byte	.LASF2267
+	.uleb128 0x3d
+	.4byte	.LASF2281
 	.byte	0x9b
 	.2byte	0x25b
 	.4byte	0x2b0
@@ -31163,8 +31222,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x7
 	.byte	0x48
-	.uleb128 0x3b
-	.4byte	.LASF2268
+	.uleb128 0x3d
+	.4byte	.LASF2282
 	.byte	0x9b
 	.2byte	0x25c
 	.4byte	0x2b0
@@ -31172,8 +31231,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x6
 	.byte	0x48
-	.uleb128 0x3b
-	.4byte	.LASF2269
+	.uleb128 0x3d
+	.4byte	.LASF2283
 	.byte	0x9b
 	.2byte	0x25d
 	.4byte	0x2b0
@@ -31181,8 +31240,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x5
 	.byte	0x48
-	.uleb128 0x3b
-	.4byte	.LASF2270
+	.uleb128 0x3d
+	.4byte	.LASF2284
 	.byte	0x9b
 	.2byte	0x25e
 	.4byte	0x6d
@@ -31190,8 +31249,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x1c
 	.byte	0x48
-	.uleb128 0x3b
-	.4byte	.LASF2271
+	.uleb128 0x3d
+	.4byte	.LASF2285
 	.byte	0x9b
 	.2byte	0x25f
 	.4byte	0x6d
@@ -31200,49 +31259,49 @@ __exitcall_ebc_exit:
 	.byte	0x1b
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF2272
+	.4byte	.LASF2286
 	.byte	0x9b
 	.2byte	0x264
 	.4byte	0x3172
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF2273
+	.4byte	.LASF2287
 	.byte	0x9b
 	.2byte	0x265
 	.4byte	0x29
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF2274
+	.4byte	.LASF2288
 	.byte	0x9b
 	.2byte	0x266
 	.4byte	0x320b
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF2275
+	.4byte	.LASF2289
 	.byte	0x9b
 	.2byte	0x267
 	.4byte	0x15bf
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF2276
+	.4byte	.LASF2290
 	.byte	0x9b
 	.2byte	0x268
-	.4byte	0xad18
+	.4byte	0xad88
 	.byte	0xd8
 	.uleb128 0x1b
-	.4byte	.LASF2277
+	.4byte	.LASF2291
 	.byte	0x9b
 	.2byte	0x269
 	.4byte	0x37c
 	.byte	0xe0
 	.uleb128 0x1b
-	.4byte	.LASF2278
+	.4byte	.LASF2292
 	.byte	0x9b
 	.2byte	0x26a
 	.4byte	0x37c
 	.byte	0xe4
-	.uleb128 0x3b
-	.4byte	.LASF2279
+	.uleb128 0x3d
+	.4byte	.LASF2293
 	.byte	0x9b
 	.2byte	0x26b
 	.4byte	0x6d
@@ -31250,8 +31309,8 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x1d
 	.byte	0xe8
-	.uleb128 0x3b
-	.4byte	.LASF2280
+	.uleb128 0x3d
+	.4byte	.LASF2294
 	.byte	0x9b
 	.2byte	0x26c
 	.4byte	0x6d
@@ -31259,8 +31318,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x1c
 	.byte	0xe8
-	.uleb128 0x3b
-	.4byte	.LASF2281
+	.uleb128 0x3d
+	.4byte	.LASF2295
 	.byte	0x9b
 	.2byte	0x26d
 	.4byte	0x6d
@@ -31268,8 +31327,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x1b
 	.byte	0xe8
-	.uleb128 0x3b
-	.4byte	.LASF2282
+	.uleb128 0x3d
+	.4byte	.LASF2296
 	.byte	0x9b
 	.2byte	0x26e
 	.4byte	0x6d
@@ -31277,8 +31336,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x1a
 	.byte	0xe8
-	.uleb128 0x3b
-	.4byte	.LASF2283
+	.uleb128 0x3d
+	.4byte	.LASF2297
 	.byte	0x9b
 	.2byte	0x26f
 	.4byte	0x6d
@@ -31286,8 +31345,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x19
 	.byte	0xe8
-	.uleb128 0x3b
-	.4byte	.LASF2284
+	.uleb128 0x3d
+	.4byte	.LASF2298
 	.byte	0x9b
 	.2byte	0x270
 	.4byte	0x2b0
@@ -31295,8 +31354,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0
 	.byte	0xe8
-	.uleb128 0x3b
-	.4byte	.LASF2285
+	.uleb128 0x3d
+	.4byte	.LASF2299
 	.byte	0x9b
 	.2byte	0x271
 	.4byte	0x6d
@@ -31304,8 +31363,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x17
 	.byte	0xe8
-	.uleb128 0x3b
-	.4byte	.LASF2286
+	.uleb128 0x3d
+	.4byte	.LASF2300
 	.byte	0x9b
 	.2byte	0x272
 	.4byte	0x6d
@@ -31313,8 +31372,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x16
 	.byte	0xe8
-	.uleb128 0x3b
-	.4byte	.LASF2287
+	.uleb128 0x3d
+	.4byte	.LASF2301
 	.byte	0x9b
 	.2byte	0x273
 	.4byte	0x6d
@@ -31322,8 +31381,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x15
 	.byte	0xe8
-	.uleb128 0x3b
-	.4byte	.LASF2288
+	.uleb128 0x3d
+	.4byte	.LASF2302
 	.byte	0x9b
 	.2byte	0x274
 	.4byte	0x6d
@@ -31331,8 +31390,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x14
 	.byte	0xe8
-	.uleb128 0x3b
-	.4byte	.LASF2289
+	.uleb128 0x3d
+	.4byte	.LASF2303
 	.byte	0x9b
 	.2byte	0x275
 	.4byte	0x6d
@@ -31341,84 +31400,84 @@ __exitcall_ebc_exit:
 	.byte	0x13
 	.byte	0xe8
 	.uleb128 0x1b
-	.4byte	.LASF2290
+	.4byte	.LASF2304
 	.byte	0x9b
 	.2byte	0x276
 	.4byte	0x6d
 	.byte	0xec
 	.uleb128 0x1b
-	.4byte	.LASF2291
+	.4byte	.LASF2305
 	.byte	0x9b
 	.2byte	0x277
-	.4byte	0xa893
+	.4byte	0xa903
 	.byte	0xf0
 	.uleb128 0x1b
-	.4byte	.LASF2292
+	.4byte	.LASF2306
 	.byte	0x9b
 	.2byte	0x278
-	.4byte	0xa869
+	.4byte	0xa8d9
 	.byte	0xf4
 	.uleb128 0x1b
-	.4byte	.LASF2293
+	.4byte	.LASF2307
 	.byte	0x9b
 	.2byte	0x279
 	.4byte	0xc6
 	.byte	0xf8
 	.uleb128 0x1b
-	.4byte	.LASF2294
+	.4byte	.LASF2308
 	.byte	0x9b
 	.2byte	0x27a
 	.4byte	0xc6
 	.byte	0xfc
 	.uleb128 0x1c
-	.4byte	.LASF2295
+	.4byte	.LASF2309
 	.byte	0x9b
 	.2byte	0x27b
 	.4byte	0x29
 	.2byte	0x100
 	.uleb128 0x1c
-	.4byte	.LASF2296
+	.4byte	.LASF2310
 	.byte	0x9b
 	.2byte	0x27c
 	.4byte	0x29
 	.2byte	0x108
 	.uleb128 0x1c
-	.4byte	.LASF2297
+	.4byte	.LASF2311
 	.byte	0x9b
 	.2byte	0x27d
 	.4byte	0x29
 	.2byte	0x110
 	.uleb128 0x1c
-	.4byte	.LASF2298
+	.4byte	.LASF2312
 	.byte	0x9b
 	.2byte	0x27e
 	.4byte	0x29
 	.2byte	0x118
 	.uleb128 0x1c
-	.4byte	.LASF2299
+	.4byte	.LASF2313
 	.byte	0x9b
 	.2byte	0x280
-	.4byte	0xad1e
+	.4byte	0xad8e
 	.2byte	0x120
 	.uleb128 0x1c
-	.4byte	.LASF2300
+	.4byte	.LASF2314
 	.byte	0x9b
 	.2byte	0x281
-	.4byte	0xad34
+	.4byte	0xada4
 	.2byte	0x128
 	.uleb128 0x30
 	.string	"qos"
 	.byte	0x9b
 	.2byte	0x282
-	.4byte	0xad3f
+	.4byte	0xadaf
 	.2byte	0x130
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2301
+	.4byte	.LASF2315
 	.byte	0xd0
 	.byte	0x9c
 	.byte	0x38
-	.4byte	0xad0d
+	.4byte	0xad7d
 	.uleb128 0xe
 	.4byte	.LASF265
 	.byte	0x9c
@@ -31444,79 +31503,79 @@ __exitcall_ebc_exit:
 	.4byte	0xe65
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2276
+	.4byte	.LASF2290
 	.byte	0x9c
 	.byte	0x3d
-	.4byte	0xad18
+	.4byte	0xad88
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2302
+	.4byte	.LASF2316
 	.byte	0x9c
 	.byte	0x3e
 	.4byte	0x3172
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2273
+	.4byte	.LASF2287
 	.byte	0x9c
 	.byte	0x3f
 	.4byte	0x29
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2303
+	.4byte	.LASF2317
 	.byte	0x9c
 	.byte	0x40
 	.4byte	0x313b
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF2304
+	.4byte	.LASF2318
 	.byte	0x9c
 	.byte	0x41
 	.4byte	0x313b
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2305
+	.4byte	.LASF2319
 	.byte	0x9c
 	.byte	0x42
 	.4byte	0x313b
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF2306
+	.4byte	.LASF2320
 	.byte	0x9c
 	.byte	0x43
 	.4byte	0x313b
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF2307
+	.4byte	.LASF2321
 	.byte	0x9c
 	.byte	0x44
 	.4byte	0x313b
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2308
+	.4byte	.LASF2322
 	.byte	0x9c
 	.byte	0x45
 	.4byte	0x29
 	.byte	0x98
 	.uleb128 0xe
-	.4byte	.LASF2309
+	.4byte	.LASF2323
 	.byte	0x9c
 	.byte	0x46
 	.4byte	0x29
 	.byte	0xa0
 	.uleb128 0xe
-	.4byte	.LASF2310
+	.4byte	.LASF2324
 	.byte	0x9c
 	.byte	0x47
 	.4byte	0x29
 	.byte	0xa8
 	.uleb128 0xe
-	.4byte	.LASF2311
+	.4byte	.LASF2325
 	.byte	0x9c
 	.byte	0x48
 	.4byte	0x29
 	.byte	0xb0
 	.uleb128 0xe
-	.4byte	.LASF2312
+	.4byte	.LASF2326
 	.byte	0x9c
 	.byte	0x49
 	.4byte	0x29
@@ -31525,10 +31584,10 @@ __exitcall_ebc_exit:
 	.string	"dev"
 	.byte	0x9c
 	.byte	0x4a
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.byte	0xc0
-	.uleb128 0x38
-	.4byte	.LASF882
+	.uleb128 0x3a
+	.4byte	.LASF896
 	.byte	0x9c
 	.byte	0x4b
 	.4byte	0x2b0
@@ -31536,8 +31595,8 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x7
 	.byte	0xc8
-	.uleb128 0x38
-	.4byte	.LASF2313
+	.uleb128 0x3a
+	.4byte	.LASF2327
 	.byte	0x9c
 	.byte	0x4c
 	.4byte	0x2b0
@@ -31548,110 +31607,110 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xac0b
+	.4byte	0xac7b
 	.uleb128 0x24
-	.4byte	.LASF2314
+	.4byte	.LASF2328
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xad13
+	.4byte	0xad83
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa8c3
+	.4byte	0xa933
 	.uleb128 0x10
-	.4byte	0xad34
+	.4byte	0xada4
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
 	.4byte	0x12f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xad24
+	.4byte	0xad94
 	.uleb128 0x24
-	.4byte	.LASF2315
+	.4byte	.LASF2329
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xad3a
+	.4byte	0xadaa
 	.uleb128 0x1d
-	.4byte	.LASF2316
+	.4byte	.LASF2330
 	.byte	0xd8
 	.byte	0x9b
 	.2byte	0x296
-	.4byte	0xad94
+	.4byte	0xae04
 	.uleb128 0x2b
 	.string	"ops"
 	.byte	0x9b
 	.2byte	0x297
-	.4byte	0xa423
+	.4byte	0xa493
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2317
+	.4byte	.LASF2331
 	.byte	0x9b
 	.2byte	0x298
-	.4byte	0xada4
+	.4byte	0xae14
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF2318
+	.4byte	.LASF2332
 	.byte	0x9b
 	.2byte	0x299
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF2319
+	.4byte	.LASF2333
 	.byte	0x9b
 	.2byte	0x29a
-	.4byte	0xa863
+	.4byte	0xa8d3
 	.byte	0xc8
 	.uleb128 0x1b
-	.4byte	.LASF2320
+	.4byte	.LASF2334
 	.byte	0x9b
 	.2byte	0x29b
-	.4byte	0xa863
+	.4byte	0xa8d3
 	.byte	0xd0
 	.byte	0
 	.uleb128 0x10
-	.4byte	0xada4
+	.4byte	0xae14
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
 	.4byte	0x2b0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xad94
+	.4byte	0xae04
 	.uleb128 0xd
-	.4byte	.LASF2321
+	.4byte	.LASF2335
 	.byte	0x10
 	.byte	0x9d
 	.byte	0x13
-	.4byte	0xadcf
+	.4byte	0xae3f
 	.uleb128 0xe
-	.4byte	.LASF2322
+	.4byte	.LASF2336
 	.byte	0x9d
 	.byte	0x15
 	.4byte	0x458
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2323
+	.4byte	.LASF2337
 	.byte	0x9d
 	.byte	0x1a
 	.4byte	0x2b0
 	.byte	0x8
 	.byte	0
-	.uleb128 0x3a
-	.4byte	.LASF2324
+	.uleb128 0x3c
+	.4byte	.LASF2338
 	.byte	0
 	.byte	0x9d
 	.byte	0x20
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xaddd
+	.4byte	0xae4d
 	.uleb128 0xd
-	.4byte	.LASF2325
+	.4byte	.LASF2339
 	.byte	0xd0
 	.byte	0x2
 	.byte	0x7a
-	.4byte	0xaf2b
+	.4byte	0xaf9b
 	.uleb128 0xe
 	.4byte	.LASF265
 	.byte	0x2
@@ -31659,133 +31718,133 @@ __exitcall_ebc_exit:
 	.4byte	0x56
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2326
+	.4byte	.LASF2340
 	.byte	0x2
 	.byte	0x7c
 	.4byte	0x56
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2327
+	.4byte	.LASF2341
 	.byte	0x2
 	.byte	0x7d
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2328
+	.4byte	.LASF2342
 	.byte	0x2
 	.byte	0x7e
-	.4byte	0xaf2b
+	.4byte	0xaf9b
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2329
+	.4byte	.LASF2343
 	.byte	0x2
 	.byte	0x7f
-	.4byte	0xaf2b
+	.4byte	0xaf9b
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2330
+	.4byte	.LASF2344
 	.byte	0x2
 	.byte	0x80
-	.4byte	0xaf2b
+	.4byte	0xaf9b
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2331
+	.4byte	.LASF2345
 	.byte	0x2
 	.byte	0x82
-	.4byte	0xb07a
+	.4byte	0xb0ea
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2159
+	.4byte	.LASF2173
 	.byte	0x2
 	.byte	0x83
-	.4byte	0xb094
+	.4byte	0xb104
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2332
+	.4byte	.LASF2346
 	.byte	0x2
 	.byte	0x84
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2333
+	.4byte	.LASF2347
 	.byte	0x2
 	.byte	0x85
-	.4byte	0xa863
+	.4byte	0xa8d3
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2334
+	.4byte	.LASF2348
 	.byte	0x2
 	.byte	0x86
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2335
+	.4byte	.LASF2349
 	.byte	0x2
 	.byte	0x87
-	.4byte	0xa863
+	.4byte	0xa8d3
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2336
+	.4byte	.LASF2350
 	.byte	0x2
 	.byte	0x89
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2233
+	.4byte	.LASF2247
 	.byte	0x2
 	.byte	0x8a
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2179
+	.4byte	.LASF2193
 	.byte	0x2
 	.byte	0x8c
-	.4byte	0xb0ae
+	.4byte	0xb11e
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF2180
+	.4byte	.LASF2194
 	.byte	0x2
 	.byte	0x8d
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2337
+	.4byte	.LASF2351
 	.byte	0x2
 	.byte	0x8f
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF2338
+	.4byte	.LASF2352
 	.byte	0x2
 	.byte	0x91
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x88
 	.uleb128 0x20
 	.string	"pm"
 	.byte	0x2
 	.byte	0x93
-	.4byte	0xb0b4
+	.4byte	0xb124
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2339
+	.4byte	.LASF2353
 	.byte	0x2
 	.byte	0x95
-	.4byte	0xb0c4
+	.4byte	0xb134
 	.byte	0x98
 	.uleb128 0x20
 	.string	"p"
 	.byte	0x2
 	.byte	0x97
-	.4byte	0xb0cf
+	.4byte	0xb13f
 	.byte	0xa0
 	.uleb128 0xe
-	.4byte	.LASF2340
+	.4byte	.LASF2354
 	.byte	0x2
 	.byte	0x98
 	.4byte	0xe11
 	.byte	0xa8
 	.uleb128 0xe
-	.4byte	.LASF2341
+	.4byte	.LASF2355
 	.byte	0x2
 	.byte	0x9a
 	.4byte	0x2b0
@@ -31817,27 +31876,27 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xaf31
+	.4byte	0xafa1
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9ed1
+	.4byte	0x9f41
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xaf4b
+	.4byte	0xafbb
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0xaf4b
+	.4byte	0xafbb
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xaf51
+	.4byte	0xafc1
 	.uleb128 0x1d
-	.4byte	.LASF2342
+	.4byte	.LASF2356
 	.byte	0xa8
 	.byte	0x2
 	.2byte	0x12a
-	.4byte	0xb07a
+	.4byte	0xb0ea
 	.uleb128 0x1b
 	.4byte	.LASF265
 	.byte	0x2
@@ -31848,103 +31907,103 @@ __exitcall_ebc_exit:
 	.string	"bus"
 	.byte	0x2
 	.2byte	0x12c
-	.4byte	0xadd7
+	.4byte	0xae47
 	.byte	0x8
 	.uleb128 0x1b
 	.4byte	.LASF98
 	.byte	0x2
 	.2byte	0x12e
-	.4byte	0x757b
+	.4byte	0x75eb
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2343
+	.4byte	.LASF2357
 	.byte	0x2
 	.2byte	0x12f
 	.4byte	0x56
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF2344
+	.4byte	.LASF2358
 	.byte	0x2
 	.2byte	0x131
 	.4byte	0x2b0
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2345
+	.4byte	.LASF2359
 	.byte	0x2
 	.2byte	0x132
-	.4byte	0xb13b
+	.4byte	0xb1ab
 	.byte	0x24
 	.uleb128 0x1b
-	.4byte	.LASF2346
+	.4byte	.LASF2360
 	.byte	0x2
 	.2byte	0x134
-	.4byte	0xb1a0
+	.4byte	0xb210
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF2347
+	.4byte	.LASF2361
 	.byte	0x2
 	.2byte	0x135
-	.4byte	0xb1e7
+	.4byte	0xb257
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF2332
+	.4byte	.LASF2346
 	.byte	0x2
 	.2byte	0x137
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF2333
+	.4byte	.LASF2347
 	.byte	0x2
 	.2byte	0x138
-	.4byte	0xa863
+	.4byte	0xa8d3
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF2334
+	.4byte	.LASF2348
 	.byte	0x2
 	.2byte	0x139
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF2335
+	.4byte	.LASF2349
 	.byte	0x2
 	.2byte	0x13a
-	.4byte	0xa863
+	.4byte	0xa8d3
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF2179
+	.4byte	.LASF2193
 	.byte	0x2
 	.2byte	0x13b
-	.4byte	0xb0ae
+	.4byte	0xb11e
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF2180
+	.4byte	.LASF2194
 	.byte	0x2
 	.2byte	0x13c
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF2229
+	.4byte	.LASF2243
 	.byte	0x2
 	.2byte	0x13d
-	.4byte	0xaf2b
+	.4byte	0xaf9b
 	.byte	0x68
 	.uleb128 0x2b
 	.string	"pm"
 	.byte	0x2
 	.2byte	0x13f
-	.4byte	0xb0b4
+	.4byte	0xb124
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF2348
+	.4byte	.LASF2362
 	.byte	0x2
 	.2byte	0x140
-	.4byte	0xa863
+	.4byte	0xa8d3
 	.byte	0x78
 	.uleb128 0x2b
 	.string	"p"
 	.byte	0x2
 	.2byte	0x142
-	.4byte	0xb1f2
+	.4byte	0xb262
 	.byte	0x80
 	.uleb128 0x1b
 	.4byte	.LASF130
@@ -31973,50 +32032,50 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xaf37
+	.4byte	0xafa7
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xb094
+	.4byte	0xb104
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0xa2da
+	.4byte	0xa34a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb080
+	.4byte	0xb0f0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xb0ae
+	.4byte	0xb11e
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0xa418
+	.4byte	0xa488
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb09a
+	.4byte	0xb10a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa55c
+	.4byte	0xa5cc
 	.uleb128 0x24
-	.4byte	.LASF2339
+	.4byte	.LASF2353
 	.uleb128 0x3
-	.4byte	0xb0ba
+	.4byte	0xb12a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb0bf
+	.4byte	0xb12f
 	.uleb128 0x24
-	.4byte	.LASF2349
+	.4byte	.LASF2363
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb0ca
+	.4byte	0xb13a
 	.uleb128 0x1d
-	.4byte	.LASF2350
+	.4byte	.LASF2364
 	.byte	0x30
 	.byte	0x2
 	.2byte	0x249
-	.4byte	0xb130
+	.4byte	0xb1a0
 	.uleb128 0x1b
 	.4byte	.LASF265
 	.byte	0x2
@@ -32024,81 +32083,81 @@ __exitcall_ebc_exit:
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2229
+	.4byte	.LASF2243
 	.byte	0x2
 	.2byte	0x24b
-	.4byte	0xaf2b
+	.4byte	0xaf9b
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2159
+	.4byte	.LASF2173
 	.byte	0x2
 	.2byte	0x24c
-	.4byte	0xb094
+	.4byte	0xb104
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2351
+	.4byte	.LASF2365
 	.byte	0x2
 	.2byte	0x24d
-	.4byte	0xb397
+	.4byte	0xb407
 	.byte	0x18
 	.uleb128 0x1b
 	.4byte	.LASF113
 	.byte	0x2
 	.2byte	0x24f
-	.4byte	0xa863
+	.4byte	0xa8d3
 	.byte	0x20
 	.uleb128 0x2b
 	.string	"pm"
 	.byte	0x2
 	.2byte	0x251
-	.4byte	0xb0b4
+	.4byte	0xb124
 	.byte	0x28
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb0d5
+	.4byte	0xb145
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb130
+	.4byte	0xb1a0
 	.uleb128 0x1f
-	.4byte	.LASF2345
+	.4byte	.LASF2359
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x2
 	.byte	0xf9
-	.4byte	0xb15e
+	.4byte	0xb1ce
 	.uleb128 0xc
-	.4byte	.LASF2352
+	.4byte	.LASF2366
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2353
+	.4byte	.LASF2367
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2354
+	.4byte	.LASF2368
 	.byte	0x2
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2355
+	.4byte	.LASF2369
 	.byte	0xc8
 	.byte	0x9e
 	.byte	0xf1
-	.4byte	0xb19b
+	.4byte	0xb20b
 	.uleb128 0xe
 	.4byte	.LASF265
 	.byte	0x9e
 	.byte	0xf2
-	.4byte	0x87a5
+	.4byte	0x8815
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF193
 	.byte	0x9e
 	.byte	0xf3
-	.4byte	0x87a5
+	.4byte	0x8815
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2356
+	.4byte	.LASF2370
 	.byte	0x9e
 	.byte	0xf4
-	.4byte	0xb8e3
+	.4byte	0xb953
 	.byte	0x40
 	.uleb128 0xe
 	.4byte	.LASF794
@@ -32108,27 +32167,27 @@ __exitcall_ebc_exit:
 	.byte	0xc0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb15e
+	.4byte	0xb1ce
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb19b
+	.4byte	0xb20b
 	.uleb128 0xd
-	.4byte	.LASF2357
+	.4byte	.LASF2371
 	.byte	0x20
 	.byte	0x9e
 	.byte	0xbf
-	.4byte	0xb1e2
+	.4byte	0xb252
 	.uleb128 0x20
 	.string	"id"
 	.byte	0x9e
 	.byte	0xc0
-	.4byte	0xb8d3
+	.4byte	0xb943
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2204
+	.4byte	.LASF2218
 	.byte	0x9e
 	.byte	0xc1
-	.4byte	0xb8c8
+	.4byte	0xb938
 	.byte	0x10
 	.uleb128 0x20
 	.string	"cls"
@@ -32137,28 +32196,28 @@ __exitcall_ebc_exit:
 	.4byte	0xd2
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2358
+	.4byte	.LASF2372
 	.byte	0x9e
 	.byte	0xc3
 	.4byte	0xd2
 	.byte	0x1c
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb1a6
+	.4byte	0xb216
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb1e2
+	.4byte	0xb252
 	.uleb128 0x24
-	.4byte	.LASF2359
+	.4byte	.LASF2373
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb1ed
+	.4byte	0xb25d
 	.uleb128 0x1d
-	.4byte	.LASF2228
+	.4byte	.LASF2242
 	.byte	0x98
 	.byte	0x2
 	.2byte	0x1ae
-	.4byte	0xb2fa
+	.4byte	0xb36a
 	.uleb128 0x1b
 	.4byte	.LASF265
 	.byte	0x2
@@ -32169,85 +32228,85 @@ __exitcall_ebc_exit:
 	.4byte	.LASF98
 	.byte	0x2
 	.2byte	0x1b0
-	.4byte	0x757b
+	.4byte	0x75eb
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2360
+	.4byte	.LASF2374
 	.byte	0x2
 	.2byte	0x1b2
-	.4byte	0xaf2b
+	.4byte	0xaf9b
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2329
+	.4byte	.LASF2343
 	.byte	0x2
 	.2byte	0x1b3
-	.4byte	0xaf2b
+	.4byte	0xaf9b
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF2361
+	.4byte	.LASF2375
 	.byte	0x2
 	.2byte	0x1b4
-	.4byte	0x91ee
+	.4byte	0x925e
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2362
+	.4byte	.LASF2376
 	.byte	0x2
 	.2byte	0x1b6
-	.4byte	0xb094
+	.4byte	0xb104
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF2351
+	.4byte	.LASF2365
 	.byte	0x2
 	.2byte	0x1b7
-	.4byte	0xb314
+	.4byte	0xb384
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF2363
+	.4byte	.LASF2377
 	.byte	0x2
 	.2byte	0x1b9
-	.4byte	0xb32b
+	.4byte	0xb39b
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF2364
+	.4byte	.LASF2378
 	.byte	0x2
 	.2byte	0x1ba
-	.4byte	0xa863
+	.4byte	0xa8d3
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF2365
+	.4byte	.LASF2379
 	.byte	0x2
 	.2byte	0x1bc
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF2366
+	.4byte	.LASF2380
 	.byte	0x2
 	.2byte	0x1be
-	.4byte	0xa193
+	.4byte	0xa203
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF2151
+	.4byte	.LASF2165
 	.byte	0x2
 	.2byte	0x1bf
-	.4byte	0xb340
+	.4byte	0xb3b0
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF2152
+	.4byte	.LASF2166
 	.byte	0x2
 	.2byte	0x1c1
-	.4byte	0xb35b
+	.4byte	0xb3cb
 	.byte	0x60
 	.uleb128 0x2b
 	.string	"pm"
 	.byte	0x2
 	.2byte	0x1c3
-	.4byte	0xb0b4
+	.4byte	0xb124
 	.byte	0x68
 	.uleb128 0x2b
 	.string	"p"
 	.byte	0x2
 	.2byte	0x1c5
-	.4byte	0xb0cf
+	.4byte	0xb13f
 	.byte	0x70
 	.uleb128 0x1b
 	.4byte	.LASF130
@@ -32276,123 +32335,123 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x14
 	.4byte	0x21e
-	.4byte	0xb30e
+	.4byte	0xb37e
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0xb30e
+	.4byte	0xb37e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x28f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb2fa
+	.4byte	0xb36a
 	.uleb128 0x10
-	.4byte	0xb325
+	.4byte	0xb395
 	.uleb128 0x11
-	.4byte	0xb325
+	.4byte	0xb395
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb1f8
+	.4byte	0xb268
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb31a
+	.4byte	0xb38a
 	.uleb128 0x14
 	.4byte	0x30bc
-	.4byte	0xb340
+	.4byte	0xb3b0
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb331
+	.4byte	0xb3a1
 	.uleb128 0x10
-	.4byte	0xb35b
+	.4byte	0xb3cb
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0x9371
+	.4byte	0x93e1
 	.uleb128 0x11
-	.4byte	0x9377
+	.4byte	0x93e7
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb346
+	.4byte	0xb3b6
 	.uleb128 0x15
-	.4byte	.LASF2367
+	.4byte	.LASF2381
 	.byte	0x2
 	.2byte	0x1d2
-	.4byte	0x91ee
+	.4byte	0x925e
 	.uleb128 0x15
-	.4byte	.LASF2368
+	.4byte	.LASF2382
 	.byte	0x2
 	.2byte	0x1d3
-	.4byte	0x91ee
+	.4byte	0x925e
 	.uleb128 0x14
 	.4byte	0x21e
-	.4byte	0xb397
+	.4byte	0xb407
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0xb30e
+	.4byte	0xb37e
 	.uleb128 0x11
-	.4byte	0x9371
+	.4byte	0x93e1
 	.uleb128 0x11
-	.4byte	0x9377
+	.4byte	0x93e7
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb379
+	.4byte	0xb3e9
 	.uleb128 0x1d
-	.4byte	.LASF2369
+	.4byte	.LASF2383
 	.byte	0x20
 	.byte	0x2
 	.2byte	0x255
-	.4byte	0xb3d2
+	.4byte	0xb442
 	.uleb128 0x1b
-	.4byte	.LASF2115
+	.4byte	.LASF2129
 	.byte	0x2
 	.2byte	0x256
-	.4byte	0x9e63
+	.4byte	0x9ed3
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2078
+	.4byte	.LASF2092
 	.byte	0x2
 	.2byte	0x257
-	.4byte	0xb3f1
+	.4byte	0xb461
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2142
+	.4byte	.LASF2156
 	.byte	0x2
 	.2byte	0x259
-	.4byte	0xb415
+	.4byte	0xb485
 	.byte	0x18
 	.byte	0
 	.uleb128 0x14
 	.4byte	0x2ee
-	.4byte	0xb3eb
+	.4byte	0xb45b
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0xb3eb
+	.4byte	0xb45b
 	.uleb128 0x11
 	.4byte	0x21e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb39d
+	.4byte	0xb40d
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb3d2
+	.4byte	0xb442
 	.uleb128 0x14
 	.4byte	0x2ee
-	.4byte	0xb415
+	.4byte	0xb485
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0xb3eb
+	.4byte	0xb45b
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
@@ -32400,49 +32459,49 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb3f7
+	.4byte	0xb467
 	.uleb128 0x1d
-	.4byte	.LASF2370
+	.4byte	.LASF2384
 	.byte	0x10
 	.byte	0x2
 	.2byte	0x30b
-	.4byte	0xb443
+	.4byte	0xb4b3
 	.uleb128 0x1b
-	.4byte	.LASF2371
+	.4byte	.LASF2385
 	.byte	0x2
 	.2byte	0x310
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2372
+	.4byte	.LASF2386
 	.byte	0x2
 	.2byte	0x311
 	.4byte	0x29
 	.byte	0x8
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2373
+	.4byte	.LASF2387
 	.byte	0x38
 	.byte	0x9f
 	.byte	0x15
-	.4byte	0xb4a4
+	.4byte	0xb514
 	.uleb128 0xe
-	.4byte	.LASF2374
+	.4byte	.LASF2388
 	.byte	0x9f
 	.byte	0x16
-	.4byte	0xb4a9
+	.4byte	0xb519
 	.byte	0
 	.uleb128 0x20
 	.string	"ops"
 	.byte	0x9f
 	.byte	0x17
-	.4byte	0xba5e
+	.4byte	0xbace
 	.byte	0x8
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x9f
 	.byte	0x18
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.byte	0x10
 	.uleb128 0xe
 	.4byte	.LASF130
@@ -32470,62 +32529,62 @@ __exitcall_ebc_exit:
 	.byte	0x30
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb443
+	.4byte	0xb4b3
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb443
+	.4byte	0xb4b3
 	.uleb128 0x1e
-	.4byte	.LASF2375
+	.4byte	.LASF2389
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x2
 	.2byte	0x396
-	.4byte	0xb4d9
+	.4byte	0xb549
 	.uleb128 0xc
-	.4byte	.LASF2376
+	.4byte	.LASF2390
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2377
+	.4byte	.LASF2391
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2378
+	.4byte	.LASF2392
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2379
+	.4byte	.LASF2393
 	.byte	0x3
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF2380
+	.4byte	.LASF2394
 	.byte	0x68
 	.byte	0x2
 	.2byte	0x3a8
-	.4byte	0xb569
+	.4byte	0xb5d9
 	.uleb128 0x1b
-	.4byte	.LASF2381
+	.4byte	.LASF2395
 	.byte	0x2
 	.2byte	0x3a9
 	.4byte	0x3a7
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2382
+	.4byte	.LASF2396
 	.byte	0x2
 	.2byte	0x3aa
 	.4byte	0x3a7
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2383
+	.4byte	.LASF2397
 	.byte	0x2
 	.2byte	0x3ab
 	.4byte	0x3a7
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2384
+	.4byte	.LASF2398
 	.byte	0x2
 	.2byte	0x3ac
 	.4byte	0x3a7
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF2385
+	.4byte	.LASF2399
 	.byte	0x2
 	.2byte	0x3ad
 	.4byte	0x2b0
@@ -32534,7 +32593,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF760
 	.byte	0x2
 	.2byte	0x3ae
-	.4byte	0xb4af
+	.4byte	0xb51f
 	.byte	0x44
 	.uleb128 0x1b
 	.4byte	.LASF130
@@ -32562,21 +32621,21 @@ __exitcall_ebc_exit:
 	.byte	0x60
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF2386
+	.4byte	.LASF2400
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb569
+	.4byte	0xb5d9
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xad45
+	.4byte	0xadb5
 	.uleb128 0xd
-	.4byte	.LASF2387
+	.4byte	.LASF2401
 	.byte	0xb0
 	.byte	0xa0
 	.byte	0x9f
-	.4byte	0xb676
+	.4byte	0xb6e6
 	.uleb128 0xe
-	.4byte	.LASF1853
+	.4byte	.LASF1867
 	.byte	0xa0
 	.byte	0xa0
 	.4byte	0x3a7
@@ -32591,10 +32650,10 @@ __exitcall_ebc_exit:
 	.string	"ops"
 	.byte	0xa0
 	.byte	0xa2
-	.4byte	0xbf69
+	.4byte	0xbfd9
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2388
+	.4byte	.LASF2402
 	.byte	0xa0
 	.byte	0xa3
 	.4byte	0x458
@@ -32606,34 +32665,34 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2389
+	.4byte	.LASF2403
 	.byte	0xa0
 	.byte	0xa5
 	.4byte	0x6d
 	.byte	0x2c
 	.uleb128 0xe
-	.4byte	.LASF2223
+	.4byte	.LASF2237
 	.byte	0xa0
 	.byte	0xa8
-	.4byte	0xb4a9
+	.4byte	0xb519
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2390
+	.4byte	.LASF2404
 	.byte	0xa0
 	.byte	0xa9
-	.4byte	0xbd54
+	.4byte	0xbdc4
 	.byte	0x38
 	.uleb128 0x20
 	.string	"gc"
 	.byte	0xa0
 	.byte	0xaa
-	.4byte	0xbf74
+	.4byte	0xbfe4
 	.byte	0x40
 	.uleb128 0xe
 	.4byte	.LASF640
 	.byte	0xa0
 	.byte	0xac
-	.4byte	0xb676
+	.4byte	0xb6e6
 	.byte	0x48
 	.uleb128 0xe
 	.4byte	.LASF130
@@ -32660,175 +32719,175 @@ __exitcall_ebc_exit:
 	.4byte	0x15a
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2391
+	.4byte	.LASF2405
 	.byte	0xa0
 	.byte	0xb8
 	.4byte	0x35c
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF2392
+	.4byte	.LASF2406
 	.byte	0xa0
 	.byte	0xb9
 	.4byte	0x6d
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2393
+	.4byte	.LASF2407
 	.byte	0xa0
 	.byte	0xba
 	.4byte	0x6d
 	.byte	0x7c
 	.uleb128 0xe
-	.4byte	.LASF2394
+	.4byte	.LASF2408
 	.byte	0xa0
 	.byte	0xbb
-	.4byte	0x4dd9
+	.4byte	0x4e49
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF2395
+	.4byte	.LASF2409
 	.byte	0xa0
 	.byte	0xbc
 	.4byte	0x246a
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2396
+	.4byte	.LASF2410
 	.byte	0xa0
 	.byte	0xbd
-	.4byte	0xbf7a
+	.4byte	0xbfea
 	.byte	0xb0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb57a
+	.4byte	0xb5ea
 	.uleb128 0x24
-	.4byte	.LASF2397
+	.4byte	.LASF2411
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb67c
+	.4byte	0xb6ec
 	.uleb128 0xd
-	.4byte	.LASF2398
+	.4byte	.LASF2412
 	.byte	0xc0
 	.byte	0xa
 	.byte	0x84
-	.4byte	0xb7b4
+	.4byte	0xb824
 	.uleb128 0xe
-	.4byte	.LASF2399
+	.4byte	.LASF2413
 	.byte	0xa
 	.byte	0x85
-	.4byte	0xdc64
+	.4byte	0xdcd4
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2400
+	.4byte	.LASF2414
 	.byte	0xa
 	.byte	0x88
-	.4byte	0xdc89
+	.4byte	0xdcf9
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF109
 	.byte	0xa
 	.byte	0x8b
-	.4byte	0xdcb7
+	.4byte	0xdd27
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2401
+	.4byte	.LASF2415
 	.byte	0xa
 	.byte	0x8f
-	.4byte	0xdceb
+	.4byte	0xdd5b
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2402
+	.4byte	.LASF2416
 	.byte	0xa
 	.byte	0x92
-	.4byte	0xdd19
+	.4byte	0xdd89
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2403
+	.4byte	.LASF2417
 	.byte	0xa
 	.byte	0x96
-	.4byte	0xdd3e
+	.4byte	0xddae
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2404
+	.4byte	.LASF2418
 	.byte	0xa
 	.byte	0x9d
-	.4byte	0xdd67
+	.4byte	0xddd7
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2405
+	.4byte	.LASF2419
 	.byte	0xa
 	.byte	0xa0
-	.4byte	0xdd8c
+	.4byte	0xddfc
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2406
+	.4byte	.LASF2420
 	.byte	0xa
 	.byte	0xa4
-	.4byte	0xddb5
+	.4byte	0xde25
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2407
+	.4byte	.LASF2421
 	.byte	0xa
 	.byte	0xa7
-	.4byte	0xdd3e
+	.4byte	0xddae
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2408
+	.4byte	.LASF2422
 	.byte	0xa
 	.byte	0xaa
-	.4byte	0xddd5
+	.4byte	0xde45
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2409
+	.4byte	.LASF2423
 	.byte	0xa
 	.byte	0xad
-	.4byte	0xddd5
+	.4byte	0xde45
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2410
+	.4byte	.LASF2424
 	.byte	0xa
 	.byte	0xb0
-	.4byte	0xddf5
+	.4byte	0xde65
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2411
+	.4byte	.LASF2425
 	.byte	0xa
 	.byte	0xb3
-	.4byte	0xddf5
+	.4byte	0xde65
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2412
+	.4byte	.LASF2426
 	.byte	0xa
 	.byte	0xb6
-	.4byte	0xde15
+	.4byte	0xde85
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF2413
+	.4byte	.LASF2427
 	.byte	0xa
 	.byte	0xb8
-	.4byte	0xde2f
+	.4byte	0xde9f
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2414
+	.4byte	.LASF2428
 	.byte	0xa
 	.byte	0xb9
-	.4byte	0xde49
+	.4byte	0xdeb9
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF2415
+	.4byte	.LASF2429
 	.byte	0xa
 	.byte	0xba
-	.4byte	0xde49
+	.4byte	0xdeb9
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF2416
+	.4byte	.LASF2430
 	.byte	0xa
 	.byte	0xbb
-	.4byte	0xde72
+	.4byte	0xdee2
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2417
+	.4byte	.LASF2431
 	.byte	0xa
 	.byte	0xbd
-	.4byte	0xde8d
+	.4byte	0xdefd
 	.byte	0x98
 	.uleb128 0xe
 	.4byte	.LASF130
@@ -32856,34 +32915,34 @@ __exitcall_ebc_exit:
 	.byte	0xb8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb687
+	.4byte	0xb6f7
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb7b4
+	.4byte	0xb824
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb41b
+	.4byte	0xb48b
 	.uleb128 0x24
-	.4byte	.LASF2418
+	.4byte	.LASF2432
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb7c5
-	.uleb128 0x48
+	.4byte	0xb835
+	.uleb128 0x4a
 	.string	"cma"
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb7d0
+	.4byte	0xb840
 	.uleb128 0x24
-	.4byte	.LASF2419
+	.4byte	.LASF2433
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb7db
+	.4byte	0xb84b
 	.uleb128 0xd
-	.4byte	.LASF2420
+	.4byte	.LASF2434
 	.byte	0xf0
 	.byte	0xe
 	.byte	0x33
-	.4byte	0xb88f
+	.4byte	0xb8ff
 	.uleb128 0xe
 	.4byte	.LASF265
 	.byte	0xe
@@ -32897,61 +32956,61 @@ __exitcall_ebc_exit:
 	.4byte	0x56
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2421
+	.4byte	.LASF2435
 	.byte	0xe
 	.byte	0x36
-	.4byte	0xbc60
+	.4byte	0xbcd0
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2422
+	.4byte	.LASF2436
 	.byte	0xe
 	.byte	0x37
 	.4byte	0x56
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2223
+	.4byte	.LASF2237
 	.byte	0xe
 	.byte	0x38
-	.4byte	0xb443
+	.4byte	0xb4b3
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2423
+	.4byte	.LASF2437
 	.byte	0xe
 	.byte	0x3a
-	.4byte	0xbcb4
+	.4byte	0xbd24
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2424
+	.4byte	.LASF2438
 	.byte	0xe
 	.byte	0x3b
-	.4byte	0xbcb4
+	.4byte	0xbd24
 	.byte	0x60
 	.uleb128 0xe
 	.4byte	.LASF640
 	.byte	0xe
 	.byte	0x3c
-	.4byte	0xb894
+	.4byte	0xb904
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2034
+	.4byte	.LASF2048
 	.byte	0xe
 	.byte	0x3d
-	.4byte	0xb894
+	.4byte	0xb904
 	.byte	0x70
 	.uleb128 0xe
 	.4byte	.LASF642
 	.byte	0xe
 	.byte	0x3e
-	.4byte	0xb894
+	.4byte	0xb904
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2146
+	.4byte	.LASF2160
 	.byte	0xe
 	.byte	0x40
-	.4byte	0x9107
+	.4byte	0x9177
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF2425
+	.4byte	.LASF2439
 	.byte	0xe
 	.byte	0x42
 	.4byte	0x29
@@ -32964,97 +33023,97 @@ __exitcall_ebc_exit:
 	.byte	0xe8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb7e6
+	.4byte	0xb856
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb7e6
+	.4byte	0xb856
 	.uleb128 0x24
-	.4byte	.LASF2230
+	.4byte	.LASF2244
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb89a
+	.4byte	0xb90a
 	.uleb128 0x24
-	.4byte	.LASF2231
+	.4byte	.LASF2245
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb8a5
+	.4byte	0xb915
 	.uleb128 0x15
-	.4byte	.LASF2426
+	.4byte	.LASF2440
 	.byte	0x2
 	.2byte	0x590
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.uleb128 0x15
-	.4byte	.LASF2427
+	.4byte	.LASF2441
 	.byte	0x2
 	.2byte	0x592
-	.4byte	0xa852
+	.4byte	0xa8c2
 	.uleb128 0x8
-	.4byte	.LASF2428
+	.4byte	.LASF2442
 	.byte	0x9e
 	.byte	0xe
 	.4byte	0x29
 	.uleb128 0x5
 	.4byte	0x8b
-	.4byte	0xb8e3
+	.4byte	0xb953
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x8
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0xb8f3
+	.4byte	0xb963
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x7f
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0xb903
+	.4byte	0xb973
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x13
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF2429
+	.4byte	.LASF2443
 	.byte	0x20
 	.byte	0x9e
 	.2byte	0x222
-	.4byte	0xb92b
+	.4byte	0xb99b
 	.uleb128 0x1b
 	.4byte	.LASF265
 	.byte	0x9e
 	.2byte	0x223
-	.4byte	0xb8f3
+	.4byte	0xb963
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2204
+	.4byte	.LASF2218
 	.byte	0x9e
 	.2byte	0x224
-	.4byte	0xb8c8
+	.4byte	0xb938
 	.byte	0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb903
+	.4byte	0xb973
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xb940
+	.4byte	0xb9b0
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb930
+	.4byte	0xb9a0
 	.uleb128 0x19
-	.4byte	.LASF2430
+	.4byte	.LASF2444
 	.byte	0xa1
 	.byte	0x14
 	.4byte	0xc6
 	.uleb128 0xd
-	.4byte	.LASF2431
+	.4byte	.LASF2445
 	.byte	0x20
 	.byte	0xa1
 	.byte	0x1e
-	.4byte	0xb981
+	.4byte	0xb9f1
 	.uleb128 0xe
 	.4byte	.LASF228
 	.byte	0xa1
@@ -33062,10 +33121,10 @@ __exitcall_ebc_exit:
 	.4byte	0xe33
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2432
+	.4byte	.LASF2446
 	.byte	0xa1
 	.byte	0x20
-	.4byte	0x3532
+	.4byte	0x35a2
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF98
@@ -33076,125 +33135,125 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb987
+	.4byte	0xb9f7
 	.uleb128 0x24
-	.4byte	.LASF2433
+	.4byte	.LASF2447
 	.uleb128 0xd
-	.4byte	.LASF2434
+	.4byte	.LASF2448
 	.byte	0x80
 	.byte	0x9f
 	.byte	0x75
-	.4byte	0xba59
+	.4byte	0xbac9
 	.uleb128 0x20
 	.string	"get"
 	.byte	0x9f
 	.byte	0x76
-	.4byte	0xbaea
+	.4byte	0xbb5a
 	.byte	0
 	.uleb128 0x20
 	.string	"put"
 	.byte	0x9f
 	.byte	0x77
-	.4byte	0xbafb
+	.4byte	0xbb6b
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2435
+	.4byte	.LASF2449
 	.byte	0x9f
 	.byte	0x78
-	.4byte	0xbb10
+	.4byte	0xbb80
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2436
+	.4byte	.LASF2450
 	.byte	0x9f
 	.byte	0x79
-	.4byte	0xbb30
+	.4byte	0xbba0
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2437
+	.4byte	.LASF2451
 	.byte	0x9f
 	.byte	0x7b
-	.4byte	0xbb4a
+	.4byte	0xbbba
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2438
+	.4byte	.LASF2452
 	.byte	0x9f
 	.byte	0x7d
-	.4byte	0xbb73
+	.4byte	0xbbe3
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2439
+	.4byte	.LASF2453
 	.byte	0x9f
 	.byte	0x82
-	.4byte	0xbb9d
+	.4byte	0xbc0d
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2440
+	.4byte	.LASF2454
 	.byte	0x9f
 	.byte	0x85
-	.4byte	0xbbb2
+	.4byte	0xbc22
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2441
+	.4byte	.LASF2455
 	.byte	0x9f
 	.byte	0x87
-	.4byte	0xbbcc
+	.4byte	0xbc3c
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2442
+	.4byte	.LASF2456
 	.byte	0x9f
 	.byte	0x8a
-	.4byte	0xbbe6
+	.4byte	0xbc56
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2443
+	.4byte	.LASF2457
 	.byte	0x9f
 	.byte	0x8c
-	.4byte	0xbc1a
+	.4byte	0xbc8a
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2444
+	.4byte	.LASF2458
 	.byte	0x9f
 	.byte	0x91
-	.4byte	0xbbcc
+	.4byte	0xbc3c
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2445
+	.4byte	.LASF2459
 	.byte	0x9f
 	.byte	0x94
-	.4byte	0xbbb2
+	.4byte	0xbc22
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2446
+	.4byte	.LASF2460
 	.byte	0x9f
 	.byte	0x96
-	.4byte	0xbaea
+	.4byte	0xbb5a
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2447
+	.4byte	.LASF2461
 	.byte	0x9f
 	.byte	0x97
-	.4byte	0xbc3a
+	.4byte	0xbcaa
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF2448
+	.4byte	.LASF2462
 	.byte	0x9f
 	.byte	0x99
-	.4byte	0xbc54
+	.4byte	0xbcc4
 	.byte	0x78
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb98c
+	.4byte	0xb9fc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xba59
+	.4byte	0xbac9
 	.uleb128 0xd
-	.4byte	.LASF2449
+	.4byte	.LASF2463
 	.byte	0x10
 	.byte	0x9f
 	.byte	0x26
-	.4byte	0xba94
+	.4byte	0xbb04
 	.uleb128 0xe
-	.4byte	.LASF2450
+	.4byte	.LASF2464
 	.byte	0x9f
 	.byte	0x27
 	.4byte	0x6d
@@ -33206,103 +33265,103 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF2451
+	.4byte	.LASF2465
 	.byte	0x9f
 	.byte	0x29
-	.4byte	0xba94
+	.4byte	0xbb04
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb4a4
+	.4byte	0xb514
 	.uleb128 0xd
-	.4byte	.LASF2452
+	.4byte	.LASF2466
 	.byte	0x50
 	.byte	0x9f
 	.byte	0x34
-	.4byte	0xbacb
+	.4byte	0xbb3b
 	.uleb128 0xe
-	.4byte	.LASF2223
+	.4byte	.LASF2237
 	.byte	0x9f
 	.byte	0x35
-	.4byte	0xb4a9
+	.4byte	0xb519
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2453
+	.4byte	.LASF2467
 	.byte	0x9f
 	.byte	0x36
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1755
+	.4byte	.LASF1769
 	.byte	0x9f
 	.byte	0x37
-	.4byte	0xbacb
+	.4byte	0xbb3b
 	.byte	0x10
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x15a
-	.4byte	0xbadb
+	.4byte	0xbb4b
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x7
 	.byte	0
 	.uleb128 0x14
-	.4byte	0xb4a9
-	.4byte	0xbaea
+	.4byte	0xb519
+	.4byte	0xbb5a
 	.uleb128 0x11
-	.4byte	0xb4a9
+	.4byte	0xb519
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbadb
+	.4byte	0xbb4b
 	.uleb128 0x10
-	.4byte	0xbafb
+	.4byte	0xbb6b
 	.uleb128 0x11
-	.4byte	0xb4a9
+	.4byte	0xb519
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbaf0
+	.4byte	0xbb60
 	.uleb128 0x14
 	.4byte	0x2b0
-	.4byte	0xbb10
+	.4byte	0xbb80
 	.uleb128 0x11
-	.4byte	0xba94
+	.4byte	0xbb04
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbb01
+	.4byte	0xbb71
 	.uleb128 0x14
 	.4byte	0x30bc
-	.4byte	0xbb2a
+	.4byte	0xbb9a
 	.uleb128 0x11
-	.4byte	0xba94
+	.4byte	0xbb04
 	.uleb128 0x11
-	.4byte	0xbb2a
+	.4byte	0xbb9a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa84d
+	.4byte	0xa8bd
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbb16
+	.4byte	0xbb86
 	.uleb128 0x14
 	.4byte	0x2b0
-	.4byte	0xbb4a
+	.4byte	0xbbba
 	.uleb128 0x11
-	.4byte	0xba94
+	.4byte	0xbb04
 	.uleb128 0x11
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbb36
+	.4byte	0xbba6
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbb73
+	.4byte	0xbbe3
 	.uleb128 0x11
-	.4byte	0xba94
+	.4byte	0xbb04
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
@@ -33314,16 +33373,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbb50
+	.4byte	0xbbc0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbb97
+	.4byte	0xbc07
 	.uleb128 0x11
-	.4byte	0xba94
+	.4byte	0xbb04
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
-	.4byte	0xbb97
+	.4byte	0xbc07
 	.uleb128 0x11
 	.4byte	0x2e3
 	.byte	0
@@ -33332,43 +33391,43 @@ __exitcall_ebc_exit:
 	.4byte	0x56
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbb79
+	.4byte	0xbbe9
 	.uleb128 0x14
-	.4byte	0xb4a9
-	.4byte	0xbbb2
+	.4byte	0xb519
+	.4byte	0xbc22
 	.uleb128 0x11
-	.4byte	0xba94
+	.4byte	0xbb04
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbba3
+	.4byte	0xbc13
 	.uleb128 0x14
-	.4byte	0xb4a9
-	.4byte	0xbbcc
+	.4byte	0xb519
+	.4byte	0xbc3c
 	.uleb128 0x11
-	.4byte	0xba94
+	.4byte	0xbb04
 	.uleb128 0x11
-	.4byte	0xb4a9
+	.4byte	0xb519
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbbb8
+	.4byte	0xbc28
 	.uleb128 0x14
-	.4byte	0xb4a9
-	.4byte	0xbbe6
+	.4byte	0xb519
+	.4byte	0xbc56
 	.uleb128 0x11
-	.4byte	0xba94
+	.4byte	0xbb04
 	.uleb128 0x11
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbbd2
+	.4byte	0xbc42
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbc14
+	.4byte	0xbc84
 	.uleb128 0x11
-	.4byte	0xba94
+	.4byte	0xbb04
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
@@ -33378,53 +33437,53 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
-	.4byte	0xbc14
+	.4byte	0xbc84
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xba9a
+	.4byte	0xbb0a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbbec
+	.4byte	0xbc5c
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbc34
+	.4byte	0xbca4
 	.uleb128 0x11
-	.4byte	0xba94
+	.4byte	0xbb04
 	.uleb128 0x11
-	.4byte	0xbc34
+	.4byte	0xbca4
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xba64
+	.4byte	0xbad4
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbc20
+	.4byte	0xbc90
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbc54
+	.4byte	0xbcc4
 	.uleb128 0x11
-	.4byte	0xba94
+	.4byte	0xbb04
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbc40
+	.4byte	0xbcb0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x14a
 	.uleb128 0x8
-	.4byte	.LASF2421
+	.4byte	.LASF2435
 	.byte	0xe
 	.byte	0x1c
 	.4byte	0x13f
 	.uleb128 0xd
-	.4byte	.LASF2454
+	.4byte	.LASF2468
 	.byte	0x58
 	.byte	0xe
 	.byte	0x1f
-	.4byte	0xbcb4
+	.4byte	0xbd24
 	.uleb128 0xe
 	.4byte	.LASF265
 	.byte	0xe
@@ -33432,13 +33491,13 @@ __exitcall_ebc_exit:
 	.4byte	0x21e
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2455
+	.4byte	.LASF2469
 	.byte	0xe
 	.byte	0x21
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2456
+	.4byte	.LASF2470
 	.byte	0xe
 	.byte	0x22
 	.4byte	0x458
@@ -33447,226 +33506,226 @@ __exitcall_ebc_exit:
 	.4byte	.LASF64
 	.byte	0xe
 	.byte	0x23
-	.4byte	0xbcb4
+	.4byte	0xbd24
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2115
+	.4byte	.LASF2129
 	.byte	0xe
 	.byte	0x2b
-	.4byte	0x9f1a
+	.4byte	0x9f8a
 	.byte	0x20
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbc6b
+	.4byte	0xbcdb
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb88f
+	.4byte	0xb8ff
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x23f
 	.uleb128 0x19
-	.4byte	.LASF2457
+	.4byte	.LASF2471
 	.byte	0xe
 	.byte	0x6a
-	.4byte	0xa0e2
+	.4byte	0xa152
 	.uleb128 0x19
-	.4byte	.LASF2458
+	.4byte	.LASF2472
 	.byte	0xe
 	.byte	0x6b
-	.4byte	0xba59
+	.4byte	0xbac9
 	.uleb128 0x19
-	.4byte	.LASF2459
+	.4byte	.LASF2473
 	.byte	0xe
 	.byte	0x87
-	.4byte	0xb894
+	.4byte	0xb904
 	.uleb128 0x19
-	.4byte	.LASF2460
+	.4byte	.LASF2474
 	.byte	0xe
 	.byte	0x88
-	.4byte	0xb894
+	.4byte	0xb904
 	.uleb128 0x19
-	.4byte	.LASF2461
+	.4byte	.LASF2475
 	.byte	0xe
 	.byte	0x89
-	.4byte	0xb894
+	.4byte	0xb904
 	.uleb128 0x19
-	.4byte	.LASF2462
+	.4byte	.LASF2476
 	.byte	0xe
 	.byte	0x8a
-	.4byte	0xb894
+	.4byte	0xb904
 	.uleb128 0x19
-	.4byte	.LASF2463
+	.4byte	.LASF2477
 	.byte	0xe
 	.byte	0x8b
 	.4byte	0xe33
 	.uleb128 0xd
-	.4byte	.LASF2464
+	.4byte	.LASF2478
 	.byte	0x50
 	.byte	0xa0
 	.byte	0x3f
-	.4byte	0xbd44
+	.4byte	0xbdb4
 	.uleb128 0xe
-	.4byte	.LASF2223
+	.4byte	.LASF2237
 	.byte	0xa0
 	.byte	0x40
-	.4byte	0xb4a9
+	.4byte	0xb519
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2465
+	.4byte	.LASF2479
 	.byte	0xa0
 	.byte	0x41
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2466
+	.4byte	.LASF2480
 	.byte	0xa0
 	.byte	0x42
-	.4byte	0xbd44
+	.4byte	0xbdb4
 	.byte	0xc
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x13f
-	.4byte	0xbd54
+	.4byte	0xbdc4
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF2467
+	.4byte	.LASF2481
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xa0
 	.byte	0x4c
-	.4byte	0xbd95
+	.4byte	0xbe05
 	.uleb128 0xc
-	.4byte	.LASF2468
+	.4byte	.LASF2482
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2469
+	.4byte	.LASF2483
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2470
+	.4byte	.LASF2484
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2471
+	.4byte	.LASF2485
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2472
+	.4byte	.LASF2486
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF2473
+	.4byte	.LASF2487
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF2474
+	.4byte	.LASF2488
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF2475
+	.4byte	.LASF2489
 	.byte	0x7
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2476
+	.4byte	.LASF2490
 	.byte	0x50
 	.byte	0xa0
 	.byte	0x66
-	.4byte	0xbe1a
+	.4byte	0xbe8a
 	.uleb128 0xe
-	.4byte	.LASF2331
+	.4byte	.LASF2345
 	.byte	0xa0
 	.byte	0x67
-	.4byte	0xbe38
+	.4byte	0xbea8
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2477
+	.4byte	.LASF2491
 	.byte	0xa0
 	.byte	0x69
-	.4byte	0xbe5d
+	.4byte	0xbecd
 	.byte	0x8
 	.uleb128 0x20
 	.string	"map"
 	.byte	0xa0
 	.byte	0x6b
-	.4byte	0xbe7c
+	.4byte	0xbeec
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2478
+	.4byte	.LASF2492
 	.byte	0xa0
 	.byte	0x6c
-	.4byte	0xbe92
+	.4byte	0xbf02
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2479
+	.4byte	.LASF2493
 	.byte	0xa0
 	.byte	0x6d
-	.4byte	0xbec0
+	.4byte	0xbf30
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2399
+	.4byte	.LASF2413
 	.byte	0xa0
 	.byte	0x72
-	.4byte	0xbee4
+	.4byte	0xbf54
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2400
+	.4byte	.LASF2414
 	.byte	0xa0
 	.byte	0x74
-	.4byte	0xbeff
+	.4byte	0xbf6f
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2318
+	.4byte	.LASF2332
 	.byte	0xa0
 	.byte	0x76
-	.4byte	0xbf1e
+	.4byte	0xbf8e
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2480
+	.4byte	.LASF2494
 	.byte	0xa0
 	.byte	0x77
-	.4byte	0xbf34
+	.4byte	0xbfa4
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2481
+	.4byte	.LASF2495
 	.byte	0xa0
 	.byte	0x78
-	.4byte	0xbf58
+	.4byte	0xbfc8
 	.byte	0x48
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xbd95
+	.4byte	0xbe05
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbe38
+	.4byte	0xbea8
 	.uleb128 0x11
-	.4byte	0xb676
+	.4byte	0xb6e6
 	.uleb128 0x11
-	.4byte	0xb894
+	.4byte	0xb904
 	.uleb128 0x11
-	.4byte	0xbd54
+	.4byte	0xbdc4
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbe1f
+	.4byte	0xbe8f
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbe57
+	.4byte	0xbec7
 	.uleb128 0x11
-	.4byte	0xb676
+	.4byte	0xb6e6
 	.uleb128 0x11
-	.4byte	0xbe57
+	.4byte	0xbec7
 	.uleb128 0x11
-	.4byte	0xbd54
+	.4byte	0xbdc4
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbd13
+	.4byte	0xbd83
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbe3e
+	.4byte	0xbeae
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbe7c
+	.4byte	0xbeec
 	.uleb128 0x11
-	.4byte	0xb676
+	.4byte	0xb6e6
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
@@ -33674,41 +33733,41 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbe63
+	.4byte	0xbed3
 	.uleb128 0x10
-	.4byte	0xbe92
+	.4byte	0xbf02
 	.uleb128 0x11
-	.4byte	0xb676
+	.4byte	0xb6e6
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbe82
+	.4byte	0xbef2
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbec0
+	.4byte	0xbf30
 	.uleb128 0x11
-	.4byte	0xb676
+	.4byte	0xb6e6
 	.uleb128 0x11
-	.4byte	0xb894
+	.4byte	0xb904
 	.uleb128 0x11
-	.4byte	0xbc5a
+	.4byte	0xbcca
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
-	.4byte	0x6897
+	.4byte	0x6907
 	.uleb128 0x11
-	.4byte	0x3573
+	.4byte	0x35e3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbe98
+	.4byte	0xbf08
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbee4
+	.4byte	0xbf54
 	.uleb128 0x11
-	.4byte	0xb676
+	.4byte	0xb6e6
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
@@ -33718,11 +33777,11 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbec6
+	.4byte	0xbf36
 	.uleb128 0x10
-	.4byte	0xbeff
+	.4byte	0xbf6f
 	.uleb128 0x11
-	.4byte	0xb676
+	.4byte	0xb6e6
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
@@ -33730,82 +33789,82 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbeea
+	.4byte	0xbf5a
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbf1e
+	.4byte	0xbf8e
 	.uleb128 0x11
-	.4byte	0xb676
+	.4byte	0xb6e6
 	.uleb128 0x11
-	.4byte	0xb981
+	.4byte	0xb9f1
 	.uleb128 0x11
 	.4byte	0x2b0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbf05
+	.4byte	0xbf75
 	.uleb128 0x10
-	.4byte	0xbf34
+	.4byte	0xbfa4
 	.uleb128 0x11
-	.4byte	0xb676
+	.4byte	0xb6e6
 	.uleb128 0x11
-	.4byte	0xb981
+	.4byte	0xb9f1
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbf24
+	.4byte	0xbf94
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbf58
+	.4byte	0xbfc8
 	.uleb128 0x11
-	.4byte	0xb676
+	.4byte	0xb6e6
 	.uleb128 0x11
-	.4byte	0xbe57
+	.4byte	0xbec7
 	.uleb128 0x11
-	.4byte	0x6897
+	.4byte	0x6907
 	.uleb128 0x11
-	.4byte	0x3573
+	.4byte	0x35e3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbf3a
+	.4byte	0xbfaa
 	.uleb128 0x19
-	.4byte	.LASF2482
+	.4byte	.LASF2496
 	.byte	0xa0
 	.byte	0x81
-	.4byte	0xbd95
+	.4byte	0xbe05
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbe1a
+	.4byte	0xbe8a
 	.uleb128 0x24
-	.4byte	.LASF2483
+	.4byte	.LASF2497
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbf6f
+	.4byte	0xbfdf
 	.uleb128 0x5
 	.4byte	0x6d
-	.4byte	0xbf89
-	.uleb128 0x44
+	.4byte	0xbff9
+	.uleb128 0x46
 	.4byte	0x4f
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF2484
+	.4byte	.LASF2498
 	.byte	0xa0
 	.2byte	0x121
-	.4byte	0xba59
+	.4byte	0xbac9
 	.uleb128 0x15
-	.4byte	.LASF2485
+	.4byte	.LASF2499
 	.byte	0xa0
 	.2byte	0x1a5
-	.4byte	0xbe1a
+	.4byte	0xbe8a
 	.uleb128 0xd
-	.4byte	.LASF2486
+	.4byte	.LASF2500
 	.byte	0x10
 	.byte	0xa2
 	.byte	0x45
-	.4byte	0xbfde
+	.4byte	0xc04e
 	.uleb128 0xe
-	.4byte	.LASF1150
+	.4byte	.LASF1164
 	.byte	0xa2
 	.byte	0x46
 	.4byte	0xa9
@@ -33826,65 +33885,65 @@ __exitcall_ebc_exit:
 	.string	"buf"
 	.byte	0xa2
 	.byte	0x55
-	.4byte	0xbfde
+	.4byte	0xc04e
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x8b
-	.uleb128 0x39
-	.4byte	.LASF2487
+	.uleb128 0x3b
+	.4byte	.LASF2501
 	.byte	0x22
 	.byte	0xa2
 	.byte	0x87
-	.4byte	0xc012
+	.4byte	0xc082
 	.uleb128 0x22
-	.4byte	.LASF2488
+	.4byte	.LASF2502
 	.byte	0xa2
 	.byte	0x88
 	.4byte	0x8b
 	.uleb128 0x22
-	.4byte	.LASF2489
+	.4byte	.LASF2503
 	.byte	0xa2
 	.byte	0x89
 	.4byte	0xa9
 	.uleb128 0x22
-	.4byte	.LASF2490
+	.4byte	.LASF2504
 	.byte	0xa2
 	.byte	0x8a
-	.4byte	0xc012
+	.4byte	0xc082
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x8b
-	.4byte	0xc022
+	.4byte	0xc092
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x21
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2491
+	.4byte	.LASF2505
 	.byte	0xa3
 	.byte	0x27
-	.4byte	0xaddd
+	.4byte	0xae4d
 	.uleb128 0x19
-	.4byte	.LASF2492
+	.4byte	.LASF2506
 	.byte	0xa3
 	.byte	0x28
-	.4byte	0xb0d5
+	.4byte	0xb145
 	.uleb128 0x19
-	.4byte	.LASF2493
+	.4byte	.LASF2507
 	.byte	0xa3
 	.byte	0x29
-	.4byte	0xb0d5
+	.4byte	0xb145
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc049
+	.4byte	0xc0b9
 	.uleb128 0x1a
-	.4byte	.LASF2494
+	.4byte	.LASF2508
 	.2byte	0x3e8
 	.byte	0xa3
 	.2byte	0x148
-	.4byte	0xc0c3
+	.4byte	0xc133
 	.uleb128 0x1b
 	.4byte	.LASF171
 	.byte	0xa3
@@ -33892,7 +33951,7 @@ __exitcall_ebc_exit:
 	.4byte	0xb4
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1150
+	.4byte	.LASF1164
 	.byte	0xa3
 	.2byte	0x14a
 	.4byte	0xb4
@@ -33901,22 +33960,22 @@ __exitcall_ebc_exit:
 	.4byte	.LASF265
 	.byte	0xa3
 	.2byte	0x14d
-	.4byte	0xb8f3
+	.4byte	0xb963
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF2495
+	.4byte	.LASF2509
 	.byte	0xa3
 	.2byte	0x14e
-	.4byte	0xc1ce
+	.4byte	0xc23e
 	.byte	0x18
 	.uleb128 0x2b
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x14f
-	.4byte	0xa576
+	.4byte	0xa5e6
 	.byte	0x20
 	.uleb128 0x1c
-	.4byte	.LASF2496
+	.4byte	.LASF2510
 	.byte	0xa3
 	.2byte	0x150
 	.4byte	0xc6
@@ -33928,73 +33987,73 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.2byte	0x3d4
 	.uleb128 0x1c
-	.4byte	.LASF2497
+	.4byte	.LASF2511
 	.byte	0xa3
 	.2byte	0x152
 	.4byte	0x3a7
 	.2byte	0x3d8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xc049
+	.4byte	0xc0b9
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x110
 	.uleb128 0x1a
-	.4byte	.LASF2498
+	.4byte	.LASF2512
 	.2byte	0x4c0
 	.byte	0xa3
 	.2byte	0x2a0
-	.4byte	0xc1ce
+	.4byte	0xc23e
 	.uleb128 0x1b
 	.4byte	.LASF98
 	.byte	0xa3
 	.2byte	0x2a1
-	.4byte	0x757b
+	.4byte	0x75eb
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2228
+	.4byte	.LASF2242
 	.byte	0xa3
 	.2byte	0x2a2
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2499
+	.4byte	.LASF2513
 	.byte	0xa3
 	.2byte	0x2a3
-	.4byte	0xc429
+	.4byte	0xc499
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2500
+	.4byte	.LASF2514
 	.byte	0xa3
 	.2byte	0x2a4
 	.4byte	0x458
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF2501
+	.4byte	.LASF2515
 	.byte	0xa3
 	.2byte	0x2a7
-	.4byte	0xc42f
+	.4byte	0xc49f
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2502
+	.4byte	.LASF2516
 	.byte	0xa3
 	.2byte	0x2a8
-	.4byte	0xb950
+	.4byte	0xb9c0
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF2503
+	.4byte	.LASF2517
 	.byte	0xa3
 	.2byte	0x2a9
-	.4byte	0xb950
+	.4byte	0xb9c0
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1067
+	.4byte	.LASF1081
 	.byte	0xa3
 	.2byte	0x2ab
 	.4byte	0xc6
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF2504
+	.4byte	.LASF2518
 	.byte	0xa3
 	.2byte	0x2ac
 	.4byte	0xc6
@@ -34003,7 +34062,7 @@ __exitcall_ebc_exit:
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x2ad
-	.4byte	0xa576
+	.4byte	0xa5e6
 	.byte	0x70
 	.uleb128 0x30
 	.string	"nr"
@@ -34015,99 +34074,99 @@ __exitcall_ebc_exit:
 	.4byte	.LASF265
 	.byte	0xa3
 	.2byte	0x2b0
-	.4byte	0xc435
+	.4byte	0xc4a5
 	.2byte	0x424
 	.uleb128 0x1c
-	.4byte	.LASF2505
+	.4byte	.LASF2519
 	.byte	0xa3
 	.2byte	0x2b1
-	.4byte	0x4653
+	.4byte	0x46c3
 	.2byte	0x458
 	.uleb128 0x1c
-	.4byte	.LASF2506
+	.4byte	.LASF2520
 	.byte	0xa3
 	.2byte	0x2b3
 	.4byte	0x246a
 	.2byte	0x478
 	.uleb128 0x1c
-	.4byte	.LASF2507
+	.4byte	.LASF2521
 	.byte	0xa3
 	.2byte	0x2b4
 	.4byte	0x3a7
 	.2byte	0x498
 	.uleb128 0x1c
-	.4byte	.LASF2508
+	.4byte	.LASF2522
 	.byte	0xa3
 	.2byte	0x2b6
-	.4byte	0xc445
+	.4byte	0xc4b5
 	.2byte	0x4a8
 	.uleb128 0x1c
-	.4byte	.LASF2509
+	.4byte	.LASF2523
 	.byte	0xa3
 	.2byte	0x2b7
-	.4byte	0xc44b
+	.4byte	0xc4bb
 	.2byte	0x4b0
 	.uleb128 0x1c
-	.4byte	.LASF2510
+	.4byte	.LASF2524
 	.byte	0xa3
 	.2byte	0x2b9
-	.4byte	0xb676
+	.4byte	0xb6e6
 	.2byte	0x4b8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc0ce
+	.4byte	0xc13e
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x97e9
+	.4byte	0x9859
 	.uleb128 0x1d
-	.4byte	.LASF2511
+	.4byte	.LASF2525
 	.byte	0x18
 	.byte	0xa3
 	.2byte	0x207
-	.4byte	0xc20f
+	.4byte	0xc27f
 	.uleb128 0x1b
-	.4byte	.LASF2512
+	.4byte	.LASF2526
 	.byte	0xa3
 	.2byte	0x20e
-	.4byte	0xc233
+	.4byte	0xc2a3
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2513
+	.4byte	.LASF2527
 	.byte	0xa3
 	.2byte	0x210
-	.4byte	0xc26c
+	.4byte	0xc2dc
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2514
+	.4byte	.LASF2528
 	.byte	0xa3
 	.2byte	0x215
-	.4byte	0xc281
+	.4byte	0xc2f1
 	.byte	0x10
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xc1da
+	.4byte	0xc24a
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xc22d
+	.4byte	0xc29d
 	.uleb128 0x11
-	.4byte	0xc1ce
+	.4byte	0xc23e
 	.uleb128 0x11
-	.4byte	0xc22d
+	.4byte	0xc29d
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbfa1
+	.4byte	0xc011
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc214
+	.4byte	0xc284
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xc266
+	.4byte	0xc2d6
 	.uleb128 0x11
-	.4byte	0xc1ce
+	.4byte	0xc23e
 	.uleb128 0x11
 	.4byte	0x11f
 	.uleb128 0x11
@@ -34119,176 +34178,176 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xc266
+	.4byte	0xc2d6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbfe4
+	.4byte	0xc054
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc239
+	.4byte	0xc2a9
 	.uleb128 0x14
 	.4byte	0x13f
-	.4byte	0xc281
+	.4byte	0xc2f1
 	.uleb128 0x11
-	.4byte	0xc1ce
+	.4byte	0xc23e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc272
+	.4byte	0xc2e2
 	.uleb128 0x1d
-	.4byte	.LASF2515
+	.4byte	.LASF2529
 	.byte	0x18
 	.byte	0xa3
 	.2byte	0x225
-	.4byte	0xc2bc
+	.4byte	0xc32c
 	.uleb128 0x1b
-	.4byte	.LASF2516
+	.4byte	.LASF2530
 	.byte	0xa3
 	.2byte	0x226
-	.4byte	0xc2d1
+	.4byte	0xc341
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2517
+	.4byte	.LASF2531
 	.byte	0xa3
 	.2byte	0x227
-	.4byte	0xc2eb
+	.4byte	0xc35b
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2518
+	.4byte	.LASF2532
 	.byte	0xa3
 	.2byte	0x228
-	.4byte	0xc2d1
+	.4byte	0xc341
 	.byte	0x10
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xc287
+	.4byte	0xc2f7
 	.uleb128 0x10
-	.4byte	0xc2d1
+	.4byte	0xc341
 	.uleb128 0x11
-	.4byte	0xc1ce
+	.4byte	0xc23e
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc2c1
+	.4byte	0xc331
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xc2eb
+	.4byte	0xc35b
 	.uleb128 0x11
-	.4byte	0xc1ce
+	.4byte	0xc23e
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc2d7
+	.4byte	0xc347
 	.uleb128 0x1d
-	.4byte	.LASF2519
+	.4byte	.LASF2533
 	.byte	0x50
 	.byte	0xa3
 	.2byte	0x254
-	.4byte	0xc381
+	.4byte	0xc3f1
 	.uleb128 0x1b
-	.4byte	.LASF2520
+	.4byte	.LASF2534
 	.byte	0xa3
 	.2byte	0x255
-	.4byte	0xc390
+	.4byte	0xc400
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2521
+	.4byte	.LASF2535
 	.byte	0xa3
 	.2byte	0x257
-	.4byte	0xc390
+	.4byte	0xc400
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2522
+	.4byte	.LASF2536
 	.byte	0xa3
 	.2byte	0x258
-	.4byte	0xc3a6
+	.4byte	0xc416
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2523
+	.4byte	.LASF2537
 	.byte	0xa3
 	.2byte	0x259
-	.4byte	0xc390
+	.4byte	0xc400
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF2524
+	.4byte	.LASF2538
 	.byte	0xa3
 	.2byte	0x25a
-	.4byte	0xc3a6
+	.4byte	0xc416
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2525
+	.4byte	.LASF2539
 	.byte	0xa3
 	.2byte	0x25b
-	.4byte	0xc390
+	.4byte	0xc400
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF2526
+	.4byte	.LASF2540
 	.byte	0xa3
 	.2byte	0x25d
-	.4byte	0xc3b7
+	.4byte	0xc427
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF2527
+	.4byte	.LASF2541
 	.byte	0xa3
 	.2byte	0x25e
-	.4byte	0xc3b7
+	.4byte	0xc427
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF2528
+	.4byte	.LASF2542
 	.byte	0xa3
 	.2byte	0x261
-	.4byte	0xc3c2
+	.4byte	0xc432
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF2529
+	.4byte	.LASF2543
 	.byte	0xa3
 	.2byte	0x262
-	.4byte	0xc3c2
+	.4byte	0xc432
 	.byte	0x48
 	.byte	0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xc390
+	.4byte	0xc400
 	.uleb128 0x11
-	.4byte	0xc1ce
+	.4byte	0xc23e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc381
+	.4byte	0xc3f1
 	.uleb128 0x10
-	.4byte	0xc3a6
+	.4byte	0xc416
 	.uleb128 0x11
-	.4byte	0xc1ce
+	.4byte	0xc23e
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc396
+	.4byte	0xc406
 	.uleb128 0x10
-	.4byte	0xc3b7
+	.4byte	0xc427
 	.uleb128 0x11
-	.4byte	0xc1ce
+	.4byte	0xc23e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc3ac
+	.4byte	0xc41c
 	.uleb128 0x24
-	.4byte	.LASF2530
+	.4byte	.LASF2544
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc3bd
+	.4byte	0xc42d
 	.uleb128 0x1d
-	.4byte	.LASF2531
+	.4byte	.LASF2545
 	.byte	0x18
 	.byte	0xa3
 	.2byte	0x27f
-	.4byte	0xc424
+	.4byte	0xc494
 	.uleb128 0x1b
 	.4byte	.LASF171
 	.byte	0xa3
@@ -34296,59 +34355,59 @@ __exitcall_ebc_exit:
 	.4byte	0x15a
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2532
+	.4byte	.LASF2546
 	.byte	0xa3
 	.2byte	0x281
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2533
+	.4byte	.LASF2547
 	.byte	0xa3
 	.2byte	0x282
 	.4byte	0x11f
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF2534
+	.4byte	.LASF2548
 	.byte	0xa3
 	.2byte	0x283
 	.4byte	0x11f
 	.byte	0xe
 	.uleb128 0x1b
-	.4byte	.LASF2535
+	.4byte	.LASF2549
 	.byte	0xa3
 	.2byte	0x284
 	.4byte	0x11f
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2536
+	.4byte	.LASF2550
 	.byte	0xa3
 	.2byte	0x285
 	.4byte	0x11f
 	.byte	0x12
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xc3c8
+	.4byte	0xc438
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc20f
+	.4byte	0xc27f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc2bc
+	.4byte	0xc32c
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0xc445
+	.4byte	0xc4b5
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc2f1
+	.4byte	0xc361
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc424
+	.4byte	0xc494
 	.uleb128 0x19
-	.4byte	.LASF2537
+	.4byte	.LASF2551
 	.byte	0xa4
 	.byte	0x8
 	.4byte	0xc6
@@ -34356,43 +34415,43 @@ __exitcall_ebc_exit:
 	.byte	0x40
 	.byte	0xa5
 	.byte	0x1d
-	.4byte	0xc47d
+	.4byte	0xc4ed
 	.uleb128 0xe
-	.4byte	.LASF2538
+	.4byte	.LASF2552
 	.byte	0xa5
 	.byte	0x1e
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2539
+	.4byte	.LASF2553
 	.byte	0xa5
 	.byte	0x1f
-	.4byte	0xc47d
+	.4byte	0xc4ed
 	.byte	0x4
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x6d
-	.4byte	0xc48d
+	.4byte	0xc4fd
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x6
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF2540
+	.4byte	.LASF2554
 	.byte	0xa5
 	.byte	0x20
-	.4byte	0xc45c
+	.4byte	0xc4cc
 	.uleb128 0x19
-	.4byte	.LASF2541
+	.4byte	.LASF2555
 	.byte	0xa6
 	.byte	0x15
-	.4byte	0xc48d
+	.4byte	0xc4fd
 	.uleb128 0xd
-	.4byte	.LASF2542
+	.4byte	.LASF2556
 	.byte	0x8
 	.byte	0xa5
 	.byte	0x2c
-	.4byte	0xc4bc
+	.4byte	0xc52c
 	.uleb128 0x20
 	.string	"hcr"
 	.byte	0xa5
@@ -34401,130 +34460,130 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2543
+	.4byte	.LASF2557
 	.byte	0xa5
 	.byte	0x30
-	.4byte	0xc4a3
+	.4byte	0xc513
 	.uleb128 0x15
-	.4byte	.LASF2544
+	.4byte	.LASF2558
 	.byte	0xa7
 	.2byte	0x102
 	.4byte	0x162a
 	.uleb128 0x15
-	.4byte	.LASF2545
+	.4byte	.LASF2559
 	.byte	0xa7
 	.2byte	0x1ae
 	.4byte	0x2b0
-	.uleb128 0x49
+	.uleb128 0x38
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xa7
 	.2byte	0x1d0
-	.4byte	0xc52f
+	.4byte	0xc59f
 	.uleb128 0xc
-	.4byte	.LASF2546
+	.4byte	.LASF2560
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2547
+	.4byte	.LASF2561
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2548
+	.4byte	.LASF2562
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2549
+	.4byte	.LASF2563
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2550
+	.4byte	.LASF2564
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF2551
+	.4byte	.LASF2565
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF2552
+	.4byte	.LASF2566
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF2553
+	.4byte	.LASF2567
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF2554
+	.4byte	.LASF2568
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF2555
+	.4byte	.LASF2569
 	.byte	0x9
 	.uleb128 0xc
-	.4byte	.LASF2556
+	.4byte	.LASF2570
 	.byte	0xa
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x5c
-	.4byte	0xc53f
+	.4byte	0xc5af
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x9
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xc52f
+	.4byte	0xc59f
 	.uleb128 0x15
-	.4byte	.LASF2557
+	.4byte	.LASF2571
 	.byte	0xa7
 	.2byte	0x1e5
-	.4byte	0xc53f
+	.4byte	0xc5af
 	.uleb128 0x15
-	.4byte	.LASF2558
+	.4byte	.LASF2572
 	.byte	0xa7
 	.2byte	0x203
 	.4byte	0x2f05
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0xc56d
-	.uleb128 0x43
+	.4byte	0xc5dd
+	.uleb128 0x45
 	.4byte	0x4f
 	.2byte	0x1ff
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2559
+	.4byte	.LASF2573
 	.byte	0xa8
 	.byte	0x39
-	.4byte	0xc55c
+	.4byte	0xc5cc
 	.uleb128 0x5
-	.4byte	0x3413
-	.4byte	0xc589
-	.uleb128 0x43
+	.4byte	0x3483
+	.4byte	0xc5f9
+	.uleb128 0x45
 	.4byte	0x4f
 	.2byte	0x1ff
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF2560
+	.4byte	.LASF2574
 	.byte	0xa8
 	.2byte	0x2bd
-	.4byte	0xc578
+	.4byte	0xc5e8
 	.uleb128 0x5
-	.4byte	0x3413
-	.4byte	0xc5a0
+	.4byte	0x3483
+	.4byte	0xc610
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF2561
+	.4byte	.LASF2575
 	.byte	0xa8
 	.2byte	0x2be
-	.4byte	0xc595
+	.4byte	0xc605
 	.uleb128 0x15
-	.4byte	.LASF2562
+	.4byte	.LASF2576
 	.byte	0xa8
 	.2byte	0x2bf
-	.4byte	0xc578
+	.4byte	0xc5e8
 	.uleb128 0x15
-	.4byte	.LASF2563
+	.4byte	.LASF2577
 	.byte	0xa8
 	.2byte	0x2c0
-	.4byte	0xc578
+	.4byte	0xc5e8
 	.uleb128 0x19
-	.4byte	.LASF2564
+	.4byte	.LASF2578
 	.byte	0xa9
 	.byte	0x1e
 	.4byte	0x304
 	.uleb128 0x19
-	.4byte	.LASF2565
+	.4byte	.LASF2579
 	.byte	0x6d
 	.byte	0xb0
 	.4byte	0x3a7
@@ -34533,36 +34592,36 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0xaa
 	.byte	0x9d
-	.4byte	0xc605
+	.4byte	0xc675
 	.uleb128 0xc
-	.4byte	.LASF2566
+	.4byte	.LASF2580
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2567
+	.4byte	.LASF2581
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2568
+	.4byte	.LASF2582
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF2569
+	.4byte	.LASF2583
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF2570
+	.4byte	.LASF2584
 	.byte	0x10
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2571
+	.4byte	.LASF2585
 	.byte	0xab
 	.byte	0x45
 	.4byte	0x2f05
 	.uleb128 0xd
-	.4byte	.LASF2572
+	.4byte	.LASF2586
 	.byte	0x50
 	.byte	0xac
 	.byte	0x42
-	.4byte	0xc689
+	.4byte	0xc6f9
 	.uleb128 0xe
-	.4byte	.LASF2573
+	.4byte	.LASF2587
 	.byte	0xac
 	.byte	0x43
 	.4byte	0xc6
@@ -34574,13 +34633,13 @@ __exitcall_ebc_exit:
 	.4byte	0x56
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2574
+	.4byte	.LASF2588
 	.byte	0xac
 	.byte	0x45
-	.4byte	0x7dc6
+	.4byte	0x7e36
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF962
+	.4byte	.LASF976
 	.byte	0xac
 	.byte	0x46
 	.4byte	0x3a7
@@ -34589,52 +34648,52 @@ __exitcall_ebc_exit:
 	.4byte	.LASF640
 	.byte	0xac
 	.byte	0x47
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2575
+	.4byte	.LASF2589
 	.byte	0xac
 	.byte	0x48
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2229
+	.4byte	.LASF2243
 	.byte	0xac
 	.byte	0x49
-	.4byte	0xaf2b
+	.4byte	0xaf9b
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2576
+	.4byte	.LASF2590
 	.byte	0xac
 	.byte	0x4a
 	.4byte	0x56
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF904
+	.4byte	.LASF918
 	.byte	0xac
 	.byte	0x4b
 	.4byte	0x28f
 	.byte	0x48
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF2577
+	.4byte	.LASF2591
 	.byte	0xad
 	.byte	0x3c
-	.4byte	0xc694
+	.4byte	0xc704
 	.uleb128 0x10
-	.4byte	0xc69f
+	.4byte	0xc70f
 	.uleb128 0x11
-	.4byte	0xc69f
+	.4byte	0xc70f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc6a5
+	.4byte	0xc715
 	.uleb128 0xd
-	.4byte	.LASF2578
+	.4byte	.LASF2592
 	.byte	0x38
 	.byte	0xad
 	.byte	0x58
-	.4byte	0xc6fd
+	.4byte	0xc76d
 	.uleb128 0xe
 	.4byte	.LASF383
 	.byte	0xad
@@ -34642,7 +34701,7 @@ __exitcall_ebc_exit:
 	.4byte	0x558
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2579
+	.4byte	.LASF2593
 	.byte	0xad
 	.byte	0x5e
 	.4byte	0x29
@@ -34651,16 +34710,16 @@ __exitcall_ebc_exit:
 	.4byte	.LASF113
 	.byte	0xad
 	.byte	0x5f
-	.4byte	0xc6fd
+	.4byte	0xc76d
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2580
+	.4byte	.LASF2594
 	.byte	0xad
 	.byte	0x60
-	.4byte	0xc6fd
+	.4byte	0xc76d
 	.byte	0x18
-	.uleb128 0x38
-	.4byte	.LASF2581
+	.uleb128 0x3a
+	.4byte	.LASF2595
 	.byte	0xad
 	.byte	0x61
 	.4byte	0x2b0
@@ -34677,44 +34736,44 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc689
+	.4byte	0xc6f9
 	.uleb128 0xd
-	.4byte	.LASF2582
+	.4byte	.LASF2596
 	.byte	0x20
 	.byte	0xae
 	.byte	0xa
-	.4byte	0xc740
+	.4byte	0xc7b0
 	.uleb128 0xe
-	.4byte	.LASF884
+	.4byte	.LASF898
 	.byte	0xae
 	.byte	0xb
 	.4byte	0x2e3
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF987
+	.4byte	.LASF1001
 	.byte	0xae
 	.byte	0xc
 	.4byte	0x2e3
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2583
+	.4byte	.LASF2597
 	.byte	0xae
 	.byte	0xd
-	.4byte	0x9e32
+	.4byte	0x9ea2
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1743
+	.4byte	.LASF1757
 	.byte	0xae
 	.byte	0xe
 	.4byte	0x4b7
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2584
+	.4byte	.LASF2598
 	.byte	0x18
 	.byte	0xaf
 	.byte	0x18
-	.4byte	0xc771
+	.4byte	0xc7e1
 	.uleb128 0xe
 	.4byte	.LASF71
 	.byte	0xaf
@@ -34735,11 +34794,11 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2585
+	.4byte	.LASF2599
 	.byte	0x30
 	.byte	0xaf
 	.byte	0x1e
-	.4byte	0xc7ba
+	.4byte	0xc82a
 	.uleb128 0xe
 	.4byte	.LASF265
 	.byte	0xaf
@@ -34753,339 +34812,339 @@ __exitcall_ebc_exit:
 	.4byte	0xf07
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2586
+	.4byte	.LASF2600
 	.byte	0xaf
 	.byte	0x21
 	.4byte	0x4a1
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2587
+	.4byte	.LASF2601
 	.byte	0xaf
 	.byte	0x22
 	.4byte	0x4b7
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2588
+	.4byte	.LASF2602
 	.byte	0xaf
 	.byte	0x23
-	.4byte	0xc7ba
+	.4byte	0xc82a
 	.byte	0x28
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc740
+	.4byte	0xc7b0
 	.uleb128 0x8
-	.4byte	.LASF2589
+	.4byte	.LASF2603
 	.byte	0xaf
 	.byte	0x27
 	.4byte	0xcd
 	.uleb128 0x19
-	.4byte	.LASF2590
+	.4byte	.LASF2604
 	.byte	0xb0
 	.byte	0xa
-	.4byte	0xc771
+	.4byte	0xc7e1
 	.uleb128 0x19
-	.4byte	.LASF2591
+	.4byte	.LASF2605
 	.byte	0xb0
 	.byte	0xb
-	.4byte	0xc771
+	.4byte	0xc7e1
 	.uleb128 0x19
-	.4byte	.LASF2592
+	.4byte	.LASF2606
 	.byte	0xb0
 	.byte	0xc
-	.4byte	0xc771
+	.4byte	0xc7e1
 	.uleb128 0x19
-	.4byte	.LASF2593
+	.4byte	.LASF2607
 	.byte	0xb0
 	.byte	0xd
-	.4byte	0xc771
+	.4byte	0xc7e1
 	.uleb128 0x19
-	.4byte	.LASF2594
+	.4byte	.LASF2608
 	.byte	0xb0
 	.byte	0xe
-	.4byte	0xc771
+	.4byte	0xc7e1
 	.uleb128 0x19
-	.4byte	.LASF2595
+	.4byte	.LASF2609
 	.byte	0xb0
 	.byte	0xf
-	.4byte	0xc771
+	.4byte	0xc7e1
 	.uleb128 0x19
-	.4byte	.LASF2596
+	.4byte	.LASF2610
 	.byte	0xb0
 	.byte	0x10
-	.4byte	0xc771
+	.4byte	0xc7e1
 	.uleb128 0xd
-	.4byte	.LASF2597
+	.4byte	.LASF2611
 	.byte	0x28
 	.byte	0x75
 	.byte	0x14
-	.4byte	0xc861
+	.4byte	0xc8d1
 	.uleb128 0xe
-	.4byte	.LASF2598
+	.4byte	.LASF2612
 	.byte	0x75
 	.byte	0x15
 	.4byte	0x30
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2599
+	.4byte	.LASF2613
 	.byte	0x75
 	.byte	0x16
 	.4byte	0x30
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2400
+	.4byte	.LASF2414
 	.byte	0x75
 	.byte	0x17
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2600
+	.4byte	.LASF2614
 	.byte	0x75
 	.byte	0x18
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2399
+	.4byte	.LASF2413
 	.byte	0x75
 	.byte	0x19
 	.4byte	0x29
 	.byte	0x20
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF2601
+	.4byte	.LASF2615
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x75
 	.byte	0x39
-	.4byte	0xc884
+	.4byte	0xc8f4
 	.uleb128 0xc
-	.4byte	.LASF2602
+	.4byte	.LASF2616
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2603
+	.4byte	.LASF2617
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2604
+	.4byte	.LASF2618
 	.byte	0x3
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF2605
+	.4byte	.LASF2619
 	.byte	0x75
 	.byte	0x5f
-	.4byte	0xc88f
+	.4byte	0xc8ff
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc895
+	.4byte	0xc905
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xc8b8
+	.4byte	0xc928
 	.uleb128 0x11
-	.4byte	0x3cb5
+	.4byte	0x3d25
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
-	.4byte	0xc8b8
+	.4byte	0xc928
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
-	.4byte	0xc8be
+	.4byte	0xc92e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x34ac
+	.4byte	0x351c
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x33f3
+	.4byte	0x3463
 	.uleb128 0x8
-	.4byte	.LASF2606
+	.4byte	.LASF2620
 	.byte	0x75
 	.byte	0x64
-	.4byte	0xc8cf
+	.4byte	0xc93f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc8d5
+	.4byte	0xc945
 	.uleb128 0x10
-	.4byte	0xc8e5
+	.4byte	0xc955
 	.uleb128 0x11
-	.4byte	0x3469
+	.4byte	0x34d9
 	.uleb128 0x11
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc694
+	.4byte	0xc704
 	.uleb128 0x19
-	.4byte	.LASF2607
+	.4byte	.LASF2621
 	.byte	0x76
 	.byte	0x2a
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF2608
+	.4byte	.LASF2622
 	.byte	0x76
 	.byte	0x34
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF2609
+	.4byte	.LASF2623
 	.byte	0x76
 	.byte	0x35
 	.4byte	0x458
 	.uleb128 0x19
-	.4byte	.LASF2610
+	.4byte	.LASF2624
 	.byte	0x76
 	.byte	0x36
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF2611
+	.4byte	.LASF2625
 	.byte	0x76
 	.byte	0x39
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF2612
+	.4byte	.LASF2626
 	.byte	0x76
 	.byte	0x3f
 	.4byte	0xcd
 	.uleb128 0x19
-	.4byte	.LASF2613
+	.4byte	.LASF2627
 	.byte	0x76
 	.byte	0x40
 	.4byte	0xcd
 	.uleb128 0x19
-	.4byte	.LASF2614
+	.4byte	.LASF2628
 	.byte	0x76
 	.byte	0x41
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF2615
+	.4byte	.LASF2629
 	.byte	0x76
 	.byte	0x44
 	.4byte	0xcd
 	.uleb128 0x19
-	.4byte	.LASF2616
+	.4byte	.LASF2630
 	.byte	0x76
 	.byte	0x45
 	.4byte	0xcd
 	.uleb128 0x19
-	.4byte	.LASF2617
+	.4byte	.LASF2631
 	.byte	0x76
 	.byte	0x46
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF2618
+	.4byte	.LASF2632
 	.byte	0x76
 	.byte	0x8b
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF2619
+	.4byte	.LASF2633
 	.byte	0x76
 	.byte	0x8d
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF2620
+	.4byte	.LASF2634
 	.byte	0x76
 	.byte	0x8e
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF2621
+	.4byte	.LASF2635
 	.byte	0x76
 	.byte	0x90
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF2622
+	.4byte	.LASF2636
 	.byte	0x76
 	.byte	0x91
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF2623
+	.4byte	.LASF2637
 	.byte	0x76
 	.byte	0x92
 	.4byte	0x29
 	.uleb128 0x5
-	.4byte	0x3433
-	.4byte	0xc9b6
+	.4byte	0x34a3
+	.4byte	0xca26
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF2624
+	.4byte	.LASF2638
 	.byte	0x76
 	.2byte	0x142
-	.4byte	0xc9a6
+	.4byte	0xca16
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3453
+	.4byte	0x34c3
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x33d3
+	.4byte	0x3443
 	.uleb128 0x1e
-	.4byte	.LASF2625
+	.4byte	.LASF2639
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x76
 	.2byte	0x18a
-	.4byte	0xc9f2
+	.4byte	0xca62
 	.uleb128 0xc
-	.4byte	.LASF2626
+	.4byte	.LASF2640
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2627
+	.4byte	.LASF2641
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2628
+	.4byte	.LASF2642
 	.byte	0x2
 	.byte	0
 	.uleb128 0x10
-	.4byte	0xc9fd
+	.4byte	0xca6d
 	.uleb128 0x11
-	.4byte	0x3cb5
+	.4byte	0x3d25
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc9f2
+	.4byte	0xca62
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xca17
+	.4byte	0xca87
 	.uleb128 0x11
-	.4byte	0x3cb5
+	.4byte	0x3d25
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xca03
+	.4byte	0xca73
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xca2c
+	.4byte	0xca9c
 	.uleb128 0x11
-	.4byte	0x3cb5
+	.4byte	0x3d25
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xca1d
+	.4byte	0xca8d
 	.uleb128 0x14
-	.4byte	0x502d
-	.4byte	0xca41
+	.4byte	0x509d
+	.4byte	0xcab1
 	.uleb128 0x11
-	.4byte	0x5a5d
+	.4byte	0x5acd
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xca32
+	.4byte	0xcaa2
 	.uleb128 0x14
-	.4byte	0x502d
-	.4byte	0xca5b
+	.4byte	0x509d
+	.4byte	0xcacb
 	.uleb128 0x11
-	.4byte	0x5a5d
+	.4byte	0x5acd
 	.uleb128 0x11
-	.4byte	0xc9ce
+	.4byte	0xca3e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xca47
+	.4byte	0xcab7
 	.uleb128 0x10
-	.4byte	0xca76
+	.4byte	0xcae6
 	.uleb128 0x11
-	.4byte	0x5a5d
+	.4byte	0x5acd
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
@@ -35093,21 +35152,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xca61
+	.4byte	0xcad1
 	.uleb128 0x14
 	.4byte	0x29
-	.4byte	0xca8b
+	.4byte	0xcafb
 	.uleb128 0x11
-	.4byte	0x3cb5
+	.4byte	0x3d25
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xca7c
+	.4byte	0xcaec
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xcab4
+	.4byte	0xcb24
 	.uleb128 0x11
-	.4byte	0x3cb5
+	.4byte	0x3d25
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
@@ -35119,396 +35178,396 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xca91
+	.4byte	0xcb01
 	.uleb128 0x14
 	.4byte	0x56
-	.4byte	0xcac9
+	.4byte	0xcb39
 	.uleb128 0x11
-	.4byte	0x3cb5
+	.4byte	0x3d25
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xcaba
+	.4byte	0xcb2a
 	.uleb128 0x14
-	.4byte	0x3469
-	.4byte	0xcae3
+	.4byte	0x34d9
+	.4byte	0xcb53
 	.uleb128 0x11
-	.4byte	0x3cb5
+	.4byte	0x3d25
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xcacf
+	.4byte	0xcb3f
 	.uleb128 0x19
-	.4byte	.LASF2629
+	.4byte	.LASF2643
 	.byte	0xb1
 	.byte	0x4c
-	.4byte	0xa2eb
+	.4byte	0xa35b
 	.uleb128 0x13
-	.4byte	.LASF2630
+	.4byte	.LASF2644
 	.byte	0x76
 	.2byte	0x2ba
-	.4byte	0x78f8
+	.4byte	0x7968
 	.uleb128 0x5
-	.4byte	0xcb16
-	.4byte	0xcb0b
+	.4byte	0xcb86
+	.4byte	0xcb7b
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xcb00
+	.4byte	0xcb70
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xcaf4
+	.4byte	0xcb64
 	.uleb128 0x3
-	.4byte	0xcb10
+	.4byte	0xcb80
 	.uleb128 0x15
-	.4byte	.LASF2631
+	.4byte	.LASF2645
 	.byte	0x76
 	.2byte	0x2c8
-	.4byte	0xcb0b
+	.4byte	0xcb7b
 	.uleb128 0x1f
-	.4byte	.LASF2632
+	.4byte	.LASF2646
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xb2
 	.byte	0x19
-	.4byte	0xcc94
+	.4byte	0xcd04
 	.uleb128 0xc
-	.4byte	.LASF2633
+	.4byte	.LASF2647
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2634
+	.4byte	.LASF2648
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2635
+	.4byte	.LASF2649
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2636
+	.4byte	.LASF2650
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2637
+	.4byte	.LASF2651
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF2638
+	.4byte	.LASF2652
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF2639
+	.4byte	.LASF2653
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF2640
+	.4byte	.LASF2654
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF2641
+	.4byte	.LASF2655
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF2642
+	.4byte	.LASF2656
 	.byte	0x9
 	.uleb128 0xc
-	.4byte	.LASF2643
+	.4byte	.LASF2657
 	.byte	0xa
 	.uleb128 0xc
-	.4byte	.LASF2644
+	.4byte	.LASF2658
 	.byte	0xb
 	.uleb128 0xc
-	.4byte	.LASF2645
+	.4byte	.LASF2659
 	.byte	0xc
 	.uleb128 0xc
-	.4byte	.LASF2646
+	.4byte	.LASF2660
 	.byte	0xd
 	.uleb128 0xc
-	.4byte	.LASF2647
+	.4byte	.LASF2661
 	.byte	0xe
 	.uleb128 0xc
-	.4byte	.LASF2648
+	.4byte	.LASF2662
 	.byte	0xf
 	.uleb128 0xc
-	.4byte	.LASF2649
+	.4byte	.LASF2663
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF2650
+	.4byte	.LASF2664
 	.byte	0x11
 	.uleb128 0xc
-	.4byte	.LASF2651
+	.4byte	.LASF2665
 	.byte	0x12
 	.uleb128 0xc
-	.4byte	.LASF2652
+	.4byte	.LASF2666
 	.byte	0x13
 	.uleb128 0xc
-	.4byte	.LASF2653
+	.4byte	.LASF2667
 	.byte	0x14
 	.uleb128 0xc
-	.4byte	.LASF2654
+	.4byte	.LASF2668
 	.byte	0x15
 	.uleb128 0xc
-	.4byte	.LASF2655
+	.4byte	.LASF2669
 	.byte	0x16
 	.uleb128 0xc
-	.4byte	.LASF2656
+	.4byte	.LASF2670
 	.byte	0x17
 	.uleb128 0xc
-	.4byte	.LASF2657
+	.4byte	.LASF2671
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF2658
+	.4byte	.LASF2672
 	.byte	0x19
 	.uleb128 0xc
-	.4byte	.LASF2659
+	.4byte	.LASF2673
 	.byte	0x1a
 	.uleb128 0xc
-	.4byte	.LASF2660
+	.4byte	.LASF2674
 	.byte	0x1b
 	.uleb128 0xc
-	.4byte	.LASF2661
+	.4byte	.LASF2675
 	.byte	0x1c
 	.uleb128 0xc
-	.4byte	.LASF2662
+	.4byte	.LASF2676
 	.byte	0x1d
 	.uleb128 0xc
-	.4byte	.LASF2663
+	.4byte	.LASF2677
 	.byte	0x1e
 	.uleb128 0xc
-	.4byte	.LASF2664
+	.4byte	.LASF2678
 	.byte	0x1f
 	.uleb128 0xc
-	.4byte	.LASF2665
+	.4byte	.LASF2679
 	.byte	0x20
 	.uleb128 0xc
-	.4byte	.LASF2666
+	.4byte	.LASF2680
 	.byte	0x21
 	.uleb128 0xc
-	.4byte	.LASF2667
+	.4byte	.LASF2681
 	.byte	0x22
 	.uleb128 0xc
-	.4byte	.LASF2668
+	.4byte	.LASF2682
 	.byte	0x23
 	.uleb128 0xc
-	.4byte	.LASF2669
+	.4byte	.LASF2683
 	.byte	0x24
 	.uleb128 0xc
-	.4byte	.LASF2670
+	.4byte	.LASF2684
 	.byte	0x25
 	.uleb128 0xc
-	.4byte	.LASF2671
+	.4byte	.LASF2685
 	.byte	0x26
 	.uleb128 0xc
-	.4byte	.LASF2672
+	.4byte	.LASF2686
 	.byte	0x27
 	.uleb128 0xc
-	.4byte	.LASF2673
+	.4byte	.LASF2687
 	.byte	0x28
 	.uleb128 0xc
-	.4byte	.LASF2674
+	.4byte	.LASF2688
 	.byte	0x29
 	.uleb128 0xc
-	.4byte	.LASF2675
+	.4byte	.LASF2689
 	.byte	0x2a
 	.uleb128 0xc
-	.4byte	.LASF2676
+	.4byte	.LASF2690
 	.byte	0x2b
 	.uleb128 0xc
-	.4byte	.LASF2677
+	.4byte	.LASF2691
 	.byte	0x2c
 	.uleb128 0xc
-	.4byte	.LASF2678
+	.4byte	.LASF2692
 	.byte	0x2d
 	.uleb128 0xc
-	.4byte	.LASF2679
+	.4byte	.LASF2693
 	.byte	0x2e
 	.uleb128 0xc
-	.4byte	.LASF2680
+	.4byte	.LASF2694
 	.byte	0x2f
 	.uleb128 0xc
-	.4byte	.LASF2681
+	.4byte	.LASF2695
 	.byte	0x30
 	.uleb128 0xc
-	.4byte	.LASF2682
+	.4byte	.LASF2696
 	.byte	0x31
 	.uleb128 0xc
-	.4byte	.LASF2683
+	.4byte	.LASF2697
 	.byte	0x32
 	.uleb128 0xc
-	.4byte	.LASF2684
+	.4byte	.LASF2698
 	.byte	0x33
 	.uleb128 0xc
-	.4byte	.LASF2685
+	.4byte	.LASF2699
 	.byte	0x34
 	.uleb128 0xc
-	.4byte	.LASF2686
+	.4byte	.LASF2700
 	.byte	0x35
 	.uleb128 0xc
-	.4byte	.LASF2687
+	.4byte	.LASF2701
 	.byte	0x36
 	.uleb128 0xc
-	.4byte	.LASF2688
+	.4byte	.LASF2702
 	.byte	0x37
 	.uleb128 0xc
-	.4byte	.LASF2689
+	.4byte	.LASF2703
 	.byte	0x38
 	.uleb128 0xc
-	.4byte	.LASF2690
+	.4byte	.LASF2704
 	.byte	0x39
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2691
+	.4byte	.LASF2705
 	.byte	0xb3
 	.byte	0xc
 	.4byte	0xc6
 	.uleb128 0x26
-	.4byte	.LASF2692
+	.4byte	.LASF2706
 	.2byte	0x1c8
 	.byte	0xb3
 	.byte	0x2d
-	.4byte	0xccb9
+	.4byte	0xcd29
 	.uleb128 0xe
-	.4byte	.LASF2038
+	.4byte	.LASF2052
 	.byte	0xb3
 	.byte	0x2e
-	.4byte	0xccb9
+	.4byte	0xcd29
 	.byte	0
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0xccc9
+	.4byte	0xcd39
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x38
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2693
+	.4byte	.LASF2707
 	.byte	0xb3
 	.byte	0x31
-	.4byte	0xcc9f
+	.4byte	0xcd0f
 	.uleb128 0x19
-	.4byte	.LASF2694
+	.4byte	.LASF2708
 	.byte	0xb3
 	.byte	0x83
-	.4byte	0x66e4
+	.4byte	0x6754
 	.uleb128 0x5
 	.4byte	0x558
-	.4byte	0xccee
-	.uleb128 0x44
+	.4byte	0xcd5e
+	.uleb128 0x46
 	.4byte	0x4f
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1570
+	.4byte	.LASF1584
 	.byte	0xb3
 	.byte	0x84
-	.4byte	0xccdf
+	.4byte	0xcd4f
 	.uleb128 0x19
-	.4byte	.LASF2695
+	.4byte	.LASF2709
 	.byte	0xb3
 	.byte	0x85
-	.4byte	0x678e
+	.4byte	0x67fe
 	.uleb128 0x5
 	.4byte	0x5c
-	.4byte	0xcd0f
+	.4byte	0xcd7f
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xcd04
+	.4byte	0xcd74
 	.uleb128 0x15
-	.4byte	.LASF2696
+	.4byte	.LASF2710
 	.byte	0xb3
 	.2byte	0x183
-	.4byte	0xcd0f
+	.4byte	0xcd7f
 	.uleb128 0x15
-	.4byte	.LASF2697
+	.4byte	.LASF2711
 	.byte	0x76
-	.2byte	0x8d3
+	.2byte	0x8d6
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF2698
+	.4byte	.LASF2712
 	.byte	0x76
-	.2byte	0x8d4
+	.2byte	0x8d7
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF2699
+	.4byte	.LASF2713
 	.byte	0x76
-	.2byte	0x8d7
+	.2byte	0x8da
 	.4byte	0x558
 	.uleb128 0x15
-	.4byte	.LASF2700
+	.4byte	.LASF2714
 	.byte	0x76
-	.2byte	0x9a7
+	.2byte	0x9aa
 	.4byte	0x29
 	.uleb128 0x15
-	.4byte	.LASF2701
+	.4byte	.LASF2715
 	.byte	0x76
-	.2byte	0xa85
+	.2byte	0xa88
 	.4byte	0xf52
 	.uleb128 0x15
-	.4byte	.LASF2702
+	.4byte	.LASF2716
 	.byte	0x76
-	.2byte	0xa92
+	.2byte	0xa95
 	.4byte	0xf52
 	.uleb128 0x15
-	.4byte	.LASF2703
+	.4byte	.LASF2717
 	.byte	0x76
-	.2byte	0xacd
+	.2byte	0xad0
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF2704
+	.4byte	.LASF2718
 	.byte	0x76
-	.2byte	0xad8
+	.2byte	0xadb
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF2705
+	.4byte	.LASF2719
 	.byte	0x76
-	.2byte	0xb02
+	.2byte	0xb05
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF2706
+	.4byte	.LASF2720
 	.byte	0x76
-	.2byte	0xb03
+	.2byte	0xb06
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF2707
+	.4byte	.LASF2721
 	.byte	0x76
-	.2byte	0xb05
+	.2byte	0xb08
 	.4byte	0x558
 	.uleb128 0x15
-	.4byte	.LASF2708
+	.4byte	.LASF2722
 	.byte	0x76
-	.2byte	0xb3a
-	.4byte	0xc703
+	.2byte	0xb3d
+	.4byte	0xc773
 	.uleb128 0x19
-	.4byte	.LASF2709
+	.4byte	.LASF2723
 	.byte	0xb4
 	.byte	0x38
-	.4byte	0x937d
+	.4byte	0x93ed
 	.uleb128 0x19
-	.4byte	.LASF2710
+	.4byte	.LASF2724
 	.byte	0xb5
 	.byte	0x21
 	.4byte	0x500
 	.uleb128 0x8
-	.4byte	.LASF2711
+	.4byte	.LASF2725
 	.byte	0xb6
 	.byte	0x10
 	.4byte	0xf4
 	.uleb128 0x8
-	.4byte	.LASF2712
+	.4byte	.LASF2726
 	.byte	0xb6
 	.byte	0x11
 	.4byte	0xa9
 	.uleb128 0x8
-	.4byte	.LASF2713
+	.4byte	.LASF2727
 	.byte	0xb6
 	.byte	0x13
 	.4byte	0xf4
 	.uleb128 0x8
-	.4byte	.LASF2714
+	.4byte	.LASF2728
 	.byte	0xb6
 	.byte	0x15
 	.4byte	0xd2
 	.uleb128 0x8
-	.4byte	.LASF2715
+	.4byte	.LASF2729
 	.byte	0xb6
 	.byte	0x16
 	.4byte	0xf4
 	.uleb128 0x8
-	.4byte	.LASF2716
+	.4byte	.LASF2730
 	.byte	0xb6
 	.byte	0x17
 	.4byte	0xe2
@@ -35516,172 +35575,172 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0xb6
 	.byte	0x94
-	.4byte	0xce27
+	.4byte	0xce97
 	.uleb128 0x22
-	.4byte	.LASF2717
+	.4byte	.LASF2731
 	.byte	0xb6
 	.byte	0x95
-	.4byte	0xcdf2
+	.4byte	0xce62
 	.uleb128 0x22
-	.4byte	.LASF2718
+	.4byte	.LASF2732
 	.byte	0xb6
 	.byte	0x96
-	.4byte	0xcdc6
+	.4byte	0xce36
 	.byte	0
 	.uleb128 0xf
 	.byte	0x10
 	.byte	0xb6
 	.byte	0x92
-	.4byte	0xce48
+	.4byte	0xceb8
 	.uleb128 0xe
-	.4byte	.LASF2719
+	.4byte	.LASF2733
 	.byte	0xb6
 	.byte	0x93
-	.4byte	0xcdfd
+	.4byte	0xce6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2720
+	.4byte	.LASF2734
 	.byte	0xb6
 	.byte	0x97
-	.4byte	0xce08
+	.4byte	0xce78
 	.byte	0x8
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF2721
+	.4byte	.LASF2735
 	.byte	0xb6
 	.byte	0x98
-	.4byte	0xce27
+	.4byte	0xce97
 	.uleb128 0xd
-	.4byte	.LASF2722
+	.4byte	.LASF2736
 	.byte	0x18
 	.byte	0xb6
 	.byte	0xc0
-	.4byte	0xcea8
+	.4byte	0xcf18
 	.uleb128 0xe
-	.4byte	.LASF2723
+	.4byte	.LASF2737
 	.byte	0xb6
 	.byte	0xc1
-	.4byte	0xcde7
+	.4byte	0xce57
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2724
+	.4byte	.LASF2738
 	.byte	0xb6
 	.byte	0xc2
 	.4byte	0x96
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF2725
+	.4byte	.LASF2739
 	.byte	0xb6
 	.byte	0xc3
 	.4byte	0x96
 	.byte	0x5
 	.uleb128 0xe
-	.4byte	.LASF2726
+	.4byte	.LASF2740
 	.byte	0xb6
 	.byte	0xc4
-	.4byte	0xcdd1
+	.4byte	0xce41
 	.byte	0x6
 	.uleb128 0xe
-	.4byte	.LASF2727
+	.4byte	.LASF2741
 	.byte	0xb6
 	.byte	0xc5
-	.4byte	0xcdc6
+	.4byte	0xce36
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2728
+	.4byte	.LASF2742
 	.byte	0xb6
 	.byte	0xc6
-	.4byte	0xcdf2
+	.4byte	0xce62
 	.byte	0x10
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF2729
+	.4byte	.LASF2743
 	.byte	0xb6
 	.byte	0xc7
-	.4byte	0xce53
+	.4byte	0xcec3
 	.uleb128 0x1d
-	.4byte	.LASF2730
+	.4byte	.LASF2744
 	.byte	0x40
 	.byte	0xb6
 	.2byte	0x13c
-	.4byte	0xcf43
+	.4byte	0xcfb3
 	.uleb128 0x1b
-	.4byte	.LASF2731
+	.4byte	.LASF2745
 	.byte	0xb6
 	.2byte	0x13d
-	.4byte	0xcde7
+	.4byte	0xce57
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2732
+	.4byte	.LASF2746
 	.byte	0xb6
 	.2byte	0x13e
-	.4byte	0xcde7
+	.4byte	0xce57
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF2733
+	.4byte	.LASF2747
 	.byte	0xb6
 	.2byte	0x13f
-	.4byte	0xcdf2
+	.4byte	0xce62
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2734
+	.4byte	.LASF2748
 	.byte	0xb6
 	.2byte	0x140
-	.4byte	0xcdc6
+	.4byte	0xce36
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2735
+	.4byte	.LASF2749
 	.byte	0xb6
 	.2byte	0x141
-	.4byte	0xcddc
+	.4byte	0xce4c
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF2736
+	.4byte	.LASF2750
 	.byte	0xb6
 	.2byte	0x142
-	.4byte	0xcdf2
+	.4byte	0xce62
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2737
+	.4byte	.LASF2751
 	.byte	0xb6
 	.2byte	0x143
-	.4byte	0xcde7
+	.4byte	0xce57
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF2738
+	.4byte	.LASF2752
 	.byte	0xb6
 	.2byte	0x144
-	.4byte	0xcde7
+	.4byte	0xce57
 	.byte	0x2c
 	.uleb128 0x1b
-	.4byte	.LASF2739
+	.4byte	.LASF2753
 	.byte	0xb6
 	.2byte	0x145
-	.4byte	0xcdf2
+	.4byte	0xce62
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF2740
+	.4byte	.LASF2754
 	.byte	0xb6
 	.2byte	0x146
-	.4byte	0xcdf2
+	.4byte	0xce62
 	.byte	0x38
 	.byte	0
 	.uleb128 0x5
-	.4byte	0xce48
-	.4byte	0xcf4e
+	.4byte	0xceb8
+	.4byte	0xcfbe
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2741
+	.4byte	.LASF2755
 	.byte	0xb7
 	.byte	0x25
-	.4byte	0xcf43
+	.4byte	0xcfb3
 	.uleb128 0xd
-	.4byte	.LASF2742
+	.4byte	.LASF2756
 	.byte	0x20
 	.byte	0xb8
 	.byte	0x31
-	.4byte	0xcf96
+	.4byte	0xd006
 	.uleb128 0xe
 	.4byte	.LASF171
 	.byte	0xb8
@@ -35692,40 +35751,40 @@ __exitcall_ebc_exit:
 	.string	"set"
 	.byte	0xb8
 	.byte	0x35
-	.4byte	0xd015
+	.4byte	0xd085
 	.byte	0x8
 	.uleb128 0x20
 	.string	"get"
 	.byte	0xb8
 	.byte	0x37
-	.4byte	0xd02f
+	.4byte	0xd09f
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2400
+	.4byte	.LASF2414
 	.byte	0xb8
 	.byte	0x39
 	.4byte	0x2f35
 	.byte	0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xcf59
+	.4byte	0xcfc9
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xcfaf
+	.4byte	0xd01f
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
-	.4byte	0xcfaf
+	.4byte	0xd01f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd010
+	.4byte	0xd080
 	.uleb128 0xd
-	.4byte	.LASF2743
+	.4byte	.LASF2757
 	.byte	0x28
 	.byte	0xb8
 	.byte	0x47
-	.4byte	0xd010
+	.4byte	0xd080
 	.uleb128 0xe
 	.4byte	.LASF265
 	.byte	0xb8
@@ -35736,16 +35795,16 @@ __exitcall_ebc_exit:
 	.string	"mod"
 	.byte	0xb8
 	.byte	0x49
-	.4byte	0x757b
+	.4byte	0x75eb
 	.byte	0x8
 	.uleb128 0x20
 	.string	"ops"
 	.byte	0xb8
 	.byte	0x4a
-	.4byte	0xd0e3
+	.4byte	0xd153
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1988
+	.4byte	.LASF2002
 	.byte	0xb8
 	.byte	0x4b
 	.4byte	0x12a
@@ -35763,30 +35822,30 @@ __exitcall_ebc_exit:
 	.4byte	0x110
 	.byte	0x1b
 	.uleb128 0x23
-	.4byte	0xd035
+	.4byte	0xd0a5
 	.byte	0x20
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xcfb5
+	.4byte	0xd025
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xcf9b
+	.4byte	0xd00b
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xd02f
+	.4byte	0xd09f
 	.uleb128 0x11
 	.4byte	0x21e
 	.uleb128 0x11
-	.4byte	0xcfaf
+	.4byte	0xd01f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd01b
+	.4byte	0xd08b
 	.uleb128 0x21
 	.byte	0x8
 	.byte	0xb8
 	.byte	0x4e
-	.4byte	0xd05f
+	.4byte	0xd0cf
 	.uleb128 0x28
 	.string	"arg"
 	.byte	0xb8
@@ -35796,43 +35855,43 @@ __exitcall_ebc_exit:
 	.string	"str"
 	.byte	0xb8
 	.byte	0x50
-	.4byte	0xd089
+	.4byte	0xd0f9
 	.uleb128 0x28
 	.string	"arr"
 	.byte	0xb8
 	.byte	0x51
-	.4byte	0xd0dd
+	.4byte	0xd14d
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2744
+	.4byte	.LASF2758
 	.byte	0x10
 	.byte	0xb8
 	.byte	0x58
-	.4byte	0xd084
+	.4byte	0xd0f4
 	.uleb128 0xe
-	.4byte	.LASF2033
+	.4byte	.LASF2047
 	.byte	0xb8
 	.byte	0x59
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2745
+	.4byte	.LASF2759
 	.byte	0xb8
 	.byte	0x5a
 	.4byte	0x21e
 	.byte	0x8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xd05f
+	.4byte	0xd0cf
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd084
+	.4byte	0xd0f4
 	.uleb128 0xd
-	.4byte	.LASF2746
+	.4byte	.LASF2760
 	.byte	0x20
 	.byte	0xb8
 	.byte	0x5e
-	.4byte	0xd0d8
+	.4byte	0xd148
 	.uleb128 0x20
 	.string	"max"
 	.byte	0xb8
@@ -35840,7 +35899,7 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2747
+	.4byte	.LASF2761
 	.byte	0xb8
 	.byte	0x61
 	.4byte	0x6d
@@ -35849,161 +35908,161 @@ __exitcall_ebc_exit:
 	.string	"num"
 	.byte	0xb8
 	.byte	0x62
-	.4byte	0x3573
+	.4byte	0x35e3
 	.byte	0x8
 	.uleb128 0x20
 	.string	"ops"
 	.byte	0xb8
 	.byte	0x63
-	.4byte	0xd0e3
+	.4byte	0xd153
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2748
+	.4byte	.LASF2762
 	.byte	0xb8
 	.byte	0x64
 	.4byte	0x458
 	.byte	0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xd08f
+	.4byte	0xd0ff
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd0d8
+	.4byte	0xd148
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xcf96
+	.4byte	0xd006
 	.uleb128 0x5
-	.4byte	0xd010
-	.4byte	0xd0f4
+	.4byte	0xd080
+	.4byte	0xd164
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xd0e9
+	.4byte	0xd159
 	.uleb128 0x19
-	.4byte	.LASF2749
+	.4byte	.LASF2763
 	.byte	0xb8
 	.byte	0x55
-	.4byte	0xd0f4
+	.4byte	0xd164
 	.uleb128 0x19
-	.4byte	.LASF2750
+	.4byte	.LASF2764
 	.byte	0xb8
 	.byte	0x55
-	.4byte	0xd0f4
+	.4byte	0xd164
 	.uleb128 0x15
-	.4byte	.LASF2751
+	.4byte	.LASF2765
 	.byte	0xb8
 	.2byte	0x155
-	.4byte	0xcf96
+	.4byte	0xd006
 	.uleb128 0x15
-	.4byte	.LASF2752
+	.4byte	.LASF2766
 	.byte	0xb8
 	.2byte	0x15a
-	.4byte	0xcf96
+	.4byte	0xd006
 	.uleb128 0x15
-	.4byte	.LASF2753
+	.4byte	.LASF2767
 	.byte	0xb8
 	.2byte	0x15f
-	.4byte	0xcf96
+	.4byte	0xd006
 	.uleb128 0x15
-	.4byte	.LASF2754
+	.4byte	.LASF2768
 	.byte	0xb8
 	.2byte	0x164
-	.4byte	0xcf96
+	.4byte	0xd006
 	.uleb128 0x15
-	.4byte	.LASF2755
+	.4byte	.LASF2769
 	.byte	0xb8
 	.2byte	0x169
-	.4byte	0xcf96
+	.4byte	0xd006
 	.uleb128 0x15
-	.4byte	.LASF2756
+	.4byte	.LASF2770
 	.byte	0xb8
 	.2byte	0x16e
-	.4byte	0xcf96
+	.4byte	0xd006
 	.uleb128 0x15
-	.4byte	.LASF2757
+	.4byte	.LASF2771
 	.byte	0xb8
 	.2byte	0x173
-	.4byte	0xcf96
+	.4byte	0xd006
 	.uleb128 0x15
-	.4byte	.LASF2758
+	.4byte	.LASF2772
 	.byte	0xb8
 	.2byte	0x178
-	.4byte	0xcf96
+	.4byte	0xd006
 	.uleb128 0x15
-	.4byte	.LASF2759
+	.4byte	.LASF2773
 	.byte	0xb8
 	.2byte	0x17d
-	.4byte	0xcf96
+	.4byte	0xd006
 	.uleb128 0x15
-	.4byte	.LASF2760
+	.4byte	.LASF2774
 	.byte	0xb8
 	.2byte	0x184
-	.4byte	0xcf96
+	.4byte	0xd006
 	.uleb128 0x15
-	.4byte	.LASF2761
+	.4byte	.LASF2775
 	.byte	0xb8
 	.2byte	0x189
-	.4byte	0xcf96
+	.4byte	0xd006
 	.uleb128 0x15
-	.4byte	.LASF2762
+	.4byte	.LASF2776
 	.byte	0xb8
 	.2byte	0x18f
-	.4byte	0xcf96
+	.4byte	0xd006
 	.uleb128 0x15
-	.4byte	.LASF2763
+	.4byte	.LASF2777
 	.byte	0xb8
 	.2byte	0x195
-	.4byte	0xcf96
+	.4byte	0xd006
 	.uleb128 0x15
-	.4byte	.LASF2764
+	.4byte	.LASF2778
 	.byte	0xb8
 	.2byte	0x1fe
-	.4byte	0xcf96
+	.4byte	0xd006
 	.uleb128 0x15
-	.4byte	.LASF2765
+	.4byte	.LASF2779
 	.byte	0xb8
 	.2byte	0x200
-	.4byte	0xcf96
+	.4byte	0xd006
 	.uleb128 0xd
-	.4byte	.LASF2766
+	.4byte	.LASF2780
 	.byte	0x30
 	.byte	0xb9
 	.byte	0x28
-	.4byte	0xd1dc
+	.4byte	0xd24c
 	.uleb128 0xe
-	.4byte	.LASF868
+	.4byte	.LASF882
 	.byte	0xb9
 	.byte	0x29
-	.4byte	0xd1dc
+	.4byte	0xd24c
 	.byte	0
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x34e2
-	.4byte	0xd1ec
+	.4byte	0x3552
+	.4byte	0xd25c
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2767
+	.4byte	.LASF2781
 	.byte	0x10
 	.byte	0xba
 	.byte	0x18
-	.4byte	0xd21d
+	.4byte	0xd28d
 	.uleb128 0x20
 	.string	"plt"
 	.byte	0xba
 	.byte	0x19
-	.4byte	0xd21d
+	.4byte	0xd28d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2768
+	.4byte	.LASF2782
 	.byte	0xba
 	.byte	0x1a
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2769
+	.4byte	.LASF2783
 	.byte	0xba
 	.byte	0x1b
 	.4byte	0xc6
@@ -36011,52 +36070,52 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xceb3
+	.4byte	0xcf23
 	.uleb128 0xd
-	.4byte	.LASF2770
+	.4byte	.LASF2784
 	.byte	0x28
 	.byte	0xba
 	.byte	0x1e
-	.4byte	0xd254
+	.4byte	0xd2c4
 	.uleb128 0xe
-	.4byte	.LASF2771
+	.4byte	.LASF2785
 	.byte	0xba
 	.byte	0x1f
-	.4byte	0xd1ec
+	.4byte	0xd25c
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1743
+	.4byte	.LASF1757
 	.byte	0xba
 	.byte	0x20
-	.4byte	0xd1ec
+	.4byte	0xd25c
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2772
+	.4byte	.LASF2786
 	.byte	0xba
 	.byte	0x23
-	.4byte	0xd290
+	.4byte	0xd300
 	.byte	0x20
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2773
+	.4byte	.LASF2787
 	.byte	0x10
 	.byte	0xba
 	.byte	0x32
-	.4byte	0xd290
+	.4byte	0xd300
 	.uleb128 0xe
-	.4byte	.LASF2774
+	.4byte	.LASF2788
 	.byte	0xba
 	.byte	0x3b
 	.4byte	0x229
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2775
+	.4byte	.LASF2789
 	.byte	0xba
 	.byte	0x3c
 	.4byte	0x229
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF2776
+	.4byte	.LASF2790
 	.byte	0xba
 	.byte	0x3d
 	.4byte	0x229
@@ -36070,130 +36129,130 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd254
+	.4byte	0xd2c4
 	.uleb128 0x19
-	.4byte	.LASF2777
+	.4byte	.LASF2791
 	.byte	0xba
 	.byte	0x2d
 	.4byte	0x15a
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0xd2b1
+	.4byte	0xd321
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x37
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2778
+	.4byte	.LASF2792
 	.byte	0x80
 	.byte	0x8b
 	.byte	0x2e
-	.4byte	0xd2f9
+	.4byte	0xd369
 	.uleb128 0xe
-	.4byte	.LASF2146
+	.4byte	.LASF2160
 	.byte	0x8b
 	.byte	0x2f
-	.4byte	0x9107
+	.4byte	0x9177
 	.byte	0
 	.uleb128 0x20
 	.string	"mod"
 	.byte	0x8b
 	.byte	0x30
-	.4byte	0x757b
+	.4byte	0x75eb
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2779
+	.4byte	.LASF2793
 	.byte	0x8b
 	.byte	0x31
-	.4byte	0x91ee
+	.4byte	0x925e
 	.byte	0x68
 	.uleb128 0x20
 	.string	"mp"
 	.byte	0x8b
 	.byte	0x32
-	.4byte	0xd2fe
+	.4byte	0xd36e
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF2780
+	.4byte	.LASF2794
 	.byte	0x8b
 	.byte	0x33
-	.4byte	0x4678
+	.4byte	0x46e8
 	.byte	0x78
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF2781
+	.4byte	.LASF2795
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd2f9
+	.4byte	0xd369
 	.uleb128 0xd
-	.4byte	.LASF2782
+	.4byte	.LASF2796
 	.byte	0x38
 	.byte	0x8b
 	.byte	0x36
-	.4byte	0xd359
+	.4byte	0xd3c9
 	.uleb128 0xe
-	.4byte	.LASF2115
+	.4byte	.LASF2129
 	.byte	0x8b
 	.byte	0x37
-	.4byte	0x9e63
+	.4byte	0x9ed3
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2078
+	.4byte	.LASF2092
 	.byte	0x8b
 	.byte	0x38
-	.4byte	0xd37e
+	.4byte	0xd3ee
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2142
+	.4byte	.LASF2156
 	.byte	0x8b
 	.byte	0x3a
-	.4byte	0xd3a2
+	.4byte	0xd412
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2783
+	.4byte	.LASF2797
 	.byte	0x8b
 	.byte	0x3c
-	.4byte	0xd3b8
+	.4byte	0xd428
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2784
+	.4byte	.LASF2798
 	.byte	0x8b
 	.byte	0x3d
-	.4byte	0xd3cd
+	.4byte	0xd43d
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2400
+	.4byte	.LASF2414
 	.byte	0x8b
 	.byte	0x3e
-	.4byte	0xd3de
+	.4byte	0xd44e
 	.byte	0x30
 	.byte	0
 	.uleb128 0x14
 	.4byte	0x2ee
-	.4byte	0xd372
+	.4byte	0xd3e2
 	.uleb128 0x11
-	.4byte	0xd372
+	.4byte	0xd3e2
 	.uleb128 0x11
-	.4byte	0xd378
+	.4byte	0xd3e8
 	.uleb128 0x11
 	.4byte	0x21e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd304
+	.4byte	0xd374
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd2b1
+	.4byte	0xd321
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd359
+	.4byte	0xd3c9
 	.uleb128 0x14
 	.4byte	0x2ee
-	.4byte	0xd3a2
+	.4byte	0xd412
 	.uleb128 0x11
-	.4byte	0xd372
+	.4byte	0xd3e2
 	.uleb128 0x11
-	.4byte	0xd378
+	.4byte	0xd3e8
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
@@ -36201,115 +36260,115 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd384
+	.4byte	0xd3f4
 	.uleb128 0x10
-	.4byte	0xd3b8
+	.4byte	0xd428
 	.uleb128 0x11
-	.4byte	0x757b
+	.4byte	0x75eb
 	.uleb128 0x11
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd3a8
+	.4byte	0xd418
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xd3cd
+	.4byte	0xd43d
 	.uleb128 0x11
-	.4byte	0x757b
+	.4byte	0x75eb
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd3be
+	.4byte	0xd42e
 	.uleb128 0x10
-	.4byte	0xd3de
+	.4byte	0xd44e
 	.uleb128 0x11
-	.4byte	0x757b
+	.4byte	0x75eb
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd3d3
+	.4byte	0xd443
 	.uleb128 0x19
-	.4byte	.LASF2785
+	.4byte	.LASF2799
 	.byte	0x8b
 	.byte	0x4a
-	.4byte	0xd304
+	.4byte	0xd374
 	.uleb128 0x15
-	.4byte	.LASF2786
+	.4byte	.LASF2800
 	.byte	0x8b
 	.2byte	0x10c
 	.4byte	0xc6
 	.uleb128 0x1e
-	.4byte	.LASF2787
+	.4byte	.LASF2801
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x8b
 	.2byte	0x119
-	.4byte	0xd425
+	.4byte	0xd495
 	.uleb128 0xc
-	.4byte	.LASF2788
+	.4byte	.LASF2802
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2789
+	.4byte	.LASF2803
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2790
+	.4byte	.LASF2804
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2791
+	.4byte	.LASF2805
 	.byte	0x3
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF2792
+	.4byte	.LASF2806
 	.byte	0x38
 	.byte	0x8b
 	.2byte	0x120
-	.4byte	0xd44d
+	.4byte	0xd4bd
 	.uleb128 0x2b
 	.string	"mod"
 	.byte	0x8b
 	.2byte	0x121
-	.4byte	0x757b
+	.4byte	0x75eb
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF868
+	.4byte	.LASF882
 	.byte	0x8b
 	.2byte	0x122
-	.4byte	0xd1c3
+	.4byte	0xd233
 	.byte	0x8
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF2793
+	.4byte	.LASF2807
 	.byte	0x50
 	.byte	0x8b
 	.2byte	0x125
-	.4byte	0xd4a9
+	.4byte	0xd519
 	.uleb128 0x1b
-	.4byte	.LASF875
+	.4byte	.LASF889
 	.byte	0x8b
 	.2byte	0x127
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF987
+	.4byte	.LASF1001
 	.byte	0x8b
 	.2byte	0x129
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2794
+	.4byte	.LASF2808
 	.byte	0x8b
 	.2byte	0x12b
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF2795
+	.4byte	.LASF2809
 	.byte	0x8b
 	.2byte	0x12d
 	.4byte	0x6d
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2796
+	.4byte	.LASF2810
 	.byte	0x8b
 	.2byte	0x12f
 	.4byte	0x6d
@@ -36318,29 +36377,29 @@ __exitcall_ebc_exit:
 	.string	"mtn"
 	.byte	0x8b
 	.2byte	0x132
-	.4byte	0xd425
+	.4byte	0xd495
 	.byte	0x18
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF2797
+	.4byte	.LASF2811
 	.byte	0x18
 	.byte	0x8b
 	.2byte	0x13d
-	.4byte	0xd4de
+	.4byte	0xd54e
 	.uleb128 0x1b
-	.4byte	.LASF2798
+	.4byte	.LASF2812
 	.byte	0x8b
 	.2byte	0x13e
-	.4byte	0xd4de
+	.4byte	0xd54e
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2799
+	.4byte	.LASF2813
 	.byte	0x8b
 	.2byte	0x13f
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2800
+	.4byte	.LASF2814
 	.byte	0x8b
 	.2byte	0x140
 	.4byte	0x21e
@@ -36348,7 +36407,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xcea8
+	.4byte	0xcf18
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x274
@@ -36357,21 +36416,21 @@ __exitcall_ebc_exit:
 	.4byte	0x13a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xcfb5
+	.4byte	0xd025
 	.uleb128 0xd
-	.4byte	.LASF2801
+	.4byte	.LASF2815
 	.byte	0x8
 	.byte	0xbb
 	.byte	0x12
-	.4byte	0xd51b
+	.4byte	0xd58b
 	.uleb128 0xe
-	.4byte	.LASF2802
+	.4byte	.LASF2816
 	.byte	0xbb
 	.byte	0x14
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2803
+	.4byte	.LASF2817
 	.byte	0xbb
 	.byte	0x14
 	.4byte	0xc6
@@ -36379,104 +36438,104 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd4f6
+	.4byte	0xd566
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x995
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd4a9
+	.4byte	0xd519
 	.uleb128 0x24
-	.4byte	.LASF2804
+	.4byte	.LASF2818
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd52d
+	.4byte	0xd59d
 	.uleb128 0x24
-	.4byte	.LASF2805
+	.4byte	.LASF2819
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd538
+	.4byte	0xd5a8
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc7c0
+	.4byte	0xc830
 	.uleb128 0x24
-	.4byte	.LASF2806
+	.4byte	.LASF2820
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd554
+	.4byte	0xd5c4
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd549
+	.4byte	0xd5b9
 	.uleb128 0x24
-	.4byte	.LASF2807
+	.4byte	.LASF2821
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd565
+	.4byte	0xd5d5
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd55a
+	.4byte	0xd5ca
 	.uleb128 0x15
-	.4byte	.LASF2808
+	.4byte	.LASF2822
 	.byte	0x8b
 	.2byte	0x1f6
 	.4byte	0x246a
 	.uleb128 0x15
-	.4byte	.LASF2809
+	.4byte	.LASF2823
 	.byte	0x8b
 	.2byte	0x317
-	.4byte	0xa0dc
+	.4byte	0xa14c
 	.uleb128 0x15
-	.4byte	.LASF2810
+	.4byte	.LASF2824
 	.byte	0x8b
 	.2byte	0x318
-	.4byte	0xa0e2
+	.4byte	0xa152
 	.uleb128 0x15
-	.4byte	.LASF2811
+	.4byte	.LASF2825
 	.byte	0x8b
 	.2byte	0x319
 	.4byte	0xc6
 	.uleb128 0x26
-	.4byte	.LASF868
+	.4byte	.LASF882
 	.2byte	0x3b0
 	.byte	0xbc
 	.byte	0x16
-	.4byte	0xd5b5
+	.4byte	0xd625
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xbc
 	.byte	0x17
-	.4byte	0xa576
+	.4byte	0xa5e6
 	.byte	0
 	.byte	0
 	.uleb128 0x5
-	.4byte	0xd5c0
-	.4byte	0xd5c0
+	.4byte	0xd630
+	.4byte	0xd630
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd59b
+	.4byte	0xd60b
 	.uleb128 0x19
-	.4byte	.LASF2812
+	.4byte	.LASF2826
 	.byte	0xbc
 	.byte	0x1f
-	.4byte	0xd5b5
+	.4byte	0xd625
 	.uleb128 0x19
-	.4byte	.LASF2813
+	.4byte	.LASF2827
 	.byte	0xbd
 	.byte	0x5a
 	.4byte	0x2b0
 	.uleb128 0x19
-	.4byte	.LASF2814
+	.4byte	.LASF2828
 	.byte	0xbd
 	.byte	0x6c
-	.4byte	0xaddd
+	.4byte	0xae4d
 	.uleb128 0x26
-	.4byte	.LASF2815
+	.4byte	.LASF2829
 	.2byte	0x3e8
 	.byte	0xbe
 	.byte	0x17
-	.4byte	0xd672
+	.4byte	0xd6e2
 	.uleb128 0xe
 	.4byte	.LASF265
 	.byte	0xbe
@@ -36490,7 +36549,7 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2816
+	.4byte	.LASF2830
 	.byte	0xbe
 	.byte	0x1a
 	.4byte	0x2b0
@@ -36499,115 +36558,115 @@ __exitcall_ebc_exit:
 	.string	"dev"
 	.byte	0xbe
 	.byte	0x1b
-	.4byte	0xa576
+	.4byte	0xa5e6
 	.byte	0x10
 	.uleb128 0x27
-	.4byte	.LASF2817
+	.4byte	.LASF2831
 	.byte	0xbe
 	.byte	0x1c
 	.4byte	0x13f
 	.2byte	0x3c0
 	.uleb128 0x27
-	.4byte	.LASF2082
+	.4byte	.LASF2096
 	.byte	0xbe
 	.byte	0x1d
-	.4byte	0x97ee
+	.4byte	0x985e
 	.2byte	0x3c8
 	.uleb128 0x27
-	.4byte	.LASF2818
+	.4byte	.LASF2832
 	.byte	0xbe
 	.byte	0x1f
-	.4byte	0xd677
+	.4byte	0xd6e7
 	.2byte	0x3d0
 	.uleb128 0x27
-	.4byte	.LASF2819
+	.4byte	.LASF2833
 	.byte	0xbe
 	.byte	0x20
 	.4byte	0x21e
 	.2byte	0x3d8
 	.uleb128 0x27
-	.4byte	.LASF2820
+	.4byte	.LASF2834
 	.byte	0xbe
 	.byte	0x23
-	.4byte	0xd682
+	.4byte	0xd6f2
 	.2byte	0x3e0
 	.uleb128 0x27
-	.4byte	.LASF2221
+	.4byte	.LASF2235
 	.byte	0xbe
 	.byte	0x26
-	.4byte	0xadcf
+	.4byte	0xae3f
 	.2byte	0x3e8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xd5e7
+	.4byte	0xd657
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb92b
+	.4byte	0xb99b
 	.uleb128 0x24
-	.4byte	.LASF2820
+	.4byte	.LASF2834
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd67d
+	.4byte	0xd6ed
 	.uleb128 0x19
-	.4byte	.LASF2821
+	.4byte	.LASF2835
 	.byte	0xbe
 	.byte	0x30
-	.4byte	0xaddd
+	.4byte	0xae4d
 	.uleb128 0x19
-	.4byte	.LASF2822
+	.4byte	.LASF2836
 	.byte	0xbe
 	.byte	0x31
-	.4byte	0xa576
+	.4byte	0xa5e6
 	.uleb128 0xd
-	.4byte	.LASF2823
+	.4byte	.LASF2837
 	.byte	0xe0
 	.byte	0xbe
 	.byte	0xb7
-	.4byte	0xd70b
+	.4byte	0xd77b
 	.uleb128 0xe
-	.4byte	.LASF2332
+	.4byte	.LASF2346
 	.byte	0xbe
 	.byte	0xb8
-	.4byte	0xd720
+	.4byte	0xd790
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2334
+	.4byte	.LASF2348
 	.byte	0xbe
 	.byte	0xb9
-	.4byte	0xd720
+	.4byte	0xd790
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2335
+	.4byte	.LASF2349
 	.byte	0xbe
 	.byte	0xba
-	.4byte	0xd731
+	.4byte	0xd7a1
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2179
+	.4byte	.LASF2193
 	.byte	0xbe
 	.byte	0xbb
-	.4byte	0xd74b
+	.4byte	0xd7bb
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2180
+	.4byte	.LASF2194
 	.byte	0xbe
 	.byte	0xbc
-	.4byte	0xd720
+	.4byte	0xd790
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2202
+	.4byte	.LASF2216
 	.byte	0xbe
 	.byte	0xbd
-	.4byte	0xaf51
+	.4byte	0xafc1
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2824
+	.4byte	.LASF2838
 	.byte	0xbe
 	.byte	0xbe
-	.4byte	0xd677
+	.4byte	0xd6e7
 	.byte	0xd0
 	.uleb128 0xe
-	.4byte	.LASF2825
+	.4byte	.LASF2839
 	.byte	0xbe
 	.byte	0xbf
 	.4byte	0x2b0
@@ -36615,92 +36674,92 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xd71a
+	.4byte	0xd78a
 	.uleb128 0x11
-	.4byte	0xd71a
+	.4byte	0xd78a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd5e7
+	.4byte	0xd657
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd70b
+	.4byte	0xd77b
 	.uleb128 0x10
-	.4byte	0xd731
+	.4byte	0xd7a1
 	.uleb128 0x11
-	.4byte	0xd71a
+	.4byte	0xd78a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd726
+	.4byte	0xd796
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xd74b
+	.4byte	0xd7bb
 	.uleb128 0x11
-	.4byte	0xd71a
+	.4byte	0xd78a
 	.uleb128 0x11
-	.4byte	0xa418
+	.4byte	0xa488
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd737
+	.4byte	0xd7a7
 	.uleb128 0x5
-	.4byte	0xb19b
-	.4byte	0xd75c
+	.4byte	0xb20b
+	.4byte	0xd7cc
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xd751
+	.4byte	0xd7c1
 	.uleb128 0x19
-	.4byte	.LASF2826
+	.4byte	.LASF2840
 	.byte	0xbf
 	.byte	0x31
-	.4byte	0xd75c
+	.4byte	0xd7cc
 	.uleb128 0x19
-	.4byte	.LASF2827
+	.4byte	.LASF2841
 	.byte	0xc0
 	.byte	0x16
 	.4byte	0xe85
 	.uleb128 0x19
-	.4byte	.LASF2828
+	.4byte	.LASF2842
 	.byte	0xc0
 	.byte	0x17
 	.4byte	0xe65
 	.uleb128 0x19
-	.4byte	.LASF2829
+	.4byte	.LASF2843
 	.byte	0xc0
 	.byte	0x19
-	.4byte	0x4a56
+	.4byte	0x4ac6
 	.uleb128 0x19
-	.4byte	.LASF2830
+	.4byte	.LASF2844
 	.byte	0xc0
 	.byte	0x1a
 	.4byte	0x24a7
 	.uleb128 0x19
-	.4byte	.LASF2831
+	.4byte	.LASF2845
 	.byte	0x12
 	.byte	0x8c
 	.4byte	0x2b0
 	.uleb128 0x1e
-	.4byte	.LASF2832
+	.4byte	.LASF2846
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x12
 	.2byte	0x130
-	.4byte	0xd7c7
+	.4byte	0xd837
 	.uleb128 0xc
-	.4byte	.LASF2833
+	.4byte	.LASF2847
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2834
+	.4byte	.LASF2848
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2835
+	.4byte	.LASF2849
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x524e
-	.4byte	0xd7dd
+	.4byte	0x52be
+	.4byte	0xd84d
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
@@ -36709,101 +36768,101 @@ __exitcall_ebc_exit:
 	.byte	0xd
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF2836
+	.4byte	.LASF2850
 	.byte	0x12
 	.2byte	0x13b
-	.4byte	0xd7c7
+	.4byte	0xd837
 	.uleb128 0xb
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x4
 	.byte	0x1b
-	.4byte	0xd802
+	.4byte	0xd872
 	.uleb128 0xc
-	.4byte	.LASF2837
+	.4byte	.LASF2851
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2838
+	.4byte	.LASF2852
 	.byte	0x1
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2839
+	.4byte	.LASF2853
 	.byte	0xd0
 	.byte	0x4
 	.byte	0x20
-	.4byte	0xd81a
+	.4byte	0xd88a
 	.uleb128 0x20
 	.string	"ws"
 	.byte	0x4
 	.byte	0x21
-	.4byte	0xac0b
+	.4byte	0xac7b
 	.byte	0
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2840
+	.4byte	.LASF2854
 	.byte	0x4
 	.byte	0xc1
 	.byte	0x7
-	.4byte	0xd833
+	.4byte	0xd8a3
 	.uleb128 0xe
-	.4byte	.LASF2841
+	.4byte	.LASF2855
 	.byte	0xc1
 	.byte	0x8
 	.4byte	0xc6
 	.byte	0
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF2842
+	.4byte	.LASF2856
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc2
 	.byte	0xb
-	.4byte	0xd88c
+	.4byte	0xd8fc
 	.uleb128 0xc
-	.4byte	.LASF2843
+	.4byte	.LASF2857
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2844
+	.4byte	.LASF2858
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2845
+	.4byte	.LASF2859
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2846
+	.4byte	.LASF2860
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF2847
+	.4byte	.LASF2861
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF2848
+	.4byte	.LASF2862
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF2849
+	.4byte	.LASF2863
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF2850
+	.4byte	.LASF2864
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF2851
+	.4byte	.LASF2865
 	.byte	0x9
 	.uleb128 0xc
-	.4byte	.LASF2852
+	.4byte	.LASF2866
 	.byte	0xa
 	.uleb128 0xc
-	.4byte	.LASF2853
+	.4byte	.LASF2867
 	.byte	0xb
 	.uleb128 0xc
-	.4byte	.LASF2854
+	.4byte	.LASF2868
 	.byte	0xc
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2855
+	.4byte	.LASF2869
 	.byte	0x18
 	.byte	0xc2
 	.byte	0x27
-	.4byte	0xd8bd
+	.4byte	0xd92d
 	.uleb128 0xe
-	.4byte	.LASF2856
+	.4byte	.LASF2870
 	.byte	0xc2
 	.byte	0x28
 	.4byte	0x6d
@@ -36812,70 +36871,70 @@ __exitcall_ebc_exit:
 	.4byte	.LASF794
 	.byte	0xc2
 	.byte	0x29
-	.4byte	0x3573
+	.4byte	0x35e3
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2857
+	.4byte	.LASF2871
 	.byte	0xc2
 	.byte	0x2a
-	.4byte	0xc0c8
+	.4byte	0xc138
 	.byte	0x10
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF2858
+	.4byte	.LASF2872
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc3
 	.byte	0xe
-	.4byte	0xd8ec
+	.4byte	0xd95c
 	.uleb128 0xc
-	.4byte	.LASF2859
+	.4byte	.LASF2873
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2860
+	.4byte	.LASF2874
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2861
+	.4byte	.LASF2875
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2862
+	.4byte	.LASF2876
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2863
+	.4byte	.LASF2877
 	.byte	0x4
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2864
+	.4byte	.LASF2878
 	.byte	0x40
 	.byte	0xc3
 	.byte	0x16
-	.4byte	0xd971
+	.4byte	0xd9e1
 	.uleb128 0xe
 	.4byte	.LASF760
 	.byte	0xc3
 	.byte	0x17
-	.4byte	0xd8bd
+	.4byte	0xd92d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2865
+	.4byte	.LASF2879
 	.byte	0xc3
 	.byte	0x18
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2866
+	.4byte	.LASF2880
 	.byte	0xc3
 	.byte	0x19
 	.4byte	0x21e
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2867
+	.4byte	.LASF2881
 	.byte	0xc3
 	.byte	0x1a
-	.4byte	0x47d8
+	.4byte	0x4848
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2868
+	.4byte	.LASF2882
 	.byte	0xc3
 	.byte	0x1b
 	.4byte	0xc6
@@ -36887,130 +36946,130 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x2c
 	.uleb128 0xe
-	.4byte	.LASF2869
+	.4byte	.LASF2883
 	.byte	0xc3
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2870
+	.4byte	.LASF2884
 	.byte	0xc3
 	.byte	0x1e
 	.4byte	0xc6
 	.byte	0x34
 	.uleb128 0xe
-	.4byte	.LASF2871
+	.4byte	.LASF2885
 	.byte	0xc3
 	.byte	0x1f
 	.4byte	0xc6
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2872
+	.4byte	.LASF2886
 	.byte	0xc3
 	.byte	0x20
 	.4byte	0xc6
 	.byte	0x3c
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF2873
+	.4byte	.LASF2887
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc4
 	.byte	0x3b
-	.4byte	0xda12
+	.4byte	0xda82
 	.uleb128 0xc
-	.4byte	.LASF2874
+	.4byte	.LASF2888
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2875
+	.4byte	.LASF2889
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2876
+	.4byte	.LASF2890
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2877
+	.4byte	.LASF2891
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2878
+	.4byte	.LASF2892
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF2879
+	.4byte	.LASF2893
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF2880
+	.4byte	.LASF2894
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF2881
+	.4byte	.LASF2895
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF2882
+	.4byte	.LASF2896
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF2883
+	.4byte	.LASF2897
 	.byte	0x9
 	.uleb128 0xc
-	.4byte	.LASF2884
+	.4byte	.LASF2898
 	.byte	0xa
 	.uleb128 0xc
-	.4byte	.LASF2885
+	.4byte	.LASF2899
 	.byte	0xb
 	.uleb128 0xc
-	.4byte	.LASF2886
+	.4byte	.LASF2900
 	.byte	0xc
 	.uleb128 0xc
-	.4byte	.LASF2887
+	.4byte	.LASF2901
 	.byte	0xd
 	.uleb128 0xc
-	.4byte	.LASF2888
+	.4byte	.LASF2902
 	.byte	0xe
 	.uleb128 0xc
-	.4byte	.LASF2889
+	.4byte	.LASF2903
 	.byte	0xf
 	.uleb128 0xc
-	.4byte	.LASF2890
+	.4byte	.LASF2904
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF2891
+	.4byte	.LASF2905
 	.byte	0x11
 	.uleb128 0xc
-	.4byte	.LASF2892
+	.4byte	.LASF2906
 	.byte	0x12
 	.uleb128 0xc
-	.4byte	.LASF2893
+	.4byte	.LASF2907
 	.byte	0x13
 	.uleb128 0xc
-	.4byte	.LASF2894
+	.4byte	.LASF2908
 	.byte	0x14
 	.uleb128 0xc
-	.4byte	.LASF2895
+	.4byte	.LASF2909
 	.byte	0x15
 	.uleb128 0xc
-	.4byte	.LASF2896
+	.4byte	.LASF2910
 	.byte	0x16
 	.uleb128 0xc
-	.4byte	.LASF2897
+	.4byte	.LASF2911
 	.byte	0x17
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2898
+	.4byte	.LASF2912
 	.byte	0x2c
 	.byte	0xc4
 	.byte	0x59
-	.4byte	0xdaa3
+	.4byte	0xdb13
 	.uleb128 0xe
-	.4byte	.LASF884
+	.4byte	.LASF898
 	.byte	0xc4
 	.byte	0x5a
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2899
+	.4byte	.LASF2913
 	.byte	0xc4
 	.byte	0x5b
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF2900
+	.4byte	.LASF2914
 	.byte	0xc4
 	.byte	0x5c
 	.4byte	0xc6
@@ -37022,238 +37081,238 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF2901
+	.4byte	.LASF2915
 	.byte	0xc4
 	.byte	0x5e
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2869
+	.4byte	.LASF2883
 	.byte	0xc4
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2870
+	.4byte	.LASF2884
 	.byte	0xc4
 	.byte	0x60
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2871
+	.4byte	.LASF2885
 	.byte	0xc4
 	.byte	0x61
 	.4byte	0xc6
 	.byte	0x1c
 	.uleb128 0xe
-	.4byte	.LASF2872
+	.4byte	.LASF2886
 	.byte	0xc4
 	.byte	0x62
 	.4byte	0xc6
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2902
+	.4byte	.LASF2916
 	.byte	0xc4
 	.byte	0x63
 	.4byte	0xc6
 	.byte	0x24
 	.uleb128 0xe
-	.4byte	.LASF2903
+	.4byte	.LASF2917
 	.byte	0xc4
 	.byte	0x64
 	.4byte	0xc6
 	.byte	0x28
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2904
+	.4byte	.LASF2918
 	.byte	0x50
 	.byte	0x3
 	.byte	0x10
-	.4byte	0xdb1c
+	.4byte	0xdb8c
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x3
 	.byte	0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2905
+	.4byte	.LASF2919
 	.byte	0x3
 	.byte	0x12
-	.4byte	0x47d8
+	.4byte	0x4848
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2906
+	.4byte	.LASF2920
 	.byte	0x3
 	.byte	0x13
 	.4byte	0x458
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2907
+	.4byte	.LASF2921
 	.byte	0x3
 	.byte	0x14
-	.4byte	0xdb32
+	.4byte	0xdba2
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2908
+	.4byte	.LASF2922
 	.byte	0x3
 	.byte	0x15
-	.4byte	0xdb43
+	.4byte	0xdbb3
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2909
+	.4byte	.LASF2923
 	.byte	0x3
 	.byte	0x16
-	.4byte	0xdb43
+	.4byte	0xdbb3
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2910
+	.4byte	.LASF2924
 	.byte	0x3
 	.byte	0x17
-	.4byte	0xdb5d
+	.4byte	0xdbcd
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2911
+	.4byte	.LASF2925
 	.byte	0x3
 	.byte	0x18
-	.4byte	0xdb72
+	.4byte	0xdbe2
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2912
+	.4byte	.LASF2926
 	.byte	0x3
 	.byte	0x19
-	.4byte	0xdb8c
+	.4byte	0xdbfc
 	.byte	0x48
 	.byte	0
 	.uleb128 0x10
-	.4byte	0xdb2c
+	.4byte	0xdb9c
 	.uleb128 0x11
-	.4byte	0xdb2c
+	.4byte	0xdb9c
 	.uleb128 0x11
 	.4byte	0x2b0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdaa3
+	.4byte	0xdb13
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb1c
+	.4byte	0xdb8c
 	.uleb128 0x10
-	.4byte	0xdb43
+	.4byte	0xdbb3
 	.uleb128 0x11
-	.4byte	0xdb2c
+	.4byte	0xdb9c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb38
+	.4byte	0xdba8
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdb5d
+	.4byte	0xdbcd
 	.uleb128 0x11
-	.4byte	0xdb2c
+	.4byte	0xdb9c
 	.uleb128 0x11
-	.4byte	0x467e
+	.4byte	0x46ee
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb49
+	.4byte	0xdbb9
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdb72
+	.4byte	0xdbe2
 	.uleb128 0x11
-	.4byte	0xdb2c
+	.4byte	0xdb9c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb63
+	.4byte	0xdbd3
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdb8c
+	.4byte	0xdbfc
 	.uleb128 0x11
-	.4byte	0xdb2c
+	.4byte	0xdb9c
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb78
+	.4byte	0xdbe8
 	.uleb128 0x1f
-	.4byte	.LASF2913
+	.4byte	.LASF2927
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc5
 	.byte	0x5
-	.4byte	0xdbbb
+	.4byte	0xdc2b
 	.uleb128 0xc
-	.4byte	.LASF2914
+	.4byte	.LASF2928
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2915
+	.4byte	.LASF2929
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2916
+	.4byte	.LASF2930
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2917
+	.4byte	.LASF2931
 	.byte	0x3
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2918
+	.4byte	.LASF2932
 	.byte	0x20
 	.byte	0xc6
 	.byte	0xb
-	.4byte	0xdc04
+	.4byte	0xdc74
 	.uleb128 0xe
-	.4byte	.LASF2919
+	.4byte	.LASF2933
 	.byte	0xc6
 	.byte	0xc
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF884
+	.4byte	.LASF898
 	.byte	0xc6
 	.byte	0xd
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2455
+	.4byte	.LASF2469
 	.byte	0xc6
 	.byte	0xe
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF2920
+	.4byte	.LASF2934
 	.byte	0xc6
 	.byte	0xf
 	.4byte	0x325
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2921
+	.4byte	.LASF2935
 	.byte	0xc6
 	.byte	0x11
 	.4byte	0x6d
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2922
+	.4byte	.LASF2936
 	.byte	0x10
 	.byte	0xc6
 	.byte	0x2a
-	.4byte	0xdc35
+	.4byte	0xdca5
 	.uleb128 0x20
 	.string	"sgl"
 	.byte	0xc6
 	.byte	0x2b
-	.4byte	0xdc35
+	.4byte	0xdca5
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2923
+	.4byte	.LASF2937
 	.byte	0xc6
 	.byte	0x2c
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2924
+	.4byte	.LASF2938
 	.byte	0xc6
 	.byte	0x2d
 	.4byte	0x6d
@@ -37261,16 +37320,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdbbb
+	.4byte	0xdc2b
 	.uleb128 0x14
 	.4byte	0x458
-	.4byte	0xdc5e
+	.4byte	0xdcce
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdc5e
+	.4byte	0xdcce
 	.uleb128 0x11
 	.4byte	0x330
 	.uleb128 0x11
@@ -37281,11 +37340,11 @@ __exitcall_ebc_exit:
 	.4byte	0x325
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc3b
+	.4byte	0xdcab
 	.uleb128 0x10
-	.4byte	0xdc89
+	.4byte	0xdcf9
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
@@ -37297,14 +37356,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc6a
+	.4byte	0xdcda
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdcb7
+	.4byte	0xdd27
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0x3cb5
+	.4byte	0x3d25
 	.uleb128 0x11
 	.4byte	0x458
 	.uleb128 0x11
@@ -37316,14 +37375,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc8f
+	.4byte	0xdcff
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdce5
+	.4byte	0xdd55
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0xdce5
+	.4byte	0xdd55
 	.uleb128 0x11
 	.4byte	0x458
 	.uleb128 0x11
@@ -37335,164 +37394,164 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc04
+	.4byte	0xdc74
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdcbd
+	.4byte	0xdd2d
 	.uleb128 0x14
 	.4byte	0x325
-	.4byte	0xdd19
+	.4byte	0xdd89
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0x3469
+	.4byte	0x34d9
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdb92
+	.4byte	0xdc02
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdcf1
+	.4byte	0xdd61
 	.uleb128 0x10
-	.4byte	0xdd3e
+	.4byte	0xddae
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
 	.4byte	0x325
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdb92
+	.4byte	0xdc02
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd1f
+	.4byte	0xdd8f
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdd67
+	.4byte	0xddd7
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0xdc35
+	.4byte	0xdca5
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdb92
+	.4byte	0xdc02
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd44
+	.4byte	0xddb4
 	.uleb128 0x10
-	.4byte	0xdd8c
+	.4byte	0xddfc
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0xdc35
+	.4byte	0xdca5
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdb92
+	.4byte	0xdc02
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd6d
+	.4byte	0xdddd
 	.uleb128 0x14
 	.4byte	0x325
-	.4byte	0xddb5
+	.4byte	0xde25
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
 	.4byte	0x346
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdb92
+	.4byte	0xdc02
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd92
+	.4byte	0xde02
 	.uleb128 0x10
-	.4byte	0xddd5
+	.4byte	0xde45
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
 	.4byte	0x325
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdb92
+	.4byte	0xdc02
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xddbb
+	.4byte	0xde2b
 	.uleb128 0x10
-	.4byte	0xddf5
+	.4byte	0xde65
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
-	.4byte	0xdc35
+	.4byte	0xdca5
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdb92
+	.4byte	0xdc02
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdddb
+	.4byte	0xde4b
 	.uleb128 0x10
-	.4byte	0xde15
+	.4byte	0xde85
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
 	.4byte	0x458
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdb92
+	.4byte	0xdc02
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xddfb
+	.4byte	0xde6b
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xde2f
+	.4byte	0xde9f
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
 	.4byte	0x325
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde1b
+	.4byte	0xde8b
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xde49
+	.4byte	0xdeb9
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
 	.4byte	0x15a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde35
+	.4byte	0xdea5
 	.uleb128 0x14
 	.4byte	0x458
-	.4byte	0xde72
+	.4byte	0xdee2
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
 	.4byte	0x458
 	.uleb128 0x11
@@ -37504,11 +37563,11 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde4f
+	.4byte	0xdebf
 	.uleb128 0x10
-	.4byte	0xde8d
+	.4byte	0xdefd
 	.uleb128 0x11
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.uleb128 0x11
 	.4byte	0x458
 	.uleb128 0x11
@@ -37516,109 +37575,109 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde78
+	.4byte	0xdee8
 	.uleb128 0x19
-	.4byte	.LASF2925
+	.4byte	.LASF2939
 	.byte	0xa
 	.byte	0xc9
-	.4byte	0xb7b4
+	.4byte	0xb824
 	.uleb128 0x19
-	.4byte	.LASF2926
+	.4byte	.LASF2940
 	.byte	0xa
 	.byte	0xca
-	.4byte	0xb7b4
+	.4byte	0xb824
 	.uleb128 0x19
-	.4byte	.LASF2927
+	.4byte	.LASF2941
 	.byte	0xa
 	.byte	0xcb
-	.4byte	0xb7b4
+	.4byte	0xb824
 	.uleb128 0x24
-	.4byte	.LASF2928
+	.4byte	.LASF2942
 	.uleb128 0x19
-	.4byte	.LASF2929
+	.4byte	.LASF2943
 	.byte	0xc7
 	.byte	0x7
-	.4byte	0xdec4
+	.4byte	0xdf34
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdeb4
+	.4byte	0xdf24
 	.uleb128 0x24
-	.4byte	.LASF2930
+	.4byte	.LASF2944
 	.uleb128 0x19
-	.4byte	.LASF2931
+	.4byte	.LASF2945
 	.byte	0xc7
 	.byte	0x8
-	.4byte	0xdeda
+	.4byte	0xdf4a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdeca
+	.4byte	0xdf3a
 	.uleb128 0x19
-	.4byte	.LASF2932
+	.4byte	.LASF2946
 	.byte	0xc7
 	.byte	0x16
-	.4byte	0xb7b9
+	.4byte	0xb829
 	.uleb128 0x19
-	.4byte	.LASF2933
+	.4byte	.LASF2947
 	.byte	0xc8
 	.byte	0x1b
-	.4byte	0xb7b4
+	.4byte	0xb824
 	.uleb128 0xd
-	.4byte	.LASF2934
+	.4byte	.LASF2948
 	.byte	0x18
 	.byte	0xc9
 	.byte	0xf
-	.4byte	0xdf27
+	.4byte	0xdf97
 	.uleb128 0xe
-	.4byte	.LASF2866
+	.4byte	.LASF2880
 	.byte	0xc9
 	.byte	0x10
 	.4byte	0x458
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2865
+	.4byte	.LASF2879
 	.byte	0xc9
 	.byte	0x11
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF987
+	.4byte	.LASF1001
 	.byte	0xc9
 	.byte	0x12
 	.4byte	0x2e3
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2935
+	.4byte	.LASF2949
 	.byte	0xa0
 	.byte	0xc9
 	.byte	0x15
-	.4byte	0xe06b
+	.4byte	0xe0db
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xc9
 	.byte	0x16
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2936
+	.4byte	.LASF2950
 	.byte	0xc9
 	.byte	0x17
-	.4byte	0xe12c
+	.4byte	0xe19c
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2937
+	.4byte	.LASF2951
 	.byte	0xc9
 	.byte	0x18
-	.4byte	0xdb2c
+	.4byte	0xdb9c
 	.byte	0x10
 	.uleb128 0x20
 	.string	"fb"
 	.byte	0xc9
 	.byte	0x19
-	.4byte	0xe132
+	.4byte	0xe1a2
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2938
+	.4byte	.LASF2952
 	.byte	0xc9
 	.byte	0x1a
 	.4byte	0xc6
@@ -37630,43 +37689,43 @@ __exitcall_ebc_exit:
 	.4byte	0x13f
 	.byte	0x4c
 	.uleb128 0xe
-	.4byte	.LASF2900
+	.4byte	.LASF2914
 	.byte	0xc9
 	.byte	0x1d
 	.4byte	0x13f
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2939
+	.4byte	.LASF2953
 	.byte	0xc9
 	.byte	0x1e
 	.4byte	0x13f
 	.byte	0x54
 	.uleb128 0xe
-	.4byte	.LASF2940
+	.4byte	.LASF2954
 	.byte	0xc9
 	.byte	0x1f
 	.4byte	0x13f
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2902
+	.4byte	.LASF2916
 	.byte	0xc9
 	.byte	0x20
 	.4byte	0x13f
 	.byte	0x5c
 	.uleb128 0xe
-	.4byte	.LASF2903
+	.4byte	.LASF2917
 	.byte	0xc9
 	.byte	0x21
 	.4byte	0x13f
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2941
+	.4byte	.LASF2955
 	.byte	0xc9
 	.byte	0x22
 	.4byte	0x13f
 	.byte	0x64
 	.uleb128 0xe
-	.4byte	.LASF2942
+	.4byte	.LASF2956
 	.byte	0xc9
 	.byte	0x23
 	.4byte	0x13f
@@ -37696,13 +37755,13 @@ __exitcall_ebc_exit:
 	.4byte	0x13f
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2943
+	.4byte	.LASF2957
 	.byte	0xc9
 	.byte	0x28
 	.4byte	0x13f
 	.byte	0x7c
 	.uleb128 0xe
-	.4byte	.LASF2944
+	.4byte	.LASF2958
 	.byte	0xc9
 	.byte	0x29
 	.4byte	0x13f
@@ -37732,38 +37791,38 @@ __exitcall_ebc_exit:
 	.4byte	0x13f
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2945
+	.4byte	.LASF2959
 	.byte	0xc9
 	.byte	0x2e
 	.4byte	0x13f
 	.byte	0x94
 	.uleb128 0xe
-	.4byte	.LASF2901
+	.4byte	.LASF2915
 	.byte	0xc9
 	.byte	0x2f
 	.4byte	0x13f
 	.byte	0x98
 	.uleb128 0xe
-	.4byte	.LASF2946
+	.4byte	.LASF2960
 	.byte	0xc9
 	.byte	0x30
 	.4byte	0x13f
 	.byte	0x9c
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2947
+	.4byte	.LASF2961
 	.byte	0x70
 	.byte	0xb
 	.byte	0x17
-	.4byte	0xe12c
+	.4byte	0xe19c
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xb
 	.byte	0x18
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2948
+	.4byte	.LASF2962
 	.byte	0xb
 	.byte	0x19
 	.4byte	0x458
@@ -37781,67 +37840,67 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2949
+	.4byte	.LASF2963
 	.byte	0xb
 	.byte	0x1d
-	.4byte	0xe147
+	.4byte	0xe1b7
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2950
+	.4byte	.LASF2964
 	.byte	0xb
 	.byte	0x1e
-	.4byte	0xe147
+	.4byte	0xe1b7
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2951
+	.4byte	.LASF2965
 	.byte	0xb
 	.byte	0x1f
-	.4byte	0xe152
+	.4byte	0xe1c2
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2952
+	.4byte	.LASF2966
 	.byte	0xb
 	.byte	0x21
-	.4byte	0xe172
+	.4byte	0xe1e2
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2953
+	.4byte	.LASF2967
 	.byte	0xb
 	.byte	0x22
-	.4byte	0xe183
+	.4byte	0xe1f3
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2954
+	.4byte	.LASF2968
 	.byte	0xb
 	.byte	0x23
-	.4byte	0xe1a8
+	.4byte	0xe218
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2955
+	.4byte	.LASF2969
 	.byte	0xb
 	.byte	0x24
-	.4byte	0xe1c3
+	.4byte	0xe233
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2956
+	.4byte	.LASF2970
 	.byte	0xb
 	.byte	0x25
-	.4byte	0xe1d9
+	.4byte	0xe249
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2957
+	.4byte	.LASF2971
 	.byte	0xb
 	.byte	0x26
-	.4byte	0xe1fd
+	.4byte	0xe26d
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2958
+	.4byte	.LASF2972
 	.byte	0xb
 	.byte	0x27
-	.4byte	0xe213
+	.4byte	0xe283
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2959
+	.4byte	.LASF2973
 	.byte	0xb
 	.byte	0x29
 	.4byte	0x4b7
@@ -37849,50 +37908,50 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe06b
+	.4byte	0xe0db
 	.uleb128 0x5
-	.4byte	0xdef6
-	.4byte	0xe142
+	.4byte	0xdf66
+	.4byte	0xe1b2
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
-	.uleb128 0x48
+	.uleb128 0x4a
 	.string	"clk"
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe142
+	.4byte	0xe1b2
 	.uleb128 0x24
-	.4byte	.LASF2960
+	.4byte	.LASF2974
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe14d
+	.4byte	0xe1bd
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xe16c
+	.4byte	0xe1dc
 	.uleb128 0x11
-	.4byte	0xe12c
+	.4byte	0xe19c
 	.uleb128 0x11
-	.4byte	0xe16c
+	.4byte	0xe1dc
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdf27
+	.4byte	0xdf97
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe158
+	.4byte	0xe1c8
 	.uleb128 0x10
-	.4byte	0xe183
+	.4byte	0xe1f3
 	.uleb128 0x11
-	.4byte	0xe12c
+	.4byte	0xe19c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe178
+	.4byte	0xe1e8
 	.uleb128 0x10
-	.4byte	0xe1a8
+	.4byte	0xe218
 	.uleb128 0x11
-	.4byte	0xe12c
+	.4byte	0xe19c
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -37904,11 +37963,11 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe189
+	.4byte	0xe1f9
 	.uleb128 0x10
-	.4byte	0xe1c3
+	.4byte	0xe233
 	.uleb128 0x11
-	.4byte	0xe12c
+	.4byte	0xe19c
 	.uleb128 0x11
 	.4byte	0x13f
 	.uleb128 0x11
@@ -37916,24 +37975,24 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1ae
+	.4byte	0xe21e
 	.uleb128 0x10
-	.4byte	0xe1d9
+	.4byte	0xe249
 	.uleb128 0x11
-	.4byte	0xe12c
+	.4byte	0xe19c
 	.uleb128 0x11
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1c9
+	.4byte	0xe239
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xe1fd
+	.4byte	0xe26d
 	.uleb128 0x11
-	.4byte	0xe12c
+	.4byte	0xe19c
 	.uleb128 0x11
-	.4byte	0x3573
+	.4byte	0x35e3
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -37941,109 +38000,109 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1df
+	.4byte	0xe24f
 	.uleb128 0x10
-	.4byte	0xe213
+	.4byte	0xe283
 	.uleb128 0x11
-	.4byte	0xe12c
+	.4byte	0xe19c
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe203
+	.4byte	0xe273
 	.uleb128 0x26
-	.4byte	.LASF2961
-	.2byte	0x278
+	.4byte	.LASF2975
+	.2byte	0x280
 	.byte	0x1
 	.byte	0x33
-	.4byte	0xe44d
+	.4byte	0xe4ca
 	.uleb128 0xe
-	.4byte	.LASF2962
+	.4byte	.LASF2976
 	.byte	0x1
 	.byte	0x34
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2963
+	.4byte	.LASF2977
 	.byte	0x1
 	.byte	0x35
 	.4byte	0x21e
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2964
+	.4byte	.LASF2978
 	.byte	0x1
 	.byte	0x36
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2965
+	.4byte	.LASF2979
 	.byte	0x1
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2966
+	.4byte	.LASF2980
 	.byte	0x1
 	.byte	0x38
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2967
+	.4byte	.LASF2981
 	.byte	0x1
 	.byte	0x39
 	.4byte	0x29
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2968
+	.4byte	.LASF2982
 	.byte	0x1
 	.byte	0x3a
 	.4byte	0xc6
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2969
+	.4byte	.LASF2983
 	.byte	0x1
 	.byte	0x3b
 	.4byte	0xc6
 	.byte	0x2c
 	.uleb128 0xe
-	.4byte	.LASF2970
+	.4byte	.LASF2984
 	.byte	0x1
 	.byte	0x3c
 	.4byte	0x61
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2971
+	.4byte	.LASF2985
 	.byte	0x1
 	.byte	0x3d
 	.4byte	0x61
 	.byte	0x31
 	.uleb128 0xe
-	.4byte	.LASF2972
+	.4byte	.LASF2986
 	.byte	0x1
 	.byte	0x3e
 	.4byte	0xc6
 	.byte	0x34
 	.uleb128 0xe
-	.4byte	.LASF2973
+	.4byte	.LASF2987
 	.byte	0x1
 	.byte	0x3f
 	.4byte	0xc6
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2974
+	.4byte	.LASF2988
 	.byte	0x1
 	.byte	0x40
 	.4byte	0xc6
 	.byte	0x3c
 	.uleb128 0xe
-	.4byte	.LASF2975
+	.4byte	.LASF2989
 	.byte	0x1
 	.byte	0x41
 	.4byte	0xc6
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2900
+	.4byte	.LASF2914
 	.byte	0x1
 	.byte	0x42
 	.4byte	0xc6
@@ -38055,25 +38114,25 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2976
+	.4byte	.LASF2990
 	.byte	0x1
 	.byte	0x44
-	.4byte	0x467e
+	.4byte	0x46ee
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2977
+	.4byte	.LASF2991
 	.byte	0x1
 	.byte	0x45
 	.4byte	0xc6
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2978
+	.4byte	.LASF2992
 	.byte	0x1
 	.byte	0x46
 	.4byte	0xc6
 	.byte	0x5c
 	.uleb128 0xe
-	.4byte	.LASF2979
+	.4byte	.LASF2993
 	.byte	0x1
 	.byte	0x47
 	.4byte	0xc6
@@ -38082,3888 +38141,3897 @@ __exitcall_ebc_exit:
 	.string	"dev"
 	.byte	0x1
 	.byte	0x48
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2980
+	.4byte	.LASF2994
 	.byte	0x1
 	.byte	0x49
-	.4byte	0xd88c
+	.4byte	0xd8fc
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF2981
+	.4byte	.LASF2995
 	.byte	0x1
 	.byte	0x4a
 	.4byte	0x2f05
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF2982
+	.4byte	.LASF2996
 	.byte	0x1
 	.byte	0x4c
-	.4byte	0x467e
+	.4byte	0x46ee
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2983
+	.4byte	.LASF2997
 	.byte	0x1
 	.byte	0x4d
-	.4byte	0x467e
+	.4byte	0x46ee
 	.byte	0x98
 	.uleb128 0xe
-	.4byte	.LASF2984
+	.4byte	.LASF2998
 	.byte	0x1
 	.byte	0x4e
-	.4byte	0x467e
+	.4byte	0x46ee
 	.byte	0xa0
 	.uleb128 0xe
-	.4byte	.LASF2985
+	.4byte	.LASF2999
 	.byte	0x1
 	.byte	0x50
-	.4byte	0xc0c8
+	.4byte	0xc138
 	.byte	0xa8
 	.uleb128 0xe
-	.4byte	.LASF2986
+	.4byte	.LASF3000
 	.byte	0x1
 	.byte	0x51
-	.4byte	0xc0c8
+	.4byte	0xc138
 	.byte	0xb0
 	.uleb128 0xe
-	.4byte	.LASF2987
+	.4byte	.LASF3001
 	.byte	0x1
 	.byte	0x52
-	.4byte	0xe44d
+	.4byte	0xe4ca
 	.byte	0xb8
 	.uleb128 0xe
-	.4byte	.LASF2988
+	.4byte	.LASF3002
 	.byte	0x1
 	.byte	0x53
 	.4byte	0xc6
 	.byte	0xc8
 	.uleb128 0xe
-	.4byte	.LASF2989
+	.4byte	.LASF3003
 	.byte	0x1
 	.byte	0x54
 	.4byte	0xc6
 	.byte	0xcc
 	.uleb128 0xe
-	.4byte	.LASF2990
+	.4byte	.LASF3004
 	.byte	0x1
 	.byte	0x55
 	.4byte	0x21e
 	.byte	0xd0
 	.uleb128 0xe
-	.4byte	.LASF2991
+	.4byte	.LASF3005
 	.byte	0x1
 	.byte	0x56
-	.4byte	0xe45d
+	.4byte	0xe4da
 	.byte	0xd8
 	.uleb128 0xe
-	.4byte	.LASF2992
+	.4byte	.LASF3006
 	.byte	0x1
 	.byte	0x57
-	.4byte	0xe45d
+	.4byte	0xe4da
 	.byte	0xe0
 	.uleb128 0xe
-	.4byte	.LASF2993
+	.4byte	.LASF3007
 	.byte	0x1
 	.byte	0x59
-	.4byte	0xd802
+	.4byte	0xd872
 	.byte	0xe8
 	.uleb128 0x27
-	.4byte	.LASF2994
+	.4byte	.LASF3008
 	.byte	0x1
 	.byte	0x5a
 	.4byte	0xc6
 	.2byte	0x1b8
 	.uleb128 0x27
-	.4byte	.LASF2995
+	.4byte	.LASF3009
 	.byte	0x1
 	.byte	0x5c
 	.4byte	0xc6
 	.2byte	0x1bc
 	.uleb128 0x27
-	.4byte	.LASF2996
+	.4byte	.LASF3010
 	.byte	0x1
 	.byte	0x5e
 	.4byte	0x3172
 	.2byte	0x1c0
 	.uleb128 0x27
-	.4byte	.LASF2997
+	.4byte	.LASF3011
 	.byte	0x1
 	.byte	0x61
 	.4byte	0x3172
 	.2byte	0x1f8
 	.uleb128 0x27
-	.4byte	.LASF2998
+	.4byte	.LASF3012
 	.byte	0x1
 	.byte	0x64
 	.4byte	0x320b
 	.2byte	0x230
 	.uleb128 0x27
-	.4byte	.LASF2999
+	.4byte	.LASF3013
 	.byte	0x1
-	.byte	0x67
-	.4byte	0xc6
+	.byte	0x65
+	.4byte	0x331f
 	.2byte	0x260
 	.uleb128 0x27
-	.4byte	.LASF3000
+	.4byte	.LASF3014
 	.byte	0x1
-	.byte	0x69
+	.byte	0x68
 	.4byte	0xc6
-	.2byte	0x264
+	.2byte	0x268
 	.uleb128 0x27
-	.4byte	.LASF3001
+	.4byte	.LASF3015
 	.byte	0x1
-	.byte	0x6b
+	.byte	0x6a
 	.4byte	0xc6
-	.2byte	0x268
+	.2byte	0x26c
 	.uleb128 0x27
-	.4byte	.LASF3002
+	.4byte	.LASF3016
 	.byte	0x1
-	.byte	0x6d
+	.byte	0x6c
 	.4byte	0xc6
-	.2byte	0x26c
+	.2byte	0x270
 	.uleb128 0x27
-	.4byte	.LASF3003
+	.4byte	.LASF3017
 	.byte	0x1
 	.byte	0x6e
 	.4byte	0xc6
-	.2byte	0x270
+	.2byte	0x274
+	.uleb128 0x27
+	.4byte	.LASF3018
+	.byte	0x1
+	.byte	0x6f
+	.4byte	0xc6
+	.2byte	0x278
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x458
-	.4byte	0xe45d
+	.4byte	0xe4da
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd8ec
-	.uleb128 0x4a
+	.4byte	0xd95c
+	.uleb128 0x4b
 	.string	"ebc"
-	.2byte	0x330
+	.2byte	0x338
 	.byte	0x1
-	.byte	0x71
-	.4byte	0xe4ad
+	.byte	0x72
+	.4byte	0xe52a
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x1
-	.byte	0x72
-	.4byte	0xa570
+	.byte	0x73
+	.4byte	0xa5e0
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2936
+	.4byte	.LASF2950
 	.byte	0x1
-	.byte	0x73
-	.4byte	0xe12c
+	.byte	0x74
+	.4byte	0xe19c
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2937
+	.4byte	.LASF2951
 	.byte	0x1
-	.byte	0x74
-	.4byte	0xdb2c
+	.byte	0x75
+	.4byte	0xdb9c
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF3004
+	.4byte	.LASF3019
 	.byte	0x1
-	.byte	0x75
-	.4byte	0xdf27
+	.byte	0x76
+	.4byte	0xdf97
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1774
+	.4byte	.LASF1788
 	.byte	0x1
-	.byte	0x76
-	.4byte	0xe219
+	.byte	0x77
+	.4byte	0xe289
 	.byte	0xb8
 	.byte	0
-	.uleb128 0x4b
-	.4byte	.LASF3005
+	.uleb128 0x4c
+	.4byte	.LASF3020
 	.byte	0x1
-	.byte	0x79
-	.4byte	0xe4c2
+	.byte	0x7a
+	.4byte	0xe53f
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	global_ebc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe463
-	.uleb128 0x4b
-	.4byte	.LASF3006
+	.4byte	0xe4e0
+	.uleb128 0x4c
+	.4byte	.LASF3021
 	.byte	0x1
-	.byte	0x7a
+	.byte	0x7b
 	.4byte	0x2f05
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_auto_task
-	.uleb128 0x4b
-	.4byte	.LASF3007
+	.uleb128 0x4c
+	.4byte	.LASF3022
 	.byte	0x1
-	.byte	0x7b
-	.4byte	0x4e36
+	.byte	0x7c
+	.4byte	0x4ea6
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	auto_buf_sema
-	.uleb128 0x4b
-	.4byte	.LASF3008
+	.uleb128 0x4c
+	.4byte	.LASF3023
 	.byte	0x1
-	.byte	0x7d
+	.byte	0x7e
 	.4byte	0x159a
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_wq
-	.uleb128 0x4b
-	.4byte	.LASF3009
+	.uleb128 0x4c
+	.4byte	.LASF3024
 	.byte	0x1
-	.byte	0x7e
+	.byte	0x7f
 	.4byte	0x159a
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_thread_wq
-	.uleb128 0x4b
-	.4byte	.LASF3010
+	.uleb128 0x4c
+	.4byte	.LASF3025
 	.byte	0x1
-	.byte	0x7f
+	.byte	0x80
 	.4byte	0x159a
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_poweroff_wq
-	.uleb128 0x4b
-	.4byte	.LASF3011
+	.uleb128 0x4c
+	.4byte	.LASF3026
 	.byte	0x1
-	.byte	0x80
-	.4byte	0x5b71
+	.byte	0x81
+	.4byte	0x5be1
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_auto_thread_sem
-	.uleb128 0x4c
-	.4byte	.LASF3012
+	.uleb128 0x4d
+	.4byte	.LASF3027
 	.byte	0x1
-	.2byte	0x7ba
+	.2byte	0x7bb
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_ops
-	.uleb128 0x4c
-	.4byte	.LASF3013
+	.uleb128 0x4d
+	.4byte	.LASF3028
 	.byte	0x1
-	.2byte	0x7c4
-	.4byte	0xc610
+	.2byte	0x7c5
+	.4byte	0xc680
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_misc
-	.uleb128 0x4c
-	.4byte	.LASF3014
+	.uleb128 0x4d
+	.4byte	.LASF3029
 	.byte	0x1
-	.2byte	0x7e1
+	.2byte	0x7e2
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	waveform_ops
-	.uleb128 0x4c
-	.4byte	.LASF3015
+	.uleb128 0x4d
+	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0x7e7
-	.4byte	0xc610
+	.2byte	0x7e8
+	.4byte	0xc680
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	waveform_misc
-	.uleb128 0x4c
-	.4byte	.LASF3016
+	.uleb128 0x4d
+	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0x7f6
-	.4byte	0xb39d
+	.2byte	0x7f7
+	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_waveform_version
-	.uleb128 0x4c
-	.4byte	.LASF3017
+	.uleb128 0x4d
+	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0x801
-	.4byte	0xb39d
+	.2byte	0x802
+	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_name
-	.uleb128 0x4c
-	.4byte	.LASF3018
+	.uleb128 0x4d
+	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0x80f
-	.4byte	0xb39d
+	.2byte	0x810
+	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_temp
-	.uleb128 0x4c
-	.4byte	.LASF3019
+	.uleb128 0x4d
+	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0x832
-	.4byte	0xb39d
+	.2byte	0x833
+	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_vcom
-	.uleb128 0x4c
-	.4byte	.LASF3020
+	.uleb128 0x4d
+	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0x83c
-	.4byte	0xb39d
+	.2byte	0x83d
+	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_version
-	.uleb128 0x4c
-	.4byte	.LASF3021
+	.uleb128 0x4d
+	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0x845
-	.4byte	0xb39d
+	.2byte	0x846
+	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_state
-	.uleb128 0x4c
-	.4byte	.LASF3022
+	.uleb128 0x4d
+	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0x84e
-	.4byte	0xb39d
+	.2byte	0x84f
+	.4byte	0xb40d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_buf_state
-	.uleb128 0x4c
-	.4byte	.LASF3023
+	.uleb128 0x4d
+	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0xa01
-	.4byte	0xa55c
+	.2byte	0xa04
+	.4byte	0xa5cc
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_pm
 	.uleb128 0x5
-	.4byte	0xb19b
-	.4byte	0xe65e
+	.4byte	0xb20b
+	.4byte	0xe6db
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe64e
-	.uleb128 0x4c
-	.4byte	.LASF3024
+	.4byte	0xe6cb
+	.uleb128 0x4d
+	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0xa06
-	.4byte	0xe65e
+	.2byte	0xa09
+	.4byte	0xe6db
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_match
-	.uleb128 0x4c
-	.4byte	.LASF3025
+	.uleb128 0x4d
+	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0xa0c
-	.4byte	0xd69e
+	.2byte	0xa0f
+	.4byte	0xd70e
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_driver
-	.uleb128 0x4c
-	.4byte	.LASF3026
+	.uleb128 0x4d
+	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0xa20
+	.2byte	0xa23
 	.4byte	0x458
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init2592
-	.uleb128 0x4c
-	.4byte	.LASF3027
+	.8byte	__addressable_ebc_init2595
+	.uleb128 0x4d
+	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0xa21
+	.2byte	0xa24
 	.4byte	0x4ac
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	__exitcall_ebc_exit
-	.uleb128 0x4d
-	.4byte	.LASF3078
+	.uleb128 0x4e
+	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0xa1b
-	.8byte	.LFB2855
-	.8byte	.LFE2855-.LFB2855
+	.2byte	0xa1e
+	.8byte	.LFB2856
+	.8byte	.LFE2856-.LFB2856
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe6e7
-	.uleb128 0x4e
+	.4byte	0xe764
+	.uleb128 0x4f
 	.8byte	.LVL64
-	.4byte	0x14440
+	.4byte	0x144d0
 	.byte	0
-	.uleb128 0x4f
-	.4byte	.LASF3028
+	.uleb128 0x50
+	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0xa16
+	.2byte	0xa19
 	.4byte	0xc6
-	.8byte	.LFB2854
-	.8byte	.LFE2854-.LFB2854
+	.8byte	.LFB2855
+	.8byte	.LFE2855-.LFB2855
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe717
-	.uleb128 0x4e
+	.4byte	0xe794
+	.uleb128 0x4f
 	.8byte	.LVL356
-	.4byte	0x1444c
+	.4byte	0x144dc
 	.byte	0
-	.uleb128 0x50
-	.4byte	.LASF3029
+	.uleb128 0x51
+	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0x9f5
+	.2byte	0x9f8
 	.4byte	0xc6
-	.8byte	.LFB2853
-	.8byte	.LFE2853-.LFB2853
+	.8byte	.LFB2854
+	.8byte	.LFE2854-.LFB2854
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe7b3
-	.uleb128 0x51
+	.4byte	0xe830
+	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x9f5
-	.4byte	0xa570
+	.2byte	0x9f8
+	.4byte	0xa5e0
 	.4byte	.LLST11
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x9f7
-	.4byte	0xe4c2
-	.uleb128 0x46
-	.4byte	.LASF2961
-	.byte	0x1
-	.2byte	0x9f8
-	.4byte	0xe7b3
-	.uleb128 0x53
-	.4byte	0x137a7
-	.8byte	.LBB938
-	.8byte	.LBE938-.LBB938
+	.2byte	0x9fa
+	.4byte	0xe53f
+	.uleb128 0x48
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x9f7
-	.4byte	0xe783
+	.2byte	0x9fb
+	.4byte	0xe830
 	.uleb128 0x54
-	.4byte	0x137b8
-	.byte	0
-	.uleb128 0x53
-	.4byte	0x1338f
-	.8byte	.LBB940
-	.8byte	.LBE940-.LBB940
+	.4byte	0x13844
+	.8byte	.LBB934
+	.8byte	.LBE934-.LBB934
 	.byte	0x1
 	.2byte	0x9fa
-	.4byte	0xe7a5
+	.4byte	0xe800
+	.uleb128 0x55
+	.4byte	0x13855
+	.byte	0
 	.uleb128 0x54
-	.4byte	0x1339c
+	.4byte	0x13419
+	.8byte	.LBB936
+	.8byte	.LBE936-.LBB936
+	.byte	0x1
+	.2byte	0x9fd
+	.4byte	0xe822
+	.uleb128 0x55
+	.4byte	0x13426
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL68
-	.4byte	0x14458
+	.4byte	0x144e8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe219
-	.uleb128 0x50
-	.4byte	.LASF3031
+	.4byte	0xe289
+	.uleb128 0x51
+	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0x9e4
+	.2byte	0x9e7
 	.4byte	0xc6
-	.8byte	.LFB2852
-	.8byte	.LFE2852-.LFB2852
+	.8byte	.LFB2853
+	.8byte	.LFE2853-.LFB2853
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe8c0
-	.uleb128 0x51
+	.4byte	0xe93d
+	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x9e4
-	.4byte	0xa570
+	.2byte	0x9e7
+	.4byte	0xa5e0
 	.4byte	.LLST148
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x9e6
-	.4byte	0xe4c2
-	.uleb128 0x46
-	.4byte	.LASF2961
+	.2byte	0x9e9
+	.4byte	0xe53f
+	.uleb128 0x48
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x9e7
-	.4byte	0xe7b3
-	.uleb128 0x55
-	.4byte	.LASF3032
-	.4byte	0xe8d0
+	.2byte	0x9ea
+	.4byte	0xe830
+	.uleb128 0x56
+	.4byte	.LASF3047
+	.4byte	0xe94d
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35300
-	.uleb128 0x53
-	.4byte	0x137a7
-	.8byte	.LBB1422
-	.8byte	.LBE1422-.LBB1422
-	.byte	0x1
-	.2byte	0x9e6
-	.4byte	0xe838
+	.8byte	__func__.35307
 	.uleb128 0x54
-	.4byte	0x137b8
-	.byte	0
-	.uleb128 0x53
-	.4byte	0x133a8
-	.8byte	.LBB1424
-	.8byte	.LBE1424-.LBB1424
+	.4byte	0x13844
+	.8byte	.LBB1414
+	.8byte	.LBE1414-.LBB1414
 	.byte	0x1
-	.2byte	0x9ef
-	.4byte	0xe85a
-	.uleb128 0x54
-	.4byte	0x133b5
+	.2byte	0x9e9
+	.4byte	0xe8b5
+	.uleb128 0x55
+	.4byte	0x13855
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x130f0
-	.8byte	.LBB1426
-	.8byte	.LBE1426-.LBB1426
-	.byte	0x1
-	.2byte	0x9eb
-	.4byte	0xe8a5
 	.uleb128 0x54
-	.4byte	0x1310b
+	.4byte	0x13433
+	.8byte	.LBB1416
+	.8byte	.LBE1416-.LBB1416
+	.byte	0x1
+	.2byte	0x9f2
+	.4byte	0xe8d7
+	.uleb128 0x55
+	.4byte	0x13440
+	.byte	0
 	.uleb128 0x54
-	.4byte	0x13100
-	.uleb128 0x56
-	.8byte	.LBB1427
-	.8byte	.LBE1427-.LBB1427
+	.4byte	0x13160
+	.8byte	.LBB1418
+	.8byte	.LBE1418-.LBB1418
+	.byte	0x1
+	.2byte	0x9ee
+	.4byte	0xe922
+	.uleb128 0x55
+	.4byte	0x1317b
+	.uleb128 0x55
+	.4byte	0x13170
 	.uleb128 0x57
-	.4byte	0x13116
-	.uleb128 0x4e
+	.8byte	.LBB1419
+	.8byte	.LBE1419-.LBB1419
+	.uleb128 0x58
+	.4byte	0x13187
+	.uleb128 0x4f
 	.8byte	.LVL521
-	.4byte	0x142d0
+	.4byte	0x14360
 	.byte	0
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL519
-	.4byte	0x14458
-	.uleb128 0x4e
+	.4byte	0x144e8
+	.uleb128 0x4f
 	.8byte	.LVL520
-	.4byte	0x14458
+	.4byte	0x144e8
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xe8d0
+	.4byte	0xe94d
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xb
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe8c0
-	.uleb128 0x4f
-	.4byte	.LASF3033
+	.4byte	0xe93d
+	.uleb128 0x50
+	.4byte	.LASF3048
 	.byte	0x1
-	.2byte	0x9dd
+	.2byte	0x9e0
 	.4byte	0xc6
-	.8byte	.LFB2851
-	.8byte	.LFE2851-.LFB2851
+	.8byte	.LFB2852
+	.8byte	.LFE2852-.LFB2852
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe915
-	.uleb128 0x58
-	.4byte	.LASF3034
+	.4byte	0xe992
+	.uleb128 0x59
+	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0x9dd
-	.4byte	0xd71a
+	.2byte	0x9e0
+	.4byte	0xd78a
 	.4byte	.LLST13
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL74
-	.4byte	0x14465
+	.4byte	0x144f5
 	.byte	0
-	.uleb128 0x4f
-	.4byte	.LASF3035
+	.uleb128 0x50
+	.4byte	.LASF3050
 	.byte	0x1
-	.2byte	0x95c
+	.2byte	0x95f
 	.4byte	0xc6
-	.8byte	.LFB2850
-	.8byte	.LFE2850-.LFB2850
+	.8byte	.LFB2851
+	.8byte	.LFE2851-.LFB2851
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfd90
-	.uleb128 0x58
-	.4byte	.LASF3034
+	.4byte	0xfe1a
+	.uleb128 0x59
+	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0x95c
-	.4byte	0xd71a
+	.2byte	0x95f
+	.4byte	0xd78a
 	.4byte	.LLST149
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x95e
-	.4byte	0xa570
-	.uleb128 0x46
-	.4byte	.LASF3036
-	.byte	0x1
-	.2byte	0x95f
-	.4byte	0xb894
-	.uleb128 0x59
-	.4byte	.LASF3037
-	.byte	0x1
-	.2byte	0x960
-	.4byte	0xd71a
-	.4byte	.LLST150
-	.uleb128 0x46
-	.4byte	.LASF3038
-	.byte	0x1
 	.2byte	0x961
-	.4byte	0xb894
-	.uleb128 0x59
-	.4byte	.LASF3039
+	.4byte	0xa5e0
+	.uleb128 0x48
+	.4byte	.LASF3051
 	.byte	0x1
 	.2byte	0x962
-	.4byte	0xc043
-	.4byte	.LLST151
-	.uleb128 0x52
-	.string	"ebc"
+	.4byte	0xb904
+	.uleb128 0x5a
+	.4byte	.LASF3052
 	.byte	0x1
 	.2byte	0x963
-	.4byte	0xe4c2
-	.uleb128 0x59
-	.4byte	.LASF2961
+	.4byte	0xd78a
+	.4byte	.LLST150
+	.uleb128 0x48
+	.4byte	.LASF3053
 	.byte	0x1
 	.2byte	0x964
-	.4byte	0xe7b3
-	.4byte	.LLST152
-	.uleb128 0x46
-	.4byte	.LASF3004
+	.4byte	0xb904
+	.uleb128 0x5a
+	.4byte	.LASF3054
 	.byte	0x1
 	.2byte	0x965
-	.4byte	0xe16c
-	.uleb128 0x59
-	.4byte	.LASF962
+	.4byte	0xc0b3
+	.4byte	.LLST151
+	.uleb128 0x53
+	.string	"ebc"
 	.byte	0x1
 	.2byte	0x966
-	.4byte	0xbcc0
-	.4byte	.LLST153
-	.uleb128 0x46
-	.4byte	.LASF2421
-	.byte	0x1
+	.4byte	0xe53f
+	.uleb128 0x5a
+	.4byte	.LASF2975
+	.byte	0x1
 	.2byte	0x967
-	.4byte	0xbc60
-	.uleb128 0x52
-	.string	"ret"
+	.4byte	0xe830
+	.4byte	.LLST152
+	.uleb128 0x48
+	.4byte	.LASF3019
 	.byte	0x1
 	.2byte	0x968
-	.4byte	0xc6
-	.uleb128 0x59
-	.4byte	.LASF987
+	.4byte	0xe1dc
+	.uleb128 0x5a
+	.4byte	.LASF976
 	.byte	0x1
 	.2byte	0x969
+	.4byte	0xbd30
+	.4byte	.LLST153
+	.uleb128 0x48
+	.4byte	.LASF2435
+	.byte	0x1
+	.2byte	0x96a
+	.4byte	0xbcd0
+	.uleb128 0x53
+	.string	"ret"
+	.byte	0x1
+	.2byte	0x96b
 	.4byte	0xc6
-	.4byte	.LLST154
 	.uleb128 0x5a
+	.4byte	.LASF1001
+	.byte	0x1
+	.2byte	0x96c
+	.4byte	0xc6
+	.4byte	.LLST154
+	.uleb128 0x5b
 	.string	"i"
 	.byte	0x1
-	.2byte	0x96a
+	.2byte	0x96d
 	.4byte	0xc6
 	.4byte	.LLST155
-	.uleb128 0x5b
-	.4byte	0x137c5
-	.8byte	.LBB1578
-	.4byte	.Ldebug_ranges0+0xc00
+	.uleb128 0x5c
+	.4byte	0x13862
+	.8byte	.LBB1570
+	.4byte	.Ldebug_ranges0+0xbd0
 	.byte	0x1
-	.2byte	0x96c
-	.4byte	0xea2e
-	.uleb128 0x54
-	.4byte	0x137ee
-	.uleb128 0x54
-	.4byte	0x137e2
-	.uleb128 0x54
-	.4byte	0x137d6
-	.uleb128 0x4e
+	.2byte	0x96f
+	.4byte	0xeaab
+	.uleb128 0x55
+	.4byte	0x1388b
+	.uleb128 0x55
+	.4byte	0x1387f
+	.uleb128 0x55
+	.4byte	0x13873
+	.uleb128 0x4f
 	.8byte	.LVL524
-	.4byte	0x14471
+	.4byte	0x14501
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x136a1
-	.8byte	.LBB1582
-	.8byte	.LBE1582-.LBB1582
-	.byte	0x1
-	.2byte	0x97e
-	.4byte	0xea6d
 	.uleb128 0x54
-	.4byte	0x136b1
-	.uleb128 0x5c
-	.4byte	0x137a7
-	.8byte	.LBB1583
-	.8byte	.LBE1583-.LBB1583
+	.4byte	0x1373c
+	.8byte	.LBB1574
+	.8byte	.LBE1574-.LBB1574
+	.byte	0x1
+	.2byte	0x981
+	.4byte	0xeaea
+	.uleb128 0x55
+	.4byte	0x1374c
+	.uleb128 0x5d
+	.4byte	0x13844
+	.8byte	.LBB1575
+	.8byte	.LBE1575-.LBB1575
 	.byte	0xbe
 	.byte	0xd8
-	.uleb128 0x54
-	.4byte	0x137b8
+	.uleb128 0x55
+	.4byte	0x13855
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x136c3
-	.8byte	.LBB1585
-	.8byte	.LBE1585-.LBB1585
-	.byte	0x1
-	.2byte	0x999
-	.4byte	0xeaad
 	.uleb128 0x54
-	.4byte	0x136d4
-	.uleb128 0x5d
-	.4byte	0x137a7
-	.8byte	.LBB1586
-	.8byte	.LBE1586-.LBB1586
+	.4byte	0x1375f
+	.8byte	.LBB1577
+	.8byte	.LBE1577-.LBB1577
+	.byte	0x1
+	.2byte	0x99c
+	.4byte	0xeb2a
+	.uleb128 0x55
+	.4byte	0x13770
+	.uleb128 0x5e
+	.4byte	0x13844
+	.8byte	.LBB1578
+	.8byte	.LBE1578-.LBB1578
 	.byte	0xa3
 	.2byte	0x166
-	.uleb128 0x54
-	.4byte	0x137b8
+	.uleb128 0x55
+	.4byte	0x13855
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x1179b
-	.8byte	.LBB1588
-	.4byte	.Ldebug_ranges0+0xc30
-	.byte	0x1
-	.2byte	0x9ad
-	.4byte	0xf482
-	.uleb128 0x54
-	.4byte	0x117ac
-	.uleb128 0x5e
-	.4byte	.Ldebug_ranges0+0xc30
-	.uleb128 0x57
-	.4byte	0x117b8
-	.uleb128 0x5b
-	.4byte	0x136e7
-	.8byte	.LBB1590
-	.4byte	.Ldebug_ranges0+0xc80
+	.uleb128 0x5c
+	.4byte	0x11825
+	.8byte	.LBB1580
+	.4byte	.Ldebug_ranges0+0xc00
 	.byte	0x1
-	.2byte	0x69c
-	.4byte	0xeb3d
-	.uleb128 0x54
-	.4byte	0x1370f
-	.uleb128 0x54
-	.4byte	0x13703
-	.uleb128 0x54
-	.4byte	0x136f8
+	.2byte	0x9b0
+	.4byte	0xf4ff
+	.uleb128 0x55
+	.4byte	0x11836
 	.uleb128 0x5f
-	.4byte	0x1371c
-	.8byte	.LBB1591
-	.4byte	.Ldebug_ranges0+0xc80
+	.4byte	.Ldebug_ranges0+0xc00
+	.uleb128 0x58
+	.4byte	0x11842
+	.uleb128 0x5c
+	.4byte	0x13783
+	.8byte	.LBB1582
+	.4byte	.Ldebug_ranges0+0xc50
+	.byte	0x1
+	.2byte	0x69d
+	.4byte	0xebba
+	.uleb128 0x55
+	.4byte	0x137ab
+	.uleb128 0x55
+	.4byte	0x1379f
+	.uleb128 0x55
+	.4byte	0x13794
+	.uleb128 0x60
+	.4byte	0x137b8
+	.8byte	.LBB1583
+	.4byte	.Ldebug_ranges0+0xc50
 	.byte	0xe
 	.2byte	0x49c
-	.uleb128 0x54
-	.4byte	0x13750
-	.uleb128 0x54
-	.4byte	0x13744
-	.uleb128 0x54
-	.4byte	0x13738
-	.uleb128 0x54
-	.4byte	0x1372d
-	.uleb128 0x5e
-	.4byte	.Ldebug_ranges0+0xc80
-	.uleb128 0x57
-	.4byte	0x1375b
-	.uleb128 0x4e
+	.uleb128 0x55
+	.4byte	0x137ec
+	.uleb128 0x55
+	.4byte	0x137e0
+	.uleb128 0x55
+	.4byte	0x137d4
+	.uleb128 0x55
+	.4byte	0x137c9
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0xc50
+	.uleb128 0x58
+	.4byte	0x137f7
+	.uleb128 0x4f
 	.8byte	.LVL549
-	.4byte	0x1447e
+	.4byte	0x1450e
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x136e7
-	.8byte	.LBB1602
-	.8byte	.LBE1602-.LBB1602
-	.byte	0x1
-	.2byte	0x69f
-	.4byte	0xebba
-	.uleb128 0x54
-	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x13703
-	.uleb128 0x54
-	.4byte	0x136f8
-	.uleb128 0x5d
-	.4byte	0x1371c
-	.8byte	.LBB1603
-	.8byte	.LBE1603-.LBB1603
+	.4byte	0x13783
+	.8byte	.LBB1594
+	.8byte	.LBE1594-.LBB1594
+	.byte	0x1
+	.2byte	0x6a0
+	.4byte	0xec37
+	.uleb128 0x55
+	.4byte	0x137ab
+	.uleb128 0x55
+	.4byte	0x1379f
+	.uleb128 0x55
+	.4byte	0x13794
+	.uleb128 0x5e
+	.4byte	0x137b8
+	.8byte	.LBB1595
+	.8byte	.LBE1595-.LBB1595
 	.byte	0xe
 	.2byte	0x49c
-	.uleb128 0x54
-	.4byte	0x13750
-	.uleb128 0x54
-	.4byte	0x13744
-	.uleb128 0x54
-	.4byte	0x13738
-	.uleb128 0x54
-	.4byte	0x1372d
-	.uleb128 0x56
-	.8byte	.LBB1604
-	.8byte	.LBE1604-.LBB1604
+	.uleb128 0x55
+	.4byte	0x137ec
+	.uleb128 0x55
+	.4byte	0x137e0
+	.uleb128 0x55
+	.4byte	0x137d4
+	.uleb128 0x55
+	.4byte	0x137c9
 	.uleb128 0x57
-	.4byte	0x1375b
-	.uleb128 0x4e
+	.8byte	.LBB1596
+	.8byte	.LBE1596-.LBB1596
+	.uleb128 0x58
+	.4byte	0x137f7
+	.uleb128 0x4f
 	.8byte	.LVL550
-	.4byte	0x1447e
+	.4byte	0x1450e
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x136e7
-	.8byte	.LBB1605
-	.8byte	.LBE1605-.LBB1605
-	.byte	0x1
-	.2byte	0x6a2
-	.4byte	0xec37
-	.uleb128 0x54
-	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x13703
-	.uleb128 0x54
-	.4byte	0x136f8
-	.uleb128 0x5d
-	.4byte	0x1371c
-	.8byte	.LBB1606
-	.8byte	.LBE1606-.LBB1606
+	.4byte	0x13783
+	.8byte	.LBB1597
+	.8byte	.LBE1597-.LBB1597
+	.byte	0x1
+	.2byte	0x6a3
+	.4byte	0xecb4
+	.uleb128 0x55
+	.4byte	0x137ab
+	.uleb128 0x55
+	.4byte	0x1379f
+	.uleb128 0x55
+	.4byte	0x13794
+	.uleb128 0x5e
+	.4byte	0x137b8
+	.8byte	.LBB1598
+	.8byte	.LBE1598-.LBB1598
 	.byte	0xe
 	.2byte	0x49c
-	.uleb128 0x54
-	.4byte	0x13750
-	.uleb128 0x54
-	.4byte	0x13744
-	.uleb128 0x54
-	.4byte	0x13738
-	.uleb128 0x54
-	.4byte	0x1372d
-	.uleb128 0x56
-	.8byte	.LBB1607
-	.8byte	.LBE1607-.LBB1607
+	.uleb128 0x55
+	.4byte	0x137ec
+	.uleb128 0x55
+	.4byte	0x137e0
+	.uleb128 0x55
+	.4byte	0x137d4
+	.uleb128 0x55
+	.4byte	0x137c9
 	.uleb128 0x57
-	.4byte	0x1375b
-	.uleb128 0x4e
+	.8byte	.LBB1599
+	.8byte	.LBE1599-.LBB1599
+	.uleb128 0x58
+	.4byte	0x137f7
+	.uleb128 0x4f
 	.8byte	.LVL551
-	.4byte	0x1447e
+	.4byte	0x1450e
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x136e7
-	.8byte	.LBB1608
-	.8byte	.LBE1608-.LBB1608
-	.byte	0x1
-	.2byte	0x6a5
-	.4byte	0xecb4
-	.uleb128 0x54
-	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x13703
-	.uleb128 0x54
-	.4byte	0x136f8
-	.uleb128 0x5d
-	.4byte	0x1371c
-	.8byte	.LBB1609
-	.8byte	.LBE1609-.LBB1609
+	.4byte	0x13783
+	.8byte	.LBB1600
+	.8byte	.LBE1600-.LBB1600
+	.byte	0x1
+	.2byte	0x6a6
+	.4byte	0xed31
+	.uleb128 0x55
+	.4byte	0x137ab
+	.uleb128 0x55
+	.4byte	0x1379f
+	.uleb128 0x55
+	.4byte	0x13794
+	.uleb128 0x5e
+	.4byte	0x137b8
+	.8byte	.LBB1601
+	.8byte	.LBE1601-.LBB1601
 	.byte	0xe
 	.2byte	0x49c
-	.uleb128 0x54
-	.4byte	0x13750
-	.uleb128 0x54
-	.4byte	0x13744
-	.uleb128 0x54
-	.4byte	0x13738
-	.uleb128 0x54
-	.4byte	0x1372d
-	.uleb128 0x56
-	.8byte	.LBB1610
-	.8byte	.LBE1610-.LBB1610
+	.uleb128 0x55
+	.4byte	0x137ec
+	.uleb128 0x55
+	.4byte	0x137e0
+	.uleb128 0x55
+	.4byte	0x137d4
+	.uleb128 0x55
+	.4byte	0x137c9
 	.uleb128 0x57
-	.4byte	0x1375b
-	.uleb128 0x4e
+	.8byte	.LBB1602
+	.8byte	.LBE1602-.LBB1602
+	.uleb128 0x58
+	.4byte	0x137f7
+	.uleb128 0x4f
 	.8byte	.LVL552
-	.4byte	0x1447e
+	.4byte	0x1450e
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x136e7
-	.8byte	.LBB1611
-	.8byte	.LBE1611-.LBB1611
-	.byte	0x1
-	.2byte	0x6a8
-	.4byte	0xed31
 	.uleb128 0x54
-	.4byte	0x1370f
-	.uleb128 0x54
-	.4byte	0x13703
-	.uleb128 0x54
-	.4byte	0x136f8
-	.uleb128 0x5d
-	.4byte	0x1371c
-	.8byte	.LBB1612
-	.8byte	.LBE1612-.LBB1612
+	.4byte	0x13783
+	.8byte	.LBB1603
+	.8byte	.LBE1603-.LBB1603
+	.byte	0x1
+	.2byte	0x6a9
+	.4byte	0xedae
+	.uleb128 0x55
+	.4byte	0x137ab
+	.uleb128 0x55
+	.4byte	0x1379f
+	.uleb128 0x55
+	.4byte	0x13794
+	.uleb128 0x5e
+	.4byte	0x137b8
+	.8byte	.LBB1604
+	.8byte	.LBE1604-.LBB1604
 	.byte	0xe
 	.2byte	0x49c
-	.uleb128 0x54
-	.4byte	0x13750
-	.uleb128 0x54
-	.4byte	0x13744
-	.uleb128 0x54
-	.4byte	0x13738
-	.uleb128 0x54
-	.4byte	0x1372d
-	.uleb128 0x56
-	.8byte	.LBB1613
-	.8byte	.LBE1613-.LBB1613
+	.uleb128 0x55
+	.4byte	0x137ec
+	.uleb128 0x55
+	.4byte	0x137e0
+	.uleb128 0x55
+	.4byte	0x137d4
+	.uleb128 0x55
+	.4byte	0x137c9
 	.uleb128 0x57
-	.4byte	0x1375b
-	.uleb128 0x4e
+	.8byte	.LBB1605
+	.8byte	.LBE1605-.LBB1605
+	.uleb128 0x58
+	.4byte	0x137f7
+	.uleb128 0x4f
 	.8byte	.LVL553
-	.4byte	0x1447e
+	.4byte	0x1450e
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x136e7
-	.8byte	.LBB1614
-	.8byte	.LBE1614-.LBB1614
-	.byte	0x1
-	.2byte	0x6ab
-	.4byte	0xedae
-	.uleb128 0x54
-	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x13703
-	.uleb128 0x54
-	.4byte	0x136f8
-	.uleb128 0x5d
-	.4byte	0x1371c
-	.8byte	.LBB1615
-	.8byte	.LBE1615-.LBB1615
+	.4byte	0x13783
+	.8byte	.LBB1606
+	.8byte	.LBE1606-.LBB1606
+	.byte	0x1
+	.2byte	0x6ac
+	.4byte	0xee2b
+	.uleb128 0x55
+	.4byte	0x137ab
+	.uleb128 0x55
+	.4byte	0x1379f
+	.uleb128 0x55
+	.4byte	0x13794
+	.uleb128 0x5e
+	.4byte	0x137b8
+	.8byte	.LBB1607
+	.8byte	.LBE1607-.LBB1607
 	.byte	0xe
 	.2byte	0x49c
-	.uleb128 0x54
-	.4byte	0x13750
-	.uleb128 0x54
-	.4byte	0x13744
-	.uleb128 0x54
-	.4byte	0x13738
-	.uleb128 0x54
-	.4byte	0x1372d
-	.uleb128 0x56
-	.8byte	.LBB1616
-	.8byte	.LBE1616-.LBB1616
+	.uleb128 0x55
+	.4byte	0x137ec
+	.uleb128 0x55
+	.4byte	0x137e0
+	.uleb128 0x55
+	.4byte	0x137d4
+	.uleb128 0x55
+	.4byte	0x137c9
 	.uleb128 0x57
-	.4byte	0x1375b
-	.uleb128 0x4e
+	.8byte	.LBB1608
+	.8byte	.LBE1608-.LBB1608
+	.uleb128 0x58
+	.4byte	0x137f7
+	.uleb128 0x4f
 	.8byte	.LVL554
-	.4byte	0x1447e
+	.4byte	0x1450e
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x136e7
-	.8byte	.LBB1617
-	.8byte	.LBE1617-.LBB1617
-	.byte	0x1
-	.2byte	0x6ae
-	.4byte	0xee2b
-	.uleb128 0x54
-	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x13703
-	.uleb128 0x54
-	.4byte	0x136f8
-	.uleb128 0x5d
-	.4byte	0x1371c
-	.8byte	.LBB1618
-	.8byte	.LBE1618-.LBB1618
+	.4byte	0x13783
+	.8byte	.LBB1609
+	.8byte	.LBE1609-.LBB1609
+	.byte	0x1
+	.2byte	0x6af
+	.4byte	0xeea8
+	.uleb128 0x55
+	.4byte	0x137ab
+	.uleb128 0x55
+	.4byte	0x1379f
+	.uleb128 0x55
+	.4byte	0x13794
+	.uleb128 0x5e
+	.4byte	0x137b8
+	.8byte	.LBB1610
+	.8byte	.LBE1610-.LBB1610
 	.byte	0xe
 	.2byte	0x49c
-	.uleb128 0x54
-	.4byte	0x13750
-	.uleb128 0x54
-	.4byte	0x13744
-	.uleb128 0x54
-	.4byte	0x13738
-	.uleb128 0x54
-	.4byte	0x1372d
-	.uleb128 0x56
-	.8byte	.LBB1619
-	.8byte	.LBE1619-.LBB1619
+	.uleb128 0x55
+	.4byte	0x137ec
+	.uleb128 0x55
+	.4byte	0x137e0
+	.uleb128 0x55
+	.4byte	0x137d4
+	.uleb128 0x55
+	.4byte	0x137c9
 	.uleb128 0x57
-	.4byte	0x1375b
-	.uleb128 0x4e
+	.8byte	.LBB1611
+	.8byte	.LBE1611-.LBB1611
+	.uleb128 0x58
+	.4byte	0x137f7
+	.uleb128 0x4f
 	.8byte	.LVL555
-	.4byte	0x1447e
+	.4byte	0x1450e
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x136e7
-	.8byte	.LBB1620
-	.8byte	.LBE1620-.LBB1620
-	.byte	0x1
-	.2byte	0x6b1
-	.4byte	0xeea8
-	.uleb128 0x54
-	.4byte	0x1370f
-	.uleb128 0x54
-	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136f8
-	.uleb128 0x5d
-	.4byte	0x1371c
-	.8byte	.LBB1621
-	.8byte	.LBE1621-.LBB1621
+	.4byte	0x13783
+	.8byte	.LBB1612
+	.8byte	.LBE1612-.LBB1612
+	.byte	0x1
+	.2byte	0x6b2
+	.4byte	0xef25
+	.uleb128 0x55
+	.4byte	0x137ab
+	.uleb128 0x55
+	.4byte	0x1379f
+	.uleb128 0x55
+	.4byte	0x13794
+	.uleb128 0x5e
+	.4byte	0x137b8
+	.8byte	.LBB1613
+	.8byte	.LBE1613-.LBB1613
 	.byte	0xe
 	.2byte	0x49c
-	.uleb128 0x54
-	.4byte	0x13750
-	.uleb128 0x54
-	.4byte	0x13744
-	.uleb128 0x54
-	.4byte	0x13738
-	.uleb128 0x54
-	.4byte	0x1372d
-	.uleb128 0x56
-	.8byte	.LBB1622
-	.8byte	.LBE1622-.LBB1622
+	.uleb128 0x55
+	.4byte	0x137ec
+	.uleb128 0x55
+	.4byte	0x137e0
+	.uleb128 0x55
+	.4byte	0x137d4
+	.uleb128 0x55
+	.4byte	0x137c9
 	.uleb128 0x57
-	.4byte	0x1375b
-	.uleb128 0x4e
+	.8byte	.LBB1614
+	.8byte	.LBE1614-.LBB1614
+	.uleb128 0x58
+	.4byte	0x137f7
+	.uleb128 0x4f
 	.8byte	.LVL556
-	.4byte	0x1447e
+	.4byte	0x1450e
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x136e7
-	.8byte	.LBB1623
-	.8byte	.LBE1623-.LBB1623
-	.byte	0x1
-	.2byte	0x6b4
-	.4byte	0xef25
 	.uleb128 0x54
-	.4byte	0x1370f
-	.uleb128 0x54
-	.4byte	0x13703
-	.uleb128 0x54
-	.4byte	0x136f8
-	.uleb128 0x5d
-	.4byte	0x1371c
-	.8byte	.LBB1624
-	.8byte	.LBE1624-.LBB1624
+	.4byte	0x13783
+	.8byte	.LBB1615
+	.8byte	.LBE1615-.LBB1615
+	.byte	0x1
+	.2byte	0x6b5
+	.4byte	0xefa2
+	.uleb128 0x55
+	.4byte	0x137ab
+	.uleb128 0x55
+	.4byte	0x1379f
+	.uleb128 0x55
+	.4byte	0x13794
+	.uleb128 0x5e
+	.4byte	0x137b8
+	.8byte	.LBB1616
+	.8byte	.LBE1616-.LBB1616
 	.byte	0xe
 	.2byte	0x49c
-	.uleb128 0x54
-	.4byte	0x13750
-	.uleb128 0x54
-	.4byte	0x13744
-	.uleb128 0x54
-	.4byte	0x13738
-	.uleb128 0x54
-	.4byte	0x1372d
-	.uleb128 0x56
-	.8byte	.LBB1625
-	.8byte	.LBE1625-.LBB1625
+	.uleb128 0x55
+	.4byte	0x137ec
+	.uleb128 0x55
+	.4byte	0x137e0
+	.uleb128 0x55
+	.4byte	0x137d4
+	.uleb128 0x55
+	.4byte	0x137c9
 	.uleb128 0x57
-	.4byte	0x1375b
-	.uleb128 0x4e
+	.8byte	.LBB1617
+	.8byte	.LBE1617-.LBB1617
+	.uleb128 0x58
+	.4byte	0x137f7
+	.uleb128 0x4f
 	.8byte	.LVL557
-	.4byte	0x1447e
+	.4byte	0x1450e
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x136e7
-	.8byte	.LBB1626
-	.8byte	.LBE1626-.LBB1626
-	.byte	0x1
-	.2byte	0x6b7
-	.4byte	0xefa2
-	.uleb128 0x54
-	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x13703
-	.uleb128 0x54
-	.4byte	0x136f8
-	.uleb128 0x5d
-	.4byte	0x1371c
-	.8byte	.LBB1627
-	.8byte	.LBE1627-.LBB1627
+	.4byte	0x13783
+	.8byte	.LBB1618
+	.8byte	.LBE1618-.LBB1618
+	.byte	0x1
+	.2byte	0x6b8
+	.4byte	0xf01f
+	.uleb128 0x55
+	.4byte	0x137ab
+	.uleb128 0x55
+	.4byte	0x1379f
+	.uleb128 0x55
+	.4byte	0x13794
+	.uleb128 0x5e
+	.4byte	0x137b8
+	.8byte	.LBB1619
+	.8byte	.LBE1619-.LBB1619
 	.byte	0xe
 	.2byte	0x49c
-	.uleb128 0x54
-	.4byte	0x13750
-	.uleb128 0x54
-	.4byte	0x13744
-	.uleb128 0x54
-	.4byte	0x13738
-	.uleb128 0x54
-	.4byte	0x1372d
-	.uleb128 0x56
-	.8byte	.LBB1628
-	.8byte	.LBE1628-.LBB1628
+	.uleb128 0x55
+	.4byte	0x137ec
+	.uleb128 0x55
+	.4byte	0x137e0
+	.uleb128 0x55
+	.4byte	0x137d4
+	.uleb128 0x55
+	.4byte	0x137c9
 	.uleb128 0x57
-	.4byte	0x1375b
-	.uleb128 0x4e
+	.8byte	.LBB1620
+	.8byte	.LBE1620-.LBB1620
+	.uleb128 0x58
+	.4byte	0x137f7
+	.uleb128 0x4f
 	.8byte	.LVL558
-	.4byte	0x1447e
+	.4byte	0x1450e
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x136e7
-	.8byte	.LBB1629
-	.8byte	.LBE1629-.LBB1629
-	.byte	0x1
-	.2byte	0x6ba
-	.4byte	0xf01f
 	.uleb128 0x54
-	.4byte	0x1370f
-	.uleb128 0x54
-	.4byte	0x13703
-	.uleb128 0x54
-	.4byte	0x136f8
-	.uleb128 0x5d
-	.4byte	0x1371c
-	.8byte	.LBB1630
-	.8byte	.LBE1630-.LBB1630
+	.4byte	0x13783
+	.8byte	.LBB1621
+	.8byte	.LBE1621-.LBB1621
+	.byte	0x1
+	.2byte	0x6bb
+	.4byte	0xf09c
+	.uleb128 0x55
+	.4byte	0x137ab
+	.uleb128 0x55
+	.4byte	0x1379f
+	.uleb128 0x55
+	.4byte	0x13794
+	.uleb128 0x5e
+	.4byte	0x137b8
+	.8byte	.LBB1622
+	.8byte	.LBE1622-.LBB1622
 	.byte	0xe
 	.2byte	0x49c
-	.uleb128 0x54
-	.4byte	0x13750
-	.uleb128 0x54
-	.4byte	0x13744
-	.uleb128 0x54
-	.4byte	0x13738
-	.uleb128 0x54
-	.4byte	0x1372d
-	.uleb128 0x56
-	.8byte	.LBB1631
-	.8byte	.LBE1631-.LBB1631
+	.uleb128 0x55
+	.4byte	0x137ec
+	.uleb128 0x55
+	.4byte	0x137e0
+	.uleb128 0x55
+	.4byte	0x137d4
+	.uleb128 0x55
+	.4byte	0x137c9
 	.uleb128 0x57
-	.4byte	0x1375b
-	.uleb128 0x4e
+	.8byte	.LBB1623
+	.8byte	.LBE1623-.LBB1623
+	.uleb128 0x58
+	.4byte	0x137f7
+	.uleb128 0x4f
 	.8byte	.LVL559
-	.4byte	0x1447e
+	.4byte	0x1450e
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x136e7
-	.8byte	.LBB1632
-	.8byte	.LBE1632-.LBB1632
-	.byte	0x1
-	.2byte	0x6bd
-	.4byte	0xf09c
-	.uleb128 0x54
-	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x13703
-	.uleb128 0x54
-	.4byte	0x136f8
-	.uleb128 0x5d
-	.4byte	0x1371c
-	.8byte	.LBB1633
-	.8byte	.LBE1633-.LBB1633
+	.4byte	0x13783
+	.8byte	.LBB1624
+	.8byte	.LBE1624-.LBB1624
+	.byte	0x1
+	.2byte	0x6be
+	.4byte	0xf119
+	.uleb128 0x55
+	.4byte	0x137ab
+	.uleb128 0x55
+	.4byte	0x1379f
+	.uleb128 0x55
+	.4byte	0x13794
+	.uleb128 0x5e
+	.4byte	0x137b8
+	.8byte	.LBB1625
+	.8byte	.LBE1625-.LBB1625
 	.byte	0xe
 	.2byte	0x49c
-	.uleb128 0x54
-	.4byte	0x13750
-	.uleb128 0x54
-	.4byte	0x13744
-	.uleb128 0x54
-	.4byte	0x13738
-	.uleb128 0x54
-	.4byte	0x1372d
-	.uleb128 0x56
-	.8byte	.LBB1634
-	.8byte	.LBE1634-.LBB1634
+	.uleb128 0x55
+	.4byte	0x137ec
+	.uleb128 0x55
+	.4byte	0x137e0
+	.uleb128 0x55
+	.4byte	0x137d4
+	.uleb128 0x55
+	.4byte	0x137c9
 	.uleb128 0x57
-	.4byte	0x1375b
-	.uleb128 0x4e
+	.8byte	.LBB1626
+	.8byte	.LBE1626-.LBB1626
+	.uleb128 0x58
+	.4byte	0x137f7
+	.uleb128 0x4f
 	.8byte	.LVL560
-	.4byte	0x1447e
+	.4byte	0x1450e
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x136e7
-	.8byte	.LBB1635
-	.8byte	.LBE1635-.LBB1635
-	.byte	0x1
-	.2byte	0x6c0
-	.4byte	0xf119
 	.uleb128 0x54
-	.4byte	0x1370f
-	.uleb128 0x54
-	.4byte	0x13703
-	.uleb128 0x54
-	.4byte	0x136f8
-	.uleb128 0x5d
-	.4byte	0x1371c
-	.8byte	.LBB1636
-	.8byte	.LBE1636-.LBB1636
+	.4byte	0x13783
+	.8byte	.LBB1627
+	.8byte	.LBE1627-.LBB1627
+	.byte	0x1
+	.2byte	0x6c1
+	.4byte	0xf196
+	.uleb128 0x55
+	.4byte	0x137ab
+	.uleb128 0x55
+	.4byte	0x1379f
+	.uleb128 0x55
+	.4byte	0x13794
+	.uleb128 0x5e
+	.4byte	0x137b8
+	.8byte	.LBB1628
+	.8byte	.LBE1628-.LBB1628
 	.byte	0xe
 	.2byte	0x49c
-	.uleb128 0x54
-	.4byte	0x13750
-	.uleb128 0x54
-	.4byte	0x13744
-	.uleb128 0x54
-	.4byte	0x13738
-	.uleb128 0x54
-	.4byte	0x1372d
-	.uleb128 0x56
-	.8byte	.LBB1637
-	.8byte	.LBE1637-.LBB1637
+	.uleb128 0x55
+	.4byte	0x137ec
+	.uleb128 0x55
+	.4byte	0x137e0
+	.uleb128 0x55
+	.4byte	0x137d4
+	.uleb128 0x55
+	.4byte	0x137c9
 	.uleb128 0x57
-	.4byte	0x1375b
-	.uleb128 0x4e
+	.8byte	.LBB1629
+	.8byte	.LBE1629-.LBB1629
+	.uleb128 0x58
+	.4byte	0x137f7
+	.uleb128 0x4f
 	.8byte	.LVL561
-	.4byte	0x1447e
+	.4byte	0x1450e
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x136e7
-	.8byte	.LBB1638
-	.8byte	.LBE1638-.LBB1638
-	.byte	0x1
-	.2byte	0x6c3
-	.4byte	0xf196
-	.uleb128 0x54
-	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x13703
-	.uleb128 0x54
-	.4byte	0x136f8
-	.uleb128 0x5d
-	.4byte	0x1371c
-	.8byte	.LBB1639
-	.8byte	.LBE1639-.LBB1639
+	.4byte	0x13783
+	.8byte	.LBB1630
+	.8byte	.LBE1630-.LBB1630
+	.byte	0x1
+	.2byte	0x6c4
+	.4byte	0xf213
+	.uleb128 0x55
+	.4byte	0x137ab
+	.uleb128 0x55
+	.4byte	0x1379f
+	.uleb128 0x55
+	.4byte	0x13794
+	.uleb128 0x5e
+	.4byte	0x137b8
+	.8byte	.LBB1631
+	.8byte	.LBE1631-.LBB1631
 	.byte	0xe
 	.2byte	0x49c
-	.uleb128 0x54
-	.4byte	0x13750
-	.uleb128 0x54
-	.4byte	0x13744
-	.uleb128 0x54
-	.4byte	0x13738
-	.uleb128 0x54
-	.4byte	0x1372d
-	.uleb128 0x56
-	.8byte	.LBB1640
-	.8byte	.LBE1640-.LBB1640
+	.uleb128 0x55
+	.4byte	0x137ec
+	.uleb128 0x55
+	.4byte	0x137e0
+	.uleb128 0x55
+	.4byte	0x137d4
+	.uleb128 0x55
+	.4byte	0x137c9
 	.uleb128 0x57
-	.4byte	0x1375b
-	.uleb128 0x4e
+	.8byte	.LBB1632
+	.8byte	.LBE1632-.LBB1632
+	.uleb128 0x58
+	.4byte	0x137f7
+	.uleb128 0x4f
 	.8byte	.LVL562
-	.4byte	0x1447e
+	.4byte	0x1450e
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x136e7
-	.8byte	.LBB1641
-	.8byte	.LBE1641-.LBB1641
-	.byte	0x1
-	.2byte	0x6c6
-	.4byte	0xf213
 	.uleb128 0x54
-	.4byte	0x1370f
-	.uleb128 0x54
-	.4byte	0x13703
-	.uleb128 0x54
-	.4byte	0x136f8
-	.uleb128 0x5d
-	.4byte	0x1371c
-	.8byte	.LBB1642
-	.8byte	.LBE1642-.LBB1642
+	.4byte	0x13783
+	.8byte	.LBB1633
+	.8byte	.LBE1633-.LBB1633
+	.byte	0x1
+	.2byte	0x6c7
+	.4byte	0xf290
+	.uleb128 0x55
+	.4byte	0x137ab
+	.uleb128 0x55
+	.4byte	0x1379f
+	.uleb128 0x55
+	.4byte	0x13794
+	.uleb128 0x5e
+	.4byte	0x137b8
+	.8byte	.LBB1634
+	.8byte	.LBE1634-.LBB1634
 	.byte	0xe
 	.2byte	0x49c
-	.uleb128 0x54
-	.4byte	0x13750
-	.uleb128 0x54
-	.4byte	0x13744
-	.uleb128 0x54
-	.4byte	0x13738
-	.uleb128 0x54
-	.4byte	0x1372d
-	.uleb128 0x56
-	.8byte	.LBB1643
-	.8byte	.LBE1643-.LBB1643
+	.uleb128 0x55
+	.4byte	0x137ec
+	.uleb128 0x55
+	.4byte	0x137e0
+	.uleb128 0x55
+	.4byte	0x137d4
+	.uleb128 0x55
+	.4byte	0x137c9
 	.uleb128 0x57
-	.4byte	0x1375b
-	.uleb128 0x4e
+	.8byte	.LBB1635
+	.8byte	.LBE1635-.LBB1635
+	.uleb128 0x58
+	.4byte	0x137f7
+	.uleb128 0x4f
 	.8byte	.LVL563
-	.4byte	0x1447e
+	.4byte	0x1450e
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x136e7
-	.8byte	.LBB1644
-	.8byte	.LBE1644-.LBB1644
-	.byte	0x1
-	.2byte	0x6c9
-	.4byte	0xf290
-	.uleb128 0x54
-	.4byte	0x1370f
-	.uleb128 0x54
-	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136f8
-	.uleb128 0x5d
-	.4byte	0x1371c
-	.8byte	.LBB1645
-	.8byte	.LBE1645-.LBB1645
+	.4byte	0x13783
+	.8byte	.LBB1636
+	.8byte	.LBE1636-.LBB1636
+	.byte	0x1
+	.2byte	0x6ca
+	.4byte	0xf30d
+	.uleb128 0x55
+	.4byte	0x137ab
+	.uleb128 0x55
+	.4byte	0x1379f
+	.uleb128 0x55
+	.4byte	0x13794
+	.uleb128 0x5e
+	.4byte	0x137b8
+	.8byte	.LBB1637
+	.8byte	.LBE1637-.LBB1637
 	.byte	0xe
 	.2byte	0x49c
-	.uleb128 0x54
-	.4byte	0x13750
-	.uleb128 0x54
-	.4byte	0x13744
-	.uleb128 0x54
-	.4byte	0x13738
-	.uleb128 0x54
-	.4byte	0x1372d
-	.uleb128 0x56
-	.8byte	.LBB1646
-	.8byte	.LBE1646-.LBB1646
+	.uleb128 0x55
+	.4byte	0x137ec
+	.uleb128 0x55
+	.4byte	0x137e0
+	.uleb128 0x55
+	.4byte	0x137d4
+	.uleb128 0x55
+	.4byte	0x137c9
 	.uleb128 0x57
-	.4byte	0x1375b
-	.uleb128 0x4e
+	.8byte	.LBB1638
+	.8byte	.LBE1638-.LBB1638
+	.uleb128 0x58
+	.4byte	0x137f7
+	.uleb128 0x4f
 	.8byte	.LVL564
-	.4byte	0x1447e
+	.4byte	0x1450e
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x136e7
-	.8byte	.LBB1647
-	.8byte	.LBE1647-.LBB1647
-	.byte	0x1
-	.2byte	0x6cc
-	.4byte	0xf30d
-	.uleb128 0x54
-	.4byte	0x1370f
-	.uleb128 0x54
-	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136f8
-	.uleb128 0x5d
-	.4byte	0x1371c
-	.8byte	.LBB1648
-	.8byte	.LBE1648-.LBB1648
+	.4byte	0x13783
+	.8byte	.LBB1639
+	.8byte	.LBE1639-.LBB1639
+	.byte	0x1
+	.2byte	0x6cd
+	.4byte	0xf38a
+	.uleb128 0x55
+	.4byte	0x137ab
+	.uleb128 0x55
+	.4byte	0x1379f
+	.uleb128 0x55
+	.4byte	0x13794
+	.uleb128 0x5e
+	.4byte	0x137b8
+	.8byte	.LBB1640
+	.8byte	.LBE1640-.LBB1640
 	.byte	0xe
 	.2byte	0x49c
-	.uleb128 0x54
-	.4byte	0x13750
-	.uleb128 0x54
-	.4byte	0x13744
-	.uleb128 0x54
-	.4byte	0x13738
-	.uleb128 0x54
-	.4byte	0x1372d
-	.uleb128 0x56
-	.8byte	.LBB1649
-	.8byte	.LBE1649-.LBB1649
+	.uleb128 0x55
+	.4byte	0x137ec
+	.uleb128 0x55
+	.4byte	0x137e0
+	.uleb128 0x55
+	.4byte	0x137d4
+	.uleb128 0x55
+	.4byte	0x137c9
 	.uleb128 0x57
-	.4byte	0x1375b
-	.uleb128 0x4e
+	.8byte	.LBB1641
+	.8byte	.LBE1641-.LBB1641
+	.uleb128 0x58
+	.4byte	0x137f7
+	.uleb128 0x4f
 	.8byte	.LVL565
-	.4byte	0x1447e
+	.4byte	0x1450e
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x136e7
-	.8byte	.LBB1650
-	.8byte	.LBE1650-.LBB1650
-	.byte	0x1
-	.2byte	0x6cf
-	.4byte	0xf38a
-	.uleb128 0x54
-	.4byte	0x1370f
-	.uleb128 0x54
-	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136f8
-	.uleb128 0x5d
-	.4byte	0x1371c
-	.8byte	.LBB1651
-	.8byte	.LBE1651-.LBB1651
+	.4byte	0x13783
+	.8byte	.LBB1642
+	.8byte	.LBE1642-.LBB1642
+	.byte	0x1
+	.2byte	0x6d0
+	.4byte	0xf407
+	.uleb128 0x55
+	.4byte	0x137ab
+	.uleb128 0x55
+	.4byte	0x1379f
+	.uleb128 0x55
+	.4byte	0x13794
+	.uleb128 0x5e
+	.4byte	0x137b8
+	.8byte	.LBB1643
+	.8byte	.LBE1643-.LBB1643
 	.byte	0xe
 	.2byte	0x49c
-	.uleb128 0x54
-	.4byte	0x13750
-	.uleb128 0x54
-	.4byte	0x13744
-	.uleb128 0x54
-	.4byte	0x13738
-	.uleb128 0x54
-	.4byte	0x1372d
-	.uleb128 0x56
-	.8byte	.LBB1652
-	.8byte	.LBE1652-.LBB1652
+	.uleb128 0x55
+	.4byte	0x137ec
+	.uleb128 0x55
+	.4byte	0x137e0
+	.uleb128 0x55
+	.4byte	0x137d4
+	.uleb128 0x55
+	.4byte	0x137c9
 	.uleb128 0x57
-	.4byte	0x1375b
-	.uleb128 0x4e
+	.8byte	.LBB1644
+	.8byte	.LBE1644-.LBB1644
+	.uleb128 0x58
+	.4byte	0x137f7
+	.uleb128 0x4f
 	.8byte	.LVL566
-	.4byte	0x1447e
+	.4byte	0x1450e
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x136e7
-	.8byte	.LBB1653
-	.8byte	.LBE1653-.LBB1653
-	.byte	0x1
-	.2byte	0x6d2
-	.4byte	0xf407
-	.uleb128 0x54
-	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x13703
-	.uleb128 0x54
-	.4byte	0x136f8
-	.uleb128 0x5d
-	.4byte	0x1371c
-	.8byte	.LBB1654
-	.8byte	.LBE1654-.LBB1654
+	.4byte	0x13783
+	.8byte	.LBB1645
+	.8byte	.LBE1645-.LBB1645
+	.byte	0x1
+	.2byte	0x6d3
+	.4byte	0xf484
+	.uleb128 0x55
+	.4byte	0x137ab
+	.uleb128 0x55
+	.4byte	0x1379f
+	.uleb128 0x55
+	.4byte	0x13794
+	.uleb128 0x5e
+	.4byte	0x137b8
+	.8byte	.LBB1646
+	.8byte	.LBE1646-.LBB1646
 	.byte	0xe
 	.2byte	0x49c
-	.uleb128 0x54
-	.4byte	0x13750
-	.uleb128 0x54
-	.4byte	0x13744
-	.uleb128 0x54
-	.4byte	0x13738
-	.uleb128 0x54
-	.4byte	0x1372d
-	.uleb128 0x56
-	.8byte	.LBB1655
-	.8byte	.LBE1655-.LBB1655
+	.uleb128 0x55
+	.4byte	0x137ec
+	.uleb128 0x55
+	.4byte	0x137e0
+	.uleb128 0x55
+	.4byte	0x137d4
+	.uleb128 0x55
+	.4byte	0x137c9
 	.uleb128 0x57
-	.4byte	0x1375b
-	.uleb128 0x4e
+	.8byte	.LBB1647
+	.8byte	.LBE1647-.LBB1647
+	.uleb128 0x58
+	.4byte	0x137f7
+	.uleb128 0x4f
 	.8byte	.LVL567
-	.4byte	0x1447e
+	.4byte	0x1450e
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5d
-	.4byte	0x136e7
-	.8byte	.LBB1656
-	.8byte	.LBE1656-.LBB1656
+	.uleb128 0x5e
+	.4byte	0x13783
+	.8byte	.LBB1648
+	.8byte	.LBE1648-.LBB1648
 	.byte	0x1
-	.2byte	0x6d5
-	.uleb128 0x54
-	.4byte	0x1370f
-	.uleb128 0x54
-	.4byte	0x13703
-	.uleb128 0x54
-	.4byte	0x136f8
-	.uleb128 0x5d
-	.4byte	0x1371c
-	.8byte	.LBB1657
-	.8byte	.LBE1657-.LBB1657
+	.2byte	0x6d6
+	.uleb128 0x55
+	.4byte	0x137ab
+	.uleb128 0x55
+	.4byte	0x1379f
+	.uleb128 0x55
+	.4byte	0x13794
+	.uleb128 0x5e
+	.4byte	0x137b8
+	.8byte	.LBB1649
+	.8byte	.LBE1649-.LBB1649
 	.byte	0xe
 	.2byte	0x49c
-	.uleb128 0x54
-	.4byte	0x13750
-	.uleb128 0x54
-	.4byte	0x13744
-	.uleb128 0x54
-	.4byte	0x13738
-	.uleb128 0x54
-	.4byte	0x1372d
-	.uleb128 0x56
-	.8byte	.LBB1658
-	.8byte	.LBE1658-.LBB1658
+	.uleb128 0x55
+	.4byte	0x137ec
+	.uleb128 0x55
+	.4byte	0x137e0
+	.uleb128 0x55
+	.4byte	0x137d4
+	.uleb128 0x55
+	.4byte	0x137c9
 	.uleb128 0x57
-	.4byte	0x1375b
-	.uleb128 0x4e
+	.8byte	.LBB1650
+	.8byte	.LBE1650-.LBB1650
+	.uleb128 0x58
+	.4byte	0x137f7
+	.uleb128 0x4f
 	.8byte	.LVL568
-	.4byte	0x1447e
+	.4byte	0x1450e
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0xfe84
-	.8byte	.LBB1665
-	.4byte	.Ldebug_ranges0+0xcd0
+	.uleb128 0x5c
+	.4byte	0xff0e
+	.8byte	.LBB1657
+	.4byte	.Ldebug_ranges0+0xca0
 	.byte	0x1
-	.2byte	0x9b9
-	.4byte	0xf62f
-	.uleb128 0x54
-	.4byte	0xfe95
-	.uleb128 0x5e
-	.4byte	.Ldebug_ranges0+0xcd0
-	.uleb128 0x60
-	.4byte	0xfea1
-	.4byte	.LLST156
-	.uleb128 0x57
-	.4byte	0xfead
-	.uleb128 0x57
-	.4byte	0xfeb9
-	.uleb128 0x57
-	.4byte	0xfec5
+	.2byte	0x9bc
+	.4byte	0xf6ac
+	.uleb128 0x55
+	.4byte	0xff1f
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0xca0
 	.uleb128 0x61
-	.4byte	0xfed1
+	.4byte	0xff2b
+	.4byte	.LLST156
+	.uleb128 0x58
+	.4byte	0xff37
+	.uleb128 0x58
+	.4byte	0xff43
+	.uleb128 0x58
+	.4byte	0xff4f
+	.uleb128 0x62
+	.4byte	0xff5b
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
-	.uleb128 0x57
-	.4byte	0xfedb
-	.uleb128 0x57
-	.4byte	0xfee7
-	.uleb128 0x57
-	.4byte	0xfef3
-	.uleb128 0x5b
-	.4byte	0x137fb
-	.8byte	.LBB1667
-	.4byte	.Ldebug_ranges0+0xd40
+	.uleb128 0x58
+	.4byte	0xff65
+	.uleb128 0x58
+	.4byte	0xff71
+	.uleb128 0x58
+	.4byte	0xff7d
+	.uleb128 0x5c
+	.4byte	0x13898
+	.8byte	.LBB1659
+	.4byte	.Ldebug_ranges0+0xd10
 	.byte	0x1
-	.2byte	0x8a3
-	.4byte	0xf4f2
-	.uleb128 0x54
-	.4byte	0x1380b
+	.2byte	0x8a4
+	.4byte	0xf56f
+	.uleb128 0x55
+	.4byte	0x138a8
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x137c5
-	.8byte	.LBB1671
-	.4byte	.Ldebug_ranges0+0xd70
+	.uleb128 0x5c
+	.4byte	0x13862
+	.8byte	.LBB1663
+	.4byte	.Ldebug_ranges0+0xd40
 	.byte	0x1
-	.2byte	0x8be
-	.4byte	0xf527
-	.uleb128 0x54
-	.4byte	0x137ee
-	.uleb128 0x54
-	.4byte	0x137e2
-	.uleb128 0x54
-	.4byte	0x137d6
-	.uleb128 0x4e
+	.2byte	0x8bf
+	.4byte	0xf5a4
+	.uleb128 0x55
+	.4byte	0x1388b
+	.uleb128 0x55
+	.4byte	0x1387f
+	.uleb128 0x55
+	.4byte	0x13873
+	.uleb128 0x4f
 	.8byte	.LVL574
-	.4byte	0x14471
+	.4byte	0x14501
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x137c5
-	.8byte	.LBB1679
-	.8byte	.LBE1679-.LBB1679
-	.byte	0x1
-	.2byte	0x8c1
-	.4byte	0xf560
-	.uleb128 0x54
-	.4byte	0x137ee
 	.uleb128 0x54
-	.4byte	0x137e2
-	.uleb128 0x54
-	.4byte	0x137d6
-	.uleb128 0x4e
+	.4byte	0x13862
+	.8byte	.LBB1671
+	.8byte	.LBE1671-.LBB1671
+	.byte	0x1
+	.2byte	0x8c2
+	.4byte	0xf5dd
+	.uleb128 0x55
+	.4byte	0x1388b
+	.uleb128 0x55
+	.4byte	0x1387f
+	.uleb128 0x55
+	.4byte	0x13873
+	.uleb128 0x4f
 	.8byte	.LVL575
-	.4byte	0x14471
+	.4byte	0x14501
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x137c5
-	.8byte	.LBB1681
-	.8byte	.LBE1681-.LBB1681
-	.byte	0x1
-	.2byte	0x8c4
-	.4byte	0xf599
-	.uleb128 0x54
-	.4byte	0x137ee
 	.uleb128 0x54
-	.4byte	0x137e2
-	.uleb128 0x54
-	.4byte	0x137d6
-	.uleb128 0x4e
+	.4byte	0x13862
+	.8byte	.LBB1673
+	.8byte	.LBE1673-.LBB1673
+	.byte	0x1
+	.2byte	0x8c5
+	.4byte	0xf616
+	.uleb128 0x55
+	.4byte	0x1388b
+	.uleb128 0x55
+	.4byte	0x1387f
+	.uleb128 0x55
+	.4byte	0x13873
+	.uleb128 0x4f
 	.8byte	.LVL576
-	.4byte	0x14471
+	.4byte	0x14501
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x137c5
-	.8byte	.LBB1683
-	.8byte	.LBE1683-.LBB1683
-	.byte	0x1
-	.2byte	0x8cc
-	.4byte	0xf5d2
-	.uleb128 0x54
-	.4byte	0x137ee
 	.uleb128 0x54
-	.4byte	0x137e2
-	.uleb128 0x54
-	.4byte	0x137d6
-	.uleb128 0x4e
+	.4byte	0x13862
+	.8byte	.LBB1675
+	.8byte	.LBE1675-.LBB1675
+	.byte	0x1
+	.2byte	0x8cd
+	.4byte	0xf64f
+	.uleb128 0x55
+	.4byte	0x1388b
+	.uleb128 0x55
+	.4byte	0x1387f
+	.uleb128 0x55
+	.4byte	0x13873
+	.uleb128 0x4f
 	.8byte	.LVL577
-	.4byte	0x14471
+	.4byte	0x14501
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL570
-	.4byte	0x1448b
-	.uleb128 0x4e
+	.4byte	0x1451b
+	.uleb128 0x4f
 	.8byte	.LVL571
-	.4byte	0x14498
-	.uleb128 0x4e
+	.4byte	0x14528
+	.uleb128 0x4f
 	.8byte	.LVL572
-	.4byte	0x144a4
-	.uleb128 0x4e
+	.4byte	0x14534
+	.uleb128 0x4f
 	.8byte	.LVL573
-	.4byte	0x144b0
-	.uleb128 0x4e
+	.4byte	0x14540
+	.uleb128 0x4f
 	.8byte	.LVL578
-	.4byte	0x144bc
-	.uleb128 0x4e
+	.4byte	0x1454c
+	.uleb128 0x4f
 	.8byte	.LVL579
-	.4byte	0x144c6
-	.uleb128 0x4e
+	.4byte	0x14556
+	.uleb128 0x4f
 	.8byte	.LVL592
-	.4byte	0x144d2
+	.4byte	0x14562
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0xfefe
-	.8byte	.LBB1692
-	.4byte	.Ldebug_ranges0+0xdc0
+	.uleb128 0x5c
+	.4byte	0xff88
+	.8byte	.LBB1684
+	.4byte	.Ldebug_ranges0+0xd90
 	.byte	0x1
-	.2byte	0x9c0
-	.4byte	0xf708
-	.uleb128 0x54
-	.4byte	0xff0f
-	.uleb128 0x5e
-	.4byte	.Ldebug_ranges0+0xdc0
-	.uleb128 0x57
-	.4byte	0xff1b
-	.uleb128 0x60
-	.4byte	0xff27
-	.4byte	.LLST157
-	.uleb128 0x57
-	.4byte	0xff33
+	.2byte	0x9c3
+	.4byte	0xf785
+	.uleb128 0x55
+	.4byte	0xff99
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0xd90
+	.uleb128 0x58
+	.4byte	0xffa5
 	.uleb128 0x61
-	.4byte	0xff3f
+	.4byte	0xffb1
+	.4byte	.LLST157
+	.uleb128 0x58
+	.4byte	0xffbd
+	.uleb128 0x62
+	.4byte	0xffc9
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
-	.uleb128 0x60
-	.4byte	0xff49
+	.uleb128 0x61
+	.4byte	0xffd3
 	.4byte	.LLST158
-	.uleb128 0x57
-	.4byte	0xff55
-	.uleb128 0x57
-	.4byte	0xff61
-	.uleb128 0x5b
-	.4byte	0x137fb
-	.8byte	.LBB1694
-	.4byte	.Ldebug_ranges0+0xe20
+	.uleb128 0x58
+	.4byte	0xffdf
+	.uleb128 0x58
+	.4byte	0xffeb
+	.uleb128 0x5c
+	.4byte	0x13898
+	.8byte	.LBB1686
+	.4byte	.Ldebug_ranges0+0xdf0
 	.byte	0x1
-	.2byte	0x873
-	.4byte	0xf69e
-	.uleb128 0x54
-	.4byte	0x1380b
+	.2byte	0x874
+	.4byte	0xf71b
+	.uleb128 0x55
+	.4byte	0x138a8
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL581
-	.4byte	0x1448b
-	.uleb128 0x4e
+	.4byte	0x1451b
+	.uleb128 0x4f
 	.8byte	.LVL582
-	.4byte	0x14498
-	.uleb128 0x4e
+	.4byte	0x14528
+	.uleb128 0x4f
 	.8byte	.LVL596
-	.4byte	0x144a4
-	.uleb128 0x4e
+	.4byte	0x14534
+	.uleb128 0x4f
 	.8byte	.LVL597
-	.4byte	0x144df
-	.uleb128 0x4e
-	.8byte	.LVL683
-	.4byte	0x144d2
-	.uleb128 0x4e
+	.4byte	0x1456f
+	.uleb128 0x4f
 	.8byte	.LVL684
-	.4byte	0x144eb
-	.uleb128 0x4e
+	.4byte	0x14562
+	.uleb128 0x4f
 	.8byte	.LVL685
-	.4byte	0x144d2
-	.uleb128 0x4e
-	.8byte	.LVL699
-	.4byte	0x144d2
+	.4byte	0x1457b
+	.uleb128 0x4f
+	.8byte	.LVL686
+	.4byte	0x14562
+	.uleb128 0x4f
+	.8byte	.LVL700
+	.4byte	0x14562
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0xfe4c
-	.8byte	.LBB1704
-	.4byte	.Ldebug_ranges0+0xe50
+	.uleb128 0x5c
+	.4byte	0xfed6
+	.8byte	.LBB1696
+	.4byte	.Ldebug_ranges0+0xe20
 	.byte	0x1
-	.2byte	0x9c7
-	.4byte	0xf895
-	.uleb128 0x54
-	.4byte	0xfe5d
-	.uleb128 0x5e
-	.4byte	.Ldebug_ranges0+0xe50
-	.uleb128 0x61
-	.4byte	0xfe69
+	.2byte	0x9ca
+	.4byte	0xf91f
+	.uleb128 0x55
+	.4byte	0xfee7
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0xe20
+	.uleb128 0x62
+	.4byte	0xfef3
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
-	.uleb128 0x5b
-	.4byte	0x139d4
-	.8byte	.LBB1706
-	.4byte	.Ldebug_ranges0+0xe90
+	.uleb128 0x5c
+	.4byte	0x13a5d
+	.8byte	.LBB1698
+	.4byte	.Ldebug_ranges0+0xe60
 	.byte	0x1
-	.2byte	0x8d9
-	.4byte	0xf78f
-	.uleb128 0x54
-	.4byte	0x139e1
-	.uleb128 0x56
-	.8byte	.LBB1708
-	.8byte	.LBE1708-.LBB1708
+	.2byte	0x8da
+	.4byte	0xf80c
+	.uleb128 0x55
+	.4byte	0x13a6a
 	.uleb128 0x57
-	.4byte	0x13a0c
-	.uleb128 0x5c
-	.4byte	0x13bb2
-	.8byte	.LBB1709
-	.8byte	.LBE1709-.LBB1709
+	.8byte	.LBB1700
+	.8byte	.LBE1700-.LBB1700
+	.uleb128 0x58
+	.4byte	0x13a96
+	.uleb128 0x5d
+	.4byte	0x13c42
+	.8byte	.LBB1701
+	.8byte	.LBE1701-.LBB1701
 	.byte	0x10
 	.byte	0x1c
-	.uleb128 0x54
-	.4byte	0x13bd5
-	.uleb128 0x54
-	.4byte	0x13bc9
-	.uleb128 0x54
-	.4byte	0x13bbf
+	.uleb128 0x55
+	.4byte	0x13c65
+	.uleb128 0x55
+	.4byte	0x13c59
+	.uleb128 0x55
+	.4byte	0x13c4f
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x13af1
-	.8byte	.LBB1713
-	.8byte	.LBE1713-.LBB1713
-	.byte	0x1
-	.2byte	0x8e1
-	.4byte	0xf7da
-	.uleb128 0x54
-	.4byte	0x13b07
 	.uleb128 0x54
-	.4byte	0x13afe
-	.uleb128 0x56
-	.8byte	.LBB1714
-	.8byte	.LBE1714-.LBB1714
-	.uleb128 0x60
-	.4byte	0x13b10
+	.4byte	0x13b7e
+	.8byte	.LBB1705
+	.8byte	.LBE1705-.LBB1705
+	.byte	0x1
+	.2byte	0x8e4
+	.4byte	0xf857
+	.uleb128 0x55
+	.4byte	0x13b94
+	.uleb128 0x55
+	.4byte	0x13b8b
+	.uleb128 0x57
+	.8byte	.LBB1706
+	.8byte	.LBE1706-.LBB1706
+	.uleb128 0x61
+	.4byte	0x13b9d
 	.4byte	.LLST159
-	.uleb128 0x60
-	.4byte	0x13b1a
+	.uleb128 0x61
+	.4byte	0x13ba7
 	.4byte	.LLST160
 	.byte	0
 	.byte	0
-	.uleb128 0x62
-	.4byte	.Ldebug_ranges0+0xec0
-	.4byte	0xf807
-	.uleb128 0x60
-	.4byte	0xfe76
+	.uleb128 0x63
+	.4byte	.Ldebug_ranges0+0xe90
+	.4byte	0xf884
+	.uleb128 0x61
+	.4byte	0xff00
 	.4byte	.LLST161
-	.uleb128 0x4e
-	.8byte	.LVL604
-	.4byte	0x144f7
-	.uleb128 0x4e
-	.8byte	.LVL606
-	.4byte	0x14503
+	.uleb128 0x4f
+	.8byte	.LVL605
+	.4byte	0x14587
+	.uleb128 0x4f
+	.8byte	.LVL607
+	.4byte	0x14593
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x13af1
-	.8byte	.LBB1717
-	.8byte	.LBE1717-.LBB1717
-	.byte	0x1
-	.2byte	0x8ea
-	.4byte	0xf852
 	.uleb128 0x54
-	.4byte	0x13b07
-	.uleb128 0x54
-	.4byte	0x13afe
-	.uleb128 0x56
-	.8byte	.LBB1718
-	.8byte	.LBE1718-.LBB1718
-	.uleb128 0x60
-	.4byte	0x13b10
+	.4byte	0x13b7e
+	.8byte	.LBB1709
+	.8byte	.LBE1709-.LBB1709
+	.byte	0x1
+	.2byte	0x8ed
+	.4byte	0xf8cf
+	.uleb128 0x55
+	.4byte	0x13b94
+	.uleb128 0x55
+	.4byte	0x13b8b
+	.uleb128 0x57
+	.8byte	.LBB1710
+	.8byte	.LBE1710-.LBB1710
+	.uleb128 0x61
+	.4byte	0x13b9d
 	.4byte	.LLST162
-	.uleb128 0x60
-	.4byte	0x13b1a
+	.uleb128 0x61
+	.4byte	0x13ba7
 	.4byte	.LLST163
 	.byte	0
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL598
-	.4byte	0x144f7
-	.uleb128 0x4e
+	.4byte	0x145a0
+	.uleb128 0x4f
 	.8byte	.LVL599
-	.4byte	0x14510
-	.uleb128 0x4e
-	.8byte	.LVL607
-	.4byte	0x14510
-	.uleb128 0x4e
-	.8byte	.LVL686
-	.4byte	0x144d2
-	.uleb128 0x4e
-	.8byte	.LVL690
-	.4byte	0x144d2
+	.4byte	0x14587
+	.uleb128 0x4f
+	.8byte	.LVL600
+	.4byte	0x145ad
+	.uleb128 0x4f
+	.8byte	.LVL608
+	.4byte	0x145ad
+	.uleb128 0x4f
+	.8byte	.LVL687
+	.4byte	0x14562
+	.uleb128 0x4f
+	.8byte	.LVL691
+	.4byte	0x14562
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0xfe32
-	.8byte	.LBB1721
-	.8byte	.LBE1721-.LBB1721
-	.byte	0x1
-	.2byte	0x9ce
-	.4byte	0xf92f
 	.uleb128 0x54
-	.4byte	0xfe3f
-	.uleb128 0x5b
-	.4byte	0x1342b
-	.8byte	.LBB1723
-	.4byte	.Ldebug_ranges0+0xef0
+	.4byte	0xfebc
+	.8byte	.LBB1713
+	.8byte	.LBE1713-.LBB1713
 	.byte	0x1
-	.2byte	0x8fa
-	.4byte	0xf8fa
-	.uleb128 0x54
-	.4byte	0x1344e
-	.uleb128 0x54
-	.4byte	0x13443
-	.uleb128 0x54
-	.4byte	0x13438
-	.uleb128 0x5e
-	.4byte	.Ldebug_ranges0+0xef0
-	.uleb128 0x60
-	.4byte	0x13459
+	.2byte	0x9d1
+	.4byte	0xf9b9
+	.uleb128 0x55
+	.4byte	0xfec9
+	.uleb128 0x5c
+	.4byte	0x134bb
+	.8byte	.LBB1715
+	.4byte	.Ldebug_ranges0+0xec0
+	.byte	0x1
+	.2byte	0x8fd
+	.4byte	0xf984
+	.uleb128 0x55
+	.4byte	0x134e0
+	.uleb128 0x55
+	.4byte	0x134d4
+	.uleb128 0x55
+	.4byte	0x134c8
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0xec0
+	.uleb128 0x61
+	.4byte	0x134ec
 	.4byte	.LLST164
-	.uleb128 0x4e
-	.8byte	.LVL614
-	.4byte	0x1451d
+	.uleb128 0x4f
+	.8byte	.LVL615
+	.4byte	0x145ba
 	.byte	0
 	.byte	0
-	.uleb128 0x4e
-	.8byte	.LVL615
-	.4byte	0x14529
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL616
-	.4byte	0x14535
-	.uleb128 0x4e
+	.4byte	0x145c6
+	.uleb128 0x4f
 	.8byte	.LVL617
-	.4byte	0x14529
-	.uleb128 0x4e
+	.4byte	0x145d2
+	.uleb128 0x4f
 	.8byte	.LVL618
-	.4byte	0x14535
+	.4byte	0x145c6
+	.uleb128 0x4f
+	.8byte	.LVL619
+	.4byte	0x145d2
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0xfd90
-	.8byte	.LBB1733
-	.4byte	.Ldebug_ranges0+0xf50
+	.uleb128 0x5c
+	.4byte	0xfe1a
+	.8byte	.LBB1725
+	.4byte	.Ldebug_ranges0+0xf20
 	.byte	0x1
-	.2byte	0x9d1
-	.4byte	0xfbd2
-	.uleb128 0x54
-	.4byte	0xfdad
-	.uleb128 0x54
-	.4byte	0xfda1
-	.uleb128 0x5e
-	.4byte	.Ldebug_ranges0+0xf50
-	.uleb128 0x57
-	.4byte	0xfdb9
-	.uleb128 0x60
-	.4byte	0xfdc5
+	.2byte	0x9d4
+	.4byte	0xfc5c
+	.uleb128 0x55
+	.4byte	0xfe37
+	.uleb128 0x55
+	.4byte	0xfe2b
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0xf20
+	.uleb128 0x58
+	.4byte	0xfe43
+	.uleb128 0x61
+	.4byte	0xfe4f
 	.4byte	.LLST165
-	.uleb128 0x60
-	.4byte	0xfdd1
+	.uleb128 0x61
+	.4byte	0xfe5b
 	.4byte	.LLST166
-	.uleb128 0x60
-	.4byte	0xfddd
+	.uleb128 0x61
+	.4byte	0xfe67
 	.4byte	.LLST167
-	.uleb128 0x60
-	.4byte	0xfde9
+	.uleb128 0x61
+	.4byte	0xfe73
 	.4byte	.LLST168
-	.uleb128 0x60
-	.4byte	0xfdf5
+	.uleb128 0x61
+	.4byte	0xfe7f
 	.4byte	.LLST169
-	.uleb128 0x60
-	.4byte	0xfe01
+	.uleb128 0x61
+	.4byte	0xfe8b
 	.4byte	.LLST170
-	.uleb128 0x57
-	.4byte	0xfe0d
-	.uleb128 0x60
-	.4byte	0xfe19
+	.uleb128 0x58
+	.4byte	0xfe97
+	.uleb128 0x61
+	.4byte	0xfea3
 	.4byte	.LLST171
-	.uleb128 0x60
-	.4byte	0xfe25
+	.uleb128 0x61
+	.4byte	0xfeaf
 	.4byte	.LLST172
-	.uleb128 0x53
-	.4byte	0x1185f
-	.8byte	.LBB1735
-	.8byte	.LBE1735-.LBB1735
-	.byte	0x1
-	.2byte	0x932
-	.4byte	0xfa11
-	.uleb128 0x54
-	.4byte	0x11870
 	.uleb128 0x54
-	.4byte	0x11870
-	.uleb128 0x56
-	.8byte	.LBB1736
-	.8byte	.LBE1736-.LBB1736
-	.uleb128 0x60
-	.4byte	0x1187c
+	.4byte	0x118e9
+	.8byte	.LBB1727
+	.8byte	.LBE1727-.LBB1727
+	.byte	0x1
+	.2byte	0x935
+	.4byte	0xfa9b
+	.uleb128 0x55
+	.4byte	0x118fa
+	.uleb128 0x55
+	.4byte	0x118fa
+	.uleb128 0x57
+	.8byte	.LBB1728
+	.8byte	.LBE1728-.LBB1728
+	.uleb128 0x61
+	.4byte	0x11906
 	.4byte	.LLST173
-	.uleb128 0x4e
-	.8byte	.LVL635
-	.4byte	0x14541
-	.uleb128 0x4e
-	.8byte	.LVL637
-	.4byte	0x144c6
-	.uleb128 0x4e
+	.uleb128 0x4f
+	.8byte	.LVL636
+	.4byte	0x145de
+	.uleb128 0x4f
 	.8byte	.LVL638
-	.4byte	0x1454d
+	.4byte	0x14556
+	.uleb128 0x4f
+	.8byte	.LVL639
+	.4byte	0x145ea
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x135a9
-	.8byte	.LBB1737
-	.8byte	.LBE1737-.LBB1737
-	.byte	0x1
-	.2byte	0x918
-	.4byte	0xfa68
 	.uleb128 0x54
-	.4byte	0x135c6
-	.uleb128 0x54
-	.4byte	0x135ba
-	.uleb128 0x5d
-	.4byte	0x135d3
-	.8byte	.LBB1738
-	.8byte	.LBE1738-.LBB1738
+	.4byte	0x13642
+	.8byte	.LBB1729
+	.8byte	.LBE1729-.LBB1729
+	.byte	0x1
+	.2byte	0x91b
+	.4byte	0xfaf2
+	.uleb128 0x55
+	.4byte	0x1365f
+	.uleb128 0x55
+	.4byte	0x13653
+	.uleb128 0x5e
+	.4byte	0x1366c
+	.8byte	.LBB1730
+	.8byte	.LBE1730-.LBB1730
 	.byte	0x12
 	.2byte	0x2e7
-	.uleb128 0x54
-	.4byte	0x135f0
-	.uleb128 0x54
-	.4byte	0x135e4
-	.uleb128 0x4e
-	.8byte	.LVL655
-	.4byte	0x14559
+	.uleb128 0x55
+	.4byte	0x13689
+	.uleb128 0x55
+	.4byte	0x1367d
+	.uleb128 0x4f
+	.8byte	.LVL656
+	.4byte	0x145f6
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x135a9
-	.8byte	.LBB1740
-	.8byte	.LBE1740-.LBB1740
-	.byte	0x1
-	.2byte	0x926
-	.4byte	0xfabf
 	.uleb128 0x54
-	.4byte	0x135c6
-	.uleb128 0x54
-	.4byte	0x135ba
-	.uleb128 0x5d
-	.4byte	0x135d3
-	.8byte	.LBB1741
-	.8byte	.LBE1741-.LBB1741
+	.4byte	0x13642
+	.8byte	.LBB1732
+	.8byte	.LBE1732-.LBB1732
+	.byte	0x1
+	.2byte	0x929
+	.4byte	0xfb49
+	.uleb128 0x55
+	.4byte	0x1365f
+	.uleb128 0x55
+	.4byte	0x13653
+	.uleb128 0x5e
+	.4byte	0x1366c
+	.8byte	.LBB1733
+	.8byte	.LBE1733-.LBB1733
 	.byte	0x12
 	.2byte	0x2e7
-	.uleb128 0x54
-	.4byte	0x135f0
-	.uleb128 0x54
-	.4byte	0x135e4
-	.uleb128 0x4e
-	.8byte	.LVL668
-	.4byte	0x14559
+	.uleb128 0x55
+	.4byte	0x13689
+	.uleb128 0x55
+	.4byte	0x1367d
+	.uleb128 0x4f
+	.8byte	.LVL669
+	.4byte	0x145f6
 	.byte	0
 	.byte	0
-	.uleb128 0x4e
-	.8byte	.LVL620
-	.4byte	0x14566
-	.uleb128 0x4e
-	.8byte	.LVL622
-	.4byte	0x14566
-	.uleb128 0x4e
-	.8byte	.LVL624
-	.4byte	0x14572
-	.uleb128 0x4e
-	.8byte	.LVL629
-	.4byte	0x14572
-	.uleb128 0x4e
-	.8byte	.LVL633
-	.4byte	0x14458
-	.uleb128 0x4e
-	.8byte	.LVL634
-	.4byte	0x1457f
-	.uleb128 0x4e
-	.8byte	.LVL639
-	.4byte	0x1458b
-	.uleb128 0x4e
-	.8byte	.LVL640
-	.4byte	0x1458b
-	.uleb128 0x4e
-	.8byte	.LVL652
-	.4byte	0x14597
-	.uleb128 0x4e
-	.8byte	.LVL654
-	.4byte	0x14458
-	.uleb128 0x4e
-	.8byte	.LVL659
-	.4byte	0x145a3
-	.uleb128 0x4e
-	.8byte	.LVL662
-	.4byte	0x14541
-	.uleb128 0x4e
-	.8byte	.LVL664
-	.4byte	0x145a3
-	.uleb128 0x4e
+	.uleb128 0x4f
+	.8byte	.LVL621
+	.4byte	0x14603
+	.uleb128 0x4f
+	.8byte	.LVL623
+	.4byte	0x14603
+	.uleb128 0x4f
+	.8byte	.LVL625
+	.4byte	0x1460f
+	.uleb128 0x4f
+	.8byte	.LVL630
+	.4byte	0x1460f
+	.uleb128 0x4f
+	.8byte	.LVL634
+	.4byte	0x144e8
+	.uleb128 0x4f
+	.8byte	.LVL635
+	.4byte	0x1461c
+	.uleb128 0x4f
+	.8byte	.LVL640
+	.4byte	0x14628
+	.uleb128 0x4f
+	.8byte	.LVL641
+	.4byte	0x14628
+	.uleb128 0x4f
+	.8byte	.LVL653
+	.4byte	0x14634
+	.uleb128 0x4f
+	.8byte	.LVL655
+	.4byte	0x144e8
+	.uleb128 0x4f
+	.8byte	.LVL660
+	.4byte	0x14640
+	.uleb128 0x4f
+	.8byte	.LVL663
+	.4byte	0x145de
+	.uleb128 0x4f
 	.8byte	.LVL665
-	.4byte	0x1454d
-	.uleb128 0x4e
-	.8byte	.LVL667
-	.4byte	0x14458
-	.uleb128 0x4e
-	.8byte	.LVL671
-	.4byte	0x145a3
-	.uleb128 0x4e
-	.8byte	.LVL675
-	.4byte	0x14541
-	.uleb128 0x4e
-	.8byte	.LVL677
-	.4byte	0x145a3
-	.uleb128 0x4e
+	.4byte	0x14640
+	.uleb128 0x4f
+	.8byte	.LVL666
+	.4byte	0x145ea
+	.uleb128 0x4f
+	.8byte	.LVL668
+	.4byte	0x144e8
+	.uleb128 0x4f
+	.8byte	.LVL672
+	.4byte	0x14640
+	.uleb128 0x4f
+	.8byte	.LVL676
+	.4byte	0x145de
+	.uleb128 0x4f
 	.8byte	.LVL678
-	.4byte	0x1454d
-	.uleb128 0x4e
-	.8byte	.LVL697
-	.4byte	0x144d2
-	.uleb128 0x4e
-	.8byte	.LVL705
-	.4byte	0x144d2
+	.4byte	0x14640
+	.uleb128 0x4f
+	.8byte	.LVL679
+	.4byte	0x145ea
+	.uleb128 0x4f
+	.8byte	.LVL698
+	.4byte	0x14562
+	.uleb128 0x4f
+	.8byte	.LVL706
+	.4byte	0x14562
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x1367d
-	.8byte	.LBB1747
-	.8byte	.LBE1747-.LBB1747
-	.byte	0x1
-	.2byte	0x9d3
-	.4byte	0xfc1b
-	.uleb128 0x54
-	.4byte	0x13695
 	.uleb128 0x54
-	.4byte	0x1368a
-	.uleb128 0x5c
-	.4byte	0x13781
-	.8byte	.LBB1748
-	.8byte	.LBE1748-.LBB1748
+	.4byte	0x13716
+	.8byte	.LBB1739
+	.8byte	.LBE1739-.LBB1739
+	.byte	0x1
+	.2byte	0x9d6
+	.4byte	0xfca5
+	.uleb128 0x55
+	.4byte	0x1372f
+	.uleb128 0x55
+	.4byte	0x13723
+	.uleb128 0x5d
+	.4byte	0x1381e
+	.8byte	.LBB1740
+	.8byte	.LBE1740-.LBB1740
 	.byte	0xbe
 	.byte	0xde
-	.uleb128 0x54
-	.4byte	0x1379a
-	.uleb128 0x54
-	.4byte	0x1378e
+	.uleb128 0x55
+	.4byte	0x13837
+	.uleb128 0x55
+	.4byte	0x1382b
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0xff84
-	.8byte	.LBB1750
-	.8byte	.LBE1750-.LBB1750
-	.byte	0x1
-	.2byte	0x9d6
-	.4byte	0xfcb2
 	.uleb128 0x54
-	.4byte	0xff95
-	.uleb128 0x4e
-	.8byte	.LVL641
-	.4byte	0x145ad
-	.uleb128 0x4e
+	.4byte	0x1000e
+	.8byte	.LBB1742
+	.8byte	.LBE1742-.LBB1742
+	.byte	0x1
+	.2byte	0x9d9
+	.4byte	0xfd3c
+	.uleb128 0x55
+	.4byte	0x1001f
+	.uleb128 0x4f
 	.8byte	.LVL642
-	.4byte	0x145ad
-	.uleb128 0x4e
+	.4byte	0x1464a
+	.uleb128 0x4f
 	.8byte	.LVL643
-	.4byte	0x145b9
-	.uleb128 0x4e
+	.4byte	0x1464a
+	.uleb128 0x4f
 	.8byte	.LVL644
-	.4byte	0x145b9
-	.uleb128 0x4e
+	.4byte	0x14656
+	.uleb128 0x4f
 	.8byte	.LVL645
-	.4byte	0x145b9
-	.uleb128 0x4e
+	.4byte	0x14656
+	.uleb128 0x4f
 	.8byte	.LVL646
-	.4byte	0x145b9
-	.uleb128 0x4e
+	.4byte	0x14656
+	.uleb128 0x4f
 	.8byte	.LVL647
-	.4byte	0x145b9
-	.uleb128 0x4e
+	.4byte	0x14656
+	.uleb128 0x4f
 	.8byte	.LVL648
-	.4byte	0x145b9
-	.uleb128 0x4e
+	.4byte	0x14656
+	.uleb128 0x4f
 	.8byte	.LVL649
-	.4byte	0x145b9
+	.4byte	0x14656
+	.uleb128 0x4f
+	.8byte	.LVL650
+	.4byte	0x14656
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL525
-	.4byte	0x1448b
-	.uleb128 0x4e
+	.4byte	0x1451b
+	.uleb128 0x4f
 	.8byte	.LVL526
-	.4byte	0x145c6
-	.uleb128 0x4e
+	.4byte	0x14663
+	.uleb128 0x4f
 	.8byte	.LVL528
-	.4byte	0x145d2
-	.uleb128 0x4e
+	.4byte	0x1466f
+	.uleb128 0x4f
 	.8byte	.LVL534
-	.4byte	0x145df
-	.uleb128 0x4e
+	.4byte	0x1467c
+	.uleb128 0x4f
 	.8byte	.LVL537
-	.4byte	0x145ec
-	.uleb128 0x4e
+	.4byte	0x14689
+	.uleb128 0x4f
 	.8byte	.LVL538
-	.4byte	0x144d2
-	.uleb128 0x4e
+	.4byte	0x14562
+	.uleb128 0x4f
 	.8byte	.LVL546
-	.4byte	0x14458
-	.uleb128 0x4e
+	.4byte	0x144e8
+	.uleb128 0x4f
 	.8byte	.LVL583
-	.4byte	0x144d2
-	.uleb128 0x4e
+	.4byte	0x14562
+	.uleb128 0x4f
 	.8byte	.LVL585
-	.4byte	0x144d2
-	.uleb128 0x4e
+	.4byte	0x14562
+	.uleb128 0x4f
 	.8byte	.LVL588
-	.4byte	0x144d2
-	.uleb128 0x4e
+	.4byte	0x14562
+	.uleb128 0x4f
 	.8byte	.LVL590
-	.4byte	0x144d2
-	.uleb128 0x4e
+	.4byte	0x14562
+	.uleb128 0x4f
 	.8byte	.LVL593
-	.4byte	0x144d2
-	.uleb128 0x4e
-	.8byte	.LVL650
-	.4byte	0x14458
-	.uleb128 0x4e
-	.8byte	.LVL681
-	.4byte	0x144d2
-	.uleb128 0x4e
-	.8byte	.LVL687
-	.4byte	0x144d2
-	.uleb128 0x4e
-	.8byte	.LVL692
-	.4byte	0x144d2
-	.uleb128 0x4e
-	.8byte	.LVL701
-	.4byte	0x145f9
+	.4byte	0x14562
+	.uleb128 0x4f
+	.8byte	.LVL651
+	.4byte	0x144e8
+	.uleb128 0x4f
+	.8byte	.LVL682
+	.4byte	0x14562
+	.uleb128 0x4f
+	.8byte	.LVL688
+	.4byte	0x14562
+	.uleb128 0x4f
+	.8byte	.LVL693
+	.4byte	0x14562
+	.uleb128 0x4f
+	.8byte	.LVL702
+	.4byte	0x14696
 	.byte	0
-	.uleb128 0x63
-	.4byte	.LASF3048
+	.uleb128 0x64
+	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x906
+	.2byte	0x909
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe32
-	.uleb128 0x64
+	.4byte	0xfebc
+	.uleb128 0x65
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x906
-	.4byte	0xe4c2
-	.uleb128 0x65
-	.4byte	.LASF3004
+	.2byte	0x909
+	.4byte	0xe53f
+	.uleb128 0x66
+	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x906
-	.4byte	0xe16c
-	.uleb128 0x46
-	.4byte	.LASF2961
+	.2byte	0x909
+	.4byte	0xe1dc
+	.uleb128 0x48
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x908
-	.4byte	0xe7b3
-	.uleb128 0x46
-	.4byte	.LASF3040
+	.2byte	0x90b
+	.4byte	0xe830
+	.uleb128 0x48
+	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0x909
+	.2byte	0x90c
 	.4byte	0x6d
-	.uleb128 0x46
-	.4byte	.LASF3041
+	.uleb128 0x48
+	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0x90a
+	.2byte	0x90d
 	.4byte	0x6d
-	.uleb128 0x46
-	.4byte	.LASF3042
+	.uleb128 0x48
+	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0x90b
+	.2byte	0x90e
 	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF3043
+	.uleb128 0x48
+	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x90c
+	.2byte	0x90f
 	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF3044
+	.uleb128 0x48
+	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x90d
+	.2byte	0x910
 	.4byte	0x21e
-	.uleb128 0x46
-	.4byte	.LASF3045
+	.uleb128 0x48
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x90e
+	.2byte	0x911
 	.4byte	0x21e
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x90f
-	.4byte	0xe45d
-	.uleb128 0x46
-	.4byte	.LASF3046
+	.2byte	0x912
+	.4byte	0xe4da
+	.uleb128 0x48
+	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x910
+	.2byte	0x913
 	.4byte	0x458
-	.uleb128 0x46
-	.4byte	.LASF3047
+	.uleb128 0x48
+	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x911
+	.2byte	0x914
 	.4byte	0x458
 	.byte	0
-	.uleb128 0x66
-	.4byte	.LASF3066
+	.uleb128 0x67
+	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0x8ef
+	.2byte	0x8f2
 	.byte	0x1
-	.4byte	0xfe4c
-	.uleb128 0x65
-	.4byte	.LASF2961
+	.4byte	0xfed6
+	.uleb128 0x66
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x8ef
-	.4byte	0xe7b3
+	.2byte	0x8f2
+	.4byte	0xe830
 	.byte	0
-	.uleb128 0x63
-	.4byte	.LASF3049
+	.uleb128 0x64
+	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x8d5
+	.2byte	0x8d6
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe84
-	.uleb128 0x65
-	.4byte	.LASF2961
+	.4byte	0xff0e
+	.uleb128 0x66
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x8d5
-	.4byte	0xe7b3
-	.uleb128 0x46
-	.4byte	.LASF2466
+	.2byte	0x8d6
+	.4byte	0xe830
+	.uleb128 0x48
+	.4byte	.LASF2480
 	.byte	0x1
-	.2byte	0x8d7
-	.4byte	0xd81a
-	.uleb128 0x67
-	.uleb128 0x52
+	.2byte	0x8d8
+	.4byte	0xd88a
+	.uleb128 0x68
+	.uleb128 0x53
 	.string	"__k"
 	.byte	0x1
-	.2byte	0x8e4
+	.2byte	0x8e7
 	.4byte	0x2f05
 	.byte	0
 	.byte	0
-	.uleb128 0x63
-	.4byte	.LASF3050
+	.uleb128 0x64
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x88c
+	.2byte	0x88d
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfefe
-	.uleb128 0x64
+	.4byte	0xff88
+	.uleb128 0x65
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x88c
-	.4byte	0xe4c2
-	.uleb128 0x52
+	.2byte	0x88d
+	.4byte	0xe53f
+	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x88e
-	.4byte	0xa570
-	.uleb128 0x46
-	.4byte	.LASF3004
-	.byte	0x1
 	.2byte	0x88f
-	.4byte	0xe16c
-	.uleb128 0x46
-	.4byte	.LASF2961
+	.4byte	0xa5e0
+	.uleb128 0x48
+	.4byte	.LASF3019
 	.byte	0x1
 	.2byte	0x890
-	.4byte	0xe7b3
-	.uleb128 0x46
-	.4byte	.LASF3051
+	.4byte	0xe1dc
+	.uleb128 0x48
+	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x891
-	.4byte	0xb894
-	.uleb128 0x52
-	.string	"r"
+	.4byte	0xe830
+	.uleb128 0x48
+	.4byte	.LASF3066
 	.byte	0x1
 	.2byte	0x892
-	.4byte	0x974c
-	.uleb128 0x46
-	.4byte	.LASF3052
+	.4byte	0xb904
+	.uleb128 0x53
+	.string	"r"
 	.byte	0x1
 	.2byte	0x893
+	.4byte	0x97bc
+	.uleb128 0x48
+	.4byte	.LASF3067
+	.byte	0x1
+	.2byte	0x894
 	.4byte	0xc6
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x894
+	.2byte	0x895
 	.4byte	0xc6
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x894
+	.2byte	0x895
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x63
-	.4byte	.LASF3053
+	.uleb128 0x64
+	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x860
+	.2byte	0x861
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xff6f
-	.uleb128 0x65
-	.4byte	.LASF2961
+	.4byte	0xfff9
+	.uleb128 0x66
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x860
-	.4byte	0xe7b3
-	.uleb128 0x52
+	.2byte	0x861
+	.4byte	0xe830
+	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x862
+	.2byte	0x863
 	.4byte	0xc6
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x863
-	.4byte	0xa570
-	.uleb128 0x46
-	.4byte	.LASF3051
-	.byte	0x1
 	.2byte	0x864
-	.4byte	0xb894
-	.uleb128 0x52
-	.string	"r"
+	.4byte	0xa5e0
+	.uleb128 0x48
+	.4byte	.LASF3066
 	.byte	0x1
 	.2byte	0x865
-	.4byte	0x974c
-	.uleb128 0x46
-	.4byte	.LASF2967
+	.4byte	0xb904
+	.uleb128 0x53
+	.string	"r"
 	.byte	0x1
 	.2byte	0x866
-	.4byte	0x29
-	.uleb128 0x46
-	.4byte	.LASF2968
+	.4byte	0x97bc
+	.uleb128 0x48
+	.4byte	.LASF2981
 	.byte	0x1
 	.2byte	0x867
+	.4byte	0x29
+	.uleb128 0x48
+	.4byte	.LASF2982
+	.byte	0x1
+	.2byte	0x868
 	.4byte	0xc6
-	.uleb128 0x68
-	.4byte	.LASF3032
-	.4byte	0xff7f
-	.4byte	.LASF3053
+	.uleb128 0x69
+	.4byte	.LASF3047
+	.4byte	0x10009
+	.4byte	.LASF3068
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xff7f
+	.4byte	0x10009
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x12
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xff6f
-	.uleb128 0x63
-	.4byte	.LASF3054
+	.4byte	0xfff9
+	.uleb128 0x64
+	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0x850
+	.2byte	0x851
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xffa2
-	.uleb128 0x65
-	.4byte	.LASF2961
+	.4byte	0x1002c
+	.uleb128 0x66
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x850
-	.4byte	0xe7b3
+	.2byte	0x851
+	.4byte	0xe830
 	.byte	0
-	.uleb128 0x4f
-	.4byte	.LASF3055
+	.uleb128 0x50
+	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0x847
+	.2byte	0x848
 	.4byte	0x2ee
-	.8byte	.LFB2843
-	.8byte	.LFE2843-.LFB2843
+	.8byte	.LFB2844
+	.8byte	.LFE2844-.LFB2844
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10002
-	.uleb128 0x58
-	.4byte	.LASF2200
+	.4byte	0x1008c
+	.uleb128 0x59
+	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x847
-	.4byte	0xa570
+	.2byte	0x848
+	.4byte	0xa5e0
 	.4byte	.LLST77
-	.uleb128 0x58
-	.4byte	.LASF2115
+	.uleb128 0x59
+	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x848
-	.4byte	0xb3eb
+	.2byte	0x849
+	.4byte	0xb45b
 	.4byte	.LLST78
-	.uleb128 0x51
+	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x849
+	.2byte	0x84a
 	.4byte	0x21e
 	.4byte	.LLST79
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL304
-	.4byte	0x14603
+	.4byte	0x146a0
 	.byte	0
-	.uleb128 0x4f
-	.4byte	.LASF3056
+	.uleb128 0x50
+	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0x83e
+	.2byte	0x83f
 	.4byte	0x2ee
-	.8byte	.LFB2842
-	.8byte	.LFE2842-.LFB2842
+	.8byte	.LFB2843
+	.8byte	.LFE2843-.LFB2843
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10062
-	.uleb128 0x58
-	.4byte	.LASF2200
+	.4byte	0x100ec
+	.uleb128 0x59
+	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x83e
-	.4byte	0xa570
+	.2byte	0x83f
+	.4byte	0xa5e0
 	.4byte	.LLST80
-	.uleb128 0x58
-	.4byte	.LASF2115
+	.uleb128 0x59
+	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x83f
-	.4byte	0xb3eb
+	.2byte	0x840
+	.4byte	0xb45b
 	.4byte	.LLST81
-	.uleb128 0x51
+	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x840
+	.2byte	0x841
 	.4byte	0x21e
 	.4byte	.LLST82
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL309
-	.4byte	0x1460f
+	.4byte	0x146ac
 	.byte	0
-	.uleb128 0x4f
-	.4byte	.LASF3057
+	.uleb128 0x50
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x835
+	.2byte	0x836
 	.4byte	0x2ee
-	.8byte	.LFB2841
-	.8byte	.LFE2841-.LFB2841
+	.8byte	.LFB2842
+	.8byte	.LFE2842-.LFB2842
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x100c2
-	.uleb128 0x58
-	.4byte	.LASF2200
+	.4byte	0x1014c
+	.uleb128 0x59
+	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x835
-	.4byte	0xa570
+	.2byte	0x836
+	.4byte	0xa5e0
 	.4byte	.LLST83
-	.uleb128 0x58
-	.4byte	.LASF2115
+	.uleb128 0x59
+	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x836
-	.4byte	0xb3eb
+	.2byte	0x837
+	.4byte	0xb45b
 	.4byte	.LLST84
-	.uleb128 0x51
+	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x837
+	.2byte	0x838
 	.4byte	0x21e
 	.4byte	.LLST85
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL314
-	.4byte	0x1460f
+	.4byte	0x146ac
 	.byte	0
-	.uleb128 0x4f
-	.4byte	.LASF3058
+	.uleb128 0x50
+	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0x81d
+	.2byte	0x81e
 	.4byte	0x2ee
-	.8byte	.LFB2840
-	.8byte	.LFE2840-.LFB2840
+	.8byte	.LFB2841
+	.8byte	.LFE2841-.LFB2841
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10192
-	.uleb128 0x58
-	.4byte	.LASF2200
+	.4byte	0x1021c
+	.uleb128 0x59
+	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x81d
-	.4byte	0xa570
+	.2byte	0x81e
+	.4byte	0xa5e0
 	.4byte	.LLST95
-	.uleb128 0x58
-	.4byte	.LASF2115
+	.uleb128 0x59
+	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x81e
-	.4byte	0xb3eb
+	.2byte	0x81f
+	.4byte	0xb45b
 	.4byte	.LLST96
-	.uleb128 0x51
+	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x81f
+	.2byte	0x820
 	.4byte	0x56
 	.4byte	.LLST97
-	.uleb128 0x58
+	.uleb128 0x59
 	.4byte	.LASF383
 	.byte	0x1
-	.2byte	0x81f
+	.2byte	0x820
 	.4byte	0x2e3
 	.4byte	.LLST98
-	.uleb128 0x5a
+	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x821
-	.4byte	0xe4c2
+	.2byte	0x822
+	.4byte	0xe53f
 	.4byte	.LLST99
-	.uleb128 0x59
-	.4byte	.LASF2456
+	.uleb128 0x5a
+	.4byte	.LASF2470
 	.byte	0x1
-	.2byte	0x822
+	.2byte	0x823
 	.4byte	0xc6
 	.4byte	.LLST100
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x822
+	.2byte	0x823
 	.4byte	0xc6
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL340
-	.4byte	0x1461c
-	.uleb128 0x4e
+	.4byte	0x146b9
+	.uleb128 0x4f
 	.8byte	.LVL342
-	.4byte	0x14629
-	.uleb128 0x4e
+	.4byte	0x146c6
+	.uleb128 0x4f
 	.8byte	.LVL347
-	.4byte	0x144d2
-	.uleb128 0x4e
+	.4byte	0x14562
+	.uleb128 0x4f
 	.8byte	.LVL350
-	.4byte	0x144d2
-	.uleb128 0x4e
+	.4byte	0x14562
+	.uleb128 0x4f
 	.8byte	.LVL351
-	.4byte	0x145f9
+	.4byte	0x14696
 	.byte	0
-	.uleb128 0x50
-	.4byte	.LASF3059
+	.uleb128 0x51
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x811
+	.2byte	0x812
 	.4byte	0x2ee
-	.8byte	.LFB2839
-	.8byte	.LFE2839-.LFB2839
+	.8byte	.LFB2840
+	.8byte	.LFE2840-.LFB2840
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1022c
-	.uleb128 0x58
-	.4byte	.LASF2200
+	.4byte	0x102b6
+	.uleb128 0x59
+	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x811
-	.4byte	0xa570
+	.2byte	0x812
+	.4byte	0xa5e0
 	.4byte	.LLST86
-	.uleb128 0x58
-	.4byte	.LASF2115
+	.uleb128 0x59
+	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x812
-	.4byte	0xb3eb
+	.2byte	0x813
+	.4byte	0xb45b
 	.4byte	.LLST87
-	.uleb128 0x51
+	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x813
+	.2byte	0x814
 	.4byte	0x21e
 	.4byte	.LLST88
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x815
-	.4byte	0xe4c2
-	.uleb128 0x46
-	.4byte	.LASF2456
-	.byte	0x1
 	.2byte	0x816
-	.4byte	0xc6
-	.uleb128 0x53
-	.4byte	0x1334e
-	.8byte	.LBB1218
-	.8byte	.LBE1218-.LBB1218
+	.4byte	0xe53f
+	.uleb128 0x48
+	.4byte	.LASF2470
 	.byte	0x1
-	.2byte	0x818
-	.4byte	0x1021e
+	.2byte	0x817
+	.4byte	0xc6
 	.uleb128 0x54
-	.4byte	0x1335e
+	.4byte	0x133d6
+	.8byte	.LBB1214
+	.8byte	.LBE1214-.LBB1214
+	.byte	0x1
+	.2byte	0x819
+	.4byte	0x102a8
+	.uleb128 0x55
+	.4byte	0x133e6
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL319
-	.4byte	0x1460f
+	.4byte	0x146ac
 	.byte	0
-	.uleb128 0x50
-	.4byte	.LASF3060
+	.uleb128 0x51
+	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x803
+	.2byte	0x804
 	.4byte	0x2ee
-	.8byte	.LFB2838
-	.8byte	.LFE2838-.LFB2838
+	.8byte	.LFB2839
+	.8byte	.LFE2839-.LFB2839
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x102d5
-	.uleb128 0x58
-	.4byte	.LASF2200
+	.4byte	0x1035f
+	.uleb128 0x59
+	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x803
-	.4byte	0xa570
+	.2byte	0x804
+	.4byte	0xa5e0
 	.4byte	.LLST89
-	.uleb128 0x58
-	.4byte	.LASF2115
+	.uleb128 0x59
+	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x804
-	.4byte	0xb3eb
+	.2byte	0x805
+	.4byte	0xb45b
 	.4byte	.LLST90
-	.uleb128 0x51
+	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x805
+	.2byte	0x806
 	.4byte	0x21e
 	.4byte	.LLST91
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x807
-	.4byte	0xe4c2
-	.uleb128 0x69
+	.2byte	0x808
+	.4byte	0xe53f
+	.uleb128 0x6a
 	.string	"t"
 	.byte	0x1
-	.2byte	0x808
+	.2byte	0x809
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
-	.uleb128 0x5b
-	.4byte	0x1336a
-	.8byte	.LBB1220
+	.uleb128 0x5c
+	.4byte	0x133f3
+	.8byte	.LBB1216
 	.4byte	.Ldebug_ranges0+0x6a0
 	.byte	0x1
-	.2byte	0x80a
-	.4byte	0x102ba
-	.uleb128 0x54
-	.4byte	0x13385
-	.uleb128 0x54
-	.4byte	0x1337a
+	.2byte	0x80b
+	.4byte	0x10344
+	.uleb128 0x55
+	.4byte	0x1340f
+	.uleb128 0x55
+	.4byte	0x13403
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL326
-	.4byte	0x1460f
-	.uleb128 0x4e
+	.4byte	0x146ac
+	.uleb128 0x4f
 	.8byte	.LVL329
-	.4byte	0x145f9
+	.4byte	0x14696
 	.byte	0
-	.uleb128 0x4f
-	.4byte	.LASF3061
+	.uleb128 0x50
+	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0x7f8
+	.2byte	0x7f9
 	.4byte	0x2ee
-	.8byte	.LFB2837
-	.8byte	.LFE2837-.LFB2837
+	.8byte	.LFB2838
+	.8byte	.LFE2838-.LFB2838
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10341
-	.uleb128 0x58
-	.4byte	.LASF2200
+	.4byte	0x103cb
+	.uleb128 0x59
+	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x7f8
-	.4byte	0xa570
+	.2byte	0x7f9
+	.4byte	0xa5e0
 	.4byte	.LLST92
-	.uleb128 0x58
-	.4byte	.LASF2115
+	.uleb128 0x59
+	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x7f9
-	.4byte	0xb3eb
+	.2byte	0x7fa
+	.4byte	0xb45b
 	.4byte	.LLST93
-	.uleb128 0x51
+	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7fa
+	.2byte	0x7fb
 	.4byte	0x21e
 	.4byte	.LLST94
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x7fc
-	.4byte	0xe4c2
-	.uleb128 0x4e
+	.2byte	0x7fd
+	.4byte	0xe53f
+	.uleb128 0x4f
 	.8byte	.LVL334
-	.4byte	0x1460f
+	.4byte	0x146ac
 	.byte	0
-	.uleb128 0x4f
-	.4byte	.LASF3062
+	.uleb128 0x50
+	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x7ed
+	.2byte	0x7ee
 	.4byte	0x2ee
-	.8byte	.LFB2836
-	.8byte	.LFE2836-.LFB2836
+	.8byte	.LFB2837
+	.8byte	.LFE2837-.LFB2837
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x103ba
-	.uleb128 0x58
-	.4byte	.LASF2200
+	.4byte	0x10444
+	.uleb128 0x59
+	.4byte	.LASF2214
 	.byte	0x1
-	.2byte	0x7ed
-	.4byte	0xa570
+	.2byte	0x7ee
+	.4byte	0xa5e0
 	.4byte	.LLST101
-	.uleb128 0x58
-	.4byte	.LASF2115
+	.uleb128 0x59
+	.4byte	.LASF2129
 	.byte	0x1
-	.2byte	0x7ee
-	.4byte	0xb3eb
+	.2byte	0x7ef
+	.4byte	0xb45b
 	.4byte	.LLST102
-	.uleb128 0x51
+	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7ef
+	.2byte	0x7f0
 	.4byte	0x21e
 	.4byte	.LLST103
-	.uleb128 0x46
-	.4byte	.LASF3063
+	.uleb128 0x48
+	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0x7f1
+	.2byte	0x7f2
 	.4byte	0x56
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL353
-	.4byte	0x14635
-	.uleb128 0x4e
+	.4byte	0x146d2
+	.uleb128 0x4f
 	.8byte	.LVL354
-	.4byte	0x1460f
+	.4byte	0x146ac
 	.byte	0
-	.uleb128 0x63
-	.4byte	.LASF3064
+	.uleb128 0x64
+	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0x7da
+	.2byte	0x7db
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x103e4
-	.uleb128 0x65
+	.4byte	0x1046e
+	.uleb128 0x66
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0x7da
+	.2byte	0x7db
 	.4byte	0x1c7f
-	.uleb128 0x65
-	.4byte	.LASF1273
+	.uleb128 0x66
+	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x7da
-	.4byte	0x555c
+	.2byte	0x7db
+	.4byte	0x55cc
 	.byte	0
-	.uleb128 0x4f
-	.4byte	.LASF3065
+	.uleb128 0x50
+	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0x7ca
+	.2byte	0x7cb
 	.4byte	0xc6
-	.8byte	.LFB2834
-	.8byte	.LFE2834-.LFB2834
+	.8byte	.LFB2835
+	.8byte	.LFE2835-.LFB2835
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1044c
-	.uleb128 0x58
-	.4byte	.LASF1273
+	.4byte	0x104d6
+	.uleb128 0x59
+	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x7ca
-	.4byte	0x555c
+	.2byte	0x7cb
+	.4byte	0x55cc
 	.4byte	.LLST16
-	.uleb128 0x51
+	.uleb128 0x52
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x7ca
-	.4byte	0x3cb5
+	.2byte	0x7cb
+	.4byte	0x3d25
 	.4byte	.LLST17
-	.uleb128 0x46
-	.4byte	.LASF2961
-	.byte	0x1
-	.2byte	0x7cc
-	.4byte	0xe7b3
-	.uleb128 0x46
-	.4byte	.LASF884
+	.uleb128 0x48
+	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x7cd
+	.4byte	0xe830
+	.uleb128 0x48
+	.4byte	.LASF898
+	.byte	0x1
+	.2byte	0x7ce
 	.4byte	0x29
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL82
-	.4byte	0x14641
+	.4byte	0x146de
 	.byte	0
-	.uleb128 0x6a
-	.4byte	.LASF3067
+	.uleb128 0x6b
+	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0x7b3
+	.2byte	0x7b4
 	.4byte	0xc6
-	.4byte	0x10475
-	.uleb128 0x65
+	.4byte	0x104ff
+	.uleb128 0x66
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0x7b3
+	.2byte	0x7b4
 	.4byte	0x1c7f
-	.uleb128 0x65
-	.4byte	.LASF1273
+	.uleb128 0x66
+	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x7b3
-	.4byte	0x555c
+	.2byte	0x7b4
+	.4byte	0x55cc
 	.byte	0
-	.uleb128 0x4f
-	.4byte	.LASF3068
+	.uleb128 0x50
+	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0x7a4
+	.2byte	0x7a5
 	.4byte	0xc6
-	.8byte	.LFB2832
-	.8byte	.LFE2832-.LFB2832
+	.8byte	.LFB2833
+	.8byte	.LFE2833-.LFB2833
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x104de
-	.uleb128 0x58
-	.4byte	.LASF1273
+	.4byte	0x10568
+	.uleb128 0x59
+	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x7a4
-	.4byte	0x555c
+	.2byte	0x7a5
+	.4byte	0x55cc
 	.4byte	.LLST14
-	.uleb128 0x51
+	.uleb128 0x52
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x7a4
-	.4byte	0x3cb5
+	.2byte	0x7a5
+	.4byte	0x3d25
 	.4byte	.LLST15
-	.uleb128 0x46
-	.4byte	.LASF884
+	.uleb128 0x48
+	.4byte	.LASF898
 	.byte	0x1
-	.2byte	0x7a6
+	.2byte	0x7a7
 	.4byte	0x29
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL76
-	.4byte	0x1464e
-	.uleb128 0x4e
+	.4byte	0x146eb
+	.uleb128 0x4f
 	.8byte	.LVL77
-	.4byte	0x14641
+	.4byte	0x146de
 	.byte	0
-	.uleb128 0x4f
-	.4byte	.LASF3069
+	.uleb128 0x50
+	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0x6db
+	.2byte	0x6dc
 	.4byte	0x199
-	.8byte	.LFB2831
-	.8byte	.LFE2831-.LFB2831
+	.8byte	.LFB2832
+	.8byte	.LFE2832-.LFB2832
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11786
-	.uleb128 0x58
-	.4byte	.LASF1273
+	.4byte	0x11810
+	.uleb128 0x59
+	.4byte	.LASF1287
 	.byte	0x1
-	.2byte	0x6db
-	.4byte	0x555c
+	.2byte	0x6dc
+	.4byte	0x55cc
 	.4byte	.LLST18
-	.uleb128 0x51
+	.uleb128 0x52
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0x6db
+	.2byte	0x6dc
 	.4byte	0x6d
 	.4byte	.LLST19
-	.uleb128 0x51
+	.uleb128 0x52
 	.string	"arg"
 	.byte	0x1
-	.2byte	0x6db
+	.2byte	0x6dc
 	.4byte	0x29
 	.4byte	.LLST20
-	.uleb128 0x46
-	.4byte	.LASF3070
-	.byte	0x1
-	.2byte	0x6dd
-	.4byte	0x458
-	.uleb128 0x46
-	.4byte	.LASF3004
+	.uleb128 0x48
+	.4byte	.LASF3085
 	.byte	0x1
 	.2byte	0x6de
-	.4byte	0xe16c
-	.uleb128 0x46
-	.4byte	.LASF2961
+	.4byte	0x458
+	.uleb128 0x48
+	.4byte	.LASF3019
 	.byte	0x1
 	.2byte	0x6df
-	.4byte	0xe7b3
-	.uleb128 0x4c
-	.4byte	.LASF3071
+	.4byte	0xe1dc
+	.uleb128 0x48
+	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x6e0
-	.4byte	0xda12
+	.4byte	0xe830
+	.uleb128 0x4d
+	.4byte	.LASF3086
+	.byte	0x1
+	.2byte	0x6e1
+	.4byte	0xda82
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 -56
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6e1
-	.4byte	0xe45d
-	.uleb128 0x46
-	.4byte	.LASF3072
-	.byte	0x1
 	.2byte	0x6e2
-	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF3073
+	.4byte	0xe4da
+	.uleb128 0x48
+	.4byte	.LASF3087
 	.byte	0x1
 	.2byte	0x6e3
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF3088
+	.byte	0x1
+	.2byte	0x6e4
 	.4byte	0x29
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x6e4
+	.2byte	0x6e5
 	.4byte	0xc6
-	.uleb128 0x55
-	.4byte	.LASF3032
-	.4byte	0x11796
+	.uleb128 0x56
+	.4byte	.LASF3047
+	.4byte	0x11820
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34990
-	.uleb128 0x62
+	.8byte	__func__.34997
+	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x1a0
-	.4byte	0x10648
-	.uleb128 0x46
-	.4byte	.LASF3074
+	.4byte	0x106d2
+	.uleb128 0x48
+	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x72e
+	.2byte	0x72f
 	.4byte	0xc6
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1a0
-	.uleb128 0x6b
-	.4byte	.LASF3086
+	.uleb128 0x6c
+	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x72e
+	.2byte	0x72f
 	.8byte	.L216
-	.uleb128 0x4c
-	.4byte	.LASF3075
+	.uleb128 0x4d
+	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x72e
+	.2byte	0x72f
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -96
-	.uleb128 0x46
-	.4byte	.LASF3074
+	.uleb128 0x48
+	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x72e
+	.2byte	0x72f
 	.4byte	0x199
-	.uleb128 0x6c
-	.8byte	.LBB1010
-	.8byte	.LBE1010-.LBB1010
-	.4byte	0x1062c
-	.uleb128 0x59
-	.4byte	.LASF3076
+	.uleb128 0x6d
+	.8byte	.LBB1006
+	.8byte	.LBE1006-.LBB1006
+	.4byte	0x106b6
+	.uleb128 0x5a
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x72e
+	.2byte	0x72f
 	.4byte	0x199
 	.4byte	.LLST35
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL127
-	.4byte	0x1465a
-	.uleb128 0x4e
+	.4byte	0x146f7
+	.uleb128 0x4f
 	.8byte	.LVL128
-	.4byte	0x14666
+	.4byte	0x14703
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL125
-	.4byte	0x14673
-	.uleb128 0x4e
+	.4byte	0x14710
+	.uleb128 0x4f
 	.8byte	.LVL129
-	.4byte	0x1467f
+	.4byte	0x1471c
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x13464
-	.8byte	.LBB946
+	.uleb128 0x5c
+	.4byte	0x134f7
+	.8byte	.LBB942
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x796
-	.4byte	0x10868
-	.uleb128 0x54
-	.4byte	0x13489
-	.uleb128 0x54
-	.4byte	0x1347e
-	.uleb128 0x54
-	.4byte	0x13474
-	.uleb128 0x6d
-	.4byte	0x134c2
-	.8byte	.LBB947
+	.2byte	0x797
+	.4byte	0x108f2
+	.uleb128 0x55
+	.4byte	0x1351d
+	.uleb128 0x55
+	.4byte	0x13511
+	.uleb128 0x55
+	.4byte	0x13507
+	.uleb128 0x6e
+	.4byte	0x13557
+	.8byte	.LBB943
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
-	.uleb128 0x54
-	.4byte	0x134e7
-	.uleb128 0x54
-	.4byte	0x134dc
-	.uleb128 0x54
-	.4byte	0x134d2
-	.uleb128 0x6e
-	.4byte	0x1355f
-	.8byte	.LBB949
+	.uleb128 0x55
+	.4byte	0x1357d
+	.uleb128 0x55
+	.4byte	0x13571
+	.uleb128 0x55
+	.4byte	0x13567
+	.uleb128 0x6f
+	.4byte	0x135f6
+	.8byte	.LBB945
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x1079e
-	.uleb128 0x54
-	.4byte	0x1357a
-	.uleb128 0x6f
-	.4byte	0x1356f
+	.4byte	0x10828
+	.uleb128 0x55
+	.4byte	0x13612
+	.uleb128 0x70
+	.4byte	0x13606
 	.4byte	.LLST21
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x80
-	.uleb128 0x60
-	.4byte	0x13585
+	.uleb128 0x61
+	.4byte	0x1361e
 	.4byte	.LLST22
-	.uleb128 0x60
-	.4byte	0x13590
+	.uleb128 0x61
+	.4byte	0x13629
 	.4byte	.LLST23
-	.uleb128 0x70
-	.4byte	0x139b8
-	.8byte	.LBB951
-	.8byte	.LBE951-.LBB951
+	.uleb128 0x71
+	.4byte	0x13a41
+	.8byte	.LBB947
+	.8byte	.LBE947-.LBB947
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10704
-	.uleb128 0x56
-	.8byte	.LBB952
-	.8byte	.LBE952-.LBB952
-	.uleb128 0x60
-	.4byte	0x139c8
+	.4byte	0x1078e
+	.uleb128 0x57
+	.8byte	.LBB948
+	.8byte	.LBE948-.LBB948
+	.uleb128 0x61
+	.4byte	0x13a51
 	.4byte	.LLST24
 	.byte	0
 	.byte	0
-	.uleb128 0x70
-	.4byte	0x1398c
-	.8byte	.LBB953
-	.8byte	.LBE953-.LBB953
+	.uleb128 0x71
+	.4byte	0x13a14
+	.8byte	.LBB949
+	.8byte	.LBE949-.LBB949
 	.byte	0x6
 	.byte	0x55
-	.4byte	0x1074c
-	.uleb128 0x54
-	.4byte	0x139a6
-	.uleb128 0x54
-	.4byte	0x1399c
-	.uleb128 0x5c
-	.4byte	0x13ac5
-	.8byte	.LBB954
-	.8byte	.LBE954-.LBB954
+	.4byte	0x107d6
+	.uleb128 0x55
+	.4byte	0x13a2e
+	.uleb128 0x55
+	.4byte	0x13a24
+	.uleb128 0x5d
+	.4byte	0x13b51
+	.8byte	.LBB950
+	.8byte	.LBE950-.LBB950
 	.byte	0xca
 	.byte	0x61
-	.uleb128 0x54
-	.4byte	0x13adf
-	.uleb128 0x54
-	.4byte	0x13ad5
+	.uleb128 0x55
+	.4byte	0x13b6b
+	.uleb128 0x55
+	.4byte	0x13b61
 	.byte	0
 	.byte	0
-	.uleb128 0x56
-	.8byte	.LBB956
-	.8byte	.LBE956-.LBB956
 	.uleb128 0x57
-	.4byte	0x1359c
-	.uleb128 0x5c
-	.4byte	0x13a3d
-	.8byte	.LBB957
-	.8byte	.LBE957-.LBB957
+	.8byte	.LBB952
+	.8byte	.LBE952-.LBB952
+	.uleb128 0x58
+	.4byte	0x13635
+	.uleb128 0x5d
+	.4byte	0x13ac7
+	.8byte	.LBB953
+	.8byte	.LBE953-.LBB953
 	.byte	0x6
 	.byte	0x56
-	.uleb128 0x54
-	.4byte	0x13a58
-	.uleb128 0x54
-	.4byte	0x13a4d
-	.uleb128 0x56
-	.8byte	.LBB958
-	.8byte	.LBE958-.LBB958
+	.uleb128 0x55
+	.4byte	0x13ae3
+	.uleb128 0x55
+	.4byte	0x13ad7
 	.uleb128 0x57
-	.4byte	0x13a63
+	.8byte	.LBB954
+	.8byte	.LBE954-.LBB954
+	.uleb128 0x58
+	.4byte	0x13aef
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x70
-	.4byte	0x1352b
-	.8byte	.LBB963
-	.8byte	.LBE963-.LBB963
+	.uleb128 0x71
+	.4byte	0x135c2
+	.8byte	.LBB959
+	.8byte	.LBE959-.LBB959
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x10859
-	.uleb128 0x54
-	.4byte	0x1353b
-	.uleb128 0x56
-	.8byte	.LBB964
-	.8byte	.LBE964-.LBB964
-	.uleb128 0x60
-	.4byte	0x13546
+	.4byte	0x108e3
+	.uleb128 0x55
+	.4byte	0x135d2
+	.uleb128 0x57
+	.8byte	.LBB960
+	.8byte	.LBE960-.LBB960
+	.uleb128 0x61
+	.4byte	0x135dd
 	.4byte	.LLST25
-	.uleb128 0x62
+	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0xc0
-	.4byte	0x10824
-	.uleb128 0x60
-	.4byte	0x13552
+	.4byte	0x108ae
+	.uleb128 0x61
+	.4byte	0x135e9
 	.4byte	.LLST26
-	.uleb128 0x5c
-	.4byte	0x13a3d
-	.8byte	.LBB966
-	.8byte	.LBE966-.LBB966
+	.uleb128 0x5d
+	.4byte	0x13ac7
+	.8byte	.LBB962
+	.8byte	.LBE962-.LBB962
 	.byte	0x6
 	.byte	0xfe
-	.uleb128 0x54
-	.4byte	0x13a58
-	.uleb128 0x54
-	.4byte	0x13a4d
-	.uleb128 0x56
-	.8byte	.LBB967
-	.8byte	.LBE967-.LBB967
+	.uleb128 0x55
+	.4byte	0x13ae3
+	.uleb128 0x55
+	.4byte	0x13ad7
 	.uleb128 0x57
-	.4byte	0x13a63
+	.8byte	.LBB963
+	.8byte	.LBE963-.LBB963
+	.uleb128 0x58
+	.4byte	0x13aef
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
-	.4byte	0x139b8
-	.8byte	.LBB968
-	.8byte	.LBE968-.LBB968
+	.uleb128 0x5d
+	.4byte	0x13a41
+	.8byte	.LBB964
+	.8byte	.LBE964-.LBB964
 	.byte	0x6
 	.byte	0xfd
-	.uleb128 0x56
-	.8byte	.LBB969
-	.8byte	.LBE969-.LBB969
-	.uleb128 0x60
-	.4byte	0x139c8
+	.uleb128 0x57
+	.8byte	.LBB965
+	.8byte	.LBE965-.LBB965
+	.uleb128 0x61
+	.4byte	0x13a51
 	.4byte	.LLST27
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL155
-	.4byte	0x1468c
+	.4byte	0x14729
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x13493
-	.8byte	.LBB979
+	.uleb128 0x5c
+	.4byte	0x13527
+	.8byte	.LBB975
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
-	.2byte	0x719
-	.4byte	0x10a93
-	.uleb128 0x54
-	.4byte	0x134b8
-	.uleb128 0x54
-	.4byte	0x134ad
-	.uleb128 0x54
-	.4byte	0x134a3
-	.uleb128 0x6d
-	.4byte	0x134f1
-	.8byte	.LBB980
+	.2byte	0x71a
+	.4byte	0x10b1d
+	.uleb128 0x55
+	.4byte	0x1354d
+	.uleb128 0x55
+	.4byte	0x13541
+	.uleb128 0x55
+	.4byte	0x13537
+	.uleb128 0x6e
+	.4byte	0x13587
+	.8byte	.LBB976
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
-	.uleb128 0x54
-	.4byte	0x13516
-	.uleb128 0x54
-	.4byte	0x1350b
-	.uleb128 0x54
-	.4byte	0x13501
-	.uleb128 0x5e
+	.uleb128 0x55
+	.4byte	0x135ad
+	.uleb128 0x55
+	.4byte	0x135a1
+	.uleb128 0x55
+	.4byte	0x13597
+	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xf0
-	.uleb128 0x57
-	.4byte	0x1351f
-	.uleb128 0x6e
-	.4byte	0x1355f
-	.8byte	.LBB982
+	.uleb128 0x58
+	.4byte	0x135b6
+	.uleb128 0x6f
+	.4byte	0x135f6
+	.8byte	.LBB978
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x109c8
-	.uleb128 0x54
-	.4byte	0x1357a
-	.uleb128 0x6f
-	.4byte	0x1356f
+	.4byte	0x10a52
+	.uleb128 0x55
+	.4byte	0x13612
+	.uleb128 0x70
+	.4byte	0x13606
 	.4byte	.LLST28
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x130
-	.uleb128 0x60
-	.4byte	0x13585
+	.uleb128 0x61
+	.4byte	0x1361e
 	.4byte	.LLST29
-	.uleb128 0x60
-	.4byte	0x13590
+	.uleb128 0x61
+	.4byte	0x13629
 	.4byte	.LLST30
-	.uleb128 0x70
-	.4byte	0x139b8
-	.8byte	.LBB984
-	.8byte	.LBE984-.LBB984
+	.uleb128 0x71
+	.4byte	0x13a41
+	.8byte	.LBB980
+	.8byte	.LBE980-.LBB980
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x1092e
-	.uleb128 0x56
-	.8byte	.LBB985
-	.8byte	.LBE985-.LBB985
-	.uleb128 0x60
-	.4byte	0x139c8
+	.4byte	0x109b8
+	.uleb128 0x57
+	.8byte	.LBB981
+	.8byte	.LBE981-.LBB981
+	.uleb128 0x61
+	.4byte	0x13a51
 	.4byte	.LLST31
 	.byte	0
 	.byte	0
-	.uleb128 0x6c
-	.8byte	.LBB986
-	.8byte	.LBE986-.LBB986
-	.4byte	0x10982
-	.uleb128 0x57
-	.4byte	0x1359c
-	.uleb128 0x5c
-	.4byte	0x13a3d
-	.8byte	.LBB987
-	.8byte	.LBE987-.LBB987
+	.uleb128 0x6d
+	.8byte	.LBB982
+	.8byte	.LBE982-.LBB982
+	.4byte	0x10a0c
+	.uleb128 0x58
+	.4byte	0x13635
+	.uleb128 0x5d
+	.4byte	0x13ac7
+	.8byte	.LBB983
+	.8byte	.LBE983-.LBB983
 	.byte	0x6
 	.byte	0x56
-	.uleb128 0x54
-	.4byte	0x13a58
-	.uleb128 0x54
-	.4byte	0x13a4d
-	.uleb128 0x56
-	.8byte	.LBB988
-	.8byte	.LBE988-.LBB988
+	.uleb128 0x55
+	.4byte	0x13ae3
+	.uleb128 0x55
+	.4byte	0x13ad7
 	.uleb128 0x57
-	.4byte	0x13a63
+	.8byte	.LBB984
+	.8byte	.LBE984-.LBB984
+	.uleb128 0x58
+	.4byte	0x13aef
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
-	.4byte	0x1398c
-	.8byte	.LBB989
-	.8byte	.LBE989-.LBB989
+	.uleb128 0x5d
+	.4byte	0x13a14
+	.8byte	.LBB985
+	.8byte	.LBE985-.LBB985
 	.byte	0x6
 	.byte	0x55
-	.uleb128 0x54
-	.4byte	0x139a6
-	.uleb128 0x54
-	.4byte	0x1399c
-	.uleb128 0x5c
-	.4byte	0x13ac5
-	.8byte	.LBB990
-	.8byte	.LBE990-.LBB990
+	.uleb128 0x55
+	.4byte	0x13a2e
+	.uleb128 0x55
+	.4byte	0x13a24
+	.uleb128 0x5d
+	.4byte	0x13b51
+	.8byte	.LBB986
+	.8byte	.LBE986-.LBB986
 	.byte	0xca
 	.byte	0x61
-	.uleb128 0x54
-	.4byte	0x13adf
-	.uleb128 0x54
-	.4byte	0x13ad5
+	.uleb128 0x55
+	.4byte	0x13b6b
+	.uleb128 0x55
+	.4byte	0x13b61
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x70
-	.4byte	0x1352b
-	.8byte	.LBB994
-	.8byte	.LBE994-.LBB994
+	.uleb128 0x71
+	.4byte	0x135c2
+	.8byte	.LBB990
+	.8byte	.LBE990-.LBB990
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10a83
-	.uleb128 0x54
-	.4byte	0x1353b
-	.uleb128 0x56
-	.8byte	.LBB995
-	.8byte	.LBE995-.LBB995
-	.uleb128 0x60
-	.4byte	0x13546
+	.4byte	0x10b0d
+	.uleb128 0x55
+	.4byte	0x135d2
+	.uleb128 0x57
+	.8byte	.LBB991
+	.8byte	.LBE991-.LBB991
+	.uleb128 0x61
+	.4byte	0x135dd
 	.4byte	.LLST32
-	.uleb128 0x62
+	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x170
-	.4byte	0x10a4e
-	.uleb128 0x60
-	.4byte	0x13552
+	.4byte	0x10ad8
+	.uleb128 0x61
+	.4byte	0x135e9
 	.4byte	.LLST33
-	.uleb128 0x5c
-	.4byte	0x13a3d
-	.8byte	.LBB997
-	.8byte	.LBE997-.LBB997
+	.uleb128 0x5d
+	.4byte	0x13ac7
+	.8byte	.LBB993
+	.8byte	.LBE993-.LBB993
 	.byte	0x6
 	.byte	0xfe
-	.uleb128 0x54
-	.4byte	0x13a58
-	.uleb128 0x54
-	.4byte	0x13a4d
-	.uleb128 0x56
-	.8byte	.LBB998
-	.8byte	.LBE998-.LBB998
+	.uleb128 0x55
+	.4byte	0x13ae3
+	.uleb128 0x55
+	.4byte	0x13ad7
 	.uleb128 0x57
-	.4byte	0x13a63
+	.8byte	.LBB994
+	.8byte	.LBE994-.LBB994
+	.uleb128 0x58
+	.4byte	0x13aef
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
-	.4byte	0x139b8
-	.8byte	.LBB999
-	.8byte	.LBE999-.LBB999
+	.uleb128 0x5d
+	.4byte	0x13a41
+	.8byte	.LBB995
+	.8byte	.LBE995-.LBB995
 	.byte	0x6
 	.byte	0xfd
-	.uleb128 0x56
-	.8byte	.LBB1000
-	.8byte	.LBE1000-.LBB1000
-	.uleb128 0x60
-	.4byte	0x139c8
+	.uleb128 0x57
+	.8byte	.LBB996
+	.8byte	.LBE996-.LBB996
+	.uleb128 0x61
+	.4byte	0x13a51
 	.4byte	.LLST34
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL120
-	.4byte	0x14699
+	.4byte	0x14736
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x13493
-	.8byte	.LBB1014
+	.uleb128 0x5c
+	.4byte	0x13527
+	.8byte	.LBB1010
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
-	.2byte	0x735
-	.4byte	0x10cbe
-	.uleb128 0x54
-	.4byte	0x134b8
-	.uleb128 0x54
-	.4byte	0x134ad
-	.uleb128 0x54
-	.4byte	0x134a3
-	.uleb128 0x6d
-	.4byte	0x134f1
-	.8byte	.LBB1015
+	.2byte	0x736
+	.4byte	0x10d48
+	.uleb128 0x55
+	.4byte	0x1354d
+	.uleb128 0x55
+	.4byte	0x13541
+	.uleb128 0x55
+	.4byte	0x13537
+	.uleb128 0x6e
+	.4byte	0x13587
+	.8byte	.LBB1011
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
-	.uleb128 0x54
-	.4byte	0x13516
-	.uleb128 0x54
-	.4byte	0x1350b
-	.uleb128 0x54
-	.4byte	0x13501
-	.uleb128 0x5e
+	.uleb128 0x55
+	.4byte	0x135ad
+	.uleb128 0x55
+	.4byte	0x135a1
+	.uleb128 0x55
+	.4byte	0x13597
+	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x1f0
-	.uleb128 0x57
-	.4byte	0x1351f
-	.uleb128 0x6e
-	.4byte	0x1355f
-	.8byte	.LBB1017
+	.uleb128 0x58
+	.4byte	0x135b6
+	.uleb128 0x6f
+	.4byte	0x135f6
+	.8byte	.LBB1013
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x10bf3
-	.uleb128 0x54
-	.4byte	0x1357a
-	.uleb128 0x6f
-	.4byte	0x1356f
+	.4byte	0x10c7d
+	.uleb128 0x55
+	.4byte	0x13612
+	.uleb128 0x70
+	.4byte	0x13606
 	.4byte	.LLST36
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x230
-	.uleb128 0x60
-	.4byte	0x13585
+	.uleb128 0x61
+	.4byte	0x1361e
 	.4byte	.LLST37
-	.uleb128 0x60
-	.4byte	0x13590
+	.uleb128 0x61
+	.4byte	0x13629
 	.4byte	.LLST38
-	.uleb128 0x70
-	.4byte	0x139b8
-	.8byte	.LBB1019
-	.8byte	.LBE1019-.LBB1019
+	.uleb128 0x71
+	.4byte	0x13a41
+	.8byte	.LBB1015
+	.8byte	.LBE1015-.LBB1015
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10b59
-	.uleb128 0x56
-	.8byte	.LBB1020
-	.8byte	.LBE1020-.LBB1020
-	.uleb128 0x60
-	.4byte	0x139c8
+	.4byte	0x10be3
+	.uleb128 0x57
+	.8byte	.LBB1016
+	.8byte	.LBE1016-.LBB1016
+	.uleb128 0x61
+	.4byte	0x13a51
 	.4byte	.LLST39
 	.byte	0
 	.byte	0
-	.uleb128 0x6c
-	.8byte	.LBB1021
-	.8byte	.LBE1021-.LBB1021
-	.4byte	0x10bad
-	.uleb128 0x57
-	.4byte	0x1359c
-	.uleb128 0x5c
-	.4byte	0x13a3d
-	.8byte	.LBB1022
-	.8byte	.LBE1022-.LBB1022
+	.uleb128 0x6d
+	.8byte	.LBB1017
+	.8byte	.LBE1017-.LBB1017
+	.4byte	0x10c37
+	.uleb128 0x58
+	.4byte	0x13635
+	.uleb128 0x5d
+	.4byte	0x13ac7
+	.8byte	.LBB1018
+	.8byte	.LBE1018-.LBB1018
 	.byte	0x6
 	.byte	0x56
-	.uleb128 0x54
-	.4byte	0x13a58
-	.uleb128 0x54
-	.4byte	0x13a4d
-	.uleb128 0x56
-	.8byte	.LBB1023
-	.8byte	.LBE1023-.LBB1023
+	.uleb128 0x55
+	.4byte	0x13ae3
+	.uleb128 0x55
+	.4byte	0x13ad7
 	.uleb128 0x57
-	.4byte	0x13a63
+	.8byte	.LBB1019
+	.8byte	.LBE1019-.LBB1019
+	.uleb128 0x58
+	.4byte	0x13aef
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
-	.4byte	0x1398c
-	.8byte	.LBB1024
-	.8byte	.LBE1024-.LBB1024
+	.uleb128 0x5d
+	.4byte	0x13a14
+	.8byte	.LBB1020
+	.8byte	.LBE1020-.LBB1020
 	.byte	0x6
 	.byte	0x55
-	.uleb128 0x54
-	.4byte	0x139a6
-	.uleb128 0x54
-	.4byte	0x1399c
-	.uleb128 0x5c
-	.4byte	0x13ac5
-	.8byte	.LBB1025
-	.8byte	.LBE1025-.LBB1025
+	.uleb128 0x55
+	.4byte	0x13a2e
+	.uleb128 0x55
+	.4byte	0x13a24
+	.uleb128 0x5d
+	.4byte	0x13b51
+	.8byte	.LBB1021
+	.8byte	.LBE1021-.LBB1021
 	.byte	0xca
 	.byte	0x61
-	.uleb128 0x54
-	.4byte	0x13adf
-	.uleb128 0x54
-	.4byte	0x13ad5
+	.uleb128 0x55
+	.4byte	0x13b6b
+	.uleb128 0x55
+	.4byte	0x13b61
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x70
-	.4byte	0x1352b
-	.8byte	.LBB1029
-	.8byte	.LBE1029-.LBB1029
+	.uleb128 0x71
+	.4byte	0x135c2
+	.8byte	.LBB1025
+	.8byte	.LBE1025-.LBB1025
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10cae
-	.uleb128 0x54
-	.4byte	0x1353b
-	.uleb128 0x56
-	.8byte	.LBB1030
-	.8byte	.LBE1030-.LBB1030
-	.uleb128 0x60
-	.4byte	0x13546
+	.4byte	0x10d38
+	.uleb128 0x55
+	.4byte	0x135d2
+	.uleb128 0x57
+	.8byte	.LBB1026
+	.8byte	.LBE1026-.LBB1026
+	.uleb128 0x61
+	.4byte	0x135dd
 	.4byte	.LLST40
-	.uleb128 0x62
+	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x270
-	.4byte	0x10c79
-	.uleb128 0x60
-	.4byte	0x13552
+	.4byte	0x10d03
+	.uleb128 0x61
+	.4byte	0x135e9
 	.4byte	.LLST41
-	.uleb128 0x5c
-	.4byte	0x13a3d
-	.8byte	.LBB1032
-	.8byte	.LBE1032-.LBB1032
+	.uleb128 0x5d
+	.4byte	0x13ac7
+	.8byte	.LBB1028
+	.8byte	.LBE1028-.LBB1028
 	.byte	0x6
 	.byte	0xfe
-	.uleb128 0x54
-	.4byte	0x13a58
-	.uleb128 0x54
-	.4byte	0x13a4d
-	.uleb128 0x56
-	.8byte	.LBB1033
-	.8byte	.LBE1033-.LBB1033
+	.uleb128 0x55
+	.4byte	0x13ae3
+	.uleb128 0x55
+	.4byte	0x13ad7
 	.uleb128 0x57
-	.4byte	0x13a63
+	.8byte	.LBB1029
+	.8byte	.LBE1029-.LBB1029
+	.uleb128 0x58
+	.4byte	0x13aef
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
-	.4byte	0x139b8
-	.8byte	.LBB1034
-	.8byte	.LBE1034-.LBB1034
+	.uleb128 0x5d
+	.4byte	0x13a41
+	.8byte	.LBB1030
+	.8byte	.LBE1030-.LBB1030
 	.byte	0x6
 	.byte	0xfd
-	.uleb128 0x56
-	.8byte	.LBB1035
-	.8byte	.LBE1035-.LBB1035
-	.uleb128 0x60
-	.4byte	0x139c8
+	.uleb128 0x57
+	.8byte	.LBB1031
+	.8byte	.LBE1031-.LBB1031
+	.uleb128 0x61
+	.4byte	0x13a51
 	.4byte	.LLST42
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL144
-	.4byte	0x14699
+	.4byte	0x14736
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x13464
-	.8byte	.LBB1044
+	.uleb128 0x5c
+	.4byte	0x134f7
+	.8byte	.LBB1040
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
-	.2byte	0x703
-	.4byte	0x10ede
-	.uleb128 0x54
-	.4byte	0x13489
-	.uleb128 0x54
-	.4byte	0x1347e
-	.uleb128 0x54
-	.4byte	0x13474
-	.uleb128 0x6d
-	.4byte	0x134c2
-	.8byte	.LBB1045
+	.2byte	0x704
+	.4byte	0x10f68
+	.uleb128 0x55
+	.4byte	0x1351d
+	.uleb128 0x55
+	.4byte	0x13511
+	.uleb128 0x55
+	.4byte	0x13507
+	.uleb128 0x6e
+	.4byte	0x13557
+	.8byte	.LBB1041
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
-	.uleb128 0x54
-	.4byte	0x134e7
-	.uleb128 0x54
-	.4byte	0x134dc
-	.uleb128 0x54
-	.4byte	0x134d2
-	.uleb128 0x6e
-	.4byte	0x1355f
-	.8byte	.LBB1047
+	.uleb128 0x55
+	.4byte	0x1357d
+	.uleb128 0x55
+	.4byte	0x13571
+	.uleb128 0x55
+	.4byte	0x13567
+	.uleb128 0x6f
+	.4byte	0x135f6
+	.8byte	.LBB1043
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10e14
-	.uleb128 0x54
-	.4byte	0x1357a
-	.uleb128 0x6f
-	.4byte	0x1356f
+	.4byte	0x10e9e
+	.uleb128 0x55
+	.4byte	0x13612
+	.uleb128 0x70
+	.4byte	0x13606
 	.4byte	.LLST43
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x2f0
-	.uleb128 0x60
-	.4byte	0x13585
+	.uleb128 0x61
+	.4byte	0x1361e
 	.4byte	.LLST44
-	.uleb128 0x60
-	.4byte	0x13590
+	.uleb128 0x61
+	.4byte	0x13629
 	.4byte	.LLST45
-	.uleb128 0x70
-	.4byte	0x139b8
-	.8byte	.LBB1049
-	.8byte	.LBE1049-.LBB1049
+	.uleb128 0x71
+	.4byte	0x13a41
+	.8byte	.LBB1045
+	.8byte	.LBE1045-.LBB1045
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10d7a
-	.uleb128 0x56
-	.8byte	.LBB1050
-	.8byte	.LBE1050-.LBB1050
-	.uleb128 0x60
-	.4byte	0x139c8
+	.4byte	0x10e04
+	.uleb128 0x57
+	.8byte	.LBB1046
+	.8byte	.LBE1046-.LBB1046
+	.uleb128 0x61
+	.4byte	0x13a51
 	.4byte	.LLST46
 	.byte	0
 	.byte	0
-	.uleb128 0x6c
-	.8byte	.LBB1051
-	.8byte	.LBE1051-.LBB1051
-	.4byte	0x10dce
-	.uleb128 0x57
-	.4byte	0x1359c
-	.uleb128 0x5c
-	.4byte	0x13a3d
-	.8byte	.LBB1052
-	.8byte	.LBE1052-.LBB1052
+	.uleb128 0x6d
+	.8byte	.LBB1047
+	.8byte	.LBE1047-.LBB1047
+	.4byte	0x10e58
+	.uleb128 0x58
+	.4byte	0x13635
+	.uleb128 0x5d
+	.4byte	0x13ac7
+	.8byte	.LBB1048
+	.8byte	.LBE1048-.LBB1048
 	.byte	0x6
 	.byte	0x56
-	.uleb128 0x54
-	.4byte	0x13a58
-	.uleb128 0x54
-	.4byte	0x13a4d
-	.uleb128 0x56
-	.8byte	.LBB1053
-	.8byte	.LBE1053-.LBB1053
+	.uleb128 0x55
+	.4byte	0x13ae3
+	.uleb128 0x55
+	.4byte	0x13ad7
 	.uleb128 0x57
-	.4byte	0x13a63
+	.8byte	.LBB1049
+	.8byte	.LBE1049-.LBB1049
+	.uleb128 0x58
+	.4byte	0x13aef
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
-	.4byte	0x1398c
-	.8byte	.LBB1054
-	.8byte	.LBE1054-.LBB1054
+	.uleb128 0x5d
+	.4byte	0x13a14
+	.8byte	.LBB1050
+	.8byte	.LBE1050-.LBB1050
 	.byte	0x6
 	.byte	0x55
-	.uleb128 0x54
-	.4byte	0x139a6
-	.uleb128 0x54
-	.4byte	0x1399c
-	.uleb128 0x5c
-	.4byte	0x13ac5
-	.8byte	.LBB1055
-	.8byte	.LBE1055-.LBB1055
+	.uleb128 0x55
+	.4byte	0x13a2e
+	.uleb128 0x55
+	.4byte	0x13a24
+	.uleb128 0x5d
+	.4byte	0x13b51
+	.8byte	.LBB1051
+	.8byte	.LBE1051-.LBB1051
 	.byte	0xca
 	.byte	0x61
-	.uleb128 0x54
-	.4byte	0x13adf
-	.uleb128 0x54
-	.4byte	0x13ad5
+	.uleb128 0x55
+	.4byte	0x13b6b
+	.uleb128 0x55
+	.4byte	0x13b61
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x70
-	.4byte	0x1352b
-	.8byte	.LBB1061
-	.8byte	.LBE1061-.LBB1061
+	.uleb128 0x71
+	.4byte	0x135c2
+	.8byte	.LBB1057
+	.8byte	.LBE1057-.LBB1057
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x10ecf
-	.uleb128 0x54
-	.4byte	0x1353b
-	.uleb128 0x56
-	.8byte	.LBB1062
-	.8byte	.LBE1062-.LBB1062
-	.uleb128 0x60
-	.4byte	0x13546
+	.4byte	0x10f59
+	.uleb128 0x55
+	.4byte	0x135d2
+	.uleb128 0x57
+	.8byte	.LBB1058
+	.8byte	.LBE1058-.LBB1058
+	.uleb128 0x61
+	.4byte	0x135dd
 	.4byte	.LLST47
-	.uleb128 0x62
+	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x340
-	.4byte	0x10e9a
-	.uleb128 0x60
-	.4byte	0x13552
+	.4byte	0x10f24
+	.uleb128 0x61
+	.4byte	0x135e9
 	.4byte	.LLST48
-	.uleb128 0x5c
-	.4byte	0x13a3d
-	.8byte	.LBB1064
-	.8byte	.LBE1064-.LBB1064
+	.uleb128 0x5d
+	.4byte	0x13ac7
+	.8byte	.LBB1060
+	.8byte	.LBE1060-.LBB1060
 	.byte	0x6
 	.byte	0xfe
-	.uleb128 0x54
-	.4byte	0x13a58
-	.uleb128 0x54
-	.4byte	0x13a4d
-	.uleb128 0x56
-	.8byte	.LBB1065
-	.8byte	.LBE1065-.LBB1065
+	.uleb128 0x55
+	.4byte	0x13ae3
+	.uleb128 0x55
+	.4byte	0x13ad7
 	.uleb128 0x57
-	.4byte	0x13a63
+	.8byte	.LBB1061
+	.8byte	.LBE1061-.LBB1061
+	.uleb128 0x58
+	.4byte	0x13aef
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
-	.4byte	0x139b8
-	.8byte	.LBB1066
-	.8byte	.LBE1066-.LBB1066
+	.uleb128 0x5d
+	.4byte	0x13a41
+	.8byte	.LBB1062
+	.8byte	.LBE1062-.LBB1062
 	.byte	0x6
 	.byte	0xfd
-	.uleb128 0x56
-	.8byte	.LBB1067
-	.8byte	.LBE1067-.LBB1067
-	.uleb128 0x60
-	.4byte	0x139c8
+	.uleb128 0x57
+	.8byte	.LBB1063
+	.8byte	.LBE1063-.LBB1063
+	.uleb128 0x61
+	.4byte	0x13a51
 	.4byte	.LLST49
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL171
-	.4byte	0x1468c
+	.4byte	0x14729
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x13493
-	.8byte	.LBB1078
+	.uleb128 0x5c
+	.4byte	0x13527
+	.8byte	.LBB1074
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
-	.2byte	0x752
-	.4byte	0x1111a
-	.uleb128 0x54
-	.4byte	0x134b8
-	.uleb128 0x54
-	.4byte	0x134ad
-	.uleb128 0x54
-	.4byte	0x134a3
-	.uleb128 0x6d
-	.4byte	0x134f1
-	.8byte	.LBB1079
+	.2byte	0x753
+	.4byte	0x111a4
+	.uleb128 0x55
+	.4byte	0x1354d
+	.uleb128 0x55
+	.4byte	0x13541
+	.uleb128 0x55
+	.4byte	0x13537
+	.uleb128 0x6e
+	.4byte	0x13587
+	.8byte	.LBB1075
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
-	.uleb128 0x54
-	.4byte	0x13516
-	.uleb128 0x54
-	.4byte	0x1350b
-	.uleb128 0x54
-	.4byte	0x13501
-	.uleb128 0x5e
+	.uleb128 0x55
+	.4byte	0x135ad
+	.uleb128 0x55
+	.4byte	0x135a1
+	.uleb128 0x55
+	.4byte	0x13597
+	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x370
-	.uleb128 0x60
-	.4byte	0x1351f
+	.uleb128 0x61
+	.4byte	0x135b6
 	.4byte	.LLST50
-	.uleb128 0x6e
-	.4byte	0x1355f
-	.8byte	.LBB1081
+	.uleb128 0x6f
+	.4byte	0x135f6
+	.8byte	.LBB1077
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x11042
-	.uleb128 0x54
-	.4byte	0x1357a
-	.uleb128 0x6f
-	.4byte	0x1356f
+	.4byte	0x110cc
+	.uleb128 0x55
+	.4byte	0x13612
+	.uleb128 0x70
+	.4byte	0x13606
 	.4byte	.LLST51
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x3d0
-	.uleb128 0x60
-	.4byte	0x13585
+	.uleb128 0x61
+	.4byte	0x1361e
 	.4byte	.LLST52
-	.uleb128 0x60
-	.4byte	0x13590
+	.uleb128 0x61
+	.4byte	0x13629
 	.4byte	.LLST53
-	.uleb128 0x70
-	.4byte	0x139b8
-	.8byte	.LBB1083
-	.8byte	.LBE1083-.LBB1083
+	.uleb128 0x71
+	.4byte	0x13a41
+	.8byte	.LBB1079
+	.8byte	.LBE1079-.LBB1079
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10fa8
-	.uleb128 0x56
-	.8byte	.LBB1084
-	.8byte	.LBE1084-.LBB1084
-	.uleb128 0x60
-	.4byte	0x139c8
+	.4byte	0x11032
+	.uleb128 0x57
+	.8byte	.LBB1080
+	.8byte	.LBE1080-.LBB1080
+	.uleb128 0x61
+	.4byte	0x13a51
 	.4byte	.LLST54
 	.byte	0
 	.byte	0
-	.uleb128 0x6c
-	.8byte	.LBB1085
-	.8byte	.LBE1085-.LBB1085
-	.4byte	0x10ffc
-	.uleb128 0x57
-	.4byte	0x1359c
-	.uleb128 0x5c
-	.4byte	0x13a3d
-	.8byte	.LBB1086
-	.8byte	.LBE1086-.LBB1086
+	.uleb128 0x6d
+	.8byte	.LBB1081
+	.8byte	.LBE1081-.LBB1081
+	.4byte	0x11086
+	.uleb128 0x58
+	.4byte	0x13635
+	.uleb128 0x5d
+	.4byte	0x13ac7
+	.8byte	.LBB1082
+	.8byte	.LBE1082-.LBB1082
 	.byte	0x6
 	.byte	0x56
-	.uleb128 0x54
-	.4byte	0x13a58
-	.uleb128 0x54
-	.4byte	0x13a4d
-	.uleb128 0x56
-	.8byte	.LBB1087
-	.8byte	.LBE1087-.LBB1087
+	.uleb128 0x55
+	.4byte	0x13ae3
+	.uleb128 0x55
+	.4byte	0x13ad7
 	.uleb128 0x57
-	.4byte	0x13a63
+	.8byte	.LBB1083
+	.8byte	.LBE1083-.LBB1083
+	.uleb128 0x58
+	.4byte	0x13aef
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
-	.4byte	0x1398c
-	.8byte	.LBB1088
-	.8byte	.LBE1088-.LBB1088
+	.uleb128 0x5d
+	.4byte	0x13a14
+	.8byte	.LBB1084
+	.8byte	.LBE1084-.LBB1084
 	.byte	0x6
 	.byte	0x55
-	.uleb128 0x54
-	.4byte	0x139a6
-	.uleb128 0x54
-	.4byte	0x1399c
-	.uleb128 0x5c
-	.4byte	0x13ac5
-	.8byte	.LBB1089
-	.8byte	.LBE1089-.LBB1089
+	.uleb128 0x55
+	.4byte	0x13a2e
+	.uleb128 0x55
+	.4byte	0x13a24
+	.uleb128 0x5d
+	.4byte	0x13b51
+	.8byte	.LBB1085
+	.8byte	.LBE1085-.LBB1085
 	.byte	0xca
 	.byte	0x61
-	.uleb128 0x54
-	.4byte	0x13adf
-	.uleb128 0x54
-	.4byte	0x13ad5
+	.uleb128 0x55
+	.4byte	0x13b6b
+	.uleb128 0x55
+	.4byte	0x13b61
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x70
-	.4byte	0x1352b
-	.8byte	.LBB1095
-	.8byte	.LBE1095-.LBB1095
+	.uleb128 0x71
+	.4byte	0x135c2
+	.8byte	.LBB1091
+	.8byte	.LBE1091-.LBB1091
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x110fd
-	.uleb128 0x54
-	.4byte	0x1353b
-	.uleb128 0x56
-	.8byte	.LBB1096
-	.8byte	.LBE1096-.LBB1096
-	.uleb128 0x60
-	.4byte	0x13546
+	.4byte	0x11187
+	.uleb128 0x55
+	.4byte	0x135d2
+	.uleb128 0x57
+	.8byte	.LBB1092
+	.8byte	.LBE1092-.LBB1092
+	.uleb128 0x61
+	.4byte	0x135dd
 	.4byte	.LLST55
-	.uleb128 0x62
+	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x420
-	.4byte	0x110c8
-	.uleb128 0x60
-	.4byte	0x13552
+	.4byte	0x11152
+	.uleb128 0x61
+	.4byte	0x135e9
 	.4byte	.LLST56
-	.uleb128 0x5c
-	.4byte	0x13a3d
-	.8byte	.LBB1098
-	.8byte	.LBE1098-.LBB1098
+	.uleb128 0x5d
+	.4byte	0x13ac7
+	.8byte	.LBB1094
+	.8byte	.LBE1094-.LBB1094
 	.byte	0x6
 	.byte	0xfe
-	.uleb128 0x54
-	.4byte	0x13a58
-	.uleb128 0x54
-	.4byte	0x13a4d
-	.uleb128 0x56
-	.8byte	.LBB1099
-	.8byte	.LBE1099-.LBB1099
+	.uleb128 0x55
+	.4byte	0x13ae3
+	.uleb128 0x55
+	.4byte	0x13ad7
 	.uleb128 0x57
-	.4byte	0x13a63
+	.8byte	.LBB1095
+	.8byte	.LBE1095-.LBB1095
+	.uleb128 0x58
+	.4byte	0x13aef
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
-	.4byte	0x139b8
-	.8byte	.LBB1100
-	.8byte	.LBE1100-.LBB1100
+	.uleb128 0x5d
+	.4byte	0x13a41
+	.8byte	.LBB1096
+	.8byte	.LBE1096-.LBB1096
 	.byte	0x6
 	.byte	0xfd
-	.uleb128 0x56
-	.8byte	.LBB1101
-	.8byte	.LBE1101-.LBB1101
-	.uleb128 0x60
-	.4byte	0x139c8
+	.uleb128 0x57
+	.8byte	.LBB1097
+	.8byte	.LBE1097-.LBB1097
+	.uleb128 0x61
+	.4byte	0x13a51
 	.4byte	.LLST57
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL183
-	.4byte	0x14699
-	.uleb128 0x4e
+	.4byte	0x14736
+	.uleb128 0x4f
 	.8byte	.LVL261
-	.4byte	0x144bc
+	.4byte	0x1454c
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x13464
-	.8byte	.LBB1114
+	.uleb128 0x5c
+	.4byte	0x134f7
+	.8byte	.LBB1110
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
-	.2byte	0x76f
-	.4byte	0x111cc
-	.uleb128 0x54
-	.4byte	0x13489
-	.uleb128 0x54
-	.4byte	0x1347e
-	.uleb128 0x54
-	.4byte	0x13474
-	.uleb128 0x6d
-	.4byte	0x134c2
-	.8byte	.LBB1115
+	.2byte	0x770
+	.4byte	0x11256
+	.uleb128 0x55
+	.4byte	0x1351d
+	.uleb128 0x55
+	.4byte	0x13511
+	.uleb128 0x55
+	.4byte	0x13507
+	.uleb128 0x6e
+	.4byte	0x13557
+	.8byte	.LBB1111
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
-	.uleb128 0x54
-	.4byte	0x134e7
-	.uleb128 0x54
-	.4byte	0x134dc
-	.uleb128 0x54
-	.4byte	0x134d2
-	.uleb128 0x6d
-	.4byte	0x1355f
-	.8byte	.LBB1117
+	.uleb128 0x55
+	.4byte	0x1357d
+	.uleb128 0x55
+	.4byte	0x13571
+	.uleb128 0x55
+	.4byte	0x13567
+	.uleb128 0x6e
+	.4byte	0x135f6
+	.8byte	.LBB1113
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
-	.uleb128 0x54
-	.4byte	0x1357a
-	.uleb128 0x71
-	.4byte	0x1356f
+	.uleb128 0x55
+	.4byte	0x13612
+	.uleb128 0x72
+	.4byte	0x13606
 	.uleb128 0x1
 	.byte	0x50
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x4b0
-	.uleb128 0x57
-	.4byte	0x13585
-	.uleb128 0x60
-	.4byte	0x13590
+	.uleb128 0x58
+	.4byte	0x1361e
+	.uleb128 0x61
+	.4byte	0x13629
 	.4byte	.LLST58
-	.uleb128 0x5c
-	.4byte	0x139b8
-	.8byte	.LBB1119
-	.8byte	.LBE1119-.LBB1119
+	.uleb128 0x5d
+	.4byte	0x13a41
+	.8byte	.LBB1115
+	.8byte	.LBE1115-.LBB1115
 	.byte	0x6
 	.byte	0x4d
-	.uleb128 0x56
-	.8byte	.LBB1120
-	.8byte	.LBE1120-.LBB1120
-	.uleb128 0x60
-	.4byte	0x139c8
+	.uleb128 0x57
+	.8byte	.LBB1116
+	.8byte	.LBE1116-.LBB1116
+	.uleb128 0x61
+	.4byte	0x13a51
 	.4byte	.LLST59
 	.byte	0
 	.byte	0
@@ -41971,3770 +42039,3748 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x13464
-	.8byte	.LBB1126
+	.uleb128 0x5c
+	.4byte	0x134f7
+	.8byte	.LBB1122
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
-	.2byte	0x75f
-	.4byte	0x113ec
-	.uleb128 0x54
-	.4byte	0x13489
-	.uleb128 0x54
-	.4byte	0x1347e
-	.uleb128 0x54
-	.4byte	0x13474
-	.uleb128 0x6d
-	.4byte	0x134c2
-	.8byte	.LBB1127
+	.2byte	0x760
+	.4byte	0x11476
+	.uleb128 0x55
+	.4byte	0x1351d
+	.uleb128 0x55
+	.4byte	0x13511
+	.uleb128 0x55
+	.4byte	0x13507
+	.uleb128 0x6e
+	.4byte	0x13557
+	.8byte	.LBB1123
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
-	.uleb128 0x54
-	.4byte	0x134e7
-	.uleb128 0x54
-	.4byte	0x134dc
-	.uleb128 0x54
-	.4byte	0x134d2
-	.uleb128 0x6e
-	.4byte	0x1355f
-	.8byte	.LBB1129
+	.uleb128 0x55
+	.4byte	0x1357d
+	.uleb128 0x55
+	.4byte	0x13571
+	.uleb128 0x55
+	.4byte	0x13567
+	.uleb128 0x6f
+	.4byte	0x135f6
+	.8byte	.LBB1125
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x11322
-	.uleb128 0x54
-	.4byte	0x1357a
-	.uleb128 0x6f
-	.4byte	0x1356f
+	.4byte	0x113ac
+	.uleb128 0x55
+	.4byte	0x13612
+	.uleb128 0x70
+	.4byte	0x13606
 	.4byte	.LLST60
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x540
-	.uleb128 0x60
-	.4byte	0x13585
+	.uleb128 0x61
+	.4byte	0x1361e
 	.4byte	.LLST61
-	.uleb128 0x60
-	.4byte	0x13590
+	.uleb128 0x61
+	.4byte	0x13629
 	.4byte	.LLST62
-	.uleb128 0x70
-	.4byte	0x139b8
-	.8byte	.LBB1131
-	.8byte	.LBE1131-.LBB1131
+	.uleb128 0x71
+	.4byte	0x13a41
+	.8byte	.LBB1127
+	.8byte	.LBE1127-.LBB1127
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x11288
-	.uleb128 0x56
-	.8byte	.LBB1132
-	.8byte	.LBE1132-.LBB1132
-	.uleb128 0x60
-	.4byte	0x139c8
+	.4byte	0x11312
+	.uleb128 0x57
+	.8byte	.LBB1128
+	.8byte	.LBE1128-.LBB1128
+	.uleb128 0x61
+	.4byte	0x13a51
 	.4byte	.LLST63
 	.byte	0
 	.byte	0
-	.uleb128 0x6c
-	.8byte	.LBB1133
-	.8byte	.LBE1133-.LBB1133
-	.4byte	0x112dc
-	.uleb128 0x57
-	.4byte	0x1359c
-	.uleb128 0x5c
-	.4byte	0x13a3d
-	.8byte	.LBB1134
-	.8byte	.LBE1134-.LBB1134
+	.uleb128 0x6d
+	.8byte	.LBB1129
+	.8byte	.LBE1129-.LBB1129
+	.4byte	0x11366
+	.uleb128 0x58
+	.4byte	0x13635
+	.uleb128 0x5d
+	.4byte	0x13ac7
+	.8byte	.LBB1130
+	.8byte	.LBE1130-.LBB1130
 	.byte	0x6
 	.byte	0x56
-	.uleb128 0x54
-	.4byte	0x13a58
-	.uleb128 0x54
-	.4byte	0x13a4d
-	.uleb128 0x56
-	.8byte	.LBB1135
-	.8byte	.LBE1135-.LBB1135
+	.uleb128 0x55
+	.4byte	0x13ae3
+	.uleb128 0x55
+	.4byte	0x13ad7
 	.uleb128 0x57
-	.4byte	0x13a63
+	.8byte	.LBB1131
+	.8byte	.LBE1131-.LBB1131
+	.uleb128 0x58
+	.4byte	0x13aef
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
-	.4byte	0x1398c
-	.8byte	.LBB1136
-	.8byte	.LBE1136-.LBB1136
+	.uleb128 0x5d
+	.4byte	0x13a14
+	.8byte	.LBB1132
+	.8byte	.LBE1132-.LBB1132
 	.byte	0x6
 	.byte	0x55
-	.uleb128 0x54
-	.4byte	0x139a6
-	.uleb128 0x54
-	.4byte	0x1399c
-	.uleb128 0x5c
-	.4byte	0x13ac5
-	.8byte	.LBB1137
-	.8byte	.LBE1137-.LBB1137
+	.uleb128 0x55
+	.4byte	0x13a2e
+	.uleb128 0x55
+	.4byte	0x13a24
+	.uleb128 0x5d
+	.4byte	0x13b51
+	.8byte	.LBB1133
+	.8byte	.LBE1133-.LBB1133
 	.byte	0xca
 	.byte	0x61
-	.uleb128 0x54
-	.4byte	0x13adf
-	.uleb128 0x54
-	.4byte	0x13ad5
+	.uleb128 0x55
+	.4byte	0x13b6b
+	.uleb128 0x55
+	.4byte	0x13b61
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x70
-	.4byte	0x1352b
-	.8byte	.LBB1145
-	.8byte	.LBE1145-.LBB1145
+	.uleb128 0x71
+	.4byte	0x135c2
+	.8byte	.LBB1141
+	.8byte	.LBE1141-.LBB1141
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x113dd
-	.uleb128 0x54
-	.4byte	0x1353b
-	.uleb128 0x56
-	.8byte	.LBB1146
-	.8byte	.LBE1146-.LBB1146
-	.uleb128 0x60
-	.4byte	0x13546
+	.4byte	0x11467
+	.uleb128 0x55
+	.4byte	0x135d2
+	.uleb128 0x57
+	.8byte	.LBB1142
+	.8byte	.LBE1142-.LBB1142
+	.uleb128 0x61
+	.4byte	0x135dd
 	.4byte	.LLST64
-	.uleb128 0x62
+	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x590
-	.4byte	0x113a8
-	.uleb128 0x60
-	.4byte	0x13552
+	.4byte	0x11432
+	.uleb128 0x61
+	.4byte	0x135e9
 	.4byte	.LLST65
-	.uleb128 0x5c
-	.4byte	0x13a3d
-	.8byte	.LBB1148
-	.8byte	.LBE1148-.LBB1148
+	.uleb128 0x5d
+	.4byte	0x13ac7
+	.8byte	.LBB1144
+	.8byte	.LBE1144-.LBB1144
 	.byte	0x6
 	.byte	0xfe
-	.uleb128 0x54
-	.4byte	0x13a58
-	.uleb128 0x54
-	.4byte	0x13a4d
-	.uleb128 0x56
-	.8byte	.LBB1149
-	.8byte	.LBE1149-.LBB1149
+	.uleb128 0x55
+	.4byte	0x13ae3
+	.uleb128 0x55
+	.4byte	0x13ad7
 	.uleb128 0x57
-	.4byte	0x13a63
+	.8byte	.LBB1145
+	.8byte	.LBE1145-.LBB1145
+	.uleb128 0x58
+	.4byte	0x13aef
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
-	.4byte	0x139b8
-	.8byte	.LBB1150
-	.8byte	.LBE1150-.LBB1150
+	.uleb128 0x5d
+	.4byte	0x13a41
+	.8byte	.LBB1146
+	.8byte	.LBE1146-.LBB1146
 	.byte	0x6
 	.byte	0xfd
-	.uleb128 0x56
-	.8byte	.LBB1151
-	.8byte	.LBE1151-.LBB1151
-	.uleb128 0x60
-	.4byte	0x139c8
+	.uleb128 0x57
+	.8byte	.LBB1147
+	.8byte	.LBE1147-.LBB1147
+	.uleb128 0x61
+	.4byte	0x13a51
 	.4byte	.LLST66
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL244
-	.4byte	0x1468c
+	.4byte	0x14729
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x13464
-	.8byte	.LBB1162
+	.uleb128 0x5c
+	.4byte	0x134f7
+	.8byte	.LBB1158
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
-	.2byte	0x711
-	.4byte	0x1160c
-	.uleb128 0x54
-	.4byte	0x13489
-	.uleb128 0x54
-	.4byte	0x1347e
-	.uleb128 0x54
-	.4byte	0x13474
-	.uleb128 0x6d
-	.4byte	0x134c2
-	.8byte	.LBB1163
+	.2byte	0x712
+	.4byte	0x11696
+	.uleb128 0x55
+	.4byte	0x1351d
+	.uleb128 0x55
+	.4byte	0x13511
+	.uleb128 0x55
+	.4byte	0x13507
+	.uleb128 0x6e
+	.4byte	0x13557
+	.8byte	.LBB1159
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x9b
-	.uleb128 0x54
-	.4byte	0x134e7
-	.uleb128 0x54
-	.4byte	0x134dc
-	.uleb128 0x54
-	.4byte	0x134d2
-	.uleb128 0x6e
-	.4byte	0x1355f
-	.8byte	.LBB1165
+	.uleb128 0x55
+	.4byte	0x1357d
+	.uleb128 0x55
+	.4byte	0x13571
+	.uleb128 0x55
+	.4byte	0x13567
+	.uleb128 0x6f
+	.4byte	0x135f6
+	.8byte	.LBB1161
 	.4byte	.Ldebug_ranges0+0x620
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x11542
-	.uleb128 0x54
-	.4byte	0x1357a
-	.uleb128 0x6f
-	.4byte	0x1356f
+	.4byte	0x115cc
+	.uleb128 0x55
+	.4byte	0x13612
+	.uleb128 0x70
+	.4byte	0x13606
 	.4byte	.LLST67
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x620
-	.uleb128 0x60
-	.4byte	0x13585
+	.uleb128 0x61
+	.4byte	0x1361e
 	.4byte	.LLST68
-	.uleb128 0x60
-	.4byte	0x13590
+	.uleb128 0x61
+	.4byte	0x13629
 	.4byte	.LLST69
-	.uleb128 0x70
-	.4byte	0x139b8
-	.8byte	.LBB1167
-	.8byte	.LBE1167-.LBB1167
+	.uleb128 0x71
+	.4byte	0x13a41
+	.8byte	.LBB1163
+	.8byte	.LBE1163-.LBB1163
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x114a8
-	.uleb128 0x56
-	.8byte	.LBB1168
-	.8byte	.LBE1168-.LBB1168
-	.uleb128 0x60
-	.4byte	0x139c8
+	.4byte	0x11532
+	.uleb128 0x57
+	.8byte	.LBB1164
+	.8byte	.LBE1164-.LBB1164
+	.uleb128 0x61
+	.4byte	0x13a51
 	.4byte	.LLST70
 	.byte	0
 	.byte	0
-	.uleb128 0x6c
-	.8byte	.LBB1169
-	.8byte	.LBE1169-.LBB1169
-	.4byte	0x114fc
-	.uleb128 0x57
-	.4byte	0x1359c
-	.uleb128 0x5c
-	.4byte	0x13a3d
-	.8byte	.LBB1170
-	.8byte	.LBE1170-.LBB1170
+	.uleb128 0x6d
+	.8byte	.LBB1165
+	.8byte	.LBE1165-.LBB1165
+	.4byte	0x11586
+	.uleb128 0x58
+	.4byte	0x13635
+	.uleb128 0x5d
+	.4byte	0x13ac7
+	.8byte	.LBB1166
+	.8byte	.LBE1166-.LBB1166
 	.byte	0x6
 	.byte	0x56
-	.uleb128 0x54
-	.4byte	0x13a58
-	.uleb128 0x54
-	.4byte	0x13a4d
-	.uleb128 0x56
-	.8byte	.LBB1171
-	.8byte	.LBE1171-.LBB1171
+	.uleb128 0x55
+	.4byte	0x13ae3
+	.uleb128 0x55
+	.4byte	0x13ad7
 	.uleb128 0x57
-	.4byte	0x13a63
+	.8byte	.LBB1167
+	.8byte	.LBE1167-.LBB1167
+	.uleb128 0x58
+	.4byte	0x13aef
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
-	.4byte	0x1398c
-	.8byte	.LBB1172
-	.8byte	.LBE1172-.LBB1172
+	.uleb128 0x5d
+	.4byte	0x13a14
+	.8byte	.LBB1168
+	.8byte	.LBE1168-.LBB1168
 	.byte	0x6
 	.byte	0x55
-	.uleb128 0x54
-	.4byte	0x139a6
-	.uleb128 0x54
-	.4byte	0x1399c
-	.uleb128 0x5c
-	.4byte	0x13ac5
-	.8byte	.LBB1173
-	.8byte	.LBE1173-.LBB1173
+	.uleb128 0x55
+	.4byte	0x13a2e
+	.uleb128 0x55
+	.4byte	0x13a24
+	.uleb128 0x5d
+	.4byte	0x13b51
+	.8byte	.LBB1169
+	.8byte	.LBE1169-.LBB1169
 	.byte	0xca
 	.byte	0x61
-	.uleb128 0x54
-	.4byte	0x13adf
-	.uleb128 0x54
-	.4byte	0x13ad5
+	.uleb128 0x55
+	.4byte	0x13b6b
+	.uleb128 0x55
+	.4byte	0x13b61
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x70
-	.4byte	0x1352b
-	.8byte	.LBB1181
-	.8byte	.LBE1181-.LBB1181
+	.uleb128 0x71
+	.4byte	0x135c2
+	.8byte	.LBB1177
+	.8byte	.LBE1177-.LBB1177
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x115fd
-	.uleb128 0x54
-	.4byte	0x1353b
-	.uleb128 0x56
-	.8byte	.LBB1182
-	.8byte	.LBE1182-.LBB1182
-	.uleb128 0x60
-	.4byte	0x13546
+	.4byte	0x11687
+	.uleb128 0x55
+	.4byte	0x135d2
+	.uleb128 0x57
+	.8byte	.LBB1178
+	.8byte	.LBE1178-.LBB1178
+	.uleb128 0x61
+	.4byte	0x135dd
 	.4byte	.LLST71
-	.uleb128 0x62
+	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x670
-	.4byte	0x115c8
-	.uleb128 0x60
-	.4byte	0x13552
+	.4byte	0x11652
+	.uleb128 0x61
+	.4byte	0x135e9
 	.4byte	.LLST72
-	.uleb128 0x5c
-	.4byte	0x13a3d
-	.8byte	.LBB1184
-	.8byte	.LBE1184-.LBB1184
+	.uleb128 0x5d
+	.4byte	0x13ac7
+	.8byte	.LBB1180
+	.8byte	.LBE1180-.LBB1180
 	.byte	0x6
 	.byte	0xfe
-	.uleb128 0x54
-	.4byte	0x13a58
-	.uleb128 0x54
-	.4byte	0x13a4d
-	.uleb128 0x56
-	.8byte	.LBB1185
-	.8byte	.LBE1185-.LBB1185
+	.uleb128 0x55
+	.4byte	0x13ae3
+	.uleb128 0x55
+	.4byte	0x13ad7
 	.uleb128 0x57
-	.4byte	0x13a63
+	.8byte	.LBB1181
+	.8byte	.LBE1181-.LBB1181
+	.uleb128 0x58
+	.4byte	0x13aef
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
-	.4byte	0x139b8
-	.8byte	.LBB1186
-	.8byte	.LBE1186-.LBB1186
+	.uleb128 0x5d
+	.4byte	0x13a41
+	.8byte	.LBB1182
+	.8byte	.LBE1182-.LBB1182
 	.byte	0x6
 	.byte	0xfd
-	.uleb128 0x56
-	.8byte	.LBB1187
-	.8byte	.LBE1187-.LBB1187
-	.uleb128 0x60
-	.4byte	0x139c8
+	.uleb128 0x57
+	.8byte	.LBB1183
+	.8byte	.LBE1183-.LBB1183
+	.uleb128 0x61
+	.4byte	0x13a51
 	.4byte	.LLST73
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL252
-	.4byte	0x1468c
+	.4byte	0x14729
 	.byte	0
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL85
-	.4byte	0x14541
-	.uleb128 0x4e
+	.4byte	0x145de
+	.uleb128 0x4f
 	.8byte	.LVL86
-	.4byte	0x145a3
-	.uleb128 0x4e
+	.4byte	0x14640
+	.uleb128 0x4f
 	.8byte	.LVL87
-	.4byte	0x1464e
-	.uleb128 0x4e
+	.4byte	0x146eb
+	.uleb128 0x4f
 	.8byte	.LVL98
-	.4byte	0x146a6
-	.uleb128 0x4e
+	.4byte	0x14743
+	.uleb128 0x4f
 	.8byte	.LVL101
-	.4byte	0x144d2
-	.uleb128 0x4e
+	.4byte	0x14562
+	.uleb128 0x4f
 	.8byte	.LVL104
-	.4byte	0x14458
-	.uleb128 0x4e
+	.4byte	0x144e8
+	.uleb128 0x4f
 	.8byte	.LVL121
-	.4byte	0x1464e
-	.uleb128 0x4e
+	.4byte	0x146eb
+	.uleb128 0x4f
 	.8byte	.LVL122
-	.4byte	0x146b2
-	.uleb128 0x4e
+	.4byte	0x1474f
+	.uleb128 0x4f
 	.8byte	.LVL124
-	.4byte	0x1454d
-	.uleb128 0x4e
+	.4byte	0x145ea
+	.uleb128 0x4f
 	.8byte	.LVL131
-	.4byte	0x14541
-	.uleb128 0x4e
+	.4byte	0x145de
+	.uleb128 0x4f
 	.8byte	.LVL145
-	.4byte	0x146be
-	.uleb128 0x4e
+	.4byte	0x1475b
+	.uleb128 0x4f
 	.8byte	.LVL146
-	.4byte	0x1454d
-	.uleb128 0x4e
+	.4byte	0x145ea
+	.uleb128 0x4f
 	.8byte	.LVL147
-	.4byte	0x14597
-	.uleb128 0x4e
+	.4byte	0x14634
+	.uleb128 0x4f
 	.8byte	.LVL157
-	.4byte	0x146ca
-	.uleb128 0x4e
+	.4byte	0x14767
+	.uleb128 0x4f
 	.8byte	.LVL158
-	.4byte	0x1464e
-	.uleb128 0x4e
+	.4byte	0x146eb
+	.uleb128 0x4f
 	.8byte	.LVL185
-	.4byte	0x14458
-	.uleb128 0x4e
+	.4byte	0x144e8
+	.uleb128 0x4f
 	.8byte	.LVL188
-	.4byte	0x14458
-	.uleb128 0x4e
+	.4byte	0x144e8
+	.uleb128 0x4f
 	.8byte	.LVL190
-	.4byte	0x14541
-	.uleb128 0x4e
+	.4byte	0x145de
+	.uleb128 0x4f
 	.8byte	.LVL192
-	.4byte	0x14541
-	.uleb128 0x4e
+	.4byte	0x145de
+	.uleb128 0x4f
 	.8byte	.LVL193
-	.4byte	0x145a3
-	.uleb128 0x4e
+	.4byte	0x14640
+	.uleb128 0x4f
 	.8byte	.LVL194
-	.4byte	0x1464e
-	.uleb128 0x4e
+	.4byte	0x146eb
+	.uleb128 0x4f
 	.8byte	.LVL207
-	.4byte	0x144d2
-	.uleb128 0x4e
+	.4byte	0x14562
+	.uleb128 0x4f
 	.8byte	.LVL210
-	.4byte	0x144d2
-	.uleb128 0x4e
+	.4byte	0x14562
+	.uleb128 0x4f
 	.8byte	.LVL212
-	.4byte	0x14541
-	.uleb128 0x4e
+	.4byte	0x145de
+	.uleb128 0x4f
 	.8byte	.LVL213
-	.4byte	0x1464e
-	.uleb128 0x4e
+	.4byte	0x146eb
+	.uleb128 0x4f
 	.8byte	.LVL221
-	.4byte	0x146a6
-	.uleb128 0x4e
+	.4byte	0x14743
+	.uleb128 0x4f
 	.8byte	.LVL255
-	.4byte	0x14597
-	.uleb128 0x4e
+	.4byte	0x14634
+	.uleb128 0x4f
 	.8byte	.LVL262
-	.4byte	0x144d2
-	.uleb128 0x4e
+	.4byte	0x14562
+	.uleb128 0x4f
 	.8byte	.LVL263
-	.4byte	0x145f9
+	.4byte	0x14696
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0x11796
+	.4byte	0x11820
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xa
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x11786
-	.uleb128 0x63
-	.4byte	.LASF3077
+	.4byte	0x11810
+	.uleb128 0x64
+	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x698
+	.2byte	0x699
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x117c5
-	.uleb128 0x65
-	.4byte	.LASF3004
+	.4byte	0x1184f
+	.uleb128 0x66
+	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x698
-	.4byte	0xe16c
-	.uleb128 0x52
+	.2byte	0x699
+	.4byte	0xe1dc
+	.uleb128 0x53
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x69a
-	.4byte	0xa570
+	.2byte	0x69b
+	.4byte	0xa5e0
 	.byte	0
-	.uleb128 0x4d
-	.4byte	.LASF3079
+	.uleb128 0x4e
+	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x692
-	.8byte	.LFB2829
-	.8byte	.LFE2829-.LFB2829
+	.2byte	0x693
+	.8byte	.LFB2830
+	.8byte	.LFE2830-.LFB2830
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x117ff
-	.uleb128 0x51
+	.4byte	0x11889
+	.uleb128 0x52
 	.string	"t"
 	.byte	0x1
-	.2byte	0x692
+	.2byte	0x693
 	.4byte	0x31d2
 	.4byte	.LLST74
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL276
-	.4byte	0x12262
+	.4byte	0x122ec
 	.byte	0
-	.uleb128 0x4d
-	.4byte	.LASF3080
+	.uleb128 0x4e
+	.4byte	.LASF3095
 	.byte	0x1
-	.2byte	0x686
-	.8byte	.LFB2828
-	.8byte	.LFE2828-.LFB2828
+	.2byte	0x687
+	.8byte	.LFB2829
+	.8byte	.LFE2829-.LFB2829
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1185f
-	.uleb128 0x51
+	.4byte	0x118e9
+	.uleb128 0x52
 	.string	"t"
 	.byte	0x1
-	.2byte	0x686
+	.2byte	0x687
 	.4byte	0x31d2
 	.4byte	.LLST12
-	.uleb128 0x46
-	.4byte	.LASF2961
+	.uleb128 0x48
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x688
-	.4byte	0xe7b3
-	.uleb128 0x5f
-	.4byte	0x133f3
-	.8byte	.LBB942
+	.2byte	0x689
+	.4byte	0xe830
+	.uleb128 0x60
+	.4byte	0x13481
+	.8byte	.LBB938
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.2byte	0x68c
-	.uleb128 0x54
-	.4byte	0x13400
-	.uleb128 0x4e
+	.2byte	0x68d
+	.uleb128 0x55
+	.4byte	0x1348e
+	.uleb128 0x4f
 	.8byte	.LVL71
-	.4byte	0x146d6
+	.4byte	0x14773
 	.byte	0
 	.byte	0
-	.uleb128 0x63
-	.4byte	.LASF3081
+	.uleb128 0x64
+	.4byte	.LASF3096
 	.byte	0x1
-	.2byte	0x676
+	.2byte	0x677
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11889
-	.uleb128 0x65
-	.4byte	.LASF3004
+	.4byte	0x11913
+	.uleb128 0x66
+	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x676
-	.4byte	0xe16c
-	.uleb128 0x52
+	.2byte	0x677
+	.4byte	0xe1dc
+	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x678
-	.4byte	0xe45d
+	.2byte	0x679
+	.4byte	0xe4da
 	.byte	0
-	.uleb128 0x4f
-	.4byte	.LASF3082
+	.uleb128 0x50
+	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x539
+	.2byte	0x53a
 	.4byte	0xc6
-	.8byte	.LFB2826
-	.8byte	.LFE2826-.LFB2826
+	.8byte	.LFB2827
+	.8byte	.LFE2827-.LFB2827
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1208a
-	.uleb128 0x51
+	.4byte	0x12114
+	.uleb128 0x52
 	.string	"ptr"
 	.byte	0x1
-	.2byte	0x539
+	.2byte	0x53a
 	.4byte	0x458
 	.4byte	.LLST188
-	.uleb128 0x5a
+	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x53b
-	.4byte	0xe4c2
+	.2byte	0x53c
+	.4byte	0xe53f
 	.4byte	.LLST189
-	.uleb128 0x46
-	.4byte	.LASF2961
+	.uleb128 0x48
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x53c
-	.4byte	0xe7b3
-	.uleb128 0x5a
+	.2byte	0x53d
+	.4byte	0xe830
+	.uleb128 0x5b
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x53d
-	.4byte	0xe45d
+	.2byte	0x53e
+	.4byte	0xe4da
 	.4byte	.LLST190
-	.uleb128 0x59
-	.4byte	.LASF3083
+	.uleb128 0x5a
+	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x53e
+	.2byte	0x53f
 	.4byte	0xc6
 	.4byte	.LLST191
-	.uleb128 0x59
-	.4byte	.LASF2974
+	.uleb128 0x5a
+	.4byte	.LASF2988
 	.byte	0x1
-	.2byte	0x53f
+	.2byte	0x540
 	.4byte	0xc6
 	.4byte	.LLST192
-	.uleb128 0x4c
-	.4byte	.LASF3084
+	.uleb128 0x4d
+	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x540
-	.4byte	0xd8ec
+	.2byte	0x541
+	.4byte	0xd95c
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -72
-	.uleb128 0x59
-	.4byte	.LASF3085
+	.uleb128 0x5a
+	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x541
-	.4byte	0xe45d
+	.2byte	0x542
+	.4byte	0xe4da
 	.4byte	.LLST193
-	.uleb128 0x6b
-	.4byte	.LASF3087
+	.uleb128 0x6c
+	.4byte	.LASF3102
 	.byte	0x1
-	.2byte	0x646
+	.2byte	0x647
 	.8byte	.L805
-	.uleb128 0x62
-	.4byte	.Ldebug_ranges0+0x1130
-	.4byte	0x119d9
-	.uleb128 0x46
-	.4byte	.LASF3074
+	.uleb128 0x63
+	.4byte	.Ldebug_ranges0+0x1100
+	.4byte	0x11a63
+	.uleb128 0x48
+	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x582
+	.2byte	0x583
 	.4byte	0xc6
-	.uleb128 0x56
-	.8byte	.LBB1824
-	.8byte	.LBE1824-.LBB1824
-	.uleb128 0x6b
-	.4byte	.LASF3086
+	.uleb128 0x57
+	.8byte	.LBB1816
+	.8byte	.LBE1816-.LBB1816
+	.uleb128 0x6c
+	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x582
+	.2byte	0x583
 	.8byte	.L788
-	.uleb128 0x4c
-	.4byte	.LASF3075
+	.uleb128 0x4d
+	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x582
+	.2byte	0x583
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
-	.uleb128 0x46
-	.4byte	.LASF3074
+	.uleb128 0x48
+	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x582
+	.2byte	0x583
 	.4byte	0x199
-	.uleb128 0x62
-	.4byte	.Ldebug_ranges0+0x1160
-	.4byte	0x119bd
-	.uleb128 0x59
-	.4byte	.LASF3076
+	.uleb128 0x63
+	.4byte	.Ldebug_ranges0+0x1130
+	.4byte	0x11a47
+	.uleb128 0x5a
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x582
+	.2byte	0x583
 	.4byte	0x199
 	.4byte	.LLST207
-	.uleb128 0x4e
-	.8byte	.LVL906
-	.4byte	0x1465a
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL907
-	.4byte	0x14666
-	.byte	0
-	.uleb128 0x4e
-	.8byte	.LVL904
-	.4byte	0x14673
-	.uleb128 0x4e
+	.4byte	0x146f7
+	.uleb128 0x4f
 	.8byte	.LVL908
-	.4byte	0x1467f
+	.4byte	0x14703
 	.byte	0
+	.uleb128 0x4f
+	.8byte	.LVL905
+	.4byte	0x14710
+	.uleb128 0x4f
+	.8byte	.LVL909
+	.4byte	0x1471c
 	.byte	0
-	.uleb128 0x62
-	.4byte	.Ldebug_ranges0+0x10d0
-	.4byte	0x11a7b
-	.uleb128 0x46
-	.4byte	.LASF3074
+	.byte	0
+	.uleb128 0x63
+	.4byte	.Ldebug_ranges0+0x10a0
+	.4byte	0x11b05
+	.uleb128 0x48
+	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x632
+	.2byte	0x633
 	.4byte	0xc6
-	.uleb128 0x56
-	.8byte	.LBB1820
-	.8byte	.LBE1820-.LBB1820
-	.uleb128 0x6b
-	.4byte	.LASF3086
+	.uleb128 0x57
+	.8byte	.LBB1812
+	.8byte	.LBE1812-.LBB1812
+	.uleb128 0x6c
+	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x632
+	.2byte	0x633
 	.8byte	.L842
-	.uleb128 0x4c
-	.4byte	.LASF3075
+	.uleb128 0x4d
+	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x632
+	.2byte	0x633
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
-	.uleb128 0x46
-	.4byte	.LASF3074
+	.uleb128 0x48
+	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x632
+	.2byte	0x633
 	.4byte	0x199
-	.uleb128 0x62
-	.4byte	.Ldebug_ranges0+0x1100
-	.4byte	0x11a5f
-	.uleb128 0x59
-	.4byte	.LASF3076
+	.uleb128 0x63
+	.4byte	.Ldebug_ranges0+0x10d0
+	.4byte	0x11ae9
+	.uleb128 0x5a
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x632
+	.2byte	0x633
 	.4byte	0x199
 	.4byte	.LLST206
-	.uleb128 0x4e
-	.8byte	.LVL899
-	.4byte	0x1465a
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL900
-	.4byte	0x14666
-	.byte	0
-	.uleb128 0x4e
-	.8byte	.LVL897
-	.4byte	0x14673
-	.uleb128 0x4e
+	.4byte	0x146f7
+	.uleb128 0x4f
 	.8byte	.LVL901
-	.4byte	0x1467f
+	.4byte	0x14703
+	.byte	0
+	.uleb128 0x4f
+	.8byte	.LVL898
+	.4byte	0x14710
+	.uleb128 0x4f
+	.8byte	.LVL902
+	.4byte	0x1471c
 	.byte	0
 	.byte	0
-	.uleb128 0x6c
-	.8byte	.LBB1814
-	.8byte	.LBE1814-.LBB1814
-	.4byte	0x11b2d
-	.uleb128 0x46
-	.4byte	.LASF3074
+	.uleb128 0x6d
+	.8byte	.LBB1806
+	.8byte	.LBE1806-.LBB1806
+	.4byte	0x11bb7
+	.uleb128 0x48
+	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x662
+	.2byte	0x663
 	.4byte	0xc6
-	.uleb128 0x56
-	.8byte	.LBB1815
-	.8byte	.LBE1815-.LBB1815
-	.uleb128 0x72
-	.4byte	.LASF3086
+	.uleb128 0x57
+	.8byte	.LBB1807
+	.8byte	.LBE1807-.LBB1807
+	.uleb128 0x73
+	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x662
-	.uleb128 0x4c
-	.4byte	.LASF3075
+	.2byte	0x663
+	.uleb128 0x4d
+	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x662
+	.2byte	0x663
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
-	.uleb128 0x46
-	.4byte	.LASF3074
+	.uleb128 0x48
+	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x662
+	.2byte	0x663
 	.4byte	0x199
-	.uleb128 0x6c
-	.8byte	.LBB1816
-	.8byte	.LBE1816-.LBB1816
-	.4byte	0x11b11
-	.uleb128 0x59
-	.4byte	.LASF3076
+	.uleb128 0x6d
+	.8byte	.LBB1808
+	.8byte	.LBE1808-.LBB1808
+	.4byte	0x11b9b
+	.uleb128 0x5a
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x662
+	.2byte	0x663
 	.4byte	0x199
 	.4byte	.LLST205
-	.uleb128 0x4e
-	.8byte	.LVL832
-	.4byte	0x1465a
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL833
-	.4byte	0x14666
-	.byte	0
-	.uleb128 0x4e
-	.8byte	.LVL830
-	.4byte	0x14673
-	.uleb128 0x4e
+	.4byte	0x146f7
+	.uleb128 0x4f
 	.8byte	.LVL834
-	.4byte	0x1467f
+	.4byte	0x14703
+	.byte	0
+	.uleb128 0x4f
+	.8byte	.LVL831
+	.4byte	0x14710
+	.uleb128 0x4f
+	.8byte	.LVL835
+	.4byte	0x1471c
 	.byte	0
 	.byte	0
-	.uleb128 0x62
-	.4byte	.Ldebug_ranges0+0xfb0
-	.4byte	0x11bc3
-	.uleb128 0x46
-	.4byte	.LASF3074
+	.uleb128 0x63
+	.4byte	.Ldebug_ranges0+0xf80
+	.4byte	0x11c4d
+	.uleb128 0x48
+	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x66e
+	.2byte	0x66f
 	.4byte	0xc6
-	.uleb128 0x5e
-	.4byte	.Ldebug_ranges0+0xfb0
-	.uleb128 0x6b
-	.4byte	.LASF3086
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0xf80
+	.uleb128 0x6c
+	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x66e
+	.2byte	0x66f
 	.8byte	.L858
-	.uleb128 0x4c
-	.4byte	.LASF3075
+	.uleb128 0x4d
+	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x66e
+	.2byte	0x66f
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
-	.uleb128 0x46
-	.4byte	.LASF3074
+	.uleb128 0x48
+	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x66e
+	.2byte	0x66f
 	.4byte	0x199
-	.uleb128 0x62
-	.4byte	.Ldebug_ranges0+0xff0
-	.4byte	0x11ba7
-	.uleb128 0x59
-	.4byte	.LASF3076
+	.uleb128 0x63
+	.4byte	.Ldebug_ranges0+0xfc0
+	.4byte	0x11c31
+	.uleb128 0x5a
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x66e
+	.2byte	0x66f
 	.4byte	0x199
 	.4byte	.LLST194
-	.uleb128 0x4e
-	.8byte	.LVL801
-	.4byte	0x1465a
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL802
-	.4byte	0x14666
-	.byte	0
-	.uleb128 0x4e
-	.8byte	.LVL799
-	.4byte	0x14673
-	.uleb128 0x4e
+	.4byte	0x146f7
+	.uleb128 0x4f
 	.8byte	.LVL803
-	.4byte	0x1467f
+	.4byte	0x14703
+	.byte	0
+	.uleb128 0x4f
+	.8byte	.LVL800
+	.4byte	0x14710
+	.uleb128 0x4f
+	.8byte	.LVL804
+	.4byte	0x1471c
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x12d96
-	.8byte	.LBB1799
-	.4byte	.Ldebug_ranges0+0x1030
+	.uleb128 0x5c
+	.4byte	0x12e06
+	.8byte	.LBB1791
+	.4byte	.Ldebug_ranges0+0x1000
 	.byte	0x1
-	.2byte	0x5a3
-	.4byte	0x11c89
-	.uleb128 0x54
-	.4byte	0x12dd3
-	.uleb128 0x54
-	.4byte	0x12dd3
-	.uleb128 0x54
-	.4byte	0x12dd3
-	.uleb128 0x54
-	.4byte	0x12ddf
-	.uleb128 0x54
-	.4byte	0x12dc7
-	.uleb128 0x54
-	.4byte	0x12dbb
-	.uleb128 0x54
-	.4byte	0x12daf
-	.uleb128 0x54
-	.4byte	0x12da3
-	.uleb128 0x5e
-	.4byte	.Ldebug_ranges0+0x1030
-	.uleb128 0x57
-	.4byte	0x12deb
-	.uleb128 0x60
-	.4byte	0x12df7
+	.2byte	0x5a4
+	.4byte	0x11d13
+	.uleb128 0x55
+	.4byte	0x12e43
+	.uleb128 0x55
+	.4byte	0x12e43
+	.uleb128 0x55
+	.4byte	0x12e43
+	.uleb128 0x55
+	.4byte	0x12e4f
+	.uleb128 0x55
+	.4byte	0x12e37
+	.uleb128 0x55
+	.4byte	0x12e2b
+	.uleb128 0x55
+	.4byte	0x12e1f
+	.uleb128 0x55
+	.4byte	0x12e13
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0x1000
+	.uleb128 0x58
+	.4byte	0x12e5b
+	.uleb128 0x61
+	.4byte	0x12e67
 	.4byte	.LLST195
-	.uleb128 0x57
-	.4byte	0x12e03
-	.uleb128 0x60
-	.4byte	0x12e0f
+	.uleb128 0x58
+	.4byte	0x12e73
+	.uleb128 0x61
+	.4byte	0x12e7f
 	.4byte	.LLST196
-	.uleb128 0x60
-	.4byte	0x12e1b
+	.uleb128 0x61
+	.4byte	0x12e8b
 	.4byte	.LLST197
-	.uleb128 0x57
-	.4byte	0x12e27
-	.uleb128 0x57
-	.4byte	0x12e33
-	.uleb128 0x57
-	.4byte	0x12e3f
-	.uleb128 0x60
-	.4byte	0x12e4b
+	.uleb128 0x58
+	.4byte	0x12e97
+	.uleb128 0x58
+	.4byte	0x12ea3
+	.uleb128 0x58
+	.4byte	0x12eaf
+	.uleb128 0x61
+	.4byte	0x12ebb
 	.4byte	.LLST198
-	.uleb128 0x57
-	.4byte	0x12e57
-	.uleb128 0x60
-	.4byte	0x12e63
-	.4byte	.LLST199
+	.uleb128 0x58
+	.4byte	0x12ec7
 	.uleb128 0x61
-	.4byte	0x12e6f
+	.4byte	0x12ed3
+	.4byte	.LLST199
+	.uleb128 0x62
+	.4byte	0x12edf
 	.uleb128 0x1
 	.byte	0x5f
-	.uleb128 0x60
-	.4byte	0x12e79
+	.uleb128 0x61
+	.4byte	0x12ee9
 	.4byte	.LLST200
-	.uleb128 0x60
-	.4byte	0x12e83
+	.uleb128 0x61
+	.4byte	0x12ef3
 	.4byte	.LLST201
-	.uleb128 0x60
-	.4byte	0x12e8f
+	.uleb128 0x61
+	.4byte	0x12eff
 	.4byte	.LLST202
-	.uleb128 0x60
-	.4byte	0x12e9b
+	.uleb128 0x61
+	.4byte	0x12f0b
 	.4byte	.LLST203
-	.uleb128 0x60
-	.4byte	0x12ea7
+	.uleb128 0x61
+	.4byte	0x12f17
 	.4byte	.LLST204
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x1208a
-	.8byte	.LBB1808
-	.4byte	.Ldebug_ranges0+0x1090
+	.uleb128 0x5c
+	.4byte	0x12114
+	.8byte	.LBB1800
+	.4byte	.Ldebug_ranges0+0x1060
 	.byte	0x1
-	.2byte	0x607
-	.4byte	0x11cda
-	.uleb128 0x54
-	.4byte	0x120b3
-	.uleb128 0x54
-	.4byte	0x120a7
-	.uleb128 0x54
-	.4byte	0x1209b
-	.uleb128 0x5e
-	.4byte	.Ldebug_ranges0+0x1090
-	.uleb128 0x57
-	.4byte	0x120bf
-	.uleb128 0x57
-	.4byte	0x120c9
-	.uleb128 0x57
-	.4byte	0x120d5
-	.uleb128 0x57
-	.4byte	0x120e1
-	.uleb128 0x57
-	.4byte	0x120ed
-	.uleb128 0x57
-	.4byte	0x120f9
-	.uleb128 0x73
-	.4byte	0x12105
+	.2byte	0x608
+	.4byte	0x11d64
+	.uleb128 0x55
+	.4byte	0x1213d
+	.uleb128 0x55
+	.4byte	0x12131
+	.uleb128 0x55
+	.4byte	0x12125
+	.uleb128 0x5f
+	.4byte	.Ldebug_ranges0+0x1060
+	.uleb128 0x58
+	.4byte	0x12149
+	.uleb128 0x58
+	.4byte	0x12153
+	.uleb128 0x58
+	.4byte	0x1215f
+	.uleb128 0x58
+	.4byte	0x1216b
+	.uleb128 0x58
+	.4byte	0x12177
+	.uleb128 0x58
+	.4byte	0x12183
+	.uleb128 0x74
+	.4byte	0x1218f
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x130f0
-	.8byte	.LBB1817
-	.8byte	.LBE1817-.LBB1817
-	.byte	0x1
-	.2byte	0x66b
-	.4byte	0x11d25
-	.uleb128 0x54
-	.4byte	0x1310b
 	.uleb128 0x54
-	.4byte	0x13100
-	.uleb128 0x56
-	.8byte	.LBB1818
-	.8byte	.LBE1818-.LBB1818
+	.4byte	0x13160
+	.8byte	.LBB1809
+	.8byte	.LBE1809-.LBB1809
+	.byte	0x1
+	.2byte	0x66c
+	.4byte	0x11daf
+	.uleb128 0x55
+	.4byte	0x1317b
+	.uleb128 0x55
+	.4byte	0x13170
 	.uleb128 0x57
-	.4byte	0x13116
-	.uleb128 0x4e
-	.8byte	.LVL835
-	.4byte	0x142d0
+	.8byte	.LBB1810
+	.8byte	.LBE1810-.LBB1810
+	.uleb128 0x58
+	.4byte	0x13187
+	.uleb128 0x4f
+	.8byte	.LVL836
+	.4byte	0x14360
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x130f0
-	.8byte	.LBB1831
-	.8byte	.LBE1831-.LBB1831
-	.byte	0x1
-	.2byte	0x546
-	.4byte	0x11d70
 	.uleb128 0x54
-	.4byte	0x1310b
-	.uleb128 0x54
-	.4byte	0x13100
-	.uleb128 0x56
-	.8byte	.LBB1832
-	.8byte	.LBE1832-.LBB1832
+	.4byte	0x13160
+	.8byte	.LBB1823
+	.8byte	.LBE1823-.LBB1823
+	.byte	0x1
+	.2byte	0x547
+	.4byte	0x11dfa
+	.uleb128 0x55
+	.4byte	0x1317b
+	.uleb128 0x55
+	.4byte	0x13170
 	.uleb128 0x57
-	.4byte	0x13116
-	.uleb128 0x4e
-	.8byte	.LVL910
-	.4byte	0x142d0
+	.8byte	.LBB1824
+	.8byte	.LBE1824-.LBB1824
+	.uleb128 0x58
+	.4byte	0x13187
+	.uleb128 0x4f
+	.8byte	.LVL911
+	.4byte	0x14360
 	.byte	0
 	.byte	0
-	.uleb128 0x4e
-	.8byte	.LVL764
-	.4byte	0x146e2
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL765
-	.4byte	0x14458
-	.uleb128 0x4e
-	.8byte	.LVL767
-	.4byte	0x14535
-	.uleb128 0x4e
+	.4byte	0x1477f
+	.uleb128 0x4f
+	.8byte	.LVL766
+	.4byte	0x144e8
+	.uleb128 0x4f
 	.8byte	.LVL768
-	.4byte	0x14458
-	.uleb128 0x4e
+	.4byte	0x145d2
+	.uleb128 0x4f
 	.8byte	.LVL769
-	.4byte	0x146ee
-	.uleb128 0x4e
+	.4byte	0x144e8
+	.uleb128 0x4f
 	.8byte	.LVL770
-	.4byte	0x145a3
-	.uleb128 0x4e
+	.4byte	0x1478b
+	.uleb128 0x4f
 	.8byte	.LVL771
-	.4byte	0x145a3
-	.uleb128 0x4e
+	.4byte	0x14640
+	.uleb128 0x4f
 	.8byte	.LVL772
-	.4byte	0x145a3
-	.uleb128 0x4e
-	.8byte	.LVL807
-	.4byte	0x144d2
-	.uleb128 0x4e
-	.8byte	.LVL809
-	.4byte	0x146fa
-	.uleb128 0x4e
+	.4byte	0x14640
+	.uleb128 0x4f
+	.8byte	.LVL773
+	.4byte	0x14640
+	.uleb128 0x4f
+	.8byte	.LVL808
+	.4byte	0x14562
+	.uleb128 0x4f
 	.8byte	.LVL810
-	.4byte	0x146a6
-	.uleb128 0x4e
-	.8byte	.LVL814
-	.4byte	0x14458
-	.uleb128 0x4e
-	.8byte	.LVL817
-	.4byte	0x14458
-	.uleb128 0x4e
+	.4byte	0x14797
+	.uleb128 0x4f
+	.8byte	.LVL811
+	.4byte	0x14743
+	.uleb128 0x4f
+	.8byte	.LVL815
+	.4byte	0x144e8
+	.uleb128 0x4f
 	.8byte	.LVL818
-	.4byte	0x14597
-	.uleb128 0x4e
+	.4byte	0x144e8
+	.uleb128 0x4f
 	.8byte	.LVL819
-	.4byte	0x146fa
-	.uleb128 0x4e
-	.8byte	.LVL821
-	.4byte	0x146a6
-	.uleb128 0x4e
-	.8byte	.LVL826
-	.4byte	0x1210e
-	.uleb128 0x4e
+	.4byte	0x14634
+	.uleb128 0x4f
+	.8byte	.LVL820
+	.4byte	0x14797
+	.uleb128 0x4f
+	.8byte	.LVL822
+	.4byte	0x14743
+	.uleb128 0x4f
 	.8byte	.LVL827
-	.4byte	0x144d2
-	.uleb128 0x4e
-	.8byte	.LVL829
-	.4byte	0x146fa
-	.uleb128 0x4e
-	.8byte	.LVL839
-	.4byte	0x146ee
-	.uleb128 0x4e
+	.4byte	0x12198
+	.uleb128 0x4f
+	.8byte	.LVL828
+	.4byte	0x14562
+	.uleb128 0x4f
+	.8byte	.LVL830
+	.4byte	0x14797
+	.uleb128 0x4f
 	.8byte	.LVL840
-	.4byte	0x145a3
-	.uleb128 0x4e
+	.4byte	0x1478b
+	.uleb128 0x4f
 	.8byte	.LVL841
-	.4byte	0x146fa
-	.uleb128 0x4e
+	.4byte	0x14640
+	.uleb128 0x4f
 	.8byte	.LVL842
-	.4byte	0x146a6
-	.uleb128 0x4e
+	.4byte	0x14797
+	.uleb128 0x4f
 	.8byte	.LVL843
-	.4byte	0x1300b
-	.uleb128 0x4e
+	.4byte	0x14743
+	.uleb128 0x4f
 	.8byte	.LVL844
-	.4byte	0x14706
-	.uleb128 0x4e
+	.4byte	0x1307b
+	.uleb128 0x4f
 	.8byte	.LVL845
-	.4byte	0x14458
-	.uleb128 0x4e
+	.4byte	0x147a3
+	.uleb128 0x4f
 	.8byte	.LVL846
-	.4byte	0x124fc
-	.uleb128 0x4e
+	.4byte	0x144e8
+	.uleb128 0x4f
 	.8byte	.LVL847
-	.4byte	0x146ee
-	.uleb128 0x4e
+	.4byte	0x1256c
+	.uleb128 0x4f
 	.8byte	.LVL848
-	.4byte	0x145a3
-	.uleb128 0x4e
+	.4byte	0x1478b
+	.uleb128 0x4f
 	.8byte	.LVL849
-	.4byte	0x145a3
-	.uleb128 0x4e
+	.4byte	0x14640
+	.uleb128 0x4f
 	.8byte	.LVL850
-	.4byte	0x14706
-	.uleb128 0x4e
+	.4byte	0x14640
+	.uleb128 0x4f
 	.8byte	.LVL851
-	.4byte	0x1210e
-	.uleb128 0x4e
-	.8byte	.LVL853
-	.4byte	0x14458
-	.uleb128 0x4e
+	.4byte	0x147a3
+	.uleb128 0x4f
+	.8byte	.LVL852
+	.4byte	0x12198
+	.uleb128 0x4f
 	.8byte	.LVL854
-	.4byte	0x124fc
-	.uleb128 0x4e
-	.8byte	.LVL856
-	.4byte	0x12f44
-	.uleb128 0x4e
+	.4byte	0x144e8
+	.uleb128 0x4f
+	.8byte	.LVL855
+	.4byte	0x1256c
+	.uleb128 0x4f
 	.8byte	.LVL857
-	.4byte	0x14706
-	.uleb128 0x4e
+	.4byte	0x12fb4
+	.uleb128 0x4f
 	.8byte	.LVL858
-	.4byte	0x1438e
-	.uleb128 0x4e
+	.4byte	0x147a3
+	.uleb128 0x4f
 	.8byte	.LVL859
-	.4byte	0x1210e
-	.uleb128 0x4e
+	.4byte	0x1441e
+	.uleb128 0x4f
 	.8byte	.LVL860
-	.4byte	0x144d2
-	.uleb128 0x4e
-	.8byte	.LVL862
-	.4byte	0x1438e
-	.uleb128 0x4e
+	.4byte	0x12198
+	.uleb128 0x4f
+	.8byte	.LVL861
+	.4byte	0x14562
+	.uleb128 0x4f
 	.8byte	.LVL863
-	.4byte	0x1210e
-	.uleb128 0x4e
+	.4byte	0x1441e
+	.uleb128 0x4f
 	.8byte	.LVL864
-	.4byte	0x14458
-	.uleb128 0x4e
+	.4byte	0x12198
+	.uleb128 0x4f
 	.8byte	.LVL865
-	.4byte	0x124fc
-	.uleb128 0x4e
+	.4byte	0x144e8
+	.uleb128 0x4f
 	.8byte	.LVL866
-	.4byte	0x14535
-	.uleb128 0x4e
-	.8byte	.LVL869
-	.4byte	0x14535
-	.uleb128 0x4e
-	.8byte	.LVL871
-	.4byte	0x14458
-	.uleb128 0x4e
+	.4byte	0x1256c
+	.uleb128 0x4f
+	.8byte	.LVL867
+	.4byte	0x145d2
+	.uleb128 0x4f
+	.8byte	.LVL870
+	.4byte	0x145d2
+	.uleb128 0x4f
 	.8byte	.LVL872
-	.4byte	0x146fa
-	.uleb128 0x4e
+	.4byte	0x144e8
+	.uleb128 0x4f
 	.8byte	.LVL873
-	.4byte	0x146a6
-	.uleb128 0x4e
+	.4byte	0x14797
+	.uleb128 0x4f
 	.8byte	.LVL874
-	.4byte	0x14458
-	.uleb128 0x4e
-	.8byte	.LVL877
-	.4byte	0x14458
-	.uleb128 0x4e
+	.4byte	0x14743
+	.uleb128 0x4f
+	.8byte	.LVL875
+	.4byte	0x144e8
+	.uleb128 0x4f
 	.8byte	.LVL878
-	.4byte	0x145a3
-	.uleb128 0x4e
-	.8byte	.LVL884
-	.4byte	0x14706
-	.uleb128 0x4e
+	.4byte	0x144e8
+	.uleb128 0x4f
+	.8byte	.LVL879
+	.4byte	0x14640
+	.uleb128 0x4f
 	.8byte	.LVL885
-	.4byte	0x1210e
-	.uleb128 0x4e
-	.8byte	.LVL889
-	.4byte	0x14458
-	.uleb128 0x4e
+	.4byte	0x147a3
+	.uleb128 0x4f
+	.8byte	.LVL886
+	.4byte	0x12198
+	.uleb128 0x4f
 	.8byte	.LVL890
-	.4byte	0x14712
-	.uleb128 0x4e
+	.4byte	0x144e8
+	.uleb128 0x4f
 	.8byte	.LVL891
-	.4byte	0x14597
-	.uleb128 0x4e
-	.8byte	.LVL894
-	.4byte	0x14712
-	.uleb128 0x4e
+	.4byte	0x147af
+	.uleb128 0x4f
+	.8byte	.LVL892
+	.4byte	0x14634
+	.uleb128 0x4f
 	.8byte	.LVL895
-	.4byte	0x14458
-	.uleb128 0x4e
-	.8byte	.LVL911
-	.4byte	0x1438e
-	.uleb128 0x4e
-	.8byte	.LVL913
-	.4byte	0x1438e
-	.uleb128 0x4e
-	.8byte	.LVL915
-	.4byte	0x145f9
+	.4byte	0x147af
+	.uleb128 0x4f
+	.8byte	.LVL896
+	.4byte	0x144e8
+	.uleb128 0x4f
+	.8byte	.LVL912
+	.4byte	0x1441e
+	.uleb128 0x4f
+	.8byte	.LVL914
+	.4byte	0x1441e
+	.uleb128 0x4f
+	.8byte	.LVL916
+	.4byte	0x14696
 	.byte	0
-	.uleb128 0x63
-	.4byte	.LASF3088
+	.uleb128 0x64
+	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x522
+	.2byte	0x523
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1210e
-	.uleb128 0x65
-	.4byte	.LASF3089
+	.4byte	0x12198
+	.uleb128 0x66
+	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x522
-	.4byte	0x467e
-	.uleb128 0x65
-	.4byte	.LASF3090
+	.2byte	0x523
+	.4byte	0x46ee
+	.uleb128 0x66
+	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x522
-	.4byte	0x467e
-	.uleb128 0x65
-	.4byte	.LASF3091
+	.2byte	0x523
+	.4byte	0x46ee
+	.uleb128 0x66
+	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x522
+	.2byte	0x523
 	.4byte	0xc6
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x524
-	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF3092
-	.byte	0x1
 	.2byte	0x525
-	.4byte	0x15a
-	.uleb128 0x46
-	.4byte	.LASF3093
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x525
+	.2byte	0x526
 	.4byte	0x15a
-	.uleb128 0x46
-	.4byte	.LASF3094
+	.uleb128 0x48
+	.4byte	.LASF3108
 	.byte	0x1
 	.2byte	0x526
-	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF3095
+	.4byte	0x15a
+	.uleb128 0x48
+	.4byte	.LASF3109
 	.byte	0x1
 	.2byte	0x527
-	.4byte	0x4684
-	.uleb128 0x46
-	.4byte	.LASF3096
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF3110
 	.byte	0x1
 	.2byte	0x528
-	.4byte	0x4684
-	.uleb128 0x72
-	.4byte	.LASF3097
+	.4byte	0x46f4
+	.uleb128 0x48
+	.4byte	.LASF3111
+	.byte	0x1
+	.2byte	0x529
+	.4byte	0x46f4
+	.uleb128 0x73
+	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x535
+	.2byte	0x536
 	.byte	0
-	.uleb128 0x50
-	.4byte	.LASF3098
+	.uleb128 0x51
+	.4byte	.LASF3113
 	.byte	0x1
-	.2byte	0x4c5
+	.2byte	0x4c6
 	.4byte	0xc6
-	.8byte	.LFB2824
-	.8byte	.LFE2824-.LFB2824
+	.8byte	.LFB2825
+	.8byte	.LFE2825-.LFB2825
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12262
-	.uleb128 0x51
+	.4byte	0x122ec
+	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x4c5
-	.4byte	0xe4c2
+	.2byte	0x4c6
+	.4byte	0xe53f
 	.4byte	.LLST75
-	.uleb128 0x46
-	.4byte	.LASF2961
-	.byte	0x1
-	.2byte	0x4c7
-	.4byte	0xe7b3
-	.uleb128 0x59
-	.4byte	.LASF3099
+	.uleb128 0x48
+	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x4c8
+	.4byte	0xe830
+	.uleb128 0x5a
+	.4byte	.LASF3114
+	.byte	0x1
+	.2byte	0x4c9
 	.4byte	0xc6
 	.4byte	.LLST76
-	.uleb128 0x69
+	.uleb128 0x6a
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x4c9
+	.2byte	0x4ca
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x64
-	.uleb128 0x53
-	.4byte	0x1336a
-	.8byte	.LBB1216
-	.8byte	.LBE1216-.LBB1216
-	.byte	0x1
-	.2byte	0x4cc
-	.4byte	0x12191
-	.uleb128 0x54
-	.4byte	0x13385
 	.uleb128 0x54
-	.4byte	0x1337a
+	.4byte	0x133f3
+	.8byte	.LBB1212
+	.8byte	.LBE1212-.LBB1212
+	.byte	0x1
+	.2byte	0x4cd
+	.4byte	0x1221b
+	.uleb128 0x55
+	.4byte	0x1340f
+	.uleb128 0x55
+	.4byte	0x13403
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL282
-	.4byte	0x14458
-	.uleb128 0x4e
+	.4byte	0x144e8
+	.uleb128 0x4f
 	.8byte	.LVL283
-	.4byte	0x1471e
-	.uleb128 0x4e
+	.4byte	0x147bb
+	.uleb128 0x4f
 	.8byte	.LVL287
-	.4byte	0x144d2
-	.uleb128 0x4e
+	.4byte	0x14562
+	.uleb128 0x4f
 	.8byte	.LVL288
-	.4byte	0x14458
-	.uleb128 0x4e
+	.4byte	0x144e8
+	.uleb128 0x4f
 	.8byte	.LVL290
-	.4byte	0x1471e
-	.uleb128 0x4e
+	.4byte	0x147bb
+	.uleb128 0x4f
 	.8byte	.LVL291
-	.4byte	0x144d2
-	.uleb128 0x4e
+	.4byte	0x14562
+	.uleb128 0x4f
 	.8byte	.LVL292
-	.4byte	0x1471e
-	.uleb128 0x4e
+	.4byte	0x147bb
+	.uleb128 0x4f
 	.8byte	.LVL293
-	.4byte	0x1471e
-	.uleb128 0x4e
+	.4byte	0x147bb
+	.uleb128 0x4f
 	.8byte	.LVL294
-	.4byte	0x1471e
-	.uleb128 0x4e
+	.4byte	0x147bb
+	.uleb128 0x4f
 	.8byte	.LVL295
-	.4byte	0x1471e
-	.uleb128 0x4e
+	.4byte	0x147bb
+	.uleb128 0x4f
 	.8byte	.LVL296
-	.4byte	0x1471e
-	.uleb128 0x4e
+	.4byte	0x147bb
+	.uleb128 0x4f
 	.8byte	.LVL297
-	.4byte	0x1471e
-	.uleb128 0x4e
+	.4byte	0x147bb
+	.uleb128 0x4f
 	.8byte	.LVL298
-	.4byte	0x1471e
-	.uleb128 0x4e
+	.4byte	0x147bb
+	.uleb128 0x4f
 	.8byte	.LVL299
-	.4byte	0x1471e
-	.uleb128 0x4e
+	.4byte	0x147bb
+	.uleb128 0x4f
 	.8byte	.LVL300
-	.4byte	0x14458
-	.uleb128 0x4e
+	.4byte	0x144e8
+	.uleb128 0x4f
 	.8byte	.LVL301
-	.4byte	0x145f9
+	.4byte	0x14696
 	.byte	0
-	.uleb128 0x4d
-	.4byte	.LASF3100
+	.uleb128 0x4e
+	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x49e
-	.8byte	.LFB2823
-	.8byte	.LFE2823-.LFB2823
+	.2byte	0x49f
+	.8byte	.LFB2824
+	.8byte	.LFE2824-.LFB2824
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1231b
-	.uleb128 0x46
-	.4byte	.LASF2961
-	.byte	0x1
-	.2byte	0x4a0
-	.4byte	0xe7b3
-	.uleb128 0x46
-	.4byte	.LASF3004
+	.4byte	0x123a5
+	.uleb128 0x48
+	.4byte	.LASF2975
 	.byte	0x1
 	.2byte	0x4a1
-	.4byte	0xe16c
-	.uleb128 0x4e
+	.4byte	0xe830
+	.uleb128 0x48
+	.4byte	.LASF3019
+	.byte	0x1
+	.2byte	0x4a2
+	.4byte	0xe1dc
+	.uleb128 0x4f
 	.8byte	.LVL265
-	.4byte	0x14458
-	.uleb128 0x4e
+	.4byte	0x144e8
+	.uleb128 0x4f
 	.8byte	.LVL266
-	.4byte	0x14597
-	.uleb128 0x4e
+	.4byte	0x14634
+	.uleb128 0x4f
 	.8byte	.LVL267
-	.4byte	0x14597
-	.uleb128 0x4e
+	.4byte	0x14634
+	.uleb128 0x4f
 	.8byte	.LVL268
-	.4byte	0x14503
-	.uleb128 0x4e
+	.4byte	0x14593
+	.uleb128 0x4f
 	.8byte	.LVL269
-	.4byte	0x14458
-	.uleb128 0x4e
+	.4byte	0x144e8
+	.uleb128 0x4f
 	.8byte	.LVL270
-	.4byte	0x144bc
-	.uleb128 0x4e
+	.4byte	0x1454c
+	.uleb128 0x4f
 	.8byte	.LVL271
-	.4byte	0x14535
-	.uleb128 0x4e
+	.4byte	0x145d2
+	.uleb128 0x4f
 	.8byte	.LVL272
-	.4byte	0x14597
-	.uleb128 0x4e
+	.4byte	0x14634
+	.uleb128 0x4f
 	.8byte	.LVL273
-	.4byte	0x14597
-	.uleb128 0x4e
+	.4byte	0x14634
+	.uleb128 0x4f
 	.8byte	.LVL274
-	.4byte	0x14503
+	.4byte	0x14593
 	.byte	0
-	.uleb128 0x4f
-	.4byte	.LASF3101
+	.uleb128 0x50
+	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x452
+	.2byte	0x453
 	.4byte	0xc6
-	.8byte	.LFB2822
-	.8byte	.LFE2822-.LFB2822
+	.8byte	.LFB2823
+	.8byte	.LFE2823-.LFB2823
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x124ec
-	.uleb128 0x58
+	.4byte	0x1255c
+	.uleb128 0x59
 	.4byte	.LASF794
 	.byte	0x1
-	.2byte	0x452
+	.2byte	0x453
 	.4byte	0x458
 	.4byte	.LLST145
-	.uleb128 0x69
+	.uleb128 0x6a
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x454
-	.4byte	0xe4c2
+	.2byte	0x455
+	.4byte	0xe53f
 	.uleb128 0x1
 	.byte	0x66
-	.uleb128 0x46
-	.4byte	.LASF3004
-	.byte	0x1
-	.2byte	0x455
-	.4byte	0xe16c
-	.uleb128 0x46
-	.4byte	.LASF2961
+	.uleb128 0x48
+	.4byte	.LASF3019
 	.byte	0x1
 	.2byte	0x456
-	.4byte	0xe7b3
-	.uleb128 0x62
+	.4byte	0xe1dc
+	.uleb128 0x48
+	.4byte	.LASF2975
+	.byte	0x1
+	.2byte	0x457
+	.4byte	0xe830
+	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0xb30
-	.4byte	0x12405
-	.uleb128 0x3f
+	.4byte	0x1248f
+	.uleb128 0x41
 	.byte	0x8
 	.byte	0x1
-	.2byte	0x45d
-	.4byte	0x1239e
-	.uleb128 0x41
-	.4byte	.LASF3102
+	.2byte	0x45e
+	.4byte	0x12428
+	.uleb128 0x43
+	.4byte	.LASF3117
 	.byte	0x1
-	.2byte	0x45d
+	.2byte	0x45e
 	.4byte	0x1a0
-	.uleb128 0x3d
+	.uleb128 0x3f
 	.string	"__c"
 	.byte	0x1
-	.2byte	0x45d
-	.4byte	0x124ec
+	.2byte	0x45e
+	.4byte	0x1255c
 	.byte	0
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"__u"
 	.byte	0x1
-	.2byte	0x45d
-	.4byte	0x1237c
-	.uleb128 0x5b
-	.4byte	0x13bb2
-	.8byte	.LBB1400
+	.2byte	0x45e
+	.4byte	0x12406
+	.uleb128 0x5c
+	.4byte	0x13c42
+	.8byte	.LBB1396
 	.4byte	.Ldebug_ranges0+0xb70
 	.byte	0x1
-	.2byte	0x45d
-	.4byte	0x123d2
-	.uleb128 0x54
-	.4byte	0x13bd5
-	.uleb128 0x54
-	.4byte	0x13bc9
-	.uleb128 0x54
-	.4byte	0x13bbf
+	.2byte	0x45e
+	.4byte	0x1245c
+	.uleb128 0x55
+	.4byte	0x13c65
+	.uleb128 0x55
+	.4byte	0x13c59
+	.uleb128 0x55
+	.4byte	0x13c4f
 	.byte	0
-	.uleb128 0x5d
-	.4byte	0x139b8
-	.8byte	.LBB1403
-	.8byte	.LBE1403-.LBB1403
+	.uleb128 0x5e
+	.4byte	0x13a41
+	.8byte	.LBB1399
+	.8byte	.LBE1399-.LBB1399
 	.byte	0x1
-	.2byte	0x45d
-	.uleb128 0x56
-	.8byte	.LBB1404
-	.8byte	.LBE1404-.LBB1404
-	.uleb128 0x61
-	.4byte	0x139c8
+	.2byte	0x45e
+	.uleb128 0x57
+	.8byte	.LBB1400
+	.8byte	.LBE1400-.LBB1400
+	.uleb128 0x62
+	.4byte	0x13a51
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x1384f
-	.8byte	.LBB1408
+	.uleb128 0x5c
+	.4byte	0x138ed
+	.8byte	.LBB1404
 	.4byte	.Ldebug_ranges0+0xba0
 	.byte	0x1
-	.2byte	0x495
-	.4byte	0x1245c
-	.uleb128 0x54
-	.4byte	0x13860
-	.uleb128 0x5f
-	.4byte	0x1386d
-	.8byte	.LBB1410
-	.4byte	.Ldebug_ranges0+0xbd0
-	.byte	0xd
-	.2byte	0x240
-	.uleb128 0x54
-	.4byte	0x13889
-	.uleb128 0x54
-	.4byte	0x1387e
-	.uleb128 0x4e
+	.2byte	0x496
+	.4byte	0x124cc
+	.uleb128 0x55
+	.4byte	0x13909
+	.uleb128 0x55
+	.4byte	0x138fe
+	.uleb128 0x4f
 	.8byte	.LVL497
-	.4byte	0x1472a
-	.uleb128 0x4e
+	.4byte	0x147c7
+	.uleb128 0x4f
 	.8byte	.LVL504
-	.4byte	0x1472a
+	.4byte	0x147c7
 	.byte	0
-	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL492
-	.4byte	0x14737
-	.uleb128 0x4e
+	.4byte	0x147d4
+	.uleb128 0x4f
 	.8byte	.LVL493
-	.4byte	0x1465a
-	.uleb128 0x4e
+	.4byte	0x146f7
+	.uleb128 0x4f
 	.8byte	.LVL494
-	.4byte	0x14741
-	.uleb128 0x4e
+	.4byte	0x147de
+	.uleb128 0x4f
 	.8byte	.LVL495
-	.4byte	0x141cd
-	.uleb128 0x4e
+	.4byte	0x1425d
+	.uleb128 0x4f
 	.8byte	.LVL496
-	.4byte	0x12ada
-	.uleb128 0x4e
+	.4byte	0x12b4a
+	.uleb128 0x4f
 	.8byte	.LVL498
-	.4byte	0x141cd
-	.uleb128 0x4e
+	.4byte	0x1425d
+	.uleb128 0x4f
 	.8byte	.LVL499
-	.4byte	0x128f0
-	.uleb128 0x4e
+	.4byte	0x12960
+	.uleb128 0x4f
 	.8byte	.LVL500
-	.4byte	0x141cd
-	.uleb128 0x4e
+	.4byte	0x1425d
+	.uleb128 0x4f
 	.8byte	.LVL501
-	.4byte	0x12c3b
-	.uleb128 0x4e
+	.4byte	0x12cab
+	.uleb128 0x4f
 	.8byte	.LVL502
-	.4byte	0x141cd
-	.uleb128 0x4e
+	.4byte	0x1425d
+	.uleb128 0x4f
 	.8byte	.LVL503
-	.4byte	0x12706
+	.4byte	0x12776
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x124fc
+	.4byte	0x1256c
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
-	.uleb128 0x4d
-	.4byte	.LASF3103
+	.uleb128 0x4e
+	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x3fe
-	.8byte	.LFB2821
-	.8byte	.LFE2821-.LFB2821
+	.2byte	0x3ff
+	.8byte	.LFB2822
+	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x126a8
-	.uleb128 0x51
+	.4byte	0x12718
+	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x3fe
-	.4byte	0xe4c2
+	.2byte	0x3ff
+	.4byte	0xe53f
 	.4byte	.LLST144
-	.uleb128 0x46
-	.4byte	.LASF3004
-	.byte	0x1
-	.2byte	0x400
-	.4byte	0xe16c
-	.uleb128 0x46
-	.4byte	.LASF2961
+	.uleb128 0x48
+	.4byte	.LASF3019
 	.byte	0x1
 	.2byte	0x401
-	.4byte	0xe7b3
-	.uleb128 0x55
-	.4byte	.LASF3032
-	.4byte	0xb940
+	.4byte	0xe1dc
+	.uleb128 0x48
+	.4byte	.LASF2975
+	.byte	0x1
+	.2byte	0x402
+	.4byte	0xe830
+	.uleb128 0x56
+	.4byte	.LASF3047
+	.4byte	0xb9b0
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34778
-	.uleb128 0x53
-	.4byte	0x126a8
-	.8byte	.LBB1391
-	.8byte	.LBE1391-.LBB1391
-	.byte	0x1
-	.2byte	0x40b
-	.4byte	0x12589
+	.8byte	__func__.34785
 	.uleb128 0x54
-	.4byte	0x126c1
-	.uleb128 0x54
-	.4byte	0x126b5
-	.uleb128 0x4e
+	.4byte	0x12718
+	.8byte	.LBB1387
+	.8byte	.LBE1387-.LBB1387
+	.byte	0x1
+	.2byte	0x40c
+	.4byte	0x125f9
+	.uleb128 0x55
+	.4byte	0x12731
+	.uleb128 0x55
+	.4byte	0x12725
+	.uleb128 0x4f
 	.8byte	.LVL464
-	.4byte	0x141cd
+	.4byte	0x1425d
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x126a8
-	.8byte	.LBB1393
-	.8byte	.LBE1393-.LBB1393
-	.byte	0x1
-	.2byte	0x41f
-	.4byte	0x125bd
-	.uleb128 0x54
-	.4byte	0x126c1
 	.uleb128 0x54
-	.4byte	0x126b5
-	.uleb128 0x4e
+	.4byte	0x12718
+	.8byte	.LBB1389
+	.8byte	.LBE1389-.LBB1389
+	.byte	0x1
+	.2byte	0x420
+	.4byte	0x1262d
+	.uleb128 0x55
+	.4byte	0x12731
+	.uleb128 0x55
+	.4byte	0x12725
+	.uleb128 0x4f
 	.8byte	.LVL469
-	.4byte	0x141cd
+	.4byte	0x1425d
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x126a8
-	.8byte	.LBB1395
-	.8byte	.LBE1395-.LBB1395
-	.byte	0x1
-	.2byte	0x446
-	.4byte	0x125f1
 	.uleb128 0x54
-	.4byte	0x126c1
-	.uleb128 0x54
-	.4byte	0x126b5
-	.uleb128 0x4e
+	.4byte	0x12718
+	.8byte	.LBB1391
+	.8byte	.LBE1391-.LBB1391
+	.byte	0x1
+	.2byte	0x447
+	.4byte	0x12661
+	.uleb128 0x55
+	.4byte	0x12731
+	.uleb128 0x55
+	.4byte	0x12725
+	.uleb128 0x4f
 	.8byte	.LVL474
-	.4byte	0x141cd
+	.4byte	0x1425d
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x126a8
-	.8byte	.LBB1397
-	.8byte	.LBE1397-.LBB1397
-	.byte	0x1
-	.2byte	0x439
-	.4byte	0x12625
 	.uleb128 0x54
-	.4byte	0x126c1
-	.uleb128 0x54
-	.4byte	0x126b5
-	.uleb128 0x4e
+	.4byte	0x12718
+	.8byte	.LBB1393
+	.8byte	.LBE1393-.LBB1393
+	.byte	0x1
+	.2byte	0x43a
+	.4byte	0x12695
+	.uleb128 0x55
+	.4byte	0x12731
+	.uleb128 0x55
+	.4byte	0x12725
+	.uleb128 0x4f
 	.8byte	.LVL479
-	.4byte	0x141cd
+	.4byte	0x1425d
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL463
-	.4byte	0x12ada
-	.uleb128 0x4e
+	.4byte	0x12b4a
+	.uleb128 0x4f
 	.8byte	.LVL465
-	.4byte	0x12ada
-	.uleb128 0x4e
+	.4byte	0x12b4a
+	.uleb128 0x4f
 	.8byte	.LVL468
-	.4byte	0x12c3b
-	.uleb128 0x4e
+	.4byte	0x12cab
+	.uleb128 0x4f
 	.8byte	.LVL470
-	.4byte	0x12c3b
-	.uleb128 0x4e
+	.4byte	0x12cab
+	.uleb128 0x4f
 	.8byte	.LVL473
-	.4byte	0x128f0
-	.uleb128 0x4e
+	.4byte	0x12960
+	.uleb128 0x4f
 	.8byte	.LVL475
-	.4byte	0x128f0
-	.uleb128 0x4e
+	.4byte	0x12960
+	.uleb128 0x4f
 	.8byte	.LVL478
-	.4byte	0x12706
-	.uleb128 0x4e
+	.4byte	0x12776
+	.uleb128 0x4f
 	.8byte	.LVL480
-	.4byte	0x12706
-	.uleb128 0x4e
+	.4byte	0x12776
+	.uleb128 0x4f
 	.8byte	.LVL483
-	.4byte	0x14458
-	.uleb128 0x4e
+	.4byte	0x144e8
+	.uleb128 0x4f
 	.8byte	.LVL486
-	.4byte	0x14458
+	.4byte	0x144e8
 	.byte	0
-	.uleb128 0x66
-	.4byte	.LASF3104
+	.uleb128 0x67
+	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x3f8
+	.2byte	0x3f9
 	.byte	0x1
-	.4byte	0x126ce
-	.uleb128 0x65
-	.4byte	.LASF3004
+	.4byte	0x1273e
+	.uleb128 0x66
+	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x3f8
-	.4byte	0xe16c
-	.uleb128 0x65
-	.4byte	.LASF2961
+	.2byte	0x3f9
+	.4byte	0xe1dc
+	.uleb128 0x66
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x3f8
-	.4byte	0xe7b3
+	.2byte	0x3f9
+	.4byte	0xe830
 	.byte	0
-	.uleb128 0x66
-	.4byte	.LASF3105
+	.uleb128 0x67
+	.4byte	.LASF3120
 	.byte	0x1
-	.2byte	0x3ed
+	.2byte	0x3ee
 	.byte	0x1
-	.4byte	0x12700
-	.uleb128 0x65
-	.4byte	.LASF3004
+	.4byte	0x12770
+	.uleb128 0x66
+	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x3ed
-	.4byte	0xe16c
-	.uleb128 0x65
-	.4byte	.LASF2961
+	.2byte	0x3ee
+	.4byte	0xe1dc
+	.uleb128 0x66
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x3ed
-	.4byte	0xe7b3
-	.uleb128 0x52
+	.2byte	0x3ee
+	.4byte	0xe830
+	.uleb128 0x53
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x3ef
-	.4byte	0x12700
+	.2byte	0x3f0
+	.4byte	0x12770
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdef6
-	.uleb128 0x66
-	.4byte	.LASF3106
-	.byte	0x1
-	.2byte	0x3e3
+	.4byte	0xdf66
+	.uleb128 0x67
+	.4byte	.LASF3121
 	.byte	0x1
-	.4byte	0x12744
-	.uleb128 0x65
-	.4byte	.LASF3107
+	.2byte	0x3e4
 	.byte	0x1
-	.2byte	0x3e3
-	.4byte	0xc0c8
-	.uleb128 0x65
-	.4byte	.LASF3108
+	.4byte	0x127b4
+	.uleb128 0x66
+	.4byte	.LASF3122
 	.byte	0x1
 	.2byte	0x3e4
-	.4byte	0xac0
-	.uleb128 0x65
-	.4byte	.LASF3109
+	.4byte	0xc138
+	.uleb128 0x66
+	.4byte	.LASF3123
 	.byte	0x1
-	.2byte	0x3e4
+	.2byte	0x3e5
 	.4byte	0xac0
-	.uleb128 0x65
-	.4byte	.LASF2961
+	.uleb128 0x66
+	.4byte	.LASF3124
 	.byte	0x1
 	.2byte	0x3e5
-	.4byte	0xe7b3
-	.byte	0
+	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3110
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x3b9
+	.2byte	0x3e6
+	.4byte	0xe830
+	.byte	0
+	.uleb128 0x67
+	.4byte	.LASF3125
 	.byte	0x1
-	.4byte	0x1281a
-	.uleb128 0x65
-	.4byte	.LASF3107
+	.2byte	0x3ba
 	.byte	0x1
-	.2byte	0x3b9
-	.4byte	0xc0c8
-	.uleb128 0x65
-	.4byte	.LASF3108
+	.4byte	0x1288a
+	.uleb128 0x66
+	.4byte	.LASF3122
 	.byte	0x1
 	.2byte	0x3ba
-	.4byte	0xac0
-	.uleb128 0x65
-	.4byte	.LASF3109
+	.4byte	0xc138
+	.uleb128 0x66
+	.4byte	.LASF3123
 	.byte	0x1
-	.2byte	0x3ba
+	.2byte	0x3bb
 	.4byte	0xac0
-	.uleb128 0x65
-	.4byte	.LASF2961
+	.uleb128 0x66
+	.4byte	.LASF3124
 	.byte	0x1
 	.2byte	0x3bb
-	.4byte	0xe7b3
-	.uleb128 0x46
-	.4byte	.LASF3004
+	.4byte	0xac0
+	.uleb128 0x66
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x3bd
-	.4byte	0xe16c
-	.uleb128 0x46
-	.4byte	.LASF3111
+	.2byte	0x3bc
+	.4byte	0xe830
+	.uleb128 0x48
+	.4byte	.LASF3019
 	.byte	0x1
 	.2byte	0x3be
-	.4byte	0x15a
-	.uleb128 0x46
-	.4byte	.LASF3112
+	.4byte	0xe1dc
+	.uleb128 0x48
+	.4byte	.LASF3126
 	.byte	0x1
-	.2byte	0x3be
+	.2byte	0x3bf
 	.4byte	0x15a
-	.uleb128 0x46
-	.4byte	.LASF3113
+	.uleb128 0x48
+	.4byte	.LASF3127
 	.byte	0x1
-	.2byte	0x3be
-	.4byte	0x4684
-	.uleb128 0x46
-	.4byte	.LASF3114
+	.2byte	0x3bf
+	.4byte	0x15a
+	.uleb128 0x48
+	.4byte	.LASF3128
 	.byte	0x1
-	.2byte	0x3be
-	.4byte	0x4684
-	.uleb128 0x46
-	.4byte	.LASF3115
+	.2byte	0x3bf
+	.4byte	0x46f4
+	.uleb128 0x48
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x3bf
-	.4byte	0xc0c8
-	.uleb128 0x46
-	.4byte	.LASF2900
+	.4byte	0x46f4
+	.uleb128 0x48
+	.4byte	.LASF3130
 	.byte	0x1
 	.2byte	0x3c0
+	.4byte	0xc138
+	.uleb128 0x48
+	.4byte	.LASF2914
+	.byte	0x1
+	.2byte	0x3c1
 	.4byte	0xc6
-	.uleb128 0x46
+	.uleb128 0x48
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x3c0
+	.2byte	0x3c1
 	.4byte	0xc6
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x3c1
+	.2byte	0x3c2
 	.4byte	0xc6
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
-	.2byte	0x3c1
-	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF3116
-	.byte	0x1
 	.2byte	0x3c2
 	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF2857
+	.uleb128 0x48
+	.4byte	.LASF3131
 	.byte	0x1
 	.2byte	0x3c3
-	.4byte	0xc0c8
-	.uleb128 0x46
-	.4byte	.LASF2946
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF2871
 	.byte	0x1
 	.2byte	0x3c4
+	.4byte	0xc138
+	.uleb128 0x48
+	.4byte	.LASF2960
+	.byte	0x1
+	.2byte	0x3c5
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x66
-	.4byte	.LASF3117
-	.byte	0x1
-	.2byte	0x390
+	.uleb128 0x67
+	.4byte	.LASF3132
 	.byte	0x1
-	.4byte	0x128f0
-	.uleb128 0x65
-	.4byte	.LASF3107
+	.2byte	0x391
 	.byte	0x1
-	.2byte	0x390
-	.4byte	0xc0c8
-	.uleb128 0x65
-	.4byte	.LASF3108
+	.4byte	0x12960
+	.uleb128 0x66
+	.4byte	.LASF3122
 	.byte	0x1
 	.2byte	0x391
-	.4byte	0xac0
-	.uleb128 0x65
-	.4byte	.LASF3109
+	.4byte	0xc138
+	.uleb128 0x66
+	.4byte	.LASF3123
 	.byte	0x1
-	.2byte	0x391
+	.2byte	0x392
 	.4byte	0xac0
-	.uleb128 0x65
-	.4byte	.LASF2961
+	.uleb128 0x66
+	.4byte	.LASF3124
 	.byte	0x1
 	.2byte	0x392
-	.4byte	0xe7b3
-	.uleb128 0x46
-	.4byte	.LASF3004
+	.4byte	0xac0
+	.uleb128 0x66
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x394
-	.4byte	0xe16c
-	.uleb128 0x46
-	.4byte	.LASF3111
+	.2byte	0x393
+	.4byte	0xe830
+	.uleb128 0x48
+	.4byte	.LASF3019
 	.byte	0x1
 	.2byte	0x395
-	.4byte	0x13f
-	.uleb128 0x46
-	.4byte	.LASF3112
+	.4byte	0xe1dc
+	.uleb128 0x48
+	.4byte	.LASF3126
 	.byte	0x1
-	.2byte	0x395
+	.2byte	0x396
 	.4byte	0x13f
-	.uleb128 0x46
-	.4byte	.LASF3113
+	.uleb128 0x48
+	.4byte	.LASF3127
 	.byte	0x1
-	.2byte	0x395
-	.4byte	0xac0
-	.uleb128 0x46
-	.4byte	.LASF3114
+	.2byte	0x396
+	.4byte	0x13f
+	.uleb128 0x48
+	.4byte	.LASF3128
 	.byte	0x1
-	.2byte	0x395
+	.2byte	0x396
 	.4byte	0xac0
-	.uleb128 0x46
-	.4byte	.LASF3115
+	.uleb128 0x48
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x396
-	.4byte	0xc0c8
-	.uleb128 0x46
-	.4byte	.LASF2900
+	.4byte	0xac0
+	.uleb128 0x48
+	.4byte	.LASF3130
 	.byte	0x1
 	.2byte	0x397
+	.4byte	0xc138
+	.uleb128 0x48
+	.4byte	.LASF2914
+	.byte	0x1
+	.2byte	0x398
 	.4byte	0xc6
-	.uleb128 0x46
+	.uleb128 0x48
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x397
+	.2byte	0x398
 	.4byte	0xc6
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x398
+	.2byte	0x399
 	.4byte	0xc6
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
-	.2byte	0x398
-	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF3116
-	.byte	0x1
 	.2byte	0x399
 	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF2857
+	.uleb128 0x48
+	.4byte	.LASF3131
 	.byte	0x1
 	.2byte	0x39a
-	.4byte	0xc0c8
-	.uleb128 0x46
-	.4byte	.LASF2946
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF2871
 	.byte	0x1
 	.2byte	0x39b
+	.4byte	0xc138
+	.uleb128 0x48
+	.4byte	.LASF2960
+	.byte	0x1
+	.2byte	0x39c
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x66
-	.4byte	.LASF3118
-	.byte	0x1
-	.2byte	0x385
+	.uleb128 0x67
+	.4byte	.LASF3133
 	.byte	0x1
-	.4byte	0x1292e
-	.uleb128 0x65
-	.4byte	.LASF3107
+	.2byte	0x386
 	.byte	0x1
-	.2byte	0x385
-	.4byte	0xc0c8
-	.uleb128 0x65
-	.4byte	.LASF3108
+	.4byte	0x1299e
+	.uleb128 0x66
+	.4byte	.LASF3122
 	.byte	0x1
 	.2byte	0x386
-	.4byte	0xac0
-	.uleb128 0x65
-	.4byte	.LASF3109
+	.4byte	0xc138
+	.uleb128 0x66
+	.4byte	.LASF3123
 	.byte	0x1
-	.2byte	0x386
+	.2byte	0x387
 	.4byte	0xac0
-	.uleb128 0x65
-	.4byte	.LASF2961
+	.uleb128 0x66
+	.4byte	.LASF3124
 	.byte	0x1
 	.2byte	0x387
-	.4byte	0xe7b3
-	.byte	0
+	.4byte	0xac0
 	.uleb128 0x66
-	.4byte	.LASF3119
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x361
+	.2byte	0x388
+	.4byte	0xe830
+	.byte	0
+	.uleb128 0x67
+	.4byte	.LASF3134
 	.byte	0x1
-	.4byte	0x12a04
-	.uleb128 0x65
-	.4byte	.LASF3107
+	.2byte	0x362
 	.byte	0x1
-	.2byte	0x361
-	.4byte	0xc0c8
-	.uleb128 0x65
-	.4byte	.LASF3108
+	.4byte	0x12a74
+	.uleb128 0x66
+	.4byte	.LASF3122
 	.byte	0x1
 	.2byte	0x362
-	.4byte	0xac0
-	.uleb128 0x65
-	.4byte	.LASF3109
+	.4byte	0xc138
+	.uleb128 0x66
+	.4byte	.LASF3123
 	.byte	0x1
-	.2byte	0x362
+	.2byte	0x363
 	.4byte	0xac0
-	.uleb128 0x65
-	.4byte	.LASF2961
+	.uleb128 0x66
+	.4byte	.LASF3124
 	.byte	0x1
 	.2byte	0x363
-	.4byte	0xe7b3
-	.uleb128 0x46
-	.4byte	.LASF3004
+	.4byte	0xac0
+	.uleb128 0x66
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x365
-	.4byte	0xe16c
-	.uleb128 0x52
-	.string	"i"
+	.2byte	0x364
+	.4byte	0xe830
+	.uleb128 0x48
+	.4byte	.LASF3019
 	.byte	0x1
 	.2byte	0x366
-	.4byte	0xc6
-	.uleb128 0x52
-	.string	"j"
+	.4byte	0xe1dc
+	.uleb128 0x53
+	.string	"i"
 	.byte	0x1
-	.2byte	0x366
+	.2byte	0x367
 	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF2900
+	.uleb128 0x53
+	.string	"j"
 	.byte	0x1
 	.2byte	0x367
 	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF262
+	.uleb128 0x48
+	.4byte	.LASF2914
 	.byte	0x1
 	.2byte	0x368
 	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF3111
+	.uleb128 0x48
+	.4byte	.LASF262
 	.byte	0x1
 	.2byte	0x369
-	.4byte	0x13f
-	.uleb128 0x46
-	.4byte	.LASF3112
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF3126
 	.byte	0x1
-	.2byte	0x369
+	.2byte	0x36a
 	.4byte	0x13f
-	.uleb128 0x46
-	.4byte	.LASF3113
+	.uleb128 0x48
+	.4byte	.LASF3127
 	.byte	0x1
-	.2byte	0x369
-	.4byte	0xac0
-	.uleb128 0x46
-	.4byte	.LASF3114
+	.2byte	0x36a
+	.4byte	0x13f
+	.uleb128 0x48
+	.4byte	.LASF3128
 	.byte	0x1
-	.2byte	0x369
+	.2byte	0x36a
 	.4byte	0xac0
-	.uleb128 0x46
-	.4byte	.LASF3115
+	.uleb128 0x48
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x36a
-	.4byte	0xc0c8
-	.uleb128 0x46
-	.4byte	.LASF3116
+	.4byte	0xac0
+	.uleb128 0x48
+	.4byte	.LASF3130
 	.byte	0x1
 	.2byte	0x36b
-	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF2857
+	.4byte	0xc138
+	.uleb128 0x48
+	.4byte	.LASF3131
 	.byte	0x1
 	.2byte	0x36c
-	.4byte	0xc0c8
-	.uleb128 0x46
-	.4byte	.LASF2946
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF2871
 	.byte	0x1
 	.2byte	0x36d
+	.4byte	0xc138
+	.uleb128 0x48
+	.4byte	.LASF2960
+	.byte	0x1
+	.2byte	0x36e
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x66
-	.4byte	.LASF3120
-	.byte	0x1
-	.2byte	0x33a
+	.uleb128 0x67
+	.4byte	.LASF3135
 	.byte	0x1
-	.4byte	0x12ada
-	.uleb128 0x65
-	.4byte	.LASF3107
+	.2byte	0x33b
 	.byte	0x1
-	.2byte	0x33a
-	.4byte	0xc0c8
-	.uleb128 0x65
-	.4byte	.LASF3108
+	.4byte	0x12b4a
+	.uleb128 0x66
+	.4byte	.LASF3122
 	.byte	0x1
 	.2byte	0x33b
+	.4byte	0xc138
+	.uleb128 0x66
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x33c
 	.4byte	0xac0
-	.uleb128 0x65
-	.4byte	.LASF3109
+	.uleb128 0x66
+	.4byte	.LASF3124
 	.byte	0x1
-	.2byte	0x33b
+	.2byte	0x33c
 	.4byte	0xac0
-	.uleb128 0x65
-	.4byte	.LASF2961
+	.uleb128 0x66
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x33c
-	.4byte	0xe7b3
-	.uleb128 0x46
-	.4byte	.LASF3004
+	.2byte	0x33d
+	.4byte	0xe830
+	.uleb128 0x48
+	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x33e
-	.4byte	0xe16c
-	.uleb128 0x52
+	.2byte	0x33f
+	.4byte	0xe1dc
+	.uleb128 0x53
 	.string	"i"
 	.byte	0x1
-	.2byte	0x33f
+	.2byte	0x340
 	.4byte	0xc6
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
-	.2byte	0x33f
-	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF2900
-	.byte	0x1
 	.2byte	0x340
 	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF262
+	.uleb128 0x48
+	.4byte	.LASF2914
 	.byte	0x1
 	.2byte	0x341
 	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF3111
+	.uleb128 0x48
+	.4byte	.LASF262
 	.byte	0x1
 	.2byte	0x342
-	.4byte	0x15a
-	.uleb128 0x46
-	.4byte	.LASF3112
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF3126
 	.byte	0x1
-	.2byte	0x342
+	.2byte	0x343
 	.4byte	0x15a
-	.uleb128 0x46
-	.4byte	.LASF3113
+	.uleb128 0x48
+	.4byte	.LASF3127
 	.byte	0x1
-	.2byte	0x342
-	.4byte	0x4684
-	.uleb128 0x46
-	.4byte	.LASF3114
+	.2byte	0x343
+	.4byte	0x15a
+	.uleb128 0x48
+	.4byte	.LASF3128
 	.byte	0x1
-	.2byte	0x342
-	.4byte	0x4684
-	.uleb128 0x46
-	.4byte	.LASF3115
+	.2byte	0x343
+	.4byte	0x46f4
+	.uleb128 0x48
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x343
-	.4byte	0xc0c8
-	.uleb128 0x46
-	.4byte	.LASF3116
+	.4byte	0x46f4
+	.uleb128 0x48
+	.4byte	.LASF3130
 	.byte	0x1
 	.2byte	0x344
-	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF2857
+	.4byte	0xc138
+	.uleb128 0x48
+	.4byte	.LASF3131
 	.byte	0x1
 	.2byte	0x345
-	.4byte	0xc0c8
-	.uleb128 0x46
-	.4byte	.LASF2946
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF2871
 	.byte	0x1
 	.2byte	0x346
+	.4byte	0xc138
+	.uleb128 0x48
+	.4byte	.LASF2960
+	.byte	0x1
+	.2byte	0x347
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x4d
-	.4byte	.LASF3121
+	.uleb128 0x4e
+	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x26c
-	.8byte	.LFB2812
-	.8byte	.LFE2812-.LFB2812
+	.2byte	0x26d
+	.8byte	.LFB2813
+	.8byte	.LFE2813-.LFB2813
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12c3b
-	.uleb128 0x74
-	.4byte	.LASF3107
+	.4byte	0x12cab
+	.uleb128 0x75
+	.4byte	.LASF3122
 	.byte	0x1
-	.2byte	0x26c
-	.4byte	0xc0c8
+	.2byte	0x26d
+	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
-	.uleb128 0x74
-	.4byte	.LASF3108
+	.uleb128 0x75
+	.4byte	.LASF3123
 	.byte	0x1
-	.2byte	0x26c
+	.2byte	0x26d
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
-	.uleb128 0x74
-	.4byte	.LASF3109
+	.uleb128 0x75
+	.4byte	.LASF3124
 	.byte	0x1
-	.2byte	0x26c
+	.2byte	0x26d
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
-	.uleb128 0x74
-	.4byte	.LASF3122
+	.uleb128 0x75
+	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x26d
-	.4byte	0xc0c8
+	.2byte	0x26e
+	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
-	.uleb128 0x74
-	.4byte	.LASF2961
+	.uleb128 0x75
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x26d
-	.4byte	0xe7b3
+	.2byte	0x26e
+	.4byte	0xe830
 	.uleb128 0x1
 	.byte	0x54
-	.uleb128 0x46
-	.4byte	.LASF3004
+	.uleb128 0x48
+	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x26f
-	.4byte	0xe16c
-	.uleb128 0x69
+	.2byte	0x270
+	.4byte	0xe1dc
+	.uleb128 0x6a
 	.string	"i"
 	.byte	0x1
-	.2byte	0x270
+	.2byte	0x271
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5d
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
-	.2byte	0x271
+	.2byte	0x272
 	.4byte	0xc6
-	.uleb128 0x4c
-	.4byte	.LASF2900
+	.uleb128 0x4d
+	.4byte	.LASF2914
 	.byte	0x1
-	.2byte	0x272
+	.2byte	0x273
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x62
-	.uleb128 0x4c
+	.uleb128 0x4d
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x273
+	.2byte	0x274
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5b
-	.uleb128 0x59
-	.4byte	.LASF3111
+	.uleb128 0x5a
+	.4byte	.LASF3126
 	.byte	0x1
-	.2byte	0x274
+	.2byte	0x275
 	.4byte	0x13f
 	.4byte	.LLST6
-	.uleb128 0x59
-	.4byte	.LASF3112
+	.uleb128 0x5a
+	.4byte	.LASF3127
 	.byte	0x1
-	.2byte	0x274
+	.2byte	0x275
 	.4byte	0x13f
 	.4byte	.LLST7
-	.uleb128 0x46
-	.4byte	.LASF3123
+	.uleb128 0x48
+	.4byte	.LASF3138
 	.byte	0x1
-	.2byte	0x274
+	.2byte	0x275
 	.4byte	0x13f
-	.uleb128 0x4c
-	.4byte	.LASF3113
+	.uleb128 0x4d
+	.4byte	.LASF3128
 	.byte	0x1
-	.2byte	0x275
+	.2byte	0x276
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
-	.uleb128 0x4c
-	.4byte	.LASF3114
+	.uleb128 0x4d
+	.4byte	.LASF3129
 	.byte	0x1
-	.2byte	0x275
+	.2byte	0x276
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
-	.uleb128 0x59
-	.4byte	.LASF3115
+	.uleb128 0x5a
+	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x276
-	.4byte	0xc0c8
+	.2byte	0x277
+	.4byte	0xc138
 	.4byte	.LLST8
-	.uleb128 0x46
-	.4byte	.LASF2970
+	.uleb128 0x48
+	.4byte	.LASF2984
 	.byte	0x1
-	.2byte	0x277
+	.2byte	0x278
 	.4byte	0x110
-	.uleb128 0x4c
-	.4byte	.LASF3124
+	.uleb128 0x4d
+	.4byte	.LASF3139
 	.byte	0x1
-	.2byte	0x278
-	.4byte	0xc0c8
+	.2byte	0x279
+	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
-	.uleb128 0x46
-	.4byte	.LASF3125
-	.byte	0x1
-	.2byte	0x279
-	.4byte	0x110
-	.uleb128 0x46
-	.4byte	.LASF2857
+	.uleb128 0x48
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x27a
-	.4byte	0xc0c8
-	.uleb128 0x46
-	.4byte	.LASF2946
+	.4byte	0x110
+	.uleb128 0x48
+	.4byte	.LASF2871
 	.byte	0x1
 	.2byte	0x27b
-	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF3126
+	.4byte	0xc138
+	.uleb128 0x48
+	.4byte	.LASF2960
 	.byte	0x1
 	.2byte	0x27c
-	.4byte	0x110
-	.uleb128 0x46
-	.4byte	.LASF3127
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF3141
 	.byte	0x1
-	.2byte	0x27c
+	.2byte	0x27d
 	.4byte	0x110
-	.uleb128 0x59
-	.4byte	.LASF3128
+	.uleb128 0x48
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x27d
+	.4byte	0x110
+	.uleb128 0x5a
+	.4byte	.LASF3143
+	.byte	0x1
+	.2byte	0x27e
 	.4byte	0x13f
 	.4byte	.LLST9
 	.byte	0
-	.uleb128 0x4d
-	.4byte	.LASF3129
+	.uleb128 0x4e
+	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x1c7
-	.8byte	.LFB2811
-	.8byte	.LFE2811-.LFB2811
+	.2byte	0x1c8
+	.8byte	.LFB2812
+	.8byte	.LFE2812-.LFB2812
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12d96
-	.uleb128 0x74
-	.4byte	.LASF3107
+	.4byte	0x12e06
+	.uleb128 0x75
+	.4byte	.LASF3122
 	.byte	0x1
-	.2byte	0x1c7
-	.4byte	0xc0c8
+	.2byte	0x1c8
+	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x50
-	.uleb128 0x74
-	.4byte	.LASF3108
+	.uleb128 0x75
+	.4byte	.LASF3123
 	.byte	0x1
-	.2byte	0x1c7
+	.2byte	0x1c8
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
-	.uleb128 0x74
-	.4byte	.LASF3109
+	.uleb128 0x75
+	.4byte	.LASF3124
 	.byte	0x1
-	.2byte	0x1c7
+	.2byte	0x1c8
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
-	.uleb128 0x74
-	.4byte	.LASF3122
+	.uleb128 0x75
+	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x1c8
-	.4byte	0xc0c8
+	.2byte	0x1c9
+	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
-	.uleb128 0x74
-	.4byte	.LASF2961
+	.uleb128 0x75
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x1c8
-	.4byte	0xe7b3
+	.2byte	0x1c9
+	.4byte	0xe830
 	.uleb128 0x1
 	.byte	0x54
-	.uleb128 0x46
-	.4byte	.LASF3004
+	.uleb128 0x48
+	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x1ca
-	.4byte	0xe16c
-	.uleb128 0x5a
+	.2byte	0x1cb
+	.4byte	0xe1dc
+	.uleb128 0x5b
 	.string	"i"
 	.byte	0x1
-	.2byte	0x1cb
+	.2byte	0x1cc
 	.4byte	0xc6
 	.4byte	.LLST0
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
-	.2byte	0x1cc
+	.2byte	0x1cd
 	.4byte	0xc6
-	.uleb128 0x4c
-	.4byte	.LASF2900
+	.uleb128 0x4d
+	.4byte	.LASF2914
 	.byte	0x1
-	.2byte	0x1cd
+	.2byte	0x1ce
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x61
-	.uleb128 0x59
+	.uleb128 0x5a
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x1ce
+	.2byte	0x1cf
 	.4byte	0xc6
 	.4byte	.LLST1
-	.uleb128 0x59
-	.4byte	.LASF3111
+	.uleb128 0x5a
+	.4byte	.LASF3126
 	.byte	0x1
-	.2byte	0x1cf
+	.2byte	0x1d0
 	.4byte	0x13f
 	.4byte	.LLST2
-	.uleb128 0x59
-	.4byte	.LASF3112
+	.uleb128 0x5a
+	.4byte	.LASF3127
 	.byte	0x1
-	.2byte	0x1cf
+	.2byte	0x1d0
 	.4byte	0x13f
 	.4byte	.LLST3
-	.uleb128 0x4c
-	.4byte	.LASF3113
+	.uleb128 0x4d
+	.4byte	.LASF3128
 	.byte	0x1
-	.2byte	0x1d0
+	.2byte	0x1d1
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
-	.uleb128 0x4c
-	.4byte	.LASF3114
+	.uleb128 0x4d
+	.4byte	.LASF3129
 	.byte	0x1
-	.2byte	0x1d0
+	.2byte	0x1d1
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
-	.uleb128 0x59
-	.4byte	.LASF3115
+	.uleb128 0x5a
+	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x1d1
-	.4byte	0xc0c8
+	.2byte	0x1d2
+	.4byte	0xc138
 	.4byte	.LLST4
-	.uleb128 0x4c
-	.4byte	.LASF2970
+	.uleb128 0x4d
+	.4byte	.LASF2984
 	.byte	0x1
-	.2byte	0x1d2
+	.2byte	0x1d3
 	.4byte	0x110
 	.uleb128 0x1
 	.byte	0x5b
-	.uleb128 0x4c
-	.4byte	.LASF3124
+	.uleb128 0x4d
+	.4byte	.LASF3139
 	.byte	0x1
-	.2byte	0x1d3
-	.4byte	0xc0c8
+	.2byte	0x1d4
+	.4byte	0xc138
 	.uleb128 0x1
 	.byte	0x53
-	.uleb128 0x46
-	.4byte	.LASF3125
-	.byte	0x1
-	.2byte	0x1d4
-	.4byte	0x110
-	.uleb128 0x46
-	.4byte	.LASF2857
+	.uleb128 0x48
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x1d5
-	.4byte	0xc0c8
-	.uleb128 0x46
-	.4byte	.LASF2946
+	.4byte	0x110
+	.uleb128 0x48
+	.4byte	.LASF2871
 	.byte	0x1
 	.2byte	0x1d6
-	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF3126
+	.4byte	0xc138
+	.uleb128 0x48
+	.4byte	.LASF2960
 	.byte	0x1
 	.2byte	0x1d7
-	.4byte	0x110
-	.uleb128 0x46
-	.4byte	.LASF3127
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF3141
 	.byte	0x1
-	.2byte	0x1d7
+	.2byte	0x1d8
 	.4byte	0x110
-	.uleb128 0x59
-	.4byte	.LASF3128
+	.uleb128 0x48
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x1d8
+	.4byte	0x110
+	.uleb128 0x5a
+	.4byte	.LASF3143
+	.byte	0x1
+	.2byte	0x1d9
 	.4byte	0x13f
 	.4byte	.LLST5
 	.byte	0
-	.uleb128 0x66
-	.4byte	.LASF3130
+	.uleb128 0x67
+	.4byte	.LASF3145
 	.byte	0x1
-	.2byte	0x168
+	.2byte	0x169
 	.byte	0x1
-	.4byte	0x12eb4
-	.uleb128 0x65
-	.4byte	.LASF3131
+	.4byte	0x12f24
+	.uleb128 0x66
+	.4byte	.LASF3146
 	.byte	0x1
-	.2byte	0x168
+	.2byte	0x169
 	.4byte	0xac0
-	.uleb128 0x65
-	.4byte	.LASF3132
+	.uleb128 0x66
+	.4byte	.LASF3147
 	.byte	0x1
-	.2byte	0x168
+	.2byte	0x169
 	.4byte	0xac0
-	.uleb128 0x65
-	.4byte	.LASF3133
+	.uleb128 0x66
+	.4byte	.LASF3148
 	.byte	0x1
-	.2byte	0x168
+	.2byte	0x169
 	.4byte	0xac0
-	.uleb128 0x65
-	.4byte	.LASF3122
-	.byte	0x1
-	.2byte	0x168
-	.4byte	0x4684
-	.uleb128 0x65
-	.4byte	.LASF2961
+	.uleb128 0x66
+	.4byte	.LASF3137
 	.byte	0x1
 	.2byte	0x169
-	.4byte	0xe7b3
-	.uleb128 0x65
-	.4byte	.LASF2868
+	.4byte	0x46f4
+	.uleb128 0x66
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x169
-	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF2900
+	.2byte	0x16a
+	.4byte	0xe830
+	.uleb128 0x66
+	.4byte	.LASF2882
 	.byte	0x1
-	.2byte	0x16b
+	.2byte	0x16a
 	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF262
+	.uleb128 0x48
+	.4byte	.LASF2914
 	.byte	0x1
-	.2byte	0x16b
+	.2byte	0x16c
 	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF3134
+	.uleb128 0x48
+	.4byte	.LASF262
 	.byte	0x1
 	.2byte	0x16c
-	.4byte	0x13f
-	.uleb128 0x46
-	.4byte	.LASF3135
+	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF3149
 	.byte	0x1
-	.2byte	0x16c
+	.2byte	0x16d
 	.4byte	0x13f
-	.uleb128 0x46
-	.4byte	.LASF3136
+	.uleb128 0x48
+	.4byte	.LASF3150
 	.byte	0x1
-	.2byte	0x16c
+	.2byte	0x16d
 	.4byte	0x13f
-	.uleb128 0x46
-	.4byte	.LASF3137
+	.uleb128 0x48
+	.4byte	.LASF3151
 	.byte	0x1
 	.2byte	0x16d
-	.4byte	0xac0
-	.uleb128 0x46
-	.4byte	.LASF3138
+	.4byte	0x13f
+	.uleb128 0x48
+	.4byte	.LASF3152
 	.byte	0x1
-	.2byte	0x16d
+	.2byte	0x16e
 	.4byte	0xac0
-	.uleb128 0x46
-	.4byte	.LASF3139
+	.uleb128 0x48
+	.4byte	.LASF3153
 	.byte	0x1
-	.2byte	0x16d
+	.2byte	0x16e
 	.4byte	0xac0
-	.uleb128 0x46
-	.4byte	.LASF3125
+	.uleb128 0x48
+	.4byte	.LASF3154
 	.byte	0x1
 	.2byte	0x16e
-	.4byte	0x15a
-	.uleb128 0x46
-	.4byte	.LASF3124
+	.4byte	0xac0
+	.uleb128 0x48
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x16f
-	.4byte	0x4684
-	.uleb128 0x46
-	.4byte	.LASF3140
+	.4byte	0x15a
+	.uleb128 0x48
+	.4byte	.LASF3139
 	.byte	0x1
 	.2byte	0x170
-	.4byte	0x13f
-	.uleb128 0x52
-	.string	"i"
+	.4byte	0x46f4
+	.uleb128 0x48
+	.4byte	.LASF3155
 	.byte	0x1
 	.2byte	0x171
-	.4byte	0xc6
-	.uleb128 0x52
-	.string	"j"
+	.4byte	0x13f
+	.uleb128 0x53
+	.string	"i"
 	.byte	0x1
 	.2byte	0x172
 	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF2869
+	.uleb128 0x53
+	.string	"j"
 	.byte	0x1
 	.2byte	0x173
 	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF2871
+	.uleb128 0x48
+	.4byte	.LASF2883
 	.byte	0x1
 	.2byte	0x174
 	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF2870
+	.uleb128 0x48
+	.4byte	.LASF2885
 	.byte	0x1
 	.2byte	0x175
 	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF2872
+	.uleb128 0x48
+	.4byte	.LASF2884
 	.byte	0x1
 	.2byte	0x176
 	.4byte	0xc6
+	.uleb128 0x48
+	.4byte	.LASF2886
+	.byte	0x1
+	.2byte	0x177
+	.4byte	0xc6
 	.byte	0
-	.uleb128 0x75
-	.4byte	.LASF3141
+	.uleb128 0x76
+	.4byte	.LASF3156
 	.byte	0x1
-	.2byte	0x151
-	.8byte	.LFB2809
-	.8byte	.LFE2809-.LFB2809
+	.2byte	0x152
+	.8byte	.LFB2810
+	.8byte	.LFE2810-.LFB2810
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12f44
-	.uleb128 0x58
-	.4byte	.LASF2274
+	.4byte	0x12fb4
+	.uleb128 0x59
+	.4byte	.LASF2288
 	.byte	0x1
-	.2byte	0x151
+	.2byte	0x152
 	.4byte	0x3205
 	.4byte	.LLST185
-	.uleb128 0x5a
+	.uleb128 0x5b
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x153
-	.4byte	0xe4c2
+	.2byte	0x154
+	.4byte	0xe53f
 	.4byte	.LLST186
-	.uleb128 0x59
-	.4byte	.LASF2961
+	.uleb128 0x5a
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x154
-	.4byte	0xe7b3
+	.2byte	0x155
+	.4byte	0xe830
 	.4byte	.LLST187
-	.uleb128 0x4e
-	.8byte	.LVL750
-	.4byte	0x146ee
-	.uleb128 0x4e
-	.8byte	.LVL752
-	.4byte	0x1300b
-	.uleb128 0x4e
+	.uleb128 0x4f
+	.8byte	.LVL751
+	.4byte	0x1478b
+	.uleb128 0x4f
 	.8byte	.LVL753
-	.4byte	0x14706
-	.uleb128 0x4e
-	.8byte	.LVL756
-	.4byte	0x12f44
-	.uleb128 0x4e
+	.4byte	0x1307b
+	.uleb128 0x4f
+	.8byte	.LVL754
+	.4byte	0x147a3
+	.uleb128 0x4f
 	.8byte	.LVL757
-	.4byte	0x14706
+	.4byte	0x12fb4
+	.uleb128 0x4f
+	.8byte	.LVL758
+	.4byte	0x147a3
 	.byte	0
-	.uleb128 0x75
-	.4byte	.LASF3142
+	.uleb128 0x76
+	.4byte	.LASF3157
 	.byte	0x1
-	.2byte	0x120
-	.8byte	.LFB2808
-	.8byte	.LFE2808-.LFB2808
+	.2byte	0x121
+	.8byte	.LFB2809
+	.8byte	.LFE2809-.LFB2809
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1300b
-	.uleb128 0x74
-	.4byte	.LASF3131
+	.4byte	0x1307b
+	.uleb128 0x75
+	.4byte	.LASF3146
 	.byte	0x1
-	.2byte	0x120
+	.2byte	0x121
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
-	.uleb128 0x74
-	.4byte	.LASF3132
+	.uleb128 0x75
+	.4byte	.LASF3147
 	.byte	0x1
-	.2byte	0x120
+	.2byte	0x121
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
-	.uleb128 0x74
-	.4byte	.LASF3122
+	.uleb128 0x75
+	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x120
-	.4byte	0x4684
+	.2byte	0x121
+	.4byte	0x46f4
 	.uleb128 0x1
 	.byte	0x52
-	.uleb128 0x58
-	.4byte	.LASF2961
+	.uleb128 0x59
+	.4byte	.LASF2975
 	.byte	0x1
-	.2byte	0x121
-	.4byte	0xe7b3
+	.2byte	0x122
+	.4byte	0xe830
 	.4byte	.LLST181
-	.uleb128 0x4c
-	.4byte	.LASF2900
+	.uleb128 0x4d
+	.4byte	.LASF2914
 	.byte	0x1
-	.2byte	0x123
+	.2byte	0x124
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5d
-	.uleb128 0x4c
+	.uleb128 0x4d
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x123
+	.2byte	0x124
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x59
-	.uleb128 0x46
-	.4byte	.LASF3134
+	.uleb128 0x48
+	.4byte	.LASF3149
 	.byte	0x1
-	.2byte	0x124
+	.2byte	0x125
 	.4byte	0x13f
-	.uleb128 0x59
-	.4byte	.LASF3135
+	.uleb128 0x5a
+	.4byte	.LASF3150
 	.byte	0x1
-	.2byte	0x124
+	.2byte	0x125
 	.4byte	0x13f
 	.4byte	.LLST182
-	.uleb128 0x59
-	.4byte	.LASF3125
+	.uleb128 0x5a
+	.4byte	.LASF3140
 	.byte	0x1
-	.2byte	0x125
+	.2byte	0x126
 	.4byte	0x15a
 	.4byte	.LLST183
-	.uleb128 0x69
+	.uleb128 0x6a
 	.string	"i"
 	.byte	0x1
-	.2byte	0x126
+	.2byte	0x127
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5b
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"j"
 	.byte	0x1
-	.2byte	0x126
+	.2byte	0x127
 	.4byte	0xc6
-	.uleb128 0x59
-	.4byte	.LASF3140
+	.uleb128 0x5a
+	.4byte	.LASF3155
 	.byte	0x1
-	.2byte	0x127
+	.2byte	0x128
 	.4byte	0x13f
 	.4byte	.LLST184
 	.byte	0
-	.uleb128 0x76
-	.4byte	.LASF3143
+	.uleb128 0x77
+	.4byte	.LASF3158
 	.byte	0x1
-	.byte	0xd5
-	.8byte	.LFB2807
-	.8byte	.LFE2807-.LFB2807
+	.byte	0xd6
+	.8byte	.LFB2808
+	.8byte	.LFE2808-.LFB2808
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x130f0
-	.uleb128 0x77
-	.4byte	.LASF3131
+	.4byte	0x13160
+	.uleb128 0x78
+	.4byte	.LASF3146
 	.byte	0x1
-	.byte	0xd5
+	.byte	0xd6
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
-	.uleb128 0x77
-	.4byte	.LASF3132
+	.uleb128 0x78
+	.4byte	.LASF3147
 	.byte	0x1
-	.byte	0xd5
+	.byte	0xd6
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
-	.uleb128 0x77
-	.4byte	.LASF3133
+	.uleb128 0x78
+	.4byte	.LASF3148
 	.byte	0x1
-	.byte	0xd5
+	.byte	0xd6
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
-	.uleb128 0x77
-	.4byte	.LASF3122
+	.uleb128 0x78
+	.4byte	.LASF3137
 	.byte	0x1
-	.byte	0xd5
-	.4byte	0x4684
+	.byte	0xd6
+	.4byte	0x46f4
 	.uleb128 0x1
 	.byte	0x53
-	.uleb128 0x78
-	.4byte	.LASF2961
+	.uleb128 0x79
+	.4byte	.LASF2975
 	.byte	0x1
-	.byte	0xd6
-	.4byte	0xe7b3
+	.byte	0xd7
+	.4byte	0xe830
 	.4byte	.LLST175
-	.uleb128 0x78
-	.4byte	.LASF2868
+	.uleb128 0x79
+	.4byte	.LASF2882
 	.byte	0x1
-	.byte	0xd6
+	.byte	0xd7
 	.4byte	0xc6
 	.4byte	.LLST176
-	.uleb128 0x4b
-	.4byte	.LASF2900
+	.uleb128 0x4c
+	.4byte	.LASF2914
 	.byte	0x1
-	.byte	0xd8
+	.byte	0xd9
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x60
-	.uleb128 0x4b
+	.uleb128 0x4c
 	.4byte	.LASF262
 	.byte	0x1
-	.byte	0xd8
+	.byte	0xd9
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5b
-	.uleb128 0x79
-	.4byte	.LASF3134
+	.uleb128 0x7a
+	.4byte	.LASF3149
 	.byte	0x1
-	.byte	0xd9
+	.byte	0xda
 	.4byte	0x13f
-	.uleb128 0x7a
-	.4byte	.LASF3135
+	.uleb128 0x7b
+	.4byte	.LASF3150
 	.byte	0x1
-	.byte	0xd9
+	.byte	0xda
 	.4byte	0x13f
 	.4byte	.LLST177
-	.uleb128 0x7a
-	.4byte	.LASF3136
+	.uleb128 0x7b
+	.4byte	.LASF3151
 	.byte	0x1
-	.byte	0xd9
+	.byte	0xda
 	.4byte	0x13f
 	.4byte	.LLST178
-	.uleb128 0x7a
-	.4byte	.LASF3125
+	.uleb128 0x7b
+	.4byte	.LASF3140
 	.byte	0x1
-	.byte	0xda
+	.byte	0xdb
 	.4byte	0x15a
 	.4byte	.LLST179
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.string	"i"
 	.byte	0x1
-	.byte	0xdb
+	.byte	0xdc
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5f
-	.uleb128 0x7c
+	.uleb128 0x7d
 	.string	"j"
 	.byte	0x1
-	.byte	0xdb
+	.byte	0xdc
 	.4byte	0xc6
-	.uleb128 0x7a
-	.4byte	.LASF3140
+	.uleb128 0x7b
+	.4byte	.LASF3155
 	.byte	0x1
-	.byte	0xdc
+	.byte	0xdd
 	.4byte	0x13f
 	.4byte	.LLST180
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3144
+	.uleb128 0x7e
+	.4byte	.LASF3159
 	.byte	0x1
-	.byte	0xb6
+	.byte	0xb7
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x13122
-	.uleb128 0x7e
+	.4byte	0x13193
+	.uleb128 0x7f
 	.string	"ebc"
 	.byte	0x1
-	.byte	0xb6
-	.4byte	0xe4c2
-	.uleb128 0x7f
-	.4byte	.LASF3145
+	.byte	0xb7
+	.4byte	0xe53f
+	.uleb128 0x80
+	.4byte	.LASF3160
 	.byte	0x1
-	.byte	0xb6
+	.byte	0xb7
 	.4byte	0xc6
-	.uleb128 0x79
-	.4byte	.LASF2961
+	.uleb128 0x7a
+	.4byte	.LASF2975
 	.byte	0x1
-	.byte	0xb8
-	.4byte	0xe7b3
+	.byte	0xb9
+	.4byte	0xe830
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3146
+	.uleb128 0x7e
+	.4byte	.LASF3161
 	.byte	0x1
-	.byte	0x88
+	.byte	0x89
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x1316a
-	.uleb128 0x7f
-	.4byte	.LASF2857
+	.4byte	0x131de
+	.uleb128 0x80
+	.4byte	.LASF2871
 	.byte	0x1
-	.byte	0x88
-	.4byte	0xc0c8
-	.uleb128 0x7f
-	.4byte	.LASF3111
+	.byte	0x89
+	.4byte	0xc138
+	.uleb128 0x80
+	.4byte	.LASF3126
 	.byte	0x1
-	.byte	0x88
+	.byte	0x89
 	.4byte	0x11f
-	.uleb128 0x7f
-	.4byte	.LASF3112
+	.uleb128 0x80
+	.4byte	.LASF3127
 	.byte	0x1
-	.byte	0x88
+	.byte	0x89
 	.4byte	0x11f
-	.uleb128 0x79
-	.4byte	.LASF3147
+	.uleb128 0x7a
+	.4byte	.LASF3162
 	.byte	0x1
-	.byte	0x8a
+	.byte	0x8b
 	.4byte	0x110
-	.uleb128 0x79
-	.4byte	.LASF3128
+	.uleb128 0x7a
+	.4byte	.LASF3143
 	.byte	0x1
-	.byte	0x8b
+	.byte	0x8c
 	.4byte	0x11f
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3148
+	.uleb128 0x7e
+	.4byte	.LASF3163
 	.byte	0x1
-	.byte	0x82
+	.byte	0x83
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x1319c
-	.uleb128 0x7f
-	.4byte	.LASF2857
+	.4byte	0x13213
+	.uleb128 0x80
+	.4byte	.LASF2871
 	.byte	0x1
-	.byte	0x82
-	.4byte	0xc0c8
-	.uleb128 0x7f
-	.4byte	.LASF3111
+	.byte	0x83
+	.4byte	0xc138
+	.uleb128 0x80
+	.4byte	.LASF3126
 	.byte	0x1
-	.byte	0x82
+	.byte	0x83
 	.4byte	0x11f
-	.uleb128 0x7f
-	.4byte	.LASF3112
+	.uleb128 0x80
+	.4byte	.LASF3127
 	.byte	0x1
-	.byte	0x82
+	.byte	0x83
 	.4byte	0x11f
 	.byte	0
-	.uleb128 0x80
-	.4byte	.LASF3149
+	.uleb128 0x81
+	.4byte	.LASF3164
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x131c0
-	.uleb128 0x7f
-	.4byte	.LASF2936
+	.4byte	0x13239
+	.uleb128 0x80
+	.4byte	.LASF2950
 	.byte	0xb
 	.byte	0x4b
-	.4byte	0xe12c
-	.uleb128 0x7f
-	.4byte	.LASF2970
+	.4byte	0xe19c
+	.uleb128 0x80
+	.4byte	.LASF2984
 	.byte	0xb
 	.byte	0x4b
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x80
-	.4byte	.LASF3150
+	.uleb128 0x81
+	.4byte	.LASF3165
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x131ef
-	.uleb128 0x7f
-	.4byte	.LASF2936
+	.4byte	0x1326b
+	.uleb128 0x80
+	.4byte	.LASF2950
 	.byte	0xb
 	.byte	0x3c
-	.4byte	0xe12c
-	.uleb128 0x7f
-	.4byte	.LASF3151
+	.4byte	0xe19c
+	.uleb128 0x80
+	.4byte	.LASF3166
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13f
-	.uleb128 0x7f
-	.4byte	.LASF3152
+	.uleb128 0x80
+	.4byte	.LASF3167
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13f
 	.byte	0
-	.uleb128 0x80
-	.4byte	.LASF3153
+	.uleb128 0x81
+	.4byte	.LASF3168
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x13234
-	.uleb128 0x7f
-	.4byte	.LASF2936
+	.4byte	0x132b5
+	.uleb128 0x80
+	.4byte	.LASF2950
 	.byte	0xb
 	.byte	0x36
-	.4byte	0xe12c
-	.uleb128 0x7f
-	.4byte	.LASF3154
+	.4byte	0xe19c
+	.uleb128 0x80
+	.4byte	.LASF3169
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xc6
-	.uleb128 0x7f
-	.4byte	.LASF3155
+	.uleb128 0x80
+	.4byte	.LASF3170
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
-	.uleb128 0x7f
-	.4byte	.LASF3156
+	.uleb128 0x80
+	.4byte	.LASF3171
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
-	.uleb128 0x7f
-	.4byte	.LASF3157
+	.uleb128 0x80
+	.4byte	.LASF3172
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x80
-	.4byte	.LASF3158
+	.uleb128 0x81
+	.4byte	.LASF3173
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x1324d
-	.uleb128 0x7f
-	.4byte	.LASF2936
+	.4byte	0x132cf
+	.uleb128 0x80
+	.4byte	.LASF2950
 	.byte	0xb
 	.byte	0x31
-	.4byte	0xe12c
+	.4byte	0xe19c
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3159
+	.uleb128 0x7e
+	.4byte	.LASF3174
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13274
-	.uleb128 0x7f
-	.4byte	.LASF2936
+	.4byte	0x132f8
+	.uleb128 0x80
+	.4byte	.LASF2950
 	.byte	0xb
 	.byte	0x2c
-	.4byte	0xe12c
-	.uleb128 0x7f
-	.4byte	.LASF3004
+	.4byte	0xe19c
+	.uleb128 0x80
+	.4byte	.LASF3019
 	.byte	0xb
 	.byte	0x2c
-	.4byte	0xe16c
+	.4byte	0xe1dc
 	.byte	0
-	.uleb128 0x66
-	.4byte	.LASF3160
+	.uleb128 0x67
+	.4byte	.LASF3175
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x132be
-	.uleb128 0x64
+	.4byte	0x13342
+	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
 	.2byte	0x1ab
-	.4byte	0xa570
-	.uleb128 0x65
-	.4byte	.LASF1150
+	.4byte	0xa5e0
+	.uleb128 0x66
+	.4byte	.LASF1164
 	.byte	0xa
 	.2byte	0x1ac
 	.4byte	0x325
-	.uleb128 0x65
-	.4byte	.LASF987
+	.uleb128 0x66
+	.4byte	.LASF1001
 	.byte	0xa
 	.2byte	0x1ac
 	.4byte	0x2e3
-	.uleb128 0x64
+	.uleb128 0x65
 	.string	"dir"
 	.byte	0xa
 	.2byte	0x1ad
-	.4byte	0xdb92
-	.uleb128 0x52
+	.4byte	0xdc02
+	.uleb128 0x53
 	.string	"ops"
 	.byte	0xa
 	.2byte	0x1af
-	.4byte	0xb7b9
+	.4byte	0xb829
 	.byte	0
-	.uleb128 0x63
-	.4byte	.LASF3161
+	.uleb128 0x64
+	.4byte	.LASF3176
 	.byte	0xa
 	.2byte	0x108
-	.4byte	0xb7b9
+	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x132dc
-	.uleb128 0x64
+	.4byte	0x13360
+	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa
 	.2byte	0x108
-	.4byte	0xa570
+	.4byte	0xa5e0
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3162
+	.uleb128 0x7e
+	.4byte	.LASF3177
 	.byte	0xc8
 	.byte	0x1d
-	.4byte	0xb7b9
+	.4byte	0xb829
 	.byte	0x3
-	.4byte	0x132f8
-	.uleb128 0x7e
+	.4byte	0x1337c
+	.uleb128 0x7f
 	.string	"bus"
 	.byte	0xc8
 	.byte	0x1d
-	.4byte	0xadd7
+	.4byte	0xae47
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3163
+	.uleb128 0x7e
+	.4byte	.LASF3178
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13314
-	.uleb128 0x7f
-	.4byte	.LASF3164
+	.4byte	0x13399
+	.uleb128 0x80
+	.4byte	.LASF3179
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x80
-	.4byte	.LASF3165
+	.uleb128 0x81
+	.4byte	.LASF3180
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x1334e
-	.uleb128 0x7e
+	.4byte	0x133d6
+	.uleb128 0x7f
 	.string	"dev"
 	.byte	0xcb
 	.byte	0xa3
-	.4byte	0xa570
-	.uleb128 0x7f
-	.4byte	.LASF3166
+	.4byte	0xa5e0
+	.uleb128 0x80
+	.4byte	.LASF3181
 	.byte	0xcb
 	.byte	0xa4
 	.4byte	0x325
-	.uleb128 0x7f
-	.4byte	.LASF987
+	.uleb128 0x80
+	.4byte	.LASF1001
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0x2e3
-	.uleb128 0x7f
-	.4byte	.LASF3167
+	.uleb128 0x80
+	.4byte	.LASF3182
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3168
+	.uleb128 0x7e
+	.4byte	.LASF3183
 	.byte	0x3
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1336a
-	.uleb128 0x7f
-	.4byte	.LASF2937
+	.4byte	0x133f3
+	.uleb128 0x80
+	.4byte	.LASF2951
 	.byte	0x3
 	.byte	0x35
-	.4byte	0xdb2c
+	.4byte	0xdb9c
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3169
+	.uleb128 0x7e
+	.4byte	.LASF3184
 	.byte	0x3
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1338f
-	.uleb128 0x7f
-	.4byte	.LASF2937
+	.4byte	0x13419
+	.uleb128 0x80
+	.4byte	.LASF2951
 	.byte	0x3
 	.byte	0x30
-	.4byte	0xdb2c
-	.uleb128 0x7e
+	.4byte	0xdb9c
+	.uleb128 0x7f
 	.string	"t"
 	.byte	0x3
 	.byte	0x30
-	.4byte	0x467e
+	.4byte	0x46ee
 	.byte	0
-	.uleb128 0x80
-	.4byte	.LASF3170
+	.uleb128 0x81
+	.4byte	.LASF3185
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x133a8
-	.uleb128 0x7f
-	.4byte	.LASF2937
+	.4byte	0x13433
+	.uleb128 0x80
+	.4byte	.LASF2951
 	.byte	0x3
 	.byte	0x2b
-	.4byte	0xdb2c
+	.4byte	0xdb9c
 	.byte	0
-	.uleb128 0x80
-	.4byte	.LASF3171
+	.uleb128 0x81
+	.4byte	.LASF3186
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x133c1
-	.uleb128 0x7f
-	.4byte	.LASF2937
+	.4byte	0x1344d
+	.uleb128 0x80
+	.4byte	.LASF2951
 	.byte	0x3
 	.byte	0x26
-	.4byte	0xdb2c
+	.4byte	0xdb9c
 	.byte	0
-	.uleb128 0x80
-	.4byte	.LASF3172
+	.uleb128 0x81
+	.4byte	.LASF3187
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x133da
-	.uleb128 0x7f
-	.4byte	.LASF2937
+	.4byte	0x13467
+	.uleb128 0x80
+	.4byte	.LASF2951
 	.byte	0x3
 	.byte	0x21
-	.4byte	0xdb2c
+	.4byte	0xdb9c
 	.byte	0
-	.uleb128 0x80
-	.4byte	.LASF3173
+	.uleb128 0x81
+	.4byte	.LASF3188
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x133f3
-	.uleb128 0x7f
-	.4byte	.LASF2937
+	.4byte	0x13481
+	.uleb128 0x80
+	.4byte	.LASF2951
 	.byte	0x3
 	.byte	0x1c
-	.4byte	0xdb2c
+	.4byte	0xdb9c
 	.byte	0
-	.uleb128 0x80
-	.4byte	.LASF3174
+	.uleb128 0x81
+	.4byte	.LASF3189
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x1340c
-	.uleb128 0x7f
+	.4byte	0x1349b
+	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x1340c
+	.4byte	0x1349b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd802
-	.uleb128 0x80
-	.4byte	.LASF2839
+	.4byte	0xd872
+	.uleb128 0x81
+	.4byte	.LASF2853
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x1342b
-	.uleb128 0x7f
+	.4byte	0x134bb
+	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x1340c
+	.4byte	0x1349b
 	.byte	0
-	.uleb128 0x80
-	.4byte	.LASF3175
+	.uleb128 0x81
+	.4byte	.LASF3190
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x13464
-	.uleb128 0x7f
+	.4byte	0x134f7
+	.uleb128 0x80
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x1340c
-	.uleb128 0x7f
+	.4byte	0x1349b
+	.uleb128 0x80
 	.4byte	.LASF193
 	.byte	0x4
 	.byte	0x24
 	.4byte	0xc6
-	.uleb128 0x7f
+	.uleb128 0x80
 	.4byte	.LASF265
 	.byte	0x4
 	.byte	0x25
 	.4byte	0x56
-	.uleb128 0x7c
+	.uleb128 0x7d
 	.string	"ws"
 	.byte	0x4
 	.byte	0x27
-	.4byte	0xad0d
+	.4byte	0xad7d
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3176
+	.uleb128 0x7e
+	.4byte	.LASF3191
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13493
-	.uleb128 0x7e
+	.4byte	0x13527
+	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x458
-	.uleb128 0x7f
-	.4byte	.LASF2005
+	.uleb128 0x80
+	.4byte	.LASF2019
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x30bc
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.string	"n"
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3177
+	.uleb128 0x7e
+	.4byte	.LASF3192
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x134c2
-	.uleb128 0x7e
+	.4byte	0x13557
+	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x458
-	.uleb128 0x7f
-	.4byte	.LASF2005
+	.uleb128 0x80
+	.4byte	.LASF2019
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x30bc
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.string	"n"
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3178
+	.uleb128 0x7e
+	.4byte	.LASF3193
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x134f1
-	.uleb128 0x7e
+	.4byte	0x13587
+	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x458
-	.uleb128 0x7f
-	.4byte	.LASF2005
+	.uleb128 0x80
+	.4byte	.LASF2019
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x30bc
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.string	"n"
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3179
+	.uleb128 0x7e
+	.4byte	.LASF3194
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1352b
-	.uleb128 0x7e
+	.4byte	0x135c2
+	.uleb128 0x7f
 	.string	"to"
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x458
-	.uleb128 0x7f
-	.4byte	.LASF2005
+	.uleb128 0x80
+	.4byte	.LASF2019
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x30bc
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.string	"n"
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x29
-	.uleb128 0x7c
+	.uleb128 0x7d
 	.string	"res"
 	.byte	0x9
 	.byte	0x70
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3180
+	.uleb128 0x7e
+	.4byte	.LASF3195
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x1355f
-	.uleb128 0x7e
+	.4byte	0x135f6
+	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x30bc
-	.uleb128 0x79
-	.4byte	.LASF3181
+	.uleb128 0x7a
+	.4byte	.LASF3196
 	.byte	0x6
 	.byte	0xf7
 	.4byte	0x458
-	.uleb128 0x67
-	.uleb128 0x79
-	.4byte	.LASF3182
+	.uleb128 0x68
+	.uleb128 0x7a
+	.4byte	.LASF3197
 	.byte	0x6
 	.byte	0xfe
 	.4byte	0x15a
 	.byte	0
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3183
+	.uleb128 0x7e
+	.4byte	.LASF3198
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x135a9
-	.uleb128 0x7f
-	.4byte	.LASF1150
+	.4byte	0x13642
+	.uleb128 0x80
+	.4byte	.LASF1164
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x30bc
-	.uleb128 0x7f
-	.4byte	.LASF987
+	.uleb128 0x80
+	.4byte	.LASF1001
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
-	.uleb128 0x7c
+	.uleb128 0x7d
 	.string	"ret"
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
-	.uleb128 0x79
-	.4byte	.LASF3184
+	.uleb128 0x7a
+	.4byte	.LASF3199
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
-	.uleb128 0x67
-	.uleb128 0x79
-	.4byte	.LASF3182
+	.uleb128 0x68
+	.uleb128 0x7a
+	.4byte	.LASF3197
 	.byte	0x6
 	.byte	0x56
 	.4byte	0x15a
 	.byte	0
 	.byte	0
-	.uleb128 0x63
-	.4byte	.LASF3185
+	.uleb128 0x64
+	.4byte	.LASF3200
 	.byte	0x12
 	.2byte	0x2e5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x135d3
-	.uleb128 0x65
-	.4byte	.LASF987
+	.4byte	0x1366c
+	.uleb128 0x66
+	.4byte	.LASF1001
 	.byte	0x12
 	.2byte	0x2e5
 	.4byte	0x2e3
-	.uleb128 0x65
+	.uleb128 0x66
 	.4byte	.LASF171
 	.byte	0x12
 	.2byte	0x2e5
 	.4byte	0x330
 	.byte	0
-	.uleb128 0x63
-	.4byte	.LASF3186
+	.uleb128 0x64
+	.4byte	.LASF3201
 	.byte	0x12
 	.2byte	0x216
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x1360b
-	.uleb128 0x65
-	.4byte	.LASF987
+	.4byte	0x136a4
+	.uleb128 0x66
+	.4byte	.LASF1001
 	.byte	0x12
 	.2byte	0x216
 	.4byte	0x2e3
-	.uleb128 0x65
+	.uleb128 0x66
 	.4byte	.LASF171
 	.byte	0x12
 	.2byte	0x216
 	.4byte	0x330
-	.uleb128 0x67
-	.uleb128 0x46
-	.4byte	.LASF880
+	.uleb128 0x68
+	.uleb128 0x48
+	.4byte	.LASF894
 	.byte	0x12
 	.2byte	0x21a
 	.4byte	0x6d
 	.byte	0
 	.byte	0
-	.uleb128 0x63
-	.4byte	.LASF3187
+	.uleb128 0x64
+	.4byte	.LASF3202
 	.byte	0x12
 	.2byte	0x1dd
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x13641
-	.uleb128 0x65
-	.4byte	.LASF987
+	.4byte	0x136da
+	.uleb128 0x66
+	.4byte	.LASF1001
 	.byte	0x12
 	.2byte	0x1dd
 	.4byte	0x2e3
-	.uleb128 0x65
+	.uleb128 0x66
 	.4byte	.LASF171
 	.byte	0x12
 	.2byte	0x1dd
 	.4byte	0x330
-	.uleb128 0x46
-	.4byte	.LASF3188
+	.uleb128 0x48
+	.4byte	.LASF3203
 	.byte	0x12
 	.2byte	0x1df
 	.4byte	0x6d
 	.byte	0
-	.uleb128 0x63
-	.4byte	.LASF3189
+	.uleb128 0x64
+	.4byte	.LASF3204
 	.byte	0x12
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x1365f
-	.uleb128 0x65
-	.4byte	.LASF987
+	.4byte	0x136f8
+	.uleb128 0x66
+	.4byte	.LASF1001
 	.byte	0x12
 	.2byte	0x159
 	.4byte	0x2e3
 	.byte	0
-	.uleb128 0x63
-	.4byte	.LASF3190
+	.uleb128 0x64
+	.4byte	.LASF3205
 	.byte	0x12
 	.2byte	0x13d
-	.4byte	0xd7a3
+	.4byte	0xd813
 	.byte	0x3
-	.4byte	0x1367d
-	.uleb128 0x65
+	.4byte	0x13716
+	.uleb128 0x66
 	.4byte	.LASF171
 	.byte	0x12
 	.2byte	0x13d
 	.4byte	0x330
 	.byte	0
-	.uleb128 0x80
-	.4byte	.LASF3191
+	.uleb128 0x81
+	.4byte	.LASF3206
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x136a1
-	.uleb128 0x7f
-	.4byte	.LASF3034
+	.4byte	0x1373c
+	.uleb128 0x80
+	.4byte	.LASF3049
 	.byte	0xbe
 	.byte	0xdb
-	.4byte	0xd71a
-	.uleb128 0x7f
+	.4byte	0xd78a
+	.uleb128 0x80
 	.4byte	.LASF794
 	.byte	0xbe
 	.byte	0xdc
 	.4byte	0x458
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3192
+	.uleb128 0x7e
+	.4byte	.LASF3207
 	.byte	0xbe
 	.byte	0xd6
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x136bd
-	.uleb128 0x7f
-	.4byte	.LASF3034
+	.4byte	0x13759
+	.uleb128 0x80
+	.4byte	.LASF3049
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x136bd
+	.4byte	0x13759
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd672
-	.uleb128 0x63
-	.4byte	.LASF3193
+	.4byte	0xd6e2
+	.uleb128 0x64
+	.4byte	.LASF3208
 	.byte	0xa3
 	.2byte	0x164
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x136e1
-	.uleb128 0x64
+	.4byte	0x1377d
+	.uleb128 0x65
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x136e1
+	.4byte	0x1377d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc0c3
-	.uleb128 0x63
-	.4byte	.LASF3194
+	.4byte	0xc133
+	.uleb128 0x64
+	.4byte	.LASF3209
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1371c
-	.uleb128 0x64
+	.4byte	0x137b8
+	.uleb128 0x65
 	.string	"np"
 	.byte	0xe
 	.2byte	0x498
-	.4byte	0xbcba
-	.uleb128 0x65
-	.4byte	.LASF3195
+	.4byte	0xbd2a
+	.uleb128 0x66
+	.4byte	.LASF3210
 	.byte	0xe
 	.2byte	0x499
 	.4byte	0x56
-	.uleb128 0x65
-	.4byte	.LASF3196
+	.uleb128 0x66
+	.4byte	.LASF3211
 	.byte	0xe
 	.2byte	0x49a
 	.4byte	0xac0
 	.byte	0
-	.uleb128 0x63
-	.4byte	.LASF3197
+	.uleb128 0x64
+	.4byte	.LASF3212
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13768
-	.uleb128 0x64
+	.4byte	0x13804
+	.uleb128 0x65
 	.string	"np"
 	.byte	0xe
 	.2byte	0x1ef
-	.4byte	0xbcba
-	.uleb128 0x65
-	.4byte	.LASF3195
+	.4byte	0xbd2a
+	.uleb128 0x66
+	.4byte	.LASF3210
 	.byte	0xe
 	.2byte	0x1f0
 	.4byte	0x56
-	.uleb128 0x65
-	.4byte	.LASF3198
+	.uleb128 0x66
+	.4byte	.LASF3213
 	.byte	0xe
 	.2byte	0x1f1
 	.4byte	0xac0
-	.uleb128 0x64
+	.uleb128 0x65
 	.string	"sz"
 	.byte	0xe
 	.2byte	0x1f1
 	.4byte	0x2e3
-	.uleb128 0x52
+	.uleb128 0x53
 	.string	"ret"
 	.byte	0xe
 	.2byte	0x1f3
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x80
-	.4byte	.LASF3199
+	.uleb128 0x81
+	.4byte	.LASF3214
 	.byte	0xe
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x13781
-	.uleb128 0x7f
-	.4byte	.LASF868
+	.4byte	0x1381e
+	.uleb128 0x80
+	.4byte	.LASF882
 	.byte	0xe
 	.byte	0x83
-	.4byte	0xb894
+	.4byte	0xb904
 	.byte	0
-	.uleb128 0x66
-	.4byte	.LASF3200
+	.uleb128 0x67
+	.4byte	.LASF3215
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x137a7
-	.uleb128 0x64
+	.4byte	0x13844
+	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
 	.2byte	0x4a0
-	.4byte	0xa570
-	.uleb128 0x65
+	.4byte	0xa5e0
+	.uleb128 0x66
 	.4byte	.LASF794
 	.byte	0x2
 	.2byte	0x4a0
 	.4byte	0x458
 	.byte	0
-	.uleb128 0x63
-	.4byte	.LASF3201
+	.uleb128 0x64
+	.4byte	.LASF3216
 	.byte	0x2
 	.2byte	0x49b
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x137c5
-	.uleb128 0x64
+	.4byte	0x13862
+	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
 	.2byte	0x49b
-	.4byte	0xbb2a
+	.4byte	0xbb9a
 	.byte	0
-	.uleb128 0x63
-	.4byte	.LASF3202
+	.uleb128 0x64
+	.4byte	.LASF3217
 	.byte	0x2
 	.2byte	0x2c5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x137fb
-	.uleb128 0x64
+	.4byte	0x13898
+	.uleb128 0x65
 	.string	"dev"
 	.byte	0x2
 	.2byte	0x2c5
-	.4byte	0xa570
-	.uleb128 0x65
-	.4byte	.LASF987
+	.4byte	0xa5e0
+	.uleb128 0x66
+	.4byte	.LASF1001
 	.byte	0x2
 	.2byte	0x2c5
 	.4byte	0x2e3
-	.uleb128 0x64
+	.uleb128 0x65
 	.string	"gfp"
 	.byte	0x2
 	.2byte	0x2c5
 	.4byte	0x330
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3203
+	.uleb128 0x7e
+	.4byte	.LASF3218
 	.byte	0xf
 	.byte	0xca
 	.4byte	0x351
 	.byte	0x3
-	.4byte	0x13817
-	.uleb128 0x7e
+	.4byte	0x138b4
+	.uleb128 0x7f
 	.string	"res"
 	.byte	0xf
 	.byte	0xca
-	.4byte	0xc1d4
+	.4byte	0xc244
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3204
+	.uleb128 0x7e
+	.4byte	.LASF3219
 	.byte	0xcc
 	.byte	0x22
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x13833
-	.uleb128 0x7e
+	.4byte	0x138d0
+	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0xcc
 	.byte	0x22
 	.4byte	0x30bc
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3205
+	.uleb128 0x7e
+	.4byte	.LASF3220
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1384f
-	.uleb128 0x7f
-	.4byte	.LASF987
+	.4byte	0x138ed
+	.uleb128 0x80
+	.4byte	.LASF1001
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x63
-	.4byte	.LASF3206
-	.byte	0xd
-	.2byte	0x23e
-	.4byte	0x2b0
-	.byte	0x3
-	.4byte	0x1386d
-	.uleb128 0x65
-	.4byte	.LASF2274
-	.byte	0xd
-	.2byte	0x23e
-	.4byte	0x3205
-	.byte	0
-	.uleb128 0x63
-	.4byte	.LASF3207
+	.uleb128 0x64
+	.4byte	.LASF3221
 	.byte	0xd
 	.2byte	0x203
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x13896
-	.uleb128 0x64
+	.4byte	0x13916
+	.uleb128 0x65
 	.string	"wq"
 	.byte	0xd
 	.2byte	0x203
 	.4byte	0x331f
-	.uleb128 0x65
-	.4byte	.LASF2274
+	.uleb128 0x66
+	.4byte	.LASF2288
 	.byte	0xd
 	.2byte	0x204
 	.4byte	0x3205
 	.byte	0
-	.uleb128 0x80
-	.4byte	.LASF3208
+	.uleb128 0x81
+	.4byte	.LASF3222
 	.byte	0xd
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x138ba
-	.uleb128 0x7f
-	.4byte	.LASF2274
+	.4byte	0x1393c
+	.uleb128 0x80
+	.4byte	.LASF2288
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0x3205
-	.uleb128 0x7f
-	.4byte	.LASF3209
+	.uleb128 0x80
+	.4byte	.LASF3223
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x63
-	.4byte	.LASF3210
+	.uleb128 0x64
+	.4byte	.LASF3224
 	.byte	0x51
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x138d6
-	.uleb128 0x64
+	.4byte	0x13958
+	.uleb128 0x65
 	.string	"m"
 	.byte	0x51
 	.2byte	0x169
 	.4byte	0x74
 	.byte	0
-	.uleb128 0x63
-	.4byte	.LASF3211
+	.uleb128 0x64
+	.4byte	.LASF3225
 	.byte	0x51
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x138f2
-	.uleb128 0x64
+	.4byte	0x13974
+	.uleb128 0x65
 	.string	"m"
 	.byte	0x51
 	.2byte	0x148
 	.4byte	0x74
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3212
+	.uleb128 0x7e
+	.4byte	.LASF3226
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x1392e
-	.uleb128 0x7f
-	.4byte	.LASF1150
+	.4byte	0x139b3
+	.uleb128 0x80
+	.4byte	.LASF1164
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x30bc
-	.uleb128 0x7f
-	.4byte	.LASF3213
+	.uleb128 0x80
+	.4byte	.LASF3227
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2e3
-	.uleb128 0x7f
-	.4byte	.LASF3214
+	.uleb128 0x80
+	.4byte	.LASF3228
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2b0
-	.uleb128 0x7c
+	.uleb128 0x7d
 	.string	"sz"
 	.byte	0xca
 	.byte	0x99
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x80
-	.4byte	.LASF3215
+	.uleb128 0x81
+	.4byte	.LASF3229
 	.byte	0xca
 	.byte	0x91
 	.byte	0x3
-	.4byte	0x1395f
-	.uleb128 0x7f
-	.4byte	.LASF987
+	.4byte	0x139e6
+	.uleb128 0x80
+	.4byte	.LASF1001
 	.byte	0xca
 	.byte	0x91
 	.4byte	0xc6
-	.uleb128 0x7f
+	.uleb128 0x80
 	.4byte	.LASF383
 	.byte	0xca
 	.byte	0x91
 	.4byte	0x29
-	.uleb128 0x67
-	.uleb128 0x79
-	.4byte	.LASF3216
+	.uleb128 0x68
+	.uleb128 0x7a
+	.4byte	.LASF3230
 	.byte	0xca
 	.byte	0x93
 	.4byte	0xc6
 	.byte	0
 	.byte	0
-	.uleb128 0x80
-	.4byte	.LASF3217
+	.uleb128 0x81
+	.4byte	.LASF3231
 	.byte	0xca
 	.byte	0x80
 	.byte	0x3
-	.4byte	0x1398c
-	.uleb128 0x7e
+	.4byte	0x13a14
+	.uleb128 0x7f
 	.string	"ptr"
 	.byte	0xca
 	.byte	0x80
 	.4byte	0x30bc
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.string	"n"
 	.byte	0xca
 	.byte	0x80
 	.4byte	0x29
-	.uleb128 0x7f
-	.4byte	.LASF3218
+	.uleb128 0x80
+	.4byte	.LASF3232
 	.byte	0xca
 	.byte	0x81
 	.4byte	0x2b0
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3219
+	.uleb128 0x7e
+	.4byte	.LASF3233
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x139b2
-	.uleb128 0x7e
+	.4byte	0x13a3b
+	.uleb128 0x7f
 	.string	"ti"
 	.byte	0xca
 	.byte	0x5f
-	.4byte	0x139b2
-	.uleb128 0x7f
-	.4byte	.LASF3220
+	.4byte	0x13a3b
+	.uleb128 0x80
+	.4byte	.LASF3234
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
@@ -45742,38 +45788,38 @@ __exitcall_ebc_exit:
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc33
-	.uleb128 0x7d
-	.4byte	.LASF3221
+	.uleb128 0x7e
+	.4byte	.LASF3235
 	.byte	0x5
 	.byte	0xf
 	.4byte	0x2f05
 	.byte	0x3
-	.4byte	0x139d4
-	.uleb128 0x79
-	.4byte	.LASF3222
+	.4byte	0x13a5d
+	.uleb128 0x7a
+	.4byte	.LASF3236
 	.byte	0x5
 	.byte	0x11
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x80
-	.4byte	.LASF3223
+	.uleb128 0x81
+	.4byte	.LASF3237
 	.byte	0x10
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x13a19
-	.uleb128 0x7f
-	.4byte	.LASF962
+	.4byte	0x13aa3
+	.uleb128 0x80
+	.4byte	.LASF976
 	.byte	0x10
 	.byte	0x1a
 	.4byte	0x3cc
-	.uleb128 0x67
+	.uleb128 0x68
 	.uleb128 0x21
 	.byte	0x8
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x13a0c
+	.4byte	0x13a96
 	.uleb128 0x22
-	.4byte	.LASF3102
+	.4byte	.LASF3117
 	.byte	0x10
 	.byte	0x1c
 	.4byte	0x3cc
@@ -45781,1288 +45827,1293 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x124ec
+	.4byte	0x1255c
 	.byte	0
-	.uleb128 0x7c
+	.uleb128 0x7d
 	.string	"__u"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x139ed
+	.4byte	0x13a77
 	.byte	0
 	.byte	0
-	.uleb128 0x81
-	.4byte	.LASF3302
+	.uleb128 0x82
+	.4byte	.LASF3317
 	.byte	0x20
 	.2byte	0x126
 	.byte	0x3
-	.uleb128 0x7d
-	.4byte	.LASF3224
+	.uleb128 0x7e
+	.4byte	.LASF3238
 	.byte	0xce
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13a3d
-	.uleb128 0x7e
+	.4byte	0x13ac7
+	.uleb128 0x7f
 	.string	"n"
 	.byte	0xce
 	.byte	0x22
 	.4byte	0x15a
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3225
+	.uleb128 0x7e
+	.4byte	.LASF3239
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xe2
 	.byte	0x3
-	.4byte	0x13a6f
-	.uleb128 0x7f
-	.4byte	.LASF2456
+	.4byte	0x13afb
+	.uleb128 0x80
+	.4byte	.LASF2470
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xf4
-	.uleb128 0x7f
-	.4byte	.LASF880
+	.uleb128 0x80
+	.4byte	.LASF894
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xc6
-	.uleb128 0x79
+	.uleb128 0x7a
 	.4byte	.LASF261
 	.byte	0x8
 	.byte	0x9c
 	.4byte	0x8b
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3226
+	.uleb128 0x7e
+	.4byte	.LASF3240
 	.byte	0xcf
 	.byte	0x50
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x13a89
-	.uleb128 0x7e
+	.4byte	0x13b15
+	.uleb128 0x7f
 	.string	"p"
 	.byte	0xcf
 	.byte	0x50
-	.4byte	0xbcc0
+	.4byte	0xbd30
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3227
+	.uleb128 0x7e
+	.4byte	.LASF3241
 	.byte	0xd0
 	.byte	0xb8
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x13aa3
-	.uleb128 0x7e
+	.4byte	0x13b2f
+	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd0
 	.byte	0xb8
-	.4byte	0x13aa3
+	.4byte	0x13b2f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xdd
-	.uleb128 0x7d
-	.4byte	.LASF3228
+	.uleb128 0x7e
+	.4byte	.LASF3242
 	.byte	0xd0
 	.byte	0x39
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x13ac5
-	.uleb128 0x7e
+	.4byte	0x13b51
+	.uleb128 0x7f
 	.string	"val"
 	.byte	0xd0
 	.byte	0x39
 	.4byte	0xd2
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3229
+	.uleb128 0x7e
+	.4byte	.LASF3243
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13aeb
-	.uleb128 0x7e
+	.4byte	0x13b78
+	.uleb128 0x7f
 	.string	"nr"
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
-	.uleb128 0x7f
-	.4byte	.LASF1150
+	.uleb128 0x80
+	.4byte	.LASF1164
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x13aeb
+	.4byte	0x13b78
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x3a
-	.uleb128 0x80
-	.4byte	.LASF3230
+	.uleb128 0x81
+	.4byte	.LASF3244
 	.byte	0x11
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x13b25
-	.uleb128 0x7e
+	.4byte	0x13bb2
+	.uleb128 0x7f
 	.string	"i"
 	.byte	0x11
 	.byte	0x2f
 	.4byte	0xc6
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.string	"v"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13b25
-	.uleb128 0x7c
+	.4byte	0x13bb2
+	.uleb128 0x7d
 	.string	"w0"
 	.byte	0x11
 	.byte	0x2f
 	.4byte	0xc6
-	.uleb128 0x7c
+	.uleb128 0x7d
 	.string	"x1"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13b25
+	.4byte	0x13bb2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x37c
-	.uleb128 0x7d
-	.4byte	.LASF3231
+	.uleb128 0x7e
+	.4byte	.LASF3245
 	.byte	0xd1
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13b45
-	.uleb128 0x7e
+	.4byte	0x13bd2
+	.uleb128 0x7f
 	.string	"x"
 	.byte	0xd1
 	.byte	0x1b
 	.4byte	0xf4
 	.byte	0
-	.uleb128 0x7d
-	.4byte	.LASF3232
+	.uleb128 0x7e
+	.4byte	.LASF3246
 	.byte	0xd2
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13b61
-	.uleb128 0x7f
-	.4byte	.LASF2489
+	.4byte	0x13bef
+	.uleb128 0x80
+	.4byte	.LASF2503
 	.byte	0xd2
 	.byte	0xb
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x80
-	.4byte	.LASF3233
+	.uleb128 0x81
+	.4byte	.LASF3247
 	.byte	0xd3
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x13b83
-	.uleb128 0x7e
+	.4byte	0x13c12
+	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd3
 	.byte	0xb
-	.4byte	0x13b83
-	.uleb128 0x7f
-	.4byte	.LASF987
+	.4byte	0x13c12
+	.uleb128 0x80
+	.4byte	.LASF1001
 	.byte	0xd3
 	.byte	0xb
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x13b8b
-	.uleb128 0x82
+	.4byte	0x13c1a
+	.uleb128 0x83
 	.uleb128 0x3
-	.4byte	0x13b89
-	.uleb128 0x80
-	.4byte	.LASF3234
+	.4byte	0x13c18
+	.uleb128 0x81
+	.4byte	.LASF3248
 	.byte	0xd3
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x13bb2
-	.uleb128 0x7e
+	.4byte	0x13c42
+	.uleb128 0x7f
 	.string	"p"
 	.byte	0xd3
 	.byte	0x9
-	.4byte	0x13b83
-	.uleb128 0x7f
-	.4byte	.LASF987
+	.4byte	0x13c12
+	.uleb128 0x80
+	.4byte	.LASF1001
 	.byte	0xd3
 	.byte	0x9
 	.4byte	0x6d
 	.byte	0
-	.uleb128 0x66
-	.4byte	.LASF3235
+	.uleb128 0x67
+	.4byte	.LASF3249
 	.byte	0xc
 	.2byte	0x11a
 	.byte	0x3
-	.4byte	0x13be2
-	.uleb128 0x64
+	.4byte	0x13c72
+	.uleb128 0x65
 	.string	"p"
 	.byte	0xc
 	.2byte	0x11a
-	.4byte	0x13be2
-	.uleb128 0x64
+	.4byte	0x13c72
+	.uleb128 0x65
 	.string	"res"
 	.byte	0xc
 	.2byte	0x11a
 	.4byte	0x458
-	.uleb128 0x65
-	.4byte	.LASF987
+	.uleb128 0x66
+	.4byte	.LASF1001
 	.byte	0xc
 	.2byte	0x11a
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x13b89
-	.uleb128 0x83
-	.4byte	0x103ba
-	.8byte	.LFB2835
-	.8byte	.LFE2835-.LFB2835
+	.4byte	0x13c18
+	.uleb128 0x84
+	.4byte	0x10444
+	.8byte	.LFB2836
+	.8byte	.LFE2836-.LFB2836
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13c15
-	.uleb128 0x6f
-	.4byte	0x103cb
+	.4byte	0x13ca5
+	.uleb128 0x70
+	.4byte	0x10455
 	.4byte	.LLST10
-	.uleb128 0x71
-	.4byte	0x103d7
+	.uleb128 0x72
+	.4byte	0x10461
 	.uleb128 0x1
 	.byte	0x51
 	.byte	0
-	.uleb128 0x83
-	.4byte	0x128f0
-	.8byte	.LFB2815
-	.8byte	.LFE2815-.LFB2815
+	.uleb128 0x84
+	.4byte	0x12960
+	.8byte	.LFB2816
+	.8byte	.LFE2816-.LFB2816
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13e98
-	.uleb128 0x71
-	.4byte	0x128fd
+	.4byte	0x13f28
+	.uleb128 0x72
+	.4byte	0x1296d
 	.uleb128 0x1
 	.byte	0x50
-	.uleb128 0x6f
-	.4byte	0x12909
+	.uleb128 0x70
+	.4byte	0x12979
 	.4byte	.LLST104
-	.uleb128 0x6f
-	.4byte	0x12915
+	.uleb128 0x70
+	.4byte	0x12985
 	.4byte	.LLST105
-	.uleb128 0x6f
-	.4byte	0x12921
+	.uleb128 0x70
+	.4byte	0x12991
 	.4byte	.LLST106
-	.uleb128 0x53
-	.4byte	0x1292e
-	.8byte	.LBB1242
-	.8byte	.LBE1242-.LBB1242
-	.byte	0x1
-	.2byte	0x38c
-	.4byte	0x13d4d
-	.uleb128 0x54
-	.4byte	0x1295f
-	.uleb128 0x54
-	.4byte	0x1295f
-	.uleb128 0x54
-	.4byte	0x1295f
-	.uleb128 0x54
-	.4byte	0x12953
-	.uleb128 0x54
-	.4byte	0x12947
 	.uleb128 0x54
-	.4byte	0x1293b
-	.uleb128 0x56
-	.8byte	.LBB1243
-	.8byte	.LBE1243-.LBB1243
+	.4byte	0x1299e
+	.8byte	.LBB1238
+	.8byte	.LBE1238-.LBB1238
+	.byte	0x1
+	.2byte	0x38d
+	.4byte	0x13ddd
+	.uleb128 0x55
+	.4byte	0x129cf
+	.uleb128 0x55
+	.4byte	0x129cf
+	.uleb128 0x55
+	.4byte	0x129cf
+	.uleb128 0x55
+	.4byte	0x129c3
+	.uleb128 0x55
+	.4byte	0x129b7
+	.uleb128 0x55
+	.4byte	0x129ab
 	.uleb128 0x57
-	.4byte	0x1296b
-	.uleb128 0x60
-	.4byte	0x12977
+	.8byte	.LBB1239
+	.8byte	.LBE1239-.LBB1239
+	.uleb128 0x58
+	.4byte	0x129db
+	.uleb128 0x61
+	.4byte	0x129e7
 	.4byte	.LLST107
-	.uleb128 0x57
-	.4byte	0x12981
-	.uleb128 0x60
-	.4byte	0x1298b
+	.uleb128 0x58
+	.4byte	0x129f1
+	.uleb128 0x61
+	.4byte	0x129fb
 	.4byte	.LLST108
-	.uleb128 0x60
-	.4byte	0x12997
+	.uleb128 0x61
+	.4byte	0x12a07
 	.4byte	.LLST109
-	.uleb128 0x60
-	.4byte	0x129a3
-	.4byte	.LLST110
-	.uleb128 0x57
-	.4byte	0x129af
 	.uleb128 0x61
-	.4byte	0x129bb
+	.4byte	0x12a13
+	.4byte	.LLST110
+	.uleb128 0x58
+	.4byte	0x12a1f
+	.uleb128 0x62
+	.4byte	0x12a2b
 	.uleb128 0x1
 	.byte	0x51
-	.uleb128 0x61
-	.4byte	0x129c7
+	.uleb128 0x62
+	.4byte	0x12a37
 	.uleb128 0x1
 	.byte	0x52
-	.uleb128 0x60
-	.4byte	0x129d3
+	.uleb128 0x61
+	.4byte	0x12a43
 	.4byte	.LLST111
-	.uleb128 0x60
-	.4byte	0x129df
+	.uleb128 0x61
+	.4byte	0x12a4f
 	.4byte	.LLST112
-	.uleb128 0x60
-	.4byte	0x129eb
+	.uleb128 0x61
+	.4byte	0x12a5b
 	.4byte	.LLST113
-	.uleb128 0x57
-	.4byte	0x129f7
-	.uleb128 0x5b
-	.4byte	0x1316a
-	.8byte	.LBB1244
+	.uleb128 0x58
+	.4byte	0x12a67
+	.uleb128 0x5c
+	.4byte	0x131de
+	.8byte	.LBB1240
 	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
-	.2byte	0x37f
-	.4byte	0x13d27
-	.uleb128 0x54
-	.4byte	0x13190
-	.uleb128 0x54
-	.4byte	0x13185
-	.uleb128 0x54
-	.4byte	0x1317a
+	.2byte	0x380
+	.4byte	0x13db7
+	.uleb128 0x55
+	.4byte	0x13206
+	.uleb128 0x55
+	.4byte	0x131fa
+	.uleb128 0x55
+	.4byte	0x131ee
 	.byte	0
-	.uleb128 0x5f
-	.4byte	0x1316a
-	.8byte	.LBB1251
+	.uleb128 0x60
+	.4byte	0x131de
+	.8byte	.LBB1247
 	.4byte	.Ldebug_ranges0+0x730
 	.byte	0x1
-	.2byte	0x380
-	.uleb128 0x54
-	.4byte	0x13190
-	.uleb128 0x54
-	.4byte	0x13185
-	.uleb128 0x54
-	.4byte	0x1317a
+	.2byte	0x381
+	.uleb128 0x55
+	.4byte	0x13206
+	.uleb128 0x55
+	.4byte	0x131fa
+	.uleb128 0x55
+	.4byte	0x131ee
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5e
-	.4byte	.Ldebug_ranges0+0x780
-	.uleb128 0x54
-	.4byte	0x12921
-	.uleb128 0x54
-	.4byte	0x12915
-	.uleb128 0x54
-	.4byte	0x12909
-	.uleb128 0x54
-	.4byte	0x128fd
 	.uleb128 0x5f
-	.4byte	0x12a04
-	.8byte	.LBB1263
+	.4byte	.Ldebug_ranges0+0x780
+	.uleb128 0x55
+	.4byte	0x12991
+	.uleb128 0x55
+	.4byte	0x12985
+	.uleb128 0x55
+	.4byte	0x12979
+	.uleb128 0x55
+	.4byte	0x1296d
+	.uleb128 0x60
+	.4byte	0x12a74
+	.8byte	.LBB1259
 	.4byte	.Ldebug_ranges0+0x780
 	.byte	0x1
-	.2byte	0x38a
-	.uleb128 0x54
-	.4byte	0x12a35
-	.uleb128 0x54
-	.4byte	0x12a35
-	.uleb128 0x54
-	.4byte	0x12a35
-	.uleb128 0x54
-	.4byte	0x12a29
-	.uleb128 0x54
-	.4byte	0x12a1d
-	.uleb128 0x54
-	.4byte	0x12a11
-	.uleb128 0x5e
+	.2byte	0x38b
+	.uleb128 0x55
+	.4byte	0x12aa5
+	.uleb128 0x55
+	.4byte	0x12aa5
+	.uleb128 0x55
+	.4byte	0x12aa5
+	.uleb128 0x55
+	.4byte	0x12a99
+	.uleb128 0x55
+	.4byte	0x12a8d
+	.uleb128 0x55
+	.4byte	0x12a81
+	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x780
-	.uleb128 0x57
-	.4byte	0x12a41
-	.uleb128 0x61
-	.4byte	0x12a4d
+	.uleb128 0x58
+	.4byte	0x12ab1
+	.uleb128 0x62
+	.4byte	0x12abd
 	.uleb128 0x1
 	.byte	0x5c
-	.uleb128 0x57
-	.4byte	0x12a57
-	.uleb128 0x61
-	.4byte	0x12a61
+	.uleb128 0x58
+	.4byte	0x12ac7
+	.uleb128 0x62
+	.4byte	0x12ad1
 	.uleb128 0x1
 	.byte	0x5f
-	.uleb128 0x57
-	.4byte	0x12a6d
-	.uleb128 0x60
-	.4byte	0x12a79
+	.uleb128 0x58
+	.4byte	0x12add
+	.uleb128 0x61
+	.4byte	0x12ae9
 	.4byte	.LLST114
-	.uleb128 0x60
-	.4byte	0x12a85
-	.4byte	.LLST115
 	.uleb128 0x61
-	.4byte	0x12a91
+	.4byte	0x12af5
+	.4byte	.LLST115
+	.uleb128 0x62
+	.4byte	0x12b01
 	.uleb128 0x1
 	.byte	0x59
-	.uleb128 0x61
-	.4byte	0x12a9d
+	.uleb128 0x62
+	.4byte	0x12b0d
 	.uleb128 0x1
 	.byte	0x5a
-	.uleb128 0x60
-	.4byte	0x12aa9
+	.uleb128 0x61
+	.4byte	0x12b19
 	.4byte	.LLST116
-	.uleb128 0x60
-	.4byte	0x12ab5
-	.4byte	.LLST117
 	.uleb128 0x61
-	.4byte	0x12ac1
+	.4byte	0x12b25
+	.4byte	.LLST117
+	.uleb128 0x62
+	.4byte	0x12b31
 	.uleb128 0x1
 	.byte	0x53
-	.uleb128 0x57
-	.4byte	0x12acd
-	.uleb128 0x5b
-	.4byte	0x1316a
-	.8byte	.LBB1265
+	.uleb128 0x58
+	.4byte	0x12b3d
+	.uleb128 0x5c
+	.4byte	0x131de
+	.8byte	.LBB1261
 	.4byte	.Ldebug_ranges0+0x7c0
 	.byte	0x1
-	.2byte	0x358
-	.4byte	0x13e20
-	.uleb128 0x54
-	.4byte	0x13190
-	.uleb128 0x54
-	.4byte	0x13185
-	.uleb128 0x54
-	.4byte	0x1317a
+	.2byte	0x359
+	.4byte	0x13eb0
+	.uleb128 0x55
+	.4byte	0x13206
+	.uleb128 0x55
+	.4byte	0x131fa
+	.uleb128 0x55
+	.4byte	0x131ee
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x1316a
-	.8byte	.LBB1270
+	.uleb128 0x5c
+	.4byte	0x131de
+	.8byte	.LBB1266
 	.4byte	.Ldebug_ranges0+0x810
 	.byte	0x1
-	.2byte	0x359
-	.4byte	0x13e48
-	.uleb128 0x54
-	.4byte	0x13190
-	.uleb128 0x54
-	.4byte	0x13185
-	.uleb128 0x54
-	.4byte	0x1317a
+	.2byte	0x35a
+	.4byte	0x13ed8
+	.uleb128 0x55
+	.4byte	0x13206
+	.uleb128 0x55
+	.4byte	0x131fa
+	.uleb128 0x55
+	.4byte	0x131ee
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x1316a
-	.8byte	.LBB1282
+	.uleb128 0x5c
+	.4byte	0x131de
+	.8byte	.LBB1278
 	.4byte	.Ldebug_ranges0+0x880
 	.byte	0x1
-	.2byte	0x35a
-	.4byte	0x13e70
-	.uleb128 0x54
-	.4byte	0x13190
-	.uleb128 0x54
-	.4byte	0x13185
-	.uleb128 0x54
-	.4byte	0x1317a
+	.2byte	0x35b
+	.4byte	0x13f00
+	.uleb128 0x55
+	.4byte	0x13206
+	.uleb128 0x55
+	.4byte	0x131fa
+	.uleb128 0x55
+	.4byte	0x131ee
 	.byte	0
-	.uleb128 0x5f
-	.4byte	0x1316a
-	.8byte	.LBB1294
+	.uleb128 0x60
+	.4byte	0x131de
+	.8byte	.LBB1290
 	.4byte	.Ldebug_ranges0+0x8f0
 	.byte	0x1
-	.2byte	0x35b
-	.uleb128 0x54
-	.4byte	0x13190
-	.uleb128 0x54
-	.4byte	0x13185
-	.uleb128 0x54
-	.4byte	0x1317a
+	.2byte	0x35c
+	.uleb128 0x55
+	.4byte	0x13206
+	.uleb128 0x55
+	.4byte	0x131fa
+	.uleb128 0x55
+	.4byte	0x131ee
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x83
-	.4byte	0x12706
-	.8byte	.LFB2818
-	.8byte	.LFE2818-.LFB2818
+	.uleb128 0x84
+	.4byte	0x12776
+	.8byte	.LFB2819
+	.8byte	.LFE2819-.LFB2819
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x141cd
-	.uleb128 0x71
-	.4byte	0x12713
+	.4byte	0x1425d
+	.uleb128 0x72
+	.4byte	0x12783
 	.uleb128 0x1
 	.byte	0x50
-	.uleb128 0x6f
-	.4byte	0x1271f
+	.uleb128 0x70
+	.4byte	0x1278f
 	.4byte	.LLST118
-	.uleb128 0x6f
-	.4byte	0x1272b
+	.uleb128 0x70
+	.4byte	0x1279b
 	.4byte	.LLST119
-	.uleb128 0x6f
-	.4byte	0x12737
+	.uleb128 0x70
+	.4byte	0x127a7
 	.4byte	.LLST120
-	.uleb128 0x62
+	.uleb128 0x63
 	.4byte	.Ldebug_ranges0+0x940
-	.4byte	0x140b2
-	.uleb128 0x54
-	.4byte	0x12737
-	.uleb128 0x54
-	.4byte	0x1272b
-	.uleb128 0x54
-	.4byte	0x1271f
-	.uleb128 0x54
-	.4byte	0x12713
-	.uleb128 0x5f
-	.4byte	0x12744
-	.8byte	.LBB1330
+	.4byte	0x14142
+	.uleb128 0x55
+	.4byte	0x127a7
+	.uleb128 0x55
+	.4byte	0x1279b
+	.uleb128 0x55
+	.4byte	0x1278f
+	.uleb128 0x55
+	.4byte	0x12783
+	.uleb128 0x60
+	.4byte	0x127b4
+	.8byte	.LBB1326
 	.4byte	.Ldebug_ranges0+0x940
 	.byte	0x1
-	.2byte	0x3e8
-	.uleb128 0x54
-	.4byte	0x12775
-	.uleb128 0x54
-	.4byte	0x12775
-	.uleb128 0x54
-	.4byte	0x12775
-	.uleb128 0x54
-	.4byte	0x12769
-	.uleb128 0x54
-	.4byte	0x1275d
-	.uleb128 0x54
-	.4byte	0x12751
-	.uleb128 0x5e
+	.2byte	0x3e9
+	.uleb128 0x55
+	.4byte	0x127e5
+	.uleb128 0x55
+	.4byte	0x127e5
+	.uleb128 0x55
+	.4byte	0x127e5
+	.uleb128 0x55
+	.4byte	0x127d9
+	.uleb128 0x55
+	.4byte	0x127cd
+	.uleb128 0x55
+	.4byte	0x127c1
+	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x940
-	.uleb128 0x57
-	.4byte	0x12781
-	.uleb128 0x60
-	.4byte	0x1278d
+	.uleb128 0x58
+	.4byte	0x127f1
+	.uleb128 0x61
+	.4byte	0x127fd
 	.4byte	.LLST121
-	.uleb128 0x60
-	.4byte	0x12799
+	.uleb128 0x61
+	.4byte	0x12809
 	.4byte	.LLST122
-	.uleb128 0x60
-	.4byte	0x127a5
+	.uleb128 0x61
+	.4byte	0x12815
 	.4byte	.LLST123
-	.uleb128 0x60
-	.4byte	0x127b1
+	.uleb128 0x61
+	.4byte	0x12821
 	.4byte	.LLST124
-	.uleb128 0x60
-	.4byte	0x127bd
+	.uleb128 0x61
+	.4byte	0x1282d
 	.4byte	.LLST125
-	.uleb128 0x60
-	.4byte	0x127c9
+	.uleb128 0x61
+	.4byte	0x12839
 	.4byte	.LLST126
-	.uleb128 0x60
-	.4byte	0x127d5
+	.uleb128 0x61
+	.4byte	0x12845
 	.4byte	.LLST127
-	.uleb128 0x60
-	.4byte	0x127e1
+	.uleb128 0x61
+	.4byte	0x12851
 	.4byte	.LLST128
-	.uleb128 0x57
-	.4byte	0x127eb
-	.uleb128 0x60
-	.4byte	0x127f5
+	.uleb128 0x58
+	.4byte	0x1285b
+	.uleb128 0x61
+	.4byte	0x12865
 	.4byte	.LLST129
-	.uleb128 0x60
-	.4byte	0x12801
+	.uleb128 0x61
+	.4byte	0x12871
 	.4byte	.LLST130
-	.uleb128 0x57
-	.4byte	0x1280d
-	.uleb128 0x5b
-	.4byte	0x13122
-	.8byte	.LBB1332
+	.uleb128 0x58
+	.4byte	0x1287d
+	.uleb128 0x5c
+	.4byte	0x13193
+	.8byte	.LBB1328
 	.4byte	.Ldebug_ranges0+0x970
 	.byte	0x1
-	.2byte	0x3d9
-	.4byte	0x13fcf
-	.uleb128 0x54
-	.4byte	0x13148
-	.uleb128 0x54
-	.4byte	0x1313d
-	.uleb128 0x54
-	.4byte	0x13132
-	.uleb128 0x5e
+	.2byte	0x3da
+	.4byte	0x1405f
+	.uleb128 0x55
+	.4byte	0x131bb
+	.uleb128 0x55
+	.4byte	0x131af
+	.uleb128 0x55
+	.4byte	0x131a3
+	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x970
-	.uleb128 0x57
-	.4byte	0x13153
-	.uleb128 0x60
-	.4byte	0x1315e
+	.uleb128 0x58
+	.4byte	0x131c7
+	.uleb128 0x61
+	.4byte	0x131d2
 	.4byte	.LLST131
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x13122
-	.8byte	.LBB1335
-	.8byte	.LBE1335-.LBB1335
-	.byte	0x1
-	.2byte	0x3d6
-	.4byte	0x1401b
 	.uleb128 0x54
-	.4byte	0x13148
-	.uleb128 0x54
-	.4byte	0x1313d
-	.uleb128 0x54
-	.4byte	0x13132
-	.uleb128 0x56
-	.8byte	.LBB1336
-	.8byte	.LBE1336-.LBB1336
+	.4byte	0x13193
+	.8byte	.LBB1331
+	.8byte	.LBE1331-.LBB1331
+	.byte	0x1
+	.2byte	0x3d7
+	.4byte	0x140ab
+	.uleb128 0x55
+	.4byte	0x131bb
+	.uleb128 0x55
+	.4byte	0x131af
+	.uleb128 0x55
+	.4byte	0x131a3
 	.uleb128 0x57
-	.4byte	0x13153
-	.uleb128 0x60
-	.4byte	0x1315e
+	.8byte	.LBB1332
+	.8byte	.LBE1332-.LBB1332
+	.uleb128 0x58
+	.4byte	0x131c7
+	.uleb128 0x61
+	.4byte	0x131d2
 	.4byte	.LLST132
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x13122
-	.8byte	.LBB1337
-	.8byte	.LBE1337-.LBB1337
-	.byte	0x1
-	.2byte	0x3d7
-	.4byte	0x14067
-	.uleb128 0x54
-	.4byte	0x13148
-	.uleb128 0x54
-	.4byte	0x1313d
 	.uleb128 0x54
-	.4byte	0x13132
-	.uleb128 0x56
-	.8byte	.LBB1338
-	.8byte	.LBE1338-.LBB1338
+	.4byte	0x13193
+	.8byte	.LBB1333
+	.8byte	.LBE1333-.LBB1333
+	.byte	0x1
+	.2byte	0x3d8
+	.4byte	0x140f7
+	.uleb128 0x55
+	.4byte	0x131bb
+	.uleb128 0x55
+	.4byte	0x131af
+	.uleb128 0x55
+	.4byte	0x131a3
 	.uleb128 0x57
-	.4byte	0x13153
-	.uleb128 0x60
-	.4byte	0x1315e
+	.8byte	.LBB1334
+	.8byte	.LBE1334-.LBB1334
+	.uleb128 0x58
+	.4byte	0x131c7
+	.uleb128 0x61
+	.4byte	0x131d2
 	.4byte	.LLST133
 	.byte	0
 	.byte	0
-	.uleb128 0x5d
-	.4byte	0x13122
-	.8byte	.LBB1339
-	.8byte	.LBE1339-.LBB1339
+	.uleb128 0x5e
+	.4byte	0x13193
+	.8byte	.LBB1335
+	.8byte	.LBE1335-.LBB1335
 	.byte	0x1
-	.2byte	0x3d8
-	.uleb128 0x54
-	.4byte	0x13148
-	.uleb128 0x54
-	.4byte	0x1313d
-	.uleb128 0x54
-	.4byte	0x13132
-	.uleb128 0x56
-	.8byte	.LBB1340
-	.8byte	.LBE1340-.LBB1340
+	.2byte	0x3d9
+	.uleb128 0x55
+	.4byte	0x131bb
+	.uleb128 0x55
+	.4byte	0x131af
+	.uleb128 0x55
+	.4byte	0x131a3
 	.uleb128 0x57
-	.4byte	0x13153
-	.uleb128 0x60
-	.4byte	0x1315e
+	.8byte	.LBB1336
+	.8byte	.LBE1336-.LBB1336
+	.uleb128 0x58
+	.4byte	0x131c7
+	.uleb128 0x61
+	.4byte	0x131d2
 	.4byte	.LLST134
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5d
-	.4byte	0x1281a
-	.8byte	.LBB1344
-	.8byte	.LBE1344-.LBB1344
+	.uleb128 0x5e
+	.4byte	0x1288a
+	.8byte	.LBB1340
+	.8byte	.LBE1340-.LBB1340
 	.byte	0x1
-	.2byte	0x3ea
-	.uleb128 0x54
-	.4byte	0x1284b
-	.uleb128 0x54
-	.4byte	0x1284b
-	.uleb128 0x54
-	.4byte	0x1284b
-	.uleb128 0x54
-	.4byte	0x1283f
-	.uleb128 0x54
-	.4byte	0x12833
-	.uleb128 0x54
-	.4byte	0x12827
-	.uleb128 0x56
-	.8byte	.LBB1345
-	.8byte	.LBE1345-.LBB1345
-	.uleb128 0x57
-	.4byte	0x12857
-	.uleb128 0x57
-	.4byte	0x12863
+	.2byte	0x3eb
+	.uleb128 0x55
+	.4byte	0x128bb
+	.uleb128 0x55
+	.4byte	0x128bb
+	.uleb128 0x55
+	.4byte	0x128bb
+	.uleb128 0x55
+	.4byte	0x128af
+	.uleb128 0x55
+	.4byte	0x128a3
+	.uleb128 0x55
+	.4byte	0x12897
 	.uleb128 0x57
-	.4byte	0x1286f
-	.uleb128 0x61
-	.4byte	0x1287b
+	.8byte	.LBB1341
+	.8byte	.LBE1341-.LBB1341
+	.uleb128 0x58
+	.4byte	0x128c7
+	.uleb128 0x58
+	.4byte	0x128d3
+	.uleb128 0x58
+	.4byte	0x128df
+	.uleb128 0x62
+	.4byte	0x128eb
 	.uleb128 0x1
 	.byte	0x51
-	.uleb128 0x61
-	.4byte	0x12887
+	.uleb128 0x62
+	.4byte	0x128f7
 	.uleb128 0x1
 	.byte	0x52
-	.uleb128 0x60
-	.4byte	0x12893
+	.uleb128 0x61
+	.4byte	0x12903
 	.4byte	.LLST135
-	.uleb128 0x60
-	.4byte	0x1289f
+	.uleb128 0x61
+	.4byte	0x1290f
 	.4byte	.LLST136
-	.uleb128 0x60
-	.4byte	0x128ab
+	.uleb128 0x61
+	.4byte	0x1291b
 	.4byte	.LLST137
-	.uleb128 0x60
-	.4byte	0x128b7
+	.uleb128 0x61
+	.4byte	0x12927
 	.4byte	.LLST138
-	.uleb128 0x57
-	.4byte	0x128c1
-	.uleb128 0x60
-	.4byte	0x128cb
+	.uleb128 0x58
+	.4byte	0x12931
+	.uleb128 0x61
+	.4byte	0x1293b
 	.4byte	.LLST139
-	.uleb128 0x60
-	.4byte	0x128d7
+	.uleb128 0x61
+	.4byte	0x12947
 	.4byte	.LLST140
-	.uleb128 0x57
-	.4byte	0x128e3
-	.uleb128 0x5b
-	.4byte	0x13122
-	.8byte	.LBB1346
+	.uleb128 0x58
+	.4byte	0x12953
+	.uleb128 0x5c
+	.4byte	0x13193
+	.8byte	.LBB1342
 	.4byte	.Ldebug_ranges0+0x9a0
 	.byte	0x1
-	.2byte	0x3ae
-	.4byte	0x14192
-	.uleb128 0x54
-	.4byte	0x13148
-	.uleb128 0x54
-	.4byte	0x1313d
-	.uleb128 0x54
-	.4byte	0x13132
-	.uleb128 0x5e
+	.2byte	0x3af
+	.4byte	0x14222
+	.uleb128 0x55
+	.4byte	0x131bb
+	.uleb128 0x55
+	.4byte	0x131af
+	.uleb128 0x55
+	.4byte	0x131a3
+	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0x9a0
-	.uleb128 0x57
-	.4byte	0x13153
-	.uleb128 0x60
-	.4byte	0x1315e
+	.uleb128 0x58
+	.4byte	0x131c7
+	.uleb128 0x61
+	.4byte	0x131d2
 	.4byte	.LLST141
 	.byte	0
 	.byte	0
-	.uleb128 0x5f
-	.4byte	0x13122
-	.8byte	.LBB1353
+	.uleb128 0x60
+	.4byte	0x13193
+	.8byte	.LBB1349
 	.4byte	.Ldebug_ranges0+0xa10
 	.byte	0x1
-	.2byte	0x3ad
-	.uleb128 0x54
-	.4byte	0x13148
-	.uleb128 0x54
-	.4byte	0x1313d
-	.uleb128 0x54
-	.4byte	0x13132
-	.uleb128 0x5e
+	.2byte	0x3ae
+	.uleb128 0x55
+	.4byte	0x131bb
+	.uleb128 0x55
+	.4byte	0x131af
+	.uleb128 0x55
+	.4byte	0x131a3
+	.uleb128 0x5f
 	.4byte	.Ldebug_ranges0+0xa10
-	.uleb128 0x57
-	.4byte	0x13153
-	.uleb128 0x60
-	.4byte	0x1315e
+	.uleb128 0x58
+	.4byte	0x131c7
+	.uleb128 0x61
+	.4byte	0x131d2
 	.4byte	.LLST142
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x84
-	.4byte	0x126ce
-	.8byte	.LFB2863
-	.8byte	.LFE2863-.LFB2863
+	.uleb128 0x85
+	.4byte	0x1273e
+	.8byte	.LFB2864
+	.8byte	.LFE2864-.LFB2864
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x142d0
-	.uleb128 0x6f
-	.4byte	0x126db
+	.4byte	0x14360
+	.uleb128 0x70
+	.4byte	0x1274b
 	.4byte	.LLST143
-	.uleb128 0x54
-	.4byte	0x126e7
-	.uleb128 0x57
-	.4byte	0x126f3
-	.uleb128 0x5b
-	.4byte	0x13274
-	.8byte	.LBB1369
+	.uleb128 0x55
+	.4byte	0x12757
+	.uleb128 0x58
+	.4byte	0x12763
+	.uleb128 0x5c
+	.4byte	0x132f8
+	.8byte	.LBB1365
 	.4byte	.Ldebug_ranges0+0xa70
 	.byte	0x1
-	.2byte	0x3f1
-	.4byte	0x1424e
-	.uleb128 0x54
-	.4byte	0x132a5
-	.uleb128 0x54
-	.4byte	0x13299
-	.uleb128 0x54
-	.4byte	0x1328d
-	.uleb128 0x54
-	.4byte	0x13281
-	.uleb128 0x5e
-	.4byte	.Ldebug_ranges0+0xa70
-	.uleb128 0x57
-	.4byte	0x132b1
+	.2byte	0x3f2
+	.4byte	0x142de
+	.uleb128 0x55
+	.4byte	0x13329
+	.uleb128 0x55
+	.4byte	0x1331d
+	.uleb128 0x55
+	.4byte	0x13311
+	.uleb128 0x55
+	.4byte	0x13305
 	.uleb128 0x5f
-	.4byte	0x132be
-	.8byte	.LBB1371
+	.4byte	.Ldebug_ranges0+0xa70
+	.uleb128 0x58
+	.4byte	0x13335
+	.uleb128 0x60
+	.4byte	0x13342
+	.8byte	.LBB1367
 	.4byte	.Ldebug_ranges0+0xac0
 	.byte	0xa
 	.2byte	0x1af
-	.uleb128 0x54
-	.4byte	0x132cf
+	.uleb128 0x55
+	.4byte	0x13353
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x131ef
-	.8byte	.LBB1380
+	.uleb128 0x5c
+	.4byte	0x1326b
+	.8byte	.LBB1376
 	.4byte	.Ldebug_ranges0+0xaf0
 	.byte	0x1
-	.2byte	0x3f2
-	.4byte	0x14280
-	.uleb128 0x54
-	.4byte	0x13228
-	.uleb128 0x54
-	.4byte	0x1321d
-	.uleb128 0x54
-	.4byte	0x13212
-	.uleb128 0x54
-	.4byte	0x13207
-	.uleb128 0x54
-	.4byte	0x131fc
-	.byte	0
-	.uleb128 0x53
-	.4byte	0x131c0
-	.8byte	.LBB1386
-	.8byte	.LBE1386-.LBB1386
-	.byte	0x1
 	.2byte	0x3f3
-	.4byte	0x142ac
-	.uleb128 0x54
-	.4byte	0x131e3
-	.uleb128 0x54
-	.4byte	0x131d8
-	.uleb128 0x54
-	.4byte	0x131cd
+	.4byte	0x14310
+	.uleb128 0x55
+	.4byte	0x132a8
+	.uleb128 0x55
+	.4byte	0x1329c
+	.uleb128 0x55
+	.4byte	0x13290
+	.uleb128 0x55
+	.4byte	0x13284
+	.uleb128 0x55
+	.4byte	0x13278
 	.byte	0
-	.uleb128 0x5d
-	.4byte	0x1319c
-	.8byte	.LBB1388
-	.8byte	.LBE1388-.LBB1388
+	.uleb128 0x54
+	.4byte	0x13239
+	.8byte	.LBB1382
+	.8byte	.LBE1382-.LBB1382
 	.byte	0x1
 	.2byte	0x3f4
-	.uleb128 0x54
-	.4byte	0x131b4
-	.uleb128 0x54
-	.4byte	0x131a9
+	.4byte	0x1433c
+	.uleb128 0x55
+	.4byte	0x1325e
+	.uleb128 0x55
+	.4byte	0x13252
+	.uleb128 0x55
+	.4byte	0x13246
 	.byte	0
+	.uleb128 0x5e
+	.4byte	0x13213
+	.8byte	.LBB1384
+	.8byte	.LBE1384-.LBB1384
+	.byte	0x1
+	.2byte	0x3f5
+	.uleb128 0x55
+	.4byte	0x1322c
+	.uleb128 0x55
+	.4byte	0x13220
 	.byte	0
-	.uleb128 0x84
-	.4byte	0x130f0
-	.8byte	.LFB2864
-	.8byte	.LFE2864-.LFB2864
+	.byte	0
+	.uleb128 0x85
+	.4byte	0x13160
+	.8byte	.LFB2865
+	.8byte	.LFE2865-.LFB2865
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1438e
-	.uleb128 0x6f
-	.4byte	0x13100
+	.4byte	0x1441e
+	.uleb128 0x70
+	.4byte	0x13170
 	.4byte	.LLST146
-	.uleb128 0x6f
-	.4byte	0x1310b
-	.4byte	.LLST147
-	.uleb128 0x57
-	.4byte	0x13116
 	.uleb128 0x70
-	.4byte	0x13234
-	.8byte	.LBB1416
-	.8byte	.LBE1416-.LBB1416
+	.4byte	0x1317b
+	.4byte	.LLST147
+	.uleb128 0x58
+	.4byte	0x13187
+	.uleb128 0x71
+	.4byte	0x132b5
+	.8byte	.LBB1408
+	.8byte	.LBE1408-.LBB1408
 	.byte	0x1
-	.byte	0xc8
-	.4byte	0x14324
-	.uleb128 0x54
-	.4byte	0x13241
+	.byte	0xc9
+	.4byte	0x143b4
+	.uleb128 0x55
+	.4byte	0x132c2
 	.byte	0
-	.uleb128 0x70
-	.4byte	0x133c1
-	.8byte	.LBB1418
-	.8byte	.LBE1418-.LBB1418
+	.uleb128 0x71
+	.4byte	0x1344d
+	.8byte	.LBB1410
+	.8byte	.LBE1410-.LBB1410
 	.byte	0x1
-	.byte	0xc9
-	.4byte	0x14345
-	.uleb128 0x54
-	.4byte	0x133ce
+	.byte	0xca
+	.4byte	0x143d5
+	.uleb128 0x55
+	.4byte	0x1345a
 	.byte	0
-	.uleb128 0x70
-	.4byte	0x133f3
-	.8byte	.LBB1420
-	.8byte	.LBE1420-.LBB1420
+	.uleb128 0x71
+	.4byte	0x13481
+	.8byte	.LBB1412
+	.8byte	.LBE1412-.LBB1412
 	.byte	0x1
-	.byte	0xcc
-	.4byte	0x14373
-	.uleb128 0x54
-	.4byte	0x13400
-	.uleb128 0x4e
+	.byte	0xcd
+	.4byte	0x14403
+	.uleb128 0x55
+	.4byte	0x1348e
+	.uleb128 0x4f
 	.8byte	.LVL513
-	.4byte	0x146d6
+	.4byte	0x14773
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.8byte	.LVL510
-	.4byte	0x14458
-	.uleb128 0x4e
+	.4byte	0x144e8
+	.uleb128 0x4f
 	.8byte	.LVL514
-	.4byte	0x14458
+	.4byte	0x144e8
 	.byte	0
-	.uleb128 0x84
-	.4byte	0x130f0
-	.8byte	.LFB2869
-	.8byte	.LFE2869-.LFB2869
+	.uleb128 0x85
+	.4byte	0x13160
+	.8byte	.LFB2870
+	.8byte	.LFE2870-.LFB2870
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14440
-	.uleb128 0x6f
-	.4byte	0x13100
-	.4byte	.LLST174
-	.uleb128 0x57
-	.4byte	0x13116
-	.uleb128 0x54
-	.4byte	0x1310b
+	.4byte	0x144d0
 	.uleb128 0x70
-	.4byte	0x133da
-	.8byte	.LBB1763
-	.8byte	.LBE1763-.LBB1763
+	.4byte	0x13170
+	.4byte	.LLST174
+	.uleb128 0x58
+	.4byte	0x13187
+	.uleb128 0x55
+	.4byte	0x1317b
+	.uleb128 0x71
+	.4byte	0x13467
+	.8byte	.LBB1755
+	.8byte	.LBE1755-.LBB1755
 	.byte	0x1
-	.byte	0xc1
-	.4byte	0x143de
-	.uleb128 0x54
-	.4byte	0x133e7
+	.byte	0xc2
+	.4byte	0x1446e
+	.uleb128 0x55
+	.4byte	0x13474
 	.byte	0
-	.uleb128 0x70
-	.4byte	0x1324d
-	.8byte	.LBB1765
-	.8byte	.LBE1765-.LBB1765
+	.uleb128 0x71
+	.4byte	0x132cf
+	.8byte	.LBB1757
+	.8byte	.LBE1757-.LBB1757
 	.byte	0x1
-	.byte	0xc2
-	.4byte	0x14404
-	.uleb128 0x54
-	.4byte	0x13268
-	.uleb128 0x54
-	.4byte	0x1325d
+	.byte	0xc3
+	.4byte	0x14494
+	.uleb128 0x55
+	.4byte	0x132eb
+	.uleb128 0x55
+	.4byte	0x132df
 	.byte	0
-	.uleb128 0x70
-	.4byte	0x13412
-	.8byte	.LBB1767
-	.8byte	.LBE1767-.LBB1767
+	.uleb128 0x71
+	.4byte	0x134a1
+	.8byte	.LBB1759
+	.8byte	.LBE1759-.LBB1759
 	.byte	0x1
-	.byte	0xbe
-	.4byte	0x14432
-	.uleb128 0x54
-	.4byte	0x1341f
-	.uleb128 0x4e
-	.8byte	.LVL713
-	.4byte	0x1474d
+	.byte	0xbf
+	.4byte	0x144c2
+	.uleb128 0x55
+	.4byte	0x134ae
+	.uleb128 0x4f
+	.8byte	.LVL714
+	.4byte	0x147ea
 	.byte	0
-	.uleb128 0x4e
-	.8byte	.LVL710
-	.4byte	0x14458
+	.uleb128 0x4f
+	.8byte	.LVL711
+	.4byte	0x144e8
 	.byte	0
-	.uleb128 0x85
-	.4byte	.LASF3236
-	.4byte	.LASF3236
+	.uleb128 0x86
+	.4byte	.LASF3250
+	.4byte	.LASF3250
 	.byte	0xbe
 	.byte	0xcc
-	.uleb128 0x85
-	.4byte	.LASF3237
-	.4byte	.LASF3237
+	.uleb128 0x86
+	.4byte	.LASF3251
+	.4byte	.LASF3251
 	.byte	0xbe
 	.byte	0xca
-	.uleb128 0x86
-	.4byte	.LASF3238
-	.4byte	.LASF3238
+	.uleb128 0x87
+	.4byte	.LASF3252
+	.4byte	.LASF3252
 	.byte	0x2
 	.2byte	0x5d1
-	.uleb128 0x85
-	.4byte	.LASF3239
-	.4byte	.LASF3239
+	.uleb128 0x86
+	.4byte	.LASF3253
+	.4byte	.LASF3253
 	.byte	0xac
 	.byte	0x4f
-	.uleb128 0x86
-	.4byte	.LASF3240
-	.4byte	.LASF3240
+	.uleb128 0x87
+	.4byte	.LASF3254
+	.4byte	.LASF3254
 	.byte	0x2
 	.2byte	0x2bf
-	.uleb128 0x86
-	.4byte	.LASF3241
-	.4byte	.LASF3241
+	.uleb128 0x87
+	.4byte	.LASF3255
+	.4byte	.LASF3255
 	.byte	0xe
 	.2byte	0x149
-	.uleb128 0x86
-	.4byte	.LASF3242
-	.4byte	.LASF3242
+	.uleb128 0x87
+	.4byte	.LASF3256
+	.4byte	.LASF3256
 	.byte	0xe
 	.2byte	0x172
-	.uleb128 0x85
-	.4byte	.LASF3243
-	.4byte	.LASF3243
+	.uleb128 0x86
+	.4byte	.LASF3257
+	.4byte	.LASF3257
 	.byte	0xd4
 	.byte	0x78
-	.uleb128 0x85
-	.4byte	.LASF3244
-	.4byte	.LASF3244
+	.uleb128 0x86
+	.4byte	.LASF3258
+	.4byte	.LASF3258
 	.byte	0xaa
 	.byte	0x59
-	.uleb128 0x85
-	.4byte	.LASF3245
-	.4byte	.LASF3245
+	.uleb128 0x86
+	.4byte	.LASF3259
+	.4byte	.LASF3259
 	.byte	0xc3
 	.byte	0x30
-	.uleb128 0x87
-	.4byte	.LASF3246
-	.4byte	.LASF3246
-	.uleb128 0x85
-	.4byte	.LASF3246
-	.4byte	.LASF3246
+	.uleb128 0x88
+	.4byte	.LASF3260
+	.4byte	.LASF3260
+	.uleb128 0x86
+	.4byte	.LASF3260
+	.4byte	.LASF3260
 	.byte	0xd5
 	.byte	0x36
-	.uleb128 0x86
-	.4byte	.LASF3247
-	.4byte	.LASF3247
+	.uleb128 0x87
+	.4byte	.LASF3261
+	.4byte	.LASF3261
 	.byte	0x2
 	.2byte	0x5cb
-	.uleb128 0x85
-	.4byte	.LASF3248
-	.4byte	.LASF3248
+	.uleb128 0x86
+	.4byte	.LASF3262
+	.4byte	.LASF3262
 	.byte	0xc2
 	.byte	0x30
-	.uleb128 0x85
-	.4byte	.LASF3249
-	.4byte	.LASF3249
+	.uleb128 0x86
+	.4byte	.LASF3263
+	.4byte	.LASF3263
 	.byte	0xc2
 	.byte	0x31
-	.uleb128 0x85
-	.4byte	.LASF3250
-	.4byte	.LASF3250
+	.uleb128 0x86
+	.4byte	.LASF3264
+	.4byte	.LASF3264
 	.byte	0xab
 	.byte	0x9
-	.uleb128 0x86
-	.4byte	.LASF3251
-	.4byte	.LASF3251
+	.uleb128 0x87
+	.4byte	.LASF3265
+	.4byte	.LASF3265
 	.byte	0x48
 	.2byte	0x6b8
-	.uleb128 0x86
-	.4byte	.LASF3252
-	.4byte	.LASF3252
+	.uleb128 0x87
+	.4byte	.LASF3266
+	.4byte	.LASF3266
+	.byte	0xd
+	.2byte	0x190
+	.uleb128 0x87
+	.4byte	.LASF3267
+	.4byte	.LASF3267
 	.byte	0x48
 	.2byte	0x676
-	.uleb128 0x85
-	.4byte	.LASF3253
-	.4byte	.LASF3253
+	.uleb128 0x86
+	.4byte	.LASF3268
+	.4byte	.LASF3268
 	.byte	0x9c
 	.byte	0x67
-	.uleb128 0x85
-	.4byte	.LASF3254
-	.4byte	.LASF3254
+	.uleb128 0x86
+	.4byte	.LASF3269
+	.4byte	.LASF3269
 	.byte	0x54
 	.byte	0x53
-	.uleb128 0x85
-	.4byte	.LASF3255
-	.4byte	.LASF3255
+	.uleb128 0x86
+	.4byte	.LASF3270
+	.4byte	.LASF3270
 	.byte	0x54
 	.byte	0xa5
-	.uleb128 0x85
-	.4byte	.LASF3256
-	.4byte	.LASF3256
+	.uleb128 0x86
+	.4byte	.LASF3271
+	.4byte	.LASF3271
 	.byte	0xc3
 	.byte	0x2b
-	.uleb128 0x85
-	.4byte	.LASF3257
-	.4byte	.LASF3257
+	.uleb128 0x86
+	.4byte	.LASF3272
+	.4byte	.LASF3272
 	.byte	0xc3
 	.byte	0x27
-	.uleb128 0x86
-	.4byte	.LASF3258
-	.4byte	.LASF3258
+	.uleb128 0x87
+	.4byte	.LASF3273
+	.4byte	.LASF3273
 	.byte	0x12
 	.2byte	0x184
-	.uleb128 0x85
-	.4byte	.LASF3259
-	.4byte	.LASF3259
+	.uleb128 0x86
+	.4byte	.LASF3274
+	.4byte	.LASF3274
 	.byte	0xd6
 	.byte	0x51
-	.uleb128 0x86
-	.4byte	.LASF3260
-	.4byte	.LASF3260
+	.uleb128 0x87
+	.4byte	.LASF3275
+	.4byte	.LASF3275
 	.byte	0x20
 	.2byte	0x1d9
-	.uleb128 0x85
-	.4byte	.LASF3261
-	.4byte	.LASF3261
+	.uleb128 0x86
+	.4byte	.LASF3276
+	.4byte	.LASF3276
 	.byte	0x3
 	.byte	0x3b
-	.uleb128 0x85
-	.4byte	.LASF3262
-	.4byte	.LASF3262
+	.uleb128 0x86
+	.4byte	.LASF3277
+	.4byte	.LASF3277
 	.byte	0x12
 	.byte	0xb9
-	.uleb128 0x85
-	.4byte	.LASF3263
-	.4byte	.LASF3263
+	.uleb128 0x86
+	.4byte	.LASF3278
+	.4byte	.LASF3278
 	.byte	0x3a
 	.byte	0xc2
-	.uleb128 0x87
-	.4byte	.LASF3264
-	.4byte	.LASF3264
-	.uleb128 0x85
-	.4byte	.LASF3265
-	.4byte	.LASF3265
+	.uleb128 0x88
+	.4byte	.LASF3279
+	.4byte	.LASF3279
+	.uleb128 0x86
+	.4byte	.LASF3280
+	.4byte	.LASF3280
 	.byte	0xac
 	.byte	0x4e
-	.uleb128 0x86
-	.4byte	.LASF3266
-	.4byte	.LASF3266
+	.uleb128 0x87
+	.4byte	.LASF3281
+	.4byte	.LASF3281
 	.byte	0x2
 	.2byte	0x287
-	.uleb128 0x85
-	.4byte	.LASF3267
-	.4byte	.LASF3267
+	.uleb128 0x86
+	.4byte	.LASF3282
+	.4byte	.LASF3282
 	.byte	0xbf
 	.byte	0x38
-	.uleb128 0x86
-	.4byte	.LASF3268
-	.4byte	.LASF3268
+	.uleb128 0x87
+	.4byte	.LASF3283
+	.4byte	.LASF3283
 	.byte	0xe
 	.2byte	0x165
-	.uleb128 0x86
-	.4byte	.LASF3269
-	.4byte	.LASF3269
+	.uleb128 0x87
+	.4byte	.LASF3284
+	.4byte	.LASF3284
 	.byte	0xa3
 	.2byte	0x37b
-	.uleb128 0x86
-	.4byte	.LASF3270
-	.4byte	.LASF3270
+	.uleb128 0x87
+	.4byte	.LASF3285
+	.4byte	.LASF3285
 	.byte	0xe
 	.2byte	0x125
-	.uleb128 0x87
-	.4byte	.LASF3271
-	.4byte	.LASF3271
-	.uleb128 0x85
-	.4byte	.LASF3272
-	.4byte	.LASF3272
+	.uleb128 0x88
+	.4byte	.LASF3286
+	.4byte	.LASF3286
+	.uleb128 0x86
+	.4byte	.LASF3287
+	.4byte	.LASF3287
 	.byte	0xc3
 	.byte	0x2e
-	.uleb128 0x86
-	.4byte	.LASF3273
-	.4byte	.LASF3273
+	.uleb128 0x87
+	.4byte	.LASF3288
+	.4byte	.LASF3288
 	.byte	0x20
 	.2byte	0x1c7
-	.uleb128 0x86
-	.4byte	.LASF3274
-	.4byte	.LASF3274
+	.uleb128 0x87
+	.4byte	.LASF3289
+	.4byte	.LASF3289
 	.byte	0x20
 	.2byte	0x17e
-	.uleb128 0x85
-	.4byte	.LASF3275
-	.4byte	.LASF3275
+	.uleb128 0x86
+	.4byte	.LASF3290
+	.4byte	.LASF3290
 	.byte	0x3
 	.byte	0x3a
-	.uleb128 0x85
-	.4byte	.LASF3276
-	.4byte	.LASF3276
+	.uleb128 0x86
+	.4byte	.LASF3291
+	.4byte	.LASF3291
 	.byte	0xc2
 	.byte	0x32
-	.uleb128 0x86
-	.4byte	.LASF3277
-	.4byte	.LASF3277
+	.uleb128 0x87
+	.4byte	.LASF3292
+	.4byte	.LASF3292
 	.byte	0x76
-	.2byte	0xa07
-	.uleb128 0x85
-	.4byte	.LASF3278
-	.4byte	.LASF3278
+	.2byte	0xa0a
+	.uleb128 0x86
+	.4byte	.LASF3293
+	.4byte	.LASF3293
 	.byte	0xc3
 	.byte	0x2c
-	.uleb128 0x85
-	.4byte	.LASF3279
-	.4byte	.LASF3279
+	.uleb128 0x86
+	.4byte	.LASF3294
+	.4byte	.LASF3294
 	.byte	0x48
 	.byte	0xdc
-	.uleb128 0x86
-	.4byte	.LASF3280
-	.4byte	.LASF3280
+	.uleb128 0x87
+	.4byte	.LASF3295
+	.4byte	.LASF3295
 	.byte	0x3a
 	.2byte	0x459
-	.uleb128 0x85
-	.4byte	.LASF3281
-	.4byte	.LASF3281
+	.uleb128 0x86
+	.4byte	.LASF3296
+	.4byte	.LASF3296
 	.byte	0x3a
 	.byte	0xe9
-	.uleb128 0x86
-	.4byte	.LASF3282
-	.4byte	.LASF3282
+	.uleb128 0x87
+	.4byte	.LASF3297
+	.4byte	.LASF3297
 	.byte	0x3a
 	.2byte	0x45a
-	.uleb128 0x86
-	.4byte	.LASF3283
-	.4byte	.LASF3283
+	.uleb128 0x87
+	.4byte	.LASF3298
+	.4byte	.LASF3298
 	.byte	0x6
 	.2byte	0x19f
-	.uleb128 0x86
-	.4byte	.LASF3284
-	.4byte	.LASF3284
+	.uleb128 0x87
+	.4byte	.LASF3299
+	.4byte	.LASF3299
 	.byte	0x6
 	.2byte	0x199
-	.uleb128 0x85
-	.4byte	.LASF3285
-	.4byte	.LASF3285
+	.uleb128 0x86
+	.4byte	.LASF3300
+	.4byte	.LASF3300
 	.byte	0xc3
 	.byte	0x25
-	.uleb128 0x85
-	.4byte	.LASF3286
-	.4byte	.LASF3286
+	.uleb128 0x86
+	.4byte	.LASF3301
+	.4byte	.LASF3301
 	.byte	0xc3
 	.byte	0x2a
-	.uleb128 0x85
-	.4byte	.LASF3287
-	.4byte	.LASF3287
+	.uleb128 0x86
+	.4byte	.LASF3302
+	.4byte	.LASF3302
 	.byte	0xc3
 	.byte	0x24
-	.uleb128 0x85
-	.4byte	.LASF3288
-	.4byte	.LASF3288
+	.uleb128 0x86
+	.4byte	.LASF3303
+	.4byte	.LASF3303
 	.byte	0xc3
 	.byte	0x23
-	.uleb128 0x85
-	.4byte	.LASF3289
-	.4byte	.LASF3289
+	.uleb128 0x86
+	.4byte	.LASF3304
+	.4byte	.LASF3304
 	.byte	0x9c
 	.byte	0x73
-	.uleb128 0x85
-	.4byte	.LASF3290
-	.4byte	.LASF3290
+	.uleb128 0x86
+	.4byte	.LASF3305
+	.4byte	.LASF3305
 	.byte	0xc3
 	.byte	0x29
-	.uleb128 0x85
-	.4byte	.LASF3291
-	.4byte	.LASF3291
+	.uleb128 0x86
+	.4byte	.LASF3306
+	.4byte	.LASF3306
 	.byte	0x72
 	.byte	0x88
-	.uleb128 0x85
-	.4byte	.LASF3292
-	.4byte	.LASF3292
+	.uleb128 0x86
+	.4byte	.LASF3307
+	.4byte	.LASF3307
 	.byte	0xc3
 	.byte	0x26
-	.uleb128 0x85
-	.4byte	.LASF3293
-	.4byte	.LASF3293
+	.uleb128 0x86
+	.4byte	.LASF3308
+	.4byte	.LASF3308
 	.byte	0x72
 	.byte	0x98
-	.uleb128 0x85
-	.4byte	.LASF3294
-	.4byte	.LASF3294
+	.uleb128 0x86
+	.4byte	.LASF3309
+	.4byte	.LASF3309
 	.byte	0xc4
 	.byte	0x6a
-	.uleb128 0x85
-	.4byte	.LASF3295
-	.4byte	.LASF3295
+	.uleb128 0x86
+	.4byte	.LASF3310
+	.4byte	.LASF3310
 	.byte	0xc2
 	.byte	0x33
-	.uleb128 0x86
-	.4byte	.LASF3296
-	.4byte	.LASF3296
+	.uleb128 0x87
+	.4byte	.LASF3311
+	.4byte	.LASF3311
 	.byte	0xd
 	.2byte	0x1d6
-	.uleb128 0x88
+	.uleb128 0x89
 	.string	"up"
 	.string	"up"
 	.byte	0x78
 	.byte	0x2c
-	.uleb128 0x85
-	.4byte	.LASF3297
-	.4byte	.LASF3297
+	.uleb128 0x86
+	.4byte	.LASF3312
+	.4byte	.LASF3312
 	.byte	0x78
 	.byte	0x27
-	.uleb128 0x85
-	.4byte	.LASF3298
-	.4byte	.LASF3298
+	.uleb128 0x86
+	.4byte	.LASF3313
+	.4byte	.LASF3313
 	.byte	0x9c
 	.byte	0x71
 	.byte	0
@@ -47736,6 +47787,30 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x38
+	.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 0x39
+	.uleb128 0x28
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x1c
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x3a
 	.uleb128 0xd
 	.byte	0
 	.uleb128 0x3
@@ -47756,7 +47831,7 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x39
+	.uleb128 0x3b
 	.uleb128 0x17
 	.byte	0x1
 	.uleb128 0x3
@@ -47771,7 +47846,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x3a
+	.uleb128 0x3c
 	.uleb128 0x13
 	.byte	0
 	.uleb128 0x3
@@ -47784,7 +47859,7 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x3b
+	.uleb128 0x3d
 	.uleb128 0xd
 	.byte	0
 	.uleb128 0x3
@@ -47805,7 +47880,7 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x3c
+	.uleb128 0x3e
 	.uleb128 0x17
 	.byte	0x1
 	.uleb128 0x3
@@ -47820,7 +47895,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x3d
+	.uleb128 0x3f
 	.uleb128 0xd
 	.byte	0
 	.uleb128 0x3
@@ -47833,7 +47908,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x3e
+	.uleb128 0x40
 	.uleb128 0x17
 	.byte	0
 	.uleb128 0xb
@@ -47844,7 +47919,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x5
 	.byte	0
 	.byte	0
-	.uleb128 0x3f
+	.uleb128 0x41
 	.uleb128 0x17
 	.byte	0x1
 	.uleb128 0xb
@@ -47857,7 +47932,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x40
+	.uleb128 0x42
 	.uleb128 0xd
 	.byte	0
 	.uleb128 0x3
@@ -47876,7 +47951,7 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x41
+	.uleb128 0x43
 	.uleb128 0xd
 	.byte	0
 	.uleb128 0x3
@@ -47889,7 +47964,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x42
+	.uleb128 0x44
 	.uleb128 0x17
 	.byte	0x1
 	.uleb128 0x3
@@ -47904,7 +47979,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x43
+	.uleb128 0x45
 	.uleb128 0x21
 	.byte	0
 	.uleb128 0x49
@@ -47913,14 +47988,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x5
 	.byte	0
 	.byte	0
-	.uleb128 0x44
+	.uleb128 0x46
 	.uleb128 0x21
 	.byte	0
 	.uleb128 0x49
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x45
+	.uleb128 0x47
 	.uleb128 0x13
 	.byte	0x1
 	.uleb128 0xb
@@ -47933,7 +48008,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x46
+	.uleb128 0x48
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -47946,7 +48021,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x47
+	.uleb128 0x49
 	.uleb128 0xd
 	.byte	0
 	.uleb128 0x3
@@ -47961,7 +48036,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x5
 	.byte	0
 	.byte	0
-	.uleb128 0x48
+	.uleb128 0x4a
 	.uleb128 0x13
 	.byte	0
 	.uleb128 0x3
@@ -47970,22 +48045,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x19
 	.byte	0
 	.byte	0
-	.uleb128 0x49
-	.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 0x4a
+	.uleb128 0x4b
 	.uleb128 0x13
 	.byte	0x1
 	.uleb128 0x3
@@ -48000,7 +48060,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x4b
+	.uleb128 0x4c
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -48015,7 +48075,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x18
 	.byte	0
 	.byte	0
-	.uleb128 0x4c
+	.uleb128 0x4d
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -48030,7 +48090,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x18
 	.byte	0
 	.byte	0
-	.uleb128 0x4d
+	.uleb128 0x4e
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -48053,7 +48113,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.uleb128 0x4109
 	.byte	0
 	.uleb128 0x11
@@ -48062,7 +48122,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x4f
+	.uleb128 0x50
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -48087,7 +48147,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x50
+	.uleb128 0x51
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -48112,7 +48172,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x51
+	.uleb128 0x52
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -48127,7 +48187,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x52
+	.uleb128 0x53
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -48140,7 +48200,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x53
+	.uleb128 0x54
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -48157,14 +48217,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x54
+	.uleb128 0x55
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x31
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x55
+	.uleb128 0x56
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -48177,7 +48237,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x18
 	.byte	0
 	.byte	0
-	.uleb128 0x56
+	.uleb128 0x57
 	.uleb128 0xb
 	.byte	0x1
 	.uleb128 0x11
@@ -48186,14 +48246,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x7
 	.byte	0
 	.byte	0
-	.uleb128 0x57
+	.uleb128 0x58
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x31
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x58
+	.uleb128 0x59
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -48208,7 +48268,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x59
+	.uleb128 0x5a
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -48223,7 +48283,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
+	.uleb128 0x5b
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -48238,7 +48298,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
+	.uleb128 0x5c
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -48255,7 +48315,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
+	.uleb128 0x5d
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -48270,7 +48330,7 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x5d
+	.uleb128 0x5e
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -48285,14 +48345,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x5
 	.byte	0
 	.byte	0
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.uleb128 0xb
 	.byte	0x1
 	.uleb128 0x55
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x5f
+	.uleb128 0x60
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -48307,7 +48367,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x5
 	.byte	0
 	.byte	0
-	.uleb128 0x60
+	.uleb128 0x61
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x31
@@ -48316,7 +48376,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x61
+	.uleb128 0x62
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x31
@@ -48325,7 +48385,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x18
 	.byte	0
 	.byte	0
-	.uleb128 0x62
+	.uleb128 0x63
 	.uleb128 0xb
 	.byte	0x1
 	.uleb128 0x55
@@ -48334,7 +48394,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x63
+	.uleb128 0x64
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -48353,7 +48413,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x64
+	.uleb128 0x65
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -48366,7 +48426,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x65
+	.uleb128 0x66
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -48379,7 +48439,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x66
+	.uleb128 0x67
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -48396,12 +48456,12 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x67
+	.uleb128 0x68
 	.uleb128 0xb
 	.byte	0x1
 	.byte	0
 	.byte	0
-	.uleb128 0x68
+	.uleb128 0x69
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -48414,7 +48474,7 @@ __exitcall_ebc_exit:
 	.uleb128 0xe
 	.byte	0
 	.byte	0
-	.uleb128 0x69
+	.uleb128 0x6a
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -48429,7 +48489,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x18
 	.byte	0
 	.byte	0
-	.uleb128 0x6a
+	.uleb128 0x6b
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -48446,7 +48506,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x6b
+	.uleb128 0x6c
 	.uleb128 0xa
 	.byte	0
 	.uleb128 0x3
@@ -48459,7 +48519,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0
 	.byte	0
-	.uleb128 0x6c
+	.uleb128 0x6d
 	.uleb128 0xb
 	.byte	0x1
 	.uleb128 0x11
@@ -48470,7 +48530,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x6d
+	.uleb128 0x6e
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -48485,7 +48545,7 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x6e
+	.uleb128 0x6f
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -48502,7 +48562,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x6f
+	.uleb128 0x70
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x31
@@ -48511,7 +48571,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x70
+	.uleb128 0x71
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -48528,7 +48588,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x71
+	.uleb128 0x72
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x31
@@ -48537,7 +48597,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x18
 	.byte	0
 	.byte	0
-	.uleb128 0x72
+	.uleb128 0x73
 	.uleb128 0xa
 	.byte	0
 	.uleb128 0x3
@@ -48548,14 +48608,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x5
 	.byte	0
 	.byte	0
-	.uleb128 0x73
+	.uleb128 0x74
 	.uleb128 0xa
 	.byte	0
 	.uleb128 0x31
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x74
+	.uleb128 0x75
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -48570,7 +48630,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x18
 	.byte	0
 	.byte	0
-	.uleb128 0x75
+	.uleb128 0x76
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3f
@@ -48595,7 +48655,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x76
+	.uleb128 0x77
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3f
@@ -48620,7 +48680,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x77
+	.uleb128 0x78
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -48635,7 +48695,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x18
 	.byte	0
 	.byte	0
-	.uleb128 0x78
+	.uleb128 0x79
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -48650,7 +48710,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x79
+	.uleb128 0x7a
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -48663,7 +48723,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x7a
+	.uleb128 0x7b
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -48678,7 +48738,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -48693,7 +48753,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x18
 	.byte	0
 	.byte	0
-	.uleb128 0x7c
+	.uleb128 0x7d
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -48706,7 +48766,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -48725,7 +48785,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -48738,7 +48798,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x7f
+	.uleb128 0x80
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -48751,7 +48811,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x80
+	.uleb128 0x81
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -48768,7 +48828,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x81
+	.uleb128 0x82
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3
@@ -48783,12 +48843,12 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x82
+	.uleb128 0x83
 	.uleb128 0x35
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x83
+	.uleb128 0x84
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x31
@@ -48805,7 +48865,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x84
+	.uleb128 0x85
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x31
@@ -48822,7 +48882,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x85
+	.uleb128 0x86
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -48839,7 +48899,7 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x86
+	.uleb128 0x87
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -48856,7 +48916,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x5
 	.byte	0
 	.byte	0
-	.uleb128 0x87
+	.uleb128 0x88
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -48869,7 +48929,7 @@ __exitcall_ebc_exit:
 	.uleb128 0xe
 	.byte	0
 	.byte	0
-	.uleb128 0x88
+	.uleb128 0x89
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -48926,8 +48986,8 @@ __exitcall_ebc_exit:
 	.8byte	.LVL539
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL672
 	.8byte	.LVL673
+	.8byte	.LVL674
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -48953,19 +49013,19 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x63
 	.8byte	.LVL591
-	.8byte	.LVL672
+	.8byte	.LVL673
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL673
-	.8byte	.LVL679
+	.8byte	.LVL674
+	.8byte	.LVL680
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL682
-	.8byte	.LVL691
+	.8byte	.LVL683
+	.8byte	.LVL692
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL693
-	.8byte	.LFE2850
+	.8byte	.LVL694
+	.8byte	.LFE2851
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -48983,12 +49043,12 @@ __exitcall_ebc_exit:
 	.8byte	.LVL591
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL680
-	.8byte	.LVL682
+	.8byte	.LVL681
+	.8byte	.LVL683
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL700
 	.8byte	.LVL701
+	.8byte	.LVL702
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
@@ -49013,22 +49073,22 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL589
-	.8byte	.LVL672
+	.8byte	.LVL673
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL673
-	.8byte	.LVL679
+	.8byte	.LVL674
+	.8byte	.LVL680
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL680
-	.8byte	.LVL691
+	.8byte	.LVL681
+	.8byte	.LVL692
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL693
-	.8byte	.LFE2850
+	.8byte	.LVL694
+	.8byte	.LFE2851
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
@@ -49047,8 +49107,8 @@ __exitcall_ebc_exit:
 	.8byte	.LVL591
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL700
 	.8byte	.LVL701
+	.8byte	.LVL702
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -49066,16 +49126,16 @@ __exitcall_ebc_exit:
 	.8byte	.LVL594
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL673
 	.8byte	.LVL674
+	.8byte	.LVL675
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL693
 	.8byte	.LVL694
+	.8byte	.LVL695
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL700
 	.8byte	.LVL701
+	.8byte	.LVL702
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
@@ -49093,12 +49153,12 @@ __exitcall_ebc_exit:
 	.8byte	.LVL595
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL694
 	.8byte	.LVL695
+	.8byte	.LVL696
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL700
 	.8byte	.LVL701
+	.8byte	.LVL702
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
@@ -49111,15 +49171,15 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	0
 .LLST159:
-	.8byte	.LVL600
-	.8byte	.LVL603
+	.8byte	.LVL601
+	.8byte	.LVL604
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST160:
-	.8byte	.LVL601
 	.8byte	.LVL602
+	.8byte	.LVL603
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
@@ -49129,45 +49189,45 @@ __exitcall_ebc_exit:
 	.8byte	.LVL542
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL605
-	.8byte	.LVL613
+	.8byte	.LVL606
+	.8byte	.LVL614
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL686
-	.8byte	.LVL688
+	.8byte	.LVL687
+	.8byte	.LVL689
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL688
 	.8byte	.LVL689
+	.8byte	.LVL690
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL689
-	.8byte	.LVL691
+	.8byte	.LVL690
+	.8byte	.LVL692
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL700
 	.8byte	.LVL701
+	.8byte	.LVL702
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
 .LLST162:
-	.8byte	.LVL608
-	.8byte	.LVL611
+	.8byte	.LVL609
+	.8byte	.LVL612
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST163:
-	.8byte	.LVL609
 	.8byte	.LVL610
+	.8byte	.LVL611
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST164:
-	.8byte	.LVL612
-	.8byte	.LVL614-1
+	.8byte	.LVL613
+	.8byte	.LVL615-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -49178,37 +49238,37 @@ __exitcall_ebc_exit:
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL619
-	.8byte	.LVL657
+	.8byte	.LVL620
+	.8byte	.LVL658
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL657
 	.8byte	.LVL658
+	.8byte	.LVL659
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL661
-	.8byte	.LVL672
+	.8byte	.LVL662
+	.8byte	.LVL673
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL674
-	.8byte	.LVL679
+	.8byte	.LVL675
+	.8byte	.LVL680
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL695
-	.8byte	.LVL698
+	.8byte	.LVL696
+	.8byte	.LVL699
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL700
 	.8byte	.LVL701
+	.8byte	.LVL702
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL703
-	.8byte	.LFE2850
+	.8byte	.LVL704
+	.8byte	.LFE2851
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
@@ -49220,27 +49280,27 @@ __exitcall_ebc_exit:
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL619
-	.8byte	.LVL669
+	.8byte	.LVL620
+	.8byte	.LVL670
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL669
 	.8byte	.LVL670
+	.8byte	.LVL671
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL674
-	.8byte	.LVL679
+	.8byte	.LVL675
+	.8byte	.LVL680
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL695
-	.8byte	.LVL698
+	.8byte	.LVL696
+	.8byte	.LVL699
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL700
-	.8byte	.LFE2850
+	.8byte	.LVL701
+	.8byte	.LFE2851
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
@@ -49251,32 +49311,32 @@ __exitcall_ebc_exit:
 	.8byte	.LVL542
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL625
-	.8byte	.LVL636
+	.8byte	.LVL626
+	.8byte	.LVL637
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL640
-	.8byte	.LVL651
+	.8byte	.LVL641
+	.8byte	.LVL652
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL661
-	.8byte	.LVL663
+	.8byte	.LVL662
+	.8byte	.LVL664
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL666
-	.8byte	.LVL672
+	.8byte	.LVL667
+	.8byte	.LVL673
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL695
-	.8byte	.LVL698
+	.8byte	.LVL696
+	.8byte	.LVL699
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL700
 	.8byte	.LVL701
+	.8byte	.LVL702
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL702
 	.8byte	.LVL703
+	.8byte	.LVL704
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
@@ -49286,24 +49346,24 @@ __exitcall_ebc_exit:
 	.8byte	.LVL544
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL630
-	.8byte	.LVL653
+	.8byte	.LVL631
+	.8byte	.LVL654
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL660
-	.8byte	.LVL672
+	.8byte	.LVL661
+	.8byte	.LVL673
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL674
-	.8byte	.LVL679
+	.8byte	.LVL675
+	.8byte	.LVL680
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL695
-	.8byte	.LVL698
+	.8byte	.LVL696
+	.8byte	.LVL699
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL700
 	.8byte	.LVL701
+	.8byte	.LVL702
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
@@ -49313,24 +49373,24 @@ __exitcall_ebc_exit:
 	.8byte	.LVL543
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL621
-	.8byte	.LVL627
+	.8byte	.LVL622
+	.8byte	.LVL628
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL628
-	.8byte	.LVL631
+	.8byte	.LVL629
+	.8byte	.LVL632
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL640
-	.8byte	.LVL651
+	.8byte	.LVL641
+	.8byte	.LVL652
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL653
-	.8byte	.LVL661
+	.8byte	.LVL654
+	.8byte	.LVL662
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL700
-	.8byte	.LFE2850
+	.8byte	.LVL701
+	.8byte	.LFE2851
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
@@ -49340,20 +49400,20 @@ __exitcall_ebc_exit:
 	.8byte	.LVL544
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL623
-	.8byte	.LVL630
+	.8byte	.LVL624
+	.8byte	.LVL631
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL632
-	.8byte	.LVL660
+	.8byte	.LVL633
+	.8byte	.LVL661
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL674
-	.8byte	.LVL679
+	.8byte	.LVL675
+	.8byte	.LVL680
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL700
-	.8byte	.LFE2850
+	.8byte	.LVL701
+	.8byte	.LFE2851
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
@@ -49363,32 +49423,32 @@ __exitcall_ebc_exit:
 	.8byte	.LVL544
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL626
-	.8byte	.LVL653
+	.8byte	.LVL627
+	.8byte	.LVL654
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL656
-	.8byte	.LVL672
+	.8byte	.LVL657
+	.8byte	.LVL673
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL674
-	.8byte	.LVL679
+	.8byte	.LVL675
+	.8byte	.LVL680
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL695
-	.8byte	.LVL698
+	.8byte	.LVL696
+	.8byte	.LVL699
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL700
-	.8byte	.LVL703
+	.8byte	.LVL701
+	.8byte	.LVL704
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL703
 	.8byte	.LVL704
+	.8byte	.LVL705
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL704
-	.8byte	.LFE2850
+	.8byte	.LVL705
+	.8byte	.LFE2851
 	.2byte	0x1
 	.byte	0x6b
 	.8byte	0
@@ -49398,28 +49458,28 @@ __exitcall_ebc_exit:
 	.8byte	.LVL543
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL627
-	.8byte	.LVL653
+	.8byte	.LVL628
+	.8byte	.LVL654
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL661
-	.8byte	.LVL672
+	.8byte	.LVL662
+	.8byte	.LVL673
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL674
-	.8byte	.LVL679
+	.8byte	.LVL675
+	.8byte	.LVL680
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL695
 	.8byte	.LVL696
+	.8byte	.LVL697
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL696
-	.8byte	.LVL698
+	.8byte	.LVL697
+	.8byte	.LVL699
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL700
 	.8byte	.LVL701
+	.8byte	.LVL702
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
@@ -49429,16 +49489,16 @@ __exitcall_ebc_exit:
 	.8byte	.LVL542
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL636
-	.8byte	.LVL653
+	.8byte	.LVL637
+	.8byte	.LVL654
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL674
-	.8byte	.LVL676
+	.8byte	.LVL675
+	.8byte	.LVL677
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL700
 	.8byte	.LVL701
+	.8byte	.LVL702
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
@@ -49538,7 +49598,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL345
-	.8byte	.LFE2840
+	.8byte	.LFE2841
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
@@ -49568,7 +49628,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x66
 	.8byte	.LVL345
-	.8byte	.LFE2840
+	.8byte	.LFE2841
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
@@ -49580,7 +49640,7 @@ __exitcall_ebc_exit:
 	.byte	0x91
 	.sleb128 20
 	.8byte	.LVL348
-	.8byte	.LFE2840
+	.8byte	.LFE2841
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
@@ -49635,7 +49695,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL328
-	.8byte	.LFE2838
+	.8byte	.LFE2839
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
@@ -49806,7 +49866,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL256
-	.8byte	.LFE2831
+	.8byte	.LFE2832
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
@@ -50144,7 +50204,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL263
-	.8byte	.LFE2831
+	.8byte	.LFE2832
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -50178,7 +50238,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x53
 	.8byte	.LVL264
-	.8byte	.LFE2831
+	.8byte	.LFE2832
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
@@ -50429,417 +50489,417 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	0
 .LLST188:
-	.8byte	.LVL759
 	.8byte	.LVL760
+	.8byte	.LVL761
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST189:
-	.8byte	.LVL761
-	.8byte	.LVL795
+	.8byte	.LVL762
+	.8byte	.LVL796
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL798
-	.8byte	.LFE2826
+	.8byte	.LVL799
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST190:
-	.8byte	.LVL763
-	.8byte	.LVL789
+	.8byte	.LVL764
+	.8byte	.LVL790
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL789
 	.8byte	.LVL790
+	.8byte	.LVL791
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL790
-	.8byte	.LVL796
+	.8byte	.LVL791
+	.8byte	.LVL797
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL798
-	.8byte	.LVL805
+	.8byte	.LVL799
+	.8byte	.LVL806
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL805
 	.8byte	.LVL806
+	.8byte	.LVL807
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL806
-	.8byte	.LVL824
+	.8byte	.LVL807
+	.8byte	.LVL825
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL824
 	.8byte	.LVL825
+	.8byte	.LVL826
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL825
-	.8byte	.LVL836
+	.8byte	.LVL826
+	.8byte	.LVL837
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL836
 	.8byte	.LVL837
+	.8byte	.LVL838
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL837
-	.8byte	.LVL892
+	.8byte	.LVL838
+	.8byte	.LVL893
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL892
 	.8byte	.LVL893
+	.8byte	.LVL894
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL893
-	.8byte	.LFE2826
+	.8byte	.LVL894
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
 .LLST191:
-	.8byte	.LVL812
-	.8byte	.LVL814-1
+	.8byte	.LVL813
+	.8byte	.LVL815-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL823
 	.8byte	.LVL824
+	.8byte	.LVL825
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL825
-	.8byte	.LVL826-1
+	.8byte	.LVL826
+	.8byte	.LVL827-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL861
-	.8byte	.LVL862-1
+	.8byte	.LVL862
+	.8byte	.LVL863-1
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
 .LLST192:
-	.8byte	.LVL762
-	.8byte	.LVL796
+	.8byte	.LVL763
+	.8byte	.LVL797
 	.2byte	0x1
 	.byte	0x67
-	.8byte	.LVL798
-	.8byte	.LFE2826
+	.8byte	.LVL799
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x67
 	.8byte	0
 	.8byte	0
 .LLST193:
-	.8byte	.LVL763
-	.8byte	.LVL778
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL782
-	.8byte	.LVL785
+	.8byte	.LVL764
+	.8byte	.LVL779
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL789
-	.8byte	.LVL797
+	.8byte	.LVL783
+	.8byte	.LVL786
 	.2byte	0x1
 	.byte	0x6a
+	.8byte	.LVL790
 	.8byte	.LVL798
-	.8byte	.LVL879
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL883
-	.8byte	.LVL886
+	.8byte	.LVL799
+	.8byte	.LVL880
 	.2byte	0x1
 	.byte	0x6a
+	.8byte	.LVL884
 	.8byte	.LVL887
-	.8byte	.LVL903
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL909
-	.8byte	.LFE2826
+	.8byte	.LVL888
+	.8byte	.LVL904
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL910
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
 .LLST207:
-	.8byte	.LVL875
 	.8byte	.LVL876
+	.8byte	.LVL877
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL905
-	.8byte	.LVL906-1
+	.8byte	.LVL906
+	.8byte	.LVL907-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST206:
-	.8byte	.LVL867
 	.8byte	.LVL868
+	.8byte	.LVL869
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL898
-	.8byte	.LVL899-1
+	.8byte	.LVL899
+	.8byte	.LVL900-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST205:
-	.8byte	.LVL791
 	.8byte	.LVL792
+	.8byte	.LVL793
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL831
-	.8byte	.LVL832-1
+	.8byte	.LVL832
+	.8byte	.LVL833-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST194:
-	.8byte	.LVL793
 	.8byte	.LVL794
+	.8byte	.LVL795
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL800
-	.8byte	.LVL801-1
+	.8byte	.LVL801
+	.8byte	.LVL802-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST195:
-	.8byte	.LVL773
-	.8byte	.LVL789
+	.8byte	.LVL774
+	.8byte	.LVL790
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL879
-	.8byte	.LVL884-1
+	.8byte	.LVL880
+	.8byte	.LVL885-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL886
 	.8byte	.LVL887
+	.8byte	.LVL888
 	.2byte	0x1
 	.byte	0x61
 	.8byte	0
 	.8byte	0
 .LLST196:
-	.8byte	.LVL778
-	.8byte	.LVL781
+	.8byte	.LVL779
+	.8byte	.LVL782
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL786
-	.8byte	.LVL789
+	.8byte	.LVL787
+	.8byte	.LVL790
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL879
-	.8byte	.LVL881
+	.8byte	.LVL880
+	.8byte	.LVL882
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL886
 	.8byte	.LVL887
+	.8byte	.LVL888
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST197:
-	.8byte	.LVL763
-	.8byte	.LVL778
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL780
-	.8byte	.LVL785
+	.8byte	.LVL764
+	.8byte	.LVL779
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL789
-	.8byte	.LVL797
+	.8byte	.LVL781
+	.8byte	.LVL786
 	.2byte	0x1
 	.byte	0x6a
+	.8byte	.LVL790
 	.8byte	.LVL798
-	.8byte	.LVL813
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL815
-	.8byte	.LVL825
+	.8byte	.LVL799
+	.8byte	.LVL814
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL828
-	.8byte	.LVL861
+	.8byte	.LVL816
+	.8byte	.LVL826
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL870
-	.8byte	.LVL879
+	.8byte	.LVL829
+	.8byte	.LVL862
 	.2byte	0x1
 	.byte	0x6a
+	.8byte	.LVL871
 	.8byte	.LVL880
-	.8byte	.LVL886
 	.2byte	0x1
 	.byte	0x6a
+	.8byte	.LVL881
 	.8byte	.LVL887
-	.8byte	.LVL896
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL902
+	.8byte	.LVL888
+	.8byte	.LVL897
+	.2byte	0x1
+	.byte	0x6a
 	.8byte	.LVL903
+	.8byte	.LVL904
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL909
-	.8byte	.LFE2826
+	.8byte	.LVL910
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
 .LLST198:
-	.8byte	.LVL777
-	.8byte	.LVL779
+	.8byte	.LVL778
+	.8byte	.LVL780
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL780
-	.8byte	.LVL789
+	.8byte	.LVL781
+	.8byte	.LVL790
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL883
-	.8byte	.LVL884-1
+	.8byte	.LVL884
+	.8byte	.LVL885-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL886
 	.8byte	.LVL887
+	.8byte	.LVL888
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST199:
-	.8byte	.LVL763
-	.8byte	.LVL766
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL777
-	.8byte	.LVL787
+	.8byte	.LVL764
+	.8byte	.LVL767
 	.2byte	0x1
 	.byte	0x69
+	.8byte	.LVL778
 	.8byte	.LVL788
-	.8byte	.LVL797
 	.2byte	0x1
 	.byte	0x69
+	.8byte	.LVL789
 	.8byte	.LVL798
-	.8byte	.LVL804
 	.2byte	0x1
 	.byte	0x69
+	.8byte	.LVL799
 	.8byte	.LVL805
+	.2byte	0x1
+	.byte	0x69
 	.8byte	.LVL806
+	.8byte	.LVL807
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL808
-	.8byte	.LVL811
+	.8byte	.LVL809
+	.8byte	.LVL812
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL815
 	.8byte	.LVL816
+	.8byte	.LVL817
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL820
-	.8byte	.LVL822
+	.8byte	.LVL821
+	.8byte	.LVL823
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL824
 	.8byte	.LVL825
+	.8byte	.LVL826
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL828
-	.8byte	.LVL838
+	.8byte	.LVL829
+	.8byte	.LVL839
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL852
-	.8byte	.LVL855
+	.8byte	.LVL853
+	.8byte	.LVL856
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL879
-	.8byte	.LVL888
+	.8byte	.LVL880
+	.8byte	.LVL889
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL892
-	.8byte	.LVL896
+	.8byte	.LVL893
+	.8byte	.LVL897
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL909
-	.8byte	.LVL912
+	.8byte	.LVL910
+	.8byte	.LVL913
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL914
-	.8byte	.LFE2826
+	.8byte	.LVL915
+	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
 .LLST200:
-	.8byte	.LVL777
 	.8byte	.LVL778
+	.8byte	.LVL779
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL781
-	.8byte	.LVL783
+	.8byte	.LVL782
+	.8byte	.LVL784
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL783
 	.8byte	.LVL784
+	.8byte	.LVL785
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL882
-	.8byte	.LVL884-1
+	.8byte	.LVL883
+	.8byte	.LVL885-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST201:
-	.8byte	.LVL776
-	.8byte	.LVL789
+	.8byte	.LVL777
+	.8byte	.LVL790
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL879
-	.8byte	.LVL884-1
+	.8byte	.LVL880
+	.8byte	.LVL885-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL886
 	.8byte	.LVL887
+	.8byte	.LVL888
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST202:
-	.8byte	.LVL774
-	.8byte	.LVL789
+	.8byte	.LVL775
+	.8byte	.LVL790
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL879
-	.8byte	.LVL884-1
+	.8byte	.LVL880
+	.8byte	.LVL885-1
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL886
 	.8byte	.LVL887
+	.8byte	.LVL888
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
 .LLST203:
-	.8byte	.LVL776
-	.8byte	.LVL789
+	.8byte	.LVL777
+	.8byte	.LVL790
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL879
-	.8byte	.LVL884-1
+	.8byte	.LVL880
+	.8byte	.LVL885-1
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL886
 	.8byte	.LVL887
+	.8byte	.LVL888
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
 .LLST204:
-	.8byte	.LVL775
-	.8byte	.LVL789
+	.8byte	.LVL776
+	.8byte	.LVL790
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL879
-	.8byte	.LVL884-1
+	.8byte	.LVL880
+	.8byte	.LVL885-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL886
 	.8byte	.LVL887
+	.8byte	.LVL888
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
@@ -50854,7 +50914,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL285
-	.8byte	.LFE2824
+	.8byte	.LFE2825
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
@@ -50876,7 +50936,7 @@ __exitcall_ebc_exit:
 	.byte	0x71
 	.sleb128 -12
 	.8byte	.LVL289
-	.8byte	.LFE2824
+	.8byte	.LFE2825
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
@@ -50950,7 +51010,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x56
 	.8byte	.LVL60
-	.8byte	.LFE2812
+	.8byte	.LFE2813
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
@@ -50973,7 +51033,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x55
 	.8byte	.LVL50
-	.8byte	.LFE2812
+	.8byte	.LFE2813
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
@@ -50984,7 +51044,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	.LVL61
-	.8byte	.LFE2812
+	.8byte	.LFE2813
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
@@ -50999,7 +51059,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x58
 	.8byte	.LVL50
-	.8byte	.LFE2812
+	.8byte	.LFE2813
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
@@ -51099,136 +51159,136 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	0
 .LLST185:
-	.8byte	.LVL747
-	.8byte	.LVL749
+	.8byte	.LVL748
+	.8byte	.LVL750
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST186:
-	.8byte	.LVL748
-	.8byte	.LVL751
+	.8byte	.LVL749
+	.8byte	.LVL752
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
 .LLST187:
-	.8byte	.LVL751
-	.8byte	.LVL754
+	.8byte	.LVL752
+	.8byte	.LVL755
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL755
-	.8byte	.LVL758
+	.8byte	.LVL756
+	.8byte	.LVL759
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
 .LLST181:
-	.8byte	.LVL736
-	.8byte	.LVL741
+	.8byte	.LVL737
+	.8byte	.LVL742
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL746
-	.8byte	.LFE2808
+	.8byte	.LVL747
+	.8byte	.LFE2809
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST182:
-	.8byte	.LVL742
 	.8byte	.LVL743
+	.8byte	.LVL744
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST183:
-	.8byte	.LVL740
-	.8byte	.LVL744
+	.8byte	.LVL741
+	.8byte	.LVL745
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST184:
-	.8byte	.LVL743
-	.8byte	.LVL745
+	.8byte	.LVL744
+	.8byte	.LVL746
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST175:
-	.8byte	.LVL714
-	.8byte	.LVL720
+	.8byte	.LVL715
+	.8byte	.LVL721
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL724
 	.8byte	.LVL725
+	.8byte	.LVL726
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL734
 	.8byte	.LVL735
+	.8byte	.LVL736
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST176:
-	.8byte	.LVL714
 	.8byte	.LVL715
+	.8byte	.LVL716
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST177:
-	.8byte	.LVL720
-	.8byte	.LVL723
+	.8byte	.LVL721
+	.8byte	.LVL724
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL727
-	.8byte	.LVL732
+	.8byte	.LVL728
+	.8byte	.LVL733
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL735
-	.8byte	.LFE2807
+	.8byte	.LVL736
+	.8byte	.LFE2808
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST178:
-	.8byte	.LVL719
 	.8byte	.LVL720
+	.8byte	.LVL721
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL722
-	.8byte	.LVL726
+	.8byte	.LVL723
+	.8byte	.LVL727
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL731
-	.8byte	.LVL735
+	.8byte	.LVL732
+	.8byte	.LVL736
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
 .LLST179:
-	.8byte	.LVL719
-	.8byte	.LVL721
+	.8byte	.LVL720
+	.8byte	.LVL722
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL722
-	.8byte	.LVL730
+	.8byte	.LVL723
+	.8byte	.LVL731
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL733
-	.8byte	.LFE2807
+	.8byte	.LVL734
+	.8byte	.LFE2808
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST180:
-	.8byte	.LVL719
-	.8byte	.LVL728
+	.8byte	.LVL720
+	.8byte	.LVL729
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL729
-	.8byte	.LFE2807
+	.8byte	.LVL730
+	.8byte	.LFE2808
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
@@ -51250,7 +51310,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x51
 	.8byte	.LVL397
-	.8byte	.LFE2815
+	.8byte	.LFE2816
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
@@ -51265,7 +51325,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x52
 	.8byte	.LVL397
-	.8byte	.LFE2815
+	.8byte	.LFE2816
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
@@ -51287,7 +51347,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	.LVL398
-	.8byte	.LFE2815
+	.8byte	.LFE2816
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
@@ -51298,7 +51358,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x60
 	.8byte	.LVL398
-	.8byte	.LFE2815
+	.8byte	.LFE2816
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
@@ -51309,7 +51369,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	.LVL398
-	.8byte	.LFE2815
+	.8byte	.LFE2816
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
@@ -51335,7 +51395,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	.LVL398
-	.8byte	.LFE2815
+	.8byte	.LFE2816
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
@@ -51353,7 +51413,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x57
 	.8byte	.LVL398
-	.8byte	.LFE2815
+	.8byte	.LFE2816
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
@@ -51390,7 +51450,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x54
 	.8byte	.LVL396
-	.8byte	.LFE2815
+	.8byte	.LFE2816
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
@@ -51449,7 +51509,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x52
 	.8byte	.LVL448
-	.8byte	.LFE2818
+	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
@@ -51468,7 +51528,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x51
 	.8byte	.LVL448
-	.8byte	.LFE2818
+	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
@@ -51479,7 +51539,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x58
 	.8byte	.LVL428
-	.8byte	.LFE2818
+	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
@@ -51490,7 +51550,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x59
 	.8byte	.LVL427
-	.8byte	.LFE2818
+	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
@@ -51520,7 +51580,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	.LVL425
-	.8byte	.LFE2818
+	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
@@ -51531,7 +51591,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	.LVL426
-	.8byte	.LFE2818
+	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
@@ -51542,7 +51602,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	.LVL429
-	.8byte	.LFE2818
+	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
@@ -51560,7 +51620,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x57
 	.8byte	.LVL424
-	.8byte	.LFE2818
+	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
@@ -51575,7 +51635,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x56
 	.8byte	.LVL445
-	.8byte	.LFE2818
+	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
@@ -51598,7 +51658,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x62
 	.8byte	.LVL447
-	.8byte	.LFE2818
+	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
@@ -51621,7 +51681,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x62
 	.8byte	.LVL447
-	.8byte	.LFE2818
+	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
@@ -51644,7 +51704,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x62
 	.8byte	.LVL447
-	.8byte	.LFE2818
+	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
@@ -51731,7 +51791,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL460
-	.8byte	.LFE2863
+	.8byte	.LFE2864
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
@@ -51759,16 +51819,16 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	0
 .LLST174:
-	.8byte	.LVL706
 	.8byte	.LVL707
+	.8byte	.LVL708
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL707
-	.8byte	.LVL711
+	.8byte	.LVL708
+	.8byte	.LVL712
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL712
-	.8byte	.LFE2869
+	.8byte	.LVL713
+	.8byte	.LFE2870
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -51783,664 +51843,658 @@ __exitcall_ebc_exit:
 	.2byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0-.Ltext0
+	.8byte	.LFB2856
+	.8byte	.LFE2856-.LFB2856
 	.8byte	.LFB2855
 	.8byte	.LFE2855-.LFB2855
-	.8byte	.LFB2854
-	.8byte	.LFE2854-.LFB2854
 	.8byte	0
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
 .Ldebug_ranges0:
+	.8byte	.LBB938
+	.8byte	.LBE938
+	.8byte	.LBB941
+	.8byte	.LBE941
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB942
 	.8byte	.LBE942
+	.8byte	.LBB973
+	.8byte	.LBE973
+	.8byte	.LBB974
+	.8byte	.LBE974
+	.8byte	.LBB1039
+	.8byte	.LBE1039
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB945
 	.8byte	.LBE945
+	.8byte	.LBB957
+	.8byte	.LBE957
+	.8byte	.LBB958
+	.8byte	.LBE958
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB961
+	.8byte	.LBE961
+	.8byte	.LBB966
+	.8byte	.LBE966
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB975
+	.8byte	.LBE975
+	.8byte	.LBB1196
+	.8byte	.LBE1196
+	.8byte	.LBB1197
+	.8byte	.LBE1197
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB946
-	.8byte	.LBE946
-	.8byte	.LBB977
-	.8byte	.LBE977
 	.8byte	.LBB978
 	.8byte	.LBE978
-	.8byte	.LBB1043
-	.8byte	.LBE1043
+	.8byte	.LBB998
+	.8byte	.LBE998
+	.8byte	.LBB999
+	.8byte	.LBE999
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB949
-	.8byte	.LBE949
-	.8byte	.LBB961
-	.8byte	.LBE961
-	.8byte	.LBB962
-	.8byte	.LBE962
+	.8byte	.LBB992
+	.8byte	.LBE992
+	.8byte	.LBB997
+	.8byte	.LBE997
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB965
-	.8byte	.LBE965
-	.8byte	.LBB970
-	.8byte	.LBE970
+	.8byte	.LBB1004
+	.8byte	.LBE1004
+	.8byte	.LBB1207
+	.8byte	.LBE1207
+	.8byte	.LBB1209
+	.8byte	.LBE1209
+	.8byte	.LBB1210
+	.8byte	.LBE1210
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB979
-	.8byte	.LBE979
-	.8byte	.LBB1200
-	.8byte	.LBE1200
-	.8byte	.LBB1201
-	.8byte	.LBE1201
+	.8byte	.LBB1010
+	.8byte	.LBE1010
+	.8byte	.LBB1194
+	.8byte	.LBE1194
+	.8byte	.LBB1195
+	.8byte	.LBE1195
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB982
-	.8byte	.LBE982
-	.8byte	.LBB1002
-	.8byte	.LBE1002
-	.8byte	.LBB1003
-	.8byte	.LBE1003
+	.8byte	.LBB1013
+	.8byte	.LBE1013
+	.8byte	.LBB1033
+	.8byte	.LBE1033
+	.8byte	.LBB1034
+	.8byte	.LBE1034
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB996
-	.8byte	.LBE996
-	.8byte	.LBB1001
-	.8byte	.LBE1001
+	.8byte	.LBB1027
+	.8byte	.LBE1027
+	.8byte	.LBB1032
+	.8byte	.LBE1032
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1008
-	.8byte	.LBE1008
-	.8byte	.LBB1211
-	.8byte	.LBE1211
-	.8byte	.LBB1213
-	.8byte	.LBE1213
-	.8byte	.LBB1214
-	.8byte	.LBE1214
+	.8byte	.LBB1040
+	.8byte	.LBE1040
+	.8byte	.LBB1073
+	.8byte	.LBE1073
+	.8byte	.LBB1204
+	.8byte	.LBE1204
+	.8byte	.LBB1205
+	.8byte	.LBE1205
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1014
-	.8byte	.LBE1014
-	.8byte	.LBB1198
-	.8byte	.LBE1198
-	.8byte	.LBB1199
-	.8byte	.LBE1199
+	.8byte	.LBB1043
+	.8byte	.LBE1043
+	.8byte	.LBB1056
+	.8byte	.LBE1056
+	.8byte	.LBB1065
+	.8byte	.LBE1065
+	.8byte	.LBB1066
+	.8byte	.LBE1066
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1017
-	.8byte	.LBE1017
-	.8byte	.LBB1037
-	.8byte	.LBE1037
-	.8byte	.LBB1038
-	.8byte	.LBE1038
+	.8byte	.LBB1059
+	.8byte	.LBE1059
+	.8byte	.LBB1064
+	.8byte	.LBE1064
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1031
-	.8byte	.LBE1031
-	.8byte	.LBB1036
-	.8byte	.LBE1036
+	.8byte	.LBB1074
+	.8byte	.LBE1074
+	.8byte	.LBB1109
+	.8byte	.LBE1109
+	.8byte	.LBB1200
+	.8byte	.LBE1200
+	.8byte	.LBB1201
+	.8byte	.LBE1201
+	.8byte	.LBB1211
+	.8byte	.LBE1211
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1044
-	.8byte	.LBE1044
 	.8byte	.LBB1077
 	.8byte	.LBE1077
-	.8byte	.LBB1208
-	.8byte	.LBE1208
-	.8byte	.LBB1209
-	.8byte	.LBE1209
+	.8byte	.LBB1090
+	.8byte	.LBE1090
+	.8byte	.LBB1099
+	.8byte	.LBE1099
+	.8byte	.LBB1100
+	.8byte	.LBE1100
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1047
-	.8byte	.LBE1047
-	.8byte	.LBB1060
-	.8byte	.LBE1060
-	.8byte	.LBB1069
-	.8byte	.LBE1069
-	.8byte	.LBB1070
-	.8byte	.LBE1070
+	.8byte	.LBB1093
+	.8byte	.LBE1093
+	.8byte	.LBB1098
+	.8byte	.LBE1098
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1063
-	.8byte	.LBE1063
-	.8byte	.LBB1068
-	.8byte	.LBE1068
+	.8byte	.LBB1110
+	.8byte	.LBE1110
+	.8byte	.LBB1121
+	.8byte	.LBE1121
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1078
-	.8byte	.LBE1078
 	.8byte	.LBB1113
 	.8byte	.LBE1113
-	.8byte	.LBB1204
-	.8byte	.LBE1204
-	.8byte	.LBB1205
-	.8byte	.LBE1205
-	.8byte	.LBB1215
-	.8byte	.LBE1215
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1081
-	.8byte	.LBE1081
-	.8byte	.LBB1094
-	.8byte	.LBE1094
-	.8byte	.LBB1103
-	.8byte	.LBE1103
-	.8byte	.LBB1104
-	.8byte	.LBE1104
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1097
-	.8byte	.LBE1097
-	.8byte	.LBB1102
-	.8byte	.LBE1102
+	.8byte	.LBB1118
+	.8byte	.LBE1118
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1114
 	.8byte	.LBE1114
-	.8byte	.LBB1125
-	.8byte	.LBE1125
-	.8byte	0
-	.8byte	0
 	.8byte	.LBB1117
 	.8byte	.LBE1117
-	.8byte	.LBB1122
-	.8byte	.LBE1122
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1118
-	.8byte	.LBE1118
-	.8byte	.LBB1121
-	.8byte	.LBE1121
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1126
-	.8byte	.LBE1126
-	.8byte	.LBB1161
-	.8byte	.LBE1161
-	.8byte	.LBB1202
-	.8byte	.LBE1202
-	.8byte	.LBB1203
-	.8byte	.LBE1203
-	.8byte	.LBB1210
-	.8byte	.LBE1210
+	.8byte	.LBB1122
+	.8byte	.LBE1122
+	.8byte	.LBB1157
+	.8byte	.LBE1157
+	.8byte	.LBB1198
+	.8byte	.LBE1198
+	.8byte	.LBB1199
+	.8byte	.LBE1199
+	.8byte	.LBB1206
+	.8byte	.LBE1206
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1125
+	.8byte	.LBE1125
+	.8byte	.LBB1138
+	.8byte	.LBE1138
+	.8byte	.LBB1139
+	.8byte	.LBE1139
+	.8byte	.LBB1140
+	.8byte	.LBE1140
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1129
-	.8byte	.LBE1129
-	.8byte	.LBB1142
-	.8byte	.LBE1142
 	.8byte	.LBB1143
 	.8byte	.LBE1143
-	.8byte	.LBB1144
-	.8byte	.LBE1144
+	.8byte	.LBB1148
+	.8byte	.LBE1148
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1147
-	.8byte	.LBE1147
-	.8byte	.LBB1152
-	.8byte	.LBE1152
+	.8byte	.LBB1158
+	.8byte	.LBE1158
+	.8byte	.LBB1193
+	.8byte	.LBE1193
+	.8byte	.LBB1202
+	.8byte	.LBE1202
+	.8byte	.LBB1203
+	.8byte	.LBE1203
+	.8byte	.LBB1208
+	.8byte	.LBE1208
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1162
-	.8byte	.LBE1162
-	.8byte	.LBB1197
-	.8byte	.LBE1197
-	.8byte	.LBB1206
-	.8byte	.LBE1206
-	.8byte	.LBB1207
-	.8byte	.LBE1207
-	.8byte	.LBB1212
-	.8byte	.LBE1212
+	.8byte	.LBB1161
+	.8byte	.LBE1161
+	.8byte	.LBB1174
+	.8byte	.LBE1174
+	.8byte	.LBB1175
+	.8byte	.LBE1175
+	.8byte	.LBB1176
+	.8byte	.LBE1176
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1165
-	.8byte	.LBE1165
-	.8byte	.LBB1178
-	.8byte	.LBE1178
 	.8byte	.LBB1179
 	.8byte	.LBE1179
-	.8byte	.LBB1180
-	.8byte	.LBE1180
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1183
-	.8byte	.LBE1183
-	.8byte	.LBB1188
-	.8byte	.LBE1188
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1220
-	.8byte	.LBE1220
-	.8byte	.LBB1223
-	.8byte	.LBE1223
+	.8byte	.LBB1184
+	.8byte	.LBE1184
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1244
-	.8byte	.LBE1244
-	.8byte	.LBB1250
-	.8byte	.LBE1250
+	.8byte	.LBB1216
+	.8byte	.LBE1216
+	.8byte	.LBB1219
+	.8byte	.LBE1219
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1240
+	.8byte	.LBE1240
+	.8byte	.LBB1246
+	.8byte	.LBE1246
+	.8byte	.LBB1252
+	.8byte	.LBE1252
+	.8byte	.LBB1254
+	.8byte	.LBE1254
 	.8byte	.LBB1256
 	.8byte	.LBE1256
-	.8byte	.LBB1258
-	.8byte	.LBE1258
-	.8byte	.LBB1260
-	.8byte	.LBE1260
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1251
-	.8byte	.LBE1251
+	.8byte	.LBB1247
+	.8byte	.LBE1247
+	.8byte	.LBB1253
+	.8byte	.LBE1253
+	.8byte	.LBB1255
+	.8byte	.LBE1255
 	.8byte	.LBB1257
 	.8byte	.LBE1257
-	.8byte	.LBB1259
-	.8byte	.LBE1259
-	.8byte	.LBB1261
-	.8byte	.LBE1261
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1262
-	.8byte	.LBE1262
-	.8byte	.LBB1309
-	.8byte	.LBE1309
-	.8byte	.LBB1310
-	.8byte	.LBE1310
+	.8byte	.LBB1258
+	.8byte	.LBE1258
+	.8byte	.LBB1305
+	.8byte	.LBE1305
+	.8byte	.LBB1306
+	.8byte	.LBE1306
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1265
-	.8byte	.LBE1265
+	.8byte	.LBB1261
+	.8byte	.LBE1261
+	.8byte	.LBB1273
+	.8byte	.LBE1273
+	.8byte	.LBB1275
+	.8byte	.LBE1275
 	.8byte	.LBB1277
 	.8byte	.LBE1277
-	.8byte	.LBB1279
-	.8byte	.LBE1279
-	.8byte	.LBB1281
-	.8byte	.LBE1281
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1270
-	.8byte	.LBE1270
-	.8byte	.LBB1278
-	.8byte	.LBE1278
-	.8byte	.LBB1280
-	.8byte	.LBE1280
+	.8byte	.LBB1266
+	.8byte	.LBE1266
+	.8byte	.LBB1274
+	.8byte	.LBE1274
+	.8byte	.LBB1276
+	.8byte	.LBE1276
+	.8byte	.LBB1285
+	.8byte	.LBE1285
+	.8byte	.LBB1287
+	.8byte	.LBE1287
 	.8byte	.LBB1289
 	.8byte	.LBE1289
-	.8byte	.LBB1291
-	.8byte	.LBE1291
-	.8byte	.LBB1293
-	.8byte	.LBE1293
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1282
-	.8byte	.LBE1282
-	.8byte	.LBB1290
-	.8byte	.LBE1290
-	.8byte	.LBB1292
-	.8byte	.LBE1292
+	.8byte	.LBB1278
+	.8byte	.LBE1278
+	.8byte	.LBB1286
+	.8byte	.LBE1286
+	.8byte	.LBB1288
+	.8byte	.LBE1288
+	.8byte	.LBB1295
+	.8byte	.LBE1295
+	.8byte	.LBB1297
+	.8byte	.LBE1297
 	.8byte	.LBB1299
 	.8byte	.LBE1299
-	.8byte	.LBB1301
-	.8byte	.LBE1301
-	.8byte	.LBB1303
-	.8byte	.LBE1303
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1294
-	.8byte	.LBE1294
+	.8byte	.LBB1290
+	.8byte	.LBE1290
+	.8byte	.LBB1296
+	.8byte	.LBE1296
+	.8byte	.LBB1298
+	.8byte	.LBE1298
 	.8byte	.LBB1300
 	.8byte	.LBE1300
-	.8byte	.LBB1302
-	.8byte	.LBE1302
-	.8byte	.LBB1304
-	.8byte	.LBE1304
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1329
-	.8byte	.LBE1329
-	.8byte	.LBB1368
-	.8byte	.LBE1368
+	.8byte	.LBB1325
+	.8byte	.LBE1325
+	.8byte	.LBB1364
+	.8byte	.LBE1364
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1332
-	.8byte	.LBE1332
-	.8byte	.LBB1341
-	.8byte	.LBE1341
+	.8byte	.LBB1328
+	.8byte	.LBE1328
+	.8byte	.LBB1337
+	.8byte	.LBE1337
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1346
-	.8byte	.LBE1346
+	.8byte	.LBB1342
+	.8byte	.LBE1342
+	.8byte	.LBB1355
+	.8byte	.LBE1355
+	.8byte	.LBB1357
+	.8byte	.LBE1357
 	.8byte	.LBB1359
 	.8byte	.LBE1359
 	.8byte	.LBB1361
 	.8byte	.LBE1361
 	.8byte	.LBB1363
 	.8byte	.LBE1363
-	.8byte	.LBB1365
-	.8byte	.LBE1365
-	.8byte	.LBB1367
-	.8byte	.LBE1367
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1353
-	.8byte	.LBE1353
+	.8byte	.LBB1349
+	.8byte	.LBE1349
+	.8byte	.LBB1356
+	.8byte	.LBE1356
+	.8byte	.LBB1358
+	.8byte	.LBE1358
 	.8byte	.LBB1360
 	.8byte	.LBE1360
 	.8byte	.LBB1362
 	.8byte	.LBE1362
-	.8byte	.LBB1364
-	.8byte	.LBE1364
-	.8byte	.LBB1366
-	.8byte	.LBE1366
-	.8byte	0
 	.8byte	0
-	.8byte	.LBB1369
-	.8byte	.LBE1369
-	.8byte	.LBB1378
-	.8byte	.LBE1378
-	.8byte	.LBB1379
-	.8byte	.LBE1379
-	.8byte	.LBB1390
-	.8byte	.LBE1390
 	.8byte	0
-	.8byte	0
-	.8byte	.LBB1371
-	.8byte	.LBE1371
+	.8byte	.LBB1365
+	.8byte	.LBE1365
 	.8byte	.LBB1374
 	.8byte	.LBE1374
+	.8byte	.LBB1375
+	.8byte	.LBE1375
+	.8byte	.LBB1386
+	.8byte	.LBE1386
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1367
+	.8byte	.LBE1367
+	.8byte	.LBB1370
+	.8byte	.LBE1370
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1376
+	.8byte	.LBE1376
 	.8byte	.LBB1380
 	.8byte	.LBE1380
-	.8byte	.LBB1384
-	.8byte	.LBE1384
-	.8byte	.LBB1385
-	.8byte	.LBE1385
+	.8byte	.LBB1381
+	.8byte	.LBE1381
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1399
-	.8byte	.LBE1399
-	.8byte	.LBB1406
-	.8byte	.LBE1406
+	.8byte	.LBB1395
+	.8byte	.LBE1395
+	.8byte	.LBB1402
+	.8byte	.LBE1402
+	.8byte	.LBB1403
+	.8byte	.LBE1403
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1396
+	.8byte	.LBE1396
+	.8byte	.LBB1401
+	.8byte	.LBE1401
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1404
+	.8byte	.LBE1404
 	.8byte	.LBB1407
 	.8byte	.LBE1407
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1400
-	.8byte	.LBE1400
-	.8byte	.LBB1405
-	.8byte	.LBE1405
+	.8byte	.LBB1570
+	.8byte	.LBE1570
+	.8byte	.LBB1573
+	.8byte	.LBE1573
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1408
-	.8byte	.LBE1408
-	.8byte	.LBB1415
-	.8byte	.LBE1415
+	.8byte	.LBB1580
+	.8byte	.LBE1580
+	.8byte	.LBB1654
+	.8byte	.LBE1654
+	.8byte	.LBB1655
+	.8byte	.LBE1655
+	.8byte	.LBB1656
+	.8byte	.LBE1656
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1410
-	.8byte	.LBE1410
-	.8byte	.LBB1413
-	.8byte	.LBE1413
+	.8byte	.LBB1582
+	.8byte	.LBE1582
+	.8byte	.LBB1591
+	.8byte	.LBE1591
+	.8byte	.LBB1592
+	.8byte	.LBE1592
+	.8byte	.LBB1593
+	.8byte	.LBE1593
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1578
-	.8byte	.LBE1578
-	.8byte	.LBB1581
-	.8byte	.LBE1581
+	.8byte	.LBB1657
+	.8byte	.LBE1657
+	.8byte	.LBB1682
+	.8byte	.LBE1682
+	.8byte	.LBB1683
+	.8byte	.LBE1683
+	.8byte	.LBB1694
+	.8byte	.LBE1694
+	.8byte	.LBB1745
+	.8byte	.LBE1745
+	.8byte	.LBB1750
+	.8byte	.LBE1750
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1588
-	.8byte	.LBE1588
+	.8byte	.LBB1659
+	.8byte	.LBE1659
 	.8byte	.LBB1662
 	.8byte	.LBE1662
-	.8byte	.LBB1663
-	.8byte	.LBE1663
-	.8byte	.LBB1664
-	.8byte	.LBE1664
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1590
-	.8byte	.LBE1590
-	.8byte	.LBB1599
-	.8byte	.LBE1599
-	.8byte	.LBB1600
-	.8byte	.LBE1600
-	.8byte	.LBB1601
-	.8byte	.LBE1601
+	.8byte	.LBB1663
+	.8byte	.LBE1663
+	.8byte	.LBB1668
+	.8byte	.LBE1668
+	.8byte	.LBB1669
+	.8byte	.LBE1669
+	.8byte	.LBB1670
+	.8byte	.LBE1670
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1665
-	.8byte	.LBE1665
-	.8byte	.LBB1690
-	.8byte	.LBE1690
-	.8byte	.LBB1691
-	.8byte	.LBE1691
-	.8byte	.LBB1702
-	.8byte	.LBE1702
+	.8byte	.LBB1684
+	.8byte	.LBE1684
+	.8byte	.LBB1695
+	.8byte	.LBE1695
+	.8byte	.LBB1747
+	.8byte	.LBE1747
+	.8byte	.LBB1751
+	.8byte	.LBE1751
 	.8byte	.LBB1753
 	.8byte	.LBE1753
-	.8byte	.LBB1758
-	.8byte	.LBE1758
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1667
-	.8byte	.LBE1667
-	.8byte	.LBB1670
-	.8byte	.LBE1670
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1671
-	.8byte	.LBE1671
-	.8byte	.LBB1676
-	.8byte	.LBE1676
-	.8byte	.LBB1677
-	.8byte	.LBE1677
-	.8byte	.LBB1678
-	.8byte	.LBE1678
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1692
-	.8byte	.LBE1692
-	.8byte	.LBB1703
-	.8byte	.LBE1703
-	.8byte	.LBB1755
-	.8byte	.LBE1755
-	.8byte	.LBB1759
-	.8byte	.LBE1759
-	.8byte	.LBB1761
-	.8byte	.LBE1761
+	.8byte	.LBB1686
+	.8byte	.LBE1686
+	.8byte	.LBB1689
+	.8byte	.LBE1689
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1694
-	.8byte	.LBE1694
-	.8byte	.LBB1697
-	.8byte	.LBE1697
+	.8byte	.LBB1696
+	.8byte	.LBE1696
+	.8byte	.LBB1748
+	.8byte	.LBE1748
+	.8byte	.LBB1749
+	.8byte	.LBE1749
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1698
+	.8byte	.LBE1698
 	.8byte	.LBB1704
 	.8byte	.LBE1704
-	.8byte	.LBB1756
-	.8byte	.LBE1756
-	.8byte	.LBB1757
-	.8byte	.LBE1757
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1706
-	.8byte	.LBE1706
-	.8byte	.LBB1712
-	.8byte	.LBE1712
+	.8byte	.LBB1707
+	.8byte	.LBE1707
+	.8byte	.LBB1708
+	.8byte	.LBE1708
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1715
 	.8byte	.LBE1715
-	.8byte	.LBB1716
-	.8byte	.LBE1716
-	.8byte	0
-	.8byte	0
+	.8byte	.LBB1721
+	.8byte	.LBE1721
+	.8byte	.LBB1722
+	.8byte	.LBE1722
 	.8byte	.LBB1723
 	.8byte	.LBE1723
-	.8byte	.LBB1729
-	.8byte	.LBE1729
-	.8byte	.LBB1730
-	.8byte	.LBE1730
-	.8byte	.LBB1731
-	.8byte	.LBE1731
-	.8byte	.LBB1732
-	.8byte	.LBE1732
+	.8byte	.LBB1724
+	.8byte	.LBE1724
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1733
-	.8byte	.LBE1733
+	.8byte	.LBB1725
+	.8byte	.LBE1725
+	.8byte	.LBB1744
+	.8byte	.LBE1744
+	.8byte	.LBB1746
+	.8byte	.LBE1746
 	.8byte	.LBB1752
 	.8byte	.LBE1752
 	.8byte	.LBB1754
 	.8byte	.LBE1754
-	.8byte	.LBB1760
-	.8byte	.LBE1760
-	.8byte	.LBB1762
-	.8byte	.LBE1762
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1783
+	.8byte	.LBE1783
+	.8byte	.LBB1790
+	.8byte	.LBE1790
+	.8byte	.LBB1799
+	.8byte	.LBE1799
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1785
+	.8byte	.LBE1785
+	.8byte	.LBB1786
+	.8byte	.LBE1786
+	.8byte	.LBB1787
+	.8byte	.LBE1787
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1791
 	.8byte	.LBE1791
+	.8byte	.LBB1797
+	.8byte	.LBE1797
 	.8byte	.LBB1798
 	.8byte	.LBE1798
-	.8byte	.LBB1807
-	.8byte	.LBE1807
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1793
-	.8byte	.LBE1793
-	.8byte	.LBB1794
-	.8byte	.LBE1794
-	.8byte	.LBB1795
-	.8byte	.LBE1795
+	.8byte	.LBB1819
+	.8byte	.LBE1819
+	.8byte	.LBB1820
+	.8byte	.LBE1820
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1799
-	.8byte	.LBE1799
+	.8byte	.LBB1800
+	.8byte	.LBE1800
+	.8byte	.LBB1804
+	.8byte	.LBE1804
 	.8byte	.LBB1805
 	.8byte	.LBE1805
-	.8byte	.LBB1806
-	.8byte	.LBE1806
-	.8byte	.LBB1827
-	.8byte	.LBE1827
-	.8byte	.LBB1828
-	.8byte	.LBE1828
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1808
-	.8byte	.LBE1808
-	.8byte	.LBB1812
-	.8byte	.LBE1812
-	.8byte	.LBB1813
-	.8byte	.LBE1813
+	.8byte	.LBB1811
+	.8byte	.LBE1811
+	.8byte	.LBB1821
+	.8byte	.LBE1821
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1819
-	.8byte	.LBE1819
-	.8byte	.LBB1829
-	.8byte	.LBE1829
+	.8byte	.LBB1813
+	.8byte	.LBE1813
+	.8byte	.LBB1814
+	.8byte	.LBE1814
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1821
-	.8byte	.LBE1821
+	.8byte	.LBB1815
+	.8byte	.LBE1815
 	.8byte	.LBB1822
 	.8byte	.LBE1822
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1823
-	.8byte	.LBE1823
-	.8byte	.LBB1830
-	.8byte	.LBE1830
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1825
-	.8byte	.LBE1825
-	.8byte	.LBB1826
-	.8byte	.LBE1826
+	.8byte	.LBB1817
+	.8byte	.LBE1817
+	.8byte	.LBB1818
+	.8byte	.LBE1818
 	.8byte	0
 	.8byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0
+	.8byte	.LFB2856
+	.8byte	.LFE2856
 	.8byte	.LFB2855
 	.8byte	.LFE2855
-	.8byte	.LFB2854
-	.8byte	.LFE2854
 	.8byte	0
 	.8byte	0
 	.section	.debug_line,"",@progbits
 .Ldebug_line0:
 	.section	.debug_str,"MS",@progbits,1
-.LASF911:
+.LASF925:
 	.string	"sival_int"
-.LASF2626:
+.LASF2640:
 	.string	"PE_SIZE_PTE"
-.LASF2369:
+.LASF2383:
 	.string	"device_attribute"
 .LASF170:
 	.string	"line"
-.LASF1853:
+.LASF1867:
 	.string	"link"
 .LASF661:
 	.string	"start_time"
-.LASF2101:
+.LASF2115:
 	.string	"kernfs_node"
-.LASF2245:
+.LASF2259:
 	.string	"RPM_REQ_IDLE"
-.LASF2381:
+.LASF2395:
 	.string	"suppliers"
-.LASF3050:
+.LASF3065:
 	.string	"ebc_buffer_manage_init"
-.LASF2880:
+.LASF2894:
 	.string	"EPD_FULL_GCC16"
 .LASF38:
 	.string	"dev_t"
-.LASF1973:
+.LASF1987:
 	.string	"show_options2"
-.LASF2628:
+.LASF2642:
 	.string	"PE_SIZE_PUD"
-.LASF2591:
+.LASF2605:
 	.string	"__tracepoint_page_ref_mod"
-.LASF2975:
+.LASF2989:
 	.string	"full_mode_num"
-.LASF1043:
+.LASF1057:
 	.string	"nr_wakeups"
-.LASF1881:
+.LASF1895:
 	.string	"start"
-.LASF1339:
+.LASF1353:
 	.string	"start_brk"
 .LASF100:
 	.string	"read"
-.LASF1680:
+.LASF1694:
 	.string	"d_ino_softlimit"
-.LASF1969:
+.LASF1983:
 	.string	"copy_mnt_data"
-.LASF1780:
+.LASF1794:
 	.string	"WRITE_LIFE_LONG"
-.LASF2315:
+.LASF2329:
 	.string	"dev_pm_qos"
-.LASF1202:
+.LASF1216:
 	.string	"UTASK_RUNNING"
 .LASF165:
 	.string	"hex_asc"
-.LASF1068:
+.LASF1082:
 	.string	"watchdog_stamp"
-.LASF2838:
+.LASF2852:
 	.string	"WAKE_LOCK_TYPE_COUNT"
-.LASF2714:
+.LASF2728:
 	.string	"Elf64_Word"
-.LASF863:
+.LASF877:
 	.string	"PCPU_FC_PAGE"
-.LASF2158:
+.LASF2172:
 	.string	"kset_uevent_ops"
 .LASF371:
 	.string	"__cpu_present_mask"
-.LASF1449:
+.LASF1463:
 	.string	"zone_padding"
 .LASF182:
 	.string	"TT_NONE"
-.LASF1668:
+.LASF1682:
 	.string	"acquire_dquot"
-.LASF2213:
+.LASF2227:
 	.string	"coherent_dma_mask"
-.LASF2361:
+.LASF2375:
 	.string	"dev_kobj"
 .LASF475:
 	.string	"d_release"
-.LASF3162:
+.LASF3177:
 	.string	"get_arch_dma_ops"
 .LASF305:
 	.string	"__ctors_start"
@@ -52448,205 +52502,209 @@ __exitcall_ebc_exit:
 	.string	"state"
 .LASF524:
 	.string	"s_d_op"
-.LASF2963:
+.LASF2977:
 	.string	"ebc_buffer_vir"
-.LASF909:
+.LASF923:
 	.string	"node_states"
-.LASF2907:
+.LASF2921:
 	.string	"pmic_power_req"
-.LASF901:
+.LASF915:
 	.string	"hrtimer_resolution"
 .LASF256:
 	.string	"FTR_HIGHER_OR_ZERO_SAFE"
-.LASF1087:
+.LASF1101:
 	.string	"need_qs"
 .LASF137:
 	.string	"panic_notifier_list"
-.LASF1565:
+.LASF1579:
 	.string	"compact_defer_shift"
 .LASF259:
 	.string	"visible"
 .LASF52:
 	.string	"blkcnt_t"
-.LASF1133:
+.LASF1147:
 	.string	"icq_tree"
-.LASF946:
+.LASF960:
 	.string	"si_code"
 .LASF649:
 	.string	"thread_node"
-.LASF3099:
+.LASF3114:
 	.string	"temperature"
-.LASF1302:
+.LASF1316:
 	.string	"map_pages"
 .LASF545:
 	.string	"vfsmount"
-.LASF2231:
+.LASF2245:
 	.string	"iommu_fwspec"
 .LASF345:
 	.string	"tp2_value"
-.LASF2453:
+.LASF2467:
 	.string	"nargs"
-.LASF1542:
+.LASF1556:
 	.string	"vm_node_stat_diff"
-.LASF1162:
+.LASF1176:
 	.string	"attributes"
-.LASF2019:
+.LASF828:
+	.string	"WQ_HIGHPRI"
+.LASF2033:
 	.string	"fs_kobj"
-.LASF2552:
+.LASF2566:
 	.string	"TASKLET_SOFTIRQ"
-.LASF1420:
+.LASF1434:
 	.string	"inodes_stat"
 .LASF252:
 	.string	"ftr_type"
 .LASF651:
 	.string	"set_child_tid"
-.LASF917:
+.LASF931:
 	.string	"_overrun"
 .LASF159:
 	.string	"system_state"
-.LASF825:
+.LASF839:
 	.string	"system_wq"
 .LASF604:
 	.string	"rcu_read_lock_nesting"
-.LASF2993:
+.LASF3007:
 	.string	"suspend_lock"
-.LASF2530:
+.LASF2544:
 	.string	"gpio_desc"
-.LASF962:
+.LASF976:
 	.string	"list"
-.LASF3179:
+.LASF3194:
 	.string	"_copy_from_user"
-.LASF3205:
+.LASF3220:
 	.string	"get_order"
-.LASF945:
+.LASF959:
 	.string	"si_errno"
 .LASF534:
 	.string	"s_inode_lru"
-.LASF2691:
+.LASF2705:
 	.string	"sysctl_stat_interval"
-.LASF1126:
+.LASF1140:
 	.string	"blk_plug"
-.LASF2786:
+.LASF2800:
 	.string	"modules_disabled"
-.LASF2644:
+.LASF2658:
 	.string	"PGSCAN_SKIP_DMA32"
 .LASF547:
 	.string	"sysctl_vfs_cache_pressure"
-.LASF2630:
+.LASF2644:
 	.string	"compound_page_dtor"
-.LASF833:
+.LASF847:
 	.string	"refs"
-.LASF1764:
+.LASF1778:
 	.string	"trace_events"
-.LASF1343:
+.LASF1357:
 	.string	"env_start"
-.LASF2916:
+.LASF2930:
 	.string	"DMA_FROM_DEVICE"
 .LASF756:
 	.string	"cpu_number"
 .LASF404:
 	.string	"d_flags"
-.LASF1313:
+.LASF1327:
 	.string	"mm_rb"
-.LASF2187:
+.LASF2201:
 	.string	"freeze_late"
-.LASF3071:
+.LASF3086:
 	.string	"buf_info"
 .LASF409:
 	.string	"d_inode"
-.LASF1832:
+.LASF1846:
 	.string	"hd_struct"
-.LASF1203:
+.LASF1217:
 	.string	"UTASK_SSTEP"
 .LASF639:
 	.string	"real_parent"
+.LASF832:
+	.string	"__WQ_DRAINING"
 .LASF218:
 	.string	"locked"
 .LASF73:
 	.string	"exitcall_t"
-.LASF2948:
+.LASF2962:
 	.string	"regs"
-.LASF1037:
+.LASF1051:
 	.string	"slice_max"
 .LASF672:
 	.string	"last_switch_count"
-.LASF2169:
+.LASF2183:
 	.string	"n_node"
-.LASF1624:
+.LASF1638:
 	.string	"qsize_t"
-.LASF3202:
+.LASF3217:
 	.string	"devm_kzalloc"
 .LASF380:
 	.string	"sequence"
-.LASF2531:
+.LASF2545:
 	.string	"i2c_adapter_quirks"
 .LASF674:
 	.string	"files"
-.LASF1363:
+.LASF1377:
 	.string	"file_caps_enabled"
-.LASF1913:
+.LASF1927:
 	.string	"lock_manager_operations"
-.LASF1702:
+.LASF1716:
 	.string	"s_state"
-.LASF1066:
+.LASF1080:
 	.string	"run_list"
-.LASF3119:
+.LASF3134:
 	.string	"clac_full_data_align8"
-.LASF2553:
+.LASF2567:
 	.string	"SCHED_SOFTIRQ"
-.LASF1930:
+.LASF1944:
 	.string	"fa_lock"
-.LASF2774:
+.LASF2788:
 	.string	"mov0"
-.LASF2775:
+.LASF2789:
 	.string	"mov1"
-.LASF2776:
+.LASF2790:
 	.string	"mov2"
-.LASF2804:
+.LASF2818:
 	.string	"module_sect_attrs"
-.LASF1871:
+.LASF1885:
 	.string	"flc_lock"
-.LASF1211:
+.LASF1225:
 	.string	"return_instance"
-.LASF2755:
+.LASF2769:
 	.string	"param_ops_uint"
-.LASF891:
+.LASF905:
 	.string	"softirq_activated"
-.LASF3034:
+.LASF3049:
 	.string	"pdev"
-.LASF827:
+.LASF841:
 	.string	"system_long_wq"
 .LASF157:
 	.string	"SYSTEM_RESTART"
-.LASF2258:
+.LASF2272:
 	.string	"is_prepared"
-.LASF2018:
+.LASF2032:
 	.string	"uevent_suppress"
-.LASF1518:
+.LASF1532:
 	.string	"node_id"
-.LASF1586:
+.LASF1600:
 	.string	"contig_page_data"
-.LASF2294:
+.LASF2308:
 	.string	"autosuspend_delay"
 .LASF3:
 	.string	"unsigned int"
-.LASF929:
+.LASF943:
 	.string	"_addr_bnd"
 .LASF161:
 	.string	"c_true"
-.LASF1578:
+.LASF1592:
 	.string	"notifier_call"
-.LASF3078:
+.LASF3093:
 	.string	"ebc_exit"
-.LASF1833:
+.LASF1847:
 	.string	"gendisk"
-.LASF1693:
+.LASF1707:
 	.string	"spc_timelimit"
 .LASF512:
 	.string	"s_instances"
-.LASF2896:
+.LASF2910:
 	.string	"EPD_AUTO_DU"
-.LASF2736:
+.LASF2750:
 	.string	"sh_size"
 .LASF772:
 	.string	"desc"
@@ -52656,113 +52714,113 @@ __exitcall_ebc_exit:
 	.string	"__hyp_idmap_text_start"
 .LASF405:
 	.string	"d_seq"
-.LASF971:
+.LASF985:
 	.string	"rb_subtree_gap"
-.LASF1543:
+.LASF1557:
 	.string	"zone_type"
 .LASF47:
 	.string	"size_t"
 .LASF209:
 	.string	"compat_elf_hwcap"
-.LASF3280:
+.LASF3295:
 	.string	"prepare_to_wait_event"
-.LASF1110:
+.LASF1124:
 	.string	"cap_permitted"
 .LASF183:
 	.string	"TT_NATIVE"
-.LASF1552:
+.LASF1566:
 	.string	"zone_pgdat"
 .LASF549:
 	.string	"pid_type"
-.LASF1688:
+.LASF1702:
 	.string	"d_rt_spc_softlimit"
 .LASF42:
 	.string	"bool"
-.LASF2697:
+.LASF2711:
 	.string	"min_free_kbytes"
 .LASF372:
 	.string	"__cpu_active_mask"
-.LASF2402:
+.LASF2416:
 	.string	"map_page"
 .LASF610:
 	.string	"rcu_tasks_idx"
 .LASF609:
 	.string	"rcu_tasks_holdout"
-.LASF1279:
+.LASF1293:
 	.string	"f_count"
-.LASF1769:
+.LASF1783:
 	.string	"target_list"
-.LASF1385:
+.LASF1399:
 	.string	"RCU_BH_SYNC"
 .LASF284:
 	.string	"__init_end"
-.LASF1571:
+.LASF1585:
 	.string	"zoneref"
-.LASF2793:
+.LASF2807:
 	.string	"module_layout"
 .LASF527:
 	.string	"s_remove_count"
 .LASF217:
 	.string	"__reserved"
-.LASF940:
+.LASF954:
 	.string	"_sigfault"
-.LASF3133:
+.LASF3148:
 	.string	"image_bg"
-.LASF2858:
+.LASF2872:
 	.string	"ebc_buf_status"
-.LASF1807:
+.LASF1821:
 	.string	"empty_aops"
 .LASF87:
 	.string	"atomic_long_t"
-.LASF2111:
+.LASF2125:
 	.string	"prealloc"
-.LASF1305:
+.LASF1319:
 	.string	"pfn_mkwrite"
 .LASF70:
 	.string	"callback_head"
 .LASF342:
 	.string	"perf_event"
-.LASF1288:
+.LASF1302:
 	.string	"f_security"
 .LASF452:
 	.string	"i_sb_list"
-.LASF2497:
+.LASF2511:
 	.string	"detected"
 .LASF775:
 	.string	"read_cntpct_el0"
-.LASF1321:
+.LASF1335:
 	.string	"pgtables_bytes"
-.LASF1847:
+.LASF1861:
 	.string	"get_link"
 .LASF55:
 	.string	"fmode_t"
-.LASF2224:
+.LASF2238:
 	.string	"devt"
-.LASF948:
+.LASF962:
 	.string	"siginfo_t"
-.LASF2184:
+.LASF2198:
 	.string	"restore"
-.LASF1398:
+.LASF1412:
 	.string	"delayed_call"
-.LASF920:
+.LASF934:
 	.string	"_status"
-.LASF2905:
+.LASF2919:
 	.string	"pmic_name"
-.LASF1464:
+.LASF1478:
 	.string	"NR_FREE_CMA_PAGES"
-.LASF2428:
+.LASF2442:
 	.string	"kernel_ulong_t"
-.LASF2211:
+.LASF2225:
 	.string	"dma_ops"
-.LASF2140:
+.LASF2154:
 	.string	"bin_attribute"
-.LASF1603:
+.LASF1617:
 	.string	"percpu_counter"
-.LASF2995:
+.LASF3009:
 	.string	"first_in"
-.LASF2329:
+.LASF2343:
 	.string	"dev_groups"
-.LASF2955:
+.LASF2969:
 	.string	"image_addr_set"
 .LASF301:
 	.string	"__softirqentry_text_start"
@@ -52770,649 +52828,651 @@ __exitcall_ebc_exit:
 	.string	"__hyp_idmap_text_end"
 .LASF633:
 	.string	"memcg_kmem_skip_account"
-.LASF2375:
+.LASF2389:
 	.string	"dl_dev_state"
-.LASF896:
+.LASF910:
 	.string	"expires_next"
-.LASF2088:
+.LASF2102:
 	.string	"ida_bitmap"
 .LASF446:
 	.string	"i_io_list"
-.LASF1929:
+.LASF1943:
 	.string	"fasync_struct"
-.LASF2290:
+.LASF2304:
 	.string	"links_count"
-.LASF2634:
+.LASF2648:
 	.string	"PGPGOUT"
-.LASF1662:
+.LASF1676:
 	.string	"release_dqblk"
 .LASF188:
 	.string	"uaddr2"
 .LASF30:
 	.string	"__kernel_timer_t"
-.LASF1754:
+.LASF1768:
 	.string	"notes_attrs"
-.LASF2484:
+.LASF2498:
 	.string	"irqchip_fwnode_ops"
-.LASF1614:
+.LASF1628:
 	.string	"dq_id"
-.LASF3124:
+.LASF3139:
 	.string	"frame_count_tmp"
-.LASF3132:
+.LASF3147:
 	.string	"image_fb"
-.LASF1789:
+.LASF1803:
 	.string	"write_end"
-.LASF1499:
+.LASF1513:
 	.string	"NR_ION_HEAP_POOL"
-.LASF1424:
+.LASF1438:
 	.string	"sysctl_protected_hardlinks"
-.LASF3284:
+.LASF3299:
 	.string	"__arch_copy_from_user"
-.LASF1177:
+.LASF1191:
 	.string	"scan_objects"
-.LASF1553:
+.LASF1567:
 	.string	"pageset"
-.LASF1238:
+.LASF1252:
 	.string	"wb_err"
-.LASF3176:
+.LASF3191:
 	.string	"copy_to_user"
 .LASF735:
 	.string	"trace_recursion"
-.LASF1337:
+.LASF1351:
 	.string	"start_data"
-.LASF1783:
+.LASF1797:
 	.string	"writepage"
-.LASF2013:
+.LASF2027:
 	.string	"kref"
-.LASF1114:
+.LASF1128:
 	.string	"jit_keyring"
 .LASF169:
 	.string	"file_disp"
-.LASF2972:
+.LASF2986:
 	.string	"auto_need_refresh"
-.LASF2846:
+.LASF2860:
 	.string	"WF_TYPE_GRAY2"
-.LASF1090:
+.LASF1104:
 	.string	"rcu_special"
 .LASF652:
 	.string	"clear_child_tid"
 .LASF699:
 	.string	"backing_dev_info"
-.LASF2549:
+.LASF2563:
 	.string	"NET_RX_SOFTIRQ"
 .LASF811:
 	.string	"__WORK_OFFQ_CANCELING"
 .LASF537:
 	.string	"s_stack_depth"
-.LASF1330:
+.LASF1344:
 	.string	"data_vm"
 .LASF11:
 	.string	"__s32"
-.LASF2486:
+.LASF2500:
 	.string	"i2c_msg"
 .LASF769:
 	.string	"ate_match_acpi_oem_info"
 .LASF392:
 	.string	"nr_dentry"
-.LASF2183:
+.LASF2197:
 	.string	"poweroff"
-.LASF2077:
+.LASF2091:
 	.string	"stop"
-.LASF2596:
+.LASF2610:
 	.string	"__tracepoint_page_ref_unfreeze"
-.LASF2065:
+.LASF2079:
 	.string	"ratelimit_state"
 .LASF531:
 	.string	"s_pins"
-.LASF2528:
+.LASF2542:
 	.string	"scl_gpiod"
-.LASF2083:
+.LASF2097:
 	.string	"ioport_resource"
-.LASF2701:
+.LASF2715:
 	.string	"init_on_alloc"
-.LASF2465:
+.LASF2479:
 	.string	"param_count"
-.LASF2115:
+.LASF2129:
 	.string	"attr"
-.LASF2441:
+.LASF2455:
 	.string	"get_next_child_node"
-.LASF2810:
+.LASF2824:
 	.string	"module_ktype"
-.LASF2015:
+.LASF2029:
 	.string	"state_in_sysfs"
-.LASF1224:
+.LASF1238:
 	.string	"vm_fault_t"
-.LASF1205:
+.LASF1219:
 	.string	"UTASK_SSTEP_TRAPPED"
 .LASF333:
 	.string	"__entry_tramp_text_end"
-.LASF1307:
+.LASF1321:
 	.string	"find_special_page"
-.LASF2581:
+.LASF2595:
 	.string	"force_atomic"
 .LASF106:
 	.string	"poll"
-.LASF2444:
+.LASF2458:
 	.string	"graph_get_next_endpoint"
-.LASF1410:
+.LASF1424:
 	.string	"io_cq"
-.LASF2855:
+.LASF2869:
 	.string	"epd_lut_data"
-.LASF2332:
+.LASF2346:
 	.string	"probe"
-.LASF2722:
+.LASF2736:
 	.string	"elf64_sym"
-.LASF2766:
+.LASF2780:
 	.string	"latch_tree_node"
-.LASF1155:
+.LASF1169:
 	.string	"cad_pid"
-.LASF2944:
+.LASF2958:
 	.string	"lgonl"
 .LASF535:
 	.string	"destroy_work"
-.LASF3087:
+.LASF3102:
 	.string	"one_buffer_end"
 .LASF254:
 	.string	"FTR_LOWER_SAFE"
 .LASF127:
 	.string	"clone_file_range"
-.LASF2520:
+.LASF2534:
 	.string	"recover_bus"
-.LASF2268:
+.LASF2282:
 	.string	"syscore"
 .LASF13:
 	.string	"__s64"
-.LASF866:
+.LASF880:
 	.string	"pcpu_chosen_fc"
 .LASF391:
 	.string	"dentry_stat_t"
-.LASF3230:
+.LASF3244:
 	.string	"atomic_add"
-.LASF1643:
+.LASF1657:
 	.string	"dqi_bgrace"
 .LASF22:
 	.string	"__kernel_pid_t"
 .LASF158:
 	.string	"SYSTEM_SUSPEND"
-.LASF938:
+.LASF952:
 	.string	"_timer"
-.LASF1596:
+.LASF1610:
 	.string	"thread_sibling"
-.LASF2398:
+.LASF2412:
 	.string	"dma_map_ops"
-.LASF2031:
+.LASF2045:
 	.string	"ctl_table"
 .LASF44:
 	.string	"uid_t"
-.LASF3259:
+.LASF3274:
 	.string	"strstr"
-.LASF2848:
+.LASF2862:
 	.string	"WF_TYPE_A2"
-.LASF2826:
+.LASF2840:
 	.string	"of_default_bus_match_table"
-.LASF1221:
+.LASF1235:
 	.string	"__bp_harden_hyp_vecs_start"
-.LASF1261:
+.LASF1275:
 	.string	"pgmap"
 .LASF490:
 	.string	"dq_op"
-.LASF2368:
+.LASF2382:
 	.string	"sysfs_dev_char_kobj"
 .LASF608:
 	.string	"rcu_tasks_nvcsw"
 .LASF101:
 	.string	"write"
-.LASF2595:
+.LASF2609:
 	.string	"__tracepoint_page_ref_freeze"
-.LASF2934:
+.LASF2948:
 	.string	"panel_buffer"
 .LASF317:
 	.string	"__exception_text_end"
-.LASF2734:
+.LASF2748:
 	.string	"sh_addr"
 .LASF275:
 	.string	"_text"
-.LASF1887:
+.LASF1901:
 	.string	"fu_rcuhead"
-.LASF2710:
+.LASF2724:
 	.string	"modprobe_path"
-.LASF2217:
+.LASF2231:
 	.string	"dma_pools"
-.LASF2079:
+.LASF2093:
 	.string	"arch_debugfs_dir"
-.LASF928:
+.LASF942:
 	.string	"_addr_lsb"
-.LASF2037:
+.LASF2051:
 	.string	"ctl_table_poll"
 .LASF463:
 	.string	"i_generation"
-.LASF941:
+.LASF955:
 	.string	"_sigpoll"
 .LASF281:
 	.string	"__bss_start"
-.LASF1931:
+.LASF1945:
 	.string	"magic"
-.LASF2312:
+.LASF2326:
 	.string	"wakeup_count"
-.LASF1000:
+.LASF1014:
 	.string	"cpu_id_start"
-.LASF2440:
+.LASF2454:
 	.string	"get_parent"
-.LASF1048:
+.LASF1062:
 	.string	"nr_wakeups_affine"
 .LASF765:
 	.string	"arch_timer_read_ool_enabled"
-.LASF835:
+.LASF849:
 	.string	"pteval_t"
 .LASF430:
 	.string	"i_ino"
-.LASF3302:
+.LASF3317:
 	.string	"might_fault"
-.LASF1562:
+.LASF1576:
 	.string	"compact_cached_free_pfn"
-.LASF880:
+.LASF894:
 	.string	"index"
-.LASF2204:
+.LASF2218:
 	.string	"driver_data"
-.LASF2942:
+.LASF2956:
 	.string	"sdck"
-.LASF2809:
+.LASF2823:
 	.string	"module_kset"
-.LASF2419:
+.LASF2433:
 	.string	"removed_region"
-.LASF2170:
+.LASF2184:
 	.string	"n_ref"
-.LASF903:
+.LASF917:
 	.string	"tick_cpu_device"
-.LASF1933:
+.LASF1947:
 	.string	"fa_next"
-.LASF1276:
+.LASF1290:
 	.string	"f_op"
-.LASF2704:
+.LASF2718:
 	.string	"randomize_va_space"
-.LASF2580:
+.LASF2594:
 	.string	"confirm_switch"
-.LASF2892:
+.LASF2906:
 	.string	"EPD_SUSPEND"
 .LASF381:
 	.string	"seqcount_t"
-.LASF1845:
+.LASF1859:
 	.string	"inode_operations"
-.LASF2450:
+.LASF2464:
 	.string	"port"
-.LASF2831:
+.LASF2845:
 	.string	"usercopy_fallback"
-.LASF926:
+.LASF940:
 	.string	"_dummy_pkey"
-.LASF2824:
+.LASF2838:
 	.string	"id_table"
-.LASF1613:
+.LASF1627:
 	.string	"dq_sb"
-.LASF902:
+.LASF916:
 	.string	"tick_device"
 .LASF128:
 	.string	"dedupe_file_range"
-.LASF1195:
+.LASF1209:
 	.string	"radix_tree_root"
-.LASF1124:
+.LASF1138:
 	.string	"sighand_struct"
-.LASF2840:
+.LASF2854:
 	.string	"sched_param"
-.LASF1352:
+.LASF1366:
 	.string	"tlb_flush_pending"
 .LASF171:
 	.string	"flags"
 .LASF711:
 	.string	"cpuset_slab_spread_rotor"
-.LASF1949:
+.LASF1963:
 	.string	"i_lock_key"
-.LASF1248:
+.LASF1262:
 	.string	"kmem_cache"
-.LASF2680:
+.LASF2694:
 	.string	"KCOMPACTD_FREE_SCANNED"
 .LASF418:
 	.string	"inode"
-.LASF2779:
+.LASF2793:
 	.string	"drivers_dir"
-.LASF1454:
+.LASF1468:
 	.string	"NR_ZONE_ACTIVE_ANON"
 .LASF167:
 	.string	"bug_entry"
 .LASF288:
 	.string	"__end_ro_after_init"
-.LASF1395:
+.LASF1409:
 	.string	"rw_sem"
-.LASF1773:
+.LASF1787:
 	.string	"dqio_sem"
-.LASF1059:
+.LASF1073:
 	.string	"prev_sum_exec_runtime"
-.LASF1738:
+.LASF1752:
 	.string	"gpl_future_syms"
-.LASF2878:
+.LASF2892:
 	.string	"EPD_FULL_GLR16"
-.LASF1042:
+.LASF1056:
 	.string	"nr_forced_migrations"
-.LASF2076:
+.LASF2090:
 	.string	"seq_operations"
 .LASF638:
 	.string	"stack_canary"
-.LASF1161:
+.LASF1175:
 	.string	"blksize"
 .LASF642:
 	.string	"sibling"
-.LASF1286:
+.LASF1300:
 	.string	"f_ra"
-.LASF1978:
+.LASF1992:
 	.string	"quota_write"
-.LASF1998:
+.LASF2012:
 	.string	"fi_extents_max"
-.LASF2481:
+.LASF2495:
 	.string	"translate"
-.LASF2522:
+.LASF2536:
 	.string	"set_scl"
-.LASF1857:
+.LASF1871:
 	.string	"rmdir"
-.LASF2133:
+.LASF2147:
 	.string	"sock"
 .LASF387:
 	.string	"hash_len"
-.LASF872:
+.LASF886:
 	.string	"HRTIMER_RESTART"
-.LASF2214:
+.LASF2228:
 	.string	"bus_dma_mask"
 .LASF562:
 	.string	"pidfd_fops"
-.LASF1917:
+.LASF1931:
 	.string	"lm_put_owner"
-.LASF3261:
+.LASF3276:
 	.string	"ebc_pmic_verity_vcom"
-.LASF2524:
+.LASF2538:
 	.string	"set_sda"
 .LASF474:
 	.string	"d_init"
-.LASF1308:
+.LASF1322:
 	.string	"core_thread"
-.LASF1782:
+.LASF1796:
 	.string	"address_space_operations"
-.LASF982:
+.LASF996:
 	.string	"vm_userfaultfd_ctx"
-.LASF2351:
+.LASF2365:
 	.string	"devnode"
-.LASF879:
+.LASF893:
 	.string	"cpu_base"
-.LASF1242:
+.LASF1256:
 	.string	"objects"
-.LASF2435:
+.LASF2449:
 	.string	"device_is_available"
-.LASF1605:
+.LASF1619:
 	.string	"dquot"
-.LASF1073:
+.LASF1087:
 	.string	"dl_runtime"
 .LASF85:
 	.string	"initcall_debug"
 .LASF560:
 	.string	"numbers"
-.LASF874:
+.LASF888:
 	.string	"_softexpires"
-.LASF2063:
+.LASF2077:
 	.string	"key_user"
-.LASF2071:
+.LASF2085:
 	.string	"printk_ratelimit_state"
-.LASF1368:
+.LASF1382:
 	.string	"semaphore"
 .LASF648:
 	.string	"thread_group"
-.LASF2335:
+.LASF2349:
 	.string	"shutdown"
-.LASF1610:
+.LASF1624:
 	.string	"dq_lock"
-.LASF1840:
+.LASF1854:
 	.string	"i_cdev"
 .LASF351:
 	.string	"sve_vl_onexec"
-.LASF1344:
+.LASF1358:
 	.string	"env_end"
-.LASF1629:
+.LASF1643:
 	.string	"dqb_bhardlimit"
-.LASF2035:
+.LASF2049:
 	.string	"extra1"
 .LASF701:
 	.string	"ptrace_message"
-.LASF1765:
+.LASF1779:
 	.string	"num_trace_events"
-.LASF919:
+.LASF933:
 	.string	"_sys_private"
-.LASF2423:
+.LASF2437:
 	.string	"properties"
 .LASF523:
 	.string	"s_subtype"
 .LASF71:
 	.string	"func"
-.LASF1141:
+.LASF1155:
 	.string	"perf_event_context"
-.LASF3006:
+.LASF3021:
 	.string	"ebc_auto_task"
 .LASF94:
 	.string	"printk_delay_msec"
-.LASF2699:
+.LASF2713:
 	.string	"mmap_pages_allocated"
-.LASF989:
+.LASF1003:
 	.string	"tlbflush_unmap_batch"
-.LASF2173:
+.LASF2187:
 	.string	"power_group_name"
 .LASF779:
 	.string	"clock_event_device"
-.LASF1199:
+.LASF1213:
 	.string	"m_count"
-.LASF2164:
+.LASF2178:
 	.string	"hypervisor_kobj"
 .LASF605:
 	.string	"rcu_read_unlock_special"
-.LASF943:
+.LASF957:
 	.string	"siginfo"
-.LASF996:
+.LASF1010:
 	.string	"read_bytes"
 .LASF323:
 	.string	"__hyp_text_end"
-.LASF1992:
+.LASF2006:
 	.string	"fsverity_operations"
-.LASF1091:
+.LASF1105:
 	.string	"wake_q_node"
-.LASF1117:
+.LASF1131:
 	.string	"request_key_auth"
-.LASF3015:
+.LASF3030:
 	.string	"waveform_misc"
-.LASF1954:
+.LASF1968:
 	.string	"destroy_inode"
-.LASF2969:
+.LASF2983:
 	.string	"is_busy_now"
 .LASF58:
 	.string	"irq_hw_number_t"
-.LASF2367:
+.LASF2381:
 	.string	"sysfs_dev_block_kobj"
 .LASF555:
 	.string	"upid"
-.LASF3291:
+.LASF3306:
 	.string	"down_write"
-.LASF1099:
+.LASF1113:
 	.string	"completion"
-.LASF3085:
+.LASF3100:
 	.string	"old_prev_buf"
-.LASF1500:
+.LASF1514:
 	.string	"NR_GPU_HEAP"
-.LASF861:
+.LASF875:
 	.string	"PCPU_FC_AUTO"
-.LASF1907:
+.LASF1921:
 	.string	"fl_break_time"
-.LASF1204:
+.LASF1218:
 	.string	"UTASK_SSTEP_ACK"
 .LASF77:
 	.string	"__con_initcall_end"
-.LASF1146:
+.LASF1160:
 	.string	"active_uprobe"
-.LASF3010:
+.LASF3025:
 	.string	"ebc_poweroff_wq"
-.LASF1972:
+.LASF1986:
 	.string	"show_options"
-.LASF2143:
+.LASF2157:
 	.string	"uevent_helper"
-.LASF2967:
+.LASF2981:
 	.string	"lut_buffer_phy"
 .LASF110:
 	.string	"mmap_supported_flags"
 .LASF51:
 	.string	"sector_t"
-.LASF1218:
+.LASF1232:
 	.string	"bp_hardening_cb_t"
-.LASF1809:
+.LASF1823:
 	.string	"bd_dev"
-.LASF1848:
+.LASF1862:
 	.string	"permission"
-.LASF1517:
+.LASF1531:
 	.string	"node_spanned_pages"
-.LASF921:
+.LASF935:
 	.string	"_utime"
-.LASF2249:
+.LASF2263:
 	.string	"pm_subsys_data"
-.LASF2350:
+.LASF2364:
 	.string	"device_type"
-.LASF1156:
+.LASF1170:
 	.string	"thread_union"
-.LASF1812:
+.LASF1826:
 	.string	"bd_super"
-.LASF2709:
+.LASF2723:
 	.string	"usermodehelper_table"
 .LASF160:
 	.string	"taint_flag"
-.LASF1979:
+.LASF1993:
 	.string	"get_dquots"
-.LASF3270:
+.LASF3285:
 	.string	"of_find_node_by_phandle"
-.LASF2403:
+.LASF2417:
 	.string	"unmap_page"
-.LASF828:
+.LASF842:
 	.string	"system_unbound_wq"
 .LASF517:
 	.string	"s_uuid"
-.LASF1667:
+.LASF1681:
 	.string	"destroy_dquot"
-.LASF1679:
+.LASF1693:
 	.string	"d_ino_hardlimit"
-.LASF1877:
+.LASF1891:
 	.string	"fsverity_info"
-.LASF2041:
+.LASF2055:
 	.string	"nr_leaves_on_tree"
-.LASF1712:
+.LASF1726:
 	.string	"quota_on"
-.LASF2459:
+.LASF2473:
 	.string	"of_root"
-.LASF1296:
+.LASF1310:
 	.string	"vm_operations_struct"
-.LASF2391:
+.LASF2405:
 	.string	"hwirq_max"
-.LASF3228:
+.LASF3242:
 	.string	"__fswab32"
-.LASF2199:
+.LASF2213:
 	.string	"runtime_idle"
-.LASF1893:
+.LASF1907:
 	.string	"fl_next"
-.LASF2527:
+.LASF2541:
 	.string	"unprepare_recovery"
 .LASF441:
 	.string	"i_state"
 .LASF594:
 	.string	"sched_class"
-.LASF1971:
+.LASF1985:
 	.string	"umount_end"
 .LASF692:
 	.string	"pi_waiters"
-.LASF2658:
+.LASF2672:
 	.string	"PGSCAN_DIRECT"
-.LASF1257:
+.LASF1271:
 	.string	"pt_frag_refcount"
-.LASF1849:
+.LASF1863:
 	.string	"permission2"
-.LASF1706:
+.LASF1720:
 	.string	"i_ino_timelimit"
 .LASF226:
 	.string	"cnts"
-.LASF2241:
+.LASF2255:
 	.string	"RPM_SUSPENDED"
 .LASF698:
 	.string	"reclaim_state"
-.LASF3301:
+.LASF3316:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF138:
 	.string	"vendor_panic_cb"
-.LASF3080:
+.LASF3095:
 	.string	"ebc_vdd_power_timeout"
-.LASF3148:
+.LASF3163:
 	.string	"ebc_get_4pix_wf"
-.LASF2799:
+.LASF2813:
 	.string	"num_symtab"
-.LASF1599:
+.LASF1613:
 	.string	"cpu_scale"
-.LASF2646:
+.LASF2660:
 	.string	"PGSCAN_SKIP_MOVABLE"
-.LASF1956:
+.LASF1970:
 	.string	"write_inode"
 .LASF415:
 	.string	"d_fsdata"
-.LASF2242:
+.LASF2256:
 	.string	"RPM_SUSPENDING"
-.LASF2613:
+.LASF2627:
 	.string	"mmap_rnd_bits_max"
-.LASF1232:
+.LASF1246:
 	.string	"nrpages"
-.LASF846:
+.LASF860:
 	.string	"_refcount"
 .LASF466:
 	.string	"i_crypt_info"
-.LASF3065:
+.LASF3080:
 	.string	"waveform_mmap"
-.LASF1872:
+.LASF1886:
 	.string	"flc_flock"
-.LASF2777:
+.LASF2791:
 	.string	"module_alloc_base"
-.LASF1752:
+.LASF1766:
 	.string	"core_kallsyms"
-.LASF3264:
+.LASF3279:
 	.string	"memcpy"
-.LASF2895:
+.LASF2909:
 	.string	"EPD_FORCE_FULL"
-.LASF2401:
+.LASF2415:
 	.string	"get_sgtable"
-.LASF3128:
+.LASF3143:
 	.string	"xor_val"
-.LASF2156:
+.LASF2170:
 	.string	"envp_idx"
 .LASF465:
 	.string	"i_fsnotify_marks"
-.LASF2016:
+.LASF2030:
 	.string	"state_add_uevent_sent"
-.LASF2669:
+.LASF2683:
 	.string	"OOM_KILL"
 .LASF445:
 	.string	"i_hash"
-.LASF3111:
+.LASF3126:
 	.string	"gray_old"
 .LASF68:
 	.string	"hlist_node"
-.LASF3273:
+.LASF3288:
 	.string	"sprintf"
-.LASF1909:
+.LASF1923:
 	.string	"fl_ops"
-.LASF1716:
+.LASF1730:
 	.string	"quota_sync"
-.LASF2708:
+.LASF2722:
 	.string	"debug_guardpage_ops"
-.LASF2674:
+.LASF827:
+	.string	"WQ_MEM_RECLAIM"
+.LASF2688:
 	.string	"COMPACTISOLATED"
-.LASF3241:
+.LASF3255:
 	.string	"of_property_read_variable_u32_array"
 .LASF328:
 	.string	"__inittext_begin"
-.LASF1396:
+.LASF1410:
 	.string	"writer"
 .LASF764:
 	.string	"arch_timer_read_counter"
@@ -53420,541 +53480,543 @@ __exitcall_ebc_exit:
 	.string	"ftr_bits"
 .LASF628:
 	.string	"sched_remote_wakeup"
-.LASF2180:
+.LASF2194:
 	.string	"resume"
 .LASF691:
 	.string	"wake_q"
-.LASF2676:
+.LASF2690:
 	.string	"COMPACTFAIL"
 .LASF696:
 	.string	"bio_list"
-.LASF1665:
+.LASF1679:
 	.string	"write_dquot"
-.LASF2653:
+.LASF2667:
 	.string	"PGLAZYFREED"
-.LASF1349:
+.LASF1363:
 	.string	"ioctx_lock"
 .LASF311:
 	.string	"current_stack_pointer"
-.LASF2835:
+.LASF2849:
 	.string	"NR_KMALLOC_TYPES"
-.LASF1209:
+.LASF1223:
 	.string	"dup_xol_addr"
-.LASF2475:
+.LASF2489:
 	.string	"DOMAIN_BUS_WAKEUP"
-.LASF1223:
+.LASF1237:
 	.string	"arm64_el2_vector_last_slot"
-.LASF3296:
+.LASF3311:
 	.string	"queue_work_on"
-.LASF2336:
+.LASF2350:
 	.string	"online"
-.LASF2198:
+.LASF2212:
 	.string	"runtime_resume"
-.LASF1208:
+.LASF1222:
 	.string	"dup_xol_work"
-.LASF3169:
+.LASF3184:
 	.string	"ebc_pmic_read_temp"
-.LASF2876:
+.LASF2890:
 	.string	"EPD_FULL_GC16"
-.LASF3021:
+.LASF3036:
 	.string	"dev_attr_ebc_state"
-.LASF2162:
+.LASF2176:
 	.string	"kernel_kobj"
-.LASF2588:
+.LASF2602:
 	.string	"funcs"
-.LASF3002:
+.LASF3017:
 	.string	"overlay_enable"
-.LASF1108:
+.LASF1122:
 	.string	"securebits"
-.LASF2713:
+.LASF2727:
 	.string	"Elf64_Off"
-.LASF1328:
+.LASF1342:
 	.string	"total_vm"
 .LASF623:
 	.string	"jobctl"
-.LASF2874:
+.LASF2888:
 	.string	"EPD_AUTO"
 .LASF332:
 	.string	"__entry_tramp_text_start"
-.LASF850:
+.LASF864:
 	.string	"node_list"
-.LASF2472:
+.LASF2486:
 	.string	"DOMAIN_BUS_NEXUS"
-.LASF2039:
+.LASF2053:
 	.string	"sysctl_mount_point"
-.LASF2998:
+.LASF3012:
 	.string	"auto_buffer_work"
 .LASF267:
 	.string	"user_mask"
-.LASF2743:
+.LASF2757:
 	.string	"kernel_param"
-.LASF2282:
+.LASF2296:
 	.string	"deferred_resume"
-.LASF1678:
+.LASF1692:
 	.string	"d_spc_softlimit"
 .LASF54:
 	.string	"gfp_t"
 .LASF338:
 	.string	"bps_disabled"
-.LASF906:
+.LASF920:
 	.string	"seccomp_filter"
 .LASF780:
 	.string	"timer_unstable_counter_workaround"
 .LASF654:
 	.string	"stime"
-.LASF1230:
+.LASF1244:
 	.string	"i_mmap"
-.LASF1153:
+.LASF1167:
 	.string	"phys_addr"
 .LASF398:
 	.string	"d_lru"
-.LASF2409:
+.LASF2423:
 	.string	"sync_single_for_device"
-.LASF1123:
+.LASF1137:
 	.string	"signal_struct"
 .LASF800:
 	.string	"WORK_STRUCT_COLOR_BITS"
 .LASF719:
 	.string	"perf_event_mutex"
-.LASF1131:
+.LASF1145:
 	.string	"nr_batch_requests"
-.LASF1460:
+.LASF1474:
 	.string	"NR_PAGETABLE"
-.LASF1729:
+.LASF1743:
 	.string	"crcs"
-.LASF2684:
+.LASF2698:
 	.string	"UNEVICTABLE_PGMLOCKED"
-.LASF837:
+.LASF851:
 	.string	"pgdval_t"
-.LASF2919:
+.LASF2933:
 	.string	"page_link"
-.LASF1860:
+.LASF1874:
 	.string	"setattr"
-.LASF936:
+.LASF950:
 	.string	"_pad"
-.LASF1291:
+.LASF1305:
 	.string	"f_mapping"
-.LASF2177:
+.LASF2191:
 	.string	"prepare"
-.LASF2139:
+.LASF2153:
 	.string	"bin_attrs"
-.LASF2929:
+.LASF2943:
 	.string	"HYPERVISOR_shared_info"
 .LASF683:
 	.string	"sas_ss_flags"
-.LASF1281:
+.LASF1295:
 	.string	"f_mode"
-.LASF1430:
+.LASF1444:
 	.string	"ki_complete"
-.LASF3037:
+.LASF3052:
 	.string	"ebc_tcon_pdev"
-.LASF1756:
+.LASF1770:
 	.string	"percpu"
 .LASF584:
 	.string	"wakee_flips"
-.LASF1868:
+.LASF1882:
 	.string	"set_acl"
-.LASF2061:
+.LASF2075:
 	.string	"keys"
 .LASF299:
 	.string	"__irqentry_text_start"
 .LASF564:
 	.string	"overflowuid"
-.LASF830:
+.LASF844:
 	.string	"system_power_efficient_wq"
-.LASF2202:
+.LASF2216:
 	.string	"driver"
-.LASF1545:
+.LASF1559:
 	.string	"ZONE_NORMAL"
-.LASF3134:
+.LASF3149:
 	.string	"image_new_data"
 .LASF426:
 	.string	"i_op"
-.LASF1687:
+.LASF1701:
 	.string	"d_rt_spc_hardlimit"
-.LASF2981:
+.LASF2995:
 	.string	"ebc_task"
-.LASF2127:
+.LASF2141:
 	.string	"kobj_ns_type_operations"
-.LASF1393:
+.LASF1407:
 	.string	"percpu_rw_semaphore"
 .LASF597:
 	.string	"boost_period"
-.LASF2457:
+.LASF2471:
 	.string	"of_node_ktype"
 .LASF669:
 	.string	"cred"
 .LASF241:
 	.string	"jump_entry"
-.LASF2612:
+.LASF2626:
 	.string	"mmap_rnd_bits_min"
-.LASF1444:
+.LASF1458:
 	.string	"migratetype_names"
-.LASF1184:
+.LASF1198:
 	.string	"list_lru_node"
 .LASF394:
 	.string	"age_limit"
-.LASF2881:
+.LASF2895:
 	.string	"EPD_PART_GC16"
 .LASF237:
 	.string	"spinlock_t"
-.LASF2130:
+.LASF2144:
 	.string	"netlink_ns"
 .LASF363:
 	.string	"wait_queue_head"
 .LASF792:
 	.string	"work_func_t"
-.LASF2223:
+.LASF2237:
 	.string	"fwnode"
-.LASF1800:
+.LASF1814:
 	.string	"is_dirty_writeback"
 .LASF302:
 	.string	"__softirqentry_text_end"
-.LASF1763:
+.LASF1777:
 	.string	"trace_bprintk_fmt_start"
 .LASF666:
 	.string	"cpu_timers"
-.LASF2953:
+.LASF2967:
 	.string	"disable"
-.LASF1301:
+.LASF1315:
 	.string	"huge_fault"
-.LASF2009:
+.LASF2023:
 	.string	"kstatfs"
-.LASF3172:
+.LASF3187:
 	.string	"ebc_pmic_power_off"
-.LASF2635:
+.LASF2649:
 	.string	"PGPGOUTCLEAN"
 .LASF581:
 	.string	"ptrace"
-.LASF2304:
+.LASF2318:
 	.string	"max_time"
-.LASF1594:
+.LASF1608:
 	.string	"package_id"
 .LASF104:
 	.string	"iterate"
-.LASF1185:
+.LASF1199:
 	.string	"memcg_lrus"
-.LASF1836:
+.LASF1850:
 	.string	"i_dentry"
-.LASF2129:
+.LASF2143:
 	.string	"grab_current_ns"
-.LASF3052:
+.LASF3067:
 	.string	"fb_size"
-.LASF884:
+.LASF898:
 	.string	"offset"
-.LASF1267:
+.LASF1281:
 	.string	"altmap"
-.LASF1875:
+.LASF1889:
 	.string	"fsnotify_mark_connector"
-.LASF942:
+.LASF956:
 	.string	"_sigsys"
-.LASF3098:
+.LASF3113:
 	.string	"ebc_lut_update"
-.LASF1922:
+.LASF1936:
 	.string	"lm_setup"
 .LASF427:
 	.string	"i_sb"
 .LASF348:
 	.string	"fpsimd_cpu"
-.LASF2791:
+.LASF2805:
 	.string	"MODULE_STATE_UNFORMED"
 .LASF194:
 	.string	"expires"
-.LASF1381:
+.LASF1395:
 	.string	"rcuwait"
 .LASF330:
 	.string	"__mmuoff_data_start"
 .LASF660:
 	.string	"nivcsw"
-.LASF2498:
+.LASF2512:
 	.string	"i2c_adapter"
-.LASF1373:
+.LASF1387:
 	.string	"fe_reserved64"
-.LASF2379:
+.LASF2393:
 	.string	"DL_DEV_UNBINDING"
 .LASF355:
 	.string	"signal_minsigstksz"
 .LASF751:
 	.string	"thread"
-.LASF2349:
+.LASF2363:
 	.string	"subsys_private"
-.LASF2562:
+.LASF2576:
 	.string	"idmap_pg_dir"
-.LASF2519:
+.LASF2533:
 	.string	"i2c_bus_recovery_info"
-.LASF2968:
+.LASF2982:
 	.string	"lut_buffer_size"
 .LASF484:
 	.string	"s_dev"
 .LASF346:
 	.string	"fpsimd_state"
-.LASF1663:
+.LASF1677:
 	.string	"get_next_id"
 .LASF238:
 	.string	"rwlock_t"
-.LASF3300:
+.LASF3315:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
-.LASF841:
+.LASF855:
 	.string	"pgprot"
 .LASF17:
 	.string	"false"
-.LASF1975:
+.LASF1989:
 	.string	"show_path"
-.LASF1253:
+.LASF1267:
 	.string	"_compound_pad_1"
-.LASF1254:
+.LASF1268:
 	.string	"_compound_pad_2"
 .LASF551:
 	.string	"PIDTYPE_TGID"
-.LASF1916:
+.LASF1930:
 	.string	"lm_get_owner"
-.LASF2906:
+.LASF2920:
 	.string	"drvpar"
-.LASF2632:
+.LASF2646:
 	.string	"vm_event_item"
-.LASF2571:
+.LASF2585:
 	.string	"kthreadd_task"
-.LASF1806:
+.LASF1820:
 	.string	"swap_info_struct"
 .LASF88:
 	.string	"__icache_flags"
 .LASF148:
 	.string	"crash_kexec_post_notifiers"
-.LASF3157:
+.LASF3172:
 	.string	"eink_mode"
-.LASF1698:
+.LASF1712:
 	.string	"rt_spc_warnlimit"
-.LASF1191:
+.LASF1205:
 	.string	"exceptional"
-.LASF1996:
+.LASF2010:
 	.string	"fi_flags"
-.LASF1580:
+.LASF1594:
 	.string	"blocking_notifier_head"
-.LASF2348:
+.LASF2362:
 	.string	"coredump"
 .LASF278:
 	.string	"_data"
-.LASF1534:
+.LASF1548:
 	.string	"vm_stat"
 .LASF558:
 	.string	"tasks"
-.LASF914:
+.LASF928:
 	.string	"_pid"
-.LASF1157:
+.LASF1171:
 	.string	"init_stack"
-.LASF3140:
+.LASF3155:
 	.string	"dmask"
-.LASF1226:
+.LASF1240:
 	.string	"address_space"
-.LASF1217:
+.LASF1231:
 	.string	"mm_context_t"
-.LASF1312:
+.LASF1326:
 	.string	"startup"
-.LASF1419:
+.LASF835:
+	.string	"__WQ_ORDERED_EXPLICIT"
+.LASF1433:
 	.string	"sysctl_nr_open"
 .LASF82:
 	.string	"reset_devices"
-.LASF2984:
+.LASF2998:
 	.string	"auto_image_bg"
 .LASF447:
 	.string	"i_wb"
-.LASF2087:
+.LASF2101:
 	.string	"idr_next"
-.LASF3125:
+.LASF3140:
 	.string	"frame_count_data"
-.LASF2958:
+.LASF2972:
 	.string	"frame_start"
-.LASF1251:
+.LASF1265:
 	.string	"compound_order"
-.LASF1255:
+.LASF1269:
 	.string	"deferred_list"
-.LASF954:
+.LASF968:
 	.string	"locked_shm"
-.LASF1086:
+.LASF1100:
 	.string	"inactive_timer"
-.LASF927:
+.LASF941:
 	.string	"_pkey"
 .LASF289:
 	.string	"_end"
 .LASF478:
 	.string	"d_dname"
-.LASF1731:
+.LASF1745:
 	.string	"param_lock"
-.LASF973:
+.LASF987:
 	.string	"vm_page_prot"
 .LASF179:
 	.string	"timespec64"
 .LASF553:
 	.string	"PIDTYPE_SID"
-.LASF2406:
+.LASF2420:
 	.string	"map_resource"
 .LASF476:
 	.string	"d_prune"
 .LASF83:
 	.string	"rodata_enabled"
-.LASF2068:
+.LASF2082:
 	.string	"printed"
 .LASF318:
 	.string	"__hibernate_exit_text_start"
-.LASF2192:
+.LASF2206:
 	.string	"resume_noirq"
-.LASF1551:
+.LASF1565:
 	.string	"lowmem_reserve"
-.LASF845:
+.LASF859:
 	.string	"page"
-.LASF1674:
+.LASF1688:
 	.string	"get_inode_usage"
-.LASF2420:
+.LASF2434:
 	.string	"device_node"
 .LASF592:
 	.string	"normal_prio"
-.LASF1289:
+.LASF1303:
 	.string	"f_ep_links"
-.LASF3138:
+.LASF3153:
 	.string	"image_fb_tmp"
-.LASF2295:
+.LASF2309:
 	.string	"last_busy"
-.LASF1838:
+.LASF1852:
 	.string	"i_pipe"
-.LASF875:
+.LASF889:
 	.string	"base"
-.LASF1227:
+.LASF1241:
 	.string	"host"
 .LASF185:
 	.string	"uaddr"
-.LASF3292:
+.LASF3307:
 	.string	"ebc_remove_from_dsp_buf_list"
 .LASF662:
 	.string	"real_start_time"
 .LASF28:
 	.string	"__kernel_time_t"
-.LASF1993:
+.LASF2007:
 	.string	"unicode_map"
-.LASF2568:
+.LASF2582:
 	.string	"MEMREMAP_WC"
-.LASF2445:
+.LASF2459:
 	.string	"graph_get_remote_endpoint"
-.LASF1568:
+.LASF1582:
 	.string	"contiguous"
-.LASF1331:
+.LASF1345:
 	.string	"exec_vm"
-.LASF2567:
+.LASF2581:
 	.string	"MEMREMAP_WT"
-.LASF2723:
+.LASF2737:
 	.string	"st_name"
 .LASF228:
 	.string	"wait_lock"
-.LASF1810:
+.LASF1824:
 	.string	"bd_openers"
 .LASF702:
 	.string	"last_siginfo"
-.LASF1953:
+.LASF1967:
 	.string	"alloc_inode"
-.LASF2834:
+.LASF2848:
 	.string	"KMALLOC_RECLAIM"
 .LASF410:
 	.string	"d_iname"
-.LASF2226:
+.LASF2240:
 	.string	"devres_head"
 .LASF428:
 	.string	"i_mapping"
-.LASF3265:
+.LASF3280:
 	.string	"misc_register"
 .LASF723:
 	.string	"rseq_sig"
-.LASF3191:
+.LASF3206:
 	.string	"platform_set_drvdata"
 .LASF343:
 	.string	"cpu_context"
-.LASF2316:
+.LASF2330:
 	.string	"dev_pm_domain"
-.LASF1514:
+.LASF1528:
 	.string	"nr_zones"
-.LASF3214:
+.LASF3228:
 	.string	"is_source"
-.LASF1376:
+.LASF1390:
 	.string	"migrate_mode"
-.LASF2689:
+.LASF2703:
 	.string	"SWAP_RA_HIT"
 .LASF617:
 	.string	"vmacache"
-.LASF1446:
+.LASF1460:
 	.string	"free_area"
-.LASF1524:
+.LASF1538:
 	.string	"kswapd_failures"
-.LASF2189:
+.LASF2203:
 	.string	"poweroff_late"
-.LASF877:
+.LASF891:
 	.string	"is_soft"
 .LASF176:
 	.string	"timezone"
 .LASF406:
 	.string	"d_hash"
-.LASF1076:
+.LASF1090:
 	.string	"dl_bw"
-.LASF3184:
+.LASF3199:
 	.string	"limit"
-.LASF2146:
+.LASF2160:
 	.string	"kobj"
-.LASF3274:
+.LASF3289:
 	.string	"kstrtouint"
 .LASF114:
 	.string	"fsync"
-.LASF1994:
+.LASF2008:
 	.string	"mtd_info"
 .LASF423:
 	.string	"i_flags"
-.LASF2893:
+.LASF2907:
 	.string	"EPD_RESUME"
-.LASF3260:
+.LASF3275:
 	.string	"sscanf"
-.LASF3256:
+.LASF3271:
 	.string	"ebc_empty_buf_get"
-.LASF1475:
+.LASF1489:
 	.string	"NR_ISOLATED_ANON"
-.LASF3053:
+.LASF3068:
 	.string	"ebc_lut_table_init"
-.LASF1214:
+.LASF1228:
 	.string	"uprobes_state"
-.LASF1554:
+.LASF1568:
 	.string	"cma_alloc"
-.LASF851:
+.LASF865:
 	.string	"rb_node"
 .LASF614:
 	.string	"pushable_tasks"
-.LASF3139:
+.LASF3154:
 	.string	"image_bg_tmp"
-.LASF2203:
+.LASF2217:
 	.string	"platform_data"
-.LASF1397:
+.LASF1411:
 	.string	"readers_block"
 .LASF677:
 	.string	"sighand"
 .LASF105:
 	.string	"iterate_shared"
-.LASF2136:
+.LASF2150:
 	.string	"is_visible"
 .LASF676:
 	.string	"signal"
-.LASF2122:
+.LASF2136:
 	.string	"released"
-.LASF2618:
+.LASF2632:
 	.string	"sysctl_max_map_count"
-.LASF1666:
+.LASF1680:
 	.string	"alloc_dquot"
-.LASF2174:
+.LASF2188:
 	.string	"pm_message"
 .LASF525:
 	.string	"cleancache_poolid"
-.LASF847:
+.LASF861:
 	.string	"mem_cgroup"
-.LASF1016:
+.LASF1030:
 	.string	"last_update_time"
-.LASF1138:
+.LASF1152:
 	.string	"robust_list_head"
-.LASF3254:
+.LASF3269:
 	.string	"init_timer_key"
-.LASF1481:
+.LASF1495:
 	.string	"NR_ANON_MAPPED"
 .LASF383:
 	.string	"count"
@@ -53962,205 +54024,205 @@ __exitcall_ebc_exit:
 	.string	"level"
 .LASF532:
 	.string	"s_user_ns"
-.LASF1726:
+.LASF1740:
 	.string	"srcversion"
-.LASF859:
+.LASF873:
 	.string	"pcpu_unit_offsets"
-.LASF3160:
+.LASF3175:
 	.string	"dma_sync_single_for_device"
-.LASF2959:
+.LASF2973:
 	.string	"dsp_end_callback"
 .LASF461:
 	.string	"i_data"
-.LASF2008:
+.LASF2022:
 	.string	"poll_event"
-.LASF2557:
+.LASF2571:
 	.string	"softirq_to_name"
 .LASF66:
 	.string	"hlist_head"
 .LASF506:
 	.string	"s_encoding_flags"
-.LASF1054:
+.LASF1068:
 	.string	"runnable_weight"
-.LASF2447:
+.LASF2461:
 	.string	"graph_parse_endpoint"
-.LASF1402:
+.LASF1416:
 	.string	"uuid_null"
-.LASF1332:
+.LASF1346:
 	.string	"stack_vm"
-.LASF2277:
+.LASF2291:
 	.string	"usage_count"
-.LASF2078:
+.LASF2092:
 	.string	"show"
-.LASF3018:
+.LASF3033:
 	.string	"dev_attr_pmic_temp"
 .LASF7:
 	.string	"unsigned char"
-.LASF1970:
+.LASF1984:
 	.string	"umount_begin"
-.LASF1216:
+.LASF1230:
 	.string	"vdso"
-.LASF1316:
+.LASF1330:
 	.string	"mmap_legacy_base"
-.LASF2665:
+.LASF2679:
 	.string	"PAGEOUTRUN"
-.LASF983:
+.LASF997:
 	.string	"task_rss_stat"
-.LASF1142:
+.LASF1156:
 	.string	"pipe_inode_info"
-.LASF2988:
+.LASF3002:
 	.string	"ebc_power_status"
-.LASF961:
+.LASF975:
 	.string	"ratelimit"
-.LASF2489:
+.LASF2503:
 	.string	"word"
-.LASF2014:
+.LASF2028:
 	.string	"state_initialized"
-.LASF849:
+.LASF863:
 	.string	"prio_list"
-.LASF2543:
+.LASF2557:
 	.string	"nmi_contexts"
-.LASF2147:
+.LASF2161:
 	.string	"uevent_ops"
 .LASF546:
 	.string	"rename_lock"
-.LASF3086:
+.LASF3101:
 	.string	"__out"
 .LASF681:
 	.string	"sas_ss_sp"
-.LASF1453:
+.LASF1467:
 	.string	"NR_ZONE_INACTIVE_ANON"
 .LASF729:
 	.string	"nr_dirtied"
-.LASF3201:
+.LASF3216:
 	.string	"dev_get_drvdata"
-.LASF2396:
+.LASF2410:
 	.string	"linear_revmap"
 .LASF335:
 	.string	"arm64_dma_phys_limit"
-.LASF1451:
+.LASF1465:
 	.string	"NR_FREE_PAGES"
 .LASF522:
 	.string	"s_vfs_rename_mutex"
-.LASF2185:
+.LASF2199:
 	.string	"suspend_late"
-.LASF2266:
+.LASF2280:
 	.string	"wakeup"
 .LASF713:
 	.string	"cg_list"
-.LASF1821:
+.LASF1835:
 	.string	"bd_partno"
-.LASF1942:
+.LASF1956:
 	.string	"alloc_mnt_data"
-.LASF1828:
+.LASF1842:
 	.string	"bd_list"
-.LASF2265:
+.LASF2279:
 	.string	"driver_flags"
-.LASF1198:
+.LASF1212:
 	.string	"rw_semaphore"
-.LASF2186:
+.LASF2200:
 	.string	"resume_early"
-.LASF1935:
+.LASF1949:
 	.string	"fa_rcu"
-.LASF1867:
+.LASF1881:
 	.string	"tmpfile"
-.LASF1774:
+.LASF1788:
 	.string	"info"
 .LASF155:
 	.string	"SYSTEM_HALT"
-.LASF1864:
+.LASF1878:
 	.string	"fiemap"
-.LASF2432:
+.LASF2446:
 	.string	"waiters"
-.LASF2705:
+.LASF2719:
 	.string	"sysctl_memory_failure_early_kill"
-.LASF2761:
+.LASF2775:
 	.string	"param_ops_bool_enable_only"
-.LASF3145:
+.LASF3160:
 	.string	"power_status"
 .LASF307:
 	.string	"__start_opd"
-.LASF3269:
+.LASF3284:
 	.string	"of_find_i2c_device_by_node"
 .LASF154:
 	.string	"SYSTEM_RUNNING"
-.LASF2851:
+.LASF2865:
 	.string	"WF_TYPE_GLR16"
-.LASF947:
+.LASF961:
 	.string	"_sifields"
-.LASF2025:
+.LASF2039:
 	.string	"page_symlink_inode_operations"
 .LASF736:
 	.string	"memcg_in_oom"
 .LASF480:
 	.string	"d_manage"
-.LASF1134:
+.LASF1148:
 	.string	"icq_hint"
-.LASF1995:
+.LASF2009:
 	.string	"fiemap_extent_info"
-.LASF2915:
+.LASF2929:
 	.string	"DMA_TO_DEVICE"
-.LASF2730:
+.LASF2744:
 	.string	"elf64_shdr"
 .LASF298:
 	.string	"__end_rodata"
 .LASF771:
 	.string	"match_type"
-.LASF2748:
+.LASF2762:
 	.string	"elem"
-.LASF893:
+.LASF907:
 	.string	"nr_retries"
-.LASF2659:
+.LASF2673:
 	.string	"PGSCAN_DIRECT_THROTTLE"
-.LASF913:
+.LASF927:
 	.string	"sigval_t"
-.LASF1934:
+.LASF1948:
 	.string	"fa_file"
-.LASF3004:
+.LASF3019:
 	.string	"panel"
-.LASF2433:
+.LASF2447:
 	.string	"irq_data"
-.LASF3093:
+.LASF3108:
 	.string	"old_buffer_temp"
-.LASF2706:
+.LASF2720:
 	.string	"sysctl_memory_failure_recovery"
-.LASF2693:
+.LASF2707:
 	.string	"vm_event_states"
 .LASF407:
 	.string	"d_parent"
-.LASF2069:
+.LASF2083:
 	.string	"missed"
 .LASF150:
 	.string	"root_mountflags"
-.LASF1977:
+.LASF1991:
 	.string	"quota_read"
-.LASF2726:
+.LASF2740:
 	.string	"st_shndx"
-.LASF2400:
+.LASF2414:
 	.string	"free"
-.LASF3058:
+.LASF3073:
 	.string	"pmic_vcom_write"
-.LASF2134:
+.LASF2148:
 	.string	"attribute"
 .LASF449:
 	.string	"i_wb_frn_avg_time"
-.LASF2657:
+.LASF2671:
 	.string	"PGSCAN_KSWAPD"
-.LASF1830:
+.LASF1844:
 	.string	"bd_fsfreeze_count"
 .LASF193:
 	.string	"type"
 .LASF164:
 	.string	"taint_flags"
-.LASF1348:
+.LASF1362:
 	.string	"membarrier_state"
-.LASF3151:
+.LASF3166:
 	.string	"pre_image_addr"
-.LASF2179:
+.LASF2193:
 	.string	"suspend"
-.LASF1743:
+.LASF1757:
 	.string	"init"
-.LASF1122:
+.LASF1136:
 	.string	"files_struct"
 .LASF103:
 	.string	"write_iter"
@@ -54170,369 +54232,371 @@ __exitcall_ebc_exit:
 	.string	"max_state"
 .LASF530:
 	.string	"s_dio_done_wq"
-.LASF2668:
+.LASF2682:
 	.string	"DROP_SLAB"
-.LASF923:
+.LASF937:
 	.string	"_dummy_bnd"
 .LASF682:
 	.string	"sas_ss_size"
-.LASF2469:
+.LASF2483:
 	.string	"DOMAIN_BUS_WIRED"
-.LASF1050:
+.LASF1064:
 	.string	"nr_wakeups_passive"
-.LASF1938:
+.LASF1952:
 	.string	"file_system_type"
-.LASF2024:
+.LASF2038:
 	.string	"generic_ro_fops"
-.LASF1166:
+.LASF1180:
 	.string	"mtime"
-.LASF1357:
+.LASF1371:
 	.string	"vm_fault"
-.LASF1383:
+.LASF1397:
 	.string	"RCU_SYNC"
-.LASF1557:
+.LASF1571:
 	.string	"spanned_pages"
-.LASF2153:
+.LASF2167:
 	.string	"kobj_uevent_env"
-.LASF2098:
+.LASF2112:
 	.string	"deactivate_waitq"
-.LASF1011:
+.LASF1025:
 	.string	"inv_weight"
-.LASF1955:
+.LASF1969:
 	.string	"dirty_inode"
-.LASF1570:
+.LASF1584:
 	.string	"vm_numa_stat"
-.LASF1513:
+.LASF1527:
 	.string	"node_zonelists"
 .LASF542:
 	.string	"path"
-.LASF2728:
+.LASF2742:
 	.string	"st_size"
-.LASF3022:
+.LASF3037:
 	.string	"dev_attr_ebc_buf_state"
 .LASF189:
 	.string	"rmtp"
-.LASF2427:
+.LASF2441:
 	.string	"platform_notify_remove"
-.LASF1028:
+.LASF1042:
 	.string	"wait_sum"
-.LASF1758:
+.LASF1772:
 	.string	"num_tracepoints"
 .LASF620:
 	.string	"exit_code"
-.LASF1057:
+.LASF1071:
 	.string	"exec_start"
-.LASF2382:
+.LASF2396:
 	.string	"consumers"
-.LASF2099:
+.LASF2113:
 	.string	"kernfs_elem_symlink"
-.LASF1182:
+.LASF1196:
 	.string	"nr_items"
-.LASF2506:
+.LASF2520:
 	.string	"userspace_clients_lock"
-.LASF887:
+.LASF901:
 	.string	"clock_was_set_seq"
-.LASF1287:
+.LASF1301:
 	.string	"f_version"
 .LASF141:
 	.string	"panic_timeout"
-.LASF1200:
+.LASF1214:
 	.string	"arch_uprobe_task"
 .LASF459:
 	.string	"i_fop"
-.LASF2887:
+.LASF2901:
 	.string	"EPD_A2_DITHER"
-.LASF1854:
+.LASF1868:
 	.string	"unlink"
-.LASF2718:
+.LASF2732:
 	.string	"d_ptr"
-.LASF3060:
+.LASF3075:
 	.string	"pmic_temp_read"
-.LASF1653:
+.LASF1667:
 	.string	"dqstats"
-.LASF1020:
+.LASF1034:
 	.string	"period_contrib"
 .LASF606:
 	.string	"rcu_node_entry"
-.LASF1669:
+.LASF1683:
 	.string	"release_dquot"
-.LASF1415:
+.LASF1429:
 	.string	"max_files"
-.LASF1107:
+.LASF1121:
 	.string	"fsgid"
-.LASF2341:
+.LASF2355:
 	.string	"need_parent_lock"
-.LASF1386:
+.LASF1400:
 	.string	"rcu_sync"
-.LASF2614:
+.LASF2628:
 	.string	"mmap_rnd_bits"
-.LASF2462:
+.LASF2476:
 	.string	"of_stdout"
-.LASF3084:
+.LASF3099:
 	.string	"new_prev_buf"
-.LASF977:
+.LASF991:
 	.string	"vm_ops"
-.LASF2935:
+.LASF2949:
 	.string	"ebc_panel"
-.LASF1303:
+.LASF1317:
 	.string	"pagesize"
 .LASF486:
 	.string	"s_blocksize"
-.LASF978:
+.LASF992:
 	.string	"vm_pgoff"
-.LASF2302:
+.LASF2316:
 	.string	"timer"
-.LASF2463:
+.LASF2477:
 	.string	"devtree_lock"
-.LASF3142:
+.LASF3157:
 	.string	"refresh_new_image_auto"
-.LASF3074:
+.LASF3089:
 	.string	"__ret"
-.LASF1865:
+.LASF1277:
+	.string	"_zd_pad_1"
+.LASF1879:
 	.string	"update_time"
-.LASF1980:
+.LASF1994:
 	.string	"bdev_try_to_free_page"
-.LASF1579:
+.LASF1593:
 	.string	"priority"
-.LASF933:
+.LASF947:
 	.string	"_call_addr"
 .LASF822:
 	.string	"WORK_BUSY_RUNNING"
-.LASF2053:
+.LASF2067:
 	.string	"check"
-.LASF1417:
+.LASF1431:
 	.string	"nr_inodes"
-.LASF2505:
+.LASF2519:
 	.string	"dev_released"
-.LASF2057:
+.LASF2071:
 	.string	"expiry"
 .LASF572:
 	.string	"optimistic_spin_queue"
-.LASF2964:
+.LASF2978:
 	.string	"ebc_buffer_size"
-.LASF3275:
+.LASF3290:
 	.string	"ebc_pmic_set_vcom"
-.LASF2642:
+.LASF2656:
 	.string	"ALLOCSTALL_NORMAL"
-.LASF3115:
+.LASF3130:
 	.string	"data_buf_tmp"
 .LASF326:
 	.string	"__initdata_begin"
-.LASF2909:
+.LASF2923:
 	.string	"pmic_pm_resume"
 .LASF225:
 	.string	"__lstate"
-.LASF2159:
+.LASF2173:
 	.string	"uevent"
 .LASF384:
 	.string	"lock_count"
 .LASF149:
 	.string	"panic_cpu"
-.LASF834:
+.LASF848:
 	.string	"refcount_t"
 .LASF697:
 	.string	"plug"
-.LASF1366:
+.LASF1380:
 	.string	"__cap_empty_set"
-.LASF1345:
+.LASF1359:
 	.string	"saved_auxv"
-.LASF1748:
+.LASF1762:
 	.string	"num_bugs"
-.LASF1650:
+.LASF1664:
 	.string	"qf_ops"
-.LASF2343:
+.LASF2357:
 	.string	"mod_name"
-.LASF2439:
+.LASF2453:
 	.string	"property_read_string_array"
 .LASF722:
 	.string	"rseq_len"
-.LASF2466:
+.LASF2480:
 	.string	"param"
-.LASF2782:
+.LASF2796:
 	.string	"module_attribute"
-.LASF1318:
+.LASF1332:
 	.string	"highest_vm_end"
 .LASF244:
 	.string	"pollfd"
-.LASF1047:
+.LASF1061:
 	.string	"nr_wakeups_remote"
 .LASF375:
 	.string	"cpu_bit_bitmap"
-.LASF1627:
+.LASF1641:
 	.string	"dq_data_lock"
-.LASF2719:
+.LASF2733:
 	.string	"d_tag"
 .LASF753:
 	.string	"llist_node"
-.LASF1625:
+.LASF1639:
 	.string	"projid"
-.LASF1151:
+.LASF1165:
 	.string	"pages"
-.LASF1188:
+.LASF1202:
 	.string	"memcg_aware"
-.LASF1071:
+.LASF1085:
 	.string	"back"
-.LASF2326:
+.LASF2340:
 	.string	"dev_name"
-.LASF1364:
+.LASF1378:
 	.string	"kernel_cap_struct"
-.LASF2741:
+.LASF2755:
 	.string	"_DYNAMIC"
-.LASF1002:
+.LASF1016:
 	.string	"rseq_cs"
-.LASF2437:
+.LASF2451:
 	.string	"property_present"
-.LASF898:
+.LASF912:
 	.string	"softirq_expires_next"
-.LASF1595:
+.LASF1609:
 	.string	"llc_id"
-.LASF1851:
+.LASF1865:
 	.string	"readlink"
-.LASF2500:
+.LASF2514:
 	.string	"algo_data"
-.LASF1512:
+.LASF1526:
 	.string	"node_zones"
-.LASF3019:
+.LASF3034:
 	.string	"dev_attr_pmic_vcom"
-.LASF1560:
+.LASF1574:
 	.string	"initialized"
-.LASF1818:
+.LASF1832:
 	.string	"bd_holder_disks"
 .LASF63:
 	.string	"list_head"
-.LASF1531:
+.LASF1545:
 	.string	"lru_lock"
-.LASF2767:
+.LASF2781:
 	.string	"mod_plt_sec"
 .LASF637:
 	.string	"tgid"
-.LASF2899:
+.LASF2913:
 	.string	"epd_mode"
-.LASF1139:
+.LASF1153:
 	.string	"compat_robust_list_head"
-.LASF916:
+.LASF930:
 	.string	"_tid"
 .LASF540:
 	.string	"s_inode_wblist_lock"
-.LASF2005:
+.LASF2019:
 	.string	"from"
-.LASF1815:
+.LASF1829:
 	.string	"bd_holder"
-.LASF1336:
+.LASF1350:
 	.string	"end_code"
-.LASF1014:
+.LASF1028:
 	.string	"ewma"
 .LASF222:
 	.string	"qspinlock"
 .LASF90:
 	.string	"linux_banner_ptr"
-.LASF1492:
+.LASF1506:
 	.string	"NR_VMSCAN_WRITE"
-.LASF2802:
+.LASF2816:
 	.string	"insn"
-.LASF2000:
+.LASF2014:
 	.string	"filldir_t"
-.LASF1903:
+.LASF1917:
 	.string	"fl_file"
-.LASF1219:
+.LASF1233:
 	.string	"bp_hardening_data"
-.LASF1083:
+.LASF1097:
 	.string	"dl_non_contending"
-.LASF2526:
+.LASF2540:
 	.string	"prepare_recovery"
-.LASF2001:
+.LASF2015:
 	.string	"dir_context"
-.LASF2541:
+.LASF2555:
 	.string	"irq_stat"
-.LASF2647:
+.LASF2661:
 	.string	"PGFREE"
-.LASF2589:
+.LASF2603:
 	.string	"tracepoint_ptr_t"
 .LASF742:
 	.string	"utask"
-.LASF1472:
+.LASF1486:
 	.string	"NR_UNEVICTABLE"
-.LASF1052:
+.LASF1066:
 	.string	"sched_entity"
-.LASF1677:
+.LASF1691:
 	.string	"d_spc_hardlimit"
-.LASF2739:
+.LASF2753:
 	.string	"sh_addralign"
 .LASF774:
 	.string	"read_cntv_tval_el0"
 .LASF0:
 	.string	"long unsigned int"
-.LASF1032:
+.LASF1046:
 	.string	"sleep_max"
 .LASF322:
 	.string	"__hyp_text_start"
-.LASF1315:
+.LASF1329:
 	.string	"mmap_base"
 .LASF700:
 	.string	"io_context"
 .LASF210:
 	.string	"compat_elf_hwcap2"
-.LASF2510:
+.LASF2524:
 	.string	"host_notify_domain"
 .LASF817:
 	.string	"WORK_OFFQ_POOL_NONE"
-.LASF1734:
+.LASF1748:
 	.string	"gpl_syms"
-.LASF2106:
+.LASF2120:
 	.string	"seq_show"
 .LASF767:
 	.string	"ate_match_dt"
-.LASF3199:
+.LASF3214:
 	.string	"of_node_put"
-.LASF1361:
+.LASF1375:
 	.string	"cow_page"
-.LASF1593:
+.LASF1607:
 	.string	"core_id"
-.LASF2490:
+.LASF2504:
 	.string	"block"
-.LASF2692:
+.LASF2706:
 	.string	"vm_event_state"
-.LASF1705:
+.LASF1719:
 	.string	"i_spc_timelimit"
-.LASF1148:
+.LASF1162:
 	.string	"return_instances"
-.LASF2021:
+.LASF2035:
 	.string	"blockdev_superblock"
-.LASF2200:
+.LASF2214:
 	.string	"device"
-.LASF2753:
+.LASF2767:
 	.string	"param_ops_ushort"
 .LASF526:
 	.string	"s_shrink"
-.LASF3123:
+.LASF3138:
 	.string	"gray_new_temp"
-.LASF1526:
+.LASF1540:
 	.string	"kcompactd_classzone_idx"
-.LASF3189:
+.LASF3204:
 	.string	"kmalloc_index"
-.LASF870:
+.LASF884:
 	.string	"hrtimer_restart"
-.LASF2608:
+.LASF2622:
 	.string	"totalram_pages"
-.LASF2487:
+.LASF2501:
 	.string	"i2c_smbus_data"
-.LASF2992:
+.LASF3006:
 	.string	"curr_dsp_buf"
-.LASF1069:
+.LASF1083:
 	.string	"time_slice"
-.LASF2422:
+.LASF2436:
 	.string	"full_name"
-.LASF2118:
+.LASF2132:
 	.string	"kernfs_open_file"
-.LASF868:
+.LASF882:
 	.string	"node"
-.LASF1813:
+.LASF1827:
 	.string	"bd_mutex"
-.LASF1380:
+.LASF1394:
 	.string	"MIGRATE_SYNC_NO_COPY"
-.LASF2306:
+.LASF2320:
 	.string	"start_prevent_time"
-.LASF2670:
+.LASF2684:
 	.string	"PGMIGRATE_SUCCESS"
 .LASF801:
 	.string	"WORK_STRUCT_PENDING"
@@ -54540,33 +54604,33 @@ __exitcall_ebc_exit:
 	.string	"no_cgroup_migration"
 .LASF285:
 	.string	"_sinittext"
-.LASF2656:
+.LASF2670:
 	.string	"PGSTEAL_DIRECT"
 .LASF374:
 	.string	"cpu_all_bits"
-.LASF2066:
+.LASF2080:
 	.string	"interval"
-.LASF2724:
+.LASF2738:
 	.string	"st_info"
-.LASF2219:
+.LASF2233:
 	.string	"cma_area"
 .LASF591:
 	.string	"static_prio"
-.LASF2839:
+.LASF2853:
 	.string	"wake_lock"
-.LASF2271:
+.LASF2285:
 	.string	"may_skip_resume"
-.LASF3000:
+.LASF3015:
 	.string	"is_deep_sleep"
-.LASF1175:
+.LASF1189:
 	.string	"shrinker"
-.LASF1082:
+.LASF1096:
 	.string	"dl_yielded"
-.LASF1639:
+.LASF1653:
 	.string	"dqi_format"
-.LASF2673:
+.LASF2687:
 	.string	"COMPACTFREE_SCANNED"
-.LASF2617:
+.LASF2631:
 	.string	"mmap_rnd_compat_bits"
 .LASF595:
 	.string	"last_sleep_ts"
@@ -54574,37 +54638,37 @@ __exitcall_ebc_exit:
 	.string	"i_version"
 .LASF658:
 	.string	"prev_cputime"
-.LASF2208:
+.LASF2222:
 	.string	"msi_domain"
-.LASF2017:
+.LASF2031:
 	.string	"state_remove_uevent_sent"
-.LASF1439:
+.LASF1453:
 	.string	"ia_size"
-.LASF889:
+.LASF903:
 	.string	"in_hrtirq"
 .LASF503:
 	.string	"s_master_keys"
 .LASF768:
 	.string	"ate_match_local_cap_id"
-.LASF2454:
+.LASF2468:
 	.string	"property"
-.LASF3054:
+.LASF3069:
 	.string	"ebc_sysfs_init"
-.LASF992:
+.LASF1006:
 	.string	"wchar"
 .LASF316:
 	.string	"__exception_text_start"
-.LASF2426:
+.LASF2440:
 	.string	"platform_notify"
 .LASF62:
 	.string	"kernel_symbol"
-.LASF2927:
+.LASF2941:
 	.string	"dma_virt_ops"
-.LASF2299:
+.LASF2313:
 	.string	"subsys_data"
-.LASF2721:
+.LASF2735:
 	.string	"Elf64_Dyn"
-.LASF2356:
+.LASF2370:
 	.string	"compatible"
 .LASF174:
 	.string	"tv_sec"
@@ -54612,137 +54676,137 @@ __exitcall_ebc_exit:
 	.string	"pid_t"
 .LASF78:
 	.string	"__security_initcall_start"
-.LASF1055:
+.LASF1069:
 	.string	"run_node"
 .LASF796:
 	.string	"WORK_STRUCT_DELAYED_BIT"
-.LASF1039:
+.LASF1053:
 	.string	"nr_failed_migrations_affine"
-.LASF3204:
+.LASF3219:
 	.string	"IS_ERR"
-.LASF862:
+.LASF876:
 	.string	"PCPU_FC_EMBED"
-.LASF2097:
+.LASF2111:
 	.string	"supers"
 .LASF812:
 	.string	"WORK_OFFQ_CANCELING"
-.LASF2094:
+.LASF2108:
 	.string	"last_ino"
 .LASF693:
 	.string	"pi_top_task"
 .LASF806:
 	.string	"WORK_NR_COLORS"
-.LASF3143:
+.LASF3158:
 	.string	"refresh_new_image2"
 .LASF528:
 	.string	"s_fsnotify_inode_refs"
 .LASF416:
 	.string	"d_child"
-.LASF2002:
+.LASF2016:
 	.string	"actor"
-.LASF1210:
+.LASF1224:
 	.string	"uprobe"
 .LASF529:
 	.string	"s_readonly_remount"
-.LASF3233:
+.LASF3247:
 	.string	"kasan_check_write"
 .LASF378:
 	.string	"hlist_bl_node"
-.LASF2725:
+.LASF2739:
 	.string	"st_other"
-.LASF1950:
+.LASF1964:
 	.string	"i_mutex_key"
-.LASF2011:
+.LASF2025:
 	.string	"kset"
-.LASF878:
+.LASF892:
 	.string	"hrtimer_clock_base"
-.LASF1058:
+.LASF1072:
 	.string	"vruntime"
-.LASF2279:
+.LASF2293:
 	.string	"disable_depth"
 .LASF432:
 	.string	"i_size"
-.LASF1074:
+.LASF1088:
 	.string	"dl_deadline"
 .LASF565:
 	.string	"overflowgid"
 .LASF818:
 	.string	"WORK_STRUCT_FLAG_MASK"
-.LASF1272:
+.LASF1286:
 	.string	"units"
-.LASF3248:
+.LASF3262:
 	.string	"epd_lut_from_mem_init"
 .LASF312:
 	.string	"__nosave_begin"
 .LASF163:
 	.string	"module"
-.LASF2648:
+.LASF2662:
 	.string	"PGACTIVATE"
-.LASF2073:
+.LASF2087:
 	.string	"ngroups"
-.LASF1659:
+.LASF1673:
 	.string	"free_file_info"
-.LASF1206:
+.LASF1220:
 	.string	"autask"
-.LASF2539:
+.LASF2553:
 	.string	"ipi_irqs"
 .LASF568:
 	.string	"user_namespace"
-.LASF2757:
+.LASF2771:
 	.string	"param_ops_ulong"
-.LASF3221:
+.LASF3235:
 	.string	"get_current"
 .LASF232:
 	.string	"raw_spinlock"
-.LASF1519:
+.LASF1533:
 	.string	"kswapd_wait"
-.LASF2288:
+.LASF2302:
 	.string	"timer_autosuspends"
-.LASF2883:
+.LASF2897:
 	.string	"EPD_PART_GLR16"
-.LASF2679:
+.LASF2693:
 	.string	"KCOMPACTD_MIGRATE_SCANNED"
-.LASF1409:
+.LASF1423:
 	.string	"__rcu_head"
-.LASF1753:
+.LASF1767:
 	.string	"sect_attrs"
-.LASF2759:
+.LASF2773:
 	.string	"param_ops_charp"
-.LASF1713:
+.LASF1727:
 	.string	"quota_off"
 .LASF352:
 	.string	"fault_address"
-.LASF1607:
+.LASF1621:
 	.string	"dq_inuse"
-.LASF3106:
+.LASF3121:
 	.string	"direct_mode_data_change_part"
-.LASF1642:
+.LASF1656:
 	.string	"dqi_flags"
-.LASF2654:
+.LASF2668:
 	.string	"PGREFILL"
-.LASF2763:
+.LASF2777:
 	.string	"param_ops_bint"
-.LASF3257:
+.LASF3272:
 	.string	"ebc_add_to_dsp_buf_list"
-.LASF3262:
+.LASF3277:
 	.string	"kfree"
-.LASF1803:
+.LASF1817:
 	.string	"swap_deactivate"
-.LASF2943:
+.LASF2957:
 	.string	"gdck_sta"
-.LASF1144:
+.LASF1158:
 	.string	"request_queue"
-.LASF1477:
+.LASF1491:
 	.string	"WORKINGSET_REFAULT"
-.LASF1641:
+.LASF1655:
 	.string	"dqi_dirty_list"
-.LASF3055:
+.LASF3070:
 	.string	"ebc_buf_state_read"
 .LASF230:
 	.string	"prove_locking"
-.LASF2792:
+.LASF2806:
 	.string	"mod_tree_node"
-.LASF2586:
+.LASF2600:
 	.string	"regfunc"
 .LASF242:
 	.string	"code"
@@ -54750,41 +54814,41 @@ __exitcall_ebc_exit:
 	.string	"gtime"
 .LASF573:
 	.string	"debug_locks"
-.LASF3007:
+.LASF3022:
 	.string	"auto_buf_sema"
-.LASF1784:
+.LASF1798:
 	.string	"readpage"
-.LASF2672:
+.LASF2686:
 	.string	"COMPACTMIGRATE_SCANNED"
 .LASF396:
 	.string	"dummy"
-.LASF2385:
+.LASF2399:
 	.string	"need_for_probe"
 .LASF220:
 	.string	"locked_pending"
-.LASF1180:
+.LASF1194:
 	.string	"nr_deferred"
-.LASF1878:
+.LASF1892:
 	.string	"fown_struct"
-.LASF1988:
+.LASF2002:
 	.string	"perm"
 .LASF715:
 	.string	"compat_robust_list"
-.LASF2962:
+.LASF2976:
 	.string	"ebc_buffer_phy"
-.LASF2478:
+.LASF2492:
 	.string	"unmap"
-.LASF2012:
+.LASF2026:
 	.string	"ktype"
 .LASF385:
 	.string	"lockref"
-.LASF2257:
+.LASF2271:
 	.string	"in_dpm_list"
-.LASF1824:
+.LASF1838:
 	.string	"bd_invalidated"
-.LASF1097:
+.LASF1111:
 	.string	"mm_struct"
-.LASF1432:
+.LASF1446:
 	.string	"ki_hint"
 .LASF421:
 	.string	"i_uid"
@@ -54792,9 +54856,9 @@ __exitcall_ebc_exit:
 	.string	"alternatives_applied"
 .LASF598:
 	.string	"boost_expires"
-.LASF2914:
+.LASF2928:
 	.string	"DMA_BIDIRECTIONAL"
-.LASF3283:
+.LASF3298:
 	.string	"__arch_copy_to_user"
 .LASF236:
 	.string	"spinlock"
@@ -54802,127 +54866,127 @@ __exitcall_ebc_exit:
 	.string	"arch_timer_erratum_workaround"
 .LASF556:
 	.string	"pid_namespace"
-.LASF934:
+.LASF948:
 	.string	"_syscall"
-.LASF2770:
+.LASF2784:
 	.string	"mod_arch_specific"
-.LASF2533:
+.LASF2547:
 	.string	"max_write_len"
 .LASF472:
 	.string	"d_compare"
-.LASF972:
+.LASF986:
 	.string	"vm_mm"
-.LASF3094:
+.LASF3109:
 	.string	"need_refresh"
-.LASF2821:
+.LASF2835:
 	.string	"platform_bus_type"
-.LASF3107:
+.LASF3122:
 	.string	"data_buf"
-.LASF3046:
+.LASF3061:
 	.string	"ulogo_buf"
-.LASF1638:
+.LASF1652:
 	.string	"mem_dqinfo"
 .LASF18:
 	.string	"true"
 .LASF456:
 	.string	"i_count"
-.LASF871:
+.LASF885:
 	.string	"HRTIMER_NORESTART"
 .LASF370:
 	.string	"__cpu_online_mask"
-.LASF1825:
+.LASF1839:
 	.string	"bd_disk"
 .LASF816:
 	.string	"WORK_OFFQ_POOL_BITS"
-.LASF1906:
+.LASF1920:
 	.string	"fl_fasync"
-.LASF3154:
+.LASF3169:
 	.string	"update_mode"
-.LASF2941:
+.LASF2955:
 	.string	"direct_mode"
-.LASF2412:
+.LASF2426:
 	.string	"cache_sync"
 .LASF436:
 	.string	"i_lock"
-.LASF2979:
+.LASF2993:
 	.string	"ebc_dsp_buf_status"
 .LASF408:
 	.string	"d_name"
 .LASF734:
 	.string	"trace"
-.LASF2152:
+.LASF2166:
 	.string	"get_ownership"
-.LASF2685:
+.LASF2699:
 	.string	"UNEVICTABLE_PGMUNLOCKED"
 .LASF195:
 	.string	"ufds"
-.LASF1351:
+.LASF1365:
 	.string	"exe_file"
-.LASF1173:
+.LASF1187:
 	.string	"nr_scanned"
 .LASF647:
 	.string	"pid_links"
-.LASF1207:
+.LASF1221:
 	.string	"vaddr"
-.LASF2291:
+.LASF2305:
 	.string	"request"
-.LASF1511:
+.LASF1525:
 	.string	"pglist_data"
-.LASF1775:
+.LASF1789:
 	.string	"rw_hint"
-.LASF2551:
+.LASF2565:
 	.string	"IRQ_POLL_SOFTIRQ"
-.LASF1067:
+.LASF1081:
 	.string	"timeout"
 .LASF673:
 	.string	"last_switch_time"
 .LASF566:
 	.string	"fs_overflowuid"
-.LASF2930:
+.LASF2944:
 	.string	"start_info"
-.LASF2694:
+.LASF2708:
 	.string	"vm_zone_stat"
-.LASF2829:
+.LASF2843:
 	.string	"init_thread_union"
-.LASF1675:
+.LASF1689:
 	.string	"qc_dqblk"
-.LASF2121:
+.LASF2135:
 	.string	"mmapped"
-.LASF2278:
+.LASF2292:
 	.string	"child_count"
-.LASF1943:
+.LASF1957:
 	.string	"kill_sb"
 .LASF412:
 	.string	"d_op"
-.LASF2518:
+.LASF2532:
 	.string	"unlock_bus"
-.LASF1377:
+.LASF1391:
 	.string	"MIGRATE_ASYNC"
 .LASF358:
 	.string	"__sched_text_end"
 .LASF439:
 	.string	"i_write_hint"
-.LASF1115:
+.LASF1129:
 	.string	"process_keyring"
-.LASF2582:
+.LASF2596:
 	.string	"page_ext_operations"
-.LASF2664:
+.LASF2678:
 	.string	"KSWAPD_HIGH_WMARK_HIT_QUICKLY"
-.LASF3056:
+.LASF3071:
 	.string	"ebc_state_read"
-.LASF3271:
+.LASF3286:
 	.string	"__stack_chk_fail"
-.LASF2912:
+.LASF2926:
 	.string	"pmic_set_vcom"
-.LASF2700:
+.LASF2714:
 	.string	"stack_guard_gap"
-.LASF3213:
+.LASF3227:
 	.string	"bytes"
-.LASF1739:
+.LASF1753:
 	.string	"gpl_future_crcs"
-.LASF1025:
+.LASF1039:
 	.string	"wait_start"
-.LASF1448:
+.LASF1462:
 	.string	"nr_free"
 .LASF272:
 	.string	"cpu_hwcaps"
@@ -54930,69 +54994,69 @@ __exitcall_ebc_exit:
 	.string	"slash_name"
 .LASF125:
 	.string	"show_fdinfo"
-.LASF2803:
+.LASF2817:
 	.string	"fixup"
 .LASF386:
 	.string	"hash"
-.LASF1247:
+.LASF1261:
 	.string	"freelist"
-.LASF1844:
+.LASF1858:
 	.string	"posix_acl"
 .LASF245:
 	.string	"static_key_mod"
 .LASF168:
 	.string	"bug_addr_disp"
-.LASF1644:
+.LASF1658:
 	.string	"dqi_igrace"
-.LASF2194:
+.LASF2208:
 	.string	"thaw_noirq"
-.LASF970:
+.LASF984:
 	.string	"vm_rb"
-.LASF3030:
+.LASF3045:
 	.string	"kernel_read_file_str"
 .LASF569:
 	.string	"init_user_ns"
-.LASF2448:
+.LASF2462:
 	.string	"add_links"
-.LASF2175:
+.LASF2189:
 	.string	"pm_message_t"
-.LASF2932:
+.LASF2946:
 	.string	"xen_dma_ops"
-.LASF1445:
+.LASF1459:
 	.string	"page_group_by_mobility_disabled"
-.LASF2374:
+.LASF2388:
 	.string	"secondary"
-.LASF2372:
+.LASF2386:
 	.string	"segment_boundary_mask"
-.LASF1468:
+.LASF1482:
 	.string	"NR_INACTIVE_ANON"
 .LASF246:
 	.string	"static_key"
-.LASF968:
+.LASF982:
 	.string	"vm_next"
-.LASF2334:
+.LASF2348:
 	.string	"remove"
 .LASF495:
 	.string	"s_magic"
-.LASF1084:
+.LASF1098:
 	.string	"dl_overrun"
-.LASF2399:
+.LASF2413:
 	.string	"alloc"
 .LASF295:
 	.string	"__entry_text_start"
 .LASF752:
 	.string	"sys_tz"
-.LASF2392:
+.LASF2406:
 	.string	"revmap_direct_max_irq"
 .LASF783:
 	.string	"jiffies_64"
-.LASF2062:
+.LASF2076:
 	.string	"payload"
-.LASF1390:
+.LASF1404:
 	.string	"cb_state"
-.LASF2924:
+.LASF2938:
 	.string	"orig_nents"
-.LASF3073:
+.LASF3088:
 	.string	"buf_addr"
 .LASF413:
 	.string	"d_sb"
@@ -55000,159 +55064,161 @@ __exitcall_ebc_exit:
 	.string	"comm"
 .LASF294:
 	.string	"__kprobes_text_end"
-.LASF2305:
+.LASF2319:
 	.string	"last_time"
 .LASF550:
 	.string	"PIDTYPE_PID"
-.LASF984:
+.LASF998:
 	.string	"events"
-.LASF2233:
+.LASF2247:
 	.string	"offline"
-.LASF1866:
+.LASF1880:
 	.string	"atomic_open"
-.LASF1574:
+.LASF1588:
 	.string	"_zonerefs"
 .LASF143:
 	.string	"panic_on_unrecovered_nmi"
-.LASF1236:
+.LASF1250:
 	.string	"private_lock"
 .LASF434:
 	.string	"i_mtime"
-.LASF2605:
+.LASF2619:
 	.string	"dev_page_fault_t"
-.LASF3101:
+.LASF3116:
 	.string	"ebc_auto_tast_function"
 .LASF24:
 	.string	"__kernel_gid32_t"
-.LASF1462:
+.LASF1476:
 	.string	"NR_BOUNCE"
-.LASF1285:
+.LASF1299:
 	.string	"f_cred"
-.LASF2789:
+.LASF2803:
 	.string	"MODULE_STATE_COMING"
-.LASF2232:
+.LASF2246:
 	.string	"offline_disabled"
-.LASF3197:
+.LASF3212:
 	.string	"of_property_read_u32_array"
-.LASF2477:
+.LASF2491:
 	.string	"select"
 .LASF89:
 	.string	"linux_banner"
-.LASF2388:
+.LASF2402:
 	.string	"host_data"
-.LASF2762:
+.LASF2776:
 	.string	"param_ops_invbool"
-.LASF2517:
+.LASF2531:
 	.string	"trylock_bus"
 .LASF109:
 	.string	"mmap"
 .LASF282:
 	.string	"__bss_stop"
-.LASF1900:
+.LASF1914:
 	.string	"fl_pid"
-.LASF2720:
+.LASF2734:
 	.string	"d_un"
-.LASF1353:
+.LASF1367:
 	.string	"async_put_work"
-.LASF2117:
+.LASF2131:
 	.string	"kernfs_syscall_ops"
-.LASF2989:
+.LASF3003:
 	.string	"ebc_last_display"
-.LASF1858:
+.LASF1872:
 	.string	"mknod"
 .LASF152:
 	.string	"SYSTEM_BOOTING"
-.LASF1601:
+.LASF1615:
 	.string	"max_freq_scale"
-.LASF2925:
+.LASF2939:
 	.string	"dma_direct_ops"
-.LASF2253:
+.LASF2267:
 	.string	"dev_pm_info"
 .LASF27:
 	.string	"__kernel_loff_t"
-.LASF2317:
+.LASF2331:
 	.string	"detach"
 .LASF118:
 	.string	"get_unmapped_area"
-.LASF1264:
+.LASF1278:
 	.string	"dev_pagemap"
-.LASF2649:
+.LASF2663:
 	.string	"PGDEACTIVATE"
-.LASF3114:
+.LASF3129:
 	.string	"buffer_old_tmp"
-.LASF1785:
+.LASF1799:
 	.string	"writepages"
-.LASF1024:
+.LASF1038:
 	.string	"sched_statistics"
 .LASF136:
 	.string	"head"
-.LASF1507:
+.LASF1521:
 	.string	"reclaim_stat"
-.LASF2842:
+.LASF2856:
 	.string	"epd_lut_type"
-.LASF2542:
+.LASF2556:
 	.string	"nmi_ctx"
-.LASF1145:
+.LASF838:
+	.string	"WQ_DFL_ACTIVE"
+.LASF1159:
 	.string	"uprobe_task"
-.LASF1804:
+.LASF1818:
 	.string	"writeback_control"
-.LASF1905:
+.LASF1919:
 	.string	"fl_end"
-.LASF3286:
+.LASF3301:
 	.string	"ebc_find_buf_by_phy_addr"
-.LASF1952:
+.LASF1966:
 	.string	"super_operations"
 .LASF395:
 	.string	"want_pages"
-.LASF2951:
+.LASF2965:
 	.string	"regmap_base"
 .LASF339:
 	.string	"wps_disabled"
-.LASF2405:
+.LASF2419:
 	.string	"unmap_sg"
-.LASF2861:
+.LASF2875:
 	.string	"buf_dsp"
-.LASF2863:
+.LASF2877:
 	.string	"buf_error"
-.LASF1023:
+.LASF1037:
 	.string	"util_avg"
 .LASF759:
 	.string	"task"
 .LASF599:
 	.string	"sched_task_group"
-.LASF2844:
+.LASF2858:
 	.string	"WF_TYPE_GRAY16"
-.LASF2188:
+.LASF2202:
 	.string	"thaw_early"
 .LASF678:
 	.string	"blocked"
 .LASF429:
 	.string	"i_security"
-.LASF2645:
+.LASF2659:
 	.string	"PGSCAN_SKIP_NORMAL"
-.LASF2923:
+.LASF2937:
 	.string	"nents"
 .LASF757:
 	.string	"__smp_cross_call"
-.LASF2771:
+.LASF2785:
 	.string	"core"
-.LASF1816:
+.LASF1830:
 	.string	"bd_holders"
-.LASF3104:
+.LASF3119:
 	.string	"reset_and_flip"
-.LASF2952:
+.LASF2966:
 	.string	"enable"
-.LASF956:
+.LASF970:
 	.string	"pipe_bufs"
-.LASF3218:
+.LASF3232:
 	.string	"to_user"
-.LASF2125:
+.LASF2139:
 	.string	"KOBJ_NS_TYPE_NET"
 .LASF296:
 	.string	"__entry_text_end"
-.LASF1372:
+.LASF1386:
 	.string	"fe_length"
-.LASF1691:
+.LASF1705:
 	.string	"d_rt_spc_warns"
 .LASF309:
 	.string	"__noinstr_text_start"
@@ -55160,507 +55226,511 @@ __exitcall_ebc_exit:
 	.string	"i_verity_info"
 .LASF181:
 	.string	"timespec_type"
-.LASF852:
+.LASF866:
 	.string	"__rb_parent_color"
-.LASF2225:
+.LASF2239:
 	.string	"devres_lock"
-.LASF3141:
+.LASF3156:
 	.string	"new_buffer_refresh"
 .LASF366:
 	.string	"bits"
 .LASF561:
 	.string	"init_struct_pid"
-.LASF2034:
+.LASF2048:
 	.string	"child"
-.LASF1109:
+.LASF1123:
 	.string	"cap_inheritable"
-.LASF1389:
+.LASF1403:
 	.string	"gp_wait"
-.LASF1846:
+.LASF1860:
 	.string	"lookup"
-.LASF1591:
+.LASF1605:
 	.string	"cpu_topology"
-.LASF3222:
+.LASF3236:
 	.string	"sp_el0"
-.LASF3290:
+.LASF3305:
 	.string	"ebc_dsp_buf_get"
-.LASF2901:
+.LASF2915:
 	.string	"panel_color"
-.LASF1897:
+.LASF1911:
 	.string	"fl_owner"
-.LASF2852:
+.LASF2866:
 	.string	"WF_TYPE_GLD16"
-.LASF3001:
+.LASF3016:
 	.string	"is_power_off"
-.LASF980:
+.LASF994:
 	.string	"vm_private_data"
-.LASF1945:
+.LASF1959:
 	.string	"s_lock_key"
-.LASF1201:
+.LASF1215:
 	.string	"uprobe_task_state"
 .LASF207:
 	.string	"ttbr0"
-.LASF2148:
+.LASF2162:
 	.string	"kobj_type"
-.LASF2623:
+.LASF2637:
 	.string	"sysctl_overcommit_kbytes"
-.LASF2973:
+.LASF2987:
 	.string	"frame_left"
-.LASF2480:
+.LASF2494:
 	.string	"deactivate"
-.LASF2847:
+.LASF2861:
 	.string	"WF_TYPE_AUTO"
-.LASF1228:
+.LASF1242:
 	.string	"i_pages"
-.LASF3181:
+.LASF3196:
 	.string	"safe_ptr"
 .LASF377:
 	.string	"hlist_bl_head"
-.LASF1697:
+.LASF1711:
 	.string	"ino_warnlimit"
-.LASF1520:
+.LASF1534:
 	.string	"pfmemalloc_wait"
 .LASF115:
 	.string	"fasync"
-.LASF1710:
+.LASF1724:
 	.string	"i_rt_spc_warnlimit"
-.LASF1370:
+.LASF1384:
 	.string	"fe_logical"
 .LASF807:
 	.string	"WORK_NO_COLOR"
-.LASF986:
+.LASF1000:
 	.string	"page_frag"
-.LASF997:
+.LASF1011:
 	.string	"write_bytes"
-.LASF1997:
+.LASF2011:
 	.string	"fi_extents_mapped"
-.LASF1483:
+.LASF1497:
 	.string	"NR_FILE_PAGES"
 .LASF2:
 	.string	"char"
-.LASF955:
+.LASF969:
 	.string	"unix_inflight"
-.LASF1727:
+.LASF1741:
 	.string	"holders_dir"
-.LASF3075:
+.LASF3090:
 	.string	"__wq_entry"
-.LASF3089:
+.LASF3104:
 	.string	"new_buffer"
 .LASF464:
 	.string	"i_fsnotify_mask"
-.LASF2663:
+.LASF2677:
 	.string	"KSWAPD_LOW_WMARK_HIT_QUICKLY"
-.LASF995:
+.LASF1009:
 	.string	"syscfs"
-.LASF3174:
+.LASF3189:
 	.string	"wake_unlock"
-.LASF2446:
+.LASF2460:
 	.string	"graph_get_port_parent"
-.LASF2683:
+.LASF834:
+	.string	"__WQ_LEGACY"
+.LASF2697:
 	.string	"UNEVICTABLE_PGRESCUED"
-.LASF2210:
+.LASF2224:
 	.string	"msi_list"
-.LASF3224:
+.LASF3238:
 	.string	"__ilog2_u64"
 .LASF548:
 	.string	"compat_time_t"
 .LASF400:
 	.string	"d_alias"
-.LASF1487:
+.LASF1501:
 	.string	"NR_SHMEM"
 .LASF365:
 	.string	"cpumask"
-.LASF2168:
+.LASF2182:
 	.string	"n_klist"
-.LASF1311:
+.LASF1325:
 	.string	"dumper"
-.LASF1740:
+.LASF1754:
 	.string	"num_gpl_future_syms"
-.LASF2276:
+.LASF2290:
 	.string	"wakeirq"
-.LASF848:
+.LASF862:
 	.string	"plist_node"
-.LASF1111:
+.LASF1125:
 	.string	"cap_effective"
-.LASF1747:
+.LASF1761:
 	.string	"taints"
-.LASF3243:
+.LASF3257:
 	.string	"of_address_to_resource"
-.LASF1013:
+.LASF1027:
 	.string	"enqueued"
-.LASF1004:
+.LASF1018:
 	.string	"sum_exec_runtime"
 .LASF166:
 	.string	"hex_asc_upper"
 .LASF507:
 	.string	"s_roots"
-.LASF2913:
+.LASF2927:
 	.string	"dma_data_direction"
-.LASF1690:
+.LASF1704:
 	.string	"d_rt_spc_timer"
-.LASF1958:
+.LASF1972:
 	.string	"evict_inode"
-.LASF1491:
+.LASF1505:
 	.string	"NR_UNSTABLE_NFS"
-.LASF2455:
+.LASF2469:
 	.string	"length"
-.LASF1584:
+.LASF1598:
 	.string	"sysctl_lowmem_reserve_ratio"
-.LASF2157:
+.LASF2171:
 	.string	"buflen"
-.LASF1829:
+.LASF1843:
 	.string	"bd_private"
-.LASF1904:
+.LASF1918:
 	.string	"fl_start"
-.LASF3196:
+.LASF3211:
 	.string	"out_value"
-.LASF1962:
+.LASF1976:
 	.string	"freeze_fs"
-.LASF910:
+.LASF924:
 	.string	"sigset_t"
-.LASF1918:
+.LASF1932:
 	.string	"lm_notify"
-.LASF3153:
+.LASF3168:
 	.string	"ebc_tcon_dsp_mode_set"
-.LASF881:
+.LASF895:
 	.string	"running"
 .LASF724:
 	.string	"rseq_event_mask"
 .LASF496:
 	.string	"s_root"
-.LASF1883:
+.LASF1897:
 	.string	"ra_pages"
 .LASF75:
 	.string	"aarch32_opcode_cond_checks"
 .LASF184:
 	.string	"TT_COMPAT"
-.LASF865:
+.LASF879:
 	.string	"pcpu_fc_names"
-.LASF2373:
+.LASF2387:
 	.string	"fwnode_handle"
-.LASF2729:
+.LASF2743:
 	.string	"Elf64_Sym"
-.LASF2096:
+.LASF2110:
 	.string	"syscall_ops"
 .LASF479:
 	.string	"d_automount"
-.LASF1266:
+.LASF1280:
 	.string	"page_free"
-.LASF3102:
+.LASF3117:
 	.string	"__val"
-.LASF1482:
+.LASF1496:
 	.string	"NR_FILE_MAPPED"
 .LASF640:
 	.string	"parent"
-.LASF1165:
+.LASF1179:
 	.string	"atime"
 .LASF126:
 	.string	"copy_file_range"
-.LASF2686:
+.LASF2700:
 	.string	"UNEVICTABLE_PGCLEARED"
-.LASF3276:
+.LASF3291:
 	.string	"epd_lut_get_wf_version"
-.LASF2048:
+.LASF2062:
 	.string	"key_type"
 .LASF798:
 	.string	"WORK_STRUCT_LINKED_BIT"
-.LASF3215:
+.LASF3229:
 	.string	"copy_overflow"
-.LASF2442:
+.LASF2456:
 	.string	"get_named_child_node"
-.LASF2259:
+.LASF2273:
 	.string	"is_suspended"
-.LASF2921:
+.LASF2935:
 	.string	"dma_length"
-.LASF2067:
+.LASF2081:
 	.string	"burst"
-.LASF1968:
+.LASF1982:
 	.string	"clone_mnt_data"
-.LASF2778:
+.LASF2792:
 	.string	"module_kobject"
-.LASF3051:
+.LASF3066:
 	.string	"memory"
-.LASF3188:
+.LASF3203:
 	.string	"order"
 .LASF740:
 	.string	"active_memcg"
-.LASF1333:
+.LASF1347:
 	.string	"def_flags"
-.LASF3005:
+.LASF3020:
 	.string	"global_ebc"
-.LASF1474:
+.LASF1488:
 	.string	"NR_SLAB_UNRECLAIMABLE"
-.LASF1127:
+.LASF1141:
 	.string	"refcount"
-.LASF1791:
+.LASF1805:
 	.string	"invalidatepage"
-.LASF3079:
+.LASF3094:
 	.string	"ebc_frame_timeout"
 .LASF364:
 	.string	"wait_queue_head_t"
-.LASF1271:
+.LASF1285:
 	.string	"page_type"
-.LASF2050:
+.LASF2064:
 	.string	"rcu_data0"
-.LASF1112:
+.LASF1126:
 	.string	"cap_bset"
-.LASF894:
+.LASF908:
 	.string	"nr_hangs"
-.LASF2254:
+.LASF2268:
 	.string	"power_state"
 .LASF745:
 	.string	"stack_vm_area"
-.LASF2820:
+.LASF2834:
 	.string	"mfd_cell"
-.LASF2886:
+.LASF2900:
 	.string	"EPD_A2"
-.LASF2103:
+.LASF2117:
 	.string	"kernfs_elem_attr"
-.LASF3092:
+.LASF3107:
 	.string	"new_buffer_temp"
-.LASF2300:
+.LASF2314:
 	.string	"set_latency_tolerance"
 .LASF574:
 	.string	"debug_locks_silent"
-.LASF1354:
+.LASF1368:
 	.string	"linux_binfmt"
 .LASF142:
 	.string	"panic_on_oops"
 .LASF271:
 	.string	"arm64_ftr_reg_ctrel0"
-.LASF1245:
+.LASF1259:
 	.string	"counters"
-.LASF3234:
+.LASF3248:
 	.string	"kasan_check_read"
-.LASF2060:
+.LASF2074:
 	.string	"name_link"
 .LASF543:
 	.string	"d_canonical_path"
 .LASF191:
 	.string	"compat_timespec"
-.LASF1490:
+.LASF1504:
 	.string	"NR_ANON_THPS"
 .LASF732:
 	.string	"timer_slack_ns"
-.LASF1914:
+.LASF1928:
 	.string	"lm_compare_owner"
-.LASF2325:
+.LASF2339:
 	.string	"bus_type"
 .LASF600:
 	.string	"policy"
-.LASF1294:
+.LASF1308:
 	.string	"shared"
-.LASF3024:
+.LASF3039:
 	.string	"ebc_match"
-.LASF2950:
+.LASF2964:
 	.string	"dclk"
-.LASF2218:
+.LASF2232:
 	.string	"dma_mem"
 .LASF359:
 	.string	"wait_queue_entry"
-.LASF2320:
+.LASF2334:
 	.string	"dismiss"
-.LASF2027:
+.LASF2041:
 	.string	"simple_dentry_operations"
-.LASF932:
+.LASF946:
 	.string	"_band"
 .LASF596:
 	.string	"boost"
-.LASF2107:
+.LASF2121:
 	.string	"seq_start"
-.LASF2811:
+.LASF2825:
 	.string	"module_sysfs_initialized"
-.LASF1003:
+.LASF1017:
 	.string	"task_cputime"
-.LASF2976:
+.LASF2990:
 	.string	"lut_addr"
-.LASF1197:
+.LASF1211:
 	.string	"rnode"
 .LASF233:
 	.string	"raw_lock"
 .LASF76:
 	.string	"__con_initcall_start"
-.LASF1718:
+.LASF1732:
 	.string	"get_dqblk"
-.LASF3036:
+.LASF829:
+	.string	"WQ_CPU_INTENSIVE"
+.LASF3051:
 	.string	"ebc_tcon_node"
-.LASF2818:
+.LASF2832:
 	.string	"id_entry"
-.LASF1797:
+.LASF1811:
 	.string	"putback_page"
-.LASF2537:
+.LASF2551:
 	.string	"nr_irqs"
-.LASF895:
+.LASF909:
 	.string	"max_hang_time"
-.LASF3177:
+.LASF3192:
 	.string	"copy_from_user"
-.LASF2468:
+.LASF2482:
 	.string	"DOMAIN_BUS_ANY"
-.LASF2072:
+.LASF2086:
 	.string	"root_user"
-.LASF2091:
+.LASF2105:
 	.string	"subdirs"
-.LASF2888:
+.LASF2902:
 	.string	"EPD_DU"
-.LASF1884:
+.LASF1898:
 	.string	"mmap_miss"
-.LASF1655:
+.LASF1669:
 	.string	"quota_format_ops"
-.LASF3288:
+.LASF3303:
 	.string	"ebc_osd_buf_get"
-.LASF3070:
+.LASF3085:
 	.string	"argp"
-.LASF1755:
+.LASF1769:
 	.string	"args"
 .LASF34:
 	.string	"__poll_t"
-.LASF2434:
+.LASF2448:
 	.string	"fwnode_operations"
-.LASF1006:
+.LASF1020:
 	.string	"run_delay"
-.LASF1999:
+.LASF2013:
 	.string	"fi_extents_start"
-.LASF2933:
+.LASF2947:
 	.string	"dummy_dma_ops"
 .LASF239:
 	.string	"static_key_initialized"
-.LASF2785:
+.LASF2799:
 	.string	"module_uevent"
-.LASF3083:
+.LASF3098:
 	.string	"is_full_mode"
-.LASF2598:
+.LASF2612:
 	.string	"base_pfn"
 .LASF262:
 	.string	"width"
-.LASF930:
+.LASF944:
 	.string	"_addr_pkey"
-.LASF3063:
+.LASF3078:
 	.string	"waveform_buffer"
 .LASF297:
 	.string	"__start_rodata"
-.LASF1469:
+.LASF1483:
 	.string	"NR_ACTIVE_ANON"
-.LASF2936:
+.LASF2950:
 	.string	"tcon"
-.LASF1116:
+.LASF1130:
 	.string	"thread_keyring"
-.LASF2746:
+.LASF2760:
 	.string	"kparam_array"
-.LASF3236:
+.LASF3250:
 	.string	"platform_driver_unregister"
 .LASF653:
 	.string	"utime"
-.LASF1335:
+.LASF1349:
 	.string	"start_code"
-.LASF3025:
+.LASF3040:
 	.string	"ebc_driver"
-.LASF2606:
+.LASF2620:
 	.string	"dev_page_free_t"
-.LASF3194:
+.LASF3209:
 	.string	"of_property_read_u32"
-.LASF1399:
+.LASF1413:
 	.string	"guid_t"
 .LASF147:
 	.string	"sysctl_panic_on_stackoverflow"
-.LASF1895:
+.LASF1909:
 	.string	"fl_link"
-.LASF2250:
+.LASF2264:
 	.string	"clock_list"
-.LASF1588:
+.LASF1602:
 	.string	"section_mem_map"
 .LASF310:
 	.string	"__noinstr_text_end"
-.LASF2138:
+.LASF2152:
 	.string	"attrs"
 .LASF177:
 	.string	"tz_minuteswest"
-.LASF2460:
+.LASF2474:
 	.string	"of_chosen"
-.LASF3103:
+.LASF3118:
 	.string	"ebc_frame_start"
 .LASF349:
 	.string	"sve_state"
-.LASF1561:
+.LASF1575:
 	.string	"percpu_drift_mark"
 .LASF367:
 	.string	"cpumask_t"
 .LASF134:
 	.string	"kmsg_fops"
-.LASF3285:
+.LASF3300:
 	.string	"ebc_buf_release"
 .LASF820:
 	.string	"WORK_STRUCT_NO_POOL"
-.LASF1634:
+.LASF1648:
 	.string	"dqb_isoftlimit"
-.LASF2534:
+.LASF2548:
 	.string	"max_read_len"
 .LASF602:
 	.string	"cpus_allowed"
-.LASF1290:
+.LASF1304:
 	.string	"f_tfile_llink"
-.LASF1814:
+.LASF1828:
 	.string	"bd_claiming"
-.LASF2178:
+.LASF2192:
 	.string	"complete"
-.LASF2867:
+.LASF2881:
 	.string	"tid_name"
-.LASF1065:
+.LASF1079:
 	.string	"sched_rt_entity"
 .LASF117:
 	.string	"sendpage"
-.LASF3147:
+.LASF3162:
 	.string	"ret_val"
-.LASF867:
+.LASF881:
 	.string	"timerqueue_node"
 .LASF258:
 	.string	"sign"
-.LASF1628:
+.LASF1642:
 	.string	"mem_dqblk"
-.LASF2773:
+.LASF2787:
 	.string	"plt_entry"
-.LASF3155:
+.LASF3170:
 	.string	"display_mode"
-.LASF1981:
+.LASF1995:
 	.string	"nr_cached_objects"
-.LASF1441:
+.LASF1455:
 	.string	"ia_mtime"
-.LASF1170:
+.LASF1184:
 	.string	"shrink_control"
-.LASF1413:
+.LASF1427:
 	.string	"nr_files"
-.LASF2092:
+.LASF2106:
 	.string	"kernfs_root"
 .LASF730:
 	.string	"nr_dirtied_pause"
-.LASF1498:
+.LASF1512:
 	.string	"NR_ION_HEAP"
-.LASF2754:
+.LASF2768:
 	.string	"param_ops_int"
-.LASF939:
+.LASF953:
 	.string	"_sigchld"
-.LASF1823:
+.LASF1837:
 	.string	"bd_part_count"
 .LASF357:
 	.string	"__sched_text_start"
-.LASF2873:
+.LASF2887:
 	.string	"panel_refresh_mode"
 .LASF91:
 	.string	"linux_proc_banner"
-.LASF2574:
+.LASF2588:
 	.string	"fops"
-.LASF1274:
+.LASF1288:
 	.string	"f_path"
-.LASF3250:
+.LASF3264:
 	.string	"kthread_create_on_node"
 .LASF712:
 	.string	"cgroups"
-.LASF3180:
+.LASF3195:
 	.string	"__uaccess_mask_ptr"
-.LASF2345:
+.LASF2359:
 	.string	"probe_type"
-.LASF1811:
+.LASF1825:
 	.string	"bd_inode"
-.LASF2247:
+.LASF2261:
 	.string	"RPM_REQ_AUTOSUSPEND"
 .LASF268:
 	.string	"sys_val"
@@ -55670,797 +55740,797 @@ __exitcall_ebc_exit:
 	.string	"kptr_restrict"
 .LASF172:
 	.string	"time64_t"
-.LASF2507:
+.LASF2521:
 	.string	"userspace_clients"
-.LASF2144:
+.LASF2158:
 	.string	"uevent_seqnum"
-.LASF3246:
+.LASF3260:
 	.string	"memset"
-.LASF3152:
+.LASF3167:
 	.string	"cur_image_addr"
-.LASF2145:
+.LASF2159:
 	.string	"list_lock"
-.LASF2207:
+.LASF2221:
 	.string	"pm_domain"
-.LASF1098:
+.LASF1112:
 	.string	"cpu_bitmap"
-.LASF858:
+.LASF872:
 	.string	"pcpu_base_addr"
-.LASF1963:
+.LASF1977:
 	.string	"thaw_super"
-.LASF1012:
+.LASF1026:
 	.string	"util_est"
-.LASF1700:
+.LASF1714:
 	.string	"qc_state"
-.LASF2227:
+.LASF2241:
 	.string	"knode_class"
-.LASF1937:
+.LASF1951:
 	.string	"wait_unfrozen"
-.LASF2044:
+.LASF2058:
 	.string	"key_perm_t"
-.LASF2339:
+.LASF2353:
 	.string	"iommu_ops"
-.LASF899:
+.LASF913:
 	.string	"softirq_next_timer"
-.LASF1822:
+.LASF1836:
 	.string	"bd_part"
 .LASF119:
 	.string	"check_flags"
-.LASF1889:
+.LASF1903:
 	.string	"file_lock_operations"
 .LASF344:
 	.string	"tp_value"
-.LASF3033:
+.LASF3048:
 	.string	"ebc_remove"
-.LASF1894:
+.LASF1908:
 	.string	"fl_list"
-.LASF1270:
+.LASF1284:
 	.string	"_mapcount"
-.LASF890:
+.LASF904:
 	.string	"hang_detected"
-.LASF2150:
+.LASF2164:
 	.string	"child_ns_type"
-.LASF1649:
+.LASF1663:
 	.string	"qf_fmt_id"
-.LASF1051:
+.LASF1065:
 	.string	"nr_wakeups_idle"
-.LASF3293:
+.LASF3308:
 	.string	"up_write"
-.LASF1459:
+.LASF1473:
 	.string	"NR_MLOCK"
-.LASF2827:
+.LASF2841:
 	.string	"tasklist_lock"
 .LASF56:
 	.string	"phys_addr_t"
-.LASF1932:
+.LASF1946:
 	.string	"fa_fd"
-.LASF2566:
+.LASF2580:
 	.string	"MEMREMAP_WB"
-.LASF2703:
+.LASF2717:
 	.string	"sysctl_drop_caches"
-.LASF1974:
+.LASF1988:
 	.string	"show_devname"
-.LASF2945:
+.LASF2959:
 	.string	"panel_16bit"
-.LASF1323:
+.LASF1337:
 	.string	"page_table_lock"
-.LASF3023:
+.LASF3038:
 	.string	"ebc_pm"
-.LASF2841:
+.LASF2855:
 	.string	"sched_priority"
-.LASF1657:
+.LASF1671:
 	.string	"read_file_info"
-.LASF2599:
+.LASF2613:
 	.string	"reserve"
-.LASF1772:
+.LASF1786:
 	.string	"quota_info"
-.LASF1017:
+.LASF1031:
 	.string	"load_sum"
 .LASF92:
 	.string	"console_printk"
 .LASF703:
 	.string	"ioac"
-.LASF3208:
+.LASF3222:
 	.string	"__init_work"
-.LASF1172:
+.LASF1186:
 	.string	"nr_to_scan"
-.LASF2633:
+.LASF2647:
 	.string	"PGPGIN"
-.LASF1615:
+.LASF1629:
 	.string	"dq_off"
-.LASF1036:
+.LASF1050:
 	.string	"exec_max"
-.LASF1404:
+.LASF1418:
 	.string	"uuid_index"
-.LASF3209:
+.LASF3223:
 	.string	"onstack"
 .LASF190:
 	.string	"compat_rmtp"
 .LASF437:
 	.string	"i_bytes"
-.LASF2849:
+.LASF2863:
 	.string	"WF_TYPE_GC16"
-.LASF1927:
+.LASF1941:
 	.string	"nfs_fl"
 .LASF403:
 	.string	"dentry"
-.LASF3226:
+.LASF3240:
 	.string	"__be32_to_cpup"
-.LASF2167:
+.LASF2181:
 	.string	"klist_node"
-.LASF1891:
+.LASF1905:
 	.string	"fl_release_private"
-.LASF2884:
+.LASF2898:
 	.string	"EPD_PART_GLD16"
 .LASF107:
 	.string	"unlocked_ioctl"
-.LASF1149:
+.LASF1163:
 	.string	"vm_struct"
-.LASF1310:
+.LASF1324:
 	.string	"nr_threads"
-.LASF1835:
+.LASF1849:
 	.string	"__i_nlink"
 .LASF145:
 	.string	"panic_on_warn"
-.LASF3077:
+.LASF3092:
 	.string	"ebc_panel_probe"
 .LASF80:
 	.string	"boot_command_line"
-.LASF2495:
+.LASF2509:
 	.string	"adapter"
-.LASF2467:
+.LASF2481:
 	.string	"irq_domain_bus_token"
-.LASF1452:
+.LASF1466:
 	.string	"NR_ZONE_LRU_BASE"
-.LASF2205:
+.LASF2219:
 	.string	"links"
-.LASF1869:
+.LASF1883:
 	.string	"bdi_writeback"
-.LASF1686:
+.LASF1700:
 	.string	"d_spc_warns"
-.LASF1041:
+.LASF1055:
 	.string	"nr_failed_migrations_hot"
-.LASF2937:
+.LASF2951:
 	.string	"pmic"
-.LASF1137:
+.LASF1151:
 	.string	"css_set"
-.LASF1403:
+.LASF1417:
 	.string	"guid_index"
-.LASF2978:
+.LASF2992:
 	.string	"ebc_irq_status"
-.LASF2545:
+.LASF2559:
 	.string	"force_irqthreads"
-.LASF1326:
+.LASF1340:
 	.string	"hiwater_rss"
-.LASF2165:
+.LASF2179:
 	.string	"power_kobj"
 .LASF492:
 	.string	"s_export_op"
-.LASF1837:
+.LASF1851:
 	.string	"i_rcu"
-.LASF2879:
+.LASF2893:
 	.string	"EPD_FULL_GLD16"
 .LASF156:
 	.string	"SYSTEM_POWER_OFF"
 .LASF748:
 	.string	"futex_exit_mutex"
-.LASF2494:
+.LASF2508:
 	.string	"i2c_client"
-.LASF1567:
+.LASF1581:
 	.string	"compact_blockskip_flush"
-.LASF1681:
+.LASF1695:
 	.string	"d_space"
 .LASF319:
 	.string	"__hibernate_exit_text_end"
-.LASF2172:
+.LASF2186:
 	.string	"pm_power_off_prepare"
-.LASF2055:
+.LASF2069:
 	.string	"graveyard_link"
-.LASF2823:
+.LASF2837:
 	.string	"platform_driver"
-.LASF1147:
+.LASF1161:
 	.string	"xol_vaddr"
 .LASF122:
 	.string	"splice_read"
-.LASF2711:
+.LASF2725:
 	.string	"Elf64_Addr"
-.LASF1689:
+.LASF1703:
 	.string	"d_rt_space"
 .LASF265:
 	.string	"name"
-.LASF3255:
+.LASF3270:
 	.string	"mod_timer"
 .LASF151:
 	.string	"early_boot_irqs_disabled"
 .LASF659:
 	.string	"nvcsw"
-.LASF3049:
+.LASF3064:
 	.string	"ebc_task_init"
-.LASF2833:
+.LASF2847:
 	.string	"KMALLOC_NORMAL"
-.LASF1088:
+.LASF1102:
 	.string	"exp_need_qs"
 .LASF250:
 	.string	"__stop___jump_table"
-.LASF1143:
+.LASF1157:
 	.string	"task_delay_info"
-.LASF1362:
+.LASF1376:
 	.string	"prealloc_pte"
-.LASF1456:
+.LASF1470:
 	.string	"NR_ZONE_ACTIVE_FILE"
-.LASF2390:
+.LASF2404:
 	.string	"bus_token"
 .LASF422:
 	.string	"i_gid"
-.LASF1620:
+.LASF1634:
 	.string	"quota_type"
-.LASF3109:
+.LASF3124:
 	.string	"buffer_old"
-.LASF1537:
+.LASF1551:
 	.string	"high"
 .LASF431:
 	.string	"i_rdev"
-.LASF2029:
+.LASF2043:
 	.string	"simple_dir_inode_operations"
-.LASF1923:
+.LASF1937:
 	.string	"nfs_lock_info"
-.LASF1374:
+.LASF1388:
 	.string	"fe_flags"
 .LASF688:
 	.string	"self_exec_id"
-.LASF1908:
+.LASF1922:
 	.string	"fl_downgrade_time"
-.LASF2985:
+.LASF2999:
 	.string	"auto_frame_count"
-.LASF2105:
+.LASF2119:
 	.string	"kernfs_ops"
-.LASF2982:
+.LASF2996:
 	.string	"auto_image_new"
 .LASF808:
 	.string	"WORK_CPU_UNBOUND"
-.LASF2788:
+.LASF2802:
 	.string	"MODULE_STATE_LIVE"
-.LASF1425:
+.LASF1439:
 	.string	"sysctl_protected_fifos"
-.LASF1060:
+.LASF3013:
+	.string	"auto_buffer_wq"
+.LASF1074:
 	.string	"nr_migrations"
-.LASF967:
+.LASF981:
 	.string	"vm_end"
-.LASF1967:
+.LASF1981:
 	.string	"remount_fs2"
-.LASF2084:
+.LASF2098:
 	.string	"iomem_resource"
-.LASF1898:
+.LASF1912:
 	.string	"fl_flags"
-.LASF2181:
+.LASF2195:
 	.string	"freeze"
-.LASF1458:
+.LASF1472:
 	.string	"NR_ZONE_WRITE_PENDING"
-.LASF1297:
+.LASF1311:
 	.string	"close"
-.LASF3135:
+.LASF3150:
 	.string	"image_fb_data"
-.LASF3047:
+.LASF3062:
 	.string	"klogo_buf"
-.LASF2894:
+.LASF2908:
 	.string	"EPD_POWER_OFF"
-.LASF1502:
+.LASF1516:
 	.string	"zone_reclaim_stat"
-.LASF3008:
+.LASF3023:
 	.string	"ebc_wq"
 .LASF737:
 	.string	"memcg_oom_gfp_mask"
-.LASF3211:
+.LASF3225:
 	.string	"_msecs_to_jiffies"
-.LASF1684:
+.LASF1698:
 	.string	"d_spc_timer"
-.LASF1760:
+.LASF1774:
 	.string	"jump_entries"
-.LASF3219:
+.LASF3233:
 	.string	"test_ti_thread_flag"
-.LASF2256:
+.LASF2270:
 	.string	"async_suspend"
-.LASF2631:
+.LASF2645:
 	.string	"compound_page_dtors"
-.LASF2007:
+.LASF2021:
 	.string	"read_pos"
 .LASF482:
 	.string	"super_block"
-.LASF3182:
+.LASF3197:
 	.string	"__addr"
-.LASF2323:
+.LASF2337:
 	.string	"dma_coherent"
-.LASF1072:
+.LASF1086:
 	.string	"sched_dl_entity"
 .LASF612:
 	.string	"rcu_tasks_holdout_list"
-.LASF1298:
+.LASF1312:
 	.string	"split"
 .LASF710:
 	.string	"cpuset_mem_spread_rotor"
 .LASF797:
 	.string	"WORK_STRUCT_PWQ_BIT"
-.LASF2040:
+.LASF2054:
 	.string	"assoc_array"
 .LASF567:
 	.string	"fs_overflowgid"
-.LASF1617:
+.LASF1631:
 	.string	"dq_dqb"
-.LASF2715:
+.LASF2729:
 	.string	"Elf64_Xword"
-.LASF988:
+.LASF1002:
 	.string	"lock_class_key"
-.LASF1730:
+.LASF1744:
 	.string	"num_syms"
-.LASF2805:
+.LASF2819:
 	.string	"module_notes_attrs"
-.LASF2113:
+.LASF2127:
 	.string	"generation"
 .LASF554:
 	.string	"PIDTYPE_MAX"
-.LASF2769:
+.LASF2783:
 	.string	"plt_max_entries"
-.LASF2404:
+.LASF2418:
 	.string	"map_sg"
-.LASF1160:
+.LASF1174:
 	.string	"nlink"
-.LASF3042:
+.LASF3057:
 	.string	"ulogo_addr_valid"
-.LASF2578:
+.LASF2592:
 	.string	"percpu_ref"
 .LASF93:
 	.string	"devkmsg_log_str"
 .LASF255:
 	.string	"FTR_HIGHER_SAFE"
-.LASF3193:
+.LASF3208:
 	.string	"i2c_get_clientdata"
-.LASF3178:
+.LASF3193:
 	.string	"_copy_to_user"
-.LASF3229:
+.LASF3243:
 	.string	"test_bit"
 .LASF249:
 	.string	"__start___jump_table"
 .LASF784:
 	.string	"jiffies"
-.LASF2275:
+.LASF2289:
 	.string	"wait_queue"
-.LASF1647:
+.LASF1661:
 	.string	"dqi_priv"
 .LASF618:
 	.string	"rss_stat"
 .LASF709:
 	.string	"mems_allowed_seq"
-.LASF1771:
+.LASF1785:
 	.string	"refcnt"
-.LASF3095:
+.LASF3110:
 	.string	"pbuf_new"
-.LASF2182:
+.LASF2196:
 	.string	"thaw"
-.LASF1719:
+.LASF1733:
 	.string	"get_nextdqblk"
 .LASF518:
 	.string	"s_fs_info"
-.LASF1503:
+.LASF1517:
 	.string	"recent_rotated"
-.LASF2171:
+.LASF2185:
 	.string	"pm_power_off"
 .LASF198:
 	.string	"futex"
-.LASF1026:
+.LASF1040:
 	.string	"wait_max"
-.LASF3253:
+.LASF3268:
 	.string	"wakeup_source_add"
-.LASF3171:
+.LASF3186:
 	.string	"ebc_pmic_suspend"
-.LASF1159:
+.LASF1173:
 	.string	"result_mask"
-.LASF2235:
+.LASF2249:
 	.string	"state_synced"
-.LASF2421:
+.LASF2435:
 	.string	"phandle"
-.LASF1664:
+.LASF1678:
 	.string	"dquot_operations"
-.LASF1225:
+.LASF1239:
 	.string	"mapping"
-.LASF3203:
+.LASF3218:
 	.string	"resource_size"
-.LASF3251:
+.LASF3265:
 	.string	"wake_up_process"
-.LASF1355:
+.LASF1369:
 	.string	"kioctx_table"
-.LASF853:
+.LASF867:
 	.string	"rb_right"
-.LASF3113:
+.LASF3128:
 	.string	"buffer_new_tmp"
-.LASF979:
+.LASF993:
 	.string	"vm_file"
-.LASF2696:
+.LASF2710:
 	.string	"vmstat_text"
-.LASF2086:
+.LASF2100:
 	.string	"idr_base"
 .LASF746:
 	.string	"stack_refcount"
 .LASF440:
 	.string	"i_blocks"
-.LASF1522:
+.LASF1536:
 	.string	"kswapd_order"
-.LASF2176:
+.LASF2190:
 	.string	"dev_pm_ops"
-.LASF2781:
+.LASF2795:
 	.string	"module_param_attrs"
-.LASF876:
+.LASF890:
 	.string	"is_rel"
-.LASF2042:
+.LASF2056:
 	.string	"assoc_array_ptr"
 .LASF327:
 	.string	"__initdata_end"
-.LASF2502:
+.LASF2516:
 	.string	"bus_lock"
-.LASF3190:
+.LASF3205:
 	.string	"kmalloc_type"
 .LASF388:
 	.string	"qstr"
-.LASF3112:
+.LASF3127:
 	.string	"gray_new"
-.LASF1093:
+.LASF1107:
 	.string	"futex_state"
-.LASF1479:
+.LASF1493:
 	.string	"WORKINGSET_RESTORE"
 .LASF629:
 	.string	"sched_psi_wake_requeue"
-.LASF3212:
+.LASF3226:
 	.string	"check_copy_size"
 .LASF738:
 	.string	"memcg_oom_order"
 .LASF707:
 	.string	"acct_timexpd"
-.LASF1407:
+.LASF1421:
 	.string	"__rcu_icq_cache"
 .LASF146:
 	.string	"sysctl_panic_on_rcu_stall"
-.LASF987:
+.LASF1001:
 	.string	"size"
-.LASF1544:
+.LASF1558:
 	.string	"ZONE_DMA32"
-.LASF2301:
+.LASF2315:
 	.string	"wakeup_source"
-.LASF1283:
+.LASF1297:
 	.string	"f_pos"
-.LASF1484:
+.LASF1498:
 	.string	"NR_FILE_DIRTY"
 .LASF19:
 	.string	"__kernel_long_t"
 .LASF727:
 	.string	"task_frag"
-.LASF1990:
+.LASF2004:
 	.string	"datalen"
-.LASF1049:
+.LASF1063:
 	.string	"nr_wakeups_affine_attempts"
-.LASF1467:
+.LASF1481:
 	.string	"NR_LRU_BASE"
-.LASF1742:
+.LASF1756:
 	.string	"extable"
-.LASF1770:
+.LASF1784:
 	.string	"exit"
-.LASF1564:
+.LASF1578:
 	.string	"compact_considered"
-.LASF2742:
+.LASF2756:
 	.string	"kernel_param_ops"
 .LASF443:
 	.string	"dirtied_when"
-.LASF2560:
+.LASF2574:
 	.string	"swapper_pg_dir"
 .LASF337:
 	.string	"suspended_step"
 .LASF251:
 	.string	"static_key_false"
-.LASF1239:
+.LASF1253:
 	.string	"pobjects"
-.LASF1799:
+.LASF1813:
 	.string	"is_partially_uptodate"
-.LASF1234:
+.LASF1248:
 	.string	"writeback_index"
-.LASF1309:
+.LASF1323:
 	.string	"core_state"
-.LASF869:
+.LASF883:
 	.string	"timerqueue_head"
-.LASF3252:
+.LASF3267:
 	.string	"sched_setscheduler_nocheck"
-.LASF1292:
+.LASF1306:
 	.string	"f_wb_err"
-.LASF3206:
-	.string	"schedule_work"
-.LASF2431:
+.LASF2445:
 	.string	"rt_mutex"
-.LASF991:
+.LASF1005:
 	.string	"rchar"
-.LASF3163:
+.LASF3178:
 	.string	"valid_dma_direction"
-.LASF1819:
+.LASF1833:
 	.string	"bd_contains"
-.LASF1140:
+.LASF1154:
 	.string	"futex_pi_state"
-.LASF1158:
+.LASF1172:
 	.string	"kstat"
 .LASF23:
 	.string	"__kernel_uid32_t"
-.LASF2525:
+.LASF2539:
 	.string	"get_bus_free"
 .LASF32:
 	.string	"__le32"
 .LASF433:
 	.string	"i_atime"
-.LASF838:
+.LASF852:
 	.string	"pte_t"
-.LASF1258:
+.LASF1272:
 	.string	"_pt_pad_1"
-.LASF1260:
+.LASF1274:
 	.string	"_pt_pad_2"
-.LASF2977:
+.LASF2991:
 	.string	"buf_align16"
-.LASF2813:
+.LASF2827:
 	.string	"cpuhp_tasks_frozen"
-.LASF1924:
+.LASF1938:
 	.string	"nlm_lockowner"
-.LASF2342:
+.LASF2356:
 	.string	"device_driver"
 .LASF668:
 	.string	"real_cred"
 .LASF809:
 	.string	"WORK_STRUCT_FLAG_BITS"
-.LASF2449:
+.LASF2463:
 	.string	"fwnode_endpoint"
-.LASF3076:
+.LASF3091:
 	.string	"__int"
-.LASF953:
+.LASF967:
 	.string	"epoll_watches"
-.LASF2678:
+.LASF2692:
 	.string	"KCOMPACTD_WAKE"
-.LASF3130:
+.LASF3145:
 	.string	"refresh_new_image"
-.LASF2075:
+.LASF2089:
 	.string	"non_rcu"
-.LASF2639:
+.LASF2653:
 	.string	"PGALLOC_NORMAL"
 .LASF369:
 	.string	"__cpu_possible_mask"
 .LASF787:
 	.string	"timekeeping_suspended"
-.LASF1527:
+.LASF1541:
 	.string	"kcompactd_wait"
-.LASF1631:
+.LASF1645:
 	.string	"dqb_curspace"
 .LASF805:
 	.string	"WORK_STRUCT_STATIC"
-.LASF1387:
+.LASF1401:
 	.string	"gp_state"
 .LASF186:
 	.string	"bitset"
-.LASF1021:
+.LASF1035:
 	.string	"load_avg"
-.LASF1306:
+.LASF1320:
 	.string	"access"
-.LASF2492:
+.LASF2506:
 	.string	"i2c_adapter_type"
-.LASF1422:
+.LASF1436:
 	.string	"lease_break_time"
-.LASF1063:
+.LASF1077:
 	.string	"cfs_rq"
-.LASF915:
+.LASF929:
 	.string	"_uid"
 .LASF340:
 	.string	"hbp_break"
-.LASF3038:
+.LASF3053:
 	.string	"pmic_node"
 .LASF139:
 	.string	"panic_blink"
-.LASF2772:
+.LASF2786:
 	.string	"ftrace_trampoline"
-.LASF925:
+.LASF939:
 	.string	"_upper"
 .LASF544:
 	.string	"__UNIQUE_ID_android_kabi_hide23"
-.LASF2675:
+.LASF2689:
 	.string	"COMPACTSTALL"
 .LASF10:
 	.string	"short unsigned int"
-.LASF1222:
+.LASF1236:
 	.string	"__bp_harden_hyp_vecs_end"
 .LASF781:
 	.string	"tick_usec"
-.LASF1827:
+.LASF1841:
 	.string	"bd_bdi"
-.LASF2716:
+.LASF2730:
 	.string	"Elf64_Sxword"
-.LASF1941:
+.LASF1955:
 	.string	"mount2"
-.LASF1951:
+.LASF1965:
 	.string	"i_mutex_dir_key"
-.LASF1406:
+.LASF1420:
 	.string	"q_node"
-.LASF2512:
+.LASF2526:
 	.string	"master_xfer"
-.LASF2327:
+.LASF2341:
 	.string	"dev_root"
-.LASF1696:
+.LASF1710:
 	.string	"spc_warnlimit"
-.LASF1495:
+.LASF1509:
 	.string	"NR_WRITTEN"
-.LASF2583:
+.LASF2597:
 	.string	"need"
 .LASF505:
 	.string	"s_encoding"
-.LASF3207:
+.LASF3221:
 	.string	"queue_work"
-.LASF1735:
+.LASF1749:
 	.string	"gpl_crcs"
-.LASF1721:
+.LASF1735:
 	.string	"get_state"
-.LASF3166:
+.LASF3181:
 	.string	"dma_handle"
-.LASF1360:
+.LASF1374:
 	.string	"orig_pte"
-.LASF2760:
+.LASF2774:
 	.string	"param_ops_bool"
-.LASF2461:
+.LASF2475:
 	.string	"of_aliases"
-.LASF1635:
+.LASF1649:
 	.string	"dqb_curinodes"
-.LASF1465:
+.LASF1479:
 	.string	"NR_VM_ZONE_STAT_ITEMS"
-.LASF1053:
+.LASF1067:
 	.string	"load"
 .LASF5:
 	.string	"__s8"
 .LASF353:
 	.string	"fault_code"
-.LASF3016:
+.LASF3031:
 	.string	"dev_attr_waveform_version"
-.LASF2212:
+.LASF2226:
 	.string	"dma_mask"
-.LASF2119:
+.LASF2133:
 	.string	"prealloc_mutex"
-.LASF2474:
+.LASF2488:
 	.string	"DOMAIN_BUS_FSL_MC_MSI"
-.LASF1466:
+.LASF1480:
 	.string	"node_stat_item"
-.LASF2496:
+.LASF2510:
 	.string	"init_irq"
-.LASF1092:
+.LASF1106:
 	.string	"__UNIQUE_ID_android_kabi_hide46"
-.LASF1094:
+.LASF1108:
 	.string	"__UNIQUE_ID_android_kabi_hide47"
-.LASF1340:
+.LASF1354:
 	.string	"start_stack"
-.LASF2074:
+.LASF2088:
 	.string	"init_groups"
-.LASF1912:
+.LASF1926:
 	.string	"android_reserved1"
 .LASF313:
 	.string	"__nosave_end"
-.LASF2038:
+.LASF2052:
 	.string	"event"
 .LASF520:
 	.string	"s_mode"
-.LASF1611:
+.LASF1625:
 	.string	"dq_dqb_lock"
 .LASF21:
 	.string	"__kernel_ulong_t"
-.LASF2607:
+.LASF2621:
 	.string	"max_mapnr"
-.LASF2960:
+.LASF2974:
 	.string	"regmap"
-.LASF2928:
+.LASF2942:
 	.string	"shared_info"
 .LASF773:
 	.string	"read_cntp_tval_el0"
-.LASF2637:
+.LASF2651:
 	.string	"PSWPOUT"
-.LASF1075:
+.LASF1089:
 	.string	"dl_period"
 .LASF810:
 	.string	"WORK_OFFQ_FLAG_BASE"
-.LASF1486:
+.LASF1500:
 	.string	"NR_WRITEBACK_TEMP"
-.LASF2514:
+.LASF2528:
 	.string	"functionality"
-.LASF3117:
+.LASF3132:
 	.string	"clac_part_data_align8"
 .LASF306:
 	.string	"__ctors_end"
-.LASF2267:
+.LASF2281:
 	.string	"wakeup_path"
-.LASF3272:
+.LASF3287:
 	.string	"ebc_buf_state_show"
-.LASF969:
+.LASF983:
 	.string	"vm_prev"
 .LASF274:
 	.string	"arm64_const_caps_ready"
-.LASF1168:
+.LASF1182:
 	.string	"btime"
-.LASF1911:
+.LASF1925:
 	.string	"fl_u"
-.LASF2036:
+.LASF2050:
 	.string	"extra2"
 .LASF6:
 	.string	"__u8"
 .LASF116:
 	.string	"lock"
-.LASF3170:
+.LASF3185:
 	.string	"ebc_pmic_resume"
-.LASF1563:
+.LASF1577:
 	.string	"compact_cached_migrate_pfn"
-.LASF2638:
+.LASF2652:
 	.string	"PGALLOC_DMA32"
-.LASF2756:
+.LASF2770:
 	.string	"param_ops_long"
-.LASF3003:
+.LASF3018:
 	.string	"overlay_start"
-.LASF2956:
+.LASF2970:
 	.string	"frame_addr_set"
-.LASF1078:
+.LASF1092:
 	.string	"runtime"
 .LASF399:
 	.string	"d_wait"
-.LASF2451:
+.LASF2465:
 	.string	"local_fwnode"
-.LASF2749:
+.LASF2763:
 	.string	"__start___param"
-.LASF1181:
+.LASF1195:
 	.string	"list_lru_one"
-.LASF1919:
+.LASF1933:
 	.string	"lm_grant"
 .LASF144:
 	.string	"panic_on_io_nmi"
-.LASF2577:
+.LASF2591:
 	.string	"percpu_ref_func_t"
-.LASF2109:
+.LASF2123:
 	.string	"seq_stop"
-.LASF1250:
+.LASF1264:
 	.string	"compound_dtor"
-.LASF1984:
+.LASF1998:
 	.string	"xattr_handler"
-.LASF1427:
+.LASF1441:
 	.string	"kiocb"
-.LASF2902:
+.LASF2916:
 	.string	"width_mm"
-.LASF1566:
+.LASF1580:
 	.string	"compact_order_failed"
-.LASF1106:
+.LASF1120:
 	.string	"fsuid"
-.LASF3220:
+.LASF3234:
 	.string	"flag"
-.LASF1476:
+.LASF1490:
 	.string	"NR_ISOLATED_FILE"
 .LASF485:
 	.string	"s_blocksize_bits"
-.LASF2296:
+.LASF2310:
 	.string	"active_jiffies"
-.LASF1556:
+.LASF1570:
 	.string	"managed_pages"
-.LASF2590:
+.LASF2604:
 	.string	"__tracepoint_page_ref_set"
-.LASF3159:
+.LASF3174:
 	.string	"ebc_tcon_enable"
-.LASF3299:
+.LASF3314:
 	.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"
-.LASF2621:
+.LASF2635:
 	.string	"sysctl_overcommit_memory"
-.LASF2536:
+.LASF2550:
 	.string	"max_comb_2nd_msg_len"
-.LASF1602:
+.LASF1616:
 	.string	"gfp_allowed_mask"
-.LASF1187:
+.LASF1201:
 	.string	"shrinker_id"
-.LASF2570:
+.LASF2584:
 	.string	"MEMREMAP_DEC"
 .LASF754:
 	.string	"total_cpus"
-.LASF1192:
+.LASF1206:
 	.string	"root"
 .LASF35:
 	.string	"value_offset"
@@ -56468,73 +56538,73 @@ __exitcall_ebc_exit:
 	.string	"oom_reaper_list"
 .LASF354:
 	.string	"debug"
-.LASF1550:
+.LASF1564:
 	.string	"nr_reserved_highatomic"
-.LASF2365:
+.LASF2379:
 	.string	"shutdown_pre"
-.LASF2285:
+.LASF2299:
 	.string	"no_callbacks"
-.LASF2825:
+.LASF2839:
 	.string	"prevent_deferred_probe"
 .LASF9:
 	.string	"__u16"
-.LASF1027:
+.LASF1041:
 	.string	"wait_count"
-.LASF1488:
+.LASF1502:
 	.string	"NR_SHMEM_THPS"
-.LASF1736:
+.LASF1750:
 	.string	"sig_ok"
-.LASF2081:
+.LASF2095:
 	.string	"lpj_fine"
 .LASF504:
 	.string	"s_vop"
-.LASF1651:
+.LASF1665:
 	.string	"qf_owner"
-.LASF3235:
+.LASF3249:
 	.string	"__write_once_size"
-.LASF2832:
+.LASF2846:
 	.string	"kmalloc_cache_type"
 .LASF575:
 	.string	"mutex"
-.LASF3198:
+.LASF3213:
 	.string	"out_values"
-.LASF840:
+.LASF854:
 	.string	"pgd_t"
 .LASF601:
 	.string	"nr_cpus_allowed"
-.LASF1461:
+.LASF1475:
 	.string	"NR_KERNEL_STACK_KB"
-.LASF1501:
+.LASF1515:
 	.string	"NR_VM_NODE_STAT_ITEMS"
 .LASF234:
 	.string	"raw_spinlock_t"
-.LASF2939:
+.LASF2953:
 	.string	"vir_width"
-.LASF3223:
+.LASF3237:
 	.string	"INIT_LIST_HEAD"
-.LASF1939:
+.LASF1953:
 	.string	"fs_flags"
-.LASF1793:
+.LASF1807:
 	.string	"freepage"
-.LASF2274:
+.LASF2288:
 	.string	"work"
-.LASF2054:
+.LASF2068:
 	.string	"keytype"
-.LASF952:
+.LASF966:
 	.string	"sigpending"
-.LASF2215:
+.LASF2229:
 	.string	"dma_pfn_offset"
-.LASF1190:
+.LASF1204:
 	.string	"radix_tree_node"
-.LASF3225:
+.LASF3239:
 	.string	"sign_extend64"
-.LASF2314:
+.LASF2328:
 	.string	"wake_irq"
-.LASF3040:
+.LASF3055:
 	.string	"ulogo_addr"
-.LASF860:
+.LASF874:
 	.string	"pcpu_fc"
-.LASF2298:
+.LASF2312:
 	.string	"accounting_timestamp"
 .LASF509:
 	.string	"s_bdev"
@@ -56542,191 +56612,195 @@ __exitcall_ebc_exit:
 	.string	"tz_dsttime"
 .LASF12:
 	.string	"__u32"
-.LASF2660:
+.LASF2674:
 	.string	"PGINODESTEAL"
 .LASF644:
 	.string	"ptraced"
-.LASF2752:
+.LASF2766:
 	.string	"param_ops_short"
-.LASF3267:
+.LASF3282:
 	.string	"of_find_device_by_node"
-.LASF2554:
+.LASF2568:
 	.string	"HRTIMER_SOFTIRQ"
 .LASF802:
 	.string	"WORK_STRUCT_DELAYED"
 .LASF455:
 	.string	"i_sequence"
-.LASF1510:
+.LASF1524:
 	.string	"pgdat"
-.LASF1089:
+.LASF1103:
 	.string	"sigval"
-.LASF2610:
+.LASF2624:
 	.string	"page_cluster"
-.LASF1633:
+.LASF1647:
 	.string	"dqb_ihardlimit"
 .LASF411:
 	.string	"d_lockref"
-.LASF2243:
+.LASF2257:
 	.string	"rpm_request"
-.LASF3069:
+.LASF3084:
 	.string	"ebc_io_ctl"
-.LASF1150:
+.LASF1164:
 	.string	"addr"
-.LASF2386:
+.LASF2400:
 	.string	"device_private"
-.LASF3161:
+.LASF3176:
 	.string	"get_dma_ops"
-.LASF2698:
+.LASF2712:
 	.string	"watermark_scale_factor"
-.LASF1842:
+.LASF1856:
 	.string	"i_dir_seq"
-.LASF2124:
+.LASF2138:
 	.string	"KOBJ_NS_TYPE_NONE"
-.LASF1802:
+.LASF1816:
 	.string	"swap_activate"
-.LASF985:
+.LASF999:
 	.string	"mm_rss_stat"
-.LASF1723:
+.LASF1737:
 	.string	"mkobj"
-.LASF2966:
+.LASF2980:
 	.string	"direct_buf_real_size"
-.LASF3289:
+.LASF3304:
 	.string	"__pm_relax"
 .LASF473:
 	.string	"d_delete"
-.LASF1623:
+.LASF1637:
 	.string	"PRJQUOTA"
-.LASF2070:
+.LASF2084:
 	.string	"begin"
-.LASF2737:
+.LASF2751:
 	.string	"sh_link"
-.LASF3031:
+.LASF836:
+	.string	"WQ_MAX_ACTIVE"
+.LASF3046:
 	.string	"ebc_suspend"
-.LASF2358:
+.LASF2372:
 	.string	"cls_msk"
-.LASF2666:
+.LASF2680:
 	.string	"PGROTATED"
-.LASF1671:
+.LASF1685:
 	.string	"write_info"
-.LASF2160:
+.LASF2174:
 	.string	"kobj_attribute"
-.LASF2280:
+.LASF2294:
 	.string	"idle_notification"
-.LASF1808:
+.LASF1822:
 	.string	"block_device"
-.LASF2123:
+.LASF2137:
 	.string	"kobj_ns_type"
-.LASF2619:
+.LASF2633:
 	.string	"sysctl_user_reserve_kbytes"
-.LASF2817:
+.LASF2831:
 	.string	"num_resources"
-.LASF1576:
+.LASF1590:
 	.string	"notifier_fn_t"
-.LASF3039:
+.LASF3054:
 	.string	"pmic_client"
-.LASF2572:
+.LASF2586:
 	.string	"miscdevice"
+.LASF831:
+	.string	"WQ_POWER_EFFICIENT"
 .LASF656:
 	.string	"time_in_state"
-.LASF3048:
+.LASF3063:
 	.string	"ebc_logo_init"
-.LASF1269:
+.LASF1283:
 	.string	"kill"
-.LASF1030:
+.LASF1044:
 	.string	"iowait_sum"
-.LASF3131:
+.LASF3146:
 	.string	"image_new"
 .LASF15:
 	.string	"__u64"
 .LASF695:
 	.string	"journal_info"
-.LASF2877:
+.LASF2891:
 	.string	"EPD_FULL_GL16"
 .LASF626:
 	.string	"sched_contributes_to_load"
-.LASF1010:
+.LASF1024:
 	.string	"weight"
 .LASF468:
 	.string	"i_private"
-.LASF1986:
+.LASF2000:
 	.string	"serial"
 .LASF112:
 	.string	"flush"
-.LASF2864:
+.LASF2878:
 	.string	"ebc_buf_s"
-.LASF2197:
+.LASF2211:
 	.string	"runtime_suspend"
 .LASF438:
 	.string	"i_blkbits"
-.LASF2456:
+.LASF2470:
 	.string	"value"
-.LASF2997:
+.LASF3011:
 	.string	"frame_timer"
-.LASF1033:
+.LASF1047:
 	.string	"sum_sleep_runtime"
-.LASF3044:
+.LASF3059:
 	.string	"ulogo_addr_str"
-.LASF3105:
+.LASF3120:
 	.string	"flip"
-.LASF1079:
+.LASF1093:
 	.string	"deadline"
-.LASF964:
+.LASF978:
 	.string	"vmas"
-.LASF1329:
+.LASF1343:
 	.string	"pinned_vm"
-.LASF1515:
+.LASF1529:
 	.string	"node_start_pfn"
-.LASF2548:
+.LASF2562:
 	.string	"NET_TX_SOFTIRQ"
 .LASF704:
 	.string	"psi_flags"
-.LASF1359:
+.LASF1373:
 	.string	"address"
-.LASF1831:
+.LASF1845:
 	.string	"bd_fsfreeze_mutex"
-.LASF1235:
+.LASF1249:
 	.string	"a_ops"
-.LASF2354:
+.LASF2368:
 	.string	"PROBE_FORCE_SYNCHRONOUS"
 .LASF95:
 	.string	"dmesg_restrict"
-.LASF966:
+.LASF980:
 	.string	"vm_start"
 .LASF493:
 	.string	"s_flags"
 .LASF373:
 	.string	"cpumask_var_t"
-.LASF1300:
+.LASF1314:
 	.string	"fault"
 .LASF81:
 	.string	"saved_command_line"
-.LASF2897:
+.LASF2911:
 	.string	"EPD_AUTO_DU4"
-.LASF1976:
+.LASF1990:
 	.string	"show_stats"
-.LASF1077:
+.LASF1091:
 	.string	"dl_density"
-.LASF1660:
+.LASF1674:
 	.string	"read_dqblk"
-.LASF1616:
+.LASF1630:
 	.string	"dq_flags"
-.LASF3108:
+.LASF3123:
 	.string	"buffer_new"
 .LASF213:
 	.string	"user_fpsimd_state"
-.LASF3266:
+.LASF3281:
 	.string	"device_create_file"
 .LASF521:
 	.string	"s_time_gran"
-.LASF2364:
+.LASF2378:
 	.string	"dev_release"
-.LASF1365:
+.LASF1379:
 	.string	"kernel_cap_t"
 .LASF576:
 	.string	"wait_list"
-.LASF2281:
+.LASF2295:
 	.string	"request_pending"
-.LASF873:
+.LASF887:
 	.string	"hrtimer"
 .LASF494:
 	.string	"s_iflags"
@@ -56736,129 +56810,129 @@ __exitcall_ebc_exit:
 	.string	"i_dio_count"
 .LASF510:
 	.string	"s_bdi"
-.LASF2857:
+.LASF2871:
 	.string	"wf_table"
-.LASF3137:
+.LASF3152:
 	.string	"image_new_tmp"
-.LASF1732:
+.LASF1746:
 	.string	"num_kp"
-.LASF3298:
+.LASF3313:
 	.string	"__pm_stay_awake"
-.LASF2565:
+.LASF2579:
 	.string	"vmap_area_list"
-.LASF3011:
+.LASF3026:
 	.string	"ebc_auto_thread_sem"
 .LASF630:
 	.string	"in_execve"
-.LASF2246:
+.LASF2260:
 	.string	"RPM_REQ_SUSPEND"
 .LASF483:
 	.string	"s_list"
-.LASF1632:
+.LASF1646:
 	.string	"dqb_rsvspace"
-.LASF1725:
+.LASF1739:
 	.string	"version"
-.LASF2564:
+.LASF2578:
 	.string	"xen_start_flags"
-.LASF2882:
+.LASF2896:
 	.string	"EPD_PART_GL16"
-.LASF1539:
+.LASF1553:
 	.string	"stat_threshold"
-.LASF2363:
+.LASF2377:
 	.string	"class_release"
-.LASF1886:
+.LASF1900:
 	.string	"fu_llist"
 .LASF689:
 	.string	"alloc_lock"
 .LASF514:
 	.string	"s_dquot"
-.LASF826:
+.LASF840:
 	.string	"system_highpri_wq"
-.LASF1194:
+.LASF1208:
 	.string	"tags"
-.LASF1885:
+.LASF1899:
 	.string	"prev_pos"
-.LASF2311:
+.LASF2325:
 	.string	"expire_count"
 .LASF277:
 	.string	"_etext"
 .LASF497:
 	.string	"s_umount"
-.LASF2137:
+.LASF2151:
 	.string	"is_bin_visible"
-.LASF1358:
+.LASF1372:
 	.string	"pgoff"
-.LASF2222:
+.LASF2236:
 	.string	"of_node"
-.LASF2885:
+.LASF2899:
 	.string	"EPD_PART_GCC16"
-.LASF2020:
+.LASF2034:
 	.string	"names_cachep"
 .LASF785:
 	.string	"preset_lpj"
-.LASF2996:
+.LASF3010:
 	.string	"vdd_timer"
-.LASF2221:
+.LASF2235:
 	.string	"archdata"
-.LASF1437:
+.LASF1451:
 	.string	"ia_uid"
-.LASF1367:
+.LASF1381:
 	.string	"__cap_init_eff_set"
 .LASF728:
 	.string	"delays"
 .LASF641:
 	.string	"children"
-.LASF1293:
+.LASF1307:
 	.string	"rb_subtree_last"
-.LASF2269:
+.LASF2283:
 	.string	"no_pm_callbacks"
-.LASF1598:
+.LASF1612:
 	.string	"llc_sibling"
-.LASF2671:
+.LASF2685:
 	.string	"PGMIGRATE_FAIL"
-.LASF2436:
+.LASF2450:
 	.string	"device_get_match_data"
 .LASF650:
 	.string	"vfork_done"
 .LASF199:
 	.string	"nanosleep"
-.LASF1416:
+.LASF1430:
 	.string	"inodes_stat_t"
-.LASF843:
+.LASF857:
 	.string	"pud_t"
-.LASF2815:
+.LASF2829:
 	.string	"platform_device"
-.LASF1695:
+.LASF1709:
 	.string	"rt_spc_timelimit"
 .LASF221:
 	.string	"tail"
-.LASF1440:
+.LASF1454:
 	.string	"ia_atime"
-.LASF2544:
+.LASF2558:
 	.string	"irq_default_affinity"
 .LASF725:
 	.string	"tlb_ubc"
-.LASF2416:
+.LASF2430:
 	.string	"remap"
-.LASF1648:
+.LASF1662:
 	.string	"quota_format_type"
-.LASF2816:
+.LASF2830:
 	.string	"id_auto"
-.LASF1179:
+.LASF1193:
 	.string	"seeks"
 .LASF577:
 	.string	"task_struct"
-.LASF2903:
+.LASF2917:
 	.string	"height_mm"
-.LASF2640:
+.LASF2654:
 	.string	"PGALLOC_MOVABLE"
-.LASF2272:
+.LASF2286:
 	.string	"suspend_timer"
-.LASF1989:
+.LASF2003:
 	.string	"quotalen"
-.LASF2410:
+.LASF2424:
 	.string	"sync_sg_for_cpu"
-.LASF1529:
+.LASF1543:
 	.string	"totalreserve_pages"
 .LASF450:
 	.string	"i_wb_frn_history"
@@ -56870,59 +56944,59 @@ __exitcall_ebc_exit:
 	.string	"WORK_OFFQ_LEFT"
 .LASF223:
 	.string	"arch_spinlock_t"
-.LASF1246:
+.LASF1260:
 	.string	"slab_cache"
-.LASF1129:
+.LASF1143:
 	.string	"nr_tasks"
-.LASF2508:
+.LASF2522:
 	.string	"bus_recovery_info"
-.LASF1325:
+.LASF1339:
 	.string	"mmlist"
-.LASF1720:
+.LASF1734:
 	.string	"set_dqblk"
-.LASF1244:
+.LASF1258:
 	.string	"s_mem"
-.LASF2240:
+.LASF2254:
 	.string	"RPM_RESUMING"
 .LASF471:
 	.string	"d_weak_revalidate"
-.LASF2991:
+.LASF3005:
 	.string	"prev_dsp_buf"
-.LASF1493:
+.LASF1507:
 	.string	"NR_VMSCAN_IMMEDIATE"
 .LASF513:
 	.string	"s_quota_types"
-.LASF1455:
+.LASF1469:
 	.string	"NR_ZONE_INACTIVE_FILE"
-.LASF2473:
+.LASF2487:
 	.string	"DOMAIN_BUS_IPI"
-.LASF1314:
+.LASF1328:
 	.string	"vmacache_seqnum"
 .LASF762:
 	.string	"setup_max_cpus"
-.LASF1834:
+.LASF1848:
 	.string	"i_nlink"
-.LASF2946:
+.LASF2960:
 	.string	"mirror"
-.LASF1788:
+.LASF1802:
 	.string	"write_begin"
-.LASF2229:
+.LASF2243:
 	.string	"groups"
 .LASF694:
 	.string	"pi_blocked_on"
-.LASF3035:
+.LASF3050:
 	.string	"ebc_probe"
 .LASF501:
 	.string	"s_xattr"
-.LASF3045:
+.LASF3060:
 	.string	"klogo_addr_str"
-.LASF993:
+.LASF1007:
 	.string	"syscr"
-.LASF1947:
+.LASF1961:
 	.string	"s_vfs_rename_key"
-.LASF1433:
+.LASF1447:
 	.string	"ki_ioprio"
-.LASF1163:
+.LASF1177:
 	.string	"attributes_mask"
 .LASF200:
 	.string	"restart_block"
@@ -56930,229 +57004,231 @@ __exitcall_ebc_exit:
 	.string	"umode_t"
 .LASF201:
 	.string	"memstart_addr"
-.LASF2643:
+.LASF2657:
 	.string	"ALLOCSTALL_MOVABLE"
 .LASF743:
 	.string	"pagefault_disabled"
-.LASF994:
+.LASF1008:
 	.string	"syscw"
-.LASF1401:
+.LASF1415:
 	.string	"guid_null"
 .LASF224:
 	.string	"wlocked"
-.LASF2690:
+.LASF2704:
 	.string	"NR_VM_EVENT_ITEMS"
-.LASF1961:
+.LASF1975:
 	.string	"freeze_super"
 .LASF538:
 	.string	"s_inode_list_lock"
-.LASF2600:
+.LASF2614:
 	.string	"align"
-.LASF3116:
+.LASF3131:
 	.string	"frame_idx"
 .LASF204:
 	.string	"mm_segment_t"
-.LASF2758:
+.LASF2772:
 	.string	"param_ops_ullong"
-.LASF1910:
+.LASF1924:
 	.string	"fl_lmops"
-.LASF2819:
+.LASF2833:
 	.string	"driver_override"
-.LASF1015:
+.LASF1029:
 	.string	"sched_avg"
-.LASF1714:
+.LASF1728:
 	.string	"quota_enable"
-.LASF1548:
+.LASF1562:
 	.string	"zone"
-.LASF1796:
+.LASF1810:
 	.string	"isolate_page"
 .LASF664:
 	.string	"maj_flt"
 .LASF229:
 	.string	"arch_rwlock_t"
-.LASF3287:
+.LASF3302:
 	.string	"ebc_osd_buf_clone"
 .LASF162:
 	.string	"c_false"
-.LASF900:
+.LASF914:
 	.string	"clock_base"
-.LASF2910:
+.LASF2924:
 	.string	"pmic_read_temperature"
-.LASF1798:
+.LASF1812:
 	.string	"launder_page"
-.LASF1843:
+.LASF1857:
 	.string	"cdev"
-.LASF1064:
+.LASF1078:
 	.string	"my_q"
 .LASF643:
 	.string	"group_leader"
-.LASF1856:
+.LASF1870:
 	.string	"mkdir"
-.LASF1573:
+.LASF1587:
 	.string	"zonelist"
 .LASF253:
 	.string	"FTR_EXACT"
-.LASF2573:
+.LASF2587:
 	.string	"minor"
-.LASF1699:
+.LASF1713:
 	.string	"nextents"
-.LASF3164:
+.LASF3179:
 	.string	"dma_direction"
 .LASF1:
 	.string	"sizetype"
 .LASF679:
 	.string	"real_blocked"
-.LASF1334:
+.LASF1348:
 	.string	"arg_lock"
-.LASF1741:
+.LASF1755:
 	.string	"num_exentries"
-.LASF3097:
+.LASF3112:
 	.string	"check_out"
-.LASF2609:
+.LASF2623:
 	.string	"high_memory"
 .LASF49:
 	.string	"int32_t"
-.LASF3027:
+.LASF3042:
 	.string	"__exitcall_ebc_exit"
-.LASF1040:
+.LASF1054:
 	.string	"nr_failed_migrations_running"
-.LASF897:
+.LASF911:
 	.string	"next_timer"
 .LASF741:
 	.string	"throttle_queue"
-.LASF3282:
+.LASF3297:
 	.string	"finish_wait"
-.LASF1480:
+.LASF1494:
 	.string	"WORKINGSET_NODERECLAIM"
 .LASF541:
 	.string	"s_inodes_wb"
-.LASF2248:
+.LASF2262:
 	.string	"RPM_REQ_RESUME"
-.LASF2045:
+.LASF2059:
 	.string	"keyring_index_key"
-.LASF3158:
+.LASF833:
+	.string	"__WQ_ORDERED"
+.LASF3173:
 	.string	"ebc_tcon_disable"
-.LASF1421:
+.LASF1435:
 	.string	"leases_enable"
 .LASF227:
 	.string	"qrwlock"
-.LASF2688:
+.LASF2702:
 	.string	"SWAP_RA"
-.LASF829:
+.LASF843:
 	.string	"system_freezable_wq"
-.LASF1880:
+.LASF1894:
 	.string	"file_ra_state"
-.LASF949:
+.LASF963:
 	.string	"user_struct"
-.LASF2366:
+.LASF2380:
 	.string	"ns_type"
-.LASF2889:
+.LASF2903:
 	.string	"EPD_DU4"
 .LASF589:
 	.string	"on_rq"
-.LASF2340:
+.LASF2354:
 	.string	"lock_key"
-.LASF2563:
+.LASF2577:
 	.string	"tramp_pg_dir"
-.LASF3020:
+.LASF3035:
 	.string	"dev_attr_ebc_version"
-.LASF864:
+.LASF878:
 	.string	"PCPU_FC_NR"
-.LASF2120:
+.LASF2134:
 	.string	"prealloc_buf"
-.LASF2378:
+.LASF2392:
 	.string	"DL_DEV_DRIVER_BOUND"
-.LASF842:
+.LASF856:
 	.string	"pgprot_t"
-.LASF1957:
+.LASF1971:
 	.string	"drop_inode"
-.LASF1767:
+.LASF1781:
 	.string	"num_trace_evals"
-.LASF2337:
+.LASF2351:
 	.string	"num_vf"
-.LASF1535:
+.LASF1549:
 	.string	"isolate_mode_t"
-.LASF3165:
+.LASF3180:
 	.string	"debug_dma_sync_single_for_device"
 .LASF99:
 	.string	"llseek"
-.LASF2377:
+.LASF2391:
 	.string	"DL_DEV_PROBING"
-.LASF1786:
+.LASF1800:
 	.string	"set_page_dirty"
-.LASF1820:
+.LASF1834:
 	.string	"bd_block_size"
-.LASF1661:
+.LASF1675:
 	.string	"commit_dqblk"
-.LASF2151:
+.LASF2165:
 	.string	"namespace"
-.LASF1709:
+.LASF1723:
 	.string	"i_ino_warnlimit"
-.LASF2790:
+.LASF2804:
 	.string	"MODULE_STATE_GOING"
-.LASF1096:
+.LASF1110:
 	.string	"rcu_node"
-.LASF2201:
-	.string	"init_name"
+.LASF830:
+	.string	"WQ_SYSFS"
 .LASF84:
 	.string	"late_time_init"
-.LASF1964:
+.LASF1978:
 	.string	"unfreeze_fs"
-.LASF907:
+.LASF921:
 	.string	"nodemask_t"
-.LASF2228:
+.LASF2242:
 	.string	"class"
-.LASF1892:
+.LASF1906:
 	.string	"file_lock"
 .LASF325:
 	.string	"__idmap_text_end"
-.LASF2970:
+.LASF2984:
 	.string	"frame_total"
 .LASF776:
 	.string	"read_cntvct_el0"
 .LASF243:
 	.string	"target"
-.LASF2546:
+.LASF2560:
 	.string	"HI_SOFTIRQ"
-.LASF3167:
+.LASF3182:
 	.string	"direction"
-.LASF3136:
+.LASF3151:
 	.string	"image_bg_data"
-.LASF958:
+.LASF972:
 	.string	"session_keyring"
 .LASF334:
 	.string	"__boot_cpu_mode"
-.LASF2051:
+.LASF2065:
 	.string	"key_restrict_link_func_t"
-.LASF1485:
+.LASF1499:
 	.string	"NR_WRITEBACK"
-.LASF3122:
+.LASF3137:
 	.string	"frame_count"
 .LASF487:
 	.string	"s_maxbytes"
-.LASF2357:
+.LASF2371:
 	.string	"acpi_device_id"
-.LASF1682:
+.LASF1696:
 	.string	"d_ino_count"
-.LASF2687:
+.LASF2701:
 	.string	"UNEVICTABLE_PGSTRANDED"
-.LASF2491:
+.LASF2505:
 	.string	"i2c_bus_type"
-.LASF885:
+.LASF899:
 	.string	"hrtimer_cpu_base"
-.LASF3294:
+.LASF3309:
 	.string	"ebc_notify"
-.LASF1391:
+.LASF1405:
 	.string	"cb_head"
-.LASF1656:
+.LASF1670:
 	.string	"check_quota_file"
-.LASF1925:
+.LASF1939:
 	.string	"nfs4_lock_info"
-.LASF1991:
+.LASF2005:
 	.string	"restrict_link"
-.LASF2321:
+.LASF2335:
 	.string	"dev_archdata"
-.LASF2022:
+.LASF2036:
 	.string	"def_blk_fops"
 .LASF462:
 	.string	"i_devices"
@@ -57160,459 +57236,459 @@ __exitcall_ebc_exit:
 	.string	"__inittext_end"
 .LASF717:
 	.string	"pi_state_cache"
-.LASF975:
+.LASF989:
 	.string	"anon_vma_chain"
-.LASF1733:
+.LASF1747:
 	.string	"num_gpl_syms"
 .LASF603:
 	.string	"cpus_requested"
-.LASF2594:
+.LASF2608:
 	.string	"__tracepoint_page_ref_mod_unless"
-.LASF3175:
+.LASF3190:
 	.string	"wake_lock_init"
-.LASF1186:
+.LASF1200:
 	.string	"list_lru"
 .LASF216:
 	.string	"fpcr"
-.LASF2100:
+.LASF2114:
 	.string	"target_kn"
-.LASF912:
+.LASF926:
 	.string	"sival_ptr"
 .LASF420:
 	.string	"i_opflags"
 .LASF714:
 	.string	"robust_list"
-.LASF1715:
+.LASF1729:
 	.string	"quota_disable"
-.LASF3064:
+.LASF3079:
 	.string	"waveform_open"
-.LASF2056:
+.LASF2070:
 	.string	"serial_node"
-.LASF1701:
+.LASF1715:
 	.string	"s_incoredqs"
 .LASF477:
 	.string	"d_iput"
 .LASF108:
 	.string	"compat_ioctl"
-.LASF3183:
+.LASF3198:
 	.string	"__range_ok"
 .LASF287:
 	.string	"__start_ro_after_init"
-.LASF2707:
+.LASF2721:
 	.string	"num_poisoned_pages"
-.LASF905:
+.LASF919:
 	.string	"filter"
-.LASF3168:
+.LASF3183:
 	.string	"ebc_pmic_get_vcom"
-.LASF2947:
+.LASF2961:
 	.string	"ebc_tcon"
-.LASF2611:
+.LASF2625:
 	.string	"sysctl_legacy_va_layout"
 .LASF819:
 	.string	"WORK_STRUCT_WQ_DATA_MASK"
-.LASF2380:
+.LASF2394:
 	.string	"dev_links_info"
 .LASF46:
 	.string	"loff_t"
-.LASF2717:
+.LASF2731:
 	.string	"d_val"
 .LASF646:
 	.string	"thread_pid"
 .LASF803:
 	.string	"WORK_STRUCT_PWQ"
-.LASF1497:
+.LASF1511:
 	.string	"NR_UNRECLAIMABLE_PAGES"
-.LASF2513:
+.LASF2527:
 	.string	"smbus_xfer"
-.LASF2764:
+.LASF2778:
 	.string	"param_array_ops"
-.LASF2677:
+.LASF2691:
 	.string	"COMPACTSUCCESS"
-.LASF935:
+.LASF949:
 	.string	"_arch"
-.LASF2727:
+.LASF2741:
 	.string	"st_value"
-.LASF2860:
+.LASF2874:
 	.string	"buf_user"
-.LASF2126:
+.LASF2140:
 	.string	"KOBJ_NS_TYPES"
 .LASF69:
 	.string	"pprev"
 .LASF425:
 	.string	"i_default_acl"
-.LASF1408:
+.LASF1422:
 	.string	"ioc_node"
-.LASF2234:
+.LASF2248:
 	.string	"of_node_reused"
-.LASF2114:
+.LASF2128:
 	.string	"kernfs_node_id"
-.LASF2353:
+.LASF2367:
 	.string	"PROBE_PREFER_ASYNCHRONOUS"
-.LASF1135:
+.LASF1149:
 	.string	"icq_list"
 .LASF25:
 	.string	"__kernel_size_t"
 .LASF616:
 	.string	"active_mm"
-.LASF1436:
+.LASF1450:
 	.string	"ia_mode"
-.LASF1081:
+.LASF1095:
 	.string	"dl_boosted"
-.LASF1178:
+.LASF1192:
 	.string	"batch"
-.LASF1882:
+.LASF1896:
 	.string	"async_size"
 .LASF706:
 	.string	"acct_vm_mem1"
-.LASF2738:
+.LASF2752:
 	.string	"sh_info"
-.LASF2149:
+.LASF2163:
 	.string	"default_attrs"
-.LASF2601:
+.LASF2615:
 	.string	"memory_type"
-.LASF855:
+.LASF869:
 	.string	"rb_root"
-.LASF1046:
+.LASF1060:
 	.string	"nr_wakeups_local"
-.LASF1183:
+.LASF1197:
 	.string	"list_lru_memcg"
-.LASF1777:
+.LASF1791:
 	.string	"WRITE_LIFE_NONE"
-.LASF1776:
+.LASF1790:
 	.string	"WRITE_LIFE_NOT_SET"
-.LASF2750:
+.LASF2764:
 	.string	"__stop___param"
-.LASF2814:
+.LASF2828:
 	.string	"cpu_subsys"
 .LASF680:
 	.string	"saved_sigmask"
 .LASF414:
 	.string	"d_time"
-.LASF2961:
+.LASF2975:
 	.string	"ebc_info"
 .LASF240:
 	.string	"entries"
-.LASF1001:
+.LASF1015:
 	.string	"cpu_id"
-.LASF2954:
+.LASF2968:
 	.string	"dsp_mode_set"
-.LASF2652:
+.LASF2666:
 	.string	"PGMAJFAULT"
-.LASF1547:
+.LASF1561:
 	.string	"__MAX_NR_ZONES"
-.LASF2464:
+.LASF2478:
 	.string	"irq_fwspec"
-.LASF3014:
+.LASF3029:
 	.string	"waveform_ops"
-.LASF1805:
+.LASF1819:
 	.string	"iov_iter"
 .LASF511:
 	.string	"s_mtd"
-.LASF2744:
+.LASF2758:
 	.string	"kparam_string"
-.LASF2206:
+.LASF2220:
 	.string	"power"
 .LASF266:
 	.string	"strict_mask"
-.LASF3281:
+.LASF3296:
 	.string	"init_wait_entry"
-.LASF2787:
+.LASF2801:
 	.string	"module_state"
-.LASF3238:
+.LASF3252:
 	.string	"_dev_info"
 .LASF417:
 	.string	"d_subdirs"
-.LASF1987:
+.LASF2001:
 	.string	"last_used_at"
-.LASF1278:
+.LASF1292:
 	.string	"f_write_hint"
-.LASF1008:
+.LASF1022:
 	.string	"last_queued"
-.LASF1119:
+.LASF1133:
 	.string	"user_ns"
-.LASF2636:
+.LASF2650:
 	.string	"PSWPIN"
 .LASF67:
 	.string	"first"
-.LASF2230:
+.LASF2244:
 	.string	"iommu_group"
 .LASF559:
 	.string	"wait_pidfd"
-.LASF1946:
+.LASF1960:
 	.string	"s_umount_key"
-.LASF2931:
+.LASF2945:
 	.string	"xen_start_info"
-.LASF2458:
+.LASF2472:
 	.string	"of_fwnode_ops"
-.LASF2868:
+.LASF2882:
 	.string	"buf_mode"
-.LASF974:
+.LASF988:
 	.string	"vm_flags"
-.LASF1724:
+.LASF1738:
 	.string	"modinfo_attrs"
-.LASF2503:
+.LASF2517:
 	.string	"mux_lock"
 .LASF197:
 	.string	"has_timeout"
-.LASF2740:
+.LASF2754:
 	.string	"sh_entsize"
 .LASF419:
 	.string	"i_mode"
-.LASF2030:
+.LASF2044:
 	.string	"proc_handler"
-.LASF2220:
+.LASF2234:
 	.string	"removed_mem"
 .LASF248:
 	.string	"jump_label_t"
-.LASF3268:
+.LASF3283:
 	.string	"of_get_property"
-.LASF3149:
+.LASF3164:
 	.string	"ebc_tcon_frame_start"
-.LASF2712:
+.LASF2726:
 	.string	"Elf64_Half"
-.LASF2287:
+.LASF2301:
 	.string	"use_autosuspend"
-.LASF3028:
+.LASF3043:
 	.string	"ebc_init"
 .LASF675:
 	.string	"nsproxy"
-.LASF2255:
+.LASF2269:
 	.string	"can_wakeup"
-.LASF2547:
+.LASF2561:
 	.string	"TIMER_SOFTIRQ"
-.LASF3127:
+.LASF3142:
 	.string	"temp_data"
-.LASF1215:
+.LASF1229:
 	.string	"xol_area"
 .LASF235:
 	.string	"rlock"
-.LASF1888:
+.LASF1902:
 	.string	"fl_owner_t"
-.LASF2732:
+.LASF2746:
 	.string	"sh_type"
-.LASF1104:
+.LASF1118:
 	.string	"euid"
-.LASF1101:
+.LASF1115:
 	.string	"wait"
-.LASF1750:
+.LASF1764:
 	.string	"bug_table"
-.LASF963:
+.LASF977:
 	.string	"seqnum"
 .LASF444:
 	.string	"dirtied_time_when"
-.LASF1896:
+.LASF1910:
 	.string	"fl_block"
-.LASF2702:
+.LASF2716:
 	.string	"init_on_free"
-.LASF1152:
+.LASF1166:
 	.string	"nr_pages"
-.LASF3144:
+.LASF3159:
 	.string	"ebc_power_set"
-.LASF1762:
+.LASF1776:
 	.string	"num_trace_bprintk_fmt"
-.LASF3232:
+.LASF3246:
 	.string	"__fls"
-.LASF1130:
+.LASF1144:
 	.string	"ioprio"
-.LASF2999:
+.LASF3014:
 	.string	"is_early_suspend"
-.LASF1164:
+.LASF1178:
 	.string	"rdev"
-.LASF1237:
+.LASF1251:
 	.string	"private_data"
-.LASF1879:
+.LASF1893:
 	.string	"signum"
 .LASF508:
 	.string	"s_mounts"
 .LASF635:
 	.string	"use_memdelay"
-.LASF1154:
+.LASF1168:
 	.string	"caller"
 .LASF347:
 	.string	"thread_struct"
-.LASF2155:
+.LASF2169:
 	.string	"envp"
 .LASF788:
 	.string	"persistent_clock_is_local"
-.LASF2414:
+.LASF2428:
 	.string	"dma_supported"
-.LASF3200:
+.LASF3215:
 	.string	"dev_set_drvdata"
-.LASF3295:
+.LASF3310:
 	.string	"epd_lut_get"
-.LASF1536:
+.LASF1550:
 	.string	"per_cpu_pages"
-.LASF1167:
+.LASF1181:
 	.string	"ctime"
-.LASF2415:
+.LASF2429:
 	.string	"set_dma_mask"
 .LASF113:
 	.string	"release"
-.LASF2371:
+.LASF2385:
 	.string	"max_segment_size"
 .LASF37:
 	.string	"__kernel_dev_t"
-.LASF2110:
+.LASF2124:
 	.string	"atomic_write_len"
-.LASF1636:
+.LASF1650:
 	.string	"dqb_btime"
-.LASF2394:
+.LASF2408:
 	.string	"revmap_tree"
-.LASF1319:
+.LASF1333:
 	.string	"mm_users"
-.LASF1478:
+.LASF1492:
 	.string	"WORKINGSET_ACTIVATE"
 .LASF516:
 	.string	"s_id"
 .LASF315:
 	.string	"__alt_instructions_end"
-.LASF1463:
+.LASF1477:
 	.string	"NR_ZSPAGES"
 .LASF533:
 	.string	"s_dentry_lru"
-.LASF2550:
+.LASF2564:
 	.string	"BLOCK_SOFTIRQ"
-.LASF1412:
+.LASF1426:
 	.string	"files_stat_struct"
-.LASF3244:
+.LASF3258:
 	.string	"devm_memremap"
-.LASF844:
+.LASF858:
 	.string	"pgtable_t"
-.LASF1034:
+.LASF1048:
 	.string	"block_start"
-.LASF2576:
+.LASF2590:
 	.string	"nodename"
-.LASF1855:
+.LASF1869:
 	.string	"symlink"
-.LASF1575:
+.LASF1589:
 	.string	"mem_map"
-.LASF3090:
+.LASF3105:
 	.string	"old_buffer"
-.LASF2957:
+.LASF2971:
 	.string	"lut_data_set"
 .LASF791:
 	.string	"sysctl_timer_migration"
-.LASF2917:
+.LASF2931:
 	.string	"DMA_NONE"
-.LASF1899:
+.LASF1913:
 	.string	"fl_type"
 .LASF59:
 	.string	"counter"
-.LASF2837:
+.LASF2851:
 	.string	"WAKE_LOCK_SUSPEND"
-.LASF1778:
+.LASF1792:
 	.string	"WRITE_LIFE_SHORT"
-.LASF3227:
+.LASF3241:
 	.string	"__swab32p"
 .LASF286:
 	.string	"_einittext"
-.LASF2425:
+.LASF2439:
 	.string	"_flags"
 .LASF402:
 	.string	"d_rcu"
 .LASF206:
 	.string	"addr_limit"
-.LASF2807:
+.LASF2821:
 	.string	"trace_eval_map"
-.LASF1100:
+.LASF1114:
 	.string	"done"
 .LASF211:
 	.string	"elf_hwcap"
-.LASF2751:
+.LASF2765:
 	.string	"param_ops_byte"
-.LASF1985:
+.LASF1999:
 	.string	"fscrypt_operations"
-.LASF2413:
+.LASF2427:
 	.string	"mapping_error"
-.LASF1136:
+.LASF1150:
 	.string	"release_work"
-.LASF1839:
+.LASF1853:
 	.string	"i_bdev"
-.LASF2695:
+.LASF2709:
 	.string	"vm_node_stat"
-.LASF1940:
+.LASF1954:
 	.string	"mount"
-.LASF2836:
+.LASF2850:
 	.string	"kmalloc_caches"
-.LASF1379:
+.LASF1393:
 	.string	"MIGRATE_SYNC"
-.LASF1983:
+.LASF1997:
 	.string	"export_operations"
 .LASF552:
 	.string	"PIDTYPE_PGID"
-.LASF1722:
+.LASF1736:
 	.string	"rm_xquota"
-.LASF1085:
+.LASF1099:
 	.string	"dl_timer"
-.LASF3277:
+.LASF3292:
 	.string	"remap_pfn_range"
-.LASF2376:
+.LASF2390:
 	.string	"DL_DEV_NO_DRIVER"
 .LASF341:
 	.string	"hbp_watch"
-.LASF2843:
+.LASF2857:
 	.string	"WF_TYPE_RESET"
-.LASF2529:
+.LASF2543:
 	.string	"sda_gpiod"
-.LASF1549:
+.LASF1563:
 	.string	"watermark"
-.LASF2424:
+.LASF2438:
 	.string	"deadprops"
-.LASF3240:
+.LASF3254:
 	.string	"devm_kmalloc"
 .LASF16:
 	.string	"long long unsigned int"
-.LASF1295:
+.LASF1309:
 	.string	"anon_name"
-.LASF1443:
+.LASF1457:
 	.string	"ia_file"
 .LASF264:
 	.string	"arm64_ftr_reg"
-.LASF2485:
+.LASF2499:
 	.string	"irq_domain_simple_ops"
 .LASF469:
 	.string	"dentry_operations"
 .LASF739:
 	.string	"memcg_nr_pages_over_high"
-.LASF1604:
+.LASF1618:
 	.string	"percpu_counter_batch"
 .LASF43:
 	.string	"_Bool"
-.LASF1262:
+.LASF1276:
 	.string	"hmm_data"
-.LASF1031:
+.LASF1045:
 	.string	"sleep_start"
 .LASF663:
 	.string	"min_flt"
-.LASF1874:
+.LASF1888:
 	.string	"flc_lease"
-.LASF2407:
+.LASF2421:
 	.string	"unmap_resource"
-.LASF2994:
+.LASF3008:
 	.string	"wake_lock_is_set"
-.LASF2359:
+.LASF2373:
 	.string	"driver_private"
-.LASF1841:
+.LASF1855:
 	.string	"i_link"
-.LASF1382:
+.LASF1396:
 	.string	"rcu_sync_type"
-.LASF1863:
+.LASF1877:
 	.string	"listxattr"
-.LASF924:
+.LASF938:
 	.string	"_lower"
-.LASF1737:
+.LASF1751:
 	.string	"async_probe_requested"
-.LASF2309:
+.LASF2323:
 	.string	"active_count"
 .LASF280:
 	.string	"_edata"
 .LASF79:
 	.string	"__security_initcall_end"
-.LASF2161:
+.LASF2175:
 	.string	"kobj_sysfs_ops"
-.LASF2891:
+.LASF2905:
 	.string	"EPD_RESET"
-.LASF2370:
+.LASF2384:
 	.string	"device_dma_parameters"
 .LASF215:
 	.string	"fpsr"
@@ -57620,93 +57696,95 @@ __exitcall_ebc_exit:
 	.string	"s_count"
 .LASF470:
 	.string	"d_revalidate"
-.LASF2328:
+.LASF2342:
 	.string	"bus_groups"
-.LASF839:
+.LASF853:
 	.string	"pmd_t"
 .LASF489:
 	.string	"s_op"
-.LASF1612:
+.LASF1626:
 	.string	"dq_count"
 .LASF397:
 	.string	"dentry_stat"
 .LASF72:
 	.string	"pstate_check_t"
-.LASF831:
+.LASF845:
 	.string	"system_freezable_power_efficient_wq"
-.LASF3032:
+.LASF3047:
 	.string	"__func__"
 .LASF57:
 	.string	"resource_size_t"
 .LASF582:
 	.string	"wake_entry"
-.LASF951:
+.LASF965:
 	.string	"processes"
-.LASF1102:
+.LASF1116:
 	.string	"suid"
-.LASF2476:
+.LASF2490:
 	.string	"irq_domain_ops"
-.LASF960:
+.LASF974:
 	.string	"locked_vm"
-.LASF854:
+.LASF868:
 	.string	"rb_left"
-.LASF2108:
+.LASF2122:
 	.string	"seq_next"
 .LASF276:
 	.string	"_stext"
-.LASF1711:
+.LASF1725:
 	.string	"quotactl_ops"
 .LASF536:
 	.string	"s_sync_lock"
-.LASF2303:
+.LASF2317:
 	.string	"total_time"
 .LASF29:
 	.string	"__kernel_clock_t"
 .LASF393:
 	.string	"nr_unused"
-.LASF2920:
+.LASF2934:
 	.string	"dma_address"
-.LASF2616:
+.LASF2630:
 	.string	"mmap_rnd_compat_bits_max"
 .LASF41:
 	.string	"clockid_t"
-.LASF1608:
+.LASF1622:
 	.string	"dq_free"
-.LASF1582:
+.LASF1596:
 	.string	"reboot_notifier_list"
 .LASF687:
 	.string	"parent_exec_id"
-.LASF2504:
+.LASF2518:
 	.string	"retries"
-.LASF2090:
+.LASF2104:
 	.string	"kernfs_elem_dir"
+.LASF825:
+	.string	"WQ_UNBOUND"
 .LASF214:
 	.string	"vregs"
-.LASF2625:
+.LASF2639:
 	.string	"page_entry_size"
-.LASF2980:
+.LASF2994:
 	.string	"lut_data"
-.LASF3066:
+.LASF3081:
 	.string	"ebc_other_init"
-.LASF1447:
+.LASF1461:
 	.string	"free_list"
 .LASF590:
 	.string	"prio"
-.LASF3192:
+.LASF3207:
 	.string	"platform_get_drvdata"
-.LASF2556:
+.LASF2570:
 	.string	"NR_SOFTIRQS"
-.LASF2313:
+.LASF2327:
 	.string	"autosleep_enabled"
 .LASF645:
 	.string	"ptrace_entry"
-.LASF2516:
+.LASF2530:
 	.string	"lock_bus"
-.LASF2023:
+.LASF2037:
 	.string	"def_chr_fops"
 .LASF587:
 	.string	"recent_used_cpu"
-.LASF1761:
+.LASF1775:
 	.string	"num_jump_entries"
 .LASF491:
 	.string	"s_qcop"
@@ -57714,135 +57792,135 @@ __exitcall_ebc_exit:
 	.string	"atomic_t"
 .LASF813:
 	.string	"WORK_OFFQ_FLAG_BITS"
-.LASF3150:
+.LASF3165:
 	.string	"ebc_tcon_image_addr_set"
-.LASF2532:
+.LASF2546:
 	.string	"max_num_msgs"
-.LASF2104:
+.LASF2118:
 	.string	"notify_next"
-.LASF2307:
+.LASF2321:
 	.string	"prevent_sleep_time"
-.LASF2622:
+.LASF2636:
 	.string	"sysctl_overcommit_ratio"
 .LASF203:
 	.string	"kimage_voffset"
 .LASF8:
 	.string	"short int"
-.LASF2355:
+.LASF2369:
 	.string	"of_device_id"
-.LASF2918:
+.LASF2932:
 	.string	"scatterlist"
-.LASF1268:
+.LASF1282:
 	.string	"altmap_valid"
-.LASF3297:
+.LASF3312:
 	.string	"down"
 .LASF102:
 	.string	"read_iter"
 .LASF336:
 	.string	"debug_info"
-.LASF1284:
+.LASF1298:
 	.string	"f_owner"
-.LASF2483:
+.LASF2497:
 	.string	"irq_domain_chip_generic"
-.LASF1384:
+.LASF1398:
 	.string	"RCU_SCHED_SYNC"
-.LASF2585:
+.LASF2599:
 	.string	"tracepoint"
-.LASF2784:
+.LASF2798:
 	.string	"test"
-.LASF2575:
+.LASF2589:
 	.string	"this_device"
-.LASF2006:
+.LASF2020:
 	.string	"pad_until"
 .LASF458:
 	.string	"i_writecount"
 .LASF448:
 	.string	"i_wb_frn_winner"
-.LASF1948:
+.LASF1962:
 	.string	"s_writers_key"
-.LASF1007:
+.LASF1021:
 	.string	"last_arrival"
-.LASF2389:
+.LASF2403:
 	.string	"mapcount"
 .LASF763:
 	.string	"__boot_cpu_id"
-.LASF1585:
+.LASF1599:
 	.string	"numa_zonelist_order"
-.LASF2252:
+.LASF2266:
 	.string	"pm_domain_data"
-.LASF2488:
+.LASF2502:
 	.string	"byte"
-.LASF3263:
+.LASF3278:
 	.string	"__wake_up_sync"
-.LASF2003:
+.LASF2017:
 	.string	"poll_table_struct"
-.LASF1794:
+.LASF1808:
 	.string	"direct_IO"
-.LASF2128:
+.LASF2142:
 	.string	"current_may_mount"
 .LASF382:
 	.string	"seqlock_t"
-.LASF2949:
+.LASF2963:
 	.string	"hclk"
-.LASF2116:
+.LASF2130:
 	.string	"kernfs_iattrs"
-.LASF2911:
+.LASF2925:
 	.string	"pmic_get_vcom"
 .LASF627:
 	.string	"sched_migrated"
-.LASF1243:
+.LASF1257:
 	.string	"frozen"
-.LASF2344:
+.LASF2358:
 	.string	"suppress_bind_attrs"
-.LASF1265:
+.LASF1279:
 	.string	"page_fault"
-.LASF1470:
+.LASF1484:
 	.string	"NR_INACTIVE_FILE"
-.LASF3216:
+.LASF3230:
 	.string	"__ret_warn_on"
-.LASF1626:
+.LASF1640:
 	.string	"kqid"
-.LASF2482:
+.LASF2496:
 	.string	"irq_generic_chip_ops"
-.LASF2059:
+.LASF2073:
 	.string	"index_key"
-.LASF2289:
+.LASF2303:
 	.string	"memalloc_noio"
-.LASF1622:
+.LASF1636:
 	.string	"GRPQUOTA"
-.LASF1581:
+.LASF1595:
 	.string	"rwsem"
-.LASF1435:
+.LASF1449:
 	.string	"ia_valid"
-.LASF1411:
+.LASF1425:
 	.string	"__invalid_size_argument_for_IOC"
-.LASF1241:
+.LASF1255:
 	.string	"inuse"
 .LASF823:
 	.string	"WORKER_DESC_LEN"
-.LASF1692:
+.LASF1706:
 	.string	"qc_type_state"
-.LASF2043:
+.LASF2057:
 	.string	"key_serial_t"
-.LASF1590:
+.LASF1604:
 	.string	"__highest_present_section_nr"
-.LASF2362:
+.LASF2376:
 	.string	"dev_uevent"
-.LASF2783:
+.LASF2797:
 	.string	"setup"
-.LASF1277:
+.LASF1291:
 	.string	"f_lock"
-.LASF2682:
+.LASF2696:
 	.string	"UNEVICTABLE_PGSCANNED"
-.LASF882:
+.LASF896:
 	.string	"active"
-.LASF2479:
+.LASF2493:
 	.string	"xlate"
-.LASF1637:
+.LASF1651:
 	.string	"dqb_itime"
-.LASF1779:
+.LASF1793:
 	.string	"WRITE_LIFE_MEDIUM"
-.LASF2471:
+.LASF2485:
 	.string	"DOMAIN_BUS_PLATFORM_MSI"
 .LASF269:
 	.string	"user_val"
@@ -57850,107 +57928,107 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_LINKED"
 .LASF453:
 	.string	"i_wb_list"
-.LASF2028:
+.LASF2042:
 	.string	"simple_dir_operations"
-.LASF2384:
+.LASF2398:
 	.string	"defer_hook"
 .LASF129:
 	.string	"fadvise"
-.LASF2615:
+.LASF2629:
 	.string	"mmap_rnd_compat_bits_min"
-.LASF2597:
+.LASF2611:
 	.string	"vmem_altmap"
-.LASF1342:
+.LASF1356:
 	.string	"arg_end"
-.LASF2058:
+.LASF2072:
 	.string	"revoked_at"
-.LASF1189:
+.LASF1203:
 	.string	"private_list"
 .LASF261:
 	.string	"shift"
-.LASF1438:
+.LASF1452:
 	.string	"ia_gid"
 .LASF36:
 	.string	"name_offset"
-.LASF2135:
+.LASF2149:
 	.string	"attribute_group"
 .LASF300:
 	.string	"__irqentry_text_end"
-.LASF1347:
+.LASF1361:
 	.string	"context"
-.LASF3121:
+.LASF3136:
 	.string	"get_overlay_image"
-.LASF1541:
+.LASF1555:
 	.string	"per_cpu_nodestat"
-.LASF2521:
+.LASF2535:
 	.string	"get_scl"
-.LASF2602:
+.LASF2616:
 	.string	"MEMORY_DEVICE_PRIVATE"
-.LASF1592:
+.LASF1606:
 	.string	"thread_id"
 .LASF733:
 	.string	"default_timer_slack_ns"
-.LASF3062:
+.LASF3077:
 	.string	"waveform_version_read"
-.LASF1768:
+.LASF1782:
 	.string	"source_list"
 .LASF758:
 	.string	"secondary_data"
-.LASF2244:
+.LASF2258:
 	.string	"RPM_REQ_NONE"
-.LASF981:
+.LASF995:
 	.string	"swap_readahead_info"
-.LASF1128:
+.LASF1142:
 	.string	"active_ref"
-.LASF836:
+.LASF850:
 	.string	"pmdval_t"
-.LASF2523:
+.LASF2537:
 	.string	"get_sda"
-.LASF1120:
+.LASF1134:
 	.string	"group_info"
 .LASF766:
 	.string	"arch_timer_erratum_match_type"
-.LASF2499:
+.LASF2513:
 	.string	"algo"
-.LASF1273:
+.LASF1287:
 	.string	"file"
 .LASF821:
 	.string	"WORK_BUSY_PENDING"
-.LASF2346:
+.LASF2360:
 	.string	"of_match_table"
-.LASF2579:
+.LASF2593:
 	.string	"percpu_count_ptr"
-.LASF3278:
+.LASF3293:
 	.string	"ebc_phy_buf_base_get"
-.LASF2080:
+.LASF2094:
 	.string	"loops_per_jiffy"
-.LASF2511:
+.LASF2525:
 	.string	"i2c_algorithm"
-.LASF2859:
+.LASF2873:
 	.string	"buf_idle"
-.LASF1400:
+.LASF1414:
 	.string	"uuid_t"
-.LASF2438:
+.LASF2452:
 	.string	"property_read_int_array"
-.LASF2983:
+.LASF2997:
 	.string	"auto_image_old"
-.LASF1861:
+.LASF1875:
 	.string	"setattr2"
-.LASF1356:
+.LASF1370:
 	.string	"init_mm"
-.LASF2662:
+.LASF2676:
 	.string	"KSWAPD_INODESTEAL"
-.LASF1176:
+.LASF1190:
 	.string	"count_objects"
-.LASF3231:
+.LASF3245:
 	.string	"fls64"
-.LASF922:
+.LASF936:
 	.string	"_stime"
-.LASF2383:
+.LASF2397:
 	.string	"needs_suppliers"
-.LASF2318:
+.LASF2332:
 	.string	"activate"
-.LASF1525:
+.LASF1539:
 	.string	"kcompactd_max_order"
 .LASF782:
 	.string	"tick_nsec"
@@ -57958,89 +58036,89 @@ __exitcall_ebc_exit:
 	.string	"i_flctx"
 .LASF135:
 	.string	"atomic_notifier_head"
-.LASF1061:
+.LASF1075:
 	.string	"statistics"
-.LASF2938:
+.LASF2952:
 	.string	"current_buffer"
-.LASF3118:
+.LASF3133:
 	.string	"direct_mode_data_change"
-.LASF1619:
+.LASF1633:
 	.string	"kprojid_t"
 .LASF667:
 	.string	"ptracer_cred"
-.LASF2142:
+.LASF2156:
 	.string	"store"
-.LASF1304:
+.LASF1318:
 	.string	"page_mkwrite"
-.LASF2010:
+.LASF2024:
 	.string	"kobject"
-.LASF2411:
+.LASF2425:
 	.string	"sync_sg_for_device"
-.LASF1965:
+.LASF1979:
 	.string	"statfs"
-.LASF3258:
+.LASF3273:
 	.string	"__kmalloc"
-.LASF3247:
+.LASF3261:
 	.string	"_dev_err"
-.LASF3237:
+.LASF3251:
 	.string	"__platform_driver_register"
-.LASF2965:
+.LASF2979:
 	.string	"ebc_buf_real_size"
-.LASF3009:
+.LASF3024:
 	.string	"ebc_thread_wq"
-.LASF1795:
+.LASF1809:
 	.string	"migratepage"
-.LASF2667:
+.LASF2681:
 	.string	"DROP_PAGECACHE"
 .LASF793:
 	.string	"work_struct"
-.LASF2900:
+.LASF2914:
 	.string	"height"
-.LASF1095:
+.LASF1109:
 	.string	"task_group"
-.LASF1070:
+.LASF1084:
 	.string	"on_list"
-.LASF2768:
+.LASF2782:
 	.string	"plt_num_entries"
-.LASF2681:
+.LASF2695:
 	.string	"UNEVICTABLE_PGCULLED"
 .LASF571:
 	.string	"kgid_t"
 .LASF583:
 	.string	"on_cpu"
-.LASF2132:
+.LASF2146:
 	.string	"drop_ns"
-.LASF1423:
+.LASF1437:
 	.string	"sysctl_protected_symlinks"
-.LASF2624:
+.LASF2638:
 	.string	"protection_map"
-.LASF2765:
+.LASF2779:
 	.string	"param_ops_string"
-.LASF2360:
+.LASF2374:
 	.string	"class_groups"
 .LASF290:
 	.string	"__per_cpu_load"
-.LASF1926:
+.LASF1940:
 	.string	"nfs4_lock_state"
-.LASF2806:
+.LASF2820:
 	.string	"trace_event_call"
-.LASF1231:
+.LASF1245:
 	.string	"i_mmap_rwsem"
-.LASF1405:
+.LASF1419:
 	.string	"errseq_t"
-.LASF1350:
+.LASF1364:
 	.string	"ioctx_table"
-.LASF1489:
+.LASF1503:
 	.string	"NR_SHMEM_PMDMAPPED"
-.LASF2535:
+.LASF2549:
 	.string	"max_comb_1st_msg_len"
-.LASF1546:
+.LASF1560:
 	.string	"ZONE_MOVABLE"
-.LASF3013:
+.LASF3028:
 	.string	"ebc_misc"
-.LASF2393:
+.LASF2407:
 	.string	"revmap_size"
-.LASF1902:
+.LASF1916:
 	.string	"fl_wait"
 .LASF685:
 	.string	"audit_context"
@@ -58048,27 +58126,27 @@ __exitcall_ebc_exit:
 	.string	"__per_cpu_start"
 .LASF283:
 	.string	"__init_begin"
-.LASF2141:
+.LASF2155:
 	.string	"sysfs_ops"
-.LASF2865:
+.LASF2879:
 	.string	"phy_addr"
-.LASF2166:
+.LASF2180:
 	.string	"firmware_kobj"
 .LASF292:
 	.string	"__per_cpu_end"
-.LASF2641:
+.LASF2655:
 	.string	"ALLOCSTALL_DMA32"
-.LASF2650:
+.LASF2664:
 	.string	"PGLAZYFREE"
-.LASF1852:
+.LASF1866:
 	.string	"create"
-.LASF1434:
+.LASF1448:
 	.string	"iattr"
 .LASF795:
 	.string	"WORK_STRUCT_PENDING_BIT"
 .LASF721:
 	.string	"rseq"
-.LASF3129:
+.LASF3144:
 	.string	"get_auto_image"
 .LASF196:
 	.string	"nfds"
@@ -58076,43 +58154,43 @@ __exitcall_ebc_exit:
 	.string	"WORK_OFFQ_POOL_SHIFT"
 .LASF720:
 	.string	"perf_event_list"
-.LASF1672:
+.LASF1686:
 	.string	"get_reserved_space"
 .LASF424:
 	.string	"i_acl"
-.LASF1790:
+.LASF1804:
 	.string	"bmap"
-.LASF3245:
+.LASF3259:
 	.string	"ebc_buf_init"
-.LASF2049:
+.LASF2063:
 	.string	"key_payload"
-.LASF2986:
+.LASF3000:
 	.string	"auto_image_osd"
 .LASF481:
 	.string	"d_real"
-.LASF2561:
+.LASF2575:
 	.string	"swapper_pg_end"
-.LASF3017:
+.LASF3032:
 	.string	"dev_attr_pmic_name"
 .LASF632:
 	.string	"in_user_fault"
-.LASF1921:
+.LASF1935:
 	.string	"lm_change"
-.LASF2540:
+.LASF2554:
 	.string	"irq_cpustat_t"
-.LASF1645:
+.LASF1659:
 	.string	"dqi_max_spc_limit"
-.LASF1259:
+.LASF1273:
 	.string	"pmd_huge_pte"
-.LASF2801:
+.LASF2815:
 	.string	"exception_table_entry"
-.LASF1559:
+.LASF1573:
 	.string	"nr_isolate_pageblock"
-.LASF2308:
+.LASF2322:
 	.string	"event_count"
 .LASF208:
 	.string	"preempt_count"
-.LASF1583:
+.LASF1597:
 	.string	"movable_zone"
 .LASF799:
 	.string	"WORK_STRUCT_COLOR_SHIFT"
@@ -58120,187 +58198,187 @@ __exitcall_ebc_exit:
 	.string	"initcall_entry_t"
 .LASF124:
 	.string	"fallocate"
-.LASF1708:
+.LASF1722:
 	.string	"i_spc_warnlimit"
-.LASF3217:
+.LASF3231:
 	.string	"check_object_size"
-.LASF1516:
+.LASF1530:
 	.string	"node_present_pages"
-.LASF1229:
+.LASF1243:
 	.string	"i_mmap_writable"
 .LASF708:
 	.string	"mems_allowed"
-.LASF2260:
+.LASF2274:
 	.string	"is_noirq_suspended"
-.LASF1759:
+.LASF1773:
 	.string	"tracepoints_ptrs"
 .LASF187:
 	.string	"time"
 .LASF585:
 	.string	"wakee_flip_decay_ts"
-.LASF1555:
+.LASF1569:
 	.string	"zone_start_pfn"
 .LASF519:
 	.string	"s_max_links"
-.LASF1044:
+.LASF1058:
 	.string	"nr_wakeups_sync"
-.LASF1751:
+.LASF1765:
 	.string	"kallsyms"
-.LASF1528:
+.LASF1542:
 	.string	"kcompactd"
 .LASF65:
 	.string	"prev"
-.LASF2216:
+.LASF2230:
 	.string	"dma_parms"
-.LASF1121:
+.LASF1135:
 	.string	"fs_struct"
 .LASF192:
 	.string	"clockid"
-.LASF1019:
+.LASF1033:
 	.string	"util_sum"
 .LASF50:
 	.string	"uint32_t"
-.LASF1341:
+.LASF1355:
 	.string	"arg_start"
-.LASF2417:
+.LASF2431:
 	.string	"unremap"
-.LASF2470:
+.LASF2484:
 	.string	"DOMAIN_BUS_PCI_MSI"
-.LASF1169:
+.LASF1183:
 	.string	"blocks"
 .LASF324:
 	.string	"__idmap_text_start"
-.LASF1717:
+.LASF1731:
 	.string	"set_info"
-.LASF3068:
+.LASF3083:
 	.string	"ebc_mmap"
-.LASF2620:
+.LASF2634:
 	.string	"sysctl_admin_reserve_kbytes"
 .LASF789:
 	.string	"timer_list"
-.LASF1685:
+.LASF1699:
 	.string	"d_ino_warns"
-.LASF2501:
+.LASF2515:
 	.string	"lock_ops"
-.LASF1327:
+.LASF1341:
 	.string	"hiwater_vm"
-.LASF3059:
+.LASF3074:
 	.string	"pmic_vcom_read"
-.LASF3239:
+.LASF3253:
 	.string	"misc_deregister"
-.LASF1249:
+.LASF1263:
 	.string	"compound_head"
-.LASF2559:
+.LASF2573:
 	.string	"empty_zero_page"
-.LASF1873:
+.LASF1887:
 	.string	"flc_posix"
 .LASF293:
 	.string	"__kprobes_text_start"
 .LASF26:
 	.string	"__kernel_ssize_t"
-.LASF1212:
+.LASF1226:
 	.string	"orig_ret_vaddr"
 .LASF435:
 	.string	"i_ctime"
-.LASF1817:
+.LASF1831:
 	.string	"bd_write_holder"
-.LASF2195:
+.LASF2209:
 	.string	"poweroff_noirq"
-.LASF3242:
+.LASF3256:
 	.string	"of_parse_phandle"
-.LASF1859:
+.LASF1873:
 	.string	"rename"
-.LASF965:
+.LASF979:
 	.string	"vm_area_struct"
-.LASF2238:
+.LASF2252:
 	.string	"rpm_status"
-.LASF1936:
+.LASF1950:
 	.string	"sb_writers"
-.LASF1694:
+.LASF1708:
 	.string	"ino_timelimit"
 .LASF121:
 	.string	"splice_write"
-.LASF2093:
+.LASF2107:
 	.string	"ino_idr"
-.LASF1707:
+.LASF1721:
 	.string	"i_rt_spc_timelimit"
 .LASF140:
 	.string	"oops_in_progress"
-.LASF3012:
+.LASF3027:
 	.string	"ebc_ops"
-.LASF3041:
+.LASF3056:
 	.string	"klogo_addr"
-.LASF1652:
+.LASF1666:
 	.string	"qf_next"
-.LASF2408:
+.LASF2422:
 	.string	"sync_single_for_cpu"
 .LASF794:
 	.string	"data"
-.LASF3185:
+.LASF3200:
 	.string	"kzalloc"
-.LASF3210:
+.LASF3224:
 	.string	"msecs_to_jiffies"
-.LASF3026:
-	.string	"__addressable_ebc_init2592"
-.LASF1920:
+.LASF1934:
 	.string	"lm_break"
-.LASF1220:
+.LASF3041:
+	.string	"__addressable_ebc_init2595"
+.LASF1234:
 	.string	"hyp_vectors_slot"
-.LASF1240:
+.LASF1254:
 	.string	"slab_list"
-.LASF908:
+.LASF922:
 	.string	"_unused_nodemask_arg_"
 .LASF624:
 	.string	"personality"
-.LASF1826:
+.LASF1840:
 	.string	"bd_queue"
-.LASF3029:
+.LASF3044:
 	.string	"ebc_resume"
-.LASF2830:
+.LASF2844:
 	.string	"init_task"
 .LASF389:
 	.string	"empty_name"
-.LASF1317:
+.LASF1331:
 	.string	"task_size"
 .LASF539:
 	.string	"s_inodes"
-.LASF931:
+.LASF945:
 	.string	"_addr"
-.LASF1589:
+.LASF1603:
 	.string	"pageblock_flags"
-.LASF1346:
+.LASF1360:
 	.string	"binfmt"
-.LASF2239:
+.LASF2253:
 	.string	"RPM_ACTIVE"
 .LASF4:
 	.string	"signed char"
 .LASF376:
 	.string	"rcu_scheduler_active"
-.LASF3195:
+.LASF3210:
 	.string	"propname"
-.LASF2102:
+.LASF2116:
 	.string	"priv"
-.LASF1862:
+.LASF1876:
 	.string	"getattr"
 .LASF613:
 	.string	"sched_info"
-.LASF1676:
+.LASF1690:
 	.string	"d_fieldmask"
-.LASF2004:
+.LASF2018:
 	.string	"seq_file"
-.LASF2193:
+.LASF2207:
 	.string	"freeze_noirq"
-.LASF1494:
+.LASF1508:
 	.string	"NR_DIRTIED"
-.LASF2733:
+.LASF2747:
 	.string	"sh_flags"
 .LASF611:
 	.string	"rcu_tasks_idle_cpu"
-.LASF1658:
+.LASF1672:
 	.string	"write_file_info"
-.LASF1850:
+.LASF1864:
 	.string	"get_acl"
-.LASF1960:
+.LASF1974:
 	.string	"sync_fs"
 .LASF130:
 	.string	"android_kabi_reserved1"
@@ -58310,9 +58388,9 @@ __exitcall_ebc_exit:
 	.string	"android_kabi_reserved3"
 .LASF133:
 	.string	"android_kabi_reserved4"
-.LASF2236:
+.LASF2250:
 	.string	"android_kabi_reserved5"
-.LASF2237:
+.LASF2251:
 	.string	"android_kabi_reserved6"
 .LASF749:
 	.string	"android_kabi_reserved7"
@@ -58324,229 +58402,233 @@ __exitcall_ebc_exit:
 	.string	"init_pid_ns"
 .LASF97:
 	.string	"file_operations"
-.LASF2862:
+.LASF2876:
 	.string	"buf_osd"
-.LASF1746:
+.LASF1760:
 	.string	"arch"
-.LASF2262:
+.LASF2276:
 	.string	"no_pm"
-.LASF2898:
+.LASF2912:
 	.string	"ebc_buf_info"
-.LASF937:
+.LASF951:
 	.string	"_kill"
 .LASF786:
 	.string	"ktime_t"
-.LASF1901:
+.LASF1915:
 	.string	"fl_link_cpu"
-.LASF1728:
+.LASF1742:
 	.string	"syms"
-.LASF1056:
+.LASF1070:
 	.string	"group_node"
-.LASF2112:
+.LASF2126:
 	.string	"kernfs_open_node"
-.LASF1683:
+.LASF1697:
 	.string	"d_ino_timer"
-.LASF1471:
+.LASF1485:
 	.string	"NR_ACTIVE_FILE"
-.LASF2064:
+.LASF2078:
 	.string	"key_sysctls"
-.LASF1338:
+.LASF1352:
 	.string	"end_data"
 .LASF350:
 	.string	"sve_vl"
-.LASF2655:
+.LASF2669:
 	.string	"PGSTEAL_KSWAPD"
-.LASF3043:
+.LASF3058:
 	.string	"klogo_addr_valid"
-.LASF2603:
+.LASF2617:
 	.string	"MEMORY_DEVICE_PUBLIC"
-.LASF2333:
+.LASF2347:
 	.string	"sync_state"
-.LASF1429:
+.LASF1443:
 	.string	"ki_pos"
-.LASF1018:
+.LASF1032:
 	.string	"runnable_load_sum"
-.LASF2319:
+.LASF2333:
 	.string	"sync"
-.LASF2661:
+.LASF2675:
 	.string	"SLABS_SCANNED"
-.LASF1533:
+.LASF1547:
 	.string	"per_cpu_nodestats"
 .LASF123:
 	.string	"setlease"
-.LASF2209:
+.LASF2223:
 	.string	"pins"
-.LASF2795:
+.LASF2809:
 	.string	"ro_size"
-.LASF2270:
+.LASF2284:
 	.string	"must_resume"
 .LASF20:
 	.string	"long int"
-.LASF1558:
+.LASF1572:
 	.string	"present_pages"
-.LASF1870:
+.LASF1884:
 	.string	"file_lock_context"
 .LASF580:
 	.string	"usage"
-.LASF1538:
+.LASF837:
+	.string	"WQ_MAX_UNBOUND_PER_CPU"
+.LASF1552:
 	.string	"per_cpu_pageset"
+.LASF3266:
+	.string	"__alloc_workqueue_key"
 .LASF760:
 	.string	"status"
-.LASF944:
+.LASF958:
 	.string	"si_signo"
-.LASF959:
+.LASF973:
 	.string	"uidhash_node"
 .LASF279:
 	.string	"_sdata"
-.LASF2853:
+.LASF2867:
 	.string	"WF_TYPE_GCC16"
-.LASF2515:
+.LASF2529:
 	.string	"i2c_lock_operations"
-.LASF3146:
+.LASF3161:
 	.string	"ebc_get_4pix_wf_part"
-.LASF1621:
+.LASF1635:
 	.string	"USRQUOTA"
-.LASF2046:
+.LASF2060:
 	.string	"description"
-.LASF2798:
+.LASF2812:
 	.string	"symtab"
-.LASF2922:
+.LASF2936:
 	.string	"sg_table"
-.LASF1125:
+.LASF1139:
 	.string	"rt_mutex_waiter"
-.LASF1966:
+.LASF1980:
 	.string	"remount_fs"
 .LASF488:
 	.string	"s_type"
-.LASF2292:
+.LASF2306:
 	.string	"runtime_status"
 .LASF631:
 	.string	"in_iowait"
-.LASF2587:
+.LASF2601:
 	.string	"unregfunc"
-.LASF2908:
+.LASF2922:
 	.string	"pmic_pm_suspend"
-.LASF1105:
+.LASF1119:
 	.string	"egid"
-.LASF1606:
+.LASF1620:
 	.string	"dq_hash"
-.LASF1473:
+.LASF1487:
 	.string	"NR_SLAB_RECLAIMABLE"
-.LASF1876:
+.LASF1890:
 	.string	"fscrypt_info"
-.LASF1959:
+.LASF1973:
 	.string	"put_super"
-.LASF2430:
+.LASF2444:
 	.string	"max_lock_depth"
-.LASF2452:
+.LASF2466:
 	.string	"fwnode_reference_args"
 .LASF615:
 	.string	"pushable_dl_tasks"
-.LASF1280:
+.LASF1294:
 	.string	"f_flags"
-.LASF1275:
+.LASF1289:
 	.string	"f_inode"
-.LASF2032:
+.LASF2046:
 	.string	"procname"
-.LASF3126:
+.LASF3141:
 	.string	"point_data"
-.LASF3249:
+.LASF3263:
 	.string	"epd_lut_from_file_init"
-.LASF1670:
+.LASF1684:
 	.string	"mark_dirty"
 .LASF761:
 	.string	"__early_cpu_boot_status"
-.LASF2347:
+.LASF2361:
 	.string	"acpi_match_table"
-.LASF1745:
+.LASF1759:
 	.string	"init_layout"
-.LASF1530:
+.LASF1544:
 	.string	"_pad1_"
-.LASF2780:
+.LASF2794:
 	.string	"kobj_completion"
-.LASF2869:
+.LASF2883:
 	.string	"win_x1"
-.LASF2871:
+.LASF2885:
 	.string	"win_x2"
-.LASF2429:
+.LASF2443:
 	.string	"platform_device_id"
 .LASF31:
 	.string	"__kernel_clockid_t"
 .LASF686:
 	.string	"seccomp"
-.LASF3081:
+.LASF3096:
 	.string	"ebc_rst_panel"
-.LASF1792:
+.LASF1806:
 	.string	"releasepage"
-.LASF1703:
+.LASF1717:
 	.string	"qc_info"
-.LASF3082:
+.LASF3097:
 	.string	"ebc_thread"
-.LASF3096:
+.LASF3111:
 	.string	"pbuf_old"
-.LASF2890:
+.LASF2904:
 	.string	"EPD_A2_ENTER"
-.LASF1504:
+.LASF1518:
 	.string	"recent_scanned"
-.LASF2940:
+.LASF2954:
 	.string	"vir_height"
-.LASF1744:
+.LASF1758:
 	.string	"core_layout"
-.LASF1532:
+.LASF1546:
 	.string	"_pad2_"
-.LASF998:
+.LASF1012:
 	.string	"cancelled_write_bytes"
-.LASF2870:
+.LASF2884:
 	.string	"win_y1"
-.LASF2872:
+.LASF2886:
 	.string	"win_y2"
-.LASF3091:
+.LASF3106:
 	.string	"buf_size"
-.LASF2089:
+.LASF2103:
 	.string	"bitmap"
-.LASF1587:
+.LASF1601:
 	.string	"mem_section"
-.LASF1174:
+.LASF1188:
 	.string	"memcg"
-.LASF918:
+.LASF932:
 	.string	"_sigval"
-.LASF2569:
+.LASF2583:
 	.string	"MEMREMAP_ENC"
-.LASF2558:
+.LASF2572:
 	.string	"ksoftirqd"
 .LASF671:
 	.string	"nameidata"
-.LASF1426:
+.LASF1440:
 	.string	"sysctl_protected_regular"
-.LASF2026:
+.LASF2040:
 	.string	"simple_symlink_inode_operations"
-.LASF2797:
+.LASF2811:
 	.string	"mod_kallsyms"
 .LASF356:
 	.string	"sve_max_vl"
-.LASF2866:
+.LASF2880:
 	.string	"virt_addr"
-.LASF1597:
+.LASF1611:
 	.string	"core_sibling"
-.LASF1062:
+.LASF1076:
 	.string	"depth"
-.LASF1569:
+.LASF1583:
 	.string	"_pad3_"
 .LASF362:
 	.string	"wait_queue_func_t"
 .LASF273:
 	.string	"cpu_hwcap_keys"
-.LASF1378:
+.LASF1392:
 	.string	"MIGRATE_SYNC_LIGHT"
-.LASF1038:
+.LASF1052:
 	.string	"nr_migrations_cold"
-.LASF3057:
+.LASF3072:
 	.string	"ebc_version_read"
 .LASF304:
 	.string	"__end_once"
-.LASF2926:
+.LASF2940:
 	.string	"dma_noncoherent_ops"
-.LASF1506:
+.LASF1520:
 	.string	"lists"
 .LASF53:
 	.string	"dma_addr_t"
@@ -58554,127 +58636,127 @@ __exitcall_ebc_exit:
 	.string	"ssize_t"
 .LASF777:
 	.string	"set_next_event_phys"
-.LASF2629:
+.LASF2643:
 	.string	"shmem_enabled_attr"
-.LASF1508:
+.LASF1522:
 	.string	"inactive_age"
-.LASF2604:
+.LASF2618:
 	.string	"MEMORY_DEVICE_FS_DAX"
-.LASF2971:
+.LASF2985:
 	.string	"frame_bw_total"
-.LASF2796:
+.LASF2810:
 	.string	"ro_after_init_size"
-.LASF2047:
+.LASF2061:
 	.string	"desc_len"
 .LASF120:
 	.string	"flock"
-.LASF990:
+.LASF1004:
 	.string	"task_io_accounting"
-.LASF1299:
+.LASF1313:
 	.string	"mremap"
 .LASF515:
 	.string	"s_writers"
-.LASF2845:
+.LASF2859:
 	.string	"WF_TYPE_GRAY4"
-.LASF2584:
+.LASF2598:
 	.string	"tracepoint_func"
-.LASF2154:
+.LASF2168:
 	.string	"argv"
 .LASF361:
 	.string	"entry"
-.LASF1982:
+.LASF1996:
 	.string	"free_cached_objects"
 .LASF824:
 	.string	"workqueue_struct"
 .LASF690:
 	.string	"pi_lock"
-.LASF2822:
+.LASF2836:
 	.string	"platform_bus"
-.LASF883:
+.LASF897:
 	.string	"get_time"
 .LASF665:
 	.string	"cputime_expires"
 .LASF731:
 	.string	"dirty_paused_when"
-.LASF2033:
+.LASF2047:
 	.string	"maxlen"
-.LASF1457:
+.LASF1471:
 	.string	"NR_ZONE_UNEVICTABLE"
-.LASF1757:
+.LASF1771:
 	.string	"percpu_size"
-.LASF1324:
+.LASF1338:
 	.string	"mmap_sem"
-.LASF3279:
+.LASF3294:
 	.string	"schedule"
-.LASF2443:
+.LASF2457:
 	.string	"get_reference_args"
-.LASF2286:
+.LASF2300:
 	.string	"irq_safe"
 .LASF175:
 	.string	"tv_nsec"
 .LASF451:
 	.string	"i_lru"
-.LASF1787:
+.LASF1801:
 	.string	"readpages"
 .LASF257:
 	.string	"arm64_ftr_bits"
-.LASF1572:
+.LASF1586:
 	.string	"zone_idx"
-.LASF1171:
+.LASF1185:
 	.string	"gfp_mask"
 .LASF716:
 	.string	"pi_state_list"
-.LASF1496:
+.LASF1510:
 	.string	"NR_KERNEL_MISC_RECLAIMABLE"
-.LASF1618:
+.LASF1632:
 	.string	"projid_t"
-.LASF1233:
+.LASF1247:
 	.string	"nrexceptional"
-.LASF1118:
+.LASF1132:
 	.string	"user"
-.LASF1781:
+.LASF1795:
 	.string	"WRITE_LIFE_EXTREME"
-.LASF1045:
+.LASF1059:
 	.string	"nr_wakeups_migrate"
-.LASF1646:
+.LASF1660:
 	.string	"dqi_max_ino_limit"
-.LASF1640:
+.LASF1654:
 	.string	"dqi_fmt_id"
-.LASF2397:
+.LASF2411:
 	.string	"dev_pin_info"
-.LASF1375:
+.LASF1389:
 	.string	"fe_reserved"
-.LASF1320:
+.LASF1334:
 	.string	"mm_count"
-.LASF2330:
+.LASF2344:
 	.string	"drv_groups"
 .LASF579:
 	.string	"stack"
-.LASF2418:
+.LASF2432:
 	.string	"dma_coherent_mem"
 .LASF260:
 	.string	"strict"
 .LASF202:
 	.string	"kimage_vaddr"
-.LASF1371:
+.LASF1385:
 	.string	"fe_physical"
 .LASF790:
 	.string	"function"
-.LASF1431:
+.LASF1445:
 	.string	"ki_flags"
-.LASF1392:
+.LASF1406:
 	.string	"gp_type"
-.LASF2974:
+.LASF2988:
 	.string	"part_mode_count"
 .LASF401:
 	.string	"d_in_lookup_hash"
-.LASF1103:
+.LASF1117:
 	.string	"sgid"
-.LASF2131:
+.LASF2145:
 	.string	"initial_ns"
-.LASF2812:
+.LASF2826:
 	.string	"node_devices"
-.LASF857:
+.LASF871:
 	.string	"rb_leftmost"
 .LASF205:
 	.string	"thread_info"
@@ -58682,265 +58764,267 @@ __exitcall_ebc_exit:
 	.string	"set_next_event_virt"
 .LASF173:
 	.string	"timespec"
-.LASF2800:
+.LASF2814:
 	.string	"strtab"
-.LASF2331:
+.LASF2345:
 	.string	"match"
 .LASF231:
 	.string	"lock_stat"
-.LASF2395:
+.LASF2409:
 	.string	"revmap_tree_mutex"
-.LASF3061:
+.LASF3076:
 	.string	"pmic_name_read"
-.LASF1080:
+.LASF1094:
 	.string	"dl_throttled"
 .LASF442:
 	.string	"i_rwsem"
-.LASF1673:
+.LASF1687:
 	.string	"get_projid"
 .LASF625:
 	.string	"sched_reset_on_fork"
-.LASF1523:
+.LASF1537:
 	.string	"kswapd_classzone_idx"
 .LASF212:
 	.string	"__int128 unsigned"
-.LASF1005:
+.LASF1019:
 	.string	"pcount"
-.LASF2196:
+.LASF2210:
 	.string	"restore_noirq"
-.LASF1428:
+.LASF1442:
 	.string	"ki_filp"
-.LASF3120:
+.LASF3135:
 	.string	"clac_full_data_align16"
-.LASF1113:
+.LASF1127:
 	.string	"cap_ambient"
-.LASF2338:
+.LASF2352:
 	.string	"dma_configure"
-.LASF2293:
+.LASF2307:
 	.string	"runtime_error"
-.LASF3072:
+.LASF3087:
 	.string	"temp_offset"
-.LASF950:
+.LASF964:
 	.string	"__count"
 .LASF61:
 	.string	"atomic64_t"
-.LASF976:
+.LASF990:
 	.string	"anon_vma"
-.LASF2283:
+.LASF2297:
 	.string	"runtime_auto"
-.LASF2352:
+.LASF2366:
 	.string	"PROBE_DEFAULT_STRATEGY"
-.LASF2747:
+.LASF2761:
 	.string	"elemsize"
-.LASF3110:
+.LASF3125:
 	.string	"clac_part_data_align16"
-.LASF892:
+.LASF906:
 	.string	"nr_events"
-.LASF2322:
+.LASF2336:
 	.string	"iommu"
 .LASF360:
 	.string	"private"
-.LASF2593:
+.LASF2607:
 	.string	"__tracepoint_page_ref_mod_and_return"
-.LASF2794:
+.LASF2808:
 	.string	"text_size"
-.LASF1654:
+.LASF1668:
 	.string	"stat"
-.LASF2990:
+.LASF3004:
 	.string	"lut_ddr_vir"
-.LASF1322:
+.LASF1336:
 	.string	"map_count"
 .LASF622:
 	.string	"pdeath_signal"
 .LASF621:
 	.string	"exit_signal"
-.LASF2856:
+.LASF2870:
 	.string	"frame_num"
-.LASF957:
+.LASF971:
 	.string	"uid_keyring"
 .LASF726:
 	.string	"splice_pipe"
-.LASF3100:
+.LASF3115:
 	.string	"frame_done_callback"
-.LASF1801:
+.LASF1815:
 	.string	"error_remove_page"
-.LASF2324:
+.LASF2338:
 	.string	"pdev_archdata"
-.LASF1521:
+.LASF1535:
 	.string	"kswapd"
 .LASF111:
 	.string	"open"
-.LASF904:
+.LASF918:
 	.string	"mode"
 .LASF593:
 	.string	"rt_priority"
-.LASF1193:
+.LASF1207:
 	.string	"slots"
 .LASF499:
 	.string	"s_active"
-.LASF999:
+.LASF1013:
 	.string	"ptr64"
-.LASF1442:
+.LASF1456:
 	.string	"ia_ctime"
 .LASF45:
 	.string	"gid_t"
 .LASF588:
 	.string	"wake_cpu"
-.LASF1213:
+.LASF1227:
 	.string	"chained"
-.LASF1369:
+.LASF1383:
 	.string	"fiemap_extent"
 .LASF684:
 	.string	"task_works"
-.LASF1890:
+.LASF1904:
 	.string	"fl_copy_lock"
-.LASF856:
+.LASF870:
 	.string	"rb_root_cached"
 .LASF33:
 	.string	"__be32"
 .LASF502:
 	.string	"s_cop"
-.LASF1022:
+.LASF1036:
 	.string	"runnable_load_avg"
-.LASF1252:
+.LASF1266:
 	.string	"compound_mapcount"
-.LASF1450:
+.LASF1464:
 	.string	"zone_stat_item"
-.LASF3187:
+.LASF3202:
 	.string	"kmalloc_large"
-.LASF2627:
+.LASF2641:
 	.string	"PE_SIZE_PMD"
-.LASF888:
+.LASF902:
 	.string	"hres_active"
-.LASF1609:
+.LASF1623:
 	.string	"dq_dirty"
-.LASF1749:
+.LASF1763:
 	.string	"bug_list"
-.LASF2264:
+.LASF2278:
 	.string	"direct_complete"
 .LASF755:
 	.string	"__per_cpu_offset"
-.LASF2085:
+.LASF2099:
 	.string	"idr_rt"
-.LASF2509:
+.LASF2523:
 	.string	"quirks"
-.LASF1196:
+.LASF1210:
 	.string	"xa_lock"
-.LASF1928:
+.LASF1942:
 	.string	"nfs4_fl"
-.LASF1509:
+.LASF1523:
 	.string	"refaults"
-.LASF1009:
+.LASF1023:
 	.string	"load_weight"
-.LASF2854:
+.LASF2868:
 	.string	"WF_TYPE_MAX"
 .LASF570:
 	.string	"kuid_t"
-.LASF1035:
+.LASF1049:
 	.string	"block_max"
 .LASF607:
 	.string	"rcu_blocked_node"
-.LASF1388:
+.LASF1402:
 	.string	"gp_count"
-.LASF2052:
+.LASF2066:
 	.string	"key_restriction"
-.LASF3088:
+.LASF3103:
 	.string	"check_part_mode"
 .LASF619:
 	.string	"exit_state"
 .LASF153:
 	.string	"SYSTEM_SCHEDULING"
-.LASF2261:
+.LASF2275:
 	.string	"is_late_suspended"
 .LASF308:
 	.string	"__end_opd"
-.LASF1418:
+.LASF1432:
 	.string	"files_stat"
-.LASF1915:
+.LASF1929:
 	.string	"lm_owner_key"
-.LASF1540:
+.LASF1554:
 	.string	"vm_stat_diff"
-.LASF2850:
+.LASF2864:
 	.string	"WF_TYPE_GL16"
-.LASF2284:
+.LASF2298:
 	.string	"ignore_children"
-.LASF2082:
+.LASF2096:
 	.string	"resource"
-.LASF2190:
+.LASF2204:
 	.string	"restore_early"
-.LASF2095:
+.LASF2109:
 	.string	"next_generation"
-.LASF2592:
+.LASF2606:
 	.string	"__tracepoint_page_ref_mod_and_test"
-.LASF1944:
+.LASF1958:
 	.string	"fs_supers"
-.LASF1132:
+.LASF1146:
 	.string	"last_waited"
-.LASF3067:
+.LASF3082:
 	.string	"ebc_open"
-.LASF3156:
+.LASF3171:
 	.string	"three_win_mode"
-.LASF2875:
+.LASF2889:
 	.string	"EPD_OVERLAY"
-.LASF1630:
+.LASF1644:
 	.string	"dqb_bsoftlimit"
 .LASF219:
 	.string	"pending"
-.LASF2987:
+.LASF3001:
 	.string	"direct_buffer"
-.LASF2493:
+.LASF2507:
 	.string	"i2c_client_type"
-.LASF1029:
+.LASF1043:
 	.string	"iowait_count"
-.LASF2555:
+.LASF2569:
 	.string	"RCU_SOFTIRQ"
-.LASF2808:
+.LASF2822:
 	.string	"module_mutex"
-.LASF2651:
+.LASF2665:
 	.string	"PGFAULT"
-.LASF1577:
+.LASF1591:
 	.string	"notifier_block"
-.LASF2297:
+.LASF2311:
 	.string	"suspended_jiffies"
-.LASF2163:
+.LASF2177:
 	.string	"mm_kobj"
-.LASF2745:
+.LASF2759:
 	.string	"string"
-.LASF1394:
+.LASF1408:
 	.string	"read_count"
-.LASF1256:
+.LASF1270:
 	.string	"pt_mm"
-.LASF1505:
+.LASF1519:
 	.string	"lruvec"
-.LASF2904:
+.LASF2918:
 	.string	"ebc_pmic"
 .LASF14:
 	.string	"long long int"
 .LASF314:
 	.string	"__alt_instructions"
-.LASF2387:
+.LASF2401:
 	.string	"irq_domain"
 .LASF636:
 	.string	"atomic_flags"
-.LASF2538:
+.LASF2552:
 	.string	"__softirq_pending"
-.LASF1600:
+.LASF1614:
 	.string	"freq_scale"
-.LASF2273:
+.LASF2287:
 	.string	"timer_expires"
-.LASF2828:
+.LASF2842:
 	.string	"mmlist_lock"
-.LASF3173:
+.LASF3188:
 	.string	"ebc_pmic_power_on"
-.LASF1766:
+.LASF1780:
 	.string	"trace_evals"
-.LASF886:
+.LASF900:
 	.string	"active_bases"
-.LASF2735:
+.LASF2215:
+	.string	"init_name"
+.LASF2749:
 	.string	"sh_offset"
-.LASF2263:
+.LASF2277:
 	.string	"early_init"
-.LASF2731:
+.LASF2745:
 	.string	"sh_name"
 .LASF747:
 	.string	"security"
@@ -58948,31 +59032,31 @@ __exitcall_ebc_exit:
 	.string	"safe_val"
 .LASF368:
 	.string	"nr_cpu_ids"
-.LASF1282:
+.LASF1296:
 	.string	"f_pos_lock"
 .LASF180:
 	.string	"system_states"
-.LASF2191:
+.LASF2205:
 	.string	"suspend_noirq"
-.LASF1704:
+.LASF1718:
 	.string	"i_fieldmask"
 .LASF98:
 	.string	"owner"
 .LASF705:
 	.string	"acct_rss_mem1"
-.LASF832:
+.LASF846:
 	.string	"refcount_struct"
-.LASF1263:
-	.string	"_zd_pad_1"
-.LASF2251:
+.LASF826:
+	.string	"WQ_FREEZABLE"
+.LASF2265:
 	.string	"domain_data"
 .LASF331:
 	.string	"__mmuoff_data_end"
-.LASF2310:
+.LASF2324:
 	.string	"relax_count"
-.LASF1414:
+.LASF1428:
 	.string	"nr_free_files"
-.LASF3186:
+.LASF3201:
 	.string	"kmalloc"
 	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
 	.section	.note.GNU-stack,"",@progbits

commit 570ca7f242ee1307d3a43efca73178b82a531a45
Author: Ding Wei <leo.ding@rock-chips.com>
Date:   Fri Oct 22 17:16:19 2021 +0800

    video: rockchip: mpp: fix issue for devices register to service
    
    The device must be registered last. If there is an error, the device
    should not succeed.
    
    Change-Id: Ie342c8bbf30e8a94822dcb2e0417fe1230e4482a
    Signed-off-by: Ding Wei <leo.ding@rock-chips.com>

diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c
index 47e1e6bb66f0..63144255eae6 100644
--- a/drivers/video/rockchip/mpp/mpp_common.c
+++ b/drivers/video/rockchip/mpp/mpp_common.c
@@ -927,10 +927,6 @@ static int mpp_attach_service(struct mpp_dev *mpp, struct device *dev)
 		}
 	}
 
-	/* register current device to mpp service */
-	mpp->srv->sub_devices[mpp->var->device_type] = mpp;
-	set_bit(mpp->var->device_type, &mpp->srv->hw_support);
-
 	return 0;
 
 err_put_pdev:
@@ -1962,6 +1958,16 @@ int mpp_dev_remove(struct mpp_dev *mpp)
 	return 0;
 }
 
+int mpp_dev_register_srv(struct mpp_dev *mpp, struct mpp_service *srv)
+{
+	enum MPP_DEVICE_TYPE device_type = mpp->var->device_type;
+
+	srv->sub_devices[device_type] = mpp;
+	set_bit(device_type, &srv->hw_support);
+
+	return 0;
+}
+
 irqreturn_t mpp_dev_irq(int irq, void *param)
 {
 	struct mpp_dev *mpp = param;
diff --git a/drivers/video/rockchip/mpp/mpp_common.h b/drivers/video/rockchip/mpp/mpp_common.h
index 53b63feb0355..d6791a4c4cc7 100644
--- a/drivers/video/rockchip/mpp/mpp_common.h
+++ b/drivers/video/rockchip/mpp/mpp_common.h
@@ -589,6 +589,7 @@ int mpp_session_deinit(struct mpp_session *session);
 int mpp_dev_probe(struct mpp_dev *mpp,
 		  struct platform_device *pdev);
 int mpp_dev_remove(struct mpp_dev *mpp);
+int mpp_dev_register_srv(struct mpp_dev *mpp, struct mpp_service *srv);
 
 int mpp_power_on(struct mpp_dev *mpp);
 int mpp_power_off(struct mpp_dev *mpp);
diff --git a/drivers/video/rockchip/mpp/mpp_iep2.c b/drivers/video/rockchip/mpp/mpp_iep2.c
index 0aaf187f0da6..16f729b69398 100644
--- a/drivers/video/rockchip/mpp/mpp_iep2.c
+++ b/drivers/video/rockchip/mpp/mpp_iep2.c
@@ -967,6 +967,8 @@ static int iep2_probe(struct platform_device *pdev)
 
 	mpp->session_max_buffers = IEP2_SESSION_MAX_BUFFERS;
 	iep2_procfs_init(mpp);
+	/* register current device to mpp service */
+	mpp_dev_register_srv(mpp, mpp->srv);
 	dev_info(dev, "probing finish\n");
 
 	return 0;
diff --git a/drivers/video/rockchip/mpp/mpp_jpgdec.c b/drivers/video/rockchip/mpp/mpp_jpgdec.c
index 5f1def03ee00..3e94ceef256b 100644
--- a/drivers/video/rockchip/mpp/mpp_jpgdec.c
+++ b/drivers/video/rockchip/mpp/mpp_jpgdec.c
@@ -599,6 +599,8 @@ static int jpgdec_probe(struct platform_device *pdev)
 
 	mpp->session_max_buffers = JPGDEC_SESSION_MAX_BUFFERS;
 	jpgdec_procfs_init(mpp);
+	/* register current device to mpp service */
+	mpp_dev_register_srv(mpp, mpp->srv);
 	dev_info(dev, "probing finish\n");
 
 	return 0;
diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec.c b/drivers/video/rockchip/mpp/mpp_rkvdec.c
index f51fa65ba87d..09bea1e86e22 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvdec.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec.c
@@ -1900,6 +1900,8 @@ static int rkvdec_probe(struct platform_device *pdev)
 
 	mpp->session_max_buffers = RKVDEC_SESSION_MAX_BUFFERS;
 	rkvdec_procfs_init(mpp);
+	/* register current device to mpp service */
+	mpp_dev_register_srv(mpp, mpp->srv);
 	dev_info(dev, "probing finish\n");
 
 	return 0;
diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2.c b/drivers/video/rockchip/mpp/mpp_rkvdec2.c
index a75867671ffc..49a594b3512a 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvdec2.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec2.c
@@ -1037,6 +1037,8 @@ static int rkvdec2_probe(struct platform_device *pdev)
 	mpp->session_max_buffers = RKVDEC_SESSION_MAX_BUFFERS;
 	rkvdec2_procfs_init(mpp);
 	rkvdec2_link_procfs_init(mpp);
+	/* register current device to mpp service */
+	mpp_dev_register_srv(mpp, mpp->srv);
 	dev_info(dev, "probing finish\n");
 
 	return 0;
diff --git a/drivers/video/rockchip/mpp/mpp_rkvenc.c b/drivers/video/rockchip/mpp/mpp_rkvenc.c
index 9c92c7643b25..50e40f408f15 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvenc.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvenc.c
@@ -1453,6 +1453,8 @@ static int rkvenc_probe(struct platform_device *pdev)
 
 	mpp->session_max_buffers = RKVENC_SESSION_MAX_BUFFERS;
 	rkvenc_procfs_init(mpp);
+	/* register current device to mpp service */
+	mpp_dev_register_srv(mpp, mpp->srv);
 	dev_info(dev, "probing finish\n");
 
 	return 0;
diff --git a/drivers/video/rockchip/mpp/mpp_vdpu1.c b/drivers/video/rockchip/mpp/mpp_vdpu1.c
index f6c16295c542..a14f10208ced 100644
--- a/drivers/video/rockchip/mpp/mpp_vdpu1.c
+++ b/drivers/video/rockchip/mpp/mpp_vdpu1.c
@@ -827,6 +827,8 @@ static int vdpu_probe(struct platform_device *pdev)
 
 	mpp->session_max_buffers = VDPU1_SESSION_MAX_BUFFERS;
 	vdpu_procfs_init(mpp);
+	/* register current device to mpp service */
+	mpp_dev_register_srv(mpp, mpp->srv);
 	dev_info(dev, "probing finish\n");
 
 	return 0;
diff --git a/drivers/video/rockchip/mpp/mpp_vdpu2.c b/drivers/video/rockchip/mpp/mpp_vdpu2.c
index 49cf098c037b..f6970331bb8e 100644
--- a/drivers/video/rockchip/mpp/mpp_vdpu2.c
+++ b/drivers/video/rockchip/mpp/mpp_vdpu2.c
@@ -721,6 +721,8 @@ static int vdpu_probe(struct platform_device *pdev)
 
 	mpp->session_max_buffers = VDPU2_SESSION_MAX_BUFFERS;
 	vdpu_procfs_init(mpp);
+	/* register current device to mpp service */
+	mpp_dev_register_srv(mpp, mpp->srv);
 	dev_info(dev, "probing finish\n");
 
 	return 0;
diff --git a/drivers/video/rockchip/mpp/mpp_vepu1.c b/drivers/video/rockchip/mpp/mpp_vepu1.c
index 1600a7735ffc..aef0ad7b42cb 100644
--- a/drivers/video/rockchip/mpp/mpp_vepu1.c
+++ b/drivers/video/rockchip/mpp/mpp_vepu1.c
@@ -748,6 +748,8 @@ static int vepu_probe(struct platform_device *pdev)
 
 	mpp->session_max_buffers = VEPU1_SESSION_MAX_BUFFERS;
 	vepu_procfs_init(mpp);
+	/* register current device to mpp service */
+	mpp_dev_register_srv(mpp, mpp->srv);
 	dev_info(dev, "probing finish\n");
 
 	return 0;
diff --git a/drivers/video/rockchip/mpp/mpp_vepu2.c b/drivers/video/rockchip/mpp/mpp_vepu2.c
index 3cc3823e24f1..75188f28cb28 100644
--- a/drivers/video/rockchip/mpp/mpp_vepu2.c
+++ b/drivers/video/rockchip/mpp/mpp_vepu2.c
@@ -841,6 +841,8 @@ static int vepu_probe(struct platform_device *pdev)
 
 	mpp->session_max_buffers = VEPU2_SESSION_MAX_BUFFERS;
 	vepu_procfs_init(mpp);
+	/* register current device to mpp service */
+	mpp_dev_register_srv(mpp, mpp->srv);
 	dev_info(dev, "probing finish\n");
 
 	return 0;

commit 607ec674a1cae64508c2a09a5ab1500db532c02f
Author: Simon Xue <xxm@rock-chips.com>
Date:   Fri Oct 22 10:26:01 2021 +0800

    PCI: rockchip: update rockchip-pcie-dma driver
    
    1. reduce buffer size to 128KB
    2. invalidate buffer cache on demand
    3. reduce scantimer interval to 100us
    
    Can improve NPU fps from 45 to 95, the main reason is that
    most of data packages of NPU less than 1MB, setting buffer
    size to 128KB got a well result after testing.
    
    Signed-off-by: Simon Xue <xxm@rock-chips.com>
    Change-Id: Ib9e57b95a608110f4ec00c74a84cbe6deb63caf7

diff --git a/drivers/pci/controller/rockchip-pcie-dma.c b/drivers/pci/controller/rockchip-pcie-dma.c
index 55028cc4c7b4..3dc30b73b163 100644
--- a/drivers/pci/controller/rockchip-pcie-dma.c
+++ b/drivers/pci/controller/rockchip-pcie-dma.c
@@ -112,16 +112,16 @@
 #define NODE_SIZE		(sizeof(unsigned int))
 #define PCIE_DMA_ACK_BLOCK_SIZE		(NODE_SIZE * 8)
 
-#define PCIE_DMA_BUF_SIZE	SZ_1M
+#define PCIE_DMA_BUF_SIZE	SZ_128K
 #define PCIE_DMA_BUF_CNT	8
 #define PCIE_DMA_RD_BUF_SIZE	(PCIE_DMA_BUF_SIZE * PCIE_DMA_BUF_CNT)
 #define PCIE_DMA_WR_BUF_SIZE	(PCIE_DMA_BUF_SIZE * PCIE_DMA_BUF_CNT)
 #define PCIE_DMA_ACK_BASE	(PCIE_DMA_RD_BUF_SIZE + PCIE_DMA_WR_BUF_SIZE)
 
-#define PCIE_DMA_SET_DATA_CHECK_POS	(SZ_1M - 0x4)
-#define PCIE_DMA_SET_LOCAL_IDX_POS	(SZ_1M - 0x8)
-#define PCIE_DMA_SET_BUF_SIZE_POS	(SZ_1M - 0xc)
-#define PCIE_DMA_SET_CHK_SUM_POS	(SZ_1M - 0x10)
+#define PCIE_DMA_SET_DATA_CHECK_POS	(PCIE_DMA_BUF_SIZE - 0x4)
+#define PCIE_DMA_SET_LOCAL_IDX_POS	(PCIE_DMA_BUF_SIZE - 0x8)
+#define PCIE_DMA_SET_BUF_SIZE_POS	(PCIE_DMA_BUF_SIZE - 0xc)
+#define PCIE_DMA_SET_CHK_SUM_POS	(PCIE_DMA_BUF_SIZE - 0x10)
 
 #define PCIE_DMA_DATA_CHECK		0x12345678
 #define PCIE_DMA_DATA_ACK_CHECK		0xdeadbeef
@@ -191,7 +191,7 @@ static void rk_pcie_prepare_dma(struct dma_trx_obj *obj,
 			writel(checksum, virt + PCIE_DMA_SET_CHK_SUM_POS);
 		}
 
-		buf_size = SZ_1M;
+		buf_size = PCIE_DMA_BUF_SIZE;
 		break;
 	case PCIE_DMA_DATA_RCV_ACK:
 		table = obj->table[PCIE_DMA_DATA_RCV_ACK_TABLE_OFFSET + idx];
@@ -365,7 +365,7 @@ static enum hrtimer_restart rk_pcie_scan_timer(struct hrtimer *timer)
 		wake_up(&obj->event_queue);
 	}
 
-	hrtimer_add_expires(&obj->scan_timer, ktime_set(0, 1 * 1000 * 1000));
+	hrtimer_add_expires(&obj->scan_timer, ktime_set(0, 100 * 1000));
 
 	return HRTIMER_RESTART;
 }
@@ -436,6 +436,7 @@ static long rk_pcie_misc_ioctl(struct file *filp, unsigned int cmd,
 	phys_addr_t addr;
 	void __user *uarg = (void __user *)arg;
 	int ret;
+	int i;
 
 	if (copy_from_user(&msg, uarg, sizeof(msg)) != 0) {
 		dev_err(dev, "failed to copy argument into kernel space\n");
@@ -454,8 +455,11 @@ static long rk_pcie_misc_ioctl(struct file *filp, unsigned int cmd,
 		if (is_rc(obj))
 			addr += PCIE_DMA_WR_BUF_SIZE;
 		/* by kernel auto or by user to invalidate cache */
-		dma_sync_single_for_cpu(dev, addr, PCIE_DMA_RD_BUF_SIZE,
-					DMA_FROM_DEVICE);
+		for (i = 0; i < PCIE_DMA_BUF_CNT; i++) {
+			if (test_bit(i, &obj->local_read_available))
+				dma_sync_single_for_cpu(dev, addr + i * PCIE_DMA_BUF_SIZE, PCIE_DMA_BUF_SIZE, DMA_FROM_DEVICE);
+		}
+
 		ret = copy_to_user(uarg, &msg_to_user, sizeof(msg));
 		if (ret) {
 			dev_err(dev, "failed to get read buffer index\n");

commit 64f0c74249081eeeafffd2de37d0f04a616a2437
Author: Ding Wei <leo.ding@rock-chips.com>
Date:   Fri Oct 22 13:52:57 2021 +0800

    video: rockchip: mpp: rkvenc: probe issue for devfreq init error
    
    When devfreq initially fails, the device can still continue to execute,
    but there is no devfreq function.
    
    Change-Id: I2a39a77e0a85cb43854b6adbe0476905abcc9a3b
    Signed-off-by: Ding Wei <leo.ding@rock-chips.com>

diff --git a/drivers/video/rockchip/mpp/mpp_rkvenc.c b/drivers/video/rockchip/mpp/mpp_rkvenc.c
index 8881f9f04036..9c92c7643b25 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvenc.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvenc.c
@@ -1216,7 +1216,7 @@ static int rkvenc_init(struct mpp_dev *mpp)
 
 	mpp->iommu_info->hdl = rkvenc_iommu_fault_handle;
 
-	return ret;
+	return 0;
 }
 
 static int rkvenc_exit(struct mpp_dev *mpp)

commit d5a8a6f0350b325c43933289d65e97fd601eadec
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Mon Sep 27 08:56:27 2021 +0800

    FROMGIT: ASoC: rockchip: Use generic dmaengine code
    
    This reverts commit 75b31192fe6ad20b42276b20ee3bdf1493216d63.
    
    The original purpose of customized pcm was to config prealloc buffer size
    flexibly. but, we can do the same thing by soc-generic-dmaengine-pcm.
    
    And the generic one can generated the better config by querying DMA
    capabilities from dmaengine driver rather than the Hard-Coded one.
    
    e.g.
    
    the customized one:
    
      static const struct snd_pcm_hardware snd_rockchip_hardware = {
             .info                   = SNDRV_PCM_INFO_MMAP |
                                       SNDRV_PCM_INFO_MMAP_VALID |
                                       SNDRV_PCM_INFO_PAUSE |
                                       SNDRV_PCM_INFO_RESUME |
                                       SNDRV_PCM_INFO_INTERLEAVED,
      ...
    
    the generic one:
    
      ret = dma_get_slave_caps(chan, &dma_caps);
      if (ret == 0) {
              if (dma_caps.cmd_pause && dma_caps.cmd_resume)
                      hw.info |= SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME;
              if (dma_caps.residue_granularity <= DMA_RESIDUE_GRANULARITY_SEGMENT)
                      hw.info |= SNDRV_PCM_INFO_BATCH;
      ...
    
    So, let's revert back to use the generic dmaengine pcm.
    
    Change-Id: I30eee2e8047b69d7311fd6da0cfd2b5872b81e17
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>
    Reviewed-by: John Keeping <john@metanate.com>
    Link: https://lore.kernel.org/r/1632792957-80428-1-git-send-email-sugar.zhang@rock-chips.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    (cherry picked from commit 5ba8ecf2272d34de9cd2271a0ac12f5f615ef7aa
     git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-5.16)

diff --git a/sound/soc/rockchip/Makefile b/sound/soc/rockchip/Makefile
index 927ba2aa5924..343f831b5c55 100644
--- a/sound/soc/rockchip/Makefile
+++ b/sound/soc/rockchip/Makefile
@@ -3,7 +3,6 @@
 snd-soc-rockchip-audio-pwm-objs := rockchip_audio_pwm.o
 snd-soc-rockchip-i2s-objs := rockchip_i2s.o
 snd-soc-rockchip-i2s-tdm-objs := rockchip_i2s_tdm.o
-snd-soc-rockchip-pcm-objs := rockchip_pcm.o
 snd-soc-rockchip-pdm-objs := rockchip_pdm.o
 snd-soc-rockchip-spdif-objs := rockchip_spdif.o
 snd-soc-rockchip-vad-objs := rockchip_vad.o
@@ -14,7 +13,6 @@ snd-soc-rockchip-vad-$(CONFIG_ARM64) += vad_preprocess_arm64.o
 snd-soc-rockchip-vad-$(CONFIG_ARM) += vad_preprocess_arm.o
 endif
 
-obj-$(CONFIG_SND_SOC_ROCKCHIP) += snd-soc-rockchip-pcm.o
 obj-$(CONFIG_SND_SOC_ROCKCHIP_AUDIO_PWM) += snd-soc-rockchip-audio-pwm.o
 obj-$(CONFIG_SND_SOC_ROCKCHIP_I2S) += snd-soc-rockchip-i2s.o
 obj-$(CONFIG_SND_SOC_ROCKCHIP_I2S_TDM) += snd-soc-rockchip-i2s-tdm.o
diff --git a/sound/soc/rockchip/rockchip_audio_pwm.c b/sound/soc/rockchip/rockchip_audio_pwm.c
index 4d5006469503..44ca66f1ed95 100644
--- a/sound/soc/rockchip/rockchip_audio_pwm.c
+++ b/sound/soc/rockchip/rockchip_audio_pwm.c
@@ -17,7 +17,6 @@
 #include <sound/pcm_params.h>
 
 #include "rockchip_audio_pwm.h"
-#include "rockchip_pcm.h"
 
 #define AUDIO_PWM_DMA_BURST_SIZE	(16) /* size * width: 16*4 = 64 bytes */
 
@@ -325,7 +324,7 @@ static int rockchip_audio_pwm_probe(struct platform_device *pdev)
 		goto err_suspend;
 	}
 
-	ret = rockchip_pcm_platform_register(&pdev->dev);
+	ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
 	if (ret) {
 		dev_err(&pdev->dev, "could not register pcm: %d\n", ret);
 		goto err_suspend;
diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c
index c497e2018436..262a95462a93 100644
--- a/sound/soc/rockchip/rockchip_i2s.c
+++ b/sound/soc/rockchip/rockchip_i2s.c
@@ -25,7 +25,6 @@
 #include <sound/dmaengine_pcm.h>
 
 #include "rockchip_i2s.h"
-#include "rockchip_pcm.h"
 
 #define DRV_NAME "rockchip-i2s"
 
@@ -904,7 +903,7 @@ static int rockchip_i2s_probe(struct platform_device *pdev)
 
 	if (of_property_read_bool(node, "rockchip,no-dmaengine"))
 		return ret;
-	ret = rockchip_pcm_platform_register(&pdev->dev);
+	ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
 	if (ret) {
 		dev_err(&pdev->dev, "Could not register PCM\n");
 		goto err_suspend;
diff --git a/sound/soc/rockchip/rockchip_i2s_tdm.c b/sound/soc/rockchip/rockchip_i2s_tdm.c
index c76e3f4592e5..fdb201fcebdf 100644
--- a/sound/soc/rockchip/rockchip_i2s_tdm.c
+++ b/sound/soc/rockchip/rockchip_i2s_tdm.c
@@ -27,7 +27,6 @@
 #include <sound/dmaengine_pcm.h>
 
 #include "rockchip_i2s_tdm.h"
-#include "rockchip_pcm.h"
 
 #define DRV_NAME "rockchip-i2s-tdm"
 
@@ -1889,7 +1888,7 @@ static int rockchip_i2s_tdm_probe(struct platform_device *pdev)
 
 	if (of_property_read_bool(node, "rockchip,no-dmaengine"))
 		return ret;
-	ret = rockchip_pcm_platform_register(&pdev->dev);
+	ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
 	if (ret) {
 		dev_err(&pdev->dev, "Could not register PCM\n");
 		return ret;
diff --git a/sound/soc/rockchip/rockchip_pcm.c b/sound/soc/rockchip/rockchip_pcm.c
deleted file mode 100644
index 2772f4b56328..000000000000
--- a/sound/soc/rockchip/rockchip_pcm.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2018 Rockchip Electronics Co. Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/device.h>
-#include <linux/init.h>
-#include <linux/module.h>
-
-#include <sound/core.h>
-#include <sound/pcm.h>
-#include <sound/soc.h>
-#include <sound/dmaengine_pcm.h>
-
-#include "rockchip_pcm.h"
-
-static const struct snd_pcm_hardware snd_rockchip_hardware = {
-	.info			= SNDRV_PCM_INFO_MMAP |
-				  SNDRV_PCM_INFO_MMAP_VALID |
-				  SNDRV_PCM_INFO_PAUSE |
-				  SNDRV_PCM_INFO_RESUME |
-				  SNDRV_PCM_INFO_INTERLEAVED,
-	.period_bytes_min	= 32,
-	.period_bytes_max	= SIZE_MAX,
-	.periods_min		= 2,
-	.periods_max		= 4096,
-	.buffer_bytes_max	= SIZE_MAX,
-	.fifo_size		= 32,
-};
-
-static const struct snd_dmaengine_pcm_config rk_dmaengine_pcm_config = {
-	.pcm_hardware = &snd_rockchip_hardware,
-	.prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config,
-	.prealloc_buffer_size = CONFIG_SND_SOC_ROCKCHIP_PREALLOC_BUFFER_SIZE * 1024,
-};
-
-int rockchip_pcm_platform_register(struct device *dev)
-{
-	return devm_snd_dmaengine_pcm_register(dev, &rk_dmaengine_pcm_config,
-		SND_DMAENGINE_PCM_FLAG_COMPAT);
-}
-EXPORT_SYMBOL_GPL(rockchip_pcm_platform_register);
-
-MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/rockchip/rockchip_pcm.h b/sound/soc/rockchip/rockchip_pcm.h
deleted file mode 100644
index d6c36115c60a..000000000000
--- a/sound/soc/rockchip/rockchip_pcm.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * Copyright (c) 2018 Rockchip Electronics Co. Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef _ROCKCHIP_PCM_H
-#define _ROCKCHIP_PCM_H
-
-int rockchip_pcm_platform_register(struct device *dev);
-
-#endif
diff --git a/sound/soc/rockchip/rockchip_pdm.c b/sound/soc/rockchip/rockchip_pdm.c
index ced2aa6f0287..5e276467e458 100644
--- a/sound/soc/rockchip/rockchip_pdm.c
+++ b/sound/soc/rockchip/rockchip_pdm.c
@@ -26,7 +26,6 @@
 #include <sound/dmaengine_pcm.h>
 #include <sound/pcm_params.h>
 
-#include "rockchip_pcm.h"
 #include "rockchip_pdm.h"
 
 #define PDM_DMA_BURST_SIZE	(8) /* size * width: 8*4 = 32 bytes */
@@ -811,7 +810,7 @@ static int rockchip_pdm_probe(struct platform_device *pdev)
 	if (of_property_read_bool(node, "rockchip,no-dmaengine"))
 		return 0;
 
-	ret = rockchip_pcm_platform_register(&pdev->dev);
+	ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
 	if (ret) {
 		dev_err(&pdev->dev, "could not register pcm: %d\n", ret);
 		goto err_suspend;
diff --git a/sound/soc/rockchip/rockchip_spdif.c b/sound/soc/rockchip/rockchip_spdif.c
index 465530d66e1c..e8b6a2e0207e 100644
--- a/sound/soc/rockchip/rockchip_spdif.c
+++ b/sound/soc/rockchip/rockchip_spdif.c
@@ -22,7 +22,6 @@
 #include <sound/pcm_params.h>
 #include <sound/dmaengine_pcm.h>
 
-#include "rockchip_pcm.h"
 #include "rockchip_spdif.h"
 
 enum rk_spdif_type {
@@ -353,7 +352,7 @@ static int rk_spdif_probe(struct platform_device *pdev)
 		goto err_pm_suspend;
 	}
 
-	ret = rockchip_pcm_platform_register(&pdev->dev);
+	ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
 	if (ret) {
 		dev_err(&pdev->dev, "Could not register PCM\n");
 		goto err_pm_suspend;
diff --git a/sound/soc/rockchip/rockchip_spdifrx.c b/sound/soc/rockchip/rockchip_spdifrx.c
index 2317ba743b3a..0e457232116d 100644
--- a/sound/soc/rockchip/rockchip_spdifrx.c
+++ b/sound/soc/rockchip/rockchip_spdifrx.c
@@ -17,7 +17,6 @@
 #include <sound/pcm_params.h>
 #include <sound/dmaengine_pcm.h>
 
-#include "rockchip_pcm.h"
 #include "rockchip_spdifrx.h"
 
 struct rk_spdifrx_dev {
@@ -336,7 +335,7 @@ static int rk_spdifrx_probe(struct platform_device *pdev)
 		goto err_pm_suspend;
 	}
 
-	ret = rockchip_pcm_platform_register(&pdev->dev);
+	ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
 	if (ret) {
 		dev_err(&pdev->dev, "Could not register PCM\n");
 		goto err_pm_suspend;

commit ba2cfd68f476493a34c74d91f17fdfec046bf916
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Thu Sep 23 18:50:46 2021 +0800

    FROMGIT: ASoC: dmaengine: Introduce module option prealloc_buffer_size_kbytes
    
    Currently, The fixed 512KB prealloc buffer size is too larger for
    tiny memory kernel (such as 16MB memory). This patch adds the module
    option "prealloc_buffer_size_kbytes" to specify prealloc buffer size.
    
    It's suitable for cards which use the generic dmaengine pcm driver
    with no config.
    
    Change-Id: I76cc278f523d41083ba30b36d801d2839682d158
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>
    Link: https://lore.kernel.org/r/1632394246-59341-1-git-send-email-sugar.zhang@rock-chips.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    (cherry picked from commit b0e3b0a7078d71455747025e7deee766d4d43432
     git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-5.16)

diff --git a/Documentation/sound/alsa-configuration.rst b/Documentation/sound/alsa-configuration.rst
index 4a3cecc8ad38..79c57b77b0db 100644
--- a/Documentation/sound/alsa-configuration.rst
+++ b/Documentation/sound/alsa-configuration.rst
@@ -100,6 +100,15 @@ amidi_map
     MIDI device number maps assigned to the 2st OSS device;
     Default: 1
 
+Module snd-soc-core
+-------------------
+
+The soc core module. It is used by all ALSA card drivers.
+It takes the following options which have global effects.
+
+prealloc_buffer_size_kbytes
+    Specify prealloc buffer size in kbytes (default: 512).
+
 Common parameters for top sound card modules
 --------------------------------------------
 
diff --git a/sound/soc/soc-generic-dmaengine-pcm.c b/sound/soc/soc-generic-dmaengine-pcm.c
index 232df04ca586..f04b8ae8ac31 100644
--- a/sound/soc/soc-generic-dmaengine-pcm.c
+++ b/sound/soc/soc-generic-dmaengine-pcm.c
@@ -15,6 +15,10 @@
 
 #include <sound/dmaengine_pcm.h>
 
+static unsigned int prealloc_buffer_size_kbytes = 512;
+module_param(prealloc_buffer_size_kbytes, uint, 0444);
+MODULE_PARM_DESC(prealloc_buffer_size_kbytes, "Preallocate DMA buffer size (KB).");
+
 /*
  * The platforms dmaengine driver does not support reporting the amount of
  * bytes that are still left to transfer.
@@ -276,7 +280,7 @@ static int dmaengine_pcm_new(struct snd_soc_pcm_runtime *rtd)
 		prealloc_buffer_size = config->prealloc_buffer_size;
 		max_buffer_size = config->pcm_hardware->buffer_bytes_max;
 	} else {
-		prealloc_buffer_size = 512 * 1024;
+		prealloc_buffer_size = prealloc_buffer_size_kbytes * 1024;
 		max_buffer_size = SIZE_MAX;
 	}
 

commit 0c5249aab14d3d173c6cb96a2787e309bb289095
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Wed Oct 20 20:28:15 2021 +0800

    drm/rockchip: vop2: Adjust wait critical time zone policy when there are two pending vp
    
    Current policy:
    
    If there are two pending config done vp, and one of them is
    at critical time zone, wait for the one wich has long time
    to vsync.
    
    This may lead a very long wait, for example: VP0 is 3840 x 2160,
    VP2 is 1920 x 1080, they are all have pending cfg done bits,
    and the vcnt of VP0 is 1367, the vcnt of VP2 is 995, VP2 is
    at the critical time zone, we will wait VP0 vsync(almost half frame time)
    according to this policy. This lead a very long wait.
    
    The new policy:
    
    If there are two pending config done vp, and one of them is
    at critical time zone, compare the left vcnt time of the
    two vp:
    
    if (first_vp_left_time > second_vp_left_time) {
            if ((first_vp_left_time - second_vp_left_time) > first_vp_safe_time)
                    wait_vp = second_done_vp;
            else
                    wait_vp = first_done_vp;
    } else {
            if ((second_vp_left_time - first_vp_left_time) > second_vp_safe_time)
                   wait_vp = first_done_vp;
            else
                    wait_vp = second_done_vp;
    }
    
    Change-Id: I7154ad716841c6c28947ddfecc845c7271cc507a
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index a9ffef9eff26..848e2f665d49 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -1037,20 +1037,22 @@ static int32_t vop2_pending_done_bits(struct vop2_video_port *vp)
 		if (first_vp_left_time > first_vp_safe_time &&
 		    second_vp_left_time > second_vp_safe_time)
 			return done_bits_bak;
-		if (first_vp_left_time > second_vp_left_time)
-			wait_vp = first_done_vp;
-		else
-			wait_vp = second_done_vp;
+
+		if (first_vp_left_time > second_vp_left_time) {
+			if ((first_vp_left_time - second_vp_left_time) > first_vp_safe_time)
+				wait_vp = second_done_vp;
+			else
+				wait_vp = first_done_vp;
+		} else {
+			if ((second_vp_left_time - first_vp_left_time) > second_vp_safe_time)
+				wait_vp = first_done_vp;
+			else
+				wait_vp = second_done_vp;
+		}
 
 		vop2_wait_for_fs_by_done_bit_status(wait_vp);
 
 		done_bits = vop2_readl(vop2, RK3568_REG_CFG_DONE) & 0x7;
-		if (done_bits) {
-			vp_id = ffs(done_bits) - 1;
-			done_vp = &vop2->vps[vp_id];
-			vop2_wait_for_fs_by_done_bit_status(done_vp);
-		}
-		done_bits = 0;
 	}
 	return done_bits;
 }

commit 2c264016e40eb3feadbd3198d7a62f7e96f296f6
Author: David Wu <david.wu@rock-chips.com>
Date:   Wed Oct 20 20:11:41 2021 +0800

    net: ethernet: stmmac: dwmac-rk: Disable delayline if it is invalid
    
    If delayline can't get from DTB or invalid, don't enable delayline.
    
    Signed-off-by: David Wu <david.wu@rock-chips.com>
    Change-Id: I9769af42d02c67d2ea3fd24de5def45a1ec1cc17

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index c3a382faec58..1e392acd8f4a 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -213,8 +213,12 @@ static int xpcs_setup(struct rk_priv_data *bsp_priv, int mode)
 #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))
 
 #define PX30_GRF_GMAC_CON1		0x0904
 
@@ -307,12 +311,10 @@ static void rk1808_set_to_rgmii(struct rk_priv_data *bsp_priv,
 
 	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)
@@ -440,8 +442,7 @@ static void rk3128_set_to_rgmii(struct rk_priv_data *bsp_priv,
 		     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)
@@ -557,8 +558,7 @@ static void rk3228_set_to_rgmii(struct rk_priv_data *bsp_priv,
 		     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)
@@ -678,8 +678,7 @@ static void rk3288_set_to_rgmii(struct rk_priv_data *bsp_priv,
 		     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)
@@ -850,12 +849,10 @@ static void rk3328_set_to_rgmii(struct rk_priv_data *bsp_priv,
 	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)
@@ -980,8 +977,7 @@ static void rk3366_set_to_rgmii(struct rk_priv_data *bsp_priv,
 		     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)
@@ -1091,8 +1087,7 @@ static void rk3368_set_to_rgmii(struct rk_priv_data *bsp_priv,
 		     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)
@@ -1202,8 +1197,7 @@ static void rk3399_set_to_rgmii(struct rk_priv_data *bsp_priv,
 		     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)
@@ -1350,12 +1344,10 @@ static void rk3568_set_to_rgmii(struct rk_priv_data *bsp_priv,
 
 	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)
@@ -1502,21 +1494,18 @@ static const struct rk_gmac_ops rv1108_ops = {
 		(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)
-
-/* 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)
+#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 && 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)
@@ -1530,18 +1519,14 @@ static void rv1126_set_to_rgmii(struct rk_priv_data *bsp_priv,
 
 	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)
@@ -1883,7 +1868,7 @@ static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
 
 	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);
@@ -1894,7 +1879,7 @@ static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
 
 	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);
@@ -1957,17 +1942,17 @@ static int rk_gmac_powerup(struct rk_priv_data *bsp_priv)
 	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");

commit ae438d0b63c4f2d477d488b647966064d7d31bf8
Merge: 8ac05d760d25 ff079d726eb6
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Wed Oct 20 11:49:24 2021 +0200

    Merge 4.19.213 into android-4.19-stable
    
    Changes in 4.19.213
            ALSA: seq: Fix a potential UAF by wrong private_free call order
            ALSA: hda/realtek: Complete partial device name to avoid ambiguity
            ALSA: hda/realtek: Add quirk for Clevo X170KM-G
            ALSA: hda/realtek - ALC236 headset MIC recording issue
            nds32/ftrace: Fix Error: invalid operands (*UND* and *UND* sections) for `^'
            s390: fix strrchr() implementation
            btrfs: deal with errors when replaying dir entry during log replay
            btrfs: deal with errors when adding inode reference during log replay
            btrfs: check for error when looking up inode during dir entry replay
            x86/resctrl: Free the ctrlval arrays when domain_setup_mon_state() fails
            mei: me: add Ice Lake-N device id.
            xhci: guard accesses to ep_state in xhci_endpoint_reset()
            xhci: Fix command ring pointer corruption while aborting a command
            xhci: Enable trust tx length quirk for Fresco FL11 USB controller
            cb710: avoid NULL pointer subtraction
            efi/cper: use stack buffer for error record decoding
            efi: Change down_interruptible() in virt_efi_reset_system() to down_trylock()
            usb: musb: dsps: Fix the probe error path
            Input: xpad - add support for another USB ID of Nacon GC-100
            USB: serial: qcserial: add EM9191 QDL support
            USB: serial: option: add Quectel EC200S-CN module support
            USB: serial: option: add Telit LE910Cx composition 0x1204
            USB: serial: option: add prod. id for Quectel EG91
            virtio: write back F_VERSION_1 before validate
            nvmem: Fix shift-out-of-bound (UBSAN) with byte size cells
            x86/Kconfig: Do not enable AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT automatically
            iio: adc: aspeed: set driver data when adc probe.
            iio: adc128s052: Fix the error handling path of 'adc128_probe()'
            iio: light: opt3001: Fixed timeout error when 0 lux
            iio: ssp_sensors: add more range checking in ssp_parse_dataframe()
            iio: ssp_sensors: fix error code in ssp_print_mcu_debug()
            iio: dac: ti-dac5571: fix an error code in probe()
            sctp: account stream padding length for reconf chunk
            net: arc: select CRC32
            net: korina: select CRC32
            net: encx24j600: check error in devm_regmap_init_encx24j600
            ethernet: s2io: fix setting mac address during resume
            nfc: fix error handling of nfc_proto_register()
            NFC: digital: fix possible memory leak in digital_tg_listen_mdaa()
            NFC: digital: fix possible memory leak in digital_in_send_sdd_req()
            pata_legacy: fix a couple uninitialized variable bugs
            platform/mellanox: mlxreg-io: Fix argument base in kstrtou32() call
            drm/msm: Fix null pointer dereference on pointer edp
            drm/msm/dsi: Fix an error code in msm_dsi_modeset_init()
            drm/msm/dsi: fix off by one in dsi_bus_clk_enable error handling
            acpi/arm64: fix next_platform_timer() section mismatch error
            mqprio: Correct stats in mqprio_dump_class_stats().
            qed: Fix missing error code in qed_slowpath_start()
            r8152: select CRC32 and CRYPTO/CRYPTO_HASH/CRYPTO_SHA256
            Linux 4.19.213
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: Ieed0ccf749a762608588038f8b85a81e85d00c1b

commit 8649265280ed7b84f7923c7665bb7930687ea33d
Author: Yandong Lin <yandong.lin@rock-chips.com>
Date:   Mon Oct 18 17:55:01 2021 +0800

    video: rockchip: mpp: Fix report wrong dev when pagefault
    
    On some platforms(such as px30), vepu and vdpu shared the
    same mmu.So when registering the iommu handle function,
    there will be overwriting.Results in the reported device mismatch
    when page fault.
    
    Signed-off-by: Yandong Lin <yandong.lin@rock-chips.com>
    Change-Id: Id07c7f3088c52fcb987797c689296154c670078c

diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c
index 8cdde67b1d65..47e1e6bb66f0 100644
--- a/drivers/video/rockchip/mpp/mpp_common.c
+++ b/drivers/video/rockchip/mpp/mpp_common.c
@@ -1789,13 +1789,19 @@ static int mpp_iommu_handle(struct iommu_domain *iommu,
 			    unsigned long iova,
 			    int status, void *arg)
 {
-	struct mpp_dev *mpp = (struct mpp_dev *)arg;
-	struct mpp_task *task = mpp_taskqueue_get_running_task(mpp->queue);
-
-	dev_err(mpp->dev, "fault addr 0x%08lx status %x\n", iova, status);
+	struct mpp_taskqueue *queue = (struct mpp_taskqueue *)arg;
+	struct mpp_task *task = mpp_taskqueue_get_running_task(queue);
+	struct mpp_dev *mpp;
 
-	if (!task)
+	/*
+	 * NOTE: In link mode, this task may not be the task of the current
+	 * hardware processing error
+	 */
+	if (!task || !task->session)
 		return -EIO;
+	/* get mpp from cur task */
+	mpp = task->session->mpp;
+	dev_err(mpp->dev, "fault addr 0x%08lx status %x\n", iova, status);
 
 	mpp_task_dump_mem_region(mpp, task);
 	mpp_task_dump_hw_reg(mpp, task);
@@ -1905,7 +1911,7 @@ int mpp_dev_probe(struct mpp_dev *mpp,
 	/* set iommu fault handler */
 	if (!IS_ERR(mpp->iommu_info))
 		iommu_set_fault_handler(mpp->iommu_info->domain,
-					mpp_iommu_handle, mpp);
+					mpp_iommu_handle, mpp->queue);
 
 	/* read hardware id */
 	if (hw_info->reg_id >= 0) {

commit 88ce0688ff5e72a3d7fbd9804cb69056c382152c
Author: Ding Wei <leo.ding@rock-chips.com>
Date:   Wed Oct 20 16:37:46 2021 +0800

    driver core: Export symbol: device_links_read_lock/unlock
    
    The symbols is used for rockchip video codec driver,
    which located driver/rockchip/video/mpp. When mpp is build
    for module, it will be error.
    
    Error message:
    ERROR: "device_links_read_unlock"
    [drivers/video/rockchip/mpp/rk_vcodec.ko] undefined!
    ERROR: "device_links_read_lock" [drivers/video/rockchip/mpp/rk_vcodec.ko] undefined!
    make[2]: *** [__modpost] Error 1
    make[1]: *** [modules] Error 2
    make: *** [kernel.img] Error 2
    make: *** Deleting file `kernel.img'`
    
    Change-Id: Ie412341c03ad71d257392a22249b62bedd0be58b
    Signed-off-by: Ding Wei <leo.ding@rock-chips.com>

diff --git a/drivers/base/core.c b/drivers/base/core.c
index 9f9f0ed8a83e..ac565ae85d0a 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -100,6 +100,9 @@ void device_links_read_unlock(int not_used)
 }
 #endif /* !CONFIG_SRCU */
 
+EXPORT_SYMBOL(device_links_read_lock);
+EXPORT_SYMBOL(device_links_read_unlock);
+
 static bool device_is_ancestor(struct device *dev, struct device *target)
 {
 	while (target->parent) {

commit 8ac05d760d253d96daa5fb4e19d46a0c400e7481
Author: Eric Biggers <ebiggers@google.com>
Date:   Tue Mar 9 23:27:26 2021 -0800

    UPSTREAM: crypto: arm/blake2s - fix for big endian
    
    The new ARM BLAKE2s code doesn't work correctly (fails the self-tests)
    in big endian kernel builds because it doesn't swap the endianness of
    the message words when loading them.  Fix this.
    
    Fixes: 5172d322d34c ("crypto: arm/blake2s - add ARM scalar optimized BLAKE2s")
    Signed-off-by: Eric Biggers <ebiggers@google.com>
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit d2f2516a3882c0c6463e33c9b112b39bd483f821)
    Bug: 178411248
    Change-Id: Iff419963407eeb0435b9550ef126db4bf137a8a1
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/arch/arm/crypto/blake2s-core.S b/arch/arm/crypto/blake2s-core.S
index bed897e9a181..86345751bbf3 100644
--- a/arch/arm/crypto/blake2s-core.S
+++ b/arch/arm/crypto/blake2s-core.S
@@ -8,6 +8,7 @@
  */
 
 #include <linux/linkage.h>
+#include <asm/assembler.h>
 
 	// Registers used to hold message words temporarily.  There aren't
 	// enough ARM registers to hold the whole message block, so we have to
@@ -38,6 +39,23 @@
 #endif
 .endm
 
+.macro _le32_bswap	a, tmp
+#ifdef __ARMEB__
+	rev_l		\a, \tmp
+#endif
+.endm
+
+.macro _le32_bswap_8x	a, b, c, d, e, f, g, h,  tmp
+	_le32_bswap	\a, \tmp
+	_le32_bswap	\b, \tmp
+	_le32_bswap	\c, \tmp
+	_le32_bswap	\d, \tmp
+	_le32_bswap	\e, \tmp
+	_le32_bswap	\f, \tmp
+	_le32_bswap	\g, \tmp
+	_le32_bswap	\h, \tmp
+.endm
+
 // Execute a quarter-round of BLAKE2s by mixing two columns or two diagonals.
 // (a0, b0, c0, d0) and (a1, b1, c1, d1) give the registers containing the two
 // columns/diagonals.  s0-s1 are the word offsets to the message words the first
@@ -180,8 +198,10 @@ ENTRY(blake2s_compress_arch)
 	tst		r1, #3
 	bne		.Lcopy_block_misaligned
 	ldmia		r1!, {r2-r9}
+	_le32_bswap_8x	r2, r3, r4, r5, r6, r7, r8, r9,  r14
 	stmia		r12!, {r2-r9}
 	ldmia		r1!, {r2-r9}
+	_le32_bswap_8x	r2, r3, r4, r5, r6, r7, r8, r9,  r14
 	stmia		r12, {r2-r9}
 .Lcopy_block_done:
 	str		r1, [sp, #68]		// Update message pointer
@@ -268,6 +288,7 @@ ENTRY(blake2s_compress_arch)
 1:
 #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
 	ldr		r3, [r1], #4
+	_le32_bswap	r3, r4
 #else
 	ldrb		r3, [r1, #0]
 	ldrb		r4, [r1, #1]

commit 404c55357a1a619e0aaae6503d1b00f08b789234
Author: Eric Biggers <ebiggers@google.com>
Date:   Mon Jan 25 12:45:49 2021 -0800

    ANDROID: gki_defconfig: enable BLAKE2b support
    
    Bug: 178411248
    [adelva: patched around missing XCBC option on 4.19]
    Change-Id: Iec497954d29adcf7193da9ca4b27d61eac7615d9
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/arch/arm64/configs/gki_defconfig b/arch/arm64/configs/gki_defconfig
index c75699ce5615..83a30a47df95 100644
--- a/arch/arm64/configs/gki_defconfig
+++ b/arch/arm64/configs/gki_defconfig
@@ -498,6 +498,7 @@ CONFIG_SECURITY_SELINUX=y
 CONFIG_INIT_STACK_ALL_ZERO=y
 CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y
 CONFIG_CRYPTO_ADIANTUM=y
+CONFIG_CRYPTO_BLAKE2B=y
 CONFIG_CRYPTO_LZ4=y
 CONFIG_CRYPTO_ZSTD=y
 CONFIG_CRYPTO_ANSI_CPRNG=y
diff --git a/arch/x86/configs/gki_defconfig b/arch/x86/configs/gki_defconfig
index 1cb8563a1a6c..5c7e06ef8a2f 100644
--- a/arch/x86/configs/gki_defconfig
+++ b/arch/x86/configs/gki_defconfig
@@ -434,6 +434,7 @@ CONFIG_SECURITY_SELINUX=y
 CONFIG_INIT_STACK_ALL_ZERO=y
 CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y
 CONFIG_CRYPTO_ADIANTUM=y
+CONFIG_CRYPTO_BLAKE2B=y
 CONFIG_CRYPTO_SHA256_SSSE3=y
 CONFIG_CRYPTO_AES_NI_INTEL=y
 CONFIG_CRYPTO_LZ4=y

commit 2d990536752505a56f7847961dc5e277c28ebdeb
Author: Eric Biggers <ebiggers@google.com>
Date:   Wed Dec 23 00:10:03 2020 -0800

    BACKPORT: crypto: arm/blake2b - add NEON-accelerated BLAKE2b
    
    Add a NEON-accelerated implementation of BLAKE2b.
    
    On Cortex-A7 (which these days is the most common ARM processor that
    doesn't have the ARMv8 Crypto Extensions), this is over twice as fast as
    SHA-256, and slightly faster than SHA-1.  It is also almost three times
    as fast as the generic implementation of BLAKE2b:
    
            Algorithm            Cycles per byte (on 4096-byte messages)
            ===================  =======================================
            blake2b-256-neon     14.0
            sha1-neon            16.3
            blake2s-256-arm      18.8
            sha1-asm             20.8
            blake2s-256-generic  26.0
            sha256-neon          28.9
            sha256-asm           32.0
            blake2b-256-generic  38.9
    
    This implementation isn't directly based on any other implementation,
    but it borrows some ideas from previous NEON code I've written as well
    as from chacha-neon-core.S.  At least on Cortex-A7, it is faster than
    the other NEON implementations of BLAKE2b I'm aware of (the
    implementation in the BLAKE2 official repository using intrinsics, and
    Andrew Moon's implementation which can be found in SUPERCOP).  It does
    only one block at a time, so it performs well on short messages too.
    
    NEON-accelerated BLAKE2b is useful because there is interest in using
    BLAKE2b-256 for dm-verity on low-end Android devices (specifically,
    devices that lack the ARMv8 Crypto Extensions) to replace SHA-1.  On
    these devices, the performance cost of upgrading to SHA-256 may be
    unacceptable, whereas BLAKE2b-256 would actually improve performance.
    
    Although BLAKE2b is intended for 64-bit platforms (unlike BLAKE2s which
    is intended for 32-bit platforms), on 32-bit ARM processors with NEON,
    BLAKE2b is actually faster than BLAKE2s.  This is because NEON supports
    64-bit operations, and because BLAKE2s's block size is too small for
    NEON to be helpful for it.  The best I've been able to do with BLAKE2s
    on Cortex-A7 is 18.8 cpb with an optimized scalar implementation.
    
    (I didn't try BLAKE2sp and BLAKE3, which in theory would be faster, but
    they're more complex as they require running multiple hashes at once.
    Note that BLAKE2b already uses all the NEON bandwidth on the Cortex-A7,
    so I expect that any speedup from BLAKE2sp or BLAKE3 would come only
    from the smaller number of rounds, not from the extra parallelism.)
    
    For now this BLAKE2b implementation is only wired up to the shash API,
    since there is no library API for BLAKE2b yet.  However, I've tried to
    keep things consistent with BLAKE2s, e.g. by defining
    blake2b_compress_arch() which is analogous to blake2s_compress_arch()
    and could be exported for use by the library API later if needed.
    
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Eric Biggers <ebiggers@google.com>
    Tested-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit 1862eb007367f9e4cfd52d0406742de337b28ebf)
    (removed unnecessary return statement in blake2b_neon_mod_exit(),
     which was breaking the build because in pre-5.6 kernels
     crypto_unregister_shashes() returned 'int' rather than 'void')
    [adelva: replaced crypto_simd_usable() with may_use_simd()]
    Bug: 178411248
    Change-Id: I01557f0a63db0eb21778d0cc7b582ad89898d44a
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/arch/arm/crypto/Kconfig b/arch/arm/crypto/Kconfig
index 2ba1584536d5..e1b13fcc659a 100644
--- a/arch/arm/crypto/Kconfig
+++ b/arch/arm/crypto/Kconfig
@@ -71,6 +71,16 @@ config CRYPTO_BLAKE2S_ARM
 	  slower than the NEON implementation of BLAKE2b.  (There is no NEON
 	  implementation of BLAKE2s, since NEON doesn't really help with it.)
 
+config CRYPTO_BLAKE2B_NEON
+	tristate "BLAKE2b digest algorithm (ARM NEON)"
+	depends on KERNEL_MODE_NEON
+	select CRYPTO_BLAKE2B
+	help
+	  BLAKE2b digest algorithm optimized with ARM NEON instructions.
+	  On ARM processors that have NEON support but not the ARMv8
+	  Crypto Extensions, typically this BLAKE2b implementation is
+	  much faster than SHA-2 and slightly faster than SHA-1.
+
 config CRYPTO_AES_ARM
 	tristate "Scalar AES cipher for ARM"
 	select CRYPTO_ALGAPI
diff --git a/arch/arm/crypto/Makefile b/arch/arm/crypto/Makefile
index 46ee0c88b6c9..b0bfb14510d4 100644
--- a/arch/arm/crypto/Makefile
+++ b/arch/arm/crypto/Makefile
@@ -10,6 +10,7 @@ obj-$(CONFIG_CRYPTO_SHA1_ARM_NEON) += sha1-arm-neon.o
 obj-$(CONFIG_CRYPTO_SHA256_ARM) += sha256-arm.o
 obj-$(CONFIG_CRYPTO_SHA512_ARM) += sha512-arm.o
 obj-$(CONFIG_CRYPTO_BLAKE2S_ARM) += blake2s-arm.o
+obj-$(CONFIG_CRYPTO_BLAKE2B_NEON) += blake2b-neon.o
 obj-$(CONFIG_CRYPTO_CHACHA20_NEON) += chacha-neon.o
 obj-$(CONFIG_CRYPTO_POLY1305_ARM) += poly1305-arm.o
 obj-$(CONFIG_CRYPTO_NHPOLY1305_NEON) += nhpoly1305-neon.o
@@ -51,6 +52,7 @@ sha256-arm-y	:= sha256-core.o sha256_glue.o $(sha256-arm-neon-y)
 sha512-arm-neon-$(CONFIG_KERNEL_MODE_NEON) := sha512-neon-glue.o
 sha512-arm-y	:= sha512-core.o sha512-glue.o $(sha512-arm-neon-y)
 blake2s-arm-y   := blake2s-core.o blake2s-glue.o
+blake2b-neon-y  := blake2b-neon-core.o blake2b-neon-glue.o
 sha1-arm-ce-y	:= sha1-ce-core.o sha1-ce-glue.o
 sha2-arm-ce-y	:= sha2-ce-core.o sha2-ce-glue.o
 aes-arm-ce-y	:= aes-ce-core.o aes-ce-glue.o
diff --git a/arch/arm/crypto/blake2b-neon-core.S b/arch/arm/crypto/blake2b-neon-core.S
new file mode 100644
index 000000000000..0406a186377f
--- /dev/null
+++ b/arch/arm/crypto/blake2b-neon-core.S
@@ -0,0 +1,347 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * BLAKE2b digest algorithm, NEON accelerated
+ *
+ * Copyright 2020 Google LLC
+ *
+ * Author: Eric Biggers <ebiggers@google.com>
+ */
+
+#include <linux/linkage.h>
+
+	.text
+	.fpu		neon
+
+	// The arguments to blake2b_compress_neon()
+	STATE		.req	r0
+	BLOCK		.req	r1
+	NBLOCKS		.req	r2
+	INC		.req	r3
+
+	// Pointers to the rotation tables
+	ROR24_TABLE	.req	r4
+	ROR16_TABLE	.req	r5
+
+	// The original stack pointer
+	ORIG_SP		.req	r6
+
+	// NEON registers which contain the message words of the current block.
+	// M_0-M_3 are occasionally used for other purposes too.
+	M_0		.req	d16
+	M_1		.req	d17
+	M_2		.req	d18
+	M_3		.req	d19
+	M_4		.req	d20
+	M_5		.req	d21
+	M_6		.req	d22
+	M_7		.req	d23
+	M_8		.req	d24
+	M_9		.req	d25
+	M_10		.req	d26
+	M_11		.req	d27
+	M_12		.req	d28
+	M_13		.req	d29
+	M_14		.req	d30
+	M_15		.req	d31
+
+	.align		4
+	// Tables for computing ror64(x, 24) and ror64(x, 16) using the vtbl.8
+	// instruction.  This is the most efficient way to implement these
+	// rotation amounts with NEON.  (On Cortex-A53 it's the same speed as
+	// vshr.u64 + vsli.u64, while on Cortex-A7 it's faster.)
+.Lror24_table:
+	.byte		3, 4, 5, 6, 7, 0, 1, 2
+.Lror16_table:
+	.byte		2, 3, 4, 5, 6, 7, 0, 1
+	// The BLAKE2b initialization vector
+.Lblake2b_IV:
+	.quad		0x6a09e667f3bcc908, 0xbb67ae8584caa73b
+	.quad		0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1
+	.quad		0x510e527fade682d1, 0x9b05688c2b3e6c1f
+	.quad		0x1f83d9abfb41bd6b, 0x5be0cd19137e2179
+
+// Execute one round of BLAKE2b by updating the state matrix v[0..15] in the
+// NEON registers q0-q7.  The message block is in q8..q15 (M_0-M_15).  The stack
+// pointer points to a 32-byte aligned buffer containing a copy of q8 and q9
+// (M_0-M_3), so that they can be reloaded if they are used as temporary
+// registers.  The macro arguments s0-s15 give the order in which the message
+// words are used in this round.  'final' is 1 if this is the final round.
+.macro	_blake2b_round	s0, s1, s2, s3, s4, s5, s6, s7, \
+			s8, s9, s10, s11, s12, s13, s14, s15, final=0
+
+	// Mix the columns:
+	// (v[0], v[4], v[8], v[12]), (v[1], v[5], v[9], v[13]),
+	// (v[2], v[6], v[10], v[14]), and (v[3], v[7], v[11], v[15]).
+
+	// a += b + m[blake2b_sigma[r][2*i + 0]];
+	vadd.u64	q0, q0, q2
+	vadd.u64	q1, q1, q3
+	vadd.u64	d0, d0, M_\s0
+	vadd.u64	d1, d1, M_\s2
+	vadd.u64	d2, d2, M_\s4
+	vadd.u64	d3, d3, M_\s6
+
+	// d = ror64(d ^ a, 32);
+	veor		q6, q6, q0
+	veor		q7, q7, q1
+	vrev64.32	q6, q6
+	vrev64.32	q7, q7
+
+	// c += d;
+	vadd.u64	q4, q4, q6
+	vadd.u64	q5, q5, q7
+
+	// b = ror64(b ^ c, 24);
+	vld1.8		{M_0}, [ROR24_TABLE, :64]
+	veor		q2, q2, q4
+	veor		q3, q3, q5
+	vtbl.8		d4, {d4}, M_0
+	vtbl.8		d5, {d5}, M_0
+	vtbl.8		d6, {d6}, M_0
+	vtbl.8		d7, {d7}, M_0
+
+	// a += b + m[blake2b_sigma[r][2*i + 1]];
+	//
+	// M_0 got clobbered above, so we have to reload it if any of the four
+	// message words this step needs happens to be M_0.  Otherwise we don't
+	// need to reload it here, as it will just get clobbered again below.
+.if \s1 == 0 || \s3 == 0 || \s5 == 0 || \s7 == 0
+	vld1.8		{M_0}, [sp, :64]
+.endif
+	vadd.u64	q0, q0, q2
+	vadd.u64	q1, q1, q3
+	vadd.u64	d0, d0, M_\s1
+	vadd.u64	d1, d1, M_\s3
+	vadd.u64	d2, d2, M_\s5
+	vadd.u64	d3, d3, M_\s7
+
+	// d = ror64(d ^ a, 16);
+	vld1.8		{M_0}, [ROR16_TABLE, :64]
+	veor		q6, q6, q0
+	veor		q7, q7, q1
+	vtbl.8		d12, {d12}, M_0
+	vtbl.8		d13, {d13}, M_0
+	vtbl.8		d14, {d14}, M_0
+	vtbl.8		d15, {d15}, M_0
+
+	// c += d;
+	vadd.u64	q4, q4, q6
+	vadd.u64	q5, q5, q7
+
+	// b = ror64(b ^ c, 63);
+	//
+	// This rotation amount isn't a multiple of 8, so it has to be
+	// implemented using a pair of shifts, which requires temporary
+	// registers.  Use q8-q9 (M_0-M_3) for this, and reload them afterwards.
+	veor		q8, q2, q4
+	veor		q9, q3, q5
+	vshr.u64	q2, q8, #63
+	vshr.u64	q3, q9, #63
+	vsli.u64	q2, q8, #1
+	vsli.u64	q3, q9, #1
+	vld1.8		{q8-q9}, [sp, :256]
+
+	// Mix the diagonals:
+	// (v[0], v[5], v[10], v[15]), (v[1], v[6], v[11], v[12]),
+	// (v[2], v[7], v[8], v[13]), and (v[3], v[4], v[9], v[14]).
+	//
+	// There are two possible ways to do this: use 'vext' instructions to
+	// shift the rows of the matrix so that the diagonals become columns,
+	// and undo it afterwards; or just use 64-bit operations on 'd'
+	// registers instead of 128-bit operations on 'q' registers.  We use the
+	// latter approach, as it performs much better on Cortex-A7.
+
+	// a += b + m[blake2b_sigma[r][2*i + 0]];
+	vadd.u64	d0, d0, d5
+	vadd.u64	d1, d1, d6
+	vadd.u64	d2, d2, d7
+	vadd.u64	d3, d3, d4
+	vadd.u64	d0, d0, M_\s8
+	vadd.u64	d1, d1, M_\s10
+	vadd.u64	d2, d2, M_\s12
+	vadd.u64	d3, d3, M_\s14
+
+	// d = ror64(d ^ a, 32);
+	veor		d15, d15, d0
+	veor		d12, d12, d1
+	veor		d13, d13, d2
+	veor		d14, d14, d3
+	vrev64.32	d15, d15
+	vrev64.32	d12, d12
+	vrev64.32	d13, d13
+	vrev64.32	d14, d14
+
+	// c += d;
+	vadd.u64	d10, d10, d15
+	vadd.u64	d11, d11, d12
+	vadd.u64	d8, d8, d13
+	vadd.u64	d9, d9, d14
+
+	// b = ror64(b ^ c, 24);
+	vld1.8		{M_0}, [ROR24_TABLE, :64]
+	veor		d5, d5, d10
+	veor		d6, d6, d11
+	veor		d7, d7, d8
+	veor		d4, d4, d9
+	vtbl.8		d5, {d5}, M_0
+	vtbl.8		d6, {d6}, M_0
+	vtbl.8		d7, {d7}, M_0
+	vtbl.8		d4, {d4}, M_0
+
+	// a += b + m[blake2b_sigma[r][2*i + 1]];
+.if \s9 == 0 || \s11 == 0 || \s13 == 0 || \s15 == 0
+	vld1.8		{M_0}, [sp, :64]
+.endif
+	vadd.u64	d0, d0, d5
+	vadd.u64	d1, d1, d6
+	vadd.u64	d2, d2, d7
+	vadd.u64	d3, d3, d4
+	vadd.u64	d0, d0, M_\s9
+	vadd.u64	d1, d1, M_\s11
+	vadd.u64	d2, d2, M_\s13
+	vadd.u64	d3, d3, M_\s15
+
+	// d = ror64(d ^ a, 16);
+	vld1.8		{M_0}, [ROR16_TABLE, :64]
+	veor		d15, d15, d0
+	veor		d12, d12, d1
+	veor		d13, d13, d2
+	veor		d14, d14, d3
+	vtbl.8		d12, {d12}, M_0
+	vtbl.8		d13, {d13}, M_0
+	vtbl.8		d14, {d14}, M_0
+	vtbl.8		d15, {d15}, M_0
+
+	// c += d;
+	vadd.u64	d10, d10, d15
+	vadd.u64	d11, d11, d12
+	vadd.u64	d8, d8, d13
+	vadd.u64	d9, d9, d14
+
+	// b = ror64(b ^ c, 63);
+	veor		d16, d4, d9
+	veor		d17, d5, d10
+	veor		d18, d6, d11
+	veor		d19, d7, d8
+	vshr.u64	q2, q8, #63
+	vshr.u64	q3, q9, #63
+	vsli.u64	q2, q8, #1
+	vsli.u64	q3, q9, #1
+	// Reloading q8-q9 can be skipped on the final round.
+.if ! \final
+	vld1.8		{q8-q9}, [sp, :256]
+.endif
+.endm
+
+//
+// void blake2b_compress_neon(struct blake2b_state *state,
+//			      const u8 *block, size_t nblocks, u32 inc);
+//
+// Only the first three fields of struct blake2b_state are used:
+//	u64 h[8];	(inout)
+//	u64 t[2];	(inout)
+//	u64 f[2];	(in)
+//
+	.align		5
+ENTRY(blake2b_compress_neon)
+	push		{r4-r10}
+
+	// Allocate a 32-byte stack buffer that is 32-byte aligned.
+	mov		ORIG_SP, sp
+	sub		ip, sp, #32
+	bic		ip, ip, #31
+	mov		sp, ip
+
+	adr		ROR24_TABLE, .Lror24_table
+	adr		ROR16_TABLE, .Lror16_table
+
+	mov		ip, STATE
+	vld1.64		{q0-q1}, [ip]!		// Load h[0..3]
+	vld1.64		{q2-q3}, [ip]!		// Load h[4..7]
+.Lnext_block:
+	  adr		r10, .Lblake2b_IV
+	vld1.64		{q14-q15}, [ip]		// Load t[0..1] and f[0..1]
+	vld1.64		{q4-q5}, [r10]!		// Load IV[0..3]
+	  vmov		r7, r8, d28		// Copy t[0] to (r7, r8)
+	vld1.64		{q6-q7}, [r10]		// Load IV[4..7]
+	  adds		r7, r7, INC		// Increment counter
+	bcs		.Lslow_inc_ctr
+	vmov.i32	d28[0], r7
+	vst1.64		{d28}, [ip]		// Update t[0]
+.Linc_ctr_done:
+
+	// Load the next message block and finish initializing the state matrix
+	// 'v'.  Fortunately, there are exactly enough NEON registers to fit the
+	// entire state matrix in q0-q7 and the entire message block in q8-15.
+	//
+	// However, _blake2b_round also needs some extra registers for rotates,
+	// so we have to spill some registers.  It's better to spill the message
+	// registers than the state registers, as the message doesn't change.
+	// Therefore we store a copy of the first 32 bytes of the message block
+	// (q8-q9) in an aligned buffer on the stack so that they can be
+	// reloaded when needed.  (We could just reload directly from the
+	// message buffer, but it's faster to use aligned loads.)
+	vld1.8		{q8-q9}, [BLOCK]!
+	  veor		q6, q6, q14	// v[12..13] = IV[4..5] ^ t[0..1]
+	vld1.8		{q10-q11}, [BLOCK]!
+	  veor		q7, q7, q15	// v[14..15] = IV[6..7] ^ f[0..1]
+	vld1.8		{q12-q13}, [BLOCK]!
+	vst1.8		{q8-q9}, [sp, :256]
+	  mov		ip, STATE
+	vld1.8		{q14-q15}, [BLOCK]!
+
+	// Execute the rounds.  Each round is provided the order in which it
+	// needs to use the message words.
+	_blake2b_round	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
+	_blake2b_round	14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3
+	_blake2b_round	11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4
+	_blake2b_round	7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8
+	_blake2b_round	9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13
+	_blake2b_round	2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9
+	_blake2b_round	12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11
+	_blake2b_round	13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10
+	_blake2b_round	6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5
+	_blake2b_round	10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0
+	_blake2b_round	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
+	_blake2b_round	14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 \
+			final=1
+
+	// Fold the final state matrix into the hash chaining value:
+	//
+	//	for (i = 0; i < 8; i++)
+	//		h[i] ^= v[i] ^ v[i + 8];
+	//
+	  vld1.64	{q8-q9}, [ip]!		// Load old h[0..3]
+	veor		q0, q0, q4		// v[0..1] ^= v[8..9]
+	veor		q1, q1, q5		// v[2..3] ^= v[10..11]
+	  vld1.64	{q10-q11}, [ip]		// Load old h[4..7]
+	veor		q2, q2, q6		// v[4..5] ^= v[12..13]
+	veor		q3, q3, q7		// v[6..7] ^= v[14..15]
+	veor		q0, q0, q8		// v[0..1] ^= h[0..1]
+	veor		q1, q1, q9		// v[2..3] ^= h[2..3]
+	  mov		ip, STATE
+	  subs		NBLOCKS, NBLOCKS, #1	// nblocks--
+	  vst1.64	{q0-q1}, [ip]!		// Store new h[0..3]
+	veor		q2, q2, q10		// v[4..5] ^= h[4..5]
+	veor		q3, q3, q11		// v[6..7] ^= h[6..7]
+	  vst1.64	{q2-q3}, [ip]!		// Store new h[4..7]
+
+	// Advance to the next block, if there is one.
+	bne		.Lnext_block		// nblocks != 0?
+
+	mov		sp, ORIG_SP
+	pop		{r4-r10}
+	mov		pc, lr
+
+.Lslow_inc_ctr:
+	// Handle the case where the counter overflowed its low 32 bits, by
+	// carrying the overflow bit into the full 128-bit counter.
+	vmov		r9, r10, d29
+	adcs		r8, r8, #0
+	adcs		r9, r9, #0
+	adc		r10, r10, #0
+	vmov		d28, r7, r8
+	vmov		d29, r9, r10
+	vst1.64		{q14}, [ip]		// Update t[0] and t[1]
+	b		.Linc_ctr_done
+ENDPROC(blake2b_compress_neon)
diff --git a/arch/arm/crypto/blake2b-neon-glue.c b/arch/arm/crypto/blake2b-neon-glue.c
new file mode 100644
index 000000000000..f658108496e2
--- /dev/null
+++ b/arch/arm/crypto/blake2b-neon-glue.c
@@ -0,0 +1,105 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * BLAKE2b digest algorithm, NEON accelerated
+ *
+ * Copyright 2020 Google LLC
+ */
+
+#include <crypto/internal/blake2b.h>
+#include <crypto/internal/hash.h>
+#include <crypto/internal/simd.h>
+
+#include <linux/module.h>
+#include <linux/sizes.h>
+
+#include <asm/neon.h>
+#include <asm/simd.h>
+
+asmlinkage void blake2b_compress_neon(struct blake2b_state *state,
+				      const u8 *block, size_t nblocks, u32 inc);
+
+static void blake2b_compress_arch(struct blake2b_state *state,
+				  const u8 *block, size_t nblocks, u32 inc)
+{
+	if (!may_use_simd()) {
+		blake2b_compress_generic(state, block, nblocks, inc);
+		return;
+	}
+
+	do {
+		const size_t blocks = min_t(size_t, nblocks,
+					    SZ_4K / BLAKE2B_BLOCK_SIZE);
+
+		kernel_neon_begin();
+		blake2b_compress_neon(state, block, blocks, inc);
+		kernel_neon_end();
+
+		nblocks -= blocks;
+		block += blocks * BLAKE2B_BLOCK_SIZE;
+	} while (nblocks);
+}
+
+static int crypto_blake2b_update_neon(struct shash_desc *desc,
+				      const u8 *in, unsigned int inlen)
+{
+	return crypto_blake2b_update(desc, in, inlen, blake2b_compress_arch);
+}
+
+static int crypto_blake2b_final_neon(struct shash_desc *desc, u8 *out)
+{
+	return crypto_blake2b_final(desc, out, blake2b_compress_arch);
+}
+
+#define BLAKE2B_ALG(name, driver_name, digest_size)			\
+	{								\
+		.base.cra_name		= name,				\
+		.base.cra_driver_name	= driver_name,			\
+		.base.cra_priority	= 200,				\
+		.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,	\
+		.base.cra_blocksize	= BLAKE2B_BLOCK_SIZE,		\
+		.base.cra_ctxsize	= sizeof(struct blake2b_tfm_ctx), \
+		.base.cra_module	= THIS_MODULE,			\
+		.digestsize		= digest_size,			\
+		.setkey			= crypto_blake2b_setkey,	\
+		.init			= crypto_blake2b_init,		\
+		.update			= crypto_blake2b_update_neon,	\
+		.final			= crypto_blake2b_final_neon,	\
+		.descsize		= sizeof(struct blake2b_state),	\
+	}
+
+static struct shash_alg blake2b_neon_algs[] = {
+	BLAKE2B_ALG("blake2b-160", "blake2b-160-neon", BLAKE2B_160_HASH_SIZE),
+	BLAKE2B_ALG("blake2b-256", "blake2b-256-neon", BLAKE2B_256_HASH_SIZE),
+	BLAKE2B_ALG("blake2b-384", "blake2b-384-neon", BLAKE2B_384_HASH_SIZE),
+	BLAKE2B_ALG("blake2b-512", "blake2b-512-neon", BLAKE2B_512_HASH_SIZE),
+};
+
+static int __init blake2b_neon_mod_init(void)
+{
+	if (!(elf_hwcap & HWCAP_NEON))
+		return -ENODEV;
+
+	return crypto_register_shashes(blake2b_neon_algs,
+				       ARRAY_SIZE(blake2b_neon_algs));
+}
+
+static void __exit blake2b_neon_mod_exit(void)
+{
+	crypto_unregister_shashes(blake2b_neon_algs,
+				  ARRAY_SIZE(blake2b_neon_algs));
+}
+
+module_init(blake2b_neon_mod_init);
+module_exit(blake2b_neon_mod_exit);
+
+MODULE_DESCRIPTION("BLAKE2b digest algorithm, NEON accelerated");
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Eric Biggers <ebiggers@google.com>");
+MODULE_ALIAS_CRYPTO("blake2b-160");
+MODULE_ALIAS_CRYPTO("blake2b-160-neon");
+MODULE_ALIAS_CRYPTO("blake2b-256");
+MODULE_ALIAS_CRYPTO("blake2b-256-neon");
+MODULE_ALIAS_CRYPTO("blake2b-384");
+MODULE_ALIAS_CRYPTO("blake2b-384-neon");
+MODULE_ALIAS_CRYPTO("blake2b-512");
+MODULE_ALIAS_CRYPTO("blake2b-512-neon");

commit b8b88229e78d87fe5579c4f7982b9202db744865
Author: Eric Biggers <ebiggers@google.com>
Date:   Wed Dec 23 00:10:02 2020 -0800

    BACKPORT: crypto: blake2b - update file comment
    
    The file comment for blake2b_generic.c makes it sound like it's the
    reference implementation of BLAKE2b with only minor changes.  But it's
    actually been changed a lot.  Update the comment to make this clearer.
    
    Reviewed-by: David Sterba <dsterba@suse.com>
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Eric Biggers <ebiggers@google.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit 0cdc438e6e13436b0190910ef7da49ce4f5a44f4)
    
    Conflicts:
            crypto/blake2b_generic.c
    
    (trivial conflict due to upstream commit 9332a9e73918,
    "crypto: Replace HTTP links with HTTPS ones")
    
    Bug: 178411248
    Change-Id: I8b58cd0e2892a873866ead52fa4dba3edabdeeb3
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/crypto/blake2b_generic.c b/crypto/blake2b_generic.c
index f336fbf9cb28..6704c0355889 100644
--- a/crypto/blake2b_generic.c
+++ b/crypto/blake2b_generic.c
@@ -1,21 +1,18 @@
 // SPDX-License-Identifier: (GPL-2.0-only OR Apache-2.0)
 /*
- * BLAKE2b reference source code package - reference C implementations
+ * Generic implementation of the BLAKE2b digest algorithm.  Based on the BLAKE2b
+ * reference implementation, but it has been heavily modified for use in the
+ * kernel.  The reference implementation was:
  *
- * Copyright 2012, Samuel Neves <sneves@dei.uc.pt>.  You may use this under the
- * terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at
- * your option.  The terms of these licenses can be found at:
+ *	Copyright 2012, Samuel Neves <sneves@dei.uc.pt>.  You may use this under
+ *	the terms of the CC0, the OpenSSL Licence, or the Apache Public License
+ *	2.0, at your option.  The terms of these licenses can be found at:
  *
- * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
- * - OpenSSL license   : https://www.openssl.org/source/license.html
- * - Apache 2.0        : http://www.apache.org/licenses/LICENSE-2.0
+ *	- CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
+ *	- OpenSSL license   : https://www.openssl.org/source/license.html
+ *	- Apache 2.0        : https://www.apache.org/licenses/LICENSE-2.0
  *
- * More information about the BLAKE2 hash function can be found at
- * https://blake2.net.
- *
- * Note: the original sources have been modified for inclusion in linux kernel
- * in terms of coding style, using generic helpers and simplifications of error
- * handling.
+ * More information about BLAKE2 can be found at https://blake2.net.
  */
 
 #include <asm/unaligned.h>

commit e9f2289a4bf1ec79a40d9f77e5acb882f2e871fa
Author: Eric Biggers <ebiggers@google.com>
Date:   Wed Dec 23 00:10:01 2020 -0800

    BACKPORT: crypto: blake2b - sync with blake2s implementation
    
    Sync the BLAKE2b code with the BLAKE2s code as much as possible:
    
    - Move a lot of code into new headers <crypto/blake2b.h> and
      <crypto/internal/blake2b.h>, and adjust it to be like the
      corresponding BLAKE2s code, i.e. like <crypto/blake2s.h> and
      <crypto/internal/blake2s.h>.
    
    - Rename constants, e.g. BLAKE2B_*_DIGEST_SIZE => BLAKE2B_*_HASH_SIZE.
    
    - Use a macro BLAKE2B_ALG() to define the shash_alg structs.
    
    - Export blake2b_compress_generic() for use as a fallback.
    
    This makes it much easier to add optimized implementations of BLAKE2b,
    as optimized implementations can use the helper functions
    crypto_blake2b_{setkey,init,update,final}() and
    blake2b_compress_generic().  The ARM implementation will use these.
    
    But this change is also helpful because it eliminates unnecessary
    differences between the BLAKE2b and BLAKE2s code, so that the same
    improvements can easily be made to both.  (The two algorithms are
    basically identical, except for the word size and constants.)  It also
    makes it straightforward to add a library API for BLAKE2b in the future
    if/when it's needed.
    
    This change does make the BLAKE2b code slightly more complicated than it
    needs to be, as it doesn't actually provide a library API yet.  For
    example, __blake2b_update() doesn't really need to exist yet; it could
    just be inlined into crypto_blake2b_update().  But I believe this is
    outweighed by the benefits of keeping the code in sync.
    
    Signed-off-by: Eric Biggers <ebiggers@google.com>
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit 28dcca4cc0c01e2467549a36b1b0eacfdb01236c)
    
    Conflicts:
            crypto/blake2b_generic.c
    
    (conflict due to this branch not having commit 674f368a952c,
    "crypto: remove CRYPTO_TFM_RES_BAD_KEY_LEN")
    
    Bug: 178411248
    Change-Id: I755c64fefe1209b54d1417d91e8a4c207382a620
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/crypto/blake2b_generic.c b/crypto/blake2b_generic.c
index 2f15a9725054..f336fbf9cb28 100644
--- a/crypto/blake2b_generic.c
+++ b/crypto/blake2b_generic.c
@@ -20,36 +20,11 @@
 
 #include <asm/unaligned.h>
 #include <linux/module.h>
-#include <linux/string.h>
 #include <linux/kernel.h>
 #include <linux/bitops.h>
+#include <crypto/internal/blake2b.h>
 #include <crypto/internal/hash.h>
 
-#define BLAKE2B_160_DIGEST_SIZE		(160 / 8)
-#define BLAKE2B_256_DIGEST_SIZE		(256 / 8)
-#define BLAKE2B_384_DIGEST_SIZE		(384 / 8)
-#define BLAKE2B_512_DIGEST_SIZE		(512 / 8)
-
-enum blake2b_constant {
-	BLAKE2B_BLOCKBYTES    = 128,
-	BLAKE2B_KEYBYTES      = 64,
-};
-
-struct blake2b_state {
-	u64      h[8];
-	u64      t[2];
-	u64      f[2];
-	u8       buf[BLAKE2B_BLOCKBYTES];
-	size_t   buflen;
-};
-
-static const u64 blake2b_IV[8] = {
-	0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL,
-	0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL,
-	0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL,
-	0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL
-};
-
 static const u8 blake2b_sigma[12][16] = {
 	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15 },
 	{ 14, 10,  4,  8,  9, 15, 13,  6,  1, 12,  0,  2, 11,  7,  5,  3 },
@@ -95,8 +70,8 @@ static void blake2b_increment_counter(struct blake2b_state *S, const u64 inc)
 		G(r,7,v[ 3],v[ 4],v[ 9],v[14]); \
 	} while (0)
 
-static void blake2b_compress(struct blake2b_state *S,
-			     const u8 block[BLAKE2B_BLOCKBYTES])
+static void blake2b_compress_one_generic(struct blake2b_state *S,
+					 const u8 block[BLAKE2B_BLOCK_SIZE])
 {
 	u64 m[16];
 	u64 v[16];
@@ -108,14 +83,14 @@ static void blake2b_compress(struct blake2b_state *S,
 	for (i = 0; i < 8; ++i)
 		v[i] = S->h[i];
 
-	v[ 8] = blake2b_IV[0];
-	v[ 9] = blake2b_IV[1];
-	v[10] = blake2b_IV[2];
-	v[11] = blake2b_IV[3];
-	v[12] = blake2b_IV[4] ^ S->t[0];
-	v[13] = blake2b_IV[5] ^ S->t[1];
-	v[14] = blake2b_IV[6] ^ S->f[0];
-	v[15] = blake2b_IV[7] ^ S->f[1];
+	v[ 8] = BLAKE2B_IV0;
+	v[ 9] = BLAKE2B_IV1;
+	v[10] = BLAKE2B_IV2;
+	v[11] = BLAKE2B_IV3;
+	v[12] = BLAKE2B_IV4 ^ S->t[0];
+	v[13] = BLAKE2B_IV5 ^ S->t[1];
+	v[14] = BLAKE2B_IV6 ^ S->f[0];
+	v[15] = BLAKE2B_IV7 ^ S->f[1];
 
 	ROUND(0);
 	ROUND(1);
@@ -139,161 +114,54 @@ static void blake2b_compress(struct blake2b_state *S,
 #undef G
 #undef ROUND
 
-struct blake2b_tfm_ctx {
-	u8 key[BLAKE2B_KEYBYTES];
-	unsigned int keylen;
-};
-
-static int blake2b_setkey(struct crypto_shash *tfm, const u8 *key,
-			  unsigned int keylen)
+void blake2b_compress_generic(struct blake2b_state *state,
+			      const u8 *block, size_t nblocks, u32 inc)
 {
-	struct blake2b_tfm_ctx *tctx = crypto_shash_ctx(tfm);
-
-	if (keylen == 0 || keylen > BLAKE2B_KEYBYTES) {
-		crypto_shash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN);
-		return -EINVAL;
-	}
-
-	memcpy(tctx->key, key, keylen);
-	tctx->keylen = keylen;
-
-	return 0;
+	do {
+		blake2b_increment_counter(state, inc);
+		blake2b_compress_one_generic(state, block);
+		block += BLAKE2B_BLOCK_SIZE;
+	} while (--nblocks);
 }
+EXPORT_SYMBOL(blake2b_compress_generic);
 
-static int blake2b_init(struct shash_desc *desc)
+static int crypto_blake2b_update_generic(struct shash_desc *desc,
+					 const u8 *in, unsigned int inlen)
 {
-	struct blake2b_tfm_ctx *tctx = crypto_shash_ctx(desc->tfm);
-	struct blake2b_state *state = shash_desc_ctx(desc);
-	const int digestsize = crypto_shash_digestsize(desc->tfm);
-
-	memset(state, 0, sizeof(*state));
-	memcpy(state->h, blake2b_IV, sizeof(state->h));
-
-	/* Parameter block is all zeros except index 0, no xor for 1..7 */
-	state->h[0] ^= 0x01010000 | tctx->keylen << 8 | digestsize;
-
-	if (tctx->keylen) {
-		/*
-		 * Prefill the buffer with the key, next call to _update or
-		 * _final will process it
-		 */
-		memcpy(state->buf, tctx->key, tctx->keylen);
-		state->buflen = BLAKE2B_BLOCKBYTES;
-	}
-	return 0;
+	return crypto_blake2b_update(desc, in, inlen, blake2b_compress_generic);
 }
 
-static int blake2b_update(struct shash_desc *desc, const u8 *in,
-			  unsigned int inlen)
+static int crypto_blake2b_final_generic(struct shash_desc *desc, u8 *out)
 {
-	struct blake2b_state *state = shash_desc_ctx(desc);
-	const size_t left = state->buflen;
-	const size_t fill = BLAKE2B_BLOCKBYTES - left;
-
-	if (!inlen)
-		return 0;
-
-	if (inlen > fill) {
-		state->buflen = 0;
-		/* Fill buffer */
-		memcpy(state->buf + left, in, fill);
-		blake2b_increment_counter(state, BLAKE2B_BLOCKBYTES);
-		/* Compress */
-		blake2b_compress(state, state->buf);
-		in += fill;
-		inlen -= fill;
-		while (inlen > BLAKE2B_BLOCKBYTES) {
-			blake2b_increment_counter(state, BLAKE2B_BLOCKBYTES);
-			blake2b_compress(state, in);
-			in += BLAKE2B_BLOCKBYTES;
-			inlen -= BLAKE2B_BLOCKBYTES;
-		}
-	}
-	memcpy(state->buf + state->buflen, in, inlen);
-	state->buflen += inlen;
-
-	return 0;
+	return crypto_blake2b_final(desc, out, blake2b_compress_generic);
 }
 
-static int blake2b_final(struct shash_desc *desc, u8 *out)
-{
-	struct blake2b_state *state = shash_desc_ctx(desc);
-	const int digestsize = crypto_shash_digestsize(desc->tfm);
-	size_t i;
-
-	blake2b_increment_counter(state, state->buflen);
-	/* Set last block */
-	state->f[0] = (u64)-1;
-	/* Padding */
-	memset(state->buf + state->buflen, 0, BLAKE2B_BLOCKBYTES - state->buflen);
-	blake2b_compress(state, state->buf);
-
-	/* Avoid temporary buffer and switch the internal output to LE order */
-	for (i = 0; i < ARRAY_SIZE(state->h); i++)
-		__cpu_to_le64s(&state->h[i]);
-
-	memcpy(out, state->h, digestsize);
-	return 0;
-}
+#define BLAKE2B_ALG(name, driver_name, digest_size)			\
+	{								\
+		.base.cra_name		= name,				\
+		.base.cra_driver_name	= driver_name,			\
+		.base.cra_priority	= 100,				\
+		.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,	\
+		.base.cra_blocksize	= BLAKE2B_BLOCK_SIZE,		\
+		.base.cra_ctxsize	= sizeof(struct blake2b_tfm_ctx), \
+		.base.cra_module	= THIS_MODULE,			\
+		.digestsize		= digest_size,			\
+		.setkey			= crypto_blake2b_setkey,	\
+		.init			= crypto_blake2b_init,		\
+		.update			= crypto_blake2b_update_generic, \
+		.final			= crypto_blake2b_final_generic,	\
+		.descsize		= sizeof(struct blake2b_state),	\
+	}
 
 static struct shash_alg blake2b_algs[] = {
-	{
-		.base.cra_name		= "blake2b-160",
-		.base.cra_driver_name	= "blake2b-160-generic",
-		.base.cra_priority	= 100,
-		.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,
-		.base.cra_blocksize	= BLAKE2B_BLOCKBYTES,
-		.base.cra_ctxsize	= sizeof(struct blake2b_tfm_ctx),
-		.base.cra_module	= THIS_MODULE,
-		.digestsize		= BLAKE2B_160_DIGEST_SIZE,
-		.setkey			= blake2b_setkey,
-		.init			= blake2b_init,
-		.update			= blake2b_update,
-		.final			= blake2b_final,
-		.descsize		= sizeof(struct blake2b_state),
-	}, {
-		.base.cra_name		= "blake2b-256",
-		.base.cra_driver_name	= "blake2b-256-generic",
-		.base.cra_priority	= 100,
-		.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,
-		.base.cra_blocksize	= BLAKE2B_BLOCKBYTES,
-		.base.cra_ctxsize	= sizeof(struct blake2b_tfm_ctx),
-		.base.cra_module	= THIS_MODULE,
-		.digestsize		= BLAKE2B_256_DIGEST_SIZE,
-		.setkey			= blake2b_setkey,
-		.init			= blake2b_init,
-		.update			= blake2b_update,
-		.final			= blake2b_final,
-		.descsize		= sizeof(struct blake2b_state),
-	}, {
-		.base.cra_name		= "blake2b-384",
-		.base.cra_driver_name	= "blake2b-384-generic",
-		.base.cra_priority	= 100,
-		.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,
-		.base.cra_blocksize	= BLAKE2B_BLOCKBYTES,
-		.base.cra_ctxsize	= sizeof(struct blake2b_tfm_ctx),
-		.base.cra_module	= THIS_MODULE,
-		.digestsize		= BLAKE2B_384_DIGEST_SIZE,
-		.setkey			= blake2b_setkey,
-		.init			= blake2b_init,
-		.update			= blake2b_update,
-		.final			= blake2b_final,
-		.descsize		= sizeof(struct blake2b_state),
-	}, {
-		.base.cra_name		= "blake2b-512",
-		.base.cra_driver_name	= "blake2b-512-generic",
-		.base.cra_priority	= 100,
-		.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,
-		.base.cra_blocksize	= BLAKE2B_BLOCKBYTES,
-		.base.cra_ctxsize	= sizeof(struct blake2b_tfm_ctx),
-		.base.cra_module	= THIS_MODULE,
-		.digestsize		= BLAKE2B_512_DIGEST_SIZE,
-		.setkey			= blake2b_setkey,
-		.init			= blake2b_init,
-		.update			= blake2b_update,
-		.final			= blake2b_final,
-		.descsize		= sizeof(struct blake2b_state),
-	}
+	BLAKE2B_ALG("blake2b-160", "blake2b-160-generic",
+		    BLAKE2B_160_HASH_SIZE),
+	BLAKE2B_ALG("blake2b-256", "blake2b-256-generic",
+		    BLAKE2B_256_HASH_SIZE),
+	BLAKE2B_ALG("blake2b-384", "blake2b-384-generic",
+		    BLAKE2B_384_HASH_SIZE),
+	BLAKE2B_ALG("blake2b-512", "blake2b-512-generic",
+		    BLAKE2B_512_HASH_SIZE),
 };
 
 static int __init blake2b_mod_init(void)
diff --git a/include/crypto/blake2b.h b/include/crypto/blake2b.h
new file mode 100644
index 000000000000..18875f16f8ca
--- /dev/null
+++ b/include/crypto/blake2b.h
@@ -0,0 +1,67 @@
+/* SPDX-License-Identifier: GPL-2.0 OR MIT */
+
+#ifndef _CRYPTO_BLAKE2B_H
+#define _CRYPTO_BLAKE2B_H
+
+#include <linux/bug.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+
+enum blake2b_lengths {
+	BLAKE2B_BLOCK_SIZE = 128,
+	BLAKE2B_HASH_SIZE = 64,
+	BLAKE2B_KEY_SIZE = 64,
+
+	BLAKE2B_160_HASH_SIZE = 20,
+	BLAKE2B_256_HASH_SIZE = 32,
+	BLAKE2B_384_HASH_SIZE = 48,
+	BLAKE2B_512_HASH_SIZE = 64,
+};
+
+struct blake2b_state {
+	/* 'h', 't', and 'f' are used in assembly code, so keep them as-is. */
+	u64 h[8];
+	u64 t[2];
+	u64 f[2];
+	u8 buf[BLAKE2B_BLOCK_SIZE];
+	unsigned int buflen;
+	unsigned int outlen;
+};
+
+enum blake2b_iv {
+	BLAKE2B_IV0 = 0x6A09E667F3BCC908ULL,
+	BLAKE2B_IV1 = 0xBB67AE8584CAA73BULL,
+	BLAKE2B_IV2 = 0x3C6EF372FE94F82BULL,
+	BLAKE2B_IV3 = 0xA54FF53A5F1D36F1ULL,
+	BLAKE2B_IV4 = 0x510E527FADE682D1ULL,
+	BLAKE2B_IV5 = 0x9B05688C2B3E6C1FULL,
+	BLAKE2B_IV6 = 0x1F83D9ABFB41BD6BULL,
+	BLAKE2B_IV7 = 0x5BE0CD19137E2179ULL,
+};
+
+static inline void __blake2b_init(struct blake2b_state *state, size_t outlen,
+				  const void *key, size_t keylen)
+{
+	state->h[0] = BLAKE2B_IV0 ^ (0x01010000 | keylen << 8 | outlen);
+	state->h[1] = BLAKE2B_IV1;
+	state->h[2] = BLAKE2B_IV2;
+	state->h[3] = BLAKE2B_IV3;
+	state->h[4] = BLAKE2B_IV4;
+	state->h[5] = BLAKE2B_IV5;
+	state->h[6] = BLAKE2B_IV6;
+	state->h[7] = BLAKE2B_IV7;
+	state->t[0] = 0;
+	state->t[1] = 0;
+	state->f[0] = 0;
+	state->f[1] = 0;
+	state->buflen = 0;
+	state->outlen = outlen;
+	if (keylen) {
+		memcpy(state->buf, key, keylen);
+		memset(&state->buf[keylen], 0, BLAKE2B_BLOCK_SIZE - keylen);
+		state->buflen = BLAKE2B_BLOCK_SIZE;
+	}
+}
+
+#endif /* _CRYPTO_BLAKE2B_H */
diff --git a/include/crypto/internal/blake2b.h b/include/crypto/internal/blake2b.h
new file mode 100644
index 000000000000..982fe5e8471c
--- /dev/null
+++ b/include/crypto/internal/blake2b.h
@@ -0,0 +1,115 @@
+/* SPDX-License-Identifier: GPL-2.0 OR MIT */
+/*
+ * Helper functions for BLAKE2b implementations.
+ * Keep this in sync with the corresponding BLAKE2s header.
+ */
+
+#ifndef _CRYPTO_INTERNAL_BLAKE2B_H
+#define _CRYPTO_INTERNAL_BLAKE2B_H
+
+#include <crypto/blake2b.h>
+#include <crypto/internal/hash.h>
+#include <linux/string.h>
+
+void blake2b_compress_generic(struct blake2b_state *state,
+			      const u8 *block, size_t nblocks, u32 inc);
+
+static inline void blake2b_set_lastblock(struct blake2b_state *state)
+{
+	state->f[0] = -1;
+}
+
+typedef void (*blake2b_compress_t)(struct blake2b_state *state,
+				   const u8 *block, size_t nblocks, u32 inc);
+
+static inline void __blake2b_update(struct blake2b_state *state,
+				    const u8 *in, size_t inlen,
+				    blake2b_compress_t compress)
+{
+	const size_t fill = BLAKE2B_BLOCK_SIZE - state->buflen;
+
+	if (unlikely(!inlen))
+		return;
+	if (inlen > fill) {
+		memcpy(state->buf + state->buflen, in, fill);
+		(*compress)(state, state->buf, 1, BLAKE2B_BLOCK_SIZE);
+		state->buflen = 0;
+		in += fill;
+		inlen -= fill;
+	}
+	if (inlen > BLAKE2B_BLOCK_SIZE) {
+		const size_t nblocks = DIV_ROUND_UP(inlen, BLAKE2B_BLOCK_SIZE);
+		/* Hash one less (full) block than strictly possible */
+		(*compress)(state, in, nblocks - 1, BLAKE2B_BLOCK_SIZE);
+		in += BLAKE2B_BLOCK_SIZE * (nblocks - 1);
+		inlen -= BLAKE2B_BLOCK_SIZE * (nblocks - 1);
+	}
+	memcpy(state->buf + state->buflen, in, inlen);
+	state->buflen += inlen;
+}
+
+static inline void __blake2b_final(struct blake2b_state *state, u8 *out,
+				   blake2b_compress_t compress)
+{
+	int i;
+
+	blake2b_set_lastblock(state);
+	memset(state->buf + state->buflen, 0,
+	       BLAKE2B_BLOCK_SIZE - state->buflen); /* Padding */
+	(*compress)(state, state->buf, 1, state->buflen);
+	for (i = 0; i < ARRAY_SIZE(state->h); i++)
+		__cpu_to_le64s(&state->h[i]);
+	memcpy(out, state->h, state->outlen);
+}
+
+/* Helper functions for shash implementations of BLAKE2b */
+
+struct blake2b_tfm_ctx {
+	u8 key[BLAKE2B_KEY_SIZE];
+	unsigned int keylen;
+};
+
+static inline int crypto_blake2b_setkey(struct crypto_shash *tfm,
+					const u8 *key, unsigned int keylen)
+{
+	struct blake2b_tfm_ctx *tctx = crypto_shash_ctx(tfm);
+
+	if (keylen == 0 || keylen > BLAKE2B_KEY_SIZE)
+		return -EINVAL;
+
+	memcpy(tctx->key, key, keylen);
+	tctx->keylen = keylen;
+
+	return 0;
+}
+
+static inline int crypto_blake2b_init(struct shash_desc *desc)
+{
+	const struct blake2b_tfm_ctx *tctx = crypto_shash_ctx(desc->tfm);
+	struct blake2b_state *state = shash_desc_ctx(desc);
+	unsigned int outlen = crypto_shash_digestsize(desc->tfm);
+
+	__blake2b_init(state, outlen, tctx->key, tctx->keylen);
+	return 0;
+}
+
+static inline int crypto_blake2b_update(struct shash_desc *desc,
+					const u8 *in, unsigned int inlen,
+					blake2b_compress_t compress)
+{
+	struct blake2b_state *state = shash_desc_ctx(desc);
+
+	__blake2b_update(state, in, inlen, compress);
+	return 0;
+}
+
+static inline int crypto_blake2b_final(struct shash_desc *desc, u8 *out,
+				       blake2b_compress_t compress)
+{
+	struct blake2b_state *state = shash_desc_ctx(desc);
+
+	__blake2b_final(state, out, compress);
+	return 0;
+}
+
+#endif /* _CRYPTO_INTERNAL_BLAKE2B_H */

commit bd2d125094e65226c9ed1d47ee28fbbd9f0a0d8d
Author: Eric Biggers <ebiggers@google.com>
Date:   Wed Dec 23 00:10:00 2020 -0800

    UPSTREAM: wireguard: Kconfig: select CRYPTO_BLAKE2S_ARM
    
    When available, select the new implementation of BLAKE2s for 32-bit ARM.
    This is faster than the generic C implementation.
    
    Reviewed-by: Jason A. Donenfeld <Jason@zx2c4.com>
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Eric Biggers <ebiggers@google.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit a64bfe7ad42e329a1c63575d52c7927ad0f9e202)
    Bug: 152722841
    Bug: 178411248
    Change-Id: I27b0d049b689c8ef5d44e01151aa8c78af1bdd0e
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index dcfc57b06eda..04c3562f8d00 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -89,6 +89,7 @@ config WIREGUARD
 	select CRYPTO_CHACHA20_NEON if (ARM || ARM64) && KERNEL_MODE_NEON
 	select CRYPTO_POLY1305_NEON if ARM64 && KERNEL_MODE_NEON
 	select CRYPTO_POLY1305_ARM if ARM
+	select CRYPTO_BLAKE2S_ARM if ARM
 	select CRYPTO_CURVE25519_NEON if ARM && KERNEL_MODE_NEON
 	select CRYPTO_CHACHA_MIPS if CPU_MIPS32_R2
 	select CRYPTO_POLY1305_MIPS if CPU_MIPS32 || (CPU_MIPS64 && 64BIT)

commit 1afd413caedf84ecdc585858cd0c865e79a1cdc3
Author: Eric Biggers <ebiggers@google.com>
Date:   Wed Dec 23 00:09:59 2020 -0800

    UPSTREAM: crypto: arm/blake2s - add ARM scalar optimized BLAKE2s
    
    Add an ARM scalar optimized implementation of BLAKE2s.
    
    NEON isn't very useful for BLAKE2s because the BLAKE2s block size is too
    small for NEON to help.  Each NEON instruction would depend on the
    previous one, resulting in poor performance.
    
    With scalar instructions, on the other hand, we can take advantage of
    ARM's "free" rotations (like I did in chacha-scalar-core.S) to get an
    implementation get runs much faster than the C implementation.
    
    Performance results on Cortex-A7 in cycles per byte using the shash API:
    
            4096-byte messages:
                    blake2s-256-arm:     18.8
                    blake2s-256-generic: 26.0
    
            500-byte messages:
                    blake2s-256-arm:     20.3
                    blake2s-256-generic: 27.9
    
            100-byte messages:
                    blake2s-256-arm:     29.7
                    blake2s-256-generic: 39.2
    
            32-byte messages:
                    blake2s-256-arm:     50.6
                    blake2s-256-generic: 66.2
    
    Except on very short messages, this is still slower than the NEON
    implementation of BLAKE2b which I've written; that is 14.0, 16.4, 25.8,
    and 76.1 cpb on 4096, 500, 100, and 32-byte messages, respectively.
    However, optimized BLAKE2s is useful for cases where BLAKE2s is used
    instead of BLAKE2b, such as WireGuard.
    
    This new implementation is added in the form of a new module
    blake2s-arm.ko, which is analogous to blake2s-x86_64.ko in that it
    provides blake2s_compress_arch() for use by the library API as well as
    optionally register the algorithms with the shash API.
    
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Eric Biggers <ebiggers@google.com>
    Tested-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit 5172d322d34c30fb926b29aeb5a064e1fd8a5e13)
    Bug: 152722841
    Bug: 178411248
    Change-Id: I0ba7a0ea53518d512ccbe54a56970d6bbe2a32e0
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/arch/arm/crypto/Kconfig b/arch/arm/crypto/Kconfig
index b98056ec10e5..2ba1584536d5 100644
--- a/arch/arm/crypto/Kconfig
+++ b/arch/arm/crypto/Kconfig
@@ -62,6 +62,15 @@ config CRYPTO_SHA512_ARM
 	  SHA-512 secure hash standard (DFIPS 180-2) implemented
 	  using optimized ARM assembler and NEON, when available.
 
+config CRYPTO_BLAKE2S_ARM
+	tristate "BLAKE2s digest algorithm (ARM)"
+	select CRYPTO_ARCH_HAVE_LIB_BLAKE2S
+	help
+	  BLAKE2s digest algorithm optimized with ARM scalar instructions.  This
+	  is faster than the generic implementations of BLAKE2s and BLAKE2b, but
+	  slower than the NEON implementation of BLAKE2b.  (There is no NEON
+	  implementation of BLAKE2s, since NEON doesn't really help with it.)
+
 config CRYPTO_AES_ARM
 	tristate "Scalar AES cipher for ARM"
 	select CRYPTO_ALGAPI
diff --git a/arch/arm/crypto/Makefile b/arch/arm/crypto/Makefile
index 055b18cd9065..46ee0c88b6c9 100644
--- a/arch/arm/crypto/Makefile
+++ b/arch/arm/crypto/Makefile
@@ -9,6 +9,7 @@ obj-$(CONFIG_CRYPTO_SHA1_ARM) += sha1-arm.o
 obj-$(CONFIG_CRYPTO_SHA1_ARM_NEON) += sha1-arm-neon.o
 obj-$(CONFIG_CRYPTO_SHA256_ARM) += sha256-arm.o
 obj-$(CONFIG_CRYPTO_SHA512_ARM) += sha512-arm.o
+obj-$(CONFIG_CRYPTO_BLAKE2S_ARM) += blake2s-arm.o
 obj-$(CONFIG_CRYPTO_CHACHA20_NEON) += chacha-neon.o
 obj-$(CONFIG_CRYPTO_POLY1305_ARM) += poly1305-arm.o
 obj-$(CONFIG_CRYPTO_NHPOLY1305_NEON) += nhpoly1305-neon.o
@@ -49,6 +50,7 @@ sha256-arm-neon-$(CONFIG_KERNEL_MODE_NEON) := sha256_neon_glue.o
 sha256-arm-y	:= sha256-core.o sha256_glue.o $(sha256-arm-neon-y)
 sha512-arm-neon-$(CONFIG_KERNEL_MODE_NEON) := sha512-neon-glue.o
 sha512-arm-y	:= sha512-core.o sha512-glue.o $(sha512-arm-neon-y)
+blake2s-arm-y   := blake2s-core.o blake2s-glue.o
 sha1-arm-ce-y	:= sha1-ce-core.o sha1-ce-glue.o
 sha2-arm-ce-y	:= sha2-ce-core.o sha2-ce-glue.o
 aes-arm-ce-y	:= aes-ce-core.o aes-ce-glue.o
diff --git a/arch/arm/crypto/blake2s-core.S b/arch/arm/crypto/blake2s-core.S
new file mode 100644
index 000000000000..bed897e9a181
--- /dev/null
+++ b/arch/arm/crypto/blake2s-core.S
@@ -0,0 +1,285 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * BLAKE2s digest algorithm, ARM scalar implementation
+ *
+ * Copyright 2020 Google LLC
+ *
+ * Author: Eric Biggers <ebiggers@google.com>
+ */
+
+#include <linux/linkage.h>
+
+	// Registers used to hold message words temporarily.  There aren't
+	// enough ARM registers to hold the whole message block, so we have to
+	// load the words on-demand.
+	M_0		.req	r12
+	M_1		.req	r14
+
+// The BLAKE2s initialization vector
+.Lblake2s_IV:
+	.word	0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A
+	.word	0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19
+
+.macro __ldrd		a, b, src, offset
+#if __LINUX_ARM_ARCH__ >= 6
+	ldrd		\a, \b, [\src, #\offset]
+#else
+	ldr		\a, [\src, #\offset]
+	ldr		\b, [\src, #\offset + 4]
+#endif
+.endm
+
+.macro __strd		a, b, dst, offset
+#if __LINUX_ARM_ARCH__ >= 6
+	strd		\a, \b, [\dst, #\offset]
+#else
+	str		\a, [\dst, #\offset]
+	str		\b, [\dst, #\offset + 4]
+#endif
+.endm
+
+// Execute a quarter-round of BLAKE2s by mixing two columns or two diagonals.
+// (a0, b0, c0, d0) and (a1, b1, c1, d1) give the registers containing the two
+// columns/diagonals.  s0-s1 are the word offsets to the message words the first
+// column/diagonal needs, and likewise s2-s3 for the second column/diagonal.
+// M_0 and M_1 are free to use, and the message block can be found at sp + 32.
+//
+// Note that to save instructions, the rotations don't happen when the
+// pseudocode says they should, but rather they are delayed until the values are
+// used.  See the comment above _blake2s_round().
+.macro _blake2s_quarterround  a0, b0, c0, d0,  a1, b1, c1, d1,  s0, s1, s2, s3
+
+	ldr		M_0, [sp, #32 + 4 * \s0]
+	ldr		M_1, [sp, #32 + 4 * \s2]
+
+	// a += b + m[blake2s_sigma[r][2*i + 0]];
+	add		\a0, \a0, \b0, ror #brot
+	add		\a1, \a1, \b1, ror #brot
+	add		\a0, \a0, M_0
+	add		\a1, \a1, M_1
+
+	// d = ror32(d ^ a, 16);
+	eor		\d0, \a0, \d0, ror #drot
+	eor		\d1, \a1, \d1, ror #drot
+
+	// c += d;
+	add		\c0, \c0, \d0, ror #16
+	add		\c1, \c1, \d1, ror #16
+
+	// b = ror32(b ^ c, 12);
+	eor		\b0, \c0, \b0, ror #brot
+	eor		\b1, \c1, \b1, ror #brot
+
+	ldr		M_0, [sp, #32 + 4 * \s1]
+	ldr		M_1, [sp, #32 + 4 * \s3]
+
+	// a += b + m[blake2s_sigma[r][2*i + 1]];
+	add		\a0, \a0, \b0, ror #12
+	add		\a1, \a1, \b1, ror #12
+	add		\a0, \a0, M_0
+	add		\a1, \a1, M_1
+
+	// d = ror32(d ^ a, 8);
+	eor		\d0, \a0, \d0, ror#16
+	eor		\d1, \a1, \d1, ror#16
+
+	// c += d;
+	add		\c0, \c0, \d0, ror#8
+	add		\c1, \c1, \d1, ror#8
+
+	// b = ror32(b ^ c, 7);
+	eor		\b0, \c0, \b0, ror#12
+	eor		\b1, \c1, \b1, ror#12
+.endm
+
+// Execute one round of BLAKE2s by updating the state matrix v[0..15].  v[0..9]
+// are in r0..r9.  The stack pointer points to 8 bytes of scratch space for
+// spilling v[8..9], then to v[9..15], then to the message block.  r10-r12 and
+// r14 are free to use.  The macro arguments s0-s15 give the order in which the
+// message words are used in this round.
+//
+// All rotates are performed using the implicit rotate operand accepted by the
+// 'add' and 'eor' instructions.  This is faster than using explicit rotate
+// instructions.  To make this work, we allow the values in the second and last
+// rows of the BLAKE2s state matrix (rows 'b' and 'd') to temporarily have the
+// wrong rotation amount.  The rotation amount is then fixed up just in time
+// when the values are used.  'brot' is the number of bits the values in row 'b'
+// need to be rotated right to arrive at the correct values, and 'drot'
+// similarly for row 'd'.  (brot, drot) start out as (0, 0) but we make it such
+// that they end up as (7, 8) after every round.
+.macro	_blake2s_round	s0, s1, s2, s3, s4, s5, s6, s7, \
+			s8, s9, s10, s11, s12, s13, s14, s15
+
+	// Mix first two columns:
+	// (v[0], v[4], v[8], v[12]) and (v[1], v[5], v[9], v[13]).
+	__ldrd		r10, r11, sp, 16	// load v[12] and v[13]
+	_blake2s_quarterround	r0, r4, r8, r10,  r1, r5, r9, r11, \
+				\s0, \s1, \s2, \s3
+	__strd		r8, r9, sp, 0
+	__strd		r10, r11, sp, 16
+
+	// Mix second two columns:
+	// (v[2], v[6], v[10], v[14]) and (v[3], v[7], v[11], v[15]).
+	__ldrd		r8, r9, sp, 8		// load v[10] and v[11]
+	__ldrd		r10, r11, sp, 24	// load v[14] and v[15]
+	_blake2s_quarterround	r2, r6, r8, r10,  r3, r7, r9, r11, \
+				\s4, \s5, \s6, \s7
+	str		r10, [sp, #24]		// store v[14]
+	// v[10], v[11], and v[15] are used below, so no need to store them yet.
+
+	.set brot, 7
+	.set drot, 8
+
+	// Mix first two diagonals:
+	// (v[0], v[5], v[10], v[15]) and (v[1], v[6], v[11], v[12]).
+	ldr		r10, [sp, #16]		// load v[12]
+	_blake2s_quarterround	r0, r5, r8, r11,  r1, r6, r9, r10, \
+				\s8, \s9, \s10, \s11
+	__strd		r8, r9, sp, 8
+	str		r11, [sp, #28]
+	str		r10, [sp, #16]
+
+	// Mix second two diagonals:
+	// (v[2], v[7], v[8], v[13]) and (v[3], v[4], v[9], v[14]).
+	__ldrd		r8, r9, sp, 0		// load v[8] and v[9]
+	__ldrd		r10, r11, sp, 20	// load v[13] and v[14]
+	_blake2s_quarterround	r2, r7, r8, r10,  r3, r4, r9, r11, \
+				\s12, \s13, \s14, \s15
+	__strd		r10, r11, sp, 20
+.endm
+
+//
+// void blake2s_compress_arch(struct blake2s_state *state,
+//			      const u8 *block, size_t nblocks, u32 inc);
+//
+// Only the first three fields of struct blake2s_state are used:
+//	u32 h[8];	(inout)
+//	u32 t[2];	(inout)
+//	u32 f[2];	(in)
+//
+	.align		5
+ENTRY(blake2s_compress_arch)
+	push		{r0-r2,r4-r11,lr}	// keep this an even number
+
+.Lnext_block:
+	// r0 is 'state'
+	// r1 is 'block'
+	// r3 is 'inc'
+
+	// Load and increment the counter t[0..1].
+	__ldrd		r10, r11, r0, 32
+	adds		r10, r10, r3
+	adc		r11, r11, #0
+	__strd		r10, r11, r0, 32
+
+	// _blake2s_round is very short on registers, so copy the message block
+	// to the stack to save a register during the rounds.  This also has the
+	// advantage that misalignment only needs to be dealt with in one place.
+	sub		sp, sp, #64
+	mov		r12, sp
+	tst		r1, #3
+	bne		.Lcopy_block_misaligned
+	ldmia		r1!, {r2-r9}
+	stmia		r12!, {r2-r9}
+	ldmia		r1!, {r2-r9}
+	stmia		r12, {r2-r9}
+.Lcopy_block_done:
+	str		r1, [sp, #68]		// Update message pointer
+
+	// Calculate v[8..15].  Push v[9..15] onto the stack, and leave space
+	// for spilling v[8..9].  Leave v[8..9] in r8-r9.
+	mov		r14, r0			// r14 = state
+	adr		r12, .Lblake2s_IV
+	ldmia		r12!, {r8-r9}		// load IV[0..1]
+	__ldrd		r0, r1, r14, 40		// load f[0..1]
+	ldm		r12, {r2-r7}		// load IV[3..7]
+	eor		r4, r4, r10		// v[12] = IV[4] ^ t[0]
+	eor		r5, r5, r11		// v[13] = IV[5] ^ t[1]
+	eor		r6, r6, r0		// v[14] = IV[6] ^ f[0]
+	eor		r7, r7, r1		// v[15] = IV[7] ^ f[1]
+	push		{r2-r7}			// push v[9..15]
+	sub		sp, sp, #8		// leave space for v[8..9]
+
+	// Load h[0..7] == v[0..7].
+	ldm		r14, {r0-r7}
+
+	// Execute the rounds.  Each round is provided the order in which it
+	// needs to use the message words.
+	.set brot, 0
+	.set drot, 0
+	_blake2s_round	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
+	_blake2s_round	14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3
+	_blake2s_round	11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4
+	_blake2s_round	7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8
+	_blake2s_round	9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13
+	_blake2s_round	2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9
+	_blake2s_round	12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11
+	_blake2s_round	13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10
+	_blake2s_round	6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5
+	_blake2s_round	10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0
+
+	// Fold the final state matrix into the hash chaining value:
+	//
+	//	for (i = 0; i < 8; i++)
+	//		h[i] ^= v[i] ^ v[i + 8];
+	//
+	ldr		r14, [sp, #96]		// r14 = &h[0]
+	add		sp, sp, #8		// v[8..9] are already loaded.
+	pop		{r10-r11}		// load v[10..11]
+	eor		r0, r0, r8
+	eor		r1, r1, r9
+	eor		r2, r2, r10
+	eor		r3, r3, r11
+	ldm		r14, {r8-r11}		// load h[0..3]
+	eor		r0, r0, r8
+	eor		r1, r1, r9
+	eor		r2, r2, r10
+	eor		r3, r3, r11
+	stmia		r14!, {r0-r3}		// store new h[0..3]
+	ldm		r14, {r0-r3}		// load old h[4..7]
+	pop		{r8-r11}		// load v[12..15]
+	eor		r0, r0, r4, ror #brot
+	eor		r1, r1, r5, ror #brot
+	eor		r2, r2, r6, ror #brot
+	eor		r3, r3, r7, ror #brot
+	eor		r0, r0, r8, ror #drot
+	eor		r1, r1, r9, ror #drot
+	eor		r2, r2, r10, ror #drot
+	eor		r3, r3, r11, ror #drot
+	  add		sp, sp, #64		// skip copy of message block
+	stm		r14, {r0-r3}		// store new h[4..7]
+
+	// Advance to the next block, if there is one.  Note that if there are
+	// multiple blocks, then 'inc' (the counter increment amount) must be
+	// 64.  So we can simply set it to 64 without re-loading it.
+	ldm		sp, {r0, r1, r2}	// load (state, block, nblocks)
+	mov		r3, #64			// set 'inc'
+	subs		r2, r2, #1		// nblocks--
+	str		r2, [sp, #8]
+	bne		.Lnext_block		// nblocks != 0?
+
+	pop		{r0-r2,r4-r11,pc}
+
+	// The next message block (pointed to by r1) isn't 4-byte aligned, so it
+	// can't be loaded using ldmia.  Copy it to the stack buffer (pointed to
+	// by r12) using an alternative method.  r2-r9 are free to use.
+.Lcopy_block_misaligned:
+	mov		r2, #64
+1:
+#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
+	ldr		r3, [r1], #4
+#else
+	ldrb		r3, [r1, #0]
+	ldrb		r4, [r1, #1]
+	ldrb		r5, [r1, #2]
+	ldrb		r6, [r1, #3]
+	add		r1, r1, #4
+	orr		r3, r3, r4, lsl #8
+	orr		r3, r3, r5, lsl #16
+	orr		r3, r3, r6, lsl #24
+#endif
+	subs		r2, r2, #4
+	str		r3, [r12], #4
+	bne		1b
+	b		.Lcopy_block_done
+ENDPROC(blake2s_compress_arch)
diff --git a/arch/arm/crypto/blake2s-glue.c b/arch/arm/crypto/blake2s-glue.c
new file mode 100644
index 000000000000..f2cc1e5fc9ec
--- /dev/null
+++ b/arch/arm/crypto/blake2s-glue.c
@@ -0,0 +1,78 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * BLAKE2s digest algorithm, ARM scalar implementation
+ *
+ * Copyright 2020 Google LLC
+ */
+
+#include <crypto/internal/blake2s.h>
+#include <crypto/internal/hash.h>
+
+#include <linux/module.h>
+
+/* defined in blake2s-core.S */
+EXPORT_SYMBOL(blake2s_compress_arch);
+
+static int crypto_blake2s_update_arm(struct shash_desc *desc,
+				     const u8 *in, unsigned int inlen)
+{
+	return crypto_blake2s_update(desc, in, inlen, blake2s_compress_arch);
+}
+
+static int crypto_blake2s_final_arm(struct shash_desc *desc, u8 *out)
+{
+	return crypto_blake2s_final(desc, out, blake2s_compress_arch);
+}
+
+#define BLAKE2S_ALG(name, driver_name, digest_size)			\
+	{								\
+		.base.cra_name		= name,				\
+		.base.cra_driver_name	= driver_name,			\
+		.base.cra_priority	= 200,				\
+		.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,	\
+		.base.cra_blocksize	= BLAKE2S_BLOCK_SIZE,		\
+		.base.cra_ctxsize	= sizeof(struct blake2s_tfm_ctx), \
+		.base.cra_module	= THIS_MODULE,			\
+		.digestsize		= digest_size,			\
+		.setkey			= crypto_blake2s_setkey,	\
+		.init			= crypto_blake2s_init,		\
+		.update			= crypto_blake2s_update_arm,	\
+		.final			= crypto_blake2s_final_arm,	\
+		.descsize		= sizeof(struct blake2s_state),	\
+	}
+
+static struct shash_alg blake2s_arm_algs[] = {
+	BLAKE2S_ALG("blake2s-128", "blake2s-128-arm", BLAKE2S_128_HASH_SIZE),
+	BLAKE2S_ALG("blake2s-160", "blake2s-160-arm", BLAKE2S_160_HASH_SIZE),
+	BLAKE2S_ALG("blake2s-224", "blake2s-224-arm", BLAKE2S_224_HASH_SIZE),
+	BLAKE2S_ALG("blake2s-256", "blake2s-256-arm", BLAKE2S_256_HASH_SIZE),
+};
+
+static int __init blake2s_arm_mod_init(void)
+{
+	return IS_REACHABLE(CONFIG_CRYPTO_HASH) ?
+		crypto_register_shashes(blake2s_arm_algs,
+					ARRAY_SIZE(blake2s_arm_algs)) : 0;
+}
+
+static void __exit blake2s_arm_mod_exit(void)
+{
+	if (IS_REACHABLE(CONFIG_CRYPTO_HASH))
+		crypto_unregister_shashes(blake2s_arm_algs,
+					  ARRAY_SIZE(blake2s_arm_algs));
+}
+
+module_init(blake2s_arm_mod_init);
+module_exit(blake2s_arm_mod_exit);
+
+MODULE_DESCRIPTION("BLAKE2s digest algorithm, ARM scalar implementation");
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Eric Biggers <ebiggers@google.com>");
+MODULE_ALIAS_CRYPTO("blake2s-128");
+MODULE_ALIAS_CRYPTO("blake2s-128-arm");
+MODULE_ALIAS_CRYPTO("blake2s-160");
+MODULE_ALIAS_CRYPTO("blake2s-160-arm");
+MODULE_ALIAS_CRYPTO("blake2s-224");
+MODULE_ALIAS_CRYPTO("blake2s-224-arm");
+MODULE_ALIAS_CRYPTO("blake2s-256");
+MODULE_ALIAS_CRYPTO("blake2s-256-arm");

commit 291c9c6a568641767d6bb7548049ccd81f201100
Author: Eric Biggers <ebiggers@google.com>
Date:   Wed Dec 23 00:09:58 2020 -0800

    UPSTREAM: crypto: blake2s - include <linux/bug.h> instead of <asm/bug.h>
    
    Address the following checkpatch warning:
    
            WARNING: Use #include <linux/bug.h> instead of <asm/bug.h>
    
    Signed-off-by: Eric Biggers <ebiggers@google.com>
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit bbda6e0f1303953c855ee3669655a81b69fbe899)
    Bug: 152722841
    Bug: 178411248
    Change-Id: Ib12103873c97387ba59ff897c44a18e4f1e6da3d
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/include/crypto/blake2s.h b/include/crypto/blake2s.h
index 3f06183c2d80..bc3fb59442ce 100644
--- a/include/crypto/blake2s.h
+++ b/include/crypto/blake2s.h
@@ -6,12 +6,11 @@
 #ifndef _CRYPTO_BLAKE2S_H
 #define _CRYPTO_BLAKE2S_H
 
+#include <linux/bug.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/string.h>
 
-#include <asm/bug.h>
-
 enum blake2s_lengths {
 	BLAKE2S_BLOCK_SIZE = 64,
 	BLAKE2S_HASH_SIZE = 32,

commit b6ae0150cc325cbeae0fc3255672ad8b7126348c
Author: Eric Biggers <ebiggers@google.com>
Date:   Wed Dec 23 00:09:57 2020 -0800

    UPSTREAM: crypto: blake2s - adjust include guard naming
    
    Use the full path in the include guards for the BLAKE2s headers to avoid
    ambiguity and to match the convention for most files in include/crypto/.
    
    Signed-off-by: Eric Biggers <ebiggers@google.com>
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit 8786841bc2020f7f2513a6c74e64912f07b9c0dc)
    Bug: 152722841
    Bug: 178411248
    Change-Id: Iea57edbe14c9083ce3d7a77b2c3bd63cd6650e56
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/include/crypto/blake2s.h b/include/crypto/blake2s.h
index f1c8330a61a9..3f06183c2d80 100644
--- a/include/crypto/blake2s.h
+++ b/include/crypto/blake2s.h
@@ -3,8 +3,8 @@
  * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
  */
 
-#ifndef BLAKE2S_H
-#define BLAKE2S_H
+#ifndef _CRYPTO_BLAKE2S_H
+#define _CRYPTO_BLAKE2S_H
 
 #include <linux/types.h>
 #include <linux/kernel.h>
@@ -105,4 +105,4 @@ static inline void blake2s(u8 *out, const u8 *in, const u8 *key,
 void blake2s256_hmac(u8 *out, const u8 *in, const u8 *key, const size_t inlen,
 		     const size_t keylen);
 
-#endif /* BLAKE2S_H */
+#endif /* _CRYPTO_BLAKE2S_H */
diff --git a/include/crypto/internal/blake2s.h b/include/crypto/internal/blake2s.h
index 867ef3753f5c..8e50d487500f 100644
--- a/include/crypto/internal/blake2s.h
+++ b/include/crypto/internal/blake2s.h
@@ -4,8 +4,8 @@
  * Keep this in sync with the corresponding BLAKE2b header.
  */
 
-#ifndef BLAKE2S_INTERNAL_H
-#define BLAKE2S_INTERNAL_H
+#ifndef _CRYPTO_INTERNAL_BLAKE2S_H
+#define _CRYPTO_INTERNAL_BLAKE2S_H
 
 #include <crypto/blake2s.h>
 #include <crypto/internal/hash.h>
@@ -116,4 +116,4 @@ static inline int crypto_blake2s_final(struct shash_desc *desc, u8 *out,
 	return 0;
 }
 
-#endif /* BLAKE2S_INTERNAL_H */
+#endif /* _CRYPTO_INTERNAL_BLAKE2S_H */

commit 2761b1d01fae22effc1ebe90e122ae4aa797c51e
Author: Eric Biggers <ebiggers@google.com>
Date:   Wed Dec 23 00:09:56 2020 -0800

    UPSTREAM: crypto: blake2s - add comment for blake2s_state fields
    
    The first three fields of 'struct blake2s_state' are used in assembly
    code, which isn't immediately obvious, so add a comment to this effect.
    
    Signed-off-by: Eric Biggers <ebiggers@google.com>
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit 7d87131fadd53a0401b5c078dd64e58c3ea6994c)
    Bug: 152722841
    Bug: 178411248
    Change-Id: Iab85ddd350a2db917b247ba8f6e224eba905b747
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/include/crypto/blake2s.h b/include/crypto/blake2s.h
index 734ed22b7a6a..f1c8330a61a9 100644
--- a/include/crypto/blake2s.h
+++ b/include/crypto/blake2s.h
@@ -24,6 +24,7 @@ enum blake2s_lengths {
 };
 
 struct blake2s_state {
+	/* 'h', 't', and 'f' are used in assembly code, so keep them as-is. */
 	u32 h[8];
 	u32 t[2];
 	u32 f[2];

commit e13d2476a6693489aa36e3f033b85eeb91f52646
Author: Eric Biggers <ebiggers@google.com>
Date:   Wed Dec 23 00:09:55 2020 -0800

    UPSTREAM: crypto: blake2s - optimize blake2s initialization
    
    If no key was provided, then don't waste time initializing the block
    buffer, as its initial contents won't be used.
    
    Also, make crypto_blake2s_init() and blake2s() call a single internal
    function __blake2s_init() which treats the key as optional, rather than
    conditionally calling blake2s_init() or blake2s_init_key().  This
    reduces the compiled code size, as previously both blake2s_init() and
    blake2s_init_key() were being inlined into these two callers, except
    when the key size passed to blake2s() was a compile-time constant.
    
    These optimizations aren't that significant for BLAKE2s.  However, the
    equivalent optimizations will be more significant for BLAKE2b, as
    everything is twice as big in BLAKE2b.  And it's good to keep things
    consistent rather than making optimizations for BLAKE2b but not BLAKE2s.
    
    Signed-off-by: Eric Biggers <ebiggers@google.com>
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit 42ad8cf821f0d8564c393e9ad7d00a1a271d18ae)
    Bug: 152722841
    Bug: 178411248
    Change-Id: Id057e0c8a5f0e432f227dc3deaa8997a7cbc0577
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/include/crypto/blake2s.h b/include/crypto/blake2s.h
index b471deac28ff..734ed22b7a6a 100644
--- a/include/crypto/blake2s.h
+++ b/include/crypto/blake2s.h
@@ -43,29 +43,34 @@ enum blake2s_iv {
 	BLAKE2S_IV7 = 0x5BE0CD19UL,
 };
 
-void blake2s_update(struct blake2s_state *state, const u8 *in, size_t inlen);
-void blake2s_final(struct blake2s_state *state, u8 *out);
-
-static inline void blake2s_init_param(struct blake2s_state *state,
-				      const u32 param)
+static inline void __blake2s_init(struct blake2s_state *state, size_t outlen,
+				  const void *key, size_t keylen)
 {
-	*state = (struct blake2s_state){{
-		BLAKE2S_IV0 ^ param,
-		BLAKE2S_IV1,
-		BLAKE2S_IV2,
-		BLAKE2S_IV3,
-		BLAKE2S_IV4,
-		BLAKE2S_IV5,
-		BLAKE2S_IV6,
-		BLAKE2S_IV7,
-	}};
+	state->h[0] = BLAKE2S_IV0 ^ (0x01010000 | keylen << 8 | outlen);
+	state->h[1] = BLAKE2S_IV1;
+	state->h[2] = BLAKE2S_IV2;
+	state->h[3] = BLAKE2S_IV3;
+	state->h[4] = BLAKE2S_IV4;
+	state->h[5] = BLAKE2S_IV5;
+	state->h[6] = BLAKE2S_IV6;
+	state->h[7] = BLAKE2S_IV7;
+	state->t[0] = 0;
+	state->t[1] = 0;
+	state->f[0] = 0;
+	state->f[1] = 0;
+	state->buflen = 0;
+	state->outlen = outlen;
+	if (keylen) {
+		memcpy(state->buf, key, keylen);
+		memset(&state->buf[keylen], 0, BLAKE2S_BLOCK_SIZE - keylen);
+		state->buflen = BLAKE2S_BLOCK_SIZE;
+	}
 }
 
 static inline void blake2s_init(struct blake2s_state *state,
 				const size_t outlen)
 {
-	blake2s_init_param(state, 0x01010000 | outlen);
-	state->outlen = outlen;
+	__blake2s_init(state, outlen, NULL, 0);
 }
 
 static inline void blake2s_init_key(struct blake2s_state *state,
@@ -75,12 +80,12 @@ static inline void blake2s_init_key(struct blake2s_state *state,
 	WARN_ON(IS_ENABLED(DEBUG) && (!outlen || outlen > BLAKE2S_HASH_SIZE ||
 		!key || !keylen || keylen > BLAKE2S_KEY_SIZE));
 
-	blake2s_init_param(state, 0x01010000 | keylen << 8 | outlen);
-	memcpy(state->buf, key, keylen);
-	state->buflen = BLAKE2S_BLOCK_SIZE;
-	state->outlen = outlen;
+	__blake2s_init(state, outlen, key, keylen);
 }
 
+void blake2s_update(struct blake2s_state *state, const u8 *in, size_t inlen);
+void blake2s_final(struct blake2s_state *state, u8 *out);
+
 static inline void blake2s(u8 *out, const u8 *in, const u8 *key,
 			   const size_t outlen, const size_t inlen,
 			   const size_t keylen)
@@ -91,11 +96,7 @@ static inline void blake2s(u8 *out, const u8 *in, const u8 *key,
 		outlen > BLAKE2S_HASH_SIZE || keylen > BLAKE2S_KEY_SIZE ||
 		(!key && keylen)));
 
-	if (keylen)
-		blake2s_init_key(&state, outlen, key, keylen);
-	else
-		blake2s_init(&state, outlen);
-
+	__blake2s_init(&state, outlen, key, keylen);
 	blake2s_update(&state, in, inlen);
 	blake2s_final(&state, out);
 }
diff --git a/include/crypto/internal/blake2s.h b/include/crypto/internal/blake2s.h
index 2ea0a8f5e7f4..867ef3753f5c 100644
--- a/include/crypto/internal/blake2s.h
+++ b/include/crypto/internal/blake2s.h
@@ -93,10 +93,7 @@ static inline int crypto_blake2s_init(struct shash_desc *desc)
 	struct blake2s_state *state = shash_desc_ctx(desc);
 	unsigned int outlen = crypto_shash_digestsize(desc->tfm);
 
-	if (tctx->keylen)
-		blake2s_init_key(state, outlen, tctx->key, tctx->keylen);
-	else
-		blake2s_init(state, outlen);
+	__blake2s_init(state, outlen, tctx->key, tctx->keylen);
 	return 0;
 }
 

commit 4af17e13129a41afa1a61f2d3d1214e4d5e32099
Author: Eric Biggers <ebiggers@google.com>
Date:   Wed Dec 23 00:09:54 2020 -0800

    BACKPORT: crypto: blake2s - share the "shash" API boilerplate code
    
    Add helper functions for shash implementations of BLAKE2s to
    include/crypto/internal/blake2s.h, taking advantage of
    __blake2s_update() and __blake2s_final() that were added by the previous
    patch to share more code between the library and shash implementations.
    
    crypto_blake2s_setkey() and crypto_blake2s_init() are usable as
    shash_alg::setkey and shash_alg::init directly, while
    crypto_blake2s_update() and crypto_blake2s_final() take an extra
    'blake2s_compress_t' function pointer parameter.  This allows the
    implementation of the compression function to be overridden, which is
    the only part that optimized implementations really care about.
    
    The new functions are inline functions (similar to those in sha1_base.h,
    sha256_base.h, and sm3_base.h) because this avoids needing to add a new
    module blake2s_helpers.ko, they aren't *too* long, and this avoids
    indirect calls which are expensive these days.  Note that they can't go
    in blake2s_generic.ko, as that would require selecting CRYPTO_BLAKE2S
    from CRYPTO_BLAKE2S_X86, which would cause a recursive dependency.
    
    Finally, use these new helper functions in the x86 implementation of
    BLAKE2s.  (This part should be a separate patch, but unfortunately the
    x86 implementation used the exact same function names like
    "crypto_blake2s_update()", so it had to be updated at the same time.)
    
    Signed-off-by: Eric Biggers <ebiggers@google.com>
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit 8c4a93a1270ddffc7660ae43fa8030ecfe9c06d9)
    
    Conflicts:
            arch/x86/crypto/blake2s-glue.c
            crypto/blake2s_generic.c
    
    (conflict due to this branch not having commit 674f368a952c,
    "crypto: remove CRYPTO_TFM_RES_BAD_KEY_LEN")
    
    Bug: 152722841
    Bug: 178411248
    Change-Id: I9d23b1897cee81fb1704b6eea14d3dc9b1c80fe0
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/arch/x86/crypto/blake2s-glue.c b/arch/x86/crypto/blake2s-glue.c
index ad6a28a4877a..487548c0eac2 100644
--- a/arch/x86/crypto/blake2s-glue.c
+++ b/arch/x86/crypto/blake2s-glue.c
@@ -56,77 +56,15 @@ void blake2s_compress_arch(struct blake2s_state *state,
 }
 EXPORT_SYMBOL(blake2s_compress_arch);
 
-static int crypto_blake2s_setkey(struct crypto_shash *tfm, const u8 *key,
-				 unsigned int keylen)
+static int crypto_blake2s_update_x86(struct shash_desc *desc,
+				     const u8 *in, unsigned int inlen)
 {
-	struct blake2s_tfm_ctx *tctx = crypto_shash_ctx(tfm);
-
-	if (keylen == 0 || keylen > BLAKE2S_KEY_SIZE) {
-		crypto_shash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN);
-		return -EINVAL;
-	}
-
-	memcpy(tctx->key, key, keylen);
-	tctx->keylen = keylen;
-
-	return 0;
-}
-
-static int crypto_blake2s_init(struct shash_desc *desc)
-{
-	struct blake2s_tfm_ctx *tctx = crypto_shash_ctx(desc->tfm);
-	struct blake2s_state *state = shash_desc_ctx(desc);
-	const int outlen = crypto_shash_digestsize(desc->tfm);
-
-	if (tctx->keylen)
-		blake2s_init_key(state, outlen, tctx->key, tctx->keylen);
-	else
-		blake2s_init(state, outlen);
-
-	return 0;
+	return crypto_blake2s_update(desc, in, inlen, blake2s_compress_arch);
 }
 
-static int crypto_blake2s_update(struct shash_desc *desc, const u8 *in,
-				 unsigned int inlen)
+static int crypto_blake2s_final_x86(struct shash_desc *desc, u8 *out)
 {
-	struct blake2s_state *state = shash_desc_ctx(desc);
-	const size_t fill = BLAKE2S_BLOCK_SIZE - state->buflen;
-
-	if (unlikely(!inlen))
-		return 0;
-	if (inlen > fill) {
-		memcpy(state->buf + state->buflen, in, fill);
-		blake2s_compress_arch(state, state->buf, 1, BLAKE2S_BLOCK_SIZE);
-		state->buflen = 0;
-		in += fill;
-		inlen -= fill;
-	}
-	if (inlen > BLAKE2S_BLOCK_SIZE) {
-		const size_t nblocks = DIV_ROUND_UP(inlen, BLAKE2S_BLOCK_SIZE);
-		/* Hash one less (full) block than strictly possible */
-		blake2s_compress_arch(state, in, nblocks - 1, BLAKE2S_BLOCK_SIZE);
-		in += BLAKE2S_BLOCK_SIZE * (nblocks - 1);
-		inlen -= BLAKE2S_BLOCK_SIZE * (nblocks - 1);
-	}
-	memcpy(state->buf + state->buflen, in, inlen);
-	state->buflen += inlen;
-
-	return 0;
-}
-
-static int crypto_blake2s_final(struct shash_desc *desc, u8 *out)
-{
-	struct blake2s_state *state = shash_desc_ctx(desc);
-
-	blake2s_set_lastblock(state);
-	memset(state->buf + state->buflen, 0,
-	       BLAKE2S_BLOCK_SIZE - state->buflen); /* Padding */
-	blake2s_compress_arch(state, state->buf, 1, state->buflen);
-	cpu_to_le32_array(state->h, ARRAY_SIZE(state->h));
-	memcpy(out, state->h, state->outlen);
-	memzero_explicit(state, sizeof(*state));
-
-	return 0;
+	return crypto_blake2s_final(desc, out, blake2s_compress_arch);
 }
 
 #define BLAKE2S_ALG(name, driver_name, digest_size)			\
@@ -141,8 +79,8 @@ static int crypto_blake2s_final(struct shash_desc *desc, u8 *out)
 		.digestsize		= digest_size,			\
 		.setkey			= crypto_blake2s_setkey,	\
 		.init			= crypto_blake2s_init,		\
-		.update			= crypto_blake2s_update,	\
-		.final			= crypto_blake2s_final,		\
+		.update			= crypto_blake2s_update_x86,	\
+		.final			= crypto_blake2s_final_x86,	\
 		.descsize		= sizeof(struct blake2s_state),	\
 	}
 
diff --git a/crypto/blake2s_generic.c b/crypto/blake2s_generic.c
index 150edb492599..72fe480f9bd6 100644
--- a/crypto/blake2s_generic.c
+++ b/crypto/blake2s_generic.c
@@ -1,5 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0 OR MIT
 /*
+ * shash interface to the generic implementation of BLAKE2s
+ *
  * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
  */
 
@@ -10,77 +12,15 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 
-static int crypto_blake2s_setkey(struct crypto_shash *tfm, const u8 *key,
-				 unsigned int keylen)
+static int crypto_blake2s_update_generic(struct shash_desc *desc,
+					 const u8 *in, unsigned int inlen)
 {
-	struct blake2s_tfm_ctx *tctx = crypto_shash_ctx(tfm);
-
-	if (keylen == 0 || keylen > BLAKE2S_KEY_SIZE) {
-		crypto_shash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN);
-		return -EINVAL;
-	}
-
-	memcpy(tctx->key, key, keylen);
-	tctx->keylen = keylen;
-
-	return 0;
-}
-
-static int crypto_blake2s_init(struct shash_desc *desc)
-{
-	struct blake2s_tfm_ctx *tctx = crypto_shash_ctx(desc->tfm);
-	struct blake2s_state *state = shash_desc_ctx(desc);
-	const int outlen = crypto_shash_digestsize(desc->tfm);
-
-	if (tctx->keylen)
-		blake2s_init_key(state, outlen, tctx->key, tctx->keylen);
-	else
-		blake2s_init(state, outlen);
-
-	return 0;
+	return crypto_blake2s_update(desc, in, inlen, blake2s_compress_generic);
 }
 
-static int crypto_blake2s_update(struct shash_desc *desc, const u8 *in,
-				 unsigned int inlen)
+static int crypto_blake2s_final_generic(struct shash_desc *desc, u8 *out)
 {
-	struct blake2s_state *state = shash_desc_ctx(desc);
-	const size_t fill = BLAKE2S_BLOCK_SIZE - state->buflen;
-
-	if (unlikely(!inlen))
-		return 0;
-	if (inlen > fill) {
-		memcpy(state->buf + state->buflen, in, fill);
-		blake2s_compress_generic(state, state->buf, 1, BLAKE2S_BLOCK_SIZE);
-		state->buflen = 0;
-		in += fill;
-		inlen -= fill;
-	}
-	if (inlen > BLAKE2S_BLOCK_SIZE) {
-		const size_t nblocks = DIV_ROUND_UP(inlen, BLAKE2S_BLOCK_SIZE);
-		/* Hash one less (full) block than strictly possible */
-		blake2s_compress_generic(state, in, nblocks - 1, BLAKE2S_BLOCK_SIZE);
-		in += BLAKE2S_BLOCK_SIZE * (nblocks - 1);
-		inlen -= BLAKE2S_BLOCK_SIZE * (nblocks - 1);
-	}
-	memcpy(state->buf + state->buflen, in, inlen);
-	state->buflen += inlen;
-
-	return 0;
-}
-
-static int crypto_blake2s_final(struct shash_desc *desc, u8 *out)
-{
-	struct blake2s_state *state = shash_desc_ctx(desc);
-
-	blake2s_set_lastblock(state);
-	memset(state->buf + state->buflen, 0,
-	       BLAKE2S_BLOCK_SIZE - state->buflen); /* Padding */
-	blake2s_compress_generic(state, state->buf, 1, state->buflen);
-	cpu_to_le32_array(state->h, ARRAY_SIZE(state->h));
-	memcpy(out, state->h, state->outlen);
-	memzero_explicit(state, sizeof(*state));
-
-	return 0;
+	return crypto_blake2s_final(desc, out, blake2s_compress_generic);
 }
 
 #define BLAKE2S_ALG(name, driver_name, digest_size)			\
@@ -95,8 +35,8 @@ static int crypto_blake2s_final(struct shash_desc *desc, u8 *out)
 		.digestsize		= digest_size,			\
 		.setkey			= crypto_blake2s_setkey,	\
 		.init			= crypto_blake2s_init,		\
-		.update			= crypto_blake2s_update,	\
-		.final			= crypto_blake2s_final,		\
+		.update			= crypto_blake2s_update_generic, \
+		.final			= crypto_blake2s_final_generic,	\
 		.descsize		= sizeof(struct blake2s_state),	\
 	}
 
diff --git a/include/crypto/internal/blake2s.h b/include/crypto/internal/blake2s.h
index 42deba4b8cee..2ea0a8f5e7f4 100644
--- a/include/crypto/internal/blake2s.h
+++ b/include/crypto/internal/blake2s.h
@@ -1,16 +1,16 @@
 /* SPDX-License-Identifier: GPL-2.0 OR MIT */
+/*
+ * Helper functions for BLAKE2s implementations.
+ * Keep this in sync with the corresponding BLAKE2b header.
+ */
 
 #ifndef BLAKE2S_INTERNAL_H
 #define BLAKE2S_INTERNAL_H
 
 #include <crypto/blake2s.h>
+#include <crypto/internal/hash.h>
 #include <linux/string.h>
 
-struct blake2s_tfm_ctx {
-	u8 key[BLAKE2S_KEY_SIZE];
-	unsigned int keylen;
-};
-
 void blake2s_compress_generic(struct blake2s_state *state,const u8 *block,
 			      size_t nblocks, const u32 inc);
 
@@ -27,6 +27,8 @@ static inline void blake2s_set_lastblock(struct blake2s_state *state)
 typedef void (*blake2s_compress_t)(struct blake2s_state *state,
 				   const u8 *block, size_t nblocks, u32 inc);
 
+/* Helper functions for BLAKE2s shared by the library and shash APIs */
+
 static inline void __blake2s_update(struct blake2s_state *state,
 				    const u8 *in, size_t inlen,
 				    blake2s_compress_t compress)
@@ -64,4 +66,57 @@ static inline void __blake2s_final(struct blake2s_state *state, u8 *out,
 	memcpy(out, state->h, state->outlen);
 }
 
+/* Helper functions for shash implementations of BLAKE2s */
+
+struct blake2s_tfm_ctx {
+	u8 key[BLAKE2S_KEY_SIZE];
+	unsigned int keylen;
+};
+
+static inline int crypto_blake2s_setkey(struct crypto_shash *tfm,
+					const u8 *key, unsigned int keylen)
+{
+	struct blake2s_tfm_ctx *tctx = crypto_shash_ctx(tfm);
+
+	if (keylen == 0 || keylen > BLAKE2S_KEY_SIZE)
+		return -EINVAL;
+
+	memcpy(tctx->key, key, keylen);
+	tctx->keylen = keylen;
+
+	return 0;
+}
+
+static inline int crypto_blake2s_init(struct shash_desc *desc)
+{
+	const struct blake2s_tfm_ctx *tctx = crypto_shash_ctx(desc->tfm);
+	struct blake2s_state *state = shash_desc_ctx(desc);
+	unsigned int outlen = crypto_shash_digestsize(desc->tfm);
+
+	if (tctx->keylen)
+		blake2s_init_key(state, outlen, tctx->key, tctx->keylen);
+	else
+		blake2s_init(state, outlen);
+	return 0;
+}
+
+static inline int crypto_blake2s_update(struct shash_desc *desc,
+					const u8 *in, unsigned int inlen,
+					blake2s_compress_t compress)
+{
+	struct blake2s_state *state = shash_desc_ctx(desc);
+
+	__blake2s_update(state, in, inlen, compress);
+	return 0;
+}
+
+static inline int crypto_blake2s_final(struct shash_desc *desc, u8 *out,
+				       blake2s_compress_t compress)
+{
+	struct blake2s_state *state = shash_desc_ctx(desc);
+
+	__blake2s_final(state, out, compress);
+	return 0;
+}
+
 #endif /* BLAKE2S_INTERNAL_H */

commit f7f9188aac119f4699277387e814cc2ef078c9b9
Author: Eric Biggers <ebiggers@google.com>
Date:   Wed Dec 23 00:09:53 2020 -0800

    UPSTREAM: crypto: blake2s - move update and final logic to internal/blake2s.h
    
    Move most of blake2s_update() and blake2s_final() into new inline
    functions __blake2s_update() and __blake2s_final() in
    include/crypto/internal/blake2s.h so that this logic can be shared by
    the shash helper functions.  This will avoid duplicating this logic
    between the library and shash implementations.
    
    Signed-off-by: Eric Biggers <ebiggers@google.com>
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit 057edc9c8bb2d5ff5b058b521792c392428a0714)
    Bug: 152722841
    Bug: 178411248
    Change-Id: Idedf8147914839d5280e5d8eec9013264fbb45f9
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/include/crypto/internal/blake2s.h b/include/crypto/internal/blake2s.h
index 6e376ae6b6b5..42deba4b8cee 100644
--- a/include/crypto/internal/blake2s.h
+++ b/include/crypto/internal/blake2s.h
@@ -4,6 +4,7 @@
 #define BLAKE2S_INTERNAL_H
 
 #include <crypto/blake2s.h>
+#include <linux/string.h>
 
 struct blake2s_tfm_ctx {
 	u8 key[BLAKE2S_KEY_SIZE];
@@ -23,4 +24,44 @@ static inline void blake2s_set_lastblock(struct blake2s_state *state)
 	state->f[0] = -1;
 }
 
+typedef void (*blake2s_compress_t)(struct blake2s_state *state,
+				   const u8 *block, size_t nblocks, u32 inc);
+
+static inline void __blake2s_update(struct blake2s_state *state,
+				    const u8 *in, size_t inlen,
+				    blake2s_compress_t compress)
+{
+	const size_t fill = BLAKE2S_BLOCK_SIZE - state->buflen;
+
+	if (unlikely(!inlen))
+		return;
+	if (inlen > fill) {
+		memcpy(state->buf + state->buflen, in, fill);
+		(*compress)(state, state->buf, 1, BLAKE2S_BLOCK_SIZE);
+		state->buflen = 0;
+		in += fill;
+		inlen -= fill;
+	}
+	if (inlen > BLAKE2S_BLOCK_SIZE) {
+		const size_t nblocks = DIV_ROUND_UP(inlen, BLAKE2S_BLOCK_SIZE);
+		/* Hash one less (full) block than strictly possible */
+		(*compress)(state, in, nblocks - 1, BLAKE2S_BLOCK_SIZE);
+		in += BLAKE2S_BLOCK_SIZE * (nblocks - 1);
+		inlen -= BLAKE2S_BLOCK_SIZE * (nblocks - 1);
+	}
+	memcpy(state->buf + state->buflen, in, inlen);
+	state->buflen += inlen;
+}
+
+static inline void __blake2s_final(struct blake2s_state *state, u8 *out,
+				   blake2s_compress_t compress)
+{
+	blake2s_set_lastblock(state);
+	memset(state->buf + state->buflen, 0,
+	       BLAKE2S_BLOCK_SIZE - state->buflen); /* Padding */
+	(*compress)(state, state->buf, 1, state->buflen);
+	cpu_to_le32_array(state->h, ARRAY_SIZE(state->h));
+	memcpy(out, state->h, state->outlen);
+}
+
 #endif /* BLAKE2S_INTERNAL_H */
diff --git a/lib/crypto/blake2s.c b/lib/crypto/blake2s.c
index 6a4b6b78d630..c64ac8bfb6a9 100644
--- a/lib/crypto/blake2s.c
+++ b/lib/crypto/blake2s.c
@@ -15,55 +15,23 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/bug.h>
-#include <asm/unaligned.h>
+
+#if IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S)
+#  define blake2s_compress blake2s_compress_arch
+#else
+#  define blake2s_compress blake2s_compress_generic
+#endif
 
 void blake2s_update(struct blake2s_state *state, const u8 *in, size_t inlen)
 {
-	const size_t fill = BLAKE2S_BLOCK_SIZE - state->buflen;
-
-	if (unlikely(!inlen))
-		return;
-	if (inlen > fill) {
-		memcpy(state->buf + state->buflen, in, fill);
-		if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S))
-			blake2s_compress_arch(state, state->buf, 1,
-					      BLAKE2S_BLOCK_SIZE);
-		else
-			blake2s_compress_generic(state, state->buf, 1,
-						 BLAKE2S_BLOCK_SIZE);
-		state->buflen = 0;
-		in += fill;
-		inlen -= fill;
-	}
-	if (inlen > BLAKE2S_BLOCK_SIZE) {
-		const size_t nblocks = DIV_ROUND_UP(inlen, BLAKE2S_BLOCK_SIZE);
-		/* Hash one less (full) block than strictly possible */
-		if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S))
-			blake2s_compress_arch(state, in, nblocks - 1,
-					      BLAKE2S_BLOCK_SIZE);
-		else
-			blake2s_compress_generic(state, in, nblocks - 1,
-						 BLAKE2S_BLOCK_SIZE);
-		in += BLAKE2S_BLOCK_SIZE * (nblocks - 1);
-		inlen -= BLAKE2S_BLOCK_SIZE * (nblocks - 1);
-	}
-	memcpy(state->buf + state->buflen, in, inlen);
-	state->buflen += inlen;
+	__blake2s_update(state, in, inlen, blake2s_compress);
 }
 EXPORT_SYMBOL(blake2s_update);
 
 void blake2s_final(struct blake2s_state *state, u8 *out)
 {
 	WARN_ON(IS_ENABLED(DEBUG) && !out);
-	blake2s_set_lastblock(state);
-	memset(state->buf + state->buflen, 0,
-	       BLAKE2S_BLOCK_SIZE - state->buflen); /* Padding */
-	if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S))
-		blake2s_compress_arch(state, state->buf, 1, state->buflen);
-	else
-		blake2s_compress_generic(state, state->buf, 1, state->buflen);
-	cpu_to_le32_array(state->h, ARRAY_SIZE(state->h));
-	memcpy(out, state->h, state->outlen);
+	__blake2s_final(state, out, blake2s_compress);
 	memzero_explicit(state, sizeof(*state));
 }
 EXPORT_SYMBOL(blake2s_final);

commit c07a7ee4b591785375672cba68324080a73e53b8
Author: Eric Biggers <ebiggers@google.com>
Date:   Wed Dec 23 00:09:52 2020 -0800

    UPSTREAM: crypto: blake2s - remove unneeded includes
    
    It doesn't make sense for the generic implementation of BLAKE2s to
    include <crypto/internal/simd.h> and <linux/jump_label.h>, as these are
    things that would only be useful in an architecture-specific
    implementation.  Remove these unnecessary includes.
    
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Eric Biggers <ebiggers@google.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit df412e7efda1e2c5b5fcb06701bba77434cbd1e8)
    Bug: 152722841
    Bug: 178411248
    Change-Id: I8bccb9506d235c2b184b9899ee375fdc12d6b10f
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/crypto/blake2s_generic.c b/crypto/blake2s_generic.c
index a0e91bd3eef1..150edb492599 100644
--- a/crypto/blake2s_generic.c
+++ b/crypto/blake2s_generic.c
@@ -7,7 +7,6 @@
 #include <crypto/internal/hash.h>
 
 #include <linux/types.h>
-#include <linux/jump_label.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 

commit 15911033bc8fa9f83d37e99f1a30fa5bbed6c008
Author: Eric Biggers <ebiggers@google.com>
Date:   Wed Dec 23 00:09:51 2020 -0800

    UPSTREAM: crypto: x86/blake2s - define shash_alg structs using macros
    
    The shash_alg structs for the four variants of BLAKE2s are identical
    except for the algorithm name, driver name, and digest size.  So, avoid
    code duplication by using a macro to define these structs.
    
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Eric Biggers <ebiggers@google.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit 1aa90f4cf034ed4f016a02330820ac0551a6c13c)
    Bug: 152722841
    Bug: 178411248
    Change-Id: Ibba710056182a609defca0a53133387153f0f63d
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/arch/x86/crypto/blake2s-glue.c b/arch/x86/crypto/blake2s-glue.c
index 5fe0a86d8fc9..ad6a28a4877a 100644
--- a/arch/x86/crypto/blake2s-glue.c
+++ b/arch/x86/crypto/blake2s-glue.c
@@ -129,67 +129,29 @@ static int crypto_blake2s_final(struct shash_desc *desc, u8 *out)
 	return 0;
 }
 
-static struct shash_alg blake2s_algs[] = {{
-	.base.cra_name		= "blake2s-128",
-	.base.cra_driver_name	= "blake2s-128-x86",
-	.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,
-	.base.cra_ctxsize	= sizeof(struct blake2s_tfm_ctx),
-	.base.cra_priority	= 200,
-	.base.cra_blocksize     = BLAKE2S_BLOCK_SIZE,
-	.base.cra_module	= THIS_MODULE,
-
-	.digestsize		= BLAKE2S_128_HASH_SIZE,
-	.setkey			= crypto_blake2s_setkey,
-	.init			= crypto_blake2s_init,
-	.update			= crypto_blake2s_update,
-	.final			= crypto_blake2s_final,
-	.descsize		= sizeof(struct blake2s_state),
-}, {
-	.base.cra_name		= "blake2s-160",
-	.base.cra_driver_name	= "blake2s-160-x86",
-	.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,
-	.base.cra_ctxsize	= sizeof(struct blake2s_tfm_ctx),
-	.base.cra_priority	= 200,
-	.base.cra_blocksize     = BLAKE2S_BLOCK_SIZE,
-	.base.cra_module	= THIS_MODULE,
-
-	.digestsize		= BLAKE2S_160_HASH_SIZE,
-	.setkey			= crypto_blake2s_setkey,
-	.init			= crypto_blake2s_init,
-	.update			= crypto_blake2s_update,
-	.final			= crypto_blake2s_final,
-	.descsize		= sizeof(struct blake2s_state),
-}, {
-	.base.cra_name		= "blake2s-224",
-	.base.cra_driver_name	= "blake2s-224-x86",
-	.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,
-	.base.cra_ctxsize	= sizeof(struct blake2s_tfm_ctx),
-	.base.cra_priority	= 200,
-	.base.cra_blocksize     = BLAKE2S_BLOCK_SIZE,
-	.base.cra_module	= THIS_MODULE,
-
-	.digestsize		= BLAKE2S_224_HASH_SIZE,
-	.setkey			= crypto_blake2s_setkey,
-	.init			= crypto_blake2s_init,
-	.update			= crypto_blake2s_update,
-	.final			= crypto_blake2s_final,
-	.descsize		= sizeof(struct blake2s_state),
-}, {
-	.base.cra_name		= "blake2s-256",
-	.base.cra_driver_name	= "blake2s-256-x86",
-	.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,
-	.base.cra_ctxsize	= sizeof(struct blake2s_tfm_ctx),
-	.base.cra_priority	= 200,
-	.base.cra_blocksize     = BLAKE2S_BLOCK_SIZE,
-	.base.cra_module	= THIS_MODULE,
-
-	.digestsize		= BLAKE2S_256_HASH_SIZE,
-	.setkey			= crypto_blake2s_setkey,
-	.init			= crypto_blake2s_init,
-	.update			= crypto_blake2s_update,
-	.final			= crypto_blake2s_final,
-	.descsize		= sizeof(struct blake2s_state),
-}};
+#define BLAKE2S_ALG(name, driver_name, digest_size)			\
+	{								\
+		.base.cra_name		= name,				\
+		.base.cra_driver_name	= driver_name,			\
+		.base.cra_priority	= 200,				\
+		.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,	\
+		.base.cra_blocksize	= BLAKE2S_BLOCK_SIZE,		\
+		.base.cra_ctxsize	= sizeof(struct blake2s_tfm_ctx), \
+		.base.cra_module	= THIS_MODULE,			\
+		.digestsize		= digest_size,			\
+		.setkey			= crypto_blake2s_setkey,	\
+		.init			= crypto_blake2s_init,		\
+		.update			= crypto_blake2s_update,	\
+		.final			= crypto_blake2s_final,		\
+		.descsize		= sizeof(struct blake2s_state),	\
+	}
+
+static struct shash_alg blake2s_algs[] = {
+	BLAKE2S_ALG("blake2s-128", "blake2s-128-x86", BLAKE2S_128_HASH_SIZE),
+	BLAKE2S_ALG("blake2s-160", "blake2s-160-x86", BLAKE2S_160_HASH_SIZE),
+	BLAKE2S_ALG("blake2s-224", "blake2s-224-x86", BLAKE2S_224_HASH_SIZE),
+	BLAKE2S_ALG("blake2s-256", "blake2s-256-x86", BLAKE2S_256_HASH_SIZE),
+};
 
 static int __init blake2s_mod_init(void)
 {

commit 4a0ac0e975b1fe32d217c752576f3ba2cc8b6800
Author: Eric Biggers <ebiggers@google.com>
Date:   Wed Dec 23 00:09:50 2020 -0800

    UPSTREAM: crypto: blake2s - define shash_alg structs using macros
    
    The shash_alg structs for the four variants of BLAKE2s are identical
    except for the algorithm name, driver name, and digest size.  So, avoid
    code duplication by using a macro to define these structs.
    
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Eric Biggers <ebiggers@google.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit 0d396058f92ae7e5ac62839fed54bc2bba630ab5)
    Bug: 152722841
    Bug: 178411248
    Change-Id: I32b3a6c035b18f063ad0e03c43171091ca1490a8
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/crypto/blake2s_generic.c b/crypto/blake2s_generic.c
index 139c745c934b..a0e91bd3eef1 100644
--- a/crypto/blake2s_generic.c
+++ b/crypto/blake2s_generic.c
@@ -84,67 +84,33 @@ static int crypto_blake2s_final(struct shash_desc *desc, u8 *out)
 	return 0;
 }
 
-static struct shash_alg blake2s_algs[] = {{
-	.base.cra_name		= "blake2s-128",
-	.base.cra_driver_name	= "blake2s-128-generic",
-	.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,
-	.base.cra_ctxsize	= sizeof(struct blake2s_tfm_ctx),
-	.base.cra_priority	= 200,
-	.base.cra_blocksize     = BLAKE2S_BLOCK_SIZE,
-	.base.cra_module	= THIS_MODULE,
-
-	.digestsize		= BLAKE2S_128_HASH_SIZE,
-	.setkey			= crypto_blake2s_setkey,
-	.init			= crypto_blake2s_init,
-	.update			= crypto_blake2s_update,
-	.final			= crypto_blake2s_final,
-	.descsize		= sizeof(struct blake2s_state),
-}, {
-	.base.cra_name		= "blake2s-160",
-	.base.cra_driver_name	= "blake2s-160-generic",
-	.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,
-	.base.cra_ctxsize	= sizeof(struct blake2s_tfm_ctx),
-	.base.cra_priority	= 200,
-	.base.cra_blocksize     = BLAKE2S_BLOCK_SIZE,
-	.base.cra_module	= THIS_MODULE,
-
-	.digestsize		= BLAKE2S_160_HASH_SIZE,
-	.setkey			= crypto_blake2s_setkey,
-	.init			= crypto_blake2s_init,
-	.update			= crypto_blake2s_update,
-	.final			= crypto_blake2s_final,
-	.descsize		= sizeof(struct blake2s_state),
-}, {
-	.base.cra_name		= "blake2s-224",
-	.base.cra_driver_name	= "blake2s-224-generic",
-	.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,
-	.base.cra_ctxsize	= sizeof(struct blake2s_tfm_ctx),
-	.base.cra_priority	= 200,
-	.base.cra_blocksize     = BLAKE2S_BLOCK_SIZE,
-	.base.cra_module	= THIS_MODULE,
-
-	.digestsize		= BLAKE2S_224_HASH_SIZE,
-	.setkey			= crypto_blake2s_setkey,
-	.init			= crypto_blake2s_init,
-	.update			= crypto_blake2s_update,
-	.final			= crypto_blake2s_final,
-	.descsize		= sizeof(struct blake2s_state),
-}, {
-	.base.cra_name		= "blake2s-256",
-	.base.cra_driver_name	= "blake2s-256-generic",
-	.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,
-	.base.cra_ctxsize	= sizeof(struct blake2s_tfm_ctx),
-	.base.cra_priority	= 200,
-	.base.cra_blocksize     = BLAKE2S_BLOCK_SIZE,
-	.base.cra_module	= THIS_MODULE,
-
-	.digestsize		= BLAKE2S_256_HASH_SIZE,
-	.setkey			= crypto_blake2s_setkey,
-	.init			= crypto_blake2s_init,
-	.update			= crypto_blake2s_update,
-	.final			= crypto_blake2s_final,
-	.descsize		= sizeof(struct blake2s_state),
-}};
+#define BLAKE2S_ALG(name, driver_name, digest_size)			\
+	{								\
+		.base.cra_name		= name,				\
+		.base.cra_driver_name	= driver_name,			\
+		.base.cra_priority	= 100,				\
+		.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,	\
+		.base.cra_blocksize	= BLAKE2S_BLOCK_SIZE,		\
+		.base.cra_ctxsize	= sizeof(struct blake2s_tfm_ctx), \
+		.base.cra_module	= THIS_MODULE,			\
+		.digestsize		= digest_size,			\
+		.setkey			= crypto_blake2s_setkey,	\
+		.init			= crypto_blake2s_init,		\
+		.update			= crypto_blake2s_update,	\
+		.final			= crypto_blake2s_final,		\
+		.descsize		= sizeof(struct blake2s_state),	\
+	}
+
+static struct shash_alg blake2s_algs[] = {
+	BLAKE2S_ALG("blake2s-128", "blake2s-128-generic",
+		    BLAKE2S_128_HASH_SIZE),
+	BLAKE2S_ALG("blake2s-160", "blake2s-160-generic",
+		    BLAKE2S_160_HASH_SIZE),
+	BLAKE2S_ALG("blake2s-224", "blake2s-224-generic",
+		    BLAKE2S_224_HASH_SIZE),
+	BLAKE2S_ALG("blake2s-256", "blake2s-256-generic",
+		    BLAKE2S_256_HASH_SIZE),
+};
 
 static int __init blake2s_mod_init(void)
 {

commit 7bec5e693a14008f9f6fe53c3318867e199ce8a8
Author: Herbert Xu <herbert@gondor.apana.org.au>
Date:   Fri Nov 27 16:43:18 2020 +1100

    UPSTREAM: crypto: lib/blake2s - Move selftest prototype into header file
    
    This patch fixes a missing prototype warning on blake2s_selftest.
    
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit ce0d5d63e897cc7c3a8fd043c7942fc6a78ec6f4)
    Bug: 152722841
    Change-Id: Ieb19048d60f6c9dc36cefda8b09b3d5c95e9118e
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/include/crypto/internal/blake2s.h b/include/crypto/internal/blake2s.h
index 74ff77032e52..6e376ae6b6b5 100644
--- a/include/crypto/internal/blake2s.h
+++ b/include/crypto/internal/blake2s.h
@@ -16,6 +16,8 @@ void blake2s_compress_generic(struct blake2s_state *state,const u8 *block,
 void blake2s_compress_arch(struct blake2s_state *state,const u8 *block,
 			   size_t nblocks, const u32 inc);
 
+bool blake2s_selftest(void);
+
 static inline void blake2s_set_lastblock(struct blake2s_state *state)
 {
 	state->f[0] = -1;
diff --git a/lib/crypto/blake2s-selftest.c b/lib/crypto/blake2s-selftest.c
index 79ef404a990d..5d9ea53be973 100644
--- a/lib/crypto/blake2s-selftest.c
+++ b/lib/crypto/blake2s-selftest.c
@@ -3,7 +3,7 @@
  * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
  */
 
-#include <crypto/blake2s.h>
+#include <crypto/internal/blake2s.h>
 #include <linux/string.h>
 
 /*
diff --git a/lib/crypto/blake2s.c b/lib/crypto/blake2s.c
index 41025a30c524..6a4b6b78d630 100644
--- a/lib/crypto/blake2s.c
+++ b/lib/crypto/blake2s.c
@@ -17,8 +17,6 @@
 #include <linux/bug.h>
 #include <asm/unaligned.h>
 
-bool blake2s_selftest(void);
-
 void blake2s_update(struct blake2s_state *state, const u8 *in, size_t inlen)
 {
 	const size_t fill = BLAKE2S_BLOCK_SIZE - state->buflen;

commit 45e0eb38e507e66e9b31e92754a3ceb55ddf113d
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Tue May 5 15:53:45 2020 +0200

    UPSTREAM: crypto: blake2b - Fix clang optimization for ARMv7-M
    
    When building for ARMv7-M, clang-9 or higher tries to unroll some loops,
    which ends up confusing the register allocator to the point of generating
    rather bad code and using more than the warning limit for stack frames:
    
    warning: stack frame size of 1200 bytes in function 'blake2b_compress' [-Wframe-larger-than=]
    
    Forcing it to not unroll the final loop avoids this problem.
    
    Fixes: 91d689337fe8 ("crypto: blake2b - add blake2b generic implementation")
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Reviewed-by: Nathan Chancellor <natechancellor@gmail.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit 0c0408e86dbe8f44d4b27bf42130e8ac905361d6)
    Bug: 178411248
    Change-Id: I71ee6df844bdbace9f06342a61322c7494533564
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/crypto/blake2b_generic.c b/crypto/blake2b_generic.c
index d04b1788dc42..2f15a9725054 100644
--- a/crypto/blake2b_generic.c
+++ b/crypto/blake2b_generic.c
@@ -129,7 +129,9 @@ static void blake2b_compress(struct blake2b_state *S,
 	ROUND(9);
 	ROUND(10);
 	ROUND(11);
-
+#ifdef CONFIG_CC_IS_CLANG
+#pragma nounroll /* https://bugs.llvm.org/show_bug.cgi?id=45803 */
+#endif
 	for (i = 0; i < 8; ++i)
 		S->h[i] = S->h[i] ^ v[i] ^ v[i + 8];
 }

commit b0e0bc92f322c02cfe24ea52ad40868a66039ef9
Author: David Sterba <dsterba@suse.com>
Date:   Tue Nov 12 11:20:30 2019 +0100

    UPSTREAM: crypto: blake2b - rename tfm context and _setkey callback
    
    The TFM context can be renamed to a more appropriate name and the local
    varaibles as well, using 'tctx' which seems to be more common than
    'mctx'.
    
    The _setkey callback was the last one without the blake2b_ prefix,
    rename that too.
    
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit c433a1a8572eceb7c45dd85d93fec6946b71bb72)
    Bug: 178411248
    Change-Id: I8b7dfa5779ee6f76bb7e21572d29df1310705485
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/crypto/blake2b_generic.c b/crypto/blake2b_generic.c
index 2c756a7dcc21..d04b1788dc42 100644
--- a/crypto/blake2b_generic.c
+++ b/crypto/blake2b_generic.c
@@ -137,30 +137,30 @@ static void blake2b_compress(struct blake2b_state *S,
 #undef G
 #undef ROUND
 
-struct digest_tfm_ctx {
+struct blake2b_tfm_ctx {
 	u8 key[BLAKE2B_KEYBYTES];
 	unsigned int keylen;
 };
 
-static int digest_setkey(struct crypto_shash *tfm, const u8 *key,
-			 unsigned int keylen)
+static int blake2b_setkey(struct crypto_shash *tfm, const u8 *key,
+			  unsigned int keylen)
 {
-	struct digest_tfm_ctx *mctx = crypto_shash_ctx(tfm);
+	struct blake2b_tfm_ctx *tctx = crypto_shash_ctx(tfm);
 
 	if (keylen == 0 || keylen > BLAKE2B_KEYBYTES) {
 		crypto_shash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN);
 		return -EINVAL;
 	}
 
-	memcpy(mctx->key, key, keylen);
-	mctx->keylen = keylen;
+	memcpy(tctx->key, key, keylen);
+	tctx->keylen = keylen;
 
 	return 0;
 }
 
 static int blake2b_init(struct shash_desc *desc)
 {
-	struct digest_tfm_ctx *mctx = crypto_shash_ctx(desc->tfm);
+	struct blake2b_tfm_ctx *tctx = crypto_shash_ctx(desc->tfm);
 	struct blake2b_state *state = shash_desc_ctx(desc);
 	const int digestsize = crypto_shash_digestsize(desc->tfm);
 
@@ -168,14 +168,14 @@ static int blake2b_init(struct shash_desc *desc)
 	memcpy(state->h, blake2b_IV, sizeof(state->h));
 
 	/* Parameter block is all zeros except index 0, no xor for 1..7 */
-	state->h[0] ^= 0x01010000 | mctx->keylen << 8 | digestsize;
+	state->h[0] ^= 0x01010000 | tctx->keylen << 8 | digestsize;
 
-	if (mctx->keylen) {
+	if (tctx->keylen) {
 		/*
 		 * Prefill the buffer with the key, next call to _update or
 		 * _final will process it
 		 */
-		memcpy(state->buf, mctx->key, mctx->keylen);
+		memcpy(state->buf, tctx->key, tctx->keylen);
 		state->buflen = BLAKE2B_BLOCKBYTES;
 	}
 	return 0;
@@ -241,10 +241,10 @@ static struct shash_alg blake2b_algs[] = {
 		.base.cra_priority	= 100,
 		.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,
 		.base.cra_blocksize	= BLAKE2B_BLOCKBYTES,
-		.base.cra_ctxsize	= sizeof(struct digest_tfm_ctx),
+		.base.cra_ctxsize	= sizeof(struct blake2b_tfm_ctx),
 		.base.cra_module	= THIS_MODULE,
 		.digestsize		= BLAKE2B_160_DIGEST_SIZE,
-		.setkey			= digest_setkey,
+		.setkey			= blake2b_setkey,
 		.init			= blake2b_init,
 		.update			= blake2b_update,
 		.final			= blake2b_final,
@@ -255,10 +255,10 @@ static struct shash_alg blake2b_algs[] = {
 		.base.cra_priority	= 100,
 		.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,
 		.base.cra_blocksize	= BLAKE2B_BLOCKBYTES,
-		.base.cra_ctxsize	= sizeof(struct digest_tfm_ctx),
+		.base.cra_ctxsize	= sizeof(struct blake2b_tfm_ctx),
 		.base.cra_module	= THIS_MODULE,
 		.digestsize		= BLAKE2B_256_DIGEST_SIZE,
-		.setkey			= digest_setkey,
+		.setkey			= blake2b_setkey,
 		.init			= blake2b_init,
 		.update			= blake2b_update,
 		.final			= blake2b_final,
@@ -269,10 +269,10 @@ static struct shash_alg blake2b_algs[] = {
 		.base.cra_priority	= 100,
 		.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,
 		.base.cra_blocksize	= BLAKE2B_BLOCKBYTES,
-		.base.cra_ctxsize	= sizeof(struct digest_tfm_ctx),
+		.base.cra_ctxsize	= sizeof(struct blake2b_tfm_ctx),
 		.base.cra_module	= THIS_MODULE,
 		.digestsize		= BLAKE2B_384_DIGEST_SIZE,
-		.setkey			= digest_setkey,
+		.setkey			= blake2b_setkey,
 		.init			= blake2b_init,
 		.update			= blake2b_update,
 		.final			= blake2b_final,
@@ -283,10 +283,10 @@ static struct shash_alg blake2b_algs[] = {
 		.base.cra_priority	= 100,
 		.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,
 		.base.cra_blocksize	= BLAKE2B_BLOCKBYTES,
-		.base.cra_ctxsize	= sizeof(struct digest_tfm_ctx),
+		.base.cra_ctxsize	= sizeof(struct blake2b_tfm_ctx),
 		.base.cra_module	= THIS_MODULE,
 		.digestsize		= BLAKE2B_512_DIGEST_SIZE,
-		.setkey			= digest_setkey,
+		.setkey			= blake2b_setkey,
 		.init			= blake2b_init,
 		.update			= blake2b_update,
 		.final			= blake2b_final,

commit 9021782944e6ad3a3eb1278779dcb6ec5519626b
Author: David Sterba <dsterba@suse.com>
Date:   Tue Nov 12 11:20:29 2019 +0100

    UPSTREAM: crypto: blake2b - merge _update to api callback
    
    Now that there's only one call to blake2b_update, we can merge it to the
    callback and simplify. The empty input check is split and the rest of
    code un-indented.
    
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit 0b4b5f10ac1ffb7f51db1832d189c33955c0d4c1)
    Bug: 178411248
    Change-Id: Ic260edcee45116ac1a9f03f2792fe577a2c629c6
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/crypto/blake2b_generic.c b/crypto/blake2b_generic.c
index 463ac597ef04..2c756a7dcc21 100644
--- a/crypto/blake2b_generic.c
+++ b/crypto/blake2b_generic.c
@@ -137,35 +137,6 @@ static void blake2b_compress(struct blake2b_state *S,
 #undef G
 #undef ROUND
 
-static void blake2b_update(struct blake2b_state *S, const void *pin, size_t inlen)
-{
-	const u8 *in = (const u8 *)pin;
-
-	if (inlen > 0) {
-		size_t left = S->buflen;
-		size_t fill = BLAKE2B_BLOCKBYTES - left;
-
-		if (inlen > fill) {
-			S->buflen = 0;
-			/* Fill buffer */
-			memcpy(S->buf + left, in, fill);
-			blake2b_increment_counter(S, BLAKE2B_BLOCKBYTES);
-			/* Compress */
-			blake2b_compress(S, S->buf);
-			in += fill;
-			inlen -= fill;
-			while (inlen > BLAKE2B_BLOCKBYTES) {
-				blake2b_increment_counter(S, BLAKE2B_BLOCKBYTES);
-				blake2b_compress(S, in);
-				in += BLAKE2B_BLOCKBYTES;
-				inlen -= BLAKE2B_BLOCKBYTES;
-			}
-		}
-		memcpy(S->buf + S->buflen, in, inlen);
-		S->buflen += inlen;
-	}
-}
-
 struct digest_tfm_ctx {
 	u8 key[BLAKE2B_KEYBYTES];
 	unsigned int keylen;
@@ -210,12 +181,35 @@ static int blake2b_init(struct shash_desc *desc)
 	return 0;
 }
 
-static int digest_update(struct shash_desc *desc, const u8 *data,
-			 unsigned int length)
+static int blake2b_update(struct shash_desc *desc, const u8 *in,
+			  unsigned int inlen)
 {
 	struct blake2b_state *state = shash_desc_ctx(desc);
+	const size_t left = state->buflen;
+	const size_t fill = BLAKE2B_BLOCKBYTES - left;
+
+	if (!inlen)
+		return 0;
+
+	if (inlen > fill) {
+		state->buflen = 0;
+		/* Fill buffer */
+		memcpy(state->buf + left, in, fill);
+		blake2b_increment_counter(state, BLAKE2B_BLOCKBYTES);
+		/* Compress */
+		blake2b_compress(state, state->buf);
+		in += fill;
+		inlen -= fill;
+		while (inlen > BLAKE2B_BLOCKBYTES) {
+			blake2b_increment_counter(state, BLAKE2B_BLOCKBYTES);
+			blake2b_compress(state, in);
+			in += BLAKE2B_BLOCKBYTES;
+			inlen -= BLAKE2B_BLOCKBYTES;
+		}
+	}
+	memcpy(state->buf + state->buflen, in, inlen);
+	state->buflen += inlen;
 
-	blake2b_update(state, data, length);
 	return 0;
 }
 
@@ -252,7 +246,7 @@ static struct shash_alg blake2b_algs[] = {
 		.digestsize		= BLAKE2B_160_DIGEST_SIZE,
 		.setkey			= digest_setkey,
 		.init			= blake2b_init,
-		.update			= digest_update,
+		.update			= blake2b_update,
 		.final			= blake2b_final,
 		.descsize		= sizeof(struct blake2b_state),
 	}, {
@@ -266,7 +260,7 @@ static struct shash_alg blake2b_algs[] = {
 		.digestsize		= BLAKE2B_256_DIGEST_SIZE,
 		.setkey			= digest_setkey,
 		.init			= blake2b_init,
-		.update			= digest_update,
+		.update			= blake2b_update,
 		.final			= blake2b_final,
 		.descsize		= sizeof(struct blake2b_state),
 	}, {
@@ -280,7 +274,7 @@ static struct shash_alg blake2b_algs[] = {
 		.digestsize		= BLAKE2B_384_DIGEST_SIZE,
 		.setkey			= digest_setkey,
 		.init			= blake2b_init,
-		.update			= digest_update,
+		.update			= blake2b_update,
 		.final			= blake2b_final,
 		.descsize		= sizeof(struct blake2b_state),
 	}, {
@@ -294,7 +288,7 @@ static struct shash_alg blake2b_algs[] = {
 		.digestsize		= BLAKE2B_512_DIGEST_SIZE,
 		.setkey			= digest_setkey,
 		.init			= blake2b_init,
-		.update			= digest_update,
+		.update			= blake2b_update,
 		.final			= blake2b_final,
 		.descsize		= sizeof(struct blake2b_state),
 	}

commit 2ddda505142ad10aee50d77f41abf22aea233812
Author: David Sterba <dsterba@suse.com>
Date:   Tue Nov 12 11:20:28 2019 +0100

    UPSTREAM: crypto: blake2b - open code set last block helper
    
    The helper is trival and called once, inlining makes things simpler.
    There's a comment to tie it back to the idea behind the code.
    
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit a2e4bdce0f6e69c6cf9e460c4fe158bcc0db351f)
    Bug: 178411248
    Change-Id: Iba1276dfcdb29240206f66bf98902d0e587a590f
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/crypto/blake2b_generic.c b/crypto/blake2b_generic.c
index 442c639c9ad9..463ac597ef04 100644
--- a/crypto/blake2b_generic.c
+++ b/crypto/blake2b_generic.c
@@ -65,11 +65,6 @@ static const u8 blake2b_sigma[12][16] = {
 	{ 14, 10,  4,  8,  9, 15, 13,  6,  1, 12,  0,  2, 11,  7,  5,  3 }
 };
 
-static void blake2b_set_lastblock(struct blake2b_state *S)
-{
-	S->f[0] = (u64)-1;
-}
-
 static void blake2b_increment_counter(struct blake2b_state *S, const u64 inc)
 {
 	S->t[0] += inc;
@@ -231,7 +226,8 @@ static int blake2b_final(struct shash_desc *desc, u8 *out)
 	size_t i;
 
 	blake2b_increment_counter(state, state->buflen);
-	blake2b_set_lastblock(state);
+	/* Set last block */
+	state->f[0] = (u64)-1;
 	/* Padding */
 	memset(state->buf + state->buflen, 0, BLAKE2B_BLOCKBYTES - state->buflen);
 	blake2b_compress(state, state->buf);

commit 755d5a0a12f428366ac06bf8aa6e6a1556347dd5
Author: David Sterba <dsterba@suse.com>
Date:   Tue Nov 12 11:20:27 2019 +0100

    UPSTREAM: crypto: blake2b - delete unused structs or members
    
    All the code for param block has been inlined, last_node and outlen from
    the state are not used or have become redundant due to other code.
    Remove it.
    
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit d063d6327e7de18e16e4742579a0ff759c3889fb)
    Bug: 178411248
    Change-Id: Ia7090fe3162495abae29b86f37e53ebf02414fe2
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/crypto/blake2b_generic.c b/crypto/blake2b_generic.c
index fd0fbb076058..442c639c9ad9 100644
--- a/crypto/blake2b_generic.c
+++ b/crypto/blake2b_generic.c
@@ -32,10 +32,7 @@
 
 enum blake2b_constant {
 	BLAKE2B_BLOCKBYTES    = 128,
-	BLAKE2B_OUTBYTES      = 64,
 	BLAKE2B_KEYBYTES      = 64,
-	BLAKE2B_SALTBYTES     = 16,
-	BLAKE2B_PERSONALBYTES = 16
 };
 
 struct blake2b_state {
@@ -44,25 +41,8 @@ struct blake2b_state {
 	u64      f[2];
 	u8       buf[BLAKE2B_BLOCKBYTES];
 	size_t   buflen;
-	size_t   outlen;
-	u8       last_node;
 };
 
-struct blake2b_param {
-	u8 digest_length;			/* 1 */
-	u8 key_length;				/* 2 */
-	u8 fanout;				/* 3 */
-	u8 depth;				/* 4 */
-	__le32 leaf_length;			/* 8 */
-	__le32 node_offset;			/* 12 */
-	__le32 xof_length;			/* 16 */
-	u8 node_depth;				/* 17 */
-	u8 inner_length;			/* 18 */
-	u8 reserved[14];			/* 32 */
-	u8 salt[BLAKE2B_SALTBYTES];		/* 48 */
-	u8 personal[BLAKE2B_PERSONALBYTES];	/* 64 */
-} __packed;
-
 static const u64 blake2b_IV[8] = {
 	0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL,
 	0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL,
@@ -85,16 +65,8 @@ static const u8 blake2b_sigma[12][16] = {
 	{ 14, 10,  4,  8,  9, 15, 13,  6,  1, 12,  0,  2, 11,  7,  5,  3 }
 };
 
-static void blake2b_set_lastnode(struct blake2b_state *S)
-{
-	S->f[1] = (u64)-1;
-}
-
 static void blake2b_set_lastblock(struct blake2b_state *S)
 {
-	if (S->last_node)
-		blake2b_set_lastnode(S);
-
 	S->f[0] = (u64)-1;
 }
 
@@ -334,8 +306,6 @@ static struct shash_alg blake2b_algs[] = {
 
 static int __init blake2b_mod_init(void)
 {
-	BUILD_BUG_ON(sizeof(struct blake2b_param) != BLAKE2B_OUTBYTES);
-
 	return crypto_register_shashes(blake2b_algs, ARRAY_SIZE(blake2b_algs));
 }
 

commit 5ecbb9a584ee4308d6d76749a4a90717d741b6c3
Author: David Sterba <dsterba@suse.com>
Date:   Tue Nov 12 11:20:26 2019 +0100

    UPSTREAM: crypto: blake2b - simplify key init
    
    The keyed init writes the key bytes to the input buffer and does an
    update. We can do that in two ways: fill the buffer and update
    immediatelly. This is what current blake2b_init_key does. Any other
    following _update or _final will continue from the updated state.
    
    The other way is to write the key and set the number of bytes to process
    at the next _update or _final, lazy evaluation. Which leads to the the
    simplified code in this patch.
    
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit e87e484d60b0da8302b45f27fe32af1cea02c8d2)
    Bug: 178411248
    Change-Id: I90652bb41d252af9503d5976ce32b93e2610debf
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/crypto/blake2b_generic.c b/crypto/blake2b_generic.c
index d3da6113a96a..fd0fbb076058 100644
--- a/crypto/blake2b_generic.c
+++ b/crypto/blake2b_generic.c
@@ -85,8 +85,6 @@ static const u8 blake2b_sigma[12][16] = {
 	{ 14, 10,  4,  8,  9, 15, 13,  6,  1, 12,  0,  2, 11,  7,  5,  3 }
 };
 
-static void blake2b_update(struct blake2b_state *S, const void *pin, size_t inlen);
-
 static void blake2b_set_lastnode(struct blake2b_state *S)
 {
 	S->f[1] = (u64)-1;
@@ -235,12 +233,12 @@ static int blake2b_init(struct shash_desc *desc)
 	state->h[0] ^= 0x01010000 | mctx->keylen << 8 | digestsize;
 
 	if (mctx->keylen) {
-		u8 block[BLAKE2B_BLOCKBYTES];
-
-		memset(block, 0, BLAKE2B_BLOCKBYTES);
-		memcpy(block, mctx->key, mctx->keylen);
-		blake2b_update(state, block, BLAKE2B_BLOCKBYTES);
-		memzero_explicit(block, BLAKE2B_BLOCKBYTES);
+		/*
+		 * Prefill the buffer with the key, next call to _update or
+		 * _final will process it
+		 */
+		memcpy(state->buf, mctx->key, mctx->keylen);
+		state->buflen = BLAKE2B_BLOCKBYTES;
 	}
 	return 0;
 }

commit 92071d4cebcb6b5c0d867cb0a16e89502bcb0bbd
Author: David Sterba <dsterba@suse.com>
Date:   Tue Nov 12 11:20:25 2019 +0100

    UPSTREAM: crypto: blake2b - merge blake2 init to api callback
    
    The call chain from blake2b_init can be simplified because the param
    block is effectively zeros, besides the key.
    
    - blake2b_init0 zeroes state and sets IV
    - blake2b_init sets up param block with defaults (key and some 1s)
    - init with key, write it to the input buffer and recalculate state
    
    So the compact way is to zero out the state and initialize index 0 of
    the state directly with the non-zero values and the key.
    
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit e374969565472824eba4669dea4a23ad2edb414f)
    Bug: 178411248
    Change-Id: I797e941bf90262f6cf334c100a91e5b90dc00a2c
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/crypto/blake2b_generic.c b/crypto/blake2b_generic.c
index 743905fabd65..d3da6113a96a 100644
--- a/crypto/blake2b_generic.c
+++ b/crypto/blake2b_generic.c
@@ -106,81 +106,6 @@ static void blake2b_increment_counter(struct blake2b_state *S, const u64 inc)
 	S->t[1] += (S->t[0] < inc);
 }
 
-static void blake2b_init0(struct blake2b_state *S)
-{
-	size_t i;
-
-	memset(S, 0, sizeof(struct blake2b_state));
-
-	for (i = 0; i < 8; ++i)
-		S->h[i] = blake2b_IV[i];
-}
-
-/* init xors IV with input parameter block */
-static void blake2b_init_param(struct blake2b_state *S,
-			       const struct blake2b_param *P)
-{
-	const u8 *p = (const u8 *)(P);
-	size_t i;
-
-	blake2b_init0(S);
-
-	/* IV XOR ParamBlock */
-	for (i = 0; i < 8; ++i)
-		S->h[i] ^= get_unaligned_le64(p + sizeof(S->h[i]) * i);
-
-	S->outlen = P->digest_length;
-}
-
-static void blake2b_init(struct blake2b_state *S, size_t outlen)
-{
-	struct blake2b_param P;
-
-	P.digest_length = (u8)outlen;
-	P.key_length    = 0;
-	P.fanout        = 1;
-	P.depth         = 1;
-	P.leaf_length   = 0;
-	P.node_offset   = 0;
-	P.xof_length    = 0;
-	P.node_depth    = 0;
-	P.inner_length  = 0;
-	memset(P.reserved, 0, sizeof(P.reserved));
-	memset(P.salt,     0, sizeof(P.salt));
-	memset(P.personal, 0, sizeof(P.personal));
-	blake2b_init_param(S, &P);
-}
-
-static void blake2b_init_key(struct blake2b_state *S, size_t outlen,
-			     const void *key, size_t keylen)
-{
-	struct blake2b_param P;
-
-	P.digest_length = (u8)outlen;
-	P.key_length    = (u8)keylen;
-	P.fanout        = 1;
-	P.depth         = 1;
-	P.leaf_length   = 0;
-	P.node_offset   = 0;
-	P.xof_length    = 0;
-	P.node_depth    = 0;
-	P.inner_length  = 0;
-	memset(P.reserved, 0, sizeof(P.reserved));
-	memset(P.salt,     0, sizeof(P.salt));
-	memset(P.personal, 0, sizeof(P.personal));
-
-	blake2b_init_param(S, &P);
-
-	{
-		u8 block[BLAKE2B_BLOCKBYTES];
-
-		memset(block, 0, BLAKE2B_BLOCKBYTES);
-		memcpy(block, key, keylen);
-		blake2b_update(S, block, BLAKE2B_BLOCKBYTES);
-		memzero_explicit(block, BLAKE2B_BLOCKBYTES);
-	}
-}
-
 #define G(r,i,a,b,c,d)                                  \
 	do {                                            \
 		a = a + b + m[blake2b_sigma[r][2*i+0]]; \
@@ -297,16 +222,26 @@ static int digest_setkey(struct crypto_shash *tfm, const u8 *key,
 	return 0;
 }
 
-static int digest_init(struct shash_desc *desc)
+static int blake2b_init(struct shash_desc *desc)
 {
 	struct digest_tfm_ctx *mctx = crypto_shash_ctx(desc->tfm);
 	struct blake2b_state *state = shash_desc_ctx(desc);
 	const int digestsize = crypto_shash_digestsize(desc->tfm);
 
-	if (mctx->keylen == 0)
-		blake2b_init(state, digestsize);
-	else
-		blake2b_init_key(state, digestsize, mctx->key, mctx->keylen);
+	memset(state, 0, sizeof(*state));
+	memcpy(state->h, blake2b_IV, sizeof(state->h));
+
+	/* Parameter block is all zeros except index 0, no xor for 1..7 */
+	state->h[0] ^= 0x01010000 | mctx->keylen << 8 | digestsize;
+
+	if (mctx->keylen) {
+		u8 block[BLAKE2B_BLOCKBYTES];
+
+		memset(block, 0, BLAKE2B_BLOCKBYTES);
+		memcpy(block, mctx->key, mctx->keylen);
+		blake2b_update(state, block, BLAKE2B_BLOCKBYTES);
+		memzero_explicit(block, BLAKE2B_BLOCKBYTES);
+	}
 	return 0;
 }
 
@@ -350,7 +285,7 @@ static struct shash_alg blake2b_algs[] = {
 		.base.cra_module	= THIS_MODULE,
 		.digestsize		= BLAKE2B_160_DIGEST_SIZE,
 		.setkey			= digest_setkey,
-		.init			= digest_init,
+		.init			= blake2b_init,
 		.update			= digest_update,
 		.final			= blake2b_final,
 		.descsize		= sizeof(struct blake2b_state),
@@ -364,7 +299,7 @@ static struct shash_alg blake2b_algs[] = {
 		.base.cra_module	= THIS_MODULE,
 		.digestsize		= BLAKE2B_256_DIGEST_SIZE,
 		.setkey			= digest_setkey,
-		.init			= digest_init,
+		.init			= blake2b_init,
 		.update			= digest_update,
 		.final			= blake2b_final,
 		.descsize		= sizeof(struct blake2b_state),
@@ -378,7 +313,7 @@ static struct shash_alg blake2b_algs[] = {
 		.base.cra_module	= THIS_MODULE,
 		.digestsize		= BLAKE2B_384_DIGEST_SIZE,
 		.setkey			= digest_setkey,
-		.init			= digest_init,
+		.init			= blake2b_init,
 		.update			= digest_update,
 		.final			= blake2b_final,
 		.descsize		= sizeof(struct blake2b_state),
@@ -392,7 +327,7 @@ static struct shash_alg blake2b_algs[] = {
 		.base.cra_module	= THIS_MODULE,
 		.digestsize		= BLAKE2B_512_DIGEST_SIZE,
 		.setkey			= digest_setkey,
-		.init			= digest_init,
+		.init			= blake2b_init,
 		.update			= digest_update,
 		.final			= blake2b_final,
 		.descsize		= sizeof(struct blake2b_state),

commit f0430a733bb0454a402922e3882816faddd169c8
Author: David Sterba <dsterba@suse.com>
Date:   Tue Nov 12 11:20:24 2019 +0100

    UPSTREAM: crypto: blake2b - merge _final implementation to callback
    
    blake2b_final is called only once, merge it to the crypto API callback
    and simplify. This avoids the temporary buffer and swaps the bytes of
    internal buffer.
    
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit 086db43b5a2281f7ce7d8a67a171b91e1e8fe0ec)
    Bug: 178411248
    Change-Id: I7c5e2d9d931d463ada7573e66268f7b93a2d40a4
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/crypto/blake2b_generic.c b/crypto/blake2b_generic.c
index 8dab65612a41..743905fabd65 100644
--- a/crypto/blake2b_generic.c
+++ b/crypto/blake2b_generic.c
@@ -276,25 +276,6 @@ static void blake2b_update(struct blake2b_state *S, const void *pin, size_t inle
 	}
 }
 
-static void blake2b_final(struct blake2b_state *S, void *out, size_t outlen)
-{
-	u8 buffer[BLAKE2B_OUTBYTES] = {0};
-	size_t i;
-
-	blake2b_increment_counter(S, S->buflen);
-	blake2b_set_lastblock(S);
-	/* Padding */
-	memset(S->buf + S->buflen, 0, BLAKE2B_BLOCKBYTES - S->buflen);
-	blake2b_compress(S, S->buf);
-
-	/* Output full hash to temp buffer */
-	for (i = 0; i < 8; ++i)
-		put_unaligned_le64(S->h[i], buffer + sizeof(S->h[i]) * i);
-
-	memcpy(out, buffer, S->outlen);
-	memzero_explicit(buffer, sizeof(buffer));
-}
-
 struct digest_tfm_ctx {
 	u8 key[BLAKE2B_KEYBYTES];
 	unsigned int keylen;
@@ -338,12 +319,23 @@ static int digest_update(struct shash_desc *desc, const u8 *data,
 	return 0;
 }
 
-static int digest_final(struct shash_desc *desc, u8 *out)
+static int blake2b_final(struct shash_desc *desc, u8 *out)
 {
 	struct blake2b_state *state = shash_desc_ctx(desc);
 	const int digestsize = crypto_shash_digestsize(desc->tfm);
+	size_t i;
+
+	blake2b_increment_counter(state, state->buflen);
+	blake2b_set_lastblock(state);
+	/* Padding */
+	memset(state->buf + state->buflen, 0, BLAKE2B_BLOCKBYTES - state->buflen);
+	blake2b_compress(state, state->buf);
+
+	/* Avoid temporary buffer and switch the internal output to LE order */
+	for (i = 0; i < ARRAY_SIZE(state->h); i++)
+		__cpu_to_le64s(&state->h[i]);
 
-	blake2b_final(state, out, digestsize);
+	memcpy(out, state->h, digestsize);
 	return 0;
 }
 
@@ -360,7 +352,7 @@ static struct shash_alg blake2b_algs[] = {
 		.setkey			= digest_setkey,
 		.init			= digest_init,
 		.update			= digest_update,
-		.final			= digest_final,
+		.final			= blake2b_final,
 		.descsize		= sizeof(struct blake2b_state),
 	}, {
 		.base.cra_name		= "blake2b-256",
@@ -374,7 +366,7 @@ static struct shash_alg blake2b_algs[] = {
 		.setkey			= digest_setkey,
 		.init			= digest_init,
 		.update			= digest_update,
-		.final			= digest_final,
+		.final			= blake2b_final,
 		.descsize		= sizeof(struct blake2b_state),
 	}, {
 		.base.cra_name		= "blake2b-384",
@@ -388,7 +380,7 @@ static struct shash_alg blake2b_algs[] = {
 		.setkey			= digest_setkey,
 		.init			= digest_init,
 		.update			= digest_update,
-		.final			= digest_final,
+		.final			= blake2b_final,
 		.descsize		= sizeof(struct blake2b_state),
 	}, {
 		.base.cra_name		= "blake2b-512",
@@ -402,7 +394,7 @@ static struct shash_alg blake2b_algs[] = {
 		.setkey			= digest_setkey,
 		.init			= digest_init,
 		.update			= digest_update,
-		.final			= digest_final,
+		.final			= blake2b_final,
 		.descsize		= sizeof(struct blake2b_state),
 	}
 };

commit edb90dfdf120b3218a687508e52b6b1ab4f818cc
Author: David Sterba <dsterba@suse.com>
Date:   Thu Oct 24 18:28:32 2019 +0200

    BACKPORT: crypto: testmgr - add test vectors for blake2b
    
    Test vectors for blake2b with various digest sizes. As the algorithm is
    the same up to the digest calculation, the key and input data length is
    distributed in a way that tests all combinanions of the two over the
    digest sizes.
    
    Based on the suggestion from Eric, the following input sizes are tested
    [0, 1, 7, 15, 64, 247, 256], where blake2b blocksize is 128, so the
    padded and the non-padded input buffers are tested.
    
              blake2b-160  blake2b-256  blake2b-384  blake2b-512
             ---------------------------------------------------
    len=0   | klen=0       klen=1       klen=32      klen=64
    len=1   | klen=32      klen=64      klen=0       klen=1
    len=7   | klen=64      klen=0       klen=1       klen=32
    len=15  | klen=1       klen=32      klen=64      klen=0
    len=64  | klen=0       klen=1       klen=32      klen=64
    len=247 | klen=32      klen=64      klen=0       klen=1
    len=256 | klen=64      klen=0       klen=1       klen=32
    
    Where key:
    
    - klen=0: empty key
    - klen=1: 1 byte value 0x42, 'B'
    - klen=32: first 32 bytes of the default key, sequence 00..1f
    - klen=64: default key, sequence 00..3f
    
    The unkeyed vectors are ordered before keyed, as this is required by
    testmgr.
    
    CC: Eric Biggers <ebiggers@kernel.org>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit a1afe27492a408d45421a1812064235691303fa1)
    
    Conflicts:
            crypto/testmgr.c
            crypto/testmgr.h
    
    (resolved conflicts due to blake2s having been backported already)
    
    Bug: 178411248
    Change-Id: I5d6e1c16b7be981f4912264cd67dc1dad20b6bec
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/crypto/testmgr.c b/crypto/testmgr.c
index ea3524441176..775afc8c0e50 100644
--- a/crypto/testmgr.c
+++ b/crypto/testmgr.c
@@ -2616,6 +2616,34 @@ static const struct alg_test_desc alg_test_descs[] = {
 		.alg = "authenc(hmac(sha512),rfc3686(ctr(aes)))",
 		.test = alg_test_null,
 		.fips_allowed = 1,
+	}, {
+		.alg = "blake2b-160",
+		.test = alg_test_hash,
+		.fips_allowed = 0,
+		.suite = {
+			.hash = __VECS(blake2b_160_tv_template)
+		}
+	}, {
+		.alg = "blake2b-256",
+		.test = alg_test_hash,
+		.fips_allowed = 0,
+		.suite = {
+			.hash = __VECS(blake2b_256_tv_template)
+		}
+	}, {
+		.alg = "blake2b-384",
+		.test = alg_test_hash,
+		.fips_allowed = 0,
+		.suite = {
+			.hash = __VECS(blake2b_384_tv_template)
+		}
+	}, {
+		.alg = "blake2b-512",
+		.test = alg_test_hash,
+		.fips_allowed = 0,
+		.suite = {
+			.hash = __VECS(blake2b_512_tv_template)
+		}
 	}, {
 		.alg = "blake2s-128",
 		.test = alg_test_hash,
diff --git a/crypto/testmgr.h b/crypto/testmgr.h
index 9466be39f61b..b5bd0716f3d4 100644
--- a/crypto/testmgr.h
+++ b/crypto/testmgr.h
@@ -36566,6 +36566,279 @@ static const char blake2_ordered_sequence[] =
 	"\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
 	"\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff";
 
+static const struct hash_testvec blake2b_160_tv_template[] = {{
+	.digest = (u8[]){ 0x33, 0x45, 0x52, 0x4a, 0xbf, 0x6b, 0xbe, 0x18,
+			  0x09, 0x44, 0x92, 0x24, 0xb5, 0x97, 0x2c, 0x41,
+			  0x79, 0x0b, 0x6c, 0xf2, },
+}, {
+	.plaintext = blake2_ordered_sequence,
+	.psize = 64,
+	.digest = (u8[]){ 0x11, 0xcc, 0x66, 0x61, 0xe9, 0x22, 0xb0, 0xe4,
+			  0x07, 0xe0, 0xa5, 0x72, 0x49, 0xc3, 0x8d, 0x4f,
+			  0xf7, 0x6d, 0x8e, 0xc8, },
+}, {
+	.ksize = 32,
+	.key = blake2_ordered_sequence,
+	.plaintext = blake2_ordered_sequence,
+	.psize = 1,
+	.digest = (u8[]){ 0x31, 0xe3, 0xd9, 0xd5, 0x4e, 0x72, 0xd8, 0x0b,
+			  0x2b, 0x3b, 0xd7, 0x6b, 0x82, 0x7a, 0x1d, 0xfb,
+			  0x56, 0x2f, 0x79, 0x4c, },
+}, {
+	.ksize = 64,
+	.key = blake2_ordered_sequence,
+	.plaintext = blake2_ordered_sequence,
+	.psize = 7,
+	.digest = (u8[]){ 0x28, 0x20, 0xd1, 0xbe, 0x7f, 0xcc, 0xc1, 0x62,
+			  0xd9, 0x0d, 0x9a, 0x4b, 0x47, 0xd1, 0x5e, 0x04,
+			  0x74, 0x2a, 0x53, 0x17, },
+}, {
+	.ksize = 1,
+	.key = "B",
+	.plaintext = blake2_ordered_sequence,
+	.psize = 15,
+	.digest = (u8[]){ 0x45, 0xe9, 0x95, 0xb6, 0xc4, 0xe8, 0x22, 0xea,
+			  0xfe, 0xd2, 0x37, 0xdb, 0x46, 0xbf, 0xf1, 0x25,
+			  0xd5, 0x03, 0x1d, 0x81, },
+}, {
+	.ksize = 32,
+	.key = blake2_ordered_sequence,
+	.plaintext = blake2_ordered_sequence,
+	.psize = 247,
+	.digest = (u8[]){ 0x7e, 0xb9, 0xf2, 0x9b, 0x2f, 0xc2, 0x01, 0xd4,
+			  0xb0, 0x4f, 0x08, 0x2b, 0x8e, 0xbd, 0x06, 0xef,
+			  0x1c, 0xc4, 0x25, 0x95, },
+}, {
+	.ksize = 64,
+	.key = blake2_ordered_sequence,
+	.plaintext = blake2_ordered_sequence,
+	.psize = 256,
+	.digest = (u8[]){ 0x6e, 0x35, 0x01, 0x70, 0xbf, 0xb6, 0xc4, 0xba,
+			  0x33, 0x1b, 0xa6, 0xd3, 0xc2, 0x5d, 0xb4, 0x03,
+			  0x95, 0xaf, 0x29, 0x16, },
+}};
+
+static const struct hash_testvec blake2b_256_tv_template[] = {{
+	.plaintext = blake2_ordered_sequence,
+	.psize = 7,
+	.digest = (u8[]){ 0x9d, 0xf1, 0x4b, 0x72, 0x48, 0x76, 0x4a, 0x86,
+			  0x91, 0x97, 0xc3, 0x5e, 0x39, 0x2d, 0x2a, 0x6d,
+			  0x6f, 0xdc, 0x5b, 0x79, 0xd5, 0x97, 0x29, 0x79,
+			  0x20, 0xfd, 0x3f, 0x14, 0x91, 0xb4, 0x42, 0xd2, },
+}, {
+	.plaintext = blake2_ordered_sequence,
+	.psize = 256,
+	.digest = (u8[]){ 0x39, 0xa7, 0xeb, 0x9f, 0xed, 0xc1, 0x9a, 0xab,
+			  0xc8, 0x34, 0x25, 0xc6, 0x75, 0x5d, 0xd9, 0x0e,
+			  0x6f, 0x9d, 0x0c, 0x80, 0x49, 0x64, 0xa1, 0xf4,
+			  0xaa, 0xee, 0xa3, 0xb9, 0xfb, 0x59, 0x98, 0x35, },
+}, {
+	.ksize = 1,
+	.key = "B",
+	.digest = (u8[]){ 0xc3, 0x08, 0xb1, 0xbf, 0xe4, 0xf9, 0xbc, 0xb4,
+			  0x75, 0xaf, 0x3f, 0x59, 0x6e, 0xae, 0xde, 0x6a,
+			  0xa3, 0x8e, 0xb5, 0x94, 0xad, 0x30, 0xf0, 0x17,
+			  0x1c, 0xfb, 0xd8, 0x3e, 0x8a, 0xbe, 0xed, 0x9c, },
+}, {
+	.ksize = 64,
+	.key = blake2_ordered_sequence,
+	.plaintext = blake2_ordered_sequence,
+	.psize = 1,
+	.digest = (u8[]){ 0x34, 0x75, 0x8b, 0x64, 0x71, 0x35, 0x62, 0x82,
+			  0x97, 0xfb, 0x09, 0xc7, 0x93, 0x0c, 0xd0, 0x4e,
+			  0x95, 0x28, 0xe5, 0x66, 0x91, 0x12, 0xf5, 0xb1,
+			  0x31, 0x84, 0x93, 0xe1, 0x4d, 0xe7, 0x7e, 0x55, },
+}, {
+	.ksize = 32,
+	.key = blake2_ordered_sequence,
+	.plaintext = blake2_ordered_sequence,
+	.psize = 15,
+	.digest = (u8[]){ 0xce, 0x74, 0xa9, 0x2e, 0xe9, 0x40, 0x3d, 0xa2,
+			  0x11, 0x4a, 0x99, 0x25, 0x7a, 0x34, 0x5d, 0x35,
+			  0xdf, 0x6a, 0x48, 0x79, 0x2a, 0x93, 0x93, 0xff,
+			  0x1f, 0x3c, 0x39, 0xd0, 0x71, 0x1f, 0x20, 0x7b, },
+}, {
+	.ksize = 1,
+	.key = "B",
+	.plaintext = blake2_ordered_sequence,
+	.psize = 64,
+	.digest = (u8[]){ 0x2e, 0x84, 0xdb, 0xa2, 0x5f, 0x0e, 0xe9, 0x52,
+			  0x79, 0x50, 0x69, 0x9f, 0xf1, 0xfd, 0xfc, 0x9d,
+			  0x89, 0x83, 0xa9, 0xb6, 0xa4, 0xd5, 0xfa, 0xb5,
+			  0xbe, 0x35, 0x1a, 0x17, 0x8a, 0x2c, 0x7f, 0x7d, },
+}, {
+	.ksize = 64,
+	.key = blake2_ordered_sequence,
+	.plaintext = blake2_ordered_sequence,
+	.psize = 247,
+	.digest = (u8[]){ 0x2e, 0x26, 0xf0, 0x09, 0x02, 0x65, 0x90, 0x09,
+			  0xcc, 0xf5, 0x4c, 0x44, 0x74, 0x0e, 0xa0, 0xa8,
+			  0x25, 0x4a, 0xda, 0x61, 0x56, 0x95, 0x7d, 0x3f,
+			  0x6d, 0xc0, 0x43, 0x17, 0x95, 0x89, 0xcd, 0x9d, },
+}};
+
+static const struct hash_testvec blake2b_384_tv_template[] = {{
+	.plaintext = blake2_ordered_sequence,
+	.psize = 1,
+	.digest = (u8[]){ 0xcc, 0x01, 0x08, 0x85, 0x36, 0xf7, 0x84, 0xf0,
+			  0xbb, 0x76, 0x9e, 0x41, 0xc4, 0x95, 0x7b, 0x6d,
+			  0x0c, 0xde, 0x1f, 0xcc, 0x8c, 0xf1, 0xd9, 0x1f,
+			  0xc4, 0x77, 0xd4, 0xdd, 0x6e, 0x3f, 0xbf, 0xcd,
+			  0x43, 0xd1, 0x69, 0x8d, 0x14, 0x6f, 0x34, 0x8b,
+			  0x2c, 0x36, 0xa3, 0x39, 0x68, 0x2b, 0xec, 0x3f, },
+}, {
+	.plaintext = blake2_ordered_sequence,
+	.psize = 247,
+	.digest = (u8[]){ 0xc8, 0xf8, 0xf0, 0xa2, 0x69, 0xfa, 0xcc, 0x4d,
+			  0x32, 0x5f, 0x13, 0x88, 0xca, 0x71, 0x99, 0x8f,
+			  0xf7, 0x30, 0x41, 0x5d, 0x6e, 0x34, 0xb7, 0x6e,
+			  0x3e, 0xd0, 0x46, 0xb6, 0xca, 0x30, 0x66, 0xb2,
+			  0x6f, 0x0c, 0x35, 0x54, 0x17, 0xcd, 0x26, 0x1b,
+			  0xef, 0x48, 0x98, 0xe0, 0x56, 0x7c, 0x05, 0xd2, },
+}, {
+	.ksize = 32,
+	.key = blake2_ordered_sequence,
+	.digest = (u8[]){ 0x15, 0x09, 0x7a, 0x90, 0x13, 0x23, 0xab, 0x0c,
+			  0x0b, 0x43, 0x21, 0x9a, 0xb5, 0xc6, 0x0c, 0x2e,
+			  0x7c, 0x57, 0xfc, 0xcc, 0x4b, 0x0f, 0xf0, 0x57,
+			  0xb7, 0x9c, 0xe7, 0x0f, 0xe1, 0x57, 0xac, 0x37,
+			  0x77, 0xd4, 0xf4, 0x2f, 0x03, 0x3b, 0x64, 0x09,
+			  0x84, 0xa0, 0xb3, 0x24, 0xb7, 0xae, 0x47, 0x5e, },
+}, {
+	.ksize = 1,
+	.key = "B",
+	.plaintext = blake2_ordered_sequence,
+	.psize = 7,
+	.digest = (u8[]){ 0x0b, 0x82, 0x88, 0xca, 0x05, 0x2f, 0x1b, 0x15,
+			  0xdc, 0xbb, 0x22, 0x27, 0x11, 0x6b, 0xf4, 0xd1,
+			  0xe9, 0x8f, 0x1b, 0x0b, 0x58, 0x3f, 0x5e, 0x86,
+			  0x80, 0x82, 0x6f, 0x8e, 0x54, 0xc1, 0x9f, 0x12,
+			  0xcf, 0xe9, 0x56, 0xc1, 0xfc, 0x1a, 0x08, 0xb9,
+			  0x4a, 0x57, 0x0a, 0x76, 0x3c, 0x15, 0x33, 0x18, },
+}, {
+	.ksize = 64,
+	.key = blake2_ordered_sequence,
+	.plaintext = blake2_ordered_sequence,
+	.psize = 15,
+	.digest = (u8[]){ 0x4a, 0x81, 0x55, 0xb9, 0x79, 0x42, 0x8c, 0xc6,
+			  0x4f, 0xfe, 0xca, 0x82, 0x3b, 0xb2, 0xf7, 0xbc,
+			  0x5e, 0xfc, 0xab, 0x09, 0x1c, 0xd6, 0x3b, 0xe1,
+			  0x50, 0x82, 0x3b, 0xde, 0xc7, 0x06, 0xee, 0x3b,
+			  0x29, 0xce, 0xe5, 0x68, 0xe0, 0xff, 0xfa, 0xe1,
+			  0x7a, 0xf1, 0xc0, 0xfe, 0x57, 0xf4, 0x60, 0x49, },
+}, {
+	.ksize = 32,
+	.key = blake2_ordered_sequence,
+	.plaintext = blake2_ordered_sequence,
+	.psize = 64,
+	.digest = (u8[]){ 0x34, 0xbd, 0xe1, 0x99, 0x43, 0x9f, 0x82, 0x72,
+			  0xe7, 0xed, 0x94, 0x9e, 0xe1, 0x84, 0xee, 0x82,
+			  0xfd, 0x26, 0x23, 0xc4, 0x17, 0x8d, 0xf5, 0x04,
+			  0xeb, 0xb7, 0xbc, 0xb8, 0xf3, 0x68, 0xb7, 0xad,
+			  0x94, 0x8e, 0x05, 0x3f, 0x8a, 0x5d, 0x8d, 0x81,
+			  0x3e, 0x88, 0xa7, 0x8c, 0xa2, 0xd5, 0xdc, 0x76, },
+}, {
+	.ksize = 1,
+	.key = "B",
+	.plaintext = blake2_ordered_sequence,
+	.psize = 256,
+	.digest = (u8[]){ 0x22, 0x14, 0xf4, 0xb0, 0x4c, 0xa8, 0xb5, 0x7d,
+			  0xa7, 0x5c, 0x04, 0xeb, 0xd8, 0x8d, 0x04, 0x71,
+			  0xc7, 0x3c, 0xc7, 0x6e, 0x8b, 0x20, 0x36, 0x40,
+			  0x9d, 0xd0, 0x60, 0xc6, 0xe3, 0x0b, 0x6e, 0x50,
+			  0xf5, 0xaf, 0xf5, 0xc6, 0x3b, 0xe3, 0x84, 0x6a,
+			  0x93, 0x1b, 0x12, 0xd6, 0x18, 0x27, 0xba, 0x36, },
+}};
+
+static const struct hash_testvec blake2b_512_tv_template[] = {{
+	.plaintext = blake2_ordered_sequence,
+	.psize = 15,
+	.digest = (u8[]){ 0x44, 0x4b, 0x24, 0x0f, 0xe3, 0xed, 0x86, 0xd0,
+			  0xe2, 0xef, 0x4c, 0xe7, 0xd8, 0x51, 0xed, 0xde,
+			  0x22, 0x15, 0x55, 0x82, 0xaa, 0x09, 0x14, 0x79,
+			  0x7b, 0x72, 0x6c, 0xd0, 0x58, 0xb6, 0xf4, 0x59,
+			  0x32, 0xe0, 0xe1, 0x29, 0x51, 0x68, 0x76, 0x52,
+			  0x7b, 0x1d, 0xd8, 0x8f, 0xc6, 0x6d, 0x71, 0x19,
+			  0xf4, 0xab, 0x3b, 0xed, 0x93, 0xa6, 0x1a, 0x0e,
+			  0x2d, 0x2d, 0x2a, 0xea, 0xc3, 0x36, 0xd9, 0x58, },
+}, {
+	.ksize = 64,
+	.key = blake2_ordered_sequence,
+	.digest = (u8[]){ 0x10, 0xeb, 0xb6, 0x77, 0x00, 0xb1, 0x86, 0x8e,
+			  0xfb, 0x44, 0x17, 0x98, 0x7a, 0xcf, 0x46, 0x90,
+			  0xae, 0x9d, 0x97, 0x2f, 0xb7, 0xa5, 0x90, 0xc2,
+			  0xf0, 0x28, 0x71, 0x79, 0x9a, 0xaa, 0x47, 0x86,
+			  0xb5, 0xe9, 0x96, 0xe8, 0xf0, 0xf4, 0xeb, 0x98,
+			  0x1f, 0xc2, 0x14, 0xb0, 0x05, 0xf4, 0x2d, 0x2f,
+			  0xf4, 0x23, 0x34, 0x99, 0x39, 0x16, 0x53, 0xdf,
+			  0x7a, 0xef, 0xcb, 0xc1, 0x3f, 0xc5, 0x15, 0x68, },
+}, {
+	.ksize = 1,
+	.key = "B",
+	.plaintext = blake2_ordered_sequence,
+	.psize = 1,
+	.digest = (u8[]){ 0xd2, 0x11, 0x31, 0x29, 0x3f, 0xea, 0xca, 0x72,
+			  0x21, 0xe4, 0x06, 0x65, 0x05, 0x2a, 0xd1, 0x02,
+			  0xc0, 0x8d, 0x7b, 0xf1, 0x09, 0x3c, 0xef, 0x88,
+			  0xe1, 0x68, 0x0c, 0xf1, 0x3b, 0xa4, 0xe3, 0x03,
+			  0xed, 0xa0, 0xe3, 0x60, 0x58, 0xa0, 0xdb, 0x52,
+			  0x8a, 0x66, 0x43, 0x09, 0x60, 0x1a, 0xbb, 0x67,
+			  0xc5, 0x84, 0x31, 0x40, 0xfa, 0xde, 0xc1, 0xd0,
+			  0xff, 0x3f, 0x4a, 0x69, 0xd9, 0x92, 0x26, 0x86, },
+}, {
+	.ksize = 32,
+	.key = blake2_ordered_sequence,
+	.plaintext = blake2_ordered_sequence,
+	.psize = 7,
+	.digest = (u8[]){ 0xa3, 0x3e, 0x50, 0xbc, 0xfb, 0xd9, 0xf0, 0x82,
+			  0xa6, 0xd1, 0xdf, 0xaf, 0x82, 0xd0, 0xcf, 0x84,
+			  0x9a, 0x25, 0x3c, 0xae, 0x6d, 0xb5, 0xaf, 0x01,
+			  0xd7, 0xaf, 0xed, 0x50, 0xdc, 0xe2, 0xba, 0xcc,
+			  0x8c, 0x38, 0xf5, 0x16, 0x89, 0x38, 0x86, 0xce,
+			  0x68, 0x10, 0x63, 0x64, 0xa5, 0x79, 0x53, 0xb5,
+			  0x2e, 0x8e, 0xbc, 0x0a, 0xce, 0x95, 0xc0, 0x1e,
+			  0x69, 0x59, 0x1d, 0x3b, 0xd8, 0x19, 0x90, 0xd7, },
+}, {
+	.ksize = 64,
+	.key = blake2_ordered_sequence,
+	.plaintext = blake2_ordered_sequence,
+	.psize = 64,
+	.digest = (u8[]){ 0x65, 0x67, 0x6d, 0x80, 0x06, 0x17, 0x97, 0x2f,
+			  0xbd, 0x87, 0xe4, 0xb9, 0x51, 0x4e, 0x1c, 0x67,
+			  0x40, 0x2b, 0x7a, 0x33, 0x10, 0x96, 0xd3, 0xbf,
+			  0xac, 0x22, 0xf1, 0xab, 0xb9, 0x53, 0x74, 0xab,
+			  0xc9, 0x42, 0xf1, 0x6e, 0x9a, 0xb0, 0xea, 0xd3,
+			  0x3b, 0x87, 0xc9, 0x19, 0x68, 0xa6, 0xe5, 0x09,
+			  0xe1, 0x19, 0xff, 0x07, 0x78, 0x7b, 0x3e, 0xf4,
+			  0x83, 0xe1, 0xdc, 0xdc, 0xcf, 0x6e, 0x30, 0x22, },
+}, {
+	.ksize = 1,
+	.key = "B",
+	.plaintext = blake2_ordered_sequence,
+	.psize = 247,
+	.digest = (u8[]){ 0xc2, 0x96, 0x2c, 0x6b, 0x84, 0xff, 0xee, 0xea,
+			  0x9b, 0xb8, 0x55, 0x2d, 0x6b, 0xa5, 0xd5, 0xe5,
+			  0xbd, 0xb1, 0x54, 0xb6, 0x1e, 0xfb, 0x63, 0x16,
+			  0x6e, 0x22, 0x04, 0xf0, 0x82, 0x7a, 0xc6, 0x99,
+			  0xf7, 0x4c, 0xff, 0x93, 0x71, 0x57, 0x64, 0xd0,
+			  0x08, 0x60, 0x39, 0x98, 0xb8, 0xd2, 0x2b, 0x4e,
+			  0x81, 0x8d, 0xe4, 0x8f, 0xb2, 0x1e, 0x8f, 0x99,
+			  0x98, 0xf1, 0x02, 0x9b, 0x4c, 0x7c, 0x97, 0x1a, },
+}, {
+	.ksize = 32,
+	.key = blake2_ordered_sequence,
+	.plaintext = blake2_ordered_sequence,
+	.psize = 256,
+	.digest = (u8[]){ 0x0f, 0x32, 0x05, 0x09, 0xad, 0x9f, 0x25, 0xf7,
+			  0xf2, 0x00, 0x71, 0xc9, 0x9f, 0x08, 0x58, 0xd1,
+			  0x67, 0xc3, 0xa6, 0x2c, 0x0d, 0xe5, 0x7c, 0x15,
+			  0x35, 0x18, 0x5a, 0x68, 0xc1, 0xca, 0x1c, 0x6e,
+			  0x0f, 0xc4, 0xf6, 0x0c, 0x43, 0xe1, 0xb4, 0x3d,
+			  0x28, 0xe4, 0xc7, 0xa1, 0xcf, 0x6b, 0x17, 0x4e,
+			  0xf1, 0x5b, 0xb5, 0x53, 0xd4, 0xa7, 0xd0, 0x5b,
+			  0xae, 0x15, 0x81, 0x15, 0xd0, 0x88, 0xa0, 0x3c, },
+}};
+
 static const struct hash_testvec blakes2s_128_tv_template[] = {{
 	.digest = (u8[]){ 0x64, 0x55, 0x0d, 0x6f, 0xfe, 0x2c, 0x0a, 0x01,
 			  0xa1, 0x4a, 0xba, 0x1e, 0xad, 0xe0, 0x20, 0x0c, },

commit e4c224108bce80f42b55f000c41841aa2fa8f963
Author: David Sterba <dsterba@suse.com>
Date:   Thu Oct 24 18:28:31 2019 +0200

    BACKPORT: crypto: blake2b - add blake2b generic implementation
    
    The patch brings support of several BLAKE2 variants (2b with various
    digest lengths).  The keyed digest is supported, using tfm->setkey call.
    The in-tree user will be btrfs (for checksumming), we're going to use
    the BLAKE2b-256 variant.
    
    The code is reference implementation taken from the official sources and
    modified in terms of kernel coding style (whitespace, comments, uintXX_t
    -> uXX types, removed unused prototypes and #ifdefs, removed testing
    code, changed secure_zero_memory -> memzero_explicit, used own helpers
    for unaligned reads/writes and rotations).
    
    Further changes removed sanity checks of key length or output size,
    these values are verified in the crypto API callbacks or hardcoded in
    shash_alg and not exposed to users.
    
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    
    (cherry picked from commit 91d689337fe8b7703608a2ec39aae700b99f3933)
    
    Conflicts:
            crypto/Kconfig
            crypto/Makefile
    
    (trivial conflicts due to blake2s having been backported already)
    
    Bug: 178411248
    Change-Id: Ic4c2314b146434a5842facf56e58d3602bacc7d5
    Signed-off-by: Eric Biggers <ebiggers@google.com>

diff --git a/crypto/Kconfig b/crypto/Kconfig
index 3ebf3e1472a1..37d19197e054 100644
--- a/crypto/Kconfig
+++ b/crypto/Kconfig
@@ -672,6 +672,23 @@ config CRYPTO_BLAKE2S_X86
 	select CRYPTO_LIB_BLAKE2S_GENERIC
 	select CRYPTO_ARCH_HAVE_LIB_BLAKE2S
 
+config CRYPTO_BLAKE2B
+	tristate "BLAKE2b digest algorithm"
+	select CRYPTO_HASH
+	help
+	  Implementation of cryptographic hash function BLAKE2b (or just BLAKE2),
+	  optimized for 64bit platforms and can produce digests of any size
+	  between 1 to 64.  The keyed hash is also implemented.
+
+	  This module provides the following algorithms:
+
+	  - blake2b-160
+	  - blake2b-256
+	  - blake2b-384
+	  - blake2b-512
+
+	  See https://blake2.net for further information.
+
 config CRYPTO_CRCT10DIF
 	tristate "CRCT10DIF algorithm"
 	select CRYPTO_HASH
diff --git a/crypto/Makefile b/crypto/Makefile
index 00e0bc20e508..0d1681ad3f36 100644
--- a/crypto/Makefile
+++ b/crypto/Makefile
@@ -74,6 +74,7 @@ obj-$(CONFIG_CRYPTO_WP512) += wp512.o
 CFLAGS_wp512.o := $(call cc-option,-fno-schedule-insns)  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79149
 obj-$(CONFIG_CRYPTO_TGR192) += tgr192.o
 obj-$(CONFIG_CRYPTO_BLAKE2S) += blake2s_generic.o
+obj-$(CONFIG_CRYPTO_BLAKE2B) += blake2b_generic.o
 obj-$(CONFIG_CRYPTO_GF128MUL) += gf128mul.o
 obj-$(CONFIG_CRYPTO_ECB) += ecb.o
 obj-$(CONFIG_CRYPTO_CBC) += cbc.o
diff --git a/crypto/blake2b_generic.c b/crypto/blake2b_generic.c
new file mode 100644
index 000000000000..8dab65612a41
--- /dev/null
+++ b/crypto/blake2b_generic.c
@@ -0,0 +1,435 @@
+// SPDX-License-Identifier: (GPL-2.0-only OR Apache-2.0)
+/*
+ * BLAKE2b reference source code package - reference C implementations
+ *
+ * Copyright 2012, Samuel Neves <sneves@dei.uc.pt>.  You may use this under the
+ * terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at
+ * your option.  The terms of these licenses can be found at:
+ *
+ * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
+ * - OpenSSL license   : https://www.openssl.org/source/license.html
+ * - Apache 2.0        : http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * More information about the BLAKE2 hash function can be found at
+ * https://blake2.net.
+ *
+ * Note: the original sources have been modified for inclusion in linux kernel
+ * in terms of coding style, using generic helpers and simplifications of error
+ * handling.
+ */
+
+#include <asm/unaligned.h>
+#include <linux/module.h>
+#include <linux/string.h>
+#include <linux/kernel.h>
+#include <linux/bitops.h>
+#include <crypto/internal/hash.h>
+
+#define BLAKE2B_160_DIGEST_SIZE		(160 / 8)
+#define BLAKE2B_256_DIGEST_SIZE		(256 / 8)
+#define BLAKE2B_384_DIGEST_SIZE		(384 / 8)
+#define BLAKE2B_512_DIGEST_SIZE		(512 / 8)
+
+enum blake2b_constant {
+	BLAKE2B_BLOCKBYTES    = 128,
+	BLAKE2B_OUTBYTES      = 64,
+	BLAKE2B_KEYBYTES      = 64,
+	BLAKE2B_SALTBYTES     = 16,
+	BLAKE2B_PERSONALBYTES = 16
+};
+
+struct blake2b_state {
+	u64      h[8];
+	u64      t[2];
+	u64      f[2];
+	u8       buf[BLAKE2B_BLOCKBYTES];
+	size_t   buflen;
+	size_t   outlen;
+	u8       last_node;
+};
+
+struct blake2b_param {
+	u8 digest_length;			/* 1 */
+	u8 key_length;				/* 2 */
+	u8 fanout;				/* 3 */
+	u8 depth;				/* 4 */
+	__le32 leaf_length;			/* 8 */
+	__le32 node_offset;			/* 12 */
+	__le32 xof_length;			/* 16 */
+	u8 node_depth;				/* 17 */
+	u8 inner_length;			/* 18 */
+	u8 reserved[14];			/* 32 */
+	u8 salt[BLAKE2B_SALTBYTES];		/* 48 */
+	u8 personal[BLAKE2B_PERSONALBYTES];	/* 64 */
+} __packed;
+
+static const u64 blake2b_IV[8] = {
+	0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL,
+	0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL,
+	0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL,
+	0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL
+};
+
+static const u8 blake2b_sigma[12][16] = {
+	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15 },
+	{ 14, 10,  4,  8,  9, 15, 13,  6,  1, 12,  0,  2, 11,  7,  5,  3 },
+	{ 11,  8, 12,  0,  5,  2, 15, 13, 10, 14,  3,  6,  7,  1,  9,  4 },
+	{  7,  9,  3,  1, 13, 12, 11, 14,  2,  6,  5, 10,  4,  0, 15,  8 },
+	{  9,  0,  5,  7,  2,  4, 10, 15, 14,  1, 11, 12,  6,  8,  3, 13 },
+	{  2, 12,  6, 10,  0, 11,  8,  3,  4, 13,  7,  5, 15, 14,  1,  9 },
+	{ 12,  5,  1, 15, 14, 13,  4, 10,  0,  7,  6,  3,  9,  2,  8, 11 },
+	{ 13, 11,  7, 14, 12,  1,  3,  9,  5,  0, 15,  4,  8,  6,  2, 10 },
+	{  6, 15, 14,  9, 11,  3,  0,  8, 12,  2, 13,  7,  1,  4, 10,  5 },
+	{ 10,  2,  8,  4,  7,  6,  1,  5, 15, 11,  9, 14,  3, 12, 13,  0 },
+	{  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15 },
+	{ 14, 10,  4,  8,  9, 15, 13,  6,  1, 12,  0,  2, 11,  7,  5,  3 }
+};
+
+static void blake2b_update(struct blake2b_state *S, const void *pin, size_t inlen);
+
+static void blake2b_set_lastnode(struct blake2b_state *S)
+{
+	S->f[1] = (u64)-1;
+}
+
+static void blake2b_set_lastblock(struct blake2b_state *S)
+{
+	if (S->last_node)
+		blake2b_set_lastnode(S);
+
+	S->f[0] = (u64)-1;
+}
+
+static void blake2b_increment_counter(struct blake2b_state *S, const u64 inc)
+{
+	S->t[0] += inc;
+	S->t[1] += (S->t[0] < inc);
+}
+
+static void blake2b_init0(struct blake2b_state *S)
+{
+	size_t i;
+
+	memset(S, 0, sizeof(struct blake2b_state));
+
+	for (i = 0; i < 8; ++i)
+		S->h[i] = blake2b_IV[i];
+}
+
+/* init xors IV with input parameter block */
+static void blake2b_init_param(struct blake2b_state *S,
+			       const struct blake2b_param *P)
+{
+	const u8 *p = (const u8 *)(P);
+	size_t i;
+
+	blake2b_init0(S);
+
+	/* IV XOR ParamBlock */
+	for (i = 0; i < 8; ++i)
+		S->h[i] ^= get_unaligned_le64(p + sizeof(S->h[i]) * i);
+
+	S->outlen = P->digest_length;
+}
+
+static void blake2b_init(struct blake2b_state *S, size_t outlen)
+{
+	struct blake2b_param P;
+
+	P.digest_length = (u8)outlen;
+	P.key_length    = 0;
+	P.fanout        = 1;
+	P.depth         = 1;
+	P.leaf_length   = 0;
+	P.node_offset   = 0;
+	P.xof_length    = 0;
+	P.node_depth    = 0;
+	P.inner_length  = 0;
+	memset(P.reserved, 0, sizeof(P.reserved));
+	memset(P.salt,     0, sizeof(P.salt));
+	memset(P.personal, 0, sizeof(P.personal));
+	blake2b_init_param(S, &P);
+}
+
+static void blake2b_init_key(struct blake2b_state *S, size_t outlen,
+			     const void *key, size_t keylen)
+{
+	struct blake2b_param P;
+
+	P.digest_length = (u8)outlen;
+	P.key_length    = (u8)keylen;
+	P.fanout        = 1;
+	P.depth         = 1;
+	P.leaf_length   = 0;
+	P.node_offset   = 0;
+	P.xof_length    = 0;
+	P.node_depth    = 0;
+	P.inner_length  = 0;
+	memset(P.reserved, 0, sizeof(P.reserved));
+	memset(P.salt,     0, sizeof(P.salt));
+	memset(P.personal, 0, sizeof(P.personal));
+
+	blake2b_init_param(S, &P);
+
+	{
+		u8 block[BLAKE2B_BLOCKBYTES];
+
+		memset(block, 0, BLAKE2B_BLOCKBYTES);
+		memcpy(block, key, keylen);
+		blake2b_update(S, block, BLAKE2B_BLOCKBYTES);
+		memzero_explicit(block, BLAKE2B_BLOCKBYTES);
+	}
+}
+
+#define G(r,i,a,b,c,d)                                  \
+	do {                                            \
+		a = a + b + m[blake2b_sigma[r][2*i+0]]; \
+		d = ror64(d ^ a, 32);                   \
+		c = c + d;                              \
+		b = ror64(b ^ c, 24);                   \
+		a = a + b + m[blake2b_sigma[r][2*i+1]]; \
+		d = ror64(d ^ a, 16);                   \
+		c = c + d;                              \
+		b = ror64(b ^ c, 63);                   \
+	} while (0)
+
+#define ROUND(r)                                \
+	do {                                    \
+		G(r,0,v[ 0],v[ 4],v[ 8],v[12]); \
+		G(r,1,v[ 1],v[ 5],v[ 9],v[13]); \
+		G(r,2,v[ 2],v[ 6],v[10],v[14]); \
+		G(r,3,v[ 3],v[ 7],v[11],v[15]); \
+		G(r,4,v[ 0],v[ 5],v[10],v[15]); \
+		G(r,5,v[ 1],v[ 6],v[11],v[12]); \
+		G(r,6,v[ 2],v[ 7],v[ 8],v[13]); \
+		G(r,7,v[ 3],v[ 4],v[ 9],v[14]); \
+	} while (0)
+
+static void blake2b_compress(struct blake2b_state *S,
+			     const u8 block[BLAKE2B_BLOCKBYTES])
+{
+	u64 m[16];
+	u64 v[16];
+	size_t i;
+
+	for (i = 0; i < 16; ++i)
+		m[i] = get_unaligned_le64(block + i * sizeof(m[i]));
+
+	for (i = 0; i < 8; ++i)
+		v[i] = S->h[i];
+
+	v[ 8] = blake2b_IV[0];
+	v[ 9] = blake2b_IV[1];
+	v[10] = blake2b_IV[2];
+	v[11] = blake2b_IV[3];
+	v[12] = blake2b_IV[4] ^ S->t[0];
+	v[13] = blake2b_IV[5] ^ S->t[1];
+	v[14] = blake2b_IV[6] ^ S->f[0];
+	v[15] = blake2b_IV[7] ^ S->f[1];
+
+	ROUND(0);
+	ROUND(1);
+	ROUND(2);
+	ROUND(3);
+	ROUND(4);
+	ROUND(5);
+	ROUND(6);
+	ROUND(7);
+	ROUND(8);
+	ROUND(9);
+	ROUND(10);
+	ROUND(11);
+
+	for (i = 0; i < 8; ++i)
+		S->h[i] = S->h[i] ^ v[i] ^ v[i + 8];
+}
+
+#undef G
+#undef ROUND
+
+static void blake2b_update(struct blake2b_state *S, const void *pin, size_t inlen)
+{
+	const u8 *in = (const u8 *)pin;
+
+	if (inlen > 0) {
+		size_t left = S->buflen;
+		size_t fill = BLAKE2B_BLOCKBYTES - left;
+
+		if (inlen > fill) {
+			S->buflen = 0;
+			/* Fill buffer */
+			memcpy(S->buf + left, in, fill);
+			blake2b_increment_counter(S, BLAKE2B_BLOCKBYTES);
+			/* Compress */
+			blake2b_compress(S, S->buf);
+			in += fill;
+			inlen -= fill;
+			while (inlen > BLAKE2B_BLOCKBYTES) {
+				blake2b_increment_counter(S, BLAKE2B_BLOCKBYTES);
+				blake2b_compress(S, in);
+				in += BLAKE2B_BLOCKBYTES;
+				inlen -= BLAKE2B_BLOCKBYTES;
+			}
+		}
+		memcpy(S->buf + S->buflen, in, inlen);
+		S->buflen += inlen;
+	}
+}
+
+static void blake2b_final(struct blake2b_state *S, void *out, size_t outlen)
+{
+	u8 buffer[BLAKE2B_OUTBYTES] = {0};
+	size_t i;
+
+	blake2b_increment_counter(S, S->buflen);
+	blake2b_set_lastblock(S);
+	/* Padding */
+	memset(S->buf + S->buflen, 0, BLAKE2B_BLOCKBYTES - S->buflen);
+	blake2b_compress(S, S->buf);
+
+	/* Output full hash to temp buffer */
+	for (i = 0; i < 8; ++i)
+		put_unaligned_le64(S->h[i], buffer + sizeof(S->h[i]) * i);
+
+	memcpy(out, buffer, S->outlen);
+	memzero_explicit(buffer, sizeof(buffer));
+}
+
+struct digest_tfm_ctx {
+	u8 key[BLAKE2B_KEYBYTES];
+	unsigned int keylen;
+};
+
+static int digest_setkey(struct crypto_shash *tfm, const u8 *key,
+			 unsigned int keylen)
+{
+	struct digest_tfm_ctx *mctx = crypto_shash_ctx(tfm);
+
+	if (keylen == 0 || keylen > BLAKE2B_KEYBYTES) {
+		crypto_shash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN);
+		return -EINVAL;
+	}
+
+	memcpy(mctx->key, key, keylen);
+	mctx->keylen = keylen;
+
+	return 0;
+}
+
+static int digest_init(struct shash_desc *desc)
+{
+	struct digest_tfm_ctx *mctx = crypto_shash_ctx(desc->tfm);
+	struct blake2b_state *state = shash_desc_ctx(desc);
+	const int digestsize = crypto_shash_digestsize(desc->tfm);
+
+	if (mctx->keylen == 0)
+		blake2b_init(state, digestsize);
+	else
+		blake2b_init_key(state, digestsize, mctx->key, mctx->keylen);
+	return 0;
+}
+
+static int digest_update(struct shash_desc *desc, const u8 *data,
+			 unsigned int length)
+{
+	struct blake2b_state *state = shash_desc_ctx(desc);
+
+	blake2b_update(state, data, length);
+	return 0;
+}
+
+static int digest_final(struct shash_desc *desc, u8 *out)
+{
+	struct blake2b_state *state = shash_desc_ctx(desc);
+	const int digestsize = crypto_shash_digestsize(desc->tfm);
+
+	blake2b_final(state, out, digestsize);
+	return 0;
+}
+
+static struct shash_alg blake2b_algs[] = {
+	{
+		.base.cra_name		= "blake2b-160",
+		.base.cra_driver_name	= "blake2b-160-generic",
+		.base.cra_priority	= 100,
+		.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,
+		.base.cra_blocksize	= BLAKE2B_BLOCKBYTES,
+		.base.cra_ctxsize	= sizeof(struct digest_tfm_ctx),
+		.base.cra_module	= THIS_MODULE,
+		.digestsize		= BLAKE2B_160_DIGEST_SIZE,
+		.setkey			= digest_setkey,
+		.init			= digest_init,
+		.update			= digest_update,
+		.final			= digest_final,
+		.descsize		= sizeof(struct blake2b_state),
+	}, {
+		.base.cra_name		= "blake2b-256",
+		.base.cra_driver_name	= "blake2b-256-generic",
+		.base.cra_priority	= 100,
+		.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,
+		.base.cra_blocksize	= BLAKE2B_BLOCKBYTES,
+		.base.cra_ctxsize	= sizeof(struct digest_tfm_ctx),
+		.base.cra_module	= THIS_MODULE,
+		.digestsize		= BLAKE2B_256_DIGEST_SIZE,
+		.setkey			= digest_setkey,
+		.init			= digest_init,
+		.update			= digest_update,
+		.final			= digest_final,
+		.descsize		= sizeof(struct blake2b_state),
+	}, {
+		.base.cra_name		= "blake2b-384",
+		.base.cra_driver_name	= "blake2b-384-generic",
+		.base.cra_priority	= 100,
+		.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,
+		.base.cra_blocksize	= BLAKE2B_BLOCKBYTES,
+		.base.cra_ctxsize	= sizeof(struct digest_tfm_ctx),
+		.base.cra_module	= THIS_MODULE,
+		.digestsize		= BLAKE2B_384_DIGEST_SIZE,
+		.setkey			= digest_setkey,
+		.init			= digest_init,
+		.update			= digest_update,
+		.final			= digest_final,
+		.descsize		= sizeof(struct blake2b_state),
+	}, {
+		.base.cra_name		= "blake2b-512",
+		.base.cra_driver_name	= "blake2b-512-generic",
+		.base.cra_priority	= 100,
+		.base.cra_flags		= CRYPTO_ALG_OPTIONAL_KEY,
+		.base.cra_blocksize	= BLAKE2B_BLOCKBYTES,
+		.base.cra_ctxsize	= sizeof(struct digest_tfm_ctx),
+		.base.cra_module	= THIS_MODULE,
+		.digestsize		= BLAKE2B_512_DIGEST_SIZE,
+		.setkey			= digest_setkey,
+		.init			= digest_init,
+		.update			= digest_update,
+		.final			= digest_final,
+		.descsize		= sizeof(struct blake2b_state),
+	}
+};
+
+static int __init blake2b_mod_init(void)
+{
+	BUILD_BUG_ON(sizeof(struct blake2b_param) != BLAKE2B_OUTBYTES);
+
+	return crypto_register_shashes(blake2b_algs, ARRAY_SIZE(blake2b_algs));
+}
+
+static void __exit blake2b_mod_fini(void)
+{
+	crypto_unregister_shashes(blake2b_algs, ARRAY_SIZE(blake2b_algs));
+}
+
+subsys_initcall(blake2b_mod_init);
+module_exit(blake2b_mod_fini);
+
+MODULE_AUTHOR("David Sterba <kdave@kernel.org>");
+MODULE_DESCRIPTION("BLAKE2b generic implementation");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS_CRYPTO("blake2b-160");
+MODULE_ALIAS_CRYPTO("blake2b-160-generic");
+MODULE_ALIAS_CRYPTO("blake2b-256");
+MODULE_ALIAS_CRYPTO("blake2b-256-generic");
+MODULE_ALIAS_CRYPTO("blake2b-384");
+MODULE_ALIAS_CRYPTO("blake2b-384-generic");
+MODULE_ALIAS_CRYPTO("blake2b-512");
+MODULE_ALIAS_CRYPTO("blake2b-512-generic");

commit 2d50781c0198d085ffc32e7339f385836ec5efa2
Author: Wyon Bi <bivvy.bi@rock-chips.com>
Date:   Wed Oct 20 11:44:29 2021 +0800

    clk/rockchip/regmap: rk618: Bypass PLL by default
    
    Fixes: 962d0024000d ("clk/rockchip/regmap: Prepare RK628 PLL support")
    Change-Id: I9d76d96f0aa73e97f8ab9ce47f5ac28f22608342
    Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>

diff --git a/drivers/clk/rockchip/regmap/clk-rk618.c b/drivers/clk/rockchip/regmap/clk-rk618.c
index c780f502b354..45cfc1aae886 100644
--- a/drivers/clk/rockchip/regmap/clk-rk618.c
+++ b/drivers/clk/rockchip/regmap/clk-rk618.c
@@ -370,6 +370,9 @@ static int rk618_cru_probe(struct platform_device *pdev)
 		strlcpy(lcdc1_dclkp_name, parent_name,
 			sizeof(lcdc1_dclkp_name));
 
+	regmap_write(cru->regmap, RK618_CRU_PLL0_CON0, 0x80008000);
+	regmap_write(cru->regmap, RK618_CRU_PLL1_CON0, 0x80008000);
+
 	rk618_clk_register_plls(cru);
 	rk618_clk_register_muxes(cru);
 	rk618_clk_register_dividers(cru);

commit 8965ce1d7327d6234eb29eb56c1634932299b3b0
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Wed Oct 13 18:45:25 2021 +0800

    media: rockchip: isp: dmatx default config with mipi sensor input
    
    Change-Id: I51f27921b650d614e552d810995172d4ea17ef08
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/dev.c b/drivers/media/platform/rockchip/isp/dev.c
index b04d65593c38..49daf9454c6e 100644
--- a/drivers/media/platform/rockchip/isp/dev.c
+++ b/drivers/media/platform/rockchip/isp/dev.c
@@ -411,7 +411,7 @@ static int _set_pipeline_default_fmt(struct rkisp_device *dev)
 		rkisp_set_stream_def_fmt(dev, RKISP_STREAM_SP,
 					 width, height, V4L2_PIX_FMT_NV12);
 	if ((dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) &&
-	    dev->active_sensor->mbus.type == V4L2_MBUS_CSI2) {
+	    dev->isp_inp == INP_CSI) {
 		width = dev->active_sensor->fmt[1].format.width;
 		height = dev->active_sensor->fmt[1].format.height;
 		code = dev->active_sensor->fmt[1].format.code;
@@ -431,7 +431,7 @@ static int _set_pipeline_default_fmt(struct rkisp_device *dev)
 			width, height, rkisp_mbus_pixelcode_to_v4l2(code));
 	}
 
-	if (dev->isp_ver == ISP_V20) {
+	if (dev->isp_ver == ISP_V20 && dev->isp_inp == INP_CSI) {
 		width = dev->active_sensor->fmt[2].format.width;
 		height = dev->active_sensor->fmt[2].format.height;
 		code = dev->active_sensor->fmt[2].format.code;

commit ff079d726eb62a88b582bfacc2880aad52ba0a56
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Wed Oct 20 11:23:05 2021 +0200

    Linux 4.19.213
    
    Link: https://lore.kernel.org/r/20211018132326.529486647@linuxfoundation.org
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Link: https://lore.kernel.org/r/20211018143033.725101193@linuxfoundation.org
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Hulk Robot <hulkrobot@huawei.com>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index 484b0665e572..ac86ad939880 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 212
+SUBLEVEL = 213
 EXTRAVERSION =
 NAME = "People's Front"
 

commit 5c872163141a0a40544b479a7c2c3506d8d17cd2
Author: Vegard Nossum <vegard.nossum@oracle.com>
Date:   Mon Oct 11 17:22:49 2021 +0200

    r8152: select CRC32 and CRYPTO/CRYPTO_HASH/CRYPTO_SHA256
    
    commit 9973a43012b6ad1720dbc4d5faf5302c28635b8c upstream.
    
    Fix the following build/link errors by adding a dependency on
    CRYPTO, CRYPTO_HASH, CRYPTO_SHA256 and CRC32:
    
      ld: drivers/net/usb/r8152.o: in function `rtl8152_fw_verify_checksum':
      r8152.c:(.text+0x2b2a): undefined reference to `crypto_alloc_shash'
      ld: r8152.c:(.text+0x2bed): undefined reference to `crypto_shash_digest'
      ld: r8152.c:(.text+0x2c50): undefined reference to `crypto_destroy_tfm'
      ld: drivers/net/usb/r8152.o: in function `_rtl8152_set_rx_mode':
      r8152.c:(.text+0xdcb0): undefined reference to `crc32_le'
    
    Fixes: 9370f2d05a2a1 ("r8152: support request_firmware for RTL8153")
    Fixes: ac718b69301c7 ("net/usb: new driver for RTL8152")
    Signed-off-by: Vegard Nossum <vegard.nossum@oracle.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig
index 418b0904cecb..cc2fd1957765 100644
--- a/drivers/net/usb/Kconfig
+++ b/drivers/net/usb/Kconfig
@@ -98,6 +98,10 @@ config USB_RTL8150
 config USB_RTL8152
 	tristate "Realtek RTL8152/RTL8153 Based USB Ethernet Adapters"
 	select MII
+	select CRC32
+	select CRYPTO
+	select CRYPTO_HASH
+	select CRYPTO_SHA256
 	help
 	  This option adds support for Realtek RTL8152 based USB 2.0
 	  10/100 Ethernet adapters and RTL8153 based USB 3.0 10/100/1000

commit d0737ab232f631c366d3b2ca3b3c828d6dd6d309
Author: chongjiapeng <jiapeng.chong@linux.alibaba.com>
Date:   Sat Oct 9 16:09:26 2021 +0800

    qed: Fix missing error code in qed_slowpath_start()
    
    commit a5a14ea7b4e55604acb0dc9d88fdb4cb6945bc77 upstream.
    
    The error code is missing in this code scenario, add the error code
    '-EINVAL' to the return value 'rc'.
    
    Eliminate the follow smatch warning:
    
    drivers/net/ethernet/qlogic/qed/qed_main.c:1298 qed_slowpath_start()
    warn: missing error code 'rc'.
    
    Reported-by: Abaci Robot <abaci@linux.alibaba.com>
    Fixes: d51e4af5c209 ("qed: aRFS infrastructure support")
    Signed-off-by: chongjiapeng <jiapeng.chong@linux.alibaba.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c b/drivers/net/ethernet/qlogic/qed/qed_main.c
index 9d77f318d11e..43c85e584b6f 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_main.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_main.c
@@ -1067,6 +1067,7 @@ static int qed_slowpath_start(struct qed_dev *cdev,
 			} else {
 				DP_NOTICE(cdev,
 					  "Failed to acquire PTT for aRFS\n");
+				rc = -EINVAL;
 				goto err;
 			}
 		}

commit eaa8097fa6ea34646cf9253044e151ce65889aab
Author: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Date:   Thu Oct 7 19:49:57 2021 +0200

    mqprio: Correct stats in mqprio_dump_class_stats().
    
    commit 14132690860e4d06aa3e1c4d7d8e9866ba7756dd upstream.
    
    Introduction of lockless subqueues broke the class statistics.
    Before the change stats were accumulated in `bstats' and `qstats'
    on the stack which was then copied to struct gnet_dump.
    
    After the change the `bstats' and `qstats' are initialized to 0
    and never updated, yet still fed to gnet_dump. The code updates
    the global qdisc->cpu_bstats and qdisc->cpu_qstats instead,
    clobbering them. Most likely a copy-paste error from the code in
    mqprio_dump().
    
    __gnet_stats_copy_basic() and __gnet_stats_copy_queue() accumulate
    the values for per-CPU case but for global stats they overwrite
    the value, so only stats from the last loop iteration / tc end up
    in sch->[bq]stats.
    
    Use the on-stack [bq]stats variables again and add the stats manually
    in the global case.
    
    Fixes: ce679e8df7ed2 ("net: sched: add support for TCQ_F_NOLOCK subqueues to sch_mqprio")
    Cc: John Fastabend <john.fastabend@gmail.com>
    Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    https://lore.kernel.org/all/20211007175000.2334713-2-bigeasy@linutronix.de/
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/sched/sch_mqprio.c b/net/sched/sch_mqprio.c
index 008db8d59ace..fcfe41a95473 100644
--- a/net/sched/sch_mqprio.c
+++ b/net/sched/sch_mqprio.c
@@ -531,22 +531,28 @@ static int mqprio_dump_class_stats(struct Qdisc *sch, unsigned long cl,
 		for (i = tc.offset; i < tc.offset + tc.count; i++) {
 			struct netdev_queue *q = netdev_get_tx_queue(dev, i);
 			struct Qdisc *qdisc = rtnl_dereference(q->qdisc);
-			struct gnet_stats_basic_cpu __percpu *cpu_bstats = NULL;
-			struct gnet_stats_queue __percpu *cpu_qstats = NULL;
 
 			spin_lock_bh(qdisc_lock(qdisc));
+
 			if (qdisc_is_percpu_stats(qdisc)) {
-				cpu_bstats = qdisc->cpu_bstats;
-				cpu_qstats = qdisc->cpu_qstats;
+				qlen = qdisc_qlen_sum(qdisc);
+
+				__gnet_stats_copy_basic(NULL, &bstats,
+							qdisc->cpu_bstats,
+							&qdisc->bstats);
+				__gnet_stats_copy_queue(&qstats,
+							qdisc->cpu_qstats,
+							&qdisc->qstats,
+							qlen);
+			} else {
+				qlen		+= qdisc->q.qlen;
+				bstats.bytes	+= qdisc->bstats.bytes;
+				bstats.packets	+= qdisc->bstats.packets;
+				qstats.backlog	+= qdisc->qstats.backlog;
+				qstats.drops	+= qdisc->qstats.drops;
+				qstats.requeues	+= qdisc->qstats.requeues;
+				qstats.overlimits += qdisc->qstats.overlimits;
 			}
-
-			qlen = qdisc_qlen_sum(qdisc);
-			__gnet_stats_copy_basic(NULL, &sch->bstats,
-						cpu_bstats, &qdisc->bstats);
-			__gnet_stats_copy_queue(&sch->qstats,
-						cpu_qstats,
-						&qdisc->qstats,
-						qlen);
 			spin_unlock_bh(qdisc_lock(qdisc));
 		}
 

commit 420824f45900b25739f01fa01c57569f8f59f55c
Author: Jackie Liu <liuyun01@kylinos.cn>
Date:   Mon Aug 23 17:25:26 2021 +0800

    acpi/arm64: fix next_platform_timer() section mismatch error
    
    commit 596143e3aec35c93508d6b7a05ddc999ee209b61 upstream.
    
    Fix modpost Section mismatch error in next_platform_timer().
    
      [...]
      WARNING: modpost: vmlinux.o(.text.unlikely+0x26e60): Section mismatch in reference from the function next_platform_timer() to the variable .init.data:acpi_gtdt_desc
      The function next_platform_timer() references
      the variable __initdata acpi_gtdt_desc.
      This is often because next_platform_timer lacks a __initdata
      annotation or the annotation of acpi_gtdt_desc is wrong.
    
      WARNING: modpost: vmlinux.o(.text.unlikely+0x26e64): Section mismatch in reference from the function next_platform_timer() to the variable .init.data:acpi_gtdt_desc
      The function next_platform_timer() references
      the variable __initdata acpi_gtdt_desc.
      This is often because next_platform_timer lacks a __initdata
      annotation or the annotation of acpi_gtdt_desc is wrong.
    
      ERROR: modpost: Section mismatches detected.
      Set CONFIG_SECTION_MISMATCH_WARN_ONLY=y to allow them.
      make[1]: *** [scripts/Makefile.modpost:59: vmlinux.symvers] Error 1
      make[1]: *** Deleting file 'vmlinux.symvers'
      make: *** [Makefile:1176: vmlinux] Error 2
      [...]
    
    Fixes: a712c3ed9b8a ("acpi/arm64: Add memory-mapped timer support in GTDT driver")
    Signed-off-by: Jackie Liu <liuyun01@kylinos.cn>
    Acked-by: Hanjun Guo <guohanjun@huawei.com>
    Link: https://lore.kernel.org/r/20210823092526.2407526-1-liu.yun@linux.dev
    Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/acpi/arm64/gtdt.c b/drivers/acpi/arm64/gtdt.c
index c39b36c558d6..7a181a8a9bf0 100644
--- a/drivers/acpi/arm64/gtdt.c
+++ b/drivers/acpi/arm64/gtdt.c
@@ -39,7 +39,7 @@ struct acpi_gtdt_descriptor {
 
 static struct acpi_gtdt_descriptor acpi_gtdt_desc __initdata;
 
-static inline void *next_platform_timer(void *platform_timer)
+static inline __init void *next_platform_timer(void *platform_timer)
 {
 	struct acpi_gtdt_header *gh = platform_timer;
 

commit d7dc9e5bd47dd7f7871fe7bf5c0416c1fae82899
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Fri Oct 1 15:34:09 2021 +0300

    drm/msm/dsi: fix off by one in dsi_bus_clk_enable error handling
    
    commit c8f01ffc83923a91e8087aaa077de13354a7aa59 upstream.
    
    This disables a lock which wasn't enabled and it does not disable
    the first lock in the array.
    
    Fixes: 6e0eb52eba9e ("drm/msm/dsi: Parse bus clocks from a list")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
    Link: https://lore.kernel.org/r/20211001123409.GG2283@kili
    Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
    Signed-off-by: Rob Clark <robdclark@chromium.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c
index 3b78bca0bb4d..77dae147caf9 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_host.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_host.c
@@ -468,7 +468,7 @@ static int dsi_bus_clk_enable(struct msm_dsi_host *msm_host)
 
 	return 0;
 err:
-	for (; i > 0; i--)
+	while (--i >= 0)
 		clk_disable_unprepare(msm_host->bus_clks[i]);
 
 	return ret;

commit 6635d56798b289aa0437d1f709555e8bee301934
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Fri Oct 1 15:33:08 2021 +0300

    drm/msm/dsi: Fix an error code in msm_dsi_modeset_init()
    
    commit 739b4e7756d3301dd673ca517afca46a5f635562 upstream.
    
    Return an error code if msm_dsi_manager_validate_current_config().
    Don't return success.
    
    Fixes: 8b03ad30e314 ("drm/msm/dsi: Use one connector for dual DSI mode")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
    Link: https://lore.kernel.org/r/20211001123308.GF2283@kili
    Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
    Signed-off-by: Rob Clark <robdclark@chromium.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/msm/dsi/dsi.c b/drivers/gpu/drm/msm/dsi/dsi.c
index 822cef472a7e..5cf6eac9c1d3 100644
--- a/drivers/gpu/drm/msm/dsi/dsi.c
+++ b/drivers/gpu/drm/msm/dsi/dsi.c
@@ -208,8 +208,10 @@ int msm_dsi_modeset_init(struct msm_dsi *msm_dsi, struct drm_device *dev,
 		goto fail;
 	}
 
-	if (!msm_dsi_manager_validate_current_config(msm_dsi->id))
+	if (!msm_dsi_manager_validate_current_config(msm_dsi->id)) {
+		ret = -EINVAL;
 		goto fail;
+	}
 
 	msm_dsi->encoder = encoder;
 

commit 7f642b93710b6b1119bdff90be01e6b5a2a5d669
Author: Colin Ian King <colin.king@canonical.com>
Date:   Wed Sep 29 13:18:57 2021 +0100

    drm/msm: Fix null pointer dereference on pointer edp
    
    commit 2133c4fc8e1348dcb752f267a143fe2254613b34 upstream.
    
    The initialization of pointer dev dereferences pointer edp before
    edp is null checked, so there is a potential null pointer deference
    issue. Fix this by only dereferencing edp after edp has been null
    checked.
    
    Addresses-Coverity: ("Dereference before null check")
    Fixes: ab5b0107ccf3 ("drm/msm: Initial add eDP support in msm drm driver (v5)")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
    Link: https://lore.kernel.org/r/20210929121857.213922-1-colin.king@canonical.com
    Signed-off-by: Rob Clark <robdclark@chromium.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/msm/edp/edp_ctrl.c b/drivers/gpu/drm/msm/edp/edp_ctrl.c
index 7c72264101ff..2589b23c4131 100644
--- a/drivers/gpu/drm/msm/edp/edp_ctrl.c
+++ b/drivers/gpu/drm/msm/edp/edp_ctrl.c
@@ -1090,7 +1090,7 @@ void msm_edp_ctrl_power(struct edp_ctrl *ctrl, bool on)
 int msm_edp_ctrl_init(struct msm_edp *edp)
 {
 	struct edp_ctrl *ctrl = NULL;
-	struct device *dev = &edp->pdev->dev;
+	struct device *dev;
 	int ret;
 
 	if (!edp) {
@@ -1098,6 +1098,7 @@ int msm_edp_ctrl_init(struct msm_edp *edp)
 		return -EINVAL;
 	}
 
+	dev = &edp->pdev->dev;
 	ctrl = devm_kzalloc(dev, sizeof(*ctrl), GFP_KERNEL);
 	if (!ctrl)
 		return -ENOMEM;

commit 6560d144c4abbbd3c8164aa0be240387e0bad932
Author: Vadim Pasternak <vadimp@nvidia.com>
Date:   Mon Sep 27 17:22:13 2021 +0300

    platform/mellanox: mlxreg-io: Fix argument base in kstrtou32() call
    
    commit 9b024201693e397441668cca0d2df7055fe572eb upstream.
    
    Change kstrtou32() argument 'base' to be zero instead of 'len'.
    It works by chance for setting one bit value, but it is not supposed to
    work in case value passed to mlxreg_io_attr_store() is greater than 1.
    
    It works for example, for:
    echo 1 > /sys/devices/platform/mlxplat/mlxreg-io/hwmon/.../jtag_enable
    But it will fail for:
    echo n > /sys/devices/platform/mlxplat/mlxreg-io/hwmon/.../jtag_enable,
    where n > 1.
    
    The flow for input buffer conversion is as below:
    _kstrtoull(const char *s, unsigned int base, unsigned long long *res)
    calls:
    rv = _parse_integer(s, base, &_res);
    
    For the second case, where n > 1:
    - _parse_integer() converts 's' to 'val'.
      For n=2, 'len' is set to 2 (string buffer is 0x32 0x0a), for n=3
      'len' is set to 3 (string buffer 0x33 0x0a), etcetera.
    - 'base' is equal or greater then '2' (length of input buffer).
    
    As a result, _parse_integer() exits with result zero (rv):
            rv = 0;
            while (1) {
                    ...
                    if (val >= base)-> (2 >= 2)
                            break;
                    ...
                    rv++;
                    ...
            }
    
    And _kstrtoull() in their turn will fail:
            if (rv == 0)
                    return -EINVAL;
    
    Fixes: 5ec4a8ace06c ("platform/mellanox: Introduce support for Mellanox register access driver")
    Signed-off-by: Vadim Pasternak <vadimp@nvidia.com>
    Link: https://lore.kernel.org/r/20210927142214.2613929-2-vadimp@nvidia.com
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/platform/mellanox/mlxreg-io.c b/drivers/platform/mellanox/mlxreg-io.c
index acfaf64ffde6..1c3760c13f83 100644
--- a/drivers/platform/mellanox/mlxreg-io.c
+++ b/drivers/platform/mellanox/mlxreg-io.c
@@ -123,7 +123,7 @@ mlxreg_io_attr_store(struct device *dev, struct device_attribute *attr,
 		return -EINVAL;
 
 	/* Convert buffer to input value. */
-	ret = kstrtou32(buf, len, &input_val);
+	ret = kstrtou32(buf, 0, &input_val);
 	if (ret)
 		return ret;
 

commit 091ede5caf61616712546908033508d824db5d94
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Wed Oct 6 10:34:19 2021 +0300

    pata_legacy: fix a couple uninitialized variable bugs
    
    commit 013923477cb311293df9079332cf8b806ed0e6f2 upstream.
    
    The last byte of "pad" is used without being initialized.
    
    Fixes: 55dba3120fbc ("libata: update ->data_xfer hook for ATAPI")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/ata/pata_legacy.c b/drivers/ata/pata_legacy.c
index 8ea4b8431fc8..52cea1b3ea70 100644
--- a/drivers/ata/pata_legacy.c
+++ b/drivers/ata/pata_legacy.c
@@ -329,7 +329,8 @@ static unsigned int pdc_data_xfer_vlb(struct ata_queued_cmd *qc,
 			iowrite32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
 
 		if (unlikely(slop)) {
-			__le32 pad;
+			__le32 pad = 0;
+
 			if (rw == READ) {
 				pad = cpu_to_le32(ioread32(ap->ioaddr.data_addr));
 				memcpy(buf + buflen - slop, &pad, slop);
@@ -719,7 +720,8 @@ static unsigned int vlb32_data_xfer(struct ata_queued_cmd *qc,
 			ioread32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
 
 		if (unlikely(slop)) {
-			__le32 pad;
+			__le32 pad = 0;
+
 			if (rw == WRITE) {
 				memcpy(&pad, buf + buflen - slop, slop);
 				iowrite32(le32_to_cpu(pad), ap->ioaddr.data_addr);

commit 071bdef36391958c89af5fa2172f691b31baa212
Author: Ziyang Xuan <william.xuanziyang@huawei.com>
Date:   Wed Oct 13 15:50:32 2021 +0800

    NFC: digital: fix possible memory leak in digital_in_send_sdd_req()
    
    commit 291c932fc3692e4d211a445ba8aa35663831bac7 upstream.
    
    'skb' is allocated in digital_in_send_sdd_req(), but not free when
    digital_in_send_cmd() failed, which will cause memory leak. Fix it
    by freeing 'skb' if digital_in_send_cmd() return failed.
    
    Fixes: 2c66daecc409 ("NFC Digital: Add NFC-A technology support")
    Signed-off-by: Ziyang Xuan <william.xuanziyang@huawei.com>
    Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/nfc/digital_technology.c b/net/nfc/digital_technology.c
index 2021d1d58a75..c092b02fde8a 100644
--- a/net/nfc/digital_technology.c
+++ b/net/nfc/digital_technology.c
@@ -474,8 +474,12 @@ static int digital_in_send_sdd_req(struct nfc_digital_dev *ddev,
 	skb_put_u8(skb, sel_cmd);
 	skb_put_u8(skb, DIGITAL_SDD_REQ_SEL_PAR);
 
-	return digital_in_send_cmd(ddev, skb, 30, digital_in_recv_sdd_res,
-				   target);
+	rc = digital_in_send_cmd(ddev, skb, 30, digital_in_recv_sdd_res,
+				 target);
+	if (rc)
+		kfree_skb(skb);
+
+	return rc;
 }
 
 static void digital_in_recv_sens_res(struct nfc_digital_dev *ddev, void *arg,

commit 9881b0c860649f27ef2565deef011e516390f416
Author: Ziyang Xuan <william.xuanziyang@huawei.com>
Date:   Wed Oct 13 15:50:12 2021 +0800

    NFC: digital: fix possible memory leak in digital_tg_listen_mdaa()
    
    commit 58e7dcc9ca29c14e44267a4d0ea61e3229124907 upstream.
    
    'params' is allocated in digital_tg_listen_mdaa(), but not free when
    digital_send_cmd() failed, which will cause memory leak. Fix it by
    freeing 'params' if digital_send_cmd() return failed.
    
    Fixes: 1c7a4c24fbfd ("NFC Digital: Add target NFC-DEP support")
    Signed-off-by: Ziyang Xuan <william.xuanziyang@huawei.com>
    Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/nfc/digital_core.c b/net/nfc/digital_core.c
index ec0a8998e52d..d6258638a07a 100644
--- a/net/nfc/digital_core.c
+++ b/net/nfc/digital_core.c
@@ -286,6 +286,7 @@ int digital_tg_configure_hw(struct nfc_digital_dev *ddev, int type, int param)
 static int digital_tg_listen_mdaa(struct nfc_digital_dev *ddev, u8 rf_tech)
 {
 	struct digital_tg_mdaa_params *params;
+	int rc;
 
 	params = kzalloc(sizeof(*params), GFP_KERNEL);
 	if (!params)
@@ -300,8 +301,12 @@ static int digital_tg_listen_mdaa(struct nfc_digital_dev *ddev, u8 rf_tech)
 	get_random_bytes(params->nfcid2 + 2, NFC_NFCID2_MAXSIZE - 2);
 	params->sc = DIGITAL_SENSF_FELICA_SC;
 
-	return digital_send_cmd(ddev, DIGITAL_CMD_TG_LISTEN_MDAA, NULL, params,
-				500, digital_tg_recv_atr_req, NULL);
+	rc = digital_send_cmd(ddev, DIGITAL_CMD_TG_LISTEN_MDAA, NULL, params,
+			      500, digital_tg_recv_atr_req, NULL);
+	if (rc)
+		kfree(params);
+
+	return rc;
 }
 
 static int digital_tg_listen_md(struct nfc_digital_dev *ddev, u8 rf_tech)

commit 081d231e2aaf3f42fc56f49232c8abd3858ef5bc
Author: Ziyang Xuan <william.xuanziyang@huawei.com>
Date:   Wed Oct 13 11:49:32 2021 +0800

    nfc: fix error handling of nfc_proto_register()
    
    commit 0911ab31896f0e908540746414a77dd63912748d upstream.
    
    When nfc proto id is using, nfc_proto_register() return -EBUSY error
    code, but forgot to unregister proto. Fix it by adding proto_unregister()
    in the error handling case.
    
    Fixes: c7fe3b52c128 ("NFC: add NFC socket family")
    Signed-off-by: Ziyang Xuan <william.xuanziyang@huawei.com>
    Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Link: https://lore.kernel.org/r/20211013034932.2833737-1-william.xuanziyang@huawei.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/nfc/af_nfc.c b/net/nfc/af_nfc.c
index d3e594eb36d0..adf16ff007cc 100644
--- a/net/nfc/af_nfc.c
+++ b/net/nfc/af_nfc.c
@@ -72,6 +72,9 @@ int nfc_proto_register(const struct nfc_protocol *nfc_proto)
 		proto_tab[nfc_proto->id] = nfc_proto;
 	write_unlock(&proto_tab_lock);
 
+	if (rc)
+		proto_unregister(nfc_proto->proto);
+
 	return rc;
 }
 EXPORT_SYMBOL(nfc_proto_register);

commit a3999758c3b0de7a0d4ed240d546c1832da4ef1c
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Wed Oct 13 16:35:49 2021 +0200

    ethernet: s2io: fix setting mac address during resume
    
    commit 40507e7aada8422c38aafa0c8a1a09e4623c712a upstream.
    
    After recent cleanups, gcc started warning about a suspicious
    memcpy() call during the s2io_io_resume() function:
    
    In function '__dev_addr_set',
        inlined from 'eth_hw_addr_set' at include/linux/etherdevice.h:318:2,
        inlined from 's2io_set_mac_addr' at drivers/net/ethernet/neterion/s2io.c:5205:2,
        inlined from 's2io_io_resume' at drivers/net/ethernet/neterion/s2io.c:8569:7:
    arch/x86/include/asm/string_32.h:182:25: error: '__builtin_memcpy' accessing 6 bytes at offsets 0 and 2 overlaps 4 bytes at offset 2 [-Werror=restrict]
      182 | #define memcpy(t, f, n) __builtin_memcpy(t, f, n)
          |                         ^~~~~~~~~~~~~~~~~~~~~~~~~
    include/linux/netdevice.h:4648:9: note: in expansion of macro 'memcpy'
     4648 |         memcpy(dev->dev_addr, addr, len);
          |         ^~~~~~
    
    What apparently happened is that an old cleanup changed the calling
    conventions for s2io_set_mac_addr() from taking an ethernet address
    as a character array to taking a struct sockaddr, but one of the
    callers was not changed at the same time.
    
    Change it to instead call the low-level do_s2io_prog_unicast() function
    that still takes the old argument type.
    
    Fixes: 2fd376884558 ("S2io: Added support set_mac_address driver entry point")
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Link: https://lore.kernel.org/r/20211013143613.2049096-1-arnd@kernel.org
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/neterion/s2io.c b/drivers/net/ethernet/neterion/s2io.c
index b8983e73265a..85a54215616c 100644
--- a/drivers/net/ethernet/neterion/s2io.c
+++ b/drivers/net/ethernet/neterion/s2io.c
@@ -8569,7 +8569,7 @@ static void s2io_io_resume(struct pci_dev *pdev)
 			return;
 		}
 
-		if (s2io_set_mac_addr(netdev, netdev->dev_addr) == FAILURE) {
+		if (do_s2io_prog_unicast(netdev, netdev->dev_addr) == FAILURE) {
 			s2io_card_down(sp);
 			pr_err("Can't restore mac addr after reset.\n");
 			return;

commit 5e5494e6fc8a29c927e0478bec4a078a40da8901
Author: Nanyong Sun <sunnanyong@huawei.com>
Date:   Tue Oct 12 20:59:01 2021 +0800

    net: encx24j600: check error in devm_regmap_init_encx24j600
    
    commit f03dca0c9e2297c84a018e306f8a9cd534ee4287 upstream.
    
    devm_regmap_init may return error which caused by like out of memory,
    this will results in null pointer dereference later when reading
    or writing register:
    
    general protection fault in encx24j600_spi_probe
    KASAN: null-ptr-deref in range [0x0000000000000090-0x0000000000000097]
    CPU: 0 PID: 286 Comm: spi-encx24j600- Not tainted 5.15.0-rc2-00142-g9978db750e31-dirty #11 9c53a778c1306b1b02359f3c2bbedc0222cba652
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014
    RIP: 0010:regcache_cache_bypass drivers/base/regmap/regcache.c:540
    Code: 54 41 89 f4 55 53 48 89 fb 48 83 ec 08 e8 26 94 a8 fe 48 8d bb a0 00 00 00 48 b8 00 00 00 00 00 fc ff df 48 89 fa 48 c1 ea 03 <80> 3c 02 00 0f 85 4a 03 00 00 4c 8d ab b0 00 00 00 48 8b ab a0 00
    RSP: 0018:ffffc900010476b8 EFLAGS: 00010207
    RAX: dffffc0000000000 RBX: fffffffffffffff4 RCX: 0000000000000000
    RDX: 0000000000000012 RSI: ffff888002de0000 RDI: 0000000000000094
    RBP: ffff888013c9a000 R08: 0000000000000000 R09: fffffbfff3f9cc6a
    R10: ffffc900010476e8 R11: fffffbfff3f9cc69 R12: 0000000000000001
    R13: 000000000000000a R14: ffff888013c9af54 R15: ffff888013c9ad08
    FS:  00007ffa984ab580(0000) GS:ffff88801fe00000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 000055a6384136c8 CR3: 000000003bbe6003 CR4: 0000000000770ef0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    PKRU: 55555554
    Call Trace:
     encx24j600_spi_probe drivers/net/ethernet/microchip/encx24j600.c:459
     spi_probe drivers/spi/spi.c:397
     really_probe drivers/base/dd.c:517
     __driver_probe_device drivers/base/dd.c:751
     driver_probe_device drivers/base/dd.c:782
     __device_attach_driver drivers/base/dd.c:899
     bus_for_each_drv drivers/base/bus.c:427
     __device_attach drivers/base/dd.c:971
     bus_probe_device drivers/base/bus.c:487
     device_add drivers/base/core.c:3364
     __spi_add_device drivers/spi/spi.c:599
     spi_add_device drivers/spi/spi.c:641
     spi_new_device drivers/spi/spi.c:717
     new_device_store+0x18c/0x1f1 [spi_stub 4e02719357f1ff33f5a43d00630982840568e85e]
     dev_attr_store drivers/base/core.c:2074
     sysfs_kf_write fs/sysfs/file.c:139
     kernfs_fop_write_iter fs/kernfs/file.c:300
     new_sync_write fs/read_write.c:508 (discriminator 4)
     vfs_write fs/read_write.c:594
     ksys_write fs/read_write.c:648
     do_syscall_64 arch/x86/entry/common.c:50
     entry_SYSCALL_64_after_hwframe arch/x86/entry/entry_64.S:113
    
    Add error check in devm_regmap_init_encx24j600 to avoid this situation.
    
    Fixes: 04fbfce7a222 ("net: Microchip encx24j600 driver")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Nanyong Sun <sunnanyong@huawei.com>
    Link: https://lore.kernel.org/r/20211012125901.3623144-1-sunnanyong@huawei.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/microchip/encx24j600-regmap.c b/drivers/net/ethernet/microchip/encx24j600-regmap.c
index 44bb04d4d21b..46181559d1f1 100644
--- a/drivers/net/ethernet/microchip/encx24j600-regmap.c
+++ b/drivers/net/ethernet/microchip/encx24j600-regmap.c
@@ -505,13 +505,19 @@ static struct regmap_bus phymap_encx24j600 = {
 	.reg_read = regmap_encx24j600_phy_reg_read,
 };
 
-void devm_regmap_init_encx24j600(struct device *dev,
-				 struct encx24j600_context *ctx)
+int devm_regmap_init_encx24j600(struct device *dev,
+				struct encx24j600_context *ctx)
 {
 	mutex_init(&ctx->mutex);
 	regcfg.lock_arg = ctx;
 	ctx->regmap = devm_regmap_init(dev, &regmap_encx24j600, ctx, &regcfg);
+	if (IS_ERR(ctx->regmap))
+		return PTR_ERR(ctx->regmap);
 	ctx->phymap = devm_regmap_init(dev, &phymap_encx24j600, ctx, &phycfg);
+	if (IS_ERR(ctx->phymap))
+		return PTR_ERR(ctx->phymap);
+
+	return 0;
 }
 EXPORT_SYMBOL_GPL(devm_regmap_init_encx24j600);
 
diff --git a/drivers/net/ethernet/microchip/encx24j600.c b/drivers/net/ethernet/microchip/encx24j600.c
index 84b6ad76f5bc..ff45326eb696 100644
--- a/drivers/net/ethernet/microchip/encx24j600.c
+++ b/drivers/net/ethernet/microchip/encx24j600.c
@@ -1032,10 +1032,13 @@ static int encx24j600_spi_probe(struct spi_device *spi)
 	priv->speed = SPEED_100;
 
 	priv->ctx.spi = spi;
-	devm_regmap_init_encx24j600(&spi->dev, &priv->ctx);
 	ndev->irq = spi->irq;
 	ndev->netdev_ops = &encx24j600_netdev_ops;
 
+	ret = devm_regmap_init_encx24j600(&spi->dev, &priv->ctx);
+	if (ret)
+		goto out_free;
+
 	mutex_init(&priv->lock);
 
 	/* Reset device and check if it is connected */
diff --git a/drivers/net/ethernet/microchip/encx24j600_hw.h b/drivers/net/ethernet/microchip/encx24j600_hw.h
index f604a260ede7..711147a159aa 100644
--- a/drivers/net/ethernet/microchip/encx24j600_hw.h
+++ b/drivers/net/ethernet/microchip/encx24j600_hw.h
@@ -15,8 +15,8 @@ struct encx24j600_context {
 	int bank;
 };
 
-void devm_regmap_init_encx24j600(struct device *dev,
-				 struct encx24j600_context *ctx);
+int devm_regmap_init_encx24j600(struct device *dev,
+				struct encx24j600_context *ctx);
 
 /* Single-byte instructions */
 #define BANK_SELECT(bank) (0xC0 | ((bank & (BANK_MASK >> BANK_SHIFT)) << 1))

commit 843280d81ff9c2a7eb32559d7cb05fecc45822f9
Author: Vegard Nossum <vegard.nossum@oracle.com>
Date:   Tue Oct 12 17:25:09 2021 +0200

    net: korina: select CRC32
    
    commit 427f974d9727ca681085ddcd0530c97ab5811ae0 upstream.
    
    Fix the following build/link error by adding a dependency on the CRC32
    routines:
    
      ld: drivers/net/ethernet/korina.o: in function `korina_multicast_list':
      korina.c:(.text+0x1af): undefined reference to `crc32_le'
    
    Fixes: ef11291bcd5f9 ("Add support the Korina (IDT RC32434) Ethernet MAC")
    Cc: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Vegard Nossum <vegard.nossum@oracle.com>
    Acked-by: Florian fainelli <f.fainelli@gmail.com>
    Link: https://lore.kernel.org/r/20211012152509.21771-1-vegard.nossum@oracle.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/Kconfig b/drivers/net/ethernet/Kconfig
index 6fde68aa13a4..02644283377a 100644
--- a/drivers/net/ethernet/Kconfig
+++ b/drivers/net/ethernet/Kconfig
@@ -98,6 +98,7 @@ config JME
 config KORINA
 	tristate "Korina (IDT RC32434) Ethernet support"
 	depends on MIKROTIK_RB532
+	select CRC32
 	---help---
 	  If you have a Mikrotik RouterBoard 500 or IDT RC32434
 	  based system say Y. Otherwise say N.

commit cdcfccfca82eafca3ef9039b4aaf46611c173d52
Author: Vegard Nossum <vegard.nossum@oracle.com>
Date:   Tue Oct 12 11:34:46 2021 +0200

    net: arc: select CRC32
    
    commit e599ee234ad4fdfe241d937bbabd96e0d8f9d868 upstream.
    
    Fix the following build/link error by adding a dependency on the CRC32
    routines:
    
      ld: drivers/net/ethernet/arc/emac_main.o: in function `arc_emac_set_rx_mode':
      emac_main.c:(.text+0xb11): undefined reference to `crc32_le'
    
    The crc32_le() call comes through the ether_crc_le() call in
    arc_emac_set_rx_mode().
    
    [v2: moved the select to ARC_EMAC_CORE; the Makefile is a bit confusing,
    but the error comes from emac_main.o, which is part of the arc_emac module,
    which in turn is enabled by CONFIG_ARC_EMAC_CORE. Note that arc_emac is
    different from emac_arc...]
    
    Fixes: 775dd682e2b0ec ("arc_emac: implement promiscuous mode and multicast filtering")
    Cc: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Vegard Nossum <vegard.nossum@oracle.com>
    Link: https://lore.kernel.org/r/20211012093446.1575-1-vegard.nossum@oracle.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/arc/Kconfig b/drivers/net/ethernet/arc/Kconfig
index 5d0ab8e74b68..55622d41f1ba 100644
--- a/drivers/net/ethernet/arc/Kconfig
+++ b/drivers/net/ethernet/arc/Kconfig
@@ -20,6 +20,7 @@ config ARC_EMAC_CORE
 	depends on ARC || ARCH_ROCKCHIP || COMPILE_TEST
 	select MII
 	select PHYLIB
+	select CRC32
 
 config ARC_EMAC
 	tristate "ARC EMAC support"

commit c57fdeff69b152185fafabd37e6bfecfce51efda
Author: Eiichi Tsukata <eiichi.tsukata@nutanix.com>
Date:   Wed Oct 13 17:27:29 2021 -0300

    sctp: account stream padding length for reconf chunk
    
    commit a2d859e3fc97e79d907761550dbc03ff1b36479c upstream.
    
    sctp_make_strreset_req() makes repeated calls to sctp_addto_chunk()
    which will automatically account for padding on each call. inreq and
    outreq are already 4 bytes aligned, but the payload is not and doing
    SCTP_PAD4(a + b) (which _sctp_make_chunk() did implicitly here) is
    different from SCTP_PAD4(a) + SCTP_PAD4(b) and not enough. It led to
    possible attempt to use more buffer than it was allocated and triggered
    a BUG_ON.
    
    Cc: Vlad Yasevich <vyasevich@gmail.com>
    Cc: Neil Horman <nhorman@tuxdriver.com>
    Cc: Greg KH <gregkh@linuxfoundation.org>
    Fixes: cc16f00f6529 ("sctp: add support for generating stream reconf ssn reset request chunk")
    Reported-by: Eiichi Tsukata <eiichi.tsukata@nutanix.com>
    Signed-off-by: Eiichi Tsukata <eiichi.tsukata@nutanix.com>
    Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: Marcelo Ricardo Leitner <mleitner@redhat.com>
    Reviewed-by: Xin Long <lucien.xin@gmail.com>
    Link: https://lore.kernel.org/r/b97c1f8b0c7ff79ac4ed206fc2c49d3612e0850c.1634156849.git.mleitner@redhat.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
index 0789109c2d09..35e1fb708f4a 100644
--- a/net/sctp/sm_make_chunk.c
+++ b/net/sctp/sm_make_chunk.c
@@ -3673,7 +3673,7 @@ struct sctp_chunk *sctp_make_strreset_req(
 	outlen = (sizeof(outreq) + stream_len) * out;
 	inlen = (sizeof(inreq) + stream_len) * in;
 
-	retval = sctp_make_reconf(asoc, outlen + inlen);
+	retval = sctp_make_reconf(asoc, SCTP_PAD4(outlen) + SCTP_PAD4(inlen));
 	if (!retval)
 		return NULL;
 

commit 6d6b4efde25a34b334b5105d628995a2187285e0
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Mon Aug 16 21:39:54 2021 +0300

    iio: dac: ti-dac5571: fix an error code in probe()
    
    commit f7a28df7db84eb3410e9eca37832efa5aed93338 upstream.
    
    If we have an unexpected number of channels then return -EINVAL instead
    of returning success.
    
    Fixes: df38a4a72a3b ("iio: dac: add TI DAC5571 family support")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Link: https://lore.kernel.org/r/20210816183954.GB2068@kili
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iio/dac/ti-dac5571.c b/drivers/iio/dac/ti-dac5571.c
index e39d1e901353..2ed927b582f4 100644
--- a/drivers/iio/dac/ti-dac5571.c
+++ b/drivers/iio/dac/ti-dac5571.c
@@ -355,6 +355,7 @@ static int dac5571_probe(struct i2c_client *client,
 		data->dac5571_pwrdwn = dac5571_pwrdwn_quad;
 		break;
 	default:
+		ret = -EINVAL;
 		goto err;
 	}
 

commit c9a8362f654c577445b69183ed32b97fb364e6fe
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Tue Sep 14 13:53:33 2021 +0300

    iio: ssp_sensors: fix error code in ssp_print_mcu_debug()
    
    commit 4170d3dd1467e9d78cb9af374b19357dc324b328 upstream.
    
    The ssp_print_mcu_debug() function should return negative error codes on
    error.  Returning "length" is meaningless.  This change does not affect
    runtime because the callers only care about zero/non-zero.
    
    Reported-by: Jonathan Cameron <jic23@kernel.org>
    Fixes: 50dd64d57eee ("iio: common: ssp_sensors: Add sensorhub driver")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Link: https://lore.kernel.org/r/20210914105333.GA11657@kili
    Cc: <Stable@vger.kernel.org>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iio/common/ssp_sensors/ssp_spi.c b/drivers/iio/common/ssp_sensors/ssp_spi.c
index 6f448a435bd3..3d11cfa03a31 100644
--- a/drivers/iio/common/ssp_sensors/ssp_spi.c
+++ b/drivers/iio/common/ssp_sensors/ssp_spi.c
@@ -147,7 +147,7 @@ static int ssp_print_mcu_debug(char *data_frame, int *data_index,
 	if (length > received_len - *data_index || length <= 0) {
 		ssp_dbg("[SSP]: MSG From MCU-invalid debug length(%d/%d)\n",
 			length, received_len);
-		return length ? length : -EPROTO;
+		return -EPROTO;
 	}
 
 	ssp_dbg("[SSP]: MSG From MCU - %s\n", &data_frame[*data_index]);

commit 82a005bfb3b48b31734081ff2999885d70d29263
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Thu Sep 9 12:13:36 2021 +0300

    iio: ssp_sensors: add more range checking in ssp_parse_dataframe()
    
    commit 8167c9a375ccceed19048ad9d68cb2d02ed276e0 upstream.
    
    The "idx" is validated at the start of the loop but it gets incremented
    during the iteration so it needs to be checked again.
    
    Fixes: 50dd64d57eee ("iio: common: ssp_sensors: Add sensorhub driver")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Link: https://lore.kernel.org/r/20210909091336.GA26312@kili
    Cc: <Stable@vger.kernel.org>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iio/common/ssp_sensors/ssp_spi.c b/drivers/iio/common/ssp_sensors/ssp_spi.c
index 2ab106bb3e03..6f448a435bd3 100644
--- a/drivers/iio/common/ssp_sensors/ssp_spi.c
+++ b/drivers/iio/common/ssp_sensors/ssp_spi.c
@@ -283,6 +283,8 @@ static int ssp_parse_dataframe(struct ssp_data *data, char *dataframe, int len)
 	for (idx = 0; idx < len;) {
 		switch (dataframe[idx++]) {
 		case SSP_MSG2AP_INST_BYPASS_DATA:
+			if (idx >= len)
+				return -EPROTO;
 			sd = dataframe[idx++];
 			if (sd < 0 || sd >= SSP_SENSOR_MAX) {
 				dev_err(SSP_DEV,
@@ -292,10 +294,13 @@ static int ssp_parse_dataframe(struct ssp_data *data, char *dataframe, int len)
 
 			if (indio_devs[sd]) {
 				spd = iio_priv(indio_devs[sd]);
-				if (spd->process_data)
+				if (spd->process_data) {
+					if (idx >= len)
+						return -EPROTO;
 					spd->process_data(indio_devs[sd],
 							  &dataframe[idx],
 							  data->timestamp);
+				}
 			} else {
 				dev_err(SSP_DEV, "no client for frame\n");
 			}
@@ -303,6 +308,8 @@ static int ssp_parse_dataframe(struct ssp_data *data, char *dataframe, int len)
 			idx += ssp_offset_map[sd];
 			break;
 		case SSP_MSG2AP_INST_DEBUG_DATA:
+			if (idx >= len)
+				return -EPROTO;
 			sd = ssp_print_mcu_debug(dataframe, &idx, len);
 			if (sd) {
 				dev_err(SSP_DEV,

commit 7e185b64585b8ef67f621cb59c8ee7796d024e47
Author: Jiri Valek - 2N <valek@2n.cz>
Date:   Mon Sep 20 14:53:48 2021 +0200

    iio: light: opt3001: Fixed timeout error when 0 lux
    
    commit 26d90b5590579def54382a2fc34cfbe8518a9851 upstream.
    
    Reading from sensor returned timeout error under
    zero light conditions.
    
    Signed-off-by: Jiri Valek - 2N <valek@2n.cz>
    Fixes: ac663db3678a ("iio: light: opt3001: enable operation w/o IRQ")
    Link: https://lore.kernel.org/r/20210920125351.6569-1-valek@2n.cz
    Cc: <Stable@vger.kernel.org>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iio/light/opt3001.c b/drivers/iio/light/opt3001.c
index f9d13e4ec108..162eff78c673 100644
--- a/drivers/iio/light/opt3001.c
+++ b/drivers/iio/light/opt3001.c
@@ -283,6 +283,8 @@ static int opt3001_get_lux(struct opt3001 *opt, int *val, int *val2)
 		ret = wait_event_timeout(opt->result_ready_queue,
 				opt->result_ready,
 				msecs_to_jiffies(OPT3001_RESULT_READY_LONG));
+		if (ret == 0)
+			return -ETIMEDOUT;
 	} else {
 		/* Sleep for result ready time */
 		timeout = (opt->int_time == OPT3001_INT_TIME_SHORT) ?
@@ -319,9 +321,7 @@ static int opt3001_get_lux(struct opt3001 *opt, int *val, int *val2)
 		/* Disallow IRQ to access the device while lock is active */
 		opt->ok_to_ignore_lock = false;
 
-	if (ret == 0)
-		return -ETIMEDOUT;
-	else if (ret < 0)
+	if (ret < 0)
 		return ret;
 
 	if (opt->use_irq) {

commit 7bf8535bc137a8baff7bafda5cd138672a98c3ea
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Sat Aug 21 12:37:24 2021 +0200

    iio: adc128s052: Fix the error handling path of 'adc128_probe()'
    
    commit bbcf40816b547b3c37af49168950491d20d81ce1 upstream.
    
    A successful 'regulator_enable()' call should be balanced by a
    corresponding 'regulator_disable()' call in the error handling path of the
    probe, as already done in the remove function.
    
    Update the error handling path accordingly.
    
    Fixes: 913b86468674 ("iio: adc: Add TI ADC128S052")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Reviewed-by: Alexandru Ardelean <ardeleanalex@gmail.com>
    Link: https://lore.kernel.org/r/85189f1cfcf6f5f7b42d8730966f2a074b07b5f5.1629542160.git.christophe.jaillet@wanadoo.fr
    Cc: <Stable@vger.kernel.org>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iio/adc/ti-adc128s052.c b/drivers/iio/adc/ti-adc128s052.c
index 7cf39b3e2416..9986fc81b737 100644
--- a/drivers/iio/adc/ti-adc128s052.c
+++ b/drivers/iio/adc/ti-adc128s052.c
@@ -168,7 +168,13 @@ static int adc128_probe(struct spi_device *spi)
 	mutex_init(&adc->lock);
 
 	ret = iio_device_register(indio_dev);
+	if (ret)
+		goto err_disable_regulator;
 
+	return 0;
+
+err_disable_regulator:
+	regulator_disable(adc->reg);
 	return ret;
 }
 

commit 6a595db3e2192e61460f4476cfb7c2f31922e94e
Author: Billy Tsai <billy_tsai@aspeedtech.com>
Date:   Tue Aug 31 15:14:44 2021 +0800

    iio: adc: aspeed: set driver data when adc probe.
    
    commit eb795cd97365a3d3d9da3926d234a7bc32a3bb15 upstream.
    
    Fix the issue when adc remove will get the null driver data.
    
    Fixed: commit 573803234e72 ("iio: Aspeed ADC")
    Signed-off-by: Billy Tsai <billy_tsai@aspeedtech.com>
    Link: https://lore.kernel.org/r/20210831071458.2334-2-billy_tsai@aspeedtech.com
    Cc: <Stable@vger.kernel.org>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iio/adc/aspeed_adc.c b/drivers/iio/adc/aspeed_adc.c
index 9515ca165dfd..a8e6046d3948 100644
--- a/drivers/iio/adc/aspeed_adc.c
+++ b/drivers/iio/adc/aspeed_adc.c
@@ -188,6 +188,7 @@ static int aspeed_adc_probe(struct platform_device *pdev)
 
 	data = iio_priv(indio_dev);
 	data->dev = &pdev->dev;
+	platform_set_drvdata(pdev, indio_dev);
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	data->base = devm_ioremap_resource(&pdev->dev, res);

commit dee3e2342709e6cde931c912effd80818145ed82
Author: Borislav Petkov <bp@suse.de>
Date:   Wed Oct 6 19:34:55 2021 +0200

    x86/Kconfig: Do not enable AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT automatically
    
    commit 711885906b5c2df90746a51f4cd674f1ab9fbb1d upstream.
    
    This Kconfig option was added initially so that memory encryption is
    enabled by default on machines which support it.
    
    However, devices which have DMA masks that are less than the bit
    position of the encryption bit, aka C-bit, require the use of an IOMMU
    or the use of SWIOTLB.
    
    If the IOMMU is disabled or in passthrough mode, the kernel would switch
    to SWIOTLB bounce-buffering for those transfers.
    
    In order to avoid that,
    
      2cc13bb4f59f ("iommu: Disable passthrough mode when SME is active")
    
    disables the default IOMMU passthrough mode so that devices for which the
    default 256K DMA is insufficient, can use the IOMMU instead.
    
    However 2, there are cases where the IOMMU is disabled in the BIOS, etc.
    (think the usual hardware folk "oops, I dropped the ball there" cases) or a
    driver doesn't properly use the DMA APIs or a device has a firmware or
    hardware bug, e.g.:
    
      ea68573d408f ("drm/amdgpu: Fail to load on RAVEN if SME is active")
    
    However 3, in the above GPU use case, there are APIs like Vulkan and
    some OpenGL/OpenCL extensions which are under the assumption that
    user-allocated memory can be passed in to the kernel driver and both the
    GPU and CPU can do coherent and concurrent access to the same memory.
    That cannot work with SWIOTLB bounce buffers, of course.
    
    So, in order for those devices to function, drop the "default y" for the
    SME by default active option so that users who want to have SME enabled,
    will need to either enable it in their config or use "mem_encrypt=on" on
    the kernel command line.
    
     [ tlendacky: Generalize commit message. ]
    
    Fixes: 7744ccdbc16f ("x86/mm: Add Secure Memory Encryption (SME) support")
    Reported-by: Paul Menzel <pmenzel@molgen.mpg.de>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Acked-by: Alex Deucher <alexander.deucher@amd.com>
    Acked-by: Tom Lendacky <thomas.lendacky@amd.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lkml.kernel.org/r/8bbacd0e-4580-3194-19d2-a0ecad7df09c@molgen.mpg.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 3dd2949b2b35..6348b0964e9c 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -1496,7 +1496,6 @@ config AMD_MEM_ENCRYPT
 
 config AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT
 	bool "Activate AMD Secure Memory Encryption (SME) by default"
-	default y
 	depends on AMD_MEM_ENCRYPT
 	---help---
 	  Say yes to have system memory encrypted by default if running on

commit eb0fc8e7170e61eaf65d28dee4a8baf4e86b19ca
Author: Stephen Boyd <swboyd@chromium.org>
Date:   Wed Oct 13 13:45:11 2021 +0100

    nvmem: Fix shift-out-of-bound (UBSAN) with byte size cells
    
    commit 5d388fa01fa6eb310ac023a363a6cb216d9d8fe9 upstream.
    
    If a cell has 'nbits' equal to a multiple of BITS_PER_BYTE the logic
    
     *p &= GENMASK((cell->nbits%BITS_PER_BYTE) - 1, 0);
    
    will become undefined behavior because nbits modulo BITS_PER_BYTE is 0, and we
    subtract one from that making a large number that is then shifted more than the
    number of bits that fit into an unsigned long.
    
    UBSAN reports this problem:
    
     UBSAN: shift-out-of-bounds in drivers/nvmem/core.c:1386:8
     shift exponent 64 is too large for 64-bit type 'unsigned long'
     CPU: 6 PID: 7 Comm: kworker/u16:0 Not tainted 5.15.0-rc3+ #9
     Hardware name: Google Lazor (rev3+) with KB Backlight (DT)
     Workqueue: events_unbound deferred_probe_work_func
     Call trace:
      dump_backtrace+0x0/0x170
      show_stack+0x24/0x30
      dump_stack_lvl+0x64/0x7c
      dump_stack+0x18/0x38
      ubsan_epilogue+0x10/0x54
      __ubsan_handle_shift_out_of_bounds+0x180/0x194
      __nvmem_cell_read+0x1ec/0x21c
      nvmem_cell_read+0x58/0x94
      nvmem_cell_read_variable_common+0x4c/0xb0
      nvmem_cell_read_variable_le_u32+0x40/0x100
      a6xx_gpu_init+0x170/0x2f4
      adreno_bind+0x174/0x284
      component_bind_all+0xf0/0x264
      msm_drm_bind+0x1d8/0x7a0
      try_to_bring_up_master+0x164/0x1ac
      __component_add+0xbc/0x13c
      component_add+0x20/0x2c
      dp_display_probe+0x340/0x384
      platform_probe+0xc0/0x100
      really_probe+0x110/0x304
      __driver_probe_device+0xb8/0x120
      driver_probe_device+0x4c/0xfc
      __device_attach_driver+0xb0/0x128
      bus_for_each_drv+0x90/0xdc
      __device_attach+0xc8/0x174
      device_initial_probe+0x20/0x2c
      bus_probe_device+0x40/0xa4
      deferred_probe_work_func+0x7c/0xb8
      process_one_work+0x128/0x21c
      process_scheduled_works+0x40/0x54
      worker_thread+0x1ec/0x2a8
      kthread+0x138/0x158
      ret_from_fork+0x10/0x20
    
    Fix it by making sure there are any bits to mask out.
    
    Fixes: 69aba7948cbe ("nvmem: Add a simple NVMEM framework for consumers")
    Cc: Douglas Anderson <dianders@chromium.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: Stephen Boyd <swboyd@chromium.org>
    Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
    Link: https://lore.kernel.org/r/20211013124511.18726-1-srinivas.kandagatla@linaro.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c
index 30c040786fde..2e77d49c2657 100644
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -1061,7 +1061,8 @@ static void nvmem_shift_read_buffer_in_place(struct nvmem_cell *cell, void *buf)
 		*p-- = 0;
 
 	/* clear msb bits if any leftover in the last byte */
-	*p &= GENMASK((cell->nbits%BITS_PER_BYTE) - 1, 0);
+	if (cell->nbits % BITS_PER_BYTE)
+		*p &= GENMASK((cell->nbits % BITS_PER_BYTE) - 1, 0);
 }
 
 static int __nvmem_cell_read(struct nvmem_device *nvmem,

commit ecbbc70f1bbc95bc23f0c68553de5b49fa69c829
Author: Halil Pasic <pasic@linux.ibm.com>
Date:   Mon Oct 11 07:39:21 2021 +0200

    virtio: write back F_VERSION_1 before validate
    
    commit 2f9a174f918e29608564c7a4e8329893ab604fb4 upstream.
    
    The virtio specification virtio-v1.1-cs01 states: "Transitional devices
    MUST detect Legacy drivers by detecting that VIRTIO_F_VERSION_1 has not
    been acknowledged by the driver."  This is exactly what QEMU as of 6.1
    has done relying solely on VIRTIO_F_VERSION_1 for detecting that.
    
    However, the specification also says: "... the driver MAY read (but MUST
    NOT write) the device-specific configuration fields to check that it can
    support the device ..." before setting FEATURES_OK.
    
    In that case, any transitional device relying solely on
    VIRTIO_F_VERSION_1 for detecting legacy drivers will return data in
    legacy format.  In particular, this implies that it is in big endian
    format for big endian guests. This naturally confuses the driver which
    expects little endian in the modern mode.
    
    It is probably a good idea to amend the spec to clarify that
    VIRTIO_F_VERSION_1 can only be relied on after the feature negotiation
    is complete. Before validate callback existed, config space was only
    read after FEATURES_OK. However, we already have two regressions, so
    let's address this here as well.
    
    The regressions affect the VIRTIO_NET_F_MTU feature of virtio-net and
    the VIRTIO_BLK_F_BLK_SIZE feature of virtio-blk for BE guests when
    virtio 1.0 is used on both sides. The latter renders virtio-blk unusable
    with DASD backing, because things simply don't work with the default.
    See Fixes tags for relevant commits.
    
    For QEMU, we can work around the issue by writing out the feature bits
    with VIRTIO_F_VERSION_1 bit set.  We (ab)use the finalize_features
    config op for this. This isn't enough to address all vhost devices since
    these do not get the features until FEATURES_OK, however it looks like
    the affected devices actually never handled the endianness for legacy
    mode correctly, so at least that's not a regression.
    
    No devices except virtio net and virtio blk seem to be affected.
    
    Long term the right thing to do is to fix the hypervisors.
    
    Cc: <stable@vger.kernel.org> #v4.11
    Signed-off-by: Halil Pasic <pasic@linux.ibm.com>
    Fixes: 82e89ea077b9 ("virtio-blk: Add validation for block size in config space")
    Fixes: fe36cbe0671e ("virtio_net: clear MTU when out of range")
    Reported-by: markver@us.ibm.com
    Reviewed-by: Cornelia Huck <cohuck@redhat.com>
    Link: https://lore.kernel.org/r/20211011053921.1198936-1-pasic@linux.ibm.com
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/virtio/virtio.c b/drivers/virtio/virtio.c
index 59e36ef4920f..74f43ef2fb0f 100644
--- a/drivers/virtio/virtio.c
+++ b/drivers/virtio/virtio.c
@@ -222,6 +222,17 @@ static int virtio_dev_probe(struct device *_d)
 		driver_features_legacy = driver_features;
 	}
 
+	/*
+	 * Some devices detect legacy solely via F_VERSION_1. Write
+	 * F_VERSION_1 to force LE config space accesses before FEATURES_OK for
+	 * these when needed.
+	 */
+	if (drv->validate && !virtio_legacy_is_little_endian()
+			  && device_features & BIT_ULL(VIRTIO_F_VERSION_1)) {
+		dev->features = BIT_ULL(VIRTIO_F_VERSION_1);
+		dev->config->finalize_features(dev);
+	}
+
 	if (device_features & (1ULL << VIRTIO_F_VERSION_1))
 		dev->features = driver_features & device_features;
 	else

commit e97c3fb5d0788c3daed0ccfc30819132c9b453e2
Author: Tomaz Solc <tomaz.solc@tablix.org>
Date:   Wed Oct 6 14:57:50 2021 +0200

    USB: serial: option: add prod. id for Quectel EG91
    
    commit c184accc4a42c7872dc8e8d0fc97a740dc61fe24 upstream.
    
    Adding support for Quectel EG91 LTE module.
    
    The interface layout is same as for EG95.
    
    usb-devices output:
    T:  Bus=01 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#=  3 Spd=480 MxCh= 0
    D:  Ver= 2.00 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs=  1
    P:  Vendor=2c7c ProdID=0191 Rev=03.18
    S:  Manufacturer=Android
    S:  Product=Android
    C:  #Ifs= 5 Cfg#= 1 Atr=a0 MxPwr=500mA
    I:  If#=0x0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
    I:  If#=0x1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none)
    I:  If#=0x2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none)
    I:  If#=0x3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none)
    I:  If#=0x4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan
    
    Interfaces:
    
    0: Diag
    1: GNSS
    2: AT-command interface/modem
    3: Modem
    4: QMI
    
    Signed-off-by: Tomaz Solc <tomaz.solc@tablix.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index 97a57c5be2f9..eaf118ee2a86 100644
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -246,6 +246,7 @@ static void option_instat_callback(struct urb *urb);
 /* 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
@@ -1112,6 +1113,9 @@ static const struct usb_device_id option_ids[] = {
 	{ 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) },

commit af18b129e060a1d65e2337ab3e30a3873453ac28
Author: Daniele Palmas <dnlplm@gmail.com>
Date:   Mon Oct 4 12:56:55 2021 +0200

    USB: serial: option: add Telit LE910Cx composition 0x1204
    
    commit f5a8a07edafed8bede17a95ef8940fe3a57a77d5 upstream.
    
    Add the following Telit LE910Cx composition:
    
    0x1204: tty, adb, mbim, tty, tty, tty, tty
    
    Signed-off-by: Daniele Palmas <dnlplm@gmail.com>
    Link: https://lore.kernel.org/r/20211004105655.8515-1-dnlplm@gmail.com
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index 06c95f9a5118..97a57c5be2f9 100644
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -1229,6 +1229,8 @@ static const struct usb_device_id option_ids[] = {
 	  .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),

commit 9b1483f0f9c74db531ccee1ea787947c26c64588
Author: Yu-Tung Chang <mtwget@gmail.com>
Date:   Thu Sep 30 10:11:12 2021 +0800

    USB: serial: option: add Quectel EC200S-CN module support
    
    commit 2263eb7370060bdb0013bc14e1a7c9bf33617a55 upstream.
    
    Add usb product id of the Quectel EC200S-CN module.
    
    usb-devices output for 0x6002:
    T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  3 Spd=480 MxCh= 0
    D:  Ver= 2.00 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs=  1
    P:  Vendor=2c7c ProdID=6002 Rev=03.18
    S:  Manufacturer=Android
    S:  Product=Android
    S:  SerialNumber=0000
    C:  #Ifs= 5 Cfg#= 1 Atr=e0 MxPwr=500mA
    I:  If#=0x0 Alt= 0 #EPs= 1 Cls=02(commc) Sub=06 Prot=00 Driver=cdc_ether
    I:  If#=0x1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=cdc_ether
    I:  If#=0x2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none)
    I:  If#=0x3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none)
    I:  If#=0x4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none)
    
    Signed-off-by: Yu-Tung Chang <mtwget@gmail.com>
    Link: https://lore.kernel.org/r/20210930021112.330396-1-mtwget@gmail.com
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index 524b3c6e96e2..06c95f9a5118 100644
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -251,6 +251,7 @@ static void option_instat_callback(struct urb *urb);
 #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
@@ -1128,6 +1129,7 @@ static const struct usb_device_id option_ids[] = {
 	{ 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) },

commit 8d44e525dc475df3984e6e53a6642ec6bc67ed90
Author: Aleksander Morgado <aleksander@aleksander.es>
Date:   Thu Oct 7 14:25:01 2021 +0200

    USB: serial: qcserial: add EM9191 QDL support
    
    commit 11c52d250b34a0862edc29db03fbec23b30db6da upstream.
    
    When the module boots into QDL download mode it exposes the 1199:90d2
    ids, which can be mapped to the qcserial driver, and used to run
    firmware upgrades (e.g. with the qmi-firmware-update program).
    
      T:  Bus=01 Lev=03 Prnt=08 Port=03 Cnt=01 Dev#= 10 Spd=480 MxCh= 0
      D:  Ver= 2.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
      P:  Vendor=1199 ProdID=90d2 Rev=00.00
      S:  Manufacturer=Sierra Wireless, Incorporated
      S:  Product=Sierra Wireless EM9191
      S:  SerialNumber=8W0382004102A109
      C:  #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=2mA
      I:  If#=0x0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=10 Driver=qcserial
    
    Signed-off-by: Aleksander Morgado <aleksander@aleksander.es>
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c
index 0f60363c1bbc..b1b9923162a0 100644
--- a/drivers/usb/serial/qcserial.c
+++ b/drivers/usb/serial/qcserial.c
@@ -165,6 +165,7 @@ static const struct usb_device_id id_table[] = {
 	{DEVICE_SWI(0x1199, 0x907b)},	/* Sierra Wireless EM74xx */
 	{DEVICE_SWI(0x1199, 0x9090)},	/* Sierra Wireless EM7565 QDL */
 	{DEVICE_SWI(0x1199, 0x9091)},	/* Sierra Wireless EM7565 */
+	{DEVICE_SWI(0x1199, 0x90d2)},	/* Sierra Wireless EM9191 QDL */
 	{DEVICE_SWI(0x413c, 0x81a2)},	/* Dell Wireless 5806 Gobi(TM) 4G LTE Mobile Broadband Card */
 	{DEVICE_SWI(0x413c, 0x81a3)},	/* Dell Wireless 5570 HSPA+ (42Mbps) Mobile Broadband Card */
 	{DEVICE_SWI(0x413c, 0x81a4)},	/* Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card */

commit 77558d69a2c844db9913f0d954c9425c5968395c
Author: Michael Cullen <michael@michaelcullen.name>
Date:   Fri Oct 15 13:17:50 2021 -0700

    Input: xpad - add support for another USB ID of Nacon GC-100
    
    commit 3378a07daa6cdd11e042797454c706d1c69f9ca6 upstream.
    
    The Nacon GX100XF is already mapped, but it seems there is a Nacon
    GC-100 (identified as NC5136Wht PCGC-100WHITE though I believe other
    colours exist) with a different USB ID when in XInput mode.
    
    Signed-off-by: Michael Cullen <michael@michaelcullen.name>
    Link: https://lore.kernel.org/r/20211015192051.5196-1-michael@michaelcullen.name
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
index eacb8af8b4fc..4423db71eda7 100644
--- a/drivers/input/joystick/xpad.c
+++ b/drivers/input/joystick/xpad.c
@@ -345,6 +345,7 @@ static const struct xpad_device {
 	{ 0x24c6, 0x5b03, "Thrustmaster Ferrari 458 Racing Wheel", 0, XTYPE_XBOX360 },
 	{ 0x24c6, 0x5d04, "Razer Sabertooth", 0, XTYPE_XBOX360 },
 	{ 0x24c6, 0xfafe, "Rock Candy Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
+	{ 0x3285, 0x0607, "Nacon GC-100", 0, XTYPE_XBOX360 },
 	{ 0x3767, 0x0101, "Fanatec Speedster 3 Forceshock Wheel", 0, XTYPE_XBOX },
 	{ 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX },
 	{ 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN }
@@ -461,6 +462,7 @@ static const struct usb_device_id xpad_table[] = {
 	XPAD_XBOXONE_VENDOR(0x24c6),		/* PowerA Controllers */
 	XPAD_XBOXONE_VENDOR(0x2e24),		/* Hyperkin Duke X-Box One pad */
 	XPAD_XBOX360_VENDOR(0x2f24),		/* GameSir Controllers */
+	XPAD_XBOX360_VENDOR(0x3285),		/* Nacon GC-100 */
 	{ }
 };
 

commit e923bce31ffefe4f60edfc6b84f62d4a858f3676
Author: Miquel Raynal <miquel.raynal@bootlin.com>
Date:   Wed Oct 6 00:16:31 2021 +0200

    usb: musb: dsps: Fix the probe error path
    
    commit c2115b2b16421d93d4993f3fe4c520e91d6fe801 upstream.
    
    Commit 7c75bde329d7 ("usb: musb: musb_dsps: request_irq() after
    initializing musb") has inverted the calls to
    dsps_setup_optional_vbus_irq() and dsps_create_musb_pdev() without
    updating correctly the error path. dsps_create_musb_pdev() allocates and
    registers a new platform device which must be unregistered and freed
    with platform_device_unregister(), and this is missing upon
    dsps_setup_optional_vbus_irq() error.
    
    While on the master branch it seems not to trigger any issue, I observed
    a kernel crash because of a NULL pointer dereference with a v5.10.70
    stable kernel where the patch mentioned above was backported. With this
    kernel version, -EPROBE_DEFER is returned the first time
    dsps_setup_optional_vbus_irq() is called which triggers the probe to
    error out without unregistering the platform device. Unfortunately, on
    the Beagle Bone Black Wireless, the platform device still living in the
    system is being used by the USB Ethernet gadget driver, which during the
    boot phase triggers the crash.
    
    My limited knowledge of the musb world prevents me to revert this commit
    which was sent to silence a robot warning which, as far as I understand,
    does not make sense. The goal of this patch was to prevent an IRQ to
    fire before the platform device being registered. I think this cannot
    ever happen due to the fact that enabling the interrupts is done by the
    ->enable() callback of the platform musb device, and this platform
    device must be already registered in order for the core or any other
    user to use this callback.
    
    Hence, I decided to fix the error path, which might prevent future
    errors on mainline kernels while also fixing older ones.
    
    Fixes: 7c75bde329d7 ("usb: musb: musb_dsps: request_irq() after initializing musb")
    Cc: stable@vger.kernel.org
    Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
    Link: https://lore.kernel.org/r/20211005221631.1529448-1-miquel.raynal@bootlin.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
index 2f6708b8b5c2..892d74507890 100644
--- a/drivers/usb/musb/musb_dsps.c
+++ b/drivers/usb/musb/musb_dsps.c
@@ -901,11 +901,13 @@ static int dsps_probe(struct platform_device *pdev)
 	if (usb_get_dr_mode(&pdev->dev) == USB_DR_MODE_PERIPHERAL) {
 		ret = dsps_setup_optional_vbus_irq(pdev, glue);
 		if (ret)
-			goto err;
+			goto unregister_pdev;
 	}
 
 	return 0;
 
+unregister_pdev:
+	platform_device_unregister(glue->musb);
 err:
 	pm_runtime_disable(&pdev->dev);
 	iounmap(glue->usbss_base);

commit 853985927c5629bbe43e3f1abb9a5c673b86bd61
Author: Zhang Jianhua <chris.zjh@huawei.com>
Date:   Thu Sep 23 10:53:40 2021 +0800

    efi: Change down_interruptible() in virt_efi_reset_system() to down_trylock()
    
    commit 38fa3206bf441911258e5001ac8b6738693f8d82 upstream.
    
    While reboot the system by sysrq, the following bug will be occur.
    
    BUG: sleeping function called from invalid context at kernel/locking/semaphore.c:90
    in_atomic(): 0, irqs_disabled(): 128, non_block: 0, pid: 10052, name: rc.shutdown
    CPU: 3 PID: 10052 Comm: rc.shutdown Tainted: G        W O      5.10.0 #1
    Call trace:
     dump_backtrace+0x0/0x1c8
     show_stack+0x18/0x28
     dump_stack+0xd0/0x110
     ___might_sleep+0x14c/0x160
     __might_sleep+0x74/0x88
     down_interruptible+0x40/0x118
     virt_efi_reset_system+0x3c/0xd0
     efi_reboot+0xd4/0x11c
     machine_restart+0x60/0x9c
     emergency_restart+0x1c/0x2c
     sysrq_handle_reboot+0x1c/0x2c
     __handle_sysrq+0xd0/0x194
     write_sysrq_trigger+0xbc/0xe4
     proc_reg_write+0xd4/0xf0
     vfs_write+0xa8/0x148
     ksys_write+0x6c/0xd8
     __arm64_sys_write+0x18/0x28
     el0_svc_common.constprop.3+0xe4/0x16c
     do_el0_svc+0x1c/0x2c
     el0_svc+0x20/0x30
     el0_sync_handler+0x80/0x17c
     el0_sync+0x158/0x180
    
    The reason for this problem is that irq has been disabled in
    machine_restart() and then it calls down_interruptible() in
    virt_efi_reset_system(), which would occur sleep in irq context,
    it is dangerous! Commit 99409b935c9a("locking/semaphore: Add
    might_sleep() to down_*() family") add might_sleep() in
    down_interruptible(), so the bug info is here. down_trylock()
    can solve this problem, cause there is no might_sleep.
    
    --------
    
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Zhang Jianhua <chris.zjh@huawei.com>
    Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/firmware/efi/runtime-wrappers.c b/drivers/firmware/efi/runtime-wrappers.c
index b31e3d3729a6..0a4309fe01b6 100644
--- a/drivers/firmware/efi/runtime-wrappers.c
+++ b/drivers/firmware/efi/runtime-wrappers.c
@@ -395,7 +395,7 @@ static void virt_efi_reset_system(int reset_type,
 				  unsigned long data_size,
 				  efi_char16_t *data)
 {
-	if (down_interruptible(&efi_runtime_lock)) {
+	if (down_trylock(&efi_runtime_lock)) {
 		pr_warn("failed to invoke the reset_system() runtime service:\n"
 			"could not get exclusive access to the firmware\n");
 		return;

commit 6dca770d20f0e6ff4ede64211696b3553ec5d163
Author: Ard Biesheuvel <ardb@kernel.org>
Date:   Wed Sep 1 08:33:19 2021 +0200

    efi/cper: use stack buffer for error record decoding
    
    commit b3a72ca80351917cc23f9e24c35f3c3979d3c121 upstream.
    
    Joe reports that using a statically allocated buffer for converting CPER
    error records into human readable text is probably a bad idea. Even
    though we are not aware of any actual issues, a stack buffer is clearly
    a better choice here anyway, so let's move the buffer into the stack
    frames of the two functions that refer to it.
    
    Cc: <stable@vger.kernel.org>
    Reported-by: Joe Perches <joe@perches.com>
    Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/firmware/efi/cper.c b/drivers/firmware/efi/cper.c
index 97da083afd32..aa4abf1a94a1 100644
--- a/drivers/firmware/efi/cper.c
+++ b/drivers/firmware/efi/cper.c
@@ -37,8 +37,6 @@
 #include <acpi/ghes.h>
 #include <ras/ras_event.h>
 
-static char rcd_decode_str[CPER_REC_LEN];
-
 /*
  * CPER record ID need to be unique even after reboot, because record
  * ID is used as index for ERST storage, while CPER records from
@@ -311,6 +309,7 @@ const char *cper_mem_err_unpack(struct trace_seq *p,
 				struct cper_mem_err_compact *cmem)
 {
 	const char *ret = trace_seq_buffer_ptr(p);
+	char rcd_decode_str[CPER_REC_LEN];
 
 	if (cper_mem_err_location(cmem, rcd_decode_str))
 		trace_seq_printf(p, "%s", rcd_decode_str);
@@ -325,6 +324,7 @@ static void cper_print_mem(const char *pfx, const struct cper_sec_mem_err *mem,
 	int len)
 {
 	struct cper_mem_err_compact cmem;
+	char rcd_decode_str[CPER_REC_LEN];
 
 	/* Don't trust UEFI 2.1/2.2 structure with bad validation bits */
 	if (len == sizeof(struct cper_sec_mem_err_old) &&

commit dbc03527872da4f4534d26076a0489711c7c3bab
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Mon Sep 27 14:13:57 2021 +0200

    cb710: avoid NULL pointer subtraction
    
    commit 42641042c10c757fe10cc09088cf3f436cec5007 upstream.
    
    clang-14 complains about an unusual way of converting a pointer to
    an integer:
    
    drivers/misc/cb710/sgbuf2.c:50:15: error: performing pointer subtraction with a null pointer has undefined behavior [-Werror,-Wnull-pointer-subtraction]
            return ((ptr - NULL) & 3) != 0;
    
    Replace this with a normal cast to uintptr_t.
    
    Fixes: 5f5bac8272be ("mmc: Driver for CB710/720 memory card reader (MMC part)")
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Link: https://lore.kernel.org/r/20210927121408.939246-1-arnd@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/misc/cb710/sgbuf2.c b/drivers/misc/cb710/sgbuf2.c
index 2a40d0efdff5..4d2a72a537d4 100644
--- a/drivers/misc/cb710/sgbuf2.c
+++ b/drivers/misc/cb710/sgbuf2.c
@@ -50,7 +50,7 @@ static inline bool needs_unaligned_copy(const void *ptr)
 #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
 	return false;
 #else
-	return ((ptr - NULL) & 3) != 0;
+	return ((uintptr_t)ptr & 3) != 0;
 #endif
 }
 

commit c47709faa11395cebfed10bf9b0ffea3ce2f156a
Author: Nikolay Martynov <mar.kolya@gmail.com>
Date:   Fri Oct 8 12:25:47 2021 +0300

    xhci: Enable trust tx length quirk for Fresco FL11 USB controller
    
    commit ea0f69d8211963c4b2cc1998b86779a500adb502 upstream.
    
    Tested on SD5200T TB3 dock which has Fresco Logic FL1100 USB 3.0 Host
    Controller.
    Before this patch streaming video from USB cam made mouse and keyboard
    connected to the same USB bus unusable. Also video was jerky.
    With this patch streaming video doesn't have any effect on other
    periferals and video is smooth.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Nikolay Martynov <mar.kolya@gmail.com>
    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Link: https://lore.kernel.org/r/20211008092547.3996295-6-mathias.nyman@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
index 19485c076ba3..d707993ac921 100644
--- a/drivers/usb/host/xhci-pci.c
+++ b/drivers/usb/host/xhci-pci.c
@@ -28,6 +28,7 @@
 #define PCI_VENDOR_ID_FRESCO_LOGIC	0x1b73
 #define PCI_DEVICE_ID_FRESCO_LOGIC_PDK	0x1000
 #define PCI_DEVICE_ID_FRESCO_LOGIC_FL1009	0x1009
+#define PCI_DEVICE_ID_FRESCO_LOGIC_FL1100	0x1100
 #define PCI_DEVICE_ID_FRESCO_LOGIC_FL1400	0x1400
 
 #define PCI_VENDOR_ID_ETRON		0x1b6f
@@ -89,6 +90,7 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
 	/* Look for vendor-specific quirks */
 	if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC &&
 			(pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK ||
+			 pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_FL1100 ||
 			 pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_FL1400)) {
 		if (pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK &&
 				pdev->revision == 0x0) {

commit 62c182b5e763e5f4062e72678e72ce3e02dd4d1b
Author: Pavankumar Kondeti <pkondeti@codeaurora.org>
Date:   Fri Oct 8 12:25:46 2021 +0300

    xhci: Fix command ring pointer corruption while aborting a command
    
    commit ff0e50d3564f33b7f4b35cadeabd951d66cfc570 upstream.
    
    The command ring pointer is located at [6:63] bits of the command
    ring control register (CRCR). All the control bits like command stop,
    abort are located at [0:3] bits. While aborting a command, we read the
    CRCR and set the abort bit and write to the CRCR. The read will always
    give command ring pointer as all zeros. So we essentially write only
    the control bits. Since we split the 64 bit write into two 32 bit writes,
    there is a possibility of xHC command ring stopped before the upper
    dword (all zeros) is written. If that happens, xHC updates the upper
    dword of its internal command ring pointer with all zeros. Next time,
    when the command ring is restarted, we see xHC memory access failures.
    Fix this issue by only writing to the lower dword of CRCR where all
    control bits are located.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Pavankumar Kondeti <pkondeti@codeaurora.org>
    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Link: https://lore.kernel.org/r/20211008092547.3996295-5-mathias.nyman@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index 7c981ad34251..04c04328d075 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -339,16 +339,22 @@ static void xhci_handle_stopped_cmd_ring(struct xhci_hcd *xhci,
 /* Must be called with xhci->lock held, releases and aquires lock back */
 static int xhci_abort_cmd_ring(struct xhci_hcd *xhci, unsigned long flags)
 {
-	u64 temp_64;
+	u32 temp_32;
 	int ret;
 
 	xhci_dbg(xhci, "Abort command ring\n");
 
 	reinit_completion(&xhci->cmd_ring_stop_completion);
 
-	temp_64 = xhci_read_64(xhci, &xhci->op_regs->cmd_ring);
-	xhci_write_64(xhci, temp_64 | CMD_RING_ABORT,
-			&xhci->op_regs->cmd_ring);
+	/*
+	 * The control bits like command stop, abort are located in lower
+	 * dword of the command ring control register. Limit the write
+	 * to the lower dword to avoid corrupting the command ring pointer
+	 * in case if the command ring is stopped by the time upper dword
+	 * is written.
+	 */
+	temp_32 = readl(&xhci->op_regs->cmd_ring);
+	writel(temp_32 | CMD_RING_ABORT, &xhci->op_regs->cmd_ring);
 
 	/* Section 4.6.1.2 of xHCI 1.0 spec says software should also time the
 	 * completion of the Command Abort operation. If CRR is not negated in 5

commit 310fa2019f5df297f7fa82bedfe2eba820cd61db
Author: Jonathan Bell <jonathan@raspberrypi.com>
Date:   Fri Oct 8 12:25:43 2021 +0300

    xhci: guard accesses to ep_state in xhci_endpoint_reset()
    
    commit a01ba2a3378be85538e0183ae5367c1bc1d5aaf3 upstream.
    
    See https://github.com/raspberrypi/linux/issues/3981
    
    Two read-modify-write cycles on ep->ep_state are not guarded by
    xhci->lock. Fix these.
    
    Fixes: f5249461b504 ("xhci: Clear the host side toggle manually when endpoint is soft reset")
    Cc: stable@vger.kernel.org
    Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Link: https://lore.kernel.org/r/20211008092547.3996295-2-mathias.nyman@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index bebab0ec2978..c6eec712cc47 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -3093,10 +3093,13 @@ static void xhci_endpoint_reset(struct usb_hcd *hcd,
 	ep = &vdev->eps[ep_index];
 
 	/* Bail out if toggle is already being cleared by a endpoint reset */
+	spin_lock_irqsave(&xhci->lock, flags);
 	if (ep->ep_state & EP_HARD_CLEAR_TOGGLE) {
 		ep->ep_state &= ~EP_HARD_CLEAR_TOGGLE;
+		spin_unlock_irqrestore(&xhci->lock, flags);
 		return;
 	}
+	spin_unlock_irqrestore(&xhci->lock, flags);
 	/* Only interrupt and bulk ep's use data toggle, USB2 spec 5.5.4-> */
 	if (usb_endpoint_xfer_control(&host_ep->desc) ||
 	    usb_endpoint_xfer_isoc(&host_ep->desc))
@@ -3182,8 +3185,10 @@ static void xhci_endpoint_reset(struct usb_hcd *hcd,
 	xhci_free_command(xhci, cfg_cmd);
 cleanup:
 	xhci_free_command(xhci, stop_cmd);
+	spin_lock_irqsave(&xhci->lock, flags);
 	if (ep->ep_state & EP_SOFT_CLEAR_TOGGLE)
 		ep->ep_state &= ~EP_SOFT_CLEAR_TOGGLE;
+	spin_unlock_irqrestore(&xhci->lock, flags);
 }
 
 static int xhci_check_streams_endpoint(struct xhci_hcd *xhci,

commit f67443c5faffde988543d0ebe16965a3812e1598
Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date:   Fri Oct 1 20:36:44 2021 +0300

    mei: me: add Ice Lake-N device id.
    
    commit 75c10c5e7a715550afdd51ef8cfd1d975f48f9e1 upstream.
    
    Add Ice Lake-N device ID.
    
    The device can be found on MacBookPro16,2 [1].
    
    [1]: https://linux-hardware.org/?probe=f1c5cf0c43
    
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20211001173644.16068-1-andriy.shevchenko@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/misc/mei/hw-me-regs.h b/drivers/misc/mei/hw-me-regs.h
index 2ac1dc5104b7..6bbc78698b77 100644
--- a/drivers/misc/mei/hw-me-regs.h
+++ b/drivers/misc/mei/hw-me-regs.h
@@ -150,6 +150,7 @@
 #define MEI_DEV_ID_CDF        0x18D3  /* Cedar Fork */
 
 #define MEI_DEV_ID_ICP_LP     0x34E0  /* Ice Lake Point LP */
+#define MEI_DEV_ID_ICP_N      0x38E0  /* Ice Lake Point N */
 
 #define MEI_DEV_ID_TGP_LP     0xA0E0  /* Tiger Lake Point LP */
 
diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c
index b4bf12f27caf..35086f67d209 100644
--- a/drivers/misc/mei/pci-me.c
+++ b/drivers/misc/mei/pci-me.c
@@ -112,6 +112,7 @@ static const struct pci_device_id mei_me_pci_tbl[] = {
 	{MEI_PCI_DEVICE(MEI_DEV_ID_CMP_H_3, MEI_ME_PCH8_CFG)},
 
 	{MEI_PCI_DEVICE(MEI_DEV_ID_ICP_LP, MEI_ME_PCH12_CFG)},
+	{MEI_PCI_DEVICE(MEI_DEV_ID_ICP_N, MEI_ME_PCH12_CFG)},
 
 	{MEI_PCI_DEVICE(MEI_DEV_ID_TGP_LP, MEI_ME_PCH12_CFG)},
 

commit f961a224e73138a93f4df8503ecd8c6928291c53
Author: James Morse <james.morse@arm.com>
Date:   Fri Sep 17 16:59:58 2021 +0000

    x86/resctrl: Free the ctrlval arrays when domain_setup_mon_state() fails
    
    commit 64e87d4bd3201bf8a4685083ee4daf5c0d001452 upstream.
    
    domain_add_cpu() is called whenever a CPU is brought online. The
    earlier call to domain_setup_ctrlval() allocates the control value
    arrays.
    
    If domain_setup_mon_state() fails, the control value arrays are not
    freed.
    
    Add the missing kfree() calls.
    
    Fixes: 1bd2a63b4f0de ("x86/intel_rdt/mba_sc: Add initialization support")
    Fixes: edf6fa1c4a951 ("x86/intel_rdt/cqm: Add RMID (Resource monitoring ID) management")
    Signed-off-by: James Morse <james.morse@arm.com>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Acked-by: Reinette Chatre <reinette.chatre@intel.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lkml.kernel.org/r/20210917165958.28313-1-james.morse@arm.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kernel/cpu/intel_rdt.c b/arch/x86/kernel/cpu/intel_rdt.c
index b32fa6bcf811..d4993d42b741 100644
--- a/arch/x86/kernel/cpu/intel_rdt.c
+++ b/arch/x86/kernel/cpu/intel_rdt.c
@@ -563,6 +563,8 @@ static void domain_add_cpu(int cpu, struct rdt_resource *r)
 	}
 
 	if (r->mon_capable && domain_setup_mon_state(r, d)) {
+		kfree(d->ctrl_val);
+		kfree(d->mbps_val);
 		kfree(d);
 		return;
 	}

commit a262f5711aba89acaac59b1f8bb9629f3453da36
Author: Filipe Manana <fdmanana@suse.com>
Date:   Fri Oct 1 13:48:18 2021 +0100

    btrfs: check for error when looking up inode during dir entry replay
    
    commit cfd312695b71df04c3a2597859ff12c470d1e2e4 upstream.
    
    At replay_one_name(), we are treating any error from btrfs_lookup_inode()
    as if the inode does not exists. Fix this by checking for an error and
    returning it to the caller.
    
    CC: stable@vger.kernel.org # 4.14+
    Signed-off-by: Filipe Manana <fdmanana@suse.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index c58a4dff77cb..e0fc8c094846 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -1871,8 +1871,8 @@ static noinline int replay_one_name(struct btrfs_trans_handle *trans,
 	struct btrfs_key log_key;
 	struct inode *dir;
 	u8 log_type;
-	int exists;
-	int ret = 0;
+	bool exists;
+	int ret;
 	bool update_size = (key->type == BTRFS_DIR_INDEX_KEY);
 	bool name_added = false;
 
@@ -1892,12 +1892,12 @@ static noinline int replay_one_name(struct btrfs_trans_handle *trans,
 		   name_len);
 
 	btrfs_dir_item_key_to_cpu(eb, di, &log_key);
-	exists = btrfs_lookup_inode(trans, root, path, &log_key, 0);
-	if (exists == 0)
-		exists = 1;
-	else
-		exists = 0;
+	ret = btrfs_lookup_inode(trans, root, path, &log_key, 0);
 	btrfs_release_path(path);
+	if (ret < 0)
+		goto out;
+	exists = (ret == 0);
+	ret = 0;
 
 	if (key->type == BTRFS_DIR_ITEM_KEY) {
 		dst_di = btrfs_lookup_dir_item(trans, root, path, key->objectid,

commit 00c93450db581d5c83f3af9a6c169270e9cd863e
Author: Filipe Manana <fdmanana@suse.com>
Date:   Fri Oct 1 13:52:32 2021 +0100

    btrfs: deal with errors when adding inode reference during log replay
    
    commit 52db77791fe24538c8aa2a183248399715f6b380 upstream.
    
    At __inode_add_ref(), we treating any error returned from
    btrfs_lookup_dir_item() or from btrfs_lookup_dir_index_item() as meaning
    that there is no existing directory entry in the fs/subvolume tree.
    This is not correct since we can get errors such as, for example, -EIO
    when reading extent buffers while searching the fs/subvolume's btree.
    
    So fix that and return the error to the caller when it is not -ENOENT.
    
    CC: stable@vger.kernel.org # 4.14+
    Signed-off-by: Filipe Manana <fdmanana@suse.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index 85c32b94479a..c58a4dff77cb 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -1141,7 +1141,10 @@ static inline int __add_inode_ref(struct btrfs_trans_handle *trans,
 	/* look for a conflicting sequence number */
 	di = btrfs_lookup_dir_index_item(trans, root, path, btrfs_ino(dir),
 					 ref_index, name, namelen, 0);
-	if (di && !IS_ERR(di)) {
+	if (IS_ERR(di)) {
+		if (PTR_ERR(di) != -ENOENT)
+			return PTR_ERR(di);
+	} else if (di) {
 		ret = drop_one_dir_item(trans, root, path, dir, di);
 		if (ret)
 			return ret;
@@ -1151,7 +1154,9 @@ static inline int __add_inode_ref(struct btrfs_trans_handle *trans,
 	/* look for a conflicing name */
 	di = btrfs_lookup_dir_item(trans, root, path, btrfs_ino(dir),
 				   name, namelen, 0);
-	if (di && !IS_ERR(di)) {
+	if (IS_ERR(di)) {
+		return PTR_ERR(di);
+	} else if (di) {
 		ret = drop_one_dir_item(trans, root, path, dir, di);
 		if (ret)
 			return ret;

commit 8d733c5d59bed4e47e8688a70f9f7c9b819029d8
Author: Filipe Manana <fdmanana@suse.com>
Date:   Fri Oct 1 13:52:31 2021 +0100

    btrfs: deal with errors when replaying dir entry during log replay
    
    commit e15ac6413745e3def00e663de00aea5a717311c1 upstream.
    
    At replay_one_one(), we are treating any error returned from
    btrfs_lookup_dir_item() or from btrfs_lookup_dir_index_item() as meaning
    that there is no existing directory entry in the fs/subvolume tree.
    This is not correct since we can get errors such as, for example, -EIO
    when reading extent buffers while searching the fs/subvolume's btree.
    
    So fix that and return the error to the caller when it is not -ENOENT.
    
    CC: stable@vger.kernel.org # 4.14+
    Signed-off-by: Filipe Manana <fdmanana@suse.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index 3a7b7e9cb889..85c32b94479a 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -1907,7 +1907,14 @@ static noinline int replay_one_name(struct btrfs_trans_handle *trans,
 		ret = -EINVAL;
 		goto out;
 	}
-	if (IS_ERR_OR_NULL(dst_di)) {
+
+	if (dst_di == ERR_PTR(-ENOENT))
+		dst_di = NULL;
+
+	if (IS_ERR(dst_di)) {
+		ret = PTR_ERR(dst_di);
+		goto out;
+	} else if (!dst_di) {
 		/* we need a sequence number to insert, so we only
 		 * do inserts for the BTRFS_DIR_INDEX_KEY types
 		 */

commit 4331236e64dc38ef74956c337fa97935e3c80fe7
Author: Roberto Sassu <roberto.sassu@huawei.com>
Date:   Tue Oct 5 14:08:36 2021 +0200

    s390: fix strrchr() implementation
    
    commit 8e0ab8e26b72a80e991c66a8abc16e6c856abe3d upstream.
    
    Fix two problems found in the strrchr() implementation for s390
    architectures: evaluate empty strings (return the string address instead of
    NULL, if '\0' is passed as second argument); evaluate the first character
    of non-empty strings (the current implementation stops at the second).
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: stable@vger.kernel.org
    Reported-by: Heiko Carstens <hca@linux.ibm.com> (incorrect behavior with empty strings)
    Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com>
    Link: https://lore.kernel.org/r/20211005120836.60630-1-roberto.sassu@huawei.com
    Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
    Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/s390/lib/string.c b/arch/s390/lib/string.c
index a10e11f7a5f7..c1832eba50ea 100644
--- a/arch/s390/lib/string.c
+++ b/arch/s390/lib/string.c
@@ -227,14 +227,13 @@ EXPORT_SYMBOL(strcmp);
  */
 char *strrchr(const char *s, int c)
 {
-       size_t len = __strend(s) - s;
-
-       if (len)
-	       do {
-		       if (s[len] == (char) c)
-			       return (char *) s + len;
-	       } while (--len > 0);
-       return NULL;
+	ssize_t len = __strend(s) - s;
+
+	do {
+		if (s[len] == (char)c)
+			return (char *)s + len;
+	} while (--len >= 0);
+	return NULL;
 }
 EXPORT_SYMBOL(strrchr);
 

commit b25e0bf3cc59d7dd13771b1d4bc481aef0f37fe1
Author: Steven Rostedt <rostedt@goodmis.org>
Date:   Thu Oct 14 14:35:07 2021 -0400

    nds32/ftrace: Fix Error: invalid operands (*UND* and *UND* sections) for `^'
    
    commit be358af1191b1b2fedebd8f3421cafdc8edacc7d upstream.
    
    I received a build failure for a new patch I'm working on the nds32
    architecture, and when I went to test it, I couldn't get to my build error,
    because it failed to build with a bunch of:
    
      Error: invalid operands (*UND* and *UND* sections) for `^'
    
    issues with various files. Those files were temporary asm files that looked
    like:  kernel/.tmp_mc_fork.s
    
    I decided to look deeper, and found that the "mc" portion of that name
    stood for "mcount", and was created by the recordmcount.pl script. One that
    I wrote over a decade ago. Once I knew the source of the problem, I was
    able to investigate it further.
    
    The way the recordmcount.pl script works (BTW, there's a C version that
    simply modifies the ELF object) is by doing an "objdump" on the object
    file. Looks for all the calls to "mcount", and creates an offset of those
    locations from some global variable it can use (usually a global function
    name, found with <.*>:). Creates a asm file that is a table of references
    to these locations, using the found variable/function. Compiles it and
    links it back into the original object file. This asm file is called
    ".tmp_mc_<object_base_name>.s".
    
    The problem here is that the objdump produced by the nds32 object file,
    contains things that look like:
    
     0000159a <.L3^B1>:
        159a:       c6 00           beqz38 $r6, 159a <.L3^B1>
                            159a: R_NDS32_9_PCREL_RELA      .text+0x159e
        159c:       84 d2           movi55 $r6, #-14
        159e:       80 06           mov55 $r0, $r6
        15a0:       ec 3c           addi10.sp #0x3c
    
    Where ".L3^B1 is somehow selected as the "global" variable to index off of.
    
    Then the assembly file that holds the mcount locations looks like this:
    
            .section __mcount_loc,"a",@progbits
            .align 2
            .long .L3^B1 + -5522
            .long .L3^B1 + -5384
            .long .L3^B1 + -5270
            .long .L3^B1 + -5098
            .long .L3^B1 + -4970
            .long .L3^B1 + -4758
            .long .L3^B1 + -4122
            [...]
    
    And when it is compiled back to an object to link to the original object,
    the compile fails on the "^" symbol.
    
    Simple solution for now, is to have the perl script ignore using function
    symbols that have an "^" in the name.
    
    Link: https://lkml.kernel.org/r/20211014143507.4ad2c0f7@gandalf.local.home
    
    Cc: stable@vger.kernel.org
    Acked-by: Greentime Hu <green.hu@gmail.com>
    Fixes: fbf58a52ac088 ("nds32/ftrace: Add RECORD_MCOUNT support")
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl
index 657e69125a46..321c41562b97 100755
--- a/scripts/recordmcount.pl
+++ b/scripts/recordmcount.pl
@@ -222,7 +222,7 @@ if ($arch =~ /(x86(_64)?)|(i386)/) {
 $local_regex = "^[0-9a-fA-F]+\\s+t\\s+(\\S+)";
 $weak_regex = "^[0-9a-fA-F]+\\s+([wW])\\s+(\\S+)";
 $section_regex = "Disassembly of section\\s+(\\S+):";
-$function_regex = "^([0-9a-fA-F]+)\\s+<(.*?)>:";
+$function_regex = "^([0-9a-fA-F]+)\\s+<([^^]*?)>:";
 $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s(mcount|__fentry__)\$";
 $section_type = '@progbits';
 $mcount_adjust = 0;

commit a7ef5d15cf08f13dab451c46bd17fa975b03de98
Author: Kailang Yang <kailang@realtek.com>
Date:   Tue Oct 5 14:35:14 2021 +0800

    ALSA: hda/realtek - ALC236 headset MIC recording issue
    
    commit 5aec98913095ed3b4424ed6c5fdeb6964e9734da upstream.
    
    In power save mode, the recording voice from headset mic will 2s more delay.
    Add this patch will solve this issue.
    
    [ minor coding style fix by tiwai ]
    
    Signed-off-by: Kailang Yang <kailang@realtek.com>
    Tested-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/ccb0cdd5bbd7486eabbd8d987d384cb0@realtek.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 6af51c911172..650439286208 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -519,6 +519,8 @@ static void alc_shutup_pins(struct hda_codec *codec)
 	struct alc_spec *spec = codec->spec;
 
 	switch (codec->core.vendor_id) {
+	case 0x10ec0236:
+	case 0x10ec0256:
 	case 0x10ec0283:
 	case 0x10ec0286:
 	case 0x10ec0288:
@@ -3365,7 +3367,8 @@ static void alc256_shutup(struct hda_codec *codec)
 	/* If disable 3k pulldown control for alc257, the Mic detection will not work correctly
 	 * when booting with headset plugged. So skip setting it for the codec alc257
 	 */
-	if (codec->core.vendor_id != 0x10ec0257)
+	if (spec->codec_variant != ALC269_TYPE_ALC257 &&
+	    spec->codec_variant != ALC269_TYPE_ALC256)
 		alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
 
 	if (!spec->no_shutup_pins)

commit 65811c5098832534851d7f3b5f04dec05c403e6d
Author: Werner Sembach <wse@tuxedocomputers.com>
Date:   Fri Oct 1 15:31:11 2021 +0200

    ALSA: hda/realtek: Add quirk for Clevo X170KM-G
    
    commit cc03069a397005da24f6783835c274d5aedf6043 upstream.
    
    This applies a SND_PCI_QUIRK(...) to the Clevo X170KM-G barebone. This
    fixes the issue of the devices internal Speaker not working.
    
    Signed-off-by: Werner Sembach <wse@tuxedocomputers.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20211001133111.428249-3-wse@tuxedocomputers.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 61f0c2e76ff2..6af51c911172 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -2524,6 +2524,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170SM", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
+	SND_PCI_QUIRK(0x1558, 0x7715, "Clevo X170KM-G", ALC1220_FIXUP_CLEVO_PB51ED),
 	SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
 	SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950),
 	SND_PCI_QUIRK(0x1558, 0x950a, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),

commit f30a2ba6bdfc39d065a7f1bec2c720c0ca0399e5
Author: Werner Sembach <wse@tuxedocomputers.com>
Date:   Fri Oct 1 15:31:10 2021 +0200

    ALSA: hda/realtek: Complete partial device name to avoid ambiguity
    
    commit 1f8d398e1cd8813f8ec16d55c086e8270a9c18ab upstream.
    
    The string "Clevo X170" is not enough to unambiguously identify the correct
    device.
    
    Fixing it so another Clevo barebone name starting with "X170" can be added
    without causing confusion.
    
    Signed-off-by: Werner Sembach <wse@tuxedocomputers.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20211001133111.428249-2-wse@tuxedocomputers.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 42c30fba699f..61f0c2e76ff2 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -2523,7 +2523,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
-	SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
+	SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170SM", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
 	SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950),
 	SND_PCI_QUIRK(0x1558, 0x950a, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),

commit 811040415681e58cd66777e4bfa13b3848994e69
Author: Takashi Iwai <tiwai@suse.de>
Date:   Thu Sep 30 13:41:14 2021 +0200

    ALSA: seq: Fix a potential UAF by wrong private_free call order
    
    commit 1f8763c59c4ec6254d629fe77c0a52220bd907aa upstream.
    
    John Keeping reported and posted a patch for a potential UAF in
    rawmidi sequencer destruction: the snd_rawmidi_dev_seq_free() may be
    called after the associated rawmidi object got already freed.
    After a deeper look, it turned out that the bug is rather the
    incorrect private_free call order for a snd_seq_device.  The
    snd_seq_device private_free gets called at the release callback of the
    sequencer device object, while this was rather expected to be executed
    at the snd_device call chains that runs at the beginning of the whole
    card-free procedure.  It's been broken since the rewrite of
    sequencer-device binding (although it hasn't surfaced because the
    sequencer device release happens usually right along with the card
    device release).
    
    This patch corrects the private_free call to be done in the right
    place, at snd_seq_device_dev_free().
    
    Fixes: 7c37ae5c625a ("ALSA: seq: Rewrite sequencer device binding with standard bus")
    Reported-and-tested-by: John Keeping <john@metanate.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210930114114.8645-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/core/seq_device.c b/sound/core/seq_device.c
index e40a2cba5002..5d16b2079119 100644
--- a/sound/core/seq_device.c
+++ b/sound/core/seq_device.c
@@ -162,6 +162,8 @@ static int snd_seq_device_dev_free(struct snd_device *device)
 	struct snd_seq_device *dev = device->device_data;
 
 	cancel_autoload_drivers();
+	if (dev->private_free)
+		dev->private_free(dev);
 	put_device(&dev->dev);
 	return 0;
 }
@@ -189,11 +191,7 @@ static int snd_seq_device_dev_disconnect(struct snd_device *device)
 
 static void snd_seq_dev_release(struct device *dev)
 {
-	struct snd_seq_device *sdev = to_seq_dev(dev);
-
-	if (sdev->private_free)
-		sdev->private_free(sdev);
-	kfree(sdev);
+	kfree(to_seq_dev(dev));
 }
 
 /*

commit 295c0918946d0ceef695c53f6fc0dac4a242ac5c
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Tue Oct 19 15:34:30 2021 +0800

    include: uapi/linux/rk-camera-module.h modify otp struct
    
    1. modify af inf
    2. add module info
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I455e649c1ffe471e1b5239d95ae929ad85113248

diff --git a/drivers/media/i2c/gc8034.c b/drivers/media/i2c/gc8034.c
index a55682dcd2fa..51d532003ef7 100644
--- a/drivers/media/i2c/gc8034.c
+++ b/drivers/media/i2c/gc8034.c
@@ -1599,9 +1599,10 @@ static void gc8034_get_otp(struct gc8034_otp_info *otp,
 	/* af */
 	if (otp->flag & 0x20) {
 		inf->af.flag = 1;
-		inf->af.vcm_start = otp->vcm_start;
-		inf->af.vcm_end = otp->vcm_end;
-		inf->af.vcm_dir = otp->vcm_dir;
+		inf->af.dir_cnt = 1;
+		inf->af.af_otp[0].vcm_start = otp->vcm_start;
+		inf->af.af_otp[0].vcm_end = otp->vcm_end;
+		inf->af.af_otp[0].vcm_dir = otp->vcm_dir;
 	}
 }
 
diff --git a/drivers/media/i2c/imx258.c b/drivers/media/i2c/imx258.c
index 60a1f0746a31..058b8f0ea871 100644
--- a/drivers/media/i2c/imx258.c
+++ b/drivers/media/i2c/imx258.c
@@ -1016,9 +1016,10 @@ static void imx258_get_otp(struct imx258_otp_info *otp,
 	/* af */
 	if (otp->flag & 0x20) {
 		inf->af.flag = 1;
-		inf->af.vcm_start = otp->vcm_start;
-		inf->af.vcm_end = otp->vcm_end;
-		inf->af.vcm_dir = otp->vcm_dir;
+		inf->af.dir_cnt = 1;
+		inf->af.af_otp[0].vcm_start = otp->vcm_start;
+		inf->af.af_otp[0].vcm_end = otp->vcm_end;
+		inf->af.af_otp[0].vcm_dir = otp->vcm_dir;
 	}
 	/* lsc */
 	if (otp->flag & 0x10) {
diff --git a/drivers/media/i2c/ov8858.c b/drivers/media/i2c/ov8858.c
index a991c196aea7..646df26b702a 100644
--- a/drivers/media/i2c/ov8858.c
+++ b/drivers/media/i2c/ov8858.c
@@ -2195,9 +2195,10 @@ static void ov8858_get_r1a_otp(struct ov8858_otp_info_r1a *otp_r1a,
 	/* af */
 	if (otp_r1a->flag & 0x20) {
 		inf->af.flag = 1;
-		inf->af.vcm_start = otp_r1a->vcm_start;
-		inf->af.vcm_end = otp_r1a->vcm_end;
-		inf->af.vcm_dir = otp_r1a->vcm_dir;
+		inf->af.dir_cnt = 1;
+		inf->af.af_otp[0].vcm_start = otp_r1a->vcm_start;
+		inf->af.af_otp[0].vcm_end = otp_r1a->vcm_end;
+		inf->af.af_otp[0].vcm_dir = otp_r1a->vcm_dir;
 	}
 
 	/* lsc */
@@ -2264,9 +2265,10 @@ static void ov8858_get_r2a_otp(struct ov8858_otp_info_r2a *otp_r2a,
 	/* af */
 	if (otp_r2a->flag & 0x20) {
 		inf->af.flag = 1;
-		inf->af.vcm_start = otp_r2a->vcm_start;
-		inf->af.vcm_end = otp_r2a->vcm_end;
-		inf->af.vcm_dir = otp_r2a->vcm_dir;
+		inf->af.dir_cnt = 1;
+		inf->af.af_otp[0].vcm_start = otp_r2a->vcm_start;
+		inf->af.af_otp[0].vcm_end = otp_r2a->vcm_end;
+		inf->af.af_otp[0].vcm_dir = otp_r2a->vcm_dir;
 	}
 
 	/* lsc */
diff --git a/include/uapi/linux/rk-camera-module.h b/include/uapi/linux/rk-camera-module.h
index f91c9e109994..ba17c8d23d85 100644
--- a/include/uapi/linux/rk-camera-module.h
+++ b/include/uapi/linux/rk-camera-module.h
@@ -21,6 +21,7 @@
 
 #define RKMODULE_PADF_GAINMAP_LEN	1024
 #define RKMODULE_PDAF_DCCMAP_LEN	256
+#define RKMODULE_AF_OTP_MAX_LEN		3
 
 #define RKMODULE_CAMERA_MODULE_INDEX	"rockchip,camera-module-index"
 #define RKMODULE_CAMERA_MODULE_FACING	"rockchip,camera-module-facing"
@@ -170,15 +171,31 @@ struct rkmodule_lsc_inf {
 } __attribute__ ((packed));
 
 /**
- * struct rkmodule_af_inf - module af information
- *
+ * enum rkmodule_af_dir - enum of module af otp direction
  */
-struct rkmodule_af_inf {
-	__u32 flag;
+enum rkmodele_af_otp_dir {
+	AF_OTP_DIR_HORIZONTAL = 0,
+	AF_OTP_DIR_UP = 1,
+	AF_OTP_DIR_DOWN = 2,
+};
 
+/**
+ * struct rkmodule_af_otp - module af otp in one direction
+ */
+struct rkmodule_af_otp {
 	__u32 vcm_start;
 	__u32 vcm_end;
 	__u32 vcm_dir;
+};
+
+/**
+ * struct rkmodule_af_inf - module af information
+ *
+ */
+struct rkmodule_af_inf {
+	__u32 flag;
+	__u32 dir_cnt;
+	struct rkmodule_af_otp af_otp[RKMODULE_AF_OTP_MAX_LEN];
 } __attribute__ ((packed));
 
 /**
@@ -198,6 +215,28 @@ struct rkmodule_pdaf_inf {
 	__u16 dccmap[RKMODULE_PDAF_DCCMAP_LEN];
 } __attribute__ ((packed));
 
+/**
+ * struct rkmodule_otp_module_inf - otp module info
+ *
+ */
+struct rkmodule_otp_module_inf {
+	__u32 flag;
+	__u8 vendor[8];
+	__u32 module_id;
+	__u16 version;
+	__u16 full_width;
+	__u16 full_height;
+	__u8 supplier_id;
+	__u8 year;
+	__u8 mouth;
+	__u8 day;
+	__u8 sensor_id;
+	__u8 lens_id;
+	__u8 vcm_id;
+	__u8 drv_id;
+	__u8 flip;
+} __attribute__ ((packed));
+
 /**
  * struct rkmodule_inf - module information
  *
@@ -209,6 +248,7 @@ struct rkmodule_inf {
 	struct rkmodule_lsc_inf lsc;
 	struct rkmodule_af_inf af;
 	struct rkmodule_pdaf_inf pdaf;
+	struct rkmodule_otp_module_inf module_inf;
 } __attribute__ ((packed));
 
 /**

commit 11f9c06cc3bf0dcfe65878fb5db7896621f943fc
Author: William Wu <william.wu@rock-chips.com>
Date:   Tue Oct 19 16:17:35 2021 +0800

    usb: dwc3: gadget: wait for disconnect done before runtime suspend
    
    The dwc3 gadget call pm_runtime_get in the __dwc3_gadget_ep_queue()
    to increment the device's usage count, and call pm_runtime_put in
    the dwc3_gadget_giveback() to decrement the device's usage count
    if the request is completed successfully or disconnection happens.
    
    Test on RK3399 IND Type-C interface with HUSB311 (Type-C port
    controller chip), if plug out the USB cable, the extcon notifier
    from tcpm framework comes earlier than the dwc3 disconnect event.
    This cause the dwc3 fails to enter the runtime suspend immediately
    in the disconnection process of __dwc3_set_mode().
    
    This patch waits for the dwc3 disconnect event done before doing
    pm_runtime_put_sync_suspend. If it takes 1000ms to wait for the
    disconnect event timeout, just print warning log and still do
    the pm_runtime_put_sync_suspend, and then the dwc3 can also enter
    runtime suspend automatically (DWC3_DEFAULT_AUTOSUSPEND_DELAY is
    5000ms) after the disconnect event done.
    
    Signed-off-by: William Wu <william.wu@rock-chips.com>
    Change-Id: Ie6086d469b5d24f841532992e4e95f0c91c37022

diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index eb244046b4ac..b06b0d083a6e 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -284,6 +284,14 @@ static void __dwc3_set_mode(struct work_struct *work)
 			}
 			break;
 		case DWC3_GCTL_PRTCAP_DEVICE:
+			if (dwc->connected) {
+				ret = wait_for_completion_timeout(&dwc->discon_done,
+						msecs_to_jiffies(DWC3_DISCON_TIMEOUT));
+				if (!ret)
+					dev_warn(dwc->dev,
+						 "timed out waiting for disconnect\n");
+			}
+
 			break;
 		case DWC3_GCTL_PRTCAP_OTG:
 			break;
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index c98fbfe14478..4f23717d2299 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -32,6 +32,7 @@
 #define DWC3_MSG_MAX	500
 
 /* Global constants */
+#define DWC3_DISCON_TIMEOUT	1000	/* ms */
 #define DWC3_PULL_UP_TIMEOUT	500	/* ms */
 #define DWC3_BOUNCE_SIZE	1024	/* size of a superspeed bulk */
 #define DWC3_EP0_SETUP_SIZE	512
@@ -929,6 +930,7 @@ struct dwc3_scratchpad_array {
  * @ep0_usb_req: dummy req used while handling STD USB requests
  * @scratch_addr: dma address of scratchbuf
  * @ep0_in_setup: one control transfer is completed and enter setup phase
+ * @discon_done: disconnect event is completed
  * @lock: for synchronizing
  * @dev: pointer to our struct device
  * @sysdev: pointer to the DMA-capable device
@@ -1071,6 +1073,7 @@ struct dwc3 {
 	dma_addr_t		scratch_addr;
 	struct dwc3_request	ep0_usb_req;
 	struct completion	ep0_in_setup;
+	struct completion	discon_done;
 
 	/* device lock */
 	spinlock_t		lock;
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 1bac00c1512b..1c3d3c00c990 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -3021,8 +3021,10 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
 
 	if (epnum == 0 || epnum == 1) {
 		if (!dwc->connected &&
-		    event->endpoint_event == DWC3_DEPEVT_XFERCOMPLETE)
+		    event->endpoint_event == DWC3_DEPEVT_XFERCOMPLETE) {
+			reinit_completion(&dwc->discon_done);
 			dwc->connected = true;
+		}
 		dwc3_ep0_interrupt(dwc, event);
 		return;
 	}
@@ -3187,6 +3189,7 @@ static void dwc3_gadget_disconnect_interrupt(struct dwc3 *dwc)
 	usb_gadget_set_state(&dwc->gadget, USB_STATE_NOTATTACHED);
 
 	dwc->connected = false;
+	complete(&dwc->discon_done);
 }
 
 static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc)
@@ -3786,6 +3789,7 @@ int dwc3_gadget_init(struct dwc3 *dwc)
 	}
 
 	init_completion(&dwc->ep0_in_setup);
+	init_completion(&dwc->discon_done);
 
 	dwc->gadget.ops			= &dwc3_gadget_ops;
 	dwc->gadget.speed		= USB_SPEED_UNKNOWN;

commit 02456ae2034b70d2ce98a917f5ca3cae4f5a9680
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Sun Sep 26 11:13:35 2021 +0800

    mfd: rk808: disable rk817 int when shutdown
    
    rk817 int pin is connect to sleep pin on ebook hardware design,
    cpu unable to pull high sleep pin to shutdown devices,
    when pmic occurs interrupt, so we just disable pmic int
    on shutdown process to avoid this.
    
    TEST:Press the Power button frequently while shutting down ebook devices
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: I2a3a45be371b78720a94b1380fbb101a5597cfc6

diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c
index 168dfcf31203..e53d2b36c59c 100644
--- a/drivers/mfd/rk808.c
+++ b/drivers/mfd/rk808.c
@@ -784,14 +784,22 @@ static void rk817_shutdown_prepare(void)
 	int ret;
 	struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);
 
-	/* close rtc int when power off */
+	/* close int when power off */
 	regmap_update_bits(rk808->regmap,
 			   RK817_INT_STS_MSK_REG0,
-			   (0x3 << 5), (0x3 << 5));
+			   0xff, 0xff);
+	regmap_update_bits(rk808->regmap,
+			   RK817_INT_STS_MSK_REG1,
+			   0xff, 0xff);
+	regmap_update_bits(rk808->regmap,
+			   RK817_INT_STS_MSK_REG2,
+			   0xff, 0xff);
 	regmap_update_bits(rk808->regmap,
 			   RK817_RTC_INT_REG,
 			   (0x3 << 2), (0x0 << 2));
 
+	dev_info(&rk808_i2c_client->dev, "disabled int when device shutdown!\n");
+
 	if (rk808->pins && rk808->pins->p && rk808->pins->power_off) {
 		ret = regmap_update_bits(rk808->regmap,
 					 RK817_SYS_CFG(3),

commit fd5fd8b70e8e43415596519a5d88eef6981e2f30
Author: Elaine Zhang <zhangqing@rock-chips.com>
Date:   Thu Oct 14 16:47:03 2021 +0800

    regulator: rk860x: Add binding document for Rockchip Rk860x
    
    Add rk860x-regulator.yaml document for Rockchip Rk860x Buck.
    
    Change-Id: I374a9c3b17f0f9382d7213a5d3a1a8ece9f0ae1d
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>

diff --git a/Documentation/devicetree/bindings/regulator/rk860x-regulator.yaml b/Documentation/devicetree/bindings/regulator/rk860x-regulator.yaml
new file mode 100644
index 000000000000..22ce5c35cb0a
--- /dev/null
+++ b/Documentation/devicetree/bindings/regulator/rk860x-regulator.yaml
@@ -0,0 +1,77 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/regulator/rk860x-regulator.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Rockchip Rk860x voltage regulator
+
+maintainers:
+  - Elaine Zhang <zhangqing@rock-chips.com>
+
+description: |
+  Rockchip RK860X Digitally Programmable Buck Regulator.
+  The RK860X is a step-down switching voltage regulator that
+  delivers a digitally programmable output from an input voltage supply
+  of 2.5V to 5.5V. The output voltage is programmed through an I2C interface.
+
+allOf:
+  - $ref: regulator.yaml#
+
+properties:
+  $nodename:
+    pattern: "^rk860[0-3]@[0-9a-f]"
+  compatible:
+    const: rockchip,rk860x
+
+  reg:
+    maxItems: 1
+
+  vin-supply:
+    description: Input supply phandle
+
+  vsel:
+    minItems: 1
+    maxItems: 1
+    description: |
+      GPIO pin used for DVS voltage selection or used to control enable status of regulator.
+
+  rockchip,suspend-voltage-selector:
+    maxItems: 1
+    description: |
+      The polarity of vsel pin.
+
+  limit-microvolt:
+    description: |
+      The limit of voltage setting.
+
+required:
+  - compatible
+  - reg
+
+unevaluatedProperties: false
+
+examples:
+  - |
+    i2c {
+        #address-cells = <1>;
+        #size-cells = <0>;
+
+        vdd_cpu: rk8600@40{
+            compatible = "rockchip,rk860x";
+            reg = <0x40>;
+            vin-supply = <&vcc5v0_sys>;
+            regulator-compatible = "rk860x-reg";
+            regulator-name = "vdd_cpu";
+            regulator-min-microvolt = <712500>;
+            regulator-max-microvolt = <1390000>;
+            regulator-init-microvolt = <900000>;
+            regulator-ramp-delay = <2300>;
+            rockchip,suspend-voltage-selector = <1>;
+            regulator-boot-on;
+            regulator-always-on;
+            regulator-state-mem {
+                regulator-off-in-suspend;
+            };
+        };
+    };

commit e193e5488cd6d1f27bf8987e2a5aad56c9198f09
Author: Elaine Zhang <zhangqing@rock-chips.com>
Date:   Thu Oct 14 16:50:16 2021 +0800

    regulator: rk860x: Add RK860X dcdc support
    
    RK860X main features:
        - 2.7V to 5.5V Input Voltage Range;
        - 2.4MHz Constant Switching Frequency;
        - 6A Available Load Current;
        - Programmable Output Voltage: 0.7125V to 1.5V in 12.5mV
          Steps(RK8600/RK8601), 0.5V to 1.5V in 6.25mV(RK8602/RK8603);
        - PFM/PWM Operation for Optimum Increased Efficiency;
    
    Change-Id: Ib564dee94151d42c0288d2141c6b66c70bc019b9
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>

diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 93a8ad290f49..dac39f9086be 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -760,6 +760,17 @@ config REGULATOR_RK808
 	  through regulator interface. The device supports multiple DCDC/LDO
 	  outputs which can be controlled by i2c communication.
 
+config REGULATOR_RK860X
+	tristate "Rockchip RK860X Regulator"
+	depends on I2C
+	select REGMAP_I2C
+	help
+	  This driver supports Rockchip RK860X Digitally Programmable
+	  Buck Regulator. The RK860X is a step-down switching voltage
+	  regulator that delivers a digitally programmable output from an
+	  input voltage supply of 2.5V to 5.5V. The output voltage is
+	  programmed through an I2C interface.
+
 config REGULATOR_RN5T618
 	tristate "Ricoh RN5T567/618 voltage regulators"
 	depends on MFD_RN5T618
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
index 657ad8567026..01c85c1b925d 100644
--- a/drivers/regulator/Makefile
+++ b/drivers/regulator/Makefile
@@ -96,6 +96,7 @@ obj-$(CONFIG_REGULATOR_PCAP) += pcap-regulator.o
 obj-$(CONFIG_REGULATOR_PCF50633) += pcf50633-regulator.o
 obj-$(CONFIG_REGULATOR_RC5T583)  += rc5t583-regulator.o
 obj-$(CONFIG_REGULATOR_RK808)   += rk808-regulator.o
+obj-$(CONFIG_REGULATOR_RK860X)	+= rk860x-regulator.o
 obj-$(CONFIG_REGULATOR_RN5T618) += rn5t618-regulator.o
 obj-$(CONFIG_REGULATOR_RT5033)	+= rt5033-regulator.o
 obj-$(CONFIG_REGULATOR_S2MPA01) += s2mpa01.o
diff --git a/drivers/regulator/rk860x-regulator.c b/drivers/regulator/rk860x-regulator.c
new file mode 100644
index 000000000000..a622362ef9cd
--- /dev/null
+++ b/drivers/regulator/rk860x-regulator.c
@@ -0,0 +1,593 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2021 Fuzhou Rockchip Electronics Co., Ltd
+ */
+#include <linux/err.h>
+#include <linux/gpio.h>
+#include <linux/i2c.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/of_gpio.h>
+#include <linux/param.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+#include <linux/regulator/driver.h>
+#include <linux/regulator/machine.h>
+#include <linux/regulator/of_regulator.h>
+#include <linux/slab.h>
+
+/* Voltage setting */
+
+#define RK860X_VSEL0_A		0x00
+#define RK860X_VSEL1_A		0x01
+#define RK860X_VSEL0_B		0x06
+#define RK860X_VSEL1_B		0x07
+#define RK860X_MAX_SET		0x08
+
+/* Control register */
+#define RK860X_CONTROL		0x02
+/* IC Type */
+#define RK860X_ID1		0x03
+/* IC mask version */
+#define RK860X_ID2		0x04
+/* Monitor register */
+#define RK860X_MONITOR		0x05
+
+/* VSEL bit definitions */
+#define VSEL_BUCK_EN		BIT(7)
+#define VSEL_MODE		BIT(6)
+#define VSEL_A_NSEL_MASK	0x3F
+#define VSEL_B_NSEL_MASK	0xff
+
+/* Chip ID */
+#define DIE_ID			0x0f
+#define DIE_REV			0x0f
+/* Control bit definitions */
+#define CTL_OUTPUT_DISCHG	BIT(7)
+#define CTL_SLEW_MASK		(0x7 << 4)
+#define CTL_SLEW_SHIFT		4
+#define CTL_RESET		BIT(2)
+
+#define RK860X_NVOLTAGES_64	64
+#define RK860X_NVOLTAGES_160	160
+
+/* IC Type */
+enum {
+	RK860X_CHIP_ID_00 = 0,
+	RK860X_CHIP_ID_01,
+	RK860X_CHIP_ID_02,
+	RK860X_CHIP_ID_03,
+};
+
+struct rk860x_platform_data {
+	struct regulator_init_data *regulator;
+	unsigned int slew_rate;
+	/* Sleep VSEL ID */
+	unsigned int sleep_vsel_id;
+	int limit_volt;
+	struct gpio_desc *vsel_gpio;
+};
+
+struct rk860x_device_info {
+	struct regmap *regmap;
+	struct device *dev;
+	struct regulator_desc desc;
+	struct regulator_dev *rdev;
+	struct regulator_init_data *regulator;
+	/* IC Type and Rev */
+	int chip_id;
+	/* Voltage setting register */
+	unsigned int vol_reg;
+	unsigned int sleep_reg;
+	unsigned int en_reg;
+	unsigned int sleep_en_reg;
+	unsigned int mode_reg;
+	unsigned int vol_mask;
+	unsigned int mode_mask;
+	unsigned int slew_reg;
+	unsigned int slew_mask;
+	unsigned int slew_shift;
+	/* Voltage range and step(linear) */
+	unsigned int vsel_min;
+	unsigned int vsel_step;
+	unsigned int n_voltages;
+	/* Voltage slew rate limiting */
+	unsigned int slew_rate;
+	struct gpio_desc *vsel_gpio;
+	unsigned int sleep_vsel_id;
+};
+
+static unsigned int rk860x_map_mode(unsigned int mode)
+{
+	return mode == REGULATOR_MODE_FAST ?
+		REGULATOR_MODE_FAST : REGULATOR_MODE_NORMAL;
+}
+
+static int rk860x_get_voltage(struct regulator_dev *rdev)
+{
+	struct rk860x_device_info *di = rdev_get_drvdata(rdev);
+	unsigned int val;
+	int ret;
+
+	ret = regmap_read(di->regmap, RK860X_MAX_SET, &val);
+	if (ret < 0)
+		return ret;
+	ret = regulator_get_voltage_sel_regmap(rdev);
+	if (ret > val)
+		return val;
+
+	return ret;
+}
+
+static int rk860x_set_suspend_voltage(struct regulator_dev *rdev, int uV)
+{
+	struct rk860x_device_info *di = rdev_get_drvdata(rdev);
+	int ret;
+
+	ret = regulator_map_voltage_linear(rdev, uV, uV);
+	if (ret < 0)
+		return ret;
+	ret = regmap_update_bits(di->regmap, di->sleep_reg,
+				 di->vol_mask, ret);
+	if (ret < 0)
+		return ret;
+
+	return 0;
+}
+
+static int rk860x_set_suspend_enable(struct regulator_dev *rdev)
+{
+	struct rk860x_device_info *di = rdev_get_drvdata(rdev);
+
+	return regmap_update_bits(di->regmap, di->sleep_en_reg,
+				  VSEL_BUCK_EN, VSEL_BUCK_EN);
+}
+
+static int rk860x_set_suspend_disable(struct regulator_dev *rdev)
+{
+	struct rk860x_device_info *di = rdev_get_drvdata(rdev);
+
+	return regmap_update_bits(di->regmap, di->sleep_en_reg,
+				  VSEL_BUCK_EN, 0);
+}
+
+static int rk860x_resume(struct regulator_dev *rdev)
+{
+	int ret;
+
+	if (!rdev->constraints->state_mem.changeable)
+		return 0;
+
+	ret = rk860x_set_suspend_enable(rdev);
+	if (ret)
+		return ret;
+
+	return regulator_suspend_enable(rdev, PM_SUSPEND_MEM);
+}
+
+static int rk860x_set_enable(struct regulator_dev *rdev)
+{
+	struct rk860x_device_info *di = rdev_get_drvdata(rdev);
+
+	if (di->vsel_gpio) {
+		gpiod_set_raw_value(di->vsel_gpio, !di->sleep_vsel_id);
+		return 0;
+	}
+
+	return regmap_update_bits(di->regmap, di->en_reg,
+				  VSEL_BUCK_EN, VSEL_BUCK_EN);
+}
+
+static int rk860x_set_disable(struct regulator_dev *rdev)
+{
+	struct rk860x_device_info *di = rdev_get_drvdata(rdev);
+
+	if (di->vsel_gpio) {
+		gpiod_set_raw_value(di->vsel_gpio, di->sleep_vsel_id);
+		return 0;
+	}
+
+	return regmap_update_bits(di->regmap, di->en_reg,
+				  VSEL_BUCK_EN, 0);
+}
+
+static int rk860x_is_enabled(struct regulator_dev *rdev)
+{
+	struct rk860x_device_info *di = rdev_get_drvdata(rdev);
+	unsigned int val;
+	int ret = 0;
+
+	if (di->vsel_gpio) {
+		if (di->sleep_vsel_id)
+			return !gpiod_get_raw_value(di->vsel_gpio);
+		else
+			return gpiod_get_raw_value(di->vsel_gpio);
+	}
+
+	ret = regmap_read(di->regmap, di->en_reg, &val);
+	if (ret < 0)
+		return ret;
+	if (val & VSEL_BUCK_EN)
+		return 1;
+	else
+		return 0;
+}
+
+static int rk860x_set_mode(struct regulator_dev *rdev, unsigned int mode)
+{
+	struct rk860x_device_info *di = rdev_get_drvdata(rdev);
+
+	switch (mode) {
+	case REGULATOR_MODE_FAST:
+		regmap_update_bits(di->regmap, di->mode_reg,
+				   di->mode_mask, di->mode_mask);
+		break;
+	case REGULATOR_MODE_NORMAL:
+		regmap_update_bits(di->regmap, di->mode_reg, di->mode_mask, 0);
+		break;
+	default:
+		return -EINVAL;
+	}
+	return 0;
+}
+
+static unsigned int rk860x_get_mode(struct regulator_dev *rdev)
+{
+	struct rk860x_device_info *di = rdev_get_drvdata(rdev);
+	unsigned int val;
+	int ret = 0;
+
+	ret = regmap_read(di->regmap, di->mode_reg, &val);
+	if (ret < 0)
+		return ret;
+	if (val & di->mode_mask)
+		return REGULATOR_MODE_FAST;
+	else
+		return REGULATOR_MODE_NORMAL;
+}
+
+static const int slew_rates[] = {
+	64000,
+	32000,
+	16000,
+	 8000,
+	 4000,
+	 2000,
+	 1000,
+	  500,
+};
+
+static int rk860x_set_ramp(struct regulator_dev *rdev, int ramp)
+{
+	struct rk860x_device_info *di = rdev_get_drvdata(rdev);
+	int regval = -1, i;
+	const int *slew_rate_t;
+	int slew_rate_n;
+
+	slew_rate_t = slew_rates;
+	slew_rate_n = ARRAY_SIZE(slew_rates);
+
+	for (i = 0; i < slew_rate_n; i++) {
+		if (ramp <= slew_rate_t[i])
+			regval = i;
+		else
+			break;
+	}
+
+	if (regval < 0) {
+		dev_err(di->dev, "unsupported ramp value %d\n", ramp);
+		return -EINVAL;
+	}
+
+	return regmap_update_bits(di->regmap, di->slew_reg,
+				  di->slew_mask, regval << di->slew_shift);
+}
+
+static const struct regulator_ops rk860x_regulator_ops = {
+	.set_voltage_sel = regulator_set_voltage_sel_regmap,
+	.get_voltage_sel = rk860x_get_voltage,
+	.set_voltage_time_sel = regulator_set_voltage_time_sel,
+	.map_voltage = regulator_map_voltage_linear,
+	.list_voltage = regulator_list_voltage_linear,
+	.set_suspend_voltage = rk860x_set_suspend_voltage,
+	.enable = rk860x_set_enable,
+	.disable = rk860x_set_disable,
+	.is_enabled = rk860x_is_enabled,
+	.set_mode = rk860x_set_mode,
+	.get_mode = rk860x_get_mode,
+	.set_ramp_delay = rk860x_set_ramp,
+	.set_suspend_enable = rk860x_set_suspend_enable,
+	.set_suspend_disable = rk860x_set_suspend_disable,
+	.resume = rk860x_resume,
+};
+
+/* For 00,01 options:
+ * VOUT = 0.7125V + NSELx * 12.5mV, from 0.7125 to 1.5V.
+ * For 02,03 options:
+ * VOUT = 0.5V + NSELx * 6.25mV, from 0.5 to 1.5V.
+ */
+static int rk860x_device_setup(struct rk860x_device_info *di,
+			       struct rk860x_platform_data *pdata)
+{
+	int ret = 0;
+	u32 val = 0;
+
+	switch (di->chip_id) {
+	case RK860X_CHIP_ID_00:
+	case RK860X_CHIP_ID_01:
+		di->vsel_min = 712500;
+		di->vsel_step = 12500;
+		di->n_voltages = RK860X_NVOLTAGES_64;
+		di->vol_mask = VSEL_A_NSEL_MASK;
+		if (di->sleep_vsel_id) {
+			di->sleep_reg = RK860X_VSEL1_A;
+			di->vol_reg = RK860X_VSEL0_A;
+			di->mode_reg = RK860X_VSEL0_A;
+			di->en_reg = RK860X_VSEL0_A;
+			di->sleep_en_reg = RK860X_VSEL1_A;
+		} else {
+			di->sleep_reg = RK860X_VSEL0_A;
+			di->vol_reg = RK860X_VSEL1_A;
+			di->mode_reg = RK860X_VSEL1_A;
+			di->en_reg = RK860X_VSEL1_A;
+			di->sleep_en_reg = RK860X_VSEL0_A;
+		}
+		break;
+	case RK860X_CHIP_ID_02:
+	case RK860X_CHIP_ID_03:
+		di->vsel_min = 500000;
+		di->vsel_step = 6250;
+		di->n_voltages = RK860X_NVOLTAGES_160;
+		di->vol_mask = VSEL_B_NSEL_MASK;
+		if (di->sleep_vsel_id) {
+			di->sleep_reg = RK860X_VSEL1_B;
+			di->vol_reg = RK860X_VSEL0_B;
+			di->mode_reg = RK860X_VSEL0_A;
+			di->en_reg = RK860X_VSEL0_A;
+			di->sleep_en_reg = RK860X_VSEL1_A;
+		} else {
+			di->sleep_reg = RK860X_VSEL0_B;
+			di->vol_reg = RK860X_VSEL1_B;
+			di->mode_reg = RK860X_VSEL1_A;
+			di->en_reg = RK860X_VSEL1_A;
+			di->sleep_en_reg = RK860X_VSEL0_A;
+		}
+		break;
+	default:
+		dev_err(di->dev, "Chip ID %d not supported!\n", di->chip_id);
+		return -EINVAL;
+	}
+
+	di->mode_mask = VSEL_MODE;
+	di->slew_reg = RK860X_CONTROL;
+	di->slew_mask = CTL_SLEW_MASK;
+	di->slew_shift = CTL_SLEW_SHIFT;
+
+	if (pdata->limit_volt) {
+		if (pdata->limit_volt < di->vsel_min ||
+		    pdata->limit_volt > 1500000)
+			pdata->limit_volt = 1500000;
+		val = (pdata->limit_volt - di->vsel_min) / di->vsel_step;
+		ret = regmap_write(di->regmap, RK860X_MAX_SET, val);
+		if (ret < 0) {
+			dev_err(di->dev, "Failed to set limit voltage!\n");
+			return ret;
+		}
+	}
+
+	return ret;
+}
+
+static int rk860x_regulator_register(struct rk860x_device_info *di,
+				     struct regulator_config *config)
+{
+	struct regulator_desc *rdesc = &di->desc;
+
+	rdesc->name = "rk860x-reg";
+	rdesc->supply_name = "vin";
+	rdesc->ops = &rk860x_regulator_ops;
+	rdesc->type = REGULATOR_VOLTAGE;
+	rdesc->n_voltages = di->n_voltages;
+	rdesc->enable_reg = di->en_reg;
+	rdesc->enable_mask = VSEL_BUCK_EN;
+	rdesc->min_uV = di->vsel_min;
+	rdesc->uV_step = di->vsel_step;
+	rdesc->vsel_reg = di->vol_reg;
+	rdesc->vsel_mask = di->vol_mask;
+	rdesc->owner = THIS_MODULE;
+	rdesc->enable_time = 400;
+
+	di->rdev = devm_regulator_register(di->dev, &di->desc, config);
+	return PTR_ERR_OR_ZERO(di->rdev);
+}
+
+static const struct regmap_config rk860x_regmap_config = {
+	.reg_bits = 8,
+	.val_bits = 8,
+};
+
+static struct rk860x_platform_data *
+rk860x_parse_dt(struct device *dev, struct device_node *np,
+		const struct regulator_desc *desc)
+{
+	struct rk860x_platform_data *pdata;
+	int ret, flag, limit_volt;
+	u32 tmp;
+
+	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
+	if (!pdata)
+		return NULL;
+
+	pdata->regulator = of_get_regulator_init_data(dev, np, desc);
+	pdata->regulator->constraints.initial_state = PM_SUSPEND_MEM;
+
+	if (!(of_property_read_u32(np, "limit-microvolt", &limit_volt)))
+		pdata->limit_volt = limit_volt;
+
+	ret = of_property_read_u32(np, "rockchip,suspend-voltage-selector",
+				   &tmp);
+	if (!ret)
+		pdata->sleep_vsel_id = tmp;
+
+	if (pdata->sleep_vsel_id)
+		flag = GPIOD_OUT_LOW;
+	else
+		flag = GPIOD_OUT_HIGH;
+
+	pdata->vsel_gpio = devm_gpiod_get_index_optional(dev, "vsel", 0, flag);
+	if (IS_ERR(pdata->vsel_gpio)) {
+		ret = PTR_ERR(pdata->vsel_gpio);
+		dev_err(dev, "failed to get vesl gpio (%d)\n", ret);
+		pdata->vsel_gpio = NULL;
+	}
+
+	return pdata;
+}
+
+static const struct of_device_id rk860x_dt_ids[] = {
+	{
+		.compatible = "rockchip,rk860x",
+	},
+	{ }
+};
+MODULE_DEVICE_TABLE(of, rk860x_dt_ids);
+
+static int rk860x_regulator_probe(struct i2c_client *client,
+				  const struct i2c_device_id *id)
+{
+	struct device_node *np = client->dev.of_node;
+	struct rk860x_device_info *di;
+	struct rk860x_platform_data *pdata;
+	struct regulator_config config = { };
+	unsigned int val;
+	int ret;
+
+	di = devm_kzalloc(&client->dev, sizeof(*di), GFP_KERNEL);
+	if (!di)
+		return -ENOMEM;
+
+	di->desc.of_map_mode = rk860x_map_mode;
+
+	pdata = dev_get_platdata(&client->dev);
+	if (!pdata)
+		pdata = rk860x_parse_dt(&client->dev, np, &di->desc);
+
+	if (!pdata || !pdata->regulator) {
+		dev_err(&client->dev, "Platform data not found!\n");
+		return -ENODEV;
+	}
+
+	di->vsel_gpio = pdata->vsel_gpio;
+	di->sleep_vsel_id = pdata->sleep_vsel_id;
+
+	di->regulator = pdata->regulator;
+	if (client->dev.of_node) {
+		di->chip_id =
+			(unsigned long)of_device_get_match_data(&client->dev);
+	} else {
+		/* if no ramp constraint set, get the pdata ramp_delay */
+		if (!di->regulator->constraints.ramp_delay) {
+			int slew_idx = (pdata->slew_rate & 0x7)
+						? pdata->slew_rate : 0;
+
+			di->regulator->constraints.ramp_delay =
+				slew_rates[slew_idx];
+		}
+		di->chip_id = id->driver_data;
+	}
+
+	di->regmap = devm_regmap_init_i2c(client, &rk860x_regmap_config);
+	if (IS_ERR(di->regmap)) {
+		dev_err(&client->dev, "Failed to allocate regmap!\n");
+		return PTR_ERR(di->regmap);
+	}
+	di->dev = &client->dev;
+	i2c_set_clientdata(client, di);
+	/* Get chip ID */
+	ret = regmap_read(di->regmap, RK860X_ID1, &val);
+	if (ret < 0) {
+		dev_err(&client->dev, "Failed to get chip ID!\n");
+		return ret;
+	}
+
+	switch (di->chip_id) {
+	case RK860X_CHIP_ID_00:
+	case RK860X_CHIP_ID_01:
+		if ((val & DIE_ID) != 0x8) {
+			dev_err(&client->dev, "Failed to match chip ID!\n");
+			return -EINVAL;
+		}
+		break;
+	case RK860X_CHIP_ID_02:
+	case RK860X_CHIP_ID_03:
+		if ((val & DIE_ID) != 0xa) {
+			dev_err(&client->dev, "Failed to match chip ID!\n");
+			return -EINVAL;
+		}
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	/* Device init */
+	ret = rk860x_device_setup(di, pdata);
+	if (ret < 0) {
+		dev_err(&client->dev, "Failed to setup device!\n");
+		return ret;
+	}
+	/* Register regulator */
+	config.dev = di->dev;
+	config.init_data = di->regulator;
+	config.regmap = di->regmap;
+	config.driver_data = di;
+	config.of_node = np;
+
+	ret = rk860x_regulator_register(di, &config);
+	if (ret < 0)
+		dev_err(&client->dev, "Failed to register regulator!\n");
+
+	return ret;
+}
+
+static void rk860x_regulator_shutdown(struct i2c_client *client)
+{
+	struct rk860x_device_info *di;
+	int ret;
+
+	di = i2c_get_clientdata(client);
+
+	dev_info(di->dev, "rk860..... reset\n");
+
+	ret = regmap_update_bits(di->regmap, di->slew_reg,
+				 CTL_RESET, CTL_RESET);
+
+	if (ret < 0)
+		dev_err(di->dev, "force rk860x_reset error! ret=%d\n", ret);
+	else
+		dev_info(di->dev, "force rk860x_reset ok!\n");
+}
+
+static const struct i2c_device_id rk860x_id[] = {
+	{ .name = "rk8600", .driver_data = RK860X_CHIP_ID_00 },
+	{ .name = "rk8601", .driver_data = RK860X_CHIP_ID_01 },
+	{ .name = "rk8602", .driver_data = RK860X_CHIP_ID_02 },
+	{ .name = "rk8603", .driver_data = RK860X_CHIP_ID_03 },
+	{},
+};
+MODULE_DEVICE_TABLE(i2c, rk860x_id);
+
+static struct i2c_driver rk860x_regulator_driver = {
+	.driver = {
+		.name = "rk860-regulator",
+		.of_match_table = of_match_ptr(rk860x_dt_ids),
+	},
+	.probe = rk860x_regulator_probe,
+	.shutdown = rk860x_regulator_shutdown,
+	.id_table = rk860x_id,
+};
+
+module_i2c_driver(rk860x_regulator_driver);
+
+MODULE_AUTHOR("Elaine Zhang <zhangqing@rock-chips.com>");
+MODULE_DESCRIPTION("rk860x regulator driver");
+MODULE_LICENSE("GPL v2");

commit 4e57d971b6cfd48750e2a1a3cb31313726f4c057
Author: Ding Wei <leo.ding@rock-chips.com>
Date:   Tue Oct 19 10:11:58 2021 +0800

    video: rockchip: mpp: rcu_read_lock/unlock -> device_links_read_lock/unlock
    
    reason:
    1. might_sleep is called by pm_runtime_xx, thus, it cannot covered by
       rcu_read_lock/unlock which is atomic context.
    2. it need use device_links_read_lock/unlock when meets dev->links.suppliers.
    
    relative call trace:
    [ 1804.810833  ] mpp_rkvdec2 fdf80200.rkvdec: resetting...
    [ 1804.811030  ] BUG: sleeping function called from invalid context at
    drivers/base/power/runtime.c:1005
    [ 1804.811090  ] in_atomic(): 0, irqs_disabled(): 0, pid: 3043, name:
    [ 1804.811149  ] CPU: 2 PID: 3043 Comm: rkvdec Tainted: G        W
    4.19.206 #215
    [ 1804.811192  ] Hardware name: Rockchip RK3566 EVB1 DDR4 V10 Board (DT)
    [ 1804.811236  ] Call trace:
    [ 1804.811316  ]  dump_backtrace+0x0/0x178
    [ 1804.811366  ]  show_stack+0x14/0x20
    [ 1804.811421  ]  dump_stack+0x94/0xb4
    [ 1804.811474  ]  ___might_sleep+0xf0/0x118
    [ 1804.811505  ]  __might_sleep+0x50/0x88
    [ 1804.811535  ]  __pm_runtime_idle+0x9c/0xa0
    [ 1804.811681  ]  mpp_iommu_refresh+0x54/0xd0 [rk_vcodec]
    [ 1804.811789  ]  rkvdec2_link_reset+0xac/0x128 [rk_vcodec]
    [ 1804.811873  ]  rkvdec2_link_isr+0xe4/0x6d0 [rk_vcodec]
    [ 1804.811995  ]  rkvdec2_link_worker+0xc0/0xb08 [rk_vcodec]
    [ 1804.812053  ]  kthread_worker_fn+0xe8/0x1f8
    [ 1804.812099  ]  kthread+0x138/0x168
    [ 1804.812130  ]  ret_from_fork+0x10/0x18
    [ 1804.812243  ] mpp_rkvdec2 fdf80200.rkvdec: reset done
    
    Change-Id: Id8453483b021a092e298736640e725a8e48c862b
    Signed-off-by: Ding Wei <leo.ding@rock-chips.com>

diff --git a/drivers/video/rockchip/mpp/mpp_iommu.c b/drivers/video/rockchip/mpp/mpp_iommu.c
index 4f50641e34f5..2e035aa5f8af 100644
--- a/drivers/video/rockchip/mpp/mpp_iommu.c
+++ b/drivers/video/rockchip/mpp/mpp_iommu.c
@@ -20,6 +20,7 @@
 #include <linux/kref.h>
 #include <linux/slab.h>
 #include <linux/pm_runtime.h>
+#include "../../../base/base.h"
 
 #include "mpp_debug.h"
 #include "mpp_iommu.h"
@@ -459,12 +460,12 @@ int mpp_iommu_remove(struct mpp_iommu_info *info)
 
 int mpp_iommu_refresh(struct mpp_iommu_info *info, struct device *dev)
 {
-	int i;
+	int idx, i;
 	int usage_count;
 	struct device_link *link;
 	struct device *iommu_dev = &info->pdev->dev;
 
-	rcu_read_lock();
+	idx = device_links_read_lock();
 
 	usage_count = atomic_read(&iommu_dev->power.usage_count);
 	list_for_each_entry_rcu(link, &dev->links.suppliers, c_node) {
@@ -477,7 +478,7 @@ int mpp_iommu_refresh(struct mpp_iommu_info *info, struct device *dev)
 			pm_runtime_get_sync(link->supplier);
 	}
 
-	rcu_read_unlock();
+	device_links_read_unlock(idx);
 
 	return 0;
 }

commit 85546e9ff735c4434bed538951abe43e1d5806cb
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Tue Oct 19 11:39:21 2021 +0800

    drivers: rkflash: Support new spiflash
    
    1.spinand: GD5F1GQ5REYIG, GD5F2GQ5REYIG, GD5F2GM7RxG, GD5F2GM7UxG,
    DS35M2GA-IB, DS35Q2GB-IB, DS35M1GB-IB, TX25G01
    2.spinor: GD25Q64E, GD25LQ255E, GD25LQ256C, GD25LB512MEYIG, XM25QH64C,
    XM25QH128C, XM25QH256C, XM25QU128C, XM25QU64C
    
    Change-Id: Ic9313b296528b7586a5139c13c77bd3ec477c359
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/rkflash/sfc_nand.c b/drivers/rkflash/sfc_nand.c
index 925e717bf287..aa9c8fffe3cf 100644
--- a/drivers/rkflash/sfc_nand.c
+++ b/drivers/rkflash/sfc_nand.c
@@ -66,6 +66,14 @@ static struct nand_info spi_nand_tbl[] = {
 	{ 0xC8, 0x55, 0x00, 4, 0x40, 2, 2048, 0x4C, 20, 0x4, 1, { 0x04, 0x08, 0X14, 0x18 }, &sfc_nand_get_ecc_status2 },
 	/* GD5F1GQ4UExxH */
 	{ 0xC8, 0xD9, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x8, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status3 },
+	/* GD5F1GQ5REYIG */
+	{ 0xC8, 0x41, 0x00, 4, 0x40, 1, 1024, 0x4C, 18, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status2 },
+	/* GD5F2GQ5REYIG */
+	{ 0xC8, 0x42, 0x00, 4, 0x40, 1, 2048, 0x4C, 19, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status2 },
+	/* GD5F2GM7RxG */
+	{ 0xC8, 0x82, 0x00, 4, 0x40, 1, 2048, 0x0C, 19, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status2 },
+	/* GD5F2GM7UxG */
+	{ 0xC8, 0x92, 0x00, 4, 0x40, 1, 2048, 0x0C, 19, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status2 },
 
 	/* W25N01GV */
 	{ 0xEF, 0xAA, 0x21, 4, 0x40, 1, 1024, 0x4C, 18, 0x1, 0, { 0x04, 0x14, 0x24, 0xFF }, &sfc_nand_get_ecc_status1 },
@@ -110,8 +118,12 @@ static struct nand_info spi_nand_tbl[] = {
 	{ 0xE5, 0x72, 0x00, 4, 0x40, 2, 1024, 0x0C, 19, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
 	/* DS35M1GA-1B */
 	{ 0xE5, 0x21, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
+	/* DS35M2GA-IB */
+	{ 0xE5, 0x22, 0x00, 4, 0x40, 2, 1024, 0x0C, 19, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
 	/* DS35Q2GB-IB */
 	{ 0xE5, 0xF2, 0x00, 4, 0x40, 2, 1024, 0x0C, 19, 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 },
 
 	/* EM73C044VCC-H */
 	{ 0xD5, 0x22, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
@@ -165,6 +177,8 @@ static struct nand_info spi_nand_tbl[] = {
 	{ 0xBF, 0x21, 0x00, 4, 0x40, 1, 1024, 0x40, 18, 0x4, 1, { 0x08, 0x0C, 0xFF, 0xFF }, &sfc_nand_get_ecc_status8 },
 	/* SGM7000I-S24W1GH */
 	{ 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 },
 };
 
 static struct nand_info *p_nand_info;
diff --git a/drivers/rkflash/sfc_nor.c b/drivers/rkflash/sfc_nor.c
index b6bfe353c9df..0c2123cfeb12 100644
--- a/drivers/rkflash/sfc_nor.c
+++ b/drivers/rkflash/sfc_nor.c
@@ -15,7 +15,7 @@
 static struct flash_info spi_flash_tbl[] = {
 	/* GD25Q32B */
 	{ 0xc84016, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 13, 9, 0 },
-	/* GD25Q64B */
+	/* GD25Q64B/E */
 	{ 0xc84017, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 14, 9, 0 },
 	/* GD25Q127C and GD25Q128C/E */
 	{ 0xc84018, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 15, 9, 0 },
@@ -29,6 +29,10 @@ static struct flash_info spi_flash_tbl[] = {
 	{ 0xc86016, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 13, 9, 0 },
 	/* GD25B512MEYIG */
 	{ 0xc8471A, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 17, 0, 0 },
+	/* GD25LQ255E and GD25LQ256C */
+	{ 0xc86019, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1D, 16, 9, 0 },
+	/* GD25LB512MEYIG */
+	{ 0xc8671A, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 17, 0, 0 },
 
 	/* W25Q32JV */
 	{ 0xef4016, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 13, 9, 0 },
@@ -74,6 +78,12 @@ static struct flash_info spi_flash_tbl[] = {
 
 	/* XM25QH32C */
 	{ 0x204016, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 13, 9, 0 },
+	/* XM25QH64C */
+	{ 0x204017, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 14, 6, 0 },
+	/* XM25QH128C */
+	{ 0x204018, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 15, 6, 0 },
+	/* XM25QH256C */
+	{ 0x204019, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 16, 9, 0 },
 	/* XM25QH64B */
 	{ 0x206017, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 14, 6, 0 },
 	/* XM25QH128B */
@@ -82,6 +92,10 @@ static struct flash_info spi_flash_tbl[] = {
 	{ 0x206019, 128, 8, 0x13, 0x12, 0x6C, 0x3E, 0x21, 0xDC, 0x1D, 16, 6, 0 },
 	/* XM25QH64A */
 	{ 0x207017, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 14, 0, 0 },
+	/* XM25QU128C */
+	{ 0x204118, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 15, 9, 0 },
+	/* XM25QU64C */
+	{ 0x204117, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 14, 9, 0 },
 
 	/* XT25F128A XM25QH128A */
 	{ 0x207018, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 15, 0, 0 },

commit bc216fc845a8dbcc16f717172073b01867994b10
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Tue Oct 12 11:23:02 2021 +0800

    include: uapi/linux/rk-camera-module.h otp support pdaf
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I4bcd2d1ff866059821ef1ddc7248530cd37a9062

diff --git a/include/uapi/linux/rk-camera-module.h b/include/uapi/linux/rk-camera-module.h
index 2ecbedac6c10..f91c9e109994 100644
--- a/include/uapi/linux/rk-camera-module.h
+++ b/include/uapi/linux/rk-camera-module.h
@@ -19,6 +19,9 @@
 
 #define RKMODULE_MAX_VC_CH		4
 
+#define RKMODULE_PADF_GAINMAP_LEN	1024
+#define RKMODULE_PDAF_DCCMAP_LEN	256
+
 #define RKMODULE_CAMERA_MODULE_INDEX	"rockchip,camera-module-index"
 #define RKMODULE_CAMERA_MODULE_FACING	"rockchip,camera-module-facing"
 #define RKMODULE_CAMERA_MODULE_NAME	"rockchip,camera-module-name"
@@ -178,6 +181,23 @@ struct rkmodule_af_inf {
 	__u32 vcm_dir;
 } __attribute__ ((packed));
 
+/**
+ * struct rkmodule_pdaf_inf - module pdaf information
+ *
+ */
+struct rkmodule_pdaf_inf {
+	__u32 flag;
+
+	__u32 gainmap_width;
+	__u32 gainmap_height;
+	__u32 dccmap_width;
+	__u32 dccmap_height;
+	__u32 dcc_mode;
+	__u32 dcc_dir;
+	__u16 gainmap[RKMODULE_PADF_GAINMAP_LEN];
+	__u16 dccmap[RKMODULE_PDAF_DCCMAP_LEN];
+} __attribute__ ((packed));
+
 /**
  * struct rkmodule_inf - module information
  *
@@ -188,6 +208,7 @@ struct rkmodule_inf {
 	struct rkmodule_awb_inf awb;
 	struct rkmodule_lsc_inf lsc;
 	struct rkmodule_af_inf af;
+	struct rkmodule_pdaf_inf pdaf;
 } __attribute__ ((packed));
 
 /**

commit c20c1dc6bb857baa974790d39fb1503c5187d567
Author: Zhenke Fan <fanzy.fan@rock-chips.com>
Date:   Sat Oct 9 10:02:25 2021 +0800

    include: uapi/linux/rk-camera-module.h modify the rkmodule_lsc_inf
    
    Signed-off-by: Zhenke Fan <fanzy.fan@rock-chips.com>
    Change-Id: I89403b779bcd6191e6fe76e1412275ad1752d414

diff --git a/include/uapi/linux/rk-camera-module.h b/include/uapi/linux/rk-camera-module.h
index 0a6a5a78b6f4..2ecbedac6c10 100644
--- a/include/uapi/linux/rk-camera-module.h
+++ b/include/uapi/linux/rk-camera-module.h
@@ -15,7 +15,7 @@
 #define RKMODULE_EXTEND_LINE		24
 
 #define RKMODULE_NAME_LEN		32
-#define RKMODULE_LSCDATA_LEN		441
+#define RKMODULE_LSCDATA_LEN		289
 
 #define RKMODULE_MAX_VC_CH		4
 
@@ -160,6 +160,10 @@ struct rkmodule_lsc_inf {
 	__u16 lsc_b[RKMODULE_LSCDATA_LEN];
 	__u16 lsc_gr[RKMODULE_LSCDATA_LEN];
 	__u16 lsc_gb[RKMODULE_LSCDATA_LEN];
+
+	__u16 width;
+	__u16 height;
+	__u16 table_size;
 } __attribute__ ((packed));
 
 /**

commit 0feb50f9206e37db87d2455265b92c43105954f2
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Mon Oct 18 14:51:35 2021 +0800

    PCI: rockchip: dw: Fix gen switch case when link is up
    
    L0 may be detected just in time if Gen1 training is finished.
    But if EP supports higher Gen mode, Gen switch just happen
    there but we keep on accessing devices, which leads unstable
    link state and fail to detect the device finally.
    
    And a bit more time before accessing devices to avoid this risky
    case.
    
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: If7eddce430b4590922b5c8f765be8a240b562d92

diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
index c2203da4b6ca..d37d0732d702 100644
--- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
+++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
@@ -453,18 +453,24 @@ static int rk_pcie_establish_link(struct dw_pcie *pci)
 
 	/*
 	 * PCIe requires the refclk to be stable for 100µs prior to releasing
-	 * PERST.  See table 2-4 in section 2.6.2 AC Specifications of the PCI
-	 * Express Card Electromechanical Specification, 1.1. However, we don't
-	 * know if the refclk is coming from RC's PHY or external OSC. If it's
-	 * from RC, so enabling LTSSM is the just right place to release #PERST.
-	 * We need a little more extra time as before, rather than setting just
-	 * 100us as we don't know how long should the device need to reset.
+	 * 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
+	 * Card Electromechanical Specification 3.0. So 100ms in total is the min
+	 * requuirement here. We add a 1s for sake of hoping everthings work fine.
 	 */
 	msleep(1000);
 	gpiod_set_value_cansleep(rk_pcie->rst_gpio, 1);
 
 	for (retries = 0; retries < 10; retries++) {
 		if (dw_pcie_link_up(pci)) {
+			/*
+			 * We may be here in case of L0 in Gen1. But if EP is capable
+			 * of Gen2 or Gen3, Gen switch may happen just in this time, but
+			 * we keep on accessing devices in unstable link status. Given
+			 * that LTSSM max timeout is 24ms per period, we can wait a bit
+			 * more for Gen switch.
+			 */
+			msleep(100);
 			dev_info(pci->dev, "PCIe Link up, LTSSM is 0x%x\n",
 				 rk_pcie_readl_apb(rk_pcie, PCIE_CLIENT_LTSSM_STATUS));
 			rk_pcie_debug_dump(rk_pcie);

commit 00ae76eb0b8b2cddad801b9db3373a81d4ac6f8a
Author: Joseph Chen <chenjh@rock-chips.com>
Date:   Thu Oct 14 07:23:48 2021 +0000

    mfd: rk808: correct condition check to set pm_power_off as NULL
    
    Fixes porting:
    (62e9bedcf26d UPSTREAM: mfd: rk808: Check pm_power_off pointer)
    
    Signed-off-by: Joseph Chen <chenjh@rock-chips.com>
    Change-Id: I2fdb6bf8dc40260a68fb5b1155617f6dfebb4707

diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c
index 5a7b54714cc6..168dfcf31203 100644
--- a/drivers/mfd/rk808.c
+++ b/drivers/mfd/rk808.c
@@ -1431,7 +1431,7 @@ static int rk808_remove(struct i2c_client *client)
 	 * pm_power_off may points to a function from another module.
 	 * Check if the pointer is set by us and only then overwrite it.
 	 */
-	if (rk808->pm_pwroff_fn && pm_power_off == rk808->pm_pwroff_fn)
+	if (pm_power_off == rk808_pm_power_off_dummy)
 		pm_power_off = NULL;
 
 	/**

commit ff3fb243508dff481ffce75bd13e2f5084f3ddb3
Author: Joseph Chen <chenjh@rock-chips.com>
Date:   Mon Oct 11 07:23:23 2021 +0000

    mfd: rk808: format and imporve the coding style
    
    Try to keep the same as develop-5.10 code for easily
    compare files.
    
    Signed-off-by: Joseph Chen <chenjh@rock-chips.com>
    Change-Id: I19bf821f17d06ad9d46d3319e33c2e3c7823fdce

diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c
index abe91c6b8a1c..5a7b54714cc6 100644
--- a/drivers/mfd/rk808.c
+++ b/drivers/mfd/rk808.c
@@ -797,17 +797,16 @@ static void rk817_shutdown_prepare(void)
 					 RK817_SYS_CFG(3),
 					 RK817_SLPPIN_FUNC_MSK,
 					 SLPPIN_NULL_FUN);
-		if (ret) {
+		if (ret)
 			pr_err("shutdown: config SLPPIN_NULL_FUN error!\n");
-		}
 
 		ret = regmap_update_bits(rk808->regmap,
 					 RK817_SYS_CFG(3),
 					 RK817_SLPPOL_MSK,
 					 RK817_SLPPOL_H);
-		if (ret) {
+		if (ret)
 			pr_err("shutdown: config RK817_SLPPOL_H error!\n");
-		}
+
 		ret = pinctrl_select_state(rk808->pins->p,
 					   rk808->pins->power_off);
 		if (ret)
@@ -923,11 +922,15 @@ static ssize_t rk8xx_dbg_store(struct device *dev,
 	struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);
 
 	ret = sscanf(buf, "%c ", &cmd);
+	if (ret != 1) {
+		pr_err("Unknown command\n");
+		goto out;
+	}
 	switch (cmd) {
 	case 'w':
 		ret = sscanf(buf, "%c %x %x ", &cmd, &input[0], &input[1]);
 		if (ret != 3) {
-			pr_err("erro! cmd format: echo w [addr] [value]\n");
+			pr_err("error! cmd format: echo w [addr] [value]\n");
 			goto out;
 		};
 		addr = input[0] & 0xff;
@@ -940,7 +943,7 @@ static ssize_t rk8xx_dbg_store(struct device *dev,
 	case 'r':
 		ret = sscanf(buf, "%c %x ", &cmd, &input[0]);
 		if (ret != 2) {
-			pr_err("erro! cmd format: echo r [addr]\n");
+			pr_err("error! cmd format: echo r [addr]\n");
 			goto out;
 		};
 		pr_info("cmd : %c %x\n\n", cmd, input[0]);
@@ -1053,7 +1056,7 @@ static int rk817_reboot_notifier_handler(struct notifier_block *nb,
 	struct device *dev;
 	int value, power_en_active0, power_en_active1;
 	int ret, i;
-	const char *pmic_rst_reg_only_cmd[] = {
+	static const char * const pmic_rst_reg_only_cmd[] = {
 		"loader", "bootloader", "fastboot", "recovery",
 		"ums", "panic", "watchdog", "charge",
 	};
@@ -1378,7 +1381,6 @@ static int rk808_probe(struct i2c_client *client,
 		}
 	}
 
-
 	ret = devm_mfd_add_devices(&client->dev, PLATFORM_DEVID_NONE,
 			      cells, nr_cells, NULL, 0,
 			      regmap_irq_get_domain(rk808->irq_data));
@@ -1387,8 +1389,7 @@ static int rk808_probe(struct i2c_client *client,
 		goto err_irq;
 	}
 
-	pm_off = of_property_read_bool(np,
-				"rockchip,system-power-controller");
+	pm_off = of_property_read_bool(np, "rockchip,system-power-controller");
 	if (pm_off) {
 		if (!pm_power_off_prepare)
 			pm_power_off_prepare = rk808->pm_pwroff_prep_fn;
@@ -1448,11 +1449,10 @@ static int rk808_remove(struct i2c_client *client)
 
 static int __maybe_unused rk8xx_suspend(struct device *dev)
 {
+	struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);
 	int i, ret = 0;
 	int value;
 
-	struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);
-
 	for (i = 0; i < suspend_reg_num; i++) {
 		ret = regmap_update_bits(rk808->regmap,
 					 suspend_reg[i].addr,
@@ -1465,42 +1465,50 @@ static int __maybe_unused rk8xx_suspend(struct device *dev)
 		}
 	}
 
-	if (rk808->pins && rk808->pins->p && rk808->pins->sleep) {
-		ret = regmap_update_bits(rk808->regmap,
-					 RK817_SYS_CFG(3),
-					 RK817_SLPPIN_FUNC_MSK,
-					 SLPPIN_NULL_FUN);
-		if (ret) {
-			dev_err(dev, "suspend: config SLPPIN_NULL_FUN error!\n");
-			return ret;
-		}
+	switch (rk808->variant) {
+	case RK809_ID:
+	case RK817_ID:
+		if (rk808->pins && rk808->pins->p && rk808->pins->sleep) {
+			ret = regmap_update_bits(rk808->regmap,
+						 RK817_SYS_CFG(3),
+						 RK817_SLPPIN_FUNC_MSK,
+						 SLPPIN_NULL_FUN);
+			if (ret) {
+				dev_err(dev, "suspend: config SLPPIN_NULL_FUN error!\n");
+				return ret;
+			}
 
-		ret = regmap_update_bits(rk808->regmap,
-					 RK817_SYS_CFG(3),
-					 RK817_SLPPOL_MSK,
-					 RK817_SLPPOL_H);
-		if (ret) {
-			dev_err(dev, "suspend: config RK817_SLPPOL_H error!\n");
-			return ret;
-		}
+			ret = regmap_update_bits(rk808->regmap,
+						 RK817_SYS_CFG(3),
+						 RK817_SLPPOL_MSK,
+						 RK817_SLPPOL_H);
+			if (ret) {
+				dev_err(dev, "suspend: config RK817_SLPPOL_H error!\n");
+				return ret;
+			}
 
-		/* pmic need the SCL clock to synchronize register */
-		regmap_read(rk808->regmap, RK817_SYS_STS, &value);
-		mdelay(2);
-		ret = pinctrl_select_state(rk808->pins->p, rk808->pins->sleep);
-		if (ret) {
-			dev_err(dev, "failed to act slp pinctrl state\n");
-			return ret;
+			/* pmic need the SCL clock to synchronize register */
+			regmap_read(rk808->regmap, RK817_SYS_STS, &value);
+			mdelay(2);
+			ret = pinctrl_select_state(rk808->pins->p, rk808->pins->sleep);
+			if (ret) {
+				dev_err(dev, "failed to act slp pinctrl state\n");
+				return ret;
+			}
 		}
+		break;
+	default:
+		break;
 	}
+
 	return ret;
 }
 
 static int __maybe_unused rk8xx_resume(struct device *dev)
 {
+	struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);
 	int i, ret = 0;
 	int value;
-	struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);
 
 	for (i = 0; i < resume_reg_num; i++) {
 		ret = regmap_update_bits(rk808->regmap,
@@ -1513,32 +1521,41 @@ static int __maybe_unused rk8xx_resume(struct device *dev)
 			return ret;
 		}
 	}
-	if (rk808->pins && rk808->pins->p && rk808->pins->reset) {
-		ret = regmap_update_bits(rk808->regmap,
-					 RK817_SYS_CFG(3),
-					 RK817_SLPPIN_FUNC_MSK,
-					 SLPPIN_NULL_FUN);
-		if (ret) {
-			dev_err(dev, "resume: config SLPPIN_NULL_FUN error!\n");
-			return ret;
-		}
 
-		ret = regmap_update_bits(rk808->regmap,
-					 RK817_SYS_CFG(3),
-					 RK817_SLPPOL_MSK,
-					 RK817_SLPPOL_L);
-		if (ret) {
-			dev_err(dev, "resume: config RK817_SLPPOL_L error!\n");
-			return ret;
-		}
+	switch (rk808->variant) {
+	case RK809_ID:
+	case RK817_ID:
+		if (rk808->pins && rk808->pins->p && rk808->pins->reset) {
+			ret = regmap_update_bits(rk808->regmap,
+						 RK817_SYS_CFG(3),
+						 RK817_SLPPIN_FUNC_MSK,
+						 SLPPIN_NULL_FUN);
+			if (ret) {
+				dev_err(dev, "resume: config SLPPIN_NULL_FUN error!\n");
+				return ret;
+			}
 
-		/* pmic need the SCL clock to synchronize register */
-		regmap_read(rk808->regmap, RK817_SYS_STS, &value);
-		mdelay(2);
-		ret = pinctrl_select_state(rk808->pins->p, rk808->pins->reset);
-		if (ret)
-			dev_dbg(dev, "failed to act reset pinctrl state\n");
+			ret = regmap_update_bits(rk808->regmap,
+						 RK817_SYS_CFG(3),
+						 RK817_SLPPOL_MSK,
+						 RK817_SLPPOL_L);
+			if (ret) {
+				dev_err(dev, "resume: config RK817_SLPPOL_L error!\n");
+				return ret;
+			}
+
+			/* pmic need the SCL clock to synchronize register */
+			regmap_read(rk808->regmap, RK817_SYS_STS, &value);
+			mdelay(2);
+			ret = pinctrl_select_state(rk808->pins->p, rk808->pins->reset);
+			if (ret)
+				dev_dbg(dev, "failed to act reset pinctrl state\n");
+		}
+		break;
+	default:
+		break;
 	}
+
 	return ret;
 }
 SIMPLE_DEV_PM_OPS(rk8xx_pm_ops, rk8xx_suspend, rk8xx_resume);

commit de7d52e0846f92e8a808f2fed135e503ee56cc86
Merge: c979dfc05b5d f74f1728531c
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Sun Oct 17 10:40:32 2021 +0200

    Merge 4.19.212 into android-4.19-stable
    
    Changes in 4.19.212
            net: phy: bcm7xxx: Fixed indirect MMD operations
            HID: apple: Fix logical maximum and usage maximum of Magic Keyboard JIS
            netfilter: ip6_tables: zero-initialize fragment offset
            mac80211: Drop frames from invalid MAC address in ad-hoc mode
            m68k: Handle arrivals of multiple signals correctly
            net: prevent user from passing illegal stab size
            mac80211: check return value of rhashtable_init
            net: sun: SUNVNET_COMMON should depend on INET
            scsi: ses: Fix unsigned comparison with less than zero
            scsi: virtio_scsi: Fix spelling mistake "Unsupport" -> "Unsupported"
            perf/x86: Reset destroy callback on event init failure
            sched: Always inline is_percpu_thread()
            Linux 4.19.212
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I153ab17ac9e874c80b7b22b8bd8b7fa84bc12169

commit f74f1728531c43f4569eea4645fcc58feedc677a
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Sun Oct 17 10:19:49 2021 +0200

    Linux 4.19.212
    
    Link: https://lore.kernel.org/r/20211014145206.566123760@linuxfoundation.org
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Hulk Robot <hulkrobot@huawei.com>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index d4e6f5d326b0..484b0665e572 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 211
+SUBLEVEL = 212
 EXTRAVERSION =
 NAME = "People's Front"
 

commit dcc0e1a90a4a1bcc6837ed1c0496f164525eaac9
Author: Peter Zijlstra <peterz@infradead.org>
Date:   Mon Sep 20 15:31:11 2021 +0200

    sched: Always inline is_percpu_thread()
    
    [ Upstream commit 83d40a61046f73103b4e5d8f1310261487ff63b0 ]
    
      vmlinux.o: warning: objtool: check_preemption_disabled()+0x81: call to is_percpu_thread() leaves .noinstr.text section
    
    Reported-by: Stephen Rothwell <sfr@canb.auug.org.au>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20210928084218.063371959@infradead.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/sched.h b/include/linux/sched.h
index 5524cd5c6abe..761d0f85c4a5 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1433,7 +1433,7 @@ extern struct pid *cad_pid;
 #define tsk_used_math(p)			((p)->flags & PF_USED_MATH)
 #define used_math()				tsk_used_math(current)
 
-static inline bool is_percpu_thread(void)
+static __always_inline bool is_percpu_thread(void)
 {
 #ifdef CONFIG_SMP
 	return (current->flags & PF_NO_SETAFFINITY) &&

commit 2e5484e212af8fe551eda63a42336bce37d9e1cd
Author: Anand K Mistry <amistry@google.com>
Date:   Wed Sep 29 17:04:21 2021 +1000

    perf/x86: Reset destroy callback on event init failure
    
    [ Upstream commit 02d029a41dc986e2d5a77ecca45803857b346829 ]
    
    perf_init_event tries multiple init callbacks and does not reset the
    event state between tries. When x86_pmu_event_init runs, it
    unconditionally sets the destroy callback to hw_perf_event_destroy. On
    the next init attempt after x86_pmu_event_init, in perf_try_init_event,
    if the pmu's capabilities includes PERF_PMU_CAP_NO_EXCLUDE, the destroy
    callback will be run. However, if the next init didn't set the destroy
    callback, hw_perf_event_destroy will be run (since the callback wasn't
    reset).
    
    Looking at other pmu init functions, the common pattern is to only set
    the destroy callback on a successful init. Resetting the callback on
    failure tries to replicate that pattern.
    
    This was discovered after commit f11dd0d80555 ("perf/x86/amd/ibs: Extend
    PERF_PMU_CAP_NO_EXCLUDE to IBS Op") when the second (and only second)
    run of the perf tool after a reboot results in 0 samples being
    generated. The extra run of hw_perf_event_destroy results in
    active_events having an extra decrement on each perf run. The second run
    has active_events == 0 and every subsequent run has active_events < 0.
    When active_events == 0, the NMI handler will early-out and not record
    any samples.
    
    Signed-off-by: Anand K Mistry <amistry@google.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20210929170405.1.I078b98ee7727f9ae9d6df8262bad7e325e40faf0@changeid
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c
index 429389489eed..f612eb1cc818 100644
--- a/arch/x86/events/core.c
+++ b/arch/x86/events/core.c
@@ -2096,6 +2096,7 @@ static int x86_pmu_event_init(struct perf_event *event)
 	if (err) {
 		if (event->destroy)
 			event->destroy(event);
+		event->destroy = NULL;
 	}
 
 	if (READ_ONCE(x86_pmu.attr_rdpmc) &&

commit 94b96b3cc83da59874fe6af387d7ab8a6a706017
Author: Colin Ian King <colin.king@canonical.com>
Date:   Sat Sep 25 00:03:30 2021 +0100

    scsi: virtio_scsi: Fix spelling mistake "Unsupport" -> "Unsupported"
    
    [ Upstream commit cced4c0ec7c06f5230a2958907a409c849762293 ]
    
    There are a couple of spelling mistakes in pr_info and pr_err messages.
    Fix them.
    
    Link: https://lore.kernel.org/r/20210924230330.143785-1-colin.king@canonical.com
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c
index 3d331a864b2f..50e87823baab 100644
--- a/drivers/scsi/virtio_scsi.c
+++ b/drivers/scsi/virtio_scsi.c
@@ -336,7 +336,7 @@ static void virtscsi_handle_transport_reset(struct virtio_scsi *vscsi,
 		}
 		break;
 	default:
-		pr_info("Unsupport virtio scsi event reason %x\n", event->reason);
+		pr_info("Unsupported virtio scsi event reason %x\n", event->reason);
 	}
 }
 
@@ -389,7 +389,7 @@ static void virtscsi_handle_event(struct work_struct *work)
 		virtscsi_handle_param_change(vscsi, event);
 		break;
 	default:
-		pr_err("Unsupport virtio scsi event %x\n", event->event);
+		pr_err("Unsupported virtio scsi event %x\n", event->event);
 	}
 	virtscsi_kick_event(vscsi, event_node);
 }

commit 2f52b24f2140b99a8b7e86e99aacf2808fa9f9bb
Author: Jiapeng Chong <jiapeng.chong@linux.alibaba.com>
Date:   Fri Sep 24 17:51:53 2021 +0800

    scsi: ses: Fix unsigned comparison with less than zero
    
    [ Upstream commit dd689ed5aa905daf4ba4c99319a52aad6ea0a796 ]
    
    Fix the following coccicheck warning:
    
    ./drivers/scsi/ses.c:137:10-16: WARNING: Unsigned expression compared
    with zero: result > 0.
    
    Link: https://lore.kernel.org/r/1632477113-90378-1-git-send-email-jiapeng.chong@linux.alibaba.com
    Reported-by: Abaci Robot <abaci@linux.alibaba.com>
    Signed-off-by: Jiapeng Chong <jiapeng.chong@linux.alibaba.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/ses.c b/drivers/scsi/ses.c
index caf35ca577ce..e79d9f60a528 100644
--- a/drivers/scsi/ses.c
+++ b/drivers/scsi/ses.c
@@ -134,7 +134,7 @@ static int ses_recv_diag(struct scsi_device *sdev, int page_code,
 static int ses_send_diag(struct scsi_device *sdev, int page_code,
 			 void *buf, int bufflen)
 {
-	u32 result;
+	int result;
 
 	unsigned char cmd[] = {
 		SEND_DIAGNOSTIC,

commit 59a7b711b3fd475d3548a88caf24142ca31ecec6
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Mon Sep 27 14:48:23 2021 -0700

    net: sun: SUNVNET_COMMON should depend on INET
    
    [ Upstream commit 103bde372f084206c6972be543ecc247ebbff9f3 ]
    
    When CONFIG_INET is not set, there are failing references to IPv4
    functions, so make this driver depend on INET.
    
    Fixes these build errors:
    
    sparc64-linux-ld: drivers/net/ethernet/sun/sunvnet_common.o: in function `sunvnet_start_xmit_common':
    sunvnet_common.c:(.text+0x1a68): undefined reference to `__icmp_send'
    sparc64-linux-ld: drivers/net/ethernet/sun/sunvnet_common.o: in function `sunvnet_poll_common':
    sunvnet_common.c:(.text+0x358c): undefined reference to `ip_send_check'
    
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Cc: "David S. Miller" <davem@davemloft.net>
    Cc: Jakub Kicinski <kuba@kernel.org>
    Cc: Aaron Young <aaron.young@oracle.com>
    Cc: Rashmi Narasimhan <rashmi.narasimhan@oracle.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/sun/Kconfig b/drivers/net/ethernet/sun/Kconfig
index 7b982e02ea3a..1080a2a3e13a 100644
--- a/drivers/net/ethernet/sun/Kconfig
+++ b/drivers/net/ethernet/sun/Kconfig
@@ -73,6 +73,7 @@ config CASSINI
 config SUNVNET_COMMON
 	tristate "Common routines to support Sun Virtual Networking"
 	depends on SUN_LDOMS
+	depends on INET
 	default m
 
 config SUNVNET

commit 15a51ab442b46ff442ae410ecabe9f19ff7f7902
Author: MichelleJin <shjy180909@gmail.com>
Date:   Mon Sep 27 03:34:57 2021 +0000

    mac80211: check return value of rhashtable_init
    
    [ Upstream commit 111461d573741c17eafad029ac93474fa9adcce0 ]
    
    When rhashtable_init() fails, it returns -EINVAL.
    However, since error return value of rhashtable_init is not checked,
    it can cause use of uninitialized pointers.
    So, fix unhandled errors of rhashtable_init.
    
    Signed-off-by: MichelleJin <shjy180909@gmail.com>
    Link: https://lore.kernel.org/r/20210927033457.1020967-4-shjy180909@gmail.com
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/mac80211/mesh_pathtbl.c b/net/mac80211/mesh_pathtbl.c
index 6dc5f93b1e4d..06b44c3c831a 100644
--- a/net/mac80211/mesh_pathtbl.c
+++ b/net/mac80211/mesh_pathtbl.c
@@ -63,7 +63,10 @@ static struct mesh_table *mesh_table_alloc(void)
 	atomic_set(&newtbl->entries,  0);
 	spin_lock_init(&newtbl->gates_lock);
 	spin_lock_init(&newtbl->walk_lock);
-	rhashtable_init(&newtbl->rhead, &mesh_rht_params);
+	if (rhashtable_init(&newtbl->rhead, &mesh_rht_params)) {
+		kfree(newtbl);
+		return NULL;
+	}
 
 	return newtbl;
 }

commit 65492b05f4a4a18300863f00c51481cd8b32c689
Author: ?? <yun.wang@linux.alibaba.com>
Date:   Fri Sep 24 10:35:58 2021 +0800

    net: prevent user from passing illegal stab size
    
    [ Upstream commit b193e15ac69d56f35e1d8e2b5d16cbd47764d053 ]
    
    We observed below report when playing with netlink sock:
    
      UBSAN: shift-out-of-bounds in net/sched/sch_api.c:580:10
      shift exponent 249 is too large for 32-bit type
      CPU: 0 PID: 685 Comm: a.out Not tainted
      Call Trace:
       dump_stack_lvl+0x8d/0xcf
       ubsan_epilogue+0xa/0x4e
       __ubsan_handle_shift_out_of_bounds+0x161/0x182
       __qdisc_calculate_pkt_len+0xf0/0x190
       __dev_queue_xmit+0x2ed/0x15b0
    
    it seems like kernel won't check the stab log value passing from
    user, and will use the insane value later to calculate pkt_len.
    
    This patch just add a check on the size/cell_log to avoid insane
    calculation.
    
    Reported-by: Abaci <abaci@linux.alibaba.com>
    Signed-off-by: Michael Wang <yun.wang@linux.alibaba.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h
index 5e99771a5dcc..edca90ef3bdc 100644
--- a/include/net/pkt_sched.h
+++ b/include/net/pkt_sched.h
@@ -11,6 +11,7 @@
 #include <uapi/linux/pkt_sched.h>
 
 #define DEFAULT_TX_QUEUE_LEN	1000
+#define STAB_SIZE_LOG_MAX	30
 
 struct qdisc_walker {
 	int	stop;
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
index 1f12be9f0207..0bb4f7a94a3c 100644
--- a/net/sched/sch_api.c
+++ b/net/sched/sch_api.c
@@ -498,6 +498,12 @@ static struct qdisc_size_table *qdisc_get_stab(struct nlattr *opt,
 		return stab;
 	}
 
+	if (s->size_log > STAB_SIZE_LOG_MAX ||
+	    s->cell_log > STAB_SIZE_LOG_MAX) {
+		NL_SET_ERR_MSG(extack, "Invalid logarithmic size of size table");
+		return ERR_PTR(-EINVAL);
+	}
+
 	stab = kmalloc(sizeof(*stab) + tsize * sizeof(u16), GFP_KERNEL);
 	if (!stab)
 		return ERR_PTR(-ENOMEM);

commit 3cb487a6a6da291f592d177abe8447912e1c2f6f
Author: Al Viro <viro@zeniv.linux.org.uk>
Date:   Sun Jul 25 17:19:00 2021 +0000

    m68k: Handle arrivals of multiple signals correctly
    
    [ Upstream commit 4bb0bd81ce5e97092dfda6a106d414b703ec0ee8 ]
    
    When we have several pending signals, have entered with the kernel
    with large exception frame *and* have already built at least one
    sigframe, regs->stkadj is going to be non-zero and regs->format/sr/pc
    are going to be junk - the real values are in shifted exception stack
    frame we'd built when putting together the first sigframe.
    
    If that happens, subsequent sigframes are going to be garbage.
    Not hard to fix - just need to find the "adjusted" frame first
    and look for format/vector/sr/pc in it.
    
    Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
    Tested-by: Michael Schmitz <schmitzmic@gmail.com>
    Reviewed-by: Michael Schmitz <schmitzmic@gmail.com>
    Tested-by: Finn Thain <fthain@linux-m68k.org>
    Link: https://lore.kernel.org/r/YP2dBIAPTaVvHiZ6@zeniv-ca.linux.org.uk
    Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/m68k/kernel/signal.c b/arch/m68k/kernel/signal.c
index 72850b85ecf8..c67a68b6b69d 100644
--- a/arch/m68k/kernel/signal.c
+++ b/arch/m68k/kernel/signal.c
@@ -448,7 +448,7 @@ static inline void save_fpu_state(struct sigcontext *sc, struct pt_regs *regs)
 
 	if (CPU_IS_060 ? sc->sc_fpstate[2] : sc->sc_fpstate[0]) {
 		fpu_version = sc->sc_fpstate[0];
-		if (CPU_IS_020_OR_030 &&
+		if (CPU_IS_020_OR_030 && !regs->stkadj &&
 		    regs->vector >= (VEC_FPBRUC * 4) &&
 		    regs->vector <= (VEC_FPNAN * 4)) {
 			/* Clear pending exception in 68882 idle frame */
@@ -511,7 +511,7 @@ static inline int rt_save_fpu_state(struct ucontext __user *uc, struct pt_regs *
 		if (!(CPU_IS_060 || CPU_IS_COLDFIRE))
 			context_size = fpstate[1];
 		fpu_version = fpstate[0];
-		if (CPU_IS_020_OR_030 &&
+		if (CPU_IS_020_OR_030 && !regs->stkadj &&
 		    regs->vector >= (VEC_FPBRUC * 4) &&
 		    regs->vector <= (VEC_FPNAN * 4)) {
 			/* Clear pending exception in 68882 idle frame */
@@ -828,18 +828,24 @@ asmlinkage int do_rt_sigreturn(struct pt_regs *regs, struct switch_stack *sw)
 	return 0;
 }
 
+static inline struct pt_regs *rte_regs(struct pt_regs *regs)
+{
+	return (void *)regs + regs->stkadj;
+}
+
 static void setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs,
 			     unsigned long mask)
 {
+	struct pt_regs *tregs = rte_regs(regs);
 	sc->sc_mask = mask;
 	sc->sc_usp = rdusp();
 	sc->sc_d0 = regs->d0;
 	sc->sc_d1 = regs->d1;
 	sc->sc_a0 = regs->a0;
 	sc->sc_a1 = regs->a1;
-	sc->sc_sr = regs->sr;
-	sc->sc_pc = regs->pc;
-	sc->sc_formatvec = regs->format << 12 | regs->vector;
+	sc->sc_sr = tregs->sr;
+	sc->sc_pc = tregs->pc;
+	sc->sc_formatvec = tregs->format << 12 | tregs->vector;
 	save_a5_state(sc, regs);
 	save_fpu_state(sc, regs);
 }
@@ -847,6 +853,7 @@ static void setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs,
 static inline int rt_setup_ucontext(struct ucontext __user *uc, struct pt_regs *regs)
 {
 	struct switch_stack *sw = (struct switch_stack *)regs - 1;
+	struct pt_regs *tregs = rte_regs(regs);
 	greg_t __user *gregs = uc->uc_mcontext.gregs;
 	int err = 0;
 
@@ -867,9 +874,9 @@ static inline int rt_setup_ucontext(struct ucontext __user *uc, struct pt_regs *
 	err |= __put_user(sw->a5, &gregs[13]);
 	err |= __put_user(sw->a6, &gregs[14]);
 	err |= __put_user(rdusp(), &gregs[15]);
-	err |= __put_user(regs->pc, &gregs[16]);
-	err |= __put_user(regs->sr, &gregs[17]);
-	err |= __put_user((regs->format << 12) | regs->vector, &uc->uc_formatvec);
+	err |= __put_user(tregs->pc, &gregs[16]);
+	err |= __put_user(tregs->sr, &gregs[17]);
+	err |= __put_user((tregs->format << 12) | tregs->vector, &uc->uc_formatvec);
 	err |= rt_save_fpu_state(uc, regs);
 	return err;
 }
@@ -886,13 +893,14 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
 			struct pt_regs *regs)
 {
 	struct sigframe __user *frame;
-	int fsize = frame_extra_sizes(regs->format);
+	struct pt_regs *tregs = rte_regs(regs);
+	int fsize = frame_extra_sizes(tregs->format);
 	struct sigcontext context;
 	int err = 0, sig = ksig->sig;
 
 	if (fsize < 0) {
 		pr_debug("setup_frame: Unknown frame format %#x\n",
-			 regs->format);
+			 tregs->format);
 		return -EFAULT;
 	}
 
@@ -903,7 +911,7 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
 
 	err |= __put_user(sig, &frame->sig);
 
-	err |= __put_user(regs->vector, &frame->code);
+	err |= __put_user(tregs->vector, &frame->code);
 	err |= __put_user(&frame->sc, &frame->psc);
 
 	if (_NSIG_WORDS > 1)
@@ -928,34 +936,28 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
 
 	push_cache ((unsigned long) &frame->retcode);
 
-	/*
-	 * Set up registers for signal handler.  All the state we are about
-	 * to destroy is successfully copied to sigframe.
-	 */
-	wrusp ((unsigned long) frame);
-	regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
-	adjustformat(regs);
-
 	/*
 	 * This is subtle; if we build more than one sigframe, all but the
 	 * first one will see frame format 0 and have fsize == 0, so we won't
 	 * screw stkadj.
 	 */
-	if (fsize)
+	if (fsize) {
 		regs->stkadj = fsize;
-
-	/* Prepare to skip over the extra stuff in the exception frame.  */
-	if (regs->stkadj) {
-		struct pt_regs *tregs =
-			(struct pt_regs *)((ulong)regs + regs->stkadj);
+		tregs = rte_regs(regs);
 		pr_debug("Performing stackadjust=%04lx\n", regs->stkadj);
-		/* This must be copied with decreasing addresses to
-                   handle overlaps.  */
 		tregs->vector = 0;
 		tregs->format = 0;
-		tregs->pc = regs->pc;
 		tregs->sr = regs->sr;
 	}
+
+	/*
+	 * Set up registers for signal handler.  All the state we are about
+	 * to destroy is successfully copied to sigframe.
+	 */
+	wrusp ((unsigned long) frame);
+	tregs->pc = (unsigned long) ksig->ka.sa.sa_handler;
+	adjustformat(regs);
+
 	return 0;
 }
 
@@ -963,7 +965,8 @@ static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
 			   struct pt_regs *regs)
 {
 	struct rt_sigframe __user *frame;
-	int fsize = frame_extra_sizes(regs->format);
+	struct pt_regs *tregs = rte_regs(regs);
+	int fsize = frame_extra_sizes(tregs->format);
 	int err = 0, sig = ksig->sig;
 
 	if (fsize < 0) {
@@ -1012,34 +1015,27 @@ static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
 
 	push_cache ((unsigned long) &frame->retcode);
 
-	/*
-	 * Set up registers for signal handler.  All the state we are about
-	 * to destroy is successfully copied to sigframe.
-	 */
-	wrusp ((unsigned long) frame);
-	regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
-	adjustformat(regs);
-
 	/*
 	 * This is subtle; if we build more than one sigframe, all but the
 	 * first one will see frame format 0 and have fsize == 0, so we won't
 	 * screw stkadj.
 	 */
-	if (fsize)
+	if (fsize) {
 		regs->stkadj = fsize;
-
-	/* Prepare to skip over the extra stuff in the exception frame.  */
-	if (regs->stkadj) {
-		struct pt_regs *tregs =
-			(struct pt_regs *)((ulong)regs + regs->stkadj);
+		tregs = rte_regs(regs);
 		pr_debug("Performing stackadjust=%04lx\n", regs->stkadj);
-		/* This must be copied with decreasing addresses to
-                   handle overlaps.  */
 		tregs->vector = 0;
 		tregs->format = 0;
-		tregs->pc = regs->pc;
 		tregs->sr = regs->sr;
 	}
+
+	/*
+	 * Set up registers for signal handler.  All the state we are about
+	 * to destroy is successfully copied to sigframe.
+	 */
+	wrusp ((unsigned long) frame);
+	tregs->pc = (unsigned long) ksig->ka.sa.sa_handler;
+	adjustformat(regs);
 	return 0;
 }
 

commit 2cbfc093fcdaceb9e1c0a76829014de9a57c7d98
Author: YueHaibing <yuehaibing@huawei.com>
Date:   Fri Aug 27 22:42:30 2021 +0800

    mac80211: Drop frames from invalid MAC address in ad-hoc mode
    
    [ Upstream commit a6555f844549cd190eb060daef595f94d3de1582 ]
    
    WARNING: CPU: 1 PID: 9 at net/mac80211/sta_info.c:554
    sta_info_insert_rcu+0x121/0x12a0
    Modules linked in:
    CPU: 1 PID: 9 Comm: kworker/u8:1 Not tainted 5.14.0-rc7+ #253
    Workqueue: phy3 ieee80211_iface_work
    RIP: 0010:sta_info_insert_rcu+0x121/0x12a0
    ...
    Call Trace:
     ieee80211_ibss_finish_sta+0xbc/0x170
     ieee80211_ibss_work+0x13f/0x7d0
     ieee80211_iface_work+0x37a/0x500
     process_one_work+0x357/0x850
     worker_thread+0x41/0x4d0
    
    If an Ad-Hoc node receives packets with invalid source MAC address,
    it hits a WARN_ON in sta_info_insert_check(), this can spam the log.
    
    Signed-off-by: YueHaibing <yuehaibing@huawei.com>
    Link: https://lore.kernel.org/r/20210827144230.39944-1-yuehaibing@huawei.com
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 012697efafc3..e0baa563a4de 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -3875,7 +3875,8 @@ static bool ieee80211_accept_frame(struct ieee80211_rx_data *rx)
 		if (!bssid)
 			return false;
 		if (ether_addr_equal(sdata->vif.addr, hdr->addr2) ||
-		    ether_addr_equal(sdata->u.ibss.bssid, hdr->addr2))
+		    ether_addr_equal(sdata->u.ibss.bssid, hdr->addr2) ||
+		    !is_valid_ether_addr(hdr->addr2))
 			return false;
 		if (ieee80211_is_beacon(hdr->frame_control))
 			return true;

commit d169887d824bff0101c7c7ec2292d250e8cfe95d
Author: Jeremy Sowden <jeremy@azazel.net>
Date:   Sun Sep 12 22:24:33 2021 +0100

    netfilter: ip6_tables: zero-initialize fragment offset
    
    [ Upstream commit 310e2d43c3ad429c1fba4b175806cf1f55ed73a6 ]
    
    ip6tables only sets the `IP6T_F_PROTO` flag on a rule if a protocol is
    specified (`-p tcp`, for example).  However, if the flag is not set,
    `ip6_packet_match` doesn't call `ipv6_find_hdr` for the skb, in which
    case the fragment offset is left uninitialized and a garbage value is
    passed to each matcher.
    
    Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
    Reviewed-by: Florian Westphal <fw@strlen.de>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c
index dd0c1073dc8e..d93490ac8275 100644
--- a/net/ipv6/netfilter/ip6_tables.c
+++ b/net/ipv6/netfilter/ip6_tables.c
@@ -276,6 +276,7 @@ ip6t_do_table(struct sk_buff *skb,
 	 * things we don't know, ie. tcp syn flag or ports).  If the
 	 * rule is also a fragment-specific rule, non-fragments won't
 	 * match it. */
+	acpar.fragoff = 0;
 	acpar.hotdrop = false;
 	acpar.state   = state;
 

commit c9f4440a1f5a9d91ed72b35232f0147d6efcc8ae
Author: Mizuho Mori <morimolymoly@gmail.com>
Date:   Thu Jul 29 20:03:25 2021 +0900

    HID: apple: Fix logical maximum and usage maximum of Magic Keyboard JIS
    
    [ Upstream commit 67fd71ba16a37c663d139f5ba5296f344d80d072 ]
    
    Apple Magic Keyboard(JIS)'s Logical Maximum and Usage Maximum are wrong.
    
    Below is a report descriptor.
    
    0x05, 0x01,         /*  Usage Page (Desktop),                           */
    0x09, 0x06,         /*  Usage (Keyboard),                               */
    0xA1, 0x01,         /*  Collection (Application),                       */
    0x85, 0x01,         /*      Report ID (1),                              */
    0x05, 0x07,         /*      Usage Page (Keyboard),                      */
    0x15, 0x00,         /*      Logical Minimum (0),                        */
    0x25, 0x01,         /*      Logical Maximum (1),                        */
    0x19, 0xE0,         /*      Usage Minimum (KB Leftcontrol),             */
    0x29, 0xE7,         /*      Usage Maximum (KB Right GUI),               */
    0x75, 0x01,         /*      Report Size (1),                            */
    0x95, 0x08,         /*      Report Count (8),                           */
    0x81, 0x02,         /*      Input (Variable),                           */
    0x95, 0x05,         /*      Report Count (5),                           */
    0x75, 0x01,         /*      Report Size (1),                            */
    0x05, 0x08,         /*      Usage Page (LED),                           */
    0x19, 0x01,         /*      Usage Minimum (01h),                        */
    0x29, 0x05,         /*      Usage Maximum (05h),                        */
    0x91, 0x02,         /*      Output (Variable),                          */
    0x95, 0x01,         /*      Report Count (1),                           */
    0x75, 0x03,         /*      Report Size (3),                            */
    0x91, 0x03,         /*      Output (Constant, Variable),                */
    0x95, 0x08,         /*      Report Count (8),                           */
    0x75, 0x01,         /*      Report Size (1),                            */
    0x15, 0x00,         /*      Logical Minimum (0),                        */
    0x25, 0x01,         /*      Logical Maximum (1),                        */
    
    here is a report descriptor which is parsed one in kernel.
    see sys/kernel/debug/hid/<dev>/rdesc
    
    05 01 09 06 a1 01 85 01 05 07
    15 00 25 01 19 e0 29 e7 75 01
    95 08 81 02 95 05 75 01 05 08
    19 01 29 05 91 02 95 01 75 03
    91 03 95 08 75 01 15 00 25 01
    06 00 ff 09 03 81 03 95 06 75
    08 15 00 25 [65] 05 07 19 00 29
    [65] 81 00 95 01 75 01 15 00 25
    01 05 0c 09 b8 81 02 95 01 75
    01 06 01 ff 09 03 81 02 95 01
    75 06 81 03 06 02 ff 09 55 85
    55 15 00 26 ff 00 75 08 95 40
    b1 a2 c0 06 00 ff 09 14 a1 01
    85 90 05 84 75 01 95 03 15 00
    25 01 09 61 05 85 09 44 09 46
    81 02 95 05 81 01 75 08 95 01
    15 00 26 ff 00 09 65 81 02 c0
    00
    
    Position 64(Logical Maximum) and 70(Usage Maximum) are 101.
    Both should be 0xE7 to support JIS specific keys(?? Eisu, Kana, |) support.
    position 117 is also 101 but not related(it is Usage 65h).
    
    There are no difference of product id between JIS and ANSI.
    They are same 0x0267.
    
    Signed-off-by: Mizuho Mori <morimolymoly@gmail.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c
index b58ab769aa7b..4e3dd3f55a96 100644
--- a/drivers/hid/hid-apple.c
+++ b/drivers/hid/hid-apple.c
@@ -304,12 +304,19 @@ static int apple_event(struct hid_device *hdev, struct hid_field *field,
 
 /*
  * MacBook JIS keyboard has wrong logical maximum
+ * Magic Keyboard JIS has wrong logical maximum
  */
 static __u8 *apple_report_fixup(struct hid_device *hdev, __u8 *rdesc,
 		unsigned int *rsize)
 {
 	struct apple_sc *asc = hid_get_drvdata(hdev);
 
+	if(*rsize >=71 && rdesc[70] == 0x65 && rdesc[64] == 0x65) {
+		hid_info(hdev,
+			 "fixing up Magic Keyboard JIS report descriptor\n");
+		rdesc[64] = rdesc[70] = 0xe7;
+	}
+
 	if ((asc->quirks & APPLE_RDESC_JIS) && *rsize >= 60 &&
 			rdesc[53] == 0x65 && rdesc[59] == 0x65) {
 		hid_info(hdev,

commit 403c71f36d4acff4741218f3136da06402ff9562
Author: Florian Fainelli <f.fainelli@gmail.com>
Date:   Tue Sep 28 13:32:33 2021 -0700

    net: phy: bcm7xxx: Fixed indirect MMD operations
    
    commit d88fd1b546ff19c8040cfaea76bf16aed1c5a0bb upstream.
    
    When EEE support was added to the 28nm EPHY it was assumed that it would
    be able to support the standard clause 45 over clause 22 register access
    method. It turns out that the PHY does not support that, which is the
    very reason for using the indirect shadow mode 2 bank 3 access method.
    
    Implement {read,write}_mmd to allow the standard PHY library routines
    pertaining to EEE querying and configuration to work correctly on these
    PHYs. This forces us to implement a __phy_set_clr_bits() function that
    does not grab the MDIO bus lock since the PHY driver's {read,write}_mmd
    functions are always called with that lock held.
    
    Fixes: 83ee102a6998 ("net: phy: bcm7xxx: add support for 28nm EPHY")
    [florian: adjust locking since phy_{read,write}_mmd are called with no
    PHYLIB locks held]
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/phy/bcm7xxx.c b/drivers/net/phy/bcm7xxx.c
index acaf072bb4b0..35dc4ca696d3 100644
--- a/drivers/net/phy/bcm7xxx.c
+++ b/drivers/net/phy/bcm7xxx.c
@@ -30,7 +30,12 @@
 #define MII_BCM7XXX_SHD_2_ADDR_CTRL	0xe
 #define MII_BCM7XXX_SHD_2_CTRL_STAT	0xf
 #define MII_BCM7XXX_SHD_2_BIAS_TRIM	0x1a
+#define MII_BCM7XXX_SHD_3_PCS_CTRL	0x0
+#define MII_BCM7XXX_SHD_3_PCS_STATUS	0x1
+#define MII_BCM7XXX_SHD_3_EEE_CAP	0x2
 #define MII_BCM7XXX_SHD_3_AN_EEE_ADV	0x3
+#define MII_BCM7XXX_SHD_3_EEE_LP	0x4
+#define MII_BCM7XXX_SHD_3_EEE_WK_ERR	0x5
 #define MII_BCM7XXX_SHD_3_PCS_CTRL_2	0x6
 #define  MII_BCM7XXX_PCS_CTRL_2_DEF	0x4400
 #define MII_BCM7XXX_SHD_3_AN_STAT	0xb
@@ -463,6 +468,93 @@ static int bcm7xxx_28nm_ephy_config_init(struct phy_device *phydev)
 	return bcm7xxx_28nm_ephy_apd_enable(phydev);
 }
 
+#define MII_BCM7XXX_REG_INVALID	0xff
+
+static u8 bcm7xxx_28nm_ephy_regnum_to_shd(u16 regnum)
+{
+	switch (regnum) {
+	case MDIO_CTRL1:
+		return MII_BCM7XXX_SHD_3_PCS_CTRL;
+	case MDIO_STAT1:
+		return MII_BCM7XXX_SHD_3_PCS_STATUS;
+	case MDIO_PCS_EEE_ABLE:
+		return MII_BCM7XXX_SHD_3_EEE_CAP;
+	case MDIO_AN_EEE_ADV:
+		return MII_BCM7XXX_SHD_3_AN_EEE_ADV;
+	case MDIO_AN_EEE_LPABLE:
+		return MII_BCM7XXX_SHD_3_EEE_LP;
+	case MDIO_PCS_EEE_WK_ERR:
+		return MII_BCM7XXX_SHD_3_EEE_WK_ERR;
+	default:
+		return MII_BCM7XXX_REG_INVALID;
+	}
+}
+
+static bool bcm7xxx_28nm_ephy_dev_valid(int devnum)
+{
+	return devnum == MDIO_MMD_AN || devnum == MDIO_MMD_PCS;
+}
+
+static int bcm7xxx_28nm_ephy_read_mmd(struct phy_device *phydev,
+				      int devnum, u16 regnum)
+{
+	u8 shd = bcm7xxx_28nm_ephy_regnum_to_shd(regnum);
+	int ret;
+
+	if (!bcm7xxx_28nm_ephy_dev_valid(devnum) ||
+	    shd == MII_BCM7XXX_REG_INVALID)
+		return -EOPNOTSUPP;
+
+	/* set shadow mode 2 */
+	ret = phy_set_clr_bits(phydev, MII_BCM7XXX_TEST,
+			       MII_BCM7XXX_SHD_MODE_2, 0);
+	if (ret < 0)
+		return ret;
+
+	/* Access the desired shadow register address */
+	ret = phy_write(phydev, MII_BCM7XXX_SHD_2_ADDR_CTRL, shd);
+	if (ret < 0)
+		goto reset_shadow_mode;
+
+	ret = phy_read(phydev, MII_BCM7XXX_SHD_2_CTRL_STAT);
+
+reset_shadow_mode:
+	/* reset shadow mode 2 */
+	phy_set_clr_bits(phydev, MII_BCM7XXX_TEST, 0,
+			 MII_BCM7XXX_SHD_MODE_2);
+	return ret;
+}
+
+static int bcm7xxx_28nm_ephy_write_mmd(struct phy_device *phydev,
+				       int devnum, u16 regnum, u16 val)
+{
+	u8 shd = bcm7xxx_28nm_ephy_regnum_to_shd(regnum);
+	int ret;
+
+	if (!bcm7xxx_28nm_ephy_dev_valid(devnum) ||
+	    shd == MII_BCM7XXX_REG_INVALID)
+		return -EOPNOTSUPP;
+
+	/* set shadow mode 2 */
+	ret = phy_set_clr_bits(phydev, MII_BCM7XXX_TEST,
+			       MII_BCM7XXX_SHD_MODE_2, 0);
+	if (ret < 0)
+		return ret;
+
+	/* Access the desired shadow register address */
+	ret = phy_write(phydev, MII_BCM7XXX_SHD_2_ADDR_CTRL, shd);
+	if (ret < 0)
+		goto reset_shadow_mode;
+
+	/* Write the desired value in the shadow register */
+	phy_write(phydev, MII_BCM7XXX_SHD_2_CTRL_STAT, val);
+
+reset_shadow_mode:
+	/* reset shadow mode 2 */
+	return phy_set_clr_bits(phydev, MII_BCM7XXX_TEST, 0,
+				MII_BCM7XXX_SHD_MODE_2);
+}
+
 static int bcm7xxx_28nm_ephy_resume(struct phy_device *phydev)
 {
 	int ret;
@@ -634,6 +726,8 @@ static int bcm7xxx_28nm_probe(struct phy_device *phydev)
 	.get_strings	= bcm_phy_get_strings,				\
 	.get_stats	= bcm7xxx_28nm_get_phy_stats,			\
 	.probe		= bcm7xxx_28nm_probe,				\
+	.read_mmd	= bcm7xxx_28nm_ephy_read_mmd,			\
+	.write_mmd	= bcm7xxx_28nm_ephy_write_mmd,			\
 }
 
 #define BCM7XXX_40NM_EPHY(_oui, _name)					\

commit b3411ad8b4a08f7b1ccca53825c3285a9881f246
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Thu Oct 14 20:07:00 2021 +0800

    drivers: rkflash: Recheck the cache only the spinand devices in need
    
    The operation of reading back flash cache after programing is not
    universal. At present, only ESMT devices are found to have this anomaly.
    
    Change-Id: I3ec21eebc4aa7b8a259129ed2c036e1168553f27
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/rkflash/sfc_nand.c b/drivers/rkflash/sfc_nand.c
index 712197e46c5b..925e717bf287 100644
--- a/drivers/rkflash/sfc_nand.c
+++ b/drivers/rkflash/sfc_nand.c
@@ -775,7 +775,7 @@ u32 sfc_nand_prog_page_raw(u8 cs, u32 addr, u32 *p_page_buf)
 	 * is detected by cache recheck, it's better to wait a second for a reliable
 	 * hardware environment to avoid abnormal data written to flash array.
 	 */
-	if (p_nand_info->id0 != MID_XTX) {
+	if (p_nand_info->id0 == MID_GIGADEV) {
 		sfc_nand_read_cache(addr, (u32 *)sfc_nand_dev.recheck_buffer, 0, data_area_size);
 		if (memcmp(sfc_nand_dev.recheck_buffer, p_page_buf, data_area_size)) {
 			rkflash_print_error("%s %x cache bitflip\n", __func__, addr);

commit 72edc8e4646cbc29fa5122d685ddf32d29952d36
Author: YouMin Chen <cym@rock-chips.com>
Date:   Thu Sep 30 20:15:52 2021 +0800

    arm64: dts: rockchip: rk3568: remove ddr_timing node
    
    Signed-off-by: YouMin Chen <cym@rock-chips.com>
    Change-Id: Iaef7442a52bfadee989c507e4fb9e60d50f9c49e

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-dram-default-timing.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-dram-default-timing.dtsi
index a3c6863651fc..99247fb7921a 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-dram-default-timing.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-dram-default-timing.dtsi
@@ -397,76 +397,4 @@
 		lp4_dq_vref_odtoff = <420>;
 		lp4_ca_vref_odtoff = <343>;
 	};
-
-	ddr_timing: ddr_timing {
-		compatible = "rockchip,ddr-timing";
-		ddr2_speed_bin = <DDR2_DEFAULT>;
-		ddr3_speed_bin = <DDR3_DEFAULT>;
-		ddr4_speed_bin = <DDR4_DEFAULT>;
-		pd_idle = <13>;
-		sr_idle = <93>;
-		sr_mc_gate_idle = <0>;
-		srpd_lite_idle = <0>;
-		standby_idle = <0>;
-
-		auto_pd_dis_freq = <1066>;
-		auto_sr_dis_freq = <800>;
-		ddr2_dll_dis_freq = <300>;
-		ddr3_dll_dis_freq = <300>;
-		ddr4_dll_dis_freq = <625>;
-		phy_dll_dis_freq = <400>;
-
-		ddr2_odt_dis_freq = <100>;
-		phy_ddr2_odt_dis_freq = <100>;
-		ddr2_drv = <DDR2_DS_REDUCE>;
-		ddr2_odt = <DDR2_ODT_150ohm>;
-		phy_ddr2_ca_drv = <PHY_DDR4_DS_ODT_DISABLE>;
-		phy_ddr2_ck_drv = <PHY_DDR4_DS_ODT_DISABLE>;
-		phy_ddr2_dq_drv = <PHY_DDR4_DS_ODT_DISABLE>;
-		phy_ddr2_odt = <PHY_DDR4_DS_ODT_DISABLE>;
-
-		ddr3_odt_dis_freq = <333>;
-		phy_ddr3_odt_dis_freq = <333>;
-		ddr3_drv = <DDR3_DS_34ohm>;
-		ddr3_odt = <DDR3_ODT_120ohm>;
-		phy_ddr3_ca_drv = <PHY_DDR4_DS_ODT_DISABLE>;
-		phy_ddr3_ck_drv = <PHY_DDR4_DS_ODT_DISABLE>;
-		phy_ddr3_dq_drv = <PHY_DDR4_DS_ODT_DISABLE>;
-		phy_ddr3_odt = <PHY_DDR4_DS_ODT_DISABLE>;
-
-		phy_lpddr2_odt_dis_freq = <333>;
-		lpddr2_drv = <LP2_DS_40ohm>;
-		phy_lpddr2_ca_drv = <PHY_DDR4_DS_ODT_DISABLE>;
-		phy_lpddr2_ck_drv = <PHY_DDR4_DS_ODT_DISABLE>;
-		phy_lpddr2_dq_drv = <PHY_DDR4_DS_ODT_DISABLE>;
-		phy_lpddr2_odt = <PHY_DDR4_DS_ODT_DISABLE>;
-
-		lpddr3_odt_dis_freq = <333>;
-		phy_lpddr3_odt_dis_freq = <333>;
-		lpddr3_drv = <LP3_DS_34ohm>;
-		lpddr3_odt = <LP3_ODT_120ohm>;
-		phy_lpddr3_ca_drv = <PHY_DDR4_DS_ODT_DISABLE>;
-		phy_lpddr3_ck_drv = <PHY_DDR4_DS_ODT_DISABLE>;
-		phy_lpddr3_dq_drv = <PHY_DDR4_DS_ODT_DISABLE>;
-		phy_lpddr3_odt = <PHY_DDR4_DS_ODT_DISABLE>;
-
-		lpddr4_odt_dis_freq = <333>;
-		phy_lpddr4_odt_dis_freq = <333>;
-		lpddr4_drv = <LP4_PDDS_40ohm>;
-		lpddr4_dq_odt = <LP4_DQ_ODT_240ohm>;
-		lpddr4_ca_odt = <LP4_CA_ODT_DIS>;
-		phy_lpddr4_ca_drv = <PHY_DDR4_DS_ODT_DISABLE>;
-		phy_lpddr4_ck_cs_drv = <PHY_DDR4_DS_ODT_DISABLE>;
-		phy_lpddr4_dq_drv = <PHY_DDR4_DS_ODT_DISABLE>;
-		phy_lpddr4_odt = <PHY_DDR4_DS_ODT_DISABLE>;
-
-		ddr4_odt_dis_freq = <625>;
-		phy_ddr4_odt_dis_freq = <625>;
-		ddr4_drv = <DDR4_DS_34ohm>;
-		ddr4_odt = <DDR4_ODT_120ohm>;
-		phy_ddr4_ca_drv = <PHY_DDR4_DS_ODT_DISABLE>;
-		phy_ddr4_ck_drv = <PHY_DDR4_DS_ODT_DISABLE>;
-		phy_ddr4_dq_drv = <PHY_DDR4_DS_ODT_DISABLE>;
-		phy_ddr4_odt = <PHY_DDR4_DS_ODT_DISABLE>;
-	};
 };
diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index b604ca9f1852..94751f30bf48 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -2150,7 +2150,6 @@
 		clocks = <&scmi_clk 3>;
 		clock-names = "dmc_clk";
 		operating-points-v2 = <&dmc_opp_table>;
-		ddr_timing = <&ddr_timing>;
 		vop-bw-dmc-freq = <
 		/* min_bw(MB/s) max_bw(MB/s) freq(KHz) */
 			0	572	324000

commit 6a53296ce89024ffc9b438aaff35cc9be0e9e9f2
Author: YouMin Chen <cym@rock-chips.com>
Date:   Thu Sep 30 20:14:31 2021 +0800

    PM / devfreq: rockchip_dmc: remove of_get_rk3568_timings
    
    For rk3568, ddr timings adjustment is no longer supported in dmc drive.
    
    Signed-off-by: YouMin Chen <cym@rock-chips.com>
    Change-Id: I63f0c5fea8c5acf8e6ef8f44b62968deb7bd823e

diff --git a/drivers/devfreq/rockchip_dmc.c b/drivers/devfreq/rockchip_dmc.c
index e62e56fffed2..e053f527da19 100644
--- a/drivers/devfreq/rockchip_dmc.c
+++ b/drivers/devfreq/rockchip_dmc.c
@@ -900,42 +900,6 @@ static void of_get_rk3328_timings(struct device *dev,
 	of_node_put(np_tim);
 }
 
-static void of_get_rk3568_timings(struct device *dev,
-				  struct device_node *np, uint32_t *timing)
-{
-	struct device_node *np_tim;
-	u32 *p;
-	struct rk3568_ddr_dts_config_timing *dts_timing;
-	int ret = 0;
-	u32 i;
-
-	dts_timing =
-		(struct rk3568_ddr_dts_config_timing *)(timing +
-							DTS_PAR_OFFSET / 4);
-
-	np_tim = of_parse_phandle(np, "ddr_timing", 0);
-	if (!np_tim) {
-		ret = -EINVAL;
-		goto end;
-	}
-
-	p = (u32 *)dts_timing;
-	for (i = 0; i < ARRAY_SIZE(px30_dts_timing); i++) {
-		ret |= of_property_read_u32(np_tim, px30_dts_timing[i],
-					p + i);
-	}
-
-end:
-	if (!ret) {
-		dts_timing->available = 1;
-	} else {
-		dts_timing->available = 0;
-		dev_err(dev, "of_get_ddr_timings: fail\n");
-	}
-
-	of_node_put(np_tim);
-}
-
 static void of_get_rv1126_timings(struct device *dev,
 				  struct device_node *np, uint32_t *timing)
 {
@@ -1804,7 +1768,6 @@ static __maybe_unused int rk3568_dmc_init(struct platform_device *pdev,
 					  struct rockchip_dmcfreq *dmcfreq)
 {
 	struct arm_smccc_res res;
-	u32 size;
 	int ret;
 	int complt_irq;
 
@@ -1818,18 +1781,17 @@ static __maybe_unused int rk3568_dmc_init(struct platform_device *pdev,
 
 	/*
 	 * first 4KB is used for interface parameters
-	 * after 4KB * N is dts parameters
+	 * after 4KB is dts parameters
+	 * request share memory size 4KB * 2
 	 */
-	size = sizeof(struct rk1808_ddr_dts_config_timing);
-	res = sip_smc_request_share_mem(DIV_ROUND_UP(size, 4096) + 1,
-					SHARE_PAGE_TYPE_DDR);
+	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;
-	of_get_rk3568_timings(&pdev->dev, pdev->dev.of_node,
-			      (uint32_t *)ddr_psci_param);
+	/* Clear ddr_psci_param, size is 4KB * 2 */
+	memset_io(ddr_psci_param, 0x0, 4096 * 2);
 
 	/* start mcu with sip_smc_dram */
 	wait_ctrl.dcf_en = 2;
@@ -1854,14 +1816,6 @@ static __maybe_unused int rk3568_dmc_init(struct platform_device *pdev,
 	}
 	disable_irq(complt_irq);
 
-	if (of_property_read_u32(pdev->dev.of_node, "update_drv_odt_cfg",
-				 &ddr_psci_param->update_drv_odt_cfg))
-		ddr_psci_param->update_drv_odt_cfg = 0;
-
-	if (of_property_read_u32(pdev->dev.of_node, "update_deskew_cfg",
-				 &ddr_psci_param->update_deskew_cfg))
-		ddr_psci_param->update_deskew_cfg = 0;
-
 	res = sip_smc_dram(SHARE_PAGE_TYPE_DDR, 0,
 			   ROCKCHIP_SIP_CONFIG_DRAM_INIT);
 	if (res.a0) {
diff --git a/drivers/devfreq/rockchip_dmc_timing.h b/drivers/devfreq/rockchip_dmc_timing.h
index 8f2e2c02bb90..2f7b7774cf4d 100644
--- a/drivers/devfreq/rockchip_dmc_timing.h
+++ b/drivers/devfreq/rockchip_dmc_timing.h
@@ -1003,82 +1003,6 @@ struct rk3399_dram_timing {
 	unsigned int phy_lpddr4_odt;
 };
 
-struct rk3568_ddr_dts_config_timing {
-	unsigned int ddr2_speed_bin;
-	unsigned int ddr3_speed_bin;
-	unsigned int ddr4_speed_bin;
-	unsigned int pd_idle;
-	unsigned int sr_idle;
-	unsigned int sr_mc_gate_idle;
-	unsigned int srpd_lite_idle;
-	unsigned int standby_idle;
-
-	unsigned int auto_pd_dis_freq;
-	unsigned int auto_sr_dis_freq;
-	/* for ddr2 only */
-	unsigned int ddr2_dll_dis_freq;
-	/* for ddr3 only */
-	unsigned int ddr3_dll_dis_freq;
-	/* for ddr4 only */
-	unsigned int ddr4_dll_dis_freq;
-	unsigned int phy_dll_dis_freq;
-
-	unsigned int ddr2_odt_dis_freq;
-	unsigned int phy_ddr2_odt_dis_freq;
-	unsigned int ddr2_drv;
-	unsigned int ddr2_odt;
-	unsigned int phy_ddr2_ca_drv;
-	unsigned int phy_ddr2_ck_drv;
-	unsigned int phy_ddr2_dq_drv;
-	unsigned int phy_ddr2_odt;
-
-	unsigned int ddr3_odt_dis_freq;
-	unsigned int phy_ddr3_odt_dis_freq;
-	unsigned int ddr3_drv;
-	unsigned int ddr3_odt;
-	unsigned int phy_ddr3_ca_drv;
-	unsigned int phy_ddr3_ck_drv;
-	unsigned int phy_ddr3_dq_drv;
-	unsigned int phy_ddr3_odt;
-
-	unsigned int phy_lpddr2_odt_dis_freq;
-	unsigned int lpddr2_drv;
-	unsigned int phy_lpddr2_ca_drv;
-	unsigned int phy_lpddr2_ck_drv;
-	unsigned int phy_lpddr2_dq_drv;
-	unsigned int phy_lpddr2_odt;
-
-	unsigned int lpddr3_odt_dis_freq;
-	unsigned int phy_lpddr3_odt_dis_freq;
-	unsigned int lpddr3_drv;
-	unsigned int lpddr3_odt;
-	unsigned int phy_lpddr3_ca_drv;
-	unsigned int phy_lpddr3_ck_drv;
-	unsigned int phy_lpddr3_dq_drv;
-	unsigned int phy_lpddr3_odt;
-
-	unsigned int lpddr4_odt_dis_freq;
-	unsigned int phy_lpddr4_odt_dis_freq;
-	unsigned int lpddr4_drv;
-	unsigned int lpddr4_dq_odt;
-	unsigned int lpddr4_ca_odt;
-	unsigned int phy_lpddr4_ca_drv;
-	unsigned int phy_lpddr4_ck_cs_drv;
-	unsigned int phy_lpddr4_dq_drv;
-	unsigned int phy_lpddr4_odt;
-
-	unsigned int ddr4_odt_dis_freq;
-	unsigned int phy_ddr4_odt_dis_freq;
-	unsigned int ddr4_drv;
-	unsigned int ddr4_odt;
-	unsigned int phy_ddr4_ca_drv;
-	unsigned int phy_ddr4_ck_drv;
-	unsigned int phy_ddr4_dq_drv;
-	unsigned int phy_ddr4_odt;
-
-	unsigned int available;
-};
-
 /* name rule: ddr4(pad_name)_ddr3_lpddr3_lpddr4_de-skew */
 static const char * const rv1126_dts_ca_timing[] = {
 	"a0_a3_a3_cke1-a_de-skew",

commit afda73facd5a7205c2bf29719f507915f5e02159
Author: YouMin Chen <cym@rock-chips.com>
Date:   Thu Sep 2 11:27:38 2021 +0800

    arm64: dts: rockchip: rk3568: add dmc_fsp node
    
    Add dmc_fsp node for initialize dmc frequency set point on U-Boot.
    
    Signed-off-by: YouMin Chen <cym@rock-chips.com>
    Change-Id: I9fcd1ae498a64b5a4698c42ad05af96740b59e61

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi
index 0a696c426dff..3e8c8295e5b6 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi
@@ -87,6 +87,22 @@
 	};
 };
 
+&lpddr4_params {
+	/* freq info, freq_0 is final frequency, unit: MHz */
+	freq_0 = <528>;
+	freq_1 = <324>;
+	freq_2 = <324>;
+	freq_3 = <324>;
+};
+
+&lpddr4x_params {
+	/* freq info, freq_0 is final frequency, unit: MHz */
+	freq_0 = <528>;
+	freq_1 = <324>;
+	freq_2 = <324>;
+	freq_3 = <324>;
+};
+
 &rockchip_suspend {
 	status = "okay";
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3566.dtsi b/arch/arm64/boot/dts/rockchip/rk3566.dtsi
index 01b6499b678d..6443a36ed9af 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566.dtsi
@@ -15,6 +15,16 @@
 	/delete-node/ opp-1992000000;
 };
 
+&lpddr4_params {
+	/* freq info, freq_0 is final frequency, unit: MHz */
+	freq_0 = <1056>;
+};
+
+&lpddr4x_params {
+	/* freq info, freq_0 is final frequency, unit: MHz */
+	freq_0 = <1056>;
+};
+
 &power {
 	pd_pipe@RK3568_PD_PIPE {
 		reg = <RK3568_PD_PIPE>;
diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index de5af7e7688b..b604ca9f1852 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -2182,6 +2182,19 @@
 		status = "disabled";
 	};
 
+	dmc_fsp: dmc-fsp {
+		compatible = "rockchip,rk3568-dmc-fsp";
+
+		debug_print_level = <0>;
+		ddr3_params = <&ddr3_params>;
+		ddr4_params = <&ddr4_params>;
+		lpddr3_params = <&lpddr3_params>;
+		lpddr4_params = <&lpddr4_params>;
+		lpddr4x_params = <&lpddr4x_params>;
+
+		status = "okay";
+	};
+
 	dmc_opp_table: dmc-opp-table {
 		compatible = "operating-points-v2";
 

commit ed286b021c2d4aad41d034e5cf050018cbce90e5
Author: YouMin Chen <cym@rock-chips.com>
Date:   Tue Aug 24 20:46:51 2021 +0800

    arm64: dts: rockchip: rk3568-dram-default-timing: add ddr params
    
    Add ddr parameters for initialize dmc frequency set point.
    
    Signed-off-by: YouMin Chen <cym@rock-chips.com>
    Change-Id: I3445fa2dbabca5774306cc1052cd3c1d472b6867

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-dram-default-timing.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-dram-default-timing.dtsi
index 43f978809c02..a3c6863651fc 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-dram-default-timing.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-dram-default-timing.dtsi
@@ -7,6 +7,397 @@
 #include <dt-bindings/memory/rk3568-dram.h>
 
 / {
+	ddr3_params: ddr3-params {
+		/* version information */
+		version = <0x100>;
+		expanded_version = <IGNORE_THIS>;
+		reserved = <IGNORE_THIS>;
+		/* freq info, freq_0 is final frequency, unit: MHz */
+		freq_0 = <1056>;
+		freq_1 = <324>;
+		freq_2 = <528>;
+		freq_3 = <780>;
+		freq_4 = <IGNORE_THIS>;
+		freq_5 = <IGNORE_THIS>;
+		/* power save setting */
+		pd_idle = <13>;
+		sr_idle = <93>;
+		sr_mc_gate_idle = <0>;
+		srpd_lite_idle = <0>;
+		standby_idle = <0>;
+		pd_dis_freq = <1066>;
+		sr_dis_freq = <800>;
+		dram_dll_dis_freq = <300>;
+		phy_dll_dis_freq = <IGNORE_THIS>;
+		/* drv when odt on */
+		phy_dq_drv_odten = <33>;
+		phy_ca_drv_odten = <33>;
+		phy_clk_drv_odten = <33>;
+		dram_dq_drv_odten = <34>;
+		/* drv when odt off */
+		phy_dq_drv_odtoff = <33>;
+		phy_ca_drv_odtoff = <33>;
+		phy_clk_drv_odtoff = <33>;
+		dram_dq_drv_odtoff = <34>;
+		/* odt info */
+		dram_odt = <120>;
+		phy_odt = <167>;
+		phy_odt_puup_en = <1>;
+		phy_odt_pudn_en = <1>;
+		/* odt enable freq */
+		dram_dq_odt_en_freq = <333>;
+		phy_odt_en_freq = <333>;
+		/* slew rate when odt enable */
+		phy_dq_sr_odten = <0xf>;
+		phy_ca_sr_odten = <0x3>;
+		phy_clk_sr_odten = <0x0>;
+		/* slew rate when odt disable */
+		phy_dq_sr_odtoff = <0xf>;
+		phy_ca_sr_odtoff = <0x3>;
+		phy_clk_sr_odtoff = <0x0>;
+		/* ssmod setting*/
+		ssmod_downspread = <0>;
+		ssmod_div = <0>;
+		ssmod_spread = <0>;
+		/* 2T mode */
+		mode_2t = <IGNORE_THIS>;
+		/* speed bin */
+		speed_bin = <DDR3_DEFAULT>;
+		/* dram extended temperature support */
+		dram_ext_temp = <0>;
+		/* byte map */
+		byte_map = <((0x3 << 6) | (0x2 << 4) | (0x1 << 2) | (0x0 << 0))>;
+		/* dq map */
+		dq_map_cs0_dq_l = <0>;
+		dq_map_cs0_dq_h = <0>;
+		dq_map_cs1_dq_l = <0>;
+		dq_map_cs1_dq_h = <0>;
+	};
+
+	ddr4_params: ddr4-params {
+		/* version information */
+		version = <0x100>;
+		expanded_version = <IGNORE_THIS>;
+		reserved = <IGNORE_THIS>;
+		/* freq info, freq_0 is final frequency, unit: MHz */
+		freq_0 = <1056>;
+		freq_1 = <324>;
+		freq_2 = <528>;
+		freq_3 = <780>;
+		freq_4 = <IGNORE_THIS>;
+		freq_5 = <IGNORE_THIS>;
+		/* power save setting */
+		pd_idle = <13>;
+		sr_idle = <93>;
+		sr_mc_gate_idle = <0>;
+		srpd_lite_idle = <0>;
+		standby_idle = <0>;
+		pd_dis_freq = <1066>;
+		sr_dis_freq = <800>;
+		dram_dll_dis_freq = <625>;
+		phy_dll_dis_freq = <IGNORE_THIS>;
+		/* drv when odt on */
+		phy_dq_drv_odten = <37>;
+		phy_ca_drv_odten = <37>;
+		phy_clk_drv_odten = <37>;
+		dram_dq_drv_odten = <34>;
+		/* drv when odt off */
+		phy_dq_drv_odtoff = <37>;
+		phy_ca_drv_odtoff = <37>;
+		phy_clk_drv_odtoff = <37>;
+		dram_dq_drv_odtoff = <34>;
+		/* odt info */
+		dram_odt = <120>;
+		phy_odt = <139>;
+		phy_odt_puup_en = <1>;
+		phy_odt_pudn_en = <1>;
+		/* odt enable freq */
+		dram_dq_odt_en_freq = <500>;
+		phy_odt_en_freq = <500>;
+		/* slew rate when odt enable */
+		phy_dq_sr_odten = <0xe>;
+		phy_ca_sr_odten = <0x1>;
+		phy_clk_sr_odten = <0x1>;
+		/* slew rate when odt disable */
+		phy_dq_sr_odtoff = <0xe>;
+		phy_ca_sr_odtoff = <0x1>;
+		phy_clk_sr_odtoff = <0x1>;
+		/* ssmod setting*/
+		ssmod_downspread = <0>;
+		ssmod_div = <0>;
+		ssmod_spread = <0>;
+		/* 2T mode */
+		mode_2t = <IGNORE_THIS>;
+		/* speed bin */
+		speed_bin = <DDR4_DEFAULT>;
+		/* dram extended temperature support */
+		dram_ext_temp = <0>;
+		/* byte map */
+		byte_map = <((0x3 << 6) | (0x2 << 4) | (0x1 << 2) | (0x0 << 0))>;
+		/* dq map */
+		dq_map_cs0_dq_l = <(((0 << 0 | 2 << 2 | 0 << 4 | 2 << 6) << 0) | \
+				    ((3 << 0 | 1 << 2 | 3 << 4 | 1 << 6) << 8) | \
+				    ((3 << 0 | 1 << 2 | 3 << 4 | 1 << 6) << 16) | \
+				    ((2 << 0 | 0 << 2 | 2 << 4 | 0 << 6) << 24))>;
+		dq_map_cs0_dq_h = <(((3 << 0 | 1 << 2 | 3 << 4 | 1 << 6) << 0) | \
+				    ((0 << 0 | 2 << 2 | 0 << 4 | 2 << 6) << 8) | \
+				    ((0 << 0 | 2 << 2 | 0 << 4 | 2 << 6) << 16) | \
+				    ((3 << 0 | 1 << 2 | 1 << 4 | 3 << 6) << 24))>;
+		dq_map_cs1_dq_l = <(((0 << 0 | 2 << 2 | 0 << 4 | 2 << 6) << 0) | \
+				    ((3 << 0 | 1 << 2 | 3 << 4 | 1 << 6) << 8) | \
+				    ((3 << 0 | 1 << 2 | 3 << 4 | 1 << 6) << 16) | \
+				    ((2 << 0 | 0 << 2 | 2 << 4 | 0 << 6) << 24))>;
+		dq_map_cs1_dq_h = <(((3 << 0 | 1 << 2 | 3 << 4 | 1 << 6) << 0) | \
+				    ((0 << 0 | 2 << 2 | 0 << 4 | 2 << 6) << 8) | \
+				    ((0 << 0 | 2 << 2 | 0 << 4 | 2 << 6) << 16) | \
+				    ((3 << 0 | 1 << 2 | 1 << 4 | 3 << 6) << 24))>;
+	};
+
+	lpddr3_params: lpddr3-params {
+		/* version information */
+		version = <0x100>;
+		expanded_version = <IGNORE_THIS>;
+		reserved = <IGNORE_THIS>;
+		/* freq info, freq_0 is final frequency, unit: MHz */
+		freq_0 = <1056>;
+		freq_1 = <324>;
+		freq_2 = <528>;
+		freq_3 = <780>;
+		freq_4 = <IGNORE_THIS>;
+		freq_5 = <IGNORE_THIS>;
+		/* power save setting */
+		pd_idle = <13>;
+		sr_idle = <93>;
+		sr_mc_gate_idle = <0>;
+		srpd_lite_idle = <0>;
+		standby_idle = <0>;
+		pd_dis_freq = <1066>;
+		sr_dis_freq = <800>;
+		dram_dll_dis_freq = <IGNORE_THIS>;
+		phy_dll_dis_freq = <IGNORE_THIS>;
+		/* drv when odt on */
+		phy_dq_drv_odten = <37>;
+		phy_ca_drv_odten = <37>;
+		phy_clk_drv_odten = <39>;
+		dram_dq_drv_odten = <34>;
+		/* drv when odt off */
+		phy_dq_drv_odtoff = <37>;
+		phy_ca_drv_odtoff = <37>;
+		phy_clk_drv_odtoff = <39>;
+		dram_dq_drv_odtoff = <34>;
+		/* odt info */
+		dram_odt = <120>;
+		phy_odt = <148>;
+		phy_odt_puup_en = <1>;
+		phy_odt_pudn_en = <1>;
+		/* odt enable freq */
+		dram_dq_odt_en_freq = <333>;
+		phy_odt_en_freq = <333>;
+		/* slew rate when odt enable */
+		phy_dq_sr_odten = <0xf>;
+		phy_ca_sr_odten = <0x1>;
+		phy_clk_sr_odten = <0xf>;
+		/* slew rate when odt disable */
+		phy_dq_sr_odtoff = <0xf>;
+		phy_ca_sr_odtoff = <0x1>;
+		phy_clk_sr_odtoff = <0xf>;
+		/* ssmod setting*/
+		ssmod_downspread = <0>;
+		ssmod_div = <0>;
+		ssmod_spread = <0>;
+		/* 2T mode */
+		mode_2t = <IGNORE_THIS>;
+		/* speed bin */
+		speed_bin = <IGNORE_THIS>;
+		/* dram extended temperature support */
+		dram_ext_temp = <0>;
+		/* byte map */
+		byte_map = <((0x2 << 6) | (0x0 << 4) | (0x3 << 2) | (0x1 << 0))>;
+		/* dq map */
+		dq_map_cs0_dq_l = <0>;
+		dq_map_cs0_dq_h = <0>;
+		dq_map_cs1_dq_l = <0>;
+		dq_map_cs1_dq_h = <0>;
+	};
+
+	lpddr4_params: lpddr4-params {
+		/* version information */
+		version = <0x100>;
+		expanded_version = <IGNORE_THIS>;
+		reserved = <IGNORE_THIS>;
+		/* freq info, freq_0 is final frequency, unit: MHz */
+		freq_0 = <1560>;
+		freq_1 = <324>;
+		freq_2 = <528>;
+		freq_3 = <780>;
+		freq_4 = <IGNORE_THIS>;
+		freq_5 = <IGNORE_THIS>;
+		/* power save setting */
+		pd_idle = <13>;
+		sr_idle = <93>;
+		sr_mc_gate_idle = <0>;
+		srpd_lite_idle = <0>;
+		standby_idle = <0>;
+		pd_dis_freq = <1066>;
+		sr_dis_freq = <800>;
+		dram_dll_dis_freq = <IGNORE_THIS>;
+		phy_dll_dis_freq = <IGNORE_THIS>;
+		/* drv when odt on */
+		phy_dq_drv_odten = <30>;
+		phy_ca_drv_odten = <38>;
+		phy_clk_drv_odten = <38>;
+		dram_dq_drv_odten = <40>;
+		/* drv when odt off */
+		phy_dq_drv_odtoff = <30>;
+		phy_ca_drv_odtoff = <38>;
+		phy_clk_drv_odtoff = <38>;
+		dram_dq_drv_odtoff = <40>;
+		/* odt info */
+		dram_odt = <80>;
+		phy_odt = <60>;
+		phy_odt_puup_en = <IGNORE_THIS>;
+		phy_odt_pudn_en = <IGNORE_THIS>;
+		/* odt enable freq */
+		dram_dq_odt_en_freq = <800>;
+		phy_odt_en_freq = <800>;
+		/* slew rate when odt enable */
+		phy_dq_sr_odten = <0x0>;
+		phy_ca_sr_odten = <0xf>;
+		phy_clk_sr_odten = <0xf>;
+		/* slew rate when odt disable */
+		phy_dq_sr_odtoff = <0x0>;
+		phy_ca_sr_odtoff = <0xf>;
+		phy_clk_sr_odtoff = <0xf>;
+		/* ssmod setting*/
+		ssmod_downspread = <0>;
+		ssmod_div = <0>;
+		ssmod_spread = <0>;
+		/* 2T mode */
+		mode_2t = <IGNORE_THIS>;
+		/* speed bin */
+		speed_bin = <IGNORE_THIS>;
+		/* dram extended temperature support */
+		dram_ext_temp = <0>;
+		/* byte map */
+		byte_map = <((0x3 << 6) | (0x2 << 4) | (0x1 << 2) | (0x0 << 0))>;
+		/* dq map */
+		dq_map_cs0_dq_l = <0>;
+		dq_map_cs0_dq_h = <0>;
+		dq_map_cs1_dq_l = <0>;
+		dq_map_cs1_dq_h = <0>;
+		/* lp4 odt info */
+		lp4_ca_odt = <120>;
+		lp4_drv_pu_cal_odten = <LP4_VDDQ_3>;
+		lp4_drv_pu_cal_odtoff = <LP4_VDDQ_3>;
+		phy_lp4_drv_pulldown_en_odten = <0>;
+		phy_lp4_drv_pulldown_en_odtoff = <0>;
+		/* lp4 odt enable freq */
+		lp4_ca_odt_en_freq = <800>;
+		/* lp4 cs drv info and ca odt info */
+		phy_lp4_cs_drv_odten = <0>;
+		phy_lp4_cs_drv_odtoff = <0>;
+		lp4_odte_ck_en = <1>;
+		lp4_odte_cs_en = <1>;
+		lp4_odtd_ca_en = <0>;
+		/* lp4 vref info when odt enable */
+		phy_lp4_dq_vref_odten = <166>;
+		lp4_dq_vref_odten = <300>;
+		lp4_ca_vref_odten = <380>;
+		/* lp4 vref info when odt disable */
+		phy_lp4_dq_vref_odtoff = <420>;
+		lp4_dq_vref_odtoff = <420>;
+		lp4_ca_vref_odtoff = <420>;
+	};
+
+	lpddr4x_params: lpddr4x-params {
+		/* version information */
+		version = <0x100>;
+		expanded_version = <IGNORE_THIS>;
+		reserved = <IGNORE_THIS>;
+		/* freq info, freq_0 is final frequency, unit: MHz */
+		freq_0 = <1560>;
+		freq_1 = <324>;
+		freq_2 = <528>;
+		freq_3 = <780>;
+		freq_4 = <IGNORE_THIS>;
+		freq_5 = <IGNORE_THIS>;
+		/* power save setting */
+		pd_idle = <13>;
+		sr_idle = <93>;
+		sr_mc_gate_idle = <0>;
+		srpd_lite_idle = <0>;
+		standby_idle = <0>;
+		pd_dis_freq = <1066>;
+		sr_dis_freq = <800>;
+		dram_dll_dis_freq = <IGNORE_THIS>;
+		phy_dll_dis_freq = <IGNORE_THIS>;
+		/* drv when odt on */
+		phy_dq_drv_odten = <29>;
+		phy_ca_drv_odten = <36>;
+		phy_clk_drv_odten = <36>;
+		dram_dq_drv_odten = <40>;
+		/* drv when odt off */
+		phy_dq_drv_odtoff = <29>;
+		phy_ca_drv_odtoff = <36>;
+		phy_clk_drv_odtoff = <36>;
+		dram_dq_drv_odtoff = <40>;
+		/* odt info */
+		dram_odt = <80>;
+		phy_odt = <60>;
+		phy_odt_puup_en = <IGNORE_THIS>;
+		phy_odt_pudn_en = <IGNORE_THIS>;
+		/* odt enable freq */
+		dram_dq_odt_en_freq = <800>;
+		phy_odt_en_freq = <800>;
+		/* slew rate when odt enable */
+		phy_dq_sr_odten = <0x0>;
+		phy_ca_sr_odten = <0x0>;
+		phy_clk_sr_odten = <0x0>;
+		/* slew rate when odt disable */
+		phy_dq_sr_odtoff = <0x0>;
+		phy_ca_sr_odtoff = <0x0>;
+		phy_clk_sr_odtoff = <0x0>;
+		/* ssmod setting*/
+		ssmod_downspread = <0>;
+		ssmod_div = <0>;
+		ssmod_spread = <0>;
+		/* 2T mode */
+		mode_2t = <IGNORE_THIS>;
+		/* speed bin */
+		speed_bin = <IGNORE_THIS>;
+		/* dram extended temperature support */
+		dram_ext_temp = <0>;
+		/* byte map */
+		byte_map = <((0x3 << 6) | (0x2 << 4) | (0x1 << 2) | (0x0 << 0))>;
+		/* dq map */
+		dq_map_cs0_dq_l = <0>;
+		dq_map_cs0_dq_h = <0>;
+		dq_map_cs1_dq_l = <0>;
+		dq_map_cs1_dq_h = <0>;
+		/* lp4 odt info */
+		lp4_ca_odt = <120>;
+		lp4_drv_pu_cal_odten = <LP4X_VDDQ_0_6>;
+		lp4_drv_pu_cal_odtoff = <LP4X_VDDQ_0_6>;
+		phy_lp4_drv_pulldown_en_odten = <0>;
+		phy_lp4_drv_pulldown_en_odtoff = <0>;
+		/* odt enable freq */
+		lp4_ca_odt_en_freq = <800>;
+		/* lp4 cs drv info and ca odt info */
+		phy_lp4_cs_drv_odten = <0>;
+		phy_lp4_cs_drv_odtoff = <0>;
+		lp4_odte_ck_en = <0>;
+		lp4_odte_cs_en = <0>;
+		lp4_odtd_ca_en = <0>;
+		/* lp4 vref info when odt enable */
+		phy_lp4_dq_vref_odten = <166>;
+		lp4_dq_vref_odten = <228>;
+		lp4_ca_vref_odten = <343>;
+		/* lp4 vref info when odt disable */
+		phy_lp4_dq_vref_odtoff = <420>;
+		lp4_dq_vref_odtoff = <420>;
+		lp4_ca_vref_odtoff = <343>;
+	};
+
 	ddr_timing: ddr_timing {
 		compatible = "rockchip,ddr-timing";
 		ddr2_speed_bin = <DDR2_DEFAULT>;

commit 26dd1e440a0ebbb9fa1e61dd7b15d28b122eba4b
Author: YouMin Chen <cym@rock-chips.com>
Date:   Wed Aug 25 20:40:00 2021 +0800

    include: linux: rockchip: add share mem page type for ddr fsp
    
    Signed-off-by: YouMin Chen <cym@rock-chips.com>
    Change-Id: Ie12446e746f4990287873d8ca52675f3398f45ae

diff --git a/include/linux/rockchip/rockchip_sip.h b/include/linux/rockchip/rockchip_sip.h
index c77bbb78c830..64a3d4f9f339 100644
--- a/include/linux/rockchip/rockchip_sip.h
+++ b/include/linux/rockchip/rockchip_sip.h
@@ -124,6 +124,7 @@ typedef enum {
 	SHARE_PAGE_TYPE_DDR,
 	SHARE_PAGE_TYPE_DDRDBG,
 	SHARE_PAGE_TYPE_DDRECC,
+	SHARE_PAGE_TYPE_DDRFSP,
 	SHARE_PAGE_TYPE_LAST_LOG,
 	SHARE_PAGE_TYPE_MAX,
 } share_page_type_t;

commit f824af94ae2349dd503b52d97051b248b55debd8
Author: YouMin Chen <cym@rock-chips.com>
Date:   Wed Aug 25 11:03:25 2021 +0800

    dt-bindings: memory: add macro definition about LPDDR4 and LPDDR4X
    
    Signed-off-by: YouMin Chen <cym@rock-chips.com>
    Change-Id: I7bcf1f8c9f1d282a68d59dcc14fecaa7c0f59090

diff --git a/include/dt-bindings/memory/rockchip-dram.h b/include/dt-bindings/memory/rockchip-dram.h
index 17e5e34b05c5..21ed3975211f 100644
--- a/include/dt-bindings/memory/rockchip-dram.h
+++ b/include/dt-bindings/memory/rockchip-dram.h
@@ -91,4 +91,12 @@
 #define LP4_CA_ODT_40ohm		(0x6 << 4)
 #define LP4_CA_ODT_MASK			(0x7 << 4)
 
+#define LP4_VDDQ_2_5			(0)
+#define LP4_VDDQ_3			(1)
+
+#define LP4X_VDDQ_0_6			(0)
+#define LP4X_VDDQ_0_5			(1)
+
+#define IGNORE_THIS			(0)
+
 #endif /* _DT_BINDINGS_DRAM_ROCKCHIP_H */

commit fd69926be3b0864e5c56e0da2db718efd39b07e9
Author: Ding Wei <leo.ding@rock-chips.com>
Date:   Fri Oct 15 11:15:17 2021 +0800

    video: rockchip: mpp: Use spinlock for queue->running_lock
    
    reason: mpp_iommu_handle is called by irq for iommu, thus it cannot
    use mutex which might case sleep, thus use spinlock instead.
    
    Call trace:
    [   71.047958 ] Call trace:
    [   71.047974 ]  dump_backtrace+0x0/0x160
    [   71.047988 ]  show_stack+0x14/0x1c
    [   71.048003 ]  dump_stack+0xd0/0x120
    [   71.048018 ]  ___might_sleep+0x1f4/0x204
    [   71.048032 ]  __might_sleep+0x4c/0x80
    [   71.048045 ]  __mutex_lock_common+0x60/0x1028
    [   71.048057 ]  mutex_lock_nested+0x28/0x30
    [   71.048073 ]  mpp_iommu_handle+0x44/0x1c8
    [   71.048088 ]  report_iommu_fault+0x3c/0x198
    [   71.048102 ]  rk_iommu_irq+0x2a4/0x3bc
    [   71.048117 ]  __handle_irq_event_percpu+0x114/0x3c4
    [   71.048131 ]  handle_irq_event+0x5c/0xd0
    [   71.048143 ]  handle_fasteoi_irq+0x124/0x220
    [   71.048156 ]  __handle_domain_irq+0x9c/0xf4
    [   71.048169 ]  gic_handle_irq+0x108/0x180
    [   71.048181 ]  el1_irq+0xec/0x1a0
    [   71.048194 ]  _raw_spin_unlock_irqrestore+0x3c/0x78
    [   71.048209 ]  vop2_crtc_atomic_flush+0x1c78/0x202c
    [   71.048223 ]  drm_atomic_helper_commit_planes+0x1a4/0x210
    [   71.048238 ]  rockchip_atomic_commit_complete+0x1a4/0x390
    [   71.048252 ]  rockchip_drm_atomic_commit+0x22c/0x24c
    [   71.048266 ]  drm_mode_atomic_ioctl+0xa18/0xddc
    [   71.048280 ]  drm_ioctl+0x2d8/0x46c
    [   71.048296 ]  do_vfs_ioctl+0x4dc/0x794
    [   71.048308 ]  __arm64_sys_ioctl+0x70/0x98
    [   71.048322 ]  el0_svc_common+0xa0/0x18c
    [   71.048335 ]  el0_svc_handler+0x28/0x60
    [   71.048348 ]  el0_svc+0x8/0xc
    
    Change-Id: Ie8e79995ec4bebf4ccbb509a57306541de861754
    Signed-off-by: Ding Wei <leo.ding@rock-chips.com>

diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c
index 9b2c72b15796..8cdde67b1d65 100644
--- a/drivers/video/rockchip/mpp/mpp_common.c
+++ b/drivers/video/rockchip/mpp/mpp_common.c
@@ -138,11 +138,12 @@ mpp_taskqueue_get_pending_task(struct mpp_taskqueue *queue)
 static bool
 mpp_taskqueue_is_running(struct mpp_taskqueue *queue)
 {
+	unsigned long flags;
 	bool flag;
 
-	mutex_lock(&queue->running_lock);
+	spin_lock_irqsave(&queue->running_lock, flags);
 	flag = !list_empty(&queue->running_list);
-	mutex_unlock(&queue->running_lock);
+	spin_unlock_irqrestore(&queue->running_lock, flags);
 
 	return flag;
 }
@@ -151,10 +152,13 @@ static int
 mpp_taskqueue_pending_to_run(struct mpp_taskqueue *queue,
 			     struct mpp_task *task)
 {
+	unsigned long flags;
+
 	mutex_lock(&queue->pending_lock);
-	mutex_lock(&queue->running_lock);
+	spin_lock_irqsave(&queue->running_lock, flags);
 	list_move_tail(&task->queue_link, &queue->running_list);
-	mutex_unlock(&queue->running_lock);
+	spin_unlock_irqrestore(&queue->running_lock, flags);
+
 	mutex_unlock(&queue->pending_lock);
 
 	return 0;
@@ -163,13 +167,14 @@ mpp_taskqueue_pending_to_run(struct mpp_taskqueue *queue,
 static struct mpp_task *
 mpp_taskqueue_get_running_task(struct mpp_taskqueue *queue)
 {
+	unsigned long flags;
 	struct mpp_task *task = NULL;
 
-	mutex_lock(&queue->running_lock);
+	spin_lock_irqsave(&queue->running_lock, flags);
 	task = list_first_entry_or_null(&queue->running_list,
 					struct mpp_task,
 					queue_link);
-	mutex_unlock(&queue->running_lock);
+	spin_unlock_irqrestore(&queue->running_lock, flags);
 
 	return task;
 }
@@ -178,12 +183,14 @@ static int
 mpp_taskqueue_pop_running(struct mpp_taskqueue *queue,
 			  struct mpp_task *task)
 {
+	unsigned long flags;
+
 	if (!task->session || !task->session->mpp)
 		return -EINVAL;
 
-	mutex_lock(&queue->running_lock);
+	spin_lock_irqsave(&queue->running_lock, flags);
 	list_del_init(&task->queue_link);
-	mutex_unlock(&queue->running_lock);
+	spin_unlock_irqrestore(&queue->running_lock, flags);
 	kref_put(&task->ref, mpp_free_task);
 
 	return 0;
@@ -941,7 +948,7 @@ struct mpp_taskqueue *mpp_taskqueue_init(struct device *dev)
 
 	mutex_init(&queue->session_lock);
 	mutex_init(&queue->pending_lock);
-	mutex_init(&queue->running_lock);
+	spin_lock_init(&queue->running_lock);
 	mutex_init(&queue->mmu_lock);
 	mutex_init(&queue->dev_lock);
 	INIT_LIST_HEAD(&queue->session_attach);
diff --git a/drivers/video/rockchip/mpp/mpp_common.h b/drivers/video/rockchip/mpp/mpp_common.h
index 00c6404c5d35..53b63feb0355 100644
--- a/drivers/video/rockchip/mpp/mpp_common.h
+++ b/drivers/video/rockchip/mpp/mpp_common.h
@@ -433,7 +433,7 @@ struct mpp_taskqueue {
 	struct mutex pending_lock;
 	struct list_head pending_list;
 	/* lock for running list */
-	struct mutex running_lock;
+	spinlock_t running_lock;
 	struct list_head running_list;
 
 	/* point to MPP Service */
diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec.c b/drivers/video/rockchip/mpp/mpp_rkvdec.c
index 0b26ac288ff6..f51fa65ba87d 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvdec.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec.c
@@ -855,12 +855,13 @@ static void *rkvdec_alloc_task(struct mpp_session *session,
 static void *rkvdec_prepare_with_reset(struct mpp_dev *mpp,
 				       struct mpp_task *mpp_task)
 {
+	unsigned long flags;
 	struct mpp_task *out_task = NULL;
 	struct rkvdec_dev *dec = to_rkvdec_dev(mpp);
 
-	mutex_lock(&mpp->queue->running_lock);
+	spin_lock_irqsave(&mpp->queue->running_lock, flags);
 	out_task = list_empty(&mpp->queue->running_list) ? mpp_task : NULL;
-	mutex_unlock(&mpp->queue->running_lock);
+	spin_unlock_irqrestore(&mpp->queue->running_lock, flags);
 
 	if (out_task && !dec->had_reset) {
 		struct rkvdec_task *task = to_rkvdec_task(out_task);

commit 3ea11abdbec674557119d6b79cdbcbb3f7714552
Author: Zhaoyang Huang <zhaoyang.huang@unisoc.com>
Date:   Fri Jun 11 08:29:34 2021 +0800

    UPSTREAM: psi: Fix race between psi_trigger_create/destroy
    
    Race detected between psi_trigger_destroy/create as shown below, which
    cause panic by accessing invalid psi_system->poll_wait->wait_queue_entry
    and psi_system->poll_timer->entry->next. Under this modification, the
    race window is removed by initialising poll_wait and poll_timer in
    group_init which are executed only once at beginning.
    
      psi_trigger_destroy()                   psi_trigger_create()
    
      mutex_lock(trigger_lock);
      rcu_assign_pointer(poll_task, NULL);
      mutex_unlock(trigger_lock);
                                              mutex_lock(trigger_lock);
                                              if (!rcu_access_pointer(group->poll_task)) {
                                                timer_setup(poll_timer, poll_timer_fn, 0);
                                                rcu_assign_pointer(poll_task, task);
                                              }
                                              mutex_unlock(trigger_lock);
    
      synchronize_rcu();
      del_timer_sync(poll_timer); <-- poll_timer has been reinitialized by
                                      psi_trigger_create()
    
    So, trigger_lock/RCU correctly protects destruction of
    group->poll_task but misses this race affecting poll_timer and
    poll_wait.
    
    Change-Id: I256e7679052ff960683b096e6d804cd4719cfa12
    Fixes: 461daba06bdc ("psi: eliminate kthread_worker from psi trigger scheduling mechanism")
    Co-developed-by: ziwei.dai <ziwei.dai@unisoc.com>
    Signed-off-by: ziwei.dai <ziwei.dai@unisoc.com>
    Co-developed-by: ke.wang <ke.wang@unisoc.com>
    Signed-off-by: ke.wang <ke.wang@unisoc.com>
    Signed-off-by: Zhaoyang Huang <zhaoyang.huang@unisoc.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Suren Baghdasaryan <surenb@google.com>
    Acked-by: Johannes Weiner <hannes@cmpxchg.org>
    Link: https://lkml.kernel.org/r/1623371374-15664-1-git-send-email-huangzhaoyang@gmail.com
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    (cherry picked from commit 8f91efd870ea5d8bc10b0fcc9740db51cd4c0c83)

diff --git a/kernel/sched/psi.c b/kernel/sched/psi.c
index ca4bf0e1d6f6..3afd9190a1a1 100644
--- a/kernel/sched/psi.c
+++ b/kernel/sched/psi.c
@@ -180,6 +180,8 @@ static struct psi_group psi_system = {
 
 static void psi_avgs_work(struct work_struct *work);
 
+static void poll_timer_fn(struct timer_list *t);
+
 static void group_init(struct psi_group *group)
 {
 	int cpu;
@@ -199,6 +201,8 @@ static void group_init(struct psi_group *group)
 	memset(group->polling_total, 0, sizeof(group->polling_total));
 	group->polling_next_update = ULLONG_MAX;
 	group->polling_until = 0;
+	init_waitqueue_head(&group->poll_wait);
+	timer_setup(&group->poll_timer, poll_timer_fn, 0);
 	rcu_assign_pointer(group->poll_task, NULL);
 }
 
@@ -1083,9 +1087,7 @@ struct psi_trigger *psi_trigger_create(struct psi_group *group,
 			return ERR_CAST(task);
 		}
 		atomic_set(&group->poll_wakeup, 0);
-		init_waitqueue_head(&group->poll_wait);
 		wake_up_process(task);
-		timer_setup(&group->poll_timer, poll_timer_fn, 0);
 		rcu_assign_pointer(group->poll_task, task);
 	}
 
@@ -1137,6 +1139,7 @@ static void psi_trigger_destroy(struct kref *ref)
 					group->poll_task,
 					lockdep_is_held(&group->trigger_lock));
 			rcu_assign_pointer(group->poll_task, NULL);
+			del_timer(&group->poll_timer);
 		}
 	}
 
@@ -1149,17 +1152,14 @@ static void psi_trigger_destroy(struct kref *ref)
 	 */
 	synchronize_rcu();
 	/*
-	 * Destroy the kworker after releasing trigger_lock to prevent a
+	 * Stop kthread 'psimon' after releasing trigger_lock to prevent a
 	 * deadlock while waiting for psi_poll_work to acquire trigger_lock
 	 */
 	if (task_to_destroy) {
 		/*
 		 * After the RCU grace period has expired, the worker
 		 * can no longer be found through group->poll_task.
-		 * But it might have been already scheduled before
-		 * that - deschedule it cleanly before destroying it.
 		 */
-		del_timer_sync(&group->poll_timer);
 		kthread_stop(task_to_destroy);
 	}
 	kfree(t);

commit 5d41e8fcf143f07057d54ee53b8794410e7c53fd
Author: Suren Baghdasaryan <surenb@google.com>
Date:   Thu May 28 12:54:42 2020 -0700

    UPSTREAM: psi: eliminate kthread_worker from psi trigger scheduling mechanism
    
    Each psi group requires a dedicated kthread_delayed_work and
    kthread_worker. Since no other work can be performed using psi_group's
    kthread_worker, the same result can be obtained using a task_struct and
    a timer directly. This makes psi triggering simpler by removing lists
    and locks involved with kthread_worker usage and eliminates the need for
    poll_scheduled atomic use in the hot path.
    
    Change-Id: Ib28d84949de068a8bc97dccb187ac3e68980a319
    Signed-off-by: Suren Baghdasaryan <surenb@google.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20200528195442.190116-1-surenb@google.com
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    (cherry picked from commit 461daba06bdcb9c7a3f92b9bbd110e1f7d093ffc)

diff --git a/include/linux/psi_types.h b/include/linux/psi_types.h
index 07aaf9b82241..fc18e7210360 100644
--- a/include/linux/psi_types.h
+++ b/include/linux/psi_types.h
@@ -145,9 +145,10 @@ struct psi_group {
 	unsigned long avg[NR_PSI_STATES - 1][3];
 
 	/* Monitor work control */
-	atomic_t poll_scheduled;
-	struct kthread_worker __rcu *poll_kworker;
-	struct kthread_delayed_work poll_work;
+	struct task_struct __rcu *poll_task;
+	struct timer_list poll_timer;
+	wait_queue_head_t poll_wait;
+	atomic_t poll_wakeup;
 
 	/* Protects data used by the monitor */
 	struct mutex trigger_lock;
diff --git a/kernel/sched/psi.c b/kernel/sched/psi.c
index 1ff4904dd4ee..ca4bf0e1d6f6 100644
--- a/kernel/sched/psi.c
+++ b/kernel/sched/psi.c
@@ -191,7 +191,6 @@ static void group_init(struct psi_group *group)
 	INIT_DELAYED_WORK(&group->avgs_work, psi_avgs_work);
 	mutex_init(&group->avgs_lock);
 	/* Init trigger-related members */
-	atomic_set(&group->poll_scheduled, 0);
 	mutex_init(&group->trigger_lock);
 	INIT_LIST_HEAD(&group->triggers);
 	memset(group->nr_triggers, 0, sizeof(group->nr_triggers));
@@ -200,7 +199,7 @@ static void group_init(struct psi_group *group)
 	memset(group->polling_total, 0, sizeof(group->polling_total));
 	group->polling_next_update = ULLONG_MAX;
 	group->polling_until = 0;
-	rcu_assign_pointer(group->poll_kworker, NULL);
+	rcu_assign_pointer(group->poll_task, NULL);
 }
 
 void __init psi_init(void)
@@ -551,47 +550,38 @@ static u64 update_triggers(struct psi_group *group, u64 now)
 	return now + group->poll_min_period;
 }
 
-/*
- * Schedule polling if it's not already scheduled. It's safe to call even from
- * hotpath because even though kthread_queue_delayed_work takes worker->lock
- * spinlock that spinlock is never contended due to poll_scheduled atomic
- * preventing such competition.
- */
+/* Schedule polling if it's not already scheduled. */
 static void psi_schedule_poll_work(struct psi_group *group, unsigned long delay)
 {
-	struct kthread_worker *kworker;
+	struct task_struct *task;
 
-	/* Do not reschedule if already scheduled */
-	if (atomic_cmpxchg(&group->poll_scheduled, 0, 1) != 0)
+	/*
+	 * Do not reschedule if already scheduled.
+	 * Possible race with a timer scheduled after this check but before
+	 * mod_timer below can be tolerated because group->polling_next_update
+	 * will keep updates on schedule.
+	 */
+	if (timer_pending(&group->poll_timer))
 		return;
 
 	rcu_read_lock();
 
-	kworker = rcu_dereference(group->poll_kworker);
+	task = rcu_dereference(group->poll_task);
 	/*
 	 * kworker might be NULL in case psi_trigger_destroy races with
 	 * psi_task_change (hotpath) which can't use locks
 	 */
-	if (likely(kworker))
-		kthread_queue_delayed_work(kworker, &group->poll_work, delay);
-	else
-		atomic_set(&group->poll_scheduled, 0);
+	if (likely(task))
+		mod_timer(&group->poll_timer, jiffies + delay);
 
 	rcu_read_unlock();
 }
 
-static void psi_poll_work(struct kthread_work *work)
+static void psi_poll_work(struct psi_group *group)
 {
-	struct kthread_delayed_work *dwork;
-	struct psi_group *group;
 	u32 changed_states;
 	u64 now;
 
-	dwork = container_of(work, struct kthread_delayed_work, work);
-	group = container_of(dwork, struct psi_group, poll_work);
-
-	atomic_set(&group->poll_scheduled, 0);
-
 	mutex_lock(&group->trigger_lock);
 
 	now = sched_clock();
@@ -627,6 +617,35 @@ static void psi_poll_work(struct kthread_work *work)
 	mutex_unlock(&group->trigger_lock);
 }
 
+static int psi_poll_worker(void *data)
+{
+	struct psi_group *group = (struct psi_group *)data;
+	struct sched_param param = {
+		.sched_priority = 1,
+	};
+
+	sched_setscheduler_nocheck(current, SCHED_FIFO, &param);
+
+	while (true) {
+		wait_event_interruptible(group->poll_wait,
+				atomic_cmpxchg(&group->poll_wakeup, 1, 0) ||
+				kthread_should_stop());
+		if (kthread_should_stop())
+			break;
+
+		psi_poll_work(group);
+	}
+	return 0;
+}
+
+static void poll_timer_fn(struct timer_list *t)
+{
+	struct psi_group *group = from_timer(group, t, poll_timer);
+
+	atomic_set(&group->poll_wakeup, 1);
+	wake_up_interruptible(&group->poll_wait);
+}
+
 static void record_times(struct psi_group_cpu *groupc, int cpu,
 			 bool memstall_tick)
 {
@@ -1054,22 +1073,20 @@ struct psi_trigger *psi_trigger_create(struct psi_group *group,
 
 	mutex_lock(&group->trigger_lock);
 
-	if (!rcu_access_pointer(group->poll_kworker)) {
-		struct sched_param param = {
-			.sched_priority = 1,
-		};
-		struct kthread_worker *kworker;
+	if (!rcu_access_pointer(group->poll_task)) {
+		struct task_struct *task;
 
-		kworker = kthread_create_worker(0, "psimon");
-		if (IS_ERR(kworker)) {
+		task = kthread_create(psi_poll_worker, group, "psimon");
+		if (IS_ERR(task)) {
 			kfree(t);
 			mutex_unlock(&group->trigger_lock);
-			return ERR_CAST(kworker);
+			return ERR_CAST(task);
 		}
-		sched_setscheduler_nocheck(kworker->task, SCHED_FIFO, &param);
-		kthread_init_delayed_work(&group->poll_work,
-				psi_poll_work);
-		rcu_assign_pointer(group->poll_kworker, kworker);
+		atomic_set(&group->poll_wakeup, 0);
+		init_waitqueue_head(&group->poll_wait);
+		wake_up_process(task);
+		timer_setup(&group->poll_timer, poll_timer_fn, 0);
+		rcu_assign_pointer(group->poll_task, task);
 	}
 
 	list_add(&t->node, &group->triggers);
@@ -1087,7 +1104,7 @@ static void psi_trigger_destroy(struct kref *ref)
 {
 	struct psi_trigger *t = container_of(ref, struct psi_trigger, refcount);
 	struct psi_group *group = t->group;
-	struct kthread_worker *kworker_to_destroy = NULL;
+	struct task_struct *task_to_destroy = NULL;
 
 	if (static_branch_likely(&psi_disabled))
 		return;
@@ -1113,13 +1130,13 @@ static void psi_trigger_destroy(struct kref *ref)
 			period = min(period, div_u64(tmp->win.size,
 					UPDATES_PER_WINDOW));
 		group->poll_min_period = period;
-		/* Destroy poll_kworker when the last trigger is destroyed */
+		/* Destroy poll_task when the last trigger is destroyed */
 		if (group->poll_states == 0) {
 			group->polling_until = 0;
-			kworker_to_destroy = rcu_dereference_protected(
-					group->poll_kworker,
+			task_to_destroy = rcu_dereference_protected(
+					group->poll_task,
 					lockdep_is_held(&group->trigger_lock));
-			rcu_assign_pointer(group->poll_kworker, NULL);
+			rcu_assign_pointer(group->poll_task, NULL);
 		}
 	}
 
@@ -1127,25 +1144,23 @@ static void psi_trigger_destroy(struct kref *ref)
 
 	/*
 	 * Wait for both *trigger_ptr from psi_trigger_replace and
-	 * poll_kworker RCUs to complete their read-side critical sections
-	 * before destroying the trigger and optionally the poll_kworker
+	 * poll_task RCUs to complete their read-side critical sections
+	 * before destroying the trigger and optionally the poll_task
 	 */
 	synchronize_rcu();
 	/*
 	 * Destroy the kworker after releasing trigger_lock to prevent a
 	 * deadlock while waiting for psi_poll_work to acquire trigger_lock
 	 */
-	if (kworker_to_destroy) {
+	if (task_to_destroy) {
 		/*
 		 * After the RCU grace period has expired, the worker
-		 * can no longer be found through group->poll_kworker.
+		 * can no longer be found through group->poll_task.
 		 * But it might have been already scheduled before
 		 * that - deschedule it cleanly before destroying it.
 		 */
-		kthread_cancel_delayed_work_sync(&group->poll_work);
-		atomic_set(&group->poll_scheduled, 0);
-
-		kthread_destroy_worker(kworker_to_destroy);
+		del_timer_sync(&group->poll_timer);
+		kthread_stop(task_to_destroy);
 	}
 	kfree(t);
 }

commit 81e84034e840a80837f89b232e5a65be72366429
Author: William Wu <william.wu@rock-chips.com>
Date:   Thu Oct 14 15:59:17 2021 +0800

    usb: dwc3: gadget: increase intr ep resize tx fifo to 64B
    
    For RV1109/RV1126 platforms, it resizes the tx fifos for
    all of the usb device endpoints by default, it aims to
    support UVC composite device, so just only set 16 bytes
    for the tx fifo of the intr endpoints. But for the other
    USB functions, like MTP function, it requires 64 bytes
    tx fifo for its intr endpoint.
    
    Signed-off-by: William Wu <william.wu@rock-chips.com>
    Change-Id: I27634dab473dad9a3e3d500cde7156c3eda514e8

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index b1c4e21771bb..1bac00c1512b 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -268,10 +268,10 @@ static int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc)
 
 			/*
 			 * REVIST: we assume that the maxpacket of interrupt
-			 * endpoint is 16 Bytes.
+			 * endpoint is 64 Bytes for MTP and the other functions.
 			 */
 			mult = 1;
-			maxpacket = 16;
+			maxpacket = 64;
 			break;
 		default:
 			/*

commit c979dfc05b5dce916a5e08c237fea88e3f80bd08
Merge: b519e868c4b4 3f8a27f9e27b
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Wed Oct 13 14:17:14 2021 +0200

    Merge 4.19.211 into android-4.19-stable
    
    Changes in 4.19.211
            Partially revert "usb: Kconfig: using select for USB_COMMON dependency"
            USB: cdc-acm: fix racy tty buffer accesses
            USB: cdc-acm: fix break reporting
            xen/privcmd: fix error handling in mmap-resource processing
            ovl: fix missing negative dentry check in ovl_rename()
            nfsd4: Handle the NFSv4 READDIR 'dircount' hint being zero
            xen/balloon: fix cancelled balloon action
            ARM: dts: omap3430-sdp: Fix NAND device node
            ARM: dts: qcom: apq8064: use compatible which contains chipid
            bpf, mips: Validate conditional branch offsets
            xtensa: call irqchip_init only when CONFIG_USE_OF is selected
            bpf, arm: Fix register clobbering in div/mod implementation
            bpf: Fix integer overflow in prealloc_elems_and_freelist()
            phy: mdio: fix memory leak
            net_sched: fix NULL deref in fifo_set_limit()
            powerpc/fsl/dts: Fix phy-connection-type for fm1mac3
            ptp_pch: Load module automatically if ID matches
            ARM: imx6: disable the GIC CPU interface before calling stby-poweroff sequence
            net: bridge: use nla_total_size_64bit() in br_get_linkxstats_size()
            net: sfp: Fix typo in state machine debug string
            netlink: annotate data races around nlk->bound
            drm/nouveau/debugfs: fix file release memory leak
            rtnetlink: fix if_nlmsg_stats_size() under estimation
            i40e: fix endless loop under rtnl
            i40e: Fix freeing of uninitialized misc IRQ vector
            i2c: acpi: fix resource leak in reconfiguration device addition
            x86/Kconfig: Correct reference to MWINCHIP3D
            Linux 4.19.211
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I83fabc26b9b5528ffcad45ccc55afa07a4656d53

commit 00b9fb0f42cb3275e47ac1ed67f236c7a18b06b3
Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Date:   Fri Mar 19 15:47:31 2021 +0100

    UPSTREAM: PM: runtime: Defer suspending suppliers
    
    Because the PM-runtime status of the device is not updated in
    __rpm_callback(), attempts to suspend the suppliers of the given
    device triggered by the rpm_put_suppliers() call in there may
    cause a supplier to be suspended completely before the status of
    the consumer is updated to RPM_SUSPENDED, which is confusing.
    
    To avoid that (1) modify __rpm_callback() to only decrease the
    PM-runtime usage counter of each supplier and (2) make rpm_suspend()
    try to suspend the suppliers after changing the consumer's status to
    RPM_SUSPENDED, in analogy with the device's parent.
    
    Change-Id: I2dbdf3999bc8a06bbbe29f57eb9cc1c49ec1aeff
    Link: https://lore.kernel.org/linux-pm/CAPDyKFqm06KDw_p8WXsM4dijDbho4bb6T4k50UqqvR1_COsp8g@mail.gmail.com/
    Fixes: 21d5c57b3726 ("PM / runtime: Use device links")
    Reported-by: elaine.zhang <zhangqing@rock-chips.com>
    Diagnosed-by: Ulf Hansson <ulf.hansson@linaro.org>
    Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    (cherry picked from commit 5244f5e2d801259af877ee759e8c22364c607072)
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>

diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
index eaae4adf9ce4..9eb8cd3535fe 100644
--- a/drivers/base/power/runtime.c
+++ b/drivers/base/power/runtime.c
@@ -283,7 +283,7 @@ static int rpm_get_suppliers(struct device *dev)
 	return 0;
 }
 
-static void rpm_put_suppliers(struct device *dev)
+static void __rpm_put_suppliers(struct device *dev, bool try_to_suspend)
 {
 	struct device_link *link;
 
@@ -292,10 +292,29 @@ static void rpm_put_suppliers(struct device *dev)
 			continue;
 
 		while (refcount_dec_not_one(&link->rpm_active))
-			pm_runtime_put(link->supplier);
+			pm_runtime_put_noidle(link->supplier);
+
+		if (try_to_suspend)
+			pm_request_idle(link->supplier);
 	}
 }
 
+static void rpm_put_suppliers(struct device *dev)
+{
+	__rpm_put_suppliers(dev, true);
+}
+
+static void rpm_suspend_suppliers(struct device *dev)
+{
+	struct device_link *link;
+	int idx = device_links_read_lock();
+
+	list_for_each_entry_rcu(link, &dev->links.suppliers, c_node)
+		pm_request_idle(link->supplier);
+
+	device_links_read_unlock(idx);
+}
+
 /**
  * __rpm_callback - Run a given runtime PM callback for a given device.
  * @cb: Runtime PM callback to run.
@@ -323,8 +342,10 @@ static int __rpm_callback(int (*cb)(struct device *), struct device *dev)
 			idx = device_links_read_lock();
 
 			retval = rpm_get_suppliers(dev);
-			if (retval)
+			if (retval) {
+				rpm_put_suppliers(dev);
 				goto fail;
+			}
 
 			device_links_read_unlock(idx);
 		}
@@ -347,9 +368,9 @@ static int __rpm_callback(int (*cb)(struct device *), struct device *dev)
 		    || (dev->power.runtime_status == RPM_RESUMING && retval))) {
 			idx = device_links_read_lock();
 
- fail:
-			rpm_put_suppliers(dev);
+			__rpm_put_suppliers(dev, false);
 
+fail:
 			device_links_read_unlock(idx);
 		}
 
@@ -613,8 +634,11 @@ static int rpm_suspend(struct device *dev, int rpmflags)
 		goto out;
 	}
 
+	if (dev->power.irq_safe)
+		goto out;
+
 	/* Maybe the parent is now able to suspend. */
-	if (parent && !parent->power.ignore_children && !dev->power.irq_safe) {
+	if (parent && !parent->power.ignore_children) {
 		spin_unlock(&dev->power.lock);
 
 		spin_lock(&parent->power.lock);
@@ -623,6 +647,14 @@ static int rpm_suspend(struct device *dev, int rpmflags)
 
 		spin_lock(&dev->power.lock);
 	}
+	/* Maybe the suppliers are now able to suspend. */
+	if (dev->power.links_count > 0) {
+		spin_unlock_irq(&dev->power.lock);
+
+		rpm_suspend_suppliers(dev);
+
+		spin_lock_irq(&dev->power.lock);
+	}
 
  out:
 	trace_rpm_return_int_rcuidle(dev, _THIS_IP_, retval);

commit c133510b15dcb2f69c50bdb99b97fc118e5a4d43
Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Date:   Fri Mar 19 15:47:25 2021 +0100

    UPSTREAM: Revert "PM: runtime: Update device status before letting suppliers suspend"
    
    Revert commit 44cc89f76464 ("PM: runtime: Update device status
    before letting suppliers suspend") that introduced a race condition
    into __rpm_callback() which allowed a concurrent rpm_resume() to
    run and resume the device prematurely after its status had been
    changed to RPM_SUSPENDED by __rpm_callback().
    
    Change-Id: Id45cafe9a26bf1a97a9e12e510894c1e4c889e4b
    Fixes: 44cc89f76464 ("PM: runtime: Update device status before letting suppliers suspend")
    Link: https://lore.kernel.org/linux-pm/24dfb6fc-5d54-6ee2-9195-26428b7ecf8a@intel.com/
    Reported-by: Adrian Hunter <adrian.hunter@intel.com>
    Cc: 4.10+ <stable@vger.kernel.org> # 4.10+
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
    (cherry picked from commit 0cab893f409c53634d0d818fa414641cbcdb0dab)
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>

diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
index e75f56eb391b..eaae4adf9ce4 100644
--- a/drivers/base/power/runtime.c
+++ b/drivers/base/power/runtime.c
@@ -304,22 +304,22 @@ static void rpm_put_suppliers(struct device *dev)
 static int __rpm_callback(int (*cb)(struct device *), struct device *dev)
 	__releases(&dev->power.lock) __acquires(&dev->power.lock)
 {
-	bool use_links = dev->power.links_count > 0;
-	bool get = false;
 	int retval, idx;
-	bool put;
+	bool use_links = dev->power.links_count > 0;
 
 	if (dev->power.irq_safe) {
 		spin_unlock(&dev->power.lock);
-	} else if (!use_links) {
-		spin_unlock_irq(&dev->power.lock);
 	} else {
-		get = dev->power.runtime_status == RPM_RESUMING;
-
 		spin_unlock_irq(&dev->power.lock);
 
-		/* Resume suppliers if necessary. */
-		if (get) {
+		/*
+		 * Resume suppliers if necessary.
+		 *
+		 * The device's runtime PM status cannot change until this
+		 * routine returns, so it is safe to read the status outside of
+		 * the lock.
+		 */
+		if (use_links && dev->power.runtime_status == RPM_RESUMING) {
 			idx = device_links_read_lock();
 
 			retval = rpm_get_suppliers(dev);
@@ -334,36 +334,24 @@ static int __rpm_callback(int (*cb)(struct device *), struct device *dev)
 
 	if (dev->power.irq_safe) {
 		spin_lock(&dev->power.lock);
-		return retval;
-	}
-
-	spin_lock_irq(&dev->power.lock);
-
-	if (!use_links)
-		return retval;
-
-	/*
-	 * If the device is suspending and the callback has returned success,
-	 * drop the usage counters of the suppliers that have been reference
-	 * counted on its resume.
-	 *
-	 * Do that if the resume fails too.
-	 */
-	put = dev->power.runtime_status == RPM_SUSPENDING && !retval;
-	if (put)
-		__update_runtime_status(dev, RPM_SUSPENDED);
-	else
-		put = get && retval;
-
-	if (put) {
-		spin_unlock_irq(&dev->power.lock);
-
-		idx = device_links_read_lock();
+	} else {
+		/*
+		 * If the device is suspending and the callback has returned
+		 * success, drop the usage counters of the suppliers that have
+		 * been reference counted on its resume.
+		 *
+		 * Do that if resume fails too.
+		 */
+		if (use_links
+		    && ((dev->power.runtime_status == RPM_SUSPENDING && !retval)
+		    || (dev->power.runtime_status == RPM_RESUMING && retval))) {
+			idx = device_links_read_lock();
 
-fail:
-		rpm_put_suppliers(dev);
+ fail:
+			rpm_put_suppliers(dev);
 
-		device_links_read_unlock(idx);
+			device_links_read_unlock(idx);
+		}
 
 		spin_lock_irq(&dev->power.lock);
 	}

commit b519e868c4b450dd47e75674d60bcb2abd489d8e
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Wed Oct 13 11:23:33 2021 +0200

    Revert "lib/timerqueue: Rely on rbtree semantics for next timer"
    
    This reverts commit b9a1ac8e7c03fd09992352c7fb1a61cbbb9ad52b which is
    commit 511885d7061eda3eb1faf3f57dcc936ff75863f1 upstream.
    
    It breaks the abi and does not resolve an issue that is relevant to
    Android devices, so it can be reverted.
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I7b35b10c18f91bd132bf33de3572e272591976ae

diff --git a/include/linux/timerqueue.h b/include/linux/timerqueue.h
index aff122f1062a..78b8cc73f12f 100644
--- a/include/linux/timerqueue.h
+++ b/include/linux/timerqueue.h
@@ -12,7 +12,8 @@ struct timerqueue_node {
 };
 
 struct timerqueue_head {
-	struct rb_root_cached rb_root;
+	struct rb_root head;
+	struct timerqueue_node *next;
 };
 
 
@@ -28,14 +29,13 @@ extern struct timerqueue_node *timerqueue_iterate_next(
  *
  * @head: head of timerqueue
  *
- * Returns a pointer to the timer node that has the earliest expiration time.
+ * Returns a pointer to the timer node that has the
+ * earliest expiration time.
  */
 static inline
 struct timerqueue_node *timerqueue_getnext(struct timerqueue_head *head)
 {
-	struct rb_node *leftmost = rb_first_cached(&head->rb_root);
-
-	return rb_entry(leftmost, struct timerqueue_node, node);
+	return head->next;
 }
 
 static inline void timerqueue_init(struct timerqueue_node *node)
@@ -45,6 +45,7 @@ static inline void timerqueue_init(struct timerqueue_node *node)
 
 static inline void timerqueue_init_head(struct timerqueue_head *head)
 {
-	head->rb_root = RB_ROOT_CACHED;
+	head->head = RB_ROOT;
+	head->next = NULL;
 }
 #endif /* _LINUX_TIMERQUEUE_H */
diff --git a/lib/timerqueue.c b/lib/timerqueue.c
index 7a8ae3d5fd40..0d54bcbc8170 100644
--- a/lib/timerqueue.c
+++ b/lib/timerqueue.c
@@ -39,10 +39,9 @@
  */
 bool timerqueue_add(struct timerqueue_head *head, struct timerqueue_node *node)
 {
-	struct rb_node **p = &head->rb_root.rb_root.rb_node;
+	struct rb_node **p = &head->head.rb_node;
 	struct rb_node *parent = NULL;
-	struct timerqueue_node *ptr;
-	bool leftmost = true;
+	struct timerqueue_node  *ptr;
 
 	/* Make sure we don't add nodes that are already added */
 	WARN_ON_ONCE(!RB_EMPTY_NODE(&node->node));
@@ -50,17 +49,19 @@ bool timerqueue_add(struct timerqueue_head *head, struct timerqueue_node *node)
 	while (*p) {
 		parent = *p;
 		ptr = rb_entry(parent, struct timerqueue_node, node);
-		if (node->expires < ptr->expires) {
+		if (node->expires < ptr->expires)
 			p = &(*p)->rb_left;
-		} else {
+		else
 			p = &(*p)->rb_right;
-			leftmost = false;
-		}
 	}
 	rb_link_node(&node->node, parent, p);
-	rb_insert_color_cached(&node->node, &head->rb_root, leftmost);
+	rb_insert_color(&node->node, &head->head);
 
-	return leftmost;
+	if (!head->next || node->expires < head->next->expires) {
+		head->next = node;
+		return true;
+	}
+	return false;
 }
 EXPORT_SYMBOL_GPL(timerqueue_add);
 
@@ -77,10 +78,15 @@ bool timerqueue_del(struct timerqueue_head *head, struct timerqueue_node *node)
 {
 	WARN_ON_ONCE(RB_EMPTY_NODE(&node->node));
 
-	rb_erase_cached(&node->node, &head->rb_root);
-	RB_CLEAR_NODE(&node->node);
+	/* update next pointer */
+	if (head->next == node) {
+		struct rb_node *rbn = rb_next(&node->node);
 
-	return !RB_EMPTY_ROOT(&head->rb_root.rb_root);
+		head->next = rb_entry_safe(rbn, struct timerqueue_node, node);
+	}
+	rb_erase(&node->node, &head->head);
+	RB_CLEAR_NODE(&node->node);
+	return head->next != NULL;
 }
 EXPORT_SYMBOL_GPL(timerqueue_del);
 

commit 0e38ed1a85739876c1173233f3068c8e7e72035e
Merge: 02e8f2ba3776 e34184f53363
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Mon Oct 11 13:19:05 2021 +0200

    Merge 4.19.210 into android-4.19-stable
    
    Changes in 4.19.210
            net: mdio: introduce a shutdown method to mdio device drivers
            xen-netback: correct success/error reporting for the SKB-with-fraglist case
            sparc64: fix pci_iounmap() when CONFIG_PCI is not set
            ext2: fix sleeping in atomic bugs on error
            scsi: sd: Free scsi_disk device via put_device()
            usb: testusb: Fix for showing the connection speed
            usb: dwc2: check return value after calling platform_get_resource()
            selftests: be sure to make khdr before other targets
            scsi: ses: Retry failed Send/Receive Diagnostic commands
            tools/vm/page-types: remove dependency on opt_file for idle page tracking
            libata: Add ATA_HORKAGE_NO_NCQ_ON_ATI for Samsung 860 and 870 SSD.
            lib/timerqueue: Rely on rbtree semantics for next timer
            Linux 4.19.210
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: Ib6ae9d37c6e94c9a0d8f5875836fb8fdbef9ff70

commit ddc7145079cef4570b4b240192d90496e41fd41d
Merge: 106d1430c147 a6850bb536d1
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Wed Oct 13 17:56:17 2021 +0800

    Merge tag 'ASB-2021-10-05_4.19-stable' of https://android.googlesource.com/kernel/common
    
    https://source.android.com/security/bulletin/2021-10-01
    CVE-2020-29368
    CVE-2020-29660
    CVE-2021-0707
    CVE-2020-10768
    CVE-2021-29647
    
    * tag 'ASB-2021-10-05_4.19-stable': (1087 commits)
      Linux 4.19.206
      net: don't unconditionally copy_from_user a struct ifreq for socket ioctls
      Revert "floppy: reintroduce O_NDELAY fix"
      KVM: x86/mmu: Treat NX as used (not reserved) for all !TDP shadow MMUs
      fbmem: add margin check to fb_check_caps()
      vt_kdsetmode: extend console locking
      net/rds: dma_map_sg is entitled to merge entries
      drm/nouveau/disp: power down unused DP links during init
      drm: Copy drm_wait_vblank to user before returning
      qed: Fix null-pointer dereference in qed_rdma_create_qp()
      qed: qed ll2 race condition fixes
      vringh: Use wiov->used to check for read/write desc order
      virtio_pci: Support surprise removal of virtio pci device
      virtio: Improve vq->broken access to avoid any compiler optimization
      opp: remove WARN when no valid OPPs remain
      usb: gadget: u_audio: fix race condition on endpoint stop
      net: hns3: fix get wrong pfc_en when query PFC configuration
      net: marvell: fix MVNETA_TX_IN_PRGRS bit number
      xgene-v2: Fix a resource leak in the error handling path of 'xge_probe()'
      ip_gre: add validation for csum_start
      ...
    
    Change-Id: Ib7da21059ab763a87255147340e4cba92e6b3f61
    
    Conflicts:
            arch/arm/boot/dts/rk322x.dtsi
            arch/arm/boot/dts/rk3288.dtsi
            drivers/dma/pl330.c
            drivers/regulator/core.c
            drivers/staging/android/ion/ion.c
            drivers/usb/dwc3/core.c
            drivers/usb/dwc3/ep0.c
            drivers/usb/gadget/function/u_audio.c

commit 3f8a27f9e27bd78604c0709224cec0ec85a8b106
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Wed Oct 13 10:10:52 2021 +0200

    Linux 4.19.211
    
    Link: https://lore.kernel.org/r/20211011134640.711218469@linuxfoundation.org
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>                              =
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Hulk Robot <hulkrobot@huawei.com>
    Link: https://lore.kernel.org/r/20211012064417.149035532@linuxfoundation.org
    Link: https://lore.kernel.org/r/20211012093340.313468813@linuxfoundation.org
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index d9c39b3c05d5..d4e6f5d326b0 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 210
+SUBLEVEL = 211
 EXTRAVERSION =
 NAME = "People's Front"
 

commit 8a48d1525e8403d95117348a7bad9f60f901cae0
Author: Lukas Bulwahn <lukas.bulwahn@gmail.com>
Date:   Tue Aug 3 13:35:25 2021 +0200

    x86/Kconfig: Correct reference to MWINCHIP3D
    
    commit 225bac2dc5d192e55f2c50123ee539b1edf8a411 upstream.
    
    Commit in Fixes intended to exclude the Winchip series and referred to
    CONFIG_WINCHIP3D, but the config symbol is called CONFIG_MWINCHIP3D.
    
    Hence, scripts/checkkconfigsymbols.py warns:
    
    WINCHIP3D
    Referencing files: arch/x86/Kconfig
    
    Correct the reference to the intended config symbol.
    
    Fixes: 69b8d3fcabdc ("x86/Kconfig: Exclude i586-class CPUs lacking PAE support from the HIGHMEM64G Kconfig group")
    Suggested-by: Randy Dunlap <rdunlap@infradead.org>
    Signed-off-by: Lukas Bulwahn <lukas.bulwahn@gmail.com>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Cc: <stable@vger.kernel.org>
    Link: https://lkml.kernel.org/r/20210803113531.30720-4-lukas.bulwahn@gmail.com
    [manually adjusted the change to the state on the v4.19.y and v5.4.y stable tree]
    Signed-off-by: Lukas Bulwahn <lukas.bulwahn@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index d994501d9179..3dd2949b2b35 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -1387,7 +1387,7 @@ config HIGHMEM4G
 
 config HIGHMEM64G
 	bool "64GB"
-	depends on !M486 && !M586 && !M586TSC && !M586MMX && !MGEODE_LX && !MGEODEGX1 && !MCYRIXIII && !MELAN && !MWINCHIPC6 && !WINCHIP3D && !MK6
+	depends on !M486 && !M586 && !M586TSC && !M586MMX && !MGEODE_LX && !MGEODEGX1 && !MCYRIXIII && !MELAN && !MWINCHIPC6 && !MWINCHIP3D && !MK6
 	select X86_PAE
 	---help---
 	  Select this if you have a 32-bit processor and more than 4

commit 3d9d458a8aaafa47268ea4f1b4114a9f12927989
Author: Jamie Iles <quic_jiles@quicinc.com>
Date:   Wed Sep 22 17:57:18 2021 +0100

    i2c: acpi: fix resource leak in reconfiguration device addition
    
    [ Upstream commit 6558b646ce1c2a872fe1c2c7cb116f05a2c1950f ]
    
    acpi_i2c_find_adapter_by_handle() calls bus_find_device() which takes a
    reference on the adapter which is never released which will result in a
    reference count leak and render the adapter unremovable.  Make sure to
    put the adapter after creating the client in the same manner that we do
    for OF.
    
    Fixes: 525e6fabeae2 ("i2c / ACPI: add support for ACPI reconfigure notifications")
    Signed-off-by: Jamie Iles <quic_jiles@quicinc.com>
    Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
    [wsa: fixed title]
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/i2c/i2c-core-acpi.c b/drivers/i2c/i2c-core-acpi.c
index 8ba4122fb340..8288cfb44cb2 100644
--- a/drivers/i2c/i2c-core-acpi.c
+++ b/drivers/i2c/i2c-core-acpi.c
@@ -395,6 +395,7 @@ static int i2c_acpi_notify(struct notifier_block *nb, unsigned long value,
 			break;
 
 		i2c_acpi_register_device(adapter, adev, &info);
+		put_device(&adapter->dev);
 		break;
 	case ACPI_RECONFIG_DEVICE_REMOVE:
 		if (!acpi_device_enumerated(adev))

commit 60ad4cde0ad28921f9ea25b0201c774b95ffa4b4
Author: Sylwester Dziedziuch <sylwesterx.dziedziuch@intel.com>
Date:   Fri Sep 24 11:40:41 2021 +0200

    i40e: Fix freeing of uninitialized misc IRQ vector
    
    [ Upstream commit 2e5a20573a926302b233b0c2e1077f5debc7ab2e ]
    
    When VSI set up failed in i40e_probe() as part of PF switch set up
    driver was trying to free misc IRQ vectors in
    i40e_clear_interrupt_scheme and produced a kernel Oops:
    
       Trying to free already-free IRQ 266
       WARNING: CPU: 0 PID: 5 at kernel/irq/manage.c:1731 __free_irq+0x9a/0x300
       Workqueue: events work_for_cpu_fn
       RIP: 0010:__free_irq+0x9a/0x300
       Call Trace:
       ? synchronize_irq+0x3a/0xa0
       free_irq+0x2e/0x60
       i40e_clear_interrupt_scheme+0x53/0x190 [i40e]
       i40e_probe.part.108+0x134b/0x1a40 [i40e]
       ? kmem_cache_alloc+0x158/0x1c0
       ? acpi_ut_update_ref_count.part.1+0x8e/0x345
       ? acpi_ut_update_object_reference+0x15e/0x1e2
       ? strstr+0x21/0x70
       ? irq_get_irq_data+0xa/0x20
       ? mp_check_pin_attr+0x13/0xc0
       ? irq_get_irq_data+0xa/0x20
       ? mp_map_pin_to_irq+0xd3/0x2f0
       ? acpi_register_gsi_ioapic+0x93/0x170
       ? pci_conf1_read+0xa4/0x100
       ? pci_bus_read_config_word+0x49/0x70
       ? do_pci_enable_device+0xcc/0x100
       local_pci_probe+0x41/0x90
       work_for_cpu_fn+0x16/0x20
       process_one_work+0x1a7/0x360
       worker_thread+0x1cf/0x390
       ? create_worker+0x1a0/0x1a0
       kthread+0x112/0x130
       ? kthread_flush_work_fn+0x10/0x10
       ret_from_fork+0x1f/0x40
    
    The problem is that at that point misc IRQ vectors
    were not allocated yet and we get a call trace
    that driver is trying to free already free IRQ vectors.
    
    Add a check in i40e_clear_interrupt_scheme for __I40E_MISC_IRQ_REQUESTED
    PF state before calling i40e_free_misc_vector. This state is set only if
    misc IRQ vectors were properly initialized.
    
    Fixes: c17401a1dd21 ("i40e: use separate state bit for miscellaneous IRQ setup")
    Reported-by: PJ Waskiewicz <pwaskiewicz@jumptrading.com>
    Signed-off-by: Sylwester Dziedziuch <sylwesterx.dziedziuch@intel.com>
    Signed-off-by: Mateusz Palczewski <mateusz.palczewski@intel.com>
    Tested-by: Dave Switzer <david.switzer@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 8f7d3af75ed6..062b94251782 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -4724,7 +4724,8 @@ static void i40e_clear_interrupt_scheme(struct i40e_pf *pf)
 {
 	int i;
 
-	i40e_free_misc_vector(pf);
+	if (test_bit(__I40E_MISC_IRQ_REQUESTED, pf->state))
+		i40e_free_misc_vector(pf);
 
 	i40e_put_lump(pf->irq_pile, pf->iwarp_base_vector,
 		      I40E_IWARP_IRQ_PILE_ID);

commit 905f415a3f570d72d31c9c770b0dbbe6a0e8263d
Author: Jiri Benc <jbenc@redhat.com>
Date:   Tue Sep 14 10:54:42 2021 +0200

    i40e: fix endless loop under rtnl
    
    [ Upstream commit 857b6c6f665cca9828396d9743faf37fd09e9ac3 ]
    
    The loop in i40e_get_capabilities can never end. The problem is that
    although i40e_aq_discover_capabilities returns with an error if there's
    a firmware problem, the returned error is not checked. There is a check for
    pf->hw.aq.asq_last_status but that value is set to I40E_AQ_RC_OK on most
    firmware problems.
    
    When i40e_aq_discover_capabilities encounters a firmware problem, it will
    encounter the same problem on its next invocation. As the result, the loop
    becomes endless. We hit this with I40E_ERR_ADMIN_QUEUE_TIMEOUT but looking
    at the code, it can happen with a range of other firmware errors.
    
    I don't know what the correct behavior should be: whether the firmware
    should be retried a few times, or whether pf->hw.aq.asq_last_status should
    be always set to the encountered firmware error (but then it would be
    pointless and can be just replaced by the i40e_aq_discover_capabilities
    return value). However, the current behavior with an endless loop under the
    rtnl mutex(!) is unacceptable and Intel has not submitted a fix, although we
    explained the bug to them 7 months ago.
    
    This may not be the best possible fix but it's better than hanging the whole
    system on a firmware bug.
    
    Fixes: 56a62fc86895 ("i40e: init code and hardware support")
    Tested-by: Stefan Assmann <sassmann@redhat.com>
    Signed-off-by: Jiri Benc <jbenc@redhat.com>
    Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
    Tested-by: Dave Switzer <david.switzer@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 246734be5177..8f7d3af75ed6 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -9068,7 +9068,7 @@ static int i40e_get_capabilities(struct i40e_pf *pf,
 		if (pf->hw.aq.asq_last_status == I40E_AQ_RC_ENOMEM) {
 			/* retry with a larger buffer */
 			buf_len = data_size;
-		} else if (pf->hw.aq.asq_last_status != I40E_AQ_RC_OK) {
+		} else if (pf->hw.aq.asq_last_status != I40E_AQ_RC_OK || err) {
 			dev_info(&pf->pdev->dev,
 				 "capability discovery failed, err %s aq_err %s\n",
 				 i40e_stat_str(&pf->hw, err),

commit 8cf8286ff286716ad61cef5d2a647faeb218d081
Author: Eric Dumazet <edumazet@google.com>
Date:   Tue Oct 5 14:04:17 2021 -0700

    rtnetlink: fix if_nlmsg_stats_size() under estimation
    
    [ Upstream commit d34367991933d28bd7331f67a759be9a8c474014 ]
    
    rtnl_fill_statsinfo() is filling skb with one mandatory if_stats_msg structure.
    
    nlmsg_put(skb, pid, seq, type, sizeof(struct if_stats_msg), flags);
    
    But if_nlmsg_stats_size() never considered the needed storage.
    
    This bug did not show up because alloc_skb(X) allocates skb with
    extra tailroom, because of added alignments. This could very well
    be changed in the future to have deterministic behavior.
    
    Fixes: 10c9ead9f3c6 ("rtnetlink: add new RTM_GETSTATS message to dump link stats")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Cc: Roopa Prabhu <roopa@nvidia.com>
    Acked-by: Roopa Prabhu <roopa@nvidia.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 055fd09ac111..83de32e34bb5 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -4512,7 +4512,7 @@ static int rtnl_fill_statsinfo(struct sk_buff *skb, struct net_device *dev,
 static size_t if_nlmsg_stats_size(const struct net_device *dev,
 				  u32 filter_mask)
 {
-	size_t size = 0;
+	size_t size = NLMSG_ALIGN(sizeof(struct if_stats_msg));
 
 	if (stats_attr_valid(filter_mask, IFLA_STATS_LINK_64, 0))
 		size += nla_total_size_64bit(sizeof(struct rtnl_link_stats64));

commit 1508b09945bde393326a9dab73b1fc35f672d771
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Sat Sep 11 15:50:23 2021 +0800

    drm/nouveau/debugfs: fix file release memory leak
    
    [ Upstream commit f5a8703a9c418c6fc54eb772712dfe7641e3991c ]
    
    When using single_open() for opening, single_release() should be
    called, otherwise the 'op' allocated in single_open() will be leaked.
    
    Fixes: 6e9fc177399f ("drm/nouveau/debugfs: add copy of sysfs pstate interface ported to debugfs")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Reviewed-by: Karol Herbst <kherbst@redhat.com>
    Signed-off-by: Karol Herbst <kherbst@redhat.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20210911075023.3969054-2-yangyingliang@huawei.com
    Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/nouveau/nouveau_debugfs.c b/drivers/gpu/drm/nouveau/nouveau_debugfs.c
index 4561a786fab0..cce4833a6083 100644
--- a/drivers/gpu/drm/nouveau/nouveau_debugfs.c
+++ b/drivers/gpu/drm/nouveau/nouveau_debugfs.c
@@ -185,6 +185,7 @@ static const struct file_operations nouveau_pstate_fops = {
 	.open = nouveau_debugfs_pstate_open,
 	.read = seq_read,
 	.write = nouveau_debugfs_pstate_set,
+	.release = single_release,
 };
 
 static struct drm_info_list nouveau_debugfs_list[] = {

commit d4e931feea8225698311a5f9e423b17ef0979c3b
Author: Eric Dumazet <edumazet@google.com>
Date:   Mon Oct 4 14:24:15 2021 -0700

    netlink: annotate data races around nlk->bound
    
    [ Upstream commit 7707a4d01a648e4c655101a469c956cb11273655 ]
    
    While existing code is correct, KCSAN is reporting
    a data-race in netlink_insert / netlink_sendmsg [1]
    
    It is correct to read nlk->bound without a lock, as netlink_autobind()
    will acquire all needed locks.
    
    [1]
    BUG: KCSAN: data-race in netlink_insert / netlink_sendmsg
    
    write to 0xffff8881031c8b30 of 1 bytes by task 18752 on cpu 0:
     netlink_insert+0x5cc/0x7f0 net/netlink/af_netlink.c:597
     netlink_autobind+0xa9/0x150 net/netlink/af_netlink.c:842
     netlink_sendmsg+0x479/0x7c0 net/netlink/af_netlink.c:1892
     sock_sendmsg_nosec net/socket.c:703 [inline]
     sock_sendmsg net/socket.c:723 [inline]
     ____sys_sendmsg+0x360/0x4d0 net/socket.c:2392
     ___sys_sendmsg net/socket.c:2446 [inline]
     __sys_sendmsg+0x1ed/0x270 net/socket.c:2475
     __do_sys_sendmsg net/socket.c:2484 [inline]
     __se_sys_sendmsg net/socket.c:2482 [inline]
     __x64_sys_sendmsg+0x42/0x50 net/socket.c:2482
     do_syscall_x64 arch/x86/entry/common.c:50 [inline]
     do_syscall_64+0x3d/0x90 arch/x86/entry/common.c:80
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    read to 0xffff8881031c8b30 of 1 bytes by task 18751 on cpu 1:
     netlink_sendmsg+0x270/0x7c0 net/netlink/af_netlink.c:1891
     sock_sendmsg_nosec net/socket.c:703 [inline]
     sock_sendmsg net/socket.c:723 [inline]
     __sys_sendto+0x2a8/0x370 net/socket.c:2019
     __do_sys_sendto net/socket.c:2031 [inline]
     __se_sys_sendto net/socket.c:2027 [inline]
     __x64_sys_sendto+0x74/0x90 net/socket.c:2027
     do_syscall_x64 arch/x86/entry/common.c:50 [inline]
     do_syscall_64+0x3d/0x90 arch/x86/entry/common.c:80
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    value changed: 0x00 -> 0x01
    
    Reported by Kernel Concurrency Sanitizer on:
    CPU: 1 PID: 18751 Comm: syz-executor.0 Not tainted 5.14.0-rc1-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    
    Fixes: da314c9923fe ("netlink: Replace rhash_portid with bound")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index b0fd268ed65e..dd4e4289d0d2 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -599,7 +599,10 @@ static int netlink_insert(struct sock *sk, u32 portid)
 
 	/* We need to ensure that the socket is hashed and visible. */
 	smp_wmb();
-	nlk_sk(sk)->bound = portid;
+	/* Paired with lockless reads from netlink_bind(),
+	 * netlink_connect() and netlink_sendmsg().
+	 */
+	WRITE_ONCE(nlk_sk(sk)->bound, portid);
 
 err:
 	release_sock(sk);
@@ -1018,7 +1021,8 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr,
 	else if (nlk->ngroups < 8*sizeof(groups))
 		groups &= (1UL << nlk->ngroups) - 1;
 
-	bound = nlk->bound;
+	/* Paired with WRITE_ONCE() in netlink_insert() */
+	bound = READ_ONCE(nlk->bound);
 	if (bound) {
 		/* Ensure nlk->portid is up-to-date. */
 		smp_rmb();
@@ -1104,8 +1108,9 @@ static int netlink_connect(struct socket *sock, struct sockaddr *addr,
 
 	/* No need for barriers here as we return to user-space without
 	 * using any of the bound attributes.
+	 * Paired with WRITE_ONCE() in netlink_insert().
 	 */
-	if (!nlk->bound)
+	if (!READ_ONCE(nlk->bound))
 		err = netlink_autobind(sock);
 
 	if (err == 0) {
@@ -1870,7 +1875,8 @@ static int netlink_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
 		dst_group = nlk->dst_group;
 	}
 
-	if (!nlk->bound) {
+	/* Paired with WRITE_ONCE() in netlink_insert() */
+	if (!READ_ONCE(nlk->bound)) {
 		err = netlink_autobind(sock);
 		if (err)
 			goto out;

commit 7308e2f2b5c9cd7d665c6f42b0c890c64e9e27cf
Author: Sean Anderson <sean.anderson@seco.com>
Date:   Mon Oct 4 17:50:02 2021 -0400

    net: sfp: Fix typo in state machine debug string
    
    [ Upstream commit 25a9da6641f1f66006e93ddbefee13a437efa8c0 ]
    
    The string should be "tx_disable" to match the state enum.
    
    Fixes: 4005a7cb4f55 ("net: phy: sftp: print debug message with text, not numbers")
    Signed-off-by: Sean Anderson <sean.anderson@seco.com>
    Reviewed-by: Andrew Lunn <andrew@lunn.ch>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c
index 47d518e6d5d4..71bafc8f5ed0 100644
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
@@ -113,7 +113,7 @@ static const char * const sm_state_strings[] = {
 	[SFP_S_LINK_UP] = "link_up",
 	[SFP_S_TX_FAULT] = "tx_fault",
 	[SFP_S_REINIT] = "reinit",
-	[SFP_S_TX_DISABLE] = "rx_disable",
+	[SFP_S_TX_DISABLE] = "tx_disable",
 };
 
 static const char *sm_state_to_str(unsigned short sm_state)

commit 198d4e60e932f59bc8555afb015b90e8c898ac1b
Author: Eric Dumazet <edumazet@google.com>
Date:   Mon Oct 4 18:05:07 2021 -0700

    net: bridge: use nla_total_size_64bit() in br_get_linkxstats_size()
    
    [ Upstream commit dbe0b88064494b7bb6a9b2aa7e085b14a3112d44 ]
    
    bridge_fill_linkxstats() is using nla_reserve_64bit().
    
    We must use nla_total_size_64bit() instead of nla_total_size()
    for corresponding data structure.
    
    Fixes: 1080ab95e3c7 ("net: bridge: add support for IGMP/MLD stats and export them via netlink")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Cc: Nikolay Aleksandrov <nikolay@nvidia.com>
    Cc: Vivien Didelot <vivien.didelot@gmail.com>
    Acked-by: Nikolay Aleksandrov <nikolay@nvidia.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c
index ec2b58a09f76..c00cb376263a 100644
--- a/net/bridge/br_netlink.c
+++ b/net/bridge/br_netlink.c
@@ -1511,7 +1511,7 @@ static size_t br_get_linkxstats_size(const struct net_device *dev, int attr)
 	}
 
 	return numvls * nla_total_size(sizeof(struct bridge_vlan_xstats)) +
-	       nla_total_size(sizeof(struct br_mcast_stats)) +
+	       nla_total_size_64bit(sizeof(struct br_mcast_stats)) +
 	       nla_total_size(0);
 }
 

commit c5dd1990fdf2f10c25f4fb78911fe4277c77fac1
Author: Oleksij Rempel <o.rempel@pengutronix.de>
Date:   Tue Sep 28 15:49:40 2021 +0200

    ARM: imx6: disable the GIC CPU interface before calling stby-poweroff sequence
    
    [ Upstream commit 783f3db030563f7bcdfe2d26428af98ea1699a8e ]
    
    Any pending interrupt can prevent entering standby based power off state.
    To avoid it, disable the GIC CPU interface.
    
    Fixes: 8148d2136002 ("ARM: imx6: register pm_power_off handler if "fsl,pmic-stby-poweroff" is set")
    Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
    Signed-off-by: Shawn Guo <shawnguo@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/mach-imx/pm-imx6.c b/arch/arm/mach-imx/pm-imx6.c
index 4bfefbec971a..c3ca6e2cf7ff 100644
--- a/arch/arm/mach-imx/pm-imx6.c
+++ b/arch/arm/mach-imx/pm-imx6.c
@@ -15,6 +15,7 @@
 #include <linux/io.h>
 #include <linux/irq.h>
 #include <linux/genalloc.h>
+#include <linux/irqchip/arm-gic.h>
 #include <linux/mfd/syscon.h>
 #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
 #include <linux/of.h>
@@ -622,6 +623,7 @@ static void __init imx6_pm_common_init(const struct imx6_pm_socdata
 
 static void imx6_pm_stby_poweroff(void)
 {
+	gic_cpu_if_down(0);
 	imx6_set_lpm(STOP_POWER_OFF);
 	imx6q_suspend_finish(0);
 

commit 1c1d9acb9da780b896a5c86f1747bedca5bbd3f5
Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date:   Fri Oct 1 19:20:33 2021 +0300

    ptp_pch: Load module automatically if ID matches
    
    [ Upstream commit 7cd8b1542a7ba0720c5a0a85ed414a122015228b ]
    
    The driver can't be loaded automatically because it misses
    module alias to be provided. Add corresponding MODULE_DEVICE_TABLE()
    call to the driver.
    
    Fixes: 863d08ece9bf ("supports eg20t ptp clock")
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/ptp/ptp_pch.c b/drivers/ptp/ptp_pch.c
index 78ccf936d356..84feaa140f1b 100644
--- a/drivers/ptp/ptp_pch.c
+++ b/drivers/ptp/ptp_pch.c
@@ -695,6 +695,7 @@ static const struct pci_device_id pch_ieee1588_pcidev_id[] = {
 	 },
 	{0}
 };
+MODULE_DEVICE_TABLE(pci, pch_ieee1588_pcidev_id);
 
 static struct pci_driver pch_driver = {
 	.name = KBUILD_MODNAME,

commit 3be9334fbfda238caf1d3692fbdb8a7b731441b6
Author: Pali Rohár <pali@kernel.org>
Date:   Sat Oct 2 11:04:09 2021 +0200

    powerpc/fsl/dts: Fix phy-connection-type for fm1mac3
    
    [ Upstream commit eed183abc0d3b8adb64fd1363b7cea7986cd58d6 ]
    
    Property phy-connection-type contains invalid value "sgmii-2500" per scheme
    defined in file ethernet-controller.yaml.
    
    Correct phy-connection-type value should be "2500base-x".
    
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Fixes: 84e0f1c13806 ("powerpc/mpc85xx: Add MDIO bus muxing support to the board device tree(s)")
    Acked-by: Scott Wood <oss@buserror.net>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/powerpc/boot/dts/fsl/t1023rdb.dts b/arch/powerpc/boot/dts/fsl/t1023rdb.dts
index 5ba6fbfca274..f82f85c65964 100644
--- a/arch/powerpc/boot/dts/fsl/t1023rdb.dts
+++ b/arch/powerpc/boot/dts/fsl/t1023rdb.dts
@@ -154,7 +154,7 @@
 
 			fm1mac3: ethernet@e4000 {
 				phy-handle = <&sgmii_aqr_phy3>;
-				phy-connection-type = "sgmii-2500";
+				phy-connection-type = "2500base-x";
 				sleep = <&rcpm 0x20000000>;
 			};
 

commit d07098f45be868a9cdce6c616563c36c64dbbd87
Author: Eric Dumazet <edumazet@google.com>
Date:   Thu Sep 30 14:22:39 2021 -0700

    net_sched: fix NULL deref in fifo_set_limit()
    
    [ Upstream commit 560ee196fe9e5037e5015e2cdb14b3aecb1cd7dc ]
    
    syzbot reported another NULL deref in fifo_set_limit() [1]
    
    I could repro the issue with :
    
    unshare -n
    tc qd add dev lo root handle 1:0 tbf limit 200000 burst 70000 rate 100Mbit
    tc qd replace dev lo parent 1:0 pfifo_fast
    tc qd change dev lo root handle 1:0 tbf limit 300000 burst 70000 rate 100Mbit
    
    pfifo_fast does not have a change() operation.
    Make fifo_set_limit() more robust about this.
    
    [1]
    BUG: kernel NULL pointer dereference, address: 0000000000000000
    PGD 1cf99067 P4D 1cf99067 PUD 7ca49067 PMD 0
    Oops: 0010 [#1] PREEMPT SMP KASAN
    CPU: 1 PID: 14443 Comm: syz-executor959 Not tainted 5.15.0-rc3-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    RIP: 0010:0x0
    Code: Unable to access opcode bytes at RIP 0xffffffffffffffd6.
    RSP: 0018:ffffc9000e2f7310 EFLAGS: 00010246
    RAX: dffffc0000000000 RBX: ffffffff8d6ecc00 RCX: 0000000000000000
    RDX: 0000000000000000 RSI: ffff888024c27910 RDI: ffff888071e34000
    RBP: ffff888071e34000 R08: 0000000000000001 R09: ffffffff8fcfb947
    R10: 0000000000000001 R11: 0000000000000000 R12: ffff888024c27910
    R13: ffff888071e34018 R14: 0000000000000000 R15: ffff88801ef74800
    FS:  00007f321d897700(0000) GS:ffff8880b9d00000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: ffffffffffffffd6 CR3: 00000000722c3000 CR4: 00000000003506e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
     fifo_set_limit net/sched/sch_fifo.c:242 [inline]
     fifo_set_limit+0x198/0x210 net/sched/sch_fifo.c:227
     tbf_change+0x6ec/0x16d0 net/sched/sch_tbf.c:418
     qdisc_change net/sched/sch_api.c:1332 [inline]
     tc_modify_qdisc+0xd9a/0x1a60 net/sched/sch_api.c:1634
     rtnetlink_rcv_msg+0x413/0xb80 net/core/rtnetlink.c:5572
     netlink_rcv_skb+0x153/0x420 net/netlink/af_netlink.c:2504
     netlink_unicast_kernel net/netlink/af_netlink.c:1314 [inline]
     netlink_unicast+0x533/0x7d0 net/netlink/af_netlink.c:1340
     netlink_sendmsg+0x86d/0xdb0 net/netlink/af_netlink.c:1929
     sock_sendmsg_nosec net/socket.c:704 [inline]
     sock_sendmsg+0xcf/0x120 net/socket.c:724
     ____sys_sendmsg+0x6e8/0x810 net/socket.c:2409
     ___sys_sendmsg+0xf3/0x170 net/socket.c:2463
     __sys_sendmsg+0xe5/0x1b0 net/socket.c:2492
     do_syscall_x64 arch/x86/entry/common.c:50 [inline]
     do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Fixes: fb0305ce1b03 ("net-sched: consolidate default fifo qdisc setup")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Link: https://lore.kernel.org/r/20210930212239.3430364-1-eric.dumazet@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sched/sch_fifo.c b/net/sched/sch_fifo.c
index 24893d3b5d22..bcd3ca97caea 100644
--- a/net/sched/sch_fifo.c
+++ b/net/sched/sch_fifo.c
@@ -152,6 +152,9 @@ int fifo_set_limit(struct Qdisc *q, unsigned int limit)
 	if (strncmp(q->ops->id + 1, "fifo", 4) != 0)
 		return 0;
 
+	if (!q->ops->change)
+		return 0;
+
 	nla = kmalloc(nla_attr_size(sizeof(struct tc_fifo_qopt)), GFP_KERNEL);
 	if (nla) {
 		nla->nla_type = RTM_NEWQDISC;

commit 2397b9e118721292429fea8807a698e71b94795f
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Thu Sep 30 20:50:28 2021 +0300

    phy: mdio: fix memory leak
    
    [ Upstream commit ca6e11c337daf7925ff8a2aac8e84490a8691905 ]
    
    Syzbot reported memory leak in MDIO bus interface, the problem was in
    wrong state logic.
    
    MDIOBUS_ALLOCATED indicates 2 states:
            1. Bus is only allocated
            2. Bus allocated and __mdiobus_register() fails, but
               device_register() was called
    
    In case of device_register() has been called we should call put_device()
    to correctly free the memory allocated for this device, but mdiobus_free()
    calls just kfree(dev) in case of MDIOBUS_ALLOCATED state
    
    To avoid this behaviour we need to set bus->state to MDIOBUS_UNREGISTERED
    _before_ calling device_register(), because put_device() should be
    called even in case of device_register() failure.
    
    Link: https://lore.kernel.org/netdev/YVMRWNDZDUOvQjHL@shell.armlinux.org.uk/
    Fixes: 46abc02175b3 ("phylib: give mdio buses a device tree presence")
    Reported-and-tested-by: syzbot+398e7dc692ddbbb4cfec@syzkaller.appspotmail.com
    Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Link: https://lore.kernel.org/r/eceae1429fbf8fa5c73dd2a0d39d525aa905074d.1633024062.git.paskripkin@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c
index 08c81d4cfca8..3207da2224f6 100644
--- a/drivers/net/phy/mdio_bus.c
+++ b/drivers/net/phy/mdio_bus.c
@@ -378,6 +378,13 @@ int __mdiobus_register(struct mii_bus *bus, struct module *owner)
 	bus->dev.groups = NULL;
 	dev_set_name(&bus->dev, "%s", bus->id);
 
+	/* We need to set state to MDIOBUS_UNREGISTERED to correctly release
+	 * the device in mdiobus_free()
+	 *
+	 * State will be updated later in this function in case of success
+	 */
+	bus->state = MDIOBUS_UNREGISTERED;
+
 	err = device_register(&bus->dev);
 	if (err) {
 		pr_err("mii_bus %s failed to register\n", bus->id);

commit 078cdd572408176a3900a6eb5a403db0da22f8e0
Author: Tatsuhiko Yasumatsu <th.yasumatsu@gmail.com>
Date:   Thu Sep 30 22:55:45 2021 +0900

    bpf: Fix integer overflow in prealloc_elems_and_freelist()
    
    [ Upstream commit 30e29a9a2bc6a4888335a6ede968b75cd329657a ]
    
    In prealloc_elems_and_freelist(), the multiplication to calculate the
    size passed to bpf_map_area_alloc() could lead to an integer overflow.
    As a result, out-of-bounds write could occur in pcpu_freelist_populate()
    as reported by KASAN:
    
    [...]
    [   16.968613] BUG: KASAN: slab-out-of-bounds in pcpu_freelist_populate+0xd9/0x100
    [   16.969408] Write of size 8 at addr ffff888104fc6ea0 by task crash/78
    [   16.970038]
    [   16.970195] CPU: 0 PID: 78 Comm: crash Not tainted 5.15.0-rc2+ #1
    [   16.970878] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014
    [   16.972026] Call Trace:
    [   16.972306]  dump_stack_lvl+0x34/0x44
    [   16.972687]  print_address_description.constprop.0+0x21/0x140
    [   16.973297]  ? pcpu_freelist_populate+0xd9/0x100
    [   16.973777]  ? pcpu_freelist_populate+0xd9/0x100
    [   16.974257]  kasan_report.cold+0x7f/0x11b
    [   16.974681]  ? pcpu_freelist_populate+0xd9/0x100
    [   16.975190]  pcpu_freelist_populate+0xd9/0x100
    [   16.975669]  stack_map_alloc+0x209/0x2a0
    [   16.976106]  __sys_bpf+0xd83/0x2ce0
    [...]
    
    The possibility of this overflow was originally discussed in [0], but
    was overlooked.
    
    Fix the integer overflow by changing elem_size to u64 from u32.
    
      [0] https://lore.kernel.org/bpf/728b238e-a481-eb50-98e9-b0f430ab01e7@gmail.com/
    
    Fixes: 557c0c6e7df8 ("bpf: convert stackmap to pre-allocation")
    Signed-off-by: Tatsuhiko Yasumatsu <th.yasumatsu@gmail.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Link: https://lore.kernel.org/bpf/20210930135545.173698-1-th.yasumatsu@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c
index a47d623f59fe..92310b07cb98 100644
--- a/kernel/bpf/stackmap.c
+++ b/kernel/bpf/stackmap.c
@@ -63,7 +63,8 @@ static inline int stack_map_data_size(struct bpf_map *map)
 
 static int prealloc_elems_and_freelist(struct bpf_stack_map *smap)
 {
-	u32 elem_size = sizeof(struct stack_map_bucket) + smap->map.value_size;
+	u64 elem_size = sizeof(struct stack_map_bucket) +
+			(u64)smap->map.value_size;
 	int err;
 
 	smap->elems = bpf_map_area_alloc(elem_size * smap->map.max_entries,

commit 9b6b7054dd8e8f9750d5d7d88d35421dff3b16f4
Author: Johan Almbladh <johan.almbladh@anyfinetworks.com>
Date:   Tue Sep 28 11:13:10 2021 +0200

    bpf, arm: Fix register clobbering in div/mod implementation
    
    [ Upstream commit 79e3445b38e0cab94264a3894c0c3d57c930b97e ]
    
    On ARM CPUs that lack div/mod instructions, ALU32 BPF_DIV and BPF_MOD are
    implemented using a call to a helper function. Before, the emitted code
    for those function calls failed to preserve caller-saved ARM registers.
    Since some of those registers happen to be mapped to BPF registers, it
    resulted in eBPF register values being overwritten.
    
    This patch emits code to push and pop the remaining caller-saved ARM
    registers r2-r3 into the stack during the div/mod function call. ARM
    registers r0-r1 are used as arguments and return value, and those were
    already saved and restored correctly.
    
    Fixes: 39c13c204bb1 ("arm: eBPF JIT compiler")
    Signed-off-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/net/bpf_jit_32.c b/arch/arm/net/bpf_jit_32.c
index 79b12e744537..dade3a3ba666 100644
--- a/arch/arm/net/bpf_jit_32.c
+++ b/arch/arm/net/bpf_jit_32.c
@@ -39,6 +39,10 @@
  *                        +-----+
  *                        |RSVD | JIT scratchpad
  * current ARM_SP =>      +-----+ <= (BPF_FP - STACK_SIZE + SCRATCH_SIZE)
+ *                        | ... | caller-saved registers
+ *                        +-----+
+ *                        | ... | arguments passed on stack
+ * ARM_SP during call =>  +-----|
  *                        |     |
  *                        | ... | Function call stack
  *                        |     |
@@ -66,6 +70,12 @@
  *
  * When popping registers off the stack at the end of a BPF function, we
  * reference them via the current ARM_FP register.
+ *
+ * Some eBPF operations are implemented via a call to a helper function.
+ * Such calls are "invisible" in the eBPF code, so it is up to the calling
+ * program to preserve any caller-saved ARM registers during the call. The
+ * JIT emits code to push and pop those registers onto the stack, immediately
+ * above the callee stack frame.
  */
 #define CALLEE_MASK	(1 << ARM_R4 | 1 << ARM_R5 | 1 << ARM_R6 | \
 			 1 << ARM_R7 | 1 << ARM_R8 | 1 << ARM_R9 | \
@@ -73,6 +83,8 @@
 #define CALLEE_PUSH_MASK (CALLEE_MASK | 1 << ARM_LR)
 #define CALLEE_POP_MASK  (CALLEE_MASK | 1 << ARM_PC)
 
+#define CALLER_MASK	(1 << ARM_R0 | 1 << ARM_R1 | 1 << ARM_R2 | 1 << ARM_R3)
+
 enum {
 	/* Stack layout - these are offsets from (top of stack - 4) */
 	BPF_R2_HI,
@@ -467,6 +479,7 @@ static inline int epilogue_offset(const struct jit_ctx *ctx)
 
 static inline void emit_udivmod(u8 rd, u8 rm, u8 rn, struct jit_ctx *ctx, u8 op)
 {
+	const int exclude_mask = BIT(ARM_R0) | BIT(ARM_R1);
 	const s8 *tmp = bpf2a32[TMP_REG_1];
 
 #if __LINUX_ARM_ARCH__ == 7
@@ -498,11 +511,17 @@ static inline void emit_udivmod(u8 rd, u8 rm, u8 rn, struct jit_ctx *ctx, u8 op)
 		emit(ARM_MOV_R(ARM_R0, rm), ctx);
 	}
 
+	/* Push caller-saved registers on stack */
+	emit(ARM_PUSH(CALLER_MASK & ~exclude_mask), ctx);
+
 	/* Call appropriate function */
 	emit_mov_i(ARM_IP, op == BPF_DIV ?
 		   (u32)jit_udiv32 : (u32)jit_mod32, ctx);
 	emit_blx_r(ARM_IP, ctx);
 
+	/* Restore caller-saved registers from stack */
+	emit(ARM_POP(CALLER_MASK & ~exclude_mask), ctx);
+
 	/* Save return value */
 	if (rd != ARM_R0)
 		emit(ARM_MOV_R(rd, ARM_R0), ctx);

commit 816eaf315cb4906d4e4eb4f34bb28f6a799974cd
Author: Max Filippov <jcmvbkbc@gmail.com>
Date:   Mon Sep 27 09:46:33 2021 -0700

    xtensa: call irqchip_init only when CONFIG_USE_OF is selected
    
    [ Upstream commit 6489f8d0e1d93a3603d8dad8125797559e4cf2a2 ]
    
    During boot time kernel configured with OF=y but USE_OF=n displays the
    following warnings and hangs shortly after starting userspace:
    
    ------------[ cut here ]------------
    WARNING: CPU: 0 PID: 0 at kernel/irq/irqdomain.c:695 irq_create_mapping_affinity+0x29/0xc0
    irq_create_mapping_affinity(, 6) called with NULL domain
    CPU: 0 PID: 0 Comm: swapper Not tainted 5.15.0-rc3-00001-gd67ed2510d28 #30
    Call Trace:
      __warn+0x69/0xc4
      warn_slowpath_fmt+0x6c/0x94
      irq_create_mapping_affinity+0x29/0xc0
      local_timer_setup+0x40/0x88
      time_init+0xb1/0xe8
      start_kernel+0x31d/0x3f4
      _startup+0x13b/0x13b
    ---[ end trace 1e6630e1c5eda35b ]---
    ------------[ cut here ]------------
    WARNING: CPU: 0 PID: 0 at arch/xtensa/kernel/time.c:141 local_timer_setup+0x58/0x88
    error: can't map timer irq
    CPU: 0 PID: 0 Comm: swapper Tainted: G        W         5.15.0-rc3-00001-gd67ed2510d28 #30
    Call Trace:
      __warn+0x69/0xc4
      warn_slowpath_fmt+0x6c/0x94
      local_timer_setup+0x58/0x88
      time_init+0xb1/0xe8
      start_kernel+0x31d/0x3f4
      _startup+0x13b/0x13b
    ---[ end trace 1e6630e1c5eda35c ]---
    Failed to request irq 0 (timer)
    
    Fix that by calling irqchip_init only when CONFIG_USE_OF is selected and
    calling legacy interrupt controller init otherwise.
    
    Fixes: da844a81779e ("xtensa: add device trees support")
    Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/xtensa/kernel/irq.c b/arch/xtensa/kernel/irq.c
index a48bf2d10ac2..80cc9770a8d2 100644
--- a/arch/xtensa/kernel/irq.c
+++ b/arch/xtensa/kernel/irq.c
@@ -145,7 +145,7 @@ unsigned xtensa_get_ext_irq_no(unsigned irq)
 
 void __init init_IRQ(void)
 {
-#ifdef CONFIG_OF
+#ifdef CONFIG_USE_OF
 	irqchip_init();
 #else
 #ifdef CONFIG_HAVE_SMP

commit 79f3a086dfc34887f9bbb0801768608b9470e942
Author: Piotr Krysiuk <piotras@gmail.com>
Date:   Wed Sep 15 17:04:37 2021 +0100

    bpf, mips: Validate conditional branch offsets
    
    commit 37cb28ec7d3a36a5bace7063a3dba633ab110f8b upstream.
    
    The conditional branch instructions on MIPS use 18-bit signed offsets
    allowing for a branch range of 128 KBytes (backward and forward).
    However, this limit is not observed by the cBPF JIT compiler, and so
    the JIT compiler emits out-of-range branches when translating certain
    cBPF programs. A specific example of such a cBPF program is included in
    the "BPF_MAXINSNS: exec all MSH" test from lib/test_bpf.c that executes
    anomalous machine code containing incorrect branch offsets under JIT.
    
    Furthermore, this issue can be abused to craft undesirable machine
    code, where the control flow is hijacked to execute arbitrary Kernel
    code.
    
    The following steps can be used to reproduce the issue:
    
      # echo 1 > /proc/sys/net/core/bpf_jit_enable
      # modprobe test_bpf test_name="BPF_MAXINSNS: exec all MSH"
    
    This should produce multiple warnings from build_bimm() similar to:
    
      ------------[ cut here ]------------
      WARNING: CPU: 0 PID: 209 at arch/mips/mm/uasm-mips.c:210 build_insn+0x558/0x590
      Micro-assembler field overflow
      Modules linked in: test_bpf(+)
      CPU: 0 PID: 209 Comm: modprobe Not tainted 5.14.3 #1
      Stack : 00000000 807bb824 82b33c9c 801843c0 00000000 00000004 00000000 63c9b5ee
              82b33af4 80999898 80910000 80900000 82fd6030 00000001 82b33a98 82087180
              00000000 00000000 80873b28 00000000 000000fc 82b3394c 00000000 2e34312e
              6d6d6f43 809a180f 809a1836 6f6d203a 80900000 00000001 82b33bac 80900000
              00027f80 00000000 00000000 807bb824 00000000 804ed790 001cc317 00000001
      [...]
      Call Trace:
      [<80108f44>] show_stack+0x38/0x118
      [<807a7aac>] dump_stack_lvl+0x5c/0x7c
      [<807a4b3c>] __warn+0xcc/0x140
      [<807a4c3c>] warn_slowpath_fmt+0x8c/0xb8
      [<8011e198>] build_insn+0x558/0x590
      [<8011e358>] uasm_i_bne+0x20/0x2c
      [<80127b48>] build_body+0xa58/0x2a94
      [<80129c98>] bpf_jit_compile+0x114/0x1e4
      [<80613fc4>] bpf_prepare_filter+0x2ec/0x4e4
      [<8061423c>] bpf_prog_create+0x80/0xc4
      [<c0a006e4>] test_bpf_init+0x300/0xba8 [test_bpf]
      [<8010051c>] do_one_initcall+0x50/0x1d4
      [<801c5e54>] do_init_module+0x60/0x220
      [<801c8b20>] sys_finit_module+0xc4/0xfc
      [<801144d0>] syscall_common+0x34/0x58
      [...]
      ---[ end trace a287d9742503c645 ]---
    
    Then the anomalous machine code executes:
    
    => 0xc0a18000:  addiu   sp,sp,-16
       0xc0a18004:  sw      s3,0(sp)
       0xc0a18008:  sw      s4,4(sp)
       0xc0a1800c:  sw      s5,8(sp)
       0xc0a18010:  sw      ra,12(sp)
       0xc0a18014:  move    s5,a0
       0xc0a18018:  move    s4,zero
       0xc0a1801c:  move    s3,zero
    
       # __BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0)
       0xc0a18020:  lui     t6,0x8012
       0xc0a18024:  ori     t4,t6,0x9e14
       0xc0a18028:  li      a1,0
       0xc0a1802c:  jalr    t4
       0xc0a18030:  move    a0,s5
       0xc0a18034:  bnez    v0,0xc0a1ffb8           # incorrect branch offset
       0xc0a18038:  move    v0,zero
       0xc0a1803c:  andi    s4,s3,0xf
       0xc0a18040:  b       0xc0a18048
       0xc0a18044:  sll     s4,s4,0x2
       [...]
    
       # __BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0)
       0xc0a1ffa0:  lui     t6,0x8012
       0xc0a1ffa4:  ori     t4,t6,0x9e14
       0xc0a1ffa8:  li      a1,0
       0xc0a1ffac:  jalr    t4
       0xc0a1ffb0:  move    a0,s5
       0xc0a1ffb4:  bnez    v0,0xc0a1ffb8           # incorrect branch offset
       0xc0a1ffb8:  move    v0,zero
       0xc0a1ffbc:  andi    s4,s3,0xf
       0xc0a1ffc0:  b       0xc0a1ffc8
       0xc0a1ffc4:  sll     s4,s4,0x2
    
       # __BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0)
       0xc0a1ffc8:  lui     t6,0x8012
       0xc0a1ffcc:  ori     t4,t6,0x9e14
       0xc0a1ffd0:  li      a1,0
       0xc0a1ffd4:  jalr    t4
       0xc0a1ffd8:  move    a0,s5
       0xc0a1ffdc:  bnez    v0,0xc0a3ffb8           # correct branch offset
       0xc0a1ffe0:  move    v0,zero
       0xc0a1ffe4:  andi    s4,s3,0xf
       0xc0a1ffe8:  b       0xc0a1fff0
       0xc0a1ffec:  sll     s4,s4,0x2
       [...]
    
       # epilogue
       0xc0a3ffb8:  lw      s3,0(sp)
       0xc0a3ffbc:  lw      s4,4(sp)
       0xc0a3ffc0:  lw      s5,8(sp)
       0xc0a3ffc4:  lw      ra,12(sp)
       0xc0a3ffc8:  addiu   sp,sp,16
       0xc0a3ffcc:  jr      ra
       0xc0a3ffd0:  nop
    
    To mitigate this issue, we assert the branch ranges for each emit call
    that could generate an out-of-range branch.
    
    Fixes: 36366e367ee9 ("MIPS: BPF: Restore MIPS32 cBPF JIT")
    Fixes: c6610de353da ("MIPS: net: Add BPF JIT")
    Signed-off-by: Piotr Krysiuk <piotras@gmail.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Tested-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
    Acked-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
    Cc: Paul Burton <paulburton@kernel.org>
    Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Link: https://lore.kernel.org/bpf/20210915160437.4080-1-piotras@gmail.com
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/mips/net/bpf_jit.c b/arch/mips/net/bpf_jit.c
index 4d8cb9bb8365..43e6597c720c 100644
--- a/arch/mips/net/bpf_jit.c
+++ b/arch/mips/net/bpf_jit.c
@@ -662,6 +662,11 @@ static void build_epilogue(struct jit_ctx *ctx)
 	((int)K < 0 ? ((int)K >= SKF_LL_OFF ? func##_negative : func) : \
 	 func##_positive)
 
+static bool is_bad_offset(int b_off)
+{
+	return b_off > 0x1ffff || b_off < -0x20000;
+}
+
 static int build_body(struct jit_ctx *ctx)
 {
 	const struct bpf_prog *prog = ctx->skf;
@@ -728,7 +733,10 @@ static int build_body(struct jit_ctx *ctx)
 			/* Load return register on DS for failures */
 			emit_reg_move(r_ret, r_zero, ctx);
 			/* Return with error */
-			emit_b(b_imm(prog->len, ctx), ctx);
+			b_off = b_imm(prog->len, ctx);
+			if (is_bad_offset(b_off))
+				return -E2BIG;
+			emit_b(b_off, ctx);
 			emit_nop(ctx);
 			break;
 		case BPF_LD | BPF_W | BPF_IND:
@@ -775,8 +783,10 @@ static int build_body(struct jit_ctx *ctx)
 			emit_jalr(MIPS_R_RA, r_s0, ctx);
 			emit_reg_move(MIPS_R_A0, r_skb, ctx); /* delay slot */
 			/* Check the error value */
-			emit_bcond(MIPS_COND_NE, r_ret, 0,
-				   b_imm(prog->len, ctx), ctx);
+			b_off = b_imm(prog->len, ctx);
+			if (is_bad_offset(b_off))
+				return -E2BIG;
+			emit_bcond(MIPS_COND_NE, r_ret, 0, b_off, ctx);
 			emit_reg_move(r_ret, r_zero, ctx);
 			/* We are good */
 			/* X <- P[1:K] & 0xf */
@@ -855,8 +865,10 @@ static int build_body(struct jit_ctx *ctx)
 			/* A /= X */
 			ctx->flags |= SEEN_X | SEEN_A;
 			/* Check if r_X is zero */
-			emit_bcond(MIPS_COND_EQ, r_X, r_zero,
-				   b_imm(prog->len, ctx), ctx);
+			b_off = b_imm(prog->len, ctx);
+			if (is_bad_offset(b_off))
+				return -E2BIG;
+			emit_bcond(MIPS_COND_EQ, r_X, r_zero, b_off, ctx);
 			emit_load_imm(r_ret, 0, ctx); /* delay slot */
 			emit_div(r_A, r_X, ctx);
 			break;
@@ -864,8 +876,10 @@ static int build_body(struct jit_ctx *ctx)
 			/* A %= X */
 			ctx->flags |= SEEN_X | SEEN_A;
 			/* Check if r_X is zero */
-			emit_bcond(MIPS_COND_EQ, r_X, r_zero,
-				   b_imm(prog->len, ctx), ctx);
+			b_off = b_imm(prog->len, ctx);
+			if (is_bad_offset(b_off))
+				return -E2BIG;
+			emit_bcond(MIPS_COND_EQ, r_X, r_zero, b_off, ctx);
 			emit_load_imm(r_ret, 0, ctx); /* delay slot */
 			emit_mod(r_A, r_X, ctx);
 			break;
@@ -926,7 +940,10 @@ static int build_body(struct jit_ctx *ctx)
 			break;
 		case BPF_JMP | BPF_JA:
 			/* pc += K */
-			emit_b(b_imm(i + k + 1, ctx), ctx);
+			b_off = b_imm(i + k + 1, ctx);
+			if (is_bad_offset(b_off))
+				return -E2BIG;
+			emit_b(b_off, ctx);
 			emit_nop(ctx);
 			break;
 		case BPF_JMP | BPF_JEQ | BPF_K:
@@ -1056,12 +1073,16 @@ static int build_body(struct jit_ctx *ctx)
 			break;
 		case BPF_RET | BPF_A:
 			ctx->flags |= SEEN_A;
-			if (i != prog->len - 1)
+			if (i != prog->len - 1) {
 				/*
 				 * If this is not the last instruction
 				 * then jump to the epilogue
 				 */
-				emit_b(b_imm(prog->len, ctx), ctx);
+				b_off = b_imm(prog->len, ctx);
+				if (is_bad_offset(b_off))
+					return -E2BIG;
+				emit_b(b_off, ctx);
+			}
 			emit_reg_move(r_ret, r_A, ctx); /* delay slot */
 			break;
 		case BPF_RET | BPF_K:
@@ -1075,7 +1096,10 @@ static int build_body(struct jit_ctx *ctx)
 				 * If this is not the last instruction
 				 * then jump to the epilogue
 				 */
-				emit_b(b_imm(prog->len, ctx), ctx);
+				b_off = b_imm(prog->len, ctx);
+				if (is_bad_offset(b_off))
+					return -E2BIG;
+				emit_b(b_off, ctx);
 				emit_nop(ctx);
 			}
 			break;
@@ -1133,8 +1157,10 @@ static int build_body(struct jit_ctx *ctx)
 			/* Load *dev pointer */
 			emit_load_ptr(r_s0, r_skb, off, ctx);
 			/* error (0) in the delay slot */
-			emit_bcond(MIPS_COND_EQ, r_s0, r_zero,
-				   b_imm(prog->len, ctx), ctx);
+			b_off = b_imm(prog->len, ctx);
+			if (is_bad_offset(b_off))
+				return -E2BIG;
+			emit_bcond(MIPS_COND_EQ, r_s0, r_zero, b_off, ctx);
 			emit_reg_move(r_ret, r_zero, ctx);
 			if (code == (BPF_ANC | SKF_AD_IFINDEX)) {
 				BUILD_BUG_ON(FIELD_SIZEOF(struct net_device, ifindex) != 4);
@@ -1244,7 +1270,10 @@ void bpf_jit_compile(struct bpf_prog *fp)
 
 	/* Generate the actual JIT code */
 	build_prologue(&ctx);
-	build_body(&ctx);
+	if (build_body(&ctx)) {
+		module_memfree(ctx.target);
+		goto out;
+	}
 	build_epilogue(&ctx);
 
 	/* Update the icache */

commit cda5d76ac8656b93b38d6ed79428496d31c092ed
Author: David Heidelberg <david@ixit.cz>
Date:   Wed Aug 18 08:53:17 2021 +0200

    ARM: dts: qcom: apq8064: use compatible which contains chipid
    
    commit f5c03f131dae3f06d08464e6157dd461200f78d9 upstream.
    
    Also resolves these kernel warnings for APQ8064:
    adreno 4300000.adreno-3xx: Using legacy qcom,chipid binding!
    adreno 4300000.adreno-3xx: Use compatible qcom,adreno-320.2 instead.
    
    Tested on Nexus 7 2013, no functional changes.
    
    Cc: <stable@vger.kernel.org>
    Signed-off-by: David Heidelberg <david@ixit.cz>
    Link: https://lore.kernel.org/r/20210818065317.19822-1-david@ixit.cz
    Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/boot/dts/qcom-apq8064.dtsi b/arch/arm/boot/dts/qcom-apq8064.dtsi
index d0153bbbdbeb..00daa844bf8c 100644
--- a/arch/arm/boot/dts/qcom-apq8064.dtsi
+++ b/arch/arm/boot/dts/qcom-apq8064.dtsi
@@ -1182,7 +1182,7 @@
 		};
 
 		gpu: adreno-3xx@4300000 {
-			compatible = "qcom,adreno-3xx";
+			compatible = "qcom,adreno-320.2", "qcom,adreno";
 			reg = <0x04300000 0x20000>;
 			reg-names = "kgsl_3d0_reg_memory";
 			interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
@@ -1197,7 +1197,6 @@
 			    <&mmcc GFX3D_AHB_CLK>,
 			    <&mmcc GFX3D_AXI_CLK>,
 			    <&mmcc MMSS_IMEM_AHB_CLK>;
-			qcom,chipid = <0x03020002>;
 
 			iommus = <&gfx3d 0
 				  &gfx3d 1

commit d8c3ea10bdeea32b98a7768cc7d3f102a43d43be
Author: Roger Quadros <rogerq@kernel.org>
Date:   Thu Sep 2 12:58:28 2021 +0300

    ARM: dts: omap3430-sdp: Fix NAND device node
    
    commit 80d680fdccba214e8106dc1aa33de5207ad75394 upstream.
    
    Nand is on CS1 so reg properties first field should be 1 not 0.
    
    Fixes: 44e4716499b8 ("ARM: dts: omap3: Fix NAND device nodes")
    Cc: stable@vger.kernel.org # v4.6+
    Signed-off-by: Roger Quadros <rogerq@kernel.org>
    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/boot/dts/omap3430-sdp.dts b/arch/arm/boot/dts/omap3430-sdp.dts
index d652708f6bef..56e3db08e969 100644
--- a/arch/arm/boot/dts/omap3430-sdp.dts
+++ b/arch/arm/boot/dts/omap3430-sdp.dts
@@ -104,7 +104,7 @@
 
 	nand@1,0 {
 		compatible = "ti,omap2-nand";
-		reg = <0 0 4>; /* CS0, offset 0, IO size 4 */
+		reg = <1 0 4>; /* CS1, offset 0, IO size 4 */
 		interrupt-parent = <&gpmc>;
 		interrupts = <0 IRQ_TYPE_NONE>, /* fifoevent */
 			     <1 IRQ_TYPE_NONE>;	/* termcount */

commit 0bec1ceaf14ed69022010a42e9ca5b1e20c4856a
Author: Juergen Gross <jgross@suse.com>
Date:   Tue Oct 5 15:34:33 2021 +0200

    xen/balloon: fix cancelled balloon action
    
    commit 319933a80fd4f07122466a77f93e5019d71be74c upstream.
    
    In case a ballooning action is cancelled the new kernel thread handling
    the ballooning might end up in a busy loop.
    
    Fix that by handling the cancelled action gracefully.
    
    While at it introduce a short wait for the BP_WAIT case.
    
    Cc: stable@vger.kernel.org
    Fixes: 8480ed9c2bbd56 ("xen/balloon: use a kernel thread instead a workqueue")
    Reported-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Tested-by: Jason Andryuk <jandryuk@gmail.com>
    Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Link: https://lore.kernel.org/r/20211005133433.32008-1-jgross@suse.com
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
index 2459e2afd65e..19906020eb14 100644
--- a/drivers/xen/balloon.c
+++ b/drivers/xen/balloon.c
@@ -508,12 +508,12 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp)
 }
 
 /*
- * Stop waiting if either state is not BP_EAGAIN and ballooning action is
- * needed, or if the credit has changed while state is BP_EAGAIN.
+ * Stop waiting if either state is BP_DONE and ballooning action is
+ * needed, or if the credit has changed while state is not BP_DONE.
  */
 static bool balloon_thread_cond(enum bp_state state, long credit)
 {
-	if (state != BP_EAGAIN)
+	if (state == BP_DONE)
 		credit = 0;
 
 	return current_credit() != credit || kthread_should_stop();
@@ -533,10 +533,19 @@ static int balloon_thread(void *unused)
 
 	set_freezable();
 	for (;;) {
-		if (state == BP_EAGAIN)
-			timeout = balloon_stats.schedule_delay * HZ;
-		else
+		switch (state) {
+		case BP_DONE:
+		case BP_ECANCELED:
 			timeout = 3600 * HZ;
+			break;
+		case BP_EAGAIN:
+			timeout = balloon_stats.schedule_delay * HZ;
+			break;
+		case BP_WAIT:
+			timeout = HZ;
+			break;
+		}
+
 		credit = current_credit();
 
 		wait_event_freezable_timeout(balloon_thread_wq,

commit 5520f1471c38feca69daad07a4e8a121cdf3e144
Author: Trond Myklebust <trond.myklebust@hammerspace.com>
Date:   Thu Sep 30 15:44:41 2021 -0400

    nfsd4: Handle the NFSv4 READDIR 'dircount' hint being zero
    
    commit f2e717d655040d632c9015f19aa4275f8b16e7f2 upstream.
    
    RFC3530 notes that the 'dircount' field may be zero, in which case the
    recommendation is to ignore it, and only enforce the 'maxcount' field.
    In RFC5661, this recommendation to ignore a zero valued field becomes a
    requirement.
    
    Fixes: aee377644146 ("nfsd4: fix rd_dircount enforcement")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index db0beefe65ec..f67c5de1aeb8 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -3124,15 +3124,18 @@ nfsd4_encode_dirent(void *ccdv, const char *name, int namlen,
 		goto fail;
 	cd->rd_maxcount -= entry_bytes;
 	/*
-	 * RFC 3530 14.2.24 describes rd_dircount as only a "hint", so
-	 * let's always let through the first entry, at least:
+	 * RFC 3530 14.2.24 describes rd_dircount as only a "hint", and
+	 * notes that it could be zero. If it is zero, then the server
+	 * should enforce only the rd_maxcount value.
 	 */
-	if (!cd->rd_dircount)
-		goto fail;
-	name_and_cookie = 4 + 4 * XDR_QUADLEN(namlen) + 8;
-	if (name_and_cookie > cd->rd_dircount && cd->cookie_offset)
-		goto fail;
-	cd->rd_dircount -= min(cd->rd_dircount, name_and_cookie);
+	if (cd->rd_dircount) {
+		name_and_cookie = 4 + 4 * XDR_QUADLEN(namlen) + 8;
+		if (name_and_cookie > cd->rd_dircount && cd->cookie_offset)
+			goto fail;
+		cd->rd_dircount -= min(cd->rd_dircount, name_and_cookie);
+		if (!cd->rd_dircount)
+			cd->rd_maxcount = 0;
+	}
 
 	cd->cookie_offset = cookie_offset;
 skip_entry:

commit 9d4969d8b5073d02059bae3f1b8d9a20cf023c55
Author: Zheng Liang <zhengliang6@huawei.com>
Date:   Fri Sep 24 09:16:27 2021 +0800

    ovl: fix missing negative dentry check in ovl_rename()
    
    commit a295aef603e109a47af355477326bd41151765b6 upstream.
    
    The following reproducer
    
      mkdir lower upper work merge
      touch lower/old
      touch lower/new
      mount -t overlay overlay -olowerdir=lower,upperdir=upper,workdir=work merge
      rm merge/new
      mv merge/old merge/new & unlink upper/new
    
    may result in this race:
    
    PROCESS A:
      rename("merge/old", "merge/new");
      overwrite=true,ovl_lower_positive(old)=true,
      ovl_dentry_is_whiteout(new)=true -> flags |= RENAME_EXCHANGE
    
    PROCESS B:
      unlink("upper/new");
    
    PROCESS A:
      lookup newdentry in new_upperdir
      call vfs_rename() with negative newdentry and RENAME_EXCHANGE
    
    Fix by adding the missing check for negative newdentry.
    
    Signed-off-by: Zheng Liang <zhengliang6@huawei.com>
    Fixes: e9be9d5e76e3 ("overlay filesystem")
    Cc: <stable@vger.kernel.org> # v3.18
    Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c
index 0b4ee1ab25df..0578c15e1a67 100644
--- a/fs/overlayfs/dir.c
+++ b/fs/overlayfs/dir.c
@@ -1166,9 +1166,13 @@ static int ovl_rename(struct inode *olddir, struct dentry *old,
 				goto out_dput;
 		}
 	} else {
-		if (!d_is_negative(newdentry) &&
-		    (!new_opaque || !ovl_is_whiteout(newdentry)))
-			goto out_dput;
+		if (!d_is_negative(newdentry)) {
+			if (!new_opaque || !ovl_is_whiteout(newdentry))
+				goto out_dput;
+		} else {
+			if (flags & RENAME_EXCHANGE)
+				goto out_dput;
+		}
 	}
 
 	if (olddentry == trap)

commit 56eeac7d325ab707592219be2f9aea460abbb6ad
Author: Jan Beulich <jbeulich@suse.com>
Date:   Wed Sep 22 12:17:48 2021 +0200

    xen/privcmd: fix error handling in mmap-resource processing
    
    commit e11423d6721dd63b23fb41ade5e8d0b448b17780 upstream.
    
    xen_pfn_t is the same size as int only on 32-bit builds (and not even
    on Arm32). Hence pfns[] can't be used directly to read individual error
    values returned from xen_remap_domain_mfn_array(); every other error
    indicator would be skipped/ignored on 64-bit.
    
    Fixes: 3ad0876554ca ("xen/privcmd: add IOCTL_PRIVCMD_MMAP_RESOURCE")
    Cc: stable@vger.kernel.org
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    
    Link: https://lore.kernel.org/r/aa6d6a67-6889-338a-a910-51e889f792d5@suse.com
    Signed-off-by: Juergen Gross <jgross@suse.com>

diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c
index a8486432be05..74ff28fda64d 100644
--- a/drivers/xen/privcmd.c
+++ b/drivers/xen/privcmd.c
@@ -835,11 +835,12 @@ static long privcmd_ioctl_mmap_resource(struct file *file,
 		unsigned int domid =
 			(xdata.flags & XENMEM_rsrc_acq_caller_owned) ?
 			DOMID_SELF : kdata.dom;
-		int num;
+		int num, *errs = (int *)pfns;
 
+		BUILD_BUG_ON(sizeof(*errs) > sizeof(*pfns));
 		num = xen_remap_domain_mfn_array(vma,
 						 kdata.addr & PAGE_MASK,
-						 pfns, kdata.num, (int *)pfns,
+						 pfns, kdata.num, errs,
 						 vma->vm_page_prot,
 						 domid,
 						 vma->vm_private_data);
@@ -849,7 +850,7 @@ static long privcmd_ioctl_mmap_resource(struct file *file,
 			unsigned int i;
 
 			for (i = 0; i < num; i++) {
-				rc = pfns[i];
+				rc = errs[i];
 				if (rc < 0)
 					break;
 			}

commit 2cc9bc2342cf63a5ef422b681c96ec8a51ad9c3b
Author: Johan Hovold <johan@kernel.org>
Date:   Wed Sep 29 11:09:37 2021 +0200

    USB: cdc-acm: fix break reporting
    
    commit 58fc1daa4d2e9789b9ffc880907c961ea7c062cc upstream.
    
    A recent change that started reporting break events forgot to push the
    event to the line discipline, which meant that a detected break would
    not be reported until further characters had been receive (the port
    could even have been closed and reopened in between).
    
    Fixes: 08dff274edda ("cdc-acm: fix BREAK rx code path adding necessary calls")
    Cc: stable@vger.kernel.org
    Acked-by: Oliver Neukum <oneukum@suse.com>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20210929090937.7410-3-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index 5f44877137de..0522bd2d9d3c 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -339,6 +339,9 @@ static void acm_process_notification(struct acm *acm, unsigned char *buf)
 			acm->iocount.overrun++;
 		spin_unlock_irqrestore(&acm->read_lock, flags);
 
+		if (newctrl & ACM_CTRL_BRK)
+			tty_flip_buffer_push(&acm->port);
+
 		if (difference)
 			wake_up_all(&acm->wioctl);
 

commit 5586e0f68fea90a63f013e3bb0e0f35756489854
Author: Johan Hovold <johan@kernel.org>
Date:   Wed Sep 29 11:09:36 2021 +0200

    USB: cdc-acm: fix racy tty buffer accesses
    
    commit 65a205e6113506e69a503b61d97efec43fc10fd7 upstream.
    
    A recent change that started reporting break events to the line
    discipline caused the tty-buffer insertions to no longer be serialised
    by inserting events also from the completion handler for the interrupt
    endpoint.
    
    Completion calls for distinct endpoints are not guaranteed to be
    serialised. For example, in case a host-controller driver uses
    bottom-half completion, the interrupt and bulk-in completion handlers
    can end up running in parallel on two CPUs (high-and low-prio tasklets,
    respectively) thereby breaking the tty layer's single producer
    assumption.
    
    Fix this by holding the read lock also when inserting characters from
    the bulk endpoint.
    
    Fixes: 08dff274edda ("cdc-acm: fix BREAK rx code path adding necessary calls")
    Cc: stable@vger.kernel.org
    Acked-by: Oliver Neukum <oneukum@suse.com>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20210929090937.7410-2-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index 6959231d63b3..5f44877137de 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -474,11 +474,16 @@ static int acm_submit_read_urbs(struct acm *acm, gfp_t mem_flags)
 
 static void acm_process_read_urb(struct acm *acm, struct urb *urb)
 {
+	unsigned long flags;
+
 	if (!urb->actual_length)
 		return;
 
+	spin_lock_irqsave(&acm->read_lock, flags);
 	tty_insert_flip_string(&acm->port, urb->transfer_buffer,
 			urb->actual_length);
+	spin_unlock_irqrestore(&acm->read_lock, flags);
+
 	tty_flip_buffer_push(&acm->port);
 }
 

commit 75c1aa7ed1ed4caf5d9dde0a7a8f142140afbce9
Author: Ben Hutchings <ben@decadent.org.uk>
Date:   Tue Sep 21 16:34:42 2021 +0200

    Partially revert "usb: Kconfig: using select for USB_COMMON dependency"
    
    commit 4d1aa9112c8e6995ef2c8a76972c9671332ccfea upstream.
    
    This reverts commit cb9c1cfc86926d0e86d19c8e34f6c23458cd3478 for
    USB_LED_TRIG.  This config symbol has bool type and enables extra code
    in usb_common itself, not a separate driver.  Enabling it should not
    force usb_common to be built-in!
    
    Fixes: cb9c1cfc8692 ("usb: Kconfig: using select for USB_COMMON dependency")
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    Signed-off-by: Salvatore Bonaccorso <carnil@debian.org>
    Link: https://lore.kernel.org/r/20210921143442.340087-1-carnil@debian.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig
index 70e6c956c23c..a9f12a52f726 100644
--- a/drivers/usb/Kconfig
+++ b/drivers/usb/Kconfig
@@ -175,8 +175,7 @@ source "drivers/usb/roles/Kconfig"
 
 config USB_LED_TRIG
 	bool "USB LED Triggers"
-	depends on LEDS_CLASS && LEDS_TRIGGERS
-	select USB_COMMON
+	depends on LEDS_CLASS && USB_COMMON && LEDS_TRIGGERS
 	help
 	  This option adds LED triggers for USB host and/or gadget activity.
 

commit 106d1430c1474c8d6b63b18fdb7e695e00bba191
Author: Herman Chen <herman.chen@rock-chips.com>
Date:   Tue Oct 12 09:15:20 2021 +0800

    video: rockchip: mpp: Remove lock on session release
    
    Move mpp_session_deinit out of the lock range.
    
    Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
    Change-Id: I46c3aaeb96c67ed04630b0da0a71385546dd5e7c

diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c
index 2ed00ed52c95..9b2c72b15796 100644
--- a/drivers/video/rockchip/mpp/mpp_common.c
+++ b/drivers/video/rockchip/mpp/mpp_common.c
@@ -742,17 +742,25 @@ static void mpp_task_try_run(struct kthread_work *work_s)
 
 done:
 	mutex_lock(&queue->session_lock);
-	if (queue->detach_count) {
-		struct mpp_session *session = NULL, *n;
+	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--;
+		}
 
-		mpp_dbg_session("%s detach count %d\n", dev_name(mpp->dev),
-				queue->detach_count);
+		mutex_unlock(&queue->session_lock);
 
-		list_for_each_entry_safe(session, n, &queue->session_detach,
-					 session_link) {
-			if (!mpp_session_deinit(session))
-				queue->detach_count--;
+		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);
 }
diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c
index 589781bc53f3..4d2048b3803f 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c
@@ -1424,20 +1424,25 @@ void rkvdec2_link_worker(struct kthread_work *work_s)
 	}
 
 	mutex_lock(&queue->session_lock);
-	if (queue->detach_count) {
-		struct mpp_session *session = NULL, *n;
+	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--;
+		}
 
-		mpp_dbg_session("%s detach count %d start\n",
-				dev_name(mpp->dev), queue->detach_count);
+		mutex_unlock(&queue->session_lock);
 
-		list_for_each_entry_safe(session, n, &queue->session_detach,
-					 session_link) {
-			if (!mpp_session_deinit(session))
-				queue->detach_count--;
+		if (session) {
+			mpp_dbg_session("%s detach count %d\n", dev_name(mpp->dev),
+					queue->detach_count);
+			mpp_session_deinit(session);
 		}
 
-		mpp_dbg_session("%s detach count %d done\n", dev_name(mpp->dev),
-				queue->detach_count);
+		mutex_lock(&queue->session_lock);
 	}
 	mutex_unlock(&queue->session_lock);
 }

commit 0c84d6bce818089409e975819233ca742312cafd
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Wed Oct 13 09:35:22 2021 +0800

    arm64: dts: rockchip: set chrg_term_mode 1 for eink boards
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: Ia383cf9c70acd1aaed0f6426485ebd8c7039f3eb

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts
index 45a9e8312eea..db0e3a0e6735 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts
@@ -653,7 +653,7 @@
 			max_input_current = <1500>;
 			max_chrg_current = <2000>;
 			max_chrg_voltage = <4300>;
-			chrg_term_mode = <0>;
+			chrg_term_mode = <1>;
 			chrg_finish_cur = <300>;
 			virtual_power = <0>;
 			dc_det_adc = <0>;
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w6.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w6.dts
index 03801d5dff0e..015fdc4a740d 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w6.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w6.dts
@@ -551,7 +551,7 @@
 			max_input_current = <1500>;
 			max_chrg_current = <2000>;
 			max_chrg_voltage = <4300>;
-			chrg_term_mode = <0>;
+			chrg_term_mode = <1>;
 			chrg_finish_cur = <300>;
 			virtual_power = <0>;
 			dc_det_adc = <0>;

commit 3b1e3e2136d2b1e52fc8ae108a4bade6b747a3c3
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Tue Oct 12 15:46:47 2021 +0800

    arm64: dts: rockchip: rk3568-pinctrl: remove flash_volsel
    
    The flash_volsel is not a pin for flash
    
    Change-Id: Ib1f4f4e7f11685ead858e6192b661069c6b85609
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-pinctrl.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-pinctrl.dtsi
index 30d8cedfbdc7..347197d7f1a4 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-pinctrl.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-pinctrl.dtsi
@@ -529,8 +529,6 @@
 				<1 RK_PD2 2 &pcfg_pull_none>,
 				/* flash_rdy */
 				<1 RK_PD1 2 &pcfg_pull_none>,
-				/* flash_volsel */
-				<0 RK_PA7 1 &pcfg_pull_none>,
 				/* flash_wpn */
 				<1 RK_PC7 3 &pcfg_pull_none>,
 				/* flash_wrn */

commit 6ccae1fe9fe49c68b7e512073b840a76717fd41c
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Tue Oct 12 15:45:05 2021 +0800

    ARM: dts: rv1126-pinctrl: remove flash_vol_sel/trig_in/trig_out
    
    flash_vol_sel / flash_trig_in / flash_trig_out are not pin for flash.
    
    Change-Id: I149ecac1013f6bd1f7b39440fda0511340b99edd
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/arch/arm/boot/dts/rv1126-pinctrl.dtsi b/arch/arm/boot/dts/rv1126-pinctrl.dtsi
index b6ad54a71a5d..e063e81d1e03 100644
--- a/arch/arm/boot/dts/rv1126-pinctrl.dtsi
+++ b/arch/arm/boot/dts/rv1126-pinctrl.dtsi
@@ -267,12 +267,6 @@
 				<1 RK_PA2 1 &pcfg_pull_none>,
 				/* flash_rdyn */
 				<1 RK_PA1 1 &pcfg_pull_none>,
-				/* flash_trig_in */
-				<1 RK_PC5 4 &pcfg_pull_none>,
-				/* flash_trig_out */
-				<1 RK_PC4 4 &pcfg_pull_none>,
-				/* flash_vol_sel */
-				<0 RK_PB3 1 &pcfg_pull_none>,
 				/* flash_wpn */
 				<1 RK_PA3 1 &pcfg_pull_none>,
 				/* flash_wrn */

commit 02e8f2ba3776545018b272d76d1ffa180049c9e7
Author: Maciej Żenczykowski <maze@google.com>
Date:   Mon Oct 11 10:42:27 2021 -0700

    ANDROID: Different fix for KABI breakage in 4.19.209 in struct sock
    
    This partially reverts commit ddf077f140f12e6f0c7de3bd45cc4b1ea4ce4875.
    
    Then fixes things up in such a way that
      BUILD_CONFIG=build/build.config.net_test for kernel_test
    still works.
    
    Bug: 202712021
    Signed-off-by: Maciej Żenczykowski <maze@google.com>
    Change-Id: I40e24d7924fcffc23a2b8cc5ad50049808aa9455

diff --git a/build.config.allmodconfig b/build.config.allmodconfig
index dd01f6a34425..103d1cdf4edc 100644
--- a/build.config.allmodconfig
+++ b/build.config.allmodconfig
@@ -7,12 +7,6 @@ function update_config() {
          -d CPU_BIG_ENDIAN \
          -d STM \
          -d TEST_MEMCAT_P \
-         -d DEBUG_SPINLOCK \
-         -d DEBUG_LOCK_ALLOC \
-         -d LOCK_STAT \
-         -d DEBUG_WW_MUTEX_SLOWPATH \
-         -d DEBUG_LOCK_ALLOC \
-         -d PROVE_LOCKING \
          -e UNWINDER_FRAME_POINTER \
 
     (cd ${OUT_DIR} && \
diff --git a/include/net/sock.h b/include/net/sock.h
index 7d619a898ccb..79dde11135d4 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -472,6 +472,11 @@ struct sock {
 	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)
+	spinlock_t		sk_peer_lock;
+#else
+	/* sk_peer_lock is in the ANDROID_KABI_RESERVE(1) field below */
+#endif
 	struct pid		*sk_peer_pid;
 	const struct cred	*sk_peer_cred;
 
@@ -512,7 +517,11 @@ struct sock {
 	struct sock_reuseport __rcu	*sk_reuseport_cb;
 	struct rcu_head		sk_rcu;
 
+#if IS_ENABLED(CONFIG_DEBUG_SPINLOCK) || IS_ENABLED(CONFIG_DEBUG_LOCK_ALLOC)
+	ANDROID_KABI_RESERVE(1);
+#else
 	ANDROID_KABI_USE(1, spinlock_t sk_peer_lock);
+#endif
 	ANDROID_KABI_RESERVE(2);
 	ANDROID_KABI_RESERVE(3);
 	ANDROID_KABI_RESERVE(4);

commit 9172f699d0ab1ff4553250744b54890f893dcdc2
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Fri Oct 8 11:12:54 2021 +0800

    drm/rockchip: add to consider buffer cacheable at vmap
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: I7d823ceea5b50d3fa0a2d6fc252367611d2bb1e1

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
index 1d1a7dd9632d..d456b223f143 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
@@ -905,9 +905,13 @@ void *rockchip_gem_prime_vmap(struct drm_gem_object *obj)
 {
 	struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj);
 
-	if (rk_obj->pages)
-		return vmap(rk_obj->pages, rk_obj->num_pages, VM_MAP,
-			    pgprot_writecombine(PAGE_KERNEL));
+	if (rk_obj->pages) {
+		pgprot_t prot;
+
+		prot = rk_obj->flags & ROCKCHIP_BO_CACHABLE ? PAGE_KERNEL : pgprot_writecombine(PAGE_KERNEL);
+
+		return vmap(rk_obj->pages, rk_obj->num_pages, VM_MAP, prot);
+	}
 
 	if (rk_obj->dma_attrs & DMA_ATTR_NO_KERNEL_MAPPING)
 		return NULL;

commit 0ef7e4e69690dbbb37b47abcd5630c0d0d55e7dd
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Mon Oct 11 08:06:48 2021 +0200

    ANDROID: GKI: update .xml file for struct sock change
    
    Nothing changed that affects the running api, but libabigail has some
    issues with anonymous unions so we need to update the .xml file to let
    it know all is well here.
    
    Leaf changes summary: 1 artifact changed
    Changed leaf types summary: 1 leaf type changed
    Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 0 Added function
    Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
    
    'struct sock at sock.h:328:1' changed:
      type size hasn't changed
      there are data member changes:
        data member u64 android_kabi_reserved1 at offset 5888 (in bits) became anonymous data member 'union {spinlock_t sk_peer_lock; struct {u64 android_kabi_reserved1;}; union {};}'
      864 impacted interfaces
    
    Fixes: ddf077f140f1 ("ANDROID: Fix up KABI breakage in 4.19.209 in struct sock")
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: Ia79e9095e2cb88208b6bb6a83ef2579c59d9fd64

diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml
index 4f07b1470802..39d6f885f034 100644
--- a/android/abi_gki_aarch64.xml
+++ b/android/abi_gki_aarch64.xml
@@ -4975,97 +4975,97 @@
           <var-decl name='sk_peer_cred' type-id='bc33861a' visibility='default' filepath='include/net/sock.h' line='476' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='4736'>
-          <var-decl name='sk_rcvtimeo' type-id='bd54fe1a' visibility='default' filepath='include/net/sock.h' line='477' column='1'/>
+          <var-decl name='sk_rcvtimeo' type-id='bd54fe1a' visibility='default' filepath='include/net/sock.h' line='478' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='4800'>
-          <var-decl name='sk_stamp' type-id='fbc017ef' visibility='default' filepath='include/net/sock.h' line='478' column='1'/>
+          <var-decl name='sk_stamp' type-id='fbc017ef' visibility='default' filepath='include/net/sock.h' line='479' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='4864'>
-          <var-decl name='sk_tsflags' type-id='1dc6a898' visibility='default' filepath='include/net/sock.h' line='482' column='1'/>
+          <var-decl name='sk_tsflags' type-id='1dc6a898' visibility='default' filepath='include/net/sock.h' line='483' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='4880'>
-          <var-decl name='sk_shutdown' type-id='f9b06939' visibility='default' filepath='include/net/sock.h' line='483' column='1'/>
+          <var-decl name='sk_shutdown' type-id='f9b06939' visibility='default' filepath='include/net/sock.h' line='484' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='4896'>
-          <var-decl name='sk_tskey' type-id='19c2251e' visibility='default' filepath='include/net/sock.h' line='484' column='1'/>
+          <var-decl name='sk_tskey' type-id='19c2251e' visibility='default' filepath='include/net/sock.h' line='485' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='4928'>
-          <var-decl name='sk_zckey' type-id='49178f86' visibility='default' filepath='include/net/sock.h' line='485' column='1'/>
+          <var-decl name='sk_zckey' type-id='49178f86' visibility='default' filepath='include/net/sock.h' line='486' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='4960'>
-          <var-decl name='sk_clockid' type-id='f9b06939' visibility='default' filepath='include/net/sock.h' line='487' column='1'/>
+          <var-decl name='sk_clockid' type-id='f9b06939' visibility='default' filepath='include/net/sock.h' line='488' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='sk_txtime_deadline_mode' type-id='f9b06939' visibility='default' filepath='include/net/sock.h' line='488' column='1'/>
+          <var-decl name='sk_txtime_deadline_mode' type-id='f9b06939' visibility='default' filepath='include/net/sock.h' line='489' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1'>
-          <var-decl name='sk_txtime_report_errors' type-id='f9b06939' visibility='default' filepath='include/net/sock.h' line='489' column='1'/>
+          <var-decl name='sk_txtime_report_errors' type-id='f9b06939' visibility='default' filepath='include/net/sock.h' line='490' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2'>
-          <var-decl name='sk_txtime_unused' type-id='f9b06939' visibility='default' filepath='include/net/sock.h' line='490' column='1'/>
+          <var-decl name='sk_txtime_unused' type-id='f9b06939' visibility='default' filepath='include/net/sock.h' line='491' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='4992'>
-          <var-decl name='sk_socket' type-id='13103032' visibility='default' filepath='include/net/sock.h' line='492' column='1'/>
+          <var-decl name='sk_socket' type-id='13103032' visibility='default' filepath='include/net/sock.h' line='493' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5056'>
-          <var-decl name='sk_user_data' type-id='eaa32e2f' visibility='default' filepath='include/net/sock.h' line='493' column='1'/>
+          <var-decl name='sk_user_data' type-id='eaa32e2f' visibility='default' filepath='include/net/sock.h' line='494' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5120'>
-          <var-decl name='sk_security' type-id='eaa32e2f' visibility='default' filepath='include/net/sock.h' line='495' column='1'/>
+          <var-decl name='sk_security' type-id='eaa32e2f' visibility='default' filepath='include/net/sock.h' line='496' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5184'>
-          <var-decl name='sk_cgrp_data' type-id='8544f103' visibility='default' filepath='include/net/sock.h' line='497' column='1'/>
+          <var-decl name='sk_cgrp_data' type-id='8544f103' visibility='default' filepath='include/net/sock.h' line='498' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5248'>
-          <var-decl name='sk_memcg' type-id='223696fb' visibility='default' filepath='include/net/sock.h' line='498' column='1'/>
+          <var-decl name='sk_memcg' type-id='223696fb' visibility='default' filepath='include/net/sock.h' line='499' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5312'>
-          <var-decl name='sk_state_change' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='499' column='1'/>
+          <var-decl name='sk_state_change' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='500' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5376'>
-          <var-decl name='sk_data_ready' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='500' column='1'/>
+          <var-decl name='sk_data_ready' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='501' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5440'>
-          <var-decl name='sk_write_space' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='501' column='1'/>
+          <var-decl name='sk_write_space' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='502' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5504'>
-          <var-decl name='sk_error_report' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='502' column='1'/>
+          <var-decl name='sk_error_report' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='503' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5568'>
-          <var-decl name='sk_backlog_rcv' type-id='a0f5247f' visibility='default' filepath='include/net/sock.h' line='503' column='1'/>
+          <var-decl name='sk_backlog_rcv' type-id='a0f5247f' visibility='default' filepath='include/net/sock.h' line='504' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5632'>
-          <var-decl name='sk_destruct' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='510' column='1'/>
+          <var-decl name='sk_destruct' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='511' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5696'>
-          <var-decl name='sk_reuseport_cb' type-id='1d22b7e5' visibility='default' filepath='include/net/sock.h' line='511' column='1'/>
+          <var-decl name='sk_reuseport_cb' type-id='1d22b7e5' visibility='default' filepath='include/net/sock.h' line='512' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5760'>
-          <var-decl name='sk_rcu' type-id='e3d8ce29' visibility='default' filepath='include/net/sock.h' line='512' column='1'/>
+          <var-decl name='sk_rcu' type-id='e3d8ce29' visibility='default' filepath='include/net/sock.h' line='513' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5888'>
-          <var-decl name='android_kabi_reserved1' type-id='91ce1af9' visibility='default' filepath='include/net/sock.h' line='514' column='1'/>
+          <var-decl name='' type-id='b3414a3c' visibility='default' filepath='include/net/sock.h' line='515' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5952'>
-          <var-decl name='android_kabi_reserved2' type-id='91ce1af9' visibility='default' filepath='include/net/sock.h' line='515' column='1'/>
+          <var-decl name='android_kabi_reserved2' type-id='91ce1af9' visibility='default' filepath='include/net/sock.h' line='516' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6016'>
-          <var-decl name='android_kabi_reserved3' type-id='91ce1af9' visibility='default' filepath='include/net/sock.h' line='516' column='1'/>
+          <var-decl name='android_kabi_reserved3' type-id='91ce1af9' visibility='default' filepath='include/net/sock.h' line='517' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6080'>
-          <var-decl name='android_kabi_reserved4' type-id='91ce1af9' visibility='default' filepath='include/net/sock.h' line='517' column='1'/>
+          <var-decl name='android_kabi_reserved4' type-id='91ce1af9' visibility='default' filepath='include/net/sock.h' line='518' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6144'>
-          <var-decl name='android_kabi_reserved5' type-id='91ce1af9' visibility='default' filepath='include/net/sock.h' line='518' column='1'/>
+          <var-decl name='android_kabi_reserved5' type-id='91ce1af9' visibility='default' filepath='include/net/sock.h' line='519' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6208'>
-          <var-decl name='android_kabi_reserved6' type-id='91ce1af9' visibility='default' filepath='include/net/sock.h' line='519' column='1'/>
+          <var-decl name='android_kabi_reserved6' type-id='91ce1af9' visibility='default' filepath='include/net/sock.h' line='520' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6272'>
-          <var-decl name='android_kabi_reserved7' type-id='91ce1af9' visibility='default' filepath='include/net/sock.h' line='520' column='1'/>
+          <var-decl name='android_kabi_reserved7' type-id='91ce1af9' visibility='default' filepath='include/net/sock.h' line='521' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6336'>
-          <var-decl name='android_kabi_reserved8' type-id='91ce1af9' visibility='default' filepath='include/net/sock.h' line='521' column='1'/>
+          <var-decl name='android_kabi_reserved8' type-id='91ce1af9' visibility='default' filepath='include/net/sock.h' line='522' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='static_key_mod' is-struct='yes' visibility='default' is-declaration-only='yes' id='5081ed08'/>
@@ -10796,7 +10796,7 @@
         <subrange length='5' type-id='7ff19f0f' id='53010e10'/>
       </array-type-def>
       <pointer-type-def type-id='fdf3707c' size-in-bits='64' id='b1d4934a'/>
-      <union-decl name='__anonymous_union__2' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/trace_events.h' line='256' column='1' id='7d3eb798'>
+      <union-decl name='__anonymous_union__7' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/trace_events.h' line='256' column='1' id='7d3eb798'>
         <data-member access='public'>
           <var-decl name='name' type-id='26a90f95' visibility='default' filepath='include/linux/trace_events.h' line='257' column='1'/>
         </data-member>
@@ -10868,6 +10868,17 @@
           <var-decl name='sk_wq_raw' type-id='99f34ac1' visibility='default' filepath='include/net/sock.h' line='400' column='1'/>
         </data-member>
       </union-decl>
+      <union-decl name='__anonymous_union__31' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='515' column='1' id='b3414a3c'>
+        <data-member access='public'>
+          <var-decl name='sk_peer_lock' type-id='fb4018a0' visibility='default' filepath='include/net/sock.h' line='515' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='' type-id='156952c4' visibility='default' filepath='include/net/sock.h' line='515' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/net/sock.h' line='515' column='1'/>
+        </data-member>
+      </union-decl>
       <pointer-type-def type-id='e9b47ca9' size-in-bits='64' id='da623346'/>
       <type-decl name='unsigned int' size-in-bits='32' id='f0981eeb'/>
       <pointer-type-def type-id='cdd79d4e' size-in-bits='64' id='f77c2568'/>
@@ -12616,165 +12627,165 @@
           <var-decl name='check_period' type-id='36f91979' visibility='default' filepath='include/linux/perf_event.h' line='457' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='proto' size-in-bits='3392' is-struct='yes' visibility='default' filepath='include/net/sock.h' line='1077' column='1' id='7203ee09'>
+      <class-decl name='proto' size-in-bits='3392' is-struct='yes' visibility='default' filepath='include/net/sock.h' line='1078' column='1' id='7203ee09'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='close' type-id='09f3a86b' visibility='default' filepath='include/net/sock.h' line='1078' column='1'/>
+          <var-decl name='close' type-id='09f3a86b' visibility='default' filepath='include/net/sock.h' line='1079' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='pre_connect' type-id='c25ed103' visibility='default' filepath='include/net/sock.h' line='1080' column='1'/>
+          <var-decl name='pre_connect' type-id='c25ed103' visibility='default' filepath='include/net/sock.h' line='1081' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='connect' type-id='c25ed103' visibility='default' filepath='include/net/sock.h' line='1083' column='1'/>
+          <var-decl name='connect' type-id='c25ed103' visibility='default' filepath='include/net/sock.h' line='1084' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='disconnect' type-id='95208a5e' visibility='default' filepath='include/net/sock.h' line='1086' column='1'/>
+          <var-decl name='disconnect' type-id='95208a5e' visibility='default' filepath='include/net/sock.h' line='1087' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='accept' type-id='67adf9a9' visibility='default' filepath='include/net/sock.h' line='1088' column='1'/>
+          <var-decl name='accept' type-id='67adf9a9' visibility='default' filepath='include/net/sock.h' line='1089' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='ioctl' type-id='08113f0a' visibility='default' filepath='include/net/sock.h' line='1091' column='1'/>
+          <var-decl name='ioctl' type-id='08113f0a' visibility='default' filepath='include/net/sock.h' line='1092' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='init' type-id='55530c47' visibility='default' filepath='include/net/sock.h' line='1093' column='1'/>
+          <var-decl name='init' type-id='55530c47' visibility='default' filepath='include/net/sock.h' line='1094' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='destroy' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1094' column='1'/>
+          <var-decl name='destroy' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1095' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='shutdown' type-id='e937debf' visibility='default' filepath='include/net/sock.h' line='1095' column='1'/>
+          <var-decl name='shutdown' type-id='e937debf' visibility='default' filepath='include/net/sock.h' line='1096' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='setsockopt' type-id='bc1bf185' visibility='default' filepath='include/net/sock.h' line='1096' column='1'/>
+          <var-decl name='setsockopt' type-id='bc1bf185' visibility='default' filepath='include/net/sock.h' line='1097' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='640'>
-          <var-decl name='getsockopt' type-id='e0fadd76' visibility='default' filepath='include/net/sock.h' line='1099' column='1'/>
+          <var-decl name='getsockopt' type-id='e0fadd76' visibility='default' filepath='include/net/sock.h' line='1100' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='keepalive' type-id='e937debf' visibility='default' filepath='include/net/sock.h' line='1102' column='1'/>
+          <var-decl name='keepalive' type-id='e937debf' visibility='default' filepath='include/net/sock.h' line='1103' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='768'>
-          <var-decl name='compat_setsockopt' type-id='bc1bf185' visibility='default' filepath='include/net/sock.h' line='1104' column='1'/>
+          <var-decl name='compat_setsockopt' type-id='bc1bf185' visibility='default' filepath='include/net/sock.h' line='1105' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='compat_getsockopt' type-id='e0fadd76' visibility='default' filepath='include/net/sock.h' line='1108' column='1'/>
+          <var-decl name='compat_getsockopt' type-id='e0fadd76' visibility='default' filepath='include/net/sock.h' line='1109' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='896'>
-          <var-decl name='compat_ioctl' type-id='20da830b' visibility='default' filepath='include/net/sock.h' line='1112' column='1'/>
+          <var-decl name='compat_ioctl' type-id='20da830b' visibility='default' filepath='include/net/sock.h' line='1113' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='960'>
-          <var-decl name='sendmsg' type-id='1df08751' visibility='default' filepath='include/net/sock.h' line='1115' column='1'/>
+          <var-decl name='sendmsg' type-id='1df08751' visibility='default' filepath='include/net/sock.h' line='1116' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='recvmsg' type-id='74e71fae' visibility='default' filepath='include/net/sock.h' line='1117' column='1'/>
+          <var-decl name='recvmsg' type-id='74e71fae' visibility='default' filepath='include/net/sock.h' line='1118' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1088'>
-          <var-decl name='sendpage' type-id='65399e23' visibility='default' filepath='include/net/sock.h' line='1120' column='1'/>
+          <var-decl name='sendpage' type-id='65399e23' visibility='default' filepath='include/net/sock.h' line='1121' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1152'>
-          <var-decl name='bind' type-id='c25ed103' visibility='default' filepath='include/net/sock.h' line='1122' column='1'/>
+          <var-decl name='bind' type-id='c25ed103' visibility='default' filepath='include/net/sock.h' line='1123' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1216'>
-          <var-decl name='backlog_rcv' type-id='a0f5247f' visibility='default' filepath='include/net/sock.h' line='1125' column='1'/>
+          <var-decl name='backlog_rcv' type-id='a0f5247f' visibility='default' filepath='include/net/sock.h' line='1126' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1280'>
-          <var-decl name='release_cb' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1128' column='1'/>
+          <var-decl name='release_cb' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1129' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1344'>
-          <var-decl name='hash' type-id='55530c47' visibility='default' filepath='include/net/sock.h' line='1131' column='1'/>
+          <var-decl name='hash' type-id='55530c47' visibility='default' filepath='include/net/sock.h' line='1132' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1408'>
-          <var-decl name='unhash' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1132' column='1'/>
+          <var-decl name='unhash' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1133' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1472'>
-          <var-decl name='rehash' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1133' column='1'/>
+          <var-decl name='rehash' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1134' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1536'>
-          <var-decl name='get_port' type-id='078de3a3' visibility='default' filepath='include/net/sock.h' line='1134' column='1'/>
+          <var-decl name='get_port' type-id='078de3a3' visibility='default' filepath='include/net/sock.h' line='1135' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1600'>
-          <var-decl name='inuse_idx' type-id='f0981eeb' visibility='default' filepath='include/net/sock.h' line='1138' column='1'/>
+          <var-decl name='inuse_idx' type-id='f0981eeb' visibility='default' filepath='include/net/sock.h' line='1139' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1664'>
-          <var-decl name='stream_memory_free' type-id='3d4d3aba' visibility='default' filepath='include/net/sock.h' line='1141' column='1'/>
+          <var-decl name='stream_memory_free' type-id='3d4d3aba' visibility='default' filepath='include/net/sock.h' line='1142' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1728'>
-          <var-decl name='stream_memory_read' type-id='3d4d3aba' visibility='default' filepath='include/net/sock.h' line='1142' column='1'/>
+          <var-decl name='stream_memory_read' type-id='3d4d3aba' visibility='default' filepath='include/net/sock.h' line='1143' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1792'>
-          <var-decl name='enter_memory_pressure' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1144' column='1'/>
+          <var-decl name='enter_memory_pressure' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1145' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1856'>
-          <var-decl name='leave_memory_pressure' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1145' column='1'/>
+          <var-decl name='leave_memory_pressure' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1146' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1920'>
-          <var-decl name='memory_allocated' type-id='5403cb36' visibility='default' filepath='include/net/sock.h' line='1146' column='1'/>
+          <var-decl name='memory_allocated' type-id='5403cb36' visibility='default' filepath='include/net/sock.h' line='1147' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1984'>
-          <var-decl name='sockets_allocated' type-id='84c6078d' visibility='default' filepath='include/net/sock.h' line='1147' column='1'/>
+          <var-decl name='sockets_allocated' type-id='84c6078d' visibility='default' filepath='include/net/sock.h' line='1148' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2048'>
-          <var-decl name='memory_pressure' type-id='1d2c2b85' visibility='default' filepath='include/net/sock.h' line='1154' column='1'/>
+          <var-decl name='memory_pressure' type-id='1d2c2b85' visibility='default' filepath='include/net/sock.h' line='1155' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2112'>
-          <var-decl name='sysctl_mem' type-id='3ccc2590' visibility='default' filepath='include/net/sock.h' line='1155' column='1'/>
+          <var-decl name='sysctl_mem' type-id='3ccc2590' visibility='default' filepath='include/net/sock.h' line='1156' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2176'>
-          <var-decl name='sysctl_wmem' type-id='7292109c' visibility='default' filepath='include/net/sock.h' line='1157' column='1'/>
+          <var-decl name='sysctl_wmem' type-id='7292109c' visibility='default' filepath='include/net/sock.h' line='1158' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2240'>
-          <var-decl name='sysctl_rmem' type-id='7292109c' visibility='default' filepath='include/net/sock.h' line='1158' column='1'/>
+          <var-decl name='sysctl_rmem' type-id='7292109c' visibility='default' filepath='include/net/sock.h' line='1159' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2304'>
-          <var-decl name='sysctl_wmem_offset' type-id='19c2251e' visibility='default' filepath='include/net/sock.h' line='1159' column='1'/>
+          <var-decl name='sysctl_wmem_offset' type-id='19c2251e' visibility='default' filepath='include/net/sock.h' line='1160' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2336'>
-          <var-decl name='sysctl_rmem_offset' type-id='19c2251e' visibility='default' filepath='include/net/sock.h' line='1160' column='1'/>
+          <var-decl name='sysctl_rmem_offset' type-id='19c2251e' visibility='default' filepath='include/net/sock.h' line='1161' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2368'>
-          <var-decl name='max_header' type-id='95e97e5e' visibility='default' filepath='include/net/sock.h' line='1162' column='1'/>
+          <var-decl name='max_header' type-id='95e97e5e' visibility='default' filepath='include/net/sock.h' line='1163' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2400'>
-          <var-decl name='no_autobind' type-id='b50a4934' visibility='default' filepath='include/net/sock.h' line='1163' column='1'/>
+          <var-decl name='no_autobind' type-id='b50a4934' visibility='default' filepath='include/net/sock.h' line='1164' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2432'>
-          <var-decl name='slab' type-id='f3b4aca8' visibility='default' filepath='include/net/sock.h' line='1165' column='1'/>
+          <var-decl name='slab' type-id='f3b4aca8' visibility='default' filepath='include/net/sock.h' line='1166' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2496'>
-          <var-decl name='obj_size' type-id='f0981eeb' visibility='default' filepath='include/net/sock.h' line='1166' column='1'/>
+          <var-decl name='obj_size' type-id='f0981eeb' visibility='default' filepath='include/net/sock.h' line='1167' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2528'>
-          <var-decl name='slab_flags' type-id='f7fe96cb' visibility='default' filepath='include/net/sock.h' line='1167' column='1'/>
+          <var-decl name='slab_flags' type-id='f7fe96cb' visibility='default' filepath='include/net/sock.h' line='1168' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2560'>
-          <var-decl name='useroffset' type-id='f0981eeb' visibility='default' filepath='include/net/sock.h' line='1168' column='1'/>
+          <var-decl name='useroffset' type-id='f0981eeb' visibility='default' filepath='include/net/sock.h' line='1169' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2592'>
-          <var-decl name='usersize' type-id='f0981eeb' visibility='default' filepath='include/net/sock.h' line='1169' column='1'/>
+          <var-decl name='usersize' type-id='f0981eeb' visibility='default' filepath='include/net/sock.h' line='1170' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2624'>
-          <var-decl name='orphan_count' type-id='84c6078d' visibility='default' filepath='include/net/sock.h' line='1171' column='1'/>
+          <var-decl name='orphan_count' type-id='84c6078d' visibility='default' filepath='include/net/sock.h' line='1172' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2688'>
-          <var-decl name='rsk_prot' type-id='db994912' visibility='default' filepath='include/net/sock.h' line='1173' column='1'/>
+          <var-decl name='rsk_prot' type-id='db994912' visibility='default' filepath='include/net/sock.h' line='1174' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2752'>
-          <var-decl name='twsk_prot' type-id='d68ad8b5' visibility='default' filepath='include/net/sock.h' line='1174' column='1'/>
+          <var-decl name='twsk_prot' type-id='d68ad8b5' visibility='default' filepath='include/net/sock.h' line='1175' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2816'>
-          <var-decl name='h' type-id='adf5bf47' visibility='default' filepath='include/net/sock.h' line='1181' column='1'/>
+          <var-decl name='h' type-id='adf5bf47' visibility='default' filepath='include/net/sock.h' line='1182' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2880'>
-          <var-decl name='owner' type-id='2730d015' visibility='default' filepath='include/net/sock.h' line='1183' column='1'/>
+          <var-decl name='owner' type-id='2730d015' visibility='default' filepath='include/net/sock.h' line='1184' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2944'>
-          <var-decl name='name' type-id='16dc656a' visibility='default' filepath='include/net/sock.h' line='1185' column='1'/>
+          <var-decl name='name' type-id='16dc656a' visibility='default' filepath='include/net/sock.h' line='1186' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3200'>
-          <var-decl name='node' type-id='72f469ec' visibility='default' filepath='include/net/sock.h' line='1187' column='1'/>
+          <var-decl name='node' type-id='72f469ec' visibility='default' filepath='include/net/sock.h' line='1188' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3328'>
-          <var-decl name='diag_destroy' type-id='95208a5e' visibility='default' filepath='include/net/sock.h' line='1191' column='1'/>
+          <var-decl name='diag_destroy' type-id='95208a5e' visibility='default' filepath='include/net/sock.h' line='1192' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='rcu_work' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/workqueue.h' line='130' column='1' id='7c0b9fdb'>
@@ -16693,7 +16704,7 @@
           <var-decl name='ipi_list' type-id='72f469ec' visibility='default' filepath='include/linux/blkdev.h' line='180' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__6' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/iocontext.h' line='87' column='1' id='eb20ccf0'>
+      <union-decl name='__anonymous_union__5' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/iocontext.h' line='87' column='1' id='eb20ccf0'>
         <data-member access='public'>
           <var-decl name='ioc_node' type-id='03a4a074' visibility='default' filepath='include/linux/iocontext.h' line='88' column='1'/>
         </data-member>
@@ -16701,18 +16712,18 @@
           <var-decl name='__rcu_head' type-id='e3d8ce29' visibility='default' filepath='include/linux/iocontext.h' line='89' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__33' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='1176' column='1' id='adf5bf47'>
+      <union-decl name='__anonymous_union__35' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='1177' column='1' id='adf5bf47'>
         <data-member access='public'>
-          <var-decl name='hashinfo' type-id='d7a1e3c2' visibility='default' filepath='include/net/sock.h' line='1177' column='1'/>
+          <var-decl name='hashinfo' type-id='d7a1e3c2' visibility='default' filepath='include/net/sock.h' line='1178' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='udp_table' type-id='115daa23' visibility='default' filepath='include/net/sock.h' line='1178' column='1'/>
+          <var-decl name='udp_table' type-id='115daa23' visibility='default' filepath='include/net/sock.h' line='1179' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='raw_hash' type-id='eb2c56dc' visibility='default' filepath='include/net/sock.h' line='1179' column='1'/>
+          <var-decl name='raw_hash' type-id='eb2c56dc' visibility='default' filepath='include/net/sock.h' line='1180' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='smc_hash' type-id='aa8162a3' visibility='default' filepath='include/net/sock.h' line='1180' column='1'/>
+          <var-decl name='smc_hash' type-id='aa8162a3' visibility='default' filepath='include/net/sock.h' line='1181' column='1'/>
         </data-member>
       </union-decl>
       <union-decl name='__anonymous_union__7' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='214' column='1' id='d5d77d48'>
@@ -16747,7 +16758,7 @@
           <var-decl name='serial_node' type-id='2a8a6332' visibility='default' filepath='include/linux/key.h' line='160' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__5' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/iocontext.h' line='83' column='1' id='df248743'>
+      <union-decl name='__anonymous_union__4' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/iocontext.h' line='83' column='1' id='df248743'>
         <data-member access='public'>
           <var-decl name='q_node' type-id='72f469ec' visibility='default' filepath='include/linux/iocontext.h' line='84' column='1'/>
         </data-member>
@@ -22790,7 +22801,7 @@
         <subrange length='64' type-id='7ff19f0f' id='b10be967'/>
       </array-type-def>
       <pointer-type-def type-id='a24978a1' size-in-bits='64' id='72835629'/>
-      <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/perf_event.h' line='517' column='1' id='9aa86c15'>
+      <union-decl name='__anonymous_union__6' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/perf_event.h' line='517' column='1' id='9aa86c15'>
         <data-member access='public'>
           <var-decl name='capabilities' type-id='d3130597' visibility='default' filepath='include/uapi/linux/perf_event.h' line='518' column='1'/>
         </data-member>
@@ -22846,7 +22857,7 @@
           <var-decl name='bydst' type-id='03a4a074' visibility='default' filepath='include/net/xfrm.h' line='140' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__34' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/netdevice.h' line='2026' column='1' id='38feef9e'>
+      <union-decl name='__anonymous_union__36' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/netdevice.h' line='2026' column='1' id='38feef9e'>
         <data-member access='public'>
           <var-decl name='ml_priv' type-id='eaa32e2f' visibility='default' filepath='include/linux/netdevice.h' line='2027' column='1'/>
         </data-member>
@@ -25040,7 +25051,7 @@
           <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__31' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/ip.h' line='126' column='1' id='4fa91678'>
+      <union-decl name='__anonymous_union__33' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/ip.h' line='126' column='1' id='4fa91678'>
         <data-member access='public'>
           <var-decl name='destructor' type-id='841969d0' visibility='default' filepath='include/net/ip.h' line='127' column='1'/>
         </data-member>
@@ -28600,7 +28611,7 @@
           <var-decl name='flr' type-id='a70ae6be' visibility='default' filepath='include/linux/pm_qos.h' line='85' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__33' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/net/sch_generic.h' line='50' column='1' id='c7c27b50'>
+      <union-decl name='__anonymous_union__35' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/net/sch_generic.h' line='50' column='1' id='c7c27b50'>
         <data-member access='public'>
           <var-decl name='qlen' type-id='19c2251e' visibility='default' filepath='include/net/sch_generic.h' line='51' column='1'/>
         </data-member>
@@ -30967,7 +30978,7 @@
           <var-decl name='key' type-id='29c3368c' visibility='default' filepath='include/net/neighbour.h' line='175' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__29' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/sch_generic.h' line='346' column='1' id='894533b3'>
+      <class-decl name='__anonymous_struct__30' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/sch_generic.h' line='346' column='1' id='894533b3'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='chain' type-id='45305972' visibility='default' filepath='include/net/sch_generic.h' line='347' column='1'/>
         </data-member>
@@ -31358,15 +31369,6 @@
         <return type-id='48b5725f'/>
       </function-decl>
     </abi-instr>
-    <abi-instr address-size='64' path='arch/arm64/kernel/cacheinfo.c' language='LANG_C89'>
-      <function-decl name='smp_call_function_single' mangled-name='smp_call_function_single' filepath='include/linux/smp.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='smp_call_function_single'>
-        <parameter type-id='95e97e5e'/>
-        <parameter type-id='b7f9d8e6'/>
-        <parameter type-id='eaa32e2f'/>
-        <parameter type-id='95e97e5e'/>
-        <return type-id='95e97e5e'/>
-      </function-decl>
-    </abi-instr>
     <abi-instr address-size='64' path='arch/arm64/kernel/cpu_ops.c' language='LANG_C89'>
       <function-decl name='of_get_cpu_node' mangled-name='of_get_cpu_node' filepath='include/linux/of.h' line='360' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_get_cpu_node'>
         <parameter type-id='95e97e5e'/>
@@ -73068,7 +73070,7 @@
       <array-type-def dimensions='1' type-id='fa0b179b' size-in-bits='512' id='f6e5abef'>
         <subrange length='8' type-id='7ff19f0f' id='56e0c0b1'/>
       </array-type-def>
-      <union-decl name='__anonymous_union__6' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/videobuf2-core.h' line='179' column='1' id='07aa0de4'>
+      <union-decl name='__anonymous_union__9' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/videobuf2-core.h' line='179' column='1' id='07aa0de4'>
         <data-member access='public'>
           <var-decl name='offset' type-id='f0981eeb' visibility='default' filepath='include/media/videobuf2-core.h' line='180' column='1'/>
         </data-member>
@@ -74544,7 +74546,7 @@
           <var-decl name='p' type-id='eaa32e2f' visibility='default' filepath='include/media/v4l2-ctrls.h' line='52' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__5' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='227' column='1' id='87415f3a'>
+      <union-decl name='__anonymous_union__8' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='227' column='1' id='87415f3a'>
         <data-member access='public'>
           <var-decl name='qmenu' type-id='13956559' visibility='default' filepath='include/media/v4l2-ctrls.h' line='228' column='1'/>
         </data-member>
@@ -74552,7 +74554,7 @@
           <var-decl name='qmenu_int' type-id='43ae54cf' visibility='default' filepath='include/media/v4l2-ctrls.h' line='229' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__4' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='223' column='1' id='b91b9370'>
+      <union-decl name='__anonymous_union__7' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='223' column='1' id='b91b9370'>
         <data-member access='public'>
           <var-decl name='step' type-id='91ce1af9' visibility='default' filepath='include/media/v4l2-ctrls.h' line='224' column='1'/>
         </data-member>
@@ -78644,7 +78646,7 @@
         <parameter type-id='6ec0fd31'/>
         <return type-id='48b5725f'/>
       </function-type>
-      <union-decl name='__anonymous_union__8' size-in-bits='512' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2249' column='1' id='454ee2bf'>
+      <union-decl name='__anonymous_union__10' size-in-bits='512' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2249' column='1' id='454ee2bf'>
         <data-member access='public'>
           <var-decl name='vsync' type-id='cbe6daf0' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2250' column='1'/>
         </data-member>
@@ -78720,7 +78722,7 @@
           <var-decl name='field' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2200' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__9' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2211' column='1' id='de5442d3'>
+      <union-decl name='__anonymous_union__11' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2211' column='1' id='de5442d3'>
         <data-member access='public'>
           <var-decl name='value' type-id='3158a266' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2212' column='1'/>
         </data-member>
@@ -79012,7 +79014,7 @@
         <enumerator name='V4L2_CTRL_TYPE_U16' value='257'/>
         <enumerator name='V4L2_CTRL_TYPE_U32' value='258'/>
       </enum-decl>
-      <union-decl name='__anonymous_union__4' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='223' column='1' id='b91b9370'>
+      <union-decl name='__anonymous_union__7' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='223' column='1' id='b91b9370'>
         <data-member access='public'>
           <var-decl name='step' type-id='91ce1af9' visibility='default' filepath='include/media/v4l2-ctrls.h' line='224' column='1'/>
         </data-member>
@@ -79020,7 +79022,7 @@
           <var-decl name='menu_skip_mask' type-id='91ce1af9' visibility='default' filepath='include/media/v4l2-ctrls.h' line='225' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__5' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='227' column='1' id='87415f3a'>
+      <union-decl name='__anonymous_union__8' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='227' column='1' id='87415f3a'>
         <data-member access='public'>
           <var-decl name='qmenu' type-id='13956559' visibility='default' filepath='include/media/v4l2-ctrls.h' line='228' column='1'/>
         </data-member>
@@ -79135,7 +79137,7 @@
           <var-decl name='data_offset' type-id='f0981eeb' visibility='default' filepath='include/media/videobuf2-core.h' line='184' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__6' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/videobuf2-core.h' line='179' column='1' id='07aa0de4'>
+      <union-decl name='__anonymous_union__9' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/videobuf2-core.h' line='179' column='1' id='07aa0de4'>
         <data-member access='public'>
           <var-decl name='offset' type-id='f0981eeb' visibility='default' filepath='include/media/videobuf2-core.h' line='180' column='1'/>
         </data-member>
@@ -79247,7 +79249,7 @@
           <var-decl name='reserved' type-id='7f84eb57' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2261' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__8' size-in-bits='512' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2249' column='1' id='454ee2bf'>
+      <union-decl name='__anonymous_union__10' size-in-bits='512' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2249' column='1' id='454ee2bf'>
         <data-member access='public'>
           <var-decl name='vsync' type-id='cbe6daf0' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2250' column='1'/>
         </data-member>
@@ -79298,7 +79300,7 @@
           <var-decl name='default_value' type-id='3158a266' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2219' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__9' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2211' column='1' id='de5442d3'>
+      <union-decl name='__anonymous_union__11' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2211' column='1' id='de5442d3'>
         <data-member access='public'>
           <var-decl name='value' type-id='3158a266' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2212' column='1'/>
         </data-member>
@@ -80231,7 +80233,7 @@
       <pointer-type-def type-id='d9fc42c3' size-in-bits='64' id='96b07343'/>
       <pointer-type-def type-id='6aebc4a7' size-in-bits='64' id='c8f5869f'/>
       <pointer-type-def type-id='e61c85d0' size-in-bits='64' id='03c386c6'/>
-      <function-decl name='proto_unregister' mangled-name='proto_unregister' filepath='include/net/sock.h' line='1195' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='proto_unregister'>
+      <function-decl name='proto_unregister' mangled-name='proto_unregister' filepath='include/net/sock.h' line='1196' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='proto_unregister'>
         <parameter type-id='d2524501'/>
         <return type-id='48b5725f'/>
       </function-decl>
@@ -80243,12 +80245,12 @@
         <parameter type-id='96b07343'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='proto_register' mangled-name='proto_register' filepath='include/net/sock.h' line='1194' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='proto_register'>
+      <function-decl name='proto_register' mangled-name='proto_register' filepath='include/net/sock.h' line='1195' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='proto_register'>
         <parameter type-id='d2524501'/>
         <parameter type-id='95e97e5e'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sk_alloc' mangled-name='sk_alloc' filepath='include/net/sock.h' line='1590' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sk_alloc'>
+      <function-decl name='sk_alloc' mangled-name='sk_alloc' filepath='include/net/sock.h' line='1591' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sk_alloc'>
         <parameter type-id='a2bff676'/>
         <parameter type-id='95e97e5e'/>
         <parameter type-id='f0981eeb'/>
@@ -80256,12 +80258,12 @@
         <parameter type-id='95e97e5e'/>
         <return type-id='f772df6d'/>
       </function-decl>
-      <function-decl name='sock_init_data' mangled-name='sock_init_data' filepath='include/net/sock.h' line='1690' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_init_data'>
+      <function-decl name='sock_init_data' mangled-name='sock_init_data' filepath='include/net/sock.h' line='1691' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_init_data'>
         <parameter type-id='13103032'/>
         <parameter type-id='f772df6d'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='sock_queue_rcv_skb' mangled-name='sock_queue_rcv_skb' filepath='include/net/sock.h' line='2155' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_queue_rcv_skb'>
+      <function-decl name='sock_queue_rcv_skb' mangled-name='sock_queue_rcv_skb' filepath='include/net/sock.h' line='2156' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_queue_rcv_skb'>
         <parameter type-id='f772df6d'/>
         <parameter type-id='0fbf3cfd'/>
         <return type-id='95e97e5e'/>
@@ -80275,7 +80277,7 @@
         <parameter type-id='03c386c6'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='lock_sock_nested' mangled-name='lock_sock_nested' filepath='include/net/sock.h' line='1516' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lock_sock_nested'>
+      <function-decl name='lock_sock_nested' mangled-name='lock_sock_nested' filepath='include/net/sock.h' line='1517' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lock_sock_nested'>
         <parameter type-id='f772df6d'/>
         <parameter type-id='95e97e5e'/>
         <return type-id='48b5725f'/>
@@ -80291,11 +80293,11 @@
         <parameter type-id='8567d8b0'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='release_sock' mangled-name='release_sock' filepath='include/net/sock.h' line='1524' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='release_sock'>
+      <function-decl name='release_sock' mangled-name='release_sock' filepath='include/net/sock.h' line='1525' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='release_sock'>
         <parameter type-id='f772df6d'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='sk_free' mangled-name='sk_free' filepath='include/net/sock.h' line='1592' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sk_free'>
+      <function-decl name='sk_free' mangled-name='sk_free' filepath='include/net/sock.h' line='1593' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sk_free'>
         <parameter type-id='f772df6d'/>
         <return type-id='48b5725f'/>
       </function-decl>
@@ -80311,12 +80313,12 @@
         <parameter type-id='78e7cf52'/>
         <return type-id='c8f5869f'/>
       </function-decl>
-      <function-decl name='sk_setup_caps' mangled-name='sk_setup_caps' filepath='include/net/sock.h' line='1959' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sk_setup_caps'>
+      <function-decl name='sk_setup_caps' mangled-name='sk_setup_caps' filepath='include/net/sock.h' line='1960' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sk_setup_caps'>
         <parameter type-id='f772df6d'/>
         <parameter type-id='141b6427'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='skb_set_owner_w' mangled-name='skb_set_owner_w' filepath='include/net/sock.h' line='2126' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_set_owner_w'>
+      <function-decl name='skb_set_owner_w' mangled-name='skb_set_owner_w' filepath='include/net/sock.h' line='2127' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_set_owner_w'>
         <parameter type-id='0fbf3cfd'/>
         <parameter type-id='f772df6d'/>
         <return type-id='48b5725f'/>
@@ -80945,165 +80947,165 @@
           <var-decl name='skc_portaddr_node' type-id='03a4a074' visibility='default' filepath='include/net/sock.h' line='186' column='1'/>
         </data-member>
       </union-decl>
-      <class-decl name='proto' size-in-bits='3392' is-struct='yes' visibility='default' filepath='include/net/sock.h' line='1077' column='1' id='7203ee09'>
+      <class-decl name='proto' size-in-bits='3392' is-struct='yes' visibility='default' filepath='include/net/sock.h' line='1078' column='1' id='7203ee09'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='close' type-id='09f3a86b' visibility='default' filepath='include/net/sock.h' line='1078' column='1'/>
+          <var-decl name='close' type-id='09f3a86b' visibility='default' filepath='include/net/sock.h' line='1079' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='pre_connect' type-id='c25ed103' visibility='default' filepath='include/net/sock.h' line='1080' column='1'/>
+          <var-decl name='pre_connect' type-id='c25ed103' visibility='default' filepath='include/net/sock.h' line='1081' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='connect' type-id='c25ed103' visibility='default' filepath='include/net/sock.h' line='1083' column='1'/>
+          <var-decl name='connect' type-id='c25ed103' visibility='default' filepath='include/net/sock.h' line='1084' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='disconnect' type-id='95208a5e' visibility='default' filepath='include/net/sock.h' line='1086' column='1'/>
+          <var-decl name='disconnect' type-id='95208a5e' visibility='default' filepath='include/net/sock.h' line='1087' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='accept' type-id='67adf9a9' visibility='default' filepath='include/net/sock.h' line='1088' column='1'/>
+          <var-decl name='accept' type-id='67adf9a9' visibility='default' filepath='include/net/sock.h' line='1089' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='ioctl' type-id='08113f0a' visibility='default' filepath='include/net/sock.h' line='1091' column='1'/>
+          <var-decl name='ioctl' type-id='08113f0a' visibility='default' filepath='include/net/sock.h' line='1092' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='init' type-id='55530c47' visibility='default' filepath='include/net/sock.h' line='1093' column='1'/>
+          <var-decl name='init' type-id='55530c47' visibility='default' filepath='include/net/sock.h' line='1094' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='destroy' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1094' column='1'/>
+          <var-decl name='destroy' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1095' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='shutdown' type-id='e937debf' visibility='default' filepath='include/net/sock.h' line='1095' column='1'/>
+          <var-decl name='shutdown' type-id='e937debf' visibility='default' filepath='include/net/sock.h' line='1096' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='setsockopt' type-id='bc1bf185' visibility='default' filepath='include/net/sock.h' line='1096' column='1'/>
+          <var-decl name='setsockopt' type-id='bc1bf185' visibility='default' filepath='include/net/sock.h' line='1097' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='640'>
-          <var-decl name='getsockopt' type-id='e0fadd76' visibility='default' filepath='include/net/sock.h' line='1099' column='1'/>
+          <var-decl name='getsockopt' type-id='e0fadd76' visibility='default' filepath='include/net/sock.h' line='1100' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='keepalive' type-id='e937debf' visibility='default' filepath='include/net/sock.h' line='1102' column='1'/>
+          <var-decl name='keepalive' type-id='e937debf' visibility='default' filepath='include/net/sock.h' line='1103' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='768'>
-          <var-decl name='compat_setsockopt' type-id='bc1bf185' visibility='default' filepath='include/net/sock.h' line='1104' column='1'/>
+          <var-decl name='compat_setsockopt' type-id='bc1bf185' visibility='default' filepath='include/net/sock.h' line='1105' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='compat_getsockopt' type-id='e0fadd76' visibility='default' filepath='include/net/sock.h' line='1108' column='1'/>
+          <var-decl name='compat_getsockopt' type-id='e0fadd76' visibility='default' filepath='include/net/sock.h' line='1109' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='896'>
-          <var-decl name='compat_ioctl' type-id='20da830b' visibility='default' filepath='include/net/sock.h' line='1112' column='1'/>
+          <var-decl name='compat_ioctl' type-id='20da830b' visibility='default' filepath='include/net/sock.h' line='1113' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='960'>
-          <var-decl name='sendmsg' type-id='1df08751' visibility='default' filepath='include/net/sock.h' line='1115' column='1'/>
+          <var-decl name='sendmsg' type-id='1df08751' visibility='default' filepath='include/net/sock.h' line='1116' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='recvmsg' type-id='74e71fae' visibility='default' filepath='include/net/sock.h' line='1117' column='1'/>
+          <var-decl name='recvmsg' type-id='74e71fae' visibility='default' filepath='include/net/sock.h' line='1118' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1088'>
-          <var-decl name='sendpage' type-id='65399e23' visibility='default' filepath='include/net/sock.h' line='1120' column='1'/>
+          <var-decl name='sendpage' type-id='65399e23' visibility='default' filepath='include/net/sock.h' line='1121' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1152'>
-          <var-decl name='bind' type-id='c25ed103' visibility='default' filepath='include/net/sock.h' line='1122' column='1'/>
+          <var-decl name='bind' type-id='c25ed103' visibility='default' filepath='include/net/sock.h' line='1123' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1216'>
-          <var-decl name='backlog_rcv' type-id='a0f5247f' visibility='default' filepath='include/net/sock.h' line='1125' column='1'/>
+          <var-decl name='backlog_rcv' type-id='a0f5247f' visibility='default' filepath='include/net/sock.h' line='1126' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1280'>
-          <var-decl name='release_cb' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1128' column='1'/>
+          <var-decl name='release_cb' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1129' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1344'>
-          <var-decl name='hash' type-id='55530c47' visibility='default' filepath='include/net/sock.h' line='1131' column='1'/>
+          <var-decl name='hash' type-id='55530c47' visibility='default' filepath='include/net/sock.h' line='1132' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1408'>
-          <var-decl name='unhash' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1132' column='1'/>
+          <var-decl name='unhash' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1133' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1472'>
-          <var-decl name='rehash' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1133' column='1'/>
+          <var-decl name='rehash' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1134' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1536'>
-          <var-decl name='get_port' type-id='078de3a3' visibility='default' filepath='include/net/sock.h' line='1134' column='1'/>
+          <var-decl name='get_port' type-id='078de3a3' visibility='default' filepath='include/net/sock.h' line='1135' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1600'>
-          <var-decl name='inuse_idx' type-id='f0981eeb' visibility='default' filepath='include/net/sock.h' line='1138' column='1'/>
+          <var-decl name='inuse_idx' type-id='f0981eeb' visibility='default' filepath='include/net/sock.h' line='1139' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1664'>
-          <var-decl name='stream_memory_free' type-id='3d4d3aba' visibility='default' filepath='include/net/sock.h' line='1141' column='1'/>
+          <var-decl name='stream_memory_free' type-id='3d4d3aba' visibility='default' filepath='include/net/sock.h' line='1142' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1728'>
-          <var-decl name='stream_memory_read' type-id='3d4d3aba' visibility='default' filepath='include/net/sock.h' line='1142' column='1'/>
+          <var-decl name='stream_memory_read' type-id='3d4d3aba' visibility='default' filepath='include/net/sock.h' line='1143' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1792'>
-          <var-decl name='enter_memory_pressure' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1144' column='1'/>
+          <var-decl name='enter_memory_pressure' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1145' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1856'>
-          <var-decl name='leave_memory_pressure' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1145' column='1'/>
+          <var-decl name='leave_memory_pressure' type-id='841969d0' visibility='default' filepath='include/net/sock.h' line='1146' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1920'>
-          <var-decl name='memory_allocated' type-id='5403cb36' visibility='default' filepath='include/net/sock.h' line='1146' column='1'/>
+          <var-decl name='memory_allocated' type-id='5403cb36' visibility='default' filepath='include/net/sock.h' line='1147' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1984'>
-          <var-decl name='sockets_allocated' type-id='84c6078d' visibility='default' filepath='include/net/sock.h' line='1147' column='1'/>
+          <var-decl name='sockets_allocated' type-id='84c6078d' visibility='default' filepath='include/net/sock.h' line='1148' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2048'>
-          <var-decl name='memory_pressure' type-id='1d2c2b85' visibility='default' filepath='include/net/sock.h' line='1154' column='1'/>
+          <var-decl name='memory_pressure' type-id='1d2c2b85' visibility='default' filepath='include/net/sock.h' line='1155' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2112'>
-          <var-decl name='sysctl_mem' type-id='3ccc2590' visibility='default' filepath='include/net/sock.h' line='1155' column='1'/>
+          <var-decl name='sysctl_mem' type-id='3ccc2590' visibility='default' filepath='include/net/sock.h' line='1156' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2176'>
-          <var-decl name='sysctl_wmem' type-id='7292109c' visibility='default' filepath='include/net/sock.h' line='1157' column='1'/>
+          <var-decl name='sysctl_wmem' type-id='7292109c' visibility='default' filepath='include/net/sock.h' line='1158' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2240'>
-          <var-decl name='sysctl_rmem' type-id='7292109c' visibility='default' filepath='include/net/sock.h' line='1158' column='1'/>
+          <var-decl name='sysctl_rmem' type-id='7292109c' visibility='default' filepath='include/net/sock.h' line='1159' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2304'>
-          <var-decl name='sysctl_wmem_offset' type-id='19c2251e' visibility='default' filepath='include/net/sock.h' line='1159' column='1'/>
+          <var-decl name='sysctl_wmem_offset' type-id='19c2251e' visibility='default' filepath='include/net/sock.h' line='1160' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2336'>
-          <var-decl name='sysctl_rmem_offset' type-id='19c2251e' visibility='default' filepath='include/net/sock.h' line='1160' column='1'/>
+          <var-decl name='sysctl_rmem_offset' type-id='19c2251e' visibility='default' filepath='include/net/sock.h' line='1161' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2368'>
-          <var-decl name='max_header' type-id='95e97e5e' visibility='default' filepath='include/net/sock.h' line='1162' column='1'/>
+          <var-decl name='max_header' type-id='95e97e5e' visibility='default' filepath='include/net/sock.h' line='1163' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2400'>
-          <var-decl name='no_autobind' type-id='b50a4934' visibility='default' filepath='include/net/sock.h' line='1163' column='1'/>
+          <var-decl name='no_autobind' type-id='b50a4934' visibility='default' filepath='include/net/sock.h' line='1164' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2432'>
-          <var-decl name='slab' type-id='f3b4aca8' visibility='default' filepath='include/net/sock.h' line='1165' column='1'/>
+          <var-decl name='slab' type-id='f3b4aca8' visibility='default' filepath='include/net/sock.h' line='1166' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2496'>
-          <var-decl name='obj_size' type-id='f0981eeb' visibility='default' filepath='include/net/sock.h' line='1166' column='1'/>
+          <var-decl name='obj_size' type-id='f0981eeb' visibility='default' filepath='include/net/sock.h' line='1167' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2528'>
-          <var-decl name='slab_flags' type-id='f7fe96cb' visibility='default' filepath='include/net/sock.h' line='1167' column='1'/>
+          <var-decl name='slab_flags' type-id='f7fe96cb' visibility='default' filepath='include/net/sock.h' line='1168' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2560'>
-          <var-decl name='useroffset' type-id='f0981eeb' visibility='default' filepath='include/net/sock.h' line='1168' column='1'/>
+          <var-decl name='useroffset' type-id='f0981eeb' visibility='default' filepath='include/net/sock.h' line='1169' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2592'>
-          <var-decl name='usersize' type-id='f0981eeb' visibility='default' filepath='include/net/sock.h' line='1169' column='1'/>
+          <var-decl name='usersize' type-id='f0981eeb' visibility='default' filepath='include/net/sock.h' line='1170' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2624'>
-          <var-decl name='orphan_count' type-id='84c6078d' visibility='default' filepath='include/net/sock.h' line='1171' column='1'/>
+          <var-decl name='orphan_count' type-id='84c6078d' visibility='default' filepath='include/net/sock.h' line='1172' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2688'>
-          <var-decl name='rsk_prot' type-id='db994912' visibility='default' filepath='include/net/sock.h' line='1173' column='1'/>
+          <var-decl name='rsk_prot' type-id='db994912' visibility='default' filepath='include/net/sock.h' line='1174' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2752'>
-          <var-decl name='twsk_prot' type-id='d68ad8b5' visibility='default' filepath='include/net/sock.h' line='1174' column='1'/>
+          <var-decl name='twsk_prot' type-id='d68ad8b5' visibility='default' filepath='include/net/sock.h' line='1175' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2816'>
-          <var-decl name='h' type-id='adf5bf47' visibility='default' filepath='include/net/sock.h' line='1181' column='1'/>
+          <var-decl name='h' type-id='adf5bf47' visibility='default' filepath='include/net/sock.h' line='1182' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2880'>
-          <var-decl name='owner' type-id='2730d015' visibility='default' filepath='include/net/sock.h' line='1183' column='1'/>
+          <var-decl name='owner' type-id='2730d015' visibility='default' filepath='include/net/sock.h' line='1184' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2944'>
-          <var-decl name='name' type-id='16dc656a' visibility='default' filepath='include/net/sock.h' line='1185' column='1'/>
+          <var-decl name='name' type-id='16dc656a' visibility='default' filepath='include/net/sock.h' line='1186' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3200'>
-          <var-decl name='node' type-id='72f469ec' visibility='default' filepath='include/net/sock.h' line='1187' column='1'/>
+          <var-decl name='node' type-id='72f469ec' visibility='default' filepath='include/net/sock.h' line='1188' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3328'>
-          <var-decl name='diag_destroy' type-id='95208a5e' visibility='default' filepath='include/net/sock.h' line='1191' column='1'/>
+          <var-decl name='diag_destroy' type-id='95208a5e' visibility='default' filepath='include/net/sock.h' line='1192' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='msghdr' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/socket.h' line='48' column='1' id='ab94745c'>
@@ -82084,18 +82086,18 @@
           <var-decl name='twsk_destructor' type-id='841969d0' visibility='default' filepath='include/net/timewait_sock.h' line='24' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__17' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='1176' column='1' id='adf5bf47'>
+      <union-decl name='__anonymous_union__17' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='1177' column='1' id='adf5bf47'>
         <data-member access='public'>
-          <var-decl name='hashinfo' type-id='d7a1e3c2' visibility='default' filepath='include/net/sock.h' line='1177' column='1'/>
+          <var-decl name='hashinfo' type-id='d7a1e3c2' visibility='default' filepath='include/net/sock.h' line='1178' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='udp_table' type-id='115daa23' visibility='default' filepath='include/net/sock.h' line='1178' column='1'/>
+          <var-decl name='udp_table' type-id='115daa23' visibility='default' filepath='include/net/sock.h' line='1179' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='raw_hash' type-id='eb2c56dc' visibility='default' filepath='include/net/sock.h' line='1179' column='1'/>
+          <var-decl name='raw_hash' type-id='eb2c56dc' visibility='default' filepath='include/net/sock.h' line='1180' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='smc_hash' type-id='aa8162a3' visibility='default' filepath='include/net/sock.h' line='1180' column='1'/>
+          <var-decl name='smc_hash' type-id='aa8162a3' visibility='default' filepath='include/net/sock.h' line='1181' column='1'/>
         </data-member>
       </union-decl>
       <class-decl name='smc_hashinfo' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/net/smc.h' line='16' column='1' id='adb1d973'>
@@ -83152,7 +83154,18 @@
           <var-decl name='classid' type-id='19c2251e' visibility='default' filepath='include/linux/cgroup-defs.h' line='808' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__31' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/ip.h' line='126' column='1' id='4fa91678'>
+      <union-decl name='__anonymous_union__31' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='515' column='1' id='b3414a3c'>
+        <data-member access='public'>
+          <var-decl name='sk_peer_lock' type-id='fb4018a0' visibility='default' filepath='include/net/sock.h' line='515' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='' type-id='156952c4' visibility='default' filepath='include/net/sock.h' line='515' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/net/sock.h' line='515' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__33' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/ip.h' line='126' column='1' id='4fa91678'>
         <data-member access='public'>
           <var-decl name='destructor' type-id='841969d0' visibility='default' filepath='include/net/ip.h' line='127' column='1'/>
         </data-member>
@@ -83603,7 +83616,7 @@
           <var-decl name='' type-id='e686dd16' visibility='default' filepath='include/net/sch_generic.h' line='235' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__32' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/net/sch_generic.h' line='235' column='1' id='e686dd16'>
+      <union-decl name='__anonymous_union__34' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/net/sch_generic.h' line='235' column='1' id='e686dd16'>
         <data-member access='public'>
           <var-decl name='' type-id='a2699296' visibility='default' filepath='include/net/sch_generic.h' line='236' column='1'/>
         </data-member>
@@ -83614,7 +83627,7 @@
           <var-decl name='' type-id='c2617f12' visibility='default' filepath='include/net/sch_generic.h' line='243' column='1'/>
         </data-member>
       </union-decl>
-      <class-decl name='__anonymous_struct__27' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/sch_generic.h' line='236' column='1' id='a2699296'>
+      <class-decl name='__anonymous_struct__28' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/sch_generic.h' line='236' column='1' id='a2699296'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='class' type-id='7359adad' visibility='default' filepath='include/net/sch_generic.h' line='237' column='1'/>
         </data-member>
@@ -83622,7 +83635,7 @@
           <var-decl name='classid' type-id='19c2251e' visibility='default' filepath='include/net/sch_generic.h' line='238' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__28' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/sch_generic.h' line='243' column='1' id='c2617f12'>
+      <class-decl name='__anonymous_struct__29' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/sch_generic.h' line='243' column='1' id='c2617f12'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='ingress' type-id='b50a4934' visibility='default' filepath='include/net/sch_generic.h' line='244' column='1'/>
         </data-member>
@@ -84019,7 +84032,7 @@
           <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='include/net/sch_generic.h' line='54' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__33' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/net/sch_generic.h' line='50' column='1' id='c7c27b50'>
+      <union-decl name='__anonymous_union__35' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/net/sch_generic.h' line='50' column='1' id='c7c27b50'>
         <data-member access='public'>
           <var-decl name='qlen' type-id='19c2251e' visibility='default' filepath='include/net/sch_generic.h' line='51' column='1'/>
         </data-member>
@@ -84027,7 +84040,7 @@
           <var-decl name='atomic_qlen' type-id='49178f86' visibility='default' filepath='include/net/sch_generic.h' line='52' column='1'/>
         </data-member>
       </union-decl>
-      <class-decl name='__anonymous_struct__29' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/sch_generic.h' line='346' column='1' id='894533b3'>
+      <class-decl name='__anonymous_struct__30' size-in-bits='192' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/net/sch_generic.h' line='346' column='1' id='894533b3'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='chain' type-id='45305972' visibility='default' filepath='include/net/sch_generic.h' line='347' column='1'/>
         </data-member>
@@ -93699,19 +93712,19 @@
         <parameter type-id='2feec21f'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='thermal_of_cooling_device_register' mangled-name='thermal_of_cooling_device_register' filepath='drivers/thermal/thermal_core.c' line='1073' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='thermal_of_cooling_device_register'>
-        <parameter type-id='9a537bbe' name='np' filepath='drivers/thermal/thermal_core.c' line='1073' column='1'/>
-        <parameter type-id='80f4b756' name='type' filepath='drivers/thermal/thermal_core.c' line='1074' column='1'/>
-        <parameter type-id='eaa32e2f' name='devdata' filepath='drivers/thermal/thermal_core.c' line='1074' column='1'/>
-        <parameter type-id='6f4dc085' name='ops' filepath='drivers/thermal/thermal_core.c' line='1075' column='1'/>
+      <function-decl name='thermal_of_cooling_device_register' mangled-name='thermal_of_cooling_device_register' filepath='drivers/thermal/thermal_core.c' line='1072' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='thermal_of_cooling_device_register'>
+        <parameter type-id='9a537bbe' name='np' filepath='drivers/thermal/thermal_core.c' line='1072' column='1'/>
+        <parameter type-id='80f4b756' name='type' filepath='drivers/thermal/thermal_core.c' line='1073' column='1'/>
+        <parameter type-id='eaa32e2f' name='devdata' filepath='drivers/thermal/thermal_core.c' line='1073' column='1'/>
+        <parameter type-id='6f4dc085' name='ops' filepath='drivers/thermal/thermal_core.c' line='1074' column='1'/>
         <return type-id='2feec21f'/>
       </function-decl>
-      <function-decl name='thermal_zone_get_zone_by_name' mangled-name='thermal_zone_get_zone_by_name' filepath='drivers/thermal/thermal_core.c' line='1406' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='thermal_zone_get_zone_by_name'>
-        <parameter type-id='80f4b756' name='name' filepath='drivers/thermal/thermal_core.c' line='1406' column='1'/>
+      <function-decl name='thermal_zone_get_zone_by_name' mangled-name='thermal_zone_get_zone_by_name' filepath='drivers/thermal/thermal_core.c' line='1405' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='thermal_zone_get_zone_by_name'>
+        <parameter type-id='80f4b756' name='name' filepath='drivers/thermal/thermal_core.c' line='1405' column='1'/>
         <return type-id='404b1300'/>
       </function-decl>
-      <function-decl name='thermal_zone_get_cdev_by_name' mangled-name='thermal_zone_get_cdev_by_name' filepath='drivers/thermal/thermal_core.c' line='1445' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='thermal_zone_get_cdev_by_name'>
-        <parameter type-id='80f4b756' name='name' filepath='drivers/thermal/thermal_core.c' line='1445' column='1'/>
+      <function-decl name='thermal_zone_get_cdev_by_name' mangled-name='thermal_zone_get_cdev_by_name' filepath='drivers/thermal/thermal_core.c' line='1444' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='thermal_zone_get_cdev_by_name'>
+        <parameter type-id='80f4b756' name='name' filepath='drivers/thermal/thermal_core.c' line='1444' column='1'/>
         <return type-id='2feec21f'/>
       </function-decl>
     </abi-instr>
@@ -109147,6 +109160,13 @@
         <parameter type-id='f23e2572'/>
         <return type-id='48b5725f'/>
       </function-decl>
+      <function-decl name='smp_call_function_single' mangled-name='smp_call_function_single' filepath='include/linux/smp.h' line='32' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='smp_call_function_single'>
+        <parameter type-id='95e97e5e'/>
+        <parameter type-id='b7f9d8e6'/>
+        <parameter type-id='eaa32e2f'/>
+        <parameter type-id='95e97e5e'/>
+        <return type-id='95e97e5e'/>
+      </function-decl>
       <function-decl name='blocking_notifier_chain_register' mangled-name='blocking_notifier_chain_register' filepath='include/linux/notifier.h' line='146' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blocking_notifier_chain_register'>
         <parameter type-id='282b7312'/>
         <parameter type-id='d504f73d'/>
@@ -109351,7 +109371,7 @@
           <var-decl name='aux_size' type-id='d3130597' visibility='default' filepath='include/uapi/linux/perf_event.h' line='628' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/perf_event.h' line='517' column='1' id='9aa86c15'>
+      <union-decl name='__anonymous_union__6' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/perf_event.h' line='517' column='1' id='9aa86c15'>
         <data-member access='public'>
           <var-decl name='capabilities' type-id='d3130597' visibility='default' filepath='include/uapi/linux/perf_event.h' line='518' column='1'/>
         </data-member>
@@ -128118,8 +128138,8 @@
       <function-decl name='net_enable_timestamp' mangled-name='net_enable_timestamp' filepath='include/linux/netdevice.h' line='4382' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='net_enable_timestamp'>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='sock_wfree' mangled-name='sock_wfree' filepath='net/core/sock.c' line='1806' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_wfree'>
-        <parameter type-id='0fbf3cfd' name='skb' filepath='net/core/sock.c' line='1806' column='1'/>
+      <function-decl name='sock_wfree' mangled-name='sock_wfree' filepath='net/core/sock.c' line='1824' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_wfree'>
+        <parameter type-id='0fbf3cfd' name='skb' filepath='net/core/sock.c' line='1824' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
       <function-decl name='alloc_skb_with_frags' mangled-name='alloc_skb_with_frags' filepath='include/linux/skbuff.h' line='998' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='alloc_skb_with_frags'>
@@ -128130,124 +128150,124 @@
         <parameter type-id='f0981eeb'/>
         <return type-id='0fbf3cfd'/>
       </function-decl>
-      <function-decl name='sock_alloc_send_skb' mangled-name='sock_alloc_send_skb' filepath='net/core/sock.c' line='2104' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_alloc_send_skb'>
-        <parameter type-id='f772df6d' name='sk' filepath='net/core/sock.c' line='2104' column='1'/>
-        <parameter type-id='7359adad' name='size' filepath='net/core/sock.c' line='2104' column='1'/>
-        <parameter type-id='95e97e5e' name='noblock' filepath='net/core/sock.c' line='2105' column='1'/>
-        <parameter type-id='7292109c' name='errcode' filepath='net/core/sock.c' line='2105' column='1'/>
+      <function-decl name='sock_alloc_send_skb' mangled-name='sock_alloc_send_skb' filepath='net/core/sock.c' line='2122' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_alloc_send_skb'>
+        <parameter type-id='f772df6d' name='sk' filepath='net/core/sock.c' line='2122' column='1'/>
+        <parameter type-id='7359adad' name='size' filepath='net/core/sock.c' line='2122' column='1'/>
+        <parameter type-id='95e97e5e' name='noblock' filepath='net/core/sock.c' line='2123' column='1'/>
+        <parameter type-id='7292109c' name='errcode' filepath='net/core/sock.c' line='2123' column='1'/>
         <return type-id='0fbf3cfd'/>
       </function-decl>
-      <function-decl name='__sk_mem_schedule' mangled-name='__sk_mem_schedule' filepath='net/core/sock.c' line='2489' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__sk_mem_schedule'>
-        <parameter type-id='f772df6d' name='sk' filepath='net/core/sock.c' line='2489' column='1'/>
-        <parameter type-id='95e97e5e' name='size' filepath='net/core/sock.c' line='2489' column='1'/>
-        <parameter type-id='95e97e5e' name='kind' filepath='net/core/sock.c' line='2489' column='1'/>
+      <function-decl name='__sk_mem_schedule' mangled-name='__sk_mem_schedule' filepath='net/core/sock.c' line='2507' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__sk_mem_schedule'>
+        <parameter type-id='f772df6d' name='sk' filepath='net/core/sock.c' line='2507' column='1'/>
+        <parameter type-id='95e97e5e' name='size' filepath='net/core/sock.c' line='2507' column='1'/>
+        <parameter type-id='95e97e5e' name='kind' filepath='net/core/sock.c' line='2507' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='__sk_mem_reclaim' mangled-name='__sk_mem_reclaim' filepath='net/core/sock.c' line='2526' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__sk_mem_reclaim'>
-        <parameter type-id='f772df6d' name='sk' filepath='net/core/sock.c' line='2526' column='1'/>
-        <parameter type-id='95e97e5e' name='amount' filepath='net/core/sock.c' line='2526' column='1'/>
+      <function-decl name='__sk_mem_reclaim' mangled-name='__sk_mem_reclaim' filepath='net/core/sock.c' line='2544' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__sk_mem_reclaim'>
+        <parameter type-id='f772df6d' name='sk' filepath='net/core/sock.c' line='2544' column='1'/>
+        <parameter type-id='95e97e5e' name='amount' filepath='net/core/sock.c' line='2544' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='sock_no_socketpair' mangled-name='sock_no_socketpair' filepath='net/core/sock.c' line='2561' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_socketpair'>
-        <parameter type-id='13103032' name='sock1' filepath='net/core/sock.c' line='2561' column='1'/>
-        <parameter type-id='13103032' name='sock2' filepath='net/core/sock.c' line='2561' column='1'/>
+      <function-decl name='sock_no_socketpair' mangled-name='sock_no_socketpair' filepath='net/core/sock.c' line='2579' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_socketpair'>
+        <parameter type-id='13103032' name='sock1' filepath='net/core/sock.c' line='2579' column='1'/>
+        <parameter type-id='13103032' name='sock2' filepath='net/core/sock.c' line='2579' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sock_no_accept' mangled-name='sock_no_accept' filepath='net/core/sock.c' line='2567' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_accept'>
-        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='2567' column='1'/>
-        <parameter type-id='13103032' name='newsock' filepath='net/core/sock.c' line='2567' column='1'/>
-        <parameter type-id='95e97e5e' name='flags' filepath='net/core/sock.c' line='2567' column='1'/>
-        <parameter type-id='b50a4934' name='kern' filepath='net/core/sock.c' line='2568' column='1'/>
+      <function-decl name='sock_no_accept' mangled-name='sock_no_accept' filepath='net/core/sock.c' line='2585' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_accept'>
+        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='2585' column='1'/>
+        <parameter type-id='13103032' name='newsock' filepath='net/core/sock.c' line='2585' column='1'/>
+        <parameter type-id='95e97e5e' name='flags' filepath='net/core/sock.c' line='2585' column='1'/>
+        <parameter type-id='b50a4934' name='kern' filepath='net/core/sock.c' line='2586' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sock_no_ioctl' mangled-name='sock_no_ioctl' filepath='net/core/sock.c' line='2581' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_ioctl'>
-        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='2581' column='1'/>
-        <parameter type-id='f0981eeb' name='cmd' filepath='net/core/sock.c' line='2581' column='1'/>
-        <parameter type-id='7359adad' name='arg' filepath='net/core/sock.c' line='2581' column='1'/>
+      <function-decl name='sock_no_ioctl' mangled-name='sock_no_ioctl' filepath='net/core/sock.c' line='2599' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_ioctl'>
+        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='2599' column='1'/>
+        <parameter type-id='f0981eeb' name='cmd' filepath='net/core/sock.c' line='2599' column='1'/>
+        <parameter type-id='7359adad' name='arg' filepath='net/core/sock.c' line='2599' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sock_no_listen' mangled-name='sock_no_listen' filepath='net/core/sock.c' line='2587' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_listen'>
-        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='2587' column='1'/>
-        <parameter type-id='95e97e5e' name='backlog' filepath='net/core/sock.c' line='2587' column='1'/>
+      <function-decl name='sock_no_listen' mangled-name='sock_no_listen' filepath='net/core/sock.c' line='2605' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_listen'>
+        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='2605' column='1'/>
+        <parameter type-id='95e97e5e' name='backlog' filepath='net/core/sock.c' line='2605' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sock_no_shutdown' mangled-name='sock_no_shutdown' filepath='net/core/sock.c' line='2593' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_shutdown'>
-        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='2593' column='1'/>
-        <parameter type-id='95e97e5e' name='how' filepath='net/core/sock.c' line='2593' column='1'/>
+      <function-decl name='sock_no_shutdown' mangled-name='sock_no_shutdown' filepath='net/core/sock.c' line='2611' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_shutdown'>
+        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='2611' column='1'/>
+        <parameter type-id='95e97e5e' name='how' filepath='net/core/sock.c' line='2611' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sock_no_setsockopt' mangled-name='sock_no_setsockopt' filepath='net/core/sock.c' line='2599' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_setsockopt'>
-        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='2599' column='1'/>
-        <parameter type-id='95e97e5e' name='level' filepath='net/core/sock.c' line='2599' column='1'/>
-        <parameter type-id='95e97e5e' name='optname' filepath='net/core/sock.c' line='2599' column='1'/>
-        <parameter type-id='26a90f95' name='optval' filepath='net/core/sock.c' line='2600' column='1'/>
-        <parameter type-id='f0981eeb' name='optlen' filepath='net/core/sock.c' line='2600' column='1'/>
+      <function-decl name='sock_no_setsockopt' mangled-name='sock_no_setsockopt' filepath='net/core/sock.c' line='2617' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_setsockopt'>
+        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='2617' column='1'/>
+        <parameter type-id='95e97e5e' name='level' filepath='net/core/sock.c' line='2617' column='1'/>
+        <parameter type-id='95e97e5e' name='optname' filepath='net/core/sock.c' line='2617' column='1'/>
+        <parameter type-id='26a90f95' name='optval' filepath='net/core/sock.c' line='2618' column='1'/>
+        <parameter type-id='f0981eeb' name='optlen' filepath='net/core/sock.c' line='2618' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sock_no_getsockopt' mangled-name='sock_no_getsockopt' filepath='net/core/sock.c' line='2606' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_getsockopt'>
-        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='2606' column='1'/>
-        <parameter type-id='95e97e5e' name='level' filepath='net/core/sock.c' line='2606' column='1'/>
-        <parameter type-id='95e97e5e' name='optname' filepath='net/core/sock.c' line='2606' column='1'/>
-        <parameter type-id='26a90f95' name='optval' filepath='net/core/sock.c' line='2607' column='1'/>
-        <parameter type-id='7292109c' name='optlen' filepath='net/core/sock.c' line='2607' column='1'/>
+      <function-decl name='sock_no_getsockopt' mangled-name='sock_no_getsockopt' filepath='net/core/sock.c' line='2624' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_getsockopt'>
+        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='2624' column='1'/>
+        <parameter type-id='95e97e5e' name='level' filepath='net/core/sock.c' line='2624' column='1'/>
+        <parameter type-id='95e97e5e' name='optname' filepath='net/core/sock.c' line='2624' column='1'/>
+        <parameter type-id='26a90f95' name='optval' filepath='net/core/sock.c' line='2625' column='1'/>
+        <parameter type-id='7292109c' name='optlen' filepath='net/core/sock.c' line='2625' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sock_no_mmap' mangled-name='sock_no_mmap' filepath='net/core/sock.c' line='2632' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_mmap'>
-        <parameter type-id='77e79a4b' name='file' filepath='net/core/sock.c' line='2632' column='1'/>
-        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='2632' column='1'/>
-        <parameter type-id='2ae08426' name='vma' filepath='net/core/sock.c' line='2632' column='1'/>
+      <function-decl name='sock_no_mmap' mangled-name='sock_no_mmap' filepath='net/core/sock.c' line='2650' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_mmap'>
+        <parameter type-id='77e79a4b' name='file' filepath='net/core/sock.c' line='2650' column='1'/>
+        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='2650' column='1'/>
+        <parameter type-id='2ae08426' name='vma' filepath='net/core/sock.c' line='2650' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sock_get_timestamp' mangled-name='sock_get_timestamp' filepath='net/core/sock.c' line='2932' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_get_timestamp'>
-        <parameter type-id='f772df6d' name='sk' filepath='net/core/sock.c' line='2932' column='1'/>
-        <parameter type-id='896f1b83' name='userstamp' filepath='net/core/sock.c' line='2932' column='1'/>
+      <function-decl name='sock_get_timestamp' mangled-name='sock_get_timestamp' filepath='net/core/sock.c' line='2952' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_get_timestamp'>
+        <parameter type-id='f772df6d' name='sk' filepath='net/core/sock.c' line='2952' column='1'/>
+        <parameter type-id='896f1b83' name='userstamp' filepath='net/core/sock.c' line='2952' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sock_common_getsockopt' mangled-name='sock_common_getsockopt' filepath='net/core/sock.c' line='3026' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_common_getsockopt'>
-        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='3026' column='1'/>
-        <parameter type-id='95e97e5e' name='level' filepath='net/core/sock.c' line='3026' column='1'/>
-        <parameter type-id='95e97e5e' name='optname' filepath='net/core/sock.c' line='3026' column='1'/>
-        <parameter type-id='26a90f95' name='optval' filepath='net/core/sock.c' line='3027' column='1'/>
-        <parameter type-id='7292109c' name='optlen' filepath='net/core/sock.c' line='3027' column='1'/>
+      <function-decl name='sock_common_getsockopt' mangled-name='sock_common_getsockopt' filepath='net/core/sock.c' line='3046' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_common_getsockopt'>
+        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='3046' column='1'/>
+        <parameter type-id='95e97e5e' name='level' filepath='net/core/sock.c' line='3046' column='1'/>
+        <parameter type-id='95e97e5e' name='optname' filepath='net/core/sock.c' line='3046' column='1'/>
+        <parameter type-id='26a90f95' name='optval' filepath='net/core/sock.c' line='3047' column='1'/>
+        <parameter type-id='7292109c' name='optlen' filepath='net/core/sock.c' line='3047' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='compat_sock_common_getsockopt' mangled-name='compat_sock_common_getsockopt' filepath='net/core/sock.c' line='3036' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_sock_common_getsockopt'>
-        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='3036' column='1'/>
-        <parameter type-id='95e97e5e' name='level' filepath='net/core/sock.c' line='3036' column='1'/>
-        <parameter type-id='95e97e5e' name='optname' filepath='net/core/sock.c' line='3036' column='1'/>
-        <parameter type-id='26a90f95' name='optval' filepath='net/core/sock.c' line='3037' column='1'/>
-        <parameter type-id='7292109c' name='optlen' filepath='net/core/sock.c' line='3037' column='1'/>
+      <function-decl name='compat_sock_common_getsockopt' mangled-name='compat_sock_common_getsockopt' filepath='net/core/sock.c' line='3056' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_sock_common_getsockopt'>
+        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='3056' column='1'/>
+        <parameter type-id='95e97e5e' name='level' filepath='net/core/sock.c' line='3056' column='1'/>
+        <parameter type-id='95e97e5e' name='optname' filepath='net/core/sock.c' line='3056' column='1'/>
+        <parameter type-id='26a90f95' name='optval' filepath='net/core/sock.c' line='3057' column='1'/>
+        <parameter type-id='7292109c' name='optlen' filepath='net/core/sock.c' line='3057' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sock_common_setsockopt' mangled-name='sock_common_setsockopt' filepath='net/core/sock.c' line='3067' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_common_setsockopt'>
-        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='3067' column='1'/>
-        <parameter type-id='95e97e5e' name='level' filepath='net/core/sock.c' line='3067' column='1'/>
-        <parameter type-id='95e97e5e' name='optname' filepath='net/core/sock.c' line='3067' column='1'/>
-        <parameter type-id='26a90f95' name='optval' filepath='net/core/sock.c' line='3068' column='1'/>
-        <parameter type-id='f0981eeb' name='optlen' filepath='net/core/sock.c' line='3068' column='1'/>
+      <function-decl name='sock_common_setsockopt' mangled-name='sock_common_setsockopt' filepath='net/core/sock.c' line='3087' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_common_setsockopt'>
+        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='3087' column='1'/>
+        <parameter type-id='95e97e5e' name='level' filepath='net/core/sock.c' line='3087' column='1'/>
+        <parameter type-id='95e97e5e' name='optname' filepath='net/core/sock.c' line='3087' column='1'/>
+        <parameter type-id='26a90f95' name='optval' filepath='net/core/sock.c' line='3088' column='1'/>
+        <parameter type-id='f0981eeb' name='optlen' filepath='net/core/sock.c' line='3088' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='compat_sock_common_setsockopt' mangled-name='compat_sock_common_setsockopt' filepath='net/core/sock.c' line='3077' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_sock_common_setsockopt'>
-        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='3077' column='1'/>
-        <parameter type-id='95e97e5e' name='level' filepath='net/core/sock.c' line='3077' column='1'/>
-        <parameter type-id='95e97e5e' name='optname' filepath='net/core/sock.c' line='3077' column='1'/>
-        <parameter type-id='26a90f95' name='optval' filepath='net/core/sock.c' line='3078' column='1'/>
-        <parameter type-id='f0981eeb' name='optlen' filepath='net/core/sock.c' line='3078' column='1'/>
+      <function-decl name='compat_sock_common_setsockopt' mangled-name='compat_sock_common_setsockopt' filepath='net/core/sock.c' line='3097' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='compat_sock_common_setsockopt'>
+        <parameter type-id='13103032' name='sock' filepath='net/core/sock.c' line='3097' column='1'/>
+        <parameter type-id='95e97e5e' name='level' filepath='net/core/sock.c' line='3097' column='1'/>
+        <parameter type-id='95e97e5e' name='optname' filepath='net/core/sock.c' line='3097' column='1'/>
+        <parameter type-id='26a90f95' name='optval' filepath='net/core/sock.c' line='3098' column='1'/>
+        <parameter type-id='f0981eeb' name='optlen' filepath='net/core/sock.c' line='3098' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sk_common_release' mangled-name='sk_common_release' filepath='net/core/sock.c' line='3090' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sk_common_release'>
-        <parameter type-id='f772df6d' name='sk' filepath='net/core/sock.c' line='3090' column='1'/>
+      <function-decl name='sk_common_release' mangled-name='sk_common_release' filepath='net/core/sock.c' line='3110' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sk_common_release'>
+        <parameter type-id='f772df6d' name='sk' filepath='net/core/sock.c' line='3110' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='sock_prot_inuse_add' mangled-name='sock_prot_inuse_add' filepath='net/core/sock.c' line='3150' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_prot_inuse_add'>
-        <parameter type-id='a2bff676' name='net' filepath='net/core/sock.c' line='3150' column='1'/>
-        <parameter type-id='d2524501' name='prot' filepath='net/core/sock.c' line='3150' column='1'/>
-        <parameter type-id='95e97e5e' name='val' filepath='net/core/sock.c' line='3150' column='1'/>
+      <function-decl name='sock_prot_inuse_add' mangled-name='sock_prot_inuse_add' filepath='net/core/sock.c' line='3170' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_prot_inuse_add'>
+        <parameter type-id='a2bff676' name='net' filepath='net/core/sock.c' line='3170' column='1'/>
+        <parameter type-id='d2524501' name='prot' filepath='net/core/sock.c' line='3170' column='1'/>
+        <parameter type-id='95e97e5e' name='val' filepath='net/core/sock.c' line='3170' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='sk_busy_loop_end' mangled-name='sk_busy_loop_end' filepath='net/core/sock.c' line='3509' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sk_busy_loop_end'>
-        <parameter type-id='eaa32e2f' name='p' filepath='net/core/sock.c' line='3509' column='1'/>
-        <parameter type-id='7359adad' name='start_time' filepath='net/core/sock.c' line='3509' column='1'/>
+      <function-decl name='sk_busy_loop_end' mangled-name='sk_busy_loop_end' filepath='net/core/sock.c' line='3529' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sk_busy_loop_end'>
+        <parameter type-id='eaa32e2f' name='p' filepath='net/core/sock.c' line='3529' column='1'/>
+        <parameter type-id='7359adad' name='start_time' filepath='net/core/sock.c' line='3529' column='1'/>
         <return type-id='b50a4934'/>
       </function-decl>
     </abi-instr>
@@ -129536,7 +129556,7 @@
         <parameter type-id='95e97e5e'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='sock_i_ino' mangled-name='sock_i_ino' filepath='include/net/sock.h' line='1829' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_i_ino'>
+      <function-decl name='sock_i_ino' mangled-name='sock_i_ino' filepath='include/net/sock.h' line='1830' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_i_ino'>
         <parameter type-id='f772df6d'/>
         <return type-id='7359adad'/>
       </function-decl>
@@ -130132,7 +130152,7 @@
         <parameter type-id='eaa32e2f'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='sock_i_uid' mangled-name='sock_i_uid' filepath='include/net/sock.h' line='1828' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_i_uid'>
+      <function-decl name='sock_i_uid' mangled-name='sock_i_uid' filepath='include/net/sock.h' line='1829' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_i_uid'>
         <parameter type-id='f772df6d'/>
         <return type-id='e8b29774'/>
       </function-decl>
@@ -130713,7 +130733,7 @@
         <parameter type-id='1a7bb5c8' name='res' filepath='net/socket.c' line='1432' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sock_kmalloc' mangled-name='sock_kmalloc' filepath='include/net/sock.h' line='1622' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_kmalloc'>
+      <function-decl name='sock_kmalloc' mangled-name='sock_kmalloc' filepath='include/net/sock.h' line='1623' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_kmalloc'>
         <parameter type-id='f772df6d'/>
         <parameter type-id='95e97e5e'/>
         <parameter type-id='f0981eeb'/>
@@ -130739,7 +130759,7 @@
         <parameter type-id='f0981eeb' name='optlen' filepath='net/socket.c' line='3551' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sock_no_sendpage' mangled-name='sock_no_sendpage' filepath='include/net/sock.h' line='1663' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_sendpage'>
+      <function-decl name='sock_no_sendpage' mangled-name='sock_no_sendpage' filepath='include/net/sock.h' line='1664' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_sendpage'>
         <parameter type-id='13103032'/>
         <parameter type-id='02f11ed4'/>
         <parameter type-id='95e97e5e'/>

commit 15752dea8b0c83a73cb8b9fbfc22d2e8dc9b4d23
Author: Shunqian Zheng <zhengsq@rock-chips.com>
Date:   Thu May 20 19:41:50 2021 +0800

    iio: imu: inv_icm42600: add icm40608
    
    By comparing icm40608 datasheet with icm42600, it can
    use icm426xx driver directly.
    
    Change-Id: If856076ed4f57df6ba5bbb339a35b119937c6385
    Signed-off-by: Shunqian Zheng <zhengsq@rock-chips.com>

diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600.h b/drivers/iio/imu/inv_icm42600/inv_icm42600.h
index 236f4648c5eb..19c9d02d8ffe 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600.h
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600.h
@@ -17,6 +17,7 @@
 #include "inv_icm42600_buffer.h"
 
 enum inv_icm42600_chip {
+	INV_CHIP_ICM40608,
 	INV_CHIP_ICM42600,
 	INV_CHIP_ICM42602,
 	INV_CHIP_ICM42605,
@@ -298,6 +299,7 @@ struct inv_icm42600_state {
 #define INV_ICM42600_INT_SOURCE0_UI_AGC_RDY_INT1_EN	BIT(0)
 
 #define INV_ICM42600_REG_WHOAMI				0x0075
+#define INV_ICM42600_WHOAMI_ICM40608			0x39
 #define INV_ICM42600_WHOAMI_ICM42600			0x40
 #define INV_ICM42600_WHOAMI_ICM42602			0x41
 #define INV_ICM42600_WHOAMI_ICM42605			0x42
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
index c49dc7e906c2..7bb2f4fb6867 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
@@ -67,6 +67,11 @@ static const struct inv_icm42600_conf inv_icm42600_default_conf = {
 };
 
 static const struct inv_icm42600_hw inv_icm42600_hw[INV_CHIP_NB] = {
+	[INV_CHIP_ICM40608] = {
+		.whoami = INV_ICM42600_WHOAMI_ICM40608,
+		.name = "icm40608",
+		.conf = &inv_icm42600_default_conf,
+	},
 	[INV_CHIP_ICM42600] = {
 		.whoami = INV_ICM42600_WHOAMI_ICM42600,
 		.name = "icm42600",
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c
index 85b1934cec60..1bde8799628e 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c
@@ -70,6 +70,9 @@ static int inv_icm42600_probe(struct i2c_client *client)
 
 static const struct of_device_id inv_icm42600_of_matches[] = {
 	{
+		.compatible = "invensense,icm40608",
+		.data = (void *)INV_CHIP_ICM40608,
+	}, {
 		.compatible = "invensense,icm42600",
 		.data = (void *)INV_CHIP_ICM42600,
 	}, {
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c
index 323789697a08..588af4cff4f7 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c
@@ -69,6 +69,9 @@ static int inv_icm42600_probe(struct spi_device *spi)
 
 static const struct of_device_id inv_icm42600_of_matches[] = {
 	{
+		.compatible = "invensense,icm40608",
+		.data = (void *)INV_CHIP_ICM40608,
+	}, {
 		.compatible = "invensense,icm42600",
 		.data = (void *)INV_CHIP_ICM42600,
 	}, {

commit e34184f53363f6bb873c2fe0ce1a08ed7d16e94a
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Sat Oct 9 14:11:04 2021 +0200

    Linux 4.19.210
    
    Link: https://lore.kernel.org/r/20211008112714.601107695@linuxfoundation.org
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index a144a7117a1b..d9c39b3c05d5 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 209
+SUBLEVEL = 210
 EXTRAVERSION =
 NAME = "People's Front"
 

commit b9a1ac8e7c03fd09992352c7fb1a61cbbb9ad52b
Author: Davidlohr Bueso <dave@stgolabs.net>
Date:   Wed Jul 24 08:23:23 2019 -0700

    lib/timerqueue: Rely on rbtree semantics for next timer
    
    commit 511885d7061eda3eb1faf3f57dcc936ff75863f1 upstream.
    
    Simplify the timerqueue code by using cached rbtrees and rely on the tree
    leftmost node semantics to get the timer with earliest expiration time.
    This is a drop in conversion, and therefore semantics remain untouched.
    
    The runtime overhead of cached rbtrees is be pretty much the same as the
    current head->next method, noting that when removing the leftmost node,
    a common operation for the timerqueue, the rb_next(leftmost) is O(1) as
    well, so the next timer will either be the right node or its parent.
    Therefore no extra pointer chasing. Finally, the size of the struct
    timerqueue_head remains the same.
    
    Passes several hours of rcutorture.
    
    Signed-off-by: Davidlohr Bueso <dbueso@suse.de>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Link: https://lkml.kernel.org/r/20190724152323.bojciei3muvfxalm@linux-r8p5
    Reference: CVE-2021-20317
    Signed-off-by: Nobuhiro Iwamatsu (CIP) <nobuhiro1.iwamatsu@toshiba.co.jp>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/timerqueue.h b/include/linux/timerqueue.h
index 78b8cc73f12f..aff122f1062a 100644
--- a/include/linux/timerqueue.h
+++ b/include/linux/timerqueue.h
@@ -12,8 +12,7 @@ struct timerqueue_node {
 };
 
 struct timerqueue_head {
-	struct rb_root head;
-	struct timerqueue_node *next;
+	struct rb_root_cached rb_root;
 };
 
 
@@ -29,13 +28,14 @@ extern struct timerqueue_node *timerqueue_iterate_next(
  *
  * @head: head of timerqueue
  *
- * Returns a pointer to the timer node that has the
- * earliest expiration time.
+ * Returns a pointer to the timer node that has the earliest expiration time.
  */
 static inline
 struct timerqueue_node *timerqueue_getnext(struct timerqueue_head *head)
 {
-	return head->next;
+	struct rb_node *leftmost = rb_first_cached(&head->rb_root);
+
+	return rb_entry(leftmost, struct timerqueue_node, node);
 }
 
 static inline void timerqueue_init(struct timerqueue_node *node)
@@ -45,7 +45,6 @@ static inline void timerqueue_init(struct timerqueue_node *node)
 
 static inline void timerqueue_init_head(struct timerqueue_head *head)
 {
-	head->head = RB_ROOT;
-	head->next = NULL;
+	head->rb_root = RB_ROOT_CACHED;
 }
 #endif /* _LINUX_TIMERQUEUE_H */
diff --git a/lib/timerqueue.c b/lib/timerqueue.c
index 0d54bcbc8170..7a8ae3d5fd40 100644
--- a/lib/timerqueue.c
+++ b/lib/timerqueue.c
@@ -39,9 +39,10 @@
  */
 bool timerqueue_add(struct timerqueue_head *head, struct timerqueue_node *node)
 {
-	struct rb_node **p = &head->head.rb_node;
+	struct rb_node **p = &head->rb_root.rb_root.rb_node;
 	struct rb_node *parent = NULL;
-	struct timerqueue_node  *ptr;
+	struct timerqueue_node *ptr;
+	bool leftmost = true;
 
 	/* Make sure we don't add nodes that are already added */
 	WARN_ON_ONCE(!RB_EMPTY_NODE(&node->node));
@@ -49,19 +50,17 @@ bool timerqueue_add(struct timerqueue_head *head, struct timerqueue_node *node)
 	while (*p) {
 		parent = *p;
 		ptr = rb_entry(parent, struct timerqueue_node, node);
-		if (node->expires < ptr->expires)
+		if (node->expires < ptr->expires) {
 			p = &(*p)->rb_left;
-		else
+		} else {
 			p = &(*p)->rb_right;
+			leftmost = false;
+		}
 	}
 	rb_link_node(&node->node, parent, p);
-	rb_insert_color(&node->node, &head->head);
+	rb_insert_color_cached(&node->node, &head->rb_root, leftmost);
 
-	if (!head->next || node->expires < head->next->expires) {
-		head->next = node;
-		return true;
-	}
-	return false;
+	return leftmost;
 }
 EXPORT_SYMBOL_GPL(timerqueue_add);
 
@@ -78,15 +77,10 @@ bool timerqueue_del(struct timerqueue_head *head, struct timerqueue_node *node)
 {
 	WARN_ON_ONCE(RB_EMPTY_NODE(&node->node));
 
-	/* update next pointer */
-	if (head->next == node) {
-		struct rb_node *rbn = rb_next(&node->node);
-
-		head->next = rb_entry_safe(rbn, struct timerqueue_node, node);
-	}
-	rb_erase(&node->node, &head->head);
+	rb_erase_cached(&node->node, &head->rb_root);
 	RB_CLEAR_NODE(&node->node);
-	return head->next != NULL;
+
+	return !RB_EMPTY_ROOT(&head->rb_root.rb_root);
 }
 EXPORT_SYMBOL_GPL(timerqueue_del);
 

commit 04f4cd7c0063a265cd25796d98f340d85bcab45d
Author: Kate Hsuan <hpa@redhat.com>
Date:   Fri Sep 3 17:44:11 2021 +0800

    libata: Add ATA_HORKAGE_NO_NCQ_ON_ATI for Samsung 860 and 870 SSD.
    
    commit 7a8526a5cd51cf5f070310c6c37dd7293334ac49 upstream.
    
    Many users are reporting that the Samsung 860 and 870 SSD are having
    various issues when combined with AMD/ATI (vendor ID 0x1002)  SATA
    controllers and only completely disabling NCQ helps to avoid these
    issues.
    
    Always disabling NCQ for Samsung 860/870 SSDs regardless of the host
    SATA adapter vendor will cause I/O performance degradation with well
    behaved adapters. To limit the performance impact to ATI adapters,
    introduce the ATA_HORKAGE_NO_NCQ_ON_ATI flag to force disable NCQ
    only for these adapters.
    
    Also, two libata.force parameters (noncqati and ncqati) are introduced
    to disable and enable the NCQ for the system which equipped with ATI
    SATA adapter and Samsung 860 and 870 SSDs. The user can determine NCQ
    function to be enabled or disabled according to the demand.
    
    After verifying the chipset from the user reports, the issue appears
    on AMD/ATI SB7x0/SB8x0/SB9x0 SATA Controllers and does not appear on
    recent AMD SATA adapters. The vendor ID of ATI should be 0x1002.
    Therefore, ATA_HORKAGE_NO_NCQ_ON_AMD was modified to
    ATA_HORKAGE_NO_NCQ_ON_ATI.
    
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=201693
    Signed-off-by: Kate Hsuan <hpa@redhat.com>
    Reviewed-by: Hans de Goede <hdegoede@redhat.com>
    Link: https://lore.kernel.org/r/20210903094411.58749-1-hpa@redhat.com
    Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Cc: Krzysztof Ol?dzki <ole@ans.pl>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index b95a4194a68d..897360a56fdd 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -2268,6 +2268,25 @@ static void ata_dev_config_ncq_prio(struct ata_device *dev)
 
 }
 
+static bool ata_dev_check_adapter(struct ata_device *dev,
+				  unsigned short vendor_id)
+{
+	struct pci_dev *pcidev = NULL;
+	struct device *parent_dev = NULL;
+
+	for (parent_dev = dev->tdev.parent; parent_dev != NULL;
+	     parent_dev = parent_dev->parent) {
+		if (dev_is_pci(parent_dev)) {
+			pcidev = to_pci_dev(parent_dev);
+			if (pcidev->vendor == vendor_id)
+				return true;
+			break;
+		}
+	}
+
+	return false;
+}
+
 static int ata_dev_config_ncq(struct ata_device *dev,
 			       char *desc, size_t desc_sz)
 {
@@ -2284,6 +2303,13 @@ static int ata_dev_config_ncq(struct ata_device *dev,
 		snprintf(desc, desc_sz, "NCQ (not used)");
 		return 0;
 	}
+
+	if (dev->horkage & ATA_HORKAGE_NO_NCQ_ON_ATI &&
+	    ata_dev_check_adapter(dev, PCI_VENDOR_ID_ATI)) {
+		snprintf(desc, desc_sz, "NCQ (not used)");
+		return 0;
+	}
+
 	if (ap->flags & ATA_FLAG_NCQ) {
 		hdepth = min(ap->scsi_host->can_queue, ATA_MAX_QUEUE);
 		dev->flags |= ATA_DFLAG_NCQ;
@@ -4575,9 +4601,11 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
 	{ "Samsung SSD 850*",		NULL,	ATA_HORKAGE_NO_NCQ_TRIM |
 						ATA_HORKAGE_ZERO_AFTER_TRIM, },
 	{ "Samsung SSD 860*",		NULL,	ATA_HORKAGE_NO_NCQ_TRIM |
-						ATA_HORKAGE_ZERO_AFTER_TRIM, },
+						ATA_HORKAGE_ZERO_AFTER_TRIM |
+						ATA_HORKAGE_NO_NCQ_ON_ATI, },
 	{ "Samsung SSD 870*",		NULL,	ATA_HORKAGE_NO_NCQ_TRIM |
-						ATA_HORKAGE_ZERO_AFTER_TRIM, },
+						ATA_HORKAGE_ZERO_AFTER_TRIM |
+						ATA_HORKAGE_NO_NCQ_ON_ATI, },
 	{ "FCCT*M500*",			NULL,	ATA_HORKAGE_NO_NCQ_TRIM |
 						ATA_HORKAGE_ZERO_AFTER_TRIM, },
 
@@ -6934,6 +6962,8 @@ static int __init ata_parse_force_one(char **cur,
 		{ "ncq",	.horkage_off	= ATA_HORKAGE_NONCQ },
 		{ "noncqtrim",	.horkage_on	= ATA_HORKAGE_NO_NCQ_TRIM },
 		{ "ncqtrim",	.horkage_off	= ATA_HORKAGE_NO_NCQ_TRIM },
+		{ "noncqati",	.horkage_on	= ATA_HORKAGE_NO_NCQ_ON_ATI },
+		{ "ncqati",	.horkage_off	= ATA_HORKAGE_NO_NCQ_ON_ATI },
 		{ "dump_id",	.horkage_on	= ATA_HORKAGE_DUMP_ID },
 		{ "pio0",	.xfer_mask	= 1 << (ATA_SHIFT_PIO + 0) },
 		{ "pio1",	.xfer_mask	= 1 << (ATA_SHIFT_PIO + 1) },
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 3d076aca7ac2..6d9194fb38df 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -440,6 +440,7 @@ enum {
 	ATA_HORKAGE_NOTRIM	= (1 << 24),	/* don't use TRIM */
 	ATA_HORKAGE_MAX_SEC_1024 = (1 << 25),	/* Limit max sects to 1024 */
 	ATA_HORKAGE_MAX_TRIM_128M = (1 << 26),	/* Limit max trim size to 128M */
+	ATA_HORKAGE_NO_NCQ_ON_ATI = (1 << 27),	/* Disable NCQ on ATI chipset */
 
 	 /* DMA mask for user DMA control: User visible values; DO NOT
 	    renumber */

commit 236dc5397133fb7f94aa91c8d5029a5e278c4933
Author: Changbin Du <changbin.du@gmail.com>
Date:   Fri Sep 24 15:43:41 2021 -0700

    tools/vm/page-types: remove dependency on opt_file for idle page tracking
    
    [ Upstream commit ebaeab2fe87987cef28eb5ab174c42cd28594387 ]
    
    Idle page tracking can also be used for process address space, not only
    file mappings.
    
    Without this change, using with '-i' option for process address space
    encounters below errors reported.
    
      $ sudo ./page-types -p $(pidof bash) -i
      mark page idle: Bad file descriptor
      mark page idle: Bad file descriptor
      mark page idle: Bad file descriptor
      mark page idle: Bad file descriptor
      ...
    
    Link: https://lkml.kernel.org/r/20210917032826.10669-1-changbin.du@gmail.com
    Signed-off-by: Changbin Du <changbin.du@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/tools/vm/page-types.c b/tools/vm/page-types.c
index 1ff3a6c0367b..89063b967b6b 100644
--- a/tools/vm/page-types.c
+++ b/tools/vm/page-types.c
@@ -1341,7 +1341,7 @@ int main(int argc, char *argv[])
 	if (opt_list && opt_list_mapcnt)
 		kpagecount_fd = checked_open(PROC_KPAGECOUNT, O_RDONLY);
 
-	if (opt_mark_idle && opt_file)
+	if (opt_mark_idle)
 		page_idle_fd = checked_open(SYS_KERNEL_MM_PAGE_IDLE, O_RDWR);
 
 	if (opt_list && opt_pid)

commit e750003693caba8c183ec96e3075cc322f0a6415
Author: Wen Xiong <wenxiong@linux.ibm.com>
Date:   Thu Sep 16 22:24:21 2021 -0500

    scsi: ses: Retry failed Send/Receive Diagnostic commands
    
    [ Upstream commit fbdac19e642899455b4e64c63aafe2325df7aafa ]
    
    Setting SCSI logging level with error=3, we saw some errors from enclosues:
    
    [108017.360833] ses 0:0:9:0: tag#641 Done: NEEDS_RETRY Result: hostbyte=DID_ERROR driverbyte=DRIVER_OK cmd_age=0s
    [108017.360838] ses 0:0:9:0: tag#641 CDB: Receive Diagnostic 1c 01 01 00 20 00
    [108017.427778] ses 0:0:9:0: Power-on or device reset occurred
    [108017.427784] ses 0:0:9:0: tag#641 Done: SUCCESS Result: hostbyte=DID_OK driverbyte=DRIVER_OK cmd_age=0s
    [108017.427788] ses 0:0:9:0: tag#641 CDB: Receive Diagnostic 1c 01 01 00 20 00
    [108017.427791] ses 0:0:9:0: tag#641 Sense Key : Unit Attention [current]
    [108017.427793] ses 0:0:9:0: tag#641 Add. Sense: Bus device reset function occurred
    [108017.427801] ses 0:0:9:0: Failed to get diagnostic page 0x1
    [108017.427804] ses 0:0:9:0: Failed to bind enclosure -19
    [108017.427895] ses 0:0:10:0: Attached Enclosure device
    [108017.427942] ses 0:0:10:0: Attached scsi generic sg18 type 13
    
    Retry if the Send/Receive Diagnostic commands complete with a transient
    error status (NOT_READY or UNIT_ATTENTION with ASC 0x29).
    
    Link: https://lore.kernel.org/r/1631849061-10210-2-git-send-email-wenxiong@linux.ibm.com
    Reviewed-by: Brian King <brking@linux.ibm.com>
    Reviewed-by: James Bottomley <jejb@linux.ibm.com>
    Signed-off-by: Wen Xiong <wenxiong@linux.ibm.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/ses.c b/drivers/scsi/ses.c
index 0fc39224ce1e..caf35ca577ce 100644
--- a/drivers/scsi/ses.c
+++ b/drivers/scsi/ses.c
@@ -103,9 +103,16 @@ static int ses_recv_diag(struct scsi_device *sdev, int page_code,
 		0
 	};
 	unsigned char recv_page_code;
+	unsigned int retries = SES_RETRIES;
+	struct scsi_sense_hdr sshdr;
+
+	do {
+		ret = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, bufflen,
+				       &sshdr, SES_TIMEOUT, 1, NULL);
+	} while (ret > 0 && --retries && scsi_sense_valid(&sshdr) &&
+		 (sshdr.sense_key == NOT_READY ||
+		  (sshdr.sense_key == UNIT_ATTENTION && sshdr.asc == 0x29)));
 
-	ret =  scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, bufflen,
-				NULL, SES_TIMEOUT, SES_RETRIES, NULL);
 	if (unlikely(ret))
 		return ret;
 
@@ -137,9 +144,16 @@ static int ses_send_diag(struct scsi_device *sdev, int page_code,
 		bufflen & 0xff,
 		0
 	};
+	struct scsi_sense_hdr sshdr;
+	unsigned int retries = SES_RETRIES;
+
+	do {
+		result = scsi_execute_req(sdev, cmd, DMA_TO_DEVICE, buf, bufflen,
+					  &sshdr, SES_TIMEOUT, 1, NULL);
+	} while (result > 0 && --retries && scsi_sense_valid(&sshdr) &&
+		 (sshdr.sense_key == NOT_READY ||
+		  (sshdr.sense_key == UNIT_ATTENTION && sshdr.asc == 0x29)));
 
-	result = scsi_execute_req(sdev, cmd, DMA_TO_DEVICE, buf, bufflen,
-				  NULL, SES_TIMEOUT, SES_RETRIES, NULL);
 	if (result)
 		sdev_printk(KERN_ERR, sdev, "SEND DIAGNOSTIC result: %8x\n",
 			    result);

commit c2dd21984a0e3cb420712cd46bf2a69af24bf2b1
Author: Li Zhijian <lizhijian@cn.fujitsu.com>
Date:   Wed Sep 15 21:45:54 2021 +0800

    selftests: be sure to make khdr before other targets
    
    [ Upstream commit 8914a7a247e065438a0ec86a58c1c359223d2c9e ]
    
    LKP/0Day reported some building errors about kvm, and errors message
    are not always same:
    - lib/x86_64/processor.c:1083:31: error: ?KVM_CAP_NESTED_STATE??undeclared
    (first use in this function); did you mean ?KVM_CAP_PIT_STATE2??
    - lib/test_util.c:189:30: error: ?MAP_HUGE_16KB??undeclared (first use
    in this function); did you mean ?MAP_HUGE_16GB??
    
    Although kvm relies on the khdr, they still be built in parallel when -j
    is specified. In this case, it will cause compiling errors.
    
    Here we mark target khdr as NOTPARALLEL to make it be always built
    first.
    
    CC: Philip Li <philip.li@intel.com>
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com>
    Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/tools/testing/selftests/lib.mk b/tools/testing/selftests/lib.mk
index a5d40653a921..9700281bee4c 100644
--- a/tools/testing/selftests/lib.mk
+++ b/tools/testing/selftests/lib.mk
@@ -26,6 +26,7 @@ include $(top_srcdir)/scripts/subarch.include
 ARCH		?= $(SUBARCH)
 
 .PHONY: khdr
+.NOTPARALLEL:
 khdr:
 	make ARCH=$(ARCH) -C $(top_srcdir) headers_install
 

commit a7182993dd8e09f96839ddc3ac54f9b37370d282
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Tue Aug 31 16:42:36 2021 +0800

    usb: dwc2: check return value after calling platform_get_resource()
    
    [ Upstream commit 856e6e8e0f9300befa87dde09edb578555c99a82 ]
    
    It will cause null-ptr-deref if platform_get_resource() returns NULL,
    we need check the return value.
    
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Link: https://lore.kernel.org/r/20210831084236.1359677-1-yangyingliang@huawei.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c
index 58e53e3d905b..22c4d554865e 100644
--- a/drivers/usb/dwc2/hcd.c
+++ b/drivers/usb/dwc2/hcd.c
@@ -5234,6 +5234,10 @@ int dwc2_hcd_init(struct dwc2_hsotg *hsotg)
 	hcd->has_tt = 1;
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res) {
+		retval = -EINVAL;
+		goto error1;
+	}
 	hcd->rsrc_start = res->start;
 	hcd->rsrc_len = resource_size(res);
 

commit 10fff12be53b0b90860bcafcecf779eb985df5c0
Author: Faizel K B <faizel.kb@dicortech.com>
Date:   Thu Sep 2 17:14:44 2021 +0530

    usb: testusb: Fix for showing the connection speed
    
    [ Upstream commit f81c08f897adafd2ed43f86f00207ff929f0b2eb ]
    
    testusb' application which uses 'usbtest' driver reports 'unknown speed'
    from the function 'find_testdev'. The variable 'entry->speed' was not
    updated from  the application. The IOCTL mentioned in the FIXME comment can
    only report whether the connection is low speed or not. Speed is read using
    the IOCTL USBDEVFS_GET_SPEED which reports the proper speed grade.  The
    call is implemented in the function 'handle_testdev' where the file
    descriptor was availble locally. Sample output is given below where 'high
    speed' is printed as the connected speed.
    
    sudo ./testusb -a
    high speed      /dev/bus/usb/001/011    0
    /dev/bus/usb/001/011 test 0,    0.000015 secs
    /dev/bus/usb/001/011 test 1,    0.194208 secs
    /dev/bus/usb/001/011 test 2,    0.077289 secs
    /dev/bus/usb/001/011 test 3,    0.170604 secs
    /dev/bus/usb/001/011 test 4,    0.108335 secs
    /dev/bus/usb/001/011 test 5,    2.788076 secs
    /dev/bus/usb/001/011 test 6,    2.594610 secs
    /dev/bus/usb/001/011 test 7,    2.905459 secs
    /dev/bus/usb/001/011 test 8,    2.795193 secs
    /dev/bus/usb/001/011 test 9,    8.372651 secs
    /dev/bus/usb/001/011 test 10,    6.919731 secs
    /dev/bus/usb/001/011 test 11,   16.372687 secs
    /dev/bus/usb/001/011 test 12,   16.375233 secs
    /dev/bus/usb/001/011 test 13,    2.977457 secs
    /dev/bus/usb/001/011 test 14 --> 22 (Invalid argument)
    /dev/bus/usb/001/011 test 17,    0.148826 secs
    /dev/bus/usb/001/011 test 18,    0.068718 secs
    /dev/bus/usb/001/011 test 19,    0.125992 secs
    /dev/bus/usb/001/011 test 20,    0.127477 secs
    /dev/bus/usb/001/011 test 21 --> 22 (Invalid argument)
    /dev/bus/usb/001/011 test 24,    4.133763 secs
    /dev/bus/usb/001/011 test 27,    2.140066 secs
    /dev/bus/usb/001/011 test 28,    2.120713 secs
    /dev/bus/usb/001/011 test 29,    0.507762 secs
    
    Signed-off-by: Faizel K B <faizel.kb@dicortech.com>
    Link: https://lore.kernel.org/r/20210902114444.15106-1-faizel.kb@dicortech.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/tools/usb/testusb.c b/tools/usb/testusb.c
index 2d89b5f686b1..791aadef2d59 100644
--- a/tools/usb/testusb.c
+++ b/tools/usb/testusb.c
@@ -278,12 +278,6 @@ static int find_testdev(const char *name, const struct stat *sb, int flag)
 	}
 
 	entry->ifnum = ifnum;
-
-	/* FIXME update USBDEVFS_CONNECTINFO so it tells about high speed etc */
-
-	fprintf(stderr, "%s speed\t%s\t%u\n",
-		speed(entry->speed), entry->name, entry->ifnum);
-
 	entry->next = testdevs;
 	testdevs = entry;
 	return 0;
@@ -312,6 +306,14 @@ static void *handle_testdev (void *arg)
 		return 0;
 	}
 
+	status  =  ioctl(fd, USBDEVFS_GET_SPEED, NULL);
+	if (status < 0)
+		fprintf(stderr, "USBDEVFS_GET_SPEED failed %d\n", status);
+	else
+		dev->speed = status;
+	fprintf(stderr, "%s speed\t%s\t%u\n",
+			speed(dev->speed), dev->name, dev->ifnum);
+
 restart:
 	for (i = 0; i < TEST_CASES; i++) {
 		if (dev->test != -1 && dev->test != i)

commit eadb60bcc2005247d97dcb3becee57aba4024ff4
Author: Ming Lei <ming.lei@redhat.com>
Date:   Mon Sep 6 17:01:12 2021 +0800

    scsi: sd: Free scsi_disk device via put_device()
    
    [ Upstream commit 265dfe8ebbabae7959060bd1c3f75c2473b697ed ]
    
    After a device is initialized via device_initialize() it should be freed
    via put_device(). sd_probe() currently gets this wrong, fix it up.
    
    Link: https://lore.kernel.org/r/20210906090112.531442-1-ming.lei@redhat.com
    Reviewed-by: Bart Van Assche <bvanassche@acm.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Ming Lei <ming.lei@redhat.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 342352d8e7bf..ed3702dadd30 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -3444,15 +3444,16 @@ static int sd_probe(struct device *dev)
 	}
 
 	device_initialize(&sdkp->dev);
-	sdkp->dev.parent = dev;
+	sdkp->dev.parent = get_device(dev);
 	sdkp->dev.class = &sd_disk_class;
 	dev_set_name(&sdkp->dev, "%s", dev_name(dev));
 
 	error = device_add(&sdkp->dev);
-	if (error)
-		goto out_free_index;
+	if (error) {
+		put_device(&sdkp->dev);
+		goto out;
+	}
 
-	get_device(dev);
 	dev_set_drvdata(dev, sdkp);
 
 	get_device(&sdkp->dev);	/* prevent release before async_schedule */

commit 21909f9e0995b80579a1fdc1e857ac2fe5067c4d
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Tue Sep 21 23:32:33 2021 +0300

    ext2: fix sleeping in atomic bugs on error
    
    [ Upstream commit 372d1f3e1bfede719864d0d1fbf3146b1e638c88 ]
    
    The ext2_error() function syncs the filesystem so it sleeps.  The caller
    is holding a spinlock so it's not allowed to sleep.
    
       ext2_statfs() <- disables preempt
       -> ext2_count_free_blocks()
          -> ext2_get_group_desc()
    
    Fix this by using WARN() to print an error message and a stack trace
    instead of using ext2_error().
    
    Link: https://lore.kernel.org/r/20210921203233.GA16529@kili
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c
index 33db13365c5e..fc59e0557e50 100644
--- a/fs/ext2/balloc.c
+++ b/fs/ext2/balloc.c
@@ -48,10 +48,9 @@ struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb,
 	struct ext2_sb_info *sbi = EXT2_SB(sb);
 
 	if (block_group >= sbi->s_groups_count) {
-		ext2_error (sb, "ext2_get_group_desc",
-			    "block_group >= groups_count - "
-			    "block_group = %d, groups_count = %lu",
-			    block_group, sbi->s_groups_count);
+		WARN(1, "block_group >= groups_count - "
+		     "block_group = %d, groups_count = %lu",
+		     block_group, sbi->s_groups_count);
 
 		return NULL;
 	}
@@ -59,10 +58,9 @@ struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb,
 	group_desc = block_group >> EXT2_DESC_PER_BLOCK_BITS(sb);
 	offset = block_group & (EXT2_DESC_PER_BLOCK(sb) - 1);
 	if (!sbi->s_group_desc[group_desc]) {
-		ext2_error (sb, "ext2_get_group_desc",
-			    "Group descriptor not loaded - "
-			    "block_group = %d, group_desc = %lu, desc = %lu",
-			     block_group, group_desc, offset);
+		WARN(1, "Group descriptor not loaded - "
+		     "block_group = %d, group_desc = %lu, desc = %lu",
+		      block_group, group_desc, offset);
 		return NULL;
 	}
 

commit ce53b91e974d7b87fe8a457c2431d050466de87e
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date:   Mon Sep 20 10:56:32 2021 -0700

    sparc64: fix pci_iounmap() when CONFIG_PCI is not set
    
    [ Upstream commit d8b1e10a2b8efaf71d151aa756052fbf2f3b6d57 ]
    
    Guenter reported [1] that the pci_iounmap() changes remain problematic,
    with sparc64 allnoconfig and tinyconfig still not building due to the
    header file changes and confusion with the arch-specific pci_iounmap()
    implementation.
    
    I'm pretty convinced that sparc should just use GENERIC_IOMAP instead of
    doing its own thing, since it turns out that the sparc64 version of
    pci_iounmap() is somewhat buggy (see [2]).  But in the meantime, this
    just fixes the build by avoiding the trivial re-definition of the empty
    case.
    
    Link: https://lore.kernel.org/lkml/20210920134424.GA346531@roeck-us.net/ [1]
    Link: https://lore.kernel.org/lkml/CAHk-=wgheheFx9myQyy5osh79BAazvmvYURAtub2gQtMvLrhqQ@mail.gmail.com/ [2]
    Reported-by: Guenter Roeck <linux@roeck-us.net>
    Cc: David Miller <davem@davemloft.net>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/sparc/lib/iomap.c b/arch/sparc/lib/iomap.c
index c9da9f139694..f3a8cd491ce0 100644
--- a/arch/sparc/lib/iomap.c
+++ b/arch/sparc/lib/iomap.c
@@ -19,8 +19,10 @@ void ioport_unmap(void __iomem *addr)
 EXPORT_SYMBOL(ioport_map);
 EXPORT_SYMBOL(ioport_unmap);
 
+#ifdef CONFIG_PCI
 void pci_iounmap(struct pci_dev *dev, void __iomem * addr)
 {
 	/* nothing to do */
 }
 EXPORT_SYMBOL(pci_iounmap);
+#endif

commit 75b975ebffbb439729e08bce2675e0db539d3e45
Author: Jan Beulich <jbeulich@suse.com>
Date:   Fri Sep 17 08:27:10 2021 +0200

    xen-netback: correct success/error reporting for the SKB-with-fraglist case
    
    [ Upstream commit 3ede7f84c7c21f93c5eac611d60eba3f2c765e0f ]
    
    When re-entering the main loop of xenvif_tx_check_gop() a 2nd time, the
    special considerations for the head of the SKB no longer apply. Don't
    mistakenly report ERROR to the frontend for the first entry in the list,
    even if - from all I can tell - this shouldn't matter much as the overall
    transmit will need to be considered failed anyway.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Reviewed-by: Paul Durrant <paul@xen.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
index 41bdfb684d46..4d0d5501ca56 100644
--- a/drivers/net/xen-netback/netback.c
+++ b/drivers/net/xen-netback/netback.c
@@ -492,7 +492,7 @@ static int xenvif_tx_check_gop(struct xenvif_queue *queue,
 				 * the header's copy failed, and they are
 				 * sharing a slot, send an error
 				 */
-				if (i == 0 && sharedslot)
+				if (i == 0 && !first_shinfo && sharedslot)
 					xenvif_idx_release(queue, pending_idx,
 							   XEN_NETIF_RSP_ERROR);
 				else

commit ab3bbb6277caf0cb47d68200b1a38246c2a8bddb
Author: Vladimir Oltean <vladimir.oltean@nxp.com>
Date:   Fri Sep 17 16:34:32 2021 +0300

    net: mdio: introduce a shutdown method to mdio device drivers
    
    [ Upstream commit cf9579976f724ad517cc15b7caadea728c7e245c ]
    
    MDIO-attached devices might have interrupts and other things that might
    need quiesced when we kexec into a new kernel. Things are even more
    creepy when those interrupt lines are shared, and in that case it is
    absolutely mandatory to disable all interrupt sources.
    
    Moreover, MDIO devices might be DSA switches, and DSA needs its own
    shutdown method to unlink from the DSA master, which is a new
    requirement that appeared after commit 2f1e8ea726e9 ("net: dsa: link
    interfaces with the DSA master to get rid of lockdep warnings").
    
    So introduce a ->shutdown method in the MDIO device driver structure.
    
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Reviewed-by: Andrew Lunn <andrew@lunn.ch>
    Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/phy/mdio_device.c b/drivers/net/phy/mdio_device.c
index c924700cf37b..922f0f8973b6 100644
--- a/drivers/net/phy/mdio_device.c
+++ b/drivers/net/phy/mdio_device.c
@@ -176,6 +176,16 @@ static int mdio_remove(struct device *dev)
 	return 0;
 }
 
+static void mdio_shutdown(struct device *dev)
+{
+	struct mdio_device *mdiodev = to_mdio_device(dev);
+	struct device_driver *drv = mdiodev->dev.driver;
+	struct mdio_driver *mdiodrv = to_mdio_driver(drv);
+
+	if (mdiodrv->shutdown)
+		mdiodrv->shutdown(mdiodev);
+}
+
 /**
  * mdio_driver_register - register an mdio_driver with the MDIO layer
  * @new_driver: new mdio_driver to register
@@ -190,6 +200,7 @@ int mdio_driver_register(struct mdio_driver *drv)
 	mdiodrv->driver.bus = &mdio_bus_type;
 	mdiodrv->driver.probe = mdio_probe;
 	mdiodrv->driver.remove = mdio_remove;
+	mdiodrv->driver.shutdown = mdio_shutdown;
 
 	retval = driver_register(&mdiodrv->driver);
 	if (retval) {
diff --git a/include/linux/mdio.h b/include/linux/mdio.h
index bfa7114167d7..85325e110a79 100644
--- a/include/linux/mdio.h
+++ b/include/linux/mdio.h
@@ -66,6 +66,9 @@ struct mdio_driver {
 
 	/* Clears up any memory if needed */
 	void (*remove)(struct mdio_device *mdiodev);
+
+	/* Quiesces the device on system shutdown, turns off interrupts etc */
+	void (*shutdown)(struct mdio_device *mdiodev);
 };
 #define to_mdio_driver(d)						\
 	container_of(to_mdio_common_driver(d), struct mdio_driver, mdiodrv)

commit 433f0ced6f4d93923800d59bbcecbbf64f529d87
Author: Elaine Zhang <zhangqing@rock-chips.com>
Date:   Fri Sep 10 17:10:41 2021 +0800

    thermal: rockchip: rv1126: Remove tsadc trim allowance
    
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    Change-Id: Id4aab26d322f933cfb7a36dbdccbb46b6a584ed3

diff --git a/drivers/thermal/rockchip_thermal.c b/drivers/thermal/rockchip_thermal.c
index 782261ce0098..03d87aac4626 100644
--- a/drivers/thermal/rockchip_thermal.c
+++ b/drivers/thermal/rockchip_thermal.c
@@ -1147,7 +1147,7 @@ static int rk_tsadcv1_get_trim_code(struct platform_device *pdev,
 	int trim_code;
 
 	base_code = trim_base * table->kNum / 1000 + table->bNum;
-	trim_code = code - base_code - 10;
+	trim_code = code - base_code;
 
 	return trim_code;
 }

commit 12ae35d5bf0ccca362b7d65450e67d377e7820e5
Author: Mark Huang <huangjc@rock-chips.com>
Date:   Sat Oct 2 12:26:31 2021 +0800

    ARM: configs: Add rv1126-uvc-spi-nor.config for uvc
    
    make ARCH=arm rv1126_defconfig rv1126-uvc-spi-nor.config
    
    Change-Id: Ie3258ecf353d1c3430a10909a4da66e2cce109eb
    Signed-off-by: Mark Huang <huangjc@rock-chips.com>

diff --git a/arch/arm/configs/rv1126-uvc-spi-nor.config b/arch/arm/configs/rv1126-uvc-spi-nor.config
new file mode 100644
index 000000000000..56ede6ed9395
--- /dev/null
+++ b/arch/arm/configs/rv1126-uvc-spi-nor.config
@@ -0,0 +1,47 @@
+# CONFIG_BT is not set
+# CONFIG_ETHERNET is not set
+# CONFIG_EXT4_FS is not set
+# CONFIG_HID is not set
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+CONFIG_JFFS2_FS=y
+# CONFIG_KERNEL_LZ4 is not set
+CONFIG_KERNEL_XZ=y
+CONFIG_MMC_DW=m
+CONFIG_MMC_DW_PLTFM=m
+CONFIG_MMC_DW_ROCKCHIP=m
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_UBI=m
+# CONFIG_NTFS_FS is not set
+CONFIG_PANIC_TIMEOUT=2
+# CONFIG_PERF_EVENTS is not set
+# CONFIG_PHYLIB is not set
+# CONFIG_RFKILL is not set
+# CONFIG_RK_SFC_NAND is not set
+# CONFIG_ROCKCHIP_DW_MIPI_DSI is not set
+# CONFIG_ROCKCHIP_RGB is not set
+# CONFIG_SCSI is not set
+# CONFIG_SQUASHFS_LZ4 is not set
+# CONFIG_SWAP is not set
+# CONFIG_TEE is not set
+# CONFIG_UBIFS_FS is not set
+# CONFIG_USB is not set
+CONFIG_USB_DWC3_GADGET=y
+# CONFIG_VFAT_FS is not set
+# CONFIG_VIDEO_GC4C33 is not set
+# CONFIG_VIDEO_IMX347 is not set
+# CONFIG_VIDEO_IMX378 is not set
+# CONFIG_VIDEO_OS04A10 is not set
+# CONFIG_VIDEO_OV4689 is not set
+# CONFIG_WIRELESS is not set
+# CONFIG_WLAN is not set
+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+CONFIG_JFFS2_FS_DEBUG=0
+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_FS_XATTR is not set
+CONFIG_JFFS2_RTIME=y
+# CONFIG_JFFS2_SUMMARY is not set
+CONFIG_JFFS2_ZLIB=y
+CONFIG_MTD_BLKDEVS=y
+CONFIG_ZLIB_DEFLATE=y

commit 715b9488cdc1e992e830ea46cdf8e64a200c24ad
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Fri Oct 1 22:55:07 2021 +0800

    media: rockchip: cif fix issue for CONFIG_ROCKCHIP_IOMMU=n
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I6914ac32bcef7c56eabe6bef9b9acce68615cbc7

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index 96a90ff9bfd9..4eeea1cb100c 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -2344,8 +2344,8 @@ static void rkcif_do_cru_reset(struct rkcif_device *dev)
 
 		domain = iommu_get_domain_for_dev(cif_hw->dev);
 		if (domain) {
-			domain->ops->detach_dev(domain, cif_hw->dev);
-			domain->ops->attach_dev(domain, cif_hw->dev);
+			iommu_detach_device(domain, cif_hw->dev);
+			iommu_attach_device(domain, cif_hw->dev);
 		}
 	}
 }
diff --git a/drivers/media/platform/rockchip/cif/hw.c b/drivers/media/platform/rockchip/cif/hw.c
index 678305522b78..f003ecea97cc 100644
--- a/drivers/media/platform/rockchip/cif/hw.c
+++ b/drivers/media/platform/rockchip/cif/hw.c
@@ -781,7 +781,7 @@ int rkcif_enable_sys_clk(struct rkcif_hw *cif_hw)
 static void rkcif_iommu_cleanup(struct rkcif_hw *cif_hw)
 {
 	if (cif_hw->domain)
-		cif_hw->domain->ops->detach_dev(cif_hw->domain, cif_hw->dev);
+		iommu_detach_device(cif_hw->domain, cif_hw->dev);
 }
 
 static void rkcif_iommu_enable(struct rkcif_hw *cif_hw)
@@ -790,7 +790,7 @@ static void rkcif_iommu_enable(struct rkcif_hw *cif_hw)
 		cif_hw->domain = iommu_get_domain_for_dev(cif_hw->dev);
 
 	if (cif_hw->domain)
-		cif_hw->domain->ops->attach_dev(cif_hw->domain, cif_hw->dev);
+		iommu_attach_device(cif_hw->domain, cif_hw->dev);
 }
 
 static inline bool is_iommu_enable(struct device *dev)

commit 0adfae22a68b435eccd97a1ecb2330de93cfd497
Author: Yiqing Zeng <zack.zeng@rock-chips.com>
Date:   Wed Sep 29 16:13:28 2021 +0800

    media: rockchip: cif: fix pm runtime error
    
    at a high frame rate (120fps), the fast switch test has a higher probability of the following errors:
    Failed to get runtime pm, -22
    
    Signed-off-by: Yiqing Zeng <zack.zeng@rock-chips.com>
    Change-Id: I6d9fdd86cc69368ba340ab7e43d2b6030a72ce8c

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index e8be068bf399..96a90ff9bfd9 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -2479,7 +2479,7 @@ static void rkcif_stop_streaming(struct vb2_queue *queue)
 		dev->can_be_reset = false;
 		dev->reset_work_cancel = true;
 	}
-	pm_runtime_put(dev->dev);
+	pm_runtime_put_sync(dev->dev);
 
 	if (!atomic_read(&dev->pipe.stream_cnt) && dev->dummy_buf.vaddr)
 		rkcif_destroy_dummy_buf(stream);
@@ -3177,7 +3177,7 @@ static int rkcif_start_streaming(struct vb2_queue *queue, unsigned int count)
 pipe_stream_off:
 	dev->pipe.set_stream(&dev->pipe, false);
 runtime_put:
-	pm_runtime_put(dev->dev);
+	pm_runtime_put_sync(dev->dev);
 destroy_buf:
 	if (stream->next_buf)
 		vb2_buffer_done(&stream->next_buf->vb.vb2_buf,
diff --git a/drivers/media/platform/rockchip/cif/dev.c b/drivers/media/platform/rockchip/cif/dev.c
index 445a3ca864e7..8c66d1704249 100644
--- a/drivers/media/platform/rockchip/cif/dev.c
+++ b/drivers/media/platform/rockchip/cif/dev.c
@@ -1309,21 +1309,28 @@ static int rkcif_plat_remove(struct platform_device *pdev)
 static int __maybe_unused rkcif_runtime_suspend(struct device *dev)
 {
 	struct rkcif_device *cif_dev = dev_get_drvdata(dev);
+	int ret = 0;
 
 	if (atomic_dec_return(&cif_dev->hw_dev->power_cnt))
 		return 0;
 
-	return pm_runtime_put(cif_dev->hw_dev->dev);
+	mutex_lock(&cif_dev->hw_dev->dev_lock);
+	ret = pm_runtime_put_sync(cif_dev->hw_dev->dev);
+	mutex_unlock(&cif_dev->hw_dev->dev_lock);
+	return (ret > 0) ? 0 : ret;
 }
 
 static int __maybe_unused rkcif_runtime_resume(struct device *dev)
 {
 	struct rkcif_device *cif_dev = dev_get_drvdata(dev);
+	int ret = 0;
 
 	if (atomic_inc_return(&cif_dev->hw_dev->power_cnt) > 1)
 		return 0;
-
-	return pm_runtime_get_sync(cif_dev->hw_dev->dev);
+	mutex_lock(&cif_dev->hw_dev->dev_lock);
+	ret = pm_runtime_get_sync(cif_dev->hw_dev->dev);
+	mutex_unlock(&cif_dev->hw_dev->dev_lock);
+	return (ret > 0) ? 0 : ret;
 }
 
 static int __maybe_unused __rkcif_clr_unready_dev(void)
diff --git a/drivers/media/platform/rockchip/cif/hw.c b/drivers/media/platform/rockchip/cif/hw.c
index 8eb1059d18c2..678305522b78 100644
--- a/drivers/media/platform/rockchip/cif/hw.c
+++ b/drivers/media/platform/rockchip/cif/hw.c
@@ -958,6 +958,8 @@ static int rkcif_plat_hw_probe(struct platform_device *pdev)
 
 	rkcif_hw_soft_reset(cif_hw, true);
 
+	mutex_init(&cif_hw->dev_lock);
+
 	pm_runtime_enable(&pdev->dev);
 
 	if (data->chip_id == CHIP_RK1808_CIF ||
@@ -978,6 +980,7 @@ static int rkcif_plat_remove(struct platform_device *pdev)
 	if (cif_hw->iommu_en)
 		rkcif_iommu_cleanup(cif_hw);
 
+	mutex_destroy(&cif_hw->dev_lock);
 	if (cif_hw->chip_id != CHIP_RK1808_CIF &&
 	    cif_hw->chip_id != CHIP_RV1126_CIF &&
 	    cif_hw->chip_id != CHIP_RV1126_CIF_LITE &&
diff --git a/drivers/media/platform/rockchip/cif/hw.h b/drivers/media/platform/rockchip/cif/hw.h
index 82adfd185f00..573abe48c8b9 100644
--- a/drivers/media/platform/rockchip/cif/hw.h
+++ b/drivers/media/platform/rockchip/cif/hw.h
@@ -84,6 +84,7 @@ struct rkcif_hw {
 
 	atomic_t power_cnt;
 	const struct rkcif_hw_match_data *match_data;
+	struct mutex			dev_lock;
 };
 
 void rkcif_hw_soft_reset(struct rkcif_hw *cif_hw, bool is_rst_iommu);

commit 53b650ce438418202fdb73875a9b2f718f5225fc
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Fri Sep 24 11:04:33 2021 +0800

    media: rockchip: when cif triggers a reset, redefine the timer after reset
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I3dd12ba2d5f1a6d5a4f77e70b756aba9eaaea98f

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index 55e09f5b1d89..e8be068bf399 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -5497,7 +5497,7 @@ void rkcif_reset_work(struct work_struct *work)
 	ret = rkcif_do_reset_work(dev, reset_work->reset_src);
 	if (ret)
 		v4l2_info(&dev->v4l2_dev, "do reset work failed!\n");
-
+	timer->is_running = false;
 	timer->has_been_init = false;
 }
 
@@ -5578,7 +5578,7 @@ static void rkcif_init_reset_work(struct rkcif_timer *timer)
 		  timer->run_cnt, timer->reset_src);
 
 	spin_lock_irqsave(&timer->timer_lock, flags);
-	timer->is_running = false;
+	timer->is_running = true;
 	timer->is_triggered = false;
 	timer->csi2_err_cnt_odd = 0;
 	timer->csi2_err_cnt_even = 0;

commit 8ad9944539ddeba44f62ccb111c3767318159b3e
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Thu Sep 23 21:47:40 2021 +0800

    media: rockchip: cif optimized buf rotation
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I2e188e2709e20a31eb060ee752de31653eab99df

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index 51b523f4abfb..55e09f5b1d89 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -1463,6 +1463,7 @@ static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
 		}
 
 	}
+	stream->frame_phase_cache = stream->frame_phase;
 	spin_unlock_irqrestore(&stream->vbq_lock, flags);
 
 	if (buffer) {
@@ -1529,10 +1530,13 @@ static int rkcif_get_new_buffer_wake_up_mode(struct rkcif_stream *stream)
 			else
 				stream->next_buf = NULL;
 		} else if (stream->curr_buf != stream->next_buf) {
-			if (stream->line_int_cnt % 2)
+			if (stream->line_int_cnt % 2) {
 				stream->curr_buf = stream->next_buf;
-			else
+				stream->frame_phase_cache = CIF_CSI_FRAME0_READY;
+			} else {
 				stream->next_buf = stream->curr_buf;
+				stream->frame_phase_cache = CIF_CSI_FRAME1_READY;
+			}
 			stream->is_buf_active = true;
 		} else {
 			ret = -EINVAL;
@@ -1552,6 +1556,7 @@ static int rkcif_update_new_buffer_wake_up_mode(struct rkcif_stream *stream)
 	u32 frm_addr_y, frm_addr_uv;
 	int channel_id = stream->id;
 	int ret = 0;
+	unsigned long flags;
 
 	if (mbus_cfg->type == V4L2_MBUS_CSI2 ||
 	    mbus_cfg->type == V4L2_MBUS_CCP2) {
@@ -1569,14 +1574,14 @@ static int rkcif_update_new_buffer_wake_up_mode(struct rkcif_stream *stream)
 			      get_dvp_reg_index_of_frm0_uv_addr(channel_id) :
 			      get_dvp_reg_index_of_frm1_uv_addr(channel_id);
 	}
-
+	spin_lock_irqsave(&stream->vbq_lock, flags);
 	if (stream->is_buf_active) {
 		if (stream->frame_phase == CIF_CSI_FRAME0_READY)
 			buffer = stream->curr_buf;
 		else if (stream->frame_phase == CIF_CSI_FRAME1_READY)
 			buffer = stream->next_buf;
 	}
-
+	spin_unlock_irqrestore(&stream->vbq_lock, flags);
 	if (buffer) {
 		rkcif_write_register(dev, frm_addr_y,
 				     buffer->buff_addr[RKCIF_PLANE_Y]);
@@ -2117,6 +2122,87 @@ static int rkcif_queue_setup(struct vb2_queue *queue,
 	return 0;
 }
 
+static void rkcif_check_buffer_update_pingpong(struct rkcif_stream *stream,
+					   int channel_id)
+{
+	struct rkcif_device *dev = stream->cifdev;
+	struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus;
+	struct rkcif_buffer *buffer = NULL;
+	struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf;
+	u32 frm_addr_y, frm_addr_uv;
+	unsigned long flags;
+
+	if (stream->state == RKCIF_STATE_STREAMING &&
+	    stream->curr_buf == stream->next_buf &&
+	    stream->cif_fmt_in->field != V4L2_FIELD_INTERLACED  &&
+	    (!dummy_buf->vaddr)) {
+		if (!stream->is_line_wake_up) {
+			if (mbus_cfg->type == V4L2_MBUS_CSI2 ||
+			    mbus_cfg->type == V4L2_MBUS_CCP2) {
+				frm_addr_y = stream->frame_phase_cache & CIF_CSI_FRAME0_READY ?
+					     get_reg_index_of_frm0_y_addr(channel_id) :
+					     get_reg_index_of_frm1_y_addr(channel_id);
+				frm_addr_uv = stream->frame_phase_cache & CIF_CSI_FRAME0_READY ?
+					      get_reg_index_of_frm0_uv_addr(channel_id) :
+					      get_reg_index_of_frm1_uv_addr(channel_id);
+			} else {
+				frm_addr_y = stream->frame_phase_cache & CIF_CSI_FRAME0_READY ?
+					     get_dvp_reg_index_of_frm0_y_addr(channel_id) :
+					     get_dvp_reg_index_of_frm1_y_addr(channel_id);
+				frm_addr_uv = stream->frame_phase_cache & CIF_CSI_FRAME0_READY ?
+					      get_dvp_reg_index_of_frm0_uv_addr(channel_id) :
+					      get_dvp_reg_index_of_frm1_uv_addr(channel_id);
+			}
+			v4l2_dbg(1, rkcif_debug, &stream->cifdev->v4l2_dev,
+				"stream[%d] update buf in %s, stream->frame_phase_cache %d\n",
+				stream->id, __func__, stream->frame_phase_cache);
+			spin_lock_irqsave(&stream->vbq_lock, flags);
+			if (!list_empty(&stream->buf_head)) {
+				if (stream->frame_phase_cache == CIF_CSI_FRAME0_READY) {
+					stream->curr_buf = list_first_entry(&stream->buf_head,
+									    struct rkcif_buffer, queue);
+					if (stream->curr_buf) {
+						list_del(&stream->curr_buf->queue);
+						buffer = stream->curr_buf;
+					}
+				} else if (stream->frame_phase_cache == CIF_CSI_FRAME1_READY) {
+					stream->next_buf = list_first_entry(&stream->buf_head,
+									    struct rkcif_buffer, queue);
+					if (stream->next_buf) {
+						list_del(&stream->next_buf->queue);
+						buffer = stream->next_buf;
+					}
+				}
+			}
+			spin_unlock_irqrestore(&stream->vbq_lock, flags);
+			if (buffer) {
+				rkcif_write_register(dev, frm_addr_y,
+						     buffer->buff_addr[RKCIF_PLANE_Y]);
+				if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
+					rkcif_write_register(dev, frm_addr_uv,
+							     buffer->buff_addr[RKCIF_PLANE_CBCR]);
+			}
+		} else {
+			spin_lock_irqsave(&stream->vbq_lock, flags);
+			if (stream->curr_buf == stream->next_buf) {
+				if (stream->frame_phase_cache == CIF_CSI_FRAME0_READY) {
+					stream->curr_buf = list_first_entry(&stream->buf_head,
+									    struct rkcif_buffer, queue);
+					if (stream->curr_buf)
+						list_del(&stream->curr_buf->queue);
+				} else if (stream->frame_phase_cache == CIF_CSI_FRAME1_READY) {
+					stream->next_buf = list_first_entry(&stream->buf_head,
+									    struct rkcif_buffer, queue);
+					if (stream->next_buf)
+						list_del(&stream->next_buf->queue);
+				}
+				stream->is_buf_active = true;
+			}
+			spin_unlock_irqrestore(&stream->vbq_lock, flags);
+		}
+	}
+}
+
 /*
  * The vb2_buffer are stored in rkcif_buffer, in order to unify
  * mplane buffer and none-mplane buffer.
@@ -2163,6 +2249,8 @@ static void rkcif_buf_queue(struct vb2_buffer *vb)
 	spin_lock_irqsave(&stream->vbq_lock, flags);
 	list_add_tail(&cifbuf->queue, &stream->buf_head);
 	spin_unlock_irqrestore(&stream->vbq_lock, flags);
+	if (stream->cifdev->workmode == RKCIF_WORKMODE_PINGPONG)
+		rkcif_check_buffer_update_pingpong(stream, stream->id);
 	v4l2_dbg(1, rkcif_debug, &stream->cifdev->v4l2_dev,
 		 "stream[%d] buf queue, index: %d\n",
 		 stream->id, vb->index);
diff --git a/drivers/media/platform/rockchip/cif/dev.h b/drivers/media/platform/rockchip/cif/dev.h
index 812432f1cc2f..9b4573fac866 100644
--- a/drivers/media/platform/rockchip/cif/dev.h
+++ b/drivers/media/platform/rockchip/cif/dev.h
@@ -415,6 +415,7 @@ struct rkcif_stream {
 	wait_queue_head_t		wq_stopped;
 	unsigned int			frame_idx;
 	int				frame_phase;
+	int				frame_phase_cache;
 	unsigned int			crop_mask;
 	/* lock between irq and buf_queue */
 	struct list_head		buf_head;

commit 01b5b14d417850ef066a041d516b5d23b8870f8e
Author: Shunqian Zheng <zhengsq@rock-chips.com>
Date:   Sat Oct 2 16:08:55 2021 +0800

    arm64: config: add robot diffconfig for rk356x
    
    It mainly changes:
     - Use preempt for lower latency
     - Enable MTD flash driver
     - Hung task detection and panic
     - Disable configs: FB, HDMI, ETHERNET etc.
    
    Signed-off-by: Shunqian Zheng <zhengsq@rock-chips.com>
    Change-Id: I32816151c01638530b6a429cdc875aced4ee05e0

diff --git a/arch/arm64/configs/rk356x_robot.config b/arch/arm64/configs/rk356x_robot.config
new file mode 100644
index 000000000000..0156216ec9de
--- /dev/null
+++ b/arch/arm64/configs/rk356x_robot.config
@@ -0,0 +1,136 @@
+# CONFIG_ATA is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+# CONFIG_BATTERY_SBS is not set
+# CONFIG_CGROUPS is not set
+# CONFIG_CHARGER_BQ24735 is not set
+# CONFIG_CHROME_PLATFORMS is not set
+CONFIG_DETECT_HUNG_TASK=y
+# CONFIG_DRM_FBDEV_EMULATION is not set
+# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set
+# CONFIG_DRM_ROCKCHIP_RK618 is not set
+# CONFIG_ETHERNET is not set
+# CONFIG_FB is not set
+# CONFIG_FTRACE is not set
+# CONFIG_FUSB_30X is not set
+# CONFIG_FUSE_FS is not set
+# CONFIG_HID_KENSINGTON is not set
+# CONFIG_HID_MULTITOUCH is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_JFFS2_FS is not set
+# CONFIG_LEDS_IS31FL32XX is not set
+# CONFIG_MALI400 is not set
+# CONFIG_MALI_MIDGARD is not set
+# CONFIG_MD is not set
+# CONFIG_MDIO_DEVICE is not set
+# CONFIG_MEDIA_CEC_SUPPORT is not set
+# CONFIG_MEDIA_USB_SUPPORT is not set
+# CONFIG_MFD_CROS_EC is not set
+CONFIG_MTD_NAND=y
+# CONFIG_NAMESPACES is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_NETWORK_FILESYSTEMS is not set
+CONFIG_PANIC_ON_OOPS=y
+CONFIG_PANIC_ON_OOPS_VALUE=1
+CONFIG_PANIC_TIMEOUT=5
+# CONFIG_PCI is not set
+# CONFIG_PHYLIB is not set
+# CONFIG_PHY_ROCKCHIP_DP is not set
+# CONFIG_PHY_ROCKCHIP_INNO_HDMI_PHY is not set
+# CONFIG_PHY_ROCKCHIP_INNO_MIPI_DPHY is not set
+# CONFIG_PHY_ROCKCHIP_INNO_VIDEO_COMBO_PHY is not set
+# CONFIG_PHY_ROCKCHIP_PCIE is not set
+# CONFIG_PHY_ROCKCHIP_SNPS_PCIE3 is not set
+CONFIG_PREEMPT=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_RK_FLASH is not set
+# CONFIG_ROCKCHIP_ANALOGIX_DP is not set
+# CONFIG_ROCKCHIP_CDN_DP is not set
+# CONFIG_ROCKCHIP_DRM_TVE is not set
+# CONFIG_ROCKCHIP_DW_HDMI 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_ONE_INITRD=y
+# CONFIG_ROCKCHIP_REMOTECTL is not set
+# CONFIG_ROCKCHIP_RGB is not set
+# CONFIG_SENSORS_ISL29018 is not set
+# CONFIG_SENSORS_TSL2563 is not set
+# CONFIG_SND_SOC_ES7202 is not set
+# CONFIG_SND_SOC_ES7243E is not set
+# CONFIG_SND_SOC_ES8311 is not set
+# CONFIG_SND_SOC_ES8316 is not set
+# CONFIG_SND_SOC_RK3328 is not set
+# CONFIG_SND_SOC_ROCKCHIP_MAX98090 is not set
+# CONFIG_SND_SOC_ROCKCHIP_RT5645 is not set
+# CONFIG_SND_SOC_RT5616 is not set
+# CONFIG_SND_SOC_RT5640 is not set
+# CONFIG_SND_SOC_TS3A227E is not set
+# CONFIG_SND_USB is not set
+# CONFIG_SOC_CAMERA is not set
+CONFIG_SOFTLOCKUP_DETECTOR=y
+# CONFIG_TSL2583 is not set
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_EZUSB_FX2 is not set
+# CONFIG_USB_HID is not set
+# CONFIG_USB_NET_DRIVERS is not set
+# CONFIG_USB_NET_RNDIS_WLAN is not set
+# CONFIG_USB_SERIAL is not set
+# CONFIG_USB_WDM is not set
+CONFIG_VIDEO_GC2053=y
+# CONFIG_VIDEO_GC8034 is not set
+# CONFIG_VIDEO_OS04A10 is not set
+# CONFIG_VIDEO_OV13850 is not set
+CONFIG_VIDEO_OV2718=y
+# CONFIG_VIDEO_RK628_CSI is not set
+CONFIG_VIDEO_ROCKCHIP_CIF=y
+# CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V1X is not set
+CONFIG_VIDEO_SC031GS=y
+# CONFIG_VIDEO_TC35874X 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_QUANTENNA 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_XFS_FS is not set
+CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y
+CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=1
+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y
+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=1
+CONFIG_DEBUG_PREEMPT=y
+CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
+CONFIG_LOCKUP_DETECTOR=y
+# CONFIG_MTD_NAND_BRCMNAND is not set
+# CONFIG_MTD_NAND_DENALI_DT is not set
+# CONFIG_MTD_NAND_DISKONCHIP is not set
+# CONFIG_MTD_NAND_DOCG4 is not set
+CONFIG_MTD_NAND_ECC=y
+# CONFIG_MTD_NAND_ECC_BCH is not set
+# CONFIG_MTD_NAND_ECC_SMC is not set
+# CONFIG_MTD_NAND_GPIO is not set
+# CONFIG_MTD_NAND_NANDSIM is not set
+# CONFIG_MTD_NAND_PLATFORM is not set
+# CONFIG_MTD_NAND_ROCKCHIP_V6 is not set
+CONFIG_MTD_NAND_ROCKCHIP_V9=y
+# CONFIG_MTD_SPINAND_MT29F is not set
+CONFIG_NO_IOPORT_MAP=y
+CONFIG_PREEMPT_COUNT=y
+CONFIG_PREEMPT_RCU=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_TASKS_RCU=y
+# CONFIG_USB_KBD is not set
+# CONFIG_USB_MOUSE is not set

commit 0b5282ddd838e8daff6b87a89e4ca5bfd8ef717c
Author: William Wu <william.wu@rock-chips.com>
Date:   Fri Oct 8 20:43:32 2021 +0800

    arm64: dts: rockchip: dis u1 and u2 state for rk3568 dwc3 device
    
    According the commit 729dcffd1ed3 ("usb: dwc3: gadget: Add
    support for disabling U1 and U2 entries"), it's necessary
    to disable the U1 and U2 low power state to improve USB 3.0
    performance for mass storage gadget and uvc gadget.
    
    In addition, it can help to avoid the dwc3 wakeup failed
    from U1 or U2 state when connect to the Host USB 3.0 interface.
    
    android_work: sent uevent USB_STATE=CONNECTED
    dwc3 fcc00000.dwc3: failed to send remote wakeup
    dwc3 fcc00000.dwc3: wakeup failed --> -22
    WARNING: CPU: 0 PID: 427 at drivers/usb/dwc3/gadget.c:319 dwc3_send_gadget_ep_cmd+0x198/0x93c
    ...
    Call trace:
     dwc3_send_gadget_ep_cmd+0x198/0x93c
     dwc3_ep0_complete_status+0xe8/0x294
     dwc3_ep0_interrupt+0x2ac/0x3d4
     dwc3_process_event_entry+0x7c/0x610
     dwc3_process_event_buf+0x6c/0x374
     dwc3_thread_interrupt+0x38/0x64
     irq_thread_fn+0x34/0x88
     irq_thread+0x1a4/0x248
     kthread+0x13c/0x344
     ret_from_fork+0x10/0x30
    dwc3 fcc00000.dwc3: failed to send remote wakeup
    android_work: sent uevent USB_STATE=CONFIGURED
    
    Signed-off-by: William Wu <william.wu@rock-chips.com>
    Change-Id: I7887c782a0320abe768079b098eab17ee846dcf6

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index 9e202986d9d0..de5af7e7688b 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -558,6 +558,7 @@
 			resets = <&cru SRST_USB3OTG0>;
 			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;

commit 7216cb1e4bcd70db9e6d85875a263d1d3ca3ebbe
Author: William Wu <william.wu@rock-chips.com>
Date:   Fri Oct 8 20:24:06 2021 +0800

    arm64: dts: rockchip: dis u1 and u2 state for rk3399 dwc3 device
    
    According the commit 729dcffd1ed3 ("usb: dwc3: gadget: Add
    support for disabling U1 and U2 entries"), it's necessary
    to disable the U1 and U2 low power state to improve USB 3.0
    performance for mass storage gadget and uvc gadget.
    
    In addition, it can help to avoid the dwc3 wakeup failed
    from U1 or U2 state when connect to the Host USB 3.0 interface.
    
    android_work: sent uevent USB_STATE=CONNECTED
    dwc3 fcc00000.dwc3: failed to send remote wakeup
    dwc3 fcc00000.dwc3: wakeup failed --> -22
    WARNING: CPU: 0 PID: 427 at drivers/usb/dwc3/gadget.c:319 dwc3_send_gadget_ep_cmd+0x198/0x93c
    ...
    Call trace:
     dwc3_send_gadget_ep_cmd+0x198/0x93c
     dwc3_ep0_complete_status+0xe8/0x294
     dwc3_ep0_interrupt+0x2ac/0x3d4
     dwc3_process_event_entry+0x7c/0x610
     dwc3_process_event_buf+0x6c/0x374
     dwc3_thread_interrupt+0x38/0x64
     irq_thread_fn+0x34/0x88
     irq_thread+0x1a4/0x248
     kthread+0x13c/0x344
     ret_from_fork+0x10/0x30
    dwc3 fcc00000.dwc3: failed to send remote wakeup
    android_work: sent uevent USB_STATE=CONFIGURED
    
    Signed-off-by: William Wu <william.wu@rock-chips.com>
    Change-Id: Ic63ee7852fbe1bcb3563b6dec455c0aee53522f1

diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi
index ec2454309340..a2a08362053b 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi
@@ -470,6 +470,7 @@
 			resets = <&cru SRST_A_USB3_OTG0>;
 			reset-names = "usb3-otg";
 			snps,dis_enblslpm_quirk;
+			snps,dis-u1u2-quirk;
 			snps,dis-u2-freeclk-exists-quirk;
 			snps,dis_u2_susphy_quirk;
 			snps,dis-del-phy-power-chg-quirk;

commit 50cd86fb5571383f3316cc3c3e2d7d6c4eae4629
Author: Shunhua Lan <lsh@rock-chips.com>
Date:   Tue Sep 28 12:08:54 2021 +0800

    media: i2c: rk628csi: adjust mclk use ppm instead of absolute value
    
    Signed-off-by: Shunhua Lan <lsh@rock-chips.com>
    Change-Id: Ia72b9628553e2c754e6d35c366d1ba48feee7023

diff --git a/drivers/media/i2c/rk628_csi.c b/drivers/media/i2c/rk628_csi.c
index 1a42f5fc93bd..2987bb3c9a0b 100644
--- a/drivers/media/i2c/rk628_csi.c
+++ b/drivers/media/i2c/rk628_csi.c
@@ -1296,17 +1296,6 @@ static void rk628_hdmirx_audio_clk_set_rate(struct v4l2_subdev *sd, u32 rate)
 	csi->audio_state.hdmirx_aud_clkrate = rate;
 }
 
-static void rk628_hdmirx_audio_clk_inc_rate(struct v4l2_subdev *sd, int dis)
-{
-	struct rk628_csi *csi = to_csi(sd);
-	u32 hdmirx_aud_clkrate = csi->audio_state.hdmirx_aud_clkrate + dis;
-
-	v4l2_dbg(2, debug, sd, "%s: %u to %u\n",
-		 __func__, csi->audio_state.hdmirx_aud_clkrate, hdmirx_aud_clkrate);
-	clk_set_rate(csi->clk_hdmirx_aud, hdmirx_aud_clkrate);
-	csi->audio_state.hdmirx_aud_clkrate = hdmirx_aud_clkrate;
-}
-
 static void rk628_hdmirx_audio_set_fs(struct v4l2_subdev *sd, u32 fs_audio)
 {
 	struct rk628_csi *csi = to_csi(sd);
@@ -1320,6 +1309,26 @@ static void rk628_hdmirx_audio_set_fs(struct v4l2_subdev *sd, u32 fs_audio)
 	csi->audio_state.fs_audio = fs_audio;
 }
 
+static void rk628_hdmirx_audio_clk_ppm_inc(struct v4l2_subdev *sd, int ppm)
+{
+	struct rk628_csi *csi = to_csi(sd);
+	int delta, rate, inc;
+
+	rate = csi->audio_state.hdmirx_aud_clkrate;
+	if (ppm < 0) {
+		ppm = -ppm;
+		inc = -1;
+	} else
+		inc = 1;
+	delta = (int)div64_u64((uint64_t)rate * ppm + 500000, 1000000);
+	delta *= inc;
+	rate = csi->audio_state.hdmirx_aud_clkrate + delta;
+	v4l2_dbg(2, debug, sd, "%s: %u to %u(delta:%d)\n",
+		 __func__, csi->audio_state.hdmirx_aud_clkrate, rate, delta);
+	clk_set_rate(csi->clk_hdmirx_aud, rate);
+	csi->audio_state.hdmirx_aud_clkrate = rate;
+}
+
 static void rk628_hdmirx_audio_setup(struct v4l2_subdev *sd)
 {
 	struct rk628_csi *csi = to_csi(sd);
@@ -1412,9 +1421,9 @@ static void rk628_csi_delayed_work_audio(struct work_struct *work)
 		csi->audio_present = false;
 
 	if ((cur_state - init_state) > 16 && (cur_state - pre_state) > 0)
-		rk628_hdmirx_audio_clk_inc_rate(sd, 10);
+		rk628_hdmirx_audio_clk_ppm_inc(sd, 10);
 	else if ((cur_state != 0) && (cur_state - init_state) < -16 && (cur_state - pre_state) < 0)
-		rk628_hdmirx_audio_clk_inc_rate(sd, -10);
+		rk628_hdmirx_audio_clk_ppm_inc(sd, -10);
 	audio_state->pre_state = cur_state;
 exit:
 	schedule_delayed_work(&csi->delayed_work_audio, msecs_to_jiffies(1000));

commit cfe05e46c937595ff49f039bccc8f6a6df2250c8
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Fri Oct 8 10:42:37 2021 +0800

    media: rockchip: ispp: fix monitor no working
    
    Change-Id: I13c410af8902f65d5fc855a32c2778e44d369851
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c
index 2400f643b524..cb732d15cb9c 100644
--- a/drivers/media/platform/rockchip/ispp/stream.c
+++ b/drivers/media/platform/rockchip/ispp/stream.c
@@ -1212,6 +1212,7 @@ static int config_modules(struct rkispp_device *dev)
 	dev->stream_vdev.monitor.restart_module = 0;
 	dev->stream_vdev.monitor.is_restart = false;
 	dev->stream_vdev.monitor.retry = 0;
+	dev->stream_vdev.monitor.is_en = rkispp_monitor;
 	init_completion(&dev->stream_vdev.monitor.cmpl);
 
 	ret = config_tnr(dev);
@@ -2379,6 +2380,7 @@ static void restart_module(struct rkispp_device *dev)
 		 "%s enter\n", __func__);
 	if (dev->ispp_sdev.state == ISPP_STOP || monitor->retry > 3) {
 		monitor->is_restart = false;
+		monitor->is_en = false;
 		goto end;
 	}
 	if (monitor->monitoring_module)
@@ -2386,6 +2388,7 @@ static void restart_module(struct rkispp_device *dev)
 					    msecs_to_jiffies(500));
 	if (dev->ispp_sdev.state == ISPP_STOP) {
 		monitor->is_restart = false;
+		monitor->is_en = false;
 		goto end;
 	}
 
@@ -2469,18 +2472,18 @@ static void restart_monitor(struct work_struct *work)
 
 	v4l2_dbg(1, rkispp_debug, &dev->v4l2_dev,
 		 "%s module:0x%x enter\n", __func__, m_monitor->module);
-	while (monitor->is_en && dev->ispp_sdev.state != ISPP_STOP) {
+	while (monitor->is_en) {
 		/* max timeout for module idle */
 		time = MAX_SCHEDULE_TIMEOUT;
 		if (monitor->monitoring_module & m_monitor->module)
 			time = (m_monitor->time <= 0 ? 300 : m_monitor->time) + 150;
 		ret = wait_for_completion_timeout(&m_monitor->cmpl,
 						  msecs_to_jiffies(time));
+		if (dev->hw_dev->is_shutdown || dev->ispp_sdev.state == ISPP_STOP)
+			break;
 		if (!(monitor->monitoring_module & m_monitor->module) ||
 		    ret || !monitor->is_en)
 			continue;
-		if (dev->hw_dev->is_shutdown || dev->ispp_sdev.state == ISPP_STOP)
-			break;
 		v4l2_dbg(1, rkispp_debug, &dev->v4l2_dev,
 			 "module:0x%x wait %ldms timeout ret:%d, monitoring:0x%x\n",
 			 m_monitor->module, time, ret, monitor->monitoring_module);

commit 5e30baa651e46e5eb20f8b53904de38271692f32
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Fri Oct 8 10:13:03 2021 +0800

    media: rockchip: isp: unregister dmarx at driver remove
    
    Change-Id: I1146e5c81445980f456bc2ff19810c0ae84d2c7b
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/dev.c b/drivers/media/platform/rockchip/isp/dev.c
index 30687acfa0ce..b04d65593c38 100644
--- a/drivers/media/platform/rockchip/isp/dev.c
+++ b/drivers/media/platform/rockchip/isp/dev.c
@@ -811,6 +811,7 @@ static int rkisp_plat_remove(struct platform_device *pdev)
 	rkisp_unregister_luma_vdev(&isp_dev->luma_vdev);
 	rkisp_unregister_params_vdev(&isp_dev->params_vdev);
 	rkisp_unregister_stats_vdev(&isp_dev->stats_vdev);
+	rkisp_unregister_dmarx_vdev(isp_dev);
 	rkisp_unregister_stream_vdevs(isp_dev);
 	rkisp_unregister_bridge_subdev(isp_dev);
 	rkisp_unregister_csi_subdev(isp_dev);

commit d49f43aafc6bba21441295b18ff16aa9f8f60cd2
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Thu Sep 30 08:36:55 2021 +0800

    media: rockchip: ispp: disable scl dma write if no output buffer
    
    Change-Id: I11bbc17dad564510c7cbd37d4ad357f81fe1ecf2
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c
index cae472cf0697..2400f643b524 100644
--- a/drivers/media/platform/rockchip/ispp/stream.c
+++ b/drivers/media/platform/rockchip/ispp/stream.c
@@ -346,7 +346,8 @@ static void check_to_force_update(struct rkispp_device *dev, u32 mis_val)
 	/* wait nr_shp/fec/scl idle */
 	for (i = STREAM_S0; i <= STREAM_S2; i++) {
 		stream = &vdev->stream[i];
-		if (stream->is_upd && !is_fec_en)
+		if (stream->is_upd && !is_fec_en &&
+		    rkispp_read(dev, stream->config->reg.ctrl) & SW_SCL_ENABLE)
 			mask |= stream->config->frame_end_id;
 	}
 
@@ -2628,6 +2629,8 @@ static void fec_work_event(struct rkispp_device *dev,
 			rkispp_update_regs(dev, RKISPP_FEC, RKISPP_FEC_CROP);
 		writel(FEC_FORCE_UPD, base + RKISPP_CTRL_UPDATE);
 		if (vdev->nr.is_end) {
+			if (!dev->hw_dev->is_single)
+				rkispp_update_regs(dev, RKISPP_SCL0_CTRL, RKISPP_SCL2_FACTOR);
 			writel(OTHER_FORCE_UPD, base + RKISPP_CTRL_UPDATE);
 			/* check scale stream stop state */
 			for (val = STREAM_S0; val <= STREAM_S2; val++) {
@@ -2923,8 +2926,12 @@ static void nr_work_event(struct rkispp_device *dev,
 			if (!stream->streaming || !stream->is_cfg || stream->curr_buf)
 				continue;
 			get_stream_buf(stream);
-			if (stream->curr_buf)
+			if (stream->curr_buf) {
 				update_mi(stream);
+				rkispp_set_bits(dev, stream->config->reg.ctrl, 0, SW_SCL_ENABLE);
+			} else {
+				rkispp_clear_bits(dev, stream->config->reg.ctrl, SW_SCL_ENABLE);
+			}
 		}
 
 		if (!dev->hw_dev->is_single) {
@@ -2951,8 +2958,16 @@ static void nr_work_event(struct rkispp_device *dev,
 
 		for (val = STREAM_S0; val <= STREAM_S2 && !is_fec_en; val++) {
 			stream = &vdev->stream[val];
-			if (stream->stopping && stream->ops->stop)
-				stream->ops->stop(stream);
+			/* check scale stream stop state */
+			if (stream->streaming && stream->stopping) {
+				if (stream->ops->is_stopped(stream)) {
+					stream->stopping = false;
+					stream->streaming = false;
+					wake_up(&stream->done);
+				} else {
+					stream->ops->stop(stream);
+				}
+			}
 		}
 
 		vdev->nr.dbg.id = seq;

commit 054b6994571864eec545924166e5ae2bb5c23596
Author: Shunqian Zheng <zhengsq@rock-chips.com>
Date:   Wed May 26 17:25:54 2021 +0800

    iio: imu: inv_icm42600: fix build error
    
    Icm42600 was backported from upstream kernel.
    Let icm24600 adopt kernel version 4.19 with minimal changes.
    
    Signed-off-by: Shunqian Zheng <zhengsq@rock-chips.com>
    Change-Id: I5d4717bdd2e8d04732015d01a9587868165fea9a

diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600.h b/drivers/iio/imu/inv_icm42600/inv_icm42600.h
index c0f5059b13b3..236f4648c5eb 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600.h
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600.h
@@ -362,7 +362,7 @@ extern const struct regmap_config inv_icm42600_regmap_config;
 extern const struct dev_pm_ops inv_icm42600_pm_ops;
 
 const struct iio_mount_matrix *
-inv_icm42600_get_mount_matrix(const struct iio_dev *indio_dev,
+inv_icm42600_get_mount_matrix(struct iio_dev *indio_dev,
 			      const struct iio_chan_spec *chan);
 
 uint32_t inv_icm42600_odr_to_period(enum inv_icm42600_odr odr);
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
index 8bd77185ccb7..c49dc7e906c2 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
@@ -90,10 +90,10 @@ static const struct inv_icm42600_hw inv_icm42600_hw[INV_CHIP_NB] = {
 };
 
 const struct iio_mount_matrix *
-inv_icm42600_get_mount_matrix(const struct iio_dev *indio_dev,
+inv_icm42600_get_mount_matrix(struct iio_dev *indio_dev,
 			      const struct iio_chan_spec *chan)
 {
-	const struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
 
 	return &st->orientation;
 }
@@ -592,7 +592,7 @@ int inv_icm42600_core_probe(struct regmap *regmap, int chip, int irq,
 	st->chip = chip;
 	st->map = regmap;
 
-	ret = iio_read_mount_matrix(dev, "mount-matrix", &st->orientation);
+	ret = of_iio_read_mount_matrix(dev, "mount-matrix", &st->orientation);
 	if (ret) {
 		dev_err(dev, "failed to retrieve mounting matrix %d\n", ret);
 		return ret;

commit 419a3fb68ecec03f10e13bd8902dff3da1d37ef3
Author: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
Date:   Mon Jun 22 17:37:28 2020 +0200

    UPSTREAM: dt-bindings: iio: imu: Add inv_icm42600 documentation
    
    Document the ICM-426xxx devices devicetree bindings.
    
    Signed-off-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
    Reviewed-by: Rob Herring <robh@kernel.org>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    (cherry picked from commit 45924b8fd2c9e0e9bc2cc97e64494f91a48c0984)
    Signed-off-by: Shunqian Zheng <zhengsq@rock-chips.com>
    Change-Id: I435c2c10d5d9e71215a034afa30c11c491883f0a

diff --git a/Documentation/devicetree/bindings/iio/imu/invensense,icm42600.yaml b/Documentation/devicetree/bindings/iio/imu/invensense,icm42600.yaml
new file mode 100644
index 000000000000..abd8d25e1136
--- /dev/null
+++ b/Documentation/devicetree/bindings/iio/imu/invensense,icm42600.yaml
@@ -0,0 +1,90 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/iio/imu/invensense,icm42600.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: InvenSense ICM-426xx Inertial Measurement Unit
+
+maintainers:
+  - Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
+
+description: |
+  6-axis MotionTracking device that combines a 3-axis gyroscope and a 3-axis
+  accelerometer.
+
+  It has a configurable host interface that supports I3C, I2C and SPI serial
+  communication, features a 2kB FIFO and 2 programmable interrupts with
+  ultra-low-power wake-on-motion support to minimize system power consumption.
+
+  Other industry-leading features include InvenSense on-chip APEX Motion
+  Processing engine for gesture recognition, activity classification, and
+  pedometer, along with programmable digital filters, and an embedded
+  temperature sensor.
+
+  https://invensense.tdk.com/wp-content/uploads/2020/03/DS-000292-ICM-42605-v1.4.pdf
+
+properties:
+  compatible:
+    enum:
+      - invensense,icm42600
+      - invensense,icm42602
+      - invensense,icm42605
+      - invensense,icm42622
+
+  reg:
+    maxItems: 1
+
+  interrupts:
+    maxItems: 1
+
+  drive-open-drain:
+    type: boolean
+
+  vdd-supply:
+    description: Regulator that provides power to the sensor
+
+  vddio-supply:
+    description: Regulator that provides power to the bus
+
+required:
+  - compatible
+  - reg
+  - interrupts
+
+examples:
+  - |
+    #include <dt-bindings/gpio/gpio.h>
+    #include <dt-bindings/interrupt-controller/irq.h>
+    i2c0 {
+        #address-cells = <1>;
+        #size-cells = <0>;
+
+        icm42605@68 {
+          compatible = "invensense,icm42605";
+          reg = <0x68>;
+          interrupt-parent = <&gpio2>;
+          interrupts = <7 IRQ_TYPE_EDGE_FALLING>;
+          vdd-supply = <&vdd>;
+          vddio-supply = <&vddio>;
+        };
+    };
+  - |
+    #include <dt-bindings/gpio/gpio.h>
+    #include <dt-bindings/interrupt-controller/irq.h>
+    spi0 {
+        #address-cells = <1>;
+        #size-cells = <0>;
+
+        icm42602@0 {
+          compatible = "invensense,icm42602";
+          reg = <0>;
+          spi-max-frequency = <24000000>;
+          spi-cpha;
+          spi-cpol;
+          interrupt-parent = <&gpio1>;
+          interrupts = <2 IRQ_TYPE_EDGE_FALLING>;
+          vdd-supply = <&vdd>;
+          vddio-supply = <&vddio>;
+        };
+    };

commit d541e5545655f4629eff538ab414eb51ffb36acf
Author: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
Date:   Mon Jun 22 17:37:27 2020 +0200

    UPSTREAM: iio: imu: inv_icm42600: add accurate timestamping
    
    Add a timestamping mechanism for buffer that provides accurate
    event timestamps when using watermark. This mechanism estimates
    device internal clock by comparing FIFO interrupts delta time and
    device elapsed time computed by parsing FIFO data.
    
    Take interrupt timestamp in hard irq handler and add IIO device
    specific timestamp structures in device private allocation.
    
    Signed-off-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    (cherry picked from commit ec74ae9fd37c4518fa8f7e59cbfcbdc5c7dadb25)
    Signed-off-by: Shunqian Zheng <zhengsq@rock-chips.com>
    Change-Id: I2606414aaaecb5e6b16a729376bad374e3cdd024

diff --git a/drivers/iio/imu/inv_icm42600/Makefile b/drivers/iio/imu/inv_icm42600/Makefile
index 0f49f6df3647..291714d9aa54 100644
--- a/drivers/iio/imu/inv_icm42600/Makefile
+++ b/drivers/iio/imu/inv_icm42600/Makefile
@@ -6,6 +6,7 @@ inv-icm42600-y += inv_icm42600_gyro.o
 inv-icm42600-y += inv_icm42600_accel.o
 inv-icm42600-y += inv_icm42600_temp.o
 inv-icm42600-y += inv_icm42600_buffer.o
+inv-icm42600-y += inv_icm42600_timestamp.o
 
 obj-$(CONFIG_INV_ICM42600_I2C) += inv-icm42600-i2c.o
 inv-icm42600-i2c-y += inv_icm42600_i2c.o
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600.h b/drivers/iio/imu/inv_icm42600/inv_icm42600.h
index 7b52d92739c3..c0f5059b13b3 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600.h
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600.h
@@ -126,6 +126,7 @@ struct inv_icm42600_suspended {
  *  @indio_accel:	accelerometer IIO device.
  *  @buffer:		data transfer buffer aligned for DMA.
  *  @fifo:		FIFO management structure.
+ *  @timestamp:		interrupt timestamps.
  */
 struct inv_icm42600_state {
 	struct mutex lock;
@@ -141,6 +142,10 @@ struct inv_icm42600_state {
 	struct iio_dev *indio_accel;
 	uint8_t buffer[2] ____cacheline_aligned;
 	struct inv_icm42600_fifo fifo;
+	struct {
+		int64_t gyro;
+		int64_t accel;
+	} timestamp;
 };
 
 /* Virtual register addresses: @bank on MSB (4 upper bits), @address on LSB */
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c
index fbc029bd6e72..3441b0d61c5d 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c
@@ -17,6 +17,7 @@
 #include "inv_icm42600.h"
 #include "inv_icm42600_temp.h"
 #include "inv_icm42600_buffer.h"
+#include "inv_icm42600_timestamp.h"
 
 #define INV_ICM42600_ACCEL_CHAN(_modifier, _index, _ext_info)		\
 	{								\
@@ -50,6 +51,7 @@ enum inv_icm42600_accel_scan {
 	INV_ICM42600_ACCEL_SCAN_Y,
 	INV_ICM42600_ACCEL_SCAN_Z,
 	INV_ICM42600_ACCEL_SCAN_TEMP,
+	INV_ICM42600_ACCEL_SCAN_TIMESTAMP,
 };
 
 static const struct iio_chan_spec_ext_info inv_icm42600_accel_ext_infos[] = {
@@ -65,15 +67,17 @@ static const struct iio_chan_spec inv_icm42600_accel_channels[] = {
 	INV_ICM42600_ACCEL_CHAN(IIO_MOD_Z, INV_ICM42600_ACCEL_SCAN_Z,
 				inv_icm42600_accel_ext_infos),
 	INV_ICM42600_TEMP_CHAN(INV_ICM42600_ACCEL_SCAN_TEMP),
+	IIO_CHAN_SOFT_TIMESTAMP(INV_ICM42600_ACCEL_SCAN_TIMESTAMP),
 };
 
 /*
- * IIO buffer data: size must be a power of 2
- * 8 bytes: 6 bytes acceleration and 2 bytes temperature
+ * IIO buffer data: size must be a power of 2 and timestamp aligned
+ * 16 bytes: 6 bytes acceleration, 2 bytes temperature, 8 bytes timestamp
  */
 struct inv_icm42600_accel_buffer {
 	struct inv_icm42600_fifo_sensor_data accel;
 	int16_t temp;
+	int64_t timestamp __aligned(8);
 };
 
 #define INV_ICM42600_SCAN_MASK_ACCEL_3AXIS				\
@@ -94,6 +98,7 @@ static int inv_icm42600_accel_update_scan_mode(struct iio_dev *indio_dev,
 					       const unsigned long *scan_mask)
 {
 	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	struct inv_icm42600_timestamp *ts = iio_priv(indio_dev);
 	struct inv_icm42600_sensor_conf conf = INV_ICM42600_SENSOR_CONF_INIT;
 	unsigned int fifo_en = 0;
 	unsigned int sleep_temp = 0;
@@ -121,6 +126,7 @@ static int inv_icm42600_accel_update_scan_mode(struct iio_dev *indio_dev,
 	}
 
 	/* update data FIFO write */
+	inv_icm42600_timestamp_apply_odr(ts, 0, 0, 0);
 	ret = inv_icm42600_buffer_set_fifo_en(st, fifo_en | st->fifo.en);
 	if (ret)
 		goto out_unlock;
@@ -301,9 +307,11 @@ static int inv_icm42600_accel_read_odr(struct inv_icm42600_state *st,
 	return IIO_VAL_INT_PLUS_MICRO;
 }
 
-static int inv_icm42600_accel_write_odr(struct inv_icm42600_state *st,
+static int inv_icm42600_accel_write_odr(struct iio_dev *indio_dev,
 					int val, int val2)
 {
+	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	struct inv_icm42600_timestamp *ts = iio_priv(indio_dev);
 	struct device *dev = regmap_get_device(st->map);
 	unsigned int idx;
 	struct inv_icm42600_sensor_conf conf = INV_ICM42600_SENSOR_CONF_INIT;
@@ -322,6 +330,11 @@ static int inv_icm42600_accel_write_odr(struct inv_icm42600_state *st,
 	pm_runtime_get_sync(dev);
 	mutex_lock(&st->lock);
 
+	ret = inv_icm42600_timestamp_update_odr(ts, inv_icm42600_odr_to_period(conf.odr),
+						iio_buffer_enabled(indio_dev));
+	if (ret)
+		goto out_unlock;
+
 	ret = inv_icm42600_set_accel_conf(st, &conf, NULL);
 	if (ret)
 		goto out_unlock;
@@ -611,7 +624,7 @@ static int inv_icm42600_accel_write_raw(struct iio_dev *indio_dev,
 		iio_device_release_direct_mode(indio_dev);
 		return ret;
 	case IIO_CHAN_INFO_SAMP_FREQ:
-		return inv_icm42600_accel_write_odr(st, val, val2);
+		return inv_icm42600_accel_write_odr(indio_dev, val, val2);
 	case IIO_CHAN_INFO_CALIBBIAS:
 		ret = iio_device_claim_direct_mode(indio_dev);
 		if (ret)
@@ -694,6 +707,7 @@ struct iio_dev *inv_icm42600_accel_init(struct inv_icm42600_state *st)
 {
 	struct device *dev = regmap_get_device(st->map);
 	const char *name;
+	struct inv_icm42600_timestamp *ts;
 	struct iio_dev *indio_dev;
 	struct iio_buffer *buffer;
 	int ret;
@@ -702,7 +716,7 @@ struct iio_dev *inv_icm42600_accel_init(struct inv_icm42600_state *st)
 	if (!name)
 		return ERR_PTR(-ENOMEM);
 
-	indio_dev = devm_iio_device_alloc(dev, 0);
+	indio_dev = devm_iio_device_alloc(dev, sizeof(*ts));
 	if (!indio_dev)
 		return ERR_PTR(-ENOMEM);
 
@@ -710,6 +724,9 @@ struct iio_dev *inv_icm42600_accel_init(struct inv_icm42600_state *st)
 	if (!buffer)
 		return ERR_PTR(-ENOMEM);
 
+	ts = iio_priv(indio_dev);
+	inv_icm42600_timestamp_init(ts, inv_icm42600_odr_to_period(st->conf.accel.odr));
+
 	iio_device_set_drvdata(indio_dev, st);
 	indio_dev->name = name;
 	indio_dev->info = &inv_icm42600_accel_info;
@@ -731,14 +748,17 @@ struct iio_dev *inv_icm42600_accel_init(struct inv_icm42600_state *st)
 int inv_icm42600_accel_parse_fifo(struct iio_dev *indio_dev)
 {
 	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	struct inv_icm42600_timestamp *ts = iio_priv(indio_dev);
 	ssize_t i, size;
+	unsigned int no;
 	const void *accel, *gyro, *timestamp;
 	const int8_t *temp;
 	unsigned int odr;
+	int64_t ts_val;
 	struct inv_icm42600_accel_buffer buffer;
 
 	/* parse all fifo packets */
-	for (i = 0; i < st->fifo.count; i += size) {
+	for (i = 0, no = 0; i < st->fifo.count; i += size, ++no) {
 		size = inv_icm42600_fifo_decode_packet(&st->fifo.data[i],
 				&accel, &gyro, &temp, &timestamp, &odr);
 		/* quit if error or FIFO is empty */
@@ -749,12 +769,18 @@ int inv_icm42600_accel_parse_fifo(struct iio_dev *indio_dev)
 		if (accel == NULL || !inv_icm42600_fifo_is_data_valid(accel))
 			continue;
 
+		/* update odr */
+		if (odr & INV_ICM42600_SENSOR_ACCEL)
+			inv_icm42600_timestamp_apply_odr(ts, st->fifo.period,
+							 st->fifo.nb.total, no);
+
 		/* buffer is copied to userspace, zeroing it to avoid any data leak */
 		memset(&buffer, 0, sizeof(buffer));
 		memcpy(&buffer.accel, accel, sizeof(buffer.accel));
 		/* convert 8 bits FIFO temperature in high resolution format */
 		buffer.temp = temp ? (*temp * 64) : 0;
-		iio_push_to_buffers(indio_dev, &buffer);
+		ts_val = inv_icm42600_timestamp_pop(ts);
+		iio_push_to_buffers_with_timestamp(indio_dev, &buffer, ts_val);
 	}
 
 	return 0;
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.c
index e58e6f0c5698..99576b2c171f 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.c
@@ -13,6 +13,7 @@
 #include <linux/iio/buffer.h>
 
 #include "inv_icm42600.h"
+#include "inv_icm42600_timestamp.h"
 #include "inv_icm42600_buffer.h"
 
 /* FIFO header: 1 byte */
@@ -374,6 +375,7 @@ static int inv_icm42600_buffer_postdisable(struct iio_dev *indio_dev)
 	struct device *dev = regmap_get_device(st->map);
 	unsigned int sensor;
 	unsigned int *watermark;
+	struct inv_icm42600_timestamp *ts;
 	struct inv_icm42600_sensor_conf conf = INV_ICM42600_SENSOR_CONF_INIT;
 	unsigned int sleep_temp = 0;
 	unsigned int sleep_sensor = 0;
@@ -383,9 +385,11 @@ static int inv_icm42600_buffer_postdisable(struct iio_dev *indio_dev)
 	if (indio_dev == st->indio_gyro) {
 		sensor = INV_ICM42600_SENSOR_GYRO;
 		watermark = &st->fifo.watermark.gyro;
+		ts = iio_priv(st->indio_gyro);
 	} else if (indio_dev == st->indio_accel) {
 		sensor = INV_ICM42600_SENSOR_ACCEL;
 		watermark = &st->fifo.watermark.accel;
+		ts = iio_priv(st->indio_accel);
 	} else {
 		return -EINVAL;
 	}
@@ -413,6 +417,8 @@ static int inv_icm42600_buffer_postdisable(struct iio_dev *indio_dev)
 	if (!st->fifo.on)
 		ret = inv_icm42600_set_temp_conf(st, false, &sleep_temp);
 
+	inv_icm42600_timestamp_reset(ts);
+
 out_unlock:
 	mutex_unlock(&st->lock);
 
@@ -498,17 +504,26 @@ int inv_icm42600_buffer_fifo_read(struct inv_icm42600_state *st,
 
 int inv_icm42600_buffer_fifo_parse(struct inv_icm42600_state *st)
 {
+	struct inv_icm42600_timestamp *ts;
 	int ret;
 
 	if (st->fifo.nb.total == 0)
 		return 0;
 
+	/* handle gyroscope timestamp and FIFO data parsing */
+	ts = iio_priv(st->indio_gyro);
+	inv_icm42600_timestamp_interrupt(ts, st->fifo.period, st->fifo.nb.total,
+					 st->fifo.nb.gyro, st->timestamp.gyro);
 	if (st->fifo.nb.gyro > 0) {
 		ret = inv_icm42600_gyro_parse_fifo(st->indio_gyro);
 		if (ret)
 			return ret;
 	}
 
+	/* handle accelerometer timestamp and FIFO data parsing */
+	ts = iio_priv(st->indio_accel);
+	inv_icm42600_timestamp_interrupt(ts, st->fifo.period, st->fifo.nb.total,
+					 st->fifo.nb.accel, st->timestamp.accel);
 	if (st->fifo.nb.accel > 0) {
 		ret = inv_icm42600_accel_parse_fifo(st->indio_accel);
 		if (ret)
@@ -521,8 +536,13 @@ int inv_icm42600_buffer_fifo_parse(struct inv_icm42600_state *st)
 int inv_icm42600_buffer_hwfifo_flush(struct inv_icm42600_state *st,
 				     unsigned int count)
 {
+	struct inv_icm42600_timestamp *ts;
+	int64_t gyro_ts, accel_ts;
 	int ret;
 
+	gyro_ts = iio_get_time_ns(st->indio_gyro);
+	accel_ts = iio_get_time_ns(st->indio_accel);
+
 	ret = inv_icm42600_buffer_fifo_read(st, count);
 	if (ret)
 		return ret;
@@ -531,12 +551,20 @@ int inv_icm42600_buffer_hwfifo_flush(struct inv_icm42600_state *st,
 		return 0;
 
 	if (st->fifo.nb.gyro > 0) {
+		ts = iio_priv(st->indio_gyro);
+		inv_icm42600_timestamp_interrupt(ts, st->fifo.period,
+						 st->fifo.nb.total, st->fifo.nb.gyro,
+						 gyro_ts);
 		ret = inv_icm42600_gyro_parse_fifo(st->indio_gyro);
 		if (ret)
 			return ret;
 	}
 
 	if (st->fifo.nb.accel > 0) {
+		ts = iio_priv(st->indio_accel);
+		inv_icm42600_timestamp_interrupt(ts, st->fifo.period,
+						 st->fifo.nb.total, st->fifo.nb.accel,
+						 accel_ts);
 		ret = inv_icm42600_accel_parse_fifo(st->indio_accel);
 		if (ret)
 			return ret;
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
index 9e1f6e65fd45..8bd77185ccb7 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
@@ -19,6 +19,7 @@
 
 #include "inv_icm42600.h"
 #include "inv_icm42600_buffer.h"
+#include "inv_icm42600_timestamp.h"
 
 static const struct regmap_range_cfg inv_icm42600_regmap_ranges[] = {
 	{
@@ -412,6 +413,16 @@ static int inv_icm42600_setup(struct inv_icm42600_state *st,
 	return inv_icm42600_set_conf(st, hw->conf);
 }
 
+static irqreturn_t inv_icm42600_irq_timestamp(int irq, void *_data)
+{
+	struct inv_icm42600_state *st = _data;
+
+	st->timestamp.gyro = iio_get_time_ns(st->indio_gyro);
+	st->timestamp.accel = iio_get_time_ns(st->indio_accel);
+
+	return IRQ_WAKE_THREAD;
+}
+
 static irqreturn_t inv_icm42600_irq_handler(int irq, void *_data)
 {
 	struct inv_icm42600_state *st = _data;
@@ -495,7 +506,7 @@ static int inv_icm42600_irq_init(struct inv_icm42600_state *st, int irq,
 	if (ret)
 		return ret;
 
-	return devm_request_threaded_irq(dev, irq, NULL,
+	return devm_request_threaded_irq(dev, irq, inv_icm42600_irq_timestamp,
 					 inv_icm42600_irq_handler, irq_type,
 					 "inv_icm42600", st);
 }
@@ -617,6 +628,10 @@ int inv_icm42600_core_probe(struct regmap *regmap, int chip, int irq,
 	if (ret)
 		return ret;
 
+	ret = inv_icm42600_timestamp_setup(st);
+	if (ret)
+		return ret;
+
 	ret = inv_icm42600_buffer_init(st);
 	if (ret)
 		return ret;
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c
index 3b1f7594b60b..aee7b9ff4bf4 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c
@@ -17,6 +17,7 @@
 #include "inv_icm42600.h"
 #include "inv_icm42600_temp.h"
 #include "inv_icm42600_buffer.h"
+#include "inv_icm42600_timestamp.h"
 
 #define INV_ICM42600_GYRO_CHAN(_modifier, _index, _ext_info)		\
 	{								\
@@ -50,6 +51,7 @@ enum inv_icm42600_gyro_scan {
 	INV_ICM42600_GYRO_SCAN_Y,
 	INV_ICM42600_GYRO_SCAN_Z,
 	INV_ICM42600_GYRO_SCAN_TEMP,
+	INV_ICM42600_GYRO_SCAN_TIMESTAMP,
 };
 
 static const struct iio_chan_spec_ext_info inv_icm42600_gyro_ext_infos[] = {
@@ -65,15 +67,17 @@ static const struct iio_chan_spec inv_icm42600_gyro_channels[] = {
 	INV_ICM42600_GYRO_CHAN(IIO_MOD_Z, INV_ICM42600_GYRO_SCAN_Z,
 			       inv_icm42600_gyro_ext_infos),
 	INV_ICM42600_TEMP_CHAN(INV_ICM42600_GYRO_SCAN_TEMP),
+	IIO_CHAN_SOFT_TIMESTAMP(INV_ICM42600_GYRO_SCAN_TIMESTAMP),
 };
 
 /*
- * IIO buffer data: size must be a power of 2
- * 8 bytes: 6 bytes angular velocity and 2 bytes temperature
+ * IIO buffer data: size must be a power of 2 and timestamp aligned
+ * 16 bytes: 6 bytes angular velocity, 2 bytes temperature, 8 bytes timestamp
  */
 struct inv_icm42600_gyro_buffer {
 	struct inv_icm42600_fifo_sensor_data gyro;
 	int16_t temp;
+	int64_t timestamp __aligned(8);
 };
 
 #define INV_ICM42600_SCAN_MASK_GYRO_3AXIS				\
@@ -94,6 +98,7 @@ static int inv_icm42600_gyro_update_scan_mode(struct iio_dev *indio_dev,
 					      const unsigned long *scan_mask)
 {
 	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	struct inv_icm42600_timestamp *ts = iio_priv(indio_dev);
 	struct inv_icm42600_sensor_conf conf = INV_ICM42600_SENSOR_CONF_INIT;
 	unsigned int fifo_en = 0;
 	unsigned int sleep_gyro = 0;
@@ -121,6 +126,7 @@ static int inv_icm42600_gyro_update_scan_mode(struct iio_dev *indio_dev,
 	}
 
 	/* update data FIFO write */
+	inv_icm42600_timestamp_apply_odr(ts, 0, 0, 0);
 	ret = inv_icm42600_buffer_set_fifo_en(st, fifo_en | st->fifo.en);
 	if (ret)
 		goto out_unlock;
@@ -313,9 +319,11 @@ static int inv_icm42600_gyro_read_odr(struct inv_icm42600_state *st,
 	return IIO_VAL_INT_PLUS_MICRO;
 }
 
-static int inv_icm42600_gyro_write_odr(struct inv_icm42600_state *st,
+static int inv_icm42600_gyro_write_odr(struct iio_dev *indio_dev,
 				       int val, int val2)
 {
+	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	struct inv_icm42600_timestamp *ts = iio_priv(indio_dev);
 	struct device *dev = regmap_get_device(st->map);
 	unsigned int idx;
 	struct inv_icm42600_sensor_conf conf = INV_ICM42600_SENSOR_CONF_INIT;
@@ -334,6 +342,11 @@ static int inv_icm42600_gyro_write_odr(struct inv_icm42600_state *st,
 	pm_runtime_get_sync(dev);
 	mutex_lock(&st->lock);
 
+	ret = inv_icm42600_timestamp_update_odr(ts, inv_icm42600_odr_to_period(conf.odr),
+						iio_buffer_enabled(indio_dev));
+	if (ret)
+		goto out_unlock;
+
 	ret = inv_icm42600_set_gyro_conf(st, &conf, NULL);
 	if (ret)
 		goto out_unlock;
@@ -622,7 +635,7 @@ static int inv_icm42600_gyro_write_raw(struct iio_dev *indio_dev,
 		iio_device_release_direct_mode(indio_dev);
 		return ret;
 	case IIO_CHAN_INFO_SAMP_FREQ:
-		return inv_icm42600_gyro_write_odr(st, val, val2);
+		return inv_icm42600_gyro_write_odr(indio_dev, val, val2);
 	case IIO_CHAN_INFO_CALIBBIAS:
 		ret = iio_device_claim_direct_mode(indio_dev);
 		if (ret)
@@ -705,6 +718,7 @@ struct iio_dev *inv_icm42600_gyro_init(struct inv_icm42600_state *st)
 {
 	struct device *dev = regmap_get_device(st->map);
 	const char *name;
+	struct inv_icm42600_timestamp *ts;
 	struct iio_dev *indio_dev;
 	struct iio_buffer *buffer;
 	int ret;
@@ -713,7 +727,7 @@ struct iio_dev *inv_icm42600_gyro_init(struct inv_icm42600_state *st)
 	if (!name)
 		return ERR_PTR(-ENOMEM);
 
-	indio_dev = devm_iio_device_alloc(dev, 0);
+	indio_dev = devm_iio_device_alloc(dev, sizeof(*ts));
 	if (!indio_dev)
 		return ERR_PTR(-ENOMEM);
 
@@ -721,6 +735,9 @@ struct iio_dev *inv_icm42600_gyro_init(struct inv_icm42600_state *st)
 	if (!buffer)
 		return ERR_PTR(-ENOMEM);
 
+	ts = iio_priv(indio_dev);
+	inv_icm42600_timestamp_init(ts, inv_icm42600_odr_to_period(st->conf.gyro.odr));
+
 	iio_device_set_drvdata(indio_dev, st);
 	indio_dev->name = name;
 	indio_dev->info = &inv_icm42600_gyro_info;
@@ -742,14 +759,17 @@ struct iio_dev *inv_icm42600_gyro_init(struct inv_icm42600_state *st)
 int inv_icm42600_gyro_parse_fifo(struct iio_dev *indio_dev)
 {
 	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	struct inv_icm42600_timestamp *ts = iio_priv(indio_dev);
 	ssize_t i, size;
+	unsigned int no;
 	const void *accel, *gyro, *timestamp;
 	const int8_t *temp;
 	unsigned int odr;
+	int64_t ts_val;
 	struct inv_icm42600_gyro_buffer buffer;
 
 	/* parse all fifo packets */
-	for (i = 0; i < st->fifo.count; i += size) {
+	for (i = 0, no = 0; i < st->fifo.count; i += size, ++no) {
 		size = inv_icm42600_fifo_decode_packet(&st->fifo.data[i],
 				&accel, &gyro, &temp, &timestamp, &odr);
 		/* quit if error or FIFO is empty */
@@ -760,12 +780,18 @@ int inv_icm42600_gyro_parse_fifo(struct iio_dev *indio_dev)
 		if (gyro == NULL || !inv_icm42600_fifo_is_data_valid(gyro))
 			continue;
 
+		/* update odr */
+		if (odr & INV_ICM42600_SENSOR_GYRO)
+			inv_icm42600_timestamp_apply_odr(ts, st->fifo.period,
+							 st->fifo.nb.total, no);
+
 		/* buffer is copied to userspace, zeroing it to avoid any data leak */
 		memset(&buffer, 0, sizeof(buffer));
 		memcpy(&buffer.gyro, gyro, sizeof(buffer.gyro));
 		/* convert 8 bits FIFO temperature in high resolution format */
 		buffer.temp = temp ? (*temp * 64) : 0;
-		iio_push_to_buffers(indio_dev, &buffer);
+		ts_val = inv_icm42600_timestamp_pop(ts);
+		iio_push_to_buffers_with_timestamp(indio_dev, &buffer, ts_val);
 	}
 
 	return 0;
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_timestamp.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_timestamp.c
new file mode 100644
index 000000000000..7f2dc41f807b
--- /dev/null
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_timestamp.c
@@ -0,0 +1,195 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2020 Invensense, Inc.
+ */
+
+#include <linux/kernel.h>
+#include <linux/regmap.h>
+#include <linux/math64.h>
+
+#include "inv_icm42600.h"
+#include "inv_icm42600_timestamp.h"
+
+/* internal chip period is 32kHz, 31250ns */
+#define INV_ICM42600_TIMESTAMP_PERIOD		31250
+/* allow a jitter of +/- 2% */
+#define INV_ICM42600_TIMESTAMP_JITTER		2
+/* compute min and max periods accepted */
+#define INV_ICM42600_TIMESTAMP_MIN_PERIOD(_p)		\
+	(((_p) * (100 - INV_ICM42600_TIMESTAMP_JITTER)) / 100)
+#define INV_ICM42600_TIMESTAMP_MAX_PERIOD(_p)		\
+	(((_p) * (100 + INV_ICM42600_TIMESTAMP_JITTER)) / 100)
+
+/* Add a new value inside an accumulator and update the estimate value */
+static void inv_update_acc(struct inv_icm42600_timestamp_acc *acc, uint32_t val)
+{
+	uint64_t sum = 0;
+	size_t i;
+
+	acc->values[acc->idx++] = val;
+	if (acc->idx >= ARRAY_SIZE(acc->values))
+		acc->idx = 0;
+
+	/* compute the mean of all stored values, use 0 as empty slot */
+	for (i = 0; i < ARRAY_SIZE(acc->values); ++i) {
+		if (acc->values[i] == 0)
+			break;
+		sum += acc->values[i];
+	}
+
+	acc->val = div_u64(sum, i);
+}
+
+void inv_icm42600_timestamp_init(struct inv_icm42600_timestamp *ts,
+				 uint32_t period)
+{
+	/* initial odr for sensor after reset is 1kHz */
+	const uint32_t default_period = 1000000;
+
+	/* current multiplier and period values after reset */
+	ts->mult = default_period / INV_ICM42600_TIMESTAMP_PERIOD;
+	ts->period = default_period;
+	/* new set multiplier is the one from chip initialization */
+	ts->new_mult = period / INV_ICM42600_TIMESTAMP_PERIOD;
+
+	/* use theoretical value for chip period */
+	inv_update_acc(&ts->chip_period, INV_ICM42600_TIMESTAMP_PERIOD);
+}
+
+int inv_icm42600_timestamp_setup(struct inv_icm42600_state *st)
+{
+	unsigned int val;
+
+	/* enable timestamp register */
+	val = INV_ICM42600_TMST_CONFIG_TMST_TO_REGS_EN |
+	      INV_ICM42600_TMST_CONFIG_TMST_EN;
+	return regmap_update_bits(st->map, INV_ICM42600_REG_TMST_CONFIG,
+				  INV_ICM42600_TMST_CONFIG_MASK, val);
+}
+
+int inv_icm42600_timestamp_update_odr(struct inv_icm42600_timestamp *ts,
+				      uint32_t period, bool fifo)
+{
+	/* when FIFO is on, prevent odr change if one is already pending */
+	if (fifo && ts->new_mult != 0)
+		return -EAGAIN;
+
+	ts->new_mult = period / INV_ICM42600_TIMESTAMP_PERIOD;
+
+	return 0;
+}
+
+static bool inv_validate_period(uint32_t period, uint32_t mult)
+{
+	const uint32_t chip_period = INV_ICM42600_TIMESTAMP_PERIOD;
+	uint32_t period_min, period_max;
+
+	/* check that period is acceptable */
+	period_min = INV_ICM42600_TIMESTAMP_MIN_PERIOD(chip_period) * mult;
+	period_max = INV_ICM42600_TIMESTAMP_MAX_PERIOD(chip_period) * mult;
+	if (period > period_min && period < period_max)
+		return true;
+	else
+		return false;
+}
+
+static bool inv_compute_chip_period(struct inv_icm42600_timestamp *ts,
+				    uint32_t mult, uint32_t period)
+{
+	uint32_t new_chip_period;
+
+	if (!inv_validate_period(period, mult))
+		return false;
+
+	/* update chip internal period estimation */
+	new_chip_period = period / mult;
+	inv_update_acc(&ts->chip_period, new_chip_period);
+
+	return true;
+}
+
+void inv_icm42600_timestamp_interrupt(struct inv_icm42600_timestamp *ts,
+				      uint32_t fifo_period, size_t fifo_nb,
+				      size_t sensor_nb, int64_t timestamp)
+{
+	struct inv_icm42600_timestamp_interval *it;
+	int64_t delta, interval;
+	const uint32_t fifo_mult = fifo_period / INV_ICM42600_TIMESTAMP_PERIOD;
+	uint32_t period = ts->period;
+	int32_t m;
+	bool valid = false;
+
+	if (fifo_nb == 0)
+		return;
+
+	/* update interrupt timestamp and compute chip and sensor periods */
+	it = &ts->it;
+	it->lo = it->up;
+	it->up = timestamp;
+	delta = it->up - it->lo;
+	if (it->lo != 0) {
+		/* compute period: delta time divided by number of samples */
+		period = div_s64(delta, fifo_nb);
+		valid = inv_compute_chip_period(ts, fifo_mult, period);
+		/* update sensor period if chip internal period is updated */
+		if (valid)
+			ts->period = ts->mult * ts->chip_period.val;
+	}
+
+	/* no previous data, compute theoritical value from interrupt */
+	if (ts->timestamp == 0) {
+		/* elapsed time: sensor period * sensor samples number */
+		interval = (int64_t)ts->period * (int64_t)sensor_nb;
+		ts->timestamp = it->up - interval;
+		return;
+	}
+
+	/* if interrupt interval is valid, sync with interrupt timestamp */
+	if (valid) {
+		/* compute measured fifo_period */
+		fifo_period = fifo_mult * ts->chip_period.val;
+		/* delta time between last sample and last interrupt */
+		delta = it->lo - ts->timestamp;
+		/* if there are multiple samples, go back to first one */
+		while (delta >= (fifo_period * 3 / 2))
+			delta -= fifo_period;
+		/* compute maximal adjustment value */
+		m = INV_ICM42600_TIMESTAMP_MAX_PERIOD(ts->period) - ts->period;
+		if (delta > m)
+			delta = m;
+		else if (delta < -m)
+			delta = -m;
+		ts->timestamp += delta;
+	}
+}
+
+void inv_icm42600_timestamp_apply_odr(struct inv_icm42600_timestamp *ts,
+				      uint32_t fifo_period, size_t fifo_nb,
+				      unsigned int fifo_no)
+{
+	int64_t interval;
+	uint32_t fifo_mult;
+
+	if (ts->new_mult == 0)
+		return;
+
+	/* update to new multiplier and update period */
+	ts->mult = ts->new_mult;
+	ts->new_mult = 0;
+	ts->period = ts->mult * ts->chip_period.val;
+
+	/*
+	 * After ODR change the time interval with the previous sample is
+	 * undertermined (depends when the change occures). So we compute the
+	 * timestamp from the current interrupt using the new FIFO period, the
+	 * total number of samples and the current sample numero.
+	 */
+	if (ts->timestamp != 0) {
+		/* compute measured fifo period */
+		fifo_mult = fifo_period / INV_ICM42600_TIMESTAMP_PERIOD;
+		fifo_period = fifo_mult * ts->chip_period.val;
+		/* computes time interval between interrupt and this sample */
+		interval = (int64_t)(fifo_nb - fifo_no) * (int64_t)fifo_period;
+		ts->timestamp = ts->it.up - interval;
+	}
+}
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_timestamp.h b/drivers/iio/imu/inv_icm42600/inv_icm42600_timestamp.h
new file mode 100644
index 000000000000..4e4f331d4fe4
--- /dev/null
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_timestamp.h
@@ -0,0 +1,85 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2020 Invensense, Inc.
+ */
+
+#ifndef INV_ICM42600_TIMESTAMP_H_
+#define INV_ICM42600_TIMESTAMP_H_
+
+#include <linux/kernel.h>
+
+struct inv_icm42600_state;
+
+/**
+ * struct inv_icm42600_timestamp_interval - timestamps interval
+ * @lo:	interval lower bound
+ * @up:	interval upper bound
+ */
+struct inv_icm42600_timestamp_interval {
+	int64_t lo;
+	int64_t up;
+};
+
+/**
+ * struct inv_icm42600_timestamp_acc - accumulator for computing an estimation
+ * @val:	current estimation of the value, the mean of all values
+ * @idx:	current index of the next free place in values table
+ * @values:	table of all measured values, use for computing the mean
+ */
+struct inv_icm42600_timestamp_acc {
+	uint32_t val;
+	size_t idx;
+	uint32_t values[32];
+};
+
+/**
+ * struct inv_icm42600_timestamp - timestamp management states
+ * @it:			interrupts interval timestamps
+ * @timestamp:		store last timestamp for computing next data timestamp
+ * @mult:		current internal period multiplier
+ * @new_mult:		new set internal period multiplier (not yet effective)
+ * @period:		measured current period of the sensor
+ * @chip_period:	accumulator for computing internal chip period
+ */
+struct inv_icm42600_timestamp {
+	struct inv_icm42600_timestamp_interval it;
+	int64_t timestamp;
+	uint32_t mult;
+	uint32_t new_mult;
+	uint32_t period;
+	struct inv_icm42600_timestamp_acc chip_period;
+};
+
+void inv_icm42600_timestamp_init(struct inv_icm42600_timestamp *ts,
+				 uint32_t period);
+
+int inv_icm42600_timestamp_setup(struct inv_icm42600_state *st);
+
+int inv_icm42600_timestamp_update_odr(struct inv_icm42600_timestamp *ts,
+				      uint32_t period, bool fifo);
+
+void inv_icm42600_timestamp_interrupt(struct inv_icm42600_timestamp *ts,
+				      uint32_t fifo_period, size_t fifo_nb,
+				      size_t sensor_nb, int64_t timestamp);
+
+static inline int64_t
+inv_icm42600_timestamp_pop(struct inv_icm42600_timestamp *ts)
+{
+	ts->timestamp += ts->period;
+	return ts->timestamp;
+}
+
+void inv_icm42600_timestamp_apply_odr(struct inv_icm42600_timestamp *ts,
+				      uint32_t fifo_period, size_t fifo_nb,
+				      unsigned int fifo_no);
+
+static inline void
+inv_icm42600_timestamp_reset(struct inv_icm42600_timestamp *ts)
+{
+	const struct inv_icm42600_timestamp_interval interval_init = {0LL, 0LL};
+
+	ts->it = interval_init;
+	ts->timestamp = 0;
+}
+
+#endif

commit beec1e5a14930f988f25da143a5a98e9350ca6ce
Author: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
Date:   Mon Jun 22 17:37:26 2020 +0200

    UPSTREAM: iio: imu: inv_icm42600: add buffer support in iio devices
    
    Add all FIFO parsing and reading functions. Add accel and gyro
    kfifo buffer and FIFO data parsing. Use device interrupt for
    reading data FIFO and launching accel and gyro parsing.
    
    Support hwfifo watermark by multiplexing gyro and accel settings.
    Support hwfifo flush.
    
    Signed-off-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    (cherry picked from commit 7f85e42a6c54c0757f4a2d217ab0d866b4e94697)
    Signed-off-by: Shunqian Zheng <zhengsq@rock-chips.com>
    Change-Id: I7d259cc0a4fa6da00c2014e40cd57c60232bcd5a

diff --git a/drivers/iio/imu/inv_icm42600/Kconfig b/drivers/iio/imu/inv_icm42600/Kconfig
index 22390a72f0a3..50cbcfcb6cf1 100644
--- a/drivers/iio/imu/inv_icm42600/Kconfig
+++ b/drivers/iio/imu/inv_icm42600/Kconfig
@@ -2,6 +2,7 @@
 
 config INV_ICM42600
 	tristate
+	select IIO_BUFFER
 
 config INV_ICM42600_I2C
 	tristate "InvenSense ICM-426xx I2C driver"
diff --git a/drivers/iio/imu/inv_icm42600/Makefile b/drivers/iio/imu/inv_icm42600/Makefile
index 48965824f00c..0f49f6df3647 100644
--- a/drivers/iio/imu/inv_icm42600/Makefile
+++ b/drivers/iio/imu/inv_icm42600/Makefile
@@ -5,6 +5,7 @@ inv-icm42600-y += inv_icm42600_core.o
 inv-icm42600-y += inv_icm42600_gyro.o
 inv-icm42600-y += inv_icm42600_accel.o
 inv-icm42600-y += inv_icm42600_temp.o
+inv-icm42600-y += inv_icm42600_buffer.o
 
 obj-$(CONFIG_INV_ICM42600_I2C) += inv-icm42600-i2c.o
 inv-icm42600-i2c-y += inv_icm42600_i2c.o
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600.h b/drivers/iio/imu/inv_icm42600/inv_icm42600.h
index 148894c888cc..7b52d92739c3 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600.h
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600.h
@@ -14,6 +14,8 @@
 #include <linux/pm.h>
 #include <linux/iio/iio.h>
 
+#include "inv_icm42600_buffer.h"
+
 enum inv_icm42600_chip {
 	INV_CHIP_ICM42600,
 	INV_CHIP_ICM42602,
@@ -123,6 +125,7 @@ struct inv_icm42600_suspended {
  *  @indio_gyro:	gyroscope IIO device.
  *  @indio_accel:	accelerometer IIO device.
  *  @buffer:		data transfer buffer aligned for DMA.
+ *  @fifo:		FIFO management structure.
  */
 struct inv_icm42600_state {
 	struct mutex lock;
@@ -137,6 +140,7 @@ struct inv_icm42600_state {
 	struct iio_dev *indio_gyro;
 	struct iio_dev *indio_accel;
 	uint8_t buffer[2] ____cacheline_aligned;
+	struct inv_icm42600_fifo fifo;
 };
 
 /* Virtual register addresses: @bank on MSB (4 upper bits), @address on LSB */
@@ -377,6 +381,10 @@ int inv_icm42600_core_probe(struct regmap *regmap, int chip, int irq,
 
 struct iio_dev *inv_icm42600_gyro_init(struct inv_icm42600_state *st);
 
+int inv_icm42600_gyro_parse_fifo(struct iio_dev *indio_dev);
+
 struct iio_dev *inv_icm42600_accel_init(struct inv_icm42600_state *st);
 
+int inv_icm42600_accel_parse_fifo(struct iio_dev *indio_dev);
+
 #endif
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c
index 3f214df44093..fbc029bd6e72 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c
@@ -11,9 +11,12 @@
 #include <linux/delay.h>
 #include <linux/math64.h>
 #include <linux/iio/iio.h>
+#include <linux/iio/buffer.h>
+#include <linux/iio/kfifo_buf.h>
 
 #include "inv_icm42600.h"
 #include "inv_icm42600_temp.h"
+#include "inv_icm42600_buffer.h"
 
 #define INV_ICM42600_ACCEL_CHAN(_modifier, _index, _ext_info)		\
 	{								\
@@ -64,6 +67,78 @@ static const struct iio_chan_spec inv_icm42600_accel_channels[] = {
 	INV_ICM42600_TEMP_CHAN(INV_ICM42600_ACCEL_SCAN_TEMP),
 };
 
+/*
+ * IIO buffer data: size must be a power of 2
+ * 8 bytes: 6 bytes acceleration and 2 bytes temperature
+ */
+struct inv_icm42600_accel_buffer {
+	struct inv_icm42600_fifo_sensor_data accel;
+	int16_t temp;
+};
+
+#define INV_ICM42600_SCAN_MASK_ACCEL_3AXIS				\
+	(BIT(INV_ICM42600_ACCEL_SCAN_X) |				\
+	BIT(INV_ICM42600_ACCEL_SCAN_Y) |				\
+	BIT(INV_ICM42600_ACCEL_SCAN_Z))
+
+#define INV_ICM42600_SCAN_MASK_TEMP	BIT(INV_ICM42600_ACCEL_SCAN_TEMP)
+
+static const unsigned long inv_icm42600_accel_scan_masks[] = {
+	/* 3-axis accel + temperature */
+	INV_ICM42600_SCAN_MASK_ACCEL_3AXIS | INV_ICM42600_SCAN_MASK_TEMP,
+	0,
+};
+
+/* enable accelerometer sensor and FIFO write */
+static int inv_icm42600_accel_update_scan_mode(struct iio_dev *indio_dev,
+					       const unsigned long *scan_mask)
+{
+	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	struct inv_icm42600_sensor_conf conf = INV_ICM42600_SENSOR_CONF_INIT;
+	unsigned int fifo_en = 0;
+	unsigned int sleep_temp = 0;
+	unsigned int sleep_accel = 0;
+	unsigned int sleep;
+	int ret;
+
+	mutex_lock(&st->lock);
+
+	if (*scan_mask & INV_ICM42600_SCAN_MASK_TEMP) {
+		/* enable temp sensor */
+		ret = inv_icm42600_set_temp_conf(st, true, &sleep_temp);
+		if (ret)
+			goto out_unlock;
+		fifo_en |= INV_ICM42600_SENSOR_TEMP;
+	}
+
+	if (*scan_mask & INV_ICM42600_SCAN_MASK_ACCEL_3AXIS) {
+		/* enable accel sensor */
+		conf.mode = INV_ICM42600_SENSOR_MODE_LOW_NOISE;
+		ret = inv_icm42600_set_accel_conf(st, &conf, &sleep_accel);
+		if (ret)
+			goto out_unlock;
+		fifo_en |= INV_ICM42600_SENSOR_ACCEL;
+	}
+
+	/* update data FIFO write */
+	ret = inv_icm42600_buffer_set_fifo_en(st, fifo_en | st->fifo.en);
+	if (ret)
+		goto out_unlock;
+
+	ret = inv_icm42600_buffer_update_watermark(st);
+
+out_unlock:
+	mutex_unlock(&st->lock);
+	/* sleep maximum required time */
+	if (sleep_accel > sleep_temp)
+		sleep = sleep_accel;
+	else
+		sleep = sleep_temp;
+	if (sleep)
+		msleep(sleep);
+	return ret;
+}
+
 static int inv_icm42600_accel_read_sensor(struct inv_icm42600_state *st,
 					  struct iio_chan_spec const *chan,
 					  int16_t *val)
@@ -248,7 +323,12 @@ static int inv_icm42600_accel_write_odr(struct inv_icm42600_state *st,
 	mutex_lock(&st->lock);
 
 	ret = inv_icm42600_set_accel_conf(st, &conf, NULL);
+	if (ret)
+		goto out_unlock;
+	inv_icm42600_buffer_update_fifo_period(st);
+	inv_icm42600_buffer_update_watermark(st);
 
+out_unlock:
 	mutex_unlock(&st->lock);
 	pm_runtime_mark_last_busy(dev);
 	pm_runtime_put_autosuspend(dev);
@@ -563,12 +643,51 @@ static int inv_icm42600_accel_write_raw_get_fmt(struct iio_dev *indio_dev,
 	}
 }
 
+static int inv_icm42600_accel_hwfifo_set_watermark(struct iio_dev *indio_dev,
+						   unsigned int val)
+{
+	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	int ret;
+
+	mutex_lock(&st->lock);
+
+	st->fifo.watermark.accel = val;
+	ret = inv_icm42600_buffer_update_watermark(st);
+
+	mutex_unlock(&st->lock);
+
+	return ret;
+}
+
+static int inv_icm42600_accel_hwfifo_flush(struct iio_dev *indio_dev,
+					   unsigned int count)
+{
+	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	int ret;
+
+	if (count == 0)
+		return 0;
+
+	mutex_lock(&st->lock);
+
+	ret = inv_icm42600_buffer_hwfifo_flush(st, count);
+	if (!ret)
+		ret = st->fifo.nb.accel;
+
+	mutex_unlock(&st->lock);
+
+	return ret;
+}
+
 static const struct iio_info inv_icm42600_accel_info = {
 	.read_raw = inv_icm42600_accel_read_raw,
 	.read_avail = inv_icm42600_accel_read_avail,
 	.write_raw = inv_icm42600_accel_write_raw,
 	.write_raw_get_fmt = inv_icm42600_accel_write_raw_get_fmt,
 	.debugfs_reg_access = inv_icm42600_debugfs_reg,
+	.update_scan_mode = inv_icm42600_accel_update_scan_mode,
+	.hwfifo_set_watermark = inv_icm42600_accel_hwfifo_set_watermark,
+	.hwfifo_flush_to_buffer = inv_icm42600_accel_hwfifo_flush,
 };
 
 struct iio_dev *inv_icm42600_accel_init(struct inv_icm42600_state *st)
@@ -576,6 +695,7 @@ struct iio_dev *inv_icm42600_accel_init(struct inv_icm42600_state *st)
 	struct device *dev = regmap_get_device(st->map);
 	const char *name;
 	struct iio_dev *indio_dev;
+	struct iio_buffer *buffer;
 	int ret;
 
 	name = devm_kasprintf(dev, GFP_KERNEL, "%s-accel", st->name);
@@ -586,12 +706,20 @@ struct iio_dev *inv_icm42600_accel_init(struct inv_icm42600_state *st)
 	if (!indio_dev)
 		return ERR_PTR(-ENOMEM);
 
+	buffer = devm_iio_kfifo_allocate(dev);
+	if (!buffer)
+		return ERR_PTR(-ENOMEM);
+
 	iio_device_set_drvdata(indio_dev, st);
 	indio_dev->name = name;
 	indio_dev->info = &inv_icm42600_accel_info;
-	indio_dev->modes = INDIO_DIRECT_MODE;
+	indio_dev->modes = INDIO_DIRECT_MODE | INDIO_BUFFER_SOFTWARE;
 	indio_dev->channels = inv_icm42600_accel_channels;
 	indio_dev->num_channels = ARRAY_SIZE(inv_icm42600_accel_channels);
+	indio_dev->available_scan_masks = inv_icm42600_accel_scan_masks;
+	indio_dev->setup_ops = &inv_icm42600_buffer_ops;
+
+	iio_device_attach_buffer(indio_dev, buffer);
 
 	ret = devm_iio_device_register(dev, indio_dev);
 	if (ret)
@@ -599,3 +727,35 @@ struct iio_dev *inv_icm42600_accel_init(struct inv_icm42600_state *st)
 
 	return indio_dev;
 }
+
+int inv_icm42600_accel_parse_fifo(struct iio_dev *indio_dev)
+{
+	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	ssize_t i, size;
+	const void *accel, *gyro, *timestamp;
+	const int8_t *temp;
+	unsigned int odr;
+	struct inv_icm42600_accel_buffer buffer;
+
+	/* parse all fifo packets */
+	for (i = 0; i < st->fifo.count; i += size) {
+		size = inv_icm42600_fifo_decode_packet(&st->fifo.data[i],
+				&accel, &gyro, &temp, &timestamp, &odr);
+		/* quit if error or FIFO is empty */
+		if (size <= 0)
+			return size;
+
+		/* skip packet if no accel data or data is invalid */
+		if (accel == NULL || !inv_icm42600_fifo_is_data_valid(accel))
+			continue;
+
+		/* buffer is copied to userspace, zeroing it to avoid any data leak */
+		memset(&buffer, 0, sizeof(buffer));
+		memcpy(&buffer.accel, accel, sizeof(buffer.accel));
+		/* convert 8 bits FIFO temperature in high resolution format */
+		buffer.temp = temp ? (*temp * 64) : 0;
+		iio_push_to_buffers(indio_dev, &buffer);
+	}
+
+	return 0;
+}
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.c
new file mode 100644
index 000000000000..e58e6f0c5698
--- /dev/null
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.c
@@ -0,0 +1,573 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2020 Invensense, Inc.
+ */
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/mutex.h>
+#include <linux/pm_runtime.h>
+#include <linux/regmap.h>
+#include <linux/delay.h>
+#include <linux/iio/iio.h>
+#include <linux/iio/buffer.h>
+
+#include "inv_icm42600.h"
+#include "inv_icm42600_buffer.h"
+
+/* FIFO header: 1 byte */
+#define INV_ICM42600_FIFO_HEADER_MSG		BIT(7)
+#define INV_ICM42600_FIFO_HEADER_ACCEL		BIT(6)
+#define INV_ICM42600_FIFO_HEADER_GYRO		BIT(5)
+#define INV_ICM42600_FIFO_HEADER_TMST_FSYNC	GENMASK(3, 2)
+#define INV_ICM42600_FIFO_HEADER_ODR_ACCEL	BIT(1)
+#define INV_ICM42600_FIFO_HEADER_ODR_GYRO	BIT(0)
+
+struct inv_icm42600_fifo_1sensor_packet {
+	uint8_t header;
+	struct inv_icm42600_fifo_sensor_data data;
+	int8_t temp;
+} __packed;
+#define INV_ICM42600_FIFO_1SENSOR_PACKET_SIZE		8
+
+struct inv_icm42600_fifo_2sensors_packet {
+	uint8_t header;
+	struct inv_icm42600_fifo_sensor_data accel;
+	struct inv_icm42600_fifo_sensor_data gyro;
+	int8_t temp;
+	__be16 timestamp;
+} __packed;
+#define INV_ICM42600_FIFO_2SENSORS_PACKET_SIZE		16
+
+ssize_t inv_icm42600_fifo_decode_packet(const void *packet, const void **accel,
+					const void **gyro, const int8_t **temp,
+					const void **timestamp, unsigned int *odr)
+{
+	const struct inv_icm42600_fifo_1sensor_packet *pack1 = packet;
+	const struct inv_icm42600_fifo_2sensors_packet *pack2 = packet;
+	uint8_t header = *((const uint8_t *)packet);
+
+	/* FIFO empty */
+	if (header & INV_ICM42600_FIFO_HEADER_MSG) {
+		*accel = NULL;
+		*gyro = NULL;
+		*temp = NULL;
+		*timestamp = NULL;
+		*odr = 0;
+		return 0;
+	}
+
+	/* handle odr flags */
+	*odr = 0;
+	if (header & INV_ICM42600_FIFO_HEADER_ODR_GYRO)
+		*odr |= INV_ICM42600_SENSOR_GYRO;
+	if (header & INV_ICM42600_FIFO_HEADER_ODR_ACCEL)
+		*odr |= INV_ICM42600_SENSOR_ACCEL;
+
+	/* accel + gyro */
+	if ((header & INV_ICM42600_FIFO_HEADER_ACCEL) &&
+	    (header & INV_ICM42600_FIFO_HEADER_GYRO)) {
+		*accel = &pack2->accel;
+		*gyro = &pack2->gyro;
+		*temp = &pack2->temp;
+		*timestamp = &pack2->timestamp;
+		return INV_ICM42600_FIFO_2SENSORS_PACKET_SIZE;
+	}
+
+	/* accel only */
+	if (header & INV_ICM42600_FIFO_HEADER_ACCEL) {
+		*accel = &pack1->data;
+		*gyro = NULL;
+		*temp = &pack1->temp;
+		*timestamp = NULL;
+		return INV_ICM42600_FIFO_1SENSOR_PACKET_SIZE;
+	}
+
+	/* gyro only */
+	if (header & INV_ICM42600_FIFO_HEADER_GYRO) {
+		*accel = NULL;
+		*gyro = &pack1->data;
+		*temp = &pack1->temp;
+		*timestamp = NULL;
+		return INV_ICM42600_FIFO_1SENSOR_PACKET_SIZE;
+	}
+
+	/* invalid packet if here */
+	return -EINVAL;
+}
+
+void inv_icm42600_buffer_update_fifo_period(struct inv_icm42600_state *st)
+{
+	uint32_t period_gyro, period_accel, period;
+
+	if (st->fifo.en & INV_ICM42600_SENSOR_GYRO)
+		period_gyro = inv_icm42600_odr_to_period(st->conf.gyro.odr);
+	else
+		period_gyro = U32_MAX;
+
+	if (st->fifo.en & INV_ICM42600_SENSOR_ACCEL)
+		period_accel = inv_icm42600_odr_to_period(st->conf.accel.odr);
+	else
+		period_accel = U32_MAX;
+
+	if (period_gyro <= period_accel)
+		period = period_gyro;
+	else
+		period = period_accel;
+
+	st->fifo.period = period;
+}
+
+int inv_icm42600_buffer_set_fifo_en(struct inv_icm42600_state *st,
+				    unsigned int fifo_en)
+{
+	unsigned int mask, val;
+	int ret;
+
+	/* update only FIFO EN bits */
+	mask = INV_ICM42600_FIFO_CONFIG1_TMST_FSYNC_EN |
+		INV_ICM42600_FIFO_CONFIG1_TEMP_EN |
+		INV_ICM42600_FIFO_CONFIG1_GYRO_EN |
+		INV_ICM42600_FIFO_CONFIG1_ACCEL_EN;
+
+	val = 0;
+	if (fifo_en & INV_ICM42600_SENSOR_GYRO)
+		val |= INV_ICM42600_FIFO_CONFIG1_GYRO_EN;
+	if (fifo_en & INV_ICM42600_SENSOR_ACCEL)
+		val |= INV_ICM42600_FIFO_CONFIG1_ACCEL_EN;
+	if (fifo_en & INV_ICM42600_SENSOR_TEMP)
+		val |= INV_ICM42600_FIFO_CONFIG1_TEMP_EN;
+
+	ret = regmap_update_bits(st->map, INV_ICM42600_REG_FIFO_CONFIG1, mask, val);
+	if (ret)
+		return ret;
+
+	st->fifo.en = fifo_en;
+	inv_icm42600_buffer_update_fifo_period(st);
+
+	return 0;
+}
+
+static size_t inv_icm42600_get_packet_size(unsigned int fifo_en)
+{
+	size_t packet_size;
+
+	if ((fifo_en & INV_ICM42600_SENSOR_GYRO) &&
+	    (fifo_en & INV_ICM42600_SENSOR_ACCEL))
+		packet_size = INV_ICM42600_FIFO_2SENSORS_PACKET_SIZE;
+	else
+		packet_size = INV_ICM42600_FIFO_1SENSOR_PACKET_SIZE;
+
+	return packet_size;
+}
+
+static unsigned int inv_icm42600_wm_truncate(unsigned int watermark,
+					     size_t packet_size)
+{
+	size_t wm_size;
+	unsigned int wm;
+
+	wm_size = watermark * packet_size;
+	if (wm_size > INV_ICM42600_FIFO_WATERMARK_MAX)
+		wm_size = INV_ICM42600_FIFO_WATERMARK_MAX;
+
+	wm = wm_size / packet_size;
+
+	return wm;
+}
+
+/**
+ * inv_icm42600_buffer_update_watermark - update watermark FIFO threshold
+ * @st:	driver internal state
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ *
+ * FIFO watermark threshold is computed based on the required watermark values
+ * set for gyro and accel sensors. Since watermark is all about acceptable data
+ * latency, use the smallest setting between the 2. It means choosing the
+ * smallest latency but this is not as simple as choosing the smallest watermark
+ * value. Latency depends on watermark and ODR. It requires several steps:
+ * 1) compute gyro and accel latencies and choose the smallest value.
+ * 2) adapt the choosen latency so that it is a multiple of both gyro and accel
+ *    ones. Otherwise it is possible that you don't meet a requirement. (for
+ *    example with gyro @100Hz wm 4 and accel @100Hz with wm 6, choosing the
+ *    value of 4 will not meet accel latency requirement because 6 is not a
+ *    multiple of 4. You need to use the value 2.)
+ * 3) Since all periods are multiple of each others, watermark is computed by
+ *    dividing this computed latency by the smallest period, which corresponds
+ *    to the FIFO frequency. Beware that this is only true because we are not
+ *    using 500Hz frequency which is not a multiple of the others.
+ */
+int inv_icm42600_buffer_update_watermark(struct inv_icm42600_state *st)
+{
+	size_t packet_size, wm_size;
+	unsigned int wm_gyro, wm_accel, watermark;
+	uint32_t period_gyro, period_accel, period;
+	uint32_t latency_gyro, latency_accel, latency;
+	bool restore;
+	__le16 raw_wm;
+	int ret;
+
+	packet_size = inv_icm42600_get_packet_size(st->fifo.en);
+
+	/* compute sensors latency, depending on sensor watermark and odr */
+	wm_gyro = inv_icm42600_wm_truncate(st->fifo.watermark.gyro, packet_size);
+	wm_accel = inv_icm42600_wm_truncate(st->fifo.watermark.accel, packet_size);
+	/* use us for odr to avoid overflow using 32 bits values */
+	period_gyro = inv_icm42600_odr_to_period(st->conf.gyro.odr) / 1000UL;
+	period_accel = inv_icm42600_odr_to_period(st->conf.accel.odr) / 1000UL;
+	latency_gyro = period_gyro * wm_gyro;
+	latency_accel = period_accel * wm_accel;
+
+	/* 0 value for watermark means that the sensor is turned off */
+	if (latency_gyro == 0) {
+		watermark = wm_accel;
+	} else if (latency_accel == 0) {
+		watermark = wm_gyro;
+	} else {
+		/* compute the smallest latency that is a multiple of both */
+		if (latency_gyro <= latency_accel)
+			latency = latency_gyro - (latency_accel % latency_gyro);
+		else
+			latency = latency_accel - (latency_gyro % latency_accel);
+		/* use the shortest period */
+		if (period_gyro <= period_accel)
+			period = period_gyro;
+		else
+			period = period_accel;
+		/* all this works because periods are multiple of each others */
+		watermark = latency / period;
+		if (watermark < 1)
+			watermark = 1;
+	}
+
+	/* compute watermark value in bytes */
+	wm_size = watermark * packet_size;
+
+	/* changing FIFO watermark requires to turn off watermark interrupt */
+	ret = regmap_update_bits_check(st->map, INV_ICM42600_REG_INT_SOURCE0,
+				       INV_ICM42600_INT_SOURCE0_FIFO_THS_INT1_EN,
+				       0, &restore);
+	if (ret)
+		return ret;
+
+	raw_wm = INV_ICM42600_FIFO_WATERMARK_VAL(wm_size);
+	memcpy(st->buffer, &raw_wm, sizeof(raw_wm));
+	ret = regmap_bulk_write(st->map, INV_ICM42600_REG_FIFO_WATERMARK,
+				st->buffer, sizeof(raw_wm));
+	if (ret)
+		return ret;
+
+	/* restore watermark interrupt */
+	if (restore) {
+		ret = regmap_update_bits(st->map, INV_ICM42600_REG_INT_SOURCE0,
+					 INV_ICM42600_INT_SOURCE0_FIFO_THS_INT1_EN,
+					 INV_ICM42600_INT_SOURCE0_FIFO_THS_INT1_EN);
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+}
+
+static int inv_icm42600_buffer_preenable(struct iio_dev *indio_dev)
+{
+	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	struct device *dev = regmap_get_device(st->map);
+
+	pm_runtime_get_sync(dev);
+
+	return 0;
+}
+
+/*
+ * update_scan_mode callback is turning sensors on and setting data FIFO enable
+ * bits.
+ */
+static int inv_icm42600_buffer_postenable(struct iio_dev *indio_dev)
+{
+	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	int ret;
+
+	mutex_lock(&st->lock);
+
+	/* exit if FIFO is already on */
+	if (st->fifo.on) {
+		ret = 0;
+		goto out_on;
+	}
+
+	/* set FIFO threshold interrupt */
+	ret = regmap_update_bits(st->map, INV_ICM42600_REG_INT_SOURCE0,
+				 INV_ICM42600_INT_SOURCE0_FIFO_THS_INT1_EN,
+				 INV_ICM42600_INT_SOURCE0_FIFO_THS_INT1_EN);
+	if (ret)
+		goto out_unlock;
+
+	/* flush FIFO data */
+	ret = regmap_write(st->map, INV_ICM42600_REG_SIGNAL_PATH_RESET,
+			   INV_ICM42600_SIGNAL_PATH_RESET_FIFO_FLUSH);
+	if (ret)
+		goto out_unlock;
+
+	/* set FIFO in streaming mode */
+	ret = regmap_write(st->map, INV_ICM42600_REG_FIFO_CONFIG,
+			   INV_ICM42600_FIFO_CONFIG_STREAM);
+	if (ret)
+		goto out_unlock;
+
+	/* workaround: first read of FIFO count after reset is always 0 */
+	ret = regmap_bulk_read(st->map, INV_ICM42600_REG_FIFO_COUNT, st->buffer, 2);
+	if (ret)
+		goto out_unlock;
+
+out_on:
+	/* increase FIFO on counter */
+	st->fifo.on++;
+out_unlock:
+	mutex_unlock(&st->lock);
+	return ret;
+}
+
+static int inv_icm42600_buffer_predisable(struct iio_dev *indio_dev)
+{
+	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	int ret;
+
+	mutex_lock(&st->lock);
+
+	/* exit if there are several sensors using the FIFO */
+	if (st->fifo.on > 1) {
+		ret = 0;
+		goto out_off;
+	}
+
+	/* set FIFO in bypass mode */
+	ret = regmap_write(st->map, INV_ICM42600_REG_FIFO_CONFIG,
+			   INV_ICM42600_FIFO_CONFIG_BYPASS);
+	if (ret)
+		goto out_unlock;
+
+	/* flush FIFO data */
+	ret = regmap_write(st->map, INV_ICM42600_REG_SIGNAL_PATH_RESET,
+			   INV_ICM42600_SIGNAL_PATH_RESET_FIFO_FLUSH);
+	if (ret)
+		goto out_unlock;
+
+	/* disable FIFO threshold interrupt */
+	ret = regmap_update_bits(st->map, INV_ICM42600_REG_INT_SOURCE0,
+				 INV_ICM42600_INT_SOURCE0_FIFO_THS_INT1_EN, 0);
+	if (ret)
+		goto out_unlock;
+
+out_off:
+	/* decrease FIFO on counter */
+	st->fifo.on--;
+out_unlock:
+	mutex_unlock(&st->lock);
+	return ret;
+}
+
+static int inv_icm42600_buffer_postdisable(struct iio_dev *indio_dev)
+{
+	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	struct device *dev = regmap_get_device(st->map);
+	unsigned int sensor;
+	unsigned int *watermark;
+	struct inv_icm42600_sensor_conf conf = INV_ICM42600_SENSOR_CONF_INIT;
+	unsigned int sleep_temp = 0;
+	unsigned int sleep_sensor = 0;
+	unsigned int sleep;
+	int ret;
+
+	if (indio_dev == st->indio_gyro) {
+		sensor = INV_ICM42600_SENSOR_GYRO;
+		watermark = &st->fifo.watermark.gyro;
+	} else if (indio_dev == st->indio_accel) {
+		sensor = INV_ICM42600_SENSOR_ACCEL;
+		watermark = &st->fifo.watermark.accel;
+	} else {
+		return -EINVAL;
+	}
+
+	mutex_lock(&st->lock);
+
+	ret = inv_icm42600_buffer_set_fifo_en(st, st->fifo.en & ~sensor);
+	if (ret)
+		goto out_unlock;
+
+	*watermark = 0;
+	ret = inv_icm42600_buffer_update_watermark(st);
+	if (ret)
+		goto out_unlock;
+
+	conf.mode = INV_ICM42600_SENSOR_MODE_OFF;
+	if (sensor == INV_ICM42600_SENSOR_GYRO)
+		ret = inv_icm42600_set_gyro_conf(st, &conf, &sleep_sensor);
+	else
+		ret = inv_icm42600_set_accel_conf(st, &conf, &sleep_sensor);
+	if (ret)
+		goto out_unlock;
+
+	/* if FIFO is off, turn temperature off */
+	if (!st->fifo.on)
+		ret = inv_icm42600_set_temp_conf(st, false, &sleep_temp);
+
+out_unlock:
+	mutex_unlock(&st->lock);
+
+	/* sleep maximum required time */
+	if (sleep_sensor > sleep_temp)
+		sleep = sleep_sensor;
+	else
+		sleep = sleep_temp;
+	if (sleep)
+		msleep(sleep);
+
+	pm_runtime_mark_last_busy(dev);
+	pm_runtime_put_autosuspend(dev);
+
+	return ret;
+}
+
+const struct iio_buffer_setup_ops inv_icm42600_buffer_ops = {
+	.preenable = inv_icm42600_buffer_preenable,
+	.postenable = inv_icm42600_buffer_postenable,
+	.predisable = inv_icm42600_buffer_predisable,
+	.postdisable = inv_icm42600_buffer_postdisable,
+};
+
+int inv_icm42600_buffer_fifo_read(struct inv_icm42600_state *st,
+				  unsigned int max)
+{
+	size_t max_count;
+	__be16 *raw_fifo_count;
+	ssize_t i, size;
+	const void *accel, *gyro, *timestamp;
+	const int8_t *temp;
+	unsigned int odr;
+	int ret;
+
+	/* reset all samples counters */
+	st->fifo.count = 0;
+	st->fifo.nb.gyro = 0;
+	st->fifo.nb.accel = 0;
+	st->fifo.nb.total = 0;
+
+	/* compute maximum FIFO read size */
+	if (max == 0)
+		max_count = sizeof(st->fifo.data);
+	else
+		max_count = max * inv_icm42600_get_packet_size(st->fifo.en);
+
+	/* read FIFO count value */
+	raw_fifo_count = (__be16 *)st->buffer;
+	ret = regmap_bulk_read(st->map, INV_ICM42600_REG_FIFO_COUNT,
+			       raw_fifo_count, sizeof(*raw_fifo_count));
+	if (ret)
+		return ret;
+	st->fifo.count = be16_to_cpup(raw_fifo_count);
+
+	/* check and clamp FIFO count value */
+	if (st->fifo.count == 0)
+		return 0;
+	if (st->fifo.count > max_count)
+		st->fifo.count = max_count;
+
+	/* read all FIFO data in internal buffer */
+	ret = regmap_noinc_read(st->map, INV_ICM42600_REG_FIFO_DATA,
+				st->fifo.data, st->fifo.count);
+	if (ret)
+		return ret;
+
+	/* compute number of samples for each sensor */
+	for (i = 0; i < st->fifo.count; i += size) {
+		size = inv_icm42600_fifo_decode_packet(&st->fifo.data[i],
+				&accel, &gyro, &temp, &timestamp, &odr);
+		if (size <= 0)
+			break;
+		if (gyro != NULL && inv_icm42600_fifo_is_data_valid(gyro))
+			st->fifo.nb.gyro++;
+		if (accel != NULL && inv_icm42600_fifo_is_data_valid(accel))
+			st->fifo.nb.accel++;
+		st->fifo.nb.total++;
+	}
+
+	return 0;
+}
+
+int inv_icm42600_buffer_fifo_parse(struct inv_icm42600_state *st)
+{
+	int ret;
+
+	if (st->fifo.nb.total == 0)
+		return 0;
+
+	if (st->fifo.nb.gyro > 0) {
+		ret = inv_icm42600_gyro_parse_fifo(st->indio_gyro);
+		if (ret)
+			return ret;
+	}
+
+	if (st->fifo.nb.accel > 0) {
+		ret = inv_icm42600_accel_parse_fifo(st->indio_accel);
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+}
+
+int inv_icm42600_buffer_hwfifo_flush(struct inv_icm42600_state *st,
+				     unsigned int count)
+{
+	int ret;
+
+	ret = inv_icm42600_buffer_fifo_read(st, count);
+	if (ret)
+		return ret;
+
+	if (st->fifo.nb.total == 0)
+		return 0;
+
+	if (st->fifo.nb.gyro > 0) {
+		ret = inv_icm42600_gyro_parse_fifo(st->indio_gyro);
+		if (ret)
+			return ret;
+	}
+
+	if (st->fifo.nb.accel > 0) {
+		ret = inv_icm42600_accel_parse_fifo(st->indio_accel);
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+}
+
+int inv_icm42600_buffer_init(struct inv_icm42600_state *st)
+{
+	unsigned int val;
+	int ret;
+
+	/*
+	 * Default FIFO configuration (bits 7 to 5)
+	 * - use invalid value
+	 * - FIFO count in bytes
+	 * - FIFO count in big endian
+	 */
+	val = INV_ICM42600_INTF_CONFIG0_FIFO_COUNT_ENDIAN;
+	ret = regmap_update_bits(st->map, INV_ICM42600_REG_INTF_CONFIG0,
+				 GENMASK(7, 5), val);
+	if (ret)
+		return ret;
+
+	/*
+	 * Enable FIFO partial read and continuous watermark interrupt.
+	 * Disable all FIFO EN bits.
+	 */
+	val = INV_ICM42600_FIFO_CONFIG1_RESUME_PARTIAL_RD |
+	      INV_ICM42600_FIFO_CONFIG1_WM_GT_TH;
+	return regmap_update_bits(st->map, INV_ICM42600_REG_FIFO_CONFIG1,
+				  GENMASK(6, 5) | GENMASK(3, 0), val);
+}
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.h b/drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.h
new file mode 100644
index 000000000000..de2a3949dcc7
--- /dev/null
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.h
@@ -0,0 +1,98 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2020 Invensense, Inc.
+ */
+
+#ifndef INV_ICM42600_BUFFER_H_
+#define INV_ICM42600_BUFFER_H_
+
+#include <linux/kernel.h>
+#include <linux/bits.h>
+
+struct inv_icm42600_state;
+
+#define INV_ICM42600_SENSOR_GYRO	BIT(0)
+#define INV_ICM42600_SENSOR_ACCEL	BIT(1)
+#define INV_ICM42600_SENSOR_TEMP	BIT(2)
+
+/**
+ * struct inv_icm42600_fifo - FIFO state variables
+ * @on:		reference counter for FIFO on.
+ * @en:		bits field of INV_ICM42600_SENSOR_* for FIFO EN bits.
+ * @period:	FIFO internal period.
+ * @watermark:	watermark configuration values for accel and gyro.
+ * @count:	number of bytes in the FIFO data buffer.
+ * @nb:		gyro, accel and total samples in the FIFO data buffer.
+ * @data:	FIFO data buffer aligned for DMA (2kB + 32 bytes of read cache).
+ */
+struct inv_icm42600_fifo {
+	unsigned int on;
+	unsigned int en;
+	uint32_t period;
+	struct {
+		unsigned int gyro;
+		unsigned int accel;
+	} watermark;
+	size_t count;
+	struct {
+		size_t gyro;
+		size_t accel;
+		size_t total;
+	} nb;
+	uint8_t data[2080] ____cacheline_aligned;
+};
+
+/* FIFO data packet */
+struct inv_icm42600_fifo_sensor_data {
+	__be16 x;
+	__be16 y;
+	__be16 z;
+} __packed;
+#define INV_ICM42600_FIFO_DATA_INVALID		-32768
+
+static inline int16_t inv_icm42600_fifo_get_sensor_data(__be16 d)
+{
+	return be16_to_cpu(d);
+}
+
+static inline bool
+inv_icm42600_fifo_is_data_valid(const struct inv_icm42600_fifo_sensor_data *s)
+{
+	int16_t x, y, z;
+
+	x = inv_icm42600_fifo_get_sensor_data(s->x);
+	y = inv_icm42600_fifo_get_sensor_data(s->y);
+	z = inv_icm42600_fifo_get_sensor_data(s->z);
+
+	if (x == INV_ICM42600_FIFO_DATA_INVALID &&
+	    y == INV_ICM42600_FIFO_DATA_INVALID &&
+	    z == INV_ICM42600_FIFO_DATA_INVALID)
+		return false;
+
+	return true;
+}
+
+ssize_t inv_icm42600_fifo_decode_packet(const void *packet, const void **accel,
+					const void **gyro, const int8_t **temp,
+					const void **timestamp, unsigned int *odr);
+
+extern const struct iio_buffer_setup_ops inv_icm42600_buffer_ops;
+
+int inv_icm42600_buffer_init(struct inv_icm42600_state *st);
+
+void inv_icm42600_buffer_update_fifo_period(struct inv_icm42600_state *st);
+
+int inv_icm42600_buffer_set_fifo_en(struct inv_icm42600_state *st,
+				    unsigned int fifo_en);
+
+int inv_icm42600_buffer_update_watermark(struct inv_icm42600_state *st);
+
+int inv_icm42600_buffer_fifo_read(struct inv_icm42600_state *st,
+				  unsigned int max);
+
+int inv_icm42600_buffer_fifo_parse(struct inv_icm42600_state *st);
+
+int inv_icm42600_buffer_hwfifo_flush(struct inv_icm42600_state *st,
+				     unsigned int count);
+
+#endif
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
index 95b2a6d91e5b..9e1f6e65fd45 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
@@ -18,6 +18,7 @@
 #include <linux/iio/iio.h>
 
 #include "inv_icm42600.h"
+#include "inv_icm42600_buffer.h"
 
 static const struct regmap_range_cfg inv_icm42600_regmap_ranges[] = {
 	{
@@ -428,6 +429,18 @@ static irqreturn_t inv_icm42600_irq_handler(int irq, void *_data)
 	if (status & INV_ICM42600_INT_STATUS_FIFO_FULL)
 		dev_warn(dev, "FIFO full data lost!\n");
 
+	/* FIFO threshold reached */
+	if (status & INV_ICM42600_INT_STATUS_FIFO_THS) {
+		ret = inv_icm42600_buffer_fifo_read(st, 0);
+		if (ret) {
+			dev_err(dev, "FIFO read error %d\n", ret);
+			goto out_unlock;
+		}
+		ret = inv_icm42600_buffer_fifo_parse(st);
+		if (ret)
+			dev_err(dev, "FIFO parsing error %d\n", ret);
+	}
+
 out_unlock:
 	mutex_unlock(&st->lock);
 	return IRQ_HANDLED;
@@ -604,6 +617,10 @@ int inv_icm42600_core_probe(struct regmap *regmap, int chip, int irq,
 	if (ret)
 		return ret;
 
+	ret = inv_icm42600_buffer_init(st);
+	if (ret)
+		return ret;
+
 	st->indio_gyro = inv_icm42600_gyro_init(st);
 	if (IS_ERR(st->indio_gyro))
 		return PTR_ERR(st->indio_gyro);
@@ -649,6 +666,14 @@ static int __maybe_unused inv_icm42600_suspend(struct device *dev)
 		goto out_unlock;
 	}
 
+	/* disable FIFO data streaming */
+	if (st->fifo.on) {
+		ret = regmap_write(st->map, INV_ICM42600_REG_FIFO_CONFIG,
+				   INV_ICM42600_FIFO_CONFIG_BYPASS);
+		if (ret)
+			goto out_unlock;
+	}
+
 	ret = inv_icm42600_set_pwr_mgmt0(st, INV_ICM42600_SENSOR_MODE_OFF,
 					 INV_ICM42600_SENSOR_MODE_OFF, false,
 					 NULL);
@@ -688,6 +713,11 @@ static int __maybe_unused inv_icm42600_resume(struct device *dev)
 	if (ret)
 		goto out_unlock;
 
+	/* restore FIFO data streaming */
+	if (st->fifo.on)
+		ret = regmap_write(st->map, INV_ICM42600_REG_FIFO_CONFIG,
+				   INV_ICM42600_FIFO_CONFIG_STREAM);
+
 out_unlock:
 	mutex_unlock(&st->lock);
 	return ret;
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c
index 6a0e7661fa48..3b1f7594b60b 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c
@@ -11,9 +11,12 @@
 #include <linux/delay.h>
 #include <linux/math64.h>
 #include <linux/iio/iio.h>
+#include <linux/iio/buffer.h>
+#include <linux/iio/kfifo_buf.h>
 
 #include "inv_icm42600.h"
 #include "inv_icm42600_temp.h"
+#include "inv_icm42600_buffer.h"
 
 #define INV_ICM42600_GYRO_CHAN(_modifier, _index, _ext_info)		\
 	{								\
@@ -64,6 +67,78 @@ static const struct iio_chan_spec inv_icm42600_gyro_channels[] = {
 	INV_ICM42600_TEMP_CHAN(INV_ICM42600_GYRO_SCAN_TEMP),
 };
 
+/*
+ * IIO buffer data: size must be a power of 2
+ * 8 bytes: 6 bytes angular velocity and 2 bytes temperature
+ */
+struct inv_icm42600_gyro_buffer {
+	struct inv_icm42600_fifo_sensor_data gyro;
+	int16_t temp;
+};
+
+#define INV_ICM42600_SCAN_MASK_GYRO_3AXIS				\
+	(BIT(INV_ICM42600_GYRO_SCAN_X) |				\
+	BIT(INV_ICM42600_GYRO_SCAN_Y) |					\
+	BIT(INV_ICM42600_GYRO_SCAN_Z))
+
+#define INV_ICM42600_SCAN_MASK_TEMP	BIT(INV_ICM42600_GYRO_SCAN_TEMP)
+
+static const unsigned long inv_icm42600_gyro_scan_masks[] = {
+	/* 3-axis gyro + temperature */
+	INV_ICM42600_SCAN_MASK_GYRO_3AXIS | INV_ICM42600_SCAN_MASK_TEMP,
+	0,
+};
+
+/* enable gyroscope sensor and FIFO write */
+static int inv_icm42600_gyro_update_scan_mode(struct iio_dev *indio_dev,
+					      const unsigned long *scan_mask)
+{
+	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	struct inv_icm42600_sensor_conf conf = INV_ICM42600_SENSOR_CONF_INIT;
+	unsigned int fifo_en = 0;
+	unsigned int sleep_gyro = 0;
+	unsigned int sleep_temp = 0;
+	unsigned int sleep;
+	int ret;
+
+	mutex_lock(&st->lock);
+
+	if (*scan_mask & INV_ICM42600_SCAN_MASK_TEMP) {
+		/* enable temp sensor */
+		ret = inv_icm42600_set_temp_conf(st, true, &sleep_temp);
+		if (ret)
+			goto out_unlock;
+		fifo_en |= INV_ICM42600_SENSOR_TEMP;
+	}
+
+	if (*scan_mask & INV_ICM42600_SCAN_MASK_GYRO_3AXIS) {
+		/* enable gyro sensor */
+		conf.mode = INV_ICM42600_SENSOR_MODE_LOW_NOISE;
+		ret = inv_icm42600_set_gyro_conf(st, &conf, &sleep_gyro);
+		if (ret)
+			goto out_unlock;
+		fifo_en |= INV_ICM42600_SENSOR_GYRO;
+	}
+
+	/* update data FIFO write */
+	ret = inv_icm42600_buffer_set_fifo_en(st, fifo_en | st->fifo.en);
+	if (ret)
+		goto out_unlock;
+
+	ret = inv_icm42600_buffer_update_watermark(st);
+
+out_unlock:
+	mutex_unlock(&st->lock);
+	/* sleep maximum required time */
+	if (sleep_gyro > sleep_temp)
+		sleep = sleep_gyro;
+	else
+		sleep = sleep_temp;
+	if (sleep)
+		msleep(sleep);
+	return ret;
+}
+
 static int inv_icm42600_gyro_read_sensor(struct inv_icm42600_state *st,
 					 struct iio_chan_spec const *chan,
 					 int16_t *val)
@@ -260,7 +335,12 @@ static int inv_icm42600_gyro_write_odr(struct inv_icm42600_state *st,
 	mutex_lock(&st->lock);
 
 	ret = inv_icm42600_set_gyro_conf(st, &conf, NULL);
+	if (ret)
+		goto out_unlock;
+	inv_icm42600_buffer_update_fifo_period(st);
+	inv_icm42600_buffer_update_watermark(st);
 
+out_unlock:
 	mutex_unlock(&st->lock);
 	pm_runtime_mark_last_busy(dev);
 	pm_runtime_put_autosuspend(dev);
@@ -574,12 +654,51 @@ static int inv_icm42600_gyro_write_raw_get_fmt(struct iio_dev *indio_dev,
 	}
 }
 
+static int inv_icm42600_gyro_hwfifo_set_watermark(struct iio_dev *indio_dev,
+						  unsigned int val)
+{
+	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	int ret;
+
+	mutex_lock(&st->lock);
+
+	st->fifo.watermark.gyro = val;
+	ret = inv_icm42600_buffer_update_watermark(st);
+
+	mutex_unlock(&st->lock);
+
+	return ret;
+}
+
+static int inv_icm42600_gyro_hwfifo_flush(struct iio_dev *indio_dev,
+					  unsigned int count)
+{
+	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	int ret;
+
+	if (count == 0)
+		return 0;
+
+	mutex_lock(&st->lock);
+
+	ret = inv_icm42600_buffer_hwfifo_flush(st, count);
+	if (!ret)
+		ret = st->fifo.nb.gyro;
+
+	mutex_unlock(&st->lock);
+
+	return ret;
+}
+
 static const struct iio_info inv_icm42600_gyro_info = {
 	.read_raw = inv_icm42600_gyro_read_raw,
 	.read_avail = inv_icm42600_gyro_read_avail,
 	.write_raw = inv_icm42600_gyro_write_raw,
 	.write_raw_get_fmt = inv_icm42600_gyro_write_raw_get_fmt,
 	.debugfs_reg_access = inv_icm42600_debugfs_reg,
+	.update_scan_mode = inv_icm42600_gyro_update_scan_mode,
+	.hwfifo_set_watermark = inv_icm42600_gyro_hwfifo_set_watermark,
+	.hwfifo_flush_to_buffer = inv_icm42600_gyro_hwfifo_flush,
 };
 
 struct iio_dev *inv_icm42600_gyro_init(struct inv_icm42600_state *st)
@@ -587,6 +706,7 @@ struct iio_dev *inv_icm42600_gyro_init(struct inv_icm42600_state *st)
 	struct device *dev = regmap_get_device(st->map);
 	const char *name;
 	struct iio_dev *indio_dev;
+	struct iio_buffer *buffer;
 	int ret;
 
 	name = devm_kasprintf(dev, GFP_KERNEL, "%s-gyro", st->name);
@@ -597,12 +717,20 @@ struct iio_dev *inv_icm42600_gyro_init(struct inv_icm42600_state *st)
 	if (!indio_dev)
 		return ERR_PTR(-ENOMEM);
 
+	buffer = devm_iio_kfifo_allocate(dev);
+	if (!buffer)
+		return ERR_PTR(-ENOMEM);
+
 	iio_device_set_drvdata(indio_dev, st);
 	indio_dev->name = name;
 	indio_dev->info = &inv_icm42600_gyro_info;
-	indio_dev->modes = INDIO_DIRECT_MODE;
+	indio_dev->modes = INDIO_DIRECT_MODE | INDIO_BUFFER_SOFTWARE;
 	indio_dev->channels = inv_icm42600_gyro_channels;
 	indio_dev->num_channels = ARRAY_SIZE(inv_icm42600_gyro_channels);
+	indio_dev->available_scan_masks = inv_icm42600_gyro_scan_masks;
+	indio_dev->setup_ops = &inv_icm42600_buffer_ops;
+
+	iio_device_attach_buffer(indio_dev, buffer);
 
 	ret = devm_iio_device_register(dev, indio_dev);
 	if (ret)
@@ -610,3 +738,35 @@ struct iio_dev *inv_icm42600_gyro_init(struct inv_icm42600_state *st)
 
 	return indio_dev;
 }
+
+int inv_icm42600_gyro_parse_fifo(struct iio_dev *indio_dev)
+{
+	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	ssize_t i, size;
+	const void *accel, *gyro, *timestamp;
+	const int8_t *temp;
+	unsigned int odr;
+	struct inv_icm42600_gyro_buffer buffer;
+
+	/* parse all fifo packets */
+	for (i = 0; i < st->fifo.count; i += size) {
+		size = inv_icm42600_fifo_decode_packet(&st->fifo.data[i],
+				&accel, &gyro, &temp, &timestamp, &odr);
+		/* quit if error or FIFO is empty */
+		if (size <= 0)
+			return size;
+
+		/* skip packet if no gyro data or data is invalid */
+		if (gyro == NULL || !inv_icm42600_fifo_is_data_valid(gyro))
+			continue;
+
+		/* buffer is copied to userspace, zeroing it to avoid any data leak */
+		memset(&buffer, 0, sizeof(buffer));
+		memcpy(&buffer.gyro, gyro, sizeof(buffer.gyro));
+		/* convert 8 bits FIFO temperature in high resolution format */
+		buffer.temp = temp ? (*temp * 64) : 0;
+		iio_push_to_buffers(indio_dev, &buffer);
+	}
+
+	return 0;
+}

commit 9a4f272340ab99fbda9e6dc6efe1afee5300c1ef
Author: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
Date:   Mon Jun 22 17:37:25 2020 +0200

    UPSTREAM: iio: imu: inv_icm42600: add device interrupt
    
    Add INT1 interrupt support. Support interrupt edge and level,
    active high or low. Push-pull or open-drain configurations.
    
    Interrupt will be used to read data from the FIFO.
    
    Signed-off-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    (cherry picked from commit e5efa1049b9eb36c4fcf59a78b6f37e45fe5572d)
    Signed-off-by: Shunqian Zheng <zhengsq@rock-chips.com>
    Change-Id: Ic6c19caa25e67a44d4d6ab7dd876fc023388bc31

diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600.h b/drivers/iio/imu/inv_icm42600/inv_icm42600.h
index 3b190461a2b6..148894c888cc 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600.h
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600.h
@@ -372,7 +372,7 @@ int inv_icm42600_set_temp_conf(struct inv_icm42600_state *st, bool enable,
 int inv_icm42600_debugfs_reg(struct iio_dev *indio_dev, unsigned int reg,
 			     unsigned int writeval, unsigned int *readval);
 
-int inv_icm42600_core_probe(struct regmap *regmap, int chip,
+int inv_icm42600_core_probe(struct regmap *regmap, int chip, int irq,
 			    inv_icm42600_bus_setup bus_setup);
 
 struct iio_dev *inv_icm42600_gyro_init(struct inv_icm42600_state *st);
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
index a35ff21f50bb..95b2a6d91e5b 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
@@ -9,8 +9,11 @@
 #include <linux/slab.h>
 #include <linux/delay.h>
 #include <linux/mutex.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
 #include <linux/regulator/consumer.h>
 #include <linux/pm_runtime.h>
+#include <linux/property.h>
 #include <linux/regmap.h>
 #include <linux/iio/iio.h>
 
@@ -408,6 +411,82 @@ static int inv_icm42600_setup(struct inv_icm42600_state *st,
 	return inv_icm42600_set_conf(st, hw->conf);
 }
 
+static irqreturn_t inv_icm42600_irq_handler(int irq, void *_data)
+{
+	struct inv_icm42600_state *st = _data;
+	struct device *dev = regmap_get_device(st->map);
+	unsigned int status;
+	int ret;
+
+	mutex_lock(&st->lock);
+
+	ret = regmap_read(st->map, INV_ICM42600_REG_INT_STATUS, &status);
+	if (ret)
+		goto out_unlock;
+
+	/* FIFO full */
+	if (status & INV_ICM42600_INT_STATUS_FIFO_FULL)
+		dev_warn(dev, "FIFO full data lost!\n");
+
+out_unlock:
+	mutex_unlock(&st->lock);
+	return IRQ_HANDLED;
+}
+
+/**
+ * inv_icm42600_irq_init() - initialize int pin and interrupt handler
+ * @st:		driver internal state
+ * @irq:	irq number
+ * @irq_type:	irq trigger type
+ * @open_drain:	true if irq is open drain, false for push-pull
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ */
+static int inv_icm42600_irq_init(struct inv_icm42600_state *st, int irq,
+				 int irq_type, bool open_drain)
+{
+	struct device *dev = regmap_get_device(st->map);
+	unsigned int val;
+	int ret;
+
+	/* configure INT1 interrupt: default is active low on edge */
+	switch (irq_type) {
+	case IRQF_TRIGGER_RISING:
+	case IRQF_TRIGGER_HIGH:
+		val = INV_ICM42600_INT_CONFIG_INT1_ACTIVE_HIGH;
+		break;
+	default:
+		val = INV_ICM42600_INT_CONFIG_INT1_ACTIVE_LOW;
+		break;
+	}
+
+	switch (irq_type) {
+	case IRQF_TRIGGER_LOW:
+	case IRQF_TRIGGER_HIGH:
+		val |= INV_ICM42600_INT_CONFIG_INT1_LATCHED;
+		break;
+	default:
+		break;
+	}
+
+	if (!open_drain)
+		val |= INV_ICM42600_INT_CONFIG_INT1_PUSH_PULL;
+
+	ret = regmap_write(st->map, INV_ICM42600_REG_INT_CONFIG, val);
+	if (ret)
+		return ret;
+
+	/* Deassert async reset for proper INT pin operation (cf datasheet) */
+	ret = regmap_update_bits(st->map, INV_ICM42600_REG_INT_CONFIG1,
+				 INV_ICM42600_INT_CONFIG1_ASYNC_RESET, 0);
+	if (ret)
+		return ret;
+
+	return devm_request_threaded_irq(dev, irq, NULL,
+					 inv_icm42600_irq_handler, irq_type,
+					 "inv_icm42600", st);
+}
+
 static int inv_icm42600_enable_regulator_vddio(struct inv_icm42600_state *st)
 {
 	int ret;
@@ -452,11 +531,14 @@ static void inv_icm42600_disable_pm(void *_data)
 	pm_runtime_disable(dev);
 }
 
-int inv_icm42600_core_probe(struct regmap *regmap, int chip,
+int inv_icm42600_core_probe(struct regmap *regmap, int chip, int irq,
 			    inv_icm42600_bus_setup bus_setup)
 {
 	struct device *dev = regmap_get_device(regmap);
 	struct inv_icm42600_state *st;
+	struct irq_data *irq_desc;
+	int irq_type;
+	bool open_drain;
 	int ret;
 
 	if (chip < 0 || chip >= INV_CHIP_NB) {
@@ -464,6 +546,19 @@ int inv_icm42600_core_probe(struct regmap *regmap, int chip,
 		return -ENODEV;
 	}
 
+	/* get irq properties, set trigger falling by default */
+	irq_desc = irq_get_irq_data(irq);
+	if (!irq_desc) {
+		dev_err(dev, "could not find IRQ %d\n", irq);
+		return -EINVAL;
+	}
+
+	irq_type = irqd_get_trigger_type(irq_desc);
+	if (!irq_type)
+		irq_type = IRQF_TRIGGER_FALLING;
+
+	open_drain = device_property_read_bool(dev, "drive-open-drain");
+
 	st = devm_kzalloc(dev, sizeof(*st), GFP_KERNEL);
 	if (!st)
 		return -ENOMEM;
@@ -517,6 +612,10 @@ int inv_icm42600_core_probe(struct regmap *regmap, int chip,
 	if (IS_ERR(st->indio_accel))
 		return PTR_ERR(st->indio_accel);
 
+	ret = inv_icm42600_irq_init(st, irq, irq_type, open_drain);
+	if (ret)
+		return ret;
+
 	/* setup runtime power management */
 	ret = pm_runtime_set_active(dev);
 	if (ret)
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c
index 4789cead23b3..85b1934cec60 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c
@@ -64,7 +64,8 @@ static int inv_icm42600_probe(struct i2c_client *client)
 	if (IS_ERR(regmap))
 		return PTR_ERR(regmap);
 
-	return inv_icm42600_core_probe(regmap, chip, inv_icm42600_i2c_bus_setup);
+	return inv_icm42600_core_probe(regmap, chip, client->irq,
+				       inv_icm42600_i2c_bus_setup);
 }
 
 static const struct of_device_id inv_icm42600_of_matches[] = {
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c
index a9c5e2fdbe2a..323789697a08 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c
@@ -63,7 +63,8 @@ static int inv_icm42600_probe(struct spi_device *spi)
 	if (IS_ERR(regmap))
 		return PTR_ERR(regmap);
 
-	return inv_icm42600_core_probe(regmap, chip, inv_icm42600_spi_bus_setup);
+	return inv_icm42600_core_probe(regmap, chip, spi->irq,
+				       inv_icm42600_spi_bus_setup);
 }
 
 static const struct of_device_id inv_icm42600_of_matches[] = {

commit faabd7297ae67cacb752ad63db0267808f0961ea
Author: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
Date:   Mon Jun 22 17:37:23 2020 +0200

    UPSTREAM: iio: imu: add Kconfig and Makefile for inv_icm42600 driver
    
    Add 3 modules: inv-icm42600, inv-icm42600-i2c, inv-icm42600-spi.
    
    Signed-off-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    (cherry picked from commit 8237945dbc5513e3776bc0844a2ba36a972f24f5)
    Signed-off-by: Shunqian Zheng <zhengsq@rock-chips.com>
    Change-Id: I8bd9bcc06c9886daad5915d94bbfc20025ab23b6

diff --git a/drivers/iio/imu/Kconfig b/drivers/iio/imu/Kconfig
index 156630a21696..b01aaed03772 100644
--- a/drivers/iio/imu/Kconfig
+++ b/drivers/iio/imu/Kconfig
@@ -38,6 +38,7 @@ config KMX61
 	  To compile this driver as module, choose M here: the module will
 	  be called kmx61.
 
+source "drivers/iio/imu/inv_icm42600/Kconfig"
 source "drivers/iio/imu/inv_mpu6050/Kconfig"
 source "drivers/iio/imu/st_lsm6dsx/Kconfig"
 
diff --git a/drivers/iio/imu/Makefile b/drivers/iio/imu/Makefile
index 68629c68b19b..d337acb916ab 100644
--- a/drivers/iio/imu/Makefile
+++ b/drivers/iio/imu/Makefile
@@ -15,6 +15,7 @@ adis_lib-$(CONFIG_IIO_ADIS_LIB_BUFFER) += adis_buffer.o
 obj-$(CONFIG_IIO_ADIS_LIB) += adis_lib.o
 
 obj-y += bmi160/
+obj-y += inv_icm42600/
 obj-y += inv_mpu6050/
 
 obj-$(CONFIG_KMX61) += kmx61.o
diff --git a/drivers/iio/imu/inv_icm42600/Kconfig b/drivers/iio/imu/inv_icm42600/Kconfig
new file mode 100644
index 000000000000..22390a72f0a3
--- /dev/null
+++ b/drivers/iio/imu/inv_icm42600/Kconfig
@@ -0,0 +1,28 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+config INV_ICM42600
+	tristate
+
+config INV_ICM42600_I2C
+	tristate "InvenSense ICM-426xx I2C driver"
+	depends on I2C
+	select INV_ICM42600
+	select REGMAP_I2C
+	help
+	  This driver supports the InvenSense ICM-426xx motion tracking
+	  devices over I2C.
+
+	  This driver can be built as a module. The module will be called
+	  inv-icm42600-i2c.
+
+config INV_ICM42600_SPI
+	tristate "InvenSense ICM-426xx SPI driver"
+	depends on SPI_MASTER
+	select INV_ICM42600
+	select REGMAP_SPI
+	help
+	  This driver supports the InvenSense ICM-426xx motion tracking
+	  devices over SPI.
+
+	  This driver can be built as a module. The module will be called
+	  inv-icm42600-spi.
diff --git a/drivers/iio/imu/inv_icm42600/Makefile b/drivers/iio/imu/inv_icm42600/Makefile
new file mode 100644
index 000000000000..48965824f00c
--- /dev/null
+++ b/drivers/iio/imu/inv_icm42600/Makefile
@@ -0,0 +1,13 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+obj-$(CONFIG_INV_ICM42600) += inv-icm42600.o
+inv-icm42600-y += inv_icm42600_core.o
+inv-icm42600-y += inv_icm42600_gyro.o
+inv-icm42600-y += inv_icm42600_accel.o
+inv-icm42600-y += inv_icm42600_temp.o
+
+obj-$(CONFIG_INV_ICM42600_I2C) += inv-icm42600-i2c.o
+inv-icm42600-i2c-y += inv_icm42600_i2c.o
+
+obj-$(CONFIG_INV_ICM42600_SPI) += inv-icm42600-spi.o
+inv-icm42600-spi-y += inv_icm42600_spi.o

commit 1ffc3c45e865e8ca1ec0debef872a6fa746800f6
Author: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
Date:   Mon Jun 22 17:37:22 2020 +0200

    UPSTREAM: iio: imu: inv_icm42600: add temperature sensor support
    
    Add temperature channel in gyroscope and accelerometer devices.
    
    Temperature is available in full 16 bits resolution when reading
    register and in low 8 bits resolution in the FIFO. Return full
    precision raw temperature with corresponding scale and offset.
    
    Signed-off-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    (cherry picked from commit bc3eb0207fb52b575cf3e4863b43be53291acc3b)
    Signed-off-by: Shunqian Zheng <zhengsq@rock-chips.com>
    Change-Id: I76b7a140b4d504289cdc433f2e36835ad5f1984d

diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c
index 717c6b0869fc..3f214df44093 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c
@@ -13,6 +13,7 @@
 #include <linux/iio/iio.h>
 
 #include "inv_icm42600.h"
+#include "inv_icm42600_temp.h"
 
 #define INV_ICM42600_ACCEL_CHAN(_modifier, _index, _ext_info)		\
 	{								\
@@ -45,6 +46,7 @@ enum inv_icm42600_accel_scan {
 	INV_ICM42600_ACCEL_SCAN_X,
 	INV_ICM42600_ACCEL_SCAN_Y,
 	INV_ICM42600_ACCEL_SCAN_Z,
+	INV_ICM42600_ACCEL_SCAN_TEMP,
 };
 
 static const struct iio_chan_spec_ext_info inv_icm42600_accel_ext_infos[] = {
@@ -59,6 +61,7 @@ static const struct iio_chan_spec inv_icm42600_accel_channels[] = {
 				inv_icm42600_accel_ext_infos),
 	INV_ICM42600_ACCEL_CHAN(IIO_MOD_Z, INV_ICM42600_ACCEL_SCAN_Z,
 				inv_icm42600_accel_ext_infos),
+	INV_ICM42600_TEMP_CHAN(INV_ICM42600_ACCEL_SCAN_TEMP),
 };
 
 static int inv_icm42600_accel_read_sensor(struct inv_icm42600_state *st,
@@ -450,8 +453,14 @@ static int inv_icm42600_accel_read_raw(struct iio_dev *indio_dev,
 	int16_t data;
 	int ret;
 
-	if (chan->type != IIO_ACCEL)
+	switch (chan->type) {
+	case IIO_ACCEL:
+		break;
+	case IIO_TEMP:
+		return inv_icm42600_temp_read_raw(indio_dev, chan, val, val2, mask);
+	default:
 		return -EINVAL;
+	}
 
 	switch (mask) {
 	case IIO_CHAN_INFO_RAW:
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c
index 3875ecbee67e..6a0e7661fa48 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c
@@ -13,6 +13,7 @@
 #include <linux/iio/iio.h>
 
 #include "inv_icm42600.h"
+#include "inv_icm42600_temp.h"
 
 #define INV_ICM42600_GYRO_CHAN(_modifier, _index, _ext_info)		\
 	{								\
@@ -45,6 +46,7 @@ enum inv_icm42600_gyro_scan {
 	INV_ICM42600_GYRO_SCAN_X,
 	INV_ICM42600_GYRO_SCAN_Y,
 	INV_ICM42600_GYRO_SCAN_Z,
+	INV_ICM42600_GYRO_SCAN_TEMP,
 };
 
 static const struct iio_chan_spec_ext_info inv_icm42600_gyro_ext_infos[] = {
@@ -59,6 +61,7 @@ static const struct iio_chan_spec inv_icm42600_gyro_channels[] = {
 			       inv_icm42600_gyro_ext_infos),
 	INV_ICM42600_GYRO_CHAN(IIO_MOD_Z, INV_ICM42600_GYRO_SCAN_Z,
 			       inv_icm42600_gyro_ext_infos),
+	INV_ICM42600_TEMP_CHAN(INV_ICM42600_GYRO_SCAN_TEMP),
 };
 
 static int inv_icm42600_gyro_read_sensor(struct inv_icm42600_state *st,
@@ -461,8 +464,14 @@ static int inv_icm42600_gyro_read_raw(struct iio_dev *indio_dev,
 	int16_t data;
 	int ret;
 
-	if (chan->type != IIO_ANGL_VEL)
+	switch (chan->type) {
+	case IIO_ANGL_VEL:
+		break;
+	case IIO_TEMP:
+		return inv_icm42600_temp_read_raw(indio_dev, chan, val, val2, mask);
+	default:
 		return -EINVAL;
+	}
 
 	switch (mask) {
 	case IIO_CHAN_INFO_RAW:
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_temp.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_temp.c
new file mode 100644
index 000000000000..213cce1c3111
--- /dev/null
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_temp.c
@@ -0,0 +1,84 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2020 Invensense, Inc.
+ */
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/mutex.h>
+#include <linux/pm_runtime.h>
+#include <linux/regmap.h>
+#include <linux/iio/iio.h>
+
+#include "inv_icm42600.h"
+#include "inv_icm42600_temp.h"
+
+static int inv_icm42600_temp_read(struct inv_icm42600_state *st, int16_t *temp)
+{
+	struct device *dev = regmap_get_device(st->map);
+	__be16 *raw;
+	int ret;
+
+	pm_runtime_get_sync(dev);
+	mutex_lock(&st->lock);
+
+	ret = inv_icm42600_set_temp_conf(st, true, NULL);
+	if (ret)
+		goto exit;
+
+	raw = (__be16 *)&st->buffer[0];
+	ret = regmap_bulk_read(st->map, INV_ICM42600_REG_TEMP_DATA, raw, sizeof(*raw));
+	if (ret)
+		goto exit;
+
+	*temp = (int16_t)be16_to_cpup(raw);
+	if (*temp == INV_ICM42600_DATA_INVALID)
+		ret = -EINVAL;
+
+exit:
+	mutex_unlock(&st->lock);
+	pm_runtime_mark_last_busy(dev);
+	pm_runtime_put_autosuspend(dev);
+
+	return ret;
+}
+
+int inv_icm42600_temp_read_raw(struct iio_dev *indio_dev,
+			       struct iio_chan_spec const *chan,
+			       int *val, int *val2, long mask)
+{
+	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	int16_t temp;
+	int ret;
+
+	if (chan->type != IIO_TEMP)
+		return -EINVAL;
+
+	switch (mask) {
+	case IIO_CHAN_INFO_RAW:
+		ret = iio_device_claim_direct_mode(indio_dev);
+		if (ret)
+			return ret;
+		ret = inv_icm42600_temp_read(st, &temp);
+		iio_device_release_direct_mode(indio_dev);
+		if (ret)
+			return ret;
+		*val = temp;
+		return IIO_VAL_INT;
+	/*
+	 * T°C = (temp / 132.48) + 25
+	 * Tm°C = 1000 * ((temp * 100 / 13248) + 25)
+	 * scale: 100000 / 13248 ~= 7.548309
+	 * offset: 25000
+	 */
+	case IIO_CHAN_INFO_SCALE:
+		*val = 7;
+		*val2 = 548309;
+		return IIO_VAL_INT_PLUS_MICRO;
+	case IIO_CHAN_INFO_OFFSET:
+		*val = 25000;
+		return IIO_VAL_INT;
+	default:
+		return -EINVAL;
+	}
+}
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_temp.h b/drivers/iio/imu/inv_icm42600/inv_icm42600_temp.h
new file mode 100644
index 000000000000..3941186512fb
--- /dev/null
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_temp.h
@@ -0,0 +1,30 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2020 Invensense, Inc.
+ */
+
+#ifndef INV_ICM42600_TEMP_H_
+#define INV_ICM42600_TEMP_H_
+
+#include <linux/iio/iio.h>
+
+#define INV_ICM42600_TEMP_CHAN(_index)					\
+	{								\
+		.type = IIO_TEMP,					\
+		.info_mask_separate =					\
+			BIT(IIO_CHAN_INFO_RAW) |			\
+			BIT(IIO_CHAN_INFO_OFFSET) |			\
+			BIT(IIO_CHAN_INFO_SCALE),			\
+		.scan_index = _index,					\
+		.scan_type = {						\
+			.sign = 's',					\
+			.realbits = 16,					\
+			.storagebits = 16,				\
+		},							\
+	}
+
+int inv_icm42600_temp_read_raw(struct iio_dev *indio_dev,
+			       struct iio_chan_spec const *chan,
+			       int *val, int *val2, long mask);
+
+#endif

commit 038d60f8f053f759ece466fe4b0ce9b473ef617b
Author: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
Date:   Mon Jun 22 17:37:21 2020 +0200

    UPSTREAM: iio: imu: inv_icm42600: add accelerometer IIO device
    
    Add IIO device for accelerometer sensor with data polling
    interface.
    Attributes: raw, scale, sampling_frequency, calibbias.
    
    Accelerometer in low noise mode.
    
    Signed-off-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    (cherry picked from commit a47c1cdcb901031cde22fb1261a4a36d55ae66a8)
    Signed-off-by: Shunqian Zheng <zhengsq@rock-chips.com>
    Change-Id: Iddfda60129a4029449718ab837314e71e359c5bc

diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600.h b/drivers/iio/imu/inv_icm42600/inv_icm42600.h
index d155470d770a..3b190461a2b6 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600.h
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600.h
@@ -121,6 +121,7 @@ struct inv_icm42600_suspended {
  *  @conf:		chip sensors configurations.
  *  @suspended:		suspended sensors configuration.
  *  @indio_gyro:	gyroscope IIO device.
+ *  @indio_accel:	accelerometer IIO device.
  *  @buffer:		data transfer buffer aligned for DMA.
  */
 struct inv_icm42600_state {
@@ -134,6 +135,7 @@ struct inv_icm42600_state {
 	struct inv_icm42600_conf conf;
 	struct inv_icm42600_suspended suspended;
 	struct iio_dev *indio_gyro;
+	struct iio_dev *indio_accel;
 	uint8_t buffer[2] ____cacheline_aligned;
 };
 
@@ -375,4 +377,6 @@ int inv_icm42600_core_probe(struct regmap *regmap, int chip,
 
 struct iio_dev *inv_icm42600_gyro_init(struct inv_icm42600_state *st);
 
+struct iio_dev *inv_icm42600_accel_init(struct inv_icm42600_state *st);
+
 #endif
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c
new file mode 100644
index 000000000000..717c6b0869fc
--- /dev/null
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c
@@ -0,0 +1,592 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2020 Invensense, Inc.
+ */
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/mutex.h>
+#include <linux/pm_runtime.h>
+#include <linux/regmap.h>
+#include <linux/delay.h>
+#include <linux/math64.h>
+#include <linux/iio/iio.h>
+
+#include "inv_icm42600.h"
+
+#define INV_ICM42600_ACCEL_CHAN(_modifier, _index, _ext_info)		\
+	{								\
+		.type = IIO_ACCEL,					\
+		.modified = 1,						\
+		.channel2 = _modifier,					\
+		.info_mask_separate =					\
+			BIT(IIO_CHAN_INFO_RAW) |			\
+			BIT(IIO_CHAN_INFO_CALIBBIAS),			\
+		.info_mask_shared_by_type =				\
+			BIT(IIO_CHAN_INFO_SCALE),			\
+		.info_mask_shared_by_type_available =			\
+			BIT(IIO_CHAN_INFO_SCALE) |			\
+			BIT(IIO_CHAN_INFO_CALIBBIAS),			\
+		.info_mask_shared_by_all =				\
+			BIT(IIO_CHAN_INFO_SAMP_FREQ),			\
+		.info_mask_shared_by_all_available =			\
+			BIT(IIO_CHAN_INFO_SAMP_FREQ),			\
+		.scan_index = _index,					\
+		.scan_type = {						\
+			.sign = 's',					\
+			.realbits = 16,					\
+			.storagebits = 16,				\
+			.endianness = IIO_BE,				\
+		},							\
+		.ext_info = _ext_info,					\
+	}
+
+enum inv_icm42600_accel_scan {
+	INV_ICM42600_ACCEL_SCAN_X,
+	INV_ICM42600_ACCEL_SCAN_Y,
+	INV_ICM42600_ACCEL_SCAN_Z,
+};
+
+static const struct iio_chan_spec_ext_info inv_icm42600_accel_ext_infos[] = {
+	IIO_MOUNT_MATRIX(IIO_SHARED_BY_ALL, inv_icm42600_get_mount_matrix),
+	{},
+};
+
+static const struct iio_chan_spec inv_icm42600_accel_channels[] = {
+	INV_ICM42600_ACCEL_CHAN(IIO_MOD_X, INV_ICM42600_ACCEL_SCAN_X,
+				inv_icm42600_accel_ext_infos),
+	INV_ICM42600_ACCEL_CHAN(IIO_MOD_Y, INV_ICM42600_ACCEL_SCAN_Y,
+				inv_icm42600_accel_ext_infos),
+	INV_ICM42600_ACCEL_CHAN(IIO_MOD_Z, INV_ICM42600_ACCEL_SCAN_Z,
+				inv_icm42600_accel_ext_infos),
+};
+
+static int inv_icm42600_accel_read_sensor(struct inv_icm42600_state *st,
+					  struct iio_chan_spec const *chan,
+					  int16_t *val)
+{
+	struct device *dev = regmap_get_device(st->map);
+	struct inv_icm42600_sensor_conf conf = INV_ICM42600_SENSOR_CONF_INIT;
+	unsigned int reg;
+	__be16 *data;
+	int ret;
+
+	if (chan->type != IIO_ACCEL)
+		return -EINVAL;
+
+	switch (chan->channel2) {
+	case IIO_MOD_X:
+		reg = INV_ICM42600_REG_ACCEL_DATA_X;
+		break;
+	case IIO_MOD_Y:
+		reg = INV_ICM42600_REG_ACCEL_DATA_Y;
+		break;
+	case IIO_MOD_Z:
+		reg = INV_ICM42600_REG_ACCEL_DATA_Z;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	pm_runtime_get_sync(dev);
+	mutex_lock(&st->lock);
+
+	/* enable accel sensor */
+	conf.mode = INV_ICM42600_SENSOR_MODE_LOW_NOISE;
+	ret = inv_icm42600_set_accel_conf(st, &conf, NULL);
+	if (ret)
+		goto exit;
+
+	/* read accel register data */
+	data = (__be16 *)&st->buffer[0];
+	ret = regmap_bulk_read(st->map, reg, data, sizeof(*data));
+	if (ret)
+		goto exit;
+
+	*val = (int16_t)be16_to_cpup(data);
+	if (*val == INV_ICM42600_DATA_INVALID)
+		ret = -EINVAL;
+exit:
+	mutex_unlock(&st->lock);
+	pm_runtime_mark_last_busy(dev);
+	pm_runtime_put_autosuspend(dev);
+	return ret;
+}
+
+/* IIO format int + nano */
+static const int inv_icm42600_accel_scale[] = {
+	/* +/- 16G => 0.004788403 m/s-2 */
+	[2 * INV_ICM42600_ACCEL_FS_16G] = 0,
+	[2 * INV_ICM42600_ACCEL_FS_16G + 1] = 4788403,
+	/* +/- 8G => 0.002394202 m/s-2 */
+	[2 * INV_ICM42600_ACCEL_FS_8G] = 0,
+	[2 * INV_ICM42600_ACCEL_FS_8G + 1] = 2394202,
+	/* +/- 4G => 0.001197101 m/s-2 */
+	[2 * INV_ICM42600_ACCEL_FS_4G] = 0,
+	[2 * INV_ICM42600_ACCEL_FS_4G + 1] = 1197101,
+	/* +/- 2G => 0.000598550 m/s-2 */
+	[2 * INV_ICM42600_ACCEL_FS_2G] = 0,
+	[2 * INV_ICM42600_ACCEL_FS_2G + 1] = 598550,
+};
+
+static int inv_icm42600_accel_read_scale(struct inv_icm42600_state *st,
+					 int *val, int *val2)
+{
+	unsigned int idx;
+
+	idx = st->conf.accel.fs;
+
+	*val = inv_icm42600_accel_scale[2 * idx];
+	*val2 = inv_icm42600_accel_scale[2 * idx + 1];
+	return IIO_VAL_INT_PLUS_NANO;
+}
+
+static int inv_icm42600_accel_write_scale(struct inv_icm42600_state *st,
+					  int val, int val2)
+{
+	struct device *dev = regmap_get_device(st->map);
+	unsigned int idx;
+	struct inv_icm42600_sensor_conf conf = INV_ICM42600_SENSOR_CONF_INIT;
+	int ret;
+
+	for (idx = 0; idx < ARRAY_SIZE(inv_icm42600_accel_scale); idx += 2) {
+		if (val == inv_icm42600_accel_scale[idx] &&
+		    val2 == inv_icm42600_accel_scale[idx + 1])
+			break;
+	}
+	if (idx >= ARRAY_SIZE(inv_icm42600_accel_scale))
+		return -EINVAL;
+
+	conf.fs = idx / 2;
+
+	pm_runtime_get_sync(dev);
+	mutex_lock(&st->lock);
+
+	ret = inv_icm42600_set_accel_conf(st, &conf, NULL);
+
+	mutex_unlock(&st->lock);
+	pm_runtime_mark_last_busy(dev);
+	pm_runtime_put_autosuspend(dev);
+
+	return ret;
+}
+
+/* IIO format int + micro */
+static const int inv_icm42600_accel_odr[] = {
+	/* 12.5Hz */
+	12, 500000,
+	/* 25Hz */
+	25, 0,
+	/* 50Hz */
+	50, 0,
+	/* 100Hz */
+	100, 0,
+	/* 200Hz */
+	200, 0,
+	/* 1kHz */
+	1000, 0,
+	/* 2kHz */
+	2000, 0,
+	/* 4kHz */
+	4000, 0,
+};
+
+static const int inv_icm42600_accel_odr_conv[] = {
+	INV_ICM42600_ODR_12_5HZ,
+	INV_ICM42600_ODR_25HZ,
+	INV_ICM42600_ODR_50HZ,
+	INV_ICM42600_ODR_100HZ,
+	INV_ICM42600_ODR_200HZ,
+	INV_ICM42600_ODR_1KHZ_LN,
+	INV_ICM42600_ODR_2KHZ_LN,
+	INV_ICM42600_ODR_4KHZ_LN,
+};
+
+static int inv_icm42600_accel_read_odr(struct inv_icm42600_state *st,
+				       int *val, int *val2)
+{
+	unsigned int odr;
+	unsigned int i;
+
+	odr = st->conf.accel.odr;
+
+	for (i = 0; i < ARRAY_SIZE(inv_icm42600_accel_odr_conv); ++i) {
+		if (inv_icm42600_accel_odr_conv[i] == odr)
+			break;
+	}
+	if (i >= ARRAY_SIZE(inv_icm42600_accel_odr_conv))
+		return -EINVAL;
+
+	*val = inv_icm42600_accel_odr[2 * i];
+	*val2 = inv_icm42600_accel_odr[2 * i + 1];
+
+	return IIO_VAL_INT_PLUS_MICRO;
+}
+
+static int inv_icm42600_accel_write_odr(struct inv_icm42600_state *st,
+					int val, int val2)
+{
+	struct device *dev = regmap_get_device(st->map);
+	unsigned int idx;
+	struct inv_icm42600_sensor_conf conf = INV_ICM42600_SENSOR_CONF_INIT;
+	int ret;
+
+	for (idx = 0; idx < ARRAY_SIZE(inv_icm42600_accel_odr); idx += 2) {
+		if (val == inv_icm42600_accel_odr[idx] &&
+		    val2 == inv_icm42600_accel_odr[idx + 1])
+			break;
+	}
+	if (idx >= ARRAY_SIZE(inv_icm42600_accel_odr))
+		return -EINVAL;
+
+	conf.odr = inv_icm42600_accel_odr_conv[idx / 2];
+
+	pm_runtime_get_sync(dev);
+	mutex_lock(&st->lock);
+
+	ret = inv_icm42600_set_accel_conf(st, &conf, NULL);
+
+	mutex_unlock(&st->lock);
+	pm_runtime_mark_last_busy(dev);
+	pm_runtime_put_autosuspend(dev);
+
+	return ret;
+}
+
+/*
+ * Calibration bias values, IIO range format int + micro.
+ * Value is limited to +/-1g coded on 12 bits signed. Step is 0.5mg.
+ */
+static int inv_icm42600_accel_calibbias[] = {
+	-10, 42010,		/* min: -10.042010 m/s² */
+	0, 4903,		/* step: 0.004903 m/s² */
+	10, 37106,		/* max: 10.037106 m/s² */
+};
+
+static int inv_icm42600_accel_read_offset(struct inv_icm42600_state *st,
+					  struct iio_chan_spec const *chan,
+					  int *val, int *val2)
+{
+	struct device *dev = regmap_get_device(st->map);
+	int64_t val64;
+	int32_t bias;
+	unsigned int reg;
+	int16_t offset;
+	uint8_t data[2];
+	int ret;
+
+	if (chan->type != IIO_ACCEL)
+		return -EINVAL;
+
+	switch (chan->channel2) {
+	case IIO_MOD_X:
+		reg = INV_ICM42600_REG_OFFSET_USER4;
+		break;
+	case IIO_MOD_Y:
+		reg = INV_ICM42600_REG_OFFSET_USER6;
+		break;
+	case IIO_MOD_Z:
+		reg = INV_ICM42600_REG_OFFSET_USER7;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	pm_runtime_get_sync(dev);
+	mutex_lock(&st->lock);
+
+	ret = regmap_bulk_read(st->map, reg, st->buffer, sizeof(data));
+	memcpy(data, st->buffer, sizeof(data));
+
+	mutex_unlock(&st->lock);
+	pm_runtime_mark_last_busy(dev);
+	pm_runtime_put_autosuspend(dev);
+	if (ret)
+		return ret;
+
+	/* 12 bits signed value */
+	switch (chan->channel2) {
+	case IIO_MOD_X:
+		offset = sign_extend32(((data[0] & 0xF0) << 4) | data[1], 11);
+		break;
+	case IIO_MOD_Y:
+		offset = sign_extend32(((data[1] & 0x0F) << 8) | data[0], 11);
+		break;
+	case IIO_MOD_Z:
+		offset = sign_extend32(((data[0] & 0xF0) << 4) | data[1], 11);
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	/*
+	 * convert raw offset to g then to m/s²
+	 * 12 bits signed raw step 0.5mg to g: 5 / 10000
+	 * g to m/s²: 9.806650
+	 * result in micro (1000000)
+	 * (offset * 5 * 9.806650 * 1000000) / 10000
+	 */
+	val64 = (int64_t)offset * 5LL * 9806650LL;
+	/* for rounding, add + or - divisor (10000) divided by 2 */
+	if (val64 >= 0)
+		val64 += 10000LL / 2LL;
+	else
+		val64 -= 10000LL / 2LL;
+	bias = div_s64(val64, 10000L);
+	*val = bias / 1000000L;
+	*val2 = bias % 1000000L;
+
+	return IIO_VAL_INT_PLUS_MICRO;
+}
+
+static int inv_icm42600_accel_write_offset(struct inv_icm42600_state *st,
+					   struct iio_chan_spec const *chan,
+					   int val, int val2)
+{
+	struct device *dev = regmap_get_device(st->map);
+	int64_t val64;
+	int32_t min, max;
+	unsigned int reg, regval;
+	int16_t offset;
+	int ret;
+
+	if (chan->type != IIO_ACCEL)
+		return -EINVAL;
+
+	switch (chan->channel2) {
+	case IIO_MOD_X:
+		reg = INV_ICM42600_REG_OFFSET_USER4;
+		break;
+	case IIO_MOD_Y:
+		reg = INV_ICM42600_REG_OFFSET_USER6;
+		break;
+	case IIO_MOD_Z:
+		reg = INV_ICM42600_REG_OFFSET_USER7;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	/* inv_icm42600_accel_calibbias: min - step - max in micro */
+	min = inv_icm42600_accel_calibbias[0] * 1000000L +
+	      inv_icm42600_accel_calibbias[1];
+	max = inv_icm42600_accel_calibbias[4] * 1000000L +
+	      inv_icm42600_accel_calibbias[5];
+	val64 = (int64_t)val * 1000000LL + (int64_t)val2;
+	if (val64 < min || val64 > max)
+		return -EINVAL;
+
+	/*
+	 * convert m/s² to g then to raw value
+	 * m/s² to g: 1 / 9.806650
+	 * g to raw 12 bits signed, step 0.5mg: 10000 / 5
+	 * val in micro (1000000)
+	 * val * 10000 / (9.806650 * 1000000 * 5)
+	 */
+	val64 = val64 * 10000LL;
+	/* for rounding, add + or - divisor (9806650 * 5) divided by 2 */
+	if (val64 >= 0)
+		val64 += 9806650 * 5 / 2;
+	else
+		val64 -= 9806650 * 5 / 2;
+	offset = div_s64(val64, 9806650 * 5);
+
+	/* clamp value limited to 12 bits signed */
+	if (offset < -2048)
+		offset = -2048;
+	else if (offset > 2047)
+		offset = 2047;
+
+	pm_runtime_get_sync(dev);
+	mutex_lock(&st->lock);
+
+	switch (chan->channel2) {
+	case IIO_MOD_X:
+		/* OFFSET_USER4 register is shared */
+		ret = regmap_read(st->map, INV_ICM42600_REG_OFFSET_USER4,
+				  &regval);
+		if (ret)
+			goto out_unlock;
+		st->buffer[0] = ((offset & 0xF00) >> 4) | (regval & 0x0F);
+		st->buffer[1] = offset & 0xFF;
+		break;
+	case IIO_MOD_Y:
+		/* OFFSET_USER7 register is shared */
+		ret = regmap_read(st->map, INV_ICM42600_REG_OFFSET_USER7,
+				  &regval);
+		if (ret)
+			goto out_unlock;
+		st->buffer[0] = offset & 0xFF;
+		st->buffer[1] = ((offset & 0xF00) >> 8) | (regval & 0xF0);
+		break;
+	case IIO_MOD_Z:
+		/* OFFSET_USER7 register is shared */
+		ret = regmap_read(st->map, INV_ICM42600_REG_OFFSET_USER7,
+				  &regval);
+		if (ret)
+			goto out_unlock;
+		st->buffer[0] = ((offset & 0xF00) >> 4) | (regval & 0x0F);
+		st->buffer[1] = offset & 0xFF;
+		break;
+	default:
+		ret = -EINVAL;
+		goto out_unlock;
+	}
+
+	ret = regmap_bulk_write(st->map, reg, st->buffer, 2);
+
+out_unlock:
+	mutex_unlock(&st->lock);
+	pm_runtime_mark_last_busy(dev);
+	pm_runtime_put_autosuspend(dev);
+	return ret;
+}
+
+static int inv_icm42600_accel_read_raw(struct iio_dev *indio_dev,
+				       struct iio_chan_spec const *chan,
+				       int *val, int *val2, long mask)
+{
+	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	int16_t data;
+	int ret;
+
+	if (chan->type != IIO_ACCEL)
+		return -EINVAL;
+
+	switch (mask) {
+	case IIO_CHAN_INFO_RAW:
+		ret = iio_device_claim_direct_mode(indio_dev);
+		if (ret)
+			return ret;
+		ret = inv_icm42600_accel_read_sensor(st, chan, &data);
+		iio_device_release_direct_mode(indio_dev);
+		if (ret)
+			return ret;
+		*val = data;
+		return IIO_VAL_INT;
+	case IIO_CHAN_INFO_SCALE:
+		return inv_icm42600_accel_read_scale(st, val, val2);
+	case IIO_CHAN_INFO_SAMP_FREQ:
+		return inv_icm42600_accel_read_odr(st, val, val2);
+	case IIO_CHAN_INFO_CALIBBIAS:
+		return inv_icm42600_accel_read_offset(st, chan, val, val2);
+	default:
+		return -EINVAL;
+	}
+}
+
+static int inv_icm42600_accel_read_avail(struct iio_dev *indio_dev,
+					 struct iio_chan_spec const *chan,
+					 const int **vals,
+					 int *type, int *length, long mask)
+{
+	if (chan->type != IIO_ACCEL)
+		return -EINVAL;
+
+	switch (mask) {
+	case IIO_CHAN_INFO_SCALE:
+		*vals = inv_icm42600_accel_scale;
+		*type = IIO_VAL_INT_PLUS_NANO;
+		*length = ARRAY_SIZE(inv_icm42600_accel_scale);
+		return IIO_AVAIL_LIST;
+	case IIO_CHAN_INFO_SAMP_FREQ:
+		*vals = inv_icm42600_accel_odr;
+		*type = IIO_VAL_INT_PLUS_MICRO;
+		*length = ARRAY_SIZE(inv_icm42600_accel_odr);
+		return IIO_AVAIL_LIST;
+	case IIO_CHAN_INFO_CALIBBIAS:
+		*vals = inv_icm42600_accel_calibbias;
+		*type = IIO_VAL_INT_PLUS_MICRO;
+		return IIO_AVAIL_RANGE;
+	default:
+		return -EINVAL;
+	}
+}
+
+static int inv_icm42600_accel_write_raw(struct iio_dev *indio_dev,
+					struct iio_chan_spec const *chan,
+					int val, int val2, long mask)
+{
+	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	int ret;
+
+	if (chan->type != IIO_ACCEL)
+		return -EINVAL;
+
+	switch (mask) {
+	case IIO_CHAN_INFO_SCALE:
+		ret = iio_device_claim_direct_mode(indio_dev);
+		if (ret)
+			return ret;
+		ret = inv_icm42600_accel_write_scale(st, val, val2);
+		iio_device_release_direct_mode(indio_dev);
+		return ret;
+	case IIO_CHAN_INFO_SAMP_FREQ:
+		return inv_icm42600_accel_write_odr(st, val, val2);
+	case IIO_CHAN_INFO_CALIBBIAS:
+		ret = iio_device_claim_direct_mode(indio_dev);
+		if (ret)
+			return ret;
+		ret = inv_icm42600_accel_write_offset(st, chan, val, val2);
+		iio_device_release_direct_mode(indio_dev);
+		return ret;
+	default:
+		return -EINVAL;
+	}
+}
+
+static int inv_icm42600_accel_write_raw_get_fmt(struct iio_dev *indio_dev,
+						struct iio_chan_spec const *chan,
+						long mask)
+{
+	if (chan->type != IIO_ACCEL)
+		return -EINVAL;
+
+	switch (mask) {
+	case IIO_CHAN_INFO_SCALE:
+		return IIO_VAL_INT_PLUS_NANO;
+	case IIO_CHAN_INFO_SAMP_FREQ:
+		return IIO_VAL_INT_PLUS_MICRO;
+	case IIO_CHAN_INFO_CALIBBIAS:
+		return IIO_VAL_INT_PLUS_MICRO;
+	default:
+		return -EINVAL;
+	}
+}
+
+static const struct iio_info inv_icm42600_accel_info = {
+	.read_raw = inv_icm42600_accel_read_raw,
+	.read_avail = inv_icm42600_accel_read_avail,
+	.write_raw = inv_icm42600_accel_write_raw,
+	.write_raw_get_fmt = inv_icm42600_accel_write_raw_get_fmt,
+	.debugfs_reg_access = inv_icm42600_debugfs_reg,
+};
+
+struct iio_dev *inv_icm42600_accel_init(struct inv_icm42600_state *st)
+{
+	struct device *dev = regmap_get_device(st->map);
+	const char *name;
+	struct iio_dev *indio_dev;
+	int ret;
+
+	name = devm_kasprintf(dev, GFP_KERNEL, "%s-accel", st->name);
+	if (!name)
+		return ERR_PTR(-ENOMEM);
+
+	indio_dev = devm_iio_device_alloc(dev, 0);
+	if (!indio_dev)
+		return ERR_PTR(-ENOMEM);
+
+	iio_device_set_drvdata(indio_dev, st);
+	indio_dev->name = name;
+	indio_dev->info = &inv_icm42600_accel_info;
+	indio_dev->modes = INDIO_DIRECT_MODE;
+	indio_dev->channels = inv_icm42600_accel_channels;
+	indio_dev->num_channels = ARRAY_SIZE(inv_icm42600_accel_channels);
+
+	ret = devm_iio_device_register(dev, indio_dev);
+	if (ret)
+		return ERR_PTR(ret);
+
+	return indio_dev;
+}
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
index 84e9ff320b3b..a35ff21f50bb 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
@@ -513,6 +513,10 @@ int inv_icm42600_core_probe(struct regmap *regmap, int chip,
 	if (IS_ERR(st->indio_gyro))
 		return PTR_ERR(st->indio_gyro);
 
+	st->indio_accel = inv_icm42600_accel_init(st);
+	if (IS_ERR(st->indio_accel))
+		return PTR_ERR(st->indio_accel);
+
 	/* setup runtime power management */
 	ret = pm_runtime_set_active(dev);
 	if (ret)

commit 9e7f3f7253289daaf4db0b3ebae139e95f5a90a2
Author: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
Date:   Mon Jun 22 17:37:20 2020 +0200

    UPSTREAM: iio: imu: inv_icm42600: add gyroscope IIO device
    
    Add IIO device for gyroscope sensor with data polling interface.
    Attributes: raw, scale, sampling_frequency, calibbias.
    
    Gyroscope in low noise mode.
    
    Signed-off-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    (cherry picked from commit a095fadb443b20feab5b6e3d8eafe7cfc1efe81e)
    Signed-off-by: Shunqian Zheng <zhengsq@rock-chips.com>
    Change-Id: I3e13086ca0a2c9ea657bdbaddcca6848ee1decfd

diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600.h b/drivers/iio/imu/inv_icm42600/inv_icm42600.h
index 14c8ef152418..d155470d770a 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600.h
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600.h
@@ -120,6 +120,8 @@ struct inv_icm42600_suspended {
  *  @orientation:	sensor chip orientation relative to main hardware.
  *  @conf:		chip sensors configurations.
  *  @suspended:		suspended sensors configuration.
+ *  @indio_gyro:	gyroscope IIO device.
+ *  @buffer:		data transfer buffer aligned for DMA.
  */
 struct inv_icm42600_state {
 	struct mutex lock;
@@ -131,6 +133,8 @@ struct inv_icm42600_state {
 	struct iio_mount_matrix orientation;
 	struct inv_icm42600_conf conf;
 	struct inv_icm42600_suspended suspended;
+	struct iio_dev *indio_gyro;
+	uint8_t buffer[2] ____cacheline_aligned;
 };
 
 /* Virtual register addresses: @bank on MSB (4 upper bits), @address on LSB */
@@ -369,4 +373,6 @@ int inv_icm42600_debugfs_reg(struct iio_dev *indio_dev, unsigned int reg,
 int inv_icm42600_core_probe(struct regmap *regmap, int chip,
 			    inv_icm42600_bus_setup bus_setup);
 
+struct iio_dev *inv_icm42600_gyro_init(struct inv_icm42600_state *st);
+
 #endif
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
index 2eb25c5f77f8..84e9ff320b3b 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
@@ -509,6 +509,10 @@ int inv_icm42600_core_probe(struct regmap *regmap, int chip,
 	if (ret)
 		return ret;
 
+	st->indio_gyro = inv_icm42600_gyro_init(st);
+	if (IS_ERR(st->indio_gyro))
+		return PTR_ERR(st->indio_gyro);
+
 	/* setup runtime power management */
 	ret = pm_runtime_set_active(dev);
 	if (ret)
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c
new file mode 100644
index 000000000000..3875ecbee67e
--- /dev/null
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c
@@ -0,0 +1,603 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2020 Invensense, Inc.
+ */
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/mutex.h>
+#include <linux/pm_runtime.h>
+#include <linux/regmap.h>
+#include <linux/delay.h>
+#include <linux/math64.h>
+#include <linux/iio/iio.h>
+
+#include "inv_icm42600.h"
+
+#define INV_ICM42600_GYRO_CHAN(_modifier, _index, _ext_info)		\
+	{								\
+		.type = IIO_ANGL_VEL,					\
+		.modified = 1,						\
+		.channel2 = _modifier,					\
+		.info_mask_separate =					\
+			BIT(IIO_CHAN_INFO_RAW) |			\
+			BIT(IIO_CHAN_INFO_CALIBBIAS),			\
+		.info_mask_shared_by_type =				\
+			BIT(IIO_CHAN_INFO_SCALE),			\
+		.info_mask_shared_by_type_available =			\
+			BIT(IIO_CHAN_INFO_SCALE) |			\
+			BIT(IIO_CHAN_INFO_CALIBBIAS),			\
+		.info_mask_shared_by_all =				\
+			BIT(IIO_CHAN_INFO_SAMP_FREQ),			\
+		.info_mask_shared_by_all_available =			\
+			BIT(IIO_CHAN_INFO_SAMP_FREQ),			\
+		.scan_index = _index,					\
+		.scan_type = {						\
+			.sign = 's',					\
+			.realbits = 16,					\
+			.storagebits = 16,				\
+			.endianness = IIO_BE,				\
+		},							\
+		.ext_info = _ext_info,					\
+	}
+
+enum inv_icm42600_gyro_scan {
+	INV_ICM42600_GYRO_SCAN_X,
+	INV_ICM42600_GYRO_SCAN_Y,
+	INV_ICM42600_GYRO_SCAN_Z,
+};
+
+static const struct iio_chan_spec_ext_info inv_icm42600_gyro_ext_infos[] = {
+	IIO_MOUNT_MATRIX(IIO_SHARED_BY_ALL, inv_icm42600_get_mount_matrix),
+	{},
+};
+
+static const struct iio_chan_spec inv_icm42600_gyro_channels[] = {
+	INV_ICM42600_GYRO_CHAN(IIO_MOD_X, INV_ICM42600_GYRO_SCAN_X,
+			       inv_icm42600_gyro_ext_infos),
+	INV_ICM42600_GYRO_CHAN(IIO_MOD_Y, INV_ICM42600_GYRO_SCAN_Y,
+			       inv_icm42600_gyro_ext_infos),
+	INV_ICM42600_GYRO_CHAN(IIO_MOD_Z, INV_ICM42600_GYRO_SCAN_Z,
+			       inv_icm42600_gyro_ext_infos),
+};
+
+static int inv_icm42600_gyro_read_sensor(struct inv_icm42600_state *st,
+					 struct iio_chan_spec const *chan,
+					 int16_t *val)
+{
+	struct device *dev = regmap_get_device(st->map);
+	struct inv_icm42600_sensor_conf conf = INV_ICM42600_SENSOR_CONF_INIT;
+	unsigned int reg;
+	__be16 *data;
+	int ret;
+
+	if (chan->type != IIO_ANGL_VEL)
+		return -EINVAL;
+
+	switch (chan->channel2) {
+	case IIO_MOD_X:
+		reg = INV_ICM42600_REG_GYRO_DATA_X;
+		break;
+	case IIO_MOD_Y:
+		reg = INV_ICM42600_REG_GYRO_DATA_Y;
+		break;
+	case IIO_MOD_Z:
+		reg = INV_ICM42600_REG_GYRO_DATA_Z;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	pm_runtime_get_sync(dev);
+	mutex_lock(&st->lock);
+
+	/* enable gyro sensor */
+	conf.mode = INV_ICM42600_SENSOR_MODE_LOW_NOISE;
+	ret = inv_icm42600_set_gyro_conf(st, &conf, NULL);
+	if (ret)
+		goto exit;
+
+	/* read gyro register data */
+	data = (__be16 *)&st->buffer[0];
+	ret = regmap_bulk_read(st->map, reg, data, sizeof(*data));
+	if (ret)
+		goto exit;
+
+	*val = (int16_t)be16_to_cpup(data);
+	if (*val == INV_ICM42600_DATA_INVALID)
+		ret = -EINVAL;
+exit:
+	mutex_unlock(&st->lock);
+	pm_runtime_mark_last_busy(dev);
+	pm_runtime_put_autosuspend(dev);
+	return ret;
+}
+
+/* IIO format int + nano */
+static const int inv_icm42600_gyro_scale[] = {
+	/* +/- 2000dps => 0.001065264 rad/s */
+	[2 * INV_ICM42600_GYRO_FS_2000DPS] = 0,
+	[2 * INV_ICM42600_GYRO_FS_2000DPS + 1] = 1065264,
+	/* +/- 1000dps => 0.000532632 rad/s */
+	[2 * INV_ICM42600_GYRO_FS_1000DPS] = 0,
+	[2 * INV_ICM42600_GYRO_FS_1000DPS + 1] = 532632,
+	/* +/- 500dps => 0.000266316 rad/s */
+	[2 * INV_ICM42600_GYRO_FS_500DPS] = 0,
+	[2 * INV_ICM42600_GYRO_FS_500DPS + 1] = 266316,
+	/* +/- 250dps => 0.000133158 rad/s */
+	[2 * INV_ICM42600_GYRO_FS_250DPS] = 0,
+	[2 * INV_ICM42600_GYRO_FS_250DPS + 1] = 133158,
+	/* +/- 125dps => 0.000066579 rad/s */
+	[2 * INV_ICM42600_GYRO_FS_125DPS] = 0,
+	[2 * INV_ICM42600_GYRO_FS_125DPS + 1] = 66579,
+	/* +/- 62.5dps => 0.000033290 rad/s */
+	[2 * INV_ICM42600_GYRO_FS_62_5DPS] = 0,
+	[2 * INV_ICM42600_GYRO_FS_62_5DPS + 1] = 33290,
+	/* +/- 31.25dps => 0.000016645 rad/s */
+	[2 * INV_ICM42600_GYRO_FS_31_25DPS] = 0,
+	[2 * INV_ICM42600_GYRO_FS_31_25DPS + 1] = 16645,
+	/* +/- 15.625dps => 0.000008322 rad/s */
+	[2 * INV_ICM42600_GYRO_FS_15_625DPS] = 0,
+	[2 * INV_ICM42600_GYRO_FS_15_625DPS + 1] = 8322,
+};
+
+static int inv_icm42600_gyro_read_scale(struct inv_icm42600_state *st,
+					int *val, int *val2)
+{
+	unsigned int idx;
+
+	idx = st->conf.gyro.fs;
+
+	*val = inv_icm42600_gyro_scale[2 * idx];
+	*val2 = inv_icm42600_gyro_scale[2 * idx + 1];
+	return IIO_VAL_INT_PLUS_NANO;
+}
+
+static int inv_icm42600_gyro_write_scale(struct inv_icm42600_state *st,
+					 int val, int val2)
+{
+	struct device *dev = regmap_get_device(st->map);
+	unsigned int idx;
+	struct inv_icm42600_sensor_conf conf = INV_ICM42600_SENSOR_CONF_INIT;
+	int ret;
+
+	for (idx = 0; idx < ARRAY_SIZE(inv_icm42600_gyro_scale); idx += 2) {
+		if (val == inv_icm42600_gyro_scale[idx] &&
+		    val2 == inv_icm42600_gyro_scale[idx + 1])
+			break;
+	}
+	if (idx >= ARRAY_SIZE(inv_icm42600_gyro_scale))
+		return -EINVAL;
+
+	conf.fs = idx / 2;
+
+	pm_runtime_get_sync(dev);
+	mutex_lock(&st->lock);
+
+	ret = inv_icm42600_set_gyro_conf(st, &conf, NULL);
+
+	mutex_unlock(&st->lock);
+	pm_runtime_mark_last_busy(dev);
+	pm_runtime_put_autosuspend(dev);
+
+	return ret;
+}
+
+/* IIO format int + micro */
+static const int inv_icm42600_gyro_odr[] = {
+	/* 12.5Hz */
+	12, 500000,
+	/* 25Hz */
+	25, 0,
+	/* 50Hz */
+	50, 0,
+	/* 100Hz */
+	100, 0,
+	/* 200Hz */
+	200, 0,
+	/* 1kHz */
+	1000, 0,
+	/* 2kHz */
+	2000, 0,
+	/* 4kHz */
+	4000, 0,
+};
+
+static const int inv_icm42600_gyro_odr_conv[] = {
+	INV_ICM42600_ODR_12_5HZ,
+	INV_ICM42600_ODR_25HZ,
+	INV_ICM42600_ODR_50HZ,
+	INV_ICM42600_ODR_100HZ,
+	INV_ICM42600_ODR_200HZ,
+	INV_ICM42600_ODR_1KHZ_LN,
+	INV_ICM42600_ODR_2KHZ_LN,
+	INV_ICM42600_ODR_4KHZ_LN,
+};
+
+static int inv_icm42600_gyro_read_odr(struct inv_icm42600_state *st,
+				      int *val, int *val2)
+{
+	unsigned int odr;
+	unsigned int i;
+
+	odr = st->conf.gyro.odr;
+
+	for (i = 0; i < ARRAY_SIZE(inv_icm42600_gyro_odr_conv); ++i) {
+		if (inv_icm42600_gyro_odr_conv[i] == odr)
+			break;
+	}
+	if (i >= ARRAY_SIZE(inv_icm42600_gyro_odr_conv))
+		return -EINVAL;
+
+	*val = inv_icm42600_gyro_odr[2 * i];
+	*val2 = inv_icm42600_gyro_odr[2 * i + 1];
+
+	return IIO_VAL_INT_PLUS_MICRO;
+}
+
+static int inv_icm42600_gyro_write_odr(struct inv_icm42600_state *st,
+				       int val, int val2)
+{
+	struct device *dev = regmap_get_device(st->map);
+	unsigned int idx;
+	struct inv_icm42600_sensor_conf conf = INV_ICM42600_SENSOR_CONF_INIT;
+	int ret;
+
+	for (idx = 0; idx < ARRAY_SIZE(inv_icm42600_gyro_odr); idx += 2) {
+		if (val == inv_icm42600_gyro_odr[idx] &&
+		    val2 == inv_icm42600_gyro_odr[idx + 1])
+			break;
+	}
+	if (idx >= ARRAY_SIZE(inv_icm42600_gyro_odr))
+		return -EINVAL;
+
+	conf.odr = inv_icm42600_gyro_odr_conv[idx / 2];
+
+	pm_runtime_get_sync(dev);
+	mutex_lock(&st->lock);
+
+	ret = inv_icm42600_set_gyro_conf(st, &conf, NULL);
+
+	mutex_unlock(&st->lock);
+	pm_runtime_mark_last_busy(dev);
+	pm_runtime_put_autosuspend(dev);
+
+	return ret;
+}
+
+/*
+ * Calibration bias values, IIO range format int + nano.
+ * Value is limited to +/-64dps coded on 12 bits signed. Step is 1/32 dps.
+ */
+static int inv_icm42600_gyro_calibbias[] = {
+	-1, 117010721,		/* min: -1.117010721 rad/s */
+	0, 545415,		/* step: 0.000545415 rad/s */
+	1, 116465306,		/* max: 1.116465306 rad/s */
+};
+
+static int inv_icm42600_gyro_read_offset(struct inv_icm42600_state *st,
+					 struct iio_chan_spec const *chan,
+					 int *val, int *val2)
+{
+	struct device *dev = regmap_get_device(st->map);
+	int64_t val64;
+	int32_t bias;
+	unsigned int reg;
+	int16_t offset;
+	uint8_t data[2];
+	int ret;
+
+	if (chan->type != IIO_ANGL_VEL)
+		return -EINVAL;
+
+	switch (chan->channel2) {
+	case IIO_MOD_X:
+		reg = INV_ICM42600_REG_OFFSET_USER0;
+		break;
+	case IIO_MOD_Y:
+		reg = INV_ICM42600_REG_OFFSET_USER1;
+		break;
+	case IIO_MOD_Z:
+		reg = INV_ICM42600_REG_OFFSET_USER3;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	pm_runtime_get_sync(dev);
+	mutex_lock(&st->lock);
+
+	ret = regmap_bulk_read(st->map, reg, st->buffer, sizeof(data));
+	memcpy(data, st->buffer, sizeof(data));
+
+	mutex_unlock(&st->lock);
+	pm_runtime_mark_last_busy(dev);
+	pm_runtime_put_autosuspend(dev);
+	if (ret)
+		return ret;
+
+	/* 12 bits signed value */
+	switch (chan->channel2) {
+	case IIO_MOD_X:
+		offset = sign_extend32(((data[1] & 0x0F) << 8) | data[0], 11);
+		break;
+	case IIO_MOD_Y:
+		offset = sign_extend32(((data[0] & 0xF0) << 4) | data[1], 11);
+		break;
+	case IIO_MOD_Z:
+		offset = sign_extend32(((data[1] & 0x0F) << 8) | data[0], 11);
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	/*
+	 * convert raw offset to dps then to rad/s
+	 * 12 bits signed raw max 64 to dps: 64 / 2048
+	 * dps to rad: Pi / 180
+	 * result in nano (1000000000)
+	 * (offset * 64 * Pi * 1000000000) / (2048 * 180)
+	 */
+	val64 = (int64_t)offset * 64LL * 3141592653LL;
+	/* for rounding, add + or - divisor (2048 * 180) divided by 2 */
+	if (val64 >= 0)
+		val64 += 2048 * 180 / 2;
+	else
+		val64 -= 2048 * 180 / 2;
+	bias = div_s64(val64, 2048 * 180);
+	*val = bias / 1000000000L;
+	*val2 = bias % 1000000000L;
+
+	return IIO_VAL_INT_PLUS_NANO;
+}
+
+static int inv_icm42600_gyro_write_offset(struct inv_icm42600_state *st,
+					  struct iio_chan_spec const *chan,
+					  int val, int val2)
+{
+	struct device *dev = regmap_get_device(st->map);
+	int64_t val64, min, max;
+	unsigned int reg, regval;
+	int16_t offset;
+	int ret;
+
+	if (chan->type != IIO_ANGL_VEL)
+		return -EINVAL;
+
+	switch (chan->channel2) {
+	case IIO_MOD_X:
+		reg = INV_ICM42600_REG_OFFSET_USER0;
+		break;
+	case IIO_MOD_Y:
+		reg = INV_ICM42600_REG_OFFSET_USER1;
+		break;
+	case IIO_MOD_Z:
+		reg = INV_ICM42600_REG_OFFSET_USER3;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	/* inv_icm42600_gyro_calibbias: min - step - max in nano */
+	min = (int64_t)inv_icm42600_gyro_calibbias[0] * 1000000000LL +
+	      (int64_t)inv_icm42600_gyro_calibbias[1];
+	max = (int64_t)inv_icm42600_gyro_calibbias[4] * 1000000000LL +
+	      (int64_t)inv_icm42600_gyro_calibbias[5];
+	val64 = (int64_t)val * 1000000000LL + (int64_t)val2;
+	if (val64 < min || val64 > max)
+		return -EINVAL;
+
+	/*
+	 * convert rad/s to dps then to raw value
+	 * rad to dps: 180 / Pi
+	 * dps to raw 12 bits signed, max 64: 2048 / 64
+	 * val in nano (1000000000)
+	 * val * 180 * 2048 / (Pi * 1000000000 * 64)
+	 */
+	val64 = val64 * 180LL * 2048LL;
+	/* for rounding, add + or - divisor (3141592653 * 64) divided by 2 */
+	if (val64 >= 0)
+		val64 += 3141592653LL * 64LL / 2LL;
+	else
+		val64 -= 3141592653LL * 64LL / 2LL;
+	offset = div64_s64(val64, 3141592653LL * 64LL);
+
+	/* clamp value limited to 12 bits signed */
+	if (offset < -2048)
+		offset = -2048;
+	else if (offset > 2047)
+		offset = 2047;
+
+	pm_runtime_get_sync(dev);
+	mutex_lock(&st->lock);
+
+	switch (chan->channel2) {
+	case IIO_MOD_X:
+		/* OFFSET_USER1 register is shared */
+		ret = regmap_read(st->map, INV_ICM42600_REG_OFFSET_USER1,
+				  &regval);
+		if (ret)
+			goto out_unlock;
+		st->buffer[0] = offset & 0xFF;
+		st->buffer[1] = (regval & 0xF0) | ((offset & 0xF00) >> 8);
+		break;
+	case IIO_MOD_Y:
+		/* OFFSET_USER1 register is shared */
+		ret = regmap_read(st->map, INV_ICM42600_REG_OFFSET_USER1,
+				  &regval);
+		if (ret)
+			goto out_unlock;
+		st->buffer[0] = ((offset & 0xF00) >> 4) | (regval & 0x0F);
+		st->buffer[1] = offset & 0xFF;
+		break;
+	case IIO_MOD_Z:
+		/* OFFSET_USER4 register is shared */
+		ret = regmap_read(st->map, INV_ICM42600_REG_OFFSET_USER4,
+				  &regval);
+		if (ret)
+			goto out_unlock;
+		st->buffer[0] = offset & 0xFF;
+		st->buffer[1] = (regval & 0xF0) | ((offset & 0xF00) >> 8);
+		break;
+	default:
+		ret = -EINVAL;
+		goto out_unlock;
+	}
+
+	ret = regmap_bulk_write(st->map, reg, st->buffer, 2);
+
+out_unlock:
+	mutex_unlock(&st->lock);
+	pm_runtime_mark_last_busy(dev);
+	pm_runtime_put_autosuspend(dev);
+	return ret;
+}
+
+static int inv_icm42600_gyro_read_raw(struct iio_dev *indio_dev,
+				      struct iio_chan_spec const *chan,
+				      int *val, int *val2, long mask)
+{
+	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	int16_t data;
+	int ret;
+
+	if (chan->type != IIO_ANGL_VEL)
+		return -EINVAL;
+
+	switch (mask) {
+	case IIO_CHAN_INFO_RAW:
+		ret = iio_device_claim_direct_mode(indio_dev);
+		if (ret)
+			return ret;
+		ret = inv_icm42600_gyro_read_sensor(st, chan, &data);
+		iio_device_release_direct_mode(indio_dev);
+		if (ret)
+			return ret;
+		*val = data;
+		return IIO_VAL_INT;
+	case IIO_CHAN_INFO_SCALE:
+		return inv_icm42600_gyro_read_scale(st, val, val2);
+	case IIO_CHAN_INFO_SAMP_FREQ:
+		return inv_icm42600_gyro_read_odr(st, val, val2);
+	case IIO_CHAN_INFO_CALIBBIAS:
+		return inv_icm42600_gyro_read_offset(st, chan, val, val2);
+	default:
+		return -EINVAL;
+	}
+}
+
+static int inv_icm42600_gyro_read_avail(struct iio_dev *indio_dev,
+					struct iio_chan_spec const *chan,
+					const int **vals,
+					int *type, int *length, long mask)
+{
+	if (chan->type != IIO_ANGL_VEL)
+		return -EINVAL;
+
+	switch (mask) {
+	case IIO_CHAN_INFO_SCALE:
+		*vals = inv_icm42600_gyro_scale;
+		*type = IIO_VAL_INT_PLUS_NANO;
+		*length = ARRAY_SIZE(inv_icm42600_gyro_scale);
+		return IIO_AVAIL_LIST;
+	case IIO_CHAN_INFO_SAMP_FREQ:
+		*vals = inv_icm42600_gyro_odr;
+		*type = IIO_VAL_INT_PLUS_MICRO;
+		*length = ARRAY_SIZE(inv_icm42600_gyro_odr);
+		return IIO_AVAIL_LIST;
+	case IIO_CHAN_INFO_CALIBBIAS:
+		*vals = inv_icm42600_gyro_calibbias;
+		*type = IIO_VAL_INT_PLUS_NANO;
+		return IIO_AVAIL_RANGE;
+	default:
+		return -EINVAL;
+	}
+}
+
+static int inv_icm42600_gyro_write_raw(struct iio_dev *indio_dev,
+				       struct iio_chan_spec const *chan,
+				       int val, int val2, long mask)
+{
+	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	int ret;
+
+	if (chan->type != IIO_ANGL_VEL)
+		return -EINVAL;
+
+	switch (mask) {
+	case IIO_CHAN_INFO_SCALE:
+		ret = iio_device_claim_direct_mode(indio_dev);
+		if (ret)
+			return ret;
+		ret = inv_icm42600_gyro_write_scale(st, val, val2);
+		iio_device_release_direct_mode(indio_dev);
+		return ret;
+	case IIO_CHAN_INFO_SAMP_FREQ:
+		return inv_icm42600_gyro_write_odr(st, val, val2);
+	case IIO_CHAN_INFO_CALIBBIAS:
+		ret = iio_device_claim_direct_mode(indio_dev);
+		if (ret)
+			return ret;
+		ret = inv_icm42600_gyro_write_offset(st, chan, val, val2);
+		iio_device_release_direct_mode(indio_dev);
+		return ret;
+	default:
+		return -EINVAL;
+	}
+}
+
+static int inv_icm42600_gyro_write_raw_get_fmt(struct iio_dev *indio_dev,
+					       struct iio_chan_spec const *chan,
+					       long mask)
+{
+	if (chan->type != IIO_ANGL_VEL)
+		return -EINVAL;
+
+	switch (mask) {
+	case IIO_CHAN_INFO_SCALE:
+		return IIO_VAL_INT_PLUS_NANO;
+	case IIO_CHAN_INFO_SAMP_FREQ:
+		return IIO_VAL_INT_PLUS_MICRO;
+	case IIO_CHAN_INFO_CALIBBIAS:
+		return IIO_VAL_INT_PLUS_NANO;
+	default:
+		return -EINVAL;
+	}
+}
+
+static const struct iio_info inv_icm42600_gyro_info = {
+	.read_raw = inv_icm42600_gyro_read_raw,
+	.read_avail = inv_icm42600_gyro_read_avail,
+	.write_raw = inv_icm42600_gyro_write_raw,
+	.write_raw_get_fmt = inv_icm42600_gyro_write_raw_get_fmt,
+	.debugfs_reg_access = inv_icm42600_debugfs_reg,
+};
+
+struct iio_dev *inv_icm42600_gyro_init(struct inv_icm42600_state *st)
+{
+	struct device *dev = regmap_get_device(st->map);
+	const char *name;
+	struct iio_dev *indio_dev;
+	int ret;
+
+	name = devm_kasprintf(dev, GFP_KERNEL, "%s-gyro", st->name);
+	if (!name)
+		return ERR_PTR(-ENOMEM);
+
+	indio_dev = devm_iio_device_alloc(dev, 0);
+	if (!indio_dev)
+		return ERR_PTR(-ENOMEM);
+
+	iio_device_set_drvdata(indio_dev, st);
+	indio_dev->name = name;
+	indio_dev->info = &inv_icm42600_gyro_info;
+	indio_dev->modes = INDIO_DIRECT_MODE;
+	indio_dev->channels = inv_icm42600_gyro_channels;
+	indio_dev->num_channels = ARRAY_SIZE(inv_icm42600_gyro_channels);
+
+	ret = devm_iio_device_register(dev, indio_dev);
+	if (ret)
+		return ERR_PTR(ret);
+
+	return indio_dev;
+}

commit b4c7ee2deecce1ba7d8f58e8a038b094618578b5
Author: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
Date:   Mon Jun 22 17:37:19 2020 +0200

    UPSTREAM: iio: imu: inv_icm42600: add SPI driver for inv_icm42600 driver
    
    Add SPI driver for InvenSense ICM-426xxx devices.
    
    Configure bus signal slew rates as indicated in the datasheet.
    
    Signed-off-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    (cherry picked from commit 9f9ff91b775b568128aad3a5c06211a8785bd17c)
    Signed-off-by: Shunqian Zheng <zhengsq@rock-chips.com>
    Change-Id: Id948c314093f28a3bc90d22f0a174dc8d115ca9d

diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c
new file mode 100644
index 000000000000..a9c5e2fdbe2a
--- /dev/null
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c
@@ -0,0 +1,99 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2020 InvenSense, Inc.
+ */
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/mod_devicetable.h>
+#include <linux/spi/spi.h>
+#include <linux/regmap.h>
+#include <linux/property.h>
+
+#include "inv_icm42600.h"
+
+static int inv_icm42600_spi_bus_setup(struct inv_icm42600_state *st)
+{
+	unsigned int mask, val;
+	int ret;
+
+	/* setup interface registers */
+	val = INV_ICM42600_INTF_CONFIG6_I3C_EN |
+	      INV_ICM42600_INTF_CONFIG6_I3C_SDR_EN |
+	      INV_ICM42600_INTF_CONFIG6_I3C_DDR_EN;
+	ret = regmap_update_bits(st->map, INV_ICM42600_REG_INTF_CONFIG6,
+				 INV_ICM42600_INTF_CONFIG6_MASK, val);
+	if (ret)
+		return ret;
+
+	ret = regmap_update_bits(st->map, INV_ICM42600_REG_INTF_CONFIG4,
+				 INV_ICM42600_INTF_CONFIG4_I3C_BUS_ONLY, 0);
+	if (ret)
+		return ret;
+
+	/* set slew rates for I2C and SPI */
+	mask = INV_ICM42600_DRIVE_CONFIG_I2C_MASK |
+	       INV_ICM42600_DRIVE_CONFIG_SPI_MASK;
+	val = INV_ICM42600_DRIVE_CONFIG_I2C(INV_ICM42600_SLEW_RATE_20_60NS) |
+	      INV_ICM42600_DRIVE_CONFIG_SPI(INV_ICM42600_SLEW_RATE_INF_2NS);
+	ret = regmap_update_bits(st->map, INV_ICM42600_REG_DRIVE_CONFIG,
+				 mask, val);
+	if (ret)
+		return ret;
+
+	/* disable i2c bus */
+	return regmap_update_bits(st->map, INV_ICM42600_REG_INTF_CONFIG0,
+				  INV_ICM42600_INTF_CONFIG0_UI_SIFS_CFG_MASK,
+				  INV_ICM42600_INTF_CONFIG0_UI_SIFS_CFG_I2C_DIS);
+}
+
+static int inv_icm42600_probe(struct spi_device *spi)
+{
+	const void *match;
+	enum inv_icm42600_chip chip;
+	struct regmap *regmap;
+
+	match = device_get_match_data(&spi->dev);
+	if (!match)
+		return -EINVAL;
+	chip = (enum inv_icm42600_chip)match;
+
+	regmap = devm_regmap_init_spi(spi, &inv_icm42600_regmap_config);
+	if (IS_ERR(regmap))
+		return PTR_ERR(regmap);
+
+	return inv_icm42600_core_probe(regmap, chip, inv_icm42600_spi_bus_setup);
+}
+
+static const struct of_device_id inv_icm42600_of_matches[] = {
+	{
+		.compatible = "invensense,icm42600",
+		.data = (void *)INV_CHIP_ICM42600,
+	}, {
+		.compatible = "invensense,icm42602",
+		.data = (void *)INV_CHIP_ICM42602,
+	}, {
+		.compatible = "invensense,icm42605",
+		.data = (void *)INV_CHIP_ICM42605,
+	}, {
+		.compatible = "invensense,icm42622",
+		.data = (void *)INV_CHIP_ICM42622,
+	},
+	{}
+};
+MODULE_DEVICE_TABLE(of, inv_icm42600_of_matches);
+
+static struct spi_driver inv_icm42600_driver = {
+	.driver = {
+		.name = "inv-icm42600-spi",
+		.of_match_table = inv_icm42600_of_matches,
+		.pm = &inv_icm42600_pm_ops,
+	},
+	.probe = inv_icm42600_probe,
+};
+module_spi_driver(inv_icm42600_driver);
+
+MODULE_AUTHOR("InvenSense, Inc.");
+MODULE_DESCRIPTION("InvenSense ICM-426xx SPI driver");
+MODULE_LICENSE("GPL");

commit 1ca48f4883bf6748f12f74d9474c02f277337532
Author: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
Date:   Mon Jun 22 17:37:18 2020 +0200

    UPSTREAM: iio: imu: inv_icm42600: add I2C driver for inv_icm42600 driver
    
    Add I2C driver for InvenSense ICM-426xxx devices.
    
    Configure bus signal slew rates as indicated in the datasheet.
    
    Signed-off-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    (cherry picked from commit 7297ef1e261672b8c25ea5d4bb7e91806bb5fb18)
    Signed-off-by: Shunqian Zheng <zhengsq@rock-chips.com>
    Change-Id: I0e05a41113ad450b9bb6fe252e380dca381a2580

diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c
new file mode 100644
index 000000000000..4789cead23b3
--- /dev/null
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c
@@ -0,0 +1,100 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2020 InvenSense, Inc.
+ */
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/mod_devicetable.h>
+#include <linux/i2c.h>
+#include <linux/regmap.h>
+#include <linux/property.h>
+
+#include "inv_icm42600.h"
+
+static int inv_icm42600_i2c_bus_setup(struct inv_icm42600_state *st)
+{
+	unsigned int mask, val;
+	int ret;
+
+	/* setup interface registers */
+	ret = regmap_update_bits(st->map, INV_ICM42600_REG_INTF_CONFIG6,
+				 INV_ICM42600_INTF_CONFIG6_MASK,
+				 INV_ICM42600_INTF_CONFIG6_I3C_EN);
+	if (ret)
+		return ret;
+
+	ret = regmap_update_bits(st->map, INV_ICM42600_REG_INTF_CONFIG4,
+				 INV_ICM42600_INTF_CONFIG4_I3C_BUS_ONLY, 0);
+	if (ret)
+		return ret;
+
+	/* set slew rates for I2C and SPI */
+	mask = INV_ICM42600_DRIVE_CONFIG_I2C_MASK |
+	       INV_ICM42600_DRIVE_CONFIG_SPI_MASK;
+	val = INV_ICM42600_DRIVE_CONFIG_I2C(INV_ICM42600_SLEW_RATE_12_36NS) |
+	      INV_ICM42600_DRIVE_CONFIG_SPI(INV_ICM42600_SLEW_RATE_12_36NS);
+	ret = regmap_update_bits(st->map, INV_ICM42600_REG_DRIVE_CONFIG,
+				 mask, val);
+	if (ret)
+		return ret;
+
+	/* disable SPI bus */
+	return regmap_update_bits(st->map, INV_ICM42600_REG_INTF_CONFIG0,
+				  INV_ICM42600_INTF_CONFIG0_UI_SIFS_CFG_MASK,
+				  INV_ICM42600_INTF_CONFIG0_UI_SIFS_CFG_SPI_DIS);
+}
+
+static int inv_icm42600_probe(struct i2c_client *client)
+{
+	const void *match;
+	enum inv_icm42600_chip chip;
+	struct regmap *regmap;
+
+	if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK))
+		return -ENOTSUPP;
+
+	match = device_get_match_data(&client->dev);
+	if (!match)
+		return -EINVAL;
+	chip = (enum inv_icm42600_chip)match;
+
+	regmap = devm_regmap_init_i2c(client, &inv_icm42600_regmap_config);
+	if (IS_ERR(regmap))
+		return PTR_ERR(regmap);
+
+	return inv_icm42600_core_probe(regmap, chip, inv_icm42600_i2c_bus_setup);
+}
+
+static const struct of_device_id inv_icm42600_of_matches[] = {
+	{
+		.compatible = "invensense,icm42600",
+		.data = (void *)INV_CHIP_ICM42600,
+	}, {
+		.compatible = "invensense,icm42602",
+		.data = (void *)INV_CHIP_ICM42602,
+	}, {
+		.compatible = "invensense,icm42605",
+		.data = (void *)INV_CHIP_ICM42605,
+	}, {
+		.compatible = "invensense,icm42622",
+		.data = (void *)INV_CHIP_ICM42622,
+	},
+	{}
+};
+MODULE_DEVICE_TABLE(of, inv_icm42600_of_matches);
+
+static struct i2c_driver inv_icm42600_driver = {
+	.driver = {
+		.name = "inv-icm42600-i2c",
+		.of_match_table = inv_icm42600_of_matches,
+		.pm = &inv_icm42600_pm_ops,
+	},
+	.probe_new = inv_icm42600_probe,
+};
+module_i2c_driver(inv_icm42600_driver);
+
+MODULE_AUTHOR("InvenSense, Inc.");
+MODULE_DESCRIPTION("InvenSense ICM-426xx I2C driver");
+MODULE_LICENSE("GPL");

commit a01c19d97b3ebcf8f594ec8e6cb8dce72d6db74d
Author: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
Date:   Mon Jun 22 17:37:17 2020 +0200

    UPSTREAM: iio: imu: inv_icm42600: add core of new inv_icm42600 driver
    
    Core component of a new driver for InvenSense ICM-426xx devices.
    It includes registers definition, main probe/setup, and device
    utility functions.
    
    ICM-426xx devices are latest generation of 6-axis IMU,
    gyroscope+accelerometer and temperature sensor. This device
    includes a 2K FIFO, supports I2C/I3C/SPI, and provides
    intelligent motion features like pedometer, tilt detection,
    and tap detection.
    
    Signed-off-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    (cherry picked from commit 31c24c1e93c341069def3c55cc1cf0dca9239d75)
    Signed-off-by: Shunqian Zheng <zhengsq@rock-chips.com>
    Change-Id: Iefe5c28aadd1ca4c75496f6090c3858090cd1c30

diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600.h b/drivers/iio/imu/inv_icm42600/inv_icm42600.h
new file mode 100644
index 000000000000..14c8ef152418
--- /dev/null
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600.h
@@ -0,0 +1,372 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2020 Invensense, Inc.
+ */
+
+#ifndef INV_ICM42600_H_
+#define INV_ICM42600_H_
+
+#include <linux/bits.h>
+#include <linux/bitfield.h>
+#include <linux/regmap.h>
+#include <linux/mutex.h>
+#include <linux/regulator/consumer.h>
+#include <linux/pm.h>
+#include <linux/iio/iio.h>
+
+enum inv_icm42600_chip {
+	INV_CHIP_ICM42600,
+	INV_CHIP_ICM42602,
+	INV_CHIP_ICM42605,
+	INV_CHIP_ICM42622,
+	INV_CHIP_NB,
+};
+
+/* serial bus slew rates */
+enum inv_icm42600_slew_rate {
+	INV_ICM42600_SLEW_RATE_20_60NS,
+	INV_ICM42600_SLEW_RATE_12_36NS,
+	INV_ICM42600_SLEW_RATE_6_18NS,
+	INV_ICM42600_SLEW_RATE_4_12NS,
+	INV_ICM42600_SLEW_RATE_2_6NS,
+	INV_ICM42600_SLEW_RATE_INF_2NS,
+};
+
+enum inv_icm42600_sensor_mode {
+	INV_ICM42600_SENSOR_MODE_OFF,
+	INV_ICM42600_SENSOR_MODE_STANDBY,
+	INV_ICM42600_SENSOR_MODE_LOW_POWER,
+	INV_ICM42600_SENSOR_MODE_LOW_NOISE,
+	INV_ICM42600_SENSOR_MODE_NB,
+};
+
+/* gyroscope fullscale values */
+enum inv_icm42600_gyro_fs {
+	INV_ICM42600_GYRO_FS_2000DPS,
+	INV_ICM42600_GYRO_FS_1000DPS,
+	INV_ICM42600_GYRO_FS_500DPS,
+	INV_ICM42600_GYRO_FS_250DPS,
+	INV_ICM42600_GYRO_FS_125DPS,
+	INV_ICM42600_GYRO_FS_62_5DPS,
+	INV_ICM42600_GYRO_FS_31_25DPS,
+	INV_ICM42600_GYRO_FS_15_625DPS,
+	INV_ICM42600_GYRO_FS_NB,
+};
+
+/* accelerometer fullscale values */
+enum inv_icm42600_accel_fs {
+	INV_ICM42600_ACCEL_FS_16G,
+	INV_ICM42600_ACCEL_FS_8G,
+	INV_ICM42600_ACCEL_FS_4G,
+	INV_ICM42600_ACCEL_FS_2G,
+	INV_ICM42600_ACCEL_FS_NB,
+};
+
+/* ODR suffixed by LN or LP are Low-Noise or Low-Power mode only */
+enum inv_icm42600_odr {
+	INV_ICM42600_ODR_8KHZ_LN = 3,
+	INV_ICM42600_ODR_4KHZ_LN,
+	INV_ICM42600_ODR_2KHZ_LN,
+	INV_ICM42600_ODR_1KHZ_LN,
+	INV_ICM42600_ODR_200HZ,
+	INV_ICM42600_ODR_100HZ,
+	INV_ICM42600_ODR_50HZ,
+	INV_ICM42600_ODR_25HZ,
+	INV_ICM42600_ODR_12_5HZ,
+	INV_ICM42600_ODR_6_25HZ_LP,
+	INV_ICM42600_ODR_3_125HZ_LP,
+	INV_ICM42600_ODR_1_5625HZ_LP,
+	INV_ICM42600_ODR_500HZ,
+	INV_ICM42600_ODR_NB,
+};
+
+enum inv_icm42600_filter {
+	/* Low-Noise mode sensor data filter (3rd order filter by default) */
+	INV_ICM42600_FILTER_BW_ODR_DIV_2,
+
+	/* Low-Power mode sensor data filter (averaging) */
+	INV_ICM42600_FILTER_AVG_1X = 1,
+	INV_ICM42600_FILTER_AVG_16X = 6,
+};
+
+struct inv_icm42600_sensor_conf {
+	int mode;
+	int fs;
+	int odr;
+	int filter;
+};
+#define INV_ICM42600_SENSOR_CONF_INIT		{-1, -1, -1, -1}
+
+struct inv_icm42600_conf {
+	struct inv_icm42600_sensor_conf gyro;
+	struct inv_icm42600_sensor_conf accel;
+	bool temp_en;
+};
+
+struct inv_icm42600_suspended {
+	enum inv_icm42600_sensor_mode gyro;
+	enum inv_icm42600_sensor_mode accel;
+	bool temp;
+};
+
+/**
+ *  struct inv_icm42600_state - driver state variables
+ *  @lock:		lock for serializing multiple registers access.
+ *  @chip:		chip identifier.
+ *  @name:		chip name.
+ *  @map:		regmap pointer.
+ *  @vdd_supply:	VDD voltage regulator for the chip.
+ *  @vddio_supply:	I/O voltage regulator for the chip.
+ *  @orientation:	sensor chip orientation relative to main hardware.
+ *  @conf:		chip sensors configurations.
+ *  @suspended:		suspended sensors configuration.
+ */
+struct inv_icm42600_state {
+	struct mutex lock;
+	enum inv_icm42600_chip chip;
+	const char *name;
+	struct regmap *map;
+	struct regulator *vdd_supply;
+	struct regulator *vddio_supply;
+	struct iio_mount_matrix orientation;
+	struct inv_icm42600_conf conf;
+	struct inv_icm42600_suspended suspended;
+};
+
+/* Virtual register addresses: @bank on MSB (4 upper bits), @address on LSB */
+
+/* Bank selection register, available in all banks */
+#define INV_ICM42600_REG_BANK_SEL			0x76
+#define INV_ICM42600_BANK_SEL_MASK			GENMASK(2, 0)
+
+/* User bank 0 (MSB 0x00) */
+#define INV_ICM42600_REG_DEVICE_CONFIG			0x0011
+#define INV_ICM42600_DEVICE_CONFIG_SOFT_RESET		BIT(0)
+
+#define INV_ICM42600_REG_DRIVE_CONFIG			0x0013
+#define INV_ICM42600_DRIVE_CONFIG_I2C_MASK		GENMASK(5, 3)
+#define INV_ICM42600_DRIVE_CONFIG_I2C(_rate)		\
+		FIELD_PREP(INV_ICM42600_DRIVE_CONFIG_I2C_MASK, (_rate))
+#define INV_ICM42600_DRIVE_CONFIG_SPI_MASK		GENMASK(2, 0)
+#define INV_ICM42600_DRIVE_CONFIG_SPI(_rate)		\
+		FIELD_PREP(INV_ICM42600_DRIVE_CONFIG_SPI_MASK, (_rate))
+
+#define INV_ICM42600_REG_INT_CONFIG			0x0014
+#define INV_ICM42600_INT_CONFIG_INT2_LATCHED		BIT(5)
+#define INV_ICM42600_INT_CONFIG_INT2_PUSH_PULL		BIT(4)
+#define INV_ICM42600_INT_CONFIG_INT2_ACTIVE_HIGH	BIT(3)
+#define INV_ICM42600_INT_CONFIG_INT2_ACTIVE_LOW		0x00
+#define INV_ICM42600_INT_CONFIG_INT1_LATCHED		BIT(2)
+#define INV_ICM42600_INT_CONFIG_INT1_PUSH_PULL		BIT(1)
+#define INV_ICM42600_INT_CONFIG_INT1_ACTIVE_HIGH	BIT(0)
+#define INV_ICM42600_INT_CONFIG_INT1_ACTIVE_LOW		0x00
+
+#define INV_ICM42600_REG_FIFO_CONFIG			0x0016
+#define INV_ICM42600_FIFO_CONFIG_MASK			GENMASK(7, 6)
+#define INV_ICM42600_FIFO_CONFIG_BYPASS			\
+		FIELD_PREP(INV_ICM42600_FIFO_CONFIG_MASK, 0)
+#define INV_ICM42600_FIFO_CONFIG_STREAM			\
+		FIELD_PREP(INV_ICM42600_FIFO_CONFIG_MASK, 1)
+#define INV_ICM42600_FIFO_CONFIG_STOP_ON_FULL		\
+		FIELD_PREP(INV_ICM42600_FIFO_CONFIG_MASK, 2)
+
+/* all sensor data are 16 bits (2 registers wide) in big-endian */
+#define INV_ICM42600_REG_TEMP_DATA			0x001D
+#define INV_ICM42600_REG_ACCEL_DATA_X			0x001F
+#define INV_ICM42600_REG_ACCEL_DATA_Y			0x0021
+#define INV_ICM42600_REG_ACCEL_DATA_Z			0x0023
+#define INV_ICM42600_REG_GYRO_DATA_X			0x0025
+#define INV_ICM42600_REG_GYRO_DATA_Y			0x0027
+#define INV_ICM42600_REG_GYRO_DATA_Z			0x0029
+#define INV_ICM42600_DATA_INVALID			-32768
+
+#define INV_ICM42600_REG_INT_STATUS			0x002D
+#define INV_ICM42600_INT_STATUS_UI_FSYNC		BIT(6)
+#define INV_ICM42600_INT_STATUS_PLL_RDY			BIT(5)
+#define INV_ICM42600_INT_STATUS_RESET_DONE		BIT(4)
+#define INV_ICM42600_INT_STATUS_DATA_RDY		BIT(3)
+#define INV_ICM42600_INT_STATUS_FIFO_THS		BIT(2)
+#define INV_ICM42600_INT_STATUS_FIFO_FULL		BIT(1)
+#define INV_ICM42600_INT_STATUS_AGC_RDY			BIT(0)
+
+/*
+ * FIFO access registers
+ * FIFO count is 16 bits (2 registers) big-endian
+ * FIFO data is a continuous read register to read FIFO content
+ */
+#define INV_ICM42600_REG_FIFO_COUNT			0x002E
+#define INV_ICM42600_REG_FIFO_DATA			0x0030
+
+#define INV_ICM42600_REG_SIGNAL_PATH_RESET		0x004B
+#define INV_ICM42600_SIGNAL_PATH_RESET_DMP_INIT_EN	BIT(6)
+#define INV_ICM42600_SIGNAL_PATH_RESET_DMP_MEM_RESET	BIT(5)
+#define INV_ICM42600_SIGNAL_PATH_RESET_RESET		BIT(3)
+#define INV_ICM42600_SIGNAL_PATH_RESET_TMST_STROBE	BIT(2)
+#define INV_ICM42600_SIGNAL_PATH_RESET_FIFO_FLUSH	BIT(1)
+
+/* default configuration: all data big-endian and fifo count in bytes */
+#define INV_ICM42600_REG_INTF_CONFIG0			0x004C
+#define INV_ICM42600_INTF_CONFIG0_FIFO_HOLD_LAST_DATA	BIT(7)
+#define INV_ICM42600_INTF_CONFIG0_FIFO_COUNT_REC	BIT(6)
+#define INV_ICM42600_INTF_CONFIG0_FIFO_COUNT_ENDIAN	BIT(5)
+#define INV_ICM42600_INTF_CONFIG0_SENSOR_DATA_ENDIAN	BIT(4)
+#define INV_ICM42600_INTF_CONFIG0_UI_SIFS_CFG_MASK	GENMASK(1, 0)
+#define INV_ICM42600_INTF_CONFIG0_UI_SIFS_CFG_SPI_DIS	\
+		FIELD_PREP(INV_ICM42600_INTF_CONFIG0_UI_SIFS_CFG_MASK, 2)
+#define INV_ICM42600_INTF_CONFIG0_UI_SIFS_CFG_I2C_DIS	\
+		FIELD_PREP(INV_ICM42600_INTF_CONFIG0_UI_SIFS_CFG_MASK, 3)
+
+#define INV_ICM42600_REG_INTF_CONFIG1			0x004D
+#define INV_ICM42600_INTF_CONFIG1_ACCEL_LP_CLK_RC	BIT(3)
+
+#define INV_ICM42600_REG_PWR_MGMT0			0x004E
+#define INV_ICM42600_PWR_MGMT0_TEMP_DIS			BIT(5)
+#define INV_ICM42600_PWR_MGMT0_IDLE			BIT(4)
+#define INV_ICM42600_PWR_MGMT0_GYRO(_mode)		\
+		FIELD_PREP(GENMASK(3, 2), (_mode))
+#define INV_ICM42600_PWR_MGMT0_ACCEL(_mode)		\
+		FIELD_PREP(GENMASK(1, 0), (_mode))
+
+#define INV_ICM42600_REG_GYRO_CONFIG0			0x004F
+#define INV_ICM42600_GYRO_CONFIG0_FS(_fs)		\
+		FIELD_PREP(GENMASK(7, 5), (_fs))
+#define INV_ICM42600_GYRO_CONFIG0_ODR(_odr)		\
+		FIELD_PREP(GENMASK(3, 0), (_odr))
+
+#define INV_ICM42600_REG_ACCEL_CONFIG0			0x0050
+#define INV_ICM42600_ACCEL_CONFIG0_FS(_fs)		\
+		FIELD_PREP(GENMASK(7, 5), (_fs))
+#define INV_ICM42600_ACCEL_CONFIG0_ODR(_odr)		\
+		FIELD_PREP(GENMASK(3, 0), (_odr))
+
+#define INV_ICM42600_REG_GYRO_ACCEL_CONFIG0		0x0052
+#define INV_ICM42600_GYRO_ACCEL_CONFIG0_ACCEL_FILT(_f)	\
+		FIELD_PREP(GENMASK(7, 4), (_f))
+#define INV_ICM42600_GYRO_ACCEL_CONFIG0_GYRO_FILT(_f)	\
+		FIELD_PREP(GENMASK(3, 0), (_f))
+
+#define INV_ICM42600_REG_TMST_CONFIG			0x0054
+#define INV_ICM42600_TMST_CONFIG_MASK			GENMASK(4, 0)
+#define INV_ICM42600_TMST_CONFIG_TMST_TO_REGS_EN	BIT(4)
+#define INV_ICM42600_TMST_CONFIG_TMST_RES_16US		BIT(3)
+#define INV_ICM42600_TMST_CONFIG_TMST_DELTA_EN		BIT(2)
+#define INV_ICM42600_TMST_CONFIG_TMST_FSYNC_EN		BIT(1)
+#define INV_ICM42600_TMST_CONFIG_TMST_EN		BIT(0)
+
+#define INV_ICM42600_REG_FIFO_CONFIG1			0x005F
+#define INV_ICM42600_FIFO_CONFIG1_RESUME_PARTIAL_RD	BIT(6)
+#define INV_ICM42600_FIFO_CONFIG1_WM_GT_TH		BIT(5)
+#define INV_ICM42600_FIFO_CONFIG1_TMST_FSYNC_EN		BIT(3)
+#define INV_ICM42600_FIFO_CONFIG1_TEMP_EN		BIT(2)
+#define INV_ICM42600_FIFO_CONFIG1_GYRO_EN		BIT(1)
+#define INV_ICM42600_FIFO_CONFIG1_ACCEL_EN		BIT(0)
+
+/* FIFO watermark is 16 bits (2 registers wide) in little-endian */
+#define INV_ICM42600_REG_FIFO_WATERMARK			0x0060
+#define INV_ICM42600_FIFO_WATERMARK_VAL(_wm)		\
+		cpu_to_le16((_wm) & GENMASK(11, 0))
+/* FIFO is 2048 bytes, let 12 samples for reading latency */
+#define INV_ICM42600_FIFO_WATERMARK_MAX			(2048 - 12 * 16)
+
+#define INV_ICM42600_REG_INT_CONFIG1			0x0064
+#define INV_ICM42600_INT_CONFIG1_TPULSE_DURATION	BIT(6)
+#define INV_ICM42600_INT_CONFIG1_TDEASSERT_DISABLE	BIT(5)
+#define INV_ICM42600_INT_CONFIG1_ASYNC_RESET		BIT(4)
+
+#define INV_ICM42600_REG_INT_SOURCE0			0x0065
+#define INV_ICM42600_INT_SOURCE0_UI_FSYNC_INT1_EN	BIT(6)
+#define INV_ICM42600_INT_SOURCE0_PLL_RDY_INT1_EN	BIT(5)
+#define INV_ICM42600_INT_SOURCE0_RESET_DONE_INT1_EN	BIT(4)
+#define INV_ICM42600_INT_SOURCE0_UI_DRDY_INT1_EN	BIT(3)
+#define INV_ICM42600_INT_SOURCE0_FIFO_THS_INT1_EN	BIT(2)
+#define INV_ICM42600_INT_SOURCE0_FIFO_FULL_INT1_EN	BIT(1)
+#define INV_ICM42600_INT_SOURCE0_UI_AGC_RDY_INT1_EN	BIT(0)
+
+#define INV_ICM42600_REG_WHOAMI				0x0075
+#define INV_ICM42600_WHOAMI_ICM42600			0x40
+#define INV_ICM42600_WHOAMI_ICM42602			0x41
+#define INV_ICM42600_WHOAMI_ICM42605			0x42
+#define INV_ICM42600_WHOAMI_ICM42622			0x46
+
+/* User bank 1 (MSB 0x10) */
+#define INV_ICM42600_REG_SENSOR_CONFIG0			0x1003
+#define INV_ICM42600_SENSOR_CONFIG0_ZG_DISABLE		BIT(5)
+#define INV_ICM42600_SENSOR_CONFIG0_YG_DISABLE		BIT(4)
+#define INV_ICM42600_SENSOR_CONFIG0_XG_DISABLE		BIT(3)
+#define INV_ICM42600_SENSOR_CONFIG0_ZA_DISABLE		BIT(2)
+#define INV_ICM42600_SENSOR_CONFIG0_YA_DISABLE		BIT(1)
+#define INV_ICM42600_SENSOR_CONFIG0_XA_DISABLE		BIT(0)
+
+/* Timestamp value is 20 bits (3 registers) in little-endian */
+#define INV_ICM42600_REG_TMSTVAL			0x1062
+#define INV_ICM42600_TMSTVAL_MASK			GENMASK(19, 0)
+
+#define INV_ICM42600_REG_INTF_CONFIG4			0x107A
+#define INV_ICM42600_INTF_CONFIG4_I3C_BUS_ONLY		BIT(6)
+#define INV_ICM42600_INTF_CONFIG4_SPI_AP_4WIRE		BIT(1)
+
+#define INV_ICM42600_REG_INTF_CONFIG6			0x107C
+#define INV_ICM42600_INTF_CONFIG6_MASK			GENMASK(4, 0)
+#define INV_ICM42600_INTF_CONFIG6_I3C_EN		BIT(4)
+#define INV_ICM42600_INTF_CONFIG6_I3C_IBI_BYTE_EN	BIT(3)
+#define INV_ICM42600_INTF_CONFIG6_I3C_IBI_EN		BIT(2)
+#define INV_ICM42600_INTF_CONFIG6_I3C_DDR_EN		BIT(1)
+#define INV_ICM42600_INTF_CONFIG6_I3C_SDR_EN		BIT(0)
+
+/* User bank 4 (MSB 0x40) */
+#define INV_ICM42600_REG_INT_SOURCE8			0x404F
+#define INV_ICM42600_INT_SOURCE8_FSYNC_IBI_EN		BIT(5)
+#define INV_ICM42600_INT_SOURCE8_PLL_RDY_IBI_EN		BIT(4)
+#define INV_ICM42600_INT_SOURCE8_UI_DRDY_IBI_EN		BIT(3)
+#define INV_ICM42600_INT_SOURCE8_FIFO_THS_IBI_EN	BIT(2)
+#define INV_ICM42600_INT_SOURCE8_FIFO_FULL_IBI_EN	BIT(1)
+#define INV_ICM42600_INT_SOURCE8_AGC_RDY_IBI_EN		BIT(0)
+
+#define INV_ICM42600_REG_OFFSET_USER0			0x4077
+#define INV_ICM42600_REG_OFFSET_USER1			0x4078
+#define INV_ICM42600_REG_OFFSET_USER2			0x4079
+#define INV_ICM42600_REG_OFFSET_USER3			0x407A
+#define INV_ICM42600_REG_OFFSET_USER4			0x407B
+#define INV_ICM42600_REG_OFFSET_USER5			0x407C
+#define INV_ICM42600_REG_OFFSET_USER6			0x407D
+#define INV_ICM42600_REG_OFFSET_USER7			0x407E
+#define INV_ICM42600_REG_OFFSET_USER8			0x407F
+
+/* Sleep times required by the driver */
+#define INV_ICM42600_POWER_UP_TIME_MS		100
+#define INV_ICM42600_RESET_TIME_MS		1
+#define INV_ICM42600_ACCEL_STARTUP_TIME_MS	20
+#define INV_ICM42600_GYRO_STARTUP_TIME_MS	60
+#define INV_ICM42600_GYRO_STOP_TIME_MS		150
+#define INV_ICM42600_TEMP_STARTUP_TIME_MS	14
+#define INV_ICM42600_SUSPEND_DELAY_MS		2000
+
+typedef int (*inv_icm42600_bus_setup)(struct inv_icm42600_state *);
+
+extern const struct regmap_config inv_icm42600_regmap_config;
+extern const struct dev_pm_ops inv_icm42600_pm_ops;
+
+const struct iio_mount_matrix *
+inv_icm42600_get_mount_matrix(const struct iio_dev *indio_dev,
+			      const struct iio_chan_spec *chan);
+
+uint32_t inv_icm42600_odr_to_period(enum inv_icm42600_odr odr);
+
+int inv_icm42600_set_accel_conf(struct inv_icm42600_state *st,
+				struct inv_icm42600_sensor_conf *conf,
+				unsigned int *sleep_ms);
+
+int inv_icm42600_set_gyro_conf(struct inv_icm42600_state *st,
+			       struct inv_icm42600_sensor_conf *conf,
+			       unsigned int *sleep_ms);
+
+int inv_icm42600_set_temp_conf(struct inv_icm42600_state *st, bool enable,
+			       unsigned int *sleep_ms);
+
+int inv_icm42600_debugfs_reg(struct iio_dev *indio_dev, unsigned int reg,
+			     unsigned int writeval, unsigned int *readval);
+
+int inv_icm42600_core_probe(struct regmap *regmap, int chip,
+			    inv_icm42600_bus_setup bus_setup);
+
+#endif
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
new file mode 100644
index 000000000000..2eb25c5f77f8
--- /dev/null
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
@@ -0,0 +1,634 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2020 Invensense, Inc.
+ */
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/delay.h>
+#include <linux/mutex.h>
+#include <linux/regulator/consumer.h>
+#include <linux/pm_runtime.h>
+#include <linux/regmap.h>
+#include <linux/iio/iio.h>
+
+#include "inv_icm42600.h"
+
+static const struct regmap_range_cfg inv_icm42600_regmap_ranges[] = {
+	{
+		.name = "user banks",
+		.range_min = 0x0000,
+		.range_max = 0x4FFF,
+		.selector_reg = INV_ICM42600_REG_BANK_SEL,
+		.selector_mask = INV_ICM42600_BANK_SEL_MASK,
+		.selector_shift = 0,
+		.window_start = 0,
+		.window_len = 0x1000,
+	},
+};
+
+const struct regmap_config inv_icm42600_regmap_config = {
+	.reg_bits = 8,
+	.val_bits = 8,
+	.max_register = 0x4FFF,
+	.ranges = inv_icm42600_regmap_ranges,
+	.num_ranges = ARRAY_SIZE(inv_icm42600_regmap_ranges),
+};
+EXPORT_SYMBOL_GPL(inv_icm42600_regmap_config);
+
+struct inv_icm42600_hw {
+	uint8_t whoami;
+	const char *name;
+	const struct inv_icm42600_conf *conf;
+};
+
+/* chip initial default configuration */
+static const struct inv_icm42600_conf inv_icm42600_default_conf = {
+	.gyro = {
+		.mode = INV_ICM42600_SENSOR_MODE_OFF,
+		.fs = INV_ICM42600_GYRO_FS_2000DPS,
+		.odr = INV_ICM42600_ODR_50HZ,
+		.filter = INV_ICM42600_FILTER_BW_ODR_DIV_2,
+	},
+	.accel = {
+		.mode = INV_ICM42600_SENSOR_MODE_OFF,
+		.fs = INV_ICM42600_ACCEL_FS_16G,
+		.odr = INV_ICM42600_ODR_50HZ,
+		.filter = INV_ICM42600_FILTER_BW_ODR_DIV_2,
+	},
+	.temp_en = false,
+};
+
+static const struct inv_icm42600_hw inv_icm42600_hw[INV_CHIP_NB] = {
+	[INV_CHIP_ICM42600] = {
+		.whoami = INV_ICM42600_WHOAMI_ICM42600,
+		.name = "icm42600",
+		.conf = &inv_icm42600_default_conf,
+	},
+	[INV_CHIP_ICM42602] = {
+		.whoami = INV_ICM42600_WHOAMI_ICM42602,
+		.name = "icm42602",
+		.conf = &inv_icm42600_default_conf,
+	},
+	[INV_CHIP_ICM42605] = {
+		.whoami = INV_ICM42600_WHOAMI_ICM42605,
+		.name = "icm42605",
+		.conf = &inv_icm42600_default_conf,
+	},
+	[INV_CHIP_ICM42622] = {
+		.whoami = INV_ICM42600_WHOAMI_ICM42622,
+		.name = "icm42622",
+		.conf = &inv_icm42600_default_conf,
+	},
+};
+
+const struct iio_mount_matrix *
+inv_icm42600_get_mount_matrix(const struct iio_dev *indio_dev,
+			      const struct iio_chan_spec *chan)
+{
+	const struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+
+	return &st->orientation;
+}
+
+uint32_t inv_icm42600_odr_to_period(enum inv_icm42600_odr odr)
+{
+	static uint32_t odr_periods[INV_ICM42600_ODR_NB] = {
+		/* reserved values */
+		0, 0, 0,
+		/* 8kHz */
+		125000,
+		/* 4kHz */
+		250000,
+		/* 2kHz */
+		500000,
+		/* 1kHz */
+		1000000,
+		/* 200Hz */
+		5000000,
+		/* 100Hz */
+		10000000,
+		/* 50Hz */
+		20000000,
+		/* 25Hz */
+		40000000,
+		/* 12.5Hz */
+		80000000,
+		/* 6.25Hz */
+		160000000,
+		/* 3.125Hz */
+		320000000,
+		/* 1.5625Hz */
+		640000000,
+		/* 500Hz */
+		2000000,
+	};
+
+	return odr_periods[odr];
+}
+
+static int inv_icm42600_set_pwr_mgmt0(struct inv_icm42600_state *st,
+				      enum inv_icm42600_sensor_mode gyro,
+				      enum inv_icm42600_sensor_mode accel,
+				      bool temp, unsigned int *sleep_ms)
+{
+	enum inv_icm42600_sensor_mode oldgyro = st->conf.gyro.mode;
+	enum inv_icm42600_sensor_mode oldaccel = st->conf.accel.mode;
+	bool oldtemp = st->conf.temp_en;
+	unsigned int sleepval;
+	unsigned int val;
+	int ret;
+
+	/* if nothing changed, exit */
+	if (gyro == oldgyro && accel == oldaccel && temp == oldtemp)
+		return 0;
+
+	val = INV_ICM42600_PWR_MGMT0_GYRO(gyro) |
+	      INV_ICM42600_PWR_MGMT0_ACCEL(accel);
+	if (!temp)
+		val |= INV_ICM42600_PWR_MGMT0_TEMP_DIS;
+	ret = regmap_write(st->map, INV_ICM42600_REG_PWR_MGMT0, val);
+	if (ret)
+		return ret;
+
+	st->conf.gyro.mode = gyro;
+	st->conf.accel.mode = accel;
+	st->conf.temp_en = temp;
+
+	/* compute required wait time for sensors to stabilize */
+	sleepval = 0;
+	/* temperature stabilization time */
+	if (temp && !oldtemp) {
+		if (sleepval < INV_ICM42600_TEMP_STARTUP_TIME_MS)
+			sleepval = INV_ICM42600_TEMP_STARTUP_TIME_MS;
+	}
+	/* accel startup time */
+	if (accel != oldaccel && oldaccel == INV_ICM42600_SENSOR_MODE_OFF) {
+		/* block any register write for at least 200 µs */
+		usleep_range(200, 300);
+		if (sleepval < INV_ICM42600_ACCEL_STARTUP_TIME_MS)
+			sleepval = INV_ICM42600_ACCEL_STARTUP_TIME_MS;
+	}
+	if (gyro != oldgyro) {
+		/* gyro startup time */
+		if (oldgyro == INV_ICM42600_SENSOR_MODE_OFF) {
+			/* block any register write for at least 200 µs */
+			usleep_range(200, 300);
+			if (sleepval < INV_ICM42600_GYRO_STARTUP_TIME_MS)
+				sleepval = INV_ICM42600_GYRO_STARTUP_TIME_MS;
+		/* gyro stop time */
+		} else if (gyro == INV_ICM42600_SENSOR_MODE_OFF) {
+			if (sleepval < INV_ICM42600_GYRO_STOP_TIME_MS)
+				sleepval =  INV_ICM42600_GYRO_STOP_TIME_MS;
+		}
+	}
+
+	/* deferred sleep value if sleep pointer is provided or direct sleep */
+	if (sleep_ms)
+		*sleep_ms = sleepval;
+	else if (sleepval)
+		msleep(sleepval);
+
+	return 0;
+}
+
+int inv_icm42600_set_accel_conf(struct inv_icm42600_state *st,
+				struct inv_icm42600_sensor_conf *conf,
+				unsigned int *sleep_ms)
+{
+	struct inv_icm42600_sensor_conf *oldconf = &st->conf.accel;
+	unsigned int val;
+	int ret;
+
+	/* Sanitize missing values with current values */
+	if (conf->mode < 0)
+		conf->mode = oldconf->mode;
+	if (conf->fs < 0)
+		conf->fs = oldconf->fs;
+	if (conf->odr < 0)
+		conf->odr = oldconf->odr;
+	if (conf->filter < 0)
+		conf->filter = oldconf->filter;
+
+	/* set ACCEL_CONFIG0 register (accel fullscale & odr) */
+	if (conf->fs != oldconf->fs || conf->odr != oldconf->odr) {
+		val = INV_ICM42600_ACCEL_CONFIG0_FS(conf->fs) |
+		      INV_ICM42600_ACCEL_CONFIG0_ODR(conf->odr);
+		ret = regmap_write(st->map, INV_ICM42600_REG_ACCEL_CONFIG0, val);
+		if (ret)
+			return ret;
+		oldconf->fs = conf->fs;
+		oldconf->odr = conf->odr;
+	}
+
+	/* set GYRO_ACCEL_CONFIG0 register (accel filter) */
+	if (conf->filter != oldconf->filter) {
+		val = INV_ICM42600_GYRO_ACCEL_CONFIG0_ACCEL_FILT(conf->filter) |
+		      INV_ICM42600_GYRO_ACCEL_CONFIG0_GYRO_FILT(st->conf.gyro.filter);
+		ret = regmap_write(st->map, INV_ICM42600_REG_GYRO_ACCEL_CONFIG0, val);
+		if (ret)
+			return ret;
+		oldconf->filter = conf->filter;
+	}
+
+	/* set PWR_MGMT0 register (accel sensor mode) */
+	return inv_icm42600_set_pwr_mgmt0(st, st->conf.gyro.mode, conf->mode,
+					  st->conf.temp_en, sleep_ms);
+}
+
+int inv_icm42600_set_gyro_conf(struct inv_icm42600_state *st,
+			       struct inv_icm42600_sensor_conf *conf,
+			       unsigned int *sleep_ms)
+{
+	struct inv_icm42600_sensor_conf *oldconf = &st->conf.gyro;
+	unsigned int val;
+	int ret;
+
+	/* sanitize missing values with current values */
+	if (conf->mode < 0)
+		conf->mode = oldconf->mode;
+	if (conf->fs < 0)
+		conf->fs = oldconf->fs;
+	if (conf->odr < 0)
+		conf->odr = oldconf->odr;
+	if (conf->filter < 0)
+		conf->filter = oldconf->filter;
+
+	/* set GYRO_CONFIG0 register (gyro fullscale & odr) */
+	if (conf->fs != oldconf->fs || conf->odr != oldconf->odr) {
+		val = INV_ICM42600_GYRO_CONFIG0_FS(conf->fs) |
+		      INV_ICM42600_GYRO_CONFIG0_ODR(conf->odr);
+		ret = regmap_write(st->map, INV_ICM42600_REG_GYRO_CONFIG0, val);
+		if (ret)
+			return ret;
+		oldconf->fs = conf->fs;
+		oldconf->odr = conf->odr;
+	}
+
+	/* set GYRO_ACCEL_CONFIG0 register (gyro filter) */
+	if (conf->filter != oldconf->filter) {
+		val = INV_ICM42600_GYRO_ACCEL_CONFIG0_ACCEL_FILT(st->conf.accel.filter) |
+		      INV_ICM42600_GYRO_ACCEL_CONFIG0_GYRO_FILT(conf->filter);
+		ret = regmap_write(st->map, INV_ICM42600_REG_GYRO_ACCEL_CONFIG0, val);
+		if (ret)
+			return ret;
+		oldconf->filter = conf->filter;
+	}
+
+	/* set PWR_MGMT0 register (gyro sensor mode) */
+	return inv_icm42600_set_pwr_mgmt0(st, conf->mode, st->conf.accel.mode,
+					  st->conf.temp_en, sleep_ms);
+
+	return 0;
+}
+
+int inv_icm42600_set_temp_conf(struct inv_icm42600_state *st, bool enable,
+			       unsigned int *sleep_ms)
+{
+	return inv_icm42600_set_pwr_mgmt0(st, st->conf.gyro.mode,
+					  st->conf.accel.mode, enable,
+					  sleep_ms);
+}
+
+int inv_icm42600_debugfs_reg(struct iio_dev *indio_dev, unsigned int reg,
+			     unsigned int writeval, unsigned int *readval)
+{
+	struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
+	int ret;
+
+	mutex_lock(&st->lock);
+
+	if (readval)
+		ret = regmap_read(st->map, reg, readval);
+	else
+		ret = regmap_write(st->map, reg, writeval);
+
+	mutex_unlock(&st->lock);
+
+	return ret;
+}
+
+static int inv_icm42600_set_conf(struct inv_icm42600_state *st,
+				 const struct inv_icm42600_conf *conf)
+{
+	unsigned int val;
+	int ret;
+
+	/* set PWR_MGMT0 register (gyro & accel sensor mode, temp enabled) */
+	val = INV_ICM42600_PWR_MGMT0_GYRO(conf->gyro.mode) |
+	      INV_ICM42600_PWR_MGMT0_ACCEL(conf->accel.mode);
+	if (!conf->temp_en)
+		val |= INV_ICM42600_PWR_MGMT0_TEMP_DIS;
+	ret = regmap_write(st->map, INV_ICM42600_REG_PWR_MGMT0, val);
+	if (ret)
+		return ret;
+
+	/* set GYRO_CONFIG0 register (gyro fullscale & odr) */
+	val = INV_ICM42600_GYRO_CONFIG0_FS(conf->gyro.fs) |
+	      INV_ICM42600_GYRO_CONFIG0_ODR(conf->gyro.odr);
+	ret = regmap_write(st->map, INV_ICM42600_REG_GYRO_CONFIG0, val);
+	if (ret)
+		return ret;
+
+	/* set ACCEL_CONFIG0 register (accel fullscale & odr) */
+	val = INV_ICM42600_ACCEL_CONFIG0_FS(conf->accel.fs) |
+	      INV_ICM42600_ACCEL_CONFIG0_ODR(conf->accel.odr);
+	ret = regmap_write(st->map, INV_ICM42600_REG_ACCEL_CONFIG0, val);
+	if (ret)
+		return ret;
+
+	/* set GYRO_ACCEL_CONFIG0 register (gyro & accel filters) */
+	val = INV_ICM42600_GYRO_ACCEL_CONFIG0_ACCEL_FILT(conf->accel.filter) |
+	      INV_ICM42600_GYRO_ACCEL_CONFIG0_GYRO_FILT(conf->gyro.filter);
+	ret = regmap_write(st->map, INV_ICM42600_REG_GYRO_ACCEL_CONFIG0, val);
+	if (ret)
+		return ret;
+
+	/* update internal conf */
+	st->conf = *conf;
+
+	return 0;
+}
+
+/**
+ *  inv_icm42600_setup() - check and setup chip
+ *  @st:	driver internal state
+ *  @bus_setup:	callback for setting up bus specific registers
+ *
+ *  Returns 0 on success, a negative error code otherwise.
+ */
+static int inv_icm42600_setup(struct inv_icm42600_state *st,
+			      inv_icm42600_bus_setup bus_setup)
+{
+	const struct inv_icm42600_hw *hw = &inv_icm42600_hw[st->chip];
+	const struct device *dev = regmap_get_device(st->map);
+	unsigned int val;
+	int ret;
+
+	/* check chip self-identification value */
+	ret = regmap_read(st->map, INV_ICM42600_REG_WHOAMI, &val);
+	if (ret)
+		return ret;
+	if (val != hw->whoami) {
+		dev_err(dev, "invalid whoami %#02x expected %#02x (%s)\n",
+			val, hw->whoami, hw->name);
+		return -ENODEV;
+	}
+	st->name = hw->name;
+
+	/* reset to make sure previous state are not there */
+	ret = regmap_write(st->map, INV_ICM42600_REG_DEVICE_CONFIG,
+			   INV_ICM42600_DEVICE_CONFIG_SOFT_RESET);
+	if (ret)
+		return ret;
+	msleep(INV_ICM42600_RESET_TIME_MS);
+
+	ret = regmap_read(st->map, INV_ICM42600_REG_INT_STATUS, &val);
+	if (ret)
+		return ret;
+	if (!(val & INV_ICM42600_INT_STATUS_RESET_DONE)) {
+		dev_err(dev, "reset error, reset done bit not set\n");
+		return -ENODEV;
+	}
+
+	/* set chip bus configuration */
+	ret = bus_setup(st);
+	if (ret)
+		return ret;
+
+	/* sensor data in big-endian (default) */
+	ret = regmap_update_bits(st->map, INV_ICM42600_REG_INTF_CONFIG0,
+				 INV_ICM42600_INTF_CONFIG0_SENSOR_DATA_ENDIAN,
+				 INV_ICM42600_INTF_CONFIG0_SENSOR_DATA_ENDIAN);
+	if (ret)
+		return ret;
+
+	return inv_icm42600_set_conf(st, hw->conf);
+}
+
+static int inv_icm42600_enable_regulator_vddio(struct inv_icm42600_state *st)
+{
+	int ret;
+
+	ret = regulator_enable(st->vddio_supply);
+	if (ret)
+		return ret;
+
+	/* wait a little for supply ramp */
+	usleep_range(3000, 4000);
+
+	return 0;
+}
+
+static void inv_icm42600_disable_vdd_reg(void *_data)
+{
+	struct inv_icm42600_state *st = _data;
+	const struct device *dev = regmap_get_device(st->map);
+	int ret;
+
+	ret = regulator_disable(st->vdd_supply);
+	if (ret)
+		dev_err(dev, "failed to disable vdd error %d\n", ret);
+}
+
+static void inv_icm42600_disable_vddio_reg(void *_data)
+{
+	struct inv_icm42600_state *st = _data;
+	const struct device *dev = regmap_get_device(st->map);
+	int ret;
+
+	ret = regulator_disable(st->vddio_supply);
+	if (ret)
+		dev_err(dev, "failed to disable vddio error %d\n", ret);
+}
+
+static void inv_icm42600_disable_pm(void *_data)
+{
+	struct device *dev = _data;
+
+	pm_runtime_put_sync(dev);
+	pm_runtime_disable(dev);
+}
+
+int inv_icm42600_core_probe(struct regmap *regmap, int chip,
+			    inv_icm42600_bus_setup bus_setup)
+{
+	struct device *dev = regmap_get_device(regmap);
+	struct inv_icm42600_state *st;
+	int ret;
+
+	if (chip < 0 || chip >= INV_CHIP_NB) {
+		dev_err(dev, "invalid chip = %d\n", chip);
+		return -ENODEV;
+	}
+
+	st = devm_kzalloc(dev, sizeof(*st), GFP_KERNEL);
+	if (!st)
+		return -ENOMEM;
+
+	dev_set_drvdata(dev, st);
+	mutex_init(&st->lock);
+	st->chip = chip;
+	st->map = regmap;
+
+	ret = iio_read_mount_matrix(dev, "mount-matrix", &st->orientation);
+	if (ret) {
+		dev_err(dev, "failed to retrieve mounting matrix %d\n", ret);
+		return ret;
+	}
+
+	st->vdd_supply = devm_regulator_get(dev, "vdd");
+	if (IS_ERR(st->vdd_supply))
+		return PTR_ERR(st->vdd_supply);
+
+	st->vddio_supply = devm_regulator_get(dev, "vddio");
+	if (IS_ERR(st->vddio_supply))
+		return PTR_ERR(st->vddio_supply);
+
+	ret = regulator_enable(st->vdd_supply);
+	if (ret)
+		return ret;
+	msleep(INV_ICM42600_POWER_UP_TIME_MS);
+
+	ret = devm_add_action_or_reset(dev, inv_icm42600_disable_vdd_reg, st);
+	if (ret)
+		return ret;
+
+	ret = inv_icm42600_enable_regulator_vddio(st);
+	if (ret)
+		return ret;
+
+	ret = devm_add_action_or_reset(dev, inv_icm42600_disable_vddio_reg, st);
+	if (ret)
+		return ret;
+
+	/* setup chip registers */
+	ret = inv_icm42600_setup(st, bus_setup);
+	if (ret)
+		return ret;
+
+	/* setup runtime power management */
+	ret = pm_runtime_set_active(dev);
+	if (ret)
+		return ret;
+	pm_runtime_get_noresume(dev);
+	pm_runtime_enable(dev);
+	pm_runtime_set_autosuspend_delay(dev, INV_ICM42600_SUSPEND_DELAY_MS);
+	pm_runtime_use_autosuspend(dev);
+	pm_runtime_put(dev);
+
+	return devm_add_action_or_reset(dev, inv_icm42600_disable_pm, dev);
+}
+EXPORT_SYMBOL_GPL(inv_icm42600_core_probe);
+
+/*
+ * Suspend saves sensors state and turns everything off.
+ * Check first if runtime suspend has not already done the job.
+ */
+static int __maybe_unused inv_icm42600_suspend(struct device *dev)
+{
+	struct inv_icm42600_state *st = dev_get_drvdata(dev);
+	int ret;
+
+	mutex_lock(&st->lock);
+
+	st->suspended.gyro = st->conf.gyro.mode;
+	st->suspended.accel = st->conf.accel.mode;
+	st->suspended.temp = st->conf.temp_en;
+	if (pm_runtime_suspended(dev)) {
+		ret = 0;
+		goto out_unlock;
+	}
+
+	ret = inv_icm42600_set_pwr_mgmt0(st, INV_ICM42600_SENSOR_MODE_OFF,
+					 INV_ICM42600_SENSOR_MODE_OFF, false,
+					 NULL);
+	if (ret)
+		goto out_unlock;
+
+	regulator_disable(st->vddio_supply);
+
+out_unlock:
+	mutex_unlock(&st->lock);
+	return ret;
+}
+
+/*
+ * System resume gets the system back on and restores the sensors state.
+ * Manually put runtime power management in system active state.
+ */
+static int __maybe_unused inv_icm42600_resume(struct device *dev)
+{
+	struct inv_icm42600_state *st = dev_get_drvdata(dev);
+	int ret;
+
+	mutex_lock(&st->lock);
+
+	ret = inv_icm42600_enable_regulator_vddio(st);
+	if (ret)
+		goto out_unlock;
+
+	pm_runtime_disable(dev);
+	pm_runtime_set_active(dev);
+	pm_runtime_enable(dev);
+
+	/* restore sensors state */
+	ret = inv_icm42600_set_pwr_mgmt0(st, st->suspended.gyro,
+					 st->suspended.accel,
+					 st->suspended.temp, NULL);
+	if (ret)
+		goto out_unlock;
+
+out_unlock:
+	mutex_unlock(&st->lock);
+	return ret;
+}
+
+/* Runtime suspend will turn off sensors that are enabled by iio devices. */
+static int __maybe_unused inv_icm42600_runtime_suspend(struct device *dev)
+{
+	struct inv_icm42600_state *st = dev_get_drvdata(dev);
+	int ret;
+
+	mutex_lock(&st->lock);
+
+	/* disable all sensors */
+	ret = inv_icm42600_set_pwr_mgmt0(st, INV_ICM42600_SENSOR_MODE_OFF,
+					 INV_ICM42600_SENSOR_MODE_OFF, false,
+					 NULL);
+	if (ret)
+		goto error_unlock;
+
+	regulator_disable(st->vddio_supply);
+
+error_unlock:
+	mutex_unlock(&st->lock);
+	return ret;
+}
+
+/* Sensors are enabled by iio devices, no need to turn them back on here. */
+static int __maybe_unused inv_icm42600_runtime_resume(struct device *dev)
+{
+	struct inv_icm42600_state *st = dev_get_drvdata(dev);
+	int ret;
+
+	mutex_lock(&st->lock);
+
+	ret = inv_icm42600_enable_regulator_vddio(st);
+
+	mutex_unlock(&st->lock);
+	return ret;
+}
+
+const struct dev_pm_ops inv_icm42600_pm_ops = {
+	SET_SYSTEM_SLEEP_PM_OPS(inv_icm42600_suspend, inv_icm42600_resume)
+	SET_RUNTIME_PM_OPS(inv_icm42600_runtime_suspend,
+			   inv_icm42600_runtime_resume, NULL)
+};
+EXPORT_SYMBOL_GPL(inv_icm42600_pm_ops);
+
+MODULE_AUTHOR("InvenSense, Inc.");
+MODULE_DESCRIPTION("InvenSense ICM-426xx device driver");
+MODULE_LICENSE("GPL");

commit 3bdad4c73905562b4f65d592360bd683f4b96e1b
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Thu Sep 23 20:43:57 2021 +0800

    media: rockchip: cif: mipi csi2 do cru reset when stop
    
    to avoid interruption signal after stop
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I1a4e896c38a9c24b6d3d4ded93aaa5b75800c68d

diff --git a/drivers/media/platform/rockchip/cif/mipi-csi2.c b/drivers/media/platform/rockchip/cif/mipi-csi2.c
index 37bcddfe47ea..bb8140779741 100644
--- a/drivers/media/platform/rockchip/cif/mipi-csi2.c
+++ b/drivers/media/platform/rockchip/cif/mipi-csi2.c
@@ -350,6 +350,7 @@ static void csi2_stop(struct csi2_dev *csi2)
 	v4l2_subdev_call(csi2->src_sd, video, s_stream, 0);
 
 	csi2_disable(csi2);
+	csi2_hw_do_reset(csi2);
 	csi2_disable_clks(csi2);
 }
 

commit 4800a4346c8ab6a899d574967566a20630dadf19
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Thu Sep 23 14:33:57 2021 +0800

    media: rockchip: cif fixed frame sequence bug in HDR mode
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I6d1837bb6dd4ae2cbae397fb3a4cce404e5d3909

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index 36bd2c99c707..51b523f4abfb 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -2163,6 +2163,9 @@ static void rkcif_buf_queue(struct vb2_buffer *vb)
 	spin_lock_irqsave(&stream->vbq_lock, flags);
 	list_add_tail(&cifbuf->queue, &stream->buf_head);
 	spin_unlock_irqrestore(&stream->vbq_lock, flags);
+	v4l2_dbg(1, rkcif_debug, &stream->cifdev->v4l2_dev,
+		 "stream[%d] buf queue, index: %d\n",
+		 stream->id, vb->index);
 }
 
 static int rkcif_create_dummy_buf(struct rkcif_stream *stream)
@@ -4361,6 +4364,9 @@ static void rkcif_vb_done_oneframe(struct rkcif_stream *stream,
 		vb_done->vb2_buf.timestamp = ktime_get_ns();
 
 	vb2_buffer_done(&vb_done->vb2_buf, VB2_BUF_STATE_DONE);
+	v4l2_dbg(1, rkcif_debug, &stream->cifdev->v4l2_dev,
+		 "stream[%d] vb done, index: %d, sequence %d\n", stream->id,
+		 vb_done->vb2_buf.index, vb_done->sequence);
 }
 
 void rkcif_irq_oneframe(struct rkcif_device *cif_dev)
@@ -4886,12 +4892,14 @@ static void rkcif_rdbk_frame_end(struct rkcif_stream *stream)
 					goto RDBK_FRM_UNMATCH;
 				}
 			}
-
-			dev->rdbk_buf[RDBK_M]->vb.sequence = dev->rdbk_buf[RDBK_L]->vb.sequence;
-			dev->rdbk_buf[RDBK_S]->vb.sequence = dev->rdbk_buf[RDBK_L]->vb.sequence;
-			rkcif_vb_done_oneframe(stream, &dev->rdbk_buf[RDBK_L]->vb);
-			rkcif_vb_done_oneframe(stream, &dev->rdbk_buf[RDBK_M]->vb);
-			rkcif_vb_done_oneframe(stream, &dev->rdbk_buf[RDBK_S]->vb);
+			dev->rdbk_buf[RDBK_L]->vb.sequence = dev->rdbk_buf[RDBK_S]->vb.sequence;
+			dev->rdbk_buf[RDBK_M]->vb.sequence = dev->rdbk_buf[RDBK_S]->vb.sequence;
+			rkcif_vb_done_oneframe(&dev->stream[RKCIF_STREAM_MIPI_ID0],
+					       &dev->rdbk_buf[RDBK_L]->vb);
+			rkcif_vb_done_oneframe(&dev->stream[RKCIF_STREAM_MIPI_ID1],
+					       &dev->rdbk_buf[RDBK_M]->vb);
+			rkcif_vb_done_oneframe(&dev->stream[RKCIF_STREAM_MIPI_ID2],
+					       &dev->rdbk_buf[RDBK_S]->vb);
 		} else {
 			if (!dev->rdbk_buf[RDBK_L])
 				v4l2_err(&dev->v4l2_dev, "lost long frames\n");
@@ -4933,11 +4941,11 @@ static void rkcif_rdbk_frame_end(struct rkcif_stream *stream)
 					goto RDBK_FRM_UNMATCH;
 				}
 			}
-
-			dev->rdbk_buf[RDBK_M]->vb.sequence =
-				dev->rdbk_buf[RDBK_L]->vb.sequence;
-			rkcif_vb_done_oneframe(stream, &dev->rdbk_buf[RDBK_L]->vb);
-			rkcif_vb_done_oneframe(stream, &dev->rdbk_buf[RDBK_M]->vb);
+			dev->rdbk_buf[RDBK_L]->vb.sequence = dev->rdbk_buf[RDBK_M]->vb.sequence;
+			rkcif_vb_done_oneframe(&dev->stream[RKCIF_STREAM_MIPI_ID0],
+					       &dev->rdbk_buf[RDBK_L]->vb);
+			rkcif_vb_done_oneframe(&dev->stream[RKCIF_STREAM_MIPI_ID1],
+					       &dev->rdbk_buf[RDBK_M]->vb);
 		} else {
 			if (!dev->rdbk_buf[RDBK_L])
 				v4l2_err(&dev->v4l2_dev, "lost long frames\n");
@@ -5166,6 +5174,11 @@ static void rkcif_update_stream(struct rkcif_device *cif_dev,
 	if (cif_dev->inf_id == RKCIF_MIPI_LVDS)
 		rkcif_deal_readout_time(stream);
 
+	if (cif_dev->chip_id == CHIP_RV1126_CIF ||
+	    cif_dev->chip_id == CHIP_RV1126_CIF_LITE ||
+	    cif_dev->chip_id == CHIP_RK3568_CIF)
+		rkcif_luma_isr(&cif_dev->luma_vdev, mipi_id, stream->frame_idx);
+
 	if (!stream->is_line_wake_up) {
 		ret = rkcif_assign_new_buffer_pingpong(stream,
 					 RKCIF_YUV_ADDR_STATE_UPDATE,
@@ -5177,16 +5190,12 @@ static void rkcif_update_stream(struct rkcif_device *cif_dev,
 		if (ret)
 			return;
 	}
-
-	if (cif_dev->chip_id == CHIP_RV1126_CIF ||
-	    cif_dev->chip_id == CHIP_RV1126_CIF_LITE ||
-	    cif_dev->chip_id == CHIP_RK3568_CIF)
-		rkcif_luma_isr(&cif_dev->luma_vdev, mipi_id, stream->frame_idx);
-	if (!stream->is_line_wake_up) {
+	if (!stream->is_line_wake_up)
 		rkcif_buf_done_prepare(stream, active_buf, mipi_id, 0);
+
 end:
+	if (!stream->is_line_wake_up)
 		stream->frame_idx++;
-	}
 }
 
 u32 rkcif_get_sof(struct rkcif_device *cif_dev)

commit 927d72b9989b099385b85cc26f283e547bbb3a69
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Thu Sep 23 12:49:15 2021 +0800

    media: i2c: sc500ai fixed vflip err
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I184fd7e06514cae76d02a1990086e98fcf3e9a33

diff --git a/drivers/media/i2c/sc500ai.c b/drivers/media/i2c/sc500ai.c
index 51538f006d7c..63bc3719a4e4 100644
--- a/drivers/media/i2c/sc500ai.c
+++ b/drivers/media/i2c/sc500ai.c
@@ -182,6 +182,7 @@ struct sc500ai {
 	const char		*len_name;
 	bool			has_init_exp;
 	struct preisp_hdrae_exp_s init_hdrae_exp;
+	u32			cur_vts;
 };
 
 #define to_sc500ai(sd) container_of(sd, struct sc500ai, subdev)
@@ -301,7 +302,6 @@ static const struct regval sc500ai_linear_10_2880x1620_regs[] = {
 	{0x59ff, 0x02},
 	{0x36e9, 0x20},
 	{0x36f9, 0x53},
-	{0x0100, 0x01},
 	{REG_NULL, 0x00},
 };
 
@@ -407,7 +407,6 @@ static const struct regval sc500ai_hdr_10_2880x1620_regs[] = {
 	{0x4853, 0xfd},
 	{0x36e9, 0x53},
 	{0x36f9, 0x53},
-	{0x0100, 0x01},
 	{REG_NULL, 0x00},
 };
 
@@ -1376,6 +1375,11 @@ static int sc500ai_set_ctrl(struct v4l2_ctrl *ctrl)
 	u32 again = 0, again_fine = 0, dgain = 0, dgain_fine = 0;
 	int ret = 0;
 	u32 val = 0, vts = 0;
+	u64 delay_time = 0;
+	u32 cur_fps = 0;
+	u32 def_fps = 0;
+	u32 denominator = 0;
+	u32 numerator = 0;
 
 	/* Propagate change of current control to all related controls */
 	switch (ctrl->id) {
@@ -1383,9 +1387,9 @@ static int sc500ai_set_ctrl(struct v4l2_ctrl *ctrl)
 		/* Update max exposure while meeting expected vblanking */
 		max = sc500ai->cur_mode->height + ctrl->val - 5;
 		__v4l2_ctrl_modify_range(sc500ai->exposure,
-		                         sc500ai->exposure->minimum, max,
-		                         sc500ai->exposure->step,
-		                         sc500ai->exposure->default_value);
+					 sc500ai->exposure->minimum, max,
+					 sc500ai->exposure->step,
+					 sc500ai->exposure->default_value);
 		break;
 	}
 
@@ -1398,17 +1402,17 @@ static int sc500ai_set_ctrl(struct v4l2_ctrl *ctrl)
 			return ret;
 		val = ctrl->val << 1;
 		ret = sc500ai_write_reg(sc500ai->client,
-		                        SC500AI_REG_EXPOSURE_H,
-		                        SC500AI_REG_VALUE_08BIT,
-		                        SC500AI_FETCH_EXP_H(val));
+					SC500AI_REG_EXPOSURE_H,
+					SC500AI_REG_VALUE_08BIT,
+					SC500AI_FETCH_EXP_H(val));
 		ret |= sc500ai_write_reg(sc500ai->client,
-		                         SC500AI_REG_EXPOSURE_M,
-		                         SC500AI_REG_VALUE_08BIT,
-		                         SC500AI_FETCH_EXP_M(val));
+					SC500AI_REG_EXPOSURE_M,
+					SC500AI_REG_VALUE_08BIT,
+					SC500AI_FETCH_EXP_M(val));
 		ret |= sc500ai_write_reg(sc500ai->client,
-		                         SC500AI_REG_EXPOSURE_L,
-		                         SC500AI_REG_VALUE_08BIT,
-		                         SC500AI_FETCH_EXP_L(val));
+					 SC500AI_REG_EXPOSURE_L,
+					 SC500AI_REG_VALUE_08BIT,
+					 SC500AI_FETCH_EXP_L(val));
 
 		dev_dbg(&client->dev, "set exposure 0x%x\n", val);
 		break;
@@ -1418,26 +1422,26 @@ static int sc500ai_set_ctrl(struct v4l2_ctrl *ctrl)
 
 		sc500ai_get_gain_reg(ctrl->val, &again, &again_fine, &dgain, &dgain_fine);
 		ret = sc500ai_write_reg(sc500ai->client,
-		                        SC500AI_REG_DIG_GAIN,
-		                        SC500AI_REG_VALUE_08BIT,
-		                        dgain);
+					SC500AI_REG_DIG_GAIN,
+					SC500AI_REG_VALUE_08BIT,
+					dgain);
 		ret |= sc500ai_write_reg(sc500ai->client,
-		                         SC500AI_REG_DIG_FINE_GAIN,
-		                         SC500AI_REG_VALUE_08BIT,
-		                         dgain_fine);
+					 SC500AI_REG_DIG_FINE_GAIN,
+					 SC500AI_REG_VALUE_08BIT,
+					 dgain_fine);
 		ret |= sc500ai_write_reg(sc500ai->client,
-		                         SC500AI_REG_ANA_GAIN,
-		                         SC500AI_REG_VALUE_08BIT,
-		                         again);
+					 SC500AI_REG_ANA_GAIN,
+					 SC500AI_REG_VALUE_08BIT,
+					 again);
 		ret |= sc500ai_write_reg(sc500ai->client,
-		                         SC500AI_REG_ANA_FINE_GAIN,
-		                         SC500AI_REG_VALUE_08BIT,
-		                         again_fine);
+					 SC500AI_REG_ANA_FINE_GAIN,
+					 SC500AI_REG_VALUE_08BIT,
+					 again_fine);
 		sc500ai_set_hightemp_dpc(sc500ai, ctrl->val);
 
 		dev_dbg(&sc500ai->client->dev,
-		        "total_gain:%d again 0x%x, again_fine 0x%x, dgain 0x%x, dgain_fine 0x%x\n",
-		        ctrl->val, again, again_fine, dgain, dgain_fine);
+			"total_gain:%d again 0x%x, again_fine 0x%x, dgain 0x%x, dgain_fine 0x%x\n",
+			ctrl->val, again, again_fine, dgain, dgain_fine);
 		break;
 	case V4L2_CID_VBLANK:
 		vts = ctrl->val + sc500ai->cur_mode->height;
@@ -1449,39 +1453,70 @@ static int sc500ai_set_ctrl(struct v4l2_ctrl *ctrl)
 					 SC500AI_REG_VTS_L,
 					 SC500AI_REG_VALUE_08BIT,
 					 vts & 0xff);
+		sc500ai->cur_vts = vts;
 		break;
 	case V4L2_CID_HFLIP:
 		ret = sc500ai_read_reg(sc500ai->client, SC500AI_FLIP_MIRROR_REG,
-		                       SC500AI_REG_VALUE_08BIT, &val);
+				       SC500AI_REG_VALUE_08BIT, &val);
 		if (ret)
 			break;
-
 		if (ctrl->val)
 			val |= SC500AI_MIRROR_MASK;
 		else
 			val &= ~SC500AI_MIRROR_MASK;
 		ret |= sc500ai_write_reg(sc500ai->client, SC500AI_FLIP_MIRROR_REG,
-		                         SC500AI_REG_VALUE_08BIT, val);
+					 SC500AI_REG_VALUE_08BIT, val);
 		break;
 	case V4L2_CID_VFLIP:
 		ret = sc500ai_read_reg(sc500ai->client,
-		                       SC500AI_FLIP_MIRROR_REG,
-		                       SC500AI_REG_VALUE_08BIT, &val);
+				       SC500AI_FLIP_MIRROR_REG,
+				       SC500AI_REG_VALUE_08BIT, &val);
 		if (ret)
 			break;
+		denominator = sc500ai->cur_mode->max_fps.denominator;
+		numerator = sc500ai->cur_mode->max_fps.numerator;
+		def_fps = denominator / numerator;
+		cur_fps = def_fps * sc500ai->cur_mode->vts_def / sc500ai->cur_vts;
+		if (cur_fps > 25) {
+			vts = def_fps * sc500ai->cur_mode->vts_def / 25;
+			ret = sc500ai_write_reg(sc500ai->client,
+						SC500AI_REG_VTS_H,
+						SC500AI_REG_VALUE_08BIT,
+						(vts >> 8) & 0x7f);
+			ret |= sc500ai_write_reg(sc500ai->client,
+						SC500AI_REG_VTS_L,
+						SC500AI_REG_VALUE_08BIT,
+						vts & 0xff);
+			delay_time = 1000000 / 25;//one frame interval
+			delay_time *= 2;
+			usleep_range(delay_time, delay_time + 1000);
+		}
 
 		if (ctrl->val)
 			val |= SC500AI_FLIP_MASK;
 		else
 			val &= ~SC500AI_FLIP_MASK;
+
 		ret |= sc500ai_write_reg(sc500ai->client,
-		                         SC500AI_FLIP_MIRROR_REG,
-		                         SC500AI_REG_VALUE_08BIT,
-		                         val);
+					 SC500AI_FLIP_MIRROR_REG,
+					 SC500AI_REG_VALUE_08BIT,
+					 val);
+		if (cur_fps > 25) {
+			usleep_range(delay_time, delay_time + 1000);
+			vts = sc500ai->cur_vts;
+			ret = sc500ai_write_reg(sc500ai->client,
+						SC500AI_REG_VTS_H,
+						SC500AI_REG_VALUE_08BIT,
+						(vts >> 8) & 0x7f);
+			ret |= sc500ai_write_reg(sc500ai->client,
+						SC500AI_REG_VTS_L,
+						SC500AI_REG_VALUE_08BIT,
+						vts & 0xff);
+		}
 		break;
 	default:
 		dev_warn(&client->dev, "%s Unhandled id:0x%x, val:0x%x\n",
-		         __func__, ctrl->id, ctrl->val);
+			 __func__, ctrl->id, ctrl->val);
 		break;
 	}
 
@@ -1529,6 +1564,7 @@ static int sc500ai_initialize_controls(struct sc500ai *sc500ai)
 		sc500ai->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
 
 	vblank_def = mode->vts_def - mode->height;
+	sc500ai->cur_vts = mode->vts_def;
 	sc500ai->vblank = v4l2_ctrl_new_std(handler, &sc500ai_ctrl_ops,
 	                                    V4L2_CID_VBLANK, vblank_def,
 	                                    SC500AI_VTS_MAX - mode->height,

commit ddf077f140f12e6f0c7de3bd45cc4b1ea4ce4875
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Thu Oct 7 15:45:28 2021 +0200

    ANDROID: Fix up KABI breakage in 4.19.209 in struct sock
    
    Commit 35306eb23814 ("af_unix: fix races in sk_peer_pid and sk_peer_cred
    accesses") was backported to 4.19.209 and it adds a new field to struct
    sock.  We want to keep this commit, so rework it using the reserved
    fields we have set up for this very issue.
    
    However, putting a spinlock_t into a 64bit value breaks when building
    with some debugging options enabled, so we have to disable them when
    doing build testing for the allmodconfig builds.  In order to do that,
    the following config options are forced off:
            DEBUG_SPINLOCK
            DEBUG_LOCK_ALLOC
            LOCK_STAT
            DEBUG_WW_MUTEX_SLOWPATH
            DEBUG_LOCK_ALLOC
            PROVE_LOCKING
    
    We only really want to disable DEBUG_SPINLOCK and DEBUG_LOCK_ALLOC as
    those affect the size of spinlock_t, but the other options need to be
    disabled as well because they try to force on the locking debug config
    options when selected.
    
    Note, this does not affect any device's behavior, those options are only
    being disabled for the test systems when doing allmodconfig builds.
    They are not enabled in the normal GKI builds, so all is fine there.
    
    Bug: 161946584
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I23df70a6bcbbc9d773e790cdf0377c1c67cdf682

diff --git a/build.config.allmodconfig b/build.config.allmodconfig
index 103d1cdf4edc..dd01f6a34425 100644
--- a/build.config.allmodconfig
+++ b/build.config.allmodconfig
@@ -7,6 +7,12 @@ function update_config() {
          -d CPU_BIG_ENDIAN \
          -d STM \
          -d TEST_MEMCAT_P \
+         -d DEBUG_SPINLOCK \
+         -d DEBUG_LOCK_ALLOC \
+         -d LOCK_STAT \
+         -d DEBUG_WW_MUTEX_SLOWPATH \
+         -d DEBUG_LOCK_ALLOC \
+         -d PROVE_LOCKING \
          -e UNWINDER_FRAME_POINTER \
 
     (cd ${OUT_DIR} && \
diff --git a/include/net/sock.h b/include/net/sock.h
index d6c281dc66ca..7d619a898ccb 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -472,7 +472,6 @@ struct sock {
 	u32			sk_ack_backlog;
 	u32			sk_max_ack_backlog;
 	kuid_t			sk_uid;
-	spinlock_t		sk_peer_lock;
 	struct pid		*sk_peer_pid;
 	const struct cred	*sk_peer_cred;
 
@@ -513,7 +512,7 @@ struct sock {
 	struct sock_reuseport __rcu	*sk_reuseport_cb;
 	struct rcu_head		sk_rcu;
 
-	ANDROID_KABI_RESERVE(1);
+	ANDROID_KABI_USE(1, spinlock_t sk_peer_lock);
 	ANDROID_KABI_RESERVE(2);
 	ANDROID_KABI_RESERVE(3);
 	ANDROID_KABI_RESERVE(4);

commit 664620f99a24f2fb88d5543d7329a5d4512c839b
Merge: e7e55f603f15 6db10b4d5efd
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Wed Oct 6 15:44:20 2021 +0200

    Merge 4.19.209 into android-4.19-stable
    
    Changes in 4.19.209
            ocfs2: drop acl cache for directories too
            usb: gadget: r8a66597: fix a loop in set_feature()
            usb: dwc2: gadget: Fix ISOC transfer complete handling for DDMA
            usb: musb: tusb6010: uninitialized data in tusb_fifo_write_unaligned()
            cifs: fix incorrect check for null pointer in header_assemble
            xen/x86: fix PV trap handling on secondary processors
            usb-storage: Add quirk for ScanLogic SL11R-IDE older than 2.6c
            USB: serial: cp210x: add ID for GW Instek GDM-834x Digital Multimeter
            USB: cdc-acm: fix minor-number release
            staging: greybus: uart: fix tty use after free
            Re-enable UAS for LaCie Rugged USB3-FW with fk quirk
            USB: serial: mos7840: remove duplicated 0xac24 device ID
            USB: serial: option: add Telit LN920 compositions
            USB: serial: option: remove duplicate USB device ID
            USB: serial: option: add device id for Foxconn T99W265
            mcb: fix error handling in mcb_alloc_bus()
            serial: mvebu-uart: fix driver's tx_empty callback
            net: hso: fix muxed tty registration
            bnxt_en: Fix TX timeout when TX ring size is set to the smallest
            net/smc: add missing error check in smc_clc_prfx_set()
            gpio: uniphier: Fix void functions to remove return value
            net/mlx4_en: Don't allow aRFS for encapsulated packets
            scsi: iscsi: Adjust iface sysfs attr detection
            tty: synclink_gt, drop unneeded forward declarations
            tty: synclink_gt: rename a conflicting function name
            fpga: machxo2-spi: Return an error on failure
            fpga: machxo2-spi: Fix missing error code in machxo2_write_complete()
            thermal/core: Potential buffer overflow in thermal_build_list_of_policies()
            irqchip/goldfish-pic: Select GENERIC_IRQ_CHIP to fix build
            irqchip/gic-v3-its: Fix potential VPE leak on error
            md: fix a lock order reversal in md_alloc
            blktrace: Fix uaf in blk_trace access after removing by sysfs
            net: macb: fix use after free on rmmod
            net: stmmac: allow CSR clock of 300MHz
            m68k: Double cast io functions to unsigned long
            xen/balloon: use a kernel thread instead a workqueue
            nvme-multipath: fix ANA state updates when a namespace is not present
            compiler.h: Introduce absolute_pointer macro
            net: i825xx: Use absolute_pointer for memcpy from fixed memory location
            sparc: avoid stringop-overread errors
            qnx4: avoid stringop-overread errors
            parisc: Use absolute_pointer() to define PAGE0
            arm64: Mark __stack_chk_guard as __ro_after_init
            alpha: Declare virt_to_phys and virt_to_bus parameter as pointer to volatile
            net: 6pack: Fix tx timeout and slot time
            spi: Fix tegra20 build with CONFIG_PM=n
            erofs: fix up erofs_lookup tracepoint
            arm64: dts: marvell: armada-37xx: Extend PCIe MEM space
            PCI: aardvark: Fix checking for PIO status
            tcp: address problems caused by EDT misshaps
            tcp: always set retrans_stamp on recovery
            tcp: create a helper to model exponential backoff
            tcp: adjust rto_base in retransmits_timed_out()
            xen/balloon: fix balloon kthread freezing
            qnx4: work around gcc false positive warning bug
            tty: Fix out-of-bound vmalloc access in imageblit
            cpufreq: schedutil: Use kobject release() method to free sugov_tunables
            cpufreq: schedutil: Destroy mutex before kobject_put() frees the memory
            mac80211: fix use-after-free in CCMP/GCMP RX
            x86/kvmclock: Move this_cpu_pvti into kvmclock.h
            drm/amd/display: Pass PCI deviceid into DC
            ipvs: check that ip_vs_conn_tab_bits is between 8 and 20
            hwmon: (mlxreg-fan) Return non-zero value when fan current state is enforced from sysfs
            mac80211: Fix ieee80211_amsdu_aggregate frag_tail bug
            mac80211: limit injected vht mcs/nss in ieee80211_parse_tx_radiotap
            sctp: break out if skb_header_pointer returns NULL in sctp_rcv_ootb
            hwmon: (tmp421) Replace S_<PERMS> with octal values
            hwmon: (tmp421) report /PVLD condition as fault
            hwmon: (tmp421) fix rounding for negative values
            e100: fix length calculation in e100_get_regs_len
            e100: fix buffer overrun in e100_get_regs
            Revert "block, bfq: honor already-setup queue merges"
            scsi: csiostor: Add module softdep on cxgb4
            af_unix: fix races in sk_peer_pid and sk_peer_cred accesses
            elf: don't use MAP_FIXED_NOREPLACE for elf interpreter mappings
            ipack: ipoctal: fix stack information leak
            ipack: ipoctal: fix tty registration race
            ipack: ipoctal: fix tty-registration error handling
            ipack: ipoctal: fix missing allocation-failure check
            ipack: ipoctal: fix module reference leak
            ext4: fix potential infinite loop in ext4_dx_readdir()
            net: udp: annotate data race around udp_sk(sk)->corkflag
            EDAC/synopsys: Fix wrong value type assignment for edac_mode
            ARM: 9077/1: PLT: Move struct plt_entries definition to header
            ARM: 9078/1: Add warn suppress parameter to arm_gen_branch_link()
            ARM: 9079/1: ftrace: Add MODULE_PLTS support
            ARM: 9098/1: ftrace: MODULE_PLT: Fix build problem without DYNAMIC_FTRACE
            hso: fix bailout in error case of probe
            usb: hso: fix error handling code of hso_create_net_device
            usb: hso: remove the bailout parameter
            crypto: ccp - fix resource leaks in ccp_run_aes_gcm_cmd()
            HID: betop: fix slab-out-of-bounds Write in betop_probe
            netfilter: ipset: Fix oversized kvmalloc() calls
            HID: usbhid: free raw_report buffers in usbhid_stop
            cred: allow get_cred() and put_cred() to be given NULL.
            Linux 4.19.209
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I0372088284cf5d3ac51275d2ba5fad5b0ce6f5c6

commit ac58e64e38cd73be90fa5dd0a1c6d536bf136d4c
Author: Jianwei Fan <jianwei.fan@rock-chips.com>
Date:   Fri Sep 24 06:33:19 2021 +0000

    arm64: dts: rockchip: rk3568-evb6: add lt8619c dvp-mode and dual-edge
    configuration
    
    Signed-off-by: Jianwei Fan <jianwei.fan@rock-chips.com>
    Change-Id: I12ae50c528e0399e1e31b1a4488b35a07016145e

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi
index 70483136c897..445211153d76 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi
@@ -141,6 +141,8 @@
 		reset-gpios = <&gpio4 RK_PD2 GPIO_ACTIVE_LOW>;
 		plugin-det-gpios = <&gpio0 RK_PD6 GPIO_ACTIVE_LOW>;
 		hpd-output-inverted;
+		rockchip,dvp-mode = <3>; /* 3:BT1120, 4:BT656, 5:BT1120_8bit */
+		rockchip,dual-edge = <1>; /* 0:single edge, 1:dual edge */
 		rockchip,camera-module-index = <0>;
 		rockchip,camera-module-facing = "back";
 		rockchip,camera-module-name = "LT8619C";

commit 7d717e6c83e4cdbac271606f08318de4dcc42219
Author: Jianwei Fan <jianwei.fan@rock-chips.com>
Date:   Fri Sep 24 02:07:15 2021 +0000

    media: i2c: lt8619c: update the driver to v0.01.02
    
    1. add BT656 mode support.
    2. add ddr mode support.
    3. fix 576i and 480i support mode.
    4. add 4K30 mode.
    
    Signed-off-by: Jianwei Fan <jianwei.fan@rock-chips.com>
    Change-Id: Ifc59493ab7e838c59b00963c6c4d31749b068047

diff --git a/drivers/media/i2c/lt8619c.c b/drivers/media/i2c/lt8619c.c
index f092c054210f..ab4c9265ace1 100644
--- a/drivers/media/i2c/lt8619c.c
+++ b/drivers/media/i2c/lt8619c.c
@@ -3,6 +3,13 @@
  * Copyright (c) 2021 Rockchip Electronics Co. Ltd.
  *
  * Author: Dingxian Wen <shawn.wen@rock-chips.com>
+ *
+ * V0.0X01.0X00 first version.
+ * V0.0X01.0X01
+ * 1. add BT656 mode support.
+ * 2. add ddr mode support.
+ * 3. fix 576i and 480i support mode.
+ * V0.0X01.0X02 add 4K30 mode.
  */
 
 #include <linux/kernel.h>
@@ -29,13 +36,18 @@
 #include <linux/regmap.h>
 #include "lt8619c.h"
 
-#define DRIVER_VERSION		KERNEL_VERSION(0, 0x1, 0x0)
+#define DRIVER_VERSION		KERNEL_VERSION(0, 0x1, 0x2)
 #define LT8619C_NAME		"LT8619C"
 
 static int debug;
 module_param(debug, int, 0644);
 MODULE_PARM_DESC(debug, "debug level (0-2)");
 
+#define RK_CAMERA_MODULE_DUAL_EDGE		"rockchip,dual-edge"
+#define LT8619C_DEFAULT_DUAL_EDGE		1U
+#define RK_CAMERA_MODULE_DVP_MODE		"rockchip,dvp-mode"
+#define LT8619C_DEFAULT_DVP_MODE		BT1120_OUTPUT
+
 struct lt8619c_mode {
 	u32 width;
 	u32 height;
@@ -67,7 +79,7 @@ struct lt8619c {
 	const char *len_name;
 	bool nosignal;
 	bool enable_hdcp;
-	bool clk_ddrmode_en;
+	u32 clk_ddrmode_en;
 	bool BT656_double_clk_en;
 	bool hpd_output_inverted;
 	int plugin_irq;
@@ -111,22 +123,22 @@ static u8 edid_init_data[] = {
 	0x00, 0x14, 0x78, 0x01, 0xFF, 0x1D, 0x00, 0x0A,
 	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x64,
 
-	0x02, 0x03, 0x1D, 0x71, 0x4A, 0x90, 0x1F, 0x22,
-	0x04, 0x02, 0x01, 0x11, 0x05, 0x07, 0x16, 0x23,
-	0x09, 0x07, 0x01, 0x83, 0x01, 0x00, 0x00, 0x65,
-	0x03, 0x0C, 0x00, 0x10, 0x00, 0x8C, 0x0A, 0xD0,
-	0x8A, 0x20, 0xE0, 0x2D, 0x10, 0x10, 0x3E, 0x96,
-	0x00, 0x13, 0x8E, 0x21, 0x00, 0x00, 0x1E, 0xD8,
-	0x09, 0x80, 0xA0, 0x20, 0xE0, 0x2D, 0x10, 0x10,
-	0x60, 0xA2, 0x00, 0xC4, 0x8E, 0x21, 0x00, 0x00,
-	0x18, 0x8C, 0x0A, 0xD0, 0x90, 0x20, 0x40, 0x31,
-	0x20, 0x0C, 0x40, 0x55, 0x00, 0x48, 0x39, 0x00,
-	0x00, 0x00, 0x18, 0x01, 0x1D, 0x80, 0x18, 0x71,
-	0x38, 0x2D, 0x40, 0x58, 0x2C, 0x45, 0x00, 0xC0,
-	0x6C, 0x00, 0x00, 0x00, 0x18, 0x01, 0x1D, 0x80,
-	0x18, 0x71, 0x1C, 0x16, 0x20, 0x58, 0x2C, 0x25,
-	0x00, 0xC0, 0x6C, 0x00, 0x00, 0x00, 0x18, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0,
+	0x02, 0x03, 0x1C, 0x71, 0x49, 0x90, 0x04, 0x02,
+	0x5F, 0x11, 0x07, 0x05, 0x16, 0x22, 0x23, 0x09,
+	0x07, 0x01, 0x83, 0x01, 0x00, 0x00, 0x65, 0x03,
+	0x0C, 0x00, 0x10, 0x00, 0x8C, 0x0A, 0xD0, 0x8A,
+	0x20, 0xE0, 0x2D, 0x10, 0x10, 0x3E, 0x96, 0x00,
+	0x13, 0x8E, 0x21, 0x00, 0x00, 0x1E, 0xD8, 0x09,
+	0x80, 0xA0, 0x20, 0xE0, 0x2D, 0x10, 0x10, 0x60,
+	0xA2, 0x00, 0xC4, 0x8E, 0x21, 0x00, 0x00, 0x18,
+	0x8C, 0x0A, 0xD0, 0x90, 0x20, 0x40, 0x31, 0x20,
+	0x0C, 0x40, 0x55, 0x00, 0x48, 0x39, 0x00, 0x00,
+	0x00, 0x18, 0x01, 0x1D, 0x80, 0x18, 0x71, 0x38,
+	0x2D, 0x40, 0x58, 0x2C, 0x45, 0x00, 0xC0, 0x6C,
+	0x00, 0x00, 0x00, 0x18, 0x01, 0x1D, 0x80, 0x18,
+	0x71, 0x1C, 0x16, 0x20, 0x58, 0x2C, 0x25, 0x00,
+	0xC0, 0x6C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB3,
 };
 
 static u8 phase_num[10] = {
@@ -136,6 +148,15 @@ static u8 phase_num[10] = {
 
 static const struct lt8619c_mode supported_modes[] = {
 	{
+		.width = 3840,
+		.height = 2160,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.hts_def = 4400,
+		.vts_def = 2250,
+	}, {
 		.width = 1920,
 		.height = 1080,
 		.max_fps = {
@@ -191,22 +212,22 @@ static const struct lt8619c_mode supported_modes[] = {
 		.vts_def = 525,
 	}, {
 		.width = 1440,
-		.height = 240,
+		.height = 480,
 		.max_fps = {
 			.numerator = 10000,
 			.denominator = 600000,
 		},
 		.hts_def = 1716,
-		.vts_def = 262,
+		.vts_def = 525,
 	}, {
 		.width = 1440,
-		.height = 288,
+		.height = 576,
 		.max_fps = {
 			.numerator = 10000,
 			.denominator = 500000,
 		},
-		.hts_def = 1716,
-		.vts_def = 312,
+		.hts_def = 1728,
+		.vts_def = 625,
 	},
 };
 
@@ -328,13 +349,12 @@ static int lt8619c_get_detected_timings(struct v4l2_subdev *sd,
 	bt->vsync = vs;
 	bt->vbackporch = vbp;
 	pix_clk = hdmi_clk_cnt * 1000;
+	bt->pixelclock = pix_clk;
 
 	fps = 0;
 	if (htotal * vtotal)
 		fps = (pix_clk + (htotal * vtotal) / 2) / (htotal * vtotal);
 
-	bt->pixelclock = htotal * vtotal * fps;
-
 	/* for interlaced res 1080i 576i 480i */
 	if (lt8619c_is_supported_interlaced_res(sd, hact, vact)) {
 		bt->interlaced = V4L2_DV_INTERLACED;
@@ -494,7 +514,7 @@ static void lt8619c_mode_config(struct v4l2_subdev *sd)
 	regmap_update_bits(lt8619c->reg_map, 0x60, OUTPUT_MODE_MASK,
 			lt8619c->yuv_output_mode);
 
-	if (lt8619c->clk_ddrmode_en)
+	if (lt8619c->clk_ddrmode_en == 1)
 		regmap_write(lt8619c->reg_map, 0xa4, 0x14);
 	else
 		regmap_write(lt8619c->reg_map, 0xa4, 0x10);
@@ -907,17 +927,17 @@ static void lt8619c_initial_setup(struct v4l2_subdev *sd)
 	def_edid.blocks = 2;
 	def_edid.edid = edid_init_data;
 	lt8619c->enable_hdcp = false;
-	lt8619c->yuv_output_mode = YUV_OUTPUT_MODE;
-	lt8619c->clk_ddrmode_en = false;
 	lt8619c->cp_convert_mode = CP_CONVERT_MODE;
-	lt8619c->yc_swap = YC_SWAP;
 	lt8619c->yuv_colordepth = YUV_COLORDEPTH;
 	lt8619c->bt_tx_sync_pol = BT_TX_SYNC_POL;
 
-	if (lt8619c->yuv_output_mode == BT656_OUTPUT)
+	if (lt8619c->yuv_output_mode == BT656_OUTPUT) {
+		lt8619c->yc_swap = YC_SWAP_DIS;
 		lt8619c->BT656_double_clk_en = true;
-	else
+	} else {
+		lt8619c->yc_swap = YC_SWAP_EN;
 		lt8619c->BT656_double_clk_en = false;
+	}
 
 	lt8619c_set_hpd(sd, 0);
 	lt8619c_write_edid(sd, &def_edid);
@@ -997,9 +1017,7 @@ static bool lt8619c_rcv_supported_res(struct v4l2_subdev *sd,
 
 	for (i = 0; i < ARRAY_SIZE(supported_modes); i++) {
 		if ((supported_modes[i].width == hact) &&
-		    (supported_modes[i].height == vact) &&
-		    (supported_modes[i].hts_def == htotal) &&
-		    (supported_modes[i].vts_def == vtotal)) {
+		    (supported_modes[i].height == vact)) {
 			break;
 		}
 	}
@@ -1126,10 +1144,17 @@ static int lt8619c_dv_timings_cap(struct v4l2_subdev *sd,
 static int lt8619c_g_mbus_config(struct v4l2_subdev *sd,
 			     struct v4l2_mbus_config *cfg)
 {
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+
 	cfg->type = V4L2_MBUS_BT656;
-	cfg->flags = V4L2_MBUS_HSYNC_ACTIVE_HIGH |
-		     V4L2_MBUS_VSYNC_ACTIVE_HIGH |
-		     V4L2_MBUS_PCLK_SAMPLE_RISING;
+	if (lt8619c->clk_ddrmode_en) {
+		cfg->flags = RKMODULE_CAMERA_BT656_CHANNELS |
+			V4L2_MBUS_PCLK_SAMPLE_RISING |
+			V4L2_MBUS_PCLK_SAMPLE_FALLING;
+	} else {
+		cfg->flags = RKMODULE_CAMERA_BT656_CHANNELS |
+			V4L2_MBUS_PCLK_SAMPLE_RISING;
+	}
 
 	return 0;
 }
@@ -1379,7 +1404,13 @@ static int lt8619c_g_frame_interval(struct v4l2_subdev *sd,
 
 static int lt8619c_querystd(struct v4l2_subdev *sd, v4l2_std_id *std)
 {
-	*std = V4L2_STD_ATSC;
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+
+	if (lt8619c->yuv_output_mode == BT656_OUTPUT)
+		*std = V4L2_STD_PAL;
+	else
+		*std = V4L2_STD_ATSC;
+
 	return 0;
 }
 
@@ -1582,6 +1613,27 @@ static int lt8619c_parse_of(struct lt8619c *lt8619c)
 		goto disable_clk;
 	}
 
+	if (of_property_read_u32(node, RK_CAMERA_MODULE_DUAL_EDGE,
+					&lt8619c->clk_ddrmode_en)) {
+		lt8619c->clk_ddrmode_en = LT8619C_DEFAULT_DUAL_EDGE;
+		dev_warn(dev, "can not get module %s from dts, use default(%d)!\n",
+			RK_CAMERA_MODULE_DUAL_EDGE, LT8619C_DEFAULT_DUAL_EDGE);
+	} else {
+		dev_info(dev, "get module %s from dts, dual_edge(%d)!\n",
+			RK_CAMERA_MODULE_DUAL_EDGE, lt8619c->clk_ddrmode_en);
+	}
+
+	if (of_property_read_u32(node, RK_CAMERA_MODULE_DVP_MODE,
+					&lt8619c->yuv_output_mode)) {
+		lt8619c->yuv_output_mode = LT8619C_DEFAULT_DVP_MODE;
+		dev_warn(dev, "can not get module %s from dts, use default(BT1120)!\n",
+					RK_CAMERA_MODULE_DVP_MODE);
+	} else {
+		dev_info(dev, "get module %s from dts, dvp mode(%s)!\n",
+			RK_CAMERA_MODULE_DVP_MODE,
+			(lt8619c->yuv_output_mode == BT656_OUTPUT) ? "BT656" : "BT1120");
+	}
+
 	return 0;
 
 disable_clk:
diff --git a/drivers/media/i2c/lt8619c.h b/drivers/media/i2c/lt8619c.h
index 4c5f2ae47691..0fda4f7de607 100644
--- a/drivers/media/i2c/lt8619c.h
+++ b/drivers/media/i2c/lt8619c.h
@@ -9,11 +9,9 @@
 #define _LT8619C_H
 
 /* --------------- configuration -------------------- */
-#define YUV_OUTPUT_MODE		BT1120_OUTPUT
 #define CLK_SRC			XTAL_CLK
 #define REF_RESISTANCE		EXT_RESISTANCE
 #define CP_CONVERT_MODE		HDPC
-#define YC_SWAP			YC_SWAP_EN
 #define YUV_COLORDEPTH		OUTPUT_16BIT_LOW
 #define BT_TX_SYNC_POL		BT_TX_SYNC_POSITIVE
 

commit e7e55f603f155366062ae24ec26439863a15f1f5
Author: Akilesh Kailash <akailash@google.com>
Date:   Mon Sep 13 09:26:42 2021 +0000

    FROMLIST: dm-verity: skip verity_handle_error on I/O errors
    
    If there is an I/O error and FEC correction fails, return
    an error instead of calling verity_handle_error().
    
    Suggested-by: Sami Tolvanen <samitolvanen@google.com>
    Signed-off-by: Akilesh Kailash <akailash@google.com>
    
    Bug: 197830746
    Change-Id: Idd5f65bb72c78a1cca44e5593e40880b2408b564
    Link: https://lore.kernel.org/all/20210913092642.3237796-1-akailash@google.com/
    Signed-off-by: Elliot Berman <quic_eberman@quicinc.com>
    (cherry picked from commit fca745e32dfec052ecc04431f0ca58d49cce8e94)

diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c
index 20638d1f52db..0dbff745647e 100644
--- a/drivers/md/dm-verity-target.c
+++ b/drivers/md/dm-verity-target.c
@@ -475,6 +475,7 @@ static int verity_verify_io(struct dm_verity_io *io)
 	struct bvec_iter start;
 	unsigned b;
 	struct crypto_wait wait;
+	struct bio *bio = dm_bio_from_per_bio_data(io, v->ti->per_io_data_size);
 
 	for (b = 0; b < io->n_blocks; b++) {
 		int r;
@@ -529,9 +530,17 @@ static int verity_verify_io(struct dm_verity_io *io)
 		else if (verity_fec_decode(v, io, DM_VERITY_BLOCK_TYPE_DATA,
 					   cur_block, NULL, &start) == 0)
 			continue;
-		else if (verity_handle_err(v, DM_VERITY_BLOCK_TYPE_DATA,
+		else {
+			if (bio->bi_status) {
+				/*
+				 * Error correction failed; Just return error
+				 */
+				return -EIO;
+			}
+			if (verity_handle_err(v, DM_VERITY_BLOCK_TYPE_DATA,
 					   cur_block))
-			return -EIO;
+				return -EIO;
+		}
 	}
 
 	return 0;

commit 6db10b4d5efdc38ff06dfdde28dc5477f754b0bd
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Wed Oct 6 15:31:28 2021 +0200

    Linux 4.19.209
    
    Link: https://lore.kernel.org/r/20211004125033.572932188@linuxfoundation.org
    Link: https://lore.kernel.org/r/20211005083300.523409586@linuxfoundation.org
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index a4c252640983..a144a7117a1b 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 208
+SUBLEVEL = 209
 EXTRAVERSION =
 NAME = "People's Front"
 

commit 7581fdf6c01991f03b1b51d524f1b7b64c920ce3
Author: NeilBrown <neilb@suse.com>
Date:   Mon Dec 3 11:30:30 2018 +1100

    cred: allow get_cred() and put_cred() to be given NULL.
    
    commit f06bc03339ad4c1baa964a5f0606247ac1c3c50b upstream.
    
    It is common practice for helpers like this to silently,
    accept a NULL pointer.
    get_rpccred() and put_rpccred() used by NFS act this way
    and using the same interface will ease the conversion
    for NFS, and simplify the resulting code.
    
    Signed-off-by: NeilBrown <neilb@suse.com>
    Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
    Cc: Eric Dumazet <edumazet@google.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/cred.h b/include/linux/cred.h
index 1dc351d8548b..4b081e4911c8 100644
--- a/include/linux/cred.h
+++ b/include/linux/cred.h
@@ -240,7 +240,7 @@ static inline struct cred *get_new_cred(struct cred *cred)
  * @cred: The credentials to reference
  *
  * Get a reference on the specified set of credentials.  The caller must
- * release the reference.
+ * release the reference.  If %NULL is passed, it is returned with no action.
  *
  * This is used to deal with a committed set of credentials.  Although the
  * pointer is const, this will temporarily discard the const and increment the
@@ -251,6 +251,8 @@ static inline struct cred *get_new_cred(struct cred *cred)
 static inline const struct cred *get_cred(const struct cred *cred)
 {
 	struct cred *nonconst_cred = (struct cred *) cred;
+	if (!cred)
+		return cred;
 	validate_creds(cred);
 	nonconst_cred->non_rcu = 0;
 	return get_new_cred(nonconst_cred);
@@ -261,7 +263,7 @@ static inline const struct cred *get_cred(const struct cred *cred)
  * @cred: The credentials to release
  *
  * Release a reference to a set of credentials, deleting them when the last ref
- * is released.
+ * is released.  If %NULL is passed, nothing is done.
  *
  * This takes a const pointer to a set of credentials because the credentials
  * on task_struct are attached by const pointers to prevent accidental
@@ -271,9 +273,11 @@ static inline void put_cred(const struct cred *_cred)
 {
 	struct cred *cred = (struct cred *) _cred;
 
-	validate_creds(cred);
-	if (atomic_dec_and_test(&(cred)->usage))
-		__put_cred(cred);
+	if (cred) {
+		validate_creds(cred);
+		if (atomic_dec_and_test(&(cred)->usage))
+			__put_cred(cred);
+	}
 }
 
 /**

commit 764ac04de056801dfe52a716da63f6e7018e7f3b
Author: Anirudh Rayabharam <mail@anirudhrb.com>
Date:   Thu Jun 24 00:10:29 2021 +0530

    HID: usbhid: free raw_report buffers in usbhid_stop
    
    commit f7744fa16b96da57187dc8e5634152d3b63d72de upstream.
    
    Free the unsent raw_report buffers when the device is removed.
    
    Fixes a memory leak reported by syzbot at:
    https://syzkaller.appspot.com/bug?id=7b4fa7cb1a7c2d3342a2a8a6c53371c8c418ab47
    
    Reported-by: syzbot+47b26cd837ececfc666d@syzkaller.appspotmail.com
    Tested-by: syzbot+47b26cd837ececfc666d@syzkaller.appspotmail.com
    Signed-off-by: Anirudh Rayabharam <mail@anirudhrb.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 6b6db57b49d6..e28227040c64 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -506,7 +506,7 @@ static void hid_ctrl(struct urb *urb)
 
 	if (unplug) {
 		usbhid->ctrltail = usbhid->ctrlhead;
-	} else {
+	} else if (usbhid->ctrlhead != usbhid->ctrltail) {
 		usbhid->ctrltail = (usbhid->ctrltail + 1) & (HID_CONTROL_FIFO_SIZE - 1);
 
 		if (usbhid->ctrlhead != usbhid->ctrltail &&
@@ -1224,9 +1224,20 @@ static void usbhid_stop(struct hid_device *hid)
 	mutex_lock(&usbhid->mutex);
 
 	clear_bit(HID_STARTED, &usbhid->iofl);
+
 	spin_lock_irq(&usbhid->lock);	/* Sync with error and led handlers */
 	set_bit(HID_DISCONNECTED, &usbhid->iofl);
+	while (usbhid->ctrltail != usbhid->ctrlhead) {
+		if (usbhid->ctrl[usbhid->ctrltail].dir == USB_DIR_OUT) {
+			kfree(usbhid->ctrl[usbhid->ctrltail].raw_report);
+			usbhid->ctrl[usbhid->ctrltail].raw_report = NULL;
+		}
+
+		usbhid->ctrltail = (usbhid->ctrltail + 1) &
+			(HID_CONTROL_FIFO_SIZE - 1);
+	}
 	spin_unlock_irq(&usbhid->lock);
+
 	usb_kill_urb(usbhid->urbin);
 	usb_kill_urb(usbhid->urbout);
 	usb_kill_urb(usbhid->urbctrl);

commit c4bc456cb5b028e6a2a63e5d54b9f08e827c0504
Author: Jozsef Kadlecsik <kadlec@netfilter.org>
Date:   Mon Sep 6 18:26:34 2021 +0200

    netfilter: ipset: Fix oversized kvmalloc() calls
    
    commit 7bbc3d385bd813077acaf0e6fdb2a86a901f5382 upstream.
    
    The commit
    
    commit 7661809d493b426e979f39ab512e3adf41fbcc69
    Author: Linus Torvalds <torvalds@linux-foundation.org>
    Date:   Wed Jul 14 09:45:49 2021 -0700
    
        mm: don't allow oversized kvmalloc() calls
    
    limits the max allocatable memory via kvmalloc() to MAX_INT. Apply the
    same limit in ipset.
    
    Reported-by: syzbot+3493b1873fb3ea827986@syzkaller.appspotmail.com
    Reported-by: syzbot+2b8443c35458a617c904@syzkaller.appspotmail.com
    Reported-by: syzbot+ee5cb15f4a0e85e0d54e@syzkaller.appspotmail.com
    Signed-off-by: Jozsef Kadlecsik <kadlec@netfilter.org>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/netfilter/ipset/ip_set_hash_gen.h b/net/netfilter/ipset/ip_set_hash_gen.h
index 154b40f2f2a8..b4b474556339 100644
--- a/net/netfilter/ipset/ip_set_hash_gen.h
+++ b/net/netfilter/ipset/ip_set_hash_gen.h
@@ -104,11 +104,11 @@ htable_size(u8 hbits)
 {
 	size_t hsize;
 
-	/* We must fit both into u32 in jhash and size_t */
+	/* We must fit both into u32 in jhash and INT_MAX in kvmalloc_node() */
 	if (hbits > 31)
 		return 0;
 	hsize = jhash_size(hbits);
-	if ((((size_t)-1) - sizeof(struct htable)) / sizeof(struct hbucket *)
+	if ((INT_MAX - sizeof(struct htable)) / sizeof(struct hbucket *)
 	    < hsize)
 		return 0;
 

commit bb8b72374db69afa25a5b65cf1c092860c6fe914
Author: F.A.Sulaiman <asha.16@itfac.mrt.ac.lk>
Date:   Tue Aug 24 20:37:30 2021 +0530

    HID: betop: fix slab-out-of-bounds Write in betop_probe
    
    commit 1e4ce418b1cb1a810256b5fb3fd33d22d1325993 upstream.
    
    Syzbot reported slab-out-of-bounds Write bug in hid-betopff driver.
    The problem is the driver assumes the device must have an input report but
    some malicious devices violate this assumption.
    
    So this patch checks hid_device's input is non empty before it's been used.
    
    Reported-by: syzbot+07efed3bc5a1407bd742@syzkaller.appspotmail.com
    Signed-off-by: F.A. SULAIMAN <asha.16@itfac.mrt.ac.lk>
    Reviewed-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/hid/hid-betopff.c b/drivers/hid/hid-betopff.c
index 69cfc8dc6af1..9b60efe6ec44 100644
--- a/drivers/hid/hid-betopff.c
+++ b/drivers/hid/hid-betopff.c
@@ -59,15 +59,22 @@ static int betopff_init(struct hid_device *hid)
 {
 	struct betopff_device *betopff;
 	struct hid_report *report;
-	struct hid_input *hidinput =
-			list_first_entry(&hid->inputs, struct hid_input, list);
+	struct hid_input *hidinput;
 	struct list_head *report_list =
 			&hid->report_enum[HID_OUTPUT_REPORT].report_list;
-	struct input_dev *dev = hidinput->input;
+	struct input_dev *dev;
 	int field_count = 0;
 	int error;
 	int i, j;
 
+	if (list_empty(&hid->inputs)) {
+		hid_err(hid, "no inputs found\n");
+		return -ENODEV;
+	}
+
+	hidinput = list_first_entry(&hid->inputs, struct hid_input, list);
+	dev = hidinput->input;
+
 	if (list_empty(report_list)) {
 		hid_err(hid, "no output reports found\n");
 		return -ENODEV;

commit 710be7c42d2f724869e5b18b21998ceddaffc4a9
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Thu Aug 26 16:04:27 2021 +0300

    crypto: ccp - fix resource leaks in ccp_run_aes_gcm_cmd()
    
    commit 505d9dcb0f7ddf9d075e729523a33d38642ae680 upstream.
    
    There are three bugs in this code:
    
    1) If we ccp_init_data() fails for &src then we need to free aad.
       Use goto e_aad instead of goto e_ctx.
    2) The label to free the &final_wa was named incorrectly as "e_tag" but
       it should have been "e_final_wa".  One error path leaked &final_wa.
    3) The &tag was leaked on one error path.  In that case, I added a free
       before the goto because the resource was local to that block.
    
    Fixes: 36cf515b9bbe ("crypto: ccp - Enable support for AES GCM on v5 CCPs")
    Reported-by: "minihanshen(沈???" <minihanshen@tencent.com>
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Reviewed-by: John Allen <john.allen@amd.com>
    Tested-by: John Allen <john.allen@amd.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/crypto/ccp/ccp-ops.c b/drivers/crypto/ccp/ccp-ops.c
index 20ca9c9e109e..453d27d2a4ff 100644
--- a/drivers/crypto/ccp/ccp-ops.c
+++ b/drivers/crypto/ccp/ccp-ops.c
@@ -783,7 +783,7 @@ ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
 				    in_place ? DMA_BIDIRECTIONAL
 					     : DMA_TO_DEVICE);
 		if (ret)
-			goto e_ctx;
+			goto e_aad;
 
 		if (in_place) {
 			dst = src;
@@ -868,7 +868,7 @@ ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
 	op.u.aes.size = 0;
 	ret = cmd_q->ccp->vdata->perform->aes(&op);
 	if (ret)
-		goto e_dst;
+		goto e_final_wa;
 
 	if (aes->action == CCP_AES_ACTION_ENCRYPT) {
 		/* Put the ciphered tag after the ciphertext. */
@@ -878,17 +878,19 @@ ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)
 		ret = ccp_init_dm_workarea(&tag, cmd_q, authsize,
 					   DMA_BIDIRECTIONAL);
 		if (ret)
-			goto e_tag;
+			goto e_final_wa;
 		ret = ccp_set_dm_area(&tag, 0, p_tag, 0, authsize);
-		if (ret)
-			goto e_tag;
+		if (ret) {
+			ccp_dm_free(&tag);
+			goto e_final_wa;
+		}
 
 		ret = crypto_memneq(tag.address, final_wa.address,
 				    authsize) ? -EBADMSG : 0;
 		ccp_dm_free(&tag);
 	}
 
-e_tag:
+e_final_wa:
 	ccp_dm_free(&final_wa);
 
 e_dst:

commit 981d6f6f0b50d433163a41d40562ffb181f2f4fb
Author: Dongliang Mu <mudongliangabcd@gmail.com>
Date:   Wed Jul 21 16:14:57 2021 +0800

    usb: hso: remove the bailout parameter
    
    commit dcb713d53e2eadf42b878c12a471e74dc6ed3145 upstream.
    
    There are two invocation sites of hso_free_net_device. After
    refactoring hso_create_net_device, this parameter is useless.
    Remove the bailout in the hso_free_net_device and change the invocation
    sites of this function.
    
    Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c
index 6c2696422ed7..77a7a7ddb631 100644
--- a/drivers/net/usb/hso.c
+++ b/drivers/net/usb/hso.c
@@ -2368,7 +2368,7 @@ static int remove_net_device(struct hso_device *hso_dev)
 }
 
 /* Frees our network device */
-static void hso_free_net_device(struct hso_device *hso_dev, bool bailout)
+static void hso_free_net_device(struct hso_device *hso_dev)
 {
 	int i;
 	struct hso_net *hso_net = dev2net(hso_dev);
@@ -2391,7 +2391,7 @@ static void hso_free_net_device(struct hso_device *hso_dev, bool bailout)
 	kfree(hso_net->mux_bulk_tx_buf);
 	hso_net->mux_bulk_tx_buf = NULL;
 
-	if (hso_net->net && !bailout)
+	if (hso_net->net)
 		free_netdev(hso_net->net);
 
 	kfree(hso_dev);
@@ -3143,7 +3143,7 @@ static void hso_free_interface(struct usb_interface *interface)
 				rfkill_unregister(rfk);
 				rfkill_destroy(rfk);
 			}
-			hso_free_net_device(network_table[i], false);
+			hso_free_net_device(network_table[i]);
 		}
 	}
 }

commit f6cf22a1ef49f8e131f99c3f5fd80ab6b23a2d21
Author: Dongliang Mu <mudongliangabcd@gmail.com>
Date:   Wed Jul 14 17:13:22 2021 +0800

    usb: hso: fix error handling code of hso_create_net_device
    
    commit a6ecfb39ba9d7316057cea823b196b734f6b18ca upstream.
    
    The current error handling code of hso_create_net_device is
    hso_free_net_device, no matter which errors lead to. For example,
    WARNING in hso_free_net_device [1].
    
    Fix this by refactoring the error handling code of
    hso_create_net_device by handling different errors by different code.
    
    [1] https://syzkaller.appspot.com/bug?id=66eff8d49af1b28370ad342787413e35bbe76efe
    
    Reported-by: syzbot+44d53c7255bb1aea22d2@syzkaller.appspotmail.com
    Fixes: 5fcfb6d0bfcd ("hso: fix bailout in error case of probe")
    Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c
index dbb0a829acef..6c2696422ed7 100644
--- a/drivers/net/usb/hso.c
+++ b/drivers/net/usb/hso.c
@@ -2511,7 +2511,7 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface,
 			   hso_net_init);
 	if (!net) {
 		dev_err(&interface->dev, "Unable to create ethernet device\n");
-		goto exit;
+		goto err_hso_dev;
 	}
 
 	hso_net = netdev_priv(net);
@@ -2524,13 +2524,13 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface,
 				      USB_DIR_IN);
 	if (!hso_net->in_endp) {
 		dev_err(&interface->dev, "Can't find BULK IN endpoint\n");
-		goto exit;
+		goto err_net;
 	}
 	hso_net->out_endp = hso_get_ep(interface, USB_ENDPOINT_XFER_BULK,
 				       USB_DIR_OUT);
 	if (!hso_net->out_endp) {
 		dev_err(&interface->dev, "Can't find BULK OUT endpoint\n");
-		goto exit;
+		goto err_net;
 	}
 	SET_NETDEV_DEV(net, &interface->dev);
 	SET_NETDEV_DEVTYPE(net, &hso_type);
@@ -2539,18 +2539,18 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface,
 	for (i = 0; i < MUX_BULK_RX_BUF_COUNT; i++) {
 		hso_net->mux_bulk_rx_urb_pool[i] = usb_alloc_urb(0, GFP_KERNEL);
 		if (!hso_net->mux_bulk_rx_urb_pool[i])
-			goto exit;
+			goto err_mux_bulk_rx;
 		hso_net->mux_bulk_rx_buf_pool[i] = kzalloc(MUX_BULK_RX_BUF_SIZE,
 							   GFP_KERNEL);
 		if (!hso_net->mux_bulk_rx_buf_pool[i])
-			goto exit;
+			goto err_mux_bulk_rx;
 	}
 	hso_net->mux_bulk_tx_urb = usb_alloc_urb(0, GFP_KERNEL);
 	if (!hso_net->mux_bulk_tx_urb)
-		goto exit;
+		goto err_mux_bulk_rx;
 	hso_net->mux_bulk_tx_buf = kzalloc(MUX_BULK_TX_BUF_SIZE, GFP_KERNEL);
 	if (!hso_net->mux_bulk_tx_buf)
-		goto exit;
+		goto err_free_tx_urb;
 
 	add_net_device(hso_dev);
 
@@ -2558,7 +2558,7 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface,
 	result = register_netdev(net);
 	if (result) {
 		dev_err(&interface->dev, "Failed to register device\n");
-		goto exit;
+		goto err_free_tx_buf;
 	}
 
 	hso_log_port(hso_dev);
@@ -2566,8 +2566,21 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface,
 	hso_create_rfkill(hso_dev, interface);
 
 	return hso_dev;
-exit:
-	hso_free_net_device(hso_dev, true);
+
+err_free_tx_buf:
+	remove_net_device(hso_dev);
+	kfree(hso_net->mux_bulk_tx_buf);
+err_free_tx_urb:
+	usb_free_urb(hso_net->mux_bulk_tx_urb);
+err_mux_bulk_rx:
+	for (i = 0; i < MUX_BULK_RX_BUF_COUNT; i++) {
+		usb_free_urb(hso_net->mux_bulk_rx_urb_pool[i]);
+		kfree(hso_net->mux_bulk_rx_buf_pool[i]);
+	}
+err_net:
+	free_netdev(net);
+err_hso_dev:
+	kfree(hso_dev);
 	return NULL;
 }
 

commit 13f176b7eeaa4e4b4014facf147d998e858a23b5
Author: Oliver Neukum <oneukum@suse.com>
Date:   Wed Aug 5 14:07:07 2020 +0200

    hso: fix bailout in error case of probe
    
    commit 5fcfb6d0bfcda17f0d0656e4e5b3710af2bbaae5 upstream.
    
    The driver tries to reuse code for disconnect in case
    of a failed probe.
    If resources need to be freed after an error in probe, the
    netdev must not be freed because it has never been registered.
    Fix it by telling the helper which path we are in.
    
    Signed-off-by: Oliver Neukum <oneukum@suse.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c
index 236f1a288080..dbb0a829acef 100644
--- a/drivers/net/usb/hso.c
+++ b/drivers/net/usb/hso.c
@@ -2368,7 +2368,7 @@ static int remove_net_device(struct hso_device *hso_dev)
 }
 
 /* Frees our network device */
-static void hso_free_net_device(struct hso_device *hso_dev)
+static void hso_free_net_device(struct hso_device *hso_dev, bool bailout)
 {
 	int i;
 	struct hso_net *hso_net = dev2net(hso_dev);
@@ -2391,7 +2391,7 @@ static void hso_free_net_device(struct hso_device *hso_dev)
 	kfree(hso_net->mux_bulk_tx_buf);
 	hso_net->mux_bulk_tx_buf = NULL;
 
-	if (hso_net->net)
+	if (hso_net->net && !bailout)
 		free_netdev(hso_net->net);
 
 	kfree(hso_dev);
@@ -2567,7 +2567,7 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface,
 
 	return hso_dev;
 exit:
-	hso_free_net_device(hso_dev);
+	hso_free_net_device(hso_dev, true);
 	return NULL;
 }
 
@@ -3130,7 +3130,7 @@ static void hso_free_interface(struct usb_interface *interface)
 				rfkill_unregister(rfk);
 				rfkill_destroy(rfk);
 			}
-			hso_free_net_device(network_table[i]);
+			hso_free_net_device(network_table[i], false);
 		}
 	}
 }

commit 3232e981389fc3c57bcdc22ff9a82fb4a512724e
Author: Alex Sverdlin <alexander.sverdlin@nokia.com>
Date:   Mon Sep 27 14:02:46 2021 -0700

    ARM: 9098/1: ftrace: MODULE_PLT: Fix build problem without DYNAMIC_FTRACE
    
    commit 6fa630bf473827aee48cbf0efbbdf6f03134e890 upstream
    
    FTRACE_ADDR is only defined when CONFIG_DYNAMIC_FTRACE is defined, the
    latter is even stronger requirement than CONFIG_FUNCTION_TRACER (which is
    enough for MCOUNT_ADDR).
    
    Link: https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org/thread/ZUVCQBHDMFVR7CCB7JPESLJEWERZDJ3T/
    
    Fixes: 1f12fb25c5c5d22f ("ARM: 9079/1: ftrace: Add MODULE_PLTS support")
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Alexander Sverdlin <alexander.sverdlin@nokia.com>
    Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/kernel/module-plts.c b/arch/arm/kernel/module-plts.c
index 6804a145be11..ed0e09cc735f 100644
--- a/arch/arm/kernel/module-plts.c
+++ b/arch/arm/kernel/module-plts.c
@@ -24,7 +24,7 @@
 #endif
 
 static const u32 fixed_plts[] = {
-#ifdef CONFIG_FUNCTION_TRACER
+#ifdef CONFIG_DYNAMIC_FTRACE
 	FTRACE_ADDR,
 	MCOUNT_ADDR,
 #endif

commit 8113e622926ef6590771ede0f7f64821e1751b67
Author: Alex Sverdlin <alexander.sverdlin@nokia.com>
Date:   Mon Sep 27 14:02:45 2021 -0700

    ARM: 9079/1: ftrace: Add MODULE_PLTS support
    
    commit 79f32b221b18c15a98507b101ef4beb52444cc6f upstream
    
    Teach ftrace_make_call() and ftrace_make_nop() about PLTs.
    Teach PLT code about FTRACE and all its callbacks.
    Otherwise the following might happen:
    
    ------------[ cut here ]------------
    WARNING: CPU: 14 PID: 2265 at .../arch/arm/kernel/insn.c:14 __arm_gen_branch+0x83/0x8c()
    ...
    Hardware name: LSI Axxia AXM55XX
    [<c0314a49>] (unwind_backtrace) from [<c03115e9>] (show_stack+0x11/0x14)
    [<c03115e9>] (show_stack) from [<c0519f51>] (dump_stack+0x81/0xa8)
    [<c0519f51>] (dump_stack) from [<c032185d>] (warn_slowpath_common+0x69/0x90)
    [<c032185d>] (warn_slowpath_common) from [<c03218f3>] (warn_slowpath_null+0x17/0x1c)
    [<c03218f3>] (warn_slowpath_null) from [<c03143cf>] (__arm_gen_branch+0x83/0x8c)
    [<c03143cf>] (__arm_gen_branch) from [<c0314337>] (ftrace_make_nop+0xf/0x24)
    [<c0314337>] (ftrace_make_nop) from [<c038ebcb>] (ftrace_process_locs+0x27b/0x3e8)
    [<c038ebcb>] (ftrace_process_locs) from [<c0378d79>] (load_module+0x11e9/0x1a44)
    [<c0378d79>] (load_module) from [<c037974d>] (SyS_finit_module+0x59/0x84)
    [<c037974d>] (SyS_finit_module) from [<c030e981>] (ret_fast_syscall+0x1/0x18)
    ---[ end trace e1b64ced7a89adcc ]---
    ------------[ cut here ]------------
    WARNING: CPU: 14 PID: 2265 at .../kernel/trace/ftrace.c:1979 ftrace_bug+0x1b1/0x234()
    ...
    Hardware name: LSI Axxia AXM55XX
    [<c0314a49>] (unwind_backtrace) from [<c03115e9>] (show_stack+0x11/0x14)
    [<c03115e9>] (show_stack) from [<c0519f51>] (dump_stack+0x81/0xa8)
    [<c0519f51>] (dump_stack) from [<c032185d>] (warn_slowpath_common+0x69/0x90)
    [<c032185d>] (warn_slowpath_common) from [<c03218f3>] (warn_slowpath_null+0x17/0x1c)
    [<c03218f3>] (warn_slowpath_null) from [<c038e87d>] (ftrace_bug+0x1b1/0x234)
    [<c038e87d>] (ftrace_bug) from [<c038ebd5>] (ftrace_process_locs+0x285/0x3e8)
    [<c038ebd5>] (ftrace_process_locs) from [<c0378d79>] (load_module+0x11e9/0x1a44)
    [<c0378d79>] (load_module) from [<c037974d>] (SyS_finit_module+0x59/0x84)
    [<c037974d>] (SyS_finit_module) from [<c030e981>] (ret_fast_syscall+0x1/0x18)
    ---[ end trace e1b64ced7a89adcd ]---
    ftrace failed to modify [<e9ef7006>] 0xe9ef7006
    actual: 02:f0:3b:fa
    ftrace record flags: 0
    (0) expected tramp: c0314265
    
    [florian: resolved merge conflict with struct
    dyn_arch_ftrace::old_mcount]
    
    Signed-off-by: Alexander Sverdlin <alexander.sverdlin@nokia.com>
    Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/include/asm/ftrace.h b/arch/arm/include/asm/ftrace.h
index 9e842ff41768..faeb6b1c0089 100644
--- a/arch/arm/include/asm/ftrace.h
+++ b/arch/arm/include/asm/ftrace.h
@@ -19,6 +19,9 @@ struct dyn_arch_ftrace {
 #ifdef CONFIG_OLD_MCOUNT
 	bool	old_mcount;
 #endif
+#ifdef CONFIG_ARM_MODULE_PLTS
+	struct module *mod;
+#endif
 };
 
 static inline unsigned long ftrace_call_adjust(unsigned long addr)
diff --git a/arch/arm/include/asm/module.h b/arch/arm/include/asm/module.h
index 56d4c97e578a..6b36656eed83 100644
--- a/arch/arm/include/asm/module.h
+++ b/arch/arm/include/asm/module.h
@@ -30,6 +30,7 @@ struct plt_entries {
 
 struct mod_plt_sec {
 	struct elf32_shdr	*plt;
+	struct plt_entries	*plt_ent;
 	int			plt_count;
 };
 
diff --git a/arch/arm/kernel/ftrace.c b/arch/arm/kernel/ftrace.c
index 05bf124ae324..51839250e49a 100644
--- a/arch/arm/kernel/ftrace.c
+++ b/arch/arm/kernel/ftrace.c
@@ -96,9 +96,10 @@ int ftrace_arch_code_modify_post_process(void)
 	return 0;
 }
 
-static unsigned long ftrace_call_replace(unsigned long pc, unsigned long addr)
+static unsigned long ftrace_call_replace(unsigned long pc, unsigned long addr,
+					 bool warn)
 {
-	return arm_gen_branch_link(pc, addr, true);
+	return arm_gen_branch_link(pc, addr, warn);
 }
 
 static int ftrace_modify_code(unsigned long pc, unsigned long old,
@@ -137,14 +138,14 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
 	int ret;
 
 	pc = (unsigned long)&ftrace_call;
-	new = ftrace_call_replace(pc, (unsigned long)func);
+	new = ftrace_call_replace(pc, (unsigned long)func, true);
 
 	ret = ftrace_modify_code(pc, 0, new, false);
 
 #ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS
 	if (!ret) {
 		pc = (unsigned long)&ftrace_regs_call;
-		new = ftrace_call_replace(pc, (unsigned long)func);
+		new = ftrace_call_replace(pc, (unsigned long)func, true);
 
 		ret = ftrace_modify_code(pc, 0, new, false);
 	}
@@ -153,7 +154,7 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
 #ifdef CONFIG_OLD_MCOUNT
 	if (!ret) {
 		pc = (unsigned long)&ftrace_call_old;
-		new = ftrace_call_replace(pc, (unsigned long)func);
+		new = ftrace_call_replace(pc, (unsigned long)func, true);
 
 		ret = ftrace_modify_code(pc, 0, new, false);
 	}
@@ -166,10 +167,22 @@ int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
 {
 	unsigned long new, old;
 	unsigned long ip = rec->ip;
+	unsigned long aaddr = adjust_address(rec, addr);
+	struct module *mod = NULL;
+
+#ifdef CONFIG_ARM_MODULE_PLTS
+	mod = rec->arch.mod;
+#endif
 
 	old = ftrace_nop_replace(rec);
 
-	new = ftrace_call_replace(ip, adjust_address(rec, addr));
+	new = ftrace_call_replace(ip, aaddr, !mod);
+#ifdef CONFIG_ARM_MODULE_PLTS
+	if (!new && mod) {
+		aaddr = get_module_plt(mod, ip, aaddr);
+		new = ftrace_call_replace(ip, aaddr, true);
+	}
+#endif
 
 	return ftrace_modify_code(rec->ip, old, new, true);
 }
@@ -182,9 +195,9 @@ int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr,
 	unsigned long new, old;
 	unsigned long ip = rec->ip;
 
-	old = ftrace_call_replace(ip, adjust_address(rec, old_addr));
+	old = ftrace_call_replace(ip, adjust_address(rec, old_addr), true);
 
-	new = ftrace_call_replace(ip, adjust_address(rec, addr));
+	new = ftrace_call_replace(ip, adjust_address(rec, addr), true);
 
 	return ftrace_modify_code(rec->ip, old, new, true);
 }
@@ -194,12 +207,29 @@ int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr,
 int ftrace_make_nop(struct module *mod,
 		    struct dyn_ftrace *rec, unsigned long addr)
 {
+	unsigned long aaddr = adjust_address(rec, addr);
 	unsigned long ip = rec->ip;
 	unsigned long old;
 	unsigned long new;
 	int ret;
 
-	old = ftrace_call_replace(ip, adjust_address(rec, addr));
+#ifdef CONFIG_ARM_MODULE_PLTS
+	/* mod is only supplied during module loading */
+	if (!mod)
+		mod = rec->arch.mod;
+	else
+		rec->arch.mod = mod;
+#endif
+
+	old = ftrace_call_replace(ip, aaddr,
+				  !IS_ENABLED(CONFIG_ARM_MODULE_PLTS) || !mod);
+#ifdef CONFIG_ARM_MODULE_PLTS
+	if (!old && mod) {
+		aaddr = get_module_plt(mod, ip, aaddr);
+		old = ftrace_call_replace(ip, aaddr, true);
+	}
+#endif
+
 	new = ftrace_nop_replace(rec);
 	ret = ftrace_modify_code(ip, old, new, true);
 
@@ -207,7 +237,7 @@ int ftrace_make_nop(struct module *mod,
 	if (ret == -EINVAL && addr == MCOUNT_ADDR) {
 		rec->arch.old_mcount = true;
 
-		old = ftrace_call_replace(ip, adjust_address(rec, addr));
+		old = ftrace_call_replace(ip, adjust_address(rec, addr), true);
 		new = ftrace_nop_replace(rec);
 		ret = ftrace_modify_code(ip, old, new, true);
 	}
diff --git a/arch/arm/kernel/module-plts.c b/arch/arm/kernel/module-plts.c
index f272711c411f..6804a145be11 100644
--- a/arch/arm/kernel/module-plts.c
+++ b/arch/arm/kernel/module-plts.c
@@ -7,6 +7,7 @@
  */
 
 #include <linux/elf.h>
+#include <linux/ftrace.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/sort.h>
@@ -22,19 +23,52 @@
 						    (PLT_ENT_STRIDE - 8))
 #endif
 
+static const u32 fixed_plts[] = {
+#ifdef CONFIG_FUNCTION_TRACER
+	FTRACE_ADDR,
+	MCOUNT_ADDR,
+#endif
+};
+
 static bool in_init(const struct module *mod, unsigned long loc)
 {
 	return loc - (u32)mod->init_layout.base < mod->init_layout.size;
 }
 
+static void prealloc_fixed(struct mod_plt_sec *pltsec, struct plt_entries *plt)
+{
+	int i;
+
+	if (!ARRAY_SIZE(fixed_plts) || pltsec->plt_count)
+		return;
+	pltsec->plt_count = ARRAY_SIZE(fixed_plts);
+
+	for (i = 0; i < ARRAY_SIZE(plt->ldr); ++i)
+		plt->ldr[i] = PLT_ENT_LDR;
+
+	BUILD_BUG_ON(sizeof(fixed_plts) > sizeof(plt->lit));
+	memcpy(plt->lit, fixed_plts, sizeof(fixed_plts));
+}
+
 u32 get_module_plt(struct module *mod, unsigned long loc, Elf32_Addr val)
 {
 	struct mod_plt_sec *pltsec = !in_init(mod, loc) ? &mod->arch.core :
 							  &mod->arch.init;
+	struct plt_entries *plt;
+	int idx;
+
+	/* cache the address, ELF header is available only during module load */
+	if (!pltsec->plt_ent)
+		pltsec->plt_ent = (struct plt_entries *)pltsec->plt->sh_addr;
+	plt = pltsec->plt_ent;
 
-	struct plt_entries *plt = (struct plt_entries *)pltsec->plt->sh_addr;
-	int idx = 0;
+	prealloc_fixed(pltsec, plt);
+
+	for (idx = 0; idx < ARRAY_SIZE(fixed_plts); ++idx)
+		if (plt->lit[idx] == val)
+			return (u32)&plt->ldr[idx];
 
+	idx = 0;
 	/*
 	 * Look for an existing entry pointing to 'val'. Given that the
 	 * relocations are sorted, this will be the last entry we allocated.
@@ -182,8 +216,8 @@ static unsigned int count_plts(const Elf32_Sym *syms, Elf32_Addr base,
 int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
 			      char *secstrings, struct module *mod)
 {
-	unsigned long core_plts = 0;
-	unsigned long init_plts = 0;
+	unsigned long core_plts = ARRAY_SIZE(fixed_plts);
+	unsigned long init_plts = ARRAY_SIZE(fixed_plts);
 	Elf32_Shdr *s, *sechdrs_end = sechdrs + ehdr->e_shnum;
 	Elf32_Sym *syms = NULL;
 
@@ -238,6 +272,7 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
 	mod->arch.core.plt->sh_size = round_up(core_plts * PLT_ENT_SIZE,
 					       sizeof(struct plt_entries));
 	mod->arch.core.plt_count = 0;
+	mod->arch.core.plt_ent = NULL;
 
 	mod->arch.init.plt->sh_type = SHT_NOBITS;
 	mod->arch.init.plt->sh_flags = SHF_EXECINSTR | SHF_ALLOC;
@@ -245,6 +280,7 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
 	mod->arch.init.plt->sh_size = round_up(init_plts * PLT_ENT_SIZE,
 					       sizeof(struct plt_entries));
 	mod->arch.init.plt_count = 0;
+	mod->arch.init.plt_ent = NULL;
 
 	pr_debug("%s: plt=%x, init.plt=%x\n", __func__,
 		 mod->arch.core.plt->sh_size, mod->arch.init.plt->sh_size);

commit ad8f019376f2c6004cf5248e625d4d0831d8d26d
Author: Alex Sverdlin <alexander.sverdlin@nokia.com>
Date:   Mon Sep 27 14:02:44 2021 -0700

    ARM: 9078/1: Add warn suppress parameter to arm_gen_branch_link()
    
    commit 890cb057a46d323fd8c77ebecb6485476614cd21 upstream
    
    Will be used in the following patch. No functional change.
    
    Signed-off-by: Alexander Sverdlin <alexander.sverdlin@nokia.com>
    Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/include/asm/insn.h b/arch/arm/include/asm/insn.h
index f20e08ac85ae..5475cbf9fb6b 100644
--- a/arch/arm/include/asm/insn.h
+++ b/arch/arm/include/asm/insn.h
@@ -13,18 +13,18 @@ arm_gen_nop(void)
 }
 
 unsigned long
-__arm_gen_branch(unsigned long pc, unsigned long addr, bool link);
+__arm_gen_branch(unsigned long pc, unsigned long addr, bool link, bool warn);
 
 static inline unsigned long
 arm_gen_branch(unsigned long pc, unsigned long addr)
 {
-	return __arm_gen_branch(pc, addr, false);
+	return __arm_gen_branch(pc, addr, false, true);
 }
 
 static inline unsigned long
-arm_gen_branch_link(unsigned long pc, unsigned long addr)
+arm_gen_branch_link(unsigned long pc, unsigned long addr, bool warn)
 {
-	return __arm_gen_branch(pc, addr, true);
+	return __arm_gen_branch(pc, addr, true, warn);
 }
 
 #endif
diff --git a/arch/arm/kernel/ftrace.c b/arch/arm/kernel/ftrace.c
index ee673c09aa6c..05bf124ae324 100644
--- a/arch/arm/kernel/ftrace.c
+++ b/arch/arm/kernel/ftrace.c
@@ -98,7 +98,7 @@ int ftrace_arch_code_modify_post_process(void)
 
 static unsigned long ftrace_call_replace(unsigned long pc, unsigned long addr)
 {
-	return arm_gen_branch_link(pc, addr);
+	return arm_gen_branch_link(pc, addr, true);
 }
 
 static int ftrace_modify_code(unsigned long pc, unsigned long old,
diff --git a/arch/arm/kernel/insn.c b/arch/arm/kernel/insn.c
index 2e844b70386b..db0acbb7d7a0 100644
--- a/arch/arm/kernel/insn.c
+++ b/arch/arm/kernel/insn.c
@@ -3,8 +3,9 @@
 #include <linux/kernel.h>
 #include <asm/opcodes.h>
 
-static unsigned long
-__arm_gen_branch_thumb2(unsigned long pc, unsigned long addr, bool link)
+static unsigned long __arm_gen_branch_thumb2(unsigned long pc,
+					     unsigned long addr, bool link,
+					     bool warn)
 {
 	unsigned long s, j1, j2, i1, i2, imm10, imm11;
 	unsigned long first, second;
@@ -12,7 +13,7 @@ __arm_gen_branch_thumb2(unsigned long pc, unsigned long addr, bool link)
 
 	offset = (long)addr - (long)(pc + 4);
 	if (offset < -16777216 || offset > 16777214) {
-		WARN_ON_ONCE(1);
+		WARN_ON_ONCE(warn);
 		return 0;
 	}
 
@@ -33,8 +34,8 @@ __arm_gen_branch_thumb2(unsigned long pc, unsigned long addr, bool link)
 	return __opcode_thumb32_compose(first, second);
 }
 
-static unsigned long
-__arm_gen_branch_arm(unsigned long pc, unsigned long addr, bool link)
+static unsigned long __arm_gen_branch_arm(unsigned long pc, unsigned long addr,
+					  bool link, bool warn)
 {
 	unsigned long opcode = 0xea000000;
 	long offset;
@@ -44,7 +45,7 @@ __arm_gen_branch_arm(unsigned long pc, unsigned long addr, bool link)
 
 	offset = (long)addr - (long)(pc + 8);
 	if (unlikely(offset < -33554432 || offset > 33554428)) {
-		WARN_ON_ONCE(1);
+		WARN_ON_ONCE(warn);
 		return 0;
 	}
 
@@ -54,10 +55,10 @@ __arm_gen_branch_arm(unsigned long pc, unsigned long addr, bool link)
 }
 
 unsigned long
-__arm_gen_branch(unsigned long pc, unsigned long addr, bool link)
+__arm_gen_branch(unsigned long pc, unsigned long addr, bool link, bool warn)
 {
 	if (IS_ENABLED(CONFIG_THUMB2_KERNEL))
-		return __arm_gen_branch_thumb2(pc, addr, link);
+		return __arm_gen_branch_thumb2(pc, addr, link, warn);
 	else
-		return __arm_gen_branch_arm(pc, addr, link);
+		return __arm_gen_branch_arm(pc, addr, link, warn);
 }

commit 4c48682033db197b15c0864c629edb07d0fba0ea
Author: Alex Sverdlin <alexander.sverdlin@nokia.com>
Date:   Mon Sep 27 14:02:43 2021 -0700

    ARM: 9077/1: PLT: Move struct plt_entries definition to header
    
    commit 4e271701c17dee70c6e1351c4d7d42e70405c6a9 upstream
    
    No functional change, later it will be re-used in several files.
    
    Signed-off-by: Alexander Sverdlin <alexander.sverdlin@nokia.com>
    Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/include/asm/module.h b/arch/arm/include/asm/module.h
index 9e81b7c498d8..56d4c97e578a 100644
--- a/arch/arm/include/asm/module.h
+++ b/arch/arm/include/asm/module.h
@@ -19,6 +19,15 @@ enum {
 };
 #endif
 
+#define PLT_ENT_STRIDE		L1_CACHE_BYTES
+#define PLT_ENT_COUNT		(PLT_ENT_STRIDE / sizeof(u32))
+#define PLT_ENT_SIZE		(sizeof(struct plt_entries) / PLT_ENT_COUNT)
+
+struct plt_entries {
+	u32	ldr[PLT_ENT_COUNT];
+	u32	lit[PLT_ENT_COUNT];
+};
+
 struct mod_plt_sec {
 	struct elf32_shdr	*plt;
 	int			plt_count;
diff --git a/arch/arm/kernel/module-plts.c b/arch/arm/kernel/module-plts.c
index 3d0c2e4dda1d..f272711c411f 100644
--- a/arch/arm/kernel/module-plts.c
+++ b/arch/arm/kernel/module-plts.c
@@ -14,10 +14,6 @@
 #include <asm/cache.h>
 #include <asm/opcodes.h>
 
-#define PLT_ENT_STRIDE		L1_CACHE_BYTES
-#define PLT_ENT_COUNT		(PLT_ENT_STRIDE / sizeof(u32))
-#define PLT_ENT_SIZE		(sizeof(struct plt_entries) / PLT_ENT_COUNT)
-
 #ifdef CONFIG_THUMB2_KERNEL
 #define PLT_ENT_LDR		__opcode_to_mem_thumb32(0xf8dff000 | \
 							(PLT_ENT_STRIDE - 4))
@@ -26,11 +22,6 @@
 						    (PLT_ENT_STRIDE - 8))
 #endif
 
-struct plt_entries {
-	u32	ldr[PLT_ENT_COUNT];
-	u32	lit[PLT_ENT_COUNT];
-};
-
 static bool in_init(const struct module *mod, unsigned long loc)
 {
 	return loc - (u32)mod->init_layout.base < mod->init_layout.size;

commit 849ccf17bd19cbb92e0921539b04c50d5f3f5749
Author: Sai Krishna Potthuri <lakshmi.sai.krishna.potthuri@xilinx.com>
Date:   Wed Aug 18 12:53:14 2021 +0530

    EDAC/synopsys: Fix wrong value type assignment for edac_mode
    
    commit 5297cfa6bdf93e3889f78f9b482e2a595a376083 upstream.
    
    dimm->edac_mode contains values of type enum edac_type - not the
    corresponding capability flags. Fix that.
    
    Issue caught by Coverity check "enumerated type mixed with another
    type."
    
     [ bp: Rewrite commit message, add tags. ]
    
    Fixes: ae9b56e3996d ("EDAC, synps: Add EDAC support for zynq ddr ecc controller")
    Signed-off-by: Sai Krishna Potthuri <lakshmi.sai.krishna.potthuri@xilinx.com>
    Signed-off-by: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Cc: <stable@vger.kernel.org>
    Link: https://lkml.kernel.org/r/20210818072315.15149-1-shubhrajyoti.datta@xilinx.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/edac/synopsys_edac.c b/drivers/edac/synopsys_edac.c
index 0c9c59e2b5a3..ba9de54a701e 100644
--- a/drivers/edac/synopsys_edac.c
+++ b/drivers/edac/synopsys_edac.c
@@ -371,7 +371,7 @@ static int synps_edac_init_csrows(struct mem_ctl_info *mci)
 
 		for (j = 0; j < csi->nr_channels; j++) {
 			dimm            = csi->channels[j]->dimm;
-			dimm->edac_mode = EDAC_FLAG_SECDED;
+			dimm->edac_mode = EDAC_SECDED;
 			dimm->mtype     = synps_edac_get_mtype(priv->baseaddr);
 			dimm->nr_pages  = (size >> PAGE_SHIFT) / csi->nr_channels;
 			dimm->grain     = SYNPS_EDAC_ERR_GRAIN;

commit f6a6cced386920fe3d24b79ea129827766ae4106
Author: Eric Dumazet <edumazet@google.com>
Date:   Mon Sep 27 17:29:24 2021 -0700

    net: udp: annotate data race around udp_sk(sk)->corkflag
    
    commit a9f5970767d11eadc805d5283f202612c7ba1f59 upstream.
    
    up->corkflag field can be read or written without any lock.
    Annotate accesses to avoid possible syzbot/KCSAN reports.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index 32f0d1bb3b6d..e62de979ee30 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -935,7 +935,7 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
 	__be16 dport;
 	u8  tos;
 	int err, is_udplite = IS_UDPLITE(sk);
-	int corkreq = up->corkflag || msg->msg_flags&MSG_MORE;
+	int corkreq = READ_ONCE(up->corkflag) || msg->msg_flags&MSG_MORE;
 	int (*getfrag)(void *, char *, int, int, int, struct sk_buff *);
 	struct sk_buff *skb;
 	struct ip_options_data opt_copy;
@@ -1243,7 +1243,7 @@ int udp_sendpage(struct sock *sk, struct page *page, int offset,
 	}
 
 	up->len += size;
-	if (!(up->corkflag || (flags&MSG_MORE)))
+	if (!(READ_ONCE(up->corkflag) || (flags&MSG_MORE)))
 		ret = udp_push_pending_frames(sk);
 	if (!ret)
 		ret = size;
@@ -2468,9 +2468,9 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,
 	switch (optname) {
 	case UDP_CORK:
 		if (val != 0) {
-			up->corkflag = 1;
+			WRITE_ONCE(up->corkflag, 1);
 		} else {
-			up->corkflag = 0;
+			WRITE_ONCE(up->corkflag, 0);
 			lock_sock(sk);
 			push_pending_frames(sk);
 			release_sock(sk);
@@ -2583,7 +2583,7 @@ int udp_lib_getsockopt(struct sock *sk, int level, int optname,
 
 	switch (optname) {
 	case UDP_CORK:
-		val = up->corkflag;
+		val = READ_ONCE(up->corkflag);
 		break;
 
 	case UDP_ENCAP:
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index 042ab5428a4f..0198910c2bf2 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -1169,7 +1169,7 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
 	int addr_len = msg->msg_namelen;
 	bool connected = false;
 	int ulen = len;
-	int corkreq = up->corkflag || msg->msg_flags&MSG_MORE;
+	int corkreq = READ_ONCE(up->corkflag) || msg->msg_flags&MSG_MORE;
 	int err;
 	int is_udplite = IS_UDPLITE(sk);
 	int (*getfrag)(void *, char *, int, int, int, struct sk_buff *);

commit 8f890e9e43e07073566683c58a5ec483f1a3c646
Author: yangerkun <yangerkun@huawei.com>
Date:   Tue Sep 14 19:14:15 2021 +0800

    ext4: fix potential infinite loop in ext4_dx_readdir()
    
    commit 42cb447410d024e9d54139ae9c21ea132a8c384c upstream.
    
    When ext4_htree_fill_tree() fails, ext4_dx_readdir() can run into an
    infinite loop since if info->last_pos != ctx->pos this will reset the
    directory scan and reread the failing entry.  For example:
    
    1. a dx_dir which has 3 block, block 0 as dx_root block, block 1/2 as
       leaf block which own the ext4_dir_entry_2
    2. block 1 read ok and call_filldir which will fill the dirent and update
       the ctx->pos
    3. block 2 read fail, but we has already fill some dirent, so we will
       return back to userspace will a positive return val(see ksys_getdents64)
    4. the second ext4_dx_readdir will reset the world since info->last_pos
       != ctx->pos, and will also init the curr_hash which pos to block 1
    5. So we will read block1 too, and once block2 still read fail, we can
       only fill one dirent because the hash of the entry in block1(besides
       the last one) won't greater than curr_hash
    6. this time, we forget update last_pos too since the read for block2
       will fail, and since we has got the one entry, ksys_getdents64 can
       return success
    7. Latter we will trapped in a loop with step 4~6
    
    Cc: stable@kernel.org
    Signed-off-by: yangerkun <yangerkun@huawei.com>
    Reviewed-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Link: https://lore.kernel.org/r/20210914111415.3921954-1-yangerkun@huawei.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c
index ae520a726339..aed33af7551e 100644
--- a/fs/ext4/dir.c
+++ b/fs/ext4/dir.c
@@ -535,7 +535,7 @@ static int ext4_dx_readdir(struct file *file, struct dir_context *ctx)
 	struct dir_private_info *info = file->private_data;
 	struct inode *inode = file_inode(file);
 	struct fname *fname;
-	int	ret;
+	int ret = 0;
 
 	if (!info) {
 		info = ext4_htree_create_dir_info(file, ctx->pos);
@@ -583,7 +583,7 @@ static int ext4_dx_readdir(struct file *file, struct dir_context *ctx)
 						   info->curr_minor_hash,
 						   &info->next_hash);
 			if (ret < 0)
-				return ret;
+				goto finished;
 			if (ret == 0) {
 				ctx->pos = ext4_get_htree_eof(file);
 				break;
@@ -614,7 +614,7 @@ static int ext4_dx_readdir(struct file *file, struct dir_context *ctx)
 	}
 finished:
 	info->last_pos = ctx->pos;
-	return 0;
+	return ret < 0 ? ret : 0;
 }
 
 static int ext4_dir_open(struct inode * inode, struct file * filp)

commit 9c5b77a7ffc983b2429ce158b50497c5d3c86a69
Author: Johan Hovold <johan@kernel.org>
Date:   Fri Sep 17 13:46:21 2021 +0200

    ipack: ipoctal: fix module reference leak
    
    commit bb8a4fcb2136508224c596a7e665bdba1d7c3c27 upstream.
    
    A reference to the carrier module was taken on every open but was only
    released once when the final reference to the tty struct was dropped.
    
    Fix this by taking the module reference and initialising the tty driver
    data when installing the tty.
    
    Fixes: 82a82340bab6 ("ipoctal: get carrier driver to avoid rmmod")
    Cc: stable@vger.kernel.org      # 3.18
    Cc: Federico Vaga <federico.vaga@cern.ch>
    Acked-by: Samuel Iglesias Gonsalvez <siglesias@igalia.com>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20210917114622.5412-6-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/ipack/devices/ipoctal.c b/drivers/ipack/devices/ipoctal.c
index 2765ab54b582..f558aeb8f888 100644
--- a/drivers/ipack/devices/ipoctal.c
+++ b/drivers/ipack/devices/ipoctal.c
@@ -87,22 +87,34 @@ static int ipoctal_port_activate(struct tty_port *port, struct tty_struct *tty)
 	return 0;
 }
 
-static int ipoctal_open(struct tty_struct *tty, struct file *file)
+static int ipoctal_install(struct tty_driver *driver, struct tty_struct *tty)
 {
 	struct ipoctal_channel *channel = dev_get_drvdata(tty->dev);
 	struct ipoctal *ipoctal = chan_to_ipoctal(channel, tty->index);
-	int err;
-
-	tty->driver_data = channel;
+	int res;
 
 	if (!ipack_get_carrier(ipoctal->dev))
 		return -EBUSY;
 
-	err = tty_port_open(&channel->tty_port, tty, file);
-	if (err)
-		ipack_put_carrier(ipoctal->dev);
+	res = tty_standard_install(driver, tty);
+	if (res)
+		goto err_put_carrier;
+
+	tty->driver_data = channel;
+
+	return 0;
+
+err_put_carrier:
+	ipack_put_carrier(ipoctal->dev);
+
+	return res;
+}
+
+static int ipoctal_open(struct tty_struct *tty, struct file *file)
+{
+	struct ipoctal_channel *channel = tty->driver_data;
 
-	return err;
+	return tty_port_open(&channel->tty_port, tty, file);
 }
 
 static void ipoctal_reset_stats(struct ipoctal_stats *stats)
@@ -668,6 +680,7 @@ static void ipoctal_cleanup(struct tty_struct *tty)
 
 static const struct tty_operations ipoctal_fops = {
 	.ioctl =		NULL,
+	.install =		ipoctal_install,
 	.open =			ipoctal_open,
 	.close =		ipoctal_close,
 	.write =		ipoctal_write_tty,

commit eee92da3b0a1371e52505169003ba8bfabfe44d2
Author: Johan Hovold <johan@kernel.org>
Date:   Fri Sep 17 13:46:20 2021 +0200

    ipack: ipoctal: fix missing allocation-failure check
    
    commit 445c8132727728dc297492a7d9fc074af3e94ba3 upstream.
    
    Add the missing error handling when allocating the transmit buffer to
    avoid dereferencing a NULL pointer in write() should the allocation
    ever fail.
    
    Fixes: ba4dc61fe8c5 ("Staging: ipack: add support for IP-OCTAL mezzanine board")
    Cc: stable@vger.kernel.org      # 3.5
    Acked-by: Samuel Iglesias Gonsalvez <siglesias@igalia.com>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20210917114622.5412-5-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/ipack/devices/ipoctal.c b/drivers/ipack/devices/ipoctal.c
index 11d5d772b65b..2765ab54b582 100644
--- a/drivers/ipack/devices/ipoctal.c
+++ b/drivers/ipack/devices/ipoctal.c
@@ -391,7 +391,9 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr,
 
 		channel = &ipoctal->channel[i];
 		tty_port_init(&channel->tty_port);
-		tty_port_alloc_xmit_buf(&channel->tty_port);
+		res = tty_port_alloc_xmit_buf(&channel->tty_port);
+		if (res)
+			continue;
 		channel->tty_port.ops = &ipoctal_tty_port_ops;
 
 		ipoctal_reset_stats(&channel->stats);

commit 81e8ac7f3056454b0ebd6e45f843052c8fae491f
Author: Johan Hovold <johan@kernel.org>
Date:   Fri Sep 17 13:46:19 2021 +0200

    ipack: ipoctal: fix tty-registration error handling
    
    commit cd20d59291d1790dc74248476e928f57fc455189 upstream.
    
    Registration of the ipoctal tty devices is unlikely to fail, but if it
    ever does, make sure not to deregister a never registered tty device
    (and dereference a NULL pointer) when the driver is later unbound.
    
    Fixes: 2afb41d9d30d ("Staging: ipack/devices/ipoctal: Check tty_register_device return value.")
    Cc: stable@vger.kernel.org      # 3.7
    Acked-by: Samuel Iglesias Gonsalvez <siglesias@igalia.com>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20210917114622.5412-4-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/ipack/devices/ipoctal.c b/drivers/ipack/devices/ipoctal.c
index f3bbd2b785fe..11d5d772b65b 100644
--- a/drivers/ipack/devices/ipoctal.c
+++ b/drivers/ipack/devices/ipoctal.c
@@ -38,6 +38,7 @@ struct ipoctal_channel {
 	unsigned int			pointer_read;
 	unsigned int			pointer_write;
 	struct tty_port			tty_port;
+	bool				tty_registered;
 	union scc2698_channel __iomem	*regs;
 	union scc2698_block __iomem	*block_regs;
 	unsigned int			board_id;
@@ -402,9 +403,11 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr,
 							i, NULL, channel, NULL);
 		if (IS_ERR(tty_dev)) {
 			dev_err(&ipoctal->dev->dev, "Failed to register tty device.\n");
+			tty_port_free_xmit_buf(&channel->tty_port);
 			tty_port_destroy(&channel->tty_port);
 			continue;
 		}
+		channel->tty_registered = true;
 	}
 
 	/*
@@ -705,6 +708,10 @@ static void __ipoctal_remove(struct ipoctal *ipoctal)
 
 	for (i = 0; i < NR_CHANNELS; i++) {
 		struct ipoctal_channel *channel = &ipoctal->channel[i];
+
+		if (!channel->tty_registered)
+			continue;
+
 		tty_unregister_device(ipoctal->tty_drv, i);
 		tty_port_free_xmit_buf(&channel->tty_port);
 		tty_port_destroy(&channel->tty_port);

commit 15d4f8c9929baf8dab529f9e28e349031f769e27
Author: Johan Hovold <johan@kernel.org>
Date:   Fri Sep 17 13:46:18 2021 +0200

    ipack: ipoctal: fix tty registration race
    
    commit 65c001df517a7bf9be8621b53d43c89f426ce8d6 upstream.
    
    Make sure to set the tty class-device driver data before registering the
    tty to avoid having a racing open() dereference a NULL pointer.
    
    Fixes: 9c1d784afc6f ("Staging: ipack/devices/ipoctal: Get rid of ipoctal_list.")
    Cc: stable@vger.kernel.org      # 3.7
    Acked-by: Samuel Iglesias Gonsalvez <siglesias@igalia.com>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20210917114622.5412-3-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/ipack/devices/ipoctal.c b/drivers/ipack/devices/ipoctal.c
index aeadeaafdb26..f3bbd2b785fe 100644
--- a/drivers/ipack/devices/ipoctal.c
+++ b/drivers/ipack/devices/ipoctal.c
@@ -398,13 +398,13 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr,
 		spin_lock_init(&channel->lock);
 		channel->pointer_read = 0;
 		channel->pointer_write = 0;
-		tty_dev = tty_port_register_device(&channel->tty_port, tty, i, NULL);
+		tty_dev = tty_port_register_device_attr(&channel->tty_port, tty,
+							i, NULL, channel, NULL);
 		if (IS_ERR(tty_dev)) {
 			dev_err(&ipoctal->dev->dev, "Failed to register tty device.\n");
 			tty_port_destroy(&channel->tty_port);
 			continue;
 		}
-		dev_set_drvdata(tty_dev, channel);
 	}
 
 	/*

commit 829f13d6079cf7a2465522f39acb43033e9b320d
Author: Johan Hovold <johan@kernel.org>
Date:   Fri Sep 17 13:46:17 2021 +0200

    ipack: ipoctal: fix stack information leak
    
    commit a89936cce87d60766a75732a9e7e25c51164f47c upstream.
    
    The tty driver name is used also after registering the driver and must
    specifically not be allocated on the stack to avoid leaking information
    to user space (or triggering an oops).
    
    Drivers should not try to encode topology information in the tty device
    name but this one snuck in through staging without anyone noticing and
    another driver has since copied this malpractice.
    
    Fixing the ABI is a separate issue, but this at least plugs the security
    hole.
    
    Fixes: ba4dc61fe8c5 ("Staging: ipack: add support for IP-OCTAL mezzanine board")
    Cc: stable@vger.kernel.org      # 3.5
    Acked-by: Samuel Iglesias Gonsalvez <siglesias@igalia.com>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20210917114622.5412-2-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/ipack/devices/ipoctal.c b/drivers/ipack/devices/ipoctal.c
index 75dd15d66df6..aeadeaafdb26 100644
--- a/drivers/ipack/devices/ipoctal.c
+++ b/drivers/ipack/devices/ipoctal.c
@@ -269,7 +269,6 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr,
 	int res;
 	int i;
 	struct tty_driver *tty;
-	char name[20];
 	struct ipoctal_channel *channel;
 	struct ipack_region *region;
 	void __iomem *addr;
@@ -360,8 +359,11 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr,
 	/* Fill struct tty_driver with ipoctal data */
 	tty->owner = THIS_MODULE;
 	tty->driver_name = KBUILD_MODNAME;
-	sprintf(name, KBUILD_MODNAME ".%d.%d.", bus_nr, slot);
-	tty->name = name;
+	tty->name = kasprintf(GFP_KERNEL, KBUILD_MODNAME ".%d.%d.", bus_nr, slot);
+	if (!tty->name) {
+		res = -ENOMEM;
+		goto err_put_driver;
+	}
 	tty->major = 0;
 
 	tty->minor_start = 0;
@@ -377,8 +379,7 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr,
 	res = tty_register_driver(tty);
 	if (res) {
 		dev_err(&ipoctal->dev->dev, "Can't register tty driver.\n");
-		put_tty_driver(tty);
-		return res;
+		goto err_free_name;
 	}
 
 	/* Save struct tty_driver for use it when uninstalling the device */
@@ -415,6 +416,13 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr,
 				       ipoctal_irq_handler, ipoctal);
 
 	return 0;
+
+err_free_name:
+	kfree(tty->name);
+err_put_driver:
+	put_tty_driver(tty);
+
+	return res;
 }
 
 static inline int ipoctal_copy_write_buffer(struct ipoctal_channel *channel,
@@ -703,6 +711,7 @@ static void __ipoctal_remove(struct ipoctal *ipoctal)
 	}
 
 	tty_unregister_driver(ipoctal->tty_drv);
+	kfree(ipoctal->tty_drv->name);
 	put_tty_driver(ipoctal->tty_drv);
 	kfree(ipoctal);
 }

commit 90b69bd32a137c751a64fdbff4c8521d6c6a172d
Author: Chen Jingwen <chenjingwen6@huawei.com>
Date:   Tue Sep 28 20:56:57 2021 +0800

    elf: don't use MAP_FIXED_NOREPLACE for elf interpreter mappings
    
    commit 9b2f72cc0aa4bb444541bb87581c35b7508b37d3 upstream.
    
    In commit b212921b13bd ("elf: don't use MAP_FIXED_NOREPLACE for elf
    executable mappings") we still leave MAP_FIXED_NOREPLACE in place for
    load_elf_interp.
    
    Unfortunately, this will cause kernel to fail to start with:
    
        1 (init): Uhuuh, elf segment at 00003ffff7ffd000 requested but the memory is mapped already
        Failed to execute /init (error -17)
    
    The reason is that the elf interpreter (ld.so) has overlapping segments.
    
      readelf -l ld-2.31.so
      Program Headers:
        Type           Offset             VirtAddr           PhysAddr
                       FileSiz            MemSiz              Flags  Align
        LOAD           0x0000000000000000 0x0000000000000000 0x0000000000000000
                       0x000000000002c94c 0x000000000002c94c  R E    0x10000
        LOAD           0x000000000002dae0 0x000000000003dae0 0x000000000003dae0
                       0x00000000000021e8 0x0000000000002320  RW     0x10000
        LOAD           0x000000000002fe00 0x000000000003fe00 0x000000000003fe00
                       0x00000000000011ac 0x0000000000001328  RW     0x10000
    
    The reason for this problem is the same as described in commit
    ad55eac74f20 ("elf: enforce MAP_FIXED on overlaying elf segments").
    
    Not only executable binaries, elf interpreters (e.g. ld.so) can have
    overlapping elf segments, so we better drop MAP_FIXED_NOREPLACE and go
    back to MAP_FIXED in load_elf_interp.
    
    Fixes: 4ed28639519c ("fs, elf: drop MAP_FIXED usage from elf_map")
    Cc: <stable@vger.kernel.org> # v4.19
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Michal Hocko <mhocko@suse.com>
    Signed-off-by: Chen Jingwen <chenjingwen6@huawei.com>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
index 975dd0dbc252..c41c568ad1b8 100644
--- a/fs/binfmt_elf.c
+++ b/fs/binfmt_elf.c
@@ -580,7 +580,7 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
 				elf_prot |= PROT_EXEC;
 			vaddr = eppnt->p_vaddr;
 			if (interp_elf_ex->e_type == ET_EXEC || load_addr_set)
-				elf_type |= MAP_FIXED_NOREPLACE;
+				elf_type |= MAP_FIXED;
 			else if (no_base && interp_elf_ex->e_type == ET_DYN)
 				load_addr = -vaddr;
 

commit 0512a9aede6e4417c4fa6e0042a7ca8bc7e06b86
Author: Eric Dumazet <edumazet@google.com>
Date:   Wed Sep 29 15:57:50 2021 -0700

    af_unix: fix races in sk_peer_pid and sk_peer_cred accesses
    
    [ Upstream commit 35306eb23814444bd4021f8a1c3047d3cb0c8b2b ]
    
    Jann Horn reported that SO_PEERCRED and SO_PEERGROUPS implementations
    are racy, as af_unix can concurrently change sk_peer_pid and sk_peer_cred.
    
    In order to fix this issue, this patch adds a new spinlock that needs
    to be used whenever these fields are read or written.
    
    Jann also pointed out that l2cap_sock_get_peer_pid_cb() is currently
    reading sk->sk_peer_pid which makes no sense, as this field
    is only possibly set by AF_UNIX sockets.
    We will have to clean this in a separate patch.
    This could be done by reverting b48596d1dc25 "Bluetooth: L2CAP: Add get_peer_pid callback"
    or implementing what was truly expected.
    
    Fixes: 109f6e39fa07 ("af_unix: Allow SO_PEERCRED to work across namespaces.")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: Jann Horn <jannh@google.com>
    Cc: Eric W. Biederman <ebiederm@xmission.com>
    Cc: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
    Cc: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/net/sock.h b/include/net/sock.h
index 351749c694ce..75677050c82e 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -471,8 +471,10 @@ struct sock {
 	u32			sk_ack_backlog;
 	u32			sk_max_ack_backlog;
 	kuid_t			sk_uid;
+	spinlock_t		sk_peer_lock;
 	struct pid		*sk_peer_pid;
 	const struct cred	*sk_peer_cred;
+
 	long			sk_rcvtimeo;
 	ktime_t			sk_stamp;
 #if BITS_PER_LONG==32
diff --git a/net/core/sock.c b/net/core/sock.c
index 956af38aa0d6..41a77027a549 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1057,6 +1057,16 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
 }
 EXPORT_SYMBOL(sock_setsockopt);
 
+static const struct cred *sk_get_peer_cred(struct sock *sk)
+{
+	const struct cred *cred;
+
+	spin_lock(&sk->sk_peer_lock);
+	cred = get_cred(sk->sk_peer_cred);
+	spin_unlock(&sk->sk_peer_lock);
+
+	return cred;
+}
 
 static void cred_to_ucred(struct pid *pid, const struct cred *cred,
 			  struct ucred *ucred)
@@ -1231,7 +1241,11 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
 		struct ucred peercred;
 		if (len > sizeof(peercred))
 			len = sizeof(peercred);
+
+		spin_lock(&sk->sk_peer_lock);
 		cred_to_ucred(sk->sk_peer_pid, sk->sk_peer_cred, &peercred);
+		spin_unlock(&sk->sk_peer_lock);
+
 		if (copy_to_user(optval, &peercred, len))
 			return -EFAULT;
 		goto lenout;
@@ -1239,20 +1253,23 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
 
 	case SO_PEERGROUPS:
 	{
+		const struct cred *cred;
 		int ret, n;
 
-		if (!sk->sk_peer_cred)
+		cred = sk_get_peer_cred(sk);
+		if (!cred)
 			return -ENODATA;
 
-		n = sk->sk_peer_cred->group_info->ngroups;
+		n = cred->group_info->ngroups;
 		if (len < n * sizeof(gid_t)) {
 			len = n * sizeof(gid_t);
+			put_cred(cred);
 			return put_user(len, optlen) ? -EFAULT : -ERANGE;
 		}
 		len = n * sizeof(gid_t);
 
-		ret = groups_to_user((gid_t __user *)optval,
-				     sk->sk_peer_cred->group_info);
+		ret = groups_to_user((gid_t __user *)optval, cred->group_info);
+		put_cred(cred);
 		if (ret)
 			return ret;
 		goto lenout;
@@ -1576,9 +1593,10 @@ static void __sk_destruct(struct rcu_head *head)
 		sk->sk_frag.page = NULL;
 	}
 
-	if (sk->sk_peer_cred)
-		put_cred(sk->sk_peer_cred);
+	/* We do not need to acquire sk->sk_peer_lock, we are the last user. */
+	put_cred(sk->sk_peer_cred);
 	put_pid(sk->sk_peer_pid);
+
 	if (likely(sk->sk_net_refcnt))
 		put_net(sock_net(sk));
 	sk_prot_free(sk->sk_prot_creator, sk);
@@ -2826,6 +2844,8 @@ void sock_init_data(struct socket *sock, struct sock *sk)
 
 	sk->sk_peer_pid 	=	NULL;
 	sk->sk_peer_cred	=	NULL;
+	spin_lock_init(&sk->sk_peer_lock);
+
 	sk->sk_write_pending	=	0;
 	sk->sk_rcvlowat		=	1;
 	sk->sk_rcvtimeo		=	MAX_SCHEDULE_TIMEOUT;
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index c293a558b0d4..82279dbd2f62 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -600,20 +600,42 @@ static void unix_release_sock(struct sock *sk, int embrion)
 
 static void init_peercred(struct sock *sk)
 {
-	put_pid(sk->sk_peer_pid);
-	if (sk->sk_peer_cred)
-		put_cred(sk->sk_peer_cred);
+	const struct cred *old_cred;
+	struct pid *old_pid;
+
+	spin_lock(&sk->sk_peer_lock);
+	old_pid = sk->sk_peer_pid;
+	old_cred = sk->sk_peer_cred;
 	sk->sk_peer_pid  = get_pid(task_tgid(current));
 	sk->sk_peer_cred = get_current_cred();
+	spin_unlock(&sk->sk_peer_lock);
+
+	put_pid(old_pid);
+	put_cred(old_cred);
 }
 
 static void copy_peercred(struct sock *sk, struct sock *peersk)
 {
-	put_pid(sk->sk_peer_pid);
-	if (sk->sk_peer_cred)
-		put_cred(sk->sk_peer_cred);
+	const struct cred *old_cred;
+	struct pid *old_pid;
+
+	if (sk < peersk) {
+		spin_lock(&sk->sk_peer_lock);
+		spin_lock_nested(&peersk->sk_peer_lock, SINGLE_DEPTH_NESTING);
+	} else {
+		spin_lock(&peersk->sk_peer_lock);
+		spin_lock_nested(&sk->sk_peer_lock, SINGLE_DEPTH_NESTING);
+	}
+	old_pid = sk->sk_peer_pid;
+	old_cred = sk->sk_peer_cred;
 	sk->sk_peer_pid  = get_pid(peersk->sk_peer_pid);
 	sk->sk_peer_cred = get_cred(peersk->sk_peer_cred);
+
+	spin_unlock(&sk->sk_peer_lock);
+	spin_unlock(&peersk->sk_peer_lock);
+
+	put_pid(old_pid);
+	put_cred(old_cred);
 }
 
 static int unix_listen(struct socket *sock, int backlog)

commit 14a1b3c12f76e0879e4026f334984a2e9f576ae8
Author: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Date:   Mon Sep 27 21:44:08 2021 +0530

    scsi: csiostor: Add module softdep on cxgb4
    
    [ Upstream commit 79a7482249a7353bc86aff8127954d5febf02472 ]
    
    Both cxgb4 and csiostor drivers run on their own independent Physical
    Function. But when cxgb4 and csiostor are both being loaded in parallel via
    modprobe, there is a race when firmware upgrade is attempted by both the
    drivers.
    
    When the cxgb4 driver initiates the firmware upgrade, it halts the firmware
    and the chip until upgrade is complete. When the csiostor driver is coming
    up in parallel, the firmware mailbox communication fails with timeouts and
    the csiostor driver probe fails.
    
    Add a module soft dependency on cxgb4 driver to ensure loading csiostor
    triggers cxgb4 to load first when available to avoid the firmware upgrade
    race.
    
    Link: https://lore.kernel.org/r/1632759248-15382-1-git-send-email-rahul.lakkireddy@chelsio.com
    Fixes: a3667aaed569 ("[SCSI] csiostor: Chelsio FCoE offload driver")
    Signed-off-by: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/csiostor/csio_init.c b/drivers/scsi/csiostor/csio_init.c
index 1793981337dd..b59bcd2553d1 100644
--- a/drivers/scsi/csiostor/csio_init.c
+++ b/drivers/scsi/csiostor/csio_init.c
@@ -1263,3 +1263,4 @@ MODULE_DEVICE_TABLE(pci, csio_pci_tbl);
 MODULE_VERSION(CSIO_DRV_VERSION);
 MODULE_FIRMWARE(FW_FNAME_T5);
 MODULE_FIRMWARE(FW_FNAME_T6);
+MODULE_SOFTDEP("pre: cxgb4");

commit 9676ed4dd1af7834fa9129bafc3597ee2187f190
Author: Jens Axboe <axboe@kernel.dk>
Date:   Tue Sep 28 06:33:15 2021 -0600

    Revert "block, bfq: honor already-setup queue merges"
    
    [ Upstream commit ebc69e897e17373fbe1daaff1debaa77583a5284 ]
    
    This reverts commit 2d52c58b9c9bdae0ca3df6a1eab5745ab3f7d80b.
    
    We have had several folks complain that this causes hangs for them, which
    is especially problematic as the commit has also hit stable already.
    
    As no resolution seems to be forthcoming right now, revert the patch.
    
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=214503
    Fixes: 2d52c58b9c9b ("block, bfq: honor already-setup queue merges")
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
index c8c94e8e0f72..b2bad345c523 100644
--- a/block/bfq-iosched.c
+++ b/block/bfq-iosched.c
@@ -2137,15 +2137,6 @@ bfq_setup_merge(struct bfq_queue *bfqq, struct bfq_queue *new_bfqq)
 	 * are likely to increase the throughput.
 	 */
 	bfqq->new_bfqq = new_bfqq;
-	/*
-	 * The above assignment schedules the following redirections:
-	 * each time some I/O for bfqq arrives, the process that
-	 * generated that I/O is disassociated from bfqq and
-	 * associated with new_bfqq. Here we increases new_bfqq->ref
-	 * in advance, adding the number of processes that are
-	 * expected to be associated with new_bfqq as they happen to
-	 * issue I/O.
-	 */
 	new_bfqq->ref += process_refs;
 	return new_bfqq;
 }
@@ -2205,10 +2196,6 @@ bfq_setup_cooperator(struct bfq_data *bfqd, struct bfq_queue *bfqq,
 {
 	struct bfq_queue *in_service_bfqq, *new_bfqq;
 
-	/* if a merge has already been setup, then proceed with that first */
-	if (bfqq->new_bfqq)
-		return bfqq->new_bfqq;
-
 	/*
 	 * Prevent bfqq from being merged if it has been created too
 	 * long ago. The idea is that true cooperating processes, and
@@ -2223,6 +2210,9 @@ bfq_setup_cooperator(struct bfq_data *bfqd, struct bfq_queue *bfqq,
 	if (bfq_too_late_for_merging(bfqq))
 		return NULL;
 
+	if (bfqq->new_bfqq)
+		return bfqq->new_bfqq;
+
 	if (!io_struct || unlikely(bfqq == &bfqd->oom_bfqq))
 		return NULL;
 

commit 89caeb43dee5301e11e4b78d4ca424bf7e5032bb
Author: Jacob Keller <jacob.e.keller@intel.com>
Date:   Wed Sep 8 10:52:37 2021 -0700

    e100: fix buffer overrun in e100_get_regs
    
    [ Upstream commit 51032e6f17ce990d06123ad7307f258c50d25aa7 ]
    
    The e100_get_regs function is used to implement a simple register dump
    for the e100 device. The data is broken into a couple of MAC control
    registers, and then a series of PHY registers, followed by a memory dump
    buffer.
    
    The total length of the register dump is defined as (1 + E100_PHY_REGS)
    * sizeof(u32) + sizeof(nic->mem->dump_buf).
    
    The logic for filling in the PHY registers uses a convoluted inverted
    count for loop which counts from E100_PHY_REGS (0x1C) down to 0, and
    assigns the slots 1 + E100_PHY_REGS - i. The first loop iteration will
    fill in [1] and the final loop iteration will fill in [1 + 0x1C]. This
    is actually one more than the supposed number of PHY registers.
    
    The memory dump buffer is then filled into the space at
    [2 + E100_PHY_REGS] which will cause that memcpy to assign 4 bytes past
    the total size.
    
    The end result is that we overrun the total buffer size allocated by the
    kernel, which could lead to a panic or other issues due to memory
    corruption.
    
    It is difficult to determine the actual total number of registers
    here. The only 8255x datasheet I could find indicates there are 28 total
    MDI registers. However, we're reading 29 here, and reading them in
    reverse!
    
    In addition, the ethtool e100 register dump interface appears to read
    the first PHY register to determine if the device is in MDI or MDIx
    mode. This doesn't appear to be documented anywhere within the 8255x
    datasheet. I can only assume it must be in register 28 (the extra
    register we're reading here).
    
    Lets not change any of the intended meaning of what we copy here. Just
    extend the space by 4 bytes to account for the extra register and
    continue copying the data out in the same order.
    
    Change the E100_PHY_REGS value to be the correct total (29) so that the
    total register dump size is calculated properly. Fix the offset for
    where we copy the dump buffer so that it doesn't overrun the total size.
    
    Re-write the for loop to use counting up instead of the convoluted
    down-counting. Correct the mdio_read offset to use the 0-based register
    offsets, but maintain the bizarre reverse ordering so that we have the
    ABI expected by applications like ethtool. This requires and additional
    subtraction of 1. It seems a bit odd but it makes the flow of assignment
    into the register buffer easier to follow.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-by: Felicitas Hetzelt <felicitashetzelt@gmail.com>
    Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
    Tested-by: Jacob Keller <jacob.e.keller@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/e100.c b/drivers/net/ethernet/intel/e100.c
index 4d27eaf05641..ba5b515c86e2 100644
--- a/drivers/net/ethernet/intel/e100.c
+++ b/drivers/net/ethernet/intel/e100.c
@@ -2433,7 +2433,7 @@ static void e100_get_drvinfo(struct net_device *netdev,
 		sizeof(info->bus_info));
 }
 
-#define E100_PHY_REGS 0x1C
+#define E100_PHY_REGS 0x1D
 static int e100_get_regs_len(struct net_device *netdev)
 {
 	struct nic *nic = netdev_priv(netdev);
@@ -2455,14 +2455,18 @@ static void e100_get_regs(struct net_device *netdev,
 	buff[0] = ioread8(&nic->csr->scb.cmd_hi) << 24 |
 		ioread8(&nic->csr->scb.cmd_lo) << 16 |
 		ioread16(&nic->csr->scb.status);
-	for (i = E100_PHY_REGS; i >= 0; i--)
-		buff[1 + E100_PHY_REGS - i] =
-			mdio_read(netdev, nic->mii.phy_id, i);
+	for (i = 0; i < E100_PHY_REGS; i++)
+		/* Note that we read the registers in reverse order. This
+		 * ordering is the ABI apparently used by ethtool and other
+		 * applications.
+		 */
+		buff[1 + i] = mdio_read(netdev, nic->mii.phy_id,
+					E100_PHY_REGS - 1 - i);
 	memset(nic->mem->dump_buf, 0, sizeof(nic->mem->dump_buf));
 	e100_exec_cb(nic, NULL, e100_dump);
 	msleep(10);
-	memcpy(&buff[2 + E100_PHY_REGS], nic->mem->dump_buf,
-		sizeof(nic->mem->dump_buf));
+	memcpy(&buff[1 + E100_PHY_REGS], nic->mem->dump_buf,
+	       sizeof(nic->mem->dump_buf));
 }
 
 static void e100_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)

commit e9bdf727ccc04de20459a63c128ab397211a5631
Author: Jacob Keller <jacob.e.keller@intel.com>
Date:   Wed Sep 8 10:52:36 2021 -0700

    e100: fix length calculation in e100_get_regs_len
    
    [ Upstream commit 4329c8dc110b25d5f04ed20c6821bb60deff279f ]
    
    commit abf9b902059f ("e100: cleanup unneeded math") tried to simplify
    e100_get_regs_len and remove a double 'divide and then multiply'
    calculation that the e100_reg_regs_len function did.
    
    This change broke the size calculation entirely as it failed to account
    for the fact that the numbered registers are actually 4 bytes wide and
    not 1 byte. This resulted in a significant under allocation of the
    register buffer used by e100_get_regs.
    
    Fix this by properly multiplying the register count by u32 first before
    adding the size of the dump buffer.
    
    Fixes: abf9b902059f ("e100: cleanup unneeded math")
    Reported-by: Felicitas Hetzelt <felicitashetzelt@gmail.com>
    Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/e100.c b/drivers/net/ethernet/intel/e100.c
index bf64fab38385..4d27eaf05641 100644
--- a/drivers/net/ethernet/intel/e100.c
+++ b/drivers/net/ethernet/intel/e100.c
@@ -2437,7 +2437,11 @@ static void e100_get_drvinfo(struct net_device *netdev,
 static int e100_get_regs_len(struct net_device *netdev)
 {
 	struct nic *nic = netdev_priv(netdev);
-	return 1 + E100_PHY_REGS + sizeof(nic->mem->dump_buf);
+
+	/* We know the number of registers, and the size of the dump buffer.
+	 * Calculate the total size in bytes.
+	 */
+	return (1 + E100_PHY_REGS) * sizeof(u32) + sizeof(nic->mem->dump_buf);
 }
 
 static void e100_get_regs(struct net_device *netdev,

commit 9b07673f7061fe7939753fec9aa652f5211d1630
Author: Paul Fertser <fercerpav@gmail.com>
Date:   Fri Sep 24 12:30:11 2021 +0300

    hwmon: (tmp421) fix rounding for negative values
    
    [ Upstream commit 724e8af85854c4d3401313b6dd7d79cf792d8990 ]
    
    Old code produces -24999 for 0b1110011100000000 input in standard format due to
    always rounding up rather than "away from zero".
    
    Use the common macro for division, unify and simplify the conversion code along
    the way.
    
    Fixes: 9410700b881f ("hwmon: Add driver for Texas Instruments TMP421/422/423 sensor chips")
    Signed-off-by: Paul Fertser <fercerpav@gmail.com>
    Link: https://lore.kernel.org/r/20210924093011.26083-3-fercerpav@gmail.com
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hwmon/tmp421.c b/drivers/hwmon/tmp421.c
index c2113c00b635..cdd01a848301 100644
--- a/drivers/hwmon/tmp421.c
+++ b/drivers/hwmon/tmp421.c
@@ -109,23 +109,17 @@ struct tmp421_data {
 	s16 temp[4];
 };
 
-static int temp_from_s16(s16 reg)
+static int temp_from_raw(u16 reg, bool extended)
 {
 	/* Mask out status bits */
 	int temp = reg & ~0xf;
 
-	return (temp * 1000 + 128) / 256;
-}
-
-static int temp_from_u16(u16 reg)
-{
-	/* Mask out status bits */
-	int temp = reg & ~0xf;
-
-	/* Add offset for extended temperature range. */
-	temp -= 64 * 256;
+	if (extended)
+		temp = temp - 64 * 256;
+	else
+		temp = (s16)temp;
 
-	return (temp * 1000 + 128) / 256;
+	return DIV_ROUND_CLOSEST(temp * 1000, 256);
 }
 
 static struct tmp421_data *tmp421_update_device(struct device *dev)
@@ -162,10 +156,8 @@ static int tmp421_read(struct device *dev, enum hwmon_sensor_types type,
 
 	switch (attr) {
 	case hwmon_temp_input:
-		if (tmp421->config & TMP421_CONFIG_RANGE)
-			*val = temp_from_u16(tmp421->temp[channel]);
-		else
-			*val = temp_from_s16(tmp421->temp[channel]);
+		*val = temp_from_raw(tmp421->temp[channel],
+				     tmp421->config & TMP421_CONFIG_RANGE);
 		return 0;
 	case hwmon_temp_fault:
 		/*

commit 684649f3db8b46cf82a6f6db7a554f10c14505a5
Author: Paul Fertser <fercerpav@gmail.com>
Date:   Fri Sep 24 12:30:10 2021 +0300

    hwmon: (tmp421) report /PVLD condition as fault
    
    [ Upstream commit 540effa7f283d25bcc13c0940d808002fee340b8 ]
    
    For both local and remote sensors all the supported ICs can report an
    "undervoltage lockout" condition which means the conversion wasn't
    properly performed due to insufficient power supply voltage and so the
    measurement results can't be trusted.
    
    Fixes: 9410700b881f ("hwmon: Add driver for Texas Instruments TMP421/422/423 sensor chips")
    Signed-off-by: Paul Fertser <fercerpav@gmail.com>
    Link: https://lore.kernel.org/r/20210924093011.26083-2-fercerpav@gmail.com
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hwmon/tmp421.c b/drivers/hwmon/tmp421.c
index 06826a78c0f4..c2113c00b635 100644
--- a/drivers/hwmon/tmp421.c
+++ b/drivers/hwmon/tmp421.c
@@ -169,10 +169,10 @@ static int tmp421_read(struct device *dev, enum hwmon_sensor_types type,
 		return 0;
 	case hwmon_temp_fault:
 		/*
-		 * The OPEN bit signals a fault. This is bit 0 of the temperature
-		 * register (low byte).
+		 * Any of OPEN or /PVLD bits indicate a hardware mulfunction
+		 * and the conversion result may be incorrect
 		 */
-		*val = tmp421->temp[channel] & 0x01;
+		*val = !!(tmp421->temp[channel] & 0x03);
 		return 0;
 	default:
 		return -EOPNOTSUPP;
@@ -185,9 +185,6 @@ static umode_t tmp421_is_visible(const void *data, enum hwmon_sensor_types type,
 {
 	switch (attr) {
 	case hwmon_temp_fault:
-		if (channel == 0)
-			return 0;
-		return 0444;
 	case hwmon_temp_input:
 		return 0444;
 	default:

commit 3fe13004feec043284f6c654bc8f045477199dfd
Author: Guenter Roeck <linux@roeck-us.net>
Date:   Mon Dec 10 14:02:23 2018 -0800

    hwmon: (tmp421) Replace S_<PERMS> with octal values
    
    [ Upstream commit b626eb22f9e17fcca4e262a8274e93690068557f ]
    
    Replace S_<PERMS> with octal values.
    
    The conversion was done automatically with coccinelle. The semantic patches
    and the scripts used to generate this commit log are available at
    https://github.com/groeck/coccinelle-patches/hwmon/.
    
    This patch does not introduce functional changes. It was verified by
    compiling the old and new files and comparing text and data sizes.
    
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hwmon/tmp421.c b/drivers/hwmon/tmp421.c
index ceb3db6f3fdd..06826a78c0f4 100644
--- a/drivers/hwmon/tmp421.c
+++ b/drivers/hwmon/tmp421.c
@@ -187,9 +187,9 @@ static umode_t tmp421_is_visible(const void *data, enum hwmon_sensor_types type,
 	case hwmon_temp_fault:
 		if (channel == 0)
 			return 0;
-		return S_IRUGO;
+		return 0444;
 	case hwmon_temp_input:
-		return S_IRUGO;
+		return 0444;
 	default:
 		return 0;
 	}

commit 8c630a7b4f9dec63f08bd881ab77984a724a5124
Author: Xin Long <lucien.xin@gmail.com>
Date:   Thu Sep 23 00:05:04 2021 -0400

    sctp: break out if skb_header_pointer returns NULL in sctp_rcv_ootb
    
    [ Upstream commit f7e745f8e94492a8ac0b0a26e25f2b19d342918f ]
    
    We should always check if skb_header_pointer's return is NULL before
    using it, otherwise it may cause null-ptr-deref, as syzbot reported:
    
      KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007]
      RIP: 0010:sctp_rcv_ootb net/sctp/input.c:705 [inline]
      RIP: 0010:sctp_rcv+0x1d84/0x3220 net/sctp/input.c:196
      Call Trace:
      <IRQ>
       sctp6_rcv+0x38/0x60 net/sctp/ipv6.c:1109
       ip6_protocol_deliver_rcu+0x2e9/0x1ca0 net/ipv6/ip6_input.c:422
       ip6_input_finish+0x62/0x170 net/ipv6/ip6_input.c:463
       NF_HOOK include/linux/netfilter.h:307 [inline]
       NF_HOOK include/linux/netfilter.h:301 [inline]
       ip6_input+0x9c/0xd0 net/ipv6/ip6_input.c:472
       dst_input include/net/dst.h:460 [inline]
       ip6_rcv_finish net/ipv6/ip6_input.c:76 [inline]
       NF_HOOK include/linux/netfilter.h:307 [inline]
       NF_HOOK include/linux/netfilter.h:301 [inline]
       ipv6_rcv+0x28c/0x3c0 net/ipv6/ip6_input.c:297
    
    Fixes: 3acb50c18d8d ("sctp: delay as much as possible skb_linearize")
    Reported-by: syzbot+581aff2ae6b860625116@syzkaller.appspotmail.com
    Signed-off-by: Xin Long <lucien.xin@gmail.com>
    Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sctp/input.c b/net/sctp/input.c
index 8b7c07fc66d4..64dc2923a21b 100644
--- a/net/sctp/input.c
+++ b/net/sctp/input.c
@@ -687,7 +687,7 @@ static int sctp_rcv_ootb(struct sk_buff *skb)
 		ch = skb_header_pointer(skb, offset, sizeof(*ch), &_ch);
 
 		/* Break out if chunk length is less then minimal. */
-		if (ntohs(ch->length) < sizeof(_ch))
+		if (!ch || ntohs(ch->length) < sizeof(_ch))
 			break;
 
 		ch_end = offset + SCTP_PAD4(ntohs(ch->length));

commit 76538c7b4df314bb937e44c5cb1782f37d47443c
Author: Lorenzo Bianconi <lorenzo@kernel.org>
Date:   Mon Sep 20 14:45:22 2021 +0200

    mac80211: limit injected vht mcs/nss in ieee80211_parse_tx_radiotap
    
    [ Upstream commit 13cb6d826e0ac0d144b0d48191ff1a111d32f0c6 ]
    
    Limit max values for vht mcs and nss in ieee80211_parse_tx_radiotap
    routine in order to fix the following warning reported by syzbot:
    
    WARNING: CPU: 0 PID: 10717 at include/net/mac80211.h:989 ieee80211_rate_set_vht include/net/mac80211.h:989 [inline]
    WARNING: CPU: 0 PID: 10717 at include/net/mac80211.h:989 ieee80211_parse_tx_radiotap+0x101e/0x12d0 net/mac80211/tx.c:2244
    Modules linked in:
    CPU: 0 PID: 10717 Comm: syz-executor.5 Not tainted 5.14.0-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    RIP: 0010:ieee80211_rate_set_vht include/net/mac80211.h:989 [inline]
    RIP: 0010:ieee80211_parse_tx_radiotap+0x101e/0x12d0 net/mac80211/tx.c:2244
    RSP: 0018:ffffc9000186f3e8 EFLAGS: 00010216
    RAX: 0000000000000618 RBX: ffff88804ef76500 RCX: ffffc900143a5000
    RDX: 0000000000040000 RSI: ffffffff888f478e RDI: 0000000000000003
    RBP: 00000000ffffffff R08: 0000000000000000 R09: 0000000000000100
    R10: ffffffff888f46f9 R11: 0000000000000000 R12: 00000000fffffff8
    R13: ffff88804ef7653c R14: 0000000000000001 R15: 0000000000000004
    FS:  00007fbf5718f700(0000) GS:ffff8880b9c00000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 0000001b2de23000 CR3: 000000006a671000 CR4: 00000000001506f0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000600
    Call Trace:
     ieee80211_monitor_select_queue+0xa6/0x250 net/mac80211/iface.c:740
     netdev_core_pick_tx+0x169/0x2e0 net/core/dev.c:4089
     __dev_queue_xmit+0x6f9/0x3710 net/core/dev.c:4165
     __bpf_tx_skb net/core/filter.c:2114 [inline]
     __bpf_redirect_no_mac net/core/filter.c:2139 [inline]
     __bpf_redirect+0x5ba/0xd20 net/core/filter.c:2162
     ____bpf_clone_redirect net/core/filter.c:2429 [inline]
     bpf_clone_redirect+0x2ae/0x420 net/core/filter.c:2401
     bpf_prog_eeb6f53a69e5c6a2+0x59/0x234
     bpf_dispatcher_nop_func include/linux/bpf.h:717 [inline]
     __bpf_prog_run include/linux/filter.h:624 [inline]
     bpf_prog_run include/linux/filter.h:631 [inline]
     bpf_test_run+0x381/0xa30 net/bpf/test_run.c:119
     bpf_prog_test_run_skb+0xb84/0x1ee0 net/bpf/test_run.c:663
     bpf_prog_test_run kernel/bpf/syscall.c:3307 [inline]
     __sys_bpf+0x2137/0x5df0 kernel/bpf/syscall.c:4605
     __do_sys_bpf kernel/bpf/syscall.c:4691 [inline]
     __se_sys_bpf kernel/bpf/syscall.c:4689 [inline]
     __x64_sys_bpf+0x75/0xb0 kernel/bpf/syscall.c:4689
     do_syscall_x64 arch/x86/entry/common.c:50 [inline]
     do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    RIP: 0033:0x4665f9
    
    Reported-by: syzbot+0196ac871673f0c20f68@syzkaller.appspotmail.com
    Fixes: 646e76bb5daf4 ("mac80211: parse VHT info in injected frames")
    Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
    Link: https://lore.kernel.org/r/c26c3f02dcb38ab63b2f2534cb463d95ee81bb13.1632141760.git.lorenzo@kernel.org
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index adeee760ab4c..74045e927e04 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -2126,7 +2126,11 @@ static bool ieee80211_parse_tx_radiotap(struct ieee80211_local *local,
 			}
 
 			vht_mcs = iterator.this_arg[4] >> 4;
+			if (vht_mcs > 11)
+				vht_mcs = 0;
 			vht_nss = iterator.this_arg[4] & 0xF;
+			if (!vht_nss || vht_nss > 8)
+				vht_nss = 1;
 			break;
 
 		/*

commit 7056d1747042473dcdaa3b23734d3b9c31f6e9cd
Author: Chih-Kang Chang <gary.chang@realtek.com>
Date:   Mon Aug 30 15:32:40 2021 +0800

    mac80211: Fix ieee80211_amsdu_aggregate frag_tail bug
    
    [ Upstream commit fe94bac626d9c1c5bc98ab32707be8a9d7f8adba ]
    
    In ieee80211_amsdu_aggregate() set a pointer frag_tail point to the
    end of skb_shinfo(head)->frag_list, and use it to bind other skb in
    the end of this function. But when execute ieee80211_amsdu_aggregate()
    ->ieee80211_amsdu_realloc_pad()->pskb_expand_head(), the address of
    skb_shinfo(head)->frag_list will be changed. However, the
    ieee80211_amsdu_aggregate() not update frag_tail after call
    pskb_expand_head(). That will cause the second skb can't bind to the
    head skb appropriately.So we update the address of frag_tail to fix it.
    
    Fixes: 6e0456b54545 ("mac80211: add A-MSDU tx support")
    Signed-off-by: Chih-Kang Chang <gary.chang@realtek.com>
    Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
    Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
    Link: https://lore.kernel.org/r/20210830073240.12736-1-pkshih@realtek.com
    [reword comment]
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 5c5908127fcb..adeee760ab4c 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -3264,6 +3264,14 @@ static bool ieee80211_amsdu_aggregate(struct ieee80211_sub_if_data *sdata,
 	if (!ieee80211_amsdu_prepare_head(sdata, fast_tx, head))
 		goto out;
 
+	/* If n == 2, the "while (*frag_tail)" loop above didn't execute
+	 * and  frag_tail should be &skb_shinfo(head)->frag_list.
+	 * However, ieee80211_amsdu_prepare_head() can reallocate it.
+	 * Reload frag_tail to have it pointing to the correct place.
+	 */
+	if (n == 2)
+		frag_tail = &skb_shinfo(head)->frag_list;
+
 	/*
 	 * Pad out the previous subframe to a multiple of 4 by adding the
 	 * padding to the next one, that's being added. Note that head->len

commit 5c6e0bce647d9cb32a17d58ffa669b3421fcc6ca
Author: Vadim Pasternak <vadimp@nvidia.com>
Date:   Thu Sep 16 21:31:51 2021 +0300

    hwmon: (mlxreg-fan) Return non-zero value when fan current state is enforced from sysfs
    
    [ Upstream commit e6fab7af6ba1bc77c78713a83876f60ca7a4a064 ]
    
    Fan speed minimum can be enforced from sysfs. For example, setting
    current fan speed to 20 is used to enforce fan speed to be at 100%
    speed, 19 - to be not below 90% speed, etcetera. This feature provides
    ability to limit fan speed according to some system wise
    considerations, like absence of some replaceable units or high system
    ambient temperature.
    
    Request for changing fan minimum speed is configuration request and can
    be set only through 'sysfs' write procedure. In this situation value of
    argument 'state' is above nominal fan speed maximum.
    
    Return non-zero code in this case to avoid
    thermal_cooling_device_stats_update() call, because in this case
    statistics update violates thermal statistics table range.
    The issues is observed in case kernel is configured with option
    CONFIG_THERMAL_STATISTICS.
    
    Here is the trace from KASAN:
    [  159.506659] BUG: KASAN: slab-out-of-bounds in thermal_cooling_device_stats_update+0x7d/0xb0
    [  159.516016] Read of size 4 at addr ffff888116163840 by task hw-management.s/7444
    [  159.545625] Call Trace:
    [  159.548366]  dump_stack+0x92/0xc1
    [  159.552084]  ? thermal_cooling_device_stats_update+0x7d/0xb0
    [  159.635869]  thermal_zone_device_update+0x345/0x780
    [  159.688711]  thermal_zone_device_set_mode+0x7d/0xc0
    [  159.694174]  mlxsw_thermal_modules_init+0x48f/0x590 [mlxsw_core]
    [  159.700972]  ? mlxsw_thermal_set_cur_state+0x5a0/0x5a0 [mlxsw_core]
    [  159.731827]  mlxsw_thermal_init+0x763/0x880 [mlxsw_core]
    [  160.070233] RIP: 0033:0x7fd995909970
    [  160.074239] Code: 73 01 c3 48 8b 0d 28 d5 2b 00 f7 d8 64 89 01 48 83 c8 ff c3 66 0f 1f 44 00 00 83 3d 99 2d 2c 00 00 75 10 b8 01 00 00 00 0f 05 <48> 3d 01 f0 ff ..
    [  160.095242] RSP: 002b:00007fff54f5d938 EFLAGS: 00000246 ORIG_RAX: 0000000000000001
    [  160.103722] RAX: ffffffffffffffda RBX: 0000000000000013 RCX: 00007fd995909970
    [  160.111710] RDX: 0000000000000013 RSI: 0000000001906008 RDI: 0000000000000001
    [  160.119699] RBP: 0000000001906008 R08: 00007fd995bc9760 R09: 00007fd996210700
    [  160.127687] R10: 0000000000000073 R11: 0000000000000246 R12: 0000000000000013
    [  160.135673] R13: 0000000000000001 R14: 00007fd995bc8600 R15: 0000000000000013
    [  160.143671]
    [  160.145338] Allocated by task 2924:
    [  160.149242]  kasan_save_stack+0x19/0x40
    [  160.153541]  __kasan_kmalloc+0x7f/0xa0
    [  160.157743]  __kmalloc+0x1a2/0x2b0
    [  160.161552]  thermal_cooling_device_setup_sysfs+0xf9/0x1a0
    [  160.167687]  __thermal_cooling_device_register+0x1b5/0x500
    [  160.173833]  devm_thermal_of_cooling_device_register+0x60/0xa0
    [  160.180356]  mlxreg_fan_probe+0x474/0x5e0 [mlxreg_fan]
    [  160.248140]
    [  160.249807] The buggy address belongs to the object at ffff888116163400
    [  160.249807]  which belongs to the cache kmalloc-1k of size 1024
    [  160.263814] The buggy address is located 64 bytes to the right of
    [  160.263814]  1024-byte region [ffff888116163400, ffff888116163800)
    [  160.277536] The buggy address belongs to the page:
    [  160.282898] page:0000000012275840 refcount:1 mapcount:0 mapping:0000000000000000 index:0xffff888116167000 pfn:0x116160
    [  160.294872] head:0000000012275840 order:3 compound_mapcount:0 compound_pincount:0
    [  160.303251] flags: 0x200000000010200(slab|head|node=0|zone=2)
    [  160.309694] raw: 0200000000010200 ffffea00046f7208 ffffea0004928208 ffff88810004dbc0
    [  160.318367] raw: ffff888116167000 00000000000a0006 00000001ffffffff 0000000000000000
    [  160.327033] page dumped because: kasan: bad access detected
    [  160.333270]
    [  160.334937] Memory state around the buggy address:
    [  160.356469] >ffff888116163800: fc ..
    
    Fixes: 65afb4c8e7e4 ("hwmon: (mlxreg-fan) Add support for Mellanox FAN driver")
    Signed-off-by: Vadim Pasternak <vadimp@nvidia.com>
    Link: https://lore.kernel.org/r/20210916183151.869427-1-vadimp@nvidia.com
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hwmon/mlxreg-fan.c b/drivers/hwmon/mlxreg-fan.c
index d8fa4bea4bc8..e57b0c5119ce 100644
--- a/drivers/hwmon/mlxreg-fan.c
+++ b/drivers/hwmon/mlxreg-fan.c
@@ -307,8 +307,8 @@ static int mlxreg_fan_set_cur_state(struct thermal_cooling_device *cdev,
 {
 	struct mlxreg_fan *fan = cdev->devdata;
 	unsigned long cur_state;
+	int i, config = 0;
 	u32 regval;
-	int i;
 	int err;
 
 	/*
@@ -321,6 +321,12 @@ static int mlxreg_fan_set_cur_state(struct thermal_cooling_device *cdev,
 	 * overwritten.
 	 */
 	if (state >= MLXREG_FAN_SPEED_MIN && state <= MLXREG_FAN_SPEED_MAX) {
+		/*
+		 * This is configuration change, which is only supported through sysfs.
+		 * For configuration non-zero value is to be returned to avoid thermal
+		 * statistics update.
+		 */
+		config = 1;
 		state -= MLXREG_FAN_MAX_STATE;
 		for (i = 0; i < state; i++)
 			fan->cooling_levels[i] = state;
@@ -335,7 +341,7 @@ static int mlxreg_fan_set_cur_state(struct thermal_cooling_device *cdev,
 
 		cur_state = MLXREG_FAN_PWM_DUTY2STATE(regval);
 		if (state < cur_state)
-			return 0;
+			return config;
 
 		state = cur_state;
 	}
@@ -351,7 +357,7 @@ static int mlxreg_fan_set_cur_state(struct thermal_cooling_device *cdev,
 		dev_err(fan->dev, "Failed to write PWM duty\n");
 		return err;
 	}
-	return 0;
+	return config;
 }
 
 static const struct thermal_cooling_device_ops mlxreg_fan_cooling_ops = {

commit 23f30f9f87723e8584962015f30fe4ae2e929297
Author: Andrea Claudi <aclaudi@redhat.com>
Date:   Fri Sep 10 18:08:39 2021 +0200

    ipvs: check that ip_vs_conn_tab_bits is between 8 and 20
    
    [ Upstream commit 69e73dbfda14fbfe748d3812da1244cce2928dcb ]
    
    ip_vs_conn_tab_bits may be provided by the user through the
    conn_tab_bits module parameter. If this value is greater than 31, or
    less than 0, the shift operator used to derive tab_size causes undefined
    behaviour.
    
    Fix this checking ip_vs_conn_tab_bits value to be in the range specified
    in ipvs Kconfig. If not, simply use default value.
    
    Fixes: 6f7edb4881bf ("IPVS: Allow boot time change of hash size")
    Reported-by: Yi Chen <yiche@redhat.com>
    Signed-off-by: Andrea Claudi <aclaudi@redhat.com>
    Acked-by: Julian Anastasov <ja@ssi.bg>
    Acked-by: Simon Horman <horms@verge.net.au>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c
index 5b2b17867cb1..2780a847701e 100644
--- a/net/netfilter/ipvs/ip_vs_conn.c
+++ b/net/netfilter/ipvs/ip_vs_conn.c
@@ -1399,6 +1399,10 @@ int __init ip_vs_conn_init(void)
 	int idx;
 
 	/* Compute size and mask */
+	if (ip_vs_conn_tab_bits < 8 || ip_vs_conn_tab_bits > 20) {
+		pr_info("conn_tab_bits not in [8, 20]. Using default value\n");
+		ip_vs_conn_tab_bits = CONFIG_IP_VS_TAB_BITS;
+	}
 	ip_vs_conn_tab_size = 1 << ip_vs_conn_tab_bits;
 	ip_vs_conn_tab_mask = ip_vs_conn_tab_size - 1;
 

commit d1e851cf07cb39db20489130406879c7d17b6675
Author: Charlene Liu <Charlene.Liu@amd.com>
Date:   Mon Sep 20 14:30:02 2021 -0400

    drm/amd/display: Pass PCI deviceid into DC
    
    commit d942856865c733ff60450de9691af796ad71d7bc upstream.
    
    [why]
    pci deviceid not passed to dal dc, without proper break,
    dcn2.x falls into dcn3.x code path
    
    [how]
    pass in pci deviceid, and break once dal_version initialized.
    
    Reviewed-by: Zhan Liu <Zhan.Liu@amd.com>
    Acked-by: Anson Jacob <Anson.Jacob@amd.com>
    Signed-off-by: Charlene Liu <Charlene.Liu@amd.com>
    Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 62a2f0491117..ed02bb6b2cd0 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -412,6 +412,7 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
 
 	init_data.asic_id.pci_revision_id = adev->rev_id;
 	init_data.asic_id.hw_internal_rev = adev->external_rev_id;
+	init_data.asic_id.chip_id = adev->pdev->device;
 
 	init_data.asic_id.vram_width = adev->gmc.vram_width;
 	/* TODO: initialize init_data.asic_id.vram_type here!!!! */

commit f6ba8a8c3782287a72aed2b99fac7dd5e29d1e9d
Author: Zelin Deng <zelin.deng@linux.alibaba.com>
Date:   Wed Sep 29 13:13:48 2021 +0800

    x86/kvmclock: Move this_cpu_pvti into kvmclock.h
    
    commit ad9af930680bb396c87582edc172b3a7cf2a3fbf upstream.
    
    There're other modules might use hv_clock_per_cpu variable like ptp_kvm,
    so move it into kvmclock.h and export the symbol to make it visiable to
    other modules.
    
    Signed-off-by: Zelin Deng <zelin.deng@linux.alibaba.com>
    Cc: <stable@vger.kernel.org>
    Message-Id: <1632892429-101194-2-git-send-email-zelin.deng@linux.alibaba.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/include/asm/kvmclock.h b/arch/x86/include/asm/kvmclock.h
index eceea9299097..6c5765192102 100644
--- a/arch/x86/include/asm/kvmclock.h
+++ b/arch/x86/include/asm/kvmclock.h
@@ -2,6 +2,20 @@
 #ifndef _ASM_X86_KVM_CLOCK_H
 #define _ASM_X86_KVM_CLOCK_H
 
+#include <linux/percpu.h>
+
 extern struct clocksource kvm_clock;
 
+DECLARE_PER_CPU(struct pvclock_vsyscall_time_info *, hv_clock_per_cpu);
+
+static inline struct pvclock_vcpu_time_info *this_cpu_pvti(void)
+{
+	return &this_cpu_read(hv_clock_per_cpu)->pvti;
+}
+
+static inline struct pvclock_vsyscall_time_info *this_cpu_hvclock(void)
+{
+	return this_cpu_read(hv_clock_per_cpu);
+}
+
 #endif /* _ASM_X86_KVM_CLOCK_H */
diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c
index 2ec202cb9dfd..6752d3768d77 100644
--- a/arch/x86/kernel/kvmclock.c
+++ b/arch/x86/kernel/kvmclock.c
@@ -64,18 +64,9 @@ early_param("no-kvmclock-vsyscall", parse_no_kvmclock_vsyscall);
 static struct pvclock_vsyscall_time_info
 			hv_clock_boot[HVC_BOOT_ARRAY_SIZE] __bss_decrypted __aligned(PAGE_SIZE);
 static struct pvclock_wall_clock wall_clock __bss_decrypted;
-static DEFINE_PER_CPU(struct pvclock_vsyscall_time_info *, hv_clock_per_cpu);
 static struct pvclock_vsyscall_time_info *hvclock_mem;
-
-static inline struct pvclock_vcpu_time_info *this_cpu_pvti(void)
-{
-	return &this_cpu_read(hv_clock_per_cpu)->pvti;
-}
-
-static inline struct pvclock_vsyscall_time_info *this_cpu_hvclock(void)
-{
-	return this_cpu_read(hv_clock_per_cpu);
-}
+DEFINE_PER_CPU(struct pvclock_vsyscall_time_info *, hv_clock_per_cpu);
+EXPORT_PER_CPU_SYMBOL_GPL(hv_clock_per_cpu);
 
 /*
  * The wallclock is the time of day when we booted. Since then, some time may

commit 3d5d629c99c468458022e9b381789de3595bf4dd
Author: Johannes Berg <johannes.berg@intel.com>
Date:   Mon Sep 27 11:58:39 2021 +0200

    mac80211: fix use-after-free in CCMP/GCMP RX
    
    commit 94513069eb549737bcfc3d988d6ed4da948a2de8 upstream.
    
    When PN checking is done in mac80211, for fragmentation we need
    to copy the PN to the RX struct so we can later use it to do a
    comparison, since commit bf30ca922a0c ("mac80211: check defrag
    PN against current frame").
    
    Unfortunately, in that commit I used the 'hdr' variable without
    it being necessarily valid, so use-after-free could occur if it
    was necessary to reallocate (parts of) the frame.
    
    Fix this by reloading the variable after the code that results
    in the reallocations, if any.
    
    This fixes https://bugzilla.kernel.org/show_bug.cgi?id=214401.
    
    Cc: stable@vger.kernel.org
    Fixes: bf30ca922a0c ("mac80211: check defrag PN against current frame")
    Link: https://lore.kernel.org/r/20210927115838.12b9ac6bb233.I1d066acd5408a662c3b6e828122cd314fcb28cdb@changeid
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/mac80211/wpa.c b/net/mac80211/wpa.c
index dbeccccf0fdf..b1d2e2b54f85 100644
--- a/net/mac80211/wpa.c
+++ b/net/mac80211/wpa.c
@@ -523,6 +523,9 @@ ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx,
 			return RX_DROP_UNUSABLE;
 	}
 
+	/* reload hdr - skb might have been reallocated */
+	hdr = (void *)rx->skb->data;
+
 	data_len = skb->len - hdrlen - IEEE80211_CCMP_HDR_LEN - mic_len;
 	if (!rx->sta || data_len < 0)
 		return RX_DROP_UNUSABLE;
@@ -752,6 +755,9 @@ ieee80211_crypto_gcmp_decrypt(struct ieee80211_rx_data *rx)
 			return RX_DROP_UNUSABLE;
 	}
 
+	/* reload hdr - skb might have been reallocated */
+	hdr = (void *)rx->skb->data;
+
 	data_len = skb->len - hdrlen - IEEE80211_GCMP_HDR_LEN - mic_len;
 	if (!rx->sta || data_len < 0)
 		return RX_DROP_UNUSABLE;

commit 3cb9595e23d879824ebcefeabdf5156bc288000c
Author: James Morse <james.morse@arm.com>
Date:   Tue Sep 14 16:56:23 2021 +0000

    cpufreq: schedutil: Destroy mutex before kobject_put() frees the memory
    
    [ Upstream commit cdef1196608892b9a46caa5f2b64095a7f0be60c ]
    
    Since commit e5c6b312ce3c ("cpufreq: schedutil: Use kobject release()
    method to free sugov_tunables") kobject_put() has kfree()d the
    attr_set before gov_attr_set_put() returns.
    
    kobject_put() isn't the last user of attr_set in gov_attr_set_put(),
    the subsequent mutex_destroy() triggers a use-after-free:
    | BUG: KASAN: use-after-free in mutex_is_locked+0x20/0x60
    | Read of size 8 at addr ffff000800ca4250 by task cpuhp/2/20
    |
    | CPU: 2 PID: 20 Comm: cpuhp/2 Not tainted 5.15.0-rc1 #12369
    | Hardware name: ARM LTD ARM Juno Development Platform/ARM Juno Development
    | Platform, BIOS EDK II Jul 30 2018
    | Call trace:
    |  dump_backtrace+0x0/0x380
    |  show_stack+0x1c/0x30
    |  dump_stack_lvl+0x8c/0xb8
    |  print_address_description.constprop.0+0x74/0x2b8
    |  kasan_report+0x1f4/0x210
    |  kasan_check_range+0xfc/0x1a4
    |  __kasan_check_read+0x38/0x60
    |  mutex_is_locked+0x20/0x60
    |  mutex_destroy+0x80/0x100
    |  gov_attr_set_put+0xfc/0x150
    |  sugov_exit+0x78/0x190
    |  cpufreq_offline.isra.0+0x2c0/0x660
    |  cpuhp_cpufreq_offline+0x14/0x24
    |  cpuhp_invoke_callback+0x430/0x6d0
    |  cpuhp_thread_fun+0x1b0/0x624
    |  smpboot_thread_fn+0x5e0/0xa6c
    |  kthread+0x3a0/0x450
    |  ret_from_fork+0x10/0x20
    
    Swap the order of the calls.
    
    Fixes: e5c6b312ce3c ("cpufreq: schedutil: Use kobject release() method to free sugov_tunables")
    Cc: 4.7+ <stable@vger.kernel.org> # 4.7+
    Signed-off-by: James Morse <james.morse@arm.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/cpufreq/cpufreq_governor_attr_set.c b/drivers/cpufreq/cpufreq_governor_attr_set.c
index 52841f807a7e..45fdf30cade3 100644
--- a/drivers/cpufreq/cpufreq_governor_attr_set.c
+++ b/drivers/cpufreq/cpufreq_governor_attr_set.c
@@ -77,8 +77,8 @@ unsigned int gov_attr_set_put(struct gov_attr_set *attr_set, struct list_head *l
 	if (count)
 		return count;
 
-	kobject_put(&attr_set->kobj);
 	mutex_destroy(&attr_set->update_lock);
+	kobject_put(&attr_set->kobj);
 	return 0;
 }
 EXPORT_SYMBOL_GPL(gov_attr_set_put);

commit 30d57cf2c4116ca6d34ecd1cac94ad84f8bc446c
Author: Kevin Hao <haokexin@gmail.com>
Date:   Thu Aug 5 15:29:17 2021 +0800

    cpufreq: schedutil: Use kobject release() method to free sugov_tunables
    
    [ Upstream commit e5c6b312ce3cc97e90ea159446e6bfa06645364d ]
    
    The struct sugov_tunables is protected by the kobject, so we can't free
    it directly. Otherwise we would get a call trace like this:
      ODEBUG: free active (active state 0) object type: timer_list hint: delayed_work_timer_fn+0x0/0x30
      WARNING: CPU: 3 PID: 720 at lib/debugobjects.c:505 debug_print_object+0xb8/0x100
      Modules linked in:
      CPU: 3 PID: 720 Comm: a.sh Tainted: G        W         5.14.0-rc1-next-20210715-yocto-standard+ #507
      Hardware name: Marvell OcteonTX CN96XX board (DT)
      pstate: 40400009 (nZcv daif +PAN -UAO -TCO BTYPE=--)
      pc : debug_print_object+0xb8/0x100
      lr : debug_print_object+0xb8/0x100
      sp : ffff80001ecaf910
      x29: ffff80001ecaf910 x28: ffff00011b10b8d0 x27: ffff800011043d80
      x26: ffff00011a8f0000 x25: ffff800013cb3ff0 x24: 0000000000000000
      x23: ffff80001142aa68 x22: ffff800011043d80 x21: ffff00010de46f20
      x20: ffff800013c0c520 x19: ffff800011d8f5b0 x18: 0000000000000010
      x17: 6e6968207473696c x16: 5f72656d6974203a x15: 6570797420746365
      x14: 6a626f2029302065 x13: 303378302f307830 x12: 2b6e665f72656d69
      x11: ffff8000124b1560 x10: ffff800012331520 x9 : ffff8000100ca6b0
      x8 : 000000000017ffe8 x7 : c0000000fffeffff x6 : 0000000000000001
      x5 : ffff800011d8c000 x4 : ffff800011d8c740 x3 : 0000000000000000
      x2 : ffff0001108301c0 x1 : ab3c90eedf9c0f00 x0 : 0000000000000000
      Call trace:
       debug_print_object+0xb8/0x100
       __debug_check_no_obj_freed+0x1c0/0x230
       debug_check_no_obj_freed+0x20/0x88
       slab_free_freelist_hook+0x154/0x1c8
       kfree+0x114/0x5d0
       sugov_exit+0xbc/0xc0
       cpufreq_exit_governor+0x44/0x90
       cpufreq_set_policy+0x268/0x4a8
       store_scaling_governor+0xe0/0x128
       store+0xc0/0xf0
       sysfs_kf_write+0x54/0x80
       kernfs_fop_write_iter+0x128/0x1c0
       new_sync_write+0xf0/0x190
       vfs_write+0x2d4/0x478
       ksys_write+0x74/0x100
       __arm64_sys_write+0x24/0x30
       invoke_syscall.constprop.0+0x54/0xe0
       do_el0_svc+0x64/0x158
       el0_svc+0x2c/0xb0
       el0t_64_sync_handler+0xb0/0xb8
       el0t_64_sync+0x198/0x19c
      irq event stamp: 5518
      hardirqs last  enabled at (5517): [<ffff8000100cbd7c>] console_unlock+0x554/0x6c8
      hardirqs last disabled at (5518): [<ffff800010fc0638>] el1_dbg+0x28/0xa0
      softirqs last  enabled at (5504): [<ffff8000100106e0>] __do_softirq+0x4d0/0x6c0
      softirqs last disabled at (5483): [<ffff800010049548>] irq_exit+0x1b0/0x1b8
    
    So split the original sugov_tunables_free() into two functions,
    sugov_clear_global_tunables() is just used to clear the global_tunables
    and the new sugov_tunables_free() is used as kobj_type::release to
    release the sugov_tunables safely.
    
    Fixes: 9bdcb44e391d ("cpufreq: schedutil: New governor based on scheduler utilization data")
    Cc: 4.7+ <stable@vger.kernel.org> # 4.7+
    Signed-off-by: Kevin Hao <haokexin@gmail.com>
    Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c
index 1b7ec822dc75..60f0e0e048f0 100644
--- a/kernel/sched/cpufreq_schedutil.c
+++ b/kernel/sched/cpufreq_schedutil.c
@@ -591,9 +591,17 @@ static struct attribute *sugov_attributes[] = {
 	NULL
 };
 
+static void sugov_tunables_free(struct kobject *kobj)
+{
+	struct gov_attr_set *attr_set = container_of(kobj, struct gov_attr_set, kobj);
+
+	kfree(to_sugov_tunables(attr_set));
+}
+
 static struct kobj_type sugov_tunables_ktype = {
 	.default_attrs = sugov_attributes,
 	.sysfs_ops = &governor_sysfs_ops,
+	.release = &sugov_tunables_free,
 };
 
 /********************** cpufreq governor interface *********************/
@@ -693,12 +701,10 @@ static struct sugov_tunables *sugov_tunables_alloc(struct sugov_policy *sg_polic
 	return tunables;
 }
 
-static void sugov_tunables_free(struct sugov_tunables *tunables)
+static void sugov_clear_global_tunables(void)
 {
 	if (!have_governor_per_policy())
 		global_tunables = NULL;
-
-	kfree(tunables);
 }
 
 static int sugov_init(struct cpufreq_policy *policy)
@@ -761,7 +767,7 @@ static int sugov_init(struct cpufreq_policy *policy)
 fail:
 	kobject_put(&tunables->attr_set.kobj);
 	policy->governor_data = NULL;
-	sugov_tunables_free(tunables);
+	sugov_clear_global_tunables();
 
 stop_kthread:
 	sugov_kthread_stop(sg_policy);
@@ -788,7 +794,7 @@ static void sugov_exit(struct cpufreq_policy *policy)
 	count = gov_attr_set_put(&tunables->attr_set, &sg_policy->tunables_hook);
 	policy->governor_data = NULL;
 	if (!count)
-		sugov_tunables_free(tunables);
+		sugov_clear_global_tunables();
 
 	mutex_unlock(&global_tunables_lock);
 

commit 8a6a240f52e14356386030d8958ae8b1761d2325
Author: Igor Matheus Andrade Torrente <igormtorrente@gmail.com>
Date:   Mon Jun 28 10:45:09 2021 -0300

    tty: Fix out-of-bound vmalloc access in imageblit
    
    [ Upstream commit 3b0c406124719b625b1aba431659f5cdc24a982c ]
    
    This issue happens when a userspace program does an ioctl
    FBIOPUT_VSCREENINFO passing the fb_var_screeninfo struct
    containing only the fields xres, yres, and bits_per_pixel
    with values.
    
    If this struct is the same as the previous ioctl, the
    vc_resize() detects it and doesn't call the resize_screen(),
    leaving the fb_var_screeninfo incomplete. And this leads to
    the updatescrollmode() calculates a wrong value to
    fbcon_display->vrows, which makes the real_y() return a
    wrong value of y, and that value, eventually, causes
    the imageblit to access an out-of-bound address value.
    
    To solve this issue I made the resize_screen() be called
    even if the screen does not need any resizing, so it will
    "fix and fill" the fb_var_screeninfo independently.
    
    Cc: stable <stable@vger.kernel.org> # after 5.15-rc2 is out, give it time to bake
    Reported-and-tested-by: syzbot+858dc7a2f7ef07c2c219@syzkaller.appspotmail.com
    Signed-off-by: Igor Matheus Andrade Torrente <igormtorrente@gmail.com>
    Link: https://lore.kernel.org/r/20210628134509.15895-1-igormtorrente@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index b2b5f19fb2fb..72e3989dffa6 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -1218,8 +1218,25 @@ static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc,
 	new_row_size = new_cols << 1;
 	new_screen_size = new_row_size * new_rows;
 
-	if (new_cols == vc->vc_cols && new_rows == vc->vc_rows)
-		return 0;
+	if (new_cols == vc->vc_cols && new_rows == vc->vc_rows) {
+		/*
+		 * This function is being called here to cover the case
+		 * where the userspace calls the FBIOPUT_VSCREENINFO twice,
+		 * passing the same fb_var_screeninfo containing the fields
+		 * yres/xres equal to a number non-multiple of vc_font.height
+		 * and yres_virtual/xres_virtual equal to number lesser than the
+		 * vc_font.height and yres/xres.
+		 * In the second call, the struct fb_var_screeninfo isn't
+		 * being modified by the underlying driver because of the
+		 * if above, and this causes the fbcon_display->vrows to become
+		 * negative and it eventually leads to out-of-bound
+		 * access by the imageblit function.
+		 * To give the correct values to the struct and to not have
+		 * to deal with possible errors from the code below, we call
+		 * the resize_screen here as well.
+		 */
+		return resize_screen(vc, new_cols, new_rows, user);
+	}
 
 	if (new_screen_size > KMALLOC_MAX_SIZE || !new_screen_size)
 		return -EINVAL;

commit a4250df12f44ec736c4e30ece86a63a2c379663b
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date:   Mon Sep 20 10:26:21 2021 -0700

    qnx4: work around gcc false positive warning bug
    
    commit d5f6545934c47e97c0b48a645418e877b452a992 upstream.
    
    In commit b7213ffa0e58 ("qnx4: avoid stringop-overread errors") I tried
    to teach gcc about how the directory entry structure can be two
    different things depending on a status flag.  It made the code clearer,
    and it seemed to make gcc happy.
    
    However, Arnd points to a gcc bug, where despite using two different
    members of a union, gcc then gets confused, and uses the size of one of
    the members to decide if a string overrun happens.  And not necessarily
    the rigth one.
    
    End result: with some configurations, gcc-11 will still complain about
    the source buffer size being overread:
    
      fs/qnx4/dir.c: In function 'qnx4_readdir':
      fs/qnx4/dir.c:76:32: error: 'strnlen' specified bound [16, 48] exceeds source size 1 [-Werror=stringop-overread]
         76 |                         size = strnlen(name, size);
            |                                ^~~~~~~~~~~~~~~~~~~
      fs/qnx4/dir.c:26:22: note: source object declared here
         26 |                 char de_name;
            |                      ^~~~~~~
    
    because gcc will get confused about which union member entry is actually
    getting accessed, even when the source code is very clear about it.  Gcc
    internally will have combined two "redundant" pointers (pointing to
    different union elements that are at the same offset), and takes the
    size checking from one or the other - not necessarily the right one.
    
    This is clearly a gcc bug, but we can work around it fairly easily.  The
    biggest thing here is the big honking comment about why we do what we
    do.
    
    Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99578#c6
    Reported-and-tested-by: Arnd Bergmann <arnd@kernel.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/qnx4/dir.c b/fs/qnx4/dir.c
index 2a66844b7ff8..66645a5a35f3 100644
--- a/fs/qnx4/dir.c
+++ b/fs/qnx4/dir.c
@@ -20,12 +20,33 @@
  * depending on the status field in the last byte. The
  * first byte is where the name start either way, and a
  * zero means it's empty.
+ *
+ * Also, due to a bug in gcc, we don't want to use the
+ * real (differently sized) name arrays in the inode and
+ * link entries, but always the 'de_name[]' one in the
+ * fake struct entry.
+ *
+ * See
+ *
+ *   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99578#c6
+ *
+ * for details, but basically gcc will take the size of the
+ * 'name' array from one of the used union entries randomly.
+ *
+ * This use of 'de_name[]' (48 bytes) avoids the false positive
+ * warnings that would happen if gcc decides to use 'inode.di_name'
+ * (16 bytes) even when the pointer and size were to come from
+ * 'link.dl_name' (48 bytes).
+ *
+ * In all cases the actual name pointer itself is the same, it's
+ * only the gcc internal 'what is the size of this field' logic
+ * that can get confused.
  */
 union qnx4_directory_entry {
 	struct {
-		char de_name;
-		char de_pad[62];
-		char de_status;
+		const char de_name[48];
+		u8 de_pad[15];
+		u8 de_status;
 	};
 	struct qnx4_inode_entry inode;
 	struct qnx4_link_info link;
@@ -53,29 +74,26 @@ static int qnx4_readdir(struct file *file, struct dir_context *ctx)
 		ix = (ctx->pos >> QNX4_DIR_ENTRY_SIZE_BITS) % QNX4_INODES_PER_BLOCK;
 		for (; ix < QNX4_INODES_PER_BLOCK; ix++, ctx->pos += QNX4_DIR_ENTRY_SIZE) {
 			union qnx4_directory_entry *de;
-			const char *name;
 
 			offset = ix * QNX4_DIR_ENTRY_SIZE;
 			de = (union qnx4_directory_entry *) (bh->b_data + offset);
 
-			if (!de->de_name)
+			if (!de->de_name[0])
 				continue;
 			if (!(de->de_status & (QNX4_FILE_USED|QNX4_FILE_LINK)))
 				continue;
 			if (!(de->de_status & QNX4_FILE_LINK)) {
 				size = sizeof(de->inode.di_fname);
-				name = de->inode.di_fname;
 				ino = blknum * QNX4_INODES_PER_BLOCK + ix - 1;
 			} else {
 				size = sizeof(de->link.dl_fname);
-				name = de->link.dl_fname;
 				ino = ( le32_to_cpu(de->link.dl_inode_blk) - 1 ) *
 					QNX4_INODES_PER_BLOCK +
 					de->link.dl_inode_ndx;
 			}
-			size = strnlen(name, size);
+			size = strnlen(de->de_name, size);
 			QNX4DEBUG((KERN_INFO "qnx4_readdir:%.*s\n", size, name));
-			if (!dir_emit(ctx, name, size, ino, DT_UNKNOWN)) {
+			if (!dir_emit(ctx, de->de_name, size, ino, DT_UNKNOWN)) {
 				brelse(bh);
 				return 0;
 			}

commit eb382bc0a7976d2ce1645fcfbf2e982d19c495d3
Author: Juergen Gross <jgross@suse.com>
Date:   Mon Sep 20 12:03:45 2021 +0200

    xen/balloon: fix balloon kthread freezing
    
    commit 96f5bd03e1be606987644b71899ea56a8d05f825 upstream.
    
    Commit 8480ed9c2bbd56 ("xen/balloon: use a kernel thread instead a
    workqueue") switched the Xen balloon driver to use a kernel thread.
    Unfortunately the patch omitted to call try_to_freeze() or to use
    wait_event_freezable_timeout(), causing a system suspend to fail.
    
    Fixes: 8480ed9c2bbd56 ("xen/balloon: use a kernel thread instead a workqueue")
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Link: https://lore.kernel.org/r/20210920100345.21939-1-jgross@suse.com
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
index 643dbe5620e8..2459e2afd65e 100644
--- a/drivers/xen/balloon.c
+++ b/drivers/xen/balloon.c
@@ -539,8 +539,8 @@ static int balloon_thread(void *unused)
 			timeout = 3600 * HZ;
 		credit = current_credit();
 
-		wait_event_interruptible_timeout(balloon_thread_wq,
-				 balloon_thread_cond(state, credit), timeout);
+		wait_event_freezable_timeout(balloon_thread_wq,
+			balloon_thread_cond(state, credit), timeout);
 
 		if (kthread_should_stop())
 			return 0;

commit 03e606e751fbc7179044045603e200346e56be80
Author: Eric Dumazet <edumazet@google.com>
Date:   Mon Sep 30 15:44:44 2019 -0700

    tcp: adjust rto_base in retransmits_timed_out()
    
    commit 3256a2d6ab1f71f9a1bd2d7f6f18eb8108c48d17 upstream.
    
    The cited commit exposed an old retransmits_timed_out() bug
    which assumed it could call tcp_model_timeout() with
    TCP_RTO_MIN as rto_base for all states.
    
    But flows in SYN_SENT or SYN_RECV state uses a different
    RTO base (1 sec instead of 200 ms, unless BPF choses
    another value)
    
    This caused a reduction of SYN retransmits from 6 to 4 with
    the default /proc/sys/net/ipv4/tcp_syn_retries value.
    
    Fixes: a41e8a88b06e ("tcp: better handle TCP_USER_TIMEOUT in SYN_SENT state")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Cc: Yuchung Cheng <ycheng@google.com>
    Cc: Marek Majkowski <marek@cloudflare.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Qiumiao Zhang <zhangqiumiao1@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c
index 9e9507f125a2..d071ed6b8b9a 100644
--- a/net/ipv4/tcp_timer.c
+++ b/net/ipv4/tcp_timer.c
@@ -197,8 +197,13 @@ static bool retransmits_timed_out(struct sock *sk,
 		return false;
 
 	start_ts = tcp_sk(sk)->retrans_stamp;
-	if (likely(timeout == 0))
-		timeout = tcp_model_timeout(sk, boundary, TCP_RTO_MIN);
+	if (likely(timeout == 0)) {
+		unsigned int rto_base = TCP_RTO_MIN;
+
+		if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV))
+			rto_base = tcp_timeout_init(sk);
+		timeout = tcp_model_timeout(sk, boundary, rto_base);
+	}
 
 	return (s32)(tcp_time_stamp(tcp_sk(sk)) - start_ts - timeout) >= 0;
 }

commit db0fd9c9a6eb1173ec453f8cbffd20a464a47a61
Author: Yuchung Cheng <ycheng@google.com>
Date:   Wed Jan 16 15:05:32 2019 -0800

    tcp: create a helper to model exponential backoff
    
    commit 01a523b071618abbc634d1958229fe3bd2dfa5fa upstream.
    
    Create a helper to model TCP exponential backoff for the next patch.
    This is pure refactor w no behavior change.
    
    Signed-off-by: Yuchung Cheng <ycheng@google.com>
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reviewed-by: Neal Cardwell <ncardwell@google.com>
    Reviewed-by: Soheil Hassas Yeganeh <soheil@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Qiumiao Zhang <zhangqiumiao1@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c
index 9a904bf8decc..9e9507f125a2 100644
--- a/net/ipv4/tcp_timer.c
+++ b/net/ipv4/tcp_timer.c
@@ -160,7 +160,20 @@ static void tcp_mtu_probing(struct inet_connection_sock *icsk, struct sock *sk)
 	tcp_sync_mss(sk, icsk->icsk_pmtu_cookie);
 }
 
-
+static unsigned int tcp_model_timeout(struct sock *sk,
+				      unsigned int boundary,
+				      unsigned int rto_base)
+{
+	unsigned int linear_backoff_thresh, timeout;
+
+	linear_backoff_thresh = ilog2(TCP_RTO_MAX / rto_base);
+	if (boundary <= linear_backoff_thresh)
+		timeout = ((2 << boundary) - 1) * rto_base;
+	else
+		timeout = ((2 << linear_backoff_thresh) - 1) * rto_base +
+			(boundary - linear_backoff_thresh) * TCP_RTO_MAX;
+	return jiffies_to_msecs(timeout);
+}
 /**
  *  retransmits_timed_out() - returns true if this connection has timed out
  *  @sk:       The current socket
@@ -178,23 +191,15 @@ static bool retransmits_timed_out(struct sock *sk,
 				  unsigned int boundary,
 				  unsigned int timeout)
 {
-	const unsigned int rto_base = TCP_RTO_MIN;
-	unsigned int linear_backoff_thresh, start_ts;
+	unsigned int start_ts;
 
 	if (!inet_csk(sk)->icsk_retransmits)
 		return false;
 
 	start_ts = tcp_sk(sk)->retrans_stamp;
-	if (likely(timeout == 0)) {
-		linear_backoff_thresh = ilog2(TCP_RTO_MAX/rto_base);
-
-		if (boundary <= linear_backoff_thresh)
-			timeout = ((2 << boundary) - 1) * rto_base;
-		else
-			timeout = ((2 << linear_backoff_thresh) - 1) * rto_base +
-				(boundary - linear_backoff_thresh) * TCP_RTO_MAX;
-		timeout = jiffies_to_msecs(timeout);
-	}
+	if (likely(timeout == 0))
+		timeout = tcp_model_timeout(sk, boundary, TCP_RTO_MIN);
+
 	return (s32)(tcp_time_stamp(tcp_sk(sk)) - start_ts - timeout) >= 0;
 }
 

commit 9de7f0d60b996469a89a10e7bbf56e91d8ffad73
Author: Yuchung Cheng <ycheng@google.com>
Date:   Wed Jan 16 15:05:30 2019 -0800

    tcp: always set retrans_stamp on recovery
    
    commit 7ae189759cc48cf8b54beebff566e9fd2d4e7d7c upstream.
    
    Previously TCP socket's retrans_stamp is not set if the
    retransmission has failed to send. As a result if a socket is
    experiencing local issues to retransmit packets, determining when
    to abort a socket is complicated w/o knowning the starting time of
    the recovery since retrans_stamp may remain zero.
    
    This complication causes sub-optimal behavior that TCP may use the
    latest, instead of the first, retransmission time to compute the
    elapsed time of a stalling connection due to local issues. Then TCP
    may disrecard TCP retries settings and keep retrying until it finally
    succeed: not a good idea when the local host is already strained.
    
    The simple fix is to always timestamp the start of a recovery.
    It's worth noting that retrans_stamp is also used to compare echo
    timestamp values to detect spurious recovery. This patch does
    not break that because retrans_stamp is still later than when the
    original packet was sent.
    
    Signed-off-by: Yuchung Cheng <ycheng@google.com>
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reviewed-by: Neal Cardwell <ncardwell@google.com>
    Reviewed-by: Soheil Hassas Yeganeh <soheil@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Qiumiao Zhang <zhangqiumiao1@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index d55ee43cd1b8..941c655cad91 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -2958,13 +2958,12 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb, int segs)
 #endif
 		TCP_SKB_CB(skb)->sacked |= TCPCB_RETRANS;
 		tp->retrans_out += tcp_skb_pcount(skb);
-
-		/* Save stamp of the first retransmit. */
-		if (!tp->retrans_stamp)
-			tp->retrans_stamp = tcp_skb_timestamp(skb);
-
 	}
 
+	/* Save stamp of the first (attempted) retransmit. */
+	if (!tp->retrans_stamp)
+		tp->retrans_stamp = tcp_skb_timestamp(skb);
+
 	if (tp->undo_retrans < 0)
 		tp->undo_retrans = 0;
 	tp->undo_retrans += tcp_skb_pcount(skb);
diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c
index 7c7f7e6cd955..9a904bf8decc 100644
--- a/net/ipv4/tcp_timer.c
+++ b/net/ipv4/tcp_timer.c
@@ -22,28 +22,14 @@
 #include <linux/gfp.h>
 #include <net/tcp.h>
 
-static u32 tcp_retransmit_stamp(const struct sock *sk)
-{
-	u32 start_ts = tcp_sk(sk)->retrans_stamp;
-
-	if (unlikely(!start_ts)) {
-		struct sk_buff *head = tcp_rtx_queue_head(sk);
-
-		if (!head)
-			return 0;
-		start_ts = tcp_skb_timestamp(head);
-	}
-	return start_ts;
-}
-
 static u32 tcp_clamp_rto_to_user_timeout(const struct sock *sk)
 {
 	struct inet_connection_sock *icsk = inet_csk(sk);
 	u32 elapsed, start_ts;
 	s32 remaining;
 
-	start_ts = tcp_retransmit_stamp(sk);
-	if (!icsk->icsk_user_timeout || !start_ts)
+	start_ts = tcp_sk(sk)->retrans_stamp;
+	if (!icsk->icsk_user_timeout)
 		return icsk->icsk_rto;
 	elapsed = tcp_time_stamp(tcp_sk(sk)) - start_ts;
 	remaining = icsk->icsk_user_timeout - elapsed;
@@ -198,10 +184,7 @@ static bool retransmits_timed_out(struct sock *sk,
 	if (!inet_csk(sk)->icsk_retransmits)
 		return false;
 
-	start_ts = tcp_retransmit_stamp(sk);
-	if (!start_ts)
-		return false;
-
+	start_ts = tcp_sk(sk)->retrans_stamp;
 	if (likely(timeout == 0)) {
 		linear_backoff_thresh = ilog2(TCP_RTO_MAX/rto_base);
 

commit eb6eeb056c992d20a4d3b4fb7dd05471ba32fea3
Author: Eric Dumazet <edumazet@google.com>
Date:   Sat Nov 24 09:12:24 2018 -0800

    tcp: address problems caused by EDT misshaps
    
    commit 9efdda4e3abed13f0903b7b6e4d4c2102019440a upstream.
    
    When a qdisc setup including pacing FQ is dismantled and recreated,
    some TCP packets are sent earlier than instructed by TCP stack.
    
    TCP can be fooled when ACK comes back, because the following
    operation can return a negative value.
    
        tcp_time_stamp(tp) - tp->rx_opt.rcv_tsecr;
    
    Some paths in TCP stack were not dealing properly with this,
    this patch addresses four of them.
    
    Fixes: ab408b6dc744 ("tcp: switch tcp and sch_fq to new earliest departure time model")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Qiumiao Zhang <zhangqiumiao1@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 5117e0aeea1a..757e1f60e00d 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -581,10 +581,12 @@ static inline void tcp_rcv_rtt_measure_ts(struct sock *sk,
 		u32 delta = tcp_time_stamp(tp) - tp->rx_opt.rcv_tsecr;
 		u32 delta_us;
 
-		if (!delta)
-			delta = 1;
-		delta_us = delta * (USEC_PER_SEC / TCP_TS_HZ);
-		tcp_rcv_rtt_update(tp, delta_us, 0);
+		if (likely(delta < INT_MAX / (USEC_PER_SEC / TCP_TS_HZ))) {
+			if (!delta)
+				delta = 1;
+			delta_us = delta * (USEC_PER_SEC / TCP_TS_HZ);
+			tcp_rcv_rtt_update(tp, delta_us, 0);
+		}
 	}
 }
 
@@ -2931,9 +2933,11 @@ static bool tcp_ack_update_rtt(struct sock *sk, const int flag,
 	if (seq_rtt_us < 0 && tp->rx_opt.saw_tstamp && tp->rx_opt.rcv_tsecr &&
 	    flag & FLAG_ACKED) {
 		u32 delta = tcp_time_stamp(tp) - tp->rx_opt.rcv_tsecr;
-		u32 delta_us = delta * (USEC_PER_SEC / TCP_TS_HZ);
 
-		seq_rtt_us = ca_rtt_us = delta_us;
+		if (likely(delta < INT_MAX / (USEC_PER_SEC / TCP_TS_HZ))) {
+			seq_rtt_us = delta * (USEC_PER_SEC / TCP_TS_HZ);
+			ca_rtt_us = seq_rtt_us;
+		}
 	}
 	rs->rtt_us = ca_rtt_us; /* RTT of last (S)ACKed packet (or -1) */
 	if (seq_rtt_us < 0)
diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c
index 681882a40968..7c7f7e6cd955 100644
--- a/net/ipv4/tcp_timer.c
+++ b/net/ipv4/tcp_timer.c
@@ -40,15 +40,17 @@ static u32 tcp_clamp_rto_to_user_timeout(const struct sock *sk)
 {
 	struct inet_connection_sock *icsk = inet_csk(sk);
 	u32 elapsed, start_ts;
+	s32 remaining;
 
 	start_ts = tcp_retransmit_stamp(sk);
 	if (!icsk->icsk_user_timeout || !start_ts)
 		return icsk->icsk_rto;
 	elapsed = tcp_time_stamp(tcp_sk(sk)) - start_ts;
-	if (elapsed >= icsk->icsk_user_timeout)
+	remaining = icsk->icsk_user_timeout - elapsed;
+	if (remaining <= 0)
 		return 1; /* user timeout has passed; fire ASAP */
-	else
-		return min_t(u32, icsk->icsk_rto, msecs_to_jiffies(icsk->icsk_user_timeout - elapsed));
+
+	return min_t(u32, icsk->icsk_rto, msecs_to_jiffies(remaining));
 }
 
 /**
@@ -210,7 +212,7 @@ static bool retransmits_timed_out(struct sock *sk,
 				(boundary - linear_backoff_thresh) * TCP_RTO_MAX;
 		timeout = jiffies_to_msecs(timeout);
 	}
-	return (tcp_time_stamp(tcp_sk(sk)) - start_ts) >= timeout;
+	return (s32)(tcp_time_stamp(tcp_sk(sk)) - start_ts - timeout) >= 0;
 }
 
 /* A write timeout has occurred. Process the after effects. */

commit 9f94fc13c94810db7fc0335b03f2590757d27f0d
Author: Evan Wang <xswang@marvell.com>
Date:   Thu Jul 22 16:40:38 2021 +0200

    PCI: aardvark: Fix checking for PIO status
    
    commit fcb461e2bc8b83b7eaca20cb2221e8b940f2189c upstream.
    
    There is an issue that when PCIe switch is connected to an Armada 3700
    board, there will be lots of warnings about PIO errors when reading the
    config space. According to Aardvark PIO read and write sequence in HW
    specification, the current way to check PIO status has the following
    issues:
    
    1) For PIO read operation, it reports the error message, which should be
       avoided according to HW specification.
    
    2) For PIO read and write operations, it only checks PIO operation complete
       status, which is not enough, and error status should also be checked.
    
    This patch aligns the code with Aardvark PIO read and write sequence in HW
    specification on PIO status check and fix the warnings when reading config
    space.
    
    [pali: Fix CRS handling when CRSSVE is not enabled]
    
    Link: https://lore.kernel.org/r/20210722144041.12661-2-pali@kernel.org
    Tested-by: Victor Gu <xigu@marvell.com>
    Signed-off-by: Evan Wang <xswang@marvell.com>
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Reviewed-by: Victor Gu <xigu@marvell.com>
    Reviewed-by: Marek Behún <kabel@kernel.org>
    Cc: stable@vger.kernel.org # b1bd5714472c ("PCI: aardvark: Indicate error in 'val' when config read fails")
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index a9669b28c2a6..68afd4fa7ec9 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -55,6 +55,7 @@
 #define   PIO_COMPLETION_STATUS_CRS		2
 #define   PIO_COMPLETION_STATUS_CA		4
 #define   PIO_NON_POSTED_REQ			BIT(10)
+#define   PIO_ERR_STATUS			BIT(11)
 #define PIO_ADDR_LS				(PIO_BASE_ADDR + 0x8)
 #define PIO_ADDR_MS				(PIO_BASE_ADDR + 0xc)
 #define PIO_WR_DATA				(PIO_BASE_ADDR + 0x10)
@@ -330,7 +331,7 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
 	advk_writel(pcie, reg, PCIE_CORE_CMD_STATUS_REG);
 }
 
-static void advk_pcie_check_pio_status(struct advk_pcie *pcie)
+static int advk_pcie_check_pio_status(struct advk_pcie *pcie, u32 *val)
 {
 	struct device *dev = &pcie->pdev->dev;
 	u32 reg;
@@ -341,14 +342,49 @@ static void advk_pcie_check_pio_status(struct advk_pcie *pcie)
 	status = (reg & PIO_COMPLETION_STATUS_MASK) >>
 		PIO_COMPLETION_STATUS_SHIFT;
 
-	if (!status)
-		return;
-
+	/*
+	 * According to HW spec, the PIO status check sequence as below:
+	 * 1) even if COMPLETION_STATUS(bit9:7) indicates successful,
+	 *    it still needs to check Error Status(bit11), only when this bit
+	 *    indicates no error happen, the operation is successful.
+	 * 2) value Unsupported Request(1) of COMPLETION_STATUS(bit9:7) only
+	 *    means a PIO write error, and for PIO read it is successful with
+	 *    a read value of 0xFFFFFFFF.
+	 * 3) value Completion Retry Status(CRS) of COMPLETION_STATUS(bit9:7)
+	 *    only means a PIO write error, and for PIO read it is successful
+	 *    with a read value of 0xFFFF0001.
+	 * 4) value Completer Abort (CA) of COMPLETION_STATUS(bit9:7) means
+	 *    error for both PIO read and PIO write operation.
+	 * 5) other errors are indicated as 'unknown'.
+	 */
 	switch (status) {
+	case PIO_COMPLETION_STATUS_OK:
+		if (reg & PIO_ERR_STATUS) {
+			strcomp_status = "COMP_ERR";
+			break;
+		}
+		/* Get the read result */
+		if (val)
+			*val = advk_readl(pcie, PIO_RD_DATA);
+		/* No error */
+		strcomp_status = NULL;
+		break;
 	case PIO_COMPLETION_STATUS_UR:
 		strcomp_status = "UR";
 		break;
 	case PIO_COMPLETION_STATUS_CRS:
+		/* PCIe r4.0, sec 2.3.2, says:
+		 * If CRS Software Visibility is not enabled, the Root Complex
+		 * must re-issue the Configuration Request as a new Request.
+		 * A Root Complex implementation may choose to limit the number
+		 * of Configuration Request/CRS Completion Status loops before
+		 * determining that something is wrong with the target of the
+		 * Request and taking appropriate action, e.g., complete the
+		 * Request to the host as a failed transaction.
+		 *
+		 * To simplify implementation do not re-issue the Configuration
+		 * Request and complete the Request as a failed transaction.
+		 */
 		strcomp_status = "CRS";
 		break;
 	case PIO_COMPLETION_STATUS_CA:
@@ -359,6 +395,9 @@ static void advk_pcie_check_pio_status(struct advk_pcie *pcie)
 		break;
 	}
 
+	if (!strcomp_status)
+		return 0;
+
 	if (reg & PIO_NON_POSTED_REQ)
 		str_posted = "Non-posted";
 	else
@@ -366,6 +405,8 @@ static void advk_pcie_check_pio_status(struct advk_pcie *pcie)
 
 	dev_err(dev, "%s PIO Response Status: %s, %#x @ %#x\n",
 		str_posted, strcomp_status, reg, advk_readl(pcie, PIO_ADDR_LS));
+
+	return -EFAULT;
 }
 
 static int advk_pcie_wait_pio(struct advk_pcie *pcie)
@@ -467,10 +508,13 @@ static int advk_pcie_rd_conf(struct pci_bus *bus, u32 devfn,
 	if (ret < 0)
 		return PCIBIOS_SET_FAILED;
 
-	advk_pcie_check_pio_status(pcie);
+	/* Check PIO status and get the read result */
+	ret = advk_pcie_check_pio_status(pcie, val);
+	if (ret < 0) {
+		*val = 0xffffffff;
+		return PCIBIOS_SET_FAILED;
+	}
 
-	/* Get the read result */
-	*val = advk_readl(pcie, PIO_RD_DATA);
 	if (size == 1)
 		*val = (*val >> (8 * (where & 3))) & 0xff;
 	else if (size == 2)
@@ -530,7 +574,9 @@ static int advk_pcie_wr_conf(struct pci_bus *bus, u32 devfn,
 	if (ret < 0)
 		return PCIBIOS_SET_FAILED;
 
-	advk_pcie_check_pio_status(pcie);
+	ret = advk_pcie_check_pio_status(pcie, NULL);
+	if (ret < 0)
+		return PCIBIOS_SET_FAILED;
 
 	return PCIBIOS_SUCCESSFUL;
 }

commit 559966652a1dffa6e26c5b2293f547314c20dac9
Author: Pali Rohár <pali@kernel.org>
Date:   Thu Jun 24 23:55:46 2021 +0200

    arm64: dts: marvell: armada-37xx: Extend PCIe MEM space
    
    commit 514ef1e62d6521c2199d192b1c71b79d2aa21d5a upstream.
    
    Current PCIe MEM space of size 16 MB is not enough for some combination
    of PCIe cards (e.g. NVMe disk together with ath11k wifi card). ARM Trusted
    Firmware for Armada 3700 platform already assigns 128 MB for PCIe window,
    so extend PCIe MEM space to the end of 128 MB PCIe window which allows to
    allocate more PCIe BARs for more PCIe cards.
    
    Without this change some combination of PCIe cards cannot be used and
    kernel show error messages in dmesg during initialization:
    
        pci 0000:00:00.0: BAR 8: no space for [mem size 0x01800000]
        pci 0000:00:00.0: BAR 8: failed to assign [mem size 0x01800000]
        pci 0000:00:00.0: BAR 6: assigned [mem 0xe8000000-0xe80007ff pref]
        pci 0000:01:00.0: BAR 8: no space for [mem size 0x01800000]
        pci 0000:01:00.0: BAR 8: failed to assign [mem size 0x01800000]
        pci 0000:02:03.0: BAR 8: no space for [mem size 0x01000000]
        pci 0000:02:03.0: BAR 8: failed to assign [mem size 0x01000000]
        pci 0000:02:07.0: BAR 8: no space for [mem size 0x00100000]
        pci 0000:02:07.0: BAR 8: failed to assign [mem size 0x00100000]
        pci 0000:03:00.0: BAR 0: no space for [mem size 0x01000000 64bit]
        pci 0000:03:00.0: BAR 0: failed to assign [mem size 0x01000000 64bit]
    
    Due to bugs in U-Boot port for Turris Mox, the second range in Turris Mox
    kernel DTS file for PCIe must start at 16 MB offset. Otherwise U-Boot
    crashes during loading of kernel DTB file. This bug is present only in
    U-Boot code for Turris Mox and therefore other Armada 3700 devices are not
    affected by this bug. Bug is fixed in U-Boot version 2021.07.
    
    To not break booting new kernels on existing versions of U-Boot on Turris
    Mox, use first 16 MB range for IO and second range with rest of PCIe window
    for MEM.
    
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Fixes: 76f6386b25cc ("arm64: dts: marvell: Add Aardvark PCIe support for Armada 3700")
    Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
index 1844fb8605f0..fca78eb334b1 100644
--- a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
+++ b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
@@ -376,8 +376,15 @@
 			#interrupt-cells = <1>;
 			msi-parent = <&pcie0>;
 			msi-controller;
-			ranges = <0x82000000 0 0xe8000000   0 0xe8000000 0 0x1000000 /* Port 0 MEM */
-				  0x81000000 0 0xe9000000   0 0xe9000000 0 0x10000>; /* Port 0 IO*/
+			/*
+			 * The 128 MiB address range [0xe8000000-0xf0000000] is
+			 * dedicated for PCIe and can be assigned to 8 windows
+			 * with size a power of two. Use one 64 KiB window for
+			 * IO at the end and the remaining seven windows
+			 * (totaling 127 MiB) for MEM.
+			 */
+			ranges = <0x82000000 0 0xe8000000   0 0xe8000000   0 0x07f00000   /* Port 0 MEM */
+				  0x81000000 0 0xefff0000   0 0xefff0000   0 0x00010000>; /* Port 0 IO */
 			interrupt-map-mask = <0 0 0 7>;
 			interrupt-map = <0 0 0 1 &pcie_intc 0>,
 					<0 0 0 2 &pcie_intc 1>,

commit cffcfbfd5a0fffaf6cb6b23a886713cf2d691594
Author: Gao Xiang <hsiangkao@linux.alibaba.com>
Date:   Tue Sep 21 22:35:30 2021 +0800

    erofs: fix up erofs_lookup tracepoint
    
    commit 93368aab0efc87288cac65e99c9ed2e0ffc9e7d0 upstream.
    
    Fix up a misuse that the filename pointer isn't always valid in
    the ring buffer, and we should copy the content instead.
    
    Link: https://lore.kernel.org/r/20210921143531.81356-1-hsiangkao@linux.alibaba.com
    Fixes: 13f06f48f7bf ("staging: erofs: support tracepoint")
    Cc: stable@vger.kernel.org # 4.19+
    Reviewed-by: Chao Yu <chao@kernel.org>
    [ Gao Xiang: resolve trivial conflicts for 4.19.y. ]
    Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/staging/erofs/include/trace/events/erofs.h b/drivers/staging/erofs/include/trace/events/erofs.h
index 5aead93a762f..852c94176d1b 100644
--- a/drivers/staging/erofs/include/trace/events/erofs.h
+++ b/drivers/staging/erofs/include/trace/events/erofs.h
@@ -32,20 +32,20 @@ TRACE_EVENT(erofs_lookup,
 	TP_STRUCT__entry(
 		__field(dev_t,		dev	)
 		__field(erofs_nid_t,	nid	)
-		__field(const char *,	name	)
+		__string(name,		dentry->d_name.name	)
 		__field(unsigned int,	flags	)
 	),
 
 	TP_fast_assign(
 		__entry->dev	= dir->i_sb->s_dev;
 		__entry->nid	= EROFS_V(dir)->nid;
-		__entry->name	= dentry->d_name.name;
+		__assign_str(name, dentry->d_name.name);
 		__entry->flags	= flags;
 	),
 
 	TP_printk("dev = (%d,%d), pnid = %llu, name:%s, flags:%x",
 		show_dev_nid(__entry),
-		__entry->name,
+		__get_str(name),
 		__entry->flags)
 );
 

commit f9858b43669c8528108f88074dc11cd788450905
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date:   Sat Sep 18 10:05:06 2021 -0700

    spi: Fix tegra20 build with CONFIG_PM=n
    
    [ Upstream commit efafec27c5658ed987e720130772f8933c685e87 ]
    
    Without CONFIG_PM enabled, the SET_RUNTIME_PM_OPS() macro ends up being
    empty, and the only use of tegra_slink_runtime_{resume,suspend} goes
    away, resulting in
    
      drivers/spi/spi-tegra20-slink.c:1200:12: error: ?tegra_slink_runtime_resume??defined but not used [-Werror=unused-function]
       1200 | static int tegra_slink_runtime_resume(struct device *dev)
            |            ^~~~~~~~~~~~~~~~~~~~~~~~~~
      drivers/spi/spi-tegra20-slink.c:1188:12: error: ?tegra_slink_runtime_suspend??defined but not used [-Werror=unused-function]
       1188 | static int tegra_slink_runtime_suspend(struct device *dev)
            |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    mark the functions __maybe_unused to make the build happy.
    
    This hits the alpha allmodconfig build (and others).
    
    Reported-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/spi/spi-tegra20-slink.c b/drivers/spi/spi-tegra20-slink.c
index c6b80a60951b..bc3097e5cc26 100644
--- a/drivers/spi/spi-tegra20-slink.c
+++ b/drivers/spi/spi-tegra20-slink.c
@@ -1210,7 +1210,7 @@ static int tegra_slink_resume(struct device *dev)
 }
 #endif
 
-static int tegra_slink_runtime_suspend(struct device *dev)
+static int __maybe_unused tegra_slink_runtime_suspend(struct device *dev)
 {
 	struct spi_master *master = dev_get_drvdata(dev);
 	struct tegra_slink_data *tspi = spi_master_get_devdata(master);
@@ -1222,7 +1222,7 @@ static int tegra_slink_runtime_suspend(struct device *dev)
 	return 0;
 }
 
-static int tegra_slink_runtime_resume(struct device *dev)
+static int __maybe_unused tegra_slink_runtime_resume(struct device *dev)
 {
 	struct spi_master *master = dev_get_drvdata(dev);
 	struct tegra_slink_data *tspi = spi_master_get_devdata(master);

commit 864d04295f072349c2c0ca57043f8e7dce786961
Author: Guenter Roeck <linux@roeck-us.net>
Date:   Wed Sep 8 20:57:43 2021 -0700

    net: 6pack: Fix tx timeout and slot time
    
    [ Upstream commit 3c0d2a46c0141913dc6fd126c57d0615677d946e ]
    
    tx timeout and slot time are currently specified in units of HZ.  On
    Alpha, HZ is defined as 1024.  When building alpha:allmodconfig, this
    results in the following error message.
    
      drivers/net/hamradio/6pack.c: In function 'sixpack_open':
      drivers/net/hamradio/6pack.c:71:41: error:
            unsigned conversion from 'int' to 'unsigned char'
            changes value from '256' to '0'
    
    In the 6PACK protocol, tx timeout is specified in units of 10 ms and
    transmitted over the wire:
    
        https://www.linux-ax25.org/wiki/6PACK
    
    Defining a value dependent on HZ doesn't really make sense, and
    presumably comes from the (very historical) situation where HZ was
    originally 100.
    
    Note that the SIXP_SLOTTIME use explicitly is about 10ms granularity:
    
            mod_timer(&sp->tx_t, jiffies + ((when + 1) * HZ) / 100);
    
    and the SIXP_TXDELAY walue is sent as a byte over the wire.
    
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c
index 1001e9a2edd4..af776d7be780 100644
--- a/drivers/net/hamradio/6pack.c
+++ b/drivers/net/hamradio/6pack.c
@@ -68,9 +68,9 @@
 #define SIXP_DAMA_OFF		0
 
 /* default level 2 parameters */
-#define SIXP_TXDELAY			(HZ/4)	/* in 1 s */
+#define SIXP_TXDELAY			25	/* 250 ms */
 #define SIXP_PERSIST			50	/* in 256ths */
-#define SIXP_SLOTTIME			(HZ/10)	/* in 1 s */
+#define SIXP_SLOTTIME			10	/* 100 ms */
 #define SIXP_INIT_RESYNC_TIMEOUT	(3*HZ/2) /* in 1 s */
 #define SIXP_RESYNC_TIMEOUT		5*HZ	/* in 1 s */
 

commit 24b055916a114d2e8a4675359630e7bcfb3a107d
Author: Guenter Roeck <linux@roeck-us.net>
Date:   Wed Sep 8 22:00:33 2021 -0700

    alpha: Declare virt_to_phys and virt_to_bus parameter as pointer to volatile
    
    [ Upstream commit 35a3f4ef0ab543daa1725b0c963eb8c05e3376f8 ]
    
    Some drivers pass a pointer to volatile data to virt_to_bus() and
    virt_to_phys(), and that works fine.  One exception is alpha.  This
    results in a number of compile errors such as
    
      drivers/net/wan/lmc/lmc_main.c: In function 'lmc_softreset':
      drivers/net/wan/lmc/lmc_main.c:1782:50: error:
            passing argument 1 of 'virt_to_bus' discards 'volatile'
            qualifier from pointer target type
    
      drivers/atm/ambassador.c: In function 'do_loader_command':
      drivers/atm/ambassador.c:1747:58: error:
            passing argument 1 of 'virt_to_bus' discards 'volatile'
            qualifier from pointer target type
    
    Declare the parameter of virt_to_phys and virt_to_bus as pointer to
    volatile to fix the problem.
    
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Acked-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/alpha/include/asm/io.h b/arch/alpha/include/asm/io.h
index 0bba9e991189..d4eab4f20249 100644
--- a/arch/alpha/include/asm/io.h
+++ b/arch/alpha/include/asm/io.h
@@ -61,7 +61,7 @@ extern inline void set_hae(unsigned long new_hae)
  * Change virtual addresses to physical addresses and vv.
  */
 #ifdef USE_48_BIT_KSEG
-static inline unsigned long virt_to_phys(void *address)
+static inline unsigned long virt_to_phys(volatile void *address)
 {
 	return (unsigned long)address - IDENT_ADDR;
 }
@@ -71,7 +71,7 @@ static inline void * phys_to_virt(unsigned long address)
 	return (void *) (address + IDENT_ADDR);
 }
 #else
-static inline unsigned long virt_to_phys(void *address)
+static inline unsigned long virt_to_phys(volatile void *address)
 {
         unsigned long phys = (unsigned long)address;
 
@@ -112,7 +112,7 @@ static inline dma_addr_t __deprecated isa_page_to_bus(struct page *page)
 extern unsigned long __direct_map_base;
 extern unsigned long __direct_map_size;
 
-static inline unsigned long __deprecated virt_to_bus(void *address)
+static inline unsigned long __deprecated virt_to_bus(volatile void *address)
 {
 	unsigned long phys = virt_to_phys(address);
 	unsigned long bus = phys + __direct_map_base;

commit 93cb263d81bc9b67abd2e250a3caa21fb983a5e1
Author: Dan Li <ashimida@linux.alibaba.com>
Date:   Tue Sep 14 17:44:02 2021 +0800

    arm64: Mark __stack_chk_guard as __ro_after_init
    
    [ Upstream commit 9fcb2e93f41c07a400885325e7dbdfceba6efaec ]
    
    __stack_chk_guard is setup once while init stage and never changed
    after that.
    
    Although the modification of this variable at runtime will usually
    cause the kernel to crash (so does the attacker), it should be marked
    as __ro_after_init, and it should not affect performance if it is
    placed in the ro_after_init section.
    
    Signed-off-by: Dan Li <ashimida@linux.alibaba.com>
    Acked-by: Mark Rutland <mark.rutland@arm.com>
    Link: https://lore.kernel.org/r/1631612642-102881-1-git-send-email-ashimida@linux.alibaba.com
    Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
index d6a49bb07a5f..1945b8096a06 100644
--- a/arch/arm64/kernel/process.c
+++ b/arch/arm64/kernel/process.c
@@ -61,7 +61,7 @@
 
 #ifdef CONFIG_STACKPROTECTOR
 #include <linux/stackprotector.h>
-unsigned long __stack_chk_guard __read_mostly;
+unsigned long __stack_chk_guard __ro_after_init;
 EXPORT_SYMBOL(__stack_chk_guard);
 #endif
 

commit c4cf3df31e29fc2a9ad936a6769e7142311c9d12
Author: Helge Deller <deller@gmx.de>
Date:   Thu Sep 16 08:35:42 2021 +0200

    parisc: Use absolute_pointer() to define PAGE0
    
    [ Upstream commit 90cc7bed1ed19f869ae7221a6b41887fe762a6a3 ]
    
    Use absolute_pointer() wrapper for PAGE0 to avoid this compiler warning:
    
      arch/parisc/kernel/setup.c: In function 'start_parisc':
      error: '__builtin_memcmp_eq' specified bound 8 exceeds source size 0
    
    Signed-off-by: Helge Deller <deller@gmx.de>
    Co-Developed-by: Guenter Roeck <linux@roeck-us.net>
    Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/parisc/include/asm/page.h b/arch/parisc/include/asm/page.h
index af00fe9bf846..c631a8fd856a 100644
--- a/arch/parisc/include/asm/page.h
+++ b/arch/parisc/include/asm/page.h
@@ -179,7 +179,7 @@ extern int npmem_ranges;
 #include <asm-generic/getorder.h>
 #include <asm/pdc.h>
 
-#define PAGE0   ((struct zeropage *)__PAGE_OFFSET)
+#define PAGE0   ((struct zeropage *)absolute_pointer(__PAGE_OFFSET))
 
 /* DEFINITION OF THE ZERO-PAGE (PAG0) */
 /* based on work by Jason Eckhardt (jason@equator.com) */

commit c53b7bd4ba98ce6a7f0abf3f013ae6cad3f2f510
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date:   Wed Sep 15 13:56:37 2021 -0700

    qnx4: avoid stringop-overread errors
    
    [ Upstream commit b7213ffa0e585feb1aee3e7173e965e66ee0abaa ]
    
    The qnx4 directory entries are 64-byte blocks that have different
    contents depending on the a status byte that is in the last byte of the
    block.
    
    In particular, a directory entry can be either a "link info" entry with
    a 48-byte name and pointers to the real inode information, or an "inode
    entry" with a smaller 16-byte name and the full inode information.
    
    But the code was written to always just treat the directory name as if
    it was part of that "inode entry", and just extend the name to the
    longer case if the status byte said it was a link entry.
    
    That work just fine and gives the right results, but now that gcc is
    tracking data structure accesses much more, the code can trigger a
    compiler error about using up to 48 bytes (the long name) in a structure
    that only has that shorter name in it:
    
       fs/qnx4/dir.c: In function ?qnx4_readdir??
       fs/qnx4/dir.c:51:32: error: ?strnlen??specified bound 48 exceeds source size 16 [-Werror=stringop-overread]
          51 |                         size = strnlen(de->di_fname, size);
             |                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~
       In file included from fs/qnx4/qnx4.h:3,
                        from fs/qnx4/dir.c:16:
       include/uapi/linux/qnx4_fs.h:45:25: note: source object declared here
          45 |         char            di_fname[QNX4_SHORT_NAME_MAX];
             |                         ^~~~~~~~
    
    which is because the source code doesn't really make this whole "one of
    two different types" explicit.
    
    Fix this by introducing a very explicit union of the two types, and
    basically explaining to the compiler what is really going on.
    
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/qnx4/dir.c b/fs/qnx4/dir.c
index a6ee23aadd28..2a66844b7ff8 100644
--- a/fs/qnx4/dir.c
+++ b/fs/qnx4/dir.c
@@ -15,13 +15,27 @@
 #include <linux/buffer_head.h>
 #include "qnx4.h"
 
+/*
+ * A qnx4 directory entry is an inode entry or link info
+ * depending on the status field in the last byte. The
+ * first byte is where the name start either way, and a
+ * zero means it's empty.
+ */
+union qnx4_directory_entry {
+	struct {
+		char de_name;
+		char de_pad[62];
+		char de_status;
+	};
+	struct qnx4_inode_entry inode;
+	struct qnx4_link_info link;
+};
+
 static int qnx4_readdir(struct file *file, struct dir_context *ctx)
 {
 	struct inode *inode = file_inode(file);
 	unsigned int offset;
 	struct buffer_head *bh;
-	struct qnx4_inode_entry *de;
-	struct qnx4_link_info *le;
 	unsigned long blknum;
 	int ix, ino;
 	int size;
@@ -38,27 +52,30 @@ static int qnx4_readdir(struct file *file, struct dir_context *ctx)
 		}
 		ix = (ctx->pos >> QNX4_DIR_ENTRY_SIZE_BITS) % QNX4_INODES_PER_BLOCK;
 		for (; ix < QNX4_INODES_PER_BLOCK; ix++, ctx->pos += QNX4_DIR_ENTRY_SIZE) {
+			union qnx4_directory_entry *de;
+			const char *name;
+
 			offset = ix * QNX4_DIR_ENTRY_SIZE;
-			de = (struct qnx4_inode_entry *) (bh->b_data + offset);
-			if (!de->di_fname[0])
+			de = (union qnx4_directory_entry *) (bh->b_data + offset);
+
+			if (!de->de_name)
 				continue;
-			if (!(de->di_status & (QNX4_FILE_USED|QNX4_FILE_LINK)))
+			if (!(de->de_status & (QNX4_FILE_USED|QNX4_FILE_LINK)))
 				continue;
-			if (!(de->di_status & QNX4_FILE_LINK))
-				size = QNX4_SHORT_NAME_MAX;
-			else
-				size = QNX4_NAME_MAX;
-			size = strnlen(de->di_fname, size);
-			QNX4DEBUG((KERN_INFO "qnx4_readdir:%.*s\n", size, de->di_fname));
-			if (!(de->di_status & QNX4_FILE_LINK))
+			if (!(de->de_status & QNX4_FILE_LINK)) {
+				size = sizeof(de->inode.di_fname);
+				name = de->inode.di_fname;
 				ino = blknum * QNX4_INODES_PER_BLOCK + ix - 1;
-			else {
-				le  = (struct qnx4_link_info*)de;
-				ino = ( le32_to_cpu(le->dl_inode_blk) - 1 ) *
+			} else {
+				size = sizeof(de->link.dl_fname);
+				name = de->link.dl_fname;
+				ino = ( le32_to_cpu(de->link.dl_inode_blk) - 1 ) *
 					QNX4_INODES_PER_BLOCK +
-					le->dl_inode_ndx;
+					de->link.dl_inode_ndx;
 			}
-			if (!dir_emit(ctx, de->di_fname, size, ino, DT_UNKNOWN)) {
+			size = strnlen(name, size);
+			QNX4DEBUG((KERN_INFO "qnx4_readdir:%.*s\n", size, name));
+			if (!dir_emit(ctx, name, size, ino, DT_UNKNOWN)) {
 				brelse(bh);
 				return 0;
 			}

commit 259b1d3f43b60bd4dc93d44b238ab62b518f5455
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date:   Mon Sep 6 16:06:04 2021 -0700

    sparc: avoid stringop-overread errors
    
    [ Upstream commit fc7c028dcdbfe981bca75d2a7b95f363eb691ef3 ]
    
    The sparc mdesc code does pointer games with 'struct mdesc_hdr', but
    didn't describe to the compiler how that header is then followed by the
    data that the header describes.
    
    As a result, gcc is now unhappy since it does stricter pointer range
    tracking, and doesn't understand about how these things work.  This
    results in various errors like:
    
        arch/sparc/kernel/mdesc.c: In function ?mdesc_node_by_name??
        arch/sparc/kernel/mdesc.c:647:22: error: ?strcmp??reading 1 or more bytes from a region of size 0 [-Werror=stringop-overread]
          647 |                 if (!strcmp(names + ep[ret].name_offset, name))
              |                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    which are easily avoided by just describing 'struct mdesc_hdr' better,
    and making the node_block() helper function look into that unsized
    data[] that follows the header.
    
    This makes the sparc64 build happy again at least for my cross-compiler
    version (gcc version 11.2.1).
    
    Link: https://lore.kernel.org/lkml/CAHk-=wi4NW3NC0xWykkw=6LnjQD6D_rtRtxY9g8gQAJXtQMi8A@mail.gmail.com/
    Cc: Guenter Roeck <linux@roeck-us.net>
    Cc: David S. Miller <davem@davemloft.net>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/sparc/kernel/mdesc.c b/arch/sparc/kernel/mdesc.c
index 51028abe5e90..ecec6a616e0d 100644
--- a/arch/sparc/kernel/mdesc.c
+++ b/arch/sparc/kernel/mdesc.c
@@ -40,6 +40,7 @@ struct mdesc_hdr {
 	u32	node_sz; /* node block size */
 	u32	name_sz; /* name block size */
 	u32	data_sz; /* data block size */
+	char	data[];
 } __attribute__((aligned(16)));
 
 struct mdesc_elem {
@@ -613,7 +614,7 @@ EXPORT_SYMBOL(mdesc_get_node_info);
 
 static struct mdesc_elem *node_block(struct mdesc_hdr *mdesc)
 {
-	return (struct mdesc_elem *) (mdesc + 1);
+	return (struct mdesc_elem *) mdesc->data;
 }
 
 static void *name_block(struct mdesc_hdr *mdesc)

commit 79851f2b1dcd9013c8ed4bb17c1a583bc89b1f34
Author: Guenter Roeck <linux@roeck-us.net>
Date:   Tue Sep 14 20:52:25 2021 -0700

    net: i825xx: Use absolute_pointer for memcpy from fixed memory location
    
    [ Upstream commit dff2d13114f0beec448da9b3716204eb34b0cf41 ]
    
    gcc 11.x reports the following compiler warning/error.
    
      drivers/net/ethernet/i825xx/82596.c: In function 'i82596_probe':
      arch/m68k/include/asm/string.h:72:25: error:
            '__builtin_memcpy' reading 6 bytes from a region of size 0 [-Werror=stringop-overread]
    
    Use absolute_pointer() to work around the problem.
    
    Cc: Geert Uytterhoeven <geert@linux-m68k.org>
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/i825xx/82596.c b/drivers/net/ethernet/i825xx/82596.c
index d719668a6684..8efcec305fc5 100644
--- a/drivers/net/ethernet/i825xx/82596.c
+++ b/drivers/net/ethernet/i825xx/82596.c
@@ -1155,7 +1155,7 @@ struct net_device * __init i82596_probe(int unit)
 			err = -ENODEV;
 			goto out;
 		}
-		memcpy(eth_addr, (void *) 0xfffc1f2c, ETH_ALEN);	/* YUCK! Get addr from NOVRAM */
+		memcpy(eth_addr, absolute_pointer(0xfffc1f2c), ETH_ALEN); /* YUCK! Get addr from NOVRAM */
 		dev->base_addr = MVME_I596_BASE;
 		dev->irq = (unsigned) MVME16x_IRQ_I596;
 		goto found;

commit a33e34a35b43494632b933606fbea3cb79b689ed
Author: Guenter Roeck <linux@roeck-us.net>
Date:   Tue Sep 14 20:52:24 2021 -0700

    compiler.h: Introduce absolute_pointer macro
    
    [ Upstream commit f6b5f1a56987de837f8e25cd560847106b8632a8 ]
    
    absolute_pointer() disassociates a pointer from its originating symbol
    type and context. Use it to prevent compiler warnings/errors such as
    
      drivers/net/ethernet/i825xx/82596.c: In function 'i82596_probe':
      arch/m68k/include/asm/string.h:72:25: error:
            '__builtin_memcpy' reading 6 bytes from a region of size 0 [-Werror=stringop-overread]
    
    Such warnings may be reported by gcc 11.x for string and memory
    operations on fixed addresses.
    
    Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/compiler.h b/include/linux/compiler.h
index 6a53300cbd1e..ab9dfb14f486 100644
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -228,6 +228,8 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val,
     (typeof(ptr)) (__ptr + (off)); })
 #endif
 
+#define absolute_pointer(val)	RELOC_HIDE((void *)(val), 0)
+
 #ifndef OPTIMIZER_HIDE_VAR
 /* Make the optimizer believe the variable can be manipulated arbitrarily. */
 #define OPTIMIZER_HIDE_VAR(var)						\

commit dc06d15104cba96693806685b5f1d589dbb87e99
Author: Anton Eidelman <anton.eidelman@gmail.com>
Date:   Sun Sep 12 12:54:57 2021 -0600

    nvme-multipath: fix ANA state updates when a namespace is not present
    
    [ Upstream commit 79f528afa93918519574773ea49a444c104bc1bd ]
    
    nvme_update_ana_state() has a deficiency that results in a failure to
    properly update the ana state for a namespace in the following case:
    
      NSIDs in ctrl->namespaces:    1, 3,    4
      NSIDs in desc->nsids:         1, 2, 3, 4
    
    Loop iteration 0:
        ns index = 0, n = 0, ns->head->ns_id = 1, nsid = 1, MATCH.
    Loop iteration 1:
        ns index = 1, n = 1, ns->head->ns_id = 3, nsid = 2, NO MATCH.
    Loop iteration 2:
        ns index = 2, n = 2, ns->head->ns_id = 4, nsid = 4, MATCH.
    
    Where the update to the ANA state of NSID 3 is missed.  To fix this
    increment n and retry the update with the same ns when ns->head->ns_id is
    higher than nsid,
    
    Signed-off-by: Anton Eidelman <anton@lightbitslabs.com>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c
index 64f699a1afd7..022e03643dac 100644
--- a/drivers/nvme/host/multipath.c
+++ b/drivers/nvme/host/multipath.c
@@ -398,14 +398,17 @@ static int nvme_update_ana_state(struct nvme_ctrl *ctrl,
 
 	down_read(&ctrl->namespaces_rwsem);
 	list_for_each_entry(ns, &ctrl->namespaces, list) {
-		unsigned nsid = le32_to_cpu(desc->nsids[n]);
-
+		unsigned nsid;
+again:
+		nsid = le32_to_cpu(desc->nsids[n]);
 		if (ns->head->ns_id < nsid)
 			continue;
 		if (ns->head->ns_id == nsid)
 			nvme_update_ns_ana_state(desc, ns);
 		if (++n == nr_nsids)
 			break;
+		if (ns->head->ns_id > nsid)
+			goto again;
 	}
 	up_read(&ctrl->namespaces_rwsem);
 	return 0;

commit 6bba79c6a073741b672b0bf86a1f03c0fe47f973
Author: Juergen Gross <jgross@suse.com>
Date:   Fri Aug 27 14:32:06 2021 +0200

    xen/balloon: use a kernel thread instead a workqueue
    
    [ Upstream commit 8480ed9c2bbd56fc86524998e5f2e3e22f5038f6 ]
    
    Today the Xen ballooning is done via delayed work in a workqueue. This
    might result in workqueue hangups being reported in case of large
    amounts of memory are being ballooned in one go (here 16GB):
    
    BUG: workqueue lockup - pool cpus=6 node=0 flags=0x0 nice=0 stuck for 64s!
    Showing busy workqueues and worker pools:
    workqueue events: flags=0x0
      pwq 12: cpus=6 node=0 flags=0x0 nice=0 active=2/256 refcnt=3
        in-flight: 229:balloon_process
        pending: cache_reap
    workqueue events_freezable_power_: flags=0x84
      pwq 12: cpus=6 node=0 flags=0x0 nice=0 active=1/256 refcnt=2
        pending: disk_events_workfn
    workqueue mm_percpu_wq: flags=0x8
      pwq 12: cpus=6 node=0 flags=0x0 nice=0 active=1/256 refcnt=2
        pending: vmstat_update
    pool 12: cpus=6 node=0 flags=0x0 nice=0 hung=64s workers=3 idle: 2222 43
    
    This can easily be avoided by using a dedicated kernel thread for doing
    the ballooning work.
    
    Reported-by: Jan Beulich <jbeulich@suse.com>
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Link: https://lore.kernel.org/r/20210827123206.15429-1-jgross@suse.com
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
index b23edf64c2b2..643dbe5620e8 100644
--- a/drivers/xen/balloon.c
+++ b/drivers/xen/balloon.c
@@ -43,6 +43,8 @@
 #include <linux/sched.h>
 #include <linux/cred.h>
 #include <linux/errno.h>
+#include <linux/freezer.h>
+#include <linux/kthread.h>
 #include <linux/mm.h>
 #include <linux/bootmem.h>
 #include <linux/pagemap.h>
@@ -120,7 +122,7 @@ static struct ctl_table xen_root[] = {
 #define EXTENT_ORDER (fls(XEN_PFN_PER_PAGE) - 1)
 
 /*
- * balloon_process() state:
+ * balloon_thread() state:
  *
  * BP_DONE: done or nothing to do,
  * BP_WAIT: wait to be rescheduled,
@@ -135,6 +137,8 @@ enum bp_state {
 	BP_ECANCELED
 };
 
+/* Main waiting point for xen-balloon thread. */
+static DECLARE_WAIT_QUEUE_HEAD(balloon_thread_wq);
 
 static DEFINE_MUTEX(balloon_mutex);
 
@@ -149,10 +153,6 @@ static xen_pfn_t frame_list[PAGE_SIZE / sizeof(xen_pfn_t)];
 static LIST_HEAD(ballooned_pages);
 static DECLARE_WAIT_QUEUE_HEAD(balloon_wq);
 
-/* Main work function, always executed in process context. */
-static void balloon_process(struct work_struct *work);
-static DECLARE_DELAYED_WORK(balloon_worker, balloon_process);
-
 /* When ballooning out (allocating memory to return to Xen) we don't really
    want the kernel to try too hard since that can trigger the oom killer. */
 #define GFP_BALLOON \
@@ -383,7 +383,7 @@ static void xen_online_page(struct page *page)
 static int xen_memory_notifier(struct notifier_block *nb, unsigned long val, void *v)
 {
 	if (val == MEM_ONLINE)
-		schedule_delayed_work(&balloon_worker, 0);
+		wake_up(&balloon_thread_wq);
 
 	return NOTIFY_OK;
 }
@@ -508,18 +508,43 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp)
 }
 
 /*
- * As this is a work item it is guaranteed to run as a single instance only.
+ * Stop waiting if either state is not BP_EAGAIN and ballooning action is
+ * needed, or if the credit has changed while state is BP_EAGAIN.
+ */
+static bool balloon_thread_cond(enum bp_state state, long credit)
+{
+	if (state != BP_EAGAIN)
+		credit = 0;
+
+	return current_credit() != credit || kthread_should_stop();
+}
+
+/*
+ * As this is a kthread it is guaranteed to run as a single instance only.
  * We may of course race updates of the target counts (which are protected
  * by the balloon lock), or with changes to the Xen hard limit, but we will
  * recover from these in time.
  */
-static void balloon_process(struct work_struct *work)
+static int balloon_thread(void *unused)
 {
 	enum bp_state state = BP_DONE;
 	long credit;
+	unsigned long timeout;
+
+	set_freezable();
+	for (;;) {
+		if (state == BP_EAGAIN)
+			timeout = balloon_stats.schedule_delay * HZ;
+		else
+			timeout = 3600 * HZ;
+		credit = current_credit();
 
+		wait_event_interruptible_timeout(balloon_thread_wq,
+				 balloon_thread_cond(state, credit), timeout);
+
+		if (kthread_should_stop())
+			return 0;
 
-	do {
 		mutex_lock(&balloon_mutex);
 
 		credit = current_credit();
@@ -546,12 +571,7 @@ static void balloon_process(struct work_struct *work)
 		mutex_unlock(&balloon_mutex);
 
 		cond_resched();
-
-	} while (credit && state == BP_DONE);
-
-	/* Schedule more work if there is some still to be done. */
-	if (state == BP_EAGAIN)
-		schedule_delayed_work(&balloon_worker, balloon_stats.schedule_delay * HZ);
+	}
 }
 
 /* Resets the Xen limit, sets new target, and kicks off processing. */
@@ -559,7 +579,7 @@ void balloon_set_new_target(unsigned long target)
 {
 	/* No need for lock. Not read-modify-write updates. */
 	balloon_stats.target_pages = target;
-	schedule_delayed_work(&balloon_worker, 0);
+	wake_up(&balloon_thread_wq);
 }
 EXPORT_SYMBOL_GPL(balloon_set_new_target);
 
@@ -664,7 +684,7 @@ void free_xenballooned_pages(int nr_pages, struct page **pages)
 
 	/* The balloon may be too large now. Shrink it if needed. */
 	if (current_credit())
-		schedule_delayed_work(&balloon_worker, 0);
+		wake_up(&balloon_thread_wq);
 
 	mutex_unlock(&balloon_mutex);
 }
@@ -698,6 +718,8 @@ static void __init balloon_add_region(unsigned long start_pfn,
 
 static int __init balloon_init(void)
 {
+	struct task_struct *task;
+
 	if (!xen_domain())
 		return -ENODEV;
 
@@ -741,6 +763,12 @@ static int __init balloon_init(void)
 	}
 #endif
 
+	task = kthread_run(balloon_thread, NULL, "xen-balloon");
+	if (IS_ERR(task)) {
+		pr_err("xen-balloon thread could not be started, ballooning will not work!\n");
+		return PTR_ERR(task);
+	}
+
 	/* Init the xen-balloon driver. */
 	xen_balloon_init();
 

commit 6a7e5ec97e0d0d04caa2ac517848681f30681af4
Author: Guenter Roeck <linux@roeck-us.net>
Date:   Mon Sep 6 23:07:29 2021 -0700

    m68k: Double cast io functions to unsigned long
    
    [ Upstream commit b1a89856fbf63fffde6a4771d8f1ac21df549e50 ]
    
    m68k builds fail widely with errors such as
    
    arch/m68k/include/asm/raw_io.h:20:19: error:
            cast to pointer from integer of different size
    arch/m68k/include/asm/raw_io.h:30:32: error:
            cast to pointer from integer of different size [-Werror=int-to-p
    
    On m68k, io functions are defined as macros. The problem is seen if the
    macro parameter variable size differs from the size of a pointer. Cast
    the parameter of all io macros to unsigned long before casting it to
    a pointer to fix the problem.
    
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Link: https://lore.kernel.org/r/20210907060729.2391992-1-linux@roeck-us.net
    Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/m68k/include/asm/raw_io.h b/arch/m68k/include/asm/raw_io.h
index 85761255dde5..6a03aef53980 100644
--- a/arch/m68k/include/asm/raw_io.h
+++ b/arch/m68k/include/asm/raw_io.h
@@ -17,21 +17,21 @@
  * two accesses to memory, which may be undesirable for some devices.
  */
 #define in_8(addr) \
-    ({ u8 __v = (*(__force volatile u8 *) (addr)); __v; })
+    ({ u8 __v = (*(__force volatile u8 *) (unsigned long)(addr)); __v; })
 #define in_be16(addr) \
-    ({ u16 __v = (*(__force volatile u16 *) (addr)); __v; })
+    ({ u16 __v = (*(__force volatile u16 *) (unsigned long)(addr)); __v; })
 #define in_be32(addr) \
-    ({ u32 __v = (*(__force volatile u32 *) (addr)); __v; })
+    ({ u32 __v = (*(__force volatile u32 *) (unsigned long)(addr)); __v; })
 #define in_le16(addr) \
-    ({ u16 __v = le16_to_cpu(*(__force volatile __le16 *) (addr)); __v; })
+    ({ u16 __v = le16_to_cpu(*(__force volatile __le16 *) (unsigned long)(addr)); __v; })
 #define in_le32(addr) \
-    ({ u32 __v = le32_to_cpu(*(__force volatile __le32 *) (addr)); __v; })
+    ({ u32 __v = le32_to_cpu(*(__force volatile __le32 *) (unsigned long)(addr)); __v; })
 
-#define out_8(addr,b) (void)((*(__force volatile u8 *) (addr)) = (b))
-#define out_be16(addr,w) (void)((*(__force volatile u16 *) (addr)) = (w))
-#define out_be32(addr,l) (void)((*(__force volatile u32 *) (addr)) = (l))
-#define out_le16(addr,w) (void)((*(__force volatile __le16 *) (addr)) = cpu_to_le16(w))
-#define out_le32(addr,l) (void)((*(__force volatile __le32 *) (addr)) = cpu_to_le32(l))
+#define out_8(addr,b) (void)((*(__force volatile u8 *) (unsigned long)(addr)) = (b))
+#define out_be16(addr,w) (void)((*(__force volatile u16 *) (unsigned long)(addr)) = (w))
+#define out_be32(addr,l) (void)((*(__force volatile u32 *) (unsigned long)(addr)) = (l))
+#define out_le16(addr,w) (void)((*(__force volatile __le16 *) (unsigned long)(addr)) = cpu_to_le16(w))
+#define out_le32(addr,l) (void)((*(__force volatile __le32 *) (unsigned long)(addr)) = cpu_to_le32(l))
 
 #define raw_inb in_8
 #define raw_inw in_be16

commit 8653d1ed7da0d014690e1caef707da9bc336e7ab
Author: Jesper Nilsson <jesper.nilsson@axis.com>
Date:   Fri Sep 10 21:55:34 2021 +0200

    net: stmmac: allow CSR clock of 300MHz
    
    [ Upstream commit 08dad2f4d541fcfe5e7bfda72cc6314bbfd2802f ]
    
    The Synopsys Ethernet IP uses the CSR clock as a base clock for MDC.
    The divisor used is set in the MAC_MDIO_Address register field CR
    (Clock Rate)
    
    The divisor is there to change the CSR clock into a clock that falls
    below the IEEE 802.3 specified max frequency of 2.5MHz.
    
    If the CSR clock is 300MHz, the code falls back to using the reset
    value in the MAC_MDIO_Address register, as described in the comment
    above this code.
    
    However, 300MHz is actually an allowed value and the proper divider
    can be estimated quite easily (it's just 1Hz difference!)
    
    A CSR frequency of 300MHz with the maximum clock rate value of 0x5
    (STMMAC_CSR_250_300M, a divisor of 124) gives somewhere around
    ~2.42MHz which is below the IEEE 802.3 specified maximum.
    
    For the ARTPEC-8 SoC, the CSR clock is this problematic 300MHz,
    and unfortunately, the reset-value of the MAC_MDIO_Address CR field
    is 0x0.
    
    This leads to a clock rate of zero and a divisor of 42, and gives an
    MDC frequency of ~7.14MHz.
    
    Allow CSR clock of 300MHz by making the comparison inclusive.
    
    Signed-off-by: Jesper Nilsson <jesper.nilsson@axis.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index af59761ddfa0..064e13bd2c8b 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -227,7 +227,7 @@ static void stmmac_clk_csr_set(struct stmmac_priv *priv)
 			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;
 	}
 

commit 46670fb832ee80943715df618632ca13c2e96f2b
Author: Tong Zhang <ztong0001@gmail.com>
Date:   Wed Sep 8 12:02:32 2021 -0700

    net: macb: fix use after free on rmmod
    
    [ Upstream commit d82d5303c4c539db86588ffb5dc5b26c3f1513e8 ]
    
    plat_dev->dev->platform_data is released by platform_device_unregister(),
    use of pclk and hclk is a use-after-free. Since device unregister won't
    need a clk device we adjust the function call sequence to fix this issue.
    
    [   31.261225] BUG: KASAN: use-after-free in macb_remove+0x77/0xc6 [macb_pci]
    [   31.275563] Freed by task 306:
    [   30.276782]  platform_device_release+0x25/0x80
    
    Suggested-by: Nicolas Ferre <Nicolas.Ferre@microchip.com>
    Signed-off-by: Tong Zhang <ztong0001@gmail.com>
    Acked-by: Nicolas Ferre <nicolas.ferre@microchip.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/cadence/macb_pci.c b/drivers/net/ethernet/cadence/macb_pci.c
index 248a8fc45069..f06fddf9919b 100644
--- a/drivers/net/ethernet/cadence/macb_pci.c
+++ b/drivers/net/ethernet/cadence/macb_pci.c
@@ -123,9 +123,9 @@ static void macb_remove(struct pci_dev *pdev)
 	struct platform_device *plat_dev = pci_get_drvdata(pdev);
 	struct macb_platform_data *plat_data = dev_get_platdata(&plat_dev->dev);
 
-	platform_device_unregister(plat_dev);
 	clk_unregister(plat_data->pclk);
 	clk_unregister(plat_data->hclk);
+	platform_device_unregister(plat_dev);
 }
 
 static const struct pci_device_id dev_id_table[] = {

commit 677e362ba807f3aafe6f405c07e0b37244da5222
Author: Zhihao Cheng <chengzhihao1@huawei.com>
Date:   Thu Sep 23 21:49:21 2021 +0800

    blktrace: Fix uaf in blk_trace access after removing by sysfs
    
    [ Upstream commit 5afedf670caf30a2b5a52da96eb7eac7dee6a9c9 ]
    
    There is an use-after-free problem triggered by following process:
    
          P1(sda)                           P2(sdb)
                            echo 0 > /sys/block/sdb/trace/enable
                              blk_trace_remove_queue
                                synchronize_rcu
                                blk_trace_free
                                  relay_close
    rcu_read_lock
    __blk_add_trace
      trace_note_tsk
      (Iterate running_trace_list)
                                    relay_close_buf
                                      relay_destroy_buf
                                        kfree(buf)
        trace_note(sdb's bt)
          relay_reserve
            buf->offset <- nullptr deference (use-after-free) !!!
    rcu_read_unlock
    
    [  502.714379] BUG: kernel NULL pointer dereference, address:
    0000000000000010
    [  502.715260] #PF: supervisor read access in kernel mode
    [  502.715903] #PF: error_code(0x0000) - not-present page
    [  502.716546] PGD 103984067 P4D 103984067 PUD 17592b067 PMD 0
    [  502.717252] Oops: 0000 [#1] SMP
    [  502.720308] RIP: 0010:trace_note.isra.0+0x86/0x360
    [  502.732872] Call Trace:
    [  502.733193]  __blk_add_trace.cold+0x137/0x1a3
    [  502.733734]  blk_add_trace_rq+0x7b/0xd0
    [  502.734207]  blk_add_trace_rq_issue+0x54/0xa0
    [  502.734755]  blk_mq_start_request+0xde/0x1b0
    [  502.735287]  scsi_queue_rq+0x528/0x1140
    ...
    [  502.742704]  sg_new_write.isra.0+0x16e/0x3e0
    [  502.747501]  sg_ioctl+0x466/0x1100
    
    Reproduce method:
      ioctl(/dev/sda, BLKTRACESETUP, blk_user_trace_setup[buf_size=127])
      ioctl(/dev/sda, BLKTRACESTART)
      ioctl(/dev/sdb, BLKTRACESETUP, blk_user_trace_setup[buf_size=127])
      ioctl(/dev/sdb, BLKTRACESTART)
    
      echo 0 > /sys/block/sdb/trace/enable &
      // Add delay(mdelay/msleep) before kernel enters blk_trace_free()
    
      ioctl$SG_IO(/dev/sda, SG_IO, ...)
      // Enters trace_note_tsk() after blk_trace_free() returned
      // Use mdelay in rcu region rather than msleep(which may schedule out)
    
    Remove blk_trace from running_list before calling blk_trace_free() by
    sysfs if blk_trace is at Blktrace_running state.
    
    Fixes: c71a896154119f ("blktrace: add ftrace plugin")
    Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
    Link: https://lore.kernel.org/r/20210923134921.109194-1-chengzhihao1@huawei.com
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c
index 645048bb1e86..75ea1a5be31a 100644
--- a/kernel/trace/blktrace.c
+++ b/kernel/trace/blktrace.c
@@ -1661,6 +1661,14 @@ static int blk_trace_remove_queue(struct request_queue *q)
 	if (bt == NULL)
 		return -EINVAL;
 
+	if (bt->trace_state == Blktrace_running) {
+		bt->trace_state = Blktrace_stopped;
+		spin_lock_irq(&running_trace_lock);
+		list_del_init(&bt->running_list);
+		spin_unlock_irq(&running_trace_lock);
+		relay_flush(bt->rchan);
+	}
+
 	put_probe_ref();
 	synchronize_rcu();
 	blk_trace_free(bt);

commit 906b4dcc180808f0ba74ec1e07a5cf708463bc48
Author: Christoph Hellwig <hch@lst.de>
Date:   Wed Sep 1 13:38:29 2021 +0200

    md: fix a lock order reversal in md_alloc
    
    [ Upstream commit 7df835a32a8bedf7ce88efcfa7c9b245b52ff139 ]
    
    Commit b0140891a8cea3 ("md: Fix race when creating a new md device.")
    not only moved assigning mddev->gendisk before calling add_disk, which
    fixes the races described in the commit log, but also added a
    mddev->open_mutex critical section over add_disk and creation of the
    md kobj.  Adding a kobject after add_disk is racy vs deleting the gendisk
    right after adding it, but md already prevents against that by holding
    a mddev->active reference.
    
    On the other hand taking this lock added a lock order reversal with what
    is not disk->open_mutex (used to be bdev->bd_mutex when the commit was
    added) for partition devices, which need that lock for the internal open
    for the partition scan, and a recent commit also takes it for
    non-partitioned devices, leading to further lockdep splatter.
    
    Fixes: b0140891a8ce ("md: Fix race when creating a new md device.")
    Fixes: d62633873590 ("block: support delayed holder registration")
    Reported-by: syzbot+fadc0aaf497e6a493b9f@syzkaller.appspotmail.com
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Tested-by: syzbot+fadc0aaf497e6a493b9f@syzkaller.appspotmail.com
    Reviewed-by: NeilBrown <neilb@suse.de>
    Signed-off-by: Song Liu <songliubraving@fb.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/md/md.c b/drivers/md/md.c
index fae6a983ceee..7e0477e883c7 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -5401,10 +5401,6 @@ static int md_alloc(dev_t dev, char *name)
 	 */
 	disk->flags |= GENHD_FL_EXT_DEVT;
 	mddev->gendisk = disk;
-	/* As soon as we call add_disk(), another thread could get
-	 * through to md_open, so make sure it doesn't get too far
-	 */
-	mutex_lock(&mddev->open_mutex);
 	add_disk(disk);
 
 	error = kobject_add(&mddev->kobj, &disk_to_dev(disk)->kobj, "%s", "md");
@@ -5419,7 +5415,6 @@ static int md_alloc(dev_t dev, char *name)
 	if (mddev->kobj.sd &&
 	    sysfs_create_group(&mddev->kobj, &md_bitmap_group))
 		pr_debug("pointless warning\n");
-	mutex_unlock(&mddev->open_mutex);
  abort:
 	mutex_unlock(&disks_mutex);
 	if (!error && mddev->kobj.sd) {

commit 5701e8bff314c155e7afdc467b1e0389d86853d0
Author: Kaige Fu <kaige.fu@linux.alibaba.com>
Date:   Wed Sep 15 10:20:55 2021 +0800

    irqchip/gic-v3-its: Fix potential VPE leak on error
    
    [ Upstream commit 280bef512933b2dda01d681d8cbe499b98fc5bdd ]
    
    In its_vpe_irq_domain_alloc, when its_vpe_init() returns an error,
    there is an off-by-one in the number of VPEs to be freed.
    
    Fix it by simply passing the number of VPEs allocated, which is the
    index of the loop iterating over the VPEs.
    
    Fixes: 7d75bbb4bc1a ("irqchip/gic-v3-its: Add VPE irq domain allocation/teardown")
    Signed-off-by: Kaige Fu <kaige.fu@linux.alibaba.com>
    [maz: fixed commit message]
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/d9e36dee512e63670287ed9eff884a5d8d6d27f2.1631672311.git.kaige.fu@linux.alibaba.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
index cd58c123f547..b55dff1aa50b 100644
--- a/drivers/irqchip/irq-gic-v3-its.c
+++ b/drivers/irqchip/irq-gic-v3-its.c
@@ -2996,7 +2996,7 @@ static int its_vpe_irq_domain_alloc(struct irq_domain *domain, unsigned int virq
 
 	if (err) {
 		if (i > 0)
-			its_vpe_irq_domain_free(domain, virq, i - 1);
+			its_vpe_irq_domain_free(domain, virq, i);
 
 		its_lpi_free(bitmap, base, nr_ids);
 		its_free_prop_table(vprop_page);

commit e724279bcd180de641754aed77cdc0dcf153d711
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Sun Sep 5 09:25:19 2021 -0700

    irqchip/goldfish-pic: Select GENERIC_IRQ_CHIP to fix build
    
    [ Upstream commit 969ac78db78c723a24e9410666b457cc1b0cb3c3 ]
    
    irq-goldfish-pic uses GENERIC_IRQ_CHIP interfaces so select that symbol
    to fix build errors.
    
    Fixes these build errors:
    
    mips-linux-ld: drivers/irqchip/irq-goldfish-pic.o: in function `goldfish_pic_of_init':
    irq-goldfish-pic.c:(.init.text+0xc0): undefined reference to `irq_alloc_generic_chip'
    mips-linux-ld: irq-goldfish-pic.c:(.init.text+0xf4): undefined reference to `irq_gc_unmask_enable_reg'
    mips-linux-ld: irq-goldfish-pic.c:(.init.text+0xf8): undefined reference to `irq_gc_unmask_enable_reg'
    mips-linux-ld: irq-goldfish-pic.c:(.init.text+0x100): undefined reference to `irq_gc_mask_disable_reg'
    mips-linux-ld: irq-goldfish-pic.c:(.init.text+0x104): undefined reference to `irq_gc_mask_disable_reg'
    mips-linux-ld: irq-goldfish-pic.c:(.init.text+0x11c): undefined reference to `irq_setup_generic_chip'
    mips-linux-ld: irq-goldfish-pic.c:(.init.text+0x168): undefined reference to `irq_remove_generic_chip'
    
    Fixes: 4235ff50cf98 ("irqchip/irq-goldfish-pic: Add Goldfish PIC driver")
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Reported-by: kernel test robot <lkp@intel.com>
    Cc: Miodrag Dinic <miodrag.dinic@mips.com>
    Cc: Geert Uytterhoeven <geert+renesas@glider.be>
    Cc: Bartosz Golaszewski <bgolaszewski@baylibre.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Marc Zyngier <maz@kernel.org>
    Cc: Goran Ferenc <goran.ferenc@mips.com>
    Cc: Aleksandar Markovic <aleksandar.markovic@mips.com>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20210905162519.21507-1-rdunlap@infradead.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index 8cb6800dbdfb..9d3812cd668e 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -357,6 +357,7 @@ config MESON_IRQ_GPIO
 config GOLDFISH_PIC
        bool "Goldfish programmable interrupt controller"
        depends on MIPS && (GOLDFISH || COMPILE_TEST)
+       select GENERIC_IRQ_CHIP
        select IRQ_DOMAIN
        help
          Say yes here to enable Goldfish interrupt controller driver used

commit b7bc1c70375512100a6fadcd480e9d7abc523761
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Thu Sep 16 16:13:42 2021 +0300

    thermal/core: Potential buffer overflow in thermal_build_list_of_policies()
    
    [ Upstream commit 1bb30b20b49773369c299d4d6c65227201328663 ]
    
    After printing the list of thermal governors, then this function prints
    a newline character.  The problem is that "size" has not been updated
    after printing the last governor.  This means that it can write one
    character (the NUL terminator) beyond the end of the buffer.
    
    Get rid of the "size" variable and just use "PAGE_SIZE - count" directly.
    
    Fixes: 1b4f48494eb2 ("thermal: core: group functions related to governor handling")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
    Link: https://lore.kernel.org/r/20210916131342.GB25094@kili
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index a24296d68f3e..ae60599c462b 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -228,15 +228,14 @@ int thermal_build_list_of_policies(char *buf)
 {
 	struct thermal_governor *pos;
 	ssize_t count = 0;
-	ssize_t size = PAGE_SIZE;
 
 	mutex_lock(&thermal_governor_lock);
 
 	list_for_each_entry(pos, &thermal_governor_list, governor_list) {
-		size = PAGE_SIZE - count;
-		count += scnprintf(buf + count, size, "%s ", pos->name);
+		count += scnprintf(buf + count, PAGE_SIZE - count, "%s ",
+				   pos->name);
 	}
-	count += scnprintf(buf + count, size, "\n");
+	count += scnprintf(buf + count, PAGE_SIZE - count, "\n");
 
 	mutex_unlock(&thermal_governor_lock);
 

commit 3fa6a4a56de070da2a49a89d448ae24955909863
Author: Jiapeng Chong <jiapeng.chong@linux.alibaba.com>
Date:   Fri Aug 13 14:40:42 2021 +0800

    fpga: machxo2-spi: Fix missing error code in machxo2_write_complete()
    
    [ Upstream commit a1e4470823d99e75b596748086e120dea169ed3c ]
    
    The error code is missing in this code scenario, add the error code
    '-EINVAL' to the return value 'ret'.
    
    Eliminate the follow smatch warning:
    
    drivers/fpga/machxo2-spi.c:341 machxo2_write_complete()
      warn: missing error code 'ret'.
    
    [mdf@kernel.org: Reworded commit message]
    Fixes: 88fb3a002330 ("fpga: lattice machxo2: Add Lattice MachXO2 support")
    Reported-by: Abaci Robot <abaci@linux.alibaba.com>
    Signed-off-by: Jiapeng Chong <jiapeng.chong@linux.alibaba.com>
    Signed-off-by: Moritz Fischer <mdf@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/fpga/machxo2-spi.c b/drivers/fpga/machxo2-spi.c
index e3cbd7ff9dc9..fa76239f979b 100644
--- a/drivers/fpga/machxo2-spi.c
+++ b/drivers/fpga/machxo2-spi.c
@@ -334,6 +334,7 @@ static int machxo2_write_complete(struct fpga_manager *mgr,
 			break;
 		if (++refreshloop == MACHXO2_MAX_REFRESH_LOOP) {
 			machxo2_cleanup(mgr);
+			ret = -EINVAL;
 			goto fail;
 		}
 	} while (1);

commit 12a40b34bde68bf417335a07368850f582c0c928
Author: Tom Rix <trix@redhat.com>
Date:   Tue Aug 10 09:40:36 2021 -0700

    fpga: machxo2-spi: Return an error on failure
    
    [ Upstream commit 34331739e19fd6a293d488add28832ad49c9fc54 ]
    
    Earlier successes leave 'ret' in a non error state, so these errors are
    not reported. Set ret to -EINVAL before going to the error handler.
    
    This addresses two issues reported by smatch:
    drivers/fpga/machxo2-spi.c:229 machxo2_write_init()
      warn: missing error code 'ret'
    
    drivers/fpga/machxo2-spi.c:316 machxo2_write_complete()
      warn: missing error code 'ret'
    
    [mdf@kernel.org: Reworded commit message]
    Fixes: 88fb3a002330 ("fpga: lattice machxo2: Add Lattice MachXO2 support")
    Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Tom Rix <trix@redhat.com>
    Signed-off-by: Moritz Fischer <mdf@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/fpga/machxo2-spi.c b/drivers/fpga/machxo2-spi.c
index a582e0000c97..e3cbd7ff9dc9 100644
--- a/drivers/fpga/machxo2-spi.c
+++ b/drivers/fpga/machxo2-spi.c
@@ -223,8 +223,10 @@ static int machxo2_write_init(struct fpga_manager *mgr,
 		goto fail;
 
 	get_status(spi, &status);
-	if (test_bit(FAIL, &status))
+	if (test_bit(FAIL, &status)) {
+		ret = -EINVAL;
 		goto fail;
+	}
 	dump_status_reg(&status);
 
 	spi_message_init(&msg);
@@ -310,6 +312,7 @@ static int machxo2_write_complete(struct fpga_manager *mgr,
 	dump_status_reg(&status);
 	if (!test_bit(DONE, &status)) {
 		machxo2_cleanup(mgr);
+		ret = -EINVAL;
 		goto fail;
 	}
 

commit 1b94938d3a8c410576f4a04adadf62a7964d854f
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Wed Sep 1 17:38:06 2021 -0700

    tty: synclink_gt: rename a conflicting function name
    
    [ Upstream commit 06e49073dfba24df4b1073a068631b13a0039c34 ]
    
    'set_signals()' in synclink_gt.c conflicts with an exported symbol
    in arch/um/, so change set_signals() to set_gtsignals(). Keep
    the function names similar by also changing get_signals() to
    get_gtsignals().
    
    ../drivers/tty/synclink_gt.c:442:13: error: conflicting types for ?set_signals??     static void set_signals(struct slgt_info *info);
                 ^~~~~~~~~~~
    In file included from ../include/linux/irqflags.h:16:0,
                     from ../include/linux/spinlock.h:58,
                     from ../include/linux/mm_types.h:9,
                     from ../include/linux/buildid.h:5,
                     from ../include/linux/module.h:14,
                     from ../drivers/tty/synclink_gt.c:46:
    ../arch/um/include/asm/irqflags.h:6:5: note: previous declaration of ?set_signals??was here
     int set_signals(int enable);
         ^~~~~~~~~~~
    
    Fixes: 705b6c7b34f2 ("[PATCH] new driver synclink_gt")
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Jiri Slaby <jirislaby@kernel.org>
    Cc: Paul Fulghum <paulkf@microgate.com>
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Link: https://lore.kernel.org/r/20210902003806.17054-1-rdunlap@infradead.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/synclink_gt.c b/drivers/tty/synclink_gt.c
index 503836be5fe2..afe34beec720 100644
--- a/drivers/tty/synclink_gt.c
+++ b/drivers/tty/synclink_gt.c
@@ -438,8 +438,8 @@ static void reset_tbufs(struct slgt_info *info);
 static void tdma_reset(struct slgt_info *info);
 static bool tx_load(struct slgt_info *info, const char *buf, unsigned int count);
 
-static void get_signals(struct slgt_info *info);
-static void set_signals(struct slgt_info *info);
+static void get_gtsignals(struct slgt_info *info);
+static void set_gtsignals(struct slgt_info *info);
 static void set_rate(struct slgt_info *info, u32 data_rate);
 
 static void bh_transmit(struct slgt_info *info);
@@ -721,7 +721,7 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios)
 	if ((old_termios->c_cflag & CBAUD) && !C_BAUD(tty)) {
 		info->signals &= ~(SerialSignal_RTS | SerialSignal_DTR);
 		spin_lock_irqsave(&info->lock,flags);
-		set_signals(info);
+		set_gtsignals(info);
 		spin_unlock_irqrestore(&info->lock,flags);
 	}
 
@@ -731,7 +731,7 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios)
 		if (!C_CRTSCTS(tty) || !tty_throttled(tty))
 			info->signals |= SerialSignal_RTS;
 		spin_lock_irqsave(&info->lock,flags);
-	 	set_signals(info);
+	 	set_gtsignals(info);
 		spin_unlock_irqrestore(&info->lock,flags);
 	}
 
@@ -1183,7 +1183,7 @@ static inline void line_info(struct seq_file *m, struct slgt_info *info)
 
 	/* output current serial signal states */
 	spin_lock_irqsave(&info->lock,flags);
-	get_signals(info);
+	get_gtsignals(info);
 	spin_unlock_irqrestore(&info->lock,flags);
 
 	stat_buf[0] = 0;
@@ -1283,7 +1283,7 @@ static void throttle(struct tty_struct * tty)
 	if (C_CRTSCTS(tty)) {
 		spin_lock_irqsave(&info->lock,flags);
 		info->signals &= ~SerialSignal_RTS;
-		set_signals(info);
+		set_gtsignals(info);
 		spin_unlock_irqrestore(&info->lock,flags);
 	}
 }
@@ -1308,7 +1308,7 @@ static void unthrottle(struct tty_struct * tty)
 	if (C_CRTSCTS(tty)) {
 		spin_lock_irqsave(&info->lock,flags);
 		info->signals |= SerialSignal_RTS;
-		set_signals(info);
+		set_gtsignals(info);
 		spin_unlock_irqrestore(&info->lock,flags);
 	}
 }
@@ -1480,7 +1480,7 @@ static int hdlcdev_open(struct net_device *dev)
 
 	/* inform generic HDLC layer of current DCD status */
 	spin_lock_irqsave(&info->lock, flags);
-	get_signals(info);
+	get_gtsignals(info);
 	spin_unlock_irqrestore(&info->lock, flags);
 	if (info->signals & SerialSignal_DCD)
 		netif_carrier_on(dev);
@@ -2236,7 +2236,7 @@ static void isr_txeom(struct slgt_info *info, unsigned short status)
 		if (info->params.mode != MGSL_MODE_ASYNC && info->drop_rts_on_tx_done) {
 			info->signals &= ~SerialSignal_RTS;
 			info->drop_rts_on_tx_done = false;
-			set_signals(info);
+			set_gtsignals(info);
 		}
 
 #if SYNCLINK_GENERIC_HDLC
@@ -2401,7 +2401,7 @@ static void shutdown(struct slgt_info *info)
 
  	if (!info->port.tty || info->port.tty->termios.c_cflag & HUPCL) {
 		info->signals &= ~(SerialSignal_RTS | SerialSignal_DTR);
-		set_signals(info);
+		set_gtsignals(info);
 	}
 
 	flush_cond_wait(&info->gpio_wait_q);
@@ -2429,7 +2429,7 @@ static void program_hw(struct slgt_info *info)
 	else
 		async_mode(info);
 
-	set_signals(info);
+	set_gtsignals(info);
 
 	info->dcd_chkcount = 0;
 	info->cts_chkcount = 0;
@@ -2437,7 +2437,7 @@ static void program_hw(struct slgt_info *info)
 	info->dsr_chkcount = 0;
 
 	slgt_irq_on(info, IRQ_DCD | IRQ_CTS | IRQ_DSR | IRQ_RI);
-	get_signals(info);
+	get_gtsignals(info);
 
 	if (info->netcount ||
 	    (info->port.tty && info->port.tty->termios.c_cflag & CREAD))
@@ -2681,7 +2681,7 @@ static int wait_mgsl_event(struct slgt_info *info, int __user *mask_ptr)
 	spin_lock_irqsave(&info->lock,flags);
 
 	/* return immediately if state matches requested events */
-	get_signals(info);
+	get_gtsignals(info);
 	s = info->signals;
 
 	events = mask &
@@ -3099,7 +3099,7 @@ static int tiocmget(struct tty_struct *tty)
  	unsigned long flags;
 
 	spin_lock_irqsave(&info->lock,flags);
- 	get_signals(info);
+ 	get_gtsignals(info);
 	spin_unlock_irqrestore(&info->lock,flags);
 
 	result = ((info->signals & SerialSignal_RTS) ? TIOCM_RTS:0) +
@@ -3138,7 +3138,7 @@ static int tiocmset(struct tty_struct *tty,
 		info->signals &= ~SerialSignal_DTR;
 
 	spin_lock_irqsave(&info->lock,flags);
-	set_signals(info);
+	set_gtsignals(info);
 	spin_unlock_irqrestore(&info->lock,flags);
 	return 0;
 }
@@ -3149,7 +3149,7 @@ static int carrier_raised(struct tty_port *port)
 	struct slgt_info *info = container_of(port, struct slgt_info, port);
 
 	spin_lock_irqsave(&info->lock,flags);
-	get_signals(info);
+	get_gtsignals(info);
 	spin_unlock_irqrestore(&info->lock,flags);
 	return (info->signals & SerialSignal_DCD) ? 1 : 0;
 }
@@ -3164,7 +3164,7 @@ static void dtr_rts(struct tty_port *port, int on)
 		info->signals |= SerialSignal_RTS | SerialSignal_DTR;
 	else
 		info->signals &= ~(SerialSignal_RTS | SerialSignal_DTR);
-	set_signals(info);
+	set_gtsignals(info);
 	spin_unlock_irqrestore(&info->lock,flags);
 }
 
@@ -3963,10 +3963,10 @@ static void tx_start(struct slgt_info *info)
 
 		if (info->params.mode != MGSL_MODE_ASYNC) {
 			if (info->params.flags & HDLC_FLAG_AUTO_RTS) {
-				get_signals(info);
+				get_gtsignals(info);
 				if (!(info->signals & SerialSignal_RTS)) {
 					info->signals |= SerialSignal_RTS;
-					set_signals(info);
+					set_gtsignals(info);
 					info->drop_rts_on_tx_done = true;
 				}
 			}
@@ -4020,7 +4020,7 @@ static void reset_port(struct slgt_info *info)
 	rx_stop(info);
 
 	info->signals &= ~(SerialSignal_RTS | SerialSignal_DTR);
-	set_signals(info);
+	set_gtsignals(info);
 
 	slgt_irq_off(info, IRQ_ALL | IRQ_MASTER);
 }
@@ -4442,7 +4442,7 @@ static void tx_set_idle(struct slgt_info *info)
 /*
  * get state of V24 status (input) signals
  */
-static void get_signals(struct slgt_info *info)
+static void get_gtsignals(struct slgt_info *info)
 {
 	unsigned short status = rd_reg16(info, SSR);
 
@@ -4504,7 +4504,7 @@ static void msc_set_vcr(struct slgt_info *info)
 /*
  * set state of V24 control (output) signals
  */
-static void set_signals(struct slgt_info *info)
+static void set_gtsignals(struct slgt_info *info)
 {
 	unsigned char val = rd_reg8(info, VCR);
 	if (info->signals & SerialSignal_DTR)

commit 9dbdd760f7ff9410f2cfe51ec80fc42884474f08
Author: Jiri Slaby <jslaby@suse.cz>
Date:   Tue Mar 2 07:22:09 2021 +0100

    tty: synclink_gt, drop unneeded forward declarations
    
    [ Upstream commit b9b90fe655c0bd816847ac1bcbf179cfa2981ecb ]
    
    Forward declarations make the code larger and rewrites harder. Harder as
    they are often omitted from global changes. Remove forward declarations
    which are not really needed, i.e. the definition of the function is
    before its first use.
    
    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    Link: https://lore.kernel.org/r/20210302062214.29627-39-jslaby@suse.cz
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/synclink_gt.c b/drivers/tty/synclink_gt.c
index e9779b03ee56..503836be5fe2 100644
--- a/drivers/tty/synclink_gt.c
+++ b/drivers/tty/synclink_gt.c
@@ -137,37 +137,14 @@ MODULE_PARM_DESC(maxframe, "Maximum frame size used by device (4096 to 65535)");
  */
 static struct tty_driver *serial_driver;
 
-static int  open(struct tty_struct *tty, struct file * filp);
-static void close(struct tty_struct *tty, struct file * filp);
-static void hangup(struct tty_struct *tty);
-static void set_termios(struct tty_struct *tty, struct ktermios *old_termios);
-
-static int  write(struct tty_struct *tty, const unsigned char *buf, int count);
-static int put_char(struct tty_struct *tty, unsigned char ch);
-static void send_xchar(struct tty_struct *tty, char ch);
 static void wait_until_sent(struct tty_struct *tty, int timeout);
-static int  write_room(struct tty_struct *tty);
-static void flush_chars(struct tty_struct *tty);
 static void flush_buffer(struct tty_struct *tty);
-static void tx_hold(struct tty_struct *tty);
 static void tx_release(struct tty_struct *tty);
 
-static int  ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg);
-static int  chars_in_buffer(struct tty_struct *tty);
-static void throttle(struct tty_struct * tty);
-static void unthrottle(struct tty_struct * tty);
-static int set_break(struct tty_struct *tty, int break_state);
-
 /*
- * generic HDLC support and callbacks
+ * generic HDLC support
  */
-#if SYNCLINK_GENERIC_HDLC
 #define dev_to_port(D) (dev_to_hdlc(D)->priv)
-static void hdlcdev_tx_done(struct slgt_info *info);
-static void hdlcdev_rx(struct slgt_info *info, char *buf, int size);
-static int  hdlcdev_init(struct slgt_info *info);
-static void hdlcdev_exit(struct slgt_info *info);
-#endif
 
 
 /*
@@ -186,9 +163,6 @@ struct cond_wait {
 	wait_queue_entry_t wait;
 	unsigned int data;
 };
-static void init_cond_wait(struct cond_wait *w, unsigned int data);
-static void add_cond_wait(struct cond_wait **head, struct cond_wait *w);
-static void remove_cond_wait(struct cond_wait **head, struct cond_wait *w);
 static void flush_cond_wait(struct cond_wait **head);
 
 /*
@@ -443,12 +417,8 @@ static void shutdown(struct slgt_info *info);
 static void program_hw(struct slgt_info *info);
 static void change_params(struct slgt_info *info);
 
-static int  register_test(struct slgt_info *info);
-static int  irq_test(struct slgt_info *info);
-static int  loopback_test(struct slgt_info *info);
 static int  adapter_test(struct slgt_info *info);
 
-static void reset_adapter(struct slgt_info *info);
 static void reset_port(struct slgt_info *info);
 static void async_mode(struct slgt_info *info);
 static void sync_mode(struct slgt_info *info);
@@ -457,14 +427,12 @@ static void rx_stop(struct slgt_info *info);
 static void rx_start(struct slgt_info *info);
 static void reset_rbufs(struct slgt_info *info);
 static void free_rbufs(struct slgt_info *info, unsigned int first, unsigned int last);
-static void rdma_reset(struct slgt_info *info);
 static bool rx_get_frame(struct slgt_info *info);
 static bool rx_get_buf(struct slgt_info *info);
 
 static void tx_start(struct slgt_info *info);
 static void tx_stop(struct slgt_info *info);
 static void tx_set_idle(struct slgt_info *info);
-static unsigned int free_tbuf_count(struct slgt_info *info);
 static unsigned int tbuf_bytes(struct slgt_info *info);
 static void reset_tbufs(struct slgt_info *info);
 static void tdma_reset(struct slgt_info *info);
@@ -472,26 +440,10 @@ static bool tx_load(struct slgt_info *info, const char *buf, unsigned int count)
 
 static void get_signals(struct slgt_info *info);
 static void set_signals(struct slgt_info *info);
-static void enable_loopback(struct slgt_info *info);
 static void set_rate(struct slgt_info *info, u32 data_rate);
 
-static int  bh_action(struct slgt_info *info);
-static void bh_handler(struct work_struct *work);
 static void bh_transmit(struct slgt_info *info);
-static void isr_serial(struct slgt_info *info);
-static void isr_rdma(struct slgt_info *info);
 static void isr_txeom(struct slgt_info *info, unsigned short status);
-static void isr_tdma(struct slgt_info *info);
-
-static int  alloc_dma_bufs(struct slgt_info *info);
-static void free_dma_bufs(struct slgt_info *info);
-static int  alloc_desc(struct slgt_info *info);
-static void free_desc(struct slgt_info *info);
-static int  alloc_bufs(struct slgt_info *info, struct slgt_desc *bufs, int count);
-static void free_bufs(struct slgt_info *info, struct slgt_desc *bufs, int count);
-
-static int  alloc_tmp_rbuf(struct slgt_info *info);
-static void free_tmp_rbuf(struct slgt_info *info);
 
 static void tx_timeout(struct timer_list *t);
 static void rx_timeout(struct timer_list *t);
@@ -509,10 +461,6 @@ static int  tx_abort(struct slgt_info *info);
 static int  rx_enable(struct slgt_info *info, int enable);
 static int  modem_input_wait(struct slgt_info *info,int arg);
 static int  wait_mgsl_event(struct slgt_info *info, int __user *mask_ptr);
-static int  tiocmget(struct tty_struct *tty);
-static int  tiocmset(struct tty_struct *tty,
-				unsigned int set, unsigned int clear);
-static int set_break(struct tty_struct *tty, int break_state);
 static int  get_interface(struct slgt_info *info, int __user *if_mode);
 static int  set_interface(struct slgt_info *info, int if_mode);
 static int  set_gpio(struct slgt_info *info, struct gpio_desc __user *gpio);
@@ -526,9 +474,6 @@ static int  set_xctrl(struct slgt_info *info, int if_mode);
 /*
  * driver functions
  */
-static void add_device(struct slgt_info *info);
-static void device_init(int adapter_num, struct pci_dev *pdev);
-static int  claim_resources(struct slgt_info *info);
 static void release_resources(struct slgt_info *info);
 
 /*

commit 0e82e793caa01b744641d0f9f23b7e1cac12a056
Author: Baokun Li <libaokun1@huawei.com>
Date:   Wed Sep 1 16:53:36 2021 +0800

    scsi: iscsi: Adjust iface sysfs attr detection
    
    [ Upstream commit 4e28550829258f7dab97383acaa477bd724c0ff4 ]
    
    ISCSI_NET_PARAM_IFACE_ENABLE belongs to enum iscsi_net_param instead of
    iscsi_iface_param so move it to ISCSI_NET_PARAM. Otherwise, when we call
    into the driver, we might not match and return that we don't want attr
    visible in sysfs. Found in code review.
    
    Link: https://lore.kernel.org/r/20210901085336.2264295-1-libaokun1@huawei.com
    Fixes: e746f3451ec7 ("scsi: iscsi: Fix iface sysfs attr detection")
    Reviewed-by: Lee Duncan <lduncan@suse.com>
    Signed-off-by: Baokun Li <libaokun1@huawei.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
index 20e69052161e..c06e648a415b 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -429,9 +429,7 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,
 	struct iscsi_transport *t = iface->transport;
 	int param = -1;
 
-	if (attr == &dev_attr_iface_enabled.attr)
-		param = ISCSI_NET_PARAM_IFACE_ENABLE;
-	else if (attr == &dev_attr_iface_def_taskmgmt_tmo.attr)
+	if (attr == &dev_attr_iface_def_taskmgmt_tmo.attr)
 		param = ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO;
 	else if (attr == &dev_attr_iface_header_digest.attr)
 		param = ISCSI_IFACE_PARAM_HDRDGST_EN;
@@ -471,7 +469,9 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,
 	if (param != -1)
 		return t->attr_is_visible(ISCSI_IFACE_PARAM, param);
 
-	if (attr == &dev_attr_iface_vlan_id.attr)
+	if (attr == &dev_attr_iface_enabled.attr)
+		param = ISCSI_NET_PARAM_IFACE_ENABLE;
+	else if (attr == &dev_attr_iface_vlan_id.attr)
 		param = ISCSI_NET_PARAM_VLAN_ID;
 	else if (attr == &dev_attr_iface_vlan_priority.attr)
 		param = ISCSI_NET_PARAM_VLAN_PRIORITY;

commit 1192c198ea42a29ddc06813b20d1e3b2e25d4288
Author: Aya Levin <ayal@nvidia.com>
Date:   Thu Sep 23 09:51:45 2021 +0300

    net/mlx4_en: Don't allow aRFS for encapsulated packets
    
    [ Upstream commit fdbccea419dc782079ce5881d2705cc9e3881480 ]
    
    Driver doesn't support aRFS for encapsulated packets, return early error
    in such a case.
    
    Fixes: 1eb8c695bda9 ("net/mlx4_en: Add accelerated RFS support")
    Signed-off-by: Aya Levin <ayal@nvidia.com>
    Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index f3a0617733d8..943bd189e895 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -372,6 +372,9 @@ mlx4_en_filter_rfs(struct net_device *net_dev, const struct sk_buff *skb,
 	int nhoff = skb_network_offset(skb);
 	int ret = 0;
 
+	if (skb->encapsulation)
+		return -EPROTONOSUPPORT;
+
 	if (skb->protocol != htons(ETH_P_IP))
 		return -EPROTONOSUPPORT;
 

commit f5f9afab8bbbec241d0e26795d4e4ab3825e765e
Author: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
Date:   Thu Sep 16 20:19:35 2021 +0900

    gpio: uniphier: Fix void functions to remove return value
    
    [ Upstream commit 2dd824cca3407bc9a2bd11b00f6e117b66fcfcf1 ]
    
    The return type of irq_chip.irq_mask() and irq_chip.irq_unmask() should
    be void.
    
    Fixes: dbe776c2ca54 ("gpio: uniphier: add UniPhier GPIO controller driver")
    Signed-off-by: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
    Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpio/gpio-uniphier.c b/drivers/gpio/gpio-uniphier.c
index 7fdac9060979..c72ec3ddf90b 100644
--- a/drivers/gpio/gpio-uniphier.c
+++ b/drivers/gpio/gpio-uniphier.c
@@ -197,7 +197,7 @@ static void uniphier_gpio_irq_mask(struct irq_data *data)
 
 	uniphier_gpio_reg_update(priv, UNIPHIER_GPIO_IRQ_EN, mask, 0);
 
-	return irq_chip_mask_parent(data);
+	irq_chip_mask_parent(data);
 }
 
 static void uniphier_gpio_irq_unmask(struct irq_data *data)
@@ -207,7 +207,7 @@ static void uniphier_gpio_irq_unmask(struct irq_data *data)
 
 	uniphier_gpio_reg_update(priv, UNIPHIER_GPIO_IRQ_EN, mask, mask);
 
-	return irq_chip_unmask_parent(data);
+	irq_chip_unmask_parent(data);
 }
 
 static int uniphier_gpio_irq_set_type(struct irq_data *data, unsigned int type)

commit ef57ed80fb9a6dbd3166d466a2c9c14f2d717dbb
Author: Karsten Graul <kgraul@linux.ibm.com>
Date:   Mon Sep 20 21:18:14 2021 +0200

    net/smc: add missing error check in smc_clc_prfx_set()
    
    [ Upstream commit 6c90731980655280ea07ce4b21eb97457bf86286 ]
    
    Coverity stumbled over a missing error check in smc_clc_prfx_set():
    
    *** CID 1475954:  Error handling issues  (CHECKED_RETURN)
    /net/smc/smc_clc.c: 233 in smc_clc_prfx_set()
    >>>     CID 1475954:  Error handling issues  (CHECKED_RETURN)
    >>>     Calling "kernel_getsockname" without checking return value (as is done elsewhere 8 out of 10 times).
    233             kernel_getsockname(clcsock, (struct sockaddr *)&addrs);
    
    Add the return code check in smc_clc_prfx_set().
    
    Fixes: c246d942eabc ("net/smc: restructure netinfo for CLC proposal msgs")
    Reported-by: Julian Wiedmann <jwi@linux.ibm.com>
    Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/smc/smc_clc.c b/net/smc/smc_clc.c
index aa9a17ac1f7b..063acfbdcd89 100644
--- a/net/smc/smc_clc.c
+++ b/net/smc/smc_clc.c
@@ -162,7 +162,8 @@ static int smc_clc_prfx_set(struct socket *clcsock,
 		goto out_rel;
 	}
 	/* get address to which the internal TCP socket is bound */
-	kernel_getsockname(clcsock, (struct sockaddr *)&addrs);
+	if (kernel_getsockname(clcsock, (struct sockaddr *)&addrs) < 0)
+		goto out_rel;
 	/* analyze IP specific data of net_device belonging to TCP socket */
 	addr6 = (struct sockaddr_in6 *)&addrs;
 	rcu_read_lock();

commit 17280ed7466909d424f96b464d131fb80a4ad5cb
Author: Michael Chan <michael.chan@broadcom.com>
Date:   Mon Sep 20 02:51:52 2021 -0400

    bnxt_en: Fix TX timeout when TX ring size is set to the smallest
    
    [ Upstream commit 5bed8b0704c9ecccc8f4a2c377d7c8e21090a82e ]
    
    The smallest TX ring size we support must fit a TX SKB with MAX_SKB_FRAGS
    + 1.  Because the first TX BD for a packet is always a long TX BD, we
    need an extra TX BD to fit this packet.  Define BNXT_MIN_TX_DESC_CNT with
    this value to make this more clear.  The current code uses a minimum
    that is off by 1.  Fix it using this constant.
    
    The tx_wake_thresh to determine when to wake up the TX queue is half the
    ring size but we must have at least BNXT_MIN_TX_DESC_CNT for the next
    packet which may have maximum fragments.  So the comparison of the
    available TX BDs with tx_wake_thresh should be >= instead of > in the
    current code.  Otherwise, at the smallest ring size, we will never wake
    up the TX queue and will cause TX timeout.
    
    Fixes: c0c050c58d84 ("bnxt_en: New Broadcom ethernet driver.")
    Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
    Signed-off-by: Michael Chan <michael.chan@broadocm.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 55827ac65a15..5e30299bcf64 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -294,7 +294,7 @@ static bool bnxt_txr_netif_try_stop_queue(struct bnxt *bp,
 	 * netif_tx_queue_stopped().
 	 */
 	smp_mb();
-	if (bnxt_tx_avail(bp, txr) > bp->tx_wake_thresh) {
+	if (bnxt_tx_avail(bp, txr) >= bp->tx_wake_thresh) {
 		netif_tx_wake_queue(txq);
 		return false;
 	}
@@ -625,7 +625,7 @@ static void bnxt_tx_int(struct bnxt *bp, struct bnxt_napi *bnapi, int nr_pkts)
 	smp_mb();
 
 	if (unlikely(netif_tx_queue_stopped(txq)) &&
-	    bnxt_tx_avail(bp, txr) > bp->tx_wake_thresh &&
+	    bnxt_tx_avail(bp, txr) >= bp->tx_wake_thresh &&
 	    READ_ONCE(txr->dev_state) != BNXT_DEV_STATE_CLOSING)
 		netif_tx_wake_queue(txq);
 }
@@ -1909,7 +1909,7 @@ static int bnxt_poll_work(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
 		if (TX_CMP_TYPE(txcmp) == CMP_TYPE_TX_L2_CMP) {
 			tx_pkts++;
 			/* return full budget so NAPI will complete. */
-			if (unlikely(tx_pkts > bp->tx_wake_thresh)) {
+			if (unlikely(tx_pkts >= bp->tx_wake_thresh)) {
 				rx_pkts = budget;
 				raw_cons = NEXT_RAW_CMP(raw_cons);
 				break;
@@ -2712,7 +2712,7 @@ static int bnxt_init_tx_rings(struct bnxt *bp)
 	u16 i;
 
 	bp->tx_wake_thresh = max_t(int, bp->tx_ring_size / 2,
-				   MAX_SKB_FRAGS + 1);
+				   BNXT_MIN_TX_DESC_CNT);
 
 	for (i = 0; i < bp->tx_nr_rings; i++) {
 		struct bnxt_tx_ring_info *txr = &bp->tx_ring[i];
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
index f3f5484c43e4..5c1c3a0ed928 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
@@ -484,6 +484,11 @@ struct rx_tpa_end_cmp_ext {
 #define BNXT_MAX_RX_JUM_DESC_CNT	(RX_DESC_CNT * MAX_RX_AGG_PAGES - 1)
 #define BNXT_MAX_TX_DESC_CNT		(TX_DESC_CNT * MAX_TX_PAGES - 1)
 
+/* Minimum TX BDs for a TX packet with MAX_SKB_FRAGS + 1.  We need one extra
+ * BD because the first TX BD is always a long BD.
+ */
+#define BNXT_MIN_TX_DESC_CNT		(MAX_SKB_FRAGS + 2)
+
 #define RX_RING(x)	(((x) & ~(RX_DESC_CNT - 1)) >> (BNXT_PAGE_SHIFT - 4))
 #define RX_IDX(x)	((x) & (RX_DESC_CNT - 1))
 
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
index 511240e8246f..e75a47a9f511 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
@@ -446,7 +446,7 @@ static int bnxt_set_ringparam(struct net_device *dev,
 
 	if ((ering->rx_pending > BNXT_MAX_RX_DESC_CNT) ||
 	    (ering->tx_pending > BNXT_MAX_TX_DESC_CNT) ||
-	    (ering->tx_pending <= MAX_SKB_FRAGS))
+	    (ering->tx_pending < BNXT_MIN_TX_DESC_CNT))
 		return -EINVAL;
 
 	if (netif_running(dev))

commit 88aa7727a6f614b5a3bc17198d677e419598ad8b
Author: Johan Hovold <johan@kernel.org>
Date:   Fri Sep 17 12:12:04 2021 +0200

    net: hso: fix muxed tty registration
    
    commit e8f69b16ee776da88589b5271e3f46020efc8f6c upstream.
    
    If resource allocation and registration fail for a muxed tty device
    (e.g. if there are no more minor numbers) the driver should not try to
    deregister the never-registered (or already-deregistered) tty.
    
    Fix up the error handling to avoid dereferencing a NULL pointer when
    attempting to remove the character device.
    
    Fixes: 72dc1c096c70 ("HSO: add option hso driver")
    Cc: stable@vger.kernel.org      # 2.6.27
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c
index a66077f51457..236f1a288080 100644
--- a/drivers/net/usb/hso.c
+++ b/drivers/net/usb/hso.c
@@ -2714,14 +2714,14 @@ struct hso_device *hso_create_mux_serial_device(struct usb_interface *interface,
 
 	serial = kzalloc(sizeof(*serial), GFP_KERNEL);
 	if (!serial)
-		goto exit;
+		goto err_free_dev;
 
 	hso_dev->port_data.dev_serial = serial;
 	serial->parent = hso_dev;
 
 	if (hso_serial_common_create
 	    (serial, 1, CTRL_URB_RX_SIZE, CTRL_URB_TX_SIZE))
-		goto exit;
+		goto err_free_serial;
 
 	serial->tx_data_length--;
 	serial->write_data = hso_mux_serial_write_data;
@@ -2737,11 +2737,9 @@ struct hso_device *hso_create_mux_serial_device(struct usb_interface *interface,
 	/* done, return it */
 	return hso_dev;
 
-exit:
-	if (serial) {
-		tty_unregister_device(tty_drv, serial->minor);
-		kfree(serial);
-	}
+err_free_serial:
+	kfree(serial);
+err_free_dev:
 	kfree(hso_dev);
 	return NULL;
 

commit 4a319dd66f497bb5e8441950af48c845c0670849
Author: Pali Rohár <pali@kernel.org>
Date:   Sat Sep 11 15:20:17 2021 +0200

    serial: mvebu-uart: fix driver's tx_empty callback
    
    commit 74e1eb3b4a1ef2e564b4bdeb6e92afe844e900de upstream.
    
    Driver's tx_empty callback should signal when the transmit shift register
    is empty. So when the last character has been sent.
    
    STAT_TX_FIFO_EMP bit signals only that HW transmit FIFO is empty, which
    happens when the last byte is loaded into transmit shift register.
    
    STAT_TX_EMP bit signals when the both HW transmit FIFO and transmit shift
    register are empty.
    
    So replace STAT_TX_FIFO_EMP check by STAT_TX_EMP in mvebu_uart_tx_empty()
    callback function.
    
    Fixes: 30530791a7a0 ("serial: mvebu-uart: initial support for Armada-3700 serial port")
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Link: https://lore.kernel.org/r/20210911132017.25505-1-pali@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/tty/serial/mvebu-uart.c b/drivers/tty/serial/mvebu-uart.c
index f0107d5df99e..77f3f3728a79 100644
--- a/drivers/tty/serial/mvebu-uart.c
+++ b/drivers/tty/serial/mvebu-uart.c
@@ -163,7 +163,7 @@ static unsigned int mvebu_uart_tx_empty(struct uart_port *port)
 	st = readl(port->membase + UART_STAT);
 	spin_unlock_irqrestore(&port->lock, flags);
 
-	return (st & STAT_TX_FIFO_EMP) ? TIOCSER_TEMT : 0;
+	return (st & STAT_TX_EMP) ? TIOCSER_TEMT : 0;
 }
 
 static unsigned int mvebu_uart_get_mctrl(struct uart_port *port)

commit 66f74ba9be9daf9c47fface6af3677f602774f6b
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Mon Sep 6 21:35:48 2021 +0900

    mcb: fix error handling in mcb_alloc_bus()
    
    commit 25a1433216489de4abc889910f744e952cb6dbae upstream.
    
    There are two bugs:
    1) If ida_simple_get() fails then this code calls put_device(carrier)
       but we haven't yet called get_device(carrier) and probably that
       leads to a use after free.
    2) After device_initialize() then we need to use put_device() to
       release the bus.  This will free the internal resources tied to the
       device and call mcb_free_bus() which will free the rest.
    
    Fixes: 5d9e2ab9fea4 ("mcb: Implement bus->dev.release callback")
    Fixes: 18d288198099 ("mcb: Correctly initialize the bus's device")
    Cc: stable@vger.kernel.org
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Johannes Thumshirn <jth@kernel.org>
    Link: https://lore.kernel.org/r/32e160cf6864ce77f9d62948338e24db9fd8ead9.1630931319.git.johannes.thumshirn@wdc.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/mcb/mcb-core.c b/drivers/mcb/mcb-core.c
index bb5c5692dedc..118d27ee31c2 100644
--- a/drivers/mcb/mcb-core.c
+++ b/drivers/mcb/mcb-core.c
@@ -280,8 +280,8 @@ struct mcb_bus *mcb_alloc_bus(struct device *carrier)
 
 	bus_nr = ida_simple_get(&mcb_ida, 0, 0, GFP_KERNEL);
 	if (bus_nr < 0) {
-		rc = bus_nr;
-		goto err_free;
+		kfree(bus);
+		return ERR_PTR(bus_nr);
 	}
 
 	bus->bus_nr = bus_nr;
@@ -296,12 +296,12 @@ struct mcb_bus *mcb_alloc_bus(struct device *carrier)
 	dev_set_name(&bus->dev, "mcb:%d", bus_nr);
 	rc = device_add(&bus->dev);
 	if (rc)
-		goto err_free;
+		goto err_put;
 
 	return bus;
-err_free:
-	put_device(carrier);
-	kfree(bus);
+
+err_put:
+	put_device(&bus->dev);
 	return ERR_PTR(rc);
 }
 EXPORT_SYMBOL_GPL(mcb_alloc_bus);

commit 3fe3f21b677133511aaa01bfb1caa11bede09f18
Author: Slark Xiao <slark_xiao@163.com>
Date:   Fri Sep 17 19:01:06 2021 +0800

    USB: serial: option: add device id for Foxconn T99W265
    
    commit 9e3eed534f8235a4a596a9dae5b8a6425d81ea1a upstream.
    
    Adding support for Foxconn device T99W265 for enumeration with
    PID 0xe0db.
    
    usb-devices output for 0xe0db
    T:  Bus=04 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 19 Spd=5000 MxCh= 0
    D:  Ver= 3.20 Cls=ef(misc ) Sub=02 Prot=01 MxPS= 9 #Cfgs=  1
    P:  Vendor=0489 ProdID=e0db Rev=05.04
    S:  Manufacturer=Microsoft
    S:  Product=Generic Mobile Broadband Adapter
    S:  SerialNumber=6c50f452
    C:  #Ifs= 5 Cfg#= 1 Atr=a0 MxPwr=896mA
    I:  If#=0x0 Alt= 0 #EPs= 1 Cls=02(commc) Sub=0e Prot=00 Driver=cdc_mbim
    I:  If#=0x1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=02 Driver=cdc_mbim
    I:  If#=0x2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option
    I:  If#=0x3 Alt= 0 #EPs= 1 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
    I:  If#=0x4 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=option
    
    if0/1: MBIM, if2:Diag, if3:GNSS, if4: Modem
    
    Signed-off-by: Slark Xiao <slark_xiao@163.com>
    Link: https://lore.kernel.org/r/20210917110106.9852-1-slark_xiao@163.com
    [ johan: use USB_DEVICE_INTERFACE_CLASS(), amend comment ]
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index 9e91a51e6749..524b3c6e96e2 100644
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -2075,6 +2075,8 @@ static const struct usb_device_id option_ids[] = {
 	  .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 */

commit f0b46f7e734ff9e5037a5bd3ad410c8b3ffce579
Author: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Date:   Fri Sep 17 11:18:48 2021 +0200

    USB: serial: option: remove duplicate USB device ID
    
    commit 1ca200a8c6f079950a04ea3c3380fe8cf78e95a2 upstream.
    
    The device ZTE 0x0094 is already on the list.
    
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Fixes: b9e44fe5ecda ("USB: option: cleanup zte 3g-dongle's pid in option.c")
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index a42465b841e0..9e91a51e6749 100644
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -1658,7 +1658,6 @@ static const struct usb_device_id option_ids[] = {
 	{ 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),

commit e1617a8ec066181f01bea4de1dbf3cc512e3a895
Author: Carlo Lobrano <c.lobrano@gmail.com>
Date:   Fri Sep 3 14:39:13 2021 +0200

    USB: serial: option: add Telit LN920 compositions
    
    commit 7bb057134d609b9c038a00b6876cf0d37d0118ce upstream.
    
    This patch adds the following Telit LN920 compositions:
    
    0x1060: tty, adb, rmnet, tty, tty, tty, tty
    0x1061: tty, adb, mbim, tty, tty, tty, tty
    0x1062: rndis, tty, adb, tty, tty, tty, tty
    0x1063: tty, adb, ecm, tty, tty, tty, tty
    
    Signed-off-by: Carlo Lobrano <c.lobrano@gmail.com>
    Link: https://lore.kernel.org/r/20210903123913.1086513-1-c.lobrano@gmail.com
    Reviewed-by: Daniele Palmas <dnlplm@gmail.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index d08b799c91fc..a42465b841e0 100644
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -1205,6 +1205,14 @@ static const struct usb_device_id option_ids[] = {
 	  .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(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910),
 	  .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) },
 	{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM),

commit 8f1fd5c9adc56a9471f52d329b9103dc2b23e420
Author: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Date:   Fri Sep 17 11:18:47 2021 +0200

    USB: serial: mos7840: remove duplicated 0xac24 device ID
    
    commit 211f323768a25b30c106fd38f15a0f62c7c2b5f4 upstream.
    
    0xac24 device ID is already defined and used via
    BANDB_DEVICE_ID_USO9ML2_4.  Remove the duplicate from the list.
    
    Fixes: 27f1281d5f72 ("USB: serial: Extra device/vendor ID for mos7840 driver")
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c
index c78dfb7fd394..3e624b648aa6 100644
--- a/drivers/usb/serial/mos7840.c
+++ b/drivers/usb/serial/mos7840.c
@@ -113,7 +113,6 @@
 #define BANDB_DEVICE_ID_USOPTL4_2P       0xBC02
 #define BANDB_DEVICE_ID_USOPTL4_4        0xAC44
 #define BANDB_DEVICE_ID_USOPTL4_4P       0xBC03
-#define BANDB_DEVICE_ID_USOPTL2_4        0xAC24
 
 /* This driver also supports
  * ATEN UC2324 device using Moschip MCS7840
@@ -194,7 +193,6 @@ static const struct usb_device_id id_table[] = {
 	{USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2P)},
 	{USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4)},
 	{USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4P)},
-	{USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL2_4)},
 	{USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2324)},
 	{USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2322)},
 	{USB_DEVICE(USB_VENDOR_ID_MOXA, MOXA_DEVICE_ID_2210)},

commit 99685d3670b1294ff30da14205e07d165ebdb773
Author: Julian Sikorski <belegdol@gmail.com>
Date:   Mon Sep 13 20:14:55 2021 +0200

    Re-enable UAS for LaCie Rugged USB3-FW with fk quirk
    
    commit ce1c42b4dacfe7d71c852d8bf3371067ccba865c upstream.
    
    Further testing has revealed that LaCie Rugged USB3-FW does work with
    uas as long as US_FL_NO_REPORT_OPCODES and US_FL_NO_SAME are enabled.
    
    Link: https://lore.kernel.org/linux-usb/2167ea48-e273-a336-a4e0-10a4e883e75e@redhat.com/
    Cc: stable <stable@vger.kernel.org>
    Suggested-by: Hans de Goede <hdegoede@redhat.com>
    Reviewed-by: Hans de Goede <hdegoede@redhat.com>
    Acked-by: Oliver Neukum <oneukum@suse.com>
    Signed-off-by: Julian Sikorski <belegdol+github@gmail.com>
    Link: https://lore.kernel.org/r/20210913181454.7365-1-belegdol+github@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h
index c7db6c943ba5..2f72753c3e22 100644
--- a/drivers/usb/storage/unusual_uas.h
+++ b/drivers/usb/storage/unusual_uas.h
@@ -50,7 +50,7 @@ UNUSUAL_DEV(0x059f, 0x1061, 0x0000, 0x9999,
 		"LaCie",
 		"Rugged USB3-FW",
 		USB_SC_DEVICE, USB_PR_DEVICE, NULL,
-		US_FL_IGNORE_UAS),
+		US_FL_NO_REPORT_OPCODES | US_FL_NO_SAME),
 
 /*
  * Apricorn USB3 dongle sometimes returns "USBSUSBSUSBS" in response to SCSI

commit a5cfd51f6348e8fd7531461366946039c29c7e69
Author: Johan Hovold <johan@kernel.org>
Date:   Mon Sep 6 14:45:38 2021 +0200

    staging: greybus: uart: fix tty use after free
    
    commit 92dc0b1f46e12cfabd28d709bb34f7a39431b44f upstream.
    
    User space can hold a tty open indefinitely and tty drivers must not
    release the underlying structures until the last user is gone.
    
    Switch to using the tty-port reference counter to manage the life time
    of the greybus tty state to avoid use after free after a disconnect.
    
    Fixes: a18e15175708 ("greybus: more uart work")
    Cc: stable@vger.kernel.org      # 4.9
    Reviewed-by: Alex Elder <elder@linaro.org>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20210906124538.22358-1-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/staging/greybus/uart.c b/drivers/staging/greybus/uart.c
index 2343914f7548..2e9006a49587 100644
--- a/drivers/staging/greybus/uart.c
+++ b/drivers/staging/greybus/uart.c
@@ -799,6 +799,17 @@ static void gb_tty_port_shutdown(struct tty_port *port)
 	gbphy_runtime_put_autosuspend(gb_tty->gbphy_dev);
 }
 
+static void gb_tty_port_destruct(struct tty_port *port)
+{
+	struct gb_tty *gb_tty = container_of(port, struct gb_tty, port);
+
+	if (gb_tty->minor != GB_NUM_MINORS)
+		release_minor(gb_tty);
+	kfifo_free(&gb_tty->write_fifo);
+	kfree(gb_tty->buffer);
+	kfree(gb_tty);
+}
+
 static const struct tty_operations gb_ops = {
 	.install =		gb_tty_install,
 	.open =			gb_tty_open,
@@ -822,6 +833,7 @@ static const struct tty_port_operations gb_port_ops = {
 	.dtr_rts =		gb_tty_dtr_rts,
 	.activate =		gb_tty_port_activate,
 	.shutdown =		gb_tty_port_shutdown,
+	.destruct =		gb_tty_port_destruct,
 };
 
 static int gb_uart_probe(struct gbphy_device *gbphy_dev,
@@ -834,17 +846,11 @@ static int gb_uart_probe(struct gbphy_device *gbphy_dev,
 	int retval;
 	int minor;
 
-	gb_tty = kzalloc(sizeof(*gb_tty), GFP_KERNEL);
-	if (!gb_tty)
-		return -ENOMEM;
-
 	connection = gb_connection_create(gbphy_dev->bundle,
 					  le16_to_cpu(gbphy_dev->cport_desc->id),
 					  gb_uart_request_handler);
-	if (IS_ERR(connection)) {
-		retval = PTR_ERR(connection);
-		goto exit_tty_free;
-	}
+	if (IS_ERR(connection))
+		return PTR_ERR(connection);
 
 	max_payload = gb_operation_get_payload_size_max(connection);
 	if (max_payload < sizeof(struct gb_uart_send_data_request)) {
@@ -852,13 +858,23 @@ static int gb_uart_probe(struct gbphy_device *gbphy_dev,
 		goto exit_connection_destroy;
 	}
 
+	gb_tty = kzalloc(sizeof(*gb_tty), GFP_KERNEL);
+	if (!gb_tty) {
+		retval = -ENOMEM;
+		goto exit_connection_destroy;
+	}
+
+	tty_port_init(&gb_tty->port);
+	gb_tty->port.ops = &gb_port_ops;
+	gb_tty->minor = GB_NUM_MINORS;
+
 	gb_tty->buffer_payload_max = max_payload -
 			sizeof(struct gb_uart_send_data_request);
 
 	gb_tty->buffer = kzalloc(gb_tty->buffer_payload_max, GFP_KERNEL);
 	if (!gb_tty->buffer) {
 		retval = -ENOMEM;
-		goto exit_connection_destroy;
+		goto exit_put_port;
 	}
 
 	INIT_WORK(&gb_tty->tx_work, gb_uart_tx_write_work);
@@ -866,7 +882,7 @@ static int gb_uart_probe(struct gbphy_device *gbphy_dev,
 	retval = kfifo_alloc(&gb_tty->write_fifo, GB_UART_WRITE_FIFO_SIZE,
 			     GFP_KERNEL);
 	if (retval)
-		goto exit_buf_free;
+		goto exit_put_port;
 
 	gb_tty->credits = GB_UART_FIRMWARE_CREDITS;
 	init_completion(&gb_tty->credits_complete);
@@ -880,7 +896,7 @@ static int gb_uart_probe(struct gbphy_device *gbphy_dev,
 		} else {
 			retval = minor;
 		}
-		goto exit_kfifo_free;
+		goto exit_put_port;
 	}
 
 	gb_tty->minor = minor;
@@ -889,9 +905,6 @@ static int gb_uart_probe(struct gbphy_device *gbphy_dev,
 	init_waitqueue_head(&gb_tty->wioctl);
 	mutex_init(&gb_tty->mutex);
 
-	tty_port_init(&gb_tty->port);
-	gb_tty->port.ops = &gb_port_ops;
-
 	gb_tty->connection = connection;
 	gb_tty->gbphy_dev = gbphy_dev;
 	gb_connection_set_data(connection, gb_tty);
@@ -899,7 +912,7 @@ static int gb_uart_probe(struct gbphy_device *gbphy_dev,
 
 	retval = gb_connection_enable_tx(connection);
 	if (retval)
-		goto exit_release_minor;
+		goto exit_put_port;
 
 	send_control(gb_tty, gb_tty->ctrlout);
 
@@ -926,16 +939,10 @@ static int gb_uart_probe(struct gbphy_device *gbphy_dev,
 
 exit_connection_disable:
 	gb_connection_disable(connection);
-exit_release_minor:
-	release_minor(gb_tty);
-exit_kfifo_free:
-	kfifo_free(&gb_tty->write_fifo);
-exit_buf_free:
-	kfree(gb_tty->buffer);
+exit_put_port:
+	tty_port_put(&gb_tty->port);
 exit_connection_destroy:
 	gb_connection_destroy(connection);
-exit_tty_free:
-	kfree(gb_tty);
 
 	return retval;
 }
@@ -966,15 +973,10 @@ static void gb_uart_remove(struct gbphy_device *gbphy_dev)
 	gb_connection_disable_rx(connection);
 	tty_unregister_device(gb_tty_driver, gb_tty->minor);
 
-	/* FIXME - free transmit / receive buffers */
-
 	gb_connection_disable(connection);
-	tty_port_destroy(&gb_tty->port);
 	gb_connection_destroy(connection);
-	release_minor(gb_tty);
-	kfifo_free(&gb_tty->write_fifo);
-	kfree(gb_tty->buffer);
-	kfree(gb_tty);
+
+	tty_port_put(&gb_tty->port);
 }
 
 static int gb_tty_init(void)

commit 0c30a2b7c144dee1a2a6f33073a2266039304968
Author: Johan Hovold <johan@kernel.org>
Date:   Tue Sep 7 10:23:18 2021 +0200

    USB: cdc-acm: fix minor-number release
    
    commit 91fac0741d4817945c6ee0a17591421e7f5ecb86 upstream.
    
    If the driver runs out of minor numbers it would release minor 0 and
    allow another device to claim the minor while still in use.
    
    Fortunately, registering the tty class device of the second device would
    fail (with a stack dump) due to the sysfs name collision so no memory is
    leaked.
    
    Fixes: cae2bc768d17 ("usb: cdc-acm: Decrement tty port's refcount if probe() fail")
    Cc: stable@vger.kernel.org      # 4.19
    Cc: Jaejoong Kim <climbbb.kim@gmail.com>
    Acked-by: Oliver Neukum <oneukum@suse.com>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20210907082318.7757-1-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index 371aae41ed65..6959231d63b3 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -734,7 +734,8 @@ static void acm_port_destruct(struct tty_port *port)
 {
 	struct acm *acm = container_of(port, struct acm, port);
 
-	acm_release_minor(acm);
+	if (acm->minor != ACM_MINOR_INVALID)
+		acm_release_minor(acm);
 	usb_put_intf(acm->control);
 	kfree(acm->country_codes);
 	kfree(acm);
@@ -1396,8 +1397,10 @@ static int acm_probe(struct usb_interface *intf,
 	usb_get_intf(acm->control); /* undone in destruct() */
 
 	minor = acm_alloc_minor(acm);
-	if (minor < 0)
+	if (minor < 0) {
+		acm->minor = ACM_MINOR_INVALID;
 		goto alloc_fail1;
+	}
 
 	acm->minor = minor;
 	acm->dev = usb_dev;
diff --git a/drivers/usb/class/cdc-acm.h b/drivers/usb/class/cdc-acm.h
index d8f8651425c4..02e2ad61742d 100644
--- a/drivers/usb/class/cdc-acm.h
+++ b/drivers/usb/class/cdc-acm.h
@@ -22,6 +22,8 @@
 #define ACM_TTY_MAJOR		166
 #define ACM_TTY_MINORS		256
 
+#define ACM_MINOR_INVALID	ACM_TTY_MINORS
+
 /*
  * Requests.
  */

commit 40a5f30822e6bb925757066d53514cf5a67362a3
Author: Uwe Brandt <uwe.brandt@gmail.com>
Date:   Tue Sep 21 19:54:46 2021 +0200

    USB: serial: cp210x: add ID for GW Instek GDM-834x Digital Multimeter
    
    commit 3bd18ba7d859eb1fbef3beb1e80c24f6f7d7596c upstream.
    
    Add the USB serial device ID for the GW Instek GDM-834x Digital Multimeter.
    
    Signed-off-by: Uwe Brandt <uwe.brandt@gmail.com>
    Link: https://lore.kernel.org/r/YUxFl3YUCPGJZd8Y@hovoldconsulting.com
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
index eaf915566302..894572a5e5c5 100644
--- a/drivers/usb/serial/cp210x.c
+++ b/drivers/usb/serial/cp210x.c
@@ -234,6 +234,7 @@ static const struct usb_device_id id_table[] = {
 	{ USB_DEVICE(0x1FB9, 0x0602) }, /* Lake Shore Model 648 Magnet Power Supply */
 	{ USB_DEVICE(0x1FB9, 0x0700) }, /* Lake Shore Model 737 VSM Controller */
 	{ USB_DEVICE(0x1FB9, 0x0701) }, /* Lake Shore Model 776 Hall Matrix */
+	{ USB_DEVICE(0x2184, 0x0030) }, /* GW Instek GDM-834x Digital Multimeter */
 	{ USB_DEVICE(0x2626, 0xEA60) }, /* Aruba Networks 7xxx USB Serial Console */
 	{ USB_DEVICE(0x3195, 0xF190) }, /* Link Instruments MSO-19 */
 	{ USB_DEVICE(0x3195, 0xF280) }, /* Link Instruments MSO-28 */

commit 2f0cc71c23593d379b45af5dd32dcf311cf60793
Author: Ondrej Zary <linux@zary.sk>
Date:   Mon Sep 13 23:01:06 2021 +0200

    usb-storage: Add quirk for ScanLogic SL11R-IDE older than 2.6c
    
    commit b55d37ef6b7db3eda9b4495a8d9b0a944ee8c67d upstream.
    
    ScanLogic SL11R-IDE with firmware older than 2.6c (the latest one) has
    broken tag handling, preventing the device from working at all:
    usb 1-1: new full-speed USB device number 2 using uhci_hcd
    usb 1-1: New USB device found, idVendor=04ce, idProduct=0002, bcdDevice= 2.60
    usb 1-1: New USB device strings: Mfr=1, Product=1, SerialNumber=0
    usb 1-1: Product: USB Device
    usb 1-1: Manufacturer: USB Device
    usb-storage 1-1:1.0: USB Mass Storage device detected
    scsi host2: usb-storage 1-1:1.0
    usbcore: registered new interface driver usb-storage
    usb 1-1: reset full-speed USB device number 2 using uhci_hcd
    usb 1-1: reset full-speed USB device number 2 using uhci_hcd
    usb 1-1: reset full-speed USB device number 2 using uhci_hcd
    usb 1-1: reset full-speed USB device number 2 using uhci_hcd
    
    Add US_FL_BULK_IGNORE_TAG to fix it. Also update my e-mail address.
    
    2.6c is the only firmware that claims Linux compatibility.
    The firmware can be upgraded using ezotgdbg utility:
    https://github.com/asciilifeform/ezotgdbg
    
    Acked-by: Alan Stern <stern@rowland.harvard.edu>
    Signed-off-by: Ondrej Zary <linux@zary.sk>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210913210106.12717-1-linux@zary.sk
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
index 861153d294b6..7442793fe050 100644
--- a/drivers/usb/storage/unusual_devs.h
+++ b/drivers/usb/storage/unusual_devs.h
@@ -416,9 +416,16 @@ UNUSUAL_DEV(  0x04cb, 0x0100, 0x0000, 0x2210,
 		USB_SC_UFI, USB_PR_DEVICE, NULL, US_FL_FIX_INQUIRY | US_FL_SINGLE_LUN),
 
 /*
- * Reported by Ondrej Zary <linux@rainbow-software.org>
+ * Reported by Ondrej Zary <linux@zary.sk>
  * The device reports one sector more and breaks when that sector is accessed
+ * Firmwares older than 2.6c (the latest one and the only that claims Linux
+ * support) have also broken tag handling
  */
+UNUSUAL_DEV(  0x04ce, 0x0002, 0x0000, 0x026b,
+		"ScanLogic",
+		"SL11R-IDE",
+		USB_SC_DEVICE, USB_PR_DEVICE, NULL,
+		US_FL_FIX_CAPACITY | US_FL_BULK_IGNORE_TAG),
 UNUSUAL_DEV(  0x04ce, 0x0002, 0x026c, 0x026c,
 		"ScanLogic",
 		"SL11R-IDE",

commit 9cb9be56013c0c54a9b442ccc1535b06e47b81e3
Author: Jan Beulich <jbeulich@suse.com>
Date:   Mon Sep 20 18:15:11 2021 +0200

    xen/x86: fix PV trap handling on secondary processors
    
    commit 0594c58161b6e0f3da8efa9c6e3d4ba52b652717 upstream.
    
    The initial observation was that in PV mode under Xen 32-bit user space
    didn't work anymore. Attempts of system calls ended in #GP(0x402). All
    of the sudden the vector 0x80 handler was not in place anymore. As it
    turns out up to 5.13 redundant initialization did occur: Once from
    cpu_initialize_context() (through its VCPUOP_initialise hypercall) and a
    2nd time while each CPU was brought fully up. This 2nd initialization is
    now gone, uncovering that the 1st one was flawed: Unlike for the
    set_trap_table hypercall, a full virtual IDT needs to be specified here;
    the "vector" fields of the individual entries are of no interest. With
    many (kernel) IDT entries still(?) (i.e. at that point at least) empty,
    the syscall vector 0x80 ended up in slot 0x20 of the virtual IDT, thus
    becoming the domain's handler for vector 0x20.
    
    Make xen_convert_trap_info() fit for either purpose, leveraging the fact
    that on the xen_copy_trap_info() path the table starts out zero-filled.
    This includes moving out the writing of the sentinel, which would also
    have lead to a buffer overrun in the xen_copy_trap_info() case if all
    (kernel) IDT entries were populated. Convert the writing of the sentinel
    to clearing of the entire table entry rather than just the address
    field.
    
    (I didn't bother trying to identify the commit which uncovered the issue
    in 5.14; the commit named below is the one which actually introduced the
    bad code.)
    
    Fixes: f87e4cac4f4e ("xen: SMP guest support")
    Cc: stable@vger.kernel.org
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Link: https://lore.kernel.org/r/7a266932-092e-b68f-f2bb-1473b61adc6e@suse.com
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c
index 7966136352b5..8f1ff8dad2ce 100644
--- a/arch/x86/xen/enlighten_pv.c
+++ b/arch/x86/xen/enlighten_pv.c
@@ -720,8 +720,8 @@ static void xen_write_idt_entry(gate_desc *dt, int entrynum, const gate_desc *g)
 	preempt_enable();
 }
 
-static void xen_convert_trap_info(const struct desc_ptr *desc,
-				  struct trap_info *traps)
+static unsigned xen_convert_trap_info(const struct desc_ptr *desc,
+				      struct trap_info *traps, bool full)
 {
 	unsigned in, out, count;
 
@@ -731,17 +731,18 @@ static void xen_convert_trap_info(const struct desc_ptr *desc,
 	for (in = out = 0; in < count; in++) {
 		gate_desc *entry = (gate_desc *)(desc->address) + in;
 
-		if (cvt_gate_to_trap(in, entry, &traps[out]))
+		if (cvt_gate_to_trap(in, entry, &traps[out]) || full)
 			out++;
 	}
-	traps[out].address = 0;
+
+	return out;
 }
 
 void xen_copy_trap_info(struct trap_info *traps)
 {
 	const struct desc_ptr *desc = this_cpu_ptr(&idt_desc);
 
-	xen_convert_trap_info(desc, traps);
+	xen_convert_trap_info(desc, traps, true);
 }
 
 /* Load a new IDT into Xen.  In principle this can be per-CPU, so we
@@ -751,6 +752,7 @@ static void xen_load_idt(const struct desc_ptr *desc)
 {
 	static DEFINE_SPINLOCK(lock);
 	static struct trap_info traps[257];
+	unsigned out;
 
 	trace_xen_cpu_load_idt(desc);
 
@@ -758,7 +760,8 @@ static void xen_load_idt(const struct desc_ptr *desc)
 
 	memcpy(this_cpu_ptr(&idt_desc), desc, sizeof(idt_desc));
 
-	xen_convert_trap_info(desc, traps);
+	out = xen_convert_trap_info(desc, traps, false);
+	memset(&traps[out], 0, sizeof(traps[0]));
 
 	xen_mc_flush();
 	if (HYPERVISOR_set_trap_table(traps))

commit 43d2e0fbc67f8bcfb069130f4028a04887ae76b6
Author: Steve French <stfrench@microsoft.com>
Date:   Thu Sep 23 19:18:37 2021 -0500

    cifs: fix incorrect check for null pointer in header_assemble
    
    commit 9ed38fd4a15417cac83967360cf20b853bfab9b6 upstream.
    
    Although very unlikely that the tlink pointer would be null in this case,
    get_next_mid function can in theory return null (but not an error)
    so need to check for null (not for IS_ERR, which can not be returned
    here).
    
    Address warning:
    
            fs/smbfs_client/connect.c:2392 cifs_match_super()
            warn: 'tlink' isn't an ERR_PTR
    
    Pointed out by Dan Carpenter via smatch code analysis tool
    
    CC: stable@vger.kernel.org
    Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
    Acked-by: Ronnie Sahlberg <lsahlber@redhat.com>
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index 6285085195c1..b5aba1c895cb 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -3374,9 +3374,10 @@ cifs_match_super(struct super_block *sb, void *data)
 	spin_lock(&cifs_tcp_ses_lock);
 	cifs_sb = CIFS_SB(sb);
 	tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
-	if (IS_ERR(tlink)) {
+	if (tlink == NULL) {
+		/* can not match superblock if tlink were ever null */
 		spin_unlock(&cifs_tcp_ses_lock);
-		return rc;
+		return 0;
 	}
 	tcon = tlink_tcon(tlink);
 	ses = tcon->ses;

commit 05ace2fa3c15a012aa3a07c59f1201c74b889aee
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Thu Sep 16 16:57:37 2021 +0300

    usb: musb: tusb6010: uninitialized data in tusb_fifo_write_unaligned()
    
    commit 517c7bf99bad3d6b9360558414aae634b7472d80 upstream.
    
    This is writing to the first 1 - 3 bytes of "val" and then writing all
    four bytes to musb_writel().  The last byte is always going to be
    garbage.  Zero out the last bytes instead.
    
    Fixes: 550a7375fe72 ("USB: Add MUSB and TUSB support")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210916135737.GI25094@kili
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c
index 39453287b5c3..4ecfbf6bb1fa 100644
--- a/drivers/usb/musb/tusb6010.c
+++ b/drivers/usb/musb/tusb6010.c
@@ -190,6 +190,7 @@ tusb_fifo_write_unaligned(void __iomem *fifo, const u8 *buf, u16 len)
 	}
 	if (len > 0) {
 		/* Write the rest 1 - 3 bytes to FIFO */
+		val = 0;
 		memcpy(&val, buf, len);
 		musb_writel(fifo, 0, val);
 	}

commit 5f057dc783750b8b3ecf6c6e57b0568102c016c9
Author: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
Date:   Sat Sep 11 22:58:30 2021 +0400

    usb: dwc2: gadget: Fix ISOC transfer complete handling for DDMA
    
    commit dbe2518b2d8eabffa74dbf7d9fdd7dacddab7fc0 upstream.
    
    When last descriptor in a descriptor list completed with XferComplete
    interrupt, core switching to handle next descriptor and assert BNA
    interrupt. Both these interrupts are set while dwc2_hsotg_epint()
    handler called. Each interrupt should be handled separately: first
    XferComplete interrupt then BNA interrupt, otherwise last completed
    transfer will not be giveback to function driver as completed
    request.
    
    Fixes: 729cac693eec ("usb: dwc2: Change ISOC DDMA flow")
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
    Link: https://lore.kernel.org/r/a36981accc26cd674c5d8f8da6164344b94ec1fe.1631386531.git.Minas.Harutyunyan@synopsys.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 7fff96dff0a0..b405c8ac8984 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -2919,9 +2919,7 @@ static void dwc2_hsotg_epint(struct dwc2_hsotg *hsotg, unsigned int idx,
 
 		/* In DDMA handle isochronous requests separately */
 		if (using_desc_dma(hsotg) && hs_ep->isochronous) {
-			/* XferCompl set along with BNA */
-			if (!(ints & DXEPINT_BNAINTR))
-				dwc2_gadget_complete_isoc_request_ddma(hs_ep);
+			dwc2_gadget_complete_isoc_request_ddma(hs_ep);
 		} else if (dir_in) {
 			/*
 			 * We get OutDone from the FIFO, so we only

commit aaa9d29acb34e3c562324c134f0936f49318a25d
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Mon Sep 6 12:42:21 2021 +0300

    usb: gadget: r8a66597: fix a loop in set_feature()
    
    commit 17956b53ebff6a490baf580a836cbd3eae94892b upstream.
    
    This loop is supposed to loop until if reads something other than
    CS_IDST or until it times out after 30,000 attempts.  But because of
    the || vs && bug, it will never time out and instead it will loop a
    minimum of 30,000 times.
    
    This bug is quite old but the code is only used in USB_DEVICE_TEST_MODE
    so it probably doesn't affect regular usage.
    
    Fixes: 96fe53ef5498 ("usb: gadget: r8a66597-udc: add support for TEST_MODE")
    Cc: stable <stable@vger.kernel.org>
    Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
    Acked-by: Felipe Balbi <balbi@kernel.org>
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Link: https://lore.kernel.org/r/20210906094221.GA10957@kili
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/gadget/udc/r8a66597-udc.c b/drivers/usb/gadget/udc/r8a66597-udc.c
index a766476fd742..ca0aebb5bd0c 100644
--- a/drivers/usb/gadget/udc/r8a66597-udc.c
+++ b/drivers/usb/gadget/udc/r8a66597-udc.c
@@ -1250,7 +1250,7 @@ static void set_feature(struct r8a66597 *r8a66597, struct usb_ctrlrequest *ctrl)
 			do {
 				tmp = r8a66597_read(r8a66597, INTSTS0) & CTSQ;
 				udelay(1);
-			} while (tmp != CS_IDST || timeout-- > 0);
+			} while (tmp != CS_IDST && timeout-- > 0);
 
 			if (tmp == CS_IDST)
 				r8a66597_bset(r8a66597,

commit ecd6b2af57617937d9a159c1635bcc3fb8e6121c
Author: Wengang Wang <wen.gang.wang@oracle.com>
Date:   Fri Sep 24 15:43:35 2021 -0700

    ocfs2: drop acl cache for directories too
    
    commit 9c0f0a03e386f4e1df33db676401547e1b7800c6 upstream.
    
    ocfs2_data_convert_worker() is currently dropping any cached acl info
    for FILE before down-converting meta lock.  It should also drop for
    DIRECTORY.  Otherwise the second acl lookup returns the cached one (from
    VFS layer) which could be already stale.
    
    The problem we are seeing is that the acl changes on one node doesn't
    get refreshed on other nodes in the following case:
    
      Node 1                    Node 2
      --------------            ----------------
      getfacl dir1
    
                                getfacl dir1    <-- this is OK
    
      setfacl -m u:user1:rwX dir1
      getfacl dir1   <-- see the change for user1
    
                                getfacl dir1    <-- can't see change for user1
    
    Link: https://lkml.kernel.org/r/20210903012631.6099-1-wen.gang.wang@oracle.com
    Signed-off-by: Wengang Wang <wen.gang.wang@oracle.com>
    Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
    Cc: Mark Fasheh <mark@fasheh.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Cc: Junxiao Bi <junxiao.bi@oracle.com>
    Cc: Changwei Ge <gechangwei@live.cn>
    Cc: Gang He <ghe@suse.com>
    Cc: Jun Piao <piaojun@huawei.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c
index 8149fb6f1f0d..a906f47ce1ba 100644
--- a/fs/ocfs2/dlmglue.c
+++ b/fs/ocfs2/dlmglue.c
@@ -3907,7 +3907,7 @@ static int ocfs2_data_convert_worker(struct ocfs2_lock_res *lockres,
 		oi = OCFS2_I(inode);
 		oi->ip_dir_lock_gen++;
 		mlog(0, "generation: %u\n", oi->ip_dir_lock_gen);
-		goto out;
+		goto out_forget;
 	}
 
 	if (!S_ISREG(inode->i_mode))
@@ -3938,6 +3938,7 @@ static int ocfs2_data_convert_worker(struct ocfs2_lock_res *lockres,
 		filemap_fdatawait(mapping);
 	}
 
+out_forget:
 	forget_all_cached_acls(inode);
 
 out:

commit 4811a2803af5f7435dfc7b2ff807514420689c2b
Merge: 7ddda2f44440 c2276d585654
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Mon Oct 4 19:05:27 2021 +0200

    Merge 4.19.208 into android-4.19-stable
    
    Changes in 4.19.208
            s390/bpf: Fix optimizing out zero-extensions
            KVM: remember position in kvm->vcpus array
            rcu: Fix missed wakeup of exp_wq waiters
            apparmor: remove duplicate macro list_entry_is_head()
            crypto: talitos - fix max key size for sha384 and sha512
            tracing/kprobe: Fix kprobe_on_func_entry() modification
            sctp: validate chunk size in __rcv_asconf_lookup
            sctp: add param size validation for SCTP_PARAM_SET_PRIMARY
            dmaengine: acpi: Avoid comparison GSI with Linux vIRQ
            thermal/drivers/exynos: Fix an error code in exynos_tmu_probe()
            9p/trans_virtio: Remove sysfs file on probe failure
            prctl: allow to setup brk for et_dyn executables
            nilfs2: use refcount_dec_and_lock() to fix potential UAF
            profiling: fix shift-out-of-bounds bugs
            pwm: lpc32xx: Don't modify HW state in .probe() after the PWM chip was registered
            Kconfig.debug: drop selecting non-existing HARDLOCKUP_DETECTOR_ARCH
            drivers: base: cacheinfo: Get rid of DEFINE_SMP_CALL_CACHE_FUNCTION()
            parisc: Move pci_dev_is_behind_card_dino to where it is used
            dmaengine: sprd: Add missing MODULE_DEVICE_TABLE
            dmaengine: ioat: depends on !UML
            dmaengine: xilinx_dma: Set DMA mask for coherent APIs
            ceph: lockdep annotations for try_nonblocking_invalidate
            nilfs2: fix memory leak in nilfs_sysfs_create_device_group
            nilfs2: fix NULL pointer in nilfs_##name##_attr_release
            nilfs2: fix memory leak in nilfs_sysfs_create_##name##_group
            nilfs2: fix memory leak in nilfs_sysfs_delete_##name##_group
            nilfs2: fix memory leak in nilfs_sysfs_create_snapshot_group
            nilfs2: fix memory leak in nilfs_sysfs_delete_snapshot_group
            pwm: img: Don't modify HW state in .remove() callback
            pwm: rockchip: Don't modify HW state in .remove() callback
            pwm: stm32-lp: Don't modify HW state in .remove() callback
            blk-throttle: fix UAF by deleteing timer in blk_throtl_exit()
            drm/nouveau/nvkm: Replace -ENOSYS with -ENODEV
            Linux 4.19.208
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I600844898dabfffbfdcf6ab298fea2c270a1c691

commit 7ddda2f4444015c07e3b0f3a2d0c29b1f0d47f2c
Author: Steve Muckle <smuckle@google.com>
Date:   Fri Oct 1 18:50:35 2021 +0000

    ANDROID: GKI: update ABI xml
    
    Leaf changes summary: 2 artifacts changed
    Changed leaf types summary: 0 leaf type changed
    Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 2 Added functions
    Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
    
    2 Added functions:
    
      [A] 'function bool pci_device_is_present(pci_dev*)'
      [A] 'function void virtio_break_device(virtio_device*)'
    
    Bug: 201573748
    Change-Id: I8e94e4ae88b8f4d5c915229112978f6d53b895dc
    Signed-off-by: Steve Muckle <smuckle@google.com>

diff --git a/android/abi_gki_aarch64 b/android/abi_gki_aarch64
index 01ce91f1b45e..978075467613 100644
--- a/android/abi_gki_aarch64
+++ b/android/abi_gki_aarch64
@@ -222,6 +222,6 @@
   pm_runtime_enable
   __pm_runtime_set_status
 
-# required by usb_f_cdev.ko
+# preserved by --additions-only
   cdev_device_add
   cdev_device_del
diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml
index ddff5e434364..4f07b1470802 100644
--- a/android/abi_gki_aarch64.xml
+++ b/android/abi_gki_aarch64.xml
@@ -1664,6 +1664,7 @@
       <elf-symbol name='pci_alloc_irq_vectors_affinity' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x6c30f9a1'/>
       <elf-symbol name='pci_clear_master' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xc6edb409'/>
       <elf-symbol name='pci_device_group' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x4304799c'/>
+      <elf-symbol name='pci_device_is_present' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xa7063f06'/>
       <elf-symbol name='pci_disable_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x423bf6a7'/>
       <elf-symbol name='pci_enable_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x40147a3e'/>
       <elf-symbol name='pci_find_capability' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xce9341bc'/>
@@ -2588,6 +2589,7 @@
       <elf-symbol name='video_ioctl2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xb5b4d678'/>
       <elf-symbol name='video_unregister_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xb2cbd4de'/>
       <elf-symbol name='video_usercopy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x8135655a'/>
+      <elf-symbol name='virtio_break_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x94c794a'/>
       <elf-symbol name='virtio_check_driver_offered_feature' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x7d699c91'/>
       <elf-symbol name='virtio_config_changed' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x43bc26a2'/>
       <elf-symbol name='virtio_device_freeze' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x98b8fe1f'/>
@@ -4466,75 +4468,75 @@
           <var-decl name='dma_length' type-id='f0981eeb' visibility='default' filepath='include/linux/scatterlist.h' line='17' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='sched_class' size-in-bits='1472' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='1726' column='1' id='74191d27'>
+      <class-decl name='sched_class' size-in-bits='1472' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='1728' column='1' id='74191d27'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='next' type-id='162b4cce' visibility='default' filepath='kernel/sched/sched.h' line='1727' column='1'/>
+          <var-decl name='next' type-id='162b4cce' visibility='default' filepath='kernel/sched/sched.h' line='1729' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='enqueue_task' type-id='7bca30b7' visibility='default' filepath='kernel/sched/sched.h' line='1733' column='1'/>
+          <var-decl name='enqueue_task' type-id='7bca30b7' visibility='default' filepath='kernel/sched/sched.h' line='1735' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='dequeue_task' type-id='7bca30b7' visibility='default' filepath='kernel/sched/sched.h' line='1734' column='1'/>
+          <var-decl name='dequeue_task' type-id='7bca30b7' visibility='default' filepath='kernel/sched/sched.h' line='1736' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='yield_task' type-id='d846ae3b' visibility='default' filepath='kernel/sched/sched.h' line='1735' column='1'/>
+          <var-decl name='yield_task' type-id='d846ae3b' visibility='default' filepath='kernel/sched/sched.h' line='1737' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='yield_to_task' type-id='c4b7e554' visibility='default' filepath='kernel/sched/sched.h' line='1736' column='1'/>
+          <var-decl name='yield_to_task' type-id='c4b7e554' visibility='default' filepath='kernel/sched/sched.h' line='1738' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='check_preempt_curr' type-id='7bca30b7' visibility='default' filepath='kernel/sched/sched.h' line='1738' column='1'/>
+          <var-decl name='check_preempt_curr' type-id='7bca30b7' visibility='default' filepath='kernel/sched/sched.h' line='1740' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='pick_next_task' type-id='2a7b00f2' visibility='default' filepath='kernel/sched/sched.h' line='1748' column='1'/>
+          <var-decl name='pick_next_task' type-id='2a7b00f2' visibility='default' filepath='kernel/sched/sched.h' line='1750' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='put_prev_task' type-id='604374c8' visibility='default' filepath='kernel/sched/sched.h' line='1751' column='1'/>
+          <var-decl name='put_prev_task' type-id='604374c8' visibility='default' filepath='kernel/sched/sched.h' line='1753' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='select_task_rq' type-id='1c92b55e' visibility='default' filepath='kernel/sched/sched.h' line='1754' column='1'/>
+          <var-decl name='select_task_rq' type-id='1c92b55e' visibility='default' filepath='kernel/sched/sched.h' line='1756' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='migrate_task_rq' type-id='9d640202' visibility='default' filepath='kernel/sched/sched.h' line='1756' column='1'/>
+          <var-decl name='migrate_task_rq' type-id='9d640202' visibility='default' filepath='kernel/sched/sched.h' line='1758' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='640'>
-          <var-decl name='task_woken' type-id='604374c8' visibility='default' filepath='kernel/sched/sched.h' line='1758' column='1'/>
+          <var-decl name='task_woken' type-id='604374c8' visibility='default' filepath='kernel/sched/sched.h' line='1760' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='set_cpus_allowed' type-id='54777a92' visibility='default' filepath='kernel/sched/sched.h' line='1760' column='1'/>
+          <var-decl name='set_cpus_allowed' type-id='54777a92' visibility='default' filepath='kernel/sched/sched.h' line='1762' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='768'>
-          <var-decl name='rq_online' type-id='d846ae3b' visibility='default' filepath='kernel/sched/sched.h' line='1763' column='1'/>
+          <var-decl name='rq_online' type-id='d846ae3b' visibility='default' filepath='kernel/sched/sched.h' line='1765' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='rq_offline' type-id='d846ae3b' visibility='default' filepath='kernel/sched/sched.h' line='1764' column='1'/>
+          <var-decl name='rq_offline' type-id='d846ae3b' visibility='default' filepath='kernel/sched/sched.h' line='1766' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='896'>
-          <var-decl name='set_curr_task' type-id='d846ae3b' visibility='default' filepath='kernel/sched/sched.h' line='1767' column='1'/>
+          <var-decl name='set_curr_task' type-id='d846ae3b' visibility='default' filepath='kernel/sched/sched.h' line='1769' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='960'>
-          <var-decl name='task_tick' type-id='7bca30b7' visibility='default' filepath='kernel/sched/sched.h' line='1768' column='1'/>
+          <var-decl name='task_tick' type-id='7bca30b7' visibility='default' filepath='kernel/sched/sched.h' line='1770' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='task_fork' type-id='1c9e19fb' visibility='default' filepath='kernel/sched/sched.h' line='1769' column='1'/>
+          <var-decl name='task_fork' type-id='1c9e19fb' visibility='default' filepath='kernel/sched/sched.h' line='1771' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1088'>
-          <var-decl name='task_dead' type-id='1c9e19fb' visibility='default' filepath='kernel/sched/sched.h' line='1770' column='1'/>
+          <var-decl name='task_dead' type-id='1c9e19fb' visibility='default' filepath='kernel/sched/sched.h' line='1772' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1152'>
-          <var-decl name='switched_from' type-id='604374c8' visibility='default' filepath='kernel/sched/sched.h' line='1777' column='1'/>
+          <var-decl name='switched_from' type-id='604374c8' visibility='default' filepath='kernel/sched/sched.h' line='1779' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1216'>
-          <var-decl name='switched_to' type-id='604374c8' visibility='default' filepath='kernel/sched/sched.h' line='1778' column='1'/>
+          <var-decl name='switched_to' type-id='604374c8' visibility='default' filepath='kernel/sched/sched.h' line='1780' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1280'>
-          <var-decl name='prio_changed' type-id='7bca30b7' visibility='default' filepath='kernel/sched/sched.h' line='1779' column='1'/>
+          <var-decl name='prio_changed' type-id='7bca30b7' visibility='default' filepath='kernel/sched/sched.h' line='1781' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1344'>
-          <var-decl name='get_rr_interval' type-id='c79c9f4c' visibility='default' filepath='kernel/sched/sched.h' line='1782' column='1'/>
+          <var-decl name='get_rr_interval' type-id='c79c9f4c' visibility='default' filepath='kernel/sched/sched.h' line='1784' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1408'>
-          <var-decl name='update_curr' type-id='d846ae3b' visibility='default' filepath='kernel/sched/sched.h' line='1785' column='1'/>
+          <var-decl name='update_curr' type-id='d846ae3b' visibility='default' filepath='kernel/sched/sched.h' line='1787' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='seccomp_filter' is-struct='yes' visibility='default' is-declaration-only='yes' id='e290c28c'/>
@@ -5067,27 +5069,27 @@
         </data-member>
       </class-decl>
       <class-decl name='static_key_mod' is-struct='yes' visibility='default' is-declaration-only='yes' id='5081ed08'/>
-      <class-decl name='task_group' size-in-bits='2752' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='359' column='1' id='2d863538'>
+      <class-decl name='task_group' size-in-bits='2752' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='361' column='1' id='2d863538'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='css' type-id='7f3df443' visibility='default' filepath='kernel/sched/sched.h' line='360' column='1'/>
+          <var-decl name='css' type-id='7f3df443' visibility='default' filepath='kernel/sched/sched.h' line='362' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2176'>
-          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='kernel/sched/sched.h' line='386' column='1'/>
+          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='kernel/sched/sched.h' line='388' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2304'>
-          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='kernel/sched/sched.h' line='387' column='1'/>
+          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='kernel/sched/sched.h' line='389' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2432'>
-          <var-decl name='parent' type-id='3c32f9de' visibility='default' filepath='kernel/sched/sched.h' line='389' column='1'/>
+          <var-decl name='parent' type-id='3c32f9de' visibility='default' filepath='kernel/sched/sched.h' line='391' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2496'>
-          <var-decl name='siblings' type-id='72f469ec' visibility='default' filepath='kernel/sched/sched.h' line='390' column='1'/>
+          <var-decl name='siblings' type-id='72f469ec' visibility='default' filepath='kernel/sched/sched.h' line='392' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2624'>
-          <var-decl name='children' type-id='72f469ec' visibility='default' filepath='kernel/sched/sched.h' line='391' column='1'/>
+          <var-decl name='children' type-id='72f469ec' visibility='default' filepath='kernel/sched/sched.h' line='393' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2752'>
-          <var-decl name='cfs_bandwidth' type-id='68e4a3af' visibility='default' filepath='kernel/sched/sched.h' line='397' column='1'/>
+          <var-decl name='cfs_bandwidth' type-id='68e4a3af' visibility='default' filepath='kernel/sched/sched.h' line='399' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='trace_eval_map' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/tracepoint.h' line='29' column='1' id='49b910cc'>
@@ -7262,10 +7264,10 @@
           <var-decl name='security' type-id='eaa32e2f' visibility='default' filepath='include/linux/sched.h' line='1293' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='22400'>
-          <var-decl name='' type-id='55ce08d6' visibility='default' filepath='include/linux/sched.h' line='1296' column='1'/>
+          <var-decl name='' type-id='1bf4cc71' visibility='default' filepath='include/linux/sched.h' line='1296' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='22464'>
-          <var-decl name='' type-id='421a4cc6' visibility='default' filepath='include/linux/sched.h' line='1299' column='1'/>
+          <var-decl name='' type-id='fc199e04' visibility='default' filepath='include/linux/sched.h' line='1299' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='22528'>
           <var-decl name='futex_exit_mutex' type-id='925167dc' visibility='default' filepath='include/linux/sched.h' line='1313' column='1'/>
@@ -8446,12 +8448,12 @@
           <var-decl name='next' type-id='d38eb863' visibility='default' filepath='include/linux/uprobes.h' line='103' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__16' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/sched.h' line='1296' column='1' id='55ce08d6'>
+      <union-decl name='__anonymous_union__16' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/sched.h' line='1296' column='1' id='1bf4cc71'>
         <data-member access='public'>
           <var-decl name='frozen' type-id='f0981eeb' visibility='default' filepath='include/linux/sched.h' line='1296' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide47' type-id='156952c4' visibility='default' filepath='include/linux/sched.h' line='1296' column='1'/>
+          <var-decl name='' type-id='156952c4' visibility='default' filepath='include/linux/sched.h' line='1296' column='1'/>
         </data-member>
         <data-member access='public'>
           <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/sched.h' line='1296' column='1'/>
@@ -8463,12 +8465,12 @@
         </data-member>
       </class-decl>
       <union-decl name='__anonymous_union__17' is-anonymous='yes' visibility='default' filepath='include/linux/sched.h' line='1296' column='1' id='2a125a28'/>
-      <union-decl name='__anonymous_union__18' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/sched.h' line='1299' column='1' id='421a4cc6'>
+      <union-decl name='__anonymous_union__18' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/sched.h' line='1299' column='1' id='fc199e04'>
         <data-member access='public'>
           <var-decl name='futex_state' type-id='f0981eeb' visibility='default' filepath='include/linux/sched.h' line='1299' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide48' type-id='6040de71' visibility='default' filepath='include/linux/sched.h' line='1299' column='1'/>
+          <var-decl name='' type-id='6040de71' visibility='default' filepath='include/linux/sched.h' line='1299' column='1'/>
         </data-member>
         <data-member access='public'>
           <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/sched.h' line='1299' column='1'/>
@@ -9450,7 +9452,7 @@
           <var-decl name='ops' type-id='1a0da7f7' visibility='default' filepath='include/linux/bsg.h' line='21' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cfs_bandwidth' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='335' column='1' id='68e4a3af'/>
+      <class-decl name='cfs_bandwidth' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='337' column='1' id='68e4a3af'/>
       <class-decl name='cgroup_file' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='114' column='1' id='37a4ee40'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='kn' type-id='150efd3f' visibility='default' filepath='include/linux/cgroup-defs.h' line='116' column='1'/>
@@ -11310,66 +11312,66 @@
           <var-decl name='last_use' type-id='95e97e5e' visibility='default' filepath='include/linux/blk-cgroup.h' line='145' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='bpf_prog' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/filter.h' line='480' column='1' id='facd5338'>
+      <class-decl name='bpf_prog' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/filter.h' line='519' column='1' id='facd5338'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='pages' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='481' column='1'/>
+          <var-decl name='pages' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='520' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='jited' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='482' column='1'/>
+          <var-decl name='jited' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='521' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1'>
-          <var-decl name='jit_requested' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='483' column='1'/>
+          <var-decl name='jit_requested' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='522' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2'>
-          <var-decl name='undo_set_mem' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='484' column='1'/>
+          <var-decl name='undo_set_mem' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='523' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3'>
-          <var-decl name='gpl_compatible' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='485' column='1'/>
+          <var-decl name='gpl_compatible' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='524' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='4'>
-          <var-decl name='cb_access' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='486' column='1'/>
+          <var-decl name='cb_access' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='525' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5'>
-          <var-decl name='dst_needed' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='487' column='1'/>
+          <var-decl name='dst_needed' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='526' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6'>
-          <var-decl name='blinded' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='488' column='1'/>
+          <var-decl name='blinded' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='527' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='7'>
-          <var-decl name='is_func' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='489' column='1'/>
+          <var-decl name='is_func' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='528' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='8'>
-          <var-decl name='kprobe_override' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='490' column='1'/>
+          <var-decl name='kprobe_override' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='529' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='9'>
-          <var-decl name='has_callchain_buf' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='491' column='1'/>
+          <var-decl name='has_callchain_buf' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='530' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='type' type-id='b80df76a' visibility='default' filepath='include/linux/filter.h' line='492' column='1'/>
+          <var-decl name='type' type-id='b80df76a' visibility='default' filepath='include/linux/filter.h' line='531' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='expected_attach_type' type-id='67ce11ed' visibility='default' filepath='include/linux/filter.h' line='493' column='1'/>
+          <var-decl name='expected_attach_type' type-id='67ce11ed' visibility='default' filepath='include/linux/filter.h' line='532' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='len' type-id='19c2251e' visibility='default' filepath='include/linux/filter.h' line='494' column='1'/>
+          <var-decl name='len' type-id='19c2251e' visibility='default' filepath='include/linux/filter.h' line='533' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='jited_len' type-id='19c2251e' visibility='default' filepath='include/linux/filter.h' line='495' column='1'/>
+          <var-decl name='jited_len' type-id='19c2251e' visibility='default' filepath='include/linux/filter.h' line='534' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='160'>
-          <var-decl name='tag' type-id='d2f7b56a' visibility='default' filepath='include/linux/filter.h' line='496' column='1'/>
+          <var-decl name='tag' type-id='d2f7b56a' visibility='default' filepath='include/linux/filter.h' line='535' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='aux' type-id='1e6beae1' visibility='default' filepath='include/linux/filter.h' line='497' column='1'/>
+          <var-decl name='aux' type-id='1e6beae1' visibility='default' filepath='include/linux/filter.h' line='536' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='orig_prog' type-id='e93ad915' visibility='default' filepath='include/linux/filter.h' line='498' column='1'/>
+          <var-decl name='orig_prog' type-id='e93ad915' visibility='default' filepath='include/linux/filter.h' line='537' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='bpf_func' type-id='531a7450' visibility='default' filepath='include/linux/filter.h' line='499' column='1'/>
+          <var-decl name='bpf_func' type-id='531a7450' visibility='default' filepath='include/linux/filter.h' line='538' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='' type-id='fe772793' visibility='default' filepath='include/linux/filter.h' line='502' column='1'/>
+          <var-decl name='' type-id='fe772793' visibility='default' filepath='include/linux/filter.h' line='541' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='bpf_prog_array' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/bpf.h' line='364' column='1' id='c75c7b06'>
@@ -13010,15 +13012,15 @@
           <var-decl name='next' type-id='c3a28778' visibility='default' filepath='block/blk-rq-qos.h' line='24' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='sk_filter' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/filter.h' line='508' column='1' id='dbc9a936'>
+      <class-decl name='sk_filter' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/filter.h' line='547' column='1' id='dbc9a936'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='refcnt' type-id='64615833' visibility='default' filepath='include/linux/filter.h' line='509' column='1'/>
+          <var-decl name='refcnt' type-id='64615833' visibility='default' filepath='include/linux/filter.h' line='548' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/linux/filter.h' line='510' column='1'/>
+          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/linux/filter.h' line='549' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='prog' type-id='bdcee7ae' visibility='default' filepath='include/linux/filter.h' line='511' column='1'/>
+          <var-decl name='prog' type-id='bdcee7ae' visibility='default' filepath='include/linux/filter.h' line='550' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='sock_reuseport' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/net/sock_reuseport.h' line='13' column='1' id='ff751355'>
@@ -16691,7 +16693,7 @@
           <var-decl name='ipi_list' type-id='72f469ec' visibility='default' filepath='include/linux/blkdev.h' line='180' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__5' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/iocontext.h' line='87' column='1' id='eb20ccf0'>
+      <union-decl name='__anonymous_union__6' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/iocontext.h' line='87' column='1' id='eb20ccf0'>
         <data-member access='public'>
           <var-decl name='ioc_node' type-id='03a4a074' visibility='default' filepath='include/linux/iocontext.h' line='88' column='1'/>
         </data-member>
@@ -16699,7 +16701,7 @@
           <var-decl name='__rcu_head' type-id='e3d8ce29' visibility='default' filepath='include/linux/iocontext.h' line='89' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__35' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='1176' column='1' id='adf5bf47'>
+      <union-decl name='__anonymous_union__33' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='1176' column='1' id='adf5bf47'>
         <data-member access='public'>
           <var-decl name='hashinfo' type-id='d7a1e3c2' visibility='default' filepath='include/net/sock.h' line='1177' column='1'/>
         </data-member>
@@ -16745,7 +16747,7 @@
           <var-decl name='serial_node' type-id='2a8a6332' visibility='default' filepath='include/linux/key.h' line='160' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__4' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/iocontext.h' line='83' column='1' id='df248743'>
+      <union-decl name='__anonymous_union__5' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/iocontext.h' line='83' column='1' id='df248743'>
         <data-member access='public'>
           <var-decl name='q_node' type-id='72f469ec' visibility='default' filepath='include/linux/iocontext.h' line='84' column='1'/>
         </data-member>
@@ -16784,12 +16786,12 @@
           <var-decl name='error_count' type-id='95e97e5e' visibility='default' filepath='include/linux/blkdev.h' line='192' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__4' is-anonymous='yes' visibility='default' filepath='include/linux/filter.h' line='502' column='1' id='fe772793'>
+      <union-decl name='__anonymous_union__4' is-anonymous='yes' visibility='default' filepath='include/linux/filter.h' line='541' column='1' id='fe772793'>
         <data-member access='public'>
-          <var-decl name='insns' type-id='4967766c' visibility='default' filepath='include/linux/filter.h' line='503' column='1'/>
+          <var-decl name='insns' type-id='4967766c' visibility='default' filepath='include/linux/filter.h' line='542' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='insnsi' type-id='b50399da' visibility='default' filepath='include/linux/filter.h' line='504' column='1'/>
+          <var-decl name='insnsi' type-id='b50399da' visibility='default' filepath='include/linux/filter.h' line='543' column='1'/>
         </data-member>
       </union-decl>
       <union-decl name='__anonymous_union__5' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='165' column='1' id='21f0eb77'>
@@ -18931,12 +18933,12 @@
           <var-decl name='map' type-id='278a4544' visibility='default' filepath='include/linux/sbitmap.h' line='68' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='sock_fprog_kern' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/filter.h' line='464' column='1' id='f29d9605'>
+      <class-decl name='sock_fprog_kern' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/filter.h' line='503' column='1' id='f29d9605'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='len' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='465' column='1'/>
+          <var-decl name='len' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='504' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='filter' type-id='e1ea11f6' visibility='default' filepath='include/linux/filter.h' line='466' column='1'/>
+          <var-decl name='filter' type-id='e1ea11f6' visibility='default' filepath='include/linux/filter.h' line='505' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='super_block' size-in-bits='13824' is-struct='yes' visibility='default' filepath='include/linux/fs.h' line='1411' column='1' id='bc39a8be'>
@@ -20377,7 +20379,7 @@
           <var-decl name='d_real' type-id='3cce524c' visibility='default' filepath='include/linux/dcache.h' line='152' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='' type-id='70acbd94' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
+          <var-decl name='' type-id='82eadc08' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='896'>
           <var-decl name='android_kabi_reserved2' type-id='91ce1af9' visibility='default' filepath='include/linux/dcache.h' line='156' column='1'/>
@@ -22812,7 +22814,7 @@
           <var-decl name='ptr' type-id='baf98fd3' visibility='default' filepath='include/net/netns/generic.h' line='35' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__4' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='fs/proc/internal.h' line='48' column='1' id='1371a02f'>
+      <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='fs/proc/internal.h' line='48' column='1' id='1371a02f'>
         <data-member access='public'>
           <var-decl name='seq_ops' type-id='943a1b48' visibility='default' filepath='fs/proc/internal.h' line='49' column='1'/>
         </data-member>
@@ -23131,7 +23133,23 @@
           <var-decl name='jited_len' type-id='19c2251e' visibility='default' filepath='include/linux/bpf.h' line='272' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cpu_rmap' is-struct='yes' visibility='default' is-declaration-only='yes' id='e09a048e'/>
+      <class-decl name='cpu_rmap' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/cpu_rmap.h' line='27' column='1' id='e09a048e'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='refcount' type-id='400fb07b' visibility='default' filepath='include/linux/cpu_rmap.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='size' type-id='1dc6a898' visibility='default' filepath='include/linux/cpu_rmap.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='used' type-id='1dc6a898' visibility='default' filepath='include/linux/cpu_rmap.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='obj' type-id='63e171df' visibility='default' filepath='include/linux/cpu_rmap.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='near' type-id='f443352a' visibility='default' filepath='include/linux/cpu_rmap.h' line='34' column='1'/>
+        </data-member>
+      </class-decl>
       <class-decl name='ctl_table_poll' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/sysctl.h' line='95' column='1' id='d39c42ab'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='event' type-id='49178f86' visibility='default' filepath='include/linux/sysctl.h' line='96' column='1'/>
@@ -23738,24 +23756,24 @@
           <var-decl name='secret' type-id='f6ed712a' visibility='default' filepath='include/linux/ipv6.h' line='68' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='irq_domain_chip_generic' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='1061' column='1' id='f100815b'>
+      <class-decl name='irq_domain_chip_generic' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='1063' column='1' id='f100815b'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='irqs_per_chip' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1062' column='1'/>
+          <var-decl name='irqs_per_chip' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1064' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='num_chips' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1063' column='1'/>
+          <var-decl name='num_chips' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1065' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='irq_flags_to_clear' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1064' column='1'/>
+          <var-decl name='irq_flags_to_clear' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1066' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='irq_flags_to_set' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1065' column='1'/>
+          <var-decl name='irq_flags_to_set' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1067' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='gc_flags' type-id='7a1ec3b1' visibility='default' filepath='include/linux/irq.h' line='1066' column='1'/>
+          <var-decl name='gc_flags' type-id='7a1ec3b1' visibility='default' filepath='include/linux/irq.h' line='1068' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='gc' type-id='a5527824' visibility='default' filepath='include/linux/irq.h' line='1067' column='1'/>
+          <var-decl name='gc' type-id='a5527824' visibility='default' filepath='include/linux/irq.h' line='1069' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='iw_public_data' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/net/iw_handler.h' line='420' column='1' id='44b3a0ac'>
@@ -25011,12 +25029,12 @@
           <var-decl name='dev_scratch' type-id='7359adad' visibility='default' filepath='include/linux/skbuff.h' line='677' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__36' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='70acbd94'>
+      <union-decl name='__anonymous_union__36' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='82eadc08'>
         <data-member access='public'>
           <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide77' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
+          <var-decl name='' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
         </data-member>
         <data-member access='public'>
           <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
@@ -25091,6 +25109,9 @@
         <subrange length='6' type-id='7ff19f0f' id='52fa524b'/>
       </array-type-def>
       <pointer-type-def type-id='68a72cd7' size-in-bits='64' id='b6316a7f'/>
+      <array-type-def dimensions='1' type-id='bb08c7e1' size-in-bits='infinite' id='f443352a'>
+        <subrange length='infinite' type-id='7ff19f0f' id='031f2035'/>
+      </array-type-def>
       <pointer-type-def type-id='708c2394' size-in-bits='64' id='282b7312'/>
       <pointer-type-def type-id='0ad68707' size-in-bits='64' id='b6a33eaf'/>
       <pointer-type-def type-id='0ef5c7e0' size-in-bits='64' id='b1253746'/>
@@ -25654,23 +25675,7 @@
           <var-decl name='req_pool' type-id='2745fad8' visibility='default' filepath='fs/verity/fsverity_private.h' line='41' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='fsverity_operations' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/fsverity.h' line='18' column='1' id='5f0d764c'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='begin_enable_verity' type-id='4da4101d' visibility='default' filepath='include/linux/fsverity.h' line='33' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='end_enable_verity' type-id='f3a5c46a' visibility='default' filepath='include/linux/fsverity.h' line='55' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='get_verity_descriptor' type-id='c60354f3' visibility='default' filepath='include/linux/fsverity.h' line='72' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='read_merkle_tree_page' type-id='68b31938' visibility='default' filepath='include/linux/fsverity.h' line='93' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='write_merkle_tree_block' type-id='c748f227' visibility='default' filepath='include/linux/fsverity.h' line='110' column='1'/>
-        </data-member>
-      </class-decl>
+      <class-decl name='fsverity_operations' is-struct='yes' visibility='default' is-declaration-only='yes' id='5f0d764c'/>
       <class-decl name='fwnode_operations' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/linux/fwnode.h' line='117' column='1' id='f45a6a89'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='get' type-id='e3a3f61a' visibility='default' filepath='include/linux/fwnode.h' line='118' column='1'/>
@@ -26746,12 +26751,12 @@
           <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='include/net/udp.h' line='64' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='uncached_list' size-in-bits='192' is-struct='yes' visibility='default' filepath='net/ipv4/route.c' line='1504' column='1' id='6b1203e5'>
+      <class-decl name='uncached_list' size-in-bits='192' is-struct='yes' visibility='default' filepath='net/ipv4/route.c' line='1518' column='1' id='6b1203e5'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='net/ipv4/route.c' line='1505' column='1'/>
+          <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='net/ipv4/route.c' line='1519' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='head' type-id='72f469ec' visibility='default' filepath='net/ipv4/route.c' line='1506' column='1'/>
+          <var-decl name='head' type-id='72f469ec' visibility='default' filepath='net/ipv4/route.c' line='1520' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='worker_pool' size-in-bits='7168' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='147' column='1' id='19ea21fe'>
@@ -27030,7 +27035,7 @@
         <enumerator name='IEEE80211_BSS_TYPE_MBSS' value='3'/>
         <enumerator name='IEEE80211_BSS_TYPE_ANY' value='4'/>
       </enum-decl>
-      <enum-decl name='irq_gc_flags' filepath='include/linux/irq.h' line='1044' column='1' id='7a1ec3b1'>
+      <enum-decl name='irq_gc_flags' filepath='include/linux/irq.h' line='1046' column='1' id='7a1ec3b1'>
         <underlying-type type-id='9cac1fee'/>
         <enumerator name='IRQ_GC_INIT_MASK_CACHE' value='1'/>
         <enumerator name='IRQ_GC_INIT_NESTED_LOCK' value='2'/>
@@ -27170,7 +27175,7 @@
           <var-decl name='e_gid' type-id='094d8048' visibility='default' filepath='include/linux/posix_acl.h' line='23' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__4' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/tty.h' line='59' column='1' id='053892cc'>
+      <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/tty.h' line='59' column='1' id='053892cc'>
         <data-member access='public'>
           <var-decl name='next' type-id='a150e667' visibility='default' filepath='include/linux/tty.h' line='60' column='1'/>
         </data-member>
@@ -28291,6 +28296,14 @@
           <var-decl name='hi' type-id='3f1a6b60' visibility='default' filepath='include/net/xfrm.h' line='1074' column='1'/>
         </data-member>
       </class-decl>
+      <class-decl name='__anonymous_struct__2' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/cpu_rmap.h' line='31' column='1' id='bb08c7e1'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='index' type-id='1dc6a898' visibility='default' filepath='include/linux/cpu_rmap.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='dist' type-id='1dc6a898' visibility='default' filepath='include/linux/cpu_rmap.h' line='33' column='1'/>
+        </data-member>
+      </class-decl>
       <qualified-type-def type-id='47692c1a' const='yes' id='2212bd2d'/>
       <qualified-type-def type-id='90cdb889' const='yes' id='4e65adfa'/>
       <qualified-type-def type-id='1cf1b931' const='yes' id='f4f74d50'/>
@@ -28376,7 +28389,6 @@
       <pointer-type-def type-id='ea863425' size-in-bits='64' id='35646c79'/>
       <pointer-type-def type-id='0ebe5367' size-in-bits='64' id='7fc43753'/>
       <pointer-type-def type-id='d87d8242' size-in-bits='64' id='24c1e1dc'/>
-      <pointer-type-def type-id='74fec388' size-in-bits='64' id='f3a5c46a'/>
       <pointer-type-def type-id='4ed460e4' size-in-bits='64' id='f220106e'/>
       <pointer-type-def type-id='cd313b90' size-in-bits='64' id='28ba4492'/>
       <pointer-type-def type-id='91de15a8' size-in-bits='64' id='2cdfbf0a'/>
@@ -28386,7 +28398,6 @@
       <pointer-type-def type-id='a48b0884' size-in-bits='64' id='35d085ce'/>
       <pointer-type-def type-id='7a6178ff' size-in-bits='64' id='c60354f3'/>
       <pointer-type-def type-id='4f0fdafb' size-in-bits='64' id='ef75df1f'/>
-      <pointer-type-def type-id='91dc7ea3' size-in-bits='64' id='c748f227'/>
       <pointer-type-def type-id='b36b391c' size-in-bits='64' id='fd780be6'/>
       <pointer-type-def type-id='31b74d85' size-in-bits='64' id='f98694f9'/>
       <pointer-type-def type-id='322ff019' size-in-bits='64' id='619df3fd'/>
@@ -28512,7 +28523,6 @@
       <pointer-type-def type-id='ed5381db' size-in-bits='64' id='ff47b24b'/>
       <pointer-type-def type-id='75a3ad48' size-in-bits='64' id='13b49faa'/>
       <pointer-type-def type-id='4469e818' size-in-bits='64' id='3217f9ba'/>
-      <pointer-type-def type-id='e151e1f6' size-in-bits='64' id='68b31938'/>
       <pointer-type-def type-id='e29df76e' size-in-bits='64' id='15543b10'/>
       <pointer-type-def type-id='c2be49b0' size-in-bits='64' id='eb9a3ab6'/>
       <array-type-def dimensions='1' type-id='3cc8739a' size-in-bits='infinite' id='bde3078a'>
@@ -29063,66 +29073,66 @@
         </data-member>
       </class-decl>
       <class-decl name='iova_domain' is-struct='yes' visibility='default' is-declaration-only='yes' id='67db36ed'/>
-      <class-decl name='irq_chip_generic' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='1011' column='1' id='bb06f572'>
+      <class-decl name='irq_chip_generic' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='1013' column='1' id='bb06f572'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='lock' type-id='f5c90b3f' visibility='default' filepath='include/linux/irq.h' line='1012' column='1'/>
+          <var-decl name='lock' type-id='f5c90b3f' visibility='default' filepath='include/linux/irq.h' line='1014' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='reg_base' type-id='eaa32e2f' visibility='default' filepath='include/linux/irq.h' line='1013' column='1'/>
+          <var-decl name='reg_base' type-id='eaa32e2f' visibility='default' filepath='include/linux/irq.h' line='1015' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='reg_readl' type-id='99577235' visibility='default' filepath='include/linux/irq.h' line='1014' column='1'/>
+          <var-decl name='reg_readl' type-id='99577235' visibility='default' filepath='include/linux/irq.h' line='1016' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='reg_writel' type-id='f34cc61f' visibility='default' filepath='include/linux/irq.h' line='1015' column='1'/>
+          <var-decl name='reg_writel' type-id='f34cc61f' visibility='default' filepath='include/linux/irq.h' line='1017' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='suspend' type-id='bf17d761' visibility='default' filepath='include/linux/irq.h' line='1016' column='1'/>
+          <var-decl name='suspend' type-id='bf17d761' visibility='default' filepath='include/linux/irq.h' line='1018' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='resume' type-id='bf17d761' visibility='default' filepath='include/linux/irq.h' line='1017' column='1'/>
+          <var-decl name='resume' type-id='bf17d761' visibility='default' filepath='include/linux/irq.h' line='1019' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='irq_base' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1018' column='1'/>
+          <var-decl name='irq_base' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1020' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='416'>
-          <var-decl name='irq_cnt' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1019' column='1'/>
+          <var-decl name='irq_cnt' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1021' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='mask_cache' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='1020' column='1'/>
+          <var-decl name='mask_cache' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='1022' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='480'>
-          <var-decl name='type_cache' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='1021' column='1'/>
+          <var-decl name='type_cache' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='1023' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='polarity_cache' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='1022' column='1'/>
+          <var-decl name='polarity_cache' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='1024' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='544'>
-          <var-decl name='wake_enabled' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='1023' column='1'/>
+          <var-decl name='wake_enabled' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='1025' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='wake_active' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='1024' column='1'/>
+          <var-decl name='wake_active' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='1026' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='608'>
-          <var-decl name='num_ct' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1025' column='1'/>
+          <var-decl name='num_ct' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1027' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='640'>
-          <var-decl name='private' type-id='eaa32e2f' visibility='default' filepath='include/linux/irq.h' line='1026' column='1'/>
+          <var-decl name='private' type-id='eaa32e2f' visibility='default' filepath='include/linux/irq.h' line='1028' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='installed' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='1027' column='1'/>
+          <var-decl name='installed' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='1029' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='768'>
-          <var-decl name='unused' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='1028' column='1'/>
+          <var-decl name='unused' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='1030' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='domain' type-id='7544e824' visibility='default' filepath='include/linux/irq.h' line='1029' column='1'/>
+          <var-decl name='domain' type-id='7544e824' visibility='default' filepath='include/linux/irq.h' line='1031' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='896'>
-          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='include/linux/irq.h' line='1030' column='1'/>
+          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='include/linux/irq.h' line='1032' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='chip_types' type-id='7290550d' visibility='default' filepath='include/linux/irq.h' line='1031' column='1'/>
+          <var-decl name='chip_types' type-id='7290550d' visibility='default' filepath='include/linux/irq.h' line='1033' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='iw_quality' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='716' column='1' id='aa80c027'>
@@ -30087,24 +30097,24 @@
           <var-decl name='tx_highest' type-id='23119536' visibility='default' filepath='include/linux/ieee80211.h' line='1484' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='irq_chip_type' size-in-bits='2816' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='969' column='1' id='62778ae5'>
+      <class-decl name='irq_chip_type' size-in-bits='2816' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='971' column='1' id='62778ae5'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='chip' type-id='0f5f7920' visibility='default' filepath='include/linux/irq.h' line='970' column='1'/>
+          <var-decl name='chip' type-id='0f5f7920' visibility='default' filepath='include/linux/irq.h' line='972' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2176'>
-          <var-decl name='regs' type-id='6194fd9a' visibility='default' filepath='include/linux/irq.h' line='971' column='1'/>
+          <var-decl name='regs' type-id='6194fd9a' visibility='default' filepath='include/linux/irq.h' line='973' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2624'>
-          <var-decl name='handler' type-id='cdb741d3' visibility='default' filepath='include/linux/irq.h' line='972' column='1'/>
+          <var-decl name='handler' type-id='cdb741d3' visibility='default' filepath='include/linux/irq.h' line='974' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2688'>
-          <var-decl name='type' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='973' column='1'/>
+          <var-decl name='type' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='975' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2720'>
-          <var-decl name='mask_cache_priv' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='974' column='1'/>
+          <var-decl name='mask_cache_priv' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='976' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2752'>
-          <var-decl name='mask_cache' type-id='f9409001' visibility='default' filepath='include/linux/irq.h' line='975' column='1'/>
+          <var-decl name='mask_cache' type-id='f9409001' visibility='default' filepath='include/linux/irq.h' line='977' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='nl80211_vendor_cmd_info' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/nl80211.h' line='5743' column='1' id='e223f110'>
@@ -30293,7 +30303,7 @@
       <array-type-def dimensions='1' type-id='19c2251e' size-in-bits='64' id='1872161b'>
         <subrange length='2' type-id='7ff19f0f' id='52efc4ef'/>
       </array-type-def>
-      <union-decl name='__anonymous_union__13' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/cfg80211.h' line='2331' column='1' id='0532d6f6'>
+      <union-decl name='__anonymous_union__3' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/cfg80211.h' line='2331' column='1' id='0532d6f6'>
         <data-member access='public'>
           <var-decl name='band_pref' type-id='3eaa0294' visibility='default' filepath='include/net/cfg80211.h' line='2332' column='1'/>
         </data-member>
@@ -30651,27 +30661,27 @@
           <var-decl name='flags' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='523' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='irq_chip_regs' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='946' column='1' id='6194fd9a'>
+      <class-decl name='irq_chip_regs' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='948' column='1' id='6194fd9a'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='enable' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='947' column='1'/>
+          <var-decl name='enable' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='949' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='disable' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='948' column='1'/>
+          <var-decl name='disable' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='950' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='mask' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='949' column='1'/>
+          <var-decl name='mask' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='951' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='ack' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='950' column='1'/>
+          <var-decl name='ack' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='952' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='eoi' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='951' column='1'/>
+          <var-decl name='eoi' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='953' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='type' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='952' column='1'/>
+          <var-decl name='type' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='954' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='polarity' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='953' column='1'/>
+          <var-decl name='polarity' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='955' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='neigh_hash_table' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/net/neighbour.h' line='184' column='1' id='1f305e7e'>
@@ -31503,28 +31513,6 @@
       </function-type>
     </abi-instr>
     <abi-instr address-size='64' path='arch/arm64/kernel/ptrace.c' language='LANG_C89'>
-      <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/sched.h' line='1296' column='1' id='5b4c9aa0'>
-        <data-member access='public'>
-          <var-decl name='frozen' type-id='f0981eeb' visibility='default' filepath='include/linux/sched.h' line='1296' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide49' type-id='156952c4' visibility='default' filepath='include/linux/sched.h' line='1296' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/sched.h' line='1296' column='1'/>
-        </data-member>
-      </union-decl>
-      <union-decl name='__anonymous_union__2' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/sched.h' line='1299' column='1' id='294bac1b'>
-        <data-member access='public'>
-          <var-decl name='futex_state' type-id='f0981eeb' visibility='default' filepath='include/linux/sched.h' line='1299' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide50' type-id='6040de71' visibility='default' filepath='include/linux/sched.h' line='1299' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/sched.h' line='1299' column='1'/>
-        </data-member>
-      </union-decl>
       <pointer-type-def type-id='e57536d9' size-in-bits='64' id='20862e61'/>
       <function-decl name='perf_event_release_kernel' mangled-name='perf_event_release_kernel' filepath='include/linux/perf_event.h' line='906' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='perf_event_release_kernel'>
         <parameter type-id='2bf16f59'/>
@@ -34316,7 +34304,23 @@
           <var-decl name='buckets' type-id='bde3078a' visibility='default' filepath='include/linux/rhashtable.h' line='75' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cpu_rmap' is-struct='yes' visibility='default' is-declaration-only='yes' id='e09a048e'/>
+      <class-decl name='cpu_rmap' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/cpu_rmap.h' line='27' column='1' id='e09a048e'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='refcount' type-id='400fb07b' visibility='default' filepath='include/linux/cpu_rmap.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='size' type-id='1dc6a898' visibility='default' filepath='include/linux/cpu_rmap.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='used' type-id='1dc6a898' visibility='default' filepath='include/linux/cpu_rmap.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='obj' type-id='63e171df' visibility='default' filepath='include/linux/cpu_rmap.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='near' type-id='f443352a' visibility='default' filepath='include/linux/cpu_rmap.h' line='34' column='1'/>
+        </data-member>
+      </class-decl>
       <class-decl name='dst_entry' size-in-bits='896' is-struct='yes' visibility='default' filepath='include/net/dst.h' line='35' column='1' id='772a4ddf'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='dev' type-id='68a2d05b' visibility='default' filepath='include/net/dst.h' line='36' column='1'/>
@@ -40820,17 +40824,6 @@
       </class-decl>
       <typedef-decl name='compat_uptr_t' type-id='19c2251e' filepath='arch/arm64/include/asm/compat.h' line='66' column='1' id='782d78af'/>
       <typedef-decl name='compat_long_t' type-id='a7832498' filepath='arch/arm64/include/asm/compat.h' line='60' column='1' id='abb906de'/>
-      <union-decl name='__anonymous_union__21' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='ecf138a1'>
-        <data-member access='public'>
-          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide67' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-      </union-decl>
       <pointer-type-def type-id='85c22421' size-in-bits='64' id='ee406209'/>
       <pointer-type-def type-id='830ee0a7' size-in-bits='64' id='5d3a884e'/>
       <pointer-type-def type-id='3b5c61ad' size-in-bits='64' id='a38aafde'/>
@@ -43320,27 +43313,27 @@
       </enum-decl>
       <pointer-type-def type-id='4b3ae594' size-in-bits='64' id='c1433076'/>
       <pointer-type-def type-id='850c13f6' size-in-bits='64' id='4e034354'/>
-      <class-decl name='clk' size-in-bits='512' is-struct='yes' visibility='default' filepath='drivers/clk/clk.c' line='121' column='1' id='830e3b1b'>
+      <class-decl name='clk' size-in-bits='512' is-struct='yes' visibility='default' filepath='drivers/clk/clk.c' line='116' column='1' id='830e3b1b'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='core' type-id='ba21e62b' visibility='default' filepath='drivers/clk/clk.c' line='122' column='1'/>
+          <var-decl name='core' type-id='ba21e62b' visibility='default' filepath='drivers/clk/clk.c' line='117' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='dev_id' type-id='80f4b756' visibility='default' filepath='drivers/clk/clk.c' line='123' column='1'/>
+          <var-decl name='dev_id' type-id='80f4b756' visibility='default' filepath='drivers/clk/clk.c' line='118' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='con_id' type-id='80f4b756' visibility='default' filepath='drivers/clk/clk.c' line='124' column='1'/>
+          <var-decl name='con_id' type-id='80f4b756' visibility='default' filepath='drivers/clk/clk.c' line='119' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='min_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='125' column='1'/>
+          <var-decl name='min_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='120' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='max_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='126' column='1'/>
+          <var-decl name='max_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='121' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='exclusive_count' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='127' column='1'/>
+          <var-decl name='exclusive_count' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='122' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='clks_node' type-id='03a4a074' visibility='default' filepath='drivers/clk/clk.c' line='128' column='1'/>
+          <var-decl name='clks_node' type-id='03a4a074' visibility='default' filepath='drivers/clk/clk.c' line='123' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='dev_pm_set_opp_data' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/pm_opp.h' line='69' column='1' id='d48383c4'>
@@ -43405,129 +43398,129 @@
         </data-member>
       </class-decl>
       <pointer-type-def type-id='636cc9ab' size-in-bits='64' id='ba21e62b'/>
-      <class-decl name='clk_core' size-in-bits='2176' is-struct='yes' visibility='default' filepath='drivers/clk/clk.c' line='70' column='1' id='636cc9ab'>
+      <class-decl name='clk_core' size-in-bits='2176' is-struct='yes' visibility='default' filepath='drivers/clk/clk.c' line='65' column='1' id='636cc9ab'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='name' type-id='80f4b756' visibility='default' filepath='drivers/clk/clk.c' line='71' column='1'/>
+          <var-decl name='name' type-id='80f4b756' visibility='default' filepath='drivers/clk/clk.c' line='66' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='ops' type-id='824ffa73' visibility='default' filepath='drivers/clk/clk.c' line='72' column='1'/>
+          <var-decl name='ops' type-id='824ffa73' visibility='default' filepath='drivers/clk/clk.c' line='67' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='hw' type-id='3aaeef89' visibility='default' filepath='drivers/clk/clk.c' line='73' column='1'/>
+          <var-decl name='hw' type-id='3aaeef89' visibility='default' filepath='drivers/clk/clk.c' line='68' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='owner' type-id='2730d015' visibility='default' filepath='drivers/clk/clk.c' line='74' column='1'/>
+          <var-decl name='owner' type-id='2730d015' visibility='default' filepath='drivers/clk/clk.c' line='69' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='dev' type-id='fa0b179b' visibility='default' filepath='drivers/clk/clk.c' line='75' column='1'/>
+          <var-decl name='dev' type-id='fa0b179b' visibility='default' filepath='drivers/clk/clk.c' line='70' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='parent' type-id='ba21e62b' visibility='default' filepath='drivers/clk/clk.c' line='76' column='1'/>
+          <var-decl name='parent' type-id='ba21e62b' visibility='default' filepath='drivers/clk/clk.c' line='71' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='parent_names' type-id='7d3cd834' visibility='default' filepath='drivers/clk/clk.c' line='77' column='1'/>
+          <var-decl name='parent_names' type-id='7d3cd834' visibility='default' filepath='drivers/clk/clk.c' line='72' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='parents' type-id='045d1393' visibility='default' filepath='drivers/clk/clk.c' line='78' column='1'/>
+          <var-decl name='parents' type-id='045d1393' visibility='default' filepath='drivers/clk/clk.c' line='73' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='num_parents' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='79' column='1'/>
+          <var-decl name='num_parents' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='74' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='544'>
-          <var-decl name='new_parent_index' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='80' column='1'/>
+          <var-decl name='new_parent_index' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='75' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='81' column='1'/>
+          <var-decl name='rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='76' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='640'>
-          <var-decl name='req_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='82' column='1'/>
+          <var-decl name='req_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='77' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='new_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='83' column='1'/>
+          <var-decl name='new_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='78' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='768'>
-          <var-decl name='new_parent' type-id='ba21e62b' visibility='default' filepath='drivers/clk/clk.c' line='84' column='1'/>
+          <var-decl name='new_parent' type-id='ba21e62b' visibility='default' filepath='drivers/clk/clk.c' line='79' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='new_child' type-id='ba21e62b' visibility='default' filepath='drivers/clk/clk.c' line='85' column='1'/>
+          <var-decl name='new_child' type-id='ba21e62b' visibility='default' filepath='drivers/clk/clk.c' line='80' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='896'>
-          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='86' column='1'/>
+          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='81' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='960'>
-          <var-decl name='orphan' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='87' column='1'/>
+          <var-decl name='orphan' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='82' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='968'>
-          <var-decl name='rpm_enabled' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='88' column='1'/>
+          <var-decl name='rpm_enabled' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='83' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='976'>
-          <var-decl name='need_sync' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='89' column='1'/>
+          <var-decl name='need_sync' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='84' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='984'>
-          <var-decl name='boot_enabled' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='90' column='1'/>
+          <var-decl name='boot_enabled' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='85' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='992'>
-          <var-decl name='enable_count' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='91' column='1'/>
+          <var-decl name='enable_count' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='86' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='prepare_count' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='92' column='1'/>
+          <var-decl name='prepare_count' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='87' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1056'>
-          <var-decl name='protect_count' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='93' column='1'/>
+          <var-decl name='protect_count' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='88' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1088'>
-          <var-decl name='need_handoff_enable' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='94' column='1'/>
+          <var-decl name='need_handoff_enable' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='89' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1096'>
-          <var-decl name='need_handoff_prepare' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='95' column='1'/>
+          <var-decl name='need_handoff_prepare' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='90' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1152'>
-          <var-decl name='min_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='96' column='1'/>
+          <var-decl name='min_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='91' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1216'>
-          <var-decl name='max_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='97' column='1'/>
+          <var-decl name='max_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='92' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1280'>
-          <var-decl name='accuracy' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='98' column='1'/>
+          <var-decl name='accuracy' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='93' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1344'>
-          <var-decl name='phase' type-id='95e97e5e' visibility='default' filepath='drivers/clk/clk.c' line='99' column='1'/>
+          <var-decl name='phase' type-id='95e97e5e' visibility='default' filepath='drivers/clk/clk.c' line='94' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1376'>
-          <var-decl name='duty' type-id='4f935e80' visibility='default' filepath='drivers/clk/clk.c' line='100' column='1'/>
+          <var-decl name='duty' type-id='4f935e80' visibility='default' filepath='drivers/clk/clk.c' line='95' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1472'>
-          <var-decl name='children' type-id='e151255a' visibility='default' filepath='drivers/clk/clk.c' line='101' column='1'/>
+          <var-decl name='children' type-id='e151255a' visibility='default' filepath='drivers/clk/clk.c' line='96' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1536'>
-          <var-decl name='child_node' type-id='03a4a074' visibility='default' filepath='drivers/clk/clk.c' line='102' column='1'/>
+          <var-decl name='child_node' type-id='03a4a074' visibility='default' filepath='drivers/clk/clk.c' line='97' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1664'>
-          <var-decl name='clks' type-id='e151255a' visibility='default' filepath='drivers/clk/clk.c' line='103' column='1'/>
+          <var-decl name='clks' type-id='e151255a' visibility='default' filepath='drivers/clk/clk.c' line='98' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1728'>
-          <var-decl name='notifier_count' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='104' column='1'/>
+          <var-decl name='notifier_count' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='99' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1760'>
-          <var-decl name='ref' type-id='400fb07b' visibility='default' filepath='drivers/clk/clk.c' line='109' column='1'/>
+          <var-decl name='ref' type-id='400fb07b' visibility='default' filepath='drivers/clk/clk.c' line='104' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1792'>
-          <var-decl name='vdd_class' type-id='1652a0c5' visibility='default' filepath='drivers/clk/clk.c' line='110' column='1'/>
+          <var-decl name='vdd_class' type-id='1652a0c5' visibility='default' filepath='drivers/clk/clk.c' line='105' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1856'>
-          <var-decl name='vdd_class_vote' type-id='95e97e5e' visibility='default' filepath='drivers/clk/clk.c' line='111' column='1'/>
+          <var-decl name='vdd_class_vote' type-id='95e97e5e' visibility='default' filepath='drivers/clk/clk.c' line='106' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1888'>
-          <var-decl name='new_vdd_class_vote' type-id='95e97e5e' visibility='default' filepath='drivers/clk/clk.c' line='112' column='1'/>
+          <var-decl name='new_vdd_class_vote' type-id='95e97e5e' visibility='default' filepath='drivers/clk/clk.c' line='107' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1920'>
-          <var-decl name='rate_change_node' type-id='72f469ec' visibility='default' filepath='drivers/clk/clk.c' line='113' column='1'/>
+          <var-decl name='rate_change_node' type-id='72f469ec' visibility='default' filepath='drivers/clk/clk.c' line='108' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2048'>
-          <var-decl name='rate_max' type-id='1d2c2b85' visibility='default' filepath='drivers/clk/clk.c' line='114' column='1'/>
+          <var-decl name='rate_max' type-id='1d2c2b85' visibility='default' filepath='drivers/clk/clk.c' line='109' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2112'>
-          <var-decl name='num_rate_max' type-id='95e97e5e' visibility='default' filepath='drivers/clk/clk.c' line='115' column='1'/>
+          <var-decl name='num_rate_max' type-id='95e97e5e' visibility='default' filepath='drivers/clk/clk.c' line='110' column='1'/>
         </data-member>
       </class-decl>
       <pointer-type-def type-id='7dfdcc84' size-in-bits='64' id='43c38462'/>
@@ -46754,6 +46747,74 @@
       <pointer-type-def type-id='9cbd1c16' size-in-bits='64' id='f9b37274'/>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/block/zram/zram_drv.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='28ee064c' size-in-bits='320' id='39e531ac'>
+        <subrange length='5' type-id='7ff19f0f' id='53010e10'/>
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='0f8f80b0' size-in-bits='320' id='39e1fe03'>
+        <subrange length='5' type-id='7ff19f0f' id='53010e10'/>
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='3213e875' size-in-bits='320' id='f5665670'>
+        <subrange length='5' type-id='7ff19f0f' id='53010e10'/>
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='b92c8d0d' size-in-bits='1600' id='68a92070'>
+        <subrange length='5' type-id='7ff19f0f' id='53010e10'/>
+      </array-type-def>
+      <class-decl name='blkcg' size-in-bits='3136' is-struct='yes' visibility='default' filepath='include/linux/blk-cgroup.h' line='46' column='1' id='19b26952'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='css' type-id='7f3df443' visibility='default' filepath='include/linux/blk-cgroup.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='include/linux/blk-cgroup.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='blkg_tree' type-id='1c8dedcf' visibility='default' filepath='include/linux/blk-cgroup.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='blkg_hint' type-id='1146dea3' visibility='default' filepath='include/linux/blk-cgroup.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='blkg_list' type-id='e151255a' visibility='default' filepath='include/linux/blk-cgroup.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='cpd' type-id='39e1fe03' visibility='default' filepath='include/linux/blk-cgroup.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='all_blkcgs_node' type-id='72f469ec' visibility='default' filepath='include/linux/blk-cgroup.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2944'>
+          <var-decl name='cgwb_list' type-id='72f469ec' visibility='default' filepath='include/linux/blk-cgroup.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='cgwb_refcnt' type-id='64615833' visibility='default' filepath='include/linux/blk-cgroup.h' line='59' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='blkcg_policy_data' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/blk-cgroup.h' line='102' column='1' id='11fd1392'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='blkcg' type-id='11bff950' visibility='default' filepath='include/linux/blk-cgroup.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='plid' type-id='95e97e5e' visibility='default' filepath='include/linux/blk-cgroup.h' line='105' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='blkg_rwstat' size-in-bits='1920' is-struct='yes' visibility='default' filepath='include/linux/blk-cgroup.h' line='73' column='1' id='247d0323'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cpu_cnt' type-id='68a92070' visibility='default' filepath='include/linux/blk-cgroup.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='aux_cnt' type-id='39e531ac' visibility='default' filepath='include/linux/blk-cgroup.h' line='75' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='blkg_policy_data' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/blk-cgroup.h' line='89' column='1' id='55eaf925'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='blkg' type-id='1146dea3' visibility='default' filepath='include/linux/blk-cgroup.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='plid' type-id='95e97e5e' visibility='default' filepath='include/linux/blk-cgroup.h' line='92' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='19b26952' size-in-bits='64' id='11bff950'/>
+      <pointer-type-def type-id='11fd1392' size-in-bits='64' id='0f8f80b0'/>
+      <pointer-type-def type-id='55eaf925' size-in-bits='64' id='3213e875'/>
       <qualified-type-def type-id='37ce495e' const='yes' id='1e6236d9'/>
       <pointer-type-def type-id='1e6236d9' size-in-bits='64' id='c79c8089'/>
       <pointer-type-def type-id='37ce495e' size-in-bits='64' id='301185b4'/>
@@ -46879,27 +46940,27 @@
       </function-type>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/bus/qcom-ebi2.c' language='LANG_C89'>
-      <class-decl name='clk' size-in-bits='512' is-struct='yes' visibility='default' filepath='drivers/clk/clk.c' line='121' column='1' id='830e3b1b'>
+      <class-decl name='clk' size-in-bits='512' is-struct='yes' visibility='default' filepath='drivers/clk/clk.c' line='116' column='1' id='830e3b1b'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='core' type-id='ba21e62b' visibility='default' filepath='drivers/clk/clk.c' line='122' column='1'/>
+          <var-decl name='core' type-id='ba21e62b' visibility='default' filepath='drivers/clk/clk.c' line='117' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='dev_id' type-id='80f4b756' visibility='default' filepath='drivers/clk/clk.c' line='123' column='1'/>
+          <var-decl name='dev_id' type-id='80f4b756' visibility='default' filepath='drivers/clk/clk.c' line='118' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='con_id' type-id='80f4b756' visibility='default' filepath='drivers/clk/clk.c' line='124' column='1'/>
+          <var-decl name='con_id' type-id='80f4b756' visibility='default' filepath='drivers/clk/clk.c' line='119' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='min_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='125' column='1'/>
+          <var-decl name='min_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='120' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='max_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='126' column='1'/>
+          <var-decl name='max_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='121' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='exclusive_count' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='127' column='1'/>
+          <var-decl name='exclusive_count' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='122' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='clks_node' type-id='03a4a074' visibility='default' filepath='drivers/clk/clk.c' line='128' column='1'/>
+          <var-decl name='clks_node' type-id='03a4a074' visibility='default' filepath='drivers/clk/clk.c' line='123' column='1'/>
         </data-member>
       </class-decl>
       <pointer-type-def type-id='830e3b1b' size-in-bits='64' id='7d0bc0eb'/>
@@ -47163,129 +47224,129 @@
       <var-decl name='clk_fixed_rate_ops' type-id='92072f8b' mangled-name='clk_fixed_rate_ops' visibility='default' filepath='drivers/clk/clk-fixed-rate.c' line='42' column='1' elf-symbol-id='clk_fixed_rate_ops'/>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/clk/clk-scpi.c' language='LANG_C89'>
-      <class-decl name='clk_core' size-in-bits='2176' is-struct='yes' visibility='default' filepath='drivers/clk/clk.c' line='70' column='1' id='636cc9ab'>
+      <class-decl name='clk_core' size-in-bits='2176' is-struct='yes' visibility='default' filepath='drivers/clk/clk.c' line='65' column='1' id='636cc9ab'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='name' type-id='80f4b756' visibility='default' filepath='drivers/clk/clk.c' line='71' column='1'/>
+          <var-decl name='name' type-id='80f4b756' visibility='default' filepath='drivers/clk/clk.c' line='66' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='ops' type-id='824ffa73' visibility='default' filepath='drivers/clk/clk.c' line='72' column='1'/>
+          <var-decl name='ops' type-id='824ffa73' visibility='default' filepath='drivers/clk/clk.c' line='67' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='hw' type-id='3aaeef89' visibility='default' filepath='drivers/clk/clk.c' line='73' column='1'/>
+          <var-decl name='hw' type-id='3aaeef89' visibility='default' filepath='drivers/clk/clk.c' line='68' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='owner' type-id='2730d015' visibility='default' filepath='drivers/clk/clk.c' line='74' column='1'/>
+          <var-decl name='owner' type-id='2730d015' visibility='default' filepath='drivers/clk/clk.c' line='69' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='dev' type-id='fa0b179b' visibility='default' filepath='drivers/clk/clk.c' line='75' column='1'/>
+          <var-decl name='dev' type-id='fa0b179b' visibility='default' filepath='drivers/clk/clk.c' line='70' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='parent' type-id='ba21e62b' visibility='default' filepath='drivers/clk/clk.c' line='76' column='1'/>
+          <var-decl name='parent' type-id='ba21e62b' visibility='default' filepath='drivers/clk/clk.c' line='71' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='parent_names' type-id='7d3cd834' visibility='default' filepath='drivers/clk/clk.c' line='77' column='1'/>
+          <var-decl name='parent_names' type-id='7d3cd834' visibility='default' filepath='drivers/clk/clk.c' line='72' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='parents' type-id='045d1393' visibility='default' filepath='drivers/clk/clk.c' line='78' column='1'/>
+          <var-decl name='parents' type-id='045d1393' visibility='default' filepath='drivers/clk/clk.c' line='73' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='num_parents' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='79' column='1'/>
+          <var-decl name='num_parents' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='74' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='544'>
-          <var-decl name='new_parent_index' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='80' column='1'/>
+          <var-decl name='new_parent_index' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='75' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='81' column='1'/>
+          <var-decl name='rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='76' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='640'>
-          <var-decl name='req_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='82' column='1'/>
+          <var-decl name='req_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='77' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='new_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='83' column='1'/>
+          <var-decl name='new_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='78' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='768'>
-          <var-decl name='new_parent' type-id='ba21e62b' visibility='default' filepath='drivers/clk/clk.c' line='84' column='1'/>
+          <var-decl name='new_parent' type-id='ba21e62b' visibility='default' filepath='drivers/clk/clk.c' line='79' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='new_child' type-id='ba21e62b' visibility='default' filepath='drivers/clk/clk.c' line='85' column='1'/>
+          <var-decl name='new_child' type-id='ba21e62b' visibility='default' filepath='drivers/clk/clk.c' line='80' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='896'>
-          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='86' column='1'/>
+          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='81' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='960'>
-          <var-decl name='orphan' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='87' column='1'/>
+          <var-decl name='orphan' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='82' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='968'>
-          <var-decl name='rpm_enabled' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='88' column='1'/>
+          <var-decl name='rpm_enabled' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='83' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='976'>
-          <var-decl name='need_sync' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='89' column='1'/>
+          <var-decl name='need_sync' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='84' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='984'>
-          <var-decl name='boot_enabled' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='90' column='1'/>
+          <var-decl name='boot_enabled' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='85' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='992'>
-          <var-decl name='enable_count' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='91' column='1'/>
+          <var-decl name='enable_count' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='86' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='prepare_count' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='92' column='1'/>
+          <var-decl name='prepare_count' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='87' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1056'>
-          <var-decl name='protect_count' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='93' column='1'/>
+          <var-decl name='protect_count' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='88' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1088'>
-          <var-decl name='need_handoff_enable' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='94' column='1'/>
+          <var-decl name='need_handoff_enable' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='89' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1096'>
-          <var-decl name='need_handoff_prepare' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='95' column='1'/>
+          <var-decl name='need_handoff_prepare' type-id='b50a4934' visibility='default' filepath='drivers/clk/clk.c' line='90' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1152'>
-          <var-decl name='min_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='96' column='1'/>
+          <var-decl name='min_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='91' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1216'>
-          <var-decl name='max_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='97' column='1'/>
+          <var-decl name='max_rate' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='92' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1280'>
-          <var-decl name='accuracy' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='98' column='1'/>
+          <var-decl name='accuracy' type-id='7359adad' visibility='default' filepath='drivers/clk/clk.c' line='93' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1344'>
-          <var-decl name='phase' type-id='95e97e5e' visibility='default' filepath='drivers/clk/clk.c' line='99' column='1'/>
+          <var-decl name='phase' type-id='95e97e5e' visibility='default' filepath='drivers/clk/clk.c' line='94' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1376'>
-          <var-decl name='duty' type-id='4f935e80' visibility='default' filepath='drivers/clk/clk.c' line='100' column='1'/>
+          <var-decl name='duty' type-id='4f935e80' visibility='default' filepath='drivers/clk/clk.c' line='95' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1472'>
-          <var-decl name='children' type-id='e151255a' visibility='default' filepath='drivers/clk/clk.c' line='101' column='1'/>
+          <var-decl name='children' type-id='e151255a' visibility='default' filepath='drivers/clk/clk.c' line='96' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1536'>
-          <var-decl name='child_node' type-id='03a4a074' visibility='default' filepath='drivers/clk/clk.c' line='102' column='1'/>
+          <var-decl name='child_node' type-id='03a4a074' visibility='default' filepath='drivers/clk/clk.c' line='97' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1664'>
-          <var-decl name='clks' type-id='e151255a' visibility='default' filepath='drivers/clk/clk.c' line='103' column='1'/>
+          <var-decl name='clks' type-id='e151255a' visibility='default' filepath='drivers/clk/clk.c' line='98' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1728'>
-          <var-decl name='notifier_count' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='104' column='1'/>
+          <var-decl name='notifier_count' type-id='f0981eeb' visibility='default' filepath='drivers/clk/clk.c' line='99' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1760'>
-          <var-decl name='ref' type-id='400fb07b' visibility='default' filepath='drivers/clk/clk.c' line='109' column='1'/>
+          <var-decl name='ref' type-id='400fb07b' visibility='default' filepath='drivers/clk/clk.c' line='104' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1792'>
-          <var-decl name='vdd_class' type-id='1652a0c5' visibility='default' filepath='drivers/clk/clk.c' line='110' column='1'/>
+          <var-decl name='vdd_class' type-id='1652a0c5' visibility='default' filepath='drivers/clk/clk.c' line='105' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1856'>
-          <var-decl name='vdd_class_vote' type-id='95e97e5e' visibility='default' filepath='drivers/clk/clk.c' line='111' column='1'/>
+          <var-decl name='vdd_class_vote' type-id='95e97e5e' visibility='default' filepath='drivers/clk/clk.c' line='106' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1888'>
-          <var-decl name='new_vdd_class_vote' type-id='95e97e5e' visibility='default' filepath='drivers/clk/clk.c' line='112' column='1'/>
+          <var-decl name='new_vdd_class_vote' type-id='95e97e5e' visibility='default' filepath='drivers/clk/clk.c' line='107' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1920'>
-          <var-decl name='rate_change_node' type-id='72f469ec' visibility='default' filepath='drivers/clk/clk.c' line='113' column='1'/>
+          <var-decl name='rate_change_node' type-id='72f469ec' visibility='default' filepath='drivers/clk/clk.c' line='108' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2048'>
-          <var-decl name='rate_max' type-id='1d2c2b85' visibility='default' filepath='drivers/clk/clk.c' line='114' column='1'/>
+          <var-decl name='rate_max' type-id='1d2c2b85' visibility='default' filepath='drivers/clk/clk.c' line='109' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2112'>
-          <var-decl name='num_rate_max' type-id='95e97e5e' visibility='default' filepath='drivers/clk/clk.c' line='115' column='1'/>
+          <var-decl name='num_rate_max' type-id='95e97e5e' visibility='default' filepath='drivers/clk/clk.c' line='110' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='regulator' size-in-bits='1024' is-struct='yes' visibility='default' filepath='drivers/regulator/internal.h' line='39' column='1' id='b06eb6f0'>
@@ -47634,69 +47695,69 @@
       <pointer-type-def type-id='72c165ae' size-in-bits='64' id='2a72cecc'/>
       <qualified-type-def type-id='cf8d7d81' const='yes' id='fdb55010'/>
       <pointer-type-def type-id='fdb55010' size-in-bits='64' id='9e6d4b4e'/>
-      <function-decl name='__clk_get_name' mangled-name='__clk_get_name' filepath='drivers/clk/clk.c' line='287' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__clk_get_name'>
-        <parameter type-id='10f66866' name='clk' filepath='drivers/clk/clk.c' line='287' column='1'/>
+      <function-decl name='__clk_get_name' mangled-name='__clk_get_name' filepath='drivers/clk/clk.c' line='282' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__clk_get_name'>
+        <parameter type-id='10f66866' name='clk' filepath='drivers/clk/clk.c' line='282' column='1'/>
         <return type-id='80f4b756'/>
       </function-decl>
-      <function-decl name='clk_hw_get_name' mangled-name='clk_hw_get_name' filepath='drivers/clk/clk.c' line='293' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_hw_get_name'>
-        <parameter type-id='9e6d4b4e' name='hw' filepath='drivers/clk/clk.c' line='293' column='1'/>
+      <function-decl name='clk_hw_get_name' mangled-name='clk_hw_get_name' filepath='drivers/clk/clk.c' line='288' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_hw_get_name'>
+        <parameter type-id='9e6d4b4e' name='hw' filepath='drivers/clk/clk.c' line='288' column='1'/>
         <return type-id='80f4b756'/>
       </function-decl>
-      <function-decl name='__clk_get_hw' mangled-name='__clk_get_hw' filepath='drivers/clk/clk.c' line='299' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__clk_get_hw'>
-        <parameter type-id='7d0bc0eb' name='clk' filepath='drivers/clk/clk.c' line='299' column='1'/>
+      <function-decl name='__clk_get_hw' mangled-name='__clk_get_hw' filepath='drivers/clk/clk.c' line='294' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__clk_get_hw'>
+        <parameter type-id='7d0bc0eb' name='clk' filepath='drivers/clk/clk.c' line='294' column='1'/>
         <return type-id='3aaeef89'/>
       </function-decl>
-      <function-decl name='clk_hw_get_num_parents' mangled-name='clk_hw_get_num_parents' filepath='drivers/clk/clk.c' line='305' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_hw_get_num_parents'>
-        <parameter type-id='9e6d4b4e' name='hw' filepath='drivers/clk/clk.c' line='305' column='1'/>
+      <function-decl name='clk_hw_get_num_parents' mangled-name='clk_hw_get_num_parents' filepath='drivers/clk/clk.c' line='300' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_hw_get_num_parents'>
+        <parameter type-id='9e6d4b4e' name='hw' filepath='drivers/clk/clk.c' line='300' column='1'/>
         <return type-id='f0981eeb'/>
       </function-decl>
-      <function-decl name='clk_hw_get_parent' mangled-name='clk_hw_get_parent' filepath='drivers/clk/clk.c' line='311' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_hw_get_parent'>
-        <parameter type-id='9e6d4b4e' name='hw' filepath='drivers/clk/clk.c' line='311' column='1'/>
+      <function-decl name='clk_hw_get_parent' mangled-name='clk_hw_get_parent' filepath='drivers/clk/clk.c' line='306' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_hw_get_parent'>
+        <parameter type-id='9e6d4b4e' name='hw' filepath='drivers/clk/clk.c' line='306' column='1'/>
         <return type-id='3aaeef89'/>
       </function-decl>
-      <function-decl name='clk_hw_get_parent_by_index' mangled-name='clk_hw_get_parent_by_index' filepath='drivers/clk/clk.c' line='374' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_hw_get_parent_by_index'>
-        <parameter type-id='9e6d4b4e' name='hw' filepath='drivers/clk/clk.c' line='374' column='1'/>
-        <parameter type-id='f0981eeb' name='index' filepath='drivers/clk/clk.c' line='374' column='1'/>
+      <function-decl name='clk_hw_get_parent_by_index' mangled-name='clk_hw_get_parent_by_index' filepath='drivers/clk/clk.c' line='369' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_hw_get_parent_by_index'>
+        <parameter type-id='9e6d4b4e' name='hw' filepath='drivers/clk/clk.c' line='369' column='1'/>
+        <parameter type-id='f0981eeb' name='index' filepath='drivers/clk/clk.c' line='369' column='1'/>
         <return type-id='3aaeef89'/>
       </function-decl>
-      <function-decl name='clk_hw_get_rate' mangled-name='clk_hw_get_rate' filepath='drivers/clk/clk.c' line='410' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_hw_get_rate'>
-        <parameter type-id='9e6d4b4e' name='hw' filepath='drivers/clk/clk.c' line='410' column='1'/>
+      <function-decl name='clk_hw_get_rate' mangled-name='clk_hw_get_rate' filepath='drivers/clk/clk.c' line='405' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_hw_get_rate'>
+        <parameter type-id='9e6d4b4e' name='hw' filepath='drivers/clk/clk.c' line='405' column='1'/>
         <return type-id='7359adad'/>
       </function-decl>
-      <function-decl name='clk_hw_get_flags' mangled-name='clk_hw_get_flags' filepath='drivers/clk/clk.c' line='430' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_hw_get_flags'>
-        <parameter type-id='9e6d4b4e' name='hw' filepath='drivers/clk/clk.c' line='430' column='1'/>
+      <function-decl name='clk_hw_get_flags' mangled-name='clk_hw_get_flags' filepath='drivers/clk/clk.c' line='425' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_hw_get_flags'>
+        <parameter type-id='9e6d4b4e' name='hw' filepath='drivers/clk/clk.c' line='425' column='1'/>
         <return type-id='7359adad'/>
       </function-decl>
-      <function-decl name='clk_hw_is_prepared' mangled-name='clk_hw_is_prepared' filepath='drivers/clk/clk.c' line='436' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_hw_is_prepared'>
-        <parameter type-id='9e6d4b4e' name='hw' filepath='drivers/clk/clk.c' line='436' column='1'/>
+      <function-decl name='clk_hw_is_prepared' mangled-name='clk_hw_is_prepared' filepath='drivers/clk/clk.c' line='431' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_hw_is_prepared'>
+        <parameter type-id='9e6d4b4e' name='hw' filepath='drivers/clk/clk.c' line='431' column='1'/>
         <return type-id='b50a4934'/>
       </function-decl>
-      <function-decl name='clk_hw_is_enabled' mangled-name='clk_hw_is_enabled' filepath='drivers/clk/clk.c' line='447' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_hw_is_enabled'>
-        <parameter type-id='9e6d4b4e' name='hw' filepath='drivers/clk/clk.c' line='447' column='1'/>
+      <function-decl name='clk_hw_is_enabled' mangled-name='clk_hw_is_enabled' filepath='drivers/clk/clk.c' line='442' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_hw_is_enabled'>
+        <parameter type-id='9e6d4b4e' name='hw' filepath='drivers/clk/clk.c' line='442' column='1'/>
         <return type-id='b50a4934'/>
       </function-decl>
-      <function-decl name='__clk_is_enabled' mangled-name='__clk_is_enabled' filepath='drivers/clk/clk.c' line='453' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__clk_is_enabled'>
-        <parameter type-id='7d0bc0eb' name='clk' filepath='drivers/clk/clk.c' line='453' column='1'/>
+      <function-decl name='__clk_is_enabled' mangled-name='__clk_is_enabled' filepath='drivers/clk/clk.c' line='448' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__clk_is_enabled'>
+        <parameter type-id='7d0bc0eb' name='clk' filepath='drivers/clk/clk.c' line='448' column='1'/>
         <return type-id='b50a4934'/>
       </function-decl>
-      <function-decl name='__clk_determine_rate' mangled-name='__clk_determine_rate' filepath='drivers/clk/clk.c' line='1517' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__clk_determine_rate'>
-        <parameter type-id='3aaeef89' name='hw' filepath='drivers/clk/clk.c' line='1517' column='1'/>
-        <parameter type-id='23a0ad0a' name='req' filepath='drivers/clk/clk.c' line='1517' column='1'/>
+      <function-decl name='__clk_determine_rate' mangled-name='__clk_determine_rate' filepath='drivers/clk/clk.c' line='1512' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__clk_determine_rate'>
+        <parameter type-id='3aaeef89' name='hw' filepath='drivers/clk/clk.c' line='1512' column='1'/>
+        <parameter type-id='23a0ad0a' name='req' filepath='drivers/clk/clk.c' line='1512' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='clk_aggregate_rate' mangled-name='clk_aggregate_rate' filepath='drivers/clk/clk.c' line='570' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_aggregate_rate'>
-        <parameter type-id='3aaeef89' name='hw' filepath='drivers/clk/clk.c' line='570' column='1'/>
-        <parameter type-id='2a72cecc' name='parent' filepath='drivers/clk/clk.c' line='571' column='1'/>
+      <function-decl name='clk_aggregate_rate' mangled-name='clk_aggregate_rate' filepath='drivers/clk/clk.c' line='565' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_aggregate_rate'>
+        <parameter type-id='3aaeef89' name='hw' filepath='drivers/clk/clk.c' line='565' column='1'/>
+        <parameter type-id='2a72cecc' name='parent' filepath='drivers/clk/clk.c' line='566' column='1'/>
         <return type-id='7359adad'/>
       </function-decl>
-      <function-decl name='__clk_mux_determine_rate_closest' mangled-name='__clk_mux_determine_rate_closest' filepath='drivers/clk/clk.c' line='598' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__clk_mux_determine_rate_closest'>
-        <parameter type-id='3aaeef89' name='hw' filepath='drivers/clk/clk.c' line='598' column='1'/>
-        <parameter type-id='23a0ad0a' name='req' filepath='drivers/clk/clk.c' line='599' column='1'/>
+      <function-decl name='__clk_mux_determine_rate_closest' mangled-name='__clk_mux_determine_rate_closest' filepath='drivers/clk/clk.c' line='593' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__clk_mux_determine_rate_closest'>
+        <parameter type-id='3aaeef89' name='hw' filepath='drivers/clk/clk.c' line='593' column='1'/>
+        <parameter type-id='23a0ad0a' name='req' filepath='drivers/clk/clk.c' line='594' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='clk_vote_vdd_level' mangled-name='clk_vote_vdd_level' filepath='drivers/clk/clk.c' line='700' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_vote_vdd_level'>
-        <parameter type-id='1652a0c5' name='vdd_class' filepath='drivers/clk/clk.c' line='700' column='1'/>
-        <parameter type-id='95e97e5e' name='level' filepath='drivers/clk/clk.c' line='700' column='1'/>
+      <function-decl name='clk_vote_vdd_level' mangled-name='clk_vote_vdd_level' filepath='drivers/clk/clk.c' line='695' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_vote_vdd_level'>
+        <parameter type-id='1652a0c5' name='vdd_class' filepath='drivers/clk/clk.c' line='695' column='1'/>
+        <parameter type-id='95e97e5e' name='level' filepath='drivers/clk/clk.c' line='695' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-decl name='regulator_set_voltage' mangled-name='regulator_set_voltage' filepath='include/linux/regulator/consumer.h' line='250' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_set_voltage'>
@@ -47705,47 +47766,47 @@
         <parameter type-id='95e97e5e'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='clk_unvote_vdd_level' mangled-name='clk_unvote_vdd_level' filepath='drivers/clk/clk.c' line='724' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_unvote_vdd_level'>
-        <parameter type-id='1652a0c5' name='vdd_class' filepath='drivers/clk/clk.c' line='724' column='1'/>
-        <parameter type-id='95e97e5e' name='level' filepath='drivers/clk/clk.c' line='724' column='1'/>
+      <function-decl name='clk_unvote_vdd_level' mangled-name='clk_unvote_vdd_level' filepath='drivers/clk/clk.c' line='719' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_unvote_vdd_level'>
+        <parameter type-id='1652a0c5' name='vdd_class' filepath='drivers/clk/clk.c' line='719' column='1'/>
+        <parameter type-id='95e97e5e' name='level' filepath='drivers/clk/clk.c' line='719' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='clk_vote_rate_vdd' mangled-name='clk_vote_rate_vdd' filepath='drivers/clk/clk.c' line='755' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_vote_rate_vdd'>
-        <parameter type-id='ba21e62b' name='core' filepath='drivers/clk/clk.c' line='755' column='1'/>
-        <parameter type-id='7359adad' name='rate' filepath='drivers/clk/clk.c' line='755' column='1'/>
+      <function-decl name='clk_vote_rate_vdd' mangled-name='clk_vote_rate_vdd' filepath='drivers/clk/clk.c' line='750' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_vote_rate_vdd'>
+        <parameter type-id='ba21e62b' name='core' filepath='drivers/clk/clk.c' line='750' column='1'/>
+        <parameter type-id='7359adad' name='rate' filepath='drivers/clk/clk.c' line='750' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='clk_unvote_rate_vdd' mangled-name='clk_unvote_rate_vdd' filepath='drivers/clk/clk.c' line='773' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_unvote_rate_vdd'>
-        <parameter type-id='ba21e62b' name='core' filepath='drivers/clk/clk.c' line='773' column='1'/>
-        <parameter type-id='7359adad' name='rate' filepath='drivers/clk/clk.c' line='773' column='1'/>
+      <function-decl name='clk_unvote_rate_vdd' mangled-name='clk_unvote_rate_vdd' filepath='drivers/clk/clk.c' line='768' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_unvote_rate_vdd'>
+        <parameter type-id='ba21e62b' name='core' filepath='drivers/clk/clk.c' line='768' column='1'/>
+        <parameter type-id='7359adad' name='rate' filepath='drivers/clk/clk.c' line='768' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='clk_sync_state' mangled-name='clk_sync_state' filepath='drivers/clk/clk.c' line='1413' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_sync_state'>
-        <parameter type-id='fa0b179b' name='dev' filepath='drivers/clk/clk.c' line='1413' column='1'/>
+      <function-decl name='clk_sync_state' mangled-name='clk_sync_state' filepath='drivers/clk/clk.c' line='1408' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_sync_state'>
+        <parameter type-id='fa0b179b' name='dev' filepath='drivers/clk/clk.c' line='1408' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='clk_hw_round_rate' mangled-name='clk_hw_round_rate' filepath='drivers/clk/clk.c' line='1528' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_hw_round_rate'>
-        <parameter type-id='3aaeef89' name='hw' filepath='drivers/clk/clk.c' line='1528' column='1'/>
-        <parameter type-id='7359adad' name='rate' filepath='drivers/clk/clk.c' line='1528' column='1'/>
+      <function-decl name='clk_hw_round_rate' mangled-name='clk_hw_round_rate' filepath='drivers/clk/clk.c' line='1523' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_hw_round_rate'>
+        <parameter type-id='3aaeef89' name='hw' filepath='drivers/clk/clk.c' line='1523' column='1'/>
+        <parameter type-id='7359adad' name='rate' filepath='drivers/clk/clk.c' line='1523' column='1'/>
         <return type-id='7359adad'/>
       </function-decl>
-      <function-decl name='clk_round_rate' mangled-name='clk_round_rate' filepath='drivers/clk/clk.c' line='1553' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_round_rate'>
-        <parameter type-id='7d0bc0eb' name='clk' filepath='drivers/clk/clk.c' line='1553' column='1'/>
-        <parameter type-id='7359adad' name='rate' filepath='drivers/clk/clk.c' line='1553' column='1'/>
+      <function-decl name='clk_round_rate' mangled-name='clk_round_rate' filepath='drivers/clk/clk.c' line='1548' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_round_rate'>
+        <parameter type-id='7d0bc0eb' name='clk' filepath='drivers/clk/clk.c' line='1548' column='1'/>
+        <parameter type-id='7359adad' name='rate' filepath='drivers/clk/clk.c' line='1548' column='1'/>
         <return type-id='bd54fe1a'/>
       </function-decl>
-      <function-decl name='clk_get_parent' mangled-name='clk_get_parent' filepath='drivers/clk/clk.c' line='2687' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_get_parent'>
-        <parameter type-id='7d0bc0eb' name='clk' filepath='drivers/clk/clk.c' line='2687' column='1'/>
+      <function-decl name='clk_get_parent' mangled-name='clk_get_parent' filepath='drivers/clk/clk.c' line='2682' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_get_parent'>
+        <parameter type-id='7d0bc0eb' name='clk' filepath='drivers/clk/clk.c' line='2682' column='1'/>
         <return type-id='7d0bc0eb'/>
       </function-decl>
-      <function-decl name='clk_set_parent' mangled-name='clk_set_parent' filepath='drivers/clk/clk.c' line='2841' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_set_parent'>
-        <parameter type-id='7d0bc0eb' name='clk' filepath='drivers/clk/clk.c' line='2841' column='1'/>
-        <parameter type-id='7d0bc0eb' name='parent' filepath='drivers/clk/clk.c' line='2841' column='1'/>
+      <function-decl name='clk_set_parent' mangled-name='clk_set_parent' filepath='drivers/clk/clk.c' line='2836' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_set_parent'>
+        <parameter type-id='7d0bc0eb' name='clk' filepath='drivers/clk/clk.c' line='2836' column='1'/>
+        <parameter type-id='7d0bc0eb' name='parent' filepath='drivers/clk/clk.c' line='2836' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='clk_set_flags' mangled-name='clk_set_flags' filepath='drivers/clk/clk.c' line='3160' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_set_flags'>
-        <parameter type-id='7d0bc0eb' name='clk' filepath='drivers/clk/clk.c' line='3160' column='1'/>
-        <parameter type-id='7359adad' name='flags' filepath='drivers/clk/clk.c' line='3160' column='1'/>
+      <function-decl name='clk_set_flags' mangled-name='clk_set_flags' filepath='drivers/clk/clk.c' line='3155' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='clk_set_flags'>
+        <parameter type-id='7d0bc0eb' name='clk' filepath='drivers/clk/clk.c' line='3155' column='1'/>
+        <parameter type-id='7359adad' name='flags' filepath='drivers/clk/clk.c' line='3155' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-decl name='of_clk_src_onecell_get' mangled-name='of_clk_src_onecell_get' filepath='drivers/clk/clk.c' line='4508' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_clk_src_onecell_get'>
@@ -50199,10 +50260,10 @@
       <pointer-type-def type-id='e4a6917b' size-in-bits='64' id='04d80927'/>
       <pointer-type-def type-id='e8681069' size-in-bits='64' id='2f9b8041'/>
       <pointer-type-def type-id='bf3013ec' size-in-bits='64' id='d1aa2b6e'/>
-      <function-decl name='of_dma_controller_register' mangled-name='of_dma_controller_register' filepath='drivers/dma/of-dma.c' line='104' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_dma_controller_register'>
-        <parameter type-id='9a537bbe' name='np' filepath='drivers/dma/of-dma.c' line='104' column='1'/>
-        <parameter type-id='04d80927' name='of_dma_xlate' filepath='drivers/dma/of-dma.c' line='105' column='1'/>
-        <parameter type-id='eaa32e2f' name='data' filepath='drivers/dma/of-dma.c' line='107' column='1'/>
+      <function-decl name='of_dma_controller_register' mangled-name='of_dma_controller_register' filepath='drivers/dma/of-dma.c' line='109' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_dma_controller_register'>
+        <parameter type-id='9a537bbe' name='np' filepath='drivers/dma/of-dma.c' line='109' column='1'/>
+        <parameter type-id='04d80927' name='of_dma_xlate' filepath='drivers/dma/of-dma.c' line='110' column='1'/>
+        <parameter type-id='eaa32e2f' name='data' filepath='drivers/dma/of-dma.c' line='112' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-type size-in-bits='64' id='e4a6917b'>
@@ -62544,17 +62605,6 @@
       <array-type-def dimensions='1' type-id='2a455b43' size-in-bits='7360' id='6fd035e6'>
         <subrange length='23' type-id='7ff19f0f' id='fdd0f594'/>
       </array-type-def>
-      <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='be592189'>
-        <data-member access='public'>
-          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide34' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-      </union-decl>
       <class-decl name='drm_lock_data' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/drm/drm_auth.h' line='37' column='1' id='7e19749d'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='hw_lock' type-id='19248fba' visibility='default' filepath='include/drm/drm_auth.h' line='38' column='1'/>
@@ -63230,10 +63280,10 @@
       </function-type>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/gpu/drm/drm_ioc32.c' language='LANG_C89'>
-      <function-decl name='drm_compat_ioctl' mangled-name='drm_compat_ioctl' filepath='drivers/gpu/drm/drm_ioc32.c' line='968' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_compat_ioctl'>
-        <parameter type-id='77e79a4b' name='filp' filepath='drivers/gpu/drm/drm_ioc32.c' line='968' column='1'/>
-        <parameter type-id='f0981eeb' name='cmd' filepath='drivers/gpu/drm/drm_ioc32.c' line='968' column='1'/>
-        <parameter type-id='7359adad' name='arg' filepath='drivers/gpu/drm/drm_ioc32.c' line='968' column='1'/>
+      <function-decl name='drm_compat_ioctl' mangled-name='drm_compat_ioctl' filepath='drivers/gpu/drm/drm_ioc32.c' line='966' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_compat_ioctl'>
+        <parameter type-id='77e79a4b' name='filp' filepath='drivers/gpu/drm/drm_ioc32.c' line='966' column='1'/>
+        <parameter type-id='f0981eeb' name='cmd' filepath='drivers/gpu/drm/drm_ioc32.c' line='966' column='1'/>
+        <parameter type-id='7359adad' name='arg' filepath='drivers/gpu/drm/drm_ioc32.c' line='966' column='1'/>
         <return type-id='bd54fe1a'/>
       </function-decl>
     </abi-instr>
@@ -66195,17 +66245,6 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/hid/hid-sony.c' language='LANG_C89'>
-      <union-decl name='power_supply_propval' size-in-bits='64' visibility='default' filepath='include/linux/power_supply.h' line='494' column='1' id='08942f16'>
-        <data-member access='public'>
-          <var-decl name='intval' type-id='95e97e5e' visibility='default' filepath='include/linux/power_supply.h' line='495' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='strval' type-id='80f4b756' visibility='default' filepath='include/linux/power_supply.h' line='496' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='int64val' type-id='9da381c4' visibility='default' filepath='include/linux/power_supply.h' line='497' column='1'/>
-        </data-member>
-      </union-decl>
       <class-decl name='power_supply' size-in-bits='10432' is-struct='yes' visibility='default' filepath='include/linux/power_supply.h' line='556' column='1' id='98749268'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='desc' type-id='cb9cd99f' visibility='default' filepath='include/linux/power_supply.h' line='557' column='1'/>
@@ -66600,6 +66639,17 @@
         <enumerator name='POWER_SUPPLY_PROP_SERIAL_NUMBER' value='226'/>
       </enum-decl>
       <typedef-decl name='int64_t' type-id='9b7c55ef' filepath='include/linux/types.h' line='114' column='1' id='9da381c4'/>
+      <union-decl name='power_supply_propval' size-in-bits='64' visibility='default' filepath='include/linux/power_supply.h' line='494' column='1' id='08942f16'>
+        <data-member access='public'>
+          <var-decl name='intval' type-id='95e97e5e' visibility='default' filepath='include/linux/power_supply.h' line='495' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='strval' type-id='80f4b756' visibility='default' filepath='include/linux/power_supply.h' line='496' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='int64val' type-id='9da381c4' visibility='default' filepath='include/linux/power_supply.h' line='497' column='1'/>
+        </data-member>
+      </union-decl>
       <class-decl name='power_supply_config' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/power_supply.h' line='504' column='1' id='098cab97'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='of_node' type-id='9a537bbe' visibility='default' filepath='include/linux/power_supply.h' line='505' column='1'/>
@@ -69774,7 +69824,7 @@
         <parameter type-id='c894953d'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='irq_set_irq_type' mangled-name='irq_set_irq_type' filepath='include/linux/irq.h' line='766' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_set_irq_type'>
+      <function-decl name='irq_set_irq_type' mangled-name='irq_set_irq_type' filepath='include/linux/irq.h' line='768' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_set_irq_type'>
         <parameter type-id='f0981eeb'/>
         <parameter type-id='f0981eeb'/>
         <return type-id='95e97e5e'/>
@@ -71037,15 +71087,15 @@
       <pointer-type-def type-id='0181b08d' size-in-bits='64' id='7df445b9'/>
       <pointer-type-def type-id='7d41fdf4' size-in-bits='64' id='01d543be'/>
       <pointer-type-def type-id='9f1d7608' size-in-bits='64' id='d479d76a'/>
-      <function-decl name='irq_chip_mask_parent' mangled-name='irq_chip_mask_parent' filepath='include/linux/irq.h' line='643' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_mask_parent'>
+      <function-decl name='irq_chip_mask_parent' mangled-name='irq_chip_mask_parent' filepath='include/linux/irq.h' line='645' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_mask_parent'>
         <parameter type-id='1c475548'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='irq_chip_unmask_parent' mangled-name='irq_chip_unmask_parent' filepath='include/linux/irq.h' line='644' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_unmask_parent'>
+      <function-decl name='irq_chip_unmask_parent' mangled-name='irq_chip_unmask_parent' filepath='include/linux/irq.h' line='646' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_unmask_parent'>
         <parameter type-id='1c475548'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='pci_for_each_dma_alias' mangled-name='pci_for_each_dma_alias' filepath='include/linux/pci.h' line='2287' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_for_each_dma_alias'>
+      <function-decl name='pci_for_each_dma_alias' mangled-name='pci_for_each_dma_alias' filepath='include/linux/pci.h' line='2288' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_for_each_dma_alias'>
         <parameter type-id='85196e3f'/>
         <parameter type-id='ef9f46e3'/>
         <parameter type-id='eaa32e2f'/>
@@ -71527,27 +71577,27 @@
         <enumerator name='IRQCHIP_STATE_MASKED' value='2'/>
         <enumerator name='IRQCHIP_STATE_LINE_LEVEL' value='3'/>
       </enum-decl>
-      <class-decl name='irq_domain_chip_generic' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='1061' column='1' id='f100815b'>
+      <class-decl name='irq_domain_chip_generic' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='1063' column='1' id='f100815b'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='irqs_per_chip' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1062' column='1'/>
+          <var-decl name='irqs_per_chip' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1064' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='num_chips' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1063' column='1'/>
+          <var-decl name='num_chips' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1065' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='irq_flags_to_clear' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1064' column='1'/>
+          <var-decl name='irq_flags_to_clear' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1066' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='irq_flags_to_set' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1065' column='1'/>
+          <var-decl name='irq_flags_to_set' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1067' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='gc_flags' type-id='7a1ec3b1' visibility='default' filepath='include/linux/irq.h' line='1066' column='1'/>
+          <var-decl name='gc_flags' type-id='7a1ec3b1' visibility='default' filepath='include/linux/irq.h' line='1068' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='gc' type-id='a5527824' visibility='default' filepath='include/linux/irq.h' line='1067' column='1'/>
+          <var-decl name='gc' type-id='a5527824' visibility='default' filepath='include/linux/irq.h' line='1069' column='1'/>
         </data-member>
       </class-decl>
-      <enum-decl name='irq_gc_flags' filepath='include/linux/irq.h' line='1044' column='1' id='7a1ec3b1'>
+      <enum-decl name='irq_gc_flags' filepath='include/linux/irq.h' line='1046' column='1' id='7a1ec3b1'>
         <underlying-type type-id='9cac1fee'/>
         <enumerator name='IRQ_GC_INIT_MASK_CACHE' value='1'/>
         <enumerator name='IRQ_GC_INIT_NESTED_LOCK' value='2'/>
@@ -71555,109 +71605,109 @@
         <enumerator name='IRQ_GC_NO_MASK' value='8'/>
         <enumerator name='IRQ_GC_BE_IO' value='16'/>
       </enum-decl>
-      <class-decl name='irq_chip_generic' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='1011' column='1' id='bb06f572'>
+      <class-decl name='irq_chip_generic' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='1013' column='1' id='bb06f572'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='lock' type-id='f5c90b3f' visibility='default' filepath='include/linux/irq.h' line='1012' column='1'/>
+          <var-decl name='lock' type-id='f5c90b3f' visibility='default' filepath='include/linux/irq.h' line='1014' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='reg_base' type-id='eaa32e2f' visibility='default' filepath='include/linux/irq.h' line='1013' column='1'/>
+          <var-decl name='reg_base' type-id='eaa32e2f' visibility='default' filepath='include/linux/irq.h' line='1015' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='reg_readl' type-id='99577235' visibility='default' filepath='include/linux/irq.h' line='1014' column='1'/>
+          <var-decl name='reg_readl' type-id='99577235' visibility='default' filepath='include/linux/irq.h' line='1016' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='reg_writel' type-id='f34cc61f' visibility='default' filepath='include/linux/irq.h' line='1015' column='1'/>
+          <var-decl name='reg_writel' type-id='f34cc61f' visibility='default' filepath='include/linux/irq.h' line='1017' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='suspend' type-id='bf17d761' visibility='default' filepath='include/linux/irq.h' line='1016' column='1'/>
+          <var-decl name='suspend' type-id='bf17d761' visibility='default' filepath='include/linux/irq.h' line='1018' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='resume' type-id='bf17d761' visibility='default' filepath='include/linux/irq.h' line='1017' column='1'/>
+          <var-decl name='resume' type-id='bf17d761' visibility='default' filepath='include/linux/irq.h' line='1019' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='irq_base' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1018' column='1'/>
+          <var-decl name='irq_base' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1020' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='416'>
-          <var-decl name='irq_cnt' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1019' column='1'/>
+          <var-decl name='irq_cnt' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1021' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='mask_cache' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='1020' column='1'/>
+          <var-decl name='mask_cache' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='1022' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='480'>
-          <var-decl name='type_cache' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='1021' column='1'/>
+          <var-decl name='type_cache' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='1023' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='polarity_cache' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='1022' column='1'/>
+          <var-decl name='polarity_cache' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='1024' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='544'>
-          <var-decl name='wake_enabled' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='1023' column='1'/>
+          <var-decl name='wake_enabled' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='1025' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='wake_active' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='1024' column='1'/>
+          <var-decl name='wake_active' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='1026' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='608'>
-          <var-decl name='num_ct' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1025' column='1'/>
+          <var-decl name='num_ct' type-id='f0981eeb' visibility='default' filepath='include/linux/irq.h' line='1027' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='640'>
-          <var-decl name='private' type-id='eaa32e2f' visibility='default' filepath='include/linux/irq.h' line='1026' column='1'/>
+          <var-decl name='private' type-id='eaa32e2f' visibility='default' filepath='include/linux/irq.h' line='1028' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='installed' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='1027' column='1'/>
+          <var-decl name='installed' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='1029' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='768'>
-          <var-decl name='unused' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='1028' column='1'/>
+          <var-decl name='unused' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='1030' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='domain' type-id='7544e824' visibility='default' filepath='include/linux/irq.h' line='1029' column='1'/>
+          <var-decl name='domain' type-id='7544e824' visibility='default' filepath='include/linux/irq.h' line='1031' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='896'>
-          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='include/linux/irq.h' line='1030' column='1'/>
+          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='include/linux/irq.h' line='1032' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='chip_types' type-id='7290550d' visibility='default' filepath='include/linux/irq.h' line='1031' column='1'/>
+          <var-decl name='chip_types' type-id='7290550d' visibility='default' filepath='include/linux/irq.h' line='1033' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='irq_chip_type' size-in-bits='2816' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='969' column='1' id='62778ae5'>
+      <class-decl name='irq_chip_type' size-in-bits='2816' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='971' column='1' id='62778ae5'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='chip' type-id='0f5f7920' visibility='default' filepath='include/linux/irq.h' line='970' column='1'/>
+          <var-decl name='chip' type-id='0f5f7920' visibility='default' filepath='include/linux/irq.h' line='972' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2176'>
-          <var-decl name='regs' type-id='6194fd9a' visibility='default' filepath='include/linux/irq.h' line='971' column='1'/>
+          <var-decl name='regs' type-id='6194fd9a' visibility='default' filepath='include/linux/irq.h' line='973' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2624'>
-          <var-decl name='handler' type-id='cdb741d3' visibility='default' filepath='include/linux/irq.h' line='972' column='1'/>
+          <var-decl name='handler' type-id='cdb741d3' visibility='default' filepath='include/linux/irq.h' line='974' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2688'>
-          <var-decl name='type' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='973' column='1'/>
+          <var-decl name='type' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='975' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2720'>
-          <var-decl name='mask_cache_priv' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='974' column='1'/>
+          <var-decl name='mask_cache_priv' type-id='19c2251e' visibility='default' filepath='include/linux/irq.h' line='976' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2752'>
-          <var-decl name='mask_cache' type-id='f9409001' visibility='default' filepath='include/linux/irq.h' line='975' column='1'/>
+          <var-decl name='mask_cache' type-id='f9409001' visibility='default' filepath='include/linux/irq.h' line='977' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='irq_chip_regs' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='946' column='1' id='6194fd9a'>
+      <class-decl name='irq_chip_regs' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/irq.h' line='948' column='1' id='6194fd9a'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='enable' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='947' column='1'/>
+          <var-decl name='enable' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='949' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='disable' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='948' column='1'/>
+          <var-decl name='disable' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='950' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='mask' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='949' column='1'/>
+          <var-decl name='mask' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='951' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='ack' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='950' column='1'/>
+          <var-decl name='ack' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='952' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='eoi' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='951' column='1'/>
+          <var-decl name='eoi' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='953' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='type' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='952' column='1'/>
+          <var-decl name='type' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='954' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='polarity' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='953' column='1'/>
+          <var-decl name='polarity' type-id='7359adad' visibility='default' filepath='include/linux/irq.h' line='955' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='irq_desc' size-in-bits='3584' is-struct='yes' visibility='default' filepath='include/linux/irqdesc.h' line='55' column='1' id='911b5feb'>
@@ -71962,7 +72012,7 @@
         <parameter type-id='95e97e5e'/>
         <return type-id='f0981eeb'/>
       </function-decl>
-      <function-decl name='irq_modify_status' mangled-name='irq_modify_status' filepath='include/linux/irq.h' line='715' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_modify_status'>
+      <function-decl name='irq_modify_status' mangled-name='irq_modify_status' filepath='include/linux/irq.h' line='717' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_modify_status'>
         <parameter type-id='f0981eeb'/>
         <parameter type-id='7359adad'/>
         <parameter type-id='7359adad'/>
@@ -72158,7 +72208,7 @@
         <parameter type-id='fa0b179b'/>
         <return type-id='db362995'/>
       </function-decl>
-      <function-decl name='irq_get_irq_data' mangled-name='irq_get_irq_data' filepath='include/linux/irq.h' line='770' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_get_irq_data'>
+      <function-decl name='irq_get_irq_data' mangled-name='irq_get_irq_data' filepath='include/linux/irq.h' line='772' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_get_irq_data'>
         <parameter type-id='f0981eeb'/>
         <return type-id='1c475548'/>
       </function-decl>
@@ -72188,7 +72238,7 @@
         <parameter type-id='eaa32e2f'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='irq_chip_set_type_parent' mangled-name='irq_chip_set_type_parent' filepath='include/linux/irq.h' line='652' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_set_type_parent'>
+      <function-decl name='irq_chip_set_type_parent' mangled-name='irq_chip_set_type_parent' filepath='include/linux/irq.h' line='654' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_set_type_parent'>
         <parameter type-id='1c475548'/>
         <parameter type-id='f0981eeb'/>
         <return type-id='95e97e5e'/>
@@ -79944,7 +79994,7 @@
         <parameter type-id='959ab461'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='ether_setup' mangled-name='ether_setup' filepath='include/linux/netdevice.h' line='4077' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ether_setup'>
+      <function-decl name='ether_setup' mangled-name='ether_setup' filepath='include/linux/netdevice.h' line='4081' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ether_setup'>
         <parameter type-id='68a2d05b'/>
         <return type-id='48b5725f'/>
       </function-decl>
@@ -79957,11 +80007,11 @@
         <parameter type-id='0fbf3cfd'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='netif_carrier_on' mangled-name='netif_carrier_on' filepath='include/linux/netdevice.h' line='3761' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_carrier_on'>
+      <function-decl name='netif_carrier_on' mangled-name='netif_carrier_on' filepath='include/linux/netdevice.h' line='3765' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_carrier_on'>
         <parameter type-id='68a2d05b'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='netif_carrier_off' mangled-name='netif_carrier_off' filepath='include/linux/netdevice.h' line='3763' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_carrier_off'>
+      <function-decl name='netif_carrier_off' mangled-name='netif_carrier_off' filepath='include/linux/netdevice.h' line='3767' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_carrier_off'>
         <parameter type-id='68a2d05b'/>
         <return type-id='48b5725f'/>
       </function-decl>
@@ -79971,7 +80021,7 @@
       <function-decl name='rtnl_unlock' mangled-name='rtnl_unlock' filepath='include/linux/rtnetlink.h' line='33' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rtnl_unlock'>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='alloc_netdev_mqs' mangled-name='alloc_netdev_mqs' filepath='include/linux/netdevice.h' line='4080' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='alloc_netdev_mqs'>
+      <function-decl name='alloc_netdev_mqs' mangled-name='alloc_netdev_mqs' filepath='include/linux/netdevice.h' line='4084' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='alloc_netdev_mqs'>
         <parameter type-id='95e97e5e'/>
         <parameter type-id='80f4b756'/>
         <parameter type-id='002ac4a6'/>
@@ -80134,17 +80184,6 @@
           <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/net/netns/generic.h' line='32' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__24' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='11e6121d'>
-        <data-member access='public'>
-          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide56' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-      </union-decl>
       <class-decl name='nf_conntrack' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/linux/skbuff.h' line='248' column='1' id='d9fc42c3'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='use' type-id='49178f86' visibility='default' filepath='include/linux/skbuff.h' line='249' column='1'/>
@@ -80424,7 +80463,7 @@
         <parameter type-id='68a2d05b'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='sk_filter_trim_cap' mangled-name='sk_filter_trim_cap' filepath='include/linux/filter.h' line='764' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sk_filter_trim_cap'>
+      <function-decl name='sk_filter_trim_cap' mangled-name='sk_filter_trim_cap' filepath='include/linux/filter.h' line='803' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sk_filter_trim_cap'>
         <parameter type-id='f772df6d'/>
         <parameter type-id='0fbf3cfd'/>
         <parameter type-id='f0981eeb'/>
@@ -80448,23 +80487,23 @@
         <parameter type-id='7359adad'/>
         <return type-id='c894953d'/>
       </function-decl>
-      <function-decl name='register_netdev' mangled-name='register_netdev' filepath='include/linux/netdevice.h' line='4094' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='register_netdev'>
+      <function-decl name='register_netdev' mangled-name='register_netdev' filepath='include/linux/netdevice.h' line='4098' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='register_netdev'>
         <parameter type-id='68a2d05b'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='netdev_err' mangled-name='netdev_err' filepath='include/linux/netdevice.h' line='4693' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_err'>
+      <function-decl name='netdev_err' mangled-name='netdev_err' filepath='include/linux/netdevice.h' line='4697' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_err'>
         <parameter type-id='2ce52478'/>
         <parameter type-id='80f4b756'/>
         <parameter is-variadic='yes'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='netdev_info' mangled-name='netdev_info' filepath='include/linux/netdevice.h' line='4699' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_info'>
+      <function-decl name='netdev_info' mangled-name='netdev_info' filepath='include/linux/netdevice.h' line='4703' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_info'>
         <parameter type-id='2ce52478'/>
         <parameter type-id='80f4b756'/>
         <parameter is-variadic='yes'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='unregister_netdev' mangled-name='unregister_netdev' filepath='include/linux/netdevice.h' line='4095' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='unregister_netdev'>
+      <function-decl name='unregister_netdev' mangled-name='unregister_netdev' filepath='include/linux/netdevice.h' line='4099' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='unregister_netdev'>
         <parameter type-id='68a2d05b'/>
         <return type-id='48b5725f'/>
       </function-decl>
@@ -80472,7 +80511,7 @@
         <parameter type-id='1a7ee447'/>
         <return type-id='c894953d'/>
       </function-decl>
-      <function-decl name='netif_device_detach' mangled-name='netif_device_detach' filepath='include/linux/netdevice.h' line='3830' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_device_detach'>
+      <function-decl name='netif_device_detach' mangled-name='netif_device_detach' filepath='include/linux/netdevice.h' line='3834' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_device_detach'>
         <parameter type-id='68a2d05b'/>
         <return type-id='48b5725f'/>
       </function-decl>
@@ -80480,7 +80519,7 @@
         <parameter type-id='83c1bde6'/>
         <return type-id='f0981eeb'/>
       </function-decl>
-      <function-decl name='netif_device_attach' mangled-name='netif_device_attach' filepath='include/linux/netdevice.h' line='3832' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_device_attach'>
+      <function-decl name='netif_device_attach' mangled-name='netif_device_attach' filepath='include/linux/netdevice.h' line='3836' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_device_attach'>
         <parameter type-id='68a2d05b'/>
         <return type-id='48b5725f'/>
       </function-decl>
@@ -80491,7 +80530,7 @@
       <function-decl name='net_ratelimit' mangled-name='net_ratelimit' filepath='include/linux/net.h' line='252' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='net_ratelimit'>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='netdev_warn' mangled-name='netdev_warn' filepath='include/linux/netdevice.h' line='4695' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_warn'>
+      <function-decl name='netdev_warn' mangled-name='netdev_warn' filepath='include/linux/netdevice.h' line='4699' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_warn'>
         <parameter type-id='2ce52478'/>
         <parameter type-id='80f4b756'/>
         <parameter is-variadic='yes'/>
@@ -80604,12 +80643,12 @@
           <var-decl name='log' type-id='f0981eeb' visibility='default' filepath='include/net/udp.h' line='79' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='uncached_list' size-in-bits='192' is-struct='yes' visibility='default' filepath='net/ipv4/route.c' line='1504' column='1' id='6b1203e5'>
+      <class-decl name='uncached_list' size-in-bits='192' is-struct='yes' visibility='default' filepath='net/ipv4/route.c' line='1518' column='1' id='6b1203e5'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='net/ipv4/route.c' line='1505' column='1'/>
+          <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='net/ipv4/route.c' line='1519' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='head' type-id='72f469ec' visibility='default' filepath='net/ipv4/route.c' line='1506' column='1'/>
+          <var-decl name='head' type-id='72f469ec' visibility='default' filepath='net/ipv4/route.c' line='1520' column='1'/>
         </data-member>
       </class-decl>
       <array-type-def dimensions='1' type-id='4e812b7a' size-in-bits='16384' id='bb890663'>
@@ -82134,15 +82173,15 @@
           <var-decl name='tail' type-id='0fbf3cfd' visibility='default' filepath='include/net/sock.h' line='385' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='sk_filter' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/filter.h' line='508' column='1' id='dbc9a936'>
+      <class-decl name='sk_filter' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/filter.h' line='547' column='1' id='dbc9a936'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='refcnt' type-id='64615833' visibility='default' filepath='include/linux/filter.h' line='509' column='1'/>
+          <var-decl name='refcnt' type-id='64615833' visibility='default' filepath='include/linux/filter.h' line='548' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/linux/filter.h' line='510' column='1'/>
+          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/linux/filter.h' line='549' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='prog' type-id='bdcee7ae' visibility='default' filepath='include/linux/filter.h' line='511' column='1'/>
+          <var-decl name='prog' type-id='bdcee7ae' visibility='default' filepath='include/linux/filter.h' line='550' column='1'/>
         </data-member>
       </class-decl>
       <enum-decl name='bpf_prog_type' filepath='include/uapi/linux/bpf.h' line='132' column='1' id='b80df76a'>
@@ -82747,12 +82786,12 @@
           <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/linux/bpf.h' line='300' column='1'/>
         </data-member>
       </union-decl>
-      <class-decl name='sock_fprog_kern' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/filter.h' line='464' column='1' id='f29d9605'>
+      <class-decl name='sock_fprog_kern' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/filter.h' line='503' column='1' id='f29d9605'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='len' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='465' column='1'/>
+          <var-decl name='len' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='504' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='filter' type-id='e1ea11f6' visibility='default' filepath='include/linux/filter.h' line='466' column='1'/>
+          <var-decl name='filter' type-id='e1ea11f6' visibility='default' filepath='include/linux/filter.h' line='505' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='sock_filter' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/filter.h' line='24' column='1' id='f588f6e0'>
@@ -82769,12 +82808,12 @@
           <var-decl name='k' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/filter.h' line='28' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__25' is-anonymous='yes' visibility='default' filepath='include/linux/filter.h' line='502' column='1' id='fe772793'>
+      <union-decl name='__anonymous_union__25' is-anonymous='yes' visibility='default' filepath='include/linux/filter.h' line='541' column='1' id='fe772793'>
         <data-member access='public'>
-          <var-decl name='insns' type-id='4967766c' visibility='default' filepath='include/linux/filter.h' line='503' column='1'/>
+          <var-decl name='insns' type-id='4967766c' visibility='default' filepath='include/linux/filter.h' line='542' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='insnsi' type-id='b50399da' visibility='default' filepath='include/linux/filter.h' line='504' column='1'/>
+          <var-decl name='insnsi' type-id='b50399da' visibility='default' filepath='include/linux/filter.h' line='543' column='1'/>
         </data-member>
       </union-decl>
       <union-decl name='__anonymous_union__26' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='398' column='1' id='a29f8367'>
@@ -84445,10 +84484,10 @@
         <parameter type-id='0fbf3cfd'/>
         <return type-id='3facc5aa'/>
       </function-decl>
-      <function-decl name='xdp_do_flush_map' mangled-name='xdp_do_flush_map' filepath='include/linux/filter.h' line='875' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xdp_do_flush_map'>
+      <function-decl name='xdp_do_flush_map' mangled-name='xdp_do_flush_map' filepath='include/linux/filter.h' line='914' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xdp_do_flush_map'>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='arch_bpf_jit_check_func' mangled-name='arch_bpf_jit_check_func' filepath='include/linux/filter.h' line='521' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='arch_bpf_jit_check_func'>
+      <function-decl name='arch_bpf_jit_check_func' mangled-name='arch_bpf_jit_check_func' filepath='include/linux/filter.h' line='560' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='arch_bpf_jit_check_func'>
         <parameter type-id='18145275'/>
         <return type-id='c894953d'/>
       </function-decl>
@@ -84467,13 +84506,13 @@
         <parameter type-id='68a2d05b'/>
         <return type-id='8efea9e5'/>
       </function-decl>
-      <function-decl name='xdp_do_redirect' mangled-name='xdp_do_redirect' filepath='include/linux/filter.h' line='872' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xdp_do_redirect'>
+      <function-decl name='xdp_do_redirect' mangled-name='xdp_do_redirect' filepath='include/linux/filter.h' line='911' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xdp_do_redirect'>
         <parameter type-id='68a2d05b'/>
         <parameter type-id='38ed603d'/>
         <parameter type-id='bdcee7ae'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='bpf_warn_invalid_xdp_action' mangled-name='bpf_warn_invalid_xdp_action' filepath='include/linux/filter.h' line='877' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bpf_warn_invalid_xdp_action'>
+      <function-decl name='bpf_warn_invalid_xdp_action' mangled-name='bpf_warn_invalid_xdp_action' filepath='include/linux/filter.h' line='916' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bpf_warn_invalid_xdp_action'>
         <parameter type-id='f0981eeb'/>
         <return type-id='48b5725f'/>
       </function-decl>
@@ -85559,15 +85598,6 @@
       </function-type>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/nvdimm/pmem.c' language='LANG_C89'>
-      <array-type-def dimensions='1' type-id='28ee064c' size-in-bits='320' id='39e531ac'>
-        <subrange length='5' type-id='7ff19f0f' id='53010e10'/>
-      </array-type-def>
-      <array-type-def dimensions='1' type-id='0f8f80b0' size-in-bits='320' id='39e1fe03'>
-        <subrange length='5' type-id='7ff19f0f' id='53010e10'/>
-      </array-type-def>
-      <array-type-def dimensions='1' type-id='3213e875' size-in-bits='320' id='f5665670'>
-        <subrange length='5' type-id='7ff19f0f' id='53010e10'/>
-      </array-type-def>
       <array-type-def dimensions='1' type-id='162c1c01' size-in-bits='256' id='68694f49'>
         <subrange length='4' type-id='7ff19f0f' id='16fe7105'/>
       </array-type-def>
@@ -85597,9 +85627,6 @@
           <var-decl name='page_list' type-id='72f469ec' visibility='default' filepath='block/blk-mq-tag.h' line='21' column='1'/>
         </data-member>
       </class-decl>
-      <array-type-def dimensions='1' type-id='b92c8d0d' size-in-bits='1600' id='68a92070'>
-        <subrange length='5' type-id='7ff19f0f' id='53010e10'/>
-      </array-type-def>
       <array-type-def dimensions='1' type-id='8dee6d89' size-in-bits='192' id='2f7565c6'>
         <subrange length='3' type-id='7ff19f0f' id='56f209d2'/>
       </array-type-def>
@@ -85615,59 +85642,6 @@
       <array-type-def dimensions='1' type-id='7359adad' size-in-bits='448' id='346bc576'>
         <subrange length='7' type-id='7ff19f0f' id='16fc326e'/>
       </array-type-def>
-      <class-decl name='blkcg' size-in-bits='3136' is-struct='yes' visibility='default' filepath='include/linux/blk-cgroup.h' line='46' column='1' id='19b26952'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='css' type-id='7f3df443' visibility='default' filepath='include/linux/blk-cgroup.h' line='47' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='2176'>
-          <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='include/linux/blk-cgroup.h' line='48' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='2240'>
-          <var-decl name='blkg_tree' type-id='1c8dedcf' visibility='default' filepath='include/linux/blk-cgroup.h' line='50' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='2368'>
-          <var-decl name='blkg_hint' type-id='1146dea3' visibility='default' filepath='include/linux/blk-cgroup.h' line='51' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='2432'>
-          <var-decl name='blkg_list' type-id='e151255a' visibility='default' filepath='include/linux/blk-cgroup.h' line='52' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='2496'>
-          <var-decl name='cpd' type-id='39e1fe03' visibility='default' filepath='include/linux/blk-cgroup.h' line='54' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='2816'>
-          <var-decl name='all_blkcgs_node' type-id='72f469ec' visibility='default' filepath='include/linux/blk-cgroup.h' line='56' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='2944'>
-          <var-decl name='cgwb_list' type-id='72f469ec' visibility='default' filepath='include/linux/blk-cgroup.h' line='58' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='3072'>
-          <var-decl name='cgwb_refcnt' type-id='64615833' visibility='default' filepath='include/linux/blk-cgroup.h' line='59' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='blkcg_policy_data' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/blk-cgroup.h' line='102' column='1' id='11fd1392'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='blkcg' type-id='11bff950' visibility='default' filepath='include/linux/blk-cgroup.h' line='104' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='plid' type-id='95e97e5e' visibility='default' filepath='include/linux/blk-cgroup.h' line='105' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='blkg_rwstat' size-in-bits='1920' is-struct='yes' visibility='default' filepath='include/linux/blk-cgroup.h' line='73' column='1' id='247d0323'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='cpu_cnt' type-id='68a92070' visibility='default' filepath='include/linux/blk-cgroup.h' line='74' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='1600'>
-          <var-decl name='aux_cnt' type-id='39e531ac' visibility='default' filepath='include/linux/blk-cgroup.h' line='75' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='blkg_policy_data' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/blk-cgroup.h' line='89' column='1' id='55eaf925'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='blkg' type-id='1146dea3' visibility='default' filepath='include/linux/blk-cgroup.h' line='91' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='plid' type-id='95e97e5e' visibility='default' filepath='include/linux/blk-cgroup.h' line='92' column='1'/>
-        </data-member>
-      </class-decl>
       <typedef-decl name='queue_rq_fn' type-id='32672900' filepath='include/linux/blk-mq.h' line='100' column='1' id='aa8737f6'/>
       <class-decl name='__anonymous_struct__' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/blk-mq.h' line='16' column='1' id='87322991'>
         <data-member access='public' layout-offset-in-bits='0'>
@@ -85855,9 +85829,6 @@
       <pointer-type-def type-id='9a335021' size-in-bits='64' id='c9c70151'/>
       <pointer-type-def type-id='8efd3865' size-in-bits='64' id='0461ecf5'/>
       <pointer-type-def type-id='0461ecf5' size-in-bits='64' id='c527e30d'/>
-      <pointer-type-def type-id='19b26952' size-in-bits='64' id='11bff950'/>
-      <pointer-type-def type-id='11fd1392' size-in-bits='64' id='0f8f80b0'/>
-      <pointer-type-def type-id='55eaf925' size-in-bits='64' id='3213e875'/>
       <pointer-type-def type-id='69c138b1' size-in-bits='64' id='162c1c01'/>
       <pointer-type-def type-id='3577ed21' size-in-bits='64' id='ac8cd584'/>
       <qualified-type-def type-id='03a1b8ac' const='yes' id='a2b0f227'/>
@@ -86494,10 +86465,10 @@
       </function-type>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/opp/of.c' language='LANG_C89'>
-      <function-decl name='of_dev_pm_opp_get_cpu_power' mangled-name='of_dev_pm_opp_get_cpu_power' filepath='drivers/opp/of.c' line='810' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_dev_pm_opp_get_cpu_power'>
-        <parameter type-id='1d2c2b85' name='mW' filepath='drivers/opp/of.c' line='810' column='1'/>
-        <parameter type-id='1d2c2b85' name='KHz' filepath='drivers/opp/of.c' line='810' column='1'/>
-        <parameter type-id='95e97e5e' name='cpu' filepath='drivers/opp/of.c' line='810' column='1'/>
+      <function-decl name='of_dev_pm_opp_get_cpu_power' mangled-name='of_dev_pm_opp_get_cpu_power' filepath='drivers/opp/of.c' line='811' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_dev_pm_opp_get_cpu_power'>
+        <parameter type-id='1d2c2b85' name='mW' filepath='drivers/opp/of.c' line='811' column='1'/>
+        <parameter type-id='1d2c2b85' name='KHz' filepath='drivers/opp/of.c' line='811' column='1'/>
+        <parameter type-id='95e97e5e' name='cpu' filepath='drivers/opp/of.c' line='811' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
     </abi-instr>
@@ -86816,16 +86787,16 @@
     <abi-instr address-size='64' path='drivers/pci/msi.c' language='LANG_C89'>
       <qualified-type-def type-id='bf33c00a' const='yes' id='6039fe57'/>
       <pointer-type-def type-id='6039fe57' size-in-bits='64' id='f84b9ec7'/>
-      <function-decl name='pci_alloc_irq_vectors_affinity' mangled-name='pci_alloc_irq_vectors_affinity' filepath='drivers/pci/msi.c' line='1153' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_alloc_irq_vectors_affinity'>
-        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/msi.c' line='1153' column='1'/>
-        <parameter type-id='f0981eeb' name='min_vecs' filepath='drivers/pci/msi.c' line='1153' column='1'/>
-        <parameter type-id='f0981eeb' name='max_vecs' filepath='drivers/pci/msi.c' line='1154' column='1'/>
-        <parameter type-id='f0981eeb' name='flags' filepath='drivers/pci/msi.c' line='1154' column='1'/>
-        <parameter type-id='f84b9ec7' name='affd' filepath='drivers/pci/msi.c' line='1155' column='1'/>
+      <function-decl name='pci_alloc_irq_vectors_affinity' mangled-name='pci_alloc_irq_vectors_affinity' filepath='drivers/pci/msi.c' line='1191' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_alloc_irq_vectors_affinity'>
+        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/msi.c' line='1191' column='1'/>
+        <parameter type-id='f0981eeb' name='min_vecs' filepath='drivers/pci/msi.c' line='1191' column='1'/>
+        <parameter type-id='f0981eeb' name='max_vecs' filepath='drivers/pci/msi.c' line='1192' column='1'/>
+        <parameter type-id='f0981eeb' name='flags' filepath='drivers/pci/msi.c' line='1192' column='1'/>
+        <parameter type-id='f84b9ec7' name='affd' filepath='drivers/pci/msi.c' line='1193' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='pci_free_irq_vectors' mangled-name='pci_free_irq_vectors' filepath='drivers/pci/msi.c' line='1203' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_free_irq_vectors'>
-        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/msi.c' line='1203' column='1'/>
+      <function-decl name='pci_free_irq_vectors' mangled-name='pci_free_irq_vectors' filepath='drivers/pci/msi.c' line='1241' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_free_irq_vectors'>
+        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/msi.c' line='1241' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
     </abi-instr>
@@ -86876,8 +86847,8 @@
       </function-type>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/pci/pci.c' language='LANG_C89'>
-      <function-decl name='pci_disable_device' mangled-name='pci_disable_device' filepath='drivers/pci/pci.c' line='1852' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_disable_device'>
-        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='1852' column='1'/>
+      <function-decl name='pci_disable_device' mangled-name='pci_disable_device' filepath='drivers/pci/pci.c' line='1848' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_disable_device'>
+        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='1848' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
       <function-decl name='pci_find_next_capability' mangled-name='pci_find_next_capability' filepath='drivers/pci/pci.c' line='393' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_find_next_capability'>
@@ -86886,12 +86857,16 @@
         <parameter type-id='95e97e5e' name='cap' filepath='drivers/pci/pci.c' line='393' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='pci_enable_device' mangled-name='pci_enable_device' filepath='drivers/pci/pci.c' line='1660' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_enable_device'>
-        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='1660' column='1'/>
+      <function-decl name='pci_device_is_present' mangled-name='pci_device_is_present' filepath='drivers/pci/pci.c' line='5803' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_device_is_present'>
+        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='5803' column='1'/>
+        <return type-id='b50a4934'/>
+      </function-decl>
+      <function-decl name='pci_enable_device' mangled-name='pci_enable_device' filepath='drivers/pci/pci.c' line='1656' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_enable_device'>
+        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='1656' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='pcim_enable_device' mangled-name='pcim_enable_device' filepath='drivers/pci/pci.c' line='1733' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pcim_enable_device'>
-        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='1733' column='1'/>
+      <function-decl name='pcim_enable_device' mangled-name='pcim_enable_device' filepath='drivers/pci/pci.c' line='1729' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pcim_enable_device'>
+        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='1729' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-decl name='pm_runtime_barrier' mangled-name='pm_runtime_barrier' filepath='include/linux/pm_runtime.h' line='45' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_runtime_barrier'>
@@ -86903,36 +86878,36 @@
         <parameter type-id='c894953d'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='pci_request_acs' mangled-name='pci_request_acs' filepath='drivers/pci/pci.c' line='3060' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_acs'>
+      <function-decl name='pci_request_acs' mangled-name='pci_request_acs' filepath='drivers/pci/pci.c' line='3067' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_acs'>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='pci_request_region' mangled-name='pci_request_region' filepath='drivers/pci/pci.c' line='3648' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_region'>
-        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3648' column='1'/>
-        <parameter type-id='95e97e5e' name='bar' filepath='drivers/pci/pci.c' line='3648' column='1'/>
-        <parameter type-id='80f4b756' name='res_name' filepath='drivers/pci/pci.c' line='3648' column='1'/>
+      <function-decl name='pci_request_region' mangled-name='pci_request_region' filepath='drivers/pci/pci.c' line='3655' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_region'>
+        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3655' column='1'/>
+        <parameter type-id='95e97e5e' name='bar' filepath='drivers/pci/pci.c' line='3655' column='1'/>
+        <parameter type-id='80f4b756' name='res_name' filepath='drivers/pci/pci.c' line='3655' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='pci_request_selected_regions' mangled-name='pci_request_selected_regions' filepath='drivers/pci/pci.c' line='3723' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_selected_regions'>
-        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3723' column='1'/>
-        <parameter type-id='95e97e5e' name='bars' filepath='drivers/pci/pci.c' line='3723' column='1'/>
-        <parameter type-id='80f4b756' name='res_name' filepath='drivers/pci/pci.c' line='3724' column='1'/>
+      <function-decl name='pci_request_selected_regions' mangled-name='pci_request_selected_regions' filepath='drivers/pci/pci.c' line='3730' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_selected_regions'>
+        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3730' column='1'/>
+        <parameter type-id='95e97e5e' name='bars' filepath='drivers/pci/pci.c' line='3730' column='1'/>
+        <parameter type-id='80f4b756' name='res_name' filepath='drivers/pci/pci.c' line='3731' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='pci_release_regions' mangled-name='pci_release_regions' filepath='drivers/pci/pci.c' line='3747' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_release_regions'>
-        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3747' column='1'/>
+      <function-decl name='pci_release_regions' mangled-name='pci_release_regions' filepath='drivers/pci/pci.c' line='3754' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_release_regions'>
+        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3754' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='pci_request_regions' mangled-name='pci_request_regions' filepath='drivers/pci/pci.c' line='3766' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_regions'>
-        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3766' column='1'/>
-        <parameter type-id='80f4b756' name='res_name' filepath='drivers/pci/pci.c' line='3766' column='1'/>
+      <function-decl name='pci_request_regions' mangled-name='pci_request_regions' filepath='drivers/pci/pci.c' line='3773' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_regions'>
+        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3773' column='1'/>
+        <parameter type-id='80f4b756' name='res_name' filepath='drivers/pci/pci.c' line='3773' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='pci_set_master' mangled-name='pci_set_master' filepath='drivers/pci/pci.c' line='4089' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_set_master'>
-        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='4089' column='1'/>
+      <function-decl name='pci_set_master' mangled-name='pci_set_master' filepath='drivers/pci/pci.c' line='4096' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_set_master'>
+        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='4096' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='pci_clear_master' mangled-name='pci_clear_master' filepath='drivers/pci/pci.c' line='4100' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_clear_master'>
-        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='4100' column='1'/>
+      <function-decl name='pci_clear_master' mangled-name='pci_clear_master' filepath='drivers/pci/pci.c' line='4107' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_clear_master'>
+        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='4107' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
     </abi-instr>
@@ -87550,7 +87525,7 @@
         <enumerator name='PIN_MAP_TYPE_CONFIGS_PIN' value='3'/>
         <enumerator name='PIN_MAP_TYPE_CONFIGS_GROUP' value='4'/>
       </enum-decl>
-      <union-decl name='__anonymous_union__' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/pinctrl/machine.h' line='73' column='1' id='2789d524'>
+      <union-decl name='__anonymous_union__1' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/pinctrl/machine.h' line='73' column='1' id='2789d524'>
         <data-member access='public'>
           <var-decl name='mux' type-id='ad4dd73d' visibility='default' filepath='include/linux/pinctrl/machine.h' line='74' column='1'/>
         </data-member>
@@ -88036,7 +88011,7 @@
         <parameter type-id='f0981eeb'/>
         <return type-id='26a90f95'/>
       </function-decl>
-      <function-decl name='irq_set_chained_handler_and_data' mangled-name='irq_set_chained_handler_and_data' filepath='include/linux/irq.h' line='712' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_set_chained_handler_and_data'>
+      <function-decl name='irq_set_chained_handler_and_data' mangled-name='irq_set_chained_handler_and_data' filepath='include/linux/irq.h' line='714' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_set_chained_handler_and_data'>
         <parameter type-id='f0981eeb'/>
         <parameter type-id='8937f3c2'/>
         <parameter type-id='eaa32e2f'/>
@@ -88056,12 +88031,12 @@
         <parameter type-id='eaa32e2f'/>
         <return type-id='eaa32e2f'/>
       </function-decl>
-      <function-decl name='irq_set_chip_data' mangled-name='irq_set_chip_data' filepath='include/linux/irq.h' line='765' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_set_chip_data'>
+      <function-decl name='irq_set_chip_data' mangled-name='irq_set_chip_data' filepath='include/linux/irq.h' line='767' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_set_chip_data'>
         <parameter type-id='f0981eeb'/>
         <parameter type-id='eaa32e2f'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='irq_set_chip_and_handler_name' mangled-name='irq_set_chip_and_handler_name' filepath='include/linux/irq.h' line='670' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_set_chip_and_handler_name'>
+      <function-decl name='irq_set_chip_and_handler_name' mangled-name='irq_set_chip_and_handler_name' filepath='include/linux/irq.h' line='672' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_set_chip_and_handler_name'>
         <parameter type-id='f0981eeb'/>
         <parameter type-id='8846a616'/>
         <parameter type-id='8937f3c2'/>
@@ -88550,17 +88525,6 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/regulator/devres.c' language='LANG_C89'>
-      <union-decl name='__anonymous_union__3' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='274d194c'>
-        <data-member access='public'>
-          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide55' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-      </union-decl>
       <function-decl name='devm_regulator_get' mangled-name='devm_regulator_get' filepath='drivers/regulator/devres.c' line='56' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='devm_regulator_get'>
         <parameter type-id='fa0b179b' name='dev' filepath='drivers/regulator/devres.c' line='56' column='1'/>
         <parameter type-id='80f4b756' name='id' filepath='drivers/regulator/devres.c' line='56' column='1'/>
@@ -89149,17 +89113,6 @@
           <var-decl name='head' type-id='d504f73d' visibility='default' filepath='include/linux/notifier.h' line='67' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__4' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='ef04635c'>
-        <data-member access='public'>
-          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide68' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-      </union-decl>
       <enum-decl name='regulator_type' filepath='include/linux/regulator/driver.h' line='232' column='1' id='b9a524a4'>
         <underlying-type type-id='9cac1fee'/>
         <enumerator name='REGULATOR_VOLTAGE' value='0'/>
@@ -91369,16 +91322,16 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/scsi/scsi_scan.c' language='LANG_C89'>
-      <function-decl name='__scsi_add_device' mangled-name='__scsi_add_device' filepath='drivers/scsi/scsi_scan.c' line='1467' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__scsi_add_device'>
-        <parameter type-id='a970a64c' name='shost' filepath='drivers/scsi/scsi_scan.c' line='1467' column='1'/>
-        <parameter type-id='6e160b14' name='channel' filepath='drivers/scsi/scsi_scan.c' line='1467' column='1'/>
-        <parameter type-id='6e160b14' name='id' filepath='drivers/scsi/scsi_scan.c' line='1468' column='1'/>
-        <parameter type-id='91ce1af9' name='lun' filepath='drivers/scsi/scsi_scan.c' line='1468' column='1'/>
-        <parameter type-id='eaa32e2f' name='hostdata' filepath='drivers/scsi/scsi_scan.c' line='1468' column='1'/>
+      <function-decl name='__scsi_add_device' mangled-name='__scsi_add_device' filepath='drivers/scsi/scsi_scan.c' line='1468' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__scsi_add_device'>
+        <parameter type-id='a970a64c' name='shost' filepath='drivers/scsi/scsi_scan.c' line='1468' column='1'/>
+        <parameter type-id='6e160b14' name='channel' filepath='drivers/scsi/scsi_scan.c' line='1468' column='1'/>
+        <parameter type-id='6e160b14' name='id' filepath='drivers/scsi/scsi_scan.c' line='1469' column='1'/>
+        <parameter type-id='91ce1af9' name='lun' filepath='drivers/scsi/scsi_scan.c' line='1469' column='1'/>
+        <parameter type-id='eaa32e2f' name='hostdata' filepath='drivers/scsi/scsi_scan.c' line='1469' column='1'/>
         <return type-id='eb572b74'/>
       </function-decl>
-      <function-decl name='scsi_scan_host' mangled-name='scsi_scan_host' filepath='drivers/scsi/scsi_scan.c' line='1843' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='scsi_scan_host'>
-        <parameter type-id='a970a64c' name='shost' filepath='drivers/scsi/scsi_scan.c' line='1843' column='1'/>
+      <function-decl name='scsi_scan_host' mangled-name='scsi_scan_host' filepath='drivers/scsi/scsi_scan.c' line='1844' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='scsi_scan_host'>
+        <parameter type-id='a970a64c' name='shost' filepath='drivers/scsi/scsi_scan.c' line='1844' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
     </abi-instr>
@@ -91991,28 +91944,6 @@
           <var-decl name='hostdata' type-id='c99b5ecd' visibility='default' filepath='include/scsi/scsi_host.h' line='725' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__3' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/sched.h' line='1296' column='1' id='1c93a193'>
-        <data-member access='public'>
-          <var-decl name='frozen' type-id='f0981eeb' visibility='default' filepath='include/linux/sched.h' line='1296' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide44' type-id='156952c4' visibility='default' filepath='include/linux/sched.h' line='1296' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/sched.h' line='1296' column='1'/>
-        </data-member>
-      </union-decl>
-      <union-decl name='__anonymous_union__5' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/sched.h' line='1299' column='1' id='1272a271'>
-        <data-member access='public'>
-          <var-decl name='futex_state' type-id='f0981eeb' visibility='default' filepath='include/linux/sched.h' line='1299' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide45' type-id='6040de71' visibility='default' filepath='include/linux/sched.h' line='1299' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/sched.h' line='1299' column='1'/>
-        </data-member>
-      </union-decl>
       <class-decl name='scsi_host_template' size-in-bits='2816' is-struct='yes' visibility='default' filepath='include/scsi/scsi_host.h' line='51' column='1' id='1a0d5389'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='module' type-id='2730d015' visibility='default' filepath='include/scsi/scsi_host.h' line='52' column='1'/>
@@ -94762,7 +94693,7 @@
           <var-decl name='data' type-id='c99b5ecd' visibility='default' filepath='include/linux/tty.h' line='69' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__4' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/tty.h' line='59' column='1' id='053892cc'>
+      <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/tty.h' line='59' column='1' id='053892cc'>
         <data-member access='public'>
           <var-decl name='next' type-id='a150e667' visibility='default' filepath='include/linux/tty.h' line='60' column='1'/>
         </data-member>
@@ -97924,8 +97855,8 @@
         <parameter type-id='3eb7c31c' name='gfp_flags' filepath='drivers/usb/gadget/composite.c' line='554' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='usb_string_id' mangled-name='usb_string_id' filepath='drivers/usb/gadget/composite.c' line='1342' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_string_id'>
-        <parameter type-id='2a895c01' name='cdev' filepath='drivers/usb/gadget/composite.c' line='1342' column='1'/>
+      <function-decl name='usb_string_id' mangled-name='usb_string_id' filepath='drivers/usb/gadget/composite.c' line='1346' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_string_id'>
+        <parameter type-id='2a895c01' name='cdev' filepath='drivers/usb/gadget/composite.c' line='1346' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-decl name='usb_gadget_set_state' mangled-name='usb_gadget_set_state' filepath='include/linux/usb/gadget.h' line='929' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_gadget_set_state'>
@@ -97948,8 +97879,8 @@
         <parameter type-id='1a494567'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='usb_composite_setup_continue' mangled-name='usb_composite_setup_continue' filepath='drivers/usb/gadget/composite.c' line='2555' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_composite_setup_continue'>
-        <parameter type-id='2a895c01' name='cdev' filepath='drivers/usb/gadget/composite.c' line='2555' column='1'/>
+      <function-decl name='usb_composite_setup_continue' mangled-name='usb_composite_setup_continue' filepath='drivers/usb/gadget/composite.c' line='2559' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='usb_composite_setup_continue'>
+        <parameter type-id='2a895c01' name='cdev' filepath='drivers/usb/gadget/composite.c' line='2559' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
       <pointer-type-def type-id='e9546509' size-in-bits='64' id='2a895c01'/>
@@ -103922,17 +103853,6 @@
           <var-decl name='min_rev' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1714' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='61ea481a'>
-        <data-member access='public'>
-          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide66' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-      </union-decl>
       <pointer-type-def type-id='2f162548' size-in-bits='64' id='3e77f659'/>
       <qualified-type-def type-id='519497e3' const='yes' id='8f118d08'/>
       <pointer-type-def type-id='8f118d08' size-in-bits='64' id='5aa12c86'/>
@@ -105871,16 +105791,20 @@
         <parameter type-id='91d0de51' name='_vq' filepath='drivers/virtio/virtio_ring.c' line='1196' column='1'/>
         <return type-id='b50a4934'/>
       </function-decl>
-      <function-decl name='virtqueue_get_desc_addr' mangled-name='virtqueue_get_desc_addr' filepath='drivers/virtio/virtio_ring.c' line='1219' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='virtqueue_get_desc_addr'>
-        <parameter type-id='91d0de51' name='_vq' filepath='drivers/virtio/virtio_ring.c' line='1219' column='1'/>
+      <function-decl name='virtio_break_device' mangled-name='virtio_break_device' filepath='drivers/virtio/virtio_ring.c' line='1208' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='virtio_break_device'>
+        <parameter type-id='5dbfcbb1' name='dev' filepath='drivers/virtio/virtio_ring.c' line='1208' column='1'/>
+        <return type-id='48b5725f'/>
+      </function-decl>
+      <function-decl name='virtqueue_get_desc_addr' mangled-name='virtqueue_get_desc_addr' filepath='drivers/virtio/virtio_ring.c' line='1221' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='virtqueue_get_desc_addr'>
+        <parameter type-id='91d0de51' name='_vq' filepath='drivers/virtio/virtio_ring.c' line='1221' column='1'/>
         <return type-id='cf29c9b3'/>
       </function-decl>
-      <function-decl name='virtqueue_get_avail_addr' mangled-name='virtqueue_get_avail_addr' filepath='drivers/virtio/virtio_ring.c' line='1229' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='virtqueue_get_avail_addr'>
-        <parameter type-id='91d0de51' name='_vq' filepath='drivers/virtio/virtio_ring.c' line='1229' column='1'/>
+      <function-decl name='virtqueue_get_avail_addr' mangled-name='virtqueue_get_avail_addr' filepath='drivers/virtio/virtio_ring.c' line='1231' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='virtqueue_get_avail_addr'>
+        <parameter type-id='91d0de51' name='_vq' filepath='drivers/virtio/virtio_ring.c' line='1231' column='1'/>
         <return type-id='cf29c9b3'/>
       </function-decl>
-      <function-decl name='virtqueue_get_used_addr' mangled-name='virtqueue_get_used_addr' filepath='drivers/virtio/virtio_ring.c' line='1240' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='virtqueue_get_used_addr'>
-        <parameter type-id='91d0de51' name='_vq' filepath='drivers/virtio/virtio_ring.c' line='1240' column='1'/>
+      <function-decl name='virtqueue_get_used_addr' mangled-name='virtqueue_get_used_addr' filepath='drivers/virtio/virtio_ring.c' line='1242' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='virtqueue_get_used_addr'>
+        <parameter type-id='91d0de51' name='_vq' filepath='drivers/virtio/virtio_ring.c' line='1242' column='1'/>
         <return type-id='cf29c9b3'/>
       </function-decl>
       <function-type size-in-bits='64' id='1697786f'>
@@ -105914,17 +105838,6 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='fs/binfmt_misc.c' language='LANG_C89'>
-      <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='47d7b057'>
-        <data-member access='public'>
-          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide65' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-      </union-decl>
       <pointer-type-def type-id='d7ab0a14' size-in-bits='64' id='8567d8b0'/>
       <pointer-type-def type-id='60efdfd3' size-in-bits='64' id='5bfdb453'/>
       <pointer-type-def type-id='f19fdb93' size-in-bits='64' id='9b58df93'/>
@@ -106089,17 +106002,6 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='fs/dcache.c' language='LANG_C89'>
-      <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='b6cbfeb5'>
-        <data-member access='public'>
-          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide63' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-      </union-decl>
       <function-decl name='d_add' mangled-name='d_add' filepath='fs/dcache.c' line='2579' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='d_add'>
         <parameter type-id='27675065' name='entry' filepath='fs/dcache.c' line='2579' column='1'/>
         <parameter type-id='7e666abe' name='inode' filepath='fs/dcache.c' line='2579' column='1'/>
@@ -106395,17 +106297,6 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='fs/namei.c' language='LANG_C89'>
-      <union-decl name='__anonymous_union__8' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='2feb6f0d'>
-        <data-member access='public'>
-          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide45' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-      </union-decl>
       <function-decl name='user_path_at_empty' mangled-name='user_path_at_empty' filepath='fs/namei.c' line='2690' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='user_path_at_empty'>
         <parameter type-id='95e97e5e' name='dfd' filepath='fs/namei.c' line='2690' column='1'/>
         <parameter type-id='80f4b756' name='name' filepath='fs/namei.c' line='2690' column='1'/>
@@ -106602,17 +106493,6 @@
           <var-decl name='parent_generation' type-id='19c2251e' visibility='default' filepath='include/linux/exportfs.h' line='127' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__17' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='91d5f451'>
-        <data-member access='public'>
-          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide23' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-      </union-decl>
       <pointer-type-def type-id='52365588' size-in-bits='64' id='8567d8b1'/>
       <pointer-type-def type-id='3f1a6b60' size-in-bits='64' id='cd1b45ab'/>
       <qualified-type-def type-id='52365588' const='yes' id='a585bdd7'/>
@@ -106901,18 +106781,7 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='fs/proc/generic.c' language='LANG_C89'>
-      <union-decl name='__anonymous_union__2' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='dac3737d'>
-        <data-member access='public'>
-          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide30' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-      </union-decl>
-      <union-decl name='__anonymous_union__4' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='fs/proc/internal.h' line='48' column='1' id='1371a02f'>
+      <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='fs/proc/internal.h' line='48' column='1' id='1371a02f'>
         <data-member access='public'>
           <var-decl name='seq_ops' type-id='943a1b48' visibility='default' filepath='fs/proc/internal.h' line='49' column='1'/>
         </data-member>
@@ -106959,17 +106828,6 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='fs/proc/proc_net.c' language='LANG_C89'>
-      <union-decl name='__anonymous_union__2' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='2b7f7bf0'>
-        <data-member access='public'>
-          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide59' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-      </union-decl>
       <function-decl name='proc_create_net_single' mangled-name='proc_create_net_single' filepath='fs/proc/proc_net.c' line='177' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='proc_create_net_single'>
         <parameter type-id='80f4b756' name='name' filepath='fs/proc/proc_net.c' line='177' column='1'/>
         <parameter type-id='2594b00f' name='mode' filepath='fs/proc/proc_net.c' line='177' column='1'/>
@@ -107434,17 +107292,6 @@
     </abi-instr>
     <abi-instr address-size='64' path='fs/super.c' language='LANG_C89'>
       <union-decl name='fscrypt_context' visibility='default' is-declaration-only='yes' id='1c949861'/>
-      <union-decl name='__anonymous_union__4' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='ac2ae184'>
-        <data-member access='public'>
-          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide60' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-      </union-decl>
       <qualified-type-def type-id='1c949861' const='yes' id='477c7881'/>
       <pointer-type-def type-id='477c7881' size-in-bits='64' id='33f1f531'/>
       <pointer-type-def type-id='e3a9597f' size-in-bits='64' id='e5cc228b'/>
@@ -107610,9 +107457,6 @@
         </data-member>
       </class-decl>
       <pointer-type-def type-id='b8d20333' size-in-bits='64' id='c14ebfd3'/>
-      <pointer-type-def type-id='74fec388' size-in-bits='64' id='f3a5c46a'/>
-      <pointer-type-def type-id='91dc7ea3' size-in-bits='64' id='c748f227'/>
-      <pointer-type-def type-id='e151e1f6' size-in-bits='64' id='68b31938'/>
       <function-decl name='__fsverity_verify_signature' mangled-name='__fsverity_verify_signature' filepath='fs/verity/signature.c' line='42' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__fsverity_verify_signature'>
         <parameter type-id='c5a4eb7f' name='inode' filepath='fs/verity/signature.c' line='42' column='1'/>
         <parameter type-id='bbaf3419' name='signature' filepath='fs/verity/signature.c' line='42' column='1'/>
@@ -107621,26 +107465,6 @@
         <parameter type-id='f0981eeb' name='digest_algorithm' filepath='fs/verity/signature.c' line='44' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-type size-in-bits='64' id='74fec388'>
-        <parameter type-id='77e79a4b'/>
-        <parameter type-id='eaa32e2f'/>
-        <parameter type-id='b59d7dce'/>
-        <parameter type-id='91ce1af9'/>
-        <return type-id='95e97e5e'/>
-      </function-type>
-      <function-type size-in-bits='64' id='91dc7ea3'>
-        <parameter type-id='7e666abe'/>
-        <parameter type-id='eaa32e2f'/>
-        <parameter type-id='91ce1af9'/>
-        <parameter type-id='95e97e5e'/>
-        <return type-id='95e97e5e'/>
-      </function-type>
-      <function-type size-in-bits='64' id='e151e1f6'>
-        <parameter type-id='7e666abe'/>
-        <parameter type-id='7359adad'/>
-        <parameter type-id='7359adad'/>
-        <return type-id='02f11ed4'/>
-      </function-type>
     </abi-instr>
     <abi-instr address-size='64' path='fs/xattr.c' language='LANG_C89'>
       <function-decl name='vfs_getxattr' mangled-name='vfs_getxattr' filepath='fs/xattr.c' line='355' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vfs_getxattr'>
@@ -107976,17 +107800,6 @@
           <var-decl name='tm_ref' type-id='49178f86' visibility='default' filepath='include/linux/trace_events.h' line='393' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__4' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='7b932de3'>
-        <data-member access='public'>
-          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide54' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-      </union-decl>
       <class-decl name='new_utsname' size-in-bits='3120' is-struct='yes' visibility='default' filepath='include/uapi/linux/utsname.h' line='25' column='1' id='ee2746d3'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='sysname' type-id='5ddd38d2' visibility='default' filepath='include/uapi/linux/utsname.h' line='26' column='1'/>
@@ -109018,17 +108831,6 @@
           <var-decl name='key' type-id='00205383' visibility='default' filepath='include/linux/jump_label.h' line='285' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='2b02fe01'>
-        <data-member access='public'>
-          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide49' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-      </union-decl>
       <var-decl name='memory_cgrp_subsys_on_dfl_key' type-id='49a0ad34' mangled-name='memory_cgrp_subsys_on_dfl_key' visibility='default' filepath='include/linux/cgroup_subsys.h' line='33' column='1' elf-symbol-id='memory_cgrp_subsys_on_dfl_key'/>
       <function-decl name='deactivate_locked_super' mangled-name='deactivate_locked_super' filepath='include/linux/fs.h' line='2276' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='deactivate_locked_super'>
         <parameter type-id='42c8f564'/>
@@ -109478,10 +109280,6 @@
       <array-type-def dimensions='1' type-id='8f048e17' size-in-bits='7584' id='e1f95b49'>
         <subrange length='948' type-id='7ff19f0f' id='9d8fc450'/>
       </array-type-def>
-      <array-type-def dimensions='1' type-id='f67e137c' size-in-bits='infinite' id='3f814540'>
-        <subrange length='infinite' type-id='7ff19f0f' id='031f2035'/>
-      </array-type-def>
-      <class-decl name='bpf_cgroup_storage_map' is-struct='yes' visibility='default' is-declaration-only='yes' id='0ad68707'/>
       <class-decl name='perf_event_mmap_page' size-in-bits='8704' is-struct='yes' visibility='default' filepath='include/uapi/linux/perf_event.h' line='473' column='1' id='a752caf1'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='version' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/perf_event.h' line='474' column='1'/>
@@ -109581,53 +109379,6 @@
           <var-decl name='cap_____res' type-id='d3130597' visibility='default' filepath='include/uapi/linux/perf_event.h' line='526' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='bpf_prog_array_item' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/bpf.h' line='359' column='1' id='f67e137c'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='prog' type-id='bdcee7ae' visibility='default' filepath='include/linux/bpf.h' line='360' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='cgroup_storage' type-id='531c24d0' visibility='default' filepath='include/linux/bpf.h' line='361' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='bpf_cgroup_storage' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/bpf-cgroup.h' line='34' column='1' id='15881542'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='buf' type-id='b1253746' visibility='default' filepath='include/linux/bpf-cgroup.h' line='35' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='map' type-id='b6a33eaf' visibility='default' filepath='include/linux/bpf-cgroup.h' line='36' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='key' type-id='d8d7111e' visibility='default' filepath='include/linux/bpf-cgroup.h' line='37' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='include/linux/bpf-cgroup.h' line='38' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='node' type-id='2a8a6332' visibility='default' filepath='include/linux/bpf-cgroup.h' line='39' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/linux/bpf-cgroup.h' line='40' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='bpf_storage_buffer' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/bpf-cgroup.h' line='29' column='1' id='0ef5c7e0'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/linux/bpf-cgroup.h' line='30' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='data' type-id='e84913bd' visibility='default' filepath='include/linux/bpf-cgroup.h' line='31' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='bpf_cgroup_storage_key' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='78' column='1' id='d8d7111e'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='cgroup_inode_id' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='79' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='attach_type' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='80' column='1'/>
-        </data-member>
-      </class-decl>
-      <pointer-type-def type-id='15881542' size-in-bits='64' id='531c24d0'/>
-      <pointer-type-def type-id='0ad68707' size-in-bits='64' id='b6a33eaf'/>
-      <pointer-type-def type-id='0ef5c7e0' size-in-bits='64' id='b1253746'/>
       <pointer-type-def type-id='a752caf1' size-in-bits='64' id='4b860c99'/>
       <function-decl name='perf_pmu_register' mangled-name='perf_pmu_register' filepath='kernel/events/core.c' line='9708' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='perf_pmu_register'>
         <parameter type-id='0906f5b9' name='pmu' filepath='kernel/events/core.c' line='9708' column='1'/>
@@ -109851,12 +109602,12 @@
         <parameter type-id='b7f9d8e6'/>
         <return type-id='f3b4aca8'/>
       </function-decl>
-      <function-decl name='mmput' mangled-name='mmput' filepath='kernel/fork.c' line='1044' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mmput'>
-        <parameter type-id='df4b7819' name='mm' filepath='kernel/fork.c' line='1044' column='1'/>
+      <function-decl name='mmput' mangled-name='mmput' filepath='kernel/fork.c' line='1045' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mmput'>
+        <parameter type-id='df4b7819' name='mm' filepath='kernel/fork.c' line='1045' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='get_task_mm' mangled-name='get_task_mm' filepath='kernel/fork.c' line='1151' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_task_mm'>
-        <parameter type-id='f23e2572' name='task' filepath='kernel/fork.c' line='1151' column='1'/>
+      <function-decl name='get_task_mm' mangled-name='get_task_mm' filepath='kernel/fork.c' line='1152' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_task_mm'>
+        <parameter type-id='f23e2572' name='task' filepath='kernel/fork.c' line='1152' column='1'/>
         <return type-id='df4b7819'/>
       </function-decl>
       <function-decl name='put_pid' mangled-name='put_pid' filepath='include/linux/pid.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='put_pid'>
@@ -109911,71 +109662,71 @@
         <parameter type-id='eaa32e2f' name='data' filepath='kernel/irq/chip.c' line='91' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='handle_nested_irq' mangled-name='handle_nested_irq' filepath='kernel/irq/chip.c' line='459' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='handle_nested_irq'>
-        <parameter type-id='f0981eeb' name='irq' filepath='kernel/irq/chip.c' line='459' column='1'/>
+      <function-decl name='handle_nested_irq' mangled-name='handle_nested_irq' filepath='kernel/irq/chip.c' line='462' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='handle_nested_irq'>
+        <parameter type-id='f0981eeb' name='irq' filepath='kernel/irq/chip.c' line='462' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='handle_simple_irq' mangled-name='handle_simple_irq' filepath='kernel/irq/chip.c' line='553' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='handle_simple_irq'>
-        <parameter type-id='76c7d88b' name='desc' filepath='kernel/irq/chip.c' line='553' column='1'/>
+      <function-decl name='handle_simple_irq' mangled-name='handle_simple_irq' filepath='kernel/irq/chip.c' line='556' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='handle_simple_irq'>
+        <parameter type-id='76c7d88b' name='desc' filepath='kernel/irq/chip.c' line='556' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='handle_level_irq' mangled-name='handle_level_irq' filepath='kernel/irq/chip.c' line='645' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='handle_level_irq'>
-        <parameter type-id='76c7d88b' name='desc' filepath='kernel/irq/chip.c' line='645' column='1'/>
+      <function-decl name='handle_level_irq' mangled-name='handle_level_irq' filepath='kernel/irq/chip.c' line='648' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='handle_level_irq'>
+        <parameter type-id='76c7d88b' name='desc' filepath='kernel/irq/chip.c' line='648' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='handle_edge_irq' mangled-name='handle_edge_irq' filepath='kernel/irq/chip.c' line='768' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='handle_edge_irq'>
-        <parameter type-id='76c7d88b' name='desc' filepath='kernel/irq/chip.c' line='768' column='1'/>
+      <function-decl name='handle_edge_irq' mangled-name='handle_edge_irq' filepath='kernel/irq/chip.c' line='771' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='handle_edge_irq'>
+        <parameter type-id='76c7d88b' name='desc' filepath='kernel/irq/chip.c' line='771' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='__irq_set_handler' mangled-name='__irq_set_handler' filepath='kernel/irq/chip.c' line='1011' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__irq_set_handler'>
-        <parameter type-id='f0981eeb' name='irq' filepath='kernel/irq/chip.c' line='1011' column='1'/>
-        <parameter type-id='cdb741d3' name='handle' filepath='kernel/irq/chip.c' line='1011' column='1'/>
-        <parameter type-id='95e97e5e' name='is_chained' filepath='kernel/irq/chip.c' line='1011' column='1'/>
-        <parameter type-id='80f4b756' name='name' filepath='kernel/irq/chip.c' line='1012' column='1'/>
+      <function-decl name='__irq_set_handler' mangled-name='__irq_set_handler' filepath='kernel/irq/chip.c' line='1014' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__irq_set_handler'>
+        <parameter type-id='f0981eeb' name='irq' filepath='kernel/irq/chip.c' line='1014' column='1'/>
+        <parameter type-id='cdb741d3' name='handle' filepath='kernel/irq/chip.c' line='1014' column='1'/>
+        <parameter type-id='95e97e5e' name='is_chained' filepath='kernel/irq/chip.c' line='1014' column='1'/>
+        <parameter type-id='80f4b756' name='name' filepath='kernel/irq/chip.c' line='1015' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='irq_chip_set_parent_state' mangled-name='irq_chip_set_parent_state' filepath='kernel/irq/chip.c' line='1264' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_set_parent_state'>
-        <parameter type-id='1c475548' name='data' filepath='kernel/irq/chip.c' line='1264' column='1'/>
-        <parameter type-id='0187da1b' name='which' filepath='kernel/irq/chip.c' line='1265' column='1'/>
-        <parameter type-id='b50a4934' name='val' filepath='kernel/irq/chip.c' line='1266' column='1'/>
+      <function-decl name='irq_chip_set_parent_state' mangled-name='irq_chip_set_parent_state' filepath='kernel/irq/chip.c' line='1267' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_set_parent_state'>
+        <parameter type-id='1c475548' name='data' filepath='kernel/irq/chip.c' line='1267' column='1'/>
+        <parameter type-id='0187da1b' name='which' filepath='kernel/irq/chip.c' line='1268' column='1'/>
+        <parameter type-id='b50a4934' name='val' filepath='kernel/irq/chip.c' line='1269' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='irq_chip_get_parent_state' mangled-name='irq_chip_get_parent_state' filepath='kernel/irq/chip.c' line='1286' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_get_parent_state'>
-        <parameter type-id='1c475548' name='data' filepath='kernel/irq/chip.c' line='1286' column='1'/>
-        <parameter type-id='0187da1b' name='which' filepath='kernel/irq/chip.c' line='1287' column='1'/>
-        <parameter type-id='d8e6b335' name='state' filepath='kernel/irq/chip.c' line='1288' column='1'/>
+      <function-decl name='irq_chip_get_parent_state' mangled-name='irq_chip_get_parent_state' filepath='kernel/irq/chip.c' line='1289' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_get_parent_state'>
+        <parameter type-id='1c475548' name='data' filepath='kernel/irq/chip.c' line='1289' column='1'/>
+        <parameter type-id='0187da1b' name='which' filepath='kernel/irq/chip.c' line='1290' column='1'/>
+        <parameter type-id='d8e6b335' name='state' filepath='kernel/irq/chip.c' line='1291' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='irq_chip_enable_parent' mangled-name='irq_chip_enable_parent' filepath='kernel/irq/chip.c' line='1306' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_enable_parent'>
-        <parameter type-id='1c475548' name='data' filepath='kernel/irq/chip.c' line='1306' column='1'/>
+      <function-decl name='irq_chip_enable_parent' mangled-name='irq_chip_enable_parent' filepath='kernel/irq/chip.c' line='1309' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_enable_parent'>
+        <parameter type-id='1c475548' name='data' filepath='kernel/irq/chip.c' line='1309' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='irq_chip_disable_parent' mangled-name='irq_chip_disable_parent' filepath='kernel/irq/chip.c' line='1321' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_disable_parent'>
-        <parameter type-id='1c475548' name='data' filepath='kernel/irq/chip.c' line='1321' column='1'/>
+      <function-decl name='irq_chip_disable_parent' mangled-name='irq_chip_disable_parent' filepath='kernel/irq/chip.c' line='1324' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_disable_parent'>
+        <parameter type-id='1c475548' name='data' filepath='kernel/irq/chip.c' line='1324' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='irq_chip_eoi_parent' mangled-name='irq_chip_eoi_parent' filepath='kernel/irq/chip.c' line='1368' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_eoi_parent'>
-        <parameter type-id='1c475548' name='data' filepath='kernel/irq/chip.c' line='1368' column='1'/>
+      <function-decl name='irq_chip_eoi_parent' mangled-name='irq_chip_eoi_parent' filepath='kernel/irq/chip.c' line='1371' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_eoi_parent'>
+        <parameter type-id='1c475548' name='data' filepath='kernel/irq/chip.c' line='1371' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='irq_chip_set_affinity_parent' mangled-name='irq_chip_set_affinity_parent' filepath='kernel/irq/chip.c' line='1383' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_set_affinity_parent'>
-        <parameter type-id='1c475548' name='data' filepath='kernel/irq/chip.c' line='1383' column='1'/>
-        <parameter type-id='5f8a1ac4' name='dest' filepath='kernel/irq/chip.c' line='1384' column='1'/>
-        <parameter type-id='b50a4934' name='force' filepath='kernel/irq/chip.c' line='1384' column='1'/>
+      <function-decl name='irq_chip_set_affinity_parent' mangled-name='irq_chip_set_affinity_parent' filepath='kernel/irq/chip.c' line='1386' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_set_affinity_parent'>
+        <parameter type-id='1c475548' name='data' filepath='kernel/irq/chip.c' line='1386' column='1'/>
+        <parameter type-id='5f8a1ac4' name='dest' filepath='kernel/irq/chip.c' line='1387' column='1'/>
+        <parameter type-id='b50a4934' name='force' filepath='kernel/irq/chip.c' line='1387' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='irq_chip_retrigger_hierarchy' mangled-name='irq_chip_retrigger_hierarchy' filepath='kernel/irq/chip.c' line='1419' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_retrigger_hierarchy'>
-        <parameter type-id='1c475548' name='data' filepath='kernel/irq/chip.c' line='1419' column='1'/>
+      <function-decl name='irq_chip_retrigger_hierarchy' mangled-name='irq_chip_retrigger_hierarchy' filepath='kernel/irq/chip.c' line='1422' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_retrigger_hierarchy'>
+        <parameter type-id='1c475548' name='data' filepath='kernel/irq/chip.c' line='1422' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='irq_chip_set_vcpu_affinity_parent' mangled-name='irq_chip_set_vcpu_affinity_parent' filepath='kernel/irq/chip.c' line='1434' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_set_vcpu_affinity_parent'>
-        <parameter type-id='1c475548' name='data' filepath='kernel/irq/chip.c' line='1434' column='1'/>
-        <parameter type-id='eaa32e2f' name='vcpu_info' filepath='kernel/irq/chip.c' line='1434' column='1'/>
+      <function-decl name='irq_chip_set_vcpu_affinity_parent' mangled-name='irq_chip_set_vcpu_affinity_parent' filepath='kernel/irq/chip.c' line='1437' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_set_vcpu_affinity_parent'>
+        <parameter type-id='1c475548' name='data' filepath='kernel/irq/chip.c' line='1437' column='1'/>
+        <parameter type-id='eaa32e2f' name='vcpu_info' filepath='kernel/irq/chip.c' line='1437' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='irq_chip_set_wake_parent' mangled-name='irq_chip_set_wake_parent' filepath='kernel/irq/chip.c' line='1451' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_set_wake_parent'>
-        <parameter type-id='1c475548' name='data' filepath='kernel/irq/chip.c' line='1451' column='1'/>
-        <parameter type-id='f0981eeb' name='on' filepath='kernel/irq/chip.c' line='1451' column='1'/>
+      <function-decl name='irq_chip_set_wake_parent' mangled-name='irq_chip_set_wake_parent' filepath='kernel/irq/chip.c' line='1454' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_chip_set_wake_parent'>
+        <parameter type-id='1c475548' name='data' filepath='kernel/irq/chip.c' line='1454' column='1'/>
+        <parameter type-id='f0981eeb' name='on' filepath='kernel/irq/chip.c' line='1454' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
     </abi-instr>
@@ -110264,9 +110015,9 @@
         <parameter type-id='7533ba6f' name='lock' filepath='kernel/locking/mutex.c' line='738' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='ww_mutex_lock_interruptible' mangled-name='ww_mutex_lock_interruptible' filepath='kernel/locking/mutex.c' line='1418' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ww_mutex_lock_interruptible'>
-        <parameter type-id='7533ba6f' name='lock' filepath='kernel/locking/mutex.c' line='1418' column='1'/>
-        <parameter type-id='c1d02a64' name='ctx' filepath='kernel/locking/mutex.c' line='1418' column='1'/>
+      <function-decl name='ww_mutex_lock_interruptible' mangled-name='ww_mutex_lock_interruptible' filepath='kernel/locking/mutex.c' line='1413' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ww_mutex_lock_interruptible'>
+        <parameter type-id='7533ba6f' name='lock' filepath='kernel/locking/mutex.c' line='1413' column='1'/>
+        <parameter type-id='c1d02a64' name='ctx' filepath='kernel/locking/mutex.c' line='1413' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
     </abi-instr>
@@ -110936,310 +110687,310 @@
           <var-decl name='softirqs' type-id='67c1c82c' visibility='default' filepath='include/linux/kernel_stat.h' line='40' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='rq' size-in-bits='23552' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='869' column='1' id='d5ee6a94'>
+      <class-decl name='rq' size-in-bits='23552' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='871' column='1' id='d5ee6a94'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='lock' type-id='f5c90b3f' visibility='default' filepath='kernel/sched/sched.h' line='871' column='1'/>
+          <var-decl name='lock' type-id='f5c90b3f' visibility='default' filepath='kernel/sched/sched.h' line='873' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='nr_running' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='877' column='1'/>
+          <var-decl name='nr_running' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='879' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='cpu_load' type-id='f06fd798' visibility='default' filepath='kernel/sched/sched.h' line='884' column='1'/>
+          <var-decl name='cpu_load' type-id='f06fd798' visibility='default' filepath='kernel/sched/sched.h' line='886' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='last_load_update_tick' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='887' column='1'/>
+          <var-decl name='last_load_update_tick' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='889' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='last_blocked_load_update_tick' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='888' column='1'/>
+          <var-decl name='last_blocked_load_update_tick' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='890' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='has_blocked_load' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='889' column='1'/>
+          <var-decl name='has_blocked_load' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='891' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='544'>
-          <var-decl name='nohz_tick_stopped' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='891' column='1'/>
+          <var-decl name='nohz_tick_stopped' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='893' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='nohz_flags' type-id='49178f86' visibility='default' filepath='kernel/sched/sched.h' line='892' column='1'/>
+          <var-decl name='nohz_flags' type-id='49178f86' visibility='default' filepath='kernel/sched/sched.h' line='894' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='640'>
-          <var-decl name='load' type-id='ad979632' visibility='default' filepath='kernel/sched/sched.h' line='896' column='1'/>
+          <var-decl name='load' type-id='ad979632' visibility='default' filepath='kernel/sched/sched.h' line='898' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='768'>
-          <var-decl name='nr_load_updates' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='897' column='1'/>
+          <var-decl name='nr_load_updates' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='899' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='nr_switches' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='898' column='1'/>
+          <var-decl name='nr_switches' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='900' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='cfs' type-id='feeb4c2f' visibility='default' filepath='kernel/sched/sched.h' line='907' column='1'/>
+          <var-decl name='cfs' type-id='feeb4c2f' visibility='default' filepath='kernel/sched/sched.h' line='909' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3072'>
-          <var-decl name='rt' type-id='e648d771' visibility='default' filepath='kernel/sched/sched.h' line='908' column='1'/>
+          <var-decl name='rt' type-id='e648d771' visibility='default' filepath='kernel/sched/sched.h' line='910' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='16704'>
-          <var-decl name='dl' type-id='53d038df' visibility='default' filepath='kernel/sched/sched.h' line='909' column='1'/>
+          <var-decl name='dl' type-id='53d038df' visibility='default' filepath='kernel/sched/sched.h' line='911' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17536'>
-          <var-decl name='nr_uninterruptible' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='923' column='1'/>
+          <var-decl name='nr_uninterruptible' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='925' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17600'>
-          <var-decl name='curr' type-id='f23e2572' visibility='default' filepath='kernel/sched/sched.h' line='925' column='1'/>
+          <var-decl name='curr' type-id='f23e2572' visibility='default' filepath='kernel/sched/sched.h' line='927' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17664'>
-          <var-decl name='idle' type-id='f23e2572' visibility='default' filepath='kernel/sched/sched.h' line='926' column='1'/>
+          <var-decl name='idle' type-id='f23e2572' visibility='default' filepath='kernel/sched/sched.h' line='928' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17728'>
-          <var-decl name='stop' type-id='f23e2572' visibility='default' filepath='kernel/sched/sched.h' line='927' column='1'/>
+          <var-decl name='stop' type-id='f23e2572' visibility='default' filepath='kernel/sched/sched.h' line='929' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17792'>
-          <var-decl name='next_balance' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='928' column='1'/>
+          <var-decl name='next_balance' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='930' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17856'>
-          <var-decl name='prev_mm' type-id='df4b7819' visibility='default' filepath='kernel/sched/sched.h' line='929' column='1'/>
+          <var-decl name='prev_mm' type-id='df4b7819' visibility='default' filepath='kernel/sched/sched.h' line='931' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17920'>
-          <var-decl name='clock_update_flags' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='931' column='1'/>
+          <var-decl name='clock_update_flags' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='933' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17984'>
-          <var-decl name='clock' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='932' column='1'/>
+          <var-decl name='clock' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='934' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='18432'>
-          <var-decl name='clock_task' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='934' column='1'/>
+          <var-decl name='clock_task' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='936' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='18496'>
-          <var-decl name='clock_pelt' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='935' column='1'/>
+          <var-decl name='clock_pelt' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='937' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='18560'>
-          <var-decl name='lost_idle_time' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='936' column='1'/>
+          <var-decl name='lost_idle_time' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='938' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='18624'>
-          <var-decl name='nr_iowait' type-id='49178f86' visibility='default' filepath='kernel/sched/sched.h' line='938' column='1'/>
+          <var-decl name='nr_iowait' type-id='49178f86' visibility='default' filepath='kernel/sched/sched.h' line='940' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='18688'>
-          <var-decl name='rd' type-id='c13bca88' visibility='default' filepath='kernel/sched/sched.h' line='941' column='1'/>
+          <var-decl name='rd' type-id='c13bca88' visibility='default' filepath='kernel/sched/sched.h' line='943' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='18752'>
-          <var-decl name='sd' type-id='e9d32201' visibility='default' filepath='kernel/sched/sched.h' line='942' column='1'/>
+          <var-decl name='sd' type-id='e9d32201' visibility='default' filepath='kernel/sched/sched.h' line='944' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='18816'>
-          <var-decl name='cpu_capacity' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='944' column='1'/>
+          <var-decl name='cpu_capacity' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='946' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='18880'>
-          <var-decl name='cpu_capacity_orig' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='945' column='1'/>
+          <var-decl name='cpu_capacity_orig' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='947' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='18944'>
-          <var-decl name='balance_callback' type-id='69c138b1' visibility='default' filepath='kernel/sched/sched.h' line='947' column='1'/>
+          <var-decl name='balance_callback' type-id='69c138b1' visibility='default' filepath='kernel/sched/sched.h' line='949' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='19008'>
-          <var-decl name='idle_balance' type-id='002ac4a6' visibility='default' filepath='kernel/sched/sched.h' line='949' column='1'/>
+          <var-decl name='idle_balance' type-id='002ac4a6' visibility='default' filepath='kernel/sched/sched.h' line='951' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='19072'>
-          <var-decl name='misfit_task_load' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='951' column='1'/>
+          <var-decl name='misfit_task_load' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='953' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='19136'>
-          <var-decl name='active_balance' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='954' column='1'/>
+          <var-decl name='active_balance' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='956' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='19168'>
-          <var-decl name='push_cpu' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='955' column='1'/>
+          <var-decl name='push_cpu' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='957' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='19200'>
-          <var-decl name='active_balance_work' type-id='8eb07132' visibility='default' filepath='kernel/sched/sched.h' line='956' column='1'/>
+          <var-decl name='active_balance_work' type-id='8eb07132' visibility='default' filepath='kernel/sched/sched.h' line='958' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='19520'>
-          <var-decl name='cpu' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='959' column='1'/>
+          <var-decl name='cpu' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='961' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='19552'>
-          <var-decl name='online' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='960' column='1'/>
+          <var-decl name='online' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='962' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='19584'>
-          <var-decl name='cfs_tasks' type-id='72f469ec' visibility='default' filepath='kernel/sched/sched.h' line='962' column='1'/>
+          <var-decl name='cfs_tasks' type-id='72f469ec' visibility='default' filepath='kernel/sched/sched.h' line='964' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='19968'>
-          <var-decl name='avg_rt' type-id='629c8d83' visibility='default' filepath='kernel/sched/sched.h' line='964' column='1'/>
+          <var-decl name='avg_rt' type-id='629c8d83' visibility='default' filepath='kernel/sched/sched.h' line='966' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='20480'>
-          <var-decl name='avg_dl' type-id='629c8d83' visibility='default' filepath='kernel/sched/sched.h' line='965' column='1'/>
+          <var-decl name='avg_dl' type-id='629c8d83' visibility='default' filepath='kernel/sched/sched.h' line='967' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='20992'>
-          <var-decl name='avg_irq' type-id='629c8d83' visibility='default' filepath='kernel/sched/sched.h' line='967' column='1'/>
+          <var-decl name='avg_irq' type-id='629c8d83' visibility='default' filepath='kernel/sched/sched.h' line='969' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='21504'>
-          <var-decl name='idle_stamp' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='969' column='1'/>
+          <var-decl name='idle_stamp' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='971' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='21568'>
-          <var-decl name='avg_idle' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='970' column='1'/>
+          <var-decl name='avg_idle' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='972' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='21632'>
-          <var-decl name='max_idle_balance_cost' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='973' column='1'/>
+          <var-decl name='max_idle_balance_cost' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='975' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='21696'>
-          <var-decl name='prev_irq_time' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='977' column='1'/>
+          <var-decl name='prev_irq_time' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='979' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='21760'>
-          <var-decl name='prev_steal_time' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='980' column='1'/>
+          <var-decl name='prev_steal_time' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='982' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='21824'>
-          <var-decl name='calc_load_update' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='987' column='1'/>
+          <var-decl name='calc_load_update' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='989' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='21888'>
-          <var-decl name='calc_load_active' type-id='bd54fe1a' visibility='default' filepath='kernel/sched/sched.h' line='988' column='1'/>
+          <var-decl name='calc_load_active' type-id='bd54fe1a' visibility='default' filepath='kernel/sched/sched.h' line='990' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='21952'>
-          <var-decl name='hrtick_csd_pending' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='992' column='1'/>
+          <var-decl name='hrtick_csd_pending' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='994' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='22016'>
-          <var-decl name='hrtick_csd' type-id='223a68bd' visibility='default' filepath='kernel/sched/sched.h' line='993' column='1'/>
+          <var-decl name='hrtick_csd' type-id='223a68bd' visibility='default' filepath='kernel/sched/sched.h' line='995' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='22272'>
-          <var-decl name='hrtick_timer' type-id='b6993efc' visibility='default' filepath='kernel/sched/sched.h' line='995' column='1'/>
+          <var-decl name='hrtick_timer' type-id='b6993efc' visibility='default' filepath='kernel/sched/sched.h' line='997' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='22848'>
-          <var-decl name='rq_sched_info' type-id='59ddd03d' visibility='default' filepath='kernel/sched/sched.h' line='1000' column='1'/>
+          <var-decl name='rq_sched_info' type-id='59ddd03d' visibility='default' filepath='kernel/sched/sched.h' line='1002' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='23104'>
-          <var-decl name='rq_cpu_time' type-id='3a47d82b' visibility='default' filepath='kernel/sched/sched.h' line='1001' column='1'/>
+          <var-decl name='rq_cpu_time' type-id='3a47d82b' visibility='default' filepath='kernel/sched/sched.h' line='1003' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='23168'>
-          <var-decl name='yld_count' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='1005' column='1'/>
+          <var-decl name='yld_count' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='1007' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='23200'>
-          <var-decl name='sched_count' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='1008' column='1'/>
+          <var-decl name='sched_count' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='1010' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='23232'>
-          <var-decl name='sched_goidle' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='1009' column='1'/>
+          <var-decl name='sched_goidle' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='1011' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='23264'>
-          <var-decl name='ttwu_count' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='1012' column='1'/>
+          <var-decl name='ttwu_count' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='1014' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='23296'>
-          <var-decl name='ttwu_local' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='1013' column='1'/>
+          <var-decl name='ttwu_local' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='1015' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='23360'>
-          <var-decl name='wake_list' type-id='77df194e' visibility='default' filepath='kernel/sched/sched.h' line='1017' column='1'/>
+          <var-decl name='wake_list' type-id='77df194e' visibility='default' filepath='kernel/sched/sched.h' line='1019' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='23424'>
-          <var-decl name='idle_state' type-id='2e3e746d' visibility='default' filepath='kernel/sched/sched.h' line='1022' column='1'/>
+          <var-decl name='idle_state' type-id='2e3e746d' visibility='default' filepath='kernel/sched/sched.h' line='1024' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='23488'>
-          <var-decl name='idle_state_idx' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='1023' column='1'/>
+          <var-decl name='idle_state_idx' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='1025' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cfs_rq' size-in-bits='2048' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='496' column='1' id='feeb4c2f'>
+      <class-decl name='cfs_rq' size-in-bits='2048' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='498' column='1' id='feeb4c2f'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='load' type-id='ad979632' visibility='default' filepath='kernel/sched/sched.h' line='497' column='1'/>
+          <var-decl name='load' type-id='ad979632' visibility='default' filepath='kernel/sched/sched.h' line='499' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='runnable_weight' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='498' column='1'/>
+          <var-decl name='runnable_weight' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='500' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='nr_running' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='499' column='1'/>
+          <var-decl name='nr_running' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='501' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='224'>
-          <var-decl name='h_nr_running' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='500' column='1'/>
+          <var-decl name='h_nr_running' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='502' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='exec_clock' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='502' column='1'/>
+          <var-decl name='exec_clock' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='504' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='min_vruntime' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='503' column='1'/>
+          <var-decl name='min_vruntime' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='505' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='tasks_timeline' type-id='6fe1603d' visibility='default' filepath='kernel/sched/sched.h' line='508' column='1'/>
+          <var-decl name='tasks_timeline' type-id='6fe1603d' visibility='default' filepath='kernel/sched/sched.h' line='510' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='curr' type-id='ff2b3d10' visibility='default' filepath='kernel/sched/sched.h' line='514' column='1'/>
+          <var-decl name='curr' type-id='ff2b3d10' visibility='default' filepath='kernel/sched/sched.h' line='516' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='next' type-id='ff2b3d10' visibility='default' filepath='kernel/sched/sched.h' line='515' column='1'/>
+          <var-decl name='next' type-id='ff2b3d10' visibility='default' filepath='kernel/sched/sched.h' line='517' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='640'>
-          <var-decl name='last' type-id='ff2b3d10' visibility='default' filepath='kernel/sched/sched.h' line='516' column='1'/>
+          <var-decl name='last' type-id='ff2b3d10' visibility='default' filepath='kernel/sched/sched.h' line='518' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='skip' type-id='ff2b3d10' visibility='default' filepath='kernel/sched/sched.h' line='517' column='1'/>
+          <var-decl name='skip' type-id='ff2b3d10' visibility='default' filepath='kernel/sched/sched.h' line='519' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='768'>
-          <var-decl name='nr_spread_over' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='520' column='1'/>
+          <var-decl name='nr_spread_over' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='522' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='avg' type-id='629c8d83' visibility='default' filepath='kernel/sched/sched.h' line='527' column='1'/>
+          <var-decl name='avg' type-id='629c8d83' visibility='default' filepath='kernel/sched/sched.h' line='529' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1536'>
-          <var-decl name='removed' type-id='dbb6a82c' visibility='default' filepath='kernel/sched/sched.h' line='537' column='1'/>
+          <var-decl name='removed' type-id='dbb6a82c' visibility='default' filepath='kernel/sched/sched.h' line='539' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='kernel/sched/sched.h' line='531' column='1' id='dbb6a82c'>
+      <class-decl name='__anonymous_struct__' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='kernel/sched/sched.h' line='533' column='1' id='dbb6a82c'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='lock' type-id='f5c90b3f' visibility='default' filepath='kernel/sched/sched.h' line='532' column='1'/>
+          <var-decl name='lock' type-id='f5c90b3f' visibility='default' filepath='kernel/sched/sched.h' line='534' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='nr' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='533' column='1'/>
+          <var-decl name='nr' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='535' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='load_avg' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='534' column='1'/>
+          <var-decl name='load_avg' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='536' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='util_avg' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='535' column='1'/>
+          <var-decl name='util_avg' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='537' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='runnable_sum' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='536' column='1'/>
+          <var-decl name='runnable_sum' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='538' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='rt_rq' size-in-bits='13632' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='596' column='1' id='e648d771'>
+      <class-decl name='rt_rq' size-in-bits='13632' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='598' column='1' id='e648d771'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='active' type-id='3ac6deac' visibility='default' filepath='kernel/sched/sched.h' line='597' column='1'/>
+          <var-decl name='active' type-id='3ac6deac' visibility='default' filepath='kernel/sched/sched.h' line='599' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='12928'>
-          <var-decl name='rt_nr_running' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='598' column='1'/>
+          <var-decl name='rt_nr_running' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='600' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='12960'>
-          <var-decl name='rr_nr_running' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='599' column='1'/>
+          <var-decl name='rr_nr_running' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='601' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='12992'>
-          <var-decl name='highest_prio' type-id='8f548118' visibility='default' filepath='kernel/sched/sched.h' line='606' column='1'/>
+          <var-decl name='highest_prio' type-id='8f548118' visibility='default' filepath='kernel/sched/sched.h' line='608' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='13056'>
-          <var-decl name='rt_nr_migratory' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='609' column='1'/>
+          <var-decl name='rt_nr_migratory' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='611' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='13120'>
-          <var-decl name='rt_nr_total' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='610' column='1'/>
+          <var-decl name='rt_nr_total' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='612' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='13184'>
-          <var-decl name='overloaded' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='611' column='1'/>
+          <var-decl name='overloaded' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='613' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='13248'>
-          <var-decl name='pushable_tasks' type-id='57b0eed2' visibility='default' filepath='kernel/sched/sched.h' line='612' column='1'/>
+          <var-decl name='pushable_tasks' type-id='57b0eed2' visibility='default' filepath='kernel/sched/sched.h' line='614' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='13376'>
-          <var-decl name='rt_queued' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='615' column='1'/>
+          <var-decl name='rt_queued' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='617' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='13408'>
-          <var-decl name='rt_throttled' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='617' column='1'/>
+          <var-decl name='rt_throttled' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='619' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='13440'>
-          <var-decl name='rt_time' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='618' column='1'/>
+          <var-decl name='rt_time' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='620' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='13504'>
-          <var-decl name='rt_runtime' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='619' column='1'/>
+          <var-decl name='rt_runtime' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='621' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='13568'>
-          <var-decl name='rt_runtime_lock' type-id='f5c90b3f' visibility='default' filepath='kernel/sched/sched.h' line='621' column='1'/>
+          <var-decl name='rt_runtime_lock' type-id='f5c90b3f' visibility='default' filepath='kernel/sched/sched.h' line='623' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='rt_prio_array' size-in-bits='12928' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='238' column='1' id='3ac6deac'>
+      <class-decl name='rt_prio_array' size-in-bits='12928' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='240' column='1' id='3ac6deac'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='bitmap' type-id='f05e8e77' visibility='default' filepath='kernel/sched/sched.h' line='239' column='1'/>
+          <var-decl name='bitmap' type-id='f05e8e77' visibility='default' filepath='kernel/sched/sched.h' line='241' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='queue' type-id='6f53db1b' visibility='default' filepath='kernel/sched/sched.h' line='240' column='1'/>
+          <var-decl name='queue' type-id='6f53db1b' visibility='default' filepath='kernel/sched/sched.h' line='242' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__1' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='kernel/sched/sched.h' line='601' column='1' id='8f548118'>
+      <class-decl name='__anonymous_struct__1' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='kernel/sched/sched.h' line='603' column='1' id='8f548118'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='curr' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='602' column='1'/>
+          <var-decl name='curr' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='604' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='next' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='604' column='1'/>
+          <var-decl name='next' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='606' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='plist_head' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/plist.h' line='81' column='1' id='57b0eed2'>
@@ -111247,129 +110998,129 @@
           <var-decl name='node_list' type-id='72f469ec' visibility='default' filepath='include/linux/plist.h' line='82' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='dl_rq' size-in-bits='832' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='637' column='1' id='53d038df'>
+      <class-decl name='dl_rq' size-in-bits='832' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='639' column='1' id='53d038df'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='root' type-id='6fe1603d' visibility='default' filepath='kernel/sched/sched.h' line='639' column='1'/>
+          <var-decl name='root' type-id='6fe1603d' visibility='default' filepath='kernel/sched/sched.h' line='641' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='dl_nr_running' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='641' column='1'/>
+          <var-decl name='dl_nr_running' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='643' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='earliest_dl' type-id='8c6b5470' visibility='default' filepath='kernel/sched/sched.h' line='653' column='1'/>
+          <var-decl name='earliest_dl' type-id='8c6b5470' visibility='default' filepath='kernel/sched/sched.h' line='655' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='dl_nr_migratory' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='655' column='1'/>
+          <var-decl name='dl_nr_migratory' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='657' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='overloaded' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='656' column='1'/>
+          <var-decl name='overloaded' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='658' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='pushable_dl_tasks_root' type-id='6fe1603d' visibility='default' filepath='kernel/sched/sched.h' line='663' column='1'/>
+          <var-decl name='pushable_dl_tasks_root' type-id='6fe1603d' visibility='default' filepath='kernel/sched/sched.h' line='665' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='running_bw' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='672' column='1'/>
+          <var-decl name='running_bw' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='674' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='640'>
-          <var-decl name='this_bw' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='683' column='1'/>
+          <var-decl name='this_bw' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='685' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='extra_bw' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='684' column='1'/>
+          <var-decl name='extra_bw' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='686' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='768'>
-          <var-decl name='bw_ratio' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='690' column='1'/>
+          <var-decl name='bw_ratio' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='692' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__2' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='kernel/sched/sched.h' line='650' column='1' id='8c6b5470'>
+      <class-decl name='__anonymous_struct__2' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='kernel/sched/sched.h' line='652' column='1' id='8c6b5470'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='curr' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='651' column='1'/>
+          <var-decl name='curr' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='653' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='next' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='652' column='1'/>
+          <var-decl name='next' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='654' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='root_domain' size-in-bits='14848' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='743' column='1' id='9cdca91a'>
+      <class-decl name='root_domain' size-in-bits='14848' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='745' column='1' id='9cdca91a'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='refcount' type-id='49178f86' visibility='default' filepath='kernel/sched/sched.h' line='744' column='1'/>
+          <var-decl name='refcount' type-id='49178f86' visibility='default' filepath='kernel/sched/sched.h' line='746' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='rto_count' type-id='49178f86' visibility='default' filepath='kernel/sched/sched.h' line='745' column='1'/>
+          <var-decl name='rto_count' type-id='49178f86' visibility='default' filepath='kernel/sched/sched.h' line='747' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='kernel/sched/sched.h' line='746' column='1'/>
+          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='kernel/sched/sched.h' line='748' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='span' type-id='b16b461b' visibility='default' filepath='kernel/sched/sched.h' line='747' column='1'/>
+          <var-decl name='span' type-id='b16b461b' visibility='default' filepath='kernel/sched/sched.h' line='749' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='online' type-id='b16b461b' visibility='default' filepath='kernel/sched/sched.h' line='748' column='1'/>
+          <var-decl name='online' type-id='b16b461b' visibility='default' filepath='kernel/sched/sched.h' line='750' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='overload' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='755' column='1'/>
+          <var-decl name='overload' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='757' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='352'>
-          <var-decl name='overutilized' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='758' column='1'/>
+          <var-decl name='overutilized' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='760' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='dlo_mask' type-id='b16b461b' visibility='default' filepath='kernel/sched/sched.h' line='764' column='1'/>
+          <var-decl name='dlo_mask' type-id='b16b461b' visibility='default' filepath='kernel/sched/sched.h' line='766' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='dlo_count' type-id='49178f86' visibility='default' filepath='kernel/sched/sched.h' line='765' column='1'/>
+          <var-decl name='dlo_count' type-id='49178f86' visibility='default' filepath='kernel/sched/sched.h' line='767' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='dl_bw' type-id='51a92649' visibility='default' filepath='kernel/sched/sched.h' line='766' column='1'/>
+          <var-decl name='dl_bw' type-id='51a92649' visibility='default' filepath='kernel/sched/sched.h' line='768' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='cpudl' type-id='a9cef929' visibility='default' filepath='kernel/sched/sched.h' line='767' column='1'/>
+          <var-decl name='cpudl' type-id='a9cef929' visibility='default' filepath='kernel/sched/sched.h' line='769' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='896'>
-          <var-decl name='rto_push_work' type-id='9281c70f' visibility='default' filepath='kernel/sched/sched.h' line='773' column='1'/>
+          <var-decl name='rto_push_work' type-id='9281c70f' visibility='default' filepath='kernel/sched/sched.h' line='775' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1088'>
-          <var-decl name='rto_lock' type-id='f5c90b3f' visibility='default' filepath='kernel/sched/sched.h' line='774' column='1'/>
+          <var-decl name='rto_lock' type-id='f5c90b3f' visibility='default' filepath='kernel/sched/sched.h' line='776' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1120'>
-          <var-decl name='rto_loop' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='776' column='1'/>
+          <var-decl name='rto_loop' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='778' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1152'>
-          <var-decl name='rto_cpu' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='777' column='1'/>
+          <var-decl name='rto_cpu' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='779' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1184'>
-          <var-decl name='rto_loop_next' type-id='49178f86' visibility='default' filepath='kernel/sched/sched.h' line='779' column='1'/>
+          <var-decl name='rto_loop_next' type-id='49178f86' visibility='default' filepath='kernel/sched/sched.h' line='781' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1216'>
-          <var-decl name='rto_loop_start' type-id='49178f86' visibility='default' filepath='kernel/sched/sched.h' line='780' column='1'/>
+          <var-decl name='rto_loop_start' type-id='49178f86' visibility='default' filepath='kernel/sched/sched.h' line='782' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1280'>
-          <var-decl name='rto_mask' type-id='b16b461b' visibility='default' filepath='kernel/sched/sched.h' line='786' column='1'/>
+          <var-decl name='rto_mask' type-id='b16b461b' visibility='default' filepath='kernel/sched/sched.h' line='788' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1344'>
-          <var-decl name='cpupri' type-id='afe3b3de' visibility='default' filepath='kernel/sched/sched.h' line='787' column='1'/>
+          <var-decl name='cpupri' type-id='afe3b3de' visibility='default' filepath='kernel/sched/sched.h' line='789' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='14464'>
-          <var-decl name='max_cpu_capacity' type-id='12dbc6b5' visibility='default' filepath='kernel/sched/sched.h' line='790' column='1'/>
+          <var-decl name='max_cpu_capacity' type-id='12dbc6b5' visibility='default' filepath='kernel/sched/sched.h' line='792' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='14656'>
-          <var-decl name='pd' type-id='30f9749f' visibility='default' filepath='kernel/sched/sched.h' line='796' column='1'/>
+          <var-decl name='pd' type-id='30f9749f' visibility='default' filepath='kernel/sched/sched.h' line='798' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='14720'>
-          <var-decl name='max_cap_orig_cpu' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='800' column='1'/>
+          <var-decl name='max_cap_orig_cpu' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='802' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='14752'>
-          <var-decl name='min_cap_orig_cpu' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='800' column='1'/>
+          <var-decl name='min_cap_orig_cpu' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='802' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='14784'>
-          <var-decl name='mid_cap_orig_cpu' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='802' column='1'/>
+          <var-decl name='mid_cap_orig_cpu' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='804' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='dl_bw' size-in-bits='192' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='283' column='1' id='51a92649'>
+      <class-decl name='dl_bw' size-in-bits='192' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='285' column='1' id='51a92649'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='lock' type-id='f5c90b3f' visibility='default' filepath='kernel/sched/sched.h' line='284' column='1'/>
+          <var-decl name='lock' type-id='f5c90b3f' visibility='default' filepath='kernel/sched/sched.h' line='286' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='bw' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='285' column='1'/>
+          <var-decl name='bw' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='287' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='total_bw' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='286' column='1'/>
+          <var-decl name='total_bw' type-id='91ce1af9' visibility='default' filepath='kernel/sched/sched.h' line='288' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='cpudl' size-in-bits='192' is-struct='yes' visibility='default' filepath='kernel/sched/cpudeadline.h' line='11' column='1' id='a9cef929'>
@@ -111413,26 +111164,26 @@
           <var-decl name='mask' type-id='b16b461b' visibility='default' filepath='kernel/sched/cpupri.h' line='12' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='max_cpu_capacity' size-in-bits='192' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='725' column='1' id='12dbc6b5'>
+      <class-decl name='max_cpu_capacity' size-in-bits='192' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='727' column='1' id='12dbc6b5'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='lock' type-id='f5c90b3f' visibility='default' filepath='kernel/sched/sched.h' line='726' column='1'/>
+          <var-decl name='lock' type-id='f5c90b3f' visibility='default' filepath='kernel/sched/sched.h' line='728' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='val' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='727' column='1'/>
+          <var-decl name='val' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='729' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='cpu' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='728' column='1'/>
+          <var-decl name='cpu' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='730' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='perf_domain' size-in-bits='256' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='719' column='1' id='f2e22af7'>
+      <class-decl name='perf_domain' size-in-bits='256' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='721' column='1' id='f2e22af7'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='em_pd' type-id='ce714046' visibility='default' filepath='kernel/sched/sched.h' line='720' column='1'/>
+          <var-decl name='em_pd' type-id='ce714046' visibility='default' filepath='kernel/sched/sched.h' line='722' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='next' type-id='30f9749f' visibility='default' filepath='kernel/sched/sched.h' line='721' column='1'/>
+          <var-decl name='next' type-id='30f9749f' visibility='default' filepath='kernel/sched/sched.h' line='723' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='kernel/sched/sched.h' line='722' column='1'/>
+          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='kernel/sched/sched.h' line='724' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='em_perf_domain' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/energy_model.h' line='37' column='1' id='f8d03d40'>
@@ -111609,50 +111360,50 @@
           <var-decl name='span' type-id='c99b5ecd' visibility='default' filepath='include/linux/sched/topology.h' line='158' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='sched_group' size-in-bits='256' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='1425' column='1' id='8b6491f4'>
+      <class-decl name='sched_group' size-in-bits='256' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='1427' column='1' id='8b6491f4'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='next' type-id='f3dcd492' visibility='default' filepath='kernel/sched/sched.h' line='1426' column='1'/>
+          <var-decl name='next' type-id='f3dcd492' visibility='default' filepath='kernel/sched/sched.h' line='1428' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='ref' type-id='49178f86' visibility='default' filepath='kernel/sched/sched.h' line='1427' column='1'/>
+          <var-decl name='ref' type-id='49178f86' visibility='default' filepath='kernel/sched/sched.h' line='1429' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='group_weight' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='1429' column='1'/>
+          <var-decl name='group_weight' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='1431' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='sgc' type-id='29a48d3d' visibility='default' filepath='kernel/sched/sched.h' line='1430' column='1'/>
+          <var-decl name='sgc' type-id='29a48d3d' visibility='default' filepath='kernel/sched/sched.h' line='1432' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='asym_prefer_cpu' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='1431' column='1'/>
+          <var-decl name='asym_prefer_cpu' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='1433' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='cpumask' type-id='c99b5ecd' visibility='default' filepath='kernel/sched/sched.h' line='1440' column='1'/>
+          <var-decl name='cpumask' type-id='c99b5ecd' visibility='default' filepath='kernel/sched/sched.h' line='1442' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='sched_group_capacity' size-in-bits='384' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='1406' column='1' id='ea3de64d'>
+      <class-decl name='sched_group_capacity' size-in-bits='384' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='1408' column='1' id='ea3de64d'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='ref' type-id='49178f86' visibility='default' filepath='kernel/sched/sched.h' line='1407' column='1'/>
+          <var-decl name='ref' type-id='49178f86' visibility='default' filepath='kernel/sched/sched.h' line='1409' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='capacity' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='1412' column='1'/>
+          <var-decl name='capacity' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='1414' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='min_capacity' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='1413' column='1'/>
+          <var-decl name='min_capacity' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='1415' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='max_capacity' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='1414' column='1'/>
+          <var-decl name='max_capacity' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='1416' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='next_update' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='1415' column='1'/>
+          <var-decl name='next_update' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='1417' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='imbalance' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='1416' column='1'/>
+          <var-decl name='imbalance' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='1418' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='352'>
-          <var-decl name='id' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='1419' column='1'/>
+          <var-decl name='id' type-id='95e97e5e' visibility='default' filepath='kernel/sched/sched.h' line='1421' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='cpumask' type-id='c99b5ecd' visibility='default' filepath='kernel/sched/sched.h' line='1422' column='1'/>
+          <var-decl name='cpumask' type-id='c99b5ecd' visibility='default' filepath='kernel/sched/sched.h' line='1424' column='1'/>
         </data-member>
       </class-decl>
       <union-decl name='__anonymous_union__' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/sched/topology.h' line='140' column='1' id='52c6c1a9'>
@@ -111693,19 +111444,19 @@
       </class-decl>
       <typedef-decl name='cpu_stop_fn_t' type-id='b9b212f5' filepath='include/linux/stop_machine.h' line='20' column='1' id='87dfefa3'/>
       <typedef-decl name='call_single_data_t' type-id='bb75ea85' filepath='include/linux/smp.h' line='26' column='1' id='223a68bd'/>
-      <class-decl name='rq_flags' size-in-bits='128' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='1149' column='1' id='16588ac8'>
+      <class-decl name='rq_flags' size-in-bits='128' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='1151' column='1' id='16588ac8'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='1150' column='1'/>
+          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='kernel/sched/sched.h' line='1152' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='cookie' type-id='3cb90f9b' visibility='default' filepath='kernel/sched/sched.h' line='1151' column='1'/>
+          <var-decl name='cookie' type-id='3cb90f9b' visibility='default' filepath='kernel/sched/sched.h' line='1153' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='clock_update_flags' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='1158' column='1'/>
+          <var-decl name='clock_update_flags' type-id='f0981eeb' visibility='default' filepath='kernel/sched/sched.h' line='1160' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='pin_cookie' is-struct='yes' visibility='default' filepath='include/linux/lockdep.h' line='451' column='1' id='3cb90f9b'/>
-      <class-decl name='cfs_bandwidth' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='335' column='1' id='68e4a3af'/>
+      <class-decl name='cfs_bandwidth' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='337' column='1' id='68e4a3af'/>
       <class-decl name='sched_param' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/sched/types.h' line='7' column='1' id='0897719a'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='sched_priority' type-id='95e97e5e' visibility='default' filepath='include/uapi/linux/sched/types.h' line='8' column='1'/>
@@ -112351,66 +112102,66 @@
           <var-decl name='last_use' type-id='95e97e5e' visibility='default' filepath='include/linux/blk-cgroup.h' line='145' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='bpf_prog' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/filter.h' line='480' column='1' id='facd5338'>
+      <class-decl name='bpf_prog' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/filter.h' line='519' column='1' id='facd5338'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='pages' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='481' column='1'/>
+          <var-decl name='pages' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='520' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='jited' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='482' column='1'/>
+          <var-decl name='jited' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='521' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1'>
-          <var-decl name='jit_requested' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='483' column='1'/>
+          <var-decl name='jit_requested' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='522' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2'>
-          <var-decl name='undo_set_mem' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='484' column='1'/>
+          <var-decl name='undo_set_mem' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='523' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3'>
-          <var-decl name='gpl_compatible' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='485' column='1'/>
+          <var-decl name='gpl_compatible' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='524' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='4'>
-          <var-decl name='cb_access' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='486' column='1'/>
+          <var-decl name='cb_access' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='525' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5'>
-          <var-decl name='dst_needed' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='487' column='1'/>
+          <var-decl name='dst_needed' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='526' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6'>
-          <var-decl name='blinded' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='488' column='1'/>
+          <var-decl name='blinded' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='527' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='7'>
-          <var-decl name='is_func' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='489' column='1'/>
+          <var-decl name='is_func' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='528' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='8'>
-          <var-decl name='kprobe_override' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='490' column='1'/>
+          <var-decl name='kprobe_override' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='529' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='9'>
-          <var-decl name='has_callchain_buf' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='491' column='1'/>
+          <var-decl name='has_callchain_buf' type-id='1dc6a898' visibility='default' filepath='include/linux/filter.h' line='530' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='type' type-id='b80df76a' visibility='default' filepath='include/linux/filter.h' line='492' column='1'/>
+          <var-decl name='type' type-id='b80df76a' visibility='default' filepath='include/linux/filter.h' line='531' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='expected_attach_type' type-id='67ce11ed' visibility='default' filepath='include/linux/filter.h' line='493' column='1'/>
+          <var-decl name='expected_attach_type' type-id='67ce11ed' visibility='default' filepath='include/linux/filter.h' line='532' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='len' type-id='19c2251e' visibility='default' filepath='include/linux/filter.h' line='494' column='1'/>
+          <var-decl name='len' type-id='19c2251e' visibility='default' filepath='include/linux/filter.h' line='533' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='jited_len' type-id='19c2251e' visibility='default' filepath='include/linux/filter.h' line='495' column='1'/>
+          <var-decl name='jited_len' type-id='19c2251e' visibility='default' filepath='include/linux/filter.h' line='534' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='160'>
-          <var-decl name='tag' type-id='d2f7b56a' visibility='default' filepath='include/linux/filter.h' line='496' column='1'/>
+          <var-decl name='tag' type-id='d2f7b56a' visibility='default' filepath='include/linux/filter.h' line='535' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='aux' type-id='1e6beae1' visibility='default' filepath='include/linux/filter.h' line='497' column='1'/>
+          <var-decl name='aux' type-id='1e6beae1' visibility='default' filepath='include/linux/filter.h' line='536' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='orig_prog' type-id='e93ad915' visibility='default' filepath='include/linux/filter.h' line='498' column='1'/>
+          <var-decl name='orig_prog' type-id='e93ad915' visibility='default' filepath='include/linux/filter.h' line='537' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='bpf_func' type-id='531a7450' visibility='default' filepath='include/linux/filter.h' line='499' column='1'/>
+          <var-decl name='bpf_func' type-id='531a7450' visibility='default' filepath='include/linux/filter.h' line='538' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='' type-id='fe772793' visibility='default' filepath='include/linux/filter.h' line='502' column='1'/>
+          <var-decl name='' type-id='fe772793' visibility='default' filepath='include/linux/filter.h' line='541' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='bpf_prog_array' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/bpf.h' line='364' column='1' id='c75c7b06'>
@@ -112729,23 +112480,7 @@
           <var-decl name='inode' type-id='c5a4eb7f' visibility='default' filepath='fs/verity/fsverity_private.h' line='77' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='fsverity_operations' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/fsverity.h' line='18' column='1' id='5f0d764c'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='begin_enable_verity' type-id='4da4101d' visibility='default' filepath='include/linux/fsverity.h' line='33' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='end_enable_verity' type-id='f3a5c46a' visibility='default' filepath='include/linux/fsverity.h' line='55' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='get_verity_descriptor' type-id='c60354f3' visibility='default' filepath='include/linux/fsverity.h' line='72' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='read_merkle_tree_page' type-id='68b31938' visibility='default' filepath='include/linux/fsverity.h' line='93' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='write_merkle_tree_block' type-id='c748f227' visibility='default' filepath='include/linux/fsverity.h' line='110' column='1'/>
-        </data-member>
-      </class-decl>
+      <class-decl name='fsverity_operations' is-struct='yes' visibility='default' is-declaration-only='yes' id='5f0d764c'/>
       <class-decl name='hd_geometry' is-struct='yes' visibility='default' is-declaration-only='yes' id='28e89e7e'/>
       <class-decl name='iommu_fwspec' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/iommu.h' line='493' column='1' id='0d6f83ff'>
         <data-member access='public' layout-offset-in-bits='0'>
@@ -120880,7 +120615,7 @@
           <var-decl name='d_real' type-id='3cce524c' visibility='default' filepath='include/linux/dcache.h' line='152' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='' type-id='70acbd94' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
+          <var-decl name='' type-id='82eadc08' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='896'>
           <var-decl name='android_kabi_reserved2' type-id='91ce1af9' visibility='default' filepath='include/linux/dcache.h' line='156' column='1'/>
@@ -120892,12 +120627,12 @@
           <var-decl name='android_kabi_reserved4' type-id='91ce1af9' visibility='default' filepath='include/linux/dcache.h' line='158' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__36' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='70acbd94'>
+      <union-decl name='__anonymous_union__36' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='82eadc08'>
         <data-member access='public'>
           <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide77' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
+          <var-decl name='' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
         </data-member>
         <data-member access='public'>
           <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
@@ -123983,14 +123718,14 @@
         <parameter type-id='f5b09090'/>
         <return type-id='c894953d'/>
       </function-decl>
-      <function-decl name='__hrtimer_get_remaining' mangled-name='__hrtimer_get_remaining' filepath='kernel/time/hrtimer.c' line='1205' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__hrtimer_get_remaining'>
-        <parameter type-id='1ce53783' name='timer' filepath='kernel/time/hrtimer.c' line='1205' column='1'/>
-        <parameter type-id='b50a4934' name='adjust' filepath='kernel/time/hrtimer.c' line='1205' column='1'/>
+      <function-decl name='__hrtimer_get_remaining' mangled-name='__hrtimer_get_remaining' filepath='kernel/time/hrtimer.c' line='1251' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__hrtimer_get_remaining'>
+        <parameter type-id='1ce53783' name='timer' filepath='kernel/time/hrtimer.c' line='1251' column='1'/>
+        <parameter type-id='b50a4934' name='adjust' filepath='kernel/time/hrtimer.c' line='1251' column='1'/>
         <return type-id='fbc017ef'/>
       </function-decl>
-      <function-decl name='hrtimer_init_sleeper' mangled-name='hrtimer_init_sleeper' filepath='kernel/time/hrtimer.c' line='1672' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hrtimer_init_sleeper'>
-        <parameter type-id='6972ad8b' name='sl' filepath='kernel/time/hrtimer.c' line='1672' column='1'/>
-        <parameter type-id='f23e2572' name='task' filepath='kernel/time/hrtimer.c' line='1672' column='1'/>
+      <function-decl name='hrtimer_init_sleeper' mangled-name='hrtimer_init_sleeper' filepath='kernel/time/hrtimer.c' line='1718' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hrtimer_init_sleeper'>
+        <parameter type-id='6972ad8b' name='sl' filepath='kernel/time/hrtimer.c' line='1718' column='1'/>
+        <parameter type-id='f23e2572' name='task' filepath='kernel/time/hrtimer.c' line='1718' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
       <function-decl name='timerqueue_add' mangled-name='timerqueue_add' filepath='include/linux/timerqueue.h' line='20' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='timerqueue_add'>
@@ -124124,6 +123859,57 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='kernel/trace/bpf_trace.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='f67e137c' size-in-bits='infinite' id='3f814540'>
+        <subrange length='infinite' type-id='7ff19f0f' id='031f2035'/>
+      </array-type-def>
+      <class-decl name='bpf_cgroup_storage_map' is-struct='yes' visibility='default' is-declaration-only='yes' id='0ad68707'/>
+      <class-decl name='bpf_prog_array_item' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/bpf.h' line='359' column='1' id='f67e137c'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='prog' type-id='bdcee7ae' visibility='default' filepath='include/linux/bpf.h' line='360' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='cgroup_storage' type-id='531c24d0' visibility='default' filepath='include/linux/bpf.h' line='361' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bpf_cgroup_storage' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/bpf-cgroup.h' line='34' column='1' id='15881542'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='buf' type-id='b1253746' visibility='default' filepath='include/linux/bpf-cgroup.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='map' type-id='b6a33eaf' visibility='default' filepath='include/linux/bpf-cgroup.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='key' type-id='d8d7111e' visibility='default' filepath='include/linux/bpf-cgroup.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='include/linux/bpf-cgroup.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='node' type-id='2a8a6332' visibility='default' filepath='include/linux/bpf-cgroup.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/linux/bpf-cgroup.h' line='40' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bpf_storage_buffer' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/bpf-cgroup.h' line='29' column='1' id='0ef5c7e0'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/linux/bpf-cgroup.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='data' type-id='e84913bd' visibility='default' filepath='include/linux/bpf-cgroup.h' line='31' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bpf_cgroup_storage_key' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='78' column='1' id='d8d7111e'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cgroup_inode_id' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='attach_type' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='80' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='15881542' size-in-bits='64' id='531c24d0'/>
+      <pointer-type-def type-id='0ad68707' size-in-bits='64' id='b6a33eaf'/>
+      <pointer-type-def type-id='0ef5c7e0' size-in-bits='64' id='b1253746'/>
       <function-decl name='bpf_trace_run6' mangled-name='bpf_trace_run6' filepath='kernel/trace/bpf_trace.c' line='1207' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bpf_trace_run6'>
         <parameter type-id='bdcee7ae' name='prog' filepath='kernel/trace/bpf_trace.c' line='1207' column='1'/>
         <parameter type-id='91ce1af9' name='arg0' filepath='kernel/trace/bpf_trace.c' line='1207' column='1'/>
@@ -127158,7 +126944,7 @@
       <pointer-type-def type-id='1ca1bfac' size-in-bits='64' id='c0a08bbe'/>
       <pointer-type-def type-id='6071dd22' size-in-bits='64' id='ba77b4f4'/>
       <pointer-type-def type-id='182ef894' size-in-bits='64' id='d78909c6'/>
-      <function-decl name='hci_alloc_dev' mangled-name='hci_alloc_dev' filepath='net/bluetooth/hci_core.c' line='3056' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hci_alloc_dev'>
+      <function-decl name='hci_alloc_dev' mangled-name='hci_alloc_dev' filepath='net/bluetooth/hci_core.c' line='3070' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hci_alloc_dev'>
         <return type-id='9ad862e7'/>
       </function-decl>
       <function-decl name='bt_err' mangled-name='bt_err' filepath='include/net/bluetooth/bluetooth.h' line='130' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bt_err'>
@@ -127166,12 +126952,12 @@
         <parameter is-variadic='yes'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='hci_free_dev' mangled-name='hci_free_dev' filepath='net/bluetooth/hci_core.c' line='3149' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hci_free_dev'>
-        <parameter type-id='9ad862e7' name='hdev' filepath='net/bluetooth/hci_core.c' line='3149' column='1'/>
+      <function-decl name='hci_free_dev' mangled-name='hci_free_dev' filepath='net/bluetooth/hci_core.c' line='3163' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hci_free_dev'>
+        <parameter type-id='9ad862e7' name='hdev' filepath='net/bluetooth/hci_core.c' line='3163' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='hci_register_dev' mangled-name='hci_register_dev' filepath='net/bluetooth/hci_core.c' line='3157' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hci_register_dev'>
-        <parameter type-id='9ad862e7' name='hdev' filepath='net/bluetooth/hci_core.c' line='3157' column='1'/>
+      <function-decl name='hci_register_dev' mangled-name='hci_register_dev' filepath='net/bluetooth/hci_core.c' line='3171' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hci_register_dev'>
+        <parameter type-id='9ad862e7' name='hdev' filepath='net/bluetooth/hci_core.c' line='3171' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-decl name='rfkill_alloc' mangled-name='rfkill_alloc' filepath='include/linux/rfkill.h' line='79' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rfkill_alloc'>
@@ -127190,17 +126976,17 @@
         <parameter type-id='c5b94c75'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='hci_unregister_dev' mangled-name='hci_unregister_dev' filepath='net/bluetooth/hci_core.c' line='3262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hci_unregister_dev'>
-        <parameter type-id='9ad862e7' name='hdev' filepath='net/bluetooth/hci_core.c' line='3262' column='1'/>
+      <function-decl name='hci_unregister_dev' mangled-name='hci_unregister_dev' filepath='net/bluetooth/hci_core.c' line='3276' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hci_unregister_dev'>
+        <parameter type-id='9ad862e7' name='hdev' filepath='net/bluetooth/hci_core.c' line='3276' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
       <function-decl name='rfkill_unregister' mangled-name='rfkill_unregister' filepath='include/linux/rfkill.h' line='130' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rfkill_unregister'>
         <parameter type-id='c5b94c75'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='hci_recv_frame' mangled-name='hci_recv_frame' filepath='net/bluetooth/hci_core.c' line='3364' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hci_recv_frame'>
-        <parameter type-id='9ad862e7' name='hdev' filepath='net/bluetooth/hci_core.c' line='3364' column='1'/>
-        <parameter type-id='0fbf3cfd' name='skb' filepath='net/bluetooth/hci_core.c' line='3364' column='1'/>
+      <function-decl name='hci_recv_frame' mangled-name='hci_recv_frame' filepath='net/bluetooth/hci_core.c' line='3378' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hci_recv_frame'>
+        <parameter type-id='9ad862e7' name='hdev' filepath='net/bluetooth/hci_core.c' line='3378' column='1'/>
+        <parameter type-id='0fbf3cfd' name='skb' filepath='net/bluetooth/hci_core.c' line='3378' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-type size-in-bits='64' id='d7322b1f'>
@@ -127264,6 +127050,217 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='net/core/dev.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='bb08c7e1' size-in-bits='infinite' id='f443352a'>
+        <subrange length='infinite' type-id='7ff19f0f' id='031f2035'/>
+      </array-type-def>
+      <class-decl name='libipw_device' is-struct='yes' visibility='default' is-declaration-only='yes' id='9c91a761'/>
+      <array-type-def dimensions='1' type-id='aa80c027' size-in-bits='256' id='c73a16a3'>
+        <subrange length='8' type-id='7ff19f0f' id='56e0c0b1'/>
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='b151a3a8' size-in-bits='64' id='4a744ea1'>
+        <subrange length='8' type-id='7ff19f0f' id='56e0c0b1'/>
+      </array-type-def>
+      <array-type-def dimensions='2' type-id='b151a3a8' size-in-bits='384' id='2d507faf'>
+        <subrange length='8' type-id='7ff19f0f' id='56e0c0b1'/>
+        <subrange length='6' type-id='7ff19f0f' id='52fa524b'/>
+      </array-type-def>
+      <typedef-decl name='iw_handler' type-id='2c8ff697' filepath='include/net/iw_handler.h' line='315' column='1' id='bcc5cab3'/>
+      <class-decl name='iw_request_info' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/net/iw_handler.h' line='304' column='1' id='e90b3b44'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='d315442e' visibility='default' filepath='include/net/iw_handler.h' line='305' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='flags' type-id='d315442e' visibility='default' filepath='include/net/iw_handler.h' line='306' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_point' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='691' column='1' id='db4e746c'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pointer' type-id='eaa32e2f' visibility='default' filepath='include/uapi/linux/wireless.h' line='692' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='length' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='693' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='flags' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='694' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_param' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='680' column='1' id='b024252b'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='value' type-id='3158a266' visibility='default' filepath='include/uapi/linux/wireless.h' line='681' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='fixed' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='682' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='disabled' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='683' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='flags' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='684' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_freq' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='706' column='1' id='bc1ac22c'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='m' type-id='3158a266' visibility='default' filepath='include/uapi/linux/wireless.h' line='707' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='e' type-id='b55def60' visibility='default' filepath='include/uapi/linux/wireless.h' line='708' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='i' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='709' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='56'>
+          <var-decl name='flags' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='710' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_quality' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='716' column='1' id='aa80c027'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='qual' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='717' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='level' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='719' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='noise' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='720' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='updated' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='721' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_priv_args' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='1063' column='1' id='0c842ad9'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='1064' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='set_args' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='1065' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='get_args' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='1066' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='name' type-id='ac1fa8c0' visibility='default' filepath='include/uapi/linux/wireless.h' line='1067' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_statistics' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='881' column='1' id='1c8cc2fd'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='status' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='882' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='qual' type-id='aa80c027' visibility='default' filepath='include/uapi/linux/wireless.h' line='885' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='discard' type-id='832938ed' visibility='default' filepath='include/uapi/linux/wireless.h' line='887' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='miss' type-id='6a2a3473' visibility='default' filepath='include/uapi/linux/wireless.h' line='888' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_discarded' size-in-bits='160' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='731' column='1' id='832938ed'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='nwid' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='732' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='code' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='733' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='fragment' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='734' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='retries' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='735' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='misc' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='736' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_missed' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='743' column='1' id='6a2a3473'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='beacon' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='744' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_spy_data' size-in-bits='800' is-struct='yes' visibility='default' filepath='include/net/iw_handler.h' line='396' column='1' id='f8292115'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='spy_number' type-id='95e97e5e' visibility='default' filepath='include/net/iw_handler.h' line='398' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='spy_address' type-id='2d507faf' visibility='default' filepath='include/net/iw_handler.h' line='399' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='spy_stat' type-id='c73a16a3' visibility='default' filepath='include/net/iw_handler.h' line='400' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='spy_thr_low' type-id='aa80c027' visibility='default' filepath='include/net/iw_handler.h' line='402' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='spy_thr_high' type-id='aa80c027' visibility='default' filepath='include/net/iw_handler.h' line='403' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='spy_thr_under' type-id='4a744ea1' visibility='default' filepath='include/net/iw_handler.h' line='404' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='u_char' type-id='002ac4a6' filepath='include/linux/types.h' line='84' column='1' id='b151a3a8'/>
+      <union-decl name='iwreq_data' size-in-bits='128' visibility='default' filepath='include/uapi/linux/wireless.h' line='902' column='1' id='ed626d0d'>
+        <data-member access='public'>
+          <var-decl name='name' type-id='ac1fa8c0' visibility='default' filepath='include/uapi/linux/wireless.h' line='904' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='essid' type-id='db4e746c' visibility='default' filepath='include/uapi/linux/wireless.h' line='908' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='nwid' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='909' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='freq' type-id='bc1ac22c' visibility='default' filepath='include/uapi/linux/wireless.h' line='910' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='sens' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='914' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='bitrate' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='915' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='txpower' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='916' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='rts' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='917' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='frag' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='918' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='mode' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='919' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='retry' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='920' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='encoding' type-id='db4e746c' visibility='default' filepath='include/uapi/linux/wireless.h' line='922' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='power' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='923' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='qual' type-id='aa80c027' visibility='default' filepath='include/uapi/linux/wireless.h' line='924' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='ap_addr' type-id='5221b18a' visibility='default' filepath='include/uapi/linux/wireless.h' line='926' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='addr' type-id='5221b18a' visibility='default' filepath='include/uapi/linux/wireless.h' line='927' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='param' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='929' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='data' type-id='db4e746c' visibility='default' filepath='include/uapi/linux/wireless.h' line='930' column='1'/>
+        </data-member>
+      </union-decl>
+      <class-decl name='__anonymous_struct__2' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/cpu_rmap.h' line='31' column='1' id='bb08c7e1'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='index' type-id='1dc6a898' visibility='default' filepath='include/linux/cpu_rmap.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='dist' type-id='1dc6a898' visibility='default' filepath='include/linux/cpu_rmap.h' line='33' column='1'/>
+        </data-member>
+      </class-decl>
       <class-decl name='rps_sock_flow_table' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='687' column='1' id='512813dd'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='mask' type-id='19c2251e' visibility='default' filepath='include/linux/netdevice.h' line='688' column='1'/>
@@ -127277,6 +127274,17 @@
         <enumerator name='SKB_REASON_CONSUMED' value='0'/>
         <enumerator name='SKB_REASON_DROPPED' value='1'/>
       </enum-decl>
+      <qualified-type-def type-id='bcc5cab3' const='yes' id='208298e3'/>
+      <pointer-type-def type-id='208298e3' size-in-bits='64' id='f696846b'/>
+      <qualified-type-def type-id='0c842ad9' const='yes' id='afa36b70'/>
+      <pointer-type-def type-id='afa36b70' size-in-bits='64' id='d841feae'/>
+      <pointer-type-def type-id='97488913' size-in-bits='64' id='2c8ff697'/>
+      <pointer-type-def type-id='e90b3b44' size-in-bits='64' id='4780e252'/>
+      <pointer-type-def type-id='f8292115' size-in-bits='64' id='96efb615'/>
+      <pointer-type-def type-id='1c8cc2fd' size-in-bits='64' id='003642fd'/>
+      <pointer-type-def type-id='cfdbff8a' size-in-bits='64' id='55e2a83c'/>
+      <pointer-type-def type-id='ed626d0d' size-in-bits='64' id='00e2a7ce'/>
+      <pointer-type-def type-id='9c91a761' size-in-bits='64' id='29244949'/>
       <pointer-type-def type-id='512813dd' size-in-bits='64' id='2293f1dd'/>
       <function-decl name='netdev_rx_handler_unregister' mangled-name='netdev_rx_handler_unregister' filepath='net/core/dev.c' line='4722' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_rx_handler_unregister'>
         <parameter type-id='68a2d05b' name='dev' filepath='net/core/dev.c' line='4722' column='1'/>
@@ -127409,6 +127417,17 @@
         <parameter type-id='f9f4b16f' name='mask' filepath='net/core/dev.c' line='9568' column='1'/>
         <return type-id='f9f4b16f'/>
       </function-decl>
+      <function-type size-in-bits='64' id='97488913'>
+        <parameter type-id='68a2d05b'/>
+        <parameter type-id='4780e252'/>
+        <parameter type-id='00e2a7ce'/>
+        <parameter type-id='26a90f95'/>
+        <return type-id='95e97e5e'/>
+      </function-type>
+      <function-type size-in-bits='64' id='cfdbff8a'>
+        <parameter type-id='68a2d05b'/>
+        <return type-id='003642fd'/>
+      </function-type>
     </abi-instr>
     <abi-instr address-size='64' path='net/core/dev_addr_lists.c' language='LANG_C89'>
       <function-decl name='dev_uc_sync_multiple' mangled-name='dev_uc_sync_multiple' filepath='net/core/dev_addr_lists.c' line='567' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_uc_sync_multiple'>
@@ -127894,7 +127913,7 @@
         </data-member>
       </class-decl>
       <pointer-type-def type-id='379be6ec' size-in-bits='64' id='0b8ca8fa'/>
-      <var-decl name='flow_keys_basic_dissector' type-id='379be6ec' mangled-name='flow_keys_basic_dissector' visibility='default' filepath='net/core/flow_dissector.c' line='1448' column='1' elf-symbol-id='flow_keys_basic_dissector'/>
+      <var-decl name='flow_keys_basic_dissector' type-id='379be6ec' mangled-name='flow_keys_basic_dissector' visibility='default' filepath='net/core/flow_dissector.c' line='1452' column='1' elf-symbol-id='flow_keys_basic_dissector'/>
       <function-decl name='__skb_flow_dissect' mangled-name='__skb_flow_dissect' filepath='net/core/flow_dissector.c' line='607' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__skb_flow_dissect'>
         <parameter type-id='11f4a000' name='skb' filepath='net/core/flow_dissector.c' line='607' column='1'/>
         <parameter type-id='0b8ca8fa' name='flow_dissector' filepath='net/core/flow_dissector.c' line='608' column='1'/>
@@ -128096,7 +128115,7 @@
     </abi-instr>
     <abi-instr address-size='64' path='net/core/sock.c' language='LANG_C89'>
       <pointer-type-def type-id='2a693ac3' size-in-bits='64' id='896f1b83'/>
-      <function-decl name='net_enable_timestamp' mangled-name='net_enable_timestamp' filepath='include/linux/netdevice.h' line='4378' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='net_enable_timestamp'>
+      <function-decl name='net_enable_timestamp' mangled-name='net_enable_timestamp' filepath='include/linux/netdevice.h' line='4382' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='net_enable_timestamp'>
         <return type-id='48b5725f'/>
       </function-decl>
       <function-decl name='sock_wfree' mangled-name='sock_wfree' filepath='net/core/sock.c' line='1806' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_wfree'>
@@ -128545,11 +128564,11 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='net/ipv4/ip_output.c' language='LANG_C89'>
-      <function-decl name='__ip_queue_xmit' mangled-name='__ip_queue_xmit' filepath='net/ipv4/ip_output.c' line='427' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__ip_queue_xmit'>
-        <parameter type-id='f772df6d' name='sk' filepath='net/ipv4/ip_output.c' line='427' column='1'/>
-        <parameter type-id='0fbf3cfd' name='skb' filepath='net/ipv4/ip_output.c' line='427' column='1'/>
-        <parameter type-id='b1fd62ba' name='fl' filepath='net/ipv4/ip_output.c' line='427' column='1'/>
-        <parameter type-id='8f048e17' name='tos' filepath='net/ipv4/ip_output.c' line='428' column='1'/>
+      <function-decl name='__ip_queue_xmit' mangled-name='__ip_queue_xmit' filepath='net/ipv4/ip_output.c' line='428' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__ip_queue_xmit'>
+        <parameter type-id='f772df6d' name='sk' filepath='net/ipv4/ip_output.c' line='428' column='1'/>
+        <parameter type-id='0fbf3cfd' name='skb' filepath='net/ipv4/ip_output.c' line='428' column='1'/>
+        <parameter type-id='b1fd62ba' name='fl' filepath='net/ipv4/ip_output.c' line='428' column='1'/>
+        <parameter type-id='8f048e17' name='tos' filepath='net/ipv4/ip_output.c' line='429' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
     </abi-instr>
@@ -130673,25 +130692,25 @@
         <parameter type-id='95e97e5e' name='flags' filepath='net/socket.c' line='887' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sock_wake_async' mangled-name='sock_wake_async' filepath='net/socket.c' line='1251' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_wake_async'>
-        <parameter type-id='99f34ac1' name='wq' filepath='net/socket.c' line='1251' column='1'/>
-        <parameter type-id='95e97e5e' name='how' filepath='net/socket.c' line='1251' column='1'/>
-        <parameter type-id='95e97e5e' name='band' filepath='net/socket.c' line='1251' column='1'/>
+      <function-decl name='sock_wake_async' mangled-name='sock_wake_async' filepath='net/socket.c' line='1253' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_wake_async'>
+        <parameter type-id='99f34ac1' name='wq' filepath='net/socket.c' line='1253' column='1'/>
+        <parameter type-id='95e97e5e' name='how' filepath='net/socket.c' line='1253' column='1'/>
+        <parameter type-id='95e97e5e' name='band' filepath='net/socket.c' line='1253' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sock_create' mangled-name='sock_create' filepath='net/socket.c' line='1412' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_create'>
-        <parameter type-id='95e97e5e' name='family' filepath='net/socket.c' line='1412' column='1'/>
-        <parameter type-id='95e97e5e' name='type' filepath='net/socket.c' line='1412' column='1'/>
-        <parameter type-id='95e97e5e' name='protocol' filepath='net/socket.c' line='1412' column='1'/>
-        <parameter type-id='1a7bb5c8' name='res' filepath='net/socket.c' line='1412' column='1'/>
+      <function-decl name='sock_create' mangled-name='sock_create' filepath='net/socket.c' line='1414' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_create'>
+        <parameter type-id='95e97e5e' name='family' filepath='net/socket.c' line='1414' column='1'/>
+        <parameter type-id='95e97e5e' name='type' filepath='net/socket.c' line='1414' column='1'/>
+        <parameter type-id='95e97e5e' name='protocol' filepath='net/socket.c' line='1414' column='1'/>
+        <parameter type-id='1a7bb5c8' name='res' filepath='net/socket.c' line='1414' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sock_create_kern' mangled-name='sock_create_kern' filepath='net/socket.c' line='1430' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_create_kern'>
-        <parameter type-id='a2bff676' name='net' filepath='net/socket.c' line='1430' column='1'/>
-        <parameter type-id='95e97e5e' name='family' filepath='net/socket.c' line='1430' column='1'/>
-        <parameter type-id='95e97e5e' name='type' filepath='net/socket.c' line='1430' column='1'/>
-        <parameter type-id='95e97e5e' name='protocol' filepath='net/socket.c' line='1430' column='1'/>
-        <parameter type-id='1a7bb5c8' name='res' filepath='net/socket.c' line='1430' column='1'/>
+      <function-decl name='sock_create_kern' mangled-name='sock_create_kern' filepath='net/socket.c' line='1432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_create_kern'>
+        <parameter type-id='a2bff676' name='net' filepath='net/socket.c' line='1432' column='1'/>
+        <parameter type-id='95e97e5e' name='family' filepath='net/socket.c' line='1432' column='1'/>
+        <parameter type-id='95e97e5e' name='type' filepath='net/socket.c' line='1432' column='1'/>
+        <parameter type-id='95e97e5e' name='protocol' filepath='net/socket.c' line='1432' column='1'/>
+        <parameter type-id='1a7bb5c8' name='res' filepath='net/socket.c' line='1432' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-decl name='sock_kmalloc' mangled-name='sock_kmalloc' filepath='include/net/sock.h' line='1622' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_kmalloc'>
@@ -130700,24 +130719,24 @@
         <parameter type-id='f0981eeb'/>
         <return type-id='eaa32e2f'/>
       </function-decl>
-      <function-decl name='kernel_connect' mangled-name='kernel_connect' filepath='net/socket.c' line='3464' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kernel_connect'>
-        <parameter type-id='13103032' name='sock' filepath='net/socket.c' line='3464' column='1'/>
-        <parameter type-id='5c0abad8' name='addr' filepath='net/socket.c' line='3464' column='1'/>
-        <parameter type-id='95e97e5e' name='addrlen' filepath='net/socket.c' line='3464' column='1'/>
-        <parameter type-id='95e97e5e' name='flags' filepath='net/socket.c' line='3465' column='1'/>
+      <function-decl name='kernel_connect' mangled-name='kernel_connect' filepath='net/socket.c' line='3468' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kernel_connect'>
+        <parameter type-id='13103032' name='sock' filepath='net/socket.c' line='3468' column='1'/>
+        <parameter type-id='5c0abad8' name='addr' filepath='net/socket.c' line='3468' column='1'/>
+        <parameter type-id='95e97e5e' name='addrlen' filepath='net/socket.c' line='3468' column='1'/>
+        <parameter type-id='95e97e5e' name='flags' filepath='net/socket.c' line='3469' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='kernel_getsockname' mangled-name='kernel_getsockname' filepath='net/socket.c' line='3480' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kernel_getsockname'>
-        <parameter type-id='13103032' name='sock' filepath='net/socket.c' line='3480' column='1'/>
-        <parameter type-id='5c0abad8' name='addr' filepath='net/socket.c' line='3480' column='1'/>
+      <function-decl name='kernel_getsockname' mangled-name='kernel_getsockname' filepath='net/socket.c' line='3484' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kernel_getsockname'>
+        <parameter type-id='13103032' name='sock' filepath='net/socket.c' line='3484' column='1'/>
+        <parameter type-id='5c0abad8' name='addr' filepath='net/socket.c' line='3484' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='kernel_setsockopt' mangled-name='kernel_setsockopt' filepath='net/socket.c' line='3546' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kernel_setsockopt'>
-        <parameter type-id='13103032' name='sock' filepath='net/socket.c' line='3546' column='1'/>
-        <parameter type-id='95e97e5e' name='level' filepath='net/socket.c' line='3546' column='1'/>
-        <parameter type-id='95e97e5e' name='optname' filepath='net/socket.c' line='3546' column='1'/>
-        <parameter type-id='26a90f95' name='optval' filepath='net/socket.c' line='3547' column='1'/>
-        <parameter type-id='f0981eeb' name='optlen' filepath='net/socket.c' line='3547' column='1'/>
+      <function-decl name='kernel_setsockopt' mangled-name='kernel_setsockopt' filepath='net/socket.c' line='3550' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kernel_setsockopt'>
+        <parameter type-id='13103032' name='sock' filepath='net/socket.c' line='3550' column='1'/>
+        <parameter type-id='95e97e5e' name='level' filepath='net/socket.c' line='3550' column='1'/>
+        <parameter type-id='95e97e5e' name='optname' filepath='net/socket.c' line='3550' column='1'/>
+        <parameter type-id='26a90f95' name='optval' filepath='net/socket.c' line='3551' column='1'/>
+        <parameter type-id='f0981eeb' name='optlen' filepath='net/socket.c' line='3551' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-decl name='sock_no_sendpage' mangled-name='sock_no_sendpage' filepath='include/net/sock.h' line='1663' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_sendpage'>
@@ -130811,7 +130830,6 @@
           <var-decl name='prev_bssid_valid' type-id='b50a4934' visibility='default' filepath='net/wireless/sme.c' line='51' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='libipw_device' is-struct='yes' visibility='default' is-declaration-only='yes' id='9c91a761'/>
       <array-type-def dimensions='1' type-id='ec00acfb' size-in-bits='infinite' id='14cad687'>
         <subrange length='infinite' type-id='7ff19f0f' id='031f2035'/>
       </array-type-def>
@@ -130824,9 +130842,6 @@
       <array-type-def dimensions='1' type-id='86d70780' size-in-bits='256' id='00286dfe'>
         <subrange length='4' type-id='7ff19f0f' id='16fe7105'/>
       </array-type-def>
-      <array-type-def dimensions='1' type-id='aa80c027' size-in-bits='256' id='c73a16a3'>
-        <subrange length='8' type-id='7ff19f0f' id='56e0c0b1'/>
-      </array-type-def>
       <array-type-def dimensions='1' type-id='45947737' size-in-bits='1024' id='248874df'>
         <subrange length='4' type-id='7ff19f0f' id='16fe7105'/>
       </array-type-def>
@@ -130867,13 +130882,6 @@
       <array-type-def dimensions='1' type-id='f9b06939' size-in-bits='72' id='cef57087'>
         <subrange length='9' type-id='7ff19f0f' id='12e4273c'/>
       </array-type-def>
-      <array-type-def dimensions='1' type-id='b151a3a8' size-in-bits='64' id='4a744ea1'>
-        <subrange length='8' type-id='7ff19f0f' id='56e0c0b1'/>
-      </array-type-def>
-      <array-type-def dimensions='2' type-id='b151a3a8' size-in-bits='384' id='2d507faf'>
-        <subrange length='8' type-id='7ff19f0f' id='56e0c0b1'/>
-        <subrange length='6' type-id='7ff19f0f' id='52fa524b'/>
-      </array-type-def>
       <class-decl name='wiphy' size-in-bits='11264' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='4154' column='1' id='68523a94'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='perm_addr' type-id='cf1a4160' visibility='default' filepath='include/net/cfg80211.h' line='4158' column='1'/>
@@ -131474,195 +131482,6 @@
         <enumerator name='NL80211_BAND_60GHZ' value='2'/>
         <enumerator name='NUM_NL80211_BANDS' value='3'/>
       </enum-decl>
-      <typedef-decl name='iw_handler' type-id='2c8ff697' filepath='include/net/iw_handler.h' line='315' column='1' id='bcc5cab3'/>
-      <class-decl name='iw_request_info' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/net/iw_handler.h' line='304' column='1' id='e90b3b44'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='cmd' type-id='d315442e' visibility='default' filepath='include/net/iw_handler.h' line='305' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='16'>
-          <var-decl name='flags' type-id='d315442e' visibility='default' filepath='include/net/iw_handler.h' line='306' column='1'/>
-        </data-member>
-      </class-decl>
-      <union-decl name='iwreq_data' size-in-bits='128' visibility='default' filepath='include/uapi/linux/wireless.h' line='902' column='1' id='ed626d0d'>
-        <data-member access='public'>
-          <var-decl name='name' type-id='ac1fa8c0' visibility='default' filepath='include/uapi/linux/wireless.h' line='904' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='essid' type-id='db4e746c' visibility='default' filepath='include/uapi/linux/wireless.h' line='908' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='nwid' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='909' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='freq' type-id='bc1ac22c' visibility='default' filepath='include/uapi/linux/wireless.h' line='910' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='sens' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='914' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='bitrate' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='915' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='txpower' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='916' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='rts' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='917' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='frag' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='918' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='mode' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='919' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='retry' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='920' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='encoding' type-id='db4e746c' visibility='default' filepath='include/uapi/linux/wireless.h' line='922' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='power' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='923' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='qual' type-id='aa80c027' visibility='default' filepath='include/uapi/linux/wireless.h' line='924' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='ap_addr' type-id='5221b18a' visibility='default' filepath='include/uapi/linux/wireless.h' line='926' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='addr' type-id='5221b18a' visibility='default' filepath='include/uapi/linux/wireless.h' line='927' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='param' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='929' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='data' type-id='db4e746c' visibility='default' filepath='include/uapi/linux/wireless.h' line='930' column='1'/>
-        </data-member>
-      </union-decl>
-      <class-decl name='iw_point' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='691' column='1' id='db4e746c'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='pointer' type-id='eaa32e2f' visibility='default' filepath='include/uapi/linux/wireless.h' line='692' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='length' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='693' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='80'>
-          <var-decl name='flags' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='694' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='iw_param' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='680' column='1' id='b024252b'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='value' type-id='3158a266' visibility='default' filepath='include/uapi/linux/wireless.h' line='681' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='fixed' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='682' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='40'>
-          <var-decl name='disabled' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='683' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='48'>
-          <var-decl name='flags' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='684' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='iw_freq' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='706' column='1' id='bc1ac22c'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='m' type-id='3158a266' visibility='default' filepath='include/uapi/linux/wireless.h' line='707' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='e' type-id='b55def60' visibility='default' filepath='include/uapi/linux/wireless.h' line='708' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='48'>
-          <var-decl name='i' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='709' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='56'>
-          <var-decl name='flags' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='710' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='iw_quality' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='716' column='1' id='aa80c027'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='qual' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='717' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='8'>
-          <var-decl name='level' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='719' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='16'>
-          <var-decl name='noise' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='720' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='24'>
-          <var-decl name='updated' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='721' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='iw_priv_args' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='1063' column='1' id='0c842ad9'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='cmd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='1064' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='set_args' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='1065' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='48'>
-          <var-decl name='get_args' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='1066' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='name' type-id='ac1fa8c0' visibility='default' filepath='include/uapi/linux/wireless.h' line='1067' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='iw_statistics' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='881' column='1' id='1c8cc2fd'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='status' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='882' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='16'>
-          <var-decl name='qual' type-id='aa80c027' visibility='default' filepath='include/uapi/linux/wireless.h' line='885' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='discard' type-id='832938ed' visibility='default' filepath='include/uapi/linux/wireless.h' line='887' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='224'>
-          <var-decl name='miss' type-id='6a2a3473' visibility='default' filepath='include/uapi/linux/wireless.h' line='888' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='iw_discarded' size-in-bits='160' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='731' column='1' id='832938ed'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='nwid' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='732' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='code' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='733' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='fragment' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='734' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='retries' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='735' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='misc' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='736' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='iw_missed' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='743' column='1' id='6a2a3473'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='beacon' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='744' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='iw_spy_data' size-in-bits='800' is-struct='yes' visibility='default' filepath='include/net/iw_handler.h' line='396' column='1' id='f8292115'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='spy_number' type-id='95e97e5e' visibility='default' filepath='include/net/iw_handler.h' line='398' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='spy_address' type-id='2d507faf' visibility='default' filepath='include/net/iw_handler.h' line='399' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='416'>
-          <var-decl name='spy_stat' type-id='c73a16a3' visibility='default' filepath='include/net/iw_handler.h' line='400' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='672'>
-          <var-decl name='spy_thr_low' type-id='aa80c027' visibility='default' filepath='include/net/iw_handler.h' line='402' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='spy_thr_high' type-id='aa80c027' visibility='default' filepath='include/net/iw_handler.h' line='403' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='736'>
-          <var-decl name='spy_thr_under' type-id='4a744ea1' visibility='default' filepath='include/net/iw_handler.h' line='404' column='1'/>
-        </data-member>
-      </class-decl>
-      <typedef-decl name='u_char' type-id='002ac4a6' filepath='include/linux/types.h' line='84' column='1' id='b151a3a8'/>
       <enum-decl name='nl80211_iftype' filepath='include/uapi/linux/nl80211.h' line='2912' column='1' id='86505f90'>
         <underlying-type type-id='9cac1fee'/>
         <enumerator name='NL80211_IFTYPE_UNSPECIFIED' value='0'/>
@@ -133733,7 +133552,7 @@
         <enumerator name='__NL80211_BSS_SELECT_ATTR_AFTER_LAST' value='4'/>
         <enumerator name='NL80211_BSS_SELECT_ATTR_MAX' value='3'/>
       </enum-decl>
-      <union-decl name='__anonymous_union__13' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/cfg80211.h' line='2331' column='1' id='0532d6f6'>
+      <union-decl name='__anonymous_union__3' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/cfg80211.h' line='2331' column='1' id='0532d6f6'>
         <data-member access='public'>
           <var-decl name='band_pref' type-id='3eaa0294' visibility='default' filepath='include/net/cfg80211.h' line='2332' column='1'/>
         </data-member>
@@ -134227,10 +134046,6 @@
       <pointer-type-def type-id='64b77daa' size-in-bits='64' id='0cda9080'/>
       <qualified-type-def type-id='2eec6999' const='yes' id='46f53066'/>
       <pointer-type-def type-id='46f53066' size-in-bits='64' id='fffb07a4'/>
-      <qualified-type-def type-id='bcc5cab3' const='yes' id='208298e3'/>
-      <pointer-type-def type-id='208298e3' size-in-bits='64' id='f696846b'/>
-      <qualified-type-def type-id='0c842ad9' const='yes' id='afa36b70'/>
-      <pointer-type-def type-id='afa36b70' size-in-bits='64' id='d841feae'/>
       <qualified-type-def type-id='50718ec3' const='yes' id='3666ea54'/>
       <pointer-type-def type-id='3666ea54' size-in-bits='64' id='2203245a'/>
       <qualified-type-def type-id='d5e39a52' const='yes' id='be356197'/>
@@ -134255,7 +134070,6 @@
       <pointer-type-def type-id='ce30b5d2' size-in-bits='64' id='4343d470'/>
       <pointer-type-def type-id='f7e1259c' size-in-bits='64' id='3cad9e1a'/>
       <pointer-type-def type-id='f16b7aee' size-in-bits='64' id='bf642844'/>
-      <pointer-type-def type-id='97488913' size-in-bits='64' id='2c8ff697'/>
       <pointer-type-def type-id='045f8e20' size-in-bits='64' id='518c633a'/>
       <pointer-type-def type-id='49390c3d' size-in-bits='64' id='40a250d9'/>
       <pointer-type-def type-id='06206c42' size-in-bits='64' id='ee39fcb4'/>
@@ -134339,13 +134153,7 @@
       <pointer-type-def type-id='d91d4c07' size-in-bits='64' id='dcf81beb'/>
       <pointer-type-def type-id='48be0748' size-in-bits='64' id='6a7c3ba2'/>
       <pointer-type-def type-id='c756879f' size-in-bits='64' id='a9032da3'/>
-      <pointer-type-def type-id='e90b3b44' size-in-bits='64' id='4780e252'/>
-      <pointer-type-def type-id='f8292115' size-in-bits='64' id='96efb615'/>
-      <pointer-type-def type-id='1c8cc2fd' size-in-bits='64' id='003642fd'/>
-      <pointer-type-def type-id='cfdbff8a' size-in-bits='64' id='55e2a83c'/>
-      <pointer-type-def type-id='ed626d0d' size-in-bits='64' id='00e2a7ce'/>
       <pointer-type-def type-id='45947737' size-in-bits='64' id='706d79ff'/>
-      <pointer-type-def type-id='9c91a761' size-in-bits='64' id='29244949'/>
       <pointer-type-def type-id='6d8d26fb' size-in-bits='64' id='01b378ab'/>
       <pointer-type-def type-id='50718ec3' size-in-bits='64' id='fce83a73'/>
       <pointer-type-def type-id='1cac2bf4' size-in-bits='64' id='9362acb2'/>
@@ -134390,13 +134198,6 @@
         <parameter type-id='bda81d86'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-type size-in-bits='64' id='97488913'>
-        <parameter type-id='68a2d05b'/>
-        <parameter type-id='4780e252'/>
-        <parameter type-id='00e2a7ce'/>
-        <parameter type-id='26a90f95'/>
-        <return type-id='95e97e5e'/>
-      </function-type>
       <function-type size-in-bits='64' id='045f8e20'>
         <parameter type-id='666fb412'/>
         <return type-id='95e97e5e'/>
@@ -134950,10 +134751,6 @@
         <parameter type-id='95e97e5e'/>
         <return type-id='95e97e5e'/>
       </function-type>
-      <function-type size-in-bits='64' id='cfdbff8a'>
-        <parameter type-id='68a2d05b'/>
-        <return type-id='003642fd'/>
-      </function-type>
       <function-type size-in-bits='64' id='a2365ade'>
         <parameter type-id='eaa32e2f'/>
         <parameter type-id='706d79ff'/>

commit 2b584c439387bd67f64694f953716bc9adc9421d
Author: Steve Muckle <smuckle@google.com>
Date:   Fri Oct 1 18:27:53 2021 +0000

    ANDROID: GKI: Update aarch64 cuttlefish symbol list
    
    Add symbols required by virtio_pci.
    
    Bug: 201573748
    Change-Id: Ia7251762d785fd78e015188d4055dfd6bac45991
    Signed-off-by: Steve Muckle <smuckle@google.com>

diff --git a/android/abi_gki_aarch64_cuttlefish b/android/abi_gki_aarch64_cuttlefish
index 15e4702f51c8..7a194d1d8d05 100644
--- a/android/abi_gki_aarch64_cuttlefish
+++ b/android/abi_gki_aarch64_cuttlefish
@@ -978,6 +978,7 @@
   __netif_set_xps_queue
   net_ratelimit
   nf_conntrack_destroy
+  __pskb_pull_tail
   _raw_spin_trylock
   skb_add_rx_frag
   skb_coalesce_rx_frag
@@ -1004,6 +1005,7 @@
 # required by virtio_pci.ko
   irq_set_affinity_hint
   pci_alloc_irq_vectors_affinity
+  pci_device_is_present
   pci_find_capability
   pci_find_ext_capability
   pci_find_next_capability
@@ -1015,6 +1017,7 @@
   pci_release_region
   pci_release_selected_regions
   pci_request_selected_regions
+  virtio_break_device
   virtio_device_freeze
   virtio_device_restore
 

commit efd472c3cd95e9a438ab8fda3264595cb6c3e9ca
Author: Caesar Wang <wxt@rock-chips.com>
Date:   Thu Sep 30 15:13:36 2021 +0800

    arm64: dts: rockchip: set unique possible_crtcs for rk3568_linux.dtsi
    
    Signed-off-by: Caesar Wang <wxt@rock-chips.com>
    Change-Id: If25aa8e06474473a69d1a370e3e546ecc2a6b748

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
index 8e96b1bfb33a..34af555d2a23 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
@@ -57,3 +57,7 @@
 &rockchip_suspend {
 	status = "okay";
 };
+
+&vop {
+	disable-win-move;
+};

commit 3a8b9f0a171cac0bc0e04299ee553c8b805879e0
Author: Liang Chen <cl@rock-chips.com>
Date:   Fri Aug 27 11:27:41 2021 +0800

    arm64: dts: rockchip: rk3568: adjust opp-table for dmc by PVTM
    
    Change-Id: I0706715afe2635f4e810f025c585a59c9b7c24ec
    Signed-off-by: Liang Chen <cl@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index beaa9c82e286..9e202986d9d0 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -2191,12 +2191,17 @@
 		rockchip,low-temp = <0>;
 		rockchip,low-temp-adjust-volt = <
 			/* MHz    MHz    uV */
-			   0      1560   25000
+			   0      1560   75000
 		>;
 		rockchip,leakage-voltage-sel = <
 			1   80    0
 			81  254   1
 		>;
+		rockchip,pvtm-voltage-sel = <
+			0        82000   0
+			82001    100000  1
+		>;
+		rockchip,pvtm-ch = <0 5>;
 
 		opp-1560000000 {
 			opp-hz = /bits/ 64 <1560000000>;

commit 6eb8d7f5c9329641bad380f03f6e4d0a2dfd169a
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Tue Sep 28 14:38:19 2021 +0200

    ANDROID: GKI: rework the ANDROID_KABI_USE() macro to not use __UNIQUE()
    
    The __UNIQUE_ID() macro causes problems as it turns out to not be
    deterministic across different compiler runs as it relies on the
    __COUNTER__ macro which could have been used on other .h files previous
    to this .h file being included.
    
    This shows up specifically when building with "LTO=thin" vs. "LTO=full"
    as different build paths seem to be triggered.
    
    As the structure name isn't really needed at all here, we were just
    including it for older compilers that could not handle anonymous
    structures in a union, just drop the whole thing which resolves the abi
    naming issue.
    
    Bug: 210255585
    Reported-by: Giuliano Procida <gprocida@google.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I6b9449fa9d26ffc5d66b2f0f3b41e2d5f3003f68

diff --git a/include/linux/android_kabi.h b/include/linux/android_kabi.h
index efa52953fe35..9c7b6c035ad3 100644
--- a/include/linux/android_kabi.h
+++ b/include/linux/android_kabi.h
@@ -63,7 +63,7 @@
 		_new;						\
 		struct {					\
 			_orig;					\
-		} __UNIQUE_ID(android_kabi_hide);		\
+		};						\
 		__ANDROID_KABI_CHECK_SIZE_ALIGN(_orig, _new);	\
 	}
 

commit ffd3865c49356bfbfd66f72f3f2edfb86774cc7e
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Mon Sep 27 14:40:37 2021 +0800

    media: rockchip: isp: fix bottom image for debayer with extend line
    
    Change-Id: Ie6e4a7e9744be498f594ad7f03351b771a6236c1
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/dmarx.c b/drivers/media/platform/rockchip/isp/dmarx.c
index 706a8b819ed2..1ed365000a23 100644
--- a/drivers/media/platform/rockchip/isp/dmarx.c
+++ b/drivers/media/platform/rockchip/isp/dmarx.c
@@ -537,6 +537,26 @@ static void rkisp_buf_queue(struct vb2_buffer *vb)
 
 	memset(ispbuf->buff_addr, 0, sizeof(ispbuf->buff_addr));
 	for (i = 0; i < isp_fmt->mplanes; i++) {
+		void *vaddr = vb2_plane_vaddr(vb, i);
+
+		if (vaddr && i == 0 &&
+		    stream->ispdev->isp_ver == ISP_V20 &&
+		    stream->ispdev->rd_mode == HDR_RDBK_FRAME1 &&
+		    RKMODULE_EXTEND_LINE >= 8 &&
+		    isp_fmt->fmt_type == FMT_BAYER &&
+		    stream->id == RKISP_STREAM_RAWRD2) {
+			u32 line = pixm->plane_fmt[0].bytesperline;
+			u32 val = 8;
+
+			vaddr += line * (pixm->height - 2);
+			while (val) {
+				memcpy(vaddr + line * val, vaddr, line * 2);
+				val -= 2;
+			}
+			if (vb->vb2_queue->mem_ops->prepare)
+				vb->vb2_queue->mem_ops->prepare(vb->planes[0].mem_priv);
+		}
+
 		if (stream->ispdev->hw_dev->is_dma_sg_ops) {
 			sgt = vb2_dma_sg_plane_desc(vb, i);
 			ispbuf->buff_addr[i] = sg_dma_address(sgt->sgl);

commit be89a6f80be6526d8b76d0e2144d3db1e4645744
Author: Martijn Coenen <maco@android.com>
Date:   Tue Aug 25 09:18:29 2020 +0200

    BACKPORT: loop: Set correct device size when using LOOP_CONFIGURE
    
    The device size calculation was done before processing the loop
    configuration, which meant that the we set the size on the underlying
    block device incorrectly in case lo_offset/lo_sizelimit were set in the
    configuration. Delay computing the size until we've setup the device
    parameters correctly.
    
    Fixes: 3448914e8cc5("loop: Add LOOP_CONFIGURE ioctl")
    Reported-by: Lennart Poettering <mzxreary@0pointer.de>
    Tested-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
    Signed-off-by: Martijn Coenen <maco@android.com>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    (cherry picked from commit 79e5dc59e2974a48764269fa9ff544ae8ffe3338)
    Bug: 187129171
    Signed-off-by: Connor O'Brien <connoro@google.com>
    Change-Id: I823aba7e482eaf347992d507c875c10469a27c16

diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 5094ef15afd9..dd8c4810a6dd 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -1083,8 +1083,6 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
 	mapping = file->f_mapping;
 	inode = mapping->host;
 
-	size = get_loop_size(lo, file);
-
 	if ((config->info.lo_flags & ~LOOP_CONFIGURE_SETTABLE_FLAGS) != 0) {
 		error = -EINVAL;
 		goto out_unlock;
@@ -1135,6 +1133,8 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
 
 	loop_update_dio(lo);
 	loop_sysfs_init(lo);
+
+	size = get_loop_size(lo, file);
 	loop_set_size(lo, size);
 
 	set_blocksize(bdev, S_ISBLK(inode->i_mode) ?

commit ac39fa39efa3962b83e293a144ecc7080bd6d0bf
Author: Xu Hongfei <xuhf@rock-chips.com>
Date:   Thu Jul 15 17:27:27 2021 +0800

    media: rockchip: isp: disable tmo interrupt
    
    remove associated configuration in TMO isr
    
    Signed-off-by: Xu Hongfei <xuhf@rock-chips.com>
    Change-Id: I610bc64aaa2549d10e4383df0d8247f161bc8048

diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.c b/drivers/media/platform/rockchip/isp/isp_params_v2x.c
index 5bb8043cc347..b663b0e78caa 100644
--- a/drivers/media/platform/rockchip/isp/isp_params_v2x.c
+++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.c
@@ -4333,129 +4333,6 @@ rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev,
 	spin_unlock(&params_vdev->config_lock);
 }
 
-static void isp_hdrtmo_palhpa_reconfig(struct rkisp_isp_params_vdev *params_vdev, u32 lgmean)
-{
-	u16 set_lgmin, set_lgmax, palpha_0p18;
-	u32 palpha, max_palpha;
-	u32 cur_frame_id = 0;
-	u32 value = 0;
-
-	set_lgmin = params_vdev->cur_hdrtmo.set_lgmin;
-	set_lgmax = params_vdev->cur_hdrtmo.set_lgmax;
-	palpha_0p18 = params_vdev->cur_hdrtmo.palpha_0p18;
-	max_palpha = params_vdev->cur_hdrtmo.maxpalpha;
-
-	palpha = palpha_0p18 * (4 * lgmean - 3 * set_lgmin - set_lgmax) / (set_lgmax - set_lgmin);
-	palpha = min(palpha, max_palpha);
-
-	rkisp_dmarx_get_frame(params_vdev->dev, &cur_frame_id, NULL, NULL, true);
-
-	value = rkisp_read(params_vdev->dev, ISP_HDRTMO_LG_CFG0, true) & 0xfffffc00;
-	value |= palpha;
-	rkisp_write(params_vdev->dev, ISP_HDRTMO_LG_CFG0, value, true);
-
-	v4l2_dbg(5, rkisp_debug, &params_vdev->dev->v4l2_dev,
-		 "frame(%d), palpha(%d)\n", cur_frame_id, palpha);
-}
-
-static void isp_hdrtmo_lgavgmax_reconfig(struct rkisp_isp_params_vdev *params_vdev,
-					 s32 lgmean)
-{
-	u8 weight_key;
-	u16 set_lgmax;
-	s32 lgrange1 = 0, lgavgmax = 0;
-	u32 cur_frame_id, value;
-
-	set_lgmax = params_vdev->cur_hdrtmo.set_lgmax;
-	lgrange1 = params_vdev->cur_hdrtmo.set_lgrange1;
-	weight_key = params_vdev->cur_hdrtmo.set_weightkey;
-
-	if (params_vdev->cur_hdrtmo.predict.global_tmo) {
-		lgavgmax = lgmean;
-	} else {
-		lgavgmax = weight_key * set_lgmax + (256 - weight_key) * lgmean;
-		lgavgmax = min(lgavgmax / 256, lgrange1);
-	}
-
-	value = rkisp_read(params_vdev->dev, ISP_HDRTMO_LG_CFG4, true) & 0xffff0000;
-	value |= lgavgmax;
-	rkisp_write(params_vdev->dev, ISP_HDRTMO_LG_CFG4, value, true);
-
-	rkisp_dmarx_get_frame(params_vdev->dev, &cur_frame_id, NULL, NULL, true);
-
-	v4l2_dbg(5, rkisp_debug, &params_vdev->dev->v4l2_dev,
-		 "frame(%d), global_tmo(%d), lgavgmax(%d)\n",
-		 cur_frame_id, params_vdev->cur_hdrtmo.predict.global_tmo, lgavgmax);
-}
-
-static void isp_hdrtmo_lgrange1_reconfig(struct rkisp_isp_params_vdev *params_vdev,
-					 s32 lgmean)
-{
-	if (params_vdev->cur_hdrtmo.predict.global_tmo) {
-		s32 lgrange1 = 0;
-		u32 cur_frame_id, value;
-
-		lgrange1 = lgmean;
-		value = rkisp_read(params_vdev->dev, ISP_HDRTMO_LG_CFG3, true) & 0xffff;
-		value |= lgrange1 << 16;
-		rkisp_write(params_vdev->dev, ISP_HDRTMO_LG_CFG3, value, true);
-
-		rkisp_dmarx_get_frame(params_vdev->dev, &cur_frame_id, NULL, NULL, true);
-
-		v4l2_dbg(5, rkisp_debug, &params_vdev->dev->v4l2_dev,
-			 "frame(%d), global_tmo(%d), lgrange1(%d)\n",
-			 cur_frame_id, params_vdev->cur_hdrtmo.predict.global_tmo, lgrange1);
-	}
-}
-
-static u16 isp_hdrtmo_lgmean_reconfig(struct rkisp_isp_params_vdev *params_vdev)
-{
-	u16 default_lgmean = 40000;
-	u16 lgmean = default_lgmean;
-	u32 value = 0;
-	s32 cur_frame_id = 0;
-	static s32 prev_lgmean = 40000;
-
-	rkisp_dmarx_get_frame(params_vdev->dev, &cur_frame_id, NULL, NULL, true);
-	if (params_vdev->cur_hdrtmo.predict.iir < params_vdev->cur_hdrtmo.predict.iir_max) {
-		u32 ro_lgmean;
-		s32 iir = 0;
-		s32 global_tmo_strength = params_vdev->cur_hdrtmo.predict.global_tmo_strength;
-
-		value = rkisp_read(params_vdev->dev, ISP_HDRTMO_LG_RO2, true);
-		ro_lgmean = value & 0xffff;
-
-		iir = min(cur_frame_id + 1, params_vdev->cur_hdrtmo.predict.iir);
-		default_lgmean += global_tmo_strength;
-		ro_lgmean +=  global_tmo_strength;
-		if (params_vdev->cur_hdrtmo.predict.scene_stable) {
-			if (cur_frame_id == 0)
-				lgmean = default_lgmean;
-			else
-				lgmean = ((iir - 1) * prev_lgmean + ro_lgmean) / iir;
-		} else {
-			if (cur_frame_id == 0)
-				lgmean = default_lgmean;
-			else
-				lgmean = prev_lgmean;
-		}
-	}
-
-	value = rkisp_read(params_vdev->dev, ISP_HDRTMO_LG_CFG2, true) & 0xffff0000;
-	value |= lgmean;
-	rkisp_write(params_vdev->dev, ISP_HDRTMO_LG_CFG2, value, true);
-
-	prev_lgmean = lgmean;
-
-	v4l2_dbg(5, rkisp_debug, &params_vdev->dev->v4l2_dev,
-		 "frame(%d), scene_stable(%d), k_rolgmean(%d), iir(%d), lgmean(%d)\n",
-		 cur_frame_id, params_vdev->cur_hdrtmo.predict.scene_stable,
-		 params_vdev->cur_hdrtmo.predict.k_rolgmean,
-		 params_vdev->cur_hdrtmo.predict.iir, lgmean);
-
-	return lgmean;
-}
-
 static void
 rkisp_params_isr_v2x(struct rkisp_isp_params_vdev *params_vdev,
 		     u32 isp_mis)
@@ -4487,17 +4364,6 @@ rkisp_params_isr_v2x(struct rkisp_isp_params_vdev *params_vdev,
 		}
 	}
 
-	if (isp_mis & ISP2X_HDR_DONE) {
-		u16 lgmean = 0;
-
-		lgmean = isp_hdrtmo_lgmean_reconfig(params_vdev);
-		isp_hdrtmo_palhpa_reconfig(params_vdev, lgmean);
-		isp_hdrtmo_lgrange1_reconfig(params_vdev, lgmean);
-		isp_hdrtmo_lgavgmax_reconfig(params_vdev, lgmean);
-
-		writel(ISP2X_HDR_DONE, dev->base_addr + ISP_ISP_ICR);
-	}
-
 	if ((isp_mis & CIF_ISP_FRAME) && !IS_HDR_RDBK(dev->rd_mode))
 		rkisp_params_cfg_v2x(params_vdev, cur_frame_id + 1, RKISP_PARAMS_ALL);
 }
diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c
index 673d05b51610..8e42e4353ae4 100644
--- a/drivers/media/platform/rockchip/isp/rkisp.c
+++ b/drivers/media/platform/rockchip/isp/rkisp.c
@@ -1225,8 +1225,6 @@ static int rkisp_config_isp(struct rkisp_device *dev)
 		    CIF_ISP_FRAME_IN;
 	if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21)
 		irq_mask |= ISP2X_LSC_LUT_ERR;
-	if (dev->isp_ver == ISP_V20)
-		irq_mask |= ISP2X_HDR_DONE;
 	rkisp_write(dev, CIF_ISP_IMSC, irq_mask, true);
 
 	if ((dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) &&

commit 7e43ca389fa8f5f45bb291a4a8d78474849cb252
Author: Wang Jie <dave.wang@rock-chips.com>
Date:   Wed Jul 28 17:25:49 2021 +0800

    usb: typec: tcpm: add husb311 driver
    
    At present, there is no requirement for PD3.0 PPS function,
    the driver has not verified this function.
    
    Change-Id: Ib78bf1f96f806cca4a20567db2a7cbaf0fba01af
    Signed-off-by: Wang Jie <dave.wang@rock-chips.com>

diff --git a/Documentation/devicetree/bindings/usb/hynetek,husb311.txt b/Documentation/devicetree/bindings/usb/hynetek,husb311.txt
new file mode 100644
index 000000000000..8394ca885ad9
--- /dev/null
+++ b/Documentation/devicetree/bindings/usb/hynetek,husb311.txt
@@ -0,0 +1,38 @@
+Hynetek Husb311 Type-C Port controllers DT bindings
+
+Required properties:
+- compatible:       hynetek,husb311
+
+- reg:              the i2c slave address of typec port controller device.
+- interrupt-parent: the phandle to the interrupt controller which provides
+                    the interrupt.
+- interrupts:       interrupt specification for tcpci alert.
+- vbus-supply:      vbus regulator
+
+Required sub-node:
+- connector: The "usb-c-connector" attached to the tcpci chip, the bindings
+  of connector node are specified in
+  Documentation/devicetree/bindings/connector/usb-connector.txt
+
+Example:
+
+#include "dt-bindings/usb/pd.h"
+
+husb0: husb311@4e {
+	compatible = "hynetek,husb311";
+	reg = <0x4e>;
+	interrupt-parent = <&gpio1>;
+	interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
+	vbus-supply = <&vcc5v0_typec>;
+	status = "okay";
+
+	usb_con: connector {
+		data-role = "dual";
+		power-role = "dual";
+		try-power-role = "sink";
+		source-pdos = <PDO_FIXED(5000, 2000, PDO_FIXED_USB_COMM)>;
+		sink-pdos = <PDO_FIXED(5000, 2000, PDO_FIXED_USB_COMM)>;
+		op-sink-microwatt = <10000000>;
+
+	};
+};
diff --git a/drivers/usb/typec/tcpm/Kconfig b/drivers/usb/typec/tcpm/Kconfig
index f03ea8a61768..1d1fcc1e1b6b 100644
--- a/drivers/usb/typec/tcpm/Kconfig
+++ b/drivers/usb/typec/tcpm/Kconfig
@@ -18,6 +18,13 @@ config TYPEC_TCPCI
 
 if TYPEC_TCPCI
 
+config TYPEC_HUSB311
+	tristate "Hynetek HUSB311 Type-C chip driver"
+	help
+	  Hynetek HUSB311 Type-C chip driver that works with
+	  Type-C Port Controller Manager to provide USB PD and USB
+	  Type-C functionalities.
+
 config TYPEC_RT1711H
 	tristate "Richtek RT1711H Type-C chip driver"
 	help
diff --git a/drivers/usb/typec/tcpm/Makefile b/drivers/usb/typec/tcpm/Makefile
index a5ff6c8eb892..05b902e11955 100644
--- a/drivers/usb/typec/tcpm/Makefile
+++ b/drivers/usb/typec/tcpm/Makefile
@@ -4,4 +4,5 @@ obj-$(CONFIG_TYPEC_FUSB302)	+= fusb302.o
 obj-$(CONFIG_TYPEC_WCOVE)	+= typec_wcove.o
 typec_wcove-y			:= wcove.o
 obj-$(CONFIG_TYPEC_TCPCI)	+= tcpci.o
+obj-$(CONFIG_TYPEC_HUSB311)	+= tcpci_husb311.o
 obj-$(CONFIG_TYPEC_RT1711H)	+= tcpci_rt1711h.o
diff --git a/drivers/usb/typec/tcpm/tcpci_husb311.c b/drivers/usb/typec/tcpm/tcpci_husb311.c
new file mode 100644
index 000000000000..0e96a41c6978
--- /dev/null
+++ b/drivers/usb/typec/tcpm/tcpci_husb311.c
@@ -0,0 +1,199 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2021 Rockchip Co.,Ltd.
+ * Author: Wang Jie <dave.wang@rock-chips.com>
+ *
+ * Hynetek Husb311 Type-C Chip Driver
+ */
+
+#include <linux/gpio/consumer.h>
+#include <linux/i2c.h>
+#include <linux/interrupt.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/regmap.h>
+#include <linux/usb/tcpm.h>
+#include "tcpci.h"
+
+#define HUSB311_VID		0x2E99
+#define HUSB311_PID		0x0311
+#define HUSB311_TCPC_I2C_RESET	0x9E
+#define HUSB311_TCPC_SOFTRESET	0xA0
+#define HUSB311_TCPC_FILTER	0xA1
+#define HUSB311_TCPC_TDRP	0xA2
+#define HUSB311_TCPC_DCSRCDRP	0xA3
+
+struct husb311_chip {
+	struct tcpci_data data;
+	struct tcpci *tcpci;
+	struct device *dev;
+};
+
+static int husb311_write8(struct husb311_chip *chip, unsigned int reg, u8 val)
+{
+	return regmap_raw_write(chip->data.regmap, reg, &val, sizeof(u8));
+}
+
+static int husb311_write16(struct husb311_chip *chip, unsigned int reg, u16 val)
+{
+	return regmap_raw_write(chip->data.regmap, reg, &val, sizeof(u16));
+}
+
+static const struct regmap_config husb311_regmap_config = {
+	.reg_bits = 8,
+	.val_bits = 8,
+	.max_register = 0xFF, /* 0x80 .. 0xFF are vendor defined */
+};
+
+static struct husb311_chip *tdata_to_husb311(struct tcpci_data *tdata)
+{
+	return container_of(tdata, struct husb311_chip, data);
+}
+
+static int husb311_sw_reset(struct husb311_chip *chip)
+{
+	/* soft reset */
+	return husb311_write8(chip, HUSB311_TCPC_SOFTRESET, 0x01);
+}
+
+static int husb311_init(struct tcpci *tcpci, struct tcpci_data *tdata)
+{
+	int ret;
+	struct husb311_chip *chip = tdata_to_husb311(tdata);
+
+	/* I2C reset : (val + 1) * 12.5ms */
+	ret = husb311_write8(chip, HUSB311_TCPC_I2C_RESET, 0x8F);
+	/* tTCPCfilter : (26.7 * val) us */
+	ret |= husb311_write8(chip, HUSB311_TCPC_FILTER, 0x0F);
+	/* tDRP : (51.2 + 6.4 * val) ms */
+	ret |= husb311_write8(chip, HUSB311_TCPC_TDRP, 0x04);
+	/* dcSRC.DRP : 33% */
+	ret |= husb311_write16(chip, HUSB311_TCPC_DCSRCDRP, 330);
+
+	if (ret < 0)
+		dev_err(chip->dev, "fail to init registers(%d)\n", ret);
+
+	return ret;
+}
+
+static irqreturn_t husb311_irq(int irq, void *dev_id)
+{
+	struct husb311_chip *chip = dev_id;
+
+	return tcpci_irq(chip->tcpci);
+}
+
+static int husb311_check_revision(struct i2c_client *i2c)
+{
+	int ret;
+
+	ret = i2c_smbus_read_word_data(i2c, TCPC_VENDOR_ID);
+	if (ret < 0) {
+		dev_err(&i2c->dev, "fail to read Vendor id(%d)\n", ret);
+		return ret;
+	}
+
+	if (ret != HUSB311_VID) {
+		dev_err(&i2c->dev, "vid is not correct, 0x%04x\n", ret);
+		return -ENODEV;
+	}
+
+	ret = i2c_smbus_read_word_data(i2c, TCPC_PRODUCT_ID);
+	if (ret < 0) {
+		dev_err(&i2c->dev, "fail to read Product id(%d)\n", ret);
+		return ret;
+	}
+
+	if (ret != HUSB311_PID) {
+		dev_err(&i2c->dev, "pid is not correct, 0x%04x\n", ret);
+		return -ENODEV;
+	}
+
+	return 0;
+}
+
+static int husb311_probe(struct i2c_client *client,
+			 const struct i2c_device_id *i2c_id)
+{
+	int ret;
+	struct husb311_chip *chip;
+
+	ret = husb311_check_revision(client);
+	if (ret < 0) {
+		dev_err(&client->dev, "check vid/pid fail(%d)\n", ret);
+		return ret;
+	}
+
+	chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL);
+	if (!chip)
+		return -ENOMEM;
+
+	chip->data.regmap = devm_regmap_init_i2c(client,
+						 &husb311_regmap_config);
+	if (IS_ERR(chip->data.regmap))
+		return PTR_ERR(chip->data.regmap);
+
+	chip->dev = &client->dev;
+	i2c_set_clientdata(client, chip);
+
+	ret = husb311_sw_reset(chip);
+	if (ret < 0) {
+		dev_err(chip->dev, "fail to soft reset, ret = %d\n", ret);
+		return ret;
+	}
+
+	chip->data.init = husb311_init;
+	chip->tcpci = tcpci_register_port(chip->dev, &chip->data);
+	if (IS_ERR(chip->tcpci))
+		return PTR_ERR(chip->tcpci);
+
+	ret = devm_request_threaded_irq(chip->dev, client->irq, NULL,
+					husb311_irq,
+					IRQF_ONESHOT | IRQF_TRIGGER_LOW,
+					client->name, chip);
+	if (ret < 0) {
+		tcpci_unregister_port(chip->tcpci);
+		return ret;
+	}
+
+	enable_irq_wake(client->irq);
+
+	return 0;
+}
+
+static int husb311_remove(struct i2c_client *client)
+{
+	struct husb311_chip *chip = i2c_get_clientdata(client);
+
+	tcpci_unregister_port(chip->tcpci);
+	return 0;
+}
+
+static const struct i2c_device_id husb311_id[] = {
+	{ "husb311", 0 },
+	{ }
+};
+MODULE_DEVICE_TABLE(i2c, husb311_id);
+
+#ifdef CONFIG_OF
+static const struct of_device_id husb311_of_match[] = {
+	{ .compatible = "hynetek,husb311" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, husb311_of_match);
+#endif
+
+static struct i2c_driver husb311_i2c_driver = {
+	.driver = {
+		.name = "husb311",
+		.of_match_table = of_match_ptr(husb311_of_match),
+	},
+	.probe = husb311_probe,
+	.remove = husb311_remove,
+	.id_table = husb311_id,
+};
+module_i2c_driver(husb311_i2c_driver);
+
+MODULE_AUTHOR("Wang Jie <dave.wang@rock-chips.com>");
+MODULE_DESCRIPTION("Husb311 USB Type-C Port Controller Interface Driver");
+MODULE_LICENSE("GPL v2");

commit 21f773b41f5d49b5d4a2a5a556b40443dc69c7d8
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Wed Sep 29 15:52:45 2021 +0800

    drm/rockchip: vop2: Reset used_layers to 0
    
    used_layers should reset to 0 before count
    port_mux.
    
    And also fix the follow warning:
    drivers/gpu/drm/rockchip/rockchip_drm_vop2.c:2538:26: warning: Value
    stored to 'vp' during its initialization is never read
    drivers/gpu/drm/rockchip/rockchip_drm_vop2.c:2537:21: warning: Value
    stored to 'layer' during its initialization is never read
    
    Fixes: 2120901346b4 ("drm/rockchip: vop2: Assign plane for vp by
    plane_mask")
    
    Change-Id: I56b1576070392b7b262ef65b19cf14d1bfde0586
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 678c8fc13a31..a9ffef9eff26 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -2534,8 +2534,8 @@ static int vop2_core_clks_prepare_enable(struct vop2 *vop2)
  */
 static void vop2_layer_map_initial(struct vop2 *vop2, uint32_t current_vp_id)
 {
-	struct vop2_layer *layer = &vop2->layers[0];
-	struct vop2_video_port *vp = &vop2->vps[0];
+	struct vop2_layer *layer;
+	struct vop2_video_port *vp;
 	struct vop2_win *win;
 	unsigned long win_mask;
 	uint32_t used_layers = 0;
@@ -2574,6 +2574,7 @@ static void vop2_layer_map_initial(struct vop2 *vop2, uint32_t current_vp_id)
 	 * at the last level of the all the mixers by hardware design,
 	 * so we just need to handle (nr_vps - 1) vps here.
 	 */
+	used_layers = 0;
 	for (i = 0; i < vop2->data->nr_vps - 1; i++) {
 		vp = &vop2->vps[i];
 		used_layers += hweight32(vp->win_mask);

commit 900f48781f99c89a61437e35837db1857e62dac9
Author: William Wu <william.wu@rock-chips.com>
Date:   Tue Sep 28 20:21:17 2021 +0800

    usb: quirks: add quirk for MT7668 WIFI with broken LPM
    
    The MT7668 WIFI/BT can't be detected by xHCI controller
    on Rockchip platforms when the LPM is enabled.
    
    This patch adds an USB_QUIRK_NO_LPM quirk for this device.
    
    Signed-off-by: William Wu <william.wu@rock-chips.com>
    Change-Id: Iacaf6d050ece06e09c2d286206860c2214c52661

diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
index dc2f5a09b29f..3c8c7b10a08b 100644
--- a/drivers/usb/core/quirks.c
+++ b/drivers/usb/core/quirks.c
@@ -423,6 +423,9 @@ static const struct usb_device_id usb_quirk_list[] = {
 	{ USB_DEVICE(0x0c45, 0x7056), .driver_info =
 			USB_QUIRK_IGNORE_REMOTE_WAKEUP },
 
+	/* MT7668 WIFI/BT */
+	{ USB_DEVICE(0x0e8d, 0x7668), .driver_info = USB_QUIRK_NO_LPM },
+
 	/* Action Semiconductor flash disk */
 	{ USB_DEVICE(0x10d6, 0x2200), .driver_info =
 			USB_QUIRK_STRING_FETCH_255 },

commit 16dc44d17c931f42aa9388a10df5d6a9f2cfc680
Author: William Wu <william.wu@rock-chips.com>
Date:   Tue Sep 28 20:07:55 2021 +0800

    usb: gadget: f_uac2: fix range size of sampling frequency control
    
    Refer to the UAC 2.0 spec "Table 5-7: 4-byte Control RANGE
    Parameter Block", the range size of sampling frequency control
    is wNumSubRanges + n * (dMIN + dMAX + dRES), n is the total
    of the sampling frequency.
    
    Signed-off-by: William Wu <william.wu@rock-chips.com>
    Change-Id: Iababf610914688f178621915e03bdabe58fe310b

diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c
index 04768b61ab01..34290e5e647d 100644
--- a/drivers/usb/gadget/function/f_uac2.c
+++ b/drivers/usb/gadget/function/f_uac2.c
@@ -590,7 +590,7 @@ struct cntrl_range_lay3 {
 } __packed;
 
 #define ranges_size(c) (sizeof(c.wNumSubRanges) + c.wNumSubRanges \
-		* sizeof(struct cntrl_ranges_lay3))
+		* sizeof(struct cntrl_range_lay3))
 struct cntrl_ranges_lay3 {
 	__u16	wNumSubRanges;
 	struct cntrl_range_lay3 r[UAC_MAX_RATES];

commit 7dee443c55d534b08f18c9ab147012eaf9701f33
Author: David Wu <david.wu@rock-chips.com>
Date:   Sun Sep 26 20:19:11 2021 +0800

    net: core: Add filter config option
    
    Add this config option to reduce memory usage, if it was not necessary.
    
    ./ksize.sh net
    
    before size: 716596 Bytes
    after  size: 673095 Bytes
    save   size: 43501  Bytes
    
    Signed-off-by: David Wu <david.wu@rock-chips.com>
    Change-Id: I012d926a7a8be9a4897a85fbf47f7fbbab1e43c4

diff --git a/include/linux/filter.h b/include/linux/filter.h
index 497172007603..f04ac5cf8b04 100644
--- a/include/linux/filter.h
+++ b/include/linux/filter.h
@@ -761,7 +761,16 @@ bpf_jit_binary_hdr(const struct bpf_prog *fp)
 	return (void *)addr;
 }
 
+#ifdef CONFIG_FILTER
 int sk_filter_trim_cap(struct sock *sk, struct sk_buff *skb, unsigned int cap);
+#else
+static inline
+int sk_filter_trim_cap(struct sock *sk, struct sk_buff *skb, unsigned int cap)
+{
+	return 0;
+}
+#endif
+
 static inline int sk_filter(struct sock *sk, struct sk_buff *skb)
 {
 	return sk_filter_trim_cap(sk, skb, 1);
@@ -786,6 +795,7 @@ static inline void bpf_prog_unlock_free(struct bpf_prog *fp)
 typedef int (*bpf_aux_classic_check_t)(struct sock_filter *filter,
 				       unsigned int flen);
 
+#ifdef CONFIG_FILTER
 int bpf_prog_create(struct bpf_prog **pfp, struct sock_fprog_kern *fprog);
 int bpf_prog_create_from_user(struct bpf_prog **pfp, struct sock_fprog *fprog,
 			      bpf_aux_classic_check_t trans, bool save_orig);
@@ -803,6 +813,71 @@ int sk_get_filter(struct sock *sk, struct sock_filter __user *filter,
 bool sk_filter_charge(struct sock *sk, struct sk_filter *fp);
 void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp);
 
+#else
+static inline
+int bpf_prog_create(struct bpf_prog **pfp, struct sock_fprog_kern *fprog)
+{
+	return 0;
+}
+
+static inline
+int bpf_prog_create_from_user(struct bpf_prog **pfp, struct sock_fprog *fprog,
+			      bpf_aux_classic_check_t trans, bool save_orig)
+{
+	return 0;
+}
+
+static inline void bpf_prog_destroy(struct bpf_prog *fp)
+{
+}
+
+static inline int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk)
+{
+	return 0;
+}
+
+static inline int sk_attach_bpf(u32 ufd, struct sock *sk)
+{
+	return 0;
+}
+
+static inline
+int sk_reuseport_attach_filter(struct sock_fprog *fprog, struct sock *sk)
+{
+	return 0;
+}
+
+static inline int sk_reuseport_attach_bpf(u32 ufd, struct sock *sk)
+{
+	return 0;
+}
+
+static inline void sk_reuseport_prog_free(struct bpf_prog *prog)
+{
+}
+
+static inline int sk_detach_filter(struct sock *sk)
+{
+	return 0;
+}
+
+static inline
+int sk_get_filter(struct sock *sk, struct sock_filter __user *filter,
+		  unsigned int len)
+{
+	return 0;
+}
+
+static inline bool sk_filter_charge(struct sock *sk, struct sk_filter *fp)
+{
+	return false;
+}
+
+static inline void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp)
+{
+}
+#endif
+
 u64 __bpf_call_base(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5);
 #define __bpf_call_base_args \
 	((u64 (*)(u64, u64, u64, u64, u64, const struct bpf_insn *)) \
@@ -861,6 +936,7 @@ static inline int xdp_ok_fwd_dev(const struct net_device *fwd,
 	return 0;
 }
 
+#ifdef CONFIG_FILTER
 /* The pair of xdp_do_redirect and xdp_do_flush_map MUST be called in the
  * same cpu context. Further for best results no more than a single map
  * for the do_redirect/do_flush pair should be used. This limitation is
@@ -875,11 +951,35 @@ int xdp_do_redirect(struct net_device *dev,
 void xdp_do_flush_map(void);
 
 void bpf_warn_invalid_xdp_action(u32 act);
+#else
+static inline
+int xdp_do_generic_redirect(struct net_device *dev, struct sk_buff *skb,
+			    struct xdp_buff *xdp, struct bpf_prog *prog)
+{
+	return 0;
+}
+
+static inline
+int xdp_do_redirect(struct net_device *dev,
+		    struct xdp_buff *xdp,
+		    struct bpf_prog *prog)
+{
+	return 0;
+}
+
+static inline void xdp_do_flush_map(void)
+{
+}
+
+static inline void bpf_warn_invalid_xdp_action(u32 act)
+{
+}
+#endif
 
 struct sock *do_sk_redirect_map(struct sk_buff *skb);
 struct sock *do_msg_redirect_map(struct sk_msg_buff *md);
 
-#ifdef CONFIG_INET
+#if (IS_ENABLED(CONFIG_INET) && IS_ENABLED(CONFIG_FILTER))
 struct sock *bpf_run_sk_reuseport(struct sock_reuseport *reuse, struct sock *sk,
 				  struct bpf_prog *prog, struct sk_buff *skb,
 				  u32 hash);
diff --git a/net/Kconfig b/net/Kconfig
index e07cd33f574b..ae8e7da8a7c6 100644
--- a/net/Kconfig
+++ b/net/Kconfig
@@ -316,6 +316,13 @@ config ETHTOOL
 	  This selects ethtool function, default is Y. If say N, ethtool function
 	  is not implemented.
 
+config FILTER
+	bool "enable filter"
+	default y
+	help
+	  This selects filter function, default is Y. If say N, filter function
+	  is not implemented.
+
 config NET_FLOW_LIMIT
 	bool
 	depends on RPS
diff --git a/net/core/Makefile b/net/core/Makefile
index 5c1473391f36..70cf07ec8aad 100644
--- a/net/core/Makefile
+++ b/net/core/Makefile
@@ -9,10 +9,11 @@ obj-y := sock.o request_sock.o skbuff.o datagram.o stream.o scm.o \
 obj-$(CONFIG_SYSCTL) += sysctl_net_core.o
 
 obj-y		     += dev.o dev_addr_lists.o dst.o netevent.o \
-			neighbour.o rtnetlink.o utils.o link_watch.o filter.o \
+			neighbour.o rtnetlink.o utils.o link_watch.o \
 			sock_diag.o dev_ioctl.o tso.o sock_reuseport.o \
 			fib_notifier.o xdp.o
 
+obj-$(CONFIG_FILTER) += filter.o
 obj-$(CONFIG_ETHTOOL) += ethtool.o
 obj-y += net-sysfs.o
 obj-$(CONFIG_PAGE_POOL) += page_pool.o

commit 5f2f9e73c65c3ad76b4368f594aea84f850fdc09
Author: Fenrir Lin <fenrir.lin@rock-chips.com>
Date:   Thu Sep 16 19:19:50 2021 +0800

    ARM: configs: rv1126-battery-evb.config add es7202 and ap6203
    
    Signed-off-by: Fenrir Lin <fenrir.lin@rock-chips.com>
    Change-Id: I3c3cb0ee26098812204b268d8fa732eb039f47ae

diff --git a/arch/arm/configs/rv1126-battery-evb.config b/arch/arm/configs/rv1126-battery-evb.config
index 6b8a2e3b7ba1..fa9ab4b7c5c3 100644
--- a/arch/arm/configs/rv1126-battery-evb.config
+++ b/arch/arm/configs/rv1126-battery-evb.config
@@ -1,4 +1,5 @@
 # CONFIG_AP6XXX is not set
+CONFIG_AP6XXX_INDEP_POWER=m
 CONFIG_BATTERY_CW2015=y
 CONFIG_CHARGER_GPIO=y
 CONFIG_CYW_BCMDHD=m
@@ -19,13 +20,13 @@ CONFIG_SND_PCM=y
 CONFIG_SND_SIMPLE_CARD=y
 CONFIG_SND_SIMPLE_CARD_UTILS=y
 CONFIG_SND_SOC=y
-# CONFIG_SND_SOC_DUMMY_CODEC is not set
+CONFIG_SND_SOC_ES7202=m
 CONFIG_SND_SOC_ES8311=m
 CONFIG_SND_SOC_I2C_AND_SPI=y
+CONFIG_SND_SOC_RK_CODEC_DIGITAL=m
 CONFIG_SND_SOC_ROCKCHIP=y
 # CONFIG_SND_SOC_ROCKCHIP_I2S is not set
 CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=y
-# CONFIG_SND_SOC_ROCKCHIP_PDM is not set
 CONFIG_SND_TIMER=y
 # CONFIG_SND_USB is not set
 CONFIG_SOUND=y
@@ -36,3 +37,5 @@ CONFIG_VIDEO_OS04C10=y
 # CONFIG_VIDEO_OV2718 is not set
 # CONFIG_SDIO_CIS_CYW43012 is not set
 CONFIG_SDIO_CIS_CYW43438=y
+CONFIG_SND_SOC_ES7202_I2C_BUS=4
+CONFIG_SND_SOC_ES7202_MIC_MAX_CHANNELS=2

commit 70f7f93f158910b5ce9705c09f69ce8789fbabe6
Author: David Wu <david.wu@rock-chips.com>
Date:   Sun Sep 26 16:05:18 2021 +0800

    net: core: Add ethool config option
    
    Add this config option to reduce memory usage, if it was not necessary.
    
    ./ksize.sh net
    
    before size: 739668 Bytes
    after  size: 716596 Bytes
    save   size: 23073  Bytes
    
    Signed-off-by: David Wu <david.wu@rock-chips.com>
    Change-Id: I3e3c515f6b88d2ebf04cb8976d061591caca201e

diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h
index 3aaebb60a053..c99e8849ea18 100644
--- a/include/linux/ethtool.h
+++ b/include/linux/ethtool.h
@@ -161,6 +161,7 @@ struct ethtool_link_ksettings {
 #define ethtool_link_ksettings_test_link_mode(ptr, name, mode)		\
 	test_bit(ETHTOOL_LINK_MODE_ ## mode ## _BIT, (ptr)->link_modes.name)
 
+#ifdef CONFIG_ETHTOOL
 extern int
 __ethtool_get_link_ksettings(struct net_device *dev,
 			     struct ethtool_link_ksettings *link_ksettings);
@@ -181,6 +182,33 @@ void ethtool_convert_legacy_u32_to_link_mode(unsigned long *dst,
 /* return false if src had higher bits set. lower bits always updated. */
 bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
 				     const unsigned long *src);
+#else
+static inline int
+__ethtool_get_link_ksettings(struct net_device *dev,
+			     struct ethtool_link_ksettings *link_ksettings)
+{
+	return 0;
+}
+
+static inline
+void ethtool_intersect_link_masks(struct ethtool_link_ksettings *dst,
+				  struct ethtool_link_ksettings *src)
+{
+}
+
+static inline
+void ethtool_convert_legacy_u32_to_link_mode(unsigned long *dst,
+					     u32 legacy_u32)
+{
+}
+
+static inline
+bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
+				     const unsigned long *src)
+{
+	return false;
+}
+#endif
 
 /**
  * struct ethtool_ops - optional netdev operations
diff --git a/net/Kconfig b/net/Kconfig
index 49ccc280dc3d..e07cd33f574b 100644
--- a/net/Kconfig
+++ b/net/Kconfig
@@ -309,6 +309,13 @@ config BPF_STREAM_PARSER
 	 It can be used to enforce socket policy, implement socket redirects,
 	 etc.
 
+config ETHTOOL
+	bool "enable ethtool"
+	default y
+	help
+	  This selects ethtool function, default is Y. If say N, ethtool function
+	  is not implemented.
+
 config NET_FLOW_LIMIT
 	bool
 	depends on RPS
diff --git a/net/core/Makefile b/net/core/Makefile
index 80175e6a2eb8..5c1473391f36 100644
--- a/net/core/Makefile
+++ b/net/core/Makefile
@@ -8,11 +8,12 @@ obj-y := sock.o request_sock.o skbuff.o datagram.o stream.o scm.o \
 
 obj-$(CONFIG_SYSCTL) += sysctl_net_core.o
 
-obj-y		     += dev.o ethtool.o dev_addr_lists.o dst.o netevent.o \
+obj-y		     += dev.o dev_addr_lists.o dst.o netevent.o \
 			neighbour.o rtnetlink.o utils.o link_watch.o filter.o \
 			sock_diag.o dev_ioctl.o tso.o sock_reuseport.o \
 			fib_notifier.o xdp.o
 
+obj-$(CONFIG_ETHTOOL) += ethtool.o
 obj-y += net-sysfs.o
 obj-$(CONFIG_PAGE_POOL) += page_pool.o
 obj-$(CONFIG_PROC_FS) += net-procfs.o
diff --git a/net/core/dev_ioctl.c b/net/core/dev_ioctl.c
index 90e8aa36881e..5650c0d96242 100644
--- a/net/core/dev_ioctl.c
+++ b/net/core/dev_ioctl.c
@@ -417,6 +417,7 @@ int dev_ioctl(struct net *net, unsigned int cmd, struct ifreq *ifr, bool *need_c
 			*colon = ':';
 		return ret;
 
+#ifdef CONFIG_ETHTOOL
 	case SIOCETHTOOL:
 		dev_load(net, ifr->ifr_name);
 		rtnl_lock();
@@ -425,6 +426,7 @@ int dev_ioctl(struct net *net, unsigned int cmd, struct ifreq *ifr, bool *need_c
 		if (colon)
 			*colon = ':';
 		return ret;
+#endif
 
 	/*
 	 *	These ioctl calls:
diff --git a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c
index 2597449ae9b4..f8647a382fd6 100644
--- a/net/core/sysctl_net_core.c
+++ b/net/core/sysctl_net_core.c
@@ -243,6 +243,7 @@ static int proc_do_dev_weight(struct ctl_table *table, int write,
 	return ret;
 }
 
+#ifdef CONFIG_ETHTOOL
 static int proc_do_rss_key(struct ctl_table *table, int write,
 			   void __user *buffer, size_t *lenp, loff_t *ppos)
 {
@@ -254,6 +255,7 @@ static int proc_do_rss_key(struct ctl_table *table, int write,
 	fake_table.maxlen = sizeof(buf);
 	return proc_dostring(&fake_table, write, buffer, lenp, ppos);
 }
+#endif
 
 #ifdef CONFIG_BPF_JIT
 static int proc_dointvec_minmax_bpf_enable(struct ctl_table *table, int write,
@@ -368,6 +370,7 @@ static struct ctl_table net_core_table[] = {
 		.mode		= 0644,
 		.proc_handler	= proc_dointvec
 	},
+#ifdef CONFIG_ETHTOOL
 	{
 		.procname	= "netdev_rss_key",
 		.data		= &netdev_rss_key,
@@ -375,6 +378,7 @@ static struct ctl_table net_core_table[] = {
 		.mode		= 0444,
 		.proc_handler	= proc_do_rss_key,
 	},
+#endif
 #ifdef CONFIG_BPF_JIT
 	{
 		.procname	= "bpf_jit_enable",

commit fcc4ae2e4794e2730c1af37b0b217452049374a4
Author: David Wu <david.wu@rock-chips.com>
Date:   Sat Sep 18 14:09:11 2021 +0800

    net: ethernet: stmmac: Add STMMAC_PTP config option
    
    Add this config option to reduce memory usage, if it was not necessary.
    
    ./ksize.sh drivers/net/ethernet/stmicro/
    
    before size: 59075 Bytes
    after  size: 55366 Bytes
    save   size: 3709  Bytes
    
    Signed-off-by: David Wu <david.wu@rock-chips.com>
    Change-Id: I82c404a41a7abde6adf38557d8b2096b17b4b6e5

diff --git a/drivers/net/ethernet/stmicro/stmmac/Kconfig b/drivers/net/ethernet/stmicro/stmmac/Kconfig
index 804102cc4366..21f40747f28b 100644
--- a/drivers/net/ethernet/stmicro/stmmac/Kconfig
+++ b/drivers/net/ethernet/stmicro/stmmac/Kconfig
@@ -25,6 +25,12 @@ config STMMAC_FULL
 	  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
diff --git a/drivers/net/ethernet/stmicro/stmmac/Makefile b/drivers/net/ethernet/stmicro/stmmac/Makefile
index a1592b940456..f8275ed91dd8 100644
--- a/drivers/net/ethernet/stmicro/stmmac/Makefile
+++ b/drivers/net/ethernet/stmicro/stmmac/Makefile
@@ -2,8 +2,7 @@
 obj-$(CONFIG_STMMAC_ETH) += stmmac.o
 
 stmmac-objs:= stmmac_main.o stmmac_mdio.o dwmac_lib.o	\
-	      mmc_core.o stmmac_hwtstamp.o stmmac_ptp.o	\
-	      dwmac4_descs.o dwmac4_dma.o	\
+	      mmc_core.o dwmac4_descs.o dwmac4_dma.o	\
 	      dwmac4_lib.o dwmac4_core.o hwif.o	\
 	      $(stmmac-y)
 
@@ -14,6 +13,8 @@ stmmac-$(CONFIG_STMMAC_FULL) += ring_mode.o chain_mode.o dwmac1000_core.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
 obj-$(CONFIG_DWMAC_ANARION)	+= dwmac-anarion.o
diff --git a/drivers/net/ethernet/stmicro/stmmac/hwif.c b/drivers/net/ethernet/stmicro/stmmac/hwif.c
index cbc4824df399..c6b88cd9a994 100644
--- a/drivers/net/ethernet/stmicro/stmmac/hwif.c
+++ b/drivers/net/ethernet/stmicro/stmmac/hwif.c
@@ -80,7 +80,9 @@ static const struct stmmac_hwif_entry {
 	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);
@@ -100,7 +102,9 @@ static const struct stmmac_hwif_entry {
 		.desc = NULL,
 		.dma = &dwmac100_dma_ops,
 		.mac = &dwmac100_ops,
+#ifdef CONFIG_STMMAC_PTP
 		.hwtimestamp = &stmmac_ptp,
+#endif
 		.mode = NULL,
 		.tc = NULL,
 		.setup = dwmac100_setup,
@@ -117,7 +121,9 @@ static const struct stmmac_hwif_entry {
 		.desc = NULL,
 		.dma = &dwmac1000_dma_ops,
 		.mac = &dwmac1000_ops,
+#ifdef CONFIG_STMMAC_PTP
 		.hwtimestamp = &stmmac_ptp,
+#endif
 		.mode = NULL,
 		.tc = NULL,
 		.setup = dwmac1000_setup,
@@ -134,7 +140,9 @@ static const struct stmmac_hwif_entry {
 		.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,
@@ -151,7 +159,9 @@ static const struct stmmac_hwif_entry {
 		.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,
@@ -170,7 +180,9 @@ static const struct stmmac_hwif_entry {
 		.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,
@@ -189,7 +201,9 @@ static const struct stmmac_hwif_entry {
 		.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,
@@ -206,7 +220,9 @@ static const struct stmmac_hwif_entry {
 		.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,
@@ -272,7 +288,9 @@ int stmmac_hwif_init(struct stmmac_priv *priv)
 		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/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
index fb8ffd4c54af..1eaa1f8bdbe2 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
@@ -226,8 +226,18 @@ 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/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index cff46c49b72f..921edea1ee66 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -508,6 +508,7 @@ static void stmmac_get_rx_hwtstamp(struct stmmac_priv *priv, struct dma_desc *p,
 	}
 }
 
+#ifdef CONFIG_STMMAC_PTP
 /**
  *  stmmac_hwtstamp_set - control hardware timestamping.
  *  @dev: device pointer.
@@ -760,6 +761,7 @@ static int stmmac_hwtstamp_get(struct net_device *dev, struct ifreq *ifr)
 	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 int stmmac_init_ptp(struct stmmac_priv *priv)
 
 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);
 }
@@ -2547,7 +2549,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
 
 	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);
@@ -2589,7 +2591,8 @@ static void stmmac_hw_teardown(struct net_device *dev)
 {
 	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);
 }
 
 /**
@@ -2757,7 +2760,8 @@ static int stmmac_release(struct net_device *dev)
 
 	netif_carrier_off(dev);
 
-	stmmac_release_ptp(priv);
+	if (IS_ENABLED(CONFIG_STMMAC_PTP))
+		stmmac_release_ptp(priv);
 
 	return 0;
 }
@@ -3801,12 +3805,14 @@ static int stmmac_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
 			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;
 	}
@@ -4556,7 +4562,7 @@ int stmmac_suspend(struct device *dev)
 		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);
@@ -4628,7 +4634,7 @@ int stmmac_resume(struct device *dev)
 		/* 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)

commit 3b6f928fba087e29867dcfa179666c88be6a93c6
Author: XiaoTan Luo <lxt@rock-chips.com>
Date:   Fri Sep 17 11:03:49 2021 +0800

    drm: rockchip: rk618: update hdmi connect status to jack
    
    Signed-off-by: XiaoTan Luo <lxt@rock-chips.com>
    Change-Id: I39588e906e047b9e59a60f3dd7dedf729a3a35f8

diff --git a/drivers/gpu/drm/rockchip/rk618/rk618_hdmi.c b/drivers/gpu/drm/rockchip/rk618/rk618_hdmi.c
index 4158bcce1b91..c4501877b827 100644
--- a/drivers/gpu/drm/rockchip/rk618/rk618_hdmi.c
+++ b/drivers/gpu/drm/rockchip/rk618/rk618_hdmi.c
@@ -439,6 +439,9 @@ struct rk618_hdmi {
 	struct switch_dev switchdev;
 #endif
 	struct rockchip_drm_sub_dev sub_dev;
+	hdmi_codec_plugged_cb plugged_cb;
+	struct device *codec_dev;
+	enum drm_connector_status last_connector_result;
 };
 
 enum {
@@ -544,6 +547,26 @@ static inline void hdmi_writeb(struct rk618_hdmi *hdmi, u16 offset, u32 val)
 	regmap_write(hdmi->regmap, (RK618_HDMI_BASE + ((offset) << 2)), val);
 }
 
+static void handle_plugged_change(struct rk618_hdmi *hdmi, bool plugged)
+{
+	if (hdmi->plugged_cb && hdmi->codec_dev)
+		hdmi->plugged_cb(hdmi->codec_dev, plugged);
+}
+
+static int rk618_hdmi_set_plugged_cb(struct rk618_hdmi *hdmi,
+				     hdmi_codec_plugged_cb fn,
+				     struct device *codec_dev)
+{
+	bool plugged;
+
+	hdmi->plugged_cb = fn;
+	hdmi->codec_dev = codec_dev;
+	plugged = hdmi->last_connector_result == connector_status_connected;
+	handle_plugged_change(hdmi, plugged);
+
+	return 0;
+}
+
 static void rk618_hdmi_set_polarity(struct rk618_hdmi *hdmi, int vic)
 {
 	u32 val, mask = HDMI_HSYNC_POL_INV | HDMI_VSYNC_POL_INV;
@@ -945,14 +968,23 @@ rk618_hdmi_connector_detect(struct drm_connector *connector, bool force)
 {
 	struct rk618_hdmi *hdmi = connector_to_hdmi(connector);
 	bool status;
+	enum drm_connector_status result;
 
 	status = rk618_hdmi_hpd_detect(hdmi);
 #ifdef CONFIG_SWITCH
 	switch_set_state(&hdmi->switchdev, status);
 #endif
 
-	return status ? connector_status_connected :
+	result = status ? connector_status_connected :
 			connector_status_disconnected;
+	if (result != hdmi->last_connector_result) {
+		dev_dbg(hdmi->dev, "rk618_hdmi read_hpd result: %d", result);
+		handle_plugged_change(hdmi,
+				result == connector_status_connected);
+		hdmi->last_connector_result = result;
+	}
+
+	return result;
 }
 
 static int rk618_hdmi_connector_get_modes(struct drm_connector *connector)
@@ -1284,11 +1316,21 @@ static int rk618_hdmi_audio_get_eld(struct device *dev, void *d,
 	return ret;
 }
 
+static int rk618_hdmi_hook_plugged_cb(struct device *dev, void *data,
+				      hdmi_codec_plugged_cb fn,
+				      struct device *codec_dev)
+{
+	struct rk618_hdmi *hdmi = dev_get_drvdata(dev);
+
+	return rk618_hdmi_set_plugged_cb(hdmi, fn, codec_dev);
+}
+
 static const struct hdmi_codec_ops audio_codec_ops = {
 	.hw_params = rk618_hdmi_audio_hw_params,
 	.audio_shutdown = rk618_hdmi_audio_shutdown,
 	.digital_mute = rk618_hdmi_audio_digital_mute,
 	.get_eld = rk618_hdmi_audio_get_eld,
+	.hook_plugged_cb = rk618_hdmi_hook_plugged_cb,
 };
 
 static int rk618_hdmi_audio_codec_init(struct rk618_hdmi *hdmi,

commit 8633b4cf1ddee3815b2814ecfe12c23246728fab
Author: XiaoTan Luo <lxt@rock-chips.com>
Date:   Fri Sep 17 10:35:22 2021 +0800

    drm: rockchip: rk618: add spdif for hdmi audio source
    
    Signed-off-by: XiaoTan Luo <lxt@rock-chips.com>
    Change-Id: I15cac9c3ab92140983511a5ea0e333ef991ba1e1

diff --git a/drivers/gpu/drm/rockchip/rk618/rk618_hdmi.c b/drivers/gpu/drm/rockchip/rk618/rk618_hdmi.c
index 678b527a831a..4158bcce1b91 100644
--- a/drivers/gpu/drm/rockchip/rk618/rk618_hdmi.c
+++ b/drivers/gpu/drm/rockchip/rk618/rk618_hdmi.c
@@ -1130,8 +1130,9 @@ static const struct drm_bridge_funcs rk618_hdmi_bridge_funcs = {
 	.disable = rk618_hdmi_bridge_disable,
 };
 
-static int
-rk618_hdmi_audio_config_set(struct rk618_hdmi *hdmi, struct audio_info *audio)
+static int rk618_hdmi_audio_config_set(struct rk618_hdmi *hdmi,
+				       struct hdmi_codec_daifmt *daifmt,
+				       struct audio_info *audio)
 {
 	int rate, N, channel;
 
@@ -1179,14 +1180,19 @@ rk618_hdmi_audio_config_set(struct rk618_hdmi *hdmi, struct audio_info *audio)
 		return -ENOENT;
 	}
 
-	/* set_audio source I2S */
-	hdmi_writeb(hdmi, HDMI_AUDIO_CTRL1, 0x01);
+	if (daifmt->fmt == HDMI_SPDIF) {
+		/* set_audio source SPDIF */
+		hdmi_writeb(hdmi, HDMI_AUDIO_CTRL1, 0x09);
+	} else {
+		/* set_audio source I2S */
+		hdmi_writeb(hdmi, HDMI_AUDIO_CTRL1, 0x01);
+	}
 	hdmi_writeb(hdmi, AUDIO_SAMPLE_RATE, rate);
 	hdmi_writeb(hdmi, AUDIO_I2S_MODE, v_I2S_MODE(I2S_STANDARD) |
 		    v_I2S_CHANNEL(channel));
 
 	hdmi_writeb(hdmi, AUDIO_I2S_MAP, 0x00);
-	hdmi_writeb(hdmi, AUDIO_I2S_SWAPS_SPDIF, 0);
+	hdmi_writeb(hdmi, AUDIO_I2S_SWAPS_SPDIF, rate);
 
 	/* Set N value */
 	hdmi_writeb(hdmi, AUDIO_N_H, (N >> 16) & 0x0F);
@@ -1221,12 +1227,14 @@ static int rk618_hdmi_audio_hw_params(struct device *dev, void *d,
 	switch (daifmt->fmt) {
 	case HDMI_I2S:
 		break;
+	case HDMI_SPDIF:
+		break;
 	default:
 		dev_err(dev, "%s: Invalid format %d\n", __func__, daifmt->fmt);
 		return -EINVAL;
 	}
 
-	return rk618_hdmi_audio_config_set(hdmi, &audio);
+	return rk618_hdmi_audio_config_set(hdmi, daifmt, &audio);
 }
 
 static void rk618_hdmi_audio_shutdown(struct device *dev, void *d)
@@ -1286,12 +1294,23 @@ static const struct hdmi_codec_ops audio_codec_ops = {
 static int rk618_hdmi_audio_codec_init(struct rk618_hdmi *hdmi,
 				       struct device *dev)
 {
+	const char *str = "i2s";
+	struct device_node *np = dev->of_node;
 	struct hdmi_codec_pdata codec_data = {
 		.i2s = 1,
+		.spdif = 0,
 		.ops = &audio_codec_ops,
 		.max_i2s_channels = 8,
 	};
 
+	if (of_property_read_string(np, "rockchip,format", &str))
+		dev_warn(dev, "can not get rockchip,format\n");
+
+	if (strstr(str, "spdif")) {
+		codec_data.i2s = 0;
+		codec_data.spdif = 1;
+	}
+
 	hdmi->audio_enable = false;
 	hdmi->audio_pdev = platform_device_register_data(dev,
 				HDMI_CODEC_DRV_NAME, PLATFORM_DEVID_NONE,

commit 1b50b34dcf1cf5b3c558be68f97cbd2a6dbd5e23
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Mon Sep 27 16:47:17 2021 +0800

    drm/rockchip: vop2: Set vpstate->color_key to uint64_t
    
    color_key is passed by atomic_set_property with a uint64_t val.
    
    Change-Id: Idc66dc1632f3c00f353d05016aa79f362506fef5
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 0a288894fd09..678c8fc13a31 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -261,7 +261,7 @@ struct vop2_plane_state {
 	int color_space;
 	int global_alpha;
 	int blend_mode;
-	int color_key;
+	uint64_t color_key;
 	void *yrgb_kvaddr;
 	unsigned long offset;
 	int pdaf_data_type;

commit e640e2cc5ec84b39738395709f5bc8861fc19c82
Author: XiaoTan Luo <lxt@rock-chips.com>
Date:   Fri Sep 10 14:44:34 2021 +0800

    arm64: configs: rockchip_linux_defconfig: enable SND_SOC_ROCKCHIP_HDMI
    
    enable ROCKCHIP_HDMI ASoC driver to report jack status.
    
    Signed-off-by: XiaoTan Luo <lxt@rock-chips.com>
    Change-Id: I61dd19266747cfa2eb97030c107d95924f80f03d

diff --git a/arch/arm64/configs/rockchip_linux_defconfig b/arch/arm64/configs/rockchip_linux_defconfig
index f538e125ff1a..4a740608ca47 100644
--- a/arch/arm64/configs/rockchip_linux_defconfig
+++ b/arch/arm64/configs/rockchip_linux_defconfig
@@ -382,6 +382,7 @@ CONFIG_SND_SOC_ROCKCHIP_MAX98090=y
 CONFIG_SND_SOC_ROCKCHIP_MULTICODECS=y
 CONFIG_SND_SOC_ROCKCHIP_RT5645=y
 CONFIG_SND_SOC_ROCKCHIP_RT5651_RK628=y
+CONFIG_SND_SOC_ROCKCHIP_HDMI=y
 CONFIG_SND_SOC_DUMMY_CODEC=y
 CONFIG_SND_SOC_ES7202=y
 CONFIG_SND_SOC_ES7243E=y

commit acecb8f15a8f9acbdd0805677c39e5f57e7fea7d
Author: XiaoTan Luo <lxt@rock-chips.com>
Date:   Fri Sep 10 14:40:17 2021 +0800

    arm64: configs: rockchip_defconfig: enable SND_SOC_ROCKCHIP_HDMI
    
    enable ROCKCHIP_HDMI ASoC driver to report jack status.
    
    Signed-off-by: XiaoTan Luo <lxt@rock-chips.com>
    Change-Id: I180161b64878c34bda0e5b7bd354cc993d8abee9

diff --git a/arch/arm64/configs/rockchip_defconfig b/arch/arm64/configs/rockchip_defconfig
index aac94a447b62..c58de46f644d 100644
--- a/arch/arm64/configs/rockchip_defconfig
+++ b/arch/arm64/configs/rockchip_defconfig
@@ -657,6 +657,7 @@ CONFIG_SND_SOC_ROCKCHIP_PDM=y
 CONFIG_SND_SOC_ROCKCHIP_SPDIF=y
 CONFIG_SND_SOC_ROCKCHIP_MULTICODECS=y
 CONFIG_SND_SOC_ROCKCHIP_RT5651=y
+CONFIG_SND_SOC_ROCKCHIP_HDMI=y
 CONFIG_SND_SOC_BT_SCO=y
 CONFIG_SND_SOC_CX2072X=y
 CONFIG_SND_SOC_DUMMY_CODEC=y

commit 760158d29b16f4cf28d8d7bd635f3e63c2d87e8b
Author: XiaoTan Luo <lxt@rock-chips.com>
Date:   Fri Sep 10 14:29:02 2021 +0800

    ASoC: rockchip: add machine driver for hdmi audio
    
    this patch is used for rockchip HDMI audio output.
    
    Signed-off-by: XiaoTan Luo <lxt@rock-chips.com>
    Change-Id: I577179e7563ad241014d023da12af1e622e84c9a

diff --git a/sound/soc/rockchip/Kconfig b/sound/soc/rockchip/Kconfig
index b49408e86e7b..186c40b7048d 100644
--- a/sound/soc/rockchip/Kconfig
+++ b/sound/soc/rockchip/Kconfig
@@ -108,6 +108,14 @@ config SND_SOC_ROCKCHIP_RT5651_RK628
 	  Say Y or M here if you want to add support for SoC audio on Rockchip
 	  boards for RT5651 RK628 HDMIIn
 
+config SND_SOC_ROCKCHIP_HDMI
+	tristate "ASoC support for Rockchip HDMI audio"
+	depends on SND_SOC_ROCKCHIP && CLKDEV_LOOKUP
+	select SND_SOC_HDMI_CODEC
+	help
+	  Say Y or M here if you want to add support for SoC audio on Rockchip
+	  boards using built-in HDMI or external HDMI.
+
 config SND_SOC_RK3288_HDMI_ANALOG
 	tristate "ASoC support multiple codecs for Rockchip RK3288 boards"
 	depends on SND_SOC_ROCKCHIP && I2C && GPIOLIB && CLKDEV_LOOKUP
diff --git a/sound/soc/rockchip/Makefile b/sound/soc/rockchip/Makefile
index 7541e2a636a3..927ba2aa5924 100644
--- a/sound/soc/rockchip/Makefile
+++ b/sound/soc/rockchip/Makefile
@@ -22,6 +22,7 @@ obj-$(CONFIG_SND_SOC_ROCKCHIP_PDM) += snd-soc-rockchip-pdm.o
 obj-$(CONFIG_SND_SOC_ROCKCHIP_SPDIF) += snd-soc-rockchip-spdif.o
 obj-$(CONFIG_SND_SOC_ROCKCHIP_VAD) += snd-soc-rockchip-vad.o
 
+snd-soc-rockchip-hdmi-objs := rockchip_hdmi.o
 snd-soc-rockchip-max98090-objs := rockchip_max98090.o
 snd-soc-rockchip-multicodecs-objs := rockchip_multicodecs.o
 snd-soc-rockchip-rt5645-objs := rockchip_rt5645.o
@@ -30,6 +31,7 @@ snd-soc-rockchip-rt5651-rk628-objs := rockchip_rt5651_rk628.o
 snd-soc-rk3288-hdmi-analog-objs := rk3288_hdmi_analog.o
 snd-soc-rk3399-gru-sound-objs := rk3399_gru_sound.o
 
+obj-$(CONFIG_SND_SOC_ROCKCHIP_HDMI) += snd-soc-rockchip-hdmi.o
 obj-$(CONFIG_SND_SOC_ROCKCHIP_MAX98090) += snd-soc-rockchip-max98090.o
 obj-$(CONFIG_SND_SOC_ROCKCHIP_MULTICODECS) += snd-soc-rockchip-multicodecs.o
 obj-$(CONFIG_SND_SOC_ROCKCHIP_RT5645) += snd-soc-rockchip-rt5645.o
diff --git a/sound/soc/rockchip/rockchip_hdmi.c b/sound/soc/rockchip/rockchip_hdmi.c
new file mode 100644
index 000000000000..66c6862f3133
--- /dev/null
+++ b/sound/soc/rockchip/rockchip_hdmi.c
@@ -0,0 +1,265 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Rockchip machine ASoC driver for Rockchip HDMI audio output
+ *
+ * Copyright (C) 2021 Rockchip Electronics Co., Ltd
+ *
+ * Authors: XiaoTan Luo <lxt@rock-chips.com>
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <sound/core.h>
+#include <sound/jack.h>
+#include <sound/pcm.h>
+#include <sound/pcm_params.h>
+#include <sound/soc.h>
+#include <sound/soc-dapm.h>
+
+#define DRV_NAME "rk-hdmi-sound"
+#define MAX_CODECS	2
+#define DEFAULT_MCLK_FS	256
+
+struct rk_hdmi_data {
+	struct snd_soc_card	card;
+	struct snd_soc_dai_link	dai;
+	struct snd_soc_jack	hdmi_jack;
+	struct snd_soc_jack_pin	hdmi_jack_pin;
+	unsigned int		mclk_fs;
+	bool			jack_det;
+};
+
+static int rk_hdmi_fill_widget_info(struct device *dev,
+		struct snd_soc_dapm_widget *w, enum snd_soc_dapm_type id,
+		void *priv, const char *wname, const char *stream,
+		struct snd_kcontrol_new *wc, int numkc,
+		int (*event)(struct snd_soc_dapm_widget *,
+		struct snd_kcontrol *, int), unsigned short event_flags)
+{
+	w->id = id;
+	w->name = devm_kstrdup(dev, wname, GFP_KERNEL);
+	if (!w->name)
+		return -ENOMEM;
+
+	w->sname = stream;
+	w->reg = SND_SOC_NOPM;
+	w->shift = 0;
+	w->kcontrol_news = wc;
+	w->num_kcontrols = numkc;
+	w->priv = priv;
+	w->event = event;
+	w->event_flags = event_flags;
+
+	return 0;
+}
+
+static int rk_dailink_init(struct snd_soc_pcm_runtime *rtd)
+{
+	struct snd_soc_dai *codec_dai = rtd->codec_dai;
+	struct snd_soc_card *card = rtd->card;
+	struct rk_hdmi_data *rk_data = snd_soc_card_get_drvdata(rtd->card);
+	struct device *dev = rtd->card->dev;
+	int ret = 0;
+	struct snd_soc_dapm_widget *widgets;
+
+	if (!rk_data->jack_det)
+		return 0;
+
+	widgets = devm_kcalloc(card->dapm.dev, 1,
+			       sizeof(*widgets), GFP_KERNEL);
+	if (!widgets)
+		return -ENOMEM;
+
+	ret = rk_hdmi_fill_widget_info(card->dapm.dev, widgets,
+				       snd_soc_dapm_line, NULL,
+				       rk_data->hdmi_jack_pin.pin,
+				       NULL, NULL, 0, NULL, 0);
+	if (ret < 0)
+		return ret;
+
+	ret = snd_soc_dapm_new_controls(&card->dapm, widgets, 1);
+	if (ret < 0)
+		return ret;
+
+	ret = snd_soc_dapm_new_widgets(rtd->card);
+	if (ret < 0)
+		return ret;
+
+	ret = snd_soc_card_jack_new(rtd->card,
+				    rk_data->hdmi_jack_pin.pin,
+				    rk_data->hdmi_jack_pin.mask,
+				    &rk_data->hdmi_jack,
+				    &rk_data->hdmi_jack_pin, 1);
+	if (ret) {
+		dev_err(dev, "Can't new HDMI Jack %d\n", ret);
+		return ret;
+	}
+	return snd_soc_component_set_jack(codec_dai->component,
+					  &rk_data->hdmi_jack, NULL);
+
+}
+
+static int rk_hdmi_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 rk_hdmi_data *rk_data = snd_soc_card_get_drvdata(rtd->card);
+	unsigned int mclk;
+	int ret;
+
+	mclk = params_rate(params) * rk_data->mclk_fs;
+
+	ret = snd_soc_dai_set_sysclk(codec_dai, substream->stream, mclk,
+				     SND_SOC_CLOCK_IN);
+	if (ret && ret != -ENOTSUPP) {
+		dev_err(codec_dai->dev,
+			"Set codec_dai sysclk failed: %d\n", ret);
+		return ret;
+	}
+
+	ret = snd_soc_dai_set_sysclk(cpu_dai, substream->stream, mclk,
+				     SND_SOC_CLOCK_OUT);
+	if (ret && ret != -ENOTSUPP) {
+		dev_err(cpu_dai->dev,
+			"Set cpu_dai sysclk failed: %d\n", ret);
+		return ret;
+	}
+
+	return 0;
+
+}
+
+static struct snd_soc_ops rk_ops = {
+	.hw_params = rk_hdmi_hw_params,
+};
+
+static int rk_hdmi_probe(struct platform_device *pdev)
+{
+	struct device_node *np = pdev->dev.of_node;
+	struct snd_soc_dai_link_component *codecs;
+	struct of_phandle_args args;
+	struct device_node *codec_np, *cpu_np;
+	struct rk_hdmi_data *rk_data;
+	int count;
+	u32 val;
+	int ret = 0, i = 0, idx = 0;
+
+	rk_data = devm_kzalloc(&pdev->dev, sizeof(*rk_data), GFP_KERNEL);
+	if (!rk_data)
+		return -ENOMEM;
+
+	rk_data->card.dev = &pdev->dev;
+	rk_data->dai.init = &rk_dailink_init;
+	rk_data->dai.ops = &rk_ops;
+	rk_data->dai.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
+			       SND_SOC_DAIFMT_CBS_CFS;
+	/* Parse the card name from DT */
+	ret = snd_soc_of_parse_card_name(&rk_data->card, "rockchip,card-name");
+	if (ret < 0)
+		return ret;
+	rk_data->dai.name = rk_data->card.name;
+	rk_data->dai.stream_name = rk_data->card.name;
+	count = of_count_phandle_with_args(np, "rockchip,codec", NULL);
+	if (count < 0 || count > MAX_CODECS)
+		return -EINVAL;
+
+	/* refine codecs, remove unavailable node */
+	for (i = 0; i < count; i++) {
+		codec_np = of_parse_phandle(np, "rockchip,codec", i);
+		if (!codec_np)
+			return -ENODEV;
+		if (of_device_is_available(codec_np))
+			idx++;
+		of_node_put(codec_np);
+	}
+
+	if (!idx)
+		return -ENODEV;
+
+	codecs = devm_kcalloc(&pdev->dev, idx,
+			      sizeof(*codecs), GFP_KERNEL);
+	rk_data->dai.codecs = codecs;
+	rk_data->dai.num_codecs = idx;
+	idx = 0;
+	for (i = 0; i < count; i++) {
+		codec_np = of_parse_phandle(np, "rockchip,codec", i);
+		if (!codec_np)
+			return -ENODEV;
+		if (!of_device_is_available(codec_np))
+			continue;
+
+		ret = of_parse_phandle_with_fixed_args(np, "rockchip,codec",
+						       0, i, &args);
+		if (ret) {
+			of_node_put(codec_np);
+			return ret;
+		}
+
+		codecs[idx].of_node = codec_np;
+		of_node_put(codec_np);
+		ret = snd_soc_get_dai_name(&args, &codecs[idx].dai_name);
+		if (ret)
+			return ret;
+		idx++;
+	}
+
+	cpu_np = of_parse_phandle(np, "rockchip,cpu", 0);
+	if (!cpu_np)
+		return -ENODEV;
+
+	rk_data->mclk_fs = DEFAULT_MCLK_FS;
+	if (!of_property_read_u32(np, "rockchip,mclk-fs", &val))
+		rk_data->mclk_fs = val;
+
+	rk_data->jack_det =
+		of_property_read_bool(np, "rockchip,jack-det");
+
+	rk_data->dai.cpu_of_node = cpu_np;
+	rk_data->dai.platform_of_node = cpu_np;
+	of_node_put(cpu_np);
+
+	rk_data->hdmi_jack_pin.pin = rk_data->card.name;
+	rk_data->hdmi_jack_pin.mask = SND_JACK_LINEOUT;
+	rk_data->card.num_links = 1;
+	rk_data->card.owner = THIS_MODULE;
+	rk_data->card.dai_link = &rk_data->dai;
+
+	snd_soc_card_set_drvdata(&rk_data->card, rk_data);
+	ret = devm_snd_soc_register_card(&pdev->dev, &rk_data->card);
+	if (ret == -EPROBE_DEFER)
+		return -EPROBE_DEFER;
+	if (ret) {
+		dev_err(&pdev->dev, "card register failed %d\n", ret);
+		return ret;
+	}
+	platform_set_drvdata(pdev, &rk_data->card);
+
+	return ret;
+}
+
+static const struct of_device_id rockchip_sound_of_match[] = {
+	{ .compatible = "rockchip,hdmi", },
+	{},
+};
+
+MODULE_DEVICE_TABLE(of, rockchip_sound_of_match);
+
+static struct platform_driver rockchip_sound_driver = {
+	.probe = rk_hdmi_probe,
+	.driver = {
+		.name = DRV_NAME,
+		.pm = &snd_soc_pm_ops,
+		.of_match_table = rockchip_sound_of_match,
+	},
+};
+
+module_platform_driver(rockchip_sound_driver);
+
+MODULE_AUTHOR("XiaoTan Luo <lxt@rock-chips.com>");
+MODULE_DESCRIPTION("Rockchip HDMI ASoC machine driver");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:" DRV_NAME);

commit 2001f161f23edf9c79ce1d6e088a4f66ca48081c
Author: Simon Xue <xxm@rock-chips.com>
Date:   Sat Sep 18 17:04:49 2021 +0800

    iio: adc: rockchip_saradc: fix interrupt issue
    
    Saradc interrupt status may exist forever if read saradc
    when system suspending which disable clock that finally
    lead to interrupt system dead. Add mutex in suspend to
    avoid this issue.
    
    Change-Id: I6a83e4bd79db90a79985685b5e94df2209b5ae81
    Signed-off-by: Simon Xue <xxm@rock-chips.com>

diff --git a/drivers/iio/adc/rockchip_saradc.c b/drivers/iio/adc/rockchip_saradc.c
index 4334e33df6c8..02028847aacf 100644
--- a/drivers/iio/adc/rockchip_saradc.c
+++ b/drivers/iio/adc/rockchip_saradc.c
@@ -59,6 +59,7 @@ struct rockchip_saradc {
 	struct reset_control	*reset;
 	const struct rockchip_saradc_data *data;
 	u16			last_val;
+	bool			suspended;
 #ifdef CONFIG_ROCKCHIP_SARADC_TEST_CHN
 	struct timer_list	timer;
 	bool			test;
@@ -81,6 +82,11 @@ static int rockchip_saradc_read_raw(struct iio_dev *indio_dev,
 	case IIO_CHAN_INFO_RAW:
 		mutex_lock(&indio_dev->mlock);
 
+		if (info->suspended) {
+			mutex_unlock(&indio_dev->mlock);
+			return -EBUSY;
+		}
+
 		reinit_completion(&info->completion);
 
 		/* 8 clock periods as delay between power up and start cmd */
@@ -499,10 +505,17 @@ static int rockchip_saradc_suspend(struct device *dev)
 	struct iio_dev *indio_dev = dev_get_drvdata(dev);
 	struct rockchip_saradc *info = iio_priv(indio_dev);
 
+	/* Avoid reading saradc when suspending */
+	mutex_lock(&indio_dev->mlock);
+
 	clk_disable_unprepare(info->clk);
 	clk_disable_unprepare(info->pclk);
 	regulator_disable(info->vref);
 
+	info->suspended = true;
+
+	mutex_unlock(&indio_dev->mlock);
+
 	return 0;
 }
 
@@ -524,6 +537,8 @@ static int rockchip_saradc_resume(struct device *dev)
 	if (ret)
 		clk_disable_unprepare(info->pclk);
 
+	info->suspended = false;
+
 	return ret;
 }
 #endif

commit 55e6dba6c1e9cc033065d84be043da727f7c5d08
Author: Wang Panzhenzhuan <randy.wang@rock-chips.com>
Date:   Mon Sep 27 14:49:31 2021 +0800

    arm64: dts: rockchip: rk3326-evb-lp3-v11: fix camera config
    
    Signed-off-by: Wang Panzhenzhuan <randy.wang@rock-chips.com>
    Change-Id: Ibde871bcfd026cd926d8ffbe4c94e975572aaeb8

diff --git a/arch/arm64/boot/dts/rockchip/rk3326-evb-lp3-v11-avb.dts b/arch/arm64/boot/dts/rockchip/rk3326-evb-lp3-v11-avb.dts
index 2f0c3fc3a38d..acc17114468e 100644
--- a/arch/arm64/boot/dts/rockchip/rk3326-evb-lp3-v11-avb.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3326-evb-lp3-v11-avb.dts
@@ -337,7 +337,7 @@
 &rkisp1 {
 	status = "okay";
 	pinctrl-names = "default";
-	pinctrl-0 = <&cif_clkout_m0 &dvp_d0d1_m0 &dvp_d2d9_m0>;
+	pinctrl-0 = <&cif_clkout_m0>;
 	port {
 		#address-cells = <1>;
 		#size-cells = <0>;

commit 6a5b75cf13242e8db0ddbe4b7b89be6a01481788
Author: Michael Grzeschik <m.grzeschik@pengutronix.de>
Date:   Tue Apr 21 15:28:14 2020 +0200

    BACKPORT: usb: gadget: uvc_video: add worker to handle the frame pumping
    
    This patch changes the function uvc_video_pump to be a separate
    scheduled worker. This way the completion handler of each usb request
    and every direct caller of the pump has only to schedule the worker
    instead of doing the request handling by itself.
    
    Moving the request handling to one thread solves the locking problems
    between the three queueing cases in the completion handler, v4l2_qbuf
    and video_enable.
    
    Many drivers handle the completion handlers directly in their interrupt
    handlers. This patch also reduces the workload on each interrupt.
    
    Test on RK3568 EVB1 USB 3.0 UVC, use the high priority dedicated
    workqueue instead of the system_wq can help to improve the uvc
    transfer performance.
    
    Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
    Signed-off-by: Felipe Balbi <balbi@kernel.org>
    Signed-off-by: William Wu <william.wu@rock-chips.com>
    Change-Id: I3c7ab421f8f58dad0a36e005edf8640f7b0a0402
    (cherry picked from commit 43cd0023872efbb6a86bdc03fb520de3de55c7b0)

diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c
index 871da4462192..dba91c557254 100644
--- a/drivers/usb/gadget/function/f_uvc.c
+++ b/drivers/usb/gadget/function/f_uvc.c
@@ -1018,6 +1018,12 @@ uvc_function_bind(struct usb_configuration *c, struct usb_function *f)
 		goto error;
 	}
 
+	uvc->video.async_wq = alloc_workqueue("uvcgvideo",
+					       WQ_UNBOUND | WQ_HIGHPRI,
+					       0);
+	if (!uvc->video.async_wq)
+		goto error;
+
 	/* Initialise video. */
 	ret = uvcg_video_init(&uvc->video);
 	if (ret < 0)
@@ -1214,6 +1220,9 @@ static void uvc_unbind(struct usb_configuration *c, struct usb_function *f)
 	usb_ep_free_request(cdev->gadget->ep0, uvc->control_req);
 	kfree(uvc->control_buf);
 
+	if (uvc->video.async_wq)
+		destroy_workqueue(uvc->video.async_wq);
+
 	usb_free_all_descriptors(f);
 }
 
diff --git a/drivers/usb/gadget/function/uvc.h b/drivers/usb/gadget/function/uvc.h
index 28eb0430eaea..24f00aaf9833 100644
--- a/drivers/usb/gadget/function/uvc.h
+++ b/drivers/usb/gadget/function/uvc.h
@@ -76,6 +76,8 @@ extern unsigned int uvc_gadget_trace_param;
 
 struct uvc_video {
 	struct usb_ep *ep;
+	struct work_struct pump;
+	struct workqueue_struct *async_wq;
 
 	/* Frame parameters */
 	u8 bpp;
diff --git a/drivers/usb/gadget/function/uvc_v4l2.c b/drivers/usb/gadget/function/uvc_v4l2.c
index e66002023664..9d2356eef27c 100644
--- a/drivers/usb/gadget/function/uvc_v4l2.c
+++ b/drivers/usb/gadget/function/uvc_v4l2.c
@@ -177,7 +177,9 @@ uvc_v4l2_qbuf(struct file *file, void *fh, struct v4l2_buffer *b)
 	if (ret < 0)
 		return ret;
 
-	return uvcg_video_pump(video);
+	queue_work(video->async_wq, &video->pump);
+
+	return ret;
 }
 
 static int
diff --git a/drivers/usb/gadget/function/uvc_video.c b/drivers/usb/gadget/function/uvc_video.c
index 6330237adcfd..809259d61680 100644
--- a/drivers/usb/gadget/function/uvc_video.c
+++ b/drivers/usb/gadget/function/uvc_video.c
@@ -143,44 +143,12 @@ static int uvcg_video_ep_queue(struct uvc_video *video, struct usb_request *req)
 	return ret;
 }
 
-/*
- * I somehow feel that synchronisation won't be easy to achieve here. We have
- * three events that control USB requests submission:
- *
- * - USB request completion: the completion handler will resubmit the request
- *   if a video buffer is available.
- *
- * - USB interface setting selection: in response to a SET_INTERFACE request,
- *   the handler will start streaming if a video buffer is available and if
- *   video is not currently streaming.
- *
- * - V4L2 buffer queueing: the driver will start streaming if video is not
- *   currently streaming.
- *
- * Race conditions between those 3 events might lead to deadlocks or other
- * nasty side effects.
- *
- * The "video currently streaming" condition can't be detected by the irqqueue
- * being empty, as a request can still be in flight. A separate "queue paused"
- * flag is thus needed.
- *
- * The paused flag will be set when we try to retrieve the irqqueue head if the
- * queue is empty, and cleared when we queue a buffer.
- *
- * The USB request completion handler will get the buffer at the irqqueue head
- * under protection of the queue spinlock. If the queue is empty, the streaming
- * paused flag will be set. Right after releasing the spinlock a userspace
- * application can queue a buffer. The flag will then cleared, and the ioctl
- * handler will restart the video stream.
- */
 static void
 uvc_video_complete(struct usb_ep *ep, struct usb_request *req)
 {
 	struct uvc_video *video = req->context;
 	struct uvc_video_queue *queue = &video->queue;
-	struct uvc_buffer *buf;
 	unsigned long flags;
-	int ret;
 
 	switch (req->status) {
 	case 0:
@@ -189,38 +157,20 @@ uvc_video_complete(struct usb_ep *ep, struct usb_request *req)
 	case -ESHUTDOWN:	/* disconnect from host. */
 		printk(KERN_DEBUG "VS request cancelled.\n");
 		uvcg_queue_cancel(queue, 1);
-		goto requeue;
+		break;
 
 	default:
 		printk(KERN_INFO "VS request completed with status %d.\n",
 			req->status);
 		uvcg_queue_cancel(queue, 0);
-		goto requeue;
-	}
-
-	spin_lock_irqsave(&video->queue.irqlock, flags);
-	buf = uvcg_queue_head(&video->queue);
-	if (buf == NULL) {
-		spin_unlock_irqrestore(&video->queue.irqlock, flags);
-		goto requeue;
-	}
-
-	video->encode(req, video, buf);
-
-	ret = uvcg_video_ep_queue(video, req);
-	spin_unlock_irqrestore(&video->queue.irqlock, flags);
-
-	if (ret < 0) {
-		uvcg_queue_cancel(queue, 0);
-		goto requeue;
+		break;
 	}
 
-	return;
-
-requeue:
 	spin_lock_irqsave(&video->req_lock, flags);
 	list_add_tail(&req->list, &video->req_free);
 	spin_unlock_irqrestore(&video->req_lock, flags);
+
+	queue_work(video->async_wq, &video->pump);
 }
 
 static int
@@ -309,18 +259,15 @@ uvc_video_alloc_requests(struct uvc_video *video)
  * This function fills the available USB requests (listed in req_free) with
  * video data from the queued buffers.
  */
-int uvcg_video_pump(struct uvc_video *video)
+static void uvcg_video_pump(struct work_struct *work)
 {
+	struct uvc_video *video = container_of(work, struct uvc_video, pump);
 	struct uvc_video_queue *queue = &video->queue;
 	struct usb_request *req;
 	struct uvc_buffer *buf;
 	unsigned long flags;
 	int ret;
 
-	/* FIXME TODO Race between uvcg_video_pump and requests completion
-	 * handler ???
-	 */
-
 	while (1) {
 		/* Retrieve the first available USB request, protected by the
 		 * request lock.
@@ -328,7 +275,7 @@ int uvcg_video_pump(struct uvc_video *video)
 		spin_lock_irqsave(&video->req_lock, flags);
 		if (list_empty(&video->req_free)) {
 			spin_unlock_irqrestore(&video->req_lock, flags);
-			return 0;
+			return;
 		}
 		req = list_first_entry(&video->req_free, struct usb_request,
 					list);
@@ -360,7 +307,7 @@ int uvcg_video_pump(struct uvc_video *video)
 	spin_lock_irqsave(&video->req_lock, flags);
 	list_add_tail(&req->list, &video->req_free);
 	spin_unlock_irqrestore(&video->req_lock, flags);
-	return 0;
+	return;
 }
 
 /*
@@ -383,6 +330,8 @@ int uvcg_video_enable(struct uvc_video *video, int enable)
 	opts = fi_to_f_uvc_opts(uvc->func.fi);
 
 	if (!enable) {
+		cancel_work_sync(&video->pump);
+		uvcg_queue_cancel(&video->queue, 0);
 		for (i = 0; i < opts->uvc_num_request; ++i)
 			if (video->req[i])
 				usb_ep_dequeue(video->ep, video->req[i]);
@@ -408,7 +357,9 @@ int uvcg_video_enable(struct uvc_video *video, int enable)
 	} else
 		video->encode = uvc_video_encode_isoc;
 
-	return uvcg_video_pump(video);
+	queue_work(video->async_wq, &video->pump);
+
+	return ret;
 }
 
 /*
@@ -418,6 +369,7 @@ int uvcg_video_init(struct uvc_video *video)
 {
 	INIT_LIST_HEAD(&video->req_free);
 	spin_lock_init(&video->req_lock);
+	INIT_WORK(&video->pump, uvcg_video_pump);
 
 	video->fcc = V4L2_PIX_FMT_YUYV;
 	video->bpp = 16;
diff --git a/drivers/usb/gadget/function/uvc_video.h b/drivers/usb/gadget/function/uvc_video.h
index 7d77122b0ff9..fc1e2ebd7b76 100644
--- a/drivers/usb/gadget/function/uvc_video.h
+++ b/drivers/usb/gadget/function/uvc_video.h
@@ -14,8 +14,6 @@
 
 struct uvc_video;
 
-int uvcg_video_pump(struct uvc_video *video);
-
 int uvcg_video_enable(struct uvc_video *video, int enable);
 
 int uvcg_video_init(struct uvc_video *video);

commit d5736c3819d451202b250092e01bd6b84a308ae1
Author: William Wu <william.wu@rock-chips.com>
Date:   Mon Sep 27 10:35:55 2021 +0800

    usb: dwc3: gadget: fix req list in miss isoc event processing
    
    If miss isoc event happens, the current code just move the
    current req to the tail of the pending list, and then stop
    the active transfer with cmd DWC3_DEPCMD_ENDTRANSFER. After
    these operations, the isoc endpoint wait for a XferNotReady
    event to restart the transfer with the first pending req
    from the pending_list.
    
    If there are already reqs in the pending list when move the
    miss isoc reqs to the tail of the pending list, some of the
    reqs are out of order.
    
    This patch first moves all of the reqs in the started list
    to the tail of the cancelled list, and then move all of the
    reqs in the pending list to the tail of the cancelled list.
    At last move all of the reqs in the cancelled list to the
    pending list. This can make sure all of the reqs are in order
    when restart the isoc transfer later.
    
    Signed-off-by: William Wu <william.wu@rock-chips.com>
    Change-Id: Idf38d9fd4d483854473c18f792d1996fb5fcab4b

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 924cd023636d..502262f9f455 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -2869,12 +2869,15 @@ static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep,
 		 */
 		req->remaining = 0;
 		req->needs_extra_trb = false;
-		dwc3_gadget_move_queued_request(req);
-		if (req->trb)
+		dwc3_gadget_move_cancelled_request(req);
+		if (req->trb) {
 			usb_gadget_unmap_request_by_dev(dwc->sysdev,
 							&req->request,
 							req->direction);
-		req->trb = NULL;
+			req->trb->ctrl &= ~DWC3_TRB_CTRL_HWO;
+			req->trb = NULL;
+		}
+		ret = 0;
 
 		goto out;
 	}
@@ -2930,6 +2933,8 @@ static void dwc3_gadget_endpoint_transfer_in_progress(struct dwc3_ep *dep,
 {
 	struct dwc3		*dwc = dep->dwc;
 	unsigned		status = 0;
+	struct dwc3_request	*req;
+	struct dwc3_request	*tmp;
 
 	dwc3_gadget_endpoint_frame_from_event(dep, event);
 
@@ -2941,6 +2946,19 @@ static void dwc3_gadget_endpoint_transfer_in_progress(struct dwc3_ep *dep,
 
 	dwc3_gadget_ep_cleanup_completed_requests(dep, event, status);
 
+	if (event->status & DEPEVT_STATUS_MISSED_ISOC &&
+	    !list_empty(&dep->cancelled_list) &&
+	    !list_empty(&dep->pending_list)) {
+		list_for_each_entry_safe(req, tmp, &dep->pending_list, list)
+			dwc3_gadget_move_cancelled_request(req);
+	}
+
+	if (event->status & DEPEVT_STATUS_MISSED_ISOC &&
+	    !list_empty(&dep->cancelled_list)) {
+		list_for_each_entry_safe(req, tmp, &dep->cancelled_list, list)
+			dwc3_gadget_move_queued_request(req);
+	}
+
 	if (event->status & DEPEVT_STATUS_MISSED_ISOC &&
 	    list_empty(&dep->started_list))
 		dwc3_stop_active_transfer(dep, true, true);
diff --git a/drivers/usb/dwc3/gadget.h b/drivers/usb/dwc3/gadget.h
index ba495ace7e51..9ca5ac361175 100644
--- a/drivers/usb/dwc3/gadget.h
+++ b/drivers/usb/dwc3/gadget.h
@@ -75,8 +75,6 @@ static inline void dwc3_gadget_move_queued_request(struct dwc3_request *req)
 {
 	struct dwc3_ep		*dep = req->dep;
 
-	if (req->trb)
-		req->trb->ctrl &= ~DWC3_TRB_CTRL_HWO;
 	req->status = DWC3_REQUEST_STATUS_QUEUED;
 	list_move_tail(&req->list, &dep->pending_list);
 }

commit 10a836e900a98615374668d03052d9e023bb75e8
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Fri Sep 24 11:20:00 2021 +0800

    drm/rockchip: ebc_dev: release version v2.12
    
    add EPD_AUTO_DU and EPD_AUTO_DU4 mode
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: I663dce6978a922fff2afe73327b0f8dc8c83f58a

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c b/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
index 68bb652b4206..32f3d1ccf5a3 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
+++ b/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
@@ -101,7 +101,9 @@ int ebc_add_to_dsp_buf_list(struct ebc_buf_s *dsp_buf)
 					if (temp_buf->buf_mode == EPD_OVERLAY) {
 						continue;
 					} else if (((temp_buf->buf_mode >= EPD_FULL_GC16) && (temp_buf->buf_mode <= EPD_DU4))
-						|| (temp_buf->buf_mode == EPD_AUTO)) {
+						|| (temp_buf->buf_mode == EPD_AUTO)
+						|| (temp_buf->buf_mode == EPD_AUTO_DU)
+						|| (temp_buf->buf_mode == EPD_AUTO_DU4)) {
 						buf_list_remove(ebc_buf_info.dsp_buf_list, temp_pos);
 						ebc_buf_release(temp_buf);
 					} else if ((1 == is_full_mode)
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
index aa31f0463e56..c745dc16d4ea 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
@@ -79,6 +79,8 @@ enum panel_refresh_mode {
 	EPD_RESUME		= 19,
 	EPD_POWER_OFF		= 20,
 	EPD_FORCE_FULL		= 21,
+	EPD_AUTO_DU		= 22,
+	EPD_AUTO_DU4		= 23,
 };
 
 /*
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index 9ed386ebbf21..56f88d714864 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -23,49 +23,49 @@ __initcall_ebc_init6s:
 get_auto_image:
 .LFB2811:
 	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
-	.loc 1 455 0
+	.loc 1 457 0
 	.cfi_startproc
 .LVL0:
-	.loc 1 456 0
+	.loc 1 458 0
 	adrp	x5, .LANCHOR0
-	.loc 1 464 0
+	.loc 1 466 0
 	ldrb	w11, [x4, 48]
 .LVL1:
-	.loc 1 456 0
+	.loc 1 458 0
 	ldr	x16, [x5, #:lo12:.LANCHOR0]
-	.loc 1 468 0
+	.loc 1 470 0
 	add	x16, x16, 24
 	ldr	w18, [x16, 156]
-	.loc 1 474 0
-	ldp	w12, w17, [x16, 84]
 	.loc 1 476 0
+	ldp	w12, w17, [x16, 84]
+	.loc 1 478 0
 	str	wzr, [x4, 52]
 .LVL2:
-	.loc 1 482 0
+	.loc 1 484 0
 	cmp	w17, 0
 	ble	.L54
 	lsr	w12, w12, 3
 .LVL3:
-	.loc 1 455 0
+	.loc 1 457 0
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
 	sub	w15, w12, #1
-	.loc 1 482 0
+	.loc 1 484 0
 	mov	w14, 0
 .LVL4:
 	add	x15, x15, 1
-	.loc 1 455 0
+	.loc 1 457 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	lsl	x30, x15, 3
 	lsl	x15, x15, 2
 	stp	x19, x20, [sp, 16]
 	stp	x21, x22, [sp, 32]
-	.loc 1 494 0
+	.loc 1 496 0
 	mov	w13, 1
-	.loc 1 455 0
+	.loc 1 457 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 19, -48
 	.cfi_offset 20, -40
@@ -76,9 +76,9 @@ get_auto_image:
 .LVL5:
 	.p2align 2
 .L26:
-	.loc 1 483 0
+	.loc 1 485 0
 	cbz	w18, .L3
-	.loc 1 484 0
+	.loc 1 486 0
 	ldp	w5, w10, [x16, 84]
 .LVL6:
 	sub	w10, w10, #1
@@ -91,306 +91,306 @@ get_auto_image:
 	add	x10, x10, 2
 .LVL8:
 	add	x6, x3, 8
-	.loc 1 488 0 discriminator 1
+	.loc 1 490 0 discriminator 1
 	mov	x9, 0
 	cbz	w12, .L5
 	.p2align 2
 .L42:
-	.loc 1 491 0
+	.loc 1 493 0
 	ldr	w7, [x1, x9, lsl 2]
 .LVL9:
-	.loc 1 492 0
+	.loc 1 494 0
 	ldr	w5, [x2, x9, lsl 2]
 .LVL10:
-	.loc 1 493 0
+	.loc 1 495 0
 	cmp	w7, w5
 	beq	.L7
-	.loc 1 495 0
+	.loc 1 497 0
 	eor	w8, w7, w5
-	.loc 1 494 0
+	.loc 1 496 0
 	str	w13, [x4, 52]
-	.loc 1 490 0
+	.loc 1 492 0
 	mov	w19, 0
-	.loc 1 496 0
+	.loc 1 498 0
 	tst	x8, 15
 	beq	.L8
-	.loc 1 497 0
-	ldrb	w21, [x6, -8]
 	.loc 1 499 0
+	ldrb	w21, [x6, -8]
+	.loc 1 501 0
 	ubfiz	w19, w5, 8, 8
 	ldr	x22, [x4, 128]
 	add	w19, w19, w7, uxtb
-	.loc 1 501 0
+	.loc 1 503 0
 	add	w20, w21, 1
-	.loc 1 499 0
+	.loc 1 501 0
 	add	x19, x22, x19
-	.loc 1 498 0
+	.loc 1 500 0
 	lsl	w21, w21, 16
-	.loc 1 501 0
+	.loc 1 503 0
 	and	w20, w20, 255
-	.loc 1 502 0
+	.loc 1 504 0
 	cmp	w11, w20
-	.loc 1 499 0
+	.loc 1 501 0
 	ldrb	w19, [x19, w21, sxtw]
 	and	w19, w19, 3
-	.loc 1 502 0
+	.loc 1 504 0
 	beq	.L58
 .L9:
-	.loc 1 506 0
+	.loc 1 508 0
 	strb	w20, [x6, -8]
 .L8:
-	.loc 1 509 0
+	.loc 1 511 0
 	tst	w8, 240
 	beq	.L10
-	.loc 1 512 0
+	.loc 1 514 0
 	lsr	w20, w5, 4
-	.loc 1 510 0
-	ldrb	w21, [x6, -7]
 	.loc 1 512 0
+	ldrb	w21, [x6, -7]
+	.loc 1 514 0
 	ubfx	x22, x7, 4, 8
 	ubfiz	w20, w20, 8, 8
 	add	w20, w20, w22
 	ldr	x22, [x4, 128]
-	.loc 1 511 0
+	.loc 1 513 0
 	lsl	w23, w21, 16
-	.loc 1 514 0
+	.loc 1 516 0
 	add	w21, w21, 1
-	.loc 1 512 0
-	add	x20, x22, x20
 	.loc 1 514 0
+	add	x20, x22, x20
+	.loc 1 516 0
 	and	w21, w21, 255
-	.loc 1 515 0
+	.loc 1 517 0
 	cmp	w11, w21
-	.loc 1 512 0
+	.loc 1 514 0
 	ldrb	w20, [x20, w23, sxtw]
-	.loc 1 513 0
+	.loc 1 515 0
 	ubfiz	w20, w20, 2, 2
 	orr	w19, w20, w19
-	.loc 1 515 0
+	.loc 1 517 0
 	beq	.L59
 .L11:
-	.loc 1 519 0
+	.loc 1 521 0
 	strb	w21, [x6, -7]
 .L10:
-	.loc 1 522 0
+	.loc 1 524 0
 	tst	w8, 3840
 	beq	.L12
-	.loc 1 523 0
-	ldrb	w22, [x6, -6]
 	.loc 1 525 0
+	ldrb	w22, [x6, -6]
+	.loc 1 527 0
 	and	w21, w5, 65280
 	ldr	x23, [x4, 128]
 	ubfx	x20, x7, 8, 8
 	orr	w20, w20, w21
-	.loc 1 527 0
+	.loc 1 529 0
 	add	w21, w22, 1
-	.loc 1 524 0
+	.loc 1 526 0
 	lsl	w22, w22, 16
-	.loc 1 527 0
+	.loc 1 529 0
 	and	w21, w21, 255
-	.loc 1 525 0
+	.loc 1 527 0
 	add	x20, x23, x20, uxth
-	.loc 1 528 0
+	.loc 1 530 0
 	cmp	w11, w21
-	.loc 1 525 0
+	.loc 1 527 0
 	ldrb	w20, [x20, w22, sxtw]
-	.loc 1 526 0
+	.loc 1 528 0
 	ubfiz	w20, w20, 4, 2
 	orr	w19, w20, w19
-	.loc 1 528 0
+	.loc 1 530 0
 	beq	.L60
 .L13:
-	.loc 1 532 0
+	.loc 1 534 0
 	strb	w21, [x6, -6]
 .L12:
-	.loc 1 535 0
+	.loc 1 537 0
 	tst	w8, 61440
 	beq	.L14
-	.loc 1 538 0
+	.loc 1 540 0
 	lsr	w20, w5, 12
-	.loc 1 536 0
-	ldrb	w21, [x6, -5]
 	.loc 1 538 0
+	ldrb	w21, [x6, -5]
+	.loc 1 540 0
 	ubfx	x22, x7, 12, 8
 	ubfiz	w20, w20, 8, 8
 	add	w20, w20, w22
 	ldr	x22, [x4, 128]
-	.loc 1 537 0
+	.loc 1 539 0
 	lsl	w23, w21, 16
-	.loc 1 540 0
+	.loc 1 542 0
 	add	w21, w21, 1
-	.loc 1 538 0
-	add	x20, x22, x20
 	.loc 1 540 0
+	add	x20, x22, x20
+	.loc 1 542 0
 	and	w21, w21, 255
-	.loc 1 541 0
+	.loc 1 543 0
 	cmp	w11, w21
-	.loc 1 538 0
+	.loc 1 540 0
 	ldrb	w20, [x20, w23, sxtw]
-	.loc 1 539 0
+	.loc 1 541 0
 	ubfiz	w20, w20, 6, 2
 	orr	w19, w20, w19
-	.loc 1 541 0
+	.loc 1 543 0
 	beq	.L61
 .L15:
-	.loc 1 545 0
+	.loc 1 547 0
 	strb	w21, [x6, -5]
 .L14:
-	.loc 1 548 0
+	.loc 1 550 0
 	strb	w19, [x10, -2]
-	.loc 1 551 0
+	.loc 1 553 0
 	tst	w8, 983040
-	.loc 1 550 0
+	.loc 1 552 0
 	mov	w19, 0
-	.loc 1 551 0
+	.loc 1 553 0
 	beq	.L16
-	.loc 1 554 0
+	.loc 1 556 0
 	lsr	w19, w5, 16
-	.loc 1 552 0
-	ldrb	w20, [x6, -4]
 	.loc 1 554 0
+	ldrb	w20, [x6, -4]
+	.loc 1 556 0
 	ubfx	x21, x7, 16, 8
 	ubfiz	w19, w19, 8, 8
 	add	w19, w19, w21
 	ldr	x21, [x4, 128]
-	.loc 1 553 0
+	.loc 1 555 0
 	lsl	w22, w20, 16
-	.loc 1 556 0
+	.loc 1 558 0
 	add	w20, w20, 1
-	.loc 1 554 0
-	add	x19, x21, x19
 	.loc 1 556 0
+	add	x19, x21, x19
+	.loc 1 558 0
 	and	w20, w20, 255
-	.loc 1 557 0
+	.loc 1 559 0
 	cmp	w11, w20
-	.loc 1 554 0
+	.loc 1 556 0
 	ldrb	w19, [x19, w22, sxtw]
 	and	w19, w19, 3
-	.loc 1 557 0
+	.loc 1 559 0
 	beq	.L62
 .L17:
-	.loc 1 561 0
+	.loc 1 563 0
 	strb	w20, [x6, -4]
 .L16:
-	.loc 1 564 0
+	.loc 1 566 0
 	tst	w8, 15728640
 	beq	.L18
-	.loc 1 567 0
+	.loc 1 569 0
 	lsr	w20, w5, 20
-	.loc 1 565 0
-	ldrb	w21, [x6, -3]
 	.loc 1 567 0
+	ldrb	w21, [x6, -3]
+	.loc 1 569 0
 	ubfx	x22, x7, 20, 8
 	ubfiz	w20, w20, 8, 8
 	add	w20, w20, w22
 	ldr	x22, [x4, 128]
-	.loc 1 566 0
+	.loc 1 568 0
 	lsl	w23, w21, 16
-	.loc 1 569 0
+	.loc 1 571 0
 	add	w21, w21, 1
-	.loc 1 567 0
-	add	x20, x22, x20
 	.loc 1 569 0
+	add	x20, x22, x20
+	.loc 1 571 0
 	and	w21, w21, 255
-	.loc 1 570 0
+	.loc 1 572 0
 	cmp	w11, w21
-	.loc 1 567 0
+	.loc 1 569 0
 	ldrb	w20, [x20, w23, sxtw]
-	.loc 1 568 0
+	.loc 1 570 0
 	ubfiz	w20, w20, 2, 2
 	orr	w19, w20, w19
-	.loc 1 570 0
+	.loc 1 572 0
 	beq	.L63
 .L19:
-	.loc 1 574 0
+	.loc 1 576 0
 	strb	w21, [x6, -3]
 .L18:
-	.loc 1 577 0
+	.loc 1 579 0
 	tst	w8, 251658240
 	beq	.L20
-	.loc 1 578 0
-	ldrb	w22, [x6, -2]
 	.loc 1 580 0
+	ldrb	w22, [x6, -2]
+	.loc 1 582 0
 	lsr	w20, w5, 24
 	mov	w21, w20
 	lsr	w24, w7, 24
 	ldr	x23, [x4, 128]
 	add	w20, w24, w21, lsl 8
-	.loc 1 582 0
+	.loc 1 584 0
 	add	w21, w22, 1
-	.loc 1 579 0
+	.loc 1 581 0
 	lsl	w22, w22, 16
-	.loc 1 580 0
-	add	x20, x23, x20
 	.loc 1 582 0
+	add	x20, x23, x20
+	.loc 1 584 0
 	and	w21, w21, 255
-	.loc 1 583 0
+	.loc 1 585 0
 	cmp	w11, w21
-	.loc 1 580 0
+	.loc 1 582 0
 	ldrb	w20, [x20, w22, sxtw]
-	.loc 1 581 0
+	.loc 1 583 0
 	ubfiz	w20, w20, 4, 2
 	orr	w19, w20, w19
-	.loc 1 583 0
+	.loc 1 585 0
 	beq	.L64
 .L21:
-	.loc 1 587 0
+	.loc 1 589 0
 	strb	w21, [x6, -2]
 .L20:
-	.loc 1 590 0
+	.loc 1 592 0
 	tst	w8, -268435456
 	beq	.L22
-	.loc 1 591 0
-	ldrb	w21, [x6, -1]
 	.loc 1 593 0
+	ldrb	w21, [x6, -1]
+	.loc 1 595 0
 	lsr	w8, w5, 28
 .LVL11:
 	mov	w20, w8
 	lsr	w23, w7, 28
 	ldr	x22, [x4, 128]
 	add	w8, w23, w20, lsl 8
-	.loc 1 595 0
+	.loc 1 597 0
 	add	w20, w21, 1
-	.loc 1 592 0
+	.loc 1 594 0
 	lsl	w21, w21, 16
-	.loc 1 593 0
-	add	x8, x22, x8
 	.loc 1 595 0
+	add	x8, x22, x8
+	.loc 1 597 0
 	and	w20, w20, 255
-	.loc 1 596 0
+	.loc 1 598 0
 	cmp	w11, w20
-	.loc 1 593 0
+	.loc 1 595 0
 	ldrb	w8, [x8, w21, sxtw]
-	.loc 1 594 0
+	.loc 1 596 0
 	ubfiz	w8, w8, 6, 2
 	orr	w19, w8, w19
-	.loc 1 596 0
+	.loc 1 598 0
 	beq	.L65
 .L23:
-	.loc 1 600 0
+	.loc 1 602 0
 	strb	w20, [x6, -1]
 .LVL12:
 .L22:
-	.loc 1 603 0
+	.loc 1 605 0
 	str	w5, [x2, x9, lsl 2]
-	.loc 1 604 0
+	.loc 1 606 0
 	strb	w19, [x10, -1]
 .L24:
 	add	x9, x9, 1
 	add	x10, x10, 2
 	add	x6, x6, 8
-	.loc 1 488 0 discriminator 2
+	.loc 1 490 0 discriminator 2
 	cmp	w12, w9
 	bgt	.L42
 	add	x3, x3, x30
 	add	x2, x2, x15
 	add	x1, x1, x15
 .L5:
-	.loc 1 482 0 discriminator 2
+	.loc 1 484 0 discriminator 2
 	add	w14, w14, 1
 	cmp	w17, w14
 	bne	.L26
-	.loc 1 616 0
+	.loc 1 618 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
@@ -410,100 +410,100 @@ get_auto_image:
 	.p2align 3
 .L65:
 	.cfi_restore_state
-	.loc 1 598 0
+	.loc 1 600 0
 	and	w5, w5, 268435455
 .LVL14:
 	and	w7, w7, -268435456
 .LVL15:
 	orr	w5, w7, w5
 .LVL16:
-	.loc 1 597 0
+	.loc 1 599 0
 	mov	w20, 0
 	b	.L23
 .LVL17:
 	.p2align 3
 .L64:
-	.loc 1 585 0
+	.loc 1 587 0
 	and	w5, w5, -251658241
 .LVL18:
 	and	w20, w7, 251658240
 	orr	w5, w20, w5
 .LVL19:
-	.loc 1 584 0
+	.loc 1 586 0
 	mov	w21, 0
 	b	.L21
 	.p2align 3
 .L62:
-	.loc 1 559 0
+	.loc 1 561 0
 	and	w20, w7, 983040
 	and	w5, w5, -983041
 .LVL20:
 	orr	w5, w20, w5
 .LVL21:
-	.loc 1 558 0
+	.loc 1 560 0
 	mov	w20, 0
 	b	.L17
 	.p2align 3
 .L63:
-	.loc 1 572 0
+	.loc 1 574 0
 	and	w5, w5, -15728641
 .LVL22:
 	and	w20, w7, 15728640
 	orr	w5, w20, w5
 .LVL23:
-	.loc 1 571 0
+	.loc 1 573 0
 	mov	w21, 0
 	b	.L19
 	.p2align 3
 .L61:
-	.loc 1 543 0
+	.loc 1 545 0
 	and	w5, w5, -61441
 .LVL24:
 	and	w20, w7, 61440
 	orr	w5, w20, w5
 .LVL25:
-	.loc 1 542 0
+	.loc 1 544 0
 	mov	w21, 0
 	b	.L15
 	.p2align 3
 .L59:
-	.loc 1 517 0
+	.loc 1 519 0
 	and	w5, w5, -241
 .LVL26:
 	and	w20, w7, 240
 	orr	w5, w20, w5
 .LVL27:
-	.loc 1 516 0
+	.loc 1 518 0
 	mov	w21, 0
 	b	.L11
 	.p2align 3
 .L60:
-	.loc 1 530 0
+	.loc 1 532 0
 	and	w5, w5, -3841
 .LVL28:
 	and	w20, w7, 3840
 	orr	w5, w20, w5
 .LVL29:
-	.loc 1 529 0
+	.loc 1 531 0
 	mov	w21, 0
 	b	.L13
 	.p2align 3
 .L58:
-	.loc 1 504 0
+	.loc 1 506 0
 	bfi	w5, w7, 0, 4
-	.loc 1 503 0
+	.loc 1 505 0
 	mov	w20, 0
 	b	.L9
 	.p2align 3
 .L7:
-	.loc 1 607 0
+	.loc 1 609 0
 	strb	wzr, [x10, -2]
-	.loc 1 608 0
+	.loc 1 610 0
 	strb	wzr, [x10, -1]
 	b	.L24
 	.p2align 3
 .L3:
-	.loc 1 486 0
+	.loc 1 488 0
 	ldr	w10, [x16, 84]
 	mul	w10, w14, w10
 	lsr	w10, w10, 2
@@ -530,25 +530,25 @@ get_auto_image:
 	.type	get_overlay_image, %function
 get_overlay_image:
 .LFB2812:
-	.loc 1 620 0
+	.loc 1 622 0
 	.cfi_startproc
 .LVL32:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
 	.cfi_offset 30, -88
-	.loc 1 621 0
+	.loc 1 623 0
 	adrp	x5, .LANCHOR0
-	.loc 1 620 0
+	.loc 1 622 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 621 0
+	.loc 1 623 0
 	ldr	x17, [x5, #:lo12:.LANCHOR0]
-	.loc 1 620 0
+	.loc 1 622 0
 	stp	x19, x20, [sp, 16]
-	.loc 1 633 0
+	.loc 1 635 0
 	add	x17, x17, 24
-	.loc 1 620 0
+	.loc 1 622 0
 	stp	x21, x22, [sp, 32]
 	stp	x23, x24, [sp, 48]
 	stp	x25, x26, [sp, 64]
@@ -562,14 +562,14 @@ get_overlay_image:
 	.cfi_offset 25, -32
 	.cfi_offset 26, -24
 	.cfi_offset 27, -16
-	.loc 1 639 0
+	.loc 1 641 0
 	ldp	w11, w18, [x17, 84]
-	.loc 1 633 0
+	.loc 1 635 0
 	ldr	w30, [x17, 156]
-	.loc 1 641 0
+	.loc 1 643 0
 	str	wzr, [x4, 52]
 .LVL33:
-	.loc 1 647 0
+	.loc 1 649 0
 	cmp	w18, 0
 	ble	.L66
 	lsr	w11, w11, 3
@@ -577,21 +577,21 @@ get_overlay_image:
 	mov	w13, 0
 .LVL35:
 	sub	w16, w11, #1
-	.loc 1 659 0
+	.loc 1 661 0
 	mov	w12, 1
 	add	x16, x16, 1
-	.loc 1 797 0
+	.loc 1 799 0
 	mov	w15, -268435456
 	lsl	x19, x16, 3
 	lsl	x16, x16, 2
-	.loc 1 779 0
+	.loc 1 781 0
 	mov	w14, 251658240
 .LVL36:
 	.p2align 2
 .L99:
-	.loc 1 648 0
+	.loc 1 650 0
 	cbz	w30, .L68
-	.loc 1 649 0
+	.loc 1 651 0
 	ldp	w5, w10, [x17, 84]
 .LVL37:
 	sub	w10, w10, #1
@@ -604,390 +604,390 @@ get_overlay_image:
 	add	x10, x10, 2
 .LVL39:
 	add	x7, x3, 8
-	.loc 1 653 0 discriminator 1
+	.loc 1 655 0 discriminator 1
 	mov	x9, 0
 	cbz	w11, .L70
 	.p2align 2
 .L131:
-	.loc 1 656 0
+	.loc 1 658 0
 	ldr	w5, [x1, x9, lsl 2]
 .LVL40:
-	.loc 1 657 0
+	.loc 1 659 0
 	ldr	w6, [x2, x9, lsl 2]
 .LVL41:
-	.loc 1 658 0
+	.loc 1 660 0
 	cmp	w5, w6
 	beq	.L72
-	.loc 1 660 0
+	.loc 1 662 0
 	eor	w8, w5, w6
-	.loc 1 659 0
+	.loc 1 661 0
 	str	w12, [x4, 52]
-	.loc 1 655 0
+	.loc 1 657 0
 	mov	w20, 0
-	.loc 1 661 0
+	.loc 1 663 0
 	tst	x8, 15
 	beq	.L73
-	.loc 1 663 0
-	ldrb	w21, [x7, -8]
 	.loc 1 665 0
+	ldrb	w21, [x7, -8]
+	.loc 1 667 0
 	ubfiz	w20, w6, 8, 8
 	ldr	x23, [x4, 128]
 	add	w20, w20, w5, uxtb
-	.loc 1 671 0
+	.loc 1 673 0
 	ldrb	w22, [x4, 48]
-	.loc 1 664 0
+	.loc 1 666 0
 	lsl	w25, w21, 16
-	.loc 1 665 0
+	.loc 1 667 0
 	add	x20, x23, x20
-	.loc 1 669 0
+	.loc 1 671 0
 	ldrb	w24, [x4, 49]
-	.loc 1 668 0
+	.loc 1 670 0
 	ands	w23, w5, 15
-	.loc 1 669 0
+	.loc 1 671 0
 	ccmp	w23, 15, 4, ne
-	.loc 1 667 0
+	.loc 1 669 0
 	add	w21, w21, 1
-	.loc 1 665 0
-	ldrb	w20, [x20, w25, sxtw]
 	.loc 1 667 0
-	and	w21, w21, 255
+	ldrb	w20, [x20, w25, sxtw]
 	.loc 1 669 0
+	and	w21, w21, 255
+	.loc 1 671 0
 	csel	w22, w22, w24, ne
-	.loc 1 665 0
+	.loc 1 667 0
 	and	w20, w20, 3
-	.loc 1 672 0
+	.loc 1 674 0
 	cmp	w22, w21
 	beq	.L143
 .L75:
-	.loc 1 676 0
+	.loc 1 678 0
 	strb	w21, [x7, -8]
 .L73:
-	.loc 1 679 0
+	.loc 1 681 0
 	tst	w8, 240
 	beq	.L76
-	.loc 1 681 0
-	ldrb	w22, [x7, -7]
 	.loc 1 683 0
+	ldrb	w22, [x7, -7]
+	.loc 1 685 0
 	lsr	w21, w6, 4
 	ubfx	x23, x5, 4, 8
 	ubfiz	w21, w21, 8, 8
 	ldr	x24, [x4, 128]
 	add	w21, w21, w23
-	.loc 1 682 0
+	.loc 1 684 0
 	lsl	w27, w22, 16
-	.loc 1 680 0
+	.loc 1 682 0
 	and	w25, w5, 240
-	.loc 1 683 0
-	add	x24, x24, x21
 	.loc 1 685 0
+	add	x24, x24, x21
+	.loc 1 687 0
 	add	w21, w22, 1
-	.loc 1 689 0
+	.loc 1 691 0
 	ldrb	w23, [x4, 48]
-	.loc 1 686 0
+	.loc 1 688 0
 	cmp	w25, 240
-	.loc 1 687 0
+	.loc 1 689 0
 	ldrb	w26, [x4, 49]
 	ccmp	w25, 0, 4, ne
-	.loc 1 683 0
-	ldrb	w22, [x24, w27, sxtw]
 	.loc 1 685 0
-	and	w21, w21, 255
+	ldrb	w22, [x24, w27, sxtw]
 	.loc 1 687 0
+	and	w21, w21, 255
+	.loc 1 689 0
 	csel	w23, w23, w26, ne
-	.loc 1 690 0
+	.loc 1 692 0
 	cmp	w23, w21
-	.loc 1 684 0
+	.loc 1 686 0
 	ubfiz	w22, w22, 2, 2
 	orr	w20, w22, w20
-	.loc 1 690 0
+	.loc 1 692 0
 	beq	.L144
 .L78:
-	.loc 1 694 0
+	.loc 1 696 0
 	strb	w21, [x7, -7]
 .L76:
-	.loc 1 697 0
+	.loc 1 699 0
 	tst	w8, 3840
 	beq	.L79
-	.loc 1 699 0
-	ldrb	w21, [x7, -6]
 	.loc 1 701 0
+	ldrb	w21, [x7, -6]
+	.loc 1 703 0
 	and	w23, w6, 65280
 	ldr	x24, [x4, 128]
 	ubfx	x22, x5, 8, 8
 	orr	w22, w22, w23
-	.loc 1 698 0
-	and	w23, w5, 3840
 	.loc 1 700 0
+	and	w23, w5, 3840
+	.loc 1 702 0
 	lsl	w26, w21, 16
-	.loc 1 705 0
+	.loc 1 707 0
 	ldrb	w25, [x4, 49]
-	.loc 1 701 0
+	.loc 1 703 0
 	add	x22, x24, x22, uxth
-	.loc 1 704 0
+	.loc 1 706 0
 	cmp	w23, 3840
-	.loc 1 707 0
+	.loc 1 709 0
 	ldrb	w24, [x4, 48]
-	.loc 1 705 0
+	.loc 1 707 0
 	ccmp	w23, 0, 4, ne
-	.loc 1 703 0
+	.loc 1 705 0
 	add	w21, w21, 1
-	.loc 1 701 0
-	ldrb	w22, [x22, w26, sxtw]
 	.loc 1 703 0
-	and	w21, w21, 255
+	ldrb	w22, [x22, w26, sxtw]
 	.loc 1 705 0
+	and	w21, w21, 255
+	.loc 1 707 0
 	csel	w24, w24, w25, ne
-	.loc 1 708 0
+	.loc 1 710 0
 	cmp	w24, w21
-	.loc 1 702 0
+	.loc 1 704 0
 	ubfiz	w22, w22, 4, 2
 	orr	w20, w22, w20
-	.loc 1 708 0
+	.loc 1 710 0
 	beq	.L145
 .L81:
-	.loc 1 712 0
+	.loc 1 714 0
 	strb	w21, [x7, -6]
 .L79:
-	.loc 1 715 0
+	.loc 1 717 0
 	tst	w8, 61440
 	beq	.L82
-	.loc 1 717 0
-	ldrb	w22, [x7, -5]
 	.loc 1 719 0
+	ldrb	w22, [x7, -5]
+	.loc 1 721 0
 	lsr	w21, w6, 12
 	ubfx	x23, x5, 12, 8
 	ubfiz	w21, w21, 8, 8
 	ldr	x24, [x4, 128]
 	add	w21, w21, w23
-	.loc 1 718 0
+	.loc 1 720 0
 	lsl	w27, w22, 16
-	.loc 1 716 0
+	.loc 1 718 0
 	and	w25, w5, 61440
-	.loc 1 719 0
-	add	x24, x24, x21
 	.loc 1 721 0
+	add	x24, x24, x21
+	.loc 1 723 0
 	add	w21, w22, 1
-	.loc 1 725 0
+	.loc 1 727 0
 	ldrb	w23, [x4, 48]
-	.loc 1 722 0
+	.loc 1 724 0
 	cmp	w25, 61440
-	.loc 1 723 0
+	.loc 1 725 0
 	ldrb	w26, [x4, 49]
 	ccmp	w25, 0, 4, ne
-	.loc 1 719 0
-	ldrb	w22, [x24, w27, sxtw]
 	.loc 1 721 0
-	and	w21, w21, 255
+	ldrb	w22, [x24, w27, sxtw]
 	.loc 1 723 0
+	and	w21, w21, 255
+	.loc 1 725 0
 	csel	w23, w23, w26, ne
-	.loc 1 726 0
+	.loc 1 728 0
 	cmp	w23, w21
-	.loc 1 720 0
+	.loc 1 722 0
 	ubfiz	w22, w22, 6, 2
 	orr	w20, w22, w20
-	.loc 1 726 0
+	.loc 1 728 0
 	beq	.L146
 .L84:
-	.loc 1 730 0
+	.loc 1 732 0
 	strb	w21, [x7, -5]
 .L82:
-	.loc 1 733 0
+	.loc 1 735 0
 	strb	w20, [x10, -2]
-	.loc 1 736 0
+	.loc 1 738 0
 	tst	w8, 983040
-	.loc 1 735 0
+	.loc 1 737 0
 	mov	w20, 0
-	.loc 1 736 0
+	.loc 1 738 0
 	beq	.L85
-	.loc 1 740 0
+	.loc 1 742 0
 	lsr	w20, w6, 16
-	.loc 1 738 0
-	ldrb	w21, [x7, -4]
 	.loc 1 740 0
+	ldrb	w21, [x7, -4]
+	.loc 1 742 0
 	ubfx	x22, x5, 16, 8
 	ubfiz	w20, w20, 8, 8
 	add	w20, w20, w22
 	ldr	x22, [x4, 128]
-	.loc 1 739 0
+	.loc 1 741 0
 	lsl	w25, w21, 16
-	.loc 1 737 0
+	.loc 1 739 0
 	and	w23, w5, 983040
-	.loc 1 740 0
+	.loc 1 742 0
 	add	x20, x22, x20
-	.loc 1 744 0
+	.loc 1 746 0
 	ldrb	w24, [x4, 49]
-	.loc 1 743 0
+	.loc 1 745 0
 	cmp	w23, 983040
-	.loc 1 746 0
+	.loc 1 748 0
 	ldrb	w22, [x4, 48]
-	.loc 1 744 0
+	.loc 1 746 0
 	ccmp	w23, 0, 4, ne
-	.loc 1 742 0
+	.loc 1 744 0
 	add	w21, w21, 1
-	.loc 1 740 0
-	ldrb	w20, [x20, w25, sxtw]
 	.loc 1 742 0
-	and	w21, w21, 255
+	ldrb	w20, [x20, w25, sxtw]
 	.loc 1 744 0
+	and	w21, w21, 255
+	.loc 1 746 0
 	csel	w22, w22, w24, ne
-	.loc 1 740 0
+	.loc 1 742 0
 	and	w20, w20, 3
-	.loc 1 747 0
+	.loc 1 749 0
 	cmp	w22, w21
 	beq	.L147
 .L87:
-	.loc 1 751 0
+	.loc 1 753 0
 	strb	w21, [x7, -4]
 .L85:
-	.loc 1 754 0
+	.loc 1 756 0
 	tst	w8, 15728640
 	beq	.L88
-	.loc 1 756 0
-	ldrb	w22, [x7, -3]
 	.loc 1 758 0
+	ldrb	w22, [x7, -3]
+	.loc 1 760 0
 	lsr	w21, w6, 20
 	ubfx	x23, x5, 20, 8
 	ubfiz	w21, w21, 8, 8
 	ldr	x24, [x4, 128]
 	add	w21, w21, w23
-	.loc 1 757 0
+	.loc 1 759 0
 	lsl	w27, w22, 16
-	.loc 1 755 0
+	.loc 1 757 0
 	and	w25, w5, 15728640
-	.loc 1 758 0
-	add	x24, x24, x21
 	.loc 1 760 0
+	add	x24, x24, x21
+	.loc 1 762 0
 	add	w21, w22, 1
-	.loc 1 764 0
+	.loc 1 766 0
 	ldrb	w23, [x4, 48]
-	.loc 1 761 0
+	.loc 1 763 0
 	cmp	w25, 15728640
-	.loc 1 762 0
+	.loc 1 764 0
 	ldrb	w26, [x4, 49]
 	ccmp	w25, 0, 4, ne
-	.loc 1 758 0
-	ldrb	w22, [x24, w27, sxtw]
 	.loc 1 760 0
-	and	w21, w21, 255
+	ldrb	w22, [x24, w27, sxtw]
 	.loc 1 762 0
+	and	w21, w21, 255
+	.loc 1 764 0
 	csel	w23, w23, w26, ne
-	.loc 1 765 0
+	.loc 1 767 0
 	cmp	w23, w21
-	.loc 1 759 0
+	.loc 1 761 0
 	ubfiz	w22, w22, 2, 2
 	orr	w20, w22, w20
-	.loc 1 765 0
+	.loc 1 767 0
 	beq	.L148
 .L90:
-	.loc 1 769 0
+	.loc 1 771 0
 	strb	w21, [x7, -3]
 .L88:
-	.loc 1 772 0
+	.loc 1 774 0
 	tst	w8, 251658240
 	beq	.L91
-	.loc 1 774 0
-	ldrb	w21, [x7, -2]
 	.loc 1 776 0
+	ldrb	w21, [x7, -2]
+	.loc 1 778 0
 	lsr	w22, w6, 24
 	lsr	w25, w5, 24
 	mov	w23, w22
 	ldr	x24, [x4, 128]
 	add	w22, w25, w23, lsl 8
-	.loc 1 775 0
+	.loc 1 777 0
 	lsl	w26, w21, 16
-	.loc 1 782 0
+	.loc 1 784 0
 	ldrb	w23, [x4, 48]
-	.loc 1 776 0
+	.loc 1 778 0
 	add	x22, x24, x22
-	.loc 1 780 0
+	.loc 1 782 0
 	ldrb	w25, [x4, 49]
-	.loc 1 779 0
+	.loc 1 781 0
 	ands	w24, w5, 251658240
-	.loc 1 778 0
-	add	w21, w21, 1
 	.loc 1 780 0
+	add	w21, w21, 1
+	.loc 1 782 0
 	ccmp	w24, w14, 4, ne
-	.loc 1 778 0
+	.loc 1 780 0
 	and	w21, w21, 255
-	.loc 1 776 0
+	.loc 1 778 0
 	ldrb	w22, [x22, w26, sxtw]
-	.loc 1 780 0
+	.loc 1 782 0
 	csel	w23, w23, w25, ne
-	.loc 1 783 0
+	.loc 1 785 0
 	cmp	w23, w21
-	.loc 1 777 0
+	.loc 1 779 0
 	ubfiz	w22, w22, 4, 2
 	orr	w20, w22, w20
-	.loc 1 783 0
+	.loc 1 785 0
 	beq	.L149
 .L93:
-	.loc 1 787 0
+	.loc 1 789 0
 	strb	w21, [x7, -2]
 .L91:
-	.loc 1 790 0
+	.loc 1 792 0
 	tst	w8, -268435456
 	beq	.L94
-	.loc 1 792 0
+	.loc 1 794 0
 	ldrb	w8, [x7, -1]
 .LVL42:
-	.loc 1 794 0
+	.loc 1 796 0
 	lsr	w22, w5, 28
 	ldr	x23, [x4, 128]
 	lsr	w21, w6, 28
 	add	w21, w22, w21, lsl 8
-	.loc 1 797 0
+	.loc 1 799 0
 	ands	w5, w5, -268435456
 .LVL43:
-	.loc 1 793 0
+	.loc 1 795 0
 	lsl	w24, w8, 16
-	.loc 1 794 0
+	.loc 1 796 0
 	add	x21, x23, x21
-	.loc 1 800 0
+	.loc 1 802 0
 	ldrb	w22, [x4, 48]
-	.loc 1 798 0
+	.loc 1 800 0
 	ccmp	w5, w15, 4, ne
 	ldrb	w23, [x4, 49]
-	.loc 1 796 0
+	.loc 1 798 0
 	add	w8, w8, 1
-	.loc 1 794 0
-	ldrb	w21, [x21, w24, sxtw]
 	.loc 1 796 0
-	and	w8, w8, 255
+	ldrb	w21, [x21, w24, sxtw]
 	.loc 1 798 0
+	and	w8, w8, 255
+	.loc 1 800 0
 	csel	w22, w22, w23, ne
-	.loc 1 801 0
+	.loc 1 803 0
 	cmp	w22, w8
-	.loc 1 795 0
+	.loc 1 797 0
 	ubfiz	w21, w21, 6, 2
 	orr	w20, w21, w20
-	.loc 1 801 0
+	.loc 1 803 0
 	beq	.L150
 .L96:
-	.loc 1 805 0
+	.loc 1 807 0
 	strb	w8, [x7, -1]
 .LVL44:
 .L94:
-	.loc 1 808 0
+	.loc 1 810 0
 	str	w6, [x2, x9, lsl 2]
-	.loc 1 809 0
+	.loc 1 811 0
 	strb	w20, [x10, -1]
 .L97:
 	add	x9, x9, 1
 	add	x10, x10, 2
 	add	x7, x7, 8
-	.loc 1 653 0 discriminator 2
+	.loc 1 655 0 discriminator 2
 	cmp	w11, w9
 	bgt	.L131
 	add	x3, x3, x19
 	add	x2, x2, x16
 	add	x1, x1, x16
 .L70:
-	.loc 1 647 0 discriminator 2
+	.loc 1 649 0 discriminator 2
 	add	w13, w13, 1
 	cmp	w18, w13
 	bne	.L99
 .L66:
-	.loc 1 821 0
+	.loc 1 823 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
@@ -1011,100 +1011,100 @@ get_overlay_image:
 	.p2align 3
 .L149:
 	.cfi_restore_state
-	.loc 1 785 0
+	.loc 1 787 0
 	and	w6, w6, -251658241
 .LVL45:
-	.loc 1 784 0
+	.loc 1 786 0
 	mov	w21, 0
-	.loc 1 785 0
+	.loc 1 787 0
 	orr	w6, w24, w6
 .LVL46:
 	b	.L93
 .LVL47:
 	.p2align 3
 .L150:
-	.loc 1 803 0
+	.loc 1 805 0
 	and	w6, w6, 268435455
 .LVL48:
-	.loc 1 802 0
+	.loc 1 804 0
 	mov	w8, 0
-	.loc 1 803 0
+	.loc 1 805 0
 	orr	w6, w5, w6
 .LVL49:
 	b	.L96
 .LVL50:
 	.p2align 3
 .L148:
-	.loc 1 767 0
+	.loc 1 769 0
 	and	w6, w6, -15728641
 .LVL51:
-	.loc 1 766 0
+	.loc 1 768 0
 	mov	w21, 0
-	.loc 1 767 0
+	.loc 1 769 0
 	orr	w6, w25, w6
 .LVL52:
 	b	.L90
 	.p2align 3
 .L146:
-	.loc 1 728 0
+	.loc 1 730 0
 	and	w6, w6, -61441
 .LVL53:
-	.loc 1 727 0
+	.loc 1 729 0
 	mov	w21, 0
-	.loc 1 728 0
+	.loc 1 730 0
 	orr	w6, w25, w6
 .LVL54:
 	b	.L84
 	.p2align 3
 .L147:
-	.loc 1 749 0
+	.loc 1 751 0
 	and	w6, w6, -983041
 .LVL55:
-	.loc 1 748 0
+	.loc 1 750 0
 	mov	w21, 0
-	.loc 1 749 0
+	.loc 1 751 0
 	orr	w6, w23, w6
 .LVL56:
 	b	.L87
 	.p2align 3
 .L145:
-	.loc 1 710 0
+	.loc 1 712 0
 	and	w6, w6, -3841
 .LVL57:
-	.loc 1 709 0
+	.loc 1 711 0
 	mov	w21, 0
-	.loc 1 710 0
+	.loc 1 712 0
 	orr	w6, w23, w6
 .LVL58:
 	b	.L81
 	.p2align 3
 .L143:
-	.loc 1 674 0
+	.loc 1 676 0
 	bfi	w6, w23, 0, 4
-	.loc 1 673 0
+	.loc 1 675 0
 	mov	w21, 0
 	b	.L75
 	.p2align 3
 .L144:
-	.loc 1 692 0
+	.loc 1 694 0
 	and	w6, w6, -241
 .LVL59:
-	.loc 1 691 0
+	.loc 1 693 0
 	mov	w21, 0
-	.loc 1 692 0
+	.loc 1 694 0
 	orr	w6, w25, w6
 .LVL60:
 	b	.L78
 	.p2align 3
 .L72:
-	.loc 1 812 0
+	.loc 1 814 0
 	strb	wzr, [x10, -2]
-	.loc 1 813 0
+	.loc 1 815 0
 	strb	wzr, [x10, -1]
 	b	.L97
 	.p2align 3
 .L68:
-	.loc 1 651 0
+	.loc 1 653 0
 	ldr	w10, [x17, 84]
 	mul	w10, w13, w10
 	lsr	w10, w10, 2
@@ -1119,15 +1119,15 @@ get_overlay_image:
 	.type	waveform_open, %function
 waveform_open:
 .LFB2835:
-	.loc 1 1989 0
+	.loc 1 2011 0
 	.cfi_startproc
 .LVL62:
-	.loc 1 1993 0
+	.loc 1 2015 0
 	mov	w0, 0
 .LVL63:
-	.loc 1 1990 0
+	.loc 1 2012 0
 	str	xzr, [x1, 104]
-	.loc 1 1993 0
+	.loc 1 2015 0
 	ret
 	.cfi_endproc
 .LFE2835:
@@ -1137,22 +1137,22 @@ waveform_open:
 	.type	ebc_exit, %function
 ebc_exit:
 .LFB2855:
-	.loc 1 2566 0
+	.loc 1 2588 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2567 0
+	.loc 1 2589 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2566 0
+	.loc 1 2588 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2567 0
+	.loc 1 2589 0
 	bl	platform_driver_unregister
 .LVL64:
-	.loc 1 2568 0
+	.loc 1 2590 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1167,7 +1167,7 @@ ebc_exit:
 	.type	ebc_resume, %function
 ebc_resume:
 .LFB2853:
-	.loc 1 2528 0
+	.loc 1 2550 0
 	.cfi_startproc
 .LVL65:
 	stp	x29, x30, [sp, -32]!
@@ -1185,7 +1185,7 @@ ebc_resume:
 	ldr	x19, [x0, 184]
 .LBE939:
 .LBE938:
-	.loc 1 2532 0
+	.loc 1 2554 0
 	ldr	x1, [x19, 16]
 .LBB940:
 .LBB941:
@@ -1198,15 +1198,15 @@ ebc_resume:
 .LVL67:
 .LBE941:
 .LBE940:
-	.loc 1 2533 0
+	.loc 1 2555 0
 	str	wzr, [x19, 796]
-	.loc 1 2534 0
+	.loc 1 2556 0
 	ldr	x0, [x19, 288]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
 .LVL68:
-	.loc 1 2537 0
+	.loc 1 2559 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -1223,20 +1223,20 @@ ebc_resume:
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
 .LFB2828:
-	.loc 1 1649 0
+	.loc 1 1671 0
 	.cfi_startproc
 .LVL69:
-	.loc 1 1650 0
+	.loc 1 1672 0
 	adrp	x0, .LANCHOR0
 .LVL70:
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1652 0
+	.loc 1 1674 0
 	ldr	w2, [x0, 624]
 	cbnz	w2, .L165
 	ret
 	.p2align 3
 .L165:
-	.loc 1 1649 0
+	.loc 1 1671 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -1248,10 +1248,10 @@ ebc_vdd_power_timeout:
 	add	x0, x0, 416
 .LBE943:
 .LBE942:
-	.loc 1 1649 0
+	.loc 1 1671 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1653 0
+	.loc 1 1675 0
 	str	wzr, [x0, 208]
 .LBB945:
 .LBB944:
@@ -1260,7 +1260,7 @@ ebc_vdd_power_timeout:
 .LVL71:
 .LBE944:
 .LBE945:
-	.loc 1 1658 0
+	.loc 1 1680 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1274,27 +1274,27 @@ ebc_vdd_power_timeout:
 	.type	ebc_remove, %function
 ebc_remove:
 .LFB2851:
-	.loc 1 2504 0
+	.loc 1 2526 0
 	.cfi_startproc
 .LVL72:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2505 0
+	.loc 1 2527 0
 	adrp	x0, .LANCHOR1
 .LVL73:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2504 0
+	.loc 1 2526 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2505 0
+	.loc 1 2527 0
 	add	x0, x0, 224
-	.loc 1 2504 0
-	.loc 1 2505 0
+	.loc 1 2526 0
+	.loc 1 2527 0
 	bl	misc_deregister
 .LVL74:
-	.loc 1 2508 0
+	.loc 1 2530 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -1309,7 +1309,7 @@ ebc_remove:
 	.type	ebc_mmap, %function
 ebc_mmap:
 .LFB2832:
-	.loc 1 1935 0
+	.loc 1 1957 0
 	.cfi_startproc
 .LVL75:
 	stp	x29, x30, [sp, -32]!
@@ -1320,33 +1320,33 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1935 0
+	.loc 1 1957 0
 	mov	x19, x1
-	.loc 1 1938 0
+	.loc 1 1960 0
 	bl	ebc_phy_buf_base_get
 .LVL76:
-	.loc 1 1941 0
+	.loc 1 1963 0
 	lsr	x2, x0, 12
-	.loc 1 1939 0
+	.loc 1 1961 0
 	mov	x6, 16384
-	.loc 1 1941 0
+	.loc 1 1963 0
 	mov	x0, x19
-	.loc 1 1939 0
+	.loc 1 1961 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 1941 0
+	.loc 1 1963 0
 	ldp	x1, x3, [x19]
-	.loc 1 1939 0
+	.loc 1 1961 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 1941 0
+	.loc 1 1963 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
 .LVL77:
-	.loc 1 1944 0
+	.loc 1 1966 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 1947 0
+	.loc 1 1969 0
 	ldr	x19, [sp, 16]
 .LVL78:
 	csel	w0, w0, w1, eq
@@ -1364,47 +1364,47 @@ ebc_mmap:
 	.type	waveform_mmap, %function
 waveform_mmap:
 .LFB2834:
-	.loc 1 1973 0
+	.loc 1 1995 0
 	.cfi_startproc
 .LVL79:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1974 0
+	.loc 1 1996 0
 	adrp	x2, .LANCHOR0
-	.loc 1 1978 0
+	.loc 1 2000 0
 	mov	x7, 16384
-	.loc 1 1980 0
+	.loc 1 2002 0
 	mov	x0, x1
 .LVL80:
-	.loc 1 1973 0
+	.loc 1 1995 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1977 0
+	.loc 1 1999 0
 	ldr	x2, [x2, #:lo12:.LANCHOR0]
-	.loc 1 1978 0
+	.loc 1 2000 0
 	movk	x7, 0x404, lsl 16
 	ldp	x4, x5, [x1, 72]
-	.loc 1 1980 0
+	.loc 1 2002 0
 	ldp	x6, x3, [x1]
-	.loc 1 1978 0
+	.loc 1 2000 0
 	orr	x5, x5, x7
-	.loc 1 1977 0
+	.loc 1 1999 0
 	ldr	x2, [x2, 216]
-	.loc 1 1978 0
+	.loc 1 2000 0
 	str	x5, [x1, 80]
-	.loc 1 1980 0
+	.loc 1 2002 0
 	sub	x3, x3, x6
 	mov	x1, x6
 .LVL81:
 	lsr	x2, x2, 12
 	bl	remap_pfn_range
 .LVL82:
-	.loc 1 1983 0
+	.loc 1 2005 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 1986 0
+	.loc 1 2008 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1419,16 +1419,16 @@ waveform_mmap:
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
 .LFB2831:
-	.loc 1 1734 0
+	.loc 1 1756 0
 	.cfi_startproc
 .LVL83:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 1744 0
+	.loc 1 1766 0
 	cmp	w1, 28672
-	.loc 1 1734 0
+	.loc 1 1756 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -1442,15 +1442,15 @@ ebc_io_ctl:
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
 	.cfi_offset 23, -112
-	.loc 1 1734 0
+	.loc 1 1756 0
 	mov	x21, x2
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 1736 0
+	.loc 1 1758 0
 	adrp	x0, .LANCHOR0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1744 0
+	.loc 1 1766 0
 	bcc	.L177
 	mov	w0, 28675
 	cmp	w1, w0
@@ -1460,7 +1460,7 @@ ebc_io_ctl:
 	cmp	w0, 1
 	bls	.L178
 .L177:
-	.loc 1 1760 0
+	.loc 1 1782 0
 	mov	w0, 28677
 	cmp	w1, w0
 	beq	.L181
@@ -1476,13 +1476,13 @@ ebc_io_ctl:
 	mov	w0, 28683
 	cmp	w1, w0
 	bne	.L180
-	.loc 1 1912 0
+	.loc 1 1934 0
 	bl	ebc_empty_buf_get
 .LVL85:
 	mov	x23, x0
-	.loc 1 1913 0
+	.loc 1 1935 0
 	cbz	x0, .L201
-	.loc 1 1915 0
+	.loc 1 1937 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 408]
@@ -1493,7 +1493,7 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL86:
-	.loc 1 1916 0
+	.loc 1 1938 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL87:
@@ -1523,11 +1523,11 @@ ebc_io_ctl:
 .LBE948:
 .LBE947:
 .LBE946:
-	.loc 1 1918 0
+	.loc 1 1940 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 1917 0
+	.loc 1 1939 0
 	str	w0, [x29, 104]
-	.loc 1 1919 0
+	.loc 1 1941 0
 	stp	w4, w1, [x29, 112]
 .LBB977:
 .LBB974:
@@ -1556,7 +1556,7 @@ ebc_io_ctl:
 .LBE971:
 .LBE974:
 .LBE977:
-	.loc 1 1735 0
+	.loc 1 1757 0
 	mov	x0, x21
 .LVL92:
 .LBB978:
@@ -1604,36 +1604,36 @@ ebc_io_ctl:
 .LBE972:
 .LBE975:
 .LBE978:
-	.loc 1 1921 0
+	.loc 1 1943 0
 	mov	x0, x23
 .LVL97:
 	bl	ebc_buf_release
 .LVL98:
-	.loc 1 1922 0
+	.loc 1 1944 0
 	b	.L176
 .LVL99:
 	.p2align 3
 .L178:
-	.loc 1 1751 0
+	.loc 1 1773 0
 	cbnz	x21, .L177
-	.loc 1 1752 0
+	.loc 1 1774 0
 	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
 .LVL100:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC1
-	.loc 1 1753 0
+	.loc 1 1775 0
 	mov	x22, -14
-	.loc 1 1752 0
+	.loc 1 1774 0
 	bl	_dev_err
 .LVL101:
-	.loc 1 1753 0
+	.loc 1 1775 0
 	b	.L176
 .LVL102:
 	.p2align 3
 .L310:
-	.loc 1 1760 0
+	.loc 1 1782 0
 	mov	w0, 28674
 	cmp	w1, w0
 	beq	.L183
@@ -1644,23 +1644,23 @@ ebc_io_ctl:
 	mov	w0, 28676
 	cmp	w1, w0
 	bne	.L180
-	.loc 1 1844 0
+	.loc 1 1866 0
 	ldr	x0, [x20, 288]
-	.loc 1 1843 0
+	.loc 1 1865 0
 	mov	w2, 1
 	str	w2, [x20, 804]
-	.loc 1 1844 0
+	.loc 1 1866 0
 	adrp	x1, .LC2
 .LVL103:
-	.loc 1 1845 0
+	.loc 1 1867 0
 	mov	x22, 0
-	.loc 1 1844 0
+	.loc 1 1866 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
 .LVL104:
 	.p2align 2
 .L176:
-	.loc 1 1932 0
+	.loc 1 1954 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
 .LVL105:
@@ -1688,7 +1688,7 @@ ebc_io_ctl:
 	.p2align 3
 .L313:
 	.cfi_restore_state
-	.loc 1 1760 0
+	.loc 1 1782 0
 	cmp	w1, 28672
 	beq	.L185
 	mov	w0, 28673
@@ -1802,53 +1802,53 @@ ebc_io_ctl:
 .LBE981:
 .LBE980:
 .LBE979:
-	.loc 1 1798 0
+	.loc 1 1820 0
 	bl	ebc_phy_buf_base_get
 .LVL121:
 	ldrsw	x1, [x29, 104]
-	.loc 1 1799 0
+	.loc 1 1821 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
 .LVL122:
 	mov	x21, x0
 .LVL123:
-	.loc 1 1800 0
+	.loc 1 1822 0
 	cbz	x0, .L216
-	.loc 1 1801 0
+	.loc 1 1823 0
 	ldr	w5, [x29, 108]
-	.loc 1 1810 0
+	.loc 1 1832 0
 	add	x20, x20, 184
-	.loc 1 1805 0
+	.loc 1 1827 0
 	ldp	w4, w2, [x29, 124]
-	.loc 1 1801 0
+	.loc 1 1823 0
 	str	w5, [x21, 40]
-	.loc 1 1806 0
+	.loc 1 1828 0
 	ldp	w3, w1, [x29, 132]
-	.loc 1 1805 0
+	.loc 1 1827 0
 	stp	w4, w2, [x21, 48]
-	.loc 1 1806 0
+	.loc 1 1828 0
 	stp	w3, w1, [x21, 56]
-	.loc 1 1808 0
+	.loc 1 1830 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL124:
-	.loc 1 1810 0
+	.loc 1 1832 0
 	ldr	w0, [x20, 96]
 	cbz	w0, .L316
 .L211:
-	.loc 1 1814 0
+	.loc 1 1836 0
 	ldr	w0, [x21, 40]
 	cmp	w0, 18
 	beq	.L317
-	.loc 1 1814 0 is_stmt 0 discriminator 3
+	.loc 1 1836 0 is_stmt 0 discriminator 3
 	cmp	w0, 20
 	bne	.L216
 .L213:
-	.loc 1 1815 0 is_stmt 1
+	.loc 1 1837 0 is_stmt 1
 	mov	w0, 1
 	str	w0, [x20, 204]
 .LBB1008:
 .LBB1009:
-	.loc 1 1816 0
+	.loc 1 1838 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
@@ -1861,13 +1861,13 @@ ebc_io_ctl:
 	.p2align 3
 .L318:
 .LVL126:
-	.loc 1 1816 0 is_stmt 0 discriminator 5
+	.loc 1 1838 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L216
-	.loc 1 1816 0 discriminator 7
+	.loc 1 1838 0 discriminator 7
 	bl	schedule
 .LVL127:
 .L217:
-	.loc 1 1816 0 discriminator 9
+	.loc 1 1838 0 discriminator 9
 	add	x1, x29, 64
 	mov	w2, 1
 	mov	x0, x21
@@ -1876,7 +1876,7 @@ ebc_io_ctl:
 	ldr	w1, [x20, 204]
 	cbnz	w1, .L318
 .LBE1010:
-	.loc 1 1816 0 discriminator 4
+	.loc 1 1838 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
 	bl	finish_wait
@@ -1890,13 +1890,13 @@ ebc_io_ctl:
 .L193:
 .LBE1009:
 .LBE1008:
-	.loc 1 1899 0 is_stmt 1
+	.loc 1 1921 0 is_stmt 1
 	bl	ebc_empty_buf_get
 .LVL131:
 	mov	x23, x0
-	.loc 1 1900 0
+	.loc 1 1922 0
 	cbz	x0, .L201
-	.loc 1 1902 0
+	.loc 1 1924 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 344]
@@ -1906,7 +1906,7 @@ ebc_io_ctl:
 .LVL132:
 	.p2align 3
 .L311:
-	.loc 1 1760 0
+	.loc 1 1782 0
 	mov	w0, 28678
 	cmp	w1, w0
 	beq	.L191
@@ -2021,36 +2021,36 @@ ebc_io_ctl:
 .LBE1016:
 .LBE1015:
 .LBE1014:
-	.loc 1 1825 0
+	.loc 1 1847 0
 	bl	ebc_osd_buf_clone
 .LVL145:
 	mov	x1, x0
-	.loc 1 1826 0
+	.loc 1 1848 0
 	cbz	x0, .L216
-	.loc 1 1827 0
+	.loc 1 1849 0
 	ldr	w6, [x29, 108]
-	.loc 1 1836 0
+	.loc 1 1858 0
 	add	x20, x20, 184
-	.loc 1 1831 0
+	.loc 1 1853 0
 	ldp	w5, w3, [x29, 124]
-	.loc 1 1827 0
+	.loc 1 1849 0
 	str	w6, [x1, 40]
-	.loc 1 1832 0
+	.loc 1 1854 0
 	ldp	w4, w2, [x29, 132]
-	.loc 1 1831 0
+	.loc 1 1853 0
 	stp	w5, w3, [x1, 48]
-	.loc 1 1832 0
+	.loc 1 1854 0
 	stp	w4, w2, [x1, 56]
-	.loc 1 1834 0
+	.loc 1 1856 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL146:
-	.loc 1 1836 0
+	.loc 1 1858 0
 	ldr	w0, [x20, 96]
 	cbnz	w0, .L216
-	.loc 1 1837 0
+	.loc 1 1859 0
 	mov	w2, 1
 	str	w2, [x20, 96]
-	.loc 1 1838 0
+	.loc 1 1860 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -2123,12 +2123,12 @@ ebc_io_ctl:
 .LBE973:
 .LBE976:
 .LBE1043:
-	.loc 1 1762 0
+	.loc 1 1784 0
 	bl	ebc_osd_buf_get
 .LVL157:
-	.loc 1 1763 0
+	.loc 1 1785 0
 	cbz	x0, .L201
-	.loc 1 1766 0
+	.loc 1 1788 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL158:
@@ -2155,17 +2155,17 @@ ebc_io_ctl:
 .LBE1046:
 .LBE1045:
 .LBE1044:
-	.loc 1 1766 0
+	.loc 1 1788 0
 	sub	w0, w22, w0
-	.loc 1 1771 0
+	.loc 1 1793 0
 	ldr	w1, [x20, 176]
-	.loc 1 1770 0
+	.loc 1 1792 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1769 0
+	.loc 1 1791 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1771 0
+	.loc 1 1793 0
 	str	w1, [x29, 120]
-	.loc 1 1768 0
+	.loc 1 1790 0
 	str	w0, [x29, 104]
 .LBB1077:
 .LBB1074:
@@ -2290,7 +2290,7 @@ ebc_io_ctl:
 .LBE1080:
 .LBE1079:
 .LBE1078:
-	.loc 1 1852 0
+	.loc 1 1874 0
 	add	x22, x20, 248
 .LBB1113:
 .LBB1109:
@@ -2387,49 +2387,49 @@ ebc_io_ctl:
 .LBE1105:
 .LBE1109:
 .LBE1113:
-	.loc 1 1856 0
+	.loc 1 1878 0
 	add	x20, x20, 184
 	ldr	w2, [x20, 64]
 	ldr	x0, [x20, 104]
 .LVL184:
-	.loc 1 1857 0
+	.loc 1 1879 0
 	mov	x22, 0
-	.loc 1 1856 0
+	.loc 1 1878 0
 	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	_dev_info
 .LVL185:
-	.loc 1 1857 0
+	.loc 1 1879 0
 	b	.L176
 .LVL186:
 	.p2align 3
 .L181:
-	.loc 1 1849 0
+	.loc 1 1871 0
 	ldr	x0, [x20, 288]
 	adrp	x1, .LC3
 .LVL187:
-	.loc 1 1847 0
+	.loc 1 1869 0
 	str	wzr, [x20, 804]
-	.loc 1 1850 0
+	.loc 1 1872 0
 	mov	x22, 0
-	.loc 1 1848 0
+	.loc 1 1870 0
 	str	wzr, [x20, 808]
-	.loc 1 1849 0
+	.loc 1 1871 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
 .LVL188:
-	.loc 1 1850 0
+	.loc 1 1872 0
 	b	.L176
 .LVL189:
 	.p2align 3
 .L189:
-	.loc 1 1886 0
+	.loc 1 1908 0
 	bl	ebc_empty_buf_get
 .LVL190:
 	mov	x23, x0
-	.loc 1 1887 0
+	.loc 1 1909 0
 	cbz	x0, .L201
-	.loc 1 1889 0
+	.loc 1 1911 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 336]
@@ -2439,13 +2439,13 @@ ebc_io_ctl:
 .LVL191:
 	.p2align 3
 .L194:
-	.loc 1 1873 0
+	.loc 1 1895 0
 	bl	ebc_empty_buf_get
 .LVL192:
 	mov	x23, x0
-	.loc 1 1874 0
+	.loc 1 1896 0
 	cbz	x0, .L201
-	.loc 1 1876 0
+	.loc 1 1898 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 328]
@@ -2454,7 +2454,7 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL193:
-	.loc 1 1877 0
+	.loc 1 1899 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL194:
@@ -2482,11 +2482,11 @@ ebc_io_ctl:
 .LBE1116:
 .LBE1115:
 .LBE1114:
-	.loc 1 1880 0
+	.loc 1 1902 0
 	ldp	w4, w1, [x22, 84]
-	.loc 1 1878 0
+	.loc 1 1900 0
 	str	w0, [x29, 104]
-	.loc 1 1879 0
+	.loc 1 1901 0
 	stp	w1, w4, [x29, 112]
 .LBB1125:
 .LBB1124:
@@ -2530,15 +2530,15 @@ ebc_io_ctl:
 .LBE1128:
 .LBE1127:
 .LBE1126:
-	.loc 1 1863 0
+	.loc 1 1885 0
 	ldp	w1, w0, [x20, 116]
 .LVL199:
 	stp	w1, w0, [x29, 140]
-	.loc 1 1860 0
+	.loc 1 1882 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 1859 0
+	.loc 1 1881 0
 	stp	w5, w6, [x29, 112]
-	.loc 1 1861 0
+	.loc 1 1883 0
 	ldr	w4, [x20, 176]
 	str	w4, [x29, 120]
 .LBB1161:
@@ -2586,46 +2586,46 @@ ebc_io_ctl:
 .LBE1153:
 .LBE1157:
 .LBE1161:
-	.loc 1 1866 0
+	.loc 1 1888 0
 	ldr	x0, [x20, 288]
 .LVL205:
 	adrp	x1, .LC5
 .LVL206:
-	.loc 1 1867 0
+	.loc 1 1889 0
 	mov	x22, -14
-	.loc 1 1866 0
+	.loc 1 1888 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
 .LVL207:
-	.loc 1 1867 0
+	.loc 1 1889 0
 	b	.L176
 .LVL208:
 	.p2align 3
 .L180:
-	.loc 1 1927 0
+	.loc 1 1949 0
 	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
 .LVL209:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
-	.loc 1 1928 0
+	.loc 1 1950 0
 	mov	x22, 0
-	.loc 1 1927 0
+	.loc 1 1949 0
 	bl	_dev_err
 .LVL210:
-	.loc 1 1931 0
+	.loc 1 1953 0
 	b	.L176
 .LVL211:
 	.p2align 3
 .L185:
-	.loc 1 1776 0
+	.loc 1 1798 0
 	bl	ebc_empty_buf_get
 .LVL212:
 	mov	x23, x0
-	.loc 1 1777 0
+	.loc 1 1799 0
 	cbz	x0, .L201
-	.loc 1 1780 0
+	.loc 1 1802 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL213:
@@ -2652,17 +2652,17 @@ ebc_io_ctl:
 .LBE1164:
 .LBE1163:
 .LBE1162:
-	.loc 1 1780 0
+	.loc 1 1802 0
 	sub	w0, w22, w0
-	.loc 1 1785 0
+	.loc 1 1807 0
 	ldr	w1, [x20, 176]
-	.loc 1 1784 0
+	.loc 1 1806 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1783 0
+	.loc 1 1805 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1785 0
+	.loc 1 1807 0
 	str	w1, [x29, 120]
-	.loc 1 1782 0
+	.loc 1 1804 0
 	str	w0, [x29, 104]
 .LBB1197:
 .LBB1193:
@@ -2709,15 +2709,15 @@ ebc_io_ctl:
 .LBE1189:
 .LBE1193:
 .LBE1197:
-	.loc 1 1789 0
+	.loc 1 1811 0
 	mov	x0, x23
 .LVL220:
-	.loc 1 1790 0
+	.loc 1 1812 0
 	mov	x22, -14
-	.loc 1 1789 0
+	.loc 1 1811 0
 	bl	ebc_buf_release
 .LVL221:
-	.loc 1 1790 0
+	.loc 1 1812 0
 	b	.L176
 .LVL222:
 	.p2align 3
@@ -2740,7 +2740,7 @@ ebc_io_ctl:
 .LBE1039:
 .LBE1041:
 .LBE1198:
-	.loc 1 1735 0
+	.loc 1 1757 0
 	mov	x0, x21
 .LVL223:
 .LBB1199:
@@ -2777,7 +2777,7 @@ ebc_io_ctl:
 .LBE1004:
 .LBE1006:
 .LBE1200:
-	.loc 1 1735 0
+	.loc 1 1757 0
 	mov	x0, x21
 .LVL225:
 .LBB1201:
@@ -2815,7 +2815,7 @@ ebc_io_ctl:
 .LBE1154:
 .LBE1158:
 .LBE1202:
-	.loc 1 1735 0
+	.loc 1 1757 0
 	mov	x0, x21
 .LVL228:
 .LBB1203:
@@ -2852,7 +2852,7 @@ ebc_io_ctl:
 .LBE1106:
 .LBE1110:
 .LBE1204:
-	.loc 1 1735 0
+	.loc 1 1757 0
 	mov	x0, x21
 .LVL230:
 .LBB1205:
@@ -2890,7 +2890,7 @@ ebc_io_ctl:
 .LBE1190:
 .LBE1194:
 .LBE1206:
-	.loc 1 1735 0
+	.loc 1 1757 0
 	mov	x0, x21
 .LVL233:
 .LBB1207:
@@ -2928,7 +2928,7 @@ ebc_io_ctl:
 .LBE1072:
 .LBE1075:
 .LBE1208:
-	.loc 1 1735 0
+	.loc 1 1757 0
 	mov	x0, x21
 .LVL236:
 .LBB1209:
@@ -3003,7 +3003,7 @@ ebc_io_ctl:
 .LBE1156:
 .LBE1160:
 .LBE1210:
-	.loc 1 1865 0
+	.loc 1 1887 0
 	cbnz	x0, .L228
 .LBB1211:
 .LBB1011:
@@ -3070,7 +3070,7 @@ ebc_io_ctl:
 .LBE1192:
 .LBE1196:
 .LBE1212:
-	.loc 1 1788 0
+	.loc 1 1810 0
 	cbnz	w0, .L205
 .LBB1213:
 .LBB1012:
@@ -3081,16 +3081,16 @@ ebc_io_ctl:
 .L209:
 .LBE1012:
 .LBE1213:
-	.loc 1 1796 0
+	.loc 1 1818 0
 	mov	x22, -14
 	b	.L176
 .LVL254:
 	.p2align 3
 .L316:
-	.loc 1 1811 0
+	.loc 1 1833 0
 	mov	w2, 1
 	str	w2, [x20, 96]
-	.loc 1 1812 0
+	.loc 1 1834 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -3100,7 +3100,7 @@ ebc_io_ctl:
 	b	.L211
 	.p2align 3
 .L317:
-	.loc 1 1814 0 discriminator 1
+	.loc 1 1836 0 discriminator 1
 	ldr	w0, [x20, 608]
 	cbz	w0, .L213
 .LBB1214:
@@ -3111,7 +3111,7 @@ ebc_io_ctl:
 .L201:
 .LBE1013:
 .LBE1214:
-	.loc 1 1764 0
+	.loc 1 1786 0
 	mov	x22, -1
 	b	.L176
 .LVL257:
@@ -3134,19 +3134,19 @@ ebc_io_ctl:
 .LBE1108:
 .LBE1112:
 .LBE1215:
-	.loc 1 1853 0
+	.loc 1 1875 0
 	ldr	x0, [x20, 288]
 	adrp	x1, .LC4
-	.loc 1 1854 0
+	.loc 1 1876 0
 	mov	x22, -14
-	.loc 1 1853 0
+	.loc 1 1875 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
 .LVL262:
-	.loc 1 1854 0
+	.loc 1 1876 0
 	b	.L176
 .L314:
-	.loc 1 1932 0
+	.loc 1 1954 0
 	bl	__stack_chk_fail
 .LVL263:
 .L322:
@@ -3162,88 +3162,70 @@ ebc_io_ctl:
 	.type	frame_done_callback, %function
 frame_done_callback:
 .LFB2823:
-	.loc 1 1175 0
+	.loc 1 1183 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 1176 0
-	adrp	x0, .LANCHOR0
-	add	x1, x0, :lo12:.LANCHOR0
-	.loc 1 1175 0
+	.loc 1 1184 0
+	adrp	x1, .LANCHOR0
+	.loc 1 1183 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 1176 0
-	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1175 0
+	.loc 1 1184 0
+	ldr	x20, [x1, #:lo12:.LANCHOR0]
+	.loc 1 1183 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 1179 0
+	.loc 1 1187 0
 	add	x19, x20, 184
 	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
+	tbnz	w0, #31, .L326
 	cmp	w0, 1
-	bhi	.L326
-	.loc 1 1182 0
-	ldr	w0, [x19, 52]
-	cbz	w0, .L328
-	.loc 1 1183 0
-	ldr	x0, [x1, 8]
-	bl	wake_up_process
-.LVL265:
-	.loc 1 1209 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
+	ble	.L327
+	sub	w0, w0, #22
+	cmp	w0, 1
+	bls	.L327
 .L326:
-	.cfi_restore_state
-	.loc 1 1197 0
+	.loc 1 1207 0
 	ldr	w0, [x19, 56]
 	cbnz	w0, .L332
-	.loc 1 1203 0
+	.loc 1 1213 0
 	ldr	x0, [x19, 104]
-	.loc 1 1202 0
+	.loc 1 1212 0
 	mov	w20, 1
-	.loc 1 1201 0
+	.loc 1 1211 0
 	str	wzr, [x19, 44]
-	.loc 1 1203 0
+	.loc 1 1213 0
 	adrp	x1, .LC9
-	.loc 1 1202 0
+	.loc 1 1212 0
 	str	w20, [x19, 92]
-	.loc 1 1203 0
+	.loc 1 1213 0
 	add	x1, x1, :lo12:.LC9
-	.loc 1 1204 0
+	.loc 1 1214 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
-	.loc 1 1203 0
+	.loc 1 1213 0
 	bl	_dev_info
-.LVL266:
-	.loc 1 1204 0
+.LVL265:
+	.loc 1 1214 0
 	mov	w2, w20
 	add	x0, x19, 352
 	mov	w1, w20
 	bl	__wake_up_sync
-.LVL267:
-	.loc 1 1205 0
+.LVL266:
+	.loc 1 1215 0
 	mov	w2, w20
 	mov	w1, w20
 	add	x0, x19, 304
 	bl	__wake_up_sync
-.LVL268:
-	.loc 1 1209 0
+.LVL267:
+	.loc 1 1219 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -3256,25 +3238,48 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
+.L327:
+	.cfi_restore_state
+	.loc 1 1192 0
+	ldr	w0, [x19, 52]
+	cbz	w0, .L328
+	.loc 1 1193 0
+	add	x1, x1, :lo12:.LANCHOR0
+	ldr	x0, [x1, 8]
+	bl	wake_up_process
+.LVL268:
+	.loc 1 1219 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
 .L328:
 	.cfi_restore_state
-	.loc 1 1186 0
+	.loc 1 1196 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC8
 	add	x1, x1, :lo12:.LC8
-	.loc 1 1191 0
+	.loc 1 1201 0
 	mov	w21, 1
-	.loc 1 1186 0
+	.loc 1 1196 0
 	bl	_dev_info
 .LVL269:
-	.loc 1 1188 0
+	.loc 1 1198 0
 	ldp	w3, w2, [x20, 108]
 	mov	w1, 0
 	ldr	x0, [x19, 168]
 	mul	w2, w3, w2
 	bl	memset
 .LVL270:
-	.loc 1 1189 0
+	.loc 1 1199 0
 	adrp	x2, jiffies
 	add	x0, x20, 688
 	mov	x1, 402653184
@@ -3282,11 +3287,11 @@ frame_done_callback:
 	add	x1, x2, x1
 	bl	mod_timer
 .LVL271:
-	.loc 1 1191 0
+	.loc 1 1201 0
 	str	w21, [x19, 92]
-	.loc 1 1190 0
+	.loc 1 1200 0
 	str	wzr, [x19, 44]
-	.loc 1 1192 0
+	.loc 1 1202 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
 	mov	w2, w21
@@ -3294,13 +3299,13 @@ frame_done_callback:
 	add	x0, x19, 352
 	bl	__wake_up_sync
 .LVL272:
-	.loc 1 1193 0
+	.loc 1 1203 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x19, 304
 	bl	__wake_up_sync
 .LVL273:
-	.loc 1 1209 0
+	.loc 1 1219 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -3315,15 +3320,16 @@ frame_done_callback:
 	.p2align 3
 .L332:
 	.cfi_restore_state
-	.loc 1 1199 0
+	.loc 1 1209 0
+	add	x1, x1, :lo12:.LANCHOR0
+	.loc 1 1208 0
+	mov	w0, 1
+	str	w0, [x19, 44]
+	.loc 1 1209 0
 	ldr	x0, [x1, 8]
-	.loc 1 1198 0
-	mov	w1, 1
-	str	w1, [x19, 44]
-	.loc 1 1199 0
 	bl	wake_up_process
 .LVL274:
-	.loc 1 1209 0
+	.loc 1 1219 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -3342,7 +3348,7 @@ frame_done_callback:
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
 .LFB2829:
-	.loc 1 1661 0
+	.loc 1 1683 0
 	.cfi_startproc
 .LVL275:
 	stp	x29, x30, [sp, -16]!
@@ -3351,10 +3357,10 @@ ebc_frame_timeout:
 	.cfi_offset 30, -8
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1662 0
+	.loc 1 1684 0
 	bl	frame_done_callback
 .LVL276:
-	.loc 1 1664 0
+	.loc 1 1686 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3368,16 +3374,16 @@ ebc_frame_timeout:
 	.type	ebc_lut_update, %function
 ebc_lut_update:
 .LFB2824:
-	.loc 1 1212 0
+	.loc 1 1222 0
 	.cfi_startproc
 .LVL277:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 1214 0
+	.loc 1 1224 0
 	mov	w3, 25
-	.loc 1 1212 0
+	.loc 1 1222 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x21, x22, [sp, 32]
@@ -3387,18 +3393,18 @@ ebc_lut_update:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -48
 	.cfi_offset 20, -40
-	.loc 1 1214 0
+	.loc 1 1224 0
 	add	x1, x29, 64
-	.loc 1 1212 0
+	.loc 1 1222 0
 	adrp	x19, __stack_chk_guard
 	add	x0, x19, :lo12:__stack_chk_guard
 .LVL278:
-	.loc 1 1218 0
+	.loc 1 1228 0
 	ldr	x2, [x21, 16]
-	.loc 1 1214 0
+	.loc 1 1224 0
 	str	w3, [x1, -12]!
 .LVL279:
-	.loc 1 1212 0
+	.loc 1 1222 0
 	ldr	x3, [x0]
 	str	x3, [x29, 56]
 	mov	x3,0
@@ -3412,31 +3418,31 @@ ebc_lut_update:
 	mov	w20, w0
 .LBE1217:
 .LBE1216:
-	.loc 1 1219 0
+	.loc 1 1229 0
 	cbnz	w0, .L336
 .LVL281:
-	.loc 1 1220 0
+	.loc 1 1230 0
 	ldr	w2, [x29, 52]
-	.loc 1 1221 0
+	.loc 1 1231 0
 	add	x22, x21, 184
-	.loc 1 1220 0
+	.loc 1 1230 0
 	tbnz	w2, #31, .L360
-	.loc 1 1224 0
+	.loc 1 1234 0
 	cmp	w2, 50
 	bgt	.L361
 .L338:
-	.loc 1 1232 0
+	.loc 1 1242 0
 	ldr	x0, [x22, 104]
 	adrp	x1, .LC13
 	add	x1, x1, :lo12:.LC13
 	bl	_dev_info
 .LVL282:
-	.loc 1 1235 0
+	.loc 1 1245 0
 	ldr	x0, [x22, 224]
 	ldr	w0, [x0, 40]
-	cmp	w0, 21
+	cmp	w0, 23
 	bls	.L362
-	.loc 1 1289 0
+	.loc 1 1301 0
 	ldr	w2, [x29, 52]
 .L359:
 	mov	w1, 7
@@ -3446,10 +3452,10 @@ ebc_lut_update:
 	cbnz	w0, .L351
 	.p2align 2
 .L354:
-	.loc 1 1294 0
+	.loc 1 1306 0
 	cbnz	w20, .L352
 .L335:
-	.loc 1 1300 0
+	.loc 1 1312 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	w0, w20
 	ldr	x2, [x29, 56]
@@ -3473,11 +3479,11 @@ ebc_lut_update:
 	.p2align 3
 .L362:
 	.cfi_restore_state
-	.loc 1 1235 0
+	.loc 1 1245 0
 	adrp	x1, .L341
-	.loc 1 1237 0
+	.loc 1 1247 0
 	ldr	w2, [x29, 52]
-	.loc 1 1235 0
+	.loc 1 1245 0
 	add	x1, x1, :lo12:.L341
 	ldrb	w0, [x1,w0,uxtw]
 	adr	x1, .Lrtx341
@@ -3510,11 +3516,13 @@ ebc_lut_update:
 	.byte	(.L359 - .Lrtx341) / 4
 	.byte	(.L359 - .Lrtx341) / 4
 	.byte	(.L359 - .Lrtx341) / 4
+	.byte	(.L348 - .Lrtx341) / 4
+	.byte	(.L349 - .Lrtx341) / 4
 	.text
 .LVL286:
 	.p2align 3
 .L336:
-	.loc 1 1230 0
+	.loc 1 1240 0
 	add	x22, x21, 184
 	mov	w2, w0
 	adrp	x1, .LC12
@@ -3526,20 +3534,20 @@ ebc_lut_update:
 	b	.L338
 	.p2align 3
 .L361:
-	.loc 1 1225 0
+	.loc 1 1235 0
 	ldr	x0, [x22, 104]
 	adrp	x1, .LC11
 	add	x1, x1, :lo12:.LC11
 	bl	_dev_info
 .LVL288:
-	.loc 1 1226 0
+	.loc 1 1236 0
 	mov	w2, 50
 	str	w2, [x29, 52]
 .LVL289:
 	b	.L338
 	.p2align 3
 .L350:
-	.loc 1 1237 0
+	.loc 1 1247 0
 	mov	w1, 1
 	add	x0, x21, 296
 	bl	epd_lut_get
@@ -3547,20 +3555,20 @@ ebc_lut_update:
 	cbz	w0, .L354
 	.p2align 2
 .L351:
-	.loc 1 1226 0
+	.loc 1 1236 0
 	mov	w20, -1
 .L352:
-	.loc 1 1295 0
+	.loc 1 1307 0
 	ldr	x0, [x22, 104]
 	adrp	x1, .LC14
 	add	x1, x1, :lo12:.LC14
 	bl	_dev_err
 .LVL291:
-	.loc 1 1296 0
+	.loc 1 1308 0
 	b	.L335
 	.p2align 3
 .L344:
-	.loc 1 1275 0
+	.loc 1 1287 0
 	mov	w1, 9
 	add	x0, x21, 296
 	bl	epd_lut_get
@@ -3569,7 +3577,7 @@ ebc_lut_update:
 	b	.L354
 	.p2align 3
 .L345:
-	.loc 1 1280 0
+	.loc 1 1292 0
 	mov	w1, 10
 	add	x0, x21, 296
 	bl	epd_lut_get
@@ -3578,7 +3586,7 @@ ebc_lut_update:
 	b	.L354
 	.p2align 3
 .L342:
-	.loc 1 1251 0
+	.loc 1 1261 0
 	mov	w1, 5
 	add	x0, x21, 296
 	bl	epd_lut_get
@@ -3587,7 +3595,7 @@ ebc_lut_update:
 	b	.L354
 	.p2align 3
 .L343:
-	.loc 1 1270 0
+	.loc 1 1282 0
 	mov	w1, 8
 	add	x0, x21, 296
 	bl	epd_lut_get
@@ -3596,7 +3604,7 @@ ebc_lut_update:
 	b	.L354
 	.p2align 3
 .L346:
-	.loc 1 1285 0
+	.loc 1 1297 0
 	mov	w1, 11
 	add	x0, x21, 296
 	bl	epd_lut_get
@@ -3605,7 +3613,7 @@ ebc_lut_update:
 	b	.L354
 	.p2align 3
 .L347:
-	.loc 1 1256 0
+	.loc 1 1266 0
 	mov	w1, 6
 	add	x0, x21, 296
 	bl	epd_lut_get
@@ -3614,7 +3622,7 @@ ebc_lut_update:
 	b	.L354
 	.p2align 3
 .L348:
-	.loc 1 1261 0
+	.loc 1 1272 0
 	mov	w1, 4
 	add	x0, x21, 296
 	bl	epd_lut_get
@@ -3623,7 +3631,7 @@ ebc_lut_update:
 	b	.L354
 	.p2align 3
 .L349:
-	.loc 1 1265 0
+	.loc 1 1277 0
 	mov	w1, 3
 	add	x0, x21, 296
 	bl	epd_lut_get
@@ -3632,18 +3640,18 @@ ebc_lut_update:
 	b	.L354
 	.p2align 3
 .L360:
-	.loc 1 1221 0
+	.loc 1 1231 0
 	ldr	x0, [x22, 104]
 	adrp	x1, .LC10
 	add	x1, x1, :lo12:.LC10
 	bl	_dev_info
 .LVL300:
-	.loc 1 1222 0
+	.loc 1 1232 0
 	str	wzr, [x29, 52]
 	mov	w2, 0
 	b	.L338
 .L363:
-	.loc 1 1300 0
+	.loc 1 1312 0
 	bl	__stack_chk_fail
 .LVL301:
 	.cfi_endproc
@@ -3654,23 +3662,23 @@ ebc_lut_update:
 	.type	ebc_buf_state_read, %function
 ebc_buf_state_read:
 .LFB2843:
-	.loc 1 2100 0
+	.loc 1 2122 0
 	.cfi_startproc
 .LVL302:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2101 0
+	.loc 1 2123 0
 	mov	x0, x2
 .LVL303:
-	.loc 1 2100 0
+	.loc 1 2122 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2101 0
+	.loc 1 2123 0
 	bl	ebc_buf_state_show
 .LVL304:
-	.loc 1 2102 0
+	.loc 1 2124 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3685,32 +3693,32 @@ ebc_buf_state_read:
 	.type	ebc_state_read, %function
 ebc_state_read:
 .LFB2842:
-	.loc 1 2091 0
+	.loc 1 2113 0
 	.cfi_startproc
 .LVL305:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2092 0
+	.loc 1 2114 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2091 0
+	.loc 1 2113 0
 	mov	x0, x2
 .LVL306:
-	.loc 1 2092 0
+	.loc 1 2114 0
 	adrp	x1, .LC15
 .LVL307:
-	.loc 1 2091 0
+	.loc 1 2113 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2092 0
+	.loc 1 2114 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL308:
 	add	x1, x1, :lo12:.LC15
 	ldr	w2, [x2, 624]
 	bl	sprintf
 .LVL309:
-	.loc 1 2093 0
+	.loc 1 2115 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3725,7 +3733,7 @@ ebc_state_read:
 	.type	ebc_version_read, %function
 ebc_version_read:
 .LFB2841:
-	.loc 1 2082 0
+	.loc 1 2104 0
 	.cfi_startproc
 .LVL310:
 	stp	x29, x30, [sp, -16]!
@@ -3734,22 +3742,22 @@ ebc_version_read:
 	.cfi_offset 30, -8
 	mov	x0, x2
 .LVL311:
-	.loc 1 2083 0
+	.loc 1 2105 0
 	adrp	x1, .LC17
 .LVL312:
 	adrp	x2, .LC16
 .LVL313:
-	.loc 1 2082 0
+	.loc 1 2104 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2083 0
+	.loc 1 2105 0
 	add	x2, x2, :lo12:.LC16
-	.loc 1 2082 0
-	.loc 1 2083 0
+	.loc 1 2104 0
+	.loc 1 2105 0
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
 .LVL314:
-	.loc 1 2084 0
+	.loc 1 2106 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3764,27 +3772,27 @@ ebc_version_read:
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
 .LFB2839:
-	.loc 1 2046 0
+	.loc 1 2068 0
 	.cfi_startproc
 .LVL315:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 2047 0
+	.loc 1 2069 0
 	adrp	x0, .LANCHOR0
 .LVL316:
-	.loc 1 2046 0
+	.loc 1 2068 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2050 0
+	.loc 1 2072 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2046 0
+	.loc 1 2068 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2046 0
+	.loc 1 2068 0
 	mov	x19, x2
-	.loc 1 2050 0
+	.loc 1 2072 0
 	ldr	x1, [x0, 16]
 .LVL317:
 .LBB1218:
@@ -3796,14 +3804,14 @@ pmic_vcom_read:
 .LVL318:
 .LBE1219:
 .LBE1218:
-	.loc 1 2052 0
+	.loc 1 2074 0
 	mov	w2, w0
 	adrp	x1, .LC15
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
 .LVL319:
-	.loc 1 2053 0
+	.loc 1 2075 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL320:
@@ -3821,20 +3829,20 @@ pmic_vcom_read:
 	.type	pmic_temp_read, %function
 pmic_temp_read:
 .LFB2838:
-	.loc 1 2032 0
+	.loc 1 2054 0
 	.cfi_startproc
 .LVL321:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 2033 0
+	.loc 1 2055 0
 	adrp	x0, .LANCHOR0
 .LVL322:
-	.loc 1 2032 0
+	.loc 1 2054 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2036 0
+	.loc 1 2058 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
 .LBB1220:
 .LBB1221:
@@ -3843,11 +3851,11 @@ pmic_temp_read:
 .LVL323:
 .LBE1221:
 .LBE1220:
-	.loc 1 2032 0
+	.loc 1 2054 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 2032 0
+	.loc 1 2054 0
 	adrp	x19, __stack_chk_guard
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x20, x2
@@ -3855,7 +3863,7 @@ pmic_temp_read:
 	str	x2, [x29, 40]
 	mov	x2,0
 .LVL324:
-	.loc 1 2036 0
+	.loc 1 2058 0
 	ldr	x2, [x0, 16]
 .LBB1223:
 .LBB1222:
@@ -3866,14 +3874,14 @@ pmic_temp_read:
 .LVL325:
 .LBE1222:
 .LBE1223:
-	.loc 1 2038 0
+	.loc 1 2060 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC15
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
 .LVL326:
-	.loc 1 2039 0
+	.loc 1 2061 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
@@ -3902,25 +3910,25 @@ pmic_temp_read:
 	.type	pmic_name_read, %function
 pmic_name_read:
 .LFB2837:
-	.loc 1 2021 0
+	.loc 1 2043 0
 	.cfi_startproc
 .LVL330:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2022 0
+	.loc 1 2044 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2021 0
+	.loc 1 2043 0
 	mov	x0, x2
 .LVL331:
-	.loc 1 2024 0
+	.loc 1 2046 0
 	adrp	x1, .LC17
 .LVL332:
-	.loc 1 2021 0
+	.loc 1 2043 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2024 0
+	.loc 1 2046 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL333:
 	add	x1, x1, :lo12:.LC17
@@ -3928,7 +3936,7 @@ pmic_name_read:
 	add	x2, x2, 8
 	bl	sprintf
 .LVL334:
-	.loc 1 2025 0
+	.loc 1 2047 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3943,17 +3951,17 @@ pmic_name_read:
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
 .LFB2840:
-	.loc 1 2058 0
+	.loc 1 2080 0
 	.cfi_startproc
 .LVL335:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 2059 0
+	.loc 1 2081 0
 	adrp	x0, .LANCHOR0
 .LVL336:
-	.loc 1 2058 0
+	.loc 1 2080 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -3963,37 +3971,37 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 2058 0
+	.loc 1 2080 0
 	add	x1, x19, :lo12:__stack_chk_guard
 .LVL337:
 	mov	x21, x2
-	.loc 1 2059 0
+	.loc 1 2081 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
 .LVL338:
-	.loc 1 2058 0
+	.loc 1 2080 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
 .LVL339:
 	mov	x20, x3
-	.loc 1 2062 0
+	.loc 1 2084 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
 .LVL340:
-	.loc 1 2063 0
+	.loc 1 2085 0
 	cbnz	w0, .L385
 .LVL341:
-	.loc 1 2067 0
+	.loc 1 2089 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
 .LVL342:
-	.loc 1 2068 0
+	.loc 1 2090 0
 	cbnz	w0, .L386
 .L378:
-	.loc 1 2074 0
+	.loc 1 2096 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
 .LVL343:
@@ -4018,36 +4026,36 @@ pmic_vcom_write:
 	.p2align 3
 .L385:
 	.cfi_restore_state
-	.loc 1 2064 0
+	.loc 1 2086 0
 	ldr	x0, [x22]
 	adrp	x1, .LC18
 	mov	x2, x21
 	add	x1, x1, :lo12:.LC18
-	.loc 1 2065 0
+	.loc 1 2087 0
 	mov	x20, -1
 .LVL346:
-	.loc 1 2064 0
+	.loc 1 2086 0
 	bl	_dev_err
 .LVL347:
-	.loc 1 2065 0
+	.loc 1 2087 0
 	b	.L378
 .LVL348:
 	.p2align 3
 .L386:
-	.loc 1 2069 0
+	.loc 1 2091 0
 	ldr	x0, [x22]
 	adrp	x1, .LC19
-	.loc 1 2070 0
+	.loc 1 2092 0
 	mov	x20, -1
 .LVL349:
-	.loc 1 2069 0
+	.loc 1 2091 0
 	add	x1, x1, :lo12:.LC19
 	bl	_dev_err
 .LVL350:
-	.loc 1 2070 0
+	.loc 1 2092 0
 	b	.L378
 .L387:
-	.loc 1 2074 0
+	.loc 1 2096 0
 	bl	__stack_chk_fail
 .LVL351:
 	.cfi_endproc
@@ -4058,7 +4066,7 @@ pmic_vcom_write:
 	.type	waveform_version_read, %function
 waveform_version_read:
 .LFB2836:
-	.loc 1 2010 0
+	.loc 1 2032 0
 	.cfi_startproc
 .LVL352:
 	stp	x29, x30, [sp, -32]!
@@ -4069,19 +4077,19 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2010 0
+	.loc 1 2032 0
 	mov	x19, x2
-	.loc 1 2011 0
+	.loc 1 2033 0
 	bl	epd_lut_get_wf_version
 .LVL353:
-	.loc 1 2013 0
+	.loc 1 2035 0
 	mov	x2, x0
 	adrp	x1, .LC17
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
 .LVL354:
-	.loc 1 2014 0
+	.loc 1 2036 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL355:
@@ -4099,23 +4107,23 @@ waveform_version_read:
 	.type	ebc_init, %function
 ebc_init:
 .LFB2854:
-	.loc 1 2561 0
+	.loc 1 2583 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2562 0
+	.loc 1 2584 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2561 0
+	.loc 1 2583 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2562 0
+	.loc 1 2584 0
 	bl	__platform_driver_register
 .LVL356:
-	.loc 1 2563 0
+	.loc 1 2585 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -4130,58 +4138,58 @@ ebc_init:
 	.type	direct_mode_data_change, %function
 direct_mode_data_change:
 .LFB2815:
-	.loc 1 902 0
+	.loc 1 904 0
 	.cfi_startproc
 .LVL357:
-	.loc 1 903 0
+	.loc 1 905 0
 	ldr	w13, [x3, 88]
 .LVL358:
 	cbnz	w13, .L426
 .LBB1242:
 .LBB1243:
-	.loc 1 867 0
+	.loc 1 869 0
 	adrp	x5, .LANCHOR0
-	.loc 1 873 0
+	.loc 1 875 0
 	ldrb	w7, [x3, 48]
 	ldr	w4, [x3, 56]
-	.loc 1 867 0
+	.loc 1 869 0
 	ldr	x15, [x5, #:lo12:.LANCHOR0]
-	.loc 1 874 0
+	.loc 1 876 0
 	ldr	x3, [x3, 128]
 .LVL359:
-	.loc 1 873 0
+	.loc 1 875 0
 	sub	w7, w7, w4
 .LVL360:
-	.loc 1 875 0
+	.loc 1 877 0
 	add	x15, x15, 24
-	.loc 1 874 0
+	.loc 1 876 0
 	lsl	w7, w7, 16
 .LVL361:
 	add	x7, x3, x7, sxtw
 .LVL362:
-	.loc 1 878 0
+	.loc 1 880 0
 	ldr	w16, [x15, 88]
-	.loc 1 877 0
+	.loc 1 879 0
 	ldr	w3, [x15, 84]
-	.loc 1 875 0
+	.loc 1 877 0
 	ldr	w17, [x15, 156]
 .LVL363:
-	.loc 1 883 0
+	.loc 1 885 0
 	cmp	w16, 0
-	.loc 1 877 0
+	.loc 1 879 0
 	lsr	w12, w3, 3
 .LVL364:
-	.loc 1 883 0
+	.loc 1 885 0
 	ble	.L414
 	sub	w14, w12, #1
 	add	x14, x14, 1
 	lsl	x14, x14, 2
-	.loc 1 884 0
+	.loc 1 886 0
 	cbz	w17, .L400
 .LVL365:
 	.p2align 2
 .L427:
-	.loc 1 885 0
+	.loc 1 887 0
 	ldr	w10, [x15, 88]
 .LVL366:
 	sub	w10, w10, #1
@@ -4191,14 +4199,14 @@ direct_mode_data_change:
 	add	x10, x0, x10
 .LVL367:
 .L401:
-	.loc 1 889 0
+	.loc 1 891 0
 	cbz	w12, .L402
 	mov	x5, 0
 	.p2align 2
 .L403:
-	.loc 1 891 0
+	.loc 1 893 0
 	ldr	w3, [x2, x5, lsl 2]
-	.loc 1 890 0
+	.loc 1 892 0
 	ldr	w4, [x1, x5, lsl 2]
 	add	x5, x5, 1
 .LVL368:
@@ -4208,10 +4216,10 @@ direct_mode_data_change:
 	and	w9, w3, 65280
 .LBE1245:
 .LBE1244:
-	.loc 1 889 0
+	.loc 1 891 0
 	cmp	w12, w5
 .LVL369:
-	.loc 1 893 0
+	.loc 1 895 0
 	and	w6, w4, 65535
 .LBB1250:
 .LBB1246:
@@ -4223,7 +4231,7 @@ direct_mode_data_change:
 	add	w6, w8, w6, uxtb
 .LBE1246:
 .LBE1250:
-	.loc 1 894 0
+	.loc 1 896 0
 	lsr	w3, w3, 16
 .LVL370:
 	lsr	w4, w4, 16
@@ -4263,7 +4271,7 @@ direct_mode_data_change:
 	orr	w4, w11, w9, lsl 4
 .LBE1249:
 .LBE1260:
-	.loc 1 893 0
+	.loc 1 895 0
 	strb	w4, [x10], 2
 .LBB1261:
 .LBB1255:
@@ -4274,22 +4282,22 @@ direct_mode_data_change:
 	orr	w3, w4, w3, lsl 4
 .LBE1255:
 .LBE1261:
-	.loc 1 894 0
+	.loc 1 896 0
 	strb	w3, [x10, -1]
-	.loc 1 889 0
+	.loc 1 891 0
 	bgt	.L403
 	add	x1, x1, x14
 	add	x2, x2, x14
 .L402:
-	.loc 1 883 0
+	.loc 1 885 0
 	add	w13, w13, 1
 	cmp	w16, w13
 	beq	.L414
 	ldr	w3, [x15, 84]
-	.loc 1 884 0
+	.loc 1 886 0
 	cbnz	w17, .L427
 .L400:
-	.loc 1 887 0
+	.loc 1 889 0
 	mul	w10, w13, w3
 .LVL371:
 	lsr	w10, w10, 2
@@ -4303,38 +4311,38 @@ direct_mode_data_change:
 .LBB1262:
 .LBB1263:
 .LBB1264:
-	.loc 1 828 0
+	.loc 1 830 0
 	adrp	x7, .LANCHOR0
-	.loc 1 834 0
+	.loc 1 836 0
 	ldrb	w4, [x3, 48]
 	ldr	w6, [x3, 56]
-	.loc 1 828 0
+	.loc 1 830 0
 	ldr	x13, [x7, #:lo12:.LANCHOR0]
 .LVL374:
-	.loc 1 835 0
+	.loc 1 837 0
 	ldr	x5, [x3, 128]
-	.loc 1 834 0
+	.loc 1 836 0
 	sub	w3, w4, w6
 .LVL375:
-	.loc 1 836 0
+	.loc 1 838 0
 	add	x13, x13, 24
-	.loc 1 835 0
+	.loc 1 837 0
 	lsl	w3, w3, 16
 .LVL376:
 	add	x3, x5, x3, sxtw
 .LVL377:
-	.loc 1 839 0
+	.loc 1 841 0
 	ldr	w15, [x13, 88]
-	.loc 1 838 0
+	.loc 1 840 0
 	ldr	w5, [x13, 84]
-	.loc 1 836 0
+	.loc 1 838 0
 	ldr	w16, [x13, 156]
 .LVL378:
-	.loc 1 844 0
+	.loc 1 846 0
 	cmp	w15, 0
-	.loc 1 838 0
+	.loc 1 840 0
 	lsr	w14, w5, 4
-	.loc 1 844 0
+	.loc 1 846 0
 	ble	.L414
 	sub	w11, w14, #1
 	mov	x10, x2
@@ -4345,11 +4353,11 @@ direct_mode_data_change:
 	lsl	x11, x11, 3
 	mov	w12, 0
 .LVL381:
-	.loc 1 845 0
+	.loc 1 847 0
 	cbz	w16, .L417
 .LVL382:
 .L430:
-	.loc 1 846 0
+	.loc 1 848 0
 	ldr	w4, [x13, 88]
 .LVL383:
 	sub	w4, w4, #1
@@ -4359,12 +4367,12 @@ direct_mode_data_change:
 	add	x4, x0, x4
 .LVL384:
 .L418:
-	.loc 1 850 0
+	.loc 1 852 0
 	cbz	w14, .L428
 .LBE1264:
 .LBE1263:
 .LBE1262:
-	.loc 1 902 0
+	.loc 1 904 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -4376,23 +4384,23 @@ direct_mode_data_change:
 .LBB1309:
 .LBB1307:
 .LBB1305:
-	.loc 1 850 0
+	.loc 1 852 0
 	mov	x5, 0
 	.p2align 2
 .L399:
-	.loc 1 852 0
+	.loc 1 854 0
 	ldr	x2, [x10, x5]
 .LVL385:
 	add	x4, x4, 4
-	.loc 1 851 0
+	.loc 1 853 0
 	ldr	x1, [x9, x5]
 .LVL386:
 	add	x5, x5, 8
-	.loc 1 854 0
+	.loc 1 856 0
 	and	w7, w2, 65535
-	.loc 1 850 0
+	.loc 1 852 0
 	cmp	x11, x5
-	.loc 1 854 0
+	.loc 1 856 0
 	and	w6, w1, 65535
 .LBB1265:
 .LBB1266:
@@ -4406,7 +4414,7 @@ direct_mode_data_change:
 	add	w7, w7, w6, lsr 8
 .LBE1266:
 .LBE1265:
-	.loc 1 855 0
+	.loc 1 857 0
 	lsr	w8, w2, 16
 	lsr	w6, w1, 16
 .LBB1270:
@@ -4439,10 +4447,10 @@ direct_mode_data_change:
 	add	w8, w8, w6, lsr 8
 .LBE1273:
 .LBE1280:
-	.loc 1 856 0
+	.loc 1 858 0
 	ubfx	x7, x2, 32, 16
 	ubfx	x6, x1, 32, 16
-	.loc 1 857 0
+	.loc 1 859 0
 	lsr	x2, x2, 48
 .LVL387:
 .LBB1281:
@@ -4451,7 +4459,7 @@ direct_mode_data_change:
 	orr	w17, w30, w17, lsl 4
 .LBE1269:
 .LBE1281:
-	.loc 1 854 0
+	.loc 1 856 0
 	strb	w17, [x4, -4]
 .LBB1282:
 .LBB1283:
@@ -4483,7 +4491,7 @@ direct_mode_data_change:
 	add	w6, w7, w6, lsr 8
 .LBE1285:
 .LBE1292:
-	.loc 1 857 0
+	.loc 1 859 0
 	lsr	x1, x1, 48
 .LVL388:
 .LBB1293:
@@ -4492,7 +4500,7 @@ direct_mode_data_change:
 	orr	w7, w18, w8, lsl 4
 .LBE1276:
 .LBE1293:
-	.loc 1 855 0
+	.loc 1 857 0
 	strb	w7, [x4, -3]
 .LBB1294:
 .LBB1295:
@@ -4530,7 +4538,7 @@ direct_mode_data_change:
 	orr	w2, w17, w8, lsl 4
 .LBE1288:
 .LBE1303:
-	.loc 1 856 0
+	.loc 1 858 0
 	strb	w2, [x4, -2]
 .LBB1304:
 .LBB1298:
@@ -4541,11 +4549,11 @@ direct_mode_data_change:
 	orr	w1, w2, w1, lsl 4
 .LBE1298:
 .LBE1304:
-	.loc 1 857 0
+	.loc 1 859 0
 	strb	w1, [x4, -1]
-	.loc 1 850 0
+	.loc 1 852 0
 	bne	.L399
-	.loc 1 844 0
+	.loc 1 846 0
 	add	w12, w12, 1
 	add	x9, x9, x11
 	add	x10, x10, x11
@@ -4553,9 +4561,9 @@ direct_mode_data_change:
 	beq	.L392
 .L429:
 	ldr	w5, [x13, 84]
-	.loc 1 845 0
+	.loc 1 847 0
 	cbz	w16, .L396
-	.loc 1 846 0
+	.loc 1 848 0
 	ldr	w4, [x13, 88]
 .LVL389:
 	sub	w4, w4, #1
@@ -4564,10 +4572,10 @@ direct_mode_data_change:
 	lsr	w4, w4, 2
 	add	x4, x0, x4
 .LVL390:
-	.loc 1 850 0
+	.loc 1 852 0
 	cbnz	w14, .L419
 .L425:
-	.loc 1 844 0
+	.loc 1 846 0
 	add	w12, w12, 1
 	cmp	w15, w12
 	bne	.L429
@@ -4575,7 +4583,7 @@ direct_mode_data_change:
 .LBE1305:
 .LBE1307:
 .LBE1309:
-	.loc 1 907 0
+	.loc 1 909 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -4586,7 +4594,7 @@ direct_mode_data_change:
 .LBB1310:
 .LBB1308:
 .LBB1306:
-	.loc 1 848 0
+	.loc 1 850 0
 	mul	w4, w12, w5
 .LVL392:
 	lsr	w4, w4, 2
@@ -4604,7 +4612,7 @@ direct_mode_data_change:
 	lsr	w4, w4, 2
 	add	x4, x0, x4
 .LVL396:
-	.loc 1 850 0
+	.loc 1 852 0
 	cbnz	w14, .L419
 	b	.L425
 .LVL397:
@@ -4612,12 +4620,12 @@ direct_mode_data_change:
 	.cfi_def_cfa 31, 0
 	.cfi_restore 29
 	.cfi_restore 30
-	.loc 1 844 0
+	.loc 1 846 0
 	add	w12, w12, 1
 	cmp	w15, w12
 	beq	.L414
 	ldr	w5, [x13, 84]
-	.loc 1 845 0
+	.loc 1 847 0
 	cbz	w16, .L417
 	b	.L430
 .LVL398:
@@ -4635,7 +4643,7 @@ direct_mode_data_change:
 	.type	direct_mode_data_change_part, %function
 direct_mode_data_change_part:
 .LFB2818:
-	.loc 1 996 0
+	.loc 1 998 0
 	.cfi_startproc
 .LVL399:
 	stp	x29, x30, [sp, -80]!
@@ -4645,12 +4653,12 @@ direct_mode_data_change_part:
 .LBB1329:
 .LBB1330:
 .LBB1331:
-	.loc 1 955 0
+	.loc 1 957 0
 	adrp	x5, .LANCHOR0
 .LBE1331:
 .LBE1330:
 .LBE1329:
-	.loc 1 996 0
+	.loc 1 998 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -4664,44 +4672,44 @@ direct_mode_data_change_part:
 	.cfi_offset 23, -32
 	.cfi_offset 24, -24
 	.cfi_offset 25, -16
-	.loc 1 997 0
+	.loc 1 999 0
 	ldr	w16, [x3, 88]
 .LVL400:
 	cbnz	w16, .L535
 .LBB1344:
 .LBB1345:
-	.loc 1 914 0
+	.loc 1 916 0
 	ldr	x18, [x5, #:lo12:.LANCHOR0]
-	.loc 1 919 0
+	.loc 1 921 0
 	ldrb	w14, [x3, 48]
 	ldr	w4, [x3, 56]
-	.loc 1 921 0
+	.loc 1 923 0
 	add	x18, x18, 24
-	.loc 1 920 0
+	.loc 1 922 0
 	ldr	x3, [x3, 128]
 .LVL401:
-	.loc 1 919 0
+	.loc 1 921 0
 	sub	w14, w14, w4
 .LVL402:
-	.loc 1 924 0
+	.loc 1 926 0
 	ldr	w30, [x18, 88]
-	.loc 1 920 0
+	.loc 1 922 0
 	lsl	w14, w14, 16
 .LVL403:
-	.loc 1 921 0
+	.loc 1 923 0
 	ldr	w19, [x18, 156]
-	.loc 1 920 0
+	.loc 1 922 0
 	add	x14, x3, x14, sxtw
 .LVL404:
-	.loc 1 923 0
+	.loc 1 925 0
 	ldr	w3, [x18, 84]
 .LVL405:
-	.loc 1 929 0
+	.loc 1 931 0
 	cmp	w30, 0
-	.loc 1 923 0
+	.loc 1 925 0
 	lsr	w9, w3, 3
 .LVL406:
-	.loc 1 929 0
+	.loc 1 931 0
 	ble	.L431
 	sub	w17, w9, #1
 .LBB1346:
@@ -4712,12 +4720,12 @@ direct_mode_data_change_part:
 	lsl	x17, x17, 2
 .LBE1347:
 .LBE1346:
-	.loc 1 930 0
+	.loc 1 932 0
 	cbz	w19, .L461
 .LVL407:
 	.p2align 2
 .L536:
-	.loc 1 931 0
+	.loc 1 933 0
 	ldr	w13, [x18, 88]
 .LVL408:
 	sub	w13, w13, #1
@@ -4727,14 +4735,14 @@ direct_mode_data_change_part:
 	add	x13, x0, x13
 .LVL409:
 .L462:
-	.loc 1 935 0
+	.loc 1 937 0
 	cbz	w9, .L463
 	add	x13, x13, 2
 .LVL410:
 	mov	x10, 0
 	.p2align 2
 .L476:
-	.loc 1 937 0
+	.loc 1 939 0
 	ldr	w6, [x2, x10, lsl 2]
 .LBB1353:
 .LBB1354:
@@ -4742,7 +4750,7 @@ direct_mode_data_change_part:
 	mov	w4, 0
 .LBE1354:
 .LBE1353:
-	.loc 1 936 0
+	.loc 1 938 0
 	ldr	w7, [x1, x10, lsl 2]
 .LBB1359:
 .LBB1348:
@@ -4750,7 +4758,7 @@ direct_mode_data_change_part:
 	mov	w5, 0
 .LBE1348:
 .LBE1359:
-	.loc 1 939 0
+	.loc 1 941 0
 	and	w20, w6, 65535
 	and	w12, w7, 65535
 .LBB1360:
@@ -4760,7 +4768,7 @@ direct_mode_data_change_part:
 	add	w8, w3, w12, lsr 8
 .LBE1355:
 .LBE1360:
-	.loc 1 940 0
+	.loc 1 942 0
 	lsr	w3, w6, 16
 .LBB1361:
 .LBB1349:
@@ -4768,7 +4776,7 @@ direct_mode_data_change_part:
 	ubfiz	w23, w3, 8, 8
 .LBE1349:
 .LBE1361:
-	.loc 1 940 0
+	.loc 1 942 0
 	and	w3, w3, 65535
 	lsr	w11, w7, 16
 .LBB1362:
@@ -4800,7 +4808,7 @@ direct_mode_data_change_part:
 	add	w21, w21, w11, lsr 8
 .LBE1351:
 .LBE1365:
-	.loc 1 938 0
+	.loc 1 940 0
 	cmp	w7, w6
 	beq	.L464
 .LBB1366:
@@ -4839,7 +4847,7 @@ direct_mode_data_change_part:
 .L465:
 .LBE1358:
 .LBE1366:
-	.loc 1 939 0
+	.loc 1 941 0
 	strb	w4, [x13, -2]
 .LBB1367:
 .LBB1352:
@@ -4877,27 +4885,27 @@ direct_mode_data_change_part:
 .L470:
 .LBE1352:
 .LBE1367:
-	.loc 1 940 0
+	.loc 1 942 0
 	strb	w5, [x13, -1]
 .L475:
 	add	x10, x10, 1
 	add	x13, x13, 2
-	.loc 1 935 0
+	.loc 1 937 0
 	cmp	w9, w10
 	bgt	.L476
 	add	x1, x1, x17
 	add	x2, x2, x17
 .LVL411:
 .L463:
-	.loc 1 929 0
+	.loc 1 931 0
 	add	w16, w16, 1
 	cmp	w30, w16
 	beq	.L431
 	ldr	w3, [x18, 84]
-	.loc 1 930 0
+	.loc 1 932 0
 	cbnz	w19, .L536
 .L461:
-	.loc 1 933 0
+	.loc 1 935 0
 	mul	w13, w16, w3
 .LVL412:
 	lsr	w13, w13, 2
@@ -4907,7 +4915,7 @@ direct_mode_data_change_part:
 .LVL414:
 	.p2align 3
 .L464:
-	.loc 1 943 0
+	.loc 1 945 0
 	strh	wzr, [x13, -2]
 	b	.L475
 .LVL415:
@@ -4915,7 +4923,7 @@ direct_mode_data_change_part:
 .L431:
 .LBE1345:
 .LBE1344:
-	.loc 1 1001 0
+	.loc 1 1003 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 .LVL416:
@@ -4942,39 +4950,39 @@ direct_mode_data_change_part:
 .LBB1368:
 .LBB1343:
 .LBB1342:
-	.loc 1 955 0
+	.loc 1 957 0
 	ldr	x14, [x5, #:lo12:.LANCHOR0]
-	.loc 1 960 0
+	.loc 1 962 0
 	ldrb	w7, [x3, 48]
 	ldr	w4, [x3, 56]
-	.loc 1 962 0
+	.loc 1 964 0
 	add	x14, x14, 24
-	.loc 1 961 0
+	.loc 1 963 0
 	ldr	x3, [x3, 128]
 .LVL420:
-	.loc 1 960 0
+	.loc 1 962 0
 	sub	w7, w7, w4
 .LVL421:
-	.loc 1 965 0
+	.loc 1 967 0
 	ldr	w15, [x14, 88]
-	.loc 1 961 0
+	.loc 1 963 0
 	lsl	w7, w7, 16
 .LVL422:
-	.loc 1 962 0
+	.loc 1 964 0
 	ldr	w16, [x14, 156]
 .LVL423:
-	.loc 1 961 0
+	.loc 1 963 0
 	add	x7, x3, x7, sxtw
 .LVL424:
-	.loc 1 964 0
+	.loc 1 966 0
 	ldr	w3, [x14, 84]
 .LVL425:
-	.loc 1 970 0
+	.loc 1 972 0
 	cmp	w15, 0
-	.loc 1 964 0
+	.loc 1 966 0
 	lsr	w11, w3, 4
 .LVL426:
-	.loc 1 970 0
+	.loc 1 972 0
 	ble	.L431
 	sub	w13, w11, #1
 	mov	x9, x2
@@ -4991,12 +4999,12 @@ direct_mode_data_change_part:
 	mov	w10, 3
 .LBE1333:
 .LBE1332:
-	.loc 1 971 0
+	.loc 1 973 0
 	cbz	w16, .L435
 .LVL430:
 	.p2align 2
 .L537:
-	.loc 1 972 0
+	.loc 1 974 0
 	ldr	w1, [x14, 88]
 .LVL431:
 	sub	w1, w1, #1
@@ -5006,23 +5014,23 @@ direct_mode_data_change_part:
 	add	x3, x0, x3
 .LVL432:
 .L436:
-	.loc 1 976 0
+	.loc 1 978 0
 	cbz	w11, .L437
 	add	x3, x3, 4
 .LVL433:
 	mov	x5, 0
 	.p2align 2
 .L460:
-	.loc 1 977 0
+	.loc 1 979 0
 	ldr	x1, [x8, x5, lsl 3]
 .LVL434:
-	.loc 1 978 0
+	.loc 1 980 0
 	ldr	x2, [x9, x5, lsl 3]
 .LVL435:
-	.loc 1 979 0
+	.loc 1 981 0
 	cmp	x1, x2
 	beq	.L438
-	.loc 1 980 0
+	.loc 1 982 0
 	and	w17, w2, 65535
 	and	w6, w1, 65535
 .LVL436:
@@ -5077,9 +5085,9 @@ direct_mode_data_change_part:
 .L439:
 .LBE1336:
 .LBE1335:
-	.loc 1 980 0
+	.loc 1 982 0
 	strb	w4, [x3, -4]
-	.loc 1 981 0
+	.loc 1 983 0
 	lsr	w17, w2, 16
 	lsr	w6, w1, 16
 .LBB1337:
@@ -5133,9 +5141,9 @@ direct_mode_data_change_part:
 .L444:
 .LBE1338:
 .LBE1337:
-	.loc 1 981 0
+	.loc 1 983 0
 	strb	w4, [x3, -3]
-	.loc 1 982 0
+	.loc 1 984 0
 	ubfx	x17, x2, 32, 16
 	ubfx	x6, x1, 32, 16
 .LBB1339:
@@ -5189,9 +5197,9 @@ direct_mode_data_change_part:
 .L449:
 .LBE1340:
 .LBE1339:
-	.loc 1 982 0
+	.loc 1 984 0
 	strb	w4, [x3, -2]
-	.loc 1 983 0
+	.loc 1 985 0
 	lsr	x2, x2, 48
 .LVL443:
 	lsr	x1, x1, 48
@@ -5248,29 +5256,29 @@ direct_mode_data_change_part:
 .L454:
 .LBE1334:
 .LBE1341:
-	.loc 1 983 0
+	.loc 1 985 0
 	strb	w4, [x3, -1]
 .LVL448:
 .L459:
 	add	x5, x5, 1
 	add	x3, x3, 4
-	.loc 1 976 0
+	.loc 1 978 0
 	cmp	w11, w5
 	bgt	.L460
 	add	x8, x8, x13
 	add	x9, x9, x13
 .LVL449:
 .L437:
-	.loc 1 970 0
+	.loc 1 972 0
 	add	w12, w12, 1
 	cmp	w15, w12
 	beq	.L431
 	ldr	w3, [x14, 84]
 .LVL450:
-	.loc 1 971 0
+	.loc 1 973 0
 	cbnz	w16, .L537
 .L435:
-	.loc 1 974 0
+	.loc 1 976 0
 	mul	w3, w12, w3
 	lsr	w3, w3, 2
 	add	x3, x0, x3
@@ -5279,7 +5287,7 @@ direct_mode_data_change_part:
 .LVL452:
 	.p2align 3
 .L438:
-	.loc 1 986 0
+	.loc 1 988 0
 	str	wzr, [x3, -4]
 	b	.L459
 .LBE1342:
@@ -5293,26 +5301,26 @@ direct_mode_data_change_part:
 	.type	flip.isra.7, %function
 flip.isra.7:
 .LFB2863:
-	.loc 1 1003 0
+	.loc 1 1005 0
 	.cfi_startproc
 .LVL453:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 1007 0
+	.loc 1 1009 0
 	sxtw	x2, w1
-	.loc 1 1003 0
+	.loc 1 1005 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 1003 0
-	mov	x20, x0
 	.loc 1 1005 0
-	ldr	w19, [x0, 72]
+	mov	x20, x0
 	.loc 1 1007 0
+	ldr	w19, [x0, 72]
+	.loc 1 1009 0
 	ldr	x0, [x0]
 .LVL454:
 .LBB1369:
@@ -5337,7 +5345,7 @@ flip.isra.7:
 	cbz	x5, .L540
 .LBE1370:
 .LBE1369:
-	.loc 1 1007 0
+	.loc 1 1009 0
 	add	x4, x19, x19, lsl 1
 .LBB1378:
 .LBB1375:
@@ -5345,7 +5353,7 @@ flip.isra.7:
 	mov	w3, 1
 .LBE1375:
 .LBE1378:
-	.loc 1 1007 0
+	.loc 1 1009 0
 	add	x4, x20, x4, lsl 3
 .LBB1379:
 .LBB1376:
@@ -5356,7 +5364,7 @@ flip.isra.7:
 .L540:
 .LBE1376:
 .LBE1379:
-	.loc 1 1008 0
+	.loc 1 1010 0
 	ldr	x5, [x20, 8]
 .LBB1380:
 .LBB1381:
@@ -5369,7 +5377,7 @@ flip.isra.7:
 	mov	w1, 0
 .LBE1381:
 .LBE1380:
-	.loc 1 1009 0
+	.loc 1 1011 0
 	add	x19, x19, x19, lsl 1
 .LBB1384:
 .LBB1382:
@@ -5377,7 +5385,7 @@ flip.isra.7:
 	ldr	x5, [x5, 64]
 .LBE1382:
 .LBE1384:
-	.loc 1 1009 0
+	.loc 1 1011 0
 	add	x19, x20, x19, lsl 3
 .LBB1385:
 .LBB1383:
@@ -5386,7 +5394,7 @@ flip.isra.7:
 .LVL456:
 .LBE1383:
 .LBE1385:
-	.loc 1 1009 0
+	.loc 1 1011 0
 	ldr	x1, [x20, 8]
 .LBB1386:
 .LBB1387:
@@ -5399,7 +5407,7 @@ flip.isra.7:
 .LVL457:
 .LBE1387:
 .LBE1386:
-	.loc 1 1010 0
+	.loc 1 1012 0
 	ldr	x2, [x20, 8]
 .LBB1388:
 .LBB1389:
@@ -5411,12 +5419,12 @@ flip.isra.7:
 .LVL458:
 .LBE1389:
 .LBE1388:
-	.loc 1 1011 0
+	.loc 1 1013 0
 	ldr	w1, [x20, 72]
 	mov	w0, 1
 	sub	w0, w0, w1
 	str	w0, [x20, 72]
-	.loc 1 1012 0
+	.loc 1 1014 0
 	ldp	x19, x20, [sp, 16]
 .LVL459:
 	ldp	x29, x30, [sp], 32
@@ -5451,7 +5459,7 @@ flip.isra.7:
 	.type	ebc_frame_start, %function
 ebc_frame_start:
 .LFB2821:
-	.loc 1 1021 0
+	.loc 1 1023 0
 	.cfi_startproc
 .LVL461:
 	stp	x29, x30, [sp, -48]!
@@ -5463,112 +5471,105 @@ ebc_frame_start:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 1023 0
+	.loc 1 1025 0
 	add	x19, x0, 184
-	.loc 1 1021 0
+	.loc 1 1023 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 1021 0
+	.loc 1 1023 0
 	mov	x20, x0
-	.loc 1 1022 0
+	.loc 1 1024 0
 	add	x21, x0, 24
-	.loc 1 1025 0
+	.loc 1 1027 0
 	ldr	x1, [x19, 224]
 	ldr	w0, [x1, 40]
 .LVL462:
+	cmp	w0, 16
+	bgt	.L548
+	cmp	w0, 7
+	bge	.L549
+	cbz	w0, .L550
 	cmp	w0, 1
-	beq	.L548
-	ble	.L557
-	sub	w0, w0, #7
-	cmp	w0, 9
-	bhi	.L547
-	.loc 1 1075 0
-	ldr	x2, [x19, 216]
-	.loc 1 1073 0
-	mov	x3, x19
-	.loc 1 1072 0
-	ldrb	w0, [x19, 48]
-	str	w0, [x19, 56]
-	.loc 1 1073 0
+	bne	.L547
+	.loc 1 1029 0
 	ldr	x0, [x19, 184]
-	ldr	x2, [x2, 16]
-	ldr	x1, [x1, 16]
-	bl	direct_mode_data_change_part
+	mov	x4, x19
+	ldp	x1, x2, [x19, 144]
+	ldr	x3, [x19, 168]
+	bl	get_overlay_image
 .LVL463:
+	.loc 1 1034 0
+	ldr	w0, [x19, 52]
+	cbz	w0, .L552
 .LBB1391:
 .LBB1392:
-	.loc 1 1016 0
+	.loc 1 1018 0
 	str	wzr, [x21, 72]
-	.loc 1 1017 0
+	.loc 1 1019 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
 .LVL464:
 .LBE1392:
 .LBE1391:
-	.loc 1 1078 0
-	ldr	w0, [x19, 56]
-	.loc 1 1079 0
-	mov	x3, x19
-	.loc 1 1080 0
-	ldp	x2, x1, [x19, 216]
-	.loc 1 1078 0
-	sub	w0, w0, #1
-	str	w0, [x19, 56]
-	.loc 1 1079 0
+	.loc 1 1036 0
+	ldp	x1, x2, [x19, 144]
+	mov	x4, x19
+	ldr	x3, [x19, 168]
 	ldr	x0, [x19, 192]
-	ldr	x1, [x1, 16]
-	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change_part
+	bl	get_overlay_image
 .LVL465:
-	.loc 1 1100 0
+	.loc 1 1104 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 .LVL466:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
-	.cfi_restore 30
-	.cfi_restore 29
-	.cfi_restore 21
-	.cfi_restore 19
 	.cfi_restore 20
+	.cfi_restore 19
+	.cfi_restore 21
+	.cfi_restore 29
+	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
 .LVL467:
 	.p2align 3
-.L557:
+.L548:
 	.cfi_restore_state
-	.loc 1 1025 0
-	cbnz	w0, .L547
-	.loc 1 1045 0
+	.loc 1 1027 0
+	sub	w0, w0, #22
+	cmp	w0, 1
+	bhi	.L547
+.L550:
+	.loc 1 1049 0
 	ldr	x0, [x19, 184]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
 	ldr	x3, [x19, 168]
 	bl	get_auto_image
 .LVL468:
-	.loc 1 1050 0
+	.loc 1 1054 0
 	ldr	w0, [x19, 52]
 	cbz	w0, .L554
 .LBB1393:
 .LBB1394:
-	.loc 1 1016 0
+	.loc 1 1018 0
 	str	wzr, [x21, 72]
-	.loc 1 1017 0
+	.loc 1 1019 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
 .LVL469:
 .LBE1394:
 .LBE1393:
-	.loc 1 1052 0
+	.loc 1 1056 0
 	ldp	x1, x2, [x19, 144]
 	mov	x4, x19
 	ldr	x3, [x19, 168]
 	ldr	x0, [x19, 192]
 	bl	get_auto_image
 .LVL470:
-	.loc 1 1100 0
+	.loc 1 1104 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 .LVL471:
@@ -5583,93 +5584,104 @@ ebc_frame_start:
 	ret
 .LVL472:
 	.p2align 3
-.L548:
+.L547:
 	.cfi_restore_state
-	.loc 1 1027 0
+	.loc 1 1092 0
+	ldr	x2, [x19, 216]
+	.loc 1 1090 0
+	mov	x3, x19
+	.loc 1 1089 0
+	ldrb	w0, [x19, 48]
+	str	w0, [x19, 56]
+	.loc 1 1090 0
 	ldr	x0, [x19, 184]
-	mov	x4, x19
-	ldp	x1, x2, [x19, 144]
-	ldr	x3, [x19, 168]
-	bl	get_overlay_image
+	ldr	x2, [x2, 16]
+	ldr	x1, [x1, 16]
+	bl	direct_mode_data_change
 .LVL473:
-	.loc 1 1032 0
-	ldr	w0, [x19, 52]
-	cbz	w0, .L552
 .LBB1395:
 .LBB1396:
-	.loc 1 1016 0
+	.loc 1 1018 0
 	str	wzr, [x21, 72]
-	.loc 1 1017 0
+	.loc 1 1019 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
 .LVL474:
 .LBE1396:
 .LBE1395:
-	.loc 1 1034 0
-	ldp	x1, x2, [x19, 144]
-	mov	x4, x19
-	ldr	x3, [x19, 168]
+	.loc 1 1095 0
+	ldr	w0, [x19, 56]
+	.loc 1 1096 0
+	mov	x3, x19
+	.loc 1 1097 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1095 0
+	sub	w0, w0, #1
+	str	w0, [x19, 56]
+	.loc 1 1096 0
 	ldr	x0, [x19, 192]
-	bl	get_overlay_image
+	ldr	x1, [x1, 16]
+	ldr	x2, [x2, 16]
+	bl	direct_mode_data_change
 .LVL475:
-	.loc 1 1100 0
+	.loc 1 1104 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 .LVL476:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
-	.cfi_restore 20
-	.cfi_restore 19
-	.cfi_restore 21
-	.cfi_restore 29
 	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 21
+	.cfi_restore 19
+	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
 .LVL477:
 	.p2align 3
-.L547:
+.L549:
 	.cfi_restore_state
-	.loc 1 1088 0
+	.loc 1 1079 0
 	ldr	x2, [x19, 216]
-	.loc 1 1086 0
+	.loc 1 1077 0
 	mov	x3, x19
-	.loc 1 1085 0
+	.loc 1 1076 0
 	ldrb	w0, [x19, 48]
 	str	w0, [x19, 56]
-	.loc 1 1086 0
+	.loc 1 1077 0
 	ldr	x0, [x19, 184]
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
-	bl	direct_mode_data_change
+	bl	direct_mode_data_change_part
 .LVL478:
 .LBB1397:
 .LBB1398:
-	.loc 1 1016 0
+	.loc 1 1018 0
 	str	wzr, [x21, 72]
-	.loc 1 1017 0
+	.loc 1 1019 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
 .LVL479:
 .LBE1398:
 .LBE1397:
-	.loc 1 1091 0
+	.loc 1 1082 0
 	ldr	w0, [x19, 56]
-	.loc 1 1092 0
+	.loc 1 1083 0
 	mov	x3, x19
-	.loc 1 1093 0
+	.loc 1 1084 0
 	ldp	x2, x1, [x19, 216]
-	.loc 1 1091 0
+	.loc 1 1082 0
 	sub	w0, w0, #1
 	str	w0, [x19, 56]
-	.loc 1 1092 0
+	.loc 1 1083 0
 	ldr	x0, [x19, 192]
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change
+	bl	direct_mode_data_change_part
 .LVL480:
-	.loc 1 1100 0
+	.loc 1 1104 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 .LVL481:
@@ -5684,19 +5696,19 @@ ebc_frame_start:
 	ret
 .LVL482:
 	.p2align 3
-.L552:
+.L554:
 	.cfi_restore_state
-	.loc 1 1040 0
+	.loc 1 1062 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
-	adrp	x1, .LC20
+	adrp	x1, .LC21
 	add	x2, x2, :lo12:.LANCHOR3
-	add	x1, x1, :lo12:.LC20
+	add	x1, x1, :lo12:.LC21
 	bl	_dev_info
 .LVL483:
-	.loc 1 1041 0
+	.loc 1 1063 0
 	str	wzr, [x19, 44]
-	.loc 1 1100 0
+	.loc 1 1104 0
 	ldp	x19, x20, [sp, 16]
 .LVL484:
 	ldr	x21, [sp, 32]
@@ -5711,19 +5723,19 @@ ebc_frame_start:
 	ret
 .LVL485:
 	.p2align 3
-.L554:
+.L552:
 	.cfi_restore_state
-	.loc 1 1058 0
+	.loc 1 1042 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
-	adrp	x1, .LC21
+	adrp	x1, .LC20
 	add	x2, x2, :lo12:.LANCHOR3
-	add	x1, x1, :lo12:.LC21
+	add	x1, x1, :lo12:.LC20
 	bl	_dev_info
 .LVL486:
-	.loc 1 1059 0
+	.loc 1 1043 0
 	str	wzr, [x19, 44]
-	.loc 1 1100 0
+	.loc 1 1104 0
 	ldp	x19, x20, [sp, 16]
 .LVL487:
 	ldr	x21, [sp, 32]
@@ -5743,16 +5755,16 @@ ebc_frame_start:
 	.type	ebc_auto_tast_function, %function
 ebc_auto_tast_function:
 .LFB2822:
-	.loc 1 1103 0
+	.loc 1 1107 0
 	.cfi_startproc
 .LVL488:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
 	.cfi_offset 30, -88
-	.loc 1 1104 0
+	.loc 1 1108 0
 	adrp	x1, .LANCHOR0
-	.loc 1 1103 0
+	.loc 1 1107 0
 	adrp	x0, __stack_chk_guard
 .LVL489:
 	add	x0, x0, :lo12:__stack_chk_guard
@@ -5763,16 +5775,16 @@ ebc_auto_tast_function:
 	.cfi_offset 20, -72
 	adrp	x20, .LANCHOR1
 	stp	x21, x22, [sp, 32]
-	.loc 1 1109 0
+	.loc 1 1113 0
 	add	x20, x20, :lo12:.LANCHOR1
 	.cfi_offset 21, -64
 	.cfi_offset 22, -56
-	.loc 1 1104 0
+	.loc 1 1108 0
 	ldr	x22, [x1, #:lo12:.LANCHOR0]
 .LVL490:
-	.loc 1 1109 0
+	.loc 1 1113 0
 	add	x20, x20, 376
-	.loc 1 1103 0
+	.loc 1 1107 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
@@ -5785,16 +5797,16 @@ ebc_auto_tast_function:
 .LBE1401:
 .LBE1400:
 .LBE1399:
-	.loc 1 1103 0
+	.loc 1 1107 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -32
 	.cfi_offset 26, -24
-	.loc 1 1105 0
+	.loc 1 1109 0
 	add	x21, x22, 24
-	.loc 1 1106 0
+	.loc 1 1110 0
 	add	x19, x22, 184
 	add	x26, x22, 744
-	.loc 1 1103 0
+	.loc 1 1107 0
 	ldr	x1, [x0]
 	str	x1, [x29, 88]
 	mov	x1,0
@@ -5809,50 +5821,28 @@ ebc_auto_tast_function:
 // 0 "" 2
 .LVL491:
 #NO_APP
-	b	.L569
+	b	.L570
 	.p2align 3
 .L586:
 .LBE1404:
 .LBE1403:
 .LBE1406:
-	.loc 1 1114 0
-	cbnz	w0, .L559
-	.loc 1 1124 0
-	ldr	w1, [x22, 208]
-	mov	x0, x21
-	bl	flip.isra.7
-.LVL492:
-	.loc 1 1125 0
-	ldrsw	x0, [x21, 72]
-	mov	x4, x19
-	ldp	x1, x2, [x19, 144]
-	add	x0, x19, x0, lsl 3
-	ldr	x3, [x19, 168]
-	ldr	x0, [x0, 184]
-	bl	get_auto_image
-.LVL493:
-.L564:
-	.loc 1 1163 0
-	ldr	x0, [x19, 224]
-	ldr	w0, [x0, 40]
-	cbz	w0, .L567
-.L587:
-	.loc 1 1164 0
+	.loc 1 1172 0
 	cmp	w0, 1
 	beq	.L585
-.L568:
-	.loc 1 1167 0
+.L569:
+	.loc 1 1175 0
 	mov	x0, x20
 	bl	up
-.LVL494:
-	.loc 1 1168 0
+.LVL492:
+	.loc 1 1176 0
 	bl	schedule
-.LVL495:
-.L569:
-	.loc 1 1109 0
+.LVL493:
+.L570:
+	.loc 1 1113 0
 	mov	x0, x20
 	bl	down
-.LVL496:
+.LVL494:
 .LBB1407:
 .LBB1405:
 .LBB1402:
@@ -5861,53 +5851,46 @@ ebc_auto_tast_function:
 .LBE1402:
 .LBE1405:
 .LBE1407:
-	.loc 1 1113 0
+	.loc 1 1117 0
 #APP
-// 1113 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
+// 1117 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
 	dmb ish
 // 0 "" 2
-	.loc 1 1114 0
+	.loc 1 1118 0
 #NO_APP
 	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
+	cmp	w0, 16
+	bgt	.L561
+	cmp	w0, 7
+	bge	.L562
+	cbz	w0, .L563
 	cmp	w0, 1
-	beq	.L560
-	ble	.L586
-	sub	w0, w0, #7
-	cmp	w0, 9
-	bhi	.L559
-	.loc 1 1141 0
-	ldr	w1, [x19, 56]
-	.loc 1 1142 0
-	mov	x0, x21
-	.loc 1 1141 0
-	sub	w1, w1, #1
-	str	w1, [x19, 56]
-	.loc 1 1142 0
+	bne	.L560
+	.loc 1 1120 0
 	ldr	w1, [x22, 208]
+	mov	x0, x21
 	bl	flip.isra.7
-.LVL497:
-	.loc 1 1143 0
-	ldr	w0, [x19, 56]
-	cbz	w0, .L564
-	.loc 1 1145 0
+.LVL495:
+	.loc 1 1121 0
 	ldrsw	x0, [x21, 72]
-	mov	x3, x19
-	.loc 1 1146 0
-	ldp	x2, x1, [x19, 216]
-	.loc 1 1145 0
+	mov	x4, x19
+	ldp	x1, x2, [x19, 144]
 	add	x0, x19, x0, lsl 3
-	ldr	x1, [x1, 16]
+	ldr	x3, [x19, 168]
 	ldr	x0, [x0, 184]
-	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change_part
-.LVL498:
-	.loc 1 1163 0
+	bl	get_overlay_image
+.LVL496:
+.L565:
+	.loc 1 1169 0
 	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
-	cbnz	w0, .L587
-	.p2align 2
-.L567:
+	.loc 1 1170 0
+	sub	w1, w0, #22
+	.loc 1 1171 0
+	cmp	w0, 0
+	ccmp	w1, 1, 0, ne
+	bhi	.L586
 .LBB1408:
 .LBB1409:
 .LBB1410:
@@ -5918,68 +5901,103 @@ ebc_auto_tast_function:
 	mov	x2, x26
 	mov	w0, 8
 	bl	queue_work_on
-.LVL499:
-	b	.L568
+.LVL497:
+	b	.L569
 	.p2align 3
-.L559:
+.L561:
 .LBE1411:
 .LBE1410:
 .LBE1409:
 .LBE1408:
-	.loc 1 1151 0
+	.loc 1 1118 0
+	sub	w0, w0, #22
+	cmp	w0, 1
+	bls	.L563
+.L560:
+	.loc 1 1157 0
 	ldr	w1, [x19, 56]
-	.loc 1 1152 0
+	.loc 1 1158 0
 	mov	x0, x21
-	.loc 1 1151 0
+	.loc 1 1157 0
 	sub	w1, w1, #1
 	str	w1, [x19, 56]
-	.loc 1 1152 0
+	.loc 1 1158 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.7
-.LVL500:
-	.loc 1 1153 0
+.LVL498:
+	.loc 1 1159 0
 	ldr	w0, [x19, 56]
-	cbz	w0, .L564
-	.loc 1 1155 0
+	cbz	w0, .L565
+	.loc 1 1161 0
 	ldrsw	x0, [x21, 72]
 	mov	x3, x19
-	.loc 1 1156 0
+	.loc 1 1162 0
 	ldp	x2, x1, [x19, 216]
-	.loc 1 1155 0
+	.loc 1 1161 0
 	add	x0, x19, x0, lsl 3
 	ldr	x1, [x1, 16]
 	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
-.LVL501:
-	.loc 1 1159 0
-	b	.L564
+.LVL499:
+	.loc 1 1165 0
+	b	.L565
 	.p2align 3
-.L560:
-	.loc 1 1116 0
+.L563:
+	.loc 1 1130 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
 	bl	flip.isra.7
-.LVL502:
-	.loc 1 1117 0
+.LVL500:
+	.loc 1 1131 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 144]
 	add	x0, x19, x0, lsl 3
 	ldr	x3, [x19, 168]
 	ldr	x0, [x0, 184]
-	bl	get_overlay_image
+	bl	get_auto_image
+.LVL501:
+	.loc 1 1136 0
+	b	.L565
+	.p2align 3
+.L562:
+	.loc 1 1147 0
+	ldr	w1, [x19, 56]
+	.loc 1 1148 0
+	mov	x0, x21
+	.loc 1 1147 0
+	sub	w1, w1, #1
+	str	w1, [x19, 56]
+	.loc 1 1148 0
+	ldr	w1, [x22, 208]
+	bl	flip.isra.7
+.LVL502:
+	.loc 1 1149 0
+	ldr	w0, [x19, 56]
+	cbz	w0, .L565
+	.loc 1 1151 0
+	ldrsw	x0, [x21, 72]
+	mov	x3, x19
+	.loc 1 1152 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1151 0
+	add	x0, x19, x0, lsl 3
+	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 184]
+	ldr	x2, [x2, 16]
+	bl	direct_mode_data_change_part
 .LVL503:
-	.loc 1 1122 0
-	b	.L564
+	.loc 1 1155 0
+	b	.L565
 	.p2align 3
 .L585:
-	.loc 1 1164 0 discriminator 1
+	.loc 1 1172 0 discriminator 1
 	ldr	w0, [x19, 620]
-	cbz	w0, .L568
-	.loc 1 1164 0 is_stmt 0 discriminator 2
+	cbz	w0, .L569
+	.loc 1 1172 0 is_stmt 0 discriminator 2
 	ldr	w0, [x19, 624]
-	cbz	w0, .L568
+	cbz	w0, .L569
 .LBB1415:
 .LBB1414:
 .LBB1413:
@@ -5990,7 +6008,7 @@ ebc_auto_tast_function:
 	mov	w0, 8
 	bl	queue_work_on
 .LVL504:
-	b	.L568
+	b	.L569
 .LBE1412:
 .LBE1413:
 .LBE1414:
@@ -6046,7 +6064,7 @@ ebc_power_set.part.8:
 .LBE1418:
 	.loc 1 202 0
 	ldr	w0, [x19, 624]
-	cbnz	w0, .L594
+	cbnz	w0, .L593
 	.loc 1 206 0
 	ldr	x0, [x19]
 	adrp	x1, .LC22
@@ -6066,7 +6084,7 @@ ebc_power_set.part.8:
 	ret
 .LVL512:
 	.p2align 3
-.L594:
+.L593:
 	.cfi_restore_state
 	.loc 1 203 0
 	str	wzr, [x19, 624]
@@ -6102,7 +6120,7 @@ ebc_power_set.part.8:
 	.type	ebc_suspend, %function
 ebc_suspend:
 .LFB2852:
-	.loc 1 2511 0
+	.loc 1 2533 0
 	.cfi_startproc
 .LVL516:
 	stp	x29, x30, [sp, -32]!
@@ -6120,17 +6138,17 @@ ebc_suspend:
 	ldr	x20, [x0, 184]
 .LBE1423:
 .LBE1422:
-	.loc 1 2515 0
+	.loc 1 2537 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 200]
 .LVL517:
 	cmp	w0, 1
-	beq	.L598
-.L596:
-	.loc 1 2519 0
+	beq	.L597
+.L595:
+	.loc 1 2541 0
 	mov	w0, 1
 	str	w0, [x19, 612]
-	.loc 1 2521 0
+	.loc 1 2543 0
 	ldr	x1, [x20, 16]
 .LBB1424:
 .LBB1425:
@@ -6141,13 +6159,13 @@ ebc_suspend:
 .LVL518:
 .LBE1425:
 .LBE1424:
-	.loc 1 2522 0
+	.loc 1 2544 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC24
 	add	x1, x1, :lo12:.LC24
 	bl	_dev_info
 .LVL519:
-	.loc 1 2525 0
+	.loc 1 2547 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -6159,9 +6177,9 @@ ebc_suspend:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L598:
+.L597:
 	.cfi_restore_state
-	.loc 1 2516 0
+	.loc 1 2538 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
@@ -6176,7 +6194,7 @@ ebc_suspend:
 	mov	x0, x20
 	bl	ebc_power_set.part.8
 .LVL521:
-	b	.L596
+	b	.L595
 .LBE1427:
 .LBE1426:
 	.cfi_endproc
@@ -6187,7 +6205,7 @@ ebc_suspend:
 	.type	ebc_probe, %function
 ebc_probe:
 .LFB2850:
-	.loc 1 2375 0
+	.loc 1 2397 0
 	.cfi_startproc
 .LVL522:
 	stp	x29, x30, [sp, -208]!
@@ -6201,15 +6219,15 @@ ebc_probe:
 	movk	w2, 0x60, lsl 16
 .LBE1579:
 .LBE1578:
-	.loc 1 2375 0
+	.loc 1 2397 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 2376 0
+	.loc 1 2398 0
 	add	x22, x0, 16
-	.loc 1 2375 0
+	.loc 1 2397 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -160
 	.cfi_offset 24, -152
@@ -6225,7 +6243,7 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 2375 0
+	.loc 1 2397 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
@@ -6238,31 +6256,31 @@ ebc_probe:
 .LVL524:
 .LBE1580:
 .LBE1581:
-	.loc 1 2391 0
-	cbz	x0, .L649
-	.loc 1 2395 0
+	.loc 1 2413 0
+	cbz	x0, .L648
+	.loc 1 2417 0
 	adrp	x24, .LANCHOR0
 	mov	x20, x0
-	.loc 1 2397 0
+	.loc 1 2419 0
 	adrp	x1, .LC25
 	mov	w2, 0
-	.loc 1 2395 0
+	.loc 1 2417 0
 	str	x0, [x24, #:lo12:.LANCHOR0]
-	.loc 1 2397 0
+	.loc 1 2419 0
 	add	x1, x1, :lo12:.LC25
 	ldr	x0, [x22, 752]
-	.loc 1 2394 0
+	.loc 1 2416 0
 	str	x22, [x20]
-	.loc 1 2397 0
+	.loc 1 2419 0
 	bl	of_parse_phandle
 .LVL525:
-	.loc 1 2398 0
-	cbz	x0, .L694
-	.loc 1 2403 0
+	.loc 1 2420 0
+	cbz	x0, .L693
+	.loc 1 2425 0
 	bl	of_find_device_by_node
 .LVL526:
-	.loc 1 2405 0
-	cbz	x0, .L603
+	.loc 1 2427 0
+	cbz	x0, .L602
 .LBB1582:
 .LBB1583:
 .LBB1584:
@@ -6272,15 +6290,15 @@ ebc_probe:
 .LBE1584:
 .LBE1583:
 .LBE1582:
-	.loc 1 2408 0
+	.loc 1 2430 0
 	str	x0, [x20, 8]
-	.loc 1 2409 0
-	cbz	x0, .L603
-	.loc 1 2411 0
+	.loc 1 2431 0
+	cbz	x0, .L602
+	.loc 1 2433 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 2413 0
+	.loc 1 2435 0
 	add	x2, x29, 96
 	adrp	x1, .LC27
 	add	x1, x1, :lo12:.LC27
@@ -6289,28 +6307,28 @@ ebc_probe:
 .LVL528:
 	mov	x21, x0
 .LVL529:
-	.loc 1 2414 0
+	.loc 1 2436 0
 	ldrsw	x0, [x29, 96]
 .LVL530:
 	lsr	x0, x0, 2
 .LVL531:
 	str	w0, [x29, 96]
 .LVL532:
-	.loc 1 2415 0
+	.loc 1 2437 0
 	cmp	w0, 0
-	beq	.L604
-	.loc 1 2420 0 discriminator 1
+	beq	.L603
+	.loc 1 2442 0 discriminator 1
 	mov	w19, 0
 .LVL533:
-	bgt	.L678
-	b	.L606
+	bgt	.L677
+	b	.L605
 	.p2align 3
-.L607:
-	.loc 1 2428 0
+.L606:
+	.loc 1 2450 0
 	bl	of_find_i2c_device_by_node
 .LVL534:
-	.loc 1 2430 0
-	cbz	x0, .L695
+	.loc 1 2452 0
+	cbz	x0, .L694
 .LBB1585:
 .LBB1586:
 .LBB1587:
@@ -6320,43 +6338,43 @@ ebc_probe:
 .LBE1587:
 .LBE1586:
 .LBE1585:
-	.loc 1 2435 0
+	.loc 1 2457 0
 	str	x0, [x20, 16]
-	.loc 1 2436 0
-	cbnz	x0, .L696
-	.loc 1 2420 0 discriminator 2
+	.loc 1 2458 0
+	cbnz	x0, .L695
+	.loc 1 2442 0 discriminator 2
 	ldr	w0, [x29, 96]
 	add	w19, w19, 1
 .LVL536:
 	cmp	w0, w19
-	ble	.L611
-.L678:
+	ble	.L610
+.L677:
 	ldr	w0, [x21], 4
-	.loc 1 2422 0
+	.loc 1 2444 0
 	rev	w0, w0
 	bl	of_find_node_by_phandle
 .LVL537:
-	.loc 1 2423 0
-	cbnz	x0, .L607
-	.loc 1 2424 0
+	.loc 1 2445 0
+	cbnz	x0, .L606
+	.loc 1 2446 0
 	adrp	x1, .LC29
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC29
-	.loc 1 2425 0
+	.loc 1 2447 0
 	mov	w25, -19
-	.loc 1 2424 0
+	.loc 1 2446 0
 	bl	_dev_err
 .LVL538:
 	.p2align 2
-.L599:
-	.loc 1 2501 0
+.L598:
+	.loc 1 2523 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w25
 .LVL539:
 	ldr	x2, [x29, 200]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L697
+	cbnz	x1, .L696
 	ldp	x19, x20, [sp, 16]
 .LVL540:
 	ldp	x21, x22, [sp, 32]
@@ -6385,26 +6403,26 @@ ebc_probe:
 	ret
 .LVL545:
 	.p2align 3
-.L696:
+.L695:
 	.cfi_restore_state
-	.loc 1 2437 0
+	.loc 1 2459 0
 	adrp	x1, .LC31
 	mov	w2, w19
 	add	x1, x1, :lo12:.LC31
 	mov	x0, x22
 	bl	_dev_info
 .LVL546:
-.L606:
-	.loc 1 2442 0
+.L605:
+	.loc 1 2464 0
 	ldr	x0, [x20, 16]
-	cbz	x0, .L611
-	.loc 1 2448 0
+	cbz	x0, .L610
+	.loc 1 2470 0
 	add	x19, x20, 184
 .LVL547:
-	.loc 1 2450 0
+	.loc 1 2472 0
 	add	x21, x20, 24
 .LVL548:
-	.loc 1 2448 0
+	.loc 1 2470 0
 	str	x22, [x19, 104]
 .LBB1588:
 .LBB1589:
@@ -6419,7 +6437,7 @@ ebc_probe:
 .LBE1590:
 .LBE1589:
 .LBE1588:
-	.loc 1 2450 0
+	.loc 1 2472 0
 	str	x22, [x20, 24]
 .LBB1662:
 .LBB1659:
@@ -6433,7 +6451,7 @@ ebc_probe:
 .LBE1599:
 .LBE1659:
 .LBE1662:
-	.loc 1 2451 0
+	.loc 1 2473 0
 	ldr	x2, [x20, 8]
 .LBB1663:
 .LBB1660:
@@ -6447,7 +6465,7 @@ ebc_probe:
 .LBE1600:
 .LBE1660:
 .LBE1663:
-	.loc 1 2452 0
+	.loc 1 2474 0
 	stp	x2, x0, [x21, 8]
 .LBB1664:
 .LBB1661:
@@ -6461,7 +6479,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL549:
 	.loc 14 501 0
-	tbnz	w0, #31, .L613
+	tbnz	w0, #31, .L612
 .LBE1595:
 .LBE1598:
 .LBE1601:
@@ -6478,7 +6496,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL550:
 	.loc 14 501 0
-	tbnz	w0, #31, .L613
+	tbnz	w0, #31, .L612
 .LBE1604:
 .LBE1603:
 .LBE1602:
@@ -6495,7 +6513,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL551:
 	.loc 14 501 0
-	tbnz	w0, #31, .L613
+	tbnz	w0, #31, .L612
 .LBE1607:
 .LBE1606:
 .LBE1605:
@@ -6512,7 +6530,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL552:
 	.loc 14 501 0
-	tbnz	w0, #31, .L613
+	tbnz	w0, #31, .L612
 .LBE1610:
 .LBE1609:
 .LBE1608:
@@ -6529,7 +6547,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL553:
 	.loc 14 501 0
-	tbnz	w0, #31, .L613
+	tbnz	w0, #31, .L612
 .LBE1613:
 .LBE1612:
 .LBE1611:
@@ -6546,7 +6564,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL554:
 	.loc 14 501 0
-	tbnz	w0, #31, .L613
+	tbnz	w0, #31, .L612
 .LBE1616:
 .LBE1615:
 .LBE1614:
@@ -6563,7 +6581,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL555:
 	.loc 14 501 0
-	tbnz	w0, #31, .L613
+	tbnz	w0, #31, .L612
 .LBE1619:
 .LBE1618:
 .LBE1617:
@@ -6580,7 +6598,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL556:
 	.loc 14 501 0
-	tbnz	w0, #31, .L613
+	tbnz	w0, #31, .L612
 .LBE1622:
 .LBE1621:
 .LBE1620:
@@ -6597,7 +6615,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL557:
 	.loc 14 501 0
-	tbnz	w0, #31, .L613
+	tbnz	w0, #31, .L612
 .LBE1625:
 .LBE1624:
 .LBE1623:
@@ -6614,7 +6632,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL558:
 	.loc 14 501 0
-	tbnz	w0, #31, .L613
+	tbnz	w0, #31, .L612
 .LBE1628:
 .LBE1627:
 .LBE1626:
@@ -6631,7 +6649,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL559:
 	.loc 14 501 0
-	tbnz	w0, #31, .L613
+	tbnz	w0, #31, .L612
 .LBE1631:
 .LBE1630:
 .LBE1629:
@@ -6648,7 +6666,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL560:
 	.loc 14 501 0
-	tbnz	w0, #31, .L613
+	tbnz	w0, #31, .L612
 .LBE1634:
 .LBE1633:
 .LBE1632:
@@ -6665,7 +6683,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL561:
 	.loc 14 501 0
-	tbnz	w0, #31, .L613
+	tbnz	w0, #31, .L612
 .LBE1637:
 .LBE1636:
 .LBE1635:
@@ -6682,7 +6700,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL562:
 	.loc 14 501 0
-	tbnz	w0, #31, .L613
+	tbnz	w0, #31, .L612
 .LBE1640:
 .LBE1639:
 .LBE1638:
@@ -6699,7 +6717,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL563:
 	.loc 14 501 0
-	tbnz	w0, #31, .L613
+	tbnz	w0, #31, .L612
 .LBE1643:
 .LBE1642:
 .LBE1641:
@@ -6716,13 +6734,13 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL564:
 	.loc 14 501 0
-	tbz	w0, #31, .L639
+	tbz	w0, #31, .L638
 .LBE1646:
 .LBE1645:
 .LBE1644:
-	.loc 1 1716 0
+	.loc 1 1738 0
 	str	wzr, [x21, 148]
-.L639:
+.L638:
 .LBB1647:
 .LBB1648:
 .LBB1649:
@@ -6736,13 +6754,13 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL565:
 	.loc 14 501 0
-	tbz	w0, #31, .L640
+	tbz	w0, #31, .L639
 .LBE1649:
 .LBE1648:
 .LBE1647:
-	.loc 1 1719 0
+	.loc 1 1741 0
 	str	wzr, [x21, 152]
-.L640:
+.L639:
 .LBB1650:
 .LBB1651:
 .LBB1652:
@@ -6756,13 +6774,13 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL566:
 	.loc 14 501 0
-	tbz	w0, #31, .L641
+	tbz	w0, #31, .L640
 .LBE1652:
 .LBE1651:
 .LBE1650:
-	.loc 1 1722 0
+	.loc 1 1744 0
 	str	wzr, [x21, 156]
-.L641:
+.L640:
 .LBB1653:
 .LBB1654:
 .LBB1655:
@@ -6776,13 +6794,13 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL567:
 	.loc 14 501 0
-	tbz	w0, #31, .L642
+	tbz	w0, #31, .L641
 .LBE1655:
 .LBE1654:
 .LBE1653:
-	.loc 1 1725 0
+	.loc 1 1747 0
 	str	wzr, [x21, 92]
-.L642:
+.L641:
 .LBB1656:
 .LBB1657:
 .LBB1658:
@@ -6796,66 +6814,66 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL568:
 	.loc 14 501 0
-	tbz	w0, #31, .L643
+	tbz	w0, #31, .L642
 .LBE1658:
 .LBE1657:
 .LBE1656:
-	.loc 1 1728 0
+	.loc 1 1750 0
 	str	wzr, [x21, 96]
-.L643:
+.L642:
 .LBE1661:
 .LBE1664:
-	.loc 1 2460 0
+	.loc 1 2482 0
 	ldr	w0, [x21, 88]
 .LBB1665:
 .LBB1666:
-	.loc 1 2177 0
+	.loc 1 2199 0
 	mov	w2, 0
 .LBE1666:
 .LBE1665:
-	.loc 1 2460 0
+	.loc 1 2482 0
 	str	w0, [x19, 68]
-	.loc 1 2461 0
+	.loc 1 2483 0
 	ldr	w1, [x21, 84]
 	str	w1, [x19, 72]
-	.loc 1 2464 0
+	.loc 1 2486 0
 	tst	x1, 15
-	.loc 1 2462 0
+	.loc 1 2484 0
 	mul	w0, w0, w1
-	.loc 1 2464 0
+	.loc 1 2486 0
 	cset	w1, eq
 	str	w1, [x19, 88]
 .LBB1690:
 .LBB1685:
-	.loc 1 2177 0
+	.loc 1 2199 0
 	adrp	x1, .LC38
 	add	x1, x1, :lo12:.LC38
 .LBE1685:
 .LBE1690:
-	.loc 1 2462 0
+	.loc 1 2484 0
 	lsr	w3, w0, 1
-	.loc 1 2463 0
+	.loc 1 2485 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x19, 20]
 .LBB1691:
 .LBB1686:
-	.loc 1 2168 0
+	.loc 1 2190 0
 	ldr	x26, [x20]
 .LVL569:
-	.loc 1 2177 0
+	.loc 1 2199 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL570:
-	.loc 1 2178 0
-	cbz	x0, .L650
-	.loc 1 2181 0
+	.loc 1 2200 0
+	cbz	x0, .L649
+	.loc 1 2203 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL571:
 	mov	w25, w0
-	.loc 1 2183 0
-	cbnz	w0, .L698
+	.loc 1 2205 0
+	cbnz	w0, .L697
 .LBB1667:
 .LBB1668:
 	.file 15 "./include/linux/ioport.h"
@@ -6863,9 +6881,9 @@ ebc_probe:
 	ldp	x1, x2, [x29, 104]
 .LBE1668:
 .LBE1667:
-	.loc 1 2188 0
+	.loc 1 2210 0
 	str	x1, [x20, 184]
-	.loc 1 2191 0
+	.loc 1 2213 0
 	mov	x3, 1
 	mov	x0, x26
 .LBB1670:
@@ -6875,16 +6893,16 @@ ebc_probe:
 	sub	x2, x2, x1
 .LBE1669:
 .LBE1670:
-	.loc 1 2189 0
+	.loc 1 2211 0
 	str	w2, [x19, 16]
-	.loc 1 2191 0
+	.loc 1 2213 0
 	sxtw	x2, w2
 	bl	devm_memremap
 .LVL572:
 	str	x0, [x19, 8]
-	.loc 1 2193 0
-	cbz	x0, .L621
-	.loc 1 2201 0
+	.loc 1 2215 0
+	cbz	x0, .L620
+	.loc 1 2223 0
 	mov	x1, x0
 	ldr	w2, [x19, 16]
 	ldr	x0, [x20, 184]
@@ -6892,11 +6910,11 @@ ebc_probe:
 	mov	w3, 2097152
 	bl	ebc_buf_init
 .LVL573:
-	.loc 1 2202 0
-	cbnz	w0, .L621
-	.loc 1 2207 0
+	.loc 1 2224 0
+	cbnz	w0, .L620
+	.loc 1 2229 0
 	ldr	x0, [x19, 8]
-	.loc 1 2208 0
+	.loc 1 2230 0
 	mov	x5, 1048576
 	str	x5, [x21, 40]
 .LBB1671:
@@ -6905,13 +6923,13 @@ ebc_probe:
 	mov	w2, 32960
 .LBE1672:
 .LBE1671:
-	.loc 1 2207 0
+	.loc 1 2229 0
 	add	x6, x0, 10485760
 	str	x6, [x21, 24]
 	add	x4, x0, 11534336
-	.loc 1 2213 0
+	.loc 1 2235 0
 	add	x1, x0, 12582912
-	.loc 1 2209 0
+	.loc 1 2231 0
 	ldr	x3, [x20, 184]
 .LBB1676:
 .LBB1673:
@@ -6920,18 +6938,18 @@ ebc_probe:
 	mov	x0, x26
 .LBE1673:
 .LBE1676:
-	.loc 1 2209 0
+	.loc 1 2231 0
 	add	x7, x3, 10485760
 	str	x7, [x21, 32]
-	.loc 1 2210 0
+	.loc 1 2232 0
 	str	x6, [x19, 184]
-	.loc 1 2209 0
+	.loc 1 2231 0
 	add	x3, x3, 11534336
-	.loc 1 2208 0
+	.loc 1 2230 0
 	str	x5, [x21, 64]
-	.loc 1 2209 0
+	.loc 1 2231 0
 	stp	x4, x3, [x21, 48]
-	.loc 1 2213 0
+	.loc 1 2235 0
 	str	x1, [x19, 128]
 .LBB1677:
 .LBB1674:
@@ -6939,7 +6957,7 @@ ebc_probe:
 	ldrsw	x1, [x19, 20]
 .LBE1674:
 .LBE1677:
-	.loc 1 2210 0
+	.loc 1 2232 0
 	str	x4, [x19, 192]
 .LBB1678:
 .LBB1675:
@@ -6948,10 +6966,10 @@ ebc_probe:
 .LVL574:
 .LBE1675:
 .LBE1678:
-	.loc 1 2216 0
+	.loc 1 2238 0
 	str	x0, [x19, 144]
-	.loc 1 2217 0
-	cbz	x0, .L621
+	.loc 1 2239 0
+	cbz	x0, .L620
 .LBB1679:
 .LBB1680:
 	.loc 2 711 0
@@ -6963,10 +6981,10 @@ ebc_probe:
 .LVL575:
 .LBE1680:
 .LBE1679:
-	.loc 1 2219 0
+	.loc 1 2241 0
 	str	x0, [x19, 152]
-	.loc 1 2220 0
-	cbz	x0, .L621
+	.loc 1 2242 0
+	cbz	x0, .L620
 .LBB1681:
 .LBB1682:
 	.loc 2 711 0
@@ -6978,11 +6996,11 @@ ebc_probe:
 .LVL576:
 .LBE1682:
 .LBE1681:
-	.loc 1 2222 0
+	.loc 1 2244 0
 	str	x0, [x19, 160]
-	.loc 1 2223 0
-	cbz	x0, .L621
-	.loc 1 2230 0
+	.loc 1 2245 0
+	cbz	x0, .L620
+	.loc 1 2252 0
 	ldp	w1, w0, [x21, 84]
 .LBB1683:
 .LBB1684:
@@ -6995,17 +7013,17 @@ ebc_probe:
 .LVL577:
 .LBE1684:
 .LBE1683:
-	.loc 1 2230 0
+	.loc 1 2252 0
 	str	x0, [x19, 168]
-	.loc 1 2231 0
-	cbz	x0, .L621
-	.loc 1 2233 0
+	.loc 1 2253 0
+	cbz	x0, .L620
+	.loc 1 2255 0
 	ldp	w2, w1, [x21, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
 .LVL578:
-	.loc 1 2234 0
+	.loc 1 2256 0
 	ldrsw	x2, [x19, 20]
 	mov	w1, 255
 	ldr	x0, [x19, 160]
@@ -7015,107 +7033,107 @@ ebc_probe:
 .LBE1691:
 .LBB1692:
 .LBB1693:
-	.loc 1 2125 0
+	.loc 1 2147 0
 	ldr	x26, [x19, 104]
 .LVL580:
-	.loc 1 2131 0
+	.loc 1 2153 0
 	adrp	x1, .LC40
 	mov	w2, 0
 	add	x1, x1, :lo12:.LC40
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL581:
-	.loc 1 2132 0
-	cbz	x0, .L651
-	.loc 1 2135 0
+	.loc 1 2154 0
+	cbz	x0, .L650
+	.loc 1 2157 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL582:
 	mov	w25, w0
-	.loc 1 2137 0
-	cbz	w0, .L699
-.L622:
+	.loc 1 2159 0
+	cbz	w0, .L698
+.L621:
 .LBE1693:
 .LBE1692:
-	.loc 1 2476 0
+	.loc 1 2498 0
 	adrp	x1, .LC73
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC73
 	bl	_dev_err
 .LVL583:
-	.loc 1 2477 0
-	b	.L599
+	.loc 1 2499 0
+	b	.L598
 .LVL584:
 	.p2align 3
-.L613:
-	.loc 1 2458 0
+.L612:
+	.loc 1 2480 0
 	mov	w25, -22
-	.loc 1 2457 0
+	.loc 1 2479 0
 	adrp	x1, .LC77
 	mov	w2, w25
 	add	x1, x1, :lo12:.LC77
 	mov	x0, x22
 	bl	_dev_err
 .LVL585:
-	.loc 1 2458 0
-	b	.L599
+	.loc 1 2480 0
+	b	.L598
 .LVL586:
 	.p2align 3
-.L695:
-	.loc 1 2431 0
+.L694:
+	.loc 1 2453 0
 	adrp	x1, .LC30
 	mov	x0, x22
 .LVL587:
 	add	x1, x1, :lo12:.LC30
-	.loc 1 2432 0
+	.loc 1 2454 0
 	mov	w25, -19
-	.loc 1 2431 0
+	.loc 1 2453 0
 	bl	_dev_err
 .LVL588:
-	.loc 1 2432 0
-	b	.L599
+	.loc 1 2454 0
+	b	.L598
 .LVL589:
 	.p2align 3
-.L611:
-	.loc 1 2443 0
+.L610:
+	.loc 1 2465 0
 	adrp	x1, .LC32
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC32
-	.loc 1 2444 0
+	.loc 1 2466 0
 	mov	w25, -517
-	.loc 1 2443 0
+	.loc 1 2465 0
 	bl	_dev_err
 .LVL590:
-	.loc 1 2444 0
-	b	.L599
+	.loc 1 2466 0
+	b	.L598
 .LVL591:
 	.p2align 3
-.L698:
+.L697:
 .LBB1702:
 .LBB1687:
-	.loc 1 2184 0
+	.loc 1 2206 0
 	adrp	x1, .LC39
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC39
 	bl	_dev_err
 .LVL592:
-.L618:
+.L617:
 .LBE1687:
 .LBE1702:
-	.loc 1 2469 0
+	.loc 1 2491 0
 	adrp	x1, .LC72
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC72
 	bl	_dev_err
 .LVL593:
-	.loc 1 2470 0
-	b	.L599
+	.loc 1 2492 0
+	b	.L598
 .LVL594:
-.L699:
+.L698:
 .LBB1703:
 .LBB1698:
-	.loc 1 2146 0
+	.loc 1 2168 0
 	mov	x0, x26
 	mov	x3, 1
 .LBB1694:
@@ -7125,7 +7143,7 @@ ebc_probe:
 .LVL595:
 .LBE1695:
 .LBE1694:
-	.loc 1 2143 0
+	.loc 1 2165 0
 	str	x1, [x19, 32]
 .LBB1697:
 .LBB1696:
@@ -7134,30 +7152,30 @@ ebc_probe:
 	sub	x26, x26, x1
 .LBE1696:
 .LBE1697:
-	.loc 1 2144 0
+	.loc 1 2166 0
 	str	w26, [x19, 40]
-	.loc 1 2146 0
+	.loc 1 2168 0
 	sxtw	x2, w26
 	bl	devm_memremap
 .LVL596:
 	str	x0, [x19, 208]
-	.loc 1 2148 0
-	cbz	x0, .L700
-	.loc 1 2153 0
+	.loc 1 2170 0
+	cbz	x0, .L699
+	.loc 1 2175 0
 	bl	epd_lut_from_mem_init
 .LVL597:
-	.loc 1 2154 0
-	tbnz	w0, #31, .L701
-.L624:
+	.loc 1 2176 0
+	tbnz	w0, #31, .L700
+.L623:
 .LBE1698:
 .LBE1703:
 .LBB1704:
 .LBB1705:
-	.loc 1 2243 0
+	.loc 1 2265 0
 	add	x0, x20, 752
 	mov	x1, 68719476704
 	str	x1, [x19, 560]
-	.loc 1 2245 0
+	.loc 1 2267 0
 	add	x24, x24, :lo12:.LANCHOR0
 .LBB1706:
 .LBB1707:
@@ -7171,7 +7189,7 @@ ebc_probe:
 .LBE1708:
 .LBE1707:
 .LBE1706:
-	.loc 1 2241 0
+	.loc 1 2263 0
 	mov	w26, 99
 .LBB1712:
 .LBB1711:
@@ -7180,32 +7198,32 @@ ebc_probe:
 	str	x0, [x0, 8]
 .LBE1711:
 .LBE1712:
-	.loc 1 2243 0
+	.loc 1 2265 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x19, 584]
-	.loc 1 2245 0
+	.loc 1 2267 0
 	adrp	x3, .LC74
 	mov	w2, -1
 	add	x3, x3, :lo12:.LC74
 	mov	x1, x19
 	adrp	x0, ebc_auto_tast_function
-	.loc 1 2241 0
+	.loc 1 2263 0
 	str	w26, [x29, 104]
-	.loc 1 2245 0
+	.loc 1 2267 0
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
 .LVL598:
 	str	x0, [x24, 8]
-	.loc 1 2246 0
+	.loc 1 2268 0
 	cmn	x0, #4096
-	bhi	.L702
-	.loc 1 2250 0
+	bhi	.L701
+	.loc 1 2272 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
 .LVL599:
-	.loc 1 2251 0
+	.loc 1 2273 0
 	ldr	x2, [x24, 8]
 .LBB1713:
 .LBB1714:
@@ -7247,7 +7265,7 @@ ebc_probe:
 .LBE1714:
 .LBE1713:
 .LBB1715:
-	.loc 1 2254 0
+	.loc 1 2276 0
 	adrp	x3, .LC45
 	adrp	x0, ebc_thread
 .LVL603:
@@ -7256,27 +7274,27 @@ ebc_probe:
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x19
 .LBE1715:
-	.loc 1 2253 0
+	.loc 1 2275 0
 	str	w26, [x29, 104]
 .LBB1716:
-	.loc 1 2254 0
+	.loc 1 2276 0
 	bl	kthread_create_on_node
 .LVL604:
 	mov	x24, x0
 .LVL605:
 	cmn	x0, #4096
-	bhi	.L626
+	bhi	.L625
 	bl	wake_up_process
 .LVL606:
 .LBE1716:
 	str	x24, [x19, 136]
-	.loc 1 2259 0
+	.loc 1 2281 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x24
 	bl	sched_setscheduler_nocheck
 .LVL607:
-	.loc 1 2260 0
+	.loc 1 2282 0
 	ldr	x2, [x19, 136]
 .LBB1717:
 .LBB1718:
@@ -7320,7 +7338,7 @@ ebc_probe:
 .LBE1704:
 .LBB1721:
 .LBB1722:
-	.loc 1 2269 0
+	.loc 1 2291 0
 	mov	w0, -1
 .LVL611:
 	str	w0, [x19, 64]
@@ -7331,9 +7349,9 @@ ebc_probe:
 .LVL612:
 .LBE1724:
 .LBE1723:
-	.loc 1 2273 0
+	.loc 1 2295 0
 	str	wzr, [x19, 44]
-	.loc 1 2272 0
+	.loc 1 2294 0
 	str	wzr, [x19, 96]
 .LBB1729:
 .LBB1725:
@@ -7341,7 +7359,7 @@ ebc_probe:
 	adrp	x1, .LC46
 .LBE1725:
 .LBE1729:
-	.loc 1 2268 0
+	.loc 1 2290 0
 	str	wzr, [x19, 200]
 .LBB1730:
 .LBB1726:
@@ -7349,14 +7367,14 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC46
 .LBE1726:
 .LBE1730:
-	.loc 1 2270 0
+	.loc 1 2292 0
 	str	wzr, [x19, 608]
-	.loc 1 2280 0
+	.loc 1 2302 0
 	add	x24, x20, 632
 .LVL613:
-	.loc 1 2271 0
+	.loc 1 2293 0
 	str	wzr, [x19, 612]
-	.loc 1 2281 0
+	.loc 1 2303 0
 	adrp	x26, jiffies
 .LBB1731:
 .LBB1727:
@@ -7364,7 +7382,7 @@ ebc_probe:
 	stp	xzr, xzr, [x0]
 .LBE1727:
 .LBE1731:
-	.loc 1 2281 0
+	.loc 1 2303 0
 	mov	x27, 268435455
 .LBB1732:
 .LBB1728:
@@ -7388,9 +7406,9 @@ ebc_probe:
 .LVL614:
 .LBE1728:
 .LBE1732:
-	.loc 1 2277 0
+	.loc 1 2299 0
 	str	wzr, [x19, 440]
-	.loc 1 2280 0
+	.loc 1 2302 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -7399,16 +7417,16 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
 .LVL615:
-	.loc 1 2281 0
+	.loc 1 2303 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
-	.loc 1 2284 0
+	.loc 1 2306 0
 	add	x24, x20, 688
-	.loc 1 2281 0
+	.loc 1 2303 0
 	add	x1, x1, x27
 	bl	mod_timer
 .LVL616:
-	.loc 1 2284 0
+	.loc 1 2306 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -7417,7 +7435,7 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
 .LVL617:
-	.loc 1 2285 0
+	.loc 1 2307 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
 	add	x1, x1, x27
@@ -7427,99 +7445,99 @@ ebc_probe:
 .LBE1721:
 .LBB1733:
 .LBB1734:
-	.loc 1 2295 0
+	.loc 1 2317 0
 	adrp	x0, saved_command_line
 	adrp	x1, .LC47
-	.loc 1 2292 0
+	.loc 1 2314 0
 	stp	wzr, wzr, [x29, 100]
 .LVL619:
-	.loc 1 2295 0
+	.loc 1 2317 0
 	add	x1, x1, :lo12:.LC47
 	ldr	x24, [x0, #:lo12:saved_command_line]
 	mov	x0, x24
 	bl	strstr
 .LVL620:
-	.loc 1 2296 0
+	.loc 1 2318 0
 	adrp	x1, .LC48
-	.loc 1 2295 0
+	.loc 1 2317 0
 	mov	x26, x0
 .LVL621:
-	.loc 1 2296 0
+	.loc 1 2318 0
 	add	x1, x1, :lo12:.LC48
 	mov	x0, x24
 	bl	strstr
 .LVL622:
 	mov	x28, x0
 .LVL623:
-	.loc 1 2301 0
-	cbz	x26, .L627
-	.loc 1 2302 0
+	.loc 1 2323 0
+	cbz	x26, .L626
+	.loc 1 2324 0
 	add	x2, x29, 100
 	adrp	x1, .LC49
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC49
 	bl	sscanf
 .LVL624:
-	.loc 1 2303 0
+	.loc 1 2325 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
-	bls	.L703
-.L627:
-	.loc 1 2315 0
+	bls	.L702
+.L626:
+	.loc 1 2337 0
 	mov	w24, 0
 .LVL625:
 	mov	x27, 0
 .LVL626:
-	.loc 1 2299 0
+	.loc 1 2321 0
 	mov	x26, 0
 .LVL627:
-	.loc 1 2315 0
-	cbz	x28, .L647
+	.loc 1 2337 0
+	cbz	x28, .L646
 .LVL628:
-.L646:
-	.loc 1 2316 0
+.L645:
+	.loc 1 2338 0
 	add	x2, x29, 104
 	mov	x0, x28
 	adrp	x1, .LC52
 	add	x1, x1, :lo12:.LC52
 	bl	sscanf
 .LVL629:
-	.loc 1 2294 0
+	.loc 1 2316 0
 	mov	w28, 0
 .LVL630:
-	.loc 1 2317 0
+	.loc 1 2339 0
 	ldr	w2, [x29, 104]
-	.loc 1 2299 0
+	.loc 1 2321 0
 	mov	x26, 0
 .LVL631:
-	.loc 1 2317 0
+	.loc 1 2339 0
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
-	bls	.L704
-.L631:
-	.loc 1 2329 0
-	cbnz	w24, .L630
+	bls	.L703
+.L630:
+	.loc 1 2351 0
+	cbnz	w24, .L629
 .LVL632:
-.L647:
-	.loc 1 2330 0
+.L646:
+	.loc 1 2352 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC55
 	add	x1, x1, :lo12:.LC55
 	bl	_dev_info
 .LVL633:
-	.loc 1 2331 0
+	.loc 1 2353 0
 	ldr	x0, [x20, 16]
 	bl	ebc_pmic_verity_vcom
 .LVL634:
 .LBB1735:
 .LBB1736:
-	.loc 1 1636 0
+	.loc 1 1658 0
 	bl	ebc_empty_buf_get
 .LVL635:
 	mov	x24, x0
 .LVL636:
-	.loc 1 1637 0
+	.loc 1 1659 0
 	ldp	w2, w0, [x20, 108]
 	mov	w1, 255
 	mul	w2, w2, w0
@@ -7527,47 +7545,47 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memset
 .LVL637:
-	.loc 1 1640 0
+	.loc 1 1662 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 1638 0
+	.loc 1 1660 0
 	mov	w0, 17
 	str	w0, [x24, 40]
-	.loc 1 1643 0
+	.loc 1 1665 0
 	mov	x0, x24
-	.loc 1 1641 0
+	.loc 1 1663 0
 	ldr	w1, [x20, 108]
 	str	w1, [x24, 56]
-	.loc 1 1642 0
+	.loc 1 1664 0
 	ldr	w1, [x20, 112]
 	str	w1, [x24, 60]
-	.loc 1 1643 0
+	.loc 1 1665 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL638:
-.L633:
+.L632:
 .LBE1736:
 .LBE1735:
-	.loc 1 2348 0
-	cbnz	w28, .L705
-.L635:
-	.loc 1 2361 0
+	.loc 1 2370 0
+	cbnz	w28, .L704
+.L634:
+	.loc 1 2383 0
 	ldr	w0, [x19, 96]
 	adrp	x21, .LANCHOR1
-	cbz	w0, .L706
-.L637:
-	.loc 1 2366 0
-	cbz	x27, .L638
-	.loc 1 2367 0
+	cbz	w0, .L705
+.L636:
+	.loc 1 2388 0
+	cbz	x27, .L637
+	.loc 1 2389 0
 	mov	x0, x27
 	bl	kfree
 .LVL639:
-.L638:
-	.loc 1 2368 0
-	cbz	x26, .L629
-	.loc 1 2369 0
+.L637:
+	.loc 1 2390 0
+	cbz	x26, .L628
+	.loc 1 2391 0
 	mov	x0, x26
 	bl	kfree
 .LVL640:
-.L629:
+.L628:
 .LBE1734:
 .LBE1733:
 .LBB1747:
@@ -7580,56 +7598,56 @@ ebc_probe:
 .LBE1747:
 .LBB1750:
 .LBB1751:
-	.loc 1 2108 0
+	.loc 1 2130 0
 	add	x21, x21, :lo12:.LANCHOR1
 	add	x0, x21, 224
-	.loc 1 2109 0
+	.loc 1 2131 0
 	add	x22, x21, 512
-	.loc 1 2108 0
+	.loc 1 2130 0
 	bl	misc_register
 .LVL641:
-	.loc 1 2109 0
+	.loc 1 2131 0
 	add	x0, x21, 400
 	bl	misc_register
 .LVL642:
-	.loc 1 2111 0
+	.loc 1 2133 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 480
 	bl	device_create_file
 .LVL643:
-	.loc 1 2112 0
+	.loc 1 2134 0
 	ldr	x0, [x20, 288]
 	mov	x1, x22
 	bl	device_create_file
 .LVL644:
-	.loc 1 2113 0
+	.loc 1 2135 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 544
 	bl	device_create_file
 .LVL645:
-	.loc 1 2114 0
+	.loc 1 2136 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 576
 	bl	device_create_file
 .LVL646:
-	.loc 1 2115 0
+	.loc 1 2137 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 608
 	bl	device_create_file
 .LVL647:
-	.loc 1 2116 0
+	.loc 1 2138 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 640
 	bl	device_create_file
 .LVL648:
-	.loc 1 2117 0
+	.loc 1 2139 0
 	ldr	x0, [x20, 288]
 	add	x1, x21, 672
 	bl	device_create_file
 .LVL649:
 .LBE1751:
 .LBE1750:
-	.loc 1 2498 0
+	.loc 1 2520 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LC16
 	adrp	x1, .LC56
@@ -7637,31 +7655,31 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC56
 	bl	_dev_info
 .LVL650:
-	.loc 1 2500 0
-	b	.L599
+	.loc 1 2522 0
+	b	.L598
 .LVL651:
-.L706:
+.L705:
 .LBB1752:
 .LBB1743:
-	.loc 1 2362 0
+	.loc 1 2384 0
 	mov	w2, 1
 	str	w2, [x19, 96]
-	.loc 1 2363 0
+	.loc 1 2385 0
 	add	x0, x21, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
 .LVL652:
-	b	.L637
+	b	.L636
 .LVL653:
-.L703:
-	.loc 1 2305 0
+.L702:
+	.loc 1 2327 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC50
 	add	x1, x1, :lo12:.LC50
 	bl	_dev_info
 .LVL654:
-	.loc 1 2306 0
+	.loc 1 2328 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
 .LBB1737:
@@ -7679,9 +7697,9 @@ ebc_probe:
 .LBE1739:
 .LBE1738:
 .LBE1737:
-	.loc 1 2307 0
-	cbz	x0, .L707
-	.loc 1 2311 0
+	.loc 1 2329 0
+	cbz	x0, .L706
+	.loc 1 2333 0
 	ldp	w2, w1, [x21, 84]
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
@@ -7694,23 +7712,23 @@ ebc_probe:
 	add	x1, x3, x1
 	bl	memcpy
 .LVL659:
-	.loc 1 2315 0
-	cbnz	x28, .L708
-	.loc 1 2294 0
+	.loc 1 2337 0
+	cbnz	x28, .L707
+	.loc 1 2316 0
 	mov	w28, 0
 .LVL660:
-	.loc 1 2299 0
+	.loc 1 2321 0
 	mov	x26, 0
 .LVL661:
-.L630:
-	.loc 1 2336 0
+.L629:
+	.loc 1 2358 0
 	bl	ebc_empty_buf_get
 .LVL662:
 	mov	x24, x0
 .LVL663:
-	.loc 1 2337 0
-	cbz	x0, .L633
-	.loc 1 2338 0
+	.loc 1 2359 0
+	cbz	x0, .L632
+	.loc 1 2360 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
@@ -7718,32 +7736,32 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL664:
-	.loc 1 2341 0
+	.loc 1 2363 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2339 0
+	.loc 1 2361 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2344 0
+	.loc 1 2366 0
 	mov	x0, x24
-	.loc 1 2342 0
+	.loc 1 2364 0
 	ldr	w1, [x21, 84]
 	str	w1, [x24, 56]
-	.loc 1 2343 0
+	.loc 1 2365 0
 	ldr	w1, [x21, 88]
 	str	w1, [x24, 60]
-	.loc 1 2344 0
+	.loc 1 2366 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL665:
-	b	.L633
+	b	.L632
 .LVL666:
-.L704:
-	.loc 1 2319 0
+.L703:
+	.loc 1 2341 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC53
 	add	x1, x1, :lo12:.LC53
 	bl	_dev_info
 .LVL667:
-	.loc 1 2320 0
+	.loc 1 2342 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
 .LBB1740:
@@ -7759,13 +7777,13 @@ ebc_probe:
 .LBE1742:
 .LBE1741:
 .LBE1740:
-	.loc 1 2321 0
-	cbz	x0, .L709
-	.loc 1 2325 0
+	.loc 1 2343 0
+	cbz	x0, .L708
+	.loc 1 2347 0
 	ldp	w2, w1, [x21, 84]
-	.loc 1 2318 0
+	.loc 1 2340 0
 	mov	w28, 1
-	.loc 1 2325 0
+	.loc 1 2347 0
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
@@ -7777,35 +7795,35 @@ ebc_probe:
 	add	x1, x3, x1
 	bl	memcpy
 .LVL671:
-	b	.L631
+	b	.L630
 .LVL672:
-.L603:
+.L602:
 .LBE1743:
 .LBE1752:
-	.loc 1 2406 0
+	.loc 1 2428 0
 	mov	w25, -517
-	b	.L599
+	b	.L598
 .LVL673:
-.L621:
+.L620:
 .LBB1753:
 .LBB1688:
-	.loc 1 2194 0
+	.loc 1 2216 0
 	mov	w25, -12
-	b	.L618
+	b	.L617
 .LVL674:
-.L705:
+.L704:
 .LBE1688:
 .LBE1753:
 .LBB1754:
 .LBB1744:
-	.loc 1 2349 0
+	.loc 1 2371 0
 	bl	ebc_empty_buf_get
 .LVL675:
 	mov	x24, x0
 .LVL676:
-	.loc 1 2350 0
-	cbz	x0, .L635
-	.loc 1 2351 0
+	.loc 1 2372 0
+	cbz	x0, .L634
+	.loc 1 2373 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
@@ -7813,150 +7831,150 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL677:
-	.loc 1 2354 0
+	.loc 1 2376 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2352 0
+	.loc 1 2374 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2355 0
+	.loc 1 2377 0
 	ldr	w0, [x21, 84]
 	str	w0, [x24, 56]
-	.loc 1 2357 0
+	.loc 1 2379 0
 	mov	x0, x24
-	.loc 1 2356 0
+	.loc 1 2378 0
 	ldr	w1, [x21, 88]
 	str	w1, [x24, 60]
-	.loc 1 2357 0
+	.loc 1 2379 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL678:
-	b	.L635
+	b	.L634
 .LVL679:
-.L649:
+.L648:
 .LBE1744:
 .LBE1754:
-	.loc 1 2392 0
+	.loc 1 2414 0
 	mov	w25, -12
-	b	.L599
+	b	.L598
 .LVL680:
-.L604:
-	.loc 1 2416 0
+.L603:
+	.loc 1 2438 0
 	adrp	x1, .LC28
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC28
-	.loc 1 2417 0
+	.loc 1 2439 0
 	mov	w25, -22
-	.loc 1 2416 0
+	.loc 1 2438 0
 	bl	_dev_err
 .LVL681:
-	.loc 1 2417 0
-	b	.L599
+	.loc 1 2439 0
+	b	.L598
 .LVL682:
-.L701:
+.L700:
 .LBB1755:
 .LBB1699:
-	.loc 1 2155 0
+	.loc 1 2177 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC42
 	add	x1, x1, :lo12:.LC42
 	bl	_dev_err
 .LVL683:
-	.loc 1 2156 0
+	.loc 1 2178 0
 	ldr	x0, [x19, 104]
 	mov	w2, w26
 	ldr	x1, [x19, 208]
 	bl	epd_lut_from_file_init
 .LVL684:
-	.loc 1 2157 0
-	tbz	w0, #31, .L624
-	.loc 1 2158 0
+	.loc 1 2179 0
+	tbz	w0, #31, .L623
+	.loc 1 2180 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC43
-	.loc 1 2159 0
+	.loc 1 2181 0
 	mov	w25, -1
-	.loc 1 2158 0
+	.loc 1 2180 0
 	add	x1, x1, :lo12:.LC43
 	bl	_dev_err
 .LVL685:
-	b	.L622
+	b	.L621
 	.p2align 3
-.L702:
+.L701:
 .LBE1699:
 .LBE1755:
 .LBB1756:
 .LBB1719:
-	.loc 1 2247 0
+	.loc 1 2269 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC44
 	add	x1, x1, :lo12:.LC44
 	bl	_dev_err
 .LVL686:
-.L625:
+.L624:
 .LBE1719:
 .LBE1756:
-	.loc 1 2483 0
+	.loc 1 2505 0
 	adrp	x1, .LC76
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC76
-	.loc 1 2484 0
+	.loc 1 2506 0
 	mov	w25, -1
-	.loc 1 2483 0
+	.loc 1 2505 0
 	bl	_dev_err
 .LVL687:
-	.loc 1 2484 0
-	b	.L599
+	.loc 1 2506 0
+	b	.L598
 .LVL688:
-.L626:
+.L625:
 .LBB1757:
 .LBB1720:
-	.loc 1 2256 0
+	.loc 1 2278 0
 	ldr	x0, [x19, 104]
 .LVL689:
 	adrp	x1, .LC75
-	.loc 1 2254 0
+	.loc 1 2276 0
 	str	x24, [x19, 136]
-	.loc 1 2256 0
+	.loc 1 2278 0
 	add	x1, x1, :lo12:.LC75
 	bl	_dev_err
 .LVL690:
-	b	.L625
+	b	.L624
 .LVL691:
-.L694:
+.L693:
 .LBE1720:
 .LBE1757:
-	.loc 1 2399 0
+	.loc 1 2421 0
 	adrp	x1, .LC26
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC26
-	.loc 1 2400 0
+	.loc 1 2422 0
 	mov	w25, -19
-	.loc 1 2399 0
+	.loc 1 2421 0
 	bl	_dev_err
 .LVL692:
-	.loc 1 2400 0
-	b	.L599
+	.loc 1 2422 0
+	b	.L598
 .LVL693:
-.L650:
+.L649:
 .LBB1758:
 .LBB1689:
-	.loc 1 2179 0
+	.loc 1 2201 0
 	mov	w25, -19
-	b	.L618
+	b	.L617
 .LVL694:
-.L651:
+.L650:
 .LBE1689:
 .LBE1758:
 .LBB1759:
 .LBB1700:
-	.loc 1 2133 0
+	.loc 1 2155 0
 	mov	w25, -19
-	b	.L622
+	b	.L621
 .LVL695:
-.L709:
+.L708:
 .LBE1700:
 .LBE1759:
 .LBB1760:
 .LBB1745:
-	.loc 1 2322 0
+	.loc 1 2344 0
 	ldr	x0, [x19, 104]
 .LVL696:
 	adrp	x1, .LC54
@@ -7964,44 +7982,44 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC54
 	bl	_dev_err
 .LVL697:
-	b	.L629
+	b	.L628
 .LVL698:
-.L700:
+.L699:
 .LBE1745:
 .LBE1760:
 .LBB1761:
 .LBB1701:
-	.loc 1 2149 0
+	.loc 1 2171 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
 	adrp	x1, .LC41
-	mov	w3, 2149
+	mov	w3, 2171
 	add	x2, x2, 32
 	add	x1, x1, :lo12:.LC41
-	.loc 1 2150 0
+	.loc 1 2172 0
 	mov	w25, -12
-	.loc 1 2149 0
+	.loc 1 2171 0
 	bl	_dev_err
 .LVL699:
-	b	.L622
+	b	.L621
 .LVL700:
-.L697:
+.L696:
 .LBE1701:
 .LBE1761:
-	.loc 1 2501 0
+	.loc 1 2523 0
 	bl	__stack_chk_fail
 .LVL701:
-.L708:
+.L707:
 .LBB1762:
 .LBB1746:
-	.loc 1 2304 0
+	.loc 1 2326 0
 	mov	w24, 1
 .LVL702:
-	b	.L646
+	b	.L645
 .LVL703:
-.L707:
-	.loc 1 2308 0
+.L706:
+	.loc 1 2330 0
 	ldr	x0, [x19, 104]
 .LVL704:
 	adrp	x1, .LC51
@@ -8009,7 +8027,7 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC51
 	bl	_dev_err
 .LVL705:
-	b	.L629
+	b	.L628
 .LBE1746:
 .LBE1762:
 	.cfi_endproc
@@ -8039,8 +8057,8 @@ ebc_power_set.constprop.11:
 	.loc 1 188 0
 	ldr	w0, [x20, 440]
 .LVL707:
-	cbz	w0, .L713
-.L711:
+	cbz	w0, .L712
+.L710:
 	.loc 1 192 0
 	mov	w1, 1
 	str	w1, [x20, 200]
@@ -8087,7 +8105,7 @@ ebc_power_set.constprop.11:
 	ret
 .LVL712:
 	.p2align 3
-.L713:
+.L712:
 	.cfi_restore_state
 	.loc 1 189 0
 	mov	w0, 1
@@ -8098,7 +8116,7 @@ ebc_power_set.constprop.11:
 	add	x0, x19, 416
 	bl	__pm_stay_awake
 .LVL713:
-	b	.L711
+	b	.L710
 .LBE1768:
 .LBE1767:
 	.cfi_endproc
@@ -8138,7 +8156,7 @@ refresh_new_image2:
 	asr	w11, w11, 3
 .LVL717:
 	.loc 1 224 0
-	ble	.L715
+	ble	.L714
 	sub	w14, w11, #1
 	mov	w15, 0
 .LVL718:
@@ -8151,87 +8169,87 @@ refresh_new_image2:
 	mov	w12, -536870912
 .LVL719:
 	.p2align 2
-.L717:
+.L716:
 	.loc 1 225 0 discriminator 1
 	mov	x6, 0
 	cmp	w11, 0
-	bgt	.L738
-	b	.L735
+	bgt	.L737
+	b	.L734
 .LVL720:
 	.p2align 3
-.L718:
+.L717:
 	.loc 1 238 0
 	tst	x5, 65280
-	bne	.L719
+	bne	.L718
 	.loc 1 239 0
 	and	w10, w4, 240
 	cmp	w10, 224
-	beq	.L740
+	beq	.L739
 	.loc 1 242 0
 	orr	w7, w7, 240
-.L719:
+.L718:
 	.loc 1 244 0
 	tst	x5, 16711680
-	bne	.L721
+	bne	.L720
 	.loc 1 245 0
 	and	w10, w4, 3840
 	cmp	w10, 3584
-	beq	.L741
+	beq	.L740
 	.loc 1 248 0
 	orr	w7, w7, 3840
-.L721:
+.L720:
 	.loc 1 250 0
 	tst	x5, 4278190080
-	bne	.L723
+	bne	.L722
 	.loc 1 251 0
 	and	w10, w4, 61440
 	cmp	w10, 57344
-	beq	.L742
+	beq	.L741
 	.loc 1 254 0
 	orr	w7, w7, 61440
-.L723:
+.L722:
 	.loc 1 256 0
 	tst	x5, 1095216660480
-	bne	.L725
+	bne	.L724
 	.loc 1 257 0
 	and	w10, w4, 983040
 	cmp	w10, 917504
-	beq	.L743
+	beq	.L742
 	.loc 1 260 0
 	orr	w7, w7, 983040
-.L725:
+.L724:
 	.loc 1 262 0
 	tst	x5, 280375465082880
-	bne	.L727
+	bne	.L726
 	.loc 1 263 0
 	and	w10, w4, 15728640
 	cmp	w10, 14680064
-	beq	.L744
+	beq	.L743
 	.loc 1 266 0
 	orr	w7, w7, 15728640
-.L727:
+.L726:
 	.loc 1 268 0
 	tst	x5, 71776119061217280
-	bne	.L729
+	bne	.L728
 	.loc 1 269 0
 	and	w10, w4, 251658240
 	cmp	w10, w13
-	beq	.L745
+	beq	.L744
 	.loc 1 272 0
 	orr	w7, w7, 251658240
-.L729:
+.L728:
 	.loc 1 274 0
 	tst	x5, -72057594037927936
-	bne	.L731
+	bne	.L730
 	.loc 1 275 0
 	and	w5, w4, -268435456
 .LVL721:
 	cmp	w5, w12
-	beq	.L746
+	beq	.L745
 	.loc 1 278 0
 	orr	w7, w7, -268435456
 .LVL722:
-.L731:
+.L730:
 	.loc 1 282 0 discriminator 2
 	and	w4, w4, w9
 .LVL723:
@@ -8243,9 +8261,9 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 225 0 discriminator 2
 	cmp	w11, w6
-	ble	.L747
+	ble	.L746
 .LVL724:
-.L738:
+.L737:
 	.loc 1 226 0
 	ldr	x5, [x3, x6, lsl 3]
 	.loc 1 230 0
@@ -8261,7 +8279,7 @@ refresh_new_image2:
 	ldr	w9, [x2, x6, lsl 2]
 .LVL726:
 	.loc 1 232 0
-	cbnz	x10, .L718
+	cbnz	x10, .L717
 .LVL727:
 	.loc 1 233 0
 	and	w10, w4, 15
@@ -8269,22 +8287,22 @@ refresh_new_image2:
 	mov	w7, 15
 	.loc 1 233 0
 	cmp	w10, 14
-	bne	.L718
+	bne	.L717
 	.loc 1 234 0
 	orr	w8, w8, w7
 .LVL728:
 	.loc 1 230 0
 	mov	w7, 0
 .LVL729:
-	b	.L718
+	b	.L717
 	.p2align 3
-.L745:
+.L744:
 	.loc 1 270 0
 	orr	w8, w8, 251658240
-	b	.L729
+	b	.L728
 .LVL730:
 	.p2align 3
-.L746:
+.L745:
 	.loc 1 276 0
 	orr	w8, w8, -268435456
 .LVL731:
@@ -8299,48 +8317,48 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 225 0
 	cmp	w11, w6
-	bgt	.L738
+	bgt	.L737
 .LVL733:
 	.p2align 2
-.L747:
+.L746:
 	add	x3, x3, x17
 	add	x1, x1, x14
 	add	x2, x2, x14
 	add	x0, x0, x14
 .LVL734:
-.L735:
+.L734:
 	.loc 1 224 0 discriminator 2
 	add	w15, w15, 1
 	cmp	w16, w15
-	bne	.L717
-.L715:
+	bne	.L716
+.L714:
 	ret
 .LVL735:
 	.p2align 3
-.L741:
+.L740:
 	.loc 1 246 0
 	orr	w8, w8, 3840
-	b	.L721
+	b	.L720
 	.p2align 3
-.L742:
+.L741:
 	.loc 1 252 0
 	orr	w8, w8, 61440
-	b	.L723
+	b	.L722
 	.p2align 3
-.L743:
+.L742:
 	.loc 1 258 0
 	orr	w8, w8, 983040
-	b	.L725
+	b	.L724
 	.p2align 3
-.L744:
+.L743:
 	.loc 1 264 0
 	orr	w8, w8, 15728640
-	b	.L727
+	b	.L726
 	.p2align 3
-.L740:
+.L739:
 	.loc 1 240 0
 	orr	w8, w8, 240
-	b	.L719
+	b	.L718
 	.cfi_endproc
 .LFE2807:
 	.size	refresh_new_image2, .-refresh_new_image2
@@ -8365,7 +8383,7 @@ refresh_new_image_auto:
 	asr	w9, w9, 3
 .LVL738:
 	.loc 1 299 0
-	ble	.L748
+	ble	.L747
 	sub	w12, w9, #1
 	mov	w11, 0
 .LVL739:
@@ -8375,13 +8393,13 @@ refresh_new_image_auto:
 	lsl	x14, x12, 3
 	lsl	x12, x12, 2
 	.p2align 2
-.L750:
+.L749:
 	.loc 1 300 0 discriminator 1
 	mov	x6, 0
 	cmp	w9, 0
-	ble	.L761
+	ble	.L760
 	.p2align 2
-.L763:
+.L762:
 	.loc 1 301 0
 	ldr	x4, [x2, x6, lsl 3]
 .LVL740:
@@ -8436,17 +8454,17 @@ refresh_new_image_auto:
 	add	x6, x6, 1
 	.loc 1 300 0
 	cmp	w9, w6
-	bgt	.L763
+	bgt	.L762
 	add	x2, x2, x14
 	add	x1, x1, x12
 	add	x0, x0, x12
 .LVL746:
-.L761:
+.L760:
 	.loc 1 299 0 discriminator 2
 	add	w11, w11, 1
 	cmp	w13, w11
-	bne	.L750
-.L748:
+	bne	.L749
+.L747:
 	ret
 	.cfi_endproc
 .LFE2808:
@@ -8489,20 +8507,25 @@ new_buffer_refresh:
 	.loc 1 343 0
 	ldr	x0, [x19, 224]
 	ldr	w5, [x0, 40]
-	cbz	w5, .L769
-	.loc 1 349 0
+	.loc 1 344 0
+	sub	w1, w5, #22
+	.loc 1 345 0
+	cmp	w5, 0
+	ccmp	w1, 1, 0, ne
+	bls	.L768
+	.loc 1 351 0
 	ldr	x1, [x0, 16]
 	mov	x4, x19
 	ldp	x2, x3, [x19, 160]
 	ldr	x0, [x19, 144]
 	bl	refresh_new_image2
 .LVL752:
-	.loc 1 354 0
+	.loc 1 356 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 704
 	bl	up_write
 .LVL753:
-	.loc 1 355 0
+	.loc 1 357 0
 	ldp	x19, x20, [sp, 16]
 .LVL754:
 	ldp	x29, x30, [sp], 32
@@ -8515,21 +8538,21 @@ new_buffer_refresh:
 	ret
 .LVL755:
 	.p2align 3
-.L769:
+.L768:
 	.cfi_restore_state
-	.loc 1 344 0
+	.loc 1 346 0
 	ldr	x1, [x0, 16]
 	mov	x3, x19
 	ldr	x2, [x19, 168]
 	ldr	x0, [x19, 144]
 	bl	refresh_new_image_auto
 .LVL756:
-	.loc 1 354 0
+	.loc 1 356 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 704
 	bl	up_write
 .LVL757:
-	.loc 1 355 0
+	.loc 1 357 0
 	ldp	x19, x20, [sp, 16]
 .LVL758:
 	ldp	x29, x30, [sp], 32
@@ -8547,16 +8570,16 @@ new_buffer_refresh:
 	.type	ebc_thread, %function
 ebc_thread:
 .LFB2826:
-	.loc 1 1326 0
+	.loc 1 1338 0
 	.cfi_startproc
 .LVL759:
 	stp	x29, x30, [sp, -224]!
 	.cfi_def_cfa_offset 224
 	.cfi_offset 29, -224
 	.cfi_offset 30, -216
-	.loc 1 1327 0
+	.loc 1 1339 0
 	adrp	x1, .LANCHOR0
-	.loc 1 1326 0
+	.loc 1 1338 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -8568,211 +8591,428 @@ ebc_thread:
 	adrp	x22, __stack_chk_guard
 	stp	x23, x24, [sp, 48]
 	adrp	x21, .LANCHOR1
-	.loc 1 1327 0
-	ldr	x20, [x1, #:lo12:.LANCHOR0]
-.LVL760:
-	.loc 1 1326 0
+	stp	x27, x28, [sp, 80]
 	add	x0, x22, :lo12:__stack_chk_guard
+.LVL760:
+	.loc 1 1339 0
+	ldr	x20, [x1, #:lo12:.LANCHOR0]
 .LVL761:
-	stp	x25, x26, [sp, 64]
 .LBB1791:
 .LBB1792:
 .LBB1793:
-	.loc 1 1624 0
+	.loc 1 1646 0
 	add	x21, x21, :lo12:.LANCHOR1
 .LBE1793:
 .LBE1792:
 .LBE1791:
-	.loc 1 1326 0
-	stp	x27, x28, [sp, 80]
+	.loc 1 1338 0
+	stp	x25, x26, [sp, 64]
 	.cfi_offset 23, -176
 	.cfi_offset 24, -168
-	.cfi_offset 25, -160
-	.cfi_offset 26, -152
 	.cfi_offset 27, -144
 	.cfi_offset 28, -136
-	.loc 1 1328 0
-	add	x24, x20, 184
+	.cfi_offset 25, -160
+	.cfi_offset 26, -152
 .LBB1798:
 .LBB1796:
 .LBB1794:
-	.loc 1 1624 0
+	.loc 1 1646 0
 	add	x19, x21, 304
 .LBE1794:
 .LBE1796:
 .LBE1798:
-	.loc 1 1331 0
+	.loc 1 1340 0
+	add	x28, x20, 184
+	.loc 1 1343 0
 	mov	w23, 0
 .LVL762:
-	.loc 1 1326 0
+	.loc 1 1338 0
 	ldr	x1, [x0]
 	str	x1, [x29, 216]
 	mov	x1,0
 .LVL763:
 	.p2align 2
+.L770:
+	.loc 1 1348 0
+	ldr	w0, [x28, 616]
+	cbnz	w0, .L906
 .L771:
-	.loc 1 1336 0
-	ldr	w0, [x24, 616]
-.LVL764:
-	cbnz	w0, .L900
-.L772:
-	.loc 1 1342 0
+	.loc 1 1354 0
 	bl	ebc_dsp_buf_get
-.LVL765:
-	mov	x28, x0
-	.loc 1 1344 0
-	cbz	x0, .L774
-	.loc 1 1344 0 is_stmt 0 discriminator 1
+.LVL764:
+	mov	x24, x0
+	.loc 1 1356 0
+	cbz	x0, .L773
+	.loc 1 1356 0 is_stmt 0 discriminator 1
 	ldr	x1, [x0, 8]
-	cbz	x1, .L774
-	.loc 1 1345 0 is_stmt 1
+	cbz	x1, .L773
+	.loc 1 1357 0 is_stmt 1
 	ldr	w1, [x0, 40]
 	cmp	w1, 20
-	beq	.L901
-	.loc 1 1349 0
-	ldr	x2, [x24, 608]
-	cbz	x2, .L777
-	.loc 1 1350 0
+	beq	.L907
+	.loc 1 1361 0
+	ldr	x2, [x28, 608]
+	cbz	x2, .L776
+	.loc 1 1362 0
 	cmp	w1, 19
-	beq	.L902
-	.loc 1 1355 0
+	beq	.L908
+	.loc 1 1367 0
 	mov	w2, 18
 	tst	w1, w2
-	beq	.L893
-	.loc 1 1356 0
-	ldr	x0, [x24, 104]
+	beq	.L899
+	.loc 1 1368 0
+	ldr	x0, [x28, 104]
 	adrp	x1, .LC80
 	add	x1, x1, :lo12:.LC80
 	bl	_dev_info
-.LVL766:
-.L776:
-	.loc 1 1389 0
+.LVL765:
+.L775:
+	.loc 1 1401 0
 	adrp	x25, jiffies
-.LVL767:
+.LVL766:
 	mov	x1, 402653184
 	add	x0, x20, 632
 	ldr	x2, [x25, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL768:
-	.loc 1 1391 0
-	ldr	w0, [x24, 444]
-	cbz	w0, .L783
-	ldr	x0, [x24, 216]
-.L784:
-	.loc 1 1394 0
+.LVL767:
+	.loc 1 1403 0
+	ldr	w0, [x28, 444]
+	cbz	w0, .L782
+	ldr	x0, [x28, 216]
+.L783:
+	.loc 1 1406 0
 	ldr	w2, [x0, 40]
-	ldr	w3, [x28, 40]
+	ldr	w3, [x24, 40]
 	cmp	w3, w2
-	beq	.L785
-	.loc 1 1395 0
-	ldr	x0, [x24, 104]
+	beq	.L784
+	.loc 1 1407 0
+	ldr	x0, [x28, 104]
 	adrp	x1, .LC82
 	add	x1, x1, :lo12:.LC82
 	bl	_dev_info
-.LVL769:
-	.loc 1 1396 0
-	ldr	w0, [x24, 44]
+.LVL768:
+	.loc 1 1408 0
+	ldr	w0, [x28, 44]
 	cmp	w0, 1
-	beq	.L903
-.L894:
-	ldr	w2, [x28, 40]
-.L785:
-	.loc 1 1403 0
-	cmp	w2, 11
-	bgt	.L792
-	cmp	w2, 7
-	bge	.L793
+	beq	.L909
+.L900:
+	ldr	w2, [x24, 40]
+.L784:
+	.loc 1 1415 0
+	cmp	w2, 13
+	bgt	.L791
+	cmp	w2, 12
+	bge	.L863
+	cmp	w2, 6
+	bgt	.L793
+	cmp	w2, 2
+	bge	.L863
+	cbz	w2, .L794
 	cmp	w2, 1
-	beq	.L794
-	bgt	.L864
-	cbnz	w2, .L791
-	.loc 1 1448 0
+	bne	.L790
+	.loc 1 1417 0
+	ldr	w0, [x28, 620]
+	cbz	w0, .L797
+	.loc 1 1418 0
+	str	w2, [x28, 624]
+	.loc 1 1427 0
 	add	x0, x21, 704
 	bl	down_write
-.LVL770:
-	.loc 1 1454 0
-	ldr	x0, [x24, 216]
-	.loc 1 1449 0
-	str	x28, [x24, 224]
-	.loc 1 1454 0
-	ldr	w0, [x0, 40]
+.LVL769:
+	.loc 1 1428 0
+	str	x24, [x28, 224]
+	.loc 1 1430 0
+	ldr	x2, [x28, 216]
+	ldr	w0, [x2, 40]
+	.loc 1 1433 0
 	cmp	w0, 1
-	bls	.L828
-	.loc 1 1456 0
-	ldrsw	x2, [x24, 20]
-	ldr	x1, [x28, 16]
-	ldr	x0, [x24, 144]
+	.loc 1 1432 0
+	sub	w1, w0, #22
+	.loc 1 1433 0
+	ccmp	w1, 1, 0, hi
+	bls	.L910
+	.loc 1 1434 0
+	ldr	x1, [x2, 16]
+	ldr	x0, [x28, 144]
+	ldrsw	x2, [x28, 20]
+	bl	memcpy
+.LVL770:
+	.loc 1 1435 0
+	ldr	x0, [x28, 216]
+	ldrsw	x2, [x28, 20]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x28, 152]
 	bl	memcpy
 .LVL771:
-	.loc 1 1457 0
-	ldr	x0, [x24, 216]
-	ldrsw	x2, [x24, 20]
+	.loc 1 1436 0
+	ldr	x0, [x28, 216]
+	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
-	ldr	x0, [x24, 152]
+	ldr	x0, [x28, 160]
 	bl	memcpy
 .LVL772:
-.L829:
-	.loc 1 1463 0
-	add	x0, x21, 704
-	bl	up_write
+	ldr	x0, [x28, 224]
+.L800:
+.LBB1799:
+.LBB1800:
+	.loc 1 378 0
+	ldp	w3, w15, [x0, 48]
+	.loc 1 437 0
+	mov	w14, 234881024
+	.loc 1 379 0
+	ldp	w2, w18, [x0, 56]
+	.loc 1 376 0
+	cmp	w3, 0
+	.loc 1 381 0
+	ldr	w1, [x20, 256]
+	.loc 1 376 0
+	add	w16, w3, 7
+	csel	w16, w16, w3, lt
+	.loc 1 377 0
+	add	w9, w2, 7
+	cmp	w2, 0
+	.loc 1 381 0
+	add	w17, w1, 7
+	.loc 1 377 0
+	csel	w9, w9, w2, lt
+	.loc 1 381 0
+	cmp	w1, 0
+	csel	w17, w17, w1, lt
+	.loc 1 377 0
+	asr	w9, w9, 3
+	.loc 1 381 0
+	asr	w17, w17, 3
 .LVL773:
-	.loc 1 1465 0
-	ldr	w0, [x24, 44]
-	cbz	w0, .L904
+	.loc 1 377 0
+	add	w9, w9, 1
 .LVL774:
-	.p2align 2
-.L806:
-	.loc 1 1585 0
-	ldr	x0, [x24, 224]
-	ldr	w0, [x0, 40]
-	cmp	w0, 20
-	beq	.L905
-.L845:
-	.loc 1 1591 0
-	cmp	w0, 18
-	beq	.L906
-.L846:
-	.loc 1 1600 0
-	mov	x0, x28
-	bl	ebc_remove_from_dsp_buf_list
+	ldr	w1, [x20, 252]
+	.loc 1 384 0
+	cmp	w9, w17
+.LBE1800:
+.LBE1799:
+	.loc 1 1443 0
+	ldr	x12, [x0, 16]
+.LBB1805:
+.LBB1801:
+	.loc 1 384 0
+	sub	w0, w17, #1
+	csel	w9, w0, w9, ge
 .LVL775:
-	.loc 1 1602 0
-	ldr	w0, [x24, 444]
-	cbnz	w0, .L907
-.L847:
-	.loc 1 1605 0
-	mov	w0, 1
-	str	w0, [x24, 444]
+	.loc 1 386 0
+	cmp	w1, w18
+	sub	w1, w1, #1
+	.loc 1 443 0
+	mov	w13, -536870912
+	.loc 1 386 0
+	csel	w18, w1, w18, le
+	.loc 1 376 0
+	asr	w16, w16, 3
+.LVL776:
+	mul	w5, w15, w17
+	.loc 1 388 0
+	cmp	w15, w18
+.LBE1801:
+.LBE1805:
+	.loc 1 1443 0
+	ldr	x8, [x28, 144]
+	.loc 1 1444 0
+	ldp	x11, x10, [x28, 160]
+.LBB1806:
+.LBB1802:
+	.loc 1 388 0
+	bgt	.L808
+.LVL777:
+	.p2align 2
+.L882:
+	.loc 1 393 0
+	mov	w4, w16
+	cmp	w16, w9
+	ble	.L883
+	b	.L825
+.LVL778:
+	.p2align 3
+.L809:
+	.loc 1 406 0
+	tst	x2, 65280
+	bne	.L810
+	.loc 1 407 0
+	and	w27, w1, 240
+	cmp	w27, 224
+	beq	.L911
+	.loc 1 410 0
+	orr	w25, w25, 240
+.L810:
+	.loc 1 412 0
+	tst	x2, 16711680
+	bne	.L812
+	.loc 1 413 0
+	and	w27, w1, 3840
+	cmp	w27, 3584
+	beq	.L912
+	.loc 1 416 0
+	orr	w25, w25, 3840
+.L812:
+	.loc 1 418 0
+	tst	x2, 4278190080
+	bne	.L814
+	.loc 1 419 0
+	and	w27, w1, 61440
+	cmp	w27, 57344
+	beq	.L913
+	.loc 1 422 0
+	orr	w25, w25, 61440
+.L814:
+	.loc 1 424 0
+	tst	x2, 1095216660480
+	bne	.L816
+	.loc 1 425 0
+	and	w27, w1, 983040
+	cmp	w27, 917504
+	beq	.L914
+	.loc 1 428 0
+	orr	w25, w25, 983040
+.L816:
+	.loc 1 430 0
+	tst	x2, 280375465082880
+	bne	.L818
+	.loc 1 431 0
+	and	w27, w1, 15728640
+	cmp	w27, 14680064
+	beq	.L915
+	.loc 1 434 0
+	orr	w25, w25, 15728640
+.L818:
+	.loc 1 436 0
+	tst	x2, 71776119061217280
+	bne	.L820
+	.loc 1 437 0
+	and	w27, w1, 251658240
+	cmp	w27, w14
+	beq	.L916
+	.loc 1 440 0
+	orr	w25, w25, 251658240
+.L820:
+	.loc 1 442 0
+	tst	x2, -72057594037927936
+	bne	.L822
+	.loc 1 443 0
+	and	w2, w1, -268435456
+.LVL779:
+	cmp	w2, w13
+	beq	.L917
+	.loc 1 446 0
+	orr	w25, w25, -268435456
+.LVL780:
+.L822:
+	.loc 1 449 0
+	and	w1, w1, w26
+.LVL781:
+	.loc 1 393 0
+	add	w4, w4, 1
+	eor	w1, w1, w3
+	cmp	w4, w9
+	and	w1, w1, w25
+	.loc 1 449 0
+	eor	w1, w3, w1
+	.loc 1 450 0
+	str	w1, [x8, x0]
+	.loc 1 393 0
+	bgt	.L825
+.LVL782:
+.L883:
+	.loc 1 394 0
+	sxtw	x0, w4
+.LVL783:
+	.loc 1 398 0
+	mov	w25, 0
+	.loc 1 397 0
+	lsl	x1, x0, 3
+	.loc 1 394 0
+	lsl	x0, x0, 2
+.LVL784:
+	.loc 1 397 0
+	add	x1, x1, x5, sxtw 3
+	add	x0, x0, x5, sxtw 2
+	ldr	x2, [x10, x1]
+	.loc 1 394 0
+	ldr	w3, [x8, x0]
+	.loc 1 395 0
+	ldr	w1, [x12, x0]
+	.loc 1 400 0
+	and	x27, x2, 255
+	.loc 1 396 0
+	ldr	w26, [x11, x0]
+.LVL785:
+	.loc 1 400 0
+	cbnz	x27, .L809
+.LVL786:
+	.loc 1 401 0
+	and	w27, w1, 15
+	.loc 1 404 0
+	mov	w25, 15
+	.loc 1 401 0
+	cmp	w27, 14
+	bne	.L809
+	.loc 1 402 0
+	orr	w3, w3, w25
+.LVL787:
+	.loc 1 398 0
+	mov	w25, 0
+.LVL788:
+	b	.L809
+.LVL789:
+	.p2align 3
+.L773:
+.LBE1802:
+.LBE1806:
+	.loc 1 1633 0
+	ldr	w0, [x28, 44]
+.LVL790:
+	cmp	w0, 1
+	beq	.L918
+	.loc 1 1642 0
+	ldr	w0, [x28, 200]
+	cmp	w0, 1
+	beq	.L919
+.LVL791:
+.L902:
+	ldr	w0, [x28, 96]
+.LVL792:
+	.loc 1 1645 0
+	cbz	w0, .L920
+.L858:
+.LVL793:
 .L848:
-	.loc 1 1607 0
-	ldr	x0, [x24, 224]
-	str	x0, [x24, 216]
-	.loc 1 1336 0
-	ldr	w0, [x24, 616]
-	cbz	w0, .L772
-.L900:
-	.loc 1 1337 0
-	ldr	w0, [x24, 200]
+	.loc 1 1647 0
+	str	wzr, [x28, 96]
+.L924:
+	.loc 1 1348 0
+	ldr	w0, [x28, 616]
+.LVL794:
+	cbz	w0, .L771
+.L906:
+	.loc 1 1349 0
+	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	beq	.L908
-.L773:
-	.loc 1 1630 0
+	beq	.L921
+.L772:
+	.loc 1 1652 0
 	add	x22, x22, :lo12:__stack_chk_guard
 	mov	w0, 0
 	ldr	x2, [x29, 216]
 	ldr	x1, [x22]
 	eor	x1, x2, x1
-	cbnz	x1, .L909
+	cbnz	x1, .L922
 	ldp	x19, x20, [sp, 16]
-.LVL776:
+.LVL795:
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
-.LVL777:
+.LVL796:
 	ldp	x25, x26, [sp, 64]
-.LVL778:
+.LVL797:
 	ldp	x27, x28, [sp, 80]
-.LVL779:
 	ldp	x29, x30, [sp], 224
 	.cfi_remember_state
 	.cfi_restore 30
@@ -8789,1159 +9029,952 @@ ebc_thread:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL780:
+.LVL798:
 	.p2align 3
-.L774:
+.L920:
 	.cfi_restore_state
-	.loc 1 1611 0
-	ldr	w0, [x24, 44]
-.LVL781:
-	cmp	w0, 1
-	beq	.L910
-	.loc 1 1620 0
-	ldr	w0, [x24, 200]
-	cmp	w0, 1
-	beq	.L911
-.LVL782:
-.L896:
-	ldr	w0, [x24, 96]
-.LVL783:
-	.loc 1 1623 0
-	cbz	w0, .L912
-.L859:
-.LVL784:
-.L849:
-	.loc 1 1625 0
-	str	wzr, [x24, 96]
-	b	.L771
-.LVL785:
-	.p2align 3
-.L912:
-.LBB1799:
+.LBB1807:
 .LBB1797:
-	.loc 1 1624 0 discriminator 1
+	.loc 1 1646 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL786:
-	b	.L860
+.LVL799:
+	b	.L859
 	.p2align 3
-.L913:
-.LVL787:
+.L923:
+.LVL800:
 .LBB1795:
-	.loc 1 1624 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L849
-	.loc 1 1624 0 discriminator 7
+	.loc 1 1646 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L848
+	.loc 1 1646 0 discriminator 7
 	bl	schedule
-.LVL788:
-.L860:
-	.loc 1 1624 0 discriminator 9
+.LVL801:
+.L859:
+	.loc 1 1646 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL789:
-	ldr	w1, [x24, 96]
-	cbz	w1, .L913
+.LVL802:
+	ldr	w1, [x28, 96]
+	cbz	w1, .L923
 .LBE1795:
-	.loc 1 1624 0 discriminator 4
+	.loc 1 1646 0 discriminator 4
 	add	x1, x29, 112
 	mov	x0, x19
 	bl	finish_wait
-.LVL790:
+.LVL803:
 .LBE1797:
-.LBE1799:
-	.loc 1 1625 0 is_stmt 1 discriminator 4
-	str	wzr, [x24, 96]
-	b	.L771
-.LVL791:
+.LBE1807:
+	.loc 1 1647 0 is_stmt 1 discriminator 4
+	str	wzr, [x28, 96]
+	b	.L924
+.LVL804:
 	.p2align 3
-.L783:
-	.loc 1 1392 0
-	mov	x0, x28
-	str	x28, [x24, 216]
-	b	.L784
-.LVL792:
+.L782:
+	.loc 1 1404 0
+	mov	x0, x24
+	str	x24, [x28, 216]
+	b	.L783
+.LVL805:
 	.p2align 3
-.L777:
-	.loc 1 1365 0
+.L776:
+	.loc 1 1377 0
 	cmp	w1, 18
 	ccmp	w1, 21, 4, ne
-	bne	.L781
-	.loc 1 1366 0
-	str	wzr, [x24, 624]
-	b	.L776
-.LVL793:
+	bne	.L780
+	.loc 1 1378 0
+	str	wzr, [x28, 624]
+	b	.L775
+.LVL806:
 	.p2align 3
-.L797:
-	.loc 1 1403 0
-	cmp	w2, 21
-	ble	.L864
-.L791:
-	.loc 1 1574 0
-	ldr	x0, [x24, 104]
+.L796:
+	.loc 1 1415 0
+	cmp	w2, 23
+	ble	.L794
+.L790:
+	.loc 1 1596 0
+	ldr	x0, [x28, 104]
 	adrp	x1, .LC90
 	add	x1, x1, :lo12:.LC90
 	bl	_dev_err
-.LVL794:
-	.loc 1 1575 0
-	mov	x0, x28
-.LVL795:
-.L893:
+.LVL807:
+	.loc 1 1597 0
+	mov	x0, x24
+.LVL808:
+.L899:
 	bl	ebc_remove_from_dsp_buf_list
-.LVL796:
-	.loc 1 1576 0
-	mov	x0, x28
+.LVL809:
+	.loc 1 1598 0
+	mov	x0, x24
 	bl	ebc_buf_release
-.LVL797:
-	.loc 1 1578 0
-	b	.L771
-.LVL798:
-	.p2align 3
-.L901:
-	.loc 1 1347 0
-	str	wzr, [x24, 620]
-	.loc 1 1346 0
-	str	wzr, [x24, 624]
-	b	.L776
-.LVL799:
+.LVL810:
+	.loc 1 1600 0
+	b	.L770
+.LVL811:
 	.p2align 3
+.L791:
+	.loc 1 1415 0
+	cmp	w2, 21
+	bgt	.L796
+	cmp	w2, 16
+	bge	.L863
+.L793:
+	mov	w8, 0
+.LVL812:
 .L792:
-	.loc 1 1403 0
-	cmp	w2, 15
-	bgt	.L797
-	cmp	w2, 14
-	bge	.L793
-.L864:
-	.loc 1 1504 0
-	ldr	x26, [x24, 216]
-	.loc 1 1495 0
-	mov	w7, 1
-.LVL800:
-	.loc 1 1505 0
+	.loc 1 1524 0
+	ldr	x26, [x28, 216]
+.LVL813:
+	.loc 1 1526 0
 	ldr	w0, [x26, 40]
-	cmp	w0, 1
-	bls	.L914
-.L832:
-	.loc 1 1516 0
-	str	wzr, [x24, 92]
-	.loc 1 1517 0
-	str	x28, [x24, 224]
-	.loc 1 1520 0
-	ldr	w0, [x28, 40]
+	sub	w1, w0, #22
+	.loc 1 1528 0
+	cmp	w1, 1
+	ccmp	w0, 1, 0, hi
+	bhi	.L831
+	.loc 1 1532 0
+	add	x0, x29, 152
+	str	x0, [x28, 216]
+	.loc 1 1533 0
+	ldr	x0, [x28, 152]
+	str	x0, [x29, 168]
+.L831:
+	.loc 1 1538 0
+	str	wzr, [x28, 92]
+	.loc 1 1539 0
+	str	x24, [x28, 224]
+	.loc 1 1542 0
+	ldr	w0, [x24, 40]
 	sub	w0, w0, #2
-	.loc 1 1519 0
+	.loc 1 1541 0
 	cmp	w0, 14
-	bhi	.L833
-.L915:
-	.loc 1 1522 0
-	ldr	x0, [x24, 216]
-.LBB1800:
-.LBB1801:
-	.loc 1 1311 0
-	ldr	w1, [x24, 20]
-.LBE1801:
-.LBE1800:
-	.loc 1 1521 0
-	ldr	x4, [x28, 16]
-.LBB1804:
-.LBB1802:
-	.loc 1 1311 0
+	bhi	.L832
+	.loc 1 1544 0
+	ldr	x0, [x28, 216]
+.LBB1808:
+.LBB1809:
+	.loc 1 1323 0
+	ldr	w1, [x28, 20]
+.LBE1809:
+.LBE1808:
+	.loc 1 1543 0
+	ldr	x4, [x24, 16]
+.LBB1812:
+.LBB1810:
+	.loc 1 1323 0
 	cmp	w1, 0
-.LBE1802:
-.LBE1804:
-	.loc 1 1522 0
+.LBE1810:
+.LBE1812:
+	.loc 1 1544 0
 	ldr	x5, [x0, 16]
-.LBB1805:
-.LBB1803:
-	.loc 1 1311 0
+.LBB1813:
+.LBB1811:
+	.loc 1 1323 0
 	add	w0, w1, 7
 	csel	w0, w0, w1, lt
 	asr	w0, w0, 3
 	cmp	w0, 0
-	ble	.L834
-	.loc 1 1315 0
-	ldr	x1, [x4]
-	ldr	x2, [x5]
+	ble	.L833
+	.loc 1 1327 0
+	ldr	x2, [x4]
+	ldr	x1, [x5]
 	cmp	x2, x1
-	bne	.L833
+	bne	.L832
 	sub	w1, w0, #1
 	mov	x0, 8
 	add	x1, x1, 1
 	lsl	x1, x1, 3
-	b	.L836
+	b	.L835
 	.p2align 3
-.L837:
-	.loc 1 1312 0
+.L836:
+	.loc 1 1324 0
 	ldr	x3, [x4, x0]
 	add	x0, x0, 8
-	.loc 1 1313 0
+	.loc 1 1325 0
 	add	x2, x5, x0
-	.loc 1 1315 0
+	.loc 1 1327 0
 	ldr	x2, [x2, -8]
 	cmp	x3, x2
-	bne	.L833
-.L836:
-	.loc 1 1311 0
+	bne	.L832
+.L835:
+	.loc 1 1323 0
 	cmp	x1, x0
-	bne	.L837
-.L834:
-.LBE1803:
-.LBE1805:
-	.loc 1 1524 0
-	ldr	x0, [x24, 104]
+	bne	.L836
+.L833:
+.LBE1811:
+.LBE1813:
+	.loc 1 1546 0
+	ldr	x0, [x28, 104]
 	adrp	x1, .LC93
 	add	x1, x1, :lo12:.LC93
 	bl	_dev_info
-.LVL801:
-	.loc 1 1526 0
-	str	x26, [x24, 216]
-	.loc 1 1585 0
-	ldr	x0, [x24, 224]
+.LVL814:
+	.loc 1 1548 0
+	str	x26, [x28, 216]
+	.loc 1 1607 0
+	ldr	x0, [x28, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
-	bne	.L845
-.LVL802:
-.L905:
-	.loc 1 1588 0
-	ldr	x0, [x24, 104]
-	.loc 1 1586 0
+	bne	.L844
+.LVL815:
+.L926:
+	.loc 1 1610 0
+	ldr	x0, [x28, 104]
+	.loc 1 1608 0
 	mov	w25, 1
-.LVL803:
-	.loc 1 1587 0
-	str	wzr, [x24, 204]
-	.loc 1 1588 0
+.LVL816:
+	.loc 1 1609 0
+	str	wzr, [x28, 204]
+	.loc 1 1610 0
 	adrp	x1, .LC91
-	.loc 1 1586 0
-	str	w25, [x24, 616]
-	.loc 1 1588 0
+	.loc 1 1608 0
+	str	w25, [x28, 616]
+	.loc 1 1610 0
 	add	x1, x1, :lo12:.LC91
 	bl	_dev_info
-.LVL804:
-	.loc 1 1589 0
+.LVL817:
+	.loc 1 1611 0
 	mov	w2, w25
 	mov	w1, w25
 	add	x0, x21, 328
 	bl	__wake_up_sync
-.LVL805:
-	.loc 1 1600 0
-	mov	x0, x28
+.LVL818:
+	.loc 1 1622 0
+	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL806:
-	.loc 1 1602 0
-	ldr	w0, [x24, 444]
-	cbz	w0, .L847
-.LVL807:
+.LVL819:
+	.loc 1 1624 0
+	ldr	w0, [x28, 444]
+	cbz	w0, .L846
+.LVL820:
 	.p2align 2
-.L907:
-	.loc 1 1603 0
-	ldr	x0, [x24, 216]
+.L928:
+	.loc 1 1625 0
+	ldr	x0, [x28, 216]
 	bl	ebc_buf_release
-.LVL808:
-	b	.L848
-.LVL809:
+.LVL821:
+	b	.L847
+.LVL822:
 	.p2align 3
-.L793:
-	.loc 1 1504 0
-	ldr	x26, [x24, 216]
-	.loc 1 1403 0
-	mov	w7, 0
-.LVL810:
-	.loc 1 1505 0
-	ldr	w0, [x26, 40]
-	cmp	w0, 1
-	bhi	.L832
-.L914:
-	.loc 1 1510 0
-	add	x0, x29, 152
-	.loc 1 1516 0
-	str	wzr, [x24, 92]
-	.loc 1 1510 0
-	str	x0, [x24, 216]
-	.loc 1 1517 0
-	str	x28, [x24, 224]
-	.loc 1 1511 0
-	ldr	x0, [x24, 152]
-	str	x0, [x29, 168]
-	.loc 1 1520 0
-	ldr	w0, [x28, 40]
-	sub	w0, w0, #2
-	.loc 1 1519 0
-	cmp	w0, 14
-	bls	.L915
-	.p2align 2
-.L833:
-	.loc 1 1532 0
-	cbnz	w7, .L868
-	.loc 1 1536 0
-	ldr	w0, [x24, 64]
+.L863:
+	.loc 1 1515 0
+	mov	w8, 1
+.LVL823:
+	b	.L792
+.LVL824:
+	.p2align 3
+.L907:
+	.loc 1 1359 0
+	str	wzr, [x28, 620]
+	.loc 1 1358 0
+	str	wzr, [x28, 624]
+	b	.L775
+.LVL825:
+	.p2align 3
+.L832:
+	.loc 1 1554 0
+	cbnz	w8, .L867
+	.loc 1 1558 0
+	ldr	w0, [x28, 64]
 	cmp	w0, 0
-	ble	.L838
-	.loc 1 1537 0
+	ble	.L837
+	.loc 1 1559 0
 	add	w23, w23, 1
-	.loc 1 1538 0
+	.loc 1 1560 0
 	cmp	w0, w23
-	bgt	.L838
-	.loc 1 1539 0
+	bgt	.L837
+	.loc 1 1561 0
 	mov	w0, 2
-	.loc 1 1540 0
+	.loc 1 1562 0
 	mov	w23, 0
-	.loc 1 1539 0
-	str	w0, [x28, 40]
+	.loc 1 1561 0
+	str	w0, [x24, 40]
+.L837:
+	.loc 1 1566 0
+	ldr	w0, [x28, 200]
+	cbz	w0, .L925
 .L838:
-	.loc 1 1544 0
-	ldr	w0, [x24, 200]
-	cbz	w0, .L916
-.L839:
-	.loc 1 1547 0
+	.loc 1 1569 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL811:
-	cbz	w0, .L840
-	.loc 1 1548 0
-	ldr	x0, [x24, 104]
+.LVL826:
+	cbz	w0, .L839
+.L933:
+	.loc 1 1570 0
+	ldr	x0, [x28, 104]
 	adrp	x1, .LC87
 	add	x1, x1, :lo12:.LC87
 	bl	_dev_err
-.LVL812:
-	.loc 1 1550 0
-	str	x26, [x24, 216]
-	.loc 1 1551 0
-	b	.L806
-.LVL813:
+.LVL827:
+	.loc 1 1572 0
+	str	x26, [x28, 216]
+.LVL828:
+.L805:
+	.loc 1 1607 0
+	ldr	x0, [x28, 224]
+	ldr	w0, [x0, 40]
+	cmp	w0, 20
+	beq	.L926
+.L844:
+	.loc 1 1613 0
+	cmp	w0, 18
+	beq	.L927
+.L845:
+	.loc 1 1622 0
+	mov	x0, x24
+	bl	ebc_remove_from_dsp_buf_list
+.LVL829:
+	.loc 1 1624 0
+	ldr	w0, [x28, 444]
+	cbnz	w0, .L928
+.L846:
+	.loc 1 1627 0
+	mov	w0, 1
+	str	w0, [x28, 444]
+.L847:
+	.loc 1 1629 0
+	ldr	x0, [x28, 224]
+	str	x0, [x28, 216]
+	.loc 1 1630 0
+	b	.L770
 	.p2align 3
-.L910:
-.LBB1806:
-	.loc 1 1612 0 discriminator 1
-	ldr	w0, [x24, 96]
-	cbnz	w0, .L849
-.LBB1807:
-	.loc 1 1612 0 is_stmt 0 discriminator 3
+.L918:
+.LBB1814:
+	.loc 1 1634 0 discriminator 1
+	ldr	w0, [x28, 96]
+	cbnz	w0, .L848
+.LBB1815:
+	.loc 1 1634 0 is_stmt 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL814:
-	b	.L853
+.LVL830:
+	b	.L852
 	.p2align 3
-.L917:
-.LBB1808:
-	.loc 1 1612 0 discriminator 7
-	ldr	w1, [x24, 96]
-	cbnz	w1, .L850
-.LVL815:
-	.loc 1 1612 0 discriminator 9
-	cbnz	x0, .L896
-	.loc 1 1612 0 discriminator 11
+.L929:
+.LBB1816:
+	.loc 1 1634 0 discriminator 7
+	ldr	w1, [x28, 96]
+	cbnz	w1, .L849
+.LVL831:
+	.loc 1 1634 0 discriminator 9
+	cbnz	x0, .L902
+	.loc 1 1634 0 discriminator 11
 	bl	schedule
-.LVL816:
-.L853:
-	.loc 1 1612 0 discriminator 13
+.LVL832:
+.L852:
+	.loc 1 1634 0 discriminator 13
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL817:
-	ldr	w1, [x24, 44]
-	cbnz	w1, .L917
-.L850:
-.LBE1808:
-	.loc 1 1612 0 discriminator 8
+.LVL833:
+	ldr	w1, [x28, 44]
+	cbnz	w1, .L929
+.L849:
+.LBE1816:
+	.loc 1 1634 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL818:
-	ldr	w0, [x24, 44]
-.LBE1807:
-.LBE1806:
-	.loc 1 1615 0 is_stmt 1 discriminator 8
-	cbnz	w0, .L896
-	.loc 1 1620 0
-	ldr	w0, [x24, 200]
+.LVL834:
+	ldr	w0, [x28, 44]
+.LBE1815:
+.LBE1814:
+	.loc 1 1637 0 is_stmt 1 discriminator 8
+	cbnz	w0, .L902
+	.loc 1 1642 0
+	ldr	w0, [x28, 200]
 	cmp	w0, 1
-	bne	.L896
+	bne	.L902
 	.p2align 2
-.L911:
-.LBB1809:
-.LBB1810:
+.L919:
+.LBB1817:
+.LBB1818:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
-.LVL819:
-	b	.L896
-.LVL820:
+.LVL835:
+	b	.L902
+.LVL836:
 	.p2align 3
-.L781:
-.LBE1810:
-.LBE1809:
-	.loc 1 1368 0
-	ldr	w0, [x24, 624]
-.LVL821:
+.L780:
+.LBE1818:
+.LBE1817:
+	.loc 1 1380 0
+	ldr	w0, [x28, 624]
+.LVL837:
 	cmp	w0, 0
 	ccmp	w1, 1, 4, ne
-	beq	.L776
-	.loc 1 1369 0
+	beq	.L775
+	.loc 1 1381 0
 	add	x25, x21, 704
-.LVL822:
+.LVL838:
 	mov	x0, x25
 	bl	down_write
-.LVL823:
-	.loc 1 1370 0
-	ldrsw	x2, [x24, 20]
-	ldr	x1, [x28, 16]
-	ldr	x0, [x24, 160]
+.LVL839:
+	.loc 1 1382 0
+	ldrsw	x2, [x28, 20]
+	ldr	x1, [x24, 16]
+	ldr	x0, [x28, 160]
 	bl	memcpy
-.LVL824:
-	.loc 1 1371 0
-	mov	x0, x28
+.LVL840:
+	.loc 1 1383 0
+	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL825:
-	.loc 1 1372 0
-	mov	x0, x28
+.LVL841:
+	.loc 1 1384 0
+	mov	x0, x24
 	bl	ebc_buf_release
-.LVL826:
-	.loc 1 1374 0
-	ldr	x1, [x24, 224]
-	mov	x4, x24
-	ldr	x0, [x24, 144]
-	ldp	x2, x3, [x24, 160]
+.LVL842:
+	.loc 1 1386 0
+	ldr	x1, [x28, 224]
+	mov	x4, x28
+	ldr	x0, [x28, 144]
+	ldp	x2, x3, [x28, 160]
 	ldr	w5, [x1, 40]
 	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
-.LVL827:
-	.loc 1 1377 0
+.LVL843:
+	.loc 1 1389 0
 	mov	x0, x25
 	bl	up_write
-.LVL828:
-	.loc 1 1378 0
-	ldr	w0, [x24, 44]
-	cbnz	w0, .L771
-	.loc 1 1381 0
-	ldr	w0, [x24, 200]
-	.loc 1 1379 0
+.LVL844:
+	.loc 1 1390 0
+	ldr	w0, [x28, 44]
+	cbnz	w0, .L770
+	.loc 1 1393 0
+	ldr	w0, [x28, 200]
+	.loc 1 1391 0
 	mov	w1, 1
-	.loc 1 1380 0
-	str	wzr, [x24, 92]
-	.loc 1 1379 0
-	str	w1, [x24, 44]
-	.loc 1 1381 0
-	cbz	w0, .L918
-.L782:
-	.loc 1 1383 0
-	ldr	x0, [x24, 104]
+	.loc 1 1392 0
+	str	wzr, [x28, 92]
+	.loc 1 1391 0
+	str	w1, [x28, 44]
+	.loc 1 1393 0
+	cbz	w0, .L930
+.L781:
+	.loc 1 1395 0
+	ldr	x0, [x28, 104]
 	adrp	x1, .LC81
-	ldrb	w2, [x24, 48]
+	ldrb	w2, [x28, 48]
 	add	x1, x1, :lo12:.LC81
 	bl	_dev_info
-.LVL829:
-	.loc 1 1384 0
+.LVL845:
+	.loc 1 1396 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL830:
-	b	.L771
+.LVL846:
+	b	.L770
 	.p2align 3
 .L794:
-	.loc 1 1405 0
-	ldr	w0, [x24, 620]
-	cbz	w0, .L798
-	.loc 1 1406 0
-	str	w2, [x24, 624]
-	.loc 1 1415 0
+	.loc 1 1466 0
 	add	x0, x21, 704
 	bl	down_write
-.LVL831:
-	.loc 1 1416 0
-	str	x28, [x24, 224]
-	.loc 1 1418 0
-	ldr	x0, [x24, 216]
-	ldr	w1, [x0, 40]
+.LVL847:
+	.loc 1 1472 0
+	ldr	x0, [x28, 216]
+	.loc 1 1467 0
+	str	x24, [x28, 224]
+	.loc 1 1473 0
+	ldr	w0, [x0, 40]
+	sub	w1, w0, #22
+	.loc 1 1475 0
 	cmp	w1, 1
-	bls	.L919
-	.loc 1 1420 0
-	ldr	x1, [x0, 16]
-	ldrsw	x2, [x24, 20]
-	ldr	x0, [x24, 144]
-	bl	memcpy
-.LVL832:
-	.loc 1 1421 0
-	ldr	x0, [x24, 216]
-	ldrsw	x2, [x24, 20]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x24, 152]
+	ccmp	w0, 1, 0, hi
+	bls	.L827
+	.loc 1 1476 0
+	ldrsw	x2, [x28, 20]
+	ldr	x1, [x24, 16]
+	ldr	x0, [x28, 144]
 	bl	memcpy
-.LVL833:
-	.loc 1 1422 0
-	ldr	x0, [x24, 216]
-	ldrsw	x2, [x24, 20]
+.LVL848:
+	.loc 1 1477 0
+	ldr	x0, [x28, 216]
+	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
-	ldr	x0, [x24, 160]
+	ldr	x0, [x28, 152]
 	bl	memcpy
-.LVL834:
-	ldr	x0, [x24, 224]
-.L801:
-.LBB1811:
-.LBB1812:
-	.loc 1 376 0
-	ldp	w3, w14, [x0, 48]
-	.loc 1 435 0
-	mov	w13, 234881024
-	.loc 1 377 0
-	ldp	w2, w17, [x0, 56]
-	.loc 1 374 0
-	cmp	w3, 0
-	.loc 1 379 0
-	ldr	w1, [x20, 256]
-	.loc 1 374 0
-	add	w15, w3, 7
-	csel	w15, w15, w3, lt
-	.loc 1 375 0
-	add	w8, w2, 7
-	cmp	w2, 0
-	.loc 1 379 0
-	add	w16, w1, 7
-	.loc 1 375 0
-	csel	w8, w8, w2, lt
-	.loc 1 379 0
-	cmp	w1, 0
-	csel	w16, w16, w1, lt
-	.loc 1 375 0
-	asr	w8, w8, 3
-	.loc 1 379 0
-	asr	w16, w16, 3
-.LVL835:
-	.loc 1 375 0
-	add	w8, w8, 1
-.LVL836:
-	ldr	w1, [x20, 252]
-	.loc 1 382 0
-	cmp	w8, w16
-.LBE1812:
-.LBE1811:
-	.loc 1 1427 0
-	ldr	x11, [x0, 16]
-.LBB1817:
-.LBB1813:
-	.loc 1 382 0
-	sub	w0, w16, #1
-	csel	w8, w0, w8, ge
-.LVL837:
-	.loc 1 384 0
-	cmp	w1, w17
-	sub	w1, w1, #1
-	.loc 1 441 0
-	mov	w12, -536870912
-	.loc 1 384 0
-	csel	w17, w1, w17, le
-	.loc 1 374 0
-	asr	w15, w15, 3
-.LVL838:
-	mul	w5, w14, w16
-	.loc 1 386 0
-	cmp	w14, w17
-.LBE1813:
-.LBE1817:
-	.loc 1 1427 0
-	ldr	x7, [x24, 144]
-	.loc 1 1428 0
-	ldp	x10, x9, [x24, 160]
-.LBB1818:
-.LBB1814:
-	.loc 1 386 0
-	bgt	.L809
-.LVL839:
-	.p2align 2
-.L879:
-	.loc 1 391 0
-	mov	w4, w15
-	cmp	w15, w8
-	ble	.L880
-	b	.L826
-.LVL840:
-	.p2align 3
-.L810:
-	.loc 1 404 0
-	tst	x2, 65280
-	bne	.L811
-	.loc 1 405 0
-	and	w26, w1, 240
-	cmp	w26, 224
-	beq	.L920
-	.loc 1 408 0
-	orr	w18, w18, 240
-.L811:
-	.loc 1 410 0
-	tst	x2, 16711680
-	bne	.L813
-	.loc 1 411 0
-	and	w26, w1, 3840
-	cmp	w26, 3584
-	beq	.L921
-	.loc 1 414 0
-	orr	w18, w18, 3840
-.L813:
-	.loc 1 416 0
-	tst	x2, 4278190080
-	bne	.L815
-	.loc 1 417 0
-	and	w26, w1, 61440
-	cmp	w26, 57344
-	beq	.L922
-	.loc 1 420 0
-	orr	w18, w18, 61440
-.L815:
-	.loc 1 422 0
-	tst	x2, 1095216660480
-	bne	.L817
-	.loc 1 423 0
-	and	w26, w1, 983040
-	cmp	w26, 917504
-	beq	.L923
-	.loc 1 426 0
-	orr	w18, w18, 983040
-.L817:
-	.loc 1 428 0
-	tst	x2, 280375465082880
-	bne	.L819
-	.loc 1 429 0
-	and	w26, w1, 15728640
-	cmp	w26, 14680064
-	beq	.L924
-	.loc 1 432 0
-	orr	w18, w18, 15728640
-.L819:
-	.loc 1 434 0
-	tst	x2, 71776119061217280
-	bne	.L821
-	.loc 1 435 0
-	and	w26, w1, 251658240
-	cmp	w26, w13
-	beq	.L925
-	.loc 1 438 0
-	orr	w18, w18, 251658240
-.L821:
-	.loc 1 440 0
-	tst	x2, -72057594037927936
-	bne	.L823
-	.loc 1 441 0
-	and	w2, w1, -268435456
-.LVL841:
-	cmp	w2, w12
-	beq	.L926
-	.loc 1 444 0
-	orr	w18, w18, -268435456
-.LVL842:
-.L823:
-	.loc 1 447 0
-	and	w1, w1, w25
-.LVL843:
-	.loc 1 391 0
-	add	w4, w4, 1
-	eor	w1, w1, w3
-	cmp	w4, w8
-	and	w1, w1, w18
-	.loc 1 447 0
-	eor	w1, w3, w1
-	.loc 1 448 0
-	str	w1, [x7, x0]
-	.loc 1 391 0
-	bgt	.L826
-.LVL844:
-.L880:
-	.loc 1 392 0
-	sxtw	x0, w4
-.LVL845:
-	.loc 1 396 0
-	mov	w18, 0
-	.loc 1 395 0
-	lsl	x1, x0, 3
-	.loc 1 392 0
-	lsl	x0, x0, 2
-.LVL846:
-	.loc 1 395 0
-	add	x1, x1, x5, sxtw 3
-	add	x0, x0, x5, sxtw 2
-	ldr	x2, [x9, x1]
-	.loc 1 392 0
-	ldr	w3, [x7, x0]
-	.loc 1 393 0
-	ldr	w1, [x11, x0]
-	.loc 1 398 0
-	and	x26, x2, 255
-.LVL847:
-	.loc 1 394 0
-	ldr	w25, [x10, x0]
-.LVL848:
-	.loc 1 398 0
-	cbnz	x26, .L810
 .LVL849:
-	.loc 1 399 0
-	and	w26, w1, 15
-	.loc 1 402 0
-	mov	w18, 15
-	.loc 1 399 0
-	cmp	w26, 14
-	bne	.L810
-	.loc 1 400 0
-	orr	w3, w3, w18
+	.loc 1 1483 0
+	add	x0, x21, 704
+	bl	up_write
 .LVL850:
-	.loc 1 396 0
-	mov	w18, 0
+	.loc 1 1485 0
+	ldr	w0, [x28, 44]
+	cbnz	w0, .L805
+	.loc 1 1486 0
+	mov	w0, 1
+	str	w0, [x28, 44]
+	.loc 1 1488 0
+	ldr	w0, [x28, 200]
+	.loc 1 1487 0
+	str	wzr, [x28, 92]
+	.loc 1 1488 0
+	cbz	w0, .L931
+.L829:
+	.loc 1 1490 0
+	mov	x0, x20
+	bl	ebc_lut_update
 .LVL851:
-	b	.L810
+	cmn	w0, #1
+	beq	.L932
+.L830:
+	.loc 1 1498 0
+	ldr	x0, [x28, 104]
+	adrp	x1, .LC88
+	.loc 1 1495 0
+	ldr	w3, [x28, 112]
+	.loc 1 1498 0
+	add	x1, x1, :lo12:.LC88
+	.loc 1 1495 0
+	strb	w3, [x28, 48]
 .LVL852:
+.L901:
+	.loc 1 1498 0
+	and	w2, w3, 255
+	.loc 1 1496 0
+	lsr	w3, w3, 8
+	strb	w3, [x28, 49]
+	.loc 1 1498 0
+	bl	_dev_info
+.LVL853:
+	.loc 1 1499 0
+	mov	x0, x20
+	bl	ebc_frame_start
+.LVL854:
+	b	.L805
+.LVL855:
+.L827:
+	.loc 1 1480 0
+	ldr	x1, [x24, 16]
+	mov	x3, x28
+	ldr	x0, [x28, 144]
+	ldr	x2, [x28, 168]
+	bl	refresh_new_image_auto
+.LVL856:
+	.loc 1 1483 0
+	add	x0, x21, 704
+	bl	up_write
+.LVL857:
+	.loc 1 1485 0
+	ldr	w0, [x28, 44]
+	cbnz	w0, .L805
+	.loc 1 1486 0
+	mov	w0, 1
+	str	w0, [x28, 44]
+	.loc 1 1488 0
+	ldr	w0, [x28, 200]
+	.loc 1 1487 0
+	str	wzr, [x28, 92]
+	.loc 1 1488 0
+	cbnz	w0, .L829
+.L931:
+	.loc 1 1489 0
+	mov	x0, x20
+	bl	ebc_power_set.constprop.11
+.LVL858:
+	.loc 1 1490 0
+	mov	x0, x20
+	bl	ebc_lut_update
+.LVL859:
+	cmn	w0, #1
+	bne	.L830
+.L932:
+	.loc 1 1491 0
+	ldr	x0, [x28, 104]
+	adrp	x1, .LC87
+	add	x1, x1, :lo12:.LC87
+	bl	_dev_err
+.LVL860:
+	.loc 1 1492 0
+	b	.L805
+.LVL861:
 	.p2align 3
-.L840:
-.LBE1814:
-.LBE1818:
-	.loc 1 1559 0
-	ldr	x0, [x24, 224]
+.L867:
+	.loc 1 1566 0
+	ldr	w0, [x28, 200]
+	.loc 1 1555 0
+	mov	w23, 0
+	.loc 1 1566 0
+	cbnz	w0, .L838
+.L925:
+	.loc 1 1567 0
+	mov	x0, x20
+	bl	ebc_power_set.constprop.11
+.LVL862:
+	.loc 1 1569 0
+	mov	x0, x20
+	bl	ebc_lut_update
+.LVL863:
+	cbnz	w0, .L933
+.L839:
+	.loc 1 1581 0
+	ldr	x0, [x28, 224]
 	adrp	x1, .LC89
-	.loc 1 1556 0
-	ldr	w3, [x24, 112]
-	.loc 1 1559 0
+	.loc 1 1578 0
+	ldr	w3, [x28, 112]
+	.loc 1 1581 0
 	add	x1, x1, :lo12:.LC89
-	.loc 1 1556 0
-	strb	w3, [x24, 48]
-	.loc 1 1559 0
+	.loc 1 1578 0
+	strb	w3, [x28, 48]
+	.loc 1 1581 0
 	and	w3, w3, 255
 	ldr	w2, [x0, 40]
-	ldr	x0, [x24, 104]
+	ldr	x0, [x28, 104]
 	bl	_dev_info
-.LVL853:
-	.loc 1 1560 0
+.LVL864:
+	.loc 1 1582 0
 	mov	w0, 1
-	str	w0, [x24, 44]
-	.loc 1 1561 0
+	str	w0, [x28, 44]
+	.loc 1 1583 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL854:
-	.loc 1 1563 0
+.LVL865:
+	.loc 1 1585 0
 	ldr	x1, [x25, #:lo12:jiffies]
 	add	x0, x20, 688
 	str	x0, [x29, 104]
 	add	x1, x1, 900
 	bl	mod_timer
-.LVL855:
+.LVL866:
 .LBB1819:
-	.loc 1 1564 0
-	ldr	w0, [x24, 92]
-	cbz	w0, .L927
-.L843:
-.LVL856:
-.L841:
+	.loc 1 1586 0
+	ldr	w0, [x28, 92]
+	cbz	w0, .L934
+.L842:
+.LVL867:
+.L840:
 .LBE1819:
-	.loc 1 1566 0 discriminator 11
+	.loc 1 1588 0 discriminator 11
 	ldr	x2, [x25, #:lo12:jiffies]
 	mov	x1, 402653184
 	ldr	x0, [x29, 104]
-.LVL857:
+.LVL868:
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL858:
-	.loc 1 1567 0 discriminator 11
-	str	wzr, [x24, 92]
-	.loc 1 1569 0 discriminator 11
-	str	x26, [x24, 216]
-	.loc 1 1571 0 discriminator 11
-	b	.L806
-.LVL859:
-	.p2align 3
-.L868:
-	.loc 1 1544 0
-	ldr	w0, [x24, 200]
-	.loc 1 1533 0
-	mov	w23, 0
-	.loc 1 1544 0
-	cbnz	w0, .L839
-.L916:
-	.loc 1 1545 0
-	mov	x0, x20
-	bl	ebc_power_set.constprop.11
-.LVL860:
-	b	.L839
-.L798:
-	.loc 1 1409 0
-	ldr	x0, [x24, 104]
+.LVL869:
+	.loc 1 1589 0 discriminator 11
+	str	wzr, [x28, 92]
+	.loc 1 1591 0 discriminator 11
+	str	x26, [x28, 216]
+	.loc 1 1593 0 discriminator 11
+	b	.L805
+.LVL870:
+.L797:
+	.loc 1 1421 0
+	ldr	x0, [x28, 104]
 	adrp	x1, .LC85
 	add	x1, x1, :lo12:.LC85
 	bl	_dev_info
-.LVL861:
-	.loc 1 1410 0
-	mov	x0, x28
+.LVL871:
+	.loc 1 1422 0
+	mov	x0, x24
 	bl	ebc_remove_from_dsp_buf_list
-.LVL862:
-	.loc 1 1411 0
-	mov	x0, x28
+.LVL872:
+	.loc 1 1423 0
+	mov	x0, x24
 	bl	ebc_buf_release
-.LVL863:
-	.loc 1 1413 0
-	b	.L771
-.L904:
-	.loc 1 1466 0
-	mov	w0, 1
-	str	w0, [x24, 44]
-	.loc 1 1468 0
-	ldr	w0, [x24, 200]
-	.loc 1 1467 0
-	str	wzr, [x24, 92]
-	.loc 1 1468 0
-	cbz	w0, .L928
-	.loc 1 1470 0
-	mov	x0, x20
-	bl	ebc_lut_update
-.LVL864:
-	cmn	w0, #1
-	beq	.L929
-.L831:
-	.loc 1 1478 0
-	ldr	x0, [x24, 104]
-	adrp	x1, .LC88
-	.loc 1 1475 0
-	ldr	w3, [x24, 112]
-	.loc 1 1478 0
-	add	x1, x1, :lo12:.LC88
-	.loc 1 1475 0
-	strb	w3, [x24, 48]
-.LVL865:
-.L895:
-	.loc 1 1478 0
-	and	w2, w3, 255
-	.loc 1 1476 0
-	lsr	w3, w3, 8
-	strb	w3, [x24, 49]
-	.loc 1 1478 0
-	bl	_dev_info
-.LVL866:
-	.loc 1 1479 0
-	mov	x0, x20
-	bl	ebc_frame_start
-.LVL867:
-	b	.L806
-.LVL868:
-.L903:
-	.loc 1 1397 0
-	ldr	x0, [x24, 104]
+.LVL873:
+	.loc 1 1425 0
+	b	.L770
+.L909:
+	.loc 1 1409 0
+	ldr	x0, [x28, 104]
 	adrp	x1, .LC83
 	add	x1, x1, :lo12:.LC83
 	bl	_dev_info
-.LVL869:
+.LVL874:
 .LBB1823:
-	.loc 1 1398 0
-	ldr	w0, [x24, 92]
-	cbz	w0, .L930
-.L789:
-.LVL870:
-.L787:
+	.loc 1 1410 0
+	ldr	w0, [x28, 92]
+	cbz	w0, .L935
+.L788:
+.LVL875:
+.L786:
 .LBE1823:
-	.loc 1 1399 0 discriminator 11
-	ldr	x0, [x24, 104]
-.LVL871:
+	.loc 1 1411 0 discriminator 11
+	ldr	x0, [x28, 104]
+.LVL876:
 	adrp	x1, .LC84
 	add	x1, x1, :lo12:.LC84
 	bl	_dev_info
-.LVL872:
-	b	.L894
-.LVL873:
-.L906:
-	.loc 1 1595 0
-	ldr	x0, [x24, 104]
-	.loc 1 1593 0
+.LVL877:
+	b	.L900
+.L910:
+	.loc 1 1439 0
+	cmp	w0, 0
+	mov	x0, x24
+	ccmp	w1, 1, 0, ne
+	bhi	.L800
+	.loc 1 1440 0
+	ldrsw	x2, [x28, 20]
+	ldp	x1, x0, [x28, 152]
+	bl	memcpy
+.LVL878:
+	ldr	x0, [x28, 224]
+	b	.L800
+.LVL879:
+	.p2align 3
+.L917:
+.LBB1827:
+.LBB1803:
+	.loc 1 444 0
+	orr	w3, w3, -268435456
+.LVL880:
+	.loc 1 449 0
+	and	w1, w1, w26
+.LVL881:
+	eor	w1, w1, w3
+.LVL882:
+	.loc 1 393 0
+	add	w4, w4, 1
+	and	w1, w1, w25
+	cmp	w4, w9
+	.loc 1 449 0
+	eor	w1, w3, w1
+	.loc 1 450 0
+	str	w1, [x8, x0]
+	.loc 1 393 0
+	ble	.L883
+.LVL883:
+	.p2align 2
+.L825:
+	.loc 1 388 0
+	add	w15, w15, 1
+	add	w5, w5, w17
+	cmp	w15, w18
+	ble	.L882
+.L808:
+.LBE1803:
+.LBE1827:
+	.loc 1 1446 0
+	add	x0, x21, 704
+	bl	up_write
+.LVL884:
+	.loc 1 1447 0
+	ldr	w0, [x28, 44]
+	cbnz	w0, .L805
+	.loc 1 1448 0
+	mov	w0, 1
+	str	w0, [x28, 44]
+	.loc 1 1450 0
+	ldr	w0, [x28, 200]
+	.loc 1 1449 0
+	str	wzr, [x28, 92]
+	.loc 1 1450 0
+	cbz	w0, .L936
+.L826:
+	.loc 1 1452 0
+	mov	x0, x20
+	bl	ebc_lut_update
+.LVL885:
+	cmn	w0, #1
+	beq	.L805
+	.loc 1 1456 0
+	ldr	w3, [x28, 112]
+	.loc 1 1459 0
+	adrp	x1, .LC86
+	.loc 1 1456 0
+	strb	w3, [x28, 48]
+	.loc 1 1459 0
+	add	x1, x1, :lo12:.LC86
+	ldr	x0, [x28, 104]
+	b	.L901
+.LVL886:
+	.p2align 3
+.L911:
+.LBB1828:
+.LBB1804:
+	.loc 1 408 0
+	orr	w3, w3, 240
+	b	.L810
+	.p2align 3
+.L912:
+	.loc 1 414 0
+	orr	w3, w3, 3840
+	b	.L812
+	.p2align 3
+.L913:
+	.loc 1 420 0
+	orr	w3, w3, 61440
+	b	.L814
+	.p2align 3
+.L914:
+	.loc 1 426 0
+	orr	w3, w3, 983040
+	b	.L816
+	.p2align 3
+.L915:
+	.loc 1 432 0
+	orr	w3, w3, 15728640
+	b	.L818
+	.p2align 3
+.L916:
+	.loc 1 438 0
+	orr	w3, w3, 251658240
+	b	.L820
+.LVL887:
+.L927:
+.LBE1804:
+.LBE1828:
+	.loc 1 1617 0
+	ldr	x0, [x28, 104]
+	.loc 1 1615 0
 	mov	w25, 1
-.LVL874:
-	.loc 1 1592 0
-	str	wzr, [x24, 204]
-	.loc 1 1595 0
+.LVL888:
+	.loc 1 1614 0
+	str	wzr, [x28, 204]
+	.loc 1 1617 0
 	adrp	x1, .LC92
-	.loc 1 1593 0
-	str	w25, [x24, 608]
-	.loc 1 1595 0
+	.loc 1 1615 0
+	str	w25, [x28, 608]
+	.loc 1 1617 0
 	add	x1, x1, :lo12:.LC92
-	.loc 1 1594 0
-	str	wzr, [x24, 624]
-	.loc 1 1595 0
+	.loc 1 1616 0
+	str	wzr, [x28, 624]
+	.loc 1 1617 0
 	bl	_dev_info
-.LVL875:
-	.loc 1 1596 0
+.LVL889:
+	.loc 1 1618 0
 	mov	x0, 2
 	bl	ebc_notify
-.LVL876:
-	.loc 1 1597 0
+.LVL890:
+	.loc 1 1619 0
 	mov	w2, w25
 	mov	w1, w25
 	add	x0, x21, 328
 	bl	__wake_up_sync
-.LVL877:
-	b	.L846
-.LVL878:
-.L902:
-	.loc 1 1351 0
-	str	wzr, [x24, 608]
-	.loc 1 1352 0
+.LVL891:
+	b	.L845
+.LVL892:
+.L908:
+	.loc 1 1363 0
+	str	wzr, [x28, 608]
+	.loc 1 1364 0
 	mov	x0, 3
-.LVL879:
+.LVL893:
 	bl	ebc_notify
-.LVL880:
-	.loc 1 1353 0
-	ldr	x0, [x24, 104]
+.LVL894:
+	.loc 1 1365 0
+	ldr	x0, [x28, 104]
 	adrp	x1, .LC79
 	add	x1, x1, :lo12:.LC79
 	bl	_dev_info
-.LVL881:
-	b	.L776
-.LVL882:
-.L927:
-.LBB1827:
+.LVL895:
+	b	.L775
+.LVL896:
+.L934:
+.LBB1829:
 .LBB1820:
 .LBB1821:
-	.loc 1 1564 0 discriminator 1
+	.loc 1 1586 0 discriminator 1
 	add	x27, x21, 352
 .LBE1821:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL883:
-	b	.L844
+.LVL897:
+	b	.L843
 	.p2align 3
-.L931:
-.LVL884:
+.L937:
+.LVL898:
 .LBB1822:
-	.loc 1 1564 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L841
-	.loc 1 1564 0 discriminator 7
+	.loc 1 1586 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L840
+	.loc 1 1586 0 discriminator 7
 	bl	schedule
-.LVL885:
-.L844:
-	.loc 1 1564 0 discriminator 9
+.LVL899:
+.L843:
+	.loc 1 1586 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x27
 	bl	prepare_to_wait_event
-.LVL886:
-	ldr	w1, [x24, 92]
-	cbz	w1, .L931
+.LVL900:
+	ldr	w1, [x28, 92]
+	cbz	w1, .L937
 .LBE1822:
-	.loc 1 1564 0 discriminator 4
+	.loc 1 1586 0 discriminator 4
 	mov	x0, x27
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL887:
-	b	.L841
-.L919:
+.LVL901:
+	b	.L840
+.LVL902:
+.L935:
 .LBE1820:
-.LBE1827:
-	mov	x0, x28
-	.loc 1 1423 0 is_stmt 1
-	cbnz	w1, .L801
-	.loc 1 1424 0
-	ldrsw	x2, [x24, 20]
-	ldp	x1, x0, [x24, 152]
-	bl	memcpy
-.LVL888:
-	ldr	x0, [x24, 224]
-	b	.L801
-.L930:
-.LBB1828:
+.LBE1829:
+.LBB1830:
 .LBB1824:
 .LBB1825:
-	.loc 1 1398 0 discriminator 1
+	.loc 1 1410 0 is_stmt 1 discriminator 1
 	add	x26, x21, 352
-.LVL889:
+.LVL903:
 .LBE1825:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL890:
-	b	.L790
+.LVL904:
+	b	.L789
 	.p2align 3
-.L932:
-.LVL891:
+.L938:
+.LVL905:
 .LBB1826:
-	.loc 1 1398 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L787
-	.loc 1 1398 0 discriminator 7
+	.loc 1 1410 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L786
+	.loc 1 1410 0 discriminator 7
 	bl	schedule
-.LVL892:
-.L790:
-	.loc 1 1398 0 discriminator 9
+.LVL906:
+.L789:
+	.loc 1 1410 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x26
 	bl	prepare_to_wait_event
-.LVL893:
-	ldr	w1, [x24, 92]
-	cbz	w1, .L932
+.LVL907:
+	ldr	w1, [x28, 92]
+	cbz	w1, .L938
 .LBE1826:
-	.loc 1 1398 0 discriminator 4
+	.loc 1 1410 0 discriminator 4
 	mov	x0, x26
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL894:
-	b	.L787
-.LVL895:
-	.p2align 3
-.L920:
-.LBE1824:
-.LBE1828:
-.LBB1829:
-.LBB1815:
-	.loc 1 406 0 is_stmt 1
-	orr	w3, w3, 240
-	b	.L811
-	.p2align 3
+.LVL908:
+	b	.L786
+.LVL909:
 .L921:
-	.loc 1 412 0
-	orr	w3, w3, 3840
-	b	.L813
-	.p2align 3
-.L922:
-	.loc 1 418 0
-	orr	w3, w3, 61440
-	b	.L815
-	.p2align 3
-.L923:
-	.loc 1 424 0
-	orr	w3, w3, 983040
-	b	.L817
-.LVL896:
-	.p2align 3
-.L926:
-	.loc 1 442 0
-	orr	w3, w3, -268435456
-.LVL897:
-	.loc 1 447 0
-	and	w1, w1, w25
-.LVL898:
-	eor	w1, w1, w3
-.LVL899:
-	.loc 1 391 0
-	add	w4, w4, 1
-	and	w1, w1, w18
-	cmp	w4, w8
-	.loc 1 447 0
-	eor	w1, w3, w1
-	.loc 1 448 0
-	str	w1, [x7, x0]
-	.loc 1 391 0
-	ble	.L880
-.LVL900:
-	.p2align 2
-.L826:
-	.loc 1 386 0
-	add	w14, w14, 1
-	add	w5, w5, w16
-	cmp	w14, w17
-	ble	.L879
-.L809:
-.LBE1815:
-.LBE1829:
-	.loc 1 1430 0
-	add	x0, x21, 704
-	bl	up_write
-.LVL901:
-	.loc 1 1431 0
-	ldr	w0, [x24, 44]
-	cbnz	w0, .L806
-	.loc 1 1432 0
-	mov	w0, 1
-	str	w0, [x24, 44]
-	.loc 1 1434 0
-	ldr	w0, [x24, 200]
-	.loc 1 1433 0
-	str	wzr, [x24, 92]
-	.loc 1 1434 0
-	cbz	w0, .L933
-.L827:
-	.loc 1 1436 0
-	mov	x0, x20
-	bl	ebc_lut_update
-.LVL902:
-	cmn	w0, #1
-	beq	.L806
-	.loc 1 1440 0
-	ldr	w3, [x24, 112]
-	.loc 1 1443 0
-	adrp	x1, .LC86
-	.loc 1 1440 0
-	strb	w3, [x24, 48]
-	.loc 1 1443 0
-	add	x1, x1, :lo12:.LC86
-	ldr	x0, [x24, 104]
-	b	.L895
-.LVL903:
-	.p2align 3
-.L924:
-.LBB1830:
-.LBB1816:
-	.loc 1 430 0
-	orr	w3, w3, 15728640
-	b	.L819
-	.p2align 3
-.L925:
-	.loc 1 436 0
-	orr	w3, w3, 251658240
-	b	.L821
-.LVL904:
-.L828:
-.LBE1816:
+.LBE1824:
 .LBE1830:
-	.loc 1 1460 0
-	ldr	x0, [x24, 144]
-	mov	x3, x24
-	ldr	x2, [x24, 168]
-	ldr	x1, [x28, 16]
-	bl	refresh_new_image_auto
-.LVL905:
-	b	.L829
-.LVL906:
-.L908:
 .LBB1831:
 .LBB1832:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
-.LVL907:
-	b	.L773
-.LVL908:
-.L928:
+.LVL910:
+	b	.L772
+.L936:
 .LBE1832:
 .LBE1831:
-	.loc 1 1469 0
+	.loc 1 1451 0 is_stmt 1
 	mov	x0, x20
 	bl	ebc_power_set.constprop.11
-.LVL909:
-	.loc 1 1470 0
-	mov	x0, x20
-	bl	ebc_lut_update
-.LVL910:
-	cmn	w0, #1
-	bne	.L831
-.L929:
-	.loc 1 1471 0
-	ldr	x0, [x24, 104]
-	adrp	x1, .LC87
-	add	x1, x1, :lo12:.LC87
-	bl	_dev_err
 .LVL911:
-	.loc 1 1472 0
-	b	.L806
+	b	.L826
 .LVL912:
-.L933:
-	.loc 1 1435 0
+.L930:
+	.loc 1 1394 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.11
 .LVL913:
-	b	.L827
+	b	.L781
 .LVL914:
-.L918:
-	.loc 1 1382 0
-	mov	x0, x20
-	bl	ebc_power_set.constprop.11
-.LVL915:
-	b	.L782
-.LVL916:
-.L909:
-	.loc 1 1630 0
+.L922:
+	.loc 1 1652 0
 	bl	__stack_chk_fail
-.LVL917:
+.LVL915:
 	.cfi_endproc
 .LFE2826:
 	.size	ebc_thread, .-ebc_thread
@@ -10085,24 +10118,24 @@ ebc_auto_task:
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.34978, %object
-	.size	__func__.34978, 11
-__func__.34978:
+	.type	__func__.34990, %object
+	.size	__func__.34990, 11
+__func__.34990:
 	.string	"ebc_io_ctl"
 	.align	3
 	.set	.LANCHOR3,. + 0
-	.type	__func__.34776, %object
-	.size	__func__.34776, 16
-__func__.34776:
+	.type	__func__.34778, %object
+	.size	__func__.34778, 16
+__func__.34778:
 	.string	"ebc_frame_start"
-	.type	__func__.35288, %object
-	.size	__func__.35288, 12
-__func__.35288:
+	.type	__func__.35300, %object
+	.size	__func__.35300, 12
+__func__.35300:
 	.string	"ebc_suspend"
 	.zero	4
-	.type	__func__.35222, %object
-	.size	__func__.35222, 19
-__func__.35222:
+	.type	__func__.35234, %object
+	.size	__func__.35234, 19
+__func__.35234:
 	.string	"ebc_lut_table_init"
 	.zero	5
 	.type	ebc_match, %object
@@ -10142,9 +10175,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init2570, %object
-	.size	__addressable_ebc_init2570, 8
-__addressable_ebc_init2570:
+	.type	__addressable_ebc_init2592, %object
+	.size	__addressable_ebc_init2592, 8
+__addressable_ebc_init2592:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -10202,7 +10235,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC16:
-	.string	"2.11"
+	.string	"2.12"
 	.zero	3
 .LC17:
 	.string	"%s\n"
@@ -10653,15 +10686,15 @@ __exitcall_ebc_exit:
 	.file 214 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x14730
+	.4byte	0x14756
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF3297
-	.byte	0x1
-	.4byte	.LASF3298
 	.4byte	.LASF3299
+	.byte	0x1
+	.4byte	.LASF3300
+	.4byte	.LASF3301
 	.4byte	.Ldebug_ranges0+0x1190
 	.8byte	0
 	.4byte	.Ldebug_line0
@@ -28212,7 +28245,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x3
 	.4byte	0x9224
 	.uleb128 0x46
-	.4byte	.LASF3028
+	.4byte	.LASF3030
 	.byte	0x1f
 	.2byte	0xba2
 	.4byte	0x9234
@@ -32681,121 +32714,121 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2399
 	.byte	0xa
 	.byte	0x85
-	.4byte	0xdc58
+	.4byte	0xdc64
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF2400
 	.byte	0xa
 	.byte	0x88
-	.4byte	0xdc7d
+	.4byte	0xdc89
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF109
 	.byte	0xa
 	.byte	0x8b
-	.4byte	0xdcab
+	.4byte	0xdcb7
 	.byte	0x10
 	.uleb128 0xe
 	.4byte	.LASF2401
 	.byte	0xa
 	.byte	0x8f
-	.4byte	0xdcdf
+	.4byte	0xdceb
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF2402
 	.byte	0xa
 	.byte	0x92
-	.4byte	0xdd0d
+	.4byte	0xdd19
 	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF2403
 	.byte	0xa
 	.byte	0x96
-	.4byte	0xdd32
+	.4byte	0xdd3e
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF2404
 	.byte	0xa
 	.byte	0x9d
-	.4byte	0xdd5b
+	.4byte	0xdd67
 	.byte	0x30
 	.uleb128 0xe
 	.4byte	.LASF2405
 	.byte	0xa
 	.byte	0xa0
-	.4byte	0xdd80
+	.4byte	0xdd8c
 	.byte	0x38
 	.uleb128 0xe
 	.4byte	.LASF2406
 	.byte	0xa
 	.byte	0xa4
-	.4byte	0xdda9
+	.4byte	0xddb5
 	.byte	0x40
 	.uleb128 0xe
 	.4byte	.LASF2407
 	.byte	0xa
 	.byte	0xa7
-	.4byte	0xdd32
+	.4byte	0xdd3e
 	.byte	0x48
 	.uleb128 0xe
 	.4byte	.LASF2408
 	.byte	0xa
 	.byte	0xaa
-	.4byte	0xddc9
+	.4byte	0xddd5
 	.byte	0x50
 	.uleb128 0xe
 	.4byte	.LASF2409
 	.byte	0xa
 	.byte	0xad
-	.4byte	0xddc9
+	.4byte	0xddd5
 	.byte	0x58
 	.uleb128 0xe
 	.4byte	.LASF2410
 	.byte	0xa
 	.byte	0xb0
-	.4byte	0xdde9
+	.4byte	0xddf5
 	.byte	0x60
 	.uleb128 0xe
 	.4byte	.LASF2411
 	.byte	0xa
 	.byte	0xb3
-	.4byte	0xdde9
+	.4byte	0xddf5
 	.byte	0x68
 	.uleb128 0xe
 	.4byte	.LASF2412
 	.byte	0xa
 	.byte	0xb6
-	.4byte	0xde09
+	.4byte	0xde15
 	.byte	0x70
 	.uleb128 0xe
 	.4byte	.LASF2413
 	.byte	0xa
 	.byte	0xb8
-	.4byte	0xde23
+	.4byte	0xde2f
 	.byte	0x78
 	.uleb128 0xe
 	.4byte	.LASF2414
 	.byte	0xa
 	.byte	0xb9
-	.4byte	0xde3d
+	.4byte	0xde49
 	.byte	0x80
 	.uleb128 0xe
 	.4byte	.LASF2415
 	.byte	0xa
 	.byte	0xba
-	.4byte	0xde3d
+	.4byte	0xde49
 	.byte	0x88
 	.uleb128 0xe
 	.4byte	.LASF2416
 	.byte	0xa
 	.byte	0xbb
-	.4byte	0xde66
+	.4byte	0xde72
 	.byte	0x90
 	.uleb128 0xe
 	.4byte	.LASF2417
 	.byte	0xa
 	.byte	0xbd
-	.4byte	0xde81
+	.4byte	0xde8d
 	.byte	0x98
 	.uleb128 0xe
 	.4byte	.LASF130
@@ -36884,7 +36917,7 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0xc4
 	.byte	0x3b
-	.4byte	0xda06
+	.4byte	0xda12
 	.uleb128 0xc
 	.4byte	.LASF2874
 	.byte	0
@@ -36951,86 +36984,92 @@ __exitcall_ebc_exit:
 	.uleb128 0xc
 	.4byte	.LASF2895
 	.byte	0x15
+	.uleb128 0xc
+	.4byte	.LASF2896
+	.byte	0x16
+	.uleb128 0xc
+	.4byte	.LASF2897
+	.byte	0x17
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2896
+	.4byte	.LASF2898
 	.byte	0x2c
 	.byte	0xc4
-	.byte	0x57
-	.4byte	0xda97
+	.byte	0x59
+	.4byte	0xdaa3
 	.uleb128 0xe
 	.4byte	.LASF884
 	.byte	0xc4
-	.byte	0x58
+	.byte	0x5a
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2897
+	.4byte	.LASF2899
 	.byte	0xc4
-	.byte	0x59
+	.byte	0x5b
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF2898
+	.4byte	.LASF2900
 	.byte	0xc4
-	.byte	0x5a
+	.byte	0x5c
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF262
 	.byte	0xc4
-	.byte	0x5b
+	.byte	0x5d
 	.4byte	0xc6
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF2899
+	.4byte	.LASF2901
 	.byte	0xc4
-	.byte	0x5c
+	.byte	0x5e
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
 	.4byte	.LASF2869
 	.byte	0xc4
-	.byte	0x5d
+	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
 	.4byte	.LASF2870
 	.byte	0xc4
-	.byte	0x5e
+	.byte	0x60
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF2871
 	.byte	0xc4
-	.byte	0x5f
+	.byte	0x61
 	.4byte	0xc6
 	.byte	0x1c
 	.uleb128 0xe
 	.4byte	.LASF2872
 	.byte	0xc4
-	.byte	0x60
+	.byte	0x62
 	.4byte	0xc6
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2900
+	.4byte	.LASF2902
 	.byte	0xc4
-	.byte	0x61
+	.byte	0x63
 	.4byte	0xc6
 	.byte	0x24
 	.uleb128 0xe
-	.4byte	.LASF2901
+	.4byte	.LASF2903
 	.byte	0xc4
-	.byte	0x62
+	.byte	0x64
 	.4byte	0xc6
 	.byte	0x28
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2902
+	.4byte	.LASF2904
 	.byte	0x50
 	.byte	0x3
 	.byte	0x10
-	.4byte	0xdb10
+	.4byte	0xdb1c
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x3
@@ -37038,134 +37077,134 @@ __exitcall_ebc_exit:
 	.4byte	0xa570
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2903
+	.4byte	.LASF2905
 	.byte	0x3
 	.byte	0x12
 	.4byte	0x47d8
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2904
+	.4byte	.LASF2906
 	.byte	0x3
 	.byte	0x13
 	.4byte	0x458
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2905
+	.4byte	.LASF2907
 	.byte	0x3
 	.byte	0x14
-	.4byte	0xdb26
+	.4byte	0xdb32
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2906
+	.4byte	.LASF2908
 	.byte	0x3
 	.byte	0x15
-	.4byte	0xdb37
+	.4byte	0xdb43
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2907
+	.4byte	.LASF2909
 	.byte	0x3
 	.byte	0x16
-	.4byte	0xdb37
+	.4byte	0xdb43
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2908
+	.4byte	.LASF2910
 	.byte	0x3
 	.byte	0x17
-	.4byte	0xdb51
+	.4byte	0xdb5d
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2909
+	.4byte	.LASF2911
 	.byte	0x3
 	.byte	0x18
-	.4byte	0xdb66
+	.4byte	0xdb72
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2910
+	.4byte	.LASF2912
 	.byte	0x3
 	.byte	0x19
-	.4byte	0xdb80
+	.4byte	0xdb8c
 	.byte	0x48
 	.byte	0
 	.uleb128 0x10
-	.4byte	0xdb20
+	.4byte	0xdb2c
 	.uleb128 0x11
-	.4byte	0xdb20
+	.4byte	0xdb2c
 	.uleb128 0x11
 	.4byte	0x2b0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xda97
+	.4byte	0xdaa3
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb10
+	.4byte	0xdb1c
 	.uleb128 0x10
-	.4byte	0xdb37
+	.4byte	0xdb43
 	.uleb128 0x11
-	.4byte	0xdb20
+	.4byte	0xdb2c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb2c
+	.4byte	0xdb38
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdb51
+	.4byte	0xdb5d
 	.uleb128 0x11
-	.4byte	0xdb20
+	.4byte	0xdb2c
 	.uleb128 0x11
 	.4byte	0x467e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb3d
+	.4byte	0xdb49
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdb66
+	.4byte	0xdb72
 	.uleb128 0x11
-	.4byte	0xdb20
+	.4byte	0xdb2c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb57
+	.4byte	0xdb63
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdb80
+	.4byte	0xdb8c
 	.uleb128 0x11
-	.4byte	0xdb20
+	.4byte	0xdb2c
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb6c
+	.4byte	0xdb78
 	.uleb128 0x1f
-	.4byte	.LASF2911
+	.4byte	.LASF2913
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc5
 	.byte	0x5
-	.4byte	0xdbaf
+	.4byte	0xdbbb
 	.uleb128 0xc
-	.4byte	.LASF2912
+	.4byte	.LASF2914
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2913
+	.4byte	.LASF2915
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2914
+	.4byte	.LASF2916
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2915
+	.4byte	.LASF2917
 	.byte	0x3
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2916
+	.4byte	.LASF2918
 	.byte	0x20
 	.byte	0xc6
 	.byte	0xb
-	.4byte	0xdbf8
+	.4byte	0xdc04
 	.uleb128 0xe
-	.4byte	.LASF2917
+	.4byte	.LASF2919
 	.byte	0xc6
 	.byte	0xc
 	.4byte	0x29
@@ -37183,38 +37222,38 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF2918
+	.4byte	.LASF2920
 	.byte	0xc6
 	.byte	0xf
 	.4byte	0x325
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2919
+	.4byte	.LASF2921
 	.byte	0xc6
 	.byte	0x11
 	.4byte	0x6d
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2920
+	.4byte	.LASF2922
 	.byte	0x10
 	.byte	0xc6
 	.byte	0x2a
-	.4byte	0xdc29
+	.4byte	0xdc35
 	.uleb128 0x20
 	.string	"sgl"
 	.byte	0xc6
 	.byte	0x2b
-	.4byte	0xdc29
+	.4byte	0xdc35
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2921
+	.4byte	.LASF2923
 	.byte	0xc6
 	.byte	0x2c
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2922
+	.4byte	.LASF2924
 	.byte	0xc6
 	.byte	0x2d
 	.4byte	0x6d
@@ -37222,16 +37261,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdbaf
+	.4byte	0xdbbb
 	.uleb128 0x14
 	.4byte	0x458
-	.4byte	0xdc52
+	.4byte	0xdc5e
 	.uleb128 0x11
 	.4byte	0xa570
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdc52
+	.4byte	0xdc5e
 	.uleb128 0x11
 	.4byte	0x330
 	.uleb128 0x11
@@ -37242,9 +37281,9 @@ __exitcall_ebc_exit:
 	.4byte	0x325
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc2f
+	.4byte	0xdc3b
 	.uleb128 0x10
-	.4byte	0xdc7d
+	.4byte	0xdc89
 	.uleb128 0x11
 	.4byte	0xa570
 	.uleb128 0x11
@@ -37258,10 +37297,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc5e
+	.4byte	0xdc6a
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdcab
+	.4byte	0xdcb7
 	.uleb128 0x11
 	.4byte	0xa570
 	.uleb128 0x11
@@ -37277,14 +37316,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc83
+	.4byte	0xdc8f
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdcd9
+	.4byte	0xdce5
 	.uleb128 0x11
 	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0xdcd9
+	.4byte	0xdce5
 	.uleb128 0x11
 	.4byte	0x458
 	.uleb128 0x11
@@ -37296,13 +37335,13 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdbf8
+	.4byte	0xdc04
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdcb1
+	.4byte	0xdcbd
 	.uleb128 0x14
 	.4byte	0x325
-	.4byte	0xdd0d
+	.4byte	0xdd19
 	.uleb128 0x11
 	.4byte	0xa570
 	.uleb128 0x11
@@ -37312,15 +37351,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdb86
+	.4byte	0xdb92
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdce5
+	.4byte	0xdcf1
 	.uleb128 0x10
-	.4byte	0xdd32
+	.4byte	0xdd3e
 	.uleb128 0x11
 	.4byte	0xa570
 	.uleb128 0x11
@@ -37328,49 +37367,49 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdb86
+	.4byte	0xdb92
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd13
+	.4byte	0xdd1f
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdd5b
+	.4byte	0xdd67
 	.uleb128 0x11
 	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0xdc29
+	.4byte	0xdc35
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdb86
+	.4byte	0xdb92
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd38
+	.4byte	0xdd44
 	.uleb128 0x10
-	.4byte	0xdd80
+	.4byte	0xdd8c
 	.uleb128 0x11
 	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0xdc29
+	.4byte	0xdc35
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdb86
+	.4byte	0xdb92
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd61
+	.4byte	0xdd6d
 	.uleb128 0x14
 	.4byte	0x325
-	.4byte	0xdda9
+	.4byte	0xddb5
 	.uleb128 0x11
 	.4byte	0xa570
 	.uleb128 0x11
@@ -37378,15 +37417,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdb86
+	.4byte	0xdb92
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd86
+	.4byte	0xdd92
 	.uleb128 0x10
-	.4byte	0xddc9
+	.4byte	0xddd5
 	.uleb128 0x11
 	.4byte	0xa570
 	.uleb128 0x11
@@ -37394,27 +37433,27 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdb86
+	.4byte	0xdb92
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xddaf
+	.4byte	0xddbb
 	.uleb128 0x10
-	.4byte	0xdde9
+	.4byte	0xddf5
 	.uleb128 0x11
 	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0xdc29
+	.4byte	0xdc35
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdb86
+	.4byte	0xdb92
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xddcf
+	.4byte	0xdddb
 	.uleb128 0x10
-	.4byte	0xde09
+	.4byte	0xde15
 	.uleb128 0x11
 	.4byte	0xa570
 	.uleb128 0x11
@@ -37422,14 +37461,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdb86
+	.4byte	0xdb92
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xddef
+	.4byte	0xddfb
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xde23
+	.4byte	0xde2f
 	.uleb128 0x11
 	.4byte	0xa570
 	.uleb128 0x11
@@ -37437,10 +37476,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde0f
+	.4byte	0xde1b
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xde3d
+	.4byte	0xde49
 	.uleb128 0x11
 	.4byte	0xa570
 	.uleb128 0x11
@@ -37448,10 +37487,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde29
+	.4byte	0xde35
 	.uleb128 0x14
 	.4byte	0x458
-	.4byte	0xde66
+	.4byte	0xde72
 	.uleb128 0x11
 	.4byte	0xa570
 	.uleb128 0x11
@@ -37465,9 +37504,9 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde43
+	.4byte	0xde4f
 	.uleb128 0x10
-	.4byte	0xde81
+	.4byte	0xde8d
 	.uleb128 0x11
 	.4byte	0xa570
 	.uleb128 0x11
@@ -37477,58 +37516,58 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde6c
+	.4byte	0xde78
 	.uleb128 0x19
-	.4byte	.LASF2923
+	.4byte	.LASF2925
 	.byte	0xa
 	.byte	0xc9
 	.4byte	0xb7b4
 	.uleb128 0x19
-	.4byte	.LASF2924
+	.4byte	.LASF2926
 	.byte	0xa
 	.byte	0xca
 	.4byte	0xb7b4
 	.uleb128 0x19
-	.4byte	.LASF2925
+	.4byte	.LASF2927
 	.byte	0xa
 	.byte	0xcb
 	.4byte	0xb7b4
 	.uleb128 0x24
-	.4byte	.LASF2926
+	.4byte	.LASF2928
 	.uleb128 0x19
-	.4byte	.LASF2927
+	.4byte	.LASF2929
 	.byte	0xc7
 	.byte	0x7
-	.4byte	0xdeb8
+	.4byte	0xdec4
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdea8
+	.4byte	0xdeb4
 	.uleb128 0x24
-	.4byte	.LASF2928
+	.4byte	.LASF2930
 	.uleb128 0x19
-	.4byte	.LASF2929
+	.4byte	.LASF2931
 	.byte	0xc7
 	.byte	0x8
-	.4byte	0xdece
+	.4byte	0xdeda
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdebe
+	.4byte	0xdeca
 	.uleb128 0x19
-	.4byte	.LASF2930
+	.4byte	.LASF2932
 	.byte	0xc7
 	.byte	0x16
 	.4byte	0xb7b9
 	.uleb128 0x19
-	.4byte	.LASF2931
+	.4byte	.LASF2933
 	.byte	0xc8
 	.byte	0x1b
 	.4byte	0xb7b4
 	.uleb128 0xd
-	.4byte	.LASF2932
+	.4byte	.LASF2934
 	.byte	0x18
 	.byte	0xc9
 	.byte	0xf
-	.4byte	0xdf1b
+	.4byte	0xdf27
 	.uleb128 0xe
 	.4byte	.LASF2866
 	.byte	0xc9
@@ -37549,11 +37588,11 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2933
+	.4byte	.LASF2935
 	.byte	0xa0
 	.byte	0xc9
 	.byte	0x15
-	.4byte	0xe05f
+	.4byte	0xe06b
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xc9
@@ -37561,25 +37600,25 @@ __exitcall_ebc_exit:
 	.4byte	0xa570
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2934
+	.4byte	.LASF2936
 	.byte	0xc9
 	.byte	0x17
-	.4byte	0xe120
+	.4byte	0xe12c
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2935
+	.4byte	.LASF2937
 	.byte	0xc9
 	.byte	0x18
-	.4byte	0xdb20
+	.4byte	0xdb2c
 	.byte	0x10
 	.uleb128 0x20
 	.string	"fb"
 	.byte	0xc9
 	.byte	0x19
-	.4byte	0xe126
+	.4byte	0xe132
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2936
+	.4byte	.LASF2938
 	.byte	0xc9
 	.byte	0x1a
 	.4byte	0xc6
@@ -37591,43 +37630,43 @@ __exitcall_ebc_exit:
 	.4byte	0x13f
 	.byte	0x4c
 	.uleb128 0xe
-	.4byte	.LASF2898
+	.4byte	.LASF2900
 	.byte	0xc9
 	.byte	0x1d
 	.4byte	0x13f
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2937
+	.4byte	.LASF2939
 	.byte	0xc9
 	.byte	0x1e
 	.4byte	0x13f
 	.byte	0x54
 	.uleb128 0xe
-	.4byte	.LASF2938
+	.4byte	.LASF2940
 	.byte	0xc9
 	.byte	0x1f
 	.4byte	0x13f
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2900
+	.4byte	.LASF2902
 	.byte	0xc9
 	.byte	0x20
 	.4byte	0x13f
 	.byte	0x5c
 	.uleb128 0xe
-	.4byte	.LASF2901
+	.4byte	.LASF2903
 	.byte	0xc9
 	.byte	0x21
 	.4byte	0x13f
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2939
+	.4byte	.LASF2941
 	.byte	0xc9
 	.byte	0x22
 	.4byte	0x13f
 	.byte	0x64
 	.uleb128 0xe
-	.4byte	.LASF2940
+	.4byte	.LASF2942
 	.byte	0xc9
 	.byte	0x23
 	.4byte	0x13f
@@ -37657,13 +37696,13 @@ __exitcall_ebc_exit:
 	.4byte	0x13f
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2941
+	.4byte	.LASF2943
 	.byte	0xc9
 	.byte	0x28
 	.4byte	0x13f
 	.byte	0x7c
 	.uleb128 0xe
-	.4byte	.LASF2942
+	.4byte	.LASF2944
 	.byte	0xc9
 	.byte	0x29
 	.4byte	0x13f
@@ -37693,30 +37732,30 @@ __exitcall_ebc_exit:
 	.4byte	0x13f
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2943
+	.4byte	.LASF2945
 	.byte	0xc9
 	.byte	0x2e
 	.4byte	0x13f
 	.byte	0x94
 	.uleb128 0xe
-	.4byte	.LASF2899
+	.4byte	.LASF2901
 	.byte	0xc9
 	.byte	0x2f
 	.4byte	0x13f
 	.byte	0x98
 	.uleb128 0xe
-	.4byte	.LASF2944
+	.4byte	.LASF2946
 	.byte	0xc9
 	.byte	0x30
 	.4byte	0x13f
 	.byte	0x9c
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2945
+	.4byte	.LASF2947
 	.byte	0x70
 	.byte	0xb
 	.byte	0x17
-	.4byte	0xe120
+	.4byte	0xe12c
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xb
@@ -37724,7 +37763,7 @@ __exitcall_ebc_exit:
 	.4byte	0xa570
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2946
+	.4byte	.LASF2948
 	.byte	0xb
 	.byte	0x19
 	.4byte	0x458
@@ -37742,67 +37781,67 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2947
+	.4byte	.LASF2949
 	.byte	0xb
 	.byte	0x1d
-	.4byte	0xe13b
+	.4byte	0xe147
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2948
+	.4byte	.LASF2950
 	.byte	0xb
 	.byte	0x1e
-	.4byte	0xe13b
+	.4byte	0xe147
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2949
+	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x1f
-	.4byte	0xe146
+	.4byte	0xe152
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2950
+	.4byte	.LASF2952
 	.byte	0xb
 	.byte	0x21
-	.4byte	0xe166
+	.4byte	0xe172
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2951
+	.4byte	.LASF2953
 	.byte	0xb
 	.byte	0x22
-	.4byte	0xe177
+	.4byte	0xe183
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0xb
 	.byte	0x23
-	.4byte	0xe19c
+	.4byte	0xe1a8
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2953
+	.4byte	.LASF2955
 	.byte	0xb
 	.byte	0x24
-	.4byte	0xe1b7
+	.4byte	0xe1c3
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2954
+	.4byte	.LASF2956
 	.byte	0xb
 	.byte	0x25
-	.4byte	0xe1cd
+	.4byte	0xe1d9
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2955
+	.4byte	.LASF2957
 	.byte	0xb
 	.byte	0x26
-	.4byte	0xe1f1
+	.4byte	0xe1fd
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2956
+	.4byte	.LASF2958
 	.byte	0xb
 	.byte	0x27
-	.4byte	0xe207
+	.4byte	0xe213
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2957
+	.4byte	.LASF2959
 	.byte	0xb
 	.byte	0x29
 	.4byte	0x4b7
@@ -37810,10 +37849,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe05f
+	.4byte	0xe06b
 	.uleb128 0x5
-	.4byte	0xdeea
-	.4byte	0xe136
+	.4byte	0xdef6
+	.4byte	0xe142
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
@@ -37822,38 +37861,38 @@ __exitcall_ebc_exit:
 	.string	"clk"
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe136
+	.4byte	0xe142
 	.uleb128 0x24
-	.4byte	.LASF2958
+	.4byte	.LASF2960
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe141
+	.4byte	0xe14d
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xe160
+	.4byte	0xe16c
 	.uleb128 0x11
-	.4byte	0xe120
+	.4byte	0xe12c
 	.uleb128 0x11
-	.4byte	0xe160
+	.4byte	0xe16c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdf1b
+	.4byte	0xdf27
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe14c
+	.4byte	0xe158
 	.uleb128 0x10
-	.4byte	0xe177
+	.4byte	0xe183
 	.uleb128 0x11
-	.4byte	0xe120
+	.4byte	0xe12c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe16c
+	.4byte	0xe178
 	.uleb128 0x10
-	.4byte	0xe19c
+	.4byte	0xe1a8
 	.uleb128 0x11
-	.4byte	0xe120
+	.4byte	0xe12c
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -37865,11 +37904,11 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe17d
+	.4byte	0xe189
 	.uleb128 0x10
-	.4byte	0xe1b7
+	.4byte	0xe1c3
 	.uleb128 0x11
-	.4byte	0xe120
+	.4byte	0xe12c
 	.uleb128 0x11
 	.4byte	0x13f
 	.uleb128 0x11
@@ -37877,22 +37916,22 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1a2
+	.4byte	0xe1ae
 	.uleb128 0x10
-	.4byte	0xe1cd
+	.4byte	0xe1d9
 	.uleb128 0x11
-	.4byte	0xe120
+	.4byte	0xe12c
 	.uleb128 0x11
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1bd
+	.4byte	0xe1c9
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xe1f1
+	.4byte	0xe1fd
 	.uleb128 0x11
-	.4byte	0xe120
+	.4byte	0xe12c
 	.uleb128 0x11
 	.4byte	0x3573
 	.uleb128 0x11
@@ -37902,109 +37941,109 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1d3
+	.4byte	0xe1df
 	.uleb128 0x10
-	.4byte	0xe207
+	.4byte	0xe213
 	.uleb128 0x11
-	.4byte	0xe120
+	.4byte	0xe12c
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1f7
+	.4byte	0xe203
 	.uleb128 0x26
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.2byte	0x278
 	.byte	0x1
 	.byte	0x33
-	.4byte	0xe441
+	.4byte	0xe44d
 	.uleb128 0xe
-	.4byte	.LASF2960
+	.4byte	.LASF2962
 	.byte	0x1
 	.byte	0x34
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2961
+	.4byte	.LASF2963
 	.byte	0x1
 	.byte	0x35
 	.4byte	0x21e
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2962
+	.4byte	.LASF2964
 	.byte	0x1
 	.byte	0x36
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2963
+	.4byte	.LASF2965
 	.byte	0x1
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2964
+	.4byte	.LASF2966
 	.byte	0x1
 	.byte	0x38
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2965
+	.4byte	.LASF2967
 	.byte	0x1
 	.byte	0x39
 	.4byte	0x29
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2966
+	.4byte	.LASF2968
 	.byte	0x1
 	.byte	0x3a
 	.4byte	0xc6
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2967
+	.4byte	.LASF2969
 	.byte	0x1
 	.byte	0x3b
 	.4byte	0xc6
 	.byte	0x2c
 	.uleb128 0xe
-	.4byte	.LASF2968
+	.4byte	.LASF2970
 	.byte	0x1
 	.byte	0x3c
 	.4byte	0x61
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2969
+	.4byte	.LASF2971
 	.byte	0x1
 	.byte	0x3d
 	.4byte	0x61
 	.byte	0x31
 	.uleb128 0xe
-	.4byte	.LASF2970
+	.4byte	.LASF2972
 	.byte	0x1
 	.byte	0x3e
 	.4byte	0xc6
 	.byte	0x34
 	.uleb128 0xe
-	.4byte	.LASF2971
+	.4byte	.LASF2973
 	.byte	0x1
 	.byte	0x3f
 	.4byte	0xc6
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2972
+	.4byte	.LASF2974
 	.byte	0x1
 	.byte	0x40
 	.4byte	0xc6
 	.byte	0x3c
 	.uleb128 0xe
-	.4byte	.LASF2973
+	.4byte	.LASF2975
 	.byte	0x1
 	.byte	0x41
 	.4byte	0xc6
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2898
+	.4byte	.LASF2900
 	.byte	0x1
 	.byte	0x42
 	.4byte	0xc6
@@ -38016,25 +38055,25 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2974
+	.4byte	.LASF2976
 	.byte	0x1
 	.byte	0x44
 	.4byte	0x467e
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2975
+	.4byte	.LASF2977
 	.byte	0x1
 	.byte	0x45
 	.4byte	0xc6
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2976
+	.4byte	.LASF2978
 	.byte	0x1
 	.byte	0x46
 	.4byte	0xc6
 	.byte	0x5c
 	.uleb128 0xe
-	.4byte	.LASF2977
+	.4byte	.LASF2979
 	.byte	0x1
 	.byte	0x47
 	.4byte	0xc6
@@ -38046,145 +38085,145 @@ __exitcall_ebc_exit:
 	.4byte	0xa570
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2978
+	.4byte	.LASF2980
 	.byte	0x1
 	.byte	0x49
 	.4byte	0xd88c
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF2979
+	.4byte	.LASF2981
 	.byte	0x1
 	.byte	0x4a
 	.4byte	0x2f05
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF2980
+	.4byte	.LASF2982
 	.byte	0x1
 	.byte	0x4c
 	.4byte	0x467e
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2981
+	.4byte	.LASF2983
 	.byte	0x1
 	.byte	0x4d
 	.4byte	0x467e
 	.byte	0x98
 	.uleb128 0xe
-	.4byte	.LASF2982
+	.4byte	.LASF2984
 	.byte	0x1
 	.byte	0x4e
 	.4byte	0x467e
 	.byte	0xa0
 	.uleb128 0xe
-	.4byte	.LASF2983
+	.4byte	.LASF2985
 	.byte	0x1
 	.byte	0x50
 	.4byte	0xc0c8
 	.byte	0xa8
 	.uleb128 0xe
-	.4byte	.LASF2984
+	.4byte	.LASF2986
 	.byte	0x1
 	.byte	0x51
 	.4byte	0xc0c8
 	.byte	0xb0
 	.uleb128 0xe
-	.4byte	.LASF2985
+	.4byte	.LASF2987
 	.byte	0x1
 	.byte	0x52
-	.4byte	0xe441
+	.4byte	0xe44d
 	.byte	0xb8
 	.uleb128 0xe
-	.4byte	.LASF2986
+	.4byte	.LASF2988
 	.byte	0x1
 	.byte	0x53
 	.4byte	0xc6
 	.byte	0xc8
 	.uleb128 0xe
-	.4byte	.LASF2987
+	.4byte	.LASF2989
 	.byte	0x1
 	.byte	0x54
 	.4byte	0xc6
 	.byte	0xcc
 	.uleb128 0xe
-	.4byte	.LASF2988
+	.4byte	.LASF2990
 	.byte	0x1
 	.byte	0x55
 	.4byte	0x21e
 	.byte	0xd0
 	.uleb128 0xe
-	.4byte	.LASF2989
+	.4byte	.LASF2991
 	.byte	0x1
 	.byte	0x56
-	.4byte	0xe451
+	.4byte	0xe45d
 	.byte	0xd8
 	.uleb128 0xe
-	.4byte	.LASF2990
+	.4byte	.LASF2992
 	.byte	0x1
 	.byte	0x57
-	.4byte	0xe451
+	.4byte	0xe45d
 	.byte	0xe0
 	.uleb128 0xe
-	.4byte	.LASF2991
+	.4byte	.LASF2993
 	.byte	0x1
 	.byte	0x59
 	.4byte	0xd802
 	.byte	0xe8
 	.uleb128 0x27
-	.4byte	.LASF2992
+	.4byte	.LASF2994
 	.byte	0x1
 	.byte	0x5a
 	.4byte	0xc6
 	.2byte	0x1b8
 	.uleb128 0x27
-	.4byte	.LASF2993
+	.4byte	.LASF2995
 	.byte	0x1
 	.byte	0x5c
 	.4byte	0xc6
 	.2byte	0x1bc
 	.uleb128 0x27
-	.4byte	.LASF2994
+	.4byte	.LASF2996
 	.byte	0x1
 	.byte	0x5e
 	.4byte	0x3172
 	.2byte	0x1c0
 	.uleb128 0x27
-	.4byte	.LASF2995
+	.4byte	.LASF2997
 	.byte	0x1
 	.byte	0x61
 	.4byte	0x3172
 	.2byte	0x1f8
 	.uleb128 0x27
-	.4byte	.LASF2996
+	.4byte	.LASF2998
 	.byte	0x1
 	.byte	0x64
 	.4byte	0x320b
 	.2byte	0x230
 	.uleb128 0x27
-	.4byte	.LASF2997
+	.4byte	.LASF2999
 	.byte	0x1
 	.byte	0x67
 	.4byte	0xc6
 	.2byte	0x260
 	.uleb128 0x27
-	.4byte	.LASF2998
+	.4byte	.LASF3000
 	.byte	0x1
 	.byte	0x69
 	.4byte	0xc6
 	.2byte	0x264
 	.uleb128 0x27
-	.4byte	.LASF2999
+	.4byte	.LASF3001
 	.byte	0x1
 	.byte	0x6b
 	.4byte	0xc6
 	.2byte	0x268
 	.uleb128 0x27
-	.4byte	.LASF3000
+	.4byte	.LASF3002
 	.byte	0x1
 	.byte	0x6d
 	.4byte	0xc6
 	.2byte	0x26c
 	.uleb128 0x27
-	.4byte	.LASF3001
+	.4byte	.LASF3003
 	.byte	0x1
 	.byte	0x6e
 	.4byte	0xc6
@@ -38192,7 +38231,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x458
-	.4byte	0xe451
+	.4byte	0xe45d
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
@@ -38205,7 +38244,7 @@ __exitcall_ebc_exit:
 	.2byte	0x330
 	.byte	0x1
 	.byte	0x71
-	.4byte	0xe4a1
+	.4byte	0xe4ad
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x1
@@ -38213,43 +38252,43 @@ __exitcall_ebc_exit:
 	.4byte	0xa570
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2934
+	.4byte	.LASF2936
 	.byte	0x1
 	.byte	0x73
-	.4byte	0xe120
+	.4byte	0xe12c
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2935
+	.4byte	.LASF2937
 	.byte	0x1
 	.byte	0x74
-	.4byte	0xdb20
+	.4byte	0xdb2c
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF3002
+	.4byte	.LASF3004
 	.byte	0x1
 	.byte	0x75
-	.4byte	0xdf1b
+	.4byte	0xdf27
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF1774
 	.byte	0x1
 	.byte	0x76
-	.4byte	0xe20d
+	.4byte	0xe219
 	.byte	0xb8
 	.byte	0
 	.uleb128 0x4b
-	.4byte	.LASF3003
+	.4byte	.LASF3005
 	.byte	0x1
 	.byte	0x79
-	.4byte	0xe4b6
+	.4byte	0xe4c2
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	global_ebc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe457
+	.4byte	0xe463
 	.uleb128 0x4b
-	.4byte	.LASF3004
+	.4byte	.LASF3006
 	.byte	0x1
 	.byte	0x7a
 	.4byte	0x2f05
@@ -38257,7 +38296,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_auto_task
 	.uleb128 0x4b
-	.4byte	.LASF3005
+	.4byte	.LASF3007
 	.byte	0x1
 	.byte	0x7b
 	.4byte	0x4e36
@@ -38265,7 +38304,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	auto_buf_sema
 	.uleb128 0x4b
-	.4byte	.LASF3006
+	.4byte	.LASF3008
 	.byte	0x1
 	.byte	0x7d
 	.4byte	0x159a
@@ -38273,7 +38312,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_wq
 	.uleb128 0x4b
-	.4byte	.LASF3007
+	.4byte	.LASF3009
 	.byte	0x1
 	.byte	0x7e
 	.4byte	0x159a
@@ -38281,7 +38320,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_thread_wq
 	.uleb128 0x4b
-	.4byte	.LASF3008
+	.4byte	.LASF3010
 	.byte	0x1
 	.byte	0x7f
 	.4byte	0x159a
@@ -38289,7 +38328,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_poweroff_wq
 	.uleb128 0x4b
-	.4byte	.LASF3009
+	.4byte	.LASF3011
 	.byte	0x1
 	.byte	0x80
 	.4byte	0x5b71
@@ -38297,2869 +38336,2869 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_auto_thread_sem
 	.uleb128 0x4c
-	.4byte	.LASF3010
+	.4byte	.LASF3012
 	.byte	0x1
-	.2byte	0x7a4
+	.2byte	0x7ba
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_ops
 	.uleb128 0x4c
-	.4byte	.LASF3011
+	.4byte	.LASF3013
 	.byte	0x1
-	.2byte	0x7ae
+	.2byte	0x7c4
 	.4byte	0xc610
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_misc
 	.uleb128 0x4c
-	.4byte	.LASF3012
+	.4byte	.LASF3014
 	.byte	0x1
-	.2byte	0x7cb
+	.2byte	0x7e1
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	waveform_ops
 	.uleb128 0x4c
-	.4byte	.LASF3013
+	.4byte	.LASF3015
 	.byte	0x1
-	.2byte	0x7d1
+	.2byte	0x7e7
 	.4byte	0xc610
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	waveform_misc
 	.uleb128 0x4c
-	.4byte	.LASF3014
+	.4byte	.LASF3016
 	.byte	0x1
-	.2byte	0x7e0
+	.2byte	0x7f6
 	.4byte	0xb39d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_waveform_version
 	.uleb128 0x4c
-	.4byte	.LASF3015
+	.4byte	.LASF3017
 	.byte	0x1
-	.2byte	0x7eb
+	.2byte	0x801
 	.4byte	0xb39d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_name
 	.uleb128 0x4c
-	.4byte	.LASF3016
+	.4byte	.LASF3018
 	.byte	0x1
-	.2byte	0x7f9
+	.2byte	0x80f
 	.4byte	0xb39d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_temp
 	.uleb128 0x4c
-	.4byte	.LASF3017
+	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x81c
+	.2byte	0x832
 	.4byte	0xb39d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_vcom
 	.uleb128 0x4c
-	.4byte	.LASF3018
+	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x826
+	.2byte	0x83c
 	.4byte	0xb39d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_version
 	.uleb128 0x4c
-	.4byte	.LASF3019
+	.4byte	.LASF3021
 	.byte	0x1
-	.2byte	0x82f
+	.2byte	0x845
 	.4byte	0xb39d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_state
 	.uleb128 0x4c
-	.4byte	.LASF3020
+	.4byte	.LASF3022
 	.byte	0x1
-	.2byte	0x838
+	.2byte	0x84e
 	.4byte	0xb39d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_buf_state
 	.uleb128 0x4c
-	.4byte	.LASF3021
+	.4byte	.LASF3023
 	.byte	0x1
-	.2byte	0x9eb
+	.2byte	0xa01
 	.4byte	0xa55c
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_pm
 	.uleb128 0x5
 	.4byte	0xb19b
-	.4byte	0xe652
+	.4byte	0xe65e
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe642
+	.4byte	0xe64e
 	.uleb128 0x4c
-	.4byte	.LASF3022
+	.4byte	.LASF3024
 	.byte	0x1
-	.2byte	0x9f0
-	.4byte	0xe652
+	.2byte	0xa06
+	.4byte	0xe65e
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_match
 	.uleb128 0x4c
-	.4byte	.LASF3023
+	.4byte	.LASF3025
 	.byte	0x1
-	.2byte	0x9f6
+	.2byte	0xa0c
 	.4byte	0xd69e
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_driver
 	.uleb128 0x4c
-	.4byte	.LASF3024
+	.4byte	.LASF3026
 	.byte	0x1
-	.2byte	0xa0a
+	.2byte	0xa20
 	.4byte	0x458
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init2570
+	.8byte	__addressable_ebc_init2592
 	.uleb128 0x4c
-	.4byte	.LASF3025
+	.4byte	.LASF3027
 	.byte	0x1
-	.2byte	0xa0b
+	.2byte	0xa21
 	.4byte	0x4ac
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	__exitcall_ebc_exit
 	.uleb128 0x4d
-	.4byte	.LASF3076
+	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0xa05
+	.2byte	0xa1b
 	.8byte	.LFB2855
 	.8byte	.LFE2855-.LFB2855
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe6db
+	.4byte	0xe6e7
 	.uleb128 0x4e
 	.8byte	.LVL64
-	.4byte	0x1441a
+	.4byte	0x14440
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3026
+	.4byte	.LASF3028
 	.byte	0x1
-	.2byte	0xa00
+	.2byte	0xa16
 	.4byte	0xc6
 	.8byte	.LFB2854
 	.8byte	.LFE2854-.LFB2854
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe70b
+	.4byte	0xe717
 	.uleb128 0x4e
 	.8byte	.LVL356
-	.4byte	0x14426
+	.4byte	0x1444c
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3027
+	.4byte	.LASF3029
 	.byte	0x1
-	.2byte	0x9df
+	.2byte	0x9f5
 	.4byte	0xc6
 	.8byte	.LFB2853
 	.8byte	.LFE2853-.LFB2853
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe7a7
+	.4byte	0xe7b3
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x9df
+	.2byte	0x9f5
 	.4byte	0xa570
 	.4byte	.LLST11
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x9e1
-	.4byte	0xe4b6
+	.2byte	0x9f7
+	.4byte	0xe4c2
 	.uleb128 0x46
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x9e2
-	.4byte	0xe7a7
+	.2byte	0x9f8
+	.4byte	0xe7b3
 	.uleb128 0x53
-	.4byte	0x13781
+	.4byte	0x137a7
 	.8byte	.LBB938
 	.8byte	.LBE938-.LBB938
 	.byte	0x1
-	.2byte	0x9e1
-	.4byte	0xe777
+	.2byte	0x9f7
+	.4byte	0xe783
 	.uleb128 0x54
-	.4byte	0x13792
+	.4byte	0x137b8
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13369
+	.4byte	0x1338f
 	.8byte	.LBB940
 	.8byte	.LBE940-.LBB940
 	.byte	0x1
-	.2byte	0x9e4
-	.4byte	0xe799
+	.2byte	0x9fa
+	.4byte	0xe7a5
 	.uleb128 0x54
-	.4byte	0x13376
+	.4byte	0x1339c
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL68
-	.4byte	0x14432
+	.4byte	0x14458
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe20d
+	.4byte	0xe219
 	.uleb128 0x50
-	.4byte	.LASF3029
+	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0x9ce
+	.2byte	0x9e4
 	.4byte	0xc6
 	.8byte	.LFB2852
 	.8byte	.LFE2852-.LFB2852
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe8b4
+	.4byte	0xe8c0
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x9ce
+	.2byte	0x9e4
 	.4byte	0xa570
 	.4byte	.LLST148
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x9d0
-	.4byte	0xe4b6
+	.2byte	0x9e6
+	.4byte	0xe4c2
 	.uleb128 0x46
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x9d1
-	.4byte	0xe7a7
+	.2byte	0x9e7
+	.4byte	0xe7b3
 	.uleb128 0x55
-	.4byte	.LASF3030
-	.4byte	0xe8c4
+	.4byte	.LASF3032
+	.4byte	0xe8d0
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35288
+	.8byte	__func__.35300
 	.uleb128 0x53
-	.4byte	0x13781
+	.4byte	0x137a7
 	.8byte	.LBB1422
 	.8byte	.LBE1422-.LBB1422
 	.byte	0x1
-	.2byte	0x9d0
-	.4byte	0xe82c
+	.2byte	0x9e6
+	.4byte	0xe838
 	.uleb128 0x54
-	.4byte	0x13792
+	.4byte	0x137b8
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13382
+	.4byte	0x133a8
 	.8byte	.LBB1424
 	.8byte	.LBE1424-.LBB1424
 	.byte	0x1
-	.2byte	0x9d9
-	.4byte	0xe84e
+	.2byte	0x9ef
+	.4byte	0xe85a
 	.uleb128 0x54
-	.4byte	0x1338f
+	.4byte	0x133b5
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x130ca
+	.4byte	0x130f0
 	.8byte	.LBB1426
 	.8byte	.LBE1426-.LBB1426
 	.byte	0x1
-	.2byte	0x9d5
-	.4byte	0xe899
+	.2byte	0x9eb
+	.4byte	0xe8a5
 	.uleb128 0x54
-	.4byte	0x130e5
+	.4byte	0x1310b
 	.uleb128 0x54
-	.4byte	0x130da
+	.4byte	0x13100
 	.uleb128 0x56
 	.8byte	.LBB1427
 	.8byte	.LBE1427-.LBB1427
 	.uleb128 0x57
-	.4byte	0x130f0
+	.4byte	0x13116
 	.uleb128 0x4e
 	.8byte	.LVL521
-	.4byte	0x142aa
+	.4byte	0x142d0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL519
-	.4byte	0x14432
+	.4byte	0x14458
 	.uleb128 0x4e
 	.8byte	.LVL520
-	.4byte	0x14432
+	.4byte	0x14458
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xe8c4
+	.4byte	0xe8d0
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xb
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe8b4
+	.4byte	0xe8c0
 	.uleb128 0x4f
-	.4byte	.LASF3031
+	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0x9c7
+	.2byte	0x9dd
 	.4byte	0xc6
 	.8byte	.LFB2851
 	.8byte	.LFE2851-.LFB2851
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe909
+	.4byte	0xe915
 	.uleb128 0x58
-	.4byte	.LASF3032
+	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0x9c7
+	.2byte	0x9dd
 	.4byte	0xd71a
 	.4byte	.LLST13
 	.uleb128 0x4e
 	.8byte	.LVL74
-	.4byte	0x1443f
+	.4byte	0x14465
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3033
+	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0x946
+	.2byte	0x95c
 	.4byte	0xc6
 	.8byte	.LFB2850
 	.8byte	.LFE2850-.LFB2850
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfd84
+	.4byte	0xfd90
 	.uleb128 0x58
-	.4byte	.LASF3032
+	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0x946
+	.2byte	0x95c
 	.4byte	0xd71a
 	.4byte	.LLST149
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x948
+	.2byte	0x95e
 	.4byte	0xa570
 	.uleb128 0x46
-	.4byte	.LASF3034
+	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0x949
+	.2byte	0x95f
 	.4byte	0xb894
 	.uleb128 0x59
-	.4byte	.LASF3035
+	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0x94a
+	.2byte	0x960
 	.4byte	0xd71a
 	.4byte	.LLST150
 	.uleb128 0x46
-	.4byte	.LASF3036
+	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0x94b
+	.2byte	0x961
 	.4byte	0xb894
 	.uleb128 0x59
-	.4byte	.LASF3037
+	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0x94c
+	.2byte	0x962
 	.4byte	0xc043
 	.4byte	.LLST151
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x94d
-	.4byte	0xe4b6
+	.2byte	0x963
+	.4byte	0xe4c2
 	.uleb128 0x59
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x94e
-	.4byte	0xe7a7
+	.2byte	0x964
+	.4byte	0xe7b3
 	.4byte	.LLST152
 	.uleb128 0x46
-	.4byte	.LASF3002
+	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x94f
-	.4byte	0xe160
+	.2byte	0x965
+	.4byte	0xe16c
 	.uleb128 0x59
 	.4byte	.LASF962
 	.byte	0x1
-	.2byte	0x950
+	.2byte	0x966
 	.4byte	0xbcc0
 	.4byte	.LLST153
 	.uleb128 0x46
 	.4byte	.LASF2421
 	.byte	0x1
-	.2byte	0x951
+	.2byte	0x967
 	.4byte	0xbc60
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x952
+	.2byte	0x968
 	.4byte	0xc6
 	.uleb128 0x59
 	.4byte	.LASF987
 	.byte	0x1
-	.2byte	0x953
+	.2byte	0x969
 	.4byte	0xc6
 	.4byte	.LLST154
 	.uleb128 0x5a
 	.string	"i"
 	.byte	0x1
-	.2byte	0x954
+	.2byte	0x96a
 	.4byte	0xc6
 	.4byte	.LLST155
 	.uleb128 0x5b
-	.4byte	0x1379f
+	.4byte	0x137c5
 	.8byte	.LBB1578
 	.4byte	.Ldebug_ranges0+0xc00
 	.byte	0x1
-	.2byte	0x956
-	.4byte	0xea22
+	.2byte	0x96c
+	.4byte	0xea2e
 	.uleb128 0x54
-	.4byte	0x137c8
+	.4byte	0x137ee
 	.uleb128 0x54
-	.4byte	0x137bc
+	.4byte	0x137e2
 	.uleb128 0x54
-	.4byte	0x137b0
+	.4byte	0x137d6
 	.uleb128 0x4e
 	.8byte	.LVL524
-	.4byte	0x1444b
+	.4byte	0x14471
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1367b
+	.4byte	0x136a1
 	.8byte	.LBB1582
 	.8byte	.LBE1582-.LBB1582
 	.byte	0x1
-	.2byte	0x968
-	.4byte	0xea61
+	.2byte	0x97e
+	.4byte	0xea6d
 	.uleb128 0x54
-	.4byte	0x1368b
+	.4byte	0x136b1
 	.uleb128 0x5c
-	.4byte	0x13781
+	.4byte	0x137a7
 	.8byte	.LBB1583
 	.8byte	.LBE1583-.LBB1583
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x54
-	.4byte	0x13792
+	.4byte	0x137b8
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1369d
+	.4byte	0x136c3
 	.8byte	.LBB1585
 	.8byte	.LBE1585-.LBB1585
 	.byte	0x1
-	.2byte	0x983
-	.4byte	0xeaa1
+	.2byte	0x999
+	.4byte	0xeaad
 	.uleb128 0x54
-	.4byte	0x136ae
+	.4byte	0x136d4
 	.uleb128 0x5d
-	.4byte	0x13781
+	.4byte	0x137a7
 	.8byte	.LBB1586
 	.8byte	.LBE1586-.LBB1586
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x54
-	.4byte	0x13792
+	.4byte	0x137b8
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x1178f
+	.4byte	0x1179b
 	.8byte	.LBB1588
 	.4byte	.Ldebug_ranges0+0xc30
 	.byte	0x1
-	.2byte	0x997
-	.4byte	0xf476
+	.2byte	0x9ad
+	.4byte	0xf482
 	.uleb128 0x54
-	.4byte	0x117a0
+	.4byte	0x117ac
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xc30
 	.uleb128 0x57
-	.4byte	0x117ac
+	.4byte	0x117b8
 	.uleb128 0x5b
-	.4byte	0x136c1
+	.4byte	0x136e7
 	.8byte	.LBB1590
 	.4byte	.Ldebug_ranges0+0xc80
 	.byte	0x1
-	.2byte	0x686
-	.4byte	0xeb31
+	.2byte	0x69c
+	.4byte	0xeb3d
 	.uleb128 0x54
-	.4byte	0x136e9
+	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x136dd
+	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136f8
 	.uleb128 0x5f
-	.4byte	0x136f6
+	.4byte	0x1371c
 	.8byte	.LBB1591
 	.4byte	.Ldebug_ranges0+0xc80
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1372a
+	.4byte	0x13750
 	.uleb128 0x54
-	.4byte	0x1371e
+	.4byte	0x13744
 	.uleb128 0x54
-	.4byte	0x13712
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x13707
+	.4byte	0x1372d
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xc80
 	.uleb128 0x57
-	.4byte	0x13735
+	.4byte	0x1375b
 	.uleb128 0x4e
 	.8byte	.LVL549
-	.4byte	0x14458
+	.4byte	0x1447e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136c1
+	.4byte	0x136e7
 	.8byte	.LBB1602
 	.8byte	.LBE1602-.LBB1602
 	.byte	0x1
-	.2byte	0x689
-	.4byte	0xebae
+	.2byte	0x69f
+	.4byte	0xebba
 	.uleb128 0x54
-	.4byte	0x136e9
+	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x136dd
+	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136f8
 	.uleb128 0x5d
-	.4byte	0x136f6
+	.4byte	0x1371c
 	.8byte	.LBB1603
 	.8byte	.LBE1603-.LBB1603
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1372a
+	.4byte	0x13750
 	.uleb128 0x54
-	.4byte	0x1371e
+	.4byte	0x13744
 	.uleb128 0x54
-	.4byte	0x13712
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x13707
+	.4byte	0x1372d
 	.uleb128 0x56
 	.8byte	.LBB1604
 	.8byte	.LBE1604-.LBB1604
 	.uleb128 0x57
-	.4byte	0x13735
+	.4byte	0x1375b
 	.uleb128 0x4e
 	.8byte	.LVL550
-	.4byte	0x14458
+	.4byte	0x1447e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136c1
+	.4byte	0x136e7
 	.8byte	.LBB1605
 	.8byte	.LBE1605-.LBB1605
 	.byte	0x1
-	.2byte	0x68c
-	.4byte	0xec2b
+	.2byte	0x6a2
+	.4byte	0xec37
 	.uleb128 0x54
-	.4byte	0x136e9
+	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x136dd
+	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136f8
 	.uleb128 0x5d
-	.4byte	0x136f6
+	.4byte	0x1371c
 	.8byte	.LBB1606
 	.8byte	.LBE1606-.LBB1606
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1372a
+	.4byte	0x13750
 	.uleb128 0x54
-	.4byte	0x1371e
+	.4byte	0x13744
 	.uleb128 0x54
-	.4byte	0x13712
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x13707
+	.4byte	0x1372d
 	.uleb128 0x56
 	.8byte	.LBB1607
 	.8byte	.LBE1607-.LBB1607
 	.uleb128 0x57
-	.4byte	0x13735
+	.4byte	0x1375b
 	.uleb128 0x4e
 	.8byte	.LVL551
-	.4byte	0x14458
+	.4byte	0x1447e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136c1
+	.4byte	0x136e7
 	.8byte	.LBB1608
 	.8byte	.LBE1608-.LBB1608
 	.byte	0x1
-	.2byte	0x68f
-	.4byte	0xeca8
+	.2byte	0x6a5
+	.4byte	0xecb4
 	.uleb128 0x54
-	.4byte	0x136e9
+	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x136dd
+	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136f8
 	.uleb128 0x5d
-	.4byte	0x136f6
+	.4byte	0x1371c
 	.8byte	.LBB1609
 	.8byte	.LBE1609-.LBB1609
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1372a
+	.4byte	0x13750
 	.uleb128 0x54
-	.4byte	0x1371e
+	.4byte	0x13744
 	.uleb128 0x54
-	.4byte	0x13712
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x13707
+	.4byte	0x1372d
 	.uleb128 0x56
 	.8byte	.LBB1610
 	.8byte	.LBE1610-.LBB1610
 	.uleb128 0x57
-	.4byte	0x13735
+	.4byte	0x1375b
 	.uleb128 0x4e
 	.8byte	.LVL552
-	.4byte	0x14458
+	.4byte	0x1447e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136c1
+	.4byte	0x136e7
 	.8byte	.LBB1611
 	.8byte	.LBE1611-.LBB1611
 	.byte	0x1
-	.2byte	0x692
-	.4byte	0xed25
+	.2byte	0x6a8
+	.4byte	0xed31
 	.uleb128 0x54
-	.4byte	0x136e9
+	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x136dd
+	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136f8
 	.uleb128 0x5d
-	.4byte	0x136f6
+	.4byte	0x1371c
 	.8byte	.LBB1612
 	.8byte	.LBE1612-.LBB1612
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1372a
+	.4byte	0x13750
 	.uleb128 0x54
-	.4byte	0x1371e
+	.4byte	0x13744
 	.uleb128 0x54
-	.4byte	0x13712
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x13707
+	.4byte	0x1372d
 	.uleb128 0x56
 	.8byte	.LBB1613
 	.8byte	.LBE1613-.LBB1613
 	.uleb128 0x57
-	.4byte	0x13735
+	.4byte	0x1375b
 	.uleb128 0x4e
 	.8byte	.LVL553
-	.4byte	0x14458
+	.4byte	0x1447e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136c1
+	.4byte	0x136e7
 	.8byte	.LBB1614
 	.8byte	.LBE1614-.LBB1614
 	.byte	0x1
-	.2byte	0x695
-	.4byte	0xeda2
+	.2byte	0x6ab
+	.4byte	0xedae
 	.uleb128 0x54
-	.4byte	0x136e9
+	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x136dd
+	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136f8
 	.uleb128 0x5d
-	.4byte	0x136f6
+	.4byte	0x1371c
 	.8byte	.LBB1615
 	.8byte	.LBE1615-.LBB1615
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1372a
+	.4byte	0x13750
 	.uleb128 0x54
-	.4byte	0x1371e
+	.4byte	0x13744
 	.uleb128 0x54
-	.4byte	0x13712
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x13707
+	.4byte	0x1372d
 	.uleb128 0x56
 	.8byte	.LBB1616
 	.8byte	.LBE1616-.LBB1616
 	.uleb128 0x57
-	.4byte	0x13735
+	.4byte	0x1375b
 	.uleb128 0x4e
 	.8byte	.LVL554
-	.4byte	0x14458
+	.4byte	0x1447e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136c1
+	.4byte	0x136e7
 	.8byte	.LBB1617
 	.8byte	.LBE1617-.LBB1617
 	.byte	0x1
-	.2byte	0x698
-	.4byte	0xee1f
+	.2byte	0x6ae
+	.4byte	0xee2b
 	.uleb128 0x54
-	.4byte	0x136e9
+	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x136dd
+	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136f8
 	.uleb128 0x5d
-	.4byte	0x136f6
+	.4byte	0x1371c
 	.8byte	.LBB1618
 	.8byte	.LBE1618-.LBB1618
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1372a
+	.4byte	0x13750
 	.uleb128 0x54
-	.4byte	0x1371e
+	.4byte	0x13744
 	.uleb128 0x54
-	.4byte	0x13712
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x13707
+	.4byte	0x1372d
 	.uleb128 0x56
 	.8byte	.LBB1619
 	.8byte	.LBE1619-.LBB1619
 	.uleb128 0x57
-	.4byte	0x13735
+	.4byte	0x1375b
 	.uleb128 0x4e
 	.8byte	.LVL555
-	.4byte	0x14458
+	.4byte	0x1447e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136c1
+	.4byte	0x136e7
 	.8byte	.LBB1620
 	.8byte	.LBE1620-.LBB1620
 	.byte	0x1
-	.2byte	0x69b
-	.4byte	0xee9c
+	.2byte	0x6b1
+	.4byte	0xeea8
 	.uleb128 0x54
-	.4byte	0x136e9
+	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x136dd
+	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136f8
 	.uleb128 0x5d
-	.4byte	0x136f6
+	.4byte	0x1371c
 	.8byte	.LBB1621
 	.8byte	.LBE1621-.LBB1621
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1372a
+	.4byte	0x13750
 	.uleb128 0x54
-	.4byte	0x1371e
+	.4byte	0x13744
 	.uleb128 0x54
-	.4byte	0x13712
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x13707
+	.4byte	0x1372d
 	.uleb128 0x56
 	.8byte	.LBB1622
 	.8byte	.LBE1622-.LBB1622
 	.uleb128 0x57
-	.4byte	0x13735
+	.4byte	0x1375b
 	.uleb128 0x4e
 	.8byte	.LVL556
-	.4byte	0x14458
+	.4byte	0x1447e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136c1
+	.4byte	0x136e7
 	.8byte	.LBB1623
 	.8byte	.LBE1623-.LBB1623
 	.byte	0x1
-	.2byte	0x69e
-	.4byte	0xef19
+	.2byte	0x6b4
+	.4byte	0xef25
 	.uleb128 0x54
-	.4byte	0x136e9
+	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x136dd
+	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136f8
 	.uleb128 0x5d
-	.4byte	0x136f6
+	.4byte	0x1371c
 	.8byte	.LBB1624
 	.8byte	.LBE1624-.LBB1624
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1372a
+	.4byte	0x13750
 	.uleb128 0x54
-	.4byte	0x1371e
+	.4byte	0x13744
 	.uleb128 0x54
-	.4byte	0x13712
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x13707
+	.4byte	0x1372d
 	.uleb128 0x56
 	.8byte	.LBB1625
 	.8byte	.LBE1625-.LBB1625
 	.uleb128 0x57
-	.4byte	0x13735
+	.4byte	0x1375b
 	.uleb128 0x4e
 	.8byte	.LVL557
-	.4byte	0x14458
+	.4byte	0x1447e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136c1
+	.4byte	0x136e7
 	.8byte	.LBB1626
 	.8byte	.LBE1626-.LBB1626
 	.byte	0x1
-	.2byte	0x6a1
-	.4byte	0xef96
+	.2byte	0x6b7
+	.4byte	0xefa2
 	.uleb128 0x54
-	.4byte	0x136e9
+	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x136dd
+	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136f8
 	.uleb128 0x5d
-	.4byte	0x136f6
+	.4byte	0x1371c
 	.8byte	.LBB1627
 	.8byte	.LBE1627-.LBB1627
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1372a
+	.4byte	0x13750
 	.uleb128 0x54
-	.4byte	0x1371e
+	.4byte	0x13744
 	.uleb128 0x54
-	.4byte	0x13712
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x13707
+	.4byte	0x1372d
 	.uleb128 0x56
 	.8byte	.LBB1628
 	.8byte	.LBE1628-.LBB1628
 	.uleb128 0x57
-	.4byte	0x13735
+	.4byte	0x1375b
 	.uleb128 0x4e
 	.8byte	.LVL558
-	.4byte	0x14458
+	.4byte	0x1447e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136c1
+	.4byte	0x136e7
 	.8byte	.LBB1629
 	.8byte	.LBE1629-.LBB1629
 	.byte	0x1
-	.2byte	0x6a4
-	.4byte	0xf013
+	.2byte	0x6ba
+	.4byte	0xf01f
 	.uleb128 0x54
-	.4byte	0x136e9
+	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x136dd
+	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136f8
 	.uleb128 0x5d
-	.4byte	0x136f6
+	.4byte	0x1371c
 	.8byte	.LBB1630
 	.8byte	.LBE1630-.LBB1630
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1372a
+	.4byte	0x13750
 	.uleb128 0x54
-	.4byte	0x1371e
+	.4byte	0x13744
 	.uleb128 0x54
-	.4byte	0x13712
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x13707
+	.4byte	0x1372d
 	.uleb128 0x56
 	.8byte	.LBB1631
 	.8byte	.LBE1631-.LBB1631
 	.uleb128 0x57
-	.4byte	0x13735
+	.4byte	0x1375b
 	.uleb128 0x4e
 	.8byte	.LVL559
-	.4byte	0x14458
+	.4byte	0x1447e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136c1
+	.4byte	0x136e7
 	.8byte	.LBB1632
 	.8byte	.LBE1632-.LBB1632
 	.byte	0x1
-	.2byte	0x6a7
-	.4byte	0xf090
+	.2byte	0x6bd
+	.4byte	0xf09c
 	.uleb128 0x54
-	.4byte	0x136e9
+	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x136dd
+	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136f8
 	.uleb128 0x5d
-	.4byte	0x136f6
+	.4byte	0x1371c
 	.8byte	.LBB1633
 	.8byte	.LBE1633-.LBB1633
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1372a
+	.4byte	0x13750
 	.uleb128 0x54
-	.4byte	0x1371e
+	.4byte	0x13744
 	.uleb128 0x54
-	.4byte	0x13712
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x13707
+	.4byte	0x1372d
 	.uleb128 0x56
 	.8byte	.LBB1634
 	.8byte	.LBE1634-.LBB1634
 	.uleb128 0x57
-	.4byte	0x13735
+	.4byte	0x1375b
 	.uleb128 0x4e
 	.8byte	.LVL560
-	.4byte	0x14458
+	.4byte	0x1447e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136c1
+	.4byte	0x136e7
 	.8byte	.LBB1635
 	.8byte	.LBE1635-.LBB1635
 	.byte	0x1
-	.2byte	0x6aa
-	.4byte	0xf10d
+	.2byte	0x6c0
+	.4byte	0xf119
 	.uleb128 0x54
-	.4byte	0x136e9
+	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x136dd
+	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136f8
 	.uleb128 0x5d
-	.4byte	0x136f6
+	.4byte	0x1371c
 	.8byte	.LBB1636
 	.8byte	.LBE1636-.LBB1636
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1372a
+	.4byte	0x13750
 	.uleb128 0x54
-	.4byte	0x1371e
+	.4byte	0x13744
 	.uleb128 0x54
-	.4byte	0x13712
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x13707
+	.4byte	0x1372d
 	.uleb128 0x56
 	.8byte	.LBB1637
 	.8byte	.LBE1637-.LBB1637
 	.uleb128 0x57
-	.4byte	0x13735
+	.4byte	0x1375b
 	.uleb128 0x4e
 	.8byte	.LVL561
-	.4byte	0x14458
+	.4byte	0x1447e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136c1
+	.4byte	0x136e7
 	.8byte	.LBB1638
 	.8byte	.LBE1638-.LBB1638
 	.byte	0x1
-	.2byte	0x6ad
-	.4byte	0xf18a
+	.2byte	0x6c3
+	.4byte	0xf196
 	.uleb128 0x54
-	.4byte	0x136e9
+	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x136dd
+	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136f8
 	.uleb128 0x5d
-	.4byte	0x136f6
+	.4byte	0x1371c
 	.8byte	.LBB1639
 	.8byte	.LBE1639-.LBB1639
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1372a
+	.4byte	0x13750
 	.uleb128 0x54
-	.4byte	0x1371e
+	.4byte	0x13744
 	.uleb128 0x54
-	.4byte	0x13712
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x13707
+	.4byte	0x1372d
 	.uleb128 0x56
 	.8byte	.LBB1640
 	.8byte	.LBE1640-.LBB1640
 	.uleb128 0x57
-	.4byte	0x13735
+	.4byte	0x1375b
 	.uleb128 0x4e
 	.8byte	.LVL562
-	.4byte	0x14458
+	.4byte	0x1447e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136c1
+	.4byte	0x136e7
 	.8byte	.LBB1641
 	.8byte	.LBE1641-.LBB1641
 	.byte	0x1
-	.2byte	0x6b0
-	.4byte	0xf207
+	.2byte	0x6c6
+	.4byte	0xf213
 	.uleb128 0x54
-	.4byte	0x136e9
+	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x136dd
+	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136f8
 	.uleb128 0x5d
-	.4byte	0x136f6
+	.4byte	0x1371c
 	.8byte	.LBB1642
 	.8byte	.LBE1642-.LBB1642
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1372a
+	.4byte	0x13750
 	.uleb128 0x54
-	.4byte	0x1371e
+	.4byte	0x13744
 	.uleb128 0x54
-	.4byte	0x13712
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x13707
+	.4byte	0x1372d
 	.uleb128 0x56
 	.8byte	.LBB1643
 	.8byte	.LBE1643-.LBB1643
 	.uleb128 0x57
-	.4byte	0x13735
+	.4byte	0x1375b
 	.uleb128 0x4e
 	.8byte	.LVL563
-	.4byte	0x14458
+	.4byte	0x1447e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136c1
+	.4byte	0x136e7
 	.8byte	.LBB1644
 	.8byte	.LBE1644-.LBB1644
 	.byte	0x1
-	.2byte	0x6b3
-	.4byte	0xf284
+	.2byte	0x6c9
+	.4byte	0xf290
 	.uleb128 0x54
-	.4byte	0x136e9
+	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x136dd
+	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136f8
 	.uleb128 0x5d
-	.4byte	0x136f6
+	.4byte	0x1371c
 	.8byte	.LBB1645
 	.8byte	.LBE1645-.LBB1645
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1372a
+	.4byte	0x13750
 	.uleb128 0x54
-	.4byte	0x1371e
+	.4byte	0x13744
 	.uleb128 0x54
-	.4byte	0x13712
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x13707
+	.4byte	0x1372d
 	.uleb128 0x56
 	.8byte	.LBB1646
 	.8byte	.LBE1646-.LBB1646
 	.uleb128 0x57
-	.4byte	0x13735
+	.4byte	0x1375b
 	.uleb128 0x4e
 	.8byte	.LVL564
-	.4byte	0x14458
+	.4byte	0x1447e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136c1
+	.4byte	0x136e7
 	.8byte	.LBB1647
 	.8byte	.LBE1647-.LBB1647
 	.byte	0x1
-	.2byte	0x6b6
-	.4byte	0xf301
+	.2byte	0x6cc
+	.4byte	0xf30d
 	.uleb128 0x54
-	.4byte	0x136e9
+	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x136dd
+	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136f8
 	.uleb128 0x5d
-	.4byte	0x136f6
+	.4byte	0x1371c
 	.8byte	.LBB1648
 	.8byte	.LBE1648-.LBB1648
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1372a
+	.4byte	0x13750
 	.uleb128 0x54
-	.4byte	0x1371e
+	.4byte	0x13744
 	.uleb128 0x54
-	.4byte	0x13712
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x13707
+	.4byte	0x1372d
 	.uleb128 0x56
 	.8byte	.LBB1649
 	.8byte	.LBE1649-.LBB1649
 	.uleb128 0x57
-	.4byte	0x13735
+	.4byte	0x1375b
 	.uleb128 0x4e
 	.8byte	.LVL565
-	.4byte	0x14458
+	.4byte	0x1447e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136c1
+	.4byte	0x136e7
 	.8byte	.LBB1650
 	.8byte	.LBE1650-.LBB1650
 	.byte	0x1
-	.2byte	0x6b9
-	.4byte	0xf37e
+	.2byte	0x6cf
+	.4byte	0xf38a
 	.uleb128 0x54
-	.4byte	0x136e9
+	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x136dd
+	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136f8
 	.uleb128 0x5d
-	.4byte	0x136f6
+	.4byte	0x1371c
 	.8byte	.LBB1651
 	.8byte	.LBE1651-.LBB1651
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1372a
+	.4byte	0x13750
 	.uleb128 0x54
-	.4byte	0x1371e
+	.4byte	0x13744
 	.uleb128 0x54
-	.4byte	0x13712
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x13707
+	.4byte	0x1372d
 	.uleb128 0x56
 	.8byte	.LBB1652
 	.8byte	.LBE1652-.LBB1652
 	.uleb128 0x57
-	.4byte	0x13735
+	.4byte	0x1375b
 	.uleb128 0x4e
 	.8byte	.LVL566
-	.4byte	0x14458
+	.4byte	0x1447e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136c1
+	.4byte	0x136e7
 	.8byte	.LBB1653
 	.8byte	.LBE1653-.LBB1653
 	.byte	0x1
-	.2byte	0x6bc
-	.4byte	0xf3fb
+	.2byte	0x6d2
+	.4byte	0xf407
 	.uleb128 0x54
-	.4byte	0x136e9
+	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x136dd
+	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136f8
 	.uleb128 0x5d
-	.4byte	0x136f6
+	.4byte	0x1371c
 	.8byte	.LBB1654
 	.8byte	.LBE1654-.LBB1654
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1372a
+	.4byte	0x13750
 	.uleb128 0x54
-	.4byte	0x1371e
+	.4byte	0x13744
 	.uleb128 0x54
-	.4byte	0x13712
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x13707
+	.4byte	0x1372d
 	.uleb128 0x56
 	.8byte	.LBB1655
 	.8byte	.LBE1655-.LBB1655
 	.uleb128 0x57
-	.4byte	0x13735
+	.4byte	0x1375b
 	.uleb128 0x4e
 	.8byte	.LVL567
-	.4byte	0x14458
+	.4byte	0x1447e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x136c1
+	.4byte	0x136e7
 	.8byte	.LBB1656
 	.8byte	.LBE1656-.LBB1656
 	.byte	0x1
-	.2byte	0x6bf
+	.2byte	0x6d5
 	.uleb128 0x54
-	.4byte	0x136e9
+	.4byte	0x1370f
 	.uleb128 0x54
-	.4byte	0x136dd
+	.4byte	0x13703
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136f8
 	.uleb128 0x5d
-	.4byte	0x136f6
+	.4byte	0x1371c
 	.8byte	.LBB1657
 	.8byte	.LBE1657-.LBB1657
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1372a
+	.4byte	0x13750
 	.uleb128 0x54
-	.4byte	0x1371e
+	.4byte	0x13744
 	.uleb128 0x54
-	.4byte	0x13712
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x13707
+	.4byte	0x1372d
 	.uleb128 0x56
 	.8byte	.LBB1658
 	.8byte	.LBE1658-.LBB1658
 	.uleb128 0x57
-	.4byte	0x13735
+	.4byte	0x1375b
 	.uleb128 0x4e
 	.8byte	.LVL568
-	.4byte	0x14458
+	.4byte	0x1447e
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0xfe78
+	.4byte	0xfe84
 	.8byte	.LBB1665
 	.4byte	.Ldebug_ranges0+0xcd0
 	.byte	0x1
-	.2byte	0x9a3
-	.4byte	0xf623
+	.2byte	0x9b9
+	.4byte	0xf62f
 	.uleb128 0x54
-	.4byte	0xfe89
+	.4byte	0xfe95
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xcd0
 	.uleb128 0x60
-	.4byte	0xfe95
-	.4byte	.LLST156
-	.uleb128 0x57
 	.4byte	0xfea1
+	.4byte	.LLST156
 	.uleb128 0x57
 	.4byte	0xfead
 	.uleb128 0x57
 	.4byte	0xfeb9
-	.uleb128 0x61
+	.uleb128 0x57
 	.4byte	0xfec5
+	.uleb128 0x61
+	.4byte	0xfed1
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x57
-	.4byte	0xfecf
-	.uleb128 0x57
 	.4byte	0xfedb
 	.uleb128 0x57
 	.4byte	0xfee7
+	.uleb128 0x57
+	.4byte	0xfef3
 	.uleb128 0x5b
-	.4byte	0x137d5
+	.4byte	0x137fb
 	.8byte	.LBB1667
 	.4byte	.Ldebug_ranges0+0xd40
 	.byte	0x1
-	.2byte	0x88d
-	.4byte	0xf4e6
+	.2byte	0x8a3
+	.4byte	0xf4f2
 	.uleb128 0x54
-	.4byte	0x137e5
+	.4byte	0x1380b
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x1379f
+	.4byte	0x137c5
 	.8byte	.LBB1671
 	.4byte	.Ldebug_ranges0+0xd70
 	.byte	0x1
-	.2byte	0x8a8
-	.4byte	0xf51b
+	.2byte	0x8be
+	.4byte	0xf527
 	.uleb128 0x54
-	.4byte	0x137c8
+	.4byte	0x137ee
 	.uleb128 0x54
-	.4byte	0x137bc
+	.4byte	0x137e2
 	.uleb128 0x54
-	.4byte	0x137b0
+	.4byte	0x137d6
 	.uleb128 0x4e
 	.8byte	.LVL574
-	.4byte	0x1444b
+	.4byte	0x14471
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1379f
+	.4byte	0x137c5
 	.8byte	.LBB1679
 	.8byte	.LBE1679-.LBB1679
 	.byte	0x1
-	.2byte	0x8ab
-	.4byte	0xf554
+	.2byte	0x8c1
+	.4byte	0xf560
 	.uleb128 0x54
-	.4byte	0x137c8
+	.4byte	0x137ee
 	.uleb128 0x54
-	.4byte	0x137bc
+	.4byte	0x137e2
 	.uleb128 0x54
-	.4byte	0x137b0
+	.4byte	0x137d6
 	.uleb128 0x4e
 	.8byte	.LVL575
-	.4byte	0x1444b
+	.4byte	0x14471
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1379f
+	.4byte	0x137c5
 	.8byte	.LBB1681
 	.8byte	.LBE1681-.LBB1681
 	.byte	0x1
-	.2byte	0x8ae
-	.4byte	0xf58d
+	.2byte	0x8c4
+	.4byte	0xf599
 	.uleb128 0x54
-	.4byte	0x137c8
+	.4byte	0x137ee
 	.uleb128 0x54
-	.4byte	0x137bc
+	.4byte	0x137e2
 	.uleb128 0x54
-	.4byte	0x137b0
+	.4byte	0x137d6
 	.uleb128 0x4e
 	.8byte	.LVL576
-	.4byte	0x1444b
+	.4byte	0x14471
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1379f
+	.4byte	0x137c5
 	.8byte	.LBB1683
 	.8byte	.LBE1683-.LBB1683
 	.byte	0x1
-	.2byte	0x8b6
-	.4byte	0xf5c6
+	.2byte	0x8cc
+	.4byte	0xf5d2
 	.uleb128 0x54
-	.4byte	0x137c8
+	.4byte	0x137ee
 	.uleb128 0x54
-	.4byte	0x137bc
+	.4byte	0x137e2
 	.uleb128 0x54
-	.4byte	0x137b0
+	.4byte	0x137d6
 	.uleb128 0x4e
 	.8byte	.LVL577
-	.4byte	0x1444b
+	.4byte	0x14471
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL570
-	.4byte	0x14465
+	.4byte	0x1448b
 	.uleb128 0x4e
 	.8byte	.LVL571
-	.4byte	0x14472
+	.4byte	0x14498
 	.uleb128 0x4e
 	.8byte	.LVL572
-	.4byte	0x1447e
+	.4byte	0x144a4
 	.uleb128 0x4e
 	.8byte	.LVL573
-	.4byte	0x1448a
+	.4byte	0x144b0
 	.uleb128 0x4e
 	.8byte	.LVL578
-	.4byte	0x14496
+	.4byte	0x144bc
 	.uleb128 0x4e
 	.8byte	.LVL579
-	.4byte	0x144a0
+	.4byte	0x144c6
 	.uleb128 0x4e
 	.8byte	.LVL592
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0xfef2
+	.4byte	0xfefe
 	.8byte	.LBB1692
 	.4byte	.Ldebug_ranges0+0xdc0
 	.byte	0x1
-	.2byte	0x9aa
-	.4byte	0xf6fc
+	.2byte	0x9c0
+	.4byte	0xf708
 	.uleb128 0x54
-	.4byte	0xff03
+	.4byte	0xff0f
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xdc0
 	.uleb128 0x57
-	.4byte	0xff0f
-	.uleb128 0x60
 	.4byte	0xff1b
+	.uleb128 0x60
+	.4byte	0xff27
 	.4byte	.LLST157
 	.uleb128 0x57
-	.4byte	0xff27
-	.uleb128 0x61
 	.4byte	0xff33
+	.uleb128 0x61
+	.4byte	0xff3f
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x60
-	.4byte	0xff3d
-	.4byte	.LLST158
-	.uleb128 0x57
 	.4byte	0xff49
+	.4byte	.LLST158
 	.uleb128 0x57
 	.4byte	0xff55
+	.uleb128 0x57
+	.4byte	0xff61
 	.uleb128 0x5b
-	.4byte	0x137d5
+	.4byte	0x137fb
 	.8byte	.LBB1694
 	.4byte	.Ldebug_ranges0+0xe20
 	.byte	0x1
-	.2byte	0x85d
-	.4byte	0xf692
+	.2byte	0x873
+	.4byte	0xf69e
 	.uleb128 0x54
-	.4byte	0x137e5
+	.4byte	0x1380b
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL581
-	.4byte	0x14465
+	.4byte	0x1448b
 	.uleb128 0x4e
 	.8byte	.LVL582
-	.4byte	0x14472
+	.4byte	0x14498
 	.uleb128 0x4e
 	.8byte	.LVL596
-	.4byte	0x1447e
+	.4byte	0x144a4
 	.uleb128 0x4e
 	.8byte	.LVL597
-	.4byte	0x144b9
+	.4byte	0x144df
 	.uleb128 0x4e
 	.8byte	.LVL683
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL684
-	.4byte	0x144c5
+	.4byte	0x144eb
 	.uleb128 0x4e
 	.8byte	.LVL685
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL699
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0xfe40
+	.4byte	0xfe4c
 	.8byte	.LBB1704
 	.4byte	.Ldebug_ranges0+0xe50
 	.byte	0x1
-	.2byte	0x9b1
-	.4byte	0xf889
+	.2byte	0x9c7
+	.4byte	0xf895
 	.uleb128 0x54
-	.4byte	0xfe51
+	.4byte	0xfe5d
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xe50
 	.uleb128 0x61
-	.4byte	0xfe5d
+	.4byte	0xfe69
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5b
-	.4byte	0x139ae
+	.4byte	0x139d4
 	.8byte	.LBB1706
 	.4byte	.Ldebug_ranges0+0xe90
 	.byte	0x1
-	.2byte	0x8c3
-	.4byte	0xf783
+	.2byte	0x8d9
+	.4byte	0xf78f
 	.uleb128 0x54
-	.4byte	0x139bb
+	.4byte	0x139e1
 	.uleb128 0x56
 	.8byte	.LBB1708
 	.8byte	.LBE1708-.LBB1708
 	.uleb128 0x57
-	.4byte	0x139e6
+	.4byte	0x13a0c
 	.uleb128 0x5c
-	.4byte	0x13b8c
+	.4byte	0x13bb2
 	.8byte	.LBB1709
 	.8byte	.LBE1709-.LBB1709
 	.byte	0x10
 	.byte	0x1c
 	.uleb128 0x54
-	.4byte	0x13baf
+	.4byte	0x13bd5
 	.uleb128 0x54
-	.4byte	0x13ba3
+	.4byte	0x13bc9
 	.uleb128 0x54
-	.4byte	0x13b99
+	.4byte	0x13bbf
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13acb
+	.4byte	0x13af1
 	.8byte	.LBB1713
 	.8byte	.LBE1713-.LBB1713
 	.byte	0x1
-	.2byte	0x8cb
-	.4byte	0xf7ce
+	.2byte	0x8e1
+	.4byte	0xf7da
 	.uleb128 0x54
-	.4byte	0x13ae1
+	.4byte	0x13b07
 	.uleb128 0x54
-	.4byte	0x13ad8
+	.4byte	0x13afe
 	.uleb128 0x56
 	.8byte	.LBB1714
 	.8byte	.LBE1714-.LBB1714
 	.uleb128 0x60
-	.4byte	0x13aea
+	.4byte	0x13b10
 	.4byte	.LLST159
 	.uleb128 0x60
-	.4byte	0x13af4
+	.4byte	0x13b1a
 	.4byte	.LLST160
 	.byte	0
 	.byte	0
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0xec0
-	.4byte	0xf7fb
+	.4byte	0xf807
 	.uleb128 0x60
-	.4byte	0xfe6a
+	.4byte	0xfe76
 	.4byte	.LLST161
 	.uleb128 0x4e
 	.8byte	.LVL604
-	.4byte	0x144d1
+	.4byte	0x144f7
 	.uleb128 0x4e
 	.8byte	.LVL606
-	.4byte	0x144dd
+	.4byte	0x14503
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13acb
+	.4byte	0x13af1
 	.8byte	.LBB1717
 	.8byte	.LBE1717-.LBB1717
 	.byte	0x1
-	.2byte	0x8d4
-	.4byte	0xf846
+	.2byte	0x8ea
+	.4byte	0xf852
 	.uleb128 0x54
-	.4byte	0x13ae1
+	.4byte	0x13b07
 	.uleb128 0x54
-	.4byte	0x13ad8
+	.4byte	0x13afe
 	.uleb128 0x56
 	.8byte	.LBB1718
 	.8byte	.LBE1718-.LBB1718
 	.uleb128 0x60
-	.4byte	0x13aea
+	.4byte	0x13b10
 	.4byte	.LLST162
 	.uleb128 0x60
-	.4byte	0x13af4
+	.4byte	0x13b1a
 	.4byte	.LLST163
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL598
-	.4byte	0x144d1
+	.4byte	0x144f7
 	.uleb128 0x4e
 	.8byte	.LVL599
-	.4byte	0x144ea
+	.4byte	0x14510
 	.uleb128 0x4e
 	.8byte	.LVL607
-	.4byte	0x144ea
+	.4byte	0x14510
 	.uleb128 0x4e
 	.8byte	.LVL686
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL690
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0xfe26
+	.4byte	0xfe32
 	.8byte	.LBB1721
 	.8byte	.LBE1721-.LBB1721
 	.byte	0x1
-	.2byte	0x9b8
-	.4byte	0xf923
+	.2byte	0x9ce
+	.4byte	0xf92f
 	.uleb128 0x54
-	.4byte	0xfe33
+	.4byte	0xfe3f
 	.uleb128 0x5b
-	.4byte	0x13405
+	.4byte	0x1342b
 	.8byte	.LBB1723
 	.4byte	.Ldebug_ranges0+0xef0
 	.byte	0x1
-	.2byte	0x8e4
-	.4byte	0xf8ee
+	.2byte	0x8fa
+	.4byte	0xf8fa
 	.uleb128 0x54
-	.4byte	0x13428
+	.4byte	0x1344e
 	.uleb128 0x54
-	.4byte	0x1341d
+	.4byte	0x13443
 	.uleb128 0x54
-	.4byte	0x13412
+	.4byte	0x13438
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xef0
 	.uleb128 0x60
-	.4byte	0x13433
+	.4byte	0x13459
 	.4byte	.LLST164
 	.uleb128 0x4e
 	.8byte	.LVL614
-	.4byte	0x144f7
+	.4byte	0x1451d
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL615
-	.4byte	0x14503
+	.4byte	0x14529
 	.uleb128 0x4e
 	.8byte	.LVL616
-	.4byte	0x1450f
+	.4byte	0x14535
 	.uleb128 0x4e
 	.8byte	.LVL617
-	.4byte	0x14503
+	.4byte	0x14529
 	.uleb128 0x4e
 	.8byte	.LVL618
-	.4byte	0x1450f
+	.4byte	0x14535
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0xfd84
+	.4byte	0xfd90
 	.8byte	.LBB1733
 	.4byte	.Ldebug_ranges0+0xf50
 	.byte	0x1
-	.2byte	0x9bb
-	.4byte	0xfbc6
+	.2byte	0x9d1
+	.4byte	0xfbd2
 	.uleb128 0x54
-	.4byte	0xfda1
+	.4byte	0xfdad
 	.uleb128 0x54
-	.4byte	0xfd95
+	.4byte	0xfda1
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xf50
 	.uleb128 0x57
-	.4byte	0xfdad
-	.uleb128 0x60
 	.4byte	0xfdb9
-	.4byte	.LLST165
 	.uleb128 0x60
 	.4byte	0xfdc5
-	.4byte	.LLST166
+	.4byte	.LLST165
 	.uleb128 0x60
 	.4byte	0xfdd1
-	.4byte	.LLST167
+	.4byte	.LLST166
 	.uleb128 0x60
 	.4byte	0xfddd
-	.4byte	.LLST168
+	.4byte	.LLST167
 	.uleb128 0x60
 	.4byte	0xfde9
-	.4byte	.LLST169
+	.4byte	.LLST168
 	.uleb128 0x60
 	.4byte	0xfdf5
+	.4byte	.LLST169
+	.uleb128 0x60
+	.4byte	0xfe01
 	.4byte	.LLST170
 	.uleb128 0x57
-	.4byte	0xfe01
-	.uleb128 0x60
 	.4byte	0xfe0d
-	.4byte	.LLST171
 	.uleb128 0x60
 	.4byte	0xfe19
+	.4byte	.LLST171
+	.uleb128 0x60
+	.4byte	0xfe25
 	.4byte	.LLST172
 	.uleb128 0x53
-	.4byte	0x11853
+	.4byte	0x1185f
 	.8byte	.LBB1735
 	.8byte	.LBE1735-.LBB1735
 	.byte	0x1
-	.2byte	0x91c
-	.4byte	0xfa05
+	.2byte	0x932
+	.4byte	0xfa11
 	.uleb128 0x54
-	.4byte	0x11864
+	.4byte	0x11870
 	.uleb128 0x54
-	.4byte	0x11864
+	.4byte	0x11870
 	.uleb128 0x56
 	.8byte	.LBB1736
 	.8byte	.LBE1736-.LBB1736
 	.uleb128 0x60
-	.4byte	0x11870
+	.4byte	0x1187c
 	.4byte	.LLST173
 	.uleb128 0x4e
 	.8byte	.LVL635
-	.4byte	0x1451b
+	.4byte	0x14541
 	.uleb128 0x4e
 	.8byte	.LVL637
-	.4byte	0x144a0
+	.4byte	0x144c6
 	.uleb128 0x4e
 	.8byte	.LVL638
-	.4byte	0x14527
+	.4byte	0x1454d
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13583
+	.4byte	0x135a9
 	.8byte	.LBB1737
 	.8byte	.LBE1737-.LBB1737
 	.byte	0x1
-	.2byte	0x902
-	.4byte	0xfa5c
+	.2byte	0x918
+	.4byte	0xfa68
 	.uleb128 0x54
-	.4byte	0x135a0
+	.4byte	0x135c6
 	.uleb128 0x54
-	.4byte	0x13594
+	.4byte	0x135ba
 	.uleb128 0x5d
-	.4byte	0x135ad
+	.4byte	0x135d3
 	.8byte	.LBB1738
 	.8byte	.LBE1738-.LBB1738
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x135ca
+	.4byte	0x135f0
 	.uleb128 0x54
-	.4byte	0x135be
+	.4byte	0x135e4
 	.uleb128 0x4e
 	.8byte	.LVL655
-	.4byte	0x14533
+	.4byte	0x14559
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13583
+	.4byte	0x135a9
 	.8byte	.LBB1740
 	.8byte	.LBE1740-.LBB1740
 	.byte	0x1
-	.2byte	0x910
-	.4byte	0xfab3
+	.2byte	0x926
+	.4byte	0xfabf
 	.uleb128 0x54
-	.4byte	0x135a0
+	.4byte	0x135c6
 	.uleb128 0x54
-	.4byte	0x13594
+	.4byte	0x135ba
 	.uleb128 0x5d
-	.4byte	0x135ad
+	.4byte	0x135d3
 	.8byte	.LBB1741
 	.8byte	.LBE1741-.LBB1741
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x135ca
+	.4byte	0x135f0
 	.uleb128 0x54
-	.4byte	0x135be
+	.4byte	0x135e4
 	.uleb128 0x4e
 	.8byte	.LVL668
-	.4byte	0x14533
+	.4byte	0x14559
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL620
-	.4byte	0x14540
+	.4byte	0x14566
 	.uleb128 0x4e
 	.8byte	.LVL622
-	.4byte	0x14540
+	.4byte	0x14566
 	.uleb128 0x4e
 	.8byte	.LVL624
-	.4byte	0x1454c
+	.4byte	0x14572
 	.uleb128 0x4e
 	.8byte	.LVL629
-	.4byte	0x1454c
+	.4byte	0x14572
 	.uleb128 0x4e
 	.8byte	.LVL633
-	.4byte	0x14432
+	.4byte	0x14458
 	.uleb128 0x4e
 	.8byte	.LVL634
-	.4byte	0x14559
+	.4byte	0x1457f
 	.uleb128 0x4e
 	.8byte	.LVL639
-	.4byte	0x14565
+	.4byte	0x1458b
 	.uleb128 0x4e
 	.8byte	.LVL640
-	.4byte	0x14565
+	.4byte	0x1458b
 	.uleb128 0x4e
 	.8byte	.LVL652
-	.4byte	0x14571
+	.4byte	0x14597
 	.uleb128 0x4e
 	.8byte	.LVL654
-	.4byte	0x14432
+	.4byte	0x14458
 	.uleb128 0x4e
 	.8byte	.LVL659
-	.4byte	0x1457d
+	.4byte	0x145a3
 	.uleb128 0x4e
 	.8byte	.LVL662
-	.4byte	0x1451b
+	.4byte	0x14541
 	.uleb128 0x4e
 	.8byte	.LVL664
-	.4byte	0x1457d
+	.4byte	0x145a3
 	.uleb128 0x4e
 	.8byte	.LVL665
-	.4byte	0x14527
+	.4byte	0x1454d
 	.uleb128 0x4e
 	.8byte	.LVL667
-	.4byte	0x14432
+	.4byte	0x14458
 	.uleb128 0x4e
 	.8byte	.LVL671
-	.4byte	0x1457d
+	.4byte	0x145a3
 	.uleb128 0x4e
 	.8byte	.LVL675
-	.4byte	0x1451b
+	.4byte	0x14541
 	.uleb128 0x4e
 	.8byte	.LVL677
-	.4byte	0x1457d
+	.4byte	0x145a3
 	.uleb128 0x4e
 	.8byte	.LVL678
-	.4byte	0x14527
+	.4byte	0x1454d
 	.uleb128 0x4e
 	.8byte	.LVL697
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL705
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13657
+	.4byte	0x1367d
 	.8byte	.LBB1747
 	.8byte	.LBE1747-.LBB1747
 	.byte	0x1
-	.2byte	0x9bd
-	.4byte	0xfc0f
+	.2byte	0x9d3
+	.4byte	0xfc1b
 	.uleb128 0x54
-	.4byte	0x1366f
+	.4byte	0x13695
 	.uleb128 0x54
-	.4byte	0x13664
+	.4byte	0x1368a
 	.uleb128 0x5c
-	.4byte	0x1375b
+	.4byte	0x13781
 	.8byte	.LBB1748
 	.8byte	.LBE1748-.LBB1748
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x54
-	.4byte	0x13774
+	.4byte	0x1379a
 	.uleb128 0x54
-	.4byte	0x13768
+	.4byte	0x1378e
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0xff78
+	.4byte	0xff84
 	.8byte	.LBB1750
 	.8byte	.LBE1750-.LBB1750
 	.byte	0x1
-	.2byte	0x9c0
-	.4byte	0xfca6
+	.2byte	0x9d6
+	.4byte	0xfcb2
 	.uleb128 0x54
-	.4byte	0xff89
+	.4byte	0xff95
 	.uleb128 0x4e
 	.8byte	.LVL641
-	.4byte	0x14587
+	.4byte	0x145ad
 	.uleb128 0x4e
 	.8byte	.LVL642
-	.4byte	0x14587
+	.4byte	0x145ad
 	.uleb128 0x4e
 	.8byte	.LVL643
-	.4byte	0x14593
+	.4byte	0x145b9
 	.uleb128 0x4e
 	.8byte	.LVL644
-	.4byte	0x14593
+	.4byte	0x145b9
 	.uleb128 0x4e
 	.8byte	.LVL645
-	.4byte	0x14593
+	.4byte	0x145b9
 	.uleb128 0x4e
 	.8byte	.LVL646
-	.4byte	0x14593
+	.4byte	0x145b9
 	.uleb128 0x4e
 	.8byte	.LVL647
-	.4byte	0x14593
+	.4byte	0x145b9
 	.uleb128 0x4e
 	.8byte	.LVL648
-	.4byte	0x14593
+	.4byte	0x145b9
 	.uleb128 0x4e
 	.8byte	.LVL649
-	.4byte	0x14593
+	.4byte	0x145b9
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL525
-	.4byte	0x14465
+	.4byte	0x1448b
 	.uleb128 0x4e
 	.8byte	.LVL526
-	.4byte	0x145a0
+	.4byte	0x145c6
 	.uleb128 0x4e
 	.8byte	.LVL528
-	.4byte	0x145ac
+	.4byte	0x145d2
 	.uleb128 0x4e
 	.8byte	.LVL534
-	.4byte	0x145b9
+	.4byte	0x145df
 	.uleb128 0x4e
 	.8byte	.LVL537
-	.4byte	0x145c6
+	.4byte	0x145ec
 	.uleb128 0x4e
 	.8byte	.LVL538
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL546
-	.4byte	0x14432
+	.4byte	0x14458
 	.uleb128 0x4e
 	.8byte	.LVL583
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL585
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL588
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL590
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL593
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL650
-	.4byte	0x14432
+	.4byte	0x14458
 	.uleb128 0x4e
 	.8byte	.LVL681
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL687
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL692
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL701
-	.4byte	0x145d3
+	.4byte	0x145f9
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3046
+	.4byte	.LASF3048
 	.byte	0x1
-	.2byte	0x8f0
+	.2byte	0x906
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe26
+	.4byte	0xfe32
 	.uleb128 0x64
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x8f0
-	.4byte	0xe4b6
+	.2byte	0x906
+	.4byte	0xe4c2
 	.uleb128 0x65
-	.4byte	.LASF3002
+	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x8f0
-	.4byte	0xe160
+	.2byte	0x906
+	.4byte	0xe16c
 	.uleb128 0x46
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x8f2
-	.4byte	0xe7a7
+	.2byte	0x908
+	.4byte	0xe7b3
 	.uleb128 0x46
-	.4byte	.LASF3038
+	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0x8f3
+	.2byte	0x909
 	.4byte	0x6d
 	.uleb128 0x46
-	.4byte	.LASF3039
+	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0x8f4
+	.2byte	0x90a
 	.4byte	0x6d
 	.uleb128 0x46
-	.4byte	.LASF3040
+	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0x8f5
+	.2byte	0x90b
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3041
+	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0x8f6
+	.2byte	0x90c
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3042
+	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0x8f7
+	.2byte	0x90d
 	.4byte	0x21e
 	.uleb128 0x46
-	.4byte	.LASF3043
+	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0x8f8
+	.2byte	0x90e
 	.4byte	0x21e
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x8f9
-	.4byte	0xe451
+	.2byte	0x90f
+	.4byte	0xe45d
 	.uleb128 0x46
-	.4byte	.LASF3044
+	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0x8fa
+	.2byte	0x910
 	.4byte	0x458
 	.uleb128 0x46
-	.4byte	.LASF3045
+	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0x8fb
+	.2byte	0x911
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3064
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x8d9
+	.2byte	0x8ef
 	.byte	0x1
-	.4byte	0xfe40
+	.4byte	0xfe4c
 	.uleb128 0x65
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x8d9
-	.4byte	0xe7a7
+	.2byte	0x8ef
+	.4byte	0xe7b3
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3047
+	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0x8bf
+	.2byte	0x8d5
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe78
+	.4byte	0xfe84
 	.uleb128 0x65
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x8bf
-	.4byte	0xe7a7
+	.2byte	0x8d5
+	.4byte	0xe7b3
 	.uleb128 0x46
 	.4byte	.LASF2466
 	.byte	0x1
-	.2byte	0x8c1
+	.2byte	0x8d7
 	.4byte	0xd81a
 	.uleb128 0x67
 	.uleb128 0x52
 	.string	"__k"
 	.byte	0x1
-	.2byte	0x8ce
+	.2byte	0x8e4
 	.4byte	0x2f05
 	.byte	0
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3048
+	.4byte	.LASF3050
 	.byte	0x1
-	.2byte	0x876
+	.2byte	0x88c
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfef2
+	.4byte	0xfefe
 	.uleb128 0x64
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x876
-	.4byte	0xe4b6
+	.2byte	0x88c
+	.4byte	0xe4c2
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x878
+	.2byte	0x88e
 	.4byte	0xa570
 	.uleb128 0x46
-	.4byte	.LASF3002
+	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x879
-	.4byte	0xe160
+	.2byte	0x88f
+	.4byte	0xe16c
 	.uleb128 0x46
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x87a
-	.4byte	0xe7a7
+	.2byte	0x890
+	.4byte	0xe7b3
 	.uleb128 0x46
-	.4byte	.LASF3049
+	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0x87b
+	.2byte	0x891
 	.4byte	0xb894
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x87c
+	.2byte	0x892
 	.4byte	0x974c
 	.uleb128 0x46
-	.4byte	.LASF3050
+	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0x87d
+	.2byte	0x893
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x87e
+	.2byte	0x894
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x87e
+	.2byte	0x894
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3051
+	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0x84a
+	.2byte	0x860
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xff63
+	.4byte	0xff6f
 	.uleb128 0x65
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x84a
-	.4byte	0xe7a7
+	.2byte	0x860
+	.4byte	0xe7b3
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x84c
+	.2byte	0x862
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x84d
+	.2byte	0x863
 	.4byte	0xa570
 	.uleb128 0x46
-	.4byte	.LASF3049
+	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0x84e
+	.2byte	0x864
 	.4byte	0xb894
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x84f
+	.2byte	0x865
 	.4byte	0x974c
 	.uleb128 0x46
-	.4byte	.LASF2965
+	.4byte	.LASF2967
 	.byte	0x1
-	.2byte	0x850
+	.2byte	0x866
 	.4byte	0x29
 	.uleb128 0x46
-	.4byte	.LASF2966
+	.4byte	.LASF2968
 	.byte	0x1
-	.2byte	0x851
+	.2byte	0x867
 	.4byte	0xc6
 	.uleb128 0x68
-	.4byte	.LASF3030
-	.4byte	0xff73
-	.4byte	.LASF3051
+	.4byte	.LASF3032
+	.4byte	0xff7f
+	.4byte	.LASF3053
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xff73
+	.4byte	0xff7f
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x12
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xff63
+	.4byte	0xff6f
 	.uleb128 0x63
-	.4byte	.LASF3052
+	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0x83a
+	.2byte	0x850
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xff96
+	.4byte	0xffa2
 	.uleb128 0x65
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x83a
-	.4byte	0xe7a7
+	.2byte	0x850
+	.4byte	0xe7b3
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3053
+	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0x831
+	.2byte	0x847
 	.4byte	0x2ee
 	.8byte	.LFB2843
 	.8byte	.LFE2843-.LFB2843
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfff6
+	.4byte	0x10002
 	.uleb128 0x58
 	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x831
+	.2byte	0x847
 	.4byte	0xa570
 	.4byte	.LLST77
 	.uleb128 0x58
 	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x832
+	.2byte	0x848
 	.4byte	0xb3eb
 	.4byte	.LLST78
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x833
+	.2byte	0x849
 	.4byte	0x21e
 	.4byte	.LLST79
 	.uleb128 0x4e
 	.8byte	.LVL304
-	.4byte	0x145dd
+	.4byte	0x14603
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3054
+	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0x828
+	.2byte	0x83e
 	.4byte	0x2ee
 	.8byte	.LFB2842
 	.8byte	.LFE2842-.LFB2842
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10056
+	.4byte	0x10062
 	.uleb128 0x58
 	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x828
+	.2byte	0x83e
 	.4byte	0xa570
 	.4byte	.LLST80
 	.uleb128 0x58
 	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x829
+	.2byte	0x83f
 	.4byte	0xb3eb
 	.4byte	.LLST81
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x82a
+	.2byte	0x840
 	.4byte	0x21e
 	.4byte	.LLST82
 	.uleb128 0x4e
 	.8byte	.LVL309
-	.4byte	0x145e9
+	.4byte	0x1460f
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3055
+	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0x81f
+	.2byte	0x835
 	.4byte	0x2ee
 	.8byte	.LFB2841
 	.8byte	.LFE2841-.LFB2841
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x100b6
+	.4byte	0x100c2
 	.uleb128 0x58
 	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x81f
+	.2byte	0x835
 	.4byte	0xa570
 	.4byte	.LLST83
 	.uleb128 0x58
 	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x820
+	.2byte	0x836
 	.4byte	0xb3eb
 	.4byte	.LLST84
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x821
+	.2byte	0x837
 	.4byte	0x21e
 	.4byte	.LLST85
 	.uleb128 0x4e
 	.8byte	.LVL314
-	.4byte	0x145e9
+	.4byte	0x1460f
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3056
+	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x807
+	.2byte	0x81d
 	.4byte	0x2ee
 	.8byte	.LFB2840
 	.8byte	.LFE2840-.LFB2840
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10186
+	.4byte	0x10192
 	.uleb128 0x58
 	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x807
+	.2byte	0x81d
 	.4byte	0xa570
 	.4byte	.LLST95
 	.uleb128 0x58
 	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x808
+	.2byte	0x81e
 	.4byte	0xb3eb
 	.4byte	.LLST96
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x809
+	.2byte	0x81f
 	.4byte	0x56
 	.4byte	.LLST97
 	.uleb128 0x58
 	.4byte	.LASF383
 	.byte	0x1
-	.2byte	0x809
+	.2byte	0x81f
 	.4byte	0x2e3
 	.4byte	.LLST98
 	.uleb128 0x5a
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x80b
-	.4byte	0xe4b6
+	.2byte	0x821
+	.4byte	0xe4c2
 	.4byte	.LLST99
 	.uleb128 0x59
 	.4byte	.LASF2456
 	.byte	0x1
-	.2byte	0x80c
+	.2byte	0x822
 	.4byte	0xc6
 	.4byte	.LLST100
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x80c
+	.2byte	0x822
 	.4byte	0xc6
 	.uleb128 0x4e
 	.8byte	.LVL340
-	.4byte	0x145f6
+	.4byte	0x1461c
 	.uleb128 0x4e
 	.8byte	.LVL342
-	.4byte	0x14603
+	.4byte	0x14629
 	.uleb128 0x4e
 	.8byte	.LVL347
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL350
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL351
-	.4byte	0x145d3
+	.4byte	0x145f9
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3057
+	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x7fb
+	.2byte	0x811
 	.4byte	0x2ee
 	.8byte	.LFB2839
 	.8byte	.LFE2839-.LFB2839
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10220
+	.4byte	0x1022c
 	.uleb128 0x58
 	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x7fb
+	.2byte	0x811
 	.4byte	0xa570
 	.4byte	.LLST86
 	.uleb128 0x58
 	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x7fc
+	.2byte	0x812
 	.4byte	0xb3eb
 	.4byte	.LLST87
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7fd
+	.2byte	0x813
 	.4byte	0x21e
 	.4byte	.LLST88
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x7ff
-	.4byte	0xe4b6
+	.2byte	0x815
+	.4byte	0xe4c2
 	.uleb128 0x46
 	.4byte	.LASF2456
 	.byte	0x1
-	.2byte	0x800
+	.2byte	0x816
 	.4byte	0xc6
 	.uleb128 0x53
-	.4byte	0x13328
+	.4byte	0x1334e
 	.8byte	.LBB1218
 	.8byte	.LBE1218-.LBB1218
 	.byte	0x1
-	.2byte	0x802
-	.4byte	0x10212
+	.2byte	0x818
+	.4byte	0x1021e
 	.uleb128 0x54
-	.4byte	0x13338
+	.4byte	0x1335e
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL319
-	.4byte	0x145e9
+	.4byte	0x1460f
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3058
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x7ed
+	.2byte	0x803
 	.4byte	0x2ee
 	.8byte	.LFB2838
 	.8byte	.LFE2838-.LFB2838
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x102c9
+	.4byte	0x102d5
 	.uleb128 0x58
 	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x7ed
+	.2byte	0x803
 	.4byte	0xa570
 	.4byte	.LLST89
 	.uleb128 0x58
 	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x7ee
+	.2byte	0x804
 	.4byte	0xb3eb
 	.4byte	.LLST90
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7ef
+	.2byte	0x805
 	.4byte	0x21e
 	.4byte	.LLST91
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x7f1
-	.4byte	0xe4b6
+	.2byte	0x807
+	.4byte	0xe4c2
 	.uleb128 0x69
 	.string	"t"
 	.byte	0x1
-	.2byte	0x7f2
+	.2byte	0x808
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x5b
-	.4byte	0x13344
+	.4byte	0x1336a
 	.8byte	.LBB1220
 	.4byte	.Ldebug_ranges0+0x6a0
 	.byte	0x1
-	.2byte	0x7f4
-	.4byte	0x102ae
+	.2byte	0x80a
+	.4byte	0x102ba
 	.uleb128 0x54
-	.4byte	0x1335f
+	.4byte	0x13385
 	.uleb128 0x54
-	.4byte	0x13354
+	.4byte	0x1337a
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL326
-	.4byte	0x145e9
+	.4byte	0x1460f
 	.uleb128 0x4e
 	.8byte	.LVL329
-	.4byte	0x145d3
+	.4byte	0x145f9
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3059
+	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x7e2
+	.2byte	0x7f8
 	.4byte	0x2ee
 	.8byte	.LFB2837
 	.8byte	.LFE2837-.LFB2837
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10335
+	.4byte	0x10341
 	.uleb128 0x58
 	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x7e2
+	.2byte	0x7f8
 	.4byte	0xa570
 	.4byte	.LLST92
 	.uleb128 0x58
 	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x7e3
+	.2byte	0x7f9
 	.4byte	0xb3eb
 	.4byte	.LLST93
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7e4
+	.2byte	0x7fa
 	.4byte	0x21e
 	.4byte	.LLST94
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x7e6
-	.4byte	0xe4b6
+	.2byte	0x7fc
+	.4byte	0xe4c2
 	.uleb128 0x4e
 	.8byte	.LVL334
-	.4byte	0x145e9
+	.4byte	0x1460f
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3060
+	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x7d7
+	.2byte	0x7ed
 	.4byte	0x2ee
 	.8byte	.LFB2836
 	.8byte	.LFE2836-.LFB2836
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x103ae
+	.4byte	0x103ba
 	.uleb128 0x58
 	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x7d7
+	.2byte	0x7ed
 	.4byte	0xa570
 	.4byte	.LLST101
 	.uleb128 0x58
 	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x7d8
+	.2byte	0x7ee
 	.4byte	0xb3eb
 	.4byte	.LLST102
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7d9
+	.2byte	0x7ef
 	.4byte	0x21e
 	.4byte	.LLST103
 	.uleb128 0x46
-	.4byte	.LASF3061
+	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x7db
+	.2byte	0x7f1
 	.4byte	0x56
 	.uleb128 0x4e
 	.8byte	.LVL353
-	.4byte	0x1460f
+	.4byte	0x14635
 	.uleb128 0x4e
 	.8byte	.LVL354
-	.4byte	0x145e9
+	.4byte	0x1460f
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3062
+	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x7c4
+	.2byte	0x7da
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x103d8
+	.4byte	0x103e4
 	.uleb128 0x65
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0x7c4
+	.2byte	0x7da
 	.4byte	0x1c7f
 	.uleb128 0x65
 	.4byte	.LASF1273
 	.byte	0x1
-	.2byte	0x7c4
+	.2byte	0x7da
 	.4byte	0x555c
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3063
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x7b4
+	.2byte	0x7ca
 	.4byte	0xc6
 	.8byte	.LFB2834
 	.8byte	.LFE2834-.LFB2834
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10440
+	.4byte	0x1044c
 	.uleb128 0x58
 	.4byte	.LASF1273
 	.byte	0x1
-	.2byte	0x7b4
+	.2byte	0x7ca
 	.4byte	0x555c
 	.4byte	.LLST16
 	.uleb128 0x51
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x7b4
+	.2byte	0x7ca
 	.4byte	0x3cb5
 	.4byte	.LLST17
 	.uleb128 0x46
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x7b6
-	.4byte	0xe7a7
+	.2byte	0x7cc
+	.4byte	0xe7b3
 	.uleb128 0x46
 	.4byte	.LASF884
 	.byte	0x1
-	.2byte	0x7b7
+	.2byte	0x7cd
 	.4byte	0x29
 	.uleb128 0x4e
 	.8byte	.LVL82
-	.4byte	0x1461b
+	.4byte	0x14641
 	.byte	0
 	.uleb128 0x6a
-	.4byte	.LASF3065
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x79d
+	.2byte	0x7b3
 	.4byte	0xc6
-	.4byte	0x10469
+	.4byte	0x10475
 	.uleb128 0x65
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0x79d
+	.2byte	0x7b3
 	.4byte	0x1c7f
 	.uleb128 0x65
 	.4byte	.LASF1273
 	.byte	0x1
-	.2byte	0x79d
+	.2byte	0x7b3
 	.4byte	0x555c
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3066
+	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x78e
+	.2byte	0x7a4
 	.4byte	0xc6
 	.8byte	.LFB2832
 	.8byte	.LFE2832-.LFB2832
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x104d2
+	.4byte	0x104de
 	.uleb128 0x58
 	.4byte	.LASF1273
 	.byte	0x1
-	.2byte	0x78e
+	.2byte	0x7a4
 	.4byte	0x555c
 	.4byte	.LLST14
 	.uleb128 0x51
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x78e
+	.2byte	0x7a4
 	.4byte	0x3cb5
 	.4byte	.LLST15
 	.uleb128 0x46
 	.4byte	.LASF884
 	.byte	0x1
-	.2byte	0x790
+	.2byte	0x7a6
 	.4byte	0x29
 	.uleb128 0x4e
 	.8byte	.LVL76
-	.4byte	0x14628
+	.4byte	0x1464e
 	.uleb128 0x4e
 	.8byte	.LVL77
-	.4byte	0x1461b
+	.4byte	0x14641
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3067
+	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0x6c5
+	.2byte	0x6db
 	.4byte	0x199
 	.8byte	.LFB2831
 	.8byte	.LFE2831-.LFB2831
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1177a
+	.4byte	0x11786
 	.uleb128 0x58
 	.4byte	.LASF1273
 	.byte	0x1
-	.2byte	0x6c5
+	.2byte	0x6db
 	.4byte	0x555c
 	.4byte	.LLST18
 	.uleb128 0x51
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0x6c5
+	.2byte	0x6db
 	.4byte	0x6d
 	.4byte	.LLST19
 	.uleb128 0x51
 	.string	"arg"
 	.byte	0x1
-	.2byte	0x6c5
+	.2byte	0x6db
 	.4byte	0x29
 	.4byte	.LLST20
 	.uleb128 0x46
-	.4byte	.LASF3068
+	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0x6c7
+	.2byte	0x6dd
 	.4byte	0x458
 	.uleb128 0x46
-	.4byte	.LASF3002
+	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x6c8
-	.4byte	0xe160
+	.2byte	0x6de
+	.4byte	0xe16c
 	.uleb128 0x46
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x6c9
-	.4byte	0xe7a7
+	.2byte	0x6df
+	.4byte	0xe7b3
 	.uleb128 0x4c
-	.4byte	.LASF3069
+	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0x6ca
-	.4byte	0xda06
+	.2byte	0x6e0
+	.4byte	0xda12
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 -56
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6cb
-	.4byte	0xe451
+	.2byte	0x6e1
+	.4byte	0xe45d
 	.uleb128 0x46
-	.4byte	.LASF3070
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x6cc
+	.2byte	0x6e2
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3071
+	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0x6cd
+	.2byte	0x6e3
 	.4byte	0x29
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x6ce
+	.2byte	0x6e4
 	.4byte	0xc6
 	.uleb128 0x55
-	.4byte	.LASF3030
-	.4byte	0x1178a
+	.4byte	.LASF3032
+	.4byte	0x11796
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34978
+	.8byte	__func__.34990
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x1a0
-	.4byte	0x1063c
+	.4byte	0x10648
 	.uleb128 0x46
-	.4byte	.LASF3072
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x718
+	.2byte	0x72e
 	.4byte	0xc6
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x1a0
 	.uleb128 0x6b
-	.4byte	.LASF3084
+	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0x718
+	.2byte	0x72e
 	.8byte	.L216
 	.uleb128 0x4c
-	.4byte	.LASF3073
+	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x718
+	.2byte	0x72e
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -96
 	.uleb128 0x46
-	.4byte	.LASF3072
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x718
+	.2byte	0x72e
 	.4byte	0x199
 	.uleb128 0x6c
 	.8byte	.LBB1010
 	.8byte	.LBE1010-.LBB1010
-	.4byte	0x10620
+	.4byte	0x1062c
 	.uleb128 0x59
-	.4byte	.LASF3074
+	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0x718
+	.2byte	0x72e
 	.4byte	0x199
 	.4byte	.LLST35
 	.uleb128 0x4e
 	.8byte	.LVL127
-	.4byte	0x14634
+	.4byte	0x1465a
 	.uleb128 0x4e
 	.8byte	.LVL128
-	.4byte	0x14640
+	.4byte	0x14666
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL125
-	.4byte	0x1464d
+	.4byte	0x14673
 	.uleb128 0x4e
 	.8byte	.LVL129
-	.4byte	0x14659
+	.4byte	0x1467f
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x1343e
+	.4byte	0x13464
 	.8byte	.LBB946
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x780
-	.4byte	0x1085c
+	.2byte	0x796
+	.4byte	0x10868
 	.uleb128 0x54
-	.4byte	0x13463
+	.4byte	0x13489
 	.uleb128 0x54
-	.4byte	0x13458
+	.4byte	0x1347e
 	.uleb128 0x54
-	.4byte	0x1344e
+	.4byte	0x13474
 	.uleb128 0x6d
-	.4byte	0x1349c
+	.4byte	0x134c2
 	.8byte	.LBB947
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x134c1
+	.4byte	0x134e7
 	.uleb128 0x54
-	.4byte	0x134b6
+	.4byte	0x134dc
 	.uleb128 0x54
-	.4byte	0x134ac
+	.4byte	0x134d2
 	.uleb128 0x6e
-	.4byte	0x13539
+	.4byte	0x1355f
 	.8byte	.LBB949
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10792
+	.4byte	0x1079e
 	.uleb128 0x54
-	.4byte	0x13554
+	.4byte	0x1357a
 	.uleb128 0x6f
-	.4byte	0x13549
+	.4byte	0x1356f
 	.4byte	.LLST21
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x80
 	.uleb128 0x60
-	.4byte	0x1355f
+	.4byte	0x13585
 	.4byte	.LLST22
 	.uleb128 0x60
-	.4byte	0x1356a
+	.4byte	0x13590
 	.4byte	.LLST23
 	.uleb128 0x70
-	.4byte	0x13992
+	.4byte	0x139b8
 	.8byte	.LBB951
 	.8byte	.LBE951-.LBB951
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x106f8
+	.4byte	0x10704
 	.uleb128 0x56
 	.8byte	.LBB952
 	.8byte	.LBE952-.LBB952
 	.uleb128 0x60
-	.4byte	0x139a2
+	.4byte	0x139c8
 	.4byte	.LLST24
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13966
+	.4byte	0x1398c
 	.8byte	.LBB953
 	.8byte	.LBE953-.LBB953
 	.byte	0x6
 	.byte	0x55
-	.4byte	0x10740
+	.4byte	0x1074c
 	.uleb128 0x54
-	.4byte	0x13980
+	.4byte	0x139a6
 	.uleb128 0x54
-	.4byte	0x13976
+	.4byte	0x1399c
 	.uleb128 0x5c
-	.4byte	0x13a9f
+	.4byte	0x13ac5
 	.8byte	.LBB954
 	.8byte	.LBE954-.LBB954
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x13ab9
+	.4byte	0x13adf
 	.uleb128 0x54
-	.4byte	0x13aaf
+	.4byte	0x13ad5
 	.byte	0
 	.byte	0
 	.uleb128 0x56
 	.8byte	.LBB956
 	.8byte	.LBE956-.LBB956
 	.uleb128 0x57
-	.4byte	0x13576
+	.4byte	0x1359c
 	.uleb128 0x5c
-	.4byte	0x13a17
+	.4byte	0x13a3d
 	.8byte	.LBB957
 	.8byte	.LBE957-.LBB957
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13a32
+	.4byte	0x13a58
 	.uleb128 0x54
-	.4byte	0x13a27
+	.4byte	0x13a4d
 	.uleb128 0x56
 	.8byte	.LBB958
 	.8byte	.LBE958-.LBB958
 	.uleb128 0x57
-	.4byte	0x13a3d
+	.4byte	0x13a63
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13505
+	.4byte	0x1352b
 	.8byte	.LBB963
 	.8byte	.LBE963-.LBB963
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x1084d
+	.4byte	0x10859
 	.uleb128 0x54
-	.4byte	0x13515
+	.4byte	0x1353b
 	.uleb128 0x56
 	.8byte	.LBB964
 	.8byte	.LBE964-.LBB964
 	.uleb128 0x60
-	.4byte	0x13520
+	.4byte	0x13546
 	.4byte	.LLST25
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0xc0
-	.4byte	0x10818
+	.4byte	0x10824
 	.uleb128 0x60
-	.4byte	0x1352c
+	.4byte	0x13552
 	.4byte	.LLST26
 	.uleb128 0x5c
-	.4byte	0x13a17
+	.4byte	0x13a3d
 	.8byte	.LBB966
 	.8byte	.LBE966-.LBB966
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13a32
+	.4byte	0x13a58
 	.uleb128 0x54
-	.4byte	0x13a27
+	.4byte	0x13a4d
 	.uleb128 0x56
 	.8byte	.LBB967
 	.8byte	.LBE967-.LBB967
 	.uleb128 0x57
-	.4byte	0x13a3d
+	.4byte	0x13a63
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13992
+	.4byte	0x139b8
 	.8byte	.LBB968
 	.8byte	.LBE968-.LBB968
 	.byte	0x6
@@ -41168,7 +41207,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB969
 	.8byte	.LBE969-.LBB969
 	.uleb128 0x60
-	.4byte	0x139a2
+	.4byte	0x139c8
 	.4byte	.LLST27
 	.byte	0
 	.byte	0
@@ -41176,162 +41215,162 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL155
-	.4byte	0x14666
+	.4byte	0x1468c
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x1346d
+	.4byte	0x13493
 	.8byte	.LBB979
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
-	.2byte	0x703
-	.4byte	0x10a87
+	.2byte	0x719
+	.4byte	0x10a93
 	.uleb128 0x54
-	.4byte	0x13492
+	.4byte	0x134b8
 	.uleb128 0x54
-	.4byte	0x13487
+	.4byte	0x134ad
 	.uleb128 0x54
-	.4byte	0x1347d
+	.4byte	0x134a3
 	.uleb128 0x6d
-	.4byte	0x134cb
+	.4byte	0x134f1
 	.8byte	.LBB980
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x134f0
+	.4byte	0x13516
 	.uleb128 0x54
-	.4byte	0x134e5
+	.4byte	0x1350b
 	.uleb128 0x54
-	.4byte	0x134db
+	.4byte	0x13501
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x57
-	.4byte	0x134f9
+	.4byte	0x1351f
 	.uleb128 0x6e
-	.4byte	0x13539
+	.4byte	0x1355f
 	.8byte	.LBB982
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x109bc
+	.4byte	0x109c8
 	.uleb128 0x54
-	.4byte	0x13554
+	.4byte	0x1357a
 	.uleb128 0x6f
-	.4byte	0x13549
+	.4byte	0x1356f
 	.4byte	.LLST28
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x130
 	.uleb128 0x60
-	.4byte	0x1355f
+	.4byte	0x13585
 	.4byte	.LLST29
 	.uleb128 0x60
-	.4byte	0x1356a
+	.4byte	0x13590
 	.4byte	.LLST30
 	.uleb128 0x70
-	.4byte	0x13992
+	.4byte	0x139b8
 	.8byte	.LBB984
 	.8byte	.LBE984-.LBB984
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10922
+	.4byte	0x1092e
 	.uleb128 0x56
 	.8byte	.LBB985
 	.8byte	.LBE985-.LBB985
 	.uleb128 0x60
-	.4byte	0x139a2
+	.4byte	0x139c8
 	.4byte	.LLST31
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB986
 	.8byte	.LBE986-.LBB986
-	.4byte	0x10976
+	.4byte	0x10982
 	.uleb128 0x57
-	.4byte	0x13576
+	.4byte	0x1359c
 	.uleb128 0x5c
-	.4byte	0x13a17
+	.4byte	0x13a3d
 	.8byte	.LBB987
 	.8byte	.LBE987-.LBB987
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13a32
+	.4byte	0x13a58
 	.uleb128 0x54
-	.4byte	0x13a27
+	.4byte	0x13a4d
 	.uleb128 0x56
 	.8byte	.LBB988
 	.8byte	.LBE988-.LBB988
 	.uleb128 0x57
-	.4byte	0x13a3d
+	.4byte	0x13a63
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13966
+	.4byte	0x1398c
 	.8byte	.LBB989
 	.8byte	.LBE989-.LBB989
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13980
+	.4byte	0x139a6
 	.uleb128 0x54
-	.4byte	0x13976
+	.4byte	0x1399c
 	.uleb128 0x5c
-	.4byte	0x13a9f
+	.4byte	0x13ac5
 	.8byte	.LBB990
 	.8byte	.LBE990-.LBB990
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x13ab9
+	.4byte	0x13adf
 	.uleb128 0x54
-	.4byte	0x13aaf
+	.4byte	0x13ad5
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13505
+	.4byte	0x1352b
 	.8byte	.LBB994
 	.8byte	.LBE994-.LBB994
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10a77
+	.4byte	0x10a83
 	.uleb128 0x54
-	.4byte	0x13515
+	.4byte	0x1353b
 	.uleb128 0x56
 	.8byte	.LBB995
 	.8byte	.LBE995-.LBB995
 	.uleb128 0x60
-	.4byte	0x13520
+	.4byte	0x13546
 	.4byte	.LLST32
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x170
-	.4byte	0x10a42
+	.4byte	0x10a4e
 	.uleb128 0x60
-	.4byte	0x1352c
+	.4byte	0x13552
 	.4byte	.LLST33
 	.uleb128 0x5c
-	.4byte	0x13a17
+	.4byte	0x13a3d
 	.8byte	.LBB997
 	.8byte	.LBE997-.LBB997
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13a32
+	.4byte	0x13a58
 	.uleb128 0x54
-	.4byte	0x13a27
+	.4byte	0x13a4d
 	.uleb128 0x56
 	.8byte	.LBB998
 	.8byte	.LBE998-.LBB998
 	.uleb128 0x57
-	.4byte	0x13a3d
+	.4byte	0x13a63
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13992
+	.4byte	0x139b8
 	.8byte	.LBB999
 	.8byte	.LBE999-.LBB999
 	.byte	0x6
@@ -41340,7 +41379,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1000
 	.8byte	.LBE1000-.LBB1000
 	.uleb128 0x60
-	.4byte	0x139a2
+	.4byte	0x139c8
 	.4byte	.LLST34
 	.byte	0
 	.byte	0
@@ -41348,163 +41387,163 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL120
-	.4byte	0x14673
+	.4byte	0x14699
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x1346d
+	.4byte	0x13493
 	.8byte	.LBB1014
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
-	.2byte	0x71f
-	.4byte	0x10cb2
+	.2byte	0x735
+	.4byte	0x10cbe
 	.uleb128 0x54
-	.4byte	0x13492
+	.4byte	0x134b8
 	.uleb128 0x54
-	.4byte	0x13487
+	.4byte	0x134ad
 	.uleb128 0x54
-	.4byte	0x1347d
+	.4byte	0x134a3
 	.uleb128 0x6d
-	.4byte	0x134cb
+	.4byte	0x134f1
 	.8byte	.LBB1015
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x134f0
+	.4byte	0x13516
 	.uleb128 0x54
-	.4byte	0x134e5
+	.4byte	0x1350b
 	.uleb128 0x54
-	.4byte	0x134db
+	.4byte	0x13501
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x1f0
 	.uleb128 0x57
-	.4byte	0x134f9
+	.4byte	0x1351f
 	.uleb128 0x6e
-	.4byte	0x13539
+	.4byte	0x1355f
 	.8byte	.LBB1017
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x10be7
+	.4byte	0x10bf3
 	.uleb128 0x54
-	.4byte	0x13554
+	.4byte	0x1357a
 	.uleb128 0x6f
-	.4byte	0x13549
+	.4byte	0x1356f
 	.4byte	.LLST36
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x230
 	.uleb128 0x60
-	.4byte	0x1355f
+	.4byte	0x13585
 	.4byte	.LLST37
 	.uleb128 0x60
-	.4byte	0x1356a
+	.4byte	0x13590
 	.4byte	.LLST38
 	.uleb128 0x70
-	.4byte	0x13992
+	.4byte	0x139b8
 	.8byte	.LBB1019
 	.8byte	.LBE1019-.LBB1019
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10b4d
+	.4byte	0x10b59
 	.uleb128 0x56
 	.8byte	.LBB1020
 	.8byte	.LBE1020-.LBB1020
 	.uleb128 0x60
-	.4byte	0x139a2
+	.4byte	0x139c8
 	.4byte	.LLST39
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1021
 	.8byte	.LBE1021-.LBB1021
-	.4byte	0x10ba1
+	.4byte	0x10bad
 	.uleb128 0x57
-	.4byte	0x13576
+	.4byte	0x1359c
 	.uleb128 0x5c
-	.4byte	0x13a17
+	.4byte	0x13a3d
 	.8byte	.LBB1022
 	.8byte	.LBE1022-.LBB1022
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13a32
+	.4byte	0x13a58
 	.uleb128 0x54
-	.4byte	0x13a27
+	.4byte	0x13a4d
 	.uleb128 0x56
 	.8byte	.LBB1023
 	.8byte	.LBE1023-.LBB1023
 	.uleb128 0x57
-	.4byte	0x13a3d
+	.4byte	0x13a63
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13966
+	.4byte	0x1398c
 	.8byte	.LBB1024
 	.8byte	.LBE1024-.LBB1024
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13980
+	.4byte	0x139a6
 	.uleb128 0x54
-	.4byte	0x13976
+	.4byte	0x1399c
 	.uleb128 0x5c
-	.4byte	0x13a9f
+	.4byte	0x13ac5
 	.8byte	.LBB1025
 	.8byte	.LBE1025-.LBB1025
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x13ab9
+	.4byte	0x13adf
 	.uleb128 0x54
-	.4byte	0x13aaf
+	.4byte	0x13ad5
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13505
+	.4byte	0x1352b
 	.8byte	.LBB1029
 	.8byte	.LBE1029-.LBB1029
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10ca2
+	.4byte	0x10cae
 	.uleb128 0x54
-	.4byte	0x13515
+	.4byte	0x1353b
 	.uleb128 0x56
 	.8byte	.LBB1030
 	.8byte	.LBE1030-.LBB1030
 	.uleb128 0x60
-	.4byte	0x13520
+	.4byte	0x13546
 	.4byte	.LLST40
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x270
-	.4byte	0x10c6d
+	.4byte	0x10c79
 	.uleb128 0x60
-	.4byte	0x1352c
+	.4byte	0x13552
 	.4byte	.LLST41
 	.uleb128 0x5c
-	.4byte	0x13a17
+	.4byte	0x13a3d
 	.8byte	.LBB1032
 	.8byte	.LBE1032-.LBB1032
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13a32
+	.4byte	0x13a58
 	.uleb128 0x54
-	.4byte	0x13a27
+	.4byte	0x13a4d
 	.uleb128 0x56
 	.8byte	.LBB1033
 	.8byte	.LBE1033-.LBB1033
 	.uleb128 0x57
-	.4byte	0x13a3d
+	.4byte	0x13a63
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13992
+	.4byte	0x139b8
 	.8byte	.LBB1034
 	.8byte	.LBE1034-.LBB1034
 	.byte	0x6
@@ -41513,7 +41552,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1035
 	.8byte	.LBE1035-.LBB1035
 	.uleb128 0x60
-	.4byte	0x139a2
+	.4byte	0x139c8
 	.4byte	.LLST42
 	.byte	0
 	.byte	0
@@ -41521,159 +41560,159 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL144
-	.4byte	0x14673
+	.4byte	0x14699
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x1343e
+	.4byte	0x13464
 	.8byte	.LBB1044
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
-	.2byte	0x6ed
-	.4byte	0x10ed2
+	.2byte	0x703
+	.4byte	0x10ede
 	.uleb128 0x54
-	.4byte	0x13463
+	.4byte	0x13489
 	.uleb128 0x54
-	.4byte	0x13458
+	.4byte	0x1347e
 	.uleb128 0x54
-	.4byte	0x1344e
+	.4byte	0x13474
 	.uleb128 0x6d
-	.4byte	0x1349c
+	.4byte	0x134c2
 	.8byte	.LBB1045
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x134c1
+	.4byte	0x134e7
 	.uleb128 0x54
-	.4byte	0x134b6
+	.4byte	0x134dc
 	.uleb128 0x54
-	.4byte	0x134ac
+	.4byte	0x134d2
 	.uleb128 0x6e
-	.4byte	0x13539
+	.4byte	0x1355f
 	.8byte	.LBB1047
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10e08
+	.4byte	0x10e14
 	.uleb128 0x54
-	.4byte	0x13554
+	.4byte	0x1357a
 	.uleb128 0x6f
-	.4byte	0x13549
+	.4byte	0x1356f
 	.4byte	.LLST43
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x2f0
 	.uleb128 0x60
-	.4byte	0x1355f
+	.4byte	0x13585
 	.4byte	.LLST44
 	.uleb128 0x60
-	.4byte	0x1356a
+	.4byte	0x13590
 	.4byte	.LLST45
 	.uleb128 0x70
-	.4byte	0x13992
+	.4byte	0x139b8
 	.8byte	.LBB1049
 	.8byte	.LBE1049-.LBB1049
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10d6e
+	.4byte	0x10d7a
 	.uleb128 0x56
 	.8byte	.LBB1050
 	.8byte	.LBE1050-.LBB1050
 	.uleb128 0x60
-	.4byte	0x139a2
+	.4byte	0x139c8
 	.4byte	.LLST46
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1051
 	.8byte	.LBE1051-.LBB1051
-	.4byte	0x10dc2
+	.4byte	0x10dce
 	.uleb128 0x57
-	.4byte	0x13576
+	.4byte	0x1359c
 	.uleb128 0x5c
-	.4byte	0x13a17
+	.4byte	0x13a3d
 	.8byte	.LBB1052
 	.8byte	.LBE1052-.LBB1052
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13a32
+	.4byte	0x13a58
 	.uleb128 0x54
-	.4byte	0x13a27
+	.4byte	0x13a4d
 	.uleb128 0x56
 	.8byte	.LBB1053
 	.8byte	.LBE1053-.LBB1053
 	.uleb128 0x57
-	.4byte	0x13a3d
+	.4byte	0x13a63
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13966
+	.4byte	0x1398c
 	.8byte	.LBB1054
 	.8byte	.LBE1054-.LBB1054
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13980
+	.4byte	0x139a6
 	.uleb128 0x54
-	.4byte	0x13976
+	.4byte	0x1399c
 	.uleb128 0x5c
-	.4byte	0x13a9f
+	.4byte	0x13ac5
 	.8byte	.LBB1055
 	.8byte	.LBE1055-.LBB1055
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x13ab9
+	.4byte	0x13adf
 	.uleb128 0x54
-	.4byte	0x13aaf
+	.4byte	0x13ad5
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13505
+	.4byte	0x1352b
 	.8byte	.LBB1061
 	.8byte	.LBE1061-.LBB1061
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x10ec3
+	.4byte	0x10ecf
 	.uleb128 0x54
-	.4byte	0x13515
+	.4byte	0x1353b
 	.uleb128 0x56
 	.8byte	.LBB1062
 	.8byte	.LBE1062-.LBB1062
 	.uleb128 0x60
-	.4byte	0x13520
+	.4byte	0x13546
 	.4byte	.LLST47
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x340
-	.4byte	0x10e8e
+	.4byte	0x10e9a
 	.uleb128 0x60
-	.4byte	0x1352c
+	.4byte	0x13552
 	.4byte	.LLST48
 	.uleb128 0x5c
-	.4byte	0x13a17
+	.4byte	0x13a3d
 	.8byte	.LBB1064
 	.8byte	.LBE1064-.LBB1064
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13a32
+	.4byte	0x13a58
 	.uleb128 0x54
-	.4byte	0x13a27
+	.4byte	0x13a4d
 	.uleb128 0x56
 	.8byte	.LBB1065
 	.8byte	.LBE1065-.LBB1065
 	.uleb128 0x57
-	.4byte	0x13a3d
+	.4byte	0x13a63
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13992
+	.4byte	0x139b8
 	.8byte	.LBB1066
 	.8byte	.LBE1066-.LBB1066
 	.byte	0x6
@@ -41682,7 +41721,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1067
 	.8byte	.LBE1067-.LBB1067
 	.uleb128 0x60
-	.4byte	0x139a2
+	.4byte	0x139c8
 	.4byte	.LLST49
 	.byte	0
 	.byte	0
@@ -41690,163 +41729,163 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL171
-	.4byte	0x14666
+	.4byte	0x1468c
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x1346d
+	.4byte	0x13493
 	.8byte	.LBB1078
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
-	.2byte	0x73c
-	.4byte	0x1110e
+	.2byte	0x752
+	.4byte	0x1111a
 	.uleb128 0x54
-	.4byte	0x13492
+	.4byte	0x134b8
 	.uleb128 0x54
-	.4byte	0x13487
+	.4byte	0x134ad
 	.uleb128 0x54
-	.4byte	0x1347d
+	.4byte	0x134a3
 	.uleb128 0x6d
-	.4byte	0x134cb
+	.4byte	0x134f1
 	.8byte	.LBB1079
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x134f0
+	.4byte	0x13516
 	.uleb128 0x54
-	.4byte	0x134e5
+	.4byte	0x1350b
 	.uleb128 0x54
-	.4byte	0x134db
+	.4byte	0x13501
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x370
 	.uleb128 0x60
-	.4byte	0x134f9
+	.4byte	0x1351f
 	.4byte	.LLST50
 	.uleb128 0x6e
-	.4byte	0x13539
+	.4byte	0x1355f
 	.8byte	.LBB1081
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x11036
+	.4byte	0x11042
 	.uleb128 0x54
-	.4byte	0x13554
+	.4byte	0x1357a
 	.uleb128 0x6f
-	.4byte	0x13549
+	.4byte	0x1356f
 	.4byte	.LLST51
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x60
-	.4byte	0x1355f
+	.4byte	0x13585
 	.4byte	.LLST52
 	.uleb128 0x60
-	.4byte	0x1356a
+	.4byte	0x13590
 	.4byte	.LLST53
 	.uleb128 0x70
-	.4byte	0x13992
+	.4byte	0x139b8
 	.8byte	.LBB1083
 	.8byte	.LBE1083-.LBB1083
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10f9c
+	.4byte	0x10fa8
 	.uleb128 0x56
 	.8byte	.LBB1084
 	.8byte	.LBE1084-.LBB1084
 	.uleb128 0x60
-	.4byte	0x139a2
+	.4byte	0x139c8
 	.4byte	.LLST54
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1085
 	.8byte	.LBE1085-.LBB1085
-	.4byte	0x10ff0
+	.4byte	0x10ffc
 	.uleb128 0x57
-	.4byte	0x13576
+	.4byte	0x1359c
 	.uleb128 0x5c
-	.4byte	0x13a17
+	.4byte	0x13a3d
 	.8byte	.LBB1086
 	.8byte	.LBE1086-.LBB1086
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13a32
+	.4byte	0x13a58
 	.uleb128 0x54
-	.4byte	0x13a27
+	.4byte	0x13a4d
 	.uleb128 0x56
 	.8byte	.LBB1087
 	.8byte	.LBE1087-.LBB1087
 	.uleb128 0x57
-	.4byte	0x13a3d
+	.4byte	0x13a63
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13966
+	.4byte	0x1398c
 	.8byte	.LBB1088
 	.8byte	.LBE1088-.LBB1088
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13980
+	.4byte	0x139a6
 	.uleb128 0x54
-	.4byte	0x13976
+	.4byte	0x1399c
 	.uleb128 0x5c
-	.4byte	0x13a9f
+	.4byte	0x13ac5
 	.8byte	.LBB1089
 	.8byte	.LBE1089-.LBB1089
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x13ab9
+	.4byte	0x13adf
 	.uleb128 0x54
-	.4byte	0x13aaf
+	.4byte	0x13ad5
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13505
+	.4byte	0x1352b
 	.8byte	.LBB1095
 	.8byte	.LBE1095-.LBB1095
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x110f1
+	.4byte	0x110fd
 	.uleb128 0x54
-	.4byte	0x13515
+	.4byte	0x1353b
 	.uleb128 0x56
 	.8byte	.LBB1096
 	.8byte	.LBE1096-.LBB1096
 	.uleb128 0x60
-	.4byte	0x13520
+	.4byte	0x13546
 	.4byte	.LLST55
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x420
-	.4byte	0x110bc
+	.4byte	0x110c8
 	.uleb128 0x60
-	.4byte	0x1352c
+	.4byte	0x13552
 	.4byte	.LLST56
 	.uleb128 0x5c
-	.4byte	0x13a17
+	.4byte	0x13a3d
 	.8byte	.LBB1098
 	.8byte	.LBE1098-.LBB1098
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13a32
+	.4byte	0x13a58
 	.uleb128 0x54
-	.4byte	0x13a27
+	.4byte	0x13a4d
 	.uleb128 0x56
 	.8byte	.LBB1099
 	.8byte	.LBE1099-.LBB1099
 	.uleb128 0x57
-	.4byte	0x13a3d
+	.4byte	0x13a63
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13992
+	.4byte	0x139b8
 	.8byte	.LBB1100
 	.8byte	.LBE1100-.LBB1100
 	.byte	0x6
@@ -41855,7 +41894,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1101
 	.8byte	.LBE1101-.LBB1101
 	.uleb128 0x60
-	.4byte	0x139a2
+	.4byte	0x139c8
 	.4byte	.LLST57
 	.byte	0
 	.byte	0
@@ -41863,59 +41902,59 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL183
-	.4byte	0x14673
+	.4byte	0x14699
 	.uleb128 0x4e
 	.8byte	.LVL261
-	.4byte	0x14496
+	.4byte	0x144bc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x1343e
+	.4byte	0x13464
 	.8byte	.LBB1114
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
-	.2byte	0x759
-	.4byte	0x111c0
+	.2byte	0x76f
+	.4byte	0x111cc
 	.uleb128 0x54
-	.4byte	0x13463
+	.4byte	0x13489
 	.uleb128 0x54
-	.4byte	0x13458
+	.4byte	0x1347e
 	.uleb128 0x54
-	.4byte	0x1344e
+	.4byte	0x13474
 	.uleb128 0x6d
-	.4byte	0x1349c
+	.4byte	0x134c2
 	.8byte	.LBB1115
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x134c1
+	.4byte	0x134e7
 	.uleb128 0x54
-	.4byte	0x134b6
+	.4byte	0x134dc
 	.uleb128 0x54
-	.4byte	0x134ac
+	.4byte	0x134d2
 	.uleb128 0x6d
-	.4byte	0x13539
+	.4byte	0x1355f
 	.8byte	.LBB1117
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x54
-	.4byte	0x13554
+	.4byte	0x1357a
 	.uleb128 0x71
-	.4byte	0x13549
+	.4byte	0x1356f
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x4b0
 	.uleb128 0x57
-	.4byte	0x1355f
+	.4byte	0x13585
 	.uleb128 0x60
-	.4byte	0x1356a
+	.4byte	0x13590
 	.4byte	.LLST58
 	.uleb128 0x5c
-	.4byte	0x13992
+	.4byte	0x139b8
 	.8byte	.LBB1119
 	.8byte	.LBE1119-.LBB1119
 	.byte	0x6
@@ -41924,7 +41963,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1120
 	.8byte	.LBE1120-.LBB1120
 	.uleb128 0x60
-	.4byte	0x139a2
+	.4byte	0x139c8
 	.4byte	.LLST59
 	.byte	0
 	.byte	0
@@ -41933,154 +41972,154 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x1343e
+	.4byte	0x13464
 	.8byte	.LBB1126
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
-	.2byte	0x749
-	.4byte	0x113e0
+	.2byte	0x75f
+	.4byte	0x113ec
 	.uleb128 0x54
-	.4byte	0x13463
+	.4byte	0x13489
 	.uleb128 0x54
-	.4byte	0x13458
+	.4byte	0x1347e
 	.uleb128 0x54
-	.4byte	0x1344e
+	.4byte	0x13474
 	.uleb128 0x6d
-	.4byte	0x1349c
+	.4byte	0x134c2
 	.8byte	.LBB1127
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x134c1
+	.4byte	0x134e7
 	.uleb128 0x54
-	.4byte	0x134b6
+	.4byte	0x134dc
 	.uleb128 0x54
-	.4byte	0x134ac
+	.4byte	0x134d2
 	.uleb128 0x6e
-	.4byte	0x13539
+	.4byte	0x1355f
 	.8byte	.LBB1129
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x11316
+	.4byte	0x11322
 	.uleb128 0x54
-	.4byte	0x13554
+	.4byte	0x1357a
 	.uleb128 0x6f
-	.4byte	0x13549
+	.4byte	0x1356f
 	.4byte	.LLST60
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x540
 	.uleb128 0x60
-	.4byte	0x1355f
+	.4byte	0x13585
 	.4byte	.LLST61
 	.uleb128 0x60
-	.4byte	0x1356a
+	.4byte	0x13590
 	.4byte	.LLST62
 	.uleb128 0x70
-	.4byte	0x13992
+	.4byte	0x139b8
 	.8byte	.LBB1131
 	.8byte	.LBE1131-.LBB1131
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x1127c
+	.4byte	0x11288
 	.uleb128 0x56
 	.8byte	.LBB1132
 	.8byte	.LBE1132-.LBB1132
 	.uleb128 0x60
-	.4byte	0x139a2
+	.4byte	0x139c8
 	.4byte	.LLST63
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1133
 	.8byte	.LBE1133-.LBB1133
-	.4byte	0x112d0
+	.4byte	0x112dc
 	.uleb128 0x57
-	.4byte	0x13576
+	.4byte	0x1359c
 	.uleb128 0x5c
-	.4byte	0x13a17
+	.4byte	0x13a3d
 	.8byte	.LBB1134
 	.8byte	.LBE1134-.LBB1134
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13a32
+	.4byte	0x13a58
 	.uleb128 0x54
-	.4byte	0x13a27
+	.4byte	0x13a4d
 	.uleb128 0x56
 	.8byte	.LBB1135
 	.8byte	.LBE1135-.LBB1135
 	.uleb128 0x57
-	.4byte	0x13a3d
+	.4byte	0x13a63
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13966
+	.4byte	0x1398c
 	.8byte	.LBB1136
 	.8byte	.LBE1136-.LBB1136
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13980
+	.4byte	0x139a6
 	.uleb128 0x54
-	.4byte	0x13976
+	.4byte	0x1399c
 	.uleb128 0x5c
-	.4byte	0x13a9f
+	.4byte	0x13ac5
 	.8byte	.LBB1137
 	.8byte	.LBE1137-.LBB1137
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x13ab9
+	.4byte	0x13adf
 	.uleb128 0x54
-	.4byte	0x13aaf
+	.4byte	0x13ad5
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13505
+	.4byte	0x1352b
 	.8byte	.LBB1145
 	.8byte	.LBE1145-.LBB1145
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x113d1
+	.4byte	0x113dd
 	.uleb128 0x54
-	.4byte	0x13515
+	.4byte	0x1353b
 	.uleb128 0x56
 	.8byte	.LBB1146
 	.8byte	.LBE1146-.LBB1146
 	.uleb128 0x60
-	.4byte	0x13520
+	.4byte	0x13546
 	.4byte	.LLST64
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x590
-	.4byte	0x1139c
+	.4byte	0x113a8
 	.uleb128 0x60
-	.4byte	0x1352c
+	.4byte	0x13552
 	.4byte	.LLST65
 	.uleb128 0x5c
-	.4byte	0x13a17
+	.4byte	0x13a3d
 	.8byte	.LBB1148
 	.8byte	.LBE1148-.LBB1148
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13a32
+	.4byte	0x13a58
 	.uleb128 0x54
-	.4byte	0x13a27
+	.4byte	0x13a4d
 	.uleb128 0x56
 	.8byte	.LBB1149
 	.8byte	.LBE1149-.LBB1149
 	.uleb128 0x57
-	.4byte	0x13a3d
+	.4byte	0x13a63
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13992
+	.4byte	0x139b8
 	.8byte	.LBB1150
 	.8byte	.LBE1150-.LBB1150
 	.byte	0x6
@@ -42089,7 +42128,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1151
 	.8byte	.LBE1151-.LBB1151
 	.uleb128 0x60
-	.4byte	0x139a2
+	.4byte	0x139c8
 	.4byte	.LLST66
 	.byte	0
 	.byte	0
@@ -42097,158 +42136,158 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL244
-	.4byte	0x14666
+	.4byte	0x1468c
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x1343e
+	.4byte	0x13464
 	.8byte	.LBB1162
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
-	.2byte	0x6fb
-	.4byte	0x11600
+	.2byte	0x711
+	.4byte	0x1160c
 	.uleb128 0x54
-	.4byte	0x13463
+	.4byte	0x13489
 	.uleb128 0x54
-	.4byte	0x13458
+	.4byte	0x1347e
 	.uleb128 0x54
-	.4byte	0x1344e
+	.4byte	0x13474
 	.uleb128 0x6d
-	.4byte	0x1349c
+	.4byte	0x134c2
 	.8byte	.LBB1163
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x134c1
+	.4byte	0x134e7
 	.uleb128 0x54
-	.4byte	0x134b6
+	.4byte	0x134dc
 	.uleb128 0x54
-	.4byte	0x134ac
+	.4byte	0x134d2
 	.uleb128 0x6e
-	.4byte	0x13539
+	.4byte	0x1355f
 	.8byte	.LBB1165
 	.4byte	.Ldebug_ranges0+0x620
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x11536
+	.4byte	0x11542
 	.uleb128 0x54
-	.4byte	0x13554
+	.4byte	0x1357a
 	.uleb128 0x6f
-	.4byte	0x13549
+	.4byte	0x1356f
 	.4byte	.LLST67
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x620
 	.uleb128 0x60
-	.4byte	0x1355f
+	.4byte	0x13585
 	.4byte	.LLST68
 	.uleb128 0x60
-	.4byte	0x1356a
+	.4byte	0x13590
 	.4byte	.LLST69
 	.uleb128 0x70
-	.4byte	0x13992
+	.4byte	0x139b8
 	.8byte	.LBB1167
 	.8byte	.LBE1167-.LBB1167
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x1149c
+	.4byte	0x114a8
 	.uleb128 0x56
 	.8byte	.LBB1168
 	.8byte	.LBE1168-.LBB1168
 	.uleb128 0x60
-	.4byte	0x139a2
+	.4byte	0x139c8
 	.4byte	.LLST70
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1169
 	.8byte	.LBE1169-.LBB1169
-	.4byte	0x114f0
+	.4byte	0x114fc
 	.uleb128 0x57
-	.4byte	0x13576
+	.4byte	0x1359c
 	.uleb128 0x5c
-	.4byte	0x13a17
+	.4byte	0x13a3d
 	.8byte	.LBB1170
 	.8byte	.LBE1170-.LBB1170
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13a32
+	.4byte	0x13a58
 	.uleb128 0x54
-	.4byte	0x13a27
+	.4byte	0x13a4d
 	.uleb128 0x56
 	.8byte	.LBB1171
 	.8byte	.LBE1171-.LBB1171
 	.uleb128 0x57
-	.4byte	0x13a3d
+	.4byte	0x13a63
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13966
+	.4byte	0x1398c
 	.8byte	.LBB1172
 	.8byte	.LBE1172-.LBB1172
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13980
+	.4byte	0x139a6
 	.uleb128 0x54
-	.4byte	0x13976
+	.4byte	0x1399c
 	.uleb128 0x5c
-	.4byte	0x13a9f
+	.4byte	0x13ac5
 	.8byte	.LBB1173
 	.8byte	.LBE1173-.LBB1173
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x13ab9
+	.4byte	0x13adf
 	.uleb128 0x54
-	.4byte	0x13aaf
+	.4byte	0x13ad5
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13505
+	.4byte	0x1352b
 	.8byte	.LBB1181
 	.8byte	.LBE1181-.LBB1181
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x115f1
+	.4byte	0x115fd
 	.uleb128 0x54
-	.4byte	0x13515
+	.4byte	0x1353b
 	.uleb128 0x56
 	.8byte	.LBB1182
 	.8byte	.LBE1182-.LBB1182
 	.uleb128 0x60
-	.4byte	0x13520
+	.4byte	0x13546
 	.4byte	.LLST71
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x670
-	.4byte	0x115bc
+	.4byte	0x115c8
 	.uleb128 0x60
-	.4byte	0x1352c
+	.4byte	0x13552
 	.4byte	.LLST72
 	.uleb128 0x5c
-	.4byte	0x13a17
+	.4byte	0x13a3d
 	.8byte	.LBB1184
 	.8byte	.LBE1184-.LBB1184
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13a32
+	.4byte	0x13a58
 	.uleb128 0x54
-	.4byte	0x13a27
+	.4byte	0x13a4d
 	.uleb128 0x56
 	.8byte	.LBB1185
 	.8byte	.LBE1185-.LBB1185
 	.uleb128 0x57
-	.4byte	0x13a3d
+	.4byte	0x13a63
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13992
+	.4byte	0x139b8
 	.8byte	.LBB1186
 	.8byte	.LBE1186-.LBB1186
 	.byte	0x6
@@ -42257,7 +42296,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1187
 	.8byte	.LBE1187-.LBB1187
 	.uleb128 0x60
-	.4byte	0x139a2
+	.4byte	0x139c8
 	.4byte	.LLST73
 	.byte	0
 	.byte	0
@@ -42265,2175 +42304,2181 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL252
-	.4byte	0x14666
+	.4byte	0x1468c
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL85
-	.4byte	0x1451b
+	.4byte	0x14541
 	.uleb128 0x4e
 	.8byte	.LVL86
-	.4byte	0x1457d
+	.4byte	0x145a3
 	.uleb128 0x4e
 	.8byte	.LVL87
-	.4byte	0x14628
+	.4byte	0x1464e
 	.uleb128 0x4e
 	.8byte	.LVL98
-	.4byte	0x14680
+	.4byte	0x146a6
 	.uleb128 0x4e
 	.8byte	.LVL101
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL104
-	.4byte	0x14432
+	.4byte	0x14458
 	.uleb128 0x4e
 	.8byte	.LVL121
-	.4byte	0x14628
+	.4byte	0x1464e
 	.uleb128 0x4e
 	.8byte	.LVL122
-	.4byte	0x1468c
+	.4byte	0x146b2
 	.uleb128 0x4e
 	.8byte	.LVL124
-	.4byte	0x14527
+	.4byte	0x1454d
 	.uleb128 0x4e
 	.8byte	.LVL131
-	.4byte	0x1451b
+	.4byte	0x14541
 	.uleb128 0x4e
 	.8byte	.LVL145
-	.4byte	0x14698
+	.4byte	0x146be
 	.uleb128 0x4e
 	.8byte	.LVL146
-	.4byte	0x14527
+	.4byte	0x1454d
 	.uleb128 0x4e
 	.8byte	.LVL147
-	.4byte	0x14571
+	.4byte	0x14597
 	.uleb128 0x4e
 	.8byte	.LVL157
-	.4byte	0x146a4
+	.4byte	0x146ca
 	.uleb128 0x4e
 	.8byte	.LVL158
-	.4byte	0x14628
+	.4byte	0x1464e
 	.uleb128 0x4e
 	.8byte	.LVL185
-	.4byte	0x14432
+	.4byte	0x14458
 	.uleb128 0x4e
 	.8byte	.LVL188
-	.4byte	0x14432
+	.4byte	0x14458
 	.uleb128 0x4e
 	.8byte	.LVL190
-	.4byte	0x1451b
+	.4byte	0x14541
 	.uleb128 0x4e
 	.8byte	.LVL192
-	.4byte	0x1451b
+	.4byte	0x14541
 	.uleb128 0x4e
 	.8byte	.LVL193
-	.4byte	0x1457d
+	.4byte	0x145a3
 	.uleb128 0x4e
 	.8byte	.LVL194
-	.4byte	0x14628
+	.4byte	0x1464e
 	.uleb128 0x4e
 	.8byte	.LVL207
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL210
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL212
-	.4byte	0x1451b
+	.4byte	0x14541
 	.uleb128 0x4e
 	.8byte	.LVL213
-	.4byte	0x14628
+	.4byte	0x1464e
 	.uleb128 0x4e
 	.8byte	.LVL221
-	.4byte	0x14680
+	.4byte	0x146a6
 	.uleb128 0x4e
 	.8byte	.LVL255
-	.4byte	0x14571
+	.4byte	0x14597
 	.uleb128 0x4e
 	.8byte	.LVL262
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL263
-	.4byte	0x145d3
+	.4byte	0x145f9
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0x1178a
+	.4byte	0x11796
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xa
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x1177a
+	.4byte	0x11786
 	.uleb128 0x63
-	.4byte	.LASF3075
+	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x682
+	.2byte	0x698
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x117b9
+	.4byte	0x117c5
 	.uleb128 0x65
-	.4byte	.LASF3002
+	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x682
-	.4byte	0xe160
+	.2byte	0x698
+	.4byte	0xe16c
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x684
+	.2byte	0x69a
 	.4byte	0xa570
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3077
+	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0x67c
+	.2byte	0x692
 	.8byte	.LFB2829
 	.8byte	.LFE2829-.LFB2829
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x117f3
+	.4byte	0x117ff
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x67c
+	.2byte	0x692
 	.4byte	0x31d2
 	.4byte	.LLST74
 	.uleb128 0x4e
 	.8byte	.LVL276
-	.4byte	0x1223c
+	.4byte	0x12262
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3078
+	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0x670
+	.2byte	0x686
 	.8byte	.LFB2828
 	.8byte	.LFE2828-.LFB2828
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11853
+	.4byte	0x1185f
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x670
+	.2byte	0x686
 	.4byte	0x31d2
 	.4byte	.LLST12
 	.uleb128 0x46
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x672
-	.4byte	0xe7a7
+	.2byte	0x688
+	.4byte	0xe7b3
 	.uleb128 0x5f
-	.4byte	0x133cd
+	.4byte	0x133f3
 	.8byte	.LBB942
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.2byte	0x676
+	.2byte	0x68c
 	.uleb128 0x54
-	.4byte	0x133da
+	.4byte	0x13400
 	.uleb128 0x4e
 	.8byte	.LVL71
-	.4byte	0x146b0
+	.4byte	0x146d6
 	.byte	0
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3079
+	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0x660
+	.2byte	0x676
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1187d
+	.4byte	0x11889
 	.uleb128 0x65
-	.4byte	.LASF3002
+	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x660
-	.4byte	0xe160
+	.2byte	0x676
+	.4byte	0xe16c
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x662
-	.4byte	0xe451
+	.2byte	0x678
+	.4byte	0xe45d
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3080
+	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0x52d
+	.2byte	0x539
 	.4byte	0xc6
 	.8byte	.LFB2826
 	.8byte	.LFE2826-.LFB2826
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12064
+	.4byte	0x1208a
 	.uleb128 0x51
 	.string	"ptr"
 	.byte	0x1
-	.2byte	0x52d
+	.2byte	0x539
 	.4byte	0x458
 	.4byte	.LLST188
 	.uleb128 0x5a
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x52f
-	.4byte	0xe4b6
+	.2byte	0x53b
+	.4byte	0xe4c2
 	.4byte	.LLST189
 	.uleb128 0x46
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x530
-	.4byte	0xe7a7
+	.2byte	0x53c
+	.4byte	0xe7b3
 	.uleb128 0x5a
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x531
-	.4byte	0xe451
+	.2byte	0x53d
+	.4byte	0xe45d
 	.4byte	.LLST190
 	.uleb128 0x59
-	.4byte	.LASF3081
+	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0x532
+	.2byte	0x53e
 	.4byte	0xc6
 	.4byte	.LLST191
 	.uleb128 0x59
-	.4byte	.LASF2972
+	.4byte	.LASF2974
 	.byte	0x1
-	.2byte	0x533
+	.2byte	0x53f
 	.4byte	0xc6
 	.4byte	.LLST192
 	.uleb128 0x4c
-	.4byte	.LASF3082
+	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0x534
+	.2byte	0x540
 	.4byte	0xd8ec
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -72
 	.uleb128 0x59
-	.4byte	.LASF3083
+	.4byte	.LASF3085
 	.byte	0x1
-	.2byte	0x535
-	.4byte	0xe451
+	.2byte	0x541
+	.4byte	0xe45d
 	.4byte	.LLST193
 	.uleb128 0x6b
-	.4byte	.LASF3085
+	.4byte	.LASF3087
 	.byte	0x1
-	.2byte	0x630
-	.8byte	.L806
+	.2byte	0x646
+	.8byte	.L805
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x1130
-	.4byte	0x119cd
+	.4byte	0x119d9
 	.uleb128 0x46
-	.4byte	.LASF3072
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x576
+	.2byte	0x582
 	.4byte	0xc6
 	.uleb128 0x56
 	.8byte	.LBB1824
 	.8byte	.LBE1824-.LBB1824
 	.uleb128 0x6b
-	.4byte	.LASF3084
+	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0x576
-	.8byte	.L789
+	.2byte	0x582
+	.8byte	.L788
 	.uleb128 0x4c
-	.4byte	.LASF3073
+	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x576
+	.2byte	0x582
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3072
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x576
+	.2byte	0x582
 	.4byte	0x199
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x1160
-	.4byte	0x119b1
+	.4byte	0x119bd
 	.uleb128 0x59
-	.4byte	.LASF3074
+	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0x576
+	.2byte	0x582
 	.4byte	0x199
 	.4byte	.LLST207
 	.uleb128 0x4e
-	.8byte	.LVL892
-	.4byte	0x14634
+	.8byte	.LVL906
+	.4byte	0x1465a
 	.uleb128 0x4e
-	.8byte	.LVL893
-	.4byte	0x14640
+	.8byte	.LVL907
+	.4byte	0x14666
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL890
-	.4byte	0x1464d
+	.8byte	.LVL904
+	.4byte	0x14673
 	.uleb128 0x4e
-	.8byte	.LVL894
-	.4byte	0x14659
+	.8byte	.LVL908
+	.4byte	0x1467f
 	.byte	0
 	.byte	0
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x10d0
-	.4byte	0x11a6f
+	.4byte	0x11a7b
 	.uleb128 0x46
-	.4byte	.LASF3072
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x61c
+	.2byte	0x632
 	.4byte	0xc6
 	.uleb128 0x56
 	.8byte	.LBB1820
 	.8byte	.LBE1820-.LBB1820
 	.uleb128 0x6b
-	.4byte	.LASF3084
+	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0x61c
-	.8byte	.L843
+	.2byte	0x632
+	.8byte	.L842
 	.uleb128 0x4c
-	.4byte	.LASF3073
+	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x61c
+	.2byte	0x632
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3072
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x61c
+	.2byte	0x632
 	.4byte	0x199
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x1100
-	.4byte	0x11a53
+	.4byte	0x11a5f
 	.uleb128 0x59
-	.4byte	.LASF3074
+	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0x61c
+	.2byte	0x632
 	.4byte	0x199
 	.4byte	.LLST206
 	.uleb128 0x4e
-	.8byte	.LVL885
-	.4byte	0x14634
+	.8byte	.LVL899
+	.4byte	0x1465a
 	.uleb128 0x4e
-	.8byte	.LVL886
-	.4byte	0x14640
+	.8byte	.LVL900
+	.4byte	0x14666
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL883
-	.4byte	0x1464d
+	.8byte	.LVL897
+	.4byte	0x14673
 	.uleb128 0x4e
-	.8byte	.LVL887
-	.4byte	0x14659
+	.8byte	.LVL901
+	.4byte	0x1467f
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1806
-	.8byte	.LBE1806-.LBB1806
-	.4byte	0x11b21
+	.8byte	.LBB1814
+	.8byte	.LBE1814-.LBB1814
+	.4byte	0x11b2d
 	.uleb128 0x46
-	.4byte	.LASF3072
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x64c
+	.2byte	0x662
 	.4byte	0xc6
 	.uleb128 0x56
-	.8byte	.LBB1807
-	.8byte	.LBE1807-.LBB1807
+	.8byte	.LBB1815
+	.8byte	.LBE1815-.LBB1815
 	.uleb128 0x72
-	.4byte	.LASF3084
+	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0x64c
+	.2byte	0x662
 	.uleb128 0x4c
-	.4byte	.LASF3073
+	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x64c
+	.2byte	0x662
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3072
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x64c
+	.2byte	0x662
 	.4byte	0x199
 	.uleb128 0x6c
-	.8byte	.LBB1808
-	.8byte	.LBE1808-.LBB1808
-	.4byte	0x11b05
+	.8byte	.LBB1816
+	.8byte	.LBE1816-.LBB1816
+	.4byte	0x11b11
 	.uleb128 0x59
-	.4byte	.LASF3074
+	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0x64c
+	.2byte	0x662
 	.4byte	0x199
-	.4byte	.LLST195
+	.4byte	.LLST205
 	.uleb128 0x4e
-	.8byte	.LVL816
-	.4byte	0x14634
+	.8byte	.LVL832
+	.4byte	0x1465a
 	.uleb128 0x4e
-	.8byte	.LVL817
-	.4byte	0x14640
+	.8byte	.LVL833
+	.4byte	0x14666
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL814
-	.4byte	0x1464d
+	.8byte	.LVL830
+	.4byte	0x14673
 	.uleb128 0x4e
-	.8byte	.LVL818
-	.4byte	0x14659
+	.8byte	.LVL834
+	.4byte	0x1467f
 	.byte	0
 	.byte	0
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0xfb0
-	.4byte	0x11bb7
+	.4byte	0x11bc3
 	.uleb128 0x46
-	.4byte	.LASF3072
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x658
+	.2byte	0x66e
 	.4byte	0xc6
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xfb0
 	.uleb128 0x6b
-	.4byte	.LASF3084
+	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0x658
-	.8byte	.L859
+	.2byte	0x66e
+	.8byte	.L858
 	.uleb128 0x4c
-	.4byte	.LASF3073
+	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x658
+	.2byte	0x66e
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3072
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x658
+	.2byte	0x66e
 	.4byte	0x199
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0xff0
-	.4byte	0x11b9b
+	.4byte	0x11ba7
 	.uleb128 0x59
-	.4byte	.LASF3074
+	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0x658
+	.2byte	0x66e
 	.4byte	0x199
 	.4byte	.LLST194
 	.uleb128 0x4e
-	.8byte	.LVL788
-	.4byte	0x14634
+	.8byte	.LVL801
+	.4byte	0x1465a
 	.uleb128 0x4e
-	.8byte	.LVL789
-	.4byte	0x14640
+	.8byte	.LVL802
+	.4byte	0x14666
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL786
-	.4byte	0x1464d
+	.8byte	.LVL799
+	.4byte	0x14673
 	.uleb128 0x4e
-	.8byte	.LVL790
-	.4byte	0x14659
+	.8byte	.LVL803
+	.4byte	0x1467f
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x12064
-	.8byte	.LBB1800
+	.4byte	0x12d96
+	.8byte	.LBB1799
 	.4byte	.Ldebug_ranges0+0x1030
 	.byte	0x1
-	.2byte	0x5f1
-	.4byte	0x11c08
+	.2byte	0x5a3
+	.4byte	0x11c89
 	.uleb128 0x54
-	.4byte	0x1208d
+	.4byte	0x12dd3
 	.uleb128 0x54
-	.4byte	0x12081
+	.4byte	0x12dd3
 	.uleb128 0x54
-	.4byte	0x12075
-	.uleb128 0x5e
-	.4byte	.Ldebug_ranges0+0x1030
-	.uleb128 0x57
-	.4byte	0x12099
-	.uleb128 0x57
-	.4byte	0x120a3
-	.uleb128 0x57
-	.4byte	0x120af
-	.uleb128 0x57
-	.4byte	0x120bb
-	.uleb128 0x57
-	.4byte	0x120c7
-	.uleb128 0x57
-	.4byte	0x120d3
-	.uleb128 0x73
-	.4byte	0x120df
-	.byte	0
-	.byte	0
-	.uleb128 0x53
-	.4byte	0x130ca
-	.8byte	.LBB1809
-	.8byte	.LBE1809-.LBB1809
-	.byte	0x1
-	.2byte	0x655
-	.4byte	0x11c53
+	.4byte	0x12dd3
 	.uleb128 0x54
-	.4byte	0x130e5
+	.4byte	0x12ddf
 	.uleb128 0x54
-	.4byte	0x130da
-	.uleb128 0x56
-	.8byte	.LBB1810
-	.8byte	.LBE1810-.LBB1810
-	.uleb128 0x57
-	.4byte	0x130f0
-	.uleb128 0x4e
-	.8byte	.LVL819
-	.4byte	0x142aa
-	.byte	0
-	.byte	0
-	.uleb128 0x5b
-	.4byte	0x12d70
-	.8byte	.LBB1811
-	.4byte	.Ldebug_ranges0+0x1070
-	.byte	0x1
-	.2byte	0x593
-	.4byte	0x11d19
-	.uleb128 0x54
-	.4byte	0x12dad
-	.uleb128 0x54
-	.4byte	0x12dad
-	.uleb128 0x54
-	.4byte	0x12dad
-	.uleb128 0x54
-	.4byte	0x12db9
-	.uleb128 0x54
-	.4byte	0x12da1
+	.4byte	0x12dc7
 	.uleb128 0x54
-	.4byte	0x12d95
+	.4byte	0x12dbb
 	.uleb128 0x54
-	.4byte	0x12d89
+	.4byte	0x12daf
 	.uleb128 0x54
-	.4byte	0x12d7d
+	.4byte	0x12da3
 	.uleb128 0x5e
-	.4byte	.Ldebug_ranges0+0x1070
+	.4byte	.Ldebug_ranges0+0x1030
 	.uleb128 0x57
-	.4byte	0x12dc5
+	.4byte	0x12deb
 	.uleb128 0x60
-	.4byte	0x12dd1
-	.4byte	.LLST196
+	.4byte	0x12df7
+	.4byte	.LLST195
 	.uleb128 0x57
-	.4byte	0x12ddd
+	.4byte	0x12e03
 	.uleb128 0x60
-	.4byte	0x12de9
-	.4byte	.LLST197
+	.4byte	0x12e0f
+	.4byte	.LLST196
 	.uleb128 0x60
-	.4byte	0x12df5
-	.4byte	.LLST198
+	.4byte	0x12e1b
+	.4byte	.LLST197
 	.uleb128 0x57
-	.4byte	0x12e01
+	.4byte	0x12e27
 	.uleb128 0x57
-	.4byte	0x12e0d
+	.4byte	0x12e33
 	.uleb128 0x57
-	.4byte	0x12e19
+	.4byte	0x12e3f
 	.uleb128 0x60
-	.4byte	0x12e25
-	.4byte	.LLST199
+	.4byte	0x12e4b
+	.4byte	.LLST198
 	.uleb128 0x57
-	.4byte	0x12e31
+	.4byte	0x12e57
 	.uleb128 0x60
-	.4byte	0x12e3d
-	.4byte	.LLST200
+	.4byte	0x12e63
+	.4byte	.LLST199
 	.uleb128 0x61
-	.4byte	0x12e49
+	.4byte	0x12e6f
 	.uleb128 0x1
-	.byte	0x5e
+	.byte	0x5f
+	.uleb128 0x60
+	.4byte	0x12e79
+	.4byte	.LLST200
 	.uleb128 0x60
-	.4byte	0x12e53
+	.4byte	0x12e83
 	.4byte	.LLST201
 	.uleb128 0x60
-	.4byte	0x12e5d
+	.4byte	0x12e8f
 	.4byte	.LLST202
 	.uleb128 0x60
-	.4byte	0x12e69
+	.4byte	0x12e9b
 	.4byte	.LLST203
 	.uleb128 0x60
-	.4byte	0x12e75
+	.4byte	0x12ea7
 	.4byte	.LLST204
-	.uleb128 0x60
-	.4byte	0x12e81
-	.4byte	.LLST205
+	.byte	0
+	.byte	0
+	.uleb128 0x5b
+	.4byte	0x1208a
+	.8byte	.LBB1808
+	.4byte	.Ldebug_ranges0+0x1090
+	.byte	0x1
+	.2byte	0x607
+	.4byte	0x11cda
+	.uleb128 0x54
+	.4byte	0x120b3
+	.uleb128 0x54
+	.4byte	0x120a7
+	.uleb128 0x54
+	.4byte	0x1209b
+	.uleb128 0x5e
+	.4byte	.Ldebug_ranges0+0x1090
+	.uleb128 0x57
+	.4byte	0x120bf
+	.uleb128 0x57
+	.4byte	0x120c9
+	.uleb128 0x57
+	.4byte	0x120d5
+	.uleb128 0x57
+	.4byte	0x120e1
+	.uleb128 0x57
+	.4byte	0x120ed
+	.uleb128 0x57
+	.4byte	0x120f9
+	.uleb128 0x73
+	.4byte	0x12105
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x130ca
+	.4byte	0x130f0
+	.8byte	.LBB1817
+	.8byte	.LBE1817-.LBB1817
+	.byte	0x1
+	.2byte	0x66b
+	.4byte	0x11d25
+	.uleb128 0x54
+	.4byte	0x1310b
+	.uleb128 0x54
+	.4byte	0x13100
+	.uleb128 0x56
+	.8byte	.LBB1818
+	.8byte	.LBE1818-.LBB1818
+	.uleb128 0x57
+	.4byte	0x13116
+	.uleb128 0x4e
+	.8byte	.LVL835
+	.4byte	0x142d0
+	.byte	0
+	.byte	0
+	.uleb128 0x53
+	.4byte	0x130f0
 	.8byte	.LBB1831
 	.8byte	.LBE1831-.LBB1831
 	.byte	0x1
-	.2byte	0x53a
-	.4byte	0x11d64
+	.2byte	0x546
+	.4byte	0x11d70
 	.uleb128 0x54
-	.4byte	0x130e5
+	.4byte	0x1310b
 	.uleb128 0x54
-	.4byte	0x130da
+	.4byte	0x13100
 	.uleb128 0x56
 	.8byte	.LBB1832
 	.8byte	.LBE1832-.LBB1832
 	.uleb128 0x57
-	.4byte	0x130f0
+	.4byte	0x13116
 	.uleb128 0x4e
-	.8byte	.LVL907
-	.4byte	0x142aa
+	.8byte	.LVL910
+	.4byte	0x142d0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
+	.8byte	.LVL764
+	.4byte	0x146e2
+	.uleb128 0x4e
 	.8byte	.LVL765
-	.4byte	0x146bc
+	.4byte	0x14458
 	.uleb128 0x4e
-	.8byte	.LVL766
-	.4byte	0x14432
+	.8byte	.LVL767
+	.4byte	0x14535
 	.uleb128 0x4e
 	.8byte	.LVL768
-	.4byte	0x1450f
+	.4byte	0x14458
 	.uleb128 0x4e
 	.8byte	.LVL769
-	.4byte	0x14432
+	.4byte	0x146ee
 	.uleb128 0x4e
 	.8byte	.LVL770
-	.4byte	0x146c8
+	.4byte	0x145a3
 	.uleb128 0x4e
 	.8byte	.LVL771
-	.4byte	0x1457d
+	.4byte	0x145a3
 	.uleb128 0x4e
 	.8byte	.LVL772
-	.4byte	0x1457d
+	.4byte	0x145a3
 	.uleb128 0x4e
-	.8byte	.LVL773
-	.4byte	0x146d4
+	.8byte	.LVL807
+	.4byte	0x144d2
 	.uleb128 0x4e
-	.8byte	.LVL775
-	.4byte	0x146e0
+	.8byte	.LVL809
+	.4byte	0x146fa
 	.uleb128 0x4e
-	.8byte	.LVL794
-	.4byte	0x144ac
+	.8byte	.LVL810
+	.4byte	0x146a6
 	.uleb128 0x4e
-	.8byte	.LVL796
-	.4byte	0x146e0
+	.8byte	.LVL814
+	.4byte	0x14458
 	.uleb128 0x4e
-	.8byte	.LVL797
-	.4byte	0x14680
+	.8byte	.LVL817
+	.4byte	0x14458
 	.uleb128 0x4e
-	.8byte	.LVL801
-	.4byte	0x14432
+	.8byte	.LVL818
+	.4byte	0x14597
 	.uleb128 0x4e
-	.8byte	.LVL804
-	.4byte	0x14432
+	.8byte	.LVL819
+	.4byte	0x146fa
 	.uleb128 0x4e
-	.8byte	.LVL805
-	.4byte	0x14571
+	.8byte	.LVL821
+	.4byte	0x146a6
 	.uleb128 0x4e
-	.8byte	.LVL806
-	.4byte	0x146e0
+	.8byte	.LVL826
+	.4byte	0x1210e
 	.uleb128 0x4e
-	.8byte	.LVL808
-	.4byte	0x14680
+	.8byte	.LVL827
+	.4byte	0x144d2
 	.uleb128 0x4e
-	.8byte	.LVL811
-	.4byte	0x120e8
+	.8byte	.LVL829
+	.4byte	0x146fa
 	.uleb128 0x4e
-	.8byte	.LVL812
-	.4byte	0x144ac
+	.8byte	.LVL839
+	.4byte	0x146ee
 	.uleb128 0x4e
-	.8byte	.LVL823
-	.4byte	0x146c8
+	.8byte	.LVL840
+	.4byte	0x145a3
 	.uleb128 0x4e
-	.8byte	.LVL824
-	.4byte	0x1457d
+	.8byte	.LVL841
+	.4byte	0x146fa
 	.uleb128 0x4e
-	.8byte	.LVL825
-	.4byte	0x146e0
+	.8byte	.LVL842
+	.4byte	0x146a6
 	.uleb128 0x4e
-	.8byte	.LVL826
-	.4byte	0x14680
+	.8byte	.LVL843
+	.4byte	0x1300b
 	.uleb128 0x4e
-	.8byte	.LVL827
-	.4byte	0x12fe5
+	.8byte	.LVL844
+	.4byte	0x14706
 	.uleb128 0x4e
-	.8byte	.LVL828
-	.4byte	0x146d4
+	.8byte	.LVL845
+	.4byte	0x14458
 	.uleb128 0x4e
-	.8byte	.LVL829
-	.4byte	0x14432
+	.8byte	.LVL846
+	.4byte	0x124fc
 	.uleb128 0x4e
-	.8byte	.LVL830
-	.4byte	0x124d6
+	.8byte	.LVL847
+	.4byte	0x146ee
 	.uleb128 0x4e
-	.8byte	.LVL831
-	.4byte	0x146c8
+	.8byte	.LVL848
+	.4byte	0x145a3
 	.uleb128 0x4e
-	.8byte	.LVL832
-	.4byte	0x1457d
+	.8byte	.LVL849
+	.4byte	0x145a3
 	.uleb128 0x4e
-	.8byte	.LVL833
-	.4byte	0x1457d
+	.8byte	.LVL850
+	.4byte	0x14706
 	.uleb128 0x4e
-	.8byte	.LVL834
-	.4byte	0x1457d
+	.8byte	.LVL851
+	.4byte	0x1210e
 	.uleb128 0x4e
 	.8byte	.LVL853
-	.4byte	0x14432
+	.4byte	0x14458
 	.uleb128 0x4e
 	.8byte	.LVL854
-	.4byte	0x124d6
+	.4byte	0x124fc
 	.uleb128 0x4e
-	.8byte	.LVL855
-	.4byte	0x1450f
+	.8byte	.LVL856
+	.4byte	0x12f44
+	.uleb128 0x4e
+	.8byte	.LVL857
+	.4byte	0x14706
 	.uleb128 0x4e
 	.8byte	.LVL858
-	.4byte	0x1450f
+	.4byte	0x1438e
 	.uleb128 0x4e
-	.8byte	.LVL860
-	.4byte	0x14368
+	.8byte	.LVL859
+	.4byte	0x1210e
 	.uleb128 0x4e
-	.8byte	.LVL861
-	.4byte	0x14432
+	.8byte	.LVL860
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL862
-	.4byte	0x146e0
+	.4byte	0x1438e
 	.uleb128 0x4e
 	.8byte	.LVL863
-	.4byte	0x14680
+	.4byte	0x1210e
 	.uleb128 0x4e
 	.8byte	.LVL864
-	.4byte	0x120e8
+	.4byte	0x14458
 	.uleb128 0x4e
-	.8byte	.LVL866
-	.4byte	0x14432
+	.8byte	.LVL865
+	.4byte	0x124fc
 	.uleb128 0x4e
-	.8byte	.LVL867
-	.4byte	0x124d6
+	.8byte	.LVL866
+	.4byte	0x14535
 	.uleb128 0x4e
 	.8byte	.LVL869
-	.4byte	0x14432
+	.4byte	0x14535
+	.uleb128 0x4e
+	.8byte	.LVL871
+	.4byte	0x14458
 	.uleb128 0x4e
 	.8byte	.LVL872
-	.4byte	0x14432
+	.4byte	0x146fa
 	.uleb128 0x4e
-	.8byte	.LVL875
-	.4byte	0x14432
+	.8byte	.LVL873
+	.4byte	0x146a6
 	.uleb128 0x4e
-	.8byte	.LVL876
-	.4byte	0x146ec
+	.8byte	.LVL874
+	.4byte	0x14458
 	.uleb128 0x4e
 	.8byte	.LVL877
-	.4byte	0x14571
+	.4byte	0x14458
 	.uleb128 0x4e
-	.8byte	.LVL880
-	.4byte	0x146ec
+	.8byte	.LVL878
+	.4byte	0x145a3
 	.uleb128 0x4e
-	.8byte	.LVL881
-	.4byte	0x14432
+	.8byte	.LVL884
+	.4byte	0x14706
 	.uleb128 0x4e
-	.8byte	.LVL888
-	.4byte	0x1457d
+	.8byte	.LVL885
+	.4byte	0x1210e
 	.uleb128 0x4e
-	.8byte	.LVL901
-	.4byte	0x146d4
+	.8byte	.LVL889
+	.4byte	0x14458
 	.uleb128 0x4e
-	.8byte	.LVL902
-	.4byte	0x120e8
+	.8byte	.LVL890
+	.4byte	0x14712
 	.uleb128 0x4e
-	.8byte	.LVL905
-	.4byte	0x12f1e
+	.8byte	.LVL891
+	.4byte	0x14597
 	.uleb128 0x4e
-	.8byte	.LVL909
-	.4byte	0x14368
+	.8byte	.LVL894
+	.4byte	0x14712
 	.uleb128 0x4e
-	.8byte	.LVL910
-	.4byte	0x120e8
+	.8byte	.LVL895
+	.4byte	0x14458
 	.uleb128 0x4e
 	.8byte	.LVL911
-	.4byte	0x144ac
+	.4byte	0x1438e
 	.uleb128 0x4e
 	.8byte	.LVL913
-	.4byte	0x14368
+	.4byte	0x1438e
 	.uleb128 0x4e
 	.8byte	.LVL915
-	.4byte	0x14368
-	.uleb128 0x4e
-	.8byte	.LVL917
-	.4byte	0x145d3
+	.4byte	0x145f9
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3086
+	.4byte	.LASF3088
 	.byte	0x1
-	.2byte	0x516
+	.2byte	0x522
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x120e8
+	.4byte	0x1210e
 	.uleb128 0x65
-	.4byte	.LASF3087
+	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x516
+	.2byte	0x522
 	.4byte	0x467e
 	.uleb128 0x65
-	.4byte	.LASF3088
+	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x516
+	.2byte	0x522
 	.4byte	0x467e
 	.uleb128 0x65
-	.4byte	.LASF3089
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x516
+	.2byte	0x522
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x518
+	.2byte	0x524
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3090
+	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x519
+	.2byte	0x525
 	.4byte	0x15a
 	.uleb128 0x46
-	.4byte	.LASF3091
+	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x519
+	.2byte	0x525
 	.4byte	0x15a
 	.uleb128 0x46
-	.4byte	.LASF3092
+	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x51a
+	.2byte	0x526
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3093
+	.4byte	.LASF3095
 	.byte	0x1
-	.2byte	0x51b
+	.2byte	0x527
 	.4byte	0x4684
 	.uleb128 0x46
-	.4byte	.LASF3094
+	.4byte	.LASF3096
 	.byte	0x1
-	.2byte	0x51c
+	.2byte	0x528
 	.4byte	0x4684
 	.uleb128 0x72
-	.4byte	.LASF3095
+	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x529
+	.2byte	0x535
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3096
+	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x4bb
+	.2byte	0x4c5
 	.4byte	0xc6
 	.8byte	.LFB2824
 	.8byte	.LFE2824-.LFB2824
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1223c
+	.4byte	0x12262
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x4bb
-	.4byte	0xe4b6
+	.2byte	0x4c5
+	.4byte	0xe4c2
 	.4byte	.LLST75
 	.uleb128 0x46
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x4bd
-	.4byte	0xe7a7
+	.2byte	0x4c7
+	.4byte	0xe7b3
 	.uleb128 0x59
-	.4byte	.LASF3097
+	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x4be
+	.2byte	0x4c8
 	.4byte	0xc6
 	.4byte	.LLST76
 	.uleb128 0x69
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x4bf
+	.2byte	0x4c9
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x64
 	.uleb128 0x53
-	.4byte	0x13344
+	.4byte	0x1336a
 	.8byte	.LBB1216
 	.8byte	.LBE1216-.LBB1216
 	.byte	0x1
-	.2byte	0x4c2
-	.4byte	0x1216b
+	.2byte	0x4cc
+	.4byte	0x12191
 	.uleb128 0x54
-	.4byte	0x1335f
+	.4byte	0x13385
 	.uleb128 0x54
-	.4byte	0x13354
+	.4byte	0x1337a
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL282
-	.4byte	0x14432
+	.4byte	0x14458
 	.uleb128 0x4e
 	.8byte	.LVL283
-	.4byte	0x146f8
+	.4byte	0x1471e
 	.uleb128 0x4e
 	.8byte	.LVL287
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL288
-	.4byte	0x14432
+	.4byte	0x14458
 	.uleb128 0x4e
 	.8byte	.LVL290
-	.4byte	0x146f8
+	.4byte	0x1471e
 	.uleb128 0x4e
 	.8byte	.LVL291
-	.4byte	0x144ac
+	.4byte	0x144d2
 	.uleb128 0x4e
 	.8byte	.LVL292
-	.4byte	0x146f8
+	.4byte	0x1471e
 	.uleb128 0x4e
 	.8byte	.LVL293
-	.4byte	0x146f8
+	.4byte	0x1471e
 	.uleb128 0x4e
 	.8byte	.LVL294
-	.4byte	0x146f8
+	.4byte	0x1471e
 	.uleb128 0x4e
 	.8byte	.LVL295
-	.4byte	0x146f8
+	.4byte	0x1471e
 	.uleb128 0x4e
 	.8byte	.LVL296
-	.4byte	0x146f8
+	.4byte	0x1471e
 	.uleb128 0x4e
 	.8byte	.LVL297
-	.4byte	0x146f8
+	.4byte	0x1471e
 	.uleb128 0x4e
 	.8byte	.LVL298
-	.4byte	0x146f8
+	.4byte	0x1471e
 	.uleb128 0x4e
 	.8byte	.LVL299
-	.4byte	0x146f8
+	.4byte	0x1471e
 	.uleb128 0x4e
 	.8byte	.LVL300
-	.4byte	0x14432
+	.4byte	0x14458
 	.uleb128 0x4e
 	.8byte	.LVL301
-	.4byte	0x145d3
+	.4byte	0x145f9
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3098
+	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x496
+	.2byte	0x49e
 	.8byte	.LFB2823
 	.8byte	.LFE2823-.LFB2823
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x122f5
+	.4byte	0x1231b
 	.uleb128 0x46
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x498
-	.4byte	0xe7a7
+	.2byte	0x4a0
+	.4byte	0xe7b3
 	.uleb128 0x46
-	.4byte	.LASF3002
+	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x499
-	.4byte	0xe160
+	.2byte	0x4a1
+	.4byte	0xe16c
 	.uleb128 0x4e
 	.8byte	.LVL265
-	.4byte	0x144dd
+	.4byte	0x14458
 	.uleb128 0x4e
 	.8byte	.LVL266
-	.4byte	0x14432
+	.4byte	0x14597
 	.uleb128 0x4e
 	.8byte	.LVL267
-	.4byte	0x14571
+	.4byte	0x14597
 	.uleb128 0x4e
 	.8byte	.LVL268
-	.4byte	0x14571
+	.4byte	0x14503
 	.uleb128 0x4e
 	.8byte	.LVL269
-	.4byte	0x14432
+	.4byte	0x14458
 	.uleb128 0x4e
 	.8byte	.LVL270
-	.4byte	0x14496
+	.4byte	0x144bc
 	.uleb128 0x4e
 	.8byte	.LVL271
-	.4byte	0x1450f
+	.4byte	0x14535
 	.uleb128 0x4e
 	.8byte	.LVL272
-	.4byte	0x14571
+	.4byte	0x14597
 	.uleb128 0x4e
 	.8byte	.LVL273
-	.4byte	0x14571
+	.4byte	0x14597
 	.uleb128 0x4e
 	.8byte	.LVL274
-	.4byte	0x144dd
+	.4byte	0x14503
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3099
+	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x44e
+	.2byte	0x452
 	.4byte	0xc6
 	.8byte	.LFB2822
 	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x124c6
+	.4byte	0x124ec
 	.uleb128 0x58
 	.4byte	.LASF794
 	.byte	0x1
-	.2byte	0x44e
+	.2byte	0x452
 	.4byte	0x458
 	.4byte	.LLST145
 	.uleb128 0x69
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x450
-	.4byte	0xe4b6
+	.2byte	0x454
+	.4byte	0xe4c2
 	.uleb128 0x1
 	.byte	0x66
 	.uleb128 0x46
-	.4byte	.LASF3002
+	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x451
-	.4byte	0xe160
+	.2byte	0x455
+	.4byte	0xe16c
 	.uleb128 0x46
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x452
-	.4byte	0xe7a7
+	.2byte	0x456
+	.4byte	0xe7b3
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0xb30
-	.4byte	0x123df
+	.4byte	0x12405
 	.uleb128 0x3f
 	.byte	0x8
 	.byte	0x1
-	.2byte	0x459
-	.4byte	0x12378
+	.2byte	0x45d
+	.4byte	0x1239e
 	.uleb128 0x41
-	.4byte	.LASF3100
+	.4byte	.LASF3102
 	.byte	0x1
-	.2byte	0x459
+	.2byte	0x45d
 	.4byte	0x1a0
 	.uleb128 0x3d
 	.string	"__c"
 	.byte	0x1
-	.2byte	0x459
-	.4byte	0x124c6
+	.2byte	0x45d
+	.4byte	0x124ec
 	.byte	0
 	.uleb128 0x52
 	.string	"__u"
 	.byte	0x1
-	.2byte	0x459
-	.4byte	0x12356
+	.2byte	0x45d
+	.4byte	0x1237c
 	.uleb128 0x5b
-	.4byte	0x13b8c
+	.4byte	0x13bb2
 	.8byte	.LBB1400
 	.4byte	.Ldebug_ranges0+0xb70
 	.byte	0x1
-	.2byte	0x459
-	.4byte	0x123ac
+	.2byte	0x45d
+	.4byte	0x123d2
 	.uleb128 0x54
-	.4byte	0x13baf
+	.4byte	0x13bd5
 	.uleb128 0x54
-	.4byte	0x13ba3
+	.4byte	0x13bc9
 	.uleb128 0x54
-	.4byte	0x13b99
+	.4byte	0x13bbf
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13992
+	.4byte	0x139b8
 	.8byte	.LBB1403
 	.8byte	.LBE1403-.LBB1403
 	.byte	0x1
-	.2byte	0x459
+	.2byte	0x45d
 	.uleb128 0x56
 	.8byte	.LBB1404
 	.8byte	.LBE1404-.LBB1404
 	.uleb128 0x61
-	.4byte	0x139a2
+	.4byte	0x139c8
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13829
+	.4byte	0x1384f
 	.8byte	.LBB1408
 	.4byte	.Ldebug_ranges0+0xba0
 	.byte	0x1
-	.2byte	0x48d
-	.4byte	0x12436
+	.2byte	0x495
+	.4byte	0x1245c
 	.uleb128 0x54
-	.4byte	0x1383a
+	.4byte	0x13860
 	.uleb128 0x5f
-	.4byte	0x13847
+	.4byte	0x1386d
 	.8byte	.LBB1410
 	.4byte	.Ldebug_ranges0+0xbd0
 	.byte	0xd
 	.2byte	0x240
 	.uleb128 0x54
-	.4byte	0x13863
+	.4byte	0x13889
 	.uleb128 0x54
-	.4byte	0x13858
+	.4byte	0x1387e
 	.uleb128 0x4e
-	.8byte	.LVL499
-	.4byte	0x14704
+	.8byte	.LVL497
+	.4byte	0x1472a
 	.uleb128 0x4e
 	.8byte	.LVL504
-	.4byte	0x14704
+	.4byte	0x1472a
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL492
-	.4byte	0x141a7
+	.4byte	0x14737
 	.uleb128 0x4e
 	.8byte	.LVL493
-	.4byte	0x12c15
+	.4byte	0x1465a
 	.uleb128 0x4e
 	.8byte	.LVL494
-	.4byte	0x14711
+	.4byte	0x14741
 	.uleb128 0x4e
 	.8byte	.LVL495
-	.4byte	0x14634
+	.4byte	0x141cd
 	.uleb128 0x4e
 	.8byte	.LVL496
-	.4byte	0x1471b
-	.uleb128 0x4e
-	.8byte	.LVL497
-	.4byte	0x141a7
+	.4byte	0x12ada
 	.uleb128 0x4e
 	.8byte	.LVL498
-	.4byte	0x126e0
+	.4byte	0x141cd
+	.uleb128 0x4e
+	.8byte	.LVL499
+	.4byte	0x128f0
 	.uleb128 0x4e
 	.8byte	.LVL500
-	.4byte	0x141a7
+	.4byte	0x141cd
 	.uleb128 0x4e
 	.8byte	.LVL501
-	.4byte	0x128ca
+	.4byte	0x12c3b
 	.uleb128 0x4e
 	.8byte	.LVL502
-	.4byte	0x141a7
+	.4byte	0x141cd
 	.uleb128 0x4e
 	.8byte	.LVL503
-	.4byte	0x12ab4
+	.4byte	0x12706
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x124d6
+	.4byte	0x124fc
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3101
+	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x3fc
+	.2byte	0x3fe
 	.8byte	.LFB2821
 	.8byte	.LFE2821-.LFB2821
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12682
+	.4byte	0x126a8
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x3fc
-	.4byte	0xe4b6
+	.2byte	0x3fe
+	.4byte	0xe4c2
 	.4byte	.LLST144
 	.uleb128 0x46
-	.4byte	.LASF3002
+	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x3fe
-	.4byte	0xe160
+	.2byte	0x400
+	.4byte	0xe16c
 	.uleb128 0x46
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x3ff
-	.4byte	0xe7a7
+	.2byte	0x401
+	.4byte	0xe7b3
 	.uleb128 0x55
-	.4byte	.LASF3030
+	.4byte	.LASF3032
 	.4byte	0xb940
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34776
+	.8byte	__func__.34778
 	.uleb128 0x53
-	.4byte	0x12682
+	.4byte	0x126a8
 	.8byte	.LBB1391
 	.8byte	.LBE1391-.LBB1391
 	.byte	0x1
-	.2byte	0x435
-	.4byte	0x12563
+	.2byte	0x40b
+	.4byte	0x12589
 	.uleb128 0x54
-	.4byte	0x1269b
+	.4byte	0x126c1
 	.uleb128 0x54
-	.4byte	0x1268f
+	.4byte	0x126b5
 	.uleb128 0x4e
 	.8byte	.LVL464
-	.4byte	0x141a7
+	.4byte	0x141cd
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12682
+	.4byte	0x126a8
 	.8byte	.LBB1393
 	.8byte	.LBE1393-.LBB1393
 	.byte	0x1
-	.2byte	0x41b
-	.4byte	0x12597
+	.2byte	0x41f
+	.4byte	0x125bd
 	.uleb128 0x54
-	.4byte	0x1269b
+	.4byte	0x126c1
 	.uleb128 0x54
-	.4byte	0x1268f
+	.4byte	0x126b5
 	.uleb128 0x4e
 	.8byte	.LVL469
-	.4byte	0x141a7
+	.4byte	0x141cd
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12682
+	.4byte	0x126a8
 	.8byte	.LBB1395
 	.8byte	.LBE1395-.LBB1395
 	.byte	0x1
-	.2byte	0x409
-	.4byte	0x125cb
+	.2byte	0x446
+	.4byte	0x125f1
 	.uleb128 0x54
-	.4byte	0x1269b
+	.4byte	0x126c1
 	.uleb128 0x54
-	.4byte	0x1268f
+	.4byte	0x126b5
 	.uleb128 0x4e
 	.8byte	.LVL474
-	.4byte	0x141a7
+	.4byte	0x141cd
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12682
+	.4byte	0x126a8
 	.8byte	.LBB1397
 	.8byte	.LBE1397-.LBB1397
 	.byte	0x1
-	.2byte	0x442
-	.4byte	0x125ff
+	.2byte	0x439
+	.4byte	0x12625
 	.uleb128 0x54
-	.4byte	0x1269b
+	.4byte	0x126c1
 	.uleb128 0x54
-	.4byte	0x1268f
+	.4byte	0x126b5
 	.uleb128 0x4e
 	.8byte	.LVL479
-	.4byte	0x141a7
+	.4byte	0x141cd
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL463
-	.4byte	0x126e0
+	.4byte	0x12ada
 	.uleb128 0x4e
 	.8byte	.LVL465
-	.4byte	0x126e0
+	.4byte	0x12ada
 	.uleb128 0x4e
 	.8byte	.LVL468
-	.4byte	0x12c15
+	.4byte	0x12c3b
 	.uleb128 0x4e
 	.8byte	.LVL470
-	.4byte	0x12c15
+	.4byte	0x12c3b
 	.uleb128 0x4e
 	.8byte	.LVL473
-	.4byte	0x12ab4
+	.4byte	0x128f0
 	.uleb128 0x4e
 	.8byte	.LVL475
-	.4byte	0x12ab4
+	.4byte	0x128f0
 	.uleb128 0x4e
 	.8byte	.LVL478
-	.4byte	0x128ca
+	.4byte	0x12706
 	.uleb128 0x4e
 	.8byte	.LVL480
-	.4byte	0x128ca
+	.4byte	0x12706
 	.uleb128 0x4e
 	.8byte	.LVL483
-	.4byte	0x14432
+	.4byte	0x14458
 	.uleb128 0x4e
 	.8byte	.LVL486
-	.4byte	0x14432
+	.4byte	0x14458
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3102
+	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x3f6
+	.2byte	0x3f8
 	.byte	0x1
-	.4byte	0x126a8
+	.4byte	0x126ce
 	.uleb128 0x65
-	.4byte	.LASF3002
+	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x3f6
-	.4byte	0xe160
+	.2byte	0x3f8
+	.4byte	0xe16c
 	.uleb128 0x65
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x3f6
-	.4byte	0xe7a7
+	.2byte	0x3f8
+	.4byte	0xe7b3
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3103
+	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x3eb
+	.2byte	0x3ed
 	.byte	0x1
-	.4byte	0x126da
+	.4byte	0x12700
 	.uleb128 0x65
-	.4byte	.LASF3002
+	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x3eb
-	.4byte	0xe160
+	.2byte	0x3ed
+	.4byte	0xe16c
 	.uleb128 0x65
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x3eb
-	.4byte	0xe7a7
+	.2byte	0x3ed
+	.4byte	0xe7b3
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x3ed
-	.4byte	0x126da
+	.2byte	0x3ef
+	.4byte	0x12700
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdeea
+	.4byte	0xdef6
 	.uleb128 0x66
-	.4byte	.LASF3104
+	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x3e1
+	.2byte	0x3e3
 	.byte	0x1
-	.4byte	0x1271e
+	.4byte	0x12744
 	.uleb128 0x65
-	.4byte	.LASF3105
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x3e1
+	.2byte	0x3e3
 	.4byte	0xc0c8
 	.uleb128 0x65
-	.4byte	.LASF3106
+	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x3e2
+	.2byte	0x3e4
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF3107
+	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x3e2
+	.2byte	0x3e4
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x3e3
-	.4byte	0xe7a7
+	.2byte	0x3e5
+	.4byte	0xe7b3
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3108
+	.4byte	.LASF3110
 	.byte	0x1
-	.2byte	0x3b7
+	.2byte	0x3b9
 	.byte	0x1
-	.4byte	0x127f4
+	.4byte	0x1281a
 	.uleb128 0x65
-	.4byte	.LASF3105
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x3b7
+	.2byte	0x3b9
 	.4byte	0xc0c8
 	.uleb128 0x65
-	.4byte	.LASF3106
+	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x3b8
+	.2byte	0x3ba
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF3107
+	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x3b8
+	.2byte	0x3ba
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x3b9
-	.4byte	0xe7a7
+	.2byte	0x3bb
+	.4byte	0xe7b3
 	.uleb128 0x46
-	.4byte	.LASF3002
+	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x3bb
-	.4byte	0xe160
+	.2byte	0x3bd
+	.4byte	0xe16c
 	.uleb128 0x46
-	.4byte	.LASF3109
+	.4byte	.LASF3111
 	.byte	0x1
-	.2byte	0x3bc
+	.2byte	0x3be
 	.4byte	0x15a
 	.uleb128 0x46
-	.4byte	.LASF3110
+	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x3bc
+	.2byte	0x3be
 	.4byte	0x15a
 	.uleb128 0x46
-	.4byte	.LASF3111
+	.4byte	.LASF3113
 	.byte	0x1
-	.2byte	0x3bc
+	.2byte	0x3be
 	.4byte	0x4684
 	.uleb128 0x46
-	.4byte	.LASF3112
+	.4byte	.LASF3114
 	.byte	0x1
-	.2byte	0x3bc
+	.2byte	0x3be
 	.4byte	0x4684
 	.uleb128 0x46
-	.4byte	.LASF3113
+	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x3bd
+	.2byte	0x3bf
 	.4byte	0xc0c8
 	.uleb128 0x46
-	.4byte	.LASF2898
+	.4byte	.LASF2900
 	.byte	0x1
-	.2byte	0x3be
+	.2byte	0x3c0
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x3be
+	.2byte	0x3c0
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x3bf
+	.2byte	0x3c1
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x3bf
+	.2byte	0x3c1
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3114
+	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x3c0
+	.2byte	0x3c2
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2857
 	.byte	0x1
-	.2byte	0x3c1
+	.2byte	0x3c3
 	.4byte	0xc0c8
 	.uleb128 0x46
-	.4byte	.LASF2944
+	.4byte	.LASF2946
 	.byte	0x1
-	.2byte	0x3c2
+	.2byte	0x3c4
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3115
+	.4byte	.LASF3117
 	.byte	0x1
-	.2byte	0x38e
+	.2byte	0x390
 	.byte	0x1
-	.4byte	0x128ca
+	.4byte	0x128f0
 	.uleb128 0x65
-	.4byte	.LASF3105
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x38e
+	.2byte	0x390
 	.4byte	0xc0c8
 	.uleb128 0x65
-	.4byte	.LASF3106
+	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x38f
+	.2byte	0x391
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF3107
+	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x38f
+	.2byte	0x391
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x390
-	.4byte	0xe7a7
+	.2byte	0x392
+	.4byte	0xe7b3
 	.uleb128 0x46
-	.4byte	.LASF3002
+	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x392
-	.4byte	0xe160
+	.2byte	0x394
+	.4byte	0xe16c
 	.uleb128 0x46
-	.4byte	.LASF3109
+	.4byte	.LASF3111
 	.byte	0x1
-	.2byte	0x393
+	.2byte	0x395
 	.4byte	0x13f
 	.uleb128 0x46
-	.4byte	.LASF3110
+	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x393
+	.2byte	0x395
 	.4byte	0x13f
 	.uleb128 0x46
-	.4byte	.LASF3111
+	.4byte	.LASF3113
 	.byte	0x1
-	.2byte	0x393
+	.2byte	0x395
 	.4byte	0xac0
 	.uleb128 0x46
-	.4byte	.LASF3112
+	.4byte	.LASF3114
 	.byte	0x1
-	.2byte	0x393
+	.2byte	0x395
 	.4byte	0xac0
 	.uleb128 0x46
-	.4byte	.LASF3113
+	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x394
+	.2byte	0x396
 	.4byte	0xc0c8
 	.uleb128 0x46
-	.4byte	.LASF2898
+	.4byte	.LASF2900
 	.byte	0x1
-	.2byte	0x395
+	.2byte	0x397
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x395
+	.2byte	0x397
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x396
+	.2byte	0x398
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x396
+	.2byte	0x398
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3114
+	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x397
+	.2byte	0x399
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2857
 	.byte	0x1
-	.2byte	0x398
+	.2byte	0x39a
 	.4byte	0xc0c8
 	.uleb128 0x46
-	.4byte	.LASF2944
+	.4byte	.LASF2946
 	.byte	0x1
-	.2byte	0x399
+	.2byte	0x39b
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3116
+	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x383
+	.2byte	0x385
 	.byte	0x1
-	.4byte	0x12908
+	.4byte	0x1292e
 	.uleb128 0x65
-	.4byte	.LASF3105
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x383
+	.2byte	0x385
 	.4byte	0xc0c8
 	.uleb128 0x65
-	.4byte	.LASF3106
+	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x384
+	.2byte	0x386
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF3107
+	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x384
+	.2byte	0x386
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x385
-	.4byte	0xe7a7
+	.2byte	0x387
+	.4byte	0xe7b3
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3117
+	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x35f
+	.2byte	0x361
 	.byte	0x1
-	.4byte	0x129de
+	.4byte	0x12a04
 	.uleb128 0x65
-	.4byte	.LASF3105
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x35f
+	.2byte	0x361
 	.4byte	0xc0c8
 	.uleb128 0x65
-	.4byte	.LASF3106
+	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x360
+	.2byte	0x362
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF3107
+	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x360
+	.2byte	0x362
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x361
-	.4byte	0xe7a7
+	.2byte	0x363
+	.4byte	0xe7b3
 	.uleb128 0x46
-	.4byte	.LASF3002
+	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x363
-	.4byte	0xe160
+	.2byte	0x365
+	.4byte	0xe16c
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x364
+	.2byte	0x366
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x364
+	.2byte	0x366
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2898
+	.4byte	.LASF2900
 	.byte	0x1
-	.2byte	0x365
+	.2byte	0x367
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x366
+	.2byte	0x368
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3109
+	.4byte	.LASF3111
 	.byte	0x1
-	.2byte	0x367
+	.2byte	0x369
 	.4byte	0x13f
 	.uleb128 0x46
-	.4byte	.LASF3110
+	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x367
+	.2byte	0x369
 	.4byte	0x13f
 	.uleb128 0x46
-	.4byte	.LASF3111
+	.4byte	.LASF3113
 	.byte	0x1
-	.2byte	0x367
+	.2byte	0x369
 	.4byte	0xac0
 	.uleb128 0x46
-	.4byte	.LASF3112
+	.4byte	.LASF3114
 	.byte	0x1
-	.2byte	0x367
+	.2byte	0x369
 	.4byte	0xac0
 	.uleb128 0x46
-	.4byte	.LASF3113
+	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x368
+	.2byte	0x36a
 	.4byte	0xc0c8
 	.uleb128 0x46
-	.4byte	.LASF3114
+	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x369
+	.2byte	0x36b
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2857
 	.byte	0x1
-	.2byte	0x36a
+	.2byte	0x36c
 	.4byte	0xc0c8
 	.uleb128 0x46
-	.4byte	.LASF2944
+	.4byte	.LASF2946
 	.byte	0x1
-	.2byte	0x36b
+	.2byte	0x36d
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3118
+	.4byte	.LASF3120
 	.byte	0x1
-	.2byte	0x338
+	.2byte	0x33a
 	.byte	0x1
-	.4byte	0x12ab4
+	.4byte	0x12ada
 	.uleb128 0x65
-	.4byte	.LASF3105
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x338
+	.2byte	0x33a
 	.4byte	0xc0c8
 	.uleb128 0x65
-	.4byte	.LASF3106
+	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x339
+	.2byte	0x33b
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF3107
+	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x339
+	.2byte	0x33b
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x33a
-	.4byte	0xe7a7
+	.2byte	0x33c
+	.4byte	0xe7b3
 	.uleb128 0x46
-	.4byte	.LASF3002
+	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x33c
-	.4byte	0xe160
+	.2byte	0x33e
+	.4byte	0xe16c
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x33d
+	.2byte	0x33f
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x33d
+	.2byte	0x33f
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2898
+	.4byte	.LASF2900
 	.byte	0x1
-	.2byte	0x33e
+	.2byte	0x340
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x33f
+	.2byte	0x341
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3109
+	.4byte	.LASF3111
 	.byte	0x1
-	.2byte	0x340
+	.2byte	0x342
 	.4byte	0x15a
 	.uleb128 0x46
-	.4byte	.LASF3110
+	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x340
+	.2byte	0x342
 	.4byte	0x15a
 	.uleb128 0x46
-	.4byte	.LASF3111
+	.4byte	.LASF3113
 	.byte	0x1
-	.2byte	0x340
+	.2byte	0x342
 	.4byte	0x4684
 	.uleb128 0x46
-	.4byte	.LASF3112
+	.4byte	.LASF3114
 	.byte	0x1
-	.2byte	0x340
+	.2byte	0x342
 	.4byte	0x4684
 	.uleb128 0x46
-	.4byte	.LASF3113
+	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x341
+	.2byte	0x343
 	.4byte	0xc0c8
 	.uleb128 0x46
-	.4byte	.LASF3114
+	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x342
+	.2byte	0x344
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2857
 	.byte	0x1
-	.2byte	0x343
+	.2byte	0x345
 	.4byte	0xc0c8
 	.uleb128 0x46
-	.4byte	.LASF2944
+	.4byte	.LASF2946
 	.byte	0x1
-	.2byte	0x344
+	.2byte	0x346
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3119
+	.4byte	.LASF3121
 	.byte	0x1
-	.2byte	0x26a
+	.2byte	0x26c
 	.8byte	.LFB2812
 	.8byte	.LFE2812-.LFB2812
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12c15
+	.4byte	0x12c3b
 	.uleb128 0x74
-	.4byte	.LASF3105
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x26a
+	.2byte	0x26c
 	.4byte	0xc0c8
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x74
-	.4byte	.LASF3106
+	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x26a
+	.2byte	0x26c
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x74
-	.4byte	.LASF3107
+	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x26a
+	.2byte	0x26c
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x74
-	.4byte	.LASF3120
+	.4byte	.LASF3122
 	.byte	0x1
-	.2byte	0x26b
+	.2byte	0x26d
 	.4byte	0xc0c8
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x74
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x26b
-	.4byte	0xe7a7
+	.2byte	0x26d
+	.4byte	0xe7b3
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x46
-	.4byte	.LASF3002
+	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x26d
-	.4byte	0xe160
+	.2byte	0x26f
+	.4byte	0xe16c
 	.uleb128 0x69
 	.string	"i"
 	.byte	0x1
-	.2byte	0x26e
+	.2byte	0x270
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5d
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x26f
+	.2byte	0x271
 	.4byte	0xc6
 	.uleb128 0x4c
-	.4byte	.LASF2898
+	.4byte	.LASF2900
 	.byte	0x1
-	.2byte	0x270
+	.2byte	0x272
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x62
 	.uleb128 0x4c
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x271
+	.2byte	0x273
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x59
-	.4byte	.LASF3109
+	.4byte	.LASF3111
 	.byte	0x1
-	.2byte	0x272
+	.2byte	0x274
 	.4byte	0x13f
 	.4byte	.LLST6
 	.uleb128 0x59
-	.4byte	.LASF3110
+	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x272
+	.2byte	0x274
 	.4byte	0x13f
 	.4byte	.LLST7
 	.uleb128 0x46
-	.4byte	.LASF3121
+	.4byte	.LASF3123
 	.byte	0x1
-	.2byte	0x272
+	.2byte	0x274
 	.4byte	0x13f
 	.uleb128 0x4c
-	.4byte	.LASF3111
+	.4byte	.LASF3113
 	.byte	0x1
-	.2byte	0x273
+	.2byte	0x275
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4c
-	.4byte	.LASF3112
+	.4byte	.LASF3114
 	.byte	0x1
-	.2byte	0x273
+	.2byte	0x275
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x59
-	.4byte	.LASF3113
+	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x274
+	.2byte	0x276
 	.4byte	0xc0c8
 	.4byte	.LLST8
 	.uleb128 0x46
-	.4byte	.LASF2968
+	.4byte	.LASF2970
 	.byte	0x1
-	.2byte	0x275
+	.2byte	0x277
 	.4byte	0x110
 	.uleb128 0x4c
-	.4byte	.LASF3122
+	.4byte	.LASF3124
 	.byte	0x1
-	.2byte	0x276
+	.2byte	0x278
 	.4byte	0xc0c8
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x46
-	.4byte	.LASF3123
+	.4byte	.LASF3125
 	.byte	0x1
-	.2byte	0x277
+	.2byte	0x279
 	.4byte	0x110
 	.uleb128 0x46
 	.4byte	.LASF2857
 	.byte	0x1
-	.2byte	0x278
+	.2byte	0x27a
 	.4byte	0xc0c8
 	.uleb128 0x46
-	.4byte	.LASF2944
+	.4byte	.LASF2946
 	.byte	0x1
-	.2byte	0x279
+	.2byte	0x27b
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3124
+	.4byte	.LASF3126
 	.byte	0x1
-	.2byte	0x27a
+	.2byte	0x27c
 	.4byte	0x110
 	.uleb128 0x46
-	.4byte	.LASF3125
+	.4byte	.LASF3127
 	.byte	0x1
-	.2byte	0x27a
+	.2byte	0x27c
 	.4byte	0x110
 	.uleb128 0x59
-	.4byte	.LASF3126
+	.4byte	.LASF3128
 	.byte	0x1
-	.2byte	0x27b
+	.2byte	0x27d
 	.4byte	0x13f
 	.4byte	.LLST9
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3127
+	.4byte	.LASF3129
 	.byte	0x1
-	.2byte	0x1c5
+	.2byte	0x1c7
 	.8byte	.LFB2811
 	.8byte	.LFE2811-.LFB2811
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12d70
+	.4byte	0x12d96
 	.uleb128 0x74
-	.4byte	.LASF3105
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x1c5
+	.2byte	0x1c7
 	.4byte	0xc0c8
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x74
-	.4byte	.LASF3106
+	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x1c5
+	.2byte	0x1c7
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x74
-	.4byte	.LASF3107
+	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x1c5
+	.2byte	0x1c7
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x74
-	.4byte	.LASF3120
+	.4byte	.LASF3122
 	.byte	0x1
-	.2byte	0x1c6
+	.2byte	0x1c8
 	.4byte	0xc0c8
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x74
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x1c6
-	.4byte	0xe7a7
+	.2byte	0x1c8
+	.4byte	0xe7b3
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x46
-	.4byte	.LASF3002
+	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x1c8
-	.4byte	0xe160
+	.2byte	0x1ca
+	.4byte	0xe16c
 	.uleb128 0x5a
 	.string	"i"
 	.byte	0x1
-	.2byte	0x1c9
+	.2byte	0x1cb
 	.4byte	0xc6
 	.4byte	.LLST0
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x1ca
+	.2byte	0x1cc
 	.4byte	0xc6
 	.uleb128 0x4c
-	.4byte	.LASF2898
+	.4byte	.LASF2900
 	.byte	0x1
-	.2byte	0x1cb
+	.2byte	0x1cd
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x61
 	.uleb128 0x59
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x1cc
+	.2byte	0x1ce
 	.4byte	0xc6
 	.4byte	.LLST1
 	.uleb128 0x59
-	.4byte	.LASF3109
+	.4byte	.LASF3111
 	.byte	0x1
-	.2byte	0x1cd
+	.2byte	0x1cf
 	.4byte	0x13f
 	.4byte	.LLST2
 	.uleb128 0x59
-	.4byte	.LASF3110
+	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x1cd
+	.2byte	0x1cf
 	.4byte	0x13f
 	.4byte	.LLST3
 	.uleb128 0x4c
-	.4byte	.LASF3111
+	.4byte	.LASF3113
 	.byte	0x1
-	.2byte	0x1ce
+	.2byte	0x1d0
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4c
-	.4byte	.LASF3112
+	.4byte	.LASF3114
 	.byte	0x1
-	.2byte	0x1ce
+	.2byte	0x1d0
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x59
-	.4byte	.LASF3113
+	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x1cf
+	.2byte	0x1d1
 	.4byte	0xc0c8
 	.4byte	.LLST4
 	.uleb128 0x4c
-	.4byte	.LASF2968
+	.4byte	.LASF2970
 	.byte	0x1
-	.2byte	0x1d0
+	.2byte	0x1d2
 	.4byte	0x110
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x4c
-	.4byte	.LASF3122
+	.4byte	.LASF3124
 	.byte	0x1
-	.2byte	0x1d1
+	.2byte	0x1d3
 	.4byte	0xc0c8
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x46
-	.4byte	.LASF3123
+	.4byte	.LASF3125
 	.byte	0x1
-	.2byte	0x1d2
+	.2byte	0x1d4
 	.4byte	0x110
 	.uleb128 0x46
 	.4byte	.LASF2857
 	.byte	0x1
-	.2byte	0x1d3
+	.2byte	0x1d5
 	.4byte	0xc0c8
 	.uleb128 0x46
-	.4byte	.LASF2944
+	.4byte	.LASF2946
 	.byte	0x1
-	.2byte	0x1d4
+	.2byte	0x1d6
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3124
+	.4byte	.LASF3126
 	.byte	0x1
-	.2byte	0x1d5
+	.2byte	0x1d7
 	.4byte	0x110
 	.uleb128 0x46
-	.4byte	.LASF3125
+	.4byte	.LASF3127
 	.byte	0x1
-	.2byte	0x1d5
+	.2byte	0x1d7
 	.4byte	0x110
 	.uleb128 0x59
-	.4byte	.LASF3126
+	.4byte	.LASF3128
 	.byte	0x1
-	.2byte	0x1d6
+	.2byte	0x1d8
 	.4byte	0x13f
 	.4byte	.LLST5
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3128
+	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x166
+	.2byte	0x168
 	.byte	0x1
-	.4byte	0x12e8e
+	.4byte	0x12eb4
 	.uleb128 0x65
-	.4byte	.LASF3129
+	.4byte	.LASF3131
 	.byte	0x1
-	.2byte	0x166
+	.2byte	0x168
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF3130
+	.4byte	.LASF3132
 	.byte	0x1
-	.2byte	0x166
+	.2byte	0x168
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF3131
+	.4byte	.LASF3133
 	.byte	0x1
-	.2byte	0x166
+	.2byte	0x168
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF3120
+	.4byte	.LASF3122
 	.byte	0x1
-	.2byte	0x166
+	.2byte	0x168
 	.4byte	0x4684
 	.uleb128 0x65
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x167
-	.4byte	0xe7a7
+	.2byte	0x169
+	.4byte	0xe7b3
 	.uleb128 0x65
 	.4byte	.LASF2868
 	.byte	0x1
-	.2byte	0x167
+	.2byte	0x169
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2898
+	.4byte	.LASF2900
 	.byte	0x1
-	.2byte	0x169
+	.2byte	0x16b
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x169
+	.2byte	0x16b
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3132
+	.4byte	.LASF3134
 	.byte	0x1
-	.2byte	0x16a
+	.2byte	0x16c
 	.4byte	0x13f
 	.uleb128 0x46
-	.4byte	.LASF3133
+	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x16a
+	.2byte	0x16c
 	.4byte	0x13f
 	.uleb128 0x46
-	.4byte	.LASF3134
+	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x16a
+	.2byte	0x16c
 	.4byte	0x13f
 	.uleb128 0x46
-	.4byte	.LASF3135
+	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x16b
+	.2byte	0x16d
 	.4byte	0xac0
 	.uleb128 0x46
-	.4byte	.LASF3136
+	.4byte	.LASF3138
 	.byte	0x1
-	.2byte	0x16b
+	.2byte	0x16d
 	.4byte	0xac0
 	.uleb128 0x46
-	.4byte	.LASF3137
+	.4byte	.LASF3139
 	.byte	0x1
-	.2byte	0x16b
+	.2byte	0x16d
 	.4byte	0xac0
 	.uleb128 0x46
-	.4byte	.LASF3123
+	.4byte	.LASF3125
 	.byte	0x1
-	.2byte	0x16c
+	.2byte	0x16e
 	.4byte	0x15a
 	.uleb128 0x46
-	.4byte	.LASF3122
+	.4byte	.LASF3124
 	.byte	0x1
-	.2byte	0x16d
+	.2byte	0x16f
 	.4byte	0x4684
 	.uleb128 0x46
-	.4byte	.LASF3138
+	.4byte	.LASF3140
 	.byte	0x1
-	.2byte	0x16e
+	.2byte	0x170
 	.4byte	0x13f
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x16f
+	.2byte	0x171
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x170
+	.2byte	0x172
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2869
 	.byte	0x1
-	.2byte	0x171
+	.2byte	0x173
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2871
 	.byte	0x1
-	.2byte	0x172
+	.2byte	0x174
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2870
 	.byte	0x1
-	.2byte	0x173
+	.2byte	0x175
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2872
 	.byte	0x1
-	.2byte	0x174
+	.2byte	0x176
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x75
-	.4byte	.LASF3139
+	.4byte	.LASF3141
 	.byte	0x1
 	.2byte	0x151
 	.8byte	.LFB2809
 	.8byte	.LFE2809-.LFB2809
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12f1e
+	.4byte	0x12f44
 	.uleb128 0x58
 	.4byte	.LASF2274
 	.byte	0x1
@@ -44444,68 +44489,68 @@ __exitcall_ebc_exit:
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x153
-	.4byte	0xe4b6
+	.4byte	0xe4c2
 	.4byte	.LLST186
 	.uleb128 0x59
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
 	.2byte	0x154
-	.4byte	0xe7a7
+	.4byte	0xe7b3
 	.4byte	.LLST187
 	.uleb128 0x4e
 	.8byte	.LVL750
-	.4byte	0x146c8
+	.4byte	0x146ee
 	.uleb128 0x4e
 	.8byte	.LVL752
-	.4byte	0x12fe5
+	.4byte	0x1300b
 	.uleb128 0x4e
 	.8byte	.LVL753
-	.4byte	0x146d4
+	.4byte	0x14706
 	.uleb128 0x4e
 	.8byte	.LVL756
-	.4byte	0x12f1e
+	.4byte	0x12f44
 	.uleb128 0x4e
 	.8byte	.LVL757
-	.4byte	0x146d4
+	.4byte	0x14706
 	.byte	0
 	.uleb128 0x75
-	.4byte	.LASF3140
+	.4byte	.LASF3142
 	.byte	0x1
 	.2byte	0x120
 	.8byte	.LFB2808
 	.8byte	.LFE2808-.LFB2808
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12fe5
+	.4byte	0x1300b
 	.uleb128 0x74
-	.4byte	.LASF3129
+	.4byte	.LASF3131
 	.byte	0x1
 	.2byte	0x120
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x74
-	.4byte	.LASF3130
+	.4byte	.LASF3132
 	.byte	0x1
 	.2byte	0x120
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x74
-	.4byte	.LASF3120
+	.4byte	.LASF3122
 	.byte	0x1
 	.2byte	0x120
 	.4byte	0x4684
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x58
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
 	.2byte	0x121
-	.4byte	0xe7a7
+	.4byte	0xe7b3
 	.4byte	.LLST181
 	.uleb128 0x4c
-	.4byte	.LASF2898
+	.4byte	.LASF2900
 	.byte	0x1
 	.2byte	0x123
 	.4byte	0xc6
@@ -44519,18 +44564,18 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x59
 	.uleb128 0x46
-	.4byte	.LASF3132
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x124
 	.4byte	0x13f
 	.uleb128 0x59
-	.4byte	.LASF3133
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x124
 	.4byte	0x13f
 	.4byte	.LLST182
 	.uleb128 0x59
-	.4byte	.LASF3123
+	.4byte	.LASF3125
 	.byte	0x1
 	.2byte	0x125
 	.4byte	0x15a
@@ -44548,54 +44593,54 @@ __exitcall_ebc_exit:
 	.2byte	0x126
 	.4byte	0xc6
 	.uleb128 0x59
-	.4byte	.LASF3138
+	.4byte	.LASF3140
 	.byte	0x1
 	.2byte	0x127
 	.4byte	0x13f
 	.4byte	.LLST184
 	.byte	0
 	.uleb128 0x76
-	.4byte	.LASF3141
+	.4byte	.LASF3143
 	.byte	0x1
 	.byte	0xd5
 	.8byte	.LFB2807
 	.8byte	.LFE2807-.LFB2807
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x130ca
+	.4byte	0x130f0
 	.uleb128 0x77
-	.4byte	.LASF3129
+	.4byte	.LASF3131
 	.byte	0x1
 	.byte	0xd5
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x77
-	.4byte	.LASF3130
+	.4byte	.LASF3132
 	.byte	0x1
 	.byte	0xd5
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x77
-	.4byte	.LASF3131
+	.4byte	.LASF3133
 	.byte	0x1
 	.byte	0xd5
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x77
-	.4byte	.LASF3120
+	.4byte	.LASF3122
 	.byte	0x1
 	.byte	0xd5
 	.4byte	0x4684
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x78
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
 	.byte	0xd6
-	.4byte	0xe7a7
+	.4byte	0xe7b3
 	.4byte	.LLST175
 	.uleb128 0x78
 	.4byte	.LASF2868
@@ -44604,7 +44649,7 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.4byte	.LLST176
 	.uleb128 0x4b
-	.4byte	.LASF2898
+	.4byte	.LASF2900
 	.byte	0x1
 	.byte	0xd8
 	.4byte	0xc6
@@ -44618,24 +44663,24 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x79
-	.4byte	.LASF3132
+	.4byte	.LASF3134
 	.byte	0x1
 	.byte	0xd9
 	.4byte	0x13f
 	.uleb128 0x7a
-	.4byte	.LASF3133
+	.4byte	.LASF3135
 	.byte	0x1
 	.byte	0xd9
 	.4byte	0x13f
 	.4byte	.LLST177
 	.uleb128 0x7a
-	.4byte	.LASF3134
+	.4byte	.LASF3136
 	.byte	0x1
 	.byte	0xd9
 	.4byte	0x13f
 	.4byte	.LLST178
 	.uleb128 0x7a
-	.4byte	.LASF3123
+	.4byte	.LASF3125
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x15a
@@ -44653,198 +44698,198 @@ __exitcall_ebc_exit:
 	.byte	0xdb
 	.4byte	0xc6
 	.uleb128 0x7a
-	.4byte	.LASF3138
+	.4byte	.LASF3140
 	.byte	0x1
 	.byte	0xdc
 	.4byte	0x13f
 	.4byte	.LLST180
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3142
+	.4byte	.LASF3144
 	.byte	0x1
 	.byte	0xb6
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x130fc
+	.4byte	0x13122
 	.uleb128 0x7e
 	.string	"ebc"
 	.byte	0x1
 	.byte	0xb6
-	.4byte	0xe4b6
+	.4byte	0xe4c2
 	.uleb128 0x7f
-	.4byte	.LASF3143
+	.4byte	.LASF3145
 	.byte	0x1
 	.byte	0xb6
 	.4byte	0xc6
 	.uleb128 0x79
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
 	.byte	0xb8
-	.4byte	0xe7a7
+	.4byte	0xe7b3
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3144
+	.4byte	.LASF3146
 	.byte	0x1
 	.byte	0x88
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x13144
+	.4byte	0x1316a
 	.uleb128 0x7f
 	.4byte	.LASF2857
 	.byte	0x1
 	.byte	0x88
 	.4byte	0xc0c8
 	.uleb128 0x7f
-	.4byte	.LASF3109
+	.4byte	.LASF3111
 	.byte	0x1
 	.byte	0x88
 	.4byte	0x11f
 	.uleb128 0x7f
-	.4byte	.LASF3110
+	.4byte	.LASF3112
 	.byte	0x1
 	.byte	0x88
 	.4byte	0x11f
 	.uleb128 0x79
-	.4byte	.LASF3145
+	.4byte	.LASF3147
 	.byte	0x1
 	.byte	0x8a
 	.4byte	0x110
 	.uleb128 0x79
-	.4byte	.LASF3126
+	.4byte	.LASF3128
 	.byte	0x1
 	.byte	0x8b
 	.4byte	0x11f
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3146
+	.4byte	.LASF3148
 	.byte	0x1
 	.byte	0x82
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x13176
+	.4byte	0x1319c
 	.uleb128 0x7f
 	.4byte	.LASF2857
 	.byte	0x1
 	.byte	0x82
 	.4byte	0xc0c8
 	.uleb128 0x7f
-	.4byte	.LASF3109
+	.4byte	.LASF3111
 	.byte	0x1
 	.byte	0x82
 	.4byte	0x11f
 	.uleb128 0x7f
-	.4byte	.LASF3110
+	.4byte	.LASF3112
 	.byte	0x1
 	.byte	0x82
 	.4byte	0x11f
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3147
+	.4byte	.LASF3149
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x1319a
+	.4byte	0x131c0
 	.uleb128 0x7f
-	.4byte	.LASF2934
+	.4byte	.LASF2936
 	.byte	0xb
 	.byte	0x4b
-	.4byte	0xe120
+	.4byte	0xe12c
 	.uleb128 0x7f
-	.4byte	.LASF2968
+	.4byte	.LASF2970
 	.byte	0xb
 	.byte	0x4b
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3148
+	.4byte	.LASF3150
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x131c9
+	.4byte	0x131ef
 	.uleb128 0x7f
-	.4byte	.LASF2934
+	.4byte	.LASF2936
 	.byte	0xb
 	.byte	0x3c
-	.4byte	0xe120
+	.4byte	0xe12c
 	.uleb128 0x7f
-	.4byte	.LASF3149
+	.4byte	.LASF3151
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13f
 	.uleb128 0x7f
-	.4byte	.LASF3150
+	.4byte	.LASF3152
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3151
+	.4byte	.LASF3153
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x1320e
+	.4byte	0x13234
 	.uleb128 0x7f
-	.4byte	.LASF2934
+	.4byte	.LASF2936
 	.byte	0xb
 	.byte	0x36
-	.4byte	0xe120
+	.4byte	0xe12c
 	.uleb128 0x7f
-	.4byte	.LASF3152
+	.4byte	.LASF3154
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xc6
 	.uleb128 0x7f
-	.4byte	.LASF3153
+	.4byte	.LASF3155
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x7f
-	.4byte	.LASF3154
+	.4byte	.LASF3156
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x7f
-	.4byte	.LASF3155
+	.4byte	.LASF3157
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3156
+	.4byte	.LASF3158
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x13227
+	.4byte	0x1324d
 	.uleb128 0x7f
-	.4byte	.LASF2934
+	.4byte	.LASF2936
 	.byte	0xb
 	.byte	0x31
-	.4byte	0xe120
+	.4byte	0xe12c
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3157
+	.4byte	.LASF3159
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1324e
+	.4byte	0x13274
 	.uleb128 0x7f
-	.4byte	.LASF2934
+	.4byte	.LASF2936
 	.byte	0xb
 	.byte	0x2c
-	.4byte	0xe120
+	.4byte	0xe12c
 	.uleb128 0x7f
-	.4byte	.LASF3002
+	.4byte	.LASF3004
 	.byte	0xb
 	.byte	0x2c
-	.4byte	0xe160
+	.4byte	0xe16c
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3158
+	.4byte	.LASF3160
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x13298
+	.4byte	0x132be
 	.uleb128 0x64
 	.string	"dev"
 	.byte	0xa
@@ -44864,7 +44909,7 @@ __exitcall_ebc_exit:
 	.string	"dir"
 	.byte	0xa
 	.2byte	0x1ad
-	.4byte	0xdb86
+	.4byte	0xdb92
 	.uleb128 0x52
 	.string	"ops"
 	.byte	0xa
@@ -44872,12 +44917,12 @@ __exitcall_ebc_exit:
 	.4byte	0xb7b9
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3159
+	.4byte	.LASF3161
 	.byte	0xa
 	.2byte	0x108
 	.4byte	0xb7b9
 	.byte	0x3
-	.4byte	0x132b6
+	.4byte	0x132dc
 	.uleb128 0x64
 	.string	"dev"
 	.byte	0xa
@@ -44885,12 +44930,12 @@ __exitcall_ebc_exit:
 	.4byte	0xa570
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3160
+	.4byte	.LASF3162
 	.byte	0xc8
 	.byte	0x1d
 	.4byte	0xb7b9
 	.byte	0x3
-	.4byte	0x132d2
+	.4byte	0x132f8
 	.uleb128 0x7e
 	.string	"bus"
 	.byte	0xc8
@@ -44898,31 +44943,31 @@ __exitcall_ebc_exit:
 	.4byte	0xadd7
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3161
+	.4byte	.LASF3163
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x132ee
+	.4byte	0x13314
 	.uleb128 0x7f
-	.4byte	.LASF3162
+	.4byte	.LASF3164
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3163
+	.4byte	.LASF3165
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x13328
+	.4byte	0x1334e
 	.uleb128 0x7e
 	.string	"dev"
 	.byte	0xcb
 	.byte	0xa3
 	.4byte	0xa570
 	.uleb128 0x7f
-	.4byte	.LASF3164
+	.4byte	.LASF3166
 	.byte	0xcb
 	.byte	0xa4
 	.4byte	0x325
@@ -44932,36 +44977,36 @@ __exitcall_ebc_exit:
 	.byte	0xa5
 	.4byte	0x2e3
 	.uleb128 0x7f
-	.4byte	.LASF3165
+	.4byte	.LASF3167
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3166
+	.4byte	.LASF3168
 	.byte	0x3
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13344
+	.4byte	0x1336a
 	.uleb128 0x7f
-	.4byte	.LASF2935
+	.4byte	.LASF2937
 	.byte	0x3
 	.byte	0x35
-	.4byte	0xdb20
+	.4byte	0xdb2c
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3167
+	.4byte	.LASF3169
 	.byte	0x3
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13369
+	.4byte	0x1338f
 	.uleb128 0x7f
-	.4byte	.LASF2935
+	.4byte	.LASF2937
 	.byte	0x3
 	.byte	0x30
-	.4byte	0xdb20
+	.4byte	0xdb2c
 	.uleb128 0x7e
 	.string	"t"
 	.byte	0x3
@@ -44969,64 +45014,64 @@ __exitcall_ebc_exit:
 	.4byte	0x467e
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3168
+	.4byte	.LASF3170
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x13382
+	.4byte	0x133a8
 	.uleb128 0x7f
-	.4byte	.LASF2935
+	.4byte	.LASF2937
 	.byte	0x3
 	.byte	0x2b
-	.4byte	0xdb20
+	.4byte	0xdb2c
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3169
+	.4byte	.LASF3171
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x1339b
+	.4byte	0x133c1
 	.uleb128 0x7f
-	.4byte	.LASF2935
+	.4byte	.LASF2937
 	.byte	0x3
 	.byte	0x26
-	.4byte	0xdb20
+	.4byte	0xdb2c
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3170
+	.4byte	.LASF3172
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x133b4
+	.4byte	0x133da
 	.uleb128 0x7f
-	.4byte	.LASF2935
+	.4byte	.LASF2937
 	.byte	0x3
 	.byte	0x21
-	.4byte	0xdb20
+	.4byte	0xdb2c
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3171
+	.4byte	.LASF3173
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x133cd
+	.4byte	0x133f3
 	.uleb128 0x7f
-	.4byte	.LASF2935
+	.4byte	.LASF2937
 	.byte	0x3
 	.byte	0x1c
-	.4byte	0xdb20
+	.4byte	0xdb2c
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3172
+	.4byte	.LASF3174
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x133e6
+	.4byte	0x1340c
 	.uleb128 0x7f
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x133e6
+	.4byte	0x1340c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -45036,24 +45081,24 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x13405
+	.4byte	0x1342b
 	.uleb128 0x7f
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x133e6
+	.4byte	0x1340c
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3173
+	.4byte	.LASF3175
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x1343e
+	.4byte	0x13464
 	.uleb128 0x7f
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x133e6
+	.4byte	0x1340c
 	.uleb128 0x7f
 	.4byte	.LASF193
 	.byte	0x4
@@ -45071,12 +45116,12 @@ __exitcall_ebc_exit:
 	.4byte	0xad0d
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3174
+	.4byte	.LASF3176
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1346d
+	.4byte	0x13493
 	.uleb128 0x7e
 	.string	"to"
 	.byte	0x9
@@ -45094,12 +45139,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3175
+	.4byte	.LASF3177
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1349c
+	.4byte	0x134c2
 	.uleb128 0x7e
 	.string	"to"
 	.byte	0x9
@@ -45117,12 +45162,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3176
+	.4byte	.LASF3178
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x134cb
+	.4byte	0x134f1
 	.uleb128 0x7e
 	.string	"to"
 	.byte	0x9
@@ -45140,12 +45185,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3177
+	.4byte	.LASF3179
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13505
+	.4byte	0x1352b
 	.uleb128 0x7e
 	.string	"to"
 	.byte	0x9
@@ -45168,37 +45213,37 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3178
+	.4byte	.LASF3180
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x13539
+	.4byte	0x1355f
 	.uleb128 0x7e
 	.string	"ptr"
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x30bc
 	.uleb128 0x79
-	.4byte	.LASF3179
+	.4byte	.LASF3181
 	.byte	0x6
 	.byte	0xf7
 	.4byte	0x458
 	.uleb128 0x67
 	.uleb128 0x79
-	.4byte	.LASF3180
+	.4byte	.LASF3182
 	.byte	0x6
 	.byte	0xfe
 	.4byte	0x15a
 	.byte	0
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3181
+	.4byte	.LASF3183
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13583
+	.4byte	0x135a9
 	.uleb128 0x7f
 	.4byte	.LASF1150
 	.byte	0x6
@@ -45215,25 +45260,25 @@ __exitcall_ebc_exit:
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x79
-	.4byte	.LASF3182
+	.4byte	.LASF3184
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x67
 	.uleb128 0x79
-	.4byte	.LASF3180
+	.4byte	.LASF3182
 	.byte	0x6
 	.byte	0x56
 	.4byte	0x15a
 	.byte	0
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3183
+	.4byte	.LASF3185
 	.byte	0x12
 	.2byte	0x2e5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x135ad
+	.4byte	0x135d3
 	.uleb128 0x65
 	.4byte	.LASF987
 	.byte	0x12
@@ -45246,12 +45291,12 @@ __exitcall_ebc_exit:
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3184
+	.4byte	.LASF3186
 	.byte	0x12
 	.2byte	0x216
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x135e5
+	.4byte	0x1360b
 	.uleb128 0x65
 	.4byte	.LASF987
 	.byte	0x12
@@ -45271,12 +45316,12 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3185
+	.4byte	.LASF3187
 	.byte	0x12
 	.2byte	0x1dd
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x1361b
+	.4byte	0x13641
 	.uleb128 0x65
 	.4byte	.LASF987
 	.byte	0x12
@@ -45288,18 +45333,18 @@ __exitcall_ebc_exit:
 	.2byte	0x1dd
 	.4byte	0x330
 	.uleb128 0x46
-	.4byte	.LASF3186
+	.4byte	.LASF3188
 	.byte	0x12
 	.2byte	0x1df
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3187
+	.4byte	.LASF3189
 	.byte	0x12
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x13639
+	.4byte	0x1365f
 	.uleb128 0x65
 	.4byte	.LASF987
 	.byte	0x12
@@ -45307,12 +45352,12 @@ __exitcall_ebc_exit:
 	.4byte	0x2e3
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3188
+	.4byte	.LASF3190
 	.byte	0x12
 	.2byte	0x13d
 	.4byte	0xd7a3
 	.byte	0x3
-	.4byte	0x13657
+	.4byte	0x1367d
 	.uleb128 0x65
 	.4byte	.LASF171
 	.byte	0x12
@@ -45320,13 +45365,13 @@ __exitcall_ebc_exit:
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3189
+	.4byte	.LASF3191
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x1367b
+	.4byte	0x136a1
 	.uleb128 0x7f
-	.4byte	.LASF3032
+	.4byte	.LASF3034
 	.byte	0xbe
 	.byte	0xdb
 	.4byte	0xd71a
@@ -45337,79 +45382,79 @@ __exitcall_ebc_exit:
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3190
+	.4byte	.LASF3192
 	.byte	0xbe
 	.byte	0xd6
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x13697
+	.4byte	0x136bd
 	.uleb128 0x7f
-	.4byte	.LASF3032
+	.4byte	.LASF3034
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x13697
+	.4byte	0x136bd
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xd672
 	.uleb128 0x63
-	.4byte	.LASF3191
+	.4byte	.LASF3193
 	.byte	0xa3
 	.2byte	0x164
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x136bb
+	.4byte	0x136e1
 	.uleb128 0x64
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x136bb
+	.4byte	0x136e1
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc0c3
 	.uleb128 0x63
-	.4byte	.LASF3192
+	.4byte	.LASF3194
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x136f6
+	.4byte	0x1371c
 	.uleb128 0x64
 	.string	"np"
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xbcba
 	.uleb128 0x65
-	.4byte	.LASF3193
+	.4byte	.LASF3195
 	.byte	0xe
 	.2byte	0x499
 	.4byte	0x56
 	.uleb128 0x65
-	.4byte	.LASF3194
+	.4byte	.LASF3196
 	.byte	0xe
 	.2byte	0x49a
 	.4byte	0xac0
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3195
+	.4byte	.LASF3197
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13742
+	.4byte	0x13768
 	.uleb128 0x64
 	.string	"np"
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xbcba
 	.uleb128 0x65
-	.4byte	.LASF3193
+	.4byte	.LASF3195
 	.byte	0xe
 	.2byte	0x1f0
 	.4byte	0x56
 	.uleb128 0x65
-	.4byte	.LASF3196
+	.4byte	.LASF3198
 	.byte	0xe
 	.2byte	0x1f1
 	.4byte	0xac0
@@ -45425,11 +45470,11 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3197
+	.4byte	.LASF3199
 	.byte	0xe
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x1375b
+	.4byte	0x13781
 	.uleb128 0x7f
 	.4byte	.LASF868
 	.byte	0xe
@@ -45437,11 +45482,11 @@ __exitcall_ebc_exit:
 	.4byte	0xb894
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3198
+	.4byte	.LASF3200
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x13781
+	.4byte	0x137a7
 	.uleb128 0x64
 	.string	"dev"
 	.byte	0x2
@@ -45454,12 +45499,12 @@ __exitcall_ebc_exit:
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3199
+	.4byte	.LASF3201
 	.byte	0x2
 	.2byte	0x49b
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x1379f
+	.4byte	0x137c5
 	.uleb128 0x64
 	.string	"dev"
 	.byte	0x2
@@ -45467,12 +45512,12 @@ __exitcall_ebc_exit:
 	.4byte	0xbb2a
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3200
+	.4byte	.LASF3202
 	.byte	0x2
 	.2byte	0x2c5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x137d5
+	.4byte	0x137fb
 	.uleb128 0x64
 	.string	"dev"
 	.byte	0x2
@@ -45490,12 +45535,12 @@ __exitcall_ebc_exit:
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3201
+	.4byte	.LASF3203
 	.byte	0xf
 	.byte	0xca
 	.4byte	0x351
 	.byte	0x3
-	.4byte	0x137f1
+	.4byte	0x13817
 	.uleb128 0x7e
 	.string	"res"
 	.byte	0xf
@@ -45503,12 +45548,12 @@ __exitcall_ebc_exit:
 	.4byte	0xc1d4
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3202
+	.4byte	.LASF3204
 	.byte	0xcc
 	.byte	0x22
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x1380d
+	.4byte	0x13833
 	.uleb128 0x7e
 	.string	"ptr"
 	.byte	0xcc
@@ -45516,12 +45561,12 @@ __exitcall_ebc_exit:
 	.4byte	0x30bc
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3203
+	.4byte	.LASF3205
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13829
+	.4byte	0x1384f
 	.uleb128 0x7f
 	.4byte	.LASF987
 	.byte	0xcd
@@ -45529,12 +45574,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3204
+	.4byte	.LASF3206
 	.byte	0xd
 	.2byte	0x23e
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x13847
+	.4byte	0x1386d
 	.uleb128 0x65
 	.4byte	.LASF2274
 	.byte	0xd
@@ -45542,12 +45587,12 @@ __exitcall_ebc_exit:
 	.4byte	0x3205
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3205
+	.4byte	.LASF3207
 	.byte	0xd
 	.2byte	0x203
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x13870
+	.4byte	0x13896
 	.uleb128 0x64
 	.string	"wq"
 	.byte	0xd
@@ -45560,29 +45605,29 @@ __exitcall_ebc_exit:
 	.4byte	0x3205
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3206
+	.4byte	.LASF3208
 	.byte	0xd
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x13894
+	.4byte	0x138ba
 	.uleb128 0x7f
 	.4byte	.LASF2274
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0x3205
 	.uleb128 0x7f
-	.4byte	.LASF3207
+	.4byte	.LASF3209
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3208
+	.4byte	.LASF3210
 	.byte	0x51
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x138b0
+	.4byte	0x138d6
 	.uleb128 0x64
 	.string	"m"
 	.byte	0x51
@@ -45590,12 +45635,12 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3209
+	.4byte	.LASF3211
 	.byte	0x51
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x138cc
+	.4byte	0x138f2
 	.uleb128 0x64
 	.string	"m"
 	.byte	0x51
@@ -45603,24 +45648,24 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3210
+	.4byte	.LASF3212
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x13908
+	.4byte	0x1392e
 	.uleb128 0x7f
 	.4byte	.LASF1150
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x30bc
 	.uleb128 0x7f
-	.4byte	.LASF3211
+	.4byte	.LASF3213
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2e3
 	.uleb128 0x7f
-	.4byte	.LASF3212
+	.4byte	.LASF3214
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2b0
@@ -45631,11 +45676,11 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3213
+	.4byte	.LASF3215
 	.byte	0xca
 	.byte	0x91
 	.byte	0x3
-	.4byte	0x13939
+	.4byte	0x1395f
 	.uleb128 0x7f
 	.4byte	.LASF987
 	.byte	0xca
@@ -45648,18 +45693,18 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.uleb128 0x67
 	.uleb128 0x79
-	.4byte	.LASF3214
+	.4byte	.LASF3216
 	.byte	0xca
 	.byte	0x93
 	.4byte	0xc6
 	.byte	0
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3215
+	.4byte	.LASF3217
 	.byte	0xca
 	.byte	0x80
 	.byte	0x3
-	.4byte	0x13966
+	.4byte	0x1398c
 	.uleb128 0x7e
 	.string	"ptr"
 	.byte	0xca
@@ -45671,25 +45716,25 @@ __exitcall_ebc_exit:
 	.byte	0x80
 	.4byte	0x29
 	.uleb128 0x7f
-	.4byte	.LASF3216
+	.4byte	.LASF3218
 	.byte	0xca
 	.byte	0x81
 	.4byte	0x2b0
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3217
+	.4byte	.LASF3219
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1398c
+	.4byte	0x139b2
 	.uleb128 0x7e
 	.string	"ti"
 	.byte	0xca
 	.byte	0x5f
-	.4byte	0x1398c
+	.4byte	0x139b2
 	.uleb128 0x7f
-	.4byte	.LASF3218
+	.4byte	.LASF3220
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
@@ -45698,24 +45743,24 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.4byte	0xc33
 	.uleb128 0x7d
-	.4byte	.LASF3219
+	.4byte	.LASF3221
 	.byte	0x5
 	.byte	0xf
 	.4byte	0x2f05
 	.byte	0x3
-	.4byte	0x139ae
+	.4byte	0x139d4
 	.uleb128 0x79
-	.4byte	.LASF3220
+	.4byte	.LASF3222
 	.byte	0x5
 	.byte	0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3221
+	.4byte	.LASF3223
 	.byte	0x10
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x139f3
+	.4byte	0x13a19
 	.uleb128 0x7f
 	.4byte	.LASF962
 	.byte	0x10
@@ -45726,9 +45771,9 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x139e6
+	.4byte	0x13a0c
 	.uleb128 0x22
-	.4byte	.LASF3100
+	.4byte	.LASF3102
 	.byte	0x10
 	.byte	0x1c
 	.4byte	0x3cc
@@ -45736,27 +45781,27 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x124c6
+	.4byte	0x124ec
 	.byte	0
 	.uleb128 0x7c
 	.string	"__u"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x139c7
+	.4byte	0x139ed
 	.byte	0
 	.byte	0
 	.uleb128 0x81
-	.4byte	.LASF3300
+	.4byte	.LASF3302
 	.byte	0x20
 	.2byte	0x126
 	.byte	0x3
 	.uleb128 0x7d
-	.4byte	.LASF3222
+	.4byte	.LASF3224
 	.byte	0xce
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13a17
+	.4byte	0x13a3d
 	.uleb128 0x7e
 	.string	"n"
 	.byte	0xce
@@ -45764,12 +45809,12 @@ __exitcall_ebc_exit:
 	.4byte	0x15a
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3223
+	.4byte	.LASF3225
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xe2
 	.byte	0x3
-	.4byte	0x13a49
+	.4byte	0x13a6f
 	.uleb128 0x7f
 	.4byte	.LASF2456
 	.byte	0x8
@@ -45787,12 +45832,12 @@ __exitcall_ebc_exit:
 	.4byte	0x8b
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3224
+	.4byte	.LASF3226
 	.byte	0xcf
 	.byte	0x50
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x13a63
+	.4byte	0x13a89
 	.uleb128 0x7e
 	.string	"p"
 	.byte	0xcf
@@ -45800,28 +45845,28 @@ __exitcall_ebc_exit:
 	.4byte	0xbcc0
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3225
+	.4byte	.LASF3227
 	.byte	0xd0
 	.byte	0xb8
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x13a7d
+	.4byte	0x13aa3
 	.uleb128 0x7e
 	.string	"p"
 	.byte	0xd0
 	.byte	0xb8
-	.4byte	0x13a7d
+	.4byte	0x13aa3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xdd
 	.uleb128 0x7d
-	.4byte	.LASF3226
+	.4byte	.LASF3228
 	.byte	0xd0
 	.byte	0x39
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x13a9f
+	.4byte	0x13ac5
 	.uleb128 0x7e
 	.string	"val"
 	.byte	0xd0
@@ -45829,12 +45874,12 @@ __exitcall_ebc_exit:
 	.4byte	0xd2
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3227
+	.4byte	.LASF3229
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13ac5
+	.4byte	0x13aeb
 	.uleb128 0x7e
 	.string	"nr"
 	.byte	0x7
@@ -45844,17 +45889,17 @@ __exitcall_ebc_exit:
 	.4byte	.LASF1150
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x13ac5
+	.4byte	0x13aeb
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x3a
 	.uleb128 0x80
-	.4byte	.LASF3228
+	.4byte	.LASF3230
 	.byte	0x11
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x13aff
+	.4byte	0x13b25
 	.uleb128 0x7e
 	.string	"i"
 	.byte	0x11
@@ -45864,7 +45909,7 @@ __exitcall_ebc_exit:
 	.string	"v"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13aff
+	.4byte	0x13b25
 	.uleb128 0x7c
 	.string	"w0"
 	.byte	0x11
@@ -45874,18 +45919,18 @@ __exitcall_ebc_exit:
 	.string	"x1"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13aff
+	.4byte	0x13b25
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x37c
 	.uleb128 0x7d
-	.4byte	.LASF3229
+	.4byte	.LASF3231
 	.byte	0xd1
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13b1f
+	.4byte	0x13b45
 	.uleb128 0x7e
 	.string	"x"
 	.byte	0xd1
@@ -45893,12 +45938,12 @@ __exitcall_ebc_exit:
 	.4byte	0xf4
 	.byte	0
 	.uleb128 0x7d
-	.4byte	.LASF3230
+	.4byte	.LASF3232
 	.byte	0xd2
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13b3b
+	.4byte	0x13b61
 	.uleb128 0x7f
 	.4byte	.LASF2489
 	.byte	0xd2
@@ -45906,16 +45951,16 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3231
+	.4byte	.LASF3233
 	.byte	0xd3
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x13b5d
+	.4byte	0x13b83
 	.uleb128 0x7e
 	.string	"p"
 	.byte	0xd3
 	.byte	0xb
-	.4byte	0x13b5d
+	.4byte	0x13b83
 	.uleb128 0x7f
 	.4byte	.LASF987
 	.byte	0xd3
@@ -45924,21 +45969,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x13b65
+	.4byte	0x13b8b
 	.uleb128 0x82
 	.uleb128 0x3
-	.4byte	0x13b63
+	.4byte	0x13b89
 	.uleb128 0x80
-	.4byte	.LASF3232
+	.4byte	.LASF3234
 	.byte	0xd3
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x13b8c
+	.4byte	0x13bb2
 	.uleb128 0x7e
 	.string	"p"
 	.byte	0xd3
 	.byte	0x9
-	.4byte	0x13b5d
+	.4byte	0x13b83
 	.uleb128 0x7f
 	.4byte	.LASF987
 	.byte	0xd3
@@ -45946,16 +45991,16 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3233
+	.4byte	.LASF3235
 	.byte	0xc
 	.2byte	0x11a
 	.byte	0x3
-	.4byte	0x13bbc
+	.4byte	0x13be2
 	.uleb128 0x64
 	.string	"p"
 	.byte	0xc
 	.2byte	0x11a
-	.4byte	0x13bbc
+	.4byte	0x13be2
 	.uleb128 0x64
 	.string	"res"
 	.byte	0xc
@@ -45969,433 +46014,433 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x13b63
+	.4byte	0x13b89
 	.uleb128 0x83
-	.4byte	0x103ae
+	.4byte	0x103ba
 	.8byte	.LFB2835
 	.8byte	.LFE2835-.LFB2835
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13bef
+	.4byte	0x13c15
 	.uleb128 0x6f
-	.4byte	0x103bf
+	.4byte	0x103cb
 	.4byte	.LLST10
 	.uleb128 0x71
-	.4byte	0x103cb
+	.4byte	0x103d7
 	.uleb128 0x1
 	.byte	0x51
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x128ca
+	.4byte	0x128f0
 	.8byte	.LFB2815
 	.8byte	.LFE2815-.LFB2815
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13e72
+	.4byte	0x13e98
 	.uleb128 0x71
-	.4byte	0x128d7
+	.4byte	0x128fd
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x128e3
+	.4byte	0x12909
 	.4byte	.LLST104
 	.uleb128 0x6f
-	.4byte	0x128ef
+	.4byte	0x12915
 	.4byte	.LLST105
 	.uleb128 0x6f
-	.4byte	0x128fb
+	.4byte	0x12921
 	.4byte	.LLST106
 	.uleb128 0x53
-	.4byte	0x12908
+	.4byte	0x1292e
 	.8byte	.LBB1242
 	.8byte	.LBE1242-.LBB1242
 	.byte	0x1
-	.2byte	0x38a
-	.4byte	0x13d27
+	.2byte	0x38c
+	.4byte	0x13d4d
 	.uleb128 0x54
-	.4byte	0x12939
+	.4byte	0x1295f
 	.uleb128 0x54
-	.4byte	0x12939
+	.4byte	0x1295f
 	.uleb128 0x54
-	.4byte	0x12939
+	.4byte	0x1295f
 	.uleb128 0x54
-	.4byte	0x1292d
+	.4byte	0x12953
 	.uleb128 0x54
-	.4byte	0x12921
+	.4byte	0x12947
 	.uleb128 0x54
-	.4byte	0x12915
+	.4byte	0x1293b
 	.uleb128 0x56
 	.8byte	.LBB1243
 	.8byte	.LBE1243-.LBB1243
 	.uleb128 0x57
-	.4byte	0x12945
+	.4byte	0x1296b
 	.uleb128 0x60
-	.4byte	0x12951
+	.4byte	0x12977
 	.4byte	.LLST107
 	.uleb128 0x57
-	.4byte	0x1295b
+	.4byte	0x12981
 	.uleb128 0x60
-	.4byte	0x12965
+	.4byte	0x1298b
 	.4byte	.LLST108
 	.uleb128 0x60
-	.4byte	0x12971
+	.4byte	0x12997
 	.4byte	.LLST109
 	.uleb128 0x60
-	.4byte	0x1297d
+	.4byte	0x129a3
 	.4byte	.LLST110
 	.uleb128 0x57
-	.4byte	0x12989
+	.4byte	0x129af
 	.uleb128 0x61
-	.4byte	0x12995
+	.4byte	0x129bb
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x61
-	.4byte	0x129a1
+	.4byte	0x129c7
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x60
-	.4byte	0x129ad
+	.4byte	0x129d3
 	.4byte	.LLST111
 	.uleb128 0x60
-	.4byte	0x129b9
+	.4byte	0x129df
 	.4byte	.LLST112
 	.uleb128 0x60
-	.4byte	0x129c5
+	.4byte	0x129eb
 	.4byte	.LLST113
 	.uleb128 0x57
-	.4byte	0x129d1
+	.4byte	0x129f7
 	.uleb128 0x5b
-	.4byte	0x13144
+	.4byte	0x1316a
 	.8byte	.LBB1244
 	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
-	.2byte	0x37d
-	.4byte	0x13d01
+	.2byte	0x37f
+	.4byte	0x13d27
 	.uleb128 0x54
-	.4byte	0x1316a
+	.4byte	0x13190
 	.uleb128 0x54
-	.4byte	0x1315f
+	.4byte	0x13185
 	.uleb128 0x54
-	.4byte	0x13154
+	.4byte	0x1317a
 	.byte	0
 	.uleb128 0x5f
-	.4byte	0x13144
+	.4byte	0x1316a
 	.8byte	.LBB1251
 	.4byte	.Ldebug_ranges0+0x730
 	.byte	0x1
-	.2byte	0x37e
+	.2byte	0x380
 	.uleb128 0x54
-	.4byte	0x1316a
+	.4byte	0x13190
 	.uleb128 0x54
-	.4byte	0x1315f
+	.4byte	0x13185
 	.uleb128 0x54
-	.4byte	0x13154
+	.4byte	0x1317a
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x780
 	.uleb128 0x54
-	.4byte	0x128fb
+	.4byte	0x12921
 	.uleb128 0x54
-	.4byte	0x128ef
+	.4byte	0x12915
 	.uleb128 0x54
-	.4byte	0x128e3
+	.4byte	0x12909
 	.uleb128 0x54
-	.4byte	0x128d7
+	.4byte	0x128fd
 	.uleb128 0x5f
-	.4byte	0x129de
+	.4byte	0x12a04
 	.8byte	.LBB1263
 	.4byte	.Ldebug_ranges0+0x780
 	.byte	0x1
-	.2byte	0x388
+	.2byte	0x38a
 	.uleb128 0x54
-	.4byte	0x12a0f
+	.4byte	0x12a35
 	.uleb128 0x54
-	.4byte	0x12a0f
+	.4byte	0x12a35
 	.uleb128 0x54
-	.4byte	0x12a0f
+	.4byte	0x12a35
 	.uleb128 0x54
-	.4byte	0x12a03
+	.4byte	0x12a29
 	.uleb128 0x54
-	.4byte	0x129f7
+	.4byte	0x12a1d
 	.uleb128 0x54
-	.4byte	0x129eb
+	.4byte	0x12a11
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x780
 	.uleb128 0x57
-	.4byte	0x12a1b
+	.4byte	0x12a41
 	.uleb128 0x61
-	.4byte	0x12a27
+	.4byte	0x12a4d
 	.uleb128 0x1
 	.byte	0x5c
 	.uleb128 0x57
-	.4byte	0x12a31
+	.4byte	0x12a57
 	.uleb128 0x61
-	.4byte	0x12a3b
+	.4byte	0x12a61
 	.uleb128 0x1
 	.byte	0x5f
 	.uleb128 0x57
-	.4byte	0x12a47
+	.4byte	0x12a6d
 	.uleb128 0x60
-	.4byte	0x12a53
+	.4byte	0x12a79
 	.4byte	.LLST114
 	.uleb128 0x60
-	.4byte	0x12a5f
+	.4byte	0x12a85
 	.4byte	.LLST115
 	.uleb128 0x61
-	.4byte	0x12a6b
+	.4byte	0x12a91
 	.uleb128 0x1
 	.byte	0x59
 	.uleb128 0x61
-	.4byte	0x12a77
+	.4byte	0x12a9d
 	.uleb128 0x1
 	.byte	0x5a
 	.uleb128 0x60
-	.4byte	0x12a83
+	.4byte	0x12aa9
 	.4byte	.LLST116
 	.uleb128 0x60
-	.4byte	0x12a8f
+	.4byte	0x12ab5
 	.4byte	.LLST117
 	.uleb128 0x61
-	.4byte	0x12a9b
+	.4byte	0x12ac1
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x57
-	.4byte	0x12aa7
+	.4byte	0x12acd
 	.uleb128 0x5b
-	.4byte	0x13144
+	.4byte	0x1316a
 	.8byte	.LBB1265
 	.4byte	.Ldebug_ranges0+0x7c0
 	.byte	0x1
-	.2byte	0x356
-	.4byte	0x13dfa
+	.2byte	0x358
+	.4byte	0x13e20
 	.uleb128 0x54
-	.4byte	0x1316a
+	.4byte	0x13190
 	.uleb128 0x54
-	.4byte	0x1315f
+	.4byte	0x13185
 	.uleb128 0x54
-	.4byte	0x13154
+	.4byte	0x1317a
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13144
+	.4byte	0x1316a
 	.8byte	.LBB1270
 	.4byte	.Ldebug_ranges0+0x810
 	.byte	0x1
-	.2byte	0x357
-	.4byte	0x13e22
+	.2byte	0x359
+	.4byte	0x13e48
 	.uleb128 0x54
-	.4byte	0x1316a
+	.4byte	0x13190
 	.uleb128 0x54
-	.4byte	0x1315f
+	.4byte	0x13185
 	.uleb128 0x54
-	.4byte	0x13154
+	.4byte	0x1317a
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13144
+	.4byte	0x1316a
 	.8byte	.LBB1282
 	.4byte	.Ldebug_ranges0+0x880
 	.byte	0x1
-	.2byte	0x358
-	.4byte	0x13e4a
+	.2byte	0x35a
+	.4byte	0x13e70
 	.uleb128 0x54
-	.4byte	0x1316a
+	.4byte	0x13190
 	.uleb128 0x54
-	.4byte	0x1315f
+	.4byte	0x13185
 	.uleb128 0x54
-	.4byte	0x13154
+	.4byte	0x1317a
 	.byte	0
 	.uleb128 0x5f
-	.4byte	0x13144
+	.4byte	0x1316a
 	.8byte	.LBB1294
 	.4byte	.Ldebug_ranges0+0x8f0
 	.byte	0x1
-	.2byte	0x359
+	.2byte	0x35b
 	.uleb128 0x54
-	.4byte	0x1316a
+	.4byte	0x13190
 	.uleb128 0x54
-	.4byte	0x1315f
+	.4byte	0x13185
 	.uleb128 0x54
-	.4byte	0x13154
+	.4byte	0x1317a
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x126e0
+	.4byte	0x12706
 	.8byte	.LFB2818
 	.8byte	.LFE2818-.LFB2818
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x141a7
+	.4byte	0x141cd
 	.uleb128 0x71
-	.4byte	0x126ed
+	.4byte	0x12713
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x126f9
+	.4byte	0x1271f
 	.4byte	.LLST118
 	.uleb128 0x6f
-	.4byte	0x12705
+	.4byte	0x1272b
 	.4byte	.LLST119
 	.uleb128 0x6f
-	.4byte	0x12711
+	.4byte	0x12737
 	.4byte	.LLST120
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x940
-	.4byte	0x1408c
+	.4byte	0x140b2
 	.uleb128 0x54
-	.4byte	0x12711
+	.4byte	0x12737
 	.uleb128 0x54
-	.4byte	0x12705
+	.4byte	0x1272b
 	.uleb128 0x54
-	.4byte	0x126f9
+	.4byte	0x1271f
 	.uleb128 0x54
-	.4byte	0x126ed
+	.4byte	0x12713
 	.uleb128 0x5f
-	.4byte	0x1271e
+	.4byte	0x12744
 	.8byte	.LBB1330
 	.4byte	.Ldebug_ranges0+0x940
 	.byte	0x1
-	.2byte	0x3e6
+	.2byte	0x3e8
 	.uleb128 0x54
-	.4byte	0x1274f
+	.4byte	0x12775
 	.uleb128 0x54
-	.4byte	0x1274f
+	.4byte	0x12775
 	.uleb128 0x54
-	.4byte	0x1274f
+	.4byte	0x12775
 	.uleb128 0x54
-	.4byte	0x12743
+	.4byte	0x12769
 	.uleb128 0x54
-	.4byte	0x12737
+	.4byte	0x1275d
 	.uleb128 0x54
-	.4byte	0x1272b
+	.4byte	0x12751
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x940
 	.uleb128 0x57
-	.4byte	0x1275b
+	.4byte	0x12781
 	.uleb128 0x60
-	.4byte	0x12767
+	.4byte	0x1278d
 	.4byte	.LLST121
 	.uleb128 0x60
-	.4byte	0x12773
+	.4byte	0x12799
 	.4byte	.LLST122
 	.uleb128 0x60
-	.4byte	0x1277f
+	.4byte	0x127a5
 	.4byte	.LLST123
 	.uleb128 0x60
-	.4byte	0x1278b
+	.4byte	0x127b1
 	.4byte	.LLST124
 	.uleb128 0x60
-	.4byte	0x12797
+	.4byte	0x127bd
 	.4byte	.LLST125
 	.uleb128 0x60
-	.4byte	0x127a3
+	.4byte	0x127c9
 	.4byte	.LLST126
 	.uleb128 0x60
-	.4byte	0x127af
+	.4byte	0x127d5
 	.4byte	.LLST127
 	.uleb128 0x60
-	.4byte	0x127bb
+	.4byte	0x127e1
 	.4byte	.LLST128
 	.uleb128 0x57
-	.4byte	0x127c5
+	.4byte	0x127eb
 	.uleb128 0x60
-	.4byte	0x127cf
+	.4byte	0x127f5
 	.4byte	.LLST129
 	.uleb128 0x60
-	.4byte	0x127db
+	.4byte	0x12801
 	.4byte	.LLST130
 	.uleb128 0x57
-	.4byte	0x127e7
+	.4byte	0x1280d
 	.uleb128 0x5b
-	.4byte	0x130fc
+	.4byte	0x13122
 	.8byte	.LBB1332
 	.4byte	.Ldebug_ranges0+0x970
 	.byte	0x1
-	.2byte	0x3d7
-	.4byte	0x13fa9
+	.2byte	0x3d9
+	.4byte	0x13fcf
 	.uleb128 0x54
-	.4byte	0x13122
+	.4byte	0x13148
 	.uleb128 0x54
-	.4byte	0x13117
+	.4byte	0x1313d
 	.uleb128 0x54
-	.4byte	0x1310c
+	.4byte	0x13132
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x970
 	.uleb128 0x57
-	.4byte	0x1312d
+	.4byte	0x13153
 	.uleb128 0x60
-	.4byte	0x13138
+	.4byte	0x1315e
 	.4byte	.LLST131
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x130fc
+	.4byte	0x13122
 	.8byte	.LBB1335
 	.8byte	.LBE1335-.LBB1335
 	.byte	0x1
-	.2byte	0x3d4
-	.4byte	0x13ff5
+	.2byte	0x3d6
+	.4byte	0x1401b
 	.uleb128 0x54
-	.4byte	0x13122
+	.4byte	0x13148
 	.uleb128 0x54
-	.4byte	0x13117
+	.4byte	0x1313d
 	.uleb128 0x54
-	.4byte	0x1310c
+	.4byte	0x13132
 	.uleb128 0x56
 	.8byte	.LBB1336
 	.8byte	.LBE1336-.LBB1336
 	.uleb128 0x57
-	.4byte	0x1312d
+	.4byte	0x13153
 	.uleb128 0x60
-	.4byte	0x13138
+	.4byte	0x1315e
 	.4byte	.LLST132
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x130fc
+	.4byte	0x13122
 	.8byte	.LBB1337
 	.8byte	.LBE1337-.LBB1337
 	.byte	0x1
-	.2byte	0x3d5
-	.4byte	0x14041
+	.2byte	0x3d7
+	.4byte	0x14067
 	.uleb128 0x54
-	.4byte	0x13122
+	.4byte	0x13148
 	.uleb128 0x54
-	.4byte	0x13117
+	.4byte	0x1313d
 	.uleb128 0x54
-	.4byte	0x1310c
+	.4byte	0x13132
 	.uleb128 0x56
 	.8byte	.LBB1338
 	.8byte	.LBE1338-.LBB1338
 	.uleb128 0x57
-	.4byte	0x1312d
+	.4byte	0x13153
 	.uleb128 0x60
-	.4byte	0x13138
+	.4byte	0x1315e
 	.4byte	.LLST133
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x130fc
+	.4byte	0x13122
 	.8byte	.LBB1339
 	.8byte	.LBE1339-.LBB1339
 	.byte	0x1
-	.2byte	0x3d6
+	.2byte	0x3d8
 	.uleb128 0x54
-	.4byte	0x13122
+	.4byte	0x13148
 	.uleb128 0x54
-	.4byte	0x13117
+	.4byte	0x1313d
 	.uleb128 0x54
-	.4byte	0x1310c
+	.4byte	0x13132
 	.uleb128 0x56
 	.8byte	.LBB1340
 	.8byte	.LBE1340-.LBB1340
 	.uleb128 0x57
-	.4byte	0x1312d
+	.4byte	0x13153
 	.uleb128 0x60
-	.4byte	0x13138
+	.4byte	0x1315e
 	.4byte	.LLST134
 	.byte	0
 	.byte	0
@@ -46403,102 +46448,102 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x127f4
+	.4byte	0x1281a
 	.8byte	.LBB1344
 	.8byte	.LBE1344-.LBB1344
 	.byte	0x1
-	.2byte	0x3e8
+	.2byte	0x3ea
 	.uleb128 0x54
-	.4byte	0x12825
+	.4byte	0x1284b
 	.uleb128 0x54
-	.4byte	0x12825
+	.4byte	0x1284b
 	.uleb128 0x54
-	.4byte	0x12825
+	.4byte	0x1284b
 	.uleb128 0x54
-	.4byte	0x12819
+	.4byte	0x1283f
 	.uleb128 0x54
-	.4byte	0x1280d
+	.4byte	0x12833
 	.uleb128 0x54
-	.4byte	0x12801
+	.4byte	0x12827
 	.uleb128 0x56
 	.8byte	.LBB1345
 	.8byte	.LBE1345-.LBB1345
 	.uleb128 0x57
-	.4byte	0x12831
+	.4byte	0x12857
 	.uleb128 0x57
-	.4byte	0x1283d
+	.4byte	0x12863
 	.uleb128 0x57
-	.4byte	0x12849
+	.4byte	0x1286f
 	.uleb128 0x61
-	.4byte	0x12855
+	.4byte	0x1287b
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x61
-	.4byte	0x12861
+	.4byte	0x12887
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x60
-	.4byte	0x1286d
+	.4byte	0x12893
 	.4byte	.LLST135
 	.uleb128 0x60
-	.4byte	0x12879
+	.4byte	0x1289f
 	.4byte	.LLST136
 	.uleb128 0x60
-	.4byte	0x12885
+	.4byte	0x128ab
 	.4byte	.LLST137
 	.uleb128 0x60
-	.4byte	0x12891
+	.4byte	0x128b7
 	.4byte	.LLST138
 	.uleb128 0x57
-	.4byte	0x1289b
+	.4byte	0x128c1
 	.uleb128 0x60
-	.4byte	0x128a5
+	.4byte	0x128cb
 	.4byte	.LLST139
 	.uleb128 0x60
-	.4byte	0x128b1
+	.4byte	0x128d7
 	.4byte	.LLST140
 	.uleb128 0x57
-	.4byte	0x128bd
+	.4byte	0x128e3
 	.uleb128 0x5b
-	.4byte	0x130fc
+	.4byte	0x13122
 	.8byte	.LBB1346
 	.4byte	.Ldebug_ranges0+0x9a0
 	.byte	0x1
-	.2byte	0x3ac
-	.4byte	0x1416c
+	.2byte	0x3ae
+	.4byte	0x14192
 	.uleb128 0x54
-	.4byte	0x13122
+	.4byte	0x13148
 	.uleb128 0x54
-	.4byte	0x13117
+	.4byte	0x1313d
 	.uleb128 0x54
-	.4byte	0x1310c
+	.4byte	0x13132
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x9a0
 	.uleb128 0x57
-	.4byte	0x1312d
+	.4byte	0x13153
 	.uleb128 0x60
-	.4byte	0x13138
+	.4byte	0x1315e
 	.4byte	.LLST141
 	.byte	0
 	.byte	0
 	.uleb128 0x5f
-	.4byte	0x130fc
+	.4byte	0x13122
 	.8byte	.LBB1353
 	.4byte	.Ldebug_ranges0+0xa10
 	.byte	0x1
-	.2byte	0x3ab
+	.2byte	0x3ad
 	.uleb128 0x54
-	.4byte	0x13122
+	.4byte	0x13148
 	.uleb128 0x54
-	.4byte	0x13117
+	.4byte	0x1313d
 	.uleb128 0x54
-	.4byte	0x1310c
+	.4byte	0x13132
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xa10
 	.uleb128 0x57
-	.4byte	0x1312d
+	.4byte	0x13153
 	.uleb128 0x60
-	.4byte	0x13138
+	.4byte	0x1315e
 	.4byte	.LLST142
 	.byte	0
 	.byte	0
@@ -46506,503 +46551,503 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x84
-	.4byte	0x126a8
+	.4byte	0x126ce
 	.8byte	.LFB2863
 	.8byte	.LFE2863-.LFB2863
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x142aa
+	.4byte	0x142d0
 	.uleb128 0x6f
-	.4byte	0x126b5
+	.4byte	0x126db
 	.4byte	.LLST143
 	.uleb128 0x54
-	.4byte	0x126c1
+	.4byte	0x126e7
 	.uleb128 0x57
-	.4byte	0x126cd
+	.4byte	0x126f3
 	.uleb128 0x5b
-	.4byte	0x1324e
+	.4byte	0x13274
 	.8byte	.LBB1369
 	.4byte	.Ldebug_ranges0+0xa70
 	.byte	0x1
-	.2byte	0x3ef
-	.4byte	0x14228
+	.2byte	0x3f1
+	.4byte	0x1424e
 	.uleb128 0x54
-	.4byte	0x1327f
+	.4byte	0x132a5
 	.uleb128 0x54
-	.4byte	0x13273
+	.4byte	0x13299
 	.uleb128 0x54
-	.4byte	0x13267
+	.4byte	0x1328d
 	.uleb128 0x54
-	.4byte	0x1325b
+	.4byte	0x13281
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xa70
 	.uleb128 0x57
-	.4byte	0x1328b
+	.4byte	0x132b1
 	.uleb128 0x5f
-	.4byte	0x13298
+	.4byte	0x132be
 	.8byte	.LBB1371
 	.4byte	.Ldebug_ranges0+0xac0
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x54
-	.4byte	0x132a9
+	.4byte	0x132cf
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x131c9
+	.4byte	0x131ef
 	.8byte	.LBB1380
 	.4byte	.Ldebug_ranges0+0xaf0
 	.byte	0x1
-	.2byte	0x3f0
-	.4byte	0x1425a
+	.2byte	0x3f2
+	.4byte	0x14280
 	.uleb128 0x54
-	.4byte	0x13202
+	.4byte	0x13228
 	.uleb128 0x54
-	.4byte	0x131f7
+	.4byte	0x1321d
 	.uleb128 0x54
-	.4byte	0x131ec
+	.4byte	0x13212
 	.uleb128 0x54
-	.4byte	0x131e1
+	.4byte	0x13207
 	.uleb128 0x54
-	.4byte	0x131d6
+	.4byte	0x131fc
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1319a
+	.4byte	0x131c0
 	.8byte	.LBB1386
 	.8byte	.LBE1386-.LBB1386
 	.byte	0x1
-	.2byte	0x3f1
-	.4byte	0x14286
+	.2byte	0x3f3
+	.4byte	0x142ac
 	.uleb128 0x54
-	.4byte	0x131bd
+	.4byte	0x131e3
 	.uleb128 0x54
-	.4byte	0x131b2
+	.4byte	0x131d8
 	.uleb128 0x54
-	.4byte	0x131a7
+	.4byte	0x131cd
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13176
+	.4byte	0x1319c
 	.8byte	.LBB1388
 	.8byte	.LBE1388-.LBB1388
 	.byte	0x1
-	.2byte	0x3f2
+	.2byte	0x3f4
 	.uleb128 0x54
-	.4byte	0x1318e
+	.4byte	0x131b4
 	.uleb128 0x54
-	.4byte	0x13183
+	.4byte	0x131a9
 	.byte	0
 	.byte	0
 	.uleb128 0x84
-	.4byte	0x130ca
+	.4byte	0x130f0
 	.8byte	.LFB2864
 	.8byte	.LFE2864-.LFB2864
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14368
+	.4byte	0x1438e
 	.uleb128 0x6f
-	.4byte	0x130da
+	.4byte	0x13100
 	.4byte	.LLST146
 	.uleb128 0x6f
-	.4byte	0x130e5
+	.4byte	0x1310b
 	.4byte	.LLST147
 	.uleb128 0x57
-	.4byte	0x130f0
+	.4byte	0x13116
 	.uleb128 0x70
-	.4byte	0x1320e
+	.4byte	0x13234
 	.8byte	.LBB1416
 	.8byte	.LBE1416-.LBB1416
 	.byte	0x1
 	.byte	0xc8
-	.4byte	0x142fe
+	.4byte	0x14324
 	.uleb128 0x54
-	.4byte	0x1321b
+	.4byte	0x13241
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x1339b
+	.4byte	0x133c1
 	.8byte	.LBB1418
 	.8byte	.LBE1418-.LBB1418
 	.byte	0x1
 	.byte	0xc9
-	.4byte	0x1431f
+	.4byte	0x14345
 	.uleb128 0x54
-	.4byte	0x133a8
+	.4byte	0x133ce
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x133cd
+	.4byte	0x133f3
 	.8byte	.LBB1420
 	.8byte	.LBE1420-.LBB1420
 	.byte	0x1
 	.byte	0xcc
-	.4byte	0x1434d
+	.4byte	0x14373
 	.uleb128 0x54
-	.4byte	0x133da
+	.4byte	0x13400
 	.uleb128 0x4e
 	.8byte	.LVL513
-	.4byte	0x146b0
+	.4byte	0x146d6
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL510
-	.4byte	0x14432
+	.4byte	0x14458
 	.uleb128 0x4e
 	.8byte	.LVL514
-	.4byte	0x14432
+	.4byte	0x14458
 	.byte	0
 	.uleb128 0x84
-	.4byte	0x130ca
+	.4byte	0x130f0
 	.8byte	.LFB2869
 	.8byte	.LFE2869-.LFB2869
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1441a
+	.4byte	0x14440
 	.uleb128 0x6f
-	.4byte	0x130da
+	.4byte	0x13100
 	.4byte	.LLST174
 	.uleb128 0x57
-	.4byte	0x130f0
+	.4byte	0x13116
 	.uleb128 0x54
-	.4byte	0x130e5
+	.4byte	0x1310b
 	.uleb128 0x70
-	.4byte	0x133b4
+	.4byte	0x133da
 	.8byte	.LBB1763
 	.8byte	.LBE1763-.LBB1763
 	.byte	0x1
 	.byte	0xc1
-	.4byte	0x143b8
+	.4byte	0x143de
 	.uleb128 0x54
-	.4byte	0x133c1
+	.4byte	0x133e7
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13227
+	.4byte	0x1324d
 	.8byte	.LBB1765
 	.8byte	.LBE1765-.LBB1765
 	.byte	0x1
 	.byte	0xc2
-	.4byte	0x143de
+	.4byte	0x14404
 	.uleb128 0x54
-	.4byte	0x13242
+	.4byte	0x13268
 	.uleb128 0x54
-	.4byte	0x13237
+	.4byte	0x1325d
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x133ec
+	.4byte	0x13412
 	.8byte	.LBB1767
 	.8byte	.LBE1767-.LBB1767
 	.byte	0x1
 	.byte	0xbe
-	.4byte	0x1440c
+	.4byte	0x14432
 	.uleb128 0x54
-	.4byte	0x133f9
+	.4byte	0x1341f
 	.uleb128 0x4e
 	.8byte	.LVL713
-	.4byte	0x14727
+	.4byte	0x1474d
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL710
-	.4byte	0x14432
+	.4byte	0x14458
 	.byte	0
 	.uleb128 0x85
-	.4byte	.LASF3234
-	.4byte	.LASF3234
+	.4byte	.LASF3236
+	.4byte	.LASF3236
 	.byte	0xbe
 	.byte	0xcc
 	.uleb128 0x85
-	.4byte	.LASF3235
-	.4byte	.LASF3235
+	.4byte	.LASF3237
+	.4byte	.LASF3237
 	.byte	0xbe
 	.byte	0xca
 	.uleb128 0x86
-	.4byte	.LASF3236
-	.4byte	.LASF3236
+	.4byte	.LASF3238
+	.4byte	.LASF3238
 	.byte	0x2
 	.2byte	0x5d1
 	.uleb128 0x85
-	.4byte	.LASF3237
-	.4byte	.LASF3237
+	.4byte	.LASF3239
+	.4byte	.LASF3239
 	.byte	0xac
 	.byte	0x4f
 	.uleb128 0x86
-	.4byte	.LASF3238
-	.4byte	.LASF3238
+	.4byte	.LASF3240
+	.4byte	.LASF3240
 	.byte	0x2
 	.2byte	0x2bf
 	.uleb128 0x86
-	.4byte	.LASF3239
-	.4byte	.LASF3239
+	.4byte	.LASF3241
+	.4byte	.LASF3241
 	.byte	0xe
 	.2byte	0x149
 	.uleb128 0x86
-	.4byte	.LASF3240
-	.4byte	.LASF3240
+	.4byte	.LASF3242
+	.4byte	.LASF3242
 	.byte	0xe
 	.2byte	0x172
 	.uleb128 0x85
-	.4byte	.LASF3241
-	.4byte	.LASF3241
+	.4byte	.LASF3243
+	.4byte	.LASF3243
 	.byte	0xd4
 	.byte	0x78
 	.uleb128 0x85
-	.4byte	.LASF3242
-	.4byte	.LASF3242
+	.4byte	.LASF3244
+	.4byte	.LASF3244
 	.byte	0xaa
 	.byte	0x59
 	.uleb128 0x85
-	.4byte	.LASF3243
-	.4byte	.LASF3243
+	.4byte	.LASF3245
+	.4byte	.LASF3245
 	.byte	0xc3
 	.byte	0x30
 	.uleb128 0x87
-	.4byte	.LASF3244
-	.4byte	.LASF3244
+	.4byte	.LASF3246
+	.4byte	.LASF3246
 	.uleb128 0x85
-	.4byte	.LASF3244
-	.4byte	.LASF3244
+	.4byte	.LASF3246
+	.4byte	.LASF3246
 	.byte	0xd5
 	.byte	0x36
 	.uleb128 0x86
-	.4byte	.LASF3245
-	.4byte	.LASF3245
+	.4byte	.LASF3247
+	.4byte	.LASF3247
 	.byte	0x2
 	.2byte	0x5cb
 	.uleb128 0x85
-	.4byte	.LASF3246
-	.4byte	.LASF3246
+	.4byte	.LASF3248
+	.4byte	.LASF3248
 	.byte	0xc2
 	.byte	0x30
 	.uleb128 0x85
-	.4byte	.LASF3247
-	.4byte	.LASF3247
+	.4byte	.LASF3249
+	.4byte	.LASF3249
 	.byte	0xc2
 	.byte	0x31
 	.uleb128 0x85
-	.4byte	.LASF3248
-	.4byte	.LASF3248
+	.4byte	.LASF3250
+	.4byte	.LASF3250
 	.byte	0xab
 	.byte	0x9
 	.uleb128 0x86
-	.4byte	.LASF3249
-	.4byte	.LASF3249
+	.4byte	.LASF3251
+	.4byte	.LASF3251
 	.byte	0x48
 	.2byte	0x6b8
 	.uleb128 0x86
-	.4byte	.LASF3250
-	.4byte	.LASF3250
+	.4byte	.LASF3252
+	.4byte	.LASF3252
 	.byte	0x48
 	.2byte	0x676
 	.uleb128 0x85
-	.4byte	.LASF3251
-	.4byte	.LASF3251
+	.4byte	.LASF3253
+	.4byte	.LASF3253
 	.byte	0x9c
 	.byte	0x67
 	.uleb128 0x85
-	.4byte	.LASF3252
-	.4byte	.LASF3252
+	.4byte	.LASF3254
+	.4byte	.LASF3254
 	.byte	0x54
 	.byte	0x53
 	.uleb128 0x85
-	.4byte	.LASF3253
-	.4byte	.LASF3253
+	.4byte	.LASF3255
+	.4byte	.LASF3255
 	.byte	0x54
 	.byte	0xa5
 	.uleb128 0x85
-	.4byte	.LASF3254
-	.4byte	.LASF3254
+	.4byte	.LASF3256
+	.4byte	.LASF3256
 	.byte	0xc3
 	.byte	0x2b
 	.uleb128 0x85
-	.4byte	.LASF3255
-	.4byte	.LASF3255
+	.4byte	.LASF3257
+	.4byte	.LASF3257
 	.byte	0xc3
 	.byte	0x27
 	.uleb128 0x86
-	.4byte	.LASF3256
-	.4byte	.LASF3256
+	.4byte	.LASF3258
+	.4byte	.LASF3258
 	.byte	0x12
 	.2byte	0x184
 	.uleb128 0x85
-	.4byte	.LASF3257
-	.4byte	.LASF3257
+	.4byte	.LASF3259
+	.4byte	.LASF3259
 	.byte	0xd6
 	.byte	0x51
 	.uleb128 0x86
-	.4byte	.LASF3258
-	.4byte	.LASF3258
+	.4byte	.LASF3260
+	.4byte	.LASF3260
 	.byte	0x20
 	.2byte	0x1d9
 	.uleb128 0x85
-	.4byte	.LASF3259
-	.4byte	.LASF3259
+	.4byte	.LASF3261
+	.4byte	.LASF3261
 	.byte	0x3
 	.byte	0x3b
 	.uleb128 0x85
-	.4byte	.LASF3260
-	.4byte	.LASF3260
+	.4byte	.LASF3262
+	.4byte	.LASF3262
 	.byte	0x12
 	.byte	0xb9
 	.uleb128 0x85
-	.4byte	.LASF3261
-	.4byte	.LASF3261
+	.4byte	.LASF3263
+	.4byte	.LASF3263
 	.byte	0x3a
 	.byte	0xc2
 	.uleb128 0x87
-	.4byte	.LASF3262
-	.4byte	.LASF3262
+	.4byte	.LASF3264
+	.4byte	.LASF3264
 	.uleb128 0x85
-	.4byte	.LASF3263
-	.4byte	.LASF3263
+	.4byte	.LASF3265
+	.4byte	.LASF3265
 	.byte	0xac
 	.byte	0x4e
 	.uleb128 0x86
-	.4byte	.LASF3264
-	.4byte	.LASF3264
+	.4byte	.LASF3266
+	.4byte	.LASF3266
 	.byte	0x2
 	.2byte	0x287
 	.uleb128 0x85
-	.4byte	.LASF3265
-	.4byte	.LASF3265
+	.4byte	.LASF3267
+	.4byte	.LASF3267
 	.byte	0xbf
 	.byte	0x38
 	.uleb128 0x86
-	.4byte	.LASF3266
-	.4byte	.LASF3266
+	.4byte	.LASF3268
+	.4byte	.LASF3268
 	.byte	0xe
 	.2byte	0x165
 	.uleb128 0x86
-	.4byte	.LASF3267
-	.4byte	.LASF3267
+	.4byte	.LASF3269
+	.4byte	.LASF3269
 	.byte	0xa3
 	.2byte	0x37b
 	.uleb128 0x86
-	.4byte	.LASF3268
-	.4byte	.LASF3268
+	.4byte	.LASF3270
+	.4byte	.LASF3270
 	.byte	0xe
 	.2byte	0x125
 	.uleb128 0x87
-	.4byte	.LASF3269
-	.4byte	.LASF3269
+	.4byte	.LASF3271
+	.4byte	.LASF3271
 	.uleb128 0x85
-	.4byte	.LASF3270
-	.4byte	.LASF3270
+	.4byte	.LASF3272
+	.4byte	.LASF3272
 	.byte	0xc3
 	.byte	0x2e
 	.uleb128 0x86
-	.4byte	.LASF3271
-	.4byte	.LASF3271
+	.4byte	.LASF3273
+	.4byte	.LASF3273
 	.byte	0x20
 	.2byte	0x1c7
 	.uleb128 0x86
-	.4byte	.LASF3272
-	.4byte	.LASF3272
+	.4byte	.LASF3274
+	.4byte	.LASF3274
 	.byte	0x20
 	.2byte	0x17e
 	.uleb128 0x85
-	.4byte	.LASF3273
-	.4byte	.LASF3273
+	.4byte	.LASF3275
+	.4byte	.LASF3275
 	.byte	0x3
 	.byte	0x3a
 	.uleb128 0x85
-	.4byte	.LASF3274
-	.4byte	.LASF3274
+	.4byte	.LASF3276
+	.4byte	.LASF3276
 	.byte	0xc2
 	.byte	0x32
 	.uleb128 0x86
-	.4byte	.LASF3275
-	.4byte	.LASF3275
+	.4byte	.LASF3277
+	.4byte	.LASF3277
 	.byte	0x76
 	.2byte	0xa07
 	.uleb128 0x85
-	.4byte	.LASF3276
-	.4byte	.LASF3276
+	.4byte	.LASF3278
+	.4byte	.LASF3278
 	.byte	0xc3
 	.byte	0x2c
 	.uleb128 0x85
-	.4byte	.LASF3277
-	.4byte	.LASF3277
+	.4byte	.LASF3279
+	.4byte	.LASF3279
 	.byte	0x48
 	.byte	0xdc
 	.uleb128 0x86
-	.4byte	.LASF3278
-	.4byte	.LASF3278
+	.4byte	.LASF3280
+	.4byte	.LASF3280
 	.byte	0x3a
 	.2byte	0x459
 	.uleb128 0x85
-	.4byte	.LASF3279
-	.4byte	.LASF3279
+	.4byte	.LASF3281
+	.4byte	.LASF3281
 	.byte	0x3a
 	.byte	0xe9
 	.uleb128 0x86
-	.4byte	.LASF3280
-	.4byte	.LASF3280
+	.4byte	.LASF3282
+	.4byte	.LASF3282
 	.byte	0x3a
 	.2byte	0x45a
 	.uleb128 0x86
-	.4byte	.LASF3281
-	.4byte	.LASF3281
+	.4byte	.LASF3283
+	.4byte	.LASF3283
 	.byte	0x6
 	.2byte	0x19f
 	.uleb128 0x86
-	.4byte	.LASF3282
-	.4byte	.LASF3282
-	.byte	0x6
-	.2byte	0x199
-	.uleb128 0x85
-	.4byte	.LASF3283
-	.4byte	.LASF3283
-	.byte	0xc3
-	.byte	0x25
-	.uleb128 0x85
 	.4byte	.LASF3284
 	.4byte	.LASF3284
-	.byte	0xc3
-	.byte	0x2a
+	.byte	0x6
+	.2byte	0x199
 	.uleb128 0x85
 	.4byte	.LASF3285
 	.4byte	.LASF3285
 	.byte	0xc3
-	.byte	0x24
+	.byte	0x25
 	.uleb128 0x85
 	.4byte	.LASF3286
 	.4byte	.LASF3286
 	.byte	0xc3
-	.byte	0x23
+	.byte	0x2a
 	.uleb128 0x85
 	.4byte	.LASF3287
 	.4byte	.LASF3287
-	.byte	0x9c
-	.byte	0x73
+	.byte	0xc3
+	.byte	0x24
 	.uleb128 0x85
 	.4byte	.LASF3288
 	.4byte	.LASF3288
 	.byte	0xc3
-	.byte	0x29
+	.byte	0x23
 	.uleb128 0x85
 	.4byte	.LASF3289
 	.4byte	.LASF3289
-	.byte	0x72
-	.byte	0x88
+	.byte	0x9c
+	.byte	0x73
 	.uleb128 0x85
 	.4byte	.LASF3290
 	.4byte	.LASF3290
-	.byte	0x72
-	.byte	0x98
+	.byte	0xc3
+	.byte	0x29
 	.uleb128 0x85
 	.4byte	.LASF3291
 	.4byte	.LASF3291
-	.byte	0xc3
-	.byte	0x26
+	.byte	0x72
+	.byte	0x88
 	.uleb128 0x85
 	.4byte	.LASF3292
 	.4byte	.LASF3292
-	.byte	0xc4
-	.byte	0x68
+	.byte	0xc3
+	.byte	0x26
 	.uleb128 0x85
 	.4byte	.LASF3293
 	.4byte	.LASF3293
+	.byte	0x72
+	.byte	0x98
+	.uleb128 0x85
+	.4byte	.LASF3294
+	.4byte	.LASF3294
+	.byte	0xc4
+	.byte	0x6a
+	.uleb128 0x85
+	.4byte	.LASF3295
+	.4byte	.LASF3295
 	.byte	0xc2
 	.byte	0x33
 	.uleb128 0x86
-	.4byte	.LASF3294
-	.4byte	.LASF3294
+	.4byte	.LASF3296
+	.4byte	.LASF3296
 	.byte	0xd
 	.2byte	0x1d6
 	.uleb128 0x88
@@ -47011,13 +47056,13 @@ __exitcall_ebc_exit:
 	.byte	0x78
 	.byte	0x2c
 	.uleb128 0x85
-	.4byte	.LASF3295
-	.4byte	.LASF3295
+	.4byte	.LASF3297
+	.4byte	.LASF3297
 	.byte	0x78
 	.byte	0x27
 	.uleb128 0x85
-	.4byte	.LASF3296
-	.4byte	.LASF3296
+	.4byte	.LASF3298
+	.4byte	.LASF3298
 	.byte	0x9c
 	.byte	0x71
 	.byte	0
@@ -50385,17 +50430,17 @@ __exitcall_ebc_exit:
 	.8byte	0
 .LLST188:
 	.8byte	.LVL759
-	.8byte	.LVL761
+	.8byte	.LVL760
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST189:
-	.8byte	.LVL760
-	.8byte	.LVL776
+	.8byte	.LVL761
+	.8byte	.LVL795
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL780
+	.8byte	.LVL798
 	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x64
@@ -50403,72 +50448,80 @@ __exitcall_ebc_exit:
 	.8byte	0
 .LLST190:
 	.8byte	.LVL763
-	.8byte	.LVL779
+	.8byte	.LVL789
 	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL780
-	.8byte	.LVL781
+	.byte	0x68
+	.8byte	.LVL789
+	.8byte	.LVL790
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL781
-	.8byte	.LVL792
+	.8byte	.LVL790
+	.8byte	.LVL796
 	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL792
-	.8byte	.LVL793
+	.byte	0x68
+	.8byte	.LVL798
+	.8byte	.LVL805
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL805
+	.8byte	.LVL806
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL793
-	.8byte	.LVL798
+	.8byte	.LVL806
+	.8byte	.LVL824
 	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL798
-	.8byte	.LVL799
+	.byte	0x68
+	.8byte	.LVL824
+	.8byte	.LVL825
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL799
-	.8byte	.LVL820
+	.8byte	.LVL825
+	.8byte	.LVL836
 	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL820
-	.8byte	.LVL821
+	.byte	0x68
+	.8byte	.LVL836
+	.8byte	.LVL837
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL821
-	.8byte	.LVL878
+	.8byte	.LVL837
+	.8byte	.LVL892
 	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL878
-	.8byte	.LVL879
+	.byte	0x68
+	.8byte	.LVL892
+	.8byte	.LVL893
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL879
+	.8byte	.LVL893
 	.8byte	.LFE2826
 	.2byte	0x1
-	.byte	0x6c
+	.byte	0x68
 	.8byte	0
 	.8byte	0
 .LLST191:
-	.8byte	.LVL800
-	.8byte	.LVL801-1
+	.8byte	.LVL812
+	.8byte	.LVL814-1
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL810
-	.8byte	.LVL811-1
+	.byte	0x58
+	.8byte	.LVL823
+	.8byte	.LVL824
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL859
-	.8byte	.LVL860-1
+	.byte	0x58
+	.8byte	.LVL825
+	.8byte	.LVL826-1
 	.2byte	0x1
-	.byte	0x57
+	.byte	0x58
+	.8byte	.LVL861
+	.8byte	.LVL862-1
+	.2byte	0x1
+	.byte	0x58
 	.8byte	0
 	.8byte	0
 .LLST192:
 	.8byte	.LVL762
-	.8byte	.LVL777
+	.8byte	.LVL796
 	.2byte	0x1
 	.byte	0x67
-	.8byte	.LVL780
+	.8byte	.LVL798
 	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x67
@@ -50479,300 +50532,316 @@ __exitcall_ebc_exit:
 	.8byte	.LVL778
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL780
-	.8byte	.LVL840
+	.8byte	.LVL782
+	.8byte	.LVL785
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL844
-	.8byte	.LVL847
+	.8byte	.LVL789
+	.8byte	.LVL797
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL852
-	.8byte	.LVL889
+	.8byte	.LVL798
+	.8byte	.LVL879
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL900
+	.8byte	.LVL883
+	.8byte	.LVL886
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL887
 	.8byte	.LVL903
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL904
+	.8byte	.LVL909
 	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
 .LLST207:
-	.8byte	.LVL870
-	.8byte	.LVL871
+	.8byte	.LVL875
+	.8byte	.LVL876
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL891
-	.8byte	.LVL892-1
+	.8byte	.LVL905
+	.8byte	.LVL906-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST206:
-	.8byte	.LVL856
-	.8byte	.LVL857
+	.8byte	.LVL867
+	.8byte	.LVL868
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL884
-	.8byte	.LVL885-1
+	.8byte	.LVL898
+	.8byte	.LVL899-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST195:
-	.8byte	.LVL782
-	.8byte	.LVL783
+.LLST205:
+	.8byte	.LVL791
+	.8byte	.LVL792
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL815
-	.8byte	.LVL816-1
+	.8byte	.LVL831
+	.8byte	.LVL832-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST194:
-	.8byte	.LVL763
-	.8byte	.LVL764
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL784
-	.8byte	.LVL785
+	.8byte	.LVL793
+	.8byte	.LVL794
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL787
-	.8byte	.LVL788-1
+	.8byte	.LVL800
+	.8byte	.LVL801-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST196:
-	.8byte	.LVL835
-	.8byte	.LVL852
+.LLST195:
+	.8byte	.LVL773
+	.8byte	.LVL789
 	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL895
-	.8byte	.LVL901-1
+	.byte	0x61
+	.8byte	.LVL879
+	.8byte	.LVL884-1
 	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL903
-	.8byte	.LVL904
+	.byte	0x61
+	.8byte	.LVL886
+	.8byte	.LVL887
 	.2byte	0x1
-	.byte	0x60
+	.byte	0x61
 	.8byte	0
 	.8byte	0
-.LLST197:
-	.8byte	.LVL840
-	.8byte	.LVL843
+.LLST196:
+	.8byte	.LVL778
+	.8byte	.LVL781
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL849
-	.8byte	.LVL852
+	.8byte	.LVL786
+	.8byte	.LVL789
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL895
-	.8byte	.LVL898
+	.8byte	.LVL879
+	.8byte	.LVL881
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL903
-	.8byte	.LVL904
+	.8byte	.LVL886
+	.8byte	.LVL887
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST198:
+.LLST197:
 	.8byte	.LVL763
-	.8byte	.LVL767
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL774
 	.8byte	.LVL778
 	.2byte	0x1
-	.byte	0x69
+	.byte	0x6a
 	.8byte	.LVL780
-	.8byte	.LVL791
+	.8byte	.LVL785
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL789
+	.8byte	.LVL797
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL798
+	.8byte	.LVL813
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL815
+	.8byte	.LVL825
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL828
+	.8byte	.LVL861
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL870
+	.8byte	.LVL879
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL880
+	.8byte	.LVL886
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL887
+	.8byte	.LVL896
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL902
+	.8byte	.LVL903
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL909
+	.8byte	.LFE2826
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST198:
+	.8byte	.LVL777
+	.8byte	.LVL779
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL780
+	.8byte	.LVL789
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL883
+	.8byte	.LVL884-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL886
+	.8byte	.LVL887
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST199:
+	.8byte	.LVL763
+	.8byte	.LVL766
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL792
-	.8byte	.LVL793
+	.8byte	.LVL777
+	.8byte	.LVL787
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL795
-	.8byte	.LVL799
+	.8byte	.LVL788
+	.8byte	.LVL797
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL802
-	.8byte	.LVL803
+	.8byte	.LVL798
+	.8byte	.LVL804
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL807
-	.8byte	.LVL809
+	.8byte	.LVL805
+	.8byte	.LVL806
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL813
-	.8byte	.LVL822
+	.8byte	.LVL808
+	.8byte	.LVL811
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL839
-	.8byte	.LVL840
+	.8byte	.LVL815
+	.8byte	.LVL816
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL842
-	.8byte	.LVL848
+	.8byte	.LVL820
+	.8byte	.LVL822
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL865
-	.8byte	.LVL868
+	.8byte	.LVL824
+	.8byte	.LVL825
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL873
-	.8byte	.LVL874
+	.8byte	.LVL828
+	.8byte	.LVL838
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL878
-	.8byte	.LVL882
+	.8byte	.LVL852
+	.8byte	.LVL855
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL897
-	.8byte	.LVL903
+	.8byte	.LVL879
+	.8byte	.LVL888
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL906
-	.8byte	.LVL908
+	.8byte	.LVL892
+	.8byte	.LVL896
 	.2byte	0x1
 	.byte	0x69
+	.8byte	.LVL909
 	.8byte	.LVL912
-	.8byte	.LVL914
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL916
+	.8byte	.LVL914
 	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST199:
-	.8byte	.LVL839
-	.8byte	.LVL841
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL842
-	.8byte	.LVL852
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL895
-	.8byte	.LVL896
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL900
-	.8byte	.LVL901-1
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL903
-	.8byte	.LVL904
-	.2byte	0x1
-	.byte	0x52
-	.8byte	0
-	.8byte	0
 .LLST200:
-	.8byte	.LVL839
-	.8byte	.LVL850
-	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL851
-	.8byte	.LVL852
-	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL895
-	.8byte	.LVL901-1
-	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL903
-	.8byte	.LVL904
-	.2byte	0x1
-	.byte	0x62
-	.8byte	0
-	.8byte	0
-.LLST201:
-	.8byte	.LVL839
-	.8byte	.LVL840
+	.8byte	.LVL777
+	.8byte	.LVL778
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL843
-	.8byte	.LVL845
+	.8byte	.LVL781
+	.8byte	.LVL783
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL845
-	.8byte	.LVL846
+	.8byte	.LVL783
+	.8byte	.LVL784
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL899
-	.8byte	.LVL901-1
+	.8byte	.LVL882
+	.8byte	.LVL884-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST202:
-	.8byte	.LVL838
-	.8byte	.LVL852
+.LLST201:
+	.8byte	.LVL776
+	.8byte	.LVL789
 	.2byte	0x1
-	.byte	0x5f
-	.8byte	.LVL895
-	.8byte	.LVL901-1
+	.byte	0x60
+	.8byte	.LVL879
+	.8byte	.LVL884-1
 	.2byte	0x1
-	.byte	0x5f
-	.8byte	.LVL903
-	.8byte	.LVL904
+	.byte	0x60
+	.8byte	.LVL886
+	.8byte	.LVL887
 	.2byte	0x1
-	.byte	0x5f
+	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST203:
-	.8byte	.LVL836
-	.8byte	.LVL852
+.LLST202:
+	.8byte	.LVL774
+	.8byte	.LVL789
 	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL895
-	.8byte	.LVL901-1
+	.byte	0x59
+	.8byte	.LVL879
+	.8byte	.LVL884-1
 	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL903
-	.8byte	.LVL904
+	.byte	0x59
+	.8byte	.LVL886
+	.8byte	.LVL887
 	.2byte	0x1
-	.byte	0x58
+	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST204:
-	.8byte	.LVL838
-	.8byte	.LVL852
+.LLST203:
+	.8byte	.LVL776
+	.8byte	.LVL789
 	.2byte	0x1
-	.byte	0x5e
-	.8byte	.LVL895
-	.8byte	.LVL901-1
+	.byte	0x5f
+	.8byte	.LVL879
+	.8byte	.LVL884-1
 	.2byte	0x1
-	.byte	0x5e
-	.8byte	.LVL903
-	.8byte	.LVL904
+	.byte	0x5f
+	.8byte	.LVL886
+	.8byte	.LVL887
 	.2byte	0x1
-	.byte	0x5e
+	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST205:
-	.8byte	.LVL837
-	.8byte	.LVL852
+.LLST204:
+	.8byte	.LVL775
+	.8byte	.LVL789
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL895
-	.8byte	.LVL901-1
+	.byte	0x62
+	.8byte	.LVL879
+	.8byte	.LVL884-1
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL903
-	.8byte	.LVL904
+	.byte	0x62
+	.8byte	.LVL886
+	.8byte	.LVL887
 	.2byte	0x1
-	.byte	0x61
+	.byte	0x62
 	.8byte	0
 	.8byte	0
 .LLST75:
@@ -52228,8 +52297,8 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1791
 	.8byte	.LBB1798
 	.8byte	.LBE1798
-	.8byte	.LBB1799
-	.8byte	.LBE1799
+	.8byte	.LBB1807
+	.8byte	.LBE1807
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1793
@@ -52240,30 +52309,30 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1795
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1800
-	.8byte	.LBE1800
-	.8byte	.LBB1804
-	.8byte	.LBE1804
+	.8byte	.LBB1799
+	.8byte	.LBE1799
 	.8byte	.LBB1805
 	.8byte	.LBE1805
+	.8byte	.LBB1806
+	.8byte	.LBE1806
+	.8byte	.LBB1827
+	.8byte	.LBE1827
+	.8byte	.LBB1828
+	.8byte	.LBE1828
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1811
-	.8byte	.LBE1811
-	.8byte	.LBB1817
-	.8byte	.LBE1817
-	.8byte	.LBB1818
-	.8byte	.LBE1818
-	.8byte	.LBB1829
-	.8byte	.LBE1829
-	.8byte	.LBB1830
-	.8byte	.LBE1830
+	.8byte	.LBB1808
+	.8byte	.LBE1808
+	.8byte	.LBB1812
+	.8byte	.LBE1812
+	.8byte	.LBB1813
+	.8byte	.LBE1813
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1819
 	.8byte	.LBE1819
-	.8byte	.LBB1827
-	.8byte	.LBE1827
+	.8byte	.LBB1829
+	.8byte	.LBE1829
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1821
@@ -52274,8 +52343,8 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	.LBB1823
 	.8byte	.LBE1823
-	.8byte	.LBB1828
-	.8byte	.LBE1828
+	.8byte	.LBB1830
+	.8byte	.LBE1830
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1825
@@ -52313,7 +52382,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_REQ_IDLE"
 .LASF2381:
 	.string	"suppliers"
-.LASF3048:
+.LASF3050:
 	.string	"ebc_buffer_manage_init"
 .LASF2880:
 	.string	"EPD_FULL_GCC16"
@@ -52325,7 +52394,7 @@ __exitcall_ebc_exit:
 	.string	"PE_SIZE_PUD"
 .LASF2591:
 	.string	"__tracepoint_page_ref_mod"
-.LASF2973:
+.LASF2975:
 	.string	"full_mode_num"
 .LASF1043:
 	.string	"nr_wakeups"
@@ -52371,7 +52440,7 @@ __exitcall_ebc_exit:
 	.string	"dev_kobj"
 .LASF475:
 	.string	"d_release"
-.LASF3160:
+.LASF3162:
 	.string	"get_arch_dma_ops"
 .LASF305:
 	.string	"__ctors_start"
@@ -52379,11 +52448,11 @@ __exitcall_ebc_exit:
 	.string	"state"
 .LASF524:
 	.string	"s_d_op"
-.LASF2961:
+.LASF2963:
 	.string	"ebc_buffer_vir"
 .LASF909:
 	.string	"node_states"
-.LASF2905:
+.LASF2907:
 	.string	"pmic_power_req"
 .LASF901:
 	.string	"hrtimer_resolution"
@@ -52405,7 +52474,7 @@ __exitcall_ebc_exit:
 	.string	"si_code"
 .LASF649:
 	.string	"thread_node"
-.LASF3097:
+.LASF3099:
 	.string	"temperature"
 .LASF1302:
 	.string	"map_pages"
@@ -52439,15 +52508,15 @@ __exitcall_ebc_exit:
 	.string	"system_wq"
 .LASF604:
 	.string	"rcu_read_lock_nesting"
-.LASF2991:
+.LASF2993:
 	.string	"suspend_lock"
 .LASF2530:
 	.string	"gpio_desc"
 .LASF962:
 	.string	"list"
-.LASF3177:
+.LASF3179:
 	.string	"_copy_from_user"
-.LASF3203:
+.LASF3205:
 	.string	"get_order"
 .LASF945:
 	.string	"si_errno"
@@ -52471,7 +52540,7 @@ __exitcall_ebc_exit:
 	.string	"trace_events"
 .LASF1343:
 	.string	"env_start"
-.LASF2914:
+.LASF2916:
 	.string	"DMA_FROM_DEVICE"
 .LASF756:
 	.string	"cpu_number"
@@ -52481,7 +52550,7 @@ __exitcall_ebc_exit:
 	.string	"mm_rb"
 .LASF2187:
 	.string	"freeze_late"
-.LASF3069:
+.LASF3071:
 	.string	"buf_info"
 .LASF409:
 	.string	"d_inode"
@@ -52495,7 +52564,7 @@ __exitcall_ebc_exit:
 	.string	"locked"
 .LASF73:
 	.string	"exitcall_t"
-.LASF2946:
+.LASF2948:
 	.string	"regs"
 .LASF1037:
 	.string	"slice_max"
@@ -52505,7 +52574,7 @@ __exitcall_ebc_exit:
 	.string	"n_node"
 .LASF1624:
 	.string	"qsize_t"
-.LASF3200:
+.LASF3202:
 	.string	"devm_kzalloc"
 .LASF380:
 	.string	"sequence"
@@ -52521,7 +52590,7 @@ __exitcall_ebc_exit:
 	.string	"s_state"
 .LASF1066:
 	.string	"run_list"
-.LASF3117:
+.LASF3119:
 	.string	"clac_full_data_align8"
 .LASF2553:
 	.string	"SCHED_SOFTIRQ"
@@ -52543,7 +52612,7 @@ __exitcall_ebc_exit:
 	.string	"param_ops_uint"
 .LASF891:
 	.string	"softirq_activated"
-.LASF3032:
+.LASF3034:
 	.string	"pdev"
 .LASF827:
 	.string	"system_long_wq"
@@ -52567,7 +52636,7 @@ __exitcall_ebc_exit:
 	.string	"c_true"
 .LASF1578:
 	.string	"notifier_call"
-.LASF3076:
+.LASF3078:
 	.string	"ebc_exit"
 .LASF1833:
 	.string	"gendisk"
@@ -52575,6 +52644,8 @@ __exitcall_ebc_exit:
 	.string	"spc_timelimit"
 .LASF512:
 	.string	"s_instances"
+.LASF2896:
+	.string	"EPD_AUTO_DU"
 .LASF2736:
 	.string	"sh_size"
 .LASF772:
@@ -52593,7 +52664,7 @@ __exitcall_ebc_exit:
 	.string	"size_t"
 .LASF209:
 	.string	"compat_elf_hwcap"
-.LASF3278:
+.LASF3280:
 	.string	"prepare_to_wait_event"
 .LASF1110:
 	.string	"cap_permitted"
@@ -52635,7 +52706,7 @@ __exitcall_ebc_exit:
 	.string	"__reserved"
 .LASF940:
 	.string	"_sigfault"
-.LASF3131:
+.LASF3133:
 	.string	"image_bg"
 .LASF2858:
 	.string	"ebc_buf_status"
@@ -52675,7 +52746,7 @@ __exitcall_ebc_exit:
 	.string	"delayed_call"
 .LASF920:
 	.string	"_status"
-.LASF2903:
+.LASF2905:
 	.string	"pmic_name"
 .LASF1464:
 	.string	"NR_FREE_CMA_PAGES"
@@ -52687,11 +52758,11 @@ __exitcall_ebc_exit:
 	.string	"bin_attribute"
 .LASF1603:
 	.string	"percpu_counter"
-.LASF2993:
+.LASF2995:
 	.string	"first_in"
 .LASF2329:
 	.string	"dev_groups"
-.LASF2953:
+.LASF2955:
 	.string	"image_addr_set"
 .LASF301:
 	.string	"__softirqentry_text_start"
@@ -52725,9 +52796,9 @@ __exitcall_ebc_exit:
 	.string	"irqchip_fwnode_ops"
 .LASF1614:
 	.string	"dq_id"
-.LASF3122:
+.LASF3124:
 	.string	"frame_count_tmp"
-.LASF3130:
+.LASF3132:
 	.string	"image_fb"
 .LASF1789:
 	.string	"write_end"
@@ -52735,7 +52806,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ION_HEAP_POOL"
 .LASF1424:
 	.string	"sysctl_protected_hardlinks"
-.LASF3282:
+.LASF3284:
 	.string	"__arch_copy_from_user"
 .LASF1177:
 	.string	"scan_objects"
@@ -52743,7 +52814,7 @@ __exitcall_ebc_exit:
 	.string	"pageset"
 .LASF1238:
 	.string	"wb_err"
-.LASF3174:
+.LASF3176:
 	.string	"copy_to_user"
 .LASF735:
 	.string	"trace_recursion"
@@ -52757,7 +52828,7 @@ __exitcall_ebc_exit:
 	.string	"jit_keyring"
 .LASF169:
 	.string	"file_disp"
-.LASF2970:
+.LASF2972:
 	.string	"auto_need_refresh"
 .LASF2846:
 	.string	"WF_TYPE_GRAY2"
@@ -52835,11 +52906,11 @@ __exitcall_ebc_exit:
 	.string	"latch_tree_node"
 .LASF1155:
 	.string	"cad_pid"
-.LASF2942:
+.LASF2944:
 	.string	"lgonl"
 .LASF535:
 	.string	"destroy_work"
-.LASF3085:
+.LASF3087:
 	.string	"one_buffer_end"
 .LASF254:
 	.string	"FTR_LOWER_SAFE"
@@ -52855,7 +52926,7 @@ __exitcall_ebc_exit:
 	.string	"pcpu_chosen_fc"
 .LASF391:
 	.string	"dentry_stat_t"
-.LASF3228:
+.LASF3230:
 	.string	"atomic_add"
 .LASF1643:
 	.string	"dqi_bgrace"
@@ -52873,7 +52944,7 @@ __exitcall_ebc_exit:
 	.string	"ctl_table"
 .LASF44:
 	.string	"uid_t"
-.LASF3257:
+.LASF3259:
 	.string	"strstr"
 .LASF2848:
 	.string	"WF_TYPE_A2"
@@ -52893,7 +52964,7 @@ __exitcall_ebc_exit:
 	.string	"write"
 .LASF2595:
 	.string	"__tracepoint_page_ref_freeze"
-.LASF2932:
+.LASF2934:
 	.string	"panel_buffer"
 .LASF317:
 	.string	"__exception_text_end"
@@ -52935,7 +53006,7 @@ __exitcall_ebc_exit:
 	.string	"pteval_t"
 .LASF430:
 	.string	"i_ino"
-.LASF3300:
+.LASF3302:
 	.string	"might_fault"
 .LASF1562:
 	.string	"compact_cached_free_pfn"
@@ -52943,7 +53014,7 @@ __exitcall_ebc_exit:
 	.string	"index"
 .LASF2204:
 	.string	"driver_data"
-.LASF2940:
+.LASF2942:
 	.string	"sdck"
 .LASF2809:
 	.string	"module_kset"
@@ -53053,7 +53124,7 @@ __exitcall_ebc_exit:
 	.string	"pidfd_fops"
 .LASF1917:
 	.string	"lm_put_owner"
-.LASF3259:
+.LASF3261:
 	.string	"ebc_pmic_verity_vcom"
 .LASF2524:
 	.string	"set_sda"
@@ -53119,7 +53190,7 @@ __exitcall_ebc_exit:
 	.string	"func"
 .LASF1141:
 	.string	"perf_event_context"
-.LASF3004:
+.LASF3006:
 	.string	"ebc_auto_task"
 .LASF94:
 	.string	"printk_delay_msec"
@@ -53149,11 +53220,11 @@ __exitcall_ebc_exit:
 	.string	"wake_q_node"
 .LASF1117:
 	.string	"request_key_auth"
-.LASF3013:
+.LASF3015:
 	.string	"waveform_misc"
 .LASF1954:
 	.string	"destroy_inode"
-.LASF2967:
+.LASF2969:
 	.string	"is_busy_now"
 .LASF58:
 	.string	"irq_hw_number_t"
@@ -53161,11 +53232,11 @@ __exitcall_ebc_exit:
 	.string	"sysfs_dev_block_kobj"
 .LASF555:
 	.string	"upid"
-.LASF3289:
+.LASF3291:
 	.string	"down_write"
 .LASF1099:
 	.string	"completion"
-.LASF3083:
+.LASF3085:
 	.string	"old_prev_buf"
 .LASF1500:
 	.string	"NR_GPU_HEAP"
@@ -53179,13 +53250,13 @@ __exitcall_ebc_exit:
 	.string	"__con_initcall_end"
 .LASF1146:
 	.string	"active_uprobe"
-.LASF3008:
+.LASF3010:
 	.string	"ebc_poweroff_wq"
 .LASF1972:
 	.string	"show_options"
 .LASF2143:
 	.string	"uevent_helper"
-.LASF2965:
+.LASF2967:
 	.string	"lut_buffer_phy"
 .LASF110:
 	.string	"mmap_supported_flags"
@@ -53215,7 +53286,7 @@ __exitcall_ebc_exit:
 	.string	"taint_flag"
 .LASF1979:
 	.string	"get_dquots"
-.LASF3268:
+.LASF3270:
 	.string	"of_find_node_by_phandle"
 .LASF2403:
 	.string	"unmap_page"
@@ -53239,7 +53310,7 @@ __exitcall_ebc_exit:
 	.string	"vm_operations_struct"
 .LASF2391:
 	.string	"hwirq_max"
-.LASF3226:
+.LASF3228:
 	.string	"__fswab32"
 .LASF2199:
 	.string	"runtime_idle"
@@ -53269,13 +53340,13 @@ __exitcall_ebc_exit:
 	.string	"RPM_SUSPENDED"
 .LASF698:
 	.string	"reclaim_state"
-.LASF3299:
+.LASF3301:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF138:
 	.string	"vendor_panic_cb"
-.LASF3078:
+.LASF3080:
 	.string	"ebc_vdd_power_timeout"
-.LASF3146:
+.LASF3148:
 	.string	"ebc_get_4pix_wf"
 .LASF2799:
 	.string	"num_symtab"
@@ -53297,7 +53368,7 @@ __exitcall_ebc_exit:
 	.string	"_refcount"
 .LASF466:
 	.string	"i_crypt_info"
-.LASF3063:
+.LASF3065:
 	.string	"waveform_mmap"
 .LASF1872:
 	.string	"flc_flock"
@@ -53305,13 +53376,13 @@ __exitcall_ebc_exit:
 	.string	"module_alloc_base"
 .LASF1752:
 	.string	"core_kallsyms"
-.LASF3262:
+.LASF3264:
 	.string	"memcpy"
 .LASF2895:
 	.string	"EPD_FORCE_FULL"
 .LASF2401:
 	.string	"get_sgtable"
-.LASF3126:
+.LASF3128:
 	.string	"xor_val"
 .LASF2156:
 	.string	"envp_idx"
@@ -53323,11 +53394,11 @@ __exitcall_ebc_exit:
 	.string	"OOM_KILL"
 .LASF445:
 	.string	"i_hash"
-.LASF3109:
+.LASF3111:
 	.string	"gray_old"
 .LASF68:
 	.string	"hlist_node"
-.LASF3271:
+.LASF3273:
 	.string	"sprintf"
 .LASF1909:
 	.string	"fl_ops"
@@ -53337,7 +53408,7 @@ __exitcall_ebc_exit:
 	.string	"debug_guardpage_ops"
 .LASF2674:
 	.string	"COMPACTISOLATED"
-.LASF3239:
+.LASF3241:
 	.string	"of_property_read_variable_u32_array"
 .LASF328:
 	.string	"__inittext_begin"
@@ -53373,7 +53444,7 @@ __exitcall_ebc_exit:
 	.string	"DOMAIN_BUS_WAKEUP"
 .LASF1223:
 	.string	"arm64_el2_vector_last_slot"
-.LASF3294:
+.LASF3296:
 	.string	"queue_work_on"
 .LASF2336:
 	.string	"online"
@@ -53381,17 +53452,17 @@ __exitcall_ebc_exit:
 	.string	"runtime_resume"
 .LASF1208:
 	.string	"dup_xol_work"
-.LASF3167:
+.LASF3169:
 	.string	"ebc_pmic_read_temp"
 .LASF2876:
 	.string	"EPD_FULL_GC16"
-.LASF3019:
+.LASF3021:
 	.string	"dev_attr_ebc_state"
 .LASF2162:
 	.string	"kernel_kobj"
 .LASF2588:
 	.string	"funcs"
-.LASF3000:
+.LASF3002:
 	.string	"overlay_enable"
 .LASF1108:
 	.string	"securebits"
@@ -53411,7 +53482,7 @@ __exitcall_ebc_exit:
 	.string	"DOMAIN_BUS_NEXUS"
 .LASF2039:
 	.string	"sysctl_mount_point"
-.LASF2996:
+.LASF2998:
 	.string	"auto_buffer_work"
 .LASF267:
 	.string	"user_mask"
@@ -53455,7 +53526,7 @@ __exitcall_ebc_exit:
 	.string	"UNEVICTABLE_PGMLOCKED"
 .LASF837:
 	.string	"pgdval_t"
-.LASF2917:
+.LASF2919:
 	.string	"page_link"
 .LASF1860:
 	.string	"setattr"
@@ -53467,7 +53538,7 @@ __exitcall_ebc_exit:
 	.string	"prepare"
 .LASF2139:
 	.string	"bin_attrs"
-.LASF2927:
+.LASF2929:
 	.string	"HYPERVISOR_shared_info"
 .LASF683:
 	.string	"sas_ss_flags"
@@ -53475,7 +53546,7 @@ __exitcall_ebc_exit:
 	.string	"f_mode"
 .LASF1430:
 	.string	"ki_complete"
-.LASF3035:
+.LASF3037:
 	.string	"ebc_tcon_pdev"
 .LASF1756:
 	.string	"percpu"
@@ -53495,13 +53566,13 @@ __exitcall_ebc_exit:
 	.string	"driver"
 .LASF1545:
 	.string	"ZONE_NORMAL"
-.LASF3132:
+.LASF3134:
 	.string	"image_new_data"
 .LASF426:
 	.string	"i_op"
 .LASF1687:
 	.string	"d_rt_spc_hardlimit"
-.LASF2979:
+.LASF2981:
 	.string	"ebc_task"
 .LASF2127:
 	.string	"kobj_ns_type_operations"
@@ -53543,13 +53614,13 @@ __exitcall_ebc_exit:
 	.string	"trace_bprintk_fmt_start"
 .LASF666:
 	.string	"cpu_timers"
-.LASF2951:
+.LASF2953:
 	.string	"disable"
 .LASF1301:
 	.string	"huge_fault"
 .LASF2009:
 	.string	"kstatfs"
-.LASF3170:
+.LASF3172:
 	.string	"ebc_pmic_power_off"
 .LASF2635:
 	.string	"PGPGOUTCLEAN"
@@ -53567,7 +53638,7 @@ __exitcall_ebc_exit:
 	.string	"i_dentry"
 .LASF2129:
 	.string	"grab_current_ns"
-.LASF3050:
+.LASF3052:
 	.string	"fb_size"
 .LASF884:
 	.string	"offset"
@@ -53577,7 +53648,7 @@ __exitcall_ebc_exit:
 	.string	"fsnotify_mark_connector"
 .LASF942:
 	.string	"_sigsys"
-.LASF3096:
+.LASF3098:
 	.string	"ebc_lut_update"
 .LASF1922:
 	.string	"lm_setup"
@@ -53611,7 +53682,7 @@ __exitcall_ebc_exit:
 	.string	"idmap_pg_dir"
 .LASF2519:
 	.string	"i2c_bus_recovery_info"
-.LASF2966:
+.LASF2968:
 	.string	"lut_buffer_size"
 .LASF484:
 	.string	"s_dev"
@@ -53621,7 +53692,7 @@ __exitcall_ebc_exit:
 	.string	"get_next_id"
 .LASF238:
 	.string	"rwlock_t"
-.LASF3298:
+.LASF3300:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
 .LASF841:
 	.string	"pgprot"
@@ -53637,7 +53708,7 @@ __exitcall_ebc_exit:
 	.string	"PIDTYPE_TGID"
 .LASF1916:
 	.string	"lm_get_owner"
-.LASF2904:
+.LASF2906:
 	.string	"drvpar"
 .LASF2632:
 	.string	"vm_event_item"
@@ -53649,7 +53720,7 @@ __exitcall_ebc_exit:
 	.string	"__icache_flags"
 .LASF148:
 	.string	"crash_kexec_post_notifiers"
-.LASF3155:
+.LASF3157:
 	.string	"eink_mode"
 .LASF1698:
 	.string	"rt_spc_warnlimit"
@@ -53671,7 +53742,7 @@ __exitcall_ebc_exit:
 	.string	"_pid"
 .LASF1157:
 	.string	"init_stack"
-.LASF3138:
+.LASF3140:
 	.string	"dmask"
 .LASF1226:
 	.string	"address_space"
@@ -53683,15 +53754,15 @@ __exitcall_ebc_exit:
 	.string	"sysctl_nr_open"
 .LASF82:
 	.string	"reset_devices"
-.LASF2982:
+.LASF2984:
 	.string	"auto_image_bg"
 .LASF447:
 	.string	"i_wb"
 .LASF2087:
 	.string	"idr_next"
-.LASF3123:
+.LASF3125:
 	.string	"frame_count_data"
-.LASF2956:
+.LASF2958:
 	.string	"frame_start"
 .LASF1251:
 	.string	"compound_order"
@@ -53739,7 +53810,7 @@ __exitcall_ebc_exit:
 	.string	"normal_prio"
 .LASF1289:
 	.string	"f_ep_links"
-.LASF3136:
+.LASF3138:
 	.string	"image_fb_tmp"
 .LASF2295:
 	.string	"last_busy"
@@ -53751,7 +53822,7 @@ __exitcall_ebc_exit:
 	.string	"host"
 .LASF185:
 	.string	"uaddr"
-.LASF3291:
+.LASF3292:
 	.string	"ebc_remove_from_dsp_buf_list"
 .LASF662:
 	.string	"real_start_time"
@@ -53787,11 +53858,11 @@ __exitcall_ebc_exit:
 	.string	"devres_head"
 .LASF428:
 	.string	"i_mapping"
-.LASF3263:
+.LASF3265:
 	.string	"misc_register"
 .LASF723:
 	.string	"rseq_sig"
-.LASF3189:
+.LASF3191:
 	.string	"platform_set_drvdata"
 .LASF343:
 	.string	"cpu_context"
@@ -53799,7 +53870,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pm_domain"
 .LASF1514:
 	.string	"nr_zones"
-.LASF3212:
+.LASF3214:
 	.string	"is_source"
 .LASF1376:
 	.string	"migrate_mode"
@@ -53821,11 +53892,11 @@ __exitcall_ebc_exit:
 	.string	"d_hash"
 .LASF1076:
 	.string	"dl_bw"
-.LASF3182:
+.LASF3184:
 	.string	"limit"
 .LASF2146:
 	.string	"kobj"
-.LASF3272:
+.LASF3274:
 	.string	"kstrtouint"
 .LASF114:
 	.string	"fsync"
@@ -53835,13 +53906,13 @@ __exitcall_ebc_exit:
 	.string	"i_flags"
 .LASF2893:
 	.string	"EPD_RESUME"
-.LASF3258:
+.LASF3260:
 	.string	"sscanf"
-.LASF3254:
+.LASF3256:
 	.string	"ebc_empty_buf_get"
 .LASF1475:
 	.string	"NR_ISOLATED_ANON"
-.LASF3051:
+.LASF3053:
 	.string	"ebc_lut_table_init"
 .LASF1214:
 	.string	"uprobes_state"
@@ -53851,7 +53922,7 @@ __exitcall_ebc_exit:
 	.string	"rb_node"
 .LASF614:
 	.string	"pushable_tasks"
-.LASF3137:
+.LASF3139:
 	.string	"image_bg_tmp"
 .LASF2203:
 	.string	"platform_data"
@@ -53881,7 +53952,7 @@ __exitcall_ebc_exit:
 	.string	"last_update_time"
 .LASF1138:
 	.string	"robust_list_head"
-.LASF3252:
+.LASF3254:
 	.string	"init_timer_key"
 .LASF1481:
 	.string	"NR_ANON_MAPPED"
@@ -53895,9 +53966,9 @@ __exitcall_ebc_exit:
 	.string	"srcversion"
 .LASF859:
 	.string	"pcpu_unit_offsets"
-.LASF3158:
+.LASF3160:
 	.string	"dma_sync_single_for_device"
-.LASF2957:
+.LASF2959:
 	.string	"dsp_end_callback"
 .LASF461:
 	.string	"i_data"
@@ -53921,7 +53992,7 @@ __exitcall_ebc_exit:
 	.string	"usage_count"
 .LASF2078:
 	.string	"show"
-.LASF3016:
+.LASF3018:
 	.string	"dev_attr_pmic_temp"
 .LASF7:
 	.string	"unsigned char"
@@ -53937,7 +54008,7 @@ __exitcall_ebc_exit:
 	.string	"task_rss_stat"
 .LASF1142:
 	.string	"pipe_inode_info"
-.LASF2986:
+.LASF2988:
 	.string	"ebc_power_status"
 .LASF961:
 	.string	"ratelimit"
@@ -53953,7 +54024,7 @@ __exitcall_ebc_exit:
 	.string	"uevent_ops"
 .LASF546:
 	.string	"rename_lock"
-.LASF3084:
+.LASF3086:
 	.string	"__out"
 .LASF681:
 	.string	"sas_ss_sp"
@@ -53961,7 +54032,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_INACTIVE_ANON"
 .LASF729:
 	.string	"nr_dirtied"
-.LASF3199:
+.LASF3201:
 	.string	"dev_get_drvdata"
 .LASF2396:
 	.string	"linear_revmap"
@@ -54005,11 +54076,11 @@ __exitcall_ebc_exit:
 	.string	"sysctl_memory_failure_early_kill"
 .LASF2761:
 	.string	"param_ops_bool_enable_only"
-.LASF3143:
+.LASF3145:
 	.string	"power_status"
 .LASF307:
 	.string	"__start_opd"
-.LASF3267:
+.LASF3269:
 	.string	"of_find_i2c_device_by_node"
 .LASF154:
 	.string	"SYSTEM_RUNNING"
@@ -54027,7 +54098,7 @@ __exitcall_ebc_exit:
 	.string	"icq_hint"
 .LASF1995:
 	.string	"fiemap_extent_info"
-.LASF2913:
+.LASF2915:
 	.string	"DMA_TO_DEVICE"
 .LASF2730:
 	.string	"elf64_shdr"
@@ -54045,11 +54116,11 @@ __exitcall_ebc_exit:
 	.string	"sigval_t"
 .LASF1934:
 	.string	"fa_file"
-.LASF3002:
+.LASF3004:
 	.string	"panel"
 .LASF2433:
 	.string	"irq_data"
-.LASF3091:
+.LASF3093:
 	.string	"old_buffer_temp"
 .LASF2706:
 	.string	"sysctl_memory_failure_recovery"
@@ -54067,7 +54138,7 @@ __exitcall_ebc_exit:
 	.string	"st_shndx"
 .LASF2400:
 	.string	"free"
-.LASF3056:
+.LASF3058:
 	.string	"pmic_vcom_write"
 .LASF2134:
 	.string	"attribute"
@@ -54083,7 +54154,7 @@ __exitcall_ebc_exit:
 	.string	"taint_flags"
 .LASF1348:
 	.string	"membarrier_state"
-.LASF3149:
+.LASF3151:
 	.string	"pre_image_addr"
 .LASF2179:
 	.string	"suspend"
@@ -54137,7 +54208,7 @@ __exitcall_ebc_exit:
 	.string	"path"
 .LASF2728:
 	.string	"st_size"
-.LASF3020:
+.LASF3022:
 	.string	"dev_attr_ebc_buf_state"
 .LASF189:
 	.string	"rmtp"
@@ -54175,7 +54246,7 @@ __exitcall_ebc_exit:
 	.string	"unlink"
 .LASF2718:
 	.string	"d_ptr"
-.LASF3058:
+.LASF3060:
 	.string	"pmic_temp_read"
 .LASF1653:
 	.string	"dqstats"
@@ -54197,11 +54268,11 @@ __exitcall_ebc_exit:
 	.string	"mmap_rnd_bits"
 .LASF2462:
 	.string	"of_stdout"
-.LASF3082:
+.LASF3084:
 	.string	"new_prev_buf"
 .LASF977:
 	.string	"vm_ops"
-.LASF2933:
+.LASF2935:
 	.string	"ebc_panel"
 .LASF1303:
 	.string	"pagesize"
@@ -54213,9 +54284,9 @@ __exitcall_ebc_exit:
 	.string	"timer"
 .LASF2463:
 	.string	"devtree_lock"
-.LASF3140:
+.LASF3142:
 	.string	"refresh_new_image_auto"
-.LASF3072:
+.LASF3074:
 	.string	"__ret"
 .LASF1865:
 	.string	"update_time"
@@ -54237,17 +54308,17 @@ __exitcall_ebc_exit:
 	.string	"expiry"
 .LASF572:
 	.string	"optimistic_spin_queue"
-.LASF2962:
+.LASF2964:
 	.string	"ebc_buffer_size"
-.LASF3273:
+.LASF3275:
 	.string	"ebc_pmic_set_vcom"
 .LASF2642:
 	.string	"ALLOCSTALL_NORMAL"
-.LASF3113:
+.LASF3115:
 	.string	"data_buf_tmp"
 .LASF326:
 	.string	"__initdata_begin"
-.LASF2907:
+.LASF2909:
 	.string	"pmic_pm_resume"
 .LASF225:
 	.string	"__lstate"
@@ -54321,7 +54392,7 @@ __exitcall_ebc_exit:
 	.string	"algo_data"
 .LASF1512:
 	.string	"node_zones"
-.LASF3017:
+.LASF3019:
 	.string	"dev_attr_pmic_vcom"
 .LASF1560:
 	.string	"initialized"
@@ -54335,7 +54406,7 @@ __exitcall_ebc_exit:
 	.string	"mod_plt_sec"
 .LASF637:
 	.string	"tgid"
-.LASF2897:
+.LASF2899:
 	.string	"epd_mode"
 .LASF1139:
 	.string	"compat_robust_list_head"
@@ -54411,7 +54482,7 @@ __exitcall_ebc_exit:
 	.string	"seq_show"
 .LASF767:
 	.string	"ate_match_dt"
-.LASF3197:
+.LASF3199:
 	.string	"of_node_put"
 .LASF1361:
 	.string	"cow_page"
@@ -54433,11 +54504,11 @@ __exitcall_ebc_exit:
 	.string	"param_ops_ushort"
 .LASF526:
 	.string	"s_shrink"
-.LASF3121:
+.LASF3123:
 	.string	"gray_new_temp"
 .LASF1526:
 	.string	"kcompactd_classzone_idx"
-.LASF3187:
+.LASF3189:
 	.string	"kmalloc_index"
 .LASF870:
 	.string	"hrtimer_restart"
@@ -54445,7 +54516,7 @@ __exitcall_ebc_exit:
 	.string	"totalram_pages"
 .LASF2487:
 	.string	"i2c_smbus_data"
-.LASF2990:
+.LASF2992:
 	.string	"curr_dsp_buf"
 .LASF1069:
 	.string	"time_slice"
@@ -54485,7 +54556,7 @@ __exitcall_ebc_exit:
 	.string	"wake_lock"
 .LASF2271:
 	.string	"may_skip_resume"
-.LASF2998:
+.LASF3000:
 	.string	"is_deep_sleep"
 .LASF1175:
 	.string	"shrinker"
@@ -54517,7 +54588,7 @@ __exitcall_ebc_exit:
 	.string	"ate_match_local_cap_id"
 .LASF2454:
 	.string	"property"
-.LASF3052:
+.LASF3054:
 	.string	"ebc_sysfs_init"
 .LASF992:
 	.string	"wchar"
@@ -54527,7 +54598,7 @@ __exitcall_ebc_exit:
 	.string	"platform_notify"
 .LASF62:
 	.string	"kernel_symbol"
-.LASF2925:
+.LASF2927:
 	.string	"dma_virt_ops"
 .LASF2299:
 	.string	"subsys_data"
@@ -54547,7 +54618,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_DELAYED_BIT"
 .LASF1039:
 	.string	"nr_failed_migrations_affine"
-.LASF3202:
+.LASF3204:
 	.string	"IS_ERR"
 .LASF862:
 	.string	"PCPU_FC_EMBED"
@@ -54561,7 +54632,7 @@ __exitcall_ebc_exit:
 	.string	"pi_top_task"
 .LASF806:
 	.string	"WORK_NR_COLORS"
-.LASF3141:
+.LASF3143:
 	.string	"refresh_new_image2"
 .LASF528:
 	.string	"s_fsnotify_inode_refs"
@@ -54573,7 +54644,7 @@ __exitcall_ebc_exit:
 	.string	"uprobe"
 .LASF529:
 	.string	"s_readonly_remount"
-.LASF3231:
+.LASF3233:
 	.string	"kasan_check_write"
 .LASF378:
 	.string	"hlist_bl_node"
@@ -54599,7 +54670,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_FLAG_MASK"
 .LASF1272:
 	.string	"units"
-.LASF3246:
+.LASF3248:
 	.string	"epd_lut_from_mem_init"
 .LASF312:
 	.string	"__nosave_begin"
@@ -54619,7 +54690,7 @@ __exitcall_ebc_exit:
 	.string	"user_namespace"
 .LASF2757:
 	.string	"param_ops_ulong"
-.LASF3219:
+.LASF3221:
 	.string	"get_current"
 .LASF232:
 	.string	"raw_spinlock"
@@ -54643,7 +54714,7 @@ __exitcall_ebc_exit:
 	.string	"fault_address"
 .LASF1607:
 	.string	"dq_inuse"
-.LASF3104:
+.LASF3106:
 	.string	"direct_mode_data_change_part"
 .LASF1642:
 	.string	"dqi_flags"
@@ -54651,13 +54722,13 @@ __exitcall_ebc_exit:
 	.string	"PGREFILL"
 .LASF2763:
 	.string	"param_ops_bint"
-.LASF3255:
+.LASF3257:
 	.string	"ebc_add_to_dsp_buf_list"
-.LASF3260:
+.LASF3262:
 	.string	"kfree"
 .LASF1803:
 	.string	"swap_deactivate"
-.LASF2941:
+.LASF2943:
 	.string	"gdck_sta"
 .LASF1144:
 	.string	"request_queue"
@@ -54665,7 +54736,7 @@ __exitcall_ebc_exit:
 	.string	"WORKINGSET_REFAULT"
 .LASF1641:
 	.string	"dqi_dirty_list"
-.LASF3053:
+.LASF3055:
 	.string	"ebc_buf_state_read"
 .LASF230:
 	.string	"prove_locking"
@@ -54679,7 +54750,7 @@ __exitcall_ebc_exit:
 	.string	"gtime"
 .LASF573:
 	.string	"debug_locks"
-.LASF3005:
+.LASF3007:
 	.string	"auto_buf_sema"
 .LASF1784:
 	.string	"readpage"
@@ -54699,7 +54770,7 @@ __exitcall_ebc_exit:
 	.string	"perm"
 .LASF715:
 	.string	"compat_robust_list"
-.LASF2960:
+.LASF2962:
 	.string	"ebc_buffer_phy"
 .LASF2478:
 	.string	"unmap"
@@ -54721,9 +54792,9 @@ __exitcall_ebc_exit:
 	.string	"alternatives_applied"
 .LASF598:
 	.string	"boost_expires"
-.LASF2912:
+.LASF2914:
 	.string	"DMA_BIDIRECTIONAL"
-.LASF3281:
+.LASF3283:
 	.string	"__arch_copy_to_user"
 .LASF236:
 	.string	"spinlock"
@@ -54741,13 +54812,13 @@ __exitcall_ebc_exit:
 	.string	"d_compare"
 .LASF972:
 	.string	"vm_mm"
-.LASF3092:
+.LASF3094:
 	.string	"need_refresh"
 .LASF2821:
 	.string	"platform_bus_type"
-.LASF3105:
+.LASF3107:
 	.string	"data_buf"
-.LASF3044:
+.LASF3046:
 	.string	"ulogo_buf"
 .LASF1638:
 	.string	"mem_dqinfo"
@@ -54765,15 +54836,15 @@ __exitcall_ebc_exit:
 	.string	"WORK_OFFQ_POOL_BITS"
 .LASF1906:
 	.string	"fl_fasync"
-.LASF3152:
+.LASF3154:
 	.string	"update_mode"
-.LASF2939:
+.LASF2941:
 	.string	"direct_mode"
 .LASF2412:
 	.string	"cache_sync"
 .LASF436:
 	.string	"i_lock"
-.LASF2977:
+.LASF2979:
 	.string	"ebc_dsp_buf_status"
 .LASF408:
 	.string	"d_name"
@@ -54807,7 +54878,7 @@ __exitcall_ebc_exit:
 	.string	"last_switch_time"
 .LASF566:
 	.string	"fs_overflowuid"
-.LASF2928:
+.LASF2930:
 	.string	"start_info"
 .LASF2694:
 	.string	"vm_zone_stat"
@@ -54837,15 +54908,15 @@ __exitcall_ebc_exit:
 	.string	"page_ext_operations"
 .LASF2664:
 	.string	"KSWAPD_HIGH_WMARK_HIT_QUICKLY"
-.LASF3054:
+.LASF3056:
 	.string	"ebc_state_read"
-.LASF3269:
+.LASF3271:
 	.string	"__stack_chk_fail"
-.LASF2910:
+.LASF2912:
 	.string	"pmic_set_vcom"
 .LASF2700:
 	.string	"stack_guard_gap"
-.LASF3211:
+.LASF3213:
 	.string	"bytes"
 .LASF1739:
 	.string	"gpl_future_crcs"
@@ -54877,7 +54948,7 @@ __exitcall_ebc_exit:
 	.string	"thaw_noirq"
 .LASF970:
 	.string	"vm_rb"
-.LASF3028:
+.LASF3030:
 	.string	"kernel_read_file_str"
 .LASF569:
 	.string	"init_user_ns"
@@ -54885,7 +54956,7 @@ __exitcall_ebc_exit:
 	.string	"add_links"
 .LASF2175:
 	.string	"pm_message_t"
-.LASF2930:
+.LASF2932:
 	.string	"xen_dma_ops"
 .LASF1445:
 	.string	"page_group_by_mobility_disabled"
@@ -54919,9 +54990,9 @@ __exitcall_ebc_exit:
 	.string	"payload"
 .LASF1390:
 	.string	"cb_state"
-.LASF2922:
+.LASF2924:
 	.string	"orig_nents"
-.LASF3071:
+.LASF3073:
 	.string	"buf_addr"
 .LASF413:
 	.string	"d_sb"
@@ -54949,7 +55020,7 @@ __exitcall_ebc_exit:
 	.string	"i_mtime"
 .LASF2605:
 	.string	"dev_page_fault_t"
-.LASF3099:
+.LASF3101:
 	.string	"ebc_auto_tast_function"
 .LASF24:
 	.string	"__kernel_gid32_t"
@@ -54961,7 +55032,7 @@ __exitcall_ebc_exit:
 	.string	"MODULE_STATE_COMING"
 .LASF2232:
 	.string	"offline_disabled"
-.LASF3195:
+.LASF3197:
 	.string	"of_property_read_u32_array"
 .LASF2477:
 	.string	"select"
@@ -54985,7 +55056,7 @@ __exitcall_ebc_exit:
 	.string	"async_put_work"
 .LASF2117:
 	.string	"kernfs_syscall_ops"
-.LASF2987:
+.LASF2989:
 	.string	"ebc_last_display"
 .LASF1858:
 	.string	"mknod"
@@ -54993,7 +55064,7 @@ __exitcall_ebc_exit:
 	.string	"SYSTEM_BOOTING"
 .LASF1601:
 	.string	"max_freq_scale"
-.LASF2923:
+.LASF2925:
 	.string	"dma_direct_ops"
 .LASF2253:
 	.string	"dev_pm_info"
@@ -55007,7 +55078,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pagemap"
 .LASF2649:
 	.string	"PGDEACTIVATE"
-.LASF3112:
+.LASF3114:
 	.string	"buffer_old_tmp"
 .LASF1785:
 	.string	"writepages"
@@ -55027,13 +55098,13 @@ __exitcall_ebc_exit:
 	.string	"writeback_control"
 .LASF1905:
 	.string	"fl_end"
-.LASF3284:
+.LASF3286:
 	.string	"ebc_find_buf_by_phy_addr"
 .LASF1952:
 	.string	"super_operations"
 .LASF395:
 	.string	"want_pages"
-.LASF2949:
+.LASF2951:
 	.string	"regmap_base"
 .LASF339:
 	.string	"wps_disabled"
@@ -55059,7 +55130,7 @@ __exitcall_ebc_exit:
 	.string	"i_security"
 .LASF2645:
 	.string	"PGSCAN_SKIP_NORMAL"
-.LASF2921:
+.LASF2923:
 	.string	"nents"
 .LASF757:
 	.string	"__smp_cross_call"
@@ -55067,13 +55138,13 @@ __exitcall_ebc_exit:
 	.string	"core"
 .LASF1816:
 	.string	"bd_holders"
-.LASF3102:
+.LASF3104:
 	.string	"reset_and_flip"
-.LASF2950:
+.LASF2952:
 	.string	"enable"
 .LASF956:
 	.string	"pipe_bufs"
-.LASF3216:
+.LASF3218:
 	.string	"to_user"
 .LASF2125:
 	.string	"KOBJ_NS_TYPE_NET"
@@ -55093,7 +55164,7 @@ __exitcall_ebc_exit:
 	.string	"__rb_parent_color"
 .LASF2225:
 	.string	"devres_lock"
-.LASF3139:
+.LASF3141:
 	.string	"new_buffer_refresh"
 .LASF366:
 	.string	"bits"
@@ -55109,17 +55180,17 @@ __exitcall_ebc_exit:
 	.string	"lookup"
 .LASF1591:
 	.string	"cpu_topology"
-.LASF3220:
+.LASF3222:
 	.string	"sp_el0"
-.LASF3288:
+.LASF3290:
 	.string	"ebc_dsp_buf_get"
-.LASF2899:
+.LASF2901:
 	.string	"panel_color"
 .LASF1897:
 	.string	"fl_owner"
 .LASF2852:
 	.string	"WF_TYPE_GLD16"
-.LASF2999:
+.LASF3001:
 	.string	"is_power_off"
 .LASF980:
 	.string	"vm_private_data"
@@ -55133,7 +55204,7 @@ __exitcall_ebc_exit:
 	.string	"kobj_type"
 .LASF2623:
 	.string	"sysctl_overcommit_kbytes"
-.LASF2971:
+.LASF2973:
 	.string	"frame_left"
 .LASF2480:
 	.string	"deactivate"
@@ -55141,7 +55212,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_AUTO"
 .LASF1228:
 	.string	"i_pages"
-.LASF3179:
+.LASF3181:
 	.string	"safe_ptr"
 .LASF377:
 	.string	"hlist_bl_head"
@@ -55171,9 +55242,9 @@ __exitcall_ebc_exit:
 	.string	"unix_inflight"
 .LASF1727:
 	.string	"holders_dir"
-.LASF3073:
+.LASF3075:
 	.string	"__wq_entry"
-.LASF3087:
+.LASF3089:
 	.string	"new_buffer"
 .LASF464:
 	.string	"i_fsnotify_mask"
@@ -55181,7 +55252,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_LOW_WMARK_HIT_QUICKLY"
 .LASF995:
 	.string	"syscfs"
-.LASF3172:
+.LASF3174:
 	.string	"wake_unlock"
 .LASF2446:
 	.string	"graph_get_port_parent"
@@ -55189,7 +55260,7 @@ __exitcall_ebc_exit:
 	.string	"UNEVICTABLE_PGRESCUED"
 .LASF2210:
 	.string	"msi_list"
-.LASF3222:
+.LASF3224:
 	.string	"__ilog2_u64"
 .LASF548:
 	.string	"compat_time_t"
@@ -55213,7 +55284,7 @@ __exitcall_ebc_exit:
 	.string	"cap_effective"
 .LASF1747:
 	.string	"taints"
-.LASF3241:
+.LASF3243:
 	.string	"of_address_to_resource"
 .LASF1013:
 	.string	"enqueued"
@@ -55223,7 +55294,7 @@ __exitcall_ebc_exit:
 	.string	"hex_asc_upper"
 .LASF507:
 	.string	"s_roots"
-.LASF2911:
+.LASF2913:
 	.string	"dma_data_direction"
 .LASF1690:
 	.string	"d_rt_spc_timer"
@@ -55241,7 +55312,7 @@ __exitcall_ebc_exit:
 	.string	"bd_private"
 .LASF1904:
 	.string	"fl_start"
-.LASF3194:
+.LASF3196:
 	.string	"out_value"
 .LASF1962:
 	.string	"freeze_fs"
@@ -55249,7 +55320,7 @@ __exitcall_ebc_exit:
 	.string	"sigset_t"
 .LASF1918:
 	.string	"lm_notify"
-.LASF3151:
+.LASF3153:
 	.string	"ebc_tcon_dsp_mode_set"
 .LASF881:
 	.string	"running"
@@ -55275,7 +55346,7 @@ __exitcall_ebc_exit:
 	.string	"d_automount"
 .LASF1266:
 	.string	"page_free"
-.LASF3100:
+.LASF3102:
 	.string	"__val"
 .LASF1482:
 	.string	"NR_FILE_MAPPED"
@@ -55287,19 +55358,19 @@ __exitcall_ebc_exit:
 	.string	"copy_file_range"
 .LASF2686:
 	.string	"UNEVICTABLE_PGCLEARED"
-.LASF3274:
+.LASF3276:
 	.string	"epd_lut_get_wf_version"
 .LASF2048:
 	.string	"key_type"
 .LASF798:
 	.string	"WORK_STRUCT_LINKED_BIT"
-.LASF3213:
+.LASF3215:
 	.string	"copy_overflow"
 .LASF2442:
 	.string	"get_named_child_node"
 .LASF2259:
 	.string	"is_suspended"
-.LASF2919:
+.LASF2921:
 	.string	"dma_length"
 .LASF2067:
 	.string	"burst"
@@ -55307,15 +55378,15 @@ __exitcall_ebc_exit:
 	.string	"clone_mnt_data"
 .LASF2778:
 	.string	"module_kobject"
-.LASF3049:
+.LASF3051:
 	.string	"memory"
-.LASF3186:
+.LASF3188:
 	.string	"order"
 .LASF740:
 	.string	"active_memcg"
 .LASF1333:
 	.string	"def_flags"
-.LASF3003:
+.LASF3005:
 	.string	"global_ebc"
 .LASF1474:
 	.string	"NR_SLAB_UNRECLAIMABLE"
@@ -55323,7 +55394,7 @@ __exitcall_ebc_exit:
 	.string	"refcount"
 .LASF1791:
 	.string	"invalidatepage"
-.LASF3077:
+.LASF3079:
 	.string	"ebc_frame_timeout"
 .LASF364:
 	.string	"wait_queue_head_t"
@@ -55345,7 +55416,7 @@ __exitcall_ebc_exit:
 	.string	"EPD_A2"
 .LASF2103:
 	.string	"kernfs_elem_attr"
-.LASF3090:
+.LASF3092:
 	.string	"new_buffer_temp"
 .LASF2300:
 	.string	"set_latency_tolerance"
@@ -55359,7 +55430,7 @@ __exitcall_ebc_exit:
 	.string	"arm64_ftr_reg_ctrel0"
 .LASF1245:
 	.string	"counters"
-.LASF3232:
+.LASF3234:
 	.string	"kasan_check_read"
 .LASF2060:
 	.string	"name_link"
@@ -55379,9 +55450,9 @@ __exitcall_ebc_exit:
 	.string	"policy"
 .LASF1294:
 	.string	"shared"
-.LASF3022:
+.LASF3024:
 	.string	"ebc_match"
-.LASF2948:
+.LASF2950:
 	.string	"dclk"
 .LASF2218:
 	.string	"dma_mem"
@@ -55401,7 +55472,7 @@ __exitcall_ebc_exit:
 	.string	"module_sysfs_initialized"
 .LASF1003:
 	.string	"task_cputime"
-.LASF2974:
+.LASF2976:
 	.string	"lut_addr"
 .LASF1197:
 	.string	"rnode"
@@ -55411,7 +55482,7 @@ __exitcall_ebc_exit:
 	.string	"__con_initcall_start"
 .LASF1718:
 	.string	"get_dqblk"
-.LASF3034:
+.LASF3036:
 	.string	"ebc_tcon_node"
 .LASF2818:
 	.string	"id_entry"
@@ -55421,7 +55492,7 @@ __exitcall_ebc_exit:
 	.string	"nr_irqs"
 .LASF895:
 	.string	"max_hang_time"
-.LASF3175:
+.LASF3177:
 	.string	"copy_from_user"
 .LASF2468:
 	.string	"DOMAIN_BUS_ANY"
@@ -55435,9 +55506,9 @@ __exitcall_ebc_exit:
 	.string	"mmap_miss"
 .LASF1655:
 	.string	"quota_format_ops"
-.LASF3286:
+.LASF3288:
 	.string	"ebc_osd_buf_get"
-.LASF3068:
+.LASF3070:
 	.string	"argp"
 .LASF1755:
 	.string	"args"
@@ -55449,13 +55520,13 @@ __exitcall_ebc_exit:
 	.string	"run_delay"
 .LASF1999:
 	.string	"fi_extents_start"
-.LASF2931:
+.LASF2933:
 	.string	"dummy_dma_ops"
 .LASF239:
 	.string	"static_key_initialized"
 .LASF2785:
 	.string	"module_uevent"
-.LASF3081:
+.LASF3083:
 	.string	"is_full_mode"
 .LASF2598:
 	.string	"base_pfn"
@@ -55463,29 +55534,29 @@ __exitcall_ebc_exit:
 	.string	"width"
 .LASF930:
 	.string	"_addr_pkey"
-.LASF3061:
+.LASF3063:
 	.string	"waveform_buffer"
 .LASF297:
 	.string	"__start_rodata"
 .LASF1469:
 	.string	"NR_ACTIVE_ANON"
-.LASF2934:
+.LASF2936:
 	.string	"tcon"
 .LASF1116:
 	.string	"thread_keyring"
 .LASF2746:
 	.string	"kparam_array"
-.LASF3234:
+.LASF3236:
 	.string	"platform_driver_unregister"
 .LASF653:
 	.string	"utime"
 .LASF1335:
 	.string	"start_code"
-.LASF3023:
+.LASF3025:
 	.string	"ebc_driver"
 .LASF2606:
 	.string	"dev_page_free_t"
-.LASF3192:
+.LASF3194:
 	.string	"of_property_read_u32"
 .LASF1399:
 	.string	"guid_t"
@@ -55505,7 +55576,7 @@ __exitcall_ebc_exit:
 	.string	"tz_minuteswest"
 .LASF2460:
 	.string	"of_chosen"
-.LASF3101:
+.LASF3103:
 	.string	"ebc_frame_start"
 .LASF349:
 	.string	"sve_state"
@@ -55515,7 +55586,7 @@ __exitcall_ebc_exit:
 	.string	"cpumask_t"
 .LASF134:
 	.string	"kmsg_fops"
-.LASF3283:
+.LASF3285:
 	.string	"ebc_buf_release"
 .LASF820:
 	.string	"WORK_STRUCT_NO_POOL"
@@ -55537,7 +55608,7 @@ __exitcall_ebc_exit:
 	.string	"sched_rt_entity"
 .LASF117:
 	.string	"sendpage"
-.LASF3145:
+.LASF3147:
 	.string	"ret_val"
 .LASF867:
 	.string	"timerqueue_node"
@@ -55547,7 +55618,7 @@ __exitcall_ebc_exit:
 	.string	"mem_dqblk"
 .LASF2773:
 	.string	"plt_entry"
-.LASF3153:
+.LASF3155:
 	.string	"display_mode"
 .LASF1981:
 	.string	"nr_cached_objects"
@@ -55579,11 +55650,11 @@ __exitcall_ebc_exit:
 	.string	"fops"
 .LASF1274:
 	.string	"f_path"
-.LASF3248:
+.LASF3250:
 	.string	"kthread_create_on_node"
 .LASF712:
 	.string	"cgroups"
-.LASF3178:
+.LASF3180:
 	.string	"__uaccess_mask_ptr"
 .LASF2345:
 	.string	"probe_type"
@@ -55603,9 +55674,9 @@ __exitcall_ebc_exit:
 	.string	"userspace_clients"
 .LASF2144:
 	.string	"uevent_seqnum"
-.LASF3244:
+.LASF3246:
 	.string	"memset"
-.LASF3150:
+.LASF3152:
 	.string	"cur_image_addr"
 .LASF2145:
 	.string	"list_lock"
@@ -55639,7 +55710,7 @@ __exitcall_ebc_exit:
 	.string	"file_lock_operations"
 .LASF344:
 	.string	"tp_value"
-.LASF3031:
+.LASF3033:
 	.string	"ebc_remove"
 .LASF1894:
 	.string	"fl_list"
@@ -55653,7 +55724,7 @@ __exitcall_ebc_exit:
 	.string	"qf_fmt_id"
 .LASF1051:
 	.string	"nr_wakeups_idle"
-.LASF3290:
+.LASF3293:
 	.string	"up_write"
 .LASF1459:
 	.string	"NR_MLOCK"
@@ -55669,11 +55740,11 @@ __exitcall_ebc_exit:
 	.string	"sysctl_drop_caches"
 .LASF1974:
 	.string	"show_devname"
-.LASF2943:
+.LASF2945:
 	.string	"panel_16bit"
 .LASF1323:
 	.string	"page_table_lock"
-.LASF3021:
+.LASF3023:
 	.string	"ebc_pm"
 .LASF2841:
 	.string	"sched_priority"
@@ -55689,7 +55760,7 @@ __exitcall_ebc_exit:
 	.string	"console_printk"
 .LASF703:
 	.string	"ioac"
-.LASF3206:
+.LASF3208:
 	.string	"__init_work"
 .LASF1172:
 	.string	"nr_to_scan"
@@ -55701,7 +55772,7 @@ __exitcall_ebc_exit:
 	.string	"exec_max"
 .LASF1404:
 	.string	"uuid_index"
-.LASF3207:
+.LASF3209:
 	.string	"onstack"
 .LASF190:
 	.string	"compat_rmtp"
@@ -55713,7 +55784,7 @@ __exitcall_ebc_exit:
 	.string	"nfs_fl"
 .LASF403:
 	.string	"dentry"
-.LASF3224:
+.LASF3226:
 	.string	"__be32_to_cpup"
 .LASF2167:
 	.string	"klist_node"
@@ -55731,7 +55802,7 @@ __exitcall_ebc_exit:
 	.string	"__i_nlink"
 .LASF145:
 	.string	"panic_on_warn"
-.LASF3075:
+.LASF3077:
 	.string	"ebc_panel_probe"
 .LASF80:
 	.string	"boot_command_line"
@@ -55749,13 +55820,13 @@ __exitcall_ebc_exit:
 	.string	"d_spc_warns"
 .LASF1041:
 	.string	"nr_failed_migrations_hot"
-.LASF2935:
+.LASF2937:
 	.string	"pmic"
 .LASF1137:
 	.string	"css_set"
 .LASF1403:
 	.string	"guid_index"
-.LASF2976:
+.LASF2978:
 	.string	"ebc_irq_status"
 .LASF2545:
 	.string	"force_irqthreads"
@@ -55797,13 +55868,13 @@ __exitcall_ebc_exit:
 	.string	"d_rt_space"
 .LASF265:
 	.string	"name"
-.LASF3253:
+.LASF3255:
 	.string	"mod_timer"
 .LASF151:
 	.string	"early_boot_irqs_disabled"
 .LASF659:
 	.string	"nvcsw"
-.LASF3047:
+.LASF3049:
 	.string	"ebc_task_init"
 .LASF2833:
 	.string	"KMALLOC_NORMAL"
@@ -55823,7 +55894,7 @@ __exitcall_ebc_exit:
 	.string	"i_gid"
 .LASF1620:
 	.string	"quota_type"
-.LASF3107:
+.LASF3109:
 	.string	"buffer_old"
 .LASF1537:
 	.string	"high"
@@ -55839,11 +55910,11 @@ __exitcall_ebc_exit:
 	.string	"self_exec_id"
 .LASF1908:
 	.string	"fl_downgrade_time"
-.LASF2983:
+.LASF2985:
 	.string	"auto_frame_count"
 .LASF2105:
 	.string	"kernfs_ops"
-.LASF2980:
+.LASF2982:
 	.string	"auto_image_new"
 .LASF808:
 	.string	"WORK_CPU_UNBOUND"
@@ -55867,25 +55938,25 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_WRITE_PENDING"
 .LASF1297:
 	.string	"close"
-.LASF3133:
+.LASF3135:
 	.string	"image_fb_data"
-.LASF3045:
+.LASF3047:
 	.string	"klogo_buf"
 .LASF2894:
 	.string	"EPD_POWER_OFF"
 .LASF1502:
 	.string	"zone_reclaim_stat"
-.LASF3006:
+.LASF3008:
 	.string	"ebc_wq"
 .LASF737:
 	.string	"memcg_oom_gfp_mask"
-.LASF3209:
+.LASF3211:
 	.string	"_msecs_to_jiffies"
 .LASF1684:
 	.string	"d_spc_timer"
 .LASF1760:
 	.string	"jump_entries"
-.LASF3217:
+.LASF3219:
 	.string	"test_ti_thread_flag"
 .LASF2256:
 	.string	"async_suspend"
@@ -55895,7 +55966,7 @@ __exitcall_ebc_exit:
 	.string	"read_pos"
 .LASF482:
 	.string	"super_block"
-.LASF3180:
+.LASF3182:
 	.string	"__addr"
 .LASF2323:
 	.string	"dma_coherent"
@@ -55933,7 +56004,7 @@ __exitcall_ebc_exit:
 	.string	"map_sg"
 .LASF1160:
 	.string	"nlink"
-.LASF3040:
+.LASF3042:
 	.string	"ulogo_addr_valid"
 .LASF2578:
 	.string	"percpu_ref"
@@ -55941,11 +56012,11 @@ __exitcall_ebc_exit:
 	.string	"devkmsg_log_str"
 .LASF255:
 	.string	"FTR_HIGHER_SAFE"
-.LASF3191:
+.LASF3193:
 	.string	"i2c_get_clientdata"
-.LASF3176:
+.LASF3178:
 	.string	"_copy_to_user"
-.LASF3227:
+.LASF3229:
 	.string	"test_bit"
 .LASF249:
 	.string	"__start___jump_table"
@@ -55961,7 +56032,7 @@ __exitcall_ebc_exit:
 	.string	"mems_allowed_seq"
 .LASF1771:
 	.string	"refcnt"
-.LASF3093:
+.LASF3095:
 	.string	"pbuf_new"
 .LASF2182:
 	.string	"thaw"
@@ -55977,9 +56048,9 @@ __exitcall_ebc_exit:
 	.string	"futex"
 .LASF1026:
 	.string	"wait_max"
-.LASF3251:
+.LASF3253:
 	.string	"wakeup_source_add"
-.LASF3169:
+.LASF3171:
 	.string	"ebc_pmic_suspend"
 .LASF1159:
 	.string	"result_mask"
@@ -55991,15 +56062,15 @@ __exitcall_ebc_exit:
 	.string	"dquot_operations"
 .LASF1225:
 	.string	"mapping"
-.LASF3201:
+.LASF3203:
 	.string	"resource_size"
-.LASF3249:
+.LASF3251:
 	.string	"wake_up_process"
 .LASF1355:
 	.string	"kioctx_table"
 .LASF853:
 	.string	"rb_right"
-.LASF3111:
+.LASF3113:
 	.string	"buffer_new_tmp"
 .LASF979:
 	.string	"vm_file"
@@ -56025,11 +56096,11 @@ __exitcall_ebc_exit:
 	.string	"__initdata_end"
 .LASF2502:
 	.string	"bus_lock"
-.LASF3188:
+.LASF3190:
 	.string	"kmalloc_type"
 .LASF388:
 	.string	"qstr"
-.LASF3110:
+.LASF3112:
 	.string	"gray_new"
 .LASF1093:
 	.string	"futex_state"
@@ -56037,7 +56108,7 @@ __exitcall_ebc_exit:
 	.string	"WORKINGSET_RESTORE"
 .LASF629:
 	.string	"sched_psi_wake_requeue"
-.LASF3210:
+.LASF3212:
 	.string	"check_copy_size"
 .LASF738:
 	.string	"memcg_oom_order"
@@ -56093,17 +56164,17 @@ __exitcall_ebc_exit:
 	.string	"core_state"
 .LASF869:
 	.string	"timerqueue_head"
-.LASF3250:
+.LASF3252:
 	.string	"sched_setscheduler_nocheck"
 .LASF1292:
 	.string	"f_wb_err"
-.LASF3204:
+.LASF3206:
 	.string	"schedule_work"
 .LASF2431:
 	.string	"rt_mutex"
 .LASF991:
 	.string	"rchar"
-.LASF3161:
+.LASF3163:
 	.string	"valid_dma_direction"
 .LASF1819:
 	.string	"bd_contains"
@@ -56125,7 +56196,7 @@ __exitcall_ebc_exit:
 	.string	"_pt_pad_1"
 .LASF1260:
 	.string	"_pt_pad_2"
-.LASF2975:
+.LASF2977:
 	.string	"buf_align16"
 .LASF2813:
 	.string	"cpuhp_tasks_frozen"
@@ -56139,13 +56210,13 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_FLAG_BITS"
 .LASF2449:
 	.string	"fwnode_endpoint"
-.LASF3074:
+.LASF3076:
 	.string	"__int"
 .LASF953:
 	.string	"epoll_watches"
 .LASF2678:
 	.string	"KCOMPACTD_WAKE"
-.LASF3128:
+.LASF3130:
 	.string	"refresh_new_image"
 .LASF2075:
 	.string	"non_rcu"
@@ -56179,7 +56250,7 @@ __exitcall_ebc_exit:
 	.string	"_uid"
 .LASF340:
 	.string	"hbp_break"
-.LASF3036:
+.LASF3038:
 	.string	"pmic_node"
 .LASF139:
 	.string	"panic_blink"
@@ -56219,13 +56290,13 @@ __exitcall_ebc_exit:
 	.string	"need"
 .LASF505:
 	.string	"s_encoding"
-.LASF3205:
+.LASF3207:
 	.string	"queue_work"
 .LASF1735:
 	.string	"gpl_crcs"
 .LASF1721:
 	.string	"get_state"
-.LASF3164:
+.LASF3166:
 	.string	"dma_handle"
 .LASF1360:
 	.string	"orig_pte"
@@ -56243,7 +56314,7 @@ __exitcall_ebc_exit:
 	.string	"__s8"
 .LASF353:
 	.string	"fault_code"
-.LASF3014:
+.LASF3016:
 	.string	"dev_attr_waveform_version"
 .LASF2212:
 	.string	"dma_mask"
@@ -56277,9 +56348,9 @@ __exitcall_ebc_exit:
 	.string	"__kernel_ulong_t"
 .LASF2607:
 	.string	"max_mapnr"
-.LASF2958:
+.LASF2960:
 	.string	"regmap"
-.LASF2926:
+.LASF2928:
 	.string	"shared_info"
 .LASF773:
 	.string	"read_cntp_tval_el0"
@@ -56293,13 +56364,13 @@ __exitcall_ebc_exit:
 	.string	"NR_WRITEBACK_TEMP"
 .LASF2514:
 	.string	"functionality"
-.LASF3115:
+.LASF3117:
 	.string	"clac_part_data_align8"
 .LASF306:
 	.string	"__ctors_end"
 .LASF2267:
 	.string	"wakeup_path"
-.LASF3270:
+.LASF3272:
 	.string	"ebc_buf_state_show"
 .LASF969:
 	.string	"vm_prev"
@@ -56315,7 +56386,7 @@ __exitcall_ebc_exit:
 	.string	"__u8"
 .LASF116:
 	.string	"lock"
-.LASF3168:
+.LASF3170:
 	.string	"ebc_pmic_resume"
 .LASF1563:
 	.string	"compact_cached_migrate_pfn"
@@ -56323,9 +56394,9 @@ __exitcall_ebc_exit:
 	.string	"PGALLOC_DMA32"
 .LASF2756:
 	.string	"param_ops_long"
-.LASF3001:
+.LASF3003:
 	.string	"overlay_start"
-.LASF2954:
+.LASF2956:
 	.string	"frame_addr_set"
 .LASF1078:
 	.string	"runtime"
@@ -56351,13 +56422,13 @@ __exitcall_ebc_exit:
 	.string	"xattr_handler"
 .LASF1427:
 	.string	"kiocb"
-.LASF2900:
+.LASF2902:
 	.string	"width_mm"
 .LASF1566:
 	.string	"compact_order_failed"
 .LASF1106:
 	.string	"fsuid"
-.LASF3218:
+.LASF3220:
 	.string	"flag"
 .LASF1476:
 	.string	"NR_ISOLATED_FILE"
@@ -56369,9 +56440,9 @@ __exitcall_ebc_exit:
 	.string	"managed_pages"
 .LASF2590:
 	.string	"__tracepoint_page_ref_set"
-.LASF3157:
+.LASF3159:
 	.string	"ebc_tcon_enable"
-.LASF3297:
+.LASF3299:
 	.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"
@@ -56419,13 +56490,13 @@ __exitcall_ebc_exit:
 	.string	"s_vop"
 .LASF1651:
 	.string	"qf_owner"
-.LASF3233:
+.LASF3235:
 	.string	"__write_once_size"
 .LASF2832:
 	.string	"kmalloc_cache_type"
 .LASF575:
 	.string	"mutex"
-.LASF3196:
+.LASF3198:
 	.string	"out_values"
 .LASF840:
 	.string	"pgd_t"
@@ -56437,9 +56508,9 @@ __exitcall_ebc_exit:
 	.string	"NR_VM_NODE_STAT_ITEMS"
 .LASF234:
 	.string	"raw_spinlock_t"
-.LASF2937:
+.LASF2939:
 	.string	"vir_width"
-.LASF3221:
+.LASF3223:
 	.string	"INIT_LIST_HEAD"
 .LASF1939:
 	.string	"fs_flags"
@@ -56455,11 +56526,11 @@ __exitcall_ebc_exit:
 	.string	"dma_pfn_offset"
 .LASF1190:
 	.string	"radix_tree_node"
-.LASF3223:
+.LASF3225:
 	.string	"sign_extend64"
 .LASF2314:
 	.string	"wake_irq"
-.LASF3038:
+.LASF3040:
 	.string	"ulogo_addr"
 .LASF860:
 	.string	"pcpu_fc"
@@ -56477,7 +56548,7 @@ __exitcall_ebc_exit:
 	.string	"ptraced"
 .LASF2752:
 	.string	"param_ops_short"
-.LASF3265:
+.LASF3267:
 	.string	"of_find_device_by_node"
 .LASF2554:
 	.string	"HRTIMER_SOFTIRQ"
@@ -56497,13 +56568,13 @@ __exitcall_ebc_exit:
 	.string	"d_lockref"
 .LASF2243:
 	.string	"rpm_request"
-.LASF3067:
+.LASF3069:
 	.string	"ebc_io_ctl"
 .LASF1150:
 	.string	"addr"
 .LASF2386:
 	.string	"device_private"
-.LASF3159:
+.LASF3161:
 	.string	"get_dma_ops"
 .LASF2698:
 	.string	"watermark_scale_factor"
@@ -56517,9 +56588,9 @@ __exitcall_ebc_exit:
 	.string	"mm_rss_stat"
 .LASF1723:
 	.string	"mkobj"
-.LASF2964:
+.LASF2966:
 	.string	"direct_buf_real_size"
-.LASF3287:
+.LASF3289:
 	.string	"__pm_relax"
 .LASF473:
 	.string	"d_delete"
@@ -56529,7 +56600,7 @@ __exitcall_ebc_exit:
 	.string	"begin"
 .LASF2737:
 	.string	"sh_link"
-.LASF3029:
+.LASF3031:
 	.string	"ebc_suspend"
 .LASF2358:
 	.string	"cls_msk"
@@ -56551,19 +56622,19 @@ __exitcall_ebc_exit:
 	.string	"num_resources"
 .LASF1576:
 	.string	"notifier_fn_t"
-.LASF3037:
+.LASF3039:
 	.string	"pmic_client"
 .LASF2572:
 	.string	"miscdevice"
 .LASF656:
 	.string	"time_in_state"
-.LASF3046:
+.LASF3048:
 	.string	"ebc_logo_init"
 .LASF1269:
 	.string	"kill"
 .LASF1030:
 	.string	"iowait_sum"
-.LASF3129:
+.LASF3131:
 	.string	"image_new"
 .LASF15:
 	.string	"__u64"
@@ -56589,13 +56660,13 @@ __exitcall_ebc_exit:
 	.string	"i_blkbits"
 .LASF2456:
 	.string	"value"
-.LASF2995:
+.LASF2997:
 	.string	"frame_timer"
 .LASF1033:
 	.string	"sum_sleep_runtime"
-.LASF3042:
+.LASF3044:
 	.string	"ulogo_addr_str"
-.LASF3103:
+.LASF3105:
 	.string	"flip"
 .LASF1079:
 	.string	"deadline"
@@ -56629,6 +56700,8 @@ __exitcall_ebc_exit:
 	.string	"fault"
 .LASF81:
 	.string	"saved_command_line"
+.LASF2897:
+	.string	"EPD_AUTO_DU4"
 .LASF1976:
 	.string	"show_stats"
 .LASF1077:
@@ -56637,11 +56710,11 @@ __exitcall_ebc_exit:
 	.string	"read_dqblk"
 .LASF1616:
 	.string	"dq_flags"
-.LASF3106:
+.LASF3108:
 	.string	"buffer_new"
 .LASF213:
 	.string	"user_fpsimd_state"
-.LASF3264:
+.LASF3266:
 	.string	"device_create_file"
 .LASF521:
 	.string	"s_time_gran"
@@ -56665,15 +56738,15 @@ __exitcall_ebc_exit:
 	.string	"s_bdi"
 .LASF2857:
 	.string	"wf_table"
-.LASF3135:
+.LASF3137:
 	.string	"image_new_tmp"
 .LASF1732:
 	.string	"num_kp"
-.LASF3296:
+.LASF3298:
 	.string	"__pm_stay_awake"
 .LASF2565:
 	.string	"vmap_area_list"
-.LASF3009:
+.LASF3011:
 	.string	"ebc_auto_thread_sem"
 .LASF630:
 	.string	"in_execve"
@@ -56723,7 +56796,7 @@ __exitcall_ebc_exit:
 	.string	"names_cachep"
 .LASF785:
 	.string	"preset_lpj"
-.LASF2994:
+.LASF2996:
 	.string	"vdd_timer"
 .LASF2221:
 	.string	"archdata"
@@ -56775,7 +56848,7 @@ __exitcall_ebc_exit:
 	.string	"seeks"
 .LASF577:
 	.string	"task_struct"
-.LASF2901:
+.LASF2903:
 	.string	"height_mm"
 .LASF2640:
 	.string	"PGALLOC_MOVABLE"
@@ -56813,7 +56886,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_RESUMING"
 .LASF471:
 	.string	"d_weak_revalidate"
-.LASF2989:
+.LASF2991:
 	.string	"prev_dsp_buf"
 .LASF1493:
 	.string	"NR_VMSCAN_IMMEDIATE"
@@ -56829,7 +56902,7 @@ __exitcall_ebc_exit:
 	.string	"setup_max_cpus"
 .LASF1834:
 	.string	"i_nlink"
-.LASF2944:
+.LASF2946:
 	.string	"mirror"
 .LASF1788:
 	.string	"write_begin"
@@ -56837,11 +56910,11 @@ __exitcall_ebc_exit:
 	.string	"groups"
 .LASF694:
 	.string	"pi_blocked_on"
-.LASF3033:
+.LASF3035:
 	.string	"ebc_probe"
 .LASF501:
 	.string	"s_xattr"
-.LASF3043:
+.LASF3045:
 	.string	"klogo_addr_str"
 .LASF993:
 	.string	"syscr"
@@ -56875,7 +56948,7 @@ __exitcall_ebc_exit:
 	.string	"s_inode_list_lock"
 .LASF2600:
 	.string	"align"
-.LASF3114:
+.LASF3116:
 	.string	"frame_idx"
 .LASF204:
 	.string	"mm_segment_t"
@@ -56897,13 +56970,13 @@ __exitcall_ebc_exit:
 	.string	"maj_flt"
 .LASF229:
 	.string	"arch_rwlock_t"
-.LASF3285:
+.LASF3287:
 	.string	"ebc_osd_buf_clone"
 .LASF162:
 	.string	"c_false"
 .LASF900:
 	.string	"clock_base"
-.LASF2908:
+.LASF2910:
 	.string	"pmic_read_temperature"
 .LASF1798:
 	.string	"launder_page"
@@ -56923,7 +56996,7 @@ __exitcall_ebc_exit:
 	.string	"minor"
 .LASF1699:
 	.string	"nextents"
-.LASF3162:
+.LASF3164:
 	.string	"dma_direction"
 .LASF1:
 	.string	"sizetype"
@@ -56933,13 +57006,13 @@ __exitcall_ebc_exit:
 	.string	"arg_lock"
 .LASF1741:
 	.string	"num_exentries"
-.LASF3095:
+.LASF3097:
 	.string	"check_out"
 .LASF2609:
 	.string	"high_memory"
 .LASF49:
 	.string	"int32_t"
-.LASF3025:
+.LASF3027:
 	.string	"__exitcall_ebc_exit"
 .LASF1040:
 	.string	"nr_failed_migrations_running"
@@ -56947,7 +57020,7 @@ __exitcall_ebc_exit:
 	.string	"next_timer"
 .LASF741:
 	.string	"throttle_queue"
-.LASF3280:
+.LASF3282:
 	.string	"finish_wait"
 .LASF1480:
 	.string	"WORKINGSET_NODERECLAIM"
@@ -56957,7 +57030,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_REQ_RESUME"
 .LASF2045:
 	.string	"keyring_index_key"
-.LASF3156:
+.LASF3158:
 	.string	"ebc_tcon_disable"
 .LASF1421:
 	.string	"leases_enable"
@@ -56981,7 +57054,7 @@ __exitcall_ebc_exit:
 	.string	"lock_key"
 .LASF2563:
 	.string	"tramp_pg_dir"
-.LASF3018:
+.LASF3020:
 	.string	"dev_attr_ebc_version"
 .LASF864:
 	.string	"PCPU_FC_NR"
@@ -56999,7 +57072,7 @@ __exitcall_ebc_exit:
 	.string	"num_vf"
 .LASF1535:
 	.string	"isolate_mode_t"
-.LASF3163:
+.LASF3165:
 	.string	"debug_dma_sync_single_for_device"
 .LASF99:
 	.string	"llseek"
@@ -57033,7 +57106,7 @@ __exitcall_ebc_exit:
 	.string	"file_lock"
 .LASF325:
 	.string	"__idmap_text_end"
-.LASF2968:
+.LASF2970:
 	.string	"frame_total"
 .LASF776:
 	.string	"read_cntvct_el0"
@@ -57041,9 +57114,9 @@ __exitcall_ebc_exit:
 	.string	"target"
 .LASF2546:
 	.string	"HI_SOFTIRQ"
-.LASF3165:
+.LASF3167:
 	.string	"direction"
-.LASF3134:
+.LASF3136:
 	.string	"image_bg_data"
 .LASF958:
 	.string	"session_keyring"
@@ -57053,7 +57126,7 @@ __exitcall_ebc_exit:
 	.string	"key_restrict_link_func_t"
 .LASF1485:
 	.string	"NR_WRITEBACK"
-.LASF3120:
+.LASF3122:
 	.string	"frame_count"
 .LASF487:
 	.string	"s_maxbytes"
@@ -57067,7 +57140,7 @@ __exitcall_ebc_exit:
 	.string	"i2c_bus_type"
 .LASF885:
 	.string	"hrtimer_cpu_base"
-.LASF3292:
+.LASF3294:
 	.string	"ebc_notify"
 .LASF1391:
 	.string	"cb_head"
@@ -57095,7 +57168,7 @@ __exitcall_ebc_exit:
 	.string	"cpus_requested"
 .LASF2594:
 	.string	"__tracepoint_page_ref_mod_unless"
-.LASF3173:
+.LASF3175:
 	.string	"wake_lock_init"
 .LASF1186:
 	.string	"list_lru"
@@ -57111,7 +57184,7 @@ __exitcall_ebc_exit:
 	.string	"robust_list"
 .LASF1715:
 	.string	"quota_disable"
-.LASF3062:
+.LASF3064:
 	.string	"waveform_open"
 .LASF2056:
 	.string	"serial_node"
@@ -57121,7 +57194,7 @@ __exitcall_ebc_exit:
 	.string	"d_iput"
 .LASF108:
 	.string	"compat_ioctl"
-.LASF3181:
+.LASF3183:
 	.string	"__range_ok"
 .LASF287:
 	.string	"__start_ro_after_init"
@@ -57129,9 +57202,9 @@ __exitcall_ebc_exit:
 	.string	"num_poisoned_pages"
 .LASF905:
 	.string	"filter"
-.LASF3166:
+.LASF3168:
 	.string	"ebc_pmic_get_vcom"
-.LASF2945:
+.LASF2947:
 	.string	"ebc_tcon"
 .LASF2611:
 	.string	"sysctl_legacy_va_layout"
@@ -57215,13 +57288,13 @@ __exitcall_ebc_exit:
 	.string	"saved_sigmask"
 .LASF414:
 	.string	"d_time"
-.LASF2959:
+.LASF2961:
 	.string	"ebc_info"
 .LASF240:
 	.string	"entries"
 .LASF1001:
 	.string	"cpu_id"
-.LASF2952:
+.LASF2954:
 	.string	"dsp_mode_set"
 .LASF2652:
 	.string	"PGMAJFAULT"
@@ -57229,7 +57302,7 @@ __exitcall_ebc_exit:
 	.string	"__MAX_NR_ZONES"
 .LASF2464:
 	.string	"irq_fwspec"
-.LASF3012:
+.LASF3014:
 	.string	"waveform_ops"
 .LASF1805:
 	.string	"iov_iter"
@@ -57241,11 +57314,11 @@ __exitcall_ebc_exit:
 	.string	"power"
 .LASF266:
 	.string	"strict_mask"
-.LASF3279:
+.LASF3281:
 	.string	"init_wait_entry"
 .LASF2787:
 	.string	"module_state"
-.LASF3236:
+.LASF3238:
 	.string	"_dev_info"
 .LASF417:
 	.string	"d_subdirs"
@@ -57267,7 +57340,7 @@ __exitcall_ebc_exit:
 	.string	"wait_pidfd"
 .LASF1946:
 	.string	"s_umount_key"
-.LASF2929:
+.LASF2931:
 	.string	"xen_start_info"
 .LASF2458:
 	.string	"of_fwnode_ops"
@@ -57291,15 +57364,15 @@ __exitcall_ebc_exit:
 	.string	"removed_mem"
 .LASF248:
 	.string	"jump_label_t"
-.LASF3266:
+.LASF3268:
 	.string	"of_get_property"
-.LASF3147:
+.LASF3149:
 	.string	"ebc_tcon_frame_start"
 .LASF2712:
 	.string	"Elf64_Half"
 .LASF2287:
 	.string	"use_autosuspend"
-.LASF3026:
+.LASF3028:
 	.string	"ebc_init"
 .LASF675:
 	.string	"nsproxy"
@@ -57307,7 +57380,7 @@ __exitcall_ebc_exit:
 	.string	"can_wakeup"
 .LASF2547:
 	.string	"TIMER_SOFTIRQ"
-.LASF3125:
+.LASF3127:
 	.string	"temp_data"
 .LASF1215:
 	.string	"xol_area"
@@ -57333,15 +57406,15 @@ __exitcall_ebc_exit:
 	.string	"init_on_free"
 .LASF1152:
 	.string	"nr_pages"
-.LASF3142:
+.LASF3144:
 	.string	"ebc_power_set"
 .LASF1762:
 	.string	"num_trace_bprintk_fmt"
-.LASF3230:
+.LASF3232:
 	.string	"__fls"
 .LASF1130:
 	.string	"ioprio"
-.LASF2997:
+.LASF2999:
 	.string	"is_early_suspend"
 .LASF1164:
 	.string	"rdev"
@@ -57363,9 +57436,9 @@ __exitcall_ebc_exit:
 	.string	"persistent_clock_is_local"
 .LASF2414:
 	.string	"dma_supported"
-.LASF3198:
+.LASF3200:
 	.string	"dev_set_drvdata"
-.LASF3293:
+.LASF3295:
 	.string	"epd_lut_get"
 .LASF1536:
 	.string	"per_cpu_pages"
@@ -57401,7 +57474,7 @@ __exitcall_ebc_exit:
 	.string	"BLOCK_SOFTIRQ"
 .LASF1412:
 	.string	"files_stat_struct"
-.LASF3242:
+.LASF3244:
 	.string	"devm_memremap"
 .LASF844:
 	.string	"pgtable_t"
@@ -57413,13 +57486,13 @@ __exitcall_ebc_exit:
 	.string	"symlink"
 .LASF1575:
 	.string	"mem_map"
-.LASF3088:
+.LASF3090:
 	.string	"old_buffer"
-.LASF2955:
+.LASF2957:
 	.string	"lut_data_set"
 .LASF791:
 	.string	"sysctl_timer_migration"
-.LASF2915:
+.LASF2917:
 	.string	"DMA_NONE"
 .LASF1899:
 	.string	"fl_type"
@@ -57429,7 +57502,7 @@ __exitcall_ebc_exit:
 	.string	"WAKE_LOCK_SUSPEND"
 .LASF1778:
 	.string	"WRITE_LIFE_SHORT"
-.LASF3225:
+.LASF3227:
 	.string	"__swab32p"
 .LASF286:
 	.string	"_einittext"
@@ -57471,7 +57544,7 @@ __exitcall_ebc_exit:
 	.string	"rm_xquota"
 .LASF1085:
 	.string	"dl_timer"
-.LASF3275:
+.LASF3277:
 	.string	"remap_pfn_range"
 .LASF2376:
 	.string	"DL_DEV_NO_DRIVER"
@@ -57485,7 +57558,7 @@ __exitcall_ebc_exit:
 	.string	"watermark"
 .LASF2424:
 	.string	"deadprops"
-.LASF3238:
+.LASF3240:
 	.string	"devm_kmalloc"
 .LASF16:
 	.string	"long long unsigned int"
@@ -57515,7 +57588,7 @@ __exitcall_ebc_exit:
 	.string	"flc_lease"
 .LASF2407:
 	.string	"unmap_resource"
-.LASF2992:
+.LASF2994:
 	.string	"wake_lock_is_set"
 .LASF2359:
 	.string	"driver_private"
@@ -57561,7 +57634,7 @@ __exitcall_ebc_exit:
 	.string	"pstate_check_t"
 .LASF831:
 	.string	"system_freezable_power_efficient_wq"
-.LASF3030:
+.LASF3032:
 	.string	"__func__"
 .LASF57:
 	.string	"resource_size_t"
@@ -57591,7 +57664,7 @@ __exitcall_ebc_exit:
 	.string	"__kernel_clock_t"
 .LASF393:
 	.string	"nr_unused"
-.LASF2918:
+.LASF2920:
 	.string	"dma_address"
 .LASF2616:
 	.string	"mmap_rnd_compat_bits_max"
@@ -57611,15 +57684,15 @@ __exitcall_ebc_exit:
 	.string	"vregs"
 .LASF2625:
 	.string	"page_entry_size"
-.LASF2978:
+.LASF2980:
 	.string	"lut_data"
-.LASF3064:
+.LASF3066:
 	.string	"ebc_other_init"
 .LASF1447:
 	.string	"free_list"
 .LASF590:
 	.string	"prio"
-.LASF3190:
+.LASF3192:
 	.string	"platform_get_drvdata"
 .LASF2556:
 	.string	"NR_SOFTIRQS"
@@ -57641,7 +57714,7 @@ __exitcall_ebc_exit:
 	.string	"atomic_t"
 .LASF813:
 	.string	"WORK_OFFQ_FLAG_BITS"
-.LASF3148:
+.LASF3150:
 	.string	"ebc_tcon_image_addr_set"
 .LASF2532:
 	.string	"max_num_msgs"
@@ -57657,11 +57730,11 @@ __exitcall_ebc_exit:
 	.string	"short int"
 .LASF2355:
 	.string	"of_device_id"
-.LASF2916:
+.LASF2918:
 	.string	"scatterlist"
 .LASF1268:
 	.string	"altmap_valid"
-.LASF3295:
+.LASF3297:
 	.string	"down"
 .LASF102:
 	.string	"read_iter"
@@ -57699,7 +57772,7 @@ __exitcall_ebc_exit:
 	.string	"pm_domain_data"
 .LASF2488:
 	.string	"byte"
-.LASF3261:
+.LASF3263:
 	.string	"__wake_up_sync"
 .LASF2003:
 	.string	"poll_table_struct"
@@ -57709,11 +57782,11 @@ __exitcall_ebc_exit:
 	.string	"current_may_mount"
 .LASF382:
 	.string	"seqlock_t"
-.LASF2947:
+.LASF2949:
 	.string	"hclk"
 .LASF2116:
 	.string	"kernfs_iattrs"
-.LASF2909:
+.LASF2911:
 	.string	"pmic_get_vcom"
 .LASF627:
 	.string	"sched_migrated"
@@ -57725,7 +57798,7 @@ __exitcall_ebc_exit:
 	.string	"page_fault"
 .LASF1470:
 	.string	"NR_INACTIVE_FILE"
-.LASF3214:
+.LASF3216:
 	.string	"__ret_warn_on"
 .LASF1626:
 	.string	"kqid"
@@ -57805,7 +57878,7 @@ __exitcall_ebc_exit:
 	.string	"__irqentry_text_end"
 .LASF1347:
 	.string	"context"
-.LASF3119:
+.LASF3121:
 	.string	"get_overlay_image"
 .LASF1541:
 	.string	"per_cpu_nodestat"
@@ -57817,7 +57890,7 @@ __exitcall_ebc_exit:
 	.string	"thread_id"
 .LASF733:
 	.string	"default_timer_slack_ns"
-.LASF3060:
+.LASF3062:
 	.string	"waveform_version_read"
 .LASF1768:
 	.string	"source_list"
@@ -57847,7 +57920,7 @@ __exitcall_ebc_exit:
 	.string	"of_match_table"
 .LASF2579:
 	.string	"percpu_count_ptr"
-.LASF3276:
+.LASF3278:
 	.string	"ebc_phy_buf_base_get"
 .LASF2080:
 	.string	"loops_per_jiffy"
@@ -57859,7 +57932,7 @@ __exitcall_ebc_exit:
 	.string	"uuid_t"
 .LASF2438:
 	.string	"property_read_int_array"
-.LASF2981:
+.LASF2983:
 	.string	"auto_image_old"
 .LASF1861:
 	.string	"setattr2"
@@ -57869,7 +57942,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_INODESTEAL"
 .LASF1176:
 	.string	"count_objects"
-.LASF3229:
+.LASF3231:
 	.string	"fls64"
 .LASF922:
 	.string	"_stime"
@@ -57887,9 +57960,9 @@ __exitcall_ebc_exit:
 	.string	"atomic_notifier_head"
 .LASF1061:
 	.string	"statistics"
-.LASF2936:
+.LASF2938:
 	.string	"current_buffer"
-.LASF3116:
+.LASF3118:
 	.string	"direct_mode_data_change"
 .LASF1619:
 	.string	"kprojid_t"
@@ -57905,15 +57978,15 @@ __exitcall_ebc_exit:
 	.string	"sync_sg_for_device"
 .LASF1965:
 	.string	"statfs"
-.LASF3256:
+.LASF3258:
 	.string	"__kmalloc"
-.LASF3245:
+.LASF3247:
 	.string	"_dev_err"
-.LASF3235:
+.LASF3237:
 	.string	"__platform_driver_register"
-.LASF2963:
+.LASF2965:
 	.string	"ebc_buf_real_size"
-.LASF3007:
+.LASF3009:
 	.string	"ebc_thread_wq"
 .LASF1795:
 	.string	"migratepage"
@@ -57921,7 +57994,7 @@ __exitcall_ebc_exit:
 	.string	"DROP_PAGECACHE"
 .LASF793:
 	.string	"work_struct"
-.LASF2898:
+.LASF2900:
 	.string	"height"
 .LASF1095:
 	.string	"task_group"
@@ -57963,7 +58036,7 @@ __exitcall_ebc_exit:
 	.string	"max_comb_1st_msg_len"
 .LASF1546:
 	.string	"ZONE_MOVABLE"
-.LASF3011:
+.LASF3013:
 	.string	"ebc_misc"
 .LASF2393:
 	.string	"revmap_size"
@@ -57995,7 +58068,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_PENDING_BIT"
 .LASF721:
 	.string	"rseq"
-.LASF3127:
+.LASF3129:
 	.string	"get_auto_image"
 .LASF196:
 	.string	"nfds"
@@ -58009,17 +58082,17 @@ __exitcall_ebc_exit:
 	.string	"i_acl"
 .LASF1790:
 	.string	"bmap"
-.LASF3243:
+.LASF3245:
 	.string	"ebc_buf_init"
 .LASF2049:
 	.string	"key_payload"
-.LASF2984:
+.LASF2986:
 	.string	"auto_image_osd"
 .LASF481:
 	.string	"d_real"
 .LASF2561:
 	.string	"swapper_pg_end"
-.LASF3015:
+.LASF3017:
 	.string	"dev_attr_pmic_name"
 .LASF632:
 	.string	"in_user_fault"
@@ -58049,7 +58122,7 @@ __exitcall_ebc_exit:
 	.string	"fallocate"
 .LASF1708:
 	.string	"i_spc_warnlimit"
-.LASF3215:
+.LASF3217:
 	.string	"check_object_size"
 .LASF1516:
 	.string	"node_present_pages"
@@ -58099,23 +58172,21 @@ __exitcall_ebc_exit:
 	.string	"__idmap_text_start"
 .LASF1717:
 	.string	"set_info"
-.LASF3066:
+.LASF3068:
 	.string	"ebc_mmap"
 .LASF2620:
 	.string	"sysctl_admin_reserve_kbytes"
 .LASF789:
 	.string	"timer_list"
-.LASF3024:
-	.string	"__addressable_ebc_init2570"
 .LASF1685:
 	.string	"d_ino_warns"
 .LASF2501:
 	.string	"lock_ops"
 .LASF1327:
 	.string	"hiwater_vm"
-.LASF3057:
+.LASF3059:
 	.string	"pmic_vcom_read"
-.LASF3237:
+.LASF3239:
 	.string	"misc_deregister"
 .LASF1249:
 	.string	"compound_head"
@@ -58135,7 +58206,7 @@ __exitcall_ebc_exit:
 	.string	"bd_write_holder"
 .LASF2195:
 	.string	"poweroff_noirq"
-.LASF3240:
+.LASF3242:
 	.string	"of_parse_phandle"
 .LASF1859:
 	.string	"rename"
@@ -58155,9 +58226,9 @@ __exitcall_ebc_exit:
 	.string	"i_rt_spc_timelimit"
 .LASF140:
 	.string	"oops_in_progress"
-.LASF3010:
+.LASF3012:
 	.string	"ebc_ops"
-.LASF3039:
+.LASF3041:
 	.string	"klogo_addr"
 .LASF1652:
 	.string	"qf_next"
@@ -58165,10 +58236,12 @@ __exitcall_ebc_exit:
 	.string	"sync_single_for_cpu"
 .LASF794:
 	.string	"data"
-.LASF3183:
+.LASF3185:
 	.string	"kzalloc"
-.LASF3208:
+.LASF3210:
 	.string	"msecs_to_jiffies"
+.LASF3026:
+	.string	"__addressable_ebc_init2592"
 .LASF1920:
 	.string	"lm_break"
 .LASF1220:
@@ -58181,7 +58254,7 @@ __exitcall_ebc_exit:
 	.string	"personality"
 .LASF1826:
 	.string	"bd_queue"
-.LASF3027:
+.LASF3029:
 	.string	"ebc_resume"
 .LASF2830:
 	.string	"init_task"
@@ -58203,7 +58276,7 @@ __exitcall_ebc_exit:
 	.string	"signed char"
 .LASF376:
 	.string	"rcu_scheduler_active"
-.LASF3193:
+.LASF3195:
 	.string	"propname"
 .LASF2102:
 	.string	"priv"
@@ -58257,7 +58330,7 @@ __exitcall_ebc_exit:
 	.string	"arch"
 .LASF2262:
 	.string	"no_pm"
-.LASF2896:
+.LASF2898:
 	.string	"ebc_buf_info"
 .LASF937:
 	.string	"_kill"
@@ -58283,7 +58356,7 @@ __exitcall_ebc_exit:
 	.string	"sve_vl"
 .LASF2655:
 	.string	"PGSTEAL_KSWAPD"
-.LASF3041:
+.LASF3043:
 	.string	"klogo_addr_valid"
 .LASF2603:
 	.string	"MEMORY_DEVICE_PUBLIC"
@@ -58329,7 +58402,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_GCC16"
 .LASF2515:
 	.string	"i2c_lock_operations"
-.LASF3144:
+.LASF3146:
 	.string	"ebc_get_4pix_wf_part"
 .LASF1621:
 	.string	"USRQUOTA"
@@ -58337,7 +58410,7 @@ __exitcall_ebc_exit:
 	.string	"description"
 .LASF2798:
 	.string	"symtab"
-.LASF2920:
+.LASF2922:
 	.string	"sg_table"
 .LASF1125:
 	.string	"rt_mutex_waiter"
@@ -58351,7 +58424,7 @@ __exitcall_ebc_exit:
 	.string	"in_iowait"
 .LASF2587:
 	.string	"unregfunc"
-.LASF2906:
+.LASF2908:
 	.string	"pmic_pm_suspend"
 .LASF1105:
 	.string	"egid"
@@ -58375,9 +58448,9 @@ __exitcall_ebc_exit:
 	.string	"f_inode"
 .LASF2032:
 	.string	"procname"
-.LASF3124:
+.LASF3126:
 	.string	"point_data"
-.LASF3247:
+.LASF3249:
 	.string	"epd_lut_from_file_init"
 .LASF1670:
 	.string	"mark_dirty"
@@ -58401,21 +58474,21 @@ __exitcall_ebc_exit:
 	.string	"__kernel_clockid_t"
 .LASF686:
 	.string	"seccomp"
-.LASF3079:
+.LASF3081:
 	.string	"ebc_rst_panel"
 .LASF1792:
 	.string	"releasepage"
 .LASF1703:
 	.string	"qc_info"
-.LASF3080:
+.LASF3082:
 	.string	"ebc_thread"
-.LASF3094:
+.LASF3096:
 	.string	"pbuf_old"
 .LASF2890:
 	.string	"EPD_A2_ENTER"
 .LASF1504:
 	.string	"recent_scanned"
-.LASF2938:
+.LASF2940:
 	.string	"vir_height"
 .LASF1744:
 	.string	"core_layout"
@@ -58427,7 +58500,7 @@ __exitcall_ebc_exit:
 	.string	"win_y1"
 .LASF2872:
 	.string	"win_y2"
-.LASF3089:
+.LASF3091:
 	.string	"buf_size"
 .LASF2089:
 	.string	"bitmap"
@@ -58467,11 +58540,11 @@ __exitcall_ebc_exit:
 	.string	"MIGRATE_SYNC_LIGHT"
 .LASF1038:
 	.string	"nr_migrations_cold"
-.LASF3055:
+.LASF3057:
 	.string	"ebc_version_read"
 .LASF304:
 	.string	"__end_once"
-.LASF2924:
+.LASF2926:
 	.string	"dma_noncoherent_ops"
 .LASF1506:
 	.string	"lists"
@@ -58487,7 +58560,7 @@ __exitcall_ebc_exit:
 	.string	"inactive_age"
 .LASF2604:
 	.string	"MEMORY_DEVICE_FS_DAX"
-.LASF2969:
+.LASF2971:
 	.string	"frame_bw_total"
 .LASF2796:
 	.string	"ro_after_init_size"
@@ -58531,7 +58604,7 @@ __exitcall_ebc_exit:
 	.string	"percpu_size"
 .LASF1324:
 	.string	"mmap_sem"
-.LASF3277:
+.LASF3279:
 	.string	"schedule"
 .LASF2443:
 	.string	"get_reference_args"
@@ -58591,7 +58664,7 @@ __exitcall_ebc_exit:
 	.string	"ki_flags"
 .LASF1392:
 	.string	"gp_type"
-.LASF2972:
+.LASF2974:
 	.string	"part_mode_count"
 .LASF401:
 	.string	"d_in_lookup_hash"
@@ -58617,7 +58690,7 @@ __exitcall_ebc_exit:
 	.string	"lock_stat"
 .LASF2395:
 	.string	"revmap_tree_mutex"
-.LASF3059:
+.LASF3061:
 	.string	"pmic_name_read"
 .LASF1080:
 	.string	"dl_throttled"
@@ -58637,7 +58710,7 @@ __exitcall_ebc_exit:
 	.string	"restore_noirq"
 .LASF1428:
 	.string	"ki_filp"
-.LASF3118:
+.LASF3120:
 	.string	"clac_full_data_align16"
 .LASF1113:
 	.string	"cap_ambient"
@@ -58645,7 +58718,7 @@ __exitcall_ebc_exit:
 	.string	"dma_configure"
 .LASF2293:
 	.string	"runtime_error"
-.LASF3070:
+.LASF3072:
 	.string	"temp_offset"
 .LASF950:
 	.string	"__count"
@@ -58659,7 +58732,7 @@ __exitcall_ebc_exit:
 	.string	"PROBE_DEFAULT_STRATEGY"
 .LASF2747:
 	.string	"elemsize"
-.LASF3108:
+.LASF3110:
 	.string	"clac_part_data_align16"
 .LASF892:
 	.string	"nr_events"
@@ -58673,7 +58746,7 @@ __exitcall_ebc_exit:
 	.string	"text_size"
 .LASF1654:
 	.string	"stat"
-.LASF2988:
+.LASF2990:
 	.string	"lut_ddr_vir"
 .LASF1322:
 	.string	"map_count"
@@ -58687,7 +58760,7 @@ __exitcall_ebc_exit:
 	.string	"uid_keyring"
 .LASF726:
 	.string	"splice_pipe"
-.LASF3098:
+.LASF3100:
 	.string	"frame_done_callback"
 .LASF1801:
 	.string	"error_remove_page"
@@ -58733,7 +58806,7 @@ __exitcall_ebc_exit:
 	.string	"compound_mapcount"
 .LASF1450:
 	.string	"zone_stat_item"
-.LASF3185:
+.LASF3187:
 	.string	"kmalloc_large"
 .LASF2627:
 	.string	"PE_SIZE_PMD"
@@ -58771,7 +58844,7 @@ __exitcall_ebc_exit:
 	.string	"gp_count"
 .LASF2052:
 	.string	"key_restriction"
-.LASF3086:
+.LASF3088:
 	.string	"check_part_mode"
 .LASF619:
 	.string	"exit_state"
@@ -58803,9 +58876,9 @@ __exitcall_ebc_exit:
 	.string	"fs_supers"
 .LASF1132:
 	.string	"last_waited"
-.LASF3065:
+.LASF3067:
 	.string	"ebc_open"
-.LASF3154:
+.LASF3156:
 	.string	"three_win_mode"
 .LASF2875:
 	.string	"EPD_OVERLAY"
@@ -58813,7 +58886,7 @@ __exitcall_ebc_exit:
 	.string	"dqb_bsoftlimit"
 .LASF219:
 	.string	"pending"
-.LASF2985:
+.LASF2987:
 	.string	"direct_buffer"
 .LASF2493:
 	.string	"i2c_client_type"
@@ -58839,7 +58912,7 @@ __exitcall_ebc_exit:
 	.string	"pt_mm"
 .LASF1505:
 	.string	"lruvec"
-.LASF2902:
+.LASF2904:
 	.string	"ebc_pmic"
 .LASF14:
 	.string	"long long int"
@@ -58857,7 +58930,7 @@ __exitcall_ebc_exit:
 	.string	"timer_expires"
 .LASF2828:
 	.string	"mmlist_lock"
-.LASF3171:
+.LASF3173:
 	.string	"ebc_pmic_power_on"
 .LASF1766:
 	.string	"trace_evals"
@@ -58899,7 +58972,7 @@ __exitcall_ebc_exit:
 	.string	"relax_count"
 .LASF1414:
 	.string	"nr_free_files"
-.LASF3184:
+.LASF3186:
 	.string	"kmalloc"
 	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
 	.section	.note.GNU-stack,"",@progbits

commit c2276d585654e8d573366c29c565043ec36adf63
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Sun Sep 26 13:39:49 2021 +0200

    Linux 4.19.208
    
    Link: https://lore.kernel.org/r/20210924124329.965218583@linuxfoundation.org
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Link: https://lore.kernel.org/r/20210924124329.965218583@linuxfoundation.org
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Tested-by: Hulk Robot <hulkrobot@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index 77dd62aa0bbe..a4c252640983 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 207
+SUBLEVEL = 208
 EXTRAVERSION =
 NAME = "People's Front"
 

commit c512154854e2dd00c3cc373dc33201bfe6638a75
Author: Guenter Roeck <linux@roeck-us.net>
Date:   Wed Sep 8 12:08:17 2021 -0700

    drm/nouveau/nvkm: Replace -ENOSYS with -ENODEV
    
    commit e8f71f89236ef82d449991bfbc237e3cb6ea584f upstream.
    
    nvkm test builds fail with the following error.
    
      drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c: In function 'nvkm_control_mthd_pstate_info':
      drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c:60:35: error: overflow in conversion from 'int' to '__s8' {aka 'signed char'} changes value from '-251' to '5'
    
    The code builds on most architectures, but fails on parisc where ENOSYS
    is defined as 251.
    
    Replace the error code with -ENODEV (-19).  The actual error code does
    not really matter and is not passed to userspace - it just has to be
    negative.
    
    Fixes: 7238eca4cf18 ("drm/nouveau: expose pstate selection per-power source in sysfs")
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Cc: Ben Skeggs <bskeggs@redhat.com>
    Cc: David Airlie <airlied@linux.ie>
    Cc: Daniel Vetter <daniel@ffwll.ch>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c b/drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c
index b0ece71aefde..ce774579c89d 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c
@@ -57,7 +57,7 @@ nvkm_control_mthd_pstate_info(struct nvkm_control *ctrl, void *data, u32 size)
 		args->v0.count = 0;
 		args->v0.ustate_ac = NVIF_CONTROL_PSTATE_INFO_V0_USTATE_DISABLE;
 		args->v0.ustate_dc = NVIF_CONTROL_PSTATE_INFO_V0_USTATE_DISABLE;
-		args->v0.pwrsrc = -ENOSYS;
+		args->v0.pwrsrc = -ENODEV;
 		args->v0.pstate = NVIF_CONTROL_PSTATE_INFO_V0_PSTATE_UNKNOWN;
 	}
 

commit 8936b8ef85ecb5685f9b9656b4904b95c7362dac
Author: Li Jinlin <lijinlin3@huawei.com>
Date:   Tue Sep 7 20:12:42 2021 +0800

    blk-throttle: fix UAF by deleteing timer in blk_throtl_exit()
    
    [ Upstream commit 884f0e84f1e3195b801319c8ec3d5774e9bf2710 ]
    
    The pending timer has been set up in blk_throtl_init(). However, the
    timer is not deleted in blk_throtl_exit(). This means that the timer
    handler may still be running after freeing the timer, which would
    result in a use-after-free.
    
    Fix by calling del_timer_sync() to delete the timer in blk_throtl_exit().
    
    Signed-off-by: Li Jinlin <lijinlin3@huawei.com>
    Link: https://lore.kernel.org/r/20210907121242.2885564-1-lijinlin3@huawei.com
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/block/blk-throttle.c b/block/blk-throttle.c
index caee658609d7..853b1770df36 100644
--- a/block/blk-throttle.c
+++ b/block/blk-throttle.c
@@ -2437,6 +2437,7 @@ int blk_throtl_init(struct request_queue *q)
 void blk_throtl_exit(struct request_queue *q)
 {
 	BUG_ON(!q->td);
+	del_timer_sync(&q->td->service_queue.pending_timer);
 	throtl_shutdown_wq(q);
 	blkcg_deactivate_policy(q, &blkcg_policy_throtl);
 	free_percpu(q->td->latency_buckets[READ]);

commit f7ca7b67a07e550c30f43a732c17a324614de377
Author: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Date:   Wed Jul 7 18:27:53 2021 +0200

    pwm: stm32-lp: Don't modify HW state in .remove() callback
    
    [ Upstream commit d44084c93427bb0a9261432db1a8ca76a42d805e ]
    
    A consumer is expected to disable a PWM before calling pwm_put(). And if
    they didn't there is hopefully a good reason (or the consumer needs
    fixing). Also if disabling an enabled PWM was the right thing to do,
    this should better be done in the framework instead of in each low level
    driver.
    
    Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
    Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pwm/pwm-stm32-lp.c b/drivers/pwm/pwm-stm32-lp.c
index 28e1f6413476..e92a14007422 100644
--- a/drivers/pwm/pwm-stm32-lp.c
+++ b/drivers/pwm/pwm-stm32-lp.c
@@ -224,8 +224,6 @@ static int stm32_pwm_lp_remove(struct platform_device *pdev)
 {
 	struct stm32_pwm_lp *priv = platform_get_drvdata(pdev);
 
-	pwm_disable(&priv->chip.pwms[0]);
-
 	return pwmchip_remove(&priv->chip);
 }
 

commit 663b066293c946f9a50d61829329e2ef84d04b05
Author: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Date:   Wed Jul 7 18:27:52 2021 +0200

    pwm: rockchip: Don't modify HW state in .remove() callback
    
    [ Upstream commit 9d768cd7fd42bb0be16f36aec48548fca5260759 ]
    
    A consumer is expected to disable a PWM before calling pwm_put(). And if
    they didn't there is hopefully a good reason (or the consumer needs
    fixing). Also if disabling an enabled PWM was the right thing to do,
    this should better be done in the framework instead of in each low level
    driver.
    
    Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
    Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pwm/pwm-rockchip.c b/drivers/pwm/pwm-rockchip.c
index 48bcc853d57a..cf34fb00c054 100644
--- a/drivers/pwm/pwm-rockchip.c
+++ b/drivers/pwm/pwm-rockchip.c
@@ -392,20 +392,6 @@ static int rockchip_pwm_remove(struct platform_device *pdev)
 {
 	struct rockchip_pwm_chip *pc = platform_get_drvdata(pdev);
 
-	/*
-	 * Disable the PWM clk before unpreparing it if the PWM device is still
-	 * running. This should only happen when the last PWM user left it
-	 * enabled, or when nobody requested a PWM that was previously enabled
-	 * by the bootloader.
-	 *
-	 * FIXME: Maybe the core should disable all PWM devices in
-	 * pwmchip_remove(). In this case we'd only have to call
-	 * clk_unprepare() after pwmchip_remove().
-	 *
-	 */
-	if (pwm_is_enabled(pc->chip.pwms))
-		clk_disable(pc->clk);
-
 	clk_unprepare(pc->pclk);
 	clk_unprepare(pc->clk);
 

commit 86fa9b63b549f97c43682cfc02e2076ac9b3d5ca
Author: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Date:   Wed Jul 7 18:27:51 2021 +0200

    pwm: img: Don't modify HW state in .remove() callback
    
    [ Upstream commit c68eb29c8e9067c08175dd0414f6984f236f719d ]
    
    A consumer is expected to disable a PWM before calling pwm_put(). And if
    they didn't there is hopefully a good reason (or the consumer needs
    fixing). Also if disabling an enabled PWM was the right thing to do,
    this should better be done in the framework instead of in each low level
    driver.
    
    Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
    Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pwm/pwm-img.c b/drivers/pwm/pwm-img.c
index 3b0a097ce2ab..6111e8848b07 100644
--- a/drivers/pwm/pwm-img.c
+++ b/drivers/pwm/pwm-img.c
@@ -332,23 +332,7 @@ static int img_pwm_probe(struct platform_device *pdev)
 static int img_pwm_remove(struct platform_device *pdev)
 {
 	struct img_pwm_chip *pwm_chip = platform_get_drvdata(pdev);
-	u32 val;
-	unsigned int i;
-	int ret;
-
-	ret = pm_runtime_get_sync(&pdev->dev);
-	if (ret < 0) {
-		pm_runtime_put(&pdev->dev);
-		return ret;
-	}
-
-	for (i = 0; i < pwm_chip->chip.npwm; i++) {
-		val = img_pwm_readl(pwm_chip, PWM_CTRL_CFG);
-		val &= ~BIT(i);
-		img_pwm_writel(pwm_chip, PWM_CTRL_CFG, val);
-	}
 
-	pm_runtime_put(&pdev->dev);
 	pm_runtime_disable(&pdev->dev);
 	if (!pm_runtime_status_suspended(&pdev->dev))
 		img_pwm_runtime_suspend(&pdev->dev);

commit 546076c98733abd0383d4a08b3434863208f4f1c
Author: Nanyong Sun <sunnanyong@huawei.com>
Date:   Tue Sep 7 20:00:23 2021 -0700

    nilfs2: fix memory leak in nilfs_sysfs_delete_snapshot_group
    
    [ Upstream commit 17243e1c3072b8417a5ebfc53065d0a87af7ca77 ]
    
    kobject_put() should be used to cleanup the memory associated with the
    kobject instead of kobject_del().  See the section "Kobject removal" of
    "Documentation/core-api/kobject.rst".
    
    Link: https://lkml.kernel.org/r/20210629022556.3985106-7-sunnanyong@huawei.com
    Link: https://lkml.kernel.org/r/1625651306-10829-7-git-send-email-konishi.ryusuke@gmail.com
    Signed-off-by: Nanyong Sun <sunnanyong@huawei.com>
    Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/nilfs2/sysfs.c b/fs/nilfs2/sysfs.c
index 6c92ac314b06..28a2db3b1787 100644
--- a/fs/nilfs2/sysfs.c
+++ b/fs/nilfs2/sysfs.c
@@ -215,7 +215,7 @@ int nilfs_sysfs_create_snapshot_group(struct nilfs_root *root)
 
 void nilfs_sysfs_delete_snapshot_group(struct nilfs_root *root)
 {
-	kobject_del(&root->snapshot_kobj);
+	kobject_put(&root->snapshot_kobj);
 }
 
 /************************************************************************

commit c55c9e1f56d4ba3f669d25a8d9a27f6f21b320e2
Author: Nanyong Sun <sunnanyong@huawei.com>
Date:   Tue Sep 7 20:00:21 2021 -0700

    nilfs2: fix memory leak in nilfs_sysfs_create_snapshot_group
    
    [ Upstream commit b2fe39c248f3fa4bbb2a20759b4fdd83504190f7 ]
    
    If kobject_init_and_add returns with error, kobject_put() is needed here
    to avoid memory leak, because kobject_init_and_add may return error
    without freeing the memory associated with the kobject it allocated.
    
    Link: https://lkml.kernel.org/r/20210629022556.3985106-6-sunnanyong@huawei.com
    Link: https://lkml.kernel.org/r/1625651306-10829-6-git-send-email-konishi.ryusuke@gmail.com
    Signed-off-by: Nanyong Sun <sunnanyong@huawei.com>
    Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/nilfs2/sysfs.c b/fs/nilfs2/sysfs.c
index 195f42192a15..6c92ac314b06 100644
--- a/fs/nilfs2/sysfs.c
+++ b/fs/nilfs2/sysfs.c
@@ -208,9 +208,9 @@ int nilfs_sysfs_create_snapshot_group(struct nilfs_root *root)
 	}
 
 	if (err)
-		return err;
+		kobject_put(&root->snapshot_kobj);
 
-	return 0;
+	return err;
 }
 
 void nilfs_sysfs_delete_snapshot_group(struct nilfs_root *root)

commit a37b7ae1ec75a62e0a0bf8c75d5df24aa087842b
Author: Nanyong Sun <sunnanyong@huawei.com>
Date:   Tue Sep 7 20:00:18 2021 -0700

    nilfs2: fix memory leak in nilfs_sysfs_delete_##name##_group
    
    [ Upstream commit a3e181259ddd61fd378390977a1e4e2316853afa ]
    
    The kobject_put() should be used to cleanup the memory associated with the
    kobject instead of kobject_del.  See the section "Kobject removal" of
    "Documentation/core-api/kobject.rst".
    
    Link: https://lkml.kernel.org/r/20210629022556.3985106-5-sunnanyong@huawei.com
    Link: https://lkml.kernel.org/r/1625651306-10829-5-git-send-email-konishi.ryusuke@gmail.com
    Signed-off-by: Nanyong Sun <sunnanyong@huawei.com>
    Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/nilfs2/sysfs.c b/fs/nilfs2/sysfs.c
index 31d640a87b59..195f42192a15 100644
--- a/fs/nilfs2/sysfs.c
+++ b/fs/nilfs2/sysfs.c
@@ -97,7 +97,7 @@ static int nilfs_sysfs_create_##name##_group(struct the_nilfs *nilfs) \
 } \
 static void nilfs_sysfs_delete_##name##_group(struct the_nilfs *nilfs) \
 { \
-	kobject_del(&nilfs->ns_##parent_name##_subgroups->sg_##name##_kobj); \
+	kobject_put(&nilfs->ns_##parent_name##_subgroups->sg_##name##_kobj); \
 }
 
 /************************************************************************

commit 26a7357ddcb7ecaf8b5528ec14c1f672e481e3b4
Author: Nanyong Sun <sunnanyong@huawei.com>
Date:   Tue Sep 7 20:00:15 2021 -0700

    nilfs2: fix memory leak in nilfs_sysfs_create_##name##_group
    
    [ Upstream commit 24f8cb1ed057c840728167dab33b32e44147c86f ]
    
    If kobject_init_and_add return with error, kobject_put() is needed here to
    avoid memory leak, because kobject_init_and_add may return error without
    freeing the memory associated with the kobject it allocated.
    
    Link: https://lkml.kernel.org/r/20210629022556.3985106-4-sunnanyong@huawei.com
    Link: https://lkml.kernel.org/r/1625651306-10829-4-git-send-email-konishi.ryusuke@gmail.com
    Signed-off-by: Nanyong Sun <sunnanyong@huawei.com>
    Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/nilfs2/sysfs.c b/fs/nilfs2/sysfs.c
index ca720d958315..31d640a87b59 100644
--- a/fs/nilfs2/sysfs.c
+++ b/fs/nilfs2/sysfs.c
@@ -92,8 +92,8 @@ static int nilfs_sysfs_create_##name##_group(struct the_nilfs *nilfs) \
 	err = kobject_init_and_add(kobj, &nilfs_##name##_ktype, parent, \
 				    #name); \
 	if (err) \
-		return err; \
-	return 0; \
+		kobject_put(kobj); \
+	return err; \
 } \
 static void nilfs_sysfs_delete_##name##_group(struct the_nilfs *nilfs) \
 { \

commit 28c1f8fa5c989dee8457cee8db719e0a1f951d87
Author: Nanyong Sun <sunnanyong@huawei.com>
Date:   Tue Sep 7 20:00:12 2021 -0700

    nilfs2: fix NULL pointer in nilfs_##name##_attr_release
    
    [ Upstream commit dbc6e7d44a514f231a64d9d5676e001b660b6448 ]
    
    In nilfs_##name##_attr_release, kobj->parent should not be referenced
    because it is a NULL pointer.  The release() method of kobject is always
    called in kobject_put(kobj), in the implementation of kobject_put(), the
    kobj->parent will be assigned as NULL before call the release() method.
    So just use kobj to get the subgroups, which is more efficient and can fix
    a NULL pointer reference problem.
    
    Link: https://lkml.kernel.org/r/20210629022556.3985106-3-sunnanyong@huawei.com
    Link: https://lkml.kernel.org/r/1625651306-10829-3-git-send-email-konishi.ryusuke@gmail.com
    Signed-off-by: Nanyong Sun <sunnanyong@huawei.com>
    Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/nilfs2/sysfs.c b/fs/nilfs2/sysfs.c
index cbfc132206e8..ca720d958315 100644
--- a/fs/nilfs2/sysfs.c
+++ b/fs/nilfs2/sysfs.c
@@ -64,11 +64,9 @@ static const struct sysfs_ops nilfs_##name##_attr_ops = { \
 #define NILFS_DEV_INT_GROUP_TYPE(name, parent_name) \
 static void nilfs_##name##_attr_release(struct kobject *kobj) \
 { \
-	struct nilfs_sysfs_##parent_name##_subgroups *subgroups; \
-	struct the_nilfs *nilfs = container_of(kobj->parent, \
-						struct the_nilfs, \
-						ns_##parent_name##_kobj); \
-	subgroups = nilfs->ns_##parent_name##_subgroups; \
+	struct nilfs_sysfs_##parent_name##_subgroups *subgroups = container_of(kobj, \
+						struct nilfs_sysfs_##parent_name##_subgroups, \
+						sg_##name##_kobj); \
 	complete(&subgroups->sg_##name##_kobj_unregister); \
 } \
 static struct kobj_type nilfs_##name##_ktype = { \

commit 7b213dcbd104262109bbd0ead1e4f43e36aa65c4
Author: Nanyong Sun <sunnanyong@huawei.com>
Date:   Tue Sep 7 20:00:09 2021 -0700

    nilfs2: fix memory leak in nilfs_sysfs_create_device_group
    
    [ Upstream commit 5f5dec07aca7067216ed4c1342e464e7307a9197 ]
    
    Patch series "nilfs2: fix incorrect usage of kobject".
    
    This patchset from Nanyong Sun fixes memory leak issues and a NULL
    pointer dereference issue caused by incorrect usage of kboject in nilfs2
    sysfs implementation.
    
    This patch (of 6):
    
    Reported by syzkaller:
    
      BUG: memory leak
      unreferenced object 0xffff888100ca8988 (size 8):
      comm "syz-executor.1", pid 1930, jiffies 4294745569 (age 18.052s)
      hex dump (first 8 bytes):
      6c 6f 6f 70 31 00 ff ff loop1...
      backtrace:
        kstrdup+0x36/0x70 mm/util.c:60
        kstrdup_const+0x35/0x60 mm/util.c:83
        kvasprintf_const+0xf1/0x180 lib/kasprintf.c:48
        kobject_set_name_vargs+0x56/0x150 lib/kobject.c:289
        kobject_add_varg lib/kobject.c:384 [inline]
        kobject_init_and_add+0xc9/0x150 lib/kobject.c:473
        nilfs_sysfs_create_device_group+0x150/0x7d0 fs/nilfs2/sysfs.c:986
        init_nilfs+0xa21/0xea0 fs/nilfs2/the_nilfs.c:637
        nilfs_fill_super fs/nilfs2/super.c:1046 [inline]
        nilfs_mount+0x7b4/0xe80 fs/nilfs2/super.c:1316
        legacy_get_tree+0x105/0x210 fs/fs_context.c:592
        vfs_get_tree+0x8e/0x2d0 fs/super.c:1498
        do_new_mount fs/namespace.c:2905 [inline]
        path_mount+0xf9b/0x1990 fs/namespace.c:3235
        do_mount+0xea/0x100 fs/namespace.c:3248
        __do_sys_mount fs/namespace.c:3456 [inline]
        __se_sys_mount fs/namespace.c:3433 [inline]
        __x64_sys_mount+0x14b/0x1f0 fs/namespace.c:3433
        do_syscall_x64 arch/x86/entry/common.c:50 [inline]
        do_syscall_64+0x3b/0x90 arch/x86/entry/common.c:80
        entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    If kobject_init_and_add return with error, then the cleanup of kobject
    is needed because memory may be allocated in kobject_init_and_add
    without freeing.
    
    And the place of cleanup_dev_kobject should use kobject_put to free the
    memory associated with the kobject.  As the section "Kobject removal" of
    "Documentation/core-api/kobject.rst" says, kobject_del() just makes the
    kobject "invisible", but it is not cleaned up.  And no more cleanup will
    do after cleanup_dev_kobject, so kobject_put is needed here.
    
    Link: https://lkml.kernel.org/r/1625651306-10829-1-git-send-email-konishi.ryusuke@gmail.com
    Link: https://lkml.kernel.org/r/1625651306-10829-2-git-send-email-konishi.ryusuke@gmail.com
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Link: https://lkml.kernel.org/r/20210629022556.3985106-2-sunnanyong@huawei.com
    Signed-off-by: Nanyong Sun <sunnanyong@huawei.com>
    Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/nilfs2/sysfs.c b/fs/nilfs2/sysfs.c
index c6c8a33c81d5..cbfc132206e8 100644
--- a/fs/nilfs2/sysfs.c
+++ b/fs/nilfs2/sysfs.c
@@ -1000,7 +1000,7 @@ int nilfs_sysfs_create_device_group(struct super_block *sb)
 	err = kobject_init_and_add(&nilfs->ns_dev_kobj, &nilfs_dev_ktype, NULL,
 				    "%s", sb->s_id);
 	if (err)
-		goto free_dev_subgroups;
+		goto cleanup_dev_kobject;
 
 	err = nilfs_sysfs_create_mounted_snapshots_group(nilfs);
 	if (err)
@@ -1037,9 +1037,7 @@ int nilfs_sysfs_create_device_group(struct super_block *sb)
 	nilfs_sysfs_delete_mounted_snapshots_group(nilfs);
 
 cleanup_dev_kobject:
-	kobject_del(&nilfs->ns_dev_kobj);
-
-free_dev_subgroups:
+	kobject_put(&nilfs->ns_dev_kobj);
 	kfree(nilfs->ns_dev_subgroups);
 
 failed_create_device_group:

commit a2868b5e18884efd37f4a30c4cf28d925564da90
Author: Jeff Layton <jlayton@kernel.org>
Date:   Thu Sep 2 08:31:03 2021 -0400

    ceph: lockdep annotations for try_nonblocking_invalidate
    
    [ Upstream commit 3eaf5aa1cfa8c97c72f5824e2e9263d6cc977b03 ]
    
    Signed-off-by: Jeff Layton <jlayton@kernel.org>
    Reviewed-by: Ilya Dryomov <idryomov@gmail.com>
    Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
index 918781c51f0b..6443ba1e60eb 100644
--- a/fs/ceph/caps.c
+++ b/fs/ceph/caps.c
@@ -1774,6 +1774,8 @@ static int __mark_caps_flushing(struct inode *inode,
  * try to invalidate mapping pages without blocking.
  */
 static int try_nonblocking_invalidate(struct inode *inode)
+	__releases(ci->i_ceph_lock)
+	__acquires(ci->i_ceph_lock)
 {
 	struct ceph_inode_info *ci = ceph_inode(inode);
 	u32 invalidating_gen = ci->i_rdcache_gen;

commit 2e6f2bef14a8bdd639d72665c4feb786af0a7ffd
Author: Radhey Shyam Pandey <radhey.shyam.pandey@xilinx.com>
Date:   Thu Aug 19 14:28:48 2021 +0530

    dmaengine: xilinx_dma: Set DMA mask for coherent APIs
    
    [ Upstream commit aac6c0f90799d66b8989be1e056408f33fd99fe6 ]
    
    The xilinx dma driver uses the consistent allocations, so for correct
    operation also set the DMA mask for coherent APIs. It fixes the below
    kernel crash with dmatest client when DMA IP is configured with 64-bit
    address width and linux is booted from high (>4GB) memory.
    
    Call trace:
    [  489.531257]  dma_alloc_from_pool+0x8c/0x1c0
    [  489.535431]  dma_direct_alloc+0x284/0x330
    [  489.539432]  dma_alloc_attrs+0x80/0xf0
    [  489.543174]  dma_pool_alloc+0x160/0x2c0
    [  489.547003]  xilinx_cdma_prep_memcpy+0xa4/0x180
    [  489.551524]  dmatest_func+0x3cc/0x114c
    [  489.555266]  kthread+0x124/0x130
    [  489.558486]  ret_from_fork+0x10/0x3c
    [  489.562051] ---[ end trace 248625b2d596a90a ]---
    
    Signed-off-by: Radhey Shyam Pandey <radhey.shyam.pandey@xilinx.com>
    Reviewed-by: Harini Katakam <harini.katakam@xilinx.com>
    Link: https://lore.kernel.org/r/1629363528-30347-1-git-send-email-radhey.shyam.pandey@xilinx.com
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/dma/xilinx/xilinx_dma.c b/drivers/dma/xilinx/xilinx_dma.c
index d891ec05bc48..3f38df6b51f2 100644
--- a/drivers/dma/xilinx/xilinx_dma.c
+++ b/drivers/dma/xilinx/xilinx_dma.c
@@ -2674,7 +2674,7 @@ static int xilinx_dma_probe(struct platform_device *pdev)
 		xdev->ext_addr = false;
 
 	/* Set the dma mask bits */
-	dma_set_mask(xdev->dev, DMA_BIT_MASK(addr_width));
+	dma_set_mask_and_coherent(xdev->dev, DMA_BIT_MASK(addr_width));
 
 	/* Initialize the DMA engine */
 	xdev->common.dev = &pdev->dev;

commit 2be41013f7143b8ac0f0dba044bb2a8d425a0e37
Author: Johannes Berg <johannes.berg@intel.com>
Date:   Mon Aug 9 11:24:09 2021 +0200

    dmaengine: ioat: depends on !UML
    
    [ Upstream commit bbac7a92a46f0876e588722ebe552ddfe6fd790f ]
    
    Now that UML has PCI support, this driver must depend also on
    !UML since it pokes at X86_64 architecture internals that don't
    exist on ARCH=um.
    
    Reported-by: Geert Uytterhoeven <geert@linux-m68k.org>
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Acked-by: Dave Jiang <dave.jiang@intel.com>
    Link: https://lore.kernel.org/r/20210809112409.a3a0974874d2.I2ffe3d11ed37f735da2f39884a74c953b258b995@changeid
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
index 52dd4bd7c209..e5f31af65aab 100644
--- a/drivers/dma/Kconfig
+++ b/drivers/dma/Kconfig
@@ -266,7 +266,7 @@ config INTEL_IDMA64
 
 config INTEL_IOATDMA
 	tristate "Intel I/OAT DMA support"
-	depends on PCI && X86_64
+	depends on PCI && X86_64 && !UML
 	select DMA_ENGINE
 	select DMA_ENGINE_RAID
 	select DCA

commit 152ef880577b4cd36a1160d3043a6ae21d8f1f1d
Author: Zou Wei <zou_wei@huawei.com>
Date:   Tue May 4 10:22:57 2021 +0800

    dmaengine: sprd: Add missing MODULE_DEVICE_TABLE
    
    [ Upstream commit 4faee8b65ec32346f8096e64c5fa1d5a73121742 ]
    
    This patch adds missing MODULE_DEVICE_TABLE definition which generates
    correct modalias for automatic loading of this driver when it is built
    as an external module.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zou Wei <zou_wei@huawei.com>
    Reviewed-by: Baolin Wang <baolin.wang7@gmail.com>
    Link: https://lore.kernel.org/r/1620094977-70146-1-git-send-email-zou_wei@huawei.com
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/dma/sprd-dma.c b/drivers/dma/sprd-dma.c
index 9e8ce56a83d8..0fadf6a08494 100644
--- a/drivers/dma/sprd-dma.c
+++ b/drivers/dma/sprd-dma.c
@@ -1016,6 +1016,7 @@ static const struct of_device_id sprd_dma_match[] = {
 	{ .compatible = "sprd,sc9860-dma", },
 	{},
 };
+MODULE_DEVICE_TABLE(of, sprd_dma_match);
 
 static int __maybe_unused sprd_dma_runtime_suspend(struct device *dev)
 {

commit bdc27784e5662e51a3c3b31983cb5329b2ea60fe
Author: Guenter Roeck <linux@roeck-us.net>
Date:   Wed Sep 8 08:30:41 2021 -0700

    parisc: Move pci_dev_is_behind_card_dino to where it is used
    
    [ Upstream commit 907872baa9f1538eed02ec737b8e89eba6c6e4b9 ]
    
    parisc build test images fail to compile with the following error.
    
    drivers/parisc/dino.c:160:12: error:
            'pci_dev_is_behind_card_dino' defined but not used
    
    Move the function just ahead of its only caller to avoid the error.
    
    Fixes: 5fa1659105fa ("parisc: Disable HP HSC-PCI Cards to prevent kernel crash")
    Cc: Helge Deller <deller@gmx.de>
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Helge Deller <deller@gmx.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c
index 29df6ab29e95..2b60535a9c7b 100644
--- a/drivers/parisc/dino.c
+++ b/drivers/parisc/dino.c
@@ -160,15 +160,6 @@ struct dino_device
 	(struct dino_device *)__pdata; })
 
 
-/* Check if PCI device is behind a Card-mode Dino. */
-static int pci_dev_is_behind_card_dino(struct pci_dev *dev)
-{
-	struct dino_device *dino_dev;
-
-	dino_dev = DINO_DEV(parisc_walk_tree(dev->bus->bridge));
-	return is_card_dino(&dino_dev->hba.dev->id);
-}
-
 /*
  * Dino Configuration Space Accessor Functions
  */
@@ -452,6 +443,15 @@ static void quirk_cirrus_cardbus(struct pci_dev *dev)
 DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_6832, quirk_cirrus_cardbus );
 
 #ifdef CONFIG_TULIP
+/* Check if PCI device is behind a Card-mode Dino. */
+static int pci_dev_is_behind_card_dino(struct pci_dev *dev)
+{
+	struct dino_device *dino_dev;
+
+	dino_dev = DINO_DEV(parisc_walk_tree(dev->bus->bridge));
+	return is_card_dino(&dino_dev->hba.dev->id);
+}
+
 static void pci_fixup_tulip(struct pci_dev *dev)
 {
 	if (!pci_dev_is_behind_card_dino(dev))

commit 6bd98f8259ac7e0c6f7cbf505b06504b18106623
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Tue Aug 31 13:48:34 2021 +0200

    drivers: base: cacheinfo: Get rid of DEFINE_SMP_CALL_CACHE_FUNCTION()
    
    [ Upstream commit 4b92d4add5f6dcf21275185c997d6ecb800054cd ]
    
    DEFINE_SMP_CALL_CACHE_FUNCTION() was usefel before the CPU hotplug rework
    to ensure that the cache related functions are called on the upcoming CPU
    because the notifier itself could run on any online CPU.
    
    The hotplug state machine guarantees that the callbacks are invoked on the
    upcoming CPU. So there is no need to have this SMP function call
    obfuscation. That indirection was missed when the hotplug notifiers were
    converted.
    
    This also solves the problem of ARM64 init_cache_level() invoking ACPI
    functions which take a semaphore in that context. That's invalid as SMP
    function calls run with interrupts disabled. Running it just from the
    callback in context of the CPU hotplug thread solves this.
    
    Fixes: 8571890e1513 ("arm64: Add support for ACPI based firmware tables")
    Reported-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Acked-by: Will Deacon <will@kernel.org>
    Acked-by: Peter Zijlstra <peterz@infradead.org>
    Link: https://lore.kernel.org/r/871r69ersb.ffs@tglx
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm64/kernel/cacheinfo.c b/arch/arm64/kernel/cacheinfo.c
index 0bf0a835122f..d17414cbb89a 100644
--- a/arch/arm64/kernel/cacheinfo.c
+++ b/arch/arm64/kernel/cacheinfo.c
@@ -45,7 +45,7 @@ static void ci_leaf_init(struct cacheinfo *this_leaf,
 	this_leaf->type = type;
 }
 
-static int __init_cache_level(unsigned int cpu)
+int init_cache_level(unsigned int cpu)
 {
 	unsigned int ctype, level, leaves, fw_level;
 	struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
@@ -80,7 +80,7 @@ static int __init_cache_level(unsigned int cpu)
 	return 0;
 }
 
-static int __populate_cache_leaves(unsigned int cpu)
+int populate_cache_leaves(unsigned int cpu)
 {
 	unsigned int level, idx;
 	enum cache_type type;
@@ -99,6 +99,3 @@ static int __populate_cache_leaves(unsigned int cpu)
 	}
 	return 0;
 }
-
-DEFINE_SMP_CALL_CACHE_FUNCTION(init_cache_level)
-DEFINE_SMP_CALL_CACHE_FUNCTION(populate_cache_leaves)
diff --git a/arch/mips/kernel/cacheinfo.c b/arch/mips/kernel/cacheinfo.c
index 3ea95568ece4..1c19a0698308 100644
--- a/arch/mips/kernel/cacheinfo.c
+++ b/arch/mips/kernel/cacheinfo.c
@@ -28,7 +28,7 @@ do {								\
 	leaf++;							\
 } while (0)
 
-static int __init_cache_level(unsigned int cpu)
+int init_cache_level(unsigned int cpu)
 {
 	struct cpuinfo_mips *c = &current_cpu_data;
 	struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
@@ -80,7 +80,7 @@ static void fill_cpumask_cluster(int cpu, cpumask_t *cpu_map)
 			cpumask_set_cpu(cpu1, cpu_map);
 }
 
-static int __populate_cache_leaves(unsigned int cpu)
+int populate_cache_leaves(unsigned int cpu)
 {
 	struct cpuinfo_mips *c = &current_cpu_data;
 	struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
@@ -109,6 +109,3 @@ static int __populate_cache_leaves(unsigned int cpu)
 
 	return 0;
 }
-
-DEFINE_SMP_CALL_CACHE_FUNCTION(init_cache_level)
-DEFINE_SMP_CALL_CACHE_FUNCTION(populate_cache_leaves)
diff --git a/arch/riscv/kernel/cacheinfo.c b/arch/riscv/kernel/cacheinfo.c
index 0bc86e5f8f3f..9d46c8575a61 100644
--- a/arch/riscv/kernel/cacheinfo.c
+++ b/arch/riscv/kernel/cacheinfo.c
@@ -31,7 +31,7 @@ static void ci_leaf_init(struct cacheinfo *this_leaf,
 		| CACHE_WRITE_ALLOCATE;
 }
 
-static int __init_cache_level(unsigned int cpu)
+int init_cache_level(unsigned int cpu)
 {
 	struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
 	struct device_node *np = of_cpu_device_node_get(cpu);
@@ -67,7 +67,7 @@ static int __init_cache_level(unsigned int cpu)
 	return 0;
 }
 
-static int __populate_cache_leaves(unsigned int cpu)
+int populate_cache_leaves(unsigned int cpu)
 {
 	struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
 	struct cacheinfo *this_leaf = this_cpu_ci->info_list;
@@ -99,6 +99,3 @@ static int __populate_cache_leaves(unsigned int cpu)
 
 	return 0;
 }
-
-DEFINE_SMP_CALL_CACHE_FUNCTION(init_cache_level)
-DEFINE_SMP_CALL_CACHE_FUNCTION(populate_cache_leaves)
diff --git a/arch/x86/kernel/cpu/cacheinfo.c b/arch/x86/kernel/cpu/cacheinfo.c
index 9d863e8f9b3f..4a393023f5ac 100644
--- a/arch/x86/kernel/cpu/cacheinfo.c
+++ b/arch/x86/kernel/cpu/cacheinfo.c
@@ -956,7 +956,7 @@ static void ci_leaf_init(struct cacheinfo *this_leaf,
 	this_leaf->priv = base->nb;
 }
 
-static int __init_cache_level(unsigned int cpu)
+int init_cache_level(unsigned int cpu)
 {
 	struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
 
@@ -985,7 +985,7 @@ static void get_cache_id(int cpu, struct _cpuid4_info_regs *id4_regs)
 	id4_regs->id = c->apicid >> index_msb;
 }
 
-static int __populate_cache_leaves(unsigned int cpu)
+int populate_cache_leaves(unsigned int cpu)
 {
 	unsigned int idx, ret;
 	struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
@@ -1004,6 +1004,3 @@ static int __populate_cache_leaves(unsigned int cpu)
 
 	return 0;
 }
-
-DEFINE_SMP_CALL_CACHE_FUNCTION(init_cache_level)
-DEFINE_SMP_CALL_CACHE_FUNCTION(populate_cache_leaves)
diff --git a/include/linux/cacheinfo.h b/include/linux/cacheinfo.h
index 70e19bc6cc9f..66654e6f9605 100644
--- a/include/linux/cacheinfo.h
+++ b/include/linux/cacheinfo.h
@@ -76,24 +76,6 @@ struct cpu_cacheinfo {
 	bool cpu_map_populated;
 };
 
-/*
- * Helpers to make sure "func" is executed on the cpu whose cache
- * attributes are being detected
- */
-#define DEFINE_SMP_CALL_CACHE_FUNCTION(func)			\
-static inline void _##func(void *ret)				\
-{								\
-	int cpu = smp_processor_id();				\
-	*(int *)ret = __##func(cpu);				\
-}								\
-								\
-int func(unsigned int cpu)					\
-{								\
-	int ret;						\
-	smp_call_function_single(cpu, _##func, &ret, true);	\
-	return ret;						\
-}
-
 struct cpu_cacheinfo *get_cpu_cacheinfo(unsigned int cpu);
 int init_cache_level(unsigned int cpu);
 int populate_cache_leaves(unsigned int cpu);

commit 5a402646c9bb89f80930955b4e3805c111111ab5
Author: Lukas Bulwahn <lukas.bulwahn@gmail.com>
Date:   Tue Sep 7 20:00:47 2021 -0700

    Kconfig.debug: drop selecting non-existing HARDLOCKUP_DETECTOR_ARCH
    
    [ Upstream commit 6fe26259b4884b657cbc233fb9cdade9d704976e ]
    
    Commit 05a4a9527931 ("kernel/watchdog: split up config options") adds a
    new config HARDLOCKUP_DETECTOR, which selects the non-existing config
    HARDLOCKUP_DETECTOR_ARCH.
    
    Hence, ./scripts/checkkconfigsymbols.py warns:
    
    HARDLOCKUP_DETECTOR_ARCH Referencing files: lib/Kconfig.debug
    
    Simply drop selecting the non-existing HARDLOCKUP_DETECTOR_ARCH.
    
    Link: https://lkml.kernel.org/r/20210806115618.22088-1-lukas.bulwahn@gmail.com
    Fixes: 05a4a9527931 ("kernel/watchdog: split up config options")
    Signed-off-by: Lukas Bulwahn <lukas.bulwahn@gmail.com>
    Cc: Nicholas Piggin <npiggin@gmail.com>
    Cc: Masahiro Yamada <masahiroy@kernel.org>
    Cc: Babu Moger <babu.moger@oracle.com>
    Cc: Don Zickus <dzickus@redhat.com>
    Cc: Randy Dunlap <rdunlap@infradead.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index 46a910acce3f..6970759f296c 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -853,7 +853,6 @@ config HARDLOCKUP_DETECTOR
 	depends on HAVE_HARDLOCKUP_DETECTOR_PERF || HAVE_HARDLOCKUP_DETECTOR_ARCH
 	select LOCKUP_DETECTOR
 	select HARDLOCKUP_DETECTOR_PERF if HAVE_HARDLOCKUP_DETECTOR_PERF
-	select HARDLOCKUP_DETECTOR_ARCH if HAVE_HARDLOCKUP_DETECTOR_ARCH
 	help
 	  Say Y here to enable the kernel to act as a watchdog to detect
 	  hard lockups.

commit 4459118977665f681017e1299933895d54b6e87b
Author: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Date:   Wed Jul 7 18:27:49 2021 +0200

    pwm: lpc32xx: Don't modify HW state in .probe() after the PWM chip was registered
    
    commit 3d2813fb17e5fd0d73c1d1442ca0192bde4af10e upstream.
    
    This fixes a race condition: After pwmchip_add() is called there might
    already be a consumer and then modifying the hardware behind the
    consumer's back is bad. So set the default before.
    
    (Side-note: I don't know what this register setting actually does, if
    this modifies the polarity there is an inconsistency because the
    inversed polarity isn't considered if the PWM is already running during
    .probe().)
    
    Fixes: acfd92fdfb93 ("pwm: lpc32xx: Set PWM_PIN_LEVEL bit to default value")
    Cc: Sylvain Lemieux <slemieux@tycoint.com>
    Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
    Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pwm/pwm-lpc32xx.c b/drivers/pwm/pwm-lpc32xx.c
index a9b3cff96aac..ed8e9406b4af 100644
--- a/drivers/pwm/pwm-lpc32xx.c
+++ b/drivers/pwm/pwm-lpc32xx.c
@@ -124,17 +124,17 @@ static int lpc32xx_pwm_probe(struct platform_device *pdev)
 	lpc32xx->chip.npwm = 1;
 	lpc32xx->chip.base = -1;
 
+	/* If PWM is disabled, configure the output to the default value */
+	val = readl(lpc32xx->base + (lpc32xx->chip.pwms[0].hwpwm << 2));
+	val &= ~PWM_PIN_LEVEL;
+	writel(val, lpc32xx->base + (lpc32xx->chip.pwms[0].hwpwm << 2));
+
 	ret = pwmchip_add(&lpc32xx->chip);
 	if (ret < 0) {
 		dev_err(&pdev->dev, "failed to add PWM chip, error %d\n", ret);
 		return ret;
 	}
 
-	/* When PWM is disable, configure the output to the default value */
-	val = readl(lpc32xx->base + (lpc32xx->chip.pwms[0].hwpwm << 2));
-	val &= ~PWM_PIN_LEVEL;
-	writel(val, lpc32xx->base + (lpc32xx->chip.pwms[0].hwpwm << 2));
-
 	platform_set_drvdata(pdev, lpc32xx);
 
 	return 0;

commit a94a60ef75d6cc2ac4c0d07cd043316e7e8b5b3b
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Tue Sep 7 19:58:21 2021 -0700

    profiling: fix shift-out-of-bounds bugs
    
    commit 2d186afd04d669fe9c48b994c41a7405a3c9f16d upstream.
    
    Syzbot reported shift-out-of-bounds bug in profile_init().
    The problem was in incorrect prof_shift. Since prof_shift value comes from
    userspace we need to clamp this value into [0, BITS_PER_LONG -1]
    boundaries.
    
    Second possible shiht-out-of-bounds was found by Tetsuo:
    sample_step local variable in read_profile() had "unsigned int" type,
    but prof_shift allows to make a BITS_PER_LONG shift. So, to prevent
    possible shiht-out-of-bounds sample_step type was changed to
    "unsigned long".
    
    Also, "unsigned short int" will be sufficient for storing
    [0, BITS_PER_LONG] value, that's why there is no need for
    "unsigned long" prof_shift.
    
    Link: https://lkml.kernel.org/r/20210813140022.5011-1-paskripkin@gmail.com
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-and-tested-by: syzbot+e68c89a9510c159d9684@syzkaller.appspotmail.com
    Suggested-by: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/profile.c b/kernel/profile.c
index 9aa2a4445b0d..efa58f63dc1b 100644
--- a/kernel/profile.c
+++ b/kernel/profile.c
@@ -40,7 +40,8 @@ struct profile_hit {
 #define NR_PROFILE_GRP		(NR_PROFILE_HIT/PROFILE_GRPSZ)
 
 static atomic_t *prof_buffer;
-static unsigned long prof_len, prof_shift;
+static unsigned long prof_len;
+static unsigned short int prof_shift;
 
 int prof_on __read_mostly;
 EXPORT_SYMBOL_GPL(prof_on);
@@ -66,8 +67,8 @@ int profile_setup(char *str)
 		if (str[strlen(sleepstr)] == ',')
 			str += strlen(sleepstr) + 1;
 		if (get_option(&str, &par))
-			prof_shift = par;
-		pr_info("kernel sleep profiling enabled (shift: %ld)\n",
+			prof_shift = clamp(par, 0, BITS_PER_LONG - 1);
+		pr_info("kernel sleep profiling enabled (shift: %u)\n",
 			prof_shift);
 #else
 		pr_warn("kernel sleep profiling requires CONFIG_SCHEDSTATS\n");
@@ -77,21 +78,21 @@ int profile_setup(char *str)
 		if (str[strlen(schedstr)] == ',')
 			str += strlen(schedstr) + 1;
 		if (get_option(&str, &par))
-			prof_shift = par;
-		pr_info("kernel schedule profiling enabled (shift: %ld)\n",
+			prof_shift = clamp(par, 0, BITS_PER_LONG - 1);
+		pr_info("kernel schedule profiling enabled (shift: %u)\n",
 			prof_shift);
 	} else if (!strncmp(str, kvmstr, strlen(kvmstr))) {
 		prof_on = KVM_PROFILING;
 		if (str[strlen(kvmstr)] == ',')
 			str += strlen(kvmstr) + 1;
 		if (get_option(&str, &par))
-			prof_shift = par;
-		pr_info("kernel KVM profiling enabled (shift: %ld)\n",
+			prof_shift = clamp(par, 0, BITS_PER_LONG - 1);
+		pr_info("kernel KVM profiling enabled (shift: %u)\n",
 			prof_shift);
 	} else if (get_option(&str, &par)) {
-		prof_shift = par;
+		prof_shift = clamp(par, 0, BITS_PER_LONG - 1);
 		prof_on = CPU_PROFILING;
-		pr_info("kernel profiling enabled (shift: %ld)\n",
+		pr_info("kernel profiling enabled (shift: %u)\n",
 			prof_shift);
 	}
 	return 1;
@@ -467,7 +468,7 @@ read_profile(struct file *file, char __user *buf, size_t count, loff_t *ppos)
 	unsigned long p = *ppos;
 	ssize_t read;
 	char *pnt;
-	unsigned int sample_step = 1 << prof_shift;
+	unsigned long sample_step = 1UL << prof_shift;
 
 	profile_flip_buffers();
 	if (p >= (prof_len+1)*sizeof(unsigned int))

commit c19e28a761fe370f970c1846df6ea063a70d0cf1
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Tue Sep 7 20:00:26 2021 -0700

    nilfs2: use refcount_dec_and_lock() to fix potential UAF
    
    commit 98e2e409e76ef7781d8511f997359e9c504a95c1 upstream.
    
    When the refcount is decreased to 0, the resource reclamation branch is
    entered.  Before CPU0 reaches the race point (1), CPU1 may obtain the
    spinlock and traverse the rbtree to find 'root', see
    nilfs_lookup_root().
    
    Although CPU1 will call refcount_inc() to increase the refcount, it is
    obviously too late.  CPU0 will release 'root' directly, CPU1 then
    accesses 'root' and triggers UAF.
    
    Use refcount_dec_and_lock() to ensure that both the operations of
    decrease refcount to 0 and link deletion are lock protected eliminates
    this risk.
    
                 CPU0                      CPU1
            nilfs_put_root():
                        <-------- (1)
                                    spin_lock(&nilfs->ns_cptree_lock);
                                    rb_erase(&root->rb_node, &nilfs->ns_cptree);
                                    spin_unlock(&nilfs->ns_cptree_lock);
    
            kfree(root);
                        <-------- use-after-free
    
      refcount_t: underflow; use-after-free.
      WARNING: CPU: 2 PID: 9476 at lib/refcount.c:28 \
      refcount_warn_saturate+0x1cf/0x210 lib/refcount.c:28
      Modules linked in:
      CPU: 2 PID: 9476 Comm: syz-executor.0 Not tainted 5.10.45-rc1+ #3
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), ...
      RIP: 0010:refcount_warn_saturate+0x1cf/0x210 lib/refcount.c:28
      ... ...
      Call Trace:
         __refcount_sub_and_test include/linux/refcount.h:283 [inline]
         __refcount_dec_and_test include/linux/refcount.h:315 [inline]
         refcount_dec_and_test include/linux/refcount.h:333 [inline]
         nilfs_put_root+0xc1/0xd0 fs/nilfs2/the_nilfs.c:795
         nilfs_segctor_destroy fs/nilfs2/segment.c:2749 [inline]
         nilfs_detach_log_writer+0x3fa/0x570 fs/nilfs2/segment.c:2812
         nilfs_put_super+0x2f/0xf0 fs/nilfs2/super.c:467
         generic_shutdown_super+0xcd/0x1f0 fs/super.c:464
         kill_block_super+0x4a/0x90 fs/super.c:1446
         deactivate_locked_super+0x6a/0xb0 fs/super.c:335
         deactivate_super+0x85/0x90 fs/super.c:366
         cleanup_mnt+0x277/0x2e0 fs/namespace.c:1118
         __cleanup_mnt+0x15/0x20 fs/namespace.c:1125
         task_work_run+0x8e/0x110 kernel/task_work.c:151
         tracehook_notify_resume include/linux/tracehook.h:188 [inline]
         exit_to_user_mode_loop kernel/entry/common.c:164 [inline]
         exit_to_user_mode_prepare+0x13c/0x170 kernel/entry/common.c:191
         syscall_exit_to_user_mode+0x16/0x30 kernel/entry/common.c:266
         do_syscall_64+0x45/0x80 arch/x86/entry/common.c:56
         entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    There is no reproduction program, and the above is only theoretical
    analysis.
    
    Link: https://lkml.kernel.org/r/1629859428-5906-1-git-send-email-konishi.ryusuke@gmail.com
    Fixes: ba65ae4729bf ("nilfs2: add checkpoint tree to nilfs object")
    Link: https://lkml.kernel.org/r/20210723012317.4146-1-thunder.leizhen@huawei.com
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/nilfs2/the_nilfs.c b/fs/nilfs2/the_nilfs.c
index 484785cdf96e..931870768556 100644
--- a/fs/nilfs2/the_nilfs.c
+++ b/fs/nilfs2/the_nilfs.c
@@ -797,14 +797,13 @@ nilfs_find_or_create_root(struct the_nilfs *nilfs, __u64 cno)
 
 void nilfs_put_root(struct nilfs_root *root)
 {
-	if (refcount_dec_and_test(&root->count)) {
-		struct the_nilfs *nilfs = root->nilfs;
+	struct the_nilfs *nilfs = root->nilfs;
 
-		nilfs_sysfs_delete_snapshot_group(root);
-
-		spin_lock(&nilfs->ns_cptree_lock);
+	if (refcount_dec_and_lock(&root->count, &nilfs->ns_cptree_lock)) {
 		rb_erase(&root->rb_node, &nilfs->ns_cptree);
 		spin_unlock(&nilfs->ns_cptree_lock);
+
+		nilfs_sysfs_delete_snapshot_group(root);
 		iput(root->ifile);
 
 		kfree(root);

commit 6a96bac8ba0a5ab9c9af1ed1c77478e19ae1f0f6
Author: Cyrill Gorcunov <gorcunov@gmail.com>
Date:   Tue Sep 7 20:00:41 2021 -0700

    prctl: allow to setup brk for et_dyn executables
    
    commit e1fbbd073137a9d63279f6bf363151a938347640 upstream.
    
    Keno Fischer reported that when a binray loaded via ld-linux-x the
    prctl(PR_SET_MM_MAP) doesn't allow to setup brk value because it lays
    before mm:end_data.
    
    For example a test program shows
    
     | # ~/t
     |
     | start_code      401000
     | end_code        401a15
     | start_stack     7ffce4577dd0
     | start_data      403e10
     | end_data        40408c
     | start_brk       b5b000
     | sbrk(0)         b5b000
    
    and when executed via ld-linux
    
     | # /lib64/ld-linux-x86-64.so.2 ~/t
     |
     | start_code      7fc25b0a4000
     | end_code        7fc25b0c4524
     | start_stack     7fffcc6b2400
     | start_data      7fc25b0ce4c0
     | end_data        7fc25b0cff98
     | start_brk       55555710c000
     | sbrk(0)         55555710c000
    
    This of course prevent criu from restoring such programs.  Looking into
    how kernel operates with brk/start_brk inside brk() syscall I don't see
    any problem if we allow to setup brk/start_brk without checking for
    end_data.  Even if someone pass some weird address here on a purpose then
    the worst possible result will be an unexpected unmapping of existing vma
    (own vma, since prctl works with the callers memory) but test for
    RLIMIT_DATA is still valid and a user won't be able to gain more memory in
    case of expanding VMAs via new values shipped with prctl call.
    
    Link: https://lkml.kernel.org/r/20210121221207.GB2174@grain
    Fixes: bbdc6076d2e5 ("binfmt_elf: move brk out of mmap when doing direct loader exec")
    Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
    Reported-by: Keno Fischer <keno@juliacomputing.com>
    Acked-by: Andrey Vagin <avagin@gmail.com>
    Tested-by: Andrey Vagin <avagin@gmail.com>
    Cc: Dmitry Safonov <0x7f454c46@gmail.com>
    Cc: Kirill Tkhai <ktkhai@virtuozzo.com>
    Cc: Eric W. Biederman <ebiederm@xmission.com>
    Cc: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
    Cc: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/sys.c b/kernel/sys.c
index baf60a3aa34b..d0663f8e6fb8 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -1931,13 +1931,6 @@ static int validate_prctl_map(struct prctl_mm_map *prctl_map)
 
 	error = -EINVAL;
 
-	/*
-	 * @brk should be after @end_data in traditional maps.
-	 */
-	if (prctl_map->start_brk <= prctl_map->end_data ||
-	    prctl_map->brk <= prctl_map->end_data)
-		goto out;
-
 	/*
 	 * Neither we should allow to override limits if they set.
 	 */

commit 2749bda43b39fc4dabb5c170bf8a4dd2f0a942e7
Author: Xie Yongji <xieyongji@bytedance.com>
Date:   Mon May 17 16:35:57 2021 +0800

    9p/trans_virtio: Remove sysfs file on probe failure
    
    commit f997ea3b7afc108eb9761f321b57de2d089c7c48 upstream.
    
    This ensures we don't leak the sysfs file if we failed to
    allocate chan->vc_wq during probe.
    
    Link: http://lkml.kernel.org/r/20210517083557.172-1-xieyongji@bytedance.com
    Fixes: 86c8437383ac ("net/9p: Add sysfs mount_tag file for virtio 9P device")
    Signed-off-by: Xie Yongji <xieyongji@bytedance.com>
    Signed-off-by: Dominique Martinet <asmadeus@codewreck.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c
index 849336211c79..f7cd8e018bde 100644
--- a/net/9p/trans_virtio.c
+++ b/net/9p/trans_virtio.c
@@ -620,7 +620,7 @@ static int p9_virtio_probe(struct virtio_device *vdev)
 	chan->vc_wq = kmalloc(sizeof(wait_queue_head_t), GFP_KERNEL);
 	if (!chan->vc_wq) {
 		err = -ENOMEM;
-		goto out_free_tag;
+		goto out_remove_file;
 	}
 	init_waitqueue_head(chan->vc_wq);
 	chan->ring_bufs_avail = 1;
@@ -638,6 +638,8 @@ static int p9_virtio_probe(struct virtio_device *vdev)
 
 	return 0;
 
+out_remove_file:
+	sysfs_remove_file(&vdev->dev.kobj, &dev_attr_mount_tag.attr);
 out_free_tag:
 	kfree(tag);
 out_free_vq:

commit 5286a3101efc6bceeaeb64617085537bf5a185d8
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Tue Aug 10 11:44:13 2021 +0300

    thermal/drivers/exynos: Fix an error code in exynos_tmu_probe()
    
    commit 02d438f62c05f0d055ceeedf12a2f8796b258c08 upstream.
    
    This error path return success but it should propagate the negative
    error code from devm_clk_get().
    
    Fixes: 6c247393cfdd ("thermal: exynos: Add TMU support for Exynos7 SoC")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
    Link: https://lore.kernel.org/r/20210810084413.GA23810@kili
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c
index fc9399d9c082..3376be6863cd 100644
--- a/drivers/thermal/samsung/exynos_tmu.c
+++ b/drivers/thermal/samsung/exynos_tmu.c
@@ -1084,6 +1084,7 @@ static int exynos_tmu_probe(struct platform_device *pdev)
 		data->sclk = devm_clk_get(&pdev->dev, "tmu_sclk");
 		if (IS_ERR(data->sclk)) {
 			dev_err(&pdev->dev, "Failed to get sclk\n");
+			ret = PTR_ERR(data->sclk);
 			goto err_clk;
 		} else {
 			ret = clk_prepare_enable(data->sclk);

commit 523559507138ca4abcf4c2522c0061071c1d60a0
Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date:   Fri Jul 30 23:27:15 2021 +0300

    dmaengine: acpi: Avoid comparison GSI with Linux vIRQ
    
    commit 67db87dc8284070adb15b3c02c1c31d5cf51c5d6 upstream.
    
    Currently the CRST parsing relies on the fact that on most of x86 devices
    the IRQ mapping is 1:1 with Linux vIRQ. However, it may be not true for
    some. Fix this by converting GSI to Linux vIRQ before checking it.
    
    Fixes: ee8209fd026b ("dma: acpi-dma: parse CSRT to extract additional resources")
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Link: https://lore.kernel.org/r/20210730202715.24375-1-andriy.shevchenko@linux.intel.com
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/dma/acpi-dma.c b/drivers/dma/acpi-dma.c
index 8d99c84361cb..22ec10c71d81 100644
--- a/drivers/dma/acpi-dma.c
+++ b/drivers/dma/acpi-dma.c
@@ -72,10 +72,14 @@ static int acpi_dma_parse_resource_group(const struct acpi_csrt_group *grp,
 
 	si = (const struct acpi_csrt_shared_info *)&grp[1];
 
-	/* Match device by MMIO and IRQ */
+	/* Match device by MMIO */
 	if (si->mmio_base_low != lower_32_bits(mem) ||
-	    si->mmio_base_high != upper_32_bits(mem) ||
-	    si->gsi_interrupt != irq)
+	    si->mmio_base_high != upper_32_bits(mem))
+		return 0;
+
+	/* Match device by Linux vIRQ */
+	ret = acpi_register_gsi(NULL, si->gsi_interrupt, si->interrupt_mode, si->interrupt_polarity);
+	if (ret != irq)
 		return 0;
 
 	dev_dbg(&adev->dev, "matches with %.4s%04X (rev %u)\n",

commit 718094012d82a9e925a839fbab11a1eaa3220669
Author: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Date:   Mon Jun 28 16:13:44 2021 -0300

    sctp: add param size validation for SCTP_PARAM_SET_PRIMARY
    
    commit ef6c8d6ccf0c1dccdda092ebe8782777cd7803c9 upstream.
    
    When SCTP handles an INIT chunk, it calls for example:
    sctp_sf_do_5_1B_init
      sctp_verify_init
        sctp_verify_param
      sctp_process_init
        sctp_process_param
          handling of SCTP_PARAM_SET_PRIMARY
    
    sctp_verify_init() wasn't doing proper size validation and neither the
    later handling, allowing it to work over the chunk itself, possibly being
    uninitialized memory.
    
    Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
index a1ca070e36b0..0789109c2d09 100644
--- a/net/sctp/sm_make_chunk.c
+++ b/net/sctp/sm_make_chunk.c
@@ -2172,9 +2172,16 @@ static enum sctp_ierror sctp_verify_param(struct net *net,
 		break;
 
 	case SCTP_PARAM_SET_PRIMARY:
-		if (net->sctp.addip_enable)
-			break;
-		goto fallthrough;
+		if (!net->sctp.addip_enable)
+			goto fallthrough;
+
+		if (ntohs(param.p->length) < sizeof(struct sctp_addip_param) +
+					     sizeof(struct sctp_paramhdr)) {
+			sctp_process_inv_paramlength(asoc, param.p,
+						     chunk, err_chunk);
+			retval = SCTP_IERROR_ABORT;
+		}
+		break;
 
 	case SCTP_PARAM_HOST_NAME_ADDRESS:
 		/* Tell the peer, we won't support this param.  */

commit 194d21f10ef6a2e1109c31d775fb23ffdb41657f
Author: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Date:   Mon Jun 28 16:13:43 2021 -0300

    sctp: validate chunk size in __rcv_asconf_lookup
    
    commit b6ffe7671b24689c09faa5675dd58f93758a97ae upstream.
    
    In one of the fallbacks that SCTP has for identifying an association for an
    incoming packet, it looks for AddIp chunk (from ASCONF) and take a peek.
    Thing is, at this stage nothing was validating that the chunk actually had
    enough content for that, allowing the peek to happen over uninitialized
    memory.
    
    Similar check already exists in actual asconf handling in
    sctp_verify_asconf().
    
    Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/sctp/input.c b/net/sctp/input.c
index 23c4f14bec25..8b7c07fc66d4 100644
--- a/net/sctp/input.c
+++ b/net/sctp/input.c
@@ -1125,6 +1125,9 @@ static struct sctp_association *__sctp_rcv_asconf_lookup(
 	union sctp_addr_param *param;
 	union sctp_addr paddr;
 
+	if (ntohs(ch->length) < sizeof(*asconf) + sizeof(struct sctp_paramhdr))
+		return NULL;
+
 	/* Skip over the ADDIP header and find the Address parameter */
 	param = (union sctp_addr_param *)(asconf + 1);
 

commit 6cfbbb961bb94de85455fe35140b1350c7ccb76c
Author: Li Huafei <lihuafei1@huawei.com>
Date:   Fri Sep 24 10:54:48 2021 +0800

    tracing/kprobe: Fix kprobe_on_func_entry() modification
    
    The commit 960434acef37 ("tracing/kprobe: Fix to support kretprobe
    events on unloaded modules") backport from v5.11, which modifies the
    return value of kprobe_on_func_entry(). However, there is no adaptation
    modification in create_trace_kprobe(), resulting in the exact opposite
    behavior. Now we need to return an error immediately only if
    kprobe_on_func_entry() returns -EINVAL.
    
    Fixes: 960434acef37 ("tracing/kprobe: Fix to support kretprobe events on unloaded modules")
    Signed-off-by: Li Huafei <lihuafei1@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
index 61eff45653f5..36dfea29d5fa 100644
--- a/kernel/trace/trace_kprobe.c
+++ b/kernel/trace/trace_kprobe.c
@@ -836,8 +836,9 @@ static int create_trace_kprobe(int argc, char **argv)
 			pr_info("Failed to parse either an address or a symbol.\n");
 			return ret;
 		}
+		/* Defer the ENOENT case until register kprobe */
 		if (offset && is_return &&
-		    !kprobe_on_func_entry(NULL, symbol, offset)) {
+		    kprobe_on_func_entry(NULL, symbol, offset) == -EINVAL) {
 			pr_info("Given offset is not valid for return probe.\n");
 			return -EINVAL;
 		}

commit 320dc471c471500d61c98380395f8f54aa4add7f
Author: Christophe Leroy <christophe.leroy@c-s.fr>
Date:   Wed Jun 12 05:49:50 2019 +0000

    crypto: talitos - fix max key size for sha384 and sha512
    
    commit 192125ed5ce62afba24312d8e7a0314577565b4a upstream.
    
    Below commit came with a typo in the CONFIG_ symbol, leading
    to a permanently reduced max key size regarless of the driver
    capabilities.
    
    Reported-by: Horia Geant? <horia.geanta@nxp.com>
    Fixes: b8fbdc2bc4e7 ("crypto: talitos - reduce max key size for SEC1")
    Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
    Reviewed-by: Horia Geant? <horia.geanta@nxp.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Nobuhiro Iwamatsu (CIP) <nobuhiro1.iwamatsu@toshiba.co.jp>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c
index 07e1a286ee43..78b4f0f172ae 100644
--- a/drivers/crypto/talitos.c
+++ b/drivers/crypto/talitos.c
@@ -853,7 +853,7 @@ static void talitos_unregister_rng(struct device *dev)
  * HMAC_SNOOP_NO_AFEA (HSNA) instead of type IPSEC_ESP
  */
 #define TALITOS_CRA_PRIORITY_AEAD_HSNA	(TALITOS_CRA_PRIORITY - 1)
-#ifdef CONFIG_CRYPTO_DEV_TALITOS_SEC2
+#ifdef CONFIG_CRYPTO_DEV_TALITOS2
 #define TALITOS_MAX_KEY_SIZE		(AES_MAX_KEY_SIZE + SHA512_BLOCK_SIZE)
 #else
 #define TALITOS_MAX_KEY_SIZE		(AES_MAX_KEY_SIZE + SHA256_BLOCK_SIZE)

commit b0008fbdc75f08d933842b7071110010234b434b
Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date:   Tue Dec 15 20:47:16 2020 -0800

    apparmor: remove duplicate macro list_entry_is_head()
    
    commit 9801ca279ad37f72f71234fa81722afd95a3f997 upstream.
    
    Strangely I hadn't had noticed the existence of the list_entry_is_head()
    in apparmor code when added the same one in the list.h.  Luckily it's
    fully identical and didn't break builds.  In any case we don't need a
    duplicate anymore, thus remove it from apparmor code.
    
    Link: https://lkml.kernel.org/r/20201208100639.88182-1-andriy.shevchenko@linux.intel.com
    Fixes: e130816164e244 ("include/linux/list.h: add a macro to test if entry is pointing to the head")
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Acked-by: John Johansen <john.johansen@canonical.com>
    Cc: James Morris <jmorris@namei.org>
    Cc: "Serge E . Hallyn " <serge@hallyn.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Nobuhiro Iwamatsu (CIP) <nobuhiro1.iwamatsu@toshiba.co.jp>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/security/apparmor/apparmorfs.c b/security/apparmor/apparmorfs.c
index 1ec1e928cc09..900c865b9e5f 100644
--- a/security/apparmor/apparmorfs.c
+++ b/security/apparmor/apparmorfs.c
@@ -1960,9 +1960,6 @@ int __aafs_ns_mkdir(struct aa_ns *ns, struct dentry *parent, const char *name,
 	return error;
 }
 
-
-#define list_entry_is_head(pos, head, member) (&pos->member == (head))
-
 /**
  * __next_ns - find the next namespace to list
  * @root: root namespace to stop search at (NOT NULL)

commit 3226fb90cf5dc89611f742f122a33d4598076ad5
Author: Neeraj Upadhyay <neeraju@codeaurora.org>
Date:   Tue Nov 19 03:17:07 2019 +0000

    rcu: Fix missed wakeup of exp_wq waiters
    
    commit fd6bc19d7676a060a171d1cf3dcbf6fd797eb05f upstream.
    
    Tasks waiting within exp_funnel_lock() for an expedited grace period to
    elapse can be starved due to the following sequence of events:
    
    1.      Tasks A and B both attempt to start an expedited grace
            period at about the same time.  This grace period will have
            completed when the lower four bits of the rcu_state structure's
            ->expedited_sequence field are 0b'0100', for example, when the
            initial value of this counter is zero.  Task A wins, and thus
            does the actual work of starting the grace period, including
            acquiring the rcu_state structure's .exp_mutex and sets the
            counter to 0b'0001'.
    
    2.      Because task B lost the race to start the grace period, it
            waits on ->expedited_sequence to reach 0b'0100' inside of
            exp_funnel_lock(). This task therefore blocks on the rcu_node
            structure's ->exp_wq[1] field, keeping in mind that the
            end-of-grace-period value of ->expedited_sequence (0b'0100')
            is shifted down two bits before indexing the ->exp_wq[] field.
    
    3.      Task C attempts to start another expedited grace period,
            but blocks on ->exp_mutex, which is still held by Task A.
    
    4.      The aforementioned expedited grace period completes, so that
            ->expedited_sequence now has the value 0b'0100'.  A kworker task
            therefore acquires the rcu_state structure's ->exp_wake_mutex
            and starts awakening any tasks waiting for this grace period.
    
    5.      One of the first tasks awakened happens to be Task A.  Task A
            therefore releases the rcu_state structure's ->exp_mutex,
            which allows Task C to start the next expedited grace period,
            which causes the lower four bits of the rcu_state structure's
            ->expedited_sequence field to become 0b'0101'.
    
    6.      Task C's expedited grace period completes, so that the lower four
            bits of the rcu_state structure's ->expedited_sequence field now
            become 0b'1000'.
    
    7.      The kworker task from step 4 above continues its wakeups.
            Unfortunately, the wake_up_all() refetches the rcu_state
            structure's .expedited_sequence field:
    
            wake_up_all(&rnp->exp_wq[rcu_seq_ctr(rcu_state.expedited_sequence) & 0x3]);
    
            This results in the wakeup being applied to the rcu_node
            structure's ->exp_wq[2] field, which is unfortunate given that
            Task B is instead waiting on ->exp_wq[1].
    
    On a busy system, no harm is done (or at least no permanent harm is done).
    Some later expedited grace period will redo the wakeup.  But on a quiet
    system, such as many embedded systems, it might be a good long time before
    there was another expedited grace period.  On such embedded systems,
    this situation could therefore result in a system hang.
    
    This issue manifested as DPM device timeout during suspend (which
    usually qualifies as a quiet time) due to a SCSI device being stuck in
    _synchronize_rcu_expedited(), with the following stack trace:
    
            schedule()
            synchronize_rcu_expedited()
            synchronize_rcu()
            scsi_device_quiesce()
            scsi_bus_suspend()
            dpm_run_callback()
            __device_suspend()
    
    This commit therefore prevents such delays, timeouts, and hangs by
    making rcu_exp_wait_wake() use its "s" argument consistently instead of
    refetching from rcu_state.expedited_sequence.
    
    Fixes: 3b5f668e715b ("rcu: Overlap wakeups with next expedited grace period")
    Signed-off-by: Neeraj Upadhyay <neeraju@codeaurora.org>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    Signed-off-by: David Chen <david.chen@nutanix.com>
    Acked-by: Neeraj Upadhyay <neeraju@codeaurora.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/rcu/tree_exp.h b/kernel/rcu/tree_exp.h
index 0b2c2ad69629..72770a551c24 100644
--- a/kernel/rcu/tree_exp.h
+++ b/kernel/rcu/tree_exp.h
@@ -613,7 +613,7 @@ static void rcu_exp_wait_wake(struct rcu_state *rsp, unsigned long s)
 			spin_unlock(&rnp->exp_lock);
 		}
 		smp_mb(); /* All above changes before wakeup. */
-		wake_up_all(&rnp->exp_wq[rcu_seq_ctr(rsp->expedited_sequence) & 0x3]);
+		wake_up_all(&rnp->exp_wq[rcu_seq_ctr(s) & 0x3]);
 	}
 	trace_rcu_exp_grace_period(rsp->name, s, TPS("endwake"));
 	mutex_unlock(&rsp->exp_wake_mutex);

commit 41d2efaed5bdabe675857e6ecaa324b5504fc268
Author: Radim Kr?má? <rkrcmar@redhat.com>
Date:   Thu Nov 7 07:53:42 2019 -0500

    KVM: remember position in kvm->vcpus array
    
    commit 8750e72a79dda2f665ce17b62049f4d62130d991 upstream.
    
    Fetching an index for any vcpu in kvm->vcpus array by traversing
    the entire array everytime is costly.
    This patch remembers the position of each vcpu in kvm->vcpus array
    by storing it in vcpus_idx under kvm_vcpu structure.
    
    Signed-off-by: Radim Kr?má? <rkrcmar@redhat.com>
    Signed-off-by: Nitesh Narayan Lal <nitesh@redhat.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    [borntraeger@de.ibm.com]: backport to 4.19 (also fits for 5.4)
    Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
    Acked-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 8dd4ebb58e97..827f70ce0b49 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -248,7 +248,8 @@ struct kvm_vcpu {
 	struct preempt_notifier preempt_notifier;
 #endif
 	int cpu;
-	int vcpu_id;
+	int vcpu_id; /* id given by userspace at creation */
+	int vcpu_idx; /* index in kvm->vcpus array */
 	int srcu_idx;
 	int mode;
 	u64 requests;
@@ -551,13 +552,7 @@ static inline struct kvm_vcpu *kvm_get_vcpu_by_id(struct kvm *kvm, int id)
 
 static inline int kvm_vcpu_get_idx(struct kvm_vcpu *vcpu)
 {
-	struct kvm_vcpu *tmp;
-	int idx;
-
-	kvm_for_each_vcpu(idx, tmp, vcpu->kvm)
-		if (tmp == vcpu)
-			return idx;
-	BUG();
+	return vcpu->vcpu_idx;
 }
 
 #define kvm_for_each_memslot(memslot, slots)	\
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index a3d82113ae1c..86ef740763b5 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -2751,7 +2751,8 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id)
 		goto unlock_vcpu_destroy;
 	}
 
-	BUG_ON(kvm->vcpus[atomic_read(&kvm->online_vcpus)]);
+	vcpu->vcpu_idx = atomic_read(&kvm->online_vcpus);
+	BUG_ON(kvm->vcpus[vcpu->vcpu_idx]);
 
 	/* Now it's all set up, let userspace reach it */
 	kvm_get_kvm(kvm);
@@ -2761,7 +2762,7 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id)
 		goto unlock_vcpu_destroy;
 	}
 
-	kvm->vcpus[atomic_read(&kvm->online_vcpus)] = vcpu;
+	kvm->vcpus[vcpu->vcpu_idx] = vcpu;
 
 	/*
 	 * Pairs with smp_rmb() in kvm_get_vcpu.  Write kvm->vcpus

commit ddf58efd05b5d16d86ea4638675e8bd397320930
Author: Ilya Leoshkevich <iii@linux.ibm.com>
Date:   Mon Sep 6 15:04:14 2021 +0200

    s390/bpf: Fix optimizing out zero-extensions
    
    commit db7bee653859ef7179be933e7d1384644f795f26 upstream.
    
    Currently the JIT completely removes things like `reg32 += 0`,
    however, the BPF_ALU semantics requires the target register to be
    zero-extended in such cases.
    
    Fix by optimizing out only the arithmetic operation, but not the
    subsequent zero-extension.
    
    Reported-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
    Fixes: 054623105728 ("s390/bpf: Add s390x eBPF JIT compiler backend")
    Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
    Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
    Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c
index 8508c2c0e2a3..bdc33d0e3ffc 100644
--- a/arch/s390/net/bpf_jit_comp.c
+++ b/arch/s390/net/bpf_jit_comp.c
@@ -561,10 +561,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
 		EMIT4(0xb9080000, dst_reg, src_reg);
 		break;
 	case BPF_ALU | BPF_ADD | BPF_K: /* dst = (u32) dst + (u32) imm */
-		if (!imm)
-			break;
-		/* alfi %dst,imm */
-		EMIT6_IMM(0xc20b0000, dst_reg, imm);
+		if (imm != 0) {
+			/* alfi %dst,imm */
+			EMIT6_IMM(0xc20b0000, dst_reg, imm);
+		}
 		EMIT_ZERO(dst_reg);
 		break;
 	case BPF_ALU64 | BPF_ADD | BPF_K: /* dst = dst + imm */
@@ -586,10 +586,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
 		EMIT4(0xb9090000, dst_reg, src_reg);
 		break;
 	case BPF_ALU | BPF_SUB | BPF_K: /* dst = (u32) dst - (u32) imm */
-		if (!imm)
-			break;
-		/* alfi %dst,-imm */
-		EMIT6_IMM(0xc20b0000, dst_reg, -imm);
+		if (imm != 0) {
+			/* alfi %dst,-imm */
+			EMIT6_IMM(0xc20b0000, dst_reg, -imm);
+		}
 		EMIT_ZERO(dst_reg);
 		break;
 	case BPF_ALU64 | BPF_SUB | BPF_K: /* dst = dst - imm */
@@ -616,10 +616,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
 		EMIT4(0xb90c0000, dst_reg, src_reg);
 		break;
 	case BPF_ALU | BPF_MUL | BPF_K: /* dst = (u32) dst * (u32) imm */
-		if (imm == 1)
-			break;
-		/* msfi %r5,imm */
-		EMIT6_IMM(0xc2010000, dst_reg, imm);
+		if (imm != 1) {
+			/* msfi %r5,imm */
+			EMIT6_IMM(0xc2010000, dst_reg, imm);
+		}
 		EMIT_ZERO(dst_reg);
 		break;
 	case BPF_ALU64 | BPF_MUL | BPF_K: /* dst = dst * imm */
@@ -670,6 +670,8 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
 			if (BPF_OP(insn->code) == BPF_MOD)
 				/* lhgi %dst,0 */
 				EMIT4_IMM(0xa7090000, dst_reg, 0);
+			else
+				EMIT_ZERO(dst_reg);
 			break;
 		}
 		/* lhi %w0,0 */
@@ -762,10 +764,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
 		EMIT4(0xb9820000, dst_reg, src_reg);
 		break;
 	case BPF_ALU | BPF_XOR | BPF_K: /* dst = (u32) dst ^ (u32) imm */
-		if (!imm)
-			break;
-		/* xilf %dst,imm */
-		EMIT6_IMM(0xc0070000, dst_reg, imm);
+		if (imm != 0) {
+			/* xilf %dst,imm */
+			EMIT6_IMM(0xc0070000, dst_reg, imm);
+		}
 		EMIT_ZERO(dst_reg);
 		break;
 	case BPF_ALU64 | BPF_XOR | BPF_K: /* dst = dst ^ imm */
@@ -786,10 +788,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
 		EMIT6_DISP_LH(0xeb000000, 0x000d, dst_reg, dst_reg, src_reg, 0);
 		break;
 	case BPF_ALU | BPF_LSH | BPF_K: /* dst = (u32) dst << (u32) imm */
-		if (imm == 0)
-			break;
-		/* sll %dst,imm(%r0) */
-		EMIT4_DISP(0x89000000, dst_reg, REG_0, imm);
+		if (imm != 0) {
+			/* sll %dst,imm(%r0) */
+			EMIT4_DISP(0x89000000, dst_reg, REG_0, imm);
+		}
 		EMIT_ZERO(dst_reg);
 		break;
 	case BPF_ALU64 | BPF_LSH | BPF_K: /* dst = dst << imm */
@@ -811,10 +813,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
 		EMIT6_DISP_LH(0xeb000000, 0x000c, dst_reg, dst_reg, src_reg, 0);
 		break;
 	case BPF_ALU | BPF_RSH | BPF_K: /* dst = (u32) dst >> (u32) imm */
-		if (imm == 0)
-			break;
-		/* srl %dst,imm(%r0) */
-		EMIT4_DISP(0x88000000, dst_reg, REG_0, imm);
+		if (imm != 0) {
+			/* srl %dst,imm(%r0) */
+			EMIT4_DISP(0x88000000, dst_reg, REG_0, imm);
+		}
 		EMIT_ZERO(dst_reg);
 		break;
 	case BPF_ALU64 | BPF_RSH | BPF_K: /* dst = dst >> imm */

commit 089105b20527f0b5fc7c15fcfcd2e536b9695a3d
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Thu Sep 16 11:19:12 2021 +0800

    rk: scripts/mkimg: Support Create U-Boot FIT Image use ${BOOT_ITS}
    
    Change-Id: Id878ebf13606f1be324b11d89cb803ec9ed6c209
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>

diff --git a/boot.its b/boot.its
new file mode 100644
index 000000000000..755005c424b4
--- /dev/null
+++ b/boot.its
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2021 Rockchip Electronics Co., Ltd
+ *
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+/dts-v1/;
+/ {
+    description = "FIT image with Linux kernel, FDT blob and resource";
+
+    images {
+        fdt {
+            data = /incbin/("fdt");
+            type = "flat_dt";
+            arch = "";
+            compression = "none";
+            load = <0xffffff00>;
+
+            hash {
+                algo = "sha256";
+            };
+        };
+
+        kernel {
+            data = /incbin/("kernel");
+            type = "kernel";
+            arch = "";
+            os = "linux";
+            compression = "";
+            entry = <0xffffff01>;
+            load = <0xffffff01>;
+
+            hash {
+                algo = "sha256";
+            };
+        };
+
+        resource {
+            data = /incbin/("resource");
+            type = "multi";
+            arch = "";
+            compression = "none";
+
+            hash {
+                algo = "sha256";
+            };
+        };
+    };
+
+    configurations {
+        default = "conf";
+
+        conf {
+            rollback-index = <0x00>;
+            fdt = "fdt";
+            kernel = "kernel";
+            multi = "resource";
+
+            signature {
+                algo = "sha256,rsa2048";
+                padding = "pss";
+                key-name-hint = "dev";
+                sign-images = "fdt", "kernel", "multi";
+            };
+        };
+    };
+};
diff --git a/scripts/mkimg b/scripts/mkimg
index aba1511a8f93..fdfb02ff9710 100755
--- a/scripts/mkimg
+++ b/scripts/mkimg
@@ -55,14 +55,13 @@ KERNEL_IMAGE_PATH=${objtree}/arch/${ARCH}/boot/Image
 KERNEL_IMAGE_ARG="--kernel ${KERNEL_IMAGE_PATH}"
 if [ "${ARCH}" == "arm" ]; then
 	DTB_PATH=${objtree}/arch/arm/boot/dts/${DTB}
-	KERNEL_ZIMAGE_PATH=${objtree}/arch/arm/boot/zImage
-	KERNEL_ZIMAGE_ARG="--kernel ${KERNEL_ZIMAGE_PATH}"
 	ZIMAGE=zImage
 else
 	DTB_PATH=${objtree}/arch/arm64/boot/dts/rockchip/${DTB}
-	KERNEL_ZIMAGE_ARG="--kernel ${objtree}/arch/arm64/boot/Image.lz4"
 	ZIMAGE=Image.lz4
 fi
+KERNEL_ZIMAGE_PATH=${objtree}/arch/${ARCH}/boot/${ZIMAGE}
+KERNEL_ZIMAGE_ARG="--kernel ${KERNEL_ZIMAGE_PATH}"
 if [ ! -f ${DTB_PATH} ]; then
 	echo "No dtb" >&2
 	usage
@@ -204,6 +203,29 @@ repack_itb()
 	gen_itb
 }
 
+# Create U-Boot FIT Image use ${BOOT_ITS}
+make_fit_boot_img()
+{
+	ITS=${OUT}/boot.its
+
+	check_mkimage
+	mkdir -p ${OUT}
+	rm -f ${OUT}/fdt ${OUT}/kernel ${OUT}/resource ${ITS}
+
+	cp -a ${BOOT_ITS} ${ITS}
+	cp -a ${DTB_PATH} ${OUT}/fdt
+	cp -a ${KERNEL_ZIMAGE_PATH} ${OUT}/kernel
+	cp -a resource.img ${OUT}/resource
+
+	if [ "${ARCH}" == "arm64" ]; then
+		sed -i -e 's/arch = ""/arch = "arm64"/g' -e 's/compression = ""/compression = "lz4"/' ${ITS}
+	else
+		sed -i -e 's/arch = ""/arch = "arm"/g' -e 's/compression = ""/compression = "none"/' ${ITS}
+	fi
+	FIT_DESC=$(${MKIMAGE} ${MKIMAGE_ARG} -f ${ITS} boot.img | grep "FIT description" | sed 's/FIT description: //')
+	echo "  Image:  boot.img (${FIT_DESC}) is ready";
+}
+
 if [ -x ${srctree}/scripts/bmpconvert ]; then
 	if [ -f ${LOGO_PATH} ]; then
 		${srctree}/scripts/bmpconvert ${LOGO_PATH};
@@ -235,6 +257,8 @@ if [ -f "${BOOT_IMG}" ]; then
 	elif [ -x ${srctree}/scripts/repack-bootimg ]; then
 		repack_boot_img;
 	fi
+elif [ -f "${BOOT_ITS}" ]; then
+	make_fit_boot_img;
 elif [ -x ${srctree}/scripts/mkbootimg ]; then
 	make_boot_img;
 fi

commit 8df01b9fa0d32c6a321e3317ad395ecdad6b6ef8
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Fri Sep 24 10:21:07 2021 +0800

    arm64: dts: rockchip: rk3566-box: Fixup inputclkfs for hdmi audio
    
    Fixes: 1232b84288d6 ("arm64: dts: rockchip: add rk3566 box dts")
    
    Change-Id: I36b5b09149dfd3537e500925134a49f777b6b0b0
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi
index ce72808fa3bc..36f43fe4558f 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi
@@ -44,7 +44,7 @@
 	hdmi_sound: hdmi-sound {
 		compatible = "simple-audio-card";
 		simple-audio-card,format = "i2s";
-		simple-audio-card,mclk-fs = <256>;
+		simple-audio-card,mclk-fs = <128>;
 		simple-audio-card,name = "hdmi-sound";
 		status = "okay";
 

commit f86904e7fea8ff42e52e57dfd61c84af99ed2a20
Author: Ziyuan Xu <xzy.xu@rock-chips.com>
Date:   Sun Sep 26 10:48:01 2021 +0800

    ASoC: es7202: provide configuration for i2c_bus_num/mic_max_channels
    
    Configuration is flexible than hard code, and minimal changes.
    
    Change-Id: I15835fcbf198252410feb3feb6080ca047388ce1
    Signed-off-by: Ziyuan Xu <xzy.xu@rock-chips.com>

diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
index 4e127a40ba3b..67fded33ef93 100644
--- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig
@@ -607,6 +607,21 @@ config SND_SOC_ES7134
 config SND_SOC_ES7202
        tristate "Everest Semi ES7202 PDM 2CH ADC"
 
+config SND_SOC_ES7202_MIC_MAX_CHANNELS
+	int "the maximum channels of es7202's microphone"
+	depends on SND_SOC_ES7202
+	default 4
+	range 2 16
+	help
+	  Should be one of MIC_CHN_* of sound/soc/codecs/es7202.h.
+
+config SND_SOC_ES7202_I2C_BUS
+	int "i2c bus number"
+	depends on SND_SOC_ES7202
+	default 1
+	help
+	  Used to hard code an i2c bus number.
+
 config SND_SOC_ES7210
 	tristate "Everest Semi ES7210 CODEC"
 	depends on I2C
diff --git a/sound/soc/codecs/es7202.h b/sound/soc/codecs/es7202.h
index fb8643c0a3b2..b4b94778e1c6 100644
--- a/sound/soc/codecs/es7202.h
+++ b/sound/soc/codecs/es7202.h
@@ -56,7 +56,7 @@
 #define MIC_CHN_4       4
 #define MIC_CHN_2       2
 
-#define ES7202_CHANNELS_MAX     MIC_CHN_4
+#define ES7202_CHANNELS_MAX     CONFIG_SND_SOC_ES7202_MIC_MAX_CHANNELS
 
 #if ES7202_CHANNELS_MAX == MIC_CHN_2
 #define ADC_DEV_MAXNUM  1
@@ -84,7 +84,7 @@
 #endif
 
 /* select I2C bus number for es7202 */
-#define ES7202_I2C_BUS_NUM    1
+#define ES7202_I2C_BUS_NUM	CONFIG_SND_SOC_ES7202_I2C_BUS
 
 /* 
 * select DTS or I2C Detect method for es7202 

commit 1ac27c2f80cdf8166dba712257b98870933ad82c
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Thu Sep 2 15:07:13 2021 +0800

    media: rockchip: cif fix errors in rgb24 data format
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I0766997860f06dc25e604c2ea8425049a987fdc5

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index 6c0aa7d8b32d..36bd2c99c707 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -1785,13 +1785,11 @@ static int rkcif_csi_channel_init(struct rkcif_stream *stream,
 	 * needs aligned with :ALIGN(bits_per_pixel * width * 2, 8), to optimize reading and
 	 * writing of ddr, aliged with 256
 	 */
-	if (fmt->fmt_type == CIF_FMT_TYPE_RAW && stream->is_compact) {
+	if (fmt->fmt_type == CIF_FMT_TYPE_RAW && stream->is_compact &&
+	    fmt->csi_fmt_val != CSI_WRDDR_TYPE_RGB888) {
 		channel->virtual_width = ALIGN(channel->width * fmt->raw_bpp / 8, 256);
 	} else {
-		if (fmt->fmt_type == CIF_FMT_TYPE_RAW && fmt->csi_fmt_val != CSI_WRDDR_TYPE_RAW8)
-			channel->virtual_width = ALIGN(channel->width * 2, 8);
-		else
-			channel->virtual_width = ALIGN(channel->width * fmt->bpp[0] / 8, 8);
+		channel->virtual_width = ALIGN(channel->width * fmt->bpp[0] / 8, 8);
 	}
 
 	if (channel->fmt_val == CSI_WRDDR_TYPE_RGB888)
@@ -3240,7 +3238,8 @@ static void rkcif_set_fmt(struct rkcif_stream *stream,
 
 		if (fmt->fmt_type == CIF_FMT_TYPE_RAW && stream->is_compact &&
 		    (dev->active_sensor->mbus.type == V4L2_MBUS_CSI2 ||
-		     dev->active_sensor->mbus.type == V4L2_MBUS_CCP2)) {
+		     dev->active_sensor->mbus.type == V4L2_MBUS_CCP2) &&
+		     fmt->csi_fmt_val != CSI_WRDDR_TYPE_RGB888) {
 			bpl = ALIGN(width * fmt->raw_bpp / 8, 256);
 		} else {
 			bpp = rkcif_align_bits_per_pixel(stream, fmt, i);
@@ -4659,13 +4658,11 @@ static void rkcif_cal_csi_crop_width_vwidth(struct rkcif_stream *stream,
 	 * needs aligned with :ALIGN(bits_per_pixel * width * 2, 8), to optimize reading and
 	 * writing of ddr, aliged with 256
 	 */
-	if (fmt->fmt_type == CIF_FMT_TYPE_RAW && stream->is_compact) {
+	if (fmt->fmt_type == CIF_FMT_TYPE_RAW && stream->is_compact &&
+	    fmt->csi_fmt_val != CSI_WRDDR_TYPE_RGB888) {
 		*crop_vwidth = ALIGN(raw_width * fmt->raw_bpp / 8, 256);
 	} else {
-		if (fmt->fmt_type == CIF_FMT_TYPE_RAW)
-			*crop_vwidth = ALIGN(raw_width * 2, 8);
-		else
-			*crop_vwidth = ALIGN(raw_width * fmt->bpp[0] / 8, 8);
+		*crop_vwidth = ALIGN(raw_width * fmt->bpp[0] / 8, 8);
 	}
 
 	if (channel->fmt_val == CSI_WRDDR_TYPE_RGB888)

commit 6adc164ec8519b6c34b6a191dd23e9e8179dc2fe
Author: Wyon Bi <bivvy.bi@rock-chips.com>
Date:   Fri Sep 24 16:12:52 2021 +0800

    mfd: Drop unused rk610/rk616 driver
    
    Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>
    Change-Id: I76c73d0c565b04261a099373c7a9200d6058b8ec

diff --git a/drivers/mfd/rk610-core.c b/drivers/mfd/rk610-core.c
deleted file mode 100644
index a76bb44cdc97..000000000000
--- a/drivers/mfd/rk610-core.c
+++ /dev/null
@@ -1,387 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/i2c.h>
-#include <linux/device.h>
-#include <linux/delay.h>
-#include <asm/gpio.h>
-#include <linux/mfd/core.h>
-#include <linux/mfd/rk610_core.h>
-#include <linux/clk.h>
-#include <linux/gpio.h>
-#include <linux/err.h>
-#include <linux/slab.h>
-#include <linux/of.h>
-#include <linux/of_gpio.h>
-
-#if defined(CONFIG_DEBUG_FS)
-#include <linux/fs.h>
-#include <linux/debugfs.h>
-#include <linux/seq_file.h>
-#include <linux/uaccess.h>
-#endif
-
-#define GPIO_HIGH 1
-#define GPIO_LOW 0
-
-/*
- * Debug
- */
-#if 0
-#define	DBG(x...)	printk(KERN_INFO x)
-#else
-#define	DBG(x...)
-#endif
-
-static struct i2c_client *rk610_control_client = NULL;
-
-int i2c_master_reg8_send(const struct i2c_client *client, const char reg, const char *buf, int count, int scl_rate)
-{
-	struct i2c_adapter *adap=client->adapter;
-	struct i2c_msg msg;
-	int ret;
-	char *tx_buf = (char *)kmalloc(count + 1, GFP_KERNEL);
-	if(!tx_buf)
-		return -ENOMEM;
-	tx_buf[0] = reg;
-	memcpy(tx_buf+1, buf, count); 
-
-	msg.addr = client->addr;
-	msg.flags = client->flags;
-	msg.len = count + 1;
-	msg.buf = (char *)tx_buf;
-	msg.scl_rate = scl_rate;
-//	msg.udelay = client->udelay;
-
-	ret = i2c_transfer(adap, &msg, 1);
-	kfree(tx_buf);
-	return (ret == 1) ? count : ret;
-
-}
-
-int i2c_master_reg8_recv(const struct i2c_client *client, const char reg, char *buf, int count, int scl_rate)
-{
-	struct i2c_adapter *adap=client->adapter;
-	struct i2c_msg msgs[2];
-	int ret;
-	char reg_buf = reg;
-	
-	msgs[0].addr = client->addr;
-	msgs[0].flags = client->flags;
-	msgs[0].len = 1;
-	msgs[0].buf = &reg_buf;
-	msgs[0].scl_rate = scl_rate;
-//	msgs[0].udelay = client->udelay;
-
-	msgs[1].addr = client->addr;
-	msgs[1].flags = client->flags | I2C_M_RD;
-	msgs[1].len = count;
-	msgs[1].buf = (char *)buf;
-	msgs[1].scl_rate = scl_rate;
-//	msgs[1].udelay = client->udelay;
-
-	ret = i2c_transfer(adap, msgs, 2);
-
-	return (ret == 2)? count : ret;
-}
-
-
-static struct mfd_cell rk610_devs[] = {
-	{
-		.name = "rk610-lcd",
-		.id = 0,
-	},
-};
-
-int rk610_control_send_byte(const char reg, const char data)
-{
-	int ret;
-
-	DBG("reg = 0x%02x, val=0x%02x\n", reg ,data);
-
-	if(rk610_control_client == NULL)
-		return -1;
-	//i2c_master_reg8_send
-	ret = i2c_master_reg8_send(rk610_control_client, reg, &data, 1, 100*1000);
-	if (ret > 0)
-		ret = 0;
-
-	return ret;
-}
-
-#ifdef CONFIG_SND_SOC_RK610
-static unsigned int current_pll_value = 0;
-int rk610_codec_pll_set(unsigned int rate)
-{
-	char N, M, NO, DIV;
-	unsigned int F;
-	char data;
-
-	if(current_pll_value == rate)
-		return 0;
-
-    // Input clock is 12MHz.
-	if(rate == 11289600) {
-		// For 11.2896MHz, N = 2 M= 75 F = 0.264(0x43958) NO = 8
-		N = 2;
-		NO = 3;
-		M = 75;
-		F = 0x43958;
-		DIV = 5;
-	}
-	else if(rate == 12288000) {
-		// For 12.2888MHz, N = 2 M= 75 F = 0.92(0xEB851) NO = 8
-		N = 2;
-		NO = 3;
-		M = 75;
-		F = 0xEB851;
-		DIV = 5;
-	}
-	else {
-		printk(KERN_ERR "[%s] not support such frequency\n", __FUNCTION__);
-		return -1;
-	}
-
-	//Enable codec pll fractional number and power down.
-    data = 0x00;
-    rk610_control_send_byte(RK610_CONTROL_REG_C_PLL_CON5, data);
-	msleep(10);
-
-    data = (N << 4) | NO;
-    rk610_control_send_byte(RK610_CONTROL_REG_C_PLL_CON0, data);
-    // M
-    data = M;
-    rk610_control_send_byte(RK610_CONTROL_REG_C_PLL_CON1, data);
-    // F
-    data = F & 0xFF;
-    rk610_control_send_byte(RK610_CONTROL_REG_C_PLL_CON2, data);
-    data = (F >> 8) & 0xFF;
-    rk610_control_send_byte(RK610_CONTROL_REG_C_PLL_CON3, data);
-    data = (F >> 16) & 0xFF;
-    rk610_control_send_byte(RK610_CONTROL_REG_C_PLL_CON4, data);
-
-    // i2s mclk = codec_pll/5;
-    i2c_master_reg8_recv(rk610_control_client, RK610_CONTROL_REG_CLOCK_CON1, &data, 1, 100*1000);
-    data &= ~CLOCK_CON1_I2S_DVIDER_MASK;
-    data |= (DIV - 1);
-    rk610_control_send_byte(RK610_CONTROL_REG_CLOCK_CON1, data);
-
-    // Power up codec pll.
-    data |= C_PLL_POWER_ON;
-    rk610_control_send_byte(RK610_CONTROL_REG_C_PLL_CON5, data);
-
-    current_pll_value = rate;
-    DBG("[%s] rate %u\n", __FUNCTION__, rate);
-
-    return 0;
-}
-
-void rk610_control_init_codec(void)
-{
-    struct i2c_client *client = rk610_control_client;
-    char data = 0;
-    int ret;
-
-    if(rk610_control_client == NULL)
-    	return;
-	DBG("[%s] start\n", __FUNCTION__);
-
-    //gpio_set_value(RK610_RESET_PIN, GPIO_LOW); //reset rk601
-   // mdelay(100);
-    //gpio_set_value(RK610_RESET_PIN, GPIO_HIGH);
-    //mdelay(100);
-
-   	// Set i2c glitch timeout.
-	data = 0x22;
-	ret = i2c_master_reg8_send(client, RK610_CONTROL_REG_I2C_CON, &data, 1, 20*1000);
-
-//    rk610_codec_pll_set(11289600);
-
-    //use internal codec, enable DAC ADC LRCK output.
-//    i2c_master_reg8_recv(client, RK610_CONTROL_REG_CODEC_CON, &data, 1, 100*1000);
-//    data = CODEC_CON_BIT_DAC_LRCL_OUTPUT_DISABLE | CODEC_CON_BIT_ADC_LRCK_OUTPUT_DISABLE;
-//	data = CODEC_CON_BIT_ADC_LRCK_OUTPUT_DISABLE;
-	data = 0;
-   	rk610_control_send_byte(RK610_CONTROL_REG_CODEC_CON, data);
-
-    // Select internal i2s clock from codec_pll.
-    i2c_master_reg8_recv(rk610_control_client, RK610_CONTROL_REG_CLOCK_CON1, &data, 1, 100*1000);
-//    data |= CLOCK_CON1_I2S_CLK_CODEC_PLL;
-	data = 0;
-    rk610_control_send_byte(RK610_CONTROL_REG_CLOCK_CON1, data);
-
-    i2c_master_reg8_recv(client, RK610_CONTROL_REG_CODEC_CON, &data, 1, 100*1000);
-    DBG("[%s] RK610_CONTROL_REG_CODEC_CON is %x\n", __FUNCTION__, data);
-
-    i2c_master_reg8_recv(client, RK610_CONTROL_REG_CLOCK_CON1, &data, 1, 100*1000);
-    DBG("[%s] RK610_CONTROL_REG_CLOCK_CON1 is %x\n", __FUNCTION__, data);
-}
-#endif
-
-static int rk610_read_p0_reg(struct i2c_client *client, char reg, char *val)
-{
-	return i2c_master_reg8_recv(client, reg, val, 1, 100*1000) > 0? 0: -EINVAL;
-}
-
-static int rk610_write_p0_reg(struct i2c_client *client, char reg, char *val)
-{
-	return i2c_master_reg8_send(client, reg, val, 1, 100*1000) > 0? 0: -EINVAL;
-}
-
-
-#if defined(CONFIG_DEBUG_FS)
-static int rk610_reg_show(struct seq_file *s, void *v)
-{
-	char reg = 0;
-	u8 val = 0;
-	struct rk610_core_info *core_info = s->private;
-	if(!core_info)
-	{
-		dev_err(core_info->dev,"no mfd rk610!\n");
-		return 0;
-	}
-
-	for(reg=C_PLL_CON0;reg<= I2C_CON;reg++)
-	{
-		rk610_read_p0_reg(core_info->client, reg,  &val);
-		if(reg%8==0)
-			seq_printf(s,"\n0x%02x:",reg);
-		seq_printf(s," %02x",val);
-	}
-	seq_printf(s,"\n");
-
-	return 0;
-}
-
-static ssize_t rk610_reg_write (struct file *file, const char __user *buf, size_t count, loff_t *ppos)
-{ 
-	struct rk610_core_info *core_info = file->f_path.dentry->d_inode->i_private;
-	u32 reg,val;
-	
-	char kbuf[25];
-	if (copy_from_user(kbuf, buf, count))
-		return -EFAULT;
-	sscanf(kbuf, "%x%x", &reg,&val);
-	rk610_write_p0_reg(core_info->client, reg,  (u8*)&val);
-	return count;
-}
-
-static int rk610_reg_open(struct inode *inode, struct file *file)
-{
-	struct rk610_core_info *core_info = inode->i_private;
-	return single_open(file,rk610_reg_show,core_info);
-}
-
-static const struct file_operations rk610_reg_fops = {
-	.owner		= THIS_MODULE,
-	.open		= rk610_reg_open,
-	.read		= seq_read,
-	.write          = rk610_reg_write,
-	.llseek		= seq_lseek,
-	.release	= single_release,
-};
-#endif
-
-static int rk610_control_probe(struct i2c_client *client,
-			const struct i2c_device_id *id)
-{
-	int ret;
-	struct rk610_core_info *core_info = NULL; 
-	struct device_node *rk610_np;
-
-	DBG("[%s] start\n", __FUNCTION__);
-	core_info = kmalloc(sizeof(struct rk610_core_info), GFP_KERNEL);
-	if(!core_info)
-	{
-		dev_err(&client->dev, ">> rk610 core inf kmalloc fail!");
-		return -ENOMEM;
-	}
-	memset(core_info, 0, sizeof(struct rk610_core_info));
-
-	rk610_control_client = client;
-	
-	core_info->client = client;
-	core_info->dev = &client->dev;
-	i2c_set_clientdata(client,core_info);
-	
-	rk610_np = core_info->dev->of_node;
-	core_info->reset_gpio = of_get_named_gpio(rk610_np,"rk610-reset-io", 0);
-	if (!gpio_is_valid(core_info->reset_gpio)){
-		printk("invalid core_info->reset_gpio: %d\n",core_info->reset_gpio);
-		return -1;
-	}
-	ret = gpio_request(core_info->reset_gpio, "rk610-reset-io");
-	if( ret != 0){
-		printk("gpio_request core_info->reset_gpio invalid: %d\n",core_info->reset_gpio);
-		return ret;
-	}
-	gpio_direction_output(core_info->reset_gpio, GPIO_HIGH);
-	msleep(100);
-	gpio_direction_output(core_info->reset_gpio, GPIO_LOW);
-	msleep(100);
-	gpio_set_value(core_info->reset_gpio, GPIO_HIGH);
-
-	core_info->i2s_clk= clk_get(&client->dev, "i2s_clk");
-	if (IS_ERR(core_info->i2s_clk)) {
-		dev_err(&client->dev, "Can't retrieve i2s clock\n");
-		ret = PTR_ERR(core_info->i2s_clk);
-		return ret;
-	}
-	clk_set_rate(core_info->i2s_clk, 11289600);
-	clk_prepare_enable(core_info->i2s_clk);
-
-	ret = mfd_add_devices(&client->dev, -1,
-				      rk610_devs, ARRAY_SIZE(rk610_devs),
-				      NULL,0,NULL);
-	
-#if defined(CONFIG_DEBUG_FS)
-	core_info->debugfs_dir = debugfs_create_dir("rk610", NULL);
-	if (IS_ERR(core_info->debugfs_dir))
-	{
-		dev_err(&client->dev,"failed to create debugfs dir for rk610!\n");
-	}
-	else
-		debugfs_create_file("core", S_IRUSR,core_info->debugfs_dir,core_info,&rk610_reg_fops);
-#endif
-
-    return 0;
-}
-
-static int rk610_control_remove(struct i2c_client *client)
-{
-	return 0;
-}
-
-static const struct i2c_device_id rk610_control_id[] = {
-	{ "rk610_ctl", 0 },
-	{ }
-};
-MODULE_DEVICE_TABLE(i2c, rk610_control_id);
-
-static struct i2c_driver rk610_control_driver = {
-	.driver = {
-		.name = "rk610_ctl",
-	},
-	.probe = rk610_control_probe,
-	.remove = rk610_control_remove,
-	.id_table = rk610_control_id,
-};
-
-static int __init rk610_control_init(void)
-{
-	return i2c_add_driver(&rk610_control_driver);
-}
-
-static void __exit rk610_control_exit(void)
-{
-	i2c_del_driver(&rk610_control_driver);
-}
-
-subsys_initcall_sync(rk610_control_init);
-module_exit(rk610_control_exit);
-
-
-MODULE_DESCRIPTION("RK610 control driver");
-MODULE_AUTHOR("Rock-chips, <www.rock-chips.com>");
-MODULE_LICENSE("GPL");
-
diff --git a/drivers/mfd/rk616-core.c b/drivers/mfd/rk616-core.c
deleted file mode 100644
index 630fd4ad5285..000000000000
--- a/drivers/mfd/rk616-core.c
+++ /dev/null
@@ -1,712 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/delay.h>
-#include <linux/mfd/core.h>
-#include <linux/slab.h>
-#include <linux/mfd/rk616.h>
-//#include <mach/iomux.h>
-#include <linux/err.h>
-#include <linux/uaccess.h>
-#include <linux/interrupt.h>
-#include <linux/of_gpio.h>
-#include <linux/of_device.h>
-#if defined(CONFIG_DEBUG_FS)
-#include <linux/fs.h>
-#include <linux/debugfs.h>
-#include <linux/seq_file.h>
-#endif
-
-#if defined(RK616_MIPI_DSI)
-#include "../video/rockchip/transmitter/rk616_mipi_dsi.h"
-#endif
-
-#ifndef MHZ
-#define MHZ (1000*1000)
-#endif
-
-static struct mfd_cell rk616_devs[] = {
-	{
-		.name = "rk616-lvds",
-		.id = 0,
-	},
-	{
-		.name = "rk616-codec",
-		.id = 1,
-	},
-	{
-		.name = "rk616-hdmi",
-		.id = 2,
-	},
-	{
-		.name = "rk616-mipi",
-		.id = 3,
-	},
-};
-
-extern int rk_mipi_dsi_init_lite(void);
-void rk616_mclk_set_rate(struct clk *mclk,unsigned long rate)
-{
-	clk_set_rate(mclk, rate);
-}
-
-static int rk616_i2c_read_reg(struct mfd_rk616 *rk616, u16 reg,u32 *pval)
-{
-	struct i2c_client * client = rk616->client;
-	struct i2c_adapter *adap = client->adapter;
-	struct i2c_msg msgs[2];
-	int ret;
-	char reg_buf[2];
-	
-	memcpy(reg_buf, &reg, 2);
-
-	msgs[0].addr = client->addr;
-	msgs[0].flags = client->flags;
-	msgs[0].len = 2;
-	msgs[0].buf = reg_buf;
-	msgs[0].scl_rate = rk616->pdata->scl_rate;
-	//msgs[0].udelay = client->udelay;
-
-	msgs[1].addr = client->addr;
-	msgs[1].flags = client->flags | I2C_M_RD;
-	msgs[1].len = 4;
-	msgs[1].buf = (char *)pval;
-	msgs[1].scl_rate = rk616->pdata->scl_rate;
-	//msgs[1].udelay = client->udelay;
-
-	ret = i2c_transfer(adap, msgs, 2);
-
-	
-	return (ret == 2)? 4 : ret;
-
-}
-
-static int rk616_i2c_write_reg(struct mfd_rk616 *rk616, u16 reg,u32 *pval)
-{
-	struct i2c_client *client = rk616->client;
-	struct i2c_adapter *adap = client->adapter;
-	struct i2c_msg msg;
-	int ret;
-	char *tx_buf = (char *)kmalloc(6, GFP_KERNEL);
-	if(!tx_buf)
-		return -ENOMEM;
-	
-	memcpy(tx_buf, &reg, 2); 
-	memcpy(tx_buf+2, (char *)pval, 4); 
-
-	msg.addr = client->addr;
-	msg.flags = client->flags;
-	msg.len = 6;
-	msg.buf = (char *)tx_buf;
-	msg.scl_rate = rk616->pdata->scl_rate;
-	//msg.udelay = client->udelay;
-
-	ret = i2c_transfer(adap, &msg, 1);
-	kfree(tx_buf);
-	
-	return (ret == 1) ? 4 : ret;
-}
-
-
-static int rk616_i2c_write_bits(struct mfd_rk616 *rk616, u16 reg,u32 mask,u32 *pval)
-{
-	
-	struct i2c_client *client = rk616->client;
-	struct i2c_adapter *adap = client->adapter;
-	struct i2c_msg msg;
-	int ret;
-	u32 reg_val;
-	char *tx_buf = NULL;
-	
-	tx_buf = (char *)kmalloc(6, GFP_KERNEL);
-	if(!tx_buf)
-		return -ENOMEM;
-	
-	mutex_lock(&rk616->reg_lock);
-	rk616->read_dev(rk616,reg,&reg_val);
-	reg_val &= ~mask;
-	*pval &= mask;
-	reg_val |= *pval;
-	*pval = reg_val;
-	memcpy(tx_buf, &reg, 2); 
-	memcpy(tx_buf+2, (char *)pval, 4); 
-
-	msg.addr = client->addr;
-	msg.flags = client->flags;
-	msg.len = 6;
-	msg.buf = (char *)tx_buf;
-	msg.scl_rate = rk616->pdata->scl_rate;
-	//msg.udelay = client->udelay;
-
-	ret = i2c_transfer(adap, &msg, 1);
-	kfree(tx_buf);
-	mutex_unlock(&rk616->reg_lock);
-	
-	return (ret == 1) ? 4 : ret;
-}
-
-
-static int rk616_i2c_bulk_write(struct mfd_rk616 *rk616, u16 reg,int count,u32 *pval)
-{
-	const struct i2c_client *client = rk616->client;
-	struct i2c_adapter *adap=client->adapter;
-	struct i2c_msg msg;
-	int ret;
-	
-	
-	char *tx_buf = (char *)kmalloc((count<<2) + 2, GFP_KERNEL);
-	if(!tx_buf)
-		return -ENOMEM;
-	
-	memcpy(tx_buf, &reg, 2); 
-	memcpy(tx_buf+2, (char *)pval, count<<2); 
-
-	msg.addr = client->addr;
-	msg.flags = client->flags;
-	msg.len = (count<<2) + 2;
-	msg.buf = (char *)tx_buf;
-	msg.scl_rate = rk616->pdata->scl_rate;
-	//msg.udelay = client->udelay;
-
-	ret = i2c_transfer(adap, &msg, 1);
-	kfree(tx_buf);
-	
-	return (ret == 1) ? count : ret;
-}
-
-#if defined(CONFIG_DEBUG_FS)
-
-static int rk616_reg_show(struct seq_file *s, void *v)
-{
-	int i = 0;
-	u32 val = 0;
-	struct mfd_rk616 *rk616 = s->private;
-	if(!rk616)
-	{
-		dev_err(rk616->dev,"no mfd rk616!\n");
-		return 0;
-	}
-
-	for(i=0;i<= CRU_CFGMISC_CON;i+=4)
-	{
-		rk616->read_dev(rk616,i,&val);
-		if(i%16==0)
-			seq_printf(s,"\n0x%04x:",i);
-		seq_printf(s," %08x",val);
-	}
-	seq_printf(s,"\n");
-
-	return 0;
-}
-
-static ssize_t rk616_reg_write (struct file *file, const char __user *buf, size_t count, loff_t *ppos)
-{ 
-	struct mfd_rk616 *rk616 = file->f_path.dentry->d_inode->i_private;
-	u32 reg;
-	u32 val;
-	
-	char kbuf[25];
-	if (copy_from_user(kbuf, buf, count))
-		return -EFAULT;
-	sscanf(kbuf, "%x%x", &reg,&val);
-	rk616->write_dev(rk616,reg,&val);
-	return count;
-}
-
-static int rk616_reg_open(struct inode *inode, struct file *file)
-{
-	struct mfd_rk616 *rk616 = inode->i_private;
-	return single_open(file,rk616_reg_show,rk616);
-}
-
-static const struct file_operations rk616_reg_fops = {
-	.owner		= THIS_MODULE,
-	.open		= rk616_reg_open,
-	.read		= seq_read,
-	.write          = rk616_reg_write,
-	.llseek		= seq_lseek,
-	.release	= single_release,
-};
-#endif
-
-
-static u32 rk616_clk_gcd(u32 numerator, u32 denominator)
-{
-	u32 a, b;
-
-	if (!numerator || !denominator)
-		return 0;
-
-	if (numerator > denominator) {
-		a = numerator;
-		b = denominator;
-	} else {
-		a = denominator;
-		b = numerator;
-	}
-
-	while (b != 0) {
-		int r = b;
-		b = a % b;
-		a = r;
-	}
-
-	return a;
-}
-
-
-static int rk616_pll_par_calc(u32 fin_hz,u32 fout_hz,u32 *refdiv, u32 *fbdiv,
-					u32 *postdiv1, u32 *postdiv2, u32 *frac)
-{
-	// FIXME set postdiv1/2 always 1 	
-	u32 gcd;
-	u64 fin_64, frac_64;
-	u32 f_frac;
-	if(!fin_hz || !fout_hz)
-		return -EINVAL;
-
-	if(fin_hz / MHZ * MHZ == fin_hz && fout_hz /MHZ * MHZ == fout_hz)
-	{
-		fin_hz /= MHZ;
-		fout_hz /= MHZ;
-		gcd = rk616_clk_gcd(fin_hz, fout_hz);
-		*refdiv = fin_hz / gcd;
-		*fbdiv = fout_hz / gcd;
-		*postdiv1 = 1;
-		*postdiv2 = 1;
-
-		*frac = 0;
-		
-	} 
-	else 
-	{
-		
-		gcd = rk616_clk_gcd(fin_hz / MHZ, fout_hz / MHZ);
-		*refdiv = fin_hz / MHZ / gcd;
-		*fbdiv = fout_hz / MHZ / gcd;
-		*postdiv1 = 1;
-		*postdiv2 = 1;
-
-		*frac = 0;
-
-		f_frac = (fout_hz % MHZ);
-		fin_64 = fin_hz;
-		do_div(fin_64, (u64)*refdiv);
-		frac_64 = (u64)f_frac << 24;
-		do_div(frac_64, fin_64);
-		*frac = (u32) frac_64;
-		printk(KERN_INFO "frac_64=%llx, frac=%u\n", frac_64, *frac);
-	}
-	printk(KERN_INFO "fin=%u,fout=%u,gcd=%u,refdiv=%u,fbdiv=%u,postdiv1=%u,postdiv2=%u,frac=%u\n",
-				fin_hz, fout_hz, gcd, *refdiv, *fbdiv, *postdiv1, *postdiv2, *frac);
-	return 0;
-}
-
-
-static  int  rk616_pll_wait_lock(struct mfd_rk616 *rk616,int id)
-{
-	u32 delay = 10;
-	u32 val = 0;
-	int ret;
-	int offset;
-
-	if(id == 0)  //PLL0
-	{
-		offset = 0;
-	}
-	else // PLL1
-	{
-		offset = 0x0c;
-	}
-	while (delay >= 1) 
-	{
-		ret = rk616->read_dev(rk616,CRU_PLL0_CON1 + offset,&val);
-		if (val&PLL0_LOCK)
-		{
-			rk616_dbg(rk616->dev,"PLL%d locked\n",id);
-			break;
-		}
-		msleep(1);
-		delay--;
-	}
-	if (delay == 0)
-	{
-		dev_err(rk616->dev,"rk616 wait PLL%d lock time out!\n",id);
-	}
-
-	return 0;
-}
-
-
-
-int rk616_pll_pwr_down(struct mfd_rk616 *rk616,int id)
-{
-	u32 val = 0;
-	int ret;
-	int offset;
-	if(id == 0)  //PLL0
-	{
-		offset = 0;
-	}
-	else // PLL1
-	{
-		offset = 0x0c;
-	}
-
-
-	val = PLL0_PWR_DN | (PLL0_PWR_DN << 16);
-	ret = rk616->write_dev(rk616,CRU_PLL0_CON1 + offset,&val);
-
-	return 0;
-	
-}
-
-
-
-int rk616_pll_set_rate(struct mfd_rk616 *rk616,int id,u32 cfg_val,u32 frac)
-{
-	u32 val = 0;
-	int ret;
-	int offset;
-	u16 con0 = cfg_val & 0xffff;
-	u16 con1 = (cfg_val >> 16)&0xffff;
-	u32 fbdiv = con0 & 0xfff;
-	u32 postdiv1 = (con0 >> 12)&0x7;
-	u32 refdiv = con1 & 0x3f;
-	u32 postdiv2 = (con1 >> 6) & 0x7;
-	u8 mode = !frac;
-	
-	if(id == 0)  //PLL0
-	{
-		if(((rk616->pll0_rate >> 32) == cfg_val) && 
-			((rk616->pll0_rate & 0xffffffff) == frac))
-		{
-			//return 0;
-		}
-		rk616->pll0_rate = ((u64)cfg_val << 32) | frac;
-		offset = 0;
-	}
-	else // PLL1
-	{
-		if(((rk616->pll1_rate >> 32) == cfg_val) && 
-			((rk616->pll1_rate & 0xffffffff) == frac))
-		{
-			// return 0;
-		}
-		rk616->pll1_rate = ((u64)cfg_val << 32) | frac;
-		offset = 0x0c;
-	}
-
-
-	val = PLL0_PWR_DN | (PLL0_PWR_DN << 16);
-	ret = rk616->write_dev(rk616,CRU_PLL0_CON1 + offset,&val);
-	
-
-	ret = rk616->read_dev(rk616,CRU_PLL0_CON2 + offset,&val);
-	val &= 0xff000000;
-	if(frac)
-		val |= PLL0_FRAC(frac);
-	else
-		val |= 0x800000; //default value
-	ret = rk616->write_dev(rk616,CRU_PLL0_CON2 + offset,&val);
-
-	val = PLL0_POSTDIV1(postdiv1) | PLL0_FBDIV(fbdiv) | PLL0_POSTDIV1_MASK | 
-		PLL0_FBDIV_MASK | (PLL0_BYPASS << 16);
-	ret = rk616->write_dev(rk616,CRU_PLL0_CON0 + offset,&val);
-
-	val = PLL0_DIV_MODE(mode) | PLL0_POSTDIV2(postdiv2) | PLL0_REFDIV(refdiv) |
-		(PLL0_DIV_MODE_MASK) | PLL0_POSTDIV2_MASK | PLL0_REFDIV_MASK;
-	ret = rk616->write_dev(rk616,CRU_PLL0_CON1 + offset,&val);
-	
-	val = (PLL0_PWR_DN << 16);
-	ret = rk616->write_dev(rk616,CRU_PLL0_CON1 + offset,&val);
-	
-	rk616_pll_wait_lock(rk616,id);
-
-	msleep(5);
-
-	return 0;	
-	
-}
-/***********************************
-default clk patch settiing:
-CLKIN-------->CODEC
-LCD_DCLK0--->PLL0--->Dither--->LVDS/MIPI
-LCD_DCLK1--->PLL1--->HDMI
-************************************/
-
-static int rk616_clk_common_init(struct mfd_rk616 *rk616)
-{
-	u32 val = 0;
-	int ret;
-
-	val = PLL1_CLK_SEL(LCD1_DCLK) | PLL0_CLK_SEL(LCD0_DCLK) | LCD1_CLK_DIV(0) | 
-		LCD0_CLK_DIV(0) | PLL1_CLK_SEL_MASK | PLL0_CLK_SEL_MASK | 
-		LCD1_CLK_DIV_MASK | LCD0_CLK_DIV_MASK; //pll1 clk from lcdc1_dclk,pll0 clk from lcdc0_dclk,mux_lcdx = lcdx_clk
-	ret = rk616->write_dev(rk616,CRU_CLKSEL0_CON,&val);
-
-	val = SCLK_SEL(SCLK_SEL_PLL1) | CODEC_MCLK_SEL(CODEC_MCLK_SEL_12M) |
-		CODEC_MCLK_SEL_MASK | SCLK_SEL_MASK; //codec mclk from clkin
-	ret = rk616->write_dev(rk616,CRU_CLKSEL1_CON,&val);
-	
-	val = 0; //codec mck = clkin
-	ret = rk616->write_dev(rk616,CRU_CODEC_DIV,&val);
-
-	val = (PLL0_BYPASS) | (PLL0_BYPASS << 16);  //bypass pll0 
-	ret = rk616->write_dev(rk616,CRU_PLL0_CON0,&val);
-	val = PLL0_PWR_DN | (PLL0_PWR_DN << 16);
-	ret = rk616->write_dev(rk616,CRU_PLL0_CON1,&val); //power down pll0
-
-	val = (PLL1_BYPASS) | (PLL1_BYPASS << 16);
-	ret = rk616->write_dev(rk616,CRU_PLL1_CON0,&val);
-	
-
-	return 0;
-}
-
-static int rk616_core_suspend(struct device *dev, pm_message_t state)
-{
-	return 0;	
-}
-
-static int rk616_core_resume(struct device* dev)
-{
-	struct mfd_rk616 *rk616 = dev_get_drvdata(dev);
-	rk616_clk_common_init(rk616);
-	return 0;
-}
-
-/*
-dts:
-
-/include/ "rk616.dtsi"
-&rk616 {
-        rk616,scl_rate = <100000>;
-        rk616,lcd0_func = <1>;
-        rk616,lcd1_func = <1>;
-        rk616,lvds_ch_nr = <1>;
-        rk616,hdmi_irq_gpio = <&gpio2 GPIO_D6 1>;
-
-	rk616-codec {
-		spk-ctl-gpio = <&gpio2 GPIO_D7 GPIO_ACTIVE_HIGH>;
-		hp-ctl-gpio = <&gpio2 GPIO_D7 GPIO_ACTIVE_HIGH>;
-		//rcv-ctl-gpio = <&gpio2 GPIO_D7 GPIO_ACTIVE_HIGH>;
-		//mic-sel-gpio = <&gpio2 GPIO_D7 GPIO_ACTIVE_HIGH>;
-
-		//delay for MOSFET or SPK power amplifier chip(ms)
-		spk-amplifier-delay = <150>;
-		hp-mosfet-delay = <50>;
-
-		//hp-mic-capture-from-linein; //If hpmic is connected to linein, set this.
-		//hp-mic-capture-from-mic2in; //If hpmic is connected to mic2, set this.
-		//virtual-hp-gnd; //If hp gnd is not connected to gnd(0V), set this.
-
-		//volume setting: 0 ~ 31, -18dB ~ 28.5dB, Step: 1.5dB
-		skp-volume = <24>;
-		hp-volume = <24>;
-		capture-volume = <24>;
-	};
-
-        power_ctr: rk616_power_ctr {
-                rk616_pwren: rk616_pwren {
-                        rockchip,power_type = <GPIO>;
-                        gpios = <&gpio0 GPIO_A3 GPIO_ACTIVE_HIGH>;
-                        rockchip,delay = <0>;
-                };
-
-                rk616_rst: rk616_rst {
-                        rockchip,power_type = <GPIO>;
-                        gpios = <&gpio3 GPIO_B2 GPIO_ACTIVE_HIGH>;
-                        rockchip,delay = <10>;
-                };
-
-        };
-};
-*/
-#ifdef CONFIG_OF
-static struct rk616_platform_data *rk616_parse_dt(struct mfd_rk616 *rk616)
-{
-	struct rk616_platform_data *pdata = NULL;
-	struct device_node *rk616_np = rk616->dev->of_node;
-	int val = 0,gpio = 0;
-
-	if (!rk616_np) {
-		printk("could not find rk616 node\n");
-		return NULL;
-	}
-
-	pdata = devm_kzalloc(rk616->dev, sizeof(struct rk616_platform_data), GFP_KERNEL);
-	if (!pdata) {
-		dev_err(rk616->dev, "rk616_platform_data kmalloc fail!");
-		return NULL;
-	}
-
-	if(!of_property_read_u32(rk616_np, "rk616,scl_rate", &val))
-		pdata->scl_rate = val;
-
-	if(!of_property_read_u32(rk616_np, "rk616,lcd0_func", &val))
-		pdata->lcd0_func = val;
-
-	if(!of_property_read_u32(rk616_np, "rk616,lcd1_func", &val))
-		pdata->lcd1_func = val;
-
-	if(!of_property_read_u32(rk616_np, "rk616,lvds_ch_nr", &val))
-		pdata->lvds_ch_nr = val;
-
-	gpio = of_get_named_gpio(rk616_np,"rk616,hdmi_irq_gpio", 0);
-	if (!gpio_is_valid(gpio))
-		printk("invalid hdmi_irq_gpio: %d\n",gpio);
-	pdata->hdmi_irq = gpio;
-	//TODO Daisen >>pwr gpio wait to add
-
-	return pdata;
-}
-#else
-static struct rk616_platform_data *rk616_parse_dt(struct mfd_rk616 *rk616)
-{
-	return NULL;
-}
-#endif
-
-#if defined(CONFIG_OF)
-static const struct of_device_id rk616_dt_ids[] = {
-	{.compatible = "rockchip,rk616",},
-	{}
-};
-MODULE_DEVICE_TABLE(of, rk616_dt_ids);
-#endif
-
-
-static int rk616_i2c_probe(struct i2c_client *client,const struct i2c_device_id *id)
-{
-	int ret;
-	struct mfd_rk616 *rk616 = NULL;
-	struct clk *iis_clk;
-
-	if (client->dev.of_node) {
-		if (!of_match_device(rk616_dt_ids, &client->dev)) {
-			dev_err(&client->dev, "Failed to find matching dt id\n");
-			return -EINVAL;
-		}
-	}
-
-	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) 
-	{
-		dev_err(&client->dev, "Must have I2C_FUNC_I2C.\n");
-		ret = -ENODEV;
-	}
-	rk616 = kzalloc(sizeof(struct mfd_rk616), GFP_KERNEL);
-	if (rk616 == NULL)
-	{
-		printk(KERN_ALERT "alloc for struct rk616 fail\n");
-		ret = -ENOMEM;
-	}
-	
-	rk616->dev = &client->dev;
-	rk616->pdata = rk616_parse_dt(rk616);
-	rk616->client = client;
-	i2c_set_clientdata(client, rk616);
-	dev_set_drvdata(rk616->dev,rk616);
-	
-#if defined(CONFIG_SND_RK29_SOC_I2S_8CH)        
-	iis_clk = clk_get_sys("rk29_i2s.0", "i2s");
-#elif defined(CONFIG_SND_RK29_SOC_I2S_2CH)
-	iis_clk = clk_get_sys("rk29_i2s.1", "i2s");
-#else
-	iis_clk = clk_get_sys("rk29_i2s.2", "i2s");
-#endif
-	if (IS_ERR(iis_clk)) 
-	{
-		dev_err(&client->dev,"failed to get i2s clk\n");
-		ret = PTR_ERR(iis_clk);
-	}
-	else
-	{
-		rk616->mclk = iis_clk;
-		
-		#if defined(CONFIG_ARCH_RK29)
-		rk29_mux_api_set(GPIO2D0_I2S0CLK_MIIRXCLKIN_NAME, GPIO2H_I2S0_CLK);
-		#else
-		//iomux_set(I2S0_MCLK); //set at i2s driver
-		#endif
-		clk_enable(iis_clk);
-		//clk_set_rate(iis_clk, 11289600);
-		rk616_mclk_set_rate(iis_clk,11289600);
-		//clk_put(iis_clk);
-	}
-
-	mutex_init(&rk616->reg_lock);
-	
-	if(rk616->pdata->power_init)
-		rk616->pdata->power_init();
-	
-	rk616->read_dev = rk616_i2c_read_reg;
-	rk616->write_dev = rk616_i2c_write_reg;
-	rk616->write_dev_bits = rk616_i2c_write_bits;
-	rk616->write_bulk = rk616_i2c_bulk_write;
-	
-#if defined(CONFIG_DEBUG_FS)
-	rk616->debugfs_dir = debugfs_create_dir("rk616", NULL);
-	if (IS_ERR(rk616->debugfs_dir))
-	{
-		dev_err(rk616->dev,"failed to create debugfs dir for rk616!\n");
-	}
-	else
-		debugfs_create_file("core", S_IRUSR,rk616->debugfs_dir,rk616,&rk616_reg_fops);
-#endif
-	rk616_clk_common_init(rk616);
-	ret = mfd_add_devices(rk616->dev, -1,
-				      rk616_devs, ARRAY_SIZE(rk616_devs),
-				      NULL, rk616->irq_base, NULL);
-	
-	dev_info(&client->dev,"rk616 core probe success!\n");
-	return 0;
-}
-
-static int rk616_i2c_remove(struct i2c_client *client)
-{
-	return 0;
-}
-
-static void rk616_core_shutdown(struct i2c_client *client)
-{
-	struct mfd_rk616 *rk616 = i2c_get_clientdata(client);
-	if(rk616->pdata->power_deinit)
-		rk616->pdata->power_deinit();
-}
-
-
-static const struct i2c_device_id id_table[] = {
-	{"rk616", 0 },
-	{ }
-};
-
-static struct i2c_driver rk616_i2c_driver  = {
-	.driver = {
-		.name  = "rk616",
-		.owner = THIS_MODULE,
-		.suspend        = &rk616_core_suspend,
-		.resume         = &rk616_core_resume,
-		.of_match_table = of_match_ptr(rk616_dt_ids),
-	},
-	.probe		= &rk616_i2c_probe,
-	.remove     	= &rk616_i2c_remove,
-	.shutdown       = &rk616_core_shutdown,
-	.id_table	= id_table,
-};
-
-
-static int __init rk616_module_init(void)
-{
-	return i2c_add_driver(&rk616_i2c_driver);
-}
-
-static void __exit rk616_module_exit(void)
-{
-	i2c_del_driver(&rk616_i2c_driver);
-}
-
-subsys_initcall_sync(rk616_module_init);
-module_exit(rk616_module_exit);
-
-
diff --git a/drivers/mfd/rk616-vif.c b/drivers/mfd/rk616-vif.c
deleted file mode 100644
index ba3343627809..000000000000
--- a/drivers/mfd/rk616-vif.c
+++ /dev/null
@@ -1,826 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/mfd/rk616.h>
-
-
-
-extern int rk616_pll_set_rate(struct mfd_rk616 *rk616,int id,u32 cfg_val,u32 frac);
-extern int rk616_pll_pwr_down(struct mfd_rk616 *rk616,int id);
-
-
-/*rk616 video interface config*/
-
- int rk616_vif_disable(struct mfd_rk616 *rk616,int id)
-{
-	u32 val = 0;
-	int ret = 0;
-	
-	if(id == 0) //video interface 0
-	{
-			val = (VIF0_EN << 16); //disable vif0
-			ret = rk616->write_dev(rk616,VIF0_REG0,&val);
-		
-	}
-	else       //vide0 interface 1
-	{
-			val = (VIF0_EN << 16); //disabl VIF1
-			ret = rk616->write_dev(rk616,VIF1_REG0,&val);
-			
-	}
-	
-	msleep(21);
-	
-	if(id == 0) //video interface 0
-	{
-			val = VIF0_CLK_GATE | (VIF0_CLK_GATE << 16); //gating vif0
-			ret = rk616->write_dev(rk616,CRU_CLKSEL2_CON,&val);
-		
-	}
-	else       //vide0 interface 1
-	{
-			val = VIF1_CLK_GATE | (VIF1_CLK_GATE << 16); //gating vif1
-			ret = rk616->write_dev(rk616,CRU_CLKSEL2_CON,&val);
-			
-	}
-
-	rk616_dbg(rk616->dev,"rk616 vif%d disable\n",id);
-	
-	return 0;
-}
-
-
-int rk616_vif_enable(struct mfd_rk616 *rk616,int id)
-{
-	u32 val = 0;
-	u32 offset = 0;
-	int ret;
-
-	
-	if(id == 0)
-	{
-		val = (VIF0_CLK_BYPASS << 16) | (VIF0_CLK_GATE << 16);
-		offset = 0;
-	}
-	else
-	{
-		val = (VIF1_CLK_BYPASS << 16) |(VIF1_CLK_GATE << 16);
-		offset = 0x18;
-	}
-
-	ret = rk616->write_dev(rk616,CRU_CLKSEL2_CON,&val);
-	
-	val = 0;
-	val |= (VIF0_DDR_CLK_EN <<16) | (VIF0_DDR_PHASEN_EN << 16) | (VIF0_DDR_MODE_EN << 16)|
-		(VIF0_EN <<16) | VIF0_EN; //disable ddr mode,enable VIF
-	ret = rk616->write_dev(rk616,VIF0_REG0 + offset,&val);
-
-	
-	rk616_dbg(rk616->dev,"rk616 vif%d enable\n",id);
-
-	return 0;
-	
-}
-static int  rk616_vif_bypass(struct mfd_rk616 *rk616,int id)
-{
-	u32 val = 0;
-	int ret;
-
-	if(id == 0)
-	{
-		val = (VIF0_CLK_BYPASS | VIF0_CLK_BYPASS << 16);
-	}
-	else
-	{
-		val = (VIF1_CLK_BYPASS | VIF1_CLK_BYPASS << 16);
-	}
-
-	ret = rk616->write_dev(rk616,CRU_CLKSEL2_CON,&val);
-
-	rk616_dbg(rk616->dev,"rk616 vif%d bypass\n",id);
-	return 0;
-}
-
-static bool pll_sel_mclk12m(struct mfd_rk616 *rk616,int pll_id)
-{
-	if(pll_id == 0) //pll0
-	{
-		if(rk616->route.pll0_clk_sel == PLL0_CLK_SEL(MCLK_12M))
-			return true;
-		else
-			return false;
-	}
-	else
-	{
-		if(rk616->route.pll1_clk_sel == PLL1_CLK_SEL(MCLK_12M))
-			return  true;
-		else
-			return false;	
-	}
-
-	return false;
-}
-
-
-
-int rk616_vif_cfg(struct mfd_rk616 *rk616,struct rk_screen *screen,int id)
-{
-	int ret = 0;
-	u32 val = 0;
-	int offset = 0;
-	int pll_id;
-	bool pll_use_mclk12m = false;
-	
-	if(id == 0) //video interface 0
-	{
-		if(!rk616->route.vif0_en)
-		{
-			rk616_vif_disable(rk616,id);
-			return 0;
-		}
-		offset = 0;
-		pll_id = rk616->route.vif0_clk_sel;
-	}
-	else       //vide0 interface 1
-	{
-		if(!rk616->route.vif1_en)
-		{
-			rk616_vif_disable(rk616,id);
-			return 0;
-		}
-		offset = 0x18;
-		pll_id = (rk616->route.vif1_clk_sel >> 6);
-		
-	}
-
-	pll_use_mclk12m = pll_sel_mclk12m(rk616,pll_id);
-	
-	if(pll_use_mclk12m)
-	{
-		//clk_set_rate(rk616->mclk, 12000000);
-		rk616_mclk_set_rate(rk616->mclk,12000000);
-	}
-
-	
-	if(!screen)
-	{
-		dev_err(rk616->dev,"%s:screen is null.........\n",__func__);
-		return -EINVAL;
-	}
-
-
-	rk616_vif_disable(rk616,id);
-	if( (screen->mode.xres == 1920) && (screen->mode.yres == 1080))
-	{
-		if(pll_use_mclk12m)
-			//rk616_pll_set_rate(rk616,pll_id,0xc11025,0x200000);
-			rk616_pll_set_rate(rk616,pll_id,0x028853de,0);
-		else
-			rk616_pll_set_rate(rk616,pll_id,0x02bf5276,0);
-		
-		val = (0xc1) | (0x01 <<16);
-	}
-	else if((screen->mode.xres == 1280) && (screen->mode.yres == 720))
-	{
-		if(pll_use_mclk12m)
-			//rk616_pll_set_rate(rk616,pll_id,0x01811025,0x200000);
-			rk616_pll_set_rate(rk616,pll_id,0x0288418c,0);
-		else
-			rk616_pll_set_rate(rk616,pll_id,0x1422014,0);
-		
-		val = (0xc1) | (0x01 <<16);
-	
-	}
-	else if((screen->mode.xres == 720))
-	{
-		if(pll_use_mclk12m )
-		{
-			rk616_pll_set_rate(rk616,pll_id,0x0306510e,0);
-		}
-		else
-			rk616_pll_set_rate(rk616,pll_id,0x1c13015,0);
-		
-		val = (0x1) | (0x01 <<16);
-	}
-
-	
-	
-	ret = rk616->write_dev(rk616,VIF0_REG1 + offset,&val);
-
-	val = (screen->mode.hsync_len << 16) | (screen->mode.hsync_len + screen->mode.left_margin + 
-		screen->mode.right_margin + screen->mode.xres);
-	ret = rk616->write_dev(rk616,VIF0_REG2 + offset,&val);
-
-	
-	val = ((screen->mode.hsync_len + screen->mode.left_margin + screen->mode.xres)<<16) |
-		(screen->mode.hsync_len + screen->mode.left_margin);
-	ret = rk616->write_dev(rk616,VIF0_REG3 + offset,&val);
-
-	val = (screen->mode.vsync_len << 16) | (screen->mode.vsync_len + screen->mode.upper_margin + 
-		screen->mode.lower_margin + screen->mode.yres);
-	ret = rk616->write_dev(rk616,VIF0_REG4 + offset,&val);
-
-
-	val = ((screen->mode.vsync_len + screen->mode.upper_margin + screen->mode.yres)<<16) |
-		(screen->mode.vsync_len + screen->mode.upper_margin);
-	ret = rk616->write_dev(rk616,VIF0_REG5 + offset,&val);
-
-	if(id == 0)
-	{
-		val = VIF0_SYNC_EN | (VIF0_SYNC_EN << 16);
-		rk616->write_dev(rk616,CRU_IO_CON0,&val);
-	}
-	else
-	{
-		val = VIF1_SYNC_EN | (VIF1_SYNC_EN << 16);
-		rk616->write_dev(rk616,CRU_IO_CON0,&val);
-	}
-	rk616_vif_enable(rk616,id);
-	
-	return ret;
-	
-}
-
-
-static int rk616_scaler_disable(struct mfd_rk616 *rk616)
-{
-	u32 val = 0;
-	int ret;
-	val &= (~SCL_EN);	//disable scaler
-	val |= (SCL_EN<<16);
-	ret = rk616->write_dev(rk616,SCL_REG0,&val);
-	rk616_dbg(rk616->dev,"rk616 scaler disable\n");
-	return 0;
-}
-
-int rk616_scaler_cfg(struct mfd_rk616 *rk616,struct rk_screen *screen)
-{
-	u32 scl_hor_mode,scl_ver_mode;
-	u32 scl_v_factor,scl_h_factor;
-	u32 scl_reg0_value,scl_reg1_value,scl_reg2_value;                //scl_con,scl_h_factor,scl_v_factor,
-	u32 scl_reg3_value,scl_reg4_value,scl_reg5_value,scl_reg6_value; //dsp_frame_hst,dsp_frame_vst,dsp_timing,dsp_act_timing
-	u32 scl_reg7_value,scl_reg8_value;                               //dsp_hbor ,dsp_vbor
-	u32 dst_frame_hst,dst_frame_vst;                    //ʱ򻺴
-	u32 dst_vact_st;
-
-	u32 dsp_htotal,dsp_hs_end,dsp_hact_st,dsp_hact_end; //scalertiming
-	u32 dsp_vtotal,dsp_vs_end,dsp_vact_st,dsp_vact_end; 
-	u32 dsp_hbor_end,dsp_hbor_st,dsp_vbor_end,dsp_vbor_st;
-	u32 src_w,src_h,src_htotal,dst_w,dst_h,src_vact_st;
-	u16 bor_right = 0;
-	u16 bor_left = 0;
-	u16 bor_up = 0;
-	u16 bor_down = 0;
-	u8 hor_down_mode = 0;  //1:average,0:bilinear
-	u8 ver_down_mode = 0;
-	u8 bic_coe_sel = 2;
-	struct rk_screen *src;
-	struct rk_screen *dst;
-	int pll_id;
-
-	struct rk616_route *route = &rk616->route;
-
-
-	if(!route->scl_en)
-	{
-		rk616_scaler_disable(rk616);
-		return 0;
-	}
-	
-	
-	dst = screen;
-	if(!dst)
-	{
-		dev_err(rk616->dev,"%s:screen is null!\n",__func__);
-		return -EINVAL;
-	}
-
-	if(route->scl_bypass)
-	{
-		src = dst;
-		dst->pll_cfg_val = 0x01422014;
-		dst->frac = 0;
-	}
-	else
-		src = screen->ext_screen;
-	
-	if(route->sclk_sel == SCLK_SEL(SCLK_SEL_PLL0))
-		pll_id = 0;
-	else
-		pll_id = 1;
-
-	rk616_scaler_disable(rk616);
-	rk616_pll_set_rate(rk616,pll_id,dst->pll_cfg_val,dst->frac);
-	dst_frame_vst = dst->scl_vst;
-	dst_frame_hst = dst->scl_hst;
-
-
-#if 1
-
-	src_htotal = src->mode.hsync_len + src->mode.left_margin + src->mode.xres + src->mode.right_margin;
-	src_vact_st = src->mode.vsync_len + src->mode.upper_margin  ;
-	dst_vact_st = dst->mode.vsync_len + dst->mode.upper_margin;
-
-	dsp_htotal    = dst->mode.hsync_len + dst->mode.left_margin + dst->mode.xres + dst->mode.right_margin; //dst_htotal ;
-	dsp_hs_end    = dst->mode.hsync_len;
-
-	dsp_vtotal    = dst->mode.vsync_len + dst->mode.upper_margin + dst->mode.yres + dst->mode.lower_margin;
-	dsp_vs_end    = dst->mode.vsync_len;
-
-	dsp_hbor_end  = dst->mode.hsync_len + dst->mode.left_margin + dst->mode.xres;
-	dsp_hbor_st   = dst->mode.hsync_len + dst->mode.left_margin  ;
-	dsp_vbor_end  = dst->mode.vsync_len + dst->mode.upper_margin + dst->mode.yres; //dst_vact_end ;
-	dsp_vbor_st   = dst_vact_st  ;
-
-	dsp_hact_st   = dsp_hbor_st  + bor_left;
-	dsp_hact_end  = dsp_hbor_end - bor_right; 
-	dsp_vact_st   = dsp_vbor_st  + bor_up;
-	dsp_vact_end  = dsp_vbor_end - bor_down; 
-
-	src_w = src->mode.xres;
-	src_h = src->mode.yres;
-	dst_w = dsp_hact_end - dsp_hact_st ;
-	dst_h = dsp_vact_end - dsp_vact_st ;
-
-	if(src_w > dst_w)         //жhorģʽ 0no_scl 1scl_up 2scl_down
-	{
-		scl_hor_mode = 0x2;   //scl_down
-		if(hor_down_mode == 0)//bilinear
-	    	{
-			if((src_w-1)/(dst_w-1) > 2)
-		    	{
-				scl_h_factor = ((src_w-1)<<14)/(dst_w-1);
-		    	}
-			else
-				scl_h_factor = ((src_w-2)<<14)/(dst_w-1);
-		}
-		else  //average
-		{
-			scl_h_factor = ((dst_w)<<16)/(src_w-1);
-		}
-	}
-	else if(src_w == dst_w)
-	{
-		scl_hor_mode = 0x0;   //no_Scl
-		scl_h_factor = 0x0;
-	} 
-	else 
-	{
-		scl_hor_mode = 0x1;   //scl_up
-		scl_h_factor = ((src_w-1)<<16)/(dst_w-1);
-	} 
-    
-	if(src_h > dst_h)         //жverģʽ 0no_scl 1scl_up 2scl_down
-	{
-		scl_ver_mode = 0x2;   //scl_down
-		if(ver_down_mode == 0)//bilinearhor_down_mode,u8 ver_down_mode
-		{
-			if((src_h-1)/(dst_h-1) > 2)
-			{
-				scl_v_factor = ((src_h-1)<<14)/(dst_h-1);
-			}
-			else
-				scl_v_factor = ((src_h-2)<<14)/(dst_h-1);
-		}
-		else
-		{
-			scl_v_factor = ((dst_h)<<16)/(src_h-1);
-		}
-	}
-	else if(src_h == dst_h)
-	{
-		scl_ver_mode = 0x0;   //no_Scl
-		scl_v_factor = 0x0;
-	}
-	else 
-	{
-		scl_ver_mode = 0x1;   //scl_up
-		scl_v_factor = ((src_h-1)<<16)/(dst_h-1);
-	}
-
-	//control   register0 
-	scl_reg0_value = (0x1ff<<16) | SCL_EN | (scl_hor_mode<<1) |
-			(scl_ver_mode<<3) | (bic_coe_sel<<5) | 
-			(hor_down_mode<<7) | (ver_down_mode<<8) ;
-	//factor    register1 
-	scl_reg1_value = (scl_v_factor << 16) | scl_h_factor ;
-	//dsp_frame register2 
-	scl_reg2_value = dst_frame_vst<<16 | dst_frame_hst ;
-	//dsp_h     register3
-	scl_reg3_value = dsp_hs_end<<16 | dsp_htotal ;
-	//dsp_hact  register4
-	scl_reg4_value = dsp_hact_end <<16 | dsp_hact_st ;
-	//dsp_v     register5
-	scl_reg5_value = dsp_vs_end<<16 | dsp_vtotal ;
-	//dsp_vact  register6
-	scl_reg6_value = dsp_vact_end<<16 | dsp_vact_st ;
-	//hbor      register7
-	scl_reg7_value = dsp_hbor_end<<16 | dsp_hbor_st ;
-	//vbor      register8
-	scl_reg8_value = dsp_vbor_end<<16 | dsp_vbor_st ;
- 
-	rk616->write_dev(rk616,SCL_REG1,&scl_reg1_value);  
-	rk616->write_dev(rk616,SCL_REG2,&scl_reg2_value);  
-	rk616->write_dev(rk616,SCL_REG3,&scl_reg3_value);  
-	rk616->write_dev(rk616,SCL_REG4,&scl_reg4_value);  
-	rk616->write_dev(rk616,SCL_REG5,&scl_reg5_value);  
-	rk616->write_dev(rk616,SCL_REG6,&scl_reg6_value);  
-	rk616->write_dev(rk616,SCL_REG7,&scl_reg7_value);  
-	rk616->write_dev(rk616,SCL_REG8,&scl_reg8_value);
-	rk616->write_dev(rk616,SCL_REG0,&scl_reg0_value); 
-
-	rk616_dbg(rk616->dev,"rk616 scaler enable\n");
-#endif
-	return 0;
-	
-}
-
-
-static int rk616_dual_input_cfg(struct mfd_rk616 *rk616,struct rk_screen *screen,
-					bool enable)
-{
-	struct rk616_platform_data *pdata = rk616->pdata;
-	struct rk616_route *route = &rk616->route;
-	
-	route->vif0_bypass = VIF0_CLK_BYPASS;
-	route->vif0_en     = 0;
- 	route->vif0_clk_sel = VIF0_CLKIN_SEL(VIF_CLKIN_SEL_PLL0);
-	route->pll0_clk_sel = PLL0_CLK_SEL(LCD0_DCLK);
-
-#if defined(CONFIG_RK616_USE_MCLK_12M)
-	route->pll1_clk_sel = PLL1_CLK_SEL(MCLK_12M);
-#else
-	route->pll1_clk_sel = PLL1_CLK_SEL(LCD1_DCLK);
-#endif
-
-	route->vif1_clk_sel = VIF1_CLKIN_SEL(VIF_CLKIN_SEL_PLL1);
-	route->hdmi_sel     = HDMI_IN_SEL(HDMI_IN_SEL_VIF1);
-	route->hdmi_clk_sel = HDMI_CLK_SEL(HDMI_CLK_SEL_VIF1);
-	if(enable)  //hdmi plug in
-	{
-		route->vif1_bypass  = 0;
-		route->vif1_en      = 1;
-		
-	}
-	else  //hdmi plug out
-	{
-		route->vif1_bypass = VIF1_CLK_BYPASS;
-		route->vif1_en     = 0;
-	}
-
-	route->sclin_sel   = SCL_IN_SEL(SCL_SEL_VIF0); //from vif0
-	route->scl_en      = 0;            //dual lcdc, scaler not needed
-	route->dither_sel  = DITHER_IN_SEL(DITHER_SEL_VIF0); //dither from vif0
-	route->lcd1_input  = 1; 
-	
-
-	if(screen->type == SCREEN_RGB)
-	{
-		route->lvds_en	   = 1;
-		route->lvds_mode   = RGB; //rgb output 
-	}
-	else if(screen->type == SCREEN_LVDS)
-	{
-		route->lvds_en	   = 1;
-		route->lvds_mode = LVDS;
-		route->lvds_ch_nr = pdata->lvds_ch_nr;
-	}
-	else if(screen->type == SCREEN_MIPI)
-	{
-		route->lvds_en = 0;
-	}
-	
-
-	return 0;
-	
-}
-
-static int rk616_lcd0_input_lcd1_unused_cfg(struct mfd_rk616 *rk616,struct rk_screen *screen,
-							bool enable)
-{
-	struct rk616_platform_data *pdata = rk616->pdata;
-	struct rk616_route *route = &rk616->route;
-	
-	if(enable)  //hdmi plug in
-	{
-		route->vif0_bypass  = 0;
-		route->vif0_en      = 1;
-		route->vif0_clk_sel = VIF0_CLKIN_SEL(VIF_CLKIN_SEL_PLL0);
-		route->sclin_sel    = SCL_IN_SEL(SCL_SEL_VIF0); //from vif0
-		route->scl_en       = 1;
-		route->sclk_sel     = SCLK_SEL(SCLK_SEL_PLL1);
-		route->dither_sel   = DITHER_IN_SEL(DITHER_SEL_SCL); //dither from sclaer
-		route->hdmi_sel     = HDMI_IN_SEL(HDMI_IN_SEL_VIF0);//from vif0
-		route->hdmi_clk_sel = HDMI_CLK_SEL(HDMI_CLK_SEL_VIF0);	
-	}
-	else
-	{
-		route->vif0_bypass = VIF0_CLK_BYPASS;
-		route->vif0_en     = 0;
-		route->sclin_sel   = SCL_IN_SEL(SCL_SEL_VIF0); //from vif0
-		route->scl_en      = 0;
-		route->dither_sel  = DITHER_IN_SEL(DITHER_SEL_VIF0); //dither from sclaer
-		route->hdmi_sel    = HDMI_IN_SEL(HDMI_IN_SEL_VIF0);//from vif0
-	}
-	route->pll1_clk_sel = PLL1_CLK_SEL(LCD0_DCLK);
-	//route->pll0_clk_sel = PLL0_CLK_SEL(LCD0_DCLK);
-
-#if defined(CONFIG_RK616_USE_MCLK_12M)
-	route->pll0_clk_sel = PLL0_CLK_SEL(MCLK_12M);
-#else
-	route->pll0_clk_sel = PLL0_CLK_SEL(LCD0_DCLK);
-#endif
-	route->vif1_bypass = VIF1_CLK_BYPASS;
-	route->vif1_en     = 0;
-	route->lcd1_input  = 0;  
-	
-	if(screen->type == SCREEN_RGB)
-	{
-		route->lvds_en	   = 1;
-		route->lvds_mode   = RGB; //rgb output 
-	}
-	else if(screen->type == SCREEN_LVDS)
-	{
-		route->lvds_en	   = 1;
-		route->lvds_mode = LVDS;
-		route->lvds_ch_nr = pdata->lvds_ch_nr;
-	}
-	else if(screen->type == SCREEN_MIPI)
-	{
-		route->lvds_en = 0;
-	}
-	
-
-	return 0;
-}
-
-
-static int rk616_lcd0_input_lcd1_output_cfg(struct mfd_rk616 *rk616,struct rk_screen *screen,
-							bool enable)
-{
-	struct rk616_route *route = &rk616->route;
-
-	if(enable)
-	{
-		route->vif0_bypass  = 0;
-		route->vif0_en      = 1;
-		route->vif0_clk_sel = VIF0_CLKIN_SEL(VIF_CLKIN_SEL_PLL0);
-		route->sclin_sel    = SCL_IN_SEL(SCL_SEL_VIF0); //from vif0
-		route->scl_en       = 1;
-		route->sclk_sel     = SCLK_SEL(SCLK_SEL_PLL1);
-		route->dither_sel   = DITHER_IN_SEL(DITHER_SEL_SCL); //dither from sclaer
-		route->hdmi_sel     = HDMI_IN_SEL(HDMI_IN_SEL_VIF0);//from vif0
-		route->hdmi_clk_sel = HDMI_CLK_SEL(HDMI_CLK_SEL_VIF0);
-	}
-	else
-	{
-		route->vif0_bypass = VIF0_CLK_BYPASS;
-		route->vif0_en     = 0;
-		route->sclin_sel   = SCL_IN_SEL(SCL_SEL_VIF0); //from vif0
-		route->scl_en      = 0;
-		route->dither_sel  = DITHER_IN_SEL(DITHER_SEL_VIF0); //dither from sclaer
-		route->hdmi_sel    = HDMI_IN_SEL(HDMI_IN_SEL_VIF0);//from vif0
-		route->hdmi_clk_sel = HDMI_CLK_SEL(HDMI_CLK_SEL_VIF1);
-	}
-	//route->pll0_clk_sel = PLL0_CLK_SEL(LCD0_DCLK);
-	route->pll1_clk_sel = PLL1_CLK_SEL(LCD0_DCLK);
-
-#if defined(CONFIG_RK616_USE_MCLK_12M)
-	route->pll0_clk_sel = PLL0_CLK_SEL(MCLK_12M);
-#else
-	route->pll0_clk_sel = PLL0_CLK_SEL(LCD0_DCLK);
-#endif
-	route->vif1_bypass = VIF1_CLK_BYPASS;
-	route->vif1_en = 0;
-	route->lcd1_input = 0; //lcd1 as out put
-	route->lvds_en	= 0;
-
-	//route->scl_en      = 0;
-	//route->dither_sel  = DITHER_IN_SEL(DITHER_SEL_VIF0);
-
-	return 0;
-	
-}
-
-
-static int rk616_lcd0_unused_lcd1_input_cfg(struct mfd_rk616 *rk616,struct rk_screen *screen,
-							bool enable)
-{
-	struct rk616_platform_data *pdata = rk616->pdata;
-	struct rk616_route *route = &rk616->route;
-
-	route->pll0_clk_sel = PLL0_CLK_SEL(LCD1_DCLK);
-//	route->pll1_clk_sel = PLL1_CLK_SEL(LCD1_DCLK);
-#if defined(CONFIG_RK616_USE_MCLK_12M)
-	route->pll1_clk_sel = PLL1_CLK_SEL(MCLK_12M);
-#else
-	route->pll1_clk_sel = PLL1_CLK_SEL(LCD1_DCLK);
-#endif
-	route->vif0_bypass = VIF0_CLK_BYPASS;
-	route->vif0_en     = 0;
-	if(enable)
-	{
-		route->vif1_bypass = 0;
-		route->vif1_en     = 1;
-		route->scl_bypass  = 0;
-	}
-	else
-	{
-		route->vif1_bypass = VIF1_CLK_BYPASS;
-		route->vif1_en     = 0;
-		route->scl_bypass = 1; //1:1 scaler
-	}
-	route->vif1_clk_sel = VIF1_CLKIN_SEL(VIF_CLKIN_SEL_PLL1);
-	route->sclin_sel   = SCL_IN_SEL(SCL_SEL_VIF1); //from vif1
-	route->scl_en      = 1;
-	route->sclk_sel    = SCLK_SEL(SCLK_SEL_PLL0);
-	
-	route->dither_sel  = DITHER_IN_SEL(DITHER_SEL_SCL); //dither from sclaer
-	route->hdmi_sel    = HDMI_IN_SEL(HDMI_IN_SEL_VIF1); //from vif1
-	route->hdmi_clk_sel = HDMI_CLK_SEL(HDMI_CLK_SEL_VIF1);
-	route->lcd1_input  = 1;  
-	if(screen->type == SCREEN_RGB)
-	{
-		route->lvds_en	   = 1;
-		route->lvds_mode   = RGB; //rgb output 
-	}
-	else if(screen->type == SCREEN_LVDS)
-	{
-		route->lvds_en = 1;
-		route->lvds_mode = LVDS;
-		route->lvds_ch_nr = pdata->lvds_ch_nr;
-	}
-	else if(screen->type == SCREEN_MIPI)
-	{
-		route->lvds_en = 0;
-	}
-	
-
-	return 0;
-}
-
-int  rk616_set_router(struct mfd_rk616 *rk616,struct rk_screen *screen,bool enable)
-{
-	struct rk616_platform_data *pdata = rk616->pdata;
-	int ret;
-
-	if((pdata->lcd0_func == INPUT) && (pdata->lcd1_func == INPUT))
-	{
-		
-		ret = rk616_dual_input_cfg(rk616,screen,enable);
-		rk616_dbg(rk616->dev,"rk616 use dual input for dual display!\n");
-	}
-	else if((pdata->lcd0_func == INPUT) && (pdata->lcd1_func == UNUSED))
-	{
-		ret = rk616_lcd0_input_lcd1_unused_cfg(rk616,screen,enable);
-
-		rk616_dbg(rk616->dev,
-			"rk616 use lcd0 as input and lvds/rgb "
-			"port as output for dual display\n");
-	}
-	else if((pdata->lcd0_func == INPUT) && (pdata->lcd1_func == OUTPUT))
-	{
-		ret = rk616_lcd0_input_lcd1_output_cfg(rk616,screen,enable);
-		
-		rk616_dbg(rk616->dev,
-			"rk616 use lcd0 as input and lcd1 as "
-			"output for dual display\n");
-	}
-	else if((pdata->lcd0_func == UNUSED) && (pdata->lcd1_func == INPUT))
-	{
-		ret = rk616_lcd0_unused_lcd1_input_cfg(rk616,screen,enable);
-		rk616_dbg(rk616->dev,
-			"rk616 use lcd1 as input and lvds/rgb as "
-			"output for dual display\n");
-	}
-	else
-	{
-		dev_err(rk616->dev,
-			"invalid configration,please check your"
-			"rk616_platform_data setting in your board file!\n");
-		return -EINVAL;
-	}
-
-	return ret ;
-	
-}
-
-
-
-
-static int rk616_router_cfg(struct mfd_rk616 *rk616)
-{
-	u32 val;
-	int ret;
-	struct rk616_route *route = &rk616->route;
-	val = (route->pll0_clk_sel) | (route->pll1_clk_sel) |
-		PLL1_CLK_SEL_MASK | PLL0_CLK_SEL_MASK; //pll1 clk from lcdc1_dclk,pll0 clk from lcdc0_dclk,mux_lcdx = lcdx_clk
-	ret = rk616->write_dev(rk616,CRU_CLKSEL0_CON,&val);
-	
-	val = (route->sclk_sel) | SCLK_SEL_MASK;
-	ret = rk616->write_dev(rk616,CRU_CLKSEL1_CON,&val);
-	
-	val = (SCL_IN_SEL_MASK) | (DITHER_IN_SEL_MASK) | (HDMI_IN_SEL_MASK) | 
-		(VIF1_CLKIN_SEL_MASK) | (VIF0_CLKIN_SEL_MASK) | (VIF1_CLK_BYPASS << 16) | 
-		(VIF0_CLK_BYPASS << 16) |(route->sclin_sel) | (route->dither_sel) | 
-		(route->hdmi_sel) | (route->vif1_bypass) | (route->vif0_bypass) |
-		(route->vif1_clk_sel)| (route->vif0_clk_sel); 
-	ret = rk616->write_dev(rk616,CRU_CLKSEL2_CON,&val);
-	val = route->hdmi_clk_sel;
-	ret = rk616->write_dev_bits(rk616,CRU_CFGMISC_CON,HDMI_CLK_SEL_MASK,&val);
-
-	return ret;
-}
-
-
-static int rk616_dither_cfg(struct mfd_rk616 *rk616,struct rk_screen *screen,bool enable)
-{
-	u32 val = 0;
-	int ret = 0;
-
-	if(screen->type != SCREEN_RGB) //if RGB screen , not invert D_CLK
-		val = FRC_DCLK_INV | (FRC_DCLK_INV << 16);
-	
-	if((screen->face != OUT_P888) && enable)  //enable frc dither if the screen is not 24bit
-		val |= FRC_DITHER_EN | (FRC_DITHER_EN << 16);
-		//val |= (FRC_DITHER_EN << 16);
-	else
-		val |= (FRC_DITHER_EN << 16);
-	ret = rk616->write_dev(rk616,FRC_REG,&val);
-
-	return 0;
-	
-}
-
-int rk616_display_router_cfg(struct mfd_rk616 *rk616,struct rk_screen *screen,bool enable)
-{
-	int ret;
-	struct rk_screen *hdmi_screen = screen->ext_screen;
-	ret = rk616_set_router(rk616,screen,enable);
-	if(ret < 0)
-		return ret;
-	ret = rk616_router_cfg(rk616);
-	
-	/*
-		If wake up, does not execute the rk616_vif_cfg can save 50ms time
-	*/
-	if(rk616->resume != 1){
-		ret = rk616_vif_cfg(rk616,hdmi_screen,0);
-		ret = rk616_vif_cfg(rk616,hdmi_screen,1);
-	}
-
-	ret = rk616_scaler_cfg(rk616,screen);			
-	ret = rk616_dither_cfg(rk616,screen,enable);
-	return 0;
-	
-}
-
-int rk616_set_vif(struct mfd_rk616 *rk616,struct rk_screen *screen,bool connect)
-{
-	struct rk616_platform_data *pdata;
-	if(!rk616)
-	{
-		printk(KERN_ERR "%s:mfd rk616 is null!\n",__func__);
-		return -1;
-	}
-	else
-	{
-		pdata = rk616->pdata;
-	}
-
-	if(!connect)
-	{
-		rk616_vif_disable(rk616,0);
-		rk616_vif_disable(rk616,1);
-                rk616_mclk_set_rate(rk616->mclk, 11289600);
-		return 0;
-	}
-#if defined(CONFIG_ONE_LCDC_DUAL_OUTPUT_INF)
-	return 0;
-#else
-	if((pdata->lcd0_func == INPUT) && (pdata->lcd1_func == INPUT))
-	{
-		
-		rk616_dual_input_cfg(rk616,screen,connect);
-		rk616_dbg(rk616->dev,"rk616 use dual input for dual display!\n");
-	}
-	else if((pdata->lcd0_func == INPUT) && (pdata->lcd1_func == UNUSED))
-	{
-		rk616_lcd0_input_lcd1_unused_cfg(rk616,screen,connect);
-		rk616_dbg(rk616->dev,"rk616 use lcd0 input for hdmi display!\n");
-	}
-	rk616_router_cfg(rk616);
-	rk616_vif_cfg(rk616,screen,0);
-	rk616_vif_cfg(rk616,screen,1);
-	rk616_scaler_disable(rk616);
-#endif
-	
-	return 0;
-	
-	
-}
-
-
-
-
diff --git a/include/linux/mfd/rk610_core.h b/include/linux/mfd/rk610_core.h
deleted file mode 100644
index 19f341107db7..000000000000
--- a/include/linux/mfd/rk610_core.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef __RK610_CONTROL_H_
-#define __RK610_CONTROL_H_
-
-#define INVALID_GPIO -1
-//#define RK610_DEBUG
-
-#ifdef RK610_DEBUG
-#define RK610_DBG(dev, format, arg...)		\
-do{\
-		dev_printk(KERN_INFO , dev , format , ## arg);\
-}while(0)
-#else
-#define RK610_DBG(dev, format, arg...)
-#endif
-#define RK610_ERR(dev, format, arg...)		\
-do{\
-		dev_printk(KERN_ERR , dev , format , ## arg);\
-}while(0)
-
-#define RK610_CONTROL_REG_C_PLL_CON0	0x00
-#define RK610_CONTROL_REG_C_PLL_CON1	0x01
-#define RK610_CONTROL_REG_C_PLL_CON2	0x02
-#define RK610_CONTROL_REG_C_PLL_CON3	0x03
-#define RK610_CONTROL_REG_C_PLL_CON4	0x04
-#define RK610_CONTROL_REG_C_PLL_CON5	0x05
-	#define C_PLL_DISABLE_FRAC		1 << 0
-	#define C_PLL_BYPSS_ENABLE		1 << 1
-	#define C_PLL_POWER_ON			1 << 2
-	#define C_PLL_LOCLED			1 << 7
-	
-#define RK610_CONTROL_REG_TVE_CON		0x29
-	#define TVE_CONTROL_VDAC_R_BYPASS_ENABLE	1 << 7
-	#define TVE_CONTROL_VDAC_R_BYPASS_DISABLE	0 << 7
-	#define TVE_CONTROL_CVBS_3_CHANNEL_ENALBE	1 << 6
-	#define TVE_CONTROL_CVBS_3_CHANNEL_DISALBE	0 << 5
-enum {
-	INPUT_DATA_FORMAT_RGB888 = 0,
-	INPUT_DATA_FORMAT_RGB666,
-	INPUT_DATA_FORMAT_RGB565,
-	INPUT_DATA_FORMAT_YUV
-};
-	#define RGB2CCIR_INPUT_DATA_FORMAT(n)	n << 4
-	
-	#define RGB2CCIR_RGB_SWAP_ENABLE		1 << 3
-	#define RGB2CCIR_RGB_SWAP_DISABLE		0 << 3
-	
-	#define RGB2CCIR_INPUT_INTERLACE		1 << 2
-	#define RGB2CCIR_INPUT_PROGRESSIVE		0 << 2
-	
-	#define RGB2CCIR_CVBS_PAL				0 << 1
-	#define RGB2CCIR_CVBS_NTSC				1 << 1
-	
-	#define RGB2CCIR_DISABLE				0
-	#define RGB2CCIR_ENABLE					1
-	
-#define RK610_CONTROL_REG_CCIR_RESET	0x2a
-
-#define RK610_CONTROL_REG_CLOCK_CON0	0x2b
-#define RK610_CONTROL_REG_CLOCK_CON1	0x2c
-	#define CLOCK_CON1_I2S_CLK_CODEC_PLL	1 << 5
-	#define CLOCK_CON1_I2S_DVIDER_MASK		0x1F
-#define RK610_CONTROL_REG_CODEC_CON		0x2d
-	#define CODEC_CON_BIT_HDMI_BLCK_INTERANL		1<<4
-	#define CODEC_CON_BIT_DAC_LRCL_OUTPUT_DISABLE	1<<3
-	#define CODEC_CON_BIT_ADC_LRCK_OUTPUT_DISABLE	1<<2
-	#define CODEC_CON_BIT_INTERAL_CODEC_DISABLE		1<<0
-
-#define RK610_CONTROL_REG_I2C_CON		0x2e
-
-/********************************************************************
-**                          ṹ                                *
-********************************************************************/
-/* RK610ļĴṹ */
-/* CODEC PLL REG */
-#define C_PLL_CON0      0x00
-#define C_PLL_CON1      0x01
-#define C_PLL_CON2      0x02
-#define C_PLL_CON3      0x03
-#define C_PLL_CON4      0x04
-#define C_PLL_CON5      0x05
-
-/*  SCALER PLL REG */
-#define S_PLL_CON0      0x06
-#define S_PLL_CON1      0x07
-#define S_PLL_CON2      0x08
-
-/*  LVDS REG */
-#define LVDS_CON0       0x09
-#define LVDS_CON1       0x0a
-
-/*  LCD1 REG */
-#define LCD1_CON        0x0b
-
-/*  SCALER REG  */
-#define SCL_CON0        0x0c
-#define SCL_CON1        0x0d
-#define SCL_CON2        0x0e
-#define SCL_CON3        0x0f
-#define SCL_CON4        0x10
-#define SCL_CON5        0x11
-#define SCL_CON6        0x12
-#define SCL_CON7        0x13
-#define SCL_CON8        0x14
-#define SCL_CON9        0x15
-#define SCL_CON10       0x16
-#define SCL_CON11       0x17
-#define SCL_CON12       0x18
-#define SCL_CON13       0x19
-#define SCL_CON14       0x1a
-#define SCL_CON15       0x1b
-#define SCL_CON16       0x1c
-#define SCL_CON17       0x1d
-#define SCL_CON18       0x1e
-#define SCL_CON19       0x1f
-#define SCL_CON20       0x20
-#define SCL_CON21       0x21
-#define SCL_CON22       0x22
-#define SCL_CON23       0x23
-#define SCL_CON24       0x24
-#define SCL_CON25       0x25
-#define SCL_CON26       0x26
-#define SCL_CON27       0x27
-#define SCL_CON28       0x28
-
-/*  TVE REG  */
-#define TVE_CON         0x29
-
-/*  CCIR REG    */
-#define CCIR_RESET      0X2a
-
-/*  CLOCK REG    */
-#define CLOCK_CON0      0X2b
-#define CLOCK_CON1      0X2c
-
-/*  CODEC REG    */
-#define CODEC_CON       0x2e
-#define I2C_CON         0x2f
-
-
-struct rk610_core_info{
-    struct i2c_client *client;
-    struct device *dev;
-
-    struct dentry *debugfs_dir;
-    void *lcd_pdata;
-	struct clk *i2s_clk;
-	int reset_gpio;
-};
-
-extern int rk610_control_send_byte(const char reg, const char data);
-
-#endif /*end of __RK610_CONTROL_H_*/
diff --git a/include/linux/mfd/rk616.h b/include/linux/mfd/rk616.h
deleted file mode 100644
index 93125b75bf7b..000000000000
--- a/include/linux/mfd/rk616.h
+++ /dev/null
@@ -1,297 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef _RK616_H_
-#define _RK616_H_
-
-#include <linux/types.h>
-#include <linux/i2c.h>
-#include <linux/rk_fb.h>
-#include <linux/clk.h>
-#include <linux/delay.h>
-
-#if defined(CONFIG_RK616_DEBUG)
-#define rk616_dbg(dev, format, arg...)		\
-	dev_info(dev , format , ## arg)
-#else
-#define rk616_dbg(dev, format, arg...)	do{}while(0)
-#endif
-
-#define VIF0_REG0 		0x0000
-#define VIF0_DDR_CLK_EN		(1<<3)
-#define VIF0_DDR_PHASEN_EN	(1<<2)  //negative edge first en
-#define VIF0_DDR_MODE_EN	(1<<1)
-#define VIF0_EN			(1<<0)
-
-#define VIF0_REG1 		0x0004
-#define VIF0_REG2 		0x0008
-#define VIF0_REG3 		0x000C
-#define VIF0_REG4 		0x0010
-#define VIF0_REG5 		0x0014
-#define VIF1_REG0 		0x0018
-#define VIF1_REG1 		0x001C
-#define VIF1_REG2 		0x0020
-#define VIF1_REG3 		0x0024
-#define VIF1_REG4 		0x0028
-#define VIF1_REG5 		0x002C
-#define SCL_REG0  		0x0030
-#define SCL_EN          	(1<<0)
-
-#define SCL_REG1  		0x0034
-#define SCL_REG2  		0x0038
-#define SCL_REG3  		0x003C
-#define SCL_REG4  		0x0040
-#define SCL_REG5  		0x0044
-#define SCL_REG6  		0x0048
-#define SCL_REG7  		0x004C
-#define SCL_REG8  		0x0050
-#define FRC_REG   		0x0054
-#define FRC_DEN_INV		(1<<6)
-#define FRC_SYNC_INV		(1<<5)
-#define FRC_DCLK_INV		(1<<4)
-#define FRC_OUT_ZERO		(1<<3)
-#define FRC_RGB18_MODE		(1<<2)
-#define FRC_HIFRC_MODE		(1<<1)
-#define FRC_DITHER_EN		(1<<0)
-
-#define CRU_CLKSEL0_CON 	0x0058
-#define PLL1_CLK_SEL_MASK	(0x3<<24)
-#define PLL0_CLK_SEL_MASK	(0x3<<22)
-#define LCD1_CLK_DIV_MASK	(0x7<<19)
-#define LCD0_CLK_DIV_MASK	(0x7<<16)
-#define PLL1_CLK_SEL(x)  	(((x)&3)<<8)
-#define PLL0_CLK_SEL(x)  	(((x)&3)<<6)
-#define LCD0_DCLK		0
-#define LCD1_DCLK		1
-#define MCLK_12M		2
-#define LCD1_CLK_DIV(x) 	(((x)&7)<<3)
-#define LCD0_CLK_DIV(x) 	(((x)&7)<<0)
-
-#define CRU_CLKSEL1_CON 	0x005C
-#define SCLK_SEL_MASK		(1<<19)
-#define CODEC_MCLK_SEL_MASK	(3<<16)
-#define LCDC_CLK_GATE		(1<<12)
-#define LCDC1_CLK_GATE		(1<<11)
-#define MIPI_CLK_GATE		(1<<10)
-#define LVDS_CLK_GATE		(1<<9)
-#define HDMI_CLK_GATE		(1<<8)
-#define SCL_CLK_DIV(x)		(((x)&7)<<5)
-#define SCL_CLK_GATE		(1<<4)
-#define SCLK_SEL(x)		(((x)&1)<<3)
-#define SCLK_SEL_PLL0		0
-#define SCLK_SEL_PLL1		1
-#define CODEC_CLK_GATE		(1<<2)
-#define CODEC_MCLK_SEL(x)	(((x)&3)<<0)
-#define CODEC_MCLK_SEL_PLL0	0
-#define CODEC_MCLK_SEL_PLL1	1
-#define CODEC_MCLK_SEL_12M	2
-
-#define CRU_CODEC_DIV		0x0060
-
-#define CRU_CLKSEL2_CON  	0x0064
-#define SCL_IN_SEL_MASK		(1<<31)
-#define DITHER_IN_SEL_MASK	(1<<30)
-#define HDMI_IN_SEL_MASK	(3<<28)
-#define VIF1_CLK_DIV_MASK	(7<<25)
-#define VIF0_CLK_DIV_MASK	(7<<19)
-#define VIF1_CLKIN_SEL_MASK	(1<<22)
-#define VIF0_CLKIN_SEL_MASK	(1<<16)
-#define SCL_IN_SEL(x)		(((x)&1)<<15)
-#define SCL_SEL_VIF0           	0
-#define SCL_SEL_VIF1           	1
-#define DITHER_IN_SEL(x)	(((x)&1)<<14)
-#define DITHER_SEL_VIF0		0
-#define DITHER_SEL_SCL		1
-
-#define HDMI_IN_SEL(x)		(((x)&3)<<12)  //hdmi data in select
-#define HDMI_IN_SEL_VIF1	0
-#define HDMI_IN_SEL_SCL		1
-#define HDMI_IN_SEL_VIF0	2
-#define VIF1_CLK_DIV(x) 	(((x)&7)<<9)
-#define VIF1_CLK_GATE		(1<<8)
-#define VIF1_CLK_BYPASS		(1<<7)
-#define VIF1_CLKIN_SEL(x)	(((x)&1)<<6)
-#define VIF_CLKIN_SEL_PLL0	0
-#define VIF_CLKIN_SEL_PLL1	1
-#define VIF0_CLK_DIV(x)		(((x)&7)<<3)
-#define VIF0_CLK_GATE		(1<<2)
-#define VIF0_CLK_BYPASS		(1<<1)
-#define VIF0_CLKIN_SEL(x)	(((x)&1)<<0)
-
-
-#define CRU_PLL0_CON0   	0x0068
-#define PLL0_POSTDIV1_MASK	(7<<28)
-#define PLL0_FBDIV_MASK		(0xfff << 16)
-#define PLL0_BYPASS		(1<<15)
-#define PLL0_POSTDIV1(x) 	(((x)&7)<<12)
-#define PLL0_FBDIV(x)	  	(((x)&0xfff)<<0)
-
-#define CRU_PLL0_CON1   	0x006C
-#define PLL0_DIV_MODE_MASK	(1<<25)
-#define PLL0_POSTDIV2_MASK	(7<<22)
-#define PLL0_REFDIV_MASK	(0x3f<<16)
-#define PLL0_LOCK		(1<<15)
-#define PLL0_PWR_DN		(1<<10)
-#define PLL0_DIV_MODE(x)	(((x)&1)<<9)
-#define PLL0_POSTDIV2(x)	(((x)&7)<<6)
-#define PLL0_REFDIV(x)		(((x)&0x3f)<<0)
-
-#define CRU_PLL0_CON2   	0x0070
-#define PLL0_FOUT4_PWR_DN	(1<<27)
-#define PLL0_FOUTVCO_PWR_DN	(1<<26)
-#define PLL0_POSTDIV_PWR_DN	(1<<25)
-#define PLL0_DAC_PWR_DN		(1<<24)
-#define PLL0_FRAC(x)		(((x)&0xffffff)<<0)
-
-#define CRU_PLL1_CON0   	0x0074
-#define PLL1_POSTDIV1_MASK	(7<<28)
-#define PLL1_FBDIV_MASK		(0xfff << 16)
-#define PLL1_BYPASS		(1<<15)
-#define PLL1_POSTDIV1(x) 	(((x)&7)<<12)
-#define PLL1_FBDIV(x)	  	(((x)&0xfff)<<0)
-
-#define CRU_PLL1_CON1   	0x0078
-#define PLL1_POSTDIV2_MASK	(7<<22)
-#define PLL1_REFDIV_MASK	(0x3f<<16)
-#define PLL1_LOCK		(1<<15)
-#define PLL1_PWR_DN		(1<<10)
-#define PLL1_DIV_MODE		(1<<9)
-#define PLL1_POSTDIV2(x)	(((x)&7)<<6)
-#define PLL1_REFDIV(x)		(((x)&0x3f)<<0)
-
-#define CRU_PLL1_CON2   	0x007C
-#define PLL1_FOUT4_PWR_DN	(1<<27)
-#define PLL1_FOUTVCO_PWR_DN	(1<<26)
-#define PLL1_POSTDIV_PWR_DN	(1<<25)
-#define PLL1_DAC_PWR_DN		(1<<24)
-#define PLL1_FRAC(x)		(((x)&0xffffff)<<0)
-
-#define CRU_I2C_CON0    	0x0080
-
-#define CRU_LVDS_CON0   	0x0084
-#define LVDS_HBP_ODD_MASK	(0x1<<30)
-#define LVDS_OUT_FORMAT_MASK	(3<<16)
-#define LVDS_HBP_ODD(x)		(((x)&1)<<14)
-#define LVDS_DCLK_INV	  	(1<<13)
-#define LVDS_CH1_LOAD	  	(1<<12)
-#define LVDS_CH0_LOAD	  	(1<<11)
-#define LVDS_CH1TTL_EN 		(1<<10)
-#define LVDS_CH0TTL_EN 		(1<<9)
-#define LVDS_CH1_PWR_EN	    	(1<<8)
-#define LVDS_CH0_PWR_EN	    	(1<<7)
-#define LVDS_CBG_PWR_EN	    	(1<<6)
-#define LVDS_PLL_PWR_DN	    	(1<<5)
-#define LVDS_START_CH_SEL   	(1<<4)
-#define LVDS_CH_SEL	    	(1<<3)
-#define LVDS_MSB_SEL	    	(1<<2)
-#define LVDS_OUT_FORMAT(x)	(((x)&3)<<0)
-
-
-#define CRU_IO_CON0    		0x0088
-#define VIF1_SYNC_EN		(1<<15)
-#define VIF0_SYNC_EN		(1<<14)
-#define I2S1_OUT_DISABLE	(1<<13)
-#define I2S0_OUT_DISABLE	(1<<12)
-#define LVDS_OUT_EN		(1<<11)
-#define LCD1_INPUT_EN		(1<<10)
-#define LVDS_RGBIO_PD_DISABLE	(1<<9)
-#define LCD1_IO_PD_DISABLE	(1<<8)
-#define LCD0_IO_PD_DISABLE	(1<<7)
-#define HDMI_IO_PU_DISABLE	(1<<6)
-#define SPDIF_IO_PD_DISABLE	(1<<5)
-#define I2S1_PD_DISABLE		(1<<4)
-#define I2S0_PD_DISABLE		(1<<3)
-#define I2C_PU_DISABLE		(1<<2)
-#define INT_IO_PU		(1<<1)
-#define CLKIN_PU		(1<<0)
-
-
-#define CRU_IO_CON1   		0x008C
-#define LVDS_RGBIO_SI_EN	(1<<9)  //shmitt input enable
-#define LCD1_SI_EN		(1<<8)
-#define LCD0_SI_EN		(1<<7)
-#define HDMI_SI_EN		(1<<6)
-#define SPDIF_SI_EN		(1<<5)
-#define I2S1_SI_EN		(1<<4)
-#define I2S0_SI_EN		(1<<3)
-#define I2C_SI_EN		(1<<2)
-#define INT_SI_EN		(1<<1)
-#define CLKIN_SI_EN		(1<<0)
-#define CRU_PCM2IS2_CON0	0x0090
-#define CRU_PCM2IS2_CON1	0x0094
-#define CRU_PCM2IS2_CON2	0x0098
-#define CRU_CFGMISC_CON		0x009C
-#define HDMI_CLK_SEL_MASK	(3<<12)
-#define HDMI_CLK_SEL(x)		(((x)&3)<<12)  //hdmi data in select
-#define HDMI_CLK_SEL_VIF1	0
-#define HDMI_CLK_SEL_SCL	1
-#define HDMI_CLK_SEL_VIF0	2
-
-
-enum lcd_port_func{       // the function of lcd ports(lcd0,lcd1),the lcd0 only can be used as input or unused
-	UNUSED,             // the lcd1 can be used as input,output or unused
-	INPUT,
-	OUTPUT,
-};
-
-enum lvds_mode {
-	RGB,
-	LVDS,
-};
-struct rk616_platform_data {
-	int (*power_init)(void);
-	int (*power_deinit)(void);
-	int scl_rate;
-	enum lcd_port_func lcd0_func;
-	enum lcd_port_func lcd1_func;
-	int lvds_ch_nr;			//the number of used  lvds channel 
-	int hdmi_irq;
-};
-
-struct rk616_route {
-	u16 vif0_bypass;
-	u8  vif0_en;
-	u16 vif0_clk_sel;
-	u16 vif1_bypass;
-	u8  vif1_en;
-	u16 vif1_clk_sel;
-	u16 sclin_sel;
-	u8  scl_en;
-	u8  scl_bypass;
-	u16 dither_sel;
-	u16 hdmi_sel;
-	u16 hdmi_clk_sel;
-	u16 pll0_clk_sel;
-	u16 pll1_clk_sel;
-	u16 sclk_sel;
-	u8  lcd1_input;
-	u8  lvds_en;
-	enum lvds_mode lvds_mode;                //RGB or LVDS
-	int lvds_ch_nr;		//the number of used  lvds channel 
-};
-
-struct mfd_rk616 {
-	struct mutex reg_lock;
-
-	struct device *dev;
-	unsigned int irq_base;
-	struct rk616_platform_data *pdata;
-	struct rk616_route route;  //display path router
-	struct i2c_client *client;
-	struct clk *mclk;
-	u64 pll0_rate;
-	u64 pll1_rate;
-	unsigned int resume; 	
-	struct dentry *debugfs_dir;
-	int (*read_dev)(struct mfd_rk616 *rk616,u16 reg,u32 *pval);
-	int (*write_dev)(struct mfd_rk616 *rk616,u16 reg,u32 *pval);
-	int (*write_dev_bits)(struct mfd_rk616 *rk616,u16 reg,u32 mask,u32 *pval);
-	int (*write_bulk)(struct mfd_rk616 *rk616,u16 reg,int count,u32 *pval);
-};
-
-extern int rk616_set_vif(struct mfd_rk616 * rk616,struct rk_screen * screen,bool connect);
-extern int rk616_display_router_cfg(struct mfd_rk616 *rk616,struct rk_screen *screen,bool enable);
-extern void rk616_mclk_set_rate(struct clk *mclk,unsigned long rate);
-
-
-
-#endif
-

commit 00b8be6742e60102c1ff90cc809d55b0424ed7d9
Author: Ding Wei <leo.ding@rock-chips.com>
Date:   Sun Sep 26 11:50:46 2021 +0800

    video: rockchip: mpp: fix issue for CONFIG_IOMMU_SUPPORT=n
    
    if CONFIG_IOMMU_SUPPORT=n, log:
     error: 'const struct iommu_ops' has no member named 'flush_iotlb_all'
       if (domain && domain->ops && domain->ops->flush_iotlb_all)
    
    Change-Id: I8268e0b5d5a513d1c55b0c755c479049b13bdeb7
    Signed-off-by: Ding Wei <leo.ding@rock-chips.com>

diff --git a/drivers/video/rockchip/mpp/mpp_iommu.c b/drivers/video/rockchip/mpp/mpp_iommu.c
index 21128cd2a822..4f50641e34f5 100644
--- a/drivers/video/rockchip/mpp/mpp_iommu.c
+++ b/drivers/video/rockchip/mpp/mpp_iommu.c
@@ -486,8 +486,8 @@ int mpp_iommu_flush_tlb(struct mpp_iommu_info *info)
 {
 	struct iommu_domain *domain = info->domain;
 
-	if (domain && domain->ops && domain->ops->flush_iotlb_all)
-		domain->ops->flush_iotlb_all(domain);
+	if (domain && domain->ops)
+		iommu_flush_tlb_all(domain);
 
 	return 0;
 }

commit 56f6b33ef06ae7ccd39a31d71fab65df0c5b338f
Author: David Wu <david.wu@rock-chips.com>
Date:   Sat Sep 18 16:39:41 2021 +0800

    net: ethernet: stmmac: Add config option for full driver
    
    Add this config option to reduce memory usage, if it was not necessary.
    
    ./ksize.sh drivers/net/ethernet/stmicro/
    
    before size: 82879 Bytes
    after  size: 59075 Bytes
    save   size: 23804 Bytes
    
    Change-Id: I5f6b4573d7358c3b6f046e960c7ddf7d53541b14
    Signed-off-by: David Wu <david.wu@rock-chips.com>

diff --git a/drivers/net/ethernet/stmicro/stmmac/Kconfig b/drivers/net/ethernet/stmicro/stmmac/Kconfig
index cd6159297c0b..804102cc4366 100644
--- a/drivers/net/ethernet/stmicro/stmmac/Kconfig
+++ b/drivers/net/ethernet/stmicro/stmmac/Kconfig
@@ -18,6 +18,13 @@ config STMMAC_ETHTOOL
 	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_PLATFORM
 	tristate "STMMAC Platform bus support"
 	depends on STMMAC_ETH
diff --git a/drivers/net/ethernet/stmicro/stmmac/Makefile b/drivers/net/ethernet/stmicro/stmmac/Makefile
index 35e5093a367d..a1592b940456 100644
--- a/drivers/net/ethernet/stmicro/stmmac/Makefile
+++ b/drivers/net/ethernet/stmicro/stmmac/Makefile
@@ -1,13 +1,17 @@
 # SPDX-License-Identifier: GPL-2.0
 obj-$(CONFIG_STMMAC_ETH) += stmmac.o
-stmmac-objs:= stmmac_main.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 stmmac_hwtstamp.o stmmac_ptp.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
 
 # Ordering matters. Generic driver must be last.
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
index bc8871e7351f..da5d9e5d08c2 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
@@ -715,6 +715,7 @@ static void dwmac4_debug(void __iomem *ioaddr, struct stmmac_extra_stats *x,
 		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 @@ const struct stmmac_ops dwmac4_ops = {
 	.debug = dwmac4_debug,
 	.set_filter = dwmac4_set_filter,
 };
+#endif
 
 const struct stmmac_ops dwmac410_ops = {
 	.core_init = dwmac4_core_init,
@@ -777,6 +779,7 @@ const struct stmmac_ops dwmac410_ops = {
 	.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 @@ const struct stmmac_ops dwmac510_ops = {
 	.rxp_config = dwmac5_rxp_config,
 	.flex_pps_config = dwmac5_flex_pps_config,
 };
+#endif
 
 int dwmac4_setup(struct stmmac_priv *priv)
 {
diff --git a/drivers/net/ethernet/stmicro/stmmac/hwif.c b/drivers/net/ethernet/stmicro/stmmac/hwif.c
index 357309a6d6a5..cbc4824df399 100644
--- a/drivers/net/ethernet/stmicro/stmmac/hwif.c
+++ b/drivers/net/ethernet/stmicro/stmmac/hwif.c
@@ -23,6 +23,7 @@ static u32 stmmac_get_id(struct stmmac_priv *priv, u32 id_reg)
 	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 @@ static int stmmac_dwmac4_quirks(struct stmmac_priv *priv)
 	stmmac_dwmac_mode_quirk(priv);
 	return 0;
 }
+#endif
 
 static const struct stmmac_hwif_entry {
 	bool gmac;
@@ -85,6 +87,7 @@ static const struct stmmac_hwif_entry {
 	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,
@@ -153,7 +156,9 @@ static const struct stmmac_hwif_entry {
 		.tc = NULL,
 		.setup = dwmac4_setup,
 		.quirks = NULL,
-	}, {
+	},
+#endif /* CONFIG_STMMAC_FULL */
+	{
 		.gmac = false,
 		.gmac4 = true,
 		.xgmac = false,
@@ -170,7 +175,9 @@ static const struct stmmac_hwif_entry {
 		.tc = NULL,
 		.setup = dwmac4_setup,
 		.quirks = NULL,
-	}, {
+	},
+#ifdef CONFIG_STMMAC_FULL
+	{
 		.gmac = false,
 		.gmac4 = true,
 		.xgmac = false,
@@ -205,6 +212,7 @@ static const struct stmmac_hwif_entry {
 		.setup = dwxgmac2_setup,
 		.quirks = NULL,
 	},
+#endif
 };
 
 int stmmac_hwif_init(struct stmmac_priv *priv)

commit 345c4d0af36c6626a26207bb1dad8ae8fd2cae57
Author: David Wu <david.wu@rock-chips.com>
Date:   Sat Sep 18 16:37:51 2021 +0800

    net: ethernet: stmmac: Add config option for stmmac ethtool
    
    Add this config option to reduce memory usage, if it was not necessary.
    
    ./ksize.sh drivers/net/ethernet/stmicro/
    
    before size: 94474 Bytes
    after  size: 82879 Bytes
    save   size: 11595 Bytes
    
    Signed-off-by: David Wu <david.wu@rock-chips.com>
    Change-Id: I828130d961846a955b998d63afffbabcc9dd5925

diff --git a/drivers/net/ethernet/stmicro/stmmac/Kconfig b/drivers/net/ethernet/stmicro/stmmac/Kconfig
index ebf3ac900084..cd6159297c0b 100644
--- a/drivers/net/ethernet/stmicro/stmmac/Kconfig
+++ b/drivers/net/ethernet/stmicro/stmmac/Kconfig
@@ -12,6 +12,12 @@ config STMMAC_ETH
 
 if STMMAC_ETH
 
+config STMMAC_ETHTOOL
+	bool "Ethtool feature for STMMAC"
+	default STMMAC_ETH
+	help
+	  This selects the ethtool function, default is Y.
+
 config STMMAC_PLATFORM
 	tristate "STMMAC Platform bus support"
 	depends on STMMAC_ETH
diff --git a/drivers/net/ethernet/stmicro/stmmac/Makefile b/drivers/net/ethernet/stmicro/stmmac/Makefile
index 5e1746960132..35e5093a367d 100644
--- a/drivers/net/ethernet/stmicro/stmmac/Makefile
+++ b/drivers/net/ethernet/stmicro/stmmac/Makefile
@@ -1,6 +1,6 @@
 # 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	\
+stmmac-objs:= stmmac_main.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	\
@@ -8,6 +8,8 @@ stmmac-objs:= stmmac_main.o stmmac_ethtool.o stmmac_mdio.o ring_mode.o	\
 	      stmmac_tc.o dwxgmac2_core.o dwxgmac2_dma.o dwxgmac2_descs.o \
 	      $(stmmac-y)
 
+stmmac-$(CONFIG_STMMAC_ETHTOOL) += stmmac_ethtool.o
+
 # Ordering matters. Generic driver must be last.
 obj-$(CONFIG_STMMAC_PLATFORM)	+= stmmac-platform.o
 obj-$(CONFIG_DWMAC_ANARION)	+= dwmac-anarion.o
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
index f9b42b0c20f4..fb8ffd4c54af 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
@@ -217,7 +217,14 @@ enum stmmac_state {
 int stmmac_mdio_unregister(struct net_device *ndev);
 int stmmac_mdio_register(struct net_device *ndev);
 int stmmac_mdio_reset(struct mii_bus *mii);
+
+#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
 
 void stmmac_ptp_register(struct stmmac_priv *priv);
 void stmmac_ptp_unregister(struct stmmac_priv *priv);

commit 11156bde8db8df89d92b533ea7a12df379bf23a7
Merge: a6850bb536d1 2950c9c5e0df
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Sat Sep 25 14:26:55 2021 +0200

    Merge 4.19.207 into android-4.19-stable
    
    Changes in 4.19.207
            ext4: fix race writing to an inline_data file while its xattrs are changing
            xtensa: fix kconfig unmet dependency warning for HAVE_FUTEX_CMPXCHG
            gpu: ipu-v3: Fix i.MX IPU-v3 offset calculations for (semi)planar U/V formats
            qed: Fix the VF msix vectors flow
            net: macb: Add a NULL check on desc_ptp
            qede: Fix memset corruption
            perf/x86/intel/pt: Fix mask of num_address_ranges
            perf/x86/amd/ibs: Work around erratum #1197
            cryptoloop: add a deprecation warning
            ARM: 8918/2: only build return_address() if needed
            ALSA: pcm: fix divide error in snd_pcm_lib_ioctl
            clk: fix build warning for orphan_list
            media: stkwebcam: fix memory leak in stk_camera_probe
            ARM: imx: add missing clk_disable_unprepare()
            ARM: imx: fix missing 3rd argument in macro imx_mmdc_perf_init
            igmp: Add ip_mc_list lock in ip_check_mc_rcu
            USB: serial: mos7720: improve OOM-handling in read_mos_reg()
            ipv4/icmp: l3mdev: Perform icmp error route lookup on source device routing table (v2)
            SUNRPC/nfs: Fix return value for nfs4_callback_compound()
            crypto: talitos - reduce max key size for SEC1
            powerpc/module64: Fix comment in R_PPC64_ENTRY handling
            powerpc/boot: Delete unneeded .globl _zimage_start
            net: ll_temac: Remove left-over debug message
            mm/page_alloc: speed up the iteration of max_order
            Revert "btrfs: compression: don't try to compress if we don't have enough pages"
            ALSA: usb-audio: Add registration quirk for JBL Quantum 800
            usb: host: xhci-rcar: Don't reload firmware after the completion
            usb: mtu3: use @mult for HS isoc or intr
            usb: mtu3: fix the wrong HS mult value
            x86/reboot: Limit Dell Optiplex 990 quirk to early BIOS versions
            PCI: Call Max Payload Size-related fixup quirks early
            locking/mutex: Fix HANDOFF condition
            regmap: fix the offset of register error log
            crypto: mxs-dcp - Check for DMA mapping errors
            sched/deadline: Fix reset_on_fork reporting of DL tasks
            power: supply: axp288_fuel_gauge: Report register-address on readb / writeb errors
            crypto: omap-sham - clear dma flags only after omap_sham_update_dma_stop()
            sched/deadline: Fix missing clock update in migrate_task_rq_dl()
            hrtimer: Avoid double reprogramming in __hrtimer_start_range_ns()
            udf: Check LVID earlier
            isofs: joliet: Fix iocharset=utf8 mount option
            bcache: add proper error unwinding in bcache_device_init
            nvme-rdma: don't update queue count when failing to set io queues
            power: supply: max17042_battery: fix typo in MAx17042_TOFF
            s390/cio: add dev_busid sysfs entry for each subchannel
            libata: fix ata_host_start()
            crypto: qat - do not ignore errors from enable_vf2pf_comms()
            crypto: qat - handle both source of interrupt in VF ISR
            crypto: qat - fix reuse of completion variable
            crypto: qat - fix naming for init/shutdown VF to PF notifications
            crypto: qat - do not export adf_iov_putmsg()
            fcntl: fix potential deadlock for &fasync_struct.fa_lock
            udf_get_extendedattr() had no boundary checks.
            m68k: emu: Fix invalid free in nfeth_cleanup()
            spi: spi-fsl-dspi: Fix issue with uninitialized dma_slave_config
            spi: spi-pic32: Fix issue with uninitialized dma_slave_config
            lib/mpi: use kcalloc in mpi_resize
            clocksource/drivers/sh_cmt: Fix wrong setting if don't request IRQ for clock source channel
            crypto: qat - use proper type for vf_mask
            certs: Trigger creation of RSA module signing key if it's not an RSA key
            spi: sprd: Fix the wrong WDG_LOAD_VAL
            media: TDA1997x: enable EDID support
            soc: rockchip: ROCKCHIP_GRF should not default to y, unconditionally
            media: dvb-usb: fix uninit-value in dvb_usb_adapter_dvb_init
            media: dvb-usb: fix uninit-value in vp702x_read_mac_addr
            media: go7007: remove redundant initialization
            Bluetooth: sco: prevent information leak in sco_conn_defer_accept()
            tcp: seq_file: Avoid skipping sk during tcp_seek_last_pos
            net: cipso: fix warnings in netlbl_cipsov4_add_std
            i2c: highlander: add IRQ check
            media: em28xx-input: fix refcount bug in em28xx_usb_disconnect
            media: venus: venc: Fix potential null pointer dereference on pointer fmt
            PCI: PM: Avoid forcing PCI_D0 for wakeup reasons inconsistently
            PCI: PM: Enable PME if it can be signaled from D3cold
            soc: qcom: smsm: Fix missed interrupts if state changes while masked
            Bluetooth: increase BTNAMSIZ to 21 chars to fix potential buffer overflow
            drm/msm/dpu: make dpu_hw_ctl_clear_all_blendstages clear necessary LMs
            arm64: dts: exynos: correct GIC CPU interfaces address range on Exynos7
            Bluetooth: fix repeated calls to sco_sock_kill
            drm/msm/dsi: Fix some reference counted resource leaks
            usb: gadget: udc: at91: add IRQ check
            usb: phy: fsl-usb: add IRQ check
            usb: phy: twl6030: add IRQ checks
            Bluetooth: Move shutdown callback before flushing tx and rx queue
            usb: host: ohci-tmio: add IRQ check
            usb: phy: tahvo: add IRQ check
            mac80211: Fix insufficient headroom issue for AMSDU
            usb: gadget: mv_u3d: request_irq() after initializing UDC
            Bluetooth: add timeout sanity check to hci_inquiry
            i2c: iop3xx: fix deferred probing
            i2c: s3c2410: fix IRQ check
            mmc: dw_mmc: Fix issue with uninitialized dma_slave_config
            mmc: moxart: Fix issue with uninitialized dma_slave_config
            CIFS: Fix a potencially linear read overflow
            i2c: mt65xx: fix IRQ check
            usb: ehci-orion: Handle errors of clk_prepare_enable() in probe
            usb: bdc: Fix an error handling path in 'bdc_probe()' when no suitable DMA config is available
            tty: serial: fsl_lpuart: fix the wrong mapbase value
            ath6kl: wmi: fix an error code in ath6kl_wmi_sync_point()
            bcma: Fix memory leak for internally-handled cores
            ipv4: make exception cache less predictible
            net: sched: Fix qdisc_rate_table refcount leak when get tcf_block failed
            net: qualcomm: fix QCA7000 checksum handling
            ipv4: fix endianness issue in inet_rtm_getroute_build_skb()
            netns: protect netns ID lookups with RCU
            fscrypt: add fscrypt_symlink_getattr() for computing st_size
            ext4: report correct st_size for encrypted symlinks
            f2fs: report correct st_size for encrypted symlinks
            ubifs: report correct st_size for encrypted symlinks
            tty: Fix data race between tiocsti() and flush_to_ldisc()
            x86/resctrl: Fix a maybe-uninitialized build warning treated as error
            KVM: x86: Update vCPU's hv_clock before back to guest when tsc_offset is adjusted
            IMA: remove -Wmissing-prototypes warning
            IMA: remove the dependency on CRYPTO_MD5
            fbmem: don't allow too huge resolutions
            backlight: pwm_bl: Improve bootloader/kernel device handover
            clk: kirkwood: Fix a clocking boot regression
            rtc: tps65910: Correct driver module alias
            btrfs: reset replace target device to allocation state on close
            blk-zoned: allow zone management send operations without CAP_SYS_ADMIN
            blk-zoned: allow BLKREPORTZONE without CAP_SYS_ADMIN
            PCI/MSI: Skip masking MSI-X on Xen PV
            powerpc/perf/hv-gpci: Fix counter value parsing
            xen: fix setting of max_pfn in shared_info
            include/linux/list.h: add a macro to test if entry is pointing to the head
            9p/xen: Fix end of loop tests for list_for_each_entry
            bpf/verifier: per-register parent pointers
            bpf: correct slot_type marking logic to allow more stack slot sharing
            bpf: Support variable offset stack access from helpers
            bpf: Reject indirect var_off stack access in raw mode
            bpf: Reject indirect var_off stack access in unpriv mode
            bpf: Sanity check max value for var_off stack access
            selftests/bpf: Test variable offset stack access
            bpf: track spill/fill of constants
            selftests/bpf: fix tests due to const spill/fill
            bpf: Introduce BPF nospec instruction for mitigating Spectre v4
            bpf: Fix leakage due to insufficient speculative store bypass mitigation
            bpf: verifier: Allocate idmap scratch in verifier env
            bpf: Fix pointer arithmetic mask tightening under state pruning
            tools/thermal/tmon: Add cross compiling support
            soc: aspeed: lpc-ctrl: Fix boundary check for mmap
            arm64: head: avoid over-mapping in map_memory
            crypto: public_key: fix overflow during implicit conversion
            block: bfq: fix bfq_set_next_ioprio_data()
            power: supply: max17042: handle fails of reading status register
            dm crypt: Avoid percpu_counter spinlock contention in crypt_page_alloc()
            VMCI: fix NULL pointer dereference when unmapping queue pair
            media: uvc: don't do DMA on stack
            media: rc-loopback: return number of emitters rather than error
            libata: add ATA_HORKAGE_NO_NCQ_TRIM for Samsung 860 and 870 SSDs
            ARM: 9105/1: atags_to_fdt: don't warn about stack size
            PCI: Restrict ASMedia ASM1062 SATA Max Payload Size Supported
            PCI: Return ~0 data on pciconfig_read() CAP_SYS_ADMIN failure
            PCI: xilinx-nwl: Enable the clock through CCF
            PCI: aardvark: Increase polling delay to 1.5s while waiting for PIO response
            PCI: aardvark: Fix masking and unmasking legacy INTx interrupts
            HID: input: do not report stylus battery state as "full"
            RDMA/iwcm: Release resources if iw_cm module initialization fails
            docs: Fix infiniband uverbs minor number
            pinctrl: samsung: Fix pinctrl bank pin count
            vfio: Use config not menuconfig for VFIO_NOIOMMU
            powerpc/stacktrace: Include linux/delay.h
            openrisc: don't printk() unconditionally
            pinctrl: single: Fix error return code in pcs_parse_bits_in_pinctrl_entry()
            scsi: qedi: Fix error codes in qedi_alloc_global_queues()
            platform/x86: dell-smbios-wmi: Add missing kfree in error-exit from run_smbios_call
            fscache: Fix cookie key hashing
            f2fs: fix to account missing .skipped_gc_rwsem
            f2fs: fix to unmap pages from userspace process in punch_hole()
            MIPS: Malta: fix alignment of the devicetree buffer
            userfaultfd: prevent concurrent API initialization
            media: dib8000: rewrite the init prbs logic
            crypto: mxs-dcp - Use sg_mapping_iter to copy data
            PCI: Use pci_update_current_state() in pci_enable_device_flags()
            tipc: keep the skb in rcv queue until the whole data is read
            iio: dac: ad5624r: Fix incorrect handling of an optional regulator.
            ARM: dts: qcom: apq8064: correct clock names
            video: fbdev: kyro: fix a DoS bug by restricting user input
            netlink: Deal with ESRCH error in nlmsg_notify()
            Smack: Fix wrong semantics in smk_access_entry()
            usb: host: fotg210: fix the endpoint's transactional opportunities calculation
            usb: host: fotg210: fix the actual_length of an iso packet
            usb: gadget: u_ether: fix a potential null pointer dereference
            usb: gadget: composite: Allow bMaxPower=0 if self-powered
            staging: board: Fix uninitialized spinlock when attaching genpd
            tty: serial: jsm: hold port lock when reporting modem line changes
            drm/amd/amdgpu: Update debugfs link_settings output link_rate field in hex
            bpf/tests: Fix copy-and-paste error in double word test
            bpf/tests: Do not PASS tests without actually testing the result
            video: fbdev: asiliantfb: Error out if 'pixclock' equals zero
            video: fbdev: kyro: Error out if 'pixclock' equals zero
            video: fbdev: riva: Error out if 'pixclock' equals zero
            ipv4: ip_output.c: Fix out-of-bounds warning in ip_copy_addrs()
            flow_dissector: Fix out-of-bounds warnings
            s390/jump_label: print real address in a case of a jump label bug
            serial: 8250: Define RX trigger levels for OxSemi 950 devices
            xtensa: ISS: don't panic in rs_init
            hvsi: don't panic on tty_register_driver failure
            serial: 8250_pci: make setup_port() parameters explicitly unsigned
            staging: ks7010: Fix the initialization of the 'sleep_status' structure
            samples: bpf: Fix tracex7 error raised on the missing argument
            ata: sata_dwc_460ex: No need to call phy_exit() befre phy_init()
            Bluetooth: skip invalid hci_sync_conn_complete_evt
            bonding: 3ad: fix the concurrency between __bond_release_one() and bond_3ad_state_machine_handler()
            ASoC: Intel: bytcr_rt5640: Move "Platform Clock" routes to the maps for the matching in-/output
            media: imx258: Rectify mismatch of VTS value
            media: imx258: Limit the max analogue gain to 480
            media: v4l2-dv-timings.c: fix wrong condition in two for-loops
            media: TDA1997x: fix tda1997x_query_dv_timings() return value
            media: tegra-cec: Handle errors of clk_prepare_enable()
            ARM: dts: imx53-ppd: Fix ACHC entry
            arm64: dts: qcom: sdm660: use reg value for memory node
            net: ethernet: stmmac: Do not use unreachable() in ipq806x_gmac_probe()
            Bluetooth: schedule SCO timeouts with delayed_work
            Bluetooth: avoid circular locks in sco_sock_connect
            gpu: drm: amd: amdgpu: amdgpu_i2c: fix possible uninitialized-variable access in amdgpu_i2c_router_select_ddc_port()
            ARM: tegra: tamonten: Fix UART pad setting
            Bluetooth: Fix handling of LE Enhanced Connection Complete
            serial: sh-sci: fix break handling for sysrq
            tcp: enable data-less, empty-cookie SYN with TFO_SERVER_COOKIE_NOT_REQD
            rpc: fix gss_svc_init cleanup on failure
            staging: rts5208: Fix get_ms_information() heap buffer size
            gfs2: Don't call dlm after protocol is unmounted
            of: Don't allow __of_attached_node_sysfs() without CONFIG_SYSFS
            mmc: sdhci-of-arasan: Check return value of non-void funtions
            mmc: rtsx_pci: Fix long reads when clock is prescaled
            selftests/bpf: Enlarge select() timeout for test_maps
            mmc: core: Return correct emmc response in case of ioctl error
            cifs: fix wrong release in sess_alloc_buffer() failed path
            Revert "USB: xhci: fix U1/U2 handling for hardware with XHCI_INTEL_HOST quirk set"
            usb: musb: musb_dsps: request_irq() after initializing musb
            usbip: give back URBs for unsent unlink requests during cleanup
            usbip:vhci_hcd USB port can get stuck in the disabled state
            ASoC: rockchip: i2s: Fix regmap_ops hang
            ASoC: rockchip: i2s: Fixup config for DAIFMT_DSP_A/B
            parport: remove non-zero check on count
            ath9k: fix OOB read ar9300_eeprom_restore_internal
            ath9k: fix sleeping in atomic context
            net: fix NULL pointer reference in cipso_v4_doi_free
            net: w5100: check return value after calling platform_get_resource()
            parisc: fix crash with signals and alloca
            ovl: fix BUG_ON() in may_delete() when called from ovl_cleanup()
            scsi: BusLogic: Fix missing pr_cont() use
            scsi: qla2xxx: Sync queue idx with queue_pair_map idx
            cpufreq: powernv: Fix init_chip_info initialization in numa=off
            mm/hugetlb: initialize hugetlb_usage in mm_init
            memcg: enable accounting for pids in nested pid namespaces
            platform/chrome: cros_ec_proto: Send command again when timeout occurs
            drm/amdgpu: Fix BUG_ON assert
            dm thin metadata: Fix use-after-free in dm_bm_set_read_only
            xen: reset legacy rtc flag for PV domU
            bnx2x: Fix enabling network interfaces without VFs
            arm64/sve: Use correct size when reinitialising SVE state
            PM: base: power: don't try to use non-existing RTC for storing data
            PCI: Add AMD GPU multi-function power dependencies
            x86/mm: Fix kern_addr_valid() to cope with existing but not present entries
            tipc: fix an use-after-free issue in tipc_recvmsg
            net-caif: avoid user-triggerable WARN_ON(1)
            ptp: dp83640: don't define PAGE0
            dccp: don't duplicate ccid when cloning dccp sock
            net/l2tp: Fix reference count leak in l2tp_udp_recv_core
            r6040: Restore MDIO clock frequency after MAC reset
            tipc: increase timeout in tipc_sk_enqueue()
            perf machine: Initialize srcline string member in add_location struct
            net/mlx5: Fix potential sleeping in atomic context
            events: Reuse value read using READ_ONCE instead of re-reading it
            net/af_unix: fix a data-race in unix_dgram_poll
            net: dsa: destroy the phylink instance on any error in dsa_slave_phy_setup
            tcp: fix tp->undo_retrans accounting in tcp_sacktag_one()
            qed: Handle management FW error
            ibmvnic: check failover_pending in login response
            net: hns3: pad the short tunnel frame before sending to hardware
            mm/memory_hotplug: use "unsigned long" for PFN in zone_for_pfn_range()
            KVM: s390: index kvm->arch.idle_mask by vcpu_idx
            dt-bindings: mtd: gpmc: Fix the ECC bytes vs. OOB bytes equation
            mfd: Don't use irq_create_mapping() to resolve a mapping
            PCI: Add ACS quirks for Cavium multi-function devices
            net: usb: cdc_mbim: avoid altsetting toggling for Telit LN920
            block, bfq: honor already-setup queue merges
            ethtool: Fix an error code in cxgb2.c
            NTB: perf: Fix an error code in perf_setup_inbuf()
            mfd: axp20x: Update AXP288 volatile ranges
            PCI: Fix pci_dev_str_match_path() alloc while atomic bug
            KVM: arm64: Handle PSCI resets before userspace touches vCPU state
            PCI: Sync __pci_register_driver() stub for CONFIG_PCI=n
            mtd: rawnand: cafe: Fix a resource leak in the error handling path of 'cafe_nand_probe()'
            ARC: export clear_user_page() for modules
            net: dsa: b53: Fix calculating number of switch ports
            netfilter: socket: icmp6: fix use-after-scope
            fq_codel: reject silly quantum parameters
            qlcnic: Remove redundant unlock in qlcnic_pinit_from_rom
            ip_gre: validate csum_start only on pull
            net: renesas: sh_eth: Fix freeing wrong tx descriptor
            s390/bpf: Fix 64-bit subtraction of the -0x80000000 constant
            Linux 4.19.207
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I18108cb47ba9e95838ebe55aaabe34de345ee846

commit 0aa9fa02c4771c40ff51c25699af417ab1970436
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Wed Sep 22 21:03:32 2021 +0800

    spi: rockchip: Preset cs-high and clk polarity in setup progress
    
    After power up, the cs and clock is in default status, and the cs-high
    and clock polarity dts property configuration will take no effect until
    the calling of rockchip_spi_config in the first transmission.
    So preset them to make sure a correct voltage before the the first
    transmission comming.
    
    Change-Id: Ib00336a3ebda6e04bdb33c56c7da419bfb6efdd9
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c
index 071151369003..2cd31ec56691 100644
--- a/drivers/spi/spi-rockchip.c
+++ b/drivers/spi/spi-rockchip.c
@@ -728,6 +728,19 @@ static int rockchip_spi_setup(struct spi_device *spi)
 
 	int ret = -EINVAL;
 	struct rockchip_spi *rs = spi_controller_get_devdata(spi->controller);
+	u32 cr0;
+
+	pm_runtime_get_sync(rs->dev);
+
+	cr0 = readl_relaxed(rs->regs + ROCKCHIP_SPI_CTRLR0);
+
+	cr0 |= ((spi->mode & 0x3) << CR0_SCPH_OFFSET);
+	if (spi->mode & SPI_CS_HIGH)
+		cr0 |= BIT(spi->chip_select) << CR0_SOI_OFFSET;
+
+	writel_relaxed(cr0, rs->regs + ROCKCHIP_SPI_CTRLR0);
+
+	pm_runtime_put(rs->dev);
 
 	if (spi->cs_gpio == -ENOENT)
 		return 0;

commit 7a48f58291fe443b354ac867be9787d45a22bf43
Author: Algea Cao <algea.cao@rock-chips.com>
Date:   Sat Sep 18 11:16:11 2021 +0800

    drm/bridge: synopsys: dw-hdmi: Fix display err when system boot set hdmi properties
    
    Linux system will set hdmi properties when system boot
    When some properties such as quant_range was set, dw_hdmi_setup()
    will be called. HDMI status may not be config correctly. So if HDMI
    is not properly initialized, don't call dw_hdmi_setup() when
    these properties was set.
    
    Signed-off-by: Algea Cao <algea.cao@rock-chips.com>
    Change-Id: I6956e50161a4a5bd579f7174c73977d2e33da0c5

diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index f620b817a95a..1d9e97452e2c 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -418,14 +418,23 @@ static void hdmi_mask_writeb(struct dw_hdmi *hdmi, u8 data, unsigned int reg,
 	hdmi_modb(hdmi, data << shift, mask, reg);
 }
 
-static void dw_hdmi_check_output_type(struct dw_hdmi *hdmi)
+static bool dw_hdmi_check_output_type_changed(struct dw_hdmi *hdmi)
 {
+	bool sink_hdmi;
+
+	sink_hdmi = hdmi->sink_is_hdmi;
+
 	if (hdmi->force_output == 1)
 		hdmi->sink_is_hdmi = true;
 	else if (hdmi->force_output == 2)
 		hdmi->sink_is_hdmi = false;
 	else
 		hdmi->sink_is_hdmi = hdmi->support_hdmi;
+
+	if (sink_hdmi != hdmi->sink_is_hdmi)
+		return true;
+
+	return false;
 }
 
 static void repo_hpd_event(struct work_struct *p_work)
@@ -2820,7 +2829,7 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
 
 		dev_info(hdmi->dev, "failed to get edid\n");
 	}
-	dw_hdmi_check_output_type(hdmi);
+	dw_hdmi_check_output_type_changed(hdmi);
 
 	return ret;
 }
@@ -2959,6 +2968,9 @@ static int dw_hdmi_connector_atomic_check(struct drm_connector *connector,
 
 void dw_hdmi_set_quant_range(struct dw_hdmi *hdmi)
 {
+	if (!hdmi->bridge_is_on)
+		return;
+
 	hdmi_writeb(hdmi, HDMI_FC_GCP_SET_AVMUTE, HDMI_FC_GCP);
 	dw_hdmi_setup(hdmi, &hdmi->previous_mode);
 	hdmi_writeb(hdmi, HDMI_FC_GCP_CLEAR_AVMUTE, HDMI_FC_GCP);
@@ -2969,7 +2981,11 @@ void dw_hdmi_set_output_type(struct dw_hdmi *hdmi, u64 val)
 {
 	hdmi->force_output = val;
 
-	dw_hdmi_check_output_type(hdmi);
+	if (!dw_hdmi_check_output_type_changed(hdmi))
+		return;
+
+	if (!hdmi->bridge_is_on)
+		return;
 
 	hdmi_writeb(hdmi, HDMI_FC_GCP_SET_AVMUTE, HDMI_FC_GCP);
 	dw_hdmi_setup(hdmi, &hdmi->previous_mode);
diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
index e7a6cb09b9ce..2dad274e2d44 100644
--- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
+++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
@@ -1244,8 +1244,11 @@ dw_hdmi_rockchip_set_property(struct drm_connector *connector,
 			hdmi->color_changed++;
 		return 0;
 	} else if (property == hdmi->quant_range) {
+		u64 quant_range = hdmi->hdmi_quant_range;
+
 		hdmi->hdmi_quant_range = val;
-		dw_hdmi_set_quant_range(hdmi->hdmi);
+		if (quant_range != hdmi->hdmi_quant_range)
+			dw_hdmi_set_quant_range(hdmi->hdmi);
 		return 0;
 	} else if (property == config->hdr_output_metadata_property) {
 		return 0;

commit fa11be322f8abd27aaca784662150ac5bd36de89
Author: Wyon Bi <bivvy.bi@rock-chips.com>
Date:   Thu Sep 23 11:34:52 2021 +0800

    drm/rockchip: analogix_dp: Fix unbalanced clock
    
    Fixes: ad3cad36162e ("drm/rockchip: analogix_dp: Covert to use bulk clk")
    Change-Id: I5a980fdef172013138293c999a00014141a0ffbd
    Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>

diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index 866bd9ba2fb9..0a73585de7ff 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -1258,12 +1258,6 @@ static int analogix_dp_set_bridge(struct analogix_dp_device *dp)
 
 	pm_runtime_get_sync(dp->dev);
 
-	ret = clk_prepare_enable(dp->clock);
-	if (ret < 0) {
-		DRM_ERROR("Failed to prepare_enable the clock clk [%d]\n", ret);
-		goto out_dp_clk_pre;
-	}
-
 	if (dp->plat_data->power_on_start)
 		dp->plat_data->power_on_start(dp->plat_data);
 
@@ -1303,8 +1297,6 @@ static int analogix_dp_set_bridge(struct analogix_dp_device *dp)
 	analogix_dp_phy_power_off(dp);
 	if (dp->plat_data->power_off)
 		dp->plat_data->power_off(dp->plat_data);
-	clk_disable_unprepare(dp->clock);
-out_dp_clk_pre:
 	pm_runtime_put_sync(dp->dev);
 
 	return ret;
@@ -1355,8 +1347,6 @@ static void analogix_dp_bridge_disable(struct drm_bridge *bridge)
 	analogix_dp_set_analog_power_down(dp, POWER_ALL, 1);
 	analogix_dp_phy_power_off(dp);
 
-	clk_disable_unprepare(dp->clock);
-
 	pm_runtime_put_sync(dp->dev);
 
 	if (dp->plat_data->panel) {
@@ -1641,14 +1631,6 @@ analogix_dp_bind(struct device *dev, struct drm_device *drm_dev,
 		}
 	}
 
-	dp->clock = devm_clk_get(&pdev->dev, "dp");
-	if (IS_ERR(dp->clock)) {
-		dev_err(&pdev->dev, "failed to get clock\n");
-		return ERR_CAST(dp->clock);
-	}
-
-	clk_prepare_enable(dp->clock);
-
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
 	dp->reg_base = devm_ioremap_resource(&pdev->dev, res);
@@ -1742,15 +1724,12 @@ void analogix_dp_unbind(struct analogix_dp_device *dp)
 
 	drm_dp_aux_unregister(&dp->aux);
 	pm_runtime_disable(dp->dev);
-	clk_disable_unprepare(dp->clock);
 }
 EXPORT_SYMBOL_GPL(analogix_dp_unbind);
 
 #ifdef CONFIG_PM
 int analogix_dp_suspend(struct analogix_dp_device *dp)
 {
-	clk_disable_unprepare(dp->clock);
-
 	if (dp->plat_data->panel) {
 		if (drm_panel_unprepare(dp->plat_data->panel))
 			DRM_ERROR("failed to turnoff the panel\n");
@@ -1762,14 +1741,6 @@ EXPORT_SYMBOL_GPL(analogix_dp_suspend);
 
 int analogix_dp_resume(struct analogix_dp_device *dp)
 {
-	int ret;
-
-	ret = clk_prepare_enable(dp->clock);
-	if (ret < 0) {
-		DRM_ERROR("Failed to prepare_enable the clock clk [%d]\n", ret);
-		return ret;
-	}
-
 	if (dp->plat_data->panel) {
 		if (drm_panel_prepare(dp->plat_data->panel)) {
 			DRM_ERROR("failed to setup the panel\n");
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
index 67d6ad1c8447..86dc6b6e225a 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
@@ -171,7 +171,6 @@ struct analogix_dp_device {
 	struct drm_connector	connector;
 	struct drm_bridge	*bridge;
 	struct drm_dp_aux       aux;
-	struct clk		*clock;
 	unsigned int		irq;
 	void __iomem		*reg_base;
 
diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
index 47d10d4626c3..26ba45e24acc 100644
--- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
+++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
@@ -530,12 +530,6 @@ static int rockchip_dp_bind(struct device *dev, struct device *master,
 	if (ret < 0)
 		goto err_cleanup_encoder;
 
-	dp->adp = analogix_dp_bind(dev, dp->drm_dev, &dp->plat_data);
-	if (IS_ERR(dp->adp)) {
-		ret = PTR_ERR(dp->adp);
-		goto err_unreg_psr;
-	}
-
 	if (dp->data->audio) {
 		struct hdmi_codec_pdata codec_data = {
 			.ops = &rockchip_dp_audio_codec_ops,
@@ -555,11 +549,20 @@ static int rockchip_dp_bind(struct device *dev, struct device *master,
 		}
 	}
 
+	dp->adp = analogix_dp_bind(dev, dp->drm_dev, &dp->plat_data);
+	if (IS_ERR(dp->adp)) {
+		ret = PTR_ERR(dp->adp);
+		goto err_unreg_audio;
+	}
+
 	dp->sub_dev.connector = &dp->adp->connector;
 	dp->sub_dev.of_node = dev->of_node;
 	rockchip_drm_register_sub_dev(&dp->sub_dev);
 
 	return 0;
+err_unreg_audio:
+	if (dp->audio_pdev)
+		platform_device_unregister(dp->audio_pdev);
 err_unreg_psr:
 	rockchip_drm_psr_unregister(&dp->encoder);
 err_cleanup_encoder:

commit 25003d386cd81a06ea3379b130507f193538dd5b
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Sat Sep 18 15:20:17 2021 +0800

    drm/rockchip: vop2: Support set unique possible_crtcs by plane_mask
    
    Enabled by:
    
    &vop2 {
            disable-win-move;
    };
    
    Change-Id: Idc15f713b74650ac910233538d186ad799e25124
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 2c121c7d186d..0a288894fd09 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -555,6 +555,9 @@ struct vop2 {
 	bool support_multi_area;
 	bool disable_afbc_win;
 
+	/* no move win from one vp to another */
+	bool disable_win_move;
+
 	bool loader_protect;
 
 	const struct vop2_data *data;
@@ -793,6 +796,20 @@ static struct vop2_win *vop2_find_win_by_phys_id(struct vop2 *vop2, uint8_t phys
 	return NULL;
 }
 
+static struct drm_crtc *vop2_find_crtc_by_plane_mask(struct vop2 *vop2, uint8_t phys_id)
+{
+	struct vop2_video_port *vp;
+	int i;
+
+	for (i = 0; i < vop2->data->nr_vps; i++) {
+		vp = &vop2->vps[i];
+		if (vp->plane_mask & BIT(phys_id))
+			return &vp->crtc;
+	}
+
+	return NULL;
+}
+
 static void vop2_load_hdr2sdr_table(struct vop2_video_port *vp)
 {
 	struct vop2 *vop2 = vp->vop2;
@@ -6150,6 +6167,8 @@ static int vop2_create_crtc(struct vop2 *vop2)
 		vp->id = vp_data->id;
 		vp->regs = vp_data->regs;
 		vp->cursor_win_id = -1;
+		if (vop2->disable_win_move)
+			possible_crtcs = BIT(registered_num_crtcs);
 
 		/*
 		 * we assume a vp with a zere plane_mask(set from dts or bootloader)
@@ -6303,6 +6322,14 @@ static int vop2_create_crtc(struct vop2 *vop2)
 		if (registered_num_crtcs < 2 && vop2_is_mirror_win(win))
 			continue;
 
+		if (vop2->disable_win_move) {
+			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;
+		}
+
 		ret = vop2_plane_init(vop2, win, possible_crtcs);
 		if (ret)
 			DRM_WARN("failed to init overlay plane %s\n", win->name);
@@ -6490,6 +6517,7 @@ static int vop2_bind(struct device *dev, struct device *master, void *data)
 
 	vop2->support_multi_area = of_property_read_bool(dev->of_node, "support-multi-area");
 	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");
 
 	ret = vop2_win_init(vop2);
 	if (ret)

commit 2120901346b4bbf0db7c056d228c54d49f60e9e8
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Mon Sep 6 19:56:08 2021 +0800

    drm/rockchip: vop2: Assign plane for vp by plane_mask
    
    Change-Id: I6cbd87a5c4ecab7a54f30f0a6bfdd8721f86cce9
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index df7a037b21de..2c121c7d186d 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -2517,35 +2517,39 @@ static int vop2_core_clks_prepare_enable(struct vop2 *vop2)
  */
 static void vop2_layer_map_initial(struct vop2 *vop2, uint32_t current_vp_id)
 {
-	const struct vop2_data *vop2_data = vop2->data;
 	struct vop2_layer *layer = &vop2->layers[0];
 	struct vop2_video_port *vp = &vop2->vps[0];
 	struct vop2_win *win;
-	const struct vop2_win_data *win_data = NULL;
+	unsigned long win_mask;
 	uint32_t used_layers = 0;
-	uint32_t layer_map, sel;
-	uint32_t win_map, vp_id;
 	uint16_t port_mux_cfg = 0;
 	uint16_t port_mux;
-	uint32_t shift;
+	uint16_t vp_id;
+	uint8_t nr_layers;
+	int phys_id;
 	int i, j;
 
-	layer_map = vop2_readl(vop2, layer->regs->layer_sel.offset);
-	win_map = vop2_readl(vop2, vp->regs->port_mux.offset);
-
 	for (i = 0; i < vop2->data->nr_vps; i++) {
-		vp = &vop2->vps[i];
-		vp->win_mask = 0;
-		for (j = 0; j < vop2_data->nr_layers; j++) {
-			win = vop2_find_win_by_phys_id(vop2, j);
-			shift = vop2->data->ctrl->win_vp_id[j].shift;
-			vp_id = (win_map >> shift) & 0x3;
-			if (vp_id == i) {
-				vp->win_mask |=  BIT(j);
-				win->vp_mask = BIT(vp_id);
-				win->old_vp_mask = win->vp_mask;
-			}
+		vp_id = i;
+		j = 0;
+		vp = &vop2->vps[vp_id];
+		vp->win_mask = vp->plane_mask;
+		nr_layers = hweight32(vp->win_mask);
+		win_mask = vp->win_mask;
+		for_each_set_bit(phys_id, &win_mask, ROCKCHIP_MAX_LAYER) {
+			layer = &vop2->layers[used_layers + j];
+			win = vop2_find_win_by_phys_id(vop2, phys_id);
+			VOP_CTRL_SET(vop2, win_vp_id[phys_id], vp_id);
+			VOP_MODULE_SET(vop2, layer, layer_sel, win->layer_sel_id);
+			win->vp_mask = BIT(i);
+			win->old_vp_mask = win->vp_mask;
+			layer->win_phys_id = win->phys_id;
+			win->layer_id = layer->id;
+			j++;
+			DRM_DEV_DEBUG(vop2->dev, "layer%d select %s for vp%d phys_id: %d\n",
+				      layer->id, win->name, vp_id, phys_id);
 		}
+		used_layers += nr_layers;
 	}
 
 	/*
@@ -2569,25 +2573,6 @@ static void vop2_layer_map_initial(struct vop2 *vop2, uint32_t current_vp_id)
 	vop2->port_mux_cfg = port_mux_cfg;
 	VOP_CTRL_SET(vop2, ovl_port_mux_cfg, port_mux_cfg);
 
-	for (i = 0; i < vop2->data->nr_layers; i++) {
-		sel = (layer_map >> (4 * i)) & 0xf;
-		layer = &vop2->layers[i];
-		for (j = 0; j < vop2_data->win_size; j++) {
-			win_data = &vop2_data->win[j];
-			if (sel == win_data->layer_sel_id)
-				break;
-			win_data = NULL;
-		}
-
-		if (!win_data) {
-			DRM_DEV_ERROR(vop2->dev, "invalid layer map :0x%x\n", layer_map);
-			return;
-		}
-		win = vop2_find_win_by_phys_id(vop2, win_data->phys_id);
-		layer->win_phys_id = win->phys_id;
-		win->layer_id = layer->id;
-		DRM_DEV_DEBUG(vop2->dev, "layer%d select %s\n", layer->id, win->name);
-	}
 }
 
 static void vop2_initial(struct drm_crtc *crtc)

commit 15351d5a0d1666c7f020de753dc7d370473a1a1d
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Thu Sep 16 10:34:22 2021 +0800

    media: rockchip: isp: before frame start to update bridge mi
    
    isp20 bridge will config gain and image dma address when isp
    frame start interrupt event, and frame end update. But no
    actual update if frame start and frame end together. One read
    back is the same as the start interrupt event, so to update
    bridge mi this.
    
    Change-Id: I697128fd60c3e38eb2ed163a5a94df8c4c018241
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/bridge.c b/drivers/media/platform/rockchip/isp/bridge.c
index b235d6ef06a2..946e3c8bb138 100644
--- a/drivers/media/platform/rockchip/isp/bridge.c
+++ b/drivers/media/platform/rockchip/isp/bridge.c
@@ -523,7 +523,7 @@ static int frame_end(struct rkisp_bridge_device *dev, bool en, u32 state)
 
 	if (state == FRAME_IRQ && ispdev->cap_dev.is_done_early)
 		return 0;
-
+	dev->frame_early = false;
 	rkisp_dmarx_get_frame(dev->ispdev, &dev->dbg.id, NULL, NULL, true);
 	dev->dbg.interval = ns - dev->dbg.timestamp;
 	dev->dbg.timestamp = ns;
@@ -1495,7 +1495,7 @@ void rkisp_bridge_stop_spstream(struct rkisp_device *dev)
 	spin_unlock_irqrestore(&hw->buf_lock, lock_flags);
 }
 
-void rkisp_bridge_update_mi(struct rkisp_device *dev)
+void rkisp_bridge_update_mi(struct rkisp_device *dev, u32 isp_mis)
 {
 	struct rkisp_bridge_device *br = &dev->br_dev;
 	struct rkisp_hw_dev *hw = dev->hw_dev;
@@ -1504,7 +1504,8 @@ void rkisp_bridge_update_mi(struct rkisp_device *dev)
 	u32 val;
 
 	if (dev->isp_ver != ISP_V20 || !br->en ||
-	    br->work_mode & ISP_ISPP_QUICK)
+	    br->work_mode & ISP_ISPP_QUICK ||
+	    isp_mis & CIF_ISP_FRAME)
 		return;
 
 	br->fs_ns = ktime_get_ns();
@@ -1526,8 +1527,10 @@ void rkisp_bridge_update_mi(struct rkisp_device *dev)
 		rkisp_write(dev, br->cfg->reg.g0_base, val, true);
 	}
 
-	if (dev->cap_dev.is_done_early)
+	if (dev->cap_dev.is_done_early && !br->frame_early) {
+		br->frame_early = true;
 		hrtimer_start(&br->frame_qst, ns_to_ktime(1000000), HRTIMER_MODE_REL);
+	}
 
 	v4l2_dbg(2, rkisp_debug, &br->sd,
 		 "update pic(shd:0x%x base:0x%x) gain(shd:0x%x base:0x%x)\n",
diff --git a/drivers/media/platform/rockchip/isp/bridge.h b/drivers/media/platform/rockchip/isp/bridge.h
index 872d9d5753ba..6a75054ba69f 100644
--- a/drivers/media/platform/rockchip/isp/bridge.h
+++ b/drivers/media/platform/rockchip/isp/bridge.h
@@ -65,6 +65,7 @@ struct rkisp_bridge_device {
 	bool stopping;
 	bool linked;
 	bool en;
+	bool frame_early;
 };
 
 #if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V20)
@@ -76,13 +77,13 @@ void rkisp_bridge_isr(u32 *mis_val, struct rkisp_device *dev);
 void rkisp_bridge_sendtopp_buffer(struct rkisp_device *dev, u32 dev_id, u32 buf_idx);
 void rkisp_bridge_save_spbuf(struct rkisp_device *dev, struct rkisp_buffer *sp_buf);
 void rkisp_bridge_stop_spstream(struct rkisp_device *dev);
-void rkisp_bridge_update_mi(struct rkisp_device *dev);
+void rkisp_bridge_update_mi(struct rkisp_device *dev, u32 isp_mis);
 void rkisp_get_bridge_sd(struct platform_device *dev, struct v4l2_subdev **sd);
 #else
 static inline int rkisp_register_bridge_subdev(struct rkisp_device *dev, struct v4l2_device *v4l2_dev) { return 0; }
 static inline void rkisp_unregister_bridge_subdev(struct rkisp_device *dev) {}
 static inline int rkisp_bridge_get_fbcbuf_fd(struct rkisp_device *dev, struct isp2x_buf_idxfd *idxfd) { return 0; }
-static inline void rkisp_bridge_update_mi(struct rkisp_device *dev) {}
+static inline void rkisp_bridge_update_mi(struct rkisp_device *dev, u32 isp_mis) {}
 #endif
 
 #endif
diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c
index a3661646fbf9..673d05b51610 100644
--- a/drivers/media/platform/rockchip/isp/rkisp.c
+++ b/drivers/media/platform/rockchip/isp/rkisp.c
@@ -609,6 +609,8 @@ void rkisp_trigger_read_back(struct rkisp_device *dev, u8 dma2frm, u32 mode, boo
 	v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev,
 		 "readback frame:%d time:%d 0x%x\n",
 		 cur_frame_id, dma2frm + 1, val);
+	if (!dma2frm)
+		rkisp_bridge_update_mi(dev, 0);
 	if (!hw->is_shutdown)
 		rkisp_write(dev, CSI2RX_CTRL0, val, true);
 }
@@ -2945,7 +2947,7 @@ void rkisp_isp_isr(unsigned int isp_mis,
 		}
 		/* last vsync to config next buf */
 		if (!dev->filt_state[RDBK_F_VS])
-			rkisp_bridge_update_mi(dev);
+			rkisp_bridge_update_mi(dev, isp_mis);
 		else
 			dev->filt_state[RDBK_F_VS]--;
 		if (IS_HDR_RDBK(dev->hdr.op_mode)) {

commit 25cc3a7a9e18797b6084e35b3ffaad8bdbefe47f
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Wed Sep 22 15:32:09 2021 +0800

    media: rockchip: isp: fix default params config for mode switch
    
    Change-Id: I7946d394e0a224ef8f2e1a460b9bf89c9334d015
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c
index 4d60400a325d..a3661646fbf9 100644
--- a/drivers/media/platform/rockchip/isp/rkisp.c
+++ b/drivers/media/platform/rockchip/isp/rkisp.c
@@ -537,7 +537,7 @@ void rkisp_trigger_read_back(struct rkisp_device *dev, u8 dma2frm, u32 mode, boo
 	dev->rd_mode = rd_mode;
 
 	/* configure hdr params in rdbk mode */
-	if (is_upd)
+	if (is_upd || cur_frame_id == 0)
 		rkisp_params_first_cfg(&dev->params_vdev,
 				       &dev->isp_sdev.in_fmt,
 				       dev->isp_sdev.quantization);

commit 14f3d5cac4e8a6d802c1360ebabfa6e03e75ca86
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Wed Sep 22 10:33:55 2021 +0800

    media: rockchip: isp: rawrd support uncompact mode
    
    Change-Id: If9ff4b2043e3c9b29843b7f3562d107da597c9d8
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/dmarx.c b/drivers/media/platform/rockchip/isp/dmarx.c
index 3e2749a7613d..706a8b819ed2 100644
--- a/drivers/media/platform/rockchip/isp/dmarx.c
+++ b/drivers/media/platform/rockchip/isp/dmarx.c
@@ -346,6 +346,8 @@ static int rawrd_config_mi(struct rkisp_stream *stream)
 	default:
 		val |= CIF_CSI2_DT_RAW12;
 	}
+	rkisp_write(dev, CSI2RX_RAW_RD_CTRL,
+		    dev->csi_dev.memory << 2, false);
 	rkisp_write(dev, CSI2RX_DATA_IDS_1, val, false);
 	rkisp_rawrd_set_pic_size(dev, stream->out_fmt.width,
 				 stream->out_fmt.height);

commit f9b49c76cabf8f1a4f2fd52a69d6c8f5e906a2d7
Author: Yu Qiaowei <cerf.yu@rock-chips.com>
Date:   Thu Sep 23 19:10:12 2021 +0800

    video/rockchip: rga2: Modify the memory check of dma buffer.
    
    Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
    Change-Id: I9f51a0ec08c49a86b70c775cc9e81f3d70384553

diff --git a/drivers/video/rockchip/rga2/rga2_mmu_info.c b/drivers/video/rockchip/rga2/rga2_mmu_info.c
index af97f7a93998..2b05c9356c3a 100644
--- a/drivers/video/rockchip/rga2/rga2_mmu_info.c
+++ b/drivers/video/rockchip/rga2/rga2_mmu_info.c
@@ -136,16 +136,10 @@ static bool rga2_is_yuv422p_format(u32 format)
 }
 
 #ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
-static int rga2_memory_check(void *vaddr, u32 w, u32 h, u32 format, int fd)
+static int rga2_get_format_bits(u32 format)
 {
-	int bits = 32;
-	int temp_data = 0;
-	void *one_line = kzalloc(w * 4, GFP_KERNEL);
+	int bits = 0;
 
-	if (!one_line) {
-		ERR("kzalloc fail %s[%d]\n", __func__, __LINE__);
-		return 0;
-	}
 	switch (format) {
 	case RGA2_FORMAT_RGBA_8888:
 	case RGA2_FORMAT_RGBX_8888:
@@ -190,10 +184,66 @@ static int rga2_memory_check(void *vaddr, u32 w, u32 h, u32 format, int fd)
 		bits = 15;
 		break;
 	default:
-		INFO("un know format\n");
-		kfree(one_line);
+		pr_err("unknown format [%d]\n", format);
 		return -1;
 	}
+
+	return bits;
+}
+static int rga2_user_memory_check(struct page **pages, u32 w, u32 h, u32 format, int flag)
+{
+	int bits;
+	void *vaddr = NULL;
+	int taipage_num;
+	int taidata_num;
+	int *tai_vaddr = NULL;
+
+	bits = rga2_get_format_bits(format);
+	if (bits < 0)
+		return -1;
+
+	taipage_num = w * h * bits / 8 / (1024 * 4);
+	taidata_num = w * h * bits / 8 % (1024 * 4);
+	if (taidata_num == 0) {
+		vaddr = kmap(pages[taipage_num - 1]);
+		tai_vaddr = (int *)vaddr + 1023;
+	} else {
+		vaddr = kmap(pages[taipage_num]);
+		tai_vaddr = (int *)vaddr + taidata_num / 4 - 1;
+	}
+
+	if (flag == 1) {
+		pr_info("src user memory check\n");
+		pr_info("tai data is %d\n", *tai_vaddr);
+	} else {
+		pr_info("dst user memory check\n");
+		pr_info("tai data is %d\n", *tai_vaddr);
+	}
+
+	if (taidata_num == 0)
+		kunmap(pages[taipage_num - 1]);
+	else
+		kunmap(pages[taipage_num]);
+
+	return 0;
+}
+
+static int rga2_virtual_memory_check(void *vaddr, u32 w, u32 h, u32 format, int fd)
+{
+	int bits = 32;
+	int temp_data = 0;
+	void *one_line = NULL;
+
+	bits = rga2_get_format_bits(format);
+	if (bits < 0)
+		return -1;
+
+	one_line = kzalloc(w * 4, GFP_KERNEL);
+	if (!one_line) {
+		ERR("kzalloc fail %s[%d]\n", __func__, __LINE__);
+		return 0;
+	}
+
 	temp_data = w * (h - 1) * bits >> 3;
 	if (fd > 0) {
 		INFO("vaddr is%p, bits is %d, fd check\n", vaddr, bits);
@@ -205,13 +255,39 @@ static int rga2_memory_check(void *vaddr, u32 w, u32 h, u32 format, int fd)
 		       w * bits >> 3);
 		INFO("vir addr check ok.\n");
 	}
+
 	kfree(one_line);
 	return 0;
 }
+
+static int rga2_dma_memory_check(struct rga_dma_buffer_t *buffer,
+				 struct rga_img_info_t *img)
+{
+	int ret = 0;
+	void *vaddr;
+	struct dma_buf *dma_buffer;
+
+	dma_buffer = buffer->dma_buf;
+
+	if (!IS_ERR_OR_NULL(dma_buffer)) {
+		vaddr = dma_buf_vmap(dma_buffer);
+		if (vaddr) {
+			ret = rga2_virtual_memory_check(vaddr, img->vir_w, img->vir_h,
+							img->format, img->yrgb_addr);
+		} else {
+			pr_err("can't vmap the dma buffer!\n");
+			return -EINVAL;
+		}
+
+		dma_buf_vunmap(dma_buffer, vaddr);
+	}
+
+	return ret;
+}
 #endif
 
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
-static int rga2_map_dma_buffer(struct rga_img_info_t *img,
+static int rga2_map_dma_buffer(int fd,
 			       struct rga_dma_buffer_t *rga_dma_buffer,
 			       enum dma_data_direction dir)
 {
@@ -219,14 +295,9 @@ static int rga2_map_dma_buffer(struct rga_img_info_t *img,
 	struct dma_buf *dma_buf = NULL;
 	struct dma_buf_attachment *attach = NULL;
 	struct sg_table *sgt = NULL;
-	u32 vir_w, vir_h;
-	int fd = -1;
 	int ret = 0;
 
 	rga_dev = rga2_drvdata->dev;
-	fd = (int)img->yrgb_addr;
-	vir_w = img->vir_w;
-	vir_h = img->vir_h;
 
 	dma_buf = dma_buf_get(fd);
 	if (IS_ERR(dma_buf)) {
@@ -242,17 +313,6 @@ static int rga2_map_dma_buffer(struct rga_img_info_t *img,
 		goto err_get_attach;
 	}
 
-#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
-	if (RGA2_CHECK_MODE) {
-		void *vaddr = dma_buf_vmap(dma_buf);
-
-		if (vaddr)
-			rga2_memory_check(vaddr, img->vir_w, img->vir_h,
-					  img->format, img->yrgb_addr);
-		dma_buf_vunmap(dma_buf, vaddr);
-	}
-#endif
-
 	sgt = dma_buf_map_attachment(attach, dir);
 	if (IS_ERR(sgt)) {
 		ret = -EINVAL;
@@ -333,12 +393,21 @@ int rga2_get_dma_info(struct rga2_reg *reg, struct rga2_req *req)
 		pr_err("Fix it please enable src0 mmu\n");
 		return -EINVAL;
 	} else if (mmu_flag && src0->yrgb_addr) {
-		ret = rga2_map_dma_buffer(src0, buffer_src0, DMA_BIDIRECTIONAL);
+		ret = rga2_map_dma_buffer(src0->yrgb_addr, buffer_src0, DMA_BIDIRECTIONAL);
 		if (ret < 0) {
 			pr_err("src0: can't map dma-buf\n");
 			return ret;
 		}
 	}
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
+	if (RGA2_CHECK_MODE) {
+		ret = rga2_dma_memory_check(buffer_src0, src0);
+		if (ret < 0) {
+			pr_err("src0 channel check memory error!\n");
+			return ret;
+		}
+	}
+#endif
 	rga2_convert_addr(src0);
 
 	/* src1 chanel */
@@ -348,12 +417,21 @@ int rga2_get_dma_info(struct rga2_reg *reg, struct rga2_req *req)
 		ret = -EINVAL;
 		goto err_src1_channel;
 	} else if (mmu_flag && src1->yrgb_addr) {
-		ret = rga2_map_dma_buffer(src1, buffer_src1, DMA_BIDIRECTIONAL);
+		ret = rga2_map_dma_buffer(src1->yrgb_addr, buffer_src1, DMA_BIDIRECTIONAL);
 		if (ret < 0) {
 			pr_err("src1: can't map dma-buf\n");
 			goto err_src1_channel;
 		}
 	}
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
+	if (RGA2_CHECK_MODE) {
+		ret = rga2_dma_memory_check(buffer_src1, src1);
+		if (ret < 0) {
+			pr_err("src1 channel check memory error!\n");
+			goto err_src1_channel;
+		}
+	}
+#endif
 	rga2_convert_addr(src1);
 
 	/* dst chanel */
@@ -363,12 +441,21 @@ int rga2_get_dma_info(struct rga2_reg *reg, struct rga2_req *req)
 		ret = -EINVAL;
 		goto err_dst_channel;
 	} else if (mmu_flag && dst->yrgb_addr) {
-		ret = rga2_map_dma_buffer(dst, buffer_dst, DMA_BIDIRECTIONAL);
+		ret = rga2_map_dma_buffer(dst->yrgb_addr, buffer_dst, DMA_BIDIRECTIONAL);
 		if (ret < 0) {
 			pr_err("dst: can't map dma-buf\n");
 			goto err_dst_channel;
 		}
 	}
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
+	if (RGA2_CHECK_MODE) {
+		ret = rga2_dma_memory_check(buffer_dst, dst);
+		if (ret < 0) {
+			pr_err("dst channel check memory error!\n");
+			goto err_dst_channel;
+		}
+	}
+#endif
 	rga2_convert_addr(dst);
 
 	/* els chanel */
@@ -378,12 +465,21 @@ int rga2_get_dma_info(struct rga2_reg *reg, struct rga2_req *req)
 		ret = -EINVAL;
 		goto err_els_channel;
 	} else if (mmu_flag && els->yrgb_addr) {
-		ret = rga2_map_dma_buffer(els, buffer_els, DMA_BIDIRECTIONAL);
+		ret = rga2_map_dma_buffer(els->yrgb_addr, buffer_els, DMA_BIDIRECTIONAL);
 		if (ret < 0) {
 			pr_err("els: can't map dma-buf\n");
 			goto err_els_channel;
 		}
 	}
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
+	if (RGA2_CHECK_MODE) {
+		ret = rga2_dma_memory_check(buffer_els, els);
+		if (ret < 0) {
+			pr_err("els channel check memory error!\n");
+			goto err_els_channel;
+		}
+	}
+#endif
 	rga2_convert_addr(els);
 
 	return 0;
@@ -405,7 +501,6 @@ void rga2_put_dma_info(struct rga2_reg *reg)
 	rga2_unmap_dma_buffer(&reg->dma_buffer_dst);
 	rga2_unmap_dma_buffer(&reg->dma_buffer_els);
 }
-
 #else
 static int rga2_get_dma_info(struct rga2_reg *reg, struct rga2_req *req)
 {
@@ -789,86 +884,6 @@ static int rga2_buf_size_cal(unsigned long yrgb_addr, unsigned long uv_addr, uns
     return pageCount;
 }
 
-#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
-static int rga2_UserMemory_cheeck(struct page **pages, u32 w, u32 h, u32 format, int flag)
-{
-	int bits;
-	void *vaddr = NULL;
-	int taipage_num;
-	int taidata_num;
-	int *tai_vaddr = NULL;
-
-	switch (format) {
-	case RGA2_FORMAT_RGBA_8888:
-	case RGA2_FORMAT_RGBX_8888:
-	case RGA2_FORMAT_BGRA_8888:
-	case RGA2_FORMAT_BGRX_8888:
-	case RGA2_FORMAT_ARGB_8888:
-	case RGA2_FORMAT_XRGB_8888:
-	case RGA2_FORMAT_ABGR_8888:
-	case RGA2_FORMAT_XBGR_8888:
-		bits = 32;
-		break;
-	case RGA2_FORMAT_RGB_888:
-	case RGA2_FORMAT_BGR_888:
-		bits = 24;
-		break;
-	case RGA2_FORMAT_RGB_565:
-	case RGA2_FORMAT_RGBA_5551:
-	case RGA2_FORMAT_RGBA_4444:
-	case RGA2_FORMAT_BGR_565:
-	case RGA2_FORMAT_YCbCr_422_SP:
-	case RGA2_FORMAT_YCbCr_422_P:
-	case RGA2_FORMAT_YCrCb_422_SP:
-	case RGA2_FORMAT_YCrCb_422_P:
-	case RGA2_FORMAT_BGRA_5551:
-	case RGA2_FORMAT_BGRA_4444:
-	case RGA2_FORMAT_ARGB_5551:
-	case RGA2_FORMAT_ARGB_4444:
-	case RGA2_FORMAT_ABGR_5551:
-	case RGA2_FORMAT_ABGR_4444:
-		bits = 16;
-		break;
-	case RGA2_FORMAT_YCbCr_420_SP:
-	case RGA2_FORMAT_YCbCr_420_P:
-	case RGA2_FORMAT_YCrCb_420_SP:
-	case RGA2_FORMAT_YCrCb_420_P:
-		bits = 12;
-		break;
-	case RGA2_FORMAT_YCbCr_420_SP_10B:
-	case RGA2_FORMAT_YCrCb_420_SP_10B:
-	case RGA2_FORMAT_YCbCr_422_SP_10B:
-	case RGA2_FORMAT_YCrCb_422_SP_10B:
-		bits = 15;
-		break;
-	default:
-		printk("un know format\n");
-		return -1;
-	}
-	taipage_num = w * h * bits / 8 / (1024 * 4);
-	taidata_num = w * h * bits / 8 % (1024 * 4);
-	if (taidata_num == 0) {
-		vaddr = kmap(pages[taipage_num - 1]);
-		tai_vaddr = (int *)vaddr + 1023;
-	} else {
-		vaddr = kmap(pages[taipage_num]);
-		tai_vaddr = (int *)vaddr + taidata_num / 4 - 1;
-	}
-	if (flag == 1) {
-		pr_info("src user memory check\n");
-		pr_info("tai data is %d\n", *tai_vaddr);
-	} else {
-		pr_info("dst user memory check\n");
-		pr_info("tai data is %d\n", *tai_vaddr);
-	}
-	if (taidata_num == 0)
-		kunmap(pages[taipage_num - 1]);
-	else
-		kunmap(pages[taipage_num]);
-	return 0;
-}
-#endif
-
 static int rga2_MapUserMemory(struct page **pages, uint32_t *pageTable,
 			      unsigned long Memory, uint32_t pageCount,
 			      int writeFlag, int map)
@@ -1102,7 +1117,7 @@ static int rga2_mmu_flush_cache(struct rga2_reg *reg, struct rga2_req *req)
 						 MMU_MAP_CLEAN | MMU_MAP_INVALID);
 #ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 			if (RGA2_CHECK_MODE)
-				rga2_UserMemory_cheeck(&pages[0],
+				rga2_user_memory_check(&pages[0],
 						       req->dst.vir_w,
 						       req->dst.vir_h,
 						       req->dst.format,
@@ -1217,7 +1232,7 @@ static int rga2_mmu_info_BitBlt_mode(struct rga2_reg *reg, struct rga2_req *req)
 						 0, MMU_MAP_CLEAN);
 #ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 			if (RGA2_CHECK_MODE)
-				rga2_UserMemory_cheeck(&pages[0],
+				rga2_user_memory_check(&pages[0],
 						       req->src.vir_w,
 						       req->src.vir_h,
 						       req->src.format,
@@ -1288,7 +1303,7 @@ static int rga2_mmu_info_BitBlt_mode(struct rga2_reg *reg, struct rga2_req *req)
 						 MMU_MAP_CLEAN | MMU_MAP_INVALID);
 #ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 			if (RGA2_CHECK_MODE)
-				rga2_UserMemory_cheeck(&pages[0],
+				rga2_user_memory_check(&pages[0],
 						       req->dst.vir_w,
 						       req->dst.vir_h,
 						       req->dst.format,
@@ -1305,7 +1320,7 @@ static int rga2_mmu_info_BitBlt_mode(struct rga2_reg *reg, struct rga2_req *req)
 						 1, MMU_MAP_INVALID);
 #ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 			if (RGA2_CHECK_MODE)
-				rga2_UserMemory_cheeck(&pages[0],
+				rga2_user_memory_check(&pages[0],
 						       req->dst.vir_w,
 						       req->dst.vir_h,
 						       req->dst.format,
@@ -1436,7 +1451,7 @@ static int rga2_mmu_info_color_palette_mode(struct rga2_reg *reg, struct rga2_re
                 SrcStart, SrcPageCount, 0, MMU_MAP_CLEAN);
 #ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
                 if (RGA2_CHECK_MODE)
-                rga2_UserMemory_cheeck(&pages[0], req->src.vir_w,
+                rga2_user_memory_check(&pages[0], req->src.vir_w,
                 req->src.vir_h, req->src.format,
                 1);
 #endif
@@ -1467,7 +1482,7 @@ static int rga2_mmu_info_color_palette_mode(struct rga2_reg *reg, struct rga2_re
                 DstStart, DstPageCount, 1, MMU_MAP_INVALID);
 #ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
                 if (RGA2_CHECK_MODE)
-                rga2_UserMemory_cheeck(&pages[0], req->dst.vir_w,
+                rga2_user_memory_check(&pages[0], req->dst.vir_w,
                 req->dst.vir_h, req->dst.format,
                 1);
 #endif

commit 1b30a33f67bdd84304e8a378d3906048d1aa9623
Author: Xing Zheng <zhengxing@rock-chips.com>
Date:   Thu Sep 23 19:47:33 2021 +0800

    Revert "ASoC: rockchip: rk817-codec: add support recover playback/capture path after resume"
    
    This reverts commit 20d8a7925f1507dde173d002eac7060c422c3448.
    
    Generally, we cannot guarantee that the paths of capture and
    playback need to be turned on by default after resume, which
    can be manually controlled by the user layer. In this way, the
    problem of asymmetrical clock operation can also be corrected
    after resume.
    
    Signed-off-by: Xing Zheng <zhengxing@rock-chips.com>
    Change-Id: I1cb7b364313a7573032851fe0c2970cf1a078b0a

diff --git a/sound/soc/codecs/rk817_codec.c b/sound/soc/codecs/rk817_codec.c
index 61573266a003..ea3dd2d7d448 100644
--- a/sound/soc/codecs/rk817_codec.c
+++ b/sound/soc/codecs/rk817_codec.c
@@ -1062,10 +1062,6 @@ static int rk817_suspend(struct snd_soc_component *component)
 
 static int rk817_resume(struct snd_soc_component *component)
 {
-	struct rk817_codec_priv *rk817 = snd_soc_component_get_drvdata(component);
-
-	rk817_capture_path_config(component, OFF, rk817->capture_path);
-	rk817_playback_path_config(component, OFF, rk817->playback_path);
 	return 0;
 }
 

commit 5a922e0af06066aea931e927f95fb9f7fab3d11d
Author: Simon Xue <xxm@rock-chips.com>
Date:   Sat Sep 18 16:22:31 2021 +0800

    iommu/rockchip: fix vop blocked and screen black on RK356X
    
    RK356X has the same issue as RV1126/RV1109 that caused by
    dte fetch time limit, So we can set BIT(31) of register 0x24 default
    to 1 as a workaround.
    
    Change-Id: Ib0d1fd110aa0349145a63f7c4be5ce77ed6ab4e4
    Fixes: fcbec99d5105 ("iommu: rockchip: disable fetch dte time limit")
    Signed-off-by: Simon Xue <xxm@rock-chips.com>

diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c
index b2715698f5a5..dc2920e866b0 100644
--- a/drivers/iommu/rockchip-iommu.c
+++ b/drivers/iommu/rockchip-iommu.c
@@ -130,7 +130,6 @@ struct rk_iommu {
 	bool reset_disabled;
 	bool skip_read;      /* rk3126/rk3128 can't read vop iommu registers */
 	bool dlr_disable; /* avoid access iommu when runtime ops called */
-	bool fetch_dte_time_limit; /* if have fetch dte time limit */
 	bool cmd_retry;
 	struct iommu_device iommu;
 	struct list_head node; /* entry in rk_iommu_domain.iommus */
@@ -1292,11 +1291,10 @@ static int rk_iommu_enable(struct rk_iommu *iommu)
 		rk_iommu_base_command(iommu->bases[i], RK_MMU_CMD_ZAP_CACHE);
 		rk_iommu_write(iommu->bases[i], RK_MMU_INT_MASK, RK_MMU_IRQ_MASK);
 
-		if (iommu->fetch_dte_time_limit) {
-			auto_gate = rk_iommu_read(iommu->bases[i], RK_MMU_AUTO_GATING);
-			auto_gate |= DISABLE_FETCH_DTE_TIME_LIMIT;
-			rk_iommu_write(iommu->bases[i], RK_MMU_AUTO_GATING, auto_gate);
-		}
+		/* Workaround for iommu blocked, BIT(31) default to 1 */
+		auto_gate = rk_iommu_read(iommu->bases[i], RK_MMU_AUTO_GATING);
+		auto_gate |= DISABLE_FETCH_DTE_TIME_LIMIT;
+		rk_iommu_write(iommu->bases[i], RK_MMU_AUTO_GATING, auto_gate);
 	}
 
 	ret = rk_iommu_enable_paging(iommu);
@@ -1729,11 +1727,9 @@ static int rk_iommu_probe(struct platform_device *pdev)
 					"rockchip,disable-device-link-resume");
 
 	if (of_machine_is_compatible("rockchip,rv1126") ||
-	    of_machine_is_compatible("rockchip,rv1109")) {
-		iommu->fetch_dte_time_limit = true;
+	    of_machine_is_compatible("rockchip,rv1109"))
 		iommu->cmd_retry = device_property_read_bool(dev,
 					"rockchip,enable-cmd-retry");
-	}
 
 	/*
 	 * iommu clocks should be present for all new devices and devicetrees

commit d94845019e807b5fced9327a4f0caad187bfc6ce
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Thu Sep 23 10:57:24 2021 +0800

    drivers: rkflash: Not recheck the cache for XTX devices
    
    Change-Id: I440b3a07d86bbdcbeaa6ab4b5282623bf6cb74c7
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/rkflash/sfc_nand.c b/drivers/rkflash/sfc_nand.c
index d01309566e7b..712197e46c5b 100644
--- a/drivers/rkflash/sfc_nand.c
+++ b/drivers/rkflash/sfc_nand.c
@@ -775,11 +775,13 @@ u32 sfc_nand_prog_page_raw(u8 cs, u32 addr, u32 *p_page_buf)
 	 * is detected by cache recheck, it's better to wait a second for a reliable
 	 * hardware environment to avoid abnormal data written to flash array.
 	 */
-	sfc_nand_read_cache(addr, (u32 *)sfc_nand_dev.recheck_buffer, 0, data_area_size);
-	if (memcmp(sfc_nand_dev.recheck_buffer, p_page_buf, data_area_size)) {
-		rkflash_print_error("%s cache bitflip1\n", __func__);
-		msleep(1000);
-		sfc_request(&op, plane, p_page_buf, page_size);
+	if (p_nand_info->id0 != MID_XTX) {
+		sfc_nand_read_cache(addr, (u32 *)sfc_nand_dev.recheck_buffer, 0, data_area_size);
+		if (memcmp(sfc_nand_dev.recheck_buffer, p_page_buf, data_area_size)) {
+			rkflash_print_error("%s %x cache bitflip\n", __func__, addr);
+			msleep(1000);
+			sfc_request(&op, plane, p_page_buf, page_size);
+		}
 	}
 
 	op.sfcmd.d32 = 0;

commit 2950c9c5e0df6bd34af45a5168bbee345e95eae2
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Wed Sep 22 11:48:14 2021 +0200

    Linux 4.19.207
    
    Link: https://lore.kernel.org/r/20210920163933.258815435@linuxfoundation.org
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Tested-by: Hulk Robot <hulkrobot@huawei.com>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index 3a3eea3ab10a..77dd62aa0bbe 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 206
+SUBLEVEL = 207
 EXTRAVERSION =
 NAME = "People's Front"
 

commit e15c2fe2def24324bfdbfb7ec2837e40b2aac7fd
Author: Ilya Leoshkevich <iii@linux.ibm.com>
Date:   Tue Sep 7 13:41:16 2021 +0200

    s390/bpf: Fix 64-bit subtraction of the -0x80000000 constant
    
    commit 6e61dc9da0b7a0d91d57c2e20b5ea4fd2d4e7e53 upstream.
    
    The JIT uses agfi for subtracting constants, but -(-0x80000000) cannot
    be represented as a 32-bit signed binary integer. Fix by using algfi in
    this particular case.
    
    Reported-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
    Fixes: 054623105728 ("s390/bpf: Add s390x eBPF JIT compiler backend")
    Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
    Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
    Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c
index 2a36845dcbc0..8508c2c0e2a3 100644
--- a/arch/s390/net/bpf_jit_comp.c
+++ b/arch/s390/net/bpf_jit_comp.c
@@ -595,8 +595,13 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
 	case BPF_ALU64 | BPF_SUB | BPF_K: /* dst = dst - imm */
 		if (!imm)
 			break;
-		/* agfi %dst,-imm */
-		EMIT6_IMM(0xc2080000, dst_reg, -imm);
+		if (imm == -0x80000000) {
+			/* algfi %dst,0x80000000 */
+			EMIT6_IMM(0xc20a0000, dst_reg, 0x80000000);
+		} else {
+			/* agfi %dst,-imm */
+			EMIT6_IMM(0xc2080000, dst_reg, -imm);
+		}
 		break;
 	/*
 	 * BPF_MUL

commit 044e7097e849366dfc71cccfc5d8c8a97cb3f010
Author: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Date:   Tue Sep 7 20:29:40 2021 +0900

    net: renesas: sh_eth: Fix freeing wrong tx descriptor
    
    [ Upstream commit 0341d5e3d1ee2a36dd5a49b5bef2ce4ad1cfa6b4 ]
    
    The cur_tx counter must be incremented after TACT bit of
    txdesc->status was set. However, a CPU is possible to reorder
    instructions and/or memory accesses between cur_tx and
    txdesc->status. And then, if TX interrupt happened at such a
    timing, the sh_eth_tx_free() may free the descriptor wrongly.
    So, add wmb() before cur_tx++.
    Otherwise NETDEV WATCHDOG timeout is possible to happen.
    
    Fixes: 86a74ff21a7a ("net: sh_eth: add support for Renesas SuperH Ethernet")
    Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c
index 394ab9cdfe2c..c44aea47c120 100644
--- a/drivers/net/ethernet/renesas/sh_eth.c
+++ b/drivers/net/ethernet/renesas/sh_eth.c
@@ -2547,6 +2547,7 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev)
 	else
 		txdesc->status |= cpu_to_le32(TD_TACT);
 
+	wmb(); /* cur_tx must be incremented after TACT bit was set */
 	mdp->cur_tx++;
 
 	if (!(sh_eth_read(ndev, EDTRR) & mdp->cd->edtrr_trns))

commit 774430026bd9a472d08c5d3c33351a782315771a
Author: Willem de Bruijn <willemb@google.com>
Date:   Sun Sep 5 11:21:09 2021 -0400

    ip_gre: validate csum_start only on pull
    
    [ Upstream commit 8a0ed250f911da31a2aef52101bc707846a800ff ]
    
    The GRE tunnel device can pull existing outer headers in ipge_xmit.
    This is a rare path, apparently unique to this device. The below
    commit ensured that pulling does not move skb->data beyond csum_start.
    
    But it has a false positive if ip_summed is not CHECKSUM_PARTIAL and
    thus csum_start is irrelevant.
    
    Refine to exclude this. At the same time simplify and strengthen the
    test.
    
    Simplify, by moving the check next to the offending pull, making it
    more self documenting and removing an unnecessary branch from other
    code paths.
    
    Strengthen, by also ensuring that the transport header is correct and
    therefore the inner headers will be after skb_reset_inner_headers.
    The transport header is set to csum_start in skb_partial_csum_set.
    
    Link: https://lore.kernel.org/netdev/YS+h%2FtqCJJiQei+W@shredder/
    Fixes: 1d011c4803c7 ("ip_gre: add validation for csum_start")
    Reported-by: Ido Schimmel <idosch@idosch.org>
    Suggested-by: Alexander Duyck <alexander.duyck@gmail.com>
    Signed-off-by: Willem de Bruijn <willemb@google.com>
    Reviewed-by: Alexander Duyck <alexanderduyck@fb.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
index a8a37d112820..0c431fd4b120 100644
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -449,8 +449,6 @@ static void __gre_xmit(struct sk_buff *skb, struct net_device *dev,
 
 static int gre_handle_offloads(struct sk_buff *skb, bool csum)
 {
-	if (csum && skb_checksum_start(skb) < skb->data)
-		return -EINVAL;
 	return iptunnel_handle_offloads(skb, csum ? SKB_GSO_GRE_CSUM : SKB_GSO_GRE);
 }
 
@@ -682,15 +680,20 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb,
 	}
 
 	if (dev->header_ops) {
+		const int pull_len = tunnel->hlen + sizeof(struct iphdr);
+
 		if (skb_cow_head(skb, 0))
 			goto free_skb;
 
 		tnl_params = (const struct iphdr *)skb->data;
 
+		if (pull_len > skb_transport_offset(skb))
+			goto free_skb;
+
 		/* Pull skb since ip_tunnel_xmit() needs skb->data pointing
 		 * to gre header.
 		 */
-		skb_pull(skb, tunnel->hlen + sizeof(struct iphdr));
+		skb_pull(skb, pull_len);
 		skb_reset_mac_header(skb);
 	} else {
 		if (skb_cow_head(skb, dev->needed_headroom))

commit 833ffc44049435ab0e9b636a671c2108acfbc72a
Author: Dinghao Liu <dinghao.liu@zju.edu.cn>
Date:   Fri Sep 3 15:35:43 2021 +0800

    qlcnic: Remove redundant unlock in qlcnic_pinit_from_rom
    
    [ Upstream commit 9ddbc2a00d7f63fa9748f4278643193dac985f2d ]
    
    Previous commit 68233c583ab4 removes the qlcnic_rom_lock()
    in qlcnic_pinit_from_rom(), but remains its corresponding
    unlock function, which is odd. I'm not very sure whether the
    lock is missing, or the unlock is redundant. This bug is
    suggested by a static analysis tool, please advise.
    
    Fixes: 68233c583ab4 ("qlcnic: updated reset sequence")
    Signed-off-by: Dinghao Liu <dinghao.liu@zju.edu.cn>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
index c48a0e2d4d7e..6a009d51ec51 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
@@ -440,7 +440,6 @@ int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter)
 	QLCWR32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x3c, 1);
 	msleep(20);
 
-	qlcnic_rom_unlock(adapter);
 	/* big hammer don't reset CAM block on reset */
 	QLCWR32(adapter, QLCNIC_ROMUSB_GLB_SW_RESET, 0xfeffffff);
 

commit 7c113506163a1ec6157927428eddd80038d2916e
Author: Eric Dumazet <edumazet@google.com>
Date:   Fri Sep 3 15:03:43 2021 -0700

    fq_codel: reject silly quantum parameters
    
    [ Upstream commit c7c5e6ff533fe1f9afef7d2fa46678987a1335a7 ]
    
    syzbot found that forcing a big quantum attribute would crash hosts fast,
    essentially using this:
    
    tc qd replace dev eth0 root fq_codel quantum 4294967295
    
    This is because fq_codel_dequeue() would have to loop
    ~2^31 times in :
    
            if (flow->deficit <= 0) {
                    flow->deficit += q->quantum;
                    list_move_tail(&flow->flowchain, &q->old_flows);
                    goto begin;
            }
    
    SFQ max quantum is 2^19 (half a megabyte)
    Lets adopt a max quantum of one megabyte for FQ_CODEL.
    
    Fixes: 4b549a2ef4be ("fq_codel: Fair Queue Codel AQM")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/uapi/linux/pkt_sched.h b/include/uapi/linux/pkt_sched.h
index 8975fd1a1421..24ce2aab8946 100644
--- a/include/uapi/linux/pkt_sched.h
+++ b/include/uapi/linux/pkt_sched.h
@@ -779,6 +779,8 @@ struct tc_codel_xstats {
 
 /* FQ_CODEL */
 
+#define FQ_CODEL_QUANTUM_MAX (1 << 20)
+
 enum {
 	TCA_FQ_CODEL_UNSPEC,
 	TCA_FQ_CODEL_TARGET,
diff --git a/net/sched/sch_fq_codel.c b/net/sched/sch_fq_codel.c
index a862d9990be7..e4f69c779b8c 100644
--- a/net/sched/sch_fq_codel.c
+++ b/net/sched/sch_fq_codel.c
@@ -382,6 +382,7 @@ static int fq_codel_change(struct Qdisc *sch, struct nlattr *opt,
 {
 	struct fq_codel_sched_data *q = qdisc_priv(sch);
 	struct nlattr *tb[TCA_FQ_CODEL_MAX + 1];
+	u32 quantum = 0;
 	int err;
 
 	if (!opt)
@@ -399,6 +400,13 @@ static int fq_codel_change(struct Qdisc *sch, struct nlattr *opt,
 		    q->flows_cnt > 65536)
 			return -EINVAL;
 	}
+	if (tb[TCA_FQ_CODEL_QUANTUM]) {
+		quantum = max(256U, nla_get_u32(tb[TCA_FQ_CODEL_QUANTUM]));
+		if (quantum > FQ_CODEL_QUANTUM_MAX) {
+			NL_SET_ERR_MSG(extack, "Invalid quantum");
+			return -EINVAL;
+		}
+	}
 	sch_tree_lock(sch);
 
 	if (tb[TCA_FQ_CODEL_TARGET]) {
@@ -425,8 +433,8 @@ static int fq_codel_change(struct Qdisc *sch, struct nlattr *opt,
 	if (tb[TCA_FQ_CODEL_ECN])
 		q->cparams.ecn = !!nla_get_u32(tb[TCA_FQ_CODEL_ECN]);
 
-	if (tb[TCA_FQ_CODEL_QUANTUM])
-		q->quantum = max(256U, nla_get_u32(tb[TCA_FQ_CODEL_QUANTUM]));
+	if (quantum)
+		q->quantum = quantum;
 
 	if (tb[TCA_FQ_CODEL_DROP_BATCH_SIZE])
 		q->drop_batch_size = max(1U, nla_get_u32(tb[TCA_FQ_CODEL_DROP_BATCH_SIZE]));

commit d6efada330af09253b0f81a0d836cee02192bd4f
Author: Benjamin Hesmans <benjamin.hesmans@tessares.net>
Date:   Fri Sep 3 15:23:35 2021 +0200

    netfilter: socket: icmp6: fix use-after-scope
    
    [ Upstream commit 730affed24bffcd1eebd5903171960f5ff9f1f22 ]
    
    Bug reported by KASAN:
    
    BUG: KASAN: use-after-scope in inet6_ehashfn (net/ipv6/inet6_hashtables.c:40)
    Call Trace:
    (...)
    inet6_ehashfn (net/ipv6/inet6_hashtables.c:40)
    (...)
    nf_sk_lookup_slow_v6 (net/ipv6/netfilter/nf_socket_ipv6.c:91
    net/ipv6/netfilter/nf_socket_ipv6.c:146)
    
    It seems that this bug has already been fixed by Eric Dumazet in the
    past in:
    commit 78296c97ca1f ("netfilter: xt_socket: fix a stack corruption bug")
    
    But a variant of the same issue has been introduced in
    commit d64d80a2cde9 ("netfilter: x_tables: don't extract flow keys on early demuxed sks in socket match")
    
    `daddr` and `saddr` potentially hold a reference to ipv6_var that is no
    longer in scope when the call to `nf_socket_get_sock_v6` is made.
    
    Fixes: d64d80a2cde9 ("netfilter: x_tables: don't extract flow keys on early demuxed sks in socket match")
    Acked-by: Matthieu Baerts <matthieu.baerts@tessares.net>
    Signed-off-by: Benjamin Hesmans <benjamin.hesmans@tessares.net>
    Reviewed-by: Florian Westphal <fw@strlen.de>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv6/netfilter/nf_socket_ipv6.c b/net/ipv6/netfilter/nf_socket_ipv6.c
index f14de4b6d639..58e839e2ce1d 100644
--- a/net/ipv6/netfilter/nf_socket_ipv6.c
+++ b/net/ipv6/netfilter/nf_socket_ipv6.c
@@ -104,7 +104,7 @@ struct sock *nf_sk_lookup_slow_v6(struct net *net, const struct sk_buff *skb,
 {
 	__be16 uninitialized_var(dport), uninitialized_var(sport);
 	const struct in6_addr *daddr = NULL, *saddr = NULL;
-	struct ipv6hdr *iph = ipv6_hdr(skb);
+	struct ipv6hdr *iph = ipv6_hdr(skb), ipv6_var;
 	struct sk_buff *data_skb = NULL;
 	int doff = 0;
 	int thoff = 0, tproto;
@@ -134,8 +134,6 @@ struct sock *nf_sk_lookup_slow_v6(struct net *net, const struct sk_buff *skb,
 			thoff + sizeof(*hp);
 
 	} else if (tproto == IPPROTO_ICMPV6) {
-		struct ipv6hdr ipv6_var;
-
 		if (extract_icmp6_fields(skb, thoff, &tproto, &saddr, &daddr,
 					 &sport, &dport, &ipv6_var))
 			return NULL;

commit e24ffdb604179a057e9be5c9a8ed68b90a28eee5
Author: Rafa? Mi?ecki <rafal@milecki.pl>
Date:   Thu Sep 2 10:30:50 2021 +0200

    net: dsa: b53: Fix calculating number of switch ports
    
    [ Upstream commit cdb067d31c0fe4cce98b9d15f1f2ef525acaa094 ]
    
    It isn't true that CPU port is always the last one. Switches BCM5301x
    have 9 ports (port 6 being inactive) and they use port 5 as CPU by
    default (depending on design some other may be CPU ports too).
    
    A more reliable way of determining number of ports is to check for the
    last set bit in the "enabled_ports" bitfield.
    
    This fixes b53 internal state, it will allow providing accurate info to
    the DSA and is required to fix BCM5301x support.
    
    Fixes: 967dd82ffc52 ("net: dsa: b53: Add support for Broadcom RoboSwitch")
    Signed-off-by: Rafa? Mi?ecki <rafal@milecki.pl>
    Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
index 7eaeab65d39f..451121f47c89 100644
--- a/drivers/net/dsa/b53/b53_common.c
+++ b/drivers/net/dsa/b53/b53_common.c
@@ -2135,9 +2135,8 @@ static int b53_switch_init(struct b53_device *dev)
 			dev->cpu_port = 5;
 	}
 
-	/* cpu port is always last */
-	dev->num_ports = dev->cpu_port + 1;
 	dev->enabled_ports |= BIT(dev->cpu_port);
+	dev->num_ports = fls(dev->enabled_ports);
 
 	/* Include non standard CPU port built-in PHYs to be probed */
 	if (is539x(dev) || is531x5(dev)) {

commit e91ae87f7e3f4e3e9b4700c498a0b0a4ce82cf1d
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Mon Aug 16 14:05:33 2021 -0700

    ARC: export clear_user_page() for modules
    
    [ Upstream commit 6b5ff0405e4190f23780362ea324b250bc495683 ]
    
    0day bot reports a build error:
      ERROR: modpost: "clear_user_page" [drivers/media/v4l2-core/videobuf-dma-sg.ko] undefined!
    so export it in arch/arc/ to fix the build error.
    
    In most ARCHes, clear_user_page() is a macro. OTOH, in a few
    ARCHes it is a function and needs to be exported.
    PowerPC exported it in 2004. It looks like nds32 and nios2
    still need to have it exported.
    
    Fixes: 4102b53392d63 ("ARC: [mm] Aliasing VIPT dcache support 2/4")
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Reported-by: kernel test robot <lkp@intel.com>
    Cc: Guenter Roeck <linux@roeck-us.net>
    Cc: linux-snps-arc@lists.infradead.org
    Signed-off-by: Vineet Gupta <vgupta@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arc/mm/cache.c b/arch/arc/mm/cache.c
index cf9619d4efb4..c5254c5967ed 100644
--- a/arch/arc/mm/cache.c
+++ b/arch/arc/mm/cache.c
@@ -1112,7 +1112,7 @@ void clear_user_page(void *to, unsigned long u_vaddr, struct page *page)
 	clear_page(to);
 	clear_bit(PG_dc_clean, &page->flags);
 }
-
+EXPORT_SYMBOL(clear_user_page);
 
 /**********************************************************************
  * Explicit Cache flush request from user space via syscall

commit 4a3dd774453aae49c8987decb0ab86f8eb349cc4
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Sat Aug 21 09:58:45 2021 +0200

    mtd: rawnand: cafe: Fix a resource leak in the error handling path of 'cafe_nand_probe()'
    
    [ Upstream commit 6b430c7595e4eb95fae8fb54adc3c3ce002e75ae ]
    
    A successful 'init_rs_non_canonical()' call should be balanced by a
    corresponding 'free_rs()' call in the error handling path of the probe, as
    already done in the remove function.
    
    Update the error handling path accordingly.
    
    Fixes: 8c61b7a7f4d4 ("[MTD] [NAND] Use rslib for CAF? ECC")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/fd313d3fb787458bcc73189e349f481133a2cdc9.1629532640.git.christophe.jaillet@wanadoo.fr
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c
index 3304594177c6..1fee298d5680 100644
--- a/drivers/mtd/nand/raw/cafe_nand.c
+++ b/drivers/mtd/nand/raw/cafe_nand.c
@@ -758,7 +758,7 @@ static int cafe_nand_probe(struct pci_dev *pdev,
 			  "CAFE NAND", mtd);
 	if (err) {
 		dev_warn(&pdev->dev, "Could not register IRQ %d\n", pdev->irq);
-		goto out_ior;
+		goto out_free_rs;
 	}
 
 	/* Disable master reset, enable NAND clock */
@@ -802,6 +802,8 @@ static int cafe_nand_probe(struct pci_dev *pdev,
 	/* Disable NAND IRQ in global IRQ mask register */
 	cafe_writel(cafe, ~1 & cafe_readl(cafe, GLOBAL_IRQ_MASK), GLOBAL_IRQ_MASK);
 	free_irq(pdev->irq, mtd);
+ out_free_rs:
+	free_rs(cafe->rs);
  out_ior:
 	pci_iounmap(pdev, cafe->mmio);
  out_free_mtd:

commit 6bdadfff347e42b6da70a9c77bb443479781c1f3
Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date:   Fri Aug 13 18:36:19 2021 +0300

    PCI: Sync __pci_register_driver() stub for CONFIG_PCI=n
    
    [ Upstream commit 817f9916a6e96ae43acdd4e75459ef4f92d96eb1 ]
    
    The CONFIG_PCI=y case got a new parameter long time ago.  Sync the stub as
    well.
    
    [bhelgaas: add parameter names]
    Fixes: 725522b5453d ("PCI: add the sysfs driver name to all modules")
    Link: https://lore.kernel.org/r/20210813153619.89574-1-andriy.shevchenko@linux.intel.com
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/pci.h b/include/linux/pci.h
index 2fda9893962d..6f9ca2f278b3 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1644,8 +1644,9 @@ static inline int pci_enable_device(struct pci_dev *dev) { return -EIO; }
 static inline void pci_disable_device(struct pci_dev *dev) { }
 static inline int pci_assign_resource(struct pci_dev *dev, int i)
 { return -EBUSY; }
-static inline int __pci_register_driver(struct pci_driver *drv,
-					struct module *owner)
+static inline int __must_check __pci_register_driver(struct pci_driver *drv,
+						     struct module *owner,
+						     const char *mod_name)
 { return 0; }
 static inline int pci_register_driver(struct pci_driver *drv)
 { return 0; }

commit b6e5cd323d1d1537f450ab0d3e06811a868267c2
Author: Oliver Upton <oupton@google.com>
Date:   Wed Aug 18 20:21:31 2021 +0000

    KVM: arm64: Handle PSCI resets before userspace touches vCPU state
    
    [ Upstream commit 6826c6849b46aaa91300201213701eb861af4ba0 ]
    
    The CPU_ON PSCI call takes a payload that KVM uses to configure a
    destination vCPU to run. This payload is non-architectural state and not
    exposed through any existing UAPI. Effectively, we have a race between
    CPU_ON and userspace saving/restoring a guest: if the target vCPU isn't
    ran again before the VMM saves its state, the requested PC and context
    ID are lost. When restored, the target vCPU will be runnable and start
    executing at its old PC.
    
    We can avoid this race by making sure the reset payload is serviced
    before userspace can access a vCPU's state.
    
    Fixes: 358b28f09f0a ("arm/arm64: KVM: Allow a VCPU to fully reset itself")
    Signed-off-by: Oliver Upton <oupton@google.com>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20210818202133.1106786-3-oupton@google.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c
index 39706799ecdf..b943ec5345cb 100644
--- a/virt/kvm/arm/arm.c
+++ b/virt/kvm/arm/arm.c
@@ -1137,6 +1137,14 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
 		if (copy_from_user(&reg, argp, sizeof(reg)))
 			break;
 
+		/*
+		 * We could owe a reset due to PSCI. Handle the pending reset
+		 * here to ensure userspace register accesses are ordered after
+		 * the reset.
+		 */
+		if (kvm_check_request(KVM_REQ_VCPU_RESET, vcpu))
+			kvm_reset_vcpu(vcpu);
+
 		if (ioctl == KVM_SET_ONE_REG)
 			r = kvm_arm_set_reg(vcpu, &reg);
 		else

commit 1a091bfd11e61032b6192cf2a1ebb259889f28b3
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Thu Aug 12 10:00:04 2021 +0300

    PCI: Fix pci_dev_str_match_path() alloc while atomic bug
    
    [ Upstream commit 7eb6ea4148579b85540a41d57bcec315b8af8ff8 ]
    
    pci_dev_str_match_path() is often called with a spinlock held so the
    allocation has to be atomic.  The call tree is:
    
      pci_specified_resource_alignment() <-- takes spin_lock();
        pci_dev_str_match()
          pci_dev_str_match_path()
    
    Fixes: 45db33709ccc ("PCI: Allow specifying devices using a base bus and path of devfns")
    Link: https://lore.kernel.org/r/20210812070004.GC31863@kili
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 077cc0512dd2..97d69b9be1d4 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -224,7 +224,7 @@ static int pci_dev_str_match_path(struct pci_dev *dev, const char *path,
 
 	*endptr = strchrnul(path, ';');
 
-	wpath = kmemdup_nul(path, *endptr - path, GFP_KERNEL);
+	wpath = kmemdup_nul(path, *endptr - path, GFP_ATOMIC);
 	if (!wpath)
 		return -ENOMEM;
 

commit 91264ae7fceb7e30172ab7dd27e3e41751cb83b3
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Tue Jun 29 19:12:39 2021 +0200

    mfd: axp20x: Update AXP288 volatile ranges
    
    [ Upstream commit f949a9ebce7a18005266b859a17f10c891bb13d7 ]
    
    On Cherry Trail devices with an AXP288 PMIC the external SD-card slot
    used the AXP's DLDO2 as card-voltage and either DLDO3 or GPIO1LDO
    (GPIO1 pin in low noise LDO mode) as signal-voltage.
    
    These regulators are turned on/off and in case of the signal-voltage
    also have their output-voltage changed by the _PS0 and _PS3 power-
    management ACPI methods on the MMC-controllers ACPI fwnode as well as
    by the _DSM ACPI method for changing the signal voltage.
    
    The AML code implementing these methods is directly accessing the
    PMIC through ACPI I2C OpRegion accesses, instead of using the special
    PMIC OpRegion handled by drivers/acpi/pmic/intel_pmic_xpower.c .
    
    This means that the contents of the involved PMIC registers can change
    without the change being made through the regmap interface, so regmap
    should not cache the contents of these registers.
    
    Mark the regulator power on/off, the regulator voltage control and the
    GPIO1 control registers as volatile, to avoid regmap caching them.
    
    Specifically this fixes an issue on some models where the i915 driver
    toggles another LDO using the same on/off register on/off through
    MIPI sequences (through intel_soc_pmic_exec_mipi_pmic_seq_element())
    which then writes back a cached on/off register-value where the
    card-voltage is off causing the external sdcard slot to stop working
    when the screen goes blank, or comes back on again.
    
    The regulator register-range now marked volatile also includes the
    buck regulator control registers. This is done on purpose these are
    normally not touched by the AML code, but they are updated directly
    by the SoC's PUNIT which means that they may also change without going
    through regmap.
    
    Note the AXP288 PMIC is only used on Bay- and Cherry-Trail platforms,
    so even though this is an ACPI specific problem there is no need to
    make the new volatile ranges conditional since these platforms always
    use ACPI.
    
    Fixes: dc91c3b6fe66 ("mfd: axp20x: Mark AXP20X_VBUS_IPSOUT_MGMT as volatile")
    Fixes: cd53216625a0 ("mfd: axp20x: Fix axp288 volatile ranges")
    Reported-and-tested-by: Clamshell <clamfly@163.com>
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Reviewed-by: Chen-Yu Tsai <wens@csie.org>
    Signed-off-by: Lee Jones <lee.jones@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
index aa65931142ba..dcb341d62758 100644
--- a/drivers/mfd/axp20x.c
+++ b/drivers/mfd/axp20x.c
@@ -127,12 +127,13 @@ static const struct regmap_range axp288_writeable_ranges[] = {
 
 static const struct regmap_range axp288_volatile_ranges[] = {
 	regmap_reg_range(AXP20X_PWR_INPUT_STATUS, AXP288_POWER_REASON),
+	regmap_reg_range(AXP22X_PWR_OUT_CTRL1, AXP22X_ALDO3_V_OUT),
 	regmap_reg_range(AXP288_BC_GLOBAL, AXP288_BC_GLOBAL),
 	regmap_reg_range(AXP288_BC_DET_STAT, AXP20X_VBUS_IPSOUT_MGMT),
 	regmap_reg_range(AXP20X_CHRG_BAK_CTRL, AXP20X_CHRG_BAK_CTRL),
 	regmap_reg_range(AXP20X_IRQ1_EN, AXP20X_IPSOUT_V_HIGH_L),
 	regmap_reg_range(AXP20X_TIMER_CTRL, AXP20X_TIMER_CTRL),
-	regmap_reg_range(AXP22X_GPIO_STATE, AXP22X_GPIO_STATE),
+	regmap_reg_range(AXP20X_GPIO1_CTRL, AXP22X_GPIO_STATE),
 	regmap_reg_range(AXP288_RT_BATT_V_H, AXP288_RT_BATT_V_L),
 	regmap_reg_range(AXP20X_FG_RES, AXP288_FG_CC_CAP_REG),
 };

commit a3e968b65cd5bc1578438a5436339640f1b79342
Author: Yang Li <yang.lee@linux.alibaba.com>
Date:   Mon Jun 7 16:40:36 2021 +0800

    NTB: perf: Fix an error code in perf_setup_inbuf()
    
    [ Upstream commit 0097ae5f7af5684f961a5f803ff7ad3e6f933668 ]
    
    When the function IS_ALIGNED() returns false, the value of ret is 0.
    So, we set ret to -EINVAL to indicate this error.
    
    Clean up smatch warning:
    drivers/ntb/test/ntb_perf.c:602 perf_setup_inbuf() warn: missing error
    code 'ret'.
    
    Reported-by: Abaci Robot <abaci@linux.alibaba.com>
    Signed-off-by: Yang Li <yang.lee@linux.alibaba.com>
    Reviewed-by: Serge Semin <fancer.lancer@gmail.com>
    Signed-off-by: Jon Mason <jdmason@kudzu.us>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/ntb/test/ntb_perf.c b/drivers/ntb/test/ntb_perf.c
index ad5d3919435c..87a41d0ededc 100644
--- a/drivers/ntb/test/ntb_perf.c
+++ b/drivers/ntb/test/ntb_perf.c
@@ -600,6 +600,7 @@ static int perf_setup_inbuf(struct perf_peer *peer)
 		return -ENOMEM;
 	}
 	if (!IS_ALIGNED(peer->inbuf_xlat, xlat_align)) {
+		ret = -EINVAL;
 		dev_err(&perf->ntb->dev, "Unaligned inbuf allocated\n");
 		goto err_free_inbuf;
 	}

commit 86e6540a230281cc913e9e2a39953360b9924859
Author: Yang Li <yang.lee@linux.alibaba.com>
Date:   Fri Sep 3 14:42:33 2021 +0800

    ethtool: Fix an error code in cxgb2.c
    
    [ Upstream commit 7db8263a12155c7ae4ad97e850f1e499c73765fc ]
    
    When adapter->registered_device_map is NULL, the value of err is
    uncertain, we set err to -EINVAL to avoid ambiguity.
    
    Clean up smatch warning:
    drivers/net/ethernet/chelsio/cxgb/cxgb2.c:1114 init_one() warn: missing
    error code 'err'
    
    Reported-by: Abaci Robot <abaci@linux.alibaba.com>
    Signed-off-by: Yang Li <yang.lee@linux.alibaba.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/chelsio/cxgb/cxgb2.c b/drivers/net/ethernet/chelsio/cxgb/cxgb2.c
index 0ccdde366ae1..540d99f59226 100644
--- a/drivers/net/ethernet/chelsio/cxgb/cxgb2.c
+++ b/drivers/net/ethernet/chelsio/cxgb/cxgb2.c
@@ -1153,6 +1153,7 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 	if (!adapter->registered_device_map) {
 		pr_err("%s: could not register any net devices\n",
 		       pci_name(pdev));
+		err = -EINVAL;
 		goto out_release_adapter_res;
 	}
 

commit 2c1b1848357dc69f62ce3630b850e6680b87854b
Author: Paolo Valente <paolo.valente@linaro.org>
Date:   Mon Aug 2 16:13:52 2021 +0200

    block, bfq: honor already-setup queue merges
    
    [ Upstream commit 2d52c58b9c9bdae0ca3df6a1eab5745ab3f7d80b ]
    
    The function bfq_setup_merge prepares the merging between two
    bfq_queues, say bfqq and new_bfqq. To this goal, it assigns
    bfqq->new_bfqq = new_bfqq. Then, each time some I/O for bfqq arrives,
    the process that generated that I/O is disassociated from bfqq and
    associated with new_bfqq (merging is actually a redirection). In this
    respect, bfq_setup_merge increases new_bfqq->ref in advance, adding
    the number of processes that are expected to be associated with
    new_bfqq.
    
    Unfortunately, the stable-merging mechanism interferes with this
    setup. After bfqq->new_bfqq has been set by bfq_setup_merge, and
    before all the expected processes have been associated with
    bfqq->new_bfqq, bfqq may happen to be stably merged with a different
    queue than the current bfqq->new_bfqq. In this case, bfqq->new_bfqq
    gets changed. So, some of the processes that have been already
    accounted for in the ref counter of the previous new_bfqq will not be
    associated with that queue.  This creates an unbalance, because those
    references will never be decremented.
    
    This commit fixes this issue by reestablishing the previous, natural
    behaviour: once bfqq->new_bfqq has been set, it will not be changed
    until all expected redirections have occurred.
    
    Signed-off-by: Davide Zini <davidezini2@gmail.com>
    Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
    Link: https://lore.kernel.org/r/20210802141352.74353-2-paolo.valente@linaro.org
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
index b2bad345c523..c8c94e8e0f72 100644
--- a/block/bfq-iosched.c
+++ b/block/bfq-iosched.c
@@ -2137,6 +2137,15 @@ bfq_setup_merge(struct bfq_queue *bfqq, struct bfq_queue *new_bfqq)
 	 * are likely to increase the throughput.
 	 */
 	bfqq->new_bfqq = new_bfqq;
+	/*
+	 * The above assignment schedules the following redirections:
+	 * each time some I/O for bfqq arrives, the process that
+	 * generated that I/O is disassociated from bfqq and
+	 * associated with new_bfqq. Here we increases new_bfqq->ref
+	 * in advance, adding the number of processes that are
+	 * expected to be associated with new_bfqq as they happen to
+	 * issue I/O.
+	 */
 	new_bfqq->ref += process_refs;
 	return new_bfqq;
 }
@@ -2196,6 +2205,10 @@ bfq_setup_cooperator(struct bfq_data *bfqd, struct bfq_queue *bfqq,
 {
 	struct bfq_queue *in_service_bfqq, *new_bfqq;
 
+	/* if a merge has already been setup, then proceed with that first */
+	if (bfqq->new_bfqq)
+		return bfqq->new_bfqq;
+
 	/*
 	 * Prevent bfqq from being merged if it has been created too
 	 * long ago. The idea is that true cooperating processes, and
@@ -2210,9 +2223,6 @@ bfq_setup_cooperator(struct bfq_data *bfqd, struct bfq_queue *bfqq,
 	if (bfq_too_late_for_merging(bfqq))
 		return NULL;
 
-	if (bfqq->new_bfqq)
-		return bfqq->new_bfqq;
-
 	if (!io_struct || unlikely(bfqq == &bfqd->oom_bfqq))
 		return NULL;
 

commit 052447e9d4aaf6cba23e96b26b3dec79cf63a1bd
Author: Daniele Palmas <dnlplm@gmail.com>
Date:   Thu Sep 2 12:51:22 2021 +0200

    net: usb: cdc_mbim: avoid altsetting toggling for Telit LN920
    
    [ Upstream commit aabbdc67f3485b5db27ab4eba01e5fbf1ffea62c ]
    
    Add quirk CDC_MBIM_FLAG_AVOID_ALTSETTING_TOGGLE for Telit LN920
    0x1061 composition in order to avoid bind error.
    
    Signed-off-by: Daniele Palmas <dnlplm@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/usb/cdc_mbim.c b/drivers/net/usb/cdc_mbim.c
index 0362acd5cdca..cdd1b193fd4f 100644
--- a/drivers/net/usb/cdc_mbim.c
+++ b/drivers/net/usb/cdc_mbim.c
@@ -655,6 +655,11 @@ static const struct usb_device_id mbim_devs[] = {
 	  .driver_info = (unsigned long)&cdc_mbim_info_avoid_altsetting_toggle,
 	},
 
+	/* Telit LN920 */
+	{ USB_DEVICE_AND_INTERFACE_INFO(0x1bc7, 0x1061, USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE),
+	  .driver_info = (unsigned long)&cdc_mbim_info_avoid_altsetting_toggle,
+	},
+
 	/* default entry */
 	{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE),
 	  .driver_info = (unsigned long)&cdc_mbim_info_zlp,

commit 9859de9fd373ef3beaf7d845e963920cf99293a6
Author: George Cherian <george.cherian@marvell.com>
Date:   Tue Aug 10 17:54:25 2021 +0530

    PCI: Add ACS quirks for Cavium multi-function devices
    
    [ Upstream commit 32837d8a8f63eb95dcb9cd005524a27f06478832 ]
    
    Some Cavium endpoints are implemented as multi-function devices without ACS
    capability, but they actually don't support peer-to-peer transactions.
    
    Add ACS quirks to declare DMA isolation for the following devices:
    
      - BGX device found on Octeon-TX (8xxx)
      - CGX device found on Octeon-TX2 (9xxx)
      - RPM device found on Octeon-TX3 (10xxx)
    
    Link: https://lore.kernel.org/r/20210810122425.1115156-1-george.cherian@marvell.com
    Signed-off-by: George Cherian <george.cherian@marvell.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 48c1fbb17e40..4eb8900b9a5c 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -4778,6 +4778,10 @@ static const struct pci_dev_acs_enabled {
 	{ 0x10df, 0x720, pci_quirk_mf_endpoint_acs }, /* Emulex Skyhawk-R */
 	/* Cavium ThunderX */
 	{ PCI_VENDOR_ID_CAVIUM, PCI_ANY_ID, pci_quirk_cavium_acs },
+	/* Cavium multi-function devices */
+	{ PCI_VENDOR_ID_CAVIUM, 0xA026, pci_quirk_mf_endpoint_acs },
+	{ PCI_VENDOR_ID_CAVIUM, 0xA059, pci_quirk_mf_endpoint_acs },
+	{ PCI_VENDOR_ID_CAVIUM, 0xA060, pci_quirk_mf_endpoint_acs },
 	/* APM X-Gene */
 	{ PCI_VENDOR_ID_AMCC, 0xE004, pci_quirk_xgene_acs },
 	/* Ampere Computing */

commit d3dc49079ef7d2bfea436d1124ed92802214f1c2
Author: Marc Zyngier <maz@kernel.org>
Date:   Sun Jul 25 19:07:54 2021 +0100

    mfd: Don't use irq_create_mapping() to resolve a mapping
    
    [ Upstream commit 9ff80e2de36d0554e3a6da18a171719fe8663c17 ]
    
    Although irq_create_mapping() is able to deal with duplicate
    mappings, it really isn't supposed to be a substitute for
    irq_find_mapping(), and can result in allocations that take place
    in atomic context if the mapping didn't exist.
    
    Fix the handful of MFD drivers that use irq_create_mapping() in
    interrupt context by using irq_find_mapping() instead.
    
    Cc: Linus Walleij <linus.walleij@linaro.org>
    Cc: Lee Jones <lee.jones@linaro.org>
    Cc: Maxime Coquelin <mcoquelin.stm32@gmail.com>
    Cc: Alexandre Torgue <alexandre.torgue@foss.st.com>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Signed-off-by: Lee Jones <lee.jones@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mfd/ab8500-core.c b/drivers/mfd/ab8500-core.c
index 11ab17f64c64..f0527e769867 100644
--- a/drivers/mfd/ab8500-core.c
+++ b/drivers/mfd/ab8500-core.c
@@ -493,7 +493,7 @@ static int ab8500_handle_hierarchical_line(struct ab8500 *ab8500,
 		if (line == AB8540_INT_GPIO43F || line == AB8540_INT_GPIO44F)
 			line += 1;
 
-		handle_nested_irq(irq_create_mapping(ab8500->domain, line));
+		handle_nested_irq(irq_find_mapping(ab8500->domain, line));
 	}
 
 	return 0;
diff --git a/drivers/mfd/stmpe.c b/drivers/mfd/stmpe.c
index 566caca4efd8..722ad2c368a5 100644
--- a/drivers/mfd/stmpe.c
+++ b/drivers/mfd/stmpe.c
@@ -1035,7 +1035,7 @@ static irqreturn_t stmpe_irq(int irq, void *data)
 
 	if (variant->id_val == STMPE801_ID ||
 	    variant->id_val == STMPE1600_ID) {
-		int base = irq_create_mapping(stmpe->domain, 0);
+		int base = irq_find_mapping(stmpe->domain, 0);
 
 		handle_nested_irq(base);
 		return IRQ_HANDLED;
@@ -1063,7 +1063,7 @@ static irqreturn_t stmpe_irq(int irq, void *data)
 		while (status) {
 			int bit = __ffs(status);
 			int line = bank * 8 + bit;
-			int nestedirq = irq_create_mapping(stmpe->domain, line);
+			int nestedirq = irq_find_mapping(stmpe->domain, line);
 
 			handle_nested_irq(nestedirq);
 			status &= ~(1 << bit);
diff --git a/drivers/mfd/tc3589x.c b/drivers/mfd/tc3589x.c
index cc9e563f23aa..7062baf60685 100644
--- a/drivers/mfd/tc3589x.c
+++ b/drivers/mfd/tc3589x.c
@@ -187,7 +187,7 @@ static irqreturn_t tc3589x_irq(int irq, void *data)
 
 	while (status) {
 		int bit = __ffs(status);
-		int virq = irq_create_mapping(tc3589x->domain, bit);
+		int virq = irq_find_mapping(tc3589x->domain, bit);
 
 		handle_nested_irq(virq);
 		status &= ~(1 << bit);
diff --git a/drivers/mfd/wm8994-irq.c b/drivers/mfd/wm8994-irq.c
index 18710f3b5c53..2c58d9b99a39 100644
--- a/drivers/mfd/wm8994-irq.c
+++ b/drivers/mfd/wm8994-irq.c
@@ -159,7 +159,7 @@ static irqreturn_t wm8994_edge_irq(int irq, void *data)
 	struct wm8994 *wm8994 = data;
 
 	while (gpio_get_value_cansleep(wm8994->pdata.irq_gpio))
-		handle_nested_irq(irq_create_mapping(wm8994->edge_irq, 0));
+		handle_nested_irq(irq_find_mapping(wm8994->edge_irq, 0));
 
 	return IRQ_HANDLED;
 }

commit 05e4fdd51a934d4bf51b368e5c00dd35f744637e
Author: Miquel Raynal <miquel.raynal@bootlin.com>
Date:   Thu Jun 10 16:39:45 2021 +0200

    dt-bindings: mtd: gpmc: Fix the ECC bytes vs. OOB bytes equation
    
    [ Upstream commit 778cb8e39f6ec252be50fc3850d66f3dcbd5dd5a ]
    
    "PAGESIZE / 512" is the number of ECC chunks.
    "ECC_BYTES" is the number of bytes needed to store a single ECC code.
    "2" is the space reserved by the bad block marker.
    
    "2 + (PAGESIZE / 512) * ECC_BYTES" should of course be lower or equal
    than the total number of OOB bytes, otherwise it won't fit.
    
    Fix the equation by substituting s/>=/<=/.
    
    Suggested-by: Ryan J. Barnett <ryan.barnett@collins.com>
    Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
    Acked-by: Rob Herring <robh@kernel.org>
    Link: https://lore.kernel.org/linux-mtd/20210610143945.3504781-1-miquel.raynal@bootlin.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/Documentation/devicetree/bindings/mtd/gpmc-nand.txt b/Documentation/devicetree/bindings/mtd/gpmc-nand.txt
index c059ab74ed88..a4a75fa79524 100644
--- a/Documentation/devicetree/bindings/mtd/gpmc-nand.txt
+++ b/Documentation/devicetree/bindings/mtd/gpmc-nand.txt
@@ -122,7 +122,7 @@ on various other factors also like;
 	so the device should have enough free bytes available its OOB/Spare
 	area to accommodate ECC for entire page. In general following expression
 	helps in determining if given device can accommodate ECC syndrome:
-	"2 + (PAGESIZE / 512) * ECC_BYTES" >= OOBSIZE"
+	"2 + (PAGESIZE / 512) * ECC_BYTES" <= OOBSIZE"
 	where
 		OOBSIZE		number of bytes in OOB/spare area
 		PAGESIZE	number of bytes in main-area of device page

commit 3d95bdee23e92568710530f1eca161ccd63db39f
Author: Halil Pasic <pasic@linux.ibm.com>
Date:   Fri Aug 27 14:54:29 2021 +0200

    KVM: s390: index kvm->arch.idle_mask by vcpu_idx
    
    commit a3e03bc1368c1bc16e19b001fc96dc7430573cc8 upstream.
    
    While in practice vcpu->vcpu_idx ==  vcpu->vcp_id is often true, it may
    not always be, and we must not rely on this. Reason is that KVM decides
    the vcpu_idx, userspace decides the vcpu_id, thus the two might not
    match.
    
    Currently kvm->arch.idle_mask is indexed by vcpu_id, which implies
    that code like
    for_each_set_bit(vcpu_id, kvm->arch.idle_mask, online_vcpus) {
                    vcpu = kvm_get_vcpu(kvm, vcpu_id);
                    do_stuff(vcpu);
    }
    is not legit. Reason is that kvm_get_vcpu expects an vcpu_idx, not an
    vcpu_id.  The trouble is, we do actually use kvm->arch.idle_mask like
    this. To fix this problem we have two options. Either use
    kvm_get_vcpu_by_id(vcpu_id), which would loop to find the right vcpu_id,
    or switch to indexing via vcpu_idx. The latter is preferable for obvious
    reasons.
    
    Let us make switch from indexing kvm->arch.idle_mask by vcpu_id to
    indexing it by vcpu_idx.  To keep gisa_int.kicked_mask indexed by the
    same index as idle_mask lets make the same change for it as well.
    
    Fixes: 1ee0bc559dc3 ("KVM: s390: get rid of local_int array")
    Signed-off-by: Halil Pasic <pasic@linux.ibm.com>
    Reviewed-by: Christian Bornträger <borntraeger@de.ibm.com>
    Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
    Cc: <stable@vger.kernel.org> # 3.15+
    Link: https://lore.kernel.org/r/20210827125429.1912577-1-pasic@linux.ibm.com
    [borntraeger@de.ibm.com]: change  idle mask, remove kicked_mask
    Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c
index 3515f2b55eb9..dc5ecaea30d7 100644
--- a/arch/s390/kvm/interrupt.c
+++ b/arch/s390/kvm/interrupt.c
@@ -318,13 +318,13 @@ static unsigned long deliverable_irqs(struct kvm_vcpu *vcpu)
 static void __set_cpu_idle(struct kvm_vcpu *vcpu)
 {
 	kvm_s390_set_cpuflags(vcpu, CPUSTAT_WAIT);
-	set_bit(vcpu->vcpu_id, vcpu->kvm->arch.float_int.idle_mask);
+	set_bit(kvm_vcpu_get_idx(vcpu), vcpu->kvm->arch.float_int.idle_mask);
 }
 
 static void __unset_cpu_idle(struct kvm_vcpu *vcpu)
 {
 	kvm_s390_clear_cpuflags(vcpu, CPUSTAT_WAIT);
-	clear_bit(vcpu->vcpu_id, vcpu->kvm->arch.float_int.idle_mask);
+	clear_bit(kvm_vcpu_get_idx(vcpu), vcpu->kvm->arch.float_int.idle_mask);
 }
 
 static void __reset_intercept_indicators(struct kvm_vcpu *vcpu)
diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h
index 981e3ba97461..0a2ffd5378be 100644
--- a/arch/s390/kvm/kvm-s390.h
+++ b/arch/s390/kvm/kvm-s390.h
@@ -67,7 +67,7 @@ static inline int is_vcpu_stopped(struct kvm_vcpu *vcpu)
 
 static inline int is_vcpu_idle(struct kvm_vcpu *vcpu)
 {
-	return test_bit(vcpu->vcpu_id, vcpu->kvm->arch.float_int.idle_mask);
+	return test_bit(kvm_vcpu_get_idx(vcpu), vcpu->kvm->arch.float_int.idle_mask);
 }
 
 static inline int kvm_is_ucontrol(struct kvm *kvm)

commit c48402015e02901ff8b1fac5c112b02546364bb6
Author: David Hildenbrand <david@redhat.com>
Date:   Tue Sep 7 19:54:59 2021 -0700

    mm/memory_hotplug: use "unsigned long" for PFN in zone_for_pfn_range()
    
    commit 7cf209ba8a86410939a24cb1aeb279479a7e0ca6 upstream.
    
    Patch series "mm/memory_hotplug: preparatory patches for new online policy and memory"
    
    These are all cleanups and one fix previously sent as part of [1]:
    [PATCH v1 00/12] mm/memory_hotplug: "auto-movable" online policy and memory
    groups.
    
    These patches make sense even without the other series, therefore I pulled
    them out to make the other series easier to digest.
    
    [1] https://lkml.kernel.org/r/20210607195430.48228-1-david@redhat.com
    
    This patch (of 4):
    
    Checkpatch complained on a follow-up patch that we are using "unsigned"
    here, which defaults to "unsigned int" and checkpatch is correct.
    
    As we will search for a fitting zone using the wrong pfn, we might end
    up onlining memory to one of the special kernel zones, such as ZONE_DMA,
    which can end badly as the onlined memory does not satisfy properties of
    these zones.
    
    Use "unsigned long" instead, just as we do in other places when handling
    PFNs.  This can bite us once we have physical addresses in the range of
    multiple TB.
    
    Link: https://lkml.kernel.org/r/20210712124052.26491-2-david@redhat.com
    Fixes: e5e689302633 ("mm, memory_hotplug: display allowed zones in the preferred ordering")
    Signed-off-by: David Hildenbrand <david@redhat.com>
    Reviewed-by: Pankaj Gupta <pankaj.gupta@ionos.com>
    Reviewed-by: Muchun Song <songmuchun@bytedance.com>
    Reviewed-by: Oscar Salvador <osalvador@suse.de>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: Vitaly Kuznetsov <vkuznets@redhat.com>
    Cc: "Michael S. Tsirkin" <mst@redhat.com>
    Cc: Jason Wang <jasowang@redhat.com>
    Cc: Pankaj Gupta <pankaj.gupta.linux@gmail.com>
    Cc: Wei Yang <richard.weiyang@linux.alibaba.com>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: Dan Williams <dan.j.williams@intel.com>
    Cc: Anshuman Khandual <anshuman.khandual@arm.com>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Mike Rapoport <rppt@kernel.org>
    Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
    Cc: Len Brown <lenb@kernel.org>
    Cc: Pavel Tatashin <pasha.tatashin@soleen.com>
    Cc: Heiko Carstens <hca@linux.ibm.com>
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: virtualization@lists.linux-foundation.org
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.ibm.com>
    Cc: Anton Blanchard <anton@ozlabs.org>
    Cc: Ard Biesheuvel <ardb@kernel.org>
    Cc: Baoquan He <bhe@redhat.com>
    Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Christian Borntraeger <borntraeger@de.ibm.com>
    Cc: Christophe Leroy <christophe.leroy@c-s.fr>
    Cc: Dave Jiang <dave.jiang@intel.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jia He <justin.he@arm.com>
    Cc: Joe Perches <joe@perches.com>
    Cc: Kefeng Wang <wangkefeng.wang@huawei.com>
    Cc: Laurent Dufour <ldufour@linux.ibm.com>
    Cc: Michel Lespinasse <michel@lespinasse.org>
    Cc: Nathan Lynch <nathanl@linux.ibm.com>
    Cc: Nicholas Piggin <npiggin@gmail.com>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Pierre Morel <pmorel@linux.ibm.com>
    Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
    Cc: Rich Felker <dalias@libc.org>
    Cc: Scott Cheloha <cheloha@linux.ibm.com>
    Cc: Sergei Trofimovich <slyfox@gentoo.org>
    Cc: Thiago Jung Bauermann <bauerman@linux.ibm.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Vasily Gorbik <gor@linux.ibm.com>
    Cc: Vishal Verma <vishal.l.verma@intel.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: David Hildenbrand <david@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h
index d17d45c41a0b..565317876822 100644
--- a/include/linux/memory_hotplug.h
+++ b/include/linux/memory_hotplug.h
@@ -344,6 +344,6 @@ extern struct page *sparse_decode_mem_map(unsigned long coded_mem_map,
 					  unsigned long pnum);
 extern bool allow_online_pfn_range(int nid, unsigned long pfn, unsigned long nr_pages,
 		int online_type);
-extern struct zone *zone_for_pfn_range(int online_type, int nid, unsigned start_pfn,
-		unsigned long nr_pages);
+extern struct zone *zone_for_pfn_range(int online_type, int nid,
+		unsigned long start_pfn, unsigned long nr_pages);
 #endif /* __LINUX_MEMORY_HOTPLUG_H */
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index e60e28131f67..20f079c81b33 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -783,8 +783,8 @@ static inline struct zone *default_zone_for_pfn(int nid, unsigned long start_pfn
 	return movable_node_enabled ? movable_zone : kernel_zone;
 }
 
-struct zone * zone_for_pfn_range(int online_type, int nid, unsigned start_pfn,
-		unsigned long nr_pages)
+struct zone *zone_for_pfn_range(int online_type, int nid,
+		unsigned long start_pfn, unsigned long nr_pages)
 {
 	if (online_type == MMOP_ONLINE_KERNEL)
 		return default_kernel_zone_for_pfn(nid, start_pfn, nr_pages);

commit e365c0137ac1bc78bfa95bd3220a89d2f5d38e89
Author: Yufeng Mo <moyufeng@huawei.com>
Date:   Mon Sep 13 21:08:21 2021 +0800

    net: hns3: pad the short tunnel frame before sending to hardware
    
    commit d18e81183b1cb9c309266cbbce9acd3e0c528d04 upstream.
    
    The hardware cannot handle short tunnel frames below 65 bytes,
    and will cause vlan tag missing problem. So pads packet size to
    65 bytes for tunnel frames to fix this bug.
    
    Fixes: 3db084d28dc0("net: hns3: Fix for vxlan tx checksum bug")
    Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
    Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
index 19165a3548bf..4fb80ed897f2 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
@@ -29,6 +29,8 @@ static const char hns3_driver_string[] =
 static const char hns3_copyright[] = "Copyright (c) 2017 Huawei Corporation.";
 static struct hnae3_client client;
 
+#define HNS3_MIN_TUN_PKT_LEN	65U
+
 /* hns3_pci_tbl - PCI Device ID Table
  *
  * Last entry must be all 0s
@@ -792,8 +794,11 @@ static int hns3_set_l3l4_type_csum(struct sk_buff *skb, u8 ol4_proto,
 				HNS3_L4T_TCP);
 		break;
 	case IPPROTO_UDP:
-		if (hns3_tunnel_csum_bug(skb))
-			return skb_checksum_help(skb);
+		if (hns3_tunnel_csum_bug(skb)) {
+			int ret = skb_put_padto(skb, HNS3_MIN_TUN_PKT_LEN);
+
+			return ret ? ret : skb_checksum_help(skb);
+		}
 
 		hnae3_set_bit(*type_cs_vlan_tso, HNS3_TXD_L4CS_B, 1);
 		hnae3_set_field(*type_cs_vlan_tso,

commit 6323a3ec9058ae951cc968d378e5ec6eec92bc4b
Author: Sukadev Bhattiprolu <sukadev@linux.ibm.com>
Date:   Wed Sep 8 09:58:20 2021 -0700

    ibmvnic: check failover_pending in login response
    
    commit 273c29e944bda9a20a30c26cfc34c9a3f363280b upstream.
    
    If a failover occurs before a login response is received, the login
    response buffer maybe undefined. Check that there was no failover
    before accessing the login response buffer.
    
    Fixes: 032c5e82847a ("Driver for IBM System i/p VNIC protocol")
    Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.ibm.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 4008007c2e34..d97641b9928b 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -4038,6 +4038,14 @@ static int handle_login_rsp(union ibmvnic_crq *login_rsp_crq,
 		return 0;
 	}
 
+	if (adapter->failover_pending) {
+		adapter->init_done_rc = -EAGAIN;
+		netdev_dbg(netdev, "Failover pending, ignoring login response\n");
+		complete(&adapter->init_done);
+		/* login response buffer will be released on reset */
+		return 0;
+	}
+
 	netdev->mtu = adapter->req_mtu - ETH_HLEN;
 
 	netdev_dbg(adapter->netdev, "Login Response Buffer:\n");

commit 533ef9965857cbca7a16b0440f33d109d4e6d891
Author: Shai Malin <smalin@marvell.com>
Date:   Fri Sep 10 11:33:56 2021 +0300

    qed: Handle management FW error
    
    commit 20e100f52730cd0db609e559799c1712b5f27582 upstream.
    
    Handle MFW (management FW) error response in order to avoid a crash
    during recovery flows.
    
    Changes from v1:
    - Add "Fixes tag".
    
    Fixes: tag 5e7ba042fd05 ("qed: Fix reading stale configuration information")
    Signed-off-by: Ariel Elior <aelior@marvell.com>
    Signed-off-by: Shai Malin <smalin@marvell.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/qlogic/qed/qed_mcp.c b/drivers/net/ethernet/qlogic/qed/qed_mcp.c
index 0d62db3241be..d16cadca2f7e 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_mcp.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_mcp.c
@@ -2841,6 +2841,7 @@ qed_mcp_get_nvm_image_att(struct qed_hwfn *p_hwfn,
 			  struct qed_nvm_image_att *p_image_att)
 {
 	enum nvm_image_type type;
+	int rc;
 	u32 i;
 
 	/* Translate image_id into MFW definitions */
@@ -2866,7 +2867,10 @@ qed_mcp_get_nvm_image_att(struct qed_hwfn *p_hwfn,
 		return -EINVAL;
 	}
 
-	qed_mcp_nvm_info_populate(p_hwfn);
+	rc = qed_mcp_nvm_info_populate(p_hwfn);
+	if (rc)
+		return rc;
+
 	for (i = 0; i < p_hwfn->nvm_info.num_images; i++)
 		if (type == p_hwfn->nvm_info.image_att[i].image_type)
 			break;

commit dfefcc46354530c3ec1d12db0e16c740548c6229
Author: zhenggy <zhenggy@chinatelecom.cn>
Date:   Tue Sep 14 09:51:15 2021 +0800

    tcp: fix tp->undo_retrans accounting in tcp_sacktag_one()
    
    commit 4f884f3962767877d7aabbc1ec124d2c307a4257 upstream.
    
    Commit 10d3be569243 ("tcp-tso: do not split TSO packets at retransmit
    time") may directly retrans a multiple segments TSO/GSO packet without
    split, Since this commit, we can no longer assume that a retransmitted
    packet is a single segment.
    
    This patch fixes the tp->undo_retrans accounting in tcp_sacktag_one()
    that use the actual segments(pcount) of the retransmitted packet.
    
    Before that commit (10d3be569243), the assumption underlying the
    tp->undo_retrans-- seems correct.
    
    Fixes: 10d3be569243 ("tcp-tso: do not split TSO packets at retransmit time")
    Signed-off-by: zhenggy <zhenggy@chinatelecom.cn>
    Reviewed-by: Eric Dumazet <edumazet@google.com>
    Acked-by: Yuchung Cheng <ycheng@google.com>
    Acked-by: Neal Cardwell <ncardwell@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 36bff9291530..5117e0aeea1a 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -1195,7 +1195,7 @@ static u8 tcp_sacktag_one(struct sock *sk,
 	if (dup_sack && (sacked & TCPCB_RETRANS)) {
 		if (tp->undo_marker && tp->undo_retrans > 0 &&
 		    after(end_seq, tp->undo_marker))
-			tp->undo_retrans--;
+			tp->undo_retrans = max_t(int, 0, tp->undo_retrans - pcount);
 		if ((sacked & TCPCB_SACKED_ACKED) &&
 		    before(start_seq, state->reord))
 				state->reord = start_seq;

commit 948fa0bac0840b67d7ab1b748b1eb7d9d6c032b8
Author: Vladimir Oltean <vladimir.oltean@nxp.com>
Date:   Tue Sep 14 16:43:31 2021 +0300

    net: dsa: destroy the phylink instance on any error in dsa_slave_phy_setup
    
    commit 6a52e73368038f47f6618623d75061dc263b26ae upstream.
    
    DSA supports connecting to a phy-handle, and has a fallback to a non-OF
    based method of connecting to an internal PHY on the switch's own MDIO
    bus, if no phy-handle and no fixed-link nodes were present.
    
    The -ENODEV error code from the first attempt (phylink_of_phy_connect)
    is what triggers the second attempt (phylink_connect_phy).
    
    However, when the first attempt returns a different error code than
    -ENODEV, this results in an unbalance of calls to phylink_create and
    phylink_destroy by the time we exit the function. The phylink instance
    has leaked.
    
    There are many other error codes that can be returned by
    phylink_of_phy_connect. For example, phylink_validate returns -EINVAL.
    So this is a practical issue too.
    
    Fixes: aab9c4067d23 ("net: dsa: Plug in PHYLINK support")
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
    Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Link: https://lore.kernel.org/r/20210914134331.2303380-1-vladimir.oltean@nxp.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index b887d9edb9c3..f7c122357a96 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -1226,13 +1226,11 @@ static int dsa_slave_phy_setup(struct net_device *slave_dev)
 		 * use the switch internal MDIO bus instead
 		 */
 		ret = dsa_slave_phy_connect(slave_dev, dp->index);
-		if (ret) {
-			netdev_err(slave_dev,
-				   "failed to connect to port %d: %d\n",
-				   dp->index, ret);
-			phylink_destroy(dp->pl);
-			return ret;
-		}
+	}
+	if (ret) {
+		netdev_err(slave_dev, "failed to connect to PHY: %pe\n",
+			   ERR_PTR(ret));
+		phylink_destroy(dp->pl);
 	}
 
 	return ret;

commit 44ba281510190e2915506016407ba5b374a3add2
Author: Eric Dumazet <edumazet@google.com>
Date:   Wed Sep 8 17:00:29 2021 -0700

    net/af_unix: fix a data-race in unix_dgram_poll
    
    commit 04f08eb44b5011493d77b602fdec29ff0f5c6cd5 upstream.
    
    syzbot reported another data-race in af_unix [1]
    
    Lets change __skb_insert() to use WRITE_ONCE() when changing
    skb head qlen.
    
    Also, change unix_dgram_poll() to use lockless version
    of unix_recvq_full()
    
    It is verry possible we can switch all/most unix_recvq_full()
    to the lockless version, this will be done in a future kernel version.
    
    [1] HEAD commit: 8596e589b787732c8346f0482919e83cc9362db1
    
    BUG: KCSAN: data-race in skb_queue_tail / unix_dgram_poll
    
    write to 0xffff88814eeb24e0 of 4 bytes by task 25815 on cpu 0:
     __skb_insert include/linux/skbuff.h:1938 [inline]
     __skb_queue_before include/linux/skbuff.h:2043 [inline]
     __skb_queue_tail include/linux/skbuff.h:2076 [inline]
     skb_queue_tail+0x80/0xa0 net/core/skbuff.c:3264
     unix_dgram_sendmsg+0xff2/0x1600 net/unix/af_unix.c:1850
     sock_sendmsg_nosec net/socket.c:703 [inline]
     sock_sendmsg net/socket.c:723 [inline]
     ____sys_sendmsg+0x360/0x4d0 net/socket.c:2392
     ___sys_sendmsg net/socket.c:2446 [inline]
     __sys_sendmmsg+0x315/0x4b0 net/socket.c:2532
     __do_sys_sendmmsg net/socket.c:2561 [inline]
     __se_sys_sendmmsg net/socket.c:2558 [inline]
     __x64_sys_sendmmsg+0x53/0x60 net/socket.c:2558
     do_syscall_x64 arch/x86/entry/common.c:50 [inline]
     do_syscall_64+0x3d/0x90 arch/x86/entry/common.c:80
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    read to 0xffff88814eeb24e0 of 4 bytes by task 25834 on cpu 1:
     skb_queue_len include/linux/skbuff.h:1869 [inline]
     unix_recvq_full net/unix/af_unix.c:194 [inline]
     unix_dgram_poll+0x2bc/0x3e0 net/unix/af_unix.c:2777
     sock_poll+0x23e/0x260 net/socket.c:1288
     vfs_poll include/linux/poll.h:90 [inline]
     ep_item_poll fs/eventpoll.c:846 [inline]
     ep_send_events fs/eventpoll.c:1683 [inline]
     ep_poll fs/eventpoll.c:1798 [inline]
     do_epoll_wait+0x6ad/0xf00 fs/eventpoll.c:2226
     __do_sys_epoll_wait fs/eventpoll.c:2238 [inline]
     __se_sys_epoll_wait fs/eventpoll.c:2233 [inline]
     __x64_sys_epoll_wait+0xf6/0x120 fs/eventpoll.c:2233
     do_syscall_x64 arch/x86/entry/common.c:50 [inline]
     do_syscall_64+0x3d/0x90 arch/x86/entry/common.c:80
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    value changed: 0x0000001b -> 0x00000001
    
    Reported by Kernel Concurrency Sanitizer on:
    CPU: 1 PID: 25834 Comm: syz-executor.1 Tainted: G        W         5.14.0-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    
    Fixes: 86b18aaa2b5b ("skbuff: fix a data race in skb_queue_len()")
    Cc: Qian Cai <cai@lca.pw>
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 5f2e6451ece5..f97734f34746 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -1761,7 +1761,7 @@ static inline void __skb_insert(struct sk_buff *newsk,
 	WRITE_ONCE(newsk->prev, prev);
 	WRITE_ONCE(next->prev, newsk);
 	WRITE_ONCE(prev->next, newsk);
-	list->qlen++;
+	WRITE_ONCE(list->qlen, list->qlen + 1);
 }
 
 static inline void __skb_queue_splice(const struct sk_buff_head *list,
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index 98c253afa0db..c293a558b0d4 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -2739,7 +2739,7 @@ static __poll_t unix_dgram_poll(struct file *file, struct socket *sock,
 
 		other = unix_peer(sk);
 		if (other && unix_peer(other) != sk &&
-		    unix_recvq_full(other) &&
+		    unix_recvq_full_lockless(other) &&
 		    unix_dgram_peer_wake_me(sk, other))
 			writable = 0;
 

commit c09a84aea0d3902f955cc6504e1c25cddb7c48c2
Author: Baptiste Lepers <baptiste.lepers@gmail.com>
Date:   Mon Sep 6 11:53:10 2021 +1000

    events: Reuse value read using READ_ONCE instead of re-reading it
    
    commit b89a05b21f46150ac10a962aa50109250b56b03b upstream.
    
    In perf_event_addr_filters_apply, the task associated with
    the event (event->ctx->task) is read using READ_ONCE at the beginning
    of the function, checked, and then re-read from event->ctx->task,
    voiding all guarantees of the checks. Reuse the value that was read by
    READ_ONCE to ensure the consistency of the task struct throughout the
    function.
    
    Fixes: 375637bc52495 ("perf/core: Introduce address range filtering")
    Signed-off-by: Baptiste Lepers <baptiste.lepers@gmail.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20210906015310.12802-1-baptiste.lepers@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/events/core.c b/kernel/events/core.c
index dd740f91de47..4a8c3f5313f9 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -8914,7 +8914,7 @@ static void perf_event_addr_filters_apply(struct perf_event *event)
 		return;
 
 	if (ifh->nr_file_filters) {
-		mm = get_task_mm(event->ctx->task);
+		mm = get_task_mm(task);
 		if (!mm)
 			goto restart;
 

commit e68a11a4324dbf7e98eeda55c16501263ce2d00c
Author: Maor Gottlieb <maorg@nvidia.com>
Date:   Wed Sep 1 11:48:13 2021 +0300

    net/mlx5: Fix potential sleeping in atomic context
    
    commit ee27e330a953595903979ffdb84926843595a9fe upstream.
    
    Fixes the below flow of sleeping in atomic context by releasing
    the RCU lock before calling to free_match_list.
    
    build_match_list() <- disables preempt
    -> free_match_list()
       -> tree_put_node()
          -> down_write_ref_node() <- take write lock
    
    Fixes: 693c6883bbc4 ("net/mlx5: Add hash table for flow groups in flow table")
    Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Maor Gottlieb <maorg@nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
index 774f0a619a6d..f0aa7f0e5480 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
@@ -1558,9 +1558,9 @@ static int build_match_list(struct match_list_head *match_head,
 
 		curr_match = kmalloc(sizeof(*curr_match), GFP_ATOMIC);
 		if (!curr_match) {
+			rcu_read_unlock();
 			free_match_list(match_head);
-			err = -ENOMEM;
-			goto out;
+			return -ENOMEM;
 		}
 		if (!tree_get_node(&g->node)) {
 			kfree(curr_match);
@@ -1569,7 +1569,6 @@ static int build_match_list(struct match_list_head *match_head,
 		curr_match->g = g;
 		list_add_tail(&curr_match->list, &match_head->list);
 	}
-out:
 	rcu_read_unlock();
 	return err;
 }

commit 44428199a3ce7ba6c3c6b9c6385cbbc9131662ea
Author: Michael Petlan <mpetlan@redhat.com>
Date:   Mon Jul 19 16:53:32 2021 +0200

    perf machine: Initialize srcline string member in add_location struct
    
    commit 57f0ff059e3daa4e70a811cb1d31a49968262d20 upstream.
    
    It's later supposed to be either a correct address or NULL. Without the
    initialization, it may contain an undefined value which results in the
    following segmentation fault:
    
      # perf top --sort comm -g --ignore-callees=do_idle
    
    terminates with:
    
      #0  0x00007ffff56b7685 in __strlen_avx2 () from /lib64/libc.so.6
      #1  0x00007ffff55e3802 in strdup () from /lib64/libc.so.6
      #2  0x00005555558cb139 in hist_entry__init (callchain_size=<optimized out>, sample_self=true, template=0x7fffde7fb110, he=0x7fffd801c250) at util/hist.c:489
      #3  hist_entry__new (template=template@entry=0x7fffde7fb110, sample_self=sample_self@entry=true) at util/hist.c:564
      #4  0x00005555558cb4ba in hists__findnew_entry (hists=hists@entry=0x5555561d9e38, entry=entry@entry=0x7fffde7fb110, al=al@entry=0x7fffde7fb420,
          sample_self=sample_self@entry=true) at util/hist.c:657
      #5  0x00005555558cba1b in __hists__add_entry (hists=hists@entry=0x5555561d9e38, al=0x7fffde7fb420, sym_parent=<optimized out>, bi=bi@entry=0x0, mi=mi@entry=0x0,
          sample=sample@entry=0x7fffde7fb4b0, sample_self=true, ops=0x0, block_info=0x0) at util/hist.c:288
      #6  0x00005555558cbb70 in hists__add_entry (sample_self=true, sample=0x7fffde7fb4b0, mi=0x0, bi=0x0, sym_parent=<optimized out>, al=<optimized out>, hists=0x5555561d9e38)
          at util/hist.c:1056
      #7  iter_add_single_cumulative_entry (iter=0x7fffde7fb460, al=<optimized out>) at util/hist.c:1056
      #8  0x00005555558cc8a4 in hist_entry_iter__add (iter=iter@entry=0x7fffde7fb460, al=al@entry=0x7fffde7fb420, max_stack_depth=<optimized out>, arg=arg@entry=0x7fffffff7db0)
          at util/hist.c:1231
      #9  0x00005555557cdc9a in perf_event__process_sample (machine=<optimized out>, sample=0x7fffde7fb4b0, evsel=<optimized out>, event=<optimized out>, tool=0x7fffffff7db0)
          at builtin-top.c:842
      #10 deliver_event (qe=<optimized out>, qevent=<optimized out>) at builtin-top.c:1202
      #11 0x00005555558a9318 in do_flush (show_progress=false, oe=0x7fffffff80e0) at util/ordered-events.c:244
      #12 __ordered_events__flush (oe=oe@entry=0x7fffffff80e0, how=how@entry=OE_FLUSH__TOP, timestamp=timestamp@entry=0) at util/ordered-events.c:323
      #13 0x00005555558a9789 in __ordered_events__flush (timestamp=<optimized out>, how=<optimized out>, oe=<optimized out>) at util/ordered-events.c:339
      #14 ordered_events__flush (how=OE_FLUSH__TOP, oe=0x7fffffff80e0) at util/ordered-events.c:341
      #15 ordered_events__flush (oe=oe@entry=0x7fffffff80e0, how=how@entry=OE_FLUSH__TOP) at util/ordered-events.c:339
      #16 0x00005555557cd631 in process_thread (arg=0x7fffffff7db0) at builtin-top.c:1114
      #17 0x00007ffff7bb817a in start_thread () from /lib64/libpthread.so.0
      #18 0x00007ffff5656dc3 in clone () from /lib64/libc.so.6
    
    If you look at the frame #2, the code is:
    
    488      if (he->srcline) {
    489          he->srcline = strdup(he->srcline);
    490          if (he->srcline == NULL)
    491              goto err_rawdata;
    492      }
    
    If he->srcline is not NULL (it is not NULL if it is uninitialized rubbish),
    it gets strdupped and strdupping a rubbish random string causes the problem.
    
    Also, if you look at the commit 1fb7d06a509e, it adds the srcline property
    into the struct, but not initializing it everywhere needed.
    
    Committer notes:
    
    Now I see, when using --ignore-callees=do_idle we end up here at line
    2189 in add_callchain_ip():
    
    2181         if (al.sym != NULL) {
    2182                 if (perf_hpp_list.parent && !*parent &&
    2183                     symbol__match_regex(al.sym, &parent_regex))
    2184                         *parent = al.sym;
    2185                 else if (have_ignore_callees && root_al &&
    2186                   symbol__match_regex(al.sym, &ignore_callees_regex)) {
    2187                         /* Treat this symbol as the root,
    2188                            forgetting its callees. */
    2189                         *root_al = al;
    2190                         callchain_cursor_reset(cursor);
    2191                 }
    2192         }
    
    And the al that doesn't have the ->srcline field initialized will be
    copied to the root_al, so then, back to:
    
    1211 int hist_entry_iter__add(struct hist_entry_iter *iter, struct addr_location *al,
    1212                          int max_stack_depth, void *arg)
    1213 {
    1214         int err, err2;
    1215         struct map *alm = NULL;
    1216
    1217         if (al)
    1218                 alm = map__get(al->map);
    1219
    1220         err = sample__resolve_callchain(iter->sample, &callchain_cursor, &iter->parent,
    1221                                         iter->evsel, al, max_stack_depth);
    1222         if (err) {
    1223                 map__put(alm);
    1224                 return err;
    1225         }
    1226
    1227         err = iter->ops->prepare_entry(iter, al);
    1228         if (err)
    1229                 goto out;
    1230
    1231         err = iter->ops->add_single_entry(iter, al);
    1232         if (err)
    1233                 goto out;
    1234
    
    That al at line 1221 is what hist_entry_iter__add() (called from
    sample__resolve_callchain()) saw as 'root_al', and then:
    
            iter->ops->add_single_entry(iter, al);
    
    will go on with al->srcline with a bogus value, I'll add the above
    sequence to the cset and apply, thanks!
    
    Signed-off-by: Michael Petlan <mpetlan@redhat.com>
    CC: Milian Wolff <milian.wolff@kdab.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Fixes: 1fb7d06a509e ("perf report Use srcline from callchain for hist entries")
    Link: https //lore.kernel.org/r/20210719145332.29747-1-mpetlan@redhat.com
    Reported-by: Juri Lelli <jlelli@redhat.com>
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
index ab208400ea14..4ada233b37ed 100644
--- a/tools/perf/util/machine.c
+++ b/tools/perf/util/machine.c
@@ -1893,6 +1893,7 @@ static int add_callchain_ip(struct thread *thread,
 
 	al.filtered = 0;
 	al.sym = NULL;
+	al.srcline = NULL;
 	if (!cpumode) {
 		thread__find_cpumode_addr_location(thread, ip, &al);
 	} else {

commit df957462980e7a68ccc389ccee9c2de72e973c43
Author: Hoang Le <hoang.h.le@dektech.com.au>
Date:   Mon Sep 13 16:28:52 2021 +0700

    tipc: increase timeout in tipc_sk_enqueue()
    
    commit f4bb62e64c88c93060c051195d3bbba804e56945 upstream.
    
    In tipc_sk_enqueue() we use hardcoded 2 jiffies to extract
    socket buffer from generic queue to particular socket.
    The 2 jiffies is too short in case there are other high priority
    tasks get CPU cycles for multiple jiffies update. As result, no
    buffer could be enqueued to particular socket.
    
    To solve this, we switch to use constant timeout 20msecs.
    Then, the function will be expired between 2 jiffies (CONFIG_100HZ)
    and 20 jiffies (CONFIG_1000HZ).
    
    Fixes: c637c1035534 ("tipc: resolve race problem at unicast message reception")
    Acked-by: Jon Maloy <jmaloy@redhat.com>
    Signed-off-by: Hoang Le <hoang.h.le@dektech.com.au>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index 3ce2b81e6fc8..848ae6dcbd82 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -2223,7 +2223,7 @@ static int tipc_sk_backlog_rcv(struct sock *sk, struct sk_buff *skb)
 static void tipc_sk_enqueue(struct sk_buff_head *inputq, struct sock *sk,
 			    u32 dport, struct sk_buff_head *xmitq)
 {
-	unsigned long time_limit = jiffies + 2;
+	unsigned long time_limit = jiffies + usecs_to_jiffies(20000);
 	struct sk_buff *skb;
 	unsigned int lim;
 	atomic_t *dcnt;

commit a86e6a43f3a734ccc1416a4304e03d85db320b5d
Author: Florian Fainelli <f.fainelli@gmail.com>
Date:   Thu Sep 9 10:33:28 2021 -0700

    r6040: Restore MDIO clock frequency after MAC reset
    
    commit e3f0cc1a945fcefec0c7c9d9dfd028a51daa1846 upstream.
    
    A number of users have reported that they were not able to get the PHY
    to successfully link up, especially after commit c36757eb9dee ("net:
    phy: consider AN_RESTART status when reading link status") where we
    stopped reading just BMSR, but we also read BMCR to determine the link
    status.
    
    Andrius at NetBSD did a wonderful job at debugging the problem
    and found out that the MDIO bus clock frequency would be incorrectly set
    back to its default value which would prevent the MDIO bus controller
    from reading PHY registers properly. Back when we only read BMSR, if we
    read all 1s, we could falsely indicate a link status, though in general
    there is a cable plugged in, so this went unnoticed. After a second read
    of BMCR was added, a wrong read will lead to the inability to determine
    a link UP condition which is when it started to be visibly broken, even
    if it was long before that.
    
    The fix consists in restoring the value of the MD_CSR register that was
    set prior to the MAC reset.
    
    Link: http://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=53494
    Fixes: 90f750a81a29 ("r6040: consolidate MAC reset to its own function")
    Reported-by: Andrius V <vezhlys@gmail.com>
    Reported-by: Darek Strugacz <darek.strugacz@op.pl>
    Tested-by: Darek Strugacz <darek.strugacz@op.pl>
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/rdc/r6040.c b/drivers/net/ethernet/rdc/r6040.c
index aa11b70b9ca4..2199bd08f4d6 100644
--- a/drivers/net/ethernet/rdc/r6040.c
+++ b/drivers/net/ethernet/rdc/r6040.c
@@ -133,6 +133,8 @@
 #define PHY_ST		0x8A	/* PHY status register */
 #define MAC_SM		0xAC	/* MAC status machine */
 #define  MAC_SM_RST	0x0002	/* MAC status machine reset */
+#define MD_CSC		0xb6	/* MDC speed control register */
+#define  MD_CSC_DEFAULT	0x0030
 #define MAC_ID		0xBE	/* Identifier register */
 
 #define TX_DCNT		0x80	/* TX descriptor count */
@@ -368,8 +370,9 @@ static void r6040_reset_mac(struct r6040_private *lp)
 {
 	void __iomem *ioaddr = lp->base;
 	int limit = MAC_DEF_TIMEOUT;
-	u16 cmd;
+	u16 cmd, md_csc;
 
+	md_csc = ioread16(ioaddr + MD_CSC);
 	iowrite16(MAC_RST, ioaddr + MCR1);
 	while (limit--) {
 		cmd = ioread16(ioaddr + MCR1);
@@ -381,6 +384,10 @@ static void r6040_reset_mac(struct r6040_private *lp)
 	iowrite16(MAC_SM_RST, ioaddr + MAC_SM);
 	iowrite16(0, ioaddr + MAC_SM);
 	mdelay(5);
+
+	/* Restore MDIO clock frequency */
+	if (md_csc != MD_CSC_DEFAULT)
+		iowrite16(md_csc, ioaddr + MD_CSC);
 }
 
 static void r6040_init_mac_regs(struct net_device *dev)

commit ef05e810c1cb0cdcacfcc134e5878a0c15d90808
Author: Xiyu Yang <xiyuyang19@fudan.edu.cn>
Date:   Thu Sep 9 12:32:00 2021 +0800

    net/l2tp: Fix reference count leak in l2tp_udp_recv_core
    
    commit 9b6ff7eb666415e1558f1ba8a742f5db6a9954de upstream.
    
    The reference count leak issue may take place in an error handling
    path. If both conditions of tunnel->version == L2TP_HDR_VER_3 and the
    return value of l2tp_v3_ensure_opt_in_linear is nonzero, the function
    would directly jump to label invalid, without decrementing the reference
    count of the l2tp_session object session increased earlier by
    l2tp_tunnel_get_session(). This may result in refcount leaks.
    
    Fix this issue by decrease the reference count before jumping to the
    label invalid.
    
    Fixes: 4522a70db7aa ("l2tp: fix reading optional fields of L2TPv3")
    Signed-off-by: Xiyu Yang <xiyuyang19@fudan.edu.cn>
    Signed-off-by: Xin Xiong <xiongx18@fudan.edu.cn>
    Signed-off-by: Xin Tan <tanxin.ctf@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c
index 9abdc0a04d99..bf2a53d455a1 100644
--- a/net/l2tp/l2tp_core.c
+++ b/net/l2tp/l2tp_core.c
@@ -889,8 +889,10 @@ static int l2tp_udp_recv_core(struct l2tp_tunnel *tunnel, struct sk_buff *skb)
 	}
 
 	if (tunnel->version == L2TP_HDR_VER_3 &&
-	    l2tp_v3_ensure_opt_in_linear(session, skb, &ptr, &optr))
+	    l2tp_v3_ensure_opt_in_linear(session, skb, &ptr, &optr)) {
+		l2tp_session_dec_refcount(session);
 		goto error;
+	}
 
 	l2tp_recv_common(session, skb, ptr, optr, hdrflags, length);
 	l2tp_session_dec_refcount(session);

commit dfec82f3e5b8bd93ab65b7417a64886ec8c42f14
Author: Lin, Zhenpeng <zplin@psu.edu>
Date:   Wed Sep 8 03:40:59 2021 +0000

    dccp: don't duplicate ccid when cloning dccp sock
    
    commit d9ea761fdd197351890418acd462c51f241014a7 upstream.
    
    Commit 2677d2067731 ("dccp: don't free ccid2_hc_tx_sock ...") fixed
    a UAF but reintroduced CVE-2017-6074.
    
    When the sock is cloned, two dccps_hc_tx_ccid will reference to the
    same ccid. So one can free the ccid object twice from two socks after
    cloning.
    
    This issue was found by "Hadar Manor" as well and assigned with
    CVE-2020-16119, which was fixed in Ubuntu's kernel. So here I port
    the patch from Ubuntu to fix it.
    
    The patch prevents cloned socks from referencing the same ccid.
    
    Fixes: 2677d2067731410 ("dccp: don't free ccid2_hc_tx_sock ...")
    Signed-off-by: Zhenpeng Lin <zplin@psu.edu>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/dccp/minisocks.c b/net/dccp/minisocks.c
index ba6fc3c1186b..e91838a7b849 100644
--- a/net/dccp/minisocks.c
+++ b/net/dccp/minisocks.c
@@ -98,6 +98,8 @@ struct sock *dccp_create_openreq_child(const struct sock *sk,
 		newdp->dccps_role	    = DCCP_ROLE_SERVER;
 		newdp->dccps_hc_rx_ackvec   = NULL;
 		newdp->dccps_service_list   = NULL;
+		newdp->dccps_hc_rx_ccid     = NULL;
+		newdp->dccps_hc_tx_ccid     = NULL;
 		newdp->dccps_service	    = dreq->dreq_service;
 		newdp->dccps_timestamp_echo = dreq->dreq_timestamp_echo;
 		newdp->dccps_timestamp_time = dreq->dreq_timestamp_time;

commit 8d0a3d07bfa9518825cb4b71999f74bf50b3d557
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Mon Sep 13 15:06:05 2021 -0700

    ptp: dp83640: don't define PAGE0
    
    commit 7366c23ff492ad260776a3ee1aaabba9fc773a8b upstream.
    
    Building dp83640.c on arch/parisc/ produces a build warning for
    PAGE0 being redefined. Since the macro is not used in the dp83640
    driver, just make it a comment for documentation purposes.
    
    In file included from ../drivers/net/phy/dp83640.c:23:
    ../drivers/net/phy/dp83640_reg.h:8: warning: "PAGE0" redefined
        8 | #define PAGE0                     0x0000
                     from ../drivers/net/phy/dp83640.c:11:
    ../arch/parisc/include/asm/page.h:187: note: this is the location of the previous definition
      187 | #define PAGE0   ((struct zeropage *)__PAGE_OFFSET)
    
    Fixes: cb646e2b02b2 ("ptp: Added a clock driver for the National Semiconductor PHYTER.")
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Reported-by: Geert Uytterhoeven <geert@linux-m68k.org>
    Cc: Richard Cochran <richard.cochran@omicron.at>
    Cc: John Stultz <john.stultz@linaro.org>
    Cc: Heiner Kallweit <hkallweit1@gmail.com>
    Cc: Russell King <linux@armlinux.org.uk>
    Reviewed-by: Andrew Lunn <andrew@lunn.ch>
    Link: https://lore.kernel.org/r/20210913220605.19682-1-rdunlap@infradead.org
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/phy/dp83640_reg.h b/drivers/net/phy/dp83640_reg.h
index 21aa24c741b9..daae7fa58fb8 100644
--- a/drivers/net/phy/dp83640_reg.h
+++ b/drivers/net/phy/dp83640_reg.h
@@ -5,7 +5,7 @@
 #ifndef HAVE_DP83640_REGISTERS
 #define HAVE_DP83640_REGISTERS
 
-#define PAGE0                     0x0000
+/* #define PAGE0                  0x0000 */
 #define PHYCR2                    0x001c /* PHY Control Register 2 */
 
 #define PAGE4                     0x0004

commit 9abcfed25029c1a99029914823389ea8f213d3df
Author: Eric Dumazet <edumazet@google.com>
Date:   Mon Sep 13 11:08:36 2021 -0700

    net-caif: avoid user-triggerable WARN_ON(1)
    
    commit 550ac9c1aaaaf51fd42e20d461f0b1cdbd55b3d2 upstream.
    
    syszbot triggers this warning, which looks something
    we can easily prevent.
    
    If we initialize priv->list_field in chnl_net_init(),
    then always use list_del_init(), we can remove robust_list_del()
    completely.
    
    WARNING: CPU: 0 PID: 3233 at net/caif/chnl_net.c:67 robust_list_del net/caif/chnl_net.c:67 [inline]
    WARNING: CPU: 0 PID: 3233 at net/caif/chnl_net.c:67 chnl_net_uninit+0xc9/0x2e0 net/caif/chnl_net.c:375
    Modules linked in:
    CPU: 0 PID: 3233 Comm: syz-executor.3 Not tainted 5.14.0-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    RIP: 0010:robust_list_del net/caif/chnl_net.c:67 [inline]
    RIP: 0010:chnl_net_uninit+0xc9/0x2e0 net/caif/chnl_net.c:375
    Code: 89 eb e8 3a a3 ba f8 48 89 d8 48 c1 e8 03 42 80 3c 28 00 0f 85 bf 01 00 00 48 81 fb 00 14 4e 8d 48 8b 2b 75 d0 e8 17 a3 ba f8 <0f> 0b 5b 5d 41 5c 41 5d e9 0a a3 ba f8 4c 89 e3 e8 02 a3 ba f8 4c
    RSP: 0018:ffffc90009067248 EFLAGS: 00010202
    RAX: 0000000000008780 RBX: ffffffff8d4e1400 RCX: ffffc9000fd34000
    RDX: 0000000000040000 RSI: ffffffff88bb6e49 RDI: 0000000000000003
    RBP: ffff88802cd9ee08 R08: 0000000000000000 R09: ffffffff8d0e6647
    R10: ffffffff88bb6dc2 R11: 0000000000000000 R12: ffff88803791ae08
    R13: dffffc0000000000 R14: 00000000e600ffce R15: ffff888073ed3480
    FS:  00007fed10fa0700(0000) GS:ffff8880b9d00000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 0000001b2c322000 CR3: 00000000164a6000 CR4: 00000000001506e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
     register_netdevice+0xadf/0x1500 net/core/dev.c:10347
     ipcaif_newlink+0x4c/0x260 net/caif/chnl_net.c:468
     __rtnl_newlink+0x106d/0x1750 net/core/rtnetlink.c:3458
     rtnl_newlink+0x64/0xa0 net/core/rtnetlink.c:3506
     rtnetlink_rcv_msg+0x413/0xb80 net/core/rtnetlink.c:5572
     netlink_rcv_skb+0x153/0x420 net/netlink/af_netlink.c:2504
     netlink_unicast_kernel net/netlink/af_netlink.c:1314 [inline]
     netlink_unicast+0x533/0x7d0 net/netlink/af_netlink.c:1340
     netlink_sendmsg+0x86d/0xdb0 net/netlink/af_netlink.c:1929
     sock_sendmsg_nosec net/socket.c:704 [inline]
     sock_sendmsg+0xcf/0x120 net/socket.c:724
     __sys_sendto+0x21c/0x320 net/socket.c:2036
     __do_sys_sendto net/socket.c:2048 [inline]
     __se_sys_sendto net/socket.c:2044 [inline]
     __x64_sys_sendto+0xdd/0x1b0 net/socket.c:2044
     do_syscall_x64 arch/x86/entry/common.c:50 [inline]
     do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Fixes: cc36a070b590 ("net-caif: add CAIF netdevice")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/caif/chnl_net.c b/net/caif/chnl_net.c
index 13e2ae6be620..8aeece7aa9e9 100644
--- a/net/caif/chnl_net.c
+++ b/net/caif/chnl_net.c
@@ -53,20 +53,6 @@ struct chnl_net {
 	enum caif_states state;
 };
 
-static void robust_list_del(struct list_head *delete_node)
-{
-	struct list_head *list_node;
-	struct list_head *n;
-	ASSERT_RTNL();
-	list_for_each_safe(list_node, n, &chnl_net_list) {
-		if (list_node == delete_node) {
-			list_del(list_node);
-			return;
-		}
-	}
-	WARN_ON(1);
-}
-
 static int chnl_recv_cb(struct cflayer *layr, struct cfpkt *pkt)
 {
 	struct sk_buff *skb;
@@ -368,6 +354,7 @@ static int chnl_net_init(struct net_device *dev)
 	ASSERT_RTNL();
 	priv = netdev_priv(dev);
 	strncpy(priv->name, dev->name, sizeof(priv->name));
+	INIT_LIST_HEAD(&priv->list_field);
 	return 0;
 }
 
@@ -376,7 +363,7 @@ static void chnl_net_uninit(struct net_device *dev)
 	struct chnl_net *priv;
 	ASSERT_RTNL();
 	priv = netdev_priv(dev);
-	robust_list_del(&priv->list_field);
+	list_del_init(&priv->list_field);
 }
 
 static const struct net_device_ops netdev_ops = {
@@ -541,7 +528,7 @@ static void __exit chnl_exit_module(void)
 	rtnl_lock();
 	list_for_each_safe(list_node, _tmp, &chnl_net_list) {
 		dev = list_entry(list_node, struct chnl_net, list_field);
-		list_del(list_node);
+		list_del_init(list_node);
 		delete_device(dev);
 	}
 	rtnl_unlock();

commit bd02719fe29c9514c7cec70040b71af13e549e11
Author: Xin Long <lucien.xin@gmail.com>
Date:   Fri Jul 23 13:25:36 2021 -0400

    tipc: fix an use-after-free issue in tipc_recvmsg
    
    commit cc19862ffe454a5b632ca202e5a51bfec9f89fd2 upstream.
    
    syzbot reported an use-after-free crash:
    
      BUG: KASAN: use-after-free in tipc_recvmsg+0xf77/0xf90 net/tipc/socket.c:1979
      Call Trace:
       tipc_recvmsg+0xf77/0xf90 net/tipc/socket.c:1979
       sock_recvmsg_nosec net/socket.c:943 [inline]
       sock_recvmsg net/socket.c:961 [inline]
       sock_recvmsg+0xca/0x110 net/socket.c:957
       tipc_conn_rcv_from_sock+0x162/0x2f0 net/tipc/topsrv.c:398
       tipc_conn_recv_work+0xeb/0x190 net/tipc/topsrv.c:421
       process_one_work+0x98d/0x1630 kernel/workqueue.c:2276
       worker_thread+0x658/0x11f0 kernel/workqueue.c:2422
    
    As Hoang pointed out, it was caused by skb_cb->bytes_read still accessed
    after calling tsk_advance_rx_queue() to free the skb in tipc_recvmsg().
    
    This patch is to fix it by accessing skb_cb->bytes_read earlier than
    calling tsk_advance_rx_queue().
    
    Fixes: f4919ff59c28 ("tipc: keep the skb in rcv queue until the whole data is read")
    Reported-by: syzbot+e6741b97d5552f97c24d@syzkaller.appspotmail.com
    Signed-off-by: Xin Long <lucien.xin@gmail.com>
    Acked-by: Jon Maloy <jmaloy@redhat.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index e9acbb290d71..3ce2b81e6fc8 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -1809,10 +1809,12 @@ static int tipc_recvmsg(struct socket *sock, struct msghdr *m,
 		tipc_node_distr_xmit(sock_net(sk), &xmitq);
 	}
 
-	if (!skb_cb->bytes_read)
-		tsk_advance_rx_queue(sk);
+	if (skb_cb->bytes_read)
+		goto exit;
+
+	tsk_advance_rx_queue(sk);
 
-	if (likely(!connected) || skb_cb->bytes_read)
+	if (likely(!connected))
 		goto exit;
 
 	/* Send connection flow control advertisement when applicable */

commit 2717db72f74c8e51068801b6327559241c54b86e
Author: Mike Rapoport <rppt@linux.ibm.com>
Date:   Thu Aug 19 16:27:17 2021 +0300

    x86/mm: Fix kern_addr_valid() to cope with existing but not present entries
    
    commit 34b1999da935a33be6239226bfa6cd4f704c5c88 upstream.
    
    Jiri Olsa reported a fault when running:
    
      # cat /proc/kallsyms | grep ksys_read
      ffffffff8136d580 T ksys_read
      # objdump -d --start-address=0xffffffff8136d580 --stop-address=0xffffffff8136d590 /proc/kcore
    
      /proc/kcore:     file format elf64-x86-64
    
      Segmentation fault
    
      general protection fault, probably for non-canonical address 0xf887ffcbff000: 0000 [#1] SMP PTI
      CPU: 12 PID: 1079 Comm: objdump Not tainted 5.14.0-rc5qemu+ #508
      Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.14.0-4.fc34 04/01/2014
      RIP: 0010:kern_addr_valid
      Call Trace:
       read_kcore
       ? rcu_read_lock_sched_held
       ? rcu_read_lock_sched_held
       ? rcu_read_lock_sched_held
       ? trace_hardirqs_on
       ? rcu_read_lock_sched_held
       ? lock_acquire
       ? lock_acquire
       ? rcu_read_lock_sched_held
       ? lock_acquire
       ? rcu_read_lock_sched_held
       ? rcu_read_lock_sched_held
       ? rcu_read_lock_sched_held
       ? lock_release
       ? _raw_spin_unlock
       ? __handle_mm_fault
       ? rcu_read_lock_sched_held
       ? lock_acquire
       ? rcu_read_lock_sched_held
       ? lock_release
       proc_reg_read
       ? vfs_read
       vfs_read
       ksys_read
       do_syscall_64
       entry_SYSCALL_64_after_hwframe
    
    The fault happens because kern_addr_valid() dereferences existent but not
    present PMD in the high kernel mappings.
    
    Such PMDs are created when free_kernel_image_pages() frees regions larger
    than 2Mb. In this case, a part of the freed memory is mapped with PMDs and
    the set_memory_np_noalias() -> ... -> __change_page_attr() sequence will
    mark the PMD as not present rather than wipe it completely.
    
    Have kern_addr_valid() check whether higher level page table entries are
    present before trying to dereference them to fix this issue and to avoid
    similar issues in the future.
    
    Stable backporting note:
    ------------------------
    
    Note that the stable marking is for all active stable branches because
    there could be cases where pagetable entries exist but are not valid -
    see 9a14aefc1d28 ("x86: cpa, fix lookup_address"), for example. So make
    sure to be on the safe side here and use pXY_present() accessors rather
    than pXY_none() which could #GP when accessing pages in the direct map.
    
    Also see:
    
      c40a56a7818c ("x86/mm/init: Remove freed kernel image areas from alias mapping")
    
    for more info.
    
    Reported-by: Jiri Olsa <jolsa@redhat.com>
    Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Reviewed-by: David Hildenbrand <david@redhat.com>
    Acked-by: Dave Hansen <dave.hansen@intel.com>
    Tested-by: Jiri Olsa <jolsa@redhat.com>
    Cc: <stable@vger.kernel.org>    # 4.4+
    Link: https://lkml.kernel.org/r/20210819132717.19358-1-rppt@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index 81e85a8dd300..4b25a1ad18ff 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -1289,18 +1289,18 @@ int kern_addr_valid(unsigned long addr)
 		return 0;
 
 	p4d = p4d_offset(pgd, addr);
-	if (p4d_none(*p4d))
+	if (!p4d_present(*p4d))
 		return 0;
 
 	pud = pud_offset(p4d, addr);
-	if (pud_none(*pud))
+	if (!pud_present(*pud))
 		return 0;
 
 	if (pud_large(*pud))
 		return pfn_valid(pud_pfn(*pud));
 
 	pmd = pmd_offset(pud, addr);
-	if (pmd_none(*pmd))
+	if (!pmd_present(*pmd))
 		return 0;
 
 	if (pmd_large(*pmd))

commit e947ff6f6071d07e4f725fbe4e9dac1bb0bd738a
Author: Evan Quan <evan.quan@amd.com>
Date:   Fri Sep 3 14:33:11 2021 +0800

    PCI: Add AMD GPU multi-function power dependencies
    
    commit 60b78ed088ebe1a872ee1320b6c5ad6ee2c4bd9a upstream.
    
    Some AMD GPUs have built-in USB xHCI and USB Type-C UCSI controllers with
    power dependencies between the GPU and the other functions as in
    6d2e369f0d4c ("PCI: Add NVIDIA GPU multi-function power dependencies").
    
    Add device link support for the AMD integrated USB xHCI and USB Type-C UCSI
    controllers.
    
    Without this, runtime power management, including GPU resume and temp and
    fan sensors don't work correctly.
    
    Reported-at: https://gitlab.freedesktop.org/drm/amd/-/issues/1704
    Link: https://lore.kernel.org/r/20210903063311.3606226-1-evan.quan@amd.com
    Signed-off-by: Evan Quan <evan.quan@amd.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 2f787d30aff9..48c1fbb17e40 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -5254,7 +5254,7 @@ DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID,
 			      PCI_CLASS_MULTIMEDIA_HD_AUDIO, 8, quirk_gpu_hda);
 
 /*
- * Create device link for NVIDIA GPU with integrated USB xHCI Host
+ * Create device link for GPUs with integrated USB xHCI Host
  * controller to VGA.
  */
 static void quirk_gpu_usb(struct pci_dev *usb)
@@ -5263,9 +5263,11 @@ static void quirk_gpu_usb(struct pci_dev *usb)
 }
 DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID,
 			      PCI_CLASS_SERIAL_USB, 8, quirk_gpu_usb);
+DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_ATI, PCI_ANY_ID,
+			      PCI_CLASS_SERIAL_USB, 8, quirk_gpu_usb);
 
 /*
- * Create device link for NVIDIA GPU with integrated Type-C UCSI controller
+ * Create device link for GPUs with integrated Type-C UCSI controller
  * to VGA. Currently there is no class code defined for UCSI device over PCI
  * so using UNKNOWN class for now and it will be updated when UCSI
  * over PCI gets a class code.
@@ -5278,6 +5280,9 @@ static void quirk_gpu_usb_typec_ucsi(struct pci_dev *ucsi)
 DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID,
 			      PCI_CLASS_SERIAL_UNKNOWN, 8,
 			      quirk_gpu_usb_typec_ucsi);
+DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_ATI, PCI_ANY_ID,
+			      PCI_CLASS_SERIAL_UNKNOWN, 8,
+			      quirk_gpu_usb_typec_ucsi);
 
 /*
  * Enable the NVIDIA GPU integrated HDA controller if the BIOS left it

commit 50990255209c11c6452649d2f00884aafbc27166
Author: Juergen Gross <jgross@suse.com>
Date:   Fri Sep 3 10:49:36 2021 +0200

    PM: base: power: don't try to use non-existing RTC for storing data
    
    commit 0560204b360a332c321124dbc5cdfd3364533a74 upstream.
    
    If there is no legacy RTC device, don't try to use it for storing trace
    data across suspend/resume.
    
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Reviewed-by: Rafael J. Wysocki <rafael@kernel.org>
    Link: https://lore.kernel.org/r/20210903084937.19392-2-jgross@suse.com
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/base/power/trace.c b/drivers/base/power/trace.c
index 1cda505d6a85..9664cce49109 100644
--- a/drivers/base/power/trace.c
+++ b/drivers/base/power/trace.c
@@ -11,6 +11,7 @@
 #include <linux/export.h>
 #include <linux/rtc.h>
 #include <linux/suspend.h>
+#include <linux/init.h>
 
 #include <linux/mc146818rtc.h>
 
@@ -165,6 +166,9 @@ void generate_pm_trace(const void *tracedata, unsigned int user)
 	const char *file = *(const char **)(tracedata + 2);
 	unsigned int user_hash_value, file_hash_value;
 
+	if (!x86_platform.legacy.rtc)
+		return;
+
 	user_hash_value = user % USERHASH;
 	file_hash_value = hash_string(lineno, file, FILEHASH);
 	set_magic_time(user_hash_value, file_hash_value, dev_hash_value);
@@ -267,6 +271,9 @@ static struct notifier_block pm_trace_nb = {
 
 static int early_resume_init(void)
 {
+	if (!x86_platform.legacy.rtc)
+		return 0;
+
 	hash_value_early_read = read_magic_time();
 	register_pm_notifier(&pm_trace_nb);
 	return 0;
@@ -277,6 +284,9 @@ static int late_resume_init(void)
 	unsigned int val = hash_value_early_read;
 	unsigned int user, file, dev;
 
+	if (!x86_platform.legacy.rtc)
+		return 0;
+
 	user = val % USERHASH;
 	val = val / USERHASH;
 	file = val % FILEHASH;

commit aadf3115f86c6df4308e2734b5c39eadbe9573e0
Author: Mark Brown <broonie@kernel.org>
Date:   Thu Sep 9 17:53:56 2021 +0100

    arm64/sve: Use correct size when reinitialising SVE state
    
    commit e35ac9d0b56e9efefaeeb84b635ea26c2839ea86 upstream.
    
    When we need a buffer for SVE register state we call sve_alloc() to make
    sure that one is there. In order to avoid repeated allocations and frees
    we keep the buffer around unless we change vector length and just memset()
    it to ensure a clean register state. The function that deals with this
    takes the task to operate on as an argument, however in the case where we
    do a memset() we initialise using the SVE state size for the current task
    rather than the task passed as an argument.
    
    This is only an issue in the case where we are setting the register state
    for a task via ptrace and the task being configured has a different vector
    length to the task tracing it. In the case where the buffer is larger in
    the traced process we will leak old state from the traced process to
    itself, in the case where the buffer is smaller in the traced process we
    will overflow the buffer and corrupt memory.
    
    Fixes: bc0ee4760364 ("arm64/sve: Core task context handling")
    Cc: <stable@vger.kernel.org> # 4.15.x
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Link: https://lore.kernel.org/r/20210909165356.10675-1-broonie@kernel.org
    Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
index 19c87b52c001..89ab68cb35bb 100644
--- a/arch/arm64/kernel/fpsimd.c
+++ b/arch/arm64/kernel/fpsimd.c
@@ -434,7 +434,7 @@ size_t sve_state_size(struct task_struct const *task)
 void sve_alloc(struct task_struct *task)
 {
 	if (task->thread.sve_state) {
-		memset(task->thread.sve_state, 0, sve_state_size(current));
+		memset(task->thread.sve_state, 0, sve_state_size(task));
 		return;
 	}
 

commit 9662002bff0e92a17837e7cead95cb119a874367
Author: Adrian Bunk <bunk@kernel.org>
Date:   Sun Sep 12 22:05:23 2021 +0300

    bnx2x: Fix enabling network interfaces without VFs
    
    commit 52ce14c134a003fee03d8fc57442c05a55b53715 upstream.
    
    This function is called to enable SR-IOV when available,
    not enabling interfaces without VFs was a regression.
    
    Fixes: 65161c35554f ("bnx2x: Fix missing error code in bnx2x_iov_init_one()")
    Signed-off-by: Adrian Bunk <bunk@kernel.org>
    Reported-by: YunQiang Su <wzssyqa@gmail.com>
    Tested-by: YunQiang Su <wzssyqa@gmail.com>
    Cc: stable@vger.kernel.org
    Acked-by: Shai Malin <smalin@marvell.com>
    Link: https://lore.kernel.org/r/20210912190523.27991-1-bunk@kernel.org
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
index 77005f6366eb..b3ff8d13c31a 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
@@ -1245,7 +1245,7 @@ int bnx2x_iov_init_one(struct bnx2x *bp, int int_mode_param,
 
 	/* SR-IOV capability was enabled but there are no VFs*/
 	if (iov->total == 0) {
-		err = -EINVAL;
+		err = 0;
 		goto failed;
 	}
 

commit 831c0778892dc6586d67bb455cc3fcf43b9d4918
Author: Juergen Gross <jgross@suse.com>
Date:   Fri Sep 3 10:49:37 2021 +0200

    xen: reset legacy rtc flag for PV domU
    
    commit f68aa100d815b5b4467fd1c3abbe3b99d65fd028 upstream.
    
    A Xen PV guest doesn't have a legacy RTC device, so reset the legacy
    RTC flag. Otherwise the following WARN splat will occur at boot:
    
    [    1.333404] WARNING: CPU: 1 PID: 1 at /home/gross/linux/head/drivers/rtc/rtc-mc146818-lib.c:25 mc146818_get_time+0x1be/0x210
    [    1.333404] Modules linked in:
    [    1.333404] CPU: 1 PID: 1 Comm: swapper/0 Tainted: G        W         5.14.0-rc7-default+ #282
    [    1.333404] RIP: e030:mc146818_get_time+0x1be/0x210
    [    1.333404] Code: c0 64 01 c5 83 fd 45 89 6b 14 7f 06 83 c5 64 89 6b 14 41 83 ec 01 b8 02 00 00 00 44 89 63 10 5b 5d 41 5c 41 5d 41 5e 41 5f c3 <0f> 0b 48 c7 c7 30 0e ef 82 4c 89 e6 e8 71 2a 24 00 48 c7 c0 ff ff
    [    1.333404] RSP: e02b:ffffc90040093df8 EFLAGS: 00010002
    [    1.333404] RAX: 00000000000000ff RBX: ffffc90040093e34 RCX: 0000000000000000
    [    1.333404] RDX: 0000000000000001 RSI: 0000000000000000 RDI: 000000000000000d
    [    1.333404] RBP: ffffffff82ef0e30 R08: ffff888005013e60 R09: 0000000000000000
    [    1.333404] R10: ffffffff82373e9b R11: 0000000000033080 R12: 0000000000000200
    [    1.333404] R13: 0000000000000000 R14: 0000000000000002 R15: ffffffff82cdc6d4
    [    1.333404] FS:  0000000000000000(0000) GS:ffff88807d440000(0000) knlGS:0000000000000000
    [    1.333404] CS:  10000e030 DS: 0000 ES: 0000 CR0: 0000000080050033
    [    1.333404] CR2: 0000000000000000 CR3: 000000000260a000 CR4: 0000000000050660
    [    1.333404] Call Trace:
    [    1.333404]  ? wakeup_sources_sysfs_init+0x30/0x30
    [    1.333404]  ? rdinit_setup+0x2b/0x2b
    [    1.333404]  early_resume_init+0x23/0xa4
    [    1.333404]  ? cn_proc_init+0x36/0x36
    [    1.333404]  do_one_initcall+0x3e/0x200
    [    1.333404]  kernel_init_freeable+0x232/0x28e
    [    1.333404]  ? rest_init+0xd0/0xd0
    [    1.333404]  kernel_init+0x16/0x120
    [    1.333404]  ret_from_fork+0x1f/0x30
    
    Cc: <stable@vger.kernel.org>
    Fixes: 8d152e7a5c7537 ("x86/rtc: Replace paravirt rtc check with platform legacy quirk")
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Link: https://lore.kernel.org/r/20210903084937.19392-3-jgross@suse.com
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c
index 1c3e9185934c..7966136352b5 100644
--- a/arch/x86/xen/enlighten_pv.c
+++ b/arch/x86/xen/enlighten_pv.c
@@ -1187,6 +1187,11 @@ static void __init xen_dom0_set_legacy_features(void)
 	x86_platform.legacy.rtc = 1;
 }
 
+static void __init xen_domu_set_legacy_features(void)
+{
+	x86_platform.legacy.rtc = 0;
+}
+
 /* First C function to be called on Xen boot */
 asmlinkage __visible void __init xen_start_kernel(void)
 {
@@ -1354,6 +1359,8 @@ asmlinkage __visible void __init xen_start_kernel(void)
 		add_preferred_console("xenboot", 0, NULL);
 		if (pci_xen)
 			x86_init.pci.arch_init = pci_xen_init;
+		x86_platform.set_legacy_features =
+				xen_domu_set_legacy_features;
 	} else {
 		const struct dom0_vga_console_info *info =
 			(void *)((char *)xen_start_info +

commit 1d8d5889c3a9b9f35614826228f5be585439685f
Author: Ye Bin <yebin10@huawei.com>
Date:   Tue Sep 1 14:25:44 2020 +0800

    dm thin metadata: Fix use-after-free in dm_bm_set_read_only
    
    commit 3a653b205f29b3f9827a01a0c88bfbcb0d169494 upstream.
    
    The following error ocurred when testing disk online/offline:
    
    [  301.798344] device-mapper: thin: 253:5: aborting current metadata transaction
    [  301.848441] device-mapper: thin: 253:5: failed to abort metadata transaction
    [  301.849206] Aborting journal on device dm-26-8.
    [  301.850489] EXT4-fs error (device dm-26) in __ext4_new_inode:943: Journal has aborted
    [  301.851095] EXT4-fs (dm-26): Delayed block allocation failed for inode 398742 at logical offset 181 with max blocks 19 with error 30
    [  301.854476] BUG: KASAN: use-after-free in dm_bm_set_read_only+0x3a/0x40 [dm_persistent_data]
    
    Reason is:
    
     metadata_operation_failed
        abort_transaction
            dm_pool_abort_metadata
                __create_persistent_data_objects
                    r = __open_or_format_metadata
                    if (r) --> If failed will free pmd->bm but pmd->bm not set NULL
                        dm_block_manager_destroy(pmd->bm);
        set_pool_mode
            dm_pool_metadata_read_only(pool->pmd);
            dm_bm_set_read_only(pmd->bm);  --> use-after-free
    
    Add checks to see if pmd->bm is NULL in dm_bm_set_read_only and
    dm_bm_set_read_write functions.  If bm is NULL it means creating the
    bm failed and so dm_bm_is_read_only must return true.
    
    Signed-off-by: Ye Bin <yebin10@huawei.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Mike Snitzer <snitzer@redhat.com>
    Signed-off-by: xiejingfeng <xiejingfeng@linux.alibaba.com>
    Signed-off-by: Jeffle Xu <jefflexu@linux.alibaba.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c
index 85077f4d257a..a6a5cee6b943 100644
--- a/drivers/md/dm-thin-metadata.c
+++ b/drivers/md/dm-thin-metadata.c
@@ -901,7 +901,7 @@ int dm_pool_metadata_close(struct dm_pool_metadata *pmd)
 		return -EBUSY;
 	}
 
-	if (!dm_bm_is_read_only(pmd->bm) && !pmd->fail_io) {
+	if (!pmd->fail_io && !dm_bm_is_read_only(pmd->bm)) {
 		r = __commit_transaction(pmd);
 		if (r < 0)
 			DMWARN("%s: __commit_transaction() failed, error = %d",
diff --git a/drivers/md/persistent-data/dm-block-manager.c b/drivers/md/persistent-data/dm-block-manager.c
index 492a3f8ac119..0401daa0f7fb 100644
--- a/drivers/md/persistent-data/dm-block-manager.c
+++ b/drivers/md/persistent-data/dm-block-manager.c
@@ -494,7 +494,7 @@ int dm_bm_write_lock(struct dm_block_manager *bm,
 	void *p;
 	int r;
 
-	if (bm->read_only)
+	if (dm_bm_is_read_only(bm))
 		return -EPERM;
 
 	p = dm_bufio_read(bm->bufio, b, (struct dm_buffer **) result);
@@ -563,7 +563,7 @@ int dm_bm_write_lock_zero(struct dm_block_manager *bm,
 	struct buffer_aux *aux;
 	void *p;
 
-	if (bm->read_only)
+	if (dm_bm_is_read_only(bm))
 		return -EPERM;
 
 	p = dm_bufio_new(bm->bufio, b, (struct dm_buffer **) result);
@@ -603,7 +603,7 @@ EXPORT_SYMBOL_GPL(dm_bm_unlock);
 
 int dm_bm_flush(struct dm_block_manager *bm)
 {
-	if (bm->read_only)
+	if (dm_bm_is_read_only(bm))
 		return -EPERM;
 
 	return dm_bufio_write_dirty_buffers(bm->bufio);
@@ -617,19 +617,21 @@ void dm_bm_prefetch(struct dm_block_manager *bm, dm_block_t b)
 
 bool dm_bm_is_read_only(struct dm_block_manager *bm)
 {
-	return bm->read_only;
+	return (bm ? bm->read_only : true);
 }
 EXPORT_SYMBOL_GPL(dm_bm_is_read_only);
 
 void dm_bm_set_read_only(struct dm_block_manager *bm)
 {
-	bm->read_only = true;
+	if (bm)
+		bm->read_only = true;
 }
 EXPORT_SYMBOL_GPL(dm_bm_set_read_only);
 
 void dm_bm_set_read_write(struct dm_block_manager *bm)
 {
-	bm->read_only = false;
+	if (bm)
+		bm->read_only = false;
 }
 EXPORT_SYMBOL_GPL(dm_bm_set_read_write);
 

commit 7442102055bbb4b5968e745671c3447a950cd79f
Author: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
Date:   Tue Jun 22 12:23:38 2021 -0400

    drm/amdgpu: Fix BUG_ON assert
    
    commit ea7acd7c5967542353430947f3faf699e70602e5 upstream.
    
    With added CPU domain to placement you can have
    now 3 placemnts at once.
    
    CC: stable@kernel.org
    Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20210622162339.761651-5-andrey.grodzovsky@amd.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index b14ce112703f..e25952d516e2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -216,7 +216,7 @@ void amdgpu_bo_placement_from_domain(struct amdgpu_bo *abo, u32 domain)
 		c++;
 	}
 
-	BUG_ON(c >= AMDGPU_BO_MAX_PLACEMENTS);
+	BUG_ON(c > AMDGPU_BO_MAX_PLACEMENTS);
 
 	placement->num_placement = c;
 	placement->placement = places;

commit 54748ae6a818d058c1299d1eeb85d4ae458e021f
Author: Patryk Duda <pdk@semihalf.com>
Date:   Tue May 18 16:07:58 2021 +0200

    platform/chrome: cros_ec_proto: Send command again when timeout occurs
    
    commit 3abc16af57c9939724df92fcbda296b25cc95168 upstream.
    
    Sometimes kernel is trying to probe Fingerprint MCU (FPMCU) when it
    hasn't initialized SPI yet. This can happen because FPMCU is restarted
    during system boot and kernel can send message in short window
    eg. between sysjump to RW and SPI initialization.
    
    Cc: <stable@vger.kernel.org> # 4.4+
    Signed-off-by: Patryk Duda <pdk@semihalf.com>
    Link: https://lore.kernel.org/r/20210518140758.29318-1-pdk@semihalf.com
    Signed-off-by: Benson Leung <bleung@chromium.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chrome/cros_ec_proto.c
index ac784ac66ac3..2b807c8aa869 100644
--- a/drivers/platform/chrome/cros_ec_proto.c
+++ b/drivers/platform/chrome/cros_ec_proto.c
@@ -219,6 +219,15 @@ static int cros_ec_host_command_proto_query(struct cros_ec_device *ec_dev,
 	msg->insize = sizeof(struct ec_response_get_protocol_info);
 
 	ret = send_command(ec_dev, msg);
+	/*
+	 * Send command once again when timeout occurred.
+	 * Fingerprint MCU (FPMCU) is restarted during system boot which
+	 * introduces small window in which FPMCU won't respond for any
+	 * messages sent by kernel. There is no need to wait before next
+	 * attempt because we waited at least EC_MSG_DEADLINE_MS.
+	 */
+	if (ret == -ETIMEDOUT)
+		ret = send_command(ec_dev, msg);
 
 	if (ret < 0) {
 		dev_dbg(ec_dev->dev,

commit 2cc559a4b936247ed33a8e7259c5fa920fc35e35
Author: Vasily Averin <vvs@virtuozzo.com>
Date:   Thu Sep 2 14:54:57 2021 -0700

    memcg: enable accounting for pids in nested pid namespaces
    
    commit fab827dbee8c2e06ca4ba000fa6c48bcf9054aba upstream.
    
    Commit 5d097056c9a0 ("kmemcg: account certain kmem allocations to memcg")
    enabled memcg accounting for pids allocated from init_pid_ns.pid_cachep,
    but forgot to adjust the setting for nested pid namespaces.  As a result,
    pid memory is not accounted exactly where it is really needed, inside
    memcg-limited containers with their own pid namespaces.
    
    Pid was one the first kernel objects enabled for memcg accounting.
    init_pid_ns.pid_cachep marked by SLAB_ACCOUNT and we can expect that any
    new pids in the system are memcg-accounted.
    
    Though recently I've noticed that it is wrong.  nested pid namespaces
    creates own slab caches for pid objects, nested pids have increased size
    because contain id both for all parent and for own pid namespaces.  The
    problem is that these slab caches are _NOT_ marked by SLAB_ACCOUNT, as a
    result any pids allocated in nested pid namespaces are not
    memcg-accounted.
    
    Pid struct in nested pid namespace consumes up to 500 bytes memory, 100000
    such objects gives us up to ~50Mb unaccounted memory, this allow container
    to exceed assigned memcg limits.
    
    Link: https://lkml.kernel.org/r/8b6de616-fd1a-02c6-cbdb-976ecdcfa604@virtuozzo.com
    Fixes: 5d097056c9a0 ("kmemcg: account certain kmem allocations to memcg")
    Cc: stable@vger.kernel.org
    Signed-off-by: Vasily Averin <vvs@virtuozzo.com>
    Reviewed-by: Michal Koutný <mkoutny@suse.com>
    Reviewed-by: Shakeel Butt <shakeelb@google.com>
    Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
    Acked-by: Roman Gushchin <guro@fb.com>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c
index 95271f180687..33de14435c1f 100644
--- a/kernel/pid_namespace.c
+++ b/kernel/pid_namespace.c
@@ -52,7 +52,8 @@ static struct kmem_cache *create_pid_cachep(unsigned int level)
 	mutex_lock(&pid_caches_mutex);
 	/* Name collision forces to do allocation under mutex. */
 	if (!*pkc)
-		*pkc = kmem_cache_create(name, len, 0, SLAB_HWCACHE_ALIGN, 0);
+		*pkc = kmem_cache_create(name, len, 0,
+					 SLAB_HWCACHE_ALIGN | SLAB_ACCOUNT, 0);
 	mutex_unlock(&pid_caches_mutex);
 	/* current can fail, but someone else can succeed. */
 	return READ_ONCE(*pkc);

commit 2fed7f8eda3211190a27caddd6ba8fd728f7b17b
Author: Liu Zixian <liuzixian4@huawei.com>
Date:   Wed Sep 8 18:10:05 2021 -0700

    mm/hugetlb: initialize hugetlb_usage in mm_init
    
    commit 13db8c50477d83ad3e3b9b0ae247e5cd833a7ae4 upstream.
    
    After fork, the child process will get incorrect (2x) hugetlb_usage.  If
    a process uses 5 2MB hugetlb pages in an anonymous mapping,
    
            HugetlbPages:      10240 kB
    
    and then forks, the child will show,
    
            HugetlbPages:      20480 kB
    
    The reason for double the amount is because hugetlb_usage will be copied
    from the parent and then increased when we copy page tables from parent
    to child.  Child will have 2x actual usage.
    
    Fix this by adding hugetlb_count_init in mm_init.
    
    Link: https://lkml.kernel.org/r/20210826071742.877-1-liuzixian4@huawei.com
    Fixes: 5d317b2b6536 ("mm: hugetlb: proc: add HugetlbPages field to /proc/PID/status")
    Signed-off-by: Liu Zixian <liuzixian4@huawei.com>
    Reviewed-by: Naoya Horiguchi <naoya.horiguchi@nec.com>
    Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
index 2df83a659818..cb7dc38e9c77 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -513,6 +513,11 @@ static inline spinlock_t *huge_pte_lockptr(struct hstate *h,
 
 void hugetlb_report_usage(struct seq_file *m, struct mm_struct *mm);
 
+static inline void hugetlb_count_init(struct mm_struct *mm)
+{
+	atomic_long_set(&mm->hugetlb_usage, 0);
+}
+
 static inline void hugetlb_count_add(long l, struct mm_struct *mm)
 {
 	atomic_long_add(l, &mm->hugetlb_usage);
@@ -593,6 +598,10 @@ static inline spinlock_t *huge_pte_lockptr(struct hstate *h,
 	return &mm->page_table_lock;
 }
 
+static inline void hugetlb_count_init(struct mm_struct *mm)
+{
+}
+
 static inline void hugetlb_report_usage(struct seq_file *f, struct mm_struct *m)
 {
 }
diff --git a/kernel/fork.c b/kernel/fork.c
index cf535b9d5db7..b65871600507 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -964,6 +964,7 @@ static struct mm_struct *mm_init(struct mm_struct *mm, struct task_struct *p,
 	mm->pmd_huge_pte = NULL;
 #endif
 	mm_init_uprobes_state(mm);
+	hugetlb_count_init(mm);
 
 	if (current->mm) {
 		mm->flags = current->mm->flags & MMF_INIT_MASK;

commit cca7b5d236a4f7fc1937dc403087f5892d64a5d6
Author: Pratik R. Sampat <psampat@linux.ibm.com>
Date:   Wed Jul 28 17:35:00 2021 +0530

    cpufreq: powernv: Fix init_chip_info initialization in numa=off
    
    commit f34ee9cb2c5ac5af426fee6fa4591a34d187e696 upstream.
    
    In the numa=off kernel command-line configuration init_chip_info() loops
    around the number of chips and attempts to copy the cpumask of that node
    which is NULL for all iterations after the first chip.
    
    Hence, store the cpu mask for each chip instead of derving cpumask from
    node while populating the "chips" struct array and copy that to the
    chips[i].mask
    
    Fixes: 053819e0bf84 ("cpufreq: powernv: Handle throttling due to Pmax capping at chip level")
    Cc: stable@vger.kernel.org # v4.3+
    Reported-by: Shirisha Ganta <shirisha.ganta1@ibm.com>
    Signed-off-by: Pratik R. Sampat <psampat@linux.ibm.com>
    Reviewed-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
    [mpe: Rename goto label to out_free_chip_cpu_mask]
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210728120500.87549-2-psampat@linux.ibm.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/cpufreq/powernv-cpufreq.c b/drivers/cpufreq/powernv-cpufreq.c
index 5da985604692..3ebadabf5411 100644
--- a/drivers/cpufreq/powernv-cpufreq.c
+++ b/drivers/cpufreq/powernv-cpufreq.c
@@ -46,6 +46,7 @@
 #define MAX_PSTATE_SHIFT	32
 #define LPSTATE_SHIFT		48
 #define GPSTATE_SHIFT		56
+#define MAX_NR_CHIPS		32
 
 #define MAX_RAMP_DOWN_TIME				5120
 /*
@@ -1051,12 +1052,20 @@ static int init_chip_info(void)
 	unsigned int *chip;
 	unsigned int cpu, i;
 	unsigned int prev_chip_id = UINT_MAX;
+	cpumask_t *chip_cpu_mask;
 	int ret = 0;
 
 	chip = kcalloc(num_possible_cpus(), sizeof(*chip), GFP_KERNEL);
 	if (!chip)
 		return -ENOMEM;
 
+	/* Allocate a chip cpu mask large enough to fit mask for all chips */
+	chip_cpu_mask = kcalloc(MAX_NR_CHIPS, sizeof(cpumask_t), GFP_KERNEL);
+	if (!chip_cpu_mask) {
+		ret = -ENOMEM;
+		goto free_and_return;
+	}
+
 	for_each_possible_cpu(cpu) {
 		unsigned int id = cpu_to_chip_id(cpu);
 
@@ -1064,22 +1073,25 @@ static int init_chip_info(void)
 			prev_chip_id = id;
 			chip[nr_chips++] = id;
 		}
+		cpumask_set_cpu(cpu, &chip_cpu_mask[nr_chips-1]);
 	}
 
 	chips = kcalloc(nr_chips, sizeof(struct chip), GFP_KERNEL);
 	if (!chips) {
 		ret = -ENOMEM;
-		goto free_and_return;
+		goto out_free_chip_cpu_mask;
 	}
 
 	for (i = 0; i < nr_chips; i++) {
 		chips[i].id = chip[i];
-		cpumask_copy(&chips[i].mask, cpumask_of_node(chip[i]));
+		cpumask_copy(&chips[i].mask, &chip_cpu_mask[i]);
 		INIT_WORK(&chips[i].throttle, powernv_cpufreq_work_fn);
 		for_each_cpu(cpu, &chips[i].mask)
 			per_cpu(chip_info, cpu) =  &chips[i];
 	}
 
+out_free_chip_cpu_mask:
+	kfree(chip_cpu_mask);
 free_and_return:
 	kfree(chip);
 	return ret;

commit 124e801e558f479d37784738904b568a05b1ed96
Author: Saurav Kashyap <skashyap@marvell.com>
Date:   Mon Aug 9 21:37:19 2021 -0700

    scsi: qla2xxx: Sync queue idx with queue_pair_map idx
    
    commit c8fadf019964d0eb1da410ba8b629494d3339db9 upstream.
    
    The first invocation of function find_first_zero_bit will return 0 and
    queue_id gets set to 0.
    
    An index of queue_pair_map also gets set to 0.
    
            qpair_id = find_first_zero_bit(ha->qpair_qid_map, ha->max_qpairs);
    
            set_bit(qpair_id, ha->qpair_qid_map);
            ha->queue_pair_map[qpair_id] = qpair;
    
    In the alloc_queue callback driver checks the map, if queue is already
    allocated:
    
            ha->queue_pair_map[qidx]
    
    This works fine as long as max_qpairs is greater than nvme_max_hw_queues(8)
    since the size of the queue_pair_map is equal to max_qpair. In case nr_cpus
    is less than 8, max_qpairs is less than 8. This creates wrong value
    returned as qpair.
    
    [ 1572.353669] qla2xxx [0000:24:00.3]-2121:6: Returning existing qpair of 4e00000000000000 for idx=2
    [ 1572.354458] general protection fault: 0000 [#1] SMP PTI
    [ 1572.354461] CPU: 1 PID: 44 Comm: kworker/1:1H Kdump: loaded Tainted: G          IOE    --------- -  - 4.18.0-304.el8.x86_64 #1
    [ 1572.354462] Hardware name: HP ProLiant DL380p Gen8, BIOS P70 03/01/2013
    [ 1572.354467] Workqueue: kblockd blk_mq_run_work_fn
    [ 1572.354485] RIP: 0010:qla_nvme_post_cmd+0x92/0x760 [qla2xxx]
    [ 1572.354486] Code: 84 24 5c 01 00 00 00 00 b8 0a 74 1e 66 83 79 48 00 0f 85 a8 03 00 00 48 8b 44 24 08 48 89 ee 4c 89 e7 8b 50 24 e8 5e 8e 00 00 <f0> 41 ff 47 04 0f ae f0 41 f6 47 24 04 74 19 f0 41 ff 4f 04 b8 f0
    [ 1572.354487] RSP: 0018:ffff9c81c645fc90 EFLAGS: 00010246
    [ 1572.354489] RAX: 0000000000000001 RBX: ffff8ea3e5070138 RCX: 0000000000000001
    [ 1572.354490] RDX: 0000000000000001 RSI: 0000000000000001 RDI: ffff8ea4c866b800
    [ 1572.354491] RBP: ffff8ea4c866b800 R08: 0000000000005010 R09: ffff8ea4c866b800
    [ 1572.354492] R10: 0000000000000001 R11: 000000069d1ca3ff R12: ffff8ea4bc460000
    [ 1572.354493] R13: ffff8ea3e50702b0 R14: ffff8ea4c4c16a58 R15: 4e00000000000000
    [ 1572.354494] FS:  0000000000000000(0000) GS:ffff8ea4dfd00000(0000) knlGS:0000000000000000
    [ 1572.354495] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 1572.354496] CR2: 000055884504fa58 CR3: 00000005a1410001 CR4: 00000000000606e0
    [ 1572.354497] Call Trace:
    [ 1572.354503]  ? check_preempt_curr+0x62/0x90
    [ 1572.354506]  ? dma_direct_map_sg+0x72/0x1f0
    [ 1572.354509]  ? nvme_fc_start_fcp_op.part.32+0x175/0x460 [nvme_fc]
    [ 1572.354511]  ? blk_mq_dispatch_rq_list+0x11c/0x730
    [ 1572.354515]  ? __switch_to_asm+0x35/0x70
    [ 1572.354516]  ? __switch_to_asm+0x41/0x70
    [ 1572.354518]  ? __switch_to_asm+0x35/0x70
    [ 1572.354519]  ? __switch_to_asm+0x41/0x70
    [ 1572.354521]  ? __switch_to_asm+0x35/0x70
    [ 1572.354522]  ? __switch_to_asm+0x41/0x70
    [ 1572.354523]  ? __switch_to_asm+0x35/0x70
    [ 1572.354525]  ? entry_SYSCALL_64_after_hwframe+0xb9/0xca
    [ 1572.354527]  ? __switch_to_asm+0x41/0x70
    [ 1572.354529]  ? __blk_mq_sched_dispatch_requests+0xc6/0x170
    [ 1572.354531]  ? blk_mq_sched_dispatch_requests+0x30/0x60
    [ 1572.354532]  ? __blk_mq_run_hw_queue+0x51/0xd0
    [ 1572.354535]  ? process_one_work+0x1a7/0x360
    [ 1572.354537]  ? create_worker+0x1a0/0x1a0
    [ 1572.354538]  ? worker_thread+0x30/0x390
    [ 1572.354540]  ? create_worker+0x1a0/0x1a0
    [ 1572.354541]  ? kthread+0x116/0x130
    [ 1572.354543]  ? kthread_flush_work_fn+0x10/0x10
    [ 1572.354545]  ? ret_from_fork+0x35/0x40
    
    Fix is to use index 0 for admin and first IO queue.
    
    Link: https://lore.kernel.org/r/20210810043720.1137-14-njavali@marvell.com
    Fixes: e84067d74301 ("scsi: qla2xxx: Add FC-NVMe F/W initialization and transport registration")
    Cc: stable@vger.kernel.org
    Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
    Signed-off-by: Saurav Kashyap <skashyap@marvell.com>
    Signed-off-by: Nilesh Javali <njavali@marvell.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c
index 7821c1695e82..dcd0f058f23e 100644
--- a/drivers/scsi/qla2xxx/qla_nvme.c
+++ b/drivers/scsi/qla2xxx/qla_nvme.c
@@ -88,8 +88,9 @@ static int qla_nvme_alloc_queue(struct nvme_fc_local_port *lport,
 	struct qla_hw_data *ha;
 	struct qla_qpair *qpair;
 
-	if (!qidx)
-		qidx++;
+	/* Map admin queue and 1st IO queue to index 0 */
+	if (qidx)
+		qidx--;
 
 	vha = (struct scsi_qla_host *)lport->private;
 	ha = vha->hw;

commit 33b8fcdedbde2b2a508c3d78d4bb34e4067391a0
Author: Maciej W. Rozycki <macro@orcam.me.uk>
Date:   Tue Apr 20 20:01:47 2021 +0200

    scsi: BusLogic: Fix missing pr_cont() use
    
    commit 44d01fc86d952f5a8b8b32bdb4841504d5833d95 upstream.
    
    Update BusLogic driver's messaging system to use pr_cont() for continuation
    lines, bringing messy output:
    
    pci 0000:00:13.0: PCI->APIC IRQ transform: INT A -> IRQ 17
    scsi: ***** BusLogic SCSI Driver Version 2.1.17 of 12 September 2013 *****
    scsi: Copyright 1995-1998 by Leonard N. Zubkoff <lnz@dandelion.com>
    scsi0: Configuring BusLogic Model BT-958 PCI Wide Ultra SCSI Host Adapter
    scsi0:   Firmware Version: 5.07B, I/O Address: 0x7000, IRQ Channel: 17/Level
    scsi0:   PCI Bus: 0, Device: 19, Address:
    0xE0012000,
    Host Adapter SCSI ID: 7
    scsi0:   Parity Checking: Enabled, Extended Translation: Enabled
    scsi0:   Synchronous Negotiation: Ultra, Wide Negotiation: Enabled
    scsi0:   Disconnect/Reconnect: Enabled, Tagged Queuing: Enabled
    scsi0:   Scatter/Gather Limit: 128 of 8192 segments, Mailboxes: 211
    scsi0:   Driver Queue Depth: 211, Host Adapter Queue Depth: 192
    scsi0:   Tagged Queue Depth:
    Automatic
    , Untagged Queue Depth: 3
    scsi0:   SCSI Bus Termination: Both Enabled
    , SCAM: Disabled
    
    scsi0: *** BusLogic BT-958 Initialized Successfully ***
    scsi host0: BusLogic BT-958
    
    back to order:
    
    pci 0000:00:13.0: PCI->APIC IRQ transform: INT A -> IRQ 17
    scsi: ***** BusLogic SCSI Driver Version 2.1.17 of 12 September 2013 *****
    scsi: Copyright 1995-1998 by Leonard N. Zubkoff <lnz@dandelion.com>
    scsi0: Configuring BusLogic Model BT-958 PCI Wide Ultra SCSI Host Adapter
    scsi0:   Firmware Version: 5.07B, I/O Address: 0x7000, IRQ Channel: 17/Level
    scsi0:   PCI Bus: 0, Device: 19, Address: 0xE0012000, Host Adapter SCSI ID: 7
    scsi0:   Parity Checking: Enabled, Extended Translation: Enabled
    scsi0:   Synchronous Negotiation: Ultra, Wide Negotiation: Enabled
    scsi0:   Disconnect/Reconnect: Enabled, Tagged Queuing: Enabled
    scsi0:   Scatter/Gather Limit: 128 of 8192 segments, Mailboxes: 211
    scsi0:   Driver Queue Depth: 211, Host Adapter Queue Depth: 192
    scsi0:   Tagged Queue Depth: Automatic, Untagged Queue Depth: 3
    scsi0:   SCSI Bus Termination: Both Enabled, SCAM: Disabled
    scsi0: *** BusLogic BT-958 Initialized Successfully ***
    scsi host0: BusLogic BT-958
    
    Also diagnostic output such as with the BusLogic=TraceConfiguration
    parameter is affected and becomes vertical and therefore hard to read.
    This has now been corrected, e.g.:
    
    pci 0000:00:13.0: PCI->APIC IRQ transform: INT A -> IRQ 17
    blogic_cmd(86) Status = 30:  4 ==>  4: FF 05 93 00
    blogic_cmd(95) Status = 28: (Modify I/O Address)
    blogic_cmd(91) Status = 30:  1 ==>  1: 01
    blogic_cmd(04) Status = 30:  4 ==>  4: 41 41 35 30
    blogic_cmd(8D) Status = 30: 14 ==> 14: 45 DC 00 20 00 00 00 00 00 40 30 37 42 1D
    scsi: ***** BusLogic SCSI Driver Version 2.1.17 of 12 September 2013 *****
    scsi: Copyright 1995-1998 by Leonard N. Zubkoff <lnz@dandelion.com>
    blogic_cmd(04) Status = 30:  4 ==>  4: 41 41 35 30
    blogic_cmd(0B) Status = 30:  3 ==>  3: 00 08 07
    blogic_cmd(0D) Status = 30: 34 ==> 34: 03 01 07 04 00 00 00 00 00 00 00 00 00 00 00 00 FF 42 44 46 FF 00 00 00 00 00 00 00 00 00 FF 00 FF 00
    blogic_cmd(8D) Status = 30: 14 ==> 14: 45 DC 00 20 00 00 00 00 00 40 30 37 42 1D
    blogic_cmd(84) Status = 30:  1 ==>  1: 37
    blogic_cmd(8B) Status = 30:  5 ==>  5: 39 35 38 20 20
    blogic_cmd(85) Status = 30:  1 ==>  1: 42
    blogic_cmd(86) Status = 30:  4 ==>  4: FF 05 93 00
    blogic_cmd(91) Status = 30: 64 ==> 64: 41 46 3E 20 39 35 38 20 20 00 C4 00 04 01 07 2F 07 04 35 FF FF FF FF FF FF FF FF FF FF 01 00 FE FF 08 FF FF 00 00 00 00 00 00 00 01 00 01 00 00 FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 FC
    scsi0: Configuring BusLogic Model BT-958 PCI Wide Ultra SCSI Host Adapter
    
    etc.
    
    Link: https://lore.kernel.org/r/alpine.DEB.2.21.2104201940430.44318@angie.orcam.me.uk
    Fixes: 4bcc595ccd80 ("printk: reinstate KERN_CONT for printing continuation lines")
    Cc: stable@vger.kernel.org # v4.9+
    Acked-by: Khalid Aziz <khalid@gonehiking.org>
    Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c
index 79b5c5457cc2..b8dd9986809b 100644
--- a/drivers/scsi/BusLogic.c
+++ b/drivers/scsi/BusLogic.c
@@ -3605,7 +3605,7 @@ static void blogic_msg(enum blogic_msglevel msglevel, char *fmt,
 			if (buf[0] != '\n' || len > 1)
 				printk("%sscsi%d: %s", blogic_msglevelmap[msglevel], adapter->host_no, buf);
 		} else
-			printk("%s", buf);
+			pr_cont("%s", buf);
 	} else {
 		if (begin) {
 			if (adapter != NULL && adapter->adapter_initd)
@@ -3613,7 +3613,7 @@ static void blogic_msg(enum blogic_msglevel msglevel, char *fmt,
 			else
 				printk("%s%s", blogic_msglevelmap[msglevel], buf);
 		} else
-			printk("%s", buf);
+			pr_cont("%s", buf);
 	}
 	begin = (buf[len - 1] == '\n');
 }

commit 1bc41e47e0ee05367b2efbdd95bdc2d4e7fcc164
Author: chenying <chenying.kernel@bytedance.com>
Date:   Mon Aug 16 18:02:56 2021 +0800

    ovl: fix BUG_ON() in may_delete() when called from ovl_cleanup()
    
    commit 52d5a0c6bd8a89f460243ed937856354f8f253a3 upstream.
    
    If function ovl_instantiate() returns an error, ovl_cleanup will be called
    and try to remove newdentry from wdir, but the newdentry has been moved to
    udir at this time.  This will causes BUG_ON(victim->d_parent->d_inode !=
    dir) in fs/namei.c:may_delete.
    
    Signed-off-by: chenying <chenying.kernel@bytedance.com>
    Fixes: 01b39dcc9568 ("ovl: use inode_insert5() to hash a newly created inode")
    Link: https://lore.kernel.org/linux-unionfs/e6496a94-a161-dc04-c38a-d2544633acb4@bytedance.com/
    Cc: <stable@vger.kernel.org> # v4.18
    Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c
index 25be2ab6ff6c..0b4ee1ab25df 100644
--- a/fs/overlayfs/dir.c
+++ b/fs/overlayfs/dir.c
@@ -517,8 +517,10 @@ static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode,
 			goto out_cleanup;
 	}
 	err = ovl_instantiate(dentry, inode, newdentry, hardlink);
-	if (err)
-		goto out_cleanup;
+	if (err) {
+		ovl_cleanup(udir, newdentry);
+		dput(newdentry);
+	}
 out_dput:
 	dput(upper);
 out_unlock:

commit 07f2e0249db3f7bdf91633c4e04be6b11e5a8ed4
Author: Mikulas Patocka <mpatocka@redhat.com>
Date:   Mon Aug 30 05:42:27 2021 -0400

    parisc: fix crash with signals and alloca
    
    commit 030f653078316a9cc9ca6bd1b0234dcf858be35d upstream.
    
    I was debugging some crashes on parisc and I found out that there is a
    crash possibility if a function using alloca is interrupted by a signal.
    The reason for the crash is that the gcc alloca implementation leaves
    garbage in the upper 32 bits of the sp register. This normally doesn't
    matter (the upper bits are ignored because the PSW W-bit is clear),
    however the signal delivery routine in the kernel uses full 64 bits of sp
    and it fails with -EFAULT if the upper 32 bits are not zero.
    
    I created this program that demonstrates the problem:
    
    #include <stdlib.h>
    #include <unistd.h>
    #include <signal.h>
    #include <alloca.h>
    
    static __attribute__((noinline,noclone)) void aa(int *size)
    {
            void * volatile p = alloca(-*size);
            while (1) ;
    }
    
    static void handler(int sig)
    {
            write(1, "signal delivered\n", 17);
            _exit(0);
    }
    
    int main(void)
    {
            int size = -0x100;
            signal(SIGALRM, handler);
            alarm(1);
            aa(&size);
    }
    
    If you compile it with optimizations, it will crash.
    The "aa" function has this disassembly:
    
    000106a0 <aa>:
       106a0:       08 03 02 41     copy r3,r1
       106a4:       08 1e 02 43     copy sp,r3
       106a8:       6f c1 00 80     stw,ma r1,40(sp)
       106ac:       37 dc 3f c1     ldo -20(sp),ret0
       106b0:       0c 7c 12 90     stw ret0,8(r3)
       106b4:       0f 40 10 9c     ldw 0(r26),ret0         ; ret0 = 0x00000000FFFFFF00
       106b8:       97 9c 00 7e     subi 3f,ret0,ret0       ; ret0 = 0xFFFFFFFF0000013F
       106bc:       d7 80 1c 1a     depwi 0,31,6,ret0       ; ret0 = 0xFFFFFFFF00000100
       106c0:       0b 9e 0a 1e     add,l sp,ret0,sp        ;   sp = 0xFFFFFFFFxxxxxxxx
       106c4:       e8 1f 1f f7     b,l,n 106c4 <aa+0x24>,r0
    
    This patch fixes the bug by truncating the "usp" variable to 32 bits.
    
    Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Helge Deller <deller@gmx.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c
index 342073f44d3f..79b05eac2b33 100644
--- a/arch/parisc/kernel/signal.c
+++ b/arch/parisc/kernel/signal.c
@@ -239,6 +239,12 @@ setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs,
 #endif
 	
 	usp = (regs->gr[30] & ~(0x01UL));
+#ifdef CONFIG_64BIT
+	if (is_compat_task()) {
+		/* The gcc alloca implementation leaves garbage in the upper 32 bits of sp */
+		usp = (compat_uint_t)usp;
+	}
+#endif
 	/*FIXME: frame_size parameter is unused, remove it. */
 	frame = get_sigframe(&ksig->ka, usp, sizeof(*frame));
 

commit 0cc9af2dffee3ba20d17a91d22acbc9b6488e5af
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Tue Aug 31 16:40:18 2021 +0800

    net: w5100: check return value after calling platform_get_resource()
    
    [ Upstream commit a39ff4a47f3e1da3b036817ef436b1a9be10783a ]
    
    It will cause null-ptr-deref if platform_get_resource() returns NULL,
    we need check the return value.
    
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/wiznet/w5100.c b/drivers/net/ethernet/wiznet/w5100.c
index d8ba512f166a..41040756307a 100644
--- a/drivers/net/ethernet/wiznet/w5100.c
+++ b/drivers/net/ethernet/wiznet/w5100.c
@@ -1059,6 +1059,8 @@ static int w5100_mmio_probe(struct platform_device *pdev)
 		mac_addr = data->mac_addr;
 
 	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!mem)
+		return -EINVAL;
 	if (resource_size(mem) < W5100_BUS_DIRECT_SIZE)
 		ops = &w5100_mmio_indirect_ops;
 	else

commit c97090607058f516880f60733b4302c695385a8b
Author: ?? <yun.wang@linux.alibaba.com>
Date:   Mon Aug 30 18:28:01 2021 +0800

    net: fix NULL pointer reference in cipso_v4_doi_free
    
    [ Upstream commit 733c99ee8be9a1410287cdbb943887365e83b2d6 ]
    
    In netlbl_cipsov4_add_std() when 'doi_def->map.std' alloc
    failed, we sometime observe panic:
    
      BUG: kernel NULL pointer dereference, address:
      ...
      RIP: 0010:cipso_v4_doi_free+0x3a/0x80
      ...
      Call Trace:
       netlbl_cipsov4_add_std+0xf4/0x8c0
       netlbl_cipsov4_add+0x13f/0x1b0
       genl_family_rcv_msg_doit.isra.15+0x132/0x170
       genl_rcv_msg+0x125/0x240
    
    This is because in cipso_v4_doi_free() there is no check
    on 'doi_def->map.std' when 'doi_def->type' equal 1, which
    is possibe, since netlbl_cipsov4_add_std() haven't initialize
    it before alloc 'doi_def->map.std'.
    
    This patch just add the check to prevent panic happen for similar
    cases.
    
    Reported-by: Abaci <abaci@linux.alibaba.com>
    Signed-off-by: Michael Wang <yun.wang@linux.alibaba.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netlabel/netlabel_cipso_v4.c b/net/netlabel/netlabel_cipso_v4.c
index 0559d442ad80..e252f62bb8c2 100644
--- a/net/netlabel/netlabel_cipso_v4.c
+++ b/net/netlabel/netlabel_cipso_v4.c
@@ -156,8 +156,8 @@ static int netlbl_cipsov4_add_std(struct genl_info *info,
 		return -ENOMEM;
 	doi_def->map.std = kzalloc(sizeof(*doi_def->map.std), GFP_KERNEL);
 	if (doi_def->map.std == NULL) {
-		ret_val = -ENOMEM;
-		goto add_std_failure;
+		kfree(doi_def);
+		return -ENOMEM;
 	}
 	doi_def->type = CIPSO_V4_MAP_TRANS;
 

commit 2fc679d00942dab627e22602cd86a4e2e71c2e0c
Author: Miaoqing Pan <miaoqing@codeaurora.org>
Date:   Mon Aug 9 12:05:16 2021 +0800

    ath9k: fix sleeping in atomic context
    
    [ Upstream commit 7c48662b9d56666219f526a71ace8c15e6e12f1f ]
    
    The problem is that gpio_free() can sleep and the cfg_soc() can be
    called with spinlocks held. One problematic call tree is:
    
    --> ath_reset_internal() takes &sc->sc_pcu_lock spin lock
       --> ath9k_hw_reset()
          --> ath9k_hw_gpio_request_in()
             --> ath9k_hw_gpio_request()
                --> ath9k_hw_gpio_cfg_soc()
    
    Remove gpio_free(), use error message instead, so we should make sure
    there is no GPIO conflict.
    
    Also remove ath9k_hw_gpio_free() from ath9k_hw_apply_gpio_override(),
    as gpio_mask will never be set for SOC chips.
    
    Signed-off-by: Miaoqing Pan <miaoqing@codeaurora.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/1628481916-15030-1-git-send-email-miaoqing@codeaurora.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
index 9f438d8e59f2..daad9e7b17cf 100644
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -1622,7 +1622,6 @@ static void ath9k_hw_apply_gpio_override(struct ath_hw *ah)
 		ath9k_hw_gpio_request_out(ah, i, NULL,
 					  AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
 		ath9k_hw_set_gpio(ah, i, !!(ah->gpio_val & BIT(i)));
-		ath9k_hw_gpio_free(ah, i);
 	}
 }
 
@@ -2729,14 +2728,17 @@ static void ath9k_hw_gpio_cfg_output_mux(struct ath_hw *ah, u32 gpio, u32 type)
 static void ath9k_hw_gpio_cfg_soc(struct ath_hw *ah, u32 gpio, bool out,
 				  const char *label)
 {
+	int err;
+
 	if (ah->caps.gpio_requested & BIT(gpio))
 		return;
 
-	/* may be requested by BSP, free anyway */
-	gpio_free(gpio);
-
-	if (gpio_request_one(gpio, out ? GPIOF_OUT_INIT_LOW : GPIOF_IN, label))
+	err = gpio_request_one(gpio, out ? GPIOF_OUT_INIT_LOW : GPIOF_IN, label);
+	if (err) {
+		ath_err(ath9k_hw_common(ah), "request GPIO%d failed:%d\n",
+			gpio, err);
 		return;
+	}
 
 	ah->caps.gpio_requested |= BIT(gpio);
 }

commit 2a1cb9e6c3d30c430052b6636a3cc1a5c6cda1be
Author: Zekun Shen <bruceshenzk@gmail.com>
Date:   Sat Jun 19 09:29:14 2021 -0400

    ath9k: fix OOB read ar9300_eeprom_restore_internal
    
    [ Upstream commit 23151b9ae79e3bc4f6a0c4cd3a7f355f68dad128 ]
    
    Bad header can have large length field which can cause OOB.
    cptr is the last bytes for read, and the eeprom is parsed
    from high to low address. The OOB, triggered by the condition
    length > cptr could cause memory error with a read on
    negative index.
    
    There are some sanity check around length, but it is not
    compared with cptr (the remaining bytes). Here, the
    corrupted/bad EEPROM can cause panic.
    
    I was able to reproduce the crash, but I cannot find the
    log and the reproducer now. After I applied the patch, the
    bug is no longer reproducible.
    
    Signed-off-by: Zekun Shen <bruceshenzk@gmail.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/YM3xKsQJ0Hw2hjrc@Zekuns-MBP-16.fios-router.home
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
index 983e1abbd9e4..4d45d5a8ad2e 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
@@ -3351,7 +3351,8 @@ static int ar9300_eeprom_restore_internal(struct ath_hw *ah,
 			"Found block at %x: code=%d ref=%d length=%d major=%d minor=%d\n",
 			cptr, code, reference, length, major, minor);
 		if ((!AR_SREV_9485(ah) && length >= 1024) ||
-		    (AR_SREV_9485(ah) && length > EEPROM_DATA_LEN_9485)) {
+		    (AR_SREV_9485(ah) && length > EEPROM_DATA_LEN_9485) ||
+		    (length > cptr)) {
 			ath_dbg(common, EEPROM, "Skipping bad header\n");
 			cptr -= COMP_HDR_LEN;
 			continue;

commit d84d3b7ffbcd7ee6ee22c8aff51e5d9d751ec478
Author: Colin Ian King <colin.king@canonical.com>
Date:   Fri Jul 30 11:07:10 2021 +0100

    parport: remove non-zero check on count
    
    [ Upstream commit 0be883a0d795d9146f5325de582584147dd0dcdc ]
    
    The check for count appears to be incorrect since a non-zero count
    check occurs a couple of statements earlier. Currently the check is
    always false and the dev->port->irq != PARPORT_IRQ_NONE part of the
    check is never tested and the if statement is dead-code. Fix this
    by removing the check on count.
    
    Note that this code is pre-git history, so I can't find a sha for
    it.
    
    Acked-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Addresses-Coverity: ("Logically dead code")
    Link: https://lore.kernel.org/r/20210730100710.27405-1-colin.king@canonical.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/parport/ieee1284_ops.c b/drivers/parport/ieee1284_ops.c
index 5d41dda6da4e..75daa16f38b7 100644
--- a/drivers/parport/ieee1284_ops.c
+++ b/drivers/parport/ieee1284_ops.c
@@ -535,7 +535,7 @@ size_t parport_ieee1284_ecp_read_data (struct parport *port,
 				goto out;
 
 			/* Yield the port for a while. */
-			if (count && dev->port->irq != PARPORT_IRQ_NONE) {
+			if (dev->port->irq != PARPORT_IRQ_NONE) {
 				parport_release (dev);
 				schedule_timeout_interruptible(msecs_to_jiffies(40));
 				parport_claim_or_block (dev);

commit 7b44a56ce5f3a1a6e4af993c2997e2f462d327e5
Author: Xiaotan Luo <lxt@rock-chips.com>
Date:   Thu Aug 26 12:02:36 2021 +0800

    ASoC: rockchip: i2s: Fixup config for DAIFMT_DSP_A/B
    
    [ Upstream commit 1bf56843e664eef2525bdbfae6a561e98910f676 ]
    
    - DSP_A: PCM delay 1 bit mode, L data MSB after FRM LRC
    - DSP_B: PCM no delay mode, L data MSB during FRM LRC
    
    Signed-off-by: Xiaotan Luo <lxt@rock-chips.com>
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>
    Link: https://lore.kernel.org/r/1629950562-14281-3-git-send-email-sugar.zhang@rock-chips.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c
index cab381c9dea1..c6d11a59310f 100644
--- a/sound/soc/rockchip/rockchip_i2s.c
+++ b/sound/soc/rockchip/rockchip_i2s.c
@@ -236,12 +236,12 @@ static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
 	case SND_SOC_DAIFMT_I2S:
 		val = I2S_TXCR_IBM_NORMAL;
 		break;
-	case SND_SOC_DAIFMT_DSP_A: /* PCM no delay mode */
-		val = I2S_TXCR_TFS_PCM;
-		break;
-	case SND_SOC_DAIFMT_DSP_B: /* PCM delay 1 mode */
+	case SND_SOC_DAIFMT_DSP_A: /* PCM delay 1 bit mode */
 		val = I2S_TXCR_TFS_PCM | I2S_TXCR_PBM_MODE(1);
 		break;
+	case SND_SOC_DAIFMT_DSP_B: /* PCM no delay mode */
+		val = I2S_TXCR_TFS_PCM;
+		break;
 	default:
 		ret = -EINVAL;
 		goto err_pm_put;
@@ -260,12 +260,12 @@ static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
 	case SND_SOC_DAIFMT_I2S:
 		val = I2S_RXCR_IBM_NORMAL;
 		break;
-	case SND_SOC_DAIFMT_DSP_A: /* PCM no delay mode */
-		val = I2S_RXCR_TFS_PCM;
-		break;
-	case SND_SOC_DAIFMT_DSP_B: /* PCM delay 1 mode */
+	case SND_SOC_DAIFMT_DSP_A: /* PCM delay 1 bit mode */
 		val = I2S_RXCR_TFS_PCM | I2S_RXCR_PBM_MODE(1);
 		break;
+	case SND_SOC_DAIFMT_DSP_B: /* PCM no delay mode */
+		val = I2S_RXCR_TFS_PCM;
+		break;
 	default:
 		ret = -EINVAL;
 		goto err_pm_put;

commit 34a2e6704d55cec79c81bc84b8494430821db01f
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Thu Aug 26 12:01:50 2021 +0800

    ASoC: rockchip: i2s: Fix regmap_ops hang
    
    [ Upstream commit 53ca9b9777b95cdd689181d7c547e38dc79adad0 ]
    
    API 'set_fmt' maybe called when PD is off, in the situation,
    any register access will hang the system. so, enable PD
    before r/w register.
    
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>
    Link: https://lore.kernel.org/r/1629950520-14190-4-git-send-email-sugar.zhang@rock-chips.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c
index b86f76c3598c..cab381c9dea1 100644
--- a/sound/soc/rockchip/rockchip_i2s.c
+++ b/sound/soc/rockchip/rockchip_i2s.c
@@ -189,7 +189,9 @@ static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
 {
 	struct rk_i2s_dev *i2s = to_info(cpu_dai);
 	unsigned int mask = 0, val = 0;
+	int ret = 0;
 
+	pm_runtime_get_sync(cpu_dai->dev);
 	mask = I2S_CKR_MSS_MASK;
 	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
 	case SND_SOC_DAIFMT_CBS_CFS:
@@ -202,7 +204,8 @@ static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
 		i2s->is_master_mode = false;
 		break;
 	default:
-		return -EINVAL;
+		ret = -EINVAL;
+		goto err_pm_put;
 	}
 
 	regmap_update_bits(i2s->regmap, I2S_CKR, mask, val);
@@ -216,7 +219,8 @@ static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
 		val = I2S_CKR_CKP_POS;
 		break;
 	default:
-		return -EINVAL;
+		ret = -EINVAL;
+		goto err_pm_put;
 	}
 
 	regmap_update_bits(i2s->regmap, I2S_CKR, mask, val);
@@ -239,7 +243,8 @@ static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
 		val = I2S_TXCR_TFS_PCM | I2S_TXCR_PBM_MODE(1);
 		break;
 	default:
-		return -EINVAL;
+		ret = -EINVAL;
+		goto err_pm_put;
 	}
 
 	regmap_update_bits(i2s->regmap, I2S_TXCR, mask, val);
@@ -262,12 +267,16 @@ static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
 		val = I2S_RXCR_TFS_PCM | I2S_RXCR_PBM_MODE(1);
 		break;
 	default:
-		return -EINVAL;
+		ret = -EINVAL;
+		goto err_pm_put;
 	}
 
 	regmap_update_bits(i2s->regmap, I2S_RXCR, mask, val);
 
-	return 0;
+err_pm_put:
+	pm_runtime_put(cpu_dai->dev);
+
+	return ret;
 }
 
 static int rockchip_i2s_hw_params(struct snd_pcm_substream *substream,

commit b4bc9fa125d54ee68faac3dfbdfd6b8f845a9f97
Author: Shuah Khan <skhan@linuxfoundation.org>
Date:   Thu Aug 19 16:59:37 2021 -0600

    usbip:vhci_hcd USB port can get stuck in the disabled state
    
    [ Upstream commit 66cce9e73ec61967ed1f97f30cee79bd9a2bb7ee ]
    
    When a remote usb device is attached to the local Virtual USB
    Host Controller Root Hub port, the bound device driver may send
    a port reset command.
    
    vhci_hcd accepts port resets only when the device doesn't have
    port address assigned to it. When reset happens device is in
    assigned/used state and vhci_hcd rejects it leaving the port in
    a stuck state.
    
    This problem was found when a blue-tooth or xbox wireless dongle
    was passed through using usbip.
    
    A few drivers reset the port during probe including mt76 driver
    specific to this bug report. Fix the problem with a change to
    honor reset requests when device is in used state (VDEV_ST_USED).
    
    Reported-and-tested-by: Michael <msbroadf@gmail.com>
    Suggested-by: Michael <msbroadf@gmail.com>
    Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
    Link: https://lore.kernel.org/r/20210819225937.41037-1-skhan@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/usbip/vhci_hcd.c b/drivers/usb/usbip/vhci_hcd.c
index a4ead4099869..202dc76f7beb 100644
--- a/drivers/usb/usbip/vhci_hcd.c
+++ b/drivers/usb/usbip/vhci_hcd.c
@@ -455,8 +455,14 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
 			vhci_hcd->port_status[rhport] &= ~(1 << USB_PORT_FEAT_RESET);
 			vhci_hcd->re_timeout = 0;
 
+			/*
+			 * A few drivers do usb reset during probe when
+			 * the device could be in VDEV_ST_USED state
+			 */
 			if (vhci_hcd->vdev[rhport].ud.status ==
-			    VDEV_ST_NOTASSIGNED) {
+				VDEV_ST_NOTASSIGNED ||
+			    vhci_hcd->vdev[rhport].ud.status ==
+				VDEV_ST_USED) {
 				usbip_dbg_vhci_rh(
 					" enable rhport %d (status %u)\n",
 					rhport,

commit 3882c11a9b87d730fed84b1a4818c4f51ec61b96
Author: Anirudh Rayabharam <mail@anirudhrb.com>
Date:   Sat Aug 21 00:31:21 2021 +0530

    usbip: give back URBs for unsent unlink requests during cleanup
    
    [ Upstream commit 258c81b341c8025d79073ce2d6ce19dcdc7d10d2 ]
    
    In vhci_device_unlink_cleanup(), the URBs for unsent unlink requests are
    not given back. This sometimes causes usb_kill_urb to wait indefinitely
    for that urb to be given back. syzbot has reported a hung task issue [1]
    for this.
    
    To fix this, give back the urbs corresponding to unsent unlink requests
    (unlink_tx list) similar to how urbs corresponding to unanswered unlink
    requests (unlink_rx list) are given back.
    
    [1]: https://syzkaller.appspot.com/bug?id=08f12df95ae7da69814e64eb5515d5a85ed06b76
    
    Reported-by: syzbot+74d6ef051d3d2eacf428@syzkaller.appspotmail.com
    Tested-by: syzbot+74d6ef051d3d2eacf428@syzkaller.appspotmail.com
    Reviewed-by: Shuah Khan <skhan@linuxfoundation.org>
    Signed-off-by: Anirudh Rayabharam <mail@anirudhrb.com>
    Link: https://lore.kernel.org/r/20210820190122.16379-2-mail@anirudhrb.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/usbip/vhci_hcd.c b/drivers/usb/usbip/vhci_hcd.c
index b13ed5a7618d..a4ead4099869 100644
--- a/drivers/usb/usbip/vhci_hcd.c
+++ b/drivers/usb/usbip/vhci_hcd.c
@@ -957,8 +957,32 @@ static void vhci_device_unlink_cleanup(struct vhci_device *vdev)
 	spin_lock(&vdev->priv_lock);
 
 	list_for_each_entry_safe(unlink, tmp, &vdev->unlink_tx, list) {
+		struct urb *urb;
+
+		/* give back urb of unsent unlink request */
 		pr_info("unlink cleanup tx %lu\n", unlink->unlink_seqnum);
+
+		urb = pickup_urb_and_free_priv(vdev, unlink->unlink_seqnum);
+		if (!urb) {
+			list_del(&unlink->list);
+			kfree(unlink);
+			continue;
+		}
+
+		urb->status = -ENODEV;
+
+		usb_hcd_unlink_urb_from_ep(hcd, urb);
+
 		list_del(&unlink->list);
+
+		spin_unlock(&vdev->priv_lock);
+		spin_unlock_irqrestore(&vhci->lock, flags);
+
+		usb_hcd_giveback_urb(hcd, urb, urb->status);
+
+		spin_lock_irqsave(&vhci->lock, flags);
+		spin_lock(&vdev->priv_lock);
+
 		kfree(unlink);
 	}
 

commit ffc825049ed2e8c849d318e987fd5073e0be462f
Author: Nadezda Lutovinova <lutovinova@ispras.ru>
Date:   Thu Aug 19 19:33:23 2021 +0300

    usb: musb: musb_dsps: request_irq() after initializing musb
    
    [ Upstream commit 7c75bde329d7e2a93cf86a5c15c61f96f1446cdc ]
    
    If IRQ occurs between calling  dsps_setup_optional_vbus_irq()
    and  dsps_create_musb_pdev(), then null pointer dereference occurs
    since glue->musb wasn't initialized yet.
    
    The patch puts initializing of neccesery data before registration
    of the interrupt handler.
    
    Found by Linux Driver Verification project (linuxtesting.org).
    
    Signed-off-by: Nadezda Lutovinova <lutovinova@ispras.ru>
    Link: https://lore.kernel.org/r/20210819163323.17714-1-lutovinova@ispras.ru
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
index 403eb97915f8..2f6708b8b5c2 100644
--- a/drivers/usb/musb/musb_dsps.c
+++ b/drivers/usb/musb/musb_dsps.c
@@ -892,23 +892,22 @@ static int dsps_probe(struct platform_device *pdev)
 	if (!glue->usbss_base)
 		return -ENXIO;
 
-	if (usb_get_dr_mode(&pdev->dev) == USB_DR_MODE_PERIPHERAL) {
-		ret = dsps_setup_optional_vbus_irq(pdev, glue);
-		if (ret)
-			goto err_iounmap;
-	}
-
 	platform_set_drvdata(pdev, glue);
 	pm_runtime_enable(&pdev->dev);
 	ret = dsps_create_musb_pdev(glue, pdev);
 	if (ret)
 		goto err;
 
+	if (usb_get_dr_mode(&pdev->dev) == USB_DR_MODE_PERIPHERAL) {
+		ret = dsps_setup_optional_vbus_irq(pdev, glue);
+		if (ret)
+			goto err;
+	}
+
 	return 0;
 
 err:
 	pm_runtime_disable(&pdev->dev);
-err_iounmap:
 	iounmap(glue->usbss_base);
 	return ret;
 }

commit f0ce526fd5f150dd0ba473384461813a040b1015
Author: Mathias Nyman <mathias.nyman@linux.intel.com>
Date:   Fri Aug 20 15:35:01 2021 +0300

    Revert "USB: xhci: fix U1/U2 handling for hardware with XHCI_INTEL_HOST quirk set"
    
    [ Upstream commit 2847c46c61486fd8bca9136a6e27177212e78c69 ]
    
    This reverts commit 5d5323a6f3625f101dbfa94ba3ef7706cce38760.
    
    That commit effectively disabled Intel host initiated U1/U2 lpm for devices
    with periodic endpoints.
    
    Before that commit we disabled host initiated U1/U2 lpm if the exit latency
    was larger than any periodic endpoint service interval, this is according
    to xhci spec xhci 1.1 specification section 4.23.5.2
    
    After that commit we incorrectly checked that service interval was smaller
    than U1/U2 inactivity timeout. This is not relevant, and can't happen for
    Intel hosts as previously set U1/U2 timeout = 105% * service interval.
    
    Patch claimed it solved cases where devices can't be enumerated because of
    bandwidth issues. This might be true but it's a side effect of accidentally
    turning off lpm.
    
    exit latency calculations have been revised since then
    
    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Link: https://lore.kernel.org/r/20210820123503.2605901-5-mathias.nyman@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index c4e3760abd5b..bebab0ec2978 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -4580,19 +4580,19 @@ static u16 xhci_calculate_u1_timeout(struct xhci_hcd *xhci,
 {
 	unsigned long long timeout_ns;
 
-	if (xhci->quirks & XHCI_INTEL_HOST)
-		timeout_ns = xhci_calculate_intel_u1_timeout(udev, desc);
-	else
-		timeout_ns = udev->u1_params.sel;
-
 	/* Prevent U1 if service interval is shorter than U1 exit latency */
 	if (usb_endpoint_xfer_int(desc) || usb_endpoint_xfer_isoc(desc)) {
-		if (xhci_service_interval_to_ns(desc) <= timeout_ns) {
+		if (xhci_service_interval_to_ns(desc) <= udev->u1_params.mel) {
 			dev_dbg(&udev->dev, "Disable U1, ESIT shorter than exit latency\n");
 			return USB3_LPM_DISABLED;
 		}
 	}
 
+	if (xhci->quirks & XHCI_INTEL_HOST)
+		timeout_ns = xhci_calculate_intel_u1_timeout(udev, desc);
+	else
+		timeout_ns = udev->u1_params.sel;
+
 	/* The U1 timeout is encoded in 1us intervals.
 	 * Don't return a timeout of zero, because that's USB3_LPM_DISABLED.
 	 */
@@ -4644,19 +4644,19 @@ static u16 xhci_calculate_u2_timeout(struct xhci_hcd *xhci,
 {
 	unsigned long long timeout_ns;
 
-	if (xhci->quirks & XHCI_INTEL_HOST)
-		timeout_ns = xhci_calculate_intel_u2_timeout(udev, desc);
-	else
-		timeout_ns = udev->u2_params.sel;
-
 	/* Prevent U2 if service interval is shorter than U2 exit latency */
 	if (usb_endpoint_xfer_int(desc) || usb_endpoint_xfer_isoc(desc)) {
-		if (xhci_service_interval_to_ns(desc) <= timeout_ns) {
+		if (xhci_service_interval_to_ns(desc) <= udev->u2_params.mel) {
 			dev_dbg(&udev->dev, "Disable U2, ESIT shorter than exit latency\n");
 			return USB3_LPM_DISABLED;
 		}
 	}
 
+	if (xhci->quirks & XHCI_INTEL_HOST)
+		timeout_ns = xhci_calculate_intel_u2_timeout(udev, desc);
+	else
+		timeout_ns = udev->u2_params.sel;
+
 	/* The U2 timeout is encoded in 256us intervals */
 	timeout_ns = DIV_ROUND_UP_ULL(timeout_ns, 256 * 1000);
 	/* If the necessary timeout value is bigger than what we can set in the

commit 1c409595b46bc405e9d4761d449d9307e009fc6f
Author: Ding Hui <dinghui@sangfor.com.cn>
Date:   Tue Aug 17 22:55:10 2021 +0800

    cifs: fix wrong release in sess_alloc_buffer() failed path
    
    [ Upstream commit d72c74197b70bc3c95152f351a568007bffa3e11 ]
    
    smb_buf is allocated by small_smb_init_no_tc(), and buf type is
    CIFS_SMALL_BUFFER, so we should use cifs_small_buf_release() to
    release it in failed path.
    
    Signed-off-by: Ding Hui <dinghui@sangfor.com.cn>
    Reviewed-by: Paulo Alcantara (SUSE) <pc@cjr.nz>
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c
index aa23c00367ec..0113dba28eb0 100644
--- a/fs/cifs/sess.c
+++ b/fs/cifs/sess.c
@@ -602,7 +602,7 @@ sess_alloc_buffer(struct sess_data *sess_data, int wct)
 	return 0;
 
 out_free_smb_buf:
-	kfree(smb_buf);
+	cifs_small_buf_release(smb_buf);
 	sess_data->iov[0].iov_base = NULL;
 	sess_data->iov[0].iov_len = 0;
 	sess_data->buf0_type = CIFS_NO_BUFFER;

commit 61eb990afb7da629e69e0ac3ec8cdfad97152443
Author: Nishad Kamdar <nishadkamdar@gmail.com>
Date:   Wed Aug 25 00:47:26 2021 +0530

    mmc: core: Return correct emmc response in case of ioctl error
    
    [ Upstream commit e72a55f2e5ddcfb3dce0701caf925ce435b87682 ]
    
    When a read/write command is sent via ioctl to the kernel,
    and the command fails, the actual error response of the emmc
    is not sent to the user.
    
    IOCTL read/write tests are carried out using commands
    17 (Single BLock Read), 24 (Single Block Write),
    18 (Multi Block Read), 25 (Multi Block Write)
    
    The tests are carried out on a 64Gb emmc device. All of these
    tests try to access an "out of range" sector address (0x09B2FFFF).
    
    It is seen that without the patch the response received by the user
    is not OUT_OF_RANGE error (R1 response 31st bit is not set) as per
    JEDEC specification. After applying the patch proper response is seen.
    This is because the function returns without copying the response to
    the user in case of failure. This patch fixes the issue.
    
    Hence, this memcpy is required whether we get an error response or not.
    Therefor it is moved up from the current position up to immediately
    after we have called mmc_wait_for_req().
    
    The test code and the output of only the CMD17 is included in the
    commit to limit the message length.
    
    CMD17 (Test Code Snippet):
    ==========================
            printf("Forming CMD%d\n", opt_idx);
            /*  single block read */
            cmd.blksz = 512;
            cmd.blocks = 1;
            cmd.write_flag = 0;
            cmd.opcode = 17;
            //cmd.arg = atoi(argv[3]);
            cmd.arg = 0x09B2FFFF;
            /* Expecting response R1B */
            cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC;
    
            memset(data, 0, sizeof(__u8) * 512);
            mmc_ioc_cmd_set_data(cmd, data);
    
            printf("Sending CMD%d: ARG[0x%08x]\n", opt_idx, cmd.arg);
            if(ioctl(fd, MMC_IOC_CMD, &cmd))
                    perror("Error");
    
            printf("\nResponse: %08x\n", cmd.response[0]);
    
    CMD17 (Output without patch):
    =============================
    test@test-LIVA-Z:~$ sudo ./mmc cmd_test /dev/mmcblk0 17
    Entering the do_mmc_commands:Device: /dev/mmcblk0 nargs:4
    Entering the do_mmc_commands:Device: /dev/mmcblk0 options[17, 0x09B2FFF]
    Forming CMD17
    Sending CMD17: ARG[0x09b2ffff]
    Error: Connection timed out
    
    Response: 00000000
    (Incorrect response)
    
    CMD17 (Output with patch):
    ==========================
    test@test-LIVA-Z:~$ sudo ./mmc cmd_test /dev/mmcblk0 17
    [sudo] password for test:
    Entering the do_mmc_commands:Device: /dev/mmcblk0 nargs:4
    Entering the do_mmc_commands:Device: /dev/mmcblk0 options[17, 09B2FFFF]
    Forming CMD17
    Sending CMD17: ARG[0x09b2ffff]
    Error: Connection timed out
    
    Response: 80000900
    (Correct OUT_OF_ERROR response as per JEDEC specification)
    
    Signed-off-by: Nishad Kamdar <nishadkamdar@gmail.com>
    Reviewed-by: Avri Altman <avri.altman@wdc.com>
    Link: https://lore.kernel.org/r/20210824191726.8296-1-nishadkamdar@gmail.com
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
index 7b2bb32e3555..d1cc0fdbc51c 100644
--- a/drivers/mmc/core/block.c
+++ b/drivers/mmc/core/block.c
@@ -592,6 +592,7 @@ static int __mmc_blk_ioctl_cmd(struct mmc_card *card, struct mmc_blk_data *md,
 	}
 
 	mmc_wait_for_req(card->host, &mrq);
+	memcpy(&idata->ic.response, cmd.resp, sizeof(cmd.resp));
 
 	if (cmd.error) {
 		dev_err(mmc_dev(card->host), "%s: cmd error %d\n",
@@ -641,8 +642,6 @@ static int __mmc_blk_ioctl_cmd(struct mmc_card *card, struct mmc_blk_data *md,
 	if (idata->ic.postsleep_min_us)
 		usleep_range(idata->ic.postsleep_min_us, idata->ic.postsleep_max_us);
 
-	memcpy(&(idata->ic.response), cmd.resp, sizeof(cmd.resp));
-
 	if (idata->rpmb || (cmd.flags & MMC_RSP_R1B) == MMC_RSP_R1B) {
 		/*
 		 * Ensure RPMB/R1B command has completed by polling CMD13

commit 4c48bd3aa1a33cb3e8a0eca8330b8f100f43d895
Author: Li Zhijian <lizhijian@cn.fujitsu.com>
Date:   Fri Aug 20 09:55:53 2021 +0800

    selftests/bpf: Enlarge select() timeout for test_maps
    
    [ Upstream commit 2d82d73da35b72b53fe0d96350a2b8d929d07e42 ]
    
    0Day robot observed that it's easily timeout on a heavy load host.
    -------------------
     # selftests: bpf: test_maps
     # Fork 1024 tasks to 'test_update_delete'
     # Fork 1024 tasks to 'test_update_delete'
     # Fork 100 tasks to 'test_hashmap'
     # Fork 100 tasks to 'test_hashmap_percpu'
     # Fork 100 tasks to 'test_hashmap_sizes'
     # Fork 100 tasks to 'test_hashmap_walk'
     # Fork 100 tasks to 'test_arraymap'
     # Fork 100 tasks to 'test_arraymap_percpu'
     # Failed sockmap unexpected timeout
     not ok 3 selftests: bpf: test_maps # exit=1
     # selftests: bpf: test_lru_map
     # nr_cpus:8
    -------------------
    Since this test will be scheduled by 0Day to a random host that could have
    only a few cpus(2-8), enlarge the timeout to avoid a false NG report.
    
    In practice, i tried to pin it to only one cpu by 'taskset 0x01 ./test_maps',
    and knew 10S is likely enough, but i still perfer to a larger value 30.
    
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Acked-by: Song Liu <songliubraving@fb.com>
    Link: https://lore.kernel.org/bpf/20210820015556.23276-2-lizhijian@cn.fujitsu.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/tools/testing/selftests/bpf/test_maps.c b/tools/testing/selftests/bpf/test_maps.c
index 4e202217fae1..87ba89df9802 100644
--- a/tools/testing/selftests/bpf/test_maps.c
+++ b/tools/testing/selftests/bpf/test_maps.c
@@ -796,7 +796,7 @@ static void test_sockmap(int tasks, void *data)
 
 		FD_ZERO(&w);
 		FD_SET(sfd[3], &w);
-		to.tv_sec = 1;
+		to.tv_sec = 30;
 		to.tv_usec = 0;
 		s = select(sfd[3] + 1, &w, NULL, NULL, &to);
 		if (s == -1) {

commit a0435c88ee82781cafcb7328f14d847aa7f3b247
Author: Thomas Hebb <tommyhebb@gmail.com>
Date:   Sun Aug 1 04:46:14 2021 -0700

    mmc: rtsx_pci: Fix long reads when clock is prescaled
    
    [ Upstream commit 3ac5e45291f3f0d699a721357380d4593bc2dcb3 ]
    
    For unexplained reasons, the prescaler register for this device needs to
    be cleared (set to 1) while performing a data read or else the command
    will hang. This does not appear to affect the real clock rate sent out
    on the bus, so I assume it's purely to work around a hardware bug.
    
    During normal operation, the prescaler is already set to 1, so nothing
    needs to be done. However, in "initial mode" (which is used for sub-MHz
    clock speeds, like the core sets while enumerating cards), it's set to
    128 and so we need to reset it during data reads. We currently fail to
    do this for long reads.
    
    This has no functional affect on the driver's operation currently
    written, as the MMC core always sets a clock above 1MHz before
    attempting any long reads. However, the core could conceivably set any
    clock speed at any time and the driver should still work, so I think
    this fix is worthwhile.
    
    I personally encountered this issue while performing data recovery on an
    external chip. My connections had poor signal integrity, so I modified
    the core code to reduce the clock speed. Without this change, I saw the
    card enumerate but was unable to actually read any data.
    
    Writes don't seem to work in the situation described above even with
    this change (and even if the workaround is extended to encompass data
    write commands). I was not able to find a way to get them working.
    
    Signed-off-by: Thomas Hebb <tommyhebb@gmail.com>
    Link: https://lore.kernel.org/r/2fef280d8409ab0100c26c6ac7050227defd098d.1627818365.git.tommyhebb@gmail.com
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mmc/host/rtsx_pci_sdmmc.c b/drivers/mmc/host/rtsx_pci_sdmmc.c
index 02de6a5701d6..c1de8fa50fe8 100644
--- a/drivers/mmc/host/rtsx_pci_sdmmc.c
+++ b/drivers/mmc/host/rtsx_pci_sdmmc.c
@@ -551,9 +551,22 @@ static int sd_write_long_data(struct realtek_pci_sdmmc *host,
 	return 0;
 }
 
+static inline void sd_enable_initial_mode(struct realtek_pci_sdmmc *host)
+{
+	rtsx_pci_write_register(host->pcr, SD_CFG1,
+			SD_CLK_DIVIDE_MASK, SD_CLK_DIVIDE_128);
+}
+
+static inline void sd_disable_initial_mode(struct realtek_pci_sdmmc *host)
+{
+	rtsx_pci_write_register(host->pcr, SD_CFG1,
+			SD_CLK_DIVIDE_MASK, SD_CLK_DIVIDE_0);
+}
+
 static int sd_rw_multi(struct realtek_pci_sdmmc *host, struct mmc_request *mrq)
 {
 	struct mmc_data *data = mrq->data;
+	int err;
 
 	if (host->sg_count < 0) {
 		data->error = host->sg_count;
@@ -562,22 +575,19 @@ static int sd_rw_multi(struct realtek_pci_sdmmc *host, struct mmc_request *mrq)
 		return data->error;
 	}
 
-	if (data->flags & MMC_DATA_READ)
-		return sd_read_long_data(host, mrq);
+	if (data->flags & MMC_DATA_READ) {
+		if (host->initial_mode)
+			sd_disable_initial_mode(host);
 
-	return sd_write_long_data(host, mrq);
-}
+		err = sd_read_long_data(host, mrq);
 
-static inline void sd_enable_initial_mode(struct realtek_pci_sdmmc *host)
-{
-	rtsx_pci_write_register(host->pcr, SD_CFG1,
-			SD_CLK_DIVIDE_MASK, SD_CLK_DIVIDE_128);
-}
+		if (host->initial_mode)
+			sd_enable_initial_mode(host);
 
-static inline void sd_disable_initial_mode(struct realtek_pci_sdmmc *host)
-{
-	rtsx_pci_write_register(host->pcr, SD_CFG1,
-			SD_CLK_DIVIDE_MASK, SD_CLK_DIVIDE_0);
+		return err;
+	}
+
+	return sd_write_long_data(host, mrq);
 }
 
 static void sd_normal_rw(struct realtek_pci_sdmmc *host,

commit 039fa89907fb86ce78e6394acd06357979e973d0
Author: Manish Narani <manish.narani@xilinx.com>
Date:   Tue Jun 15 16:13:54 2021 +0530

    mmc: sdhci-of-arasan: Check return value of non-void funtions
    
    [ Upstream commit 66bad6ed2204fdb78a0a8fb89d824397106a5471 ]
    
    At a couple of places, the return values of the non-void functions were
    not getting checked. This was reported by the coverity tool. Modify the
    code to check the return values of the same.
    
    Addresses-Coverity: ("check_return")
    Signed-off-by: Manish Narani <manish.narani@xilinx.com>
    Acked-by: Adrian Hunter <adrian.hunter@intel.com>
    Link: https://lore.kernel.org/r/1623753837-21035-5-git-send-email-manish.narani@xilinx.com
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c
index 9c77bfe4334f..d1a2418b0c5e 100644
--- a/drivers/mmc/host/sdhci-of-arasan.c
+++ b/drivers/mmc/host/sdhci-of-arasan.c
@@ -185,7 +185,12 @@ static void sdhci_arasan_set_clock(struct sdhci_host *host, unsigned int clock)
 			 * through low speeds without power cycling.
 			 */
 			sdhci_set_clock(host, host->max_clk);
-			phy_power_on(sdhci_arasan->phy);
+			if (phy_power_on(sdhci_arasan->phy)) {
+				pr_err("%s: Cannot power on phy.\n",
+				       mmc_hostname(host->mmc));
+				return;
+			}
+
 			sdhci_arasan->is_phy_on = true;
 
 			/*
@@ -221,7 +226,12 @@ static void sdhci_arasan_set_clock(struct sdhci_host *host, unsigned int clock)
 		msleep(20);
 
 	if (ctrl_phy) {
-		phy_power_on(sdhci_arasan->phy);
+		if (phy_power_on(sdhci_arasan->phy)) {
+			pr_err("%s: Cannot power on phy.\n",
+			       mmc_hostname(host->mmc));
+			return;
+		}
+
 		sdhci_arasan->is_phy_on = true;
 	}
 }
@@ -395,7 +405,9 @@ static int sdhci_arasan_suspend(struct device *dev)
 		ret = phy_power_off(sdhci_arasan->phy);
 		if (ret) {
 			dev_err(dev, "Cannot power off phy.\n");
-			sdhci_resume_host(host);
+			if (sdhci_resume_host(host))
+				dev_err(dev, "Cannot resume host.\n");
+
 			return ret;
 		}
 		sdhci_arasan->is_phy_on = false;

commit 3f3c58973177a70c9b94a3ce85375529d3cb5b3c
Author: Marc Zyngier <maz@kernel.org>
Date:   Fri Aug 20 15:47:22 2021 +0100

    of: Don't allow __of_attached_node_sysfs() without CONFIG_SYSFS
    
    [ Upstream commit 6211e9cb2f8faf7faae0b6caf844bfe9527cc607 ]
    
    Trying to boot without SYSFS, but with OF_DYNAMIC quickly
    results in a crash:
    
    [    0.088460] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000070
    [...]
    [    0.103927] CPU: 1 PID: 1 Comm: swapper/0 Not tainted 5.14.0-rc3 #4179
    [    0.105810] Hardware name: linux,dummy-virt (DT)
    [    0.107147] pstate: 80000005 (Nzcv daif -PAN -UAO -TCO BTYPE=--)
    [    0.108876] pc : kernfs_find_and_get_ns+0x3c/0x7c
    [    0.110244] lr : kernfs_find_and_get_ns+0x3c/0x7c
    [...]
    [    0.134087] Call trace:
    [    0.134800]  kernfs_find_and_get_ns+0x3c/0x7c
    [    0.136054]  safe_name+0x4c/0xd0
    [    0.136994]  __of_attach_node_sysfs+0xf8/0x124
    [    0.138287]  of_core_init+0x90/0xfc
    [    0.139296]  driver_init+0x30/0x4c
    [    0.140283]  kernel_init_freeable+0x160/0x1b8
    [    0.141543]  kernel_init+0x30/0x140
    [    0.142561]  ret_from_fork+0x10/0x18
    
    While not having sysfs isn't a very common option these days,
    it is still expected that such configuration would work.
    
    Paper over it by bailing out from __of_attach_node_sysfs() if
    CONFIG_SYSFS isn't enabled.
    
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20210820144722.169226-1-maz@kernel.org
    Signed-off-by: Rob Herring <robh@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/of/kobj.c b/drivers/of/kobj.c
index a32e60b024b8..6675b5e56960 100644
--- a/drivers/of/kobj.c
+++ b/drivers/of/kobj.c
@@ -119,7 +119,7 @@ int __of_attach_node_sysfs(struct device_node *np)
 	struct property *pp;
 	int rc;
 
-	if (!of_kset)
+	if (!IS_ENABLED(CONFIG_SYSFS) || !of_kset)
 		return 0;
 
 	np->kobj.kset = of_kset;

commit 5cff77b9827a956d076168b56775aad23bce87e4
Author: Bob Peterson <rpeterso@redhat.com>
Date:   Fri Jul 30 12:41:49 2021 -0500

    gfs2: Don't call dlm after protocol is unmounted
    
    [ Upstream commit d1340f80f0b8066321b499a376780da00560e857 ]
    
    In the gfs2 withdraw sequence, the dlm protocol is unmounted with a call
    to lm_unmount. After a withdraw, users are allowed to unmount the
    withdrawn file system. But at that point we may still have glocks left
    over that we need to free via unmount's call to gfs2_gl_hash_clear.
    These glocks may have never been completed because of whatever problem
    caused the withdraw (IO errors or whatever).
    
    Before this patch, function gdlm_put_lock would still try to call into
    dlm to unlock these leftover glocks, which resulted in dlm returning
    -EINVAL because the lock space was abandoned. These glocks were never
    freed because there was no mechanism after that to free them.
    
    This patch adds a check to gdlm_put_lock to see if the locking protocol
    was inactive (DFL_UNMOUNT flag) and if so, free the glock and not
    make the invalid call into dlm.
    
    I could have combined this "if" with the one that follows, related to
    leftover glock LVBs, but I felt the code was more readable with its own
    if clause.
    
    Signed-off-by: Bob Peterson <rpeterso@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/gfs2/lock_dlm.c b/fs/gfs2/lock_dlm.c
index 56dddc1f8ddd..9e90e42c495e 100644
--- a/fs/gfs2/lock_dlm.c
+++ b/fs/gfs2/lock_dlm.c
@@ -295,6 +295,11 @@ static void gdlm_put_lock(struct gfs2_glock *gl)
 	gfs2_sbstats_inc(gl, GFS2_LKS_DCOUNT);
 	gfs2_update_request_times(gl);
 
+	/* don't want to call dlm if we've unmounted the lock protocol */
+	if (test_bit(DFL_UNMOUNT, &ls->ls_recover_flags)) {
+		gfs2_glock_free(gl);
+		return;
+	}
 	/* don't want to skip dlm_unlock writing the lvb when lock has one */
 
 	if (test_bit(SDF_SKIP_DLM_UNLOCK, &sdp->sd_flags) &&

commit ee50ef36711d75186a616a14bc0c05a139e649da
Author: Kees Cook <keescook@chromium.org>
Date:   Tue Aug 17 21:42:52 2021 -0700

    staging: rts5208: Fix get_ms_information() heap buffer size
    
    [ Upstream commit cbe34165cc1b7d1110b268ba8b9f30843c941639 ]
    
    Fix buf allocation size (it needs to be 2 bytes larger). Found when
    __alloc_size() annotations were added to kmalloc() interfaces.
    
    In file included from ./include/linux/string.h:253,
                     from ./include/linux/bitmap.h:10,
                     from ./include/linux/cpumask.h:12,
                     from ./arch/x86/include/asm/paravirt.h:17,
                     from ./arch/x86/include/asm/irqflags.h:63,
                     from ./include/linux/irqflags.h:16,
                     from ./include/linux/rcupdate.h:26,
                     from ./include/linux/rculist.h:11,
                     from ./include/linux/pid.h:5,
                     from ./include/linux/sched.h:14,
                     from ./include/linux/blkdev.h:5,
                     from drivers/staging/rts5208/rtsx_scsi.c:12:
    In function 'get_ms_information',
        inlined from 'ms_sp_cmnd' at drivers/staging/rts5208/rtsx_scsi.c:2877:12,
        inlined from 'rtsx_scsi_handler' at drivers/staging/rts5208/rtsx_scsi.c:3247:12:
    ./include/linux/fortify-string.h:54:29: warning: '__builtin_memcpy' forming offset [106, 107] is out
     of the bounds [0, 106] [-Warray-bounds]
       54 | #define __underlying_memcpy __builtin_memcpy
          |                             ^
    ./include/linux/fortify-string.h:417:2: note: in expansion of macro '__underlying_memcpy'
      417 |  __underlying_##op(p, q, __fortify_size);   \
          |  ^~~~~~~~~~~~~
    ./include/linux/fortify-string.h:463:26: note: in expansion of macro '__fortify_memcpy_chk'
      463 | #define memcpy(p, q, s)  __fortify_memcpy_chk(p, q, s,   \
          |                          ^~~~~~~~~~~~~~~~~~~~
    drivers/staging/rts5208/rtsx_scsi.c:2851:3: note: in expansion of macro 'memcpy'
     2851 |   memcpy(buf + i, ms_card->raw_sys_info, 96);
          |   ^~~~~~
    
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: linux-staging@lists.linux.dev
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Link: https://lore.kernel.org/r/20210818044252.1533634-1-keescook@chromium.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/staging/rts5208/rtsx_scsi.c b/drivers/staging/rts5208/rtsx_scsi.c
index c9a6d97938f6..68889d082c3c 100644
--- a/drivers/staging/rts5208/rtsx_scsi.c
+++ b/drivers/staging/rts5208/rtsx_scsi.c
@@ -2841,10 +2841,10 @@ static int get_ms_information(struct scsi_cmnd *srb, struct rtsx_chip *chip)
 	}
 
 	if (dev_info_id == 0x15) {
-		buf_len = 0x3A;
+		buf_len = 0x3C;
 		data_len = 0x3A;
 	} else {
-		buf_len = 0x6A;
+		buf_len = 0x6C;
 		data_len = 0x6A;
 	}
 
@@ -2895,11 +2895,7 @@ static int get_ms_information(struct scsi_cmnd *srb, struct rtsx_chip *chip)
 	}
 
 	rtsx_stor_set_xfer_buf(buf, buf_len, srb);
-
-	if (dev_info_id == 0x15)
-		scsi_set_resid(srb, scsi_bufflen(srb) - 0x3C);
-	else
-		scsi_set_resid(srb, scsi_bufflen(srb) - 0x6C);
+	scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
 
 	kfree(buf);
 	return STATUS_SUCCESS;

commit 3dbfde73fb4635c8aab6121309617f99fd114350
Author: J. Bruce Fields <bfields@redhat.com>
Date:   Thu Aug 12 16:41:42 2021 -0400

    rpc: fix gss_svc_init cleanup on failure
    
    [ Upstream commit 5a4753446253a427c0ff1e433b9c4933e5af207c ]
    
    The failure case here should be rare, but it's obviously wrong.
    
    Signed-off-by: J. Bruce Fields <bfields@redhat.com>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c
index a85d78d2bdb7..d9d03881e4de 100644
--- a/net/sunrpc/auth_gss/svcauth_gss.c
+++ b/net/sunrpc/auth_gss/svcauth_gss.c
@@ -1914,7 +1914,7 @@ gss_svc_init_net(struct net *net)
 		goto out2;
 	return 0;
 out2:
-	destroy_use_gss_proxy_proc_entry(net);
+	rsi_cache_destroy_net(net);
 out1:
 	rsc_cache_destroy_net(net);
 	return rv;

commit 6b0d36222fd99ffb077a7fb5bbc3a5902191e5cc
Author: Luke Hsiao <lukehsiao@google.com>
Date:   Mon Aug 16 20:51:06 2021 +0000

    tcp: enable data-less, empty-cookie SYN with TFO_SERVER_COOKIE_NOT_REQD
    
    [ Upstream commit e3faa49bcecdfcc80e94dd75709d6acb1a5d89f6 ]
    
    Since the original TFO server code was implemented in commit
    168a8f58059a22feb9e9a2dcc1b8053dbbbc12ef ("tcp: TCP Fast Open Server -
    main code path") the TFO server code has supported the sysctl bit flag
    TFO_SERVER_COOKIE_NOT_REQD. Currently, when the TFO_SERVER_ENABLE and
    TFO_SERVER_COOKIE_NOT_REQD sysctl bit flags are set, a server connection
    will accept a SYN with N bytes of data (N > 0) that has no TFO cookie,
    create a new fast open connection, process the incoming data in the SYN,
    and make the connection ready for accepting. After accepting, the
    connection is ready for read()/recvmsg() to read the N bytes of data in
    the SYN, ready for write()/sendmsg() calls and data transmissions to
    transmit data.
    
    This commit changes an edge case in this feature by changing this
    behavior to apply to (N >= 0) bytes of data in the SYN rather than only
    (N > 0) bytes of data in the SYN. Now, a server will accept a data-less
    SYN without a TFO cookie if TFO_SERVER_COOKIE_NOT_REQD is set.
    
    Caveat! While this enables a new kind of TFO (data-less empty-cookie
    SYN), some firewall rules setup may not work if they assume such packets
    are not legit TFOs and will filter them.
    
    Signed-off-by: Luke Hsiao <lukehsiao@google.com>
    Acked-by: Neal Cardwell <ncardwell@google.com>
    Acked-by: Yuchung Cheng <ycheng@google.com>
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Link: https://lore.kernel.org/r/20210816205105.2533289-1-luke.w.hsiao@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv4/tcp_fastopen.c b/net/ipv4/tcp_fastopen.c
index 2ab371f55525..119d2c2f3b04 100644
--- a/net/ipv4/tcp_fastopen.c
+++ b/net/ipv4/tcp_fastopen.c
@@ -342,8 +342,7 @@ struct sock *tcp_try_fastopen(struct sock *sk, struct sk_buff *skb,
 		return NULL;
 	}
 
-	if (syn_data &&
-	    tcp_fastopen_no_cookie(sk, dst, TFO_SERVER_COOKIE_NOT_REQD))
+	if (tcp_fastopen_no_cookie(sk, dst, TFO_SERVER_COOKIE_NOT_REQD))
 		goto fastopen;
 
 	if (foc->len >= 0 &&  /* Client presents or requests a cookie */

commit 5595ae08d6c23505b090f8eb3e8ef0270aa8c1c5
Author: Ulrich Hecht <uli+renesas@fpond.eu>
Date:   Mon Aug 16 18:22:01 2021 +0200

    serial: sh-sci: fix break handling for sysrq
    
    [ Upstream commit 87b8061bad9bd4b549b2daf36ffbaa57be2789a2 ]
    
    This fixes two issues that cause the sysrq sequence to be inadvertently
    aborted on SCIF serial consoles:
    
    - a NUL character remains in the RX queue after a break has been detected,
      which is then passed on to uart_handle_sysrq_char()
    - the break interrupt is handled twice on controllers with multiplexed ERI
      and BRI interrupts
    
    Signed-off-by: Ulrich Hecht <uli+renesas@fpond.eu>
    Link: https://lore.kernel.org/r/20210816162201.28801-1-uli+renesas@fpond.eu
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
index db5b11879910..6f44c5f0ef3a 100644
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@ -1750,6 +1750,10 @@ static irqreturn_t sci_br_interrupt(int irq, void *ptr)
 
 	/* Handle BREAKs */
 	sci_handle_breaks(port);
+
+	/* drop invalid character received before break was detected */
+	serial_port_in(port, SCxRDR);
+
 	sci_clear_SCxSR(port, SCxSR_BREAK_CLEAR(port));
 
 	return IRQ_HANDLED;
@@ -1829,7 +1833,8 @@ static irqreturn_t sci_mpxed_interrupt(int irq, void *ptr)
 		ret = sci_er_interrupt(irq, ptr);
 
 	/* Break Interrupt */
-	if ((ssr_status & SCxSR_BRK(port)) && err_enabled)
+	if (s->irqs[SCIx_ERI_IRQ] != s->irqs[SCIx_BRI_IRQ] &&
+	    (ssr_status & SCxSR_BRK(port)) && err_enabled)
 		ret = sci_br_interrupt(irq, ptr);
 
 	/* Overrun Interrupt */

commit 3dde8baefcececdd6f6369ea3e91d8e6ed15cd66
Author: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Date:   Wed Aug 11 16:20:15 2021 -0700

    Bluetooth: Fix handling of LE Enhanced Connection Complete
    
    [ Upstream commit cafae4cd625502f65d1798659c1aa9b62d38cc56 ]
    
    LE Enhanced Connection Complete contains the Local RPA used in the
    connection which must be used when set otherwise there could problems
    when pairing since the address used by the remote stack could be the
    Local RPA:
    
    BLUETOOTH CORE SPECIFICATION Version 5.2 | Vol 4, Part E
    page 2396
    
      'Resolvable Private Address being used by the local device for this
      connection. This is only valid when the Own_Address_Type (from the
      HCI_LE_Create_Connection, HCI_LE_Set_Advertising_Parameters,
      HCI_LE_Set_Extended_Advertising_Parameters, or
      HCI_LE_Extended_Create_Connection commands) is set to 0x02 or
      0x03, and the Controller generated a resolvable private address for the
      local device using a non-zero local IRK. For other Own_Address_Type
      values, the Controller shall return all zeros.'
    
    Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 714a45355610..937cada5595e 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -4801,9 +4801,64 @@ static void hci_disconn_phylink_complete_evt(struct hci_dev *hdev,
 }
 #endif
 
+static void le_conn_update_addr(struct hci_conn *conn, bdaddr_t *bdaddr,
+				u8 bdaddr_type, bdaddr_t *local_rpa)
+{
+	if (conn->out) {
+		conn->dst_type = bdaddr_type;
+		conn->resp_addr_type = bdaddr_type;
+		bacpy(&conn->resp_addr, bdaddr);
+
+		/* Check if the controller has set a Local RPA then it must be
+		 * used instead or hdev->rpa.
+		 */
+		if (local_rpa && bacmp(local_rpa, BDADDR_ANY)) {
+			conn->init_addr_type = ADDR_LE_DEV_RANDOM;
+			bacpy(&conn->init_addr, local_rpa);
+		} else if (hci_dev_test_flag(conn->hdev, HCI_PRIVACY)) {
+			conn->init_addr_type = ADDR_LE_DEV_RANDOM;
+			bacpy(&conn->init_addr, &conn->hdev->rpa);
+		} else {
+			hci_copy_identity_address(conn->hdev, &conn->init_addr,
+						  &conn->init_addr_type);
+		}
+	} else {
+		conn->resp_addr_type = conn->hdev->adv_addr_type;
+		/* Check if the controller has set a Local RPA then it must be
+		 * used instead or hdev->rpa.
+		 */
+		if (local_rpa && bacmp(local_rpa, BDADDR_ANY)) {
+			conn->resp_addr_type = ADDR_LE_DEV_RANDOM;
+			bacpy(&conn->resp_addr, local_rpa);
+		} else if (conn->hdev->adv_addr_type == ADDR_LE_DEV_RANDOM) {
+			/* In case of ext adv, resp_addr will be updated in
+			 * Adv Terminated event.
+			 */
+			if (!ext_adv_capable(conn->hdev))
+				bacpy(&conn->resp_addr,
+				      &conn->hdev->random_addr);
+		} else {
+			bacpy(&conn->resp_addr, &conn->hdev->bdaddr);
+		}
+
+		conn->init_addr_type = bdaddr_type;
+		bacpy(&conn->init_addr, bdaddr);
+
+		/* For incoming connections, set the default minimum
+		 * and maximum connection interval. They will be used
+		 * to check if the parameters are in range and if not
+		 * trigger the connection update procedure.
+		 */
+		conn->le_conn_min_interval = conn->hdev->le_conn_min_interval;
+		conn->le_conn_max_interval = conn->hdev->le_conn_max_interval;
+	}
+}
+
 static void le_conn_complete_evt(struct hci_dev *hdev, u8 status,
-			bdaddr_t *bdaddr, u8 bdaddr_type, u8 role, u16 handle,
-			u16 interval, u16 latency, u16 supervision_timeout)
+				 bdaddr_t *bdaddr, u8 bdaddr_type,
+				 bdaddr_t *local_rpa, u8 role, u16 handle,
+				 u16 interval, u16 latency,
+				 u16 supervision_timeout)
 {
 	struct hci_conn_params *params;
 	struct hci_conn *conn;
@@ -4851,32 +4906,7 @@ static void le_conn_complete_evt(struct hci_dev *hdev, u8 status,
 		cancel_delayed_work(&conn->le_conn_timeout);
 	}
 
-	if (!conn->out) {
-		/* Set the responder (our side) address type based on
-		 * the advertising address type.
-		 */
-		conn->resp_addr_type = hdev->adv_addr_type;
-		if (hdev->adv_addr_type == ADDR_LE_DEV_RANDOM) {
-			/* In case of ext adv, resp_addr will be updated in
-			 * Adv Terminated event.
-			 */
-			if (!ext_adv_capable(hdev))
-				bacpy(&conn->resp_addr, &hdev->random_addr);
-		} else {
-			bacpy(&conn->resp_addr, &hdev->bdaddr);
-		}
-
-		conn->init_addr_type = bdaddr_type;
-		bacpy(&conn->init_addr, bdaddr);
-
-		/* For incoming connections, set the default minimum
-		 * and maximum connection interval. They will be used
-		 * to check if the parameters are in range and if not
-		 * trigger the connection update procedure.
-		 */
-		conn->le_conn_min_interval = hdev->le_conn_min_interval;
-		conn->le_conn_max_interval = hdev->le_conn_max_interval;
-	}
+	le_conn_update_addr(conn, bdaddr, bdaddr_type, local_rpa);
 
 	/* Lookup the identity address from the stored connection
 	 * address and address type.
@@ -4974,7 +5004,7 @@ static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
 	BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
 
 	le_conn_complete_evt(hdev, ev->status, &ev->bdaddr, ev->bdaddr_type,
-			     ev->role, le16_to_cpu(ev->handle),
+			     NULL, ev->role, le16_to_cpu(ev->handle),
 			     le16_to_cpu(ev->interval),
 			     le16_to_cpu(ev->latency),
 			     le16_to_cpu(ev->supervision_timeout));
@@ -4988,7 +5018,7 @@ static void hci_le_enh_conn_complete_evt(struct hci_dev *hdev,
 	BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
 
 	le_conn_complete_evt(hdev, ev->status, &ev->bdaddr, ev->bdaddr_type,
-			     ev->role, le16_to_cpu(ev->handle),
+			     &ev->local_rpa, ev->role, le16_to_cpu(ev->handle),
 			     le16_to_cpu(ev->interval),
 			     le16_to_cpu(ev->latency),
 			     le16_to_cpu(ev->supervision_timeout));
@@ -5019,7 +5049,8 @@ static void hci_le_ext_adv_term_evt(struct hci_dev *hdev, struct sk_buff *skb)
 	if (conn) {
 		struct adv_info *adv_instance;
 
-		if (hdev->adv_addr_type != ADDR_LE_DEV_RANDOM)
+		if (hdev->adv_addr_type != ADDR_LE_DEV_RANDOM ||
+		    bacmp(&conn->resp_addr, BDADDR_ANY))
 			return;
 
 		if (!hdev->cur_adv_instance) {

commit b80cfef360839ccccf70a2813efc464bdb2b8664
Author: Andreas Obergschwandtner <andreas.obergschwandtner@gmail.com>
Date:   Thu Jul 29 16:42:26 2021 +0200

    ARM: tegra: tamonten: Fix UART pad setting
    
    [ Upstream commit 2270ad2f4e123336af685ecedd1618701cb4ca1e ]
    
    This patch fixes the tristate and pullup configuration for UART 1 to 3
    on the Tamonten SOM.
    
    Signed-off-by: Andreas Obergschwandtner <andreas.obergschwandtner@gmail.com>
    Signed-off-by: Thierry Reding <treding@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/tegra20-tamonten.dtsi b/arch/arm/boot/dts/tegra20-tamonten.dtsi
index 20137fc578b1..394a6b4dc69d 100644
--- a/arch/arm/boot/dts/tegra20-tamonten.dtsi
+++ b/arch/arm/boot/dts/tegra20-tamonten.dtsi
@@ -185,8 +185,9 @@
 				nvidia,pins = "ata", "atb", "atc", "atd", "ate",
 					"cdev1", "cdev2", "dap1", "dtb", "gma",
 					"gmb", "gmc", "gmd", "gme", "gpu7",
-					"gpv", "i2cp", "pta", "rm", "slxa",
-					"slxk", "spia", "spib", "uac";
+					"gpv", "i2cp", "irrx", "irtx", "pta",
+					"rm", "slxa", "slxk", "spia", "spib",
+					"uac";
 				nvidia,pull = <TEGRA_PIN_PULL_NONE>;
 				nvidia,tristate = <TEGRA_PIN_DISABLE>;
 			};
@@ -211,7 +212,7 @@
 			conf_ddc {
 				nvidia,pins = "ddc", "dta", "dtd", "kbca",
 					"kbcb", "kbcc", "kbcd", "kbce", "kbcf",
-					"sdc";
+					"sdc", "uad", "uca";
 				nvidia,pull = <TEGRA_PIN_PULL_UP>;
 				nvidia,tristate = <TEGRA_PIN_DISABLE>;
 			};
@@ -221,10 +222,9 @@
 					"lvp0", "owc", "sdb";
 				nvidia,tristate = <TEGRA_PIN_ENABLE>;
 			};
-			conf_irrx {
-				nvidia,pins = "irrx", "irtx", "sdd", "spic",
-					"spie", "spih", "uaa", "uab", "uad",
-					"uca", "ucb";
+			conf_sdd {
+				nvidia,pins = "sdd", "spic", "spie", "spih",
+					"uaa", "uab", "ucb";
 				nvidia,pull = <TEGRA_PIN_PULL_UP>;
 				nvidia,tristate = <TEGRA_PIN_ENABLE>;
 			};

commit 563db83b10ec3dbd66fdd44bcb3f80f0fc6689f2
Author: Tuo Li <islituo@gmail.com>
Date:   Wed Aug 11 04:34:58 2021 -0700

    gpu: drm: amd: amdgpu: amdgpu_i2c: fix possible uninitialized-variable access in amdgpu_i2c_router_select_ddc_port()
    
    [ Upstream commit a211260c34cfadc6068fece8c9e99e0fe1e2a2b6 ]
    
    The variable val is declared without initialization, and its address is
    passed to amdgpu_i2c_get_byte(). In this function, the value of val is
    accessed in:
      DRM_DEBUG("i2c 0x%02x 0x%02x read failed\n",
           addr, *val);
    
    Also, when amdgpu_i2c_get_byte() returns, val may remain uninitialized,
    but it is accessed in:
      val &= ~amdgpu_connector->router.ddc_mux_control_pin;
    
    To fix this possible uninitialized-variable access, initialize val to 0 in
    amdgpu_i2c_router_select_ddc_port().
    
    Reported-by: TOTE Robot <oslab@tsinghua.edu.cn>
    Signed-off-by: Tuo Li <islituo@gmail.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.c
index f2739995c335..199eccee0b0b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.c
@@ -338,7 +338,7 @@ static void amdgpu_i2c_put_byte(struct amdgpu_i2c_chan *i2c_bus,
 void
 amdgpu_i2c_router_select_ddc_port(const struct amdgpu_connector *amdgpu_connector)
 {
-	u8 val;
+	u8 val = 0;
 
 	if (!amdgpu_connector->router.ddc_valid)
 		return;

commit 3f7b869c1b44108a8cbf3e4a763ddac9df548d73
Author: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
Date:   Tue Aug 10 12:14:06 2021 +0800

    Bluetooth: avoid circular locks in sco_sock_connect
    
    [ Upstream commit 734bc5ff783115aa3164f4e9dd5967ae78e0a8ab ]
    
    In a future patch, calls to bh_lock_sock in sco.c should be replaced
    by lock_sock now that none of the functions are run in IRQ context.
    
    However, doing so results in a circular locking dependency:
    
    ======================================================
    WARNING: possible circular locking dependency detected
    5.14.0-rc4-syzkaller #0 Not tainted
    ------------------------------------------------------
    syz-executor.2/14867 is trying to acquire lock:
    ffff88803e3c1120 (sk_lock-AF_BLUETOOTH-BTPROTO_SCO){+.+.}-{0:0}, at:
    lock_sock include/net/sock.h:1613 [inline]
    ffff88803e3c1120 (sk_lock-AF_BLUETOOTH-BTPROTO_SCO){+.+.}-{0:0}, at:
    sco_conn_del+0x12a/0x2a0 net/bluetooth/sco.c:191
    
    but task is already holding lock:
    ffffffff8d2dc7c8 (hci_cb_list_lock){+.+.}-{3:3}, at:
    hci_disconn_cfm include/net/bluetooth/hci_core.h:1497 [inline]
    ffffffff8d2dc7c8 (hci_cb_list_lock){+.+.}-{3:3}, at:
    hci_conn_hash_flush+0xda/0x260 net/bluetooth/hci_conn.c:1608
    
    which lock already depends on the new lock.
    
    the existing dependency chain (in reverse order) is:
    
    -> #2 (hci_cb_list_lock){+.+.}-{3:3}:
           __mutex_lock_common kernel/locking/mutex.c:959 [inline]
           __mutex_lock+0x12a/0x10a0 kernel/locking/mutex.c:1104
           hci_connect_cfm include/net/bluetooth/hci_core.h:1482 [inline]
           hci_remote_features_evt net/bluetooth/hci_event.c:3263 [inline]
           hci_event_packet+0x2f4d/0x7c50 net/bluetooth/hci_event.c:6240
           hci_rx_work+0x4f8/0xd30 net/bluetooth/hci_core.c:5122
           process_one_work+0x98d/0x1630 kernel/workqueue.c:2276
           worker_thread+0x658/0x11f0 kernel/workqueue.c:2422
           kthread+0x3e5/0x4d0 kernel/kthread.c:319
           ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:295
    
    -> #1 (&hdev->lock){+.+.}-{3:3}:
           __mutex_lock_common kernel/locking/mutex.c:959 [inline]
           __mutex_lock+0x12a/0x10a0 kernel/locking/mutex.c:1104
           sco_connect net/bluetooth/sco.c:245 [inline]
           sco_sock_connect+0x227/0xa10 net/bluetooth/sco.c:601
           __sys_connect_file+0x155/0x1a0 net/socket.c:1879
           __sys_connect+0x161/0x190 net/socket.c:1896
           __do_sys_connect net/socket.c:1906 [inline]
           __se_sys_connect net/socket.c:1903 [inline]
           __x64_sys_connect+0x6f/0xb0 net/socket.c:1903
           do_syscall_x64 arch/x86/entry/common.c:50 [inline]
           do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80
           entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    -> #0 (sk_lock-AF_BLUETOOTH-BTPROTO_SCO){+.+.}-{0:0}:
           check_prev_add kernel/locking/lockdep.c:3051 [inline]
           check_prevs_add kernel/locking/lockdep.c:3174 [inline]
           validate_chain kernel/locking/lockdep.c:3789 [inline]
           __lock_acquire+0x2a07/0x54a0 kernel/locking/lockdep.c:5015
           lock_acquire kernel/locking/lockdep.c:5625 [inline]
           lock_acquire+0x1ab/0x510 kernel/locking/lockdep.c:5590
           lock_sock_nested+0xca/0x120 net/core/sock.c:3170
           lock_sock include/net/sock.h:1613 [inline]
           sco_conn_del+0x12a/0x2a0 net/bluetooth/sco.c:191
           sco_disconn_cfm+0x71/0xb0 net/bluetooth/sco.c:1202
           hci_disconn_cfm include/net/bluetooth/hci_core.h:1500 [inline]
           hci_conn_hash_flush+0x127/0x260 net/bluetooth/hci_conn.c:1608
           hci_dev_do_close+0x528/0x1130 net/bluetooth/hci_core.c:1778
           hci_unregister_dev+0x1c0/0x5a0 net/bluetooth/hci_core.c:4015
           vhci_release+0x70/0xe0 drivers/bluetooth/hci_vhci.c:340
           __fput+0x288/0x920 fs/file_table.c:280
           task_work_run+0xdd/0x1a0 kernel/task_work.c:164
           exit_task_work include/linux/task_work.h:32 [inline]
           do_exit+0xbd4/0x2a60 kernel/exit.c:825
           do_group_exit+0x125/0x310 kernel/exit.c:922
           get_signal+0x47f/0x2160 kernel/signal.c:2808
           arch_do_signal_or_restart+0x2a9/0x1c40 arch/x86/kernel/signal.c:865
           handle_signal_work kernel/entry/common.c:148 [inline]
           exit_to_user_mode_loop kernel/entry/common.c:172 [inline]
           exit_to_user_mode_prepare+0x17d/0x290 kernel/entry/common.c:209
           __syscall_exit_to_user_mode_work kernel/entry/common.c:291 [inline]
           syscall_exit_to_user_mode+0x19/0x60 kernel/entry/common.c:302
           ret_from_fork+0x15/0x30 arch/x86/entry/entry_64.S:288
    
    other info that might help us debug this:
    
    Chain exists of:
      sk_lock-AF_BLUETOOTH-BTPROTO_SCO --> &hdev->lock --> hci_cb_list_lock
    
     Possible unsafe locking scenario:
    
           CPU0                    CPU1
           ----                    ----
      lock(hci_cb_list_lock);
                                   lock(&hdev->lock);
                                   lock(hci_cb_list_lock);
      lock(sk_lock-AF_BLUETOOTH-BTPROTO_SCO);
    
     *** DEADLOCK ***
    
    The issue is that the lock hierarchy should go from &hdev->lock -->
    hci_cb_list_lock --> sk_lock-AF_BLUETOOTH-BTPROTO_SCO. For example,
    one such call trace is:
    
      hci_dev_do_close():
        hci_dev_lock();
        hci_conn_hash_flush():
          hci_disconn_cfm():
            mutex_lock(&hci_cb_list_lock);
            sco_disconn_cfm():
            sco_conn_del():
              lock_sock(sk);
    
    However, in sco_sock_connect, we call lock_sock before calling
    hci_dev_lock inside sco_connect, thus inverting the lock hierarchy.
    
    We fix this by pulling the call to hci_dev_lock out from sco_connect.
    
    Signed-off-by: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
    Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
index 3b3d3ef52ac2..007a01b08dbe 100644
--- a/net/bluetooth/sco.c
+++ b/net/bluetooth/sco.c
@@ -234,44 +234,32 @@ static int sco_chan_add(struct sco_conn *conn, struct sock *sk,
 	return err;
 }
 
-static int sco_connect(struct sock *sk)
+static int sco_connect(struct hci_dev *hdev, struct sock *sk)
 {
 	struct sco_conn *conn;
 	struct hci_conn *hcon;
-	struct hci_dev  *hdev;
 	int err, type;
 
 	BT_DBG("%pMR -> %pMR", &sco_pi(sk)->src, &sco_pi(sk)->dst);
 
-	hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, BDADDR_BREDR);
-	if (!hdev)
-		return -EHOSTUNREACH;
-
-	hci_dev_lock(hdev);
-
 	if (lmp_esco_capable(hdev) && !disable_esco)
 		type = ESCO_LINK;
 	else
 		type = SCO_LINK;
 
 	if (sco_pi(sk)->setting == BT_VOICE_TRANSPARENT &&
-	    (!lmp_transp_capable(hdev) || !lmp_esco_capable(hdev))) {
-		err = -EOPNOTSUPP;
-		goto done;
-	}
+	    (!lmp_transp_capable(hdev) || !lmp_esco_capable(hdev)))
+		return -EOPNOTSUPP;
 
 	hcon = hci_connect_sco(hdev, type, &sco_pi(sk)->dst,
 			       sco_pi(sk)->setting);
-	if (IS_ERR(hcon)) {
-		err = PTR_ERR(hcon);
-		goto done;
-	}
+	if (IS_ERR(hcon))
+		return PTR_ERR(hcon);
 
 	conn = sco_conn_add(hcon);
 	if (!conn) {
 		hci_conn_drop(hcon);
-		err = -ENOMEM;
-		goto done;
+		return -ENOMEM;
 	}
 
 	/* Update source addr of the socket */
@@ -279,7 +267,7 @@ static int sco_connect(struct sock *sk)
 
 	err = sco_chan_add(conn, sk, NULL);
 	if (err)
-		goto done;
+		return err;
 
 	if (hcon->state == BT_CONNECTED) {
 		sco_sock_clear_timer(sk);
@@ -289,9 +277,6 @@ static int sco_connect(struct sock *sk)
 		sco_sock_set_timer(sk, sk->sk_sndtimeo);
 	}
 
-done:
-	hci_dev_unlock(hdev);
-	hci_dev_put(hdev);
 	return err;
 }
 
@@ -573,6 +558,7 @@ static int sco_sock_connect(struct socket *sock, struct sockaddr *addr, int alen
 {
 	struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
 	struct sock *sk = sock->sk;
+	struct hci_dev  *hdev;
 	int err;
 
 	BT_DBG("sk %p", sk);
@@ -587,12 +573,19 @@ static int sco_sock_connect(struct socket *sock, struct sockaddr *addr, int alen
 	if (sk->sk_type != SOCK_SEQPACKET)
 		return -EINVAL;
 
+	hdev = hci_get_route(&sa->sco_bdaddr, &sco_pi(sk)->src, BDADDR_BREDR);
+	if (!hdev)
+		return -EHOSTUNREACH;
+	hci_dev_lock(hdev);
+
 	lock_sock(sk);
 
 	/* Set destination address and psm */
 	bacpy(&sco_pi(sk)->dst, &sa->sco_bdaddr);
 
-	err = sco_connect(sk);
+	err = sco_connect(hdev, sk);
+	hci_dev_unlock(hdev);
+	hci_dev_put(hdev);
 	if (err)
 		goto done;
 

commit 48669c81a65628ef234cbdd91b9395952c7c27fe
Author: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
Date:   Tue Aug 10 12:14:05 2021 +0800

    Bluetooth: schedule SCO timeouts with delayed_work
    
    [ Upstream commit ba316be1b6a00db7126ed9a39f9bee434a508043 ]
    
    struct sock.sk_timer should be used as a sock cleanup timer. However,
    SCO uses it to implement sock timeouts.
    
    This causes issues because struct sock.sk_timer's callback is run in
    an IRQ context, and the timer callback function sco_sock_timeout takes
    a spin lock on the socket. However, other functions such as
    sco_conn_del and sco_conn_ready take the spin lock with interrupts
    enabled.
    
    This inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} lock usage could
    lead to deadlocks as reported by Syzbot [1]:
           CPU0
           ----
      lock(slock-AF_BLUETOOTH-BTPROTO_SCO);
      <Interrupt>
        lock(slock-AF_BLUETOOTH-BTPROTO_SCO);
    
    To fix this, we use delayed work to implement SCO sock timouts
    instead. This allows us to avoid taking the spin lock on the socket in
    an IRQ context, and corrects the misuse of struct sock.sk_timer.
    
    As a note, cancel_delayed_work is used instead of
    cancel_delayed_work_sync in sco_sock_set_timer and
    sco_sock_clear_timer to avoid a deadlock. In the future, the call to
    bh_lock_sock inside sco_sock_timeout should be changed to lock_sock to
    synchronize with other functions using lock_sock. However, since
    sco_sock_set_timer and sco_sock_clear_timer are sometimes called under
    the locked socket (in sco_connect and __sco_sock_close),
    cancel_delayed_work_sync might cause them to sleep until an
    sco_sock_timeout that has started finishes running. But
    sco_sock_timeout would also sleep until it can grab the lock_sock.
    
    Using cancel_delayed_work is fine because sco_sock_timeout does not
    change from run to run, hence there is no functional difference
    between:
    1. waiting for a timeout to finish running before scheduling another
    timeout
    2. scheduling another timeout while a timeout is running.
    
    Link: https://syzkaller.appspot.com/bug?id=9089d89de0502e120f234ca0fc8a703f7368b31e [1]
    Reported-by: syzbot+2f6d7c28bb4bf7e82060@syzkaller.appspotmail.com
    Tested-by: syzbot+2f6d7c28bb4bf7e82060@syzkaller.appspotmail.com
    Signed-off-by: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
    Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
index 2fbea653540b..3b3d3ef52ac2 100644
--- a/net/bluetooth/sco.c
+++ b/net/bluetooth/sco.c
@@ -48,6 +48,8 @@ struct sco_conn {
 	spinlock_t	lock;
 	struct sock	*sk;
 
+	struct delayed_work	timeout_work;
+
 	unsigned int    mtu;
 };
 
@@ -73,9 +75,20 @@ struct sco_pinfo {
 #define SCO_CONN_TIMEOUT	(HZ * 40)
 #define SCO_DISCONN_TIMEOUT	(HZ * 2)
 
-static void sco_sock_timeout(struct timer_list *t)
+static void sco_sock_timeout(struct work_struct *work)
 {
-	struct sock *sk = from_timer(sk, t, sk_timer);
+	struct sco_conn *conn = container_of(work, struct sco_conn,
+					     timeout_work.work);
+	struct sock *sk;
+
+	sco_conn_lock(conn);
+	sk = conn->sk;
+	if (sk)
+		sock_hold(sk);
+	sco_conn_unlock(conn);
+
+	if (!sk)
+		return;
 
 	BT_DBG("sock %p state %d", sk, sk->sk_state);
 
@@ -89,14 +102,21 @@ static void sco_sock_timeout(struct timer_list *t)
 
 static void sco_sock_set_timer(struct sock *sk, long timeout)
 {
+	if (!sco_pi(sk)->conn)
+		return;
+
 	BT_DBG("sock %p state %d timeout %ld", sk, sk->sk_state, timeout);
-	sk_reset_timer(sk, &sk->sk_timer, jiffies + timeout);
+	cancel_delayed_work(&sco_pi(sk)->conn->timeout_work);
+	schedule_delayed_work(&sco_pi(sk)->conn->timeout_work, timeout);
 }
 
 static void sco_sock_clear_timer(struct sock *sk)
 {
+	if (!sco_pi(sk)->conn)
+		return;
+
 	BT_DBG("sock %p state %d", sk, sk->sk_state);
-	sk_stop_timer(sk, &sk->sk_timer);
+	cancel_delayed_work(&sco_pi(sk)->conn->timeout_work);
 }
 
 /* ---- SCO connections ---- */
@@ -176,6 +196,9 @@ static void sco_conn_del(struct hci_conn *hcon, int err)
 		sco_chan_del(sk, err);
 		bh_unlock_sock(sk);
 		sock_put(sk);
+
+		/* Ensure no more work items will run before freeing conn. */
+		cancel_delayed_work_sync(&conn->timeout_work);
 	}
 
 	hcon->sco_data = NULL;
@@ -190,6 +213,8 @@ static void __sco_chan_add(struct sco_conn *conn, struct sock *sk,
 	sco_pi(sk)->conn = conn;
 	conn->sk = sk;
 
+	INIT_DELAYED_WORK(&conn->timeout_work, sco_sock_timeout);
+
 	if (parent)
 		bt_accept_enqueue(parent, sk, true);
 }
@@ -484,8 +509,6 @@ static struct sock *sco_sock_alloc(struct net *net, struct socket *sock,
 
 	sco_pi(sk)->setting = BT_VOICE_CVSD_16BIT;
 
-	timer_setup(&sk->sk_timer, sco_sock_timeout, 0);
-
 	bt_sock_link(&sco_sk_list, sk);
 	return sk;
 }

commit aca58859ee7254f195745d98f33192a008427835
Author: Nathan Chancellor <nathan@kernel.org>
Date:   Fri Aug 6 12:13:40 2021 -0700

    net: ethernet: stmmac: Do not use unreachable() in ipq806x_gmac_probe()
    
    [ Upstream commit 4367355dd90942a71641c98c40c74589c9bddf90 ]
    
    When compiling with clang in certain configurations, an objtool warning
    appears:
    
    drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.o: warning: objtool:
    ipq806x_gmac_probe() falls through to next function phy_modes()
    
    This happens because the unreachable annotation in the third switch
    statement is not eliminated. The compiler should know that the first
    default case would prevent the second and third from being reached as
    the comment notes but sanitizer options can make it harder for the
    compiler to reason this out.
    
    Help the compiler out by eliminating the unreachable() annotation and
    unifying the default case error handling so that there is no objtool
    warning, the meaning of the code stays the same, and there is less
    duplication.
    
    Reported-by: Sami Tolvanen <samitolvanen@google.com>
    Tested-by: Sami Tolvanen <samitolvanen@google.com>
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c
index 0f56f8e33691..03b11f191c26 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c
@@ -288,10 +288,7 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)
 		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 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)
 			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 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)
 				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);
 
@@ -360,6 +353,11 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)
 
 	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);
 

commit e7c14a0ca1d5f59aa7eca0275fecfba47fbfb4bb
Author: Vinod Koul <vkoul@kernel.org>
Date:   Mon Mar 8 11:38:25 2021 +0530

    arm64: dts: qcom: sdm660: use reg value for memory node
    
    [ Upstream commit c81210e38966cfa1c784364e4035081c3227cf5b ]
    
    memory node like other node should be node@reg, which is missing in this
    case, so fix it up
    
    arch/arm64/boot/dts/qcom/ipq8074-hk01.dt.yaml: /: memory: False schema does not allow {'device_type': ['memory'], 'reg': [[0, 1073741824, 0, 536870912]]}
    
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Link: https://lore.kernel.org/r/20210308060826.3074234-18-vkoul@kernel.org
    Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm64/boot/dts/qcom/ipq8074-hk01.dts b/arch/arm64/boot/dts/qcom/ipq8074-hk01.dts
index c13ddee8262b..58acf21d8d33 100644
--- a/arch/arm64/boot/dts/qcom/ipq8074-hk01.dts
+++ b/arch/arm64/boot/dts/qcom/ipq8074-hk01.dts
@@ -28,7 +28,7 @@
 		stdout-path = "serial0";
 	};
 
-	memory {
+	memory@40000000 {
 		device_type = "memory";
 		reg = <0x0 0x40000000 0x0 0x20000000>;
 	};

commit 0214e26442be85a054a1af8bb66db094ba26bc00
Author: Sebastian Reichel <sebastian.reichel@collabora.com>
Date:   Mon Aug 2 19:23:08 2021 +0200

    ARM: dts: imx53-ppd: Fix ACHC entry
    
    [ Upstream commit cd7cd5b716d594e27a933c12f026d4f2426d7bf4 ]
    
    PPD has only one ACHC device, which effectively is a Kinetis
    microcontroller. It has one SPI interface used for normal
    communication. Additionally it's possible to flash the device
    firmware using NXP's EzPort protocol by correctly driving a
    second chip select pin and the device reset pin.
    
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Link: https://lore.kernel.org/r/20210802172309.164365-3-sebastian.reichel@collabora.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/imx53-ppd.dts b/arch/arm/boot/dts/imx53-ppd.dts
index f202396e3f2a..f346673d34ea 100644
--- a/arch/arm/boot/dts/imx53-ppd.dts
+++ b/arch/arm/boot/dts/imx53-ppd.dts
@@ -70,6 +70,12 @@
 		clock-frequency = <11289600>;
 	};
 
+	achc_24M: achc-clock {
+		compatible = "fixed-clock";
+		#clock-cells = <0>;
+		clock-frequency = <24000000>;
+	};
+
 	sgtlsound: sound {
 		compatible = "fsl,imx53-cpuvo-sgtl5000",
 			     "fsl,imx-audio-sgtl5000";
@@ -287,16 +293,13 @@
 		    &gpio4 12 GPIO_ACTIVE_LOW>;
 	status = "okay";
 
-	spidev0: spi@0 {
-		compatible = "ge,achc";
-		reg = <0>;
-		spi-max-frequency = <1000000>;
-	};
-
-	spidev1: spi@1 {
-		compatible = "ge,achc";
-		reg = <1>;
-		spi-max-frequency = <1000000>;
+	spidev0: spi@1 {
+		compatible = "ge,achc", "nxp,kinetis-k20";
+		reg = <1>, <0>;
+		vdd-supply = <&reg_3v3>;
+		vdda-supply = <&reg_3v3>;
+		clocks = <&achc_24M>;
+		reset-gpios = <&gpio3 6 GPIO_ACTIVE_LOW>;
 	};
 
 	gpioxra0: gpio@2 {

commit 264b5301ced2d7c9075b60811ef786989ef97002
Author: Evgeny Novikov <novikov@ispras.ru>
Date:   Wed Jul 28 16:44:32 2021 +0200

    media: tegra-cec: Handle errors of clk_prepare_enable()
    
    [ Upstream commit 38367073c796a37a61549b1f66a71b3adb03802d ]
    
    tegra_cec_probe() and tegra_cec_resume() ignored possible errors of
    clk_prepare_enable(). The patch fixes this.
    
    Found by Linux Driver Verification project (linuxtesting.org).
    
    Signed-off-by: Evgeny Novikov <novikov@ispras.ru>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/platform/tegra-cec/tegra_cec.c b/drivers/media/platform/tegra-cec/tegra_cec.c
index aba488cd0e64..a2c20ca799c4 100644
--- a/drivers/media/platform/tegra-cec/tegra_cec.c
+++ b/drivers/media/platform/tegra-cec/tegra_cec.c
@@ -383,7 +383,11 @@ static int tegra_cec_probe(struct platform_device *pdev)
 		return -ENOENT;
 	}
 
-	clk_prepare_enable(cec->clk);
+	ret = clk_prepare_enable(cec->clk);
+	if (ret) {
+		dev_err(&pdev->dev, "Unable to prepare clock for CEC\n");
+		return ret;
+	}
 
 	/* set context info. */
 	cec->dev = &pdev->dev;
@@ -462,9 +466,7 @@ static int tegra_cec_resume(struct platform_device *pdev)
 
 	dev_notice(&pdev->dev, "Resuming\n");
 
-	clk_prepare_enable(cec->clk);
-
-	return 0;
+	return clk_prepare_enable(cec->clk);
 }
 #endif
 

commit 0f9db592da247dea159e5546b214a63a23e49260
Author: Krzysztof Ha?asa <khalasa@piap.pl>
Date:   Mon Jul 26 12:46:28 2021 +0200

    media: TDA1997x: fix tda1997x_query_dv_timings() return value
    
    [ Upstream commit 7dee1030871a48d4f3c5a74227a4b4188463479a ]
    
    Correctly propagate the tda1997x_detect_std error value.
    
    Signed-off-by: Krzysztof Ha?asa <khalasa@piap.pl>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/i2c/tda1997x.c b/drivers/media/i2c/tda1997x.c
index dab441bbc9f0..4f8dc3f56785 100644
--- a/drivers/media/i2c/tda1997x.c
+++ b/drivers/media/i2c/tda1997x.c
@@ -1695,14 +1695,15 @@ static int tda1997x_query_dv_timings(struct v4l2_subdev *sd,
 				     struct v4l2_dv_timings *timings)
 {
 	struct tda1997x_state *state = to_state(sd);
+	int ret;
 
 	v4l_dbg(1, debug, state->client, "%s\n", __func__);
 	memset(timings, 0, sizeof(struct v4l2_dv_timings));
 	mutex_lock(&state->lock);
-	tda1997x_detect_std(state, timings);
+	ret = tda1997x_detect_std(state, timings);
 	mutex_unlock(&state->lock);
 
-	return 0;
+	return ret;
 }
 
 static const struct v4l2_subdev_video_ops tda1997x_video_ops = {

commit af1913c9f29581360d82ee6f201ab1be7d5e7546
Author: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Date:   Fri Jul 23 10:22:59 2021 +0200

    media: v4l2-dv-timings.c: fix wrong condition in two for-loops
    
    [ Upstream commit 4108b3e6db31acc4c68133290bbcc87d4db905c9 ]
    
    These for-loops should test against v4l2_dv_timings_presets[i].bt.width,
    not if i < v4l2_dv_timings_presets[i].bt.width. Luckily nothing ever broke,
    since the smallest width is still a lot higher than the total number of
    presets, but it is wrong.
    
    The last item in the presets array is all 0, so the for-loop must stop
    when it reaches that sentinel.
    
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Reported-by: Krzysztof Ha?asa <khalasa@piap.pl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/v4l2-core/v4l2-dv-timings.c b/drivers/media/v4l2-core/v4l2-dv-timings.c
index a24b40dfec97..af38c989ff33 100644
--- a/drivers/media/v4l2-core/v4l2-dv-timings.c
+++ b/drivers/media/v4l2-core/v4l2-dv-timings.c
@@ -196,7 +196,7 @@ bool v4l2_find_dv_timings_cap(struct v4l2_dv_timings *t,
 	if (!v4l2_valid_dv_timings(t, cap, fnc, fnc_handle))
 		return false;
 
-	for (i = 0; i < v4l2_dv_timings_presets[i].bt.width; i++) {
+	for (i = 0; v4l2_dv_timings_presets[i].bt.width; i++) {
 		if (v4l2_valid_dv_timings(v4l2_dv_timings_presets + i, cap,
 					  fnc, fnc_handle) &&
 		    v4l2_match_dv_timings(t, v4l2_dv_timings_presets + i,
@@ -218,7 +218,7 @@ bool v4l2_find_dv_timings_cea861_vic(struct v4l2_dv_timings *t, u8 vic)
 {
 	unsigned int i;
 
-	for (i = 0; i < v4l2_dv_timings_presets[i].bt.width; i++) {
+	for (i = 0; v4l2_dv_timings_presets[i].bt.width; i++) {
 		const struct v4l2_bt_timings *bt =
 			&v4l2_dv_timings_presets[i].bt;
 

commit 4c0307b0607e5af0a5c1525085d95069770fadcd
Author: Umang Jain <umang.jain@ideasonboard.com>
Date:   Fri Jul 23 13:22:33 2021 +0200

    media: imx258: Limit the max analogue gain to 480
    
    [ Upstream commit f809665ee75fff3f4ea8907f406a66d380aeb184 ]
    
    The range for analog gain mentioned in the datasheet is [0, 480].
    The real gain formula mentioned in the datasheet is:
    
            Gain = 512 / (512 ??X)
    
    Hence, values larger than 511 clearly makes no sense. The gain
    register field is also documented to be of 9-bits in the datasheet.
    
    Certainly, it is enough to infer that, the kernel driver currently
    advertises an arbitrary analog gain max. Fix it by rectifying the
    value as per the data sheet i.e. 480.
    
    Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>
    Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
    Reviewed-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
    Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/i2c/imx258.c b/drivers/media/i2c/imx258.c
index 68ce63333744..85395813c0f2 100644
--- a/drivers/media/i2c/imx258.c
+++ b/drivers/media/i2c/imx258.c
@@ -46,7 +46,7 @@
 /* Analog gain control */
 #define IMX258_REG_ANALOG_GAIN		0x0204
 #define IMX258_ANA_GAIN_MIN		0
-#define IMX258_ANA_GAIN_MAX		0x1fff
+#define IMX258_ANA_GAIN_MAX		480
 #define IMX258_ANA_GAIN_STEP		1
 #define IMX258_ANA_GAIN_DEFAULT		0x0
 

commit e07928573c48fbee4938592c6af6f86cad659576
Author: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Date:   Fri Jul 23 13:22:32 2021 +0200

    media: imx258: Rectify mismatch of VTS value
    
    [ Upstream commit 51f93add3669f1b1f540de1cf397815afbd4c756 ]
    
    The frame_length_lines (0x0340) registers are hard-coded as follows:
    
    - 4208x3118
      frame_length_lines = 0x0c50
    
    - 2104x1560
      frame_length_lines = 0x0638
    
    - 1048x780
      frame_length_lines = 0x034c
    
    The driver exposes the V4L2_CID_VBLANK control in read-only mode and
    sets its value to vts_def - height, where vts_def is a mode-dependent
    value coming from the supported_modes array. It is set using one of
    the following macros defined in the driver:
    
      #define IMX258_VTS_30FPS                0x0c98
      #define IMX258_VTS_30FPS_2K             0x0638
      #define IMX258_VTS_30FPS_VGA            0x034c
    
    There's a clear mismatch in the value for the full resolution mode i.e.
    IMX258_VTS_30FPS. Fix it by rectifying the macro with the value set for
    the frame_length_lines register as stated above.
    
    Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
    Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>
    Reviewed-by: Bingbu Cao <bingbu.cao@intel.com>
    Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/i2c/imx258.c b/drivers/media/i2c/imx258.c
index 31a1e2294843..68ce63333744 100644
--- a/drivers/media/i2c/imx258.c
+++ b/drivers/media/i2c/imx258.c
@@ -22,7 +22,7 @@
 #define IMX258_CHIP_ID			0x0258
 
 /* V_TIMING internal */
-#define IMX258_VTS_30FPS		0x0c98
+#define IMX258_VTS_30FPS		0x0c50
 #define IMX258_VTS_30FPS_2K		0x0638
 #define IMX258_VTS_30FPS_VGA		0x034c
 #define IMX258_VTS_MAX			0xffff

commit 8923ac1a48f00afff8d534477315e63d025efa30
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Mon Aug 2 16:24:56 2021 +0200

    ASoC: Intel: bytcr_rt5640: Move "Platform Clock" routes to the maps for the matching in-/output
    
    [ Upstream commit dccd1dfd0770bfd494b68d1135b4547b2c602c42 ]
    
    Move the "Platform Clock" routes for the "Internal Mic" and "Speaker"
    routes to the intmic_*_map[] / *_spk_map[] arrays.
    
    This ensures that these "Platform Clock" routes do not get added when the
    BYT_RT5640_NO_INTERNAL_MIC_MAP / BYT_RT5640_NO_SPEAKERS quirks are used.
    
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Acked-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Link: https://lore.kernel.org/r/20210802142501.991985-2-hdegoede@redhat.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c
index 186c0ee059da..c4d19b88d17d 100644
--- a/sound/soc/intel/boards/bytcr_rt5640.c
+++ b/sound/soc/intel/boards/bytcr_rt5640.c
@@ -293,9 +293,6 @@ static const struct snd_soc_dapm_widget byt_rt5640_widgets[] = {
 static const struct snd_soc_dapm_route byt_rt5640_audio_map[] = {
 	{"Headphone", NULL, "Platform Clock"},
 	{"Headset Mic", NULL, "Platform Clock"},
-	{"Internal Mic", NULL, "Platform Clock"},
-	{"Speaker", NULL, "Platform Clock"},
-
 	{"Headset Mic", NULL, "MICBIAS1"},
 	{"IN2P", NULL, "Headset Mic"},
 	{"Headphone", NULL, "HPOL"},
@@ -303,19 +300,23 @@ static const struct snd_soc_dapm_route byt_rt5640_audio_map[] = {
 };
 
 static const struct snd_soc_dapm_route byt_rt5640_intmic_dmic1_map[] = {
+	{"Internal Mic", NULL, "Platform Clock"},
 	{"DMIC1", NULL, "Internal Mic"},
 };
 
 static const struct snd_soc_dapm_route byt_rt5640_intmic_dmic2_map[] = {
+	{"Internal Mic", NULL, "Platform Clock"},
 	{"DMIC2", NULL, "Internal Mic"},
 };
 
 static const struct snd_soc_dapm_route byt_rt5640_intmic_in1_map[] = {
+	{"Internal Mic", NULL, "Platform Clock"},
 	{"Internal Mic", NULL, "MICBIAS1"},
 	{"IN1P", NULL, "Internal Mic"},
 };
 
 static const struct snd_soc_dapm_route byt_rt5640_intmic_in3_map[] = {
+	{"Internal Mic", NULL, "Platform Clock"},
 	{"Internal Mic", NULL, "MICBIAS1"},
 	{"IN3P", NULL, "Internal Mic"},
 };
@@ -357,6 +358,7 @@ static const struct snd_soc_dapm_route byt_rt5640_ssp0_aif2_map[] = {
 };
 
 static const struct snd_soc_dapm_route byt_rt5640_stereo_spk_map[] = {
+	{"Speaker", NULL, "Platform Clock"},
 	{"Speaker", NULL, "SPOLP"},
 	{"Speaker", NULL, "SPOLN"},
 	{"Speaker", NULL, "SPORP"},
@@ -364,6 +366,7 @@ static const struct snd_soc_dapm_route byt_rt5640_stereo_spk_map[] = {
 };
 
 static const struct snd_soc_dapm_route byt_rt5640_mono_spk_map[] = {
+	{"Speaker", NULL, "Platform Clock"},
 	{"Speaker", NULL, "SPOLP"},
 	{"Speaker", NULL, "SPOLN"},
 };

commit 25a35dd83627d33ff4304b656f17928efa339a09
Author: Yufeng Mo <moyufeng@huawei.com>
Date:   Fri Jul 30 10:19:11 2021 +0800

    bonding: 3ad: fix the concurrency between __bond_release_one() and bond_3ad_state_machine_handler()
    
    [ Upstream commit 220ade77452c15ecb1ab94c3f8aaeb6d033c3582 ]
    
    Some time ago, I reported a calltrace issue
    "did not find a suitable aggregator", please see[1].
    After a period of analysis and reproduction, I find
    that this problem is caused by concurrency.
    
    Before the problem occurs, the bond structure is like follows:
    
    bond0 - slaver0(eth0) - agg0.lag_ports -> port0 - port1
                          \
                            port0
          \
            slaver1(eth1) - agg1.lag_ports -> NULL
                          \
                            port1
    
    If we run 'ifenslave bond0 -d eth1', the process is like below:
    
    excuting __bond_release_one()
    |
    bond_upper_dev_unlink()[step1]
    |                       |                       |
    |                       |                       bond_3ad_lacpdu_recv()
    |                       |                       ->bond_3ad_rx_indication()
    |                       |                       spin_lock_bh()
    |                       |                       ->ad_rx_machine()
    |                       |                       ->__record_pdu()[step2]
    |                       |                       spin_unlock_bh()
    |                       |                       |
    |                       bond_3ad_state_machine_handler()
    |                       spin_lock_bh()
    |                       ->ad_port_selection_logic()
    |                       ->try to find free aggregator[step3]
    |                       ->try to find suitable aggregator[step4]
    |                       ->did not find a suitable aggregator[step5]
    |                       spin_unlock_bh()
    |                       |
    |                       |
    bond_3ad_unbind_slave() |
    spin_lock_bh()
    spin_unlock_bh()
    
    step1: already removed slaver1(eth1) from list, but port1 remains
    step2: receive a lacpdu and update port0
    step3: port0 will be removed from agg0.lag_ports. The struct is
           "agg0.lag_ports -> port1" now, and agg0 is not free. At the
               same time, slaver1/agg1 has been removed from the list by step1.
               So we can't find a free aggregator now.
    step4: can't find suitable aggregator because of step2
    step5: cause a calltrace since port->aggregator is NULL
    
    To solve this concurrency problem, put bond_upper_dev_unlink()
    after bond_3ad_unbind_slave(). In this way, we can invalid the port
    first and skip this port in bond_3ad_state_machine_handler(). This
    eliminates the situation that the slaver has been removed from the
    list but the port is still valid.
    
    [1]https://lore.kernel.org/netdev/10374.1611947473@famine/
    
    Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
    Acked-by: Jay Vosburgh <jay.vosburgh@canonical.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index c814b266af79..d6c5f41b17f7 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -1912,7 +1912,6 @@ static int __bond_release_one(struct net_device *bond_dev,
 	/* recompute stats just before removing the slave */
 	bond_get_stats(bond->dev, &bond->bond_stats);
 
-	bond_upper_dev_unlink(bond, slave);
 	/* unregister rx_handler early so bond_handle_frame wouldn't be called
 	 * for this slave anymore.
 	 */
@@ -1921,6 +1920,8 @@ static int __bond_release_one(struct net_device *bond_dev,
 	if (BOND_MODE(bond) == BOND_MODE_8023AD)
 		bond_3ad_unbind_slave(slave);
 
+	bond_upper_dev_unlink(bond, slave);
+
 	if (bond_mode_can_use_xmit_hash(bond))
 		bond_update_slave_arr(bond, slave);
 

commit a2f1874e084dba7ab08da5b7ce363ad6b871c64d
Author: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
Date:   Wed Jul 28 15:51:04 2021 +0800

    Bluetooth: skip invalid hci_sync_conn_complete_evt
    
    [ Upstream commit 92fe24a7db751b80925214ede43f8d2be792ea7b ]
    
    Syzbot reported a corrupted list in kobject_add_internal [1]. This
    happens when multiple HCI_EV_SYNC_CONN_COMPLETE event packets with
    status 0 are sent for the same HCI connection. This causes us to
    register the device more than once which corrupts the kset list.
    
    As this is forbidden behavior, we add a check for whether we're
    trying to process the same HCI_EV_SYNC_CONN_COMPLETE event multiple
    times for one connection. If that's the case, the event is invalid, so
    we report an error that the device is misbehaving, and ignore the
    packet.
    
    Link: https://syzkaller.appspot.com/bug?extid=66264bf2fd0476be7e6c [1]
    Reported-by: syzbot+66264bf2fd0476be7e6c@syzkaller.appspotmail.com
    Tested-by: syzbot+66264bf2fd0476be7e6c@syzkaller.appspotmail.com
    Signed-off-by: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 45cc864cf2b3..714a45355610 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -4083,6 +4083,21 @@ static void hci_sync_conn_complete_evt(struct hci_dev *hdev,
 
 	switch (ev->status) {
 	case 0x00:
+		/* The synchronous connection complete event should only be
+		 * sent once per new connection. Receiving a successful
+		 * complete event when the connection status is already
+		 * BT_CONNECTED means that the device is misbehaving and sent
+		 * multiple complete event packets for the same new connection.
+		 *
+		 * Registering the device more than once can corrupt kernel
+		 * memory, hence upon detecting this invalid event, we report
+		 * an error and ignore the packet.
+		 */
+		if (conn->state == BT_CONNECTED) {
+			bt_dev_err(hdev, "Ignoring connect complete event for existing connection");
+			goto unlock;
+		}
+
 		conn->handle = __le16_to_cpu(ev->handle);
 		conn->state  = BT_CONNECTED;
 		conn->type   = ev->link_type;

commit 4c26ed04be9e390cbd698a4cedcdf42780a3a659
Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date:   Tue Jul 27 15:51:30 2021 +0300

    ata: sata_dwc_460ex: No need to call phy_exit() befre phy_init()
    
    [ Upstream commit 3ad4a31620355358316fa08fcfab37b9d6c33347 ]
    
    Last change to device managed APIs cleaned up error path to simple phy_exit()
    call, which in some cases has been executed with NULL parameter. This per se
    is not a problem, but rather logical misconception: no need to free resource
    when it's for sure has not been allocated yet. Fix the driver accordingly.
    
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Link: https://lore.kernel.org/r/20210727125130.19977-1-andriy.shevchenko@linux.intel.com
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/ata/sata_dwc_460ex.c b/drivers/ata/sata_dwc_460ex.c
index 6f142aa54f5f..8487048c5ec9 100644
--- a/drivers/ata/sata_dwc_460ex.c
+++ b/drivers/ata/sata_dwc_460ex.c
@@ -1253,24 +1253,20 @@ static int sata_dwc_probe(struct platform_device *ofdev)
 	irq = irq_of_parse_and_map(np, 0);
 	if (irq == NO_IRQ) {
 		dev_err(&ofdev->dev, "no SATA DMA irq\n");
-		err = -ENODEV;
-		goto error_out;
+		return -ENODEV;
 	}
 
 #ifdef CONFIG_SATA_DWC_OLD_DMA
 	if (!of_find_property(np, "dmas", NULL)) {
 		err = sata_dwc_dma_init_old(ofdev, hsdev);
 		if (err)
-			goto error_out;
+			return err;
 	}
 #endif
 
 	hsdev->phy = devm_phy_optional_get(hsdev->dev, "sata-phy");
-	if (IS_ERR(hsdev->phy)) {
-		err = PTR_ERR(hsdev->phy);
-		hsdev->phy = NULL;
-		goto error_out;
-	}
+	if (IS_ERR(hsdev->phy))
+		return PTR_ERR(hsdev->phy);
 
 	err = phy_init(hsdev->phy);
 	if (err)

commit 0bf1e421b903f16ddc6289d451f2d2ca7755e54f
Author: Juhee Kang <claudiajkang@gmail.com>
Date:   Tue Jul 27 04:10:55 2021 +0000

    samples: bpf: Fix tracex7 error raised on the missing argument
    
    [ Upstream commit 7d07006f05922b95518be403f08ef8437b67aa32 ]
    
    The current behavior of 'tracex7' doesn't consist with other bpf samples
    tracex{1..6}. Other samples do not require any argument to run with, but
    tracex7 should be run with btrfs device argument. (it should be executed
    with test_override_return.sh)
    
    Currently, tracex7 doesn't have any description about how to run this
    program and raises an unexpected error. And this result might be
    confusing since users might not have a hunch about how to run this
    program.
    
        // Current behavior
        # ./tracex7
        sh: 1: Syntax error: word unexpected (expecting ")")
        // Fixed behavior
        # ./tracex7
        ERROR: Run with the btrfs device argument!
    
    In order to fix this error, this commit adds logic to report a message
    and exit when running this program with a missing argument.
    
    Additionally in test_override_return.sh, there is a problem with
    multiple directory(tmpmnt) creation. So in this commit adds a line with
    removing the directory with every execution.
    
    Signed-off-by: Juhee Kang <claudiajkang@gmail.com>
    Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
    Acked-by: Yonghong Song <yhs@fb.com>
    Link: https://lore.kernel.org/bpf/20210727041056.23455-1-claudiajkang@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/samples/bpf/test_override_return.sh b/samples/bpf/test_override_return.sh
index e68b9ee6814b..35db26f736b9 100755
--- a/samples/bpf/test_override_return.sh
+++ b/samples/bpf/test_override_return.sh
@@ -1,5 +1,6 @@
 #!/bin/bash
 
+rm -r tmpmnt
 rm -f testfile.img
 dd if=/dev/zero of=testfile.img bs=1M seek=1000 count=1
 DEVICE=$(losetup --show -f testfile.img)
diff --git a/samples/bpf/tracex7_user.c b/samples/bpf/tracex7_user.c
index ea6dae78f0df..2ed13e9f3fcb 100644
--- a/samples/bpf/tracex7_user.c
+++ b/samples/bpf/tracex7_user.c
@@ -13,6 +13,11 @@ int main(int argc, char **argv)
 	char command[256];
 	int ret;
 
+	if (!argv[1]) {
+		fprintf(stderr, "ERROR: Run with the btrfs device argument!\n");
+		return 0;
+	}
+
 	snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
 
 	if (load_bpf_file(filename)) {

commit 962ee5d1ff986bbc0f0370337db32fdfc7f2e7ed
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Wed Jul 21 10:45:11 2021 +0200

    staging: ks7010: Fix the initialization of the 'sleep_status' structure
    
    [ Upstream commit 56315e55119c0ea57e142b6efb7c31208628ad86 ]
    
    'sleep_status' has 3 atomic_t members. Initialize the 3 of them instead of
    initializing only 2 of them and setting 0 twice to the same variable.
    
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Link: https://lore.kernel.org/r/d2e52a33a9beab41879551d0ae2fdfc99970adab.1626856991.git.christophe.jaillet@wanadoo.fr
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/staging/ks7010/ks7010_sdio.c b/drivers/staging/ks7010/ks7010_sdio.c
index 74551eb717fc..79d0513bd282 100644
--- a/drivers/staging/ks7010/ks7010_sdio.c
+++ b/drivers/staging/ks7010/ks7010_sdio.c
@@ -938,9 +938,9 @@ static void ks7010_private_init(struct ks_wlan_private *priv,
 	memset(&priv->wstats, 0, sizeof(priv->wstats));
 
 	/* sleep mode */
+	atomic_set(&priv->sleepstatus.status, 0);
 	atomic_set(&priv->sleepstatus.doze_request, 0);
 	atomic_set(&priv->sleepstatus.wakeup_request, 0);
-	atomic_set(&priv->sleepstatus.wakeup_request, 0);
 
 	trx_device_init(priv);
 	hostif_init(priv);

commit cf30a0b8c6425b4d041993671475099315b55278
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon Jul 26 15:07:17 2021 +0200

    serial: 8250_pci: make setup_port() parameters explicitly unsigned
    
    [ Upstream commit 3a96e97ab4e835078e6f27b7e1c0947814df3841 ]
    
    The bar and offset parameters to setup_port() are used in pointer math,
    and while it would be very difficult to get them to wrap as a negative
    number, just be "safe" and make them unsigned so that static checkers do
    not trip over them unintentionally.
    
    Cc: Jiri Slaby <jirislaby@kernel.org>
    Reported-by: Jordy Zomer <jordy@pwning.systems>
    Link: https://lore.kernel.org/r/20210726130717.2052096-1-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c
index 725e5842b8ac..f54c18e4ae90 100644
--- a/drivers/tty/serial/8250/8250_pci.c
+++ b/drivers/tty/serial/8250/8250_pci.c
@@ -70,7 +70,7 @@ static void moan_device(const char *str, struct pci_dev *dev)
 
 static int
 setup_port(struct serial_private *priv, struct uart_8250_port *port,
-	   int bar, int offset, int regshift)
+	   u8 bar, unsigned int offset, int regshift)
 {
 	struct pci_dev *dev = priv->dev;
 

commit 546c8bc6d0d509db71557df2f3dd04dee0973c26
Author: Jiri Slaby <jslaby@suse.cz>
Date:   Fri Jul 23 09:43:11 2021 +0200

    hvsi: don't panic on tty_register_driver failure
    
    [ Upstream commit 7ccbdcc4d08a6d7041e4849219bbb12ffa45db4c ]
    
    The alloc_tty_driver failure is handled gracefully in hvsi_init. But
    tty_register_driver is not. panic is called if that one fails.
    
    So handle the failure of tty_register_driver gracefully too. This will
    keep at least the console functional as it was enabled earlier by
    console_initcall in hvsi_console_init. Instead of shooting down the
    whole system.
    
    This means, we disable interrupts and restore hvsi_wait back to
    poll_for_state().
    
    Cc: linuxppc-dev@lists.ozlabs.org
    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    Link: https://lore.kernel.org/r/20210723074317.32690-3-jslaby@suse.cz
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/hvc/hvsi.c b/drivers/tty/hvc/hvsi.c
index 66f95f758be0..73226337f561 100644
--- a/drivers/tty/hvc/hvsi.c
+++ b/drivers/tty/hvc/hvsi.c
@@ -1038,7 +1038,7 @@ static const struct tty_operations hvsi_ops = {
 
 static int __init hvsi_init(void)
 {
-	int i;
+	int i, ret;
 
 	hvsi_driver = alloc_tty_driver(hvsi_count);
 	if (!hvsi_driver)
@@ -1069,12 +1069,25 @@ static int __init hvsi_init(void)
 	}
 	hvsi_wait = wait_for_state; /* irqs active now */
 
-	if (tty_register_driver(hvsi_driver))
-		panic("Couldn't register hvsi console driver\n");
+	ret = tty_register_driver(hvsi_driver);
+	if (ret) {
+		pr_err("Couldn't register hvsi console driver\n");
+		goto err_free_irq;
+	}
 
 	printk(KERN_DEBUG "HVSI: registered %i devices\n", hvsi_count);
 
 	return 0;
+err_free_irq:
+	hvsi_wait = poll_for_state;
+	for (i = 0; i < hvsi_count; i++) {
+		struct hvsi_struct *hp = &hvsi_ports[i];
+
+		free_irq(hp->virq, hp);
+	}
+	tty_driver_kref_put(hvsi_driver);
+
+	return ret;
 }
 device_initcall(hvsi_init);
 

commit af4e52d6e5a00aea1b12090a609b429f15843b61
Author: Jiri Slaby <jslaby@suse.cz>
Date:   Fri Jul 23 09:43:10 2021 +0200

    xtensa: ISS: don't panic in rs_init
    
    [ Upstream commit 23411c720052ad860b3e579ee4873511e367130a ]
    
    While alloc_tty_driver failure in rs_init would mean we have much bigger
    problem, there is no reason to panic when tty_register_driver fails
    there. It can fail for various reasons.
    
    So handle the failure gracefully. Actually handle them both while at it.
    This will make at least the console functional as it was enabled earlier
    by console_initcall in iss_console_init. Instead of shooting down the
    whole system.
    
    We move tty_port_init() after alloc_tty_driver(), so that we don't need
    to destroy the port in case the latter function fails.
    
    Cc: Chris Zankel <chris@zankel.net>
    Cc: Max Filippov <jcmvbkbc@gmail.com>
    Cc: linux-xtensa@linux-xtensa.org
    Acked-by: Max Filippov <jcmvbkbc@gmail.com>
    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    Link: https://lore.kernel.org/r/20210723074317.32690-2-jslaby@suse.cz
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/xtensa/platforms/iss/console.c b/arch/xtensa/platforms/iss/console.c
index af81a62faba6..e7faea3d73d3 100644
--- a/arch/xtensa/platforms/iss/console.c
+++ b/arch/xtensa/platforms/iss/console.c
@@ -168,9 +168,13 @@ static const struct tty_operations serial_ops = {
 
 int __init rs_init(void)
 {
-	tty_port_init(&serial_port);
+	int ret;
 
 	serial_driver = alloc_tty_driver(SERIAL_MAX_NUM_LINES);
+	if (!serial_driver)
+		return -ENOMEM;
+
+	tty_port_init(&serial_port);
 
 	pr_info("%s %s\n", serial_name, serial_version);
 
@@ -190,8 +194,15 @@ int __init rs_init(void)
 	tty_set_operations(serial_driver, &serial_ops);
 	tty_port_link_device(&serial_port, serial_driver, 0);
 
-	if (tty_register_driver(serial_driver))
-		panic("Couldn't register serial driver\n");
+	ret = tty_register_driver(serial_driver);
+	if (ret) {
+		pr_err("Couldn't register serial driver\n");
+		tty_driver_kref_put(serial_driver);
+		tty_port_destroy(&serial_port);
+
+		return ret;
+	}
+
 	return 0;
 }
 

commit 23ae8901bf008bec310d5c68374a4bf7eec585fa
Author: Maciej W. Rozycki <macro@orcam.me.uk>
Date:   Sat Jun 26 06:11:51 2021 +0200

    serial: 8250: Define RX trigger levels for OxSemi 950 devices
    
    [ Upstream commit d7aff291d069c4418285f3c8ee27b0ff67ce5998 ]
    
    Oxford Semiconductor 950 serial port devices have a 128-byte FIFO and in
    the enhanced (650) mode, which we select in `autoconfig_has_efr' with
    the ECB bit set in the EFR register, they support the receive interrupt
    trigger level selectable with FCR bits 7:6 from the set of 16, 32, 112,
    120.  This applies to the original OX16C950 discrete UART[1] as well as
    950 cores embedded into more complex devices.
    
    For these devices we set the default to 112, which sets an excessively
    high level of 112 or 7/8 of the FIFO capacity, unlike with other port
    types where we choose at most 1/2 of their respective FIFO capacities.
    Additionally we don't make the trigger level configurable.  Consequently
    frequent input overruns happen with high bit rates where hardware flow
    control cannot be used (e.g. terminal applications) even with otherwise
    highly-performant systems.
    
    Lower the default receive interrupt trigger level to 32 then, and make
    it configurable.  Document the trigger levels along with other port
    types, including the set of 16, 32, 64, 112 for the transmit interrupt
    as well[2].
    
    References:
    
    [1] "OX16C950 rev B High Performance UART with 128 byte FIFOs", Oxford
        Semiconductor, Inc., DS-0031, Sep 05, Table 10: "Receiver Trigger
        Levels", p. 22
    
    [2] same, Table 9: "Transmit Interrupt Trigger Levels", p. 22
    
    Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk>
    Link: https://lore.kernel.org/r/alpine.DEB.2.21.2106260608480.37803@angie.orcam.me.uk
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c
index 68f71298c11b..39e821d6e537 100644
--- a/drivers/tty/serial/8250/8250_port.c
+++ b/drivers/tty/serial/8250/8250_port.c
@@ -132,7 +132,8 @@ static const struct serial8250_config uart_config[] = {
 		.name		= "16C950/954",
 		.fifo_size	= 128,
 		.tx_loadsz	= 128,
-		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
+		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01,
+		.rxtrig_bytes	= {16, 32, 112, 120},
 		/* UART_CAP_EFR breaks billionon CF bluetooth card. */
 		.flags		= UART_CAP_FIFO | UART_CAP_SLEEP,
 	},
diff --git a/include/uapi/linux/serial_reg.h b/include/uapi/linux/serial_reg.h
index be07b5470f4b..f51bc8f36813 100644
--- a/include/uapi/linux/serial_reg.h
+++ b/include/uapi/linux/serial_reg.h
@@ -62,6 +62,7 @@
  * ST16C654:	 8  16  56  60		 8  16  32  56	PORT_16654
  * TI16C750:	 1  16  32  56		xx  xx  xx  xx	PORT_16750
  * TI16C752:	 8  16  56  60		 8  16  32  56
+ * OX16C950:	16  32 112 120		16  32  64 112	PORT_16C950
  * Tegra:	 1   4   8  14		16   8   4   1	PORT_TEGRA
  */
 #define UART_FCR_R_TRIG_00	0x00

commit 8dc4b13dae63e643ef6f928ff537bfdc926ba972
Author: Heiko Carstens <hca@linux.ibm.com>
Date:   Mon Jul 12 19:26:01 2021 +0200

    s390/jump_label: print real address in a case of a jump label bug
    
    [ Upstream commit 5492886c14744d239e87f1b0b774b5a341e755cc ]
    
    In case of a jump label print the real address of the piece of code
    where a mismatch was detected. This is right before the system panics,
    so there is nothing revealed.
    
    Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/s390/kernel/jump_label.c b/arch/s390/kernel/jump_label.c
index 68f415e334a5..10009a0cdb37 100644
--- a/arch/s390/kernel/jump_label.c
+++ b/arch/s390/kernel/jump_label.c
@@ -41,7 +41,7 @@ static void jump_label_bug(struct jump_entry *entry, struct insn *expected,
 	unsigned char *ipe = (unsigned char *)expected;
 	unsigned char *ipn = (unsigned char *)new;
 
-	pr_emerg("Jump label code mismatch at %pS [%p]\n", ipc, ipc);
+	pr_emerg("Jump label code mismatch at %pS [%px]\n", ipc, ipc);
 	pr_emerg("Found:    %6ph\n", ipc);
 	pr_emerg("Expected: %6ph\n", ipe);
 	pr_emerg("New:      %6ph\n", ipn);

commit d1ccc70028950c7f04bda737df3a7904c7d52f56
Author: Gustavo A. R. Silva <gustavoars@kernel.org>
Date:   Mon Jul 26 14:25:11 2021 -0500

    flow_dissector: Fix out-of-bounds warnings
    
    [ Upstream commit 323e0cb473e2a8706ff162b6b4f4fa16023c9ba7 ]
    
    Fix the following out-of-bounds warnings:
    
        net/core/flow_dissector.c: In function '__skb_flow_dissect':
    >> net/core/flow_dissector.c:1104:4: warning: 'memcpy' offset [24, 39] from the object at '<unknown>' is out of the bounds of referenced subobject 'saddr' with type 'struct in6_addr' at offset 8 [-Warray-bounds]
         1104 |    memcpy(&key_addrs->v6addrs, &iph->saddr,
              |    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         1105 |           sizeof(key_addrs->v6addrs));
              |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~
        In file included from include/linux/ipv6.h:5,
                         from net/core/flow_dissector.c:6:
        include/uapi/linux/ipv6.h:133:18: note: subobject 'saddr' declared here
          133 |  struct in6_addr saddr;
              |                  ^~~~~
    >> net/core/flow_dissector.c:1059:4: warning: 'memcpy' offset [16, 19] from the object at '<unknown>' is out of the bounds of referenced subobject 'saddr' with type 'unsigned int' at offset 12 [-Warray-bounds]
         1059 |    memcpy(&key_addrs->v4addrs, &iph->saddr,
              |    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         1060 |           sizeof(key_addrs->v4addrs));
              |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~
        In file included from include/linux/ip.h:17,
                         from net/core/flow_dissector.c:5:
        include/uapi/linux/ip.h:103:9: note: subobject 'saddr' declared here
          103 |  __be32 saddr;
              |         ^~~~~
    
    The problem is that the original code is trying to copy data into a
    couple of struct members adjacent to each other in a single call to
    memcpy().  So, the compiler legitimately complains about it. As these
    are just a couple of members, fix this by copying each one of them in
    separate calls to memcpy().
    
    This helps with the ongoing efforts to globally enable -Warray-bounds
    and get us closer to being able to tighten the FORTIFY_SOURCE routines
    on memcpy().
    
    Link: https://github.com/KSPP/linux/issues/109
    Reported-by: kernel test robot <lkp@intel.com>
    Link: https://lore.kernel.org/lkml/d5ae2e65-1f18-2577-246f-bada7eee6ccd@intel.com/
    Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c
index 994dd1520f07..949694c70cbc 100644
--- a/net/core/flow_dissector.c
+++ b/net/core/flow_dissector.c
@@ -694,8 +694,10 @@ bool __skb_flow_dissect(const struct sk_buff *skb,
 							      FLOW_DISSECTOR_KEY_IPV4_ADDRS,
 							      target_container);
 
-			memcpy(&key_addrs->v4addrs, &iph->saddr,
-			       sizeof(key_addrs->v4addrs));
+			memcpy(&key_addrs->v4addrs.src, &iph->saddr,
+			       sizeof(key_addrs->v4addrs.src));
+			memcpy(&key_addrs->v4addrs.dst, &iph->daddr,
+			       sizeof(key_addrs->v4addrs.dst));
 			key_control->addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS;
 		}
 
@@ -744,8 +746,10 @@ bool __skb_flow_dissect(const struct sk_buff *skb,
 							      FLOW_DISSECTOR_KEY_IPV6_ADDRS,
 							      target_container);
 
-			memcpy(&key_addrs->v6addrs, &iph->saddr,
-			       sizeof(key_addrs->v6addrs));
+			memcpy(&key_addrs->v6addrs.src, &iph->saddr,
+			       sizeof(key_addrs->v6addrs.src));
+			memcpy(&key_addrs->v6addrs.dst, &iph->daddr,
+			       sizeof(key_addrs->v6addrs.dst));
 			key_control->addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
 		}
 

commit 8c197826e2df81a25a49317a6a99c9b3acf19527
Author: Gustavo A. R. Silva <gustavoars@kernel.org>
Date:   Mon Jul 26 14:52:51 2021 -0500

    ipv4: ip_output.c: Fix out-of-bounds warning in ip_copy_addrs()
    
    [ Upstream commit 6321c7acb82872ef6576c520b0e178eaad3a25c0 ]
    
    Fix the following out-of-bounds warning:
    
        In function 'ip_copy_addrs',
            inlined from '__ip_queue_xmit' at net/ipv4/ip_output.c:517:2:
    net/ipv4/ip_output.c:449:2: warning: 'memcpy' offset [40, 43] from the object at 'fl' is out of the bounds of referenced subobject 'saddr' with type 'unsigned int' at offset 36 [-Warray-bounds]
          449 |  memcpy(&iph->saddr, &fl4->saddr,
              |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          450 |         sizeof(fl4->saddr) + sizeof(fl4->daddr));
              |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    The problem is that the original code is trying to copy data into a
    couple of struct members adjacent to each other in a single call to
    memcpy(). This causes a legitimate compiler warning because memcpy()
    overruns the length of &iph->saddr and &fl4->saddr. As these are just
    a couple of struct members, fix this by using direct assignments,
    instead of memcpy().
    
    This helps with the ongoing efforts to globally enable -Warray-bounds
    and get us closer to being able to tighten the FORTIFY_SOURCE routines
    on memcpy().
    
    Link: https://github.com/KSPP/linux/issues/109
    Reported-by: kernel test robot <lkp@intel.com>
    Link: https://lore.kernel.org/lkml/d5ae2e65-1f18-2577-246f-bada7eee6ccd@intel.com/
    Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index e63905f7f6f9..25beecee8949 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -419,8 +419,9 @@ static void ip_copy_addrs(struct iphdr *iph, const struct flowi4 *fl4)
 {
 	BUILD_BUG_ON(offsetof(typeof(*fl4), daddr) !=
 		     offsetof(typeof(*fl4), saddr) + sizeof(fl4->saddr));
-	memcpy(&iph->saddr, &fl4->saddr,
-	       sizeof(fl4->saddr) + sizeof(fl4->daddr));
+
+	iph->saddr = fl4->saddr;
+	iph->daddr = fl4->daddr;
 }
 
 /* Note: skb->sk can be different from sk, in case of tunnels */

commit f1c423e9ca4ac2c59e8a07a5bb457e806bf1bb23
Author: Zheyu Ma <zheyuma97@gmail.com>
Date:   Mon Jul 26 10:03:55 2021 +0000

    video: fbdev: riva: Error out if 'pixclock' equals zero
    
    [ Upstream commit f92763cb0feba247e0939ed137b495601fd072a5 ]
    
    The userspace program could pass any values to the driver through
    ioctl() interface. If the driver doesn't check the value of 'pixclock',
    it may cause divide error.
    
    Fix this by checking whether 'pixclock' is zero first.
    
    The following log reveals it:
    
    [   33.396850] divide error: 0000 [#1] PREEMPT SMP KASAN PTI
    [   33.396864] CPU: 5 PID: 11754 Comm: i740 Not tainted 5.14.0-rc2-00513-gac532c9bbcfb-dirty #222
    [   33.396883] RIP: 0010:riva_load_video_mode+0x417/0xf70
    [   33.396969] Call Trace:
    [   33.396973]  ? debug_smp_processor_id+0x1c/0x20
    [   33.396984]  ? tick_nohz_tick_stopped+0x1a/0x90
    [   33.396996]  ? rivafb_copyarea+0x3c0/0x3c0
    [   33.397003]  ? wake_up_klogd.part.0+0x99/0xd0
    [   33.397014]  ? vprintk_emit+0x110/0x4b0
    [   33.397024]  ? vprintk_default+0x26/0x30
    [   33.397033]  ? vprintk+0x9c/0x1f0
    [   33.397041]  ? printk+0xba/0xed
    [   33.397054]  ? record_print_text.cold+0x16/0x16
    [   33.397063]  ? __kasan_check_read+0x11/0x20
    [   33.397074]  ? profile_tick+0xc0/0x100
    [   33.397084]  ? __sanitizer_cov_trace_const_cmp4+0x24/0x80
    [   33.397094]  ? riva_set_rop_solid+0x2a0/0x2a0
    [   33.397102]  rivafb_set_par+0xbe/0x610
    [   33.397111]  ? riva_set_rop_solid+0x2a0/0x2a0
    [   33.397119]  fb_set_var+0x5bf/0xeb0
    [   33.397127]  ? fb_blank+0x1a0/0x1a0
    [   33.397134]  ? lock_acquire+0x1ef/0x530
    [   33.397143]  ? lock_release+0x810/0x810
    [   33.397151]  ? lock_is_held_type+0x100/0x140
    [   33.397159]  ? ___might_sleep+0x1ee/0x2d0
    [   33.397170]  ? __mutex_lock+0x620/0x1190
    [   33.397180]  ? trace_hardirqs_on+0x6a/0x1c0
    [   33.397190]  do_fb_ioctl+0x31e/0x700
    
    Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
    Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/1627293835-17441-4-git-send-email-zheyuma97@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/video/fbdev/riva/fbdev.c b/drivers/video/fbdev/riva/fbdev.c
index cc242ba057d3..dfa81b641f9f 100644
--- a/drivers/video/fbdev/riva/fbdev.c
+++ b/drivers/video/fbdev/riva/fbdev.c
@@ -1088,6 +1088,9 @@ static int rivafb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
 	int mode_valid = 0;
 	
 	NVTRACE_ENTER();
+	if (!var->pixclock)
+		return -EINVAL;
+
 	switch (var->bits_per_pixel) {
 	case 1 ... 8:
 		var->red.offset = var->green.offset = var->blue.offset = 0;

commit d026edf74d9379b2e28882ae90831eaead6852e5
Author: Zheyu Ma <zheyuma97@gmail.com>
Date:   Mon Jul 26 10:03:54 2021 +0000

    video: fbdev: kyro: Error out if 'pixclock' equals zero
    
    [ Upstream commit 1520b4b7ba964f8eec2e7dd14c571d50de3e5191 ]
    
    The userspace program could pass any values to the driver through
    ioctl() interface. if the driver doesn't check the value of 'pixclock',
    it may cause divide error because the value of 'lineclock' and
    'frameclock' will be zero.
    
    Fix this by checking whether 'pixclock' is zero in kyrofb_check_var().
    
    The following log reveals it:
    
    [  103.073930] divide error: 0000 [#1] PREEMPT SMP KASAN PTI
    [  103.073942] CPU: 4 PID: 12483 Comm: syz-executor Not tainted 5.14.0-rc2-00478-g2734d6c1b1a0-dirty #118
    [  103.073959] RIP: 0010:kyrofb_set_par+0x316/0xc80
    [  103.074045] Call Trace:
    [  103.074048]  ? ___might_sleep+0x1ee/0x2d0
    [  103.074060]  ? kyrofb_ioctl+0x330/0x330
    [  103.074069]  fb_set_var+0x5bf/0xeb0
    [  103.074078]  ? fb_blank+0x1a0/0x1a0
    [  103.074085]  ? lock_acquire+0x3bd/0x530
    [  103.074094]  ? lock_release+0x810/0x810
    [  103.074103]  ? ___might_sleep+0x1ee/0x2d0
    [  103.074114]  ? __mutex_lock+0x620/0x1190
    [  103.074126]  ? trace_hardirqs_on+0x6a/0x1c0
    [  103.074137]  do_fb_ioctl+0x31e/0x700
    [  103.074144]  ? fb_getput_cmap+0x280/0x280
    [  103.074152]  ? rcu_read_lock_sched_held+0x11/0x80
    [  103.074162]  ? rcu_read_lock_sched_held+0x11/0x80
    [  103.074171]  ? __sanitizer_cov_trace_switch+0x67/0xf0
    [  103.074181]  ? __sanitizer_cov_trace_const_cmp2+0x20/0x80
    [  103.074191]  ? do_vfs_ioctl+0x14b/0x16c0
    [  103.074199]  ? vfs_fileattr_set+0xb60/0xb60
    [  103.074207]  ? rcu_read_lock_sched_held+0x11/0x80
    [  103.074216]  ? lock_release+0x483/0x810
    [  103.074224]  ? __fget_files+0x217/0x3d0
    [  103.074234]  ? __fget_files+0x239/0x3d0
    [  103.074243]  ? do_fb_ioctl+0x700/0x700
    [  103.074250]  fb_ioctl+0xe6/0x130
    
    Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
    Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/1627293835-17441-3-git-send-email-zheyuma97@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/video/fbdev/kyro/fbdev.c b/drivers/video/fbdev/kyro/fbdev.c
index d7aa431e6846..74bf26b527b9 100644
--- a/drivers/video/fbdev/kyro/fbdev.c
+++ b/drivers/video/fbdev/kyro/fbdev.c
@@ -399,6 +399,9 @@ static int kyrofb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
 {
 	struct kyrofb_info *par = info->par;
 
+	if (!var->pixclock)
+		return -EINVAL;
+
 	if (var->bits_per_pixel != 16 && var->bits_per_pixel != 32) {
 		printk(KERN_WARNING "kyrofb: depth not supported: %u\n", var->bits_per_pixel);
 		return -EINVAL;

commit f997d6f5ba934dd3722b1ae125ec0cda505d2d59
Author: Zheyu Ma <zheyuma97@gmail.com>
Date:   Mon Jul 26 10:03:53 2021 +0000

    video: fbdev: asiliantfb: Error out if 'pixclock' equals zero
    
    [ Upstream commit b36b242d4b8ea178f7fd038965e3cac7f30c3f09 ]
    
    The userspace program could pass any values to the driver through
    ioctl() interface. If the driver doesn't check the value of 'pixclock',
    it may cause divide error.
    
    Fix this by checking whether 'pixclock' is zero first.
    
    The following log reveals it:
    
    [   43.861711] divide error: 0000 [#1] PREEMPT SMP KASAN PTI
    [   43.861737] CPU: 2 PID: 11764 Comm: i740 Not tainted 5.14.0-rc2-00513-gac532c9bbcfb-dirty #224
    [   43.861756] RIP: 0010:asiliantfb_check_var+0x4e/0x730
    [   43.861843] Call Trace:
    [   43.861848]  ? asiliantfb_remove+0x190/0x190
    [   43.861858]  fb_set_var+0x2e4/0xeb0
    [   43.861866]  ? fb_blank+0x1a0/0x1a0
    [   43.861873]  ? lock_acquire+0x1ef/0x530
    [   43.861884]  ? lock_release+0x810/0x810
    [   43.861892]  ? lock_is_held_type+0x100/0x140
    [   43.861903]  ? ___might_sleep+0x1ee/0x2d0
    [   43.861914]  ? __mutex_lock+0x620/0x1190
    [   43.861921]  ? do_fb_ioctl+0x313/0x700
    [   43.861929]  ? mutex_lock_io_nested+0xfa0/0xfa0
    [   43.861936]  ? __this_cpu_preempt_check+0x1d/0x30
    [   43.861944]  ? _raw_spin_unlock_irqrestore+0x46/0x60
    [   43.861952]  ? lockdep_hardirqs_on+0x59/0x100
    [   43.861959]  ? _raw_spin_unlock_irqrestore+0x46/0x60
    [   43.861967]  ? trace_hardirqs_on+0x6a/0x1c0
    [   43.861978]  do_fb_ioctl+0x31e/0x700
    
    Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
    Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/1627293835-17441-2-git-send-email-zheyuma97@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/video/fbdev/asiliantfb.c b/drivers/video/fbdev/asiliantfb.c
index ea31054a28ca..c1d6e6336225 100644
--- a/drivers/video/fbdev/asiliantfb.c
+++ b/drivers/video/fbdev/asiliantfb.c
@@ -227,6 +227,9 @@ static int asiliantfb_check_var(struct fb_var_screeninfo *var,
 {
 	unsigned long Ftarget, ratio, remainder;
 
+	if (!var->pixclock)
+		return -EINVAL;
+
 	ratio = 1000000 / var->pixclock;
 	remainder = 1000000 % var->pixclock;
 	Ftarget = 1000000 * ratio + (1000000 * remainder) / var->pixclock;

commit a9ac9630e90d00a8b9dd396ea77d9b8c3f80fb67
Author: Johan Almbladh <johan.almbladh@anyfinetworks.com>
Date:   Wed Jul 21 12:38:22 2021 +0200

    bpf/tests: Do not PASS tests without actually testing the result
    
    [ Upstream commit 2b7e9f25e590726cca76700ebdb10e92a7a72ca1 ]
    
    Each test case can have a set of sub-tests, where each sub-test can
    run the cBPF/eBPF test snippet with its own data_size and expected
    result. Before, the end of the sub-test array was indicated by both
    data_size and result being zero. However, most or all of the internal
    eBPF tests has a data_size of zero already. When such a test also had
    an expected value of zero, the test was never run but reported as
    PASS anyway.
    
    Now the test runner always runs the first sub-test, regardless of the
    data_size and result values. The sub-test array zero-termination only
    applies for any additional sub-tests.
    
    There are other ways fix it of course, but this solution at least
    removes the surprise of eBPF tests with a zero result always succeeding.
    
    Signed-off-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
    Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/bpf/20210721103822.3755111-1-johan.almbladh@anyfinetworks.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/lib/test_bpf.c b/lib/test_bpf.c
index 98074a3bc161..49d79079e8b3 100644
--- a/lib/test_bpf.c
+++ b/lib/test_bpf.c
@@ -6687,7 +6687,14 @@ static int run_one(const struct bpf_prog *fp, struct bpf_test *test)
 		u64 duration;
 		u32 ret;
 
-		if (test->test[i].data_size == 0 &&
+		/*
+		 * NOTE: Several sub-tests may be present, in which case
+		 * a zero {data_size, result} tuple indicates the end of
+		 * the sub-test array. The first test is always run,
+		 * even if both data_size and result happen to be zero.
+		 */
+		if (i > 0 &&
+		    test->test[i].data_size == 0 &&
 		    test->test[i].result == 0)
 			break;
 

commit 5fa42b748728f418da5f9574e2d0383c466d842a
Author: Johan Almbladh <johan.almbladh@anyfinetworks.com>
Date:   Wed Jul 21 12:40:58 2021 +0200

    bpf/tests: Fix copy-and-paste error in double word test
    
    [ Upstream commit ae7f47041d928b1a2f28717d095b4153c63cbf6a ]
    
    This test now operates on DW as stated instead of W, which was
    already covered by another test.
    
    Signed-off-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
    Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/bpf/20210721104058.3755254-1-johan.almbladh@anyfinetworks.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/lib/test_bpf.c b/lib/test_bpf.c
index 08d3d59dca17..98074a3bc161 100644
--- a/lib/test_bpf.c
+++ b/lib/test_bpf.c
@@ -4293,8 +4293,8 @@ static struct bpf_test tests[] = {
 		.u.insns_int = {
 			BPF_LD_IMM64(R0, 0),
 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
-			BPF_STX_MEM(BPF_W, R10, R1, -40),
-			BPF_LDX_MEM(BPF_W, R0, R10, -40),
+			BPF_STX_MEM(BPF_DW, R10, R1, -40),
+			BPF_LDX_MEM(BPF_DW, R0, R10, -40),
 			BPF_EXIT_INSN(),
 		},
 		INTERNAL,

commit 9ddffd43f393531447231430cfc3f6828012e67b
Author: Anson Jacob <Anson.Jacob@amd.com>
Date:   Tue Jul 20 11:00:44 2021 -0400

    drm/amd/amdgpu: Update debugfs link_settings output link_rate field in hex
    
    [ Upstream commit 1a394b3c3de2577f200cb623c52a5c2b82805cec ]
    
    link_rate is updated via debugfs using hex values, set it to output
    in hex as well.
    
    eg: Resolution: 1920x1080@144Hz
    cat /sys/kernel/debug/dri/0/DP-1/link_settings
    Current:  4  0x14  0  Verified:  4  0x1e  0  Reported:  4  0x1e  16  Preferred:  0  0x0  0
    
    echo "4 0x1e" > /sys/kernel/debug/dri/0/DP-1/link_settings
    
    cat /sys/kernel/debug/dri/0/DP-1/link_settings
    Current:  4  0x1e  0  Verified:  4  0x1e  0  Reported:  4  0x1e  16  Preferred:  4  0x1e  0
    
    Signed-off-by: Anson Jacob <Anson.Jacob@amd.com>
    Reviewed-by: Harry Wentland <harry.wentland@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
index 0d9e410ca01e..dbfe5623997d 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
@@ -92,29 +92,29 @@ static ssize_t dp_link_settings_read(struct file *f, char __user *buf,
 
 	rd_buf_ptr = rd_buf;
 
-	str_len = strlen("Current:  %d  %d  %d  ");
-	snprintf(rd_buf_ptr, str_len, "Current:  %d  %d  %d  ",
+	str_len = strlen("Current:  %d  0x%x  %d  ");
+	snprintf(rd_buf_ptr, str_len, "Current:  %d  0x%x  %d  ",
 			link->cur_link_settings.lane_count,
 			link->cur_link_settings.link_rate,
 			link->cur_link_settings.link_spread);
 	rd_buf_ptr += str_len;
 
-	str_len = strlen("Verified:  %d  %d  %d  ");
-	snprintf(rd_buf_ptr, str_len, "Verified:  %d  %d  %d  ",
+	str_len = strlen("Verified:  %d  0x%x  %d  ");
+	snprintf(rd_buf_ptr, str_len, "Verified:  %d  0x%x  %d  ",
 			link->verified_link_cap.lane_count,
 			link->verified_link_cap.link_rate,
 			link->verified_link_cap.link_spread);
 	rd_buf_ptr += str_len;
 
-	str_len = strlen("Reported:  %d  %d  %d  ");
-	snprintf(rd_buf_ptr, str_len, "Reported:  %d  %d  %d  ",
+	str_len = strlen("Reported:  %d  0x%x  %d  ");
+	snprintf(rd_buf_ptr, str_len, "Reported:  %d  0x%x  %d  ",
 			link->reported_link_cap.lane_count,
 			link->reported_link_cap.link_rate,
 			link->reported_link_cap.link_spread);
 	rd_buf_ptr += str_len;
 
-	str_len = strlen("Preferred:  %d  %d  %d  ");
-	snprintf(rd_buf_ptr, str_len, "Preferred:  %d  %d  %d\n",
+	str_len = strlen("Preferred:  %d  0x%x  %d  ");
+	snprintf(rd_buf_ptr, str_len, "Preferred:  %d  0x%x  %d\n",
 			link->preferred_link_setting.lane_count,
 			link->preferred_link_setting.link_rate,
 			link->preferred_link_setting.link_spread);

commit 84bf0fb189d512cb890381e6af855bc26b7b2294
Author: Zheyu Ma <zheyuma97@gmail.com>
Date:   Wed Jul 14 05:53:23 2021 +0000

    tty: serial: jsm: hold port lock when reporting modem line changes
    
    [ Upstream commit 240e126c28df084222f0b661321e8e3ecb0d232e ]
    
    uart_handle_dcd_change() requires a port lock to be held and will emit a
    warning when lockdep is enabled.
    
    Held corresponding lock to fix the following warnings.
    
    [  132.528648] WARNING: CPU: 5 PID: 11600 at drivers/tty/serial/serial_core.c:3046 uart_handle_dcd_change+0xf4/0x120
    [  132.530482] Modules linked in:
    [  132.531050] CPU: 5 PID: 11600 Comm: jsm Not tainted 5.14.0-rc1-00003-g7fef2edf7cc7-dirty #31
    [  132.535268] RIP: 0010:uart_handle_dcd_change+0xf4/0x120
    [  132.557100] Call Trace:
    [  132.557562]  ? __free_pages+0x83/0xb0
    [  132.558213]  neo_parse_modem+0x156/0x220
    [  132.558897]  neo_param+0x399/0x840
    [  132.559495]  jsm_tty_open+0x12f/0x2d0
    [  132.560131]  uart_startup.part.18+0x153/0x340
    [  132.560888]  ? lock_is_held_type+0xe9/0x140
    [  132.561660]  uart_port_activate+0x7f/0xe0
    [  132.562351]  ? uart_startup.part.18+0x340/0x340
    [  132.563003]  tty_port_open+0x8d/0xf0
    [  132.563523]  ? uart_set_options+0x1e0/0x1e0
    [  132.564125]  uart_open+0x24/0x40
    [  132.564604]  tty_open+0x15c/0x630
    
    Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
    Link: https://lore.kernel.org/r/1626242003-3809-1-git-send-email-zheyuma97@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/serial/jsm/jsm_neo.c b/drivers/tty/serial/jsm/jsm_neo.c
index bf0e2a4cb0ce..c6f927a76c3b 100644
--- a/drivers/tty/serial/jsm/jsm_neo.c
+++ b/drivers/tty/serial/jsm/jsm_neo.c
@@ -815,7 +815,9 @@ static void neo_parse_isr(struct jsm_board *brd, u32 port)
 		/* Parse any modem signal changes */
 		jsm_dbg(INTR, &ch->ch_bd->pci_dev,
 			"MOD_STAT: sending to parse_modem_sigs\n");
+		spin_lock_irqsave(&ch->uart_port.lock, lock_flags);
 		neo_parse_modem(ch, readb(&ch->ch_neo_uart->msr));
+		spin_unlock_irqrestore(&ch->uart_port.lock, lock_flags);
 	}
 }
 
diff --git a/drivers/tty/serial/jsm/jsm_tty.c b/drivers/tty/serial/jsm/jsm_tty.c
index 689774c073ca..8438454ca653 100644
--- a/drivers/tty/serial/jsm/jsm_tty.c
+++ b/drivers/tty/serial/jsm/jsm_tty.c
@@ -187,6 +187,7 @@ static void jsm_tty_break(struct uart_port *port, int break_state)
 
 static int jsm_tty_open(struct uart_port *port)
 {
+	unsigned long lock_flags;
 	struct jsm_board *brd;
 	struct jsm_channel *channel =
 		container_of(port, struct jsm_channel, uart_port);
@@ -240,6 +241,7 @@ static int jsm_tty_open(struct uart_port *port)
 	channel->ch_cached_lsr = 0;
 	channel->ch_stops_sent = 0;
 
+	spin_lock_irqsave(&port->lock, lock_flags);
 	termios = &port->state->port.tty->termios;
 	channel->ch_c_cflag	= termios->c_cflag;
 	channel->ch_c_iflag	= termios->c_iflag;
@@ -259,6 +261,7 @@ static int jsm_tty_open(struct uart_port *port)
 	jsm_carrier(channel);
 
 	channel->ch_open_count++;
+	spin_unlock_irqrestore(&port->lock, lock_flags);
 
 	jsm_dbg(OPEN, &channel->ch_bd->pci_dev, "finish\n");
 	return 0;

commit beb8f733e6f345d9d53fc229ae99394778d7e6cc
Author: Geert Uytterhoeven <geert+renesas@glider.be>
Date:   Wed Jul 14 12:13:46 2021 +0200

    staging: board: Fix uninitialized spinlock when attaching genpd
    
    [ Upstream commit df00609821bf17f50a75a446266d19adb8339d84 ]
    
    On Armadillo-800-EVA with CONFIG_DEBUG_SPINLOCK=y:
    
        BUG: spinlock bad magic on CPU#0, swapper/1
         lock: lcdc0_device+0x10c/0x308, .magic: 00000000, .owner: <none>/-1, .owner_cpu: 0
        CPU: 0 PID: 1 Comm: swapper Not tainted 5.11.0-rc5-armadillo-00036-gbbca04be7a80-dirty #287
        Hardware name: Generic R8A7740 (Flattened Device Tree)
        [<c010c3c8>] (unwind_backtrace) from [<c010a49c>] (show_stack+0x10/0x14)
        [<c010a49c>] (show_stack) from [<c0159534>] (do_raw_spin_lock+0x20/0x94)
        [<c0159534>] (do_raw_spin_lock) from [<c040858c>] (dev_pm_get_subsys_data+0x8c/0x11c)
        [<c040858c>] (dev_pm_get_subsys_data) from [<c05fbcac>] (genpd_add_device+0x78/0x2b8)
        [<c05fbcac>] (genpd_add_device) from [<c0412db4>] (of_genpd_add_device+0x34/0x4c)
        [<c0412db4>] (of_genpd_add_device) from [<c0a1ea74>] (board_staging_register_device+0x11c/0x148)
        [<c0a1ea74>] (board_staging_register_device) from [<c0a1eac4>] (board_staging_register_devices+0x24/0x28)
    
    of_genpd_add_device() is called before platform_device_register(), as it
    needs to attach the genpd before the device is probed.  But the spinlock
    is only initialized when the device is registered.
    
    Fix this by open-coding the spinlock initialization, cfr.
    device_pm_init_common() in the internal drivers/base code, and in the
    SuperH early platform code.
    
    Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
    Link: https://lore.kernel.org/r/57783ece7ddae55f2bda2f59f452180bff744ea0.1626257398.git.geert+renesas@glider.be
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/staging/board/board.c b/drivers/staging/board/board.c
index cb6feb34dd40..f980af037345 100644
--- a/drivers/staging/board/board.c
+++ b/drivers/staging/board/board.c
@@ -136,6 +136,7 @@ int __init board_staging_register_clock(const struct board_staging_clk *bsc)
 static int board_staging_add_dev_domain(struct platform_device *pdev,
 					const char *domain)
 {
+	struct device *dev = &pdev->dev;
 	struct of_phandle_args pd_args;
 	struct device_node *np;
 
@@ -148,7 +149,11 @@ static int board_staging_add_dev_domain(struct platform_device *pdev,
 	pd_args.np = np;
 	pd_args.args_count = 0;
 
-	return of_genpd_add_device(&pd_args, &pdev->dev);
+	/* Initialization similar to device_pm_init_common() */
+	spin_lock_init(&dev->power.lock);
+	dev->power.early_init = true;
+
+	return of_genpd_add_device(&pd_args, dev);
 }
 #else
 static inline int board_staging_add_dev_domain(struct platform_device *pdev,

commit cb9647dce5f3dfa7b6f02679f16d7f9231bbe57c
Author: Jack Pham <jackp@codeaurora.org>
Date:   Tue Jul 20 01:09:07 2021 -0700

    usb: gadget: composite: Allow bMaxPower=0 if self-powered
    
    [ Upstream commit bcacbf06c891374e7fdd7b72d11cda03b0269b43 ]
    
    Currently the composite driver encodes the MaxPower field of
    the configuration descriptor by reading the c->MaxPower of the
    usb_configuration only if it is non-zero, otherwise it falls back
    to using the value hard-coded in CONFIG_USB_GADGET_VBUS_DRAW.
    However, there are cases when a configuration must explicitly set
    bMaxPower to 0, particularly if its bmAttributes also has the
    Self-Powered bit set, which is a valid combination.
    
    This is specifically called out in the USB PD specification section
    9.1, in which a PDUSB device "shall report zero in the bMaxPower
    field after negotiating a mutually agreeable Contract", and also
    verified by the USB Type-C Functional Test TD.4.10.2 Sink Power
    Precedence Test.
    
    The fix allows the c->MaxPower to be used for encoding the bMaxPower
    even if it is 0, if the self-powered bit is also set.  An example
    usage of this would be for a ConfigFS gadget to be dynamically
    updated by userspace when the Type-C connection is determined to be
    operating in Power Delivery mode.
    
    Co-developed-by: Ronak Vijay Raheja <rraheja@codeaurora.org>
    Acked-by: Felipe Balbi <balbi@kernel.org>
    Signed-off-by: Ronak Vijay Raheja <rraheja@codeaurora.org>
    Signed-off-by: Jack Pham <jackp@codeaurora.org>
    Link: https://lore.kernel.org/r/20210720080907.30292-1-jackp@codeaurora.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
index d85bb3ba8263..a76ed4acb570 100644
--- a/drivers/usb/gadget/composite.c
+++ b/drivers/usb/gadget/composite.c
@@ -481,7 +481,7 @@ static u8 encode_bMaxPower(enum usb_device_speed speed,
 {
 	unsigned val;
 
-	if (c->MaxPower)
+	if (c->MaxPower || (c->bmAttributes & USB_CONFIG_ATT_SELFPOWER))
 		val = c->MaxPower;
 	else
 		val = CONFIG_USB_GADGET_VBUS_DRAW;
@@ -891,7 +891,11 @@ static int set_config(struct usb_composite_dev *cdev,
 	}
 
 	/* when we return, be sure our power usage is valid */
-	power = c->MaxPower ? c->MaxPower : CONFIG_USB_GADGET_VBUS_DRAW;
+	if (c->MaxPower || (c->bmAttributes & USB_CONFIG_ATT_SELFPOWER))
+		power = c->MaxPower;
+	else
+		power = CONFIG_USB_GADGET_VBUS_DRAW;
+
 	if (gadget->speed < USB_SPEED_SUPER)
 		power = min(power, 500U);
 	else

commit 7dd08d66af3df5d599a7352afda9e324754cf57d
Author: Maciej Żenczykowski <maze@google.com>
Date:   Thu Jul 1 04:48:34 2021 -0700

    usb: gadget: u_ether: fix a potential null pointer dereference
    
    [ Upstream commit 8ae01239609b29ec2eff55967c8e0fe3650cfa09 ]
    
    f_ncm tx timeout can call us with null skb to flush
    a pending frame.  In this case skb is NULL to begin
    with but ceases to be null after dev->wrap() completes.
    
    In such a case in->maxpacket will be read, even though
    we've failed to check that 'in' is not NULL.
    
    Though I've never observed this fail in practice,
    however the 'flush operation' simply does not make sense with
    a null usb IN endpoint - there's nowhere to flush to...
    (note that we're the gadget/device, and IN is from the point
     of view of the host, so here IN actually means outbound...)
    
    Cc: Brooke Basile <brookebasile@gmail.com>
    Cc: "Bryan O'Donoghue" <bryan.odonoghue@linaro.org>
    Cc: Felipe Balbi <balbi@kernel.org>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Lorenzo Colitti <lorenzo@google.com>
    Signed-off-by: Maciej Żenczykowski <maze@google.com>
    Link: https://lore.kernel.org/r/20210701114834.884597-6-zenczykowski@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c
index 156651df6b4d..d7a12161e553 100644
--- a/drivers/usb/gadget/function/u_ether.c
+++ b/drivers/usb/gadget/function/u_ether.c
@@ -491,8 +491,9 @@ static netdev_tx_t eth_start_xmit(struct sk_buff *skb,
 	}
 	spin_unlock_irqrestore(&dev->lock, flags);
 
-	if (skb && !in) {
-		dev_kfree_skb_any(skb);
+	if (!in) {
+		if (skb)
+			dev_kfree_skb_any(skb);
 		return NETDEV_TX_OK;
 	}
 

commit e9ee01f32dc1073afe978ab0f8dad8a7c30a11ed
Author: Kelly Devilliv <kelly.devilliv@gmail.com>
Date:   Sun Jun 27 20:57:47 2021 +0800

    usb: host: fotg210: fix the actual_length of an iso packet
    
    [ Upstream commit 091cb2f782f32ab68c6f5f326d7868683d3d4875 ]
    
    We should acquire the actual_length of an iso packet
    from the iTD directly using FOTG210_ITD_LENGTH() macro.
    
    Signed-off-by: Kelly Devilliv <kelly.devilliv@gmail.com>
    Link: https://lore.kernel.org/r/20210627125747.127646-4-kelly.devilliv@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/host/fotg210-hcd.c b/drivers/usb/host/fotg210-hcd.c
index 4e98f7b492df..157742431961 100644
--- a/drivers/usb/host/fotg210-hcd.c
+++ b/drivers/usb/host/fotg210-hcd.c
@@ -4459,13 +4459,12 @@ static bool itd_complete(struct fotg210_hcd *fotg210, struct fotg210_itd *itd)
 
 			/* HC need not update length with this error */
 			if (!(t & FOTG210_ISOC_BABBLE)) {
-				desc->actual_length =
-					fotg210_itdlen(urb, desc, t);
+				desc->actual_length = FOTG210_ITD_LENGTH(t);
 				urb->actual_length += desc->actual_length;
 			}
 		} else if (likely((t & FOTG210_ISOC_ACTIVE) == 0)) {
 			desc->status = 0;
-			desc->actual_length = fotg210_itdlen(urb, desc, t);
+			desc->actual_length = FOTG210_ITD_LENGTH(t);
 			urb->actual_length += desc->actual_length;
 		} else {
 			/* URB was too late */
diff --git a/drivers/usb/host/fotg210.h b/drivers/usb/host/fotg210.h
index 7fcd785c7bc8..0f1da9503bc6 100644
--- a/drivers/usb/host/fotg210.h
+++ b/drivers/usb/host/fotg210.h
@@ -683,11 +683,6 @@ static inline unsigned fotg210_read_frame_index(struct fotg210_hcd *fotg210)
 	return fotg210_readl(fotg210, &fotg210->regs->frame_index);
 }
 
-#define fotg210_itdlen(urb, desc, t) ({			\
-	usb_pipein((urb)->pipe) ?				\
-	(desc)->length - FOTG210_ITD_LENGTH(t) :			\
-	FOTG210_ITD_LENGTH(t);					\
-})
 /*-------------------------------------------------------------------------*/
 
 #endif /* __LINUX_FOTG210_H */

commit 1a1c8ec6534f231817e6568f0363db737a411b0b
Author: Kelly Devilliv <kelly.devilliv@gmail.com>
Date:   Sun Jun 27 20:57:46 2021 +0800

    usb: host: fotg210: fix the endpoint's transactional opportunities calculation
    
    [ Upstream commit c2e898764245c852bc8ee4857613ba4f3a6d761d ]
    
    Now that usb_endpoint_maxp() only returns the lowest
    11 bits from wMaxPacketSize, we should make use of the
    usb_endpoint_* helpers instead and remove the unnecessary
    max_packet()/hb_mult() macro.
    
    Signed-off-by: Kelly Devilliv <kelly.devilliv@gmail.com>
    Link: https://lore.kernel.org/r/20210627125747.127646-3-kelly.devilliv@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/host/fotg210-hcd.c b/drivers/usb/host/fotg210-hcd.c
index 226b38274a6e..4e98f7b492df 100644
--- a/drivers/usb/host/fotg210-hcd.c
+++ b/drivers/usb/host/fotg210-hcd.c
@@ -2509,11 +2509,6 @@ static unsigned qh_completions(struct fotg210_hcd *fotg210,
 	return count;
 }
 
-/* high bandwidth multiplier, as encoded in highspeed endpoint descriptors */
-#define hb_mult(wMaxPacketSize) (1 + (((wMaxPacketSize) >> 11) & 0x03))
-/* ... and packet size, for any kind of endpoint descriptor */
-#define max_packet(wMaxPacketSize) ((wMaxPacketSize) & 0x07ff)
-
 /* reverse of qh_urb_transaction:  free a list of TDs.
  * used for cleanup after errors, before HC sees an URB's TDs.
  */
@@ -2599,7 +2594,7 @@ static struct list_head *qh_urb_transaction(struct fotg210_hcd *fotg210,
 		token |= (1 /* "in" */ << 8);
 	/* else it's already initted to "out" pid (0 << 8) */
 
-	maxpacket = max_packet(usb_maxpacket(urb->dev, urb->pipe, !is_input));
+	maxpacket = usb_maxpacket(urb->dev, urb->pipe, !is_input);
 
 	/*
 	 * buffer gets wrapped in one or more qtds;
@@ -2713,9 +2708,11 @@ static struct fotg210_qh *qh_make(struct fotg210_hcd *fotg210, struct urb *urb,
 		gfp_t flags)
 {
 	struct fotg210_qh *qh = fotg210_qh_alloc(fotg210, flags);
+	struct usb_host_endpoint *ep;
 	u32 info1 = 0, info2 = 0;
 	int is_input, type;
 	int maxp = 0;
+	int mult;
 	struct usb_tt *tt = urb->dev->tt;
 	struct fotg210_qh_hw *hw;
 
@@ -2730,14 +2727,15 @@ static struct fotg210_qh *qh_make(struct fotg210_hcd *fotg210, struct urb *urb,
 
 	is_input = usb_pipein(urb->pipe);
 	type = usb_pipetype(urb->pipe);
-	maxp = usb_maxpacket(urb->dev, urb->pipe, !is_input);
+	ep = usb_pipe_endpoint(urb->dev, urb->pipe);
+	maxp = usb_endpoint_maxp(&ep->desc);
+	mult = usb_endpoint_maxp_mult(&ep->desc);
 
 	/* 1024 byte maxpacket is a hardware ceiling.  High bandwidth
 	 * acts like up to 3KB, but is built from smaller packets.
 	 */
-	if (max_packet(maxp) > 1024) {
-		fotg210_dbg(fotg210, "bogus qh maxpacket %d\n",
-				max_packet(maxp));
+	if (maxp > 1024) {
+		fotg210_dbg(fotg210, "bogus qh maxpacket %d\n", maxp);
 		goto done;
 	}
 
@@ -2751,8 +2749,7 @@ static struct fotg210_qh *qh_make(struct fotg210_hcd *fotg210, struct urb *urb,
 	 */
 	if (type == PIPE_INTERRUPT) {
 		qh->usecs = NS_TO_US(usb_calc_bus_time(USB_SPEED_HIGH,
-				is_input, 0,
-				hb_mult(maxp) * max_packet(maxp)));
+				is_input, 0, mult * maxp));
 		qh->start = NO_FRAME;
 
 		if (urb->dev->speed == USB_SPEED_HIGH) {
@@ -2789,7 +2786,7 @@ static struct fotg210_qh *qh_make(struct fotg210_hcd *fotg210, struct urb *urb,
 			think_time = tt ? tt->think_time : 0;
 			qh->tt_usecs = NS_TO_US(think_time +
 					usb_calc_bus_time(urb->dev->speed,
-					is_input, 0, max_packet(maxp)));
+					is_input, 0, maxp));
 			qh->period = urb->interval;
 			if (qh->period > fotg210->periodic_size) {
 				qh->period = fotg210->periodic_size;
@@ -2852,11 +2849,11 @@ static struct fotg210_qh *qh_make(struct fotg210_hcd *fotg210, struct urb *urb,
 			 * to help them do so.  So now people expect to use
 			 * such nonconformant devices with Linux too; sigh.
 			 */
-			info1 |= max_packet(maxp) << 16;
+			info1 |= maxp << 16;
 			info2 |= (FOTG210_TUNE_MULT_HS << 30);
 		} else {		/* PIPE_INTERRUPT */
-			info1 |= max_packet(maxp) << 16;
-			info2 |= hb_mult(maxp) << 30;
+			info1 |= maxp << 16;
+			info2 |= mult << 30;
 		}
 		break;
 	default:
@@ -3926,6 +3923,7 @@ static void iso_stream_init(struct fotg210_hcd *fotg210,
 	int is_input;
 	long bandwidth;
 	unsigned multi;
+	struct usb_host_endpoint *ep;
 
 	/*
 	 * this might be a "high bandwidth" highspeed endpoint,
@@ -3933,14 +3931,14 @@ static void iso_stream_init(struct fotg210_hcd *fotg210,
 	 */
 	epnum = usb_pipeendpoint(pipe);
 	is_input = usb_pipein(pipe) ? USB_DIR_IN : 0;
-	maxp = usb_maxpacket(dev, pipe, !is_input);
+	ep = usb_pipe_endpoint(dev, pipe);
+	maxp = usb_endpoint_maxp(&ep->desc);
 	if (is_input)
 		buf1 = (1 << 11);
 	else
 		buf1 = 0;
 
-	maxp = max_packet(maxp);
-	multi = hb_mult(maxp);
+	multi = usb_endpoint_maxp_mult(&ep->desc);
 	buf1 |= maxp;
 	maxp *= multi;
 

commit f3f5947867d58b75f0e8cf610f067094ede4dce3
Author: Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
Date:   Thu Jul 15 17:17:24 2021 +0800

    Smack: Fix wrong semantics in smk_access_entry()
    
    [ Upstream commit 6d14f5c7028eea70760df284057fe198ce7778dd ]
    
    In the smk_access_entry() function, if no matching rule is found
    in the rust_list, a negative error code will be used to perform bit
    operations with the MAY_ enumeration value. This is semantically
    wrong. This patch fixes this issue.
    
    Signed-off-by: Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/security/smack/smack_access.c b/security/smack/smack_access.c
index a7855c61c05c..07d23b4f76f3 100644
--- a/security/smack/smack_access.c
+++ b/security/smack/smack_access.c
@@ -85,23 +85,22 @@ int log_policy = SMACK_AUDIT_DENIED;
 int smk_access_entry(char *subject_label, char *object_label,
 			struct list_head *rule_list)
 {
-	int may = -ENOENT;
 	struct smack_rule *srp;
 
 	list_for_each_entry_rcu(srp, rule_list, list) {
 		if (srp->smk_object->smk_known == object_label &&
 		    srp->smk_subject->smk_known == subject_label) {
-			may = srp->smk_access;
-			break;
+			int may = srp->smk_access;
+			/*
+			 * MAY_WRITE implies MAY_LOCK.
+			 */
+			if ((may & MAY_WRITE) == MAY_WRITE)
+				may |= MAY_LOCK;
+			return may;
 		}
 	}
 
-	/*
-	 * MAY_WRITE implies MAY_LOCK.
-	 */
-	if ((may & MAY_WRITE) == MAY_WRITE)
-		may |= MAY_LOCK;
-	return may;
+	return -ENOENT;
 }
 
 /**

commit 51fae54d5ad9d8e9222580f2cdb04a8474f6520b
Author: Yajun Deng <yajun.deng@linux.dev>
Date:   Mon Jul 19 13:18:16 2021 +0800

    netlink: Deal with ESRCH error in nlmsg_notify()
    
    [ Upstream commit fef773fc8110d8124c73a5e6610f89e52814637d ]
    
    Yonghong Song report:
    The bpf selftest tc_bpf failed with latest bpf-next.
    The following is the command to run and the result:
    $ ./test_progs -n 132
    [   40.947571] bpf_testmod: loading out-of-tree module taints kernel.
    test_tc_bpf:PASS:test_tc_bpf__open_and_load 0 nsec
    test_tc_bpf:PASS:bpf_tc_hook_create(BPF_TC_INGRESS) 0 nsec
    test_tc_bpf:PASS:bpf_tc_hook_create invalid hook.attach_point 0 nsec
    test_tc_bpf_basic:PASS:bpf_obj_get_info_by_fd 0 nsec
    test_tc_bpf_basic:PASS:bpf_tc_attach 0 nsec
    test_tc_bpf_basic:PASS:handle set 0 nsec
    test_tc_bpf_basic:PASS:priority set 0 nsec
    test_tc_bpf_basic:PASS:prog_id set 0 nsec
    test_tc_bpf_basic:PASS:bpf_tc_attach replace mode 0 nsec
    test_tc_bpf_basic:PASS:bpf_tc_query 0 nsec
    test_tc_bpf_basic:PASS:handle set 0 nsec
    test_tc_bpf_basic:PASS:priority set 0 nsec
    test_tc_bpf_basic:PASS:prog_id set 0 nsec
    libbpf: Kernel error message: Failed to send filter delete notification
    test_tc_bpf_basic:FAIL:bpf_tc_detach unexpected error: -3 (errno 3)
    test_tc_bpf:FAIL:test_tc_internal ingress unexpected error: -3 (errno 3)
    
    The failure seems due to the commit
        cfdf0d9ae75b ("rtnetlink: use nlmsg_notify() in rtnetlink_send()")
    
    Deal with ESRCH error in nlmsg_notify() even the report variable is zero.
    
    Reported-by: Yonghong Song <yhs@fb.com>
    Signed-off-by: Yajun Deng <yajun.deng@linux.dev>
    Link: https://lore.kernel.org/r/20210719051816.11762-1-yajun.deng@linux.dev
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index ac3fe507bc1c..b0fd268ed65e 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -2498,13 +2498,15 @@ int nlmsg_notify(struct sock *sk, struct sk_buff *skb, u32 portid,
 		/* errors reported via destination sk->sk_err, but propagate
 		 * delivery errors if NETLINK_BROADCAST_ERROR flag is set */
 		err = nlmsg_multicast(sk, skb, exclude_portid, group, flags);
+		if (err == -ESRCH)
+			err = 0;
 	}
 
 	if (report) {
 		int err2;
 
 		err2 = nlmsg_unicast(sk, skb, portid);
-		if (!err || err == -ESRCH)
+		if (!err)
 			err = err2;
 	}
 

commit f9ce5d519d631fa2d02ab16b3a77856719db19f8
Author: Zheyu Ma <zheyuma97@gmail.com>
Date:   Wed Jul 14 04:09:22 2021 +0000

    video: fbdev: kyro: fix a DoS bug by restricting user input
    
    [ Upstream commit 98a65439172dc69cb16834e62e852afc2adb83ed ]
    
    The user can pass in any value to the driver through the 'ioctl'
    interface. The driver dost not check, which may cause DoS bugs.
    
    The following log reveals it:
    
    divide error: 0000 [#1] PREEMPT SMP KASAN PTI
    RIP: 0010:SetOverlayViewPort+0x133/0x5f0 drivers/video/fbdev/kyro/STG4000OverlayDevice.c:476
    Call Trace:
     kyro_dev_overlay_viewport_set drivers/video/fbdev/kyro/fbdev.c:378 [inline]
     kyrofb_ioctl+0x2eb/0x330 drivers/video/fbdev/kyro/fbdev.c:603
     do_fb_ioctl+0x1f3/0x700 drivers/video/fbdev/core/fbmem.c:1171
     fb_ioctl+0xeb/0x130 drivers/video/fbdev/core/fbmem.c:1185
     vfs_ioctl fs/ioctl.c:48 [inline]
     __do_sys_ioctl fs/ioctl.c:753 [inline]
     __se_sys_ioctl fs/ioctl.c:739 [inline]
     __x64_sys_ioctl+0x19b/0x220 fs/ioctl.c:739
     do_syscall_64+0x32/0x80 arch/x86/entry/common.c:46
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
    Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/1626235762-2590-1-git-send-email-zheyuma97@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/video/fbdev/kyro/fbdev.c b/drivers/video/fbdev/kyro/fbdev.c
index a7bd9f25911b..d7aa431e6846 100644
--- a/drivers/video/fbdev/kyro/fbdev.c
+++ b/drivers/video/fbdev/kyro/fbdev.c
@@ -372,6 +372,11 @@ static int kyro_dev_overlay_viewport_set(u32 x, u32 y, u32 ulWidth, u32 ulHeight
 		/* probably haven't called CreateOverlay yet */
 		return -EINVAL;
 
+	if (ulWidth == 0 || ulWidth == 0xffffffff ||
+	    ulHeight == 0 || ulHeight == 0xffffffff ||
+	    (x < 2 && ulWidth + 2 == 0))
+		return -EINVAL;
+
 	/* Stop Ramdac Output */
 	DisableRamdacOutput(deviceInfo.pSTGReg);
 

commit 8df5bcb0c1c607fa4094106bfd1790d14d16b0c8
Author: David Heidelberg <david@ixit.cz>
Date:   Wed Jul 7 15:14:53 2021 +0200

    ARM: dts: qcom: apq8064: correct clock names
    
    [ Upstream commit 0dc6c59892ead17a9febd11202c9f6794aac1895 ]
    
    Since new code doesn't take old clk names in account, it does fixes
    error:
    
    msm_dsi 4700000.mdss_dsi: dev_pm_opp_set_clkname: Couldn't find clock: -2
    
    and following kernel oops introduced by
    b0530eb1191 ("drm/msm/dpu: Use OPP API to set clk/perf state").
    
    Also removes warning about deprecated clock names.
    
    Tested against linux-5.10.y LTS on Nexus 7 2013.
    
    Reviewed-by: Brian Masney <masneyb@onstation.org>
    Signed-off-by: David Heidelberg <david@ixit.cz>
    Link: https://lore.kernel.org/r/20210707131453.24041-1-david@ixit.cz
    Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/qcom-apq8064.dtsi b/arch/arm/boot/dts/qcom-apq8064.dtsi
index 4a99c9255104..d0153bbbdbeb 100644
--- a/arch/arm/boot/dts/qcom-apq8064.dtsi
+++ b/arch/arm/boot/dts/qcom-apq8064.dtsi
@@ -1296,9 +1296,9 @@
 				<&mmcc DSI1_BYTE_CLK>,
 				<&mmcc DSI_PIXEL_CLK>,
 				<&mmcc DSI1_ESC_CLK>;
-			clock-names = "iface_clk", "bus_clk", "core_mmss_clk",
-					"src_clk", "byte_clk", "pixel_clk",
-					"core_clk";
+			clock-names = "iface", "bus", "core_mmss",
+					"src", "byte", "pixel",
+					"core";
 
 			assigned-clocks = <&mmcc DSI1_BYTE_SRC>,
 					<&mmcc DSI1_ESC_SRC>,

commit a4a2974be078c5f762b1cd19c6555e94758c111a
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sun Jun 27 17:32:37 2021 +0100

    iio: dac: ad5624r: Fix incorrect handling of an optional regulator.
    
    [ Upstream commit 97683c851f9cdbd3ea55697cbe2dcb6af4287bbd ]
    
    The naming of the regulator is problematic.  VCC is usually a supply
    voltage whereas these devices have a separate VREF pin.
    
    Secondly, the regulator core might have provided a stub regulator if
    a real regulator wasn't provided. That would in turn have failed to
    provide a voltage when queried. So reality was that there was no way
    to use the internal reference.
    
    In order to avoid breaking any dts out in the wild, make sure to fallback
    to the original vcc naming if vref is not available.
    
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Reported-by: kernel test robot <lkp@intel.com>
    Acked-by: Nuno Sá <nuno.sa@analog.com>
    Link: https://lore.kernel.org/r/20210627163244.1090296-9-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/dac/ad5624r_spi.c b/drivers/iio/dac/ad5624r_spi.c
index 13fdb4dfe356..cc3a24c43e57 100644
--- a/drivers/iio/dac/ad5624r_spi.c
+++ b/drivers/iio/dac/ad5624r_spi.c
@@ -230,7 +230,7 @@ static int ad5624r_probe(struct spi_device *spi)
 	if (!indio_dev)
 		return -ENOMEM;
 	st = iio_priv(indio_dev);
-	st->reg = devm_regulator_get(&spi->dev, "vcc");
+	st->reg = devm_regulator_get_optional(&spi->dev, "vref");
 	if (!IS_ERR(st->reg)) {
 		ret = regulator_enable(st->reg);
 		if (ret)
@@ -241,6 +241,22 @@ static int ad5624r_probe(struct spi_device *spi)
 			goto error_disable_reg;
 
 		voltage_uv = ret;
+	} else {
+		if (PTR_ERR(st->reg) != -ENODEV)
+			return PTR_ERR(st->reg);
+		/* Backwards compatibility. This naming is not correct */
+		st->reg = devm_regulator_get_optional(&spi->dev, "vcc");
+		if (!IS_ERR(st->reg)) {
+			ret = regulator_enable(st->reg);
+			if (ret)
+				return ret;
+
+			ret = regulator_get_voltage(st->reg);
+			if (ret < 0)
+				goto error_disable_reg;
+
+			voltage_uv = ret;
+		}
 	}
 
 	spi_set_drvdata(spi, indio_dev);

commit ef306a7dd849d3e623716cb539e56fe4c0f4c64f
Author: Xin Long <lucien.xin@gmail.com>
Date:   Fri Jul 16 17:44:07 2021 -0400

    tipc: keep the skb in rcv queue until the whole data is read
    
    [ Upstream commit f4919ff59c2828064b4156e3c3600a169909bcf4 ]
    
    Currently, when userspace reads a datagram with a buffer that is
    smaller than this datagram, the data will be truncated and only
    part of it can be received by users. It doesn't seem right that
    users don't know the datagram size and have to use a huge buffer
    to read it to avoid the truncation.
    
    This patch to fix it by keeping the skb in rcv queue until the
    whole data is read by users. Only the last msg of the datagram
    will be marked with MSG_EOR, just as TCP/SCTP does.
    
    Note that this will work as above only when MSG_EOR is set in the
    flags parameter of recvmsg(), so that it won't break any old user
    applications.
    
    Signed-off-by: Xin Long <lucien.xin@gmail.com>
    Acked-by: Jon Maloy <jmaloy@redhat.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index 6aead6deaa6c..e9acbb290d71 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -1716,6 +1716,7 @@ static int tipc_recvmsg(struct socket *sock, struct msghdr *m,
 	bool connected = !tipc_sk_type_connectionless(sk);
 	struct tipc_sock *tsk = tipc_sk(sk);
 	int rc, err, hlen, dlen, copy;
+	struct tipc_skb_cb *skb_cb;
 	struct sk_buff_head xmitq;
 	struct tipc_msg *hdr;
 	struct sk_buff *skb;
@@ -1739,6 +1740,7 @@ static int tipc_recvmsg(struct socket *sock, struct msghdr *m,
 		if (unlikely(rc))
 			goto exit;
 		skb = skb_peek(&sk->sk_receive_queue);
+		skb_cb = TIPC_SKB_CB(skb);
 		hdr = buf_msg(skb);
 		dlen = msg_data_sz(hdr);
 		hlen = msg_hdr_sz(hdr);
@@ -1758,18 +1760,33 @@ static int tipc_recvmsg(struct socket *sock, struct msghdr *m,
 
 	/* Capture data if non-error msg, otherwise just set return value */
 	if (likely(!err)) {
-		copy = min_t(int, dlen, buflen);
-		if (unlikely(copy != dlen))
-			m->msg_flags |= MSG_TRUNC;
-		rc = skb_copy_datagram_msg(skb, hlen, m, copy);
+		int offset = skb_cb->bytes_read;
+
+		copy = min_t(int, dlen - offset, buflen);
+		rc = skb_copy_datagram_msg(skb, hlen + offset, m, copy);
+		if (unlikely(rc))
+			goto exit;
+		if (unlikely(offset + copy < dlen)) {
+			if (flags & MSG_EOR) {
+				if (!(flags & MSG_PEEK))
+					skb_cb->bytes_read = offset + copy;
+			} else {
+				m->msg_flags |= MSG_TRUNC;
+				skb_cb->bytes_read = 0;
+			}
+		} else {
+			if (flags & MSG_EOR)
+				m->msg_flags |= MSG_EOR;
+			skb_cb->bytes_read = 0;
+		}
 	} else {
 		copy = 0;
 		rc = 0;
-		if (err != TIPC_CONN_SHUTDOWN && connected && !m->msg_control)
+		if (err != TIPC_CONN_SHUTDOWN && connected && !m->msg_control) {
 			rc = -ECONNRESET;
+			goto exit;
+		}
 	}
-	if (unlikely(rc))
-		goto exit;
 
 	/* Mark message as group event if applicable */
 	if (unlikely(grp_evt)) {
@@ -1792,9 +1809,10 @@ static int tipc_recvmsg(struct socket *sock, struct msghdr *m,
 		tipc_node_distr_xmit(sock_net(sk), &xmitq);
 	}
 
-	tsk_advance_rx_queue(sk);
+	if (!skb_cb->bytes_read)
+		tsk_advance_rx_queue(sk);
 
-	if (likely(!connected))
+	if (likely(!connected) || skb_cb->bytes_read)
 		goto exit;
 
 	/* Send connection flow control advertisement when applicable */

commit 6d941bd6366a08bf5c660dbd4f8345427d56aefe
Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Date:   Thu Jul 8 15:25:06 2021 +0200

    PCI: Use pci_update_current_state() in pci_enable_device_flags()
    
    [ Upstream commit 14858dcc3b3587f4bb5c48e130ee7d68fc2b0a29 ]
    
    Updating the current_state field of struct pci_dev the way it is done
    in pci_enable_device_flags() before calling do_pci_enable_device() may
    not work.  For example, if the given PCI device depends on an ACPI
    power resource whose _STA method initially returns 0 ("off"), but the
    config space of the PCI device is accessible and the power state
    retrieved from the PCI_PM_CTRL register is D0, the current_state
    field in the struct pci_dev representing that device will get out of
    sync with the power.state of its ACPI companion object and that will
    lead to power management issues going forward.
    
    To avoid such issues, make pci_enable_device_flags() call
    pci_update_current_state() which takes ACPI device power management
    into account, if present, to retrieve the current power state of the
    device.
    
    Link: https://lore.kernel.org/lkml/20210314000439.3138941-1-luzmaximilian@gmail.com/
    Reported-by: Maximilian Luz <luzmaximilian@gmail.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Tested-by: Maximilian Luz <luzmaximilian@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 1a78bf39ee9a..077cc0512dd2 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -1591,11 +1591,7 @@ static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags)
 	 * so that things like MSI message writing will behave as expected
 	 * (e.g. if the device really is in D0 at enable time).
 	 */
-	if (dev->pm_cap) {
-		u16 pmcsr;
-		pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr);
-		dev->current_state = (pmcsr & PCI_PM_CTRL_STATE_MASK);
-	}
+	pci_update_current_state(dev, dev->current_state);
 
 	if (atomic_inc_return(&dev->enable_cnt) > 1)
 		return 0;		/* already enabled */

commit bcffed7ce794850379b31a588e19c1255dfbe05b
Author: Sean Anderson <sean.anderson@seco.com>
Date:   Thu Jul 1 14:56:38 2021 -0400

    crypto: mxs-dcp - Use sg_mapping_iter to copy data
    
    [ Upstream commit 2e6d793e1bf07fe5e20cfbbdcec9e1af7e5097eb ]
    
    This uses the sg_pcopy_from_buffer to copy data, instead of doing it
    ourselves.
    
    In addition to reducing code size, this fixes the following oops
    resulting from failing to kmap the page:
    
    [   68.896381] Unable to handle kernel NULL pointer dereference at virtual address 00000ab8
    [   68.904539] pgd = 3561adb3
    [   68.907475] [00000ab8] *pgd=00000000
    [   68.911153] Internal error: Oops: 805 [#1] ARM
    [   68.915618] Modules linked in: cfg80211 rfkill des_generic libdes arc4 libarc4 cbc ecb algif_skcipher sha256_generic libsha256 sha1_generic hmac aes_generic libaes cmac sha512_generic md5 md4 algif_hash af_alg i2c_imx i2c_core ci_hdrc_imx ci_hdrc mxs_dcp ulpi roles udc_core imx_sdma usbmisc_imx usb_common firmware_class virt_dma phy_mxs_usb nf_tables nfnetlink ip_tables x_tables ipv6 autofs4
    [   68.950741] CPU: 0 PID: 139 Comm: mxs_dcp_chan/ae Not tainted 5.10.34 #296
    [   68.958501] Hardware name: Freescale i.MX6 Ultralite (Device Tree)
    [   68.964710] PC is at memcpy+0xa8/0x330
    [   68.968479] LR is at 0xd7b2bc9d
    [   68.971638] pc : [<c053e7c8>]    lr : [<d7b2bc9d>]    psr: 000f0013
    [   68.977920] sp : c2cbbee4  ip : 00000010  fp : 00000010
    [   68.983159] r10: 00000000  r9 : c3283a40  r8 : 1a5a6f08
    [   68.988402] r7 : 4bfe0ecc  r6 : 76d8a220  r5 : c32f9050  r4 : 00000001
    [   68.994945] r3 : 00000ab8  r2 : fffffff0  r1 : c32f9050  r0 : 00000ab8
    [   69.001492] Flags: nzcv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment none
    [   69.008646] Control: 10c53c7d  Table: 83664059  DAC: 00000051
    [   69.014414] Process mxs_dcp_chan/ae (pid: 139, stack limit = 0x667b57ab)
    [   69.021133] Stack: (0xc2cbbee4 to 0xc2cbc000)
    [   69.025519] bee0:          c32f9050 c3235408 00000010 00000010 00000ab8 00000001 bf10406c
    [   69.033720] bf00: 00000000 00000000 00000010 00000000 c32355d0 832fb080 00000000 c13de2fc
    [   69.041921] bf20: c3628010 00000010 c33d5780 00000ab8 bf1067e8 00000002 c21e5010 c2cba000
    [   69.050125] bf40: c32f8040 00000000 bf106a40 c32f9040 c3283a80 00000001 bf105240 c3234040
    [   69.058327] bf60: ffffe000 c3204100 c2c69800 c2cba000 00000000 bf103b84 00000000 c2eddc54
    [   69.066530] bf80: c3204144 c0140d1c c2cba000 c2c69800 c0140be8 00000000 00000000 00000000
    [   69.074730] bfa0: 00000000 00000000 00000000 c0100114 00000000 00000000 00000000 00000000
    [   69.082932] bfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    [   69.091131] bfe0: 00000000 00000000 00000000 00000000 00000013 00000000 00000000 00000000
    [   69.099364] [<c053e7c8>] (memcpy) from [<bf10406c>] (dcp_chan_thread_aes+0x4e8/0x840 [mxs_dcp])
    [   69.108117] [<bf10406c>] (dcp_chan_thread_aes [mxs_dcp]) from [<c0140d1c>] (kthread+0x134/0x160)
    [   69.116941] [<c0140d1c>] (kthread) from [<c0100114>] (ret_from_fork+0x14/0x20)
    [   69.124178] Exception stack(0xc2cbbfb0 to 0xc2cbbff8)
    [   69.129250] bfa0:                                     00000000 00000000 00000000 00000000
    [   69.137450] bfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    [   69.145648] bfe0: 00000000 00000000 00000000 00000000 00000013 00000000
    [   69.152289] Code: e320f000 e4803004 e4804004 e4805004 (e4806004)
    
    Signed-off-by: Sean Anderson <sean.anderson@seco.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/mxs-dcp.c b/drivers/crypto/mxs-dcp.c
index d220e6a3f836..da834ae3586b 100644
--- a/drivers/crypto/mxs-dcp.c
+++ b/drivers/crypto/mxs-dcp.c
@@ -297,21 +297,20 @@ static int mxs_dcp_aes_block_crypt(struct crypto_async_request *arq)
 
 	struct scatterlist *dst = req->dst;
 	struct scatterlist *src = req->src;
-	const int nents = sg_nents(req->src);
+	int dst_nents = sg_nents(dst);
 
 	const int out_off = DCP_BUF_SZ;
 	uint8_t *in_buf = sdcp->coh->aes_in_buf;
 	uint8_t *out_buf = sdcp->coh->aes_out_buf;
 
-	uint8_t *out_tmp, *src_buf, *dst_buf = NULL;
 	uint32_t dst_off = 0;
+	uint8_t *src_buf = NULL;
 	uint32_t last_out_len = 0;
 
 	uint8_t *key = sdcp->coh->aes_key;
 
 	int ret = 0;
-	int split = 0;
-	unsigned int i, len, clen, rem = 0, tlen = 0;
+	unsigned int i, len, clen, tlen = 0;
 	int init = 0;
 	bool limit_hit = false;
 
@@ -329,7 +328,7 @@ static int mxs_dcp_aes_block_crypt(struct crypto_async_request *arq)
 		memset(key + AES_KEYSIZE_128, 0, AES_KEYSIZE_128);
 	}
 
-	for_each_sg(req->src, src, nents, i) {
+	for_each_sg(req->src, src, sg_nents(src), i) {
 		src_buf = sg_virt(src);
 		len = sg_dma_len(src);
 		tlen += len;
@@ -354,34 +353,17 @@ static int mxs_dcp_aes_block_crypt(struct crypto_async_request *arq)
 			 * submit the buffer.
 			 */
 			if (actx->fill == out_off || sg_is_last(src) ||
-				limit_hit) {
+			    limit_hit) {
 				ret = mxs_dcp_run_aes(actx, req, init);
 				if (ret)
 					return ret;
 				init = 0;
 
-				out_tmp = out_buf;
+				sg_pcopy_from_buffer(dst, dst_nents, out_buf,
+						     actx->fill, dst_off);
+				dst_off += actx->fill;
 				last_out_len = actx->fill;
-				while (dst && actx->fill) {
-					if (!split) {
-						dst_buf = sg_virt(dst);
-						dst_off = 0;
-					}
-					rem = min(sg_dma_len(dst) - dst_off,
-						  actx->fill);
-
-					memcpy(dst_buf + dst_off, out_tmp, rem);
-					out_tmp += rem;
-					dst_off += rem;
-					actx->fill -= rem;
-
-					if (dst_off == sg_dma_len(dst)) {
-						dst = sg_next(dst);
-						split = 0;
-					} else {
-						split = 1;
-					}
-				}
+				actx->fill = 0;
 			}
 		} while (len);
 

commit 93ef984d68ff68354598766c0efc2ef1e458027f
Author: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Date:   Thu Jun 17 13:28:57 2021 +0200

    media: dib8000: rewrite the init prbs logic
    
    [ Upstream commit 8db11aebdb8f93f46a8513c22c9bd52fa23263aa ]
    
    The logic at dib8000_get_init_prbs() has a few issues:
    
    1. the tables used there has an extra unused value at the beginning;
    2. the dprintk() message doesn't write the right value when
       transmission mode is not 8K;
    3. the array overflow validation is done by the callers.
    
    Rewrite the code to fix such issues.
    
    This should also shut up those smatch warnings:
    
            drivers/media/dvb-frontends/dib8000.c:2125 dib8000_get_init_prbs() error: buffer overflow 'lut_prbs_8k' 14 <= 14
            drivers/media/dvb-frontends/dib8000.c:2129 dib8000_get_init_prbs() error: buffer overflow 'lut_prbs_2k' 14 <= 14
            drivers/media/dvb-frontends/dib8000.c:2131 dib8000_get_init_prbs() error: buffer overflow 'lut_prbs_4k' 14 <= 14
            drivers/media/dvb-frontends/dib8000.c:2134 dib8000_get_init_prbs() error: buffer overflow 'lut_prbs_8k' 14 <= 14
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/dvb-frontends/dib8000.c b/drivers/media/dvb-frontends/dib8000.c
index 3c3f8cb14845..5fa787e023c7 100644
--- a/drivers/media/dvb-frontends/dib8000.c
+++ b/drivers/media/dvb-frontends/dib8000.c
@@ -2110,32 +2110,55 @@ static void dib8000_load_ana_fe_coefs(struct dib8000_state *state, const s16 *an
 			dib8000_write_word(state, 117 + mode, ana_fe[mode]);
 }
 
-static const u16 lut_prbs_2k[14] = {
-	0, 0x423, 0x009, 0x5C7, 0x7A6, 0x3D8, 0x527, 0x7FF, 0x79B, 0x3D6, 0x3A2, 0x53B, 0x2F4, 0x213
+static const u16 lut_prbs_2k[13] = {
+	0x423, 0x009, 0x5C7,
+	0x7A6, 0x3D8, 0x527,
+	0x7FF, 0x79B, 0x3D6,
+	0x3A2, 0x53B, 0x2F4,
+	0x213
 };
-static const u16 lut_prbs_4k[14] = {
-	0, 0x208, 0x0C3, 0x7B9, 0x423, 0x5C7, 0x3D8, 0x7FF, 0x3D6, 0x53B, 0x213, 0x029, 0x0D0, 0x48E
+
+static const u16 lut_prbs_4k[13] = {
+	0x208, 0x0C3, 0x7B9,
+	0x423, 0x5C7, 0x3D8,
+	0x7FF, 0x3D6, 0x53B,
+	0x213, 0x029, 0x0D0,
+	0x48E
 };
-static const u16 lut_prbs_8k[14] = {
-	0, 0x740, 0x069, 0x7DD, 0x208, 0x7B9, 0x5C7, 0x7FF, 0x53B, 0x029, 0x48E, 0x4C4, 0x367, 0x684
+
+static const u16 lut_prbs_8k[13] = {
+	0x740, 0x069, 0x7DD,
+	0x208, 0x7B9, 0x5C7,
+	0x7FF, 0x53B, 0x029,
+	0x48E, 0x4C4, 0x367,
+	0x684
 };
 
 static u16 dib8000_get_init_prbs(struct dib8000_state *state, u16 subchannel)
 {
 	int sub_channel_prbs_group = 0;
+	int prbs_group;
 
-	sub_channel_prbs_group = (subchannel / 3) + 1;
-	dprintk("sub_channel_prbs_group = %d , subchannel =%d prbs = 0x%04x\n", sub_channel_prbs_group, subchannel, lut_prbs_8k[sub_channel_prbs_group]);
+	sub_channel_prbs_group = subchannel / 3;
+	if (sub_channel_prbs_group >= ARRAY_SIZE(lut_prbs_2k))
+		return 0;
 
 	switch (state->fe[0]->dtv_property_cache.transmission_mode) {
 	case TRANSMISSION_MODE_2K:
-			return lut_prbs_2k[sub_channel_prbs_group];
+		prbs_group = lut_prbs_2k[sub_channel_prbs_group];
+		break;
 	case TRANSMISSION_MODE_4K:
-			return lut_prbs_4k[sub_channel_prbs_group];
+		prbs_group =  lut_prbs_4k[sub_channel_prbs_group];
+		break;
 	default:
 	case TRANSMISSION_MODE_8K:
-			return lut_prbs_8k[sub_channel_prbs_group];
+		prbs_group = lut_prbs_8k[sub_channel_prbs_group];
 	}
+
+	dprintk("sub_channel_prbs_group = %d , subchannel =%d prbs = 0x%04x\n",
+		sub_channel_prbs_group, subchannel, prbs_group);
+
+	return prbs_group;
 }
 
 static void dib8000_set_13seg_channel(struct dib8000_state *state)
@@ -2412,10 +2435,8 @@ static void dib8000_set_isdbt_common_channel(struct dib8000_state *state, u8 seq
 	/* TSB or ISDBT ? apply it now */
 	if (c->isdbt_sb_mode) {
 		dib8000_set_sb_channel(state);
-		if (c->isdbt_sb_subchannel < 14)
-			init_prbs = dib8000_get_init_prbs(state, c->isdbt_sb_subchannel);
-		else
-			init_prbs = 0;
+		init_prbs = dib8000_get_init_prbs(state,
+						  c->isdbt_sb_subchannel);
 	} else {
 		dib8000_set_13seg_channel(state);
 		init_prbs = 0xfff;
@@ -3007,6 +3028,7 @@ static int dib8000_tune(struct dvb_frontend *fe)
 
 	unsigned long *timeout = &state->timeout;
 	unsigned long now = jiffies;
+	u16 init_prbs;
 #ifdef DIB8000_AGC_FREEZE
 	u16 agc1, agc2;
 #endif
@@ -3305,8 +3327,10 @@ static int dib8000_tune(struct dvb_frontend *fe)
 		break;
 
 	case CT_DEMOD_STEP_11:  /* 41 : init prbs autosearch */
-		if (state->subchannel <= 41) {
-			dib8000_set_subchannel_prbs(state, dib8000_get_init_prbs(state, state->subchannel));
+		init_prbs = dib8000_get_init_prbs(state, state->subchannel);
+
+		if (init_prbs) {
+			dib8000_set_subchannel_prbs(state, init_prbs);
 			*tune_state = CT_DEMOD_STEP_9;
 		} else {
 			*tune_state = CT_DEMOD_STOP;

commit e826df5864e449f89c2d056aab998c813d40c932
Author: Nadav Amit <namit@vmware.com>
Date:   Thu Sep 2 14:58:59 2021 -0700

    userfaultfd: prevent concurrent API initialization
    
    [ Upstream commit 22e5fe2a2a279d9a6fcbdfb4dffe73821bef1c90 ]
    
    userfaultfd assumes that the enabled features are set once and never
    changed after UFFDIO_API ioctl succeeded.
    
    However, currently, UFFDIO_API can be called concurrently from two
    different threads, succeed on both threads and leave userfaultfd's
    features in non-deterministic state.  Theoretically, other uffd operations
    (ioctl's and page-faults) can be dispatched while adversely affected by
    such changes of features.
    
    Moreover, the writes to ctx->state and ctx->features are not ordered,
    which can - theoretically, again - let userfaultfd_ioctl() think that
    userfaultfd API completed, while the features are still not initialized.
    
    To avoid races, it is arguably best to get rid of ctx->state.  Since there
    are only 2 states, record the API initialization in ctx->features as the
    uppermost bit and remove ctx->state.
    
    Link: https://lkml.kernel.org/r/20210808020724.1022515-3-namit@vmware.com
    Fixes: 9cd75c3cd4c3d ("userfaultfd: non-cooperative: add ability to report non-PF events from uffd descriptor")
    Signed-off-by: Nadav Amit <namit@vmware.com>
    Cc: Alexander Viro <viro@zeniv.linux.org.uk>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Axel Rasmussen <axelrasmussen@google.com>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: Mike Rapoport <rppt@linux.vnet.ibm.com>
    Cc: Peter Xu <peterx@redhat.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c
index d269d1139f7f..23c8efc967af 100644
--- a/fs/userfaultfd.c
+++ b/fs/userfaultfd.c
@@ -32,11 +32,6 @@
 
 static struct kmem_cache *userfaultfd_ctx_cachep __read_mostly;
 
-enum userfaultfd_state {
-	UFFD_STATE_WAIT_API,
-	UFFD_STATE_RUNNING,
-};
-
 /*
  * Start with fault_pending_wqh and fault_wqh so they're more likely
  * to be in the same cacheline.
@@ -68,8 +63,6 @@ struct userfaultfd_ctx {
 	unsigned int flags;
 	/* features requested from the userspace */
 	unsigned int features;
-	/* state machine */
-	enum userfaultfd_state state;
 	/* released */
 	bool released;
 	/* memory mappings are changing because of non-cooperative event */
@@ -103,6 +96,14 @@ struct userfaultfd_wake_range {
 	unsigned long len;
 };
 
+/* internal indication that UFFD_API ioctl was successfully executed */
+#define UFFD_FEATURE_INITIALIZED		(1u << 31)
+
+static bool userfaultfd_is_initialized(struct userfaultfd_ctx *ctx)
+{
+	return ctx->features & UFFD_FEATURE_INITIALIZED;
+}
+
 static int userfaultfd_wake_function(wait_queue_entry_t *wq, unsigned mode,
 				     int wake_flags, void *key)
 {
@@ -700,7 +701,6 @@ int dup_userfaultfd(struct vm_area_struct *vma, struct list_head *fcs)
 
 		atomic_set(&ctx->refcount, 1);
 		ctx->flags = octx->flags;
-		ctx->state = UFFD_STATE_RUNNING;
 		ctx->features = octx->features;
 		ctx->released = false;
 		ctx->mmap_changing = false;
@@ -981,38 +981,33 @@ static __poll_t userfaultfd_poll(struct file *file, poll_table *wait)
 
 	poll_wait(file, &ctx->fd_wqh, wait);
 
-	switch (ctx->state) {
-	case UFFD_STATE_WAIT_API:
+	if (!userfaultfd_is_initialized(ctx))
 		return EPOLLERR;
-	case UFFD_STATE_RUNNING:
-		/*
-		 * poll() never guarantees that read won't block.
-		 * userfaults can be waken before they're read().
-		 */
-		if (unlikely(!(file->f_flags & O_NONBLOCK)))
-			return EPOLLERR;
-		/*
-		 * lockless access to see if there are pending faults
-		 * __pollwait last action is the add_wait_queue but
-		 * the spin_unlock would allow the waitqueue_active to
-		 * pass above the actual list_add inside
-		 * add_wait_queue critical section. So use a full
-		 * memory barrier to serialize the list_add write of
-		 * add_wait_queue() with the waitqueue_active read
-		 * below.
-		 */
-		ret = 0;
-		smp_mb();
-		if (waitqueue_active(&ctx->fault_pending_wqh))
-			ret = EPOLLIN;
-		else if (waitqueue_active(&ctx->event_wqh))
-			ret = EPOLLIN;
-
-		return ret;
-	default:
-		WARN_ON_ONCE(1);
+
+	/*
+	 * poll() never guarantees that read won't block.
+	 * userfaults can be waken before they're read().
+	 */
+	if (unlikely(!(file->f_flags & O_NONBLOCK)))
 		return EPOLLERR;
-	}
+	/*
+	 * lockless access to see if there are pending faults
+	 * __pollwait last action is the add_wait_queue but
+	 * the spin_unlock would allow the waitqueue_active to
+	 * pass above the actual list_add inside
+	 * add_wait_queue critical section. So use a full
+	 * memory barrier to serialize the list_add write of
+	 * add_wait_queue() with the waitqueue_active read
+	 * below.
+	 */
+	ret = 0;
+	smp_mb();
+	if (waitqueue_active(&ctx->fault_pending_wqh))
+		ret = EPOLLIN;
+	else if (waitqueue_active(&ctx->event_wqh))
+		ret = EPOLLIN;
+
+	return ret;
 }
 
 static const struct file_operations userfaultfd_fops;
@@ -1206,7 +1201,7 @@ static ssize_t userfaultfd_read(struct file *file, char __user *buf,
 	struct uffd_msg msg;
 	int no_wait = file->f_flags & O_NONBLOCK;
 
-	if (ctx->state == UFFD_STATE_WAIT_API)
+	if (!userfaultfd_is_initialized(ctx))
 		return -EINVAL;
 
 	for (;;) {
@@ -1808,9 +1803,10 @@ static int userfaultfd_zeropage(struct userfaultfd_ctx *ctx,
 static inline unsigned int uffd_ctx_features(__u64 user_features)
 {
 	/*
-	 * For the current set of features the bits just coincide
+	 * For the current set of features the bits just coincide. Set
+	 * UFFD_FEATURE_INITIALIZED to mark the features as enabled.
 	 */
-	return (unsigned int)user_features;
+	return (unsigned int)user_features | UFFD_FEATURE_INITIALIZED;
 }
 
 /*
@@ -1823,12 +1819,10 @@ static int userfaultfd_api(struct userfaultfd_ctx *ctx,
 {
 	struct uffdio_api uffdio_api;
 	void __user *buf = (void __user *)arg;
+	unsigned int ctx_features;
 	int ret;
 	__u64 features;
 
-	ret = -EINVAL;
-	if (ctx->state != UFFD_STATE_WAIT_API)
-		goto out;
 	ret = -EFAULT;
 	if (copy_from_user(&uffdio_api, buf, sizeof(uffdio_api)))
 		goto out;
@@ -1845,9 +1839,13 @@ static int userfaultfd_api(struct userfaultfd_ctx *ctx,
 	ret = -EFAULT;
 	if (copy_to_user(buf, &uffdio_api, sizeof(uffdio_api)))
 		goto out;
-	ctx->state = UFFD_STATE_RUNNING;
+
 	/* only enable the requested features for this uffd context */
-	ctx->features = uffd_ctx_features(features);
+	ctx_features = uffd_ctx_features(features);
+	ret = -EINVAL;
+	if (cmpxchg(&ctx->features, 0, ctx_features) != 0)
+		goto err_out;
+
 	ret = 0;
 out:
 	return ret;
@@ -1864,7 +1862,7 @@ static long userfaultfd_ioctl(struct file *file, unsigned cmd,
 	int ret = -EINVAL;
 	struct userfaultfd_ctx *ctx = file->private_data;
 
-	if (cmd != UFFDIO_API && ctx->state == UFFD_STATE_WAIT_API)
+	if (cmd != UFFDIO_API && !userfaultfd_is_initialized(ctx))
 		return -EINVAL;
 
 	switch(cmd) {
@@ -1962,7 +1960,6 @@ SYSCALL_DEFINE1(userfaultfd, int, flags)
 	atomic_set(&ctx->refcount, 1);
 	ctx->flags = flags;
 	ctx->features = 0;
-	ctx->state = UFFD_STATE_WAIT_API;
 	ctx->released = false;
 	ctx->mmap_changing = false;
 	ctx->mm = current->mm;

commit 6fddf7111ffa47d0e9d63d12389b7a9fe8296a5c
Author: Oleksij Rempel <o.rempel@pengutronix.de>
Date:   Thu Sep 2 09:19:51 2021 +0200

    MIPS: Malta: fix alignment of the devicetree buffer
    
    [ Upstream commit bea6a94a279bcbe6b2cde348782b28baf12255a5 ]
    
    Starting with following patch MIPS Malta is not able to boot:
    | commit 79edff12060fe7772af08607eff50c0e2486c5ba
    | Author: Rob Herring <robh@kernel.org>
    | scripts/dtc: Update to upstream version v1.6.0-51-g183df9e9c2b9
    
    The reason is the alignment test added to the fdt_ro_probe_(). To fix
    this issue, we need to make sure that fdt_buf is aligned.
    
    Since the dtc patch was designed to uncover potential issue, I handle
    initial MIPS Malta patch as initial bug.
    
    Fixes: e81a8c7dabac ("MIPS: Malta: Setup RAM regions via DT")
    Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/mti-malta/malta-dtshim.c b/arch/mips/mti-malta/malta-dtshim.c
index 7859b6e49863..5b5d78a7882a 100644
--- a/arch/mips/mti-malta/malta-dtshim.c
+++ b/arch/mips/mti-malta/malta-dtshim.c
@@ -26,7 +26,7 @@
 #define  ROCIT_CONFIG_GEN1_MEMMAP_SHIFT	8
 #define  ROCIT_CONFIG_GEN1_MEMMAP_MASK	(0xf << 8)
 
-static unsigned char fdt_buf[16 << 10] __initdata;
+static unsigned char fdt_buf[16 << 10] __initdata __aligned(8);
 
 /* determined physical memory size, not overridden by command line args	 */
 extern unsigned long physical_memsize;

commit efd37f01d719a0f51dcc4929ca2edae46e7a600b
Author: Chao Yu <chao@kernel.org>
Date:   Wed Aug 25 19:34:19 2021 +0800

    f2fs: fix to unmap pages from userspace process in punch_hole()
    
    [ Upstream commit c8dc3047c48540183744f959412d44b08c5435e1 ]
    
    We need to unmap pages from userspace process before removing pagecache
    in punch_hole() like we did in f2fs_setattr().
    
    Similar change:
    commit 5e44f8c374dc ("ext4: hole-punch use truncate_pagecache_range")
    
    Fixes: fbfa2cc58d53 ("f2fs: add file operations")
    Signed-off-by: Chao Yu <chao@kernel.org>
    Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 95330dfdbb1a..2a7249496c57 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -957,7 +957,6 @@ static int punch_hole(struct inode *inode, loff_t offset, loff_t len)
 		}
 
 		if (pg_start < pg_end) {
-			struct address_space *mapping = inode->i_mapping;
 			loff_t blk_start, blk_end;
 			struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
 
@@ -969,8 +968,7 @@ static int punch_hole(struct inode *inode, loff_t offset, loff_t len)
 			down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
 			down_write(&F2FS_I(inode)->i_mmap_sem);
 
-			truncate_inode_pages_range(mapping, blk_start,
-					blk_end - 1);
+			truncate_pagecache_range(inode, blk_start, blk_end - 1);
 
 			f2fs_lock_op(sbi);
 			ret = f2fs_truncate_hole(inode, pg_start, pg_end);

commit 8002259a366e8a7206f7e706a1e4e33bee6efcef
Author: Chao Yu <chao@kernel.org>
Date:   Tue Aug 24 08:12:08 2021 +0800

    f2fs: fix to account missing .skipped_gc_rwsem
    
    [ Upstream commit ad126ebddecbf696e0cf214ff56c7b170fa9f0f7 ]
    
    There is a missing place we forgot to account .skipped_gc_rwsem, fix it.
    
    Fixes: 6f8d4455060d ("f2fs: avoid fi->i_gc_rwsem[WRITE] lock in f2fs_gc")
    Signed-off-by: Chao Yu <chao@kernel.org>
    Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
index 700c39ec99f5..38299ccfdf6e 100644
--- a/fs/f2fs/gc.c
+++ b/fs/f2fs/gc.c
@@ -998,8 +998,10 @@ static void gc_data_segment(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
 			bool locked = false;
 
 			if (S_ISREG(inode->i_mode)) {
-				if (!down_write_trylock(&fi->i_gc_rwsem[READ]))
+				if (!down_write_trylock(&fi->i_gc_rwsem[READ])) {
+					sbi->skipped_gc_rwsem++;
 					continue;
+				}
 				if (!down_write_trylock(
 						&fi->i_gc_rwsem[WRITE])) {
 					sbi->skipped_gc_rwsem++;

commit 55188428827775af6054948dcea7edd8e8573d57
Author: David Howells <dhowells@redhat.com>
Date:   Thu Jun 17 14:21:00 2021 +0100

    fscache: Fix cookie key hashing
    
    [ Upstream commit 35b72573e977ed6b18b094136a4fa3e0ffb13603 ]
    
    The current hash algorithm used for hashing cookie keys is really bad,
    producing almost no dispersion (after a test kernel build, ~30000 files
    were split over just 18 out of the 32768 hash buckets).
    
    Borrow the full_name_hash() hash function into fscache to do the hashing
    for cookie keys and, in the future, volume keys.
    
    I don't want to use full_name_hash() as-is because I want the hash value to
    be consistent across arches and over time as the hash value produced may
    get used on disk.
    
    I can also optimise parts of it away as the key will always be a padded
    array of aligned 32-bit words.
    
    Fixes: ec0328e46d6e ("fscache: Maintain a catalogue of allocated cookies")
    Signed-off-by: David Howells <dhowells@redhat.com>
    Reviewed-by: Jeff Layton <jlayton@redhat.com>
    cc: linux-cachefs@redhat.com
    Link: https://lore.kernel.org/r/162431201844.2908479.8293647220901514696.stgit@warthog.procyon.org.uk/
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/fscache/cookie.c b/fs/fscache/cookie.c
index c550512ce335..2ff05adfc22a 100644
--- a/fs/fscache/cookie.c
+++ b/fs/fscache/cookie.c
@@ -78,10 +78,8 @@ void fscache_free_cookie(struct fscache_cookie *cookie)
 static int fscache_set_key(struct fscache_cookie *cookie,
 			   const void *index_key, size_t index_key_len)
 {
-	unsigned long long h;
 	u32 *buf;
 	int bufs;
-	int i;
 
 	bufs = DIV_ROUND_UP(index_key_len, sizeof(*buf));
 
@@ -95,17 +93,7 @@ static int fscache_set_key(struct fscache_cookie *cookie,
 	}
 
 	memcpy(buf, index_key, index_key_len);
-
-	/* Calculate a hash and combine this with the length in the first word
-	 * or first half word
-	 */
-	h = (unsigned long)cookie->parent;
-	h += index_key_len + cookie->type;
-
-	for (i = 0; i < bufs; i++)
-		h += buf[i];
-
-	cookie->key_hash = h ^ (h >> 32);
+	cookie->key_hash = fscache_hash(0, buf, bufs);
 	return 0;
 }
 
diff --git a/fs/fscache/internal.h b/fs/fscache/internal.h
index d6209022e965..cc87288a5448 100644
--- a/fs/fscache/internal.h
+++ b/fs/fscache/internal.h
@@ -101,6 +101,8 @@ extern struct workqueue_struct *fscache_object_wq;
 extern struct workqueue_struct *fscache_op_wq;
 DECLARE_PER_CPU(wait_queue_head_t, fscache_object_cong_wait);
 
+extern unsigned int fscache_hash(unsigned int salt, unsigned int *data, unsigned int n);
+
 static inline bool fscache_object_congested(void)
 {
 	return workqueue_congested(WORK_CPU_UNBOUND, fscache_object_wq);
diff --git a/fs/fscache/main.c b/fs/fscache/main.c
index 30ad89db1efc..aa49234e9520 100644
--- a/fs/fscache/main.c
+++ b/fs/fscache/main.c
@@ -98,6 +98,45 @@ static struct ctl_table fscache_sysctls_root[] = {
 };
 #endif
 
+/*
+ * Mixing scores (in bits) for (7,20):
+ * Input delta: 1-bit      2-bit
+ * 1 round:     330.3     9201.6
+ * 2 rounds:   1246.4    25475.4
+ * 3 rounds:   1907.1    31295.1
+ * 4 rounds:   2042.3    31718.6
+ * Perfect:    2048      31744
+ *            (32*64)   (32*31/2 * 64)
+ */
+#define HASH_MIX(x, y, a)	\
+	(	x ^= (a),	\
+	y ^= x,	x = rol32(x, 7),\
+	x += y,	y = rol32(y,20),\
+	y *= 9			)
+
+static inline unsigned int fold_hash(unsigned long x, unsigned long y)
+{
+	/* Use arch-optimized multiply if one exists */
+	return __hash_32(y ^ __hash_32(x));
+}
+
+/*
+ * Generate a hash.  This is derived from full_name_hash(), but we want to be
+ * sure it is arch independent and that it doesn't change as bits of the
+ * computed hash value might appear on disk.  The caller also guarantees that
+ * the hashed data will be a series of aligned 32-bit words.
+ */
+unsigned int fscache_hash(unsigned int salt, unsigned int *data, unsigned int n)
+{
+	unsigned int a, x = 0, y = salt;
+
+	for (; n; n--) {
+		a = *data++;
+		HASH_MIX(x, y, a);
+	}
+	return fold_hash(x, y);
+}
+
 /*
  * initialise the fs caching module
  */

commit 942a39041bc579902069eed9b8b174deefe41c68
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Thu Aug 26 16:08:22 2021 +0200

    platform/x86: dell-smbios-wmi: Add missing kfree in error-exit from run_smbios_call
    
    [ Upstream commit 0487d4fc42d7f31a56cfd9e2237f9ebd889e6112 ]
    
    As pointed out be Kees Cook if we return -EIO because the
    obj->type != ACPI_TYPE_BUFFER, then we must kfree the
    output buffer before the return.
    
    Fixes: 1a258e670434 ("platform/x86: dell-smbios-wmi: Add new WMI dispatcher driver")
    Reported-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Link: https://lore.kernel.org/r/20210826140822.71198-1-hdegoede@redhat.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/platform/x86/dell-smbios-wmi.c b/drivers/platform/x86/dell-smbios-wmi.c
index ccccce9b67ef..0ebcf412f6ca 100644
--- a/drivers/platform/x86/dell-smbios-wmi.c
+++ b/drivers/platform/x86/dell-smbios-wmi.c
@@ -72,6 +72,7 @@ static int run_smbios_call(struct wmi_device *wdev)
 		if (obj->type == ACPI_TYPE_INTEGER)
 			dev_dbg(&wdev->dev, "SMBIOS call failed: %llu\n",
 				obj->integer.value);
+		kfree(output.pointer);
 		return -EIO;
 	}
 	memcpy(&priv->buf->std, obj->buffer.pointer, obj->buffer.length);

commit 0cd59378234072a71789aeb411a6ae8cce187a34
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Tue Aug 10 11:47:53 2021 +0300

    scsi: qedi: Fix error codes in qedi_alloc_global_queues()
    
    [ Upstream commit 4dbe57d46d54a847875fa33e7d05877bb341585e ]
    
    This function had some left over code that returned 1 on error instead
    negative error codes.  Convert everything to use negative error codes.  The
    caller treats all non-zero returns the same so this does not affect run
    time.
    
    A couple places set "rc" instead of "status" so those error paths ended up
    returning success by mistake.  Get rid of the "rc" variable and use
    "status" everywhere.
    
    Remove the bogus "status = 0" initialization, as a future proofing measure
    so the compiler will warn about uninitialized error codes.
    
    Link: https://lore.kernel.org/r/20210810084753.GD23810@kili
    Fixes: ace7f46ba5fd ("scsi: qedi: Add QLogic FastLinQ offload iSCSI driver framework.")
    Acked-by: Manish Rangankar <mrangankar@marvell.com>
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 7665fd641886..ab66e1f0fdfa 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -1507,7 +1507,7 @@ static int qedi_alloc_global_queues(struct qedi_ctx *qedi)
 {
 	u32 *list;
 	int i;
-	int status = 0, rc;
+	int status;
 	u32 *pbl;
 	dma_addr_t page;
 	int num_pages;
@@ -1518,14 +1518,14 @@ static int qedi_alloc_global_queues(struct qedi_ctx *qedi)
 	 */
 	if (!qedi->num_queues) {
 		QEDI_ERR(&qedi->dbg_ctx, "No MSI-X vectors available!\n");
-		return 1;
+		return -ENOMEM;
 	}
 
 	/* Make sure we allocated the PBL that will contain the physical
 	 * addresses of our queues
 	 */
 	if (!qedi->p_cpuq) {
-		status = 1;
+		status = -EINVAL;
 		goto mem_alloc_failure;
 	}
 
@@ -1540,13 +1540,13 @@ static int qedi_alloc_global_queues(struct qedi_ctx *qedi)
 		  "qedi->global_queues=%p.\n", qedi->global_queues);
 
 	/* Allocate DMA coherent buffers for BDQ */
-	rc = qedi_alloc_bdq(qedi);
-	if (rc)
+	status = qedi_alloc_bdq(qedi);
+	if (status)
 		goto mem_alloc_failure;
 
 	/* Allocate DMA coherent buffers for NVM_ISCSI_CFG */
-	rc = qedi_alloc_nvm_iscsi_cfg(qedi);
-	if (rc)
+	status = qedi_alloc_nvm_iscsi_cfg(qedi);
+	if (status)
 		goto mem_alloc_failure;
 
 	/* Allocate a CQ and an associated PBL for each MSI-X

commit d3b721153985a0ada351170846474bdfda949f49
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Thu Jul 22 11:39:29 2021 +0800

    pinctrl: single: Fix error return code in pcs_parse_bits_in_pinctrl_entry()
    
    [ Upstream commit d789a490d32fdf0465275e3607f8a3bc87d3f3ba ]
    
    Fix to return -ENOTSUPP instead of 0 when PCS_HAS_PINCONF is true, which
    is the same as that returned in pcs_parse_pinconf().
    
    Fixes: 4e7e8017a80e ("pinctrl: pinctrl-single: enhance to configure multiple pins of different modules")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Link: https://lore.kernel.org/r/20210722033930.4034-2-thunder.leizhen@huawei.com
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c
index 04a4e761e9a9..c2f807bf3489 100644
--- a/drivers/pinctrl/pinctrl-single.c
+++ b/drivers/pinctrl/pinctrl-single.c
@@ -1201,6 +1201,7 @@ static int pcs_parse_bits_in_pinctrl_entry(struct pcs_device *pcs,
 
 	if (PCS_HAS_PINCONF) {
 		dev_err(pcs->dev, "pinconf not supported\n");
+		res = -ENOTSUPP;
 		goto free_pingroups;
 	}
 

commit 9f58d402beec798fe7a284ff90c41237dda07eb2
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Sun Jul 18 19:33:09 2021 -0700

    openrisc: don't printk() unconditionally
    
    [ Upstream commit 946e1052cdcc7e585ee5d1e72528ca49fb295243 ]
    
    Don't call printk() when CONFIG_PRINTK is not set.
    Fixes the following build errors:
    
    or1k-linux-ld: arch/openrisc/kernel/entry.o: in function `_external_irq_handler':
    (.text+0x804): undefined reference to `printk'
    (.text+0x804): relocation truncated to fit: R_OR1K_INSN_REL_26 against undefined symbol `printk'
    
    Fixes: 9d02a4283e9c ("OpenRISC: Boot code")
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Reported-by: kernel test robot <lkp@intel.com>
    Cc: Jonas Bonn <jonas@southpole.se>
    Cc: Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>
    Cc: Stafford Horne <shorne@gmail.com>
    Cc: openrisc@lists.librecores.org
    Signed-off-by: Stafford Horne <shorne@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/openrisc/kernel/entry.S b/arch/openrisc/kernel/entry.S
index 01b59d2ce174..c2c3ce8a0f84 100644
--- a/arch/openrisc/kernel/entry.S
+++ b/arch/openrisc/kernel/entry.S
@@ -551,6 +551,7 @@ EXCEPTION_ENTRY(_external_irq_handler)
 	l.bnf	1f			// ext irq enabled, all ok.
 	l.nop
 
+#ifdef CONFIG_PRINTK
 	l.addi  r1,r1,-0x8
 	l.movhi r3,hi(42f)
 	l.ori	r3,r3,lo(42f)
@@ -564,6 +565,7 @@ EXCEPTION_ENTRY(_external_irq_handler)
 		.string "\n\rESR interrupt bug: in _external_irq_handler (ESR %x)\n\r"
 		.align 4
 	.previous
+#endif
 
 	l.ori	r4,r4,SPR_SR_IEE	// fix the bug
 //	l.sw	PT_SR(r1),r4

commit 65c923f99bdd09e5f6e102d3793bf366d846d94c
Author: Michal Suchanek <msuchanek@suse.de>
Date:   Thu Jul 29 20:01:03 2021 +0200

    powerpc/stacktrace: Include linux/delay.h
    
    [ Upstream commit a6cae77f1bc89368a4e2822afcddc45c3062d499 ]
    
    commit 7c6986ade69e ("powerpc/stacktrace: Fix spurious "stale" traces in raise_backtrace_ipi()")
    introduces udelay() call without including the linux/delay.h header.
    This may happen to work on master but the header that declares the
    functionshould be included nonetheless.
    
    Fixes: 7c6986ade69e ("powerpc/stacktrace: Fix spurious "stale" traces in raise_backtrace_ipi()")
    Signed-off-by: Michal Suchanek <msuchanek@suse.de>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210729180103.15578-1-msuchanek@suse.de
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/powerpc/kernel/stacktrace.c b/arch/powerpc/kernel/stacktrace.c
index 23b5f755e419..dadcc8bab336 100644
--- a/arch/powerpc/kernel/stacktrace.c
+++ b/arch/powerpc/kernel/stacktrace.c
@@ -8,6 +8,7 @@
  * Copyright 2018 Nick Piggin, Michael Ellerman, IBM Corp.
  */
 
+#include <linux/delay.h>
 #include <linux/export.h>
 #include <linux/kallsyms.h>
 #include <linux/module.h>

commit cca5a2a545c4780315aeb0f91bb84e363eb1f2aa
Author: Jason Gunthorpe <jgg@nvidia.com>
Date:   Fri Jul 16 15:39:12 2021 -0300

    vfio: Use config not menuconfig for VFIO_NOIOMMU
    
    [ Upstream commit 26c22cfde5dd6e63f25c48458b0185dcb0fbb2fd ]
    
    VFIO_NOIOMMU is supposed to be an element in the VFIO menu, not start
    a new menu. Correct this copy-paste mistake.
    
    Fixes: 03a76b60f8ba ("vfio: Include No-IOMMU mode")
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Reviewed-by: Cornelia Huck <cohuck@redhat.com>
    Link: https://lore.kernel.org/r/0-v1-3f0b685c3679+478-vfio_menuconfig_jgg@nvidia.com
    Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/vfio/Kconfig b/drivers/vfio/Kconfig
index c84333eb5eb5..b7765271d0fb 100644
--- a/drivers/vfio/Kconfig
+++ b/drivers/vfio/Kconfig
@@ -29,7 +29,7 @@ menuconfig VFIO
 
 	  If you don't know what to do here, say N.
 
-menuconfig VFIO_NOIOMMU
+config VFIO_NOIOMMU
 	bool "VFIO No-IOMMU support"
 	depends on VFIO
 	help

commit 90a6672480ae5eb9088c369431c26c7ddf4e3295
Author: Jaehyoung Choi <jkkkkk.choi@samsung.com>
Date:   Fri Jul 30 22:29:05 2021 +0300

    pinctrl: samsung: Fix pinctrl bank pin count
    
    [ Upstream commit 70115558ab02fe8d28a6634350b3491a542aaa02 ]
    
    Commit 1abd18d1a51a ("pinctrl: samsung: Register pinctrl before GPIO")
    changes the order of GPIO and pinctrl registration: now pinctrl is
    registered before GPIO. That means gpio_chip->ngpio is not set when
    samsung_pinctrl_register() called, and one cannot rely on that value
    anymore. Use `pin_bank->nr_pins' instead of `pin_bank->gpio_chip.ngpio'
    to fix mentioned inconsistency.
    
    Fixes: 1abd18d1a51a ("pinctrl: samsung: Register pinctrl before GPIO")
    Signed-off-by: Jaehyoung Choi <jkkkkk.choi@samsung.com>
    Signed-off-by: Sam Protsenko <semen.protsenko@linaro.org>
    Link: https://lore.kernel.org/r/20210730192905.7173-1-semen.protsenko@linaro.org
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.c b/drivers/pinctrl/samsung/pinctrl-samsung.c
index c05217edcb0e..82407e4a1642 100644
--- a/drivers/pinctrl/samsung/pinctrl-samsung.c
+++ b/drivers/pinctrl/samsung/pinctrl-samsung.c
@@ -918,7 +918,7 @@ static int samsung_pinctrl_register(struct platform_device *pdev,
 		pin_bank->grange.pin_base = drvdata->pin_base
 						+ pin_bank->pin_base;
 		pin_bank->grange.base = pin_bank->grange.pin_base;
-		pin_bank->grange.npins = pin_bank->gpio_chip.ngpio;
+		pin_bank->grange.npins = pin_bank->nr_pins;
 		pin_bank->grange.gc = &pin_bank->gpio_chip;
 		pinctrl_add_gpio_range(drvdata->pctl_dev, &pin_bank->grange);
 	}

commit 296a527ee36c0fac0b3ff281759c085728aeb304
Author: Leon Romanovsky <leonro@nvidia.com>
Date:   Wed Jul 28 16:04:12 2021 +0300

    docs: Fix infiniband uverbs minor number
    
    [ Upstream commit 8d7e415d55610d503fdb8815344846b72d194a40 ]
    
    Starting from the beginning of infiniband subsystem, the uverbs char
    devices start from 192 as a minor number, see
    commit bc38a6abdd5a ("[PATCH] IB uverbs: core implementation").
    
    This patch updates the admin guide documentation to reflect it.
    
    Fixes: 9d85025b0418 ("docs-rst: create an user's manual book")
    Link: https://lore.kernel.org/r/bad03e6bcde45550c01e12908a6fe7dfa4770703.1627477347.git.leonro@nvidia.com
    Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/Documentation/admin-guide/devices.txt b/Documentation/admin-guide/devices.txt
index 1649117e6087..9cd7926c8781 100644
--- a/Documentation/admin-guide/devices.txt
+++ b/Documentation/admin-guide/devices.txt
@@ -2993,10 +2993,10 @@
 		65 = /dev/infiniband/issm1     Second InfiniBand IsSM device
 		  ...
 		127 = /dev/infiniband/issm63    63rd InfiniBand IsSM device
-		128 = /dev/infiniband/uverbs0   First InfiniBand verbs device
-		129 = /dev/infiniband/uverbs1   Second InfiniBand verbs device
+		192 = /dev/infiniband/uverbs0   First InfiniBand verbs device
+		193 = /dev/infiniband/uverbs1   Second InfiniBand verbs device
 		  ...
-		159 = /dev/infiniband/uverbs31  31st InfiniBand verbs device
+		223 = /dev/infiniband/uverbs31  31st InfiniBand verbs device
 
  232 char	Biometric Devices
 		0 = /dev/biometric/sensor0/fingerprint	first fingerprint sensor on first device

commit 78bbca0bf3f4f4780515872e8286c84296d04cdb
Author: Leon Romanovsky <leonro@nvidia.com>
Date:   Fri Jul 23 17:08:55 2021 +0300

    RDMA/iwcm: Release resources if iw_cm module initialization fails
    
    [ Upstream commit e677b72a0647249370f2635862bf0241c86f66ad ]
    
    The failure during iw_cm module initialization partially left the system
    with unreleased memory and other resources. Rewrite the module init/exit
    routines in such way that netlink commands will be opened only after
    successful initialization.
    
    Fixes: b493d91d333e ("iwcm: common code for port mapper")
    Link: https://lore.kernel.org/r/b01239f99cb1a3e6d2b0694c242d89e6410bcd93.1627048781.git.leonro@nvidia.com
    Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/infiniband/core/iwcm.c b/drivers/infiniband/core/iwcm.c
index 99dd8452724d..57aec656ab7f 100644
--- a/drivers/infiniband/core/iwcm.c
+++ b/drivers/infiniband/core/iwcm.c
@@ -1173,29 +1173,34 @@ static int __init iw_cm_init(void)
 
 	ret = iwpm_init(RDMA_NL_IWCM);
 	if (ret)
-		pr_err("iw_cm: couldn't init iwpm\n");
-	else
-		rdma_nl_register(RDMA_NL_IWCM, iwcm_nl_cb_table);
+		return ret;
+
 	iwcm_wq = alloc_ordered_workqueue("iw_cm_wq", 0);
 	if (!iwcm_wq)
-		return -ENOMEM;
+		goto err_alloc;
 
 	iwcm_ctl_table_hdr = register_net_sysctl(&init_net, "net/iw_cm",
 						 iwcm_ctl_table);
 	if (!iwcm_ctl_table_hdr) {
 		pr_err("iw_cm: couldn't register sysctl paths\n");
-		destroy_workqueue(iwcm_wq);
-		return -ENOMEM;
+		goto err_sysctl;
 	}
 
+	rdma_nl_register(RDMA_NL_IWCM, iwcm_nl_cb_table);
 	return 0;
+
+err_sysctl:
+	destroy_workqueue(iwcm_wq);
+err_alloc:
+	iwpm_exit(RDMA_NL_IWCM);
+	return -ENOMEM;
 }
 
 static void __exit iw_cm_cleanup(void)
 {
+	rdma_nl_unregister(RDMA_NL_IWCM);
 	unregister_net_sysctl_table(iwcm_ctl_table_hdr);
 	destroy_workqueue(iwcm_wq);
-	rdma_nl_unregister(RDMA_NL_IWCM);
 	iwpm_exit(RDMA_NL_IWCM);
 }
 

commit 9076623badf1dba7a45743bad393ede47ca3f72e
Author: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Date:   Tue Jun 29 11:25:50 2021 -0700

    HID: input: do not report stylus battery state as "full"
    
    [ Upstream commit f4abaa9eebde334045ed6ac4e564d050f1df3013 ]
    
    The power supply states of discharging, charging, full, etc, represent
    state of charging, not the capacity level of the battery (for which
    we have a separate property). Current HID usage tables to not allow
    for expressing charging state of the batteries found in generic
    styli, so we should simply assume that the battery is discharging
    even if current capacity is at 100% when battery strength reporting
    is done via HID interface. In fact, we were doing just that before
    commit 581c4484769e.
    
    This change helps UIs to not mis-represent fully charged batteries in
    styli as being charging/topping-off.
    
    Fixes: 581c4484769e ("HID: input: map digitizer battery usage")
    Reported-by: Kenneth Albanowski <kenalba@google.com>
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
index 4dd151b2924e..d56ef395eb69 100644
--- a/drivers/hid/hid-input.c
+++ b/drivers/hid/hid-input.c
@@ -427,8 +427,6 @@ static int hidinput_get_battery_property(struct power_supply *psy,
 
 		if (dev->battery_status == HID_BATTERY_UNKNOWN)
 			val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
-		else if (dev->battery_capacity == 100)
-			val->intval = POWER_SUPPLY_STATUS_FULL;
 		else
 			val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
 		break;

commit b04b4e98bb7563fb64e5b5161f935a5a3b0c79be
Author: Pali Rohár <pali@kernel.org>
Date:   Fri Aug 20 17:50:20 2021 +0200

    PCI: aardvark: Fix masking and unmasking legacy INTx interrupts
    
    commit d212dcee27c1f89517181047e5485fcbba4a25c2 upstream.
    
    irq_mask and irq_unmask callbacks need to be properly guarded by raw spin
    locks as masking/unmasking procedure needs atomic read-modify-write
    operation on hardware register.
    
    Link: https://lore.kernel.org/r/20210820155020.3000-1-pali@kernel.org
    Reported-by: Marc Zyngier <maz@kernel.org>
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index 5e3fb894e568..a9669b28c2a6 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -181,6 +181,7 @@ struct advk_pcie {
 	struct list_head resources;
 	struct irq_domain *irq_domain;
 	struct irq_chip irq_chip;
+	raw_spinlock_t irq_lock;
 	struct irq_domain *msi_domain;
 	struct irq_domain *msi_inner_domain;
 	struct irq_chip msi_bottom_irq_chip;
@@ -603,22 +604,28 @@ static void advk_pcie_irq_mask(struct irq_data *d)
 {
 	struct advk_pcie *pcie = d->domain->host_data;
 	irq_hw_number_t hwirq = irqd_to_hwirq(d);
+	unsigned long flags;
 	u32 mask;
 
+	raw_spin_lock_irqsave(&pcie->irq_lock, flags);
 	mask = advk_readl(pcie, PCIE_ISR1_MASK_REG);
 	mask |= PCIE_ISR1_INTX_ASSERT(hwirq);
 	advk_writel(pcie, mask, PCIE_ISR1_MASK_REG);
+	raw_spin_unlock_irqrestore(&pcie->irq_lock, flags);
 }
 
 static void advk_pcie_irq_unmask(struct irq_data *d)
 {
 	struct advk_pcie *pcie = d->domain->host_data;
 	irq_hw_number_t hwirq = irqd_to_hwirq(d);
+	unsigned long flags;
 	u32 mask;
 
+	raw_spin_lock_irqsave(&pcie->irq_lock, flags);
 	mask = advk_readl(pcie, PCIE_ISR1_MASK_REG);
 	mask &= ~PCIE_ISR1_INTX_ASSERT(hwirq);
 	advk_writel(pcie, mask, PCIE_ISR1_MASK_REG);
+	raw_spin_unlock_irqrestore(&pcie->irq_lock, flags);
 }
 
 static int advk_pcie_irq_map(struct irq_domain *h,
@@ -701,6 +708,8 @@ static int advk_pcie_init_irq_domain(struct advk_pcie *pcie)
 	struct device_node *pcie_intc_node;
 	struct irq_chip *irq_chip;
 
+	raw_spin_lock_init(&pcie->irq_lock);
+
 	pcie_intc_node =  of_get_next_child(node, NULL);
 	if (!pcie_intc_node) {
 		dev_err(dev, "No PCIe Intc node found\n");

commit 19d29895971c1ba4d1a31577221aa2bb1931586b
Author: Pali Rohár <pali@kernel.org>
Date:   Thu Jul 22 16:40:39 2021 +0200

    PCI: aardvark: Increase polling delay to 1.5s while waiting for PIO response
    
    commit 02bcec3ea5591720114f586960490b04b093a09e upstream.
    
    Measurements in different conditions showed that aardvark hardware PIO
    response can take up to 1.44s. Increase wait timeout from 1ms to 1.5s to
    ensure that we do not miss responses from hardware. After 1.44s hardware
    returns errors (e.g. Completer abort).
    
    The previous two patches fixed checking for PIO status, so now we can use
    it to also catch errors which are reported by hardware after 1.44s.
    
    After applying this patch, kernel can detect and print PIO errors to dmesg:
    
        [    6.879999] advk-pcie d0070000.pcie: Non-posted PIO Response Status: CA, 0xe00 @ 0x100004
        [    6.896436] advk-pcie d0070000.pcie: Posted PIO Response Status: COMP_ERR, 0x804 @ 0x100004
        [    6.913049] advk-pcie d0070000.pcie: Posted PIO Response Status: COMP_ERR, 0x804 @ 0x100010
        [    6.929663] advk-pcie d0070000.pcie: Non-posted PIO Response Status: CA, 0xe00 @ 0x100010
        [    6.953558] advk-pcie d0070000.pcie: Posted PIO Response Status: COMP_ERR, 0x804 @ 0x100014
        [    6.970170] advk-pcie d0070000.pcie: Non-posted PIO Response Status: CA, 0xe00 @ 0x100014
        [    6.994328] advk-pcie d0070000.pcie: Posted PIO Response Status: COMP_ERR, 0x804 @ 0x100004
    
    Without this patch kernel prints only a generic error to dmesg:
    
        [    5.246847] advk-pcie d0070000.pcie: config read/write timed out
    
    Link: https://lore.kernel.org/r/20210722144041.12661-3-pali@kernel.org
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Reviewed-by: Marek Behún <kabel@kernel.org>
    Cc: stable@vger.kernel.org # 7fbcb5da811b ("PCI: aardvark: Don't rely on jiffies while holding spinlock")
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index 74aa9da85aa2..5e3fb894e568 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -166,7 +166,7 @@
 	(PCIE_CONF_BUS(bus) | PCIE_CONF_DEV(PCI_SLOT(devfn))	| \
 	 PCIE_CONF_FUNC(PCI_FUNC(devfn)) | PCIE_CONF_REG(where))
 
-#define PIO_RETRY_CNT			500
+#define PIO_RETRY_CNT			750000 /* 1.5 s */
 #define PIO_RETRY_DELAY			2 /* 2 us*/
 
 #define LINK_WAIT_MAX_RETRIES		10

commit ba7a035004e43d969f6a8fd1823ec87c4106d7cc
Author: Hyun Kwon <hyun.kwon@xilinx.com>
Date:   Fri Jun 25 12:48:23 2021 +0200

    PCI: xilinx-nwl: Enable the clock through CCF
    
    commit de0a01f5296651d3a539f2d23d0db8f359483696 upstream.
    
    Enable PCIe reference clock. There is no remove function that's why
    this should be enough for simple operation.
    Normally this clock is enabled by default by firmware but there are
    usecases where this clock should be enabled by driver itself.
    It is also good that PCIe clock is recorded in a clock framework.
    
    Link: https://lore.kernel.org/r/ee6997a08fab582b1c6de05f8be184f3fe8d5357.1624618100.git.michal.simek@xilinx.com
    Fixes: ab597d35ef11 ("PCI: xilinx-nwl: Add support for Xilinx NWL PCIe Host Controller")
    Signed-off-by: Hyun Kwon <hyun.kwon@xilinx.com>
    Signed-off-by: Bharat Kumar Gogada <bharat.kumar.gogada@xilinx.com>
    Signed-off-by: Michal Simek <michal.simek@xilinx.com>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pcie-xilinx-nwl.c b/drivers/pci/controller/pcie-xilinx-nwl.c
index 4850a1b8eec1..a86bd9660dae 100644
--- a/drivers/pci/controller/pcie-xilinx-nwl.c
+++ b/drivers/pci/controller/pcie-xilinx-nwl.c
@@ -6,6 +6,7 @@
  * (C) Copyright 2014 - 2015, Xilinx, Inc.
  */
 
+#include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
 #include <linux/irq.h>
@@ -169,6 +170,7 @@ struct nwl_pcie {
 	u8 root_busno;
 	struct nwl_msi msi;
 	struct irq_domain *legacy_irq_domain;
+	struct clk *clk;
 	raw_spinlock_t leg_mask_lock;
 };
 
@@ -849,6 +851,16 @@ static int nwl_pcie_probe(struct platform_device *pdev)
 		return err;
 	}
 
+	pcie->clk = devm_clk_get(dev, NULL);
+	if (IS_ERR(pcie->clk))
+		return PTR_ERR(pcie->clk);
+
+	err = clk_prepare_enable(pcie->clk);
+	if (err) {
+		dev_err(dev, "can't enable PCIe ref clock\n");
+		return err;
+	}
+
 	err = nwl_pcie_bridge_init(pcie);
 	if (err) {
 		dev_err(dev, "HW Initialization failed\n");

commit 60242386c7ef9b084fc138e3d2b7bb99042fd779
Author: Krzysztof Wilczy?ski <kw@linux.com>
Date:   Thu Jul 29 23:37:54 2021 +0000

    PCI: Return ~0 data on pciconfig_read() CAP_SYS_ADMIN failure
    
    commit a8bd29bd49c4156ea0ec5a97812333e2aeef44e7 upstream.
    
    The pciconfig_read() syscall reads PCI configuration space using
    hardware-dependent config accessors.
    
    If the read fails on PCI, most accessors don't return an error; they
    pretend the read was successful and got ~0 data from the device, so the
    syscall returns success with ~0 data in the buffer.
    
    When the accessor does return an error, pciconfig_read() normally fills the
    user's buffer with ~0 and returns an error in errno.  But after
    e4585da22ad0 ("pci syscall.c: Switch to refcounting API"), we don't fill
    the buffer with ~0 for the EPERM "user lacks CAP_SYS_ADMIN" error.
    
    Userspace may rely on the ~0 data to detect errors, but after e4585da22ad0,
    that would not detect CAP_SYS_ADMIN errors.
    
    Restore the original behaviour of filling the buffer with ~0 when the
    CAP_SYS_ADMIN check fails.
    
    [bhelgaas: commit log, fold in Nathan's fix
    https://lore.kernel.org/r/20210803200836.500658-1-nathan@kernel.org]
    Fixes: e4585da22ad0 ("pci syscall.c: Switch to refcounting API")
    Link: https://lore.kernel.org/r/20210729233755.1509616-1-kw@linux.com
    Signed-off-by: Krzysztof Wilczy?ski <kw@linux.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/syscall.c b/drivers/pci/syscall.c
index a7bdd10fccf3..68ac8a0f5c72 100644
--- a/drivers/pci/syscall.c
+++ b/drivers/pci/syscall.c
@@ -21,8 +21,10 @@ SYSCALL_DEFINE5(pciconfig_read, unsigned long, bus, unsigned long, dfn,
 	long err;
 	int cfg_ret;
 
+	err = -EPERM;
+	dev = NULL;
 	if (!capable(CAP_SYS_ADMIN))
-		return -EPERM;
+		goto error;
 
 	err = -ENODEV;
 	dev = pci_get_domain_bus_and_slot(0, bus, dfn);

commit 8e8375e7ad220665dabd0c0f709ba9c04b29d1c9
Author: Marek Behún <kabel@kernel.org>
Date:   Thu Jun 24 19:14:18 2021 +0200

    PCI: Restrict ASMedia ASM1062 SATA Max Payload Size Supported
    
    commit b12d93e9958e028856cbcb061b6e64728ca07755 upstream.
    
    The ASMedia ASM1062 SATA controller advertises Max_Payload_Size_Supported
    of 512, but in fact it cannot handle incoming TLPs with payload size of
    512.
    
    We discovered this issue on PCIe controllers capable of MPS = 512 (Aardvark
    and DesignWare), where the issue presents itself as an External Abort.
    Bjorn Helgaas says:
    
      Probably ASM1062 reports a Malformed TLP error when it receives a data
      payload of 512 bytes, and Aardvark, DesignWare, etc convert this to an
      arm64 External Abort. [1]
    
    To avoid this problem, limit the ASM1062 Max Payload Size Supported to 256
    bytes, so we set the Max Payload Size of devices that may send TLPs to the
    ASM1062 to 256 or less.
    
    [1] https://lore.kernel.org/linux-pci/20210601170907.GA1949035@bjorn-Precision-5520/
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=212695
    Link: https://lore.kernel.org/r/20210624171418.27194-2-kabel@kernel.org
    Reported-by: Rötti <espressobinboardarmbiantempmailaddress@posteo.de>
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Krzysztof Wilczy?ski <kw@linux.com>
    Reviewed-by: Pali Rohár <pali@kernel.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 821b0fbe03a6..2f787d30aff9 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -3158,6 +3158,7 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SOLARFLARE,
 			PCI_DEVICE_ID_SOLARFLARE_SFC4000A_1, fixup_mpss_256);
 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SOLARFLARE,
 			PCI_DEVICE_ID_SOLARFLARE_SFC4000B, fixup_mpss_256);
+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_ASMEDIA, 0x0612, fixup_mpss_256);
 
 /*
  * Intel 5000 and 5100 Memory controllers have an erratum with read completion

commit e163f6bb5d3b5d565827e04f93767ce6b4143b23
Author: David Heidelberg <david@ixit.cz>
Date:   Mon Aug 9 19:07:30 2021 +0100

    ARM: 9105/1: atags_to_fdt: don't warn about stack size
    
    commit b30d0289de72c62516df03fdad8d53f552c69839 upstream.
    
    The merge_fdt_bootargs() function by definition consumes more than 1024
    bytes of stack because it has a 1024 byte command line on the stack,
    meaning that we always get a warning when building this file:
    
    arch/arm/boot/compressed/atags_to_fdt.c: In function 'merge_fdt_bootargs':
    arch/arm/boot/compressed/atags_to_fdt.c:98:1: warning: the frame size of 1032 bytes is larger than 1024 bytes [-Wframe-larger-than=]
    
    However, as this is the decompressor and we know that it has a very shallow
    call chain, and we do not actually risk overflowing the kernel stack
    at runtime here.
    
    This just shuts up the warning by disabling the warning flag for this
    file.
    
    Tested on Nexus 7 2012 builds.
    
    Acked-by: Nicolas Pitre <nico@fluxnic.net>
    Signed-off-by: David Heidelberg <david@ixit.cz>
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile
index ec2327a3796d..1b3a4144646b 100644
--- a/arch/arm/boot/compressed/Makefile
+++ b/arch/arm/boot/compressed/Makefile
@@ -90,6 +90,8 @@ $(addprefix $(obj)/,$(libfdt_objs) atags_to_fdt.o): \
 	$(addprefix $(obj)/,$(libfdt_hdrs))
 
 ifeq ($(CONFIG_ARM_ATAG_DTB_COMPAT),y)
+CFLAGS_REMOVE_atags_to_fdt.o += -Wframe-larger-than=${CONFIG_FRAME_WARN}
+CFLAGS_atags_to_fdt.o += -Wframe-larger-than=1280
 OBJS	+= $(libfdt_objs) atags_to_fdt.o
 endif
 

commit 98e8d55654c4836a580924443e69daa84358bc91
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Mon Aug 23 11:52:20 2021 +0200

    libata: add ATA_HORKAGE_NO_NCQ_TRIM for Samsung 860 and 870 SSDs
    
    commit 8a6430ab9c9c87cb64c512e505e8690bbaee190b upstream.
    
    Commit ca6bfcb2f6d9 ("libata: Enable queued TRIM for Samsung SSD 860")
    limited the existing ATA_HORKAGE_NO_NCQ_TRIM quirk from "Samsung SSD 8*",
    covering all Samsung 800 series SSDs, to only apply to "Samsung SSD 840*"
    and "Samsung SSD 850*" series based on information from Samsung.
    
    But there is a large number of users which is still reporting issues
    with the Samsung 860 and 870 SSDs combined with Intel, ASmedia or
    Marvell SATA controllers and all reporters also report these problems
    going away when disabling queued trims.
    
    Note that with AMD SATA controllers users are reporting even worse
    issues and only completely disabling NCQ helps there, this will be
    addressed in a separate patch.
    
    Fixes: ca6bfcb2f6d9 ("libata: Enable queued TRIM for Samsung SSD 860")
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=203475
    Cc: stable@vger.kernel.org
    Cc: Kate Hsuan <hpa@redhat.com>
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com>
    Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
    Link: https://lore.kernel.org/r/20210823095220.30157-1-hdegoede@redhat.com
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index d9b1c3e95592..b95a4194a68d 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -4574,6 +4574,10 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
 						ATA_HORKAGE_ZERO_AFTER_TRIM, },
 	{ "Samsung SSD 850*",		NULL,	ATA_HORKAGE_NO_NCQ_TRIM |
 						ATA_HORKAGE_ZERO_AFTER_TRIM, },
+	{ "Samsung SSD 860*",		NULL,	ATA_HORKAGE_NO_NCQ_TRIM |
+						ATA_HORKAGE_ZERO_AFTER_TRIM, },
+	{ "Samsung SSD 870*",		NULL,	ATA_HORKAGE_NO_NCQ_TRIM |
+						ATA_HORKAGE_ZERO_AFTER_TRIM, },
 	{ "FCCT*M500*",			NULL,	ATA_HORKAGE_NO_NCQ_TRIM |
 						ATA_HORKAGE_ZERO_AFTER_TRIM, },
 

commit 59d1566f7b5ccb457fca5841157f2a9e10d4da43
Author: Sean Young <sean@mess.org>
Date:   Sat Jul 3 15:37:17 2021 +0200

    media: rc-loopback: return number of emitters rather than error
    
    commit 6b7f554be8c92319d7e6df92fd247ebb9beb4a45 upstream.
    
    The LIRC_SET_TRANSMITTER_MASK ioctl should return the number of emitters
    if an invalid list was set.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Sean Young <sean@mess.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/media/rc/rc-loopback.c b/drivers/media/rc/rc-loopback.c
index 3822d9ebcb46..5abbde7e5d5b 100644
--- a/drivers/media/rc/rc-loopback.c
+++ b/drivers/media/rc/rc-loopback.c
@@ -52,7 +52,7 @@ static int loop_set_tx_mask(struct rc_dev *dev, u32 mask)
 
 	if ((mask & (RXMASK_REGULAR | RXMASK_LEARNING)) != mask) {
 		dprintk("invalid tx mask: %u\n", mask);
-		return -EINVAL;
+		return 2;
 	}
 
 	dprintk("setting tx mask: %u\n", mask);

commit a6bc08a6af42d789e7b13fcf83f221def6743780
Author: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Date:   Thu Jun 17 14:33:29 2021 +0200

    media: uvc: don't do DMA on stack
    
    commit 1a10d7fdb6d0e235e9d230916244cc2769d3f170 upstream.
    
    As warned by smatch:
            drivers/media/usb/uvc/uvc_v4l2.c:911 uvc_ioctl_g_input() error: doing dma on the stack (&i)
            drivers/media/usb/uvc/uvc_v4l2.c:943 uvc_ioctl_s_input() error: doing dma on the stack (&i)
    
    those two functions call uvc_query_ctrl passing a pointer to
    a data at the DMA stack. those are used to send URBs via
    usb_control_msg(). Using DMA stack is not supported and should
    not work anymore on modern Linux versions.
    
    So, use a kmalloc'ed buffer.
    
    Cc: stable@vger.kernel.org      # Kernel 4.9 and upper
    Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c
index 06167c51af12..2ca1e8ce6159 100644
--- a/drivers/media/usb/uvc/uvc_v4l2.c
+++ b/drivers/media/usb/uvc/uvc_v4l2.c
@@ -900,8 +900,8 @@ static int uvc_ioctl_g_input(struct file *file, void *fh, unsigned int *input)
 {
 	struct uvc_fh *handle = fh;
 	struct uvc_video_chain *chain = handle->chain;
+	u8 *buf;
 	int ret;
-	u8 i;
 
 	if (chain->selector == NULL ||
 	    (chain->dev->quirks & UVC_QUIRK_IGNORE_SELECTOR_UNIT)) {
@@ -909,22 +909,27 @@ static int uvc_ioctl_g_input(struct file *file, void *fh, unsigned int *input)
 		return 0;
 	}
 
+	buf = kmalloc(1, GFP_KERNEL);
+	if (!buf)
+		return -ENOMEM;
+
 	ret = uvc_query_ctrl(chain->dev, UVC_GET_CUR, chain->selector->id,
 			     chain->dev->intfnum,  UVC_SU_INPUT_SELECT_CONTROL,
-			     &i, 1);
-	if (ret < 0)
-		return ret;
+			     buf, 1);
+	if (!ret)
+		*input = *buf - 1;
 
-	*input = i - 1;
-	return 0;
+	kfree(buf);
+
+	return ret;
 }
 
 static int uvc_ioctl_s_input(struct file *file, void *fh, unsigned int input)
 {
 	struct uvc_fh *handle = fh;
 	struct uvc_video_chain *chain = handle->chain;
+	u8 *buf;
 	int ret;
-	u32 i;
 
 	ret = uvc_acquire_privileges(handle);
 	if (ret < 0)
@@ -940,10 +945,17 @@ static int uvc_ioctl_s_input(struct file *file, void *fh, unsigned int input)
 	if (input >= chain->selector->bNrInPins)
 		return -EINVAL;
 
-	i = input + 1;
-	return uvc_query_ctrl(chain->dev, UVC_SET_CUR, chain->selector->id,
-			      chain->dev->intfnum, UVC_SU_INPUT_SELECT_CONTROL,
-			      &i, 1);
+	buf = kmalloc(1, GFP_KERNEL);
+	if (!buf)
+		return -ENOMEM;
+
+	*buf = input + 1;
+	ret = uvc_query_ctrl(chain->dev, UVC_SET_CUR, chain->selector->id,
+			     chain->dev->intfnum, UVC_SU_INPUT_SELECT_CONTROL,
+			     buf, 1);
+	kfree(buf);
+
+	return ret;
 }
 
 static int uvc_ioctl_queryctrl(struct file *file, void *fh,

commit 50ac516a77353a277189f17e6a69ed10914376be
Author: Wang Hai <wanghai38@huawei.com>
Date:   Wed Aug 18 20:48:45 2021 +0800

    VMCI: fix NULL pointer dereference when unmapping queue pair
    
    commit a30dc6cf0dc51419021550152e435736aaef8799 upstream.
    
    I got a NULL pointer dereference report when doing fuzz test:
    
    Call Trace:
      qp_release_pages+0xae/0x130
      qp_host_unregister_user_memory.isra.25+0x2d/0x80
      vmci_qp_broker_unmap+0x191/0x320
      ? vmci_host_do_alloc_queuepair.isra.9+0x1c0/0x1c0
      vmci_host_unlocked_ioctl+0x59f/0xd50
      ? do_vfs_ioctl+0x14b/0xa10
      ? tomoyo_file_ioctl+0x28/0x30
      ? vmci_host_do_alloc_queuepair.isra.9+0x1c0/0x1c0
      __x64_sys_ioctl+0xea/0x120
      do_syscall_64+0x34/0xb0
      entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    When a queue pair is created by the following call, it will not
    register the user memory if the page_store is NULL, and the
    entry->state will be set to VMCIQPB_CREATED_NO_MEM.
    
    vmci_host_unlocked_ioctl
      vmci_host_do_alloc_queuepair
        vmci_qp_broker_alloc
          qp_broker_alloc
            qp_broker_create // set entry->state = VMCIQPB_CREATED_NO_MEM;
    
    When unmapping this queue pair, qp_host_unregister_user_memory() will
    be called to unregister the non-existent user memory, which will
    result in a null pointer reference. It will also change
    VMCIQPB_CREATED_NO_MEM to VMCIQPB_CREATED_MEM, which should not be
    present in this operation.
    
    Only when the qp broker has mem, it can unregister the user
    memory when unmapping the qp broker.
    
    Only when the qp broker has no mem, it can register the user
    memory when mapping the qp broker.
    
    Fixes: 06164d2b72aa ("VMCI: queue pairs implementation.")
    Cc: stable <stable@vger.kernel.org>
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Reviewed-by: Jorgen Hansen <jhansen@vmware.com>
    Signed-off-by: Wang Hai <wanghai38@huawei.com>
    Link: https://lore.kernel.org/r/20210818124845.488312-1-wanghai38@huawei.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/misc/vmw_vmci/vmci_queue_pair.c b/drivers/misc/vmw_vmci/vmci_queue_pair.c
index 9bc97d6a651d..db433d285eff 100644
--- a/drivers/misc/vmw_vmci/vmci_queue_pair.c
+++ b/drivers/misc/vmw_vmci/vmci_queue_pair.c
@@ -2249,7 +2249,8 @@ int vmci_qp_broker_map(struct vmci_handle handle,
 
 	result = VMCI_SUCCESS;
 
-	if (context_id != VMCI_HOST_CONTEXT_ID) {
+	if (context_id != VMCI_HOST_CONTEXT_ID &&
+	    !QPBROKERSTATE_HAS_MEM(entry)) {
 		struct vmci_qp_page_store page_store;
 
 		page_store.pages = guest_mem;
@@ -2356,7 +2357,8 @@ int vmci_qp_broker_unmap(struct vmci_handle handle,
 		goto out;
 	}
 
-	if (context_id != VMCI_HOST_CONTEXT_ID) {
+	if (context_id != VMCI_HOST_CONTEXT_ID &&
+	    QPBROKERSTATE_HAS_MEM(entry)) {
 		qp_acquire_queue_mutex(entry->produce_q);
 		result = qp_save_headers(entry);
 		if (result < VMCI_SUCCESS)

commit dafd9d753be60e7df9273177d41d457fb5994fae
Author: Arne Welzel <arne.welzel@corelight.com>
Date:   Sat Aug 14 00:40:38 2021 +0200

    dm crypt: Avoid percpu_counter spinlock contention in crypt_page_alloc()
    
    commit 528b16bfc3ae5f11638e71b3b63a81f9999df727 upstream.
    
    On systems with many cores using dm-crypt, heavy spinlock contention in
    percpu_counter_compare() can be observed when the page allocation limit
    for a given device is reached or close to be reached. This is due
    to percpu_counter_compare() taking a spinlock to compute an exact
    result on potentially many CPUs at the same time.
    
    Switch to non-exact comparison of allocated and allowed pages by using
    the value returned by percpu_counter_read_positive() to avoid taking
    the percpu_counter spinlock.
    
    This may over/under estimate the actual number of allocated pages by at
    most (batch-1) * num_online_cpus().
    
    Currently, batch is bounded by 32. The system on which this issue was
    first observed has 256 CPUs and 512GB of RAM. With a 4k page size, this
    change may over/under estimate by 31MB. With ~10G (2%) allowed dm-crypt
    allocations, this seems an acceptable error. Certainly preferred over
    running into the spinlock contention.
    
    This behavior was reproduced on an EC2 c5.24xlarge instance with 96 CPUs
    and 192GB RAM as follows, but can be provoked on systems with less CPUs
    as well.
    
     * Disable swap
     * Tune vm settings to promote regular writeback
         $ echo 50 > /proc/sys/vm/dirty_expire_centisecs
         $ echo 25 > /proc/sys/vm/dirty_writeback_centisecs
         $ echo $((128 * 1024 * 1024)) > /proc/sys/vm/dirty_background_bytes
    
     * Create 8 dmcrypt devices based on files on a tmpfs
     * Create and mount an ext4 filesystem on each crypt devices
     * Run stress-ng --hdd 8 within one of above filesystems
    
    Total %system usage collected from sysstat goes to ~35%. Write throughput
    on the underlying loop device is ~2GB/s. perf profiling an individual
    kworker kcryptd thread shows the following profile, indicating spinlock
    contention in percpu_counter_compare():
    
        99.98%     0.00%  kworker/u193:46  [kernel.kallsyms]  [k] ret_from_fork
          |
          --ret_from_fork
            kthread
            worker_thread
            |
             --99.92%--process_one_work
                |
                |--80.52%--kcryptd_crypt
                |    |
                |    |--62.58%--mempool_alloc
                |    |  |
                |    |   --62.24%--crypt_page_alloc
                |    |     |
                |    |      --61.51%--__percpu_counter_compare
                |    |        |
                |    |         --61.34%--__percpu_counter_sum
                |    |           |
                |    |           |--58.68%--_raw_spin_lock_irqsave
                |    |           |  |
                |    |           |   --58.30%--native_queued_spin_lock_slowpath
                |    |           |
                |    |            --0.69%--cpumask_next
                |    |                |
                |    |                 --0.51%--_find_next_bit
                |    |
                |    |--10.61%--crypt_convert
                |    |          |
                |    |          |--6.05%--xts_crypt
                ...
    
    After applying this patch and running the same test, %system usage is
    lowered to ~7% and write throughput on the loop device increases
    to ~2.7GB/s. perf report shows mempool_alloc() as ~8% rather than ~62%
    in the profile and not hitting the percpu_counter() spinlock anymore.
    
        |--8.15%--mempool_alloc
        |    |
        |    |--3.93%--crypt_page_alloc
        |    |    |
        |    |     --3.75%--__alloc_pages
        |    |         |
        |    |          --3.62%--get_page_from_freelist
        |    |              |
        |    |               --3.22%--rmqueue_bulk
        |    |                   |
        |    |                    --2.59%--_raw_spin_lock
        |    |                      |
        |    |                       --2.57%--native_queued_spin_lock_slowpath
        |    |
        |     --3.05%--_raw_spin_lock_irqsave
        |               |
        |                --2.49%--native_queued_spin_lock_slowpath
    
    Suggested-by: DJ Gregor <dj@corelight.com>
    Reviewed-by: Mikulas Patocka <mpatocka@redhat.com>
    Signed-off-by: Arne Welzel <arne.welzel@corelight.com>
    Fixes: 5059353df86e ("dm crypt: limit the number of allocated pages")
    Cc: stable@vger.kernel.org
    Signed-off-by: Mike Snitzer <snitzer@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
index 85559f772d0d..a6a26f8e4d8e 100644
--- a/drivers/md/dm-crypt.c
+++ b/drivers/md/dm-crypt.c
@@ -2181,7 +2181,12 @@ static void *crypt_page_alloc(gfp_t gfp_mask, void *pool_data)
 	struct crypt_config *cc = pool_data;
 	struct page *page;
 
-	if (unlikely(percpu_counter_compare(&cc->n_allocated_pages, dm_crypt_pages_per_client) >= 0) &&
+	/*
+	 * Note, percpu_counter_read_positive() may over (and under) estimate
+	 * the current usage by at most (batch - 1) * num_online_cpus() pages,
+	 * but avoids potential spinlock contention of an exact result.
+	 */
+	if (unlikely(percpu_counter_read_positive(&cc->n_allocated_pages) >= dm_crypt_pages_per_client) &&
 	    likely(gfp_mask & __GFP_NORETRY))
 		return NULL;
 

commit eb7ff81efcc5bd7123a22f66864bc7e88afdd739
Author: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Date:   Mon Aug 16 10:27:14 2021 +0200

    power: supply: max17042: handle fails of reading status register
    
    commit 54784ffa5b267f57161eb8fbb811499f22a0a0bf upstream.
    
    Reading status register can fail in the interrupt handler.  In such
    case, the regmap_read() will not store anything useful under passed
    'val' variable and random stack value will be used to determine type of
    interrupt.
    
    Handle the regmap_read() failure to avoid handling interrupt type and
    triggering changed power supply event based on random stack value.
    
    Fixes: 39e7213edc4f ("max17042_battery: Support regmap to access device's registers")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Reviewed-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply/max17042_battery.c
index 8618dbb72392..a1518eb6f6c0 100644
--- a/drivers/power/supply/max17042_battery.c
+++ b/drivers/power/supply/max17042_battery.c
@@ -856,8 +856,12 @@ static irqreturn_t max17042_thread_handler(int id, void *dev)
 {
 	struct max17042_chip *chip = dev;
 	u32 val;
+	int ret;
+
+	ret = regmap_read(chip->regmap, MAX17042_STATUS, &val);
+	if (ret)
+		return IRQ_HANDLED;
 
-	regmap_read(chip->regmap, MAX17042_STATUS, &val);
 	if ((val & STATUS_INTR_SOCMIN_BIT) ||
 		(val & STATUS_INTR_SOCMAX_BIT)) {
 		dev_info(&chip->client->dev, "SOC threshold INTR\n");

commit 35a276f173356448cd07d83238d2bbc30796b267
Author: Damien Le Moal <damien.lemoal@wdc.com>
Date:   Wed Aug 11 12:36:57 2021 +0900

    block: bfq: fix bfq_set_next_ioprio_data()
    
    commit a680dd72ec336b81511e3bff48efac6dbfa563e7 upstream.
    
    For a request that has a priority level equal to or larger than
    IOPRIO_BE_NR, bfq_set_next_ioprio_data() prints a critical warning but
    defaults to setting the request new_ioprio field to IOPRIO_BE_NR. This
    is not consistent with the warning and the allowed values for priority
    levels. Fix this by setting the request new_ioprio field to
    IOPRIO_BE_NR - 1, the lowest priority level allowed.
    
    Cc: <stable@vger.kernel.org>
    Fixes: aee69d78dec0 ("block, bfq: introduce the BFQ-v0 I/O scheduler as an extra scheduler")
    Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
    Reviewed-by: Hannes Reinecke <hare@suse.de>
    Link: https://lore.kernel.org/r/20210811033702.368488-2-damien.lemoal@wdc.com
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
index 5b3e5483c657..b2bad345c523 100644
--- a/block/bfq-iosched.c
+++ b/block/bfq-iosched.c
@@ -4241,7 +4241,7 @@ bfq_set_next_ioprio_data(struct bfq_queue *bfqq, struct bfq_io_cq *bic)
 	if (bfqq->new_ioprio >= IOPRIO_BE_NR) {
 		pr_crit("bfq_set_next_ioprio_data: new_ioprio %d\n",
 			bfqq->new_ioprio);
-		bfqq->new_ioprio = IOPRIO_BE_NR;
+		bfqq->new_ioprio = IOPRIO_BE_NR - 1;
 	}
 
 	bfqq->entity.new_weight = bfq_ioprio_to_weight(bfqq->new_ioprio);

commit aab312696d37de80502ca633b40184de24f22917
Author: zhenwei pi <pizhenwei@bytedance.com>
Date:   Thu Aug 19 20:37:10 2021 +0800

    crypto: public_key: fix overflow during implicit conversion
    
    commit f985911b7bc75d5c98ed24d8aaa8b94c590f7c6a upstream.
    
    Hit kernel warning like this, it can be reproduced by verifying 256
    bytes datafile by keyctl command, run script:
    RAWDATA=rawdata
    SIGDATA=sigdata
    
    modprobe pkcs8_key_parser
    
    rm -rf *.der *.pem *.pfx
    rm -rf $RAWDATA
    dd if=/dev/random of=$RAWDATA bs=256 count=1
    
    openssl req -nodes -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem \
      -subj "/C=CN/ST=GD/L=SZ/O=vihoo/OU=dev/CN=xx.com/emailAddress=yy@xx.com"
    
    KEY_ID=`openssl pkcs8 -in key.pem -topk8 -nocrypt -outform DER | keyctl \
      padd asymmetric 123 @s`
    
    keyctl pkey_sign $KEY_ID 0 $RAWDATA enc=pkcs1 hash=sha1 > $SIGDATA
    keyctl pkey_verify $KEY_ID 0 $RAWDATA $SIGDATA enc=pkcs1 hash=sha1
    
    Then the kernel reports:
     WARNING: CPU: 5 PID: 344556 at crypto/rsa-pkcs1pad.c:540
       pkcs1pad_verify+0x160/0x190
     ...
     Call Trace:
      public_key_verify_signature+0x282/0x380
      ? software_key_query+0x12d/0x180
      ? keyctl_pkey_params_get+0xd6/0x130
      asymmetric_key_verify_signature+0x66/0x80
      keyctl_pkey_verify+0xa5/0x100
      do_syscall_64+0x35/0xb0
      entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    The reason of this issue, in function 'asymmetric_key_verify_signature':
    '.digest_size(u8) = params->in_len(u32)' leads overflow of an u8 value,
    so use u32 instead of u8 for digest_size field. And reorder struct
    public_key_signature, it saves 8 bytes on a 64-bit machine.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: zhenwei pi <pizhenwei@bytedance.com>
    Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
    Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/crypto/public_key.h b/include/crypto/public_key.h
index e0b681a717ba..052e26fda2e6 100644
--- a/include/crypto/public_key.h
+++ b/include/crypto/public_key.h
@@ -35,9 +35,9 @@ extern void public_key_free(struct public_key *key);
 struct public_key_signature {
 	struct asymmetric_key_id *auth_ids[2];
 	u8 *s;			/* Signature */
-	u32 s_size;		/* Number of bytes in signature */
 	u8 *digest;
-	u8 digest_size;		/* Number of bytes in digest */
+	u32 s_size;		/* Number of bytes in signature */
+	u32 digest_size;	/* Number of bytes in digest */
 	const char *pkey_algo;
 	const char *hash_algo;
 };

commit 79d15fc5646f79e769b90957370a84c0ba981c85
Author: Mark Rutland <mark.rutland@arm.com>
Date:   Mon Aug 23 11:12:53 2021 +0100

    arm64: head: avoid over-mapping in map_memory
    
    commit 90268574a3e8a6b883bd802d702a2738577e1006 upstream.
    
    The `compute_indices` and `populate_entries` macros operate on inclusive
    bounds, and thus the `map_memory` macro which uses them also operates
    on inclusive bounds.
    
    We pass `_end` and `_idmap_text_end` to `map_memory`, but these are
    exclusive bounds, and if one of these is sufficiently aligned (as a
    result of kernel configuration, physical placement, and KASLR), then:
    
    * In `compute_indices`, the computed `iend` will be in the page/block *after*
      the final byte of the intended mapping.
    
    * In `populate_entries`, an unnecessary entry will be created at the end
      of each level of table. At the leaf level, this entry will map up to
      SWAPPER_BLOCK_SIZE bytes of physical addresses that we did not intend
      to map.
    
    As we may map up to SWAPPER_BLOCK_SIZE bytes more than intended, we may
    violate the boot protocol and map physical address past the 2MiB-aligned
    end address we are permitted to map. As we map these with Normal memory
    attributes, this may result in further problems depending on what these
    physical addresses correspond to.
    
    The final entry at each level may require an additional table at that
    level. As EARLY_ENTRIES() calculates an inclusive bound, we allocate
    enough memory for this.
    
    Avoid the extraneous mapping by having map_memory convert the exclusive
    end address to an inclusive end address by subtracting one, and do
    likewise in EARLY_ENTRIES() when calculating the number of required
    tables. For clarity, comments are updated to more clearly document which
    boundaries the macros operate on.  For consistency with the other
    macros, the comments in map_memory are also updated to describe `vstart`
    and `vend` as virtual addresses.
    
    Fixes: 0370b31e4845 ("arm64: Extend early page table code to allow for larger kernels")
    Cc: <stable@vger.kernel.org> # 4.16.x
    Signed-off-by: Mark Rutland <mark.rutland@arm.com>
    Cc: Anshuman Khandual <anshuman.khandual@arm.com>
    Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
    Cc: Steve Capper <steve.capper@arm.com>
    Cc: Will Deacon <will@kernel.org>
    Acked-by: Will Deacon <will@kernel.org>
    Link: https://lore.kernel.org/r/20210823101253.55567-1-mark.rutland@arm.com
    Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm64/include/asm/kernel-pgtable.h b/arch/arm64/include/asm/kernel-pgtable.h
index a780f6714b44..74ab40b76ad5 100644
--- a/arch/arm64/include/asm/kernel-pgtable.h
+++ b/arch/arm64/include/asm/kernel-pgtable.h
@@ -76,8 +76,8 @@
 #define EARLY_KASLR	(0)
 #endif
 
-#define EARLY_ENTRIES(vstart, vend, shift) (((vend) >> (shift)) \
-					- ((vstart) >> (shift)) + 1 + EARLY_KASLR)
+#define EARLY_ENTRIES(vstart, vend, shift) \
+	((((vend) - 1) >> (shift)) - ((vstart) >> (shift)) + 1 + EARLY_KASLR)
 
 #define EARLY_PGDS(vstart, vend) (EARLY_ENTRIES(vstart, vend, PGDIR_SHIFT))
 
diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
index c85ea70b9293..ea7f059dbcb6 100644
--- a/arch/arm64/kernel/head.S
+++ b/arch/arm64/kernel/head.S
@@ -202,7 +202,7 @@ ENDPROC(preserve_boot_args)
  * to be composed of multiple pages. (This effectively scales the end index).
  *
  *	vstart:	virtual address of start of range
- *	vend:	virtual address of end of range
+ *	vend:	virtual address of end of range - we map [vstart, vend]
  *	shift:	shift used to transform virtual address into index
  *	ptrs:	number of entries in page table
  *	istart:	index in table corresponding to vstart
@@ -239,17 +239,18 @@ ENDPROC(preserve_boot_args)
  *
  *	tbl:	location of page table
  *	rtbl:	address to be used for first level page table entry (typically tbl + PAGE_SIZE)
- *	vstart:	start address to map
- *	vend:	end address to map - we map [vstart, vend]
+ *	vstart:	virtual address of start of range
+ *	vend:	virtual address of end of range - we map [vstart, vend - 1]
  *	flags:	flags to use to map last level entries
  *	phys:	physical address corresponding to vstart - physical memory is contiguous
  *	pgds:	the number of pgd entries
  *
  * Temporaries:	istart, iend, tmp, count, sv - these need to be different registers
- * Preserves:	vstart, vend, flags
- * Corrupts:	tbl, rtbl, istart, iend, tmp, count, sv
+ * Preserves:	vstart, flags
+ * Corrupts:	tbl, rtbl, vend, istart, iend, tmp, count, sv
  */
 	.macro map_memory, tbl, rtbl, vstart, vend, flags, phys, pgds, istart, iend, tmp, count, sv
+	sub \vend, \vend, #1
 	add \rtbl, \tbl, #PAGE_SIZE
 	mov \sv, \rtbl
 	mov \count, #0

commit 9c8891b638319ddba9cfa330247922cd960c95b0
Author: Iwona Winiarska <iwona.winiarska@intel.com>
Date:   Wed Aug 4 01:48:18 2021 +0200

    soc: aspeed: lpc-ctrl: Fix boundary check for mmap
    
    commit b49a0e69a7b1a68c8d3f64097d06dabb770fec96 upstream.
    
    The check mixes pages (vm_pgoff) with bytes (vm_start, vm_end) on one
    side of the comparison, and uses resource address (rather than just the
    resource size) on the other side of the comparison.
    This can allow malicious userspace to easily bypass the boundary check and
    map pages that are located outside memory-region reserved by the driver.
    
    Fixes: 6c4e97678501 ("drivers/misc: Add Aspeed LPC control driver")
    Cc: stable@vger.kernel.org
    Signed-off-by: Iwona Winiarska <iwona.winiarska@intel.com>
    Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
    Tested-by: Andrew Jeffery <andrew@aj.id.au>
    Reviewed-by: Joel Stanley <joel@aj.id.au>
    Signed-off-by: Joel Stanley <joel@jms.id.au>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/misc/aspeed-lpc-ctrl.c b/drivers/misc/aspeed-lpc-ctrl.c
index a024f8042259..870ab0dfcde0 100644
--- a/drivers/misc/aspeed-lpc-ctrl.c
+++ b/drivers/misc/aspeed-lpc-ctrl.c
@@ -50,7 +50,7 @@ static int aspeed_lpc_ctrl_mmap(struct file *file, struct vm_area_struct *vma)
 	unsigned long vsize = vma->vm_end - vma->vm_start;
 	pgprot_t prot = vma->vm_page_prot;
 
-	if (vma->vm_pgoff + vsize > lpc_ctrl->mem_base + lpc_ctrl->mem_size)
+	if (vma->vm_pgoff + vma_pages(vma) > lpc_ctrl->mem_size >> PAGE_SHIFT)
 		return -EINVAL;
 
 	/* ast2400/2500 AHB accesses are not cache coherent */

commit a918bda2c08e0ec5d350ca8f9208d2179e009173
Author: Rolf Eike Beer <eb@emlix.com>
Date:   Fri Jul 30 13:51:54 2021 +0200

    tools/thermal/tmon: Add cross compiling support
    
    commit b5f7912bb604b47a0fe024560488a7556dce8ee7 upstream.
    
    Default to prefixed pkg-config when crosscompiling, this matches what
    other parts of the tools/ directory already do.
    
    [dlezcano] : Reworked description
    
    Signed-off-by: Rolf Eike Beer <eb@emlix.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
    Link: https://lore.kernel.org/r/31302992.qZodDJZGDc@devpool47
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/thermal/tmon/Makefile b/tools/thermal/tmon/Makefile
index 735a510230c3..45751648aacd 100644
--- a/tools/thermal/tmon/Makefile
+++ b/tools/thermal/tmon/Makefile
@@ -10,7 +10,7 @@ CFLAGS+= -O1 ${WARNFLAGS}
 # Add "-fstack-protector" only if toolchain supports it.
 CFLAGS+= $(call cc-option,-fstack-protector)
 CC?= $(CROSS_COMPILE)gcc
-PKG_CONFIG?= pkg-config
+PKG_CONFIG?= $(CROSS_COMPILE)pkg-config
 
 CFLAGS+=-D VERSION=\"$(VERSION)\"
 LDFLAGS+=

commit a386fceed74e9f1125104eea7e66cff187edeff7
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Mon Sep 13 18:35:37 2021 +0300

    bpf: Fix pointer arithmetic mask tightening under state pruning
    
    commit e042aa532c84d18ff13291d00620502ce7a38dda upstream.
    
    In 7fedb63a8307 ("bpf: Tighten speculative pointer arithmetic mask") we
    narrowed the offset mask for unprivileged pointer arithmetic in order to
    mitigate a corner case where in the speculative domain it is possible to
    advance, for example, the map value pointer by up to value_size-1 out-of-
    bounds in order to leak kernel memory via side-channel to user space.
    
    The verifier's state pruning for scalars leaves one corner case open
    where in the first verification path R_x holds an unknown scalar with an
    aux->alu_limit of e.g. 7, and in a second verification path that same
    register R_x, here denoted as R_x', holds an unknown scalar which has
    tighter bounds and would thus satisfy range_within(R_x, R_x') as well as
    tnum_in(R_x, R_x') for state pruning, yielding an aux->alu_limit of 3:
    Given the second path fits the register constraints for pruning, the final
    generated mask from aux->alu_limit will remain at 7. While technically
    not wrong for the non-speculative domain, it would however be possible
    to craft similar cases where the mask would be too wide as in 7fedb63a8307.
    
    One way to fix it is to detect the presence of unknown scalar map pointer
    arithmetic and force a deeper search on unknown scalars to ensure that
    we do not run into a masking mismatch.
    
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    [OP: adjusted context for 4.19]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h
index 729c65b320d4..4acd06cca703 100644
--- a/include/linux/bpf_verifier.h
+++ b/include/linux/bpf_verifier.h
@@ -215,6 +215,7 @@ struct bpf_verifier_env {
 	struct bpf_map *used_maps[MAX_USED_MAPS]; /* array of map's used by eBPF program */
 	u32 used_map_cnt;		/* number of used maps */
 	u32 id_gen;			/* used to generate unique reg IDs */
+	bool explore_alu_limits;
 	bool allow_ptr_leaks;
 	bool seen_direct_write;
 	struct bpf_insn_aux_data *insn_aux_data; /* array of per-insn state */
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 883fb762d93c..9a671f604ebf 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -2871,6 +2871,12 @@ static int sanitize_ptr_alu(struct bpf_verifier_env *env,
 		alu_state |= off_is_imm ? BPF_ALU_IMMEDIATE : 0;
 		alu_state |= ptr_is_dst_reg ?
 			     BPF_ALU_SANITIZE_SRC : BPF_ALU_SANITIZE_DST;
+
+		/* Limit pruning on unknown scalars to enable deep search for
+		 * potential masking differences from other program paths.
+		 */
+		if (!off_is_imm)
+			env->explore_alu_limits = true;
 	}
 
 	err = update_alu_sanitation_state(aux, alu_state, alu_limit);
@@ -4813,8 +4819,8 @@ static bool check_ids(u32 old_id, u32 cur_id, struct bpf_id_pair *idmap)
 }
 
 /* Returns true if (rold safe implies rcur safe) */
-static bool regsafe(struct bpf_reg_state *rold, struct bpf_reg_state *rcur,
-		    struct bpf_id_pair *idmap)
+static bool regsafe(struct bpf_verifier_env *env, struct bpf_reg_state *rold,
+		    struct bpf_reg_state *rcur, struct bpf_id_pair *idmap)
 {
 	bool equal;
 
@@ -4840,6 +4846,8 @@ static bool regsafe(struct bpf_reg_state *rold, struct bpf_reg_state *rcur,
 		return false;
 	switch (rold->type) {
 	case SCALAR_VALUE:
+		if (env->explore_alu_limits)
+			return false;
 		if (rcur->type == SCALAR_VALUE) {
 			/* new val must satisfy old val knowledge */
 			return range_within(rold, rcur) &&
@@ -4916,9 +4924,8 @@ static bool regsafe(struct bpf_reg_state *rold, struct bpf_reg_state *rcur,
 	return false;
 }
 
-static bool stacksafe(struct bpf_func_state *old,
-		      struct bpf_func_state *cur,
-		      struct bpf_id_pair *idmap)
+static bool stacksafe(struct bpf_verifier_env *env, struct bpf_func_state *old,
+		      struct bpf_func_state *cur, struct bpf_id_pair *idmap)
 {
 	int i, spi;
 
@@ -4960,9 +4967,8 @@ static bool stacksafe(struct bpf_func_state *old,
 			continue;
 		if (old->stack[spi].slot_type[0] != STACK_SPILL)
 			continue;
-		if (!regsafe(&old->stack[spi].spilled_ptr,
-			     &cur->stack[spi].spilled_ptr,
-			     idmap))
+		if (!regsafe(env, &old->stack[spi].spilled_ptr,
+			     &cur->stack[spi].spilled_ptr, idmap))
 			/* when explored and current stack slot are both storing
 			 * spilled registers, check that stored pointers types
 			 * are the same as well.
@@ -5011,10 +5017,11 @@ static bool func_states_equal(struct bpf_verifier_env *env, struct bpf_func_stat
 
 	memset(env->idmap_scratch, 0, sizeof(env->idmap_scratch));
 	for (i = 0; i < MAX_BPF_REG; i++)
-		if (!regsafe(&old->regs[i], &cur->regs[i], env->idmap_scratch))
+		if (!regsafe(env, &old->regs[i], &cur->regs[i],
+			     env->idmap_scratch))
 			return false;
 
-	if (!stacksafe(old, cur, env->idmap_scratch))
+	if (!stacksafe(env, old, cur, env->idmap_scratch))
 		return false;
 
 	return true;

commit a4fe956b03316516ce0eca037d480d270b9bed4c
Author: Lorenz Bauer <lmb@cloudflare.com>
Date:   Mon Sep 13 18:35:36 2021 +0300

    bpf: verifier: Allocate idmap scratch in verifier env
    
    commit c9e73e3d2b1eb1ea7ff068e05007eec3bd8ef1c9 upstream.
    
    func_states_equal makes a very short lived allocation for idmap,
    probably because it's too large to fit on the stack. However the
    function is called quite often, leading to a lot of alloc / free
    churn. Replace the temporary allocation with dedicated scratch
    space in struct bpf_verifier_env.
    
    Signed-off-by: Lorenz Bauer <lmb@cloudflare.com>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Acked-by: Edward Cree <ecree.xilinx@gmail.com>
    Link: https://lore.kernel.org/bpf/20210429134656.122225-4-lmb@cloudflare.com
    [OP: adjusted context for 4.19]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h
index e64ac93f7f4c..729c65b320d4 100644
--- a/include/linux/bpf_verifier.h
+++ b/include/linux/bpf_verifier.h
@@ -127,6 +127,13 @@ struct bpf_func_state {
 	struct bpf_stack_state *stack;
 };
 
+struct bpf_id_pair {
+	u32 old;
+	u32 cur;
+};
+
+/* Maximum number of register states that can exist at once */
+#define BPF_ID_MAP_SIZE (MAX_BPF_REG + MAX_BPF_STACK / BPF_REG_SIZE)
 #define MAX_CALL_FRAMES 8
 struct bpf_verifier_state {
 	/* call stack tracking */
@@ -213,6 +220,7 @@ struct bpf_verifier_env {
 	struct bpf_insn_aux_data *insn_aux_data; /* array of per-insn state */
 	struct bpf_verifier_log log;
 	struct bpf_subprog_info subprog_info[BPF_MAX_SUBPROGS + 1];
+	struct bpf_id_pair idmap_scratch[BPF_ID_MAP_SIZE];
 	u32 subprog_cnt;
 };
 
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index d38ec3266a84..883fb762d93c 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -4783,13 +4783,6 @@ static bool range_within(struct bpf_reg_state *old,
 	       old->smax_value >= cur->smax_value;
 }
 
-/* Maximum number of register states that can exist at once */
-#define ID_MAP_SIZE	(MAX_BPF_REG + MAX_BPF_STACK / BPF_REG_SIZE)
-struct idpair {
-	u32 old;
-	u32 cur;
-};
-
 /* If in the old state two registers had the same id, then they need to have
  * the same id in the new state as well.  But that id could be different from
  * the old state, so we need to track the mapping from old to new ids.
@@ -4800,11 +4793,11 @@ struct idpair {
  * So we look through our idmap to see if this old id has been seen before.  If
  * so, we require the new id to match; otherwise, we add the id pair to the map.
  */
-static bool check_ids(u32 old_id, u32 cur_id, struct idpair *idmap)
+static bool check_ids(u32 old_id, u32 cur_id, struct bpf_id_pair *idmap)
 {
 	unsigned int i;
 
-	for (i = 0; i < ID_MAP_SIZE; i++) {
+	for (i = 0; i < BPF_ID_MAP_SIZE; i++) {
 		if (!idmap[i].old) {
 			/* Reached an empty slot; haven't seen this id before */
 			idmap[i].old = old_id;
@@ -4821,7 +4814,7 @@ static bool check_ids(u32 old_id, u32 cur_id, struct idpair *idmap)
 
 /* Returns true if (rold safe implies rcur safe) */
 static bool regsafe(struct bpf_reg_state *rold, struct bpf_reg_state *rcur,
-		    struct idpair *idmap)
+		    struct bpf_id_pair *idmap)
 {
 	bool equal;
 
@@ -4925,7 +4918,7 @@ static bool regsafe(struct bpf_reg_state *rold, struct bpf_reg_state *rcur,
 
 static bool stacksafe(struct bpf_func_state *old,
 		      struct bpf_func_state *cur,
-		      struct idpair *idmap)
+		      struct bpf_id_pair *idmap)
 {
 	int i, spi;
 
@@ -5011,29 +5004,20 @@ static bool stacksafe(struct bpf_func_state *old,
  * whereas register type in current state is meaningful, it means that
  * the current state will reach 'bpf_exit' instruction safely
  */
-static bool func_states_equal(struct bpf_func_state *old,
+static bool func_states_equal(struct bpf_verifier_env *env, struct bpf_func_state *old,
 			      struct bpf_func_state *cur)
 {
-	struct idpair *idmap;
-	bool ret = false;
 	int i;
 
-	idmap = kcalloc(ID_MAP_SIZE, sizeof(struct idpair), GFP_KERNEL);
-	/* If we failed to allocate the idmap, just say it's not safe */
-	if (!idmap)
-		return false;
+	memset(env->idmap_scratch, 0, sizeof(env->idmap_scratch));
+	for (i = 0; i < MAX_BPF_REG; i++)
+		if (!regsafe(&old->regs[i], &cur->regs[i], env->idmap_scratch))
+			return false;
 
-	for (i = 0; i < MAX_BPF_REG; i++) {
-		if (!regsafe(&old->regs[i], &cur->regs[i], idmap))
-			goto out_free;
-	}
+	if (!stacksafe(old, cur, env->idmap_scratch))
+		return false;
 
-	if (!stacksafe(old, cur, idmap))
-		goto out_free;
-	ret = true;
-out_free:
-	kfree(idmap);
-	return ret;
+	return true;
 }
 
 static bool states_equal(struct bpf_verifier_env *env,
@@ -5057,7 +5041,7 @@ static bool states_equal(struct bpf_verifier_env *env,
 	for (i = 0; i <= old->curframe; i++) {
 		if (old->frame[i]->callsite != cur->frame[i]->callsite)
 			return false;
-		if (!func_states_equal(old->frame[i], cur->frame[i]))
+		if (!func_states_equal(env, old->frame[i], cur->frame[i]))
 			return false;
 	}
 	return true;

commit 872968502114d68c21419cf7eb5ab97717e7b803
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Mon Sep 13 18:35:35 2021 +0300

    bpf: Fix leakage due to insufficient speculative store bypass mitigation
    
    commit 2039f26f3aca5b0e419b98f65dd36481337b86ee upstream.
    
    Spectre v4 gadgets make use of memory disambiguation, which is a set of
    techniques that execute memory access instructions, that is, loads and
    stores, out of program order; Intel's optimization manual, section 2.4.4.5:
    
      A load instruction micro-op may depend on a preceding store. Many
      microarchitectures block loads until all preceding store addresses are
      known. The memory disambiguator predicts which loads will not depend on
      any previous stores. When the disambiguator predicts that a load does
      not have such a dependency, the load takes its data from the L1 data
      cache. Eventually, the prediction is verified. If an actual conflict is
      detected, the load and all succeeding instructions are re-executed.
    
    af86ca4e3088 ("bpf: Prevent memory disambiguation attack") tried to mitigate
    this attack by sanitizing the memory locations through preemptive "fast"
    (low latency) stores of zero prior to the actual "slow" (high latency) store
    of a pointer value such that upon dependency misprediction the CPU then
    speculatively executes the load of the pointer value and retrieves the zero
    value instead of the attacker controlled scalar value previously stored at
    that location, meaning, subsequent access in the speculative domain is then
    redirected to the "zero page".
    
    The sanitized preemptive store of zero prior to the actual "slow" store is
    done through a simple ST instruction based on r10 (frame pointer) with
    relative offset to the stack location that the verifier has been tracking
    on the original used register for STX, which does not have to be r10. Thus,
    there are no memory dependencies for this store, since it's only using r10
    and immediate constant of zero; hence af86ca4e3088 /assumed/ a low latency
    operation.
    
    However, a recent attack demonstrated that this mitigation is not sufficient
    since the preemptive store of zero could also be turned into a "slow" store
    and is thus bypassed as well:
    
      [...]
      // r2 = oob address (e.g. scalar)
      // r7 = pointer to map value
      31: (7b) *(u64 *)(r10 -16) = r2
      // r9 will remain "fast" register, r10 will become "slow" register below
      32: (bf) r9 = r10
      // JIT maps BPF reg to x86 reg:
      //  r9  -> r15 (callee saved)
      //  r10 -> rbp
      // train store forward prediction to break dependency link between both r9
      // and r10 by evicting them from the predictor's LRU table.
      33: (61) r0 = *(u32 *)(r7 +24576)
      34: (63) *(u32 *)(r7 +29696) = r0
      35: (61) r0 = *(u32 *)(r7 +24580)
      36: (63) *(u32 *)(r7 +29700) = r0
      37: (61) r0 = *(u32 *)(r7 +24584)
      38: (63) *(u32 *)(r7 +29704) = r0
      39: (61) r0 = *(u32 *)(r7 +24588)
      40: (63) *(u32 *)(r7 +29708) = r0
      [...]
      543: (61) r0 = *(u32 *)(r7 +25596)
      544: (63) *(u32 *)(r7 +30716) = r0
      // prepare call to bpf_ringbuf_output() helper. the latter will cause rbp
      // to spill to stack memory while r13/r14/r15 (all callee saved regs) remain
      // in hardware registers. rbp becomes slow due to push/pop latency. below is
      // disasm of bpf_ringbuf_output() helper for better visual context:
      //
      // ffffffff8117ee20: 41 54                 push   r12
      // ffffffff8117ee22: 55                    push   rbp
      // ffffffff8117ee23: 53                    push   rbx
      // ffffffff8117ee24: 48 f7 c1 fc ff ff ff  test   rcx,0xfffffffffffffffc
      // ffffffff8117ee2b: 0f 85 af 00 00 00     jne    ffffffff8117eee0 <-- jump taken
      // [...]
      // ffffffff8117eee0: 49 c7 c4 ea ff ff ff  mov    r12,0xffffffffffffffea
      // ffffffff8117eee7: 5b                    pop    rbx
      // ffffffff8117eee8: 5d                    pop    rbp
      // ffffffff8117eee9: 4c 89 e0              mov    rax,r12
      // ffffffff8117eeec: 41 5c                 pop    r12
      // ffffffff8117eeee: c3                    ret
      545: (18) r1 = map[id:4]
      547: (bf) r2 = r7
      548: (b7) r3 = 0
      549: (b7) r4 = 4
      550: (85) call bpf_ringbuf_output#194288
      // instruction 551 inserted by verifier    \
      551: (7a) *(u64 *)(r10 -16) = 0            | /both/ are now slow stores here
      // storing map value pointer r7 at fp-16   | since value of r10 is "slow".
      552: (7b) *(u64 *)(r10 -16) = r7           /
      // following "fast" read to the same memory location, but due to dependency
      // misprediction it will speculatively execute before insn 551/552 completes.
      553: (79) r2 = *(u64 *)(r9 -16)
      // in speculative domain contains attacker controlled r2. in non-speculative
      // domain this contains r7, and thus accesses r7 +0 below.
      554: (71) r3 = *(u8 *)(r2 +0)
      // leak r3
    
    As can be seen, the current speculative store bypass mitigation which the
    verifier inserts at line 551 is insufficient since /both/, the write of
    the zero sanitation as well as the map value pointer are a high latency
    instruction due to prior memory access via push/pop of r10 (rbp) in contrast
    to the low latency read in line 553 as r9 (r15) which stays in hardware
    registers. Thus, architecturally, fp-16 is r7, however, microarchitecturally,
    fp-16 can still be r2.
    
    Initial thoughts to address this issue was to track spilled pointer loads
    from stack and enforce their load via LDX through r10 as well so that /both/
    the preemptive store of zero /as well as/ the load use the /same/ register
    such that a dependency is created between the store and load. However, this
    option is not sufficient either since it can be bypassed as well under
    speculation. An updated attack with pointer spill/fills now _all_ based on
    r10 would look as follows:
    
      [...]
      // r2 = oob address (e.g. scalar)
      // r7 = pointer to map value
      [...]
      // longer store forward prediction training sequence than before.
      2062: (61) r0 = *(u32 *)(r7 +25588)
      2063: (63) *(u32 *)(r7 +30708) = r0
      2064: (61) r0 = *(u32 *)(r7 +25592)
      2065: (63) *(u32 *)(r7 +30712) = r0
      2066: (61) r0 = *(u32 *)(r7 +25596)
      2067: (63) *(u32 *)(r7 +30716) = r0
      // store the speculative load address (scalar) this time after the store
      // forward prediction training.
      2068: (7b) *(u64 *)(r10 -16) = r2
      // preoccupy the CPU store port by running sequence of dummy stores.
      2069: (63) *(u32 *)(r7 +29696) = r0
      2070: (63) *(u32 *)(r7 +29700) = r0
      2071: (63) *(u32 *)(r7 +29704) = r0
      2072: (63) *(u32 *)(r7 +29708) = r0
      2073: (63) *(u32 *)(r7 +29712) = r0
      2074: (63) *(u32 *)(r7 +29716) = r0
      2075: (63) *(u32 *)(r7 +29720) = r0
      2076: (63) *(u32 *)(r7 +29724) = r0
      2077: (63) *(u32 *)(r7 +29728) = r0
      2078: (63) *(u32 *)(r7 +29732) = r0
      2079: (63) *(u32 *)(r7 +29736) = r0
      2080: (63) *(u32 *)(r7 +29740) = r0
      2081: (63) *(u32 *)(r7 +29744) = r0
      2082: (63) *(u32 *)(r7 +29748) = r0
      2083: (63) *(u32 *)(r7 +29752) = r0
      2084: (63) *(u32 *)(r7 +29756) = r0
      2085: (63) *(u32 *)(r7 +29760) = r0
      2086: (63) *(u32 *)(r7 +29764) = r0
      2087: (63) *(u32 *)(r7 +29768) = r0
      2088: (63) *(u32 *)(r7 +29772) = r0
      2089: (63) *(u32 *)(r7 +29776) = r0
      2090: (63) *(u32 *)(r7 +29780) = r0
      2091: (63) *(u32 *)(r7 +29784) = r0
      2092: (63) *(u32 *)(r7 +29788) = r0
      2093: (63) *(u32 *)(r7 +29792) = r0
      2094: (63) *(u32 *)(r7 +29796) = r0
      2095: (63) *(u32 *)(r7 +29800) = r0
      2096: (63) *(u32 *)(r7 +29804) = r0
      2097: (63) *(u32 *)(r7 +29808) = r0
      2098: (63) *(u32 *)(r7 +29812) = r0
      // overwrite scalar with dummy pointer; same as before, also including the
      // sanitation store with 0 from the current mitigation by the verifier.
      2099: (7a) *(u64 *)(r10 -16) = 0         | /both/ are now slow stores here
      2100: (7b) *(u64 *)(r10 -16) = r7        | since store unit is still busy.
      // load from stack intended to bypass stores.
      2101: (79) r2 = *(u64 *)(r10 -16)
      2102: (71) r3 = *(u8 *)(r2 +0)
      // leak r3
      [...]
    
    Looking at the CPU microarchitecture, the scheduler might issue loads (such
    as seen in line 2101) before stores (line 2099,2100) because the load execution
    units become available while the store execution unit is still busy with the
    sequence of dummy stores (line 2069-2098). And so the load may use the prior
    stored scalar from r2 at address r10 -16 for speculation. The updated attack
    may work less reliable on CPU microarchitectures where loads and stores share
    execution resources.
    
    This concludes that the sanitizing with zero stores from af86ca4e3088 ("bpf:
    Prevent memory disambiguation attack") is insufficient. Moreover, the detection
    of stack reuse from af86ca4e3088 where previously data (STACK_MISC) has been
    written to a given stack slot where a pointer value is now to be stored does
    not have sufficient coverage as precondition for the mitigation either; for
    several reasons outlined as follows:
    
     1) Stack content from prior program runs could still be preserved and is
        therefore not "random", best example is to split a speculative store
        bypass attack between tail calls, program A would prepare and store the
        oob address at a given stack slot and then tail call into program B which
        does the "slow" store of a pointer to the stack with subsequent "fast"
        read. From program B PoV such stack slot type is STACK_INVALID, and
        therefore also must be subject to mitigation.
    
     2) The STACK_SPILL must not be coupled to register_is_const(&stack->spilled_ptr)
        condition, for example, the previous content of that memory location could
        also be a pointer to map or map value. Without the fix, a speculative
        store bypass is not mitigated in such precondition and can then lead to
        a type confusion in the speculative domain leaking kernel memory near
        these pointer types.
    
    While brainstorming on various alternative mitigation possibilities, we also
    stumbled upon a retrospective from Chrome developers [0]:
    
      [...] For variant 4, we implemented a mitigation to zero the unused memory
      of the heap prior to allocation, which cost about 1% when done concurrently
      and 4% for scavenging. Variant 4 defeats everything we could think of. We
      explored more mitigations for variant 4 but the threat proved to be more
      pervasive and dangerous than we anticipated. For example, stack slots used
      by the register allocator in the optimizing compiler could be subject to
      type confusion, leading to pointer crafting. Mitigating type confusion for
      stack slots alone would have required a complete redesign of the backend of
      the optimizing compiler, perhaps man years of work, without a guarantee of
      completeness. [...]
    
    >From BPF side, the problem space is reduced, however, options are rather
    limited. One idea that has been explored was to xor-obfuscate pointer spills
    to the BPF stack:
    
      [...]
      // preoccupy the CPU store port by running sequence of dummy stores.
      [...]
      2106: (63) *(u32 *)(r7 +29796) = r0
      2107: (63) *(u32 *)(r7 +29800) = r0
      2108: (63) *(u32 *)(r7 +29804) = r0
      2109: (63) *(u32 *)(r7 +29808) = r0
      2110: (63) *(u32 *)(r7 +29812) = r0
      // overwrite scalar with dummy pointer; xored with random 'secret' value
      // of 943576462 before store ...
      2111: (b4) w11 = 943576462
      2112: (af) r11 ^= r7
      2113: (7b) *(u64 *)(r10 -16) = r11
      2114: (79) r11 = *(u64 *)(r10 -16)
      2115: (b4) w2 = 943576462
      2116: (af) r2 ^= r11
      // ... and restored with the same 'secret' value with the help of AX reg.
      2117: (71) r3 = *(u8 *)(r2 +0)
      [...]
    
    While the above would not prevent speculation, it would make data leakage
    infeasible by directing it to random locations. In order to be effective
    and prevent type confusion under speculation, such random secret would have
    to be regenerated for each store. The additional complexity involved for a
    tracking mechanism that prevents jumps such that restoring spilled pointers
    would not get corrupted is not worth the gain for unprivileged. Hence, the
    fix in here eventually opted for emitting a non-public BPF_ST | BPF_NOSPEC
    instruction which the x86 JIT translates into a lfence opcode. Inserting the
    latter in between the store and load instruction is one of the mitigations
    options [1]. The x86 instruction manual notes:
    
      [...] An LFENCE that follows an instruction that stores to memory might
      complete before the data being stored have become globally visible. [...]
    
    The latter meaning that the preceding store instruction finished execution
    and the store is at minimum guaranteed to be in the CPU's store queue, but
    it's not guaranteed to be in that CPU's L1 cache at that point (globally
    visible). The latter would only be guaranteed via sfence. So the load which
    is guaranteed to execute after the lfence for that local CPU would have to
    rely on store-to-load forwarding. [2], in section 2.3 on store buffers says:
    
      [...] For every store operation that is added to the ROB, an entry is
      allocated in the store buffer. This entry requires both the virtual and
      physical address of the target. Only if there is no free entry in the store
      buffer, the frontend stalls until there is an empty slot available in the
      store buffer again. Otherwise, the CPU can immediately continue adding
      subsequent instructions to the ROB and execute them out of order. On Intel
      CPUs, the store buffer has up to 56 entries. [...]
    
    One small upside on the fix is that it lifts constraints from af86ca4e3088
    where the sanitize_stack_off relative to r10 must be the same when coming
    from different paths. The BPF_ST | BPF_NOSPEC gets emitted after a BPF_STX
    or BPF_ST instruction. This happens either when we store a pointer or data
    value to the BPF stack for the first time, or upon later pointer spills.
    The former needs to be enforced since otherwise stale stack data could be
    leaked under speculation as outlined earlier. For non-x86 JITs the BPF_ST |
    BPF_NOSPEC mapping is currently optimized away, but others could emit a
    speculation barrier as well if necessary. For real-world unprivileged
    programs e.g. generated by LLVM, pointer spill/fill is only generated upon
    register pressure and LLVM only tries to do that for pointers which are not
    used often. The program main impact will be the initial BPF_ST | BPF_NOSPEC
    sanitation for the STACK_INVALID case when the first write to a stack slot
    occurs e.g. upon map lookup. In future we might refine ways to mitigate
    the latter cost.
    
      [0] https://arxiv.org/pdf/1902.05178.pdf
      [1] https://msrc-blog.microsoft.com/2018/05/21/analysis-and-mitigation-of-speculative-store-bypass-cve-2018-3639/
      [2] https://arxiv.org/pdf/1905.05725.pdf
    
    Fixes: af86ca4e3088 ("bpf: Prevent memory disambiguation attack")
    Fixes: f7cf25b2026d ("bpf: track spill/fill of constants")
    Co-developed-by: Piotr Krysiuk <piotras@gmail.com>
    Co-developed-by: Benedict Schlueter <benedict.schlueter@rub.de>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: Piotr Krysiuk <piotras@gmail.com>
    Signed-off-by: Benedict Schlueter <benedict.schlueter@rub.de>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    [OP: - apply check_stack_write_fixed_off() changes in check_stack_write()
         - replace env->bypass_spec_v4 -> env->allow_ptr_leaks]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h
index daab0960c054..e64ac93f7f4c 100644
--- a/include/linux/bpf_verifier.h
+++ b/include/linux/bpf_verifier.h
@@ -158,8 +158,8 @@ struct bpf_insn_aux_data {
 		u32 alu_limit;			/* limit for add/sub register with pointer */
 	};
 	int ctx_field_size; /* the ctx field size for load insn, maybe 0 */
-	int sanitize_stack_off; /* stack slot to be cleared */
 	bool seen; /* this insn was processed by the verifier */
+	bool sanitize_stack_spill; /* subject to Spectre v4 sanitation */
 	u8 alu_state; /* used in combination with alu_limit */
 };
 
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index ce051c0b9a54..d38ec3266a84 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -1008,6 +1008,19 @@ static int check_stack_write(struct bpf_verifier_env *env,
 	cur = env->cur_state->frame[env->cur_state->curframe];
 	if (value_regno >= 0)
 		reg = &cur->regs[value_regno];
+	if (!env->allow_ptr_leaks) {
+		bool sanitize = reg && is_spillable_regtype(reg->type);
+
+		for (i = 0; i < size; i++) {
+			if (state->stack[spi].slot_type[i] == STACK_INVALID) {
+				sanitize = true;
+				break;
+			}
+		}
+
+		if (sanitize)
+			env->insn_aux_data[insn_idx].sanitize_stack_spill = true;
+	}
 
 	if (reg && size == BPF_REG_SIZE && register_is_const(reg) &&
 	    !register_is_null(reg) && env->allow_ptr_leaks) {
@@ -1018,47 +1031,10 @@ static int check_stack_write(struct bpf_verifier_env *env,
 			verbose(env, "invalid size of register spill\n");
 			return -EACCES;
 		}
-
 		if (state != cur && reg->type == PTR_TO_STACK) {
 			verbose(env, "cannot spill pointers to stack into stack frame of the caller\n");
 			return -EINVAL;
 		}
-
-		if (!env->allow_ptr_leaks) {
-			bool sanitize = false;
-
-			if (state->stack[spi].slot_type[0] == STACK_SPILL &&
-			    register_is_const(&state->stack[spi].spilled_ptr))
-				sanitize = true;
-			for (i = 0; i < BPF_REG_SIZE; i++)
-				if (state->stack[spi].slot_type[i] == STACK_MISC) {
-					sanitize = true;
-					break;
-				}
-			if (sanitize) {
-				int *poff = &env->insn_aux_data[insn_idx].sanitize_stack_off;
-				int soff = (-spi - 1) * BPF_REG_SIZE;
-
-				/* detected reuse of integer stack slot with a pointer
-				 * which means either llvm is reusing stack slot or
-				 * an attacker is trying to exploit CVE-2018-3639
-				 * (speculative store bypass)
-				 * Have to sanitize that slot with preemptive
-				 * store of zero.
-				 */
-				if (*poff && *poff != soff) {
-					/* disallow programs where single insn stores
-					 * into two different stack slots, since verifier
-					 * cannot sanitize them
-					 */
-					verbose(env,
-						"insn %d cannot access two stack slots fp%d and fp%d",
-						insn_idx, *poff, soff);
-					return -EINVAL;
-				}
-				*poff = soff;
-			}
-		}
 		save_register_state(state, spi, reg);
 	} else {
 		u8 type = STACK_MISC;
@@ -5867,34 +5843,33 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env)
 	insn = env->prog->insnsi + delta;
 
 	for (i = 0; i < insn_cnt; i++, insn++) {
+		bool ctx_access;
+
 		if (insn->code == (BPF_LDX | BPF_MEM | BPF_B) ||
 		    insn->code == (BPF_LDX | BPF_MEM | BPF_H) ||
 		    insn->code == (BPF_LDX | BPF_MEM | BPF_W) ||
-		    insn->code == (BPF_LDX | BPF_MEM | BPF_DW))
+		    insn->code == (BPF_LDX | BPF_MEM | BPF_DW)) {
 			type = BPF_READ;
-		else if (insn->code == (BPF_STX | BPF_MEM | BPF_B) ||
-			 insn->code == (BPF_STX | BPF_MEM | BPF_H) ||
-			 insn->code == (BPF_STX | BPF_MEM | BPF_W) ||
-			 insn->code == (BPF_STX | BPF_MEM | BPF_DW))
+			ctx_access = true;
+		} else if (insn->code == (BPF_STX | BPF_MEM | BPF_B) ||
+			   insn->code == (BPF_STX | BPF_MEM | BPF_H) ||
+			   insn->code == (BPF_STX | BPF_MEM | BPF_W) ||
+			   insn->code == (BPF_STX | BPF_MEM | BPF_DW) ||
+			   insn->code == (BPF_ST | BPF_MEM | BPF_B) ||
+			   insn->code == (BPF_ST | BPF_MEM | BPF_H) ||
+			   insn->code == (BPF_ST | BPF_MEM | BPF_W) ||
+			   insn->code == (BPF_ST | BPF_MEM | BPF_DW)) {
 			type = BPF_WRITE;
-		else
+			ctx_access = BPF_CLASS(insn->code) == BPF_STX;
+		} else {
 			continue;
+		}
 
 		if (type == BPF_WRITE &&
-		    env->insn_aux_data[i + delta].sanitize_stack_off) {
+		    env->insn_aux_data[i + delta].sanitize_stack_spill) {
 			struct bpf_insn patch[] = {
-				/* Sanitize suspicious stack slot with zero.
-				 * There are no memory dependencies for this store,
-				 * since it's only using frame pointer and immediate
-				 * constant of zero
-				 */
-				BPF_ST_MEM(BPF_DW, BPF_REG_FP,
-					   env->insn_aux_data[i + delta].sanitize_stack_off,
-					   0),
-				/* the original STX instruction will immediately
-				 * overwrite the same stack slot with appropriate value
-				 */
 				*insn,
+				BPF_ST_NOSPEC(),
 			};
 
 			cnt = ARRAY_SIZE(patch);
@@ -5908,6 +5883,9 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env)
 			continue;
 		}
 
+		if (!ctx_access)
+			continue;
+
 		if (env->insn_aux_data[i + delta].ptr_type != PTR_TO_CTX)
 			continue;
 

commit 91cdb5b36234e6af69d6280f1510e4453707a2b8
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Mon Sep 13 18:35:34 2021 +0300

    bpf: Introduce BPF nospec instruction for mitigating Spectre v4
    
    commit f5e81d1117501546b7be050c5fbafa6efd2c722c upstream.
    
    In case of JITs, each of the JIT backends compiles the BPF nospec instruction
    /either/ to a machine instruction which emits a speculation barrier /or/ to
    /no/ machine instruction in case the underlying architecture is not affected
    by Speculative Store Bypass or has different mitigations in place already.
    
    This covers both x86 and (implicitly) arm64: In case of x86, we use 'lfence'
    instruction for mitigation. In case of arm64, we rely on the firmware mitigation
    as controlled via the ssbd kernel parameter. Whenever the mitigation is enabled,
    it works for all of the kernel code with no need to provide any additional
    instructions here (hence only comment in arm64 JIT). Other archs can follow
    as needed. The BPF nospec instruction is specifically targeting Spectre v4
    since i) we don't use a serialization barrier for the Spectre v1 case, and
    ii) mitigation instructions for v1 and v4 might be different on some archs.
    
    The BPF nospec is required for a future commit, where the BPF verifier does
    annotate intermediate BPF programs with speculation barriers.
    
    Co-developed-by: Piotr Krysiuk <piotras@gmail.com>
    Co-developed-by: Benedict Schlueter <benedict.schlueter@rub.de>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: Piotr Krysiuk <piotras@gmail.com>
    Signed-off-by: Benedict Schlueter <benedict.schlueter@rub.de>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    [OP: adjusted context for 4.19, drop riscv and ppc32 changes]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/net/bpf_jit_32.c b/arch/arm/net/bpf_jit_32.c
index 328ced7bfaf2..79b12e744537 100644
--- a/arch/arm/net/bpf_jit_32.c
+++ b/arch/arm/net/bpf_jit_32.c
@@ -1578,6 +1578,9 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx)
 		rn = arm_bpf_get_reg32(src_lo, tmp2[1], ctx);
 		emit_ldx_r(dst, rn, off, ctx, BPF_SIZE(code));
 		break;
+	/* speculation barrier */
+	case BPF_ST | BPF_NOSPEC:
+		break;
 	/* ST: *(size *)(dst + off) = imm */
 	case BPF_ST | BPF_MEM | BPF_W:
 	case BPF_ST | BPF_MEM | BPF_H:
diff --git a/arch/arm64/net/bpf_jit_comp.c b/arch/arm64/net/bpf_jit_comp.c
index 7f0258ed1f5f..6876e8205042 100644
--- a/arch/arm64/net/bpf_jit_comp.c
+++ b/arch/arm64/net/bpf_jit_comp.c
@@ -685,6 +685,19 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx)
 		}
 		break;
 
+	/* speculation barrier */
+	case BPF_ST | BPF_NOSPEC:
+		/*
+		 * Nothing required here.
+		 *
+		 * In case of arm64, we rely on the firmware mitigation of
+		 * Speculative Store Bypass as controlled via the ssbd kernel
+		 * parameter. Whenever the mitigation is enabled, it works
+		 * for all of the kernel code with no need to provide any
+		 * additional instructions.
+		 */
+		break;
+
 	/* ST: *(size *)(dst + off) = imm */
 	case BPF_ST | BPF_MEM | BPF_W:
 	case BPF_ST | BPF_MEM | BPF_H:
diff --git a/arch/mips/net/ebpf_jit.c b/arch/mips/net/ebpf_jit.c
index 3832c4628608..947a7172c814 100644
--- a/arch/mips/net/ebpf_jit.c
+++ b/arch/mips/net/ebpf_jit.c
@@ -1282,6 +1282,9 @@ static int build_one_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,
 		}
 		break;
 
+	case BPF_ST | BPF_NOSPEC: /* speculation barrier */
+		break;
+
 	case BPF_ST | BPF_B | BPF_MEM:
 	case BPF_ST | BPF_H | BPF_MEM:
 	case BPF_ST | BPF_W | BPF_MEM:
diff --git a/arch/powerpc/net/bpf_jit_comp64.c b/arch/powerpc/net/bpf_jit_comp64.c
index 7e3ab477f67f..e7d56ddba43a 100644
--- a/arch/powerpc/net/bpf_jit_comp64.c
+++ b/arch/powerpc/net/bpf_jit_comp64.c
@@ -596,6 +596,12 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
 			}
 			break;
 
+		/*
+		 * BPF_ST NOSPEC (speculation barrier)
+		 */
+		case BPF_ST | BPF_NOSPEC:
+			break;
+
 		/*
 		 * BPF_ST(X)
 		 */
diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c
index e42354b15e0b..2a36845dcbc0 100644
--- a/arch/s390/net/bpf_jit_comp.c
+++ b/arch/s390/net/bpf_jit_comp.c
@@ -883,6 +883,11 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i
 			break;
 		}
 		break;
+	/*
+	 * BPF_NOSPEC (speculation barrier)
+	 */
+	case BPF_ST | BPF_NOSPEC:
+		break;
 	/*
 	 * BPF_ST(X)
 	 */
diff --git a/arch/sparc/net/bpf_jit_comp_64.c b/arch/sparc/net/bpf_jit_comp_64.c
index ec4da4dc98f1..1bb1e64d4377 100644
--- a/arch/sparc/net/bpf_jit_comp_64.c
+++ b/arch/sparc/net/bpf_jit_comp_64.c
@@ -1261,6 +1261,9 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx)
 		emit(opcode | RS1(src) | rs2 | RD(dst), ctx);
 		break;
 	}
+	/* speculation barrier */
+	case BPF_ST | BPF_NOSPEC:
+		break;
 	/* ST: *(size *)(dst + off) = imm */
 	case BPF_ST | BPF_MEM | BPF_W:
 	case BPF_ST | BPF_MEM | BPF_H:
diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c
index 924ca27a6139..81c3d4b4c7e2 100644
--- a/arch/x86/net/bpf_jit_comp.c
+++ b/arch/x86/net/bpf_jit_comp.c
@@ -731,6 +731,13 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
 			}
 			break;
 
+			/* speculation barrier */
+		case BPF_ST | BPF_NOSPEC:
+			if (boot_cpu_has(X86_FEATURE_XMM2))
+				/* Emit 'lfence' */
+				EMIT3(0x0F, 0xAE, 0xE8);
+			break;
+
 			/* ST: *(u8*)(dst_reg + off) = imm */
 		case BPF_ST | BPF_MEM | BPF_B:
 			if (is_ereg(dst_reg))
diff --git a/arch/x86/net/bpf_jit_comp32.c b/arch/x86/net/bpf_jit_comp32.c
index adee990abab1..f48300988bc2 100644
--- a/arch/x86/net/bpf_jit_comp32.c
+++ b/arch/x86/net/bpf_jit_comp32.c
@@ -1683,6 +1683,12 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
 			i++;
 			break;
 		}
+		/* speculation barrier */
+		case BPF_ST | BPF_NOSPEC:
+			if (boot_cpu_has(X86_FEATURE_XMM2))
+				/* Emit 'lfence' */
+				EMIT3(0x0F, 0xAE, 0xE8);
+			break;
 		/* ST: *(u8*)(dst_reg + off) = imm */
 		case BPF_ST | BPF_MEM | BPF_H:
 		case BPF_ST | BPF_MEM | BPF_B:
diff --git a/include/linux/filter.h b/include/linux/filter.h
index 7c84762cb59e..e981bd92a4e3 100644
--- a/include/linux/filter.h
+++ b/include/linux/filter.h
@@ -64,6 +64,11 @@ struct sock_reuseport;
 /* unused opcode to mark call to interpreter with arguments */
 #define BPF_CALL_ARGS	0xe0
 
+/* unused opcode to mark speculation barrier for mitigating
+ * Speculative Store Bypass
+ */
+#define BPF_NOSPEC	0xc0
+
 /* As per nm, we expose JITed images as text (code) section for
  * kallsyms. That way, tools like perf can find it to match
  * addresses.
@@ -354,6 +359,16 @@ struct sock_reuseport;
 		.off   = 0,					\
 		.imm   = 0 })
 
+/* Speculation barrier */
+
+#define BPF_ST_NOSPEC()						\
+	((struct bpf_insn) {					\
+		.code  = BPF_ST | BPF_NOSPEC,			\
+		.dst_reg = 0,					\
+		.src_reg = 0,					\
+		.off   = 0,					\
+		.imm   = 0 })
+
 /* Internal classic blocks for direct assignment */
 
 #define __BPF_STMT(CODE, K)					\
diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
index d2b6d2459aad..341402bc1202 100644
--- a/kernel/bpf/core.c
+++ b/kernel/bpf/core.c
@@ -33,6 +33,7 @@
 #include <linux/rcupdate.h>
 #include <linux/perf_event.h>
 
+#include <asm/barrier.h>
 #include <asm/unaligned.h>
 
 /* Registers */
@@ -1050,6 +1051,7 @@ static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack)
 		/* Non-UAPI available opcodes. */
 		[BPF_JMP | BPF_CALL_ARGS] = &&JMP_CALL_ARGS,
 		[BPF_JMP | BPF_TAIL_CALL] = &&JMP_TAIL_CALL,
+		[BPF_ST  | BPF_NOSPEC] = &&ST_NOSPEC,
 	};
 #undef BPF_INSN_3_LBL
 #undef BPF_INSN_2_LBL
@@ -1356,7 +1358,21 @@ static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack)
 	JMP_EXIT:
 		return BPF_R0;
 
-	/* STX and ST and LDX*/
+	/* ST, STX and LDX*/
+	ST_NOSPEC:
+		/* Speculation barrier for mitigating Speculative Store Bypass.
+		 * In case of arm64, we rely on the firmware mitigation as
+		 * controlled via the ssbd kernel parameter. Whenever the
+		 * mitigation is enabled, it works for all of the kernel code
+		 * with no need to provide any additional instructions here.
+		 * In case of x86, we use 'lfence' insn for mitigation. We
+		 * reuse preexisting logic from Spectre v1 mitigation that
+		 * happens to produce the required code on x86 for v4 as well.
+		 */
+#ifdef CONFIG_X86
+		barrier_nospec();
+#endif
+		CONT;
 #define LDST(SIZEOP, SIZE)						\
 	STX_MEM_##SIZEOP:						\
 		*(SIZE *)(unsigned long) (DST + insn->off) = SRC;	\
diff --git a/kernel/bpf/disasm.c b/kernel/bpf/disasm.c
index d6b76377cb6e..cbd75dd5992e 100644
--- a/kernel/bpf/disasm.c
+++ b/kernel/bpf/disasm.c
@@ -171,15 +171,17 @@ void print_bpf_insn(const struct bpf_insn_cbs *cbs,
 		else
 			verbose(cbs->private_data, "BUG_%02x\n", insn->code);
 	} else if (class == BPF_ST) {
-		if (BPF_MODE(insn->code) != BPF_MEM) {
+		if (BPF_MODE(insn->code) == BPF_MEM) {
+			verbose(cbs->private_data, "(%02x) *(%s *)(r%d %+d) = %d\n",
+				insn->code,
+				bpf_ldst_string[BPF_SIZE(insn->code) >> 3],
+				insn->dst_reg,
+				insn->off, insn->imm);
+		} else if (BPF_MODE(insn->code) == 0xc0 /* BPF_NOSPEC, no UAPI */) {
+			verbose(cbs->private_data, "(%02x) nospec\n", insn->code);
+		} else {
 			verbose(cbs->private_data, "BUG_st_%02x\n", insn->code);
-			return;
 		}
-		verbose(cbs->private_data, "(%02x) *(%s *)(r%d %+d) = %d\n",
-			insn->code,
-			bpf_ldst_string[BPF_SIZE(insn->code) >> 3],
-			insn->dst_reg,
-			insn->off, insn->imm);
 	} else if (class == BPF_LDX) {
 		if (BPF_MODE(insn->code) != BPF_MEM) {
 			verbose(cbs->private_data, "BUG_ldx_%02x\n", insn->code);

commit fc578c64398df4f93fd7a6143e218281cc7c4348
Author: Alexei Starovoitov <ast@kernel.org>
Date:   Mon Sep 13 18:35:33 2021 +0300

    selftests/bpf: fix tests due to const spill/fill
    
    commit fc559a70d57c6ee5443f7a750858503e94cdc941 upstream.
    
    fix tests that incorrectly assumed that the verifier
    cannot track constants through stack.
    
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Acked-by: Andrii Nakryiko <andriin@fb.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    [OP: backport to 4.19]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index 1ded69b9fd77..858e55143233 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -3888,7 +3888,8 @@ static struct bpf_test tests[] = {
 				    offsetof(struct __sk_buff, data)),
 			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
 				    offsetof(struct __sk_buff, data_end)),
-			BPF_MOV64_IMM(BPF_REG_0, 0xffffffff),
+			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
+			    offsetof(struct __sk_buff, mark)),
 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
 			BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xffff),
@@ -6560,9 +6561,9 @@ static struct bpf_test tests[] = {
 	{
 		"helper access to variable memory: stack, bitwise AND, zero included",
 		.insns = {
+			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
-			BPF_MOV64_IMM(BPF_REG_2, 16),
 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
 			BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64),
@@ -6577,9 +6578,9 @@ static struct bpf_test tests[] = {
 	{
 		"helper access to variable memory: stack, bitwise AND + JMP, wrong max",
 		.insns = {
+			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
-			BPF_MOV64_IMM(BPF_REG_2, 16),
 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
 			BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 65),
@@ -6653,9 +6654,9 @@ static struct bpf_test tests[] = {
 	{
 		"helper access to variable memory: stack, JMP, bounds + offset",
 		.insns = {
+			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
-			BPF_MOV64_IMM(BPF_REG_2, 16),
 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
 			BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 5),
@@ -6674,9 +6675,9 @@ static struct bpf_test tests[] = {
 	{
 		"helper access to variable memory: stack, JMP, wrong max",
 		.insns = {
+			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
-			BPF_MOV64_IMM(BPF_REG_2, 16),
 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
 			BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 65, 4),
@@ -6694,9 +6695,9 @@ static struct bpf_test tests[] = {
 	{
 		"helper access to variable memory: stack, JMP, no max check",
 		.insns = {
+			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
-			BPF_MOV64_IMM(BPF_REG_2, 16),
 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
 			BPF_MOV64_IMM(BPF_REG_4, 0),
@@ -6714,9 +6715,9 @@ static struct bpf_test tests[] = {
 	{
 		"helper access to variable memory: stack, JMP, no min check",
 		.insns = {
+			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
-			BPF_MOV64_IMM(BPF_REG_2, 16),
 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
 			BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 3),
@@ -6732,9 +6733,9 @@ static struct bpf_test tests[] = {
 	{
 		"helper access to variable memory: stack, JMP (signed), no min check",
 		.insns = {
+			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
-			BPF_MOV64_IMM(BPF_REG_2, 16),
 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128),
 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128),
 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 64, 3),
@@ -6776,6 +6777,7 @@ static struct bpf_test tests[] = {
 	{
 		"helper access to variable memory: map, JMP, wrong max",
 		.insns = {
+			BPF_LDX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 8),
 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
@@ -6783,7 +6785,7 @@ static struct bpf_test tests[] = {
 			BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
-			BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)),
+			BPF_MOV64_REG(BPF_REG_2, BPF_REG_6),
 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_2,
@@ -6795,7 +6797,7 @@ static struct bpf_test tests[] = {
 			BPF_MOV64_IMM(BPF_REG_0, 0),
 			BPF_EXIT_INSN(),
 		},
-		.fixup_map2 = { 3 },
+		.fixup_map2 = { 4 },
 		.errstr = "invalid access to map value, value_size=48 off=0 size=49",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
@@ -6830,6 +6832,7 @@ static struct bpf_test tests[] = {
 	{
 		"helper access to variable memory: map adjusted, JMP, wrong max",
 		.insns = {
+			BPF_LDX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 8),
 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
 			BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0),
@@ -6838,7 +6841,7 @@ static struct bpf_test tests[] = {
 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11),
 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 20),
-			BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)),
+			BPF_MOV64_REG(BPF_REG_2, BPF_REG_6),
 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
 			BPF_JMP_IMM(BPF_JSGT, BPF_REG_2,
@@ -6850,7 +6853,7 @@ static struct bpf_test tests[] = {
 			BPF_MOV64_IMM(BPF_REG_0, 0),
 			BPF_EXIT_INSN(),
 		},
-		.fixup_map2 = { 3 },
+		.fixup_map2 = { 4 },
 		.errstr = "R1 min value is outside of the array range",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_TRACEPOINT,
@@ -6872,8 +6875,8 @@ static struct bpf_test tests[] = {
 	{
 		"helper access to variable memory: size > 0 not allowed on NULL (ARG_PTR_TO_MEM_OR_NULL)",
 		.insns = {
+			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
 			BPF_MOV64_IMM(BPF_REG_1, 0),
-			BPF_MOV64_IMM(BPF_REG_2, 1),
 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
 			BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64),
@@ -7100,6 +7103,7 @@ static struct bpf_test tests[] = {
 	{
 		"helper access to variable memory: 8 bytes leak",
 		.insns = {
+			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 8),
 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64),
 			BPF_MOV64_IMM(BPF_REG_0, 0),
@@ -7110,7 +7114,6 @@ static struct bpf_test tests[] = {
 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24),
 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16),
 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
-			BPF_MOV64_IMM(BPF_REG_2, 1),
 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128),
 			BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128),
 			BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 63),

commit 1195c579b2b3f7dd97b8faddcaea1406abac570a
Author: Alexei Starovoitov <ast@kernel.org>
Date:   Mon Sep 13 18:35:32 2021 +0300

    bpf: track spill/fill of constants
    
    commit f7cf25b2026dc8441e0fa3a202c2aa8a56211e30 upstream.
    
    Compilers often spill induction variables into the stack,
    hence it is necessary for the verifier to track scalar values
    of the registers through stack slots.
    
    Also few bpf programs were incorrectly rejected in the past,
    since the verifier was not able to track such constants while
    they were used to compute offsets into packet headers.
    
    Tracking constants through the stack significantly decreases
    the chances of state pruning, since two different constants
    are considered to be different by state equivalency.
    End result that cilium tests suffer serious degradation in the number
    of states processed and corresponding verification time increase.
    
                         before  after
    bpf_lb-DLB_L3.o      1838    6441
    bpf_lb-DLB_L4.o      3218    5908
    bpf_lb-DUNKNOWN.o    1064    1064
    bpf_lxc-DDROP_ALL.o  26935   93790
    bpf_lxc-DUNKNOWN.o   34439   123886
    bpf_netdev.o         9721    31413
    bpf_overlay.o        6184    18561
    bpf_lxc_jit.o        39389   359445
    
    After further debugging turned out that cillium progs are
    getting hurt by clang due to the same constant tracking issue.
    Newer clang generates better code by spilling less to the stack.
    Instead it keeps more constants in the registers which
    hurts state pruning since the verifier already tracks constants
    in the registers:
                      old clang  new clang
                             (no spill/fill tracking introduced by this patch)
    bpf_lb-DLB_L3.o      1838    1923
    bpf_lb-DLB_L4.o      3218    3077
    bpf_lb-DUNKNOWN.o    1064    1062
    bpf_lxc-DDROP_ALL.o  26935   166729
    bpf_lxc-DUNKNOWN.o   34439   174607
    bpf_netdev.o         9721    8407
    bpf_overlay.o        6184    5420
    bpf_lcx_jit.o        39389   39389
    
    The final table is depressing:
                      old clang  old clang    new clang  new clang
                               const spill/fill        const spill/fill
    bpf_lb-DLB_L3.o      1838    6441          1923      8128
    bpf_lb-DLB_L4.o      3218    5908          3077      6707
    bpf_lb-DUNKNOWN.o    1064    1064          1062      1062
    bpf_lxc-DDROP_ALL.o  26935   93790         166729    380712
    bpf_lxc-DUNKNOWN.o   34439   123886        174607    440652
    bpf_netdev.o         9721    31413         8407      31904
    bpf_overlay.o        6184    18561         5420      23569
    bpf_lxc_jit.o        39389   359445        39389     359445
    
    Tracking constants in the registers hurts state pruning already.
    Adding tracking of constants through stack hurts pruning even more.
    The later patch address this general constant tracking issue
    with coarse/precise logic.
    
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Acked-by: Andrii Nakryiko <andriin@fb.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    [OP: - drop verbose_linfo() calls, as the function is not implemented in 4.19
         - adjust mark_reg_read() calls to match the prototype in 4.19]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 3168f331258e..ce051c0b9a54 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -963,6 +963,23 @@ static bool register_is_null(struct bpf_reg_state *reg)
 	return reg->type == SCALAR_VALUE && tnum_equals_const(reg->var_off, 0);
 }
 
+static bool register_is_const(struct bpf_reg_state *reg)
+{
+	return reg->type == SCALAR_VALUE && tnum_is_const(reg->var_off);
+}
+
+static void save_register_state(struct bpf_func_state *state,
+				int spi, struct bpf_reg_state *reg)
+{
+	int i;
+
+	state->stack[spi].spilled_ptr = *reg;
+	state->stack[spi].spilled_ptr.live |= REG_LIVE_WRITTEN;
+
+	for (i = 0; i < BPF_REG_SIZE; i++)
+		state->stack[spi].slot_type[i] = STACK_SPILL;
+}
+
 /* check_stack_read/write functions track spill/fill of registers,
  * stack boundary and alignment are checked in check_mem_access()
  */
@@ -972,7 +989,7 @@ static int check_stack_write(struct bpf_verifier_env *env,
 {
 	struct bpf_func_state *cur; /* state of the current function */
 	int i, slot = -off - 1, spi = slot / BPF_REG_SIZE, err;
-	enum bpf_reg_type type;
+	struct bpf_reg_state *reg = NULL;
 
 	err = realloc_func_state(state, round_up(slot + 1, BPF_REG_SIZE),
 				 true);
@@ -989,27 +1006,36 @@ static int check_stack_write(struct bpf_verifier_env *env,
 	}
 
 	cur = env->cur_state->frame[env->cur_state->curframe];
-	if (value_regno >= 0 &&
-	    is_spillable_regtype((type = cur->regs[value_regno].type))) {
+	if (value_regno >= 0)
+		reg = &cur->regs[value_regno];
 
+	if (reg && size == BPF_REG_SIZE && register_is_const(reg) &&
+	    !register_is_null(reg) && env->allow_ptr_leaks) {
+		save_register_state(state, spi, reg);
+	} else if (reg && is_spillable_regtype(reg->type)) {
 		/* register containing pointer is being spilled into stack */
 		if (size != BPF_REG_SIZE) {
 			verbose(env, "invalid size of register spill\n");
 			return -EACCES;
 		}
 
-		if (state != cur && type == PTR_TO_STACK) {
+		if (state != cur && reg->type == PTR_TO_STACK) {
 			verbose(env, "cannot spill pointers to stack into stack frame of the caller\n");
 			return -EINVAL;
 		}
 
-		/* save register state */
-		state->stack[spi].spilled_ptr = cur->regs[value_regno];
-		state->stack[spi].spilled_ptr.live |= REG_LIVE_WRITTEN;
+		if (!env->allow_ptr_leaks) {
+			bool sanitize = false;
 
-		for (i = 0; i < BPF_REG_SIZE; i++) {
-			if (state->stack[spi].slot_type[i] == STACK_MISC &&
-			    !env->allow_ptr_leaks) {
+			if (state->stack[spi].slot_type[0] == STACK_SPILL &&
+			    register_is_const(&state->stack[spi].spilled_ptr))
+				sanitize = true;
+			for (i = 0; i < BPF_REG_SIZE; i++)
+				if (state->stack[spi].slot_type[i] == STACK_MISC) {
+					sanitize = true;
+					break;
+				}
+			if (sanitize) {
 				int *poff = &env->insn_aux_data[insn_idx].sanitize_stack_off;
 				int soff = (-spi - 1) * BPF_REG_SIZE;
 
@@ -1032,8 +1058,8 @@ static int check_stack_write(struct bpf_verifier_env *env,
 				}
 				*poff = soff;
 			}
-			state->stack[spi].slot_type[i] = STACK_SPILL;
 		}
+		save_register_state(state, spi, reg);
 	} else {
 		u8 type = STACK_MISC;
 
@@ -1056,8 +1082,7 @@ static int check_stack_write(struct bpf_verifier_env *env,
 			state->stack[spi].spilled_ptr.live |= REG_LIVE_WRITTEN;
 
 		/* when we zero initialize stack slots mark them as such */
-		if (value_regno >= 0 &&
-		    register_is_null(&cur->regs[value_regno]))
+		if (reg && register_is_null(reg))
 			type = STACK_ZERO;
 
 		/* Mark slots affected by this stack write. */
@@ -1075,6 +1100,7 @@ static int check_stack_read(struct bpf_verifier_env *env,
 	struct bpf_verifier_state *vstate = env->cur_state;
 	struct bpf_func_state *state = vstate->frame[vstate->curframe];
 	int i, slot = -off - 1, spi = slot / BPF_REG_SIZE;
+	struct bpf_reg_state *reg;
 	u8 *stype;
 
 	if (reg_state->allocated_stack <= slot) {
@@ -1083,11 +1109,20 @@ static int check_stack_read(struct bpf_verifier_env *env,
 		return -EACCES;
 	}
 	stype = reg_state->stack[spi].slot_type;
+	reg = &reg_state->stack[spi].spilled_ptr;
 
 	if (stype[0] == STACK_SPILL) {
 		if (size != BPF_REG_SIZE) {
-			verbose(env, "invalid size of register spill\n");
-			return -EACCES;
+			if (reg->type != SCALAR_VALUE) {
+				verbose(env, "invalid size of register fill\n");
+				return -EACCES;
+			}
+			if (value_regno >= 0) {
+				mark_reg_unknown(env, state->regs, value_regno);
+				state->regs[value_regno].live |= REG_LIVE_WRITTEN;
+			}
+			mark_reg_read(env, reg, reg->parent);
+			return 0;
 		}
 		for (i = 1; i < BPF_REG_SIZE; i++) {
 			if (stype[(slot - i) % BPF_REG_SIZE] != STACK_SPILL) {
@@ -1098,16 +1133,14 @@ static int check_stack_read(struct bpf_verifier_env *env,
 
 		if (value_regno >= 0) {
 			/* restore register state from stack */
-			state->regs[value_regno] = reg_state->stack[spi].spilled_ptr;
+			state->regs[value_regno] = *reg;
 			/* mark reg as written since spilled pointer state likely
 			 * has its liveness marks cleared by is_state_visited()
 			 * which resets stack/reg liveness for state transitions
 			 */
 			state->regs[value_regno].live |= REG_LIVE_WRITTEN;
 		}
-		mark_reg_read(env, &reg_state->stack[spi].spilled_ptr,
-			      reg_state->stack[spi].spilled_ptr.parent);
-		return 0;
+		mark_reg_read(env, reg, reg->parent);
 	} else {
 		int zeros = 0;
 
@@ -1122,8 +1155,7 @@ static int check_stack_read(struct bpf_verifier_env *env,
 				off, i, size);
 			return -EACCES;
 		}
-		mark_reg_read(env, &reg_state->stack[spi].spilled_ptr,
-			      reg_state->stack[spi].spilled_ptr.parent);
+		mark_reg_read(env, reg, reg->parent);
 		if (value_regno >= 0) {
 			if (zeros == size) {
 				/* any size read into register is zero extended,
@@ -1136,8 +1168,8 @@ static int check_stack_read(struct bpf_verifier_env *env,
 			}
 			state->regs[value_regno].live |= REG_LIVE_WRITTEN;
 		}
-		return 0;
 	}
+	return 0;
 }
 
 static int check_stack_access(struct bpf_verifier_env *env,
@@ -1790,7 +1822,7 @@ static int check_stack_boundary(struct bpf_verifier_env *env, int regno,
 {
 	struct bpf_reg_state *reg = cur_regs(env) + regno;
 	struct bpf_func_state *state = func(env, reg);
-	int err, min_off, max_off, i, slot, spi;
+	int err, min_off, max_off, i, j, slot, spi;
 
 	if (reg->type != PTR_TO_STACK) {
 		/* Allow zero-byte read from NULL, regardless of pointer type */
@@ -1878,6 +1910,14 @@ static int check_stack_boundary(struct bpf_verifier_env *env, int regno,
 			*stype = STACK_MISC;
 			goto mark;
 		}
+		if (state->stack[spi].slot_type[0] == STACK_SPILL &&
+		    state->stack[spi].spilled_ptr.type == SCALAR_VALUE) {
+			__mark_reg_unknown(&state->stack[spi].spilled_ptr);
+			for (j = 0; j < BPF_REG_SIZE; j++)
+				state->stack[spi].slot_type[j] = STACK_MISC;
+			goto mark;
+		}
+
 err:
 		if (tnum_is_const(reg->var_off)) {
 			verbose(env, "invalid indirect read from stack off %d+%d size %d\n",

commit 2a28675d4b5cff2bfa0b3475c53edba1f5ec8401
Author: Andrey Ignatov <rdna@fb.com>
Date:   Mon Sep 13 18:35:31 2021 +0300

    selftests/bpf: Test variable offset stack access
    
    commit 8ff80e96e3ccea5ff0a890d4f18997e0344dbec2 upstream.
    
    Test different scenarios of indirect variable-offset stack access: out of
    bound access (>0), min_off below initialized part of the stack,
    max_off+size above initialized part of the stack, initialized stack.
    
    Example of output:
      ...
      #856/p indirect variable-offset stack access, out of bound OK
      #857/p indirect variable-offset stack access, max_off+size > max_initialized OK
      #858/p indirect variable-offset stack access, min_off < min_initialized OK
      #859/p indirect variable-offset stack access, ok OK
      ...
    
    Signed-off-by: Andrey Ignatov <rdna@fb.com>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    [OP: backport to 4.19]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index 6b9ed915c6b0..1ded69b9fd77 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -8495,7 +8495,7 @@ static struct bpf_test tests[] = {
 		.prog_type = BPF_PROG_TYPE_LWT_IN,
 	},
 	{
-		"indirect variable-offset stack access",
+		"indirect variable-offset stack access, out of bound",
 		.insns = {
 			/* Fill the top 8 bytes of the stack */
 			BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
@@ -8516,10 +8516,85 @@ static struct bpf_test tests[] = {
 			BPF_EXIT_INSN(),
 		},
 		.fixup_map1 = { 5 },
-		.errstr = "variable stack read R2",
+		.errstr = "invalid stack type R2 var_off",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_LWT_IN,
 	},
+	{
+		"indirect variable-offset stack access, max_off+size > max_initialized",
+		.insns = {
+		/* Fill only the second from top 8 bytes of the stack. */
+		BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, 0),
+		/* Get an unknown value. */
+		BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
+		/* Make it small and 4-byte aligned. */
+		BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4),
+		BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 16),
+		/* Add it to fp.  We now have either fp-12 or fp-16, but we don't know
+		 * which. fp-12 size 8 is partially uninitialized stack.
+		 */
+		BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10),
+		/* Dereference it indirectly. */
+		BPF_LD_MAP_FD(BPF_REG_1, 0),
+		BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
+		BPF_MOV64_IMM(BPF_REG_0, 0),
+		BPF_EXIT_INSN(),
+		},
+		.fixup_map1 = { 5 },
+		.errstr = "invalid indirect read from stack var_off",
+		.result = REJECT,
+		.prog_type = BPF_PROG_TYPE_LWT_IN,
+	},
+	{
+		"indirect variable-offset stack access, min_off < min_initialized",
+		.insns = {
+		/* Fill only the top 8 bytes of the stack. */
+		BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
+		/* Get an unknown value */
+		BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
+		/* Make it small and 4-byte aligned. */
+		BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4),
+		BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 16),
+		/* Add it to fp.  We now have either fp-12 or fp-16, but we don't know
+		 * which. fp-16 size 8 is partially uninitialized stack.
+		 */
+		BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10),
+		/* Dereference it indirectly. */
+		BPF_LD_MAP_FD(BPF_REG_1, 0),
+		BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
+		BPF_MOV64_IMM(BPF_REG_0, 0),
+		BPF_EXIT_INSN(),
+		},
+		.fixup_map1 = { 5 },
+		.errstr = "invalid indirect read from stack var_off",
+		.result = REJECT,
+		.prog_type = BPF_PROG_TYPE_LWT_IN,
+	},
+	{
+		"indirect variable-offset stack access, ok",
+		.insns = {
+		/* Fill the top 16 bytes of the stack. */
+		BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, 0),
+		BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
+		/* Get an unknown value. */
+		BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
+		/* Make it small and 4-byte aligned. */
+		BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4),
+		BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 16),
+		/* Add it to fp.  We now have either fp-12 or fp-16, we don't know
+		 * which, but either way it points to initialized stack.
+		 */
+		BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10),
+		/* Dereference it indirectly. */
+		BPF_LD_MAP_FD(BPF_REG_1, 0),
+		BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
+		BPF_MOV64_IMM(BPF_REG_0, 0),
+		BPF_EXIT_INSN(),
+		},
+		.fixup_map1 = { 6 },
+		.result = ACCEPT,
+		.prog_type = BPF_PROG_TYPE_LWT_IN,
+	},
 	{
 		"direct stack access with 32-bit wraparound. test1",
 		.insns = {

commit 7667818ef188832f69e2cf9cfed56e03a8f7436b
Author: Andrey Ignatov <rdna@fb.com>
Date:   Mon Sep 13 18:35:30 2021 +0300

    bpf: Sanity check max value for var_off stack access
    
    commit 107c26a70ca81bfc33657366ad69d02fdc9efc9d upstream.
    
    As discussed in [1] max value of variable offset has to be checked for
    overflow on stack access otherwise verifier would accept code like this:
    
      0: (b7) r2 = 6
      1: (b7) r3 = 28
      2: (7a) *(u64 *)(r10 -16) = 0
      3: (7a) *(u64 *)(r10 -8) = 0
      4: (79) r4 = *(u64 *)(r1 +168)
      5: (c5) if r4 s< 0x0 goto pc+4
       R1=ctx(id=0,off=0,imm=0) R2=inv6 R3=inv28
       R4=inv(id=0,umax_value=9223372036854775807,var_off=(0x0;
       0x7fffffffffffffff)) R10=fp0,call_-1 fp-8=mmmmmmmm fp-16=mmmmmmmm
      6: (17) r4 -= 16
      7: (0f) r4 += r10
      8: (b7) r5 = 8
      9: (85) call bpf_getsockopt#57
      10: (b7) r0 = 0
      11: (95) exit
    
    , where R4 obviosly has unbounded max value.
    
    Fix it by checking that reg->smax_value is inside (-BPF_MAX_VAR_OFF;
    BPF_MAX_VAR_OFF) range.
    
    reg->smax_value is used instead of reg->umax_value because stack
    pointers are calculated using negative offset from fp. This is opposite
    to e.g. map access where offset must be non-negative and where
    umax_value is used.
    
    Also dedicated verbose logs are added for both min and max bound check
    failures to have diagnostics consistent with variable offset handling in
    check_map_access().
    
    [1] https://marc.info/?l=linux-netdev&m=155433357510597&w=2
    
    Fixes: 2011fccfb61b ("bpf: Support variable offset stack access from helpers")
    Reported-by: Daniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: Andrey Ignatov <rdna@fb.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index d2f3bbff3175..3168f331258e 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -1833,16 +1833,28 @@ static int check_stack_boundary(struct bpf_verifier_env *env, int regno,
 		if (meta && meta->raw_mode)
 			meta = NULL;
 
+		if (reg->smax_value >= BPF_MAX_VAR_OFF ||
+		    reg->smax_value <= -BPF_MAX_VAR_OFF) {
+			verbose(env, "R%d unbounded indirect variable offset stack access\n",
+				regno);
+			return -EACCES;
+		}
 		min_off = reg->smin_value + reg->off;
-		max_off = reg->umax_value + reg->off;
+		max_off = reg->smax_value + reg->off;
 		err = __check_stack_boundary(env, regno, min_off, access_size,
 					     zero_size_allowed);
-		if (err)
+		if (err) {
+			verbose(env, "R%d min value is outside of stack bound\n",
+				regno);
 			return err;
+		}
 		err = __check_stack_boundary(env, regno, max_off, access_size,
 					     zero_size_allowed);
-		if (err)
+		if (err) {
+			verbose(env, "R%d max value is outside of stack bound\n",
+				regno);
 			return err;
+		}
 	}
 
 	if (meta && meta->raw_mode) {

commit 14cf676ba6a0fb5e495baf843d750070f627d7e8
Author: Andrey Ignatov <rdna@fb.com>
Date:   Mon Sep 13 18:35:29 2021 +0300

    bpf: Reject indirect var_off stack access in unpriv mode
    
    commit 088ec26d9c2da9d879ab73e3f4117f9df6c566ee upstream.
    
    Proper support of indirect stack access with variable offset in
    unprivileged mode (!root) requires corresponding support in Spectre
    masking for stack ALU in retrieve_ptr_limit().
    
    There are no use-case for variable offset in unprivileged mode though so
    make verifier reject such accesses for simplicity.
    
    Pointer arithmetics is one (and only?) way to cause variable offset and
    it's already rejected in unpriv mode so that verifier won't even get to
    helper function whose argument contains variable offset, e.g.:
    
      0: (7a) *(u64 *)(r10 -16) = 0
      1: (7a) *(u64 *)(r10 -8) = 0
      2: (61) r2 = *(u32 *)(r1 +0)
      3: (57) r2 &= 4
      4: (17) r2 -= 16
      5: (0f) r2 += r10
      variable stack access var_off=(0xfffffffffffffff0; 0x4) off=-16 size=1R2
      stack pointer arithmetic goes out of range, prohibited for !root
    
    Still it looks like a good idea to reject variable offset indirect stack
    access for unprivileged mode in check_stack_boundary() explicitly.
    
    Fixes: 2011fccfb61b ("bpf: Support variable offset stack access from helpers")
    Reported-by: Daniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: Andrey Ignatov <rdna@fb.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    [OP: drop comment in retrieve_ptr_limit()]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index a5360b603e4c..d2f3bbff3175 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -1811,6 +1811,19 @@ static int check_stack_boundary(struct bpf_verifier_env *env, int regno,
 		if (err)
 			return err;
 	} else {
+		/* Variable offset is prohibited for unprivileged mode for
+		 * simplicity since it requires corresponding support in
+		 * Spectre masking for stack ALU.
+		 * See also retrieve_ptr_limit().
+		 */
+		if (!env->allow_ptr_leaks) {
+			char tn_buf[48];
+
+			tnum_strn(tn_buf, sizeof(tn_buf), reg->var_off);
+			verbose(env, "R%d indirect variable offset stack access prohibited for !root, var_off=%s\n",
+				regno, tn_buf);
+			return -EACCES;
+		}
 		/* Only initialized buffer on stack is allowed to be accessed
 		 * with variable offset. With uninitialized buffer it's hard to
 		 * guarantee that whole memory is marked as initialized on

commit 148339cb18ed38a4b1de2269d1a4227fd51376ef
Author: Andrey Ignatov <rdna@fb.com>
Date:   Mon Sep 13 18:35:28 2021 +0300

    bpf: Reject indirect var_off stack access in raw mode
    
    commit f2bcd05ec7b839ff826d2008506ad2d2dff46a59 upstream.
    
    It's hard to guarantee that whole memory is marked as initialized on
    helper return if uninitialized stack is accessed with variable offset
    since specific bounds are unknown to verifier. This may cause
    uninitialized stack leaking.
    
    Reject such an access in check_stack_boundary to prevent possible
    leaking.
    
    There are no known use-cases for indirect uninitialized stack access
    with variable offset so it shouldn't break anything.
    
    Fixes: 2011fccfb61b ("bpf: Support variable offset stack access from helpers")
    Reported-by: Daniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: Andrey Ignatov <rdna@fb.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 47395fa40219..a5360b603e4c 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -1811,6 +1811,15 @@ static int check_stack_boundary(struct bpf_verifier_env *env, int regno,
 		if (err)
 			return err;
 	} else {
+		/* Only initialized buffer on stack is allowed to be accessed
+		 * with variable offset. With uninitialized buffer it's hard to
+		 * guarantee that whole memory is marked as initialized on
+		 * helper return since specific bounds are unknown what may
+		 * cause uninitialized stack leaking.
+		 */
+		if (meta && meta->raw_mode)
+			meta = NULL;
+
 		min_off = reg->smin_value + reg->off;
 		max_off = reg->umax_value + reg->off;
 		err = __check_stack_boundary(env, regno, min_off, access_size,

commit caee4103f09e3dcce2ec0d0faf6ff245a6cffbad
Author: Andrey Ignatov <rdna@fb.com>
Date:   Mon Sep 13 18:35:27 2021 +0300

    bpf: Support variable offset stack access from helpers
    
    commit 2011fccfb61bbd1d7c8864b2b3ed7012342e9ba3 upstream.
    
    Currently there is a difference in how verifier checks memory access for
    helper arguments for PTR_TO_MAP_VALUE and PTR_TO_STACK with regard to
    variable part of offset.
    
    check_map_access, that is used for PTR_TO_MAP_VALUE, can handle variable
    offsets just fine, so that BPF program can call a helper like this:
    
      some_helper(map_value_ptr + off, size);
    
    , where offset is unknown at load time, but is checked by program to be
    in a safe rage (off >= 0 && off + size < map_value_size).
    
    But it's not the case for check_stack_boundary, that is used for
    PTR_TO_STACK, and same code with pointer to stack is rejected by
    verifier:
    
      some_helper(stack_value_ptr + off, size);
    
    For example:
      0: (7a) *(u64 *)(r10 -16) = 0
      1: (7a) *(u64 *)(r10 -8) = 0
      2: (61) r2 = *(u32 *)(r1 +0)
      3: (57) r2 &= 4
      4: (17) r2 -= 16
      5: (0f) r2 += r10
      6: (18) r1 = 0xffff888111343a80
      8: (85) call bpf_map_lookup_elem#1
      invalid variable stack read R2 var_off=(0xfffffffffffffff0; 0x4)
    
    Add support for variable offset access to check_stack_boundary so that
    if offset is checked by program to be in a safe range it's accepted by
    verifier.
    
    Signed-off-by: Andrey Ignatov <rdna@fb.com>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    [OP: replace reg_state(env, regno) helper with "cur_regs(env) + regno"]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index b6f008dcb30c..47395fa40219 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -1755,6 +1755,29 @@ static int check_xadd(struct bpf_verifier_env *env, int insn_idx, struct bpf_ins
 				BPF_SIZE(insn->code), BPF_WRITE, -1, true);
 }
 
+static int __check_stack_boundary(struct bpf_verifier_env *env, u32 regno,
+				  int off, int access_size,
+				  bool zero_size_allowed)
+{
+	struct bpf_reg_state *reg = cur_regs(env) + regno;
+
+	if (off >= 0 || off < -MAX_BPF_STACK || off + access_size > 0 ||
+	    access_size < 0 || (access_size == 0 && !zero_size_allowed)) {
+		if (tnum_is_const(reg->var_off)) {
+			verbose(env, "invalid stack type R%d off=%d access_size=%d\n",
+				regno, off, access_size);
+		} else {
+			char tn_buf[48];
+
+			tnum_strn(tn_buf, sizeof(tn_buf), reg->var_off);
+			verbose(env, "invalid stack type R%d var_off=%s access_size=%d\n",
+				regno, tn_buf, access_size);
+		}
+		return -EACCES;
+	}
+	return 0;
+}
+
 /* when register 'regno' is passed into function that will read 'access_size'
  * bytes from that pointer, make sure that it's within stack boundary
  * and all elements of stack are initialized.
@@ -1767,7 +1790,7 @@ static int check_stack_boundary(struct bpf_verifier_env *env, int regno,
 {
 	struct bpf_reg_state *reg = cur_regs(env) + regno;
 	struct bpf_func_state *state = func(env, reg);
-	int off, i, slot, spi;
+	int err, min_off, max_off, i, slot, spi;
 
 	if (reg->type != PTR_TO_STACK) {
 		/* Allow zero-byte read from NULL, regardless of pointer type */
@@ -1781,21 +1804,23 @@ static int check_stack_boundary(struct bpf_verifier_env *env, int regno,
 		return -EACCES;
 	}
 
-	/* Only allow fixed-offset stack reads */
-	if (!tnum_is_const(reg->var_off)) {
-		char tn_buf[48];
-
-		tnum_strn(tn_buf, sizeof(tn_buf), reg->var_off);
-		verbose(env, "invalid variable stack read R%d var_off=%s\n",
-			regno, tn_buf);
-		return -EACCES;
-	}
-	off = reg->off + reg->var_off.value;
-	if (off >= 0 || off < -MAX_BPF_STACK || off + access_size > 0 ||
-	    access_size < 0 || (access_size == 0 && !zero_size_allowed)) {
-		verbose(env, "invalid stack type R%d off=%d access_size=%d\n",
-			regno, off, access_size);
-		return -EACCES;
+	if (tnum_is_const(reg->var_off)) {
+		min_off = max_off = reg->var_off.value + reg->off;
+		err = __check_stack_boundary(env, regno, min_off, access_size,
+					     zero_size_allowed);
+		if (err)
+			return err;
+	} else {
+		min_off = reg->smin_value + reg->off;
+		max_off = reg->umax_value + reg->off;
+		err = __check_stack_boundary(env, regno, min_off, access_size,
+					     zero_size_allowed);
+		if (err)
+			return err;
+		err = __check_stack_boundary(env, regno, max_off, access_size,
+					     zero_size_allowed);
+		if (err)
+			return err;
 	}
 
 	if (meta && meta->raw_mode) {
@@ -1804,10 +1829,10 @@ static int check_stack_boundary(struct bpf_verifier_env *env, int regno,
 		return 0;
 	}
 
-	for (i = 0; i < access_size; i++) {
+	for (i = min_off; i < max_off + access_size; i++) {
 		u8 *stype;
 
-		slot = -(off + i) - 1;
+		slot = -i - 1;
 		spi = slot / BPF_REG_SIZE;
 		if (state->allocated_stack <= slot)
 			goto err;
@@ -1820,8 +1845,16 @@ static int check_stack_boundary(struct bpf_verifier_env *env, int regno,
 			goto mark;
 		}
 err:
-		verbose(env, "invalid indirect read from stack off %d+%d size %d\n",
-			off, i, access_size);
+		if (tnum_is_const(reg->var_off)) {
+			verbose(env, "invalid indirect read from stack off %d+%d size %d\n",
+				min_off, i - min_off, access_size);
+		} else {
+			char tn_buf[48];
+
+			tnum_strn(tn_buf, sizeof(tn_buf), reg->var_off);
+			verbose(env, "invalid indirect read from stack var_off %s+%d size %d\n",
+				tn_buf, i - min_off, access_size);
+		}
 		return -EACCES;
 mark:
 		/* reading any byte out of 8-byte 'spill_slot' will cause
@@ -1830,7 +1863,7 @@ static int check_stack_boundary(struct bpf_verifier_env *env, int regno,
 		mark_reg_read(env, &state->stack[spi].spilled_ptr,
 			      state->stack[spi].spilled_ptr.parent);
 	}
-	return update_stack_depth(env, state, off);
+	return update_stack_depth(env, state, min_off);
 }
 
 static int check_helper_mem_access(struct bpf_verifier_env *env, int regno,

commit 79aba0ac3df1a604e843780b17c37646e175b4f8
Author: Jiong Wang <jiong.wang@netronome.com>
Date:   Mon Sep 13 18:35:26 2021 +0300

    bpf: correct slot_type marking logic to allow more stack slot sharing
    
    commit 0bae2d4d62d523f06ff1a8e88ce38b45400acd28 upstream.
    
    Verifier is supposed to support sharing stack slot allocated to ptr with
    SCALAR_VALUE for privileged program. However this doesn't happen for some
    cases.
    
    The reason is verifier is not clearing slot_type STACK_SPILL for all bytes,
    it only clears part of them, while verifier is using:
    
      slot_type[0] == STACK_SPILL
    
    as a convention to check one slot is ptr type.
    
    So, the consequence of partial clearing slot_type is verifier could treat a
    partially overridden ptr slot, which should now be a SCALAR_VALUE slot,
    still as ptr slot, and rejects some valid programs.
    
    Before this patch, test_xdp_noinline.o under bpf selftests, bpf_lxc.o and
    bpf_netdev.o under Cilium bpf repo, when built with -mattr=+alu32 are
    rejected due to this issue. After this patch, they all accepted.
    
    There is no processed insn number change before and after this patch on
    Cilium bpf programs.
    
    Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
    Signed-off-by: Jiong Wang <jiong.wang@netronome.com>
    Reviewed-by: Daniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    [OP: adjusted context for 4.19]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index a5259ff30073..b6f008dcb30c 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -1039,6 +1039,10 @@ static int check_stack_write(struct bpf_verifier_env *env,
 
 		/* regular write of data into stack destroys any spilled ptr */
 		state->stack[spi].spilled_ptr.type = NOT_INIT;
+		/* Mark slots as STACK_MISC if they belonged to spilled ptr. */
+		if (state->stack[spi].slot_type[0] == STACK_SPILL)
+			for (i = 0; i < BPF_REG_SIZE; i++)
+				state->stack[spi].slot_type[i] = STACK_MISC;
 
 		/* only mark the slot as written if all 8 bytes were written
 		 * otherwise read propagation may incorrectly stop too soon
@@ -1056,6 +1060,7 @@ static int check_stack_write(struct bpf_verifier_env *env,
 		    register_is_null(&cur->regs[value_regno]))
 			type = STACK_ZERO;
 
+		/* Mark slots affected by this stack write. */
 		for (i = 0; i < size; i++)
 			state->stack[spi].slot_type[(slot - i) % BPF_REG_SIZE] =
 				type;
diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index c7d17781dbfe..6b9ed915c6b0 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -956,15 +956,45 @@ static struct bpf_test tests[] = {
 			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
 			/* mess up with R1 pointer on stack */
 			BPF_ST_MEM(BPF_B, BPF_REG_10, -7, 0x23),
-			/* fill back into R0 should fail */
+			/* fill back into R0 is fine for priv.
+			 * R0 now becomes SCALAR_VALUE.
+			 */
 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
+			/* Load from R0 should fail. */
+			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 8),
 			BPF_EXIT_INSN(),
 		},
 		.errstr_unpriv = "attempt to corrupt spilled",
-		.errstr = "corrupted spill",
+		.errstr = "R0 invalid mem access 'inv",
 		.result = REJECT,
 		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
+	{
+		"check corrupted spill/fill, LSB",
+		.insns = {
+			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
+			BPF_ST_MEM(BPF_H, BPF_REG_10, -8, 0xcafe),
+			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
+			BPF_EXIT_INSN(),
+		},
+		.errstr_unpriv = "attempt to corrupt spilled",
+		.result_unpriv = REJECT,
+		.result = ACCEPT,
+		.retval = POINTER_VALUE,
+	},
+	{
+		"check corrupted spill/fill, MSB",
+		.insns = {
+			BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8),
+			BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0x12345678),
+			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
+			BPF_EXIT_INSN(),
+		},
+		.errstr_unpriv = "attempt to corrupt spilled",
+		.result_unpriv = REJECT,
+		.result = ACCEPT,
+		.retval = POINTER_VALUE,
+	},
 	{
 		"invalid src register in STX",
 		.insns = {

commit 228e64bdbb1c5004a015bac942dd649f8ccab8c9
Author: Edward Cree <ecree@solarflare.com>
Date:   Mon Sep 13 18:35:25 2021 +0300

    bpf/verifier: per-register parent pointers
    
    commit 679c782de14bd48c19dd74cd1af20a2bc05dd936 upstream.
    
    By giving each register its own liveness chain, we elide the skip_callee()
     logic.  Instead, each register's parent is the state it inherits from;
     both check_func_call() and prepare_func_exit() automatically connect
     reg states to the correct chain since when they copy the reg state across
     (r1-r5 into the callee as args, and r0 out as the return value) they also
     copy the parent pointer.
    
    Signed-off-by: Edward Cree <ecree@solarflare.com>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    [OP: adjusted context for 4.19]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h
index 1c8517320ea6..daab0960c054 100644
--- a/include/linux/bpf_verifier.h
+++ b/include/linux/bpf_verifier.h
@@ -41,6 +41,7 @@ enum bpf_reg_liveness {
 };
 
 struct bpf_reg_state {
+	/* Ordering of fields matters.  See states_equal() */
 	enum bpf_reg_type type;
 	union {
 		/* valid when type == PTR_TO_PACKET */
@@ -62,7 +63,6 @@ struct bpf_reg_state {
 	 * came from, when one is tested for != NULL.
 	 */
 	u32 id;
-	/* Ordering of fields matters.  See states_equal() */
 	/* For scalar types (SCALAR_VALUE), this represents our knowledge of
 	 * the actual value.
 	 * For pointer types, this represents the variable part of the offset
@@ -79,15 +79,15 @@ struct bpf_reg_state {
 	s64 smax_value; /* maximum possible (s64)value */
 	u64 umin_value; /* minimum possible (u64)value */
 	u64 umax_value; /* maximum possible (u64)value */
+	/* parentage chain for liveness checking */
+	struct bpf_reg_state *parent;
 	/* Inside the callee two registers can be both PTR_TO_STACK like
 	 * R1=fp-8 and R2=fp-8, but one of them points to this function stack
 	 * while another to the caller's stack. To differentiate them 'frameno'
 	 * is used which is an index in bpf_verifier_state->frame[] array
 	 * pointing to bpf_func_state.
-	 * This field must be second to last, for states_equal() reasons.
 	 */
 	u32 frameno;
-	/* This field must be last, for states_equal() reasons. */
 	enum bpf_reg_liveness live;
 };
 
@@ -110,7 +110,6 @@ struct bpf_stack_state {
  */
 struct bpf_func_state {
 	struct bpf_reg_state regs[MAX_BPF_REG];
-	struct bpf_verifier_state *parent;
 	/* index of call instruction that called into this func */
 	int callsite;
 	/* stack frame number of this function state from pov of
@@ -132,7 +131,6 @@ struct bpf_func_state {
 struct bpf_verifier_state {
 	/* call stack tracking */
 	struct bpf_func_state *frame[MAX_CALL_FRAMES];
-	struct bpf_verifier_state *parent;
 	u32 curframe;
 	bool speculative;
 };
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index abdc9eca463c..a5259ff30073 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -380,9 +380,9 @@ static int copy_stack_state(struct bpf_func_state *dst,
 /* do_check() starts with zero-sized stack in struct bpf_verifier_state to
  * make it consume minimal amount of memory. check_stack_write() access from
  * the program calls into realloc_func_state() to grow the stack size.
- * Note there is a non-zero 'parent' pointer inside bpf_verifier_state
- * which this function copies over. It points to previous bpf_verifier_state
- * which is never reallocated
+ * Note there is a non-zero parent pointer inside each reg of bpf_verifier_state
+ * which this function copies over. It points to corresponding reg in previous
+ * bpf_verifier_state which is never reallocated
  */
 static int realloc_func_state(struct bpf_func_state *state, int size,
 			      bool copy_old)
@@ -467,7 +467,6 @@ static int copy_verifier_state(struct bpf_verifier_state *dst_state,
 	}
 	dst_state->speculative = src->speculative;
 	dst_state->curframe = src->curframe;
-	dst_state->parent = src->parent;
 	for (i = 0; i <= src->curframe; i++) {
 		dst = dst_state->frame[i];
 		if (!dst) {
@@ -739,6 +738,7 @@ static void init_reg_state(struct bpf_verifier_env *env,
 	for (i = 0; i < MAX_BPF_REG; i++) {
 		mark_reg_not_init(env, regs, i);
 		regs[i].live = REG_LIVE_NONE;
+		regs[i].parent = NULL;
 	}
 
 	/* frame pointer */
@@ -883,74 +883,21 @@ static int check_subprogs(struct bpf_verifier_env *env)
 	return 0;
 }
 
-static
-struct bpf_verifier_state *skip_callee(struct bpf_verifier_env *env,
-				       const struct bpf_verifier_state *state,
-				       struct bpf_verifier_state *parent,
-				       u32 regno)
-{
-	struct bpf_verifier_state *tmp = NULL;
-
-	/* 'parent' could be a state of caller and
-	 * 'state' could be a state of callee. In such case
-	 * parent->curframe < state->curframe
-	 * and it's ok for r1 - r5 registers
-	 *
-	 * 'parent' could be a callee's state after it bpf_exit-ed.
-	 * In such case parent->curframe > state->curframe
-	 * and it's ok for r0 only
-	 */
-	if (parent->curframe == state->curframe ||
-	    (parent->curframe < state->curframe &&
-	     regno >= BPF_REG_1 && regno <= BPF_REG_5) ||
-	    (parent->curframe > state->curframe &&
-	       regno == BPF_REG_0))
-		return parent;
-
-	if (parent->curframe > state->curframe &&
-	    regno >= BPF_REG_6) {
-		/* for callee saved regs we have to skip the whole chain
-		 * of states that belong to callee and mark as LIVE_READ
-		 * the registers before the call
-		 */
-		tmp = parent;
-		while (tmp && tmp->curframe != state->curframe) {
-			tmp = tmp->parent;
-		}
-		if (!tmp)
-			goto bug;
-		parent = tmp;
-	} else {
-		goto bug;
-	}
-	return parent;
-bug:
-	verbose(env, "verifier bug regno %d tmp %p\n", regno, tmp);
-	verbose(env, "regno %d parent frame %d current frame %d\n",
-		regno, parent->curframe, state->curframe);
-	return NULL;
-}
-
+/* Parentage chain of this register (or stack slot) should take care of all
+ * issues like callee-saved registers, stack slot allocation time, etc.
+ */
 static int mark_reg_read(struct bpf_verifier_env *env,
-			 const struct bpf_verifier_state *state,
-			 struct bpf_verifier_state *parent,
-			 u32 regno)
+			 const struct bpf_reg_state *state,
+			 struct bpf_reg_state *parent)
 {
 	bool writes = parent == state->parent; /* Observe write marks */
 
-	if (regno == BPF_REG_FP)
-		/* We don't need to worry about FP liveness because it's read-only */
-		return 0;
-
 	while (parent) {
 		/* if read wasn't screened by an earlier write ... */
-		if (writes && state->frame[state->curframe]->regs[regno].live & REG_LIVE_WRITTEN)
+		if (writes && state->live & REG_LIVE_WRITTEN)
 			break;
-		parent = skip_callee(env, state, parent, regno);
-		if (!parent)
-			return -EFAULT;
 		/* ... then we depend on parent's value */
-		parent->frame[parent->curframe]->regs[regno].live |= REG_LIVE_READ;
+		parent->live |= REG_LIVE_READ;
 		state = parent;
 		parent = state->parent;
 		writes = true;
@@ -976,7 +923,10 @@ static int check_reg_arg(struct bpf_verifier_env *env, u32 regno,
 			verbose(env, "R%d !read_ok\n", regno);
 			return -EACCES;
 		}
-		return mark_reg_read(env, vstate, vstate->parent, regno);
+		/* We don't need to worry about FP liveness because it's read-only */
+		if (regno != BPF_REG_FP)
+			return mark_reg_read(env, &regs[regno],
+					     regs[regno].parent);
 	} else {
 		/* check whether register used as dest operand can be written to */
 		if (regno == BPF_REG_FP) {
@@ -1087,8 +1037,8 @@ static int check_stack_write(struct bpf_verifier_env *env,
 	} else {
 		u8 type = STACK_MISC;
 
-		/* regular write of data into stack */
-		state->stack[spi].spilled_ptr = (struct bpf_reg_state) {};
+		/* regular write of data into stack destroys any spilled ptr */
+		state->stack[spi].spilled_ptr.type = NOT_INIT;
 
 		/* only mark the slot as written if all 8 bytes were written
 		 * otherwise read propagation may incorrectly stop too soon
@@ -1113,61 +1063,6 @@ static int check_stack_write(struct bpf_verifier_env *env,
 	return 0;
 }
 
-/* registers of every function are unique and mark_reg_read() propagates
- * the liveness in the following cases:
- * - from callee into caller for R1 - R5 that were used as arguments
- * - from caller into callee for R0 that used as result of the call
- * - from caller to the same caller skipping states of the callee for R6 - R9,
- *   since R6 - R9 are callee saved by implicit function prologue and
- *   caller's R6 != callee's R6, so when we propagate liveness up to
- *   parent states we need to skip callee states for R6 - R9.
- *
- * stack slot marking is different, since stacks of caller and callee are
- * accessible in both (since caller can pass a pointer to caller's stack to
- * callee which can pass it to another function), hence mark_stack_slot_read()
- * has to propagate the stack liveness to all parent states at given frame number.
- * Consider code:
- * f1() {
- *   ptr = fp - 8;
- *   *ptr = ctx;
- *   call f2 {
- *      .. = *ptr;
- *   }
- *   .. = *ptr;
- * }
- * First *ptr is reading from f1's stack and mark_stack_slot_read() has
- * to mark liveness at the f1's frame and not f2's frame.
- * Second *ptr is also reading from f1's stack and mark_stack_slot_read() has
- * to propagate liveness to f2 states at f1's frame level and further into
- * f1 states at f1's frame level until write into that stack slot
- */
-static void mark_stack_slot_read(struct bpf_verifier_env *env,
-				 const struct bpf_verifier_state *state,
-				 struct bpf_verifier_state *parent,
-				 int slot, int frameno)
-{
-	bool writes = parent == state->parent; /* Observe write marks */
-
-	while (parent) {
-		if (parent->frame[frameno]->allocated_stack <= slot * BPF_REG_SIZE)
-			/* since LIVE_WRITTEN mark is only done for full 8-byte
-			 * write the read marks are conservative and parent
-			 * state may not even have the stack allocated. In such case
-			 * end the propagation, since the loop reached beginning
-			 * of the function
-			 */
-			break;
-		/* if read wasn't screened by an earlier write ... */
-		if (writes && state->frame[frameno]->stack[slot].spilled_ptr.live & REG_LIVE_WRITTEN)
-			break;
-		/* ... then we depend on parent's value */
-		parent->frame[frameno]->stack[slot].spilled_ptr.live |= REG_LIVE_READ;
-		state = parent;
-		parent = state->parent;
-		writes = true;
-	}
-}
-
 static int check_stack_read(struct bpf_verifier_env *env,
 			    struct bpf_func_state *reg_state /* func where register points to */,
 			    int off, int size, int value_regno)
@@ -1205,8 +1100,8 @@ static int check_stack_read(struct bpf_verifier_env *env,
 			 */
 			state->regs[value_regno].live |= REG_LIVE_WRITTEN;
 		}
-		mark_stack_slot_read(env, vstate, vstate->parent, spi,
-				     reg_state->frameno);
+		mark_reg_read(env, &reg_state->stack[spi].spilled_ptr,
+			      reg_state->stack[spi].spilled_ptr.parent);
 		return 0;
 	} else {
 		int zeros = 0;
@@ -1222,8 +1117,8 @@ static int check_stack_read(struct bpf_verifier_env *env,
 				off, i, size);
 			return -EACCES;
 		}
-		mark_stack_slot_read(env, vstate, vstate->parent, spi,
-				     reg_state->frameno);
+		mark_reg_read(env, &reg_state->stack[spi].spilled_ptr,
+			      reg_state->stack[spi].spilled_ptr.parent);
 		if (value_regno >= 0) {
 			if (zeros == size) {
 				/* any size read into register is zero extended,
@@ -1927,8 +1822,8 @@ static int check_stack_boundary(struct bpf_verifier_env *env, int regno,
 		/* reading any byte out of 8-byte 'spill_slot' will cause
 		 * the whole slot to be marked as 'read'
 		 */
-		mark_stack_slot_read(env, env->cur_state, env->cur_state->parent,
-				     spi, state->frameno);
+		mark_reg_read(env, &state->stack[spi].spilled_ptr,
+			      state->stack[spi].spilled_ptr.parent);
 	}
 	return update_stack_depth(env, state, off);
 }
@@ -2384,11 +2279,13 @@ static int check_func_call(struct bpf_verifier_env *env, struct bpf_insn *insn,
 			state->curframe + 1 /* frameno within this callchain */,
 			subprog /* subprog number within this prog */);
 
-	/* copy r1 - r5 args that callee can access */
+	/* copy r1 - r5 args that callee can access.  The copy includes parent
+	 * pointers, which connects us up to the liveness chain
+	 */
 	for (i = BPF_REG_1; i <= BPF_REG_5; i++)
 		callee->regs[i] = caller->regs[i];
 
-	/* after the call regsiters r0 - r5 were scratched */
+	/* after the call registers r0 - r5 were scratched */
 	for (i = 0; i < CALLER_SAVED_REGS; i++) {
 		mark_reg_not_init(env, caller->regs, caller_saved[i]);
 		check_reg_arg(env, caller_saved[i], DST_OP_NO_MARK);
@@ -4844,7 +4741,7 @@ static bool regsafe(struct bpf_reg_state *rold, struct bpf_reg_state *rcur,
 		/* explored state didn't use this */
 		return true;
 
-	equal = memcmp(rold, rcur, offsetof(struct bpf_reg_state, frameno)) == 0;
+	equal = memcmp(rold, rcur, offsetof(struct bpf_reg_state, parent)) == 0;
 
 	if (rold->type == PTR_TO_STACK)
 		/* two stack pointers are equal only if they're pointing to
@@ -5083,7 +4980,7 @@ static bool states_equal(struct bpf_verifier_env *env,
  * equivalent state (jump target or such) we didn't arrive by the straight-line
  * code, so read marks in the state must propagate to the parent regardless
  * of the state's write marks. That's what 'parent == state->parent' comparison
- * in mark_reg_read() and mark_stack_slot_read() is for.
+ * in mark_reg_read() is for.
  */
 static int propagate_liveness(struct bpf_verifier_env *env,
 			      const struct bpf_verifier_state *vstate,
@@ -5104,7 +5001,8 @@ static int propagate_liveness(struct bpf_verifier_env *env,
 		if (vparent->frame[vparent->curframe]->regs[i].live & REG_LIVE_READ)
 			continue;
 		if (vstate->frame[vstate->curframe]->regs[i].live & REG_LIVE_READ) {
-			err = mark_reg_read(env, vstate, vparent, i);
+			err = mark_reg_read(env, &vstate->frame[vstate->curframe]->regs[i],
+					    &vparent->frame[vstate->curframe]->regs[i]);
 			if (err)
 				return err;
 		}
@@ -5119,7 +5017,8 @@ static int propagate_liveness(struct bpf_verifier_env *env,
 			if (parent->stack[i].spilled_ptr.live & REG_LIVE_READ)
 				continue;
 			if (state->stack[i].spilled_ptr.live & REG_LIVE_READ)
-				mark_stack_slot_read(env, vstate, vparent, i, frame);
+				mark_reg_read(env, &state->stack[i].spilled_ptr,
+					      &parent->stack[i].spilled_ptr);
 		}
 	}
 	return err;
@@ -5129,7 +5028,7 @@ static int is_state_visited(struct bpf_verifier_env *env, int insn_idx)
 {
 	struct bpf_verifier_state_list *new_sl;
 	struct bpf_verifier_state_list *sl;
-	struct bpf_verifier_state *cur = env->cur_state;
+	struct bpf_verifier_state *cur = env->cur_state, *new;
 	int i, j, err, states_cnt = 0;
 
 	sl = env->explored_states[insn_idx];
@@ -5175,16 +5074,18 @@ static int is_state_visited(struct bpf_verifier_env *env, int insn_idx)
 		return -ENOMEM;
 
 	/* add new state to the head of linked list */
-	err = copy_verifier_state(&new_sl->state, cur);
+	new = &new_sl->state;
+	err = copy_verifier_state(new, cur);
 	if (err) {
-		free_verifier_state(&new_sl->state, false);
+		free_verifier_state(new, false);
 		kfree(new_sl);
 		return err;
 	}
 	new_sl->next = env->explored_states[insn_idx];
 	env->explored_states[insn_idx] = new_sl;
 	/* connect new state to parentage chain */
-	cur->parent = &new_sl->state;
+	for (i = 0; i < BPF_REG_FP; i++)
+		cur_regs(env)[i].parent = &new->frame[new->curframe]->regs[i];
 	/* clear write marks in current state: the writes we did are not writes
 	 * our child did, so they don't screen off its reads from us.
 	 * (There are no read marks in current state, because reads always mark
@@ -5197,9 +5098,13 @@ static int is_state_visited(struct bpf_verifier_env *env, int insn_idx)
 	/* all stack frames are accessible from callee, clear them all */
 	for (j = 0; j <= cur->curframe; j++) {
 		struct bpf_func_state *frame = cur->frame[j];
+		struct bpf_func_state *newframe = new->frame[j];
 
-		for (i = 0; i < frame->allocated_stack / BPF_REG_SIZE; i++)
+		for (i = 0; i < frame->allocated_stack / BPF_REG_SIZE; i++) {
 			frame->stack[i].spilled_ptr.live = REG_LIVE_NONE;
+			frame->stack[i].spilled_ptr.parent =
+						&newframe->stack[i].spilled_ptr;
+		}
 	}
 	return 0;
 }

commit 46a43575b8c36a32f6d951a77403e0c29d424c5e
Author: Harshvardhan Jha <harshvardhan.jha@oracle.com>
Date:   Tue Jul 27 05:37:10 2021 +0530

    9p/xen: Fix end of loop tests for list_for_each_entry
    
    commit 732b33d0dbf17e9483f0b50385bf606f724f50a2 upstream.
    
    This patch addresses the following problems:
     - priv can never be NULL, so this part of the check is useless
     - if the loop ran through the whole list, priv->client is invalid and
    it is more appropriate and sufficient to check for the end of
    list_for_each_entry loop condition.
    
    Link: http://lkml.kernel.org/r/20210727000709.225032-1-harshvardhan.jha@oracle.com
    Signed-off-by: Harshvardhan Jha <harshvardhan.jha@oracle.com>
    Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
    Tested-by: Stefano Stabellini <sstabellini@kernel.org>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Dominique Martinet <asmadeus@codewreck.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/9p/trans_xen.c b/net/9p/trans_xen.c
index 9daab0dd833b..21132bf3d850 100644
--- a/net/9p/trans_xen.c
+++ b/net/9p/trans_xen.c
@@ -138,7 +138,7 @@ static bool p9_xen_write_todo(struct xen_9pfs_dataring *ring, RING_IDX size)
 
 static int p9_xen_request(struct p9_client *client, struct p9_req_t *p9_req)
 {
-	struct xen_9pfs_front_priv *priv = NULL;
+	struct xen_9pfs_front_priv *priv;
 	RING_IDX cons, prod, masked_cons, masked_prod;
 	unsigned long flags;
 	u32 size = p9_req->tc.size;
@@ -151,7 +151,7 @@ static int p9_xen_request(struct p9_client *client, struct p9_req_t *p9_req)
 			break;
 	}
 	read_unlock(&xen_9pfs_lock);
-	if (!priv || priv->client != client)
+	if (list_entry_is_head(priv, &xen_9pfs_devs, list))
 		return -EINVAL;
 
 	num = p9_req->tc.tag % priv->num_rings;

commit 386a913d4960a83cc4657ebe0c9bc462d8f5e2a1
Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date:   Thu Oct 15 20:11:31 2020 -0700

    include/linux/list.h: add a macro to test if entry is pointing to the head
    
    commit e130816164e244b692921de49771eeb28205152d upstream.
    
    Add a macro to test if entry is pointing to the head of the list which is
    useful in cases like:
    
      list_for_each_entry(pos, &head, member) {
        if (cond)
          break;
      }
      if (list_entry_is_head(pos, &head, member))
        return -ERRNO;
    
    that allows to avoid additional variable to be added to track if loop has
    not been stopped in the middle.
    
    While here, convert list_for_each_entry*() family of macros to use a new one.
    
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Reviewed-by: Cezary Rojewski <cezary.rojewski@intel.com>
    Link: https://lkml.kernel.org/r/20200929134342.51489-1-andriy.shevchenko@linux.intel.com
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/list.h b/include/linux/list.h
index de04cc5ed536..d2c12ef7a4e3 100644
--- a/include/linux/list.h
+++ b/include/linux/list.h
@@ -484,6 +484,15 @@ static inline void list_splice_tail_init(struct list_head *list,
 	     pos != (head); \
 	     pos = n, n = pos->prev)
 
+/**
+ * list_entry_is_head - test if the entry points to the head of the list
+ * @pos:	the type * to cursor
+ * @head:	the head for your list.
+ * @member:	the name of the list_head within the struct.
+ */
+#define list_entry_is_head(pos, head, member)				\
+	(&pos->member == (head))
+
 /**
  * list_for_each_entry	-	iterate over list of given type
  * @pos:	the type * to use as a loop cursor.
@@ -492,7 +501,7 @@ static inline void list_splice_tail_init(struct list_head *list,
  */
 #define list_for_each_entry(pos, head, member)				\
 	for (pos = list_first_entry(head, typeof(*pos), member);	\
-	     &pos->member != (head);					\
+	     !list_entry_is_head(pos, head, member);			\
 	     pos = list_next_entry(pos, member))
 
 /**
@@ -503,7 +512,7 @@ static inline void list_splice_tail_init(struct list_head *list,
  */
 #define list_for_each_entry_reverse(pos, head, member)			\
 	for (pos = list_last_entry(head, typeof(*pos), member);		\
-	     &pos->member != (head); 					\
+	     !list_entry_is_head(pos, head, member); 			\
 	     pos = list_prev_entry(pos, member))
 
 /**
@@ -528,7 +537,7 @@ static inline void list_splice_tail_init(struct list_head *list,
  */
 #define list_for_each_entry_continue(pos, head, member) 		\
 	for (pos = list_next_entry(pos, member);			\
-	     &pos->member != (head);					\
+	     !list_entry_is_head(pos, head, member);			\
 	     pos = list_next_entry(pos, member))
 
 /**
@@ -542,7 +551,7 @@ static inline void list_splice_tail_init(struct list_head *list,
  */
 #define list_for_each_entry_continue_reverse(pos, head, member)		\
 	for (pos = list_prev_entry(pos, member);			\
-	     &pos->member != (head);					\
+	     !list_entry_is_head(pos, head, member);			\
 	     pos = list_prev_entry(pos, member))
 
 /**
@@ -554,7 +563,7 @@ static inline void list_splice_tail_init(struct list_head *list,
  * Iterate over list of given type, continuing from current position.
  */
 #define list_for_each_entry_from(pos, head, member) 			\
-	for (; &pos->member != (head);					\
+	for (; !list_entry_is_head(pos, head, member);			\
 	     pos = list_next_entry(pos, member))
 
 /**
@@ -567,7 +576,7 @@ static inline void list_splice_tail_init(struct list_head *list,
  * Iterate backwards over list of given type, continuing from current position.
  */
 #define list_for_each_entry_from_reverse(pos, head, member)		\
-	for (; &pos->member != (head);					\
+	for (; !list_entry_is_head(pos, head, member);			\
 	     pos = list_prev_entry(pos, member))
 
 /**
@@ -580,7 +589,7 @@ static inline void list_splice_tail_init(struct list_head *list,
 #define list_for_each_entry_safe(pos, n, head, member)			\
 	for (pos = list_first_entry(head, typeof(*pos), member),	\
 		n = list_next_entry(pos, member);			\
-	     &pos->member != (head); 					\
+	     !list_entry_is_head(pos, head, member); 			\
 	     pos = n, n = list_next_entry(n, member))
 
 /**
@@ -596,7 +605,7 @@ static inline void list_splice_tail_init(struct list_head *list,
 #define list_for_each_entry_safe_continue(pos, n, head, member) 		\
 	for (pos = list_next_entry(pos, member), 				\
 		n = list_next_entry(pos, member);				\
-	     &pos->member != (head);						\
+	     !list_entry_is_head(pos, head, member);				\
 	     pos = n, n = list_next_entry(n, member))
 
 /**
@@ -611,7 +620,7 @@ static inline void list_splice_tail_init(struct list_head *list,
  */
 #define list_for_each_entry_safe_from(pos, n, head, member) 			\
 	for (n = list_next_entry(pos, member);					\
-	     &pos->member != (head);						\
+	     !list_entry_is_head(pos, head, member);				\
 	     pos = n, n = list_next_entry(n, member))
 
 /**
@@ -627,7 +636,7 @@ static inline void list_splice_tail_init(struct list_head *list,
 #define list_for_each_entry_safe_reverse(pos, n, head, member)		\
 	for (pos = list_last_entry(head, typeof(*pos), member),		\
 		n = list_prev_entry(pos, member);			\
-	     &pos->member != (head); 					\
+	     !list_entry_is_head(pos, head, member); 			\
 	     pos = n, n = list_prev_entry(n, member))
 
 /**

commit a52a5266080aa53dce51d58efdfd7b69b85d08fb
Author: Juergen Gross <jgross@suse.com>
Date:   Fri Jul 30 11:26:21 2021 +0200

    xen: fix setting of max_pfn in shared_info
    
    commit 4b511d5bfa74b1926daefd1694205c7f1bcf677f upstream.
    
    Xen PV guests are specifying the highest used PFN via the max_pfn
    field in shared_info. This value is used by the Xen tools when saving
    or migrating the guest.
    
    Unfortunately this field is misnamed, as in reality it is specifying
    the number of pages (including any memory holes) of the guest, so it
    is the highest used PFN + 1. Renaming isn't possible, as this is a
    public Xen hypervisor interface which needs to be kept stable.
    
    The kernel will set the value correctly initially at boot time, but
    when adding more pages (e.g. due to memory hotplug or ballooning) a
    real PFN number is stored in max_pfn. This is done when expanding the
    p2m array, and the PFN stored there is even possibly wrong, as it
    should be the last possible PFN of the just added P2M frame, and not
    one which led to the P2M expansion.
    
    Fix that by setting shared_info->max_pfn to the last possible PFN + 1.
    
    Fixes: 98dd166ea3a3c3 ("x86/xen/p2m: hint at the last populated P2M entry")
    Cc: stable@vger.kernel.org
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Reviewed-by: Jan Beulich <jbeulich@suse.com>
    Link: https://lore.kernel.org/r/20210730092622.9973-2-jgross@suse.com
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c
index 82577eec6d0a..f9b31eb6846c 100644
--- a/arch/x86/xen/p2m.c
+++ b/arch/x86/xen/p2m.c
@@ -613,8 +613,8 @@ int xen_alloc_p2m_entry(unsigned long pfn)
 	}
 
 	/* Expanded the p2m? */
-	if (pfn > xen_p2m_last_pfn) {
-		xen_p2m_last_pfn = pfn;
+	if (pfn >= xen_p2m_last_pfn) {
+		xen_p2m_last_pfn = ALIGN(pfn + 1, P2M_PER_PAGE);
 		HYPERVISOR_shared_info->arch.max_pfn = xen_p2m_last_pfn;
 	}
 

commit 90a2eb8a436341b1b4c5e5226dc78408ad8a97e4
Author: Kajol Jain <kjain@linux.ibm.com>
Date:   Fri Aug 13 13:51:58 2021 +0530

    powerpc/perf/hv-gpci: Fix counter value parsing
    
    commit f9addd85fbfacf0d155e83dbee8696d6df5ed0c7 upstream.
    
    H_GetPerformanceCounterInfo (0xF080) hcall returns the counter data in
    the result buffer. Result buffer has specific format defined in the PAPR
    specification. One of the fields is counter offset and width of the
    counter data returned.
    
    Counter data are returned in a unsigned char array in big endian byte
    order. To get the final counter data, the values must be left shifted
    byte at a time. But commit 220a0c609ad17 ("powerpc/perf: Add support for
    the hv gpci (get performance counter info) interface") made the shifting
    bitwise and also assumed little endian order. Because of that, hcall
    counters values are reported incorrectly.
    
    In particular this can lead to counters go backwards which messes up the
    counter prev vs now calculation and leads to huge counter value
    reporting:
    
      #: perf stat -e hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
               -C 0 -I 1000
            time             counts unit events
         1.000078854 18,446,744,073,709,535,232      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
         2.000213293                  0      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
         3.000320107                  0      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
         4.000428392                  0      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
         5.000537864                  0      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
         6.000649087                  0      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
         7.000760312                  0      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
         8.000865218             16,448      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
         9.000978985 18,446,744,073,709,535,232      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
        10.001088891             16,384      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
        11.001201435                  0      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
        12.001307937 18,446,744,073,709,535,232      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
    
    Fix the shifting logic to correct match the format, ie. read bytes in
    big endian order.
    
    Fixes: e4f226b1580b ("powerpc/perf/hv-gpci: Increase request buffer size")
    Cc: stable@vger.kernel.org # v4.6+
    Reported-by: Nageswara R Sastry<rnsastry@linux.ibm.com>
    Signed-off-by: Kajol Jain <kjain@linux.ibm.com>
    Tested-by: Nageswara R Sastry<rnsastry@linux.ibm.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210813082158.429023-1-kjain@linux.ibm.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/powerpc/perf/hv-gpci.c b/arch/powerpc/perf/hv-gpci.c
index 43fabb3cae0f..160b86d9d819 100644
--- a/arch/powerpc/perf/hv-gpci.c
+++ b/arch/powerpc/perf/hv-gpci.c
@@ -168,7 +168,7 @@ static unsigned long single_gpci_request(u32 req, u32 starting_index,
 	 */
 	count = 0;
 	for (i = offset; i < offset + length; i++)
-		count |= arg->bytes[i] << (i - offset);
+		count |= (u64)(arg->bytes[i]) << ((length - 1 - (i - offset)) * 8);
 
 	*value = count;
 out:

commit 34b23fc32c05f14fd21caa32544f3720e1527a8d
Author: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
Date:   Thu Aug 26 19:03:42 2021 +0200

    PCI/MSI: Skip masking MSI-X on Xen PV
    
    commit 1a519dc7a73c977547d8b5108d98c6e769c89f4b upstream.
    
    When running as Xen PV guest, masking MSI-X is a responsibility of the
    hypervisor. The guest has no write access to the relevant BAR at all - when
    it tries to, it results in a crash like this:
    
        BUG: unable to handle page fault for address: ffffc9004069100c
        #PF: supervisor write access in kernel mode
        #PF: error_code(0x0003) - permissions violation
        RIP: e030:__pci_enable_msix_range.part.0+0x26b/0x5f0
         e1000e_set_interrupt_capability+0xbf/0xd0 [e1000e]
         e1000_probe+0x41f/0xdb0 [e1000e]
         local_pci_probe+0x42/0x80
        (...)
    
    The recently introduced function msix_mask_all() does not check the global
    variable pci_msi_ignore_mask which is set by XEN PV to bypass the masking
    of MSI[-X] interrupts.
    
    Add the check to make this function XEN PV compatible.
    
    Fixes: 7d5ec3d36123 ("PCI/MSI: Mask all unused MSI-X entries")
    Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Acked-by: Bjorn Helgaas <bhelgaas@google.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210826170342.135172-1-marmarek@invisiblethingslab.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index bc80b0f0ea1b..f65800d63856 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -754,6 +754,9 @@ static void msix_mask_all(void __iomem *base, int tsize)
 	u32 ctrl = PCI_MSIX_ENTRY_CTRL_MASKBIT;
 	int i;
 
+	if (pci_msi_ignore_mask)
+		return;
+
 	for (i = 0; i < tsize; i++, base += PCI_MSIX_ENTRY_SIZE)
 		writel(ctrl, base + PCI_MSIX_ENTRY_VECTOR_CTRL);
 }

commit 20c1d98ca96be6b2b583806a01899b1a8d88924b
Author: Niklas Cassel <niklas.cassel@wdc.com>
Date:   Wed Aug 11 11:05:19 2021 +0000

    blk-zoned: allow BLKREPORTZONE without CAP_SYS_ADMIN
    
    commit 4d643b66089591b4769bcdb6fd1bfeff2fe301b8 upstream.
    
    A user space process should not need the CAP_SYS_ADMIN capability set
    in order to perform a BLKREPORTZONE ioctl.
    
    Getting the zone report is required in order to get the write pointer.
    Neither read() nor write() requires CAP_SYS_ADMIN, so it is reasonable
    that a user space process that can read/write from/to the device, also
    can get the write pointer. (Since e.g. writes have to be at the write
    pointer.)
    
    Fixes: 3ed05a987e0f ("blk-zoned: implement ioctls")
    Signed-off-by: Niklas Cassel <niklas.cassel@wdc.com>
    Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com>
    Reviewed-by: Aravind Ramesh <aravind.ramesh@wdc.com>
    Reviewed-by: Adam Manzanares <a.manzanares@samsung.com>
    Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
    Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
    Cc: stable@vger.kernel.org # v4.10+
    Link: https://lore.kernel.org/r/20210811110505.29649-3-Niklas.Cassel@wdc.com
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/block/blk-zoned.c b/block/blk-zoned.c
index 13002ba56b4f..d33e89d28dbe 100644
--- a/block/blk-zoned.c
+++ b/block/blk-zoned.c
@@ -319,9 +319,6 @@ int blkdev_report_zones_ioctl(struct block_device *bdev, fmode_t mode,
 	if (!blk_queue_is_zoned(q))
 		return -ENOTTY;
 
-	if (!capable(CAP_SYS_ADMIN))
-		return -EACCES;
-
 	if (copy_from_user(&rep, argp, sizeof(struct blk_zone_report)))
 		return -EFAULT;
 

commit d860ad5128b1d0adb8bb0b32275b46111568794b
Author: Niklas Cassel <niklas.cassel@wdc.com>
Date:   Wed Aug 11 11:05:18 2021 +0000

    blk-zoned: allow zone management send operations without CAP_SYS_ADMIN
    
    commit ead3b768bb51259e3a5f2287ff5fc9041eb6f450 upstream.
    
    Zone management send operations (BLKRESETZONE, BLKOPENZONE, BLKCLOSEZONE
    and BLKFINISHZONE) should be allowed under the same permissions as write().
    (write() does not require CAP_SYS_ADMIN).
    
    Additionally, other ioctls like BLKSECDISCARD and BLKZEROOUT only check if
    the fd was successfully opened with FMODE_WRITE.
    (They do not require CAP_SYS_ADMIN).
    
    Currently, zone management send operations require both CAP_SYS_ADMIN
    and that the fd was successfully opened with FMODE_WRITE.
    
    Remove the CAP_SYS_ADMIN requirement, so that zone management send
    operations match the access control requirement of write(), BLKSECDISCARD
    and BLKZEROOUT.
    
    Fixes: 3ed05a987e0f ("blk-zoned: implement ioctls")
    Signed-off-by: Niklas Cassel <niklas.cassel@wdc.com>
    Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com>
    Reviewed-by: Aravind Ramesh <aravind.ramesh@wdc.com>
    Reviewed-by: Adam Manzanares <a.manzanares@samsung.com>
    Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
    Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
    Cc: stable@vger.kernel.org # v4.10+
    Link: https://lore.kernel.org/r/20210811110505.29649-2-Niklas.Cassel@wdc.com
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/block/blk-zoned.c b/block/blk-zoned.c
index c461cf63f1f4..13002ba56b4f 100644
--- a/block/blk-zoned.c
+++ b/block/blk-zoned.c
@@ -380,9 +380,6 @@ int blkdev_reset_zones_ioctl(struct block_device *bdev, fmode_t mode,
 	if (!blk_queue_is_zoned(q))
 		return -ENOTTY;
 
-	if (!capable(CAP_SYS_ADMIN))
-		return -EACCES;
-
 	if (!(mode & FMODE_WRITE))
 		return -EBADF;
 

commit e44d9cfb15a3c2a304545eaf2f7aa882b4263578
Author: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
Date:   Sat Aug 21 01:50:40 2021 +0800

    btrfs: reset replace target device to allocation state on close
    
    commit 0d977e0eba234e01a60bdde27314dc21374201b3 upstream.
    
    This crash was observed with a failed assertion on device close:
    
      BTRFS: Transaction aborted (error -28)
      WARNING: CPU: 1 PID: 3902 at fs/btrfs/extent-tree.c:2150 btrfs_run_delayed_refs+0x1d2/0x1e0 [btrfs]
      Modules linked in: btrfs blake2b_generic libcrc32c crc32c_intel xor zstd_decompress zstd_compress xxhash lzo_compress lzo_decompress raid6_pq loop
      CPU: 1 PID: 3902 Comm: kworker/u8:4 Not tainted 5.14.0-rc5-default+ #1532
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.0-59-gc9ba527-rebuilt.opensuse.org 04/01/2014
      Workqueue: events_unbound btrfs_async_reclaim_metadata_space [btrfs]
      RIP: 0010:btrfs_run_delayed_refs+0x1d2/0x1e0 [btrfs]
      RSP: 0018:ffffb7a5452d7d80 EFLAGS: 00010282
      RAX: 0000000000000000 RBX: 0000000000000003 RCX: 0000000000000000
      RDX: 0000000000000001 RSI: ffffffffabee13c4 RDI: 00000000ffffffff
      RBP: ffff97834176a378 R08: 0000000000000001 R09: 0000000000000001
      R10: 0000000000000000 R11: 0000000000000001 R12: ffff97835195d388
      R13: 0000000005b08000 R14: ffff978385484000 R15: 000000000000016c
      FS:  0000000000000000(0000) GS:ffff9783bd800000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 000056190d003fe8 CR3: 000000002a81e005 CR4: 0000000000170ea0
      Call Trace:
       flush_space+0x197/0x2f0 [btrfs]
       btrfs_async_reclaim_metadata_space+0x139/0x300 [btrfs]
       process_one_work+0x262/0x5e0
       worker_thread+0x4c/0x320
       ? process_one_work+0x5e0/0x5e0
       kthread+0x144/0x170
       ? set_kthread_struct+0x40/0x40
       ret_from_fork+0x1f/0x30
      irq event stamp: 19334989
      hardirqs last  enabled at (19334997): [<ffffffffab0e0c87>] console_unlock+0x2b7/0x400
      hardirqs last disabled at (19335006): [<ffffffffab0e0d0d>] console_unlock+0x33d/0x400
      softirqs last  enabled at (19334900): [<ffffffffaba0030d>] __do_softirq+0x30d/0x574
      softirqs last disabled at (19334893): [<ffffffffab0721ec>] irq_exit_rcu+0x12c/0x140
      ---[ end trace 45939e308e0dd3c7 ]---
      BTRFS: error (device vdd) in btrfs_run_delayed_refs:2150: errno=-28 No space left
      BTRFS info (device vdd): forced readonly
      BTRFS warning (device vdd): failed setting block group ro: -30
      BTRFS info (device vdd): suspending dev_replace for unmount
      assertion failed: !test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state), in fs/btrfs/volumes.c:1150
      ------------[ cut here ]------------
      kernel BUG at fs/btrfs/ctree.h:3431!
      invalid opcode: 0000 [#1] PREEMPT SMP
      CPU: 1 PID: 3982 Comm: umount Tainted: G        W         5.14.0-rc5-default+ #1532
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.0-59-gc9ba527-rebuilt.opensuse.org 04/01/2014
      RIP: 0010:assertfail.constprop.0+0x18/0x1a [btrfs]
      RSP: 0018:ffffb7a5454c7db8 EFLAGS: 00010246
      RAX: 0000000000000068 RBX: ffff978364b91c00 RCX: 0000000000000000
      RDX: 0000000000000000 RSI: ffffffffabee13c4 RDI: 00000000ffffffff
      RBP: ffff9783523a4c00 R08: 0000000000000001 R09: 0000000000000001
      R10: 0000000000000000 R11: 0000000000000001 R12: ffff9783523a4d18
      R13: 0000000000000000 R14: 0000000000000004 R15: 0000000000000003
      FS:  00007f61c8f42800(0000) GS:ffff9783bd800000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 000056190cffa810 CR3: 0000000030b96002 CR4: 0000000000170ea0
      Call Trace:
       btrfs_close_one_device.cold+0x11/0x55 [btrfs]
       close_fs_devices+0x44/0xb0 [btrfs]
       btrfs_close_devices+0x48/0x160 [btrfs]
       generic_shutdown_super+0x69/0x100
       kill_anon_super+0x14/0x30
       btrfs_kill_super+0x12/0x20 [btrfs]
       deactivate_locked_super+0x2c/0xa0
       cleanup_mnt+0x144/0x1b0
       task_work_run+0x59/0xa0
       exit_to_user_mode_loop+0xe7/0xf0
       exit_to_user_mode_prepare+0xaf/0xf0
       syscall_exit_to_user_mode+0x19/0x50
       do_syscall_64+0x4a/0x90
       entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    This happens when close_ctree is called while a dev_replace hasn't
    completed. In close_ctree, we suspend the dev_replace, but keep the
    replace target around so that we can resume the dev_replace procedure
    when we mount the root again. This is the call trace:
    
      close_ctree():
        btrfs_dev_replace_suspend_for_unmount();
        btrfs_close_devices():
          btrfs_close_fs_devices():
            btrfs_close_one_device():
              ASSERT(!test_bit(BTRFS_DEV_STATE_REPLACE_TGT,
                     &device->dev_state));
    
    However, since the replace target sticks around, there is a device
    with BTRFS_DEV_STATE_REPLACE_TGT set on close, and we fail the
    assertion in btrfs_close_one_device.
    
    To fix this, if we come across the replace target device when
    closing, we should properly reset it back to allocation state. This
    fix also ensures that if a non-target device has a corrupted state and
    has the BTRFS_DEV_STATE_REPLACE_TGT bit set, the assertion will still
    catch the error.
    
    Reported-by: David Sterba <dsterba@suse.com>
    Fixes: b2a616676839 ("btrfs: fix rw device counting in __btrfs_free_extra_devids")
    CC: stable@vger.kernel.org # 4.19+
    Reviewed-by: Anand Jain <anand.jain@oracle.com>
    Signed-off-by: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 5a19f5ee7038..6cb489625610 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -1048,6 +1048,9 @@ static void btrfs_close_one_device(struct btrfs_device *device)
 		fs_devices->rw_devices--;
 	}
 
+	if (device->devid == BTRFS_DEV_REPLACE_DEVID)
+		clear_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state);
+
 	if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state))
 		fs_devices->missing_devices--;
 

commit 4f420390a0baff373f964b795490d0ba1547fb03
Author: Dmitry Osipenko <digetx@gmail.com>
Date:   Sun Aug 8 19:00:30 2021 +0300

    rtc: tps65910: Correct driver module alias
    
    commit 8d448fa0a8bb1c8d94eef7647edffe9ac81a281e upstream.
    
    The TPS65910 RTC driver module doesn't auto-load because of the wrong
    module alias that doesn't match the device name, fix it.
    
    Cc: stable@vger.kernel.org
    Reported-by: Anton Bambura <jenneron@protonmail.com>
    Tested-by: Anton Bambura <jenneron@protonmail.com>
    Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
    Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
    Link: https://lore.kernel.org/r/20210808160030.8556-1-digetx@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/rtc/rtc-tps65910.c b/drivers/rtc/rtc-tps65910.c
index a9bbd022aeef..9f10af7ac6ef 100644
--- a/drivers/rtc/rtc-tps65910.c
+++ b/drivers/rtc/rtc-tps65910.c
@@ -470,6 +470,6 @@ static struct platform_driver tps65910_rtc_driver = {
 };
 
 module_platform_driver(tps65910_rtc_driver);
-MODULE_ALIAS("platform:rtc-tps65910");
+MODULE_ALIAS("platform:tps65910-rtc");
 MODULE_AUTHOR("Venu Byravarasu <vbyravarasu@nvidia.com>");
 MODULE_LICENSE("GPL");

commit cf5504e5b52f494723f4fade0e59227878592549
Author: Linus Walleij <linus.walleij@linaro.org>
Date:   Sun Aug 15 01:55:14 2021 +0200

    clk: kirkwood: Fix a clocking boot regression
    
    commit aaedb9e00e5400220a8871180d23a83e67f29f63 upstream.
    
    Since a few kernel releases the Pogoplug 4 has crashed like this
    during boot:
    
    Unable to handle kernel NULL pointer dereference at virtual address 00000002
    (...)
    [<c04116ec>] (strlen) from [<c00ead80>] (kstrdup+0x1c/0x4c)
    [<c00ead80>] (kstrdup) from [<c04591d8>] (__clk_register+0x44/0x37c)
    [<c04591d8>] (__clk_register) from [<c04595ec>] (clk_hw_register+0x20/0x44)
    [<c04595ec>] (clk_hw_register) from [<c045bfa8>] (__clk_hw_register_mux+0x198/0x1e4)
    [<c045bfa8>] (__clk_hw_register_mux) from [<c045c050>] (clk_register_mux_table+0x5c/0x6c)
    [<c045c050>] (clk_register_mux_table) from [<c0acf3e0>] (kirkwood_clk_muxing_setup.constprop.0+0x13c/0x1ac)
    [<c0acf3e0>] (kirkwood_clk_muxing_setup.constprop.0) from [<c0aceae0>] (of_clk_init+0x12c/0x214)
    [<c0aceae0>] (of_clk_init) from [<c0ab576c>] (time_init+0x20/0x2c)
    [<c0ab576c>] (time_init) from [<c0ab3d18>] (start_kernel+0x3dc/0x56c)
    [<c0ab3d18>] (start_kernel) from [<00000000>] (0x0)
    Code: e3130020 1afffffb e12fff1e c08a1078 (e5d03000)
    
    This is because the "powersave" mux clock 0 was provided in an unterminated
    array, which is required by the loop in the driver:
    
            /* Count, allocate, and register clock muxes */
            for (n = 0; desc[n].name;)
                    n++;
    
    Here n will go out of bounds and then call clk_register_mux() on random
    memory contents after the mux clock.
    
    Fix this by terminating the array with a blank entry.
    
    Fixes: 105299381d87 ("cpufreq: kirkwood: use the powersave multiplexer")
    Cc: stable@vger.kernel.org
    Cc: Andrew Lunn <andrew@lunn.ch>
    Cc: Chris Packham <chris.packham@alliedtelesis.co.nz>
    Cc: Gregory CLEMENT <gregory.clement@bootlin.com>
    Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Link: https://lore.kernel.org/r/20210814235514.403426-1-linus.walleij@linaro.org
    Reviewed-by: Andrew Lunn <andrew@lunn.ch>
    Signed-off-by: Stephen Boyd <sboyd@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/clk/mvebu/kirkwood.c b/drivers/clk/mvebu/kirkwood.c
index 890ebf623261..38612cd9092e 100644
--- a/drivers/clk/mvebu/kirkwood.c
+++ b/drivers/clk/mvebu/kirkwood.c
@@ -254,6 +254,7 @@ static const char *powersave_parents[] = {
 static const struct clk_muxing_soc_desc kirkwood_mux_desc[] __initconst = {
 	{ "powersave", powersave_parents, ARRAY_SIZE(powersave_parents),
 		11, 1, 0 },
+	{ }
 };
 
 static struct clk *clk_muxing_get_src(

commit a5ea08842b23dd665dee7e006f91d73461c374ba
Author: Daniel Thompson <daniel.thompson@linaro.org>
Date:   Thu Jul 22 15:46:23 2021 +0100

    backlight: pwm_bl: Improve bootloader/kernel device handover
    
    commit 79fad92f2e596f5a8dd085788a24f540263ef887 upstream.
    
    Currently there are (at least) two problems in the way pwm_bl starts
    managing the enable_gpio pin. Both occur when the backlight is initially
    off and the driver finds the pin not already in output mode and, as a
    result, unconditionally switches it to output-mode and asserts the signal.
    
    Problem 1: This could cause the backlight to flicker since, at this stage
    in driver initialisation, we have no idea what the PWM and regulator are
    doing (an unconfigured PWM could easily "rest" at 100% duty cycle).
    
    Problem 2: This will cause us not to correctly honour the
    post_pwm_on_delay (which also risks flickers).
    
    Fix this by moving the code to configure the GPIO output mode until after
    we have examines the handover state. That allows us to initialize
    enable_gpio to off if the backlight is currently off and on if the
    backlight is on.
    
    Cc: stable@vger.kernel.org
    Reported-by: Marek Vasut <marex@denx.de>
    Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
    Acked-by: Marek Vasut <marex@denx.de>
    Tested-by: Marek Vasut <marex@denx.de>
    Signed-off-by: Lee Jones <lee.jones@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c
index 3a3098d4873b..6a8dd2f16b78 100644
--- a/drivers/video/backlight/pwm_bl.c
+++ b/drivers/video/backlight/pwm_bl.c
@@ -400,6 +400,33 @@ int pwm_backlight_brightness_default(struct device *dev,
 static int pwm_backlight_initial_power_state(const struct pwm_bl_data *pb)
 {
 	struct device_node *node = pb->dev->of_node;
+	bool active = true;
+
+	/*
+	 * If the enable GPIO is present, observable (either as input
+	 * or output) and off then the backlight is not currently active.
+	 * */
+	if (pb->enable_gpio && gpiod_get_value_cansleep(pb->enable_gpio) == 0)
+		active = false;
+
+	if (!regulator_is_enabled(pb->power_supply))
+		active = false;
+
+	if (!pwm_is_enabled(pb->pwm))
+		active = false;
+
+	/*
+	 * Synchronize the enable_gpio with the observed state of the
+	 * hardware.
+	 */
+	if (pb->enable_gpio)
+		gpiod_direction_output(pb->enable_gpio, active);
+
+	/*
+	 * Do not change pb->enabled here! pb->enabled essentially
+	 * tells us if we own one of the regulator's use counts and
+	 * right now we do not.
+	 */
 
 	/* Not booted with device tree or no phandle link to the node */
 	if (!node || !node->phandle)
@@ -411,20 +438,7 @@ static int pwm_backlight_initial_power_state(const struct pwm_bl_data *pb)
 	 * assume that another driver will enable the backlight at the
 	 * appropriate time. Therefore, if it is disabled, keep it so.
 	 */
-
-	/* if the enable GPIO is disabled, do not enable the backlight */
-	if (pb->enable_gpio && gpiod_get_value_cansleep(pb->enable_gpio) == 0)
-		return FB_BLANK_POWERDOWN;
-
-	/* The regulator is disabled, do not enable the backlight */
-	if (!regulator_is_enabled(pb->power_supply))
-		return FB_BLANK_POWERDOWN;
-
-	/* The PWM is disabled, keep it like this */
-	if (!pwm_is_enabled(pb->pwm))
-		return FB_BLANK_POWERDOWN;
-
-	return FB_BLANK_UNBLANK;
+	return active ? FB_BLANK_UNBLANK: FB_BLANK_POWERDOWN;
 }
 
 static int pwm_backlight_probe(struct platform_device *pdev)
@@ -494,18 +508,6 @@ static int pwm_backlight_probe(struct platform_device *pdev)
 		pb->enable_gpio = gpio_to_desc(data->enable_gpio);
 	}
 
-	/*
-	 * If the GPIO is not known to be already configured as output, that
-	 * is, if gpiod_get_direction returns either 1 or -EINVAL, change the
-	 * direction to output and set the GPIO as active.
-	 * Do not force the GPIO to active when it was already output as it
-	 * could cause backlight flickering or we would enable the backlight too
-	 * early. Leave the decision of the initial backlight state for later.
-	 */
-	if (pb->enable_gpio &&
-	    gpiod_get_direction(pb->enable_gpio) != 0)
-		gpiod_direction_output(pb->enable_gpio, 1);
-
 	pb->power_supply = devm_regulator_get(&pdev->dev, "power");
 	if (IS_ERR(pb->power_supply)) {
 		ret = PTR_ERR(pb->power_supply);

commit 5f87c22d3dd91795590524ba69bb4368f8957a72
Author: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Date:   Wed Sep 8 19:27:49 2021 +0900

    fbmem: don't allow too huge resolutions
    
    commit 8c28051cdcbe9dfcec6bd0a4709d67a09df6edae upstream.
    
    syzbot is reporting page fault at vga16fb_fillrect() [1], for
    vga16fb_check_var() is failing to detect multiplication overflow.
    
      if (vxres * vyres > maxmem) {
        vyres = maxmem / vxres;
        if (vyres < yres)
          return -ENOMEM;
      }
    
    Since no module would accept too huge resolutions where multiplication
    overflow happens, let's reject in the common path.
    
    Link: https://syzkaller.appspot.com/bug?extid=04168c8063cfdde1db5e [1]
    Reported-by: syzbot <syzbot+04168c8063cfdde1db5e@syzkaller.appspotmail.com>
    Debugged-by: Randy Dunlap <rdunlap@infradead.org>
    Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
    Cc: stable@vger.kernel.org
    Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
    Link: https://patchwork.freedesktop.org/patch/msgid/185175d6-227a-7b55-433d-b070929b262c@i-love.sakura.ne.jp
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c
index de04c097d67c..2297dfb494d6 100644
--- a/drivers/video/fbdev/core/fbmem.c
+++ b/drivers/video/fbdev/core/fbmem.c
@@ -971,6 +971,7 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
 	if ((var->activate & FB_ACTIVATE_FORCE) ||
 	    memcmp(&info->var, var, sizeof(struct fb_var_screeninfo))) {
 		u32 activate = var->activate;
+		u32 unused;
 
 		/* When using FOURCC mode, make sure the red, green, blue and
 		 * transp fields are set to 0.
@@ -995,6 +996,11 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
 		if (var->xres < 8 || var->yres < 8)
 			return -EINVAL;
 
+		/* Too huge resolution causes multiplication overflow. */
+		if (check_mul_overflow(var->xres, var->yres, &unused) ||
+		    check_mul_overflow(var->xres_virtual, var->yres_virtual, &unused))
+			return -EINVAL;
+
 		ret = info->fbops->fb_check_var(var, info);
 
 		if (ret)

commit 9e71c3544b5d620f12064d9aa026ccfae0dfb644
Author: THOBY Simon <Simon.THOBY@viveris.fr>
Date:   Mon Aug 16 08:10:59 2021 +0000

    IMA: remove the dependency on CRYPTO_MD5
    
    commit 8510505d55e194d3f6c9644c9f9d12c4f6b0395a upstream.
    
    MD5 is a weak digest algorithm that shouldn't be used for cryptographic
    operation. It hinders the efficiency of a patch set that aims to limit
    the digests allowed for the extended file attribute namely security.ima.
    MD5 is no longer a requirement for IMA, nor should it be used there.
    
    The sole place where we still use the MD5 algorithm inside IMA is setting
    the ima_hash algorithm to MD5, if the user supplies 'ima_hash=md5'
    parameter on the command line.  With commit ab60368ab6a4 ("ima: Fallback
    to the builtin hash algorithm"), setting "ima_hash=md5" fails gracefully
    when CRYPTO_MD5 is not set:
            ima: Can not allocate md5 (reason: -2)
            ima: Allocating md5 failed, going to use default hash algorithm sha256
    
    Remove the CRYPTO_MD5 dependency for IMA.
    
    Signed-off-by: THOBY Simon <Simon.THOBY@viveris.fr>
    Reviewed-by: Lakshmi Ramasubramanian <nramas@linux.microsoft.com>
    [zohar@linux.ibm.com: include commit number in patch description for
    stable.]
    Cc: stable@vger.kernel.org # 4.17
    Signed-off-by: Mimi Zohar <zohar@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/security/integrity/ima/Kconfig b/security/integrity/ima/Kconfig
index 13b446328dda..5095b2e8fcee 100644
--- a/security/integrity/ima/Kconfig
+++ b/security/integrity/ima/Kconfig
@@ -5,7 +5,6 @@ config IMA
 	select SECURITYFS
 	select CRYPTO
 	select CRYPTO_HMAC
-	select CRYPTO_MD5
 	select CRYPTO_SHA1
 	select CRYPTO_HASH_INFO
 	select TCG_TPM if HAS_IOMEM && !UML

commit 38521398d51d5c0bf37280e55e1cc45ae29b82a1
Author: Austin Kim <austin.kim@lge.com>
Date:   Tue Jun 29 14:50:50 2021 +0100

    IMA: remove -Wmissing-prototypes warning
    
    commit a32ad90426a9c8eb3915eed26e08ce133bd9e0da upstream.
    
    With W=1 build, the compiler throws warning message as below:
    
       security/integrity/ima/ima_mok.c:24:12: warning:
       no previous prototype for ?ima_mok_init??[-Wmissing-prototypes]
           __init int ima_mok_init(void)
    
    Silence the warning by adding static keyword to ima_mok_init().
    
    Signed-off-by: Austin Kim <austin.kim@lge.com>
    Fixes: 41c89b64d718 ("IMA: create machine owner and blacklist keyrings")
    Cc: stable@vger.kernel.org
    Signed-off-by: Mimi Zohar <zohar@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/security/integrity/ima/ima_mok.c b/security/integrity/ima/ima_mok.c
index 3e7a1523663b..daad75ee74d9 100644
--- a/security/integrity/ima/ima_mok.c
+++ b/security/integrity/ima/ima_mok.c
@@ -26,7 +26,7 @@ struct key *ima_blacklist_keyring;
 /*
  * Allocate the IMA blacklist keyring
  */
-__init int ima_mok_init(void)
+static __init int ima_mok_init(void)
 {
 	struct key_restriction *restriction;
 

commit c086bf77be04888157e7a94ba7d43dadffe2ca55
Author: Zelin Deng <zelin.deng@linux.alibaba.com>
Date:   Wed Apr 28 10:22:01 2021 +0800

    KVM: x86: Update vCPU's hv_clock before back to guest when tsc_offset is adjusted
    
    commit d9130a2dfdd4b21736c91b818f87dbc0ccd1e757 upstream.
    
    When MSR_IA32_TSC_ADJUST is written by guest due to TSC ADJUST feature
    especially there's a big tsc warp (like a new vCPU is hot-added into VM
    which has been up for a long time), tsc_offset is added by a large value
    then go back to guest. This causes system time jump as tsc_timestamp is
    not adjusted in the meantime and pvclock monotonic character.
    To fix this, just notify kvm to update vCPU's guest time before back to
    guest.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Zelin Deng <zelin.deng@linux.alibaba.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Message-Id: <1619576521-81399-2-git-send-email-zelin.deng@linux.alibaba.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index f913127e942a..417abc9ba1ad 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -2511,6 +2511,10 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
 			if (!msr_info->host_initiated) {
 				s64 adj = data - vcpu->arch.ia32_tsc_adjust_msr;
 				adjust_tsc_offset_guest(vcpu, adj);
+				/* Before back to guest, tsc_timestamp must be adjusted
+				 * as well, otherwise guest's percpu pvclock time could jump.
+				 */
+				kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu);
 			}
 			vcpu->arch.ia32_tsc_adjust_msr = data;
 		}

commit e726fa6971f145a23830ded7ce1f17086a0cf82e
Author: Babu Moger <babu.moger@amd.com>
Date:   Fri Aug 20 16:52:42 2021 -0500

    x86/resctrl: Fix a maybe-uninitialized build warning treated as error
    
    commit 527f721478bce3f49b513a733bacd19d6f34b08c upstream.
    
    The recent commit
    
      064855a69003 ("x86/resctrl: Fix default monitoring groups reporting")
    
    caused a RHEL build failure with an uninitialized variable warning
    treated as an error because it removed the default case snippet.
    
    The RHEL Makefile uses '-Werror=maybe-uninitialized' to force possibly
    uninitialized variable warnings to be treated as errors. This is also
    reported by smatch via the 0day robot.
    
    The error from the RHEL build is:
    
      arch/x86/kernel/cpu/resctrl/monitor.c: In function ?__mon_event_count??
      arch/x86/kernel/cpu/resctrl/monitor.c:261:12: error: ?m??may be used
      uninitialized in this function [-Werror=maybe-uninitialized]
        m->chunks += chunks;
                  ^~
    
    The upstream Makefile does not build using '-Werror=maybe-uninitialized'.
    So, the problem is not seen there. Fix the problem by putting back the
    default case snippet.
    
     [ bp: note that there's nothing wrong with the code and other compilers
       do not trigger this warning - this is being done just so the RHEL compiler
       is happy. ]
    
    Fixes: 064855a69003 ("x86/resctrl: Fix default monitoring groups reporting")
    Reported-by: Terry Bowman <Terry.Bowman@amd.com>
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Babu Moger <babu.moger@amd.com>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
    Cc: stable@vger.kernel.org
    Link: https://lkml.kernel.org/r/162949631908.23903.17090272726012848523.stgit@bmoger-ubuntu
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kernel/cpu/intel_rdt_monitor.c b/arch/x86/kernel/cpu/intel_rdt_monitor.c
index 6eeb17dfde48..5fee674fe59d 100644
--- a/arch/x86/kernel/cpu/intel_rdt_monitor.c
+++ b/arch/x86/kernel/cpu/intel_rdt_monitor.c
@@ -252,6 +252,12 @@ static u64 __mon_event_count(u32 rmid, struct rmid_read *rr)
 	case QOS_L3_MBM_LOCAL_EVENT_ID:
 		m = &rr->d->mbm_local[rmid];
 		break;
+	default:
+		/*
+		 * Code would never reach here because an invalid
+		 * event id would fail the __rmid_read.
+		 */
+		return RMID_VAL_ERROR;
 	}
 
 	if (rr->first) {

commit f7bffefa322a3d5a292c0b7a9b93302b392928f6
Author: Nguyen Dinh Phi <phind.uet@gmail.com>
Date:   Mon Aug 23 08:06:41 2021 +0800

    tty: Fix data race between tiocsti() and flush_to_ldisc()
    
    commit bb2853a6a421a052268eee00fd5d3f6b3504b2b1 upstream.
    
    The ops->receive_buf() may be accessed concurrently from these two
    functions.  If the driver flushes data to the line discipline
    receive_buf() method while tiocsti() is waiting for the
    ops->receive_buf() to finish its work, the data race will happen.
    
    For example:
    tty_ioctl                       |tty_ldisc_receive_buf
     ->tioctsi                      | ->tty_port_default_receive_buf
                                    |  ->tty_ldisc_receive_buf
       ->hci_uart_tty_receive       |   ->hci_uart_tty_receive
        ->h4_recv                   |    ->h4_recv
    
    In this case, the h4 receive buffer will be overwritten by the
    latecomer, and we will lost the data.
    
    Hence, change tioctsi() function to use the exclusive lock interface
    from tty_buffer to avoid the data race.
    
    Reported-by: syzbot+97388eb9d31b997fe1d0@syzkaller.appspotmail.com
    Reviewed-by: Jiri Slaby <jirislaby@kernel.org>
    Signed-off-by: Nguyen Dinh Phi <phind.uet@gmail.com>
    Link: https://lore.kernel.org/r/20210823000641.2082292-1-phind.uet@gmail.com
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
index 9e9343adc2b4..b6f42d0ee626 100644
--- a/drivers/tty/tty_io.c
+++ b/drivers/tty/tty_io.c
@@ -2173,8 +2173,6 @@ static int tty_fasync(int fd, struct file *filp, int on)
  *	Locking:
  *		Called functions take tty_ldiscs_lock
  *		current->signal->tty check is safe without locks
- *
- *	FIXME: may race normal receive processing
  */
 
 static int tiocsti(struct tty_struct *tty, char __user *p)
@@ -2190,8 +2188,10 @@ static int tiocsti(struct tty_struct *tty, char __user *p)
 	ld = tty_ldisc_ref_wait(tty);
 	if (!ld)
 		return -EIO;
+	tty_buffer_lock_exclusive(tty->port);
 	if (ld->ops->receive_buf)
 		ld->ops->receive_buf(tty, &ch, &mbz, 1);
+	tty_buffer_unlock_exclusive(tty->port);
 	tty_ldisc_deref(ld);
 	return 0;
 }

commit 7e7b9f8867ad82a1ef495abb32f127d5142fb107
Author: Eric Biggers <ebiggers@google.com>
Date:   Wed Sep 8 14:50:33 2021 -0700

    ubifs: report correct st_size for encrypted symlinks
    
    commit 064c734986011390b4d111f1a99372b7f26c3850 upstream.
    
    The stat() family of syscalls report the wrong size for encrypted
    symlinks, which has caused breakage in several userspace programs.
    
    Fix this by calling fscrypt_symlink_getattr() after ubifs_getattr() for
    encrypted symlinks.  This function computes the correct size by reading
    and decrypting the symlink target (if it's not already cached).
    
    For more details, see the commit which added fscrypt_symlink_getattr().
    
    Fixes: ca7f85be8d6c ("ubifs: Add support for encrypted symlinks")
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210702065350.209646-5-ebiggers@kernel.org
    Signed-off-by: Eric Biggers <ebiggers@google.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c
index d7d2fdda4bbd..3dbb5ac630e4 100644
--- a/fs/ubifs/file.c
+++ b/fs/ubifs/file.c
@@ -1642,6 +1642,16 @@ static const char *ubifs_get_link(struct dentry *dentry,
 	return fscrypt_get_symlink(inode, ui->data, ui->data_len, done);
 }
 
+static int ubifs_symlink_getattr(const struct path *path, struct kstat *stat,
+				 u32 request_mask, unsigned int query_flags)
+{
+	ubifs_getattr(path, stat, request_mask, query_flags);
+
+	if (IS_ENCRYPTED(d_inode(path->dentry)))
+		return fscrypt_symlink_getattr(path, stat);
+	return 0;
+}
+
 const struct address_space_operations ubifs_file_address_operations = {
 	.readpage       = ubifs_readpage,
 	.writepage      = ubifs_writepage,
@@ -1669,7 +1679,7 @@ const struct inode_operations ubifs_file_inode_operations = {
 const struct inode_operations ubifs_symlink_inode_operations = {
 	.get_link    = ubifs_get_link,
 	.setattr     = ubifs_setattr,
-	.getattr     = ubifs_getattr,
+	.getattr     = ubifs_symlink_getattr,
 #ifdef CONFIG_UBIFS_FS_XATTR
 	.listxattr   = ubifs_listxattr,
 #endif

commit 8377a6af62992a55b19da1c3ac2b0c0ecae7e5ec
Author: Eric Biggers <ebiggers@google.com>
Date:   Wed Sep 8 14:50:32 2021 -0700

    f2fs: report correct st_size for encrypted symlinks
    
    commit 461b43a8f92e68e96c4424b31e15f2b35f1bbfa9 upstream.
    
    The stat() family of syscalls report the wrong size for encrypted
    symlinks, which has caused breakage in several userspace programs.
    
    Fix this by calling fscrypt_symlink_getattr() after f2fs_getattr() for
    encrypted symlinks.  This function computes the correct size by reading
    and decrypting the symlink target (if it's not already cached).
    
    For more details, see the commit which added fscrypt_symlink_getattr().
    
    Fixes: cbaf042a3cc6 ("f2fs crypto: add symlink encryption")
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210702065350.209646-4-ebiggers@kernel.org
    Signed-off-by: Eric Biggers <ebiggers@google.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c
index e20a0f9e6845..edc80855974a 100644
--- a/fs/f2fs/namei.c
+++ b/fs/f2fs/namei.c
@@ -1219,9 +1219,18 @@ static const char *f2fs_encrypted_get_link(struct dentry *dentry,
 	return target;
 }
 
+static int f2fs_encrypted_symlink_getattr(const struct path *path,
+					  struct kstat *stat, u32 request_mask,
+					  unsigned int query_flags)
+{
+	f2fs_getattr(path, stat, request_mask, query_flags);
+
+	return fscrypt_symlink_getattr(path, stat);
+}
+
 const struct inode_operations f2fs_encrypted_symlink_inode_operations = {
 	.get_link       = f2fs_encrypted_get_link,
-	.getattr	= f2fs_getattr,
+	.getattr	= f2fs_encrypted_symlink_getattr,
 	.setattr	= f2fs_setattr,
 #ifdef CONFIG_F2FS_FS_XATTR
 	.listxattr	= f2fs_listxattr,

commit 24eb2413d3f9e7fcf47b53b9934fa3eadbf20011
Author: Eric Biggers <ebiggers@google.com>
Date:   Wed Sep 8 14:50:31 2021 -0700

    ext4: report correct st_size for encrypted symlinks
    
    commit 8c4bca10ceafc43b1ca0a9fab5fa27e13cbce99e upstream.
    
    The stat() family of syscalls report the wrong size for encrypted
    symlinks, which has caused breakage in several userspace programs.
    
    Fix this by calling fscrypt_symlink_getattr() after ext4_getattr() for
    encrypted symlinks.  This function computes the correct size by reading
    and decrypting the symlink target (if it's not already cached).
    
    For more details, see the commit which added fscrypt_symlink_getattr().
    
    Fixes: f348c252320b ("ext4 crypto: add symlink encryption")
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210702065350.209646-3-ebiggers@kernel.org
    Signed-off-by: Eric Biggers <ebiggers@google.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ext4/symlink.c b/fs/ext4/symlink.c
index dd05af983092..a9457fed351e 100644
--- a/fs/ext4/symlink.c
+++ b/fs/ext4/symlink.c
@@ -52,10 +52,19 @@ static const char *ext4_encrypted_get_link(struct dentry *dentry,
 	return paddr;
 }
 
+static int ext4_encrypted_symlink_getattr(const struct path *path,
+					  struct kstat *stat, u32 request_mask,
+					  unsigned int query_flags)
+{
+	ext4_getattr(path, stat, request_mask, query_flags);
+
+	return fscrypt_symlink_getattr(path, stat);
+}
+
 const struct inode_operations ext4_encrypted_symlink_inode_operations = {
 	.get_link	= ext4_encrypted_get_link,
 	.setattr	= ext4_setattr,
-	.getattr	= ext4_getattr,
+	.getattr	= ext4_encrypted_symlink_getattr,
 	.listxattr	= ext4_listxattr,
 };
 

commit e675870b3625d921a4091063eb61eaf596996730
Author: Eric Biggers <ebiggers@google.com>
Date:   Wed Sep 8 14:50:30 2021 -0700

    fscrypt: add fscrypt_symlink_getattr() for computing st_size
    
    commit d18760560593e5af921f51a8c9b64b6109d634c2 upstream.
    
    Add a helper function fscrypt_symlink_getattr() which will be called
    from the various filesystems' ->getattr() methods to read and decrypt
    the target of encrypted symlinks in order to report the correct st_size.
    
    Detailed explanation:
    
    As required by POSIX and as documented in various man pages, st_size for
    a symlink is supposed to be the length of the symlink target.
    Unfortunately, st_size has always been wrong for encrypted symlinks
    because st_size is populated from i_size from disk, which intentionally
    contains the length of the encrypted symlink target.  That's slightly
    greater than the length of the decrypted symlink target (which is the
    symlink target that userspace usually sees), and usually won't match the
    length of the no-key encoded symlink target either.
    
    This hadn't been fixed yet because reporting the correct st_size would
    require reading the symlink target from disk and decrypting or encoding
    it, which historically has been considered too heavyweight to do in
    ->getattr().  Also historically, the wrong st_size had only broken a
    test (LTP lstat03) and there were no known complaints from real users.
    (This is probably because the st_size of symlinks isn't used too often,
    and when it is, typically it's for a hint for what buffer size to pass
    to readlink() -- which a slightly-too-large size still works for.)
    
    However, a couple things have changed now.  First, there have recently
    been complaints about the current behavior from real users:
    
    - Breakage in rpmbuild:
      https://github.com/rpm-software-management/rpm/issues/1682
      https://github.com/google/fscrypt/issues/305
    
    - Breakage in toybox cpio:
      https://www.mail-archive.com/toybox@lists.landley.net/msg07193.html
    
    - Breakage in libgit2: https://issuetracker.google.com/issues/189629152
      (on Android public issue tracker, requires login)
    
    Second, we now cache decrypted symlink targets in ->i_link.  Therefore,
    taking the performance hit of reading and decrypting the symlink target
    in ->getattr() wouldn't be as big a deal as it used to be, since usually
    it will just save having to do the same thing later.
    
    Also note that eCryptfs ended up having to read and decrypt symlink
    targets in ->getattr() as well, to fix this same issue; see
    commit 3a60a1686f0d ("eCryptfs: Decrypt symlink target for stat size").
    
    So, let's just bite the bullet, and read and decrypt the symlink target
    in ->getattr() in order to report the correct st_size.  Add a function
    fscrypt_symlink_getattr() which the filesystems will call to do this.
    
    (Alternatively, we could store the decrypted size of symlinks on-disk.
    But there isn't a great place to do so, and encryption is meant to hide
    the original size to some extent; that property would be lost.)
    
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210702065350.209646-2-ebiggers@kernel.org
    Signed-off-by: Eric Biggers <ebiggers@google.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/crypto/hooks.c b/fs/crypto/hooks.c
index aa86cb2db823..ae7a413c0bdd 100644
--- a/fs/crypto/hooks.c
+++ b/fs/crypto/hooks.c
@@ -279,3 +279,47 @@ const char *fscrypt_get_symlink(struct inode *inode, const void *caddr,
 	return ERR_PTR(err);
 }
 EXPORT_SYMBOL_GPL(fscrypt_get_symlink);
+
+/**
+ * fscrypt_symlink_getattr() - set the correct st_size for encrypted symlinks
+ * @path: the path for the encrypted symlink being queried
+ * @stat: the struct being filled with the symlink's attributes
+ *
+ * Override st_size of encrypted symlinks to be the length of the decrypted
+ * symlink target (or the no-key encoded symlink target, if the key is
+ * unavailable) rather than the length of the encrypted symlink target.  This is
+ * necessary for st_size to match the symlink target that userspace actually
+ * sees.  POSIX requires this, and some userspace programs depend on it.
+ *
+ * This requires reading the symlink target from disk if needed, setting up the
+ * inode's encryption key if possible, and then decrypting or encoding the
+ * symlink target.  This makes lstat() more heavyweight than is normally the
+ * case.  However, decrypted symlink targets will be cached in ->i_link, so
+ * usually the symlink won't have to be read and decrypted again later if/when
+ * it is actually followed, readlink() is called, or lstat() is called again.
+ *
+ * Return: 0 on success, -errno on failure
+ */
+int fscrypt_symlink_getattr(const struct path *path, struct kstat *stat)
+{
+	struct dentry *dentry = path->dentry;
+	struct inode *inode = d_inode(dentry);
+	const char *link;
+	DEFINE_DELAYED_CALL(done);
+
+	/*
+	 * To get the symlink target that userspace will see (whether it's the
+	 * decrypted target or the no-key encoded target), we can just get it in
+	 * the same way the VFS does during path resolution and readlink().
+	 */
+	link = READ_ONCE(inode->i_link);
+	if (!link) {
+		link = inode->i_op->get_link(dentry, inode, &done);
+		if (IS_ERR(link))
+			return PTR_ERR(link);
+	}
+	stat->size = strlen(link);
+	do_delayed_call(&done);
+	return 0;
+}
+EXPORT_SYMBOL_GPL(fscrypt_symlink_getattr);
diff --git a/include/linux/fscrypt_notsupp.h b/include/linux/fscrypt_notsupp.h
index 93304cfeb601..6e95c5a9b7fa 100644
--- a/include/linux/fscrypt_notsupp.h
+++ b/include/linux/fscrypt_notsupp.h
@@ -234,4 +234,10 @@ static inline const char *fscrypt_get_symlink(struct inode *inode,
 	return ERR_PTR(-EOPNOTSUPP);
 }
 
+static inline int fscrypt_symlink_getattr(const struct path *path,
+					  struct kstat *stat)
+{
+	return -EOPNOTSUPP;
+}
+
 #endif	/* _LINUX_FSCRYPT_NOTSUPP_H */
diff --git a/include/linux/fscrypt_supp.h b/include/linux/fscrypt_supp.h
index 0409c14ae1de..f4cb4871a987 100644
--- a/include/linux/fscrypt_supp.h
+++ b/include/linux/fscrypt_supp.h
@@ -231,5 +231,6 @@ extern int __fscrypt_encrypt_symlink(struct inode *inode, const char *target,
 extern const char *fscrypt_get_symlink(struct inode *inode, const void *caddr,
 				       unsigned int max_size,
 				       struct delayed_call *done);
+int fscrypt_symlink_getattr(const struct path *path, struct kstat *stat);
 
 #endif	/* _LINUX_FSCRYPT_SUPP_H */

commit f94601e19dd7e80bf12f42a7cdfed9652a9a01dc
Author: Guillaume Nault <gnault@redhat.com>
Date:   Mon Jan 13 22:39:22 2020 +0100

    netns: protect netns ID lookups with RCU
    
    commit 2dce224f469f060b9998a5a869151ef83c08ce77 upstream.
    
    __peernet2id() can be protected by RCU as it only calls idr_for_each(),
    which is RCU-safe, and never modifies the nsid table.
    
    rtnl_net_dumpid() can also do lockless lookups. It does two nested
    idr_for_each() calls on nsid tables (one direct call and one indirect
    call because of rtnl_net_dumpid_one() calling __peernet2id()). The
    netnsid tables are never updated. Therefore it is safe to not take the
    nsid_lock and run within an RCU-critical section instead.
    
    Signed-off-by: Guillaume Nault <gnault@redhat.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Håkon Bugge <haakon.bugge@oracle.com>

diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c
index 939d8a31eb82..26d70c00b054 100644
--- a/net/core/net_namespace.c
+++ b/net/core/net_namespace.c
@@ -192,9 +192,9 @@ static int net_eq_idr(int id, void *net, void *peer)
 	return 0;
 }
 
-/* Should be called with nsid_lock held. If a new id is assigned, the bool alloc
- * is set to true, thus the caller knows that the new id must be notified via
- * rtnl.
+/* Must be called from RCU-critical section or with nsid_lock held. If
+ * a new id is assigned, the bool alloc is set to true, thus the
+ * caller knows that the new id must be notified via rtnl.
  */
 static int __peernet2id_alloc(struct net *net, struct net *peer, bool *alloc)
 {
@@ -218,7 +218,7 @@ static int __peernet2id_alloc(struct net *net, struct net *peer, bool *alloc)
 	return NETNSA_NSID_NOT_ASSIGNED;
 }
 
-/* should be called with nsid_lock held */
+/* Must be called from RCU-critical section or with nsid_lock held */
 static int __peernet2id(struct net *net, struct net *peer)
 {
 	bool no = false;
@@ -261,9 +261,10 @@ int peernet2id(struct net *net, struct net *peer)
 {
 	int id;
 
-	spin_lock_bh(&net->nsid_lock);
+	rcu_read_lock();
 	id = __peernet2id(net, peer);
-	spin_unlock_bh(&net->nsid_lock);
+	rcu_read_unlock();
+
 	return id;
 }
 EXPORT_SYMBOL(peernet2id);
@@ -837,6 +838,7 @@ struct rtnl_net_dump_cb {
 	int s_idx;
 };
 
+/* Runs in RCU-critical section. */
 static int rtnl_net_dumpid_one(int id, void *peer, void *data)
 {
 	struct rtnl_net_dump_cb *net_cb = (struct rtnl_net_dump_cb *)data;
@@ -867,9 +869,9 @@ static int rtnl_net_dumpid(struct sk_buff *skb, struct netlink_callback *cb)
 		.s_idx = cb->args[0],
 	};
 
-	spin_lock_bh(&net->nsid_lock);
+	rcu_read_lock();
 	idr_for_each(&net->netns_ids, rtnl_net_dumpid_one, &net_cb);
-	spin_unlock_bh(&net->nsid_lock);
+	rcu_read_unlock();
 
 	cb->args[0] = net_cb.idx;
 	return skb->len;

commit 1d3e3d569712e994483643f17b95ebf83965d4f2
Author: Eric Dumazet <edumazet@google.com>
Date:   Mon Aug 30 19:02:10 2021 -0700

    ipv4: fix endianness issue in inet_rtm_getroute_build_skb()
    
    [ Upstream commit 92548b0ee220e000d81c27ac9a80e0ede895a881 ]
    
    The UDP length field should be in network order.
    This removes the following sparse error:
    
    net/ipv4/route.c:3173:27: warning: incorrect type in assignment (different base types)
    net/ipv4/route.c:3173:27:    expected restricted __be16 [usertype] len
    net/ipv4/route.c:3173:27:    got unsigned long
    
    Fixes: 404eb77ea766 ("ipv4: support sport, dport and ip_proto in RTM_GETROUTE")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Cc: Roopa Prabhu <roopa@nvidia.com>
    Cc: David Ahern <dsahern@kernel.org>
    Reviewed-by: David Ahern <dsahern@kernel.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index d72bffab6ffc..730a15fc497c 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -2815,7 +2815,7 @@ static struct sk_buff *inet_rtm_getroute_build_skb(__be32 src, __be32 dst,
 		udph = skb_put_zero(skb, sizeof(struct udphdr));
 		udph->source = sport;
 		udph->dest = dport;
-		udph->len = sizeof(struct udphdr);
+		udph->len = htons(sizeof(struct udphdr));
 		udph->check = 0;
 		break;
 	}

commit b754f6353bbe66fe03fccff7ddd4e8025e55e243
Author: Stefan Wahren <stefan.wahren@i2se.com>
Date:   Sat Aug 28 16:23:15 2021 +0200

    net: qualcomm: fix QCA7000 checksum handling
    
    [ Upstream commit 429205da6c834447a57279af128bdd56ccd5225e ]
    
    Based on tests the QCA7000 doesn't support checksum offloading. So assume
    ip_summed is CHECKSUM_NONE and let the kernel take care of the checksum
    handling. This fixes data transfer issues in noisy environments.
    
    Reported-by: Michael Heimpold <michael.heimpold@in-tech.com>
    Fixes: 291ab06ecf67 ("net: qualcomm: new Ethernet over SPI driver for QCA7000")
    Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/qualcomm/qca_spi.c b/drivers/net/ethernet/qualcomm/qca_spi.c
index 9d188931bc09..afd49c7fd87f 100644
--- a/drivers/net/ethernet/qualcomm/qca_spi.c
+++ b/drivers/net/ethernet/qualcomm/qca_spi.c
@@ -413,7 +413,7 @@ qcaspi_receive(struct qcaspi *qca)
 				skb_put(qca->rx_skb, retcode);
 				qca->rx_skb->protocol = eth_type_trans(
 					qca->rx_skb, qca->rx_skb->dev);
-				qca->rx_skb->ip_summed = CHECKSUM_UNNECESSARY;
+				skb_checksum_none_assert(qca->rx_skb);
 				netif_rx_ni(qca->rx_skb);
 				qca->rx_skb = netdev_alloc_skb_ip_align(net_dev,
 					net_dev->mtu + VLAN_ETH_HLEN);
diff --git a/drivers/net/ethernet/qualcomm/qca_uart.c b/drivers/net/ethernet/qualcomm/qca_uart.c
index db6068cd7a1f..466e9d07697a 100644
--- a/drivers/net/ethernet/qualcomm/qca_uart.c
+++ b/drivers/net/ethernet/qualcomm/qca_uart.c
@@ -107,7 +107,7 @@ qca_tty_receive(struct serdev_device *serdev, const unsigned char *data,
 			skb_put(qca->rx_skb, retcode);
 			qca->rx_skb->protocol = eth_type_trans(
 						qca->rx_skb, qca->rx_skb->dev);
-			qca->rx_skb->ip_summed = CHECKSUM_UNNECESSARY;
+			skb_checksum_none_assert(qca->rx_skb);
 			netif_rx_ni(qca->rx_skb);
 			qca->rx_skb = netdev_alloc_skb_ip_align(netdev,
 								netdev->mtu +

commit 5129766a9797ea212087314fafc68268f1bf8515
Author: Xiyu Yang <xiyuyang19@fudan.edu.cn>
Date:   Sun Aug 29 23:58:01 2021 +0800

    net: sched: Fix qdisc_rate_table refcount leak when get tcf_block failed
    
    [ Upstream commit c66070125837900163b81a03063ddd657a7e9bfb ]
    
    The reference counting issue happens in one exception handling path of
    cbq_change_class(). When failing to get tcf_block, the function forgets
    to decrease the refcount of "rtab" increased by qdisc_put_rtab(),
    causing a refcount leak.
    
    Fix this issue by jumping to "failure" label when get tcf_block failed.
    
    Fixes: 6529eaba33f0 ("net: sched: introduce tcf block infractructure")
    Signed-off-by: Xiyu Yang <xiyuyang19@fudan.edu.cn>
    Reviewed-by: Cong Wang <cong.wang@bytedance.com>
    Link: https://lore.kernel.org/r/1630252681-71588-1-git-send-email-xiyuyang19@fudan.edu.cn
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c
index ebc3c8c7e666..bc62e1b24653 100644
--- a/net/sched/sch_cbq.c
+++ b/net/sched/sch_cbq.c
@@ -1616,7 +1616,7 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **t
 	err = tcf_block_get(&cl->block, &cl->filter_list, sch, extack);
 	if (err) {
 		kfree(cl);
-		return err;
+		goto failure;
 	}
 
 	if (tca[TCA_RATE]) {

commit 3e6bd2b583f18da9856fc9741ffa200a74a52cba
Author: Eric Dumazet <edumazet@google.com>
Date:   Sun Aug 29 15:16:15 2021 -0700

    ipv4: make exception cache less predictible
    
    [ Upstream commit 67d6d681e15b578c1725bad8ad079e05d1c48a8e ]
    
    Even after commit 6457378fe796 ("ipv4: use siphash instead of Jenkins in
    fnhe_hashfun()"), an attacker can still use brute force to learn
    some secrets from a victim linux host.
    
    One way to defeat these attacks is to make the max depth of the hash
    table bucket a random value.
    
    Before this patch, each bucket of the hash table used to store exceptions
    could contain 6 items under attack.
    
    After the patch, each bucket would contains a random number of items,
    between 6 and 10. The attacker can no longer infer secrets.
    
    This is slightly increasing memory size used by the hash table,
    by 50% in average, we do not expect this to be a problem.
    
    This patch is more complex than the prior one (IPv6 equivalent),
    because IPv4 was reusing the oldest entry.
    Since we need to be able to evict more than one entry per
    update_or_create_fnhe() call, I had to replace
    fnhe_oldest() with fnhe_remove_oldest().
    
    Also note that we will queue extra kfree_rcu() calls under stress,
    which hopefully wont be a too big issue.
    
    Fixes: 4895c771c7f0 ("ipv4: Add FIB nexthop exceptions.")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: Keyu Man <kman001@ucr.edu>
    Cc: Willy Tarreau <w@1wt.eu>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Reviewed-by: David Ahern <dsahern@kernel.org>
    Tested-by: David Ahern <dsahern@kernel.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 1491d239385e..d72bffab6ffc 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -604,18 +604,25 @@ static void fnhe_flush_routes(struct fib_nh_exception *fnhe)
 	}
 }
 
-static struct fib_nh_exception *fnhe_oldest(struct fnhe_hash_bucket *hash)
+static void fnhe_remove_oldest(struct fnhe_hash_bucket *hash)
 {
-	struct fib_nh_exception *fnhe, *oldest;
+	struct fib_nh_exception __rcu **fnhe_p, **oldest_p;
+	struct fib_nh_exception *fnhe, *oldest = NULL;
 
-	oldest = rcu_dereference(hash->chain);
-	for (fnhe = rcu_dereference(oldest->fnhe_next); fnhe;
-	     fnhe = rcu_dereference(fnhe->fnhe_next)) {
-		if (time_before(fnhe->fnhe_stamp, oldest->fnhe_stamp))
+	for (fnhe_p = &hash->chain; ; fnhe_p = &fnhe->fnhe_next) {
+		fnhe = rcu_dereference_protected(*fnhe_p,
+						 lockdep_is_held(&fnhe_lock));
+		if (!fnhe)
+			break;
+		if (!oldest ||
+		    time_before(fnhe->fnhe_stamp, oldest->fnhe_stamp)) {
 			oldest = fnhe;
+			oldest_p = fnhe_p;
+		}
 	}
 	fnhe_flush_routes(oldest);
-	return oldest;
+	*oldest_p = oldest->fnhe_next;
+	kfree_rcu(oldest, rcu);
 }
 
 static inline u32 fnhe_hashfun(__be32 daddr)
@@ -692,16 +699,21 @@ static void update_or_create_fnhe(struct fib_nh *nh, __be32 daddr, __be32 gw,
 		if (rt)
 			fill_route_from_fnhe(rt, fnhe);
 	} else {
-		if (depth > FNHE_RECLAIM_DEPTH)
-			fnhe = fnhe_oldest(hash);
-		else {
-			fnhe = kzalloc(sizeof(*fnhe), GFP_ATOMIC);
-			if (!fnhe)
-				goto out_unlock;
-
-			fnhe->fnhe_next = hash->chain;
-			rcu_assign_pointer(hash->chain, fnhe);
+		/* Randomize max depth to avoid some side channels attacks. */
+		int max_depth = FNHE_RECLAIM_DEPTH +
+				prandom_u32_max(FNHE_RECLAIM_DEPTH);
+
+		while (depth > max_depth) {
+			fnhe_remove_oldest(hash);
+			depth--;
 		}
+
+		fnhe = kzalloc(sizeof(*fnhe), GFP_ATOMIC);
+		if (!fnhe)
+			goto out_unlock;
+
+		fnhe->fnhe_next = hash->chain;
+
 		fnhe->fnhe_genid = genid;
 		fnhe->fnhe_daddr = daddr;
 		fnhe->fnhe_gw = gw;
@@ -709,6 +721,8 @@ static void update_or_create_fnhe(struct fib_nh *nh, __be32 daddr, __be32 gw,
 		fnhe->fnhe_mtu_locked = lock;
 		fnhe->fnhe_expires = max(1UL, expires);
 
+		rcu_assign_pointer(hash->chain, fnhe);
+
 		/* Exception created; mark the cached routes for the nexthop
 		 * stale, so anyone caching it rechecks if this exception
 		 * applies to them.

commit 743a3ee3880e518ea714a09d40e08f0029674f3b
Author: Zenghui Yu <yuzenghui@huawei.com>
Date:   Tue Jul 27 10:52:31 2021 +0800

    bcma: Fix memory leak for internally-handled cores
    
    [ Upstream commit b63aed3ff195130fef12e0af590f4838cf0201d8 ]
    
    kmemleak reported that dev_name() of internally-handled cores were leaked
    on driver unbinding. Let's use device_initialize() to take refcounts for
    them and put_device() to properly free the related stuff.
    
    While looking at it, there's another potential issue for those which should
    be *registered* into driver core. If device_register() failed, we put
    device once and freed bcma_device structures. In bcma_unregister_cores(),
    they're treated as unregistered and we hit both UAF and double-free. That
    smells not good and has also been fixed now.
    
    Fixes: ab54bc8460b5 ("bcma: fill core details for every device")
    Signed-off-by: Zenghui Yu <yuzenghui@huawei.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210727025232.663-2-yuzenghui@huawei.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/bcma/main.c b/drivers/bcma/main.c
index fc1f4acdd189..c0f203deaf0b 100644
--- a/drivers/bcma/main.c
+++ b/drivers/bcma/main.c
@@ -236,6 +236,7 @@ EXPORT_SYMBOL(bcma_core_irq);
 
 void bcma_prepare_core(struct bcma_bus *bus, struct bcma_device *core)
 {
+	device_initialize(&core->dev);
 	core->dev.release = bcma_release_core_dev;
 	core->dev.bus = &bcma_bus_type;
 	dev_set_name(&core->dev, "bcma%d:%d", bus->num, core->core_index);
@@ -299,11 +300,10 @@ static void bcma_register_core(struct bcma_bus *bus, struct bcma_device *core)
 {
 	int err;
 
-	err = device_register(&core->dev);
+	err = device_add(&core->dev);
 	if (err) {
 		bcma_err(bus, "Could not register dev for core 0x%03X\n",
 			 core->id.id);
-		put_device(&core->dev);
 		return;
 	}
 	core->dev_registered = true;
@@ -394,7 +394,7 @@ void bcma_unregister_cores(struct bcma_bus *bus)
 	/* Now noone uses internally-handled cores, we can free them */
 	list_for_each_entry_safe(core, tmp, &bus->cores, list) {
 		list_del(&core->list);
-		kfree(core);
+		put_device(&core->dev);
 	}
 }
 

commit dd6bfcc343aba78be8ca69b55599fd772da120f4
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Fri Aug 13 14:34:38 2021 +0300

    ath6kl: wmi: fix an error code in ath6kl_wmi_sync_point()
    
    [ Upstream commit fd6729ec534cffbbeb3917761e6d1fe6a412d3fe ]
    
    This error path is unlikely because of it checked for NULL and
    returned -ENOMEM earlier in the function.  But it should return
    an error code here as well if we ever do hit it because of a
    race condition or something.
    
    Fixes: bdcd81707973 ("Add ath6kl cleaned up driver")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210813113438.GB30697@kili
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/ath/ath6kl/wmi.c b/drivers/net/wireless/ath/ath6kl/wmi.c
index 987ebae8ea0e..afa7a82ffd5d 100644
--- a/drivers/net/wireless/ath/ath6kl/wmi.c
+++ b/drivers/net/wireless/ath/ath6kl/wmi.c
@@ -2513,8 +2513,10 @@ static int ath6kl_wmi_sync_point(struct wmi *wmi, u8 if_idx)
 		goto free_data_skb;
 
 	for (index = 0; index < num_pri_streams; index++) {
-		if (WARN_ON(!data_sync_bufs[index].skb))
+		if (WARN_ON(!data_sync_bufs[index].skb)) {
+			ret = -ENOMEM;
 			goto free_data_skb;
+		}
 
 		ep_id = ath6kl_ac2_endpoint_id(wmi->parent_dev,
 					       data_sync_bufs[index].

commit 600624ecbe35e0359806b107f247811b1f79ad25
Author: Andy Duan <fugang.duan@nxp.com>
Date:   Thu Aug 19 10:10:33 2021 +0800

    tty: serial: fsl_lpuart: fix the wrong mapbase value
    
    [ Upstream commit d5c38948448abc2bb6b36dbf85a554bf4748885e ]
    
    Register offset needs to be applied on mapbase also.
    dma_tx/rx_request use the physical address of UARTDATA.
    Register offset is currently only applied to membase (the
    corresponding virtual addr) but not on mapbase.
    
    Fixes: 24b1e5f0e83c ("tty: serial: lpuart: add imx7ulp support")
    Reviewed-by: Leonard Crestez <leonard.crestez@nxp.com>
    Signed-off-by: Adriana Reus <adriana.reus@nxp.com>
    Signed-off-by: Sherry Sun <sherry.sun@nxp.com>
    Signed-off-by: Andy Duan <fugang.duan@nxp.com>
    Link: https://lore.kernel.org/r/20210819021033.32606-1-sherry.sun@nxp.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c
index deb9d4fa9cb0..b757fd1bdbfa 100644
--- a/drivers/tty/serial/fsl_lpuart.c
+++ b/drivers/tty/serial/fsl_lpuart.c
@@ -2164,7 +2164,7 @@ static int lpuart_probe(struct platform_device *pdev)
 		return PTR_ERR(sport->port.membase);
 
 	sport->port.membase += sdata->reg_off;
-	sport->port.mapbase = res->start;
+	sport->port.mapbase = res->start + sdata->reg_off;
 	sport->port.dev = &pdev->dev;
 	sport->port.type = PORT_LPUART;
 	ret = platform_get_irq(pdev, 0);

commit d4269f839184bd183a83d7b75f52bbb10788f85b
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Wed Aug 18 21:32:38 2021 +0200

    usb: bdc: Fix an error handling path in 'bdc_probe()' when no suitable DMA config is available
    
    [ Upstream commit d2f42e09393c774ab79088d8e3afcc62b3328fc9 ]
    
    If no suitable DMA configuration is available, a previous 'bdc_phy_init()'
    call must be undone by a corresponding 'bdc_phy_exit()' call.
    
    Branch to the existing error handling path instead of returning
    directly.
    
    Fixes: cc29d4f67757 ("usb: bdc: Add support for USB phy")
    Acked-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Link: https://lore.kernel.org/r/0c5910979f39225d5d8fe68c9ab1c147c68ddee1.1629314734.git.christophe.jaillet@wanadoo.fr
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/udc/bdc/bdc_core.c b/drivers/usb/gadget/udc/bdc/bdc_core.c
index e174b1b889da..d04de117bf63 100644
--- a/drivers/usb/gadget/udc/bdc/bdc_core.c
+++ b/drivers/usb/gadget/udc/bdc/bdc_core.c
@@ -568,7 +568,8 @@ static int bdc_probe(struct platform_device *pdev)
 		if (ret) {
 			dev_err(dev,
 				"No suitable DMA config available, abort\n");
-			return -ENOTSUPP;
+			ret = -ENOTSUPP;
+			goto phycleanup;
 		}
 		dev_dbg(dev, "Using 32-bit address\n");
 	}

commit 51a95e4d277bc31ab134240a72c2cab8f8d7f778
Author: Evgeny Novikov <novikov@ispras.ru>
Date:   Wed Aug 25 20:09:02 2021 +0300

    usb: ehci-orion: Handle errors of clk_prepare_enable() in probe
    
    [ Upstream commit 4720f1bf4ee4a784d9ece05420ba33c9222a3004 ]
    
    ehci_orion_drv_probe() did not account for possible errors of
    clk_prepare_enable() that in particular could cause invocation of
    clk_disable_unprepare() on clocks that were not prepared/enabled yet,
    e.g. in remove or on handling errors of usb_add_hcd() in probe. Though,
    there were several patches fixing different issues with clocks in this
    driver, they did not solve this problem.
    
    Add handling of errors of clk_prepare_enable() in ehci_orion_drv_probe()
    to avoid calls of clk_disable_unprepare() without previous successful
    invocation of clk_prepare_enable().
    
    Found by Linux Driver Verification project (linuxtesting.org).
    
    Fixes: 8c869edaee07 ("ARM: Orion: EHCI: Add support for enabling clocks")
    Co-developed-by: Kirill Shilimanov <kirill.shilimanov@huawei.com>
    Reviewed-by: Andrew Lunn <andrew@lunn.ch>
    Acked-by: Alan Stern <stern@rowland.harvard.edu>
    Signed-off-by: Evgeny Novikov <novikov@ispras.ru>
    Signed-off-by: Kirill Shilimanov <kirill.shilimanov@huawei.com>
    Link: https://lore.kernel.org/r/20210825170902.11234-1-novikov@ispras.ru
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c
index 1ad72647a069..da0f36af0b38 100644
--- a/drivers/usb/host/ehci-orion.c
+++ b/drivers/usb/host/ehci-orion.c
@@ -250,8 +250,11 @@ static int ehci_orion_drv_probe(struct platform_device *pdev)
 	 * the clock does not exists.
 	 */
 	priv->clk = devm_clk_get(&pdev->dev, NULL);
-	if (!IS_ERR(priv->clk))
-		clk_prepare_enable(priv->clk);
+	if (!IS_ERR(priv->clk)) {
+		err = clk_prepare_enable(priv->clk);
+		if (err)
+			goto err_put_hcd;
+	}
 
 	priv->phy = devm_phy_optional_get(&pdev->dev, "usb");
 	if (IS_ERR(priv->phy)) {
@@ -312,6 +315,7 @@ static int ehci_orion_drv_probe(struct platform_device *pdev)
 err_phy_get:
 	if (!IS_ERR(priv->clk))
 		clk_disable_unprepare(priv->clk);
+err_put_hcd:
 	usb_put_hcd(hcd);
 err:
 	dev_err(&pdev->dev, "init %s fail, %d\n",

commit d009f519e56c9293056148fa596d33878eb21a75
Author: Sergey Shtylyov <s.shtylyov@omp.ru>
Date:   Sun Jul 4 17:38:45 2021 +0300

    i2c: mt65xx: fix IRQ check
    
    [ Upstream commit 58fb7c643d346e2364404554f531cfa6a1a3917c ]
    
    Iff platform_get_irq() returns 0, the driver's probe() method will return 0
    early (as if the method's call was successful).  Let's consider IRQ0 valid
    for simplicity -- devm_request_irq() can always override that decision...
    
    Fixes: ce38815d39ea ("I2C: mediatek: Add driver for MediaTek I2C controller")
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omprussia.ru>
    Reviewed-by: Qii Wang <qii.wang@mediatek.com>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/i2c/busses/i2c-mt65xx.c b/drivers/i2c/busses/i2c-mt65xx.c
index 2bb4d20ead32..e09b065a6aff 100644
--- a/drivers/i2c/busses/i2c-mt65xx.c
+++ b/drivers/i2c/busses/i2c-mt65xx.c
@@ -804,7 +804,7 @@ static int mtk_i2c_probe(struct platform_device *pdev)
 		return PTR_ERR(i2c->pdmabase);
 
 	irq = platform_get_irq(pdev, 0);
-	if (irq <= 0)
+	if (irq < 0)
 		return irq;
 
 	init_completion(&i2c->msg_complete);

commit bea655491daf39f1934a71bf576bf3499092d3a4
Author: Len Baker <len.baker@gmx.com>
Date:   Tue Aug 17 12:27:09 2021 +0200

    CIFS: Fix a potencially linear read overflow
    
    [ Upstream commit f980d055a0f858d73d9467bb0b570721bbfcdfb8 ]
    
    strlcpy() reads the entire source buffer first. This read may exceed the
    destination size limit. This is both inefficient and can lead to linear
    read overflows if a source string is not NUL-terminated.
    
    Also, the strnlen() call does not avoid the read overflow in the strlcpy
    function when a not NUL-terminated string is passed.
    
    So, replace this block by a call to kstrndup() that avoids this type of
    overflow and does the same.
    
    Fixes: 066ce6899484d ("cifs: rename cifs_strlcpy_to_host and make it use new functions")
    Signed-off-by: Len Baker <len.baker@gmx.com>
    Reviewed-by: Paulo Alcantara (SUSE) <pc@cjr.nz>
    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/cifs/cifs_unicode.c b/fs/cifs/cifs_unicode.c
index 9986817532b1..7932e20555d2 100644
--- a/fs/cifs/cifs_unicode.c
+++ b/fs/cifs/cifs_unicode.c
@@ -371,14 +371,9 @@ cifs_strndup_from_utf16(const char *src, const int maxlen,
 		if (!dst)
 			return NULL;
 		cifs_from_utf16(dst, (__le16 *) src, len, maxlen, codepage,
-			       NO_MAP_UNI_RSVD);
+				NO_MAP_UNI_RSVD);
 	} else {
-		len = strnlen(src, maxlen);
-		len++;
-		dst = kmalloc(len, GFP_KERNEL);
-		if (!dst)
-			return NULL;
-		strlcpy(dst, src, len);
+		dst = kstrndup(src, maxlen, GFP_KERNEL);
 	}
 
 	return dst;

commit a3349b3a4ca50b2821de2291657961fb43bef4d2
Author: Tony Lindgren <tony@atomide.com>
Date:   Tue Aug 10 11:16:44 2021 +0300

    mmc: moxart: Fix issue with uninitialized dma_slave_config
    
    [ Upstream commit ee5165354d498e5bceb0b386e480ac84c5f8c28c ]
    
    Depending on the DMA driver being used, the struct dma_slave_config may
    need to be initialized to zero for the unused data.
    
    For example, we have three DMA drivers using src_port_window_size and
    dst_port_window_size. If these are left uninitialized, it can cause DMA
    failures.
    
    For moxart, this is probably not currently an issue but is still good to
    fix though.
    
    Fixes: 1b66e94e6b99 ("mmc: moxart: Add MOXA ART SD/MMC driver")
    Cc: Jonas Jensen <jonas.jensen@gmail.com>
    Cc: Vinod Koul <vkoul@kernel.org>
    Cc: Peter Ujfalusi <peter.ujfalusi@gmail.com>
    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Link: https://lore.kernel.org/r/20210810081644.19353-3-tony@atomide.com
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mmc/host/moxart-mmc.c b/drivers/mmc/host/moxart-mmc.c
index a0670e9cd012..5553a5643f40 100644
--- a/drivers/mmc/host/moxart-mmc.c
+++ b/drivers/mmc/host/moxart-mmc.c
@@ -631,6 +631,7 @@ static int moxart_probe(struct platform_device *pdev)
 			 host->dma_chan_tx, host->dma_chan_rx);
 		host->have_dma = true;
 
+		memset(&cfg, 0, sizeof(cfg));
 		cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
 		cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
 

commit 8dedc73c5edbcf909434783f5195beec3fe85bec
Author: Tony Lindgren <tony@atomide.com>
Date:   Tue Aug 10 11:16:43 2021 +0300

    mmc: dw_mmc: Fix issue with uninitialized dma_slave_config
    
    [ Upstream commit c3ff0189d3bc9c03845fe37472c140f0fefd0c79 ]
    
    Depending on the DMA driver being used, the struct dma_slave_config may
    need to be initialized to zero for the unused data.
    
    For example, we have three DMA drivers using src_port_window_size and
    dst_port_window_size. If these are left uninitialized, it can cause DMA
    failures.
    
    For dw_mmc, this is probably not currently an issue but is still good to
    fix though.
    
    Fixes: 3fc7eaef44db ("mmc: dw_mmc: Add external dma interface support")
    Cc: Shawn Lin <shawn.lin@rock-chips.com>
    Cc: Jaehoon Chung <jh80.chung@samsung.com>
    Cc: Peter Ujfalusi <peter.ujfalusi@gmail.com>
    Cc: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Link: https://lore.kernel.org/r/20210810081644.19353-2-tony@atomide.com
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
index 8e09586f880f..e3991df078ef 100644
--- a/drivers/mmc/host/dw_mmc.c
+++ b/drivers/mmc/host/dw_mmc.c
@@ -808,6 +808,7 @@ static int dw_mci_edmac_start_dma(struct dw_mci *host,
 	int ret = 0;
 
 	/* Set external dma config: burst size, burst width */
+	memset(&cfg, 0, sizeof(cfg));
 	cfg.dst_addr = host->phy_regs + fifo_offset;
 	cfg.src_addr = cfg.dst_addr;
 	cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;

commit 92680bc8f0b2f0c90590cab16505e1892b700ed7
Author: Sergey Shtylyov <s.shtylyov@omp.ru>
Date:   Sun Jul 4 17:45:25 2021 +0300

    i2c: s3c2410: fix IRQ check
    
    [ Upstream commit d6840a5e370b7ea4fde16ce2caf431bcc87f9a75 ]
    
    Iff platform_get_irq() returns 0, the driver's probe() method will return 0
    early (as if the method's call was successful).  Let's consider IRQ0 valid
    for simplicity -- devm_request_irq() can always override that decision...
    
    Fixes: e0d1ec97853f ("i2c-s3c2410: Change IRQ to be plain integer.")
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru>
    Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c
index d3603e261a84..4c6036920388 100644
--- a/drivers/i2c/busses/i2c-s3c2410.c
+++ b/drivers/i2c/busses/i2c-s3c2410.c
@@ -1179,7 +1179,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev)
 	 */
 	if (!(i2c->quirks & QUIRK_POLL)) {
 		i2c->irq = ret = platform_get_irq(pdev, 0);
-		if (ret <= 0) {
+		if (ret < 0) {
 			dev_err(&pdev->dev, "cannot find IRQ\n");
 			clk_unprepare(i2c->clk);
 			return ret;

commit e4491423690e385d8db669e1b4f299b2c60e3e5e
Author: Sergey Shtylyov <s.shtylyov@omp.ru>
Date:   Thu Aug 12 23:35:09 2021 +0300

    i2c: iop3xx: fix deferred probing
    
    [ Upstream commit a1299505162ad00def3573260c2c68b9c8e8d697 ]
    
    When adding the code to handle platform_get_irq*() errors in the commit
    489447380a29 ("handle errors returned by platform_get_irq*()"), the
    actual error code was enforced to be -ENXIO in the driver for some
    strange reason.  This didn't matter much until the deferred probing was
    introduced -- which requires an actual error code to be propagated
    upstream from the failure site.
    
    While fixing this, also stop overriding the errors from request_irq() to
    -EIO (done since the pre-git era).
    
    Fixes: 489447380a29 ("[PATCH] handle errors returned by platform_get_irq*()")
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/i2c/busses/i2c-iop3xx.c b/drivers/i2c/busses/i2c-iop3xx.c
index 85cbe4b55578..d4fe7ccccb22 100644
--- a/drivers/i2c/busses/i2c-iop3xx.c
+++ b/drivers/i2c/busses/i2c-iop3xx.c
@@ -456,16 +456,14 @@ iop3xx_i2c_probe(struct platform_device *pdev)
 
 	irq = platform_get_irq(pdev, 0);
 	if (irq < 0) {
-		ret = -ENXIO;
+		ret = irq;
 		goto unmap;
 	}
 	ret = request_irq(irq, iop3xx_i2c_irq_handler, 0,
 				pdev->name, adapter_data);
 
-	if (ret) {
-		ret = -EIO;
+	if (ret)
 		goto unmap;
-	}
 
 	memcpy(new_adapter->name, pdev->name, strlen(pdev->name));
 	new_adapter->owner = THIS_MODULE;

commit c52204af399ac67db9eac43aff2d14a4df616bed
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Thu Aug 19 18:15:21 2021 +0300

    Bluetooth: add timeout sanity check to hci_inquiry
    
    [ Upstream commit f41a4b2b5eb7872109723dab8ae1603bdd9d9ec1 ]
    
    Syzbot hit "task hung" bug in hci_req_sync(). The problem was in
    unreasonable huge inquiry timeout passed from userspace.
    Fix it by adding sanity check for timeout value to hci_inquiry().
    
    Since hci_inquiry() is the only user of hci_req_sync() with user
    controlled timeout value, it makes sense to check timeout value in
    hci_inquiry() and don't touch hci_req_sync().
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-and-tested-by: syzbot+be2baed593ea56c6a84c@syzkaller.appspotmail.com
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index ec6150564f59..26acacb2fa95 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -1296,6 +1296,12 @@ int hci_inquiry(void __user *arg)
 		goto done;
 	}
 
+	/* Restrict maximum inquiry length to 60 seconds */
+	if (ir.length > 60) {
+		err = -EINVAL;
+		goto done;
+	}
+
 	hci_dev_lock(hdev);
 	if (inquiry_cache_age(hdev) > INQUIRY_CACHE_AGE_MAX ||
 	    inquiry_cache_empty(hdev) || ir.flags & IREQ_CACHE_FLUSH) {

commit 21c82201853d3c0a2d571cc6029fe9d55c934a6b
Author: Nadezda Lutovinova <lutovinova@ispras.ru>
Date:   Wed Aug 18 17:12:47 2021 +0300

    usb: gadget: mv_u3d: request_irq() after initializing UDC
    
    [ Upstream commit 2af0c5ffadaf9d13eca28409d4238b4e672942d3 ]
    
    If IRQ occurs between calling  request_irq() and  mv_u3d_eps_init(),
    then null pointer dereference occurs since u3d->eps[] wasn't
    initialized yet but used in mv_u3d_nuke().
    
    The patch puts registration of the interrupt handler after
    initializing of neccesery data.
    
    Found by Linux Driver Verification project (linuxtesting.org).
    
    Fixes: 90fccb529d24 ("usb: gadget: Gadget directory cleanup - group UDC drivers")
    Acked-by: Felipe Balbi <balbi@kernel.org>
    Signed-off-by: Nadezda Lutovinova <lutovinova@ispras.ru>
    Link: https://lore.kernel.org/r/20210818141247.4794-1-lutovinova@ispras.ru
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/udc/mv_u3d_core.c b/drivers/usb/gadget/udc/mv_u3d_core.c
index 35e02a8d0091..bdba3f48c052 100644
--- a/drivers/usb/gadget/udc/mv_u3d_core.c
+++ b/drivers/usb/gadget/udc/mv_u3d_core.c
@@ -1922,14 +1922,6 @@ static int mv_u3d_probe(struct platform_device *dev)
 		goto err_get_irq;
 	}
 	u3d->irq = r->start;
-	if (request_irq(u3d->irq, mv_u3d_irq,
-		IRQF_SHARED, driver_name, u3d)) {
-		u3d->irq = 0;
-		dev_err(&dev->dev, "Request irq %d for u3d failed\n",
-			u3d->irq);
-		retval = -ENODEV;
-		goto err_request_irq;
-	}
 
 	/* initialize gadget structure */
 	u3d->gadget.ops = &mv_u3d_ops;	/* usb_gadget_ops */
@@ -1942,6 +1934,15 @@ static int mv_u3d_probe(struct platform_device *dev)
 
 	mv_u3d_eps_init(u3d);
 
+	if (request_irq(u3d->irq, mv_u3d_irq,
+		IRQF_SHARED, driver_name, u3d)) {
+		u3d->irq = 0;
+		dev_err(&dev->dev, "Request irq %d for u3d failed\n",
+			u3d->irq);
+		retval = -ENODEV;
+		goto err_request_irq;
+	}
+
 	/* external vbus detection */
 	if (u3d->vbus) {
 		u3d->clock_gating = 1;
@@ -1965,8 +1966,8 @@ static int mv_u3d_probe(struct platform_device *dev)
 
 err_unregister:
 	free_irq(u3d->irq, u3d);
-err_request_irq:
 err_get_irq:
+err_request_irq:
 	kfree(u3d->status_req);
 err_alloc_status_req:
 	kfree(u3d->eps);

commit dce4b0050c31a9a7fcaeb00d71145d1cbe0bd2ac
Author: Chih-Kang Chang <gary.chang@realtek.com>
Date:   Mon Aug 16 16:51:28 2021 +0800

    mac80211: Fix insufficient headroom issue for AMSDU
    
    [ Upstream commit f50d2ff8f016b79a2ff4acd5943a1eda40c545d4 ]
    
    ieee80211_amsdu_realloc_pad() fails to account for extra_tx_headroom,
    the original reserved headroom might be eaten. Add the necessary
    extra_tx_headroom.
    
    Fixes: 6e0456b54545 ("mac80211: add A-MSDU tx support")
    Signed-off-by: Chih-Kang Chang <gary.chang@realtek.com>
    Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
    Link: https://lore.kernel.org/r/20210816085128.10931-2-pkshih@realtek.com
    [fix indentation]
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 3530d1a5fc98..5c5908127fcb 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -3142,7 +3142,9 @@ static bool ieee80211_amsdu_prepare_head(struct ieee80211_sub_if_data *sdata,
 	if (info->control.flags & IEEE80211_TX_CTRL_AMSDU)
 		return true;
 
-	if (!ieee80211_amsdu_realloc_pad(local, skb, sizeof(*amsdu_hdr)))
+	if (!ieee80211_amsdu_realloc_pad(local, skb,
+					 sizeof(*amsdu_hdr) +
+					 local->hw.extra_tx_headroom))
 		return false;
 
 	data = skb_push(skb, sizeof(*amsdu_hdr));

commit 5e2d2f05204f7ab9c645a1fb9f10a3f6393dd2fa
Author: Sergey Shtylyov <s.shtylyov@omp.ru>
Date:   Fri Aug 13 23:32:38 2021 +0300

    usb: phy: tahvo: add IRQ check
    
    [ Upstream commit 0d45a1373e669880b8beaecc8765f44cb0241e47 ]
    
    The driver neglects to check the result of platform_get_irq()'s call and
    blithely passes the negative error codes to request_threaded_irq() (which
    takes *unsigned* IRQ #), causing it to fail with -EINVAL, overriding an
    original error code.  Stop calling request_threaded_irq() with the invalid
    IRQ #s.
    
    Fixes: 9ba96ae5074c ("usb: omap1: Tahvo USB transceiver driver")
    Acked-by: Felipe Balbi <balbi@kernel.org>
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru>
    Link: https://lore.kernel.org/r/8280d6a4-8e9a-7cfe-1aa9-db586dc9afdf@omp.ru
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/phy/phy-tahvo.c b/drivers/usb/phy/phy-tahvo.c
index 0981abc3d1ad..60d390e28289 100644
--- a/drivers/usb/phy/phy-tahvo.c
+++ b/drivers/usb/phy/phy-tahvo.c
@@ -396,7 +396,9 @@ static int tahvo_usb_probe(struct platform_device *pdev)
 
 	dev_set_drvdata(&pdev->dev, tu);
 
-	tu->irq = platform_get_irq(pdev, 0);
+	tu->irq = ret = platform_get_irq(pdev, 0);
+	if (ret < 0)
+		return ret;
 	ret = request_threaded_irq(tu->irq, NULL, tahvo_usb_vbus_interrupt,
 				   IRQF_ONESHOT,
 				   "tahvo-vbus", tu);

commit 699b3dbadd41f4078377c583b6ecb4918d60442a
Author: Sergey Shtylyov <s.shtylyov@omp.ru>
Date:   Fri Aug 13 23:30:18 2021 +0300

    usb: host: ohci-tmio: add IRQ check
    
    [ Upstream commit 4ac5132e8a4300637a2da8f5d6bc7650db735b8a ]
    
    The driver neglects to check the  result of platform_get_irq()'s call and
    blithely passes the negative error codes to usb_add_hcd() (which takes
    *unsigned* IRQ #), causing request_irq() that it calls to fail with
    -EINVAL, overriding an original error code. Stop calling usb_add_hcd()
    with the invalid IRQ #s.
    
    Fixes: 78c73414f4f6 ("USB: ohci: add support for tmio-ohci cell")
    Acked-by: Alan Stern <stern@rowland.harvard.edu>
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru>
    Link: https://lore.kernel.org/r/402e1a45-a0a4-0e08-566a-7ca1331506b1@omp.ru
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/host/ohci-tmio.c b/drivers/usb/host/ohci-tmio.c
index a631dbb369d7..983a00e2988d 100644
--- a/drivers/usb/host/ohci-tmio.c
+++ b/drivers/usb/host/ohci-tmio.c
@@ -199,6 +199,9 @@ static int ohci_hcd_tmio_drv_probe(struct platform_device *dev)
 	if (!cell)
 		return -EINVAL;
 
+	if (irq < 0)
+		return irq;
+
 	hcd = usb_create_hcd(&ohci_tmio_hc_driver, &dev->dev, dev_name(&dev->dev));
 	if (!hcd) {
 		ret = -ENOMEM;

commit 60cf1b5fbc0260e7b6e69a2d4048c1c1f4ddd188
Author: Kai-Heng Feng <kai.heng.feng@canonical.com>
Date:   Tue Aug 10 12:53:15 2021 +0800

    Bluetooth: Move shutdown callback before flushing tx and rx queue
    
    [ Upstream commit 0ea53674d07fb6db2dd7a7ec2fdc85a12eb246c2 ]
    
    Commit 0ea9fd001a14 ("Bluetooth: Shutdown controller after workqueues
    are flushed or cancelled") introduced a regression that makes mtkbtsdio
    driver stops working:
    [   36.593956] Bluetooth: hci0: Firmware already downloaded
    [   46.814613] Bluetooth: hci0: Execution of wmt command timed out
    [   46.814619] Bluetooth: hci0: Failed to send wmt func ctrl (-110)
    
    The shutdown callback depends on the result of hdev->rx_work, so we
    should call it before flushing rx_work:
    -> btmtksdio_shutdown()
     -> mtk_hci_wmt_sync()
      -> __hci_cmd_send()
       -> wait for BTMTKSDIO_TX_WAIT_VND_EVT gets cleared
    
    -> btmtksdio_recv_event()
     -> hci_recv_frame()
      -> queue_work(hdev->workqueue, &hdev->rx_work)
       -> clears BTMTKSDIO_TX_WAIT_VND_EVT
    
    So move the shutdown callback before flushing TX/RX queue to resolve the
    issue.
    
    Reported-and-tested-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
    Tested-by: Hsin-Yi Wang <hsinyi@chromium.org>
    Cc: Guenter Roeck <linux@roeck-us.net>
    Fixes: 0ea9fd001a14 ("Bluetooth: Shutdown controller after workqueues are flushed or cancelled")
    Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 7a85f215da45..ec6150564f59 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -1622,6 +1622,14 @@ int hci_dev_do_close(struct hci_dev *hdev)
 	hci_request_cancel_all(hdev);
 	hci_req_sync_lock(hdev);
 
+	if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) &&
+	    !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
+	    test_bit(HCI_UP, &hdev->flags)) {
+		/* Execute vendor specific shutdown routine */
+		if (hdev->shutdown)
+			hdev->shutdown(hdev);
+	}
+
 	if (!test_and_clear_bit(HCI_UP, &hdev->flags)) {
 		cancel_delayed_work_sync(&hdev->cmd_timer);
 		hci_req_sync_unlock(hdev);

commit 2dab26f6754ee1fcb5b8eb52cafc5f9c7591b185
Author: Sergey Shtylyov <s.shtylyov@omp.ru>
Date:   Mon Aug 9 23:53:16 2021 +0300

    usb: phy: twl6030: add IRQ checks
    
    [ Upstream commit 0881e22c06e66af0b64773c91c8868ead3d01aa1 ]
    
    The driver neglects to check the result of platform_get_irq()'s calls and
    blithely passes the negative error codes to request_threaded_irq() (which
    takes *unsigned* IRQ #), causing them both to fail with -EINVAL, overriding
    an original error code.  Stop calling request_threaded_irq() with the
    invalid IRQ #s.
    
    Fixes: c33fad0c3748 ("usb: otg: Adding twl6030-usb transceiver driver for OMAP4430")
    Acked-by: Felipe Balbi <balbi@kernel.org>
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru>
    Link: https://lore.kernel.org/r/9507f50b-50f1-6dc4-f57c-3ed4e53a1c25@omp.ru
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/phy/phy-twl6030-usb.c b/drivers/usb/phy/phy-twl6030-usb.c
index dade34d70419..859af6113b45 100644
--- a/drivers/usb/phy/phy-twl6030-usb.c
+++ b/drivers/usb/phy/phy-twl6030-usb.c
@@ -342,6 +342,11 @@ static int twl6030_usb_probe(struct platform_device *pdev)
 	twl->irq2		= platform_get_irq(pdev, 1);
 	twl->linkstat		= MUSB_UNKNOWN;
 
+	if (twl->irq1 < 0)
+		return twl->irq1;
+	if (twl->irq2 < 0)
+		return twl->irq2;
+
 	twl->comparator.set_vbus	= twl6030_set_vbus;
 	twl->comparator.start_srp	= twl6030_start_srp;
 

commit 23479ea22202b0689693bb84e1ca327d3d3fe83a
Author: Sergey Shtylyov <s.shtylyov@omp.ru>
Date:   Mon Aug 9 23:50:18 2021 +0300

    usb: phy: fsl-usb: add IRQ check
    
    [ Upstream commit ecc2f30dbb25969908115c81ec23650ed982b004 ]
    
    The driver neglects to check the result of platform_get_irq()'s call and
    blithely passes the negative error codes to request_irq() (which takes
    *unsigned* IRQ #), causing it to fail with -EINVAL, overriding an original
    error code. Stop calling request_irq() with the invalid IRQ #s.
    
    Fixes: 0807c500a1a6 ("USB: add Freescale USB OTG Transceiver driver")
    Acked-by: Felipe Balbi <balbi@kernel.org>
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru>
    Link: https://lore.kernel.org/r/b0a86089-8b8b-122e-fd6d-73e8c2304964@omp.ru
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/phy/phy-fsl-usb.c b/drivers/usb/phy/phy-fsl-usb.c
index f7c96d209eda..981db219234e 100644
--- a/drivers/usb/phy/phy-fsl-usb.c
+++ b/drivers/usb/phy/phy-fsl-usb.c
@@ -873,6 +873,8 @@ int usb_otg_start(struct platform_device *pdev)
 
 	/* request irq */
 	p_otg->irq = platform_get_irq(pdev, 0);
+	if (p_otg->irq < 0)
+		return p_otg->irq;
 	status = request_irq(p_otg->irq, fsl_otg_isr,
 				IRQF_SHARED, driver_name, p_otg);
 	if (status) {

commit 99a53e692da25aeea6801c355f7b34b197a68efd
Author: Sergey Shtylyov <s.shtylyov@omp.ru>
Date:   Mon Aug 9 23:27:28 2021 +0300

    usb: gadget: udc: at91: add IRQ check
    
    [ Upstream commit 50855c31573b02963f0aa2aacfd4ea41c31ae0e0 ]
    
    The driver neglects to check the result of platform_get_irq()'s call and
    blithely passes the negative error codes to devm_request_irq() (which takes
    *unsigned* IRQ #), causing it to fail with -EINVAL, overriding an original
    error code. Stop calling devm_request_irq() with the invalid IRQ #s.
    
    Fixes: 8b2e76687b39 ("USB: AT91 UDC updates, mostly power management")
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru>
    Acked-by: Felipe Balbi <balbi@kernel.org>
    Link: https://lore.kernel.org/r/6654a224-739a-1a80-12f0-76d920f87b6c@omp.ru
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/udc/at91_udc.c b/drivers/usb/gadget/udc/at91_udc.c
index 03959dc86cfd..dd5cdcdfa403 100644
--- a/drivers/usb/gadget/udc/at91_udc.c
+++ b/drivers/usb/gadget/udc/at91_udc.c
@@ -1879,7 +1879,9 @@ static int at91udc_probe(struct platform_device *pdev)
 	clk_disable(udc->iclk);
 
 	/* request UDC and maybe VBUS irqs */
-	udc->udp_irq = platform_get_irq(pdev, 0);
+	udc->udp_irq = retval = platform_get_irq(pdev, 0);
+	if (retval < 0)
+		goto err_unprepare_iclk;
 	retval = devm_request_irq(dev, udc->udp_irq, at91_udc_irq, 0,
 				  driver_name, udc);
 	if (retval) {

commit a94fdd4b5661cc2f4c5e20f825049a594262ac18
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Fri Aug 6 11:15:13 2021 +0200

    drm/msm/dsi: Fix some reference counted resource leaks
    
    [ Upstream commit 6977cc89c87506ff17e6c05f0e37f46752256e82 ]
    
    'of_find_device_by_node()' takes a reference that must be released when
    not needed anymore.
    This is expected to be done in 'dsi_destroy()'.
    
    However, there are 2 issues in 'dsi_get_phy()'.
    
    First, if 'of_find_device_by_node()' succeeds but 'platform_get_drvdata()'
    returns NULL, 'msm_dsi->phy_dev' will still be NULL, and the reference
    won't be released in 'dsi_destroy()'.
    
    Secondly, as 'of_find_device_by_node()' already takes a reference, there is
    no need for an additional 'get_device()'.
    
    Move the assignment to 'msm_dsi->phy_dev' a few lines above and remove the
    unneeded 'get_device()' to solve both issues.
    
    Fixes: ec31abf6684e ("drm/msm/dsi: Separate PHY to another platform device")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Link: https://lore.kernel.org/r/f15bc57648a00e7c99f943903468a04639d50596.1628241097.git.christophe.jaillet@wanadoo.fr
    Signed-off-by: Rob Clark <robdclark@chromium.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/msm/dsi/dsi.c b/drivers/gpu/drm/msm/dsi/dsi.c
index ff8164cc6738..822cef472a7e 100644
--- a/drivers/gpu/drm/msm/dsi/dsi.c
+++ b/drivers/gpu/drm/msm/dsi/dsi.c
@@ -34,8 +34,10 @@ static int dsi_get_phy(struct msm_dsi *msm_dsi)
 	}
 
 	phy_pdev = of_find_device_by_node(phy_node);
-	if (phy_pdev)
+	if (phy_pdev) {
 		msm_dsi->phy = platform_get_drvdata(phy_pdev);
+		msm_dsi->phy_dev = &phy_pdev->dev;
+	}
 
 	of_node_put(phy_node);
 
@@ -44,8 +46,6 @@ static int dsi_get_phy(struct msm_dsi *msm_dsi)
 		return -EPROBE_DEFER;
 	}
 
-	msm_dsi->phy_dev = get_device(&phy_pdev->dev);
-
 	return 0;
 }
 

commit bc4b08383046f3282b6fa58cfcef05bd13e52b93
Author: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
Date:   Tue Aug 10 12:14:10 2021 +0800

    Bluetooth: fix repeated calls to sco_sock_kill
    
    [ Upstream commit e1dee2c1de2b4dd00eb44004a4bda6326ed07b59 ]
    
    In commit 4e1a720d0312 ("Bluetooth: avoid killing an already killed
    socket"), a check was added to sco_sock_kill to skip killing a socket
    if the SOCK_DEAD flag was set.
    
    This was done after a trace for a use-after-free bug showed that the
    same sock pointer was being killed twice.
    
    Unfortunately, this check prevents sco_sock_kill from running on any
    socket. sco_sock_kill kills a socket only if it's zapped and orphaned,
    however sock_orphan announces that the socket is dead before detaching
    it. i.e., orphaned sockets have the SOCK_DEAD flag set.
    
    To fix this, we remove the check for SOCK_DEAD, and avoid repeated
    calls to sco_sock_kill by removing incorrect calls in:
    
    1. sco_sock_timeout. The socket should not be killed on timeout as
    further processing is expected to be done. For example,
    sco_sock_connect sets the timer then waits for the socket to be
    connected or for an error to be returned.
    
    2. sco_conn_del. This function should clean up resources for the
    connection, but the socket itself should be cleaned up in
    sco_sock_release.
    
    3. sco_sock_close. Calls to sco_sock_close in sco_sock_cleanup_listen
    and sco_sock_release are followed by sco_sock_kill. Hence the
    duplicated call should be removed.
    
    Fixes: 4e1a720d0312 ("Bluetooth: avoid killing an already killed socket")
    Signed-off-by: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
    Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
index 2561e462400e..2fbea653540b 100644
--- a/net/bluetooth/sco.c
+++ b/net/bluetooth/sco.c
@@ -84,7 +84,6 @@ static void sco_sock_timeout(struct timer_list *t)
 	sk->sk_state_change(sk);
 	bh_unlock_sock(sk);
 
-	sco_sock_kill(sk);
 	sock_put(sk);
 }
 
@@ -176,7 +175,6 @@ static void sco_conn_del(struct hci_conn *hcon, int err)
 		sco_sock_clear_timer(sk);
 		sco_chan_del(sk, err);
 		bh_unlock_sock(sk);
-		sco_sock_kill(sk);
 		sock_put(sk);
 	}
 
@@ -393,8 +391,7 @@ static void sco_sock_cleanup_listen(struct sock *parent)
  */
 static void sco_sock_kill(struct sock *sk)
 {
-	if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket ||
-	    sock_flag(sk, SOCK_DEAD))
+	if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
 		return;
 
 	BT_DBG("sk %p state %d", sk, sk->sk_state);
@@ -446,7 +443,6 @@ static void sco_sock_close(struct sock *sk)
 	lock_sock(sk);
 	__sco_sock_close(sk);
 	release_sock(sk);
-	sco_sock_kill(sk);
 }
 
 static void sco_sock_init(struct sock *sk, struct sock *parent)

commit e751dfbab446815a204796c1392f7dffcfa86221
Author: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Date:   Thu Aug 5 09:21:10 2021 +0200

    arm64: dts: exynos: correct GIC CPU interfaces address range on Exynos7
    
    [ Upstream commit 01c72cad790cb6cd3ccbe4c1402b6cb6c6bbffd0 ]
    
    The GIC-400 CPU interfaces address range is defined as 0x2000-0x3FFF (by
    ARM).
    
    Reported-by: Sam Protsenko <semen.protsenko@linaro.org>
    Reported-by: Marc Zyngier <maz@kernel.org>
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Reviewed-by: Sam Protsenko <semen.protsenko@linaro.org>
    Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com>
    Fixes: b9024cbc937d ("arm64: dts: Add initial device tree support for exynos7")
    Link: https://lore.kernel.org/r/20210805072110.4730-1-krzysztof.kozlowski@canonical.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm64/boot/dts/exynos/exynos7.dtsi b/arch/arm64/boot/dts/exynos/exynos7.dtsi
index 5c5e57026c27..c607297922fd 100644
--- a/arch/arm64/boot/dts/exynos/exynos7.dtsi
+++ b/arch/arm64/boot/dts/exynos/exynos7.dtsi
@@ -91,7 +91,7 @@
 			#address-cells = <0>;
 			interrupt-controller;
 			reg =	<0x11001000 0x1000>,
-				<0x11002000 0x1000>,
+				<0x11002000 0x2000>,
 				<0x11004000 0x2000>,
 				<0x11006000 0x2000>;
 		};

commit 3d3971d4fd807eddb6e0b601394055eda4dbf132
Author: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Date:   Mon Jul 5 02:05:19 2021 +0300

    drm/msm/dpu: make dpu_hw_ctl_clear_all_blendstages clear necessary LMs
    
    [ Upstream commit a41cdb693595ae1904dd793fc15d6954f4295e27 ]
    
    dpu_hw_ctl_clear_all_blendstages() clears settings for the few first LMs
    instead of mixers actually used for the CTL. Change it to clear
    necessary data, using provided mixer ids.
    
    Fixes: 25fdd5933e4c ("drm/msm: Add SDM845 DPU support")
    Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
    Link: https://lore.kernel.org/r/20210704230519.4081467-1-dmitry.baryshkov@linaro.org
    Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
    Signed-off-by: Rob Clark <robdclark@chromium.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
index 79bafea66354..a40ea5c68572 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
@@ -296,10 +296,12 @@ static void dpu_hw_ctl_clear_all_blendstages(struct dpu_hw_ctl *ctx)
 	int i;
 
 	for (i = 0; i < ctx->mixer_count; i++) {
-		DPU_REG_WRITE(c, CTL_LAYER(LM_0 + i), 0);
-		DPU_REG_WRITE(c, CTL_LAYER_EXT(LM_0 + i), 0);
-		DPU_REG_WRITE(c, CTL_LAYER_EXT2(LM_0 + i), 0);
-		DPU_REG_WRITE(c, CTL_LAYER_EXT3(LM_0 + i), 0);
+		enum dpu_lm mixer_id = ctx->mixer_hw_caps[i].id;
+
+		DPU_REG_WRITE(c, CTL_LAYER(mixer_id), 0);
+		DPU_REG_WRITE(c, CTL_LAYER_EXT(mixer_id), 0);
+		DPU_REG_WRITE(c, CTL_LAYER_EXT2(mixer_id), 0);
+		DPU_REG_WRITE(c, CTL_LAYER_EXT3(mixer_id), 0);
 	}
 }
 

commit 518d8c3c34fa443821440fa6cdd8a62e58f70693
Author: Colin Ian King <colin.king@canonical.com>
Date:   Wed Aug 4 16:09:51 2021 +0100

    Bluetooth: increase BTNAMSIZ to 21 chars to fix potential buffer overflow
    
    [ Upstream commit 713baf3dae8f45dc8ada4ed2f5fdcbf94a5c274d ]
    
    An earlier commit replaced using batostr to using %pMR sprintf for the
    construction of session->name. Static analysis detected that this new
    method can use a total of 21 characters (including the trailing '\0')
    so we need to increase the BTNAMSIZ from 18 to 21 to fix potential
    buffer overflows.
    
    Addresses-Coverity: ("Out-of-bounds write")
    Fixes: fcb73338ed53 ("Bluetooth: Use %pMR in sprintf/seq_printf instead of batostr")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bluetooth/cmtp/cmtp.h b/net/bluetooth/cmtp/cmtp.h
index c32638dddbf9..f6b9dc4e408f 100644
--- a/net/bluetooth/cmtp/cmtp.h
+++ b/net/bluetooth/cmtp/cmtp.h
@@ -26,7 +26,7 @@
 #include <linux/types.h>
 #include <net/bluetooth/bluetooth.h>
 
-#define BTNAMSIZ 18
+#define BTNAMSIZ 21
 
 /* CMTP ioctl defines */
 #define CMTPCONNADD	_IOW('C', 200, int)

commit 23beb85d910f96ee5c7c8011fa8fb27a78ab80b7
Author: Stephan Gerhold <stephan@gerhold.net>
Date:   Mon Jul 12 15:57:03 2021 +0200

    soc: qcom: smsm: Fix missed interrupts if state changes while masked
    
    [ Upstream commit e3d4571955050736bbf3eda0a9538a09d9fcfce8 ]
    
    The SMSM driver detects interrupt edges by tracking the last state
    it has seen (and has triggered the interrupt handler for). This works
    fine, but only if the interrupt does not change state while masked.
    
    For example, if an interrupt is unmasked while the state is HIGH,
    the stored last_value for that interrupt might still be LOW. Then,
    when the remote processor triggers smsm_intr() we assume that nothing
    has changed, even though the state might have changed from HIGH to LOW.
    
    Attempt to fix this by checking the current remote state before
    unmasking an IRQ. Use atomic operations to avoid the interrupt handler
    from interfering with the unmask function.
    
    This fixes modem crashes in some edge cases with the BAM-DMUX driver.
    Specifically, the BAM-DMUX interrupt handler is not called for the
    HIGH -> LOW smsm state transition if the BAM-DMUX driver is loaded
    (and therefore unmasks the interrupt) after the modem was already started:
    
    qcom-q6v5-mss 4080000.remoteproc: fatal error received: a2_task.c:3188:
      Assert FALSE failed: A2 DL PER deadlock timer expired waiting for Apps ACK
    
    Fixes: c97c4090ff72 ("soc: qcom: smsm: Add driver for Qualcomm SMSM")
    Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
    Link: https://lore.kernel.org/r/20210712135703.324748-2-stephan@gerhold.net
    Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/soc/qcom/smsm.c b/drivers/soc/qcom/smsm.c
index 50214b620865..2b49d2c212da 100644
--- a/drivers/soc/qcom/smsm.c
+++ b/drivers/soc/qcom/smsm.c
@@ -117,7 +117,7 @@ struct smsm_entry {
 	DECLARE_BITMAP(irq_enabled, 32);
 	DECLARE_BITMAP(irq_rising, 32);
 	DECLARE_BITMAP(irq_falling, 32);
-	u32 last_value;
+	unsigned long last_value;
 
 	u32 *remote_state;
 	u32 *subscription;
@@ -212,8 +212,7 @@ static irqreturn_t smsm_intr(int irq, void *data)
 	u32 val;
 
 	val = readl(entry->remote_state);
-	changed = val ^ entry->last_value;
-	entry->last_value = val;
+	changed = val ^ xchg(&entry->last_value, val);
 
 	for_each_set_bit(i, entry->irq_enabled, 32) {
 		if (!(changed & BIT(i)))
@@ -274,6 +273,12 @@ static void smsm_unmask_irq(struct irq_data *irqd)
 	struct qcom_smsm *smsm = entry->smsm;
 	u32 val;
 
+	/* Make sure our last cached state is up-to-date */
+	if (readl(entry->remote_state) & BIT(irq))
+		set_bit(irq, &entry->last_value);
+	else
+		clear_bit(irq, &entry->last_value);
+
 	set_bit(irq, entry->irq_enabled);
 
 	if (entry->subscription) {

commit d4bcd29b50d1a33111d3bacd7974f0d0bbec484f
Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Date:   Thu Jul 29 16:49:10 2021 +0200

    PCI: PM: Enable PME if it can be signaled from D3cold
    
    [ Upstream commit 0e00392a895c95c6d12d42158236c8862a2f43f2 ]
    
    PME signaling is only enabled by __pci_enable_wake() if the target
    device can signal PME from the given target power state (to avoid
    pointless reconfiguration of the device), but if the hierarchy above
    the device goes into D3cold, the device itself will end up in D3cold
    too, so if it can signal PME from D3cold, it should be enabled to
    do so in __pci_enable_wake().
    
    [Note that if the device does not end up in D3cold and it cannot
     signal PME from the original target power state, it will not signal
     PME, so in that case the behavior does not change.]
    
    Link: https://lore.kernel.org/linux-pm/3149540.aeNJFYEL58@kreacher/
    Fixes: 5bcc2fb4e815 ("PCI PM: Simplify PCI wake-up code")
    Reported-by: Mika Westerberg <mika.westerberg@linux.intel.com>
    Reported-by: Utkarsh H Patel <utkarsh.h.patel@intel.com>
    Reported-by: Koba Ko <koba.ko@canonical.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
    Tested-by: Mika Westerberg <mika.westerberg@linux.intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index a9fc40458d62..1a78bf39ee9a 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -2170,7 +2170,14 @@ static int __pci_enable_wake(struct pci_dev *dev, pci_power_t state, bool enable
 	if (enable) {
 		int error;
 
-		if (pci_pme_capable(dev, state))
+		/*
+		 * Enable PME signaling if the device can signal PME from
+		 * D3cold regardless of whether or not it can signal PME from
+		 * the current target state, because that will allow it to
+		 * signal PME when the hierarchy above it goes into D3cold and
+		 * the device itself ends up in D3cold as a result of that.
+		 */
+		if (pci_pme_capable(dev, state) || pci_pme_capable(dev, PCI_D3cold))
 			pci_pme_active(dev, true);
 		else
 			ret = 1;

commit c5c62f4c936407fb734cae64700f20b68273b059
Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Date:   Thu Jul 29 17:54:28 2021 +0200

    PCI: PM: Avoid forcing PCI_D0 for wakeup reasons inconsistently
    
    [ Upstream commit da9f2150684ea684a7ddd6d7f0e38b2bdf43dcd8 ]
    
    It is inconsistent to return PCI_D0 from pci_target_state() instead
    of the original target state if 'wakeup' is true and the device
    cannot signal PME from D0.
    
    This only happens when the device cannot signal PME from the original
    target state and any shallower power states (including D0) and that
    case is effectively equivalent to the one in which PME singaling is
    not supported at all.  Since the original target state is returned in
    the latter case, make the function do that in the former one too.
    
    Link: https://lore.kernel.org/linux-pm/3149540.aeNJFYEL58@kreacher/
    Fixes: 666ff6f83e1d ("PCI/PM: Avoid using device_may_wakeup() for runtime PM")
    Reported-by: Mika Westerberg <mika.westerberg@linux.intel.com>
    Reported-by: Utkarsh H Patel <utkarsh.h.patel@intel.com>
    Reported-by: Koba Ko <koba.ko@canonical.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
    Tested-by: Mika Westerberg <mika.westerberg@linux.intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 9ebf32de8575..a9fc40458d62 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -2274,16 +2274,20 @@ static pci_power_t pci_target_state(struct pci_dev *dev, bool wakeup)
 	if (dev->current_state == PCI_D3cold)
 		target_state = PCI_D3cold;
 
-	if (wakeup) {
+	if (wakeup && dev->pme_support) {
+		pci_power_t state = target_state;
+
 		/*
 		 * Find the deepest state from which the device can generate
 		 * PME#.
 		 */
-		if (dev->pme_support) {
-			while (target_state
-			      && !(dev->pme_support & (1 << target_state)))
-				target_state--;
-		}
+		while (state && !(dev->pme_support & (1 << state)))
+			state--;
+
+		if (state)
+			return state;
+		else if (dev->pme_support & 1)
+			return PCI_D0;
 	}
 
 	return target_state;

commit a17484f832798cae4fa0beb105b70a2606c51f0d
Author: Colin Ian King <colin.king@canonical.com>
Date:   Fri Jul 9 14:30:25 2021 +0200

    media: venus: venc: Fix potential null pointer dereference on pointer fmt
    
    [ Upstream commit 09ea9719a423fc675d40dd05407165e161ea0c48 ]
    
    Currently the call to find_format can potentially return a NULL to
    fmt and the nullpointer is later dereferenced on the assignment of
    pixmp->num_planes = fmt->num_planes.  Fix this by adding a NULL pointer
    check and returning NULL for the failure case.
    
    Addresses-Coverity: ("Dereference null return")
    
    Fixes: aaaa93eda64b ("[media] media: venus: venc: add video encoder files")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Signed-off-by: Stanimir Varbanov <stanimir.varbanov@linaro.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/platform/qcom/venus/venc.c b/drivers/media/platform/qcom/venus/venc.c
index 420897241248..4197b311cff4 100644
--- a/drivers/media/platform/qcom/venus/venc.c
+++ b/drivers/media/platform/qcom/venus/venc.c
@@ -316,6 +316,8 @@ venc_try_fmt_common(struct venus_inst *inst, struct v4l2_format *f)
 		else
 			return NULL;
 		fmt = find_format(inst, pixmp->pixelformat, f->type);
+		if (!fmt)
+			return NULL;
 	}
 
 	pixmp->width = clamp(pixmp->width, frame_width_min(inst),

commit fba6d1d3645cf45f17c60faeb419dd3cc3fdd6e8
Author: Dongliang Mu <mudongliangabcd@gmail.com>
Date:   Wed Jul 7 11:34:09 2021 +0200

    media: em28xx-input: fix refcount bug in em28xx_usb_disconnect
    
    [ Upstream commit 6fa54bc713c262e1cfbc5613377ef52280d7311f ]
    
    If em28xx_ir_init fails, it would decrease the refcount of dev. However,
    in the em28xx_ir_fini, when ir is NULL, it goes to ref_put and decrease
    the refcount of dev. This will lead to a refcount bug.
    
    Fix this bug by removing the kref_put in the error handling code
    of em28xx_ir_init.
    
    refcount_t: underflow; use-after-free.
    WARNING: CPU: 0 PID: 7 at lib/refcount.c:28 refcount_warn_saturate+0x18e/0x1a0 lib/refcount.c:28
    Modules linked in:
    CPU: 0 PID: 7 Comm: kworker/0:1 Not tainted 5.13.0 #3
    Workqueue: usb_hub_wq hub_event
    RIP: 0010:refcount_warn_saturate+0x18e/0x1a0 lib/refcount.c:28
    Call Trace:
      kref_put.constprop.0+0x60/0x85 include/linux/kref.h:69
      em28xx_usb_disconnect.cold+0xd7/0xdc drivers/media/usb/em28xx/em28xx-cards.c:4150
      usb_unbind_interface+0xbf/0x3a0 drivers/usb/core/driver.c:458
      __device_release_driver drivers/base/dd.c:1201 [inline]
      device_release_driver_internal+0x22a/0x230 drivers/base/dd.c:1232
      bus_remove_device+0x108/0x160 drivers/base/bus.c:529
      device_del+0x1fe/0x510 drivers/base/core.c:3540
      usb_disable_device+0xd1/0x1d0 drivers/usb/core/message.c:1419
      usb_disconnect+0x109/0x330 drivers/usb/core/hub.c:2221
      hub_port_connect drivers/usb/core/hub.c:5151 [inline]
      hub_port_connect_change drivers/usb/core/hub.c:5440 [inline]
      port_event drivers/usb/core/hub.c:5586 [inline]
      hub_event+0xf81/0x1d40 drivers/usb/core/hub.c:5668
      process_one_work+0x2c9/0x610 kernel/workqueue.c:2276
      process_scheduled_works kernel/workqueue.c:2338 [inline]
      worker_thread+0x333/0x5b0 kernel/workqueue.c:2424
      kthread+0x188/0x1d0 kernel/kthread.c:319
      ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:295
    
    Reported-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Fixes: ac5688637144 ("media: em28xx: Fix possible memory leak of em28xx struct")
    Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Signed-off-by: Sean Young <sean@mess.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/usb/em28xx/em28xx-input.c b/drivers/media/usb/em28xx/em28xx-input.c
index 3612f0d730dd..92007a225d8e 100644
--- a/drivers/media/usb/em28xx/em28xx-input.c
+++ b/drivers/media/usb/em28xx/em28xx-input.c
@@ -865,7 +865,6 @@ static int em28xx_ir_init(struct em28xx *dev)
 	kfree(ir);
 ref_put:
 	em28xx_shutdown_buttons(dev);
-	kref_put(&dev->ref, em28xx_free_device);
 	return err;
 }
 

commit d9281b86a0b444ffc313212643ac192fc47eac8c
Author: Sergey Shtylyov <s.shtylyov@omp.ru>
Date:   Sun May 30 22:13:45 2021 +0300

    i2c: highlander: add IRQ check
    
    [ Upstream commit f16a3bb69aa6baabf8f0aca982c8cf21e2a4f6bc ]
    
    The driver is written as if platform_get_irq() returns 0 on errors (while
    actually it returns a negative error code), blithely passing these error
    codes to request_irq() (which takes *unsigned* IRQ #) -- which fails with
    -EINVAL. Add the necessary error check to the pre-existing *if* statement
    forcing the driver into the polling mode...
    
    Fixes: 4ad48e6ab18c ("i2c: Renesas Highlander FPGA SMBus support")
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/i2c/busses/i2c-highlander.c b/drivers/i2c/busses/i2c-highlander.c
index ff340d7ae2e5..6a880c262380 100644
--- a/drivers/i2c/busses/i2c-highlander.c
+++ b/drivers/i2c/busses/i2c-highlander.c
@@ -379,7 +379,7 @@ static int highlander_i2c_probe(struct platform_device *pdev)
 	platform_set_drvdata(pdev, dev);
 
 	dev->irq = platform_get_irq(pdev, 0);
-	if (iic_force_poll)
+	if (dev->irq < 0 || iic_force_poll)
 		dev->irq = 0;
 
 	if (dev->irq) {

commit b7d1479e2364430f62c97fe53b6ad7f3d3f5b13e
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Tue Jul 27 19:35:30 2021 +0300

    net: cipso: fix warnings in netlbl_cipsov4_add_std
    
    [ Upstream commit 8ca34a13f7f9b3fa2c464160ffe8cc1a72088204 ]
    
    Syzbot reported warning in netlbl_cipsov4_add(). The
    problem was in too big doi_def->map.std->lvl.local_size
    passed to kcalloc(). Since this value comes from userpace there is
    no need to warn if value is not correct.
    
    The same problem may occur with other kcalloc() calls in
    this function, so, I've added __GFP_NOWARN flag to all
    kcalloc() calls there.
    
    Reported-and-tested-by: syzbot+cdd51ee2e6b0b2e18c0d@syzkaller.appspotmail.com
    Fixes: 96cb8e3313c7 ("[NetLabel]: CIPSOv4 and Unlabeled packet integration")
    Acked-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netlabel/netlabel_cipso_v4.c b/net/netlabel/netlabel_cipso_v4.c
index 3e3494c8d42f..0559d442ad80 100644
--- a/net/netlabel/netlabel_cipso_v4.c
+++ b/net/netlabel/netlabel_cipso_v4.c
@@ -198,14 +198,14 @@ static int netlbl_cipsov4_add_std(struct genl_info *info,
 		}
 	doi_def->map.std->lvl.local = kcalloc(doi_def->map.std->lvl.local_size,
 					      sizeof(u32),
-					      GFP_KERNEL);
+					      GFP_KERNEL | __GFP_NOWARN);
 	if (doi_def->map.std->lvl.local == NULL) {
 		ret_val = -ENOMEM;
 		goto add_std_failure;
 	}
 	doi_def->map.std->lvl.cipso = kcalloc(doi_def->map.std->lvl.cipso_size,
 					      sizeof(u32),
-					      GFP_KERNEL);
+					      GFP_KERNEL | __GFP_NOWARN);
 	if (doi_def->map.std->lvl.cipso == NULL) {
 		ret_val = -ENOMEM;
 		goto add_std_failure;
@@ -273,7 +273,7 @@ static int netlbl_cipsov4_add_std(struct genl_info *info,
 		doi_def->map.std->cat.local = kcalloc(
 					      doi_def->map.std->cat.local_size,
 					      sizeof(u32),
-					      GFP_KERNEL);
+					      GFP_KERNEL | __GFP_NOWARN);
 		if (doi_def->map.std->cat.local == NULL) {
 			ret_val = -ENOMEM;
 			goto add_std_failure;
@@ -281,7 +281,7 @@ static int netlbl_cipsov4_add_std(struct genl_info *info,
 		doi_def->map.std->cat.cipso = kcalloc(
 					      doi_def->map.std->cat.cipso_size,
 					      sizeof(u32),
-					      GFP_KERNEL);
+					      GFP_KERNEL | __GFP_NOWARN);
 		if (doi_def->map.std->cat.cipso == NULL) {
 			ret_val = -ENOMEM;
 			goto add_std_failure;

commit 15bf24c5fb7948564397b450ead0441143d42af2
Author: Martin KaFai Lau <kafai@fb.com>
Date:   Thu Jul 1 13:05:41 2021 -0700

    tcp: seq_file: Avoid skipping sk during tcp_seek_last_pos
    
    [ Upstream commit 525e2f9fd0229eb10cb460a9e6d978257f24804e ]
    
    st->bucket stores the current bucket number.
    st->offset stores the offset within this bucket that is the sk to be
    seq_show().  Thus, st->offset only makes sense within the same
    st->bucket.
    
    These two variables are an optimization for the common no-lseek case.
    When resuming the seq_file iteration (i.e. seq_start()),
    tcp_seek_last_pos() tries to continue from the st->offset
    at bucket st->bucket.
    
    However, it is possible that the bucket pointed by st->bucket
    has changed and st->offset may end up skipping the whole st->bucket
    without finding a sk.  In this case, tcp_seek_last_pos() currently
    continues to satisfy the offset condition in the next (and incorrect)
    bucket.  Instead, regardless of the offset value, the first sk of the
    next bucket should be returned.  Thus, "bucket == st->bucket" check is
    added to tcp_seek_last_pos().
    
    The chance of hitting this is small and the issue is a decade old,
    so targeting for the next tree.
    
    Fixes: a8b690f98baf ("tcp: Fix slowness in read /proc/net/tcp")
    Signed-off-by: Martin KaFai Lau <kafai@fb.com>
    Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
    Reviewed-by: Eric Dumazet <edumazet@google.com>
    Acked-by: Kuniyuki Iwashima <kuniyu@amazon.co.jp>
    Acked-by: Yonghong Song <yhs@fb.com>
    Link: https://lore.kernel.org/bpf/20210701200541.1033917-1-kafai@fb.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index 71236aa7388d..de4edfbc9e46 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -2177,6 +2177,7 @@ static void *tcp_get_idx(struct seq_file *seq, loff_t pos)
 static void *tcp_seek_last_pos(struct seq_file *seq)
 {
 	struct tcp_iter_state *st = seq->private;
+	int bucket = st->bucket;
 	int offset = st->offset;
 	int orig_num = st->num;
 	void *rc = NULL;
@@ -2187,7 +2188,7 @@ static void *tcp_seek_last_pos(struct seq_file *seq)
 			break;
 		st->state = TCP_SEQ_STATE_LISTENING;
 		rc = listening_get_next(seq, NULL);
-		while (offset-- && rc)
+		while (offset-- && rc && bucket == st->bucket)
 			rc = listening_get_next(seq, rc);
 		if (rc)
 			break;
@@ -2198,7 +2199,7 @@ static void *tcp_seek_last_pos(struct seq_file *seq)
 		if (st->bucket > tcp_hashinfo.ehash_mask)
 			break;
 		rc = established_get_first(seq);
-		while (offset-- && rc)
+		while (offset-- && rc && bucket == st->bucket)
 			rc = established_get_next(seq, rc);
 	}
 

commit ba0a4e09a438871b9ce7052dfcc156e9df1c71b2
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Fri Jun 25 18:00:09 2021 +0300

    Bluetooth: sco: prevent information leak in sco_conn_defer_accept()
    
    [ Upstream commit 59da0b38bc2ea570ede23a3332ecb3e7574ce6b2 ]
    
    Smatch complains that some of these struct members are not initialized
    leading to a stack information disclosure:
    
        net/bluetooth/sco.c:778 sco_conn_defer_accept() warn:
        check that 'cp.retrans_effort' doesn't leak information
    
    This seems like a valid warning.  I've added a default case to fix
    this issue.
    
    Fixes: 2f69a82acf6f ("Bluetooth: Use voice setting in deferred SCO connection request")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
index a4ca55df7390..2561e462400e 100644
--- a/net/bluetooth/sco.c
+++ b/net/bluetooth/sco.c
@@ -761,6 +761,11 @@ static void sco_conn_defer_accept(struct hci_conn *conn, u16 setting)
 			cp.max_latency = cpu_to_le16(0xffff);
 			cp.retrans_effort = 0xff;
 			break;
+		default:
+			/* use CVSD settings as fallback */
+			cp.max_latency = cpu_to_le16(0xffff);
+			cp.retrans_effort = 0xff;
+			break;
 		}
 
 		hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ,

commit e5444d813ec17510d788930526be6d9926751812
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Sun Jun 20 21:45:42 2021 +0200

    media: go7007: remove redundant initialization
    
    [ Upstream commit 6f5885a7750545973bf1a942d2f0f129aef0aa06 ]
    
    In go7007_alloc() kzalloc() is used for struct go7007
    allocation. It means that there is no need in zeroing
    any members, because kzalloc will take care of it.
    
    Removing these reduntant initialization steps increases
    execution speed a lot:
    
            Before:
                    + 86.802 us   |    go7007_alloc();
            After:
                    + 29.595 us   |    go7007_alloc();
    
    Fixes: 866b8695d67e8 ("Staging: add the go7007 video driver")
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/usb/go7007/go7007-driver.c b/drivers/media/usb/go7007/go7007-driver.c
index 62aeebcdd7f7..c7b5a3321cd7 100644
--- a/drivers/media/usb/go7007/go7007-driver.c
+++ b/drivers/media/usb/go7007/go7007-driver.c
@@ -699,49 +699,23 @@ struct go7007 *go7007_alloc(const struct go7007_board_info *board,
 						struct device *dev)
 {
 	struct go7007 *go;
-	int i;
 
 	go = kzalloc(sizeof(struct go7007), GFP_KERNEL);
 	if (go == NULL)
 		return NULL;
 	go->dev = dev;
 	go->board_info = board;
-	go->board_id = 0;
 	go->tuner_type = -1;
-	go->channel_number = 0;
-	go->name[0] = 0;
 	mutex_init(&go->hw_lock);
 	init_waitqueue_head(&go->frame_waitq);
 	spin_lock_init(&go->spinlock);
 	go->status = STATUS_INIT;
-	memset(&go->i2c_adapter, 0, sizeof(go->i2c_adapter));
-	go->i2c_adapter_online = 0;
-	go->interrupt_available = 0;
 	init_waitqueue_head(&go->interrupt_waitq);
-	go->input = 0;
 	go7007_update_board(go);
-	go->encoder_h_halve = 0;
-	go->encoder_v_halve = 0;
-	go->encoder_subsample = 0;
 	go->format = V4L2_PIX_FMT_MJPEG;
 	go->bitrate = 1500000;
 	go->fps_scale = 1;
-	go->pali = 0;
 	go->aspect_ratio = GO7007_RATIO_1_1;
-	go->gop_size = 0;
-	go->ipb = 0;
-	go->closed_gop = 0;
-	go->repeat_seqhead = 0;
-	go->seq_header_enable = 0;
-	go->gop_header_enable = 0;
-	go->dvd_mode = 0;
-	go->interlace_coding = 0;
-	for (i = 0; i < 4; ++i)
-		go->modet[i].enable = 0;
-	for (i = 0; i < 1624; ++i)
-		go->modet_map[i] = 0;
-	go->audio_deliver = NULL;
-	go->audio_enabled = 0;
 
 	return go;
 }

commit b9e50e35338041d7b30ac968898f7ff98f486e45
Author: Dongliang Mu <mudongliangabcd@gmail.com>
Date:   Fri Jun 25 07:59:04 2021 +0200

    media: dvb-usb: fix uninit-value in vp702x_read_mac_addr
    
    [ Upstream commit 797c061ad715a9a1480eb73f44b6939fbe3209ed ]
    
    If vp702x_usb_in_op fails, the mac address is not initialized.
    And vp702x_read_mac_addr does not handle this failure, which leads to
    the uninit-value in dvb_usb_adapter_dvb_init.
    
    Fix this by handling the failure of vp702x_usb_in_op.
    
    Fixes: 786baecfe78f ("[media] dvb-usb: move it to drivers/media/usb/dvb-usb")
    Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Signed-off-by: Sean Young <sean@mess.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/usb/dvb-usb/vp702x.c b/drivers/media/usb/dvb-usb/vp702x.c
index c3529ea59da9..fcd66757b34d 100644
--- a/drivers/media/usb/dvb-usb/vp702x.c
+++ b/drivers/media/usb/dvb-usb/vp702x.c
@@ -294,16 +294,22 @@ static int vp702x_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
 static int vp702x_read_mac_addr(struct dvb_usb_device *d,u8 mac[6])
 {
 	u8 i, *buf;
+	int ret;
 	struct vp702x_device_state *st = d->priv;
 
 	mutex_lock(&st->buf_mutex);
 	buf = st->buf;
-	for (i = 6; i < 12; i++)
-		vp702x_usb_in_op(d, READ_EEPROM_REQ, i, 1, &buf[i - 6], 1);
+	for (i = 6; i < 12; i++) {
+		ret = vp702x_usb_in_op(d, READ_EEPROM_REQ, i, 1,
+				       &buf[i - 6], 1);
+		if (ret < 0)
+			goto err;
+	}
 
 	memcpy(mac, buf, 6);
+err:
 	mutex_unlock(&st->buf_mutex);
-	return 0;
+	return ret;
 }
 
 static int vp702x_frontend_attach(struct dvb_usb_adapter *adap)

commit 811cb97224ced0066b830c5f2782a2864e2cb91e
Author: Dongliang Mu <mudongliangabcd@gmail.com>
Date:   Fri Jun 25 07:33:27 2021 +0200

    media: dvb-usb: fix uninit-value in dvb_usb_adapter_dvb_init
    
    [ Upstream commit c5453769f77ce19a5b03f1f49946fd3f8a374009 ]
    
    If dibusb_read_eeprom_byte fails, the mac address is not initialized.
    And nova_t_read_mac_address does not handle this failure, which leads to
    the uninit-value in dvb_usb_adapter_dvb_init.
    
    Fix this by handling the failure of dibusb_read_eeprom_byte.
    
    Reported-by: syzbot+e27b4fd589762b0b9329@syzkaller.appspotmail.com
    Fixes: 786baecfe78f ("[media] dvb-usb: move it to drivers/media/usb/dvb-usb")
    Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Signed-off-by: Sean Young <sean@mess.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/usb/dvb-usb/nova-t-usb2.c b/drivers/media/usb/dvb-usb/nova-t-usb2.c
index 43e0e0fd715b..705c2901a89e 100644
--- a/drivers/media/usb/dvb-usb/nova-t-usb2.c
+++ b/drivers/media/usb/dvb-usb/nova-t-usb2.c
@@ -133,7 +133,7 @@ static int nova_t_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
 
 static int nova_t_read_mac_address (struct dvb_usb_device *d, u8 mac[6])
 {
-	int i;
+	int i, ret;
 	u8 b;
 
 	mac[0] = 0x00;
@@ -142,7 +142,9 @@ static int nova_t_read_mac_address (struct dvb_usb_device *d, u8 mac[6])
 
 	/* this is a complete guess, but works for my box */
 	for (i = 136; i < 139; i++) {
-		dibusb_read_eeprom_byte(d,i, &b);
+		ret = dibusb_read_eeprom_byte(d, i, &b);
+		if (ret)
+			return ret;
 
 		mac[5 - (i - 136)] = b;
 	}

commit 01db625eb1b03f12bfaa198a460a939ab62ef64e
Author: Geert Uytterhoeven <geert+renesas@glider.be>
Date:   Mon Feb 8 15:38:55 2021 +0100

    soc: rockchip: ROCKCHIP_GRF should not default to y, unconditionally
    
    [ Upstream commit 2a1c55d4762dd34a8b0f2e36fb01b7b16b60735b ]
    
    Merely enabling CONFIG_COMPILE_TEST should not enable additional code.
    To fix this, restrict the automatic enabling of ROCKCHIP_GRF to
    ARCH_ROCKCHIP, and ask the user in case of compile-testing.
    
    Fixes: 4c58063d4258f6be ("soc: rockchip: add driver handling grf setup")
    Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
    Link: https://lore.kernel.org/r/20210208143855.418374-1-geert+renesas@glider.be
    Signed-off-by: Heiko Stuebner <heiko@sntech.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/soc/rockchip/Kconfig b/drivers/soc/rockchip/Kconfig
index 20da55d9cbb1..d483b0e29b81 100644
--- a/drivers/soc/rockchip/Kconfig
+++ b/drivers/soc/rockchip/Kconfig
@@ -5,8 +5,8 @@ if ARCH_ROCKCHIP || COMPILE_TEST
 #
 
 config ROCKCHIP_GRF
-	bool
-	default y
+	bool "Rockchip General Register Files support" if COMPILE_TEST
+	default y if ARCH_ROCKCHIP
 	help
 	  The General Register Files are a central component providing
 	  special additional settings registers for a lot of soc-components.

commit 6b0bb0c2fbb7f69a0108f5712f05d130255ca1e7
Author: Krzysztof Ha?asa <khalasa@piap.pl>
Date:   Wed Jun 16 07:13:55 2021 +0200

    media: TDA1997x: enable EDID support
    
    [ Upstream commit ea3e1c36e38810427485f06c2becc1f29e54521d ]
    
    Without this patch, the TDA19971 chip's EDID is inactive.
    EDID never worked with this driver, it was all tested with HDMI signal
    sources which don't need EDID support.
    
    Signed-off-by: Krzysztof Halasa <khalasa@piap.pl>
    Fixes: 9ac0038db9a7 ("media: i2c: Add TDA1997x HDMI receiver driver")
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/i2c/tda1997x.c b/drivers/media/i2c/tda1997x.c
index d114ac5243ec..dab441bbc9f0 100644
--- a/drivers/media/i2c/tda1997x.c
+++ b/drivers/media/i2c/tda1997x.c
@@ -2229,6 +2229,7 @@ static int tda1997x_core_init(struct v4l2_subdev *sd)
 	/* get initial HDMI status */
 	state->hdmi_status = io_read(sd, REG_HDMI_FLAGS);
 
+	io_write(sd, REG_EDID_ENABLE, EDID_ENABLE_A_EN | EDID_ENABLE_B_EN);
 	return 0;
 }
 

commit ae2f93104e8cd0fac969d471f3396c073956d5af
Author: Chunyan Zhang <chunyan.zhang@unisoc.com>
Date:   Thu Aug 26 17:15:46 2021 +0800

    spi: sprd: Fix the wrong WDG_LOAD_VAL
    
    [ Upstream commit 245ca2cc212bb2a078332ec99afbfbb202f44c2d ]
    
    Use 50ms as default timeout value and the time clock is 32768HZ.
    The original value of WDG_LOAD_VAL is not correct, so this patch
    fixes it.
    
    Fixes: ac1775012058 ("spi: sprd: Add the support of restarting the system")
    Signed-off-by: Chunyan Zhang <chunyan.zhang@unisoc.com>
    Link: https://lore.kernel.org/r/20210826091549.2138125-2-zhang.lyra@gmail.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/spi/spi-sprd-adi.c b/drivers/spi/spi-sprd-adi.c
index e41976010dc4..97f44458ee7b 100644
--- a/drivers/spi/spi-sprd-adi.c
+++ b/drivers/spi/spi-sprd-adi.c
@@ -99,7 +99,7 @@
 #define HWRST_STATUS_SPRDISK		0xc0
 
 /* Use default timeout 50 ms that converts to watchdog values */
-#define WDG_LOAD_VAL			((50 * 1000) / 32768)
+#define WDG_LOAD_VAL			((50 * 32768) / 1000)
 #define WDG_LOAD_MASK			GENMASK(15, 0)
 #define WDG_UNLOCK_KEY			0xe551
 

commit a45af82c9458910903d2aeaa2e165166a4e3e820
Author: Stefan Berger <stefanb@linux.ibm.com>
Date:   Tue Jun 29 17:34:20 2021 -0400

    certs: Trigger creation of RSA module signing key if it's not an RSA key
    
    [ Upstream commit ea35e0d5df6c92fa2e124bb1b91d09b2240715ba ]
    
    Address a kbuild issue where a developer created an ECDSA key for signing
    kernel modules and then builds an older version of the kernel, when bi-
    secting the kernel for example, that does not support ECDSA keys.
    
    If openssl is installed, trigger the creation of an RSA module signing
    key if it is not an RSA key.
    
    Fixes: cfc411e7fff3 ("Move certificate handling to its own directory")
    Cc: David Howells <dhowells@redhat.com>
    Cc: David Woodhouse <dwmw2@infradead.org>
    Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
    Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
    Tested-by: Jarkko Sakkinen <jarkko@kernel.org>
    Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/certs/Makefile b/certs/Makefile
index 5d0999b9e21b..ca3c71e3a3d9 100644
--- a/certs/Makefile
+++ b/certs/Makefile
@@ -46,11 +46,19 @@ endif
 redirect_openssl	= 2>&1
 quiet_redirect_openssl	= 2>&1
 silent_redirect_openssl = 2>/dev/null
+openssl_available       = $(shell openssl help 2>/dev/null && echo yes)
 
 # We do it this way rather than having a boolean option for enabling an
 # external private key, because 'make randconfig' might enable such a
 # boolean option and we unfortunately can't make it depend on !RANDCONFIG.
 ifeq ($(CONFIG_MODULE_SIG_KEY),"certs/signing_key.pem")
+
+ifeq ($(openssl_available),yes)
+X509TEXT=$(shell openssl x509 -in "certs/signing_key.pem" -text 2>/dev/null)
+
+$(if $(findstring rsaEncryption,$(X509TEXT)),,$(shell rm -f "certs/signing_key.pem"))
+endif
+
 $(obj)/signing_key.pem: $(obj)/x509.genkey
 	@$(kecho) "###"
 	@$(kecho) "### Now generating an X.509 key pair to be used for signing modules."

commit ee2f276966218d83e242858e1d0de4fb9eb77954
Author: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Date:   Thu Aug 12 21:21:10 2021 +0100

    crypto: qat - use proper type for vf_mask
    
    [ Upstream commit 462354d986b6a89c6449b85f17aaacf44e455216 ]
    
    Replace vf_mask type with unsigned long to avoid a stack-out-of-bound.
    
    This is to fix the following warning reported by KASAN the first time
    adf_msix_isr_ae() gets called.
    
        [  692.091987] BUG: KASAN: stack-out-of-bounds in find_first_bit+0x28/0x50
        [  692.092017] Read of size 8 at addr ffff88afdf789e60 by task swapper/32/0
        [  692.092076] Call Trace:
        [  692.092089]  <IRQ>
        [  692.092101]  dump_stack+0x9c/0xcf
        [  692.092132]  print_address_description.constprop.0+0x18/0x130
        [  692.092164]  ? find_first_bit+0x28/0x50
        [  692.092185]  kasan_report.cold+0x7f/0x111
        [  692.092213]  ? static_obj+0x10/0x80
        [  692.092234]  ? find_first_bit+0x28/0x50
        [  692.092262]  find_first_bit+0x28/0x50
        [  692.092288]  adf_msix_isr_ae+0x16e/0x230 [intel_qat]
    
    Fixes: ed8ccaef52fa ("crypto: qat - Add support for SRIOV")
    Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
    Reviewed-by: Marco Chiappero <marco.chiappero@intel.com>
    Reviewed-by: Fiona Trahe <fiona.trahe@intel.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/qat/qat_common/adf_isr.c b/drivers/crypto/qat/qat_common/adf_isr.c
index 4898ef41fd9f..7d319c5c071c 100644
--- a/drivers/crypto/qat/qat_common/adf_isr.c
+++ b/drivers/crypto/qat/qat_common/adf_isr.c
@@ -59,6 +59,8 @@
 #include "adf_transport_access_macros.h"
 #include "adf_transport_internal.h"
 
+#define ADF_MAX_NUM_VFS	32
+
 static int adf_enable_msix(struct adf_accel_dev *accel_dev)
 {
 	struct adf_accel_pci *pci_dev_info = &accel_dev->accel_pci_dev;
@@ -111,7 +113,7 @@ static irqreturn_t adf_msix_isr_ae(int irq, void *dev_ptr)
 		struct adf_bar *pmisc =
 			&GET_BARS(accel_dev)[hw_data->get_misc_bar_id(hw_data)];
 		void __iomem *pmisc_bar_addr = pmisc->virt_addr;
-		u32 vf_mask;
+		unsigned long vf_mask;
 
 		/* Get the interrupt sources triggered by VFs */
 		vf_mask = ((ADF_CSR_RD(pmisc_bar_addr, ADF_ERRSOU5) &
@@ -132,8 +134,7 @@ static irqreturn_t adf_msix_isr_ae(int irq, void *dev_ptr)
 			 * unless the VF is malicious and is attempting to
 			 * flood the host OS with VF2PF interrupts.
 			 */
-			for_each_set_bit(i, (const unsigned long *)&vf_mask,
-					 (sizeof(vf_mask) * BITS_PER_BYTE)) {
+			for_each_set_bit(i, &vf_mask, ADF_MAX_NUM_VFS) {
 				vf_info = accel_dev->pf.vf_info + i;
 
 				if (!__ratelimit(&vf_info->vf2pf_ratelimit)) {

commit 8bb51f7f627b3bc4247c95f3a98b09ed821a0728
Author: Phong Hoang <phong.hoang.wz@renesas.com>
Date:   Thu Apr 22 14:34:43 2021 +0200

    clocksource/drivers/sh_cmt: Fix wrong setting if don't request IRQ for clock source channel
    
    [ Upstream commit be83c3b6e7b8ff22f72827a613bf6f3aa5afadbb ]
    
    If CMT instance has at least two channels, one channel will be used
    as a clock source and another one used as a clock event device.
    In that case, IRQ is not requested for clock source channel so
    sh_cmt_clock_event_program_verify() might work incorrectly.
    Besides, when a channel is only used for clock source, don't need to
    re-set the next match_value since it should be maximum timeout as
    it still is.
    
    On the other hand, due to no IRQ, total_cycles is not counted up
    when reaches compare match time (timer counter resets to zero),
    so sh_cmt_clocksource_read() returns unexpected value.
    Therefore, use 64-bit clocksoure's mask for 32-bit or 16-bit variants
    will also lead to wrong delta calculation. Hence, this mask should
    correspond to timer counter width, and above function just returns
    the raw value of timer counter register.
    
    Fixes: bfa76bb12f23 ("clocksource: sh_cmt: Request IRQ for clock event device only")
    Fixes: 37e7742c55ba ("clocksource/drivers/sh_cmt: Fix clocksource width for 32-bit machines")
    Signed-off-by: Phong Hoang <phong.hoang.wz@renesas.com>
    Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
    Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
    Link: https://lore.kernel.org/r/20210422123443.73334-1-niklas.soderlund+renesas@ragnatech.se
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/clocksource/sh_cmt.c b/drivers/clocksource/sh_cmt.c
index cec90a4c79b3..7a6d4c4c0feb 100644
--- a/drivers/clocksource/sh_cmt.c
+++ b/drivers/clocksource/sh_cmt.c
@@ -576,7 +576,8 @@ static int sh_cmt_start(struct sh_cmt_channel *ch, unsigned long flag)
 	ch->flags |= flag;
 
 	/* setup timeout if no clockevent */
-	if ((flag == FLAG_CLOCKSOURCE) && (!(ch->flags & FLAG_CLOCKEVENT)))
+	if (ch->cmt->num_channels == 1 &&
+	    flag == FLAG_CLOCKSOURCE && (!(ch->flags & FLAG_CLOCKEVENT)))
 		__sh_cmt_set_next(ch, ch->max_match_value);
  out:
 	raw_spin_unlock_irqrestore(&ch->lock, flags);
@@ -612,20 +613,25 @@ static struct sh_cmt_channel *cs_to_sh_cmt(struct clocksource *cs)
 static u64 sh_cmt_clocksource_read(struct clocksource *cs)
 {
 	struct sh_cmt_channel *ch = cs_to_sh_cmt(cs);
-	unsigned long flags;
 	u32 has_wrapped;
-	u64 value;
-	u32 raw;
 
-	raw_spin_lock_irqsave(&ch->lock, flags);
-	value = ch->total_cycles;
-	raw = sh_cmt_get_counter(ch, &has_wrapped);
+	if (ch->cmt->num_channels == 1) {
+		unsigned long flags;
+		u64 value;
+		u32 raw;
 
-	if (unlikely(has_wrapped))
-		raw += ch->match_value + 1;
-	raw_spin_unlock_irqrestore(&ch->lock, flags);
+		raw_spin_lock_irqsave(&ch->lock, flags);
+		value = ch->total_cycles;
+		raw = sh_cmt_get_counter(ch, &has_wrapped);
+
+		if (unlikely(has_wrapped))
+			raw += ch->match_value + 1;
+		raw_spin_unlock_irqrestore(&ch->lock, flags);
+
+		return value + raw;
+	}
 
-	return value + raw;
+	return sh_cmt_get_counter(ch, &has_wrapped);
 }
 
 static int sh_cmt_clocksource_enable(struct clocksource *cs)
@@ -688,7 +694,7 @@ static int sh_cmt_register_clocksource(struct sh_cmt_channel *ch,
 	cs->disable = sh_cmt_clocksource_disable;
 	cs->suspend = sh_cmt_clocksource_suspend;
 	cs->resume = sh_cmt_clocksource_resume;
-	cs->mask = CLOCKSOURCE_MASK(sizeof(u64) * 8);
+	cs->mask = CLOCKSOURCE_MASK(ch->cmt->info->width);
 	cs->flags = CLOCK_SOURCE_IS_CONTINUOUS;
 
 	dev_info(&ch->cmt->pdev->dev, "ch%u: used as clock source\n",

commit ab642cd7bf1859569dc93a67db980bf883096ab5
Author: Hongbo Li <herberthbli@tencent.com>
Date:   Thu Aug 5 16:53:32 2021 +0800

    lib/mpi: use kcalloc in mpi_resize
    
    [ Upstream commit b6f756726e4dfe75be1883f6a0202dcecdc801ab ]
    
    We should set the additional space to 0 in mpi_resize().
    So use kcalloc() instead of kmalloc_array().
    
    In lib/mpi/ec.c:
    /****************
     * Resize the array of A to NLIMBS. the additional space is cleared
     * (set to 0) [done by m_realloc()]
     */
    int mpi_resize(MPI a, unsigned nlimbs)
    
    Like the comment of kernel's mpi_resize() said, the additional space
    need to be set to 0, but when a->d is not NULL, it does not set.
    
    The kernel's mpi lib is from libgcrypt, the mpi resize in libgcrypt
    is _gcry_mpi_resize() which set the additional space to 0.
    
    This bug may cause mpi api which use mpi_resize() get wrong result
    under the condition of using the additional space without initiation.
    If this condition is not met, the bug would not be triggered.
    Currently in kernel, rsa, sm2 and dh use mpi lib, and they works well,
    so the bug is not triggered in these cases.
    
    add_points_edwards() use the additional space directly, so it will
    get a wrong result.
    
    Fixes: cdec9cb5167a ("crypto: GnuPG based MPI lib - source files (part 1)")
    Signed-off-by: Hongbo Li <herberthbli@tencent.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/lib/mpi/mpiutil.c b/lib/mpi/mpiutil.c
index 20ed0f766787..00825028cc84 100644
--- a/lib/mpi/mpiutil.c
+++ b/lib/mpi/mpiutil.c
@@ -91,7 +91,7 @@ int mpi_resize(MPI a, unsigned nlimbs)
 		return 0;	/* no need to do it */
 
 	if (a->d) {
-		p = kmalloc_array(nlimbs, sizeof(mpi_limb_t), GFP_KERNEL);
+		p = kcalloc(nlimbs, sizeof(mpi_limb_t), GFP_KERNEL);
 		if (!p)
 			return -ENOMEM;
 		memcpy(p, a->d, a->alloced * sizeof(mpi_limb_t));

commit 6812cb0d4379a55677337f115318b6857a4b905e
Author: Tony Lindgren <tony@atomide.com>
Date:   Tue Aug 10 11:17:27 2021 +0300

    spi: spi-pic32: Fix issue with uninitialized dma_slave_config
    
    [ Upstream commit 976c1de1de147bb7f4e0d87482f375221c05aeaf ]
    
    Depending on the DMA driver being used, the struct dma_slave_config may
    need to be initialized to zero for the unused data.
    
    For example, we have three DMA drivers using src_port_window_size and
    dst_port_window_size. If these are left uninitialized, it can cause DMA
    failures.
    
    For spi-pic32, this is probably not currently an issue but is still good to
    fix though.
    
    Fixes: 1bcb9f8ceb67 ("spi: spi-pic32: Add PIC32 SPI master driver")
    Cc: Purna Chandra Mandal <purna.mandal@microchip.com>
    Cc: Peter Ujfalusi <peter.ujfalusi@gmail.com>
    Cc: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Link: https://lore.kernel.org/r/20210810081727.19491-2-tony@atomide.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/spi/spi-pic32.c b/drivers/spi/spi-pic32.c
index 661a40c653e9..d8cdb13ce3e4 100644
--- a/drivers/spi/spi-pic32.c
+++ b/drivers/spi/spi-pic32.c
@@ -369,6 +369,7 @@ static int pic32_spi_dma_config(struct pic32_spi *pic32s, u32 dma_width)
 	struct dma_slave_config cfg;
 	int ret;
 
+	memset(&cfg, 0, sizeof(cfg));
 	cfg.device_fc = true;
 	cfg.src_addr = pic32s->dma_base + buf_offset;
 	cfg.dst_addr = pic32s->dma_base + buf_offset;

commit bcc9379c761f4b94bd09aeb57cd7974443baee5d
Author: Tony Lindgren <tony@atomide.com>
Date:   Tue Aug 10 11:17:26 2021 +0300

    spi: spi-fsl-dspi: Fix issue with uninitialized dma_slave_config
    
    [ Upstream commit 209ab223ad5b18e437289235e3bde12593b94ac4 ]
    
    Depending on the DMA driver being used, the struct dma_slave_config may
    need to be initialized to zero for the unused data.
    
    For example, we have three DMA drivers using src_port_window_size and
    dst_port_window_size. If these are left uninitialized, it can cause DMA
    failures.
    
    For spi-fsl-dspi, this is probably not currently an issue but is still
    good to fix though.
    
    Fixes: 90ba37033cb9 ("spi: spi-fsl-dspi: Add DMA support for Vybrid")
    Cc: Sanchayan Maity <maitysanchayan@gmail.com>
    Cc: Vladimir Oltean <vladimir.oltean@nxp.com>
    Cc: Peter Ujfalusi <peter.ujfalusi@gmail.com>
    Cc: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Acked-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Link: https://lore.kernel.org/r/20210810081727.19491-1-tony@atomide.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c
index 25486ee8379b..cfbf1ffb61bf 100644
--- a/drivers/spi/spi-fsl-dspi.c
+++ b/drivers/spi/spi-fsl-dspi.c
@@ -430,6 +430,7 @@ static int dspi_request_dma(struct fsl_dspi *dspi, phys_addr_t phy_addr)
 		goto err_rx_dma_buf;
 	}
 
+	memset(&cfg, 0, sizeof(cfg));
 	cfg.src_addr = phy_addr + SPI_POPR;
 	cfg.dst_addr = phy_addr + SPI_PUSHR;
 	cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;

commit 161818ff30e696c3eec58a7617d38c9fd5889296
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Mon Jul 5 23:47:27 2021 +0300

    m68k: emu: Fix invalid free in nfeth_cleanup()
    
    [ Upstream commit 761608f5cf70e8876c2f0e39ca54b516bdcb7c12 ]
    
    In the for loop all nfeth_dev array members should be freed, not only
    the first one.  Freeing only the first array member can cause
    double-free bugs and memory leaks.
    
    Fixes: 9cd7b148312f ("m68k/atari: ARAnyM - Add support for network access")
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Link: https://lore.kernel.org/r/20210705204727.10743-1-paskripkin@gmail.com
    Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/m68k/emu/nfeth.c b/arch/m68k/emu/nfeth.c
index e45ce4243aaa..76262dc40e79 100644
--- a/arch/m68k/emu/nfeth.c
+++ b/arch/m68k/emu/nfeth.c
@@ -258,8 +258,8 @@ static void __exit nfeth_cleanup(void)
 
 	for (i = 0; i < MAX_UNIT; i++) {
 		if (nfeth_dev[i]) {
-			unregister_netdev(nfeth_dev[0]);
-			free_netdev(nfeth_dev[0]);
+			unregister_netdev(nfeth_dev[i]);
+			free_netdev(nfeth_dev[i]);
 		}
 	}
 	free_irq(nfEtherIRQ, nfeth_interrupt);

commit f08721ee2b387cc0ba93f8c27e2e3a6be80db2e4
Author: Stian Skjelstad <stian.skjelstad@gmail.com>
Date:   Sun Aug 22 11:33:32 2021 +0200

    udf_get_extendedattr() had no boundary checks.
    
    [ Upstream commit 58bc6d1be2f3b0ceecb6027dfa17513ec6aa2abb ]
    
    When parsing the ExtendedAttr data, malicous or corrupt attribute length
    could cause kernel hangs and buffer overruns in some special cases.
    
    Link: https://lore.kernel.org/r/20210822093332.25234-1-stian.skjelstad@gmail.com
    Signed-off-by: Stian Skjelstad <stian.skjelstad@gmail.com>
    Signed-off-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/udf/misc.c b/fs/udf/misc.c
index 401e64cde1be..853bcff51043 100644
--- a/fs/udf/misc.c
+++ b/fs/udf/misc.c
@@ -173,13 +173,22 @@ struct genericFormat *udf_get_extendedattr(struct inode *inode, uint32_t type,
 		else
 			offset = le32_to_cpu(eahd->appAttrLocation);
 
-		while (offset < iinfo->i_lenEAttr) {
+		while (offset + sizeof(*gaf) < iinfo->i_lenEAttr) {
+			uint32_t attrLength;
+
 			gaf = (struct genericFormat *)&ea[offset];
+			attrLength = le32_to_cpu(gaf->attrLength);
+
+			/* Detect undersized elements and buffer overflows */
+			if ((attrLength < sizeof(*gaf)) ||
+			    (attrLength > (iinfo->i_lenEAttr - offset)))
+				break;
+
 			if (le32_to_cpu(gaf->attrType) == type &&
 					gaf->attrSubtype == subtype)
 				return gaf;
 			else
-				offset += le32_to_cpu(gaf->attrLength);
+				offset += attrLength;
 		}
 	}
 

commit 64dd1fbb0bb743ccd2fb420c441f4ca9732f598f
Author: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
Date:   Fri Jul 2 17:18:31 2021 +0800

    fcntl: fix potential deadlock for &fasync_struct.fa_lock
    
    [ Upstream commit 2f488f698fda820f8e6fa0407630154eceb145d6 ]
    
    There is an existing lock hierarchy of
    &dev->event_lock --> &fasync_struct.fa_lock --> &f->f_owner.lock
    from the following call chain:
    
      input_inject_event():
        spin_lock_irqsave(&dev->event_lock,...);
        input_handle_event():
          input_pass_values():
            input_to_handler():
              evdev_events():
                evdev_pass_values():
                  spin_lock(&client->buffer_lock);
                  __pass_event():
                    kill_fasync():
                      kill_fasync_rcu():
                        read_lock(&fa->fa_lock);
                        send_sigio():
                          read_lock_irqsave(&fown->lock,...);
    
    &dev->event_lock is HARDIRQ-safe, so interrupts have to be disabled
    while grabbing &fasync_struct.fa_lock, otherwise we invert the lock
    hierarchy. However, since kill_fasync which calls kill_fasync_rcu is
    an exported symbol, it may not necessarily be called with interrupts
    disabled.
    
    As kill_fasync_rcu may be called with interrupts disabled (for
    example, in the call chain above), we replace calls to
    read_lock/read_unlock on &fasync_struct.fa_lock in kill_fasync_rcu
    with read_lock_irqsave/read_unlock_irqrestore.
    
    Signed-off-by: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
    Signed-off-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/fcntl.c b/fs/fcntl.c
index e039af1872ab..dffb5245ae72 100644
--- a/fs/fcntl.c
+++ b/fs/fcntl.c
@@ -993,13 +993,14 @@ static void kill_fasync_rcu(struct fasync_struct *fa, int sig, int band)
 {
 	while (fa) {
 		struct fown_struct *fown;
+		unsigned long flags;
 
 		if (fa->magic != FASYNC_MAGIC) {
 			printk(KERN_ERR "kill_fasync: bad magic number in "
 			       "fasync_struct!\n");
 			return;
 		}
-		read_lock(&fa->fa_lock);
+		read_lock_irqsave(&fa->fa_lock, flags);
 		if (fa->fa_file) {
 			fown = &fa->fa_file->f_owner;
 			/* Don't send SIGURG to processes which have not set a
@@ -1008,7 +1009,7 @@ static void kill_fasync_rcu(struct fasync_struct *fa, int sig, int band)
 			if (!(sig == SIGURG && fown->signum == 0))
 				send_sigio(fown, fa->fa_fd, band);
 		}
-		read_unlock(&fa->fa_lock);
+		read_unlock_irqrestore(&fa->fa_lock, flags);
 		fa = rcu_dereference(fa->fa_next);
 	}
 }

commit 829ead9080979febda2b122f86cce41fd8b80253
Author: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Date:   Thu Aug 12 21:21:28 2021 +0100

    crypto: qat - do not export adf_iov_putmsg()
    
    [ Upstream commit 645ae0af1840199086c33e4f841892ebee73f615 ]
    
    The function adf_iov_putmsg() is only used inside the intel_qat module
    therefore should not be exported.
    Remove EXPORT_SYMBOL for the function adf_iov_putmsg().
    
    Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
    Reviewed-by: Fiona Trahe <fiona.trahe@intel.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
index 9dab2cc11fdf..c64481160b71 100644
--- a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
+++ b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
@@ -231,7 +231,6 @@ int adf_iov_putmsg(struct adf_accel_dev *accel_dev, u32 msg, u8 vf_nr)
 
 	return ret;
 }
-EXPORT_SYMBOL_GPL(adf_iov_putmsg);
 
 void adf_vf2pf_req_hndl(struct adf_accel_vf_info *vf_info)
 {

commit 38b589d176e83693868db60d78307e5ba629bc23
Author: Marco Chiappero <marco.chiappero@intel.com>
Date:   Thu Aug 12 21:21:22 2021 +0100

    crypto: qat - fix naming for init/shutdown VF to PF notifications
    
    [ Upstream commit b90c1c4d3fa8cd90f4e8245b13564380fd0bfad1 ]
    
    At start and shutdown, VFs notify the PF about their state. These
    notifications are carried out through a message exchange using the PFVF
    protocol.
    
    Function names lead to believe they do perform init or shutdown logic.
    This is to fix the naming to better reflect their purpose.
    
    Signed-off-by: Marco Chiappero <marco.chiappero@intel.com>
    Co-developed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
    Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
    Reviewed-by: Fiona Trahe <fiona.trahe@intel.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/qat/qat_c3xxxvf/adf_c3xxxvf_hw_data.c b/drivers/crypto/qat/qat_c3xxxvf/adf_c3xxxvf_hw_data.c
index d2d0ae445fd8..7c7d49a8a403 100644
--- a/drivers/crypto/qat/qat_c3xxxvf/adf_c3xxxvf_hw_data.c
+++ b/drivers/crypto/qat/qat_c3xxxvf/adf_c3xxxvf_hw_data.c
@@ -123,10 +123,10 @@ void adf_init_hw_data_c3xxxiov(struct adf_hw_device_data *hw_data)
 	hw_data->enable_error_correction = adf_vf_void_noop;
 	hw_data->init_admin_comms = adf_vf_int_noop;
 	hw_data->exit_admin_comms = adf_vf_void_noop;
-	hw_data->send_admin_init = adf_vf2pf_init;
+	hw_data->send_admin_init = adf_vf2pf_notify_init;
 	hw_data->init_arb = adf_vf_int_noop;
 	hw_data->exit_arb = adf_vf_void_noop;
-	hw_data->disable_iov = adf_vf2pf_shutdown;
+	hw_data->disable_iov = adf_vf2pf_notify_shutdown;
 	hw_data->get_accel_mask = get_accel_mask;
 	hw_data->get_ae_mask = get_ae_mask;
 	hw_data->get_num_accels = get_num_accels;
diff --git a/drivers/crypto/qat/qat_c62xvf/adf_c62xvf_hw_data.c b/drivers/crypto/qat/qat_c62xvf/adf_c62xvf_hw_data.c
index 38e4bc04f407..90e8a7564756 100644
--- a/drivers/crypto/qat/qat_c62xvf/adf_c62xvf_hw_data.c
+++ b/drivers/crypto/qat/qat_c62xvf/adf_c62xvf_hw_data.c
@@ -123,10 +123,10 @@ void adf_init_hw_data_c62xiov(struct adf_hw_device_data *hw_data)
 	hw_data->enable_error_correction = adf_vf_void_noop;
 	hw_data->init_admin_comms = adf_vf_int_noop;
 	hw_data->exit_admin_comms = adf_vf_void_noop;
-	hw_data->send_admin_init = adf_vf2pf_init;
+	hw_data->send_admin_init = adf_vf2pf_notify_init;
 	hw_data->init_arb = adf_vf_int_noop;
 	hw_data->exit_arb = adf_vf_void_noop;
-	hw_data->disable_iov = adf_vf2pf_shutdown;
+	hw_data->disable_iov = adf_vf2pf_notify_shutdown;
 	hw_data->get_accel_mask = get_accel_mask;
 	hw_data->get_ae_mask = get_ae_mask;
 	hw_data->get_num_accels = get_num_accels;
diff --git a/drivers/crypto/qat/qat_common/adf_common_drv.h b/drivers/crypto/qat/qat_common/adf_common_drv.h
index d78f8d5c89c3..289dd7e48d4a 100644
--- a/drivers/crypto/qat/qat_common/adf_common_drv.h
+++ b/drivers/crypto/qat/qat_common/adf_common_drv.h
@@ -239,8 +239,8 @@ void adf_enable_vf2pf_interrupts(struct adf_accel_dev *accel_dev,
 void adf_enable_pf2vf_interrupts(struct adf_accel_dev *accel_dev);
 void adf_disable_pf2vf_interrupts(struct adf_accel_dev *accel_dev);
 
-int adf_vf2pf_init(struct adf_accel_dev *accel_dev);
-void adf_vf2pf_shutdown(struct adf_accel_dev *accel_dev);
+int adf_vf2pf_notify_init(struct adf_accel_dev *accel_dev);
+void adf_vf2pf_notify_shutdown(struct adf_accel_dev *accel_dev);
 int adf_init_pf_wq(void);
 void adf_exit_pf_wq(void);
 int adf_init_vf_wq(void);
@@ -263,12 +263,12 @@ static inline void adf_disable_pf2vf_interrupts(struct adf_accel_dev *accel_dev)
 {
 }
 
-static inline int adf_vf2pf_init(struct adf_accel_dev *accel_dev)
+static inline int adf_vf2pf_notify_init(struct adf_accel_dev *accel_dev)
 {
 	return 0;
 }
 
-static inline void adf_vf2pf_shutdown(struct adf_accel_dev *accel_dev)
+static inline void adf_vf2pf_notify_shutdown(struct adf_accel_dev *accel_dev)
 {
 }
 
diff --git a/drivers/crypto/qat/qat_common/adf_vf2pf_msg.c b/drivers/crypto/qat/qat_common/adf_vf2pf_msg.c
index cd5f37dffe8a..1830194567e8 100644
--- a/drivers/crypto/qat/qat_common/adf_vf2pf_msg.c
+++ b/drivers/crypto/qat/qat_common/adf_vf2pf_msg.c
@@ -49,14 +49,14 @@
 #include "adf_pf2vf_msg.h"
 
 /**
- * adf_vf2pf_init() - send init msg to PF
+ * adf_vf2pf_notify_init() - send init msg to PF
  * @accel_dev:  Pointer to acceleration VF device.
  *
  * Function sends an init messge from the VF to a PF
  *
  * Return: 0 on success, error code otherwise.
  */
-int adf_vf2pf_init(struct adf_accel_dev *accel_dev)
+int adf_vf2pf_notify_init(struct adf_accel_dev *accel_dev)
 {
 	u32 msg = (ADF_VF2PF_MSGORIGIN_SYSTEM |
 		(ADF_VF2PF_MSGTYPE_INIT << ADF_VF2PF_MSGTYPE_SHIFT));
@@ -69,17 +69,17 @@ int adf_vf2pf_init(struct adf_accel_dev *accel_dev)
 	set_bit(ADF_STATUS_PF_RUNNING, &accel_dev->status);
 	return 0;
 }
-EXPORT_SYMBOL_GPL(adf_vf2pf_init);
+EXPORT_SYMBOL_GPL(adf_vf2pf_notify_init);
 
 /**
- * adf_vf2pf_shutdown() - send shutdown msg to PF
+ * adf_vf2pf_notify_shutdown() - send shutdown msg to PF
  * @accel_dev:  Pointer to acceleration VF device.
  *
  * Function sends a shutdown messge from the VF to a PF
  *
  * Return: void
  */
-void adf_vf2pf_shutdown(struct adf_accel_dev *accel_dev)
+void adf_vf2pf_notify_shutdown(struct adf_accel_dev *accel_dev)
 {
 	u32 msg = (ADF_VF2PF_MSGORIGIN_SYSTEM |
 	    (ADF_VF2PF_MSGTYPE_SHUTDOWN << ADF_VF2PF_MSGTYPE_SHIFT));
@@ -89,4 +89,4 @@ void adf_vf2pf_shutdown(struct adf_accel_dev *accel_dev)
 			dev_err(&GET_DEV(accel_dev),
 				"Failed to send Shutdown event to PF\n");
 }
-EXPORT_SYMBOL_GPL(adf_vf2pf_shutdown);
+EXPORT_SYMBOL_GPL(adf_vf2pf_notify_shutdown);
diff --git a/drivers/crypto/qat/qat_dh895xccvf/adf_dh895xccvf_hw_data.c b/drivers/crypto/qat/qat_dh895xccvf/adf_dh895xccvf_hw_data.c
index a3b4dd8099a7..3a8361c83f0b 100644
--- a/drivers/crypto/qat/qat_dh895xccvf/adf_dh895xccvf_hw_data.c
+++ b/drivers/crypto/qat/qat_dh895xccvf/adf_dh895xccvf_hw_data.c
@@ -123,10 +123,10 @@ void adf_init_hw_data_dh895xcciov(struct adf_hw_device_data *hw_data)
 	hw_data->enable_error_correction = adf_vf_void_noop;
 	hw_data->init_admin_comms = adf_vf_int_noop;
 	hw_data->exit_admin_comms = adf_vf_void_noop;
-	hw_data->send_admin_init = adf_vf2pf_init;
+	hw_data->send_admin_init = adf_vf2pf_notify_init;
 	hw_data->init_arb = adf_vf_int_noop;
 	hw_data->exit_arb = adf_vf_void_noop;
-	hw_data->disable_iov = adf_vf2pf_shutdown;
+	hw_data->disable_iov = adf_vf2pf_notify_shutdown;
 	hw_data->get_accel_mask = get_accel_mask;
 	hw_data->get_ae_mask = get_ae_mask;
 	hw_data->get_num_accels = get_num_accels;

commit 480af08b5ca757c4f7ebb9cf999c996ca54b805e
Author: Marco Chiappero <marco.chiappero@intel.com>
Date:   Thu Aug 12 21:21:19 2021 +0100

    crypto: qat - fix reuse of completion variable
    
    [ Upstream commit 3d655732b0199562267a05c7ff69ecdd11632939 ]
    
    Use reinit_completion() to set to a clean state a completion variable,
    used to coordinate the VF to PF request-response flow, before every
    new VF request.
    
    Signed-off-by: Marco Chiappero <marco.chiappero@intel.com>
    Co-developed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
    Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
    Reviewed-by: Fiona Trahe <fiona.trahe@intel.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
index b3875fdf6cd7..9dab2cc11fdf 100644
--- a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
+++ b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
@@ -361,6 +361,8 @@ static int adf_vf2pf_request_version(struct adf_accel_dev *accel_dev)
 	msg |= ADF_PFVF_COMPATIBILITY_VERSION << ADF_VF2PF_COMPAT_VER_REQ_SHIFT;
 	BUILD_BUG_ON(ADF_PFVF_COMPATIBILITY_VERSION > 255);
 
+	reinit_completion(&accel_dev->vf.iov_msg_completion);
+
 	/* Send request from VF to PF */
 	ret = adf_iov_putmsg(accel_dev, msg, 0);
 	if (ret) {

commit b51cb36e1f849020ec34f2b7f9d06eb57ba058eb
Author: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Date:   Thu Aug 12 21:21:14 2021 +0100

    crypto: qat - handle both source of interrupt in VF ISR
    
    [ Upstream commit 0a73c762e1eee33a5e5dc0e3488f1b7cd17249b3 ]
    
    The top half of the VF drivers handled only a source at the time.
    If an interrupt for PF2VF and bundle occurred at the same time, the ISR
    scheduled only the bottom half for PF2VF.
    This patch fixes the VF top half so that if both sources of interrupt
    trigger at the same time, both bottom halves are scheduled.
    
    This patch is based on earlier work done by Conor McLoughlin.
    
    Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
    Reviewed-by: Marco Chiappero <marco.chiappero@intel.com>
    Reviewed-by: Fiona Trahe <fiona.trahe@intel.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/qat/qat_common/adf_vf_isr.c b/drivers/crypto/qat/qat_common/adf_vf_isr.c
index df9a1f35b832..ef90902c8200 100644
--- a/drivers/crypto/qat/qat_common/adf_vf_isr.c
+++ b/drivers/crypto/qat/qat_common/adf_vf_isr.c
@@ -203,6 +203,7 @@ static irqreturn_t adf_isr(int irq, void *privdata)
 	struct adf_bar *pmisc =
 			&GET_BARS(accel_dev)[hw_data->get_misc_bar_id(hw_data)];
 	void __iomem *pmisc_bar_addr = pmisc->virt_addr;
+	bool handled = false;
 	u32 v_int;
 
 	/* Read VF INT source CSR to determine the source of VF interrupt */
@@ -215,7 +216,7 @@ static irqreturn_t adf_isr(int irq, void *privdata)
 
 		/* Schedule tasklet to handle interrupt BH */
 		tasklet_hi_schedule(&accel_dev->vf.pf2vf_bh_tasklet);
-		return IRQ_HANDLED;
+		handled = true;
 	}
 
 	/* Check bundle interrupt */
@@ -227,10 +228,10 @@ static irqreturn_t adf_isr(int irq, void *privdata)
 		WRITE_CSR_INT_FLAG_AND_COL(bank->csr_addr, bank->bank_number,
 					   0);
 		tasklet_hi_schedule(&bank->resp_handler);
-		return IRQ_HANDLED;
+		handled = true;
 	}
 
-	return IRQ_NONE;
+	return handled ? IRQ_HANDLED : IRQ_NONE;
 }
 
 static int adf_request_msi_irq(struct adf_accel_dev *accel_dev)

commit 283b8b67b3df74ca9df45431388ca422d14b6253
Author: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Date:   Thu Aug 12 21:21:13 2021 +0100

    crypto: qat - do not ignore errors from enable_vf2pf_comms()
    
    [ Upstream commit 5147f0906d50a9d26f2b8698cd06b5680e9867ff ]
    
    The function adf_dev_init() ignores the error code reported by
    enable_vf2pf_comms(). If the latter fails, e.g. the VF is not compatible
    with the pf, then the load of the VF driver progresses.
    This patch changes adf_dev_init() so that the error code from
    enable_vf2pf_comms() is returned to the caller.
    
    Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
    Reviewed-by: Marco Chiappero <marco.chiappero@intel.com>
    Reviewed-by: Fiona Trahe <fiona.trahe@intel.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/qat/qat_common/adf_init.c b/drivers/crypto/qat/qat_common/adf_init.c
index 26556c713049..7a7d43c47534 100644
--- a/drivers/crypto/qat/qat_common/adf_init.c
+++ b/drivers/crypto/qat/qat_common/adf_init.c
@@ -105,6 +105,7 @@ int adf_dev_init(struct adf_accel_dev *accel_dev)
 	struct service_hndl *service;
 	struct list_head *list_itr;
 	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
+	int ret;
 
 	if (!hw_data) {
 		dev_err(&GET_DEV(accel_dev),
@@ -171,9 +172,9 @@ int adf_dev_init(struct adf_accel_dev *accel_dev)
 	}
 
 	hw_data->enable_error_correction(accel_dev);
-	hw_data->enable_vf2pf_comms(accel_dev);
+	ret = hw_data->enable_vf2pf_comms(accel_dev);
 
-	return 0;
+	return ret;
 }
 EXPORT_SYMBOL_GPL(adf_dev_init);
 

commit 0dfadcf9e9e4dc072fd328ea34fe1830993b425b
Author: Damien Le Moal <damien.lemoal@wdc.com>
Date:   Mon Aug 16 10:44:47 2021 +0900

    libata: fix ata_host_start()
    
    [ Upstream commit 355a8031dc174450ccad2a61c513ad7222d87a97 ]
    
    The loop on entry of ata_host_start() may not initialize host->ops to a
    non NULL value. The test on the host_stop field of host->ops must then
    be preceded by a check that host->ops is not NULL.
    
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
    Reviewed-by: Hannes Reinecke <hare@suse.de>
    Link: https://lore.kernel.org/r/20210816014456.2191776-3-damien.lemoal@wdc.com
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index db1d86af21b4..d9b1c3e95592 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -6412,7 +6412,7 @@ int ata_host_start(struct ata_host *host)
 			have_stop = 1;
 	}
 
-	if (host->ops->host_stop)
+	if (host->ops && host->ops->host_stop)
 		have_stop = 1;
 
 	if (have_stop) {

commit cf5b3bd01970a902f25f66704713ae2893898119
Author: Vineeth Vijayan <vneethv@linux.ibm.com>
Date:   Sun Apr 25 10:52:38 2021 +0200

    s390/cio: add dev_busid sysfs entry for each subchannel
    
    [ Upstream commit d3683c055212bf910d4e318f7944910ce10dbee6 ]
    
    Introduce dev_busid, which exports the device-id associated with the
    io-subchannel (and message-subchannel). The dev_busid indicates that of
    the device which may be physically installed on the corrosponding
    subchannel. The dev_busid value "none" indicates that the subchannel
    is not valid, there is no I/O device currently associated with the
    subchannel.
    
    The dev_busid information would be helpful to write device-specific
    udev-rules associated with the subchannel. The dev_busid interface would
    be available even when the sch is not bound to any driver or if there is
    no operational device connected on it. Hence this attribute can be used to
    write udev-rules which are specific to the device associated with the
    subchannel.
    
    Signed-off-by: Vineeth Vijayan <vneethv@linux.ibm.com>
    Reviewed-by: Peter Oberparleiter <oberpar@linux.ibm.com>
    Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c
index 825a8f2703b4..6efe50d70c4b 100644
--- a/drivers/s390/cio/css.c
+++ b/drivers/s390/cio/css.c
@@ -364,9 +364,26 @@ static ssize_t pimpampom_show(struct device *dev,
 }
 static DEVICE_ATTR_RO(pimpampom);
 
+static ssize_t dev_busid_show(struct device *dev,
+			      struct device_attribute *attr,
+			      char *buf)
+{
+	struct subchannel *sch = to_subchannel(dev);
+	struct pmcw *pmcw = &sch->schib.pmcw;
+
+	if ((pmcw->st == SUBCHANNEL_TYPE_IO ||
+	     pmcw->st == SUBCHANNEL_TYPE_MSG) && pmcw->dnv)
+		return sysfs_emit(buf, "0.%x.%04x\n", sch->schid.ssid,
+				  pmcw->dev);
+	else
+		return sysfs_emit(buf, "none\n");
+}
+static DEVICE_ATTR_RO(dev_busid);
+
 static struct attribute *io_subchannel_type_attrs[] = {
 	&dev_attr_chpids.attr,
 	&dev_attr_pimpampom.attr,
+	&dev_attr_dev_busid.attr,
 	NULL,
 };
 ATTRIBUTE_GROUPS(io_subchannel_type);

commit e92a5b41ed4c9c9993fbf40a090484cf20c49af4
Author: Sebastian Krzyszkowiak <sebastian.krzyszkowiak@puri.sm>
Date:   Mon Aug 16 18:50:14 2021 +0200

    power: supply: max17042_battery: fix typo in MAx17042_TOFF
    
    [ Upstream commit ed0d0a0506025f06061325cedae1bbebd081620a ]
    
    Signed-off-by: Sebastian Krzyszkowiak <sebastian.krzyszkowiak@puri.sm>
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply/max17042_battery.c
index 00a3a581e079..8618dbb72392 100644
--- a/drivers/power/supply/max17042_battery.c
+++ b/drivers/power/supply/max17042_battery.c
@@ -740,7 +740,7 @@ static inline void max17042_override_por_values(struct max17042_chip *chip)
 	struct max17042_config_data *config = chip->pdata->config_data;
 
 	max17042_override_por(map, MAX17042_TGAIN, config->tgain);
-	max17042_override_por(map, MAx17042_TOFF, config->toff);
+	max17042_override_por(map, MAX17042_TOFF, config->toff);
 	max17042_override_por(map, MAX17042_CGAIN, config->cgain);
 	max17042_override_por(map, MAX17042_COFF, config->coff);
 
diff --git a/include/linux/power/max17042_battery.h b/include/linux/power/max17042_battery.h
index a7ed29baf44a..86e5ad8aeee4 100644
--- a/include/linux/power/max17042_battery.h
+++ b/include/linux/power/max17042_battery.h
@@ -82,7 +82,7 @@ enum max17042_register {
 	MAX17042_RelaxCFG	= 0x2A,
 	MAX17042_MiscCFG	= 0x2B,
 	MAX17042_TGAIN		= 0x2C,
-	MAx17042_TOFF		= 0x2D,
+	MAX17042_TOFF		= 0x2D,
 	MAX17042_CGAIN		= 0x2E,
 	MAX17042_COFF		= 0x2F,
 

commit dbce041ab8d1d9e7e57666e533ad4018f9e265e8
Author: Ruozhu Li <liruozhu@huawei.com>
Date:   Wed Jul 28 17:41:20 2021 +0800

    nvme-rdma: don't update queue count when failing to set io queues
    
    [ Upstream commit 85032874f80ba17bf187de1d14d9603bf3f582b8 ]
    
    We update ctrl->queue_count and schedule another reconnect when io queue
    count is zero.But we will never try to create any io queue in next reco-
    nnection, because ctrl->queue_count already set to zero.We will end up
    having an admin-only session in Live state, which is exactly what we try
    to avoid in the original patch.
    Update ctrl->queue_count after queue_count zero checking to fix it.
    
    Signed-off-by: Ruozhu Li <liruozhu@huawei.com>
    Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c
index 8798274dc3ba..ffd6a7204509 100644
--- a/drivers/nvme/host/rdma.c
+++ b/drivers/nvme/host/rdma.c
@@ -643,13 +643,13 @@ static int nvme_rdma_alloc_io_queues(struct nvme_rdma_ctrl *ctrl)
 	if (ret)
 		return ret;
 
-	ctrl->ctrl.queue_count = nr_io_queues + 1;
-	if (ctrl->ctrl.queue_count < 2) {
+	if (nr_io_queues == 0) {
 		dev_err(ctrl->ctrl.device,
 			"unable to set any I/O queues\n");
 		return -ENOMEM;
 	}
 
+	ctrl->ctrl.queue_count = nr_io_queues + 1;
 	dev_info(ctrl->ctrl.device,
 		"creating %d I/O queues.\n", nr_io_queues);
 

commit 9ff23e9baeab1c3c918b957bb2ef7653d56ded44
Author: Christoph Hellwig <hch@lst.de>
Date:   Mon Aug 9 08:40:26 2021 +0200

    bcache: add proper error unwinding in bcache_device_init
    
    [ Upstream commit 224b0683228c5f332f9cee615d85e75e9a347170 ]
    
    Except for the IDA none of the allocations in bcache_device_init is
    unwound on error, fix that.
    
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Acked-by: Coly Li <colyli@suse.de>
    Link: https://lore.kernel.org/r/20210809064028.1198327-7-hch@lst.de
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c
index 7787ec42f81e..2df75db52e91 100644
--- a/drivers/md/bcache/super.c
+++ b/drivers/md/bcache/super.c
@@ -824,20 +824,20 @@ static int bcache_device_init(struct bcache_device *d, unsigned int block_size,
 	n = BITS_TO_LONGS(d->nr_stripes) * sizeof(unsigned long);
 	d->full_dirty_stripes = kvzalloc(n, GFP_KERNEL);
 	if (!d->full_dirty_stripes)
-		return -ENOMEM;
+		goto out_free_stripe_sectors_dirty;
 
 	idx = ida_simple_get(&bcache_device_idx, 0,
 				BCACHE_DEVICE_IDX_MAX, GFP_KERNEL);
 	if (idx < 0)
-		return idx;
+		goto out_free_full_dirty_stripes;
 
 	if (bioset_init(&d->bio_split, 4, offsetof(struct bbio, bio),
 			BIOSET_NEED_BVECS|BIOSET_NEED_RESCUER))
-		goto err;
+		goto out_ida_remove;
 
 	d->disk = alloc_disk(BCACHE_MINORS);
 	if (!d->disk)
-		goto err;
+		goto out_bioset_exit;
 
 	set_capacity(d->disk, sectors);
 	snprintf(d->disk->disk_name, DISK_NAME_LEN, "bcache%i", idx);
@@ -872,8 +872,14 @@ static int bcache_device_init(struct bcache_device *d, unsigned int block_size,
 
 	return 0;
 
-err:
+out_bioset_exit:
+	bioset_exit(&d->bio_split);
+out_ida_remove:
 	ida_simple_remove(&bcache_device_idx, idx);
+out_free_full_dirty_stripes:
+	kvfree(d->full_dirty_stripes);
+out_free_stripe_sectors_dirty:
+	kvfree(d->stripe_sectors_dirty);
 	return -ENOMEM;
 
 }

commit 891ab1769ff1cc40fff0fcea0f4b359f115effde
Author: Pali Rohár <pali@kernel.org>
Date:   Sun Aug 8 18:24:37 2021 +0200

    isofs: joliet: Fix iocharset=utf8 mount option
    
    [ Upstream commit 28ce50f8d96ec9035f60c9348294ea26b94db944 ]
    
    Currently iocharset=utf8 mount option is broken. To use UTF-8 as iocharset,
    it is required to use utf8 mount option.
    
    Fix iocharset=utf8 mount option to use be equivalent to the utf8 mount
    option.
    
    If UTF-8 as iocharset is used then s_nls_iocharset is set to NULL. So
    simplify code around, remove s_utf8 field as to distinguish between UTF-8
    and non-UTF-8 it is needed just to check if s_nls_iocharset is set to NULL
    or not.
    
    Link: https://lore.kernel.org/r/20210808162453.1653-5-pali@kernel.org
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c
index 488a9e7f8f66..2355ad62b81f 100644
--- a/fs/isofs/inode.c
+++ b/fs/isofs/inode.c
@@ -157,7 +157,6 @@ struct iso9660_options{
 	unsigned int overriderockperm:1;
 	unsigned int uid_set:1;
 	unsigned int gid_set:1;
-	unsigned int utf8:1;
 	unsigned char map;
 	unsigned char check;
 	unsigned int blocksize;
@@ -357,7 +356,6 @@ static int parse_options(char *options, struct iso9660_options *popt)
 	popt->gid = GLOBAL_ROOT_GID;
 	popt->uid = GLOBAL_ROOT_UID;
 	popt->iocharset = NULL;
-	popt->utf8 = 0;
 	popt->overriderockperm = 0;
 	popt->session=-1;
 	popt->sbsector=-1;
@@ -390,10 +388,13 @@ static int parse_options(char *options, struct iso9660_options *popt)
 		case Opt_cruft:
 			popt->cruft = 1;
 			break;
+#ifdef CONFIG_JOLIET
 		case Opt_utf8:
-			popt->utf8 = 1;
+			kfree(popt->iocharset);
+			popt->iocharset = kstrdup("utf8", GFP_KERNEL);
+			if (!popt->iocharset)
+				return 0;
 			break;
-#ifdef CONFIG_JOLIET
 		case Opt_iocharset:
 			kfree(popt->iocharset);
 			popt->iocharset = match_strdup(&args[0]);
@@ -496,7 +497,6 @@ static int isofs_show_options(struct seq_file *m, struct dentry *root)
 	if (sbi->s_nocompress)		seq_puts(m, ",nocompress");
 	if (sbi->s_overriderockperm)	seq_puts(m, ",overriderockperm");
 	if (sbi->s_showassoc)		seq_puts(m, ",showassoc");
-	if (sbi->s_utf8)		seq_puts(m, ",utf8");
 
 	if (sbi->s_check)		seq_printf(m, ",check=%c", sbi->s_check);
 	if (sbi->s_mapping)		seq_printf(m, ",map=%c", sbi->s_mapping);
@@ -519,9 +519,10 @@ static int isofs_show_options(struct seq_file *m, struct dentry *root)
 		seq_printf(m, ",fmode=%o", sbi->s_fmode);
 
 #ifdef CONFIG_JOLIET
-	if (sbi->s_nls_iocharset &&
-	    strcmp(sbi->s_nls_iocharset->charset, CONFIG_NLS_DEFAULT) != 0)
+	if (sbi->s_nls_iocharset)
 		seq_printf(m, ",iocharset=%s", sbi->s_nls_iocharset->charset);
+	else
+		seq_puts(m, ",iocharset=utf8");
 #endif
 	return 0;
 }
@@ -865,14 +866,13 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
 	sbi->s_nls_iocharset = NULL;
 
 #ifdef CONFIG_JOLIET
-	if (joliet_level && opt.utf8 == 0) {
+	if (joliet_level) {
 		char *p = opt.iocharset ? opt.iocharset : CONFIG_NLS_DEFAULT;
-		sbi->s_nls_iocharset = load_nls(p);
-		if (! sbi->s_nls_iocharset) {
-			/* Fail only if explicit charset specified */
-			if (opt.iocharset)
+		if (strcmp(p, "utf8") != 0) {
+			sbi->s_nls_iocharset = opt.iocharset ?
+				load_nls(opt.iocharset) : load_nls_default();
+			if (!sbi->s_nls_iocharset)
 				goto out_freesbi;
-			sbi->s_nls_iocharset = load_nls_default();
 		}
 	}
 #endif
@@ -888,7 +888,6 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
 	sbi->s_gid = opt.gid;
 	sbi->s_uid_set = opt.uid_set;
 	sbi->s_gid_set = opt.gid_set;
-	sbi->s_utf8 = opt.utf8;
 	sbi->s_nocompress = opt.nocompress;
 	sbi->s_overriderockperm = opt.overriderockperm;
 	/*
diff --git a/fs/isofs/isofs.h b/fs/isofs/isofs.h
index 055ec6c586f7..dcdc191ed183 100644
--- a/fs/isofs/isofs.h
+++ b/fs/isofs/isofs.h
@@ -44,7 +44,6 @@ struct isofs_sb_info {
 	unsigned char s_session;
 	unsigned int  s_high_sierra:1;
 	unsigned int  s_rock:2;
-	unsigned int  s_utf8:1;
 	unsigned int  s_cruft:1; /* Broken disks with high byte of length
 				  * containing junk */
 	unsigned int  s_nocompress:1;
diff --git a/fs/isofs/joliet.c b/fs/isofs/joliet.c
index be8b6a9d0b92..c0f04a1e7f69 100644
--- a/fs/isofs/joliet.c
+++ b/fs/isofs/joliet.c
@@ -41,14 +41,12 @@ uni16_to_x8(unsigned char *ascii, __be16 *uni, int len, struct nls_table *nls)
 int
 get_joliet_filename(struct iso_directory_record * de, unsigned char *outname, struct inode * inode)
 {
-	unsigned char utf8;
 	struct nls_table *nls;
 	unsigned char len = 0;
 
-	utf8 = ISOFS_SB(inode->i_sb)->s_utf8;
 	nls = ISOFS_SB(inode->i_sb)->s_nls_iocharset;
 
-	if (utf8) {
+	if (!nls) {
 		len = utf16s_to_utf8s((const wchar_t *) de->name,
 				de->name_len[0] >> 1, UTF16_BIG_ENDIAN,
 				outname, PAGE_SIZE);

commit dd6ab4e1c2b6a22318f2526282dbf33c7fb51151
Author: Jan Kara <jack@suse.cz>
Date:   Mon May 3 11:39:03 2021 +0200

    udf: Check LVID earlier
    
    [ Upstream commit 781d2a9a2fc7d0be53a072794dc03ef6de770f3d ]
    
    We were checking validity of LVID entries only when getting
    implementation use information from LVID in udf_sb_lvidiu(). However if
    the LVID is suitably corrupted, it can cause problems also to code such
    as udf_count_free() which doesn't use udf_sb_lvidiu(). So check validity
    of LVID already when loading it from the disk and just disable LVID
    altogether when it is not valid.
    
    Reported-by: syzbot+7fbfe5fed73ebb675748@syzkaller.appspotmail.com
    Signed-off-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/udf/super.c b/fs/udf/super.c
index c7f6243f318b..9c71246e6d60 100644
--- a/fs/udf/super.c
+++ b/fs/udf/super.c
@@ -112,16 +112,10 @@ struct logicalVolIntegrityDescImpUse *udf_sb_lvidiu(struct super_block *sb)
 		return NULL;
 	lvid = (struct logicalVolIntegrityDesc *)UDF_SB(sb)->s_lvid_bh->b_data;
 	partnum = le32_to_cpu(lvid->numOfPartitions);
-	if ((sb->s_blocksize - sizeof(struct logicalVolIntegrityDescImpUse) -
-	     offsetof(struct logicalVolIntegrityDesc, impUse)) /
-	     (2 * sizeof(uint32_t)) < partnum) {
-		udf_err(sb, "Logical volume integrity descriptor corrupted "
-			"(numOfPartitions = %u)!\n", partnum);
-		return NULL;
-	}
 	/* The offset is to skip freeSpaceTable and sizeTable arrays */
 	offset = partnum * 2 * sizeof(uint32_t);
-	return (struct logicalVolIntegrityDescImpUse *)&(lvid->impUse[offset]);
+	return (struct logicalVolIntegrityDescImpUse *)
+					(((uint8_t *)(lvid + 1)) + offset);
 }
 
 /* UDF filesystem type */
@@ -1529,6 +1523,7 @@ static void udf_load_logicalvolint(struct super_block *sb, struct kernel_extent_
 	struct udf_sb_info *sbi = UDF_SB(sb);
 	struct logicalVolIntegrityDesc *lvid;
 	int indirections = 0;
+	u32 parts, impuselen;
 
 	while (++indirections <= UDF_MAX_LVID_NESTING) {
 		final_bh = NULL;
@@ -1555,15 +1550,27 @@ static void udf_load_logicalvolint(struct super_block *sb, struct kernel_extent_
 
 		lvid = (struct logicalVolIntegrityDesc *)final_bh->b_data;
 		if (lvid->nextIntegrityExt.extLength == 0)
-			return;
+			goto check;
 
 		loc = leea_to_cpu(lvid->nextIntegrityExt);
 	}
 
 	udf_warn(sb, "Too many LVID indirections (max %u), ignoring.\n",
 		UDF_MAX_LVID_NESTING);
+out_err:
 	brelse(sbi->s_lvid_bh);
 	sbi->s_lvid_bh = NULL;
+	return;
+check:
+	parts = le32_to_cpu(lvid->numOfPartitions);
+	impuselen = le32_to_cpu(lvid->lengthOfImpUse);
+	if (parts >= sb->s_blocksize || impuselen >= sb->s_blocksize ||
+	    sizeof(struct logicalVolIntegrityDesc) + impuselen +
+	    2 * parts * sizeof(u32) > sb->s_blocksize) {
+		udf_warn(sb, "Corrupted LVID (parts=%u, impuselen=%u), "
+			 "ignoring.\n", parts, impuselen);
+		goto out_err;
+	}
 }
 
 /*

commit e6c3fefc6bb11bef1bd8adfe37e0f317303ab751
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Tue Jul 13 15:39:46 2021 +0200

    hrtimer: Avoid double reprogramming in __hrtimer_start_range_ns()
    
    [ Upstream commit 627ef5ae2df8eeccb20d5af0e4cfa4df9e61ed28 ]
    
    If __hrtimer_start_range_ns() is invoked with an already armed hrtimer then
    the timer has to be canceled first and then added back. If the timer is the
    first expiring timer then on removal the clockevent device is reprogrammed
    to the next expiring timer to avoid that the pending expiry fires needlessly.
    
    If the new expiry time ends up to be the first expiry again then the clock
    event device has to reprogrammed again.
    
    Avoid this by checking whether the timer is the first to expire and in that
    case, keep the timer on the current CPU and delay the reprogramming up to
    the point where the timer has been enqueued again.
    
    Reported-by: Lorenzo Colitti <lorenzo@google.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Link: https://lore.kernel.org/r/20210713135157.873137732@linutronix.de
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
index 0e04b24cec81..32ee24f5142a 100644
--- a/kernel/time/hrtimer.c
+++ b/kernel/time/hrtimer.c
@@ -1020,12 +1020,13 @@ static void __remove_hrtimer(struct hrtimer *timer,
  * remove hrtimer, called with base lock held
  */
 static inline int
-remove_hrtimer(struct hrtimer *timer, struct hrtimer_clock_base *base, bool restart)
+remove_hrtimer(struct hrtimer *timer, struct hrtimer_clock_base *base,
+	       bool restart, bool keep_local)
 {
 	u8 state = timer->state;
 
 	if (state & HRTIMER_STATE_ENQUEUED) {
-		int reprogram;
+		bool reprogram;
 
 		/*
 		 * Remove the timer and force reprogramming when high
@@ -1038,8 +1039,16 @@ remove_hrtimer(struct hrtimer *timer, struct hrtimer_clock_base *base, bool rest
 		debug_deactivate(timer);
 		reprogram = base->cpu_base == this_cpu_ptr(&hrtimer_bases);
 
+		/*
+		 * If the timer is not restarted then reprogramming is
+		 * required if the timer is local. If it is local and about
+		 * to be restarted, avoid programming it twice (on removal
+		 * and a moment later when it's requeued).
+		 */
 		if (!restart)
 			state = HRTIMER_STATE_INACTIVE;
+		else
+			reprogram &= !keep_local;
 
 		__remove_hrtimer(timer, base, state, reprogram);
 		return 1;
@@ -1093,9 +1102,31 @@ static int __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
 				    struct hrtimer_clock_base *base)
 {
 	struct hrtimer_clock_base *new_base;
+	bool force_local, first;
 
-	/* Remove an active timer from the queue: */
-	remove_hrtimer(timer, base, true);
+	/*
+	 * If the timer is on the local cpu base and is the first expiring
+	 * timer then this might end up reprogramming the hardware twice
+	 * (on removal and on enqueue). To avoid that by prevent the
+	 * reprogram on removal, keep the timer local to the current CPU
+	 * and enforce reprogramming after it is queued no matter whether
+	 * it is the new first expiring timer again or not.
+	 */
+	force_local = base->cpu_base == this_cpu_ptr(&hrtimer_bases);
+	force_local &= base->cpu_base->next_timer == timer;
+
+	/*
+	 * Remove an active timer from the queue. In case it is not queued
+	 * on the current CPU, make sure that remove_hrtimer() updates the
+	 * remote data correctly.
+	 *
+	 * If it's on the current CPU and the first expiring timer, then
+	 * skip reprogramming, keep the timer local and enforce
+	 * reprogramming later if it was the first expiring timer.  This
+	 * avoids programming the underlying clock event twice (once at
+	 * removal and once after enqueue).
+	 */
+	remove_hrtimer(timer, base, true, force_local);
 
 	if (mode & HRTIMER_MODE_REL)
 		tim = ktime_add_safe(tim, base->get_time());
@@ -1105,9 +1136,24 @@ static int __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
 	hrtimer_set_expires_range_ns(timer, tim, delta_ns);
 
 	/* Switch the timer base, if necessary: */
-	new_base = switch_hrtimer_base(timer, base, mode & HRTIMER_MODE_PINNED);
+	if (!force_local) {
+		new_base = switch_hrtimer_base(timer, base,
+					       mode & HRTIMER_MODE_PINNED);
+	} else {
+		new_base = base;
+	}
+
+	first = enqueue_hrtimer(timer, new_base, mode);
+	if (!force_local)
+		return first;
 
-	return enqueue_hrtimer(timer, new_base, mode);
+	/*
+	 * Timer was forced to stay on the current CPU to avoid
+	 * reprogramming on removal and enqueue. Force reprogram the
+	 * hardware by evaluating the new first expiring timer.
+	 */
+	hrtimer_force_reprogram(new_base->cpu_base, 1);
+	return 0;
 }
 
 /**
@@ -1168,7 +1214,7 @@ int hrtimer_try_to_cancel(struct hrtimer *timer)
 	base = lock_hrtimer_base(timer, &flags);
 
 	if (!hrtimer_callback_running(timer))
-		ret = remove_hrtimer(timer, base, false);
+		ret = remove_hrtimer(timer, base, false, false);
 
 	unlock_hrtimer_base(timer, &flags);
 

commit 293fe77dbfe68c5794be4e76c9212003e9304d24
Author: Dietmar Eggemann <dietmar.eggemann@arm.com>
Date:   Wed Aug 4 15:59:25 2021 +0200

    sched/deadline: Fix missing clock update in migrate_task_rq_dl()
    
    [ Upstream commit b4da13aa28d4fd0071247b7b41c579ee8a86c81a ]
    
    A missing clock update is causing the following warning:
    
    rq->clock_update_flags < RQCF_ACT_SKIP
    WARNING: CPU: 112 PID: 2041 at kernel/sched/sched.h:1453
    sub_running_bw.isra.0+0x190/0x1a0
    ...
    CPU: 112 PID: 2041 Comm: sugov:112 Tainted: G W 5.14.0-rc1 #1
    Hardware name: WIWYNN Mt.Jade Server System
    B81.030Z1.0007/Mt.Jade Motherboard, BIOS 1.6.20210526 (SCP:
    1.06.20210526) 2021/05/26
    ...
    Call trace:
      sub_running_bw.isra.0+0x190/0x1a0
      migrate_task_rq_dl+0xf8/0x1e0
      set_task_cpu+0xa8/0x1f0
      try_to_wake_up+0x150/0x3d4
      wake_up_q+0x64/0xc0
      __up_write+0xd0/0x1c0
      up_write+0x4c/0x2b0
      cppc_set_perf+0x120/0x2d0
      cppc_cpufreq_set_target+0xe0/0x1a4 [cppc_cpufreq]
      __cpufreq_driver_target+0x74/0x140
      sugov_work+0x64/0x80
      kthread_worker_fn+0xe0/0x230
      kthread+0x138/0x140
      ret_from_fork+0x10/0x18
    
    The task causing this is the `cppc_fie` DL task introduced by
    commit 1eb5dde674f5 ("cpufreq: CPPC: Add support for frequency
    invariance").
    
    With CONFIG_ACPI_CPPC_CPUFREQ_FIE=y and schedutil cpufreq governor on
    slow-switching system (like on this Ampere Altra WIWYNN Mt. Jade Arm
    Server):
    
    DL task `curr=sugov:112` lets `p=cppc_fie` migrate and since the latter
    is in `non_contending` state, migrate_task_rq_dl() calls
    
      sub_running_bw()->__sub_running_bw()->cpufreq_update_util()->
      rq_clock()->assert_clock_updated()
    
    on p.
    
    Fix this by updating the clock for a non_contending task in
    migrate_task_rq_dl() before calling sub_running_bw().
    
    Reported-by: Bruno Goncalves <bgoncalv@redhat.com>
    Signed-off-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Daniel Bristot de Oliveira <bristot@kernel.org>
    Acked-by: Juri Lelli <juri.lelli@redhat.com>
    Link: https://lore.kernel.org/r/20210804135925.3734605-1-dietmar.eggemann@arm.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index 9b2bb5f3ce09..beec5081a55a 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -1654,6 +1654,7 @@ static void migrate_task_rq_dl(struct task_struct *p, int new_cpu __maybe_unused
 	 */
 	raw_spin_lock(&rq->lock);
 	if (p->dl.dl_non_contending) {
+		update_rq_clock(rq);
 		sub_running_bw(&p->dl, &rq->dl);
 		p->dl.dl_non_contending = 0;
 		/*

commit c27cabac4afe8ca3822178888613499accb06920
Author: Tony Lindgren <tony@atomide.com>
Date:   Tue Jul 27 13:23:34 2021 +0300

    crypto: omap-sham - clear dma flags only after omap_sham_update_dma_stop()
    
    [ Upstream commit fe28140b3393b0ba1eb95cc109f974a7e58b26fd ]
    
    We should not clear FLAGS_DMA_ACTIVE before omap_sham_update_dma_stop() is
    done calling dma_unmap_sg(). We already clear FLAGS_DMA_ACTIVE at the
    end of omap_sham_update_dma_stop().
    
    The early clearing of FLAGS_DMA_ACTIVE is not causing issues as we do not
    need to defer anything based on FLAGS_DMA_ACTIVE currently. So this can be
    applied as clean-up.
    
    Cc: Lokesh Vutla <lokeshvutla@ti.com>
    Cc: Tero Kristo <kristo@kernel.org>
    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/omap-sham.c b/drivers/crypto/omap-sham.c
index 4d31ef472436..180f2f61b8fb 100644
--- a/drivers/crypto/omap-sham.c
+++ b/drivers/crypto/omap-sham.c
@@ -1739,7 +1739,7 @@ static void omap_sham_done_task(unsigned long data)
 		if (test_and_clear_bit(FLAGS_OUTPUT_READY, &dd->flags))
 			goto finish;
 	} else if (test_bit(FLAGS_DMA_READY, &dd->flags)) {
-		if (test_and_clear_bit(FLAGS_DMA_ACTIVE, &dd->flags)) {
+		if (test_bit(FLAGS_DMA_ACTIVE, &dd->flags)) {
 			omap_sham_update_dma_stop(dd);
 			if (dd->err) {
 				err = dd->err;

commit c1c3b899fb5d481c2a0ea99f259be44b1115e209
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Sun Aug 1 15:30:59 2021 +0200

    power: supply: axp288_fuel_gauge: Report register-address on readb / writeb errors
    
    [ Upstream commit caa534c3ba40c6e8352b42cbbbca9ba481814ac8 ]
    
    When fuel_gauge_reg_readb()/_writeb() fails, report which register we
    were trying to read / write when the error happened.
    
    Also reword the message a bit:
    - Drop the axp288 prefix, dev_err() already prints this
    - Switch from telegram / abbreviated style to a normal sentence, aligning
      the message with those from fuel_gauge_read_*bit_word()
    
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/power/supply/axp288_fuel_gauge.c b/drivers/power/supply/axp288_fuel_gauge.c
index 157cf5ec6b02..1641868c345c 100644
--- a/drivers/power/supply/axp288_fuel_gauge.c
+++ b/drivers/power/supply/axp288_fuel_gauge.c
@@ -158,7 +158,7 @@ static int fuel_gauge_reg_readb(struct axp288_fg_info *info, int reg)
 	}
 
 	if (ret < 0) {
-		dev_err(&info->pdev->dev, "axp288 reg read err:%d\n", ret);
+		dev_err(&info->pdev->dev, "Error reading reg 0x%02x err: %d\n", reg, ret);
 		return ret;
 	}
 
@@ -172,7 +172,7 @@ static int fuel_gauge_reg_writeb(struct axp288_fg_info *info, int reg, u8 val)
 	ret = regmap_write(info->regmap, reg, (unsigned int)val);
 
 	if (ret < 0)
-		dev_err(&info->pdev->dev, "axp288 reg write err:%d\n", ret);
+		dev_err(&info->pdev->dev, "Error writing reg 0x%02x err: %d\n", reg, ret);
 
 	return ret;
 }

commit bc0d543f53e0d73059cf10733be0109984dadd44
Author: Quentin Perret <qperret@google.com>
Date:   Tue Jul 27 11:11:01 2021 +0100

    sched/deadline: Fix reset_on_fork reporting of DL tasks
    
    [ Upstream commit f95091536f78971b269ec321b057b8d630b0ad8a ]
    
    It is possible for sched_getattr() to incorrectly report the state of
    the reset_on_fork flag when called on a deadline task.
    
    Indeed, if the flag was set on a deadline task using sched_setattr()
    with flags (SCHED_FLAG_RESET_ON_FORK | SCHED_FLAG_KEEP_PARAMS), then
    p->sched_reset_on_fork will be set, but __setscheduler() will bail out
    early, which means that the dl_se->flags will not get updated by
    __setscheduler_params()->__setparam_dl(). Consequently, if
    sched_getattr() is then called on the task, __getparam_dl() will
    override kattr.sched_flags with the now out-of-date copy in dl_se->flags
    and report the stale value to userspace.
    
    To fix this, make sure to only copy the flags that are relevant to
    sched_deadline to and from the dl_se->flags field.
    
    Signed-off-by: Quentin Perret <qperret@google.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lore.kernel.org/r/20210727101103.2729607-2-qperret@google.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index aa592dc3cb40..9b2bb5f3ce09 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -2615,7 +2615,7 @@ void __setparam_dl(struct task_struct *p, const struct sched_attr *attr)
 	dl_se->dl_runtime = attr->sched_runtime;
 	dl_se->dl_deadline = attr->sched_deadline;
 	dl_se->dl_period = attr->sched_period ?: dl_se->dl_deadline;
-	dl_se->flags = attr->sched_flags;
+	dl_se->flags = attr->sched_flags & SCHED_DL_FLAGS;
 	dl_se->dl_bw = to_ratio(dl_se->dl_period, dl_se->dl_runtime);
 	dl_se->dl_density = to_ratio(dl_se->dl_deadline, dl_se->dl_runtime);
 }
@@ -2628,7 +2628,8 @@ void __getparam_dl(struct task_struct *p, struct sched_attr *attr)
 	attr->sched_runtime = dl_se->dl_runtime;
 	attr->sched_deadline = dl_se->dl_deadline;
 	attr->sched_period = dl_se->dl_period;
-	attr->sched_flags = dl_se->flags;
+	attr->sched_flags &= ~SCHED_DL_FLAGS;
+	attr->sched_flags |= dl_se->flags;
 }
 
 /*
@@ -2703,7 +2704,7 @@ bool dl_param_changed(struct task_struct *p, const struct sched_attr *attr)
 	if (dl_se->dl_runtime != attr->sched_runtime ||
 	    dl_se->dl_deadline != attr->sched_deadline ||
 	    dl_se->dl_period != attr->sched_period ||
-	    dl_se->flags != attr->sched_flags)
+	    dl_se->flags != (attr->sched_flags & SCHED_DL_FLAGS))
 		return true;
 
 	return false;
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index 7b7ba91e319b..55e695080fc6 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -209,6 +209,8 @@ static inline int task_has_dl_policy(struct task_struct *p)
  */
 #define SCHED_FLAG_SUGOV	0x10000000
 
+#define SCHED_DL_FLAGS (SCHED_FLAG_RECLAIM | SCHED_FLAG_DL_OVERRUN | SCHED_FLAG_SUGOV)
+
 static inline bool dl_entity_is_special(struct sched_dl_entity *dl_se)
 {
 #ifdef CONFIG_CPU_FREQ_GOV_SCHEDUTIL

commit 463cca05f6ca46813f40585e63e7ac9b304ed15a
Author: Sean Anderson <sean.anderson@seco.com>
Date:   Thu Jul 1 14:56:37 2021 -0400

    crypto: mxs-dcp - Check for DMA mapping errors
    
    [ Upstream commit df6313d707e575a679ada3313358289af24454c0 ]
    
    After calling dma_map_single(), we must also call dma_mapping_error().
    This fixes the following warning when compiling with CONFIG_DMA_API_DEBUG:
    
    [  311.241478] WARNING: CPU: 0 PID: 428 at kernel/dma/debug.c:1027 check_unmap+0x79c/0x96c
    [  311.249547] DMA-API: mxs-dcp 2280000.crypto: device driver failed to check map error[device address=0x00000000860cb080] [size=32 bytes] [mapped as single]
    
    Signed-off-by: Sean Anderson <sean.anderson@seco.com>
    Reviewed-by: Richard Weinberger <richard@nod.at>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/mxs-dcp.c b/drivers/crypto/mxs-dcp.c
index b0c592073a4a..d220e6a3f836 100644
--- a/drivers/crypto/mxs-dcp.c
+++ b/drivers/crypto/mxs-dcp.c
@@ -167,15 +167,19 @@ static struct dcp *global_sdcp;
 
 static int mxs_dcp_start_dma(struct dcp_async_ctx *actx)
 {
+	int dma_err;
 	struct dcp *sdcp = global_sdcp;
 	const int chan = actx->chan;
 	uint32_t stat;
 	unsigned long ret;
 	struct dcp_dma_desc *desc = &sdcp->coh->desc[actx->chan];
-
 	dma_addr_t desc_phys = dma_map_single(sdcp->dev, desc, sizeof(*desc),
 					      DMA_TO_DEVICE);
 
+	dma_err = dma_mapping_error(sdcp->dev, desc_phys);
+	if (dma_err)
+		return dma_err;
+
 	reinit_completion(&sdcp->completion[chan]);
 
 	/* Clear status register. */
@@ -213,18 +217,29 @@ static int mxs_dcp_start_dma(struct dcp_async_ctx *actx)
 static int mxs_dcp_run_aes(struct dcp_async_ctx *actx,
 			   struct ablkcipher_request *req, int init)
 {
+	dma_addr_t key_phys, src_phys, dst_phys;
 	struct dcp *sdcp = global_sdcp;
 	struct dcp_dma_desc *desc = &sdcp->coh->desc[actx->chan];
 	struct dcp_aes_req_ctx *rctx = ablkcipher_request_ctx(req);
 	int ret;
 
-	dma_addr_t key_phys = dma_map_single(sdcp->dev, sdcp->coh->aes_key,
-					     2 * AES_KEYSIZE_128,
-					     DMA_TO_DEVICE);
-	dma_addr_t src_phys = dma_map_single(sdcp->dev, sdcp->coh->aes_in_buf,
-					     DCP_BUF_SZ, DMA_TO_DEVICE);
-	dma_addr_t dst_phys = dma_map_single(sdcp->dev, sdcp->coh->aes_out_buf,
-					     DCP_BUF_SZ, DMA_FROM_DEVICE);
+	key_phys = dma_map_single(sdcp->dev, sdcp->coh->aes_key,
+				  2 * AES_KEYSIZE_128, DMA_TO_DEVICE);
+	ret = dma_mapping_error(sdcp->dev, key_phys);
+	if (ret)
+		return ret;
+
+	src_phys = dma_map_single(sdcp->dev, sdcp->coh->aes_in_buf,
+				  DCP_BUF_SZ, DMA_TO_DEVICE);
+	ret = dma_mapping_error(sdcp->dev, src_phys);
+	if (ret)
+		goto err_src;
+
+	dst_phys = dma_map_single(sdcp->dev, sdcp->coh->aes_out_buf,
+				  DCP_BUF_SZ, DMA_FROM_DEVICE);
+	ret = dma_mapping_error(sdcp->dev, dst_phys);
+	if (ret)
+		goto err_dst;
 
 	if (actx->fill % AES_BLOCK_SIZE) {
 		dev_err(sdcp->dev, "Invalid block size!\n");
@@ -262,10 +277,12 @@ static int mxs_dcp_run_aes(struct dcp_async_ctx *actx,
 	ret = mxs_dcp_start_dma(actx);
 
 aes_done_run:
+	dma_unmap_single(sdcp->dev, dst_phys, DCP_BUF_SZ, DMA_FROM_DEVICE);
+err_dst:
+	dma_unmap_single(sdcp->dev, src_phys, DCP_BUF_SZ, DMA_TO_DEVICE);
+err_src:
 	dma_unmap_single(sdcp->dev, key_phys, 2 * AES_KEYSIZE_128,
 			 DMA_TO_DEVICE);
-	dma_unmap_single(sdcp->dev, src_phys, DCP_BUF_SZ, DMA_TO_DEVICE);
-	dma_unmap_single(sdcp->dev, dst_phys, DCP_BUF_SZ, DMA_FROM_DEVICE);
 
 	return ret;
 }
@@ -565,6 +582,10 @@ static int mxs_dcp_run_sha(struct ahash_request *req)
 	dma_addr_t buf_phys = dma_map_single(sdcp->dev, sdcp->coh->sha_in_buf,
 					     DCP_BUF_SZ, DMA_TO_DEVICE);
 
+	ret = dma_mapping_error(sdcp->dev, buf_phys);
+	if (ret)
+		return ret;
+
 	/* Fill in the DMA descriptor. */
 	desc->control0 = MXS_DCP_CONTROL0_DECR_SEMAPHORE |
 		    MXS_DCP_CONTROL0_INTERRUPT |
@@ -597,6 +618,10 @@ static int mxs_dcp_run_sha(struct ahash_request *req)
 	if (rctx->fini) {
 		digest_phys = dma_map_single(sdcp->dev, sdcp->coh->sha_out_buf,
 					     DCP_SHA_PAY_SZ, DMA_FROM_DEVICE);
+		ret = dma_mapping_error(sdcp->dev, digest_phys);
+		if (ret)
+			goto done_run;
+
 		desc->control0 |= MXS_DCP_CONTROL0_HASH_TERM;
 		desc->payload = digest_phys;
 	}

commit 02c0d85cd4d5628d122be60fb62a97ca917ed108
Author: Jeongtae Park <jeongtae.park@gmail.com>
Date:   Thu Jul 1 23:26:30 2021 +0900

    regmap: fix the offset of register error log
    
    [ Upstream commit 1852f5ed358147095297a09cc3c6f160208a676d ]
    
    This patch fixes the offset of register error log
    by using regmap_get_offset().
    
    Signed-off-by: Jeongtae Park <jeongtae.park@gmail.com>
    Link: https://lore.kernel.org/r/20210701142630.44936-1-jeongtae.park@gmail.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
index e8b3353c18eb..330ab9c85d1b 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -1479,7 +1479,7 @@ static int _regmap_raw_write_impl(struct regmap *map, unsigned int reg,
 			if (ret) {
 				dev_err(map->dev,
 					"Error in caching of register: %x ret: %d\n",
-					reg + i, ret);
+					reg + regmap_get_offset(map, i), ret);
 				return ret;
 			}
 		}

commit b7a041073f4e72083dcd688a003a59bf9d9c9124
Author: Peter Zijlstra <peterz@infradead.org>
Date:   Wed Jun 30 17:35:18 2021 +0200

    locking/mutex: Fix HANDOFF condition
    
    [ Upstream commit 048661a1f963e9517630f080687d48af79ed784c ]
    
    Yanfei reported that setting HANDOFF should not depend on recomputing
    @first, only on @first state. Which would then give:
    
      if (ww_ctx || !first)
        first = __mutex_waiter_is_first(lock, &waiter);
      if (first)
        __mutex_set_flag(lock, MUTEX_FLAG_HANDOFF);
    
    But because 'ww_ctx || !first' is basically 'always' and the test for
    first is relatively cheap, omit that first branch entirely.
    
    Reported-by: Yanfei Xu <yanfei.xu@windriver.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Waiman Long <longman@redhat.com>
    Reviewed-by: Yanfei Xu <yanfei.xu@windriver.com>
    Link: https://lore.kernel.org/r/20210630154114.896786297@infradead.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/locking/mutex.c b/kernel/locking/mutex.c
index 354151fef06a..fbc62d360419 100644
--- a/kernel/locking/mutex.c
+++ b/kernel/locking/mutex.c
@@ -911,7 +911,6 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,
 		    struct ww_acquire_ctx *ww_ctx, const bool use_ww_ctx)
 {
 	struct mutex_waiter waiter;
-	bool first = false;
 	struct ww_mutex *ww;
 	int ret;
 
@@ -986,6 +985,8 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,
 
 	set_current_state(state);
 	for (;;) {
+		bool first;
+
 		/*
 		 * Once we hold wait_lock, we're serialized against
 		 * mutex_unlock() handing the lock off to us, do a trylock
@@ -1014,15 +1015,9 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,
 		spin_unlock(&lock->wait_lock);
 		schedule_preempt_disabled();
 
-		/*
-		 * ww_mutex needs to always recheck its position since its waiter
-		 * list is not FIFO ordered.
-		 */
-		if (ww_ctx || !first) {
-			first = __mutex_waiter_is_first(lock, &waiter);
-			if (first)
-				__mutex_set_flag(lock, MUTEX_FLAG_HANDOFF);
-		}
+		first = __mutex_waiter_is_first(lock, &waiter);
+		if (first)
+			__mutex_set_flag(lock, MUTEX_FLAG_HANDOFF);
 
 		set_current_state(state);
 		/*

commit 777631932f4a5185c18b3df1b47f365dbaa70252
Author: Marek Behún <kabel@kernel.org>
Date:   Thu Jun 24 19:14:17 2021 +0200

    PCI: Call Max Payload Size-related fixup quirks early
    
    commit b8da302e2955fe4d41eb9d48199242674d77dbe0 upstream.
    
    pci_device_add() calls HEADER fixups after pci_configure_device(), which
    configures Max Payload Size.
    
    Convert MPS-related fixups to EARLY fixups so pci_configure_mps() takes
    them into account.
    
    Fixes: 27d868b5e6cfa ("PCI: Set MPS to match upstream bridge")
    Link: https://lore.kernel.org/r/20210624171418.27194-1-kabel@kernel.org
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 7e873b6b7d55..821b0fbe03a6 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -3152,12 +3152,12 @@ static void fixup_mpss_256(struct pci_dev *dev)
 {
 	dev->pcie_mpss = 1; /* 256 bytes */
 }
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SOLARFLARE,
-			 PCI_DEVICE_ID_SOLARFLARE_SFC4000A_0, fixup_mpss_256);
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SOLARFLARE,
-			 PCI_DEVICE_ID_SOLARFLARE_SFC4000A_1, fixup_mpss_256);
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SOLARFLARE,
-			 PCI_DEVICE_ID_SOLARFLARE_SFC4000B, fixup_mpss_256);
+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SOLARFLARE,
+			PCI_DEVICE_ID_SOLARFLARE_SFC4000A_0, fixup_mpss_256);
+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SOLARFLARE,
+			PCI_DEVICE_ID_SOLARFLARE_SFC4000A_1, fixup_mpss_256);
+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SOLARFLARE,
+			PCI_DEVICE_ID_SOLARFLARE_SFC4000B, fixup_mpss_256);
 
 /*
  * Intel 5000 and 5100 Memory controllers have an erratum with read completion

commit 04931dd5fbe1855d4f783b0b1d74217c96125165
Author: Paul Gortmaker <paul.gortmaker@windriver.com>
Date:   Sun May 30 12:24:47 2021 -0400

    x86/reboot: Limit Dell Optiplex 990 quirk to early BIOS versions
    
    commit a729691b541f6e63043beae72e635635abe5dc09 upstream.
    
    When this platform was relatively new in November 2011, with early BIOS
    revisions, a reboot quirk was added in commit 6be30bb7d750 ("x86/reboot:
    Blacklist Dell OptiPlex 990 known to require PCI reboot")
    
    However, this quirk (and several others) are open-ended to all BIOS
    versions and left no automatic expiry if/when the system BIOS fixed the
    issue, meaning that nobody is likely to come along and re-test.
    
    What is really problematic with using PCI reboot as this quirk does, is
    that it causes this platform to do a full power down, wait one second,
    and then power back on.  This is less than ideal if one is using it for
    boot testing and/or bisecting kernels when legacy rotating hard disks
    are installed.
    
    It was only by chance that the quirk was noticed in dmesg - and when
    disabled it turned out that it wasn't required anymore (BIOS A24), and a
    default reboot would work fine without the "harshness" of power cycling the
    machine (and disks) down and up like the PCI reboot does.
    
    Doing a bit more research, it seems that the "newest" BIOS for which the
    issue was reported[1] was version A06, however Dell[2] seemed to suggest
    only up to and including version A05, with the A06 having a large number of
    fixes[3] listed.
    
    As is typical with a new platform, the initial BIOS updates come frequently
    and then taper off (and in this case, with a revival for CPU CVEs); a
    search for O990-A<ver>.exe reveals the following dates:
    
            A02     16 Mar 2011
            A03     11 May 2011
            A06     14 Sep 2011
            A07     24 Oct 2011
            A10     08 Dec 2011
            A14     06 Sep 2012
            A16     15 Oct 2012
            A18     30 Sep 2013
            A19     23 Sep 2015
            A20     02 Jun 2017
            A23     07 Mar 2018
            A24     21 Aug 2018
    
    While it's overkill to flash and test each of the above, it would seem
    likely that the issue was contained within A0x BIOS versions, given the
    dates above and the dates of issue reports[4] from distros.  So rather than
    just throw out the quirk entirely, limit the scope to just those early BIOS
    versions, in case people are still running systems from 2011 with the
    original as-shipped early A0x BIOS versions.
    
    [1] https://lore.kernel.org/lkml/1320373471-3942-1-git-send-email-trenn@suse.de/
    [2] https://www.dell.com/support/kbdoc/en-ca/000131908/linux-based-operating-systems-stall-upon-reboot-on-optiplex-390-790-990-systems
    [3] https://www.dell.com/support/home/en-ca/drivers/driversdetails?driverid=85j10
    [4] https://bugs.launchpad.net/ubuntu/+source/linux/+bug/768039
    
    Fixes: 6be30bb7d750 ("x86/reboot: Blacklist Dell OptiPlex 990 known to require PCI reboot")
    Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210530162447.996461-4-paul.gortmaker@windriver.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
index 6489cc19ed06..b0f3a996df15 100644
--- a/arch/x86/kernel/reboot.c
+++ b/arch/x86/kernel/reboot.c
@@ -388,10 +388,11 @@ static const struct dmi_system_id reboot_dmi_table[] __initconst = {
 	},
 	{	/* Handle problems with rebooting on the OptiPlex 990. */
 		.callback = set_pci_reboot,
-		.ident = "Dell OptiPlex 990",
+		.ident = "Dell OptiPlex 990 BIOS A0x",
 		.matches = {
 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
 			DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 990"),
+			DMI_MATCH(DMI_BIOS_VERSION, "A0"),
 		},
 	},
 	{	/* Handle problems with rebooting on Dell 300's */

commit 5339240fb9e5aedd97a43d04bd9847000fc3f955
Author: Chunfeng Yun <chunfeng.yun@mediatek.com>
Date:   Fri Aug 13 14:30:49 2021 +0800

    usb: mtu3: fix the wrong HS mult value
    
    commit 44e4439d8f9f8d0e9da767d1f31e7c211081feca upstream.
    
    usb_endpoint_maxp() returns actual max packet size, @mult will
    always be zero, fix it by using usb_endpoint_maxp_mult() instead
    to get mult.
    
    Fixes: 4d79e042ed8b ("usb: mtu3: add support for usb3.1 IP")
    Cc: stable@vger.kernel.org
    Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
    Link: https://lore.kernel.org/r/1628836253-7432-3-git-send-email-chunfeng.yun@mediatek.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/mtu3/mtu3_gadget.c b/drivers/usb/mtu3/mtu3_gadget.c
index 920d8e7536bd..270721cf229f 100644
--- a/drivers/usb/mtu3/mtu3_gadget.c
+++ b/drivers/usb/mtu3/mtu3_gadget.c
@@ -69,14 +69,12 @@ static int mtu3_ep_enable(struct mtu3_ep *mep)
 	u32 interval = 0;
 	u32 mult = 0;
 	u32 burst = 0;
-	int max_packet;
 	int ret;
 
 	desc = mep->desc;
 	comp_desc = mep->comp_desc;
 	mep->type = usb_endpoint_type(desc);
-	max_packet = usb_endpoint_maxp(desc);
-	mep->maxp = max_packet & GENMASK(10, 0);
+	mep->maxp = usb_endpoint_maxp(desc);
 
 	switch (mtu->g.speed) {
 	case USB_SPEED_SUPER:
@@ -97,7 +95,7 @@ static int mtu3_ep_enable(struct mtu3_ep *mep)
 				usb_endpoint_xfer_int(desc)) {
 			interval = desc->bInterval;
 			interval = clamp_val(interval, 1, 16) - 1;
-			mult = (max_packet & GENMASK(12, 11)) >> 11;
+			mult = usb_endpoint_maxp_mult(desc) - 1;
 		}
 		break;
 	default:

commit b8f832d565e769d88dbcfb3a3a53c7918e01c371
Author: Chunfeng Yun <chunfeng.yun@mediatek.com>
Date:   Fri Aug 13 14:30:48 2021 +0800

    usb: mtu3: use @mult for HS isoc or intr
    
    commit fd7cb394ec7efccc3985feb0978cee4d352e1817 upstream.
    
    For HS isoc or intr, should use @mult but not @burst
    to save mult value.
    
    Fixes: 4d79e042ed8b ("usb: mtu3: add support for usb3.1 IP")
    Cc: stable@vger.kernel.org
    Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
    Link: https://lore.kernel.org/r/1628836253-7432-2-git-send-email-chunfeng.yun@mediatek.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/mtu3/mtu3_gadget.c b/drivers/usb/mtu3/mtu3_gadget.c
index 3828ed6d38a2..920d8e7536bd 100644
--- a/drivers/usb/mtu3/mtu3_gadget.c
+++ b/drivers/usb/mtu3/mtu3_gadget.c
@@ -97,7 +97,7 @@ static int mtu3_ep_enable(struct mtu3_ep *mep)
 				usb_endpoint_xfer_int(desc)) {
 			interval = desc->bInterval;
 			interval = clamp_val(interval, 1, 16) - 1;
-			burst = (max_packet & GENMASK(12, 11)) >> 11;
+			mult = (max_packet & GENMASK(12, 11)) >> 11;
 		}
 		break;
 	default:

commit 1d7d5ffda8a8e28bb05c5e1ff53716cc7a5a2dd8
Author: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Date:   Fri Aug 27 15:32:27 2021 +0900

    usb: host: xhci-rcar: Don't reload firmware after the completion
    
    commit 57f3ffdc11143f56f1314972fe86fe17a0dcde85 upstream.
    
    According to the datasheet, "Upon the completion of FW Download,
    there is no need to write or reload FW.". Otherwise, it's possible
    to cause unexpected behaviors. So, adds such a condition.
    
    Fixes: 4ac8918f3a73 ("usb: host: xhci-plat: add support for the R-Car H2 and M2 xHCI controllers")
    Cc: stable@vger.kernel.org # v3.17+
    Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
    Link: https://lore.kernel.org/r/20210827063227.81990-1-yoshihiro.shimoda.uh@renesas.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/host/xhci-rcar.c b/drivers/usb/host/xhci-rcar.c
index 2b0ccd150209..4ebbe2c23292 100644
--- a/drivers/usb/host/xhci-rcar.c
+++ b/drivers/usb/host/xhci-rcar.c
@@ -143,6 +143,13 @@ static int xhci_rcar_download_firmware(struct usb_hcd *hcd)
 	const struct soc_device_attribute *attr;
 	const char *firmware_name;
 
+	/*
+	 * According to the datasheet, "Upon the completion of FW Download,
+	 * there is no need to write or reload FW".
+	 */
+	if (readl(regs + RCAR_USB3_DL_CTRL) & RCAR_USB3_DL_CTRL_FW_SUCCESS)
+		return 0;
+
 	attr = soc_device_match(rcar_quirks_match);
 	if (attr)
 		quirks = (uintptr_t)attr->data;

commit f9d1115fca4cb49b1cb363b6e702455e452e3d3b
Author: Alexander Tsoy <alexander@tsoy.me>
Date:   Tue Aug 31 03:25:31 2021 +0300

    ALSA: usb-audio: Add registration quirk for JBL Quantum 800
    
    commit c8b177b6e3a005bd8fb0395a4bc5db3470301c28 upstream.
    
    Add another device ID for JBL Quantum 800. It requires the same quirk as
    other JBL Quantum devices.
    
    Signed-off-by: Alexander Tsoy <alexander@tsoy.me>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210831002531.116957-1-alexander@tsoy.me
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
index 4114594e57a3..f4bdcff82f5c 100644
--- a/sound/usb/quirks.c
+++ b/sound/usb/quirks.c
@@ -1554,6 +1554,7 @@ static const struct registration_quirk registration_quirks[] = {
 	REG_QUIRK_ENTRY(0x0951, 0x16ed, 2),	/* Kingston HyperX Cloud Alpha S */
 	REG_QUIRK_ENTRY(0x0951, 0x16ea, 2),	/* Kingston HyperX Cloud Flight S */
 	REG_QUIRK_ENTRY(0x0ecb, 0x1f46, 2),	/* JBL Quantum 600 */
+	REG_QUIRK_ENTRY(0x0ecb, 0x1f47, 2),	/* JBL Quantum 800 */
 	REG_QUIRK_ENTRY(0x0ecb, 0x2039, 2),	/* JBL Quantum 400 */
 	REG_QUIRK_ENTRY(0x0ecb, 0x203c, 2),	/* JBL Quantum 600 */
 	REG_QUIRK_ENTRY(0x0ecb, 0x203e, 2),	/* JBL Quantum 800 */

commit 1059d8a3e222f7127724ad307e6a5a85a9a6f7d7
Author: Qu Wenruo <wqu@suse.com>
Date:   Wed Aug 25 13:41:42 2021 +0800

    Revert "btrfs: compression: don't try to compress if we don't have enough pages"
    
    commit 4e9655763b82a91e4c341835bb504a2b1590f984 upstream.
    
    This reverts commit f2165627319ffd33a6217275e5690b1ab5c45763.
    
    [BUG]
    It's no longer possible to create compressed inline extent after commit
    f2165627319f ("btrfs: compression: don't try to compress if we don't
    have enough pages").
    
    [CAUSE]
    For compression code, there are several possible reasons we have a range
    that needs to be compressed while it's no more than one page.
    
    - Compressed inline write
      The data is always smaller than one sector and the test lacks the
      condition to properly recognize a non-inline extent.
    
    - Compressed subpage write
      For the incoming subpage compressed write support, we require page
      alignment of the delalloc range.
      And for 64K page size, we can compress just one page into smaller
      sectors.
    
    For those reasons, the requirement for the data to be more than one page
    is not correct, and is already causing regression for compressed inline
    data writeback.  The idea of skipping one page to avoid wasting CPU time
    could be revisited in the future.
    
    [FIX]
    Fix it by reverting the offending commit.
    
    Reported-by: Zygo Blaxell <ce3g8jdj@umail.furryterror.org>
    Link: https://lore.kernel.org/linux-btrfs/afa2742.c084f5d6.17b6b08dffc@tnonline.net
    Fixes: f2165627319f ("btrfs: compression: don't try to compress if we don't have enough pages")
    CC: stable@vger.kernel.org # 4.4+
    Signed-off-by: Qu Wenruo <wqu@suse.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 6f02a3f77fa8..f314b2c2d148 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -530,7 +530,7 @@ static noinline void compress_file_range(struct inode *inode,
 	 * inode has not been flagged as nocompress.  This flag can
 	 * change at any time if we discover bad compression ratios.
 	 */
-	if (nr_pages > 1 && inode_need_compress(inode, start, end)) {
+	if (inode_need_compress(inode, start, end)) {
 		WARN_ON(pages);
 		pages = kcalloc(nr_pages, sizeof(struct page *), GFP_NOFS);
 		if (!pages) {

commit dd8b408964e77e9b23c4fc6e0cca61bc9345a01f
Author: Muchun Song <songmuchun@bytedance.com>
Date:   Mon Dec 14 19:11:25 2020 -0800

    mm/page_alloc: speed up the iteration of max_order
    
    commit 7ad69832f37e3cea8557db6df7c793905f1135e8 upstream.
    
    When we free a page whose order is very close to MAX_ORDER and greater
    than pageblock_order, it wastes some CPU cycles to increase max_order to
    MAX_ORDER one by one and check the pageblock migratetype of that page
    repeatedly especially when MAX_ORDER is much larger than pageblock_order.
    
    We also should not be checking migratetype of buddy when "order ==
    MAX_ORDER - 1" as the buddy pfn may be invalid, so adjust the condition.
    With the new check, we don't need the max_order check anymore, so we
    replace it.
    
    Also adjust max_order initialization so that it's lower by one than
    previously, which makes the code hopefully more clear.
    
    Link: https://lkml.kernel.org/r/20201204155109.55451-1-songmuchun@bytedance.com
    Fixes: d9dddbf55667 ("mm/page_alloc: prevent merging between isolated and other pageblocks")
    Signed-off-by: Muchun Song <songmuchun@bytedance.com>
    Acked-by: Vlastimil Babka <vbabka@suse.cz>
    Reviewed-by: Oscar Salvador <osalvador@suse.de>
    Reviewed-by: David Hildenbrand <david@redhat.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 4446a523e684..afcaa657a022 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -807,7 +807,7 @@ static inline void __free_one_page(struct page *page,
 	struct page *buddy;
 	unsigned int max_order;
 
-	max_order = min_t(unsigned int, MAX_ORDER, pageblock_order + 1);
+	max_order = min_t(unsigned int, MAX_ORDER - 1, pageblock_order);
 
 	VM_BUG_ON(!zone_is_initialized(zone));
 	VM_BUG_ON_PAGE(page->flags & PAGE_FLAGS_CHECK_AT_PREP, page);
@@ -820,7 +820,7 @@ static inline void __free_one_page(struct page *page,
 	VM_BUG_ON_PAGE(bad_range(zone, page), page);
 
 continue_merging:
-	while (order < max_order - 1) {
+	while (order < max_order) {
 		buddy_pfn = __find_buddy_pfn(pfn, order);
 		buddy = page + (buddy_pfn - pfn);
 
@@ -844,7 +844,7 @@ static inline void __free_one_page(struct page *page,
 		pfn = combined_pfn;
 		order++;
 	}
-	if (max_order < MAX_ORDER) {
+	if (order < MAX_ORDER - 1) {
 		/* If we are here, it means order is >= pageblock_order.
 		 * We want to prevent merge between freepages on isolate
 		 * pageblock and normal pageblock. Without this, pageblock
@@ -865,7 +865,7 @@ static inline void __free_one_page(struct page *page,
 						is_migrate_isolate(buddy_mt)))
 				goto done_merging;
 		}
-		max_order++;
+		max_order = order + 1;
 		goto continue_merging;
 	}
 

commit 8e531fb101fb8632bb09f67bdbe0e3b41a1d7967
Author: Esben Haabendal <esben@geanix.com>
Date:   Mon Jun 21 10:20:08 2021 +0200

    net: ll_temac: Remove left-over debug message
    
    commit ce03b94ba682a67e8233c9ee3066071656ded58f upstream.
    
    Fixes: f63963411942 ("net: ll_temac: Avoid ndo_start_xmit returning NETDEV_TX_BUSY")
    Signed-off-by: Esben Haabendal <esben@geanix.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/xilinx/ll_temac_main.c b/drivers/net/ethernet/xilinx/ll_temac_main.c
index 939de185bc6b..178234e94cd1 100644
--- a/drivers/net/ethernet/xilinx/ll_temac_main.c
+++ b/drivers/net/ethernet/xilinx/ll_temac_main.c
@@ -736,10 +736,8 @@ temac_start_xmit(struct sk_buff *skb, struct net_device *ndev)
 	/* Kick off the transfer */
 	lp->dma_out(lp, TX_TAILDESC_PTR, tail_p); /* DMA start */
 
-	if (temac_check_tx_bd_space(lp, MAX_SKB_FRAGS + 1)) {
-		netdev_info(ndev, "%s -> netif_stop_queue\n", __func__);
+	if (temac_check_tx_bd_space(lp, MAX_SKB_FRAGS + 1))
 		netif_stop_queue(ndev);
-	}
 
 	return NETDEV_TX_OK;
 }

commit fa4468a122f243dd0ae89721b7f13f064fbae8d6
Author: Fangrui Song <maskray@google.com>
Date:   Wed Mar 25 09:42:57 2020 -0700

    powerpc/boot: Delete unneeded .globl _zimage_start
    
    commit 968339fad422a58312f67718691b717dac45c399 upstream.
    
    .globl sets the symbol binding to STB_GLOBAL while .weak sets the
    binding to STB_WEAK. GNU as let .weak override .globl since
    binutils-gdb 5ca547dc2399a0a5d9f20626d4bf5547c3ccfddd (1996). Clang
    integrated assembler let the last win but it may error in the future.
    
    Since it is a convention that only one binding directive is used, just
    delete .globl.
    
    Fixes: ee9d21b3b358 ("powerpc/boot: Ensure _zimage_start is a weak symbol")
    Signed-off-by: Fangrui Song <maskray@google.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20200325164257.170229-1-maskray@google.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/powerpc/boot/crt0.S b/arch/powerpc/boot/crt0.S
index 9b9d17437373..0247b8e6cb1b 100644
--- a/arch/powerpc/boot/crt0.S
+++ b/arch/powerpc/boot/crt0.S
@@ -49,9 +49,6 @@ p_end:		.long	_end
 p_pstack:	.long	_platform_stack_top
 #endif
 
-	.globl	_zimage_start
-	/* Clang appears to require the .weak directive to be after the symbol
-	 * is defined. See https://bugs.llvm.org/show_bug.cgi?id=38921  */
 	.weak	_zimage_start
 _zimage_start:
 	.globl	_zimage_start_lib

commit 78f92d8ce3b101ee591f56c75833fc449d95a948
Author: Michael Ellerman <mpe@ellerman.id.au>
Date:   Sat Jul 6 00:18:53 2019 +1000

    powerpc/module64: Fix comment in R_PPC64_ENTRY handling
    
    commit 2fb0a2c989837c976b68233496bbaefb47cd3d6f upstream.
    
    The comment here is wrong, the addi reads from r2 not r12. The code is
    correct, 0x38420000 = addi r2,r2,0.
    
    Fixes: a61674bdfc7c ("powerpc/module: Handle R_PPC64_ENTRY relocations")
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c
index 8661eea78503..4bf81a111179 100644
--- a/arch/powerpc/kernel/module_64.c
+++ b/arch/powerpc/kernel/module_64.c
@@ -719,7 +719,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
 			/*
 			 * If found, replace it with:
 			 *	addis r2, r12, (.TOC.-func)@ha
-			 *	addi r2, r12, (.TOC.-func)@l
+			 *	addi  r2,  r2, (.TOC.-func)@l
 			 */
 			((uint32_t *)location)[0] = 0x3c4c0000 + PPC_HA(value);
 			((uint32_t *)location)[1] = 0x38420000 + PPC_LO(value);

commit 145cbec513bfca1c406cde474e792f655b3e9bd5
Author: Christophe Leroy <christophe.leroy@c-s.fr>
Date:   Tue May 21 13:34:09 2019 +0000

    crypto: talitos - reduce max key size for SEC1
    
    commit b8fbdc2bc4e71b62646031d5df5f08aafe15d5ad upstream.
    
    SEC1 doesn't support SHA384/512, so it doesn't require
    longer keys.
    
    This patch reduces the max key size when the driver
    is built for SEC1 only.
    
    Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
    Fixes: 03d2c5114c95 ("crypto: talitos - Extend max key length for SHA384/512-HMAC and AEAD")
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c
index 7a55baa861e5..07e1a286ee43 100644
--- a/drivers/crypto/talitos.c
+++ b/drivers/crypto/talitos.c
@@ -853,7 +853,11 @@ static void talitos_unregister_rng(struct device *dev)
  * HMAC_SNOOP_NO_AFEA (HSNA) instead of type IPSEC_ESP
  */
 #define TALITOS_CRA_PRIORITY_AEAD_HSNA	(TALITOS_CRA_PRIORITY - 1)
+#ifdef CONFIG_CRYPTO_DEV_TALITOS_SEC2
 #define TALITOS_MAX_KEY_SIZE		(AES_MAX_KEY_SIZE + SHA512_BLOCK_SIZE)
+#else
+#define TALITOS_MAX_KEY_SIZE		(AES_MAX_KEY_SIZE + SHA256_BLOCK_SIZE)
+#endif
 #define TALITOS_MAX_IV_LENGTH		16 /* max of AES_BLOCK_SIZE, DES3_EDE_BLOCK_SIZE */
 
 struct talitos_ctx {

commit 692bae5b0a749841199eb9e39b67a3c6448eb586
Author: Trond Myklebust <trondmy@gmail.com>
Date:   Tue Apr 9 11:46:14 2019 -0400

    SUNRPC/nfs: Fix return value for nfs4_callback_compound()
    
    commit 83dd59a0b9afc3b1a2642fb5c9b0585b1c08768f upstream.
    
    RPC server procedures are normally expected to return a __be32 encoded
    status value of type 'enum rpc_accept_stat', however at least one function
    wants to return an authentication status of type 'enum rpc_auth_stat'
    in the case where authentication fails.
    This patch adds functionality to allow this.
    
    Fixes: a4e187d83d88 ("NFS: Don't drop CB requests with invalid principals")
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: J. Bruce Fields <bfields@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/nfs/callback_xdr.c b/fs/nfs/callback_xdr.c
index a87a56273407..57558a8d92e9 100644
--- a/fs/nfs/callback_xdr.c
+++ b/fs/nfs/callback_xdr.c
@@ -991,7 +991,7 @@ static __be32 nfs4_callback_compound(struct svc_rqst *rqstp)
 
 out_invalidcred:
 	pr_warn_ratelimited("NFS: NFSv4 callback contains invalid cred\n");
-	return rpc_autherr_badcred;
+	return svc_return_autherr(rqstp, rpc_autherr_badcred);
 }
 
 /*
diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h
index fdb6b317d974..c46abf35c9bb 100644
--- a/include/linux/sunrpc/svc.h
+++ b/include/linux/sunrpc/svc.h
@@ -271,6 +271,7 @@ struct svc_rqst {
 #define	RQ_VICTIM	(5)			/* about to be shut down */
 #define	RQ_BUSY		(6)			/* request is busy */
 #define	RQ_DATA		(7)			/* request has data */
+#define RQ_AUTHERR	(8)			/* Request status is auth error */
 	unsigned long		rq_flags;	/* flags field */
 	ktime_t			rq_qtime;	/* enqueue time */
 
@@ -504,6 +505,7 @@ unsigned int	   svc_fill_write_vector(struct svc_rqst *rqstp,
 char		  *svc_fill_symlink_pathname(struct svc_rqst *rqstp,
 					     struct kvec *first, void *p,
 					     size_t total);
+__be32		   svc_return_autherr(struct svc_rqst *rqstp, __be32 auth_err);
 
 #define	RPC_MAX_ADDRBUFLEN	(63U)
 
diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
index 11d393c04772..6a606af8de81 100644
--- a/net/sunrpc/svc.c
+++ b/net/sunrpc/svc.c
@@ -1146,6 +1146,22 @@ static __printf(2,3) void svc_printk(struct svc_rqst *rqstp, const char *fmt, ..
 
 extern void svc_tcp_prep_reply_hdr(struct svc_rqst *);
 
+__be32
+svc_return_autherr(struct svc_rqst *rqstp, __be32 auth_err)
+{
+	set_bit(RQ_AUTHERR, &rqstp->rq_flags);
+	return auth_err;
+}
+EXPORT_SYMBOL_GPL(svc_return_autherr);
+
+static __be32
+svc_get_autherr(struct svc_rqst *rqstp, __be32 *statp)
+{
+	if (test_and_clear_bit(RQ_AUTHERR, &rqstp->rq_flags))
+		return *statp;
+	return rpc_auth_ok;
+}
+
 /*
  * Common routine for processing the RPC request.
  */
@@ -1296,11 +1312,9 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
 				procp->pc_release(rqstp);
 			goto dropit;
 		}
-		if (*statp == rpc_autherr_badcred) {
-			if (procp->pc_release)
-				procp->pc_release(rqstp);
-			goto err_bad_auth;
-		}
+		auth_stat = svc_get_autherr(rqstp, statp);
+		if (auth_stat != rpc_auth_ok)
+			goto err_release_bad_auth;
 		if (*statp == rpc_success && procp->pc_encode &&
 		    !procp->pc_encode(rqstp, resv->iov_base + resv->iov_len)) {
 			dprintk("svc: failed to encode reply\n");
@@ -1359,6 +1373,9 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
 	svc_putnl(resv, 2);
 	goto sendit;
 
+err_release_bad_auth:
+	if (procp->pc_release)
+		procp->pc_release(rqstp);
 err_bad_auth:
 	dprintk("svc: authentication failed (%d)\n", ntohl(auth_stat));
 	serv->sv_stats->rpcbadauth++;

commit 69178f2d652e64991dc812be24d0776a731f447d
Author: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Date:   Mon Oct 12 10:50:14 2020 -0400

    ipv4/icmp: l3mdev: Perform icmp error route lookup on source device routing table (v2)
    
    commit e1e84eb58eb494b77c8389fc6308b5042dcce791 upstream.
    
    As per RFC792, ICMP errors should be sent to the source host.
    
    However, in configurations with Virtual Routing and Forwarding tables,
    looking up which routing table to use is currently done by using the
    destination net_device.
    
    commit 9d1a6c4ea43e ("net: icmp_route_lookup should use rt dev to
    determine L3 domain") changes the interface passed to
    l3mdev_master_ifindex() and inet_addr_type_dev_table() from skb_in->dev
    to skb_dst(skb_in)->dev. This effectively uses the destination device
    rather than the source device for choosing which routing table should be
    used to lookup where to send the ICMP error.
    
    Therefore, if the source and destination interfaces are within separate
    VRFs, or one in the global routing table and the other in a VRF, looking
    up the source host in the destination interface's routing table will
    fail if the destination interface's routing table contains no route to
    the source host.
    
    One observable effect of this issue is that traceroute does not work in
    the following cases:
    
    - Route leaking between global routing table and VRF
    - Route leaking between VRFs
    
    Preferably use the source device routing table when sending ICMP error
    messages. If no source device is set, fall-back on the destination
    device routing table. Else, use the main routing table (index 0).
    
    [ It has been pointed out that a similar issue may exist with ICMP
      errors triggered when forwarding between network namespaces. It would
      be worthwhile to investigate, but is outside of the scope of this
      investigation. ]
    
    [ It has also been pointed out that a similar issue exists with
      unreachable / fragmentation needed messages, which can be triggered by
      changing the MTU of eth1 in r1 to 1400 and running:
    
      ip netns exec h1 ping -s 1450 -Mdo -c1 172.16.2.2
    
      Some investigation points to raw_icmp_error() and raw_err() as being
      involved in this last scenario. The focus of this patch is TTL expired
      ICMP messages, which go through icmp_route_lookup.
      Investigation of failure modes related to raw_icmp_error() is beyond
      this investigation's scope. ]
    
    Fixes: 9d1a6c4ea43e ("net: icmp_route_lookup should use rt dev to determine L3 domain")
    Link: https://tools.ietf.org/html/rfc792
    Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Reviewed-by: David Ahern <dsahern@gmail.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
index dde6cf82e9f0..fe10a565b7d8 100644
--- a/net/ipv4/icmp.c
+++ b/net/ipv4/icmp.c
@@ -465,6 +465,23 @@ static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb)
 	local_bh_enable();
 }
 
+/*
+ * The device used for looking up which routing table to use for sending an ICMP
+ * error is preferably the source whenever it is set, which should ensure the
+ * icmp error can be sent to the source host, else lookup using the routing
+ * table of the destination device, else use the main routing table (index 0).
+ */
+static struct net_device *icmp_get_route_lookup_dev(struct sk_buff *skb)
+{
+	struct net_device *route_lookup_dev = NULL;
+
+	if (skb->dev)
+		route_lookup_dev = skb->dev;
+	else if (skb_dst(skb))
+		route_lookup_dev = skb_dst(skb)->dev;
+	return route_lookup_dev;
+}
+
 static struct rtable *icmp_route_lookup(struct net *net,
 					struct flowi4 *fl4,
 					struct sk_buff *skb_in,
@@ -473,6 +490,7 @@ static struct rtable *icmp_route_lookup(struct net *net,
 					int type, int code,
 					struct icmp_bxm *param)
 {
+	struct net_device *route_lookup_dev;
 	struct rtable *rt, *rt2;
 	struct flowi4 fl4_dec;
 	int err;
@@ -487,7 +505,8 @@ static struct rtable *icmp_route_lookup(struct net *net,
 	fl4->flowi4_proto = IPPROTO_ICMP;
 	fl4->fl4_icmp_type = type;
 	fl4->fl4_icmp_code = code;
-	fl4->flowi4_oif = l3mdev_master_ifindex(skb_dst(skb_in)->dev);
+	route_lookup_dev = icmp_get_route_lookup_dev(skb_in);
+	fl4->flowi4_oif = l3mdev_master_ifindex(route_lookup_dev);
 
 	security_skb_classify_flow(skb_in, flowi4_to_flowi(fl4));
 	rt = ip_route_output_key_hash(net, fl4, skb_in);
@@ -511,7 +530,7 @@ static struct rtable *icmp_route_lookup(struct net *net,
 	if (err)
 		goto relookup_failed;
 
-	if (inet_addr_type_dev_table(net, skb_dst(skb_in)->dev,
+	if (inet_addr_type_dev_table(net, route_lookup_dev,
 				     fl4_dec.saddr) == RTN_LOCAL) {
 		rt2 = __ip_route_output_key(net, &fl4_dec);
 		if (IS_ERR(rt2))

commit f4b606f708379d10ea822bde217bdf338a94d096
Author: Tom Rix <trix@redhat.com>
Date:   Mon Jan 11 14:09:04 2021 -0800

    USB: serial: mos7720: improve OOM-handling in read_mos_reg()
    
    commit 161a582bd1d8681095f158d11bc679a58f1d026b upstream.
    
    clang static analysis reports this problem
    
    mos7720.c:352:2: warning: Undefined or garbage value returned to caller
            return d;
            ^~~~~~~~
    
    In the parport_mos7715_read_data()'s call to read_mos_reg(), 'd' is
    only set after the alloc block.
    
            buf = kmalloc(1, GFP_KERNEL);
            if (!buf)
                    return -ENOMEM;
    
    Although the problem is reported in parport_most7715_read_data(),
    none of the callee's of read_mos_reg() check the return status.
    
    Make sure to clear the return-value buffer also on allocation failures.
    
    Fixes: 0d130367abf5 ("USB: serial: mos7720: fix control-message error handling")
    Signed-off-by: Tom Rix <trix@redhat.com>
    Link: https://lore.kernel.org/r/20210111220904.1035957-1-trix@redhat.com
    [ johan: only clear the buffer on errors, amend commit message ]
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c
index 1e3ee2bfbcd0..d0c8d3800254 100644
--- a/drivers/usb/serial/mos7720.c
+++ b/drivers/usb/serial/mos7720.c
@@ -226,8 +226,10 @@ static int read_mos_reg(struct usb_serial *serial, unsigned int serial_portnum,
 	int status;
 
 	buf = kmalloc(1, GFP_KERNEL);
-	if (!buf)
+	if (!buf) {
+		*data = 0;
 		return -ENOMEM;
+	}
 
 	status = usb_control_msg(usbdev, pipe, request, requesttype, value,
 				     index, buf, 1, MOS_WDR_TIMEOUT);

commit 4768973dffed4d0126854514335ed4fe87bec1ab
Author: Liu Jian <liujian56@huawei.com>
Date:   Fri Jul 16 12:06:17 2021 +0800

    igmp: Add ip_mc_list lock in ip_check_mc_rcu
    
    commit 23d2b94043ca8835bd1e67749020e839f396a1c2 upstream.
    
    I got below panic when doing fuzz test:
    
    Kernel panic - not syncing: panic_on_warn set ...
    CPU: 0 PID: 4056 Comm: syz-executor.3 Tainted: G    B             5.14.0-rc1-00195-gcff5c4254439-dirty #2
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.0-59-gc9ba5276e321-prebuilt.qemu.org 04/01/2014
    Call Trace:
    dump_stack_lvl+0x7a/0x9b
    panic+0x2cd/0x5af
    end_report.cold+0x5a/0x5a
    kasan_report+0xec/0x110
    ip_check_mc_rcu+0x556/0x5d0
    __mkroute_output+0x895/0x1740
    ip_route_output_key_hash_rcu+0x2d0/0x1050
    ip_route_output_key_hash+0x182/0x2e0
    ip_route_output_flow+0x28/0x130
    udp_sendmsg+0x165d/0x2280
    udpv6_sendmsg+0x121e/0x24f0
    inet6_sendmsg+0xf7/0x140
    sock_sendmsg+0xe9/0x180
    ____sys_sendmsg+0x2b8/0x7a0
    ___sys_sendmsg+0xf0/0x160
    __sys_sendmmsg+0x17e/0x3c0
    __x64_sys_sendmmsg+0x9e/0x100
    do_syscall_64+0x3b/0x90
    entry_SYSCALL_64_after_hwframe+0x44/0xae
    RIP: 0033:0x462eb9
    Code: f7 d8 64 89 02 b8 ff ff ff ff c3 66 0f 1f 44 00 00 48 89 f8
     48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48>
     3d 01 f0 ff ff 73 01 c3 48 c7 c1 bc ff ff ff f7 d8 64 89 01 48
    RSP: 002b:00007f3df5af1c58 EFLAGS: 00000246 ORIG_RAX: 0000000000000133
    RAX: ffffffffffffffda RBX: 000000000073bf00 RCX: 0000000000462eb9
    RDX: 0000000000000312 RSI: 0000000020001700 RDI: 0000000000000007
    RBP: 0000000000000004 R08: 0000000000000000 R09: 0000000000000000
    R10: 0000000000000000 R11: 0000000000000246 R12: 00007f3df5af26bc
    R13: 00000000004c372d R14: 0000000000700b10 R15: 00000000ffffffff
    
    It is one use-after-free in ip_check_mc_rcu.
    In ip_mc_del_src, the ip_sf_list of pmc has been freed under pmc->lock protection.
    But access to ip_sf_list in ip_check_mc_rcu is not protected by the lock.
    
    Signed-off-by: Liu Jian <liujian56@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Lee Jones <lee.jones@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c
index dca7fe0ae24a..15804cfc19a8 100644
--- a/net/ipv4/igmp.c
+++ b/net/ipv4/igmp.c
@@ -2743,6 +2743,7 @@ int ip_check_mc_rcu(struct in_device *in_dev, __be32 mc_addr, __be32 src_addr, u
 		rv = 1;
 	} else if (im) {
 		if (src_addr) {
+			spin_lock_bh(&im->lock);
 			for (psf = im->sources; psf; psf = psf->sf_next) {
 				if (psf->sf_inaddr == src_addr)
 					break;
@@ -2753,6 +2754,7 @@ int ip_check_mc_rcu(struct in_device *in_dev, __be32 mc_addr, __be32 src_addr, u
 					im->sfcount[MCAST_EXCLUDE];
 			else
 				rv = im->sfcount[MCAST_EXCLUDE] != 0;
+			spin_unlock_bh(&im->lock);
 		} else
 			rv = 1; /* unspecified source; tentatively allow */
 	}

commit 8ba71ffe2a3fb29a1f55f0cad7f2988318dc10f9
Author: Colin Ian King <colin.king@canonical.com>
Date:   Thu Jul 15 14:23:21 2021 +0100

    ARM: imx: fix missing 3rd argument in macro imx_mmdc_perf_init
    
    commit 20fb73911fec01f06592de1cdbca00b66602ebd7 upstream.
    
    The function imx_mmdc_perf_init recently had a 3rd argument added to
    it but the equivalent macro was not updated and is still the older
    2 argument version. Fix this by adding in the missing 3rd argumement
    mmdc_ipg_clk.
    
    Fixes: f07ec8536580 ("ARM: imx: add missing clk_disable_unprepare()")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Signed-off-by: Shawn Guo <shawnguo@kernel.org>
    Signed-off-by: Nobuhiro Iwamatsu (CIP) <nobuhiro1.iwamatsu@toshiba.co.jp>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/mach-imx/mmdc.c b/arch/arm/mach-imx/mmdc.c
index ba830be0b531..14be73ca107a 100644
--- a/arch/arm/mach-imx/mmdc.c
+++ b/arch/arm/mach-imx/mmdc.c
@@ -545,7 +545,7 @@ static int imx_mmdc_perf_init(struct platform_device *pdev, void __iomem *mmdc_b
 
 #else
 #define imx_mmdc_remove NULL
-#define imx_mmdc_perf_init(pdev, mmdc_base) 0
+#define imx_mmdc_perf_init(pdev, mmdc_base, mmdc_ipg_clk) 0
 #endif
 
 static int imx_mmdc_probe(struct platform_device *pdev)

commit 3ad9438f6d25d67668216174188a2683f17e19ae
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Tue Jun 15 20:52:39 2021 +0800

    ARM: imx: add missing clk_disable_unprepare()
    
    commit f07ec85365807b3939f32d0094a6dd5ce065d1b9 upstream.
    
    clock source is prepared and enabled by clk_prepare_enable()
    in probe function, but no disable or unprepare in remove and
    error path.
    
    Fixes: 9454a0caff6a ("ARM: imx: add mmdc ipg clock operation for mmdc")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Reviewed-by: Dong Aisheng <aisheng.dong@nxp.com>
    Signed-off-by: Shawn Guo <shawnguo@kernel.org>
    Signed-off-by: Nobuhiro Iwamatsu (CIP) <nobuhiro1.iwamatsu@toshiba.co.jp>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/mach-imx/mmdc.c b/arch/arm/mach-imx/mmdc.c
index ae0a61c61a6e..ba830be0b531 100644
--- a/arch/arm/mach-imx/mmdc.c
+++ b/arch/arm/mach-imx/mmdc.c
@@ -109,6 +109,7 @@ struct mmdc_pmu {
 	struct perf_event *mmdc_events[MMDC_NUM_COUNTERS];
 	struct hlist_node node;
 	struct fsl_mmdc_devtype_data *devtype_data;
+	struct clk *mmdc_ipg_clk;
 };
 
 /*
@@ -474,11 +475,13 @@ static int imx_mmdc_remove(struct platform_device *pdev)
 	cpuhp_state_remove_instance_nocalls(cpuhp_mmdc_state, &pmu_mmdc->node);
 	perf_pmu_unregister(&pmu_mmdc->pmu);
 	iounmap(pmu_mmdc->mmdc_base);
+	clk_disable_unprepare(pmu_mmdc->mmdc_ipg_clk);
 	kfree(pmu_mmdc);
 	return 0;
 }
 
-static int imx_mmdc_perf_init(struct platform_device *pdev, void __iomem *mmdc_base)
+static int imx_mmdc_perf_init(struct platform_device *pdev, void __iomem *mmdc_base,
+			      struct clk *mmdc_ipg_clk)
 {
 	struct mmdc_pmu *pmu_mmdc;
 	char *name;
@@ -506,6 +509,7 @@ static int imx_mmdc_perf_init(struct platform_device *pdev, void __iomem *mmdc_b
 	}
 
 	mmdc_num = mmdc_pmu_init(pmu_mmdc, mmdc_base, &pdev->dev);
+	pmu_mmdc->mmdc_ipg_clk = mmdc_ipg_clk;
 	if (mmdc_num == 0)
 		name = "mmdc";
 	else
@@ -579,9 +583,11 @@ static int imx_mmdc_probe(struct platform_device *pdev)
 	val &= ~(1 << BP_MMDC_MAPSR_PSD);
 	writel_relaxed(val, reg);
 
-	err = imx_mmdc_perf_init(pdev, mmdc_base);
-	if (err)
+	err = imx_mmdc_perf_init(pdev, mmdc_base, mmdc_ipg_clk);
+	if (err) {
 		iounmap(mmdc_base);
+		clk_disable_unprepare(mmdc_ipg_clk);
+	}
 
 	return err;
 }

commit 4a3217bba039330f5c489245923f989b43bd94d1
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Wed Jul 7 19:54:30 2021 +0200

    media: stkwebcam: fix memory leak in stk_camera_probe
    
    commit 514e97674400462cc09c459a1ddfb9bf39017223 upstream.
    
    My local syzbot instance hit memory leak in usb_set_configuration().
    The problem was in unputted usb interface. In case of errors after
    usb_get_intf() the reference should be putted to correclty free memory
    allocated for this interface.
    
    Fixes: ec16dae5453e ("V4L/DVB (7019): V4L: add support for Syntek DC1125 webcams")
    Cc: stable@vger.kernel.org
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/media/usb/stkwebcam/stk-webcam.c b/drivers/media/usb/stkwebcam/stk-webcam.c
index e33fa78ef98d..f46db1b6a27c 100644
--- a/drivers/media/usb/stkwebcam/stk-webcam.c
+++ b/drivers/media/usb/stkwebcam/stk-webcam.c
@@ -1355,7 +1355,7 @@ static int stk_camera_probe(struct usb_interface *interface,
 	if (!dev->isoc_ep) {
 		pr_err("Could not find isoc-in endpoint\n");
 		err = -ENODEV;
-		goto error;
+		goto error_put;
 	}
 	dev->vsettings.palette = V4L2_PIX_FMT_RGB565;
 	dev->vsettings.mode = MODE_VGA;
@@ -1368,10 +1368,12 @@ static int stk_camera_probe(struct usb_interface *interface,
 
 	err = stk_register_video_device(dev);
 	if (err)
-		goto error;
+		goto error_put;
 
 	return 0;
 
+error_put:
+	usb_put_intf(interface);
 error:
 	v4l2_ctrl_handler_free(hdl);
 	v4l2_device_unregister(&dev->v4l2_dev);

commit c56350d5bd66da152f6884ab01fcdc199bacfbdb
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon Sep 6 10:31:20 2021 +0200

    clk: fix build warning for orphan_list
    
    In the backport of commit bdcf1dc25324 ("clk: Evict unregistered clks
    from parent caches") to the 4.19.y and 4.14.y stable trees, the
    orphan_list structure was placed in the wrong location, causing loads of
    build warnings on systems that do not define CONFIG_DEBUG_FS.
    
    Fix this up by moving the structure to the correct place in the file.
    
    Reported-by: "kernelci.org bot" <bot@kernelci.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index 3806fd8fef0b..a9490c8e82a7 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -46,11 +46,6 @@ static struct hlist_head *all_lists[] = {
 	NULL,
 };
 
-static struct hlist_head *orphan_list[] = {
-	&clk_orphan_list,
-	NULL,
-};
-
 /***    private data structures    ***/
 
 struct clk_core {
@@ -2629,6 +2624,11 @@ static int inited = 0;
 static DEFINE_MUTEX(clk_debug_lock);
 static HLIST_HEAD(clk_debug_list);
 
+static struct hlist_head *orphan_list[] = {
+	&clk_orphan_list,
+	NULL,
+};
+
 static void clk_summary_show_one(struct seq_file *s, struct clk_core *c,
 				 int level)
 {

commit 5056ed2789bdefcb48983122bfbe9e66312bc931
Author: Zubin Mithra <zsm@chromium.org>
Date:   Fri Aug 27 08:37:35 2021 -0700

    ALSA: pcm: fix divide error in snd_pcm_lib_ioctl
    
    commit f3eef46f0518a2b32ca1244015820c35a22cfe4a upstream.
    
    Syzkaller reported a divide error in snd_pcm_lib_ioctl. fifo_size
    is of type snd_pcm_uframes_t(unsigned long). If frame_size
    is 0x100000000, the error occurs.
    
    Fixes: a9960e6a293e ("ALSA: pcm: fix fifo_size frame calculation")
    Signed-off-by: Zubin Mithra <zsm@chromium.org>
    Reviewed-by: Guenter Roeck <groeck@chromium.org>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210827153735.789452-1-zsm@chromium.org
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
index 56295936387c..da454eeee5c9 100644
--- a/sound/core/pcm_lib.c
+++ b/sound/core/pcm_lib.c
@@ -1751,7 +1751,7 @@ static int snd_pcm_lib_ioctl_fifo_size(struct snd_pcm_substream *substream,
 		channels = params_channels(params);
 		frame_size = snd_pcm_format_size(format, channels);
 		if (frame_size > 0)
-			params->fifo_size /= (unsigned)frame_size;
+			params->fifo_size /= frame_size;
 	}
 	return 0;
 }

commit 9c62e4ae337ad450659fff72a627e3c2738c7bbe
Author: Ben Dooks <ben-linux@fluff.org>
Date:   Mon Nov 4 18:15:15 2019 +0100

    ARM: 8918/2: only build return_address() if needed
    
    commit fb033c95c94ca1ee3d16e04ebdb85d65fb55fff8 upstream.
    
    The system currently warns if the config conditions for
    building return_address in arch/arm/kernel/return_address.c
    are not met, leaving just an EXPORT_SYMBOL_GPL(return_address)
    of a function defined to be 'static linline'.
    This is a result of aeea3592a13b ("ARM: 8158/1: LLVMLinux: use static inline in ARM ftrace.h").
    
    Since we're not going to build anything other than an exported
    symbol for something that is already being defined to be an
    inline-able return of NULL, just avoid building the code to
    remove the following warning:
    
    Fixes: aeea3592a13b ("ARM: 8158/1: LLVMLinux: use static inline in ARM ftrace.h")
    Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk>
    Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile
index 8cad59465af3..8b679e2ca3c3 100644
--- a/arch/arm/kernel/Makefile
+++ b/arch/arm/kernel/Makefile
@@ -17,10 +17,14 @@ CFLAGS_REMOVE_return_address.o = -pg
 # Object file lists.
 
 obj-y		:= elf.o entry-common.o irq.o opcodes.o \
-		   process.o ptrace.o reboot.o return_address.o \
+		   process.o ptrace.o reboot.o \
 		   setup.o signal.o sigreturn_codes.o \
 		   stacktrace.o sys_arm.o time.o traps.o
 
+ifneq ($(CONFIG_ARM_UNWIND),y)
+obj-$(CONFIG_FRAME_POINTER)	+= return_address.o
+endif
+
 obj-$(CONFIG_ATAGS)		+= atags_parse.o
 obj-$(CONFIG_ATAGS_PROC)	+= atags_proc.o
 obj-$(CONFIG_DEPRECATED_PARAM_STRUCT) += atags_compat.o
diff --git a/arch/arm/kernel/return_address.c b/arch/arm/kernel/return_address.c
index 36ed35073289..f945742dea44 100644
--- a/arch/arm/kernel/return_address.c
+++ b/arch/arm/kernel/return_address.c
@@ -10,8 +10,6 @@
  */
 #include <linux/export.h>
 #include <linux/ftrace.h>
-
-#if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND)
 #include <linux/sched.h>
 
 #include <asm/stacktrace.h>
@@ -56,6 +54,4 @@ void *return_address(unsigned int level)
 		return NULL;
 }
 
-#endif /* if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND) */
-
 EXPORT_SYMBOL_GPL(return_address);

commit 41eb3512d2eba335facba3290eb88402ad8fd13b
Author: Christoph Hellwig <hch@lst.de>
Date:   Fri Aug 27 18:32:50 2021 +0200

    cryptoloop: add a deprecation warning
    
    [ Upstream commit 222013f9ac30b9cec44301daa8dbd0aae38abffb ]
    
    Support for cryptoloop has been officially marked broken and deprecated
    in favor of dm-crypt (which supports the same broken algorithms if
    needed) in Linux 2.6.4 (released in March 2004), and support for it has
    been entirely removed from losetup in util-linux 2.23 (released in April
    2013).  Add a warning and a deprecation schedule.
    
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Link: https://lore.kernel.org/r/20210827163250.255325-1-hch@lst.de
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig
index e101f286ac35..60662771bd46 100644
--- a/drivers/block/Kconfig
+++ b/drivers/block/Kconfig
@@ -242,7 +242,7 @@ config BLK_DEV_LOOP_MIN_COUNT
 	  dynamically allocated with the /dev/loop-control interface.
 
 config BLK_DEV_CRYPTOLOOP
-	tristate "Cryptoloop Support"
+	tristate "Cryptoloop Support (DEPRECATED)"
 	select CRYPTO
 	select CRYPTO_CBC
 	depends on BLK_DEV_LOOP
@@ -254,7 +254,7 @@ config BLK_DEV_CRYPTOLOOP
 	  WARNING: This device is not safe for journaled file systems like
 	  ext3 or Reiserfs. Please use the Device Mapper crypto module
 	  instead, which can be configured to be on-disk compatible with the
-	  cryptoloop device.
+	  cryptoloop device.  cryptoloop support will be removed in Linux 5.16.
 
 source "drivers/block/drbd/Kconfig"
 
diff --git a/drivers/block/cryptoloop.c b/drivers/block/cryptoloop.c
index 7033a4beda66..1b84105dfe62 100644
--- a/drivers/block/cryptoloop.c
+++ b/drivers/block/cryptoloop.c
@@ -201,6 +201,8 @@ init_cryptoloop(void)
 
 	if (rc)
 		printk(KERN_ERR "cryptoloop: loop_register_transfer failed\n");
+	else
+		pr_warn("the cryptoloop driver has been deprecated and will be removed in in Linux 5.16\n");
 	return rc;
 }
 

commit cff9af5340e39dcca479538459bb5795716fde33
Author: Kim Phillips <kim.phillips@amd.com>
Date:   Tue Aug 17 17:10:42 2021 -0500

    perf/x86/amd/ibs: Work around erratum #1197
    
    [ Upstream commit 26db2e0c51fe83e1dd852c1321407835b481806e ]
    
    Erratum #1197 "IBS (Instruction Based Sampling) Register State May be
    Incorrect After Restore From CC6" is published in a document:
    
      "Revision Guide for AMD Family 19h Models 00h-0Fh Processors" 56683 Rev. 1.04 July 2021
    
      https://bugzilla.kernel.org/show_bug.cgi?id=206537
    
    Implement the erratum's suggested workaround and ignore IBS samples if
    MSRC001_1031 == 0.
    
    Signed-off-by: Kim Phillips <kim.phillips@amd.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Link: https://lore.kernel.org/r/20210817221048.88063-3-kim.phillips@amd.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/x86/events/amd/ibs.c b/arch/x86/events/amd/ibs.c
index 2410bd4bb48f..2d9e1372b070 100644
--- a/arch/x86/events/amd/ibs.c
+++ b/arch/x86/events/amd/ibs.c
@@ -90,6 +90,7 @@ struct perf_ibs {
 	unsigned long			offset_mask[1];
 	int				offset_max;
 	unsigned int			fetch_count_reset_broken : 1;
+	unsigned int			fetch_ignore_if_zero_rip : 1;
 	struct cpu_perf_ibs __percpu	*pcpu;
 
 	struct attribute		**format_attrs;
@@ -674,6 +675,10 @@ static int perf_ibs_handle_irq(struct perf_ibs *perf_ibs, struct pt_regs *iregs)
 	if (check_rip && (ibs_data.regs[2] & IBS_RIP_INVALID)) {
 		regs.flags &= ~PERF_EFLAGS_EXACT;
 	} else {
+		/* Workaround for erratum #1197 */
+		if (perf_ibs->fetch_ignore_if_zero_rip && !(ibs_data.regs[1]))
+			goto out;
+
 		set_linear_ip(&regs, ibs_data.regs[1]);
 		regs.flags |= PERF_EFLAGS_EXACT;
 	}
@@ -767,6 +772,9 @@ static __init void perf_event_ibs_init(void)
 	if (boot_cpu_data.x86 >= 0x16 && boot_cpu_data.x86 <= 0x18)
 		perf_ibs_fetch.fetch_count_reset_broken = 1;
 
+	if (boot_cpu_data.x86 == 0x19 && boot_cpu_data.x86_model < 0x10)
+		perf_ibs_fetch.fetch_ignore_if_zero_rip = 1;
+
 	perf_ibs_pmu_init(&perf_ibs_fetch, "ibs_fetch");
 
 	if (ibs_caps & IBS_CAPS_OPCNT) {

commit f109e8a1678ce920b7f0df7865f2a31754ec5d1c
Author: Xiaoyao Li <xiaoyao.li@intel.com>
Date:   Tue Aug 24 12:06:22 2021 +0800

    perf/x86/intel/pt: Fix mask of num_address_ranges
    
    [ Upstream commit c53c6b7409f4cd9e542991b53d597fbe2751d7db ]
    
    Per SDM, bit 2:0 of CPUID(0x14,1).EAX[2:0] reports the number of
    configurable address ranges for filtering, not bit 1:0.
    
    Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Acked-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Link: https://lkml.kernel.org/r/20210824040622.4081502-1-xiaoyao.li@intel.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/x86/events/intel/pt.c b/arch/x86/events/intel/pt.c
index f03100bc5fd1..849f0ba53a9b 100644
--- a/arch/x86/events/intel/pt.c
+++ b/arch/x86/events/intel/pt.c
@@ -69,7 +69,7 @@ static struct pt_cap_desc {
 	PT_CAP(topa_multiple_entries,	0, CPUID_ECX, BIT(1)),
 	PT_CAP(single_range_output,	0, CPUID_ECX, BIT(2)),
 	PT_CAP(payloads_lip,		0, CPUID_ECX, BIT(31)),
-	PT_CAP(num_address_ranges,	1, CPUID_EAX, 0x3),
+	PT_CAP(num_address_ranges,	1, CPUID_EAX, 0x7),
 	PT_CAP(mtc_periods,		1, CPUID_EAX, 0xffff0000),
 	PT_CAP(cycle_thresholds,	1, CPUID_EBX, 0xffff),
 	PT_CAP(psb_periods,		1, CPUID_EBX, 0xffff0000),

commit cda01d1da3b0ba663ac77acd9dc254762746ebfd
Author: Shai Malin <smalin@marvell.com>
Date:   Tue Aug 24 19:52:49 2021 +0300

    qede: Fix memset corruption
    
    [ Upstream commit e543468869e2532f5d7926e8f417782b48eca3dc ]
    
    Thanks to Kees Cook who detected the problem of memset that starting
    from not the first member, but sized for the whole struct.
    The better change will be to remove the redundant memset and to clear
    only the msix_cnt member.
    
    Signed-off-by: Prabhakar Kushwaha <pkushwaha@marvell.com>
    Signed-off-by: Ariel Elior <aelior@marvell.com>
    Signed-off-by: Shai Malin <smalin@marvell.com>
    Reported-by: Kees Cook <keescook@chromium.org>
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c
index 1aabb2e7a38b..756c5943f5e0 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_main.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_main.c
@@ -1676,6 +1676,7 @@ static void qede_sync_free_irqs(struct qede_dev *edev)
 	}
 
 	edev->int_info.used_cnt = 0;
+	edev->int_info.msix_cnt = 0;
 }
 
 static int qede_req_msix_irqs(struct qede_dev *edev)
@@ -2193,7 +2194,6 @@ static int qede_load(struct qede_dev *edev, enum qede_load_mode mode,
 	goto out;
 err4:
 	qede_sync_free_irqs(edev);
-	memset(&edev->int_info.msix_cnt, 0, sizeof(struct qed_int_info));
 err3:
 	qede_napi_disable_remove(edev);
 err2:

commit 47116bdde9f23af744f77ed4058475359289f3f0
Author: Harini Katakam <harini.katakam@xilinx.com>
Date:   Tue Aug 24 15:32:09 2021 +0530

    net: macb: Add a NULL check on desc_ptp
    
    [ Upstream commit 85520079afce885b80647fbd0d13d8f03d057167 ]
    
    macb_ptp_desc will not return NULL under most circumstances with correct
    Kconfig and IP design config register. But for the sake of the extreme
    corner case, check for NULL when using the helper. In case of rx_tstamp,
    no action is necessary except to return (similar to timestamp disabled)
    and warn. In case of TX, return -EINVAL to let the skb be free. Perform
    this check before marking skb in progress.
    Fixes coverity warning:
    (4) Event dereference:
    Dereferencing a null pointer "desc_ptp"
    
    Signed-off-by: Harini Katakam <harini.katakam@xilinx.com>
    Reviewed-by: Radhey Shyam Pandey <radhey.shyam.pandey@xilinx.com>
    Signed-off-by: Michal Simek <michal.simek@xilinx.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/cadence/macb_ptp.c b/drivers/net/ethernet/cadence/macb_ptp.c
index 8f912de44def..ecb0fb1ddde7 100644
--- a/drivers/net/ethernet/cadence/macb_ptp.c
+++ b/drivers/net/ethernet/cadence/macb_ptp.c
@@ -286,6 +286,12 @@ void gem_ptp_rxstamp(struct macb *bp, struct sk_buff *skb,
 
 	if (GEM_BFEXT(DMA_RXVALID, desc->addr)) {
 		desc_ptp = macb_ptp_desc(bp, desc);
+		/* Unlikely but check */
+		if (!desc_ptp) {
+			dev_warn_ratelimited(&bp->pdev->dev,
+					     "Timestamp not supported in BD\n");
+			return;
+		}
 		gem_hw_timestamp(bp, desc_ptp->ts_1, desc_ptp->ts_2, &ts);
 		memset(shhwtstamps, 0, sizeof(struct skb_shared_hwtstamps));
 		shhwtstamps->hwtstamp = ktime_set(ts.tv_sec, ts.tv_nsec);
@@ -318,8 +324,11 @@ int gem_ptp_txstamp(struct macb_queue *queue, struct sk_buff *skb,
 	if (CIRC_SPACE(head, tail, PTP_TS_BUFFER_SIZE) == 0)
 		return -ENOMEM;
 
-	skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
 	desc_ptp = macb_ptp_desc(queue->bp, desc);
+	/* Unlikely but check */
+	if (!desc_ptp)
+		return -EINVAL;
+	skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
 	tx_timestamp = &queue->tx_timestamps[head];
 	tx_timestamp->skb = skb;
 	/* ensure ts_1/ts_2 is loaded after ctrl (TX_USED check) */

commit c1290961f2824a44618d4cb3f0ee5bdb8224bbe3
Author: Shai Malin <smalin@marvell.com>
Date:   Sun Aug 22 22:21:14 2021 +0300

    qed: Fix the VF msix vectors flow
    
    [ Upstream commit b0cd08537db8d2fbb227cdb2e5835209db295a24 ]
    
    For VFs we should return with an error in case we didn't get the exact
    number of msix vectors as we requested.
    Not doing that will lead to a crash when starting queues for this VF.
    
    Signed-off-by: Prabhakar Kushwaha <pkushwaha@marvell.com>
    Signed-off-by: Ariel Elior <aelior@marvell.com>
    Signed-off-by: Shai Malin <smalin@marvell.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c b/drivers/net/ethernet/qlogic/qed/qed_main.c
index 049a83b40e46..9d77f318d11e 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_main.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_main.c
@@ -439,7 +439,12 @@ static int qed_enable_msix(struct qed_dev *cdev,
 			rc = cnt;
 	}
 
-	if (rc > 0) {
+	/* For VFs, we should return with an error in case we didn't get the
+	 * exact number of msix vectors as we requested.
+	 * Not doing that will lead to a crash when starting queues for
+	 * this VF.
+	 */
+	if ((IS_PF(cdev) && rc > 0) || (IS_VF(cdev) && rc == cnt)) {
 		/* MSI-x configuration was achieved */
 		int_params->out.int_mode = QED_INT_MODE_MSIX;
 		int_params->out.num_vectors = rc;

commit 42150e1b46a474541f677c759ac61599277c8a9c
Author: Krzysztof Ha?asa <khalasa@piap.pl>
Date:   Mon Jun 7 12:49:07 2021 +0200

    gpu: ipu-v3: Fix i.MX IPU-v3 offset calculations for (semi)planar U/V formats
    
    [ Upstream commit 7cca7c8096e2c8a4149405438329b5035d0744f0 ]
    
    Video captured in 1400x1050 resolution (bytesperline aka stride = 1408
    bytes) is invalid. Fix it.
    
    Signed-off-by: Krzysztof Halasa <khalasa@piap.pl>
    Link: https://lore.kernel.org/r/m3y2bmq7a4.fsf@t19.piap.pl
    [p.zabel@pengutronix.de: added "gpu: ipu-v3:" prefix to commit description]
    Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/ipu-v3/ipu-cpmem.c b/drivers/gpu/ipu-v3/ipu-cpmem.c
index a9d2501500a1..170371770dd4 100644
--- a/drivers/gpu/ipu-v3/ipu-cpmem.c
+++ b/drivers/gpu/ipu-v3/ipu-cpmem.c
@@ -545,21 +545,21 @@ static const struct ipu_rgb def_bgra_16 = {
 	.bits_per_pixel = 16,
 };
 
-#define Y_OFFSET(pix, x, y)	((x) + pix->width * (y))
-#define U_OFFSET(pix, x, y)	((pix->width * pix->height) +		\
-				 (pix->width * ((y) / 2) / 2) + (x) / 2)
-#define V_OFFSET(pix, x, y)	((pix->width * pix->height) +		\
-				 (pix->width * pix->height / 4) +	\
-				 (pix->width * ((y) / 2) / 2) + (x) / 2)
-#define U2_OFFSET(pix, x, y)	((pix->width * pix->height) +		\
-				 (pix->width * (y) / 2) + (x) / 2)
-#define V2_OFFSET(pix, x, y)	((pix->width * pix->height) +		\
-				 (pix->width * pix->height / 2) +	\
-				 (pix->width * (y) / 2) + (x) / 2)
-#define UV_OFFSET(pix, x, y)	((pix->width * pix->height) +	\
-				 (pix->width * ((y) / 2)) + (x))
-#define UV2_OFFSET(pix, x, y)	((pix->width * pix->height) +	\
-				 (pix->width * y) + (x))
+#define Y_OFFSET(pix, x, y)	((x) + pix->bytesperline * (y))
+#define U_OFFSET(pix, x, y)	((pix->bytesperline * pix->height) +	 \
+				 (pix->bytesperline * ((y) / 2) / 2) + (x) / 2)
+#define V_OFFSET(pix, x, y)	((pix->bytesperline * pix->height) +	 \
+				 (pix->bytesperline * pix->height / 4) + \
+				 (pix->bytesperline * ((y) / 2) / 2) + (x) / 2)
+#define U2_OFFSET(pix, x, y)	((pix->bytesperline * pix->height) +	 \
+				 (pix->bytesperline * (y) / 2) + (x) / 2)
+#define V2_OFFSET(pix, x, y)	((pix->bytesperline * pix->height) +	 \
+				 (pix->bytesperline * pix->height / 2) + \
+				 (pix->bytesperline * (y) / 2) + (x) / 2)
+#define UV_OFFSET(pix, x, y)	((pix->bytesperline * pix->height) +	 \
+				 (pix->bytesperline * ((y) / 2)) + (x))
+#define UV2_OFFSET(pix, x, y)	((pix->bytesperline * pix->height) +	 \
+				 (pix->bytesperline * y) + (x))
 
 #define NUM_ALPHA_CHANNELS	7
 

commit 79a08818e97e52befb0a6d8e8a4461101c46facc
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Wed May 26 00:03:37 2021 -0700

    xtensa: fix kconfig unmet dependency warning for HAVE_FUTEX_CMPXCHG
    
    commit ed5aacc81cd41efc4d561e14af408d1003f7b855 upstream.
    
    XTENSA should only select HAVE_FUTEX_CMPXCHG when FUTEX is
    set/enabled. This prevents a kconfig warning.
    
    WARNING: unmet direct dependencies detected for HAVE_FUTEX_CMPXCHG
      Depends on [n]: FUTEX [=n]
      Selected by [y]:
      - XTENSA [=y] && !MMU [=n]
    
    Fixes: d951ba21b959 ("xtensa: nommu: select HAVE_FUTEX_CMPXCHG")
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Cc: Max Filippov <jcmvbkbc@gmail.com>
    Cc: Chris Zankel <chris@zankel.net>
    Cc: linux-xtensa@linux-xtensa.org
    Message-Id: <20210526070337.28130-1-rdunlap@infradead.org>
    Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig
index b9ad83a0ee5d..d9b0709d6c9c 100644
--- a/arch/xtensa/Kconfig
+++ b/arch/xtensa/Kconfig
@@ -25,7 +25,7 @@ config XTENSA
 	select HAVE_DMA_CONTIGUOUS
 	select HAVE_EXIT_THREAD
 	select HAVE_FUNCTION_TRACER
-	select HAVE_FUTEX_CMPXCHG if !MMU
+	select HAVE_FUTEX_CMPXCHG if !MMU && FUTEX
 	select HAVE_HW_BREAKPOINT if PERF_EVENTS
 	select HAVE_IRQ_TIME_ACCOUNTING
 	select HAVE_MEMBLOCK

commit c481607ba522e31e6ed01efefc19cc1d0e0a46fa
Author: Theodore Ts'o <tytso@mit.edu>
Date:   Fri Aug 20 23:44:17 2021 -0400

    ext4: fix race writing to an inline_data file while its xattrs are changing
    
    commit a54c4613dac1500b40e4ab55199f7c51f028e848 upstream.
    
    The location of the system.data extended attribute can change whenever
    xattr_sem is not taken.  So we need to recalculate the i_inline_off
    field since it mgiht have changed between ext4_write_begin() and
    ext4_write_end().
    
    This means that caching i_inline_off is probably not helpful, so in
    the long run we should probably get rid of it and shrink the in-memory
    ext4 inode slightly, but let's fix the race the simple way for now.
    
    Cc: stable@kernel.org
    Fixes: f19d5870cbf72 ("ext4: add normal write support for inline data")
    Reported-by: syzbot+13146364637c7363a7de@syzkaller.appspotmail.com
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c
index c95246187659..c64e4a1be2f2 100644
--- a/fs/ext4/inline.c
+++ b/fs/ext4/inline.c
@@ -750,6 +750,12 @@ int ext4_write_inline_data_end(struct inode *inode, loff_t pos, unsigned len,
 	ext4_write_lock_xattr(inode, &no_expand);
 	BUG_ON(!ext4_has_inline_data(inode));
 
+	/*
+	 * ei->i_inline_off may have changed since ext4_write_begin()
+	 * called ext4_try_to_write_inline_data()
+	 */
+	(void) ext4_find_inline_data_nolock(inode);
+
 	kaddr = kmap_atomic(page);
 	ext4_write_inline_data(inode, &iloc, kaddr, pos, len);
 	kunmap_atomic(kaddr);

commit c8eebe7f77d76ed37e9abf0679d6919ec87b232c
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Fri Sep 17 09:42:05 2021 +0800

    media: rockchip: isp: enable soft reset for other isp version
    
    Change-Id: I620718f555f091d2ca53214c3fd3cd1a44107692
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/hw.c b/drivers/media/platform/rockchip/isp/hw.c
index 626d20204b62..1f587f95da03 100644
--- a/drivers/media/platform/rockchip/isp/hw.c
+++ b/drivers/media/platform/rockchip/isp/hw.c
@@ -543,12 +543,11 @@ void rkisp_soft_reset(struct rkisp_hw_dev *dev, bool is_secure)
 		udelay(10);
 	}
 
-	if (dev->isp_ver == ISP_V20) {
-		/* reset for Dehaze */
+	/* reset for Dehaze */
+	if (dev->isp_ver == ISP_V20)
 		writel(CIF_ISP_CTRL_ISP_MODE_BAYER_ITU601, base + CIF_ISP_CTRL);
-		writel(0xffff, base + CIF_IRCL);
-		udelay(10);
-	}
+	writel(0xffff, base + CIF_IRCL);
+	udelay(10);
 
 	if (domain)
 		iommu_attach_device(domain, dev->dev);

commit 328ab6e6990ab998ea1dce4efff4f55d7f70b536
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Fri Sep 17 09:39:38 2021 +0800

    media: rockchip: isp: fix input crop config for isp21 multi device
    
    Change-Id: I6185273f8474e151ee26c938b8825af383fb73e3
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c
index 2195180d72a2..4d60400a325d 100644
--- a/drivers/media/platform/rockchip/isp/rkisp.c
+++ b/drivers/media/platform/rockchip/isp/rkisp.c
@@ -562,9 +562,10 @@ void rkisp_trigger_read_back(struct rkisp_device *dev, u8 dma2frm, u32 mode, boo
 			rkisp_set_bits(dev, MI_WR_CTRL2, 0, val, true);
 			rkisp_write(dev, MI_WR_INIT, ISP21_SP_FORCE_UPD | ISP21_MP_FORCE_UPD, true);
 			/* sensor mode & index */
-			rkisp_set_bits(dev, ISP_ACQ_H_OFFS, ISP21_SENSOR_MODE(3) | ISP21_SENSOR_INDEX(3),
-					ISP21_SENSOR_MODE(hw->dev_num >= 3 ? 2 : hw->dev_num - 1) |
-					ISP21_SENSOR_INDEX(dev->dev_id), true);
+			val = rkisp_read_reg_cache(dev, ISP_ACQ_H_OFFS);
+			val |= ISP21_SENSOR_MODE(hw->dev_num >= 3 ? 2 : hw->dev_num - 1) |
+			       ISP21_SENSOR_INDEX(dev->dev_id);
+			writel(val, hw->base_addr + ISP_ACQ_H_OFFS);
 		}
 		is_upd = true;
 	}

commit 898f20536f8de48ff6c454cbae28f7694f01dffe
Author: Zhen Chen <chenzhen@rock-chips.com>
Date:   Mon Sep 13 15:30:01 2021 +0800

    MALI: remove drivers/gpu/arm/bifrost_for_linux/
    
    Change-Id: Ib91cbcc1d1413bdd9510661ffdd38dd72d984c56
    Signed-off-by: Zhen Chen <chenzhen@rock-chips.com>

diff --git a/drivers/gpu/arm/bifrost_for_linux/Kbuild b/drivers/gpu/arm/bifrost_for_linux/Kbuild
deleted file mode 100644
index 531b92126b98..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/Kbuild
+++ /dev/null
@@ -1,172 +0,0 @@
-#
-# (C) COPYRIGHT 2012-2016, 2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-# Driver version string which is returned to userspace via an ioctl
-MALI_RELEASE_NAME ?= "r8p0-01rel0"
-
-# Paths required for build
-KBASE_PATH = $(src)
-KBASE_PLATFORM_PATH = $(KBASE_PATH)/platform_dummy
-UMP_PATH = $(src)/../../../base
-
-ifeq ($(CONFIG_MALI_BIFROST_ERROR_INJECT),y)
-MALI_ERROR_INJECT_ON = 1
-endif
-
-# Set up defaults if not defined by build system
-MALI_CUSTOMER_RELEASE ?= 1
-MALI_UNIT_TEST ?= 0
-MALI_KERNEL_TEST_API ?= 0
-MALI_ERROR_INJECT_ON ?= 0
-MALI_MOCK_TEST ?= 0
-MALI_COVERAGE ?= 0
-MALI_INSTRUMENTATION_LEVEL ?= 0
-CONFIG_MALI_PLATFORM_NAME ?= "devicetree"
-# This workaround is for what seems to be a compiler bug we observed in
-# GCC 4.7 on AOSP 4.3.  The bug caused an intermittent failure compiling
-# the "_Pragma" syntax, where an error message is returned:
-#
-# "internal compiler error: unspellable token PRAGMA"
-#
-# This regression has thus far only been seen on the GCC 4.7 compiler bundled
-# with AOSP 4.3.0.  So this makefile, intended for in-tree kernel builds
-# which are not known to be used with AOSP, is hardcoded to disable the
-# workaround, i.e. set the define to 0.
-MALI_GCC_WORKAROUND_MIDCOM_4598 ?= 0
-
-# Set up our defines, which will be passed to gcc
-DEFINES = \
-	-DMALI_CUSTOMER_RELEASE=$(MALI_CUSTOMER_RELEASE) \
-	-DMALI_KERNEL_TEST_API=$(MALI_KERNEL_TEST_API) \
-	-DMALI_UNIT_TEST=$(MALI_UNIT_TEST) \
-	-DMALI_ERROR_INJECT_ON=$(MALI_ERROR_INJECT_ON) \
-	-DMALI_MOCK_TEST=$(MALI_MOCK_TEST) \
-	-DMALI_COVERAGE=$(MALI_COVERAGE) \
-	-DMALI_INSTRUMENTATION_LEVEL=$(MALI_INSTRUMENTATION_LEVEL) \
-	-DMALI_RELEASE_NAME=\"$(MALI_RELEASE_NAME)\" \
-	-DMALI_GCC_WORKAROUND_MIDCOM_4598=$(MALI_GCC_WORKAROUND_MIDCOM_4598)
-
-ifeq ($(KBUILD_EXTMOD),)
-# in-tree
-DEFINES +=-DMALI_KBASE_PLATFORM_PATH=../../$(src)/platform/$(CONFIG_MALI_PLATFORM_NAME)
-else
-# out-of-tree
-DEFINES +=-DMALI_KBASE_PLATFORM_PATH=$(src)/platform/$(CONFIG_MALI_PLATFORM_NAME)
-endif
-
-DEFINES += -I$(srctree)/drivers/staging/android
-
-# Use our defines when compiling
-ccflags-y += $(DEFINES) -I$(KBASE_PATH)   -I$(KBASE_PLATFORM_PATH) -I$(UMP_PATH) -I$(srctree)/include/linux
-subdir-ccflags-y += $(DEFINES) -I$(KBASE_PATH)   -I$(KBASE_PLATFORM_PATH) -I$(OSK_PATH) -I$(UMP_PATH) -I$(srctree)/include/linux
-
-SRC := \
-	mali_kbase_device.c \
-	mali_kbase_cache_policy.c \
-	mali_kbase_mem.c \
-	mali_kbase_mmu.c \
-	mali_kbase_ctx_sched.c \
-	mali_kbase_jd.c \
-	mali_kbase_jd_debugfs.c \
-	mali_kbase_jm.c \
-	mali_kbase_gpuprops.c \
-	mali_kbase_js.c \
-	mali_kbase_js_ctx_attr.c \
-	mali_kbase_event.c \
-	mali_kbase_context.c \
-	mali_kbase_pm.c \
-	mali_kbase_config.c \
-	mali_kbase_vinstr.c \
-	mali_kbase_softjobs.c \
-	mali_kbase_10969_workaround.c \
-	mali_kbase_hw.c \
-	mali_kbase_utility.c \
-	mali_kbase_debug.c \
-	mali_kbase_trace_timeline.c \
-	mali_kbase_gpu_memory_debugfs.c \
-	mali_kbase_mem_linux.c \
-	mali_kbase_core_linux.c \
-	mali_kbase_replay.c \
-	mali_kbase_mem_profile_debugfs.c \
-	mali_kbase_mmu_mode_lpae.c \
-	mali_kbase_mmu_mode_aarch64.c \
-	mali_kbase_disjoint_events.c \
-	mali_kbase_gator_api.c \
-	mali_kbase_debug_mem_view.c \
-	mali_kbase_debug_job_fault.c \
-	mali_kbase_smc.c \
-	mali_kbase_mem_pool.c \
-	mali_kbase_mem_pool_debugfs.c \
-	mali_kbase_tlstream.c \
-	mali_kbase_strings.c \
-	mali_kbase_as_fault_debugfs.c \
-	mali_kbase_regs_history_debugfs.c
-
-
-
-
-ifeq ($(MALI_UNIT_TEST),1)
-	SRC += mali_kbase_tlstream_test.c
-endif
-
-ifeq ($(MALI_CUSTOMER_RELEASE),0)
-	SRC += mali_kbase_regs_dump_debugfs.c
-endif
-
-
-ccflags-y += -I$(KBASE_PATH)
-
-# Tell the Linux build system from which .o file to create the kernel module
-obj-$(CONFIG_MALI_BIFROST) += bifrost_kbase.o
-
-# Tell the Linux build system to enable building of our .c files
-bifrost_kbase-y := $(SRC:.c=.o)
-
-# Kconfig passes in the name with quotes for in-tree builds - remove them.
-platform_name := $(shell echo $(CONFIG_MALI_PLATFORM_NAME))
-MALI_PLATFORM_DIR := platform/$(platform_name)
-ccflags-y += -I$(src)/$(MALI_PLATFORM_DIR)
-include $(src)/$(MALI_PLATFORM_DIR)/Kbuild
-
-ifeq ($(CONFIG_MALI_BIFROST_DEVFREQ),y)
-  ifeq ($(CONFIG_DEVFREQ_THERMAL),y)
-    include $(src)/ipa/Kbuild
-  endif
-endif
-
-bifrost_kbase-$(CONFIG_MALI_BIFROST_DMA_FENCE) += \
-	mali_kbase_dma_fence.o \
-	mali_kbase_fence.o
-bifrost_kbase-$(CONFIG_SYNC) += \
-	mali_kbase_sync_android.o \
-	mali_kbase_sync_common.o
-bifrost_kbase-$(CONFIG_SYNC_FILE) += \
-	mali_kbase_sync_file.o \
-	mali_kbase_sync_common.o \
-	mali_kbase_fence.o
-
-ifeq ($(MALI_MOCK_TEST),1)
-# Test functionality
-bifrost_kbase-y += tests/internal/src/mock/mali_kbase_pm_driver_mock.o
-endif
-
-include  $(src)/backend/gpu/Kbuild
-bifrost_kbase-y += $(BACKEND:.c=.o)
-
-
-ccflags-y += -I$(src)/backend/gpu
-subdir-ccflags-y += -I$(src)/backend/gpu
-
-# For kutf and mali_kutf_irq_latency_test
-obj-$(CONFIG_MALI_KUTF) += tests/
diff --git a/drivers/gpu/arm/bifrost_for_linux/Kconfig b/drivers/gpu/arm/bifrost_for_linux/Kconfig
deleted file mode 100644
index e78b634031ee..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/Kconfig
+++ /dev/null
@@ -1,196 +0,0 @@
-#
-# (C) COPYRIGHT 2012-2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-
-menuconfig MALI_BIFROST
-	tristate "Mali Bifrost series support (Linux only)"
-	default n
-	help
-	  Enable this option to build support for a ARM Mali Bifrost GPU.
-
-	  To compile this driver as a module, choose M here:
-	  this will generate a single module, called mali_kbase.
-
-config MALI_BIFROST_GATOR_SUPPORT
-	bool "Streamline support via Gator"
-	depends on MALI_BIFROST
-	default n
-	help
-	  Adds diagnostic support for use with the ARM Streamline Performance Analyzer.
-	  You will need the Gator device driver already loaded before loading this driver when enabling
-	  Streamline debug support.
-	  This is a legacy interface required by older versions of Streamline.
-
-config MALI_BIFROST_DVFS
-	bool "Enable legacy DVFS"
-	depends on MALI_BIFROST && !MALI_BIFROST_DEVFREQ
-	default n
-	help
-	  Choose this option to enable legacy DVFS in the Mali Midgard DDK.
-
-config MALI_BIFROST_ENABLE_TRACE
-	bool "Enable kbase tracing"
-	depends on MALI_BIFROST
-	default n
-	help
-	  Enables tracing in kbase.  Trace log available through
-	  the "mali_trace" debugfs file, when the CONFIG_DEBUG_FS is enabled
-
-config MALI_BIFROST_DEVFREQ
-	bool "devfreq support for Mali"
-	depends on MALI_BIFROST && PM_DEVFREQ
-	help
-	  Support devfreq for Mali.
-
-	  Using the devfreq framework and, by default, the simpleondemand
-	  governor, the frequency of Mali will be dynamically selected from the
-	  available OPPs.
-
-config MALI_BIFROST_DMA_FENCE
-	bool "DMA_BUF fence support for Mali"
-	depends on MALI_BIFROST && !KDS
-	default n
-	help
-	  Support DMA_BUF fences for Mali.
-
-	  This option should only be enabled if KDS is not present and
-	  the Linux Kernel has built in support for DMA_BUF fences.
-
-config MALI_PLATFORM_NAME
-	depends on MALI_BIFROST
-	string "Platform name"
-	default "devicetree"
-	help
-	  Enter the name of the desired platform configuration directory to
-	  include in the build. 'platform/$(MALI_PLATFORM_NAME)/Kbuild' must
-	  exist.
-
-# MALI_BIFROST_EXPERT configuration options
-
-menuconfig MALI_BIFROST_EXPERT
-	depends on MALI_BIFROST
-	bool "Enable Expert Settings"
-	default n
-	help
-	  Enabling this option and modifying the default settings may produce a driver with performance or
-	  other limitations.
-
-config MALI_CORESTACK
-	bool "Support controlling power to the GPU core stack"
-	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
-	default n
-	help
-	  Enabling this feature on supported GPUs will let the driver powering
-	  on/off the GPU core stack independently without involving the Power
-	  Domain Controller. This should only be enabled on platforms which
-	  integration of the PDC to the Mali GPU is known to be problematic.
-	  This feature is currently only supported on t-Six and t-HEx GPUs.
-
-	  If unsure, say N.
-
-config MALI_BIFROST_PRFCNT_SET_SECONDARY
-	bool "Use secondary set of performance counters"
-	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
-	default n
-	help
-	  Select this option to use secondary set of performance counters. Kernel
-	  features that depend on an access to the primary set of counters may
-	  become unavailable. Enabling this option will prevent power management
-	  from working optimally and may cause instrumentation tools to return
-	  bogus results.
-
-	  If unsure, say N.
-
-config MALI_BIFROST_DEBUG
-	bool "Debug build"
-	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
-	default n
-	help
-	  Select this option for increased checking and reporting of errors.
-
-config MALI_BIFROST_FENCE_DEBUG
-	bool "Debug sync fence usage"
-	depends on MALI_BIFROST && MALI_BIFROST_EXPERT && (SYNC || SYNC_FILE)
-	default y if MALI_BIFROST_DEBUG
-	help
-	  Select this option to enable additional checking and reporting on the
-	  use of sync fences in the Mali driver.
-
-	  This will add a 3s timeout to all sync fence waits in the Mali
-	  driver, so that when work for Mali has been waiting on a sync fence
-	  for a long time a debug message will be printed, detailing what fence
-	  is causing the block, and which dependent Mali atoms are blocked as a
-	  result of this.
-
-	  The timeout can be changed at runtime through the js_soft_timeout
-	  device attribute, where the timeout is specified in milliseconds.
-
-config MALI_BIFROST_NO_MALI
-	bool "No Mali"
-	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
-	default n
-	help
-	  This can be used to test the driver in a simulated environment
-	  whereby the hardware is not physically present. If the hardware is physically
-	  present it will not be used. This can be used to test the majority of the
-	  driver without needing actual hardware or for software benchmarking.
-	  All calls to the simulated hardware will complete immediately as if the hardware
-	  completed the task.
-
-config MALI_BIFROST_ERROR_INJECT
-	bool "Error injection"
-	depends on MALI_BIFROST && MALI_BIFROST_EXPERT && MALI_BIFROST_NO_MALI
-	default n
-	help
-	  Enables insertion of errors to test module failure and recovery mechanisms.
-
-config MALI_BIFROST_TRACE_TIMELINE
-	bool "Timeline tracing"
-	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
-	default n
-	help
-	  Enables timeline tracing through the kernel tracepoint system.
-
-config MALI_BIFROST_SYSTEM_TRACE
-	bool "Enable system event tracing support"
-	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
-	default n
-	help
-	  Choose this option to enable system trace events for each
-	  kbase event.	This is typically used for debugging but has
-	  minimal overhead when not in use. Enable only if you know what
-	  you are doing.
-
-config MALI_2MB_ALLOC
-	bool "Attempt to allocate 2MB pages"
-	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
-	default n
-	help
-	  Rather than allocating all GPU memory page-by-page, attempt to
-	  allocate 2MB pages from the kernel. This reduces TLB pressure and
-	  helps to prevent memory fragmentation.
-
-	  If in doubt, say N
-
-config MALI_PWRSOFT_765
-	bool "PWRSOFT-765 ticket"
-	default n
-	help
-	  PWRSOFT-765 fixes devfreq cooling devices issues. However, they are
-	  not merged in mainline kernel yet. So this define helps to guard those
-	  parts of the code.
-
-source "drivers/gpu/arm/bifrost/platform/Kconfig"
-# source "drivers/gpu/arm/bifrost/tests/Kconfig"
diff --git a/drivers/gpu/arm/bifrost_for_linux/Makefile b/drivers/gpu/arm/bifrost_for_linux/Makefile
deleted file mode 100644
index 26522d566dd0..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/Makefile
+++ /dev/null
@@ -1,42 +0,0 @@
-#
-# (C) COPYRIGHT 2010-2016, 2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-
-KDIR ?= /lib/modules/$(shell uname -r)/build
-
-BUSLOG_PATH_RELATIVE = $(CURDIR)/../../../..
-UMP_PATH_RELATIVE = $(CURDIR)/../../../base/ump
-KBASE_PATH_RELATIVE = $(CURDIR)
-KDS_PATH_RELATIVE = $(CURDIR)/../../../..
-EXTRA_SYMBOLS = $(UMP_PATH_RELATIVE)/src/Module.symvers
-
-ifeq ($(MALI_UNIT_TEST), 1)
-	EXTRA_SYMBOLS += $(KBASE_PATH_RELATIVE)/tests/internal/src/kernel_assert_module/linux/Module.symvers
-endif
-
-ifeq ($(CONFIG_MALI_FPGA_BUS_LOGGER),y)
-#Add bus logger symbols
-EXTRA_SYMBOLS += $(BUSLOG_PATH_RELATIVE)/drivers/base/bus_logger/Module.symvers
-endif
-
-# GPL driver supports KDS
-EXTRA_SYMBOLS += $(KDS_PATH_RELATIVE)/drivers/base/kds/Module.symvers
-
-# we get the symbols from modules using KBUILD_EXTRA_SYMBOLS to prevent warnings about unknown functions
-all:
-	$(MAKE) -C $(KDIR) M=$(CURDIR) EXTRA_CFLAGS="-I$(CURDIR)/../../../../include -I$(CURDIR)/../../../../tests/include $(SCONS_CFLAGS)" $(SCONS_CONFIGS) KBUILD_EXTRA_SYMBOLS="$(EXTRA_SYMBOLS)" modules
-
-clean:
-	$(MAKE) -C $(KDIR) M=$(CURDIR) clean
diff --git a/drivers/gpu/arm/bifrost_for_linux/Makefile.kbase b/drivers/gpu/arm/bifrost_for_linux/Makefile.kbase
deleted file mode 100644
index 2bef9c25eaeb..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/Makefile.kbase
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# (C) COPYRIGHT 2010 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-EXTRA_CFLAGS += -I$(ROOT) -I$(KBASE_PATH) -I$(OSK_PATH)/src/linux/include -I$(KBASE_PATH)/platform_$(PLATFORM)
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/Kbuild b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/Kbuild
deleted file mode 100644
index 5eeba1b14710..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/Kbuild
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-# (C) COPYRIGHT 2014,2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-BACKEND += \
-	backend/gpu/mali_kbase_cache_policy_backend.c \
-	backend/gpu/mali_kbase_device_hw.c \
-	backend/gpu/mali_kbase_gpu.c \
-	backend/gpu/mali_kbase_gpuprops_backend.c \
-	backend/gpu/mali_kbase_debug_job_fault_backend.c \
-	backend/gpu/mali_kbase_irq_linux.c \
-	backend/gpu/mali_kbase_instr_backend.c \
-	backend/gpu/mali_kbase_jm_as.c \
-	backend/gpu/mali_kbase_jm_hw.c \
-	backend/gpu/mali_kbase_jm_rb.c \
-	backend/gpu/mali_kbase_js_affinity.c \
-	backend/gpu/mali_kbase_js_backend.c \
-	backend/gpu/mali_kbase_mmu_hw_direct.c \
-	backend/gpu/mali_kbase_pm_backend.c \
-	backend/gpu/mali_kbase_pm_driver.c \
-	backend/gpu/mali_kbase_pm_metrics.c \
-	backend/gpu/mali_kbase_pm_ca.c \
-	backend/gpu/mali_kbase_pm_ca_fixed.c \
-	backend/gpu/mali_kbase_pm_always_on.c \
-	backend/gpu/mali_kbase_pm_coarse_demand.c \
-	backend/gpu/mali_kbase_pm_demand.c \
-	backend/gpu/mali_kbase_pm_policy.c \
-	backend/gpu/mali_kbase_time.c
-
-ifeq ($(MALI_CUSTOMER_RELEASE),0)
-BACKEND += \
-	backend/gpu/mali_kbase_pm_ca_random.c \
-	backend/gpu/mali_kbase_pm_demand_always_powered.c \
-	backend/gpu/mali_kbase_pm_fast_start.c
-endif
-
-ifeq ($(CONFIG_MALI_BIFROST_DEVFREQ),y)
-BACKEND += \
-	backend/gpu/mali_kbase_devfreq.c \
-	backend/gpu/mali_kbase_pm_ca_devfreq.c
-endif
-
-ifeq ($(CONFIG_MALI_BIFROST_NO_MALI),y)
-	# Dummy model
-	BACKEND += backend/gpu/mali_kbase_model_dummy.c
-	BACKEND += backend/gpu/mali_kbase_model_linux.c
-	# HW error simulation
-	BACKEND += backend/gpu/mali_kbase_model_error_generator.c
-endif
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_backend_config.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_backend_config.h
deleted file mode 100644
index c8ae87eb84a2..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_backend_config.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * Backend specific configuration
- */
-
-#ifndef _KBASE_BACKEND_CONFIG_H_
-#define _KBASE_BACKEND_CONFIG_H_
-
-/* Enable GPU reset API */
-#define KBASE_GPU_RESET_EN 1
-
-#endif /* _KBASE_BACKEND_CONFIG_H_ */
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_cache_policy_backend.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_cache_policy_backend.c
deleted file mode 100644
index fef9a2cb743e..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_cache_policy_backend.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2015-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include "backend/gpu/mali_kbase_cache_policy_backend.h"
-#include <backend/gpu/mali_kbase_device_internal.h>
-
-void kbase_cache_set_coherency_mode(struct kbase_device *kbdev,
-		u32 mode)
-{
-	kbdev->current_gpu_coherency_mode = mode;
-
-	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_COHERENCY_REG))
-		kbase_reg_write(kbdev, COHERENCY_ENABLE, mode, NULL);
-}
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_cache_policy_backend.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_cache_policy_backend.h
deleted file mode 100644
index fe9869109a82..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_cache_policy_backend.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2015-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-#ifndef _KBASE_CACHE_POLICY_BACKEND_H_
-#define _KBASE_CACHE_POLICY_BACKEND_H_
-
-#include "mali_kbase.h"
-#include "mali_base_kernel.h"
-
-/**
-  * kbase_cache_set_coherency_mode() - Sets the system coherency mode
-  *			in the GPU.
-  * @kbdev:	Device pointer
-  * @mode:	Coherency mode. COHERENCY_ACE/ACE_LITE
-  */
-void kbase_cache_set_coherency_mode(struct kbase_device *kbdev,
-		u32 mode);
-
-#endif				/* _KBASE_CACHE_POLICY_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_debug_job_fault_backend.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_debug_job_fault_backend.c
deleted file mode 100644
index 7851ea6466c7..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_debug_job_fault_backend.c
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <mali_kbase.h>
-#include <backend/gpu/mali_kbase_device_internal.h>
-#include "mali_kbase_debug_job_fault.h"
-
-#ifdef CONFIG_DEBUG_FS
-
-/*GPU_CONTROL_REG(r)*/
-static int gpu_control_reg_snapshot[] = {
-	GPU_ID,
-	SHADER_READY_LO,
-	SHADER_READY_HI,
-	TILER_READY_LO,
-	TILER_READY_HI,
-	L2_READY_LO,
-	L2_READY_HI
-};
-
-/* JOB_CONTROL_REG(r) */
-static int job_control_reg_snapshot[] = {
-	JOB_IRQ_MASK,
-	JOB_IRQ_STATUS
-};
-
-/* JOB_SLOT_REG(n,r) */
-static int job_slot_reg_snapshot[] = {
-	JS_HEAD_LO,
-	JS_HEAD_HI,
-	JS_TAIL_LO,
-	JS_TAIL_HI,
-	JS_AFFINITY_LO,
-	JS_AFFINITY_HI,
-	JS_CONFIG,
-	JS_STATUS,
-	JS_HEAD_NEXT_LO,
-	JS_HEAD_NEXT_HI,
-	JS_AFFINITY_NEXT_LO,
-	JS_AFFINITY_NEXT_HI,
-	JS_CONFIG_NEXT
-};
-
-/*MMU_REG(r)*/
-static int mmu_reg_snapshot[] = {
-	MMU_IRQ_MASK,
-	MMU_IRQ_STATUS
-};
-
-/* MMU_AS_REG(n,r) */
-static int as_reg_snapshot[] = {
-	AS_TRANSTAB_LO,
-	AS_TRANSTAB_HI,
-	AS_MEMATTR_LO,
-	AS_MEMATTR_HI,
-	AS_FAULTSTATUS,
-	AS_FAULTADDRESS_LO,
-	AS_FAULTADDRESS_HI,
-	AS_STATUS
-};
-
-bool kbase_debug_job_fault_reg_snapshot_init(struct kbase_context *kctx,
-		int reg_range)
-{
-	int i, j;
-	int offset = 0;
-	int slot_number;
-	int as_number;
-
-	if (kctx->reg_dump == NULL)
-		return false;
-
-	slot_number = kctx->kbdev->gpu_props.num_job_slots;
-	as_number = kctx->kbdev->gpu_props.num_address_spaces;
-
-	/* get the GPU control registers*/
-	for (i = 0; i < sizeof(gpu_control_reg_snapshot)/4; i++) {
-		kctx->reg_dump[offset] =
-				GPU_CONTROL_REG(gpu_control_reg_snapshot[i]);
-		offset += 2;
-	}
-
-	/* get the Job control registers*/
-	for (i = 0; i < sizeof(job_control_reg_snapshot)/4; i++) {
-		kctx->reg_dump[offset] =
-				JOB_CONTROL_REG(job_control_reg_snapshot[i]);
-		offset += 2;
-	}
-
-	/* get the Job Slot registers*/
-	for (j = 0; j < slot_number; j++)	{
-		for (i = 0; i < sizeof(job_slot_reg_snapshot)/4; i++) {
-			kctx->reg_dump[offset] =
-			JOB_SLOT_REG(j, job_slot_reg_snapshot[i]);
-			offset += 2;
-		}
-	}
-
-	/* get the MMU registers*/
-	for (i = 0; i < sizeof(mmu_reg_snapshot)/4; i++) {
-		kctx->reg_dump[offset] = MMU_REG(mmu_reg_snapshot[i]);
-		offset += 2;
-	}
-
-	/* get the Address space registers*/
-	for (j = 0; j < as_number; j++) {
-		for (i = 0; i < sizeof(as_reg_snapshot)/4; i++) {
-			kctx->reg_dump[offset] =
-					MMU_AS_REG(j, as_reg_snapshot[i]);
-			offset += 2;
-		}
-	}
-
-	WARN_ON(offset >= (reg_range*2/4));
-
-	/* set the termination flag*/
-	kctx->reg_dump[offset] = REGISTER_DUMP_TERMINATION_FLAG;
-	kctx->reg_dump[offset + 1] = REGISTER_DUMP_TERMINATION_FLAG;
-
-	dev_dbg(kctx->kbdev->dev, "kbase_job_fault_reg_snapshot_init:%d\n",
-			offset);
-
-	return true;
-}
-
-bool kbase_job_fault_get_reg_snapshot(struct kbase_context *kctx)
-{
-	int offset = 0;
-
-	if (kctx->reg_dump == NULL)
-		return false;
-
-	while (kctx->reg_dump[offset] != REGISTER_DUMP_TERMINATION_FLAG) {
-		kctx->reg_dump[offset+1] =
-				kbase_reg_read(kctx->kbdev,
-						kctx->reg_dump[offset], NULL);
-		offset += 2;
-	}
-	return true;
-}
-
-
-#endif
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_devfreq.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_devfreq.c
deleted file mode 100644
index 003af36d8fe2..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_devfreq.c
+++ /dev/null
@@ -1,495 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <mali_kbase.h>
-#include <mali_kbase_tlstream.h>
-#include <mali_kbase_config_defaults.h>
-#include <backend/gpu/mali_kbase_pm_internal.h>
-
-#include <linux/of.h>
-#include <linux/clk.h>
-#include <linux/devfreq.h>
-#ifdef CONFIG_DEVFREQ_THERMAL
-#include <linux/devfreq_cooling.h>
-#endif
-
-#include <linux/version.h>
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)
-#include <linux/pm_opp.h>
-#else /* Linux >= 3.13 */
-/* In 3.13 the OPP include header file, types, and functions were all
- * renamed. Use the old filename for the include, and define the new names to
- * the old, when an old kernel is detected.
- */
-#include <linux/opp.h>
-#define dev_pm_opp opp
-#define dev_pm_opp_get_voltage opp_get_voltage
-#define dev_pm_opp_get_opp_count opp_get_opp_count
-#define dev_pm_opp_find_freq_ceil opp_find_freq_ceil
-#define dev_pm_opp_find_freq_floor opp_find_freq_floor
-#endif /* Linux >= 3.13 */
-
-#include <soc/rockchip/rockchip_ipa.h>
-#include <soc/rockchip/rockchip_opp_select.h>
-#include <soc/rockchip/rockchip_system_monitor.h>
-
-static struct devfreq_simple_ondemand_data ondemand_data;
-
-static struct monitor_dev_profile mali_mdevp = {
-	.type = MONITOR_TPYE_DEV,
-	.low_temp_adjust = rockchip_monitor_dev_low_temp_adjust,
-	.high_temp_adjust = rockchip_monitor_dev_high_temp_adjust,
-};
-
-/**
- * opp_translate - Translate nominal OPP frequency from devicetree into real
- *                 frequency and core mask
- * @kbdev:     Device pointer
- * @freq:      Nominal frequency
- * @core_mask: Pointer to u64 to store core mask to
- *
- * Return: Real target frequency
- *
- * This function will only perform translation if an operating-points-v2-mali
- * table is present in devicetree. If one is not present then it will return an
- * untranslated frequency and all cores enabled.
- */
-static unsigned long opp_translate(struct kbase_device *kbdev,
-		unsigned long freq, u64 *core_mask)
-{
-	int i;
-
-	for (i = 0; i < kbdev->num_opps; i++) {
-		if (kbdev->opp_table[i].opp_freq == freq) {
-			*core_mask = kbdev->opp_table[i].core_mask;
-			return kbdev->opp_table[i].real_freq;
-		}
-	}
-
-	/* Failed to find OPP - return all cores enabled & nominal frequency */
-	*core_mask = kbdev->gpu_props.props.raw_props.shader_present;
-
-	return freq;
-}
-
-static int
-kbase_devfreq_target(struct device *dev, unsigned long *target_freq, u32 flags)
-{
-	struct kbase_device *kbdev = dev_get_drvdata(dev);
-	struct dev_pm_opp *opp;
-	unsigned long nominal_freq;
-	unsigned long freq = 0;
-	unsigned long voltage;
-	int err;
-	u64 core_mask;
-
-	freq = *target_freq;
-
-	opp = devfreq_recommended_opp(dev, &freq, flags);
-	if (IS_ERR(opp)) {
-		dev_err(dev, "Failed to get opp (%ld)\n", PTR_ERR(opp));
-		return PTR_ERR(opp);
-	}
-	voltage = dev_pm_opp_get_voltage(opp);
-	dev_pm_opp_put(opp);
-
-	nominal_freq = freq;
-	/*
-	 * Only update if there is a change of frequency
-	 */
-	if (kbdev->current_nominal_freq == nominal_freq) {
-		*target_freq = nominal_freq;
-#ifdef CONFIG_REGULATOR
-		if (kbdev->current_voltage == voltage)
-			return 0;
-		err = regulator_set_voltage(kbdev->regulator, voltage, INT_MAX);
-		if (err) {
-			dev_err(dev, "Failed to set voltage (%d)\n", err);
-			return err;
-		}
-		kbdev->current_voltage = voltage;
-#endif
-		return 0;
-	}
-
-	freq = opp_translate(kbdev, nominal_freq, &core_mask);
-#ifdef CONFIG_REGULATOR
-	if (kbdev->regulator && kbdev->current_voltage != voltage
-			&& kbdev->current_freq < freq) {
-		err = regulator_set_voltage(kbdev->regulator, voltage, INT_MAX);
-		if (err) {
-			dev_err(dev, "Failed to increase voltage (%d)\n", err);
-			return err;
-		}
-	}
-#endif
-
-	err = clk_set_rate(kbdev->clock, freq);
-	if (err) {
-		dev_err(dev, "Failed to set clock %lu (target %lu)\n",
-				freq, *target_freq);
-		return err;
-	}
-
-#ifdef CONFIG_REGULATOR
-	if (kbdev->regulator && kbdev->current_voltage != voltage
-			&& kbdev->current_freq > freq) {
-		err = regulator_set_voltage(kbdev->regulator, voltage, INT_MAX);
-		if (err) {
-			dev_err(dev, "Failed to decrease voltage (%d)\n", err);
-			return err;
-		}
-	}
-#endif
-
-	if (kbdev->pm.backend.ca_current_policy->id ==
-			KBASE_PM_CA_POLICY_ID_DEVFREQ)
-		kbase_devfreq_set_core_mask(kbdev, core_mask);
-
-	*target_freq = nominal_freq;
-	kbdev->current_voltage = voltage;
-	kbdev->current_nominal_freq = nominal_freq;
-	kbdev->current_freq = freq;
-	kbdev->current_core_mask = core_mask;
-	if (kbdev->devfreq)
-		kbdev->devfreq->last_status.current_frequency = nominal_freq;
-
-	KBASE_TLSTREAM_AUX_DEVFREQ_TARGET((u64)nominal_freq);
-
-	kbase_pm_reset_dvfs_utilisation(kbdev);
-
-	return err;
-}
-
-static int
-kbase_devfreq_cur_freq(struct device *dev, unsigned long *freq)
-{
-	struct kbase_device *kbdev = dev_get_drvdata(dev);
-
-	*freq = kbdev->current_nominal_freq;
-
-	return 0;
-}
-
-static int
-kbase_devfreq_status(struct device *dev, struct devfreq_dev_status *stat)
-{
-	struct kbase_device *kbdev = dev_get_drvdata(dev);
-
-	kbase_pm_get_dvfs_utilisation(kbdev,
-			&stat->total_time, &stat->busy_time);
-
-	stat->private_data = NULL;
-
-	return 0;
-}
-
-static int kbase_devfreq_init_freq_table(struct kbase_device *kbdev,
-		struct devfreq_dev_profile *dp)
-{
-	int count;
-	int i = 0;
-	unsigned long freq;
-	struct dev_pm_opp *opp;
-
-	count = dev_pm_opp_get_opp_count(kbdev->dev);
-	if (count < 0) {
-		return count;
-	}
-
-	dp->freq_table = kmalloc_array(count, sizeof(dp->freq_table[0]),
-				GFP_KERNEL);
-	if (!dp->freq_table)
-		return -ENOMEM;
-
-	for (i = 0, freq = ULONG_MAX; i < count; i++, freq--) {
-		opp = dev_pm_opp_find_freq_floor(kbdev->dev, &freq);
-		if (IS_ERR(opp))
-			break;
-		dev_pm_opp_put(opp);
-
-		dp->freq_table[i] = freq;
-	}
-
-	if (count != i)
-		dev_warn(kbdev->dev, "Unable to enumerate all OPPs (%d!=%d\n",
-				count, i);
-
-	dp->max_state = i;
-
-	return 0;
-}
-
-static void kbase_devfreq_term_freq_table(struct kbase_device *kbdev)
-{
-	struct devfreq_dev_profile *dp = kbdev->devfreq->profile;
-
-	kfree(dp->freq_table);
-}
-
-static void kbase_devfreq_exit(struct device *dev)
-{
-	struct kbase_device *kbdev = dev_get_drvdata(dev);
-
-	kbase_devfreq_term_freq_table(kbdev);
-}
-
-static int kbase_devfreq_init_core_mask_table(struct kbase_device *kbdev)
-{
-	struct device_node *opp_node = of_parse_phandle(kbdev->dev->of_node,
-			"operating-points-v2", 0);
-	struct device_node *node;
-	int i = 0;
-	int count;
-
-	if (!opp_node)
-		return 0;
-	if (!of_device_is_compatible(opp_node, "operating-points-v2-mali"))
-		return 0;
-
-	count = dev_pm_opp_get_opp_count(kbdev->dev);
-	kbdev->opp_table = kmalloc_array(count,
-			sizeof(struct kbase_devfreq_opp), GFP_KERNEL);
-	if (!kbdev->opp_table)
-		return -ENOMEM;
-
-	for_each_available_child_of_node(opp_node, node) {
-		u64 core_mask;
-		u64 opp_freq, real_freq;
-		const void *core_count_p;
-
-		if (of_property_read_u64(node, "opp-hz", &opp_freq)) {
-			dev_warn(kbdev->dev, "OPP is missing required opp-hz property\n");
-			continue;
-		}
-		if (of_property_read_u64(node, "opp-hz-real", &real_freq))
-			real_freq = opp_freq;
-		if (of_property_read_u64(node, "opp-core-mask", &core_mask))
-			core_mask =
-				kbdev->gpu_props.props.raw_props.shader_present;
-		core_count_p = of_get_property(node, "opp-core-count", NULL);
-		if (core_count_p) {
-			u64 remaining_core_mask =
-				kbdev->gpu_props.props.raw_props.shader_present;
-			int core_count = be32_to_cpup(core_count_p);
-
-			core_mask = 0;
-
-			for (; core_count > 0; core_count--) {
-				int core = ffs(remaining_core_mask);
-
-				if (!core) {
-					dev_err(kbdev->dev, "OPP has more cores than GPU\n");
-					return -ENODEV;
-				}
-
-				core_mask |= (1ull << (core-1));
-				remaining_core_mask &= ~(1ull << (core-1));
-			}
-		}
-
-		if (!core_mask) {
-			dev_err(kbdev->dev, "OPP has invalid core mask of 0\n");
-			return -ENODEV;
-		}
-
-		kbdev->opp_table[i].opp_freq = opp_freq;
-		kbdev->opp_table[i].real_freq = real_freq;
-		kbdev->opp_table[i].core_mask = core_mask;
-
-		dev_info(kbdev->dev, "OPP %d : opp_freq=%llu real_freq=%llu core_mask=%llx\n",
-				i, opp_freq, real_freq, core_mask);
-
-		i++;
-	}
-
-	kbdev->num_opps = i;
-
-	return 0;
-}
-
-static unsigned long kbase_devfreq_get_static_power(struct devfreq *devfreq,
-						    unsigned long voltage)
-{
-	struct device *dev = devfreq->dev.parent;
-	struct kbase_device *kbdev = dev_get_drvdata(dev);
-
-	return rockchip_ipa_get_static_power(kbdev->model_data, voltage);
-}
-
-static struct devfreq_cooling_power kbase_cooling_power = {
-	.get_static_power = &kbase_devfreq_get_static_power,
-};
-
-int kbase_devfreq_init(struct kbase_device *kbdev)
-{
-	struct device_node *np = kbdev->dev->of_node;
-	struct devfreq_dev_profile *dp;
-	struct dev_pm_opp *opp;
-	unsigned long opp_rate;
-	int err;
-
-	if (!kbdev->clock) {
-		dev_err(kbdev->dev, "Clock not available for devfreq\n");
-		return -ENODEV;
-	}
-
-	kbdev->current_freq = clk_get_rate(kbdev->clock);
-	kbdev->current_nominal_freq = kbdev->current_freq;
-
-	dp = &kbdev->devfreq_profile;
-
-	dp->initial_freq = kbdev->current_freq;
-	dp->polling_ms = 100;
-	dp->target = kbase_devfreq_target;
-	dp->get_dev_status = kbase_devfreq_status;
-	dp->get_cur_freq = kbase_devfreq_cur_freq;
-	dp->exit = kbase_devfreq_exit;
-
-	if (kbase_devfreq_init_freq_table(kbdev, dp))
-		return -EFAULT;
-
-	err = kbase_devfreq_init_core_mask_table(kbdev);
-	if (err)
-		return err;
-	of_property_read_u32(np, "upthreshold",
-			     &ondemand_data.upthreshold);
-	of_property_read_u32(np, "downdifferential",
-			     &ondemand_data.downdifferential);
-	kbdev->devfreq = devfreq_add_device(kbdev->dev, dp,
-				"simple_ondemand", &ondemand_data);
-	if (IS_ERR(kbdev->devfreq)) {
-		kbase_devfreq_term_freq_table(kbdev);
-		return PTR_ERR(kbdev->devfreq);
-	}
-
-	/* devfreq_add_device only copies a few of kbdev->dev's fields, so
-	 * set drvdata explicitly so IPA models can access kbdev. */
-	dev_set_drvdata(&kbdev->devfreq->dev, kbdev);
-
-	err = devfreq_register_opp_notifier(kbdev->dev, kbdev->devfreq);
-	if (err) {
-		dev_err(kbdev->dev,
-			"Failed to register OPP notifier (%d)\n", err);
-		goto opp_notifier_failed;
-	}
-
-	opp_rate = kbdev->current_freq;
-	opp = devfreq_recommended_opp(kbdev->dev, &opp_rate, 0);
-	if (!IS_ERR(opp))
-		dev_pm_opp_put(opp);
-	kbdev->devfreq->last_status.current_frequency = opp_rate;
-
-	mali_mdevp.data = kbdev->devfreq;
-	kbdev->mdev_info = rockchip_system_monitor_register(kbdev->dev,
-							    &mali_mdevp);
-	if (IS_ERR(kbdev->mdev_info)) {
-		dev_dbg(kbdev->dev, "without system monitor\n");
-		kbdev->mdev_info = NULL;
-	}
-#ifdef CONFIG_DEVFREQ_THERMAL
-	if (of_find_compatible_node(kbdev->dev->of_node, NULL,
-				    "simple-power-model")) {
-		of_property_read_u32(kbdev->dev->of_node,
-				     "dynamic-power-coefficient",
-				     (u32 *)&kbase_dcp->dyn_power_coeff);
-		kbdev->model_data = rockchip_ipa_power_model_init(kbdev->dev,
-								  "gpu_leakage");
-		if (IS_ERR_OR_NULL(kbdev->model_data)) {
-			kbdev->model_data = NULL;
-			dev_err(kbdev->dev, "failed to initialize power model\n");
-		} else if (kbdev->model_data->dynamic_coefficient) {
-			kbase_dcp->dyn_power_coeff =
-				kbdev->model_data->dynamic_coefficient;
-		}
-		if (!kbase_dcp->dyn_power_coeff) {
-			dev_err(kbdev->dev, "failed to get dynamic-coefficient\n");
-			err = -EINVAL;
-			goto cooling_failed;
-		}
-
-		kbdev->devfreq_cooling =
-			of_devfreq_cooling_register_power(kbdev->dev->of_node,
-							  kbdev->devfreq,
-							  kbase_dcp);
-		if (IS_ERR(kbdev->devfreq_cooling)) {
-			dev_err(kbdev->dev, "failed to register cooling device\n");
-			err = PTR_ERR(kbdev->devfreq_cooling);
-			goto cooling_failed;
-		}
-	} else {
-		err = kbase_ipa_init(kbdev);
-		if (err) {
-			dev_err(kbdev->dev, "IPA initialization failed\n");
-			goto cooling_failed;
-		}
-
-		kbdev->devfreq_cooling = of_devfreq_cooling_register_power(
-				kbdev->dev->of_node,
-				kbdev->devfreq,
-				&kbase_ipa_power_model_ops);
-		if (IS_ERR(kbdev->devfreq_cooling)) {
-			err = PTR_ERR(kbdev->devfreq_cooling);
-			dev_err(kbdev->dev,
-				"Failed to register cooling device (%d)\n",
-				err);
-			goto cooling_failed;
-		}
-	}
-#endif
-
-	return 0;
-
-#ifdef CONFIG_DEVFREQ_THERMAL
-cooling_failed:
-	devfreq_unregister_opp_notifier(kbdev->dev, kbdev->devfreq);
-#endif /* CONFIG_DEVFREQ_THERMAL */
-opp_notifier_failed:
-	if (devfreq_remove_device(kbdev->devfreq))
-		dev_err(kbdev->dev, "Failed to terminate devfreq (%d)\n", err);
-	else
-		kbdev->devfreq = NULL;
-
-	return err;
-}
-
-void kbase_devfreq_term(struct kbase_device *kbdev)
-{
-	int err;
-
-	dev_dbg(kbdev->dev, "Term Mali devfreq\n");
-
-	rockchip_system_monitor_unregister(kbdev->mdev_info);
-#ifdef CONFIG_DEVFREQ_THERMAL
-	if (kbdev->devfreq_cooling)
-		devfreq_cooling_unregister(kbdev->devfreq_cooling);
-
-	if (!kbdev->model_data)
-		kbase_ipa_term(kbdev);
-	kfree(kbdev->model_data);
-#endif
-
-	devfreq_unregister_opp_notifier(kbdev->dev, kbdev->devfreq);
-
-	err = devfreq_remove_device(kbdev->devfreq);
-	if (err)
-		dev_err(kbdev->dev, "Failed to terminate devfreq (%d)\n", err);
-	else
-		kbdev->devfreq = NULL;
-
-	kfree(kbdev->opp_table);
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_devfreq.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_devfreq.h
deleted file mode 100644
index 7bcc350f3006..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_devfreq.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _BASE_DEVFREQ_H_
-#define _BASE_DEVFREQ_H_
-
-int kbase_devfreq_init(struct kbase_device *kbdev);
-void kbase_devfreq_term(struct kbase_device *kbdev);
-int kbase_platform_rk_init_opp_table(struct kbase_device *kbdev);
-
-#endif /* _BASE_DEVFREQ_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_device_hw.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_device_hw.c
deleted file mode 100644
index 17f253308ffc..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_device_hw.c
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-/*
- *
- */
-#include <mali_kbase.h>
-#include <backend/gpu/mali_kbase_instr_internal.h>
-#include <backend/gpu/mali_kbase_pm_internal.h>
-
-#include <backend/gpu/mali_kbase_device_internal.h>
-
-#if !defined(CONFIG_MALI_BIFROST_NO_MALI)
-
-
-#ifdef CONFIG_DEBUG_FS
-
-
-int kbase_io_history_resize(struct kbase_io_history *h, u16 new_size)
-{
-	struct kbase_io_access *old_buf;
-	struct kbase_io_access *new_buf;
-	unsigned long flags;
-
-	if (!new_size)
-		goto out_err; /* The new size must not be 0 */
-
-	new_buf = vmalloc(new_size * sizeof(*h->buf));
-	if (!new_buf)
-		goto out_err;
-
-	spin_lock_irqsave(&h->lock, flags);
-
-	old_buf = h->buf;
-
-	/* Note: we won't bother with copying the old data over. The dumping
-	 * logic wouldn't work properly as it relies on 'count' both as a
-	 * counter and as an index to the buffer which would have changed with
-	 * the new array. This is a corner case that we don't need to support.
-	 */
-	h->count = 0;
-	h->size = new_size;
-	h->buf = new_buf;
-
-	spin_unlock_irqrestore(&h->lock, flags);
-
-	vfree(old_buf);
-
-	return 0;
-
-out_err:
-	return -1;
-}
-
-
-int kbase_io_history_init(struct kbase_io_history *h, u16 n)
-{
-	h->enabled = false;
-	spin_lock_init(&h->lock);
-	h->count = 0;
-	h->size = 0;
-	h->buf = NULL;
-	if (kbase_io_history_resize(h, n))
-		return -1;
-
-	return 0;
-}
-
-
-void kbase_io_history_term(struct kbase_io_history *h)
-{
-	vfree(h->buf);
-	h->buf = NULL;
-}
-
-
-/* kbase_io_history_add - add new entry to the register access history
- *
- * @h: Pointer to the history data structure
- * @addr: Register address
- * @value: The value that is either read from or written to the register
- * @write: 1 if it's a register write, 0 if it's a read
- */
-static void kbase_io_history_add(struct kbase_io_history *h,
-		void __iomem const *addr, u32 value, u8 write)
-{
-	struct kbase_io_access *io;
-	unsigned long flags;
-
-	spin_lock_irqsave(&h->lock, flags);
-
-	io = &h->buf[h->count % h->size];
-	io->addr = (uintptr_t)addr | write;
-	io->value = value;
-	++h->count;
-	/* If count overflows, move the index by the buffer size so the entire
-	 * buffer will still be dumped later */
-	if (unlikely(!h->count))
-		h->count = h->size;
-
-	spin_unlock_irqrestore(&h->lock, flags);
-}
-
-
-void kbase_io_history_dump(struct kbase_device *kbdev)
-{
-	struct kbase_io_history *const h = &kbdev->io_history;
-	u16 i;
-	size_t iters;
-	unsigned long flags;
-
-	if (!unlikely(h->enabled))
-		return;
-
-	spin_lock_irqsave(&h->lock, flags);
-
-	dev_err(kbdev->dev, "Register IO History:");
-	iters = (h->size > h->count) ? h->count : h->size;
-	dev_err(kbdev->dev, "Last %zu register accesses of %zu total:\n", iters,
-			h->count);
-	for (i = 0; i < iters; ++i) {
-		struct kbase_io_access *io =
-			&h->buf[(h->count - iters + i) % h->size];
-		char const access = (io->addr & 1) ? 'w' : 'r';
-
-		dev_err(kbdev->dev, "%6i: %c: reg 0x%p val %08x\n", i, access,
-				(void *)(io->addr & ~0x1), io->value);
-	}
-
-	spin_unlock_irqrestore(&h->lock, flags);
-}
-
-
-#endif /* CONFIG_DEBUG_FS */
-
-
-void kbase_reg_write(struct kbase_device *kbdev, u16 offset, u32 value,
-						struct kbase_context *kctx)
-{
-	KBASE_DEBUG_ASSERT(kbdev->pm.backend.gpu_powered);
-	KBASE_DEBUG_ASSERT(kctx == NULL || kctx->as_nr != KBASEP_AS_NR_INVALID);
-	KBASE_DEBUG_ASSERT(kbdev->dev != NULL);
-
-	writel(value, kbdev->reg + offset);
-
-#ifdef CONFIG_DEBUG_FS
-	if (unlikely(kbdev->io_history.enabled))
-		kbase_io_history_add(&kbdev->io_history, kbdev->reg + offset,
-				value, 1);
-#endif /* CONFIG_DEBUG_FS */
-	dev_dbg(kbdev->dev, "w: reg %04x val %08x", offset, value);
-
-	if (kctx && kctx->jctx.tb)
-		kbase_device_trace_register_access(kctx, REG_WRITE, offset,
-									value);
-}
-
-KBASE_EXPORT_TEST_API(kbase_reg_write);
-
-u32 kbase_reg_read(struct kbase_device *kbdev, u16 offset,
-						struct kbase_context *kctx)
-{
-	u32 val;
-	KBASE_DEBUG_ASSERT(kbdev->pm.backend.gpu_powered);
-	KBASE_DEBUG_ASSERT(kctx == NULL || kctx->as_nr != KBASEP_AS_NR_INVALID);
-	KBASE_DEBUG_ASSERT(kbdev->dev != NULL);
-
-	val = readl(kbdev->reg + offset);
-
-#ifdef CONFIG_DEBUG_FS
-	if (unlikely(kbdev->io_history.enabled))
-		kbase_io_history_add(&kbdev->io_history, kbdev->reg + offset,
-				val, 0);
-#endif /* CONFIG_DEBUG_FS */
-	dev_dbg(kbdev->dev, "r: reg %04x val %08x", offset, val);
-
-	if (kctx && kctx->jctx.tb)
-		kbase_device_trace_register_access(kctx, REG_READ, offset, val);
-	return val;
-}
-
-KBASE_EXPORT_TEST_API(kbase_reg_read);
-#endif /* !defined(CONFIG_MALI_BIFROST_NO_MALI) */
-
-/**
- * kbase_report_gpu_fault - Report a GPU fault.
- * @kbdev:    Kbase device pointer
- * @multiple: Zero if only GPU_FAULT was raised, non-zero if MULTIPLE_GPU_FAULTS
- *            was also set
- *
- * This function is called from the interrupt handler when a GPU fault occurs.
- * It reports the details of the fault using dev_warn().
- */
-static void kbase_report_gpu_fault(struct kbase_device *kbdev, int multiple)
-{
-	u32 status;
-	u64 address;
-
-	status = kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_FAULTSTATUS), NULL);
-	address = (u64) kbase_reg_read(kbdev,
-			GPU_CONTROL_REG(GPU_FAULTADDRESS_HI), NULL) << 32;
-	address |= kbase_reg_read(kbdev,
-			GPU_CONTROL_REG(GPU_FAULTADDRESS_LO), NULL);
-
-	dev_warn(kbdev->dev, "GPU Fault 0x%08x (%s) at 0x%016llx",
-			status & 0xFF,
-			kbase_exception_name(kbdev, status),
-			address);
-	if (multiple)
-		dev_warn(kbdev->dev, "There were multiple GPU faults - some have not been reported\n");
-}
-
-void kbase_gpu_interrupt(struct kbase_device *kbdev, u32 val)
-{
-	KBASE_TRACE_ADD(kbdev, CORE_GPU_IRQ, NULL, NULL, 0u, val);
-	if (val & GPU_FAULT)
-		kbase_report_gpu_fault(kbdev, val & MULTIPLE_GPU_FAULTS);
-
-	if (val & RESET_COMPLETED)
-		kbase_pm_reset_done(kbdev);
-
-	if (val & PRFCNT_SAMPLE_COMPLETED)
-		kbase_instr_hwcnt_sample_done(kbdev);
-
-	if (val & CLEAN_CACHES_COMPLETED)
-		kbase_clean_caches_done(kbdev);
-
-	KBASE_TRACE_ADD(kbdev, CORE_GPU_IRQ_CLEAR, NULL, NULL, 0u, val);
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_IRQ_CLEAR), val, NULL);
-
-	/* kbase_pm_check_transitions must be called after the IRQ has been
-	 * cleared. This is because it might trigger further power transitions
-	 * and we don't want to miss the interrupt raised to notify us that
-	 * these further transitions have finished.
-	 */
-	if (val & POWER_CHANGED_ALL)
-		kbase_pm_power_changed(kbdev);
-
-	KBASE_TRACE_ADD(kbdev, CORE_GPU_IRQ_DONE, NULL, NULL, 0u, val);
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_device_internal.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_device_internal.h
deleted file mode 100644
index 5b20445932fb..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_device_internal.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * Backend-specific HW access device APIs
- */
-
-#ifndef _KBASE_DEVICE_INTERNAL_H_
-#define _KBASE_DEVICE_INTERNAL_H_
-
-/**
- * kbase_reg_write - write to GPU register
- * @kbdev:  Kbase device pointer
- * @offset: Offset of register
- * @value:  Value to write
- * @kctx:   Kbase context pointer. May be NULL
- *
- * Caller must ensure the GPU is powered (@kbdev->pm.gpu_powered != false). If
- * @kctx is not NULL then the caller must ensure it is scheduled (@kctx->as_nr
- * != KBASEP_AS_NR_INVALID).
- */
-void kbase_reg_write(struct kbase_device *kbdev, u16 offset, u32 value,
-						struct kbase_context *kctx);
-
-/**
- * kbase_reg_read - read from GPU register
- * @kbdev:  Kbase device pointer
- * @offset: Offset of register
- * @kctx:   Kbase context pointer. May be NULL
- *
- * Caller must ensure the GPU is powered (@kbdev->pm.gpu_powered != false). If
- * @kctx is not NULL then the caller must ensure it is scheduled (@kctx->as_nr
- * != KBASEP_AS_NR_INVALID).
- *
- * Return: Value in desired register
- */
-u32 kbase_reg_read(struct kbase_device *kbdev, u16 offset,
-						struct kbase_context *kctx);
-
-
-/**
- * kbase_gpu_interrupt - GPU interrupt handler
- * @kbdev: Kbase device pointer
- * @val:   The value of the GPU IRQ status register which triggered the call
- *
- * This function is called from the interrupt handler when a GPU irq is to be
- * handled.
- */
-void kbase_gpu_interrupt(struct kbase_device *kbdev, u32 val);
-
-#endif /* _KBASE_DEVICE_INTERNAL_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_gpu.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_gpu.c
deleted file mode 100644
index a7c3a77d8ac8..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_gpu.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-/*
- * Register-based HW access backend APIs
- */
-#include <mali_kbase.h>
-#include <mali_kbase_hwaccess_backend.h>
-#include <backend/gpu/mali_kbase_irq_internal.h>
-#include <backend/gpu/mali_kbase_jm_internal.h>
-#include <backend/gpu/mali_kbase_js_internal.h>
-#include <backend/gpu/mali_kbase_pm_internal.h>
-
-int kbase_backend_early_init(struct kbase_device *kbdev)
-{
-	int err;
-
-	err = kbasep_platform_device_init(kbdev);
-	if (err)
-		return err;
-
-	/* Ensure we can access the GPU registers */
-	kbase_pm_register_access_enable(kbdev);
-
-	/* Find out GPU properties based on the GPU feature registers */
-	kbase_gpuprops_set(kbdev);
-
-	/* We're done accessing the GPU registers for now. */
-	kbase_pm_register_access_disable(kbdev);
-
-	err = kbase_install_interrupts(kbdev);
-	if (err)
-		goto fail_interrupts;
-
-	err = kbase_hwaccess_pm_init(kbdev);
-	if (err)
-		goto fail_pm;
-
-	return 0;
-
-fail_pm:
-	kbase_release_interrupts(kbdev);
-fail_interrupts:
-	kbasep_platform_device_term(kbdev);
-
-	return err;
-}
-
-void kbase_backend_early_term(struct kbase_device *kbdev)
-{
-	kbase_hwaccess_pm_term(kbdev);
-	kbase_release_interrupts(kbdev);
-	kbasep_platform_device_term(kbdev);
-}
-
-int kbase_backend_late_init(struct kbase_device *kbdev)
-{
-	int err;
-
-	err = kbase_hwaccess_pm_powerup(kbdev, PM_HW_ISSUES_DETECT);
-	if (err)
-		return err;
-
-	err = kbase_backend_timer_init(kbdev);
-	if (err)
-		goto fail_timer;
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-#ifndef CONFIG_MALI_BIFROST_NO_MALI
-	if (kbasep_common_test_interrupt_handlers(kbdev) != 0) {
-		dev_err(kbdev->dev, "Interrupt assigment check failed.\n");
-		err = -EINVAL;
-		goto fail_interrupt_test;
-	}
-#endif /* !CONFIG_MALI_BIFROST_NO_MALI */
-#endif /* CONFIG_MALI_BIFROST_DEBUG */
-
-	err = kbase_job_slot_init(kbdev);
-	if (err)
-		goto fail_job_slot;
-
-	init_waitqueue_head(&kbdev->hwaccess.backend.reset_wait);
-
-	return 0;
-
-fail_job_slot:
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-#ifndef CONFIG_MALI_BIFROST_NO_MALI
-fail_interrupt_test:
-#endif /* !CONFIG_MALI_BIFROST_NO_MALI */
-#endif /* CONFIG_MALI_BIFROST_DEBUG */
-
-	kbase_backend_timer_term(kbdev);
-fail_timer:
-	kbase_hwaccess_pm_halt(kbdev);
-
-	return err;
-}
-
-void kbase_backend_late_term(struct kbase_device *kbdev)
-{
-	kbase_job_slot_halt(kbdev);
-	kbase_job_slot_term(kbdev);
-	kbase_backend_timer_term(kbdev);
-	kbase_hwaccess_pm_halt(kbdev);
-}
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_gpuprops_backend.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_gpuprops_backend.c
deleted file mode 100644
index b395325b556b..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_gpuprops_backend.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * Base kernel property query backend APIs
- */
-
-#include <mali_kbase.h>
-#include <backend/gpu/mali_kbase_device_internal.h>
-#include <backend/gpu/mali_kbase_pm_internal.h>
-#include <mali_kbase_hwaccess_gpuprops.h>
-
-void kbase_backend_gpuprops_get(struct kbase_device *kbdev,
-					struct kbase_gpuprops_regdump *regdump)
-{
-	int i;
-
-	/* Fill regdump with the content of the relevant registers */
-	regdump->gpu_id = kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_ID), NULL);
-
-	regdump->l2_features = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(L2_FEATURES), NULL);
-	regdump->suspend_size = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(SUSPEND_SIZE), NULL);
-	regdump->tiler_features = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(TILER_FEATURES), NULL);
-	regdump->mem_features = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(MEM_FEATURES), NULL);
-	regdump->mmu_features = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(MMU_FEATURES), NULL);
-	regdump->as_present = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(AS_PRESENT), NULL);
-	regdump->js_present = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(JS_PRESENT), NULL);
-
-	for (i = 0; i < GPU_MAX_JOB_SLOTS; i++)
-		regdump->js_features[i] = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(JS_FEATURES_REG(i)), NULL);
-
-	for (i = 0; i < BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS; i++)
-		regdump->texture_features[i] = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(TEXTURE_FEATURES_REG(i)), NULL);
-
-	regdump->thread_max_threads = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(THREAD_MAX_THREADS), NULL);
-	regdump->thread_max_workgroup_size = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(THREAD_MAX_WORKGROUP_SIZE),
-									NULL);
-	regdump->thread_max_barrier_size = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(THREAD_MAX_BARRIER_SIZE), NULL);
-	regdump->thread_features = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(THREAD_FEATURES), NULL);
-
-	regdump->shader_present_lo = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(SHADER_PRESENT_LO), NULL);
-	regdump->shader_present_hi = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(SHADER_PRESENT_HI), NULL);
-
-	regdump->tiler_present_lo = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(TILER_PRESENT_LO), NULL);
-	regdump->tiler_present_hi = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(TILER_PRESENT_HI), NULL);
-
-	regdump->l2_present_lo = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(L2_PRESENT_LO), NULL);
-	regdump->l2_present_hi = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(L2_PRESENT_HI), NULL);
-
-	regdump->stack_present_lo = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(STACK_PRESENT_LO), NULL);
-	regdump->stack_present_hi = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(STACK_PRESENT_HI), NULL);
-}
-
-void kbase_backend_gpuprops_get_features(struct kbase_device *kbdev,
-					struct kbase_gpuprops_regdump *regdump)
-{
-	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_COHERENCY_REG)) {
-		/* Ensure we can access the GPU registers */
-		kbase_pm_register_access_enable(kbdev);
-
-		regdump->coherency_features = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(COHERENCY_FEATURES), NULL);
-
-		/* We're done accessing the GPU registers for now. */
-		kbase_pm_register_access_disable(kbdev);
-	} else {
-		/* Pre COHERENCY_FEATURES we only supported ACE_LITE */
-		regdump->coherency_features =
-				COHERENCY_FEATURE_BIT(COHERENCY_NONE) |
-				COHERENCY_FEATURE_BIT(COHERENCY_ACE_LITE);
-	}
-}
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_instr_backend.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_instr_backend.c
deleted file mode 100644
index 8084d054cc5b..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_instr_backend.c
+++ /dev/null
@@ -1,492 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * GPU backend instrumentation APIs.
- */
-
-#include <mali_kbase.h>
-#include <mali_midg_regmap.h>
-#include <mali_kbase_hwaccess_instr.h>
-#include <backend/gpu/mali_kbase_device_internal.h>
-#include <backend/gpu/mali_kbase_pm_internal.h>
-#include <backend/gpu/mali_kbase_instr_internal.h>
-
-/**
- * kbasep_instr_hwcnt_cacheclean - Issue Cache Clean & Invalidate command to
- * hardware
- *
- * @kbdev: Kbase device
- */
-static void kbasep_instr_hwcnt_cacheclean(struct kbase_device *kbdev)
-{
-	unsigned long flags;
-	unsigned long pm_flags;
-	u32 irq_mask;
-
-	spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
-	KBASE_DEBUG_ASSERT(kbdev->hwcnt.backend.state ==
-					KBASE_INSTR_STATE_REQUEST_CLEAN);
-
-	/* Enable interrupt */
-	spin_lock_irqsave(&kbdev->hwaccess_lock, pm_flags);
-	irq_mask = kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_IRQ_MASK), NULL);
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_IRQ_MASK),
-				irq_mask | CLEAN_CACHES_COMPLETED, NULL);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, pm_flags);
-
-	/* clean&invalidate the caches so we're sure the mmu tables for the dump
-	 * buffer is valid */
-	KBASE_TRACE_ADD(kbdev, CORE_GPU_CLEAN_INV_CACHES, NULL, NULL, 0u, 0);
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
-					GPU_COMMAND_CLEAN_INV_CACHES, NULL);
-	kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_CLEANING;
-
-	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-}
-
-int kbase_instr_hwcnt_enable_internal(struct kbase_device *kbdev,
-					struct kbase_context *kctx,
-					struct kbase_uk_hwcnt_setup *setup)
-{
-	unsigned long flags, pm_flags;
-	int err = -EINVAL;
-	u32 irq_mask;
-	int ret;
-	u64 shader_cores_needed;
-	u32 prfcnt_config;
-
-	shader_cores_needed = kbase_pm_get_present_cores(kbdev,
-							KBASE_PM_CORE_SHADER);
-
-	/* alignment failure */
-	if ((setup->dump_buffer == 0ULL) || (setup->dump_buffer & (2048 - 1)))
-		goto out_err;
-
-	/* Override core availability policy to ensure all cores are available
-	 */
-	kbase_pm_ca_instr_enable(kbdev);
-
-	/* Request the cores early on synchronously - we'll release them on any
-	 * errors (e.g. instrumentation already active) */
-	kbase_pm_request_cores_sync(kbdev, true, shader_cores_needed);
-
-	spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
-
-	if (kbdev->hwcnt.backend.state != KBASE_INSTR_STATE_DISABLED) {
-		/* Instrumentation is already enabled */
-		spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-		goto out_unrequest_cores;
-	}
-
-	/* Enable interrupt */
-	spin_lock_irqsave(&kbdev->hwaccess_lock, pm_flags);
-	irq_mask = kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_IRQ_MASK), NULL);
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_IRQ_MASK), irq_mask |
-						PRFCNT_SAMPLE_COMPLETED, NULL);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, pm_flags);
-
-	/* In use, this context is the owner */
-	kbdev->hwcnt.kctx = kctx;
-	/* Remember the dump address so we can reprogram it later */
-	kbdev->hwcnt.addr = setup->dump_buffer;
-
-	/* Request the clean */
-	kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_REQUEST_CLEAN;
-	kbdev->hwcnt.backend.triggered = 0;
-	/* Clean&invalidate the caches so we're sure the mmu tables for the dump
-	 * buffer is valid */
-	ret = queue_work(kbdev->hwcnt.backend.cache_clean_wq,
-					&kbdev->hwcnt.backend.cache_clean_work);
-	KBASE_DEBUG_ASSERT(ret);
-
-	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-
-	/* Wait for cacheclean to complete */
-	wait_event(kbdev->hwcnt.backend.wait,
-					kbdev->hwcnt.backend.triggered != 0);
-
-	KBASE_DEBUG_ASSERT(kbdev->hwcnt.backend.state ==
-							KBASE_INSTR_STATE_IDLE);
-
-	kbase_pm_request_l2_caches(kbdev);
-
-	/* Configure */
-	prfcnt_config = kctx->as_nr << PRFCNT_CONFIG_AS_SHIFT;
-#ifdef CONFIG_MALI_BIFROST_PRFCNT_SET_SECONDARY
-	{
-		u32 gpu_id = kbdev->gpu_props.props.raw_props.gpu_id;
-		u32 product_id = (gpu_id & GPU_ID_VERSION_PRODUCT_ID)
-			>> GPU_ID_VERSION_PRODUCT_ID_SHIFT;
-		int arch_v6 = GPU_ID_IS_NEW_FORMAT(product_id);
-
-		if (arch_v6)
-			prfcnt_config |= 1 << PRFCNT_CONFIG_SETSELECT_SHIFT;
-	}
-#endif
-
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_CONFIG),
-			prfcnt_config | PRFCNT_CONFIG_MODE_OFF, kctx);
-
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_BASE_LO),
-					setup->dump_buffer & 0xFFFFFFFF, kctx);
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_BASE_HI),
-					setup->dump_buffer >> 32,        kctx);
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_JM_EN),
-					setup->jm_bm,                    kctx);
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_SHADER_EN),
-					setup->shader_bm,                kctx);
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_MMU_L2_EN),
-					setup->mmu_l2_bm,                kctx);
-	/* Due to PRLAM-8186 we need to disable the Tiler before we enable the
-	 * HW counter dump. */
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8186))
-		kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_TILER_EN), 0,
-									kctx);
-	else
-		kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_TILER_EN),
-							setup->tiler_bm, kctx);
-
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_CONFIG),
-			prfcnt_config | PRFCNT_CONFIG_MODE_MANUAL, kctx);
-
-	/* If HW has PRLAM-8186 we can now re-enable the tiler HW counters dump
-	 */
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8186))
-		kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_TILER_EN),
-							setup->tiler_bm, kctx);
-
-	spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
-
-	kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_IDLE;
-	kbdev->hwcnt.backend.triggered = 1;
-	wake_up(&kbdev->hwcnt.backend.wait);
-
-	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-
-	err = 0;
-
-	dev_dbg(kbdev->dev, "HW counters dumping set-up for context %p", kctx);
-	return err;
- out_unrequest_cores:
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	kbase_pm_unrequest_cores(kbdev, true, shader_cores_needed);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
- out_err:
-	return err;
-}
-
-int kbase_instr_hwcnt_disable_internal(struct kbase_context *kctx)
-{
-	unsigned long flags, pm_flags;
-	int err = -EINVAL;
-	u32 irq_mask;
-	struct kbase_device *kbdev = kctx->kbdev;
-
-	while (1) {
-		spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
-
-		if (kbdev->hwcnt.backend.state == KBASE_INSTR_STATE_DISABLED) {
-			/* Instrumentation is not enabled */
-			spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-			goto out;
-		}
-
-		if (kbdev->hwcnt.kctx != kctx) {
-			/* Instrumentation has been setup for another context */
-			spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-			goto out;
-		}
-
-		if (kbdev->hwcnt.backend.state == KBASE_INSTR_STATE_IDLE)
-			break;
-
-		spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-
-		/* Ongoing dump/setup - wait for its completion */
-		wait_event(kbdev->hwcnt.backend.wait,
-					kbdev->hwcnt.backend.triggered != 0);
-	}
-
-	kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_DISABLED;
-	kbdev->hwcnt.backend.triggered = 0;
-
-	/* Disable interrupt */
-	spin_lock_irqsave(&kbdev->hwaccess_lock, pm_flags);
-	irq_mask = kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_IRQ_MASK), NULL);
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_IRQ_MASK),
-				irq_mask & ~PRFCNT_SAMPLE_COMPLETED, NULL);
-
-	/* Disable the counters */
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_CONFIG), 0, kctx);
-
-	kbdev->hwcnt.kctx = NULL;
-	kbdev->hwcnt.addr = 0ULL;
-
-	kbase_pm_ca_instr_disable(kbdev);
-
-	kbase_pm_unrequest_cores(kbdev, true,
-		kbase_pm_get_present_cores(kbdev, KBASE_PM_CORE_SHADER));
-
-	kbase_pm_release_l2_caches(kbdev);
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, pm_flags);
-	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-
-	dev_dbg(kbdev->dev, "HW counters dumping disabled for context %p",
-									kctx);
-
-	err = 0;
-
- out:
-	return err;
-}
-
-int kbase_instr_hwcnt_request_dump(struct kbase_context *kctx)
-{
-	unsigned long flags;
-	int err = -EINVAL;
-	struct kbase_device *kbdev = kctx->kbdev;
-
-	spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
-
-	if (kbdev->hwcnt.kctx != kctx) {
-		/* The instrumentation has been setup for another context */
-		goto unlock;
-	}
-
-	if (kbdev->hwcnt.backend.state != KBASE_INSTR_STATE_IDLE) {
-		/* HW counters are disabled or another dump is ongoing, or we're
-		 * resetting */
-		goto unlock;
-	}
-
-	kbdev->hwcnt.backend.triggered = 0;
-
-	/* Mark that we're dumping - the PF handler can signal that we faulted
-	 */
-	kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_DUMPING;
-
-	/* Reconfigure the dump address */
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_BASE_LO),
-					kbdev->hwcnt.addr & 0xFFFFFFFF, NULL);
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(PRFCNT_BASE_HI),
-					kbdev->hwcnt.addr >> 32, NULL);
-
-	/* Start dumping */
-	KBASE_TRACE_ADD(kbdev, CORE_GPU_PRFCNT_SAMPLE, NULL, NULL,
-					kbdev->hwcnt.addr, 0);
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
-					GPU_COMMAND_PRFCNT_SAMPLE, kctx);
-
-	dev_dbg(kbdev->dev, "HW counters dumping done for context %p", kctx);
-
-	err = 0;
-
- unlock:
-	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-	return err;
-}
-KBASE_EXPORT_SYMBOL(kbase_instr_hwcnt_request_dump);
-
-bool kbase_instr_hwcnt_dump_complete(struct kbase_context *kctx,
-						bool * const success)
-{
-	unsigned long flags;
-	bool complete = false;
-	struct kbase_device *kbdev = kctx->kbdev;
-
-	spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
-
-	if (kbdev->hwcnt.backend.state == KBASE_INSTR_STATE_IDLE) {
-		*success = true;
-		complete = true;
-	} else if (kbdev->hwcnt.backend.state == KBASE_INSTR_STATE_FAULT) {
-		*success = false;
-		complete = true;
-		kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_IDLE;
-	}
-
-	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-
-	return complete;
-}
-KBASE_EXPORT_SYMBOL(kbase_instr_hwcnt_dump_complete);
-
-void kbasep_cache_clean_worker(struct work_struct *data)
-{
-	struct kbase_device *kbdev;
-	unsigned long flags;
-
-	kbdev = container_of(data, struct kbase_device,
-						hwcnt.backend.cache_clean_work);
-
-	mutex_lock(&kbdev->cacheclean_lock);
-	kbasep_instr_hwcnt_cacheclean(kbdev);
-
-	spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
-	/* Wait for our condition, and any reset to complete */
-	while (kbdev->hwcnt.backend.state == KBASE_INSTR_STATE_CLEANING) {
-		spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-		wait_event(kbdev->hwcnt.backend.cache_clean_wait,
-				kbdev->hwcnt.backend.state !=
-						KBASE_INSTR_STATE_CLEANING);
-		spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
-	}
-	KBASE_DEBUG_ASSERT(kbdev->hwcnt.backend.state ==
-						KBASE_INSTR_STATE_CLEANED);
-
-	/* All finished and idle */
-	kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_IDLE;
-	kbdev->hwcnt.backend.triggered = 1;
-	wake_up(&kbdev->hwcnt.backend.wait);
-
-	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-	mutex_unlock(&kbdev->cacheclean_lock);
-}
-
-void kbase_instr_hwcnt_sample_done(struct kbase_device *kbdev)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
-
-	if (kbdev->hwcnt.backend.state == KBASE_INSTR_STATE_FAULT) {
-		kbdev->hwcnt.backend.triggered = 1;
-		wake_up(&kbdev->hwcnt.backend.wait);
-	} else if (kbdev->hwcnt.backend.state == KBASE_INSTR_STATE_DUMPING) {
-		int ret;
-		/* Always clean and invalidate the cache after a successful dump
-		 */
-		kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_REQUEST_CLEAN;
-		ret = queue_work(kbdev->hwcnt.backend.cache_clean_wq,
-					&kbdev->hwcnt.backend.cache_clean_work);
-		KBASE_DEBUG_ASSERT(ret);
-	}
-
-	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-}
-
-void kbase_clean_caches_done(struct kbase_device *kbdev)
-{
-	u32 irq_mask;
-
-	if (kbdev->hwcnt.backend.state != KBASE_INSTR_STATE_DISABLED) {
-		unsigned long flags;
-		unsigned long pm_flags;
-
-		spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
-		/* Disable interrupt */
-		spin_lock_irqsave(&kbdev->hwaccess_lock, pm_flags);
-		irq_mask = kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_IRQ_MASK),
-									NULL);
-		kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_IRQ_MASK),
-				irq_mask & ~CLEAN_CACHES_COMPLETED, NULL);
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, pm_flags);
-
-		/* Wakeup... */
-		if (kbdev->hwcnt.backend.state == KBASE_INSTR_STATE_CLEANING) {
-			/* Only wake if we weren't resetting */
-			kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_CLEANED;
-			wake_up(&kbdev->hwcnt.backend.cache_clean_wait);
-		}
-
-		spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-	}
-}
-
-int kbase_instr_hwcnt_wait_for_dump(struct kbase_context *kctx)
-{
-	struct kbase_device *kbdev = kctx->kbdev;
-	unsigned long flags;
-	int err;
-
-	/* Wait for dump & cacheclean to complete */
-	wait_event(kbdev->hwcnt.backend.wait,
-					kbdev->hwcnt.backend.triggered != 0);
-
-	spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
-
-	if (kbdev->hwcnt.backend.state == KBASE_INSTR_STATE_FAULT) {
-		err = -EINVAL;
-		kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_IDLE;
-	} else {
-		/* Dump done */
-		KBASE_DEBUG_ASSERT(kbdev->hwcnt.backend.state ==
-							KBASE_INSTR_STATE_IDLE);
-		err = 0;
-	}
-
-	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-
-	return err;
-}
-
-int kbase_instr_hwcnt_clear(struct kbase_context *kctx)
-{
-	unsigned long flags;
-	int err = -EINVAL;
-	struct kbase_device *kbdev = kctx->kbdev;
-
-	spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
-
-	/* Check it's the context previously set up and we're not already
-	 * dumping */
-	if (kbdev->hwcnt.kctx != kctx || kbdev->hwcnt.backend.state !=
-							KBASE_INSTR_STATE_IDLE)
-		goto out;
-
-	/* Clear the counters */
-	KBASE_TRACE_ADD(kbdev, CORE_GPU_PRFCNT_CLEAR, NULL, NULL, 0u, 0);
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
-						GPU_COMMAND_PRFCNT_CLEAR, kctx);
-
-	err = 0;
-
-out:
-	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-	return err;
-}
-KBASE_EXPORT_SYMBOL(kbase_instr_hwcnt_clear);
-
-int kbase_instr_backend_init(struct kbase_device *kbdev)
-{
-	int ret = 0;
-
-	kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_DISABLED;
-
-	init_waitqueue_head(&kbdev->hwcnt.backend.wait);
-	init_waitqueue_head(&kbdev->hwcnt.backend.cache_clean_wait);
-	INIT_WORK(&kbdev->hwcnt.backend.cache_clean_work,
-						kbasep_cache_clean_worker);
-	kbdev->hwcnt.backend.triggered = 0;
-
-	kbdev->hwcnt.backend.cache_clean_wq =
-			alloc_workqueue("Mali cache cleaning workqueue", 0, 1);
-	if (NULL == kbdev->hwcnt.backend.cache_clean_wq)
-		ret = -EINVAL;
-
-	return ret;
-}
-
-void kbase_instr_backend_term(struct kbase_device *kbdev)
-{
-	destroy_workqueue(kbdev->hwcnt.backend.cache_clean_wq);
-}
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_instr_defs.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_instr_defs.h
deleted file mode 100644
index 4794672da8f0..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_instr_defs.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014, 2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * Backend-specific instrumentation definitions
- */
-
-#ifndef _KBASE_INSTR_DEFS_H_
-#define _KBASE_INSTR_DEFS_H_
-
-/*
- * Instrumentation State Machine States
- */
-enum kbase_instr_state {
-	/* State where instrumentation is not active */
-	KBASE_INSTR_STATE_DISABLED = 0,
-	/* State machine is active and ready for a command. */
-	KBASE_INSTR_STATE_IDLE,
-	/* Hardware is currently dumping a frame. */
-	KBASE_INSTR_STATE_DUMPING,
-	/* We've requested a clean to occur on a workqueue */
-	KBASE_INSTR_STATE_REQUEST_CLEAN,
-	/* Hardware is currently cleaning and invalidating caches. */
-	KBASE_INSTR_STATE_CLEANING,
-	/* Cache clean completed, and either a) a dump is complete, or
-	 * b) instrumentation can now be setup. */
-	KBASE_INSTR_STATE_CLEANED,
-	/* An error has occured during DUMPING (page fault). */
-	KBASE_INSTR_STATE_FAULT
-};
-
-/* Structure used for instrumentation and HW counters dumping */
-struct kbase_instr_backend {
-	wait_queue_head_t wait;
-	int triggered;
-
-	enum kbase_instr_state state;
-	wait_queue_head_t cache_clean_wait;
-	struct workqueue_struct *cache_clean_wq;
-	struct work_struct  cache_clean_work;
-};
-
-#endif /* _KBASE_INSTR_DEFS_H_ */
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_instr_internal.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_instr_internal.h
deleted file mode 100644
index e96aeae786e1..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_instr_internal.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * Backend-specific HW access instrumentation APIs
- */
-
-#ifndef _KBASE_INSTR_INTERNAL_H_
-#define _KBASE_INSTR_INTERNAL_H_
-
-/**
- * kbasep_cache_clean_worker() - Workqueue for handling cache cleaning
- * @data: a &struct work_struct
- */
-void kbasep_cache_clean_worker(struct work_struct *data);
-
-/**
- * kbase_clean_caches_done() - Cache clean interrupt received
- * @kbdev: Kbase device
- */
-void kbase_clean_caches_done(struct kbase_device *kbdev);
-
-/**
- * kbase_instr_hwcnt_sample_done() - Dump complete interrupt received
- * @kbdev: Kbase device
- */
-void kbase_instr_hwcnt_sample_done(struct kbase_device *kbdev);
-
-#endif /* _KBASE_INSTR_INTERNAL_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_irq_internal.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_irq_internal.h
deleted file mode 100644
index 8781561e73d0..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_irq_internal.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * Backend specific IRQ APIs
- */
-
-#ifndef _KBASE_IRQ_INTERNAL_H_
-#define _KBASE_IRQ_INTERNAL_H_
-
-int kbase_install_interrupts(struct kbase_device *kbdev);
-
-void kbase_release_interrupts(struct kbase_device *kbdev);
-
-/**
- * kbase_synchronize_irqs - Ensure that all IRQ handlers have completed
- *                          execution
- * @kbdev: The kbase device
- */
-void kbase_synchronize_irqs(struct kbase_device *kbdev);
-
-int kbasep_common_test_interrupt_handlers(
-					struct kbase_device * const kbdev);
-
-#endif /* _KBASE_IRQ_INTERNAL_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_irq_linux.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_irq_linux.c
deleted file mode 100644
index d0666c86cf59..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_irq_linux.c
+++ /dev/null
@@ -1,469 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <mali_kbase.h>
-#include <backend/gpu/mali_kbase_device_internal.h>
-#include <backend/gpu/mali_kbase_irq_internal.h>
-
-#include <linux/interrupt.h>
-
-#if !defined(CONFIG_MALI_BIFROST_NO_MALI)
-
-/* GPU IRQ Tags */
-#define	JOB_IRQ_TAG	0
-#define MMU_IRQ_TAG	1
-#define GPU_IRQ_TAG	2
-
-static void *kbase_tag(void *ptr, u32 tag)
-{
-	return (void *)(((uintptr_t) ptr) | tag);
-}
-
-static void *kbase_untag(void *ptr)
-{
-	return (void *)(((uintptr_t) ptr) & ~3);
-}
-
-static irqreturn_t kbase_job_irq_handler(int irq, void *data)
-{
-	unsigned long flags;
-	struct kbase_device *kbdev = kbase_untag(data);
-	u32 val;
-
-	spin_lock_irqsave(&kbdev->pm.backend.gpu_powered_lock, flags);
-
-	if (!kbdev->pm.backend.gpu_powered) {
-		/* GPU is turned off - IRQ is not for us */
-		spin_unlock_irqrestore(&kbdev->pm.backend.gpu_powered_lock,
-									flags);
-		return IRQ_NONE;
-	}
-
-	val = kbase_reg_read(kbdev, JOB_CONTROL_REG(JOB_IRQ_STATUS), NULL);
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-	if (!kbdev->pm.backend.driver_ready_for_irqs)
-		dev_warn(kbdev->dev, "%s: irq %d irqstatus 0x%x before driver is ready\n",
-				__func__, irq, val);
-#endif /* CONFIG_MALI_BIFROST_DEBUG */
-	spin_unlock_irqrestore(&kbdev->pm.backend.gpu_powered_lock, flags);
-
-	if (!val)
-		return IRQ_NONE;
-
-	dev_dbg(kbdev->dev, "%s: irq %d irqstatus 0x%x\n", __func__, irq, val);
-
-	kbase_job_done(kbdev, val);
-
-	return IRQ_HANDLED;
-}
-
-KBASE_EXPORT_TEST_API(kbase_job_irq_handler);
-
-static irqreturn_t kbase_mmu_irq_handler(int irq, void *data)
-{
-	unsigned long flags;
-	struct kbase_device *kbdev = kbase_untag(data);
-	u32 val;
-
-	spin_lock_irqsave(&kbdev->pm.backend.gpu_powered_lock, flags);
-
-	if (!kbdev->pm.backend.gpu_powered) {
-		/* GPU is turned off - IRQ is not for us */
-		spin_unlock_irqrestore(&kbdev->pm.backend.gpu_powered_lock,
-									flags);
-		return IRQ_NONE;
-	}
-
-	atomic_inc(&kbdev->faults_pending);
-
-	val = kbase_reg_read(kbdev, MMU_REG(MMU_IRQ_STATUS), NULL);
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-	if (!kbdev->pm.backend.driver_ready_for_irqs)
-		dev_warn(kbdev->dev, "%s: irq %d irqstatus 0x%x before driver is ready\n",
-				__func__, irq, val);
-#endif /* CONFIG_MALI_BIFROST_DEBUG */
-	spin_unlock_irqrestore(&kbdev->pm.backend.gpu_powered_lock, flags);
-
-	if (!val) {
-		atomic_dec(&kbdev->faults_pending);
-		return IRQ_NONE;
-	}
-
-	dev_dbg(kbdev->dev, "%s: irq %d irqstatus 0x%x\n", __func__, irq, val);
-
-	kbase_mmu_interrupt(kbdev, val);
-
-	atomic_dec(&kbdev->faults_pending);
-
-	return IRQ_HANDLED;
-}
-
-static irqreturn_t kbase_gpu_irq_handler(int irq, void *data)
-{
-	unsigned long flags;
-	struct kbase_device *kbdev = kbase_untag(data);
-	u32 val;
-
-	spin_lock_irqsave(&kbdev->pm.backend.gpu_powered_lock, flags);
-
-	if (!kbdev->pm.backend.gpu_powered) {
-		/* GPU is turned off - IRQ is not for us */
-		spin_unlock_irqrestore(&kbdev->pm.backend.gpu_powered_lock,
-									flags);
-		return IRQ_NONE;
-	}
-
-	val = kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_IRQ_STATUS), NULL);
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-	if (!kbdev->pm.backend.driver_ready_for_irqs)
-		dev_dbg(kbdev->dev, "%s: irq %d irqstatus 0x%x before driver is ready\n",
-				__func__, irq, val);
-#endif /* CONFIG_MALI_BIFROST_DEBUG */
-	spin_unlock_irqrestore(&kbdev->pm.backend.gpu_powered_lock, flags);
-
-	if (!val)
-		return IRQ_NONE;
-
-	dev_dbg(kbdev->dev, "%s: irq %d irqstatus 0x%x\n", __func__, irq, val);
-
-	kbase_gpu_interrupt(kbdev, val);
-
-	return IRQ_HANDLED;
-}
-
-KBASE_EXPORT_TEST_API(kbase_gpu_irq_handler);
-
-static irq_handler_t kbase_handler_table[] = {
-	[JOB_IRQ_TAG] = kbase_job_irq_handler,
-	[MMU_IRQ_TAG] = kbase_mmu_irq_handler,
-	[GPU_IRQ_TAG] = kbase_gpu_irq_handler,
-};
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-#define  JOB_IRQ_HANDLER JOB_IRQ_TAG
-#define  MMU_IRQ_HANDLER MMU_IRQ_TAG
-#define  GPU_IRQ_HANDLER GPU_IRQ_TAG
-
-/**
- * kbase_set_custom_irq_handler - Set a custom IRQ handler
- * @kbdev: Device for which the handler is to be registered
- * @custom_handler: Handler to be registered
- * @irq_type: Interrupt type
- *
- * Registers given interrupt handler for requested interrupt type
- * In the case where irq handler is not specified, the default handler shall be
- * registered
- *
- * Return: 0 case success, error code otherwise
- */
-int kbase_set_custom_irq_handler(struct kbase_device *kbdev,
-					irq_handler_t custom_handler,
-					int irq_type)
-{
-	int result = 0;
-	irq_handler_t requested_irq_handler = NULL;
-
-	KBASE_DEBUG_ASSERT((JOB_IRQ_HANDLER <= irq_type) &&
-						(GPU_IRQ_HANDLER >= irq_type));
-
-	/* Release previous handler */
-	if (kbdev->irqs[irq_type].irq)
-		free_irq(kbdev->irqs[irq_type].irq, kbase_tag(kbdev, irq_type));
-
-	requested_irq_handler = (NULL != custom_handler) ? custom_handler :
-						kbase_handler_table[irq_type];
-
-	if (0 != request_irq(kbdev->irqs[irq_type].irq,
-			requested_irq_handler,
-			kbdev->irqs[irq_type].flags | IRQF_SHARED,
-			dev_name(kbdev->dev), kbase_tag(kbdev, irq_type))) {
-		result = -EINVAL;
-		dev_err(kbdev->dev, "Can't request interrupt %d (index %d)\n",
-					kbdev->irqs[irq_type].irq, irq_type);
-#ifdef CONFIG_SPARSE_IRQ
-		dev_err(kbdev->dev, "You have CONFIG_SPARSE_IRQ support enabled - is the interrupt number correct for this configuration?\n");
-#endif /* CONFIG_SPARSE_IRQ */
-	}
-
-	return result;
-}
-
-KBASE_EXPORT_TEST_API(kbase_set_custom_irq_handler);
-
-/* test correct interrupt assigment and reception by cpu */
-struct kbasep_irq_test {
-	struct hrtimer timer;
-	wait_queue_head_t wait;
-	int triggered;
-	u32 timeout;
-};
-
-static struct kbasep_irq_test kbasep_irq_test_data;
-
-#define IRQ_TEST_TIMEOUT    500
-
-static irqreturn_t kbase_job_irq_test_handler(int irq, void *data)
-{
-	unsigned long flags;
-	struct kbase_device *kbdev = kbase_untag(data);
-	u32 val;
-
-	spin_lock_irqsave(&kbdev->pm.backend.gpu_powered_lock, flags);
-
-	if (!kbdev->pm.backend.gpu_powered) {
-		/* GPU is turned off - IRQ is not for us */
-		spin_unlock_irqrestore(&kbdev->pm.backend.gpu_powered_lock,
-									flags);
-		return IRQ_NONE;
-	}
-
-	val = kbase_reg_read(kbdev, JOB_CONTROL_REG(JOB_IRQ_STATUS), NULL);
-
-	spin_unlock_irqrestore(&kbdev->pm.backend.gpu_powered_lock, flags);
-
-	if (!val)
-		return IRQ_NONE;
-
-	dev_dbg(kbdev->dev, "%s: irq %d irqstatus 0x%x\n", __func__, irq, val);
-
-	kbasep_irq_test_data.triggered = 1;
-	wake_up(&kbasep_irq_test_data.wait);
-
-	kbase_reg_write(kbdev, JOB_CONTROL_REG(JOB_IRQ_CLEAR), val, NULL);
-
-	return IRQ_HANDLED;
-}
-
-static irqreturn_t kbase_mmu_irq_test_handler(int irq, void *data)
-{
-	unsigned long flags;
-	struct kbase_device *kbdev = kbase_untag(data);
-	u32 val;
-
-	spin_lock_irqsave(&kbdev->pm.backend.gpu_powered_lock, flags);
-
-	if (!kbdev->pm.backend.gpu_powered) {
-		/* GPU is turned off - IRQ is not for us */
-		spin_unlock_irqrestore(&kbdev->pm.backend.gpu_powered_lock,
-									flags);
-		return IRQ_NONE;
-	}
-
-	val = kbase_reg_read(kbdev, MMU_REG(MMU_IRQ_STATUS), NULL);
-
-	spin_unlock_irqrestore(&kbdev->pm.backend.gpu_powered_lock, flags);
-
-	if (!val)
-		return IRQ_NONE;
-
-	dev_dbg(kbdev->dev, "%s: irq %d irqstatus 0x%x\n", __func__, irq, val);
-
-	kbasep_irq_test_data.triggered = 1;
-	wake_up(&kbasep_irq_test_data.wait);
-
-	kbase_reg_write(kbdev, MMU_REG(MMU_IRQ_CLEAR), val, NULL);
-
-	return IRQ_HANDLED;
-}
-
-static enum hrtimer_restart kbasep_test_interrupt_timeout(struct hrtimer *timer)
-{
-	struct kbasep_irq_test *test_data = container_of(timer,
-						struct kbasep_irq_test, timer);
-
-	test_data->timeout = 1;
-	test_data->triggered = 1;
-	wake_up(&test_data->wait);
-	return HRTIMER_NORESTART;
-}
-
-static int kbasep_common_test_interrupt(
-				struct kbase_device * const kbdev, u32 tag)
-{
-	int err = 0;
-	irq_handler_t test_handler;
-
-	u32 old_mask_val;
-	u16 mask_offset;
-	u16 rawstat_offset;
-
-	switch (tag) {
-	case JOB_IRQ_TAG:
-		test_handler = kbase_job_irq_test_handler;
-		rawstat_offset = JOB_CONTROL_REG(JOB_IRQ_RAWSTAT);
-		mask_offset = JOB_CONTROL_REG(JOB_IRQ_MASK);
-		break;
-	case MMU_IRQ_TAG:
-		test_handler = kbase_mmu_irq_test_handler;
-		rawstat_offset = MMU_REG(MMU_IRQ_RAWSTAT);
-		mask_offset = MMU_REG(MMU_IRQ_MASK);
-		break;
-	case GPU_IRQ_TAG:
-		/* already tested by pm_driver - bail out */
-	default:
-		return 0;
-	}
-
-	/* store old mask */
-	old_mask_val = kbase_reg_read(kbdev, mask_offset, NULL);
-	/* mask interrupts */
-	kbase_reg_write(kbdev, mask_offset, 0x0, NULL);
-
-	if (kbdev->irqs[tag].irq) {
-		/* release original handler and install test handler */
-		if (kbase_set_custom_irq_handler(kbdev, test_handler, tag) != 0) {
-			err = -EINVAL;
-		} else {
-			kbasep_irq_test_data.timeout = 0;
-			hrtimer_init(&kbasep_irq_test_data.timer,
-					CLOCK_MONOTONIC, HRTIMER_MODE_REL);
-			kbasep_irq_test_data.timer.function =
-						kbasep_test_interrupt_timeout;
-
-			/* trigger interrupt */
-			kbase_reg_write(kbdev, mask_offset, 0x1, NULL);
-			kbase_reg_write(kbdev, rawstat_offset, 0x1, NULL);
-
-			hrtimer_start(&kbasep_irq_test_data.timer,
-					HR_TIMER_DELAY_MSEC(IRQ_TEST_TIMEOUT),
-					HRTIMER_MODE_REL);
-
-			wait_event(kbasep_irq_test_data.wait,
-					kbasep_irq_test_data.triggered != 0);
-
-			if (kbasep_irq_test_data.timeout != 0) {
-				dev_err(kbdev->dev, "Interrupt %d (index %d) didn't reach CPU.\n",
-						kbdev->irqs[tag].irq, tag);
-				err = -EINVAL;
-			} else {
-				dev_dbg(kbdev->dev, "Interrupt %d (index %d) reached CPU.\n",
-						kbdev->irqs[tag].irq, tag);
-			}
-
-			hrtimer_cancel(&kbasep_irq_test_data.timer);
-			kbasep_irq_test_data.triggered = 0;
-
-			/* mask interrupts */
-			kbase_reg_write(kbdev, mask_offset, 0x0, NULL);
-
-			/* release test handler */
-			free_irq(kbdev->irqs[tag].irq, kbase_tag(kbdev, tag));
-		}
-
-		/* restore original interrupt */
-		if (request_irq(kbdev->irqs[tag].irq, kbase_handler_table[tag],
-				kbdev->irqs[tag].flags | IRQF_SHARED,
-				dev_name(kbdev->dev), kbase_tag(kbdev, tag))) {
-			dev_err(kbdev->dev, "Can't restore original interrupt %d (index %d)\n",
-						kbdev->irqs[tag].irq, tag);
-			err = -EINVAL;
-		}
-	}
-	/* restore old mask */
-	kbase_reg_write(kbdev, mask_offset, old_mask_val, NULL);
-
-	return err;
-}
-
-int kbasep_common_test_interrupt_handlers(
-					struct kbase_device * const kbdev)
-{
-	int err;
-
-	init_waitqueue_head(&kbasep_irq_test_data.wait);
-	kbasep_irq_test_data.triggered = 0;
-
-	/* A suspend won't happen during startup/insmod */
-	kbase_pm_context_active(kbdev);
-
-	err = kbasep_common_test_interrupt(kbdev, JOB_IRQ_TAG);
-	if (err) {
-		dev_err(kbdev->dev, "Interrupt JOB_IRQ didn't reach CPU. Check interrupt assignments.\n");
-		goto out;
-	}
-
-	err = kbasep_common_test_interrupt(kbdev, MMU_IRQ_TAG);
-	if (err) {
-		dev_err(kbdev->dev, "Interrupt MMU_IRQ didn't reach CPU. Check interrupt assignments.\n");
-		goto out;
-	}
-
-	dev_dbg(kbdev->dev, "Interrupts are correctly assigned.\n");
-
- out:
-	kbase_pm_context_idle(kbdev);
-
-	return err;
-}
-#endif /* CONFIG_MALI_BIFROST_DEBUG */
-
-int kbase_install_interrupts(struct kbase_device *kbdev)
-{
-	u32 nr = ARRAY_SIZE(kbase_handler_table);
-	int err;
-	u32 i;
-
-	for (i = 0; i < nr; i++) {
-		err = request_irq(kbdev->irqs[i].irq, kbase_handler_table[i],
-				kbdev->irqs[i].flags | IRQF_SHARED,
-				dev_name(kbdev->dev),
-				kbase_tag(kbdev, i));
-		if (err) {
-			dev_err(kbdev->dev, "Can't request interrupt %d (index %d)\n",
-							kbdev->irqs[i].irq, i);
-#ifdef CONFIG_SPARSE_IRQ
-			dev_err(kbdev->dev, "You have CONFIG_SPARSE_IRQ support enabled - is the interrupt number correct for this configuration?\n");
-#endif /* CONFIG_SPARSE_IRQ */
-			goto release;
-		}
-	}
-
-	return 0;
-
- release:
-	while (i-- > 0)
-		free_irq(kbdev->irqs[i].irq, kbase_tag(kbdev, i));
-
-	return err;
-}
-
-void kbase_release_interrupts(struct kbase_device *kbdev)
-{
-	u32 nr = ARRAY_SIZE(kbase_handler_table);
-	u32 i;
-
-	for (i = 0; i < nr; i++) {
-		if (kbdev->irqs[i].irq)
-			free_irq(kbdev->irqs[i].irq, kbase_tag(kbdev, i));
-	}
-}
-
-void kbase_synchronize_irqs(struct kbase_device *kbdev)
-{
-	u32 nr = ARRAY_SIZE(kbase_handler_table);
-	u32 i;
-
-	for (i = 0; i < nr; i++) {
-		if (kbdev->irqs[i].irq)
-			synchronize_irq(kbdev->irqs[i].irq);
-	}
-}
-
-#endif /* !defined(CONFIG_MALI_BIFROST_NO_MALI) */
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_as.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_as.c
deleted file mode 100644
index c660c80341f4..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_as.c
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-/*
- * Register backend context / address space management
- */
-
-#include <mali_kbase.h>
-#include <mali_kbase_hwaccess_jm.h>
-#include <mali_kbase_ctx_sched.h>
-
-/**
- * assign_and_activate_kctx_addr_space - Assign an AS to a context
- * @kbdev: Kbase device
- * @kctx: Kbase context
- * @current_as: Address Space to assign
- *
- * Assign an Address Space (AS) to a context, and add the context to the Policy.
- *
- * This includes
- *   setting up the global runpool_irq structure and the context on the AS,
- *   Activating the MMU on the AS,
- *   Allowing jobs to be submitted on the AS.
- *
- * Context:
- *   kbasep_js_kctx_info.jsctx_mutex held,
- *   kbasep_js_device_data.runpool_mutex held,
- *   AS transaction mutex held,
- *   Runpool IRQ lock held
- */
-static void assign_and_activate_kctx_addr_space(struct kbase_device *kbdev,
-						struct kbase_context *kctx,
-						struct kbase_as *current_as)
-{
-	struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
-
-	lockdep_assert_held(&kctx->jctx.sched_info.ctx.jsctx_mutex);
-	lockdep_assert_held(&js_devdata->runpool_mutex);
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	/* Attribute handling */
-	kbasep_js_ctx_attr_runpool_retain_ctx(kbdev, kctx);
-
-	/* Allow it to run jobs */
-	kbasep_js_set_submit_allowed(js_devdata, kctx);
-
-	kbase_js_runpool_inc_context_count(kbdev, kctx);
-}
-
-bool kbase_backend_use_ctx_sched(struct kbase_device *kbdev,
-						struct kbase_context *kctx)
-{
-	int i;
-
-	if (kbdev->hwaccess.active_kctx == kctx) {
-		/* Context is already active */
-		return true;
-	}
-
-	for (i = 0; i < kbdev->nr_hw_address_spaces; i++) {
-		if (kbdev->as_to_kctx[i] == kctx) {
-			/* Context already has ASID - mark as active */
-			return true;
-		}
-	}
-
-	/* Context does not have address space assigned */
-	return false;
-}
-
-void kbase_backend_release_ctx_irq(struct kbase_device *kbdev,
-						struct kbase_context *kctx)
-{
-	int as_nr = kctx->as_nr;
-
-	if (as_nr == KBASEP_AS_NR_INVALID) {
-		WARN(1, "Attempting to release context without ASID\n");
-		return;
-	}
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	if (atomic_read(&kctx->refcount) != 1) {
-		WARN(1, "Attempting to release active ASID\n");
-		return;
-	}
-
-	kbasep_js_clear_submit_allowed(&kbdev->js_data, kctx);
-
-	kbase_ctx_sched_release_ctx(kctx);
-	kbase_js_runpool_dec_context_count(kbdev, kctx);
-}
-
-void kbase_backend_release_ctx_noirq(struct kbase_device *kbdev,
-						struct kbase_context *kctx)
-{
-}
-
-int kbase_backend_find_and_release_free_address_space(
-		struct kbase_device *kbdev, struct kbase_context *kctx)
-{
-	struct kbasep_js_device_data *js_devdata;
-	struct kbasep_js_kctx_info *js_kctx_info;
-	unsigned long flags;
-	int i;
-
-	js_devdata = &kbdev->js_data;
-	js_kctx_info = &kctx->jctx.sched_info;
-
-	mutex_lock(&js_kctx_info->ctx.jsctx_mutex);
-	mutex_lock(&js_devdata->runpool_mutex);
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	for (i = 0; i < kbdev->nr_hw_address_spaces; i++) {
-		struct kbasep_js_kctx_info *as_js_kctx_info;
-		struct kbase_context *as_kctx;
-
-		as_kctx = kbdev->as_to_kctx[i];
-		as_js_kctx_info = &as_kctx->jctx.sched_info;
-
-		/* Don't release privileged or active contexts, or contexts with
-		 * jobs running.
-		 * Note that a context will have at least 1 reference (which
-		 * was previously taken by kbasep_js_schedule_ctx()) until
-		 * descheduled.
-		 */
-		if (as_kctx && !kbase_ctx_flag(as_kctx, KCTX_PRIVILEGED) &&
-			atomic_read(&as_kctx->refcount) == 1) {
-			if (!kbasep_js_runpool_retain_ctx_nolock(kbdev,
-								as_kctx)) {
-				WARN(1, "Failed to retain active context\n");
-
-				spin_unlock_irqrestore(&kbdev->hwaccess_lock,
-						flags);
-				mutex_unlock(&js_devdata->runpool_mutex);
-				mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
-
-				return KBASEP_AS_NR_INVALID;
-			}
-
-			kbasep_js_clear_submit_allowed(js_devdata, as_kctx);
-
-			/* Drop and retake locks to take the jsctx_mutex on the
-			 * context we're about to release without violating lock
-			 * ordering
-			 */
-			spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-			mutex_unlock(&js_devdata->runpool_mutex);
-			mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
-
-
-			/* Release context from address space */
-			mutex_lock(&as_js_kctx_info->ctx.jsctx_mutex);
-			mutex_lock(&js_devdata->runpool_mutex);
-
-			kbasep_js_runpool_release_ctx_nolock(kbdev, as_kctx);
-
-			if (!kbase_ctx_flag(as_kctx, KCTX_SCHEDULED)) {
-				kbasep_js_runpool_requeue_or_kill_ctx(kbdev,
-								as_kctx,
-								true);
-
-				mutex_unlock(&js_devdata->runpool_mutex);
-				mutex_unlock(&as_js_kctx_info->ctx.jsctx_mutex);
-
-				return i;
-			}
-
-			/* Context was retained while locks were dropped,
-			 * continue looking for free AS */
-
-			mutex_unlock(&js_devdata->runpool_mutex);
-			mutex_unlock(&as_js_kctx_info->ctx.jsctx_mutex);
-
-			mutex_lock(&js_kctx_info->ctx.jsctx_mutex);
-			mutex_lock(&js_devdata->runpool_mutex);
-			spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-		}
-	}
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	mutex_unlock(&js_devdata->runpool_mutex);
-	mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
-
-	return KBASEP_AS_NR_INVALID;
-}
-
-bool kbase_backend_use_ctx(struct kbase_device *kbdev,
-				struct kbase_context *kctx,
-				int as_nr)
-{
-	struct kbasep_js_device_data *js_devdata;
-	struct kbase_as *new_address_space = NULL;
-
-	js_devdata = &kbdev->js_data;
-
-	if (kbdev->hwaccess.active_kctx == kctx) {
-		WARN(1, "Context is already scheduled in\n");
-		return false;
-	}
-
-	new_address_space = &kbdev->as[as_nr];
-
-	lockdep_assert_held(&js_devdata->runpool_mutex);
-	lockdep_assert_held(&kbdev->mmu_hw_mutex);
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	assign_and_activate_kctx_addr_space(kbdev, kctx, new_address_space);
-
-	if (kbase_ctx_flag(kctx, KCTX_PRIVILEGED)) {
-		/* We need to retain it to keep the corresponding address space
-		 */
-		kbasep_js_runpool_retain_ctx_nolock(kbdev, kctx);
-	}
-
-	return true;
-}
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_defs.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_defs.h
deleted file mode 100644
index 08a7400e66d5..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_defs.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-/*
- * Register-based HW access backend specific definitions
- */
-
-#ifndef _KBASE_HWACCESS_GPU_DEFS_H_
-#define _KBASE_HWACCESS_GPU_DEFS_H_
-
-/* SLOT_RB_SIZE must be < 256 */
-#define SLOT_RB_SIZE 2
-#define SLOT_RB_MASK (SLOT_RB_SIZE - 1)
-
-/**
- * struct rb_entry - Ringbuffer entry
- * @katom:	Atom associated with this entry
- */
-struct rb_entry {
-	struct kbase_jd_atom *katom;
-};
-
-/**
- * struct slot_rb - Slot ringbuffer
- * @entries:		Ringbuffer entries
- * @last_context:	The last context to submit a job on this slot
- * @read_idx:		Current read index of buffer
- * @write_idx:		Current write index of buffer
- * @job_chain_flag:	Flag used to implement jobchain disambiguation
- */
-struct slot_rb {
-	struct rb_entry entries[SLOT_RB_SIZE];
-
-	struct kbase_context *last_context;
-
-	u8 read_idx;
-	u8 write_idx;
-
-	u8 job_chain_flag;
-};
-
-/**
- * struct kbase_backend_data - GPU backend specific data for HW access layer
- * @slot_rb:			Slot ringbuffers
- * @rmu_workaround_flag:	When PRLAM-8987 is present, this flag determines
- *				whether slots 0/1 or slot 2 are currently being
- *				pulled from
- * @scheduling_timer:		The timer tick used for rescheduling jobs
- * @timer_running:		Is the timer running? The runpool_mutex must be
- *				held whilst modifying this.
- * @suspend_timer:              Is the timer suspended? Set when a suspend
- *                              occurs and cleared on resume. The runpool_mutex
- *                              must be held whilst modifying this.
- * @reset_gpu:			Set to a KBASE_RESET_xxx value (see comments)
- * @reset_workq:		Work queue for performing the reset
- * @reset_work:			Work item for performing the reset
- * @reset_wait:			Wait event signalled when the reset is complete
- * @reset_timer:		Timeout for soft-stops before the reset
- * @timeouts_updated:           Have timeout values just been updated?
- *
- * The hwaccess_lock (a spinlock) must be held when accessing this structure
- */
-struct kbase_backend_data {
-	struct slot_rb slot_rb[BASE_JM_MAX_NR_SLOTS];
-
-	bool rmu_workaround_flag;
-
-	struct hrtimer scheduling_timer;
-
-	bool timer_running;
-	bool suspend_timer;
-
-	atomic_t reset_gpu;
-
-/* The GPU reset isn't pending */
-#define KBASE_RESET_GPU_NOT_PENDING     0
-/* kbase_prepare_to_reset_gpu has been called */
-#define KBASE_RESET_GPU_PREPARED        1
-/* kbase_reset_gpu has been called - the reset will now definitely happen
- * within the timeout period */
-#define KBASE_RESET_GPU_COMMITTED       2
-/* The GPU reset process is currently occuring (timeout has expired or
- * kbasep_try_reset_gpu_early was called) */
-#define KBASE_RESET_GPU_HAPPENING       3
-/* Reset the GPU silently, used when resetting the GPU as part of normal
- * behavior (e.g. when exiting protected mode). */
-#define KBASE_RESET_GPU_SILENT          4
-	struct workqueue_struct *reset_workq;
-	struct work_struct reset_work;
-	wait_queue_head_t reset_wait;
-	struct hrtimer reset_timer;
-
-	bool timeouts_updated;
-};
-
-/**
- * struct kbase_jd_atom_backend - GPU backend specific katom data
- */
-struct kbase_jd_atom_backend {
-};
-
-/**
- * struct kbase_context_backend - GPU backend specific context data
- */
-struct kbase_context_backend {
-};
-
-#endif /* _KBASE_HWACCESS_GPU_DEFS_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_hw.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_hw.c
deleted file mode 100644
index cbca5eac82f1..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_hw.c
+++ /dev/null
@@ -1,1512 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * Base kernel job manager APIs
- */
-
-#include <mali_kbase.h>
-#include <mali_kbase_config.h>
-#include <mali_midg_regmap.h>
-#if defined(CONFIG_MALI_BIFROST_GATOR_SUPPORT)
-#include <mali_kbase_gator.h>
-#endif
-#include <mali_kbase_tlstream.h>
-#include <mali_kbase_vinstr.h>
-#include <mali_kbase_hw.h>
-#include <mali_kbase_hwaccess_jm.h>
-#include <mali_kbase_ctx_sched.h>
-#include <backend/gpu/mali_kbase_device_internal.h>
-#include <backend/gpu/mali_kbase_irq_internal.h>
-#include <backend/gpu/mali_kbase_js_affinity.h>
-#include <backend/gpu/mali_kbase_jm_internal.h>
-
-#define beenthere(kctx, f, a...) \
-			dev_dbg(kctx->kbdev->dev, "%s:" f, __func__, ##a)
-
-#if KBASE_GPU_RESET_EN
-static void kbasep_try_reset_gpu_early(struct kbase_device *kbdev);
-static void kbasep_reset_timeout_worker(struct work_struct *data);
-static enum hrtimer_restart kbasep_reset_timer_callback(struct hrtimer *timer);
-#endif /* KBASE_GPU_RESET_EN */
-
-static inline int kbasep_jm_is_js_free(struct kbase_device *kbdev, int js,
-						struct kbase_context *kctx)
-{
-	return !kbase_reg_read(kbdev, JOB_SLOT_REG(js, JS_COMMAND_NEXT), kctx);
-}
-
-void kbase_job_hw_submit(struct kbase_device *kbdev,
-				struct kbase_jd_atom *katom,
-				int js)
-{
-	struct kbase_context *kctx;
-	u32 cfg;
-	u64 jc_head = katom->jc;
-
-	KBASE_DEBUG_ASSERT(kbdev);
-	KBASE_DEBUG_ASSERT(katom);
-
-	kctx = katom->kctx;
-
-	/* Command register must be available */
-	KBASE_DEBUG_ASSERT(kbasep_jm_is_js_free(kbdev, js, kctx));
-	/* Affinity is not violating */
-	kbase_js_debug_log_current_affinities(kbdev);
-	KBASE_DEBUG_ASSERT(!kbase_js_affinity_would_violate(kbdev, js,
-							katom->affinity));
-
-	kbase_reg_write(kbdev, JOB_SLOT_REG(js, JS_HEAD_NEXT_LO),
-						jc_head & 0xFFFFFFFF, kctx);
-	kbase_reg_write(kbdev, JOB_SLOT_REG(js, JS_HEAD_NEXT_HI),
-						jc_head >> 32, kctx);
-
-	kbase_reg_write(kbdev, JOB_SLOT_REG(js, JS_AFFINITY_NEXT_LO),
-					katom->affinity & 0xFFFFFFFF, kctx);
-	kbase_reg_write(kbdev, JOB_SLOT_REG(js, JS_AFFINITY_NEXT_HI),
-					katom->affinity >> 32, kctx);
-
-	/* start MMU, medium priority, cache clean/flush on end, clean/flush on
-	 * start */
-	cfg = kctx->as_nr;
-
-	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_FLUSH_REDUCTION) &&
-			!(kbdev->serialize_jobs & KBASE_SERIALIZE_RESET))
-		cfg |= JS_CONFIG_ENABLE_FLUSH_REDUCTION;
-
-	if (0 != (katom->core_req & BASE_JD_REQ_SKIP_CACHE_START))
-		cfg |= JS_CONFIG_START_FLUSH_NO_ACTION;
-	else
-		cfg |= JS_CONFIG_START_FLUSH_CLEAN_INVALIDATE;
-
-	if (0 != (katom->core_req & BASE_JD_REQ_SKIP_CACHE_END) &&
-			!(kbdev->serialize_jobs & KBASE_SERIALIZE_RESET))
-		cfg |= JS_CONFIG_END_FLUSH_NO_ACTION;
-	else
-		cfg |= JS_CONFIG_END_FLUSH_CLEAN_INVALIDATE;
-
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_10649))
-		cfg |= JS_CONFIG_START_MMU;
-
-	cfg |= JS_CONFIG_THREAD_PRI(8);
-
-	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_PROTECTED_MODE) &&
-		(katom->atom_flags & KBASE_KATOM_FLAG_PROTECTED))
-		cfg |= JS_CONFIG_DISABLE_DESCRIPTOR_WR_BK;
-
-	if (kbase_hw_has_feature(kbdev,
-				BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION)) {
-		if (!kbdev->hwaccess.backend.slot_rb[js].job_chain_flag) {
-			cfg |= JS_CONFIG_JOB_CHAIN_FLAG;
-			katom->atom_flags |= KBASE_KATOM_FLAGS_JOBCHAIN;
-			kbdev->hwaccess.backend.slot_rb[js].job_chain_flag =
-								true;
-		} else {
-			katom->atom_flags &= ~KBASE_KATOM_FLAGS_JOBCHAIN;
-			kbdev->hwaccess.backend.slot_rb[js].job_chain_flag =
-								false;
-		}
-	}
-
-	kbase_reg_write(kbdev, JOB_SLOT_REG(js, JS_CONFIG_NEXT), cfg, kctx);
-
-	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_FLUSH_REDUCTION))
-		kbase_reg_write(kbdev, JOB_SLOT_REG(js, JS_FLUSH_ID_NEXT),
-				katom->flush_id, kctx);
-
-	/* Write an approximate start timestamp.
-	 * It's approximate because there might be a job in the HEAD register.
-	 */
-	katom->start_timestamp = ktime_get();
-
-	/* GO ! */
-	dev_dbg(kbdev->dev, "JS: Submitting atom %p from ctx %p to js[%d] with head=0x%llx, affinity=0x%llx",
-				katom, kctx, js, jc_head, katom->affinity);
-
-	KBASE_TRACE_ADD_SLOT_INFO(kbdev, JM_SUBMIT, kctx, katom, jc_head, js,
-							(u32) katom->affinity);
-
-#if defined(CONFIG_MALI_BIFROST_GATOR_SUPPORT)
-	kbase_trace_mali_job_slots_event(
-				GATOR_MAKE_EVENT(GATOR_JOB_SLOT_START, js),
-				kctx, kbase_jd_atom_id(kctx, katom));
-#endif
-	KBASE_TLSTREAM_TL_ATTRIB_ATOM_CONFIG(katom, jc_head,
-			katom->affinity, cfg);
-	KBASE_TLSTREAM_TL_RET_CTX_LPU(
-		kctx,
-		&kbdev->gpu_props.props.raw_props.js_features[
-			katom->slot_nr]);
-	KBASE_TLSTREAM_TL_RET_ATOM_AS(katom, &kbdev->as[kctx->as_nr]);
-	KBASE_TLSTREAM_TL_RET_ATOM_LPU(
-			katom,
-			&kbdev->gpu_props.props.raw_props.js_features[js],
-			"ctx_nr,atom_nr");
-#ifdef CONFIG_GPU_TRACEPOINTS
-	if (!kbase_backend_nr_atoms_submitted(kbdev, js)) {
-		/* If this is the only job on the slot, trace it as starting */
-		char js_string[16];
-
-		trace_gpu_sched_switch(
-				kbasep_make_job_slot_string(js, js_string,
-						sizeof(js_string)),
-				ktime_to_ns(katom->start_timestamp),
-				(u32)katom->kctx->id, 0, katom->work_id);
-		kbdev->hwaccess.backend.slot_rb[js].last_context = katom->kctx;
-	}
-#endif
-	kbase_timeline_job_slot_submit(kbdev, kctx, katom, js);
-
-	kbase_reg_write(kbdev, JOB_SLOT_REG(js, JS_COMMAND_NEXT),
-						JS_COMMAND_START, katom->kctx);
-}
-
-/**
- * kbasep_job_slot_update_head_start_timestamp - Update timestamp
- * @kbdev: kbase device
- * @js: job slot
- * @end_timestamp: timestamp
- *
- * Update the start_timestamp of the job currently in the HEAD, based on the
- * fact that we got an IRQ for the previous set of completed jobs.
- *
- * The estimate also takes into account the time the job was submitted, to
- * work out the best estimate (which might still result in an over-estimate to
- * the calculated time spent)
- */
-static void kbasep_job_slot_update_head_start_timestamp(
-						struct kbase_device *kbdev,
-						int js,
-						ktime_t end_timestamp)
-{
-	if (kbase_backend_nr_atoms_on_slot(kbdev, js) > 0) {
-		struct kbase_jd_atom *katom;
-		ktime_t timestamp_diff;
-		/* The atom in the HEAD */
-		katom = kbase_gpu_inspect(kbdev, js, 0);
-
-		KBASE_DEBUG_ASSERT(katom != NULL);
-
-		timestamp_diff = ktime_sub(end_timestamp,
-				katom->start_timestamp);
-		if (ktime_to_ns(timestamp_diff) >= 0) {
-			/* Only update the timestamp if it's a better estimate
-			 * than what's currently stored. This is because our
-			 * estimate that accounts for the throttle time may be
-			 * too much of an overestimate */
-			katom->start_timestamp = end_timestamp;
-		}
-	}
-}
-
-/**
- * kbasep_trace_tl_event_lpu_softstop - Call event_lpu_softstop timeline
- * tracepoint
- * @kbdev: kbase device
- * @js: job slot
- *
- * Make a tracepoint call to the instrumentation module informing that
- * softstop happened on given lpu (job slot).
- */
-static void kbasep_trace_tl_event_lpu_softstop(struct kbase_device *kbdev,
-					int js)
-{
-	KBASE_TLSTREAM_TL_EVENT_LPU_SOFTSTOP(
-		&kbdev->gpu_props.props.raw_props.js_features[js]);
-}
-
-void kbase_job_done(struct kbase_device *kbdev, u32 done)
-{
-	unsigned long flags;
-	int i;
-	u32 count = 0;
-	ktime_t end_timestamp = ktime_get();
-	struct kbasep_js_device_data *js_devdata;
-
-	KBASE_DEBUG_ASSERT(kbdev);
-	js_devdata = &kbdev->js_data;
-
-	KBASE_TRACE_ADD(kbdev, JM_IRQ, NULL, NULL, 0, done);
-
-	memset(&kbdev->slot_submit_count_irq[0], 0,
-					sizeof(kbdev->slot_submit_count_irq));
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	while (done) {
-		u32 failed = done >> 16;
-
-		/* treat failed slots as finished slots */
-		u32 finished = (done & 0xFFFF) | failed;
-
-		/* Note: This is inherently unfair, as we always check
-		 * for lower numbered interrupts before the higher
-		 * numbered ones.*/
-		i = ffs(finished) - 1;
-		KBASE_DEBUG_ASSERT(i >= 0);
-
-		do {
-			int nr_done;
-			u32 active;
-			u32 completion_code = BASE_JD_EVENT_DONE;/* assume OK */
-			u64 job_tail = 0;
-
-			if (failed & (1u << i)) {
-				/* read out the job slot status code if the job
-				 * slot reported failure */
-				completion_code = kbase_reg_read(kbdev,
-					JOB_SLOT_REG(i, JS_STATUS), NULL);
-
-				switch (completion_code) {
-				case BASE_JD_EVENT_STOPPED:
-#if defined(CONFIG_MALI_BIFROST_GATOR_SUPPORT)
-					kbase_trace_mali_job_slots_event(
-						GATOR_MAKE_EVENT(
-						GATOR_JOB_SLOT_SOFT_STOPPED, i),
-								NULL, 0);
-#endif
-
-					kbasep_trace_tl_event_lpu_softstop(
-						kbdev, i);
-
-					/* Soft-stopped job - read the value of
-					 * JS<n>_TAIL so that the job chain can
-					 * be resumed */
-					job_tail = (u64)kbase_reg_read(kbdev,
-						JOB_SLOT_REG(i, JS_TAIL_LO),
-									NULL) |
-						((u64)kbase_reg_read(kbdev,
-						JOB_SLOT_REG(i, JS_TAIL_HI),
-								NULL) << 32);
-					break;
-				case BASE_JD_EVENT_NOT_STARTED:
-					/* PRLAM-10673 can cause a TERMINATED
-					 * job to come back as NOT_STARTED, but
-					 * the error interrupt helps us detect
-					 * it */
-					completion_code =
-						BASE_JD_EVENT_TERMINATED;
-					/* fall through */
-				default:
-					dev_warn(kbdev->dev, "error detected from slot %d, job status 0x%08x (%s)",
-							i, completion_code,
-							kbase_exception_name
-							(kbdev,
-							completion_code));
-				}
-
-				kbase_gpu_irq_evict(kbdev, i);
-			}
-
-			kbase_reg_write(kbdev, JOB_CONTROL_REG(JOB_IRQ_CLEAR),
-					done & ((1 << i) | (1 << (i + 16))),
-					NULL);
-			active = kbase_reg_read(kbdev,
-					JOB_CONTROL_REG(JOB_IRQ_JS_STATE),
-					NULL);
-
-			if (((active >> i) & 1) == 0 &&
-					(((done >> (i + 16)) & 1) == 0)) {
-				/* There is a potential race we must work
-				 * around:
-				 *
-				 *  1. A job slot has a job in both current and
-				 *     next registers
-				 *  2. The job in current completes
-				 *     successfully, the IRQ handler reads
-				 *     RAWSTAT and calls this function with the
-				 *     relevant bit set in "done"
-				 *  3. The job in the next registers becomes the
-				 *     current job on the GPU
-				 *  4. Sometime before the JOB_IRQ_CLEAR line
-				 *     above the job on the GPU _fails_
-				 *  5. The IRQ_CLEAR clears the done bit but not
-				 *     the failed bit. This atomically sets
-				 *     JOB_IRQ_JS_STATE. However since both jobs
-				 *     have now completed the relevant bits for
-				 *     the slot are set to 0.
-				 *
-				 * If we now did nothing then we'd incorrectly
-				 * assume that _both_ jobs had completed
-				 * successfully (since we haven't yet observed
-				 * the fail bit being set in RAWSTAT).
-				 *
-				 * So at this point if there are no active jobs
-				 * left we check to see if RAWSTAT has a failure
-				 * bit set for the job slot. If it does we know
-				 * that there has been a new failure that we
-				 * didn't previously know about, so we make sure
-				 * that we record this in active (but we wait
-				 * for the next loop to deal with it).
-				 *
-				 * If we were handling a job failure (i.e. done
-				 * has the relevant high bit set) then we know
-				 * that the value read back from
-				 * JOB_IRQ_JS_STATE is the correct number of
-				 * remaining jobs because the failed job will
-				 * have prevented any futher jobs from starting
-				 * execution.
-				 */
-				u32 rawstat = kbase_reg_read(kbdev,
-					JOB_CONTROL_REG(JOB_IRQ_RAWSTAT), NULL);
-
-				if ((rawstat >> (i + 16)) & 1) {
-					/* There is a failed job that we've
-					 * missed - add it back to active */
-					active |= (1u << i);
-				}
-			}
-
-			dev_dbg(kbdev->dev, "Job ended with status 0x%08X\n",
-							completion_code);
-
-			nr_done = kbase_backend_nr_atoms_submitted(kbdev, i);
-			nr_done -= (active >> i) & 1;
-			nr_done -= (active >> (i + 16)) & 1;
-
-			if (nr_done <= 0) {
-				dev_warn(kbdev->dev, "Spurious interrupt on slot %d",
-									i);
-
-				goto spurious;
-			}
-
-			count += nr_done;
-
-			while (nr_done) {
-				if (nr_done == 1) {
-					kbase_gpu_complete_hw(kbdev, i,
-								completion_code,
-								job_tail,
-								&end_timestamp);
-					kbase_jm_try_kick_all(kbdev);
-				} else {
-					/* More than one job has completed.
-					 * Since this is not the last job being
-					 * reported this time it must have
-					 * passed. This is because the hardware
-					 * will not allow further jobs in a job
-					 * slot to complete until the failed job
-					 * is cleared from the IRQ status.
-					 */
-					kbase_gpu_complete_hw(kbdev, i,
-							BASE_JD_EVENT_DONE,
-							0,
-							&end_timestamp);
-				}
-				nr_done--;
-			}
- spurious:
-			done = kbase_reg_read(kbdev,
-					JOB_CONTROL_REG(JOB_IRQ_RAWSTAT), NULL);
-
-			if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_10883)) {
-				/* Workaround for missing interrupt caused by
-				 * PRLAM-10883 */
-				if (((active >> i) & 1) && (0 ==
-						kbase_reg_read(kbdev,
-							JOB_SLOT_REG(i,
-							JS_STATUS), NULL))) {
-					/* Force job slot to be processed again
-					 */
-					done |= (1u << i);
-				}
-			}
-
-			failed = done >> 16;
-			finished = (done & 0xFFFF) | failed;
-			if (done)
-				end_timestamp = ktime_get();
-		} while (finished & (1 << i));
-
-		kbasep_job_slot_update_head_start_timestamp(kbdev, i,
-								end_timestamp);
-	}
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-#if KBASE_GPU_RESET_EN
-	if (atomic_read(&kbdev->hwaccess.backend.reset_gpu) ==
-						KBASE_RESET_GPU_COMMITTED) {
-		/* If we're trying to reset the GPU then we might be able to do
-		 * it early (without waiting for a timeout) because some jobs
-		 * have completed
-		 */
-		kbasep_try_reset_gpu_early(kbdev);
-	}
-#endif /* KBASE_GPU_RESET_EN */
-	KBASE_TRACE_ADD(kbdev, JM_IRQ_END, NULL, NULL, 0, count);
-}
-KBASE_EXPORT_TEST_API(kbase_job_done);
-
-static bool kbasep_soft_stop_allowed(struct kbase_device *kbdev,
-					struct kbase_jd_atom *katom)
-{
-	bool soft_stops_allowed = true;
-
-	if (kbase_jd_katom_is_protected(katom)) {
-		soft_stops_allowed = false;
-	} else if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8408)) {
-		if ((katom->core_req & BASE_JD_REQ_T) != 0)
-			soft_stops_allowed = false;
-	}
-	return soft_stops_allowed;
-}
-
-static bool kbasep_hard_stop_allowed(struct kbase_device *kbdev,
-						base_jd_core_req core_reqs)
-{
-	bool hard_stops_allowed = true;
-
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8394)) {
-		if ((core_reqs & BASE_JD_REQ_T) != 0)
-			hard_stops_allowed = false;
-	}
-	return hard_stops_allowed;
-}
-
-void kbasep_job_slot_soft_or_hard_stop_do_action(struct kbase_device *kbdev,
-					int js,
-					u32 action,
-					base_jd_core_req core_reqs,
-					struct kbase_jd_atom *target_katom)
-{
-	struct kbase_context *kctx = target_katom->kctx;
-#if KBASE_TRACE_ENABLE
-	u32 status_reg_before;
-	u64 job_in_head_before;
-	u32 status_reg_after;
-
-	KBASE_DEBUG_ASSERT(!(action & (~JS_COMMAND_MASK)));
-
-	/* Check the head pointer */
-	job_in_head_before = ((u64) kbase_reg_read(kbdev,
-					JOB_SLOT_REG(js, JS_HEAD_LO), NULL))
-			| (((u64) kbase_reg_read(kbdev,
-					JOB_SLOT_REG(js, JS_HEAD_HI), NULL))
-									<< 32);
-	status_reg_before = kbase_reg_read(kbdev, JOB_SLOT_REG(js, JS_STATUS),
-									NULL);
-#endif
-
-	if (action == JS_COMMAND_SOFT_STOP) {
-		bool soft_stop_allowed = kbasep_soft_stop_allowed(kbdev,
-								target_katom);
-
-		if (!soft_stop_allowed) {
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-			dev_dbg(kbdev->dev,
-					"Attempt made to soft-stop a job that cannot be soft-stopped. core_reqs = 0x%X",
-					(unsigned int)core_reqs);
-#endif				/* CONFIG_MALI_BIFROST_DEBUG */
-			return;
-		}
-
-		/* We are about to issue a soft stop, so mark the atom as having
-		 * been soft stopped */
-		target_katom->atom_flags |= KBASE_KATOM_FLAG_BEEN_SOFT_STOPPPED;
-
-		/* Mark the point where we issue the soft-stop command */
-		KBASE_TLSTREAM_TL_EVENT_ATOM_SOFTSTOP_ISSUE(target_katom);
-
-		if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8316)) {
-			int i;
-
-			for (i = 0;
-			     i < kbase_backend_nr_atoms_submitted(kbdev, js);
-			     i++) {
-				struct kbase_jd_atom *katom;
-
-				katom = kbase_gpu_inspect(kbdev, js, i);
-
-				KBASE_DEBUG_ASSERT(katom);
-
-				/* For HW_ISSUE_8316, only 'bad' jobs attacking
-				 * the system can cause this issue: normally,
-				 * all memory should be allocated in multiples
-				 * of 4 pages, and growable memory should be
-				 * changed size in multiples of 4 pages.
-				 *
-				 * Whilst such 'bad' jobs can be cleared by a
-				 * GPU reset, the locking up of a uTLB entry
-				 * caused by the bad job could also stall other
-				 * ASs, meaning that other ASs' jobs don't
-				 * complete in the 'grace' period before the
-				 * reset. We don't want to lose other ASs' jobs
-				 * when they would normally complete fine, so we
-				 * must 'poke' the MMU regularly to help other
-				 * ASs complete */
-				kbase_as_poking_timer_retain_atom(
-						kbdev, katom->kctx, katom);
-			}
-		}
-
-		if (kbase_hw_has_feature(
-				kbdev,
-				BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION)) {
-			action = (target_katom->atom_flags &
-					KBASE_KATOM_FLAGS_JOBCHAIN) ?
-				JS_COMMAND_SOFT_STOP_1 :
-				JS_COMMAND_SOFT_STOP_0;
-		}
-	} else if (action == JS_COMMAND_HARD_STOP) {
-		bool hard_stop_allowed = kbasep_hard_stop_allowed(kbdev,
-								core_reqs);
-
-		if (!hard_stop_allowed) {
-			/* Jobs can be hard-stopped for the following reasons:
-			 *  * CFS decides the job has been running too long (and
-			 *    soft-stop has not occurred). In this case the GPU
-			 *    will be reset by CFS if the job remains on the
-			 *    GPU.
-			 *
-			 *  * The context is destroyed, kbase_jd_zap_context
-			 *    will attempt to hard-stop the job. However it also
-			 *    has a watchdog which will cause the GPU to be
-			 *    reset if the job remains on the GPU.
-			 *
-			 *  * An (unhandled) MMU fault occurred. As long as
-			 *    BASE_HW_ISSUE_8245 is defined then the GPU will be
-			 *    reset.
-			 *
-			 * All three cases result in the GPU being reset if the
-			 * hard-stop fails, so it is safe to just return and
-			 * ignore the hard-stop request.
-			 */
-			dev_warn(kbdev->dev,
-					"Attempt made to hard-stop a job that cannot be hard-stopped. core_reqs = 0x%X",
-					(unsigned int)core_reqs);
-			return;
-		}
-		target_katom->atom_flags |= KBASE_KATOM_FLAG_BEEN_HARD_STOPPED;
-
-		if (kbase_hw_has_feature(
-				kbdev,
-				BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION)) {
-			action = (target_katom->atom_flags &
-					KBASE_KATOM_FLAGS_JOBCHAIN) ?
-				JS_COMMAND_HARD_STOP_1 :
-				JS_COMMAND_HARD_STOP_0;
-		}
-	}
-
-	kbase_reg_write(kbdev, JOB_SLOT_REG(js, JS_COMMAND), action, kctx);
-
-#if KBASE_TRACE_ENABLE
-	status_reg_after = kbase_reg_read(kbdev, JOB_SLOT_REG(js, JS_STATUS),
-									NULL);
-	if (status_reg_after == BASE_JD_EVENT_ACTIVE) {
-		struct kbase_jd_atom *head;
-		struct kbase_context *head_kctx;
-
-		head = kbase_gpu_inspect(kbdev, js, 0);
-		head_kctx = head->kctx;
-
-		if (status_reg_before == BASE_JD_EVENT_ACTIVE)
-			KBASE_TRACE_ADD_SLOT(kbdev, JM_CHECK_HEAD, head_kctx,
-						head, job_in_head_before, js);
-		else
-			KBASE_TRACE_ADD_SLOT(kbdev, JM_CHECK_HEAD, NULL, NULL,
-						0, js);
-
-		switch (action) {
-		case JS_COMMAND_SOFT_STOP:
-			KBASE_TRACE_ADD_SLOT(kbdev, JM_SOFTSTOP, head_kctx,
-							head, head->jc, js);
-			break;
-		case JS_COMMAND_SOFT_STOP_0:
-			KBASE_TRACE_ADD_SLOT(kbdev, JM_SOFTSTOP_0, head_kctx,
-							head, head->jc, js);
-			break;
-		case JS_COMMAND_SOFT_STOP_1:
-			KBASE_TRACE_ADD_SLOT(kbdev, JM_SOFTSTOP_1, head_kctx,
-							head, head->jc, js);
-			break;
-		case JS_COMMAND_HARD_STOP:
-			KBASE_TRACE_ADD_SLOT(kbdev, JM_HARDSTOP, head_kctx,
-							head, head->jc, js);
-			break;
-		case JS_COMMAND_HARD_STOP_0:
-			KBASE_TRACE_ADD_SLOT(kbdev, JM_HARDSTOP_0, head_kctx,
-							head, head->jc, js);
-			break;
-		case JS_COMMAND_HARD_STOP_1:
-			KBASE_TRACE_ADD_SLOT(kbdev, JM_HARDSTOP_1, head_kctx,
-							head, head->jc, js);
-			break;
-		default:
-			BUG();
-			break;
-		}
-	} else {
-		if (status_reg_before == BASE_JD_EVENT_ACTIVE)
-			KBASE_TRACE_ADD_SLOT(kbdev, JM_CHECK_HEAD, NULL, NULL,
-							job_in_head_before, js);
-		else
-			KBASE_TRACE_ADD_SLOT(kbdev, JM_CHECK_HEAD, NULL, NULL,
-							0, js);
-
-		switch (action) {
-		case JS_COMMAND_SOFT_STOP:
-			KBASE_TRACE_ADD_SLOT(kbdev, JM_SOFTSTOP, NULL, NULL, 0,
-							js);
-			break;
-		case JS_COMMAND_SOFT_STOP_0:
-			KBASE_TRACE_ADD_SLOT(kbdev, JM_SOFTSTOP_0, NULL, NULL,
-							0, js);
-			break;
-		case JS_COMMAND_SOFT_STOP_1:
-			KBASE_TRACE_ADD_SLOT(kbdev, JM_SOFTSTOP_1, NULL, NULL,
-							0, js);
-			break;
-		case JS_COMMAND_HARD_STOP:
-			KBASE_TRACE_ADD_SLOT(kbdev, JM_HARDSTOP, NULL, NULL, 0,
-							js);
-			break;
-		case JS_COMMAND_HARD_STOP_0:
-			KBASE_TRACE_ADD_SLOT(kbdev, JM_HARDSTOP_0, NULL, NULL,
-							0, js);
-			break;
-		case JS_COMMAND_HARD_STOP_1:
-			KBASE_TRACE_ADD_SLOT(kbdev, JM_HARDSTOP_1, NULL, NULL,
-							0, js);
-			break;
-		default:
-			BUG();
-			break;
-		}
-	}
-#endif
-}
-
-void kbase_backend_jm_kill_jobs_from_kctx(struct kbase_context *kctx)
-{
-	unsigned long flags;
-	struct kbase_device *kbdev;
-	int i;
-
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	kbdev = kctx->kbdev;
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	/* Cancel any remaining running jobs for this kctx  */
-	mutex_lock(&kctx->jctx.lock);
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	/* Invalidate all jobs in context, to prevent re-submitting */
-	for (i = 0; i < BASE_JD_ATOM_COUNT; i++) {
-		if (!work_pending(&kctx->jctx.atoms[i].work))
-			kctx->jctx.atoms[i].event_code =
-						BASE_JD_EVENT_JOB_CANCELLED;
-	}
-
-	for (i = 0; i < kbdev->gpu_props.num_job_slots; i++)
-		kbase_job_slot_hardstop(kctx, i, NULL);
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-	mutex_unlock(&kctx->jctx.lock);
-}
-
-void kbase_job_slot_ctx_priority_check_locked(struct kbase_context *kctx,
-				struct kbase_jd_atom *target_katom)
-{
-	struct kbase_device *kbdev;
-	int js = target_katom->slot_nr;
-	int priority = target_katom->sched_priority;
-	int i;
-	bool stop_sent = false;
-
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	kbdev = kctx->kbdev;
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	for (i = 0; i < kbase_backend_nr_atoms_on_slot(kbdev, js); i++) {
-		struct kbase_jd_atom *katom;
-
-		katom = kbase_gpu_inspect(kbdev, js, i);
-		if (!katom)
-			continue;
-
-		if (katom->kctx != kctx)
-			continue;
-
-		if (katom->sched_priority > priority) {
-			if (!stop_sent)
-				KBASE_TLSTREAM_TL_ATTRIB_ATOM_PRIORITY_CHANGE(
-						target_katom);
-
-			kbase_job_slot_softstop(kbdev, js, katom);
-			stop_sent = true;
-		}
-	}
-}
-
-struct zap_reset_data {
-	/* The stages are:
-	 * 1. The timer has never been called
-	 * 2. The zap has timed out, all slots are soft-stopped - the GPU reset
-	 *    will happen. The GPU has been reset when
-	 *    kbdev->hwaccess.backend.reset_waitq is signalled
-	 *
-	 * (-1 - The timer has been cancelled)
-	 */
-	int stage;
-	struct kbase_device *kbdev;
-	struct hrtimer timer;
-	spinlock_t lock; /* protects updates to stage member */
-};
-
-static enum hrtimer_restart zap_timeout_callback(struct hrtimer *timer)
-{
-	struct zap_reset_data *reset_data = container_of(timer,
-						struct zap_reset_data, timer);
-	struct kbase_device *kbdev = reset_data->kbdev;
-	unsigned long flags;
-
-	spin_lock_irqsave(&reset_data->lock, flags);
-
-	if (reset_data->stage == -1)
-		goto out;
-
-#if KBASE_GPU_RESET_EN
-	if (kbase_prepare_to_reset_gpu(kbdev)) {
-		dev_err(kbdev->dev, "Issueing GPU soft-reset because jobs failed to be killed (within %d ms) as part of context termination (e.g. process exit)\n",
-								ZAP_TIMEOUT);
-		kbase_reset_gpu(kbdev);
-	}
-#endif /* KBASE_GPU_RESET_EN */
-	reset_data->stage = 2;
-
- out:
-	spin_unlock_irqrestore(&reset_data->lock, flags);
-
-	return HRTIMER_NORESTART;
-}
-
-void kbase_jm_wait_for_zero_jobs(struct kbase_context *kctx)
-{
-	struct kbase_device *kbdev = kctx->kbdev;
-	struct zap_reset_data reset_data;
-	unsigned long flags;
-
-	hrtimer_init_on_stack(&reset_data.timer, CLOCK_MONOTONIC,
-							HRTIMER_MODE_REL);
-	reset_data.timer.function = zap_timeout_callback;
-
-	spin_lock_init(&reset_data.lock);
-
-	reset_data.kbdev = kbdev;
-	reset_data.stage = 1;
-
-	hrtimer_start(&reset_data.timer, HR_TIMER_DELAY_MSEC(ZAP_TIMEOUT),
-							HRTIMER_MODE_REL);
-
-	/* Wait for all jobs to finish, and for the context to be not-scheduled
-	 * (due to kbase_job_zap_context(), we also guarentee it's not in the JS
-	 * policy queue either */
-	wait_event(kctx->jctx.zero_jobs_wait, kctx->jctx.job_nr == 0);
-	wait_event(kctx->jctx.sched_info.ctx.is_scheduled_wait,
-		   !kbase_ctx_flag(kctx, KCTX_SCHEDULED));
-
-	spin_lock_irqsave(&reset_data.lock, flags);
-	if (reset_data.stage == 1) {
-		/* The timer hasn't run yet - so cancel it */
-		reset_data.stage = -1;
-	}
-	spin_unlock_irqrestore(&reset_data.lock, flags);
-
-	hrtimer_cancel(&reset_data.timer);
-
-	if (reset_data.stage == 2) {
-		/* The reset has already started.
-		 * Wait for the reset to complete
-		 */
-		wait_event(kbdev->hwaccess.backend.reset_wait,
-				atomic_read(&kbdev->hwaccess.backend.reset_gpu)
-						== KBASE_RESET_GPU_NOT_PENDING);
-	}
-	destroy_hrtimer_on_stack(&reset_data.timer);
-
-	dev_dbg(kbdev->dev, "Zap: Finished Context %p", kctx);
-
-	/* Ensure that the signallers of the waitqs have finished */
-	mutex_lock(&kctx->jctx.lock);
-	mutex_lock(&kctx->jctx.sched_info.ctx.jsctx_mutex);
-	mutex_unlock(&kctx->jctx.sched_info.ctx.jsctx_mutex);
-	mutex_unlock(&kctx->jctx.lock);
-}
-
-u32 kbase_backend_get_current_flush_id(struct kbase_device *kbdev)
-{
-	u32 flush_id = 0;
-
-	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_FLUSH_REDUCTION)) {
-		mutex_lock(&kbdev->pm.lock);
-		if (kbdev->pm.backend.gpu_powered)
-			flush_id = kbase_reg_read(kbdev,
-					GPU_CONTROL_REG(LATEST_FLUSH), NULL);
-		mutex_unlock(&kbdev->pm.lock);
-	}
-
-	return flush_id;
-}
-
-int kbase_job_slot_init(struct kbase_device *kbdev)
-{
-#if KBASE_GPU_RESET_EN
-	kbdev->hwaccess.backend.reset_workq = alloc_workqueue(
-						"Mali reset workqueue", 0, 1);
-	if (NULL == kbdev->hwaccess.backend.reset_workq)
-		return -EINVAL;
-
-	KBASE_DEBUG_ASSERT(0 ==
-		object_is_on_stack(&kbdev->hwaccess.backend.reset_work));
-	INIT_WORK(&kbdev->hwaccess.backend.reset_work,
-						kbasep_reset_timeout_worker);
-
-	hrtimer_init(&kbdev->hwaccess.backend.reset_timer, CLOCK_MONOTONIC,
-							HRTIMER_MODE_REL);
-	kbdev->hwaccess.backend.reset_timer.function =
-						kbasep_reset_timer_callback;
-#endif
-
-	return 0;
-}
-KBASE_EXPORT_TEST_API(kbase_job_slot_init);
-
-void kbase_job_slot_halt(struct kbase_device *kbdev)
-{
-	CSTD_UNUSED(kbdev);
-}
-
-void kbase_job_slot_term(struct kbase_device *kbdev)
-{
-#if KBASE_GPU_RESET_EN
-	destroy_workqueue(kbdev->hwaccess.backend.reset_workq);
-#endif
-}
-KBASE_EXPORT_TEST_API(kbase_job_slot_term);
-
-#if KBASE_GPU_RESET_EN
-/**
- * kbasep_check_for_afbc_on_slot() - Check whether AFBC is in use on this slot
- * @kbdev: kbase device pointer
- * @kctx:  context to check against
- * @js:	   slot to check
- * @target_katom: An atom to check, or NULL if all atoms from @kctx on
- *                slot @js should be checked
- *
- * This checks are based upon parameters that would normally be passed to
- * kbase_job_slot_hardstop().
- *
- * In the event of @target_katom being NULL, this will check the last jobs that
- * are likely to be running on the slot to see if a) they belong to kctx, and
- * so would be stopped, and b) whether they have AFBC
- *
- * In that case, It's guaranteed that a job currently executing on the HW with
- * AFBC will be detected. However, this is a conservative check because it also
- * detects jobs that have just completed too.
- *
- * Return: true when hard-stop _might_ stop an afbc atom, else false.
- */
-static bool kbasep_check_for_afbc_on_slot(struct kbase_device *kbdev,
-		struct kbase_context *kctx, int js,
-		struct kbase_jd_atom *target_katom)
-{
-	bool ret = false;
-	int i;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	/* When we have an atom the decision can be made straight away. */
-	if (target_katom)
-		return !!(target_katom->core_req & BASE_JD_REQ_FS_AFBC);
-
-	/* Otherwise, we must chweck the hardware to see if it has atoms from
-	 * this context with AFBC. */
-	for (i = 0; i < kbase_backend_nr_atoms_on_slot(kbdev, js); i++) {
-		struct kbase_jd_atom *katom;
-
-		katom = kbase_gpu_inspect(kbdev, js, i);
-		if (!katom)
-			continue;
-
-		/* Ignore atoms from other contexts, they won't be stopped when
-		 * we use this for checking if we should hard-stop them */
-		if (katom->kctx != kctx)
-			continue;
-
-		/* An atom on this slot and this context: check for AFBC */
-		if (katom->core_req & BASE_JD_REQ_FS_AFBC) {
-			ret = true;
-			break;
-		}
-	}
-
-	return ret;
-}
-#endif /* KBASE_GPU_RESET_EN */
-
-/**
- * kbase_job_slot_softstop_swflags - Soft-stop a job with flags
- * @kbdev:         The kbase device
- * @js:            The job slot to soft-stop
- * @target_katom:  The job that should be soft-stopped (or NULL for any job)
- * @sw_flags:      Flags to pass in about the soft-stop
- *
- * Context:
- *   The job slot lock must be held when calling this function.
- *   The job slot must not already be in the process of being soft-stopped.
- *
- * Soft-stop the specified job slot, with extra information about the stop
- *
- * Where possible any job in the next register is evicted before the soft-stop.
- */
-void kbase_job_slot_softstop_swflags(struct kbase_device *kbdev, int js,
-			struct kbase_jd_atom *target_katom, u32 sw_flags)
-{
-	KBASE_DEBUG_ASSERT(!(sw_flags & JS_COMMAND_MASK));
-	kbase_backend_soft_hard_stop_slot(kbdev, NULL, js, target_katom,
-			JS_COMMAND_SOFT_STOP | sw_flags);
-}
-
-/**
- * kbase_job_slot_softstop - Soft-stop the specified job slot
- * @kbdev:         The kbase device
- * @js:            The job slot to soft-stop
- * @target_katom:  The job that should be soft-stopped (or NULL for any job)
- * Context:
- *   The job slot lock must be held when calling this function.
- *   The job slot must not already be in the process of being soft-stopped.
- *
- * Where possible any job in the next register is evicted before the soft-stop.
- */
-void kbase_job_slot_softstop(struct kbase_device *kbdev, int js,
-				struct kbase_jd_atom *target_katom)
-{
-	kbase_job_slot_softstop_swflags(kbdev, js, target_katom, 0u);
-}
-
-/**
- * kbase_job_slot_hardstop - Hard-stop the specified job slot
- * @kctx:         The kbase context that contains the job(s) that should
- *                be hard-stopped
- * @js:           The job slot to hard-stop
- * @target_katom: The job that should be hard-stopped (or NULL for all
- *                jobs from the context)
- * Context:
- *   The job slot lock must be held when calling this function.
- */
-void kbase_job_slot_hardstop(struct kbase_context *kctx, int js,
-				struct kbase_jd_atom *target_katom)
-{
-	struct kbase_device *kbdev = kctx->kbdev;
-	bool stopped;
-#if KBASE_GPU_RESET_EN
-	/* We make the check for AFBC before evicting/stopping atoms.  Note
-	 * that no other thread can modify the slots whilst we have the
-	 * hwaccess_lock. */
-	int needs_workaround_for_afbc =
-			kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_T76X_3542)
-			&& kbasep_check_for_afbc_on_slot(kbdev, kctx, js,
-					 target_katom);
-#endif
-
-	stopped = kbase_backend_soft_hard_stop_slot(kbdev, kctx, js,
-							target_katom,
-							JS_COMMAND_HARD_STOP);
-#if KBASE_GPU_RESET_EN
-	if (stopped && (kbase_hw_has_issue(kctx->kbdev, BASE_HW_ISSUE_8401) ||
-			kbase_hw_has_issue(kctx->kbdev, BASE_HW_ISSUE_9510) ||
-			needs_workaround_for_afbc)) {
-		/* MIDBASE-2916 if a fragment job with AFBC encoding is
-		 * hardstopped, ensure to do a soft reset also in order to
-		 * clear the GPU status.
-		 * Workaround for HW issue 8401 has an issue,so after
-		 * hard-stopping just reset the GPU. This will ensure that the
-		 * jobs leave the GPU.*/
-		if (kbase_prepare_to_reset_gpu_locked(kbdev)) {
-			dev_err(kbdev->dev, "Issueing GPU soft-reset after hard stopping due to hardware issue");
-			kbase_reset_gpu_locked(kbdev);
-		}
-	}
-#endif
-}
-
-/**
- * kbase_job_check_enter_disjoint - potentiall enter disjoint mode
- * @kbdev: kbase device
- * @action: the event which has occurred
- * @core_reqs: core requirements of the atom
- * @target_katom: the atom which is being affected
- *
- * For a certain soft/hard-stop action, work out whether to enter disjoint
- * state.
- *
- * This does not register multiple disjoint events if the atom has already
- * started a disjoint period
- *
- * @core_reqs can be supplied as 0 if the atom had not started on the hardware
- * (and so a 'real' soft/hard-stop was not required, but it still interrupted
- * flow, perhaps on another context)
- *
- * kbase_job_check_leave_disjoint() should be used to end the disjoint
- * state when the soft/hard-stop action is complete
- */
-void kbase_job_check_enter_disjoint(struct kbase_device *kbdev, u32 action,
-		base_jd_core_req core_reqs, struct kbase_jd_atom *target_katom)
-{
-	u32 hw_action = action & JS_COMMAND_MASK;
-
-	/* For hard-stop, don't enter if hard-stop not allowed */
-	if (hw_action == JS_COMMAND_HARD_STOP &&
-			!kbasep_hard_stop_allowed(kbdev, core_reqs))
-		return;
-
-	/* For soft-stop, don't enter if soft-stop not allowed, or isn't
-	 * causing disjoint */
-	if (hw_action == JS_COMMAND_SOFT_STOP &&
-			!(kbasep_soft_stop_allowed(kbdev, target_katom) &&
-			  (action & JS_COMMAND_SW_CAUSES_DISJOINT)))
-		return;
-
-	/* Nothing to do if already logged disjoint state on this atom */
-	if (target_katom->atom_flags & KBASE_KATOM_FLAG_IN_DISJOINT)
-		return;
-
-	target_katom->atom_flags |= KBASE_KATOM_FLAG_IN_DISJOINT;
-	kbase_disjoint_state_up(kbdev);
-}
-
-/**
- * kbase_job_check_enter_disjoint - potentially leave disjoint state
- * @kbdev: kbase device
- * @target_katom: atom which is finishing
- *
- * Work out whether to leave disjoint state when finishing an atom that was
- * originated by kbase_job_check_enter_disjoint().
- */
-void kbase_job_check_leave_disjoint(struct kbase_device *kbdev,
-		struct kbase_jd_atom *target_katom)
-{
-	if (target_katom->atom_flags & KBASE_KATOM_FLAG_IN_DISJOINT) {
-		target_katom->atom_flags &= ~KBASE_KATOM_FLAG_IN_DISJOINT;
-		kbase_disjoint_state_down(kbdev);
-	}
-}
-
-
-#if KBASE_GPU_RESET_EN
-static void kbase_debug_dump_registers(struct kbase_device *kbdev)
-{
-	int i;
-
-	kbase_io_history_dump(kbdev);
-
-	dev_err(kbdev->dev, "Register state:");
-	dev_err(kbdev->dev, "  GPU_IRQ_RAWSTAT=0x%08x GPU_STATUS=0x%08x",
-		kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_IRQ_RAWSTAT), NULL),
-		kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_STATUS), NULL));
-	dev_err(kbdev->dev, "  JOB_IRQ_RAWSTAT=0x%08x JOB_IRQ_JS_STATE=0x%08x",
-		kbase_reg_read(kbdev, JOB_CONTROL_REG(JOB_IRQ_RAWSTAT), NULL),
-		kbase_reg_read(kbdev, JOB_CONTROL_REG(JOB_IRQ_JS_STATE), NULL));
-	for (i = 0; i < 3; i++) {
-		dev_err(kbdev->dev, "  JS%d_STATUS=0x%08x      JS%d_HEAD_LO=0x%08x",
-			i, kbase_reg_read(kbdev, JOB_SLOT_REG(i, JS_STATUS),
-					NULL),
-			i, kbase_reg_read(kbdev, JOB_SLOT_REG(i, JS_HEAD_LO),
-					NULL));
-	}
-	dev_err(kbdev->dev, "  MMU_IRQ_RAWSTAT=0x%08x GPU_FAULTSTATUS=0x%08x",
-		kbase_reg_read(kbdev, MMU_REG(MMU_IRQ_RAWSTAT), NULL),
-		kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_FAULTSTATUS), NULL));
-	dev_err(kbdev->dev, "  GPU_IRQ_MASK=0x%08x    JOB_IRQ_MASK=0x%08x     MMU_IRQ_MASK=0x%08x",
-		kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_IRQ_MASK), NULL),
-		kbase_reg_read(kbdev, JOB_CONTROL_REG(JOB_IRQ_MASK), NULL),
-		kbase_reg_read(kbdev, MMU_REG(MMU_IRQ_MASK), NULL));
-	dev_err(kbdev->dev, "  PWR_OVERRIDE0=0x%08x   PWR_OVERRIDE1=0x%08x",
-		kbase_reg_read(kbdev, GPU_CONTROL_REG(PWR_OVERRIDE0), NULL),
-		kbase_reg_read(kbdev, GPU_CONTROL_REG(PWR_OVERRIDE1), NULL));
-	dev_err(kbdev->dev, "  SHADER_CONFIG=0x%08x   L2_MMU_CONFIG=0x%08x",
-		kbase_reg_read(kbdev, GPU_CONTROL_REG(SHADER_CONFIG), NULL),
-		kbase_reg_read(kbdev, GPU_CONTROL_REG(L2_MMU_CONFIG), NULL));
-	dev_err(kbdev->dev, "  TILER_CONFIG=0x%08x    JM_CONFIG=0x%08x",
-		kbase_reg_read(kbdev, GPU_CONTROL_REG(TILER_CONFIG), NULL),
-		kbase_reg_read(kbdev, GPU_CONTROL_REG(JM_CONFIG), NULL));
-}
-
-static void kbasep_reset_timeout_worker(struct work_struct *data)
-{
-	unsigned long flags;
-	struct kbase_device *kbdev;
-	ktime_t end_timestamp = ktime_get();
-	struct kbasep_js_device_data *js_devdata;
-	bool try_schedule = false;
-	bool silent = false;
-	u32 max_loops = KBASE_CLEAN_CACHE_MAX_LOOPS;
-
-	KBASE_DEBUG_ASSERT(data);
-
-	kbdev = container_of(data, struct kbase_device,
-						hwaccess.backend.reset_work);
-
-	KBASE_DEBUG_ASSERT(kbdev);
-	js_devdata = &kbdev->js_data;
-
-	if (atomic_read(&kbdev->hwaccess.backend.reset_gpu) ==
-			KBASE_RESET_GPU_SILENT)
-		silent = true;
-
-	KBASE_TRACE_ADD(kbdev, JM_BEGIN_RESET_WORKER, NULL, NULL, 0u, 0);
-
-	/* Suspend vinstr.
-	 * This call will block until vinstr is suspended. */
-	kbase_vinstr_suspend(kbdev->vinstr_ctx);
-
-	/* Make sure the timer has completed - this cannot be done from
-	 * interrupt context, so this cannot be done within
-	 * kbasep_try_reset_gpu_early. */
-	hrtimer_cancel(&kbdev->hwaccess.backend.reset_timer);
-
-	if (kbase_pm_context_active_handle_suspend(kbdev,
-				KBASE_PM_SUSPEND_HANDLER_DONT_REACTIVATE)) {
-		/* This would re-activate the GPU. Since it's already idle,
-		 * there's no need to reset it */
-		atomic_set(&kbdev->hwaccess.backend.reset_gpu,
-						KBASE_RESET_GPU_NOT_PENDING);
-		kbase_disjoint_state_down(kbdev);
-		wake_up(&kbdev->hwaccess.backend.reset_wait);
-		kbase_vinstr_resume(kbdev->vinstr_ctx);
-		return;
-	}
-
-	KBASE_DEBUG_ASSERT(kbdev->irq_reset_flush == false);
-
-	spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
-	spin_lock(&kbdev->hwaccess_lock);
-	spin_lock(&kbdev->mmu_mask_change);
-	/* We're about to flush out the IRQs and their bottom half's */
-	kbdev->irq_reset_flush = true;
-
-	/* Disable IRQ to avoid IRQ handlers to kick in after releasing the
-	 * spinlock; this also clears any outstanding interrupts */
-	kbase_pm_disable_interrupts_nolock(kbdev);
-
-	spin_unlock(&kbdev->mmu_mask_change);
-	spin_unlock(&kbdev->hwaccess_lock);
-	spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
-
-	/* Ensure that any IRQ handlers have finished
-	 * Must be done without any locks IRQ handlers will take */
-	kbase_synchronize_irqs(kbdev);
-
-	/* Flush out any in-flight work items */
-	kbase_flush_mmu_wqs(kbdev);
-
-	/* The flush has completed so reset the active indicator */
-	kbdev->irq_reset_flush = false;
-
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_TMIX_8463)) {
-		/* Ensure that L2 is not transitioning when we send the reset
-		 * command */
-		while (--max_loops && kbase_pm_get_trans_cores(kbdev,
-				KBASE_PM_CORE_L2))
-			;
-
-		WARN(!max_loops, "L2 power transition timed out while trying to reset\n");
-	}
-
-	mutex_lock(&kbdev->pm.lock);
-	/* We hold the pm lock, so there ought to be a current policy */
-	KBASE_DEBUG_ASSERT(kbdev->pm.backend.pm_current_policy);
-
-	/* All slot have been soft-stopped and we've waited
-	 * SOFT_STOP_RESET_TIMEOUT for the slots to clear, at this point we
-	 * assume that anything that is still left on the GPU is stuck there and
-	 * we'll kill it when we reset the GPU */
-
-	if (!silent)
-		dev_err(kbdev->dev, "Resetting GPU (allowing up to %d ms)",
-								RESET_TIMEOUT);
-
-	/* Output the state of some interesting registers to help in the
-	 * debugging of GPU resets */
-	if (!silent)
-		kbase_debug_dump_registers(kbdev);
-
-	/* Complete any jobs that were still on the GPU */
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	kbdev->protected_mode = false;
-	kbase_backend_reset(kbdev, &end_timestamp);
-	kbase_pm_metrics_update(kbdev, NULL);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	/* Reset the GPU */
-	kbase_pm_init_hw(kbdev, 0);
-
-	mutex_unlock(&kbdev->pm.lock);
-
-	mutex_lock(&js_devdata->runpool_mutex);
-
-	mutex_lock(&kbdev->mmu_hw_mutex);
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	kbase_ctx_sched_restore_all_as(kbdev);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-	mutex_unlock(&kbdev->mmu_hw_mutex);
-
-	kbase_pm_enable_interrupts(kbdev);
-
-	atomic_set(&kbdev->hwaccess.backend.reset_gpu,
-						KBASE_RESET_GPU_NOT_PENDING);
-
-	kbase_disjoint_state_down(kbdev);
-
-	wake_up(&kbdev->hwaccess.backend.reset_wait);
-	if (!silent)
-		dev_err(kbdev->dev, "Reset complete");
-
-	if (js_devdata->nr_contexts_pullable > 0 && !kbdev->poweroff_pending)
-		try_schedule = true;
-
-	mutex_unlock(&js_devdata->runpool_mutex);
-
-	mutex_lock(&kbdev->pm.lock);
-
-	/* Find out what cores are required now */
-	kbase_pm_update_cores_state(kbdev);
-
-	/* Synchronously request and wait for those cores, because if
-	 * instrumentation is enabled it would need them immediately. */
-	kbase_pm_check_transitions_sync(kbdev);
-
-	mutex_unlock(&kbdev->pm.lock);
-
-	/* Try submitting some jobs to restart processing */
-	if (try_schedule) {
-		KBASE_TRACE_ADD(kbdev, JM_SUBMIT_AFTER_RESET, NULL, NULL, 0u,
-									0);
-		kbase_js_sched_all(kbdev);
-	}
-
-	/* Process any pending slot updates */
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	kbase_backend_slot_update(kbdev);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	kbase_pm_context_idle(kbdev);
-
-	/* Release vinstr */
-	kbase_vinstr_resume(kbdev->vinstr_ctx);
-
-	KBASE_TRACE_ADD(kbdev, JM_END_RESET_WORKER, NULL, NULL, 0u, 0);
-}
-
-static enum hrtimer_restart kbasep_reset_timer_callback(struct hrtimer *timer)
-{
-	struct kbase_device *kbdev = container_of(timer, struct kbase_device,
-						hwaccess.backend.reset_timer);
-
-	KBASE_DEBUG_ASSERT(kbdev);
-
-	/* Reset still pending? */
-	if (atomic_cmpxchg(&kbdev->hwaccess.backend.reset_gpu,
-			KBASE_RESET_GPU_COMMITTED, KBASE_RESET_GPU_HAPPENING) ==
-						KBASE_RESET_GPU_COMMITTED)
-		queue_work(kbdev->hwaccess.backend.reset_workq,
-					&kbdev->hwaccess.backend.reset_work);
-
-	return HRTIMER_NORESTART;
-}
-
-/*
- * If all jobs are evicted from the GPU then we can reset the GPU
- * immediately instead of waiting for the timeout to elapse
- */
-
-static void kbasep_try_reset_gpu_early_locked(struct kbase_device *kbdev)
-{
-	int i;
-	int pending_jobs = 0;
-
-	KBASE_DEBUG_ASSERT(kbdev);
-
-	/* Count the number of jobs */
-	for (i = 0; i < kbdev->gpu_props.num_job_slots; i++)
-		pending_jobs += kbase_backend_nr_atoms_submitted(kbdev, i);
-
-	if (pending_jobs > 0) {
-		/* There are still jobs on the GPU - wait */
-		return;
-	}
-
-	/* To prevent getting incorrect registers when dumping failed job,
-	 * skip early reset.
-	 */
-	if (kbdev->job_fault_debug != false)
-		return;
-
-	/* Check that the reset has been committed to (i.e. kbase_reset_gpu has
-	 * been called), and that no other thread beat this thread to starting
-	 * the reset */
-	if (atomic_cmpxchg(&kbdev->hwaccess.backend.reset_gpu,
-			KBASE_RESET_GPU_COMMITTED, KBASE_RESET_GPU_HAPPENING) !=
-						KBASE_RESET_GPU_COMMITTED) {
-		/* Reset has already occurred */
-		return;
-	}
-
-	queue_work(kbdev->hwaccess.backend.reset_workq,
-					&kbdev->hwaccess.backend.reset_work);
-}
-
-static void kbasep_try_reset_gpu_early(struct kbase_device *kbdev)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	kbasep_try_reset_gpu_early_locked(kbdev);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-}
-
-/**
- * kbase_prepare_to_reset_gpu_locked - Prepare for resetting the GPU
- * @kbdev: kbase device
- *
- * This function just soft-stops all the slots to ensure that as many jobs as
- * possible are saved.
- *
- * Return:
- *   The function returns a boolean which should be interpreted as follows:
- *   true - Prepared for reset, kbase_reset_gpu_locked should be called.
- *   false - Another thread is performing a reset, kbase_reset_gpu should
- *   not be called.
- */
-bool kbase_prepare_to_reset_gpu_locked(struct kbase_device *kbdev)
-{
-	int i;
-
-	KBASE_DEBUG_ASSERT(kbdev);
-
-	if (atomic_cmpxchg(&kbdev->hwaccess.backend.reset_gpu,
-						KBASE_RESET_GPU_NOT_PENDING,
-						KBASE_RESET_GPU_PREPARED) !=
-						KBASE_RESET_GPU_NOT_PENDING) {
-		/* Some other thread is already resetting the GPU */
-		return false;
-	}
-
-	kbase_disjoint_state_up(kbdev);
-
-	for (i = 0; i < kbdev->gpu_props.num_job_slots; i++)
-		kbase_job_slot_softstop(kbdev, i, NULL);
-
-	return true;
-}
-
-bool kbase_prepare_to_reset_gpu(struct kbase_device *kbdev)
-{
-	unsigned long flags;
-	bool ret;
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	ret = kbase_prepare_to_reset_gpu_locked(kbdev);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	return ret;
-}
-KBASE_EXPORT_TEST_API(kbase_prepare_to_reset_gpu);
-
-/*
- * This function should be called after kbase_prepare_to_reset_gpu if it
- * returns true. It should never be called without a corresponding call to
- * kbase_prepare_to_reset_gpu.
- *
- * After this function is called (or not called if kbase_prepare_to_reset_gpu
- * returned false), the caller should wait for
- * kbdev->hwaccess.backend.reset_waitq to be signalled to know when the reset
- * has completed.
- */
-void kbase_reset_gpu(struct kbase_device *kbdev)
-{
-	KBASE_DEBUG_ASSERT(kbdev);
-
-	/* Note this is an assert/atomic_set because it is a software issue for
-	 * a race to be occuring here */
-	KBASE_DEBUG_ASSERT(atomic_read(&kbdev->hwaccess.backend.reset_gpu) ==
-						KBASE_RESET_GPU_PREPARED);
-	atomic_set(&kbdev->hwaccess.backend.reset_gpu,
-						KBASE_RESET_GPU_COMMITTED);
-
-	dev_err(kbdev->dev, "Preparing to soft-reset GPU: Waiting (upto %d ms) for all jobs to complete soft-stop\n",
-			kbdev->reset_timeout_ms);
-
-	hrtimer_start(&kbdev->hwaccess.backend.reset_timer,
-			HR_TIMER_DELAY_MSEC(kbdev->reset_timeout_ms),
-			HRTIMER_MODE_REL);
-
-	/* Try resetting early */
-	kbasep_try_reset_gpu_early(kbdev);
-}
-KBASE_EXPORT_TEST_API(kbase_reset_gpu);
-
-void kbase_reset_gpu_locked(struct kbase_device *kbdev)
-{
-	KBASE_DEBUG_ASSERT(kbdev);
-
-	/* Note this is an assert/atomic_set because it is a software issue for
-	 * a race to be occuring here */
-	KBASE_DEBUG_ASSERT(atomic_read(&kbdev->hwaccess.backend.reset_gpu) ==
-						KBASE_RESET_GPU_PREPARED);
-	atomic_set(&kbdev->hwaccess.backend.reset_gpu,
-						KBASE_RESET_GPU_COMMITTED);
-
-	dev_err(kbdev->dev, "Preparing to soft-reset GPU: Waiting (upto %d ms) for all jobs to complete soft-stop\n",
-			kbdev->reset_timeout_ms);
-	hrtimer_start(&kbdev->hwaccess.backend.reset_timer,
-			HR_TIMER_DELAY_MSEC(kbdev->reset_timeout_ms),
-			HRTIMER_MODE_REL);
-
-	/* Try resetting early */
-	kbasep_try_reset_gpu_early_locked(kbdev);
-}
-
-void kbase_reset_gpu_silent(struct kbase_device *kbdev)
-{
-	if (atomic_cmpxchg(&kbdev->hwaccess.backend.reset_gpu,
-						KBASE_RESET_GPU_NOT_PENDING,
-						KBASE_RESET_GPU_SILENT) !=
-						KBASE_RESET_GPU_NOT_PENDING) {
-		/* Some other thread is already resetting the GPU */
-		return;
-	}
-
-	kbase_disjoint_state_up(kbdev);
-
-	queue_work(kbdev->hwaccess.backend.reset_workq,
-			&kbdev->hwaccess.backend.reset_work);
-}
-
-bool kbase_reset_gpu_active(struct kbase_device *kbdev)
-{
-	if (atomic_read(&kbdev->hwaccess.backend.reset_gpu) ==
-			KBASE_RESET_GPU_NOT_PENDING)
-		return false;
-
-	return true;
-}
-#endif /* KBASE_GPU_RESET_EN */
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_internal.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_internal.h
deleted file mode 100644
index 1f382b3c1af4..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_internal.h
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * Job Manager backend-specific low-level APIs.
- */
-
-#ifndef _KBASE_JM_HWACCESS_H_
-#define _KBASE_JM_HWACCESS_H_
-
-#include <mali_kbase_hw.h>
-#include <mali_kbase_debug.h>
-#include <linux/atomic.h>
-
-#include <backend/gpu/mali_kbase_jm_rb.h>
-
-/**
- * kbase_job_submit_nolock() - Submit a job to a certain job-slot
- * @kbdev:	Device pointer
- * @katom:	Atom to submit
- * @js:		Job slot to submit on
- *
- * The caller must check kbasep_jm_is_submit_slots_free() != false before
- * calling this.
- *
- * The following locking conditions are made on the caller:
- * - it must hold the hwaccess_lock
- */
-void kbase_job_submit_nolock(struct kbase_device *kbdev,
-					struct kbase_jd_atom *katom, int js);
-
-/**
- * kbase_job_done_slot() - Complete the head job on a particular job-slot
- * @kbdev:		Device pointer
- * @s:			Job slot
- * @completion_code:	Completion code of job reported by GPU
- * @job_tail:		Job tail address reported by GPU
- * @end_timestamp:	Timestamp of job completion
- */
-void kbase_job_done_slot(struct kbase_device *kbdev, int s, u32 completion_code,
-					u64 job_tail, ktime_t *end_timestamp);
-
-#ifdef CONFIG_GPU_TRACEPOINTS
-static inline char *kbasep_make_job_slot_string(int js, char *js_string,
-						size_t js_size)
-{
-	snprintf(js_string, js_size, "job_slot_%i", js);
-	return js_string;
-}
-#endif
-
-/**
- * kbase_job_hw_submit() - Submit a job to the GPU
- * @kbdev:	Device pointer
- * @katom:	Atom to submit
- * @js:		Job slot to submit on
- *
- * The caller must check kbasep_jm_is_submit_slots_free() != false before
- * calling this.
- *
- * The following locking conditions are made on the caller:
- * - it must hold the hwaccess_lock
- */
-void kbase_job_hw_submit(struct kbase_device *kbdev,
-				struct kbase_jd_atom *katom,
-				int js);
-
-/**
- * kbasep_job_slot_soft_or_hard_stop_do_action() - Perform a soft or hard stop
- *						   on the specified atom
- * @kbdev:		Device pointer
- * @js:			Job slot to stop on
- * @action:		The action to perform, either JSn_COMMAND_HARD_STOP or
- *			JSn_COMMAND_SOFT_STOP
- * @core_reqs:		Core requirements of atom to stop
- * @target_katom:	Atom to stop
- *
- * The following locking conditions are made on the caller:
- * - it must hold the hwaccess_lock
- */
-void kbasep_job_slot_soft_or_hard_stop_do_action(struct kbase_device *kbdev,
-					int js,
-					u32 action,
-					base_jd_core_req core_reqs,
-					struct kbase_jd_atom *target_katom);
-
-/**
- * kbase_backend_soft_hard_stop_slot() - Soft or hard stop jobs on a given job
- *					 slot belonging to a given context.
- * @kbdev:	Device pointer
- * @kctx:	Context pointer. May be NULL
- * @katom:	Specific atom to stop. May be NULL
- * @js:		Job slot to hard stop
- * @action:	The action to perform, either JSn_COMMAND_HARD_STOP or
- *		JSn_COMMAND_SOFT_STOP
- *
- * If no context is provided then all jobs on the slot will be soft or hard
- * stopped.
- *
- * If a katom is provided then only that specific atom will be stopped. In this
- * case the kctx parameter is ignored.
- *
- * Jobs that are on the slot but are not yet on the GPU will be unpulled and
- * returned to the job scheduler.
- *
- * Return: true if an atom was stopped, false otherwise
- */
-bool kbase_backend_soft_hard_stop_slot(struct kbase_device *kbdev,
-					struct kbase_context *kctx,
-					int js,
-					struct kbase_jd_atom *katom,
-					u32 action);
-
-/**
- * kbase_job_slot_init - Initialise job slot framework
- * @kbdev: Device pointer
- *
- * Called on driver initialisation
- *
- * Return: 0 on success
- */
-int kbase_job_slot_init(struct kbase_device *kbdev);
-
-/**
- * kbase_job_slot_halt - Halt the job slot framework
- * @kbdev: Device pointer
- *
- * Should prevent any further job slot processing
- */
-void kbase_job_slot_halt(struct kbase_device *kbdev);
-
-/**
- * kbase_job_slot_term - Terminate job slot framework
- * @kbdev: Device pointer
- *
- * Called on driver termination
- */
-void kbase_job_slot_term(struct kbase_device *kbdev);
-
-/**
- * kbase_gpu_cacheclean - Cause a GPU cache clean & flush
- * @kbdev: Device pointer
- *
- * Caller must not be in IRQ context
- */
-void kbase_gpu_cacheclean(struct kbase_device *kbdev);
-
-#endif /* _KBASE_JM_HWACCESS_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_rb.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_rb.c
deleted file mode 100644
index a41e7b5b7afb..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_rb.c
+++ /dev/null
@@ -1,1947 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-/*
- * Register-based HW access backend specific APIs
- */
-
-#include <mali_kbase.h>
-#include <mali_kbase_hwaccess_jm.h>
-#include <mali_kbase_jm.h>
-#include <mali_kbase_js.h>
-#include <mali_kbase_tlstream.h>
-#include <mali_kbase_10969_workaround.h>
-#include <backend/gpu/mali_kbase_cache_policy_backend.h>
-#include <backend/gpu/mali_kbase_device_internal.h>
-#include <backend/gpu/mali_kbase_jm_internal.h>
-#include <backend/gpu/mali_kbase_js_affinity.h>
-#include <backend/gpu/mali_kbase_pm_internal.h>
-
-/* Return whether the specified ringbuffer is empty. HW access lock must be
- * held */
-#define SLOT_RB_EMPTY(rb)   (rb->write_idx == rb->read_idx)
-/* Return number of atoms currently in the specified ringbuffer. HW access lock
- * must be held */
-#define SLOT_RB_ENTRIES(rb) (int)(s8)(rb->write_idx - rb->read_idx)
-
-static void kbase_gpu_release_atom(struct kbase_device *kbdev,
-					struct kbase_jd_atom *katom,
-					ktime_t *end_timestamp);
-
-/**
- * kbase_gpu_enqueue_atom - Enqueue an atom in the HW access ringbuffer
- * @kbdev: Device pointer
- * @katom: Atom to enqueue
- *
- * Context: Caller must hold the HW access lock
- */
-static void kbase_gpu_enqueue_atom(struct kbase_device *kbdev,
-					struct kbase_jd_atom *katom)
-{
-	struct slot_rb *rb = &kbdev->hwaccess.backend.slot_rb[katom->slot_nr];
-
-	WARN_ON(SLOT_RB_ENTRIES(rb) >= SLOT_RB_SIZE);
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	rb->entries[rb->write_idx & SLOT_RB_MASK].katom = katom;
-	rb->write_idx++;
-
-	katom->gpu_rb_state = KBASE_ATOM_GPU_RB_WAITING_BLOCKED;
-}
-
-/**
- * kbase_gpu_dequeue_atom - Remove an atom from the HW access ringbuffer, once
- * it has been completed
- * @kbdev:         Device pointer
- * @js:            Job slot to remove atom from
- * @end_timestamp: Pointer to timestamp of atom completion. May be NULL, in
- *                 which case current time will be used.
- *
- * Context: Caller must hold the HW access lock
- *
- * Return: Atom removed from ringbuffer
- */
-static struct kbase_jd_atom *kbase_gpu_dequeue_atom(struct kbase_device *kbdev,
-						int js,
-						ktime_t *end_timestamp)
-{
-	struct slot_rb *rb = &kbdev->hwaccess.backend.slot_rb[js];
-	struct kbase_jd_atom *katom;
-
-	if (SLOT_RB_EMPTY(rb)) {
-		WARN(1, "GPU ringbuffer unexpectedly empty\n");
-		return NULL;
-	}
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	katom = rb->entries[rb->read_idx & SLOT_RB_MASK].katom;
-
-	kbase_gpu_release_atom(kbdev, katom, end_timestamp);
-
-	rb->read_idx++;
-
-	katom->gpu_rb_state = KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB;
-
-	kbase_js_debug_log_current_affinities(kbdev);
-
-	return katom;
-}
-
-struct kbase_jd_atom *kbase_gpu_inspect(struct kbase_device *kbdev, int js,
-					int idx)
-{
-	struct slot_rb *rb = &kbdev->hwaccess.backend.slot_rb[js];
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	if ((SLOT_RB_ENTRIES(rb) - 1) < idx)
-		return NULL; /* idx out of range */
-
-	return rb->entries[(rb->read_idx + idx) & SLOT_RB_MASK].katom;
-}
-
-struct kbase_jd_atom *kbase_backend_inspect_head(struct kbase_device *kbdev,
-					int js)
-{
-	return kbase_gpu_inspect(kbdev, js, 0);
-}
-
-struct kbase_jd_atom *kbase_backend_inspect_tail(struct kbase_device *kbdev,
-					int js)
-{
-	struct slot_rb *rb = &kbdev->hwaccess.backend.slot_rb[js];
-
-	if (SLOT_RB_EMPTY(rb))
-		return NULL;
-
-	return rb->entries[(rb->write_idx - 1) & SLOT_RB_MASK].katom;
-}
-
-/**
- * kbase_gpu_atoms_submitted - Inspect whether a slot has any atoms currently
- * on the GPU
- * @kbdev:  Device pointer
- * @js:     Job slot to inspect
- *
- * Return: true if there are atoms on the GPU for slot js,
- *         false otherwise
- */
-static bool kbase_gpu_atoms_submitted(struct kbase_device *kbdev, int js)
-{
-	int i;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	for (i = 0; i < SLOT_RB_SIZE; i++) {
-		struct kbase_jd_atom *katom = kbase_gpu_inspect(kbdev, js, i);
-
-		if (!katom)
-			return false;
-		if (katom->gpu_rb_state == KBASE_ATOM_GPU_RB_SUBMITTED ||
-				katom->gpu_rb_state == KBASE_ATOM_GPU_RB_READY)
-			return true;
-	}
-
-	return false;
-}
-
-/**
- * kbase_gpu_atoms_submitted_any() - Inspect whether there are any atoms
- * currently on the GPU
- * @kbdev:  Device pointer
- *
- * Return: true if there are any atoms on the GPU, false otherwise
- */
-static bool kbase_gpu_atoms_submitted_any(struct kbase_device *kbdev)
-{
-	int js;
-	int i;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	for (js = 0; js < kbdev->gpu_props.num_job_slots; js++) {
-		for (i = 0; i < SLOT_RB_SIZE; i++) {
-			struct kbase_jd_atom *katom = kbase_gpu_inspect(kbdev, js, i);
-
-			if (katom && katom->gpu_rb_state == KBASE_ATOM_GPU_RB_SUBMITTED)
-				return true;
-		}
-	}
-	return false;
-}
-
-int kbase_backend_nr_atoms_submitted(struct kbase_device *kbdev, int js)
-{
-	int nr = 0;
-	int i;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	for (i = 0; i < SLOT_RB_SIZE; i++) {
-		struct kbase_jd_atom *katom = kbase_gpu_inspect(kbdev, js, i);
-
-		if (katom && (katom->gpu_rb_state ==
-						KBASE_ATOM_GPU_RB_SUBMITTED))
-			nr++;
-	}
-
-	return nr;
-}
-
-int kbase_backend_nr_atoms_on_slot(struct kbase_device *kbdev, int js)
-{
-	int nr = 0;
-	int i;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	for (i = 0; i < SLOT_RB_SIZE; i++) {
-		if (kbase_gpu_inspect(kbdev, js, i))
-			nr++;
-	}
-
-	return nr;
-}
-
-static int kbase_gpu_nr_atoms_on_slot_min(struct kbase_device *kbdev, int js,
-				enum kbase_atom_gpu_rb_state min_rb_state)
-{
-	int nr = 0;
-	int i;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	for (i = 0; i < SLOT_RB_SIZE; i++) {
-		struct kbase_jd_atom *katom = kbase_gpu_inspect(kbdev, js, i);
-
-		if (katom && (katom->gpu_rb_state >= min_rb_state))
-			nr++;
-	}
-
-	return nr;
-}
-
-/**
- * check_secure_atom - Check if the given atom is in the given secure state and
- *                     has a ringbuffer state of at least
- *                     KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_TRANSITION
- * @katom:  Atom pointer
- * @secure: Desired secure state
- *
- * Return: true if atom is in the given state, false otherwise
- */
-static bool check_secure_atom(struct kbase_jd_atom *katom, bool secure)
-{
-	if (katom->gpu_rb_state >=
-			KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_TRANSITION &&
-			((kbase_jd_katom_is_protected(katom) && secure) ||
-			(!kbase_jd_katom_is_protected(katom) && !secure)))
-		return true;
-
-	return false;
-}
-
-/**
- * kbase_gpu_check_secure_atoms - Check if there are any atoms in the given
- *                                secure state in the ringbuffers of at least
- *                                state
- *                                KBASE_ATOM_GPU_RB_WAITING_FOR_CORE_AVAILABLE
- * @kbdev:  Device pointer
- * @secure: Desired secure state
- *
- * Return: true if any atoms are in the given state, false otherwise
- */
-static bool kbase_gpu_check_secure_atoms(struct kbase_device *kbdev,
-		bool secure)
-{
-	int js, i;
-
-	for (js = 0; js < kbdev->gpu_props.num_job_slots; js++) {
-		for (i = 0; i < SLOT_RB_SIZE; i++) {
-			struct kbase_jd_atom *katom = kbase_gpu_inspect(kbdev,
-					js, i);
-
-			if (katom) {
-				if (check_secure_atom(katom, secure))
-					return true;
-			}
-		}
-	}
-
-	return false;
-}
-
-int kbase_backend_slot_free(struct kbase_device *kbdev, int js)
-{
-	if (atomic_read(&kbdev->hwaccess.backend.reset_gpu) !=
-						KBASE_RESET_GPU_NOT_PENDING) {
-		/* The GPU is being reset - so prevent submission */
-		return 0;
-	}
-
-	return SLOT_RB_SIZE - kbase_backend_nr_atoms_on_slot(kbdev, js);
-}
-
-
-static void kbasep_js_job_check_deref_cores(struct kbase_device *kbdev,
-						struct kbase_jd_atom *katom);
-
-static bool kbasep_js_job_check_ref_cores(struct kbase_device *kbdev,
-						int js,
-						struct kbase_jd_atom *katom)
-{
-	/* The most recently checked affinity. Having this at this scope allows
-	 * us to guarantee that we've checked the affinity in this function
-	 * call.
-	 */
-	u64 recently_chosen_affinity = 0;
-	bool chosen_affinity = false;
-	bool retry;
-
-	do {
-		retry = false;
-
-		/* NOTE: The following uses a number of FALLTHROUGHs to optimize
-		 * the calls to this function. Ending of the function is
-		 * indicated by BREAK OUT */
-		switch (katom->coreref_state) {
-			/* State when job is first attempted to be run */
-		case KBASE_ATOM_COREREF_STATE_NO_CORES_REQUESTED:
-			KBASE_DEBUG_ASSERT(katom->affinity == 0);
-
-			/* Compute affinity */
-			if (false == kbase_js_choose_affinity(
-					&recently_chosen_affinity, kbdev, katom,
-									js)) {
-				/* No cores are currently available */
-				/* *** BREAK OUT: No state transition *** */
-				break;
-			}
-
-			chosen_affinity = true;
-
-			/* Request the cores */
-			kbase_pm_request_cores(kbdev,
-					katom->core_req & BASE_JD_REQ_T,
-						recently_chosen_affinity);
-
-			katom->affinity = recently_chosen_affinity;
-
-			/* Proceed to next state */
-			katom->coreref_state =
-			KBASE_ATOM_COREREF_STATE_WAITING_FOR_REQUESTED_CORES;
-
-			/* ***FALLTHROUGH: TRANSITION TO HIGHER STATE*** */
-
-		case KBASE_ATOM_COREREF_STATE_WAITING_FOR_REQUESTED_CORES:
-			{
-				enum kbase_pm_cores_ready cores_ready;
-
-				KBASE_DEBUG_ASSERT(katom->affinity != 0 ||
-					(katom->core_req & BASE_JD_REQ_T));
-
-				cores_ready = kbase_pm_register_inuse_cores(
-						kbdev,
-						katom->core_req & BASE_JD_REQ_T,
-						katom->affinity);
-				if (cores_ready == KBASE_NEW_AFFINITY) {
-					/* Affinity no longer valid - return to
-					 * previous state */
-					kbasep_js_job_check_deref_cores(kbdev,
-									katom);
-					KBASE_TRACE_ADD_SLOT_INFO(kbdev,
-					JS_CORE_REF_REGISTER_INUSE_FAILED,
-							katom->kctx, katom,
-							katom->jc, js,
-							(u32) katom->affinity);
-					/* *** BREAK OUT: Return to previous
-					 * state, retry *** */
-					retry = true;
-					break;
-				}
-				if (cores_ready == KBASE_CORES_NOT_READY) {
-					/* Stay in this state and return, to
-					 * retry at this state later */
-					KBASE_TRACE_ADD_SLOT_INFO(kbdev,
-					JS_CORE_REF_REGISTER_INUSE_FAILED,
-							katom->kctx, katom,
-							katom->jc, js,
-							(u32) katom->affinity);
-					/* *** BREAK OUT: No state transition
-					 * *** */
-					break;
-				}
-				/* Proceed to next state */
-				katom->coreref_state =
-				KBASE_ATOM_COREREF_STATE_RECHECK_AFFINITY;
-			}
-
-			/* ***FALLTHROUGH: TRANSITION TO HIGHER STATE*** */
-
-		case KBASE_ATOM_COREREF_STATE_RECHECK_AFFINITY:
-			KBASE_DEBUG_ASSERT(katom->affinity != 0 ||
-					(katom->core_req & BASE_JD_REQ_T));
-
-			/* Optimize out choosing the affinity twice in the same
-			 * function call */
-			if (chosen_affinity == false) {
-				/* See if the affinity changed since a previous
-				 * call. */
-				if (false == kbase_js_choose_affinity(
-						&recently_chosen_affinity,
-							kbdev, katom, js)) {
-					/* No cores are currently available */
-					kbasep_js_job_check_deref_cores(kbdev,
-									katom);
-					KBASE_TRACE_ADD_SLOT_INFO(kbdev,
-					JS_CORE_REF_REQUEST_ON_RECHECK_FAILED,
-						katom->kctx, katom,
-						katom->jc, js,
-						(u32) recently_chosen_affinity);
-					/* *** BREAK OUT: Transition to lower
-					 * state *** */
-					break;
-				}
-				chosen_affinity = true;
-			}
-
-			/* Now see if this requires a different set of cores */
-			if (recently_chosen_affinity != katom->affinity) {
-				enum kbase_pm_cores_ready cores_ready;
-
-				kbase_pm_request_cores(kbdev,
-						katom->core_req & BASE_JD_REQ_T,
-						recently_chosen_affinity);
-
-				/* Register new cores whilst we still hold the
-				 * old ones, to minimize power transitions */
-				cores_ready =
-					kbase_pm_register_inuse_cores(kbdev,
-						katom->core_req & BASE_JD_REQ_T,
-						recently_chosen_affinity);
-				kbasep_js_job_check_deref_cores(kbdev, katom);
-
-				/* Fixup the state that was reduced by
-				 * deref_cores: */
-				katom->coreref_state =
-				KBASE_ATOM_COREREF_STATE_RECHECK_AFFINITY;
-				katom->affinity = recently_chosen_affinity;
-				if (cores_ready == KBASE_NEW_AFFINITY) {
-					/* Affinity no longer valid - return to
-					 * previous state */
-					katom->coreref_state =
-					KBASE_ATOM_COREREF_STATE_WAITING_FOR_REQUESTED_CORES;
-
-					kbasep_js_job_check_deref_cores(kbdev,
-									katom);
-
-					KBASE_TRACE_ADD_SLOT_INFO(kbdev,
-					JS_CORE_REF_REGISTER_INUSE_FAILED,
-							katom->kctx, katom,
-							katom->jc, js,
-							(u32) katom->affinity);
-					/* *** BREAK OUT: Return to previous
-					 * state, retry *** */
-					retry = true;
-					break;
-				}
-				/* Now might be waiting for powerup again, with
-				 * a new affinity */
-				if (cores_ready == KBASE_CORES_NOT_READY) {
-					/* Return to previous state */
-					katom->coreref_state =
-					KBASE_ATOM_COREREF_STATE_WAITING_FOR_REQUESTED_CORES;
-					KBASE_TRACE_ADD_SLOT_INFO(kbdev,
-					JS_CORE_REF_REGISTER_ON_RECHECK_FAILED,
-							katom->kctx, katom,
-							katom->jc, js,
-							(u32) katom->affinity);
-					/* *** BREAK OUT: Transition to lower
-					 * state *** */
-					break;
-				}
-			}
-			/* Proceed to next state */
-			katom->coreref_state =
-			KBASE_ATOM_COREREF_STATE_CHECK_AFFINITY_VIOLATIONS;
-
-			/* ***FALLTHROUGH: TRANSITION TO HIGHER STATE*** */
-		case KBASE_ATOM_COREREF_STATE_CHECK_AFFINITY_VIOLATIONS:
-			KBASE_DEBUG_ASSERT(katom->affinity != 0 ||
-					(katom->core_req & BASE_JD_REQ_T));
-			KBASE_DEBUG_ASSERT(katom->affinity ==
-						recently_chosen_affinity);
-
-			/* Note: this is where the caller must've taken the
-			 * hwaccess_lock */
-
-			/* Check for affinity violations - if there are any,
-			 * then we just ask the caller to requeue and try again
-			 * later */
-			if (kbase_js_affinity_would_violate(kbdev, js,
-					katom->affinity) != false) {
-				/* Return to previous state */
-				katom->coreref_state =
-				KBASE_ATOM_COREREF_STATE_RECHECK_AFFINITY;
-				/* *** BREAK OUT: Transition to lower state ***
-				 */
-				KBASE_TRACE_ADD_SLOT_INFO(kbdev,
-					JS_CORE_REF_AFFINITY_WOULD_VIOLATE,
-					katom->kctx, katom, katom->jc, js,
-					(u32) katom->affinity);
-				break;
-			}
-
-			/* No affinity violations would result, so the cores are
-			 * ready */
-			katom->coreref_state = KBASE_ATOM_COREREF_STATE_READY;
-			/* *** BREAK OUT: Cores Ready *** */
-			break;
-
-		default:
-			KBASE_DEBUG_ASSERT_MSG(false,
-					"Unhandled kbase_atom_coreref_state %d",
-							katom->coreref_state);
-			break;
-		}
-	} while (retry != false);
-
-	return (katom->coreref_state == KBASE_ATOM_COREREF_STATE_READY);
-}
-
-static void kbasep_js_job_check_deref_cores(struct kbase_device *kbdev,
-						struct kbase_jd_atom *katom)
-{
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(katom != NULL);
-
-	switch (katom->coreref_state) {
-	case KBASE_ATOM_COREREF_STATE_READY:
-		/* State where atom was submitted to the HW - just proceed to
-		 * power-down */
-		KBASE_DEBUG_ASSERT(katom->affinity != 0 ||
-					(katom->core_req & BASE_JD_REQ_T));
-
-		/* *** FALLTHROUGH *** */
-
-	case KBASE_ATOM_COREREF_STATE_RECHECK_AFFINITY:
-		/* State where cores were registered */
-		KBASE_DEBUG_ASSERT(katom->affinity != 0 ||
-					(katom->core_req & BASE_JD_REQ_T));
-		kbase_pm_release_cores(kbdev, katom->core_req & BASE_JD_REQ_T,
-							katom->affinity);
-
-		break;
-
-	case KBASE_ATOM_COREREF_STATE_WAITING_FOR_REQUESTED_CORES:
-		/* State where cores were requested, but not registered */
-		KBASE_DEBUG_ASSERT(katom->affinity != 0 ||
-					(katom->core_req & BASE_JD_REQ_T));
-		kbase_pm_unrequest_cores(kbdev, katom->core_req & BASE_JD_REQ_T,
-							katom->affinity);
-		break;
-
-	case KBASE_ATOM_COREREF_STATE_NO_CORES_REQUESTED:
-		/* Initial state - nothing required */
-		KBASE_DEBUG_ASSERT(katom->affinity == 0);
-		break;
-
-	default:
-		KBASE_DEBUG_ASSERT_MSG(false,
-						"Unhandled coreref_state: %d",
-							katom->coreref_state);
-		break;
-	}
-
-	katom->affinity = 0;
-	katom->coreref_state = KBASE_ATOM_COREREF_STATE_NO_CORES_REQUESTED;
-}
-
-static void kbasep_js_job_check_deref_cores_nokatom(struct kbase_device *kbdev,
-		base_jd_core_req core_req, u64 affinity,
-		enum kbase_atom_coreref_state coreref_state)
-{
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	switch (coreref_state) {
-	case KBASE_ATOM_COREREF_STATE_READY:
-		/* State where atom was submitted to the HW - just proceed to
-		 * power-down */
-		KBASE_DEBUG_ASSERT(affinity != 0 ||
-					(core_req & BASE_JD_REQ_T));
-
-		/* *** FALLTHROUGH *** */
-
-	case KBASE_ATOM_COREREF_STATE_RECHECK_AFFINITY:
-		/* State where cores were registered */
-		KBASE_DEBUG_ASSERT(affinity != 0 ||
-					(core_req & BASE_JD_REQ_T));
-		kbase_pm_release_cores(kbdev, core_req & BASE_JD_REQ_T,
-							affinity);
-
-		break;
-
-	case KBASE_ATOM_COREREF_STATE_WAITING_FOR_REQUESTED_CORES:
-		/* State where cores were requested, but not registered */
-		KBASE_DEBUG_ASSERT(affinity != 0 ||
-					(core_req & BASE_JD_REQ_T));
-		kbase_pm_unrequest_cores(kbdev, core_req & BASE_JD_REQ_T,
-							affinity);
-		break;
-
-	case KBASE_ATOM_COREREF_STATE_NO_CORES_REQUESTED:
-		/* Initial state - nothing required */
-		KBASE_DEBUG_ASSERT(affinity == 0);
-		break;
-
-	default:
-		KBASE_DEBUG_ASSERT_MSG(false,
-						"Unhandled coreref_state: %d",
-							coreref_state);
-		break;
-	}
-}
-
-static void kbase_gpu_release_atom(struct kbase_device *kbdev,
-					struct kbase_jd_atom *katom,
-					ktime_t *end_timestamp)
-{
-	struct kbase_context *kctx = katom->kctx;
-
-	switch (katom->gpu_rb_state) {
-	case KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB:
-		/* Should be impossible */
-		WARN(1, "Attempting to release atom not in ringbuffer\n");
-		break;
-
-	case KBASE_ATOM_GPU_RB_SUBMITTED:
-		/* Inform power management at start/finish of atom so it can
-		 * update its GPU utilisation metrics. Mark atom as not
-		 * submitted beforehand. */
-		katom->gpu_rb_state = KBASE_ATOM_GPU_RB_READY;
-		kbase_pm_metrics_update(kbdev, end_timestamp);
-
-		if (katom->core_req & BASE_JD_REQ_PERMON)
-			kbase_pm_release_gpu_cycle_counter_nolock(kbdev);
-		/* ***FALLTHROUGH: TRANSITION TO LOWER STATE*** */
-
-		KBASE_TLSTREAM_TL_NRET_ATOM_LPU(katom,
-			&kbdev->gpu_props.props.raw_props.js_features
-				[katom->slot_nr]);
-		KBASE_TLSTREAM_TL_NRET_ATOM_AS(katom, &kbdev->as[kctx->as_nr]);
-		KBASE_TLSTREAM_TL_NRET_CTX_LPU(kctx,
-			&kbdev->gpu_props.props.raw_props.js_features
-				[katom->slot_nr]);
-
-	case KBASE_ATOM_GPU_RB_READY:
-		/* ***FALLTHROUGH: TRANSITION TO LOWER STATE*** */
-
-	case KBASE_ATOM_GPU_RB_WAITING_AFFINITY:
-		kbase_js_affinity_release_slot_cores(kbdev, katom->slot_nr,
-							katom->affinity);
-		/* ***FALLTHROUGH: TRANSITION TO LOWER STATE*** */
-
-	case KBASE_ATOM_GPU_RB_WAITING_FOR_CORE_AVAILABLE:
-		break;
-
-	case KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_TRANSITION:
-		if (katom->protected_state.enter !=
-				KBASE_ATOM_ENTER_PROTECTED_CHECK ||
-				katom->protected_state.exit !=
-				KBASE_ATOM_EXIT_PROTECTED_CHECK)
-			kbdev->protected_mode_transition = false;
-
-		if (kbase_jd_katom_is_protected(katom) &&
-				(katom->protected_state.enter ==
-				KBASE_ATOM_ENTER_PROTECTED_IDLE_L2)) {
-			kbase_vinstr_resume(kbdev->vinstr_ctx);
-
-			/* Go back to configured model for IPA */
-			kbase_ipa_model_use_configured_locked(kbdev);
-		}
-
-
-		/* ***FALLTHROUGH: TRANSITION TO LOWER STATE*** */
-
-	case KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_PREV:
-		/* ***FALLTHROUGH: TRANSITION TO LOWER STATE*** */
-
-	case KBASE_ATOM_GPU_RB_WAITING_BLOCKED:
-		/* ***FALLTHROUGH: TRANSITION TO LOWER STATE*** */
-
-	case KBASE_ATOM_GPU_RB_RETURN_TO_JS:
-		break;
-	}
-
-	katom->gpu_rb_state = KBASE_ATOM_GPU_RB_WAITING_BLOCKED;
-	katom->protected_state.exit = KBASE_ATOM_EXIT_PROTECTED_CHECK;
-}
-
-static void kbase_gpu_mark_atom_for_return(struct kbase_device *kbdev,
-						struct kbase_jd_atom *katom)
-{
-	kbase_gpu_release_atom(kbdev, katom, NULL);
-	katom->gpu_rb_state = KBASE_ATOM_GPU_RB_RETURN_TO_JS;
-}
-
-static inline bool kbase_gpu_rmu_workaround(struct kbase_device *kbdev, int js)
-{
-	struct kbase_backend_data *backend = &kbdev->hwaccess.backend;
-	bool slot_busy[3];
-
-	if (!kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8987))
-		return true;
-	slot_busy[0] = kbase_gpu_nr_atoms_on_slot_min(kbdev, 0,
-					KBASE_ATOM_GPU_RB_WAITING_AFFINITY);
-	slot_busy[1] = kbase_gpu_nr_atoms_on_slot_min(kbdev, 1,
-					KBASE_ATOM_GPU_RB_WAITING_AFFINITY);
-	slot_busy[2] = kbase_gpu_nr_atoms_on_slot_min(kbdev, 2,
-					KBASE_ATOM_GPU_RB_WAITING_AFFINITY);
-
-	if ((js == 2 && !(slot_busy[0] || slot_busy[1])) ||
-		(js != 2 && !slot_busy[2]))
-		return true;
-
-	/* Don't submit slot 2 atom while GPU has jobs on slots 0/1 */
-	if (js == 2 && (kbase_gpu_atoms_submitted(kbdev, 0) ||
-			kbase_gpu_atoms_submitted(kbdev, 1) ||
-			backend->rmu_workaround_flag))
-		return false;
-
-	/* Don't submit slot 0/1 atom while GPU has jobs on slot 2 */
-	if (js != 2 && (kbase_gpu_atoms_submitted(kbdev, 2) ||
-			!backend->rmu_workaround_flag))
-		return false;
-
-	backend->rmu_workaround_flag = !backend->rmu_workaround_flag;
-
-	return true;
-}
-
-/**
- * other_slots_busy - Determine if any job slots other than @js are currently
- *                    running atoms
- * @kbdev: Device pointer
- * @js:    Job slot
- *
- * Return: true if any slots other than @js are busy, false otherwise
- */
-static inline bool other_slots_busy(struct kbase_device *kbdev, int js)
-{
-	int slot;
-
-	for (slot = 0; slot < kbdev->gpu_props.num_job_slots; slot++) {
-		if (slot == js)
-			continue;
-
-		if (kbase_gpu_nr_atoms_on_slot_min(kbdev, slot,
-				KBASE_ATOM_GPU_RB_SUBMITTED))
-			return true;
-	}
-
-	return false;
-}
-
-static inline bool kbase_gpu_in_protected_mode(struct kbase_device *kbdev)
-{
-	return kbdev->protected_mode;
-}
-
-static int kbase_gpu_protected_mode_enter(struct kbase_device *kbdev)
-{
-	int err = -EINVAL;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	WARN_ONCE(!kbdev->protected_ops,
-			"Cannot enter protected mode: protected callbacks not specified.\n");
-
-	/*
-	 * When entering into protected mode, we must ensure that the
-	 * GPU is not operating in coherent mode as well. This is to
-	 * ensure that no protected memory can be leaked.
-	 */
-	if (kbdev->system_coherency == COHERENCY_ACE)
-		kbase_cache_set_coherency_mode(kbdev, COHERENCY_ACE_LITE);
-
-	if (kbdev->protected_ops) {
-		/* Switch GPU to protected mode */
-		err = kbdev->protected_ops->protected_mode_enable(
-				kbdev->protected_dev);
-
-		if (err)
-			dev_warn(kbdev->dev, "Failed to enable protected mode: %d\n",
-					err);
-		else
-			kbdev->protected_mode = true;
-	}
-
-	return err;
-}
-
-static int kbase_gpu_protected_mode_reset(struct kbase_device *kbdev)
-{
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	WARN_ONCE(!kbdev->protected_ops,
-			"Cannot exit protected mode: protected callbacks not specified.\n");
-
-	if (!kbdev->protected_ops)
-		return -EINVAL;
-
-	/* The protected mode disable callback will be called as part of reset
-	 */
-	kbase_reset_gpu_silent(kbdev);
-
-	return 0;
-}
-
-static int kbase_jm_enter_protected_mode(struct kbase_device *kbdev,
-		struct kbase_jd_atom **katom, int idx, int js)
-{
-	int err = 0;
-
-	switch (katom[idx]->protected_state.enter) {
-	case KBASE_ATOM_ENTER_PROTECTED_CHECK:
-		KBASE_TLSTREAM_AUX_PROTECTED_ENTER_START(kbdev);
-		/* The checks in KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_PREV
-		 * should ensure that we are not already transitiong, and that
-		 * there are no atoms currently on the GPU. */
-		WARN_ON(kbdev->protected_mode_transition);
-		WARN_ON(kbase_gpu_atoms_submitted_any(kbdev));
-
-		kbdev->protected_mode_transition = true;
-		katom[idx]->protected_state.enter =
-			KBASE_ATOM_ENTER_PROTECTED_VINSTR;
-
-		/* ***FALLTHROUGH: TRANSITION TO HIGHER STATE*** */
-
-	case KBASE_ATOM_ENTER_PROTECTED_VINSTR:
-		if (kbase_vinstr_try_suspend(kbdev->vinstr_ctx) < 0) {
-			/*
-			 * We can't switch now because
-			 * the vinstr core state switch
-			 * is not done yet.
-			 */
-			return -EAGAIN;
-		}
-
-		/* Use generic model for IPA in protected mode */
-		kbase_ipa_model_use_fallback_locked(kbdev);
-
-		/* Once reaching this point GPU must be
-		 * switched to protected mode or vinstr
-		 * re-enabled. */
-
-		/*
-		 * Not in correct mode, begin protected mode switch.
-		 * Entering protected mode requires us to power down the L2,
-		 * and drop out of fully coherent mode.
-		 */
-		katom[idx]->protected_state.enter =
-			KBASE_ATOM_ENTER_PROTECTED_IDLE_L2;
-
-		kbase_pm_update_cores_state_nolock(kbdev);
-
-		/* ***FALLTHROUGH: TRANSITION TO HIGHER STATE*** */
-
-	case KBASE_ATOM_ENTER_PROTECTED_IDLE_L2:
-		/* Avoid unnecessary waiting on non-ACE platforms. */
-		if (kbdev->current_gpu_coherency_mode == COHERENCY_ACE) {
-			if (kbase_pm_get_ready_cores(kbdev, KBASE_PM_CORE_L2) ||
-				kbase_pm_get_trans_cores(kbdev, KBASE_PM_CORE_L2)) {
-				/*
-				* The L2 is still powered, wait for all the users to
-				* finish with it before doing the actual reset.
-				*/
-				return -EAGAIN;
-			}
-		}
-
-		katom[idx]->protected_state.enter =
-			KBASE_ATOM_ENTER_PROTECTED_FINISHED;
-
-		/* ***FALLTHROUGH: TRANSITION TO HIGHER STATE*** */
-
-	case KBASE_ATOM_ENTER_PROTECTED_FINISHED:
-
-		/* No jobs running, so we can switch GPU mode right now. */
-		err = kbase_gpu_protected_mode_enter(kbdev);
-
-		/*
-		 * Regardless of result, we are no longer transitioning
-		 * the GPU.
-		 */
-		kbdev->protected_mode_transition = false;
-		KBASE_TLSTREAM_AUX_PROTECTED_ENTER_END(kbdev);
-		if (err) {
-			/*
-			 * Failed to switch into protected mode, resume
-			 * vinstr core and fail atom.
-			 */
-			kbase_vinstr_resume(kbdev->vinstr_ctx);
-			katom[idx]->event_code = BASE_JD_EVENT_JOB_INVALID;
-			kbase_gpu_mark_atom_for_return(kbdev, katom[idx]);
-			/* Only return if head atom or previous atom
-			 * already removed - as atoms must be returned
-			 * in order. */
-			if (idx == 0 || katom[0]->gpu_rb_state ==
-					KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB) {
-				kbase_gpu_dequeue_atom(kbdev, js, NULL);
-				kbase_jm_return_atom_to_js(kbdev, katom[idx]);
-			}
-
-			/* Go back to configured model for IPA */
-			kbase_ipa_model_use_configured_locked(kbdev);
-
-			return -EINVAL;
-		}
-
-		/* Protected mode sanity checks. */
-		KBASE_DEBUG_ASSERT_MSG(
-			kbase_jd_katom_is_protected(katom[idx]) ==
-			kbase_gpu_in_protected_mode(kbdev),
-			"Protected mode of atom (%d) doesn't match protected mode of GPU (%d)",
-			kbase_jd_katom_is_protected(katom[idx]),
-			kbase_gpu_in_protected_mode(kbdev));
-		katom[idx]->gpu_rb_state =
-			KBASE_ATOM_GPU_RB_READY;
-	}
-
-	return 0;
-}
-
-static int kbase_jm_exit_protected_mode(struct kbase_device *kbdev,
-		struct kbase_jd_atom **katom, int idx, int js)
-{
-	int err = 0;
-
-
-	switch (katom[idx]->protected_state.exit) {
-	case KBASE_ATOM_EXIT_PROTECTED_CHECK:
-		KBASE_TLSTREAM_AUX_PROTECTED_LEAVE_START(kbdev);
-		/* The checks in KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_PREV
-		 * should ensure that we are not already transitiong, and that
-		 * there are no atoms currently on the GPU. */
-		WARN_ON(kbdev->protected_mode_transition);
-		WARN_ON(kbase_gpu_atoms_submitted_any(kbdev));
-
-		/*
-		 * Exiting protected mode requires a reset, but first the L2
-		 * needs to be powered down to ensure it's not active when the
-		 * reset is issued.
-		 */
-		katom[idx]->protected_state.exit =
-				KBASE_ATOM_EXIT_PROTECTED_IDLE_L2;
-
-		kbdev->protected_mode_transition = true;
-		kbase_pm_update_cores_state_nolock(kbdev);
-
-		/* ***FALLTHROUGH: TRANSITION TO HIGHER STATE*** */
-	case KBASE_ATOM_EXIT_PROTECTED_IDLE_L2:
-		if (kbase_pm_get_ready_cores(kbdev, KBASE_PM_CORE_L2) ||
-				kbase_pm_get_trans_cores(kbdev, KBASE_PM_CORE_L2)) {
-			/*
-			 * The L2 is still powered, wait for all the users to
-			 * finish with it before doing the actual reset.
-			 */
-			return -EAGAIN;
-		}
-		katom[idx]->protected_state.exit =
-				KBASE_ATOM_EXIT_PROTECTED_RESET;
-
-		/* ***FALLTHROUGH: TRANSITION TO HIGHER STATE*** */
-
-	case KBASE_ATOM_EXIT_PROTECTED_RESET:
-		/* Issue the reset to the GPU */
-		err = kbase_gpu_protected_mode_reset(kbdev);
-
-		if (err) {
-			kbdev->protected_mode_transition = false;
-
-			/* Failed to exit protected mode, fail atom */
-			katom[idx]->event_code = BASE_JD_EVENT_JOB_INVALID;
-			kbase_gpu_mark_atom_for_return(kbdev, katom[idx]);
-			/* Only return if head atom or previous atom
-			 * already removed - as atoms must be returned
-			 * in order */
-			if (idx == 0 || katom[0]->gpu_rb_state ==
-					KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB) {
-				kbase_gpu_dequeue_atom(kbdev, js, NULL);
-				kbase_jm_return_atom_to_js(kbdev, katom[idx]);
-			}
-
-			kbase_vinstr_resume(kbdev->vinstr_ctx);
-
-			/* Use generic model for IPA in protected mode */
-			kbase_ipa_model_use_fallback_locked(kbdev);
-
-			return -EINVAL;
-		}
-
-		katom[idx]->protected_state.exit =
-				KBASE_ATOM_EXIT_PROTECTED_RESET_WAIT;
-
-		/* ***FALLTHROUGH: TRANSITION TO HIGHER STATE*** */
-
-	case KBASE_ATOM_EXIT_PROTECTED_RESET_WAIT:
-		/* A GPU reset is issued when exiting protected mode. Once the
-		 * reset is done all atoms' state will also be reset. For this
-		 * reason, if the atom is still in this state we can safely
-		 * say that the reset has not completed i.e., we have not
-		 * finished exiting protected mode yet.
-		 */
-		return -EAGAIN;
-	}
-
-	return 0;
-}
-
-void kbase_backend_slot_update(struct kbase_device *kbdev)
-{
-	int js;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	for (js = 0; js < kbdev->gpu_props.num_job_slots; js++) {
-		struct kbase_jd_atom *katom[2];
-		int idx;
-
-		katom[0] = kbase_gpu_inspect(kbdev, js, 0);
-		katom[1] = kbase_gpu_inspect(kbdev, js, 1);
-		WARN_ON(katom[1] && !katom[0]);
-
-		for (idx = 0; idx < SLOT_RB_SIZE; idx++) {
-			bool cores_ready;
-			int ret;
-
-			if (!katom[idx])
-				continue;
-
-			switch (katom[idx]->gpu_rb_state) {
-			case KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB:
-				/* Should be impossible */
-				WARN(1, "Attempting to update atom not in ringbuffer\n");
-				break;
-
-			case KBASE_ATOM_GPU_RB_WAITING_BLOCKED:
-				if (katom[idx]->atom_flags &
-						KBASE_KATOM_FLAG_X_DEP_BLOCKED)
-					break;
-
-				katom[idx]->gpu_rb_state =
-				KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_PREV;
-
-			/* ***FALLTHROUGH: TRANSITION TO HIGHER STATE*** */
-
-			case KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_PREV:
-				if (kbase_gpu_check_secure_atoms(kbdev,
-						!kbase_jd_katom_is_protected(
-						katom[idx])))
-					break;
-
-				if ((idx == 1) && (kbase_jd_katom_is_protected(
-								katom[0]) !=
-						kbase_jd_katom_is_protected(
-								katom[1])))
-					break;
-
-				if (kbdev->protected_mode_transition)
-					break;
-
-				katom[idx]->gpu_rb_state =
-					KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_TRANSITION;
-
-			/* ***FALLTHROUGH: TRANSITION TO HIGHER STATE*** */
-
-			case KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_TRANSITION:
-
-				/*
-				 * Exiting protected mode must be done before
-				 * the references on the cores are taken as
-				 * a power down the L2 is required which
-				 * can't happen after the references for this
-				 * atom are taken.
-				 */
-
-				if (!kbase_gpu_in_protected_mode(kbdev) &&
-					kbase_jd_katom_is_protected(katom[idx])) {
-					/* Atom needs to transition into protected mode. */
-					ret = kbase_jm_enter_protected_mode(kbdev,
-							katom, idx, js);
-					if (ret)
-						break;
-				} else if (kbase_gpu_in_protected_mode(kbdev) &&
-					!kbase_jd_katom_is_protected(katom[idx])) {
-					/* Atom needs to transition out of protected mode. */
-					ret = kbase_jm_exit_protected_mode(kbdev,
-							katom, idx, js);
-					if (ret)
-						break;
-				}
-				katom[idx]->protected_state.exit =
-						KBASE_ATOM_EXIT_PROTECTED_CHECK;
-
-				/* Atom needs no protected mode transition. */
-
-				katom[idx]->gpu_rb_state =
-					KBASE_ATOM_GPU_RB_WAITING_FOR_CORE_AVAILABLE;
-
-			/* ***FALLTHROUGH: TRANSITION TO HIGHER STATE*** */
-
-			case KBASE_ATOM_GPU_RB_WAITING_FOR_CORE_AVAILABLE:
-				if (katom[idx]->will_fail_event_code) {
-					kbase_gpu_mark_atom_for_return(kbdev,
-							katom[idx]);
-					/* Set EVENT_DONE so this atom will be
-					   completed, not unpulled. */
-					katom[idx]->event_code =
-						BASE_JD_EVENT_DONE;
-					/* Only return if head atom or previous
-					 * atom already removed - as atoms must
-					 * be returned in order. */
-					if (idx == 0 ||	katom[0]->gpu_rb_state ==
-							KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB) {
-						kbase_gpu_dequeue_atom(kbdev, js, NULL);
-						kbase_jm_return_atom_to_js(kbdev, katom[idx]);
-					}
-					break;
-				}
-
-				cores_ready =
-					kbasep_js_job_check_ref_cores(kbdev, js,
-								katom[idx]);
-
-				if (katom[idx]->event_code ==
-						BASE_JD_EVENT_PM_EVENT) {
-					katom[idx]->gpu_rb_state =
-						KBASE_ATOM_GPU_RB_RETURN_TO_JS;
-					break;
-				}
-
-				if (!cores_ready)
-					break;
-
-				kbase_js_affinity_retain_slot_cores(kbdev, js,
-							katom[idx]->affinity);
-				katom[idx]->gpu_rb_state =
-					KBASE_ATOM_GPU_RB_WAITING_AFFINITY;
-
-			/* ***FALLTHROUGH: TRANSITION TO HIGHER STATE*** */
-
-			case KBASE_ATOM_GPU_RB_WAITING_AFFINITY:
-				if (!kbase_gpu_rmu_workaround(kbdev, js))
-					break;
-
-				katom[idx]->gpu_rb_state =
-					KBASE_ATOM_GPU_RB_READY;
-
-			/* ***FALLTHROUGH: TRANSITION TO HIGHER STATE*** */
-
-			case KBASE_ATOM_GPU_RB_READY:
-
-				if (idx == 1) {
-					/* Only submit if head atom or previous
-					 * atom already submitted */
-					if ((katom[0]->gpu_rb_state !=
-						KBASE_ATOM_GPU_RB_SUBMITTED &&
-						katom[0]->gpu_rb_state !=
-					KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB))
-						break;
-
-					/* If intra-slot serialization in use
-					 * then don't submit atom to NEXT slot
-					 */
-					if (kbdev->serialize_jobs &
-						KBASE_SERIALIZE_INTRA_SLOT)
-						break;
-				}
-
-				/* If inter-slot serialization in use then don't
-				 * submit atom if any other slots are in use */
-				if ((kbdev->serialize_jobs &
-						KBASE_SERIALIZE_INTER_SLOT) &&
-						other_slots_busy(kbdev, js))
-					break;
-
-				if ((kbdev->serialize_jobs &
-						KBASE_SERIALIZE_RESET) &&
-						kbase_reset_gpu_active(kbdev))
-					break;
-
-				/* Check if this job needs the cycle counter
-				 * enabled before submission */
-				if (katom[idx]->core_req & BASE_JD_REQ_PERMON)
-					kbase_pm_request_gpu_cycle_counter_l2_is_on(
-									kbdev);
-
-				kbase_job_hw_submit(kbdev, katom[idx], js);
-				katom[idx]->gpu_rb_state =
-						KBASE_ATOM_GPU_RB_SUBMITTED;
-
-				/* Inform power management at start/finish of
-				 * atom so it can update its GPU utilisation
-				 * metrics. */
-				kbase_pm_metrics_update(kbdev,
-						&katom[idx]->start_timestamp);
-
-			/* ***FALLTHROUGH: TRANSITION TO HIGHER STATE*** */
-
-			case KBASE_ATOM_GPU_RB_SUBMITTED:
-				/* Atom submitted to HW, nothing else to do */
-				break;
-
-			case KBASE_ATOM_GPU_RB_RETURN_TO_JS:
-				/* Only return if head atom or previous atom
-				 * already removed - as atoms must be returned
-				 * in order */
-				if (idx == 0 || katom[0]->gpu_rb_state ==
-					KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB) {
-					kbase_gpu_dequeue_atom(kbdev, js, NULL);
-					kbase_jm_return_atom_to_js(kbdev,
-								katom[idx]);
-				}
-				break;
-			}
-		}
-	}
-
-	/* Warn if PRLAM-8987 affinity restrictions are violated */
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8987))
-		WARN_ON((kbase_gpu_atoms_submitted(kbdev, 0) ||
-			kbase_gpu_atoms_submitted(kbdev, 1)) &&
-			kbase_gpu_atoms_submitted(kbdev, 2));
-}
-
-
-void kbase_backend_run_atom(struct kbase_device *kbdev,
-				struct kbase_jd_atom *katom)
-{
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-	kbase_gpu_enqueue_atom(kbdev, katom);
-	kbase_backend_slot_update(kbdev);
-}
-
-#define HAS_DEP(katom) (katom->pre_dep || katom->atom_flags & \
-	(KBASE_KATOM_FLAG_X_DEP_BLOCKED | KBASE_KATOM_FLAG_FAIL_BLOCKER))
-
-bool kbase_gpu_irq_evict(struct kbase_device *kbdev, int js)
-{
-	struct kbase_jd_atom *katom;
-	struct kbase_jd_atom *next_katom;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	katom = kbase_gpu_inspect(kbdev, js, 0);
-	next_katom = kbase_gpu_inspect(kbdev, js, 1);
-
-	if (next_katom && katom->kctx == next_katom->kctx &&
-		next_katom->gpu_rb_state == KBASE_ATOM_GPU_RB_SUBMITTED &&
-		HAS_DEP(next_katom) &&
-		(kbase_reg_read(kbdev, JOB_SLOT_REG(js, JS_HEAD_NEXT_LO), NULL)
-									!= 0 ||
-		kbase_reg_read(kbdev, JOB_SLOT_REG(js, JS_HEAD_NEXT_HI), NULL)
-									!= 0)) {
-		kbase_reg_write(kbdev, JOB_SLOT_REG(js, JS_COMMAND_NEXT),
-				JS_COMMAND_NOP, NULL);
-		next_katom->gpu_rb_state = KBASE_ATOM_GPU_RB_READY;
-
-		KBASE_TLSTREAM_TL_NRET_ATOM_LPU(katom,
-				&kbdev->gpu_props.props.raw_props.js_features
-					[katom->slot_nr]);
-		KBASE_TLSTREAM_TL_NRET_ATOM_AS(katom, &kbdev->as
-					[katom->kctx->as_nr]);
-		KBASE_TLSTREAM_TL_NRET_CTX_LPU(katom->kctx,
-				&kbdev->gpu_props.props.raw_props.js_features
-					[katom->slot_nr]);
-
-		return true;
-	}
-
-	return false;
-}
-
-void kbase_gpu_complete_hw(struct kbase_device *kbdev, int js,
-				u32 completion_code,
-				u64 job_tail,
-				ktime_t *end_timestamp)
-{
-	struct kbase_jd_atom *katom = kbase_gpu_inspect(kbdev, js, 0);
-	struct kbase_context *kctx = katom->kctx;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	/*
-	 * When a hard-stop is followed close after a soft-stop, the completion
-	 * code may be set to STOPPED, even though the job is terminated
-	 */
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_TMIX_8438)) {
-		if (completion_code == BASE_JD_EVENT_STOPPED &&
-				(katom->atom_flags &
-				KBASE_KATOM_FLAG_BEEN_HARD_STOPPED)) {
-			completion_code = BASE_JD_EVENT_TERMINATED;
-		}
-	}
-
-	if ((kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_6787) || (katom->core_req &
-					BASE_JD_REQ_SKIP_CACHE_END)) &&
-			completion_code != BASE_JD_EVENT_DONE &&
-			!(completion_code & BASE_JD_SW_EVENT)) {
-		/* When a job chain fails, on a T60x or when
-		 * BASE_JD_REQ_SKIP_CACHE_END is set, the GPU cache is not
-		 * flushed. To prevent future evictions causing possible memory
-		 * corruption we need to flush the cache manually before any
-		 * affected memory gets reused. */
-		katom->need_cache_flush_cores_retained = katom->affinity;
-		kbase_pm_request_cores(kbdev, false, katom->affinity);
-	} else if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_10676)) {
-		if (kbdev->gpu_props.num_core_groups > 1 &&
-			!(katom->affinity &
-			kbdev->gpu_props.props.coherency_info.group[0].core_mask
-									) &&
-			(katom->affinity &
-			kbdev->gpu_props.props.coherency_info.group[1].core_mask
-									)) {
-			dev_info(kbdev->dev, "JD: Flushing cache due to PRLAM-10676\n");
-			katom->need_cache_flush_cores_retained =
-								katom->affinity;
-			kbase_pm_request_cores(kbdev, false,
-							katom->affinity);
-		}
-	}
-
-	katom = kbase_gpu_dequeue_atom(kbdev, js, end_timestamp);
-	kbase_timeline_job_slot_done(kbdev, katom->kctx, katom, js, 0);
-
-	if (completion_code == BASE_JD_EVENT_STOPPED) {
-		struct kbase_jd_atom *next_katom = kbase_gpu_inspect(kbdev, js,
-									0);
-
-		/*
-		 * Dequeue next atom from ringbuffers on same slot if required.
-		 * This atom will already have been removed from the NEXT
-		 * registers by kbase_gpu_soft_hard_stop_slot(), to ensure that
-		 * the atoms on this slot are returned in the correct order.
-		 */
-		if (next_katom && katom->kctx == next_katom->kctx &&
-				next_katom->sched_priority ==
-				katom->sched_priority) {
-			kbase_gpu_dequeue_atom(kbdev, js, end_timestamp);
-			kbase_jm_return_atom_to_js(kbdev, next_katom);
-		}
-	} else if (completion_code != BASE_JD_EVENT_DONE) {
-		struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
-		int i;
-
-#if KBASE_TRACE_DUMP_ON_JOB_SLOT_ERROR != 0
-		KBASE_TRACE_DUMP(kbdev);
-#endif
-		kbasep_js_clear_submit_allowed(js_devdata, katom->kctx);
-
-		/*
-		 * Remove all atoms on the same context from ringbuffers. This
-		 * will not remove atoms that are already on the GPU, as these
-		 * are guaranteed not to have fail dependencies on the failed
-		 * atom.
-		 */
-		for (i = 0; i < kbdev->gpu_props.num_job_slots; i++) {
-			struct kbase_jd_atom *katom_idx0 =
-						kbase_gpu_inspect(kbdev, i, 0);
-			struct kbase_jd_atom *katom_idx1 =
-						kbase_gpu_inspect(kbdev, i, 1);
-
-			if (katom_idx0 && katom_idx0->kctx == katom->kctx &&
-					HAS_DEP(katom_idx0) &&
-					katom_idx0->gpu_rb_state !=
-					KBASE_ATOM_GPU_RB_SUBMITTED) {
-				/* Dequeue katom_idx0 from ringbuffer */
-				kbase_gpu_dequeue_atom(kbdev, i, end_timestamp);
-
-				if (katom_idx1 &&
-						katom_idx1->kctx == katom->kctx
-						&& HAS_DEP(katom_idx1) &&
-						katom_idx0->gpu_rb_state !=
-						KBASE_ATOM_GPU_RB_SUBMITTED) {
-					/* Dequeue katom_idx1 from ringbuffer */
-					kbase_gpu_dequeue_atom(kbdev, i,
-							end_timestamp);
-
-					katom_idx1->event_code =
-							BASE_JD_EVENT_STOPPED;
-					kbase_jm_return_atom_to_js(kbdev,
-								katom_idx1);
-				}
-				katom_idx0->event_code = BASE_JD_EVENT_STOPPED;
-				kbase_jm_return_atom_to_js(kbdev, katom_idx0);
-
-			} else if (katom_idx1 &&
-					katom_idx1->kctx == katom->kctx &&
-					HAS_DEP(katom_idx1) &&
-					katom_idx1->gpu_rb_state !=
-					KBASE_ATOM_GPU_RB_SUBMITTED) {
-				/* Can not dequeue this atom yet - will be
-				 * dequeued when atom at idx0 completes */
-				katom_idx1->event_code = BASE_JD_EVENT_STOPPED;
-				kbase_gpu_mark_atom_for_return(kbdev,
-								katom_idx1);
-			}
-		}
-	}
-
-	KBASE_TRACE_ADD_SLOT_INFO(kbdev, JM_JOB_DONE, kctx, katom, katom->jc,
-					js, completion_code);
-
-	if (job_tail != 0 && job_tail != katom->jc) {
-		bool was_updated = (job_tail != katom->jc);
-
-		/* Some of the job has been executed, so we update the job chain
-		 * address to where we should resume from */
-		katom->jc = job_tail;
-		if (was_updated)
-			KBASE_TRACE_ADD_SLOT(kbdev, JM_UPDATE_HEAD, katom->kctx,
-						katom, job_tail, js);
-	}
-
-	/* Only update the event code for jobs that weren't cancelled */
-	if (katom->event_code != BASE_JD_EVENT_JOB_CANCELLED)
-		katom->event_code = (base_jd_event_code)completion_code;
-
-	kbase_device_trace_register_access(kctx, REG_WRITE,
-						JOB_CONTROL_REG(JOB_IRQ_CLEAR),
-						1 << js);
-
-	/* Complete the job, and start new ones
-	 *
-	 * Also defer remaining work onto the workqueue:
-	 * - Re-queue Soft-stopped jobs
-	 * - For any other jobs, queue the job back into the dependency system
-	 * - Schedule out the parent context if necessary, and schedule a new
-	 *   one in.
-	 */
-#ifdef CONFIG_GPU_TRACEPOINTS
-	{
-		/* The atom in the HEAD */
-		struct kbase_jd_atom *next_katom = kbase_gpu_inspect(kbdev, js,
-									0);
-
-		if (next_katom && next_katom->gpu_rb_state ==
-						KBASE_ATOM_GPU_RB_SUBMITTED) {
-			char js_string[16];
-
-			trace_gpu_sched_switch(kbasep_make_job_slot_string(js,
-							js_string,
-							sizeof(js_string)),
-						ktime_to_ns(*end_timestamp),
-						(u32)next_katom->kctx->id, 0,
-						next_katom->work_id);
-			kbdev->hwaccess.backend.slot_rb[js].last_context =
-							next_katom->kctx;
-		} else {
-			char js_string[16];
-
-			trace_gpu_sched_switch(kbasep_make_job_slot_string(js,
-							js_string,
-							sizeof(js_string)),
-						ktime_to_ns(ktime_get()), 0, 0,
-						0);
-			kbdev->hwaccess.backend.slot_rb[js].last_context = 0;
-		}
-	}
-#endif
-
-	if (kbdev->serialize_jobs & KBASE_SERIALIZE_RESET)
-		kbase_reset_gpu_silent(kbdev);
-
-	if (completion_code == BASE_JD_EVENT_STOPPED)
-		katom = kbase_jm_return_atom_to_js(kbdev, katom);
-	else
-		katom = kbase_jm_complete(kbdev, katom, end_timestamp);
-
-	if (katom) {
-		/* Cross-slot dependency has now become runnable. Try to submit
-		 * it. */
-
-		/* Check if there are lower priority jobs to soft stop */
-		kbase_job_slot_ctx_priority_check_locked(kctx, katom);
-
-		kbase_jm_try_kick(kbdev, 1 << katom->slot_nr);
-	}
-
-	/* Job completion may have unblocked other atoms. Try to update all job
-	 * slots */
-	kbase_backend_slot_update(kbdev);
-}
-
-void kbase_backend_reset(struct kbase_device *kbdev, ktime_t *end_timestamp)
-{
-	int js;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	/* Reset should always take the GPU out of protected mode */
-	WARN_ON(kbase_gpu_in_protected_mode(kbdev));
-
-	for (js = 0; js < kbdev->gpu_props.num_job_slots; js++) {
-		int atom_idx = 0;
-		int idx;
-
-		for (idx = 0; idx < SLOT_RB_SIZE; idx++) {
-			struct kbase_jd_atom *katom = kbase_gpu_inspect(kbdev,
-					js, atom_idx);
-			bool keep_in_jm_rb = false;
-
-			if (!katom)
-				break;
-			if (katom->protected_state.exit ==
-					KBASE_ATOM_EXIT_PROTECTED_RESET_WAIT)
-			{
-				KBASE_TLSTREAM_AUX_PROTECTED_LEAVE_END(kbdev);
-
-				kbase_vinstr_resume(kbdev->vinstr_ctx);
-
-				/* protected mode sanity checks */
-				KBASE_DEBUG_ASSERT_MSG(
-					kbase_jd_katom_is_protected(katom) == kbase_gpu_in_protected_mode(kbdev),
-					"Protected mode of atom (%d) doesn't match protected mode of GPU (%d)",
-					kbase_jd_katom_is_protected(katom), kbase_gpu_in_protected_mode(kbdev));
-				KBASE_DEBUG_ASSERT_MSG(
-					(kbase_jd_katom_is_protected(katom) && js == 0) ||
-					!kbase_jd_katom_is_protected(katom),
-					"Protected atom on JS%d not supported", js);
-			}
-			if (katom->gpu_rb_state < KBASE_ATOM_GPU_RB_SUBMITTED)
-				keep_in_jm_rb = true;
-
-			kbase_gpu_release_atom(kbdev, katom, NULL);
-
-			/*
-			 * If the atom wasn't on HW when the reset was issued
-			 * then leave it in the RB and next time we're kicked
-			 * it will be processed again from the starting state.
-			 */
-			if (keep_in_jm_rb) {
-				kbasep_js_job_check_deref_cores(kbdev, katom);
-				katom->coreref_state = KBASE_ATOM_COREREF_STATE_NO_CORES_REQUESTED;
-				katom->affinity = 0;
-				katom->protected_state.exit = KBASE_ATOM_EXIT_PROTECTED_CHECK;
-				/* As the atom was not removed, increment the
-				 * index so that we read the correct atom in the
-				 * next iteration. */
-				atom_idx++;
-				continue;
-			}
-
-			/*
-			 * The atom was on the HW when the reset was issued
-			 * all we can do is fail the atom.
-			 */
-			kbase_gpu_dequeue_atom(kbdev, js, NULL);
-			katom->event_code = BASE_JD_EVENT_JOB_CANCELLED;
-			kbase_jm_complete(kbdev, katom, end_timestamp);
-		}
-	}
-
-	kbdev->protected_mode_transition = false;
-}
-
-static inline void kbase_gpu_stop_atom(struct kbase_device *kbdev,
-					int js,
-					struct kbase_jd_atom *katom,
-					u32 action)
-{
-	u32 hw_action = action & JS_COMMAND_MASK;
-
-	kbase_job_check_enter_disjoint(kbdev, action, katom->core_req, katom);
-	kbasep_job_slot_soft_or_hard_stop_do_action(kbdev, js, hw_action,
-							katom->core_req, katom);
-	katom->kctx->blocked_js[js][katom->sched_priority] = true;
-}
-
-static inline void kbase_gpu_remove_atom(struct kbase_device *kbdev,
-						struct kbase_jd_atom *katom,
-						u32 action,
-						bool disjoint)
-{
-	katom->event_code = BASE_JD_EVENT_REMOVED_FROM_NEXT;
-	kbase_gpu_mark_atom_for_return(kbdev, katom);
-	katom->kctx->blocked_js[katom->slot_nr][katom->sched_priority] = true;
-
-	if (disjoint)
-		kbase_job_check_enter_disjoint(kbdev, action, katom->core_req,
-									katom);
-}
-
-static int should_stop_x_dep_slot(struct kbase_jd_atom *katom)
-{
-	if (katom->x_post_dep) {
-		struct kbase_jd_atom *dep_atom = katom->x_post_dep;
-
-		if (dep_atom->gpu_rb_state !=
-					KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB &&
-			dep_atom->gpu_rb_state !=
-					KBASE_ATOM_GPU_RB_RETURN_TO_JS)
-			return dep_atom->slot_nr;
-	}
-	return -1;
-}
-
-static void kbase_job_evicted(struct kbase_jd_atom *katom)
-{
-	kbase_timeline_job_slot_done(katom->kctx->kbdev, katom->kctx, katom,
-			katom->slot_nr, KBASE_JS_ATOM_DONE_EVICTED_FROM_NEXT);
-}
-
-bool kbase_backend_soft_hard_stop_slot(struct kbase_device *kbdev,
-					struct kbase_context *kctx,
-					int js,
-					struct kbase_jd_atom *katom,
-					u32 action)
-{
-	struct kbase_jd_atom *katom_idx0;
-	struct kbase_jd_atom *katom_idx1;
-
-	bool katom_idx0_valid, katom_idx1_valid;
-
-	bool ret = false;
-
-	int stop_x_dep_idx0 = -1, stop_x_dep_idx1 = -1;
-	int prio_idx0 = 0, prio_idx1 = 0;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	katom_idx0 = kbase_gpu_inspect(kbdev, js, 0);
-	katom_idx1 = kbase_gpu_inspect(kbdev, js, 1);
-
-	if (katom_idx0)
-		prio_idx0 = katom_idx0->sched_priority;
-	if (katom_idx1)
-		prio_idx1 = katom_idx1->sched_priority;
-
-	if (katom) {
-		katom_idx0_valid = (katom_idx0 == katom);
-		/* If idx0 is to be removed and idx1 is on the same context,
-		 * then idx1 must also be removed otherwise the atoms might be
-		 * returned out of order */
-		if (katom_idx1)
-			katom_idx1_valid = (katom_idx1 == katom) ||
-						(katom_idx0_valid &&
-							(katom_idx0->kctx ==
-							katom_idx1->kctx));
-		else
-			katom_idx1_valid = false;
-	} else {
-		katom_idx0_valid = (katom_idx0 &&
-				(!kctx || katom_idx0->kctx == kctx));
-		katom_idx1_valid = (katom_idx1 &&
-				(!kctx || katom_idx1->kctx == kctx) &&
-				prio_idx0 == prio_idx1);
-	}
-
-	if (katom_idx0_valid)
-		stop_x_dep_idx0 = should_stop_x_dep_slot(katom_idx0);
-	if (katom_idx1_valid)
-		stop_x_dep_idx1 = should_stop_x_dep_slot(katom_idx1);
-
-	if (katom_idx0_valid) {
-		if (katom_idx0->gpu_rb_state != KBASE_ATOM_GPU_RB_SUBMITTED) {
-			/* Simple case - just dequeue and return */
-			kbase_gpu_dequeue_atom(kbdev, js, NULL);
-			if (katom_idx1_valid) {
-				kbase_gpu_dequeue_atom(kbdev, js, NULL);
-				katom_idx1->event_code =
-						BASE_JD_EVENT_REMOVED_FROM_NEXT;
-				kbase_jm_return_atom_to_js(kbdev, katom_idx1);
-				katom_idx1->kctx->blocked_js[js][prio_idx1] =
-						true;
-			}
-
-			katom_idx0->event_code =
-						BASE_JD_EVENT_REMOVED_FROM_NEXT;
-			kbase_jm_return_atom_to_js(kbdev, katom_idx0);
-			katom_idx0->kctx->blocked_js[js][prio_idx0] = true;
-		} else {
-			/* katom_idx0 is on GPU */
-			if (katom_idx1 && katom_idx1->gpu_rb_state ==
-						KBASE_ATOM_GPU_RB_SUBMITTED) {
-				/* katom_idx0 and katom_idx1 are on GPU */
-
-				if (kbase_reg_read(kbdev, JOB_SLOT_REG(js,
-						JS_COMMAND_NEXT), NULL) == 0) {
-					/* idx0 has already completed - stop
-					 * idx1 if needed*/
-					if (katom_idx1_valid) {
-						kbase_gpu_stop_atom(kbdev, js,
-								katom_idx1,
-								action);
-						ret = true;
-					}
-				} else {
-					/* idx1 is in NEXT registers - attempt
-					 * to remove */
-					kbase_reg_write(kbdev,
-							JOB_SLOT_REG(js,
-							JS_COMMAND_NEXT),
-							JS_COMMAND_NOP, NULL);
-
-					if (kbase_reg_read(kbdev,
-							JOB_SLOT_REG(js,
-							JS_HEAD_NEXT_LO), NULL)
-									!= 0 ||
-						kbase_reg_read(kbdev,
-							JOB_SLOT_REG(js,
-							JS_HEAD_NEXT_HI), NULL)
-									!= 0) {
-						/* idx1 removed successfully,
-						 * will be handled in IRQ */
-						kbase_job_evicted(katom_idx1);
-						kbase_gpu_remove_atom(kbdev,
-								katom_idx1,
-								action, true);
-						stop_x_dep_idx1 =
-					should_stop_x_dep_slot(katom_idx1);
-
-						/* stop idx0 if still on GPU */
-						kbase_gpu_stop_atom(kbdev, js,
-								katom_idx0,
-								action);
-						ret = true;
-					} else if (katom_idx1_valid) {
-						/* idx0 has already completed,
-						 * stop idx1 if needed */
-						kbase_gpu_stop_atom(kbdev, js,
-								katom_idx1,
-								action);
-						ret = true;
-					}
-				}
-			} else if (katom_idx1_valid) {
-				/* idx1 not on GPU but must be dequeued*/
-
-				/* idx1 will be handled in IRQ */
-				kbase_gpu_remove_atom(kbdev, katom_idx1, action,
-									false);
-				/* stop idx0 */
-				/* This will be repeated for anything removed
-				 * from the next registers, since their normal
-				 * flow was also interrupted, and this function
-				 * might not enter disjoint state e.g. if we
-				 * don't actually do a hard stop on the head
-				 * atom */
-				kbase_gpu_stop_atom(kbdev, js, katom_idx0,
-									action);
-				ret = true;
-			} else {
-				/* no atom in idx1 */
-				/* just stop idx0 */
-				kbase_gpu_stop_atom(kbdev, js, katom_idx0,
-									action);
-				ret = true;
-			}
-		}
-	} else if (katom_idx1_valid) {
-		if (katom_idx1->gpu_rb_state != KBASE_ATOM_GPU_RB_SUBMITTED) {
-			/* Mark for return */
-			/* idx1 will be returned once idx0 completes */
-			kbase_gpu_remove_atom(kbdev, katom_idx1, action,
-									false);
-		} else {
-			/* idx1 is on GPU */
-			if (kbase_reg_read(kbdev, JOB_SLOT_REG(js,
-						JS_COMMAND_NEXT), NULL) == 0) {
-				/* idx0 has already completed - stop idx1 */
-				kbase_gpu_stop_atom(kbdev, js, katom_idx1,
-									action);
-				ret = true;
-			} else {
-				/* idx1 is in NEXT registers - attempt to
-				 * remove */
-				kbase_reg_write(kbdev, JOB_SLOT_REG(js,
-							JS_COMMAND_NEXT),
-							JS_COMMAND_NOP, NULL);
-
-				if (kbase_reg_read(kbdev, JOB_SLOT_REG(js,
-						JS_HEAD_NEXT_LO), NULL) != 0 ||
-				    kbase_reg_read(kbdev, JOB_SLOT_REG(js,
-						JS_HEAD_NEXT_HI), NULL) != 0) {
-					/* idx1 removed successfully, will be
-					 * handled in IRQ once idx0 completes */
-					kbase_job_evicted(katom_idx1);
-					kbase_gpu_remove_atom(kbdev, katom_idx1,
-									action,
-									false);
-				} else {
-					/* idx0 has already completed - stop
-					 * idx1 */
-					kbase_gpu_stop_atom(kbdev, js,
-								katom_idx1,
-								action);
-					ret = true;
-				}
-			}
-		}
-	}
-
-
-	if (stop_x_dep_idx0 != -1)
-		kbase_backend_soft_hard_stop_slot(kbdev, kctx, stop_x_dep_idx0,
-								NULL, action);
-
-	if (stop_x_dep_idx1 != -1)
-		kbase_backend_soft_hard_stop_slot(kbdev, kctx, stop_x_dep_idx1,
-								NULL, action);
-
-	return ret;
-}
-
-void kbase_gpu_cacheclean(struct kbase_device *kbdev)
-{
-	/* Limit the number of loops to avoid a hang if the interrupt is missed
-	 */
-	u32 max_loops = KBASE_CLEAN_CACHE_MAX_LOOPS;
-
-	mutex_lock(&kbdev->cacheclean_lock);
-
-	/* use GPU_COMMAND completion solution */
-	/* clean & invalidate the caches */
-	KBASE_TRACE_ADD(kbdev, CORE_GPU_CLEAN_INV_CACHES, NULL, NULL, 0u, 0);
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
-					GPU_COMMAND_CLEAN_INV_CACHES, NULL);
-
-	/* wait for cache flush to complete before continuing */
-	while (--max_loops &&
-		(kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_IRQ_RAWSTAT), NULL) &
-						CLEAN_CACHES_COMPLETED) == 0)
-		;
-
-	/* clear the CLEAN_CACHES_COMPLETED irq */
-	KBASE_TRACE_ADD(kbdev, CORE_GPU_IRQ_CLEAR, NULL, NULL, 0u,
-							CLEAN_CACHES_COMPLETED);
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_IRQ_CLEAR),
-						CLEAN_CACHES_COMPLETED, NULL);
-	KBASE_DEBUG_ASSERT_MSG(kbdev->hwcnt.backend.state !=
-						KBASE_INSTR_STATE_CLEANING,
-	    "Instrumentation code was cleaning caches, but Job Management code cleared their IRQ - Instrumentation code will now hang.");
-
-	mutex_unlock(&kbdev->cacheclean_lock);
-}
-
-void kbase_backend_cacheclean(struct kbase_device *kbdev,
-		struct kbase_jd_atom *katom)
-{
-	if (katom->need_cache_flush_cores_retained) {
-		unsigned long flags;
-
-		kbase_gpu_cacheclean(kbdev);
-
-		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-		kbase_pm_unrequest_cores(kbdev, false,
-					katom->need_cache_flush_cores_retained);
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-		katom->need_cache_flush_cores_retained = 0;
-	}
-}
-
-void kbase_backend_complete_wq(struct kbase_device *kbdev,
-						struct kbase_jd_atom *katom)
-{
-	/*
-	 * If cache flush required due to HW workaround then perform the flush
-	 * now
-	 */
-	kbase_backend_cacheclean(kbdev, katom);
-
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_10969)            &&
-	    (katom->core_req & BASE_JD_REQ_FS)                        &&
-	    katom->event_code == BASE_JD_EVENT_TILE_RANGE_FAULT       &&
-	    (katom->atom_flags & KBASE_KATOM_FLAG_BEEN_SOFT_STOPPPED) &&
-	    !(katom->atom_flags & KBASE_KATOM_FLAGS_RERUN)) {
-		dev_dbg(kbdev->dev, "Soft-stopped fragment shader job got a TILE_RANGE_FAULT. Possible HW issue, trying SW workaround\n");
-		if (kbasep_10969_workaround_clamp_coordinates(katom)) {
-			/* The job had a TILE_RANGE_FAULT after was soft-stopped
-			 * Due to an HW issue we try to execute the job again.
-			 */
-			dev_dbg(kbdev->dev,
-				"Clamping has been executed, try to rerun the job\n"
-			);
-			katom->event_code = BASE_JD_EVENT_STOPPED;
-			katom->atom_flags |= KBASE_KATOM_FLAGS_RERUN;
-		}
-	}
-
-	/* Clear the coreref_state now - while check_deref_cores() may not have
-	 * been called yet, the caller will have taken a copy of this field. If
-	 * this is not done, then if the atom is re-scheduled (following a soft
-	 * stop) then the core reference would not be retaken. */
-	katom->coreref_state = KBASE_ATOM_COREREF_STATE_NO_CORES_REQUESTED;
-	katom->affinity = 0;
-}
-
-void kbase_backend_complete_wq_post_sched(struct kbase_device *kbdev,
-		base_jd_core_req core_req, u64 affinity,
-		enum kbase_atom_coreref_state coreref_state)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	kbasep_js_job_check_deref_cores_nokatom(kbdev, core_req, affinity,
-			coreref_state);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	if (!kbdev->pm.active_count) {
-		mutex_lock(&kbdev->js_data.runpool_mutex);
-		mutex_lock(&kbdev->pm.lock);
-		kbase_pm_update_active(kbdev);
-		mutex_unlock(&kbdev->pm.lock);
-		mutex_unlock(&kbdev->js_data.runpool_mutex);
-	}
-}
-
-void kbase_gpu_dump_slots(struct kbase_device *kbdev)
-{
-	unsigned long flags;
-	int js;
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	dev_info(kbdev->dev, "kbase_gpu_dump_slots:\n");
-
-	for (js = 0; js < kbdev->gpu_props.num_job_slots; js++) {
-		int idx;
-
-		for (idx = 0; idx < SLOT_RB_SIZE; idx++) {
-			struct kbase_jd_atom *katom = kbase_gpu_inspect(kbdev,
-									js,
-									idx);
-
-			if (katom)
-				dev_info(kbdev->dev,
-				"  js%d idx%d : katom=%p gpu_rb_state=%d\n",
-				js, idx, katom, katom->gpu_rb_state);
-			else
-				dev_info(kbdev->dev, "  js%d idx%d : empty\n",
-								js, idx);
-		}
-	}
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-}
-
-
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_rb.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_rb.h
deleted file mode 100644
index 1e0e05ad3ea4..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_jm_rb.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-/*
- * Register-based HW access backend specific APIs
- */
-
-#ifndef _KBASE_HWACCESS_GPU_H_
-#define _KBASE_HWACCESS_GPU_H_
-
-#include <backend/gpu/mali_kbase_pm_internal.h>
-
-/**
- * kbase_gpu_irq_evict - Evict an atom from a NEXT slot
- *
- * @kbdev:         Device pointer
- * @js:            Job slot to evict from
- *
- * Evict the atom in the NEXT slot for the specified job slot. This function is
- * called from the job complete IRQ handler when the previous job has failed.
- *
- * Return: true if job evicted from NEXT registers, false otherwise
- */
-bool kbase_gpu_irq_evict(struct kbase_device *kbdev, int js);
-
-/**
- * kbase_gpu_complete_hw - Complete an atom on job slot js
- *
- * @kbdev:           Device pointer
- * @js:              Job slot that has completed
- * @completion_code: Event code from job that has completed
- * @job_tail:        The tail address from the hardware if the job has partially
- *                   completed
- * @end_timestamp:   Time of completion
- */
-void kbase_gpu_complete_hw(struct kbase_device *kbdev, int js,
-				u32 completion_code,
-				u64 job_tail,
-				ktime_t *end_timestamp);
-
-/**
- * kbase_gpu_inspect - Inspect the contents of the HW access ringbuffer
- *
- * @kbdev:  Device pointer
- * @js:     Job slot to inspect
- * @idx:    Index into ringbuffer. 0 is the job currently running on
- *          the slot, 1 is the job waiting, all other values are invalid.
- * Return:  The atom at that position in the ringbuffer
- *          or NULL if no atom present
- */
-struct kbase_jd_atom *kbase_gpu_inspect(struct kbase_device *kbdev, int js,
-					int idx);
-
-/**
- * kbase_gpu_dump_slots - Print the contents of the slot ringbuffers
- *
- * @kbdev:  Device pointer
- */
-void kbase_gpu_dump_slots(struct kbase_device *kbdev);
-
-#endif /* _KBASE_HWACCESS_GPU_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_affinity.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_affinity.c
deleted file mode 100644
index 54d8ddd80097..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_affinity.c
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * Base kernel affinity manager APIs
- */
-
-#include <mali_kbase.h>
-#include "mali_kbase_js_affinity.h"
-#include "mali_kbase_hw.h"
-
-#include <backend/gpu/mali_kbase_pm_internal.h>
-
-
-bool kbase_js_can_run_job_on_slot_no_lock(struct kbase_device *kbdev,
-									int js)
-{
-	/*
-	 * Here are the reasons for using job slot 2:
-	 * - BASE_HW_ISSUE_8987 (which is entirely used for that purpose)
-	 * - In absence of the above, then:
-	 *  - Atoms with BASE_JD_REQ_COHERENT_GROUP
-	 *  - But, only when there aren't contexts with
-	 *  KBASEP_JS_CTX_ATTR_COMPUTE_ALL_CORES, because the atoms that run on
-	 *  all cores on slot 1 could be blocked by those using a coherent group
-	 *  on slot 2
-	 *  - And, only when you actually have 2 or more coregroups - if you
-	 *  only have 1 coregroup, then having jobs for slot 2 implies they'd
-	 *  also be for slot 1, meaning you'll get interference from them. Jobs
-	 *  able to run on slot 2 could also block jobs that can only run on
-	 *  slot 1 (tiler jobs)
-	 */
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8987))
-		return true;
-
-	if (js != 2)
-		return true;
-
-	/* Only deal with js==2 now: */
-	if (kbdev->gpu_props.num_core_groups > 1) {
-		/* Only use slot 2 in the 2+ coregroup case */
-		if (kbasep_js_ctx_attr_is_attr_on_runpool(kbdev,
-					KBASEP_JS_CTX_ATTR_COMPUTE_ALL_CORES) ==
-								false) {
-			/* ...But only when we *don't* have atoms that run on
-			 * all cores */
-
-			/* No specific check for BASE_JD_REQ_COHERENT_GROUP
-			 * atoms - the policy will sort that out */
-			return true;
-		}
-	}
-
-	/* Above checks failed mean we shouldn't use slot 2 */
-	return false;
-}
-
-/*
- * As long as it has been decided to have a deeper modification of
- * what job scheduler, power manager and affinity manager will
- * implement, this function is just an intermediate step that
- * assumes:
- * - all working cores will be powered on when this is called.
- * - largest current configuration is 2 core groups.
- * - It has been decided not to have hardcoded values so the low
- *   and high cores in a core split will be evently distributed.
- * - Odd combinations of core requirements have been filtered out
- *   and do not get to this function (e.g. CS+T+NSS is not
- *   supported here).
- * - This function is frequently called and can be optimized,
- *   (see notes in loops), but as the functionallity will likely
- *   be modified, optimization has not been addressed.
-*/
-bool kbase_js_choose_affinity(u64 * const affinity,
-					struct kbase_device *kbdev,
-					struct kbase_jd_atom *katom, int js)
-{
-	base_jd_core_req core_req = katom->core_req;
-	unsigned int num_core_groups = kbdev->gpu_props.num_core_groups;
-	u64 core_availability_mask;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	core_availability_mask = kbase_pm_ca_get_core_mask(kbdev);
-
-	/*
-	 * If no cores are currently available (core availability policy is
-	 * transitioning) then fail.
-	 */
-	if (0 == core_availability_mask) {
-		*affinity = 0;
-		return false;
-	}
-
-	KBASE_DEBUG_ASSERT(js >= 0);
-
-	if ((core_req & (BASE_JD_REQ_FS | BASE_JD_REQ_CS | BASE_JD_REQ_T)) ==
-								BASE_JD_REQ_T) {
-		 /* If the hardware supports XAFFINITY then we'll only enable
-		  * the tiler (which is the default so this is a no-op),
-		  * otherwise enable shader core 0. */
-		if (!kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_XAFFINITY))
-			*affinity = 1;
-		else
-			*affinity = 0;
-
-		return true;
-	}
-
-	if (1 == kbdev->gpu_props.num_cores) {
-		/* trivial case only one core, nothing to do */
-		*affinity = core_availability_mask &
-				kbdev->pm.debug_core_mask[js];
-	} else {
-		if ((core_req & (BASE_JD_REQ_COHERENT_GROUP |
-					BASE_JD_REQ_SPECIFIC_COHERENT_GROUP))) {
-			if (js == 0 || num_core_groups == 1) {
-				/* js[0] and single-core-group systems just get
-				 * the first core group */
-				*affinity =
-				kbdev->gpu_props.props.coherency_info.group[0].core_mask
-						& core_availability_mask &
-						kbdev->pm.debug_core_mask[js];
-			} else {
-				/* js[1], js[2] use core groups 0, 1 for
-				 * dual-core-group systems */
-				u32 core_group_idx = ((u32) js) - 1;
-
-				KBASE_DEBUG_ASSERT(core_group_idx <
-							num_core_groups);
-				*affinity =
-				kbdev->gpu_props.props.coherency_info.group[core_group_idx].core_mask
-						& core_availability_mask &
-						kbdev->pm.debug_core_mask[js];
-
-				/* If the job is specifically targeting core
-				 * group 1 and the core availability policy is
-				 * keeping that core group off, then fail */
-				if (*affinity == 0 && core_group_idx == 1 &&
-						kbdev->pm.backend.cg1_disabled
-								== true)
-					katom->event_code =
-							BASE_JD_EVENT_PM_EVENT;
-			}
-		} else {
-			/* All cores are available when no core split is
-			 * required */
-			*affinity = core_availability_mask &
-					kbdev->pm.debug_core_mask[js];
-		}
-	}
-
-	/*
-	 * If no cores are currently available in the desired core group(s)
-	 * (core availability policy is transitioning) then fail.
-	 */
-	if (*affinity == 0)
-		return false;
-
-	/* Enable core 0 if tiler required for hardware without XAFFINITY
-	 * support (notes above) */
-	if (core_req & BASE_JD_REQ_T) {
-		if (!kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_XAFFINITY))
-			*affinity = *affinity | 1;
-	}
-
-	return true;
-}
-
-static inline bool kbase_js_affinity_is_violating(
-						struct kbase_device *kbdev,
-								u64 *affinities)
-{
-	/* This implementation checks whether the two slots involved in Generic
-	 * thread creation have intersecting affinity. This is due to micro-
-	 * architectural issues where a job in slot A targetting cores used by
-	 * slot B could prevent the job in slot B from making progress until the
-	 * job in slot A has completed.
-	 */
-	u64 affinity_set_left;
-	u64 affinity_set_right;
-	u64 intersection;
-
-	KBASE_DEBUG_ASSERT(affinities != NULL);
-
-	affinity_set_left = affinities[1];
-
-	affinity_set_right = affinities[2];
-
-	/* A violation occurs when any bit in the left_set is also in the
-	 * right_set */
-	intersection = affinity_set_left & affinity_set_right;
-
-	return (bool) (intersection != (u64) 0u);
-}
-
-bool kbase_js_affinity_would_violate(struct kbase_device *kbdev, int js,
-								u64 affinity)
-{
-	struct kbasep_js_device_data *js_devdata;
-	u64 new_affinities[BASE_JM_MAX_NR_SLOTS];
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(js < BASE_JM_MAX_NR_SLOTS);
-	js_devdata = &kbdev->js_data;
-
-	memcpy(new_affinities, js_devdata->runpool_irq.slot_affinities,
-			sizeof(js_devdata->runpool_irq.slot_affinities));
-
-	new_affinities[js] |= affinity;
-
-	return kbase_js_affinity_is_violating(kbdev, new_affinities);
-}
-
-void kbase_js_affinity_retain_slot_cores(struct kbase_device *kbdev, int js,
-								u64 affinity)
-{
-	struct kbasep_js_device_data *js_devdata;
-	u64 cores;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(js < BASE_JM_MAX_NR_SLOTS);
-	js_devdata = &kbdev->js_data;
-
-	KBASE_DEBUG_ASSERT(kbase_js_affinity_would_violate(kbdev, js, affinity)
-								== false);
-
-	cores = affinity;
-	while (cores) {
-		int bitnum = fls64(cores) - 1;
-		u64 bit = 1ULL << bitnum;
-		s8 cnt;
-
-		cnt =
-		++(js_devdata->runpool_irq.slot_affinity_refcount[js][bitnum]);
-
-		if (cnt == 1)
-			js_devdata->runpool_irq.slot_affinities[js] |= bit;
-
-		cores &= ~bit;
-	}
-}
-
-void kbase_js_affinity_release_slot_cores(struct kbase_device *kbdev, int js,
-								u64 affinity)
-{
-	struct kbasep_js_device_data *js_devdata;
-	u64 cores;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(js < BASE_JM_MAX_NR_SLOTS);
-	js_devdata = &kbdev->js_data;
-
-	cores = affinity;
-	while (cores) {
-		int bitnum = fls64(cores) - 1;
-		u64 bit = 1ULL << bitnum;
-		s8 cnt;
-
-		KBASE_DEBUG_ASSERT(
-		js_devdata->runpool_irq.slot_affinity_refcount[js][bitnum] > 0);
-
-		cnt =
-		--(js_devdata->runpool_irq.slot_affinity_refcount[js][bitnum]);
-
-		if (0 == cnt)
-			js_devdata->runpool_irq.slot_affinities[js] &= ~bit;
-
-		cores &= ~bit;
-	}
-}
-
-#if KBASE_TRACE_ENABLE
-void kbase_js_debug_log_current_affinities(struct kbase_device *kbdev)
-{
-	struct kbasep_js_device_data *js_devdata;
-	int slot_nr;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	js_devdata = &kbdev->js_data;
-
-	for (slot_nr = 0; slot_nr < 3; ++slot_nr)
-		KBASE_TRACE_ADD_SLOT_INFO(kbdev, JS_AFFINITY_CURRENT, NULL,
-							NULL, 0u, slot_nr,
-			(u32) js_devdata->runpool_irq.slot_affinities[slot_nr]);
-}
-#endif				/* KBASE_TRACE_ENABLE  */
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_affinity.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_affinity.h
deleted file mode 100644
index 35d9781ae092..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_affinity.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * Affinity Manager internal APIs.
- */
-
-#ifndef _KBASE_JS_AFFINITY_H_
-#define _KBASE_JS_AFFINITY_H_
-
-/**
- * kbase_js_can_run_job_on_slot_no_lock - Decide whether it is possible to
- * submit a job to a particular job slot in the current status
- *
- * @kbdev: The kbase device structure of the device
- * @js:    Job slot number to check for allowance
- *
- * Will check if submitting to the given job slot is allowed in the current
- * status.  For example using job slot 2 while in soft-stoppable state and only
- * having 1 coregroup is not allowed by the policy. This function should be
- * called prior to submitting a job to a slot to make sure policy rules are not
- * violated.
- *
- * The following locking conditions are made on the caller
- * - it must hold hwaccess_lock
- */
-bool kbase_js_can_run_job_on_slot_no_lock(struct kbase_device *kbdev, int js);
-
-/**
- * kbase_js_choose_affinity - Compute affinity for a given job.
- *
- * @affinity: Affinity bitmap computed
- * @kbdev:    The kbase device structure of the device
- * @katom:    Job chain of which affinity is going to be found
- * @js:       Slot the job chain is being submitted
- *
- * Currently assumes an all-on/all-off power management policy.
- * Also assumes there is at least one core with tiler available.
- *
- * Returns true if a valid affinity was chosen, false if
- * no cores were available.
- */
-bool kbase_js_choose_affinity(u64 * const affinity,
-					struct kbase_device *kbdev,
-					struct kbase_jd_atom *katom,
-					int js);
-
-/**
- * kbase_js_affinity_would_violate - Determine whether a proposed affinity on
- * job slot @js would cause a violation of affinity restrictions.
- *
- * @kbdev:    Kbase device structure
- * @js:       The job slot to test
- * @affinity: The affinity mask to test
- *
- * The following locks must be held by the caller
- * - hwaccess_lock
- *
- * Return: true if the affinity would violate the restrictions
- */
-bool kbase_js_affinity_would_violate(struct kbase_device *kbdev, int js,
-								u64 affinity);
-
-/**
- * kbase_js_affinity_retain_slot_cores - Affinity tracking: retain cores used by
- *                                       a slot
- *
- * @kbdev:    Kbase device structure
- * @js:       The job slot retaining the cores
- * @affinity: The cores to retain
- *
- * The following locks must be held by the caller
- * - hwaccess_lock
- */
-void kbase_js_affinity_retain_slot_cores(struct kbase_device *kbdev, int js,
-								u64 affinity);
-
-/**
- * kbase_js_affinity_release_slot_cores - Affinity tracking: release cores used
- *                                        by a slot
- *
- * @kbdev:    Kbase device structure
- * @js:       Job slot
- * @affinity: Bit mask of core to be released
- *
- * Cores must be released as soon as a job is dequeued from a slot's 'submit
- * slots', and before another job is submitted to those slots. Otherwise, the
- * refcount could exceed the maximum number submittable to a slot,
- * %BASE_JM_SUBMIT_SLOTS.
- *
- * The following locks must be held by the caller
- * - hwaccess_lock
- */
-void kbase_js_affinity_release_slot_cores(struct kbase_device *kbdev, int js,
-								u64 affinity);
-
-/**
- * kbase_js_debug_log_current_affinities - log the current affinities
- *
- * @kbdev:  Kbase device structure
- *
- * Output to the Trace log the current tracked affinities on all slots
- */
-#if KBASE_TRACE_ENABLE
-void kbase_js_debug_log_current_affinities(struct kbase_device *kbdev);
-#else				/*  KBASE_TRACE_ENABLE  */
-static inline void
-kbase_js_debug_log_current_affinities(struct kbase_device *kbdev)
-{
-}
-#endif				/*  KBASE_TRACE_ENABLE  */
-
-#endif				/* _KBASE_JS_AFFINITY_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_backend.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_backend.c
deleted file mode 100644
index d392fa2a85d9..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_backend.c
+++ /dev/null
@@ -1,356 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-/*
- * Register-based HW access backend specific job scheduler APIs
- */
-
-#include <mali_kbase.h>
-#include <mali_kbase_hwaccess_jm.h>
-#include <backend/gpu/mali_kbase_jm_internal.h>
-#include <backend/gpu/mali_kbase_js_internal.h>
-
-/*
- * Define for when dumping is enabled.
- * This should not be based on the instrumentation level as whether dumping is
- * enabled for a particular level is down to the integrator. However this is
- * being used for now as otherwise the cinstr headers would be needed.
- */
-#define CINSTR_DUMPING_ENABLED (2 == MALI_INSTRUMENTATION_LEVEL)
-
-/*
- * Hold the runpool_mutex for this
- */
-static inline bool timer_callback_should_run(struct kbase_device *kbdev)
-{
-	struct kbase_backend_data *backend = &kbdev->hwaccess.backend;
-	s8 nr_running_ctxs;
-
-	lockdep_assert_held(&kbdev->js_data.runpool_mutex);
-
-	/* Timer must stop if we are suspending */
-	if (backend->suspend_timer)
-		return false;
-
-	/* nr_contexts_pullable is updated with the runpool_mutex. However, the
-	 * locking in the caller gives us a barrier that ensures
-	 * nr_contexts_pullable is up-to-date for reading */
-	nr_running_ctxs = atomic_read(&kbdev->js_data.nr_contexts_runnable);
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-	if (kbdev->js_data.softstop_always) {
-		/* Debug support for allowing soft-stop on a single context */
-		return true;
-	}
-#endif				/* CONFIG_MALI_BIFROST_DEBUG */
-
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_9435)) {
-		/* Timeouts would have to be 4x longer (due to micro-
-		 * architectural design) to support OpenCL conformance tests, so
-		 * only run the timer when there's:
-		 * - 2 or more CL contexts
-		 * - 1 or more GLES contexts
-		 *
-		 * NOTE: We will treat a context that has both Compute and Non-
-		 * Compute jobs will be treated as an OpenCL context (hence, we
-		 * don't check KBASEP_JS_CTX_ATTR_NON_COMPUTE).
-		 */
-		{
-			s8 nr_compute_ctxs =
-				kbasep_js_ctx_attr_count_on_runpool(kbdev,
-						KBASEP_JS_CTX_ATTR_COMPUTE);
-			s8 nr_noncompute_ctxs = nr_running_ctxs -
-							nr_compute_ctxs;
-
-			return (bool) (nr_compute_ctxs >= 2 ||
-							nr_noncompute_ctxs > 0);
-		}
-	} else {
-		/* Run the timer callback whenever you have at least 1 context
-		 */
-		return (bool) (nr_running_ctxs > 0);
-	}
-}
-
-static enum hrtimer_restart timer_callback(struct hrtimer *timer)
-{
-	unsigned long flags;
-	struct kbase_device *kbdev;
-	struct kbasep_js_device_data *js_devdata;
-	struct kbase_backend_data *backend;
-	int s;
-	bool reset_needed = false;
-
-	KBASE_DEBUG_ASSERT(timer != NULL);
-
-	backend = container_of(timer, struct kbase_backend_data,
-							scheduling_timer);
-	kbdev = container_of(backend, struct kbase_device, hwaccess.backend);
-	js_devdata = &kbdev->js_data;
-
-	/* Loop through the slots */
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	for (s = 0; s < kbdev->gpu_props.num_job_slots; s++) {
-		struct kbase_jd_atom *atom = NULL;
-
-		if (kbase_backend_nr_atoms_on_slot(kbdev, s) > 0) {
-			atom = kbase_gpu_inspect(kbdev, s, 0);
-			KBASE_DEBUG_ASSERT(atom != NULL);
-		}
-
-		if (atom != NULL) {
-			/* The current version of the model doesn't support
-			 * Soft-Stop */
-			if (!kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_5736)) {
-				u32 ticks = atom->ticks++;
-
-#if !CINSTR_DUMPING_ENABLED
-				u32 soft_stop_ticks, hard_stop_ticks,
-								gpu_reset_ticks;
-				if (atom->core_req & BASE_JD_REQ_ONLY_COMPUTE) {
-					soft_stop_ticks =
-						js_devdata->soft_stop_ticks_cl;
-					hard_stop_ticks =
-						js_devdata->hard_stop_ticks_cl;
-					gpu_reset_ticks =
-						js_devdata->gpu_reset_ticks_cl;
-				} else {
-					soft_stop_ticks =
-						js_devdata->soft_stop_ticks;
-					hard_stop_ticks =
-						js_devdata->hard_stop_ticks_ss;
-					gpu_reset_ticks =
-						js_devdata->gpu_reset_ticks_ss;
-				}
-
-				/* If timeouts have been changed then ensure
-				 * that atom tick count is not greater than the
-				 * new soft_stop timeout. This ensures that
-				 * atoms do not miss any of the timeouts due to
-				 * races between this worker and the thread
-				 * changing the timeouts. */
-				if (backend->timeouts_updated &&
-						ticks > soft_stop_ticks)
-					ticks = atom->ticks = soft_stop_ticks;
-
-				/* Job is Soft-Stoppable */
-				if (ticks == soft_stop_ticks) {
-					int disjoint_threshold =
-		KBASE_DISJOINT_STATE_INTERLEAVED_CONTEXT_COUNT_THRESHOLD;
-					u32 softstop_flags = 0u;
-					/* Job has been scheduled for at least
-					 * js_devdata->soft_stop_ticks ticks.
-					 * Soft stop the slot so we can run
-					 * other jobs.
-					 */
-					dev_dbg(kbdev->dev, "Soft-stop");
-#if !KBASE_DISABLE_SCHEDULING_SOFT_STOPS
-					/* nr_user_contexts_running is updated
-					 * with the runpool_mutex, but we can't
-					 * take that here.
-					 *
-					 * However, if it's about to be
-					 * increased then the new context can't
-					 * run any jobs until they take the
-					 * hwaccess_lock, so it's OK to observe
-					 * the older value.
-					 *
-					 * Similarly, if it's about to be
-					 * decreased, the last job from another
-					 * context has already finished, so it's
-					 * not too bad that we observe the older
-					 * value and register a disjoint event
-					 * when we try soft-stopping */
-					if (js_devdata->nr_user_contexts_running
-							>= disjoint_threshold)
-						softstop_flags |=
-						JS_COMMAND_SW_CAUSES_DISJOINT;
-
-					kbase_job_slot_softstop_swflags(kbdev,
-						s, atom, softstop_flags);
-#endif
-				} else if (ticks == hard_stop_ticks) {
-					/* Job has been scheduled for at least
-					 * js_devdata->hard_stop_ticks_ss ticks.
-					 * It should have been soft-stopped by
-					 * now. Hard stop the slot.
-					 */
-#if !KBASE_DISABLE_SCHEDULING_HARD_STOPS
-					int ms =
-						js_devdata->scheduling_period_ns
-								/ 1000000u;
-					dev_warn(kbdev->dev, "JS: Job Hard-Stopped (took more than %lu ticks at %lu ms/tick)",
-							(unsigned long)ticks,
-							(unsigned long)ms);
-					kbase_job_slot_hardstop(atom->kctx, s,
-									atom);
-#endif
-				} else if (ticks == gpu_reset_ticks) {
-					/* Job has been scheduled for at least
-					 * js_devdata->gpu_reset_ticks_ss ticks.
-					 * It should have left the GPU by now.
-					 * Signal that the GPU needs to be
-					 * reset.
-					 */
-					reset_needed = true;
-				}
-#else				/* !CINSTR_DUMPING_ENABLED */
-				/* NOTE: During CINSTR_DUMPING_ENABLED, we use
-				 * the alternate timeouts, which makes the hard-
-				 * stop and GPU reset timeout much longer. We
-				 * also ensure that we don't soft-stop at all.
-				 */
-				if (ticks == js_devdata->soft_stop_ticks) {
-					/* Job has been scheduled for at least
-					 * js_devdata->soft_stop_ticks. We do
-					 * not soft-stop during
-					 * CINSTR_DUMPING_ENABLED, however.
-					 */
-					dev_dbg(kbdev->dev, "Soft-stop");
-				} else if (ticks ==
-					js_devdata->hard_stop_ticks_dumping) {
-					/* Job has been scheduled for at least
-					 * js_devdata->hard_stop_ticks_dumping
-					 * ticks. Hard stop the slot.
-					 */
-#if !KBASE_DISABLE_SCHEDULING_HARD_STOPS
-					int ms =
-						js_devdata->scheduling_period_ns
-								/ 1000000u;
-					dev_warn(kbdev->dev, "JS: Job Hard-Stopped (took more than %lu ticks at %lu ms/tick)",
-							(unsigned long)ticks,
-							(unsigned long)ms);
-					kbase_job_slot_hardstop(atom->kctx, s,
-									atom);
-#endif
-				} else if (ticks ==
-					js_devdata->gpu_reset_ticks_dumping) {
-					/* Job has been scheduled for at least
-					 * js_devdata->gpu_reset_ticks_dumping
-					 * ticks. It should have left the GPU by
-					 * now. Signal that the GPU needs to be
-					 * reset.
-					 */
-					reset_needed = true;
-				}
-#endif				/* !CINSTR_DUMPING_ENABLED */
-			}
-		}
-	}
-#if KBASE_GPU_RESET_EN
-	if (reset_needed) {
-		dev_err(kbdev->dev, "JS: Job has been on the GPU for too long (JS_RESET_TICKS_SS/DUMPING timeout hit). Issueing GPU soft-reset to resolve.");
-
-		if (kbase_prepare_to_reset_gpu_locked(kbdev))
-			kbase_reset_gpu_locked(kbdev);
-	}
-#endif /* KBASE_GPU_RESET_EN */
-	/* the timer is re-issued if there is contexts in the run-pool */
-
-	if (backend->timer_running)
-		hrtimer_start(&backend->scheduling_timer,
-			HR_TIMER_DELAY_NSEC(js_devdata->scheduling_period_ns),
-			HRTIMER_MODE_REL);
-
-	backend->timeouts_updated = false;
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	return HRTIMER_NORESTART;
-}
-
-void kbase_backend_ctx_count_changed(struct kbase_device *kbdev)
-{
-	struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
-	struct kbase_backend_data *backend = &kbdev->hwaccess.backend;
-	unsigned long flags;
-
-	lockdep_assert_held(&js_devdata->runpool_mutex);
-
-	if (!timer_callback_should_run(kbdev)) {
-		/* Take spinlock to force synchronisation with timer */
-		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-		backend->timer_running = false;
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-		/* From now on, return value of timer_callback_should_run() will
-		 * also cause the timer to not requeue itself. Its return value
-		 * cannot change, because it depends on variables updated with
-		 * the runpool_mutex held, which the caller of this must also
-		 * hold */
-		hrtimer_cancel(&backend->scheduling_timer);
-	}
-
-	if (timer_callback_should_run(kbdev) && !backend->timer_running) {
-		/* Take spinlock to force synchronisation with timer */
-		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-		backend->timer_running = true;
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-		hrtimer_start(&backend->scheduling_timer,
-			HR_TIMER_DELAY_NSEC(js_devdata->scheduling_period_ns),
-							HRTIMER_MODE_REL);
-
-		KBASE_TRACE_ADD(kbdev, JS_POLICY_TIMER_START, NULL, NULL, 0u,
-									0u);
-	}
-}
-
-int kbase_backend_timer_init(struct kbase_device *kbdev)
-{
-	struct kbase_backend_data *backend = &kbdev->hwaccess.backend;
-
-	hrtimer_init(&backend->scheduling_timer, CLOCK_MONOTONIC,
-							HRTIMER_MODE_REL);
-	backend->scheduling_timer.function = timer_callback;
-
-	backend->timer_running = false;
-
-	return 0;
-}
-
-void kbase_backend_timer_term(struct kbase_device *kbdev)
-{
-	struct kbase_backend_data *backend = &kbdev->hwaccess.backend;
-
-	hrtimer_cancel(&backend->scheduling_timer);
-}
-
-void kbase_backend_timer_suspend(struct kbase_device *kbdev)
-{
-	struct kbase_backend_data *backend = &kbdev->hwaccess.backend;
-
-	backend->suspend_timer = true;
-
-	kbase_backend_ctx_count_changed(kbdev);
-}
-
-void kbase_backend_timer_resume(struct kbase_device *kbdev)
-{
-	struct kbase_backend_data *backend = &kbdev->hwaccess.backend;
-
-	backend->suspend_timer = false;
-
-	kbase_backend_ctx_count_changed(kbdev);
-}
-
-void kbase_backend_timeouts_changed(struct kbase_device *kbdev)
-{
-	struct kbase_backend_data *backend = &kbdev->hwaccess.backend;
-
-	backend->timeouts_updated = true;
-}
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_internal.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_internal.h
deleted file mode 100644
index 3f53779c6747..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_js_internal.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-/*
- * Register-based HW access backend specific job scheduler APIs
- */
-
-#ifndef _KBASE_JS_BACKEND_H_
-#define _KBASE_JS_BACKEND_H_
-
-/**
- * kbase_backend_timer_init() - Initialise the JS scheduling timer
- * @kbdev:	Device pointer
- *
- * This function should be called at driver initialisation
- *
- * Return: 0 on success
- */
-int kbase_backend_timer_init(struct kbase_device *kbdev);
-
-/**
- * kbase_backend_timer_term() - Terminate the JS scheduling timer
- * @kbdev:	Device pointer
- *
- * This function should be called at driver termination
- */
-void kbase_backend_timer_term(struct kbase_device *kbdev);
-
-/**
- * kbase_backend_timer_suspend - Suspend is happening, stop the JS scheduling
- *                               timer
- * @kbdev: Device pointer
- *
- * This function should be called on suspend, after the active count has reached
- * zero. This is required as the timer may have been started on job submission
- * to the job scheduler, but before jobs are submitted to the GPU.
- *
- * Caller must hold runpool_mutex.
- */
-void kbase_backend_timer_suspend(struct kbase_device *kbdev);
-
-/**
- * kbase_backend_timer_resume - Resume is happening, re-evaluate the JS
- *                              scheduling timer
- * @kbdev: Device pointer
- *
- * This function should be called on resume. Note that is is not guaranteed to
- * re-start the timer, only evalute whether it should be re-started.
- *
- * Caller must hold runpool_mutex.
- */
-void kbase_backend_timer_resume(struct kbase_device *kbdev);
-
-#endif /* _KBASE_JS_BACKEND_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_mmu_hw_direct.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_mmu_hw_direct.c
deleted file mode 100644
index aa1817c8bca9..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_mmu_hw_direct.c
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <linux/bitops.h>
-
-#include <mali_kbase.h>
-#include <mali_kbase_mem.h>
-#include <mali_kbase_mmu_hw.h>
-#include <mali_kbase_tlstream.h>
-#include <backend/gpu/mali_kbase_device_internal.h>
-#include <mali_kbase_as_fault_debugfs.h>
-
-static inline u64 lock_region(struct kbase_device *kbdev, u64 pfn,
-		u32 num_pages)
-{
-	u64 region;
-
-	/* can't lock a zero sized range */
-	KBASE_DEBUG_ASSERT(num_pages);
-
-	region = pfn << PAGE_SHIFT;
-	/*
-	 * fls returns (given the ASSERT above):
-	 * 1 .. 32
-	 *
-	 * 10 + fls(num_pages)
-	 * results in the range (11 .. 42)
-	 */
-
-	/* gracefully handle num_pages being zero */
-	if (0 == num_pages) {
-		region |= 11;
-	} else {
-		u8 region_width;
-
-		region_width = 10 + fls(num_pages);
-		if (num_pages != (1ul << (region_width - 11))) {
-			/* not pow2, so must go up to the next pow2 */
-			region_width += 1;
-		}
-		KBASE_DEBUG_ASSERT(region_width <= KBASE_LOCK_REGION_MAX_SIZE);
-		KBASE_DEBUG_ASSERT(region_width >= KBASE_LOCK_REGION_MIN_SIZE);
-		region |= region_width;
-	}
-
-	return region;
-}
-
-static int wait_ready(struct kbase_device *kbdev,
-		unsigned int as_nr, struct kbase_context *kctx)
-{
-	unsigned int max_loops = KBASE_AS_INACTIVE_MAX_LOOPS;
-	u32 val = kbase_reg_read(kbdev, MMU_AS_REG(as_nr, AS_STATUS), kctx);
-
-	/* Wait for the MMU status to indicate there is no active command, in
-	 * case one is pending. Do not log remaining register accesses. */
-	while (--max_loops && (val & AS_STATUS_AS_ACTIVE))
-		val = kbase_reg_read(kbdev, MMU_AS_REG(as_nr, AS_STATUS), NULL);
-
-	if (max_loops == 0) {
-		dev_err(kbdev->dev, "AS_ACTIVE bit stuck\n");
-		return -1;
-	}
-
-	/* If waiting in loop was performed, log last read value. */
-	if (KBASE_AS_INACTIVE_MAX_LOOPS - 1 > max_loops)
-		kbase_reg_read(kbdev, MMU_AS_REG(as_nr, AS_STATUS), kctx);
-
-	return 0;
-}
-
-static int write_cmd(struct kbase_device *kbdev, int as_nr, u32 cmd,
-		struct kbase_context *kctx)
-{
-	int status;
-
-	/* write AS_COMMAND when MMU is ready to accept another command */
-	status = wait_ready(kbdev, as_nr, kctx);
-	if (status == 0)
-		kbase_reg_write(kbdev, MMU_AS_REG(as_nr, AS_COMMAND), cmd,
-									kctx);
-
-	return status;
-}
-
-static void validate_protected_page_fault(struct kbase_device *kbdev,
-		struct kbase_context *kctx)
-{
-	/* GPUs which support (native) protected mode shall not report page
-	 * fault addresses unless it has protected debug mode and protected
-	 * debug mode is turned on */
-	u32 protected_debug_mode = 0;
-
-	if (!kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_PROTECTED_MODE))
-		return;
-
-	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_PROTECTED_DEBUG_MODE)) {
-		protected_debug_mode = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(GPU_STATUS),
-				kctx) & GPU_DBGEN;
-	}
-
-	if (!protected_debug_mode) {
-		/* fault_addr should never be reported in protected mode.
-		 * However, we just continue by printing an error message */
-		dev_err(kbdev->dev, "Fault address reported in protected mode\n");
-	}
-}
-
-void kbase_mmu_interrupt(struct kbase_device *kbdev, u32 irq_stat)
-{
-	const int num_as = 16;
-	const int busfault_shift = MMU_PAGE_FAULT_FLAGS;
-	const int pf_shift = 0;
-	const unsigned long as_bit_mask = (1UL << num_as) - 1;
-	unsigned long flags;
-	u32 new_mask;
-	u32 tmp;
-
-	/* bus faults */
-	u32 bf_bits = (irq_stat >> busfault_shift) & as_bit_mask;
-	/* page faults (note: Ignore ASes with both pf and bf) */
-	u32 pf_bits = ((irq_stat >> pf_shift) & as_bit_mask) & ~bf_bits;
-
-	KBASE_DEBUG_ASSERT(NULL != kbdev);
-
-	/* remember current mask */
-	spin_lock_irqsave(&kbdev->mmu_mask_change, flags);
-	new_mask = kbase_reg_read(kbdev, MMU_REG(MMU_IRQ_MASK), NULL);
-	/* mask interrupts for now */
-	kbase_reg_write(kbdev, MMU_REG(MMU_IRQ_MASK), 0, NULL);
-	spin_unlock_irqrestore(&kbdev->mmu_mask_change, flags);
-
-	while (bf_bits | pf_bits) {
-		struct kbase_as *as;
-		int as_no;
-		struct kbase_context *kctx;
-
-		/*
-		 * the while logic ensures we have a bit set, no need to check
-		 * for not-found here
-		 */
-		as_no = ffs(bf_bits | pf_bits) - 1;
-		as = &kbdev->as[as_no];
-
-		/*
-		 * Refcount the kctx ASAP - it shouldn't disappear anyway, since
-		 * Bus/Page faults _should_ only occur whilst jobs are running,
-		 * and a job causing the Bus/Page fault shouldn't complete until
-		 * the MMU is updated
-		 */
-		kctx = kbasep_js_runpool_lookup_ctx(kbdev, as_no);
-
-
-		/* find faulting address */
-		as->fault_addr = kbase_reg_read(kbdev,
-						MMU_AS_REG(as_no,
-							AS_FAULTADDRESS_HI),
-						kctx);
-		as->fault_addr <<= 32;
-		as->fault_addr |= kbase_reg_read(kbdev,
-						MMU_AS_REG(as_no,
-							AS_FAULTADDRESS_LO),
-						kctx);
-
-		/* Mark the fault protected or not */
-		as->protected_mode = kbdev->protected_mode;
-
-		if (kbdev->protected_mode && as->fault_addr)
-		{
-			/* check if address reporting is allowed */
-			validate_protected_page_fault(kbdev, kctx);
-		}
-
-		/* report the fault to debugfs */
-		kbase_as_fault_debugfs_new(kbdev, as_no);
-
-		/* record the fault status */
-		as->fault_status = kbase_reg_read(kbdev,
-						  MMU_AS_REG(as_no,
-							AS_FAULTSTATUS),
-						  kctx);
-
-		/* find the fault type */
-		as->fault_type = (bf_bits & (1 << as_no)) ?
-				KBASE_MMU_FAULT_TYPE_BUS :
-				KBASE_MMU_FAULT_TYPE_PAGE;
-
-		if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_AARCH64_MMU)) {
-			as->fault_extra_addr = kbase_reg_read(kbdev,
-					MMU_AS_REG(as_no, AS_FAULTEXTRA_HI),
-					kctx);
-			as->fault_extra_addr <<= 32;
-			as->fault_extra_addr |= kbase_reg_read(kbdev,
-					MMU_AS_REG(as_no, AS_FAULTEXTRA_LO),
-					kctx);
-		}
-
-		if (kbase_as_has_bus_fault(as)) {
-			/* Mark bus fault as handled.
-			 * Note that a bus fault is processed first in case
-			 * where both a bus fault and page fault occur.
-			 */
-			bf_bits &= ~(1UL << as_no);
-
-			/* remove the queued BF (and PF) from the mask */
-			new_mask &= ~(MMU_BUS_ERROR(as_no) |
-					MMU_PAGE_FAULT(as_no));
-		} else {
-			/* Mark page fault as handled */
-			pf_bits &= ~(1UL << as_no);
-
-			/* remove the queued PF from the mask */
-			new_mask &= ~MMU_PAGE_FAULT(as_no);
-		}
-
-		/* Process the interrupt for this address space */
-		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-		kbase_mmu_interrupt_process(kbdev, kctx, as);
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-	}
-
-	/* reenable interrupts */
-	spin_lock_irqsave(&kbdev->mmu_mask_change, flags);
-	tmp = kbase_reg_read(kbdev, MMU_REG(MMU_IRQ_MASK), NULL);
-	new_mask |= tmp;
-	kbase_reg_write(kbdev, MMU_REG(MMU_IRQ_MASK), new_mask, NULL);
-	spin_unlock_irqrestore(&kbdev->mmu_mask_change, flags);
-}
-
-void kbase_mmu_hw_configure(struct kbase_device *kbdev, struct kbase_as *as,
-		struct kbase_context *kctx)
-{
-	struct kbase_mmu_setup *current_setup = &as->current_setup;
-	u32 transcfg = 0;
-
-	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_AARCH64_MMU)) {
-		transcfg = current_setup->transcfg & 0xFFFFFFFFUL;
-
-		/* Set flag AS_TRANSCFG_PTW_MEMATTR_WRITE_BACK */
-		/* Clear PTW_MEMATTR bits */
-		transcfg &= ~AS_TRANSCFG_PTW_MEMATTR_MASK;
-		/* Enable correct PTW_MEMATTR bits */
-		transcfg |= AS_TRANSCFG_PTW_MEMATTR_WRITE_BACK;
-
-		if (kbdev->system_coherency == COHERENCY_ACE) {
-			/* Set flag AS_TRANSCFG_PTW_SH_OS (outer shareable) */
-			/* Clear PTW_SH bits */
-			transcfg = (transcfg & ~AS_TRANSCFG_PTW_SH_MASK);
-			/* Enable correct PTW_SH bits */
-			transcfg = (transcfg | AS_TRANSCFG_PTW_SH_OS);
-		}
-
-		kbase_reg_write(kbdev, MMU_AS_REG(as->number, AS_TRANSCFG_LO),
-				transcfg, kctx);
-		kbase_reg_write(kbdev, MMU_AS_REG(as->number, AS_TRANSCFG_HI),
-				(current_setup->transcfg >> 32) & 0xFFFFFFFFUL,
-				kctx);
-	} else {
-		if (kbdev->system_coherency == COHERENCY_ACE)
-			current_setup->transtab |= AS_TRANSTAB_LPAE_SHARE_OUTER;
-	}
-
-	kbase_reg_write(kbdev, MMU_AS_REG(as->number, AS_TRANSTAB_LO),
-			current_setup->transtab & 0xFFFFFFFFUL, kctx);
-	kbase_reg_write(kbdev, MMU_AS_REG(as->number, AS_TRANSTAB_HI),
-			(current_setup->transtab >> 32) & 0xFFFFFFFFUL, kctx);
-
-	kbase_reg_write(kbdev, MMU_AS_REG(as->number, AS_MEMATTR_LO),
-			current_setup->memattr & 0xFFFFFFFFUL, kctx);
-	kbase_reg_write(kbdev, MMU_AS_REG(as->number, AS_MEMATTR_HI),
-			(current_setup->memattr >> 32) & 0xFFFFFFFFUL, kctx);
-
-	KBASE_TLSTREAM_TL_ATTRIB_AS_CONFIG(as,
-			current_setup->transtab,
-			current_setup->memattr,
-			transcfg);
-
-	write_cmd(kbdev, as->number, AS_COMMAND_UPDATE, kctx);
-}
-
-int kbase_mmu_hw_do_operation(struct kbase_device *kbdev, struct kbase_as *as,
-		struct kbase_context *kctx, u64 vpfn, u32 nr, u32 op,
-		unsigned int handling_irq)
-{
-	int ret;
-
-	lockdep_assert_held(&kbdev->mmu_hw_mutex);
-
-	if (op == AS_COMMAND_UNLOCK) {
-		/* Unlock doesn't require a lock first */
-		ret = write_cmd(kbdev, as->number, AS_COMMAND_UNLOCK, kctx);
-	} else {
-		u64 lock_addr = lock_region(kbdev, vpfn, nr);
-
-		/* Lock the region that needs to be updated */
-		kbase_reg_write(kbdev, MMU_AS_REG(as->number, AS_LOCKADDR_LO),
-				lock_addr & 0xFFFFFFFFUL, kctx);
-		kbase_reg_write(kbdev, MMU_AS_REG(as->number, AS_LOCKADDR_HI),
-				(lock_addr >> 32) & 0xFFFFFFFFUL, kctx);
-		write_cmd(kbdev, as->number, AS_COMMAND_LOCK, kctx);
-
-		/* Run the MMU operation */
-		write_cmd(kbdev, as->number, op, kctx);
-
-		/* Wait for the flush to complete */
-		ret = wait_ready(kbdev, as->number, kctx);
-
-		if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_9630)) {
-			/* Issue an UNLOCK command to ensure that valid page
-			   tables are re-read by the GPU after an update.
-			   Note that, the FLUSH command should perform all the
-			   actions necessary, however the bus logs show that if
-			   multiple page faults occur within an 8 page region
-			   the MMU does not always re-read the updated page
-			   table entries for later faults or is only partially
-			   read, it subsequently raises the page fault IRQ for
-			   the same addresses, the unlock ensures that the MMU
-			   cache is flushed, so updates can be re-read.  As the
-			   region is now unlocked we need to issue 2 UNLOCK
-			   commands in order to flush the MMU/uTLB,
-			   see PRLAM-8812.
-			 */
-			write_cmd(kbdev, as->number, AS_COMMAND_UNLOCK, kctx);
-			write_cmd(kbdev, as->number, AS_COMMAND_UNLOCK, kctx);
-		}
-	}
-
-	return ret;
-}
-
-void kbase_mmu_hw_clear_fault(struct kbase_device *kbdev, struct kbase_as *as,
-		struct kbase_context *kctx, enum kbase_mmu_fault_type type)
-{
-	unsigned long flags;
-	u32 pf_bf_mask;
-
-	spin_lock_irqsave(&kbdev->mmu_mask_change, flags);
-
-	/*
-	 * A reset is in-flight and we're flushing the IRQ + bottom half
-	 * so don't update anything as it could race with the reset code.
-	 */
-	if (kbdev->irq_reset_flush)
-		goto unlock;
-
-	/* Clear the page (and bus fault IRQ as well in case one occurred) */
-	pf_bf_mask = MMU_PAGE_FAULT(as->number);
-	if (type == KBASE_MMU_FAULT_TYPE_BUS ||
-			type == KBASE_MMU_FAULT_TYPE_BUS_UNEXPECTED)
-		pf_bf_mask |= MMU_BUS_ERROR(as->number);
-
-	kbase_reg_write(kbdev, MMU_REG(MMU_IRQ_CLEAR), pf_bf_mask, kctx);
-
-unlock:
-	spin_unlock_irqrestore(&kbdev->mmu_mask_change, flags);
-}
-
-void kbase_mmu_hw_enable_fault(struct kbase_device *kbdev, struct kbase_as *as,
-		struct kbase_context *kctx, enum kbase_mmu_fault_type type)
-{
-	unsigned long flags;
-	u32 irq_mask;
-
-	/* Enable the page fault IRQ (and bus fault IRQ as well in case one
-	 * occurred) */
-	spin_lock_irqsave(&kbdev->mmu_mask_change, flags);
-
-	/*
-	 * A reset is in-flight and we're flushing the IRQ + bottom half
-	 * so don't update anything as it could race with the reset code.
-	 */
-	if (kbdev->irq_reset_flush)
-		goto unlock;
-
-	irq_mask = kbase_reg_read(kbdev, MMU_REG(MMU_IRQ_MASK), kctx) |
-			MMU_PAGE_FAULT(as->number);
-
-	if (type == KBASE_MMU_FAULT_TYPE_BUS ||
-			type == KBASE_MMU_FAULT_TYPE_BUS_UNEXPECTED)
-		irq_mask |= MMU_BUS_ERROR(as->number);
-
-	kbase_reg_write(kbdev, MMU_REG(MMU_IRQ_MASK), irq_mask, kctx);
-
-unlock:
-	spin_unlock_irqrestore(&kbdev->mmu_mask_change, flags);
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_mmu_hw_direct.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_mmu_hw_direct.h
deleted file mode 100644
index c02253c6acc3..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_mmu_hw_direct.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * Interface file for the direct implementation for MMU hardware access
- *
- * Direct MMU hardware interface
- *
- * This module provides the interface(s) that are required by the direct
- * register access implementation of the MMU hardware interface
- */
-
-#ifndef _MALI_KBASE_MMU_HW_DIRECT_H_
-#define _MALI_KBASE_MMU_HW_DIRECT_H_
-
-#include <mali_kbase_defs.h>
-
-/**
- * kbase_mmu_interrupt - Process an MMU interrupt.
- *
- * Process the MMU interrupt that was reported by the &kbase_device.
- *
- * @kbdev:          kbase context to clear the fault from.
- * @irq_stat:       Value of the MMU_IRQ_STATUS register
- */
-void kbase_mmu_interrupt(struct kbase_device *kbdev, u32 irq_stat);
-
-#endif	/* _MALI_KBASE_MMU_HW_DIRECT_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_always_on.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_always_on.c
deleted file mode 100644
index 0614348e935a..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_always_on.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * "Always on" power management policy
- */
-
-#include <mali_kbase.h>
-#include <mali_kbase_pm.h>
-
-static u64 always_on_get_core_mask(struct kbase_device *kbdev)
-{
-	return kbdev->gpu_props.props.raw_props.shader_present;
-}
-
-static bool always_on_get_core_active(struct kbase_device *kbdev)
-{
-	return true;
-}
-
-static void always_on_init(struct kbase_device *kbdev)
-{
-	CSTD_UNUSED(kbdev);
-}
-
-static void always_on_term(struct kbase_device *kbdev)
-{
-	CSTD_UNUSED(kbdev);
-}
-
-/*
- * The struct kbase_pm_policy structure for the demand power policy.
- *
- * This is the static structure that defines the demand power policy's callback
- * and name.
- */
-const struct kbase_pm_policy kbase_pm_always_on_policy_ops = {
-	"always_on",			/* name */
-	always_on_init,			/* init */
-	always_on_term,			/* term */
-	always_on_get_core_mask,	/* get_core_mask */
-	always_on_get_core_active,	/* get_core_active */
-	0u,				/* flags */
-	KBASE_PM_POLICY_ID_ALWAYS_ON,	/* id */
-};
-
-KBASE_EXPORT_TEST_API(kbase_pm_always_on_policy_ops);
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_always_on.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_always_on.h
deleted file mode 100644
index f9d244b01bc2..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_always_on.h
+++ /dev/null
@@ -1,77 +0,0 @@
-
-/*
- *
- * (C) COPYRIGHT 2011-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * "Always on" power management policy
- */
-
-#ifndef MALI_KBASE_PM_ALWAYS_ON_H
-#define MALI_KBASE_PM_ALWAYS_ON_H
-
-/**
- * DOC:
- * The "Always on" power management policy has the following
- * characteristics:
- *
- * - When KBase indicates that the GPU will be powered up, but we don't yet
- *   know which Job Chains are to be run:
- *    All Shader Cores are powered up, regardless of whether or not they will
- *    be needed later.
- *
- * - When KBase indicates that a set of Shader Cores are needed to submit the
- *   currently queued Job Chains:
- *    All Shader Cores are kept powered, regardless of whether or not they will
- *    be needed
- *
- * - When KBase indicates that the GPU need not be powered:
- *    The Shader Cores are kept powered, regardless of whether or not they will
- *    be needed. The GPU itself is also kept powered, even though it is not
- *    needed.
- *
- * This policy is automatically overridden during system suspend: the desired
- * core state is ignored, and the cores are forced off regardless of what the
- * policy requests. After resuming from suspend, new changes to the desired
- * core state made by the policy are honored.
- *
- * Note:
- *
- * - KBase indicates the GPU will be powered up when it has a User Process that
- *   has just started to submit Job Chains.
- *
- * - KBase indicates the GPU need not be powered when all the Job Chains from
- *   User Processes have finished, and it is waiting for a User Process to
- *   submit some more Job Chains.
- */
-
-/**
- * struct kbasep_pm_policy_always_on - Private struct for policy instance data
- * @dummy: unused dummy variable
- *
- * This contains data that is private to the particular power policy that is
- * active.
- */
-struct kbasep_pm_policy_always_on {
-	int dummy;
-};
-
-extern const struct kbase_pm_policy kbase_pm_always_on_policy_ops;
-
-#endif /* MALI_KBASE_PM_ALWAYS_ON_H */
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_backend.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_backend.c
deleted file mode 100644
index cd8932650ed5..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_backend.c
+++ /dev/null
@@ -1,478 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-/*
- * GPU backend implementation of base kernel power management APIs
- */
-
-#include <mali_kbase.h>
-#include <mali_midg_regmap.h>
-#include <mali_kbase_config_defaults.h>
-
-#include <mali_kbase_pm.h>
-#include <mali_kbase_hwaccess_jm.h>
-#include <backend/gpu/mali_kbase_js_internal.h>
-#include <backend/gpu/mali_kbase_pm_internal.h>
-#include <backend/gpu/mali_kbase_jm_internal.h>
-
-static void kbase_pm_gpu_poweroff_wait_wq(struct work_struct *data);
-
-void kbase_pm_register_access_enable(struct kbase_device *kbdev)
-{
-	struct kbase_pm_callback_conf *callbacks;
-
-	callbacks = (struct kbase_pm_callback_conf *)POWER_MANAGEMENT_CALLBACKS;
-
-	if (callbacks)
-		callbacks->power_on_callback(kbdev);
-
-	kbdev->pm.backend.gpu_powered = true;
-}
-
-void kbase_pm_register_access_disable(struct kbase_device *kbdev)
-{
-	struct kbase_pm_callback_conf *callbacks;
-
-	callbacks = (struct kbase_pm_callback_conf *)POWER_MANAGEMENT_CALLBACKS;
-
-	if (callbacks)
-		callbacks->power_off_callback(kbdev);
-
-	kbdev->pm.backend.gpu_powered = false;
-}
-
-int kbase_hwaccess_pm_init(struct kbase_device *kbdev)
-{
-	int ret = 0;
-	struct kbase_pm_callback_conf *callbacks;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	mutex_init(&kbdev->pm.lock);
-
-	kbdev->pm.backend.gpu_poweroff_wait_wq = alloc_workqueue("kbase_pm_poweroff_wait",
-			WQ_HIGHPRI | WQ_UNBOUND, 1);
-	if (!kbdev->pm.backend.gpu_poweroff_wait_wq)
-		return -ENOMEM;
-
-	INIT_WORK(&kbdev->pm.backend.gpu_poweroff_wait_work,
-			kbase_pm_gpu_poweroff_wait_wq);
-
-	kbdev->pm.backend.gpu_powered = false;
-	kbdev->pm.suspending = false;
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-	kbdev->pm.backend.driver_ready_for_irqs = false;
-#endif /* CONFIG_MALI_BIFROST_DEBUG */
-	kbdev->pm.backend.gpu_in_desired_state = true;
-	init_waitqueue_head(&kbdev->pm.backend.gpu_in_desired_state_wait);
-
-	callbacks = (struct kbase_pm_callback_conf *)POWER_MANAGEMENT_CALLBACKS;
-	if (callbacks) {
-		kbdev->pm.backend.callback_power_on =
-					callbacks->power_on_callback;
-		kbdev->pm.backend.callback_power_off =
-					callbacks->power_off_callback;
-		kbdev->pm.backend.callback_power_suspend =
-					callbacks->power_suspend_callback;
-		kbdev->pm.backend.callback_power_resume =
-					callbacks->power_resume_callback;
-		kbdev->pm.callback_power_runtime_init =
-					callbacks->power_runtime_init_callback;
-		kbdev->pm.callback_power_runtime_term =
-					callbacks->power_runtime_term_callback;
-		kbdev->pm.backend.callback_power_runtime_on =
-					callbacks->power_runtime_on_callback;
-		kbdev->pm.backend.callback_power_runtime_off =
-					callbacks->power_runtime_off_callback;
-		kbdev->pm.backend.callback_power_runtime_idle =
-					callbacks->power_runtime_idle_callback;
-	} else {
-		kbdev->pm.backend.callback_power_on = NULL;
-		kbdev->pm.backend.callback_power_off = NULL;
-		kbdev->pm.backend.callback_power_suspend = NULL;
-		kbdev->pm.backend.callback_power_resume = NULL;
-		kbdev->pm.callback_power_runtime_init = NULL;
-		kbdev->pm.callback_power_runtime_term = NULL;
-		kbdev->pm.backend.callback_power_runtime_on = NULL;
-		kbdev->pm.backend.callback_power_runtime_off = NULL;
-		kbdev->pm.backend.callback_power_runtime_idle = NULL;
-	}
-
-	/* Initialise the metrics subsystem */
-	ret = kbasep_pm_metrics_init(kbdev);
-	if (ret)
-		return ret;
-
-	init_waitqueue_head(&kbdev->pm.backend.l2_powered_wait);
-	kbdev->pm.backend.l2_powered = 0;
-
-	init_waitqueue_head(&kbdev->pm.backend.reset_done_wait);
-	kbdev->pm.backend.reset_done = false;
-
-	init_waitqueue_head(&kbdev->pm.zero_active_count_wait);
-	kbdev->pm.active_count = 0;
-
-	spin_lock_init(&kbdev->pm.backend.gpu_cycle_counter_requests_lock);
-	spin_lock_init(&kbdev->pm.backend.gpu_powered_lock);
-
-	init_waitqueue_head(&kbdev->pm.backend.poweroff_wait);
-
-	if (kbase_pm_ca_init(kbdev) != 0)
-		goto workq_fail;
-
-	if (kbase_pm_policy_init(kbdev) != 0)
-		goto pm_policy_fail;
-
-	return 0;
-
-pm_policy_fail:
-	kbase_pm_ca_term(kbdev);
-workq_fail:
-	kbasep_pm_metrics_term(kbdev);
-	return -EINVAL;
-}
-
-void kbase_pm_do_poweron(struct kbase_device *kbdev, bool is_resume)
-{
-	lockdep_assert_held(&kbdev->pm.lock);
-
-	/* Turn clocks and interrupts on - no-op if we haven't done a previous
-	 * kbase_pm_clock_off() */
-	kbase_pm_clock_on(kbdev, is_resume);
-
-	/* Update core status as required by the policy */
-	KBASE_TIMELINE_PM_CHECKTRANS(kbdev,
-				SW_FLOW_PM_CHECKTRANS_PM_DO_POWERON_START);
-	kbase_pm_update_cores_state(kbdev);
-	KBASE_TIMELINE_PM_CHECKTRANS(kbdev,
-				SW_FLOW_PM_CHECKTRANS_PM_DO_POWERON_END);
-
-	/* NOTE: We don't wait to reach the desired state, since running atoms
-	 * will wait for that state to be reached anyway */
-}
-
-static void kbase_pm_gpu_poweroff_wait_wq(struct work_struct *data)
-{
-	struct kbase_device *kbdev = container_of(data, struct kbase_device,
-			pm.backend.gpu_poweroff_wait_work);
-	struct kbase_pm_device_data *pm = &kbdev->pm;
-	struct kbase_pm_backend_data *backend = &pm->backend;
-	struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
-	unsigned long flags;
-
-#if !PLATFORM_POWER_DOWN_ONLY
-	/* Wait for power transitions to complete. We do this with no locks held
-	 * so that we don't deadlock with any pending workqueues */
-	KBASE_TIMELINE_PM_CHECKTRANS(kbdev,
-				SW_FLOW_PM_CHECKTRANS_PM_DO_POWEROFF_START);
-	kbase_pm_check_transitions_sync(kbdev);
-	KBASE_TIMELINE_PM_CHECKTRANS(kbdev,
-				SW_FLOW_PM_CHECKTRANS_PM_DO_POWEROFF_END);
-#endif /* !PLATFORM_POWER_DOWN_ONLY */
-
-	mutex_lock(&js_devdata->runpool_mutex);
-	mutex_lock(&kbdev->pm.lock);
-
-#if PLATFORM_POWER_DOWN_ONLY
-	if (kbdev->pm.backend.gpu_powered) {
-		if (kbase_pm_get_ready_cores(kbdev, KBASE_PM_CORE_L2)) {
-			/* If L2 cache is powered then we must flush it before
-			 * we power off the GPU. Normally this would have been
-			 * handled when the L2 was powered off. */
-			kbase_gpu_cacheclean(kbdev);
-		}
-	}
-#endif /* PLATFORM_POWER_DOWN_ONLY */
-
-	if (!backend->poweron_required) {
-#if !PLATFORM_POWER_DOWN_ONLY
-		unsigned long flags;
-
-		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-		WARN_ON(kbdev->l2_available_bitmap ||
-				kbdev->shader_available_bitmap ||
-				kbdev->tiler_available_bitmap);
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-#endif /* !PLATFORM_POWER_DOWN_ONLY */
-
-		/* Consume any change-state events */
-		kbase_timeline_pm_check_handle_event(kbdev,
-					KBASE_TIMELINE_PM_EVENT_GPU_STATE_CHANGED);
-
-		/* Disable interrupts and turn the clock off */
-		if (!kbase_pm_clock_off(kbdev, backend->poweroff_is_suspend)) {
-			/*
-			 * Page/bus faults are pending, must drop locks to
-			 * process.  Interrupts are disabled so no more faults
-			 * should be generated at this point.
-			 */
-			mutex_unlock(&kbdev->pm.lock);
-			mutex_unlock(&js_devdata->runpool_mutex);
-			kbase_flush_mmu_wqs(kbdev);
-			mutex_lock(&js_devdata->runpool_mutex);
-			mutex_lock(&kbdev->pm.lock);
-
-			/* Turn off clock now that fault have been handled. We
-			 * dropped locks so poweron_required may have changed -
-			 * power back on if this is the case.*/
-			if (backend->poweron_required)
-				kbase_pm_clock_on(kbdev, false);
-			else
-				WARN_ON(!kbase_pm_clock_off(kbdev,
-						backend->poweroff_is_suspend));
-		}
-	}
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	backend->poweroff_wait_in_progress = false;
-	if (backend->poweron_required) {
-		backend->poweron_required = false;
-		kbase_pm_update_cores_state_nolock(kbdev);
-		kbase_backend_slot_update(kbdev);
-	}
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	mutex_unlock(&kbdev->pm.lock);
-	mutex_unlock(&js_devdata->runpool_mutex);
-
-	wake_up(&kbdev->pm.backend.poweroff_wait);
-}
-
-void kbase_pm_do_poweroff(struct kbase_device *kbdev, bool is_suspend)
-{
-	unsigned long flags;
-
-	lockdep_assert_held(&kbdev->pm.lock);
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	if (!kbdev->pm.backend.poweroff_wait_in_progress) {
-		/* Force all cores off */
-		kbdev->pm.backend.desired_shader_state = 0;
-		kbdev->pm.backend.desired_tiler_state = 0;
-
-		/* Force all cores to be unavailable, in the situation where
-		 * transitions are in progress for some cores but not others,
-		 * and kbase_pm_check_transitions_nolock can not immediately
-		 * power off the cores */
-		kbdev->shader_available_bitmap = 0;
-		kbdev->tiler_available_bitmap = 0;
-		kbdev->l2_available_bitmap = 0;
-
-		kbdev->pm.backend.poweroff_wait_in_progress = true;
-		kbdev->pm.backend.poweroff_is_suspend = is_suspend;
-
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-		/*Kick off wq here. Callers will have to wait*/
-		queue_work(kbdev->pm.backend.gpu_poweroff_wait_wq,
-				&kbdev->pm.backend.gpu_poweroff_wait_work);
-	} else {
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-	}
-}
-
-static bool is_poweroff_in_progress(struct kbase_device *kbdev)
-{
-	bool ret;
-	unsigned long flags;
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	ret = (kbdev->pm.backend.poweroff_wait_in_progress == false);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	return ret;
-}
-
-void kbase_pm_wait_for_poweroff_complete(struct kbase_device *kbdev)
-{
-	wait_event_killable(kbdev->pm.backend.poweroff_wait,
-			is_poweroff_in_progress(kbdev));
-}
-
-int kbase_hwaccess_pm_powerup(struct kbase_device *kbdev,
-		unsigned int flags)
-{
-	struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
-	unsigned long irq_flags;
-	int ret;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	mutex_lock(&js_devdata->runpool_mutex);
-	mutex_lock(&kbdev->pm.lock);
-
-	/* A suspend won't happen during startup/insmod */
-	KBASE_DEBUG_ASSERT(!kbase_pm_is_suspending(kbdev));
-
-	/* Power up the GPU, don't enable IRQs as we are not ready to receive
-	 * them. */
-	ret = kbase_pm_init_hw(kbdev, flags);
-	if (ret) {
-		mutex_unlock(&kbdev->pm.lock);
-		mutex_unlock(&js_devdata->runpool_mutex);
-		return ret;
-	}
-
-	kbasep_pm_init_core_use_bitmaps(kbdev);
-
-	kbdev->pm.debug_core_mask_all = kbdev->pm.debug_core_mask[0] =
-			kbdev->pm.debug_core_mask[1] =
-			kbdev->pm.debug_core_mask[2] =
-			kbdev->gpu_props.props.raw_props.shader_present;
-
-	/* Pretend the GPU is active to prevent a power policy turning the GPU
-	 * cores off */
-	kbdev->pm.active_count = 1;
-
-	spin_lock_irqsave(&kbdev->pm.backend.gpu_cycle_counter_requests_lock,
-								irq_flags);
-	/* Ensure cycle counter is off */
-	kbdev->pm.backend.gpu_cycle_counter_requests = 0;
-	spin_unlock_irqrestore(
-			&kbdev->pm.backend.gpu_cycle_counter_requests_lock,
-								irq_flags);
-
-	/* We are ready to receive IRQ's now as power policy is set up, so
-	 * enable them now. */
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-	spin_lock_irqsave(&kbdev->pm.backend.gpu_powered_lock, irq_flags);
-	kbdev->pm.backend.driver_ready_for_irqs = true;
-	spin_unlock_irqrestore(&kbdev->pm.backend.gpu_powered_lock, irq_flags);
-#endif
-	kbase_pm_enable_interrupts(kbdev);
-
-	/* Turn on the GPU and any cores needed by the policy */
-	kbase_pm_do_poweron(kbdev, false);
-	mutex_unlock(&kbdev->pm.lock);
-	mutex_unlock(&js_devdata->runpool_mutex);
-
-	/* Idle the GPU and/or cores, if the policy wants it to */
-	kbase_pm_context_idle(kbdev);
-
-	return 0;
-}
-
-void kbase_hwaccess_pm_halt(struct kbase_device *kbdev)
-{
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	mutex_lock(&kbdev->pm.lock);
-	kbase_pm_cancel_deferred_poweroff(kbdev);
-	kbase_pm_do_poweroff(kbdev, false);
-	mutex_unlock(&kbdev->pm.lock);
-}
-
-KBASE_EXPORT_TEST_API(kbase_hwaccess_pm_halt);
-
-void kbase_hwaccess_pm_term(struct kbase_device *kbdev)
-{
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(kbdev->pm.active_count == 0);
-	KBASE_DEBUG_ASSERT(kbdev->pm.backend.gpu_cycle_counter_requests == 0);
-
-	/* Free any resources the policy allocated */
-	kbase_pm_policy_term(kbdev);
-	kbase_pm_ca_term(kbdev);
-
-	/* Shut down the metrics subsystem */
-	kbasep_pm_metrics_term(kbdev);
-
-	destroy_workqueue(kbdev->pm.backend.gpu_poweroff_wait_wq);
-}
-
-void kbase_pm_power_changed(struct kbase_device *kbdev)
-{
-	bool cores_are_available;
-	unsigned long flags;
-
-	KBASE_TIMELINE_PM_CHECKTRANS(kbdev,
-				SW_FLOW_PM_CHECKTRANS_GPU_INTERRUPT_START);
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	cores_are_available = kbase_pm_check_transitions_nolock(kbdev);
-	KBASE_TIMELINE_PM_CHECKTRANS(kbdev,
-				SW_FLOW_PM_CHECKTRANS_GPU_INTERRUPT_END);
-
-	if (cores_are_available) {
-		/* Log timelining information that a change in state has
-		 * completed */
-		kbase_timeline_pm_handle_event(kbdev,
-				KBASE_TIMELINE_PM_EVENT_GPU_STATE_CHANGED);
-
-		kbase_backend_slot_update(kbdev);
-	}
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-}
-
-void kbase_pm_set_debug_core_mask(struct kbase_device *kbdev,
-		u64 new_core_mask_js0, u64 new_core_mask_js1,
-		u64 new_core_mask_js2)
-{
-	kbdev->pm.debug_core_mask[0] = new_core_mask_js0;
-	kbdev->pm.debug_core_mask[1] = new_core_mask_js1;
-	kbdev->pm.debug_core_mask[2] = new_core_mask_js2;
-	kbdev->pm.debug_core_mask_all = new_core_mask_js0 | new_core_mask_js1 |
-			new_core_mask_js2;
-
-	kbase_pm_update_cores_state_nolock(kbdev);
-}
-
-void kbase_hwaccess_pm_gpu_active(struct kbase_device *kbdev)
-{
-	kbase_pm_update_active(kbdev);
-}
-
-void kbase_hwaccess_pm_gpu_idle(struct kbase_device *kbdev)
-{
-	kbase_pm_update_active(kbdev);
-}
-
-void kbase_hwaccess_pm_suspend(struct kbase_device *kbdev)
-{
-	struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
-
-	/* Force power off the GPU and all cores (regardless of policy), only
-	 * after the PM active count reaches zero (otherwise, we risk turning it
-	 * off prematurely) */
-	mutex_lock(&js_devdata->runpool_mutex);
-	mutex_lock(&kbdev->pm.lock);
-
-	kbase_pm_cancel_deferred_poweroff(kbdev);
-	kbase_pm_do_poweroff(kbdev, true);
-
-	kbase_backend_timer_suspend(kbdev);
-
-	mutex_unlock(&kbdev->pm.lock);
-	mutex_unlock(&js_devdata->runpool_mutex);
-
-	kbase_pm_wait_for_poweroff_complete(kbdev);
-}
-
-void kbase_hwaccess_pm_resume(struct kbase_device *kbdev)
-{
-	struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
-
-	mutex_lock(&js_devdata->runpool_mutex);
-	mutex_lock(&kbdev->pm.lock);
-
-	kbdev->pm.suspending = false;
-	kbase_pm_do_poweron(kbdev, true);
-
-	kbase_backend_timer_resume(kbdev);
-
-	mutex_unlock(&kbdev->pm.lock);
-	mutex_unlock(&js_devdata->runpool_mutex);
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca.c
deleted file mode 100644
index c17db8be8877..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca.c
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2013-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * Base kernel core availability APIs
- */
-
-#include <mali_kbase.h>
-#include <mali_kbase_pm.h>
-#include <backend/gpu/mali_kbase_pm_internal.h>
-
-static const struct kbase_pm_ca_policy *const policy_list[] = {
-	&kbase_pm_ca_fixed_policy_ops,
-#ifdef CONFIG_MALI_BIFROST_DEVFREQ
-	&kbase_pm_ca_devfreq_policy_ops,
-#endif
-#if !MALI_CUSTOMER_RELEASE
-	&kbase_pm_ca_random_policy_ops
-#endif
-};
-
-/**
- * POLICY_COUNT - The number of policies available in the system.
- *
- * This is derived from the number of functions listed in policy_list.
- */
-#define POLICY_COUNT (sizeof(policy_list)/sizeof(*policy_list))
-
-int kbase_pm_ca_init(struct kbase_device *kbdev)
-{
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	kbdev->pm.backend.ca_current_policy = policy_list[0];
-
-	kbdev->pm.backend.ca_current_policy->init(kbdev);
-
-	return 0;
-}
-
-void kbase_pm_ca_term(struct kbase_device *kbdev)
-{
-	kbdev->pm.backend.ca_current_policy->term(kbdev);
-}
-
-int kbase_pm_ca_list_policies(const struct kbase_pm_ca_policy * const **list)
-{
-	if (!list)
-		return POLICY_COUNT;
-
-	*list = policy_list;
-
-	return POLICY_COUNT;
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_ca_list_policies);
-
-const struct kbase_pm_ca_policy
-*kbase_pm_ca_get_policy(struct kbase_device *kbdev)
-{
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	return kbdev->pm.backend.ca_current_policy;
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_ca_get_policy);
-
-void kbase_pm_ca_set_policy(struct kbase_device *kbdev,
-				const struct kbase_pm_ca_policy *new_policy)
-{
-	const struct kbase_pm_ca_policy *old_policy;
-	unsigned long flags;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(new_policy != NULL);
-
-	KBASE_TRACE_ADD(kbdev, PM_CA_SET_POLICY, NULL, NULL, 0u,
-								new_policy->id);
-
-	/* During a policy change we pretend the GPU is active */
-	/* A suspend won't happen here, because we're in a syscall from a
-	 * userspace thread */
-	kbase_pm_context_active(kbdev);
-
-	mutex_lock(&kbdev->pm.lock);
-
-	/* Remove the policy to prevent IRQ handlers from working on it */
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	old_policy = kbdev->pm.backend.ca_current_policy;
-	kbdev->pm.backend.ca_current_policy = NULL;
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	if (old_policy->term)
-		old_policy->term(kbdev);
-
-	if (new_policy->init)
-		new_policy->init(kbdev);
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	kbdev->pm.backend.ca_current_policy = new_policy;
-
-	/* If any core power state changes were previously attempted, but
-	 * couldn't be made because the policy was changing (current_policy was
-	 * NULL), then re-try them here. */
-	kbase_pm_update_cores_state_nolock(kbdev);
-
-	kbdev->pm.backend.ca_current_policy->update_core_status(kbdev,
-					kbdev->shader_ready_bitmap,
-					kbdev->shader_transitioning_bitmap);
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	mutex_unlock(&kbdev->pm.lock);
-
-	/* Now the policy change is finished, we release our fake context active
-	 * reference */
-	kbase_pm_context_idle(kbdev);
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_ca_set_policy);
-
-u64 kbase_pm_ca_get_core_mask(struct kbase_device *kbdev)
-{
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	/* All cores must be enabled when instrumentation is in use */
-	if (kbdev->pm.backend.instr_enabled)
-		return kbdev->gpu_props.props.raw_props.shader_present &
-				kbdev->pm.debug_core_mask_all;
-
-	if (kbdev->pm.backend.ca_current_policy == NULL)
-		return kbdev->gpu_props.props.raw_props.shader_present &
-				kbdev->pm.debug_core_mask_all;
-
-	return kbdev->pm.backend.ca_current_policy->get_core_mask(kbdev) &
-						kbdev->pm.debug_core_mask_all;
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_ca_get_core_mask);
-
-void kbase_pm_ca_update_core_status(struct kbase_device *kbdev, u64 cores_ready,
-							u64 cores_transitioning)
-{
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	if (kbdev->pm.backend.ca_current_policy != NULL)
-		kbdev->pm.backend.ca_current_policy->update_core_status(kbdev,
-							cores_ready,
-							cores_transitioning);
-}
-
-void kbase_pm_ca_instr_enable(struct kbase_device *kbdev)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	kbdev->pm.backend.instr_enabled = true;
-
-	kbase_pm_update_cores_state_nolock(kbdev);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-}
-
-void kbase_pm_ca_instr_disable(struct kbase_device *kbdev)
-{
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-	kbdev->pm.backend.instr_enabled = false;
-
-	kbase_pm_update_cores_state_nolock(kbdev);
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca.h
deleted file mode 100644
index ee9e751f2d79..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * Base kernel core availability APIs
- */
-
-#ifndef _KBASE_PM_CA_H_
-#define _KBASE_PM_CA_H_
-
-/**
- * kbase_pm_ca_init - Initialize core availability framework
- *
- * Must be called before calling any other core availability function
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- *
- * Return: 0 if the core availability framework was successfully initialized,
- *         -errno otherwise
- */
-int kbase_pm_ca_init(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_ca_term - Terminate core availability framework
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_ca_term(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_ca_get_core_mask - Get currently available shaders core mask
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- *
- * Returns a mask of the currently available shader cores.
- * Calls into the core availability policy
- *
- * Return: The bit mask of available cores
- */
-u64 kbase_pm_ca_get_core_mask(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_ca_update_core_status - Update core status
- *
- * @kbdev:               The kbase device structure for the device (must be
- *                       a valid pointer)
- * @cores_ready:         The bit mask of cores ready for job submission
- * @cores_transitioning: The bit mask of cores that are transitioning power
- *                       state
- *
- * Update core availability policy with current core power status
- *
- * Calls into the core availability policy
- */
-void kbase_pm_ca_update_core_status(struct kbase_device *kbdev, u64 cores_ready,
-						u64 cores_transitioning);
-
-/**
- * kbase_pm_ca_instr_enable - Enable override for instrumentation
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- *
- * This overrides the output of the core availability policy, ensuring that all
- * cores are available
- */
-void kbase_pm_ca_instr_enable(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_ca_instr_disable - Disable override for instrumentation
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- *
- * This disables any previously enabled override, and resumes normal policy
- * functionality
- */
-void kbase_pm_ca_instr_disable(struct kbase_device *kbdev);
-
-#endif /* _KBASE_PM_CA_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_devfreq.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_devfreq.c
deleted file mode 100644
index 66bf660cffb6..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_devfreq.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * A core availability policy implementing core mask selection from devfreq OPPs
- *
- */
-
-#include <mali_kbase.h>
-#include <mali_kbase_pm.h>
-#include <backend/gpu/mali_kbase_pm_internal.h>
-#include <linux/version.h>
-
-void kbase_devfreq_set_core_mask(struct kbase_device *kbdev, u64 core_mask)
-{
-	struct kbasep_pm_ca_policy_devfreq *data =
-				&kbdev->pm.backend.ca_policy_data.devfreq;
-	unsigned long flags;
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	data->cores_desired = core_mask;
-
-	/* Disable any cores that are now unwanted */
-	data->cores_enabled &= data->cores_desired;
-
-	kbdev->pm.backend.ca_in_transition = true;
-
-	/* If there are no cores to be powered off then power on desired cores
-	 */
-	if (!(data->cores_used & ~data->cores_desired)) {
-		data->cores_enabled = data->cores_desired;
-		kbdev->pm.backend.ca_in_transition = false;
-	}
-
-	kbase_pm_update_cores_state_nolock(kbdev);
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	dev_dbg(kbdev->dev, "Devfreq policy : new core mask=%llX %llX\n",
-				data->cores_desired, data->cores_enabled);
-}
-
-static void devfreq_init(struct kbase_device *kbdev)
-{
-	struct kbasep_pm_ca_policy_devfreq *data =
-				&kbdev->pm.backend.ca_policy_data.devfreq;
-
-	if (kbdev->current_core_mask) {
-		data->cores_enabled = kbdev->current_core_mask;
-		data->cores_desired = kbdev->current_core_mask;
-	} else {
-		data->cores_enabled =
-				kbdev->gpu_props.props.raw_props.shader_present;
-		data->cores_desired =
-				kbdev->gpu_props.props.raw_props.shader_present;
-	}
-	data->cores_used = 0;
-	kbdev->pm.backend.ca_in_transition = false;
-}
-
-static void devfreq_term(struct kbase_device *kbdev)
-{
-}
-
-static u64 devfreq_get_core_mask(struct kbase_device *kbdev)
-{
-	return kbdev->pm.backend.ca_policy_data.devfreq.cores_enabled;
-}
-
-static void devfreq_update_core_status(struct kbase_device *kbdev,
-							u64 cores_ready,
-							u64 cores_transitioning)
-{
-	struct kbasep_pm_ca_policy_devfreq *data =
-				&kbdev->pm.backend.ca_policy_data.devfreq;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	data->cores_used = cores_ready | cores_transitioning;
-
-	/* If in desired state then clear transition flag */
-	if (data->cores_enabled == data->cores_desired)
-		kbdev->pm.backend.ca_in_transition = false;
-
-	/* If all undesired cores are now off then power on desired cores.
-	 * The direct comparison against cores_enabled limits potential
-	 * recursion to one level */
-	if (!(data->cores_used & ~data->cores_desired) &&
-				data->cores_enabled != data->cores_desired) {
-		data->cores_enabled = data->cores_desired;
-
-		kbase_pm_update_cores_state_nolock(kbdev);
-
-		kbdev->pm.backend.ca_in_transition = false;
-	}
-}
-
-/*
- * The struct kbase_pm_ca_policy structure for the devfreq core availability
- * policy.
- *
- * This is the static structure that defines the devfreq core availability power
- * policy's callback and name.
- */
-const struct kbase_pm_ca_policy kbase_pm_ca_devfreq_policy_ops = {
-	"devfreq",			/* name */
-	devfreq_init,			/* init */
-	devfreq_term,			/* term */
-	devfreq_get_core_mask,		/* get_core_mask */
-	devfreq_update_core_status,	/* update_core_status */
-	0u,				/* flags */
-	KBASE_PM_CA_POLICY_ID_DEVFREQ,	/* id */
-};
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_devfreq.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_devfreq.h
deleted file mode 100644
index 7ab3cd4d8460..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_devfreq.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * A core availability policy for use with devfreq, where core masks are
- * associated with OPPs.
- */
-
-#ifndef MALI_KBASE_PM_CA_DEVFREQ_H
-#define MALI_KBASE_PM_CA_DEVFREQ_H
-
-/**
- * struct kbasep_pm_ca_policy_devfreq - Private structure for devfreq ca policy
- *
- * This contains data that is private to the devfreq core availability
- * policy.
- *
- * @cores_desired: Cores that the policy wants to be available
- * @cores_enabled: Cores that the policy is currently returning as available
- * @cores_used: Cores currently powered or transitioning
- */
-struct kbasep_pm_ca_policy_devfreq {
-	u64 cores_desired;
-	u64 cores_enabled;
-	u64 cores_used;
-};
-
-extern const struct kbase_pm_ca_policy kbase_pm_ca_devfreq_policy_ops;
-
-/**
- * kbase_devfreq_set_core_mask - Set core mask for policy to use
- * @kbdev: Device pointer
- * @core_mask: New core mask
- *
- * The new core mask will have immediate effect if the GPU is powered, or will
- * take effect when it is next powered on.
- */
-void kbase_devfreq_set_core_mask(struct kbase_device *kbdev, u64 core_mask);
-
-#endif /* MALI_KBASE_PM_CA_DEVFREQ_H */
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_fixed.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_fixed.c
deleted file mode 100644
index 864612d31f9b..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_fixed.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2013-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * A power policy implementing fixed core availability
- */
-
-#include <mali_kbase.h>
-#include <mali_kbase_pm.h>
-
-static void fixed_init(struct kbase_device *kbdev)
-{
-	kbdev->pm.backend.ca_in_transition = false;
-}
-
-static void fixed_term(struct kbase_device *kbdev)
-{
-	CSTD_UNUSED(kbdev);
-}
-
-static u64 fixed_get_core_mask(struct kbase_device *kbdev)
-{
-	return kbdev->gpu_props.props.raw_props.shader_present;
-}
-
-static void fixed_update_core_status(struct kbase_device *kbdev,
-					u64 cores_ready,
-					u64 cores_transitioning)
-{
-	CSTD_UNUSED(kbdev);
-	CSTD_UNUSED(cores_ready);
-	CSTD_UNUSED(cores_transitioning);
-}
-
-/*
- * The struct kbase_pm_policy structure for the fixed power policy.
- *
- * This is the static structure that defines the fixed power policy's callback
- * and name.
- */
-const struct kbase_pm_ca_policy kbase_pm_ca_fixed_policy_ops = {
-	"fixed",			/* name */
-	fixed_init,			/* init */
-	fixed_term,			/* term */
-	fixed_get_core_mask,		/* get_core_mask */
-	fixed_update_core_status,	/* update_core_status */
-	0u,				/* flags */
-	KBASE_PM_CA_POLICY_ID_FIXED,	/* id */
-};
-
-KBASE_EXPORT_TEST_API(kbase_pm_ca_fixed_policy_ops);
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_fixed.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_fixed.h
deleted file mode 100644
index a763155cb703..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_ca_fixed.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2013-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * A power policy implementing fixed core availability
- */
-
-#ifndef MALI_KBASE_PM_CA_FIXED_H
-#define MALI_KBASE_PM_CA_FIXED_H
-
-/**
- * struct kbasep_pm_ca_policy_fixed - Private structure for policy instance data
- *
- * @dummy: Dummy member - no state is needed
- *
- * This contains data that is private to the particular power policy that is
- * active.
- */
-struct kbasep_pm_ca_policy_fixed {
-	int dummy;
-};
-
-extern const struct kbase_pm_ca_policy kbase_pm_ca_fixed_policy_ops;
-
-#endif /* MALI_KBASE_PM_CA_FIXED_H */
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_coarse_demand.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_coarse_demand.c
deleted file mode 100644
index f891fa225a89..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_coarse_demand.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * "Coarse Demand" power management policy
- */
-
-#include <mali_kbase.h>
-#include <mali_kbase_pm.h>
-
-static u64 coarse_demand_get_core_mask(struct kbase_device *kbdev)
-{
-	if (kbdev->pm.active_count == 0)
-		return 0;
-
-	return kbdev->gpu_props.props.raw_props.shader_present;
-}
-
-static bool coarse_demand_get_core_active(struct kbase_device *kbdev)
-{
-	if (0 == kbdev->pm.active_count && !(kbdev->shader_needed_bitmap |
-			kbdev->shader_inuse_bitmap) && !kbdev->tiler_needed_cnt
-			&& !kbdev->tiler_inuse_cnt)
-		return false;
-
-	return true;
-}
-
-static void coarse_demand_init(struct kbase_device *kbdev)
-{
-	CSTD_UNUSED(kbdev);
-}
-
-static void coarse_demand_term(struct kbase_device *kbdev)
-{
-	CSTD_UNUSED(kbdev);
-}
-
-/* The struct kbase_pm_policy structure for the demand power policy.
- *
- * This is the static structure that defines the demand power policy's callback
- * and name.
- */
-const struct kbase_pm_policy kbase_pm_coarse_demand_policy_ops = {
-	"coarse_demand",			/* name */
-	coarse_demand_init,			/* init */
-	coarse_demand_term,			/* term */
-	coarse_demand_get_core_mask,		/* get_core_mask */
-	coarse_demand_get_core_active,		/* get_core_active */
-	0u,					/* flags */
-	KBASE_PM_POLICY_ID_COARSE_DEMAND,	/* id */
-};
-
-KBASE_EXPORT_TEST_API(kbase_pm_coarse_demand_policy_ops);
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_coarse_demand.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_coarse_demand.h
deleted file mode 100644
index 749d305eee9a..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_coarse_demand.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * "Coarse Demand" power management policy
- */
-
-#ifndef MALI_KBASE_PM_COARSE_DEMAND_H
-#define MALI_KBASE_PM_COARSE_DEMAND_H
-
-/**
- * DOC:
- * The "Coarse" demand power management policy has the following
- * characteristics:
- * - When KBase indicates that the GPU will be powered up, but we don't yet
- *   know which Job Chains are to be run:
- *  - All Shader Cores are powered up, regardless of whether or not they will
- *    be needed later.
- * - When KBase indicates that a set of Shader Cores are needed to submit the
- *   currently queued Job Chains:
- *  - All Shader Cores are kept powered, regardless of whether or not they will
- *    be needed
- * - When KBase indicates that the GPU need not be powered:
- *  - The Shader Cores are powered off, and the GPU itself is powered off too.
- *
- * @note:
- * - KBase indicates the GPU will be powered up when it has a User Process that
- *   has just started to submit Job Chains.
- * - KBase indicates the GPU need not be powered when all the Job Chains from
- *   User Processes have finished, and it is waiting for a User Process to
- *   submit some more Job Chains.
- */
-
-/**
- * struct kbasep_pm_policy_coarse_demand - Private structure for coarse demand
- *                                         policy
- *
- * This contains data that is private to the coarse demand power policy.
- *
- * @dummy: Dummy member - no state needed
- */
-struct kbasep_pm_policy_coarse_demand {
-	int dummy;
-};
-
-extern const struct kbase_pm_policy kbase_pm_coarse_demand_policy_ops;
-
-#endif /* MALI_KBASE_PM_COARSE_DEMAND_H */
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_defs.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_defs.h
deleted file mode 100644
index 564fbda1116a..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_defs.h
+++ /dev/null
@@ -1,519 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * Backend-specific Power Manager definitions
- */
-
-#ifndef _KBASE_PM_HWACCESS_DEFS_H_
-#define _KBASE_PM_HWACCESS_DEFS_H_
-
-#include "mali_kbase_pm_ca_fixed.h"
-#include "mali_kbase_pm_ca_devfreq.h"
-#if !MALI_CUSTOMER_RELEASE
-#include "mali_kbase_pm_ca_random.h"
-#endif
-
-#include "mali_kbase_pm_always_on.h"
-#include "mali_kbase_pm_coarse_demand.h"
-#include "mali_kbase_pm_demand.h"
-#if !MALI_CUSTOMER_RELEASE
-#include "mali_kbase_pm_demand_always_powered.h"
-#include "mali_kbase_pm_fast_start.h"
-#endif
-
-/* Forward definition - see mali_kbase.h */
-struct kbase_device;
-struct kbase_jd_atom;
-
-/**
- * enum kbase_pm_core_type - The types of core in a GPU.
- *
- * These enumerated values are used in calls to
- * - kbase_pm_get_present_cores()
- * - kbase_pm_get_active_cores()
- * - kbase_pm_get_trans_cores()
- * - kbase_pm_get_ready_cores().
- *
- * They specify which type of core should be acted on.  These values are set in
- * a manner that allows core_type_to_reg() function to be simpler and more
- * efficient.
- *
- * @KBASE_PM_CORE_L2: The L2 cache
- * @KBASE_PM_CORE_SHADER: Shader cores
- * @KBASE_PM_CORE_TILER: Tiler cores
- * @KBASE_PM_CORE_STACK: Core stacks
- */
-enum kbase_pm_core_type {
-	KBASE_PM_CORE_L2 = L2_PRESENT_LO,
-	KBASE_PM_CORE_SHADER = SHADER_PRESENT_LO,
-	KBASE_PM_CORE_TILER = TILER_PRESENT_LO,
-	KBASE_PM_CORE_STACK = STACK_PRESENT_LO
-};
-
-/**
- * struct kbasep_pm_metrics_data - Metrics data collected for use by the power
- *                                 management framework.
- *
- *  @time_period_start: time at which busy/idle measurements started
- *  @time_busy: number of ns the GPU was busy executing jobs since the
- *          @time_period_start timestamp.
- *  @time_idle: number of ns since time_period_start the GPU was not executing
- *          jobs since the @time_period_start timestamp.
- *  @prev_busy: busy time in ns of previous time period.
- *           Updated when metrics are reset.
- *  @prev_idle: idle time in ns of previous time period
- *           Updated when metrics are reset.
- *  @gpu_active: true when the GPU is executing jobs. false when
- *           not. Updated when the job scheduler informs us a job in submitted
- *           or removed from a GPU slot.
- *  @busy_cl: number of ns the GPU was busy executing CL jobs. Note that
- *           if two CL jobs were active for 400ns, this value would be updated
- *           with 800.
- *  @busy_gl: number of ns the GPU was busy executing GL jobs. Note that
- *           if two GL jobs were active for 400ns, this value would be updated
- *           with 800.
- *  @active_cl_ctx: number of CL jobs active on the GPU. Array is per-device.
- *  @active_gl_ctx: number of GL jobs active on the GPU. Array is per-slot. As
- *           GL jobs never run on slot 2 this slot is not recorded.
- *  @lock: spinlock protecting the kbasep_pm_metrics_data structure
- *  @timer: timer to regularly make DVFS decisions based on the power
- *           management metrics.
- *  @timer_active: boolean indicating @timer is running
- *  @platform_data: pointer to data controlled by platform specific code
- *  @kbdev: pointer to kbase device for which metrics are collected
- *
- */
-struct kbasep_pm_metrics_data {
-	ktime_t time_period_start;
-	u32 time_busy;
-	u32 time_idle;
-	u32 prev_busy;
-	u32 prev_idle;
-	bool gpu_active;
-	u32 busy_cl[2];
-	u32 busy_gl;
-	u32 active_cl_ctx[2];
-	u32 active_gl_ctx[2]; /* GL jobs can only run on 2 of the 3 job slots */
-	spinlock_t lock;
-
-#ifdef CONFIG_MALI_BIFROST_DVFS
-	struct hrtimer timer;
-	bool timer_active;
-#endif
-
-	void *platform_data;
-	struct kbase_device *kbdev;
-};
-
-union kbase_pm_policy_data {
-	struct kbasep_pm_policy_always_on always_on;
-	struct kbasep_pm_policy_coarse_demand coarse_demand;
-	struct kbasep_pm_policy_demand demand;
-#if !MALI_CUSTOMER_RELEASE
-	struct kbasep_pm_policy_demand_always_powered demand_always_powered;
-	struct kbasep_pm_policy_fast_start fast_start;
-#endif
-};
-
-union kbase_pm_ca_policy_data {
-	struct kbasep_pm_ca_policy_fixed fixed;
-	struct kbasep_pm_ca_policy_devfreq devfreq;
-#if !MALI_CUSTOMER_RELEASE
-	struct kbasep_pm_ca_policy_random random;
-#endif
-};
-
-/**
- * struct kbase_pm_backend_data - Data stored per device for power management.
- *
- * This structure contains data for the power management framework. There is one
- * instance of this structure per device in the system.
- *
- * @ca_current_policy: The policy that is currently actively controlling core
- *                     availability.
- * @pm_current_policy: The policy that is currently actively controlling the
- *                     power state.
- * @ca_policy_data:    Private data for current CA policy
- * @pm_policy_data:    Private data for current PM policy
- * @ca_in_transition:  Flag indicating when core availability policy is
- *                     transitioning cores. The core availability policy must
- *                     set this when a change in core availability is occurring.
- *                     power_change_lock must be held when accessing this.
- * @reset_done:        Flag when a reset is complete
- * @reset_done_wait:   Wait queue to wait for changes to @reset_done
- * @l2_powered_wait:   Wait queue for whether the l2 cache has been powered as
- *                     requested
- * @l2_powered:        State indicating whether all the l2 caches are powered.
- *                     Non-zero indicates they're *all* powered
- *                     Zero indicates that some (or all) are not powered
- * @gpu_cycle_counter_requests: The reference count of active gpu cycle counter
- *                              users
- * @gpu_cycle_counter_requests_lock: Lock to protect @gpu_cycle_counter_requests
- * @desired_shader_state: A bit mask identifying the shader cores that the
- *                        power policy would like to be on. The current state
- *                        of the cores may be different, but there should be
- *                        transitions in progress that will eventually achieve
- *                        this state (assuming that the policy doesn't change
- *                        its mind in the mean time).
- * @powering_on_shader_state: A bit mask indicating which shader cores are
- *                            currently in a power-on transition
- * @desired_tiler_state: A bit mask identifying the tiler cores that the power
- *                       policy would like to be on. See @desired_shader_state
- * @powering_on_tiler_state: A bit mask indicating which tiler core are
- *                           currently in a power-on transition
- * @powering_on_l2_state: A bit mask indicating which l2-caches are currently
- *                        in a power-on transition
- * @powering_on_stack_state: A bit mask indicating which core stacks are
- *                           currently in a power-on transition
- * @gpu_in_desired_state: This flag is set if the GPU is powered as requested
- *                        by the desired_xxx_state variables
- * @gpu_in_desired_state_wait: Wait queue set when @gpu_in_desired_state != 0
- * @gpu_powered:       Set to true when the GPU is powered and register
- *                     accesses are possible, false otherwise
- * @instr_enabled:     Set to true when instrumentation is enabled,
- *                     false otherwise
- * @cg1_disabled:      Set if the policy wants to keep the second core group
- *                     powered off
- * @driver_ready_for_irqs: Debug state indicating whether sufficient
- *                         initialization of the driver has occurred to handle
- *                         IRQs
- * @gpu_powered_lock:  Spinlock that must be held when writing @gpu_powered or
- *                     accessing @driver_ready_for_irqs
- * @metrics:           Structure to hold metrics for the GPU
- * @gpu_poweroff_pending: number of poweroff timer ticks until the GPU is
- *                        powered off
- * @shader_poweroff_pending_time: number of poweroff timer ticks until shaders
- *                        and/or timers are powered off
- * @gpu_poweroff_timer: Timer for powering off GPU
- * @gpu_poweroff_wq:   Workqueue to power off GPU on when timer fires
- * @gpu_poweroff_work: Workitem used on @gpu_poweroff_wq
- * @shader_poweroff_pending: Bit mask of shaders to be powered off on next
- *                           timer callback
- * @tiler_poweroff_pending: Bit mask of tilers to be powered off on next timer
- *                          callback
- * @poweroff_timer_needed: true if the poweroff timer is currently required,
- *                         false otherwise
- * @poweroff_timer_running: true if the poweroff timer is currently running,
- *                          false otherwise
- *                          power_change_lock should be held when accessing,
- *                          unless there is no way the timer can be running (eg
- *                          hrtimer_cancel() was called immediately before)
- * @poweroff_wait_in_progress: true if a wait for GPU power off is in progress.
- *                             hwaccess_lock must be held when accessing
- * @poweron_required: true if a GPU power on is required. Should only be set
- *                    when poweroff_wait_in_progress is true, and therefore the
- *                    GPU can not immediately be powered on. pm.lock must be
- *                    held when accessing
- * @poweroff_is_suspend: true if the GPU is being powered off due to a suspend
- *                       request. pm.lock must be held when accessing
- * @gpu_poweroff_wait_wq: workqueue for waiting for GPU to power off
- * @gpu_poweroff_wait_work: work item for use with @gpu_poweroff_wait_wq
- * @poweroff_wait: waitqueue for waiting for @gpu_poweroff_wait_work to complete
- * @callback_power_on: Callback when the GPU needs to be turned on. See
- *                     &struct kbase_pm_callback_conf
- * @callback_power_off: Callback when the GPU may be turned off. See
- *                     &struct kbase_pm_callback_conf
- * @callback_power_suspend: Callback when a suspend occurs and the GPU needs to
- *                          be turned off. See &struct kbase_pm_callback_conf
- * @callback_power_resume: Callback when a resume occurs and the GPU needs to
- *                          be turned on. See &struct kbase_pm_callback_conf
- * @callback_power_runtime_on: Callback when the GPU needs to be turned on. See
- *                             &struct kbase_pm_callback_conf
- * @callback_power_runtime_off: Callback when the GPU may be turned off. See
- *                              &struct kbase_pm_callback_conf
- * @callback_power_runtime_idle: Optional callback when the GPU may be idle. See
- *                              &struct kbase_pm_callback_conf
- *
- * Note:
- * During an IRQ, @ca_current_policy or @pm_current_policy can be NULL when the
- * policy is being changed with kbase_pm_ca_set_policy() or
- * kbase_pm_set_policy(). The change is protected under
- * kbase_device.pm.power_change_lock. Direct access to this
- * from IRQ context must therefore check for NULL. If NULL, then
- * kbase_pm_ca_set_policy() or kbase_pm_set_policy() will re-issue the policy
- * functions that would have been done under IRQ.
- */
-struct kbase_pm_backend_data {
-	const struct kbase_pm_ca_policy *ca_current_policy;
-	const struct kbase_pm_policy *pm_current_policy;
-	union kbase_pm_ca_policy_data ca_policy_data;
-	union kbase_pm_policy_data pm_policy_data;
-	bool ca_in_transition;
-	bool reset_done;
-	wait_queue_head_t reset_done_wait;
-	wait_queue_head_t l2_powered_wait;
-	int l2_powered;
-	int gpu_cycle_counter_requests;
-	spinlock_t gpu_cycle_counter_requests_lock;
-
-	u64 desired_shader_state;
-	u64 powering_on_shader_state;
-	u64 desired_tiler_state;
-	u64 powering_on_tiler_state;
-	u64 powering_on_l2_state;
-#ifdef CONFIG_MALI_CORESTACK
-	u64 powering_on_stack_state;
-#endif /* CONFIG_MALI_CORESTACK */
-
-	bool gpu_in_desired_state;
-	wait_queue_head_t gpu_in_desired_state_wait;
-
-	bool gpu_powered;
-
-	bool instr_enabled;
-
-	bool cg1_disabled;
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-	bool driver_ready_for_irqs;
-#endif /* CONFIG_MALI_BIFROST_DEBUG */
-
-	spinlock_t gpu_powered_lock;
-
-
-	struct kbasep_pm_metrics_data metrics;
-
-	int gpu_poweroff_pending;
-	int shader_poweroff_pending_time;
-
-	struct hrtimer gpu_poweroff_timer;
-	struct workqueue_struct *gpu_poweroff_wq;
-	struct work_struct gpu_poweroff_work;
-
-	u64 shader_poweroff_pending;
-	u64 tiler_poweroff_pending;
-
-	bool poweroff_timer_needed;
-	bool poweroff_timer_running;
-
-	bool poweroff_wait_in_progress;
-	bool poweron_required;
-	bool poweroff_is_suspend;
-
-	struct workqueue_struct *gpu_poweroff_wait_wq;
-	struct work_struct gpu_poweroff_wait_work;
-
-	wait_queue_head_t poweroff_wait;
-
-	int (*callback_power_on)(struct kbase_device *kbdev);
-	void (*callback_power_off)(struct kbase_device *kbdev);
-	void (*callback_power_suspend)(struct kbase_device *kbdev);
-	void (*callback_power_resume)(struct kbase_device *kbdev);
-	int (*callback_power_runtime_on)(struct kbase_device *kbdev);
-	void (*callback_power_runtime_off)(struct kbase_device *kbdev);
-	int (*callback_power_runtime_idle)(struct kbase_device *kbdev);
-};
-
-
-/* List of policy IDs */
-enum kbase_pm_policy_id {
-	KBASE_PM_POLICY_ID_DEMAND = 1,
-	KBASE_PM_POLICY_ID_ALWAYS_ON,
-	KBASE_PM_POLICY_ID_COARSE_DEMAND,
-#if !MALI_CUSTOMER_RELEASE
-	KBASE_PM_POLICY_ID_DEMAND_ALWAYS_POWERED,
-	KBASE_PM_POLICY_ID_FAST_START
-#endif
-};
-
-typedef u32 kbase_pm_policy_flags;
-
-/**
- * struct kbase_pm_policy - Power policy structure.
- *
- * Each power policy exposes a (static) instance of this structure which
- * contains function pointers to the policy's methods.
- *
- * @name:               The name of this policy
- * @init:               Function called when the policy is selected
- * @term:               Function called when the policy is unselected
- * @get_core_mask:      Function called to get the current shader core mask
- * @get_core_active:    Function called to get the current overall GPU power
- *                      state
- * @flags:              Field indicating flags for this policy
- * @id:                 Field indicating an ID for this policy. This is not
- *                      necessarily the same as its index in the list returned
- *                      by kbase_pm_list_policies().
- *                      It is used purely for debugging.
- */
-struct kbase_pm_policy {
-	char *name;
-
-	/**
-	 * Function called when the policy is selected
-	 *
-	 * This should initialize the kbdev->pm.pm_policy_data structure. It
-	 * should not attempt to make any changes to hardware state.
-	 *
-	 * It is undefined what state the cores are in when the function is
-	 * called.
-	 *
-	 * @kbdev: The kbase device structure for the device (must be a
-	 *         valid pointer)
-	 */
-	void (*init)(struct kbase_device *kbdev);
-
-	/**
-	 * Function called when the policy is unselected.
-	 *
-	 * @kbdev: The kbase device structure for the device (must be a
-	 *         valid pointer)
-	 */
-	void (*term)(struct kbase_device *kbdev);
-
-	/**
-	 * Function called to get the current shader core mask
-	 *
-	 * The returned mask should meet or exceed (kbdev->shader_needed_bitmap
-	 * | kbdev->shader_inuse_bitmap).
-	 *
-	 * @kbdev: The kbase device structure for the device (must be a
-	 *         valid pointer)
-	 *
-	 * Return: The mask of shader cores to be powered
-	 */
-	u64 (*get_core_mask)(struct kbase_device *kbdev);
-
-	/**
-	 * Function called to get the current overall GPU power state
-	 *
-	 * This function should consider the state of kbdev->pm.active_count. If
-	 * this count is greater than 0 then there is at least one active
-	 * context on the device and the GPU should be powered. If it is equal
-	 * to 0 then there are no active contexts and the GPU could be powered
-	 * off if desired.
-	 *
-	 * @kbdev: The kbase device structure for the device (must be a
-	 *         valid pointer)
-	 *
-	 * Return: true if the GPU should be powered, false otherwise
-	 */
-	bool (*get_core_active)(struct kbase_device *kbdev);
-
-	kbase_pm_policy_flags flags;
-	enum kbase_pm_policy_id id;
-};
-
-
-enum kbase_pm_ca_policy_id {
-	KBASE_PM_CA_POLICY_ID_FIXED = 1,
-	KBASE_PM_CA_POLICY_ID_DEVFREQ,
-	KBASE_PM_CA_POLICY_ID_RANDOM
-};
-
-typedef u32 kbase_pm_ca_policy_flags;
-
-/**
- * Maximum length of a CA policy names
- */
-#define KBASE_PM_CA_MAX_POLICY_NAME_LEN 15
-
-/**
- * struct kbase_pm_ca_policy - Core availability policy structure.
- *
- * Each core availability policy exposes a (static) instance of this structure
- * which contains function pointers to the policy's methods.
- *
- * @name:               The name of this policy
- * @init:               Function called when the policy is selected
- * @term:               Function called when the policy is unselected
- * @get_core_mask:      Function called to get the current shader core
- *                      availability mask
- * @update_core_status: Function called to update the current core status
- * @flags:              Field indicating flags for this policy
- * @id:                 Field indicating an ID for this policy. This is not
- *                      necessarily the same as its index in the list returned
- *                      by kbase_pm_list_policies().
- *                      It is used purely for debugging.
- */
-struct kbase_pm_ca_policy {
-	char name[KBASE_PM_CA_MAX_POLICY_NAME_LEN + 1];
-
-	/**
-	 * Function called when the policy is selected
-	 *
-	 * This should initialize the kbdev->pm.ca_policy_data structure. It
-	 * should not attempt to make any changes to hardware state.
-	 *
-	 * It is undefined what state the cores are in when the function is
-	 * called.
-	 *
-	 * @kbdev The kbase device structure for the device (must be a
-	 *        valid pointer)
-	 */
-	void (*init)(struct kbase_device *kbdev);
-
-	/**
-	 * Function called when the policy is unselected.
-	 *
-	 * @kbdev The kbase device structure for the device (must be a
-	 *        valid pointer)
-	 */
-	void (*term)(struct kbase_device *kbdev);
-
-	/**
-	 * Function called to get the current shader core availability mask
-	 *
-	 * When a change in core availability is occurring, the policy must set
-	 * kbdev->pm.ca_in_transition to true. This is to indicate that
-	 * reporting changes in power state cannot be optimized out, even if
-	 * kbdev->pm.desired_shader_state remains unchanged. This must be done
-	 * by any functions internal to the Core Availability Policy that change
-	 * the return value of kbase_pm_ca_policy::get_core_mask.
-	 *
-	 * @kbdev The kbase device structure for the device (must be a
-	 *              valid pointer)
-	 *
-	 * Return: The current core availability mask
-	 */
-	u64 (*get_core_mask)(struct kbase_device *kbdev);
-
-	/**
-	 * Function called to update the current core status
-	 *
-	 * If none of the cores in core group 0 are ready or transitioning, then
-	 * the policy must ensure that the next call to get_core_mask does not
-	 * return 0 for all cores in core group 0. It is an error to disable
-	 * core group 0 through the core availability policy.
-	 *
-	 * When a change in core availability has finished, the policy must set
-	 * kbdev->pm.ca_in_transition to false. This is to indicate that
-	 * changes in power state can once again be optimized out when
-	 * kbdev->pm.desired_shader_state is unchanged.
-	 *
-	 * @kbdev:               The kbase device structure for the device
-	 *                       (must be a valid pointer)
-	 * @cores_ready:         The mask of cores currently powered and
-	 *                       ready to run jobs
-	 * @cores_transitioning: The mask of cores currently transitioning
-	 *                       power state
-	 */
-	void (*update_core_status)(struct kbase_device *kbdev, u64 cores_ready,
-						u64 cores_transitioning);
-
-	kbase_pm_ca_policy_flags flags;
-
-	/**
-	 * Field indicating an ID for this policy. This is not necessarily the
-	 * same as its index in the list returned by kbase_pm_list_policies().
-	 * It is used purely for debugging.
-	 */
-	enum kbase_pm_ca_policy_id id;
-};
-
-#endif /* _KBASE_PM_HWACCESS_DEFS_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_demand.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_demand.c
deleted file mode 100644
index 81322fd0dd17..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_demand.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * A simple demand based power management policy
- */
-
-#include <mali_kbase.h>
-#include <mali_kbase_pm.h>
-
-static u64 demand_get_core_mask(struct kbase_device *kbdev)
-{
-	u64 desired = kbdev->shader_needed_bitmap | kbdev->shader_inuse_bitmap;
-
-	if (0 == kbdev->pm.active_count)
-		return 0;
-
-	return desired;
-}
-
-static bool demand_get_core_active(struct kbase_device *kbdev)
-{
-	if (0 == kbdev->pm.active_count && !(kbdev->shader_needed_bitmap |
-			kbdev->shader_inuse_bitmap) && !kbdev->tiler_needed_cnt
-			&& !kbdev->tiler_inuse_cnt)
-		return false;
-
-	return true;
-}
-
-static void demand_init(struct kbase_device *kbdev)
-{
-	CSTD_UNUSED(kbdev);
-}
-
-static void demand_term(struct kbase_device *kbdev)
-{
-	CSTD_UNUSED(kbdev);
-}
-
-/*
- * The struct kbase_pm_policy structure for the demand power policy.
- *
- * This is the static structure that defines the demand power policy's callback
- * and name.
- */
-const struct kbase_pm_policy kbase_pm_demand_policy_ops = {
-	"demand",			/* name */
-	demand_init,			/* init */
-	demand_term,			/* term */
-	demand_get_core_mask,		/* get_core_mask */
-	demand_get_core_active,		/* get_core_active */
-	0u,				/* flags */
-	KBASE_PM_POLICY_ID_DEMAND,	/* id */
-};
-
-KBASE_EXPORT_TEST_API(kbase_pm_demand_policy_ops);
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_demand.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_demand.h
deleted file mode 100644
index c0c84b6e9189..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_demand.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * A simple demand based power management policy
- */
-
-#ifndef MALI_KBASE_PM_DEMAND_H
-#define MALI_KBASE_PM_DEMAND_H
-
-/**
- * DOC: Demand power management policy
- *
- * The demand power management policy has the following characteristics:
- * - When KBase indicates that the GPU will be powered up, but we don't yet
- *   know which Job Chains are to be run:
- *  - The Shader Cores are not powered up
- *
- * - When KBase indicates that a set of Shader Cores are needed to submit the
- *   currently queued Job Chains:
- *  - Only those Shader Cores are powered up
- *
- * - When KBase indicates that the GPU need not be powered:
- *  - The Shader Cores are powered off, and the GPU itself is powered off too.
- *
- * Note:
- * - KBase indicates the GPU will be powered up when it has a User Process that
- *   has just started to submit Job Chains.
- *
- * - KBase indicates the GPU need not be powered when all the Job Chains from
- *   User Processes have finished, and it is waiting for a User Process to
- *   submit some more Job Chains.
- */
-
-/**
- * struct kbasep_pm_policy_demand - Private structure for policy instance data
- *
- * @dummy: No state is needed, a dummy variable
- *
- * This contains data that is private to the demand power policy.
- */
-struct kbasep_pm_policy_demand {
-	int dummy;
-};
-
-extern const struct kbase_pm_policy kbase_pm_demand_policy_ops;
-
-#endif /* MALI_KBASE_PM_DEMAND_H */
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_driver.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_driver.c
deleted file mode 100644
index 707f71a79a77..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_driver.c
+++ /dev/null
@@ -1,1672 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * Base kernel Power Management hardware control
- */
-
-#include <mali_kbase.h>
-#include <mali_kbase_config_defaults.h>
-#include <mali_midg_regmap.h>
-#if defined(CONFIG_MALI_BIFROST_GATOR_SUPPORT)
-#include <mali_kbase_gator.h>
-#endif
-#include <mali_kbase_tlstream.h>
-#include <mali_kbase_pm.h>
-#include <mali_kbase_config_defaults.h>
-#include <mali_kbase_smc.h>
-#include <mali_kbase_hwaccess_jm.h>
-#include <mali_kbase_ctx_sched.h>
-#include <backend/gpu/mali_kbase_cache_policy_backend.h>
-#include <backend/gpu/mali_kbase_device_internal.h>
-#include <backend/gpu/mali_kbase_irq_internal.h>
-#include <backend/gpu/mali_kbase_pm_internal.h>
-
-#include <linux/of.h>
-
-#if MALI_MOCK_TEST
-#define MOCKABLE(function) function##_original
-#else
-#define MOCKABLE(function) function
-#endif				/* MALI_MOCK_TEST */
-
-/**
- * enum kbasep_pm_action - Actions that can be performed on a core.
- *
- * This enumeration is private to the file. Its values are set to allow
- * core_type_to_reg() function, which decodes this enumeration, to be simpler
- * and more efficient.
- *
- * @ACTION_PRESENT: The cores that are present
- * @ACTION_READY: The cores that are ready
- * @ACTION_PWRON: Power on the cores specified
- * @ACTION_PWROFF: Power off the cores specified
- * @ACTION_PWRTRANS: The cores that are transitioning
- * @ACTION_PWRACTIVE: The cores that are active
- */
-enum kbasep_pm_action {
-	ACTION_PRESENT = 0,
-	ACTION_READY = (SHADER_READY_LO - SHADER_PRESENT_LO),
-	ACTION_PWRON = (SHADER_PWRON_LO - SHADER_PRESENT_LO),
-	ACTION_PWROFF = (SHADER_PWROFF_LO - SHADER_PRESENT_LO),
-	ACTION_PWRTRANS = (SHADER_PWRTRANS_LO - SHADER_PRESENT_LO),
-	ACTION_PWRACTIVE = (SHADER_PWRACTIVE_LO - SHADER_PRESENT_LO)
-};
-
-static u64 kbase_pm_get_state(
-		struct kbase_device *kbdev,
-		enum kbase_pm_core_type core_type,
-		enum kbasep_pm_action action);
-
-/**
- * core_type_to_reg - Decode a core type and action to a register.
- *
- * Given a core type (defined by kbase_pm_core_type) and an action (defined
- * by kbasep_pm_action) this function will return the register offset that
- * will perform the action on the core type. The register returned is the _LO
- * register and an offset must be applied to use the _HI register.
- *
- * @core_type: The type of core
- * @action:    The type of action
- *
- * Return: The register offset of the _LO register that performs an action of
- * type @action on a core of type @core_type.
- */
-static u32 core_type_to_reg(enum kbase_pm_core_type core_type,
-						enum kbasep_pm_action action)
-{
-#ifdef CONFIG_MALI_CORESTACK
-	if (core_type == KBASE_PM_CORE_STACK) {
-		switch (action) {
-		case ACTION_PRESENT:
-			return STACK_PRESENT_LO;
-		case ACTION_READY:
-			return STACK_READY_LO;
-		case ACTION_PWRON:
-			return STACK_PWRON_LO;
-		case ACTION_PWROFF:
-			return STACK_PWROFF_LO;
-		case ACTION_PWRTRANS:
-			return STACK_PWRTRANS_LO;
-		default:
-			BUG();
-		}
-	}
-#endif /* CONFIG_MALI_CORESTACK */
-
-	return (u32)core_type + (u32)action;
-}
-
-#ifdef CONFIG_ARM64
-static void mali_cci_flush_l2(struct kbase_device *kbdev)
-{
-	const u32 mask = CLEAN_CACHES_COMPLETED | RESET_COMPLETED;
-	u32 loops = KBASE_CLEAN_CACHE_MAX_LOOPS;
-	u32 raw;
-
-	/*
-	 * Note that we don't take the cache flush mutex here since
-	 * we expect to be the last user of the L2, all other L2 users
-	 * would have dropped their references, to initiate L2 power
-	 * down, L2 power down being the only valid place for this
-	 * to be called from.
-	 */
-
-	kbase_reg_write(kbdev,
-			GPU_CONTROL_REG(GPU_COMMAND),
-			GPU_COMMAND_CLEAN_INV_CACHES,
-			NULL);
-
-	raw = kbase_reg_read(kbdev,
-		GPU_CONTROL_REG(GPU_IRQ_RAWSTAT),
-		NULL);
-
-	/* Wait for cache flush to complete before continuing, exit on
-	 * gpu resets or loop expiry. */
-	while (((raw & mask) == 0) && --loops) {
-		raw = kbase_reg_read(kbdev,
-					GPU_CONTROL_REG(GPU_IRQ_RAWSTAT),
-					NULL);
-	}
-}
-#endif
-
-/**
- * kbase_pm_invoke - Invokes an action on a core set
- *
- * This function performs the action given by @action on a set of cores of a
- * type given by @core_type. It is a static function used by
- * kbase_pm_transition_core_type()
- *
- * @kbdev:     The kbase device structure of the device
- * @core_type: The type of core that the action should be performed on
- * @cores:     A bit mask of cores to perform the action on (low 32 bits)
- * @action:    The action to perform on the cores
- */
-static void kbase_pm_invoke(struct kbase_device *kbdev,
-					enum kbase_pm_core_type core_type,
-					u64 cores,
-					enum kbasep_pm_action action)
-{
-	u32 reg;
-	u32 lo = cores & 0xFFFFFFFF;
-	u32 hi = (cores >> 32) & 0xFFFFFFFF;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	reg = core_type_to_reg(core_type, action);
-
-	KBASE_DEBUG_ASSERT(reg);
-#if defined(CONFIG_MALI_BIFROST_GATOR_SUPPORT)
-	if (cores) {
-		if (action == ACTION_PWRON)
-			kbase_trace_mali_pm_power_on(core_type, cores);
-		else if (action == ACTION_PWROFF)
-			kbase_trace_mali_pm_power_off(core_type, cores);
-	}
-#endif
-
-	if (cores) {
-		u64 state = kbase_pm_get_state(kbdev, core_type, ACTION_READY);
-
-		if (action == ACTION_PWRON)
-			state |= cores;
-		else if (action == ACTION_PWROFF)
-			state &= ~cores;
-		KBASE_TLSTREAM_AUX_PM_STATE(core_type, state);
-	}
-
-	/* Tracing */
-	if (cores) {
-		if (action == ACTION_PWRON)
-			switch (core_type) {
-			case KBASE_PM_CORE_SHADER:
-				KBASE_TRACE_ADD(kbdev, PM_PWRON, NULL, NULL, 0u,
-									lo);
-				break;
-			case KBASE_PM_CORE_TILER:
-				KBASE_TRACE_ADD(kbdev, PM_PWRON_TILER, NULL,
-								NULL, 0u, lo);
-				break;
-			case KBASE_PM_CORE_L2:
-				KBASE_TRACE_ADD(kbdev, PM_PWRON_L2, NULL, NULL,
-									0u, lo);
-				break;
-			default:
-				break;
-			}
-		else if (action == ACTION_PWROFF)
-			switch (core_type) {
-			case KBASE_PM_CORE_SHADER:
-				KBASE_TRACE_ADD(kbdev, PM_PWROFF, NULL, NULL,
-									0u, lo);
-				break;
-			case KBASE_PM_CORE_TILER:
-				KBASE_TRACE_ADD(kbdev, PM_PWROFF_TILER, NULL,
-								NULL, 0u, lo);
-				break;
-			case KBASE_PM_CORE_L2:
-				KBASE_TRACE_ADD(kbdev, PM_PWROFF_L2, NULL, NULL,
-									0u, lo);
-				/* disable snoops before L2 is turned off */
-				kbase_pm_cache_snoop_disable(kbdev);
-				break;
-			default:
-				break;
-			}
-	}
-
-	if (lo != 0)
-		kbase_reg_write(kbdev, GPU_CONTROL_REG(reg), lo, NULL);
-
-	if (hi != 0)
-		kbase_reg_write(kbdev, GPU_CONTROL_REG(reg + 4), hi, NULL);
-}
-
-/**
- * kbase_pm_get_state - Get information about a core set
- *
- * This function gets information (chosen by @action) about a set of cores of
- * a type given by @core_type. It is a static function used by
- * kbase_pm_get_active_cores(), kbase_pm_get_trans_cores() and
- * kbase_pm_get_ready_cores().
- *
- * @kbdev:     The kbase device structure of the device
- * @core_type: The type of core that the should be queried
- * @action:    The property of the cores to query
- *
- * Return: A bit mask specifying the state of the cores
- */
-static u64 kbase_pm_get_state(struct kbase_device *kbdev,
-					enum kbase_pm_core_type core_type,
-					enum kbasep_pm_action action)
-{
-	u32 reg;
-	u32 lo, hi;
-
-	reg = core_type_to_reg(core_type, action);
-
-	KBASE_DEBUG_ASSERT(reg);
-
-	lo = kbase_reg_read(kbdev, GPU_CONTROL_REG(reg), NULL);
-	hi = kbase_reg_read(kbdev, GPU_CONTROL_REG(reg + 4), NULL);
-
-	return (((u64) hi) << 32) | ((u64) lo);
-}
-
-void kbasep_pm_init_core_use_bitmaps(struct kbase_device *kbdev)
-{
-	kbdev->shader_inuse_bitmap = 0;
-	kbdev->shader_needed_bitmap = 0;
-	kbdev->shader_available_bitmap = 0;
-	kbdev->tiler_available_bitmap = 0;
-	kbdev->l2_users_count = 0;
-	kbdev->l2_available_bitmap = 0;
-	kbdev->tiler_needed_cnt = 0;
-	kbdev->tiler_inuse_cnt = 0;
-
-	memset(kbdev->shader_needed_cnt, 0, sizeof(kbdev->shader_needed_cnt));
-}
-
-/**
- * kbase_pm_get_present_cores - Get the cores that are present
- *
- * @kbdev: Kbase device
- * @type: The type of cores to query
- *
- * Return: Bitmask of the cores that are present
- */
-u64 kbase_pm_get_present_cores(struct kbase_device *kbdev,
-						enum kbase_pm_core_type type)
-{
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	switch (type) {
-	case KBASE_PM_CORE_L2:
-		return kbdev->gpu_props.props.raw_props.l2_present;
-	case KBASE_PM_CORE_SHADER:
-		return kbdev->gpu_props.props.raw_props.shader_present;
-	case KBASE_PM_CORE_TILER:
-		return kbdev->gpu_props.props.raw_props.tiler_present;
-#ifdef CONFIG_MALI_CORESTACK
-	case KBASE_PM_CORE_STACK:
-		return kbdev->gpu_props.props.raw_props.stack_present;
-#endif /* CONFIG_MALI_CORESTACK */
-	default:
-		break;
-	}
-	KBASE_DEBUG_ASSERT(0);
-
-	return 0;
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_get_present_cores);
-
-/**
- * kbase_pm_get_active_cores - Get the cores that are "active"
- *                             (busy processing work)
- *
- * @kbdev: Kbase device
- * @type: The type of cores to query
- *
- * Return: Bitmask of cores that are active
- */
-u64 kbase_pm_get_active_cores(struct kbase_device *kbdev,
-						enum kbase_pm_core_type type)
-{
-	return kbase_pm_get_state(kbdev, type, ACTION_PWRACTIVE);
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_get_active_cores);
-
-/**
- * kbase_pm_get_trans_cores - Get the cores that are transitioning between
- *                            power states
- *
- * @kbdev: Kbase device
- * @type: The type of cores to query
- *
- * Return: Bitmask of cores that are transitioning
- */
-u64 kbase_pm_get_trans_cores(struct kbase_device *kbdev,
-						enum kbase_pm_core_type type)
-{
-	return kbase_pm_get_state(kbdev, type, ACTION_PWRTRANS);
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_get_trans_cores);
-
-/**
- * kbase_pm_get_ready_cores - Get the cores that are powered on
- *
- * @kbdev: Kbase device
- * @type: The type of cores to query
- *
- * Return: Bitmask of cores that are ready (powered on)
- */
-u64 kbase_pm_get_ready_cores(struct kbase_device *kbdev,
-						enum kbase_pm_core_type type)
-{
-	u64 result;
-
-	result = kbase_pm_get_state(kbdev, type, ACTION_READY);
-
-	switch (type) {
-	case KBASE_PM_CORE_SHADER:
-		KBASE_TRACE_ADD(kbdev, PM_CORES_POWERED, NULL, NULL, 0u,
-								(u32) result);
-		break;
-	case KBASE_PM_CORE_TILER:
-		KBASE_TRACE_ADD(kbdev, PM_CORES_POWERED_TILER, NULL, NULL, 0u,
-								(u32) result);
-		break;
-	case KBASE_PM_CORE_L2:
-		KBASE_TRACE_ADD(kbdev, PM_CORES_POWERED_L2, NULL, NULL, 0u,
-								(u32) result);
-		break;
-	default:
-		break;
-	}
-
-	return result;
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_get_ready_cores);
-
-/**
- * kbase_pm_transition_core_type - Perform power transitions for a particular
- *                                 core type.
- *
- * This function will perform any available power transitions to make the actual
- * hardware state closer to the desired state. If a core is currently
- * transitioning then changes to the power state of that call cannot be made
- * until the transition has finished. Cores which are not present in the
- * hardware are ignored if they are specified in the desired_state bitmask,
- * however the return value will always be 0 in this case.
- *
- * @kbdev:             The kbase device
- * @type:              The core type to perform transitions for
- * @desired_state:     A bit mask of the desired state of the cores
- * @in_use:            A bit mask of the cores that are currently running
- *                     jobs. These cores have to be kept powered up because
- *                     there are jobs running (or about to run) on them.
- * @available:         Receives a bit mask of the cores that the job
- *                     scheduler can use to submit jobs to. May be NULL if
- *                     this is not needed.
- * @powering_on:       Bit mask to update with cores that are
- *                    transitioning to a power-on state.
- *
- * Return: true if the desired state has been reached, false otherwise
- */
-static bool kbase_pm_transition_core_type(struct kbase_device *kbdev,
-						enum kbase_pm_core_type type,
-						u64 desired_state,
-						u64 in_use,
-						u64 * const available,
-						u64 *powering_on)
-{
-	u64 present;
-	u64 ready;
-	u64 trans;
-	u64 powerup;
-	u64 powerdown;
-	u64 powering_on_trans;
-	u64 desired_state_in_use;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	/* Get current state */
-	present = kbase_pm_get_present_cores(kbdev, type);
-	trans = kbase_pm_get_trans_cores(kbdev, type);
-	ready = kbase_pm_get_ready_cores(kbdev, type);
-	/* mask off ready from trans in case transitions finished between the
-	 * register reads */
-	trans &= ~ready;
-
-	if (trans) /* Do not progress if any cores are transitioning */
-		return false;
-
-	powering_on_trans = trans & *powering_on;
-	*powering_on = powering_on_trans;
-
-	if (available != NULL)
-		*available = (ready | powering_on_trans) & desired_state;
-
-	/* Update desired state to include the in-use cores. These have to be
-	 * kept powered up because there are jobs running or about to run on
-	 * these cores
-	 */
-	desired_state_in_use = desired_state | in_use;
-
-	/* Update state of whether l2 caches are powered */
-	if (type == KBASE_PM_CORE_L2) {
-		if ((ready == present) && (desired_state_in_use == ready) &&
-								(trans == 0)) {
-			/* All are ready, none will be turned off, and none are
-			 * transitioning */
-			kbdev->pm.backend.l2_powered = 1;
-			/*
-			 * Ensure snoops are enabled after L2 is powered up,
-			 * note that kbase keeps track of the snoop state, so
-			 * safe to repeatedly call.
-			 */
-			kbase_pm_cache_snoop_enable(kbdev);
-			if (kbdev->l2_users_count > 0) {
-				/* Notify any registered l2 cache users
-				 * (optimized out when no users waiting) */
-				wake_up(&kbdev->pm.backend.l2_powered_wait);
-			}
-		} else
-			kbdev->pm.backend.l2_powered = 0;
-	}
-
-	if (desired_state == ready && (trans == 0))
-		return true;
-
-	/* Restrict the cores to those that are actually present */
-	powerup = desired_state_in_use & present;
-	powerdown = (~desired_state_in_use) & present;
-
-	/* Restrict to cores that are not already in the desired state */
-	powerup &= ~ready;
-	powerdown &= ready;
-
-	/* Don't transition any cores that are already transitioning, except for
-	 * Mali cores that support the following case:
-	 *
-	 * If the SHADER_PWRON or TILER_PWRON registers are written to turn on
-	 * a core that is currently transitioning to power off, then this is
-	 * remembered and the shader core is automatically powered up again once
-	 * the original transition completes. Once the automatic power on is
-	 * complete any job scheduled on the shader core should start.
-	 */
-	powerdown &= ~trans;
-
-	if (kbase_hw_has_feature(kbdev,
-				BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS))
-		if (KBASE_PM_CORE_SHADER == type || KBASE_PM_CORE_TILER == type)
-			trans = powering_on_trans; /* for exception cases, only
-						    * mask off cores in power on
-						    * transitions */
-
-	powerup &= ~trans;
-
-	/* Perform transitions if any */
-	kbase_pm_invoke(kbdev, type, powerup, ACTION_PWRON);
-#if !PLATFORM_POWER_DOWN_ONLY
-	kbase_pm_invoke(kbdev, type, powerdown, ACTION_PWROFF);
-#endif
-
-	/* Recalculate cores transitioning on, and re-evaluate our state */
-	powering_on_trans |= powerup;
-	*powering_on = powering_on_trans;
-	if (available != NULL)
-		*available = (ready | powering_on_trans) & desired_state;
-
-	return false;
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_transition_core_type);
-
-/**
- * get_desired_cache_status - Determine which caches should be on for a
- *                            particular core state
- *
- * This function takes a bit mask of the present caches and the cores (or
- * caches) that are attached to the caches that will be powered. It then
- * computes which caches should be turned on to allow the cores requested to be
- * powered up.
- *
- * @present:       The bit mask of present caches
- * @cores_powered: A bit mask of cores (or L2 caches) that are desired to
- *                 be powered
- * @tilers_powered: The bit mask of tilers that are desired to be powered
- *
- * Return: A bit mask of the caches that should be turned on
- */
-static u64 get_desired_cache_status(u64 present, u64 cores_powered,
-		u64 tilers_powered)
-{
-	u64 desired = 0;
-
-	while (present) {
-		/* Find out which is the highest set bit */
-		u64 bit = fls64(present) - 1;
-		u64 bit_mask = 1ull << bit;
-		/* Create a mask which has all bits from 'bit' upwards set */
-
-		u64 mask = ~(bit_mask - 1);
-
-		/* If there are any cores powered at this bit or above (that
-		 * haven't previously been processed) then we need this core on
-		 */
-		if (cores_powered & mask)
-			desired |= bit_mask;
-
-		/* Remove bits from cores_powered and present */
-		cores_powered &= ~mask;
-		present &= ~bit_mask;
-	}
-
-	/* Power up the required L2(s) for the tiler */
-	if (tilers_powered)
-		desired |= 1;
-
-	return desired;
-}
-
-KBASE_EXPORT_TEST_API(get_desired_cache_status);
-
-#ifdef CONFIG_MALI_CORESTACK
-u64 kbase_pm_core_stack_mask(u64 cores)
-{
-	u64 stack_mask = 0;
-	size_t const MAX_CORE_ID = 31;
-	size_t const NUM_CORES_PER_STACK = 4;
-	size_t i;
-
-	for (i = 0; i <= MAX_CORE_ID; ++i) {
-		if (test_bit(i, (unsigned long *)&cores)) {
-			/* Every core which ID >= 16 is filled to stacks 4-7
-			 * instead of 0-3 */
-			size_t const stack_num = (i > 16) ?
-				(i % NUM_CORES_PER_STACK) + 4 :
-				(i % NUM_CORES_PER_STACK);
-			set_bit(stack_num, (unsigned long *)&stack_mask);
-		}
-	}
-
-	return stack_mask;
-}
-#endif /* CONFIG_MALI_CORESTACK */
-
-bool
-MOCKABLE(kbase_pm_check_transitions_nolock) (struct kbase_device *kbdev)
-{
-	bool cores_are_available = false;
-	bool in_desired_state = true;
-	u64 desired_l2_state;
-#ifdef CONFIG_MALI_CORESTACK
-	u64 desired_stack_state;
-	u64 stacks_powered;
-#endif /* CONFIG_MALI_CORESTACK */
-	u64 cores_powered;
-	u64 tilers_powered;
-	u64 tiler_available_bitmap;
-	u64 tiler_transitioning_bitmap;
-	u64 shader_available_bitmap;
-	u64 shader_ready_bitmap;
-	u64 shader_transitioning_bitmap;
-	u64 l2_available_bitmap;
-	u64 prev_l2_available_bitmap;
-	u64 l2_inuse_bitmap;
-
-	KBASE_DEBUG_ASSERT(NULL != kbdev);
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	spin_lock(&kbdev->pm.backend.gpu_powered_lock);
-	if (kbdev->pm.backend.gpu_powered == false) {
-		spin_unlock(&kbdev->pm.backend.gpu_powered_lock);
-		if (kbdev->pm.backend.desired_shader_state == 0 &&
-				kbdev->pm.backend.desired_tiler_state == 0)
-			return true;
-		return false;
-	}
-
-	/* Trace that a change-state is being requested, and that it took
-	 * (effectively) no time to start it. This is useful for counting how
-	 * many state changes occurred, in a way that's backwards-compatible
-	 * with processing the trace data */
-	kbase_timeline_pm_send_event(kbdev,
-				KBASE_TIMELINE_PM_EVENT_CHANGE_GPU_STATE);
-	kbase_timeline_pm_handle_event(kbdev,
-				KBASE_TIMELINE_PM_EVENT_CHANGE_GPU_STATE);
-
-	/* If any cores are already powered then, we must keep the caches on */
-	shader_transitioning_bitmap = kbase_pm_get_trans_cores(kbdev,
-							KBASE_PM_CORE_SHADER);
-	cores_powered = kbase_pm_get_ready_cores(kbdev, KBASE_PM_CORE_SHADER);
-	cores_powered |= kbdev->pm.backend.desired_shader_state;
-
-#ifdef CONFIG_MALI_CORESTACK
-	/* Work out which core stacks want to be powered */
-	desired_stack_state = kbase_pm_core_stack_mask(cores_powered);
-	stacks_powered = kbase_pm_get_ready_cores(kbdev, KBASE_PM_CORE_STACK) |
-		desired_stack_state;
-#endif /* CONFIG_MALI_CORESTACK */
-
-	/* Work out which tilers want to be powered */
-	tiler_transitioning_bitmap = kbase_pm_get_trans_cores(kbdev,
-							KBASE_PM_CORE_TILER);
-	tilers_powered = kbase_pm_get_ready_cores(kbdev, KBASE_PM_CORE_TILER);
-	tilers_powered |= kbdev->pm.backend.desired_tiler_state;
-
-	/* If there are l2 cache users registered, keep all l2s powered even if
-	 * all other cores are off. */
-	if (kbdev->l2_users_count > 0)
-		cores_powered |= kbdev->gpu_props.props.raw_props.l2_present;
-
-	desired_l2_state = get_desired_cache_status(
-			kbdev->gpu_props.props.raw_props.l2_present,
-			cores_powered, tilers_powered);
-
-	l2_inuse_bitmap = get_desired_cache_status(
-			kbdev->gpu_props.props.raw_props.l2_present,
-			cores_powered | shader_transitioning_bitmap,
-			tilers_powered | tiler_transitioning_bitmap);
-
-#ifdef CONFIG_MALI_CORESTACK
-	if (stacks_powered)
-		desired_l2_state |= 1;
-#endif /* CONFIG_MALI_CORESTACK */
-
-	/* If any l2 cache is on, then enable l2 #0, for use by job manager */
-	if (0 != desired_l2_state)
-		desired_l2_state |= 1;
-
-	prev_l2_available_bitmap = kbdev->l2_available_bitmap;
-	in_desired_state &= kbase_pm_transition_core_type(kbdev,
-			KBASE_PM_CORE_L2, desired_l2_state, l2_inuse_bitmap,
-			&l2_available_bitmap,
-			&kbdev->pm.backend.powering_on_l2_state);
-
-	if (kbdev->l2_available_bitmap != l2_available_bitmap)
-		KBASE_TIMELINE_POWER_L2(kbdev, l2_available_bitmap);
-
-	kbdev->l2_available_bitmap = l2_available_bitmap;
-
-
-#ifdef CONFIG_MALI_CORESTACK
-	if (in_desired_state) {
-		in_desired_state &= kbase_pm_transition_core_type(kbdev,
-				KBASE_PM_CORE_STACK, desired_stack_state, 0,
-				&kbdev->stack_available_bitmap,
-				&kbdev->pm.backend.powering_on_stack_state);
-	}
-#endif /* CONFIG_MALI_CORESTACK */
-
-	if (in_desired_state) {
-		in_desired_state &= kbase_pm_transition_core_type(kbdev,
-				KBASE_PM_CORE_TILER,
-				kbdev->pm.backend.desired_tiler_state,
-				0, &tiler_available_bitmap,
-				&kbdev->pm.backend.powering_on_tiler_state);
-		in_desired_state &= kbase_pm_transition_core_type(kbdev,
-				KBASE_PM_CORE_SHADER,
-				kbdev->pm.backend.desired_shader_state,
-				kbdev->shader_inuse_bitmap,
-				&shader_available_bitmap,
-				&kbdev->pm.backend.powering_on_shader_state);
-
-		if (kbdev->shader_available_bitmap != shader_available_bitmap) {
-			KBASE_TRACE_ADD(kbdev, PM_CORES_CHANGE_AVAILABLE, NULL,
-						NULL, 0u,
-						(u32) shader_available_bitmap);
-			KBASE_TIMELINE_POWER_SHADER(kbdev,
-						shader_available_bitmap);
-		}
-
-		kbdev->shader_available_bitmap = shader_available_bitmap;
-
-		if (kbdev->tiler_available_bitmap != tiler_available_bitmap) {
-			KBASE_TRACE_ADD(kbdev, PM_CORES_CHANGE_AVAILABLE_TILER,
-						NULL, NULL, 0u,
-						(u32) tiler_available_bitmap);
-			KBASE_TIMELINE_POWER_TILER(kbdev,
-							tiler_available_bitmap);
-		}
-
-		kbdev->tiler_available_bitmap = tiler_available_bitmap;
-
-	} else if ((l2_available_bitmap &
-			kbdev->gpu_props.props.raw_props.tiler_present) !=
-			kbdev->gpu_props.props.raw_props.tiler_present) {
-		tiler_available_bitmap = 0;
-
-		if (kbdev->tiler_available_bitmap != tiler_available_bitmap)
-			KBASE_TIMELINE_POWER_TILER(kbdev,
-							tiler_available_bitmap);
-
-		kbdev->tiler_available_bitmap = tiler_available_bitmap;
-	}
-
-	/* State updated for slow-path waiters */
-	kbdev->pm.backend.gpu_in_desired_state = in_desired_state;
-
-	shader_ready_bitmap = kbase_pm_get_ready_cores(kbdev,
-							KBASE_PM_CORE_SHADER);
-	shader_transitioning_bitmap = kbase_pm_get_trans_cores(kbdev,
-							KBASE_PM_CORE_SHADER);
-
-	/* Determine whether the cores are now available (even if the set of
-	 * available cores is empty). Note that they can be available even if
-	 * we've not finished transitioning to the desired state */
-	if ((kbdev->shader_available_bitmap &
-					kbdev->pm.backend.desired_shader_state)
-				== kbdev->pm.backend.desired_shader_state &&
-		(kbdev->tiler_available_bitmap &
-					kbdev->pm.backend.desired_tiler_state)
-				== kbdev->pm.backend.desired_tiler_state) {
-		cores_are_available = true;
-
-		KBASE_TRACE_ADD(kbdev, PM_CORES_AVAILABLE, NULL, NULL, 0u,
-				(u32)(kbdev->shader_available_bitmap &
-				kbdev->pm.backend.desired_shader_state));
-		KBASE_TRACE_ADD(kbdev, PM_CORES_AVAILABLE_TILER, NULL, NULL, 0u,
-				(u32)(kbdev->tiler_available_bitmap &
-				kbdev->pm.backend.desired_tiler_state));
-
-		/* Log timelining information about handling events that power
-		 * up cores, to match up either with immediate submission either
-		 * because cores already available, or from PM IRQ */
-		if (!in_desired_state)
-			kbase_timeline_pm_send_event(kbdev,
-				KBASE_TIMELINE_PM_EVENT_GPU_STATE_CHANGED);
-	}
-
-	if (in_desired_state) {
-		KBASE_DEBUG_ASSERT(cores_are_available);
-
-#if defined(CONFIG_MALI_BIFROST_GATOR_SUPPORT)
-		kbase_trace_mali_pm_status(KBASE_PM_CORE_L2,
-						kbase_pm_get_ready_cores(kbdev,
-							KBASE_PM_CORE_L2));
-		kbase_trace_mali_pm_status(KBASE_PM_CORE_SHADER,
-						kbase_pm_get_ready_cores(kbdev,
-							KBASE_PM_CORE_SHADER));
-		kbase_trace_mali_pm_status(KBASE_PM_CORE_TILER,
-						kbase_pm_get_ready_cores(kbdev,
-							KBASE_PM_CORE_TILER));
-#ifdef CONFIG_MALI_CORESTACK
-		kbase_trace_mali_pm_status(KBASE_PM_CORE_STACK,
-						kbase_pm_get_ready_cores(kbdev,
-							KBASE_PM_CORE_STACK));
-#endif /* CONFIG_MALI_CORESTACK */
-#endif
-
-		KBASE_TLSTREAM_AUX_PM_STATE(
-				KBASE_PM_CORE_L2,
-				kbase_pm_get_ready_cores(
-					kbdev, KBASE_PM_CORE_L2));
-		KBASE_TLSTREAM_AUX_PM_STATE(
-				KBASE_PM_CORE_SHADER,
-				kbase_pm_get_ready_cores(
-					kbdev, KBASE_PM_CORE_SHADER));
-		KBASE_TLSTREAM_AUX_PM_STATE(
-				KBASE_PM_CORE_TILER,
-				kbase_pm_get_ready_cores(
-					kbdev,
-					KBASE_PM_CORE_TILER));
-#ifdef CONFIG_MALI_CORESTACK
-		KBASE_TLSTREAM_AUX_PM_STATE(
-				KBASE_PM_CORE_STACK,
-				kbase_pm_get_ready_cores(
-					kbdev,
-					KBASE_PM_CORE_STACK));
-#endif /* CONFIG_MALI_CORESTACK */
-
-		KBASE_TRACE_ADD(kbdev, PM_DESIRED_REACHED, NULL, NULL,
-				kbdev->pm.backend.gpu_in_desired_state,
-				(u32)kbdev->pm.backend.desired_shader_state);
-		KBASE_TRACE_ADD(kbdev, PM_DESIRED_REACHED_TILER, NULL, NULL, 0u,
-				(u32)kbdev->pm.backend.desired_tiler_state);
-
-		/* Log timelining information for synchronous waiters */
-		kbase_timeline_pm_send_event(kbdev,
-				KBASE_TIMELINE_PM_EVENT_GPU_STATE_CHANGED);
-		/* Wake slow-path waiters. Job scheduler does not use this. */
-		KBASE_TRACE_ADD(kbdev, PM_WAKE_WAITERS, NULL, NULL, 0u, 0);
-
-		wake_up(&kbdev->pm.backend.gpu_in_desired_state_wait);
-	}
-
-	spin_unlock(&kbdev->pm.backend.gpu_powered_lock);
-
-	/* kbase_pm_ca_update_core_status can cause one-level recursion into
-	 * this function, so it must only be called once all changes to kbdev
-	 * have been committed, and after the gpu_powered_lock has been
-	 * dropped. */
-	if (kbdev->shader_ready_bitmap != shader_ready_bitmap ||
-	    kbdev->shader_transitioning_bitmap != shader_transitioning_bitmap) {
-		kbdev->shader_ready_bitmap = shader_ready_bitmap;
-		kbdev->shader_transitioning_bitmap =
-						shader_transitioning_bitmap;
-
-		kbase_pm_ca_update_core_status(kbdev, shader_ready_bitmap,
-						shader_transitioning_bitmap);
-	}
-
-	/* The core availability policy is not allowed to keep core group 0
-	 * turned off (unless it was changing the l2 power state) */
-	if (!((shader_ready_bitmap | shader_transitioning_bitmap) &
-		kbdev->gpu_props.props.coherency_info.group[0].core_mask) &&
-		(prev_l2_available_bitmap == desired_l2_state) &&
-		!(kbase_pm_ca_get_core_mask(kbdev) &
-		kbdev->gpu_props.props.coherency_info.group[0].core_mask))
-		BUG();
-
-	/* The core availability policy is allowed to keep core group 1 off,
-	 * but all jobs specifically targeting CG1 must fail */
-	if (!((shader_ready_bitmap | shader_transitioning_bitmap) &
-		kbdev->gpu_props.props.coherency_info.group[1].core_mask) &&
-		!(kbase_pm_ca_get_core_mask(kbdev) &
-		kbdev->gpu_props.props.coherency_info.group[1].core_mask))
-		kbdev->pm.backend.cg1_disabled = true;
-	else
-		kbdev->pm.backend.cg1_disabled = false;
-
-	return cores_are_available;
-}
-KBASE_EXPORT_TEST_API(kbase_pm_check_transitions_nolock);
-
-/* Timeout for kbase_pm_check_transitions_sync when wait_event_killable has
- * aborted due to a fatal signal. If the time spent waiting has exceeded this
- * threshold then there is most likely a hardware issue. */
-#define PM_TIMEOUT (5*HZ) /* 5s */
-
-void kbase_pm_check_transitions_sync(struct kbase_device *kbdev)
-{
-	unsigned long flags;
-	unsigned long timeout;
-	bool cores_are_available;
-	int ret;
-
-	/* Force the transition to be checked and reported - the cores may be
-	 * 'available' (for job submission) but not fully powered up. */
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	cores_are_available = kbase_pm_check_transitions_nolock(kbdev);
-
-	/* Don't need 'cores_are_available', because we don't return anything */
-	CSTD_UNUSED(cores_are_available);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	timeout = jiffies + PM_TIMEOUT;
-
-	/* Wait for cores */
-	ret = wait_event_killable(kbdev->pm.backend.gpu_in_desired_state_wait,
-			kbdev->pm.backend.gpu_in_desired_state);
-
-	if (ret < 0 && time_after(jiffies, timeout)) {
-		dev_err(kbdev->dev, "Power transition timed out unexpectedly\n");
-		dev_err(kbdev->dev, "Desired state :\n");
-		dev_err(kbdev->dev, "\tShader=%016llx\n",
-				kbdev->pm.backend.desired_shader_state);
-		dev_err(kbdev->dev, "\tTiler =%016llx\n",
-				kbdev->pm.backend.desired_tiler_state);
-		dev_err(kbdev->dev, "Current state :\n");
-		dev_err(kbdev->dev, "\tShader=%08x%08x\n",
-				kbase_reg_read(kbdev,
-					GPU_CONTROL_REG(SHADER_READY_HI), NULL),
-				kbase_reg_read(kbdev,
-					GPU_CONTROL_REG(SHADER_READY_LO),
-					NULL));
-		dev_err(kbdev->dev, "\tTiler =%08x%08x\n",
-				kbase_reg_read(kbdev,
-					GPU_CONTROL_REG(TILER_READY_HI), NULL),
-				kbase_reg_read(kbdev,
-					GPU_CONTROL_REG(TILER_READY_LO), NULL));
-		dev_err(kbdev->dev, "\tL2    =%08x%08x\n",
-				kbase_reg_read(kbdev,
-					GPU_CONTROL_REG(L2_READY_HI), NULL),
-				kbase_reg_read(kbdev,
-					GPU_CONTROL_REG(L2_READY_LO), NULL));
-		dev_err(kbdev->dev, "Cores transitioning :\n");
-		dev_err(kbdev->dev, "\tShader=%08x%08x\n",
-				kbase_reg_read(kbdev, GPU_CONTROL_REG(
-						SHADER_PWRTRANS_HI), NULL),
-				kbase_reg_read(kbdev, GPU_CONTROL_REG(
-						SHADER_PWRTRANS_LO), NULL));
-		dev_err(kbdev->dev, "\tTiler =%08x%08x\n",
-				kbase_reg_read(kbdev, GPU_CONTROL_REG(
-						TILER_PWRTRANS_HI), NULL),
-				kbase_reg_read(kbdev, GPU_CONTROL_REG(
-						TILER_PWRTRANS_LO), NULL));
-		dev_err(kbdev->dev, "\tL2    =%08x%08x\n",
-				kbase_reg_read(kbdev, GPU_CONTROL_REG(
-						L2_PWRTRANS_HI), NULL),
-				kbase_reg_read(kbdev, GPU_CONTROL_REG(
-						L2_PWRTRANS_LO), NULL));
-#if KBASE_GPU_RESET_EN
-		dev_err(kbdev->dev, "Sending reset to GPU - all running jobs will be lost\n");
-		if (kbase_prepare_to_reset_gpu(kbdev))
-			kbase_reset_gpu(kbdev);
-#endif /* KBASE_GPU_RESET_EN */
-	} else {
-		/* Log timelining information that a change in state has
-		 * completed */
-		kbase_timeline_pm_handle_event(kbdev,
-				KBASE_TIMELINE_PM_EVENT_GPU_STATE_CHANGED);
-	}
-}
-KBASE_EXPORT_TEST_API(kbase_pm_check_transitions_sync);
-
-void kbase_pm_enable_interrupts(struct kbase_device *kbdev)
-{
-	unsigned long flags;
-
-	KBASE_DEBUG_ASSERT(NULL != kbdev);
-	/*
-	 * Clear all interrupts,
-	 * and unmask them all.
-	 */
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_IRQ_CLEAR), GPU_IRQ_REG_ALL,
-									NULL);
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_IRQ_MASK), GPU_IRQ_REG_ALL,
-									NULL);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	kbase_reg_write(kbdev, JOB_CONTROL_REG(JOB_IRQ_CLEAR), 0xFFFFFFFF,
-									NULL);
-	kbase_reg_write(kbdev, JOB_CONTROL_REG(JOB_IRQ_MASK), 0xFFFFFFFF, NULL);
-
-	kbase_reg_write(kbdev, MMU_REG(MMU_IRQ_CLEAR), 0xFFFFFFFF, NULL);
-	kbase_reg_write(kbdev, MMU_REG(MMU_IRQ_MASK), 0xFFFFFFFF, NULL);
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_enable_interrupts);
-
-void kbase_pm_disable_interrupts_nolock(struct kbase_device *kbdev)
-{
-	KBASE_DEBUG_ASSERT(NULL != kbdev);
-	/*
-	 * Mask all interrupts,
-	 * and clear them all.
-	 */
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_IRQ_MASK), 0, NULL);
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_IRQ_CLEAR), GPU_IRQ_REG_ALL,
-									NULL);
-	kbase_reg_write(kbdev, JOB_CONTROL_REG(JOB_IRQ_MASK), 0, NULL);
-	kbase_reg_write(kbdev, JOB_CONTROL_REG(JOB_IRQ_CLEAR), 0xFFFFFFFF,
-									NULL);
-
-	kbase_reg_write(kbdev, MMU_REG(MMU_IRQ_MASK), 0, NULL);
-	kbase_reg_write(kbdev, MMU_REG(MMU_IRQ_CLEAR), 0xFFFFFFFF, NULL);
-}
-
-void kbase_pm_disable_interrupts(struct kbase_device *kbdev)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	kbase_pm_disable_interrupts_nolock(kbdev);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_disable_interrupts);
-
-
-/*
- * pmu layout:
- * 0x0000: PMU TAG (RO) (0xCAFECAFE)
- * 0x0004: PMU VERSION ID (RO) (0x00000000)
- * 0x0008: CLOCK ENABLE (RW) (31:1 SBZ, 0 CLOCK STATE)
- */
-void kbase_pm_clock_on(struct kbase_device *kbdev, bool is_resume)
-{
-	bool reset_required = is_resume;
-	struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
-	unsigned long flags;
-
-	KBASE_DEBUG_ASSERT(NULL != kbdev);
-	lockdep_assert_held(&js_devdata->runpool_mutex);
-	lockdep_assert_held(&kbdev->pm.lock);
-
-	if (kbdev->pm.backend.gpu_powered) {
-		/* Already turned on */
-		if (kbdev->poweroff_pending)
-			kbase_pm_enable_interrupts(kbdev);
-		kbdev->poweroff_pending = false;
-		KBASE_DEBUG_ASSERT(!is_resume);
-		return;
-	}
-
-	kbdev->poweroff_pending = false;
-
-	KBASE_TRACE_ADD(kbdev, PM_GPU_ON, NULL, NULL, 0u, 0u);
-
-	if (is_resume && kbdev->pm.backend.callback_power_resume) {
-		kbdev->pm.backend.callback_power_resume(kbdev);
-		return;
-	} else if (kbdev->pm.backend.callback_power_on) {
-		kbdev->pm.backend.callback_power_on(kbdev);
-		/* If your platform properly keeps the GPU state you may use the
-		 * return value of the callback_power_on function to
-		 * conditionally reset the GPU on power up. Currently we are
-		 * conservative and always reset the GPU. */
-		reset_required = true;
-	}
-
-	spin_lock_irqsave(&kbdev->pm.backend.gpu_powered_lock, flags);
-	kbdev->pm.backend.gpu_powered = true;
-	spin_unlock_irqrestore(&kbdev->pm.backend.gpu_powered_lock, flags);
-
-	if (reset_required) {
-		/* GPU state was lost, reset GPU to ensure it is in a
-		 * consistent state */
-		kbase_pm_init_hw(kbdev, PM_ENABLE_IRQS);
-	}
-
-	mutex_lock(&kbdev->mmu_hw_mutex);
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	kbase_ctx_sched_restore_all_as(kbdev);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-	mutex_unlock(&kbdev->mmu_hw_mutex);
-
-	/* Lastly, enable the interrupts */
-	kbase_pm_enable_interrupts(kbdev);
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_clock_on);
-
-bool kbase_pm_clock_off(struct kbase_device *kbdev, bool is_suspend)
-{
-	unsigned long flags;
-
-	KBASE_DEBUG_ASSERT(NULL != kbdev);
-	lockdep_assert_held(&kbdev->pm.lock);
-
-	/* ASSERT that the cores should now be unavailable. No lock needed. */
-	KBASE_DEBUG_ASSERT(kbdev->shader_available_bitmap == 0u);
-
-	kbdev->poweroff_pending = true;
-
-	if (!kbdev->pm.backend.gpu_powered) {
-		/* Already turned off */
-		if (is_suspend && kbdev->pm.backend.callback_power_suspend)
-			kbdev->pm.backend.callback_power_suspend(kbdev);
-		return true;
-	}
-
-	KBASE_TRACE_ADD(kbdev, PM_GPU_OFF, NULL, NULL, 0u, 0u);
-
-	/* Disable interrupts. This also clears any outstanding interrupts */
-	kbase_pm_disable_interrupts(kbdev);
-	/* Ensure that any IRQ handlers have finished */
-	kbase_synchronize_irqs(kbdev);
-
-	spin_lock_irqsave(&kbdev->pm.backend.gpu_powered_lock, flags);
-
-	if (atomic_read(&kbdev->faults_pending)) {
-		/* Page/bus faults are still being processed. The GPU can not
-		 * be powered off until they have completed */
-		spin_unlock_irqrestore(&kbdev->pm.backend.gpu_powered_lock,
-									flags);
-		return false;
-	}
-
-	kbase_pm_cache_snoop_disable(kbdev);
-
-	/* The GPU power may be turned off from this point */
-	kbdev->pm.backend.gpu_powered = false;
-	spin_unlock_irqrestore(&kbdev->pm.backend.gpu_powered_lock, flags);
-
-	if (is_suspend && kbdev->pm.backend.callback_power_suspend)
-		kbdev->pm.backend.callback_power_suspend(kbdev);
-	else if (kbdev->pm.backend.callback_power_off)
-		kbdev->pm.backend.callback_power_off(kbdev);
-	return true;
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_clock_off);
-
-struct kbasep_reset_timeout_data {
-	struct hrtimer timer;
-	bool timed_out;
-	struct kbase_device *kbdev;
-};
-
-void kbase_pm_reset_done(struct kbase_device *kbdev)
-{
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	kbdev->pm.backend.reset_done = true;
-	wake_up(&kbdev->pm.backend.reset_done_wait);
-}
-
-/**
- * kbase_pm_wait_for_reset - Wait for a reset to happen
- *
- * Wait for the %RESET_COMPLETED IRQ to occur, then reset the waiting state.
- *
- * @kbdev: Kbase device
- */
-static void kbase_pm_wait_for_reset(struct kbase_device *kbdev)
-{
-	lockdep_assert_held(&kbdev->pm.lock);
-
-	wait_event(kbdev->pm.backend.reset_done_wait,
-						(kbdev->pm.backend.reset_done));
-	kbdev->pm.backend.reset_done = false;
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_reset_done);
-
-static enum hrtimer_restart kbasep_reset_timeout(struct hrtimer *timer)
-{
-	struct kbasep_reset_timeout_data *rtdata =
-		container_of(timer, struct kbasep_reset_timeout_data, timer);
-
-	rtdata->timed_out = 1;
-
-	/* Set the wait queue to wake up kbase_pm_init_hw even though the reset
-	 * hasn't completed */
-	kbase_pm_reset_done(rtdata->kbdev);
-
-	return HRTIMER_NORESTART;
-}
-
-static void kbase_pm_hw_issues_detect(struct kbase_device *kbdev)
-{
-	struct device_node *np = kbdev->dev->of_node;
-	u32 jm_values[4];
-	const u32 gpu_id = kbdev->gpu_props.props.raw_props.gpu_id;
-	const u32 prod_id = (gpu_id & GPU_ID_VERSION_PRODUCT_ID) >>
-		GPU_ID_VERSION_PRODUCT_ID_SHIFT;
-	const u32 major = (gpu_id & GPU_ID_VERSION_MAJOR) >>
-		GPU_ID_VERSION_MAJOR_SHIFT;
-
-	kbdev->hw_quirks_sc = 0;
-
-	/* Needed due to MIDBASE-1494: LS_PAUSEBUFFER_DISABLE. See PRLAM-8443.
-	 * and needed due to MIDGLES-3539. See PRLAM-11035 */
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8443) ||
-			kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_11035))
-		kbdev->hw_quirks_sc |= SC_LS_PAUSEBUFFER_DISABLE;
-
-	/* Needed due to MIDBASE-2054: SDC_DISABLE_OQ_DISCARD. See PRLAM-10327.
-	 */
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_10327))
-		kbdev->hw_quirks_sc |= SC_SDC_DISABLE_OQ_DISCARD;
-
-#ifdef CONFIG_MALI_BIFROST_PRFCNT_SET_SECONDARY
-	/* Enable alternative hardware counter selection if configured. */
-	if (!GPU_ID_IS_NEW_FORMAT(prod_id))
-		kbdev->hw_quirks_sc |= SC_ALT_COUNTERS;
-#endif
-
-	/* Needed due to MIDBASE-2795. ENABLE_TEXGRD_FLAGS. See PRLAM-10797. */
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_10797))
-		kbdev->hw_quirks_sc |= SC_ENABLE_TEXGRD_FLAGS;
-
-	if (!kbase_hw_has_issue(kbdev, GPUCORE_1619)) {
-		if (prod_id < 0x750 || prod_id == 0x6956) /* T60x, T62x, T72x */
-			kbdev->hw_quirks_sc |= SC_LS_ATTR_CHECK_DISABLE;
-		else if (prod_id >= 0x750 && prod_id <= 0x880) /* T76x, T8xx */
-			kbdev->hw_quirks_sc |= SC_LS_ALLOW_ATTR_TYPES;
-	}
-
-	if (!kbdev->hw_quirks_sc)
-		kbdev->hw_quirks_sc = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(SHADER_CONFIG), NULL);
-
-	kbdev->hw_quirks_tiler = kbase_reg_read(kbdev,
-			GPU_CONTROL_REG(TILER_CONFIG), NULL);
-
-	/* Set tiler clock gate override if required */
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_T76X_3953))
-		kbdev->hw_quirks_tiler |= TC_CLOCK_GATE_OVERRIDE;
-
-	/* Limit the GPU bus bandwidth if the platform needs this. */
-	kbdev->hw_quirks_mmu = kbase_reg_read(kbdev,
-			GPU_CONTROL_REG(L2_MMU_CONFIG), NULL);
-
-	/* Limit read ID width for AXI */
-	kbdev->hw_quirks_mmu &= ~(L2_MMU_CONFIG_LIMIT_EXTERNAL_READS);
-	kbdev->hw_quirks_mmu |= (DEFAULT_ARID_LIMIT & 0x3) <<
-				L2_MMU_CONFIG_LIMIT_EXTERNAL_READS_SHIFT;
-
-	/* Limit write ID width for AXI */
-	kbdev->hw_quirks_mmu &= ~(L2_MMU_CONFIG_LIMIT_EXTERNAL_WRITES);
-	kbdev->hw_quirks_mmu |= (DEFAULT_AWID_LIMIT & 0x3) <<
-				L2_MMU_CONFIG_LIMIT_EXTERNAL_WRITES_SHIFT;
-
-	if (kbdev->system_coherency == COHERENCY_ACE) {
-		/* Allow memory configuration disparity to be ignored, we
-		 * optimize the use of shared memory and thus we expect
-		 * some disparity in the memory configuration */
-		kbdev->hw_quirks_mmu |= L2_MMU_CONFIG_ALLOW_SNOOP_DISPARITY;
-	}
-
-	kbdev->hw_quirks_jm = 0;
-	/* Only for T86x/T88x-based products after r2p0 */
-	if (prod_id >= 0x860 && prod_id <= 0x880 && major >= 2) {
-
-		if (of_property_read_u32_array(np,
-					"jm_config",
-					&jm_values[0],
-					ARRAY_SIZE(jm_values))) {
-			/* Entry not in device tree, use defaults  */
-			jm_values[0] = 0;
-			jm_values[1] = 0;
-			jm_values[2] = 0;
-			jm_values[3] = JM_MAX_JOB_THROTTLE_LIMIT;
-		}
-
-		/* Limit throttle limit to 6 bits*/
-		if (jm_values[3] > JM_MAX_JOB_THROTTLE_LIMIT) {
-			dev_dbg(kbdev->dev, "JOB_THROTTLE_LIMIT supplied in device tree is too large. Limiting to MAX (63).");
-			jm_values[3] = JM_MAX_JOB_THROTTLE_LIMIT;
-		}
-
-		/* Aggregate to one integer. */
-		kbdev->hw_quirks_jm |= (jm_values[0] ?
-				JM_TIMESTAMP_OVERRIDE : 0);
-		kbdev->hw_quirks_jm |= (jm_values[1] ?
-				JM_CLOCK_GATE_OVERRIDE : 0);
-		kbdev->hw_quirks_jm |= (jm_values[2] ?
-				JM_JOB_THROTTLE_ENABLE : 0);
-		kbdev->hw_quirks_jm |= (jm_values[3] <<
-				JM_JOB_THROTTLE_LIMIT_SHIFT);
-
-	} else if (GPU_ID_IS_NEW_FORMAT(prod_id) &&
-			   (GPU_ID2_MODEL_MATCH_VALUE(prod_id) ==
-					   GPU_ID2_PRODUCT_TMIX)) {
-		/* Only for tMIx */
-		u32 coherency_features;
-
-		coherency_features = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(COHERENCY_FEATURES), NULL);
-
-		/* (COHERENCY_ACE_LITE | COHERENCY_ACE) was incorrectly
-		 * documented for tMIx so force correct value here.
-		 */
-		if (coherency_features ==
-				COHERENCY_FEATURE_BIT(COHERENCY_ACE)) {
-			kbdev->hw_quirks_jm |=
-				(COHERENCY_ACE_LITE | COHERENCY_ACE) <<
-				JM_FORCE_COHERENCY_FEATURES_SHIFT;
-		}
-	}
-
-
-	if (!kbdev->hw_quirks_jm)
-		kbdev->hw_quirks_jm = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(JM_CONFIG), NULL);
-
-#ifdef CONFIG_MALI_CORESTACK
-#define MANUAL_POWER_CONTROL ((u32)(1 << 8))
-	kbdev->hw_quirks_jm |= MANUAL_POWER_CONTROL;
-#endif /* CONFIG_MALI_CORESTACK */
-}
-
-static void kbase_pm_hw_issues_apply(struct kbase_device *kbdev)
-{
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(SHADER_CONFIG),
-			kbdev->hw_quirks_sc, NULL);
-
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(TILER_CONFIG),
-			kbdev->hw_quirks_tiler, NULL);
-
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(L2_MMU_CONFIG),
-			kbdev->hw_quirks_mmu, NULL);
-
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(JM_CONFIG),
-			kbdev->hw_quirks_jm, NULL);
-
-}
-
-void kbase_pm_cache_snoop_enable(struct kbase_device *kbdev)
-{
-	if ((kbdev->current_gpu_coherency_mode == COHERENCY_ACE) &&
-		!kbdev->cci_snoop_enabled) {
-#ifdef CONFIG_ARM64
-		if (kbdev->snoop_enable_smc != 0)
-			kbase_invoke_smc_fid(kbdev->snoop_enable_smc, 0, 0, 0);
-#endif /* CONFIG_ARM64 */
-		dev_dbg(kbdev->dev, "MALI - CCI Snoops - Enabled\n");
-		kbdev->cci_snoop_enabled = true;
-	}
-}
-
-void kbase_pm_cache_snoop_disable(struct kbase_device *kbdev)
-{
-	if (kbdev->cci_snoop_enabled) {
-#ifdef CONFIG_ARM64
-		if (kbdev->snoop_disable_smc != 0) {
-			mali_cci_flush_l2(kbdev);
-			kbase_invoke_smc_fid(kbdev->snoop_disable_smc, 0, 0, 0);
-		}
-#endif /* CONFIG_ARM64 */
-		dev_dbg(kbdev->dev, "MALI - CCI Snoops Disabled\n");
-		kbdev->cci_snoop_enabled = false;
-	}
-}
-
-static int kbase_pm_do_reset(struct kbase_device *kbdev)
-{
-	struct kbasep_reset_timeout_data rtdata;
-
-	KBASE_TRACE_ADD(kbdev, CORE_GPU_SOFT_RESET, NULL, NULL, 0u, 0);
-
-	KBASE_TLSTREAM_JD_GPU_SOFT_RESET(kbdev);
-
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
-						GPU_COMMAND_SOFT_RESET, NULL);
-
-	/* Unmask the reset complete interrupt only */
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_IRQ_MASK), RESET_COMPLETED,
-									NULL);
-
-	/* Initialize a structure for tracking the status of the reset */
-	rtdata.kbdev = kbdev;
-	rtdata.timed_out = 0;
-
-	/* Create a timer to use as a timeout on the reset */
-	hrtimer_init_on_stack(&rtdata.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
-	rtdata.timer.function = kbasep_reset_timeout;
-
-	hrtimer_start(&rtdata.timer, HR_TIMER_DELAY_MSEC(RESET_TIMEOUT),
-							HRTIMER_MODE_REL);
-
-	/* Wait for the RESET_COMPLETED interrupt to be raised */
-	kbase_pm_wait_for_reset(kbdev);
-
-	if (rtdata.timed_out == 0) {
-		/* GPU has been reset */
-		hrtimer_cancel(&rtdata.timer);
-		destroy_hrtimer_on_stack(&rtdata.timer);
-		return 0;
-	}
-
-	/* No interrupt has been received - check if the RAWSTAT register says
-	 * the reset has completed */
-	if (kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_IRQ_RAWSTAT), NULL) &
-							RESET_COMPLETED) {
-		/* The interrupt is set in the RAWSTAT; this suggests that the
-		 * interrupts are not getting to the CPU */
-		dev_err(kbdev->dev, "Reset interrupt didn't reach CPU. Check interrupt assignments.\n");
-		/* If interrupts aren't working we can't continue. */
-		destroy_hrtimer_on_stack(&rtdata.timer);
-		return -EINVAL;
-	}
-
-	/* The GPU doesn't seem to be responding to the reset so try a hard
-	 * reset */
-	dev_err(kbdev->dev, "Failed to soft-reset GPU (timed out after %d ms), now attempting a hard reset\n",
-								RESET_TIMEOUT);
-	KBASE_TRACE_ADD(kbdev, CORE_GPU_HARD_RESET, NULL, NULL, 0u, 0);
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
-						GPU_COMMAND_HARD_RESET, NULL);
-
-	/* Restart the timer to wait for the hard reset to complete */
-	rtdata.timed_out = 0;
-
-	hrtimer_start(&rtdata.timer, HR_TIMER_DELAY_MSEC(RESET_TIMEOUT),
-							HRTIMER_MODE_REL);
-
-	/* Wait for the RESET_COMPLETED interrupt to be raised */
-	kbase_pm_wait_for_reset(kbdev);
-
-	if (rtdata.timed_out == 0) {
-		/* GPU has been reset */
-		hrtimer_cancel(&rtdata.timer);
-		destroy_hrtimer_on_stack(&rtdata.timer);
-		return 0;
-	}
-
-	destroy_hrtimer_on_stack(&rtdata.timer);
-
-	dev_err(kbdev->dev, "Failed to hard-reset the GPU (timed out after %d ms)\n",
-								RESET_TIMEOUT);
-
-	return -EINVAL;
-}
-
-static int kbasep_protected_mode_enable(struct protected_mode_device *pdev)
-{
-	struct kbase_device *kbdev = pdev->data;
-
-	kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
-		GPU_COMMAND_SET_PROTECTED_MODE, NULL);
-	return 0;
-}
-
-static int kbasep_protected_mode_disable(struct protected_mode_device *pdev)
-{
-	struct kbase_device *kbdev = pdev->data;
-
-	lockdep_assert_held(&kbdev->pm.lock);
-
-	return kbase_pm_do_reset(kbdev);
-}
-
-struct protected_mode_ops kbase_native_protected_ops = {
-	.protected_mode_enable = kbasep_protected_mode_enable,
-	.protected_mode_disable = kbasep_protected_mode_disable
-};
-
-int kbase_pm_init_hw(struct kbase_device *kbdev, unsigned int flags)
-{
-	unsigned long irq_flags;
-	int err;
-	bool resume_vinstr = false;
-
-	KBASE_DEBUG_ASSERT(NULL != kbdev);
-	lockdep_assert_held(&kbdev->pm.lock);
-
-	/* Ensure the clock is on before attempting to access the hardware */
-	if (!kbdev->pm.backend.gpu_powered) {
-		if (kbdev->pm.backend.callback_power_on)
-			kbdev->pm.backend.callback_power_on(kbdev);
-
-		spin_lock_irqsave(&kbdev->pm.backend.gpu_powered_lock,
-								irq_flags);
-		kbdev->pm.backend.gpu_powered = true;
-		spin_unlock_irqrestore(&kbdev->pm.backend.gpu_powered_lock,
-								irq_flags);
-	}
-
-	/* Ensure interrupts are off to begin with, this also clears any
-	 * outstanding interrupts */
-	kbase_pm_disable_interrupts(kbdev);
-	/* Ensure cache snoops are disabled before reset. */
-	kbase_pm_cache_snoop_disable(kbdev);
-	/* Prepare for the soft-reset */
-	kbdev->pm.backend.reset_done = false;
-
-	/* The cores should be made unavailable due to the reset */
-	spin_lock_irqsave(&kbdev->hwaccess_lock, irq_flags);
-	if (kbdev->shader_available_bitmap != 0u)
-			KBASE_TRACE_ADD(kbdev, PM_CORES_CHANGE_AVAILABLE, NULL,
-						NULL, 0u, (u32)0u);
-	if (kbdev->tiler_available_bitmap != 0u)
-			KBASE_TRACE_ADD(kbdev, PM_CORES_CHANGE_AVAILABLE_TILER,
-						NULL, NULL, 0u, (u32)0u);
-	kbdev->shader_available_bitmap = 0u;
-	kbdev->tiler_available_bitmap = 0u;
-	kbdev->l2_available_bitmap = 0u;
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, irq_flags);
-
-	/* Soft reset the GPU */
-	if (kbdev->protected_mode_support)
-		err = kbdev->protected_ops->protected_mode_disable(
-				kbdev->protected_dev);
-	else
-		err = kbase_pm_do_reset(kbdev);
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, irq_flags);
-	if (kbdev->protected_mode)
-		resume_vinstr = true;
-	kbdev->protected_mode = false;
-	kbase_ipa_model_use_configured_locked(kbdev);
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, irq_flags);
-
-	if (err)
-		goto exit;
-
-	if (flags & PM_HW_ISSUES_DETECT)
-		kbase_pm_hw_issues_detect(kbdev);
-
-	kbase_pm_hw_issues_apply(kbdev);
-	kbase_cache_set_coherency_mode(kbdev, kbdev->system_coherency);
-
-	/* Sanity check protected mode was left after reset */
-	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_PROTECTED_MODE)) {
-		u32 gpu_status = kbase_reg_read(kbdev,
-				GPU_CONTROL_REG(GPU_STATUS), NULL);
-
-		WARN_ON(gpu_status & GPU_STATUS_PROTECTED_MODE_ACTIVE);
-	}
-
-	/* If cycle counter was in use re-enable it, enable_irqs will only be
-	 * false when called from kbase_pm_powerup */
-	if (kbdev->pm.backend.gpu_cycle_counter_requests &&
-						(flags & PM_ENABLE_IRQS)) {
-		/* enable interrupts as the L2 may have to be powered on */
-		kbase_pm_enable_interrupts(kbdev);
-		kbase_pm_request_l2_caches(kbdev);
-
-		/* Re-enable the counters if we need to */
-		spin_lock_irqsave(
-			&kbdev->pm.backend.gpu_cycle_counter_requests_lock,
-								irq_flags);
-		if (kbdev->pm.backend.gpu_cycle_counter_requests)
-			kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
-					GPU_COMMAND_CYCLE_COUNT_START, NULL);
-		spin_unlock_irqrestore(
-			&kbdev->pm.backend.gpu_cycle_counter_requests_lock,
-								irq_flags);
-
-		spin_lock_irqsave(&kbdev->hwaccess_lock, irq_flags);
-		kbase_pm_release_l2_caches(kbdev);
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, irq_flags);
-
-		kbase_pm_disable_interrupts(kbdev);
-	}
-
-	if (flags & PM_ENABLE_IRQS)
-		kbase_pm_enable_interrupts(kbdev);
-
-exit:
-	/* If GPU is leaving protected mode resume vinstr operation. */
-	if (kbdev->vinstr_ctx && resume_vinstr)
-		kbase_vinstr_resume(kbdev->vinstr_ctx);
-
-	return err;
-}
-
-/**
- * kbase_pm_request_gpu_cycle_counter_do_request - Request cycle counters
- *
- * Increase the count of cycle counter users and turn the cycle counters on if
- * they were previously off
- *
- * This function is designed to be called by
- * kbase_pm_request_gpu_cycle_counter() or
- * kbase_pm_request_gpu_cycle_counter_l2_is_on() only
- *
- * When this function is called the l2 cache must be on and the l2 cache users
- * count must have been incremented by a call to (
- * kbase_pm_request_l2_caches() or kbase_pm_request_l2_caches_l2_on() )
- *
- * @kbdev:     The kbase device structure of the device
- */
-static void
-kbase_pm_request_gpu_cycle_counter_do_request(struct kbase_device *kbdev)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&kbdev->pm.backend.gpu_cycle_counter_requests_lock,
-									flags);
-
-	++kbdev->pm.backend.gpu_cycle_counter_requests;
-
-	if (1 == kbdev->pm.backend.gpu_cycle_counter_requests)
-		kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
-					GPU_COMMAND_CYCLE_COUNT_START, NULL);
-
-	spin_unlock_irqrestore(
-			&kbdev->pm.backend.gpu_cycle_counter_requests_lock,
-									flags);
-}
-
-void kbase_pm_request_gpu_cycle_counter(struct kbase_device *kbdev)
-{
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	KBASE_DEBUG_ASSERT(kbdev->pm.backend.gpu_powered);
-
-	KBASE_DEBUG_ASSERT(kbdev->pm.backend.gpu_cycle_counter_requests <
-								INT_MAX);
-
-	kbase_pm_request_l2_caches(kbdev);
-
-	kbase_pm_request_gpu_cycle_counter_do_request(kbdev);
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_request_gpu_cycle_counter);
-
-void kbase_pm_request_gpu_cycle_counter_l2_is_on(struct kbase_device *kbdev)
-{
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	KBASE_DEBUG_ASSERT(kbdev->pm.backend.gpu_powered);
-
-	KBASE_DEBUG_ASSERT(kbdev->pm.backend.gpu_cycle_counter_requests <
-								INT_MAX);
-
-	kbase_pm_request_l2_caches_l2_is_on(kbdev);
-
-	kbase_pm_request_gpu_cycle_counter_do_request(kbdev);
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_request_gpu_cycle_counter_l2_is_on);
-
-void kbase_pm_release_gpu_cycle_counter_nolock(struct kbase_device *kbdev)
-{
-	unsigned long flags;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	spin_lock_irqsave(&kbdev->pm.backend.gpu_cycle_counter_requests_lock,
-									flags);
-
-	KBASE_DEBUG_ASSERT(kbdev->pm.backend.gpu_cycle_counter_requests > 0);
-
-	--kbdev->pm.backend.gpu_cycle_counter_requests;
-
-	if (0 == kbdev->pm.backend.gpu_cycle_counter_requests)
-		kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND),
-					GPU_COMMAND_CYCLE_COUNT_STOP, NULL);
-
-	spin_unlock_irqrestore(
-			&kbdev->pm.backend.gpu_cycle_counter_requests_lock,
-									flags);
-
-	kbase_pm_release_l2_caches(kbdev);
-}
-
-void kbase_pm_release_gpu_cycle_counter(struct kbase_device *kbdev)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	kbase_pm_release_gpu_cycle_counter_nolock(kbdev);
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_release_gpu_cycle_counter);
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_internal.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_internal.h
deleted file mode 100644
index 9fbe094541c5..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_internal.h
+++ /dev/null
@@ -1,548 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * Power management API definitions used internally by GPU backend
- */
-
-#ifndef _KBASE_BACKEND_PM_INTERNAL_H_
-#define _KBASE_BACKEND_PM_INTERNAL_H_
-
-#include <mali_kbase_hwaccess_pm.h>
-
-#include "mali_kbase_pm_ca.h"
-#include "mali_kbase_pm_policy.h"
-
-
-/**
- * kbase_pm_dev_idle - The GPU is idle.
- *
- * The OS may choose to turn off idle devices
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_dev_idle(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_dev_activate - The GPU is active.
- *
- * The OS should avoid opportunistically turning off the GPU while it is active
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_dev_activate(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_get_present_cores - Get details of the cores that are present in
- *                              the device.
- *
- * This function can be called by the active power policy to return a bitmask of
- * the cores (of a specified type) present in the GPU device and also a count of
- * the number of cores.
- *
- * @kbdev: The kbase device structure for the device (must be a valid
- *         pointer)
- * @type:  The type of core (see the enum kbase_pm_core_type enumeration)
- *
- * Return: The bit mask of cores present
- */
-u64 kbase_pm_get_present_cores(struct kbase_device *kbdev,
-						enum kbase_pm_core_type type);
-
-/**
- * kbase_pm_get_active_cores - Get details of the cores that are currently
- *                             active in the device.
- *
- * This function can be called by the active power policy to return a bitmask of
- * the cores (of a specified type) that are actively processing work (i.e.
- * turned on *and* busy).
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- * @type:  The type of core (see the enum kbase_pm_core_type enumeration)
- *
- * Return: The bit mask of active cores
- */
-u64 kbase_pm_get_active_cores(struct kbase_device *kbdev,
-						enum kbase_pm_core_type type);
-
-/**
- * kbase_pm_get_trans_cores - Get details of the cores that are currently
- *                            transitioning between power states.
- *
- * This function can be called by the active power policy to return a bitmask of
- * the cores (of a specified type) that are currently transitioning between
- * power states.
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- * @type:  The type of core (see the enum kbase_pm_core_type enumeration)
- *
- * Return: The bit mask of transitioning cores
- */
-u64 kbase_pm_get_trans_cores(struct kbase_device *kbdev,
-						enum kbase_pm_core_type type);
-
-/**
- * kbase_pm_get_ready_cores - Get details of the cores that are currently
- *                            powered and ready for jobs.
- *
- * This function can be called by the active power policy to return a bitmask of
- * the cores (of a specified type) that are powered and ready for jobs (they may
- * or may not be currently executing jobs).
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- * @type:  The type of core (see the enum kbase_pm_core_type enumeration)
- *
- * Return: The bit mask of ready cores
- */
-u64 kbase_pm_get_ready_cores(struct kbase_device *kbdev,
-						enum kbase_pm_core_type type);
-
-/**
- * kbase_pm_clock_on - Turn the clock for the device on, and enable device
- *                     interrupts.
- *
- * This function can be used by a power policy to turn the clock for the GPU on.
- * It should be modified during integration to perform the necessary actions to
- * ensure that the GPU is fully powered and clocked.
- *
- * @kbdev:     The kbase device structure for the device (must be a valid
- *             pointer)
- * @is_resume: true if clock on due to resume after suspend, false otherwise
- */
-void kbase_pm_clock_on(struct kbase_device *kbdev, bool is_resume);
-
-/**
- * kbase_pm_clock_off - Disable device interrupts, and turn the clock for the
- *                      device off.
- *
- * This function can be used by a power policy to turn the clock for the GPU
- * off. It should be modified during integration to perform the necessary
- * actions to turn the clock off (if this is possible in the integration).
- *
- * @kbdev:      The kbase device structure for the device (must be a valid
- *              pointer)
- * @is_suspend: true if clock off due to suspend, false otherwise
- *
- * Return: true  if clock was turned off, or
- *         false if clock can not be turned off due to pending page/bus fault
- *               workers. Caller must flush MMU workqueues and retry
- */
-bool kbase_pm_clock_off(struct kbase_device *kbdev, bool is_suspend);
-
-/**
- * kbase_pm_enable_interrupts - Enable interrupts on the device.
- *
- * Interrupts are also enabled after a call to kbase_pm_clock_on().
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_enable_interrupts(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_disable_interrupts - Disable interrupts on the device.
- *
- * This prevents delivery of Power Management interrupts to the CPU so that
- * kbase_pm_check_transitions_nolock() will not be called from the IRQ handler
- * until kbase_pm_enable_interrupts() or kbase_pm_clock_on() is called.
- *
- * Interrupts are also disabled after a call to kbase_pm_clock_off().
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_disable_interrupts(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_disable_interrupts_nolock - Version of kbase_pm_disable_interrupts()
- *                                      that does not take the hwaccess_lock
- *
- * Caller must hold the hwaccess_lock.
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_disable_interrupts_nolock(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_init_hw - Initialize the hardware.
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- * @flags: Flags specifying the type of PM init
- *
- * This function checks the GPU ID register to ensure that the GPU is supported
- * by the driver and performs a reset on the device so that it is in a known
- * state before the device is used.
- *
- * Return: 0 if the device is supported and successfully reset.
- */
-int kbase_pm_init_hw(struct kbase_device *kbdev, unsigned int flags);
-
-/**
- * kbase_pm_reset_done - The GPU has been reset successfully.
- *
- * This function must be called by the GPU interrupt handler when the
- * RESET_COMPLETED bit is set. It signals to the power management initialization
- * code that the GPU has been successfully reset.
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_reset_done(struct kbase_device *kbdev);
-
-
-/**
- * kbase_pm_check_transitions_nolock - Check if there are any power transitions
- *                                     to make, and if so start them.
- *
- * This function will check the desired_xx_state members of
- * struct kbase_pm_device_data and the actual status of the hardware to see if
- * any power transitions can be made at this time to make the hardware state
- * closer to the state desired by the power policy.
- *
- * The return value can be used to check whether all the desired cores are
- * available, and so whether it's worth submitting a job (e.g. from a Power
- * Management IRQ).
- *
- * Note that this still returns true when desired_xx_state has no
- * cores. That is: of the no cores desired, none were *un*available. In
- * this case, the caller may still need to try submitting jobs. This is because
- * the Core Availability Policy might have taken us to an intermediate state
- * where no cores are powered, before powering on more cores (e.g. for core
- * rotation)
- *
- * The caller must hold kbase_device.pm.power_change_lock
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- *
- * Return:      non-zero when all desired cores are available. That is,
- *              it's worthwhile for the caller to submit a job.
- *              false otherwise
- */
-bool kbase_pm_check_transitions_nolock(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_check_transitions_sync - Synchronous and locking variant of
- *                                   kbase_pm_check_transitions_nolock()
- *
- * On returning, the desired state at the time of the call will have been met.
- *
- * There is nothing to stop the core being switched off by calls to
- * kbase_pm_release_cores() or kbase_pm_unrequest_cores(). Therefore, the
- * caller must have already made a call to
- * kbase_pm_request_cores()/kbase_pm_request_cores_sync() previously.
- *
- * The usual use-case for this is to ensure cores are 'READY' after performing
- * a GPU Reset.
- *
- * Unlike kbase_pm_check_transitions_nolock(), the caller must not hold
- * kbase_device.pm.power_change_lock, because this function will take that
- * lock itself.
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_check_transitions_sync(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_update_cores_state_nolock - Variant of kbase_pm_update_cores_state()
- *                                      where the caller must hold
- *                                      kbase_device.pm.power_change_lock
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_update_cores_state_nolock(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_update_cores_state - Update the desired state of shader cores from
- *                               the Power Policy, and begin any power
- *                               transitions.
- *
- * This function will update the desired_xx_state members of
- * struct kbase_pm_device_data by calling into the current Power Policy. It will
- * then begin power transitions to make the hardware acheive the desired shader
- * core state.
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_update_cores_state(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_cancel_deferred_poweroff - Cancel any pending requests to power off
- *                                     the GPU and/or shader cores.
- *
- * This should be called by any functions which directly power off the GPU.
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_cancel_deferred_poweroff(struct kbase_device *kbdev);
-
-/**
- * kbasep_pm_init_core_use_bitmaps - Initialise data tracking the required
- *                                   and used cores.
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- */
-void kbasep_pm_init_core_use_bitmaps(struct kbase_device *kbdev);
-
-/**
- * kbasep_pm_metrics_init - Initialize the metrics gathering framework.
- *
- * This must be called before other metric gathering APIs are called.
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- *
- * Return: 0 on success, error code on error
- */
-int kbasep_pm_metrics_init(struct kbase_device *kbdev);
-
-/**
- * kbasep_pm_metrics_term - Terminate the metrics gathering framework.
- *
- * This must be called when metric gathering is no longer required. It is an
- * error to call any metrics gathering function (other than
- * kbasep_pm_metrics_init()) after calling this function.
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- */
-void kbasep_pm_metrics_term(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_report_vsync - Function to be called by the frame buffer driver to
- *                         update the vsync metric.
- *
- * This function should be called by the frame buffer driver to update whether
- * the system is hitting the vsync target or not. buffer_updated should be true
- * if the vsync corresponded with a new frame being displayed, otherwise it
- * should be false. This function does not need to be called every vsync, but
- * only when the value of @buffer_updated differs from a previous call.
- *
- * @kbdev:          The kbase device structure for the device (must be a
- *                  valid pointer)
- * @buffer_updated: True if the buffer has been updated on this VSync,
- *                  false otherwise
- */
-void kbase_pm_report_vsync(struct kbase_device *kbdev, int buffer_updated);
-
-/**
- * kbase_pm_get_dvfs_action - Determine whether the DVFS system should change
- *                            the clock speed of the GPU.
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- *
- * This function should be called regularly by the DVFS system to check whether
- * the clock speed of the GPU needs updating.
- */
-void kbase_pm_get_dvfs_action(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_request_gpu_cycle_counter - Mark that the GPU cycle counter is
- *                                      needed
- *
- * If the caller is the first caller then the GPU cycle counters will be enabled
- * along with the l2 cache
- *
- * The GPU must be powered when calling this function (i.e.
- * kbase_pm_context_active() must have been called).
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_request_gpu_cycle_counter(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_request_gpu_cycle_counter_l2_is_on - Mark GPU cycle counter is
- *                                               needed (l2 cache already on)
- *
- * This is a version of the above function
- * (kbase_pm_request_gpu_cycle_counter()) suitable for being called when the
- * l2 cache is known to be on and assured to be on until the subsequent call of
- * kbase_pm_release_gpu_cycle_counter() such as when a job is submitted. It does
- * not sleep and can be called from atomic functions.
- *
- * The GPU must be powered when calling this function (i.e.
- * kbase_pm_context_active() must have been called) and the l2 cache must be
- * powered on.
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_request_gpu_cycle_counter_l2_is_on(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_release_gpu_cycle_counter - Mark that the GPU cycle counter is no
- *                                      longer in use
- *
- * If the caller is the last caller then the GPU cycle counters will be
- * disabled. A request must have been made before a call to this.
- *
- * Caller must not hold the hwaccess_lock, as it will be taken in this function.
- * If the caller is already holding this lock then
- * kbase_pm_release_gpu_cycle_counter_nolock() must be used instead.
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_release_gpu_cycle_counter(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_release_gpu_cycle_counter_nolock - Version of kbase_pm_release_gpu_cycle_counter()
- *                                             that does not take hwaccess_lock
- *
- * Caller must hold the hwaccess_lock.
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_release_gpu_cycle_counter_nolock(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_wait_for_poweroff_complete - Wait for the poweroff workqueue to
- *                                       complete
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_wait_for_poweroff_complete(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_register_access_enable - Enable access to GPU registers
- *
- * Enables access to the GPU registers before power management has powered up
- * the GPU with kbase_pm_powerup().
- *
- * Access to registers should be done using kbase_os_reg_read()/write() at this
- * stage, not kbase_reg_read()/write().
- *
- * This results in the power management callbacks provided in the driver
- * configuration to get called to turn on power and/or clocks to the GPU. See
- * kbase_pm_callback_conf.
- *
- * This should only be used before power management is powered up with
- * kbase_pm_powerup()
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_register_access_enable(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_register_access_disable - Disable early register access
- *
- * Disables access to the GPU registers enabled earlier by a call to
- * kbase_pm_register_access_enable().
- *
- * This results in the power management callbacks provided in the driver
- * configuration to get called to turn off power and/or clocks to the GPU. See
- * kbase_pm_callback_conf
- *
- * This should only be used before power management is powered up with
- * kbase_pm_powerup()
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_register_access_disable(struct kbase_device *kbdev);
-
-/* NOTE: kbase_pm_is_suspending is in mali_kbase.h, because it is an inline
- * function */
-
-/**
- * kbase_pm_metrics_is_active - Check if the power management metrics
- *                              collection is active.
- *
- * Note that this returns if the power management metrics collection was
- * active at the time of calling, it is possible that after the call the metrics
- * collection enable may have changed state.
- *
- * The caller must handle the consequence that the state may have changed.
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- * Return: true if metrics collection was active else false.
- */
-bool kbase_pm_metrics_is_active(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_do_poweron - Power on the GPU, and any cores that are requested.
- *
- * @kbdev:     The kbase device structure for the device (must be a valid
- *             pointer)
- * @is_resume: true if power on due to resume after suspend,
- *             false otherwise
- */
-void kbase_pm_do_poweron(struct kbase_device *kbdev, bool is_resume);
-
-/**
- * kbase_pm_do_poweroff - Power off the GPU, and any cores that have been
- *                        requested.
- *
- * @kbdev:      The kbase device structure for the device (must be a valid
- *              pointer)
- * @is_suspend: true if power off due to suspend,
- *              false otherwise
- */
-void kbase_pm_do_poweroff(struct kbase_device *kbdev, bool is_suspend);
-
-#if defined(CONFIG_MALI_BIFROST_DEVFREQ) || defined(CONFIG_MALI_BIFROST_DVFS)
-void kbase_pm_get_dvfs_utilisation(struct kbase_device *kbdev,
-		unsigned long *total, unsigned long *busy);
-void kbase_pm_reset_dvfs_utilisation(struct kbase_device *kbdev);
-#endif /* defined(CONFIG_MALI_BIFROST_DEVFREQ) || defined(CONFIG_MALI_BIFROST_DVFS) */
-
-#ifdef CONFIG_MALI_BIFROST_DVFS
-
-/**
- * kbase_platform_dvfs_event - Report utilisation to DVFS code
- *
- * Function provided by platform specific code when DVFS is enabled to allow
- * the power management metrics system to report utilisation.
- *
- * @kbdev:         The kbase device structure for the device (must be a
- *                 valid pointer)
- * @utilisation:   The current calculated utilisation by the metrics system.
- * @util_gl_share: The current calculated gl share of utilisation.
- * @util_cl_share: The current calculated cl share of utilisation per core
- *                 group.
- * Return:         Returns 0 on failure and non zero on success.
- */
-
-int kbase_platform_dvfs_event(struct kbase_device *kbdev, u32 utilisation,
-	u32 util_gl_share, u32 util_cl_share[2]);
-#endif
-
-void kbase_pm_power_changed(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_metrics_update - Inform the metrics system that an atom is either
- *                           about to be run or has just completed.
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- * @now:   Pointer to the timestamp of the change, or NULL to use current time
- *
- * Caller must hold hwaccess_lock
- */
-void kbase_pm_metrics_update(struct kbase_device *kbdev,
-				ktime_t *now);
-
-/**
- * kbase_pm_cache_snoop_enable - Allow CPU snoops on the GPU
- * If the GPU does not have coherency this is a no-op
- * @kbdev:	Device pointer
- *
- * This function should be called after L2 power up.
- */
-
-void kbase_pm_cache_snoop_enable(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_cache_snoop_disable - Prevent CPU snoops on the GPU
- * If the GPU does not have coherency this is a no-op
- * @kbdev:	Device pointer
- *
- * This function should be called before L2 power off.
- */
-void kbase_pm_cache_snoop_disable(struct kbase_device *kbdev);
-
-#endif /* _KBASE_BACKEND_PM_INTERNAL_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_metrics.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_metrics.c
deleted file mode 100644
index ba13bcd8b291..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_metrics.c
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * Metrics for power management
- */
-
-#include <mali_kbase.h>
-#include <mali_kbase_pm.h>
-#include <backend/gpu/mali_kbase_pm_internal.h>
-#include <backend/gpu/mali_kbase_jm_rb.h>
-
-/* When VSync is being hit aim for utilisation between 70-90% */
-#define KBASE_PM_VSYNC_MIN_UTILISATION          70
-#define KBASE_PM_VSYNC_MAX_UTILISATION          90
-/* Otherwise aim for 10-40% */
-#define KBASE_PM_NO_VSYNC_MIN_UTILISATION       10
-#define KBASE_PM_NO_VSYNC_MAX_UTILISATION       40
-
-/* Shift used for kbasep_pm_metrics_data.time_busy/idle - units of (1 << 8) ns
- * This gives a maximum period between samples of 2^(32+8)/100 ns = slightly
- * under 11s. Exceeding this will cause overflow */
-#define KBASE_PM_TIME_SHIFT			8
-
-/* Maximum time between sampling of utilization data, without resetting the
- * counters. */
-#define MALI_UTILIZATION_MAX_PERIOD 100000 /* ns = 100ms */
-
-#ifdef CONFIG_MALI_BIFROST_DVFS
-static enum hrtimer_restart dvfs_callback(struct hrtimer *timer)
-{
-	unsigned long flags;
-	struct kbasep_pm_metrics_data *metrics;
-
-	KBASE_DEBUG_ASSERT(timer != NULL);
-
-	metrics = container_of(timer, struct kbasep_pm_metrics_data, timer);
-	kbase_pm_get_dvfs_action(metrics->kbdev);
-
-	spin_lock_irqsave(&metrics->lock, flags);
-
-	if (metrics->timer_active)
-		hrtimer_start(timer,
-			HR_TIMER_DELAY_MSEC(metrics->kbdev->pm.dvfs_period),
-			HRTIMER_MODE_REL);
-
-	spin_unlock_irqrestore(&metrics->lock, flags);
-
-	return HRTIMER_NORESTART;
-}
-#endif /* CONFIG_MALI_BIFROST_DVFS */
-
-int kbasep_pm_metrics_init(struct kbase_device *kbdev)
-{
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	kbdev->pm.backend.metrics.kbdev = kbdev;
-
-	kbdev->pm.backend.metrics.time_period_start = ktime_get();
-	kbdev->pm.backend.metrics.time_busy = 0;
-	kbdev->pm.backend.metrics.time_idle = 0;
-	kbdev->pm.backend.metrics.prev_busy = 0;
-	kbdev->pm.backend.metrics.prev_idle = 0;
-	kbdev->pm.backend.metrics.gpu_active = false;
-	kbdev->pm.backend.metrics.active_cl_ctx[0] = 0;
-	kbdev->pm.backend.metrics.active_cl_ctx[1] = 0;
-	kbdev->pm.backend.metrics.active_gl_ctx[0] = 0;
-	kbdev->pm.backend.metrics.active_gl_ctx[1] = 0;
-	kbdev->pm.backend.metrics.busy_cl[0] = 0;
-	kbdev->pm.backend.metrics.busy_cl[1] = 0;
-	kbdev->pm.backend.metrics.busy_gl = 0;
-
-	spin_lock_init(&kbdev->pm.backend.metrics.lock);
-
-#ifdef CONFIG_MALI_BIFROST_DVFS
-	kbdev->pm.backend.metrics.timer_active = true;
-	hrtimer_init(&kbdev->pm.backend.metrics.timer, CLOCK_MONOTONIC,
-							HRTIMER_MODE_REL);
-	kbdev->pm.backend.metrics.timer.function = dvfs_callback;
-
-	hrtimer_start(&kbdev->pm.backend.metrics.timer,
-			HR_TIMER_DELAY_MSEC(kbdev->pm.dvfs_period),
-			HRTIMER_MODE_REL);
-#endif /* CONFIG_MALI_BIFROST_DVFS */
-
-	return 0;
-}
-
-KBASE_EXPORT_TEST_API(kbasep_pm_metrics_init);
-
-void kbasep_pm_metrics_term(struct kbase_device *kbdev)
-{
-#ifdef CONFIG_MALI_BIFROST_DVFS
-	unsigned long flags;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	spin_lock_irqsave(&kbdev->pm.backend.metrics.lock, flags);
-	kbdev->pm.backend.metrics.timer_active = false;
-	spin_unlock_irqrestore(&kbdev->pm.backend.metrics.lock, flags);
-
-	hrtimer_cancel(&kbdev->pm.backend.metrics.timer);
-#endif /* CONFIG_MALI_BIFROST_DVFS */
-}
-
-KBASE_EXPORT_TEST_API(kbasep_pm_metrics_term);
-
-/* caller needs to hold kbdev->pm.backend.metrics.lock before calling this
- * function
- */
-static void kbase_pm_get_dvfs_utilisation_calc(struct kbase_device *kbdev,
-								ktime_t now)
-{
-	ktime_t diff;
-
-	lockdep_assert_held(&kbdev->pm.backend.metrics.lock);
-
-	diff = ktime_sub(now, kbdev->pm.backend.metrics.time_period_start);
-	if (ktime_to_ns(diff) < 0)
-		return;
-
-	if (kbdev->pm.backend.metrics.gpu_active) {
-		u32 ns_time = (u32) (ktime_to_ns(diff) >> KBASE_PM_TIME_SHIFT);
-
-		kbdev->pm.backend.metrics.time_busy += ns_time;
-		if (kbdev->pm.backend.metrics.active_cl_ctx[0])
-			kbdev->pm.backend.metrics.busy_cl[0] += ns_time;
-		if (kbdev->pm.backend.metrics.active_cl_ctx[1])
-			kbdev->pm.backend.metrics.busy_cl[1] += ns_time;
-		if (kbdev->pm.backend.metrics.active_gl_ctx[0])
-			kbdev->pm.backend.metrics.busy_gl += ns_time;
-		if (kbdev->pm.backend.metrics.active_gl_ctx[1])
-			kbdev->pm.backend.metrics.busy_gl += ns_time;
-	} else {
-		kbdev->pm.backend.metrics.time_idle += (u32) (ktime_to_ns(diff)
-							>> KBASE_PM_TIME_SHIFT);
-	}
-
-	kbdev->pm.backend.metrics.time_period_start = now;
-}
-
-#if defined(CONFIG_MALI_BIFROST_DEVFREQ) || defined(CONFIG_MALI_BIFROST_DVFS)
-/* Caller needs to hold kbdev->pm.backend.metrics.lock before calling this
- * function.
- */
-static void kbase_pm_reset_dvfs_utilisation_unlocked(struct kbase_device *kbdev,
-								ktime_t now)
-{
-	/* Store previous value */
-	kbdev->pm.backend.metrics.prev_idle =
-					kbdev->pm.backend.metrics.time_idle;
-	kbdev->pm.backend.metrics.prev_busy =
-					kbdev->pm.backend.metrics.time_busy;
-
-	/* Reset current values */
-	kbdev->pm.backend.metrics.time_period_start = now;
-	kbdev->pm.backend.metrics.time_idle = 0;
-	kbdev->pm.backend.metrics.time_busy = 0;
-	kbdev->pm.backend.metrics.busy_cl[0] = 0;
-	kbdev->pm.backend.metrics.busy_cl[1] = 0;
-	kbdev->pm.backend.metrics.busy_gl = 0;
-}
-
-void kbase_pm_reset_dvfs_utilisation(struct kbase_device *kbdev)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&kbdev->pm.backend.metrics.lock, flags);
-	kbase_pm_reset_dvfs_utilisation_unlocked(kbdev, ktime_get());
-	spin_unlock_irqrestore(&kbdev->pm.backend.metrics.lock, flags);
-}
-
-void kbase_pm_get_dvfs_utilisation(struct kbase_device *kbdev,
-		unsigned long *total_out, unsigned long *busy_out)
-{
-	ktime_t now = ktime_get();
-	unsigned long flags, busy, total;
-
-	spin_lock_irqsave(&kbdev->pm.backend.metrics.lock, flags);
-	kbase_pm_get_dvfs_utilisation_calc(kbdev, now);
-
-	busy = kbdev->pm.backend.metrics.time_busy;
-	total = busy + kbdev->pm.backend.metrics.time_idle;
-
-	/* Reset stats if older than MALI_UTILIZATION_MAX_PERIOD (default
-	 * 100ms) */
-	if (total >= MALI_UTILIZATION_MAX_PERIOD) {
-		kbase_pm_reset_dvfs_utilisation_unlocked(kbdev, now);
-	} else if (total < (MALI_UTILIZATION_MAX_PERIOD / 2)) {
-		total += kbdev->pm.backend.metrics.prev_idle +
-				kbdev->pm.backend.metrics.prev_busy;
-		busy += kbdev->pm.backend.metrics.prev_busy;
-	}
-
-	*total_out = total;
-	*busy_out = busy;
-	spin_unlock_irqrestore(&kbdev->pm.backend.metrics.lock, flags);
-}
-#endif
-
-#ifdef CONFIG_MALI_BIFROST_DVFS
-
-/* caller needs to hold kbdev->pm.backend.metrics.lock before calling this
- * function
- */
-int kbase_pm_get_dvfs_utilisation_old(struct kbase_device *kbdev,
-					int *util_gl_share,
-					int util_cl_share[2],
-					ktime_t now)
-{
-	int utilisation;
-	int busy;
-
-	kbase_pm_get_dvfs_utilisation_calc(kbdev, now);
-
-	if (kbdev->pm.backend.metrics.time_idle +
-				kbdev->pm.backend.metrics.time_busy == 0) {
-		/* No data - so we return NOP */
-		utilisation = -1;
-		if (util_gl_share)
-			*util_gl_share = -1;
-		if (util_cl_share) {
-			util_cl_share[0] = -1;
-			util_cl_share[1] = -1;
-		}
-		goto out;
-	}
-
-	utilisation = (100 * kbdev->pm.backend.metrics.time_busy) /
-			(kbdev->pm.backend.metrics.time_idle +
-			 kbdev->pm.backend.metrics.time_busy);
-
-	busy = kbdev->pm.backend.metrics.busy_gl +
-		kbdev->pm.backend.metrics.busy_cl[0] +
-		kbdev->pm.backend.metrics.busy_cl[1];
-
-	if (busy != 0) {
-		if (util_gl_share)
-			*util_gl_share =
-				(100 * kbdev->pm.backend.metrics.busy_gl) /
-									busy;
-		if (util_cl_share) {
-			util_cl_share[0] =
-				(100 * kbdev->pm.backend.metrics.busy_cl[0]) /
-									busy;
-			util_cl_share[1] =
-				(100 * kbdev->pm.backend.metrics.busy_cl[1]) /
-									busy;
-		}
-	} else {
-		if (util_gl_share)
-			*util_gl_share = -1;
-		if (util_cl_share) {
-			util_cl_share[0] = -1;
-			util_cl_share[1] = -1;
-		}
-	}
-
-out:
-	return utilisation;
-}
-
-void kbase_pm_get_dvfs_action(struct kbase_device *kbdev)
-{
-	unsigned long flags;
-	int utilisation, util_gl_share;
-	int util_cl_share[2];
-	ktime_t now;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	spin_lock_irqsave(&kbdev->pm.backend.metrics.lock, flags);
-
-	now = ktime_get();
-
-	utilisation = kbase_pm_get_dvfs_utilisation_old(kbdev, &util_gl_share,
-			util_cl_share, now);
-
-	if (utilisation < 0 || util_gl_share < 0 || util_cl_share[0] < 0 ||
-							util_cl_share[1] < 0) {
-		utilisation = 0;
-		util_gl_share = 0;
-		util_cl_share[0] = 0;
-		util_cl_share[1] = 0;
-		goto out;
-	}
-
-out:
-#ifdef CONFIG_MALI_BIFROST_DVFS
-	kbase_platform_dvfs_event(kbdev, utilisation, util_gl_share,
-								util_cl_share);
-#endif				/*CONFIG_MALI_BIFROST_DVFS */
-
-	kbase_pm_reset_dvfs_utilisation_unlocked(kbdev, now);
-
-	spin_unlock_irqrestore(&kbdev->pm.backend.metrics.lock, flags);
-}
-
-bool kbase_pm_metrics_is_active(struct kbase_device *kbdev)
-{
-	bool isactive;
-	unsigned long flags;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	spin_lock_irqsave(&kbdev->pm.backend.metrics.lock, flags);
-	isactive = kbdev->pm.backend.metrics.timer_active;
-	spin_unlock_irqrestore(&kbdev->pm.backend.metrics.lock, flags);
-
-	return isactive;
-}
-KBASE_EXPORT_TEST_API(kbase_pm_metrics_is_active);
-
-#endif /* CONFIG_MALI_BIFROST_DVFS */
-
-/**
- * kbase_pm_metrics_active_calc - Update PM active counts based on currently
- *                                running atoms
- * @kbdev: Device pointer
- *
- * The caller must hold kbdev->pm.backend.metrics.lock
- */
-static void kbase_pm_metrics_active_calc(struct kbase_device *kbdev)
-{
-	int js;
-
-	lockdep_assert_held(&kbdev->pm.backend.metrics.lock);
-
-	kbdev->pm.backend.metrics.active_gl_ctx[0] = 0;
-	kbdev->pm.backend.metrics.active_gl_ctx[1] = 0;
-	kbdev->pm.backend.metrics.active_cl_ctx[0] = 0;
-	kbdev->pm.backend.metrics.active_cl_ctx[1] = 0;
-	kbdev->pm.backend.metrics.gpu_active = false;
-
-	for (js = 0; js < BASE_JM_MAX_NR_SLOTS; js++) {
-		struct kbase_jd_atom *katom = kbase_gpu_inspect(kbdev, js, 0);
-
-		/* Head atom may have just completed, so if it isn't running
-		 * then try the next atom */
-		if (katom && katom->gpu_rb_state != KBASE_ATOM_GPU_RB_SUBMITTED)
-			katom = kbase_gpu_inspect(kbdev, js, 1);
-
-		if (katom && katom->gpu_rb_state ==
-				KBASE_ATOM_GPU_RB_SUBMITTED) {
-			if (katom->core_req & BASE_JD_REQ_ONLY_COMPUTE) {
-				int device_nr = (katom->core_req &
-					BASE_JD_REQ_SPECIFIC_COHERENT_GROUP)
-						? katom->device_nr : 0;
-				if (!WARN_ON(device_nr >= 2))
-					kbdev->pm.backend.metrics.
-						active_cl_ctx[device_nr] = 1;
-			} else {
-				/* Slot 2 should not be running non-compute
-				 * atoms */
-				if (!WARN_ON(js >= 2))
-					kbdev->pm.backend.metrics.
-						active_gl_ctx[js] = 1;
-			}
-			kbdev->pm.backend.metrics.gpu_active = true;
-		}
-	}
-}
-
-/* called when job is submitted to or removed from a GPU slot */
-void kbase_pm_metrics_update(struct kbase_device *kbdev, ktime_t *timestamp)
-{
-	unsigned long flags;
-	ktime_t now;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	spin_lock_irqsave(&kbdev->pm.backend.metrics.lock, flags);
-
-	if (!timestamp) {
-		now = ktime_get();
-		timestamp = &now;
-	}
-
-	/* Track how long CL and/or GL jobs have been busy for */
-	kbase_pm_get_dvfs_utilisation_calc(kbdev, *timestamp);
-
-	kbase_pm_metrics_active_calc(kbdev);
-
-	spin_unlock_irqrestore(&kbdev->pm.backend.metrics.lock, flags);
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_policy.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_policy.c
deleted file mode 100644
index b98c68d9a42a..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_policy.c
+++ /dev/null
@@ -1,973 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * Power policy API implementations
- */
-
-#include <mali_kbase.h>
-#include <mali_midg_regmap.h>
-#include <mali_kbase_pm.h>
-#include <mali_kbase_config_defaults.h>
-#include <backend/gpu/mali_kbase_pm_internal.h>
-
-static const struct kbase_pm_policy *const policy_list[] = {
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-	&kbase_pm_always_on_policy_ops,
-	&kbase_pm_demand_policy_ops,
-	&kbase_pm_coarse_demand_policy_ops,
-#if !MALI_CUSTOMER_RELEASE
-	&kbase_pm_demand_always_powered_policy_ops,
-	&kbase_pm_fast_start_policy_ops,
-#endif
-#else				/* CONFIG_MALI_BIFROST_NO_MALI */
-#if !PLATFORM_POWER_DOWN_ONLY
-	&kbase_pm_demand_policy_ops,
-#endif /* !PLATFORM_POWER_DOWN_ONLY */
-	&kbase_pm_coarse_demand_policy_ops,
-	&kbase_pm_always_on_policy_ops,
-#if !MALI_CUSTOMER_RELEASE
-#if !PLATFORM_POWER_DOWN_ONLY
-	&kbase_pm_demand_always_powered_policy_ops,
-	&kbase_pm_fast_start_policy_ops,
-#endif /* !PLATFORM_POWER_DOWN_ONLY */
-#endif
-#endif /* CONFIG_MALI_BIFROST_NO_MALI */
-};
-
-/* The number of policies available in the system.
- * This is derived from the number of functions listed in policy_get_functions.
- */
-#define POLICY_COUNT (sizeof(policy_list)/sizeof(*policy_list))
-
-
-/* Function IDs for looking up Timeline Trace codes in
- * kbase_pm_change_state_trace_code */
-enum kbase_pm_func_id {
-	KBASE_PM_FUNC_ID_REQUEST_CORES_START,
-	KBASE_PM_FUNC_ID_REQUEST_CORES_END,
-	KBASE_PM_FUNC_ID_RELEASE_CORES_START,
-	KBASE_PM_FUNC_ID_RELEASE_CORES_END,
-	/* Note: kbase_pm_unrequest_cores() is on the slow path, and we neither
-	 * expect to hit it nor tend to hit it very much anyway. We can detect
-	 * whether we need more instrumentation by a difference between
-	 * PM_CHECKTRANS events and PM_SEND/HANDLE_EVENT. */
-
-	/* Must be the last */
-	KBASE_PM_FUNC_ID_COUNT
-};
-
-
-/* State changes during request/unrequest/release-ing cores */
-enum {
-	KBASE_PM_CHANGE_STATE_SHADER = (1u << 0),
-	KBASE_PM_CHANGE_STATE_TILER  = (1u << 1),
-
-	/* These two must be last */
-	KBASE_PM_CHANGE_STATE_MASK = (KBASE_PM_CHANGE_STATE_TILER |
-						KBASE_PM_CHANGE_STATE_SHADER),
-	KBASE_PM_CHANGE_STATE_COUNT = KBASE_PM_CHANGE_STATE_MASK + 1
-};
-typedef u32 kbase_pm_change_state;
-
-
-#ifdef CONFIG_MALI_BIFROST_TRACE_TIMELINE
-/* Timeline Trace code lookups for each function */
-static u32 kbase_pm_change_state_trace_code[KBASE_PM_FUNC_ID_COUNT]
-					[KBASE_PM_CHANGE_STATE_COUNT] = {
-	/* kbase_pm_request_cores */
-	[KBASE_PM_FUNC_ID_REQUEST_CORES_START][0] = 0,
-	[KBASE_PM_FUNC_ID_REQUEST_CORES_START][KBASE_PM_CHANGE_STATE_SHADER] =
-		SW_FLOW_PM_CHECKTRANS_PM_REQUEST_CORES_SHADER_START,
-	[KBASE_PM_FUNC_ID_REQUEST_CORES_START][KBASE_PM_CHANGE_STATE_TILER] =
-		SW_FLOW_PM_CHECKTRANS_PM_REQUEST_CORES_TILER_START,
-	[KBASE_PM_FUNC_ID_REQUEST_CORES_START][KBASE_PM_CHANGE_STATE_SHADER |
-						KBASE_PM_CHANGE_STATE_TILER] =
-		SW_FLOW_PM_CHECKTRANS_PM_REQUEST_CORES_SHADER_TILER_START,
-
-	[KBASE_PM_FUNC_ID_REQUEST_CORES_END][0] = 0,
-	[KBASE_PM_FUNC_ID_REQUEST_CORES_END][KBASE_PM_CHANGE_STATE_SHADER] =
-		SW_FLOW_PM_CHECKTRANS_PM_REQUEST_CORES_SHADER_END,
-	[KBASE_PM_FUNC_ID_REQUEST_CORES_END][KBASE_PM_CHANGE_STATE_TILER] =
-		SW_FLOW_PM_CHECKTRANS_PM_REQUEST_CORES_TILER_END,
-	[KBASE_PM_FUNC_ID_REQUEST_CORES_END][KBASE_PM_CHANGE_STATE_SHADER |
-						KBASE_PM_CHANGE_STATE_TILER] =
-		SW_FLOW_PM_CHECKTRANS_PM_REQUEST_CORES_SHADER_TILER_END,
-
-	/* kbase_pm_release_cores */
-	[KBASE_PM_FUNC_ID_RELEASE_CORES_START][0] = 0,
-	[KBASE_PM_FUNC_ID_RELEASE_CORES_START][KBASE_PM_CHANGE_STATE_SHADER] =
-		SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_SHADER_START,
-	[KBASE_PM_FUNC_ID_RELEASE_CORES_START][KBASE_PM_CHANGE_STATE_TILER] =
-		SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_TILER_START,
-	[KBASE_PM_FUNC_ID_RELEASE_CORES_START][KBASE_PM_CHANGE_STATE_SHADER |
-						KBASE_PM_CHANGE_STATE_TILER] =
-		SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_SHADER_TILER_START,
-
-	[KBASE_PM_FUNC_ID_RELEASE_CORES_END][0] = 0,
-	[KBASE_PM_FUNC_ID_RELEASE_CORES_END][KBASE_PM_CHANGE_STATE_SHADER] =
-		SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_SHADER_END,
-	[KBASE_PM_FUNC_ID_RELEASE_CORES_END][KBASE_PM_CHANGE_STATE_TILER] =
-		SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_TILER_END,
-	[KBASE_PM_FUNC_ID_RELEASE_CORES_END][KBASE_PM_CHANGE_STATE_SHADER |
-						KBASE_PM_CHANGE_STATE_TILER] =
-		SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_SHADER_TILER_END
-};
-
-static inline void kbase_timeline_pm_cores_func(struct kbase_device *kbdev,
-		enum kbase_pm_func_id func_id,
-		kbase_pm_change_state state)
-{
-	int trace_code;
-
-	KBASE_DEBUG_ASSERT(func_id >= 0 && func_id < KBASE_PM_FUNC_ID_COUNT);
-	KBASE_DEBUG_ASSERT(state != 0 && (state & KBASE_PM_CHANGE_STATE_MASK) ==
-									state);
-
-	trace_code = kbase_pm_change_state_trace_code[func_id][state];
-	KBASE_TIMELINE_PM_CHECKTRANS(kbdev, trace_code);
-}
-
-#else /* CONFIG_MALI_BIFROST_TRACE_TIMELINE */
-static inline void kbase_timeline_pm_cores_func(struct kbase_device *kbdev,
-		enum kbase_pm_func_id func_id, kbase_pm_change_state state)
-{
-}
-
-#endif /* CONFIG_MALI_BIFROST_TRACE_TIMELINE */
-
-/**
- * kbasep_pm_do_poweroff_cores - Process a poweroff request and power down any
- *                               requested shader cores
- * @kbdev: Device pointer
- */
-static void kbasep_pm_do_poweroff_cores(struct kbase_device *kbdev)
-{
-	u64 prev_shader_state = kbdev->pm.backend.desired_shader_state;
-	u64 prev_tiler_state = kbdev->pm.backend.desired_tiler_state;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	kbdev->pm.backend.desired_shader_state &=
-			~kbdev->pm.backend.shader_poweroff_pending;
-	kbdev->pm.backend.desired_tiler_state &=
-			~kbdev->pm.backend.tiler_poweroff_pending;
-
-	kbdev->pm.backend.shader_poweroff_pending = 0;
-	kbdev->pm.backend.tiler_poweroff_pending = 0;
-
-	if (prev_shader_state != kbdev->pm.backend.desired_shader_state ||
-			prev_tiler_state !=
-				kbdev->pm.backend.desired_tiler_state ||
-			kbdev->pm.backend.ca_in_transition) {
-		bool cores_are_available;
-
-		KBASE_TIMELINE_PM_CHECKTRANS(kbdev,
-			SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_DEFERRED_START);
-		cores_are_available = kbase_pm_check_transitions_nolock(kbdev);
-		KBASE_TIMELINE_PM_CHECKTRANS(kbdev,
-			SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_DEFERRED_END);
-
-		/* Don't need 'cores_are_available',
-		 * because we don't return anything */
-		CSTD_UNUSED(cores_are_available);
-	}
-}
-
-static enum hrtimer_restart
-kbasep_pm_do_gpu_poweroff_callback(struct hrtimer *timer)
-{
-	struct kbase_device *kbdev;
-	unsigned long flags;
-
-	kbdev = container_of(timer, struct kbase_device,
-						pm.backend.gpu_poweroff_timer);
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	/* It is safe for this call to do nothing if the work item is already
-	 * queued. The worker function will read the must up-to-date state of
-	 * kbdev->pm.backend.gpu_poweroff_pending under lock.
-	 *
-	 * If a state change occurs while the worker function is processing,
-	 * this call will succeed as a work item can be requeued once it has
-	 * started processing.
-	 */
-	if (kbdev->pm.backend.gpu_poweroff_pending)
-		queue_work(kbdev->pm.backend.gpu_poweroff_wq,
-					&kbdev->pm.backend.gpu_poweroff_work);
-
-	if (kbdev->pm.backend.shader_poweroff_pending ||
-			kbdev->pm.backend.tiler_poweroff_pending) {
-		kbdev->pm.backend.shader_poweroff_pending_time--;
-
-		KBASE_DEBUG_ASSERT(
-				kbdev->pm.backend.shader_poweroff_pending_time
-									>= 0);
-
-		if (!kbdev->pm.backend.shader_poweroff_pending_time)
-			kbasep_pm_do_poweroff_cores(kbdev);
-	}
-
-	if (kbdev->pm.backend.poweroff_timer_needed) {
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-		hrtimer_add_expires(timer, kbdev->pm.gpu_poweroff_time);
-
-		return HRTIMER_RESTART;
-	}
-
-	kbdev->pm.backend.poweroff_timer_running = false;
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	return HRTIMER_NORESTART;
-}
-
-static void kbasep_pm_do_gpu_poweroff_wq(struct work_struct *data)
-{
-	unsigned long flags;
-	struct kbase_device *kbdev;
-	bool do_poweroff = false;
-
-	kbdev = container_of(data, struct kbase_device,
-						pm.backend.gpu_poweroff_work);
-
-	mutex_lock(&kbdev->pm.lock);
-
-	if (kbdev->pm.backend.gpu_poweroff_pending == 0) {
-		mutex_unlock(&kbdev->pm.lock);
-		return;
-	}
-
-	kbdev->pm.backend.gpu_poweroff_pending--;
-
-	if (kbdev->pm.backend.gpu_poweroff_pending > 0) {
-		mutex_unlock(&kbdev->pm.lock);
-		return;
-	}
-
-	KBASE_DEBUG_ASSERT(kbdev->pm.backend.gpu_poweroff_pending == 0);
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	/* Only power off the GPU if a request is still pending */
-	if (!kbdev->pm.backend.pm_current_policy->get_core_active(kbdev))
-		do_poweroff = true;
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	if (do_poweroff) {
-		kbdev->pm.backend.poweroff_timer_needed = false;
-		hrtimer_cancel(&kbdev->pm.backend.gpu_poweroff_timer);
-		kbdev->pm.backend.poweroff_timer_running = false;
-
-		/* Power off the GPU */
-		kbase_pm_do_poweroff(kbdev, false);
-	}
-
-	mutex_unlock(&kbdev->pm.lock);
-}
-
-int kbase_pm_policy_init(struct kbase_device *kbdev)
-{
-	struct workqueue_struct *wq;
-
-	wq = alloc_workqueue("kbase_pm_do_poweroff",
-			WQ_HIGHPRI | WQ_UNBOUND, 1);
-	if (!wq)
-		return -ENOMEM;
-
-	kbdev->pm.backend.gpu_poweroff_wq = wq;
-	INIT_WORK(&kbdev->pm.backend.gpu_poweroff_work,
-			kbasep_pm_do_gpu_poweroff_wq);
-	hrtimer_init(&kbdev->pm.backend.gpu_poweroff_timer,
-			CLOCK_MONOTONIC, HRTIMER_MODE_REL);
-	kbdev->pm.backend.gpu_poweroff_timer.function =
-			kbasep_pm_do_gpu_poweroff_callback;
-	kbdev->pm.backend.pm_current_policy = policy_list[0];
-	kbdev->pm.backend.pm_current_policy->init(kbdev);
-	kbdev->pm.gpu_poweroff_time =
-			HR_TIMER_DELAY_NSEC(DEFAULT_PM_GPU_POWEROFF_TICK_NS);
-	kbdev->pm.poweroff_shader_ticks = DEFAULT_PM_POWEROFF_TICK_SHADER;
-	kbdev->pm.poweroff_gpu_ticks = DEFAULT_PM_POWEROFF_TICK_GPU;
-
-	return 0;
-}
-
-void kbase_pm_policy_term(struct kbase_device *kbdev)
-{
-	kbdev->pm.backend.pm_current_policy->term(kbdev);
-	destroy_workqueue(kbdev->pm.backend.gpu_poweroff_wq);
-}
-
-void kbase_pm_cancel_deferred_poweroff(struct kbase_device *kbdev)
-{
-	unsigned long flags;
-
-	lockdep_assert_held(&kbdev->pm.lock);
-
-	kbdev->pm.backend.poweroff_timer_needed = false;
-	hrtimer_cancel(&kbdev->pm.backend.gpu_poweroff_timer);
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	kbdev->pm.backend.poweroff_timer_running = false;
-
-	/* If wq is already running but is held off by pm.lock, make sure it has
-	 * no effect */
-	kbdev->pm.backend.gpu_poweroff_pending = 0;
-
-	kbdev->pm.backend.shader_poweroff_pending = 0;
-	kbdev->pm.backend.tiler_poweroff_pending = 0;
-	kbdev->pm.backend.shader_poweroff_pending_time = 0;
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-}
-
-void kbase_pm_update_active(struct kbase_device *kbdev)
-{
-	struct kbase_pm_device_data *pm = &kbdev->pm;
-	struct kbase_pm_backend_data *backend = &pm->backend;
-	unsigned long flags;
-	bool active;
-
-	lockdep_assert_held(&pm->lock);
-
-	/* pm_current_policy will never be NULL while pm.lock is held */
-	KBASE_DEBUG_ASSERT(backend->pm_current_policy);
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	active = backend->pm_current_policy->get_core_active(kbdev);
-
-	if (active) {
-		if (backend->gpu_poweroff_pending) {
-			/* Cancel any pending power off request */
-			backend->gpu_poweroff_pending = 0;
-
-			/* If a request was pending then the GPU was still
-			 * powered, so no need to continue */
-			if (!kbdev->poweroff_pending) {
-				spin_unlock_irqrestore(&kbdev->hwaccess_lock,
-						flags);
-				return;
-			}
-		}
-
-		if (!backend->poweroff_timer_running && !backend->gpu_powered &&
-				(pm->poweroff_gpu_ticks ||
-				pm->poweroff_shader_ticks)) {
-			backend->poweroff_timer_needed = true;
-			backend->poweroff_timer_running = true;
-			hrtimer_start(&backend->gpu_poweroff_timer,
-					pm->gpu_poweroff_time,
-					HRTIMER_MODE_REL);
-		}
-
-		/* Power on the GPU and any cores requested by the policy */
-		if (pm->backend.poweroff_wait_in_progress) {
-			pm->backend.poweron_required = true;
-			spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-		} else {
-			spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-			kbase_pm_do_poweron(kbdev, false);
-		}
-	} else {
-		/* It is an error for the power policy to power off the GPU
-		 * when there are contexts active */
-		KBASE_DEBUG_ASSERT(pm->active_count == 0);
-
-		if (backend->shader_poweroff_pending ||
-				backend->tiler_poweroff_pending) {
-			backend->shader_poweroff_pending = 0;
-			backend->tiler_poweroff_pending = 0;
-			backend->shader_poweroff_pending_time = 0;
-		}
-
-		/* Request power off */
-		if (pm->backend.gpu_powered) {
-			if (pm->poweroff_gpu_ticks) {
-				backend->gpu_poweroff_pending =
-						pm->poweroff_gpu_ticks;
-				backend->poweroff_timer_needed = true;
-				if (!backend->poweroff_timer_running) {
-					/* Start timer if not running (eg if
-					 * power policy has been changed from
-					 * always_on to something else). This
-					 * will ensure the GPU is actually
-					 * powered off */
-					backend->poweroff_timer_running
-							= true;
-					hrtimer_start(
-						&backend->gpu_poweroff_timer,
-						pm->gpu_poweroff_time,
-						HRTIMER_MODE_REL);
-				}
-				spin_unlock_irqrestore(&kbdev->hwaccess_lock,
-						flags);
-			} else {
-				spin_unlock_irqrestore(&kbdev->hwaccess_lock,
-						flags);
-
-				/* Power off the GPU immediately */
-				kbase_pm_do_poweroff(kbdev, false);
-			}
-		} else {
-			spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-		}
-	}
-}
-
-void kbase_pm_update_cores_state_nolock(struct kbase_device *kbdev)
-{
-	u64 desired_bitmap;
-	u64 desired_tiler_bitmap;
-	bool cores_are_available;
-	bool do_poweroff = false;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	if (kbdev->pm.backend.pm_current_policy == NULL)
-		return;
-	if (kbdev->pm.backend.poweroff_wait_in_progress)
-		return;
-
-	if (kbdev->protected_mode_transition &&	!kbdev->shader_needed_bitmap &&
-			!kbdev->shader_inuse_bitmap && !kbdev->tiler_needed_cnt
-			&& !kbdev->tiler_inuse_cnt) {
-		/* We are trying to change in/out of protected mode - force all
-		 * cores off so that the L2 powers down */
-		desired_bitmap = 0;
-		desired_tiler_bitmap = 0;
-	} else {
-		desired_bitmap =
-		kbdev->pm.backend.pm_current_policy->get_core_mask(kbdev);
-		desired_bitmap &= kbase_pm_ca_get_core_mask(kbdev);
-
-		if (kbdev->tiler_needed_cnt > 0 || kbdev->tiler_inuse_cnt > 0)
-			desired_tiler_bitmap = 1;
-		else
-			desired_tiler_bitmap = 0;
-
-		if (!kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_XAFFINITY)) {
-			/* Unless XAFFINITY is supported, enable core 0 if tiler
-			 * required, regardless of core availability */
-			if (kbdev->tiler_needed_cnt > 0 ||
-					kbdev->tiler_inuse_cnt > 0)
-				desired_bitmap |= 1;
-		}
-	}
-
-	if (kbdev->pm.backend.desired_shader_state != desired_bitmap)
-		KBASE_TRACE_ADD(kbdev, PM_CORES_CHANGE_DESIRED, NULL, NULL, 0u,
-							(u32)desired_bitmap);
-	/* Are any cores being powered on? */
-	if (~kbdev->pm.backend.desired_shader_state & desired_bitmap ||
-	    ~kbdev->pm.backend.desired_tiler_state & desired_tiler_bitmap ||
-	    kbdev->pm.backend.ca_in_transition) {
-		/* Check if we are powering off any cores before updating shader
-		 * state */
-		if (kbdev->pm.backend.desired_shader_state & ~desired_bitmap ||
-				kbdev->pm.backend.desired_tiler_state &
-				~desired_tiler_bitmap) {
-			/* Start timer to power off cores */
-			kbdev->pm.backend.shader_poweroff_pending |=
-				(kbdev->pm.backend.desired_shader_state &
-							~desired_bitmap);
-			kbdev->pm.backend.tiler_poweroff_pending |=
-				(kbdev->pm.backend.desired_tiler_state &
-							~desired_tiler_bitmap);
-
-			if (kbdev->pm.poweroff_shader_ticks &&
-					!kbdev->protected_mode_transition)
-				kbdev->pm.backend.shader_poweroff_pending_time =
-						kbdev->pm.poweroff_shader_ticks;
-			else
-				do_poweroff = true;
-		}
-
-		kbdev->pm.backend.desired_shader_state = desired_bitmap;
-		kbdev->pm.backend.desired_tiler_state = desired_tiler_bitmap;
-
-		/* If any cores are being powered on, transition immediately */
-		cores_are_available = kbase_pm_check_transitions_nolock(kbdev);
-	} else if (kbdev->pm.backend.desired_shader_state & ~desired_bitmap ||
-				kbdev->pm.backend.desired_tiler_state &
-				~desired_tiler_bitmap) {
-		/* Start timer to power off cores */
-		kbdev->pm.backend.shader_poweroff_pending |=
-				(kbdev->pm.backend.desired_shader_state &
-							~desired_bitmap);
-		kbdev->pm.backend.tiler_poweroff_pending |=
-				(kbdev->pm.backend.desired_tiler_state &
-							~desired_tiler_bitmap);
-		if (kbdev->pm.poweroff_shader_ticks &&
-				!kbdev->protected_mode_transition)
-			kbdev->pm.backend.shader_poweroff_pending_time =
-					kbdev->pm.poweroff_shader_ticks;
-		else
-			kbasep_pm_do_poweroff_cores(kbdev);
-	} else if (kbdev->pm.active_count == 0 && desired_bitmap != 0 &&
-			desired_tiler_bitmap != 0 &&
-			kbdev->pm.backend.poweroff_timer_needed) {
-		/* If power policy is keeping cores on despite there being no
-		 * active contexts then disable poweroff timer as it isn't
-		 * required.
-		 * Only reset poweroff_timer_needed if we're not in the middle
-		 * of the power off callback */
-		kbdev->pm.backend.poweroff_timer_needed = false;
-	}
-
-	/* Ensure timer does not power off wanted cores and make sure to power
-	 * off unwanted cores */
-	if (kbdev->pm.backend.shader_poweroff_pending ||
-			kbdev->pm.backend.tiler_poweroff_pending) {
-		kbdev->pm.backend.shader_poweroff_pending &=
-				~(kbdev->pm.backend.desired_shader_state &
-								desired_bitmap);
-		kbdev->pm.backend.tiler_poweroff_pending &=
-				~(kbdev->pm.backend.desired_tiler_state &
-				desired_tiler_bitmap);
-
-		if (!kbdev->pm.backend.shader_poweroff_pending &&
-				!kbdev->pm.backend.tiler_poweroff_pending)
-			kbdev->pm.backend.shader_poweroff_pending_time = 0;
-	}
-
-	/* Shader poweroff is deferred to the end of the function, to eliminate
-	 * issues caused by the core availability policy recursing into this
-	 * function */
-	if (do_poweroff)
-		kbasep_pm_do_poweroff_cores(kbdev);
-
-	/* Don't need 'cores_are_available', because we don't return anything */
-	CSTD_UNUSED(cores_are_available);
-}
-
-void kbase_pm_update_cores_state(struct kbase_device *kbdev)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	kbase_pm_update_cores_state_nolock(kbdev);
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-}
-
-int kbase_pm_list_policies(const struct kbase_pm_policy * const **list)
-{
-	if (!list)
-		return POLICY_COUNT;
-
-	*list = policy_list;
-
-	return POLICY_COUNT;
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_list_policies);
-
-const struct kbase_pm_policy *kbase_pm_get_policy(struct kbase_device *kbdev)
-{
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	return kbdev->pm.backend.pm_current_policy;
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_get_policy);
-
-void kbase_pm_set_policy(struct kbase_device *kbdev,
-				const struct kbase_pm_policy *new_policy)
-{
-	struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
-	const struct kbase_pm_policy *old_policy;
-	unsigned long flags;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(new_policy != NULL);
-
-	KBASE_TRACE_ADD(kbdev, PM_SET_POLICY, NULL, NULL, 0u, new_policy->id);
-
-	/* During a policy change we pretend the GPU is active */
-	/* A suspend won't happen here, because we're in a syscall from a
-	 * userspace thread */
-	kbase_pm_context_active(kbdev);
-
-	mutex_lock(&js_devdata->runpool_mutex);
-	mutex_lock(&kbdev->pm.lock);
-
-	/* Remove the policy to prevent IRQ handlers from working on it */
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	old_policy = kbdev->pm.backend.pm_current_policy;
-	kbdev->pm.backend.pm_current_policy = NULL;
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	KBASE_TRACE_ADD(kbdev, PM_CURRENT_POLICY_TERM, NULL, NULL, 0u,
-								old_policy->id);
-	if (old_policy->term)
-		old_policy->term(kbdev);
-
-	KBASE_TRACE_ADD(kbdev, PM_CURRENT_POLICY_INIT, NULL, NULL, 0u,
-								new_policy->id);
-	if (new_policy->init)
-		new_policy->init(kbdev);
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	kbdev->pm.backend.pm_current_policy = new_policy;
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	/* If any core power state changes were previously attempted, but
-	 * couldn't be made because the policy was changing (current_policy was
-	 * NULL), then re-try them here. */
-	kbase_pm_update_active(kbdev);
-	kbase_pm_update_cores_state(kbdev);
-
-	mutex_unlock(&kbdev->pm.lock);
-	mutex_unlock(&js_devdata->runpool_mutex);
-
-	/* Now the policy change is finished, we release our fake context active
-	 * reference */
-	kbase_pm_context_idle(kbdev);
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_set_policy);
-
-/* Check whether a state change has finished, and trace it as completed */
-static void
-kbase_pm_trace_check_and_finish_state_change(struct kbase_device *kbdev)
-{
-	if ((kbdev->shader_available_bitmap &
-					kbdev->pm.backend.desired_shader_state)
-				== kbdev->pm.backend.desired_shader_state &&
-		(kbdev->tiler_available_bitmap &
-					kbdev->pm.backend.desired_tiler_state)
-				== kbdev->pm.backend.desired_tiler_state)
-		kbase_timeline_pm_check_handle_event(kbdev,
-				KBASE_TIMELINE_PM_EVENT_GPU_STATE_CHANGED);
-}
-
-void kbase_pm_request_cores(struct kbase_device *kbdev,
-				bool tiler_required, u64 shader_cores)
-{
-	u64 cores;
-
-	kbase_pm_change_state change_gpu_state = 0u;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	cores = shader_cores;
-	while (cores) {
-		int bitnum = fls64(cores) - 1;
-		u64 bit = 1ULL << bitnum;
-
-		/* It should be almost impossible for this to overflow. It would
-		 * require 2^32 atoms to request a particular core, which would
-		 * require 2^24 contexts to submit. This would require an amount
-		 * of memory that is impossible on a 32-bit system and extremely
-		 * unlikely on a 64-bit system. */
-		int cnt = ++kbdev->shader_needed_cnt[bitnum];
-
-		if (1 == cnt) {
-			kbdev->shader_needed_bitmap |= bit;
-			change_gpu_state |= KBASE_PM_CHANGE_STATE_SHADER;
-		}
-
-		cores &= ~bit;
-	}
-
-	if (tiler_required) {
-		int cnt = ++kbdev->tiler_needed_cnt;
-
-		if (1 == cnt)
-			change_gpu_state |= KBASE_PM_CHANGE_STATE_TILER;
-
-		KBASE_DEBUG_ASSERT(kbdev->tiler_needed_cnt != 0);
-	}
-
-	if (change_gpu_state) {
-		KBASE_TRACE_ADD(kbdev, PM_REQUEST_CHANGE_SHADER_NEEDED, NULL,
-				NULL, 0u, (u32) kbdev->shader_needed_bitmap);
-
-		kbase_timeline_pm_cores_func(kbdev,
-					KBASE_PM_FUNC_ID_REQUEST_CORES_START,
-							change_gpu_state);
-		kbase_pm_update_cores_state_nolock(kbdev);
-		kbase_timeline_pm_cores_func(kbdev,
-					KBASE_PM_FUNC_ID_REQUEST_CORES_END,
-							change_gpu_state);
-	}
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_request_cores);
-
-void kbase_pm_unrequest_cores(struct kbase_device *kbdev,
-				bool tiler_required, u64 shader_cores)
-{
-	kbase_pm_change_state change_gpu_state = 0u;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	while (shader_cores) {
-		int bitnum = fls64(shader_cores) - 1;
-		u64 bit = 1ULL << bitnum;
-		int cnt;
-
-		KBASE_DEBUG_ASSERT(kbdev->shader_needed_cnt[bitnum] > 0);
-
-		cnt = --kbdev->shader_needed_cnt[bitnum];
-
-		if (0 == cnt) {
-			kbdev->shader_needed_bitmap &= ~bit;
-
-			change_gpu_state |= KBASE_PM_CHANGE_STATE_SHADER;
-		}
-
-		shader_cores &= ~bit;
-	}
-
-	if (tiler_required) {
-		int cnt;
-
-		KBASE_DEBUG_ASSERT(kbdev->tiler_needed_cnt > 0);
-
-		cnt = --kbdev->tiler_needed_cnt;
-
-		if (0 == cnt)
-			change_gpu_state |= KBASE_PM_CHANGE_STATE_TILER;
-	}
-
-	if (change_gpu_state) {
-		KBASE_TRACE_ADD(kbdev, PM_UNREQUEST_CHANGE_SHADER_NEEDED, NULL,
-				NULL, 0u, (u32) kbdev->shader_needed_bitmap);
-
-		kbase_pm_update_cores_state_nolock(kbdev);
-
-		/* Trace that any state change effectively completes immediately
-		 * - no-one will wait on the state change */
-		kbase_pm_trace_check_and_finish_state_change(kbdev);
-	}
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_unrequest_cores);
-
-enum kbase_pm_cores_ready
-kbase_pm_register_inuse_cores(struct kbase_device *kbdev,
-				bool tiler_required, u64 shader_cores)
-{
-	u64 prev_shader_needed;	/* Just for tracing */
-	u64 prev_shader_inuse;	/* Just for tracing */
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	prev_shader_needed = kbdev->shader_needed_bitmap;
-	prev_shader_inuse = kbdev->shader_inuse_bitmap;
-
-	/* If desired_shader_state does not contain the requested cores, then
-	 * power management is not attempting to powering those cores (most
-	 * likely due to core availability policy) and a new job affinity must
-	 * be chosen */
-	if ((kbdev->pm.backend.desired_shader_state & shader_cores) !=
-							shader_cores) {
-		return (kbdev->pm.backend.poweroff_wait_in_progress ||
-				kbdev->pm.backend.pm_current_policy == NULL) ?
-				KBASE_CORES_NOT_READY : KBASE_NEW_AFFINITY;
-	}
-
-	if ((kbdev->shader_available_bitmap & shader_cores) != shader_cores ||
-	    (tiler_required && !kbdev->tiler_available_bitmap)) {
-		/* Trace ongoing core transition */
-		kbase_timeline_pm_l2_transition_start(kbdev);
-		return KBASE_CORES_NOT_READY;
-	}
-
-	/* If we started to trace a state change, then trace it has being
-	 * finished by now, at the very latest */
-	kbase_pm_trace_check_and_finish_state_change(kbdev);
-	/* Trace core transition done */
-	kbase_timeline_pm_l2_transition_done(kbdev);
-
-	while (shader_cores) {
-		int bitnum = fls64(shader_cores) - 1;
-		u64 bit = 1ULL << bitnum;
-		int cnt;
-
-		KBASE_DEBUG_ASSERT(kbdev->shader_needed_cnt[bitnum] > 0);
-
-		cnt = --kbdev->shader_needed_cnt[bitnum];
-
-		if (0 == cnt)
-			kbdev->shader_needed_bitmap &= ~bit;
-
-		/* shader_inuse_cnt should not overflow because there can only
-		 * be a very limited number of jobs on the h/w at one time */
-
-		kbdev->shader_inuse_cnt[bitnum]++;
-		kbdev->shader_inuse_bitmap |= bit;
-
-		shader_cores &= ~bit;
-	}
-
-	if (tiler_required) {
-		KBASE_DEBUG_ASSERT(kbdev->tiler_needed_cnt > 0);
-
-		--kbdev->tiler_needed_cnt;
-
-		kbdev->tiler_inuse_cnt++;
-
-		KBASE_DEBUG_ASSERT(kbdev->tiler_inuse_cnt != 0);
-	}
-
-	if (prev_shader_needed != kbdev->shader_needed_bitmap)
-		KBASE_TRACE_ADD(kbdev, PM_REGISTER_CHANGE_SHADER_NEEDED, NULL,
-				NULL, 0u, (u32) kbdev->shader_needed_bitmap);
-
-	if (prev_shader_inuse != kbdev->shader_inuse_bitmap)
-		KBASE_TRACE_ADD(kbdev, PM_REGISTER_CHANGE_SHADER_INUSE, NULL,
-				NULL, 0u, (u32) kbdev->shader_inuse_bitmap);
-
-	return KBASE_CORES_READY;
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_register_inuse_cores);
-
-void kbase_pm_release_cores(struct kbase_device *kbdev,
-				bool tiler_required, u64 shader_cores)
-{
-	kbase_pm_change_state change_gpu_state = 0u;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	while (shader_cores) {
-		int bitnum = fls64(shader_cores) - 1;
-		u64 bit = 1ULL << bitnum;
-		int cnt;
-
-		KBASE_DEBUG_ASSERT(kbdev->shader_inuse_cnt[bitnum] > 0);
-
-		cnt = --kbdev->shader_inuse_cnt[bitnum];
-
-		if (0 == cnt) {
-			kbdev->shader_inuse_bitmap &= ~bit;
-			change_gpu_state |= KBASE_PM_CHANGE_STATE_SHADER;
-		}
-
-		shader_cores &= ~bit;
-	}
-
-	if (tiler_required) {
-		int cnt;
-
-		KBASE_DEBUG_ASSERT(kbdev->tiler_inuse_cnt > 0);
-
-		cnt = --kbdev->tiler_inuse_cnt;
-
-		if (0 == cnt)
-			change_gpu_state |= KBASE_PM_CHANGE_STATE_TILER;
-	}
-
-	if (change_gpu_state) {
-		KBASE_TRACE_ADD(kbdev, PM_RELEASE_CHANGE_SHADER_INUSE, NULL,
-				NULL, 0u, (u32) kbdev->shader_inuse_bitmap);
-
-		kbase_timeline_pm_cores_func(kbdev,
-					KBASE_PM_FUNC_ID_RELEASE_CORES_START,
-							change_gpu_state);
-		kbase_pm_update_cores_state_nolock(kbdev);
-		kbase_timeline_pm_cores_func(kbdev,
-					KBASE_PM_FUNC_ID_RELEASE_CORES_END,
-							change_gpu_state);
-
-		/* Trace that any state change completed immediately */
-		kbase_pm_trace_check_and_finish_state_change(kbdev);
-	}
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_release_cores);
-
-void kbase_pm_request_cores_sync(struct kbase_device *kbdev,
-					bool tiler_required,
-					u64 shader_cores)
-{
-	unsigned long flags;
-
-	kbase_pm_wait_for_poweroff_complete(kbdev);
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	kbase_pm_request_cores(kbdev, tiler_required, shader_cores);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	kbase_pm_check_transitions_sync(kbdev);
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_request_cores_sync);
-
-void kbase_pm_request_l2_caches(struct kbase_device *kbdev)
-{
-	unsigned long flags;
-	u32 prior_l2_users_count;
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	prior_l2_users_count = kbdev->l2_users_count++;
-
-	KBASE_DEBUG_ASSERT(kbdev->l2_users_count != 0);
-
-	/* if the GPU is reset while the l2 is on, l2 will be off but
-	 * prior_l2_users_count will be > 0. l2_available_bitmap will have been
-	 * set to 0 though by kbase_pm_init_hw */
-	if (!prior_l2_users_count || !kbdev->l2_available_bitmap)
-		kbase_pm_check_transitions_nolock(kbdev);
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-	wait_event(kbdev->pm.backend.l2_powered_wait,
-					kbdev->pm.backend.l2_powered == 1);
-
-	/* Trace that any state change completed immediately */
-	kbase_pm_trace_check_and_finish_state_change(kbdev);
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_request_l2_caches);
-
-void kbase_pm_request_l2_caches_l2_is_on(struct kbase_device *kbdev)
-{
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	kbdev->l2_users_count++;
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_request_l2_caches_l2_is_on);
-
-void kbase_pm_release_l2_caches(struct kbase_device *kbdev)
-{
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	KBASE_DEBUG_ASSERT(kbdev->l2_users_count > 0);
-
-	--kbdev->l2_users_count;
-
-	if (!kbdev->l2_users_count) {
-		kbase_pm_check_transitions_nolock(kbdev);
-		/* Trace that any state change completed immediately */
-		kbase_pm_trace_check_and_finish_state_change(kbdev);
-	}
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_release_l2_caches);
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_policy.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_policy.h
deleted file mode 100644
index 611a90e66e65..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_pm_policy.h
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * Power policy API definitions
- */
-
-#ifndef _KBASE_PM_POLICY_H_
-#define _KBASE_PM_POLICY_H_
-
-/**
- * kbase_pm_policy_init - Initialize power policy framework
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- *
- * Must be called before calling any other policy function
- *
- * Return: 0 if the power policy framework was successfully
- *         initialized, -errno otherwise.
- */
-int kbase_pm_policy_init(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_policy_term - Terminate power policy framework
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_policy_term(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_update_active - Update the active power state of the GPU
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- *
- * Calls into the current power policy
- */
-void kbase_pm_update_active(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_update_cores - Update the desired core state of the GPU
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- *
- * Calls into the current power policy
- */
-void kbase_pm_update_cores(struct kbase_device *kbdev);
-
-
-enum kbase_pm_cores_ready {
-	KBASE_CORES_NOT_READY = 0,
-	KBASE_NEW_AFFINITY = 1,
-	KBASE_CORES_READY = 2
-};
-
-
-/**
- * kbase_pm_request_cores_sync - Synchronous variant of kbase_pm_request_cores()
- *
- * @kbdev:          The kbase device structure for the device
- * @tiler_required: true if the tiler is required, false otherwise
- * @shader_cores:   A bitmask of shader cores which are necessary for the job
- *
- * When this function returns, the @shader_cores will be in the READY state.
- *
- * This is safe variant of kbase_pm_check_transitions_sync(): it handles the
- * work of ensuring the requested cores will remain powered until a matching
- * call to kbase_pm_unrequest_cores()/kbase_pm_release_cores() (as appropriate)
- * is made.
- */
-void kbase_pm_request_cores_sync(struct kbase_device *kbdev,
-				bool tiler_required, u64 shader_cores);
-
-/**
- * kbase_pm_request_cores - Mark one or more cores as being required
- *                          for jobs to be submitted
- *
- * @kbdev:          The kbase device structure for the device
- * @tiler_required: true if the tiler is required, false otherwise
- * @shader_cores:   A bitmask of shader cores which are necessary for the job
- *
- * This function is called by the job scheduler to mark one or more cores as
- * being required to submit jobs that are ready to run.
- *
- * The cores requested are reference counted and a subsequent call to
- * kbase_pm_register_inuse_cores() or kbase_pm_unrequest_cores() should be
- * made to dereference the cores as being 'needed'.
- *
- * The active power policy will meet or exceed the requirements of the
- * requested cores in the system. Any core transitions needed will be begun
- * immediately, but they might not complete/the cores might not be available
- * until a Power Management IRQ.
- *
- * Return: 0 if the cores were successfully requested, or -errno otherwise.
- */
-void kbase_pm_request_cores(struct kbase_device *kbdev,
-				bool tiler_required, u64 shader_cores);
-
-/**
- * kbase_pm_unrequest_cores - Unmark one or more cores as being required for
- *                            jobs to be submitted.
- *
- * @kbdev:          The kbase device structure for the device
- * @tiler_required: true if the tiler is required, false otherwise
- * @shader_cores:   A bitmask of shader cores (as given to
- *                  kbase_pm_request_cores() )
- *
- * This function undoes the effect of kbase_pm_request_cores(). It should be
- * used when a job is not going to be submitted to the hardware (e.g. the job is
- * cancelled before it is enqueued).
- *
- * The active power policy will meet or exceed the requirements of the
- * requested cores in the system. Any core transitions needed will be begun
- * immediately, but they might not complete until a Power Management IRQ.
- *
- * The policy may use this as an indication that it can power down cores.
- */
-void kbase_pm_unrequest_cores(struct kbase_device *kbdev,
-				bool tiler_required, u64 shader_cores);
-
-/**
- * kbase_pm_register_inuse_cores - Register a set of cores as in use by a job
- *
- * @kbdev:          The kbase device structure for the device
- * @tiler_required: true if the tiler is required, false otherwise
- * @shader_cores:   A bitmask of shader cores (as given to
- *                  kbase_pm_request_cores() )
- *
- * This function should be called after kbase_pm_request_cores() when the job
- * is about to be submitted to the hardware. It will check that the necessary
- * cores are available and if so update the 'needed' and 'inuse' bitmasks to
- * reflect that the job is now committed to being run.
- *
- * If the necessary cores are not currently available then the function will
- * return %KBASE_CORES_NOT_READY and have no effect.
- *
- * Return: %KBASE_CORES_NOT_READY if the cores are not immediately ready,
- *
- *         %KBASE_NEW_AFFINITY if the affinity requested is not allowed,
- *
- *         %KBASE_CORES_READY if the cores requested are already available
- */
-enum kbase_pm_cores_ready kbase_pm_register_inuse_cores(
-						struct kbase_device *kbdev,
-						bool tiler_required,
-						u64 shader_cores);
-
-/**
- * kbase_pm_release_cores - Release cores after a job has run
- *
- * @kbdev:          The kbase device structure for the device
- * @tiler_required: true if the tiler is required, false otherwise
- * @shader_cores:   A bitmask of shader cores (as given to
- *                  kbase_pm_register_inuse_cores() )
- *
- * This function should be called when a job has finished running on the
- * hardware. A call to kbase_pm_register_inuse_cores() must have previously
- * occurred. The reference counts of the specified cores will be decremented
- * which may cause the bitmask of 'inuse' cores to be reduced. The power policy
- * may then turn off any cores which are no longer 'inuse'.
- */
-void kbase_pm_release_cores(struct kbase_device *kbdev,
-				bool tiler_required, u64 shader_cores);
-
-/**
- * kbase_pm_request_l2_caches - Request l2 caches
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- *
- * Request the use of l2 caches for all core groups, power up, wait and prevent
- * the power manager from powering down the l2 caches.
- *
- * This tells the power management that the caches should be powered up, and
- * they should remain powered, irrespective of the usage of shader cores. This
- * does not return until the l2 caches are powered up.
- *
- * The caller must call kbase_pm_release_l2_caches() when they are finished
- * to allow normal power management of the l2 caches to resume.
- *
- * This should only be used when power management is active.
- */
-void kbase_pm_request_l2_caches(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_request_l2_caches_l2_is_on - Request l2 caches but don't power on
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- *
- * Increment the count of l2 users but do not attempt to power on the l2
- *
- * It is the callers responsibility to ensure that the l2 is already powered up
- * and to eventually call kbase_pm_release_l2_caches()
- */
-void kbase_pm_request_l2_caches_l2_is_on(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_request_l2_caches - Release l2 caches
- *
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- *
- * Release the use of l2 caches for all core groups and allow the power manager
- * to power them down when necessary.
- *
- * This tells the power management that the caches can be powered down if
- * necessary, with respect to the usage of shader cores.
- *
- * The caller must have called kbase_pm_request_l2_caches() prior to a call
- * to this.
- *
- * This should only be used when power management is active.
- */
-void kbase_pm_release_l2_caches(struct kbase_device *kbdev);
-
-#endif /* _KBASE_PM_POLICY_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_time.c b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_time.c
deleted file mode 100644
index 0068e1091f4c..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_time.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <mali_kbase.h>
-#include <mali_kbase_hwaccess_time.h>
-#include <backend/gpu/mali_kbase_device_internal.h>
-#include <backend/gpu/mali_kbase_pm_internal.h>
-
-void kbase_backend_get_gpu_time(struct kbase_device *kbdev, u64 *cycle_counter,
-				u64 *system_time, struct timespec *ts)
-{
-	u32 hi1, hi2;
-
-	kbase_pm_request_gpu_cycle_counter(kbdev);
-
-	/* Read hi, lo, hi to ensure that overflow from lo to hi is handled
-	 * correctly */
-	do {
-		hi1 = kbase_reg_read(kbdev, GPU_CONTROL_REG(CYCLE_COUNT_HI),
-									NULL);
-		*cycle_counter = kbase_reg_read(kbdev,
-					GPU_CONTROL_REG(CYCLE_COUNT_LO), NULL);
-		hi2 = kbase_reg_read(kbdev, GPU_CONTROL_REG(CYCLE_COUNT_HI),
-									NULL);
-		*cycle_counter |= (((u64) hi1) << 32);
-	} while (hi1 != hi2);
-
-	/* Read hi, lo, hi to ensure that overflow from lo to hi is handled
-	 * correctly */
-	do {
-		hi1 = kbase_reg_read(kbdev, GPU_CONTROL_REG(TIMESTAMP_HI),
-									NULL);
-		*system_time = kbase_reg_read(kbdev,
-					GPU_CONTROL_REG(TIMESTAMP_LO), NULL);
-		hi2 = kbase_reg_read(kbdev, GPU_CONTROL_REG(TIMESTAMP_HI),
-									NULL);
-		*system_time |= (((u64) hi1) << 32);
-	} while (hi1 != hi2);
-
-	/* Record the CPU's idea of current time */
-	getrawmonotonic(ts);
-
-	kbase_pm_release_gpu_cycle_counter(kbdev);
-}
-
-/**
- * kbase_wait_write_flush -  Wait for GPU write flush
- * @kctx: Context pointer
- *
- * Wait 1000 GPU clock cycles. This delay is known to give the GPU time to flush
- * its write buffer.
- *
- * Only in use for BASE_HW_ISSUE_6367
- *
- * Note : If GPU resets occur then the counters are reset to zero, the delay may
- * not be as expected.
- */
-#ifndef CONFIG_MALI_BIFROST_NO_MALI
-void kbase_wait_write_flush(struct kbase_context *kctx)
-{
-	u32 base_count = 0;
-
-	/*
-	 * The caller must be holding onto the kctx or the call is from
-	 * userspace.
-	 */
-	kbase_pm_context_active(kctx->kbdev);
-	kbase_pm_request_gpu_cycle_counter(kctx->kbdev);
-
-	while (true) {
-		u32 new_count;
-
-		new_count = kbase_reg_read(kctx->kbdev,
-					GPU_CONTROL_REG(CYCLE_COUNT_LO), NULL);
-		/* First time around, just store the count. */
-		if (base_count == 0) {
-			base_count = new_count;
-			continue;
-		}
-
-		/* No need to handle wrapping, unsigned maths works for this. */
-		if ((new_count - base_count) > 1000)
-			break;
-	}
-
-	kbase_pm_release_gpu_cycle_counter(kctx->kbdev);
-	kbase_pm_context_idle(kctx->kbdev);
-}
-#endif				/* CONFIG_MALI_BIFROST_NO_MALI */
diff --git a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_time.h b/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_time.h
deleted file mode 100644
index 0559b2f7097d..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/backend/gpu/mali_kbase_time.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KBASE_BACKEND_TIME_H_
-#define _KBASE_BACKEND_TIME_H_
-
-/**
- * kbase_backend_get_gpu_time() - Get current GPU time
- * @kbdev:		Device pointer
- * @cycle_counter:	Pointer to u64 to store cycle counter in
- * @system_time:	Pointer to u64 to store system time in
- * @ts:			Pointer to struct timespec to store current monotonic
- *			time in
- */
-void kbase_backend_get_gpu_time(struct kbase_device *kbdev, u64 *cycle_counter,
-				u64 *system_time, struct timespec *ts);
-
-/**
- * kbase_wait_write_flush() -  Wait for GPU write flush
- * @kctx:	Context pointer
- *
- * Wait 1000 GPU clock cycles. This delay is known to give the GPU time to flush
- * its write buffer.
- *
- * If GPU resets occur then the counters are reset to zero, the delay may not be
- * as expected.
- *
- * This function is only in use for BASE_HW_ISSUE_6367
- */
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-static inline void kbase_wait_write_flush(struct kbase_context *kctx)
-{
-}
-#else
-void kbase_wait_write_flush(struct kbase_context *kctx);
-#endif
-
-#endif /* _KBASE_BACKEND_TIME_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/docs/Doxyfile b/drivers/gpu/arm/bifrost_for_linux/docs/Doxyfile
deleted file mode 100644
index 35ff2f1ce4a0..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/docs/Doxyfile
+++ /dev/null
@@ -1,126 +0,0 @@
-#
-# (C) COPYRIGHT 2011-2013, 2015 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-
-##############################################################################
-
-# This file contains per-module Doxygen configuration. Please do not add
-# extra settings to this file without consulting all stakeholders, as they
-# may cause override project-wide settings.
-#
-# Additionally, when defining aliases, macros, sections etc, use the module
-# name as a prefix e.g. gles_my_alias.
-
-##############################################################################
-
-@INCLUDE = ../../bldsys/Doxyfile_common
-
-# The INPUT tag can be used to specify the files and/or directories that contain
-# documented source files. You may enter file names like "myfile.cpp" or
-# directories like "/usr/src/myproject". Separate the files or directories
-# with spaces.
-
-INPUT                  += ../../kernel/drivers/gpu/arm/midgard/ 
-
-##############################################################################
-# Everything below here is optional, and in most cases not required
-##############################################################################
-
-# This tag can be used to specify a number of aliases that acts
-# as commands in the documentation. An alias has the form "name=value".
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to
-# put the command \sideeffect (or @sideeffect) in the documentation, which
-# will result in a user-defined paragraph with heading "Side Effects:".
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES                +=
-
-# The ENABLED_SECTIONS tag can be used to enable conditional
-# documentation sections, marked by \if sectionname ... \endif.
-
-ENABLED_SECTIONS       +=
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank the following patterns are tested:
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
-# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
-
-FILE_PATTERNS          +=
-
-# The EXCLUDE tag can be used to specify files and/or directories that should
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-EXCLUDE                += ../../kernel/drivers/gpu/arm/midgard/platform ../../kernel/drivers/gpu/arm/midgard/platform_dummy ../../kernel/drivers/gpu/arm/midgard/scripts ../../kernel/drivers/gpu/arm/midgard/tests ../../kernel/drivers/gpu/arm/midgard/Makefile ../../kernel/drivers/gpu/arm/midgard/Makefile.kbase ../../kernel/drivers/gpu/arm/midgard/Kbuild ../../kernel/drivers/gpu/arm/midgard/Kconfig ../../kernel/drivers/gpu/arm/midgard/sconscript ../../kernel/drivers/gpu/arm/midgard/docs ../../kernel/drivers/gpu/arm/midgard/pm_test_script.sh ../../kernel/drivers/gpu/arm/midgard/mali_uk.h ../../kernel/drivers/gpu/arm/midgard/Makefile
-
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories. Note that the wildcards are matched
-# against the file with absolute path, so to exclude all test directories
-# for example use the pattern */test/*
-
-EXCLUDE_PATTERNS       +=
-
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
-# (namespaces, classes, functions, etc.) that should be excluded from the
-# output. The symbol name can be a fully qualified name, a word, or if the
-# wildcard * is used, a substring. Examples: ANamespace, AClass,
-# AClass::ANamespace, ANamespace::*Test
-
-EXCLUDE_SYMBOLS        +=
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or
-# directories that contain example code fragments that are included (see
-# the \include command).
-
-EXAMPLE_PATH           +=
-
-# The IMAGE_PATH tag can be used to specify one or more files or
-# directories that contain image that are included in the documentation (see
-# the \image command).
-
-IMAGE_PATH             +=
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by
-# the preprocessor.
-
-INCLUDE_PATH           +=
-
-# The PREDEFINED tag can be used to specify one or more macro names that
-# are defined before the preprocessor is started (similar to the -D option of
-# gcc). The argument of the tag is a list of macros of the form: name
-# or name=definition (no spaces). If the definition and the = are
-# omitted =1 is assumed. To prevent a macro definition from being
-# undefined via #undef or recursively expanded use the := operator
-# instead of the = operator.
-
-PREDEFINED             +=
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
-# this tag can be used to specify a list of macro names that should be expanded.
-# The macro definition that is found in the sources will be used.
-# Use the PREDEFINED tag if you want to use a different macro definition.
-
-EXPAND_AS_DEFINED      +=
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the
-# \dotfile command).
-
-DOTFILE_DIRS           += ../../kernel/drivers/gpu/arm/midgard/docs
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/docs/policy_operation_diagram.dot b/drivers/gpu/arm/bifrost_for_linux/docs/policy_operation_diagram.dot
deleted file mode 100644
index 7ae05c2f8ded..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/docs/policy_operation_diagram.dot
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-digraph policy_objects_diagram {
-	rankdir=LR;
-	size="12,8";
-	compound=true;
-
-	node [ shape = box ];
-
-	subgraph cluster_policy_queues {
-		low_queue [ shape=record label = "LowP | {<ql>ctx_lo | ... | <qm>ctx_i | ... | <qr>ctx_hi}" ];
-		queues_middle_sep [ label="" shape=plaintext width=0 height=0 ];
-
-		rt_queue [ shape=record label = "RT | {<ql>ctx_lo | ... | <qm>ctx_j | ... | <qr>ctx_hi}" ];
-
-		label = "Policy's Queue(s)";
-	}
-
-	call_enqueue [ shape=plaintext label="enqueue_ctx()" ];
-
-	{
-		rank=same;
-		ordering=out;
-		call_dequeue [ shape=plaintext label="dequeue_head_ctx()\n+ runpool_add_ctx()" ];
-		call_ctxfinish [ shape=plaintext label="runpool_remove_ctx()" ];
-
-		call_ctxdone [ shape=plaintext label="don't requeue;\n/* ctx has no more jobs */" ];
-	}
-
-	subgraph cluster_runpool {
-
-		as0 [ width=2 height = 0.25 label="AS0: Job_1, ..., Job_n" ];
-		as1 [ width=2 height = 0.25 label="AS1: Job_1, ..., Job_m" ];
-		as2 [ width=2 height = 0.25 label="AS2: Job_1, ..., Job_p" ];
-		as3 [ width=2 height = 0.25 label="AS3: Job_1, ..., Job_q" ];
-
-		label = "Policy's Run Pool";
-	}
-
-	{
-		rank=same;
-		call_jdequeue [ shape=plaintext label="dequeue_job()" ];
-		sstop_dotfixup [ shape=plaintext label="" width=0 height=0 ];
-	}
-
-	{
-		rank=same;
-		ordering=out;
-		sstop [ shape=ellipse label="SS-Timer expires" ]
-		jobslots [ shape=record label="Jobslots: | <0>js[0] | <1>js[1] | <2>js[2]" ];
-
-		irq [ label="IRQ" shape=ellipse ];
-
-		job_finish [ shape=plaintext label="don't requeue;\n/* job done */" ];
-	}
-
-	hstop [ shape=ellipse label="HS-Timer expires" ]
-
-	/*
-	 * Edges
-	 */
-
-	call_enqueue -> queues_middle_sep [ lhead=cluster_policy_queues ];
-
-	low_queue:qr -> call_dequeue:w;
-	rt_queue:qr -> call_dequeue:w;
-
-	call_dequeue -> as1 [lhead=cluster_runpool];
-
-	as1->call_jdequeue         [ltail=cluster_runpool];
-	call_jdequeue->jobslots:0;
-	call_jdequeue->sstop_dotfixup [ arrowhead=none];
-	sstop_dotfixup->sstop      [label="Spawn SS-Timer"];
-	sstop->jobslots            [label="SoftStop"];
-	sstop->hstop               [label="Spawn HS-Timer"];
-	hstop->jobslots:ne            [label="HardStop"];
-
-
-	as3->call_ctxfinish:ne [ ltail=cluster_runpool ];
-	call_ctxfinish:sw->rt_queue:qm [ lhead=cluster_policy_queues label="enqueue_ctx()\n/* ctx still has jobs */" ];
-
-	call_ctxfinish->call_ctxdone [constraint=false];
-
-	call_ctxdone->call_enqueue [weight=0.1 labeldistance=20.0 labelangle=0.0 taillabel="Job submitted to the ctx" style=dotted constraint=false];
-
-
-	{
-	jobslots->irq   [constraint=false];
-
-	irq->job_finish [constraint=false];
-	}
-
-	irq->as2  [lhead=cluster_runpool label="requeue_job()\n/* timeslice expired */" ];
-
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/docs/policy_overview.dot b/drivers/gpu/arm/bifrost_for_linux/docs/policy_overview.dot
deleted file mode 100644
index 159b993b7d61..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/docs/policy_overview.dot
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-digraph policy_objects_diagram {
-	rankdir=LR
-	size="6,6"
-	compound=true;
-
-	node [ shape = box ];
-
-	call_enqueue [ shape=plaintext label="enqueue ctx" ];
-
-
-	policy_queue [ label="Policy's Queue" ];
-
-	{
-		rank=same;
-		runpool [ label="Policy's Run Pool" ];
-
-		ctx_finish [ label="ctx finished" ];
-	}
-
-	{
-		rank=same;
-		jobslots [ shape=record label="Jobslots: | <0>js[0] | <1>js[1] | <2>js[2]" ];
-
-		job_finish [ label="Job finished" ];
-	}
-
-
-
-	/*
-	 * Edges
-	 */
-
-	call_enqueue -> policy_queue;
-
-	policy_queue->runpool [label="dequeue ctx" weight=0.1];
-	runpool->policy_queue [label="requeue ctx" weight=0.1];
-
-	runpool->ctx_finish [ style=dotted ];
-
-	runpool->jobslots  [label="dequeue job" weight=0.1];
-	jobslots->runpool  [label="requeue job" weight=0.1];
-
-	jobslots->job_finish [ style=dotted ];
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/ipa/Kbuild b/drivers/gpu/arm/bifrost_for_linux/ipa/Kbuild
deleted file mode 100644
index 0776428fce4f..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/ipa/Kbuild
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-# (C) COPYRIGHT 2016-2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-bifrost_kbase-y += \
-	ipa/mali_kbase_ipa_simple.o \
-	ipa/mali_kbase_ipa.o
-
-bifrost_kbase-$(CONFIG_DEBUG_FS) += ipa/mali_kbase_ipa_debugfs.o
-
-ifneq ($(wildcard $(srctree)/$(src)/ipa/mali_kbase_ipa_vinstr_g71.c),)
-  bifrost_kbase-y += \
-	ipa/mali_kbase_ipa_vinstr_g71.o \
-	ipa/mali_kbase_ipa_vinstr_common.o
-
-endif
diff --git a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa.c b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa.c
deleted file mode 100644
index d6332b55e970..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa.c
+++ /dev/null
@@ -1,580 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2016-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-#include <linux/thermal.h>
-#include <linux/devfreq_cooling.h>
-#include <linux/of.h>
-#include "mali_kbase.h"
-#include "mali_kbase_ipa.h"
-#include "mali_kbase_ipa_debugfs.h"
-#include "mali_kbase_ipa_simple.h"
-
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0))
-#include <linux/pm_opp.h>
-#else
-#include <linux/opp.h>
-#define dev_pm_opp_find_freq_exact opp_find_freq_exact
-#define dev_pm_opp_get_voltage opp_get_voltage
-#define dev_pm_opp opp
-#endif
-
-#define KBASE_IPA_FALLBACK_MODEL_NAME "mali-simple-power-model"
-#define KBASE_IPA_G71_MODEL_NAME      "mali-g71-power-model"
-
-static struct kbase_ipa_model_ops *kbase_ipa_all_model_ops[] = {
-	&kbase_simple_ipa_model_ops,
-	&kbase_g71_ipa_model_ops
-};
-
-int kbase_ipa_model_recalculate(struct kbase_ipa_model *model)
-{
-	int err = 0;
-
-	lockdep_assert_held(&model->kbdev->ipa.lock);
-
-	if (model->ops->recalculate) {
-		err = model->ops->recalculate(model);
-		if (err) {
-			dev_err(model->kbdev->dev,
-				"recalculation of power model %s returned error %d\n",
-				model->ops->name, err);
-		}
-	}
-
-	return err;
-}
-
-static struct kbase_ipa_model_ops *kbase_ipa_model_ops_find(struct kbase_device *kbdev,
-							    const char *name)
-{
-	int i;
-
-	for (i = 0; i < ARRAY_SIZE(kbase_ipa_all_model_ops); ++i) {
-		struct kbase_ipa_model_ops *ops = kbase_ipa_all_model_ops[i];
-
-		if (!strcmp(ops->name, name))
-			return ops;
-	}
-
-	dev_err(kbdev->dev, "power model \'%s\' not found\n", name);
-
-	return NULL;
-}
-
-void kbase_ipa_model_use_fallback_locked(struct kbase_device *kbdev)
-{
-	atomic_set(&kbdev->ipa_use_configured_model, false);
-}
-
-void kbase_ipa_model_use_configured_locked(struct kbase_device *kbdev)
-{
-	atomic_set(&kbdev->ipa_use_configured_model, true);
-}
-
-const char *kbase_ipa_model_name_from_id(u32 gpu_id)
-{
-	const u32 prod_id = (gpu_id & GPU_ID_VERSION_PRODUCT_ID) >>
-			GPU_ID_VERSION_PRODUCT_ID_SHIFT;
-
-	if (GPU_ID_IS_NEW_FORMAT(prod_id)) {
-		switch (GPU_ID2_MODEL_MATCH_VALUE(prod_id)) {
-		case GPU_ID2_PRODUCT_TMIX:
-			return KBASE_IPA_G71_MODEL_NAME;
-		default:
-			return KBASE_IPA_FALLBACK_MODEL_NAME;
-		}
-	}
-
-	return KBASE_IPA_FALLBACK_MODEL_NAME;
-}
-
-static struct device_node *get_model_dt_node(struct kbase_ipa_model *model)
-{
-	struct device_node *model_dt_node;
-	char compat_string[64];
-
-	snprintf(compat_string, sizeof(compat_string), "arm,%s",
-		 model->ops->name);
-
-	model_dt_node = of_find_compatible_node(model->kbdev->dev->of_node,
-						NULL, compat_string);
-	if (!model_dt_node && !model->missing_dt_node_warning) {
-		dev_warn(model->kbdev->dev,
-			 "Couldn't find power_model DT node matching \'%s\'\n",
-			 compat_string);
-		model->missing_dt_node_warning = true;
-	}
-
-	return model_dt_node;
-}
-
-int kbase_ipa_model_add_param_s32(struct kbase_ipa_model *model,
-				  const char *name, s32 *addr,
-				  size_t num_elems, bool dt_required)
-{
-	int err, i;
-	struct device_node *model_dt_node = get_model_dt_node(model);
-	char *origin;
-
-	err = of_property_read_u32_array(model_dt_node, name, addr, num_elems);
-
-	if (err && dt_required) {
-		memset(addr, 0, sizeof(s32) * num_elems);
-		dev_warn(model->kbdev->dev,
-			 "Error %d, no DT entry: %s.%s = %zu*[0]\n",
-			 err, model->ops->name, name, num_elems);
-		origin = "zero";
-	} else if (err && !dt_required) {
-		origin = "default";
-	} else /* !err */ {
-		origin = "DT";
-	}
-
-	/* Create a unique debugfs entry for each element */
-	for (i = 0; i < num_elems; ++i) {
-		char elem_name[32];
-
-		if (num_elems == 1)
-			snprintf(elem_name, sizeof(elem_name), "%s", name);
-		else
-			snprintf(elem_name, sizeof(elem_name), "%s.%d",
-				name, i);
-
-		dev_dbg(model->kbdev->dev, "%s.%s = %d (%s)\n",
-			model->ops->name, elem_name, addr[i], origin);
-
-		err = kbase_ipa_model_param_add(model, elem_name,
-						&addr[i], sizeof(s32),
-						PARAM_TYPE_S32);
-		if (err)
-			goto exit;
-	}
-exit:
-	return err;
-}
-
-int kbase_ipa_model_add_param_string(struct kbase_ipa_model *model,
-				     const char *name, char *addr,
-				     size_t size, bool dt_required)
-{
-	int err;
-	struct device_node *model_dt_node = get_model_dt_node(model);
-	const char *string_prop_value;
-	char *origin;
-
-	err = of_property_read_string(model_dt_node, name,
-				      &string_prop_value);
-	if (err && dt_required) {
-		strncpy(addr, "", size - 1);
-		dev_warn(model->kbdev->dev,
-			 "Error %d, no DT entry: %s.%s = \'%s\'\n",
-			 err, model->ops->name, name, addr);
-		err = 0;
-		origin = "zero";
-	} else if (err && !dt_required) {
-		origin = "default";
-	} else /* !err */ {
-		strncpy(addr, string_prop_value, size - 1);
-		origin = "DT";
-	}
-
-	addr[size - 1] = '\0';
-
-	dev_dbg(model->kbdev->dev, "%s.%s = \'%s\' (%s)\n",
-		model->ops->name, name, string_prop_value, origin);
-
-	err = kbase_ipa_model_param_add(model, name, addr, size,
-					PARAM_TYPE_STRING);
-
-	return err;
-}
-
-void kbase_ipa_term_model(struct kbase_ipa_model *model)
-{
-	if (!model)
-		return;
-
-	lockdep_assert_held(&model->kbdev->ipa.lock);
-
-	if (model->ops->term)
-		model->ops->term(model);
-
-	kbase_ipa_model_param_free_all(model);
-
-	kfree(model);
-}
-KBASE_EXPORT_TEST_API(kbase_ipa_term_model);
-
-struct kbase_ipa_model *kbase_ipa_init_model(struct kbase_device *kbdev,
-					     struct kbase_ipa_model_ops *ops)
-{
-	struct kbase_ipa_model *model;
-	int err;
-
-	lockdep_assert_held(&kbdev->ipa.lock);
-
-	if (!ops || !ops->name)
-		return NULL;
-
-	model = kzalloc(sizeof(struct kbase_ipa_model), GFP_KERNEL);
-	if (!model)
-		return NULL;
-
-	model->kbdev = kbdev;
-	model->ops = ops;
-	INIT_LIST_HEAD(&model->params);
-
-	err = model->ops->init(model);
-	if (err) {
-		dev_err(kbdev->dev,
-			"init of power model \'%s\' returned error %d\n",
-			ops->name, err);
-		kfree(model);
-		return NULL;
-	}
-
-	err = kbase_ipa_model_recalculate(model);
-	if (err) {
-		kbase_ipa_term_model(model);
-		return NULL;
-	}
-
-	return model;
-}
-KBASE_EXPORT_TEST_API(kbase_ipa_init_model);
-
-static void kbase_ipa_term_locked(struct kbase_device *kbdev)
-{
-	lockdep_assert_held(&kbdev->ipa.lock);
-
-	/* Clean up the models */
-	if (kbdev->ipa.configured_model != kbdev->ipa.fallback_model)
-		kbase_ipa_term_model(kbdev->ipa.configured_model);
-	kbase_ipa_term_model(kbdev->ipa.fallback_model);
-
-	kbdev->ipa.configured_model = NULL;
-	kbdev->ipa.fallback_model = NULL;
-}
-
-int kbase_ipa_init(struct kbase_device *kbdev)
-{
-
-	const char *model_name;
-	struct kbase_ipa_model_ops *ops;
-	struct kbase_ipa_model *default_model = NULL;
-	int err;
-
-	mutex_init(&kbdev->ipa.lock);
-	/*
-	 * Lock during init to avoid warnings from lockdep_assert_held (there
-	 * shouldn't be any concurrent access yet).
-	 */
-	mutex_lock(&kbdev->ipa.lock);
-
-	/* The simple IPA model must *always* be present.*/
-	ops = kbase_ipa_model_ops_find(kbdev, KBASE_IPA_FALLBACK_MODEL_NAME);
-
-	if (!ops->do_utilization_scaling_in_framework) {
-		dev_err(kbdev->dev,
-			"Fallback IPA model %s should not account for utilization\n",
-			ops->name);
-		err = -EINVAL;
-		goto end;
-	}
-
-	default_model = kbase_ipa_init_model(kbdev, ops);
-	if (!default_model) {
-		err = -EINVAL;
-		goto end;
-	}
-
-	kbdev->ipa.fallback_model = default_model;
-	err = of_property_read_string(kbdev->dev->of_node,
-				      "ipa-model",
-				      &model_name);
-	if (err) {
-		/* Attempt to load a match from GPU-ID */
-		u32 gpu_id;
-
-		gpu_id = kbdev->gpu_props.props.raw_props.gpu_id;
-		model_name = kbase_ipa_model_name_from_id(gpu_id);
-		dev_dbg(kbdev->dev,
-			"Inferring model from GPU ID 0x%x: \'%s\'\n",
-			gpu_id, model_name);
-		err = 0;
-	} else {
-		dev_dbg(kbdev->dev,
-			"Using ipa-model parameter from DT: \'%s\'\n",
-			model_name);
-	}
-
-	if (strcmp(KBASE_IPA_FALLBACK_MODEL_NAME, model_name) != 0) {
-		ops = kbase_ipa_model_ops_find(kbdev, model_name);
-		kbdev->ipa.configured_model = kbase_ipa_init_model(kbdev, ops);
-		if (!kbdev->ipa.configured_model) {
-			err = -EINVAL;
-			goto end;
-		}
-	} else {
-		kbdev->ipa.configured_model = default_model;
-	}
-
-	kbase_ipa_model_use_configured_locked(kbdev);
-
-end:
-	if (err)
-		kbase_ipa_term_locked(kbdev);
-	else
-		dev_info(kbdev->dev,
-			 "Using configured power model %s, and fallback %s\n",
-			 kbdev->ipa.configured_model->ops->name,
-			 kbdev->ipa.fallback_model->ops->name);
-
-	mutex_unlock(&kbdev->ipa.lock);
-	return err;
-}
-KBASE_EXPORT_TEST_API(kbase_ipa_init);
-
-void kbase_ipa_term(struct kbase_device *kbdev)
-{
-	mutex_lock(&kbdev->ipa.lock);
-	kbase_ipa_term_locked(kbdev);
-	mutex_unlock(&kbdev->ipa.lock);
-}
-KBASE_EXPORT_TEST_API(kbase_ipa_term);
-
-/**
- * kbase_scale_dynamic_power() - Scale a dynamic power coefficient to an OPP
- * @c:		Dynamic model coefficient, in pW/(Hz V^2). Should be in range
- *		0 < c < 2^26 to prevent overflow.
- * @freq:	Frequency, in Hz. Range: 2^23 < freq < 2^30 (~8MHz to ~1GHz)
- * @voltage:	Voltage, in mV. Range: 2^9 < voltage < 2^13 (~0.5V to ~8V)
- *
- * Keep a record of the approximate range of each value at every stage of the
- * calculation, to ensure we don't overflow. This makes heavy use of the
- * approximations 1000 = 2^10 and 1000000 = 2^20, but does the actual
- * calculations in decimal for increased accuracy.
- *
- * Return: Power consumption, in mW. Range: 0 < p < 2^13 (0W to ~8W)
- */
-static u32 kbase_scale_dynamic_power(const u32 c, const u32 freq,
-				     const u32 voltage)
-{
-	/* Range: 2^8 < v2 < 2^16 m(V^2) */
-	const u32 v2 = (voltage * voltage) / 1000;
-
-	/* Range: 2^3 < f_MHz < 2^10 MHz */
-	const u32 f_MHz = freq / 1000000;
-
-	/* Range: 2^11 < v2f_big < 2^26 kHz V^2 */
-	const u32 v2f_big = v2 * f_MHz;
-
-	/* Range: 2^1 < v2f < 2^16 MHz V^2 */
-	const u32 v2f = v2f_big / 1000;
-
-	/* Range (working backwards from next line): 0 < v2fc < 2^23 uW.
-	 * Must be < 2^42 to avoid overflowing the return value. */
-	const u64 v2fc = (u64) c * (u64) v2f;
-
-	/* Range: 0 < v2fc / 1000 < 2^13 mW */
-	return v2fc / 1000;
-}
-
-/**
- * kbase_scale_static_power() - Scale a static power coefficient to an OPP
- * @c:		Static model coefficient, in uW/V^3. Should be in range
- *		0 < c < 2^32 to prevent overflow.
- * @voltage:	Voltage, in mV. Range: 2^9 < voltage < 2^13 (~0.5V to ~8V)
- *
- * Return: Power consumption, in mW. Range: 0 < p < 2^13 (0W to ~8W)
- */
-u32 kbase_scale_static_power(const u32 c, const u32 voltage)
-{
-	/* Range: 2^8 < v2 < 2^16 m(V^2) */
-	const u32 v2 = (voltage * voltage) / 1000;
-
-	/* Range: 2^17 < v3_big < 2^29 m(V^2) mV */
-	const u32 v3_big = v2 * voltage;
-
-	/* Range: 2^7 < v3 < 2^19 m(V^3) */
-	const u32 v3 = v3_big / 1000;
-
-	/*
-	 * Range (working backwards from next line): 0 < v3c_big < 2^33 nW.
-	 * The result should be < 2^52 to avoid overflowing the return value.
-	 */
-	const u64 v3c_big = (u64) c * (u64) v3;
-
-	/* Range: 0 < v3c_big / 1000000 < 2^13 mW */
-	return v3c_big / 1000000;
-}
-
-static struct kbase_ipa_model *get_current_model(struct kbase_device *kbdev)
-{
-	lockdep_assert_held(&kbdev->ipa.lock);
-
-	if (atomic_read(&kbdev->ipa_use_configured_model))
-		return kbdev->ipa.configured_model;
-	else
-		return kbdev->ipa.fallback_model;
-}
-
-static u32 get_static_power_locked(struct kbase_device *kbdev,
-				   struct kbase_ipa_model *model,
-				   unsigned long voltage)
-{
-	u32 power = 0;
-	int err;
-	u32 power_coeff;
-
-	lockdep_assert_held(&model->kbdev->ipa.lock);
-
-	if (!model->ops->get_static_coeff)
-		model = kbdev->ipa.fallback_model;
-
-	if (model->ops->get_static_coeff) {
-		err = model->ops->get_static_coeff(model, &power_coeff);
-		if (!err)
-			power = kbase_scale_static_power(power_coeff,
-							 (u32) voltage);
-	}
-
-	return power;
-}
-
-#ifdef CONFIG_MALI_PWRSOFT_765
-static unsigned long kbase_get_static_power(struct devfreq *df,
-					    unsigned long voltage)
-#else
-static unsigned long kbase_get_static_power(unsigned long voltage)
-#endif
-{
-	struct kbase_ipa_model *model;
-	u32 power = 0;
-#ifdef CONFIG_MALI_PWRSOFT_765
-	struct kbase_device *kbdev = dev_get_drvdata(&df->dev);
-#else
-	struct kbase_device *kbdev = kbase_find_device(-1);
-#endif
-
-	mutex_lock(&kbdev->ipa.lock);
-
-	model = get_current_model(kbdev);
-	power = get_static_power_locked(kbdev, model, voltage);
-
-	mutex_unlock(&kbdev->ipa.lock);
-
-#ifndef CONFIG_MALI_PWRSOFT_765
-	kbase_release_device(kbdev);
-#endif
-
-	return power;
-}
-
-#ifdef CONFIG_MALI_PWRSOFT_765
-static unsigned long kbase_get_dynamic_power(struct devfreq *df,
-					     unsigned long freq,
-					     unsigned long voltage)
-#else
-static unsigned long kbase_get_dynamic_power(unsigned long freq,
-					     unsigned long voltage)
-#endif
-{
-	struct kbase_ipa_model *model;
-	u32 power_coeff = 0, power = 0;
-	int err = 0;
-#ifdef CONFIG_MALI_PWRSOFT_765
-	struct kbase_device *kbdev = dev_get_drvdata(&df->dev);
-#else
-	struct kbase_device *kbdev = kbase_find_device(-1);
-#endif
-
-	mutex_lock(&kbdev->ipa.lock);
-
-	model = kbdev->ipa.fallback_model;
-
-	err = model->ops->get_dynamic_coeff(model, &power_coeff, freq);
-
-	if (!err)
-		power = kbase_scale_dynamic_power(power_coeff, freq, voltage);
-	else
-		dev_err_ratelimited(kbdev->dev,
-				    "Model %s returned error code %d\n",
-				    model->ops->name, err);
-
-	mutex_unlock(&kbdev->ipa.lock);
-
-#ifndef CONFIG_MALI_PWRSOFT_765
-	kbase_release_device(kbdev);
-#endif
-
-	return power;
-}
-
-int kbase_get_real_power(struct devfreq *df, u32 *power,
-				unsigned long freq,
-				unsigned long voltage)
-{
-	struct kbase_ipa_model *model;
-	u32 power_coeff = 0;
-	int err = 0;
-	struct kbase_device *kbdev = dev_get_drvdata(&df->dev);
-
-	mutex_lock(&kbdev->ipa.lock);
-
-	model = get_current_model(kbdev);
-
-	err = model->ops->get_dynamic_coeff(model, &power_coeff, freq);
-
-	/* If we switch to protected model between get_current_model() and
-	 * get_dynamic_coeff(), counter reading could fail. If that happens
-	 * (unlikely, but possible), revert to the fallback model. */
-	if (err && model != kbdev->ipa.fallback_model) {
-		model = kbdev->ipa.fallback_model;
-		err = model->ops->get_dynamic_coeff(model, &power_coeff, freq);
-	}
-
-	if (err)
-		goto exit_unlock;
-
-	*power = kbase_scale_dynamic_power(power_coeff, freq, voltage);
-
-	if (model->ops->do_utilization_scaling_in_framework) {
-		struct devfreq_dev_status *status = &df->last_status;
-		unsigned long total_time = max(status->total_time, 1ul);
-		u64 busy_time = min(status->busy_time, total_time);
-
-		*power = ((u64) *power * (u64) busy_time) / total_time;
-	}
-
-	*power += get_static_power_locked(kbdev, model, voltage);
-
-exit_unlock:
-	mutex_unlock(&kbdev->ipa.lock);
-
-	return err;
-}
-KBASE_EXPORT_TEST_API(kbase_get_real_power);
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 0)
-struct devfreq_cooling_ops kbase_ipa_power_model_ops = {
-#else
-struct devfreq_cooling_power kbase_ipa_power_model_ops = {
-#endif
-	.get_static_power = &kbase_get_static_power,
-	.get_dynamic_power = &kbase_get_dynamic_power,
-};
-KBASE_EXPORT_TEST_API(kbase_ipa_power_model_ops);
diff --git a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa.h b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa.h
deleted file mode 100644
index 67478fe911ea..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa.h
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2016-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KBASE_IPA_H_
-#define _KBASE_IPA_H_
-
-#if defined(CONFIG_MALI_BIFROST_DEVFREQ) && defined(CONFIG_DEVFREQ_THERMAL)
-
-struct devfreq;
-
-struct kbase_ipa_model {
-	struct list_head link;
-	struct kbase_device *kbdev;
-	void *model_data;
-	struct kbase_ipa_model_ops *ops;
-	struct list_head params;
-	bool missing_dt_node_warning;
-};
-
-/**
- * kbase_ipa_model_add_param_s32 - Add an integer model parameter
- * @model:	pointer to IPA model
- * @name:	name of corresponding debugfs entry
- * @addr:	address where the value is stored
- * @num_elems:	number of elements (1 if not an array)
- * @dt_required: if false, a corresponding devicetree entry is not required,
- *		 and the current value will be used. If true, a warning is
- *		 output and the data is zeroed
- *
- * Return: 0 on success, or an error code
- */
-int kbase_ipa_model_add_param_s32(struct kbase_ipa_model *model,
-				  const char *name, s32 *addr,
-				  size_t num_elems, bool dt_required);
-
-/**
- * kbase_ipa_model_add_param_string - Add a string model parameter
- * @model:	pointer to IPA model
- * @name:	name of corresponding debugfs entry
- * @addr:	address where the value is stored
- * @size:	size, in bytes, of the value storage (so the maximum string
- *		length is size - 1)
- * @dt_required: if false, a corresponding devicetree entry is not required,
- *		 and the current value will be used. If true, a warning is
- *		 output and the data is zeroed
- *
- * Return: 0 on success, or an error code
- */
-int kbase_ipa_model_add_param_string(struct kbase_ipa_model *model,
-				     const char *name, char *addr,
-				     size_t size, bool dt_required);
-
-struct kbase_ipa_model_ops {
-	char *name;
-	/* The init, recalculate and term ops on the default model are always
-	 * called.  However, all the other models are only invoked if the model
-	 * is selected in the device tree. Otherwise they are never
-	 * initialized. Additional resources can be acquired by models in
-	 * init(), however they must be terminated in the term().
-	 */
-	int (*init)(struct kbase_ipa_model *model);
-	/* Called immediately after init(), or when a parameter is changed, so
-	 * that any coefficients derived from model parameters can be
-	 * recalculated. */
-	int (*recalculate)(struct kbase_ipa_model *model);
-	void (*term)(struct kbase_ipa_model *model);
-	/*
-	 * get_dynamic_coeff() - calculate dynamic power coefficient
-	 * @model:		pointer to model
-	 * @coeffp:		pointer to return value location
-	 * @current_freq:	frequency the GPU has been running at for the
-	 *			previous sampling period.
-	 *
-	 * Calculate a dynamic power coefficient, with units pW/(Hz V^2), which
-	 * is then scaled by the IPA framework according to the current OPP's
-	 * frequency and voltage.
-	 *
-	 * Return: 0 on success, or an error code.
-	 */
-	int (*get_dynamic_coeff)(struct kbase_ipa_model *model, u32 *coeffp,
-				 u32 current_freq);
-	/*
-	 * get_static_coeff() - calculate static power coefficient
-	 * @model:		pointer to model
-	 * @coeffp:		pointer to return value location
-	 *
-	 * Calculate a static power coefficient, with units uW/(V^3), which is
-	 * scaled by the IPA framework according to the current OPP's voltage.
-	 *
-	 * Return: 0 on success, or an error code.
-	 */
-	int (*get_static_coeff)(struct kbase_ipa_model *model, u32 *coeffp);
-	/* If false, the model's get_dynamic_coeff() method accounts for how
-	 * long the GPU was active over the sample period. If true, the
-	 * framework will scale the calculated power according to the
-	 * utilization stats recorded by devfreq in get_real_power(). */
-	bool do_utilization_scaling_in_framework;
-};
-
-/* Models can be registered only in the platform's platform_init_func call */
-int kbase_ipa_model_ops_register(struct kbase_device *kbdev,
-			     struct kbase_ipa_model_ops *new_model_ops);
-struct kbase_ipa_model *kbase_ipa_get_model(struct kbase_device *kbdev,
-					    const char *name);
-
-int kbase_ipa_init(struct kbase_device *kbdev);
-void kbase_ipa_term(struct kbase_device *kbdev);
-void kbase_ipa_model_use_fallback_locked(struct kbase_device *kbdev);
-void kbase_ipa_model_use_configured_locked(struct kbase_device *kbdev);
-int kbase_ipa_model_recalculate(struct kbase_ipa_model *model);
-struct kbase_ipa_model *kbase_ipa_init_model(struct kbase_device *kbdev,
-					     struct kbase_ipa_model_ops *ops);
-void kbase_ipa_term_model(struct kbase_ipa_model *model);
-
-extern struct kbase_ipa_model_ops kbase_g71_ipa_model_ops;
-
-#if MALI_UNIT_TEST
-/**
- * kbase_get_real_power() - get the real power consumption of the GPU
- * @df: dynamic voltage and frequency scaling information for the GPU.
- * @power: where to store the power consumption, in mW.
- * @freq: a frequency, in HZ.
- * @voltage: a voltage, in mV.
- *
- * This function is only exposed for use by unit tests. The returned value
- * incorporates both static and dynamic power consumption.
- *
- * Return: 0 on success, or an error code.
- */
-int kbase_get_real_power(struct devfreq *df, u32 *power,
-				unsigned long freq,
-				unsigned long voltage);
-#endif /* MALI_UNIT_TEST */
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 0)
-extern struct devfreq_cooling_ops kbase_ipa_power_model_ops;
-#else
-extern struct devfreq_cooling_power kbase_ipa_power_model_ops;
-#endif
-
-#else /* !(defined(CONFIG_MALI_BIFROST_DEVFREQ) && defined(CONFIG_DEVFREQ_THERMAL)) */
-
-static inline void kbase_ipa_model_use_fallback_locked(struct kbase_device *kbdev)
-{ }
-
-static inline void kbase_ipa_model_use_configured_locked(struct kbase_device *kbdev)
-{ }
-
-#endif /* (defined(CONFIG_MALI_BIFROST_DEVFREQ) && defined(CONFIG_DEVFREQ_THERMAL)) */
-
-#endif
diff --git a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_debugfs.c b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_debugfs.c
deleted file mode 100644
index eafc14009ddc..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_debugfs.c
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <linux/debugfs.h>
-#include <linux/list.h>
-#include <linux/mutex.h>
-
-#include "mali_kbase.h"
-#include "mali_kbase_ipa.h"
-#include "mali_kbase_ipa_debugfs.h"
-
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0))
-#define DEFINE_DEBUGFS_ATTRIBUTE DEFINE_SIMPLE_ATTRIBUTE
-#endif
-
-struct kbase_ipa_model_param {
-	char *name;
-	union {
-		void *voidp;
-		s32 *s32p;
-		char *str;
-	} addr;
-	size_t size;
-	enum kbase_ipa_model_param_type type;
-	struct kbase_ipa_model *model;
-	struct list_head link;
-};
-
-static int param_int_get(void *data, u64 *val)
-{
-	struct kbase_ipa_model_param *param = data;
-
-	mutex_lock(&param->model->kbdev->ipa.lock);
-	*(s64 *) val = *param->addr.s32p;
-	mutex_unlock(&param->model->kbdev->ipa.lock);
-
-	return 0;
-}
-
-static int param_int_set(void *data, u64 val)
-{
-	struct kbase_ipa_model_param *param = data;
-	struct kbase_ipa_model *model = param->model;
-	s64 sval = (s64) val;
-	int err = 0;
-
-	if (sval < S32_MIN || sval > S32_MAX)
-		return -ERANGE;
-
-	mutex_lock(&param->model->kbdev->ipa.lock);
-	*param->addr.s32p = val;
-	err = kbase_ipa_model_recalculate(model);
-	mutex_unlock(&param->model->kbdev->ipa.lock);
-
-	return err;
-}
-
-DEFINE_DEBUGFS_ATTRIBUTE(fops_s32, param_int_get, param_int_set, "%lld\n");
-
-static ssize_t param_string_get(struct file *file, char __user *user_buf,
-				size_t count, loff_t *ppos)
-{
-	struct kbase_ipa_model_param *param = file->private_data;
-	ssize_t ret;
-	size_t len;
-
-	mutex_lock(&param->model->kbdev->ipa.lock);
-	len = strnlen(param->addr.str, param->size - 1) + 1;
-	ret = simple_read_from_buffer(user_buf, count, ppos,
-				      param->addr.str, len);
-	mutex_unlock(&param->model->kbdev->ipa.lock);
-
-	return ret;
-}
-
-static ssize_t param_string_set(struct file *file, const char __user *user_buf,
-				size_t count, loff_t *ppos)
-{
-	struct kbase_ipa_model_param *param = file->private_data;
-	struct kbase_ipa_model *model = param->model;
-	ssize_t ret = count;
-	size_t buf_size;
-	int err;
-
-	mutex_lock(&model->kbdev->ipa.lock);
-
-	if (count > param->size) {
-		ret = -EINVAL;
-		goto end;
-	}
-
-	buf_size = min(param->size - 1, count);
-	if (copy_from_user(param->addr.str, user_buf, buf_size)) {
-		ret = -EFAULT;
-		goto end;
-	}
-
-	param->addr.str[buf_size] = '\0';
-
-	err = kbase_ipa_model_recalculate(model);
-	if (err < 0)
-		ret = err;
-
-end:
-	mutex_unlock(&model->kbdev->ipa.lock);
-
-	return ret;
-}
-
-static const struct file_operations fops_string = {
-	.read = param_string_get,
-	.write = param_string_set,
-	.open = simple_open,
-	.llseek = default_llseek,
-};
-
-int kbase_ipa_model_param_add(struct kbase_ipa_model *model, const char *name,
-			      void *addr, size_t size,
-			      enum kbase_ipa_model_param_type type)
-{
-	struct kbase_ipa_model_param *param;
-
-	param = kzalloc(sizeof(*param), GFP_KERNEL);
-
-	if (!param)
-		return -ENOMEM;
-
-	/* 'name' is stack-allocated for array elements, so copy it into
-	 * heap-allocated storage */
-	param->name = kstrdup(name, GFP_KERNEL);
-	param->addr.voidp = addr;
-	param->size = size;
-	param->type = type;
-	param->model = model;
-
-	list_add(&param->link, &model->params);
-
-	return 0;
-}
-
-void kbase_ipa_model_param_free_all(struct kbase_ipa_model *model)
-{
-	struct kbase_ipa_model_param *param_p, *param_n;
-
-	list_for_each_entry_safe(param_p, param_n, &model->params, link) {
-		list_del(&param_p->link);
-		kfree(param_p->name);
-		kfree(param_p);
-	}
-}
-
-static void kbase_ipa_model_debugfs_init(struct kbase_ipa_model *model)
-{
-	struct list_head *it;
-	struct dentry *dir;
-
-	lockdep_assert_held(&model->kbdev->ipa.lock);
-
-	dir = debugfs_create_dir(model->ops->name,
-				 model->kbdev->mali_debugfs_directory);
-
-	if (!dir) {
-		dev_err(model->kbdev->dev,
-			"Couldn't create mali debugfs %s directory",
-			model->ops->name);
-		return;
-	}
-
-	list_for_each(it, &model->params) {
-		struct kbase_ipa_model_param *param =
-				list_entry(it,
-					   struct kbase_ipa_model_param,
-					   link);
-		const struct file_operations *fops = NULL;
-
-		switch (param->type) {
-		case PARAM_TYPE_S32:
-			fops = &fops_s32;
-			break;
-		case PARAM_TYPE_STRING:
-			fops = &fops_string;
-			break;
-		}
-
-		if (unlikely(!fops)) {
-			dev_err(model->kbdev->dev,
-				"Type not set for %s parameter %s\n",
-				model->ops->name, param->name);
-		} else {
-			debugfs_create_file(param->name, S_IRUGO | S_IWUSR,
-					    dir, param, fops);
-		}
-	}
-}
-
-void kbase_ipa_debugfs_init(struct kbase_device *kbdev)
-{
-	mutex_lock(&kbdev->ipa.lock);
-
-	if (kbdev->ipa.configured_model != kbdev->ipa.fallback_model)
-		kbase_ipa_model_debugfs_init(kbdev->ipa.configured_model);
-	kbase_ipa_model_debugfs_init(kbdev->ipa.fallback_model);
-
-	mutex_unlock(&kbdev->ipa.lock);
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_debugfs.h b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_debugfs.h
deleted file mode 100644
index ec06e2096f94..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_debugfs.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KBASE_IPA_DEBUGFS_H_
-#define _KBASE_IPA_DEBUGFS_H_
-
-enum kbase_ipa_model_param_type {
-	PARAM_TYPE_S32 = 1,
-	PARAM_TYPE_STRING,
-};
-
-#ifdef CONFIG_DEBUG_FS
-
-void kbase_ipa_debugfs_init(struct kbase_device *kbdev);
-int kbase_ipa_model_param_add(struct kbase_ipa_model *model, const char *name,
-			      void *addr, size_t size,
-			      enum kbase_ipa_model_param_type type);
-void kbase_ipa_model_param_free_all(struct kbase_ipa_model *model);
-
-#else /* CONFIG_DEBUG_FS */
-
-static inline int kbase_ipa_model_param_add(struct kbase_ipa_model *model,
-					    const char *name, void *addr,
-					    size_t size,
-					    enum kbase_ipa_model_param_type type)
-{
-	return 0;
-}
-
-static inline void kbase_ipa_model_param_free_all(struct kbase_ipa_model *model)
-{ }
-
-#endif /* CONFIG_DEBUG_FS */
-
-#endif /* _KBASE_IPA_DEBUGFS_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_simple.c b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_simple.c
deleted file mode 100644
index b35cea451765..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_simple.c
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2016-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <linux/freezer.h>
-#include <linux/thermal.h>
-#ifdef CONFIG_DEVFREQ_THERMAL
-#include <linux/devfreq_cooling.h>
-#endif
-#include <linux/of.h>
-#include <linux/delay.h>
-#include <linux/kthread.h>
-
-#include "mali_kbase.h"
-#include "mali_kbase_defs.h"
-#include "mali_kbase_ipa_simple.h"
-#include "mali_kbase_ipa_debugfs.h"
-
-#if MALI_UNIT_TEST
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)
-static unsigned long dummy_temp;
-
-static int kbase_simple_power_model_get_dummy_temp(
-	struct thermal_zone_device *tz,
-	unsigned long *temp)
-{
-	*temp = READ_ONCE(dummy_temp);
-	return 0;
-}
-
-#else
-static int dummy_temp;
-
-static int kbase_simple_power_model_get_dummy_temp(
-	struct thermal_zone_device *tz,
-	int *dummy_temp)
-{
-	*temp = READ_ONCE(dummy_temp);
-	return 0;
-}
-#endif
-
-/* Intercept calls to the kernel function using a macro */
-#ifdef thermal_zone_get_temp
-#undef thermal_zone_get_temp
-#endif
-#define thermal_zone_get_temp(tz, temp) \
-	kbase_simple_power_model_get_dummy_temp(tz, temp)
-
-void kbase_simple_power_model_set_dummy_temp(int temp)
-{
-	WRITE_ONCE(dummy_temp, temp);
-}
-KBASE_EXPORT_TEST_API(kbase_simple_power_model_set_dummy_temp);
-
-#endif /* MALI_UNIT_TEST */
-
-/*
- * This model is primarily designed for the Juno platform. It may not be
- * suitable for other platforms. The additional resources in this model
- * should preferably be minimal, as this model is rarely used when a dynamic
- * model is available.
- */
-
-/**
- * struct kbase_ipa_model_simple_data - IPA context per device
- * @dynamic_coefficient: dynamic coefficient of the model
- * @static_coefficient:  static coefficient of the model
- * @ts:                  Thermal scaling coefficients of the model
- * @tz_name:             Thermal zone name
- * @gpu_tz:              thermal zone device
- * @poll_temperature_thread: Handle for temperature polling thread
- * @current_temperature: Most recent value of polled temperature
- * @temperature_poll_interval_ms: How often temperature should be checked, in ms
- */
-
-struct kbase_ipa_model_simple_data {
-	u32 dynamic_coefficient;
-	u32 static_coefficient;
-	s32 ts[4];
-	char tz_name[16];
-	struct thermal_zone_device *gpu_tz;
-	struct task_struct *poll_temperature_thread;
-	int current_temperature;
-	int temperature_poll_interval_ms;
-};
-#define FALLBACK_STATIC_TEMPERATURE 55000
-
-/**
- * calculate_temp_scaling_factor() - Calculate temperature scaling coefficient
- * @ts:		Signed coefficients, in order t^0 to t^3, with units Deg^-N
- * @t:		Temperature, in mDeg C. Range: -2^17 < t < 2^17
- *
- * Scale the temperature according to a cubic polynomial whose coefficients are
- * provided in the device tree. The result is used to scale the static power
- * coefficient, where 1000000 means no change.
- *
- * Return: Temperature scaling factor. Range 0 <= ret <= 10,000,000.
- */
-static u32 calculate_temp_scaling_factor(s32 ts[4], s64 t)
-{
-	/* Range: -2^24 < t2 < 2^24 m(Deg^2) */
-	const s64 t2 = (t * t) / 1000;
-
-	/* Range: -2^31 < t3 < 2^31 m(Deg^3) */
-	const s64 t3 = (t * t2) / 1000;
-
-	/*
-	 * Sum the parts. t^[1-3] are in m(Deg^N), but the coefficients are in
-	 * Deg^-N, so we need to multiply the last coefficient by 1000.
-	 * Range: -2^63 < res_big < 2^63
-	 */
-	const s64 res_big = ts[3] * t3    /* +/- 2^62 */
-			  + ts[2] * t2    /* +/- 2^55 */
-			  + ts[1] * t     /* +/- 2^48 */
-			  + ts[0] * 1000; /* +/- 2^41 */
-
-	/* Range: -2^60 < res_unclamped < 2^60 */
-	s64 res_unclamped = res_big / 1000;
-
-	/* Clamp to range of 0x to 10x the static power */
-	return clamp(res_unclamped, (s64) 0, (s64) 10000000);
-}
-
-/* We can't call thermal_zone_get_temp() directly in model_static_coeff(),
- * because we don't know if tz->lock is held in the same thread. So poll it in
- * a separate thread to get around this. */
-static int poll_temperature(void *data)
-{
-	struct kbase_ipa_model_simple_data *model_data =
-			(struct kbase_ipa_model_simple_data *) data;
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)
-	unsigned long temp;
-#else
-	int temp;
-#endif
-
-	set_freezable();
-
-	while (!kthread_should_stop()) {
-		struct thermal_zone_device *tz = READ_ONCE(model_data->gpu_tz);
-
-		if (tz) {
-			int ret;
-
-			ret = thermal_zone_get_temp(tz, &temp);
-			if (ret) {
-				pr_warn_ratelimited("Error reading temperature for gpu thermal zone: %d\n",
-						    ret);
-				temp = FALLBACK_STATIC_TEMPERATURE;
-			}
-		} else {
-			temp = FALLBACK_STATIC_TEMPERATURE;
-		}
-
-		WRITE_ONCE(model_data->current_temperature, temp);
-
-		msleep_interruptible(READ_ONCE(model_data->temperature_poll_interval_ms));
-
-		try_to_freeze();
-	}
-
-	return 0;
-}
-
-static int model_static_coeff(struct kbase_ipa_model *model, u32 *coeffp)
-{
-	u32 temp_scaling_factor;
-	struct kbase_ipa_model_simple_data *model_data =
-		(struct kbase_ipa_model_simple_data *) model->model_data;
-	u64 coeff_big;
-	int temp;
-
-	temp = READ_ONCE(model_data->current_temperature);
-
-	/* Range: 0 <= temp_scaling_factor < 2^24 */
-	temp_scaling_factor = calculate_temp_scaling_factor(model_data->ts,
-							    temp);
-
-	/*
-	 * Range: 0 <= coeff_big < 2^52 to avoid overflowing *coeffp. This
-	 * means static_coefficient must be in range
-	 * 0 <= static_coefficient < 2^28.
-	 */
-	coeff_big = (u64) model_data->static_coefficient * (u64) temp_scaling_factor;
-	*coeffp = coeff_big / 1000000;
-
-	return 0;
-}
-
-static int model_dynamic_coeff(struct kbase_ipa_model *model, u32 *coeffp,
-			       u32 current_freq)
-{
-	struct kbase_ipa_model_simple_data *model_data =
-		(struct kbase_ipa_model_simple_data *) model->model_data;
-
-	*coeffp = model_data->dynamic_coefficient;
-
-	return 0;
-}
-
-static int add_params(struct kbase_ipa_model *model)
-{
-	int err = 0;
-	struct kbase_ipa_model_simple_data *model_data =
-			(struct kbase_ipa_model_simple_data *)model->model_data;
-
-	err = kbase_ipa_model_add_param_s32(model, "static-coefficient",
-					    &model_data->static_coefficient,
-					    1, true);
-	if (err)
-		goto end;
-
-	err = kbase_ipa_model_add_param_s32(model, "dynamic-coefficient",
-					    &model_data->dynamic_coefficient,
-					    1, true);
-	if (err)
-		goto end;
-
-	err = kbase_ipa_model_add_param_s32(model, "ts",
-					    model_data->ts, 4, true);
-	if (err)
-		goto end;
-
-	err = kbase_ipa_model_add_param_string(model, "thermal-zone",
-					       model_data->tz_name,
-					       sizeof(model_data->tz_name), true);
-	if (err)
-		goto end;
-
-	model_data->temperature_poll_interval_ms = 200;
-	err = kbase_ipa_model_add_param_s32(model, "temp-poll-interval-ms",
-					    &model_data->temperature_poll_interval_ms,
-					    1, false);
-
-end:
-	return err;
-}
-
-static int kbase_simple_power_model_init(struct kbase_ipa_model *model)
-{
-	int err;
-	struct kbase_ipa_model_simple_data *model_data;
-
-	model_data = kzalloc(sizeof(struct kbase_ipa_model_simple_data),
-			     GFP_KERNEL);
-	if (!model_data)
-		return -ENOMEM;
-
-	model->model_data = (void *) model_data;
-
-	model_data->current_temperature = FALLBACK_STATIC_TEMPERATURE;
-	model_data->poll_temperature_thread = kthread_run(poll_temperature,
-							  (void *) model_data,
-							  "mali-simple-power-model-temp-poll");
-	if (IS_ERR(model_data->poll_temperature_thread)) {
-		kfree(model_data);
-		return PTR_ERR(model_data->poll_temperature_thread);
-	}
-
-	err = add_params(model);
-	if (err) {
-		kbase_ipa_model_param_free_all(model);
-		kthread_stop(model_data->poll_temperature_thread);
-		kfree(model_data);
-	}
-
-	return err;
-}
-
-static int kbase_simple_power_model_recalculate(struct kbase_ipa_model *model)
-{
-	struct kbase_ipa_model_simple_data *model_data =
-			(struct kbase_ipa_model_simple_data *)model->model_data;
-	struct thermal_zone_device *tz;
-
-	if (!strnlen(model_data->tz_name, sizeof(model_data->tz_name))) {
-		tz = NULL;
-	} else {
-		tz = thermal_zone_get_zone_by_name(model_data->tz_name);
-
-		if (IS_ERR_OR_NULL(tz)) {
-			pr_warn_ratelimited("Error %ld getting thermal zone \'%s\', not yet ready?\n",
-					    PTR_ERR(tz), model_data->tz_name);
-			tz = NULL;
-			return -EPROBE_DEFER;
-		}
-	}
-
-	WRITE_ONCE(model_data->gpu_tz, tz);
-
-	return 0;
-}
-
-static void kbase_simple_power_model_term(struct kbase_ipa_model *model)
-{
-	struct kbase_ipa_model_simple_data *model_data =
-			(struct kbase_ipa_model_simple_data *)model->model_data;
-
-	kthread_stop(model_data->poll_temperature_thread);
-
-	kfree(model_data);
-}
-
-struct kbase_ipa_model_ops kbase_simple_ipa_model_ops = {
-		.name = "mali-simple-power-model",
-		.init = &kbase_simple_power_model_init,
-		.recalculate = &kbase_simple_power_model_recalculate,
-		.term = &kbase_simple_power_model_term,
-		.get_dynamic_coeff = &model_dynamic_coeff,
-		.get_static_coeff = &model_static_coeff,
-		.do_utilization_scaling_in_framework = true,
-};
diff --git a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_simple.h b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_simple.h
deleted file mode 100644
index 23cd55f5867d..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_simple.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KBASE_IPA_SIMPLE_H_
-#define _KBASE_IPA_SIMPLE_H_
-
-#if defined(CONFIG_MALI_BIFROST_DEVFREQ) && defined(CONFIG_DEVFREQ_THERMAL)
-
-extern struct kbase_ipa_model_ops kbase_simple_ipa_model_ops;
-
-#if MALI_UNIT_TEST
-/**
- * kbase_simple_power_model_set_dummy_temp() - set a dummy temperature value
- * @temp: Temperature of the thermal zone, in millidegrees celsius.
- *
- * This is only intended for use in unit tests, to ensure that the temperature
- * values used by the simple power model are predictable. Deterministic
- * behavior is necessary to allow validation of the static power values
- * computed by this model.
- */
-void kbase_simple_power_model_set_dummy_temp(int temp);
-#endif /* MALI_UNIT_TEST */
-
-#endif /* (defined(CONFIG_MALI_BIFROST_DEVFREQ) && defined(CONFIG_DEVFREQ_THERMAL)) */
-
-#endif /* _KBASE_IPA_SIMPLE_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_vinstr_common.c b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_vinstr_common.c
deleted file mode 100644
index b3d480030c2b..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_vinstr_common.c
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include "mali_kbase_ipa_vinstr_common.h"
-
-#if MALI_UNIT_TEST
-static ktime_t dummy_time;
-
-/* Intercept calls to the kernel function using a macro */
-#ifdef ktime_get
-#undef ktime_get
-#endif
-#define ktime_get() (READ_ONCE(dummy_time))
-
-void kbase_ipa_set_dummy_time(ktime_t t)
-{
-	WRITE_ONCE(dummy_time, t);
-}
-KBASE_EXPORT_TEST_API(kbase_ipa_set_dummy_time);
-
-#endif /* MALI_UNIT_TEST */
-
-/**
- * read_hwcnt() - read a counter value
- * @model_data:		pointer to model data
- * @offset:		offset, in bytes, into vinstr buffer
- *
- * Return: A 32-bit counter value. Range: 0 < value < 2^27 (worst case would be
- * incrementing every cycle over a ~100ms sample period at a high frequency,
- * e.g. 1 GHz: 2^30 * 0.1seconds ~= 2^27.
- */
-static inline u32 kbase_ipa_read_hwcnt(
-	struct kbase_ipa_model_vinstr_data *model_data,
-	u32 offset)
-{
-	u8 *p = model_data->vinstr_buffer;
-
-	return *(u32 *)&p[offset];
-}
-
-static inline s64 kbase_ipa_add_saturate(s64 a, s64 b)
-{
-	if (S64_MAX - a < b)
-		return S64_MAX;
-	return a + b;
-}
-
-s64 kbase_ipa_sum_all_shader_cores(
-	struct kbase_ipa_model_vinstr_data *model_data,
-	s32 coeff, u32 counter)
-{
-	struct kbase_device *kbdev = model_data->kbdev;
-	u64 core_mask;
-	u32 base = 0;
-	s64 ret = 0;
-
-	core_mask = kbdev->gpu_props.props.coherency_info.group[0].core_mask;
-	while (core_mask != 0ull) {
-		if ((core_mask & 1ull) != 0ull) {
-			/* 0 < counter_value < 2^27 */
-			u32 counter_value = kbase_ipa_read_hwcnt(model_data,
-						       base + counter);
-
-			/* 0 < ret < 2^27 * max_num_cores = 2^32 */
-			ret = kbase_ipa_add_saturate(ret, counter_value);
-		}
-		base += KBASE_IPA_NR_BYTES_PER_BLOCK;
-		core_mask >>= 1;
-	}
-
-	/* Range: -2^54 < ret < 2^54 */
-	ret *= coeff;
-
-	return ret / 1000000;
-}
-
-s64 kbase_ipa_single_counter(
-	struct kbase_ipa_model_vinstr_data *model_data,
-	s32 coeff, u32 counter)
-{
-	/* Range: 0 < counter_value < 2^27 */
-	const u32 counter_value = kbase_ipa_read_hwcnt(model_data, counter);
-
-	/* Range: -2^49 < ret < 2^49 */
-	const s64 multiplied = (s64) counter_value * (s64) coeff;
-
-	/* Range: -2^29 < return < 2^29 */
-	return multiplied / 1000000;
-}
-
-int kbase_ipa_attach_vinstr(struct kbase_ipa_model_vinstr_data *model_data)
-{
-	struct kbase_device *kbdev = model_data->kbdev;
-	struct kbase_uk_hwcnt_reader_setup setup;
-	size_t dump_size;
-
-	dump_size = kbase_vinstr_dump_size(kbdev);
-	model_data->vinstr_buffer = kzalloc(dump_size, GFP_KERNEL);
-	if (!model_data->vinstr_buffer) {
-		dev_err(kbdev->dev, "Failed to allocate IPA dump buffer");
-		return -1;
-	}
-
-	setup.jm_bm = ~0u;
-	setup.shader_bm = ~0u;
-	setup.tiler_bm = ~0u;
-	setup.mmu_l2_bm = ~0u;
-	model_data->vinstr_cli = kbase_vinstr_hwcnt_kernel_setup(kbdev->vinstr_ctx,
-			&setup, model_data->vinstr_buffer);
-	if (!model_data->vinstr_cli) {
-		dev_err(kbdev->dev, "Failed to register IPA with vinstr core");
-		kfree(model_data->vinstr_buffer);
-		model_data->vinstr_buffer = NULL;
-		return -1;
-	}
-
-	model_data->last_sample_read_time = ktime_get();
-	kbase_vinstr_hwc_clear(model_data->vinstr_cli);
-
-	return 0;
-}
-
-void kbase_ipa_detach_vinstr(struct kbase_ipa_model_vinstr_data *model_data)
-{
-	if (model_data->vinstr_cli)
-		kbase_vinstr_detach_client(model_data->vinstr_cli);
-	model_data->vinstr_cli = NULL;
-	kfree(model_data->vinstr_buffer);
-	model_data->vinstr_buffer = NULL;
-}
-
-int kbase_ipa_vinstr_dynamic_coeff(struct kbase_ipa_model *model, u32 *coeffp,
-	u32 current_freq)
-{
-	struct kbase_ipa_model_vinstr_data *model_data =
-			(struct kbase_ipa_model_vinstr_data *)model->model_data;
-	s64 energy = 0;
-	size_t i;
-	ktime_t now = ktime_get();
-	ktime_t time_since_last_sample =
-			ktime_sub(now, model_data->last_sample_read_time);
-	/* Range: 2^0 < time_since_last_sample_ms < 2^10 (1-1000ms) */
-	s64 time_since_last_sample_ms = ktime_to_ms(time_since_last_sample);
-	u64 coeff = 0;
-	u64 num_cycles;
-	int err = 0;
-
-	err = kbase_vinstr_hwc_dump(model_data->vinstr_cli,
-				    BASE_HWCNT_READER_EVENT_MANUAL);
-	if (err)
-		goto err0;
-
-	model_data->last_sample_read_time = now;
-
-	/* Range of 'energy' is +/- 2^34 * number of IPA groups, so around
-	 * -2^38 < energy < 2^38 */
-	for (i = 0; i < model_data->groups_def_num; i++) {
-		const struct kbase_ipa_group *group = &model_data->groups_def[i];
-		s32 coeff, group_energy;
-
-		coeff = model_data->group_values[i];
-		group_energy = group->op(model_data, coeff, group->counter);
-
-		energy = kbase_ipa_add_saturate(energy, group_energy);
-	}
-
-	/* Range: 0 <= coeff < 2^38 */
-	if (energy > 0)
-		coeff = energy;
-
-	/* Scale by user-specified factor and divide by 1000. But actually
-	 * cancel the division out, because we want the num_cycles in KHz and
-	 * don't want to lose precision. */
-
-	/* Range: 0 < coeff < 2^53 */
-	coeff = coeff * model_data->scaling_factor;
-
-	if (time_since_last_sample_ms == 0) {
-		time_since_last_sample_ms = 1;
-	} else if (time_since_last_sample_ms < 0) {
-		err = -ERANGE;
-		goto err0;
-	}
-
-	/* Range: 2^20 < num_cycles < 2^40 mCycles */
-	num_cycles = (u64) current_freq * (u64) time_since_last_sample_ms;
-	/* Range: 2^10 < num_cycles < 2^30 Cycles */
-	num_cycles /= 1000000;
-
-	/* num_cycles should never be 0 in _normal_ usage (because we expect
-	 * frequencies on the order of MHz and >10ms polling intervals), but
-	 * protect against divide-by-zero anyway. */
-	if (num_cycles == 0)
-		num_cycles = 1;
-
-	/* Range: 0 < coeff < 2^43 */
-	coeff = div_u64(coeff, num_cycles);
-
-err0:
-	/* Clamp to a sensible range - 2^16 gives about 14W at 400MHz/750mV */
-	*coeffp = clamp(coeff, (u64) 0, (u64) 1 << 16);
-	return err;
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_vinstr_common.h b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_vinstr_common.h
deleted file mode 100644
index 25b36c8e3089..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_vinstr_common.h
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KBASE_IPA_VINSTR_COMMON_H_
-#define _KBASE_IPA_VINSTR_COMMON_H_
-
-#include "mali_kbase.h"
-
-/* Maximum length for the name of an IPA group. */
-#define KBASE_IPA_MAX_GROUP_NAME_LEN 15
-
-/* Maximum number of IPA groups for an IPA model. */
-#define KBASE_IPA_MAX_GROUP_DEF_NUM  16
-
-/* Number of bytes per hardware counter in a vinstr_buffer. */
-#define KBASE_IPA_NR_BYTES_PER_CNT    4
-
-/* Number of hardware counters per block in a vinstr_buffer. */
-#define KBASE_IPA_NR_CNT_PER_BLOCK   64
-
-/* Number of bytes per block in a vinstr_buffer. */
-#define KBASE_IPA_NR_BYTES_PER_BLOCK \
-	(KBASE_IPA_NR_CNT_PER_BLOCK * KBASE_IPA_NR_BYTES_PER_CNT)
-
-
-
-/**
- * struct kbase_ipa_model_vinstr_data - IPA context per device
- * @kbdev:               pointer to kbase device
- * @groups_def:          Array of IPA groups.
- * @groups_def_num:      Number of elements in the array of IPA groups.
- * @vinstr_cli:          vinstr client handle
- * @vinstr_buffer:       buffer to dump hardware counters onto
- * @last_sample_read_time: timestamp of last vinstr buffer read
- * @scaling_factor:      user-specified power scaling factor. This is
- *                       interpreted as a fraction where the denominator is
- *                       1000. Range approx 0.0-32.0:
- *                       0 < scaling_factor < 2^15
- */
-struct kbase_ipa_model_vinstr_data {
-	struct kbase_device *kbdev;
-	s32 group_values[KBASE_IPA_MAX_GROUP_DEF_NUM];
-	const struct kbase_ipa_group *groups_def;
-	size_t groups_def_num;
-	struct kbase_vinstr_client *vinstr_cli;
-	void *vinstr_buffer;
-	ktime_t last_sample_read_time;
-	s32 scaling_factor;
-};
-
-/**
- * struct ipa_group - represents a single IPA group
- * @name:               name of the IPA group
- * @default_value:      default value of coefficient for IPA group.
- *                      Coefficients are interpreted as fractions where the
- *                      denominator is 1000000.
- * @op:                 which operation to be performed on the counter values
- * @counter:            counter used to calculate energy for IPA group
- */
-struct kbase_ipa_group {
-	char name[KBASE_IPA_MAX_GROUP_NAME_LEN + 1];
-	s32 default_value;
-	s64 (*op)(struct kbase_ipa_model_vinstr_data *, s32, u32);
-	u32 counter;
-};
-
-/*
- * sum_all_shader_cores() - sum a counter over all cores
- * @model_data		pointer to model data
- * @coeff		model coefficient. Unity is ~2^20, so range approx
- * +/- 4.0: -2^22 < coeff < 2^22
-
- * Calculate energy estimation based on hardware counter `counter'
- * across all shader cores.
- *
- * Return: Sum of counter values. Range: -2^34 < ret < 2^34
- */
-s64 kbase_ipa_sum_all_shader_cores(
-	struct kbase_ipa_model_vinstr_data *model_data,
-	s32 coeff, u32 counter);
-
-/*
- * sum_single_counter() - sum a single counter
- * @model_data		pointer to model data
- * @coeff		model coefficient. Unity is ~2^20, so range approx
- * +/- 4.0: -2^22 < coeff < 2^22
-
- * Calculate energy estimation based on hardware counter `counter'.
- *
- * Return: Counter value. Range: -2^34 < ret < 2^34
- */
-s64 kbase_ipa_single_counter(
-	struct kbase_ipa_model_vinstr_data *model_data,
-	s32 coeff, u32 counter);
-
-/*
- * attach_vinstr() - attach a vinstr_buffer to an IPA model.
- * @model_data		pointer to model data
- *
- * Attach a vinstr_buffer to an IPA model. The vinstr_buffer
- * allows access to the hardware counters used to calculate
- * energy consumption.
- *
- * Return: 0 on success, or an error code.
- */
-int kbase_ipa_attach_vinstr(struct kbase_ipa_model_vinstr_data *model_data);
-
-/*
- * detach_vinstr() - detach a vinstr_buffer from an IPA model.
- * @model_data		pointer to model data
- *
- * Detach a vinstr_buffer from an IPA model.
- */
-void kbase_ipa_detach_vinstr(struct kbase_ipa_model_vinstr_data *model_data);
-
-/**
- * kbase_ipa_vinstr_dynamic_coeff() - calculate dynamic power based on HW counters
- * @model:		pointer to instantiated model
- * @coeffp:		pointer to location where calculated power, in
- *			pW/(Hz V^2), is stored.
- * @current_freq:	frequency the GPU has been running at over the sample
- *			period. In Hz. Range: 10 MHz < 1GHz,
- *			2^20 < current_freq < 2^30
- *
- * This is a GPU-agnostic implementation of the get_dynamic_coeff()
- * function of an IPA model. It relies on the model being populated
- * with GPU-specific attributes at initialization time.
- *
- * Return: 0 on success, or an error code.
- */
-int kbase_ipa_vinstr_dynamic_coeff(struct kbase_ipa_model *model, u32 *coeffp,
-	u32 current_freq);
-
-#if MALI_UNIT_TEST
-/**
- * kbase_ipa_set_dummy_time() - set a dummy monotonic time value
- * @t: a monotonic time value
- *
- * This is only intended for use in unit tests, to ensure that the kernel time
- * values used by a power model are predictable. Deterministic behavior is
- * necessary to allow validation of the dynamic power values computed by the
- * model.
- */
-void kbase_ipa_set_dummy_time(ktime_t t);
-#endif /* MALI_UNIT_TEST */
-
-#endif /* _KBASE_IPA_VINSTR_COMMON_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_vinstr_g71.c b/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_vinstr_g71.c
deleted file mode 100644
index 81f6fddbd79b..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/ipa/mali_kbase_ipa_vinstr_g71.c
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2016-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-#include <linux/thermal.h>
-
-#include "mali_kbase_ipa_vinstr_common.h"
-#include "mali_kbase.h"
-#include "mali_kbase_ipa_debugfs.h"
-
-
-#define JM_BASE    (0 * KBASE_IPA_NR_BYTES_PER_BLOCK)
-#define TILER_BASE (1 * KBASE_IPA_NR_BYTES_PER_BLOCK)
-#define MMU_BASE   (2 * KBASE_IPA_NR_BYTES_PER_BLOCK)
-#define SC0_BASE   (3 * KBASE_IPA_NR_BYTES_PER_BLOCK)
-
-#define GPU_ACTIVE       (JM_BASE    + KBASE_IPA_NR_BYTES_PER_CNT *  6)
-#define TILER_ACTIVE     (TILER_BASE + KBASE_IPA_NR_BYTES_PER_CNT * 45)
-#define L2_ANY_LOOKUP    (MMU_BASE   + KBASE_IPA_NR_BYTES_PER_CNT * 25)
-#define FRAG_ACTIVE      (SC0_BASE   + KBASE_IPA_NR_BYTES_PER_CNT *  4)
-#define EXEC_CORE_ACTIVE (SC0_BASE   + KBASE_IPA_NR_BYTES_PER_CNT * 26)
-#define EXEC_INSTR_COUNT (SC0_BASE   + KBASE_IPA_NR_BYTES_PER_CNT * 28)
-#define TEX_COORD_ISSUE  (SC0_BASE   + KBASE_IPA_NR_BYTES_PER_CNT * 40)
-#define VARY_SLOT_32     (SC0_BASE   + KBASE_IPA_NR_BYTES_PER_CNT * 50)
-#define VARY_SLOT_16     (SC0_BASE   + KBASE_IPA_NR_BYTES_PER_CNT * 51)
-#define BEATS_RD_LSC     (SC0_BASE   + KBASE_IPA_NR_BYTES_PER_CNT * 56)
-#define BEATS_WR_LSC     (SC0_BASE   + KBASE_IPA_NR_BYTES_PER_CNT * 61)
-#define BEATS_WR_TIB     (SC0_BASE   + KBASE_IPA_NR_BYTES_PER_CNT * 62)
-
-static const struct kbase_ipa_group ipa_groups_def[] = {
-	{
-		.name = "l2_access",
-		.default_value = 526300,
-		.op = kbase_ipa_single_counter,
-		.counter = L2_ANY_LOOKUP,
-	},
-	{
-		.name = "exec_instr_count",
-		.default_value = 301100,
-		.op = kbase_ipa_sum_all_shader_cores,
-		.counter = EXEC_INSTR_COUNT,
-	},
-	{
-		.name = "tex_issue",
-		.default_value = 197400,
-		.op = kbase_ipa_sum_all_shader_cores,
-		.counter = TEX_COORD_ISSUE,
-	},
-	{
-		.name = "tile_wb",
-		.default_value = -156400,
-		.op = kbase_ipa_sum_all_shader_cores,
-		.counter = BEATS_WR_TIB,
-	},
-	{
-		.name = "gpu_active",
-		.default_value = 115800,
-		.op = kbase_ipa_single_counter,
-		.counter = GPU_ACTIVE,
-	},
-};
-
-static int kbase_g71_power_model_init(struct kbase_ipa_model *model)
-{
-	int i, err = 0;
-	struct kbase_ipa_model_vinstr_data *model_data;
-
-	model_data = kzalloc(sizeof(*model_data), GFP_KERNEL);
-	if (!model_data)
-		return -ENOMEM;
-
-	model_data->kbdev = model->kbdev;
-	model_data->groups_def = ipa_groups_def;
-	BUILD_BUG_ON(ARRAY_SIZE(ipa_groups_def) > KBASE_IPA_MAX_GROUP_DEF_NUM);
-	model_data->groups_def_num = ARRAY_SIZE(ipa_groups_def);
-
-	model->model_data = (void *) model_data;
-
-	for (i = 0; i < ARRAY_SIZE(ipa_groups_def); ++i) {
-		const struct kbase_ipa_group *group = &ipa_groups_def[i];
-
-		model_data->group_values[i] = group->default_value;
-		err = kbase_ipa_model_add_param_s32(model, group->name,
-					&model_data->group_values[i],
-					1, false);
-		if (err)
-			goto exit;
-	}
-
-	model_data->scaling_factor = 15000;
-	err = kbase_ipa_model_add_param_s32(model, "scale",
-					    &model_data->scaling_factor,
-					    1, false);
-	if (err)
-		goto exit;
-
-	err = kbase_ipa_attach_vinstr(model_data);
-
-exit:
-	if (err) {
-		kbase_ipa_model_param_free_all(model);
-		kfree(model_data);
-	}
-	return err;
-}
-
-static void kbase_g71_power_model_term(struct kbase_ipa_model *model)
-{
-	struct kbase_ipa_model_vinstr_data *model_data =
-			(struct kbase_ipa_model_vinstr_data *)model->model_data;
-
-	kbase_ipa_detach_vinstr(model_data);
-	kfree(model_data);
-}
-
-
-struct kbase_ipa_model_ops kbase_g71_ipa_model_ops = {
-		.name = "mali-g71-power-model",
-		.init = kbase_g71_power_model_init,
-		.term = kbase_g71_power_model_term,
-		.get_dynamic_coeff = kbase_ipa_vinstr_dynamic_coeff,
-		.do_utilization_scaling_in_framework = false,
-};
-KBASE_EXPORT_TEST_API(kbase_g71_ipa_model_ops);
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_base_hwconfig_features.h b/drivers/gpu/arm/bifrost_for_linux/mali_base_hwconfig_features.h
deleted file mode 100644
index 219586d4d2da..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_base_hwconfig_features.h
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2015-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/* AUTOMATICALLY GENERATED FILE. If you want to amend the issues/features,
- * please update base/tools/hwconfig_generator/hwc_{issues,features}.py
- * For more information see base/tools/hwconfig_generator/README
- */
-
-#ifndef _BASE_HWCONFIG_FEATURES_H_
-#define _BASE_HWCONFIG_FEATURES_H_
-
-enum base_hw_feature {
-	BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION,
-	BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS,
-	BASE_HW_FEATURE_33BIT_VA,
-	BASE_HW_FEATURE_XAFFINITY,
-	BASE_HW_FEATURE_OUT_OF_ORDER_EXEC,
-	BASE_HW_FEATURE_MRT,
-	BASE_HW_FEATURE_BRNDOUT_CC,
-	BASE_HW_FEATURE_INTERPIPE_REG_ALIASING,
-	BASE_HW_FEATURE_LD_ST_TILEBUFFER,
-	BASE_HW_FEATURE_MSAA_16X,
-	BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS,
-	BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL,
-	BASE_HW_FEATURE_OPTIMIZED_COVERAGE_MASK,
-	BASE_HW_FEATURE_T7XX_PAIRING_RULES,
-	BASE_HW_FEATURE_LD_ST_LEA_TEX,
-	BASE_HW_FEATURE_LINEAR_FILTER_FLOAT,
-	BASE_HW_FEATURE_WORKGROUP_ROUND_MULTIPLE_OF_4,
-	BASE_HW_FEATURE_IMAGES_IN_FRAGMENT_SHADERS,
-	BASE_HW_FEATURE_TEST4_DATUM_MODE,
-	BASE_HW_FEATURE_NEXT_INSTRUCTION_TYPE,
-	BASE_HW_FEATURE_BRNDOUT_KILL,
-	BASE_HW_FEATURE_WARPING,
-	BASE_HW_FEATURE_V4,
-	BASE_HW_FEATURE_FLUSH_REDUCTION,
-	BASE_HW_FEATURE_PROTECTED_MODE,
-	BASE_HW_FEATURE_COHERENCY_REG,
-	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
-	BASE_HW_FEATURE_AARCH64_MMU,
-	BASE_HW_FEATURE_TLS_HASHING,
-	BASE_HW_FEATURE_END
-};
-
-static const enum base_hw_feature base_hw_features_generic[] = {
-	BASE_HW_FEATURE_END
-};
-
-static const enum base_hw_feature base_hw_features_t60x[] = {
-	BASE_HW_FEATURE_LD_ST_LEA_TEX,
-	BASE_HW_FEATURE_LINEAR_FILTER_FLOAT,
-	BASE_HW_FEATURE_V4,
-	BASE_HW_FEATURE_END
-};
-
-static const enum base_hw_feature base_hw_features_t62x[] = {
-	BASE_HW_FEATURE_LD_ST_LEA_TEX,
-	BASE_HW_FEATURE_LINEAR_FILTER_FLOAT,
-	BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL,
-	BASE_HW_FEATURE_V4,
-	BASE_HW_FEATURE_END
-};
-
-static const enum base_hw_feature base_hw_features_t72x[] = {
-	BASE_HW_FEATURE_33BIT_VA,
-	BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS,
-	BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL,
-	BASE_HW_FEATURE_INTERPIPE_REG_ALIASING,
-	BASE_HW_FEATURE_OPTIMIZED_COVERAGE_MASK,
-	BASE_HW_FEATURE_T7XX_PAIRING_RULES,
-	BASE_HW_FEATURE_WORKGROUP_ROUND_MULTIPLE_OF_4,
-	BASE_HW_FEATURE_WARPING,
-	BASE_HW_FEATURE_V4,
-	BASE_HW_FEATURE_END
-};
-
-static const enum base_hw_feature base_hw_features_t76x[] = {
-	BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION,
-	BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS,
-	BASE_HW_FEATURE_XAFFINITY,
-	BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS,
-	BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL,
-	BASE_HW_FEATURE_BRNDOUT_CC,
-	BASE_HW_FEATURE_LD_ST_LEA_TEX,
-	BASE_HW_FEATURE_LD_ST_TILEBUFFER,
-	BASE_HW_FEATURE_LINEAR_FILTER_FLOAT,
-	BASE_HW_FEATURE_MRT,
-	BASE_HW_FEATURE_MSAA_16X,
-	BASE_HW_FEATURE_OUT_OF_ORDER_EXEC,
-	BASE_HW_FEATURE_T7XX_PAIRING_RULES,
-	BASE_HW_FEATURE_TEST4_DATUM_MODE,
-	BASE_HW_FEATURE_END
-};
-
-static const enum base_hw_feature base_hw_features_tFxx[] = {
-	BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION,
-	BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS,
-	BASE_HW_FEATURE_XAFFINITY,
-	BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS,
-	BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL,
-	BASE_HW_FEATURE_BRNDOUT_CC,
-	BASE_HW_FEATURE_BRNDOUT_KILL,
-	BASE_HW_FEATURE_LD_ST_LEA_TEX,
-	BASE_HW_FEATURE_LD_ST_TILEBUFFER,
-	BASE_HW_FEATURE_LINEAR_FILTER_FLOAT,
-	BASE_HW_FEATURE_MRT,
-	BASE_HW_FEATURE_MSAA_16X,
-	BASE_HW_FEATURE_NEXT_INSTRUCTION_TYPE,
-	BASE_HW_FEATURE_OUT_OF_ORDER_EXEC,
-	BASE_HW_FEATURE_T7XX_PAIRING_RULES,
-	BASE_HW_FEATURE_TEST4_DATUM_MODE,
-	BASE_HW_FEATURE_END
-};
-
-static const enum base_hw_feature base_hw_features_t83x[] = {
-	BASE_HW_FEATURE_33BIT_VA,
-	BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION,
-	BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS,
-	BASE_HW_FEATURE_XAFFINITY,
-	BASE_HW_FEATURE_WARPING,
-	BASE_HW_FEATURE_INTERPIPE_REG_ALIASING,
-	BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS,
-	BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL,
-	BASE_HW_FEATURE_BRNDOUT_CC,
-	BASE_HW_FEATURE_BRNDOUT_KILL,
-	BASE_HW_FEATURE_LD_ST_LEA_TEX,
-	BASE_HW_FEATURE_LD_ST_TILEBUFFER,
-	BASE_HW_FEATURE_LINEAR_FILTER_FLOAT,
-	BASE_HW_FEATURE_MRT,
-	BASE_HW_FEATURE_NEXT_INSTRUCTION_TYPE,
-	BASE_HW_FEATURE_OUT_OF_ORDER_EXEC,
-	BASE_HW_FEATURE_T7XX_PAIRING_RULES,
-	BASE_HW_FEATURE_TEST4_DATUM_MODE,
-	BASE_HW_FEATURE_END
-};
-
-static const enum base_hw_feature base_hw_features_t82x[] = {
-	BASE_HW_FEATURE_33BIT_VA,
-	BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION,
-	BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS,
-	BASE_HW_FEATURE_XAFFINITY,
-	BASE_HW_FEATURE_WARPING,
-	BASE_HW_FEATURE_INTERPIPE_REG_ALIASING,
-	BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS,
-	BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL,
-	BASE_HW_FEATURE_BRNDOUT_CC,
-	BASE_HW_FEATURE_BRNDOUT_KILL,
-	BASE_HW_FEATURE_LD_ST_LEA_TEX,
-	BASE_HW_FEATURE_LD_ST_TILEBUFFER,
-	BASE_HW_FEATURE_LINEAR_FILTER_FLOAT,
-	BASE_HW_FEATURE_MRT,
-	BASE_HW_FEATURE_NEXT_INSTRUCTION_TYPE,
-	BASE_HW_FEATURE_OUT_OF_ORDER_EXEC,
-	BASE_HW_FEATURE_T7XX_PAIRING_RULES,
-	BASE_HW_FEATURE_TEST4_DATUM_MODE,
-	BASE_HW_FEATURE_END
-};
-
-static const enum base_hw_feature base_hw_features_tMIx[] = {
-	BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION,
-	BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS,
-	BASE_HW_FEATURE_XAFFINITY,
-	BASE_HW_FEATURE_WARPING,
-	BASE_HW_FEATURE_INTERPIPE_REG_ALIASING,
-	BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS,
-	BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL,
-	BASE_HW_FEATURE_BRNDOUT_CC,
-	BASE_HW_FEATURE_BRNDOUT_KILL,
-	BASE_HW_FEATURE_LD_ST_LEA_TEX,
-	BASE_HW_FEATURE_LD_ST_TILEBUFFER,
-	BASE_HW_FEATURE_LINEAR_FILTER_FLOAT,
-	BASE_HW_FEATURE_MRT,
-	BASE_HW_FEATURE_MSAA_16X,
-	BASE_HW_FEATURE_NEXT_INSTRUCTION_TYPE,
-	BASE_HW_FEATURE_OUT_OF_ORDER_EXEC,
-	BASE_HW_FEATURE_T7XX_PAIRING_RULES,
-	BASE_HW_FEATURE_TEST4_DATUM_MODE,
-	BASE_HW_FEATURE_FLUSH_REDUCTION,
-	BASE_HW_FEATURE_PROTECTED_MODE,
-	BASE_HW_FEATURE_COHERENCY_REG,
-	BASE_HW_FEATURE_END
-};
-
-static const enum base_hw_feature base_hw_features_tHEx[] = {
-	BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION,
-	BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS,
-	BASE_HW_FEATURE_XAFFINITY,
-	BASE_HW_FEATURE_WARPING,
-	BASE_HW_FEATURE_INTERPIPE_REG_ALIASING,
-	BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS,
-	BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL,
-	BASE_HW_FEATURE_BRNDOUT_CC,
-	BASE_HW_FEATURE_BRNDOUT_KILL,
-	BASE_HW_FEATURE_LD_ST_LEA_TEX,
-	BASE_HW_FEATURE_LD_ST_TILEBUFFER,
-	BASE_HW_FEATURE_LINEAR_FILTER_FLOAT,
-	BASE_HW_FEATURE_MRT,
-	BASE_HW_FEATURE_MSAA_16X,
-	BASE_HW_FEATURE_NEXT_INSTRUCTION_TYPE,
-	BASE_HW_FEATURE_OUT_OF_ORDER_EXEC,
-	BASE_HW_FEATURE_T7XX_PAIRING_RULES,
-	BASE_HW_FEATURE_TEST4_DATUM_MODE,
-	BASE_HW_FEATURE_FLUSH_REDUCTION,
-	BASE_HW_FEATURE_PROTECTED_MODE,
-	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
-	BASE_HW_FEATURE_COHERENCY_REG,
-	BASE_HW_FEATURE_END
-};
-
-static const enum base_hw_feature base_hw_features_tSIx[] = {
-	BASE_HW_FEATURE_33BIT_VA,
-	BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION,
-	BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS,
-	BASE_HW_FEATURE_XAFFINITY,
-	BASE_HW_FEATURE_WARPING,
-	BASE_HW_FEATURE_INTERPIPE_REG_ALIASING,
-	BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS,
-	BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL,
-	BASE_HW_FEATURE_BRNDOUT_CC,
-	BASE_HW_FEATURE_BRNDOUT_KILL,
-	BASE_HW_FEATURE_LD_ST_LEA_TEX,
-	BASE_HW_FEATURE_LD_ST_TILEBUFFER,
-	BASE_HW_FEATURE_LINEAR_FILTER_FLOAT,
-	BASE_HW_FEATURE_MRT,
-	BASE_HW_FEATURE_MSAA_16X,
-	BASE_HW_FEATURE_NEXT_INSTRUCTION_TYPE,
-	BASE_HW_FEATURE_OUT_OF_ORDER_EXEC,
-	BASE_HW_FEATURE_T7XX_PAIRING_RULES,
-	BASE_HW_FEATURE_TEST4_DATUM_MODE,
-	BASE_HW_FEATURE_FLUSH_REDUCTION,
-	BASE_HW_FEATURE_PROTECTED_MODE,
-	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
-	BASE_HW_FEATURE_COHERENCY_REG,
-	BASE_HW_FEATURE_END
-};
-
-static const enum base_hw_feature base_hw_features_tDVx[] = {
-	BASE_HW_FEATURE_33BIT_VA,
-	BASE_HW_FEATURE_JOBCHAIN_DISAMBIGUATION,
-	BASE_HW_FEATURE_PWRON_DURING_PWROFF_TRANS,
-	BASE_HW_FEATURE_XAFFINITY,
-	BASE_HW_FEATURE_WARPING,
-	BASE_HW_FEATURE_INTERPIPE_REG_ALIASING,
-	BASE_HW_FEATURE_32_BIT_UNIFORM_ADDRESS,
-	BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL,
-	BASE_HW_FEATURE_BRNDOUT_CC,
-	BASE_HW_FEATURE_BRNDOUT_KILL,
-	BASE_HW_FEATURE_LD_ST_LEA_TEX,
-	BASE_HW_FEATURE_LD_ST_TILEBUFFER,
-	BASE_HW_FEATURE_LINEAR_FILTER_FLOAT,
-	BASE_HW_FEATURE_MRT,
-	BASE_HW_FEATURE_MSAA_16X,
-	BASE_HW_FEATURE_NEXT_INSTRUCTION_TYPE,
-	BASE_HW_FEATURE_OUT_OF_ORDER_EXEC,
-	BASE_HW_FEATURE_T7XX_PAIRING_RULES,
-	BASE_HW_FEATURE_TEST4_DATUM_MODE,
-	BASE_HW_FEATURE_FLUSH_REDUCTION,
-	BASE_HW_FEATURE_PROTECTED_MODE,
-	BASE_HW_FEATURE_PROTECTED_DEBUG_MODE,
-	BASE_HW_FEATURE_COHERENCY_REG,
-	BASE_HW_FEATURE_END
-};
-
-
-
-
-
-#endif /* _BASE_HWCONFIG_FEATURES_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_base_hwconfig_issues.h b/drivers/gpu/arm/bifrost_for_linux/mali_base_hwconfig_issues.h
deleted file mode 100644
index 1c5ee496ac85..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_base_hwconfig_issues.h
+++ /dev/null
@@ -1,1126 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2015-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/* AUTOMATICALLY GENERATED FILE. If you want to amend the issues/features,
- * please update base/tools/hwconfig_generator/hwc_{issues,features}.py
- * For more information see base/tools/hwconfig_generator/README
- */
-
-#ifndef _BASE_HWCONFIG_ISSUES_H_
-#define _BASE_HWCONFIG_ISSUES_H_
-
-enum base_hw_issue {
-	BASE_HW_ISSUE_5736,
-	BASE_HW_ISSUE_6367,
-	BASE_HW_ISSUE_6398,
-	BASE_HW_ISSUE_6402,
-	BASE_HW_ISSUE_6787,
-	BASE_HW_ISSUE_7027,
-	BASE_HW_ISSUE_7144,
-	BASE_HW_ISSUE_7304,
-	BASE_HW_ISSUE_8073,
-	BASE_HW_ISSUE_8186,
-	BASE_HW_ISSUE_8215,
-	BASE_HW_ISSUE_8245,
-	BASE_HW_ISSUE_8250,
-	BASE_HW_ISSUE_8260,
-	BASE_HW_ISSUE_8280,
-	BASE_HW_ISSUE_8316,
-	BASE_HW_ISSUE_8381,
-	BASE_HW_ISSUE_8394,
-	BASE_HW_ISSUE_8401,
-	BASE_HW_ISSUE_8408,
-	BASE_HW_ISSUE_8443,
-	BASE_HW_ISSUE_8456,
-	BASE_HW_ISSUE_8564,
-	BASE_HW_ISSUE_8634,
-	BASE_HW_ISSUE_8778,
-	BASE_HW_ISSUE_8791,
-	BASE_HW_ISSUE_8833,
-	BASE_HW_ISSUE_8879,
-	BASE_HW_ISSUE_8896,
-	BASE_HW_ISSUE_8975,
-	BASE_HW_ISSUE_8986,
-	BASE_HW_ISSUE_8987,
-	BASE_HW_ISSUE_9010,
-	BASE_HW_ISSUE_9418,
-	BASE_HW_ISSUE_9423,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_9510,
-	BASE_HW_ISSUE_9566,
-	BASE_HW_ISSUE_9630,
-	BASE_HW_ISSUE_10127,
-	BASE_HW_ISSUE_10327,
-	BASE_HW_ISSUE_10410,
-	BASE_HW_ISSUE_10471,
-	BASE_HW_ISSUE_10472,
-	BASE_HW_ISSUE_10487,
-	BASE_HW_ISSUE_10607,
-	BASE_HW_ISSUE_10632,
-	BASE_HW_ISSUE_10649,
-	BASE_HW_ISSUE_10676,
-	BASE_HW_ISSUE_10682,
-	BASE_HW_ISSUE_10684,
-	BASE_HW_ISSUE_10797,
-	BASE_HW_ISSUE_10817,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10931,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_10959,
-	BASE_HW_ISSUE_10969,
-	BASE_HW_ISSUE_10984,
-	BASE_HW_ISSUE_10995,
-	BASE_HW_ISSUE_11012,
-	BASE_HW_ISSUE_11020,
-	BASE_HW_ISSUE_11024,
-	BASE_HW_ISSUE_11035,
-	BASE_HW_ISSUE_11042,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T720_1386,
-	BASE_HW_ISSUE_T76X_26,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3542,
-	BASE_HW_ISSUE_T76X_3556,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3953,
-	BASE_HW_ISSUE_T76X_3960,
-	BASE_HW_ISSUE_T76X_3964,
-	BASE_HW_ISSUE_T76X_3966,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_7940,
-	BASE_HW_ISSUE_TMIX_8042,
-	BASE_HW_ISSUE_TMIX_8133,
-	BASE_HW_ISSUE_TMIX_8138,
-	BASE_HW_ISSUE_TMIX_8206,
-	BASE_HW_ISSUE_TMIX_8343,
-	BASE_HW_ISSUE_TMIX_8463,
-	BASE_HW_ISSUE_TMIX_8456,
-	GPUCORE_1619,
-	BASE_HW_ISSUE_TSIX_1116,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_generic[] = {
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t60x_r0p0_15dev0[] = {
-	BASE_HW_ISSUE_6367,
-	BASE_HW_ISSUE_6398,
-	BASE_HW_ISSUE_6402,
-	BASE_HW_ISSUE_6787,
-	BASE_HW_ISSUE_7027,
-	BASE_HW_ISSUE_7144,
-	BASE_HW_ISSUE_7304,
-	BASE_HW_ISSUE_8073,
-	BASE_HW_ISSUE_8186,
-	BASE_HW_ISSUE_8215,
-	BASE_HW_ISSUE_8245,
-	BASE_HW_ISSUE_8250,
-	BASE_HW_ISSUE_8260,
-	BASE_HW_ISSUE_8280,
-	BASE_HW_ISSUE_8316,
-	BASE_HW_ISSUE_8381,
-	BASE_HW_ISSUE_8394,
-	BASE_HW_ISSUE_8401,
-	BASE_HW_ISSUE_8408,
-	BASE_HW_ISSUE_8443,
-	BASE_HW_ISSUE_8456,
-	BASE_HW_ISSUE_8564,
-	BASE_HW_ISSUE_8634,
-	BASE_HW_ISSUE_8778,
-	BASE_HW_ISSUE_8791,
-	BASE_HW_ISSUE_8833,
-	BASE_HW_ISSUE_8896,
-	BASE_HW_ISSUE_8975,
-	BASE_HW_ISSUE_8986,
-	BASE_HW_ISSUE_8987,
-	BASE_HW_ISSUE_9010,
-	BASE_HW_ISSUE_9418,
-	BASE_HW_ISSUE_9423,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_9510,
-	BASE_HW_ISSUE_9566,
-	BASE_HW_ISSUE_9630,
-	BASE_HW_ISSUE_10410,
-	BASE_HW_ISSUE_10471,
-	BASE_HW_ISSUE_10472,
-	BASE_HW_ISSUE_10487,
-	BASE_HW_ISSUE_10607,
-	BASE_HW_ISSUE_10632,
-	BASE_HW_ISSUE_10649,
-	BASE_HW_ISSUE_10676,
-	BASE_HW_ISSUE_10682,
-	BASE_HW_ISSUE_10684,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10931,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_10969,
-	BASE_HW_ISSUE_10984,
-	BASE_HW_ISSUE_10995,
-	BASE_HW_ISSUE_11012,
-	BASE_HW_ISSUE_11020,
-	BASE_HW_ISSUE_11035,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_3964,
-	GPUCORE_1619,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t60x_r0p0_eac[] = {
-	BASE_HW_ISSUE_6367,
-	BASE_HW_ISSUE_6402,
-	BASE_HW_ISSUE_6787,
-	BASE_HW_ISSUE_7027,
-	BASE_HW_ISSUE_7304,
-	BASE_HW_ISSUE_8408,
-	BASE_HW_ISSUE_8564,
-	BASE_HW_ISSUE_8778,
-	BASE_HW_ISSUE_8975,
-	BASE_HW_ISSUE_9010,
-	BASE_HW_ISSUE_9418,
-	BASE_HW_ISSUE_9423,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_9510,
-	BASE_HW_ISSUE_10410,
-	BASE_HW_ISSUE_10471,
-	BASE_HW_ISSUE_10472,
-	BASE_HW_ISSUE_10487,
-	BASE_HW_ISSUE_10607,
-	BASE_HW_ISSUE_10632,
-	BASE_HW_ISSUE_10649,
-	BASE_HW_ISSUE_10676,
-	BASE_HW_ISSUE_10682,
-	BASE_HW_ISSUE_10684,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10931,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_10969,
-	BASE_HW_ISSUE_11012,
-	BASE_HW_ISSUE_11020,
-	BASE_HW_ISSUE_11035,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_3964,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t60x_r0p1[] = {
-	BASE_HW_ISSUE_6367,
-	BASE_HW_ISSUE_6402,
-	BASE_HW_ISSUE_6787,
-	BASE_HW_ISSUE_7027,
-	BASE_HW_ISSUE_7304,
-	BASE_HW_ISSUE_8408,
-	BASE_HW_ISSUE_8564,
-	BASE_HW_ISSUE_8778,
-	BASE_HW_ISSUE_8975,
-	BASE_HW_ISSUE_9010,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_9510,
-	BASE_HW_ISSUE_10410,
-	BASE_HW_ISSUE_10471,
-	BASE_HW_ISSUE_10472,
-	BASE_HW_ISSUE_10487,
-	BASE_HW_ISSUE_10607,
-	BASE_HW_ISSUE_10632,
-	BASE_HW_ISSUE_10649,
-	BASE_HW_ISSUE_10676,
-	BASE_HW_ISSUE_10682,
-	BASE_HW_ISSUE_10684,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10931,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11012,
-	BASE_HW_ISSUE_11020,
-	BASE_HW_ISSUE_11035,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3964,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t62x_r0p1[] = {
-	BASE_HW_ISSUE_6402,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10127,
-	BASE_HW_ISSUE_10327,
-	BASE_HW_ISSUE_10410,
-	BASE_HW_ISSUE_10471,
-	BASE_HW_ISSUE_10472,
-	BASE_HW_ISSUE_10487,
-	BASE_HW_ISSUE_10607,
-	BASE_HW_ISSUE_10632,
-	BASE_HW_ISSUE_10649,
-	BASE_HW_ISSUE_10676,
-	BASE_HW_ISSUE_10682,
-	BASE_HW_ISSUE_10684,
-	BASE_HW_ISSUE_10817,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10931,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_10959,
-	BASE_HW_ISSUE_11012,
-	BASE_HW_ISSUE_11020,
-	BASE_HW_ISSUE_11024,
-	BASE_HW_ISSUE_11035,
-	BASE_HW_ISSUE_11042,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t62x_r1p0[] = {
-	BASE_HW_ISSUE_6402,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10471,
-	BASE_HW_ISSUE_10472,
-	BASE_HW_ISSUE_10649,
-	BASE_HW_ISSUE_10684,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10931,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_10959,
-	BASE_HW_ISSUE_11012,
-	BASE_HW_ISSUE_11020,
-	BASE_HW_ISSUE_11024,
-	BASE_HW_ISSUE_11042,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3964,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t62x_r1p1[] = {
-	BASE_HW_ISSUE_6402,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10471,
-	BASE_HW_ISSUE_10472,
-	BASE_HW_ISSUE_10649,
-	BASE_HW_ISSUE_10684,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10931,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_10959,
-	BASE_HW_ISSUE_11012,
-	BASE_HW_ISSUE_11042,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t76x_r0p0[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11020,
-	BASE_HW_ISSUE_11024,
-	BASE_HW_ISSUE_11042,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T76X_26,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3542,
-	BASE_HW_ISSUE_T76X_3556,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3953,
-	BASE_HW_ISSUE_T76X_3960,
-	BASE_HW_ISSUE_T76X_3964,
-	BASE_HW_ISSUE_T76X_3966,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t76x_r0p1[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11020,
-	BASE_HW_ISSUE_11024,
-	BASE_HW_ISSUE_11042,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T76X_26,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3542,
-	BASE_HW_ISSUE_T76X_3556,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3953,
-	BASE_HW_ISSUE_T76X_3960,
-	BASE_HW_ISSUE_T76X_3964,
-	BASE_HW_ISSUE_T76X_3966,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t76x_r0p1_50rel0[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11042,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T76X_26,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3542,
-	BASE_HW_ISSUE_T76X_3556,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3953,
-	BASE_HW_ISSUE_T76X_3960,
-	BASE_HW_ISSUE_T76X_3964,
-	BASE_HW_ISSUE_T76X_3966,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t76x_r0p2[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11020,
-	BASE_HW_ISSUE_11024,
-	BASE_HW_ISSUE_11042,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T76X_26,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3542,
-	BASE_HW_ISSUE_T76X_3556,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3953,
-	BASE_HW_ISSUE_T76X_3960,
-	BASE_HW_ISSUE_T76X_3964,
-	BASE_HW_ISSUE_T76X_3966,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t76x_r0p3[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11042,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T76X_26,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3542,
-	BASE_HW_ISSUE_T76X_3556,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3953,
-	BASE_HW_ISSUE_T76X_3960,
-	BASE_HW_ISSUE_T76X_3964,
-	BASE_HW_ISSUE_T76X_3966,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t76x_r1p0[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11042,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3953,
-	BASE_HW_ISSUE_T76X_3960,
-	BASE_HW_ISSUE_T76X_3964,
-	BASE_HW_ISSUE_T76X_3966,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t72x_r0p0[] = {
-	BASE_HW_ISSUE_6402,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10471,
-	BASE_HW_ISSUE_10649,
-	BASE_HW_ISSUE_10684,
-	BASE_HW_ISSUE_10797,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11042,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3964,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t72x_r1p0[] = {
-	BASE_HW_ISSUE_6402,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10471,
-	BASE_HW_ISSUE_10649,
-	BASE_HW_ISSUE_10684,
-	BASE_HW_ISSUE_10797,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11042,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T720_1386,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3964,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t72x_r1p1[] = {
-	BASE_HW_ISSUE_6402,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10471,
-	BASE_HW_ISSUE_10649,
-	BASE_HW_ISSUE_10684,
-	BASE_HW_ISSUE_10797,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11042,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T720_1386,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3964,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_model_t72x[] = {
-	BASE_HW_ISSUE_5736,
-	BASE_HW_ISSUE_6402,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10471,
-	BASE_HW_ISSUE_10649,
-	BASE_HW_ISSUE_10797,
-	BASE_HW_ISSUE_11042,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3964,
-	GPUCORE_1619,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_model_t76x[] = {
-	BASE_HW_ISSUE_5736,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_11020,
-	BASE_HW_ISSUE_11024,
-	BASE_HW_ISSUE_11042,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3964,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	GPUCORE_1619,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_model_t60x[] = {
-	BASE_HW_ISSUE_5736,
-	BASE_HW_ISSUE_6402,
-	BASE_HW_ISSUE_8778,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10472,
-	BASE_HW_ISSUE_10649,
-	BASE_HW_ISSUE_10931,
-	BASE_HW_ISSUE_11012,
-	BASE_HW_ISSUE_11020,
-	BASE_HW_ISSUE_11024,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3964,
-	GPUCORE_1619,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_model_t62x[] = {
-	BASE_HW_ISSUE_5736,
-	BASE_HW_ISSUE_6402,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10472,
-	BASE_HW_ISSUE_10649,
-	BASE_HW_ISSUE_10931,
-	BASE_HW_ISSUE_11012,
-	BASE_HW_ISSUE_11020,
-	BASE_HW_ISSUE_11024,
-	BASE_HW_ISSUE_11042,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3964,
-	GPUCORE_1619,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_tFRx_r0p1[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3953,
-	BASE_HW_ISSUE_T76X_3960,
-	BASE_HW_ISSUE_T76X_3964,
-	BASE_HW_ISSUE_T76X_3966,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_tFRx_r0p2[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3953,
-	BASE_HW_ISSUE_T76X_3964,
-	BASE_HW_ISSUE_T76X_3966,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_tFRx_r1p0[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3953,
-	BASE_HW_ISSUE_T76X_3966,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_tFRx_r2p0[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3953,
-	BASE_HW_ISSUE_T76X_3966,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_model_tFRx[] = {
-	BASE_HW_ISSUE_5736,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3964,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	GPUCORE_1619,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t86x_r0p2[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3953,
-	BASE_HW_ISSUE_T76X_3964,
-	BASE_HW_ISSUE_T76X_3966,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t86x_r1p0[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3953,
-	BASE_HW_ISSUE_T76X_3966,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t86x_r2p0[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3953,
-	BASE_HW_ISSUE_T76X_3966,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_model_t86x[] = {
-	BASE_HW_ISSUE_5736,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	GPUCORE_1619,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t83x_r0p1[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T720_1386,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3953,
-	BASE_HW_ISSUE_T76X_3960,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t83x_r1p0[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T720_1386,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3953,
-	BASE_HW_ISSUE_T76X_3960,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_model_t83x[] = {
-	BASE_HW_ISSUE_5736,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3964,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	GPUCORE_1619,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t82x_r0p0[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T720_1386,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3953,
-	BASE_HW_ISSUE_T76X_3960,
-	BASE_HW_ISSUE_T76X_3964,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t82x_r0p1[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T720_1386,
-	BASE_HW_ISSUE_T76X_1909,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3953,
-	BASE_HW_ISSUE_T76X_3960,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_t82x_r1p0[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10821,
-	BASE_HW_ISSUE_10883,
-	BASE_HW_ISSUE_10946,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T720_1386,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3953,
-	BASE_HW_ISSUE_T76X_3960,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_model_t82x[] = {
-	BASE_HW_ISSUE_5736,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_11051,
-	BASE_HW_ISSUE_T76X_1963,
-	BASE_HW_ISSUE_T76X_3086,
-	BASE_HW_ISSUE_T76X_3700,
-	BASE_HW_ISSUE_T76X_3793,
-	BASE_HW_ISSUE_T76X_3979,
-	BASE_HW_ISSUE_TMIX_7891,
-	GPUCORE_1619,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_tMIx_r0p0_05dev0[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10682,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_T76X_3953,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8042,
-	BASE_HW_ISSUE_TMIX_8133,
-	BASE_HW_ISSUE_TMIX_8138,
-	BASE_HW_ISSUE_TMIX_8206,
-	BASE_HW_ISSUE_TMIX_8343,
-	BASE_HW_ISSUE_TMIX_8463,
-	BASE_HW_ISSUE_TMIX_8456,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_tMIx_r0p0[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10682,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_7940,
-	BASE_HW_ISSUE_TMIX_8042,
-	BASE_HW_ISSUE_TMIX_8133,
-	BASE_HW_ISSUE_TMIX_8138,
-	BASE_HW_ISSUE_TMIX_8206,
-	BASE_HW_ISSUE_TMIX_8343,
-	BASE_HW_ISSUE_TMIX_8463,
-	BASE_HW_ISSUE_TMIX_8456,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_tMIx_r0p1[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10682,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_7940,
-	BASE_HW_ISSUE_TMIX_8042,
-	BASE_HW_ISSUE_TMIX_8133,
-	BASE_HW_ISSUE_TMIX_8138,
-	BASE_HW_ISSUE_TMIX_8206,
-	BASE_HW_ISSUE_TMIX_8343,
-	BASE_HW_ISSUE_TMIX_8463,
-	BASE_HW_ISSUE_TMIX_8456,
-	BASE_HW_ISSUE_TMIX_8438,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_model_tMIx[] = {
-	BASE_HW_ISSUE_5736,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_7940,
-	BASE_HW_ISSUE_TMIX_8042,
-	BASE_HW_ISSUE_TMIX_8133,
-	BASE_HW_ISSUE_TMIX_8138,
-	BASE_HW_ISSUE_TMIX_8206,
-	BASE_HW_ISSUE_TMIX_8343,
-	BASE_HW_ISSUE_TMIX_8456,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_tHEx_r0p0[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10682,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8042,
-	BASE_HW_ISSUE_TMIX_8133,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_tHEx_r0p1[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10682,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8042,
-	BASE_HW_ISSUE_TMIX_8133,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_tHEx_r0p2[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10682,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8042,
-	BASE_HW_ISSUE_TMIX_8133,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_tHEx_r0p3[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_10682,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8042,
-	BASE_HW_ISSUE_TMIX_8133,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_model_tHEx[] = {
-	BASE_HW_ISSUE_5736,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_TMIX_7891,
-	BASE_HW_ISSUE_TMIX_8042,
-	BASE_HW_ISSUE_TMIX_8133,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_tSIx_r0p0[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_TMIX_8133,
-	BASE_HW_ISSUE_TSIX_1116,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_tSIx_r0p1[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_TMIX_8133,
-	BASE_HW_ISSUE_TSIX_1116,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_tSIx_r1p0[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_TMIX_8133,
-	BASE_HW_ISSUE_TSIX_1116,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_tSIx_r1p1[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_TMIX_8133,
-	BASE_HW_ISSUE_TSIX_1116,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_model_tSIx[] = {
-	BASE_HW_ISSUE_5736,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_TMIX_8133,
-	BASE_HW_ISSUE_TSIX_1116,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_tDVx_r0p0[] = {
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_11054,
-	BASE_HW_ISSUE_TMIX_8133,
-	BASE_HW_ISSUE_TSIX_1116,
-	BASE_HW_ISSUE_END
-};
-
-static const enum base_hw_issue base_hw_issues_model_tDVx[] = {
-	BASE_HW_ISSUE_5736,
-	BASE_HW_ISSUE_9435,
-	BASE_HW_ISSUE_TMIX_8133,
-	BASE_HW_ISSUE_TSIX_1116,
-	BASE_HW_ISSUE_END
-};
-
-
-
-
-
-
-
-
-
-#endif /* _BASE_HWCONFIG_ISSUES_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_base_kernel.h b/drivers/gpu/arm/bifrost_for_linux/mali_base_kernel.h
deleted file mode 100644
index 6f5c68e288cd..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_base_kernel.h
+++ /dev/null
@@ -1,1822 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * Base structures shared with the kernel.
- */
-
-#ifndef _BASE_KERNEL_H_
-#define _BASE_KERNEL_H_
-
-/* Support UK10_2 IOCTLS */
-#define BASE_LEGACY_UK10_2_SUPPORT 1
-
-/* Support UK10_4 IOCTLS */
-#define BASE_LEGACY_UK10_4_SUPPORT 1
-
-typedef struct base_mem_handle {
-	struct {
-		u64 handle;
-	} basep;
-} base_mem_handle;
-
-#include "mali_base_mem_priv.h"
-#include "mali_kbase_profiling_gator_api.h"
-#include "mali_midg_coherency.h"
-#include "mali_kbase_gpu_id.h"
-
-/*
- * Dependency stuff, keep it private for now. May want to expose it if
- * we decide to make the number of semaphores a configurable
- * option.
- */
-#define BASE_JD_ATOM_COUNT              256
-
-/* Set/reset values for a software event */
-#define BASE_JD_SOFT_EVENT_SET             ((unsigned char)1)
-#define BASE_JD_SOFT_EVENT_RESET           ((unsigned char)0)
-
-#define BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS 3
-
-#define BASE_MAX_COHERENT_GROUPS 16
-
-#if defined CDBG_ASSERT
-#define LOCAL_ASSERT CDBG_ASSERT
-#elif defined KBASE_DEBUG_ASSERT
-#define LOCAL_ASSERT KBASE_DEBUG_ASSERT
-#else
-#error assert macro not defined!
-#endif
-
-#if defined PAGE_MASK
-#define LOCAL_PAGE_LSB ~PAGE_MASK
-#else
-#include <osu/mali_osu.h>
-
-#if defined OSU_CONFIG_CPU_PAGE_SIZE_LOG2
-#define LOCAL_PAGE_LSB ((1ul << OSU_CONFIG_CPU_PAGE_SIZE_LOG2) - 1)
-#else
-#error Failed to find page size
-#endif
-#endif
-
-/**
- * @addtogroup base_user_api User-side Base APIs
- * @{
- */
-
-/**
- * @addtogroup base_user_api_memory User-side Base Memory APIs
- * @{
- */
-
-/**
- * typedef base_mem_alloc_flags - Memory allocation, access/hint flags.
- *
- * A combination of MEM_PROT/MEM_HINT flags must be passed to each allocator
- * in order to determine the best cache policy. Some combinations are
- * of course invalid (e.g. MEM_PROT_CPU_WR | MEM_HINT_CPU_RD),
- * which defines a write-only region on the CPU side, which is
- * heavily read by the CPU...
- * Other flags are only meaningful to a particular allocator.
- * More flags can be added to this list, as long as they don't clash
- * (see BASE_MEM_FLAGS_NR_BITS for the number of the first free bit).
- */
-typedef u32 base_mem_alloc_flags;
-
-/* Memory allocation, access/hint flags.
- *
- * See base_mem_alloc_flags.
- */
-
-/* IN */
-/* Read access CPU side
- */
-#define BASE_MEM_PROT_CPU_RD ((base_mem_alloc_flags)1 << 0)
-
-/* Write access CPU side
- */
-#define BASE_MEM_PROT_CPU_WR ((base_mem_alloc_flags)1 << 1)
-
-/* Read access GPU side
- */
-#define BASE_MEM_PROT_GPU_RD ((base_mem_alloc_flags)1 << 2)
-
-/* Write access GPU side
- */
-#define BASE_MEM_PROT_GPU_WR ((base_mem_alloc_flags)1 << 3)
-
-/* Execute allowed on the GPU side
- */
-#define BASE_MEM_PROT_GPU_EX ((base_mem_alloc_flags)1 << 4)
-
-	/* BASE_MEM_HINT flags have been removed, but their values are reserved
-	 * for backwards compatibility with older user-space drivers. The values
-	 * can be re-used once support for r5p0 user-space drivers is removed,
-	 * presumably in r7p0.
-	 *
-	 * RESERVED: (1U << 5)
-	 * RESERVED: (1U << 6)
-	 * RESERVED: (1U << 7)
-	 * RESERVED: (1U << 8)
-	 */
-
-/* Grow backing store on GPU Page Fault
- */
-#define BASE_MEM_GROW_ON_GPF ((base_mem_alloc_flags)1 << 9)
-
-/* Page coherence Outer shareable, if available
- */
-#define BASE_MEM_COHERENT_SYSTEM ((base_mem_alloc_flags)1 << 10)
-
-/* Page coherence Inner shareable
- */
-#define BASE_MEM_COHERENT_LOCAL ((base_mem_alloc_flags)1 << 11)
-
-/* Should be cached on the CPU
- */
-#define BASE_MEM_CACHED_CPU ((base_mem_alloc_flags)1 << 12)
-
-/* IN/OUT */
-/* Must have same VA on both the GPU and the CPU
- */
-#define BASE_MEM_SAME_VA ((base_mem_alloc_flags)1 << 13)
-
-/* OUT */
-/* Must call mmap to acquire a GPU address for the alloc
- */
-#define BASE_MEM_NEED_MMAP ((base_mem_alloc_flags)1 << 14)
-
-/* IN */
-/* Page coherence Outer shareable, required.
- */
-#define BASE_MEM_COHERENT_SYSTEM_REQUIRED ((base_mem_alloc_flags)1 << 15)
-
-/* Secure memory
- */
-#define BASE_MEM_SECURE ((base_mem_alloc_flags)1 << 16)
-
-/* Not needed physical memory
- */
-#define BASE_MEM_DONT_NEED ((base_mem_alloc_flags)1 << 17)
-
-/* Must use shared CPU/GPU zone (SAME_VA zone) but doesn't require the
- * addresses to be the same
- */
-#define BASE_MEM_IMPORT_SHARED ((base_mem_alloc_flags)1 << 18)
-
-/**
- * Bit 19 is reserved.
- *
- * Do not remove, use the next unreserved bit for new flags
- **/
-#define BASE_MEM_RESERVED_BIT_19 ((base_mem_alloc_flags)1 << 19)
-
-/* Number of bits used as flags for base memory management
- *
- * Must be kept in sync with the base_mem_alloc_flags flags
- */
-#define BASE_MEM_FLAGS_NR_BITS 20
-
-/* A mask for all output bits, excluding IN/OUT bits.
- */
-#define BASE_MEM_FLAGS_OUTPUT_MASK BASE_MEM_NEED_MMAP
-
-/* A mask for all input bits, including IN/OUT bits.
- */
-#define BASE_MEM_FLAGS_INPUT_MASK \
-	(((1 << BASE_MEM_FLAGS_NR_BITS) - 1) & ~BASE_MEM_FLAGS_OUTPUT_MASK)
-
-/* A mask for all the flags which are modifiable via the base_mem_set_flags
- * interface.
- */
-#define BASE_MEM_FLAGS_MODIFIABLE \
-	(BASE_MEM_DONT_NEED | BASE_MEM_COHERENT_SYSTEM | \
-	 BASE_MEM_COHERENT_LOCAL)
-
-/**
- * enum base_mem_import_type - Memory types supported by @a base_mem_import
- *
- * @BASE_MEM_IMPORT_TYPE_INVALID: Invalid type
- * @BASE_MEM_IMPORT_TYPE_UMP: UMP import. Handle type is ump_secure_id.
- * @BASE_MEM_IMPORT_TYPE_UMM: UMM import. Handle type is a file descriptor (int)
- * @BASE_MEM_IMPORT_TYPE_USER_BUFFER: User buffer import. Handle is a
- * base_mem_import_user_buffer
- *
- * Each type defines what the supported handle type is.
- *
- * If any new type is added here ARM must be contacted
- * to allocate a numeric value for it.
- * Do not just add a new type without synchronizing with ARM
- * as future releases from ARM might include other new types
- * which could clash with your custom types.
- */
-typedef enum base_mem_import_type {
-	BASE_MEM_IMPORT_TYPE_INVALID = 0,
-	BASE_MEM_IMPORT_TYPE_UMP = 1,
-	BASE_MEM_IMPORT_TYPE_UMM = 2,
-	BASE_MEM_IMPORT_TYPE_USER_BUFFER = 3
-} base_mem_import_type;
-
-/**
- * struct base_mem_import_user_buffer - Handle of an imported user buffer
- *
- * @ptr:	address of imported user buffer
- * @length:	length of imported user buffer in bytes
- *
- * This structure is used to represent a handle of an imported user buffer.
- */
-
-struct base_mem_import_user_buffer {
-	u64 ptr;
-	u64 length;
-};
-
-/**
- * @brief Invalid memory handle.
- *
- * Return value from functions returning @ref base_mem_handle on error.
- *
- * @warning @ref base_mem_handle_new_invalid must be used instead of this macro
- *          in C++ code or other situations where compound literals cannot be used.
- */
-#define BASE_MEM_INVALID_HANDLE ((base_mem_handle) { {BASEP_MEM_INVALID_HANDLE} })
-
-/**
- * @brief Special write-alloc memory handle.
- *
- * A special handle is used to represent a region where a special page is mapped
- * with a write-alloc cache setup, typically used when the write result of the
- * GPU isn't needed, but the GPU must write anyway.
- *
- * @warning @ref base_mem_handle_new_write_alloc must be used instead of this macro
- *          in C++ code or other situations where compound literals cannot be used.
- */
-#define BASE_MEM_WRITE_ALLOC_PAGES_HANDLE ((base_mem_handle) { {BASEP_MEM_WRITE_ALLOC_PAGES_HANDLE} })
-
-#define BASEP_MEM_INVALID_HANDLE               (0ull  << 12)
-#define BASE_MEM_MMU_DUMP_HANDLE               (1ull  << 12)
-#define BASE_MEM_TRACE_BUFFER_HANDLE           (2ull  << 12)
-#define BASE_MEM_MAP_TRACKING_HANDLE           (3ull  << 12)
-#define BASEP_MEM_WRITE_ALLOC_PAGES_HANDLE     (4ull  << 12)
-/* reserved handles ..-64<<PAGE_SHIFT> for future special handles */
-#define BASE_MEM_COOKIE_BASE                   (64ul  << 12)
-#define BASE_MEM_FIRST_FREE_ADDRESS            ((BITS_PER_LONG << 12) + \
-						BASE_MEM_COOKIE_BASE)
-
-/* Mask to detect 4GB boundary alignment */
-#define BASE_MEM_MASK_4GB  0xfffff000UL
-
-
-/* Bit mask of cookies used for for memory allocation setup */
-#define KBASE_COOKIE_MASK  ~1UL /* bit 0 is reserved */
-
-
-/**
- * @brief Result codes of changing the size of the backing store allocated to a tmem region
- */
-typedef enum base_backing_threshold_status {
-	BASE_BACKING_THRESHOLD_OK = 0,			    /**< Resize successful */
-	BASE_BACKING_THRESHOLD_ERROR_OOM = -2,		    /**< Increase failed due to an out-of-memory condition */
-	BASE_BACKING_THRESHOLD_ERROR_INVALID_ARGUMENTS = -4 /**< Invalid arguments (not tmem, illegal size request, etc.) */
-} base_backing_threshold_status;
-
-/**
- * @addtogroup base_user_api_memory_defered User-side Base Defered Memory Coherency APIs
- * @{
- */
-
-/**
- * @brief a basic memory operation (sync-set).
- *
- * The content of this structure is private, and should only be used
- * by the accessors.
- */
-typedef struct base_syncset {
-	struct basep_syncset basep_sset;
-} base_syncset;
-
-/** @} end group base_user_api_memory_defered */
-
-/**
- * Handle to represent imported memory object.
- * Simple opague handle to imported memory, can't be used
- * with anything but base_external_resource_init to bind to an atom.
- */
-typedef struct base_import_handle {
-	struct {
-		u64 handle;
-	} basep;
-} base_import_handle;
-
-/** @} end group base_user_api_memory */
-
-/**
- * @addtogroup base_user_api_job_dispatch User-side Base Job Dispatcher APIs
- * @{
- */
-
-typedef int platform_fence_type;
-#define INVALID_PLATFORM_FENCE ((platform_fence_type)-1)
-
-/**
- * Base stream handle.
- *
- * References an underlying base stream object.
- */
-typedef struct base_stream {
-	struct {
-		int fd;
-	} basep;
-} base_stream;
-
-/**
- * Base fence handle.
- *
- * References an underlying base fence object.
- */
-typedef struct base_fence {
-	struct {
-		int fd;
-		int stream_fd;
-	} basep;
-} base_fence;
-
-/**
- * @brief Per-job data
- *
- * This structure is used to store per-job data, and is completely unused
- * by the Base driver. It can be used to store things such as callback
- * function pointer, data to handle job completion. It is guaranteed to be
- * untouched by the Base driver.
- */
-typedef struct base_jd_udata {
-	u64 blob[2];	 /**< per-job data array */
-} base_jd_udata;
-
-/**
- * @brief Memory aliasing info
- *
- * Describes a memory handle to be aliased.
- * A subset of the handle can be chosen for aliasing, given an offset and a
- * length.
- * A special handle BASE_MEM_WRITE_ALLOC_PAGES_HANDLE is used to represent a
- * region where a special page is mapped with a write-alloc cache setup,
- * typically used when the write result of the GPU isn't needed, but the GPU
- * must write anyway.
- *
- * Offset and length are specified in pages.
- * Offset must be within the size of the handle.
- * Offset+length must not overrun the size of the handle.
- *
- * @handle Handle to alias, can be BASE_MEM_WRITE_ALLOC_PAGES_HANDLE
- * @offset Offset within the handle to start aliasing from, in pages.
- *         Not used with BASE_MEM_WRITE_ALLOC_PAGES_HANDLE.
- * @length Length to alias, in pages. For BASE_MEM_WRITE_ALLOC_PAGES_HANDLE
- *         specifies the number of times the special page is needed.
- */
-struct base_mem_aliasing_info {
-	base_mem_handle handle;
-	u64 offset;
-	u64 length;
-};
-
-/**
- * struct base_jit_alloc_info - Structure which describes a JIT allocation
- *                              request.
- * @gpu_alloc_addr:             The GPU virtual address to write the JIT
- *                              allocated GPU virtual address to.
- * @va_pages:                   The minimum number of virtual pages required.
- * @commit_pages:               The minimum number of physical pages which
- *                              should back the allocation.
- * @extent:                     Granularity of physical pages to grow the
- *                              allocation by during a fault.
- * @id:                         Unique ID provided by the caller, this is used
- *                              to pair allocation and free requests.
- *                              Zero is not a valid value.
- */
-struct base_jit_alloc_info {
-	u64 gpu_alloc_addr;
-	u64 va_pages;
-	u64 commit_pages;
-	u64 extent;
-	u8 id;
-};
-
-/**
- * @brief Job dependency type.
- *
- * A flags field will be inserted into the atom structure to specify whether a dependency is a data or
- * ordering dependency (by putting it before/after 'core_req' in the structure it should be possible to add without
- * changing the structure size).
- * When the flag is set for a particular dependency to signal that it is an ordering only dependency then
- * errors will not be propagated.
- */
-typedef u8 base_jd_dep_type;
-
-
-#define BASE_JD_DEP_TYPE_INVALID  (0)       /**< Invalid dependency */
-#define BASE_JD_DEP_TYPE_DATA     (1U << 0) /**< Data dependency */
-#define BASE_JD_DEP_TYPE_ORDER    (1U << 1) /**< Order dependency */
-
-/**
- * @brief Job chain hardware requirements.
- *
- * A job chain must specify what GPU features it needs to allow the
- * driver to schedule the job correctly.  By not specifying the
- * correct settings can/will cause an early job termination.  Multiple
- * values can be ORed together to specify multiple requirements.
- * Special case is ::BASE_JD_REQ_DEP, which is used to express complex
- * dependencies, and that doesn't execute anything on the hardware.
- */
-typedef u32 base_jd_core_req;
-
-/* Requirements that come from the HW */
-
-/**
- * No requirement, dependency only
- */
-#define BASE_JD_REQ_DEP ((base_jd_core_req)0)
-
-/**
- * Requires fragment shaders
- */
-#define BASE_JD_REQ_FS  ((base_jd_core_req)1 << 0)
-
-/**
- * Requires compute shaders
- * This covers any of the following Midgard Job types:
- * - Vertex Shader Job
- * - Geometry Shader Job
- * - An actual Compute Shader Job
- *
- * Compare this with @ref BASE_JD_REQ_ONLY_COMPUTE, which specifies that the
- * job is specifically just the "Compute Shader" job type, and not the "Vertex
- * Shader" nor the "Geometry Shader" job type.
- */
-#define BASE_JD_REQ_CS  ((base_jd_core_req)1 << 1)
-#define BASE_JD_REQ_T   ((base_jd_core_req)1 << 2)   /**< Requires tiling */
-#define BASE_JD_REQ_CF  ((base_jd_core_req)1 << 3)   /**< Requires cache flushes */
-#define BASE_JD_REQ_V   ((base_jd_core_req)1 << 4)   /**< Requires value writeback */
-
-/* SW-only requirements - the HW does not expose these as part of the job slot capabilities */
-
-/* Requires fragment job with AFBC encoding */
-#define BASE_JD_REQ_FS_AFBC  ((base_jd_core_req)1 << 13)
-
-/**
- * SW-only requirement: coalesce completion events.
- * If this bit is set then completion of this atom will not cause an event to
- * be sent to userspace, whether successful or not; completion events will be
- * deferred until an atom completes which does not have this bit set.
- *
- * This bit may not be used in combination with BASE_JD_REQ_EXTERNAL_RESOURCES.
- */
-#define BASE_JD_REQ_EVENT_COALESCE ((base_jd_core_req)1 << 5)
-
-/**
- * SW Only requirement: the job chain requires a coherent core group. We don't
- * mind which coherent core group is used.
- */
-#define BASE_JD_REQ_COHERENT_GROUP  ((base_jd_core_req)1 << 6)
-
-/**
- * SW Only requirement: The performance counters should be enabled only when
- * they are needed, to reduce power consumption.
- */
-
-#define BASE_JD_REQ_PERMON               ((base_jd_core_req)1 << 7)
-
-/**
- * SW Only requirement: External resources are referenced by this atom.
- * When external resources are referenced no syncsets can be bundled with the atom
- * but should instead be part of a NULL jobs inserted into the dependency tree.
- * The first pre_dep object must be configured for the external resouces to use,
- * the second pre_dep object can be used to create other dependencies.
- *
- * This bit may not be used in combination with BASE_JD_REQ_EVENT_COALESCE.
- */
-#define BASE_JD_REQ_EXTERNAL_RESOURCES   ((base_jd_core_req)1 << 8)
-
-/**
- * SW Only requirement: Software defined job. Jobs with this bit set will not be submitted
- * to the hardware but will cause some action to happen within the driver
- */
-#define BASE_JD_REQ_SOFT_JOB        ((base_jd_core_req)1 << 9)
-
-#define BASE_JD_REQ_SOFT_DUMP_CPU_GPU_TIME      (BASE_JD_REQ_SOFT_JOB | 0x1)
-#define BASE_JD_REQ_SOFT_FENCE_TRIGGER          (BASE_JD_REQ_SOFT_JOB | 0x2)
-#define BASE_JD_REQ_SOFT_FENCE_WAIT             (BASE_JD_REQ_SOFT_JOB | 0x3)
-
-/**
- * SW Only requirement : Replay job.
- *
- * If the preceding job fails, the replay job will cause the jobs specified in
- * the list of base_jd_replay_payload pointed to by the jc pointer to be
- * replayed.
- *
- * A replay job will only cause jobs to be replayed up to BASEP_JD_REPLAY_LIMIT
- * times. If a job fails more than BASEP_JD_REPLAY_LIMIT times then the replay
- * job is failed, as well as any following dependencies.
- *
- * The replayed jobs will require a number of atom IDs. If there are not enough
- * free atom IDs then the replay job will fail.
- *
- * If the preceding job does not fail, then the replay job is returned as
- * completed.
- *
- * The replayed jobs will never be returned to userspace. The preceding failed
- * job will be returned to userspace as failed; the status of this job should
- * be ignored. Completion should be determined by the status of the replay soft
- * job.
- *
- * In order for the jobs to be replayed, the job headers will have to be
- * modified. The Status field will be reset to NOT_STARTED. If the Job Type
- * field indicates a Vertex Shader Job then it will be changed to Null Job.
- *
- * The replayed jobs have the following assumptions :
- *
- * - No external resources. Any required external resources will be held by the
- *   replay atom.
- * - Pre-dependencies are created based on job order.
- * - Atom numbers are automatically assigned.
- * - device_nr is set to 0. This is not relevant as
- *   BASE_JD_REQ_SPECIFIC_COHERENT_GROUP should not be set.
- * - Priority is inherited from the replay job.
- */
-#define BASE_JD_REQ_SOFT_REPLAY                 (BASE_JD_REQ_SOFT_JOB | 0x4)
-/**
- * SW only requirement: event wait/trigger job.
- *
- * - BASE_JD_REQ_SOFT_EVENT_WAIT: this job will block until the event is set.
- * - BASE_JD_REQ_SOFT_EVENT_SET: this job sets the event, thus unblocks the
- *   other waiting jobs. It completes immediately.
- * - BASE_JD_REQ_SOFT_EVENT_RESET: this job resets the event, making it
- *   possible for other jobs to wait upon. It completes immediately.
- */
-#define BASE_JD_REQ_SOFT_EVENT_WAIT             (BASE_JD_REQ_SOFT_JOB | 0x5)
-#define BASE_JD_REQ_SOFT_EVENT_SET              (BASE_JD_REQ_SOFT_JOB | 0x6)
-#define BASE_JD_REQ_SOFT_EVENT_RESET            (BASE_JD_REQ_SOFT_JOB | 0x7)
-
-#define BASE_JD_REQ_SOFT_DEBUG_COPY             (BASE_JD_REQ_SOFT_JOB | 0x8)
-
-/**
- * SW only requirement: Just In Time allocation
- *
- * This job requests a JIT allocation based on the request in the
- * @base_jit_alloc_info structure which is passed via the jc element of
- * the atom.
- *
- * It should be noted that the id entry in @base_jit_alloc_info must not
- * be reused until it has been released via @BASE_JD_REQ_SOFT_JIT_FREE.
- *
- * Should this soft job fail it is expected that a @BASE_JD_REQ_SOFT_JIT_FREE
- * soft job to free the JIT allocation is still made.
- *
- * The job will complete immediately.
- */
-#define BASE_JD_REQ_SOFT_JIT_ALLOC              (BASE_JD_REQ_SOFT_JOB | 0x9)
-/**
- * SW only requirement: Just In Time free
- *
- * This job requests a JIT allocation created by @BASE_JD_REQ_SOFT_JIT_ALLOC
- * to be freed. The ID of the JIT allocation is passed via the jc element of
- * the atom.
- *
- * The job will complete immediately.
- */
-#define BASE_JD_REQ_SOFT_JIT_FREE               (BASE_JD_REQ_SOFT_JOB | 0xa)
-
-/**
- * SW only requirement: Map external resource
- *
- * This job requests external resource(s) are mapped once the dependencies
- * of the job have been satisfied. The list of external resources are
- * passed via the jc element of the atom which is a pointer to a
- * @base_external_resource_list.
- */
-#define BASE_JD_REQ_SOFT_EXT_RES_MAP            (BASE_JD_REQ_SOFT_JOB | 0xb)
-/**
- * SW only requirement: Unmap external resource
- *
- * This job requests external resource(s) are unmapped once the dependencies
- * of the job has been satisfied. The list of external resources are
- * passed via the jc element of the atom which is a pointer to a
- * @base_external_resource_list.
- */
-#define BASE_JD_REQ_SOFT_EXT_RES_UNMAP          (BASE_JD_REQ_SOFT_JOB | 0xc)
-
-/**
- * HW Requirement: Requires Compute shaders (but not Vertex or Geometry Shaders)
- *
- * This indicates that the Job Chain contains Midgard Jobs of the 'Compute Shaders' type.
- *
- * In contrast to @ref BASE_JD_REQ_CS, this does \b not indicate that the Job
- * Chain contains 'Geometry Shader' or 'Vertex Shader' jobs.
- */
-#define BASE_JD_REQ_ONLY_COMPUTE    ((base_jd_core_req)1 << 10)
-
-/**
- * HW Requirement: Use the base_jd_atom::device_nr field to specify a
- * particular core group
- *
- * If both @ref BASE_JD_REQ_COHERENT_GROUP and this flag are set, this flag takes priority
- *
- * This is only guaranteed to work for @ref BASE_JD_REQ_ONLY_COMPUTE atoms.
- *
- * If the core availability policy is keeping the required core group turned off, then
- * the job will fail with a @ref BASE_JD_EVENT_PM_EVENT error code.
- */
-#define BASE_JD_REQ_SPECIFIC_COHERENT_GROUP ((base_jd_core_req)1 << 11)
-
-/**
- * SW Flag: If this bit is set then the successful completion of this atom
- * will not cause an event to be sent to userspace
- */
-#define BASE_JD_REQ_EVENT_ONLY_ON_FAILURE   ((base_jd_core_req)1 << 12)
-
-/**
- * SW Flag: If this bit is set then completion of this atom will not cause an
- * event to be sent to userspace, whether successful or not.
- */
-#define BASEP_JD_REQ_EVENT_NEVER ((base_jd_core_req)1 << 14)
-
-/**
- * SW Flag: Skip GPU cache clean and invalidation before starting a GPU job.
- *
- * If this bit is set then the GPU's cache will not be cleaned and invalidated
- * until a GPU job starts which does not have this bit set or a job completes
- * which does not have the @ref BASE_JD_REQ_SKIP_CACHE_END bit set. Do not use if
- * the CPU may have written to memory addressed by the job since the last job
- * without this bit set was submitted.
- */
-#define BASE_JD_REQ_SKIP_CACHE_START ((base_jd_core_req)1 << 15)
-
-/**
- * SW Flag: Skip GPU cache clean and invalidation after a GPU job completes.
- *
- * If this bit is set then the GPU's cache will not be cleaned and invalidated
- * until a GPU job completes which does not have this bit set or a job starts
- * which does not have the @ref BASE_JD_REQ_SKIP_CACHE_START bti set. Do not use if
- * the CPU may read from or partially overwrite memory addressed by the job
- * before the next job without this bit set completes.
- */
-#define BASE_JD_REQ_SKIP_CACHE_END ((base_jd_core_req)1 << 16)
-
-/**
- * These requirement bits are currently unused in base_jd_core_req
- */
-#define BASEP_JD_REQ_RESERVED \
-	(~(BASE_JD_REQ_ATOM_TYPE | BASE_JD_REQ_EXTERNAL_RESOURCES | \
-	BASE_JD_REQ_EVENT_ONLY_ON_FAILURE | BASEP_JD_REQ_EVENT_NEVER | \
-	BASE_JD_REQ_EVENT_COALESCE | \
-	BASE_JD_REQ_COHERENT_GROUP | BASE_JD_REQ_SPECIFIC_COHERENT_GROUP | \
-	BASE_JD_REQ_FS_AFBC | BASE_JD_REQ_PERMON | \
-	BASE_JD_REQ_SKIP_CACHE_START | BASE_JD_REQ_SKIP_CACHE_END))
-
-/**
- * Mask of all bits in base_jd_core_req that control the type of the atom.
- *
- * This allows dependency only atoms to have flags set
- */
-#define BASE_JD_REQ_ATOM_TYPE \
-	(BASE_JD_REQ_FS | BASE_JD_REQ_CS | BASE_JD_REQ_T | BASE_JD_REQ_CF | \
-	BASE_JD_REQ_V | BASE_JD_REQ_SOFT_JOB | BASE_JD_REQ_ONLY_COMPUTE)
-
-/**
- * Mask of all bits in base_jd_core_req that control the type of a soft job.
- */
-#define BASE_JD_REQ_SOFT_JOB_TYPE (BASE_JD_REQ_SOFT_JOB | 0x1f)
-
-/*
- * Returns non-zero value if core requirements passed define a soft job or
- * a dependency only job.
- */
-#define BASE_JD_REQ_SOFT_JOB_OR_DEP(core_req) \
-	((core_req & BASE_JD_REQ_SOFT_JOB) || \
-	(core_req & BASE_JD_REQ_ATOM_TYPE) == BASE_JD_REQ_DEP)
-
-/**
- * @brief States to model state machine processed by kbasep_js_job_check_ref_cores(), which
- * handles retaining cores for power management and affinity management.
- *
- * The state @ref KBASE_ATOM_COREREF_STATE_RECHECK_AFFINITY prevents an attack
- * where lots of atoms could be submitted before powerup, and each has an
- * affinity chosen that causes other atoms to have an affinity
- * violation. Whilst the affinity was not causing violations at the time it
- * was chosen, it could cause violations thereafter. For example, 1000 jobs
- * could have had their affinity chosen during the powerup time, so any of
- * those 1000 jobs could cause an affinity violation later on.
- *
- * The attack would otherwise occur because other atoms/contexts have to wait for:
- * -# the currently running atoms (which are causing the violation) to
- * finish
- * -# and, the atoms that had their affinity chosen during powerup to
- * finish. These are run preferentially because they don't cause a
- * violation, but instead continue to cause the violation in others.
- * -# or, the attacker is scheduled out (which might not happen for just 2
- * contexts)
- *
- * By re-choosing the affinity (which is designed to avoid violations at the
- * time it's chosen), we break condition (2) of the wait, which minimizes the
- * problem to just waiting for current jobs to finish (which can be bounded if
- * the Job Scheduling Policy has a timer).
- */
-enum kbase_atom_coreref_state {
-	/** Starting state: No affinity chosen, and cores must be requested. kbase_jd_atom::affinity==0 */
-	KBASE_ATOM_COREREF_STATE_NO_CORES_REQUESTED,
-	/** Cores requested, but waiting for them to be powered. Requested cores given by kbase_jd_atom::affinity */
-	KBASE_ATOM_COREREF_STATE_WAITING_FOR_REQUESTED_CORES,
-	/** Cores given by kbase_jd_atom::affinity are powered, but affinity might be out-of-date, so must recheck */
-	KBASE_ATOM_COREREF_STATE_RECHECK_AFFINITY,
-	/** Cores given by kbase_jd_atom::affinity are powered, and affinity is up-to-date, but must check for violations */
-	KBASE_ATOM_COREREF_STATE_CHECK_AFFINITY_VIOLATIONS,
-	/** Cores are powered, kbase_jd_atom::affinity up-to-date, no affinity violations: atom can be submitted to HW */
-	KBASE_ATOM_COREREF_STATE_READY
-};
-
-/*
- * Base Atom priority
- *
- * Only certain priority levels are actually implemented, as specified by the
- * BASE_JD_PRIO_<...> definitions below. It is undefined to use a priority
- * level that is not one of those defined below.
- *
- * Priority levels only affect scheduling between atoms of the same type within
- * a base context, and only after the atoms have had dependencies resolved.
- * Fragment atoms does not affect non-frament atoms with lower priorities, and
- * the other way around. For example, a low priority atom that has had its
- * dependencies resolved might run before a higher priority atom that has not
- * had its dependencies resolved.
- *
- * The scheduling between base contexts/processes and between atoms from
- * different base contexts/processes is unaffected by atom priority.
- *
- * The atoms are scheduled as follows with respect to their priorities:
- * - Let atoms 'X' and 'Y' be for the same job slot who have dependencies
- *   resolved, and atom 'X' has a higher priority than atom 'Y'
- * - If atom 'Y' is currently running on the HW, then it is interrupted to
- *   allow atom 'X' to run soon after
- * - If instead neither atom 'Y' nor atom 'X' are running, then when choosing
- *   the next atom to run, atom 'X' will always be chosen instead of atom 'Y'
- * - Any two atoms that have the same priority could run in any order with
- *   respect to each other. That is, there is no ordering constraint between
- *   atoms of the same priority.
- */
-typedef u8 base_jd_prio;
-
-/* Medium atom priority. This is a priority higher than BASE_JD_PRIO_LOW */
-#define BASE_JD_PRIO_MEDIUM  ((base_jd_prio)0)
-/* High atom priority. This is a priority higher than BASE_JD_PRIO_MEDIUM and
- * BASE_JD_PRIO_LOW */
-#define BASE_JD_PRIO_HIGH    ((base_jd_prio)1)
-/* Low atom priority. */
-#define BASE_JD_PRIO_LOW     ((base_jd_prio)2)
-
-/* Count of the number of priority levels. This itself is not a valid
- * base_jd_prio setting */
-#define BASE_JD_NR_PRIO_LEVELS 3
-
-enum kbase_jd_atom_state {
-	/** Atom is not used */
-	KBASE_JD_ATOM_STATE_UNUSED,
-	/** Atom is queued in JD */
-	KBASE_JD_ATOM_STATE_QUEUED,
-	/** Atom has been given to JS (is runnable/running) */
-	KBASE_JD_ATOM_STATE_IN_JS,
-	/** Atom has been completed, but not yet handed back to job dispatcher
-	 *  for dependency resolution */
-	KBASE_JD_ATOM_STATE_HW_COMPLETED,
-	/** Atom has been completed, but not yet handed back to userspace */
-	KBASE_JD_ATOM_STATE_COMPLETED
-};
-
-typedef u8 base_atom_id; /**< Type big enough to store an atom number in */
-
-struct base_dependency {
-	base_atom_id  atom_id;               /**< An atom number */
-	base_jd_dep_type dependency_type;    /**< Dependency type */
-};
-
-/* This structure has changed since UK 10.2 for which base_jd_core_req was a u16 value.
- * In order to keep the size of the structure same, padding field has been adjusted
- * accordingly and core_req field of a u32 type (to which UK 10.3 base_jd_core_req defines)
- * is added at the end of the structure. Place in the structure previously occupied by u16 core_req
- * is kept but renamed to compat_core_req and as such it can be used in ioctl call for job submission
- * as long as UK 10.2 legacy is supported. Once when this support ends, this field can be left
- * for possible future use. */
-typedef struct base_jd_atom_v2 {
-	u64 jc;			    /**< job-chain GPU address */
-	struct base_jd_udata udata;		    /**< user data */
-	u64 extres_list;	    /**< list of external resources */
-	u16 nr_extres;			    /**< nr of external resources */
-	u16 compat_core_req;	            /**< core requirements which correspond to the legacy support for UK 10.2 */
-	struct base_dependency pre_dep[2];  /**< pre-dependencies, one need to use SETTER function to assign this field,
-	this is done in order to reduce possibility of improper assigment of a dependency field */
-	base_atom_id atom_number;	    /**< unique number to identify the atom */
-	base_jd_prio prio;                  /**< Atom priority. Refer to @ref base_jd_prio for more details */
-	u8 device_nr;			    /**< coregroup when BASE_JD_REQ_SPECIFIC_COHERENT_GROUP specified */
-	u8 padding[1];
-	base_jd_core_req core_req;          /**< core requirements */
-} base_jd_atom_v2;
-
-typedef enum base_external_resource_access {
-	BASE_EXT_RES_ACCESS_SHARED,
-	BASE_EXT_RES_ACCESS_EXCLUSIVE
-} base_external_resource_access;
-
-typedef struct base_external_resource {
-	u64 ext_resource;
-} base_external_resource;
-
-
-/**
- * The maximum number of external resources which can be mapped/unmapped
- * in a single request.
- */
-#define BASE_EXT_RES_COUNT_MAX 10
-
-/**
- * struct base_external_resource_list - Structure which describes a list of
- *                                      external resources.
- * @count:                              The number of resources.
- * @ext_res:                            Array of external resources which is
- *                                      sized at allocation time.
- */
-struct base_external_resource_list {
-	u64 count;
-	struct base_external_resource ext_res[1];
-};
-
-struct base_jd_debug_copy_buffer {
-	u64 address;
-	u64 size;
-	struct base_external_resource extres;
-};
-
-/**
- * @brief Setter for a dependency structure
- *
- * @param[in] dep          The kbase jd atom dependency to be initialized.
- * @param     id           The atom_id to be assigned.
- * @param     dep_type     The dep_type to be assigned.
- *
- */
-static inline void base_jd_atom_dep_set(struct base_dependency *dep,
-		base_atom_id id, base_jd_dep_type dep_type)
-{
-	LOCAL_ASSERT(dep != NULL);
-
-	/*
-	 * make sure we don't set not allowed combinations
-	 * of atom_id/dependency_type.
-	 */
-	LOCAL_ASSERT((id == 0 && dep_type == BASE_JD_DEP_TYPE_INVALID) ||
-			(id > 0 && dep_type != BASE_JD_DEP_TYPE_INVALID));
-
-	dep->atom_id = id;
-	dep->dependency_type = dep_type;
-}
-
-/**
- * @brief Make a copy of a dependency structure
- *
- * @param[in,out] dep          The kbase jd atom dependency to be written.
- * @param[in]     from         The dependency to make a copy from.
- *
- */
-static inline void base_jd_atom_dep_copy(struct base_dependency *dep,
-		const struct base_dependency *from)
-{
-	LOCAL_ASSERT(dep != NULL);
-
-	base_jd_atom_dep_set(dep, from->atom_id, from->dependency_type);
-}
-
-/**
- * @brief Soft-atom fence trigger setup.
- *
- * Sets up an atom to be a SW-only atom signaling a fence
- * when it reaches the run state.
- *
- * Using the existing base dependency system the fence can
- * be set to trigger when a GPU job has finished.
- *
- * The base fence object must not be terminated until the atom
- * has been submitted to @ref base_jd_submit and @ref base_jd_submit
- * has returned.
- *
- * @a fence must be a valid fence set up with @a base_fence_init.
- * Calling this function with a uninitialized fence results in undefined behavior.
- *
- * @param[out] atom A pre-allocated atom to configure as a fence trigger SW atom
- * @param[in] fence The base fence object to trigger.
- *
- * @pre @p fence must reference a @ref base_fence successfully initialized by
- *      calling @ref base_fence_init.
- * @pre @p fence was @e not initialized by calling @ref base_fence_import, nor
- *      is it associated with a fence-trigger job that was already submitted
- *      by calling @ref base_jd_submit.
- * @post @p atom can be submitted by calling @ref base_jd_submit.
- */
-static inline void base_jd_fence_trigger_setup_v2(struct base_jd_atom_v2 *atom, struct base_fence *fence)
-{
-	LOCAL_ASSERT(atom);
-	LOCAL_ASSERT(fence);
-	LOCAL_ASSERT(fence->basep.fd == INVALID_PLATFORM_FENCE);
-	LOCAL_ASSERT(fence->basep.stream_fd >= 0);
-	atom->jc = (uintptr_t) fence;
-	atom->core_req = BASE_JD_REQ_SOFT_FENCE_TRIGGER;
-}
-
-/**
- * @brief Soft-atom fence wait setup.
- *
- * Sets up an atom to be a SW-only atom waiting on a fence.
- * When the fence becomes triggered the atom becomes runnable
- * and completes immediately.
- *
- * Using the existing base dependency system the fence can
- * be set to block a GPU job until it has been triggered.
- *
- * The base fence object must not be terminated until the atom
- * has been submitted to @ref base_jd_submit and
- * @ref base_jd_submit has returned.
- *
- * @param[out] atom A pre-allocated atom to configure as a fence wait SW atom
- * @param[in] fence The base fence object to wait on
- *
- * @pre @p fence must reference a @ref base_fence successfully initialized by
- *      calling @ref base_fence_import, or it must be associated with a
- *      fence-trigger job that was already submitted by calling
- *      @ref base_jd_submit.
- * @post @p atom can be submitted by calling @ref base_jd_submit.
- */
-static inline void base_jd_fence_wait_setup_v2(struct base_jd_atom_v2 *atom, struct base_fence *fence)
-{
-	LOCAL_ASSERT(atom);
-	LOCAL_ASSERT(fence);
-	LOCAL_ASSERT(fence->basep.fd >= 0);
-	atom->jc = (uintptr_t) fence;
-	atom->core_req = BASE_JD_REQ_SOFT_FENCE_WAIT;
-}
-
-/**
- * @brief External resource info initialization.
- *
- * Sets up an external resource object to reference
- * a memory allocation and the type of access requested.
- *
- * @param[in] res     The resource object to initialize
- * @param     handle  The handle to the imported memory object, must be
- *                    obtained by calling @ref base_mem_as_import_handle().
- * @param     access  The type of access requested
- */
-static inline void base_external_resource_init(struct base_external_resource *res, struct base_import_handle handle, base_external_resource_access access)
-{
-	u64 address;
-
-	address = handle.basep.handle;
-
-	LOCAL_ASSERT(res != NULL);
-	LOCAL_ASSERT(0 == (address & LOCAL_PAGE_LSB));
-	LOCAL_ASSERT(access == BASE_EXT_RES_ACCESS_SHARED || access == BASE_EXT_RES_ACCESS_EXCLUSIVE);
-
-	res->ext_resource = address | (access & LOCAL_PAGE_LSB);
-}
-
-/**
- * @brief Job chain event code bits
- * Defines the bits used to create ::base_jd_event_code
- */
-enum {
-	BASE_JD_SW_EVENT_KERNEL = (1u << 15), /**< Kernel side event */
-	BASE_JD_SW_EVENT = (1u << 14), /**< SW defined event */
-	BASE_JD_SW_EVENT_SUCCESS = (1u << 13), /**< Event idicates success (SW events only) */
-	BASE_JD_SW_EVENT_JOB = (0u << 11), /**< Job related event */
-	BASE_JD_SW_EVENT_BAG = (1u << 11), /**< Bag related event */
-	BASE_JD_SW_EVENT_INFO = (2u << 11), /**< Misc/info event */
-	BASE_JD_SW_EVENT_RESERVED = (3u << 11),	/**< Reserved event type */
-	BASE_JD_SW_EVENT_TYPE_MASK = (3u << 11)	    /**< Mask to extract the type from an event code */
-};
-
-/**
- * @brief Job chain event codes
- *
- * HW and low-level SW events are represented by event codes.
- * The status of jobs which succeeded are also represented by
- * an event code (see ::BASE_JD_EVENT_DONE).
- * Events are usually reported as part of a ::base_jd_event.
- *
- * The event codes are encoded in the following way:
- * @li 10:0  - subtype
- * @li 12:11 - type
- * @li 13    - SW success (only valid if the SW bit is set)
- * @li 14    - SW event (HW event if not set)
- * @li 15    - Kernel event (should never be seen in userspace)
- *
- * Events are split up into ranges as follows:
- * - BASE_JD_EVENT_RANGE_\<description\>_START
- * - BASE_JD_EVENT_RANGE_\<description\>_END
- *
- * \a code is in \<description\>'s range when:
- * - <tt>BASE_JD_EVENT_RANGE_\<description\>_START <= code < BASE_JD_EVENT_RANGE_\<description\>_END </tt>
- *
- * Ranges can be asserted for adjacency by testing that the END of the previous
- * is equal to the START of the next. This is useful for optimizing some tests
- * for range.
- *
- * A limitation is that the last member of this enum must explicitly be handled
- * (with an assert-unreachable statement) in switch statements that use
- * variables of this type. Otherwise, the compiler warns that we have not
- * handled that enum value.
- */
-typedef enum base_jd_event_code {
-	/* HW defined exceptions */
-
-	/** Start of HW Non-fault status codes
-	 *
-	 * @note Obscurely, BASE_JD_EVENT_TERMINATED indicates a real fault,
-	 * because the job was hard-stopped
-	 */
-	BASE_JD_EVENT_RANGE_HW_NONFAULT_START = 0,
-
-	/* non-fatal exceptions */
-	BASE_JD_EVENT_NOT_STARTED = 0x00, /**< Can't be seen by userspace, treated as 'previous job done' */
-	BASE_JD_EVENT_DONE = 0x01,
-	BASE_JD_EVENT_STOPPED = 0x03,	  /**< Can't be seen by userspace, becomes TERMINATED, DONE or JOB_CANCELLED */
-	BASE_JD_EVENT_TERMINATED = 0x04,  /**< This is actually a fault status code - the job was hard stopped */
-	BASE_JD_EVENT_ACTIVE = 0x08,	  /**< Can't be seen by userspace, jobs only returned on complete/fail/cancel */
-
-	/** End of HW Non-fault status codes
-	 *
-	 * @note Obscurely, BASE_JD_EVENT_TERMINATED indicates a real fault,
-	 * because the job was hard-stopped
-	 */
-	BASE_JD_EVENT_RANGE_HW_NONFAULT_END = 0x40,
-
-	/** Start of HW fault and SW Error status codes */
-	BASE_JD_EVENT_RANGE_HW_FAULT_OR_SW_ERROR_START = 0x40,
-
-	/* job exceptions */
-	BASE_JD_EVENT_JOB_CONFIG_FAULT = 0x40,
-	BASE_JD_EVENT_JOB_POWER_FAULT = 0x41,
-	BASE_JD_EVENT_JOB_READ_FAULT = 0x42,
-	BASE_JD_EVENT_JOB_WRITE_FAULT = 0x43,
-	BASE_JD_EVENT_JOB_AFFINITY_FAULT = 0x44,
-	BASE_JD_EVENT_JOB_BUS_FAULT = 0x48,
-	BASE_JD_EVENT_INSTR_INVALID_PC = 0x50,
-	BASE_JD_EVENT_INSTR_INVALID_ENC = 0x51,
-	BASE_JD_EVENT_INSTR_TYPE_MISMATCH = 0x52,
-	BASE_JD_EVENT_INSTR_OPERAND_FAULT = 0x53,
-	BASE_JD_EVENT_INSTR_TLS_FAULT = 0x54,
-	BASE_JD_EVENT_INSTR_BARRIER_FAULT = 0x55,
-	BASE_JD_EVENT_INSTR_ALIGN_FAULT = 0x56,
-	BASE_JD_EVENT_DATA_INVALID_FAULT = 0x58,
-	BASE_JD_EVENT_TILE_RANGE_FAULT = 0x59,
-	BASE_JD_EVENT_STATE_FAULT = 0x5A,
-	BASE_JD_EVENT_OUT_OF_MEMORY = 0x60,
-	BASE_JD_EVENT_UNKNOWN = 0x7F,
-
-	/* GPU exceptions */
-	BASE_JD_EVENT_DELAYED_BUS_FAULT = 0x80,
-	BASE_JD_EVENT_SHAREABILITY_FAULT = 0x88,
-
-	/* MMU exceptions */
-	BASE_JD_EVENT_TRANSLATION_FAULT_LEVEL1 = 0xC1,
-	BASE_JD_EVENT_TRANSLATION_FAULT_LEVEL2 = 0xC2,
-	BASE_JD_EVENT_TRANSLATION_FAULT_LEVEL3 = 0xC3,
-	BASE_JD_EVENT_TRANSLATION_FAULT_LEVEL4 = 0xC4,
-	BASE_JD_EVENT_PERMISSION_FAULT = 0xC8,
-	BASE_JD_EVENT_TRANSTAB_BUS_FAULT_LEVEL1 = 0xD1,
-	BASE_JD_EVENT_TRANSTAB_BUS_FAULT_LEVEL2 = 0xD2,
-	BASE_JD_EVENT_TRANSTAB_BUS_FAULT_LEVEL3 = 0xD3,
-	BASE_JD_EVENT_TRANSTAB_BUS_FAULT_LEVEL4 = 0xD4,
-	BASE_JD_EVENT_ACCESS_FLAG = 0xD8,
-
-	/* SW defined exceptions */
-	BASE_JD_EVENT_MEM_GROWTH_FAILED	= BASE_JD_SW_EVENT | BASE_JD_SW_EVENT_JOB | 0x000,
-	BASE_JD_EVENT_TIMED_OUT		= BASE_JD_SW_EVENT | BASE_JD_SW_EVENT_JOB | 0x001,
-	BASE_JD_EVENT_JOB_CANCELLED	= BASE_JD_SW_EVENT | BASE_JD_SW_EVENT_JOB | 0x002,
-	BASE_JD_EVENT_JOB_INVALID	= BASE_JD_SW_EVENT | BASE_JD_SW_EVENT_JOB | 0x003,
-	BASE_JD_EVENT_PM_EVENT		= BASE_JD_SW_EVENT | BASE_JD_SW_EVENT_JOB | 0x004,
-	BASE_JD_EVENT_FORCE_REPLAY	= BASE_JD_SW_EVENT | BASE_JD_SW_EVENT_JOB | 0x005,
-
-	BASE_JD_EVENT_BAG_INVALID	= BASE_JD_SW_EVENT | BASE_JD_SW_EVENT_BAG | 0x003,
-
-	/** End of HW fault and SW Error status codes */
-	BASE_JD_EVENT_RANGE_HW_FAULT_OR_SW_ERROR_END = BASE_JD_SW_EVENT | BASE_JD_SW_EVENT_RESERVED | 0x3FF,
-
-	/** Start of SW Success status codes */
-	BASE_JD_EVENT_RANGE_SW_SUCCESS_START = BASE_JD_SW_EVENT | BASE_JD_SW_EVENT_SUCCESS | 0x000,
-
-	BASE_JD_EVENT_PROGRESS_REPORT = BASE_JD_SW_EVENT | BASE_JD_SW_EVENT_SUCCESS | BASE_JD_SW_EVENT_JOB | 0x000,
-	BASE_JD_EVENT_BAG_DONE = BASE_JD_SW_EVENT | BASE_JD_SW_EVENT_SUCCESS | BASE_JD_SW_EVENT_BAG | 0x000,
-	BASE_JD_EVENT_DRV_TERMINATED = BASE_JD_SW_EVENT | BASE_JD_SW_EVENT_SUCCESS | BASE_JD_SW_EVENT_INFO | 0x000,
-
-	/** End of SW Success status codes */
-	BASE_JD_EVENT_RANGE_SW_SUCCESS_END = BASE_JD_SW_EVENT | BASE_JD_SW_EVENT_SUCCESS | BASE_JD_SW_EVENT_RESERVED | 0x3FF,
-
-	/** Start of Kernel-only status codes. Such codes are never returned to user-space */
-	BASE_JD_EVENT_RANGE_KERNEL_ONLY_START = BASE_JD_SW_EVENT | BASE_JD_SW_EVENT_KERNEL | 0x000,
-	BASE_JD_EVENT_REMOVED_FROM_NEXT = BASE_JD_SW_EVENT | BASE_JD_SW_EVENT_KERNEL | BASE_JD_SW_EVENT_JOB | 0x000,
-
-	/** End of Kernel-only status codes. */
-	BASE_JD_EVENT_RANGE_KERNEL_ONLY_END = BASE_JD_SW_EVENT | BASE_JD_SW_EVENT_KERNEL | BASE_JD_SW_EVENT_RESERVED | 0x3FF
-} base_jd_event_code;
-
-/**
- * @brief Event reporting structure
- *
- * This structure is used by the kernel driver to report information
- * about GPU events. The can either be HW-specific events or low-level
- * SW events, such as job-chain completion.
- *
- * The event code contains an event type field which can be extracted
- * by ANDing with ::BASE_JD_SW_EVENT_TYPE_MASK.
- *
- * Based on the event type base_jd_event::data holds:
- * @li ::BASE_JD_SW_EVENT_JOB : the offset in the ring-buffer for the completed
- * job-chain
- * @li ::BASE_JD_SW_EVENT_BAG : The address of the ::base_jd_bag that has
- * been completed (ie all contained job-chains have been completed).
- * @li ::BASE_JD_SW_EVENT_INFO : base_jd_event::data not used
- */
-typedef struct base_jd_event_v2 {
-	base_jd_event_code event_code;  /**< event code */
-	base_atom_id atom_number;       /**< the atom number that has completed */
-	struct base_jd_udata udata;     /**< user data */
-} base_jd_event_v2;
-
-/**
- * @brief Structure for BASE_JD_REQ_SOFT_DUMP_CPU_GPU_COUNTERS jobs.
- *
- * This structure is stored into the memory pointed to by the @c jc field
- * of @ref base_jd_atom.
- *
- * It must not occupy the same CPU cache line(s) as any neighboring data.
- * This is to avoid cases where access to pages containing the structure
- * is shared between cached and un-cached memory regions, which would
- * cause memory corruption.
- */
-
-typedef struct base_dump_cpu_gpu_counters {
-	u64 system_time;
-	u64 cycle_counter;
-	u64 sec;
-	u32 usec;
-	u8 padding[36];
-} base_dump_cpu_gpu_counters;
-
-/** @} end group base_user_api_job_dispatch */
-
-#define GPU_MAX_JOB_SLOTS 16
-
-/**
- * @page page_base_user_api_gpuprops User-side Base GPU Property Query API
- *
- * The User-side Base GPU Property Query API encapsulates two
- * sub-modules:
- *
- * - @ref base_user_api_gpuprops_dyn "Dynamic GPU Properties"
- * - @ref base_plat_config_gpuprops "Base Platform Config GPU Properties"
- *
- * There is a related third module outside of Base, which is owned by the MIDG
- * module:
- * - @ref gpu_props_static "Midgard Compile-time GPU Properties"
- *
- * Base only deals with properties that vary between different Midgard
- * implementations - the Dynamic GPU properties and the Platform Config
- * properties.
- *
- * For properties that are constant for the Midgard Architecture, refer to the
- * MIDG module. However, we will discuss their relevance here <b>just to
- * provide background information.</b>
- *
- * @section sec_base_user_api_gpuprops_about About the GPU Properties in Base and MIDG modules
- *
- * The compile-time properties (Platform Config, Midgard Compile-time
- * properties) are exposed as pre-processor macros.
- *
- * Complementing the compile-time properties are the Dynamic GPU
- * Properties, which act as a conduit for the Midgard Configuration
- * Discovery.
- *
- * In general, the dynamic properties are present to verify that the platform
- * has been configured correctly with the right set of Platform Config
- * Compile-time Properties.
- *
- * As a consistent guide across the entire DDK, the choice for dynamic or
- * compile-time should consider the following, in order:
- * -# Can the code be written so that it doesn't need to know the
- * implementation limits at all?
- * -# If you need the limits, get the information from the Dynamic Property
- * lookup. This should be done once as you fetch the context, and then cached
- * as part of the context data structure, so it's cheap to access.
- * -# If there's a clear and arguable inefficiency in using Dynamic Properties,
- * then use a Compile-Time Property (Platform Config, or Midgard Compile-time
- * property). Examples of where this might be sensible follow:
- *  - Part of a critical inner-loop
- *  - Frequent re-use throughout the driver, causing significant extra load
- * instructions or control flow that would be worthwhile optimizing out.
- *
- * We cannot provide an exhaustive set of examples, neither can we provide a
- * rule for every possible situation. Use common sense, and think about: what
- * the rest of the driver will be doing; how the compiler might represent the
- * value if it is a compile-time constant; whether an OEM shipping multiple
- * devices would benefit much more from a single DDK binary, instead of
- * insignificant micro-optimizations.
- *
- * @section sec_base_user_api_gpuprops_dyn Dynamic GPU Properties
- *
- * Dynamic GPU properties are presented in two sets:
- * -# the commonly used properties in @ref base_gpu_props, which have been
- * unpacked from GPU register bitfields.
- * -# The full set of raw, unprocessed properties in @ref gpu_raw_gpu_props
- * (also a member of @ref base_gpu_props). All of these are presented in
- * the packed form, as presented by the GPU  registers themselves.
- *
- * @usecase The raw properties in @ref gpu_raw_gpu_props are necessary to
- * allow a user of the Mali Tools (e.g. PAT) to determine "Why is this device
- * behaving differently?". In this case, all information about the
- * configuration is potentially useful, but it <b>does not need to be processed
- * by the driver</b>. Instead, the raw registers can be processed by the Mali
- * Tools software on the host PC.
- *
- * The properties returned extend the Midgard Configuration Discovery
- * registers. For example, GPU clock speed is not specified in the Midgard
- * Architecture, but is <b>necessary for OpenCL's clGetDeviceInfo() function</b>.
- *
- * The GPU properties are obtained by a call to
- * _mali_base_get_gpu_props(). This simply returns a pointer to a const
- * base_gpu_props structure. It is constant for the life of a base
- * context. Multiple calls to _mali_base_get_gpu_props() to a base context
- * return the same pointer to a constant structure. This avoids cache pollution
- * of the common data.
- *
- * This pointer must not be freed, because it does not point to the start of a
- * region allocated by the memory allocator; instead, just close the @ref
- * base_context.
- *
- *
- * @section sec_base_user_api_gpuprops_config Platform Config Compile-time Properties
- *
- * The Platform Config File sets up gpu properties that are specific to a
- * certain platform. Properties that are 'Implementation Defined' in the
- * Midgard Architecture spec are placed here.
- *
- * @note Reference configurations are provided for Midgard Implementations, such as
- * the Mali-T600 family. The customer need not repeat this information, and can select one of
- * these reference configurations. For example, VA_BITS, PA_BITS and the
- * maximum number of samples per pixel might vary between Midgard Implementations, but
- * \b not for platforms using the Mali-T604. This information is placed in
- * the reference configuration files.
- *
- * The System Integrator creates the following structure:
- * - platform_XYZ
- * - platform_XYZ/plat
- * - platform_XYZ/plat/plat_config.h
- *
- * They then edit plat_config.h, using the example plat_config.h files as a
- * guide.
- *
- * At the very least, the customer must set @ref CONFIG_GPU_CORE_TYPE, and will
- * receive a helpful \#error message if they do not do this correctly. This
- * selects the Reference Configuration for the Midgard Implementation. The rationale
- * behind this decision (against asking the customer to write \#include
- * <gpus/mali_t600.h> in their plat_config.h) is as follows:
- * - This mechanism 'looks' like a regular config file (such as Linux's
- * .config)
- * - It is difficult to get wrong in a way that will produce strange build
- * errors:
- *  - They need not know where the mali_t600.h, other_midg_gpu.h etc. files are stored - and
- *  so they won't accidentally pick another file with 'mali_t600' in its name
- *  - When the build doesn't work, the System Integrator may think the DDK is
- *  doesn't work, and attempt to fix it themselves:
- *   - For the @ref CONFIG_GPU_CORE_TYPE mechanism, the only way to get past the
- *   error is to set @ref CONFIG_GPU_CORE_TYPE, and this is what the \#error tells
- *   you.
- *   - For a \#include mechanism, checks must still be made elsewhere, which the
- *   System Integrator may try working around by setting \#defines (such as
- *   VA_BITS) themselves in their plat_config.h. In the  worst case, they may
- *   set the prevention-mechanism \#define of
- *   "A_CORRECT_MIDGARD_CORE_WAS_CHOSEN".
- *   - In this case, they would believe they are on the right track, because
- *   the build progresses with their fix, but with errors elsewhere.
- *
- * However, there is nothing to prevent the customer using \#include to organize
- * their own configurations files hierarchically.
- *
- * The mechanism for the header file processing is as follows:
- *
- * @dot
-   digraph plat_config_mechanism {
-	   rankdir=BT
-	   size="6,6"
-
-       "mali_base.h";
-	   "gpu/mali_gpu.h";
-
-	   node [ shape=box ];
-	   {
-	       rank = same; ordering = out;
-
-		   "gpu/mali_gpu_props.h";
-		   "base/midg_gpus/mali_t600.h";
-		   "base/midg_gpus/other_midg_gpu.h";
-	   }
-	   { rank = same; "plat/plat_config.h"; }
-	   {
-	       rank = same;
-		   "gpu/mali_gpu.h" [ shape=box ];
-		   gpu_chooser [ label="" style="invisible" width=0 height=0 fixedsize=true ];
-		   select_gpu [ label="Mali-T600 | Other\n(select_gpu.h)" shape=polygon,sides=4,distortion=0.25 width=3.3 height=0.99 fixedsize=true ] ;
-	   }
-	   node [ shape=box ];
-	   { rank = same; "plat/plat_config.h"; }
-	   { rank = same; "mali_base.h"; }
-
-	   "mali_base.h" -> "gpu/mali_gpu.h" -> "gpu/mali_gpu_props.h";
-	   "mali_base.h" -> "plat/plat_config.h" ;
-	   "mali_base.h" -> select_gpu ;
-
-	   "plat/plat_config.h" -> gpu_chooser [style="dotted,bold" dir=none weight=4] ;
-	   gpu_chooser -> select_gpu [style="dotted,bold"] ;
-
-	   select_gpu -> "base/midg_gpus/mali_t600.h" ;
-	   select_gpu -> "base/midg_gpus/other_midg_gpu.h" ;
-   }
-   @enddot
- *
- *
- * @section sec_base_user_api_gpuprops_kernel Kernel Operation
- *
- * During Base Context Create time, user-side makes a single kernel call:
- * - A call to fill user memory with GPU information structures
- *
- * The kernel-side will fill the provided the entire processed @ref base_gpu_props
- * structure, because this information is required in both
- * user and kernel side; it does not make sense to decode it twice.
- *
- * Coherency groups must be derived from the bitmasks, but this can be done
- * kernel side, and just once at kernel startup: Coherency groups must already
- * be known kernel-side, to support chains that specify a 'Only Coherent Group'
- * SW requirement, or 'Only Coherent Group with Tiler' SW requirement.
- *
- * @section sec_base_user_api_gpuprops_cocalc Coherency Group calculation
- * Creation of the coherent group data is done at device-driver startup, and so
- * is one-time. This will most likely involve a loop with CLZ, shifting, and
- * bit clearing on the L2_PRESENT mask, depending on whether the
- * system is L2 Coherent. The number of shader cores is done by a
- * population count, since faulty cores may be disabled during production,
- * producing a non-contiguous mask.
- *
- * The memory requirements for this algorithm can be determined either by a u64
- * population count on the L2_PRESENT mask (a LUT helper already is
- * required for the above), or simple assumption that there can be no more than
- * 16 coherent groups, since core groups are typically 4 cores.
- */
-
-/**
- * @addtogroup base_user_api_gpuprops User-side Base GPU Property Query APIs
- * @{
- */
-
-/**
- * @addtogroup base_user_api_gpuprops_dyn Dynamic HW Properties
- * @{
- */
-
-#define BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS 3
-
-#define BASE_MAX_COHERENT_GROUPS 16
-
-struct mali_base_gpu_core_props {
-	/**
-	 * Product specific value.
-	 */
-	u32 product_id;
-
-	/**
-	 * Status of the GPU release.
-	 * No defined values, but starts at 0 and increases by one for each
-	 * release status (alpha, beta, EAC, etc.).
-	 * 4 bit values (0-15).
-	 */
-	u16 version_status;
-
-	/**
-	 * Minor release number of the GPU. "P" part of an "RnPn" release number.
-     * 8 bit values (0-255).
-	 */
-	u16 minor_revision;
-
-	/**
-	 * Major release number of the GPU. "R" part of an "RnPn" release number.
-     * 4 bit values (0-15).
-	 */
-	u16 major_revision;
-
-	u16 padding;
-
-	/**
-	 * This property is deprecated since it has not contained the real current
-	 * value of GPU clock speed. It is kept here only for backwards compatibility.
-	 * For the new ioctl interface, it is ignored and is treated as a padding
-	 * to keep the structure of the same size and retain the placement of its
-	 * members.
-	 */
-	u32 gpu_speed_mhz;
-
-	/**
-	 * @usecase GPU clock max/min speed is required for computing best/worst case
-	 * in tasks as job scheduling ant irq_throttling. (It is not specified in the
-	 *  Midgard Architecture).
-	 * Also, GPU clock max speed is used for OpenCL's clGetDeviceInfo() function.
-	 */
-	u32 gpu_freq_khz_max;
-	u32 gpu_freq_khz_min;
-
-	/**
-	 * Size of the shader program counter, in bits.
-	 */
-	u32 log2_program_counter_size;
-
-	/**
-	 * TEXTURE_FEATURES_x registers, as exposed by the GPU. This is a
-	 * bitpattern where a set bit indicates that the format is supported.
-	 *
-	 * Before using a texture format, it is recommended that the corresponding
-	 * bit be checked.
-	 */
-	u32 texture_features[BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS];
-
-	/**
-	 * Theoretical maximum memory available to the GPU. It is unlikely that a
-	 * client will be able to allocate all of this memory for their own
-	 * purposes, but this at least provides an upper bound on the memory
-	 * available to the GPU.
-	 *
-	 * This is required for OpenCL's clGetDeviceInfo() call when
-	 * CL_DEVICE_GLOBAL_MEM_SIZE is requested, for OpenCL GPU devices. The
-	 * client will not be expecting to allocate anywhere near this value.
-	 */
-	u64 gpu_available_memory_size;
-};
-
-/**
- *
- * More information is possible - but associativity and bus width are not
- * required by upper-level apis.
- */
-struct mali_base_gpu_l2_cache_props {
-	u8 log2_line_size;
-	u8 log2_cache_size;
-	u8 num_l2_slices; /* Number of L2C slices. 1 or higher */
-	u8 padding[5];
-};
-
-struct mali_base_gpu_tiler_props {
-	u32 bin_size_bytes;	/* Max is 4*2^15 */
-	u32 max_active_levels;	/* Max is 2^15 */
-};
-
-/**
- * GPU threading system details.
- */
-struct mali_base_gpu_thread_props {
-	u32 max_threads;            /* Max. number of threads per core */
-	u32 max_workgroup_size;     /* Max. number of threads per workgroup */
-	u32 max_barrier_size;       /* Max. number of threads that can synchronize on a simple barrier */
-	u16 max_registers;          /* Total size [1..65535] of the register file available per core. */
-	u8  max_task_queue;         /* Max. tasks [1..255] which may be sent to a core before it becomes blocked. */
-	u8  max_thread_group_split; /* Max. allowed value [1..15] of the Thread Group Split field. */
-	u8  impl_tech;              /* 0 = Not specified, 1 = Silicon, 2 = FPGA, 3 = SW Model/Emulation */
-	u8  padding[7];
-};
-
-/**
- * @brief descriptor for a coherent group
- *
- * \c core_mask exposes all cores in that coherent group, and \c num_cores
- * provides a cached population-count for that mask.
- *
- * @note Whilst all cores are exposed in the mask, not all may be available to
- * the application, depending on the Kernel Power policy.
- *
- * @note if u64s must be 8-byte aligned, then this structure has 32-bits of wastage.
- */
-struct mali_base_gpu_coherent_group {
-	u64 core_mask;	       /**< Core restriction mask required for the group */
-	u16 num_cores;	       /**< Number of cores in the group */
-	u16 padding[3];
-};
-
-/**
- * @brief Coherency group information
- *
- * Note that the sizes of the members could be reduced. However, the \c group
- * member might be 8-byte aligned to ensure the u64 core_mask is 8-byte
- * aligned, thus leading to wastage if the other members sizes were reduced.
- *
- * The groups are sorted by core mask. The core masks are non-repeating and do
- * not intersect.
- */
-struct mali_base_gpu_coherent_group_info {
-	u32 num_groups;
-
-	/**
-	 * Number of core groups (coherent or not) in the GPU. Equivalent to the number of L2 Caches.
-	 *
-	 * The GPU Counter dumping writes 2048 bytes per core group, regardless of
-	 * whether the core groups are coherent or not. Hence this member is needed
-	 * to calculate how much memory is required for dumping.
-	 *
-	 * @note Do not use it to work out how many valid elements are in the
-	 * group[] member. Use num_groups instead.
-	 */
-	u32 num_core_groups;
-
-	/**
-	 * Coherency features of the memory, accessed by @ref gpu_mem_features
-	 * methods
-	 */
-	u32 coherency;
-
-	u32 padding;
-
-	/**
-	 * Descriptors of coherent groups
-	 */
-	struct mali_base_gpu_coherent_group group[BASE_MAX_COHERENT_GROUPS];
-};
-
-/**
- * A complete description of the GPU's Hardware Configuration Discovery
- * registers.
- *
- * The information is presented inefficiently for access. For frequent access,
- * the values should be better expressed in an unpacked form in the
- * base_gpu_props structure.
- *
- * @usecase The raw properties in @ref gpu_raw_gpu_props are necessary to
- * allow a user of the Mali Tools (e.g. PAT) to determine "Why is this device
- * behaving differently?". In this case, all information about the
- * configuration is potentially useful, but it <b>does not need to be processed
- * by the driver</b>. Instead, the raw registers can be processed by the Mali
- * Tools software on the host PC.
- *
- */
-struct gpu_raw_gpu_props {
-	u64 shader_present;
-	u64 tiler_present;
-	u64 l2_present;
-	u64 stack_present;
-
-	u32 l2_features;
-	u32 suspend_size; /* API 8.2+ */
-	u32 mem_features;
-	u32 mmu_features;
-
-	u32 as_present;
-
-	u32 js_present;
-	u32 js_features[GPU_MAX_JOB_SLOTS];
-	u32 tiler_features;
-	u32 texture_features[3];
-
-	u32 gpu_id;
-
-	u32 thread_max_threads;
-	u32 thread_max_workgroup_size;
-	u32 thread_max_barrier_size;
-	u32 thread_features;
-
-	/*
-	 * Note: This is the _selected_ coherency mode rather than the
-	 * available modes as exposed in the coherency_features register.
-	 */
-	u32 coherency_mode;
-};
-
-/**
- * Return structure for _mali_base_get_gpu_props().
- *
- * NOTE: the raw_props member in this data structure contains the register
- * values from which the value of the other members are derived. The derived
- * members exist to allow for efficient access and/or shielding the details
- * of the layout of the registers.
- *
- */
-typedef struct mali_base_gpu_props {
-	struct mali_base_gpu_core_props core_props;
-	struct mali_base_gpu_l2_cache_props l2_props;
-	u64 unused_1; /* keep for backwards compatibility */
-	struct mali_base_gpu_tiler_props tiler_props;
-	struct mali_base_gpu_thread_props thread_props;
-
-	/** This member is large, likely to be 128 bytes */
-	struct gpu_raw_gpu_props raw_props;
-
-	/** This must be last member of the structure */
-	struct mali_base_gpu_coherent_group_info coherency_info;
-} base_gpu_props;
-
-/** @} end group base_user_api_gpuprops_dyn */
-
-/** @} end group base_user_api_gpuprops */
-
-/**
- * @addtogroup base_user_api_core User-side Base core APIs
- * @{
- */
-
-/**
- * \enum base_context_create_flags
- *
- * Flags to pass to ::base_context_init.
- * Flags can be ORed together to enable multiple things.
- *
- * These share the same space as BASEP_CONTEXT_FLAG_*, and so must
- * not collide with them.
- */
-enum base_context_create_flags {
-	/** No flags set */
-	BASE_CONTEXT_CREATE_FLAG_NONE = 0,
-
-	/** Base context is embedded in a cctx object (flag used for CINSTR software counter macros) */
-	BASE_CONTEXT_CCTX_EMBEDDED = (1u << 0),
-
-	/** Base context is a 'System Monitor' context for Hardware counters.
-	 *
-	 * One important side effect of this is that job submission is disabled. */
-	BASE_CONTEXT_SYSTEM_MONITOR_SUBMIT_DISABLED = (1u << 1)
-};
-
-/**
- * Bitpattern describing the ::base_context_create_flags that can be passed to base_context_init()
- */
-#define BASE_CONTEXT_CREATE_ALLOWED_FLAGS \
-	(((u32)BASE_CONTEXT_CCTX_EMBEDDED) | \
-	  ((u32)BASE_CONTEXT_SYSTEM_MONITOR_SUBMIT_DISABLED))
-
-/**
- * Bitpattern describing the ::base_context_create_flags that can be passed to the kernel
- */
-#define BASE_CONTEXT_CREATE_KERNEL_FLAGS \
-	((u32)BASE_CONTEXT_SYSTEM_MONITOR_SUBMIT_DISABLED)
-
-/*
- * Private flags used on the base context
- *
- * These start at bit 31, and run down to zero.
- *
- * They share the same space as @ref base_context_create_flags, and so must
- * not collide with them.
- */
-/** Private flag tracking whether job descriptor dumping is disabled */
-#define BASEP_CONTEXT_FLAG_JOB_DUMP_DISABLED ((u32)(1 << 31))
-
-/** @} end group base_user_api_core */
-
-/** @} end group base_user_api */
-
-/**
- * @addtogroup base_plat_config_gpuprops Base Platform Config GPU Properties
- * @{
- *
- * C Pre-processor macros are exposed here to do with Platform
- * Config.
- *
- * These include:
- * - GPU Properties that are constant on a particular Midgard Family
- * Implementation e.g. Maximum samples per pixel on Mali-T600.
- * - General platform config for the GPU, such as the GPU major and minor
- * revison.
- */
-
-/** @} end group base_plat_config_gpuprops */
-
-/**
- * @addtogroup base_api Base APIs
- * @{
- */
-
-/**
- * @brief The payload for a replay job. This must be in GPU memory.
- */
-typedef struct base_jd_replay_payload {
-	/**
-	 * Pointer to the first entry in the base_jd_replay_jc list.  These
-	 * will be replayed in @b reverse order (so that extra ones can be added
-	 * to the head in future soft jobs without affecting this soft job)
-	 */
-	u64 tiler_jc_list;
-
-	/**
-	 * Pointer to the fragment job chain.
-	 */
-	u64 fragment_jc;
-
-	/**
-	 * Pointer to the tiler heap free FBD field to be modified.
-	 */
-	u64 tiler_heap_free;
-
-	/**
-	 * Hierarchy mask for the replayed fragment jobs. May be zero.
-	 */
-	u16 fragment_hierarchy_mask;
-
-	/**
-	 * Hierarchy mask for the replayed tiler jobs. May be zero.
-	 */
-	u16 tiler_hierarchy_mask;
-
-	/**
-	 * Default weight to be used for hierarchy levels not in the original
-	 * mask.
-	 */
-	u32 hierarchy_default_weight;
-
-	/**
-	 * Core requirements for the tiler job chain
-	 */
-	base_jd_core_req tiler_core_req;
-
-	/**
-	 * Core requirements for the fragment job chain
-	 */
-	base_jd_core_req fragment_core_req;
-} base_jd_replay_payload;
-
-#ifdef BASE_LEGACY_UK10_2_SUPPORT
-typedef struct base_jd_replay_payload_uk10_2 {
-	u64 tiler_jc_list;
-	u64 fragment_jc;
-	u64 tiler_heap_free;
-	u16 fragment_hierarchy_mask;
-	u16 tiler_hierarchy_mask;
-	u32 hierarchy_default_weight;
-	u16 tiler_core_req;
-	u16 fragment_core_req;
-	u8 padding[4];
-} base_jd_replay_payload_uk10_2;
-#endif /* BASE_LEGACY_UK10_2_SUPPORT */
-
-/**
- * @brief An entry in the linked list of job chains to be replayed. This must
- *        be in GPU memory.
- */
-typedef struct base_jd_replay_jc {
-	/**
-	 * Pointer to next entry in the list. A setting of NULL indicates the
-	 * end of the list.
-	 */
-	u64 next;
-
-	/**
-	 * Pointer to the job chain.
-	 */
-	u64 jc;
-
-} base_jd_replay_jc;
-
-/* Maximum number of jobs allowed in a fragment chain in the payload of a
- * replay job */
-#define BASE_JD_REPLAY_F_CHAIN_JOB_LIMIT 256
-
-/** @} end group base_api */
-
-typedef struct base_profiling_controls {
-	u32 profiling_controls[FBDUMP_CONTROL_MAX];
-} base_profiling_controls;
-
-/* Enable additional tracepoints for latency measurements (TL_ATOM_READY,
- * TL_ATOM_DONE, TL_ATOM_PRIO_CHANGE, TL_ATOM_EVENT_POST) */
-#define BASE_TLSTREAM_ENABLE_LATENCY_TRACEPOINTS (1 << 0)
-
-/* Indicate that job dumping is enabled. This could affect certain timers
- * to account for the performance impact. */
-#define BASE_TLSTREAM_JOB_DUMPING_ENABLED (1 << 1)
-
-#define BASE_TLSTREAM_FLAGS_MASK (BASE_TLSTREAM_ENABLE_LATENCY_TRACEPOINTS | \
-		BASE_TLSTREAM_JOB_DUMPING_ENABLED)
-
-#endif				/* _BASE_KERNEL_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_base_mem_priv.h b/drivers/gpu/arm/bifrost_for_linux/mali_base_mem_priv.h
deleted file mode 100644
index 4a98a72cc37a..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_base_mem_priv.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2014 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#ifndef _BASE_MEM_PRIV_H_
-#define _BASE_MEM_PRIV_H_
-
-#define BASE_SYNCSET_OP_MSYNC	(1U << 0)
-#define BASE_SYNCSET_OP_CSYNC	(1U << 1)
-
-/*
- * This structure describe a basic memory coherency operation.
- * It can either be:
- * @li a sync from CPU to Memory:
- *	- type = ::BASE_SYNCSET_OP_MSYNC
- *	- mem_handle = a handle to the memory object on which the operation
- *	  is taking place
- *	- user_addr = the address of the range to be synced
- *	- size = the amount of data to be synced, in bytes
- *	- offset is ignored.
- * @li a sync from Memory to CPU:
- *	- type = ::BASE_SYNCSET_OP_CSYNC
- *	- mem_handle = a handle to the memory object on which the operation
- *	  is taking place
- *	- user_addr = the address of the range to be synced
- *	- size = the amount of data to be synced, in bytes.
- *	- offset is ignored.
- */
-struct basep_syncset {
-	base_mem_handle mem_handle;
-	u64 user_addr;
-	u64 size;
-	u8 type;
-	u8 padding[7];
-};
-
-#endif
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_base_vendor_specific_func.h b/drivers/gpu/arm/bifrost_for_linux/mali_base_vendor_specific_func.h
deleted file mode 100644
index be454a216a39..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_base_vendor_specific_func.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010, 2012-2013, 2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-#ifndef _BASE_VENDOR_SPEC_FUNC_H_
-#define _BASE_VENDOR_SPEC_FUNC_H_
-
-int kbase_get_vendor_specific_cpu_clock_speed(u32 * const);
-
-#endif	/*_BASE_VENDOR_SPEC_FUNC_H_*/
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase.h
deleted file mode 100644
index 1fe936ea6012..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase.h
+++ /dev/null
@@ -1,616 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#ifndef _KBASE_H_
-#define _KBASE_H_
-
-#include <mali_malisw.h>
-
-#include <mali_kbase_debug.h>
-
-#include <asm/page.h>
-
-#include <linux/atomic.h>
-#include <linux/highmem.h>
-#include <linux/hrtimer.h>
-#include <linux/ktime.h>
-#include <linux/list.h>
-#include <linux/mm_types.h>
-#include <linux/mutex.h>
-#include <linux/rwsem.h>
-#include <linux/sched.h>
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0))
-#include <linux/sched/mm.h>
-#endif
-#include <linux/slab.h>
-#include <linux/spinlock.h>
-#include <linux/vmalloc.h>
-#include <linux/wait.h>
-#include <linux/workqueue.h>
-
-#include "mali_base_kernel.h"
-#include <mali_kbase_uku.h>
-#include <mali_kbase_linux.h>
-
-/*
- * Include mali_kbase_defs.h first as this provides types needed by other local
- * header files.
- */
-#include "mali_kbase_defs.h"
-
-#include "mali_kbase_context.h"
-#include "mali_kbase_strings.h"
-#include "mali_kbase_mem_lowlevel.h"
-#include "mali_kbase_trace_timeline.h"
-#include "mali_kbase_js.h"
-#include "mali_kbase_mem.h"
-#include "mali_kbase_utility.h"
-#include "mali_kbase_gpu_memory_debugfs.h"
-#include "mali_kbase_mem_profile_debugfs.h"
-#include "mali_kbase_debug_job_fault.h"
-#include "mali_kbase_jd_debugfs.h"
-#include "mali_kbase_gpuprops.h"
-#include "mali_kbase_jm.h"
-#include "mali_kbase_vinstr.h"
-
-#include "ipa/mali_kbase_ipa.h"
-
-#ifdef CONFIG_GPU_TRACEPOINTS
-#include <trace/events/gpu.h>
-#endif
-
-#ifndef u64_to_user_ptr
-/* Introduced in Linux v4.6 */
-#define u64_to_user_ptr(x) ((void __user *)(uintptr_t)x)
-#endif
-
-/*
- * Kernel-side Base (KBase) APIs
- */
-
-struct kbase_device *kbase_device_alloc(void);
-/*
-* note: configuration attributes member of kbdev needs to have
-* been setup before calling kbase_device_init
-*/
-
-/*
-* API to acquire device list semaphore and return pointer
-* to the device list head
-*/
-const struct list_head *kbase_dev_list_get(void);
-/* API to release the device list semaphore */
-void kbase_dev_list_put(const struct list_head *dev_list);
-
-int kbase_device_init(struct kbase_device * const kbdev);
-void kbase_device_term(struct kbase_device *kbdev);
-void kbase_device_free(struct kbase_device *kbdev);
-int kbase_device_has_feature(struct kbase_device *kbdev, u32 feature);
-
-/* Needed for gator integration and for reporting vsync information */
-struct kbase_device *kbase_find_device(int minor);
-void kbase_release_device(struct kbase_device *kbdev);
-
-void kbase_set_profiling_control(struct kbase_device *kbdev, u32 control, u32 value);
-
-struct kbase_context *
-kbase_create_context(struct kbase_device *kbdev, bool is_compat);
-void kbase_destroy_context(struct kbase_context *kctx);
-
-int kbase_jd_init(struct kbase_context *kctx);
-void kbase_jd_exit(struct kbase_context *kctx);
-
-/**
- * kbase_jd_submit - Submit atoms to the job dispatcher
- *
- * @kctx: The kbase context to submit to
- * @user_addr: The address in user space of the struct base_jd_atom_v2 array
- * @nr_atoms: The number of atoms in the array
- * @stride: sizeof(struct base_jd_atom_v2)
- * @uk6_atom: true if the atoms are legacy atoms (struct base_jd_atom_v2_uk6)
- *
- * Return: 0 on success or error code
- */
-int kbase_jd_submit(struct kbase_context *kctx,
-		void __user *user_addr, u32 nr_atoms, u32 stride,
-		bool uk6_atom);
-
-/**
- * kbase_jd_done_worker - Handle a job completion
- * @data: a &struct work_struct
- *
- * This function requeues the job from the runpool (if it was soft-stopped or
- * removed from NEXT registers).
- *
- * Removes it from the system if it finished/failed/was cancelled.
- *
- * Resolves dependencies to add dependent jobs to the context, potentially
- * starting them if necessary (which may add more references to the context)
- *
- * Releases the reference to the context from the no-longer-running job.
- *
- * Handles retrying submission outside of IRQ context if it failed from within
- * IRQ context.
- */
-void kbase_jd_done_worker(struct work_struct *data);
-
-void kbase_jd_done(struct kbase_jd_atom *katom, int slot_nr, ktime_t *end_timestamp,
-		kbasep_js_atom_done_code done_code);
-void kbase_jd_cancel(struct kbase_device *kbdev, struct kbase_jd_atom *katom);
-void kbase_jd_zap_context(struct kbase_context *kctx);
-bool jd_done_nolock(struct kbase_jd_atom *katom,
-		struct list_head *completed_jobs_ctx);
-void kbase_jd_free_external_resources(struct kbase_jd_atom *katom);
-bool jd_submit_atom(struct kbase_context *kctx,
-			 const struct base_jd_atom_v2 *user_atom,
-			 struct kbase_jd_atom *katom);
-void kbase_jd_dep_clear_locked(struct kbase_jd_atom *katom);
-
-void kbase_job_done(struct kbase_device *kbdev, u32 done);
-
-/**
- * kbase_job_slot_ctx_priority_check_locked(): - Check for lower priority atoms
- *                                               and soft stop them
- * @kctx: Pointer to context to check.
- * @katom: Pointer to priority atom.
- *
- * Atoms from @kctx on the same job slot as @katom, which have lower priority
- * than @katom will be soft stopped and put back in the queue, so that atoms
- * with higher priority can run.
- *
- * The hwaccess_lock must be held when calling this function.
- */
-void kbase_job_slot_ctx_priority_check_locked(struct kbase_context *kctx,
-				struct kbase_jd_atom *katom);
-
-void kbase_job_slot_softstop(struct kbase_device *kbdev, int js,
-		struct kbase_jd_atom *target_katom);
-void kbase_job_slot_softstop_swflags(struct kbase_device *kbdev, int js,
-		struct kbase_jd_atom *target_katom, u32 sw_flags);
-void kbase_job_slot_hardstop(struct kbase_context *kctx, int js,
-		struct kbase_jd_atom *target_katom);
-void kbase_job_check_enter_disjoint(struct kbase_device *kbdev, u32 action,
-		base_jd_core_req core_reqs, struct kbase_jd_atom *target_katom);
-void kbase_job_check_leave_disjoint(struct kbase_device *kbdev,
-		struct kbase_jd_atom *target_katom);
-
-void kbase_event_post(struct kbase_context *ctx, struct kbase_jd_atom *event);
-int kbase_event_dequeue(struct kbase_context *ctx, struct base_jd_event_v2 *uevent);
-int kbase_event_pending(struct kbase_context *ctx);
-int kbase_event_init(struct kbase_context *kctx);
-void kbase_event_close(struct kbase_context *kctx);
-void kbase_event_cleanup(struct kbase_context *kctx);
-void kbase_event_wakeup(struct kbase_context *kctx);
-
-int kbase_process_soft_job(struct kbase_jd_atom *katom);
-int kbase_prepare_soft_job(struct kbase_jd_atom *katom);
-void kbase_finish_soft_job(struct kbase_jd_atom *katom);
-void kbase_cancel_soft_job(struct kbase_jd_atom *katom);
-void kbase_resume_suspended_soft_jobs(struct kbase_device *kbdev);
-void kbasep_remove_waiting_soft_job(struct kbase_jd_atom *katom);
-#if defined(CONFIG_SYNC) || defined(CONFIG_SYNC_FILE)
-void kbase_soft_event_wait_callback(struct kbase_jd_atom *katom);
-#endif
-int kbase_soft_event_update(struct kbase_context *kctx,
-			    u64 event,
-			    unsigned char new_status);
-
-bool kbase_replay_process(struct kbase_jd_atom *katom);
-
-void kbasep_soft_job_timeout_worker(struct timer_list *t);
-void kbasep_complete_triggered_soft_events(struct kbase_context *kctx, u64 evt);
-
-/* api used internally for register access. Contains validation and tracing */
-void kbase_device_trace_register_access(struct kbase_context *kctx, enum kbase_reg_access_type type, u16 reg_offset, u32 reg_value);
-int kbase_device_trace_buffer_install(
-		struct kbase_context *kctx, u32 *tb, size_t size);
-void kbase_device_trace_buffer_uninstall(struct kbase_context *kctx);
-
-/* api to be ported per OS, only need to do the raw register access */
-void kbase_os_reg_write(struct kbase_device *kbdev, u16 offset, u32 value);
-u32 kbase_os_reg_read(struct kbase_device *kbdev, u16 offset);
-
-void kbasep_as_do_poke(struct work_struct *work);
-
-/** Returns the name associated with a Mali exception code
- *
- * This function is called from the interrupt handler when a GPU fault occurs.
- * It reports the details of the fault using KBASE_DEBUG_PRINT_WARN.
- *
- * @param[in] kbdev     The kbase device that the GPU fault occurred from.
- * @param[in] exception_code  exception code
- * @return name associated with the exception code
- */
-const char *kbase_exception_name(struct kbase_device *kbdev,
-		u32 exception_code);
-
-/**
- * Check whether a system suspend is in progress, or has already been suspended
- *
- * The caller should ensure that either kbdev->pm.active_count_lock is held, or
- * a dmb was executed recently (to ensure the value is most
- * up-to-date). However, without a lock the value could change afterwards.
- *
- * @return false if a suspend is not in progress
- * @return !=false otherwise
- */
-static inline bool kbase_pm_is_suspending(struct kbase_device *kbdev)
-{
-	return kbdev->pm.suspending;
-}
-
-/**
- * Return the atom's ID, as was originally supplied by userspace in
- * base_jd_atom_v2::atom_number
- */
-static inline int kbase_jd_atom_id(struct kbase_context *kctx, struct kbase_jd_atom *katom)
-{
-	int result;
-
-	KBASE_DEBUG_ASSERT(kctx);
-	KBASE_DEBUG_ASSERT(katom);
-	KBASE_DEBUG_ASSERT(katom->kctx == kctx);
-
-	result = katom - &kctx->jctx.atoms[0];
-	KBASE_DEBUG_ASSERT(result >= 0 && result <= BASE_JD_ATOM_COUNT);
-	return result;
-}
-
-/**
- * kbase_jd_atom_from_id - Return the atom structure for the given atom ID
- * @kctx: Context pointer
- * @id:   ID of atom to retrieve
- *
- * Return: Pointer to struct kbase_jd_atom associated with the supplied ID
- */
-static inline struct kbase_jd_atom *kbase_jd_atom_from_id(
-		struct kbase_context *kctx, int id)
-{
-	return &kctx->jctx.atoms[id];
-}
-
-/**
- * Initialize the disjoint state
- *
- * The disjoint event count and state are both set to zero.
- *
- * Disjoint functions usage:
- *
- * The disjoint event count should be incremented whenever a disjoint event occurs.
- *
- * There are several cases which are regarded as disjoint behavior. Rather than just increment
- * the counter during disjoint events we also increment the counter when jobs may be affected
- * by what the GPU is currently doing. To facilitate this we have the concept of disjoint state.
- *
- * Disjoint state is entered during GPU reset and for the entire time that an atom is replaying
- * (as part of the replay workaround). Increasing the disjoint state also increases the count of
- * disjoint events.
- *
- * The disjoint state is then used to increase the count of disjoint events during job submission
- * and job completion. Any atom submitted or completed while the disjoint state is greater than
- * zero is regarded as a disjoint event.
- *
- * The disjoint event counter is also incremented immediately whenever a job is soft stopped
- * and during context creation.
- *
- * @param kbdev The kbase device
- */
-void kbase_disjoint_init(struct kbase_device *kbdev);
-
-/**
- * Increase the count of disjoint events
- * called when a disjoint event has happened
- *
- * @param kbdev The kbase device
- */
-void kbase_disjoint_event(struct kbase_device *kbdev);
-
-/**
- * Increase the count of disjoint events only if the GPU is in a disjoint state
- *
- * This should be called when something happens which could be disjoint if the GPU
- * is in a disjoint state. The state refcount keeps track of this.
- *
- * @param kbdev The kbase device
- */
-void kbase_disjoint_event_potential(struct kbase_device *kbdev);
-
-/**
- * Returns the count of disjoint events
- *
- * @param kbdev The kbase device
- * @return the count of disjoint events
- */
-u32 kbase_disjoint_event_get(struct kbase_device *kbdev);
-
-/**
- * Increment the refcount state indicating that the GPU is in a disjoint state.
- *
- * Also Increment the disjoint event count (calls @ref kbase_disjoint_event)
- * eventually after the disjoint state has completed @ref kbase_disjoint_state_down
- * should be called
- *
- * @param kbdev The kbase device
- */
-void kbase_disjoint_state_up(struct kbase_device *kbdev);
-
-/**
- * Decrement the refcount state
- *
- * Also Increment the disjoint event count (calls @ref kbase_disjoint_event)
- *
- * Called after @ref kbase_disjoint_state_up once the disjoint state is over
- *
- * @param kbdev The kbase device
- */
-void kbase_disjoint_state_down(struct kbase_device *kbdev);
-
-/**
- * If a job is soft stopped and the number of contexts is >= this value
- * it is reported as a disjoint event
- */
-#define KBASE_DISJOINT_STATE_INTERLEAVED_CONTEXT_COUNT_THRESHOLD 2
-
-#if !defined(UINT64_MAX)
-	#define UINT64_MAX ((uint64_t)0xFFFFFFFFFFFFFFFFULL)
-#endif
-
-#if KBASE_TRACE_ENABLE
-void kbasep_trace_debugfs_init(struct kbase_device *kbdev);
-
-#ifndef CONFIG_MALI_BIFROST_SYSTEM_TRACE
-/** Add trace values about a job-slot
- *
- * @note Any functions called through this macro will still be evaluated in
- * Release builds (CONFIG_MALI_BIFROST_DEBUG not defined). Therefore, when KBASE_TRACE_ENABLE == 0 any
- * functions called to get the parameters supplied to this macro must:
- * - be static or static inline
- * - must just return 0 and have no other statements present in the body.
- */
-#define KBASE_TRACE_ADD_SLOT(kbdev, code, ctx, katom, gpu_addr, jobslot) \
-	kbasep_trace_add(kbdev, KBASE_TRACE_CODE(code), ctx, katom, gpu_addr, \
-			KBASE_TRACE_FLAG_JOBSLOT, 0, jobslot, 0)
-
-/** Add trace values about a job-slot, with info
- *
- * @note Any functions called through this macro will still be evaluated in
- * Release builds (CONFIG_MALI_BIFROST_DEBUG not defined). Therefore, when KBASE_TRACE_ENABLE == 0 any
- * functions called to get the parameters supplied to this macro must:
- * - be static or static inline
- * - must just return 0 and have no other statements present in the body.
- */
-#define KBASE_TRACE_ADD_SLOT_INFO(kbdev, code, ctx, katom, gpu_addr, jobslot, info_val) \
-	kbasep_trace_add(kbdev, KBASE_TRACE_CODE(code), ctx, katom, gpu_addr, \
-			KBASE_TRACE_FLAG_JOBSLOT, 0, jobslot, info_val)
-
-/** Add trace values about a ctx refcount
- *
- * @note Any functions called through this macro will still be evaluated in
- * Release builds (CONFIG_MALI_BIFROST_DEBUG not defined). Therefore, when KBASE_TRACE_ENABLE == 0 any
- * functions called to get the parameters supplied to this macro must:
- * - be static or static inline
- * - must just return 0 and have no other statements present in the body.
- */
-#define KBASE_TRACE_ADD_REFCOUNT(kbdev, code, ctx, katom, gpu_addr, refcount) \
-	kbasep_trace_add(kbdev, KBASE_TRACE_CODE(code), ctx, katom, gpu_addr, \
-			KBASE_TRACE_FLAG_REFCOUNT, refcount, 0, 0)
-/** Add trace values about a ctx refcount, and info
- *
- * @note Any functions called through this macro will still be evaluated in
- * Release builds (CONFIG_MALI_BIFROST_DEBUG not defined). Therefore, when KBASE_TRACE_ENABLE == 0 any
- * functions called to get the parameters supplied to this macro must:
- * - be static or static inline
- * - must just return 0 and have no other statements present in the body.
- */
-#define KBASE_TRACE_ADD_REFCOUNT_INFO(kbdev, code, ctx, katom, gpu_addr, refcount, info_val) \
-	kbasep_trace_add(kbdev, KBASE_TRACE_CODE(code), ctx, katom, gpu_addr, \
-			KBASE_TRACE_FLAG_REFCOUNT, refcount, 0, info_val)
-
-/** Add trace values (no slot or refcount)
- *
- * @note Any functions called through this macro will still be evaluated in
- * Release builds (CONFIG_MALI_BIFROST_DEBUG not defined). Therefore, when KBASE_TRACE_ENABLE == 0 any
- * functions called to get the parameters supplied to this macro must:
- * - be static or static inline
- * - must just return 0 and have no other statements present in the body.
- */
-#define KBASE_TRACE_ADD(kbdev, code, ctx, katom, gpu_addr, info_val)     \
-	kbasep_trace_add(kbdev, KBASE_TRACE_CODE(code), ctx, katom, gpu_addr, \
-			0, 0, 0, info_val)
-
-/** Clear the trace */
-#define KBASE_TRACE_CLEAR(kbdev) \
-	kbasep_trace_clear(kbdev)
-
-/** Dump the slot trace */
-#define KBASE_TRACE_DUMP(kbdev) \
-	kbasep_trace_dump(kbdev)
-
-/** PRIVATE - do not use directly. Use KBASE_TRACE_ADD() instead */
-void kbasep_trace_add(struct kbase_device *kbdev, enum kbase_trace_code code, void *ctx, struct kbase_jd_atom *katom, u64 gpu_addr, u8 flags, int refcount, int jobslot, unsigned long info_val);
-/** PRIVATE - do not use directly. Use KBASE_TRACE_CLEAR() instead */
-void kbasep_trace_clear(struct kbase_device *kbdev);
-#else /* #ifndef CONFIG_MALI_BIFROST_SYSTEM_TRACE */
-/* Dispatch kbase trace events as system trace events */
-#include <mali_linux_kbase_trace.h>
-#define KBASE_TRACE_ADD_SLOT(kbdev, code, ctx, katom, gpu_addr, jobslot)\
-	trace_mali_##code(jobslot, 0)
-
-#define KBASE_TRACE_ADD_SLOT_INFO(kbdev, code, ctx, katom, gpu_addr, jobslot, info_val)\
-	trace_mali_##code(jobslot, info_val)
-
-#define KBASE_TRACE_ADD_REFCOUNT(kbdev, code, ctx, katom, gpu_addr, refcount)\
-	trace_mali_##code(refcount, 0)
-
-#define KBASE_TRACE_ADD_REFCOUNT_INFO(kbdev, code, ctx, katom, gpu_addr, refcount, info_val)\
-	trace_mali_##code(refcount, info_val)
-
-#define KBASE_TRACE_ADD(kbdev, code, ctx, katom, gpu_addr, info_val)\
-	trace_mali_##code(gpu_addr, info_val)
-
-#define KBASE_TRACE_CLEAR(kbdev)\
-	do {\
-		CSTD_UNUSED(kbdev);\
-		CSTD_NOP(0);\
-	} while (0)
-#define KBASE_TRACE_DUMP(kbdev)\
-	do {\
-		CSTD_UNUSED(kbdev);\
-		CSTD_NOP(0);\
-	} while (0)
-
-#endif /* #ifndef CONFIG_MALI_BIFROST_SYSTEM_TRACE */
-#else
-#define KBASE_TRACE_ADD_SLOT(kbdev, code, ctx, katom, gpu_addr, jobslot)\
-	do {\
-		CSTD_UNUSED(kbdev);\
-		CSTD_NOP(code);\
-		CSTD_UNUSED(ctx);\
-		CSTD_UNUSED(katom);\
-		CSTD_UNUSED(gpu_addr);\
-		CSTD_UNUSED(jobslot);\
-	} while (0)
-
-#define KBASE_TRACE_ADD_SLOT_INFO(kbdev, code, ctx, katom, gpu_addr, jobslot, info_val)\
-	do {\
-		CSTD_UNUSED(kbdev);\
-		CSTD_NOP(code);\
-		CSTD_UNUSED(ctx);\
-		CSTD_UNUSED(katom);\
-		CSTD_UNUSED(gpu_addr);\
-		CSTD_UNUSED(jobslot);\
-		CSTD_UNUSED(info_val);\
-		CSTD_NOP(0);\
-	} while (0)
-
-#define KBASE_TRACE_ADD_REFCOUNT(kbdev, code, ctx, katom, gpu_addr, refcount)\
-	do {\
-		CSTD_UNUSED(kbdev);\
-		CSTD_NOP(code);\
-		CSTD_UNUSED(ctx);\
-		CSTD_UNUSED(katom);\
-		CSTD_UNUSED(gpu_addr);\
-		CSTD_UNUSED(refcount);\
-		CSTD_NOP(0);\
-	} while (0)
-
-#define KBASE_TRACE_ADD_REFCOUNT_INFO(kbdev, code, ctx, katom, gpu_addr, refcount, info_val)\
-	do {\
-		CSTD_UNUSED(kbdev);\
-		CSTD_NOP(code);\
-		CSTD_UNUSED(ctx);\
-		CSTD_UNUSED(katom);\
-		CSTD_UNUSED(gpu_addr);\
-		CSTD_UNUSED(info_val);\
-		CSTD_NOP(0);\
-	} while (0)
-
-#define KBASE_TRACE_ADD(kbdev, code, subcode, ctx, katom, val)\
-	do {\
-		CSTD_UNUSED(kbdev);\
-		CSTD_NOP(code);\
-		CSTD_UNUSED(subcode);\
-		CSTD_UNUSED(ctx);\
-		CSTD_UNUSED(katom);\
-		CSTD_UNUSED(val);\
-		CSTD_NOP(0);\
-	} while (0)
-
-#define KBASE_TRACE_CLEAR(kbdev)\
-	do {\
-		CSTD_UNUSED(kbdev);\
-		CSTD_NOP(0);\
-	} while (0)
-#define KBASE_TRACE_DUMP(kbdev)\
-	do {\
-		CSTD_UNUSED(kbdev);\
-		CSTD_NOP(0);\
-	} while (0)
-#endif /* KBASE_TRACE_ENABLE */
-/** PRIVATE - do not use directly. Use KBASE_TRACE_DUMP() instead */
-void kbasep_trace_dump(struct kbase_device *kbdev);
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-/**
- * kbase_set_driver_inactive - Force driver to go inactive
- * @kbdev:    Device pointer
- * @inactive: true if driver should go inactive, false otherwise
- *
- * Forcing the driver inactive will cause all future IOCTLs to wait until the
- * driver is made active again. This is intended solely for the use of tests
- * which require that no jobs are running while the test executes.
- */
-void kbase_set_driver_inactive(struct kbase_device *kbdev, bool inactive);
-#endif /* CONFIG_MALI_BIFROST_DEBUG */
-
-
-#if defined(CONFIG_DEBUG_FS) && !defined(CONFIG_MALI_BIFROST_NO_MALI)
-
-/* kbase_io_history_init - initialize data struct for register access history
- *
- * @kbdev The register history to initialize
- * @n The number of register accesses that the buffer could hold
- *
- * @return 0 if successfully initialized, failure otherwise
- */
-int kbase_io_history_init(struct kbase_io_history *h, u16 n);
-
-/* kbase_io_history_term - uninit all resources for the register access history
- *
- * @h The register history to terminate
- */
-void kbase_io_history_term(struct kbase_io_history *h);
-
-/* kbase_io_history_dump - print the register history to the kernel ring buffer
- *
- * @kbdev Pointer to kbase_device containing the register history to dump
- */
-void kbase_io_history_dump(struct kbase_device *kbdev);
-
-/**
- * kbase_io_history_resize - resize the register access history buffer.
- *
- * @h: Pointer to a valid register history to resize
- * @new_size: Number of accesses the buffer could hold
- *
- * A successful resize will clear all recent register accesses.
- * If resizing fails for any reason (e.g., could not allocate memory, invalid
- * buffer size) then the original buffer will be kept intact.
- *
- * @return 0 if the buffer was resized, failure otherwise
- */
-int kbase_io_history_resize(struct kbase_io_history *h, u16 new_size);
-
-#else /* CONFIG_DEBUG_FS */
-
-#define kbase_io_history_init(...) ((int)0)
-
-#define kbase_io_history_term CSTD_NOP
-
-#define kbase_io_history_dump CSTD_NOP
-
-#define kbase_io_history_resize CSTD_NOP
-
-#endif /* CONFIG_DEBUG_FS */
-
-
-#endif
-
-
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_10969_workaround.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_10969_workaround.c
deleted file mode 100644
index 6b3559d93351..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_10969_workaround.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2013-2015,2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-#include <linux/dma-mapping.h>
-#include <mali_kbase.h>
-#include <mali_kbase_10969_workaround.h>
-
-/* This function is used to solve an HW issue with single iterator GPUs.
- * If a fragment job is soft-stopped on the edge of its bounding box, can happen that the
- * restart index is out of bounds and the rerun causes a tile range fault. If this happens
- * we try to clamp the restart index to a correct value and rerun the job.
- */
-/* Mask of X and Y coordinates for the coordinates words in the descriptors*/
-#define X_COORDINATE_MASK 0x00000FFF
-#define Y_COORDINATE_MASK 0x0FFF0000
-/* Max number of words needed from the fragment shader job descriptor */
-#define JOB_HEADER_SIZE_IN_WORDS 10
-#define JOB_HEADER_SIZE (JOB_HEADER_SIZE_IN_WORDS*sizeof(u32))
-
-/* Word 0: Status Word */
-#define JOB_DESC_STATUS_WORD 0
-/* Word 1: Restart Index */
-#define JOB_DESC_RESTART_INDEX_WORD 1
-/* Word 2: Fault address low word */
-#define JOB_DESC_FAULT_ADDR_LOW_WORD 2
-/* Word 8: Minimum Tile Coordinates */
-#define FRAG_JOB_DESC_MIN_TILE_COORD_WORD 8
-/* Word 9: Maximum Tile Coordinates */
-#define FRAG_JOB_DESC_MAX_TILE_COORD_WORD 9
-
-int kbasep_10969_workaround_clamp_coordinates(struct kbase_jd_atom *katom)
-{
-	struct device *dev = katom->kctx->kbdev->dev;
-	u32   clamped = 0;
-	struct kbase_va_region *region;
-	struct tagged_addr *page_array;
-	u64 page_index;
-	u32 offset = katom->jc & (~PAGE_MASK);
-	u32 *page_1 = NULL;
-	u32 *page_2 = NULL;
-	u32   job_header[JOB_HEADER_SIZE_IN_WORDS];
-	void *dst = job_header;
-	u32 minX, minY, maxX, maxY;
-	u32 restartX, restartY;
-	struct page *p;
-	u32 copy_size;
-
-	dev_warn(dev, "Called TILE_RANGE_FAULT workaround clamping function.\n");
-	if (!(katom->core_req & BASE_JD_REQ_FS))
-		return 0;
-
-	kbase_gpu_vm_lock(katom->kctx);
-	region = kbase_region_tracker_find_region_enclosing_address(katom->kctx,
-			katom->jc);
-	if (!region || (region->flags & KBASE_REG_FREE))
-		goto out_unlock;
-
-	page_array = kbase_get_cpu_phy_pages(region);
-	if (!page_array)
-		goto out_unlock;
-
-	page_index = (katom->jc >> PAGE_SHIFT) - region->start_pfn;
-
-	p = phys_to_page(as_phys_addr_t(page_array[page_index]));
-
-	/* we need the first 10 words of the fragment shader job descriptor.
-	 * We need to check that the offset + 10 words is less that the page
-	 * size otherwise we need to load the next page.
-	 * page_size_overflow will be equal to 0 in case the whole descriptor
-	 * is within the page > 0 otherwise.
-	 */
-	copy_size = MIN(PAGE_SIZE - offset, JOB_HEADER_SIZE);
-
-	page_1 = kmap_atomic(p);
-
-	/* page_1 is a u32 pointer, offset is expressed in bytes */
-	page_1 += offset>>2;
-
-	kbase_sync_single_for_cpu(katom->kctx->kbdev,
-			kbase_dma_addr(p) + offset,
-			copy_size, DMA_BIDIRECTIONAL);
-
-	memcpy(dst, page_1, copy_size);
-
-	/* The data needed overflows page the dimension,
-	 * need to map the subsequent page */
-	if (copy_size < JOB_HEADER_SIZE) {
-		p = phys_to_page(as_phys_addr_t(page_array[page_index + 1]));
-		page_2 = kmap_atomic(p);
-
-		kbase_sync_single_for_cpu(katom->kctx->kbdev,
-				kbase_dma_addr(p),
-				JOB_HEADER_SIZE - copy_size, DMA_BIDIRECTIONAL);
-
-		memcpy(dst + copy_size, page_2, JOB_HEADER_SIZE - copy_size);
-	}
-
-	/* We managed to correctly map one or two pages (in case of overflow) */
-	/* Get Bounding Box data and restart index from fault address low word */
-	minX = job_header[FRAG_JOB_DESC_MIN_TILE_COORD_WORD] & X_COORDINATE_MASK;
-	minY = job_header[FRAG_JOB_DESC_MIN_TILE_COORD_WORD] & Y_COORDINATE_MASK;
-	maxX = job_header[FRAG_JOB_DESC_MAX_TILE_COORD_WORD] & X_COORDINATE_MASK;
-	maxY = job_header[FRAG_JOB_DESC_MAX_TILE_COORD_WORD] & Y_COORDINATE_MASK;
-	restartX = job_header[JOB_DESC_FAULT_ADDR_LOW_WORD] & X_COORDINATE_MASK;
-	restartY = job_header[JOB_DESC_FAULT_ADDR_LOW_WORD] & Y_COORDINATE_MASK;
-
-	dev_warn(dev, "Before Clamping:\n"
-			"Jobstatus: %08x\n"
-			"restartIdx: %08x\n"
-			"Fault_addr_low: %08x\n"
-			"minCoordsX: %08x minCoordsY: %08x\n"
-			"maxCoordsX: %08x maxCoordsY: %08x\n",
-			job_header[JOB_DESC_STATUS_WORD],
-			job_header[JOB_DESC_RESTART_INDEX_WORD],
-			job_header[JOB_DESC_FAULT_ADDR_LOW_WORD],
-			minX, minY,
-			maxX, maxY);
-
-	/* Set the restart index to the one which generated the fault*/
-	job_header[JOB_DESC_RESTART_INDEX_WORD] =
-			job_header[JOB_DESC_FAULT_ADDR_LOW_WORD];
-
-	if (restartX < minX) {
-		job_header[JOB_DESC_RESTART_INDEX_WORD] = (minX) | restartY;
-		dev_warn(dev,
-			"Clamping restart X index to minimum. %08x clamped to %08x\n",
-			restartX, minX);
-		clamped =  1;
-	}
-	if (restartY < minY) {
-		job_header[JOB_DESC_RESTART_INDEX_WORD] = (minY) | restartX;
-		dev_warn(dev,
-			"Clamping restart Y index to minimum. %08x clamped to %08x\n",
-			restartY, minY);
-		clamped =  1;
-	}
-	if (restartX > maxX) {
-		job_header[JOB_DESC_RESTART_INDEX_WORD] = (maxX) | restartY;
-		dev_warn(dev,
-			"Clamping restart X index to maximum. %08x clamped to %08x\n",
-			restartX, maxX);
-		clamped =  1;
-	}
-	if (restartY > maxY) {
-		job_header[JOB_DESC_RESTART_INDEX_WORD] = (maxY) | restartX;
-		dev_warn(dev,
-			"Clamping restart Y index to maximum. %08x clamped to %08x\n",
-			restartY, maxY);
-		clamped =  1;
-	}
-
-	if (clamped) {
-		/* Reset the fault address low word
-		 * and set the job status to STOPPED */
-		job_header[JOB_DESC_FAULT_ADDR_LOW_WORD] = 0x0;
-		job_header[JOB_DESC_STATUS_WORD] = BASE_JD_EVENT_STOPPED;
-		dev_warn(dev, "After Clamping:\n"
-				"Jobstatus: %08x\n"
-				"restartIdx: %08x\n"
-				"Fault_addr_low: %08x\n"
-				"minCoordsX: %08x minCoordsY: %08x\n"
-				"maxCoordsX: %08x maxCoordsY: %08x\n",
-				job_header[JOB_DESC_STATUS_WORD],
-				job_header[JOB_DESC_RESTART_INDEX_WORD],
-				job_header[JOB_DESC_FAULT_ADDR_LOW_WORD],
-				minX, minY,
-				maxX, maxY);
-
-		/* Flush CPU cache to update memory for future GPU reads*/
-		memcpy(page_1, dst, copy_size);
-		p = phys_to_page(as_phys_addr_t(page_array[page_index]));
-
-		kbase_sync_single_for_device(katom->kctx->kbdev,
-				kbase_dma_addr(p) + offset,
-				copy_size, DMA_TO_DEVICE);
-
-		if (copy_size < JOB_HEADER_SIZE) {
-			memcpy(page_2, dst + copy_size,
-					JOB_HEADER_SIZE - copy_size);
-			p = phys_to_page(as_phys_addr_t(page_array[page_index +
-								   1]));
-
-			kbase_sync_single_for_device(katom->kctx->kbdev,
-					kbase_dma_addr(p),
-					JOB_HEADER_SIZE - copy_size,
-					DMA_TO_DEVICE);
-		}
-	}
-	if (copy_size < JOB_HEADER_SIZE)
-		kunmap_atomic(page_2);
-
-	kunmap_atomic(page_1);
-
-out_unlock:
-	kbase_gpu_vm_unlock(katom->kctx);
-	return clamped;
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_10969_workaround.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_10969_workaround.h
deleted file mode 100644
index 099a29861672..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_10969_workaround.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2013-2014 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KBASE_10969_WORKAROUND_
-#define _KBASE_10969_WORKAROUND_
-
-int kbasep_10969_workaround_clamp_coordinates(struct kbase_jd_atom *katom);
-
-#endif /* _KBASE_10969_WORKAROUND_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_as_fault_debugfs.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_as_fault_debugfs.c
deleted file mode 100644
index cc729d416858..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_as_fault_debugfs.c
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <linux/debugfs.h>
-
-#include <mali_kbase.h>
-#include <mali_kbase_as_fault_debugfs.h>
-
-#ifdef CONFIG_DEBUG_FS
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-
-static int kbase_as_fault_read(struct seq_file *sfile, void *data)
-{
-	uintptr_t as_no = (uintptr_t) sfile->private;
-
-	struct list_head *entry;
-	const struct list_head *kbdev_list;
-	struct kbase_device *kbdev = NULL;
-
-	kbdev_list = kbase_dev_list_get();
-
-	list_for_each(entry, kbdev_list) {
-		kbdev = list_entry(entry, struct kbase_device, entry);
-
-		if(kbdev->debugfs_as_read_bitmap & (1ULL << as_no)) {
-
-			/* don't show this one again until another fault occors */
-			kbdev->debugfs_as_read_bitmap &= ~(1ULL << as_no);
-
-			/* output the last page fault addr */
-			seq_printf(sfile, "%llu\n", (u64) kbdev->as[as_no].fault_addr);
-		}
-
-	}
-
-	kbase_dev_list_put(kbdev_list);
-
-	return 0;
-}
-
-static int kbase_as_fault_debugfs_open(struct inode *in, struct file *file)
-{
-	return single_open(file, kbase_as_fault_read , in->i_private);
-}
-
-static const struct file_operations as_fault_fops = {
-	.open = kbase_as_fault_debugfs_open,
-	.read = seq_read,
-	.llseek = seq_lseek,
-	.release = single_release,
-};
-
-#endif /* CONFIG_MALI_BIFROST_DEBUG */
-#endif /* CONFIG_DEBUG_FS */
-
-/*
- *  Initialize debugfs entry for each address space
- */
-void kbase_as_fault_debugfs_init(struct kbase_device *kbdev)
-{
-#ifdef CONFIG_DEBUG_FS
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-	uint i;
-	char as_name[64];
-	struct dentry *debugfs_directory;
-
-	kbdev->debugfs_as_read_bitmap = 0ULL;
-
-	KBASE_DEBUG_ASSERT(kbdev->nr_hw_address_spaces);
-	KBASE_DEBUG_ASSERT(sizeof(kbdev->as[0].fault_addr) == sizeof(u64));
-
-	debugfs_directory = debugfs_create_dir("address_spaces",
-		kbdev->mali_debugfs_directory);
-
-	if(debugfs_directory) {
-		for(i = 0; i < kbdev->nr_hw_address_spaces; i++) {
-			snprintf(as_name, ARRAY_SIZE(as_name), "as%u", i);
-			debugfs_create_file(as_name, S_IRUGO,
-				debugfs_directory, (void*) ((uintptr_t) i), &as_fault_fops);
-		}
-	}
-	else
-		dev_warn(kbdev->dev, "unable to create address_spaces debugfs directory");
-
-#endif /* CONFIG_MALI_BIFROST_DEBUG */
-#endif /* CONFIG_DEBUG_FS */
-	return;
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_as_fault_debugfs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_as_fault_debugfs.h
deleted file mode 100644
index 66387e1c3f6a..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_as_fault_debugfs.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KBASE_AS_FAULT_DEBUG_FS_H
-#define _KBASE_AS_FAULT_DEBUG_FS_H
-
-/**
- * kbase_as_fault_debugfs_init() - Add debugfs files for reporting page faults
- *
- * @kbdev: Pointer to kbase_device
- */
-void kbase_as_fault_debugfs_init(struct kbase_device *kbdev);
-
-/**
- * kbase_as_fault_debugfs_new() - make the last fault available on debugfs
- *
- * @kbdev: Pointer to kbase_device
- * @as_no: The address space the fault occurred on
- */
-static inline void
-kbase_as_fault_debugfs_new(struct kbase_device *kbdev, int as_no)
-{
-#ifdef CONFIG_DEBUG_FS
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-	kbdev->debugfs_as_read_bitmap |= (1ULL << as_no);
-#endif /* CONFIG_DEBUG_FS */
-#endif /* CONFIG_MALI_BIFROST_DEBUG */
-	return;
-}
-
-#endif  /*_KBASE_AS_FAULT_DEBUG_FS_H*/
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_cache_policy.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_cache_policy.c
deleted file mode 100644
index 1d11de67aa80..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_cache_policy.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * Cache Policy API.
- */
-
-#include "mali_kbase_cache_policy.h"
-
-/*
- * The output flags should be a combination of the following values:
- * KBASE_REG_CPU_CACHED: CPU cache should be enabled.
- */
-u32 kbase_cache_enabled(u32 flags, u32 nr_pages)
-{
-	u32 cache_flags = 0;
-
-	CSTD_UNUSED(nr_pages);
-
-	if (flags & BASE_MEM_CACHED_CPU)
-		cache_flags |= KBASE_REG_CPU_CACHED;
-
-	return cache_flags;
-}
-
-
-void kbase_sync_single_for_device(struct kbase_device *kbdev, dma_addr_t handle,
-		size_t size, enum dma_data_direction dir)
-{
-	dma_sync_single_for_device(kbdev->dev, handle, size, dir);
-}
-
-
-void kbase_sync_single_for_cpu(struct kbase_device *kbdev, dma_addr_t handle,
-		size_t size, enum dma_data_direction dir)
-{
-	dma_sync_single_for_cpu(kbdev->dev, handle, size, dir);
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_cache_policy.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_cache_policy.h
deleted file mode 100644
index 0c18bdb357b0..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_cache_policy.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2013, 2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * Cache Policy API.
- */
-
-#ifndef _KBASE_CACHE_POLICY_H_
-#define _KBASE_CACHE_POLICY_H_
-
-#include "mali_kbase.h"
-#include "mali_base_kernel.h"
-
-/**
- * kbase_cache_enabled - Choose the cache policy for a specific region
- * @flags:    flags describing attributes of the region
- * @nr_pages: total number of pages (backed or not) for the region
- *
- * Tells whether the CPU and GPU caches should be enabled or not for a specific
- * region.
- * This function can be modified to customize the cache policy depending on the
- * flags and size of the region.
- *
- * Return: a combination of %KBASE_REG_CPU_CACHED and %KBASE_REG_GPU_CACHED
- *         depending on the cache policy
- */
-u32 kbase_cache_enabled(u32 flags, u32 nr_pages);
-
-#endif				/* _KBASE_CACHE_POLICY_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_config.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_config.c
deleted file mode 100644
index fb615ae02ead..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_config.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#include <mali_kbase.h>
-#include <mali_kbase_defs.h>
-#include <mali_kbase_config_defaults.h>
-
-int kbasep_platform_device_init(struct kbase_device *kbdev)
-{
-	struct kbase_platform_funcs_conf *platform_funcs_p;
-
-	platform_funcs_p = (struct kbase_platform_funcs_conf *)PLATFORM_FUNCS;
-	if (platform_funcs_p && platform_funcs_p->platform_init_func)
-		return platform_funcs_p->platform_init_func(kbdev);
-
-	return 0;
-}
-
-void kbasep_platform_device_term(struct kbase_device *kbdev)
-{
-	struct kbase_platform_funcs_conf *platform_funcs_p;
-
-	platform_funcs_p = (struct kbase_platform_funcs_conf *)PLATFORM_FUNCS;
-	if (platform_funcs_p && platform_funcs_p->platform_term_func)
-		platform_funcs_p->platform_term_func(kbdev);
-}
-
-int kbase_cpuprops_get_default_clock_speed(u32 * const clock_speed)
-{
-	KBASE_DEBUG_ASSERT(NULL != clock_speed);
-
-	*clock_speed = 100;
-	return 0;
-}
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_config.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_config.h
deleted file mode 100644
index 212e3b14d96c..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_config.h
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/**
- * @file mali_kbase_config.h
- * Configuration API and Attributes for KBase
- */
-
-#ifndef _KBASE_CONFIG_H_
-#define _KBASE_CONFIG_H_
-
-#include <asm/page.h>
-
-#include <mali_malisw.h>
-#include <mali_kbase_backend_config.h>
-
-/**
- * @addtogroup base_api
- * @{
- */
-
-/**
- * @addtogroup base_kbase_api
- * @{
- */
-
-/**
- * @addtogroup kbase_config Configuration API and Attributes
- * @{
- */
-
-#include <linux/rbtree.h>
-
-/* Forward declaration of struct kbase_device */
-struct kbase_device;
-
-/**
- * kbase_platform_funcs_conf - Specifies platform init/term function pointers
- *
- * Specifies the functions pointers for platform specific initialization and
- * termination. By default no functions are required. No additional platform
- * specific control is necessary.
- */
-struct kbase_platform_funcs_conf {
-	/**
-	 * platform_init_func - platform specific init function pointer
-	 * @kbdev - kbase_device pointer
-	 *
-	 * Returns 0 on success, negative error code otherwise.
-	 *
-	 * Function pointer for platform specific initialization or NULL if no
-	 * initialization function is required. At the point this the GPU is
-	 * not active and its power and clocks are in unknown (platform specific
-	 * state) as kbase doesn't yet have control of power and clocks.
-	 *
-	 * The platform specific private pointer kbase_device::platform_context
-	 * can be accessed (and possibly initialized) in here.
-	 */
-	int (*platform_init_func)(struct kbase_device *kbdev);
-	/**
-	 * platform_term_func - platform specific termination function pointer
-	 * @kbdev - kbase_device pointer
-	 *
-	 * Function pointer for platform specific termination or NULL if no
-	 * termination function is required. At the point this the GPU will be
-	 * idle but still powered and clocked.
-	 *
-	 * The platform specific private pointer kbase_device::platform_context
-	 * can be accessed (and possibly terminated) in here.
-	 */
-	void (*platform_term_func)(struct kbase_device *kbdev);
-};
-
-/*
- * @brief Specifies the callbacks for power management
- *
- * By default no callbacks will be made and the GPU must not be powered off.
- */
-struct kbase_pm_callback_conf {
-	/** Callback for when the GPU is idle and the power to it can be switched off.
-	 *
-	 * The system integrator can decide whether to either do nothing, just switch off
-	 * the clocks to the GPU, or to completely power down the GPU.
-	 * The platform specific private pointer kbase_device::platform_context can be accessed and modified in here. It is the
-	 * platform \em callbacks responsibility to initialize and terminate this pointer if used (see @ref kbase_platform_funcs_conf).
-	 */
-	void (*power_off_callback)(struct kbase_device *kbdev);
-
-	/** Callback for when the GPU is about to become active and power must be supplied.
-	 *
-	 * This function must not return until the GPU is powered and clocked sufficiently for register access to
-	 * succeed.  The return value specifies whether the GPU was powered down since the call to power_off_callback.
-	 * If the GPU state has been lost then this function must return 1, otherwise it should return 0.
-	 * The platform specific private pointer kbase_device::platform_context can be accessed and modified in here. It is the
-	 * platform \em callbacks responsibility to initialize and terminate this pointer if used (see @ref kbase_platform_funcs_conf).
-	 *
-	 * The return value of the first call to this function is ignored.
-	 *
-	 * @return 1 if the GPU state may have been lost, 0 otherwise.
-	 */
-	int (*power_on_callback)(struct kbase_device *kbdev);
-
-	/** Callback for when the system is requesting a suspend and GPU power
-	 * must be switched off.
-	 *
-	 * Note that if this callback is present, then this may be called
-	 * without a preceding call to power_off_callback. Therefore this
-	 * callback must be able to take any action that might otherwise happen
-	 * in power_off_callback.
-	 *
-	 * The platform specific private pointer kbase_device::platform_context
-	 * can be accessed and modified in here. It is the platform \em
-	 * callbacks responsibility to initialize and terminate this pointer if
-	 * used (see @ref kbase_platform_funcs_conf).
-	 */
-	void (*power_suspend_callback)(struct kbase_device *kbdev);
-
-	/** Callback for when the system is resuming from a suspend and GPU
-	 * power must be switched on.
-	 *
-	 * Note that if this callback is present, then this may be called
-	 * without a following call to power_on_callback. Therefore this
-	 * callback must be able to take any action that might otherwise happen
-	 * in power_on_callback.
-	 *
-	 * The platform specific private pointer kbase_device::platform_context
-	 * can be accessed and modified in here. It is the platform \em
-	 * callbacks responsibility to initialize and terminate this pointer if
-	 * used (see @ref kbase_platform_funcs_conf).
-	 */
-	void (*power_resume_callback)(struct kbase_device *kbdev);
-
-	/** Callback for handling runtime power management initialization.
-	 *
-	 * The runtime power management callbacks @ref power_runtime_off_callback and @ref power_runtime_on_callback
-	 * will become active from calls made to the OS from within this function.
-	 * The runtime calls can be triggered by calls from @ref power_off_callback and @ref power_on_callback.
-	 * Note: for linux the kernel must have CONFIG_PM_RUNTIME enabled to use this feature.
-	 *
-	 * @return 0 on success, else int error code.
-	 */
-	 int (*power_runtime_init_callback)(struct kbase_device *kbdev);
-
-	/** Callback for handling runtime power management termination.
-	 *
-	 * The runtime power management callbacks @ref power_runtime_off_callback and @ref power_runtime_on_callback
-	 * should no longer be called by the OS on completion of this function.
-	 * Note: for linux the kernel must have CONFIG_PM_RUNTIME enabled to use this feature.
-	 */
-	void (*power_runtime_term_callback)(struct kbase_device *kbdev);
-
-	/** Callback for runtime power-off power management callback
-	 *
-	 * For linux this callback will be called by the kernel runtime_suspend callback.
-	 * Note: for linux the kernel must have CONFIG_PM_RUNTIME enabled to use this feature.
-	 *
-	 * @return 0 on success, else OS error code.
-	 */
-	void (*power_runtime_off_callback)(struct kbase_device *kbdev);
-
-	/** Callback for runtime power-on power management callback
-	 *
-	 * For linux this callback will be called by the kernel runtime_resume callback.
-	 * Note: for linux the kernel must have CONFIG_PM_RUNTIME enabled to use this feature.
-	 */
-	int (*power_runtime_on_callback)(struct kbase_device *kbdev);
-
-	/*
-	 * Optional callback for checking if GPU can be suspended when idle
-	 *
-	 * This callback will be called by the runtime power management core
-	 * when the reference count goes to 0 to provide notification that the
-	 * GPU now seems idle.
-	 *
-	 * If this callback finds that the GPU can't be powered off, or handles
-	 * suspend by powering off directly or queueing up a power off, a
-	 * non-zero value must be returned to prevent the runtime PM core from
-	 * also triggering a suspend.
-	 *
-	 * Returning 0 will cause the runtime PM core to conduct a regular
-	 * autosuspend.
-	 *
-	 * This callback is optional and if not provided regular autosuspend
-	 * will be triggered.
-	 *
-	 * Note: The Linux kernel must have CONFIG_PM_RUNTIME enabled to use
-	 * this feature.
-	 *
-	 * Return 0 if GPU can be suspended, positive value if it can not be
-	 * suspeneded by runtime PM, else OS error code
-	 */
-	int (*power_runtime_idle_callback)(struct kbase_device *kbdev);
-};
-
-/**
- * kbase_cpuprops_get_default_clock_speed - default for CPU_SPEED_FUNC
- * @clock_speed - see  kbase_cpu_clk_speed_func for details on the parameters
- *
- * Returns 0 on success, negative error code otherwise.
- *
- * Default implementation of CPU_SPEED_FUNC. This function sets clock_speed
- * to 100, so will be an underestimate for any real system.
- */
-int kbase_cpuprops_get_default_clock_speed(u32 * const clock_speed);
-
-/**
- * kbase_cpu_clk_speed_func - Type of the function pointer for CPU_SPEED_FUNC
- * @param clock_speed - pointer to store the current CPU clock speed in MHz
- *
- * Returns 0 on success, otherwise negative error code.
- *
- * This is mainly used to implement OpenCL's clGetDeviceInfo().
- */
-typedef int (*kbase_cpu_clk_speed_func) (u32 *clock_speed);
-
-/**
- * kbase_gpu_clk_speed_func - Type of the function pointer for GPU_SPEED_FUNC
- * @param clock_speed - pointer to store the current GPU clock speed in MHz
- *
- * Returns 0 on success, otherwise negative error code.
- * When an error is returned the caller assumes maximum GPU speed stored in
- * gpu_freq_khz_max.
- *
- * If the system timer is not available then this function is required
- * for the OpenCL queue profiling to return correct timing information.
- *
- */
-typedef int (*kbase_gpu_clk_speed_func) (u32 *clock_speed);
-
-#ifdef CONFIG_OF
-struct kbase_platform_config {
-};
-#else
-
-/*
- * @brief Specifies start and end of I/O memory region.
- */
-struct kbase_io_memory_region {
-	u64 start;
-	u64 end;
-};
-
-/*
- * @brief Specifies I/O related resources like IRQs and memory region for I/O operations.
- */
-struct kbase_io_resources {
-	u32                      job_irq_number;
-	u32                      mmu_irq_number;
-	u32                      gpu_irq_number;
-	struct kbase_io_memory_region io_memory_region;
-};
-
-struct kbase_platform_config {
-	const struct kbase_io_resources *io_resources;
-};
-
-#endif /* CONFIG_OF */
-
-/**
- * @brief Gets the pointer to platform config.
- *
- * @return Pointer to the platform config
- */
-struct kbase_platform_config *kbase_get_platform_config(void);
-
-/**
- * kbasep_platform_device_init: - Platform specific call to initialize hardware
- * @kbdev: kbase device pointer
- *
- * Function calls a platform defined routine if specified in the configuration
- * attributes.  The routine can initialize any hardware and context state that
- * is required for the GPU block to function.
- *
- * Return: 0 if no errors have been found in the config.
- *         Negative error code otherwise.
- */
-int kbasep_platform_device_init(struct kbase_device *kbdev);
-
-/**
- * kbasep_platform_device_term - Platform specific call to terminate hardware
- * @kbdev: Kbase device pointer
- *
- * Function calls a platform defined routine if specified in the configuration
- * attributes. The routine can destroy any platform specific context state and
- * shut down any hardware functionality that are outside of the Power Management
- * callbacks.
- *
- */
-void kbasep_platform_device_term(struct kbase_device *kbdev);
-
-
-/**
- * kbase_platform_early_init - Early initialisation of the platform code
- *
- * This function will be called when the module is loaded to perform any
- * early initialisation required by the platform code. Such as reading
- * platform specific device tree entries for the GPU.
- *
- * Return: 0 for success, any other fail causes module initialisation to fail
- */
-int kbase_platform_early_init(void);
-
-#ifndef CONFIG_OF
-/**
- * kbase_platform_register - Register a platform device for the GPU
- *
- * This can be used to register a platform device on systems where device tree
- * is not enabled and the platform initialisation code in the kernel doesn't
- * create the GPU device. Where possible device tree should be used instead.
- *
- * Return: 0 for success, any other fail causes module initialisation to fail
- */
-int kbase_platform_register(void);
-
-/**
- * kbase_platform_unregister - Unregister a fake platform device
- *
- * Unregister the platform device created with kbase_platform_register()
- */
-void kbase_platform_unregister(void);
-#endif
-
-	  /** @} *//* end group kbase_config */
-	  /** @} *//* end group base_kbase_api */
-	  /** @} *//* end group base_api */
-
-#endif				/* _KBASE_CONFIG_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_config_defaults.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_config_defaults.h
deleted file mode 100644
index 69079e7d9680..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_config_defaults.h
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2013-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/**
- * @file mali_kbase_config_defaults.h
- *
- * Default values for configuration settings
- *
- */
-
-#ifndef _KBASE_CONFIG_DEFAULTS_H_
-#define _KBASE_CONFIG_DEFAULTS_H_
-
-/* Include mandatory definitions per platform */
-#include <mali_kbase_config_platform.h>
-
-/**
-* Boolean indicating whether the driver is configured to be secure at
-* a potential loss of performance.
-*
-* This currently affects only r0p0-15dev0 HW and earlier.
-*
-* On r0p0-15dev0 HW and earlier, there are tradeoffs between security and
-* performance:
-*
-* - When this is set to true, the driver remains fully secure,
-* but potentially loses performance compared with setting this to
-* false.
-* - When set to false, the driver is open to certain security
-* attacks.
-*
-* From r0p0-00rel0 and onwards, there is no security loss by setting
-* this to false, and no performance loss by setting it to
-* true.
-*/
-#define DEFAULT_SECURE_BUT_LOSS_OF_PERFORMANCE false
-
-enum {
-	/**
-	 * Use unrestricted Address ID width on the AXI bus.
-	 */
-	KBASE_AID_32 = 0x0,
-
-	/**
-	 * Restrict GPU to a half of maximum Address ID count.
-	 * This will reduce performance, but reduce bus load due to GPU.
-	 */
-	KBASE_AID_16 = 0x3,
-
-	/**
-	 * Restrict GPU to a quarter of maximum Address ID count.
-	 * This will reduce performance, but reduce bus load due to GPU.
-	 */
-	KBASE_AID_8  = 0x2,
-
-	/**
-	 * Restrict GPU to an eighth of maximum Address ID count.
-	 * This will reduce performance, but reduce bus load due to GPU.
-	 */
-	KBASE_AID_4  = 0x1
-};
-
-/**
- * Default setting for read Address ID limiting on AXI bus.
- *
- * Attached value: u32 register value
- *    KBASE_AID_32 - use the full 32 IDs (5 ID bits)
- *    KBASE_AID_16 - use 16 IDs (4 ID bits)
- *    KBASE_AID_8  - use 8 IDs (3 ID bits)
- *    KBASE_AID_4  - use 4 IDs (2 ID bits)
- * Default value: KBASE_AID_32 (no limit). Note hardware implementation
- * may limit to a lower value.
- */
-#define DEFAULT_ARID_LIMIT KBASE_AID_32
-
-/**
- * Default setting for write Address ID limiting on AXI.
- *
- * Attached value: u32 register value
- *    KBASE_AID_32 - use the full 32 IDs (5 ID bits)
- *    KBASE_AID_16 - use 16 IDs (4 ID bits)
- *    KBASE_AID_8  - use 8 IDs (3 ID bits)
- *    KBASE_AID_4  - use 4 IDs (2 ID bits)
- * Default value: KBASE_AID_32 (no limit). Note hardware implementation
- * may limit to a lower value.
- */
-#define DEFAULT_AWID_LIMIT KBASE_AID_32
-
-/**
- * Default UMP device mapping. A UMP_DEVICE_<device>_SHIFT value which
- * defines which UMP device this GPU should be mapped to.
- */
-#define DEFAULT_UMP_GPU_DEVICE_SHIFT UMP_DEVICE_Z_SHIFT
-
-/*
- * Default period for DVFS sampling
- */
-#define DEFAULT_PM_DVFS_PERIOD 100 /* 100ms */
-
-/*
- * Power Management poweroff tick granuality. This is in nanoseconds to
- * allow HR timer support.
- *
- * On each scheduling tick, the power manager core may decide to:
- * -# Power off one or more shader cores
- * -# Power off the entire GPU
- */
-#define DEFAULT_PM_GPU_POWEROFF_TICK_NS (400000) /* 400us */
-
-/*
- * Power Manager number of ticks before shader cores are powered off
- */
-#define DEFAULT_PM_POWEROFF_TICK_SHADER (2) /* 400-800us */
-
-/*
- * Power Manager number of ticks before GPU is powered off
- */
-#define DEFAULT_PM_POWEROFF_TICK_GPU (2) /* 400-800us */
-
-/*
- * Default scheduling tick granuality
- */
-#define DEFAULT_JS_SCHEDULING_PERIOD_NS    (100000000u) /* 100ms */
-
-/*
- * Default minimum number of scheduling ticks before jobs are soft-stopped.
- *
- * This defines the time-slice for a job (which may be different from that of a
- * context)
- */
-#define DEFAULT_JS_SOFT_STOP_TICKS       (1) /* 100ms-200ms */
-
-/*
- * Default minimum number of scheduling ticks before CL jobs are soft-stopped.
- */
-#define DEFAULT_JS_SOFT_STOP_TICKS_CL    (1) /* 100ms-200ms */
-
-/*
- * Default minimum number of scheduling ticks before jobs are hard-stopped
- */
-#define DEFAULT_JS_HARD_STOP_TICKS_SS    (50) /* 5s */
-#define DEFAULT_JS_HARD_STOP_TICKS_SS_8408  (300) /* 30s */
-
-/*
- * Default minimum number of scheduling ticks before CL jobs are hard-stopped.
- */
-#define DEFAULT_JS_HARD_STOP_TICKS_CL    (50) /* 5s */
-
-/*
- * Default minimum number of scheduling ticks before jobs are hard-stopped
- * during dumping
- */
-#define DEFAULT_JS_HARD_STOP_TICKS_DUMPING   (15000) /* 1500s */
-
-/*
- * Default timeout for some software jobs, after which the software event wait
- * jobs will be cancelled.
- */
-#define DEFAULT_JS_SOFT_JOB_TIMEOUT (3000) /* 3s */
-
-/*
- * Default minimum number of scheduling ticks before the GPU is reset to clear a
- * "stuck" job
- */
-#define DEFAULT_JS_RESET_TICKS_SS           (55) /* 5.5s */
-#define DEFAULT_JS_RESET_TICKS_SS_8408     (450) /* 45s */
-
-/*
- * Default minimum number of scheduling ticks before the GPU is reset to clear a
- * "stuck" CL job.
- */
-#define DEFAULT_JS_RESET_TICKS_CL        (55) /* 5.5s */
-
-/*
- * Default minimum number of scheduling ticks before the GPU is reset to clear a
- * "stuck" job during dumping.
- */
-#define DEFAULT_JS_RESET_TICKS_DUMPING   (15020) /* 1502s */
-
-/*
- * Default number of milliseconds given for other jobs on the GPU to be
- * soft-stopped when the GPU needs to be reset.
- */
-#define DEFAULT_RESET_TIMEOUT_MS (3000) /* 3s */
-
-/*
- * Default timeslice that a context is scheduled in for, in nanoseconds.
- *
- * When a context has used up this amount of time across its jobs, it is
- * scheduled out to let another run.
- *
- * @note the resolution is nanoseconds (ns) here, because that's the format
- * often used by the OS.
- */
-#define DEFAULT_JS_CTX_TIMESLICE_NS (50000000) /* 50ms */
-
-/*
- * Perform GPU power down using only platform specific code, skipping DDK power
- * management.
- *
- * If this is non-zero then kbase will avoid powering down shader cores, the
- * tiler, and the L2 cache, instead just powering down the entire GPU through
- * platform specific code. This may be required for certain platform
- * integrations.
- *
- * Note that as this prevents kbase from powering down shader cores, this limits
- * the available power policies to coarse_demand and always_on.
- */
-#define PLATFORM_POWER_DOWN_ONLY (0)
-
-#endif /* _KBASE_CONFIG_DEFAULTS_H_ */
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_context.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_context.c
deleted file mode 100644
index 7a09aa26128e..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_context.c
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * Base kernel context APIs
- */
-
-#include <mali_kbase.h>
-#include <mali_midg_regmap.h>
-#include <mali_kbase_mem_linux.h>
-#include <mali_kbase_dma_fence.h>
-#include <mali_kbase_ctx_sched.h>
-
-/**
- * kbase_create_context() - Create a kernel base context.
- * @kbdev: Kbase device
- * @is_compat: Force creation of a 32-bit context
- *
- * Allocate and init a kernel base context.
- *
- * Return: new kbase context
- */
-struct kbase_context *
-kbase_create_context(struct kbase_device *kbdev, bool is_compat)
-{
-	struct kbase_context *kctx;
-	int err;
-	struct page *p;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	/* zero-inited as lot of code assume it's zero'ed out on create */
-	kctx = vzalloc(sizeof(*kctx));
-
-	if (!kctx)
-		goto out;
-
-	/* creating a context is considered a disjoint event */
-	kbase_disjoint_event(kbdev);
-
-	kctx->kbdev = kbdev;
-	kctx->as_nr = KBASEP_AS_NR_INVALID;
-	atomic_set(&kctx->refcount, 0);
-	if (is_compat)
-		kbase_ctx_flag_set(kctx, KCTX_COMPAT);
-#ifdef CONFIG_MALI_BIFROST_TRACE_TIMELINE
-	kctx->timeline.owner_tgid = task_tgid_nr(current);
-#endif
-	atomic_set(&kctx->setup_complete, 0);
-	atomic_set(&kctx->setup_in_progress, 0);
-	spin_lock_init(&kctx->mm_update_lock);
-	kctx->process_mm = NULL;
-	atomic_set(&kctx->nonmapped_pages, 0);
-	kctx->slots_pullable = 0;
-	kctx->tgid = current->tgid;
-	kctx->pid = current->pid;
-
-	err = kbase_mem_pool_init(&kctx->mem_pool,
-				  kbdev->mem_pool_max_size_default,
-				  KBASE_MEM_POOL_4KB_PAGE_TABLE_ORDER,
-				  kctx->kbdev,
-				  &kbdev->mem_pool);
-	if (err)
-		goto free_kctx;
-
-	err = kbase_mem_pool_init(&kctx->lp_mem_pool,
-				  (kbdev->mem_pool_max_size_default >> 9),
-				  KBASE_MEM_POOL_2MB_PAGE_TABLE_ORDER,
-				  kctx->kbdev,
-				  &kbdev->lp_mem_pool);
-	if (err)
-		goto free_mem_pool;
-
-	err = kbase_mem_evictable_init(kctx);
-	if (err)
-		goto free_both_pools;
-
-	atomic_set(&kctx->used_pages, 0);
-
-	err = kbase_jd_init(kctx);
-	if (err)
-		goto deinit_evictable;
-
-	err = kbasep_js_kctx_init(kctx);
-	if (err)
-		goto free_jd;	/* safe to call kbasep_js_kctx_term  in this case */
-
-	err = kbase_event_init(kctx);
-	if (err)
-		goto free_jd;
-
-	atomic_set(&kctx->drain_pending, 0);
-
-	mutex_init(&kctx->reg_lock);
-
-	mutex_init(&kctx->mem_partials_lock);
-	INIT_LIST_HEAD(&kctx->mem_partials);
-
-	INIT_LIST_HEAD(&kctx->waiting_soft_jobs);
-	spin_lock_init(&kctx->waiting_soft_jobs_lock);
-#ifdef CONFIG_KDS
-	INIT_LIST_HEAD(&kctx->waiting_kds_resource);
-#endif
-	err = kbase_dma_fence_init(kctx);
-	if (err)
-		goto free_event;
-
-	err = kbase_mmu_init(kctx);
-	if (err)
-		goto term_dma_fence;
-
-	do {
-		err = kbase_mem_pool_grow(&kctx->mem_pool,
-				MIDGARD_MMU_BOTTOMLEVEL);
-		if (err)
-			goto pgd_no_mem;
-
-		mutex_lock(&kctx->mmu_lock);
-		kctx->pgd = kbase_mmu_alloc_pgd(kctx);
-		mutex_unlock(&kctx->mmu_lock);
-	} while (!kctx->pgd);
-
-	p = kbase_mem_alloc_page(&kctx->mem_pool);
-	if (!p)
-		goto no_sink_page;
-	kctx->aliasing_sink_page = as_tagged(page_to_phys(p));
-
-	init_waitqueue_head(&kctx->event_queue);
-
-	kctx->cookies = KBASE_COOKIE_MASK;
-
-	/* Make sure page 0 is not used... */
-	err = kbase_region_tracker_init(kctx);
-	if (err)
-		goto no_region_tracker;
-
-	err = kbase_sticky_resource_init(kctx);
-	if (err)
-		goto no_sticky;
-
-	err = kbase_jit_init(kctx);
-	if (err)
-		goto no_jit;
-#ifdef CONFIG_GPU_TRACEPOINTS
-	atomic_set(&kctx->jctx.work_id, 0);
-#endif
-#ifdef CONFIG_MALI_BIFROST_TRACE_TIMELINE
-	atomic_set(&kctx->timeline.jd_atoms_in_flight, 0);
-#endif
-
-	kctx->id = atomic_add_return(1, &(kbdev->ctx_num)) - 1;
-
-	mutex_init(&kctx->vinstr_cli_lock);
-
-	timer_setup(&kctx->soft_job_timeout,
-		    kbasep_soft_job_timeout_worker,
-		    0);
-
-	return kctx;
-
-no_jit:
-	kbase_gpu_vm_lock(kctx);
-	kbase_sticky_resource_term(kctx);
-	kbase_gpu_vm_unlock(kctx);
-no_sticky:
-	kbase_region_tracker_term(kctx);
-no_region_tracker:
-	kbase_mem_pool_free(&kctx->mem_pool, p, false);
-no_sink_page:
-	/* VM lock needed for the call to kbase_mmu_free_pgd */
-	kbase_gpu_vm_lock(kctx);
-	kbase_mmu_free_pgd(kctx);
-	kbase_gpu_vm_unlock(kctx);
-pgd_no_mem:
-	kbase_mmu_term(kctx);
-term_dma_fence:
-	kbase_dma_fence_term(kctx);
-free_event:
-	kbase_event_cleanup(kctx);
-free_jd:
-	/* Safe to call this one even when didn't initialize (assuming kctx was sufficiently zeroed) */
-	kbasep_js_kctx_term(kctx);
-	kbase_jd_exit(kctx);
-deinit_evictable:
-	kbase_mem_evictable_deinit(kctx);
-free_both_pools:
-	kbase_mem_pool_term(&kctx->lp_mem_pool);
-free_mem_pool:
-	kbase_mem_pool_term(&kctx->mem_pool);
-free_kctx:
-	vfree(kctx);
-out:
-	return NULL;
-}
-KBASE_EXPORT_SYMBOL(kbase_create_context);
-
-static void kbase_reg_pending_dtor(struct kbase_va_region *reg)
-{
-	dev_dbg(reg->kctx->kbdev->dev, "Freeing pending unmapped region\n");
-	kbase_mem_phy_alloc_put(reg->cpu_alloc);
-	kbase_mem_phy_alloc_put(reg->gpu_alloc);
-	kfree(reg);
-}
-
-/**
- * kbase_destroy_context - Destroy a kernel base context.
- * @kctx: Context to destroy
- *
- * Calls kbase_destroy_os_context() to free OS specific structures.
- * Will release all outstanding regions.
- */
-void kbase_destroy_context(struct kbase_context *kctx)
-{
-	struct kbase_device *kbdev;
-	int pages;
-	unsigned long pending_regions_to_clean;
-	unsigned long flags;
-	struct page *p;
-
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-
-	kbdev = kctx->kbdev;
-	KBASE_DEBUG_ASSERT(NULL != kbdev);
-
-	KBASE_TRACE_ADD(kbdev, CORE_CTX_DESTROY, kctx, NULL, 0u, 0u);
-
-	/* Ensure the core is powered up for the destroy process */
-	/* A suspend won't happen here, because we're in a syscall from a userspace
-	 * thread. */
-	kbase_pm_context_active(kbdev);
-
-	kbase_jd_zap_context(kctx);
-
-#ifdef CONFIG_DEBUG_FS
-	/* Removing the rest of the debugfs entries here as we want to keep the
-	 * atom debugfs interface alive until all atoms have completed. This
-	 * is useful for debugging hung contexts. */
-	debugfs_remove_recursive(kctx->kctx_dentry);
-#endif
-
-	kbase_event_cleanup(kctx);
-
-	/*
-	 * JIT must be terminated before the code below as it must be called
-	 * without the region lock being held.
-	 * The code above ensures no new JIT allocations can be made by
-	 * by the time we get to this point of context tear down.
-	 */
-	kbase_jit_term(kctx);
-
-	kbase_gpu_vm_lock(kctx);
-
-	kbase_sticky_resource_term(kctx);
-
-	/* MMU is disabled as part of scheduling out the context */
-	kbase_mmu_free_pgd(kctx);
-
-	/* drop the aliasing sink page now that it can't be mapped anymore */
-	p = phys_to_page(as_phys_addr_t(kctx->aliasing_sink_page));
-	kbase_mem_pool_free(&kctx->mem_pool, p, false);
-
-	/* free pending region setups */
-	pending_regions_to_clean = (~kctx->cookies) & KBASE_COOKIE_MASK;
-	while (pending_regions_to_clean) {
-		unsigned int cookie = __ffs(pending_regions_to_clean);
-
-		BUG_ON(!kctx->pending_regions[cookie]);
-
-		kbase_reg_pending_dtor(kctx->pending_regions[cookie]);
-
-		kctx->pending_regions[cookie] = NULL;
-		pending_regions_to_clean &= ~(1UL << cookie);
-	}
-
-	kbase_region_tracker_term(kctx);
-	kbase_gpu_vm_unlock(kctx);
-
-	/* Safe to call this one even when didn't initialize (assuming kctx was sufficiently zeroed) */
-	kbasep_js_kctx_term(kctx);
-
-	kbase_jd_exit(kctx);
-
-	kbase_pm_context_idle(kbdev);
-
-	kbase_dma_fence_term(kctx);
-
-	mutex_lock(&kbdev->mmu_hw_mutex);
-	spin_lock_irqsave(&kctx->kbdev->hwaccess_lock, flags);
-	kbase_ctx_sched_remove_ctx(kctx);
-	spin_unlock_irqrestore(&kctx->kbdev->hwaccess_lock, flags);
-	mutex_unlock(&kbdev->mmu_hw_mutex);
-
-	kbase_mmu_term(kctx);
-
-	pages = atomic_read(&kctx->used_pages);
-	if (pages != 0)
-		dev_warn(kbdev->dev, "%s: %d pages in use!\n", __func__, pages);
-
-	kbase_mem_evictable_deinit(kctx);
-	kbase_mem_pool_term(&kctx->mem_pool);
-	kbase_mem_pool_term(&kctx->lp_mem_pool);
-	WARN_ON(atomic_read(&kctx->nonmapped_pages) != 0);
-
-	vfree(kctx);
-}
-KBASE_EXPORT_SYMBOL(kbase_destroy_context);
-
-/**
- * kbase_context_set_create_flags - Set creation flags on a context
- * @kctx: Kbase context
- * @flags: Flags to set
- *
- * Return: 0 on success
- */
-int kbase_context_set_create_flags(struct kbase_context *kctx, u32 flags)
-{
-	int err = 0;
-	struct kbasep_js_kctx_info *js_kctx_info;
-	unsigned long irq_flags;
-
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-
-	js_kctx_info = &kctx->jctx.sched_info;
-
-	/* Validate flags */
-	if (flags != (flags & BASE_CONTEXT_CREATE_KERNEL_FLAGS)) {
-		err = -EINVAL;
-		goto out;
-	}
-
-	mutex_lock(&js_kctx_info->ctx.jsctx_mutex);
-	spin_lock_irqsave(&kctx->kbdev->hwaccess_lock, irq_flags);
-
-	/* Translate the flags */
-	if ((flags & BASE_CONTEXT_SYSTEM_MONITOR_SUBMIT_DISABLED) == 0)
-		kbase_ctx_flag_clear(kctx, KCTX_SUBMIT_DISABLED);
-
-	/* Latch the initial attributes into the Job Scheduler */
-	kbasep_js_ctx_attr_set_initial_attrs(kctx->kbdev, kctx);
-
-	spin_unlock_irqrestore(&kctx->kbdev->hwaccess_lock, irq_flags);
-	mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
- out:
-	return err;
-}
-KBASE_EXPORT_SYMBOL(kbase_context_set_create_flags);
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_context.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_context.h
deleted file mode 100644
index a3f5bb0ce0da..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_context.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KBASE_CONTEXT_H_
-#define _KBASE_CONTEXT_H_
-
-#include <linux/atomic.h>
-
-
-int kbase_context_set_create_flags(struct kbase_context *kctx, u32 flags);
-
-/**
- * kbase_ctx_flag - Check if @flag is set on @kctx
- * @kctx: Pointer to kbase context to check
- * @flag: Flag to check
- *
- * Return: true if @flag is set on @kctx, false if not.
- */
-static inline bool kbase_ctx_flag(struct kbase_context *kctx,
-				      enum kbase_context_flags flag)
-{
-	return atomic_read(&kctx->flags) & flag;
-}
-
-/**
- * kbase_ctx_flag_clear - Clear @flag on @kctx
- * @kctx: Pointer to kbase context
- * @flag: Flag to clear
- *
- * Clear the @flag on @kctx. This is done atomically, so other flags being
- * cleared or set at the same time will be safe.
- *
- * Some flags have locking requirements, check the documentation for the
- * respective flags.
- */
-static inline void kbase_ctx_flag_clear(struct kbase_context *kctx,
-					enum kbase_context_flags flag)
-{
-#if KERNEL_VERSION(4, 3, 0) > LINUX_VERSION_CODE
-	/*
-	 * Earlier kernel versions doesn't have atomic_andnot() or
-	 * atomic_and(). atomic_clear_mask() was only available on some
-	 * architectures and removed on arm in v3.13 on arm and arm64.
-	 *
-	 * Use a compare-exchange loop to clear the flag on pre 4.3 kernels,
-	 * when atomic_andnot() becomes available.
-	 */
-	int old, new;
-
-	do {
-		old = atomic_read(&kctx->flags);
-		new = old & ~flag;
-
-	} while (atomic_cmpxchg(&kctx->flags, old, new) != old);
-#else
-	atomic_andnot(flag, &kctx->flags);
-#endif
-}
-
-/**
- * kbase_ctx_flag_set - Set @flag on @kctx
- * @kctx: Pointer to kbase context
- * @flag: Flag to clear
- *
- * Set the @flag on @kctx. This is done atomically, so other flags being
- * cleared or set at the same time will be safe.
- *
- * Some flags have locking requirements, check the documentation for the
- * respective flags.
- */
-static inline void kbase_ctx_flag_set(struct kbase_context *kctx,
-				      enum kbase_context_flags flag)
-{
-	atomic_or(flag, &kctx->flags);
-}
-#endif /* _KBASE_CONTEXT_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_core_linux.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_core_linux.c
deleted file mode 100644
index 347fee2643bb..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_core_linux.c
+++ /dev/null
@@ -1,4971 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <mali_kbase.h>
-#include <mali_kbase_config_defaults.h>
-#include <mali_kbase_uku.h>
-#include <mali_midg_regmap.h>
-#include <mali_kbase_gator.h>
-#include <mali_kbase_mem_linux.h>
-#ifdef CONFIG_MALI_BIFROST_DEVFREQ
-#include <linux/devfreq.h>
-#include <backend/gpu/mali_kbase_devfreq.h>
-#ifdef CONFIG_DEVFREQ_THERMAL
-#include <ipa/mali_kbase_ipa_debugfs.h>
-#endif /* CONFIG_DEVFREQ_THERMAL */
-#endif /* CONFIG_MALI_BIFROST_DEVFREQ */
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-#include "mali_kbase_model_linux.h"
-#endif /* CONFIG_MALI_BIFROST_NO_MALI */
-#include "mali_kbase_mem_profile_debugfs_buf_size.h"
-#include "mali_kbase_debug_mem_view.h"
-#include "mali_kbase_mem.h"
-#include "mali_kbase_mem_pool_debugfs.h"
-#if !MALI_CUSTOMER_RELEASE
-#include "mali_kbase_regs_dump_debugfs.h"
-#endif /* !MALI_CUSTOMER_RELEASE */
-#include "mali_kbase_regs_history_debugfs.h"
-#include <mali_kbase_hwaccess_backend.h>
-#include <mali_kbase_hwaccess_jm.h>
-#include <mali_kbase_ctx_sched.h>
-#include <backend/gpu/mali_kbase_device_internal.h>
-#include "mali_kbase_ioctl.h"
-
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/poll.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/of.h>
-#include <linux/platform_device.h>
-#include <linux/of_platform.h>
-#include <linux/miscdevice.h>
-#include <linux/list.h>
-#include <linux/semaphore.h>
-#include <linux/fs.h>
-#include <linux/uaccess.h>
-#include <linux/interrupt.h>
-#include <linux/mm.h>
-#include <linux/compat.h>	/* is_compat_task */
-#include <linux/mman.h>
-#include <linux/version.h>
-#include <mali_kbase_hw.h>
-#include <platform/mali_kbase_platform_common.h>
-#if defined(CONFIG_SYNC) || defined(CONFIG_SYNC_FILE)
-#include <mali_kbase_sync.h>
-#endif /* CONFIG_SYNC || CONFIG_SYNC_FILE */
-#include <linux/clk.h>
-#include <linux/delay.h>
-
-#include <mali_kbase_config.h>
-
-
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0))
-#include <linux/pm_opp.h>
-#else
-#include <linux/opp.h>
-#endif
-
-#include <mali_kbase_tlstream.h>
-
-#include <mali_kbase_as_fault_debugfs.h>
-
-/* GPU IRQ Tags */
-#define	JOB_IRQ_TAG	0
-#define MMU_IRQ_TAG	1
-#define GPU_IRQ_TAG	2
-
-#if MALI_UNIT_TEST
-static struct kbase_exported_test_data shared_kernel_test_data;
-EXPORT_SYMBOL(shared_kernel_test_data);
-#endif /* MALI_UNIT_TEST */
-
-static int kbase_dev_nr;
-
-static DEFINE_MUTEX(kbase_dev_list_lock);
-static LIST_HEAD(kbase_dev_list);
-
-#define KERNEL_SIDE_DDK_VERSION_STRING "K:" MALI_RELEASE_NAME "(GPL)"
-static inline void __compile_time_asserts(void)
-{
-	CSTD_COMPILE_TIME_ASSERT(sizeof(KERNEL_SIDE_DDK_VERSION_STRING) <= KBASE_GET_VERSION_BUFFER_SIZE);
-}
-
-static int kbase_api_handshake(struct kbase_context *kctx,
-		struct kbase_ioctl_version_check *version)
-{
-	switch (version->major) {
-	case BASE_UK_VERSION_MAJOR:
-		/* set minor to be the lowest common */
-		version->minor = min_t(int, BASE_UK_VERSION_MINOR,
-				(int)version->minor);
-		break;
-	default:
-		/* We return our actual version regardless if it
-		 * matches the version returned by userspace -
-		 * userspace can bail if it can't handle this
-		 * version */
-		version->major = BASE_UK_VERSION_MAJOR;
-		version->minor = BASE_UK_VERSION_MINOR;
-		break;
-	}
-
-	/* save the proposed version number for later use */
-	kctx->api_version = KBASE_API_VERSION(version->major, version->minor);
-
-	return 0;
-}
-
-/**
- * enum mali_error - Mali error codes shared with userspace
- *
- * This is subset of those common Mali errors that can be returned to userspace.
- * Values of matching user and kernel space enumerators MUST be the same.
- * MALI_ERROR_NONE is guaranteed to be 0.
- *
- * @MALI_ERROR_NONE: Success
- * @MALI_ERROR_OUT_OF_GPU_MEMORY: Not used in the kernel driver
- * @MALI_ERROR_OUT_OF_MEMORY: Memory allocation failure
- * @MALI_ERROR_FUNCTION_FAILED: Generic error code
- */
-enum mali_error {
-	MALI_ERROR_NONE = 0,
-	MALI_ERROR_OUT_OF_GPU_MEMORY,
-	MALI_ERROR_OUT_OF_MEMORY,
-	MALI_ERROR_FUNCTION_FAILED,
-};
-
-enum {
-	inited_mem = (1u << 0),
-	inited_js = (1u << 1),
-	inited_pm_runtime_init = (1u << 2),
-#ifdef CONFIG_MALI_BIFROST_DEVFREQ
-	inited_devfreq = (1u << 3),
-#endif /* CONFIG_MALI_BIFROST_DEVFREQ */
-	inited_tlstream = (1u << 4),
-	inited_backend_early = (1u << 5),
-	inited_backend_late = (1u << 6),
-	inited_device = (1u << 7),
-	inited_vinstr = (1u << 8),
-
-	inited_job_fault = (1u << 10),
-	inited_sysfs_group = (1u << 11),
-	inited_misc_register = (1u << 12),
-	inited_get_device = (1u << 13),
-	inited_dev_list = (1u << 14),
-	inited_debugfs = (1u << 15),
-	inited_gpu_device = (1u << 16),
-	inited_registers_map = (1u << 17),
-	inited_io_history = (1u << 18),
-	inited_power_control = (1u << 19),
-	inited_buslogger = (1u << 20),
-	inited_protected = (1u << 21),
-	inited_ctx_sched = (1u << 22)
-};
-
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-#define INACTIVE_WAIT_MS (5000)
-
-void kbase_set_driver_inactive(struct kbase_device *kbdev, bool inactive)
-{
-	kbdev->driver_inactive = inactive;
-	wake_up(&kbdev->driver_inactive_wait);
-
-	/* Wait for any running IOCTLs to complete */
-	if (inactive)
-		msleep(INACTIVE_WAIT_MS);
-}
-KBASE_EXPORT_TEST_API(kbase_set_driver_inactive);
-#endif /* CONFIG_MALI_BIFROST_DEBUG */
-
-/**
- * kbase_legacy_dispatch - UKK dispatch function
- *
- * This is the dispatch function for the legacy UKK ioctl interface. No new
- * ioctls should be added to this function, see kbase_ioctl instead.
- *
- * @kctx: The kernel context structure
- * @args: Pointer to the data structure passed from/to user space
- * @args_size: Size of the data structure
- */
-static int kbase_legacy_dispatch(struct kbase_context *kctx,
-		void * const args, u32 args_size)
-{
-	struct kbase_device *kbdev;
-	union uk_header *ukh = args;
-	u32 id;
-	int ret = 0;
-
-	KBASE_DEBUG_ASSERT(ukh != NULL);
-
-	kbdev = kctx->kbdev;
-	id = ukh->id;
-	ukh->ret = MALI_ERROR_NONE; /* Be optimistic */
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-	wait_event(kbdev->driver_inactive_wait,
-			kbdev->driver_inactive == false);
-#endif /* CONFIG_MALI_BIFROST_DEBUG */
-
-	if (UKP_FUNC_ID_CHECK_VERSION == id) {
-		struct uku_version_check_args *version_check;
-		struct kbase_ioctl_version_check version;
-
-		if (args_size != sizeof(struct uku_version_check_args)) {
-			ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-			return 0;
-		}
-		version_check = (struct uku_version_check_args *)args;
-		version.minor = version_check->minor;
-		version.major = version_check->major;
-
-		kbase_api_handshake(kctx, &version);
-
-		version_check->minor = version.minor;
-		version_check->major = version.major;
-		ukh->ret = MALI_ERROR_NONE;
-		return 0;
-	}
-
-	/* block calls until version handshake */
-	if (kctx->api_version == 0)
-		return -EINVAL;
-
-	if (!atomic_read(&kctx->setup_complete)) {
-		struct kbase_uk_set_flags *kbase_set_flags;
-
-		/* setup pending, try to signal that we'll do the setup,
-		 * if setup was already in progress, err this call
-		 */
-		if (atomic_cmpxchg(&kctx->setup_in_progress, 0, 1) != 0)
-			return -EINVAL;
-
-		/* if unexpected call, will stay stuck in setup mode
-		 * (is it the only call we accept?)
-		 */
-		if (id != KBASE_FUNC_SET_FLAGS)
-			return -EINVAL;
-
-		kbase_set_flags = (struct kbase_uk_set_flags *)args;
-
-		/* if not matching the expected call, stay in setup mode */
-		if (sizeof(*kbase_set_flags) != args_size)
-			goto bad_size;
-
-		/* if bad flags, will stay stuck in setup mode */
-		if (kbase_context_set_create_flags(kctx,
-				kbase_set_flags->create_flags) != 0)
-			ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-
-		atomic_set(&kctx->setup_complete, 1);
-		return 0;
-	}
-
-	/* setup complete, perform normal operation */
-	switch (id) {
-	case KBASE_FUNC_MEM_JIT_INIT:
-		{
-			struct kbase_uk_mem_jit_init *jit_init = args;
-
-			if (sizeof(*jit_init) != args_size)
-				goto bad_size;
-
-			if (kbase_region_tracker_init_jit(kctx,
-					jit_init->va_pages))
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-			break;
-		}
-	case KBASE_FUNC_MEM_ALLOC:
-		{
-			struct kbase_uk_mem_alloc *mem = args;
-			struct kbase_va_region *reg;
-
-			if (sizeof(*mem) != args_size)
-				goto bad_size;
-
-#if defined(CONFIG_64BIT)
-			if (!kbase_ctx_flag(kctx, KCTX_COMPAT)) {
-				/* force SAME_VA if a 64-bit client */
-				mem->flags |= BASE_MEM_SAME_VA;
-			}
-#endif
-
-			reg = kbase_mem_alloc(kctx, mem->va_pages,
-					mem->commit_pages, mem->extent,
-					&mem->flags, &mem->gpu_va);
-			mem->va_alignment = 0;
-
-			if (!reg)
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-			break;
-		}
-	case KBASE_FUNC_MEM_IMPORT: {
-			struct kbase_uk_mem_import *mem_import = args;
-			void __user *phandle;
-
-			if (sizeof(*mem_import) != args_size)
-				goto bad_size;
-#ifdef CONFIG_COMPAT
-			if (kbase_ctx_flag(kctx, KCTX_COMPAT))
-				phandle = compat_ptr(mem_import->phandle);
-			else
-#endif
-				phandle = u64_to_user_ptr(mem_import->phandle);
-
-			if (mem_import->type == BASE_MEM_IMPORT_TYPE_INVALID) {
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-				break;
-			}
-
-			if (kbase_mem_import(kctx,
-					(enum base_mem_import_type)
-					mem_import->type,
-					phandle,
-					0,
-					&mem_import->gpu_va,
-					&mem_import->va_pages,
-					&mem_import->flags)) {
-				mem_import->type = BASE_MEM_IMPORT_TYPE_INVALID;
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-			}
-			break;
-	}
-	case KBASE_FUNC_MEM_ALIAS: {
-			struct kbase_uk_mem_alias *alias = args;
-			struct base_mem_aliasing_info __user *user_ai;
-			struct base_mem_aliasing_info *ai;
-
-			if (sizeof(*alias) != args_size)
-				goto bad_size;
-
-			if (alias->nents > 2048) {
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-				break;
-			}
-			if (!alias->nents) {
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-				break;
-			}
-
-#ifdef CONFIG_COMPAT
-			if (kbase_ctx_flag(kctx, KCTX_COMPAT))
-				user_ai = compat_ptr(alias->ai);
-			else
-#endif
-				user_ai = u64_to_user_ptr(alias->ai);
-
-			ai = vmalloc(sizeof(*ai) * alias->nents);
-
-			if (!ai) {
-				ukh->ret = MALI_ERROR_OUT_OF_MEMORY;
-				break;
-			}
-
-			if (copy_from_user(ai, user_ai,
-					   sizeof(*ai) * alias->nents)) {
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-				goto copy_failed;
-			}
-
-			alias->gpu_va = kbase_mem_alias(kctx, &alias->flags,
-							alias->stride,
-							alias->nents, ai,
-							&alias->va_pages);
-			if (!alias->gpu_va) {
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-				goto no_alias;
-			}
-no_alias:
-copy_failed:
-			vfree(ai);
-			break;
-		}
-	case KBASE_FUNC_MEM_COMMIT:
-		{
-			struct kbase_uk_mem_commit *commit = args;
-			int ret;
-
-			if (sizeof(*commit) != args_size)
-				goto bad_size;
-
-			ret = kbase_mem_commit(kctx, commit->gpu_addr,
-					commit->pages);
-
-			ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-			commit->result_subcode =
-				BASE_BACKING_THRESHOLD_ERROR_INVALID_ARGUMENTS;
-
-			if (ret == 0) {
-				ukh->ret = MALI_ERROR_NONE;
-				commit->result_subcode =
-					BASE_BACKING_THRESHOLD_OK;
-			} else if (ret == -ENOMEM) {
-				commit->result_subcode =
-					BASE_BACKING_THRESHOLD_ERROR_OOM;
-			}
-
-			break;
-		}
-
-	case KBASE_FUNC_MEM_QUERY:
-		{
-			struct kbase_uk_mem_query *query = args;
-
-			if (sizeof(*query) != args_size)
-				goto bad_size;
-
-			if (kbase_mem_query(kctx, query->gpu_addr,
-					query->query, &query->value) != 0)
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-			else
-				ukh->ret = MALI_ERROR_NONE;
-			break;
-		}
-		break;
-
-	case KBASE_FUNC_MEM_FLAGS_CHANGE:
-		{
-			struct kbase_uk_mem_flags_change *fc = args;
-
-			if (sizeof(*fc) != args_size)
-				goto bad_size;
-
-			if (kbase_mem_flags_change(kctx, fc->gpu_va,
-					fc->flags, fc->mask) != 0)
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-
-			break;
-		}
-	case KBASE_FUNC_MEM_FREE:
-		{
-			struct kbase_uk_mem_free *mem = args;
-
-			if (sizeof(*mem) != args_size)
-				goto bad_size;
-
-			if (kbase_mem_free(kctx, mem->gpu_addr) != 0)
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-			break;
-		}
-
-	case KBASE_FUNC_JOB_SUBMIT:
-		{
-			struct kbase_uk_job_submit *job = args;
-			char __user *user_buf;
-
-			if (sizeof(*job) != args_size)
-				goto bad_size;
-
-#ifdef CONFIG_COMPAT
-			if (kbase_ctx_flag(kctx, KCTX_COMPAT))
-				user_buf = compat_ptr(job->addr);
-			else
-#endif
-				user_buf = u64_to_user_ptr(job->addr);
-
-			if (kbase_jd_submit(kctx, user_buf,
-						job->nr_atoms,
-						job->stride,
-						false) != 0)
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-			break;
-		}
-
-	case KBASE_FUNC_SYNC:
-		{
-			struct kbase_uk_sync_now *sn = args;
-
-			if (sizeof(*sn) != args_size)
-				goto bad_size;
-
-			if (kbase_sync_now(kctx, &sn->sset.basep_sset) != 0)
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-			break;
-		}
-
-	case KBASE_FUNC_DISJOINT_QUERY:
-		{
-			struct kbase_uk_disjoint_query *dquery = args;
-
-			if (sizeof(*dquery) != args_size)
-				goto bad_size;
-
-			/* Get the disjointness counter value. */
-			dquery->counter = kbase_disjoint_event_get(kctx->kbdev);
-			break;
-		}
-
-	case KBASE_FUNC_POST_TERM:
-		{
-			kbase_event_close(kctx);
-			break;
-		}
-
-	case KBASE_FUNC_HWCNT_SETUP:
-		{
-			struct kbase_uk_hwcnt_setup *setup = args;
-
-			if (sizeof(*setup) != args_size)
-				goto bad_size;
-
-			mutex_lock(&kctx->vinstr_cli_lock);
-			if (kbase_vinstr_legacy_hwc_setup(kbdev->vinstr_ctx,
-					&kctx->vinstr_cli, setup) != 0)
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-			mutex_unlock(&kctx->vinstr_cli_lock);
-			break;
-		}
-
-	case KBASE_FUNC_HWCNT_DUMP:
-		{
-			/* args ignored */
-			mutex_lock(&kctx->vinstr_cli_lock);
-			if (kbase_vinstr_hwc_dump(kctx->vinstr_cli,
-					BASE_HWCNT_READER_EVENT_MANUAL) != 0)
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-			mutex_unlock(&kctx->vinstr_cli_lock);
-			break;
-		}
-
-	case KBASE_FUNC_HWCNT_CLEAR:
-		{
-			/* args ignored */
-			mutex_lock(&kctx->vinstr_cli_lock);
-			if (kbase_vinstr_hwc_clear(kctx->vinstr_cli) != 0)
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-			mutex_unlock(&kctx->vinstr_cli_lock);
-			break;
-		}
-
-	case KBASE_FUNC_HWCNT_READER_SETUP:
-		{
-			struct kbase_uk_hwcnt_reader_setup *setup = args;
-
-			if (sizeof(*setup) != args_size)
-				goto bad_size;
-
-			mutex_lock(&kctx->vinstr_cli_lock);
-			if (kbase_vinstr_hwcnt_reader_setup(kbdev->vinstr_ctx,
-					setup) != 0)
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-			mutex_unlock(&kctx->vinstr_cli_lock);
-			break;
-		}
-
-	case KBASE_FUNC_GPU_PROPS_REG_DUMP:
-		{
-			struct kbase_uk_gpuprops *setup = args;
-
-			if (sizeof(*setup) != args_size)
-				goto bad_size;
-
-			if (kbase_gpuprops_uk_get_props(kctx, setup) != 0)
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-			break;
-		}
-	case KBASE_FUNC_FIND_CPU_OFFSET:
-		{
-			struct kbase_uk_find_cpu_offset *find = args;
-
-			if (sizeof(*find) != args_size)
-				goto bad_size;
-
-			if (find->gpu_addr & ~PAGE_MASK) {
-				dev_warn(kbdev->dev, "kbase_legacy_dispatch case KBASE_FUNC_FIND_CPU_OFFSET: find->gpu_addr: passed parameter is invalid");
-				goto out_bad;
-			}
-
-			if (find->size > SIZE_MAX || find->cpu_addr > ULONG_MAX) {
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-			} else {
-				int err;
-
-				err = kbasep_find_enclosing_cpu_mapping_offset(
-						kctx,
-						find->cpu_addr,
-						find->size,
-						&find->offset);
-
-				if (err)
-					ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-			}
-			break;
-		}
-	case KBASE_FUNC_GET_VERSION:
-		{
-			struct kbase_uk_get_ddk_version *get_version = (struct kbase_uk_get_ddk_version *)args;
-
-			if (sizeof(*get_version) != args_size)
-				goto bad_size;
-
-			/* version buffer size check is made in compile time assert */
-			memcpy(get_version->version_buffer, KERNEL_SIDE_DDK_VERSION_STRING, sizeof(KERNEL_SIDE_DDK_VERSION_STRING));
-			get_version->version_string_size = sizeof(KERNEL_SIDE_DDK_VERSION_STRING);
-			break;
-		}
-
-	case KBASE_FUNC_STREAM_CREATE:
-		{
-#if defined(CONFIG_SYNC) || defined(CONFIG_SYNC_FILE)
-			struct kbase_uk_stream_create *screate = (struct kbase_uk_stream_create *)args;
-
-			if (sizeof(*screate) != args_size)
-				goto bad_size;
-
-			if (strnlen(screate->name, sizeof(screate->name)) >= sizeof(screate->name)) {
-				/* not NULL terminated */
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-				break;
-			}
-
-			if (kbase_sync_fence_stream_create(screate->name,
-							   &screate->fd) != 0)
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-			else
-				ukh->ret = MALI_ERROR_NONE;
-#else /* CONFIG_SYNC || CONFIG_SYNC_FILE */
-			ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-#endif /* CONFIG_SYNC || CONFIG_SYNC_FILE */
-			break;
-		}
-	case KBASE_FUNC_FENCE_VALIDATE:
-		{
-#if defined(CONFIG_SYNC) || defined(CONFIG_SYNC_FILE)
-			struct kbase_uk_fence_validate *fence_validate = (struct kbase_uk_fence_validate *)args;
-
-			if (sizeof(*fence_validate) != args_size)
-				goto bad_size;
-
-			if (kbase_sync_fence_validate(fence_validate->fd) != 0)
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-			else
-				ukh->ret = MALI_ERROR_NONE;
-#endif /* CONFIG_SYNC || CONFIG_SYNC_FILE */
-			break;
-		}
-
-	case KBASE_FUNC_SET_TEST_DATA:
-		{
-#if MALI_UNIT_TEST
-			struct kbase_uk_set_test_data *set_data = args;
-
-			shared_kernel_test_data = set_data->test_data;
-			shared_kernel_test_data.kctx = (uintptr_t)kctx;
-			shared_kernel_test_data.mm = (uintptr_t)current->mm;
-			ukh->ret = MALI_ERROR_NONE;
-#endif /* MALI_UNIT_TEST */
-			break;
-		}
-
-	case KBASE_FUNC_INJECT_ERROR:
-		{
-#ifdef CONFIG_MALI_BIFROST_ERROR_INJECT
-			unsigned long flags;
-			struct kbase_error_params params = ((struct kbase_uk_error_params *)args)->params;
-
-			/*mutex lock */
-			spin_lock_irqsave(&kbdev->reg_op_lock, flags);
-			if (job_atom_inject_error(&params) != 0)
-				ukh->ret = MALI_ERROR_OUT_OF_MEMORY;
-			else
-				ukh->ret = MALI_ERROR_NONE;
-			spin_unlock_irqrestore(&kbdev->reg_op_lock, flags);
-			/*mutex unlock */
-#endif /* CONFIG_MALI_BIFROST_ERROR_INJECT */
-			break;
-		}
-
-	case KBASE_FUNC_MODEL_CONTROL:
-		{
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-			unsigned long flags;
-			struct kbase_model_control_params params =
-					((struct kbase_uk_model_control_params *)args)->params;
-
-			/*mutex lock */
-			spin_lock_irqsave(&kbdev->reg_op_lock, flags);
-			if (gpu_model_control(kbdev->model, &params) != 0)
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-			else
-				ukh->ret = MALI_ERROR_NONE;
-			spin_unlock_irqrestore(&kbdev->reg_op_lock, flags);
-			/*mutex unlock */
-#endif /* CONFIG_MALI_BIFROST_NO_MALI */
-			break;
-		}
-
-	case KBASE_FUNC_GET_PROFILING_CONTROLS:
-		{
-			struct kbase_uk_profiling_controls *controls =
-					(struct kbase_uk_profiling_controls *)args;
-			u32 i;
-
-			if (sizeof(*controls) != args_size)
-				goto bad_size;
-
-			for (i = FBDUMP_CONTROL_MIN; i < FBDUMP_CONTROL_MAX; i++)
-				controls->profiling_controls[i] =
-					kbdev->kbase_profiling_controls[i];
-
-			break;
-		}
-
-	/* used only for testing purposes; these controls are to be set by gator through gator API */
-	case KBASE_FUNC_SET_PROFILING_CONTROLS:
-		{
-			struct kbase_uk_profiling_controls *controls =
-					(struct kbase_uk_profiling_controls *)args;
-			u32 i;
-
-			if (sizeof(*controls) != args_size)
-				goto bad_size;
-
-			for (i = FBDUMP_CONTROL_MIN; i < FBDUMP_CONTROL_MAX; i++)
-				_mali_profiling_control(i, controls->profiling_controls[i]);
-
-			break;
-		}
-
-	case KBASE_FUNC_DEBUGFS_MEM_PROFILE_ADD:
-		{
-			struct kbase_uk_debugfs_mem_profile_add *add_data =
-					(struct kbase_uk_debugfs_mem_profile_add *)args;
-			char *buf;
-			char __user *user_buf;
-
-			if (sizeof(*add_data) != args_size)
-				goto bad_size;
-
-			if (add_data->len > KBASE_MEM_PROFILE_MAX_BUF_SIZE) {
-				dev_err(kbdev->dev, "buffer too big\n");
-				goto out_bad;
-			}
-
-#ifdef CONFIG_COMPAT
-			if (kbase_ctx_flag(kctx, KCTX_COMPAT))
-				user_buf = compat_ptr(add_data->buf);
-			else
-#endif
-				user_buf = u64_to_user_ptr(add_data->buf);
-
-			buf = kmalloc(add_data->len, GFP_KERNEL);
-			if (ZERO_OR_NULL_PTR(buf))
-				goto out_bad;
-
-			if (0 != copy_from_user(buf, user_buf, add_data->len)) {
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-				kfree(buf);
-				goto out_bad;
-			}
-
-			if (kbasep_mem_profile_debugfs_insert(kctx, buf,
-							add_data->len)) {
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-				goto out_bad;
-			}
-
-			break;
-		}
-
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-	case KBASE_FUNC_SET_PRFCNT_VALUES:
-		{
-
-			struct kbase_uk_prfcnt_values *params =
-			  ((struct kbase_uk_prfcnt_values *)args);
-			gpu_model_set_dummy_prfcnt_sample(params->data,
-					params->size);
-
-			break;
-		}
-#endif /* CONFIG_MALI_BIFROST_NO_MALI */
-#ifdef BASE_LEGACY_UK10_4_SUPPORT
-	case KBASE_FUNC_TLSTREAM_ACQUIRE_V10_4:
-		{
-			struct kbase_uk_tlstream_acquire_v10_4 *tlstream_acquire
-					= args;
-			int ret;
-
-			if (sizeof(*tlstream_acquire) != args_size)
-				goto bad_size;
-
-			ret = kbase_tlstream_acquire(
-						kctx, 0);
-			if (ret < 0)
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-			else
-				tlstream_acquire->fd = ret;
-			break;
-		}
-#endif /* BASE_LEGACY_UK10_4_SUPPORT */
-	case KBASE_FUNC_TLSTREAM_ACQUIRE:
-		{
-			struct kbase_uk_tlstream_acquire *tlstream_acquire =
-				args;
-			int ret;
-
-			if (sizeof(*tlstream_acquire) != args_size)
-				goto bad_size;
-
-			if (tlstream_acquire->flags & ~BASE_TLSTREAM_FLAGS_MASK)
-				goto out_bad;
-
-			ret = kbase_tlstream_acquire(
-					kctx, tlstream_acquire->flags);
-			if (ret < 0)
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-			else
-				tlstream_acquire->fd = ret;
-			break;
-		}
-	case KBASE_FUNC_TLSTREAM_FLUSH:
-		{
-			struct kbase_uk_tlstream_flush *tlstream_flush =
-				args;
-
-			if (sizeof(*tlstream_flush) != args_size)
-				goto bad_size;
-
-			kbase_tlstream_flush_streams();
-			break;
-		}
-#if MALI_UNIT_TEST
-	case KBASE_FUNC_TLSTREAM_TEST:
-		{
-			struct kbase_uk_tlstream_test *tlstream_test = args;
-
-			if (sizeof(*tlstream_test) != args_size)
-				goto bad_size;
-
-			kbase_tlstream_test(
-					tlstream_test->tpw_count,
-					tlstream_test->msg_delay,
-					tlstream_test->msg_count,
-					tlstream_test->aux_msg);
-			break;
-		}
-	case KBASE_FUNC_TLSTREAM_STATS:
-		{
-			struct kbase_uk_tlstream_stats *tlstream_stats = args;
-
-			if (sizeof(*tlstream_stats) != args_size)
-				goto bad_size;
-
-			kbase_tlstream_stats(
-					&tlstream_stats->bytes_collected,
-					&tlstream_stats->bytes_generated);
-			break;
-		}
-#endif /* MALI_UNIT_TEST */
-
-	case KBASE_FUNC_GET_CONTEXT_ID:
-		{
-			struct kbase_uk_context_id *info = args;
-
-			info->id = kctx->id;
-			break;
-		}
-
-	case KBASE_FUNC_SOFT_EVENT_UPDATE:
-		{
-			struct kbase_uk_soft_event_update *update = args;
-
-			if (sizeof(*update) != args_size)
-				goto bad_size;
-
-			if (((update->new_status != BASE_JD_SOFT_EVENT_SET) &&
-			    (update->new_status != BASE_JD_SOFT_EVENT_RESET)) ||
-			    (update->flags != 0))
-				goto out_bad;
-
-			if (kbase_soft_event_update(kctx, update->evt,
-						update->new_status))
-				ukh->ret = MALI_ERROR_FUNCTION_FAILED;
-
-			break;
-		}
-
-	default:
-		dev_err(kbdev->dev, "unknown ioctl %u\n", id);
-		goto out_bad;
-	}
-
-	return ret;
-
- bad_size:
-	dev_err(kbdev->dev, "Wrong syscall size (%d) for %08x\n", args_size, id);
- out_bad:
-	return -EINVAL;
-}
-
-static struct kbase_device *to_kbase_device(struct device *dev)
-{
-	return dev_get_drvdata(dev);
-}
-
-static int assign_irqs(struct platform_device *pdev)
-{
-	struct kbase_device *kbdev = to_kbase_device(&pdev->dev);
-	int i;
-
-	if (!kbdev)
-		return -ENODEV;
-
-	/* 3 IRQ resources */
-	for (i = 0; i < 3; i++) {
-		struct resource *irq_res;
-		int irqtag;
-
-		irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, i);
-		if (!irq_res) {
-			dev_err(kbdev->dev, "No IRQ resource at index %d\n", i);
-			return -ENOENT;
-		}
-
-#ifdef CONFIG_OF
-		if (!strncmp(irq_res->name, "JOB", 4)) {
-			irqtag = JOB_IRQ_TAG;
-		} else if (!strncmp(irq_res->name, "MMU", 4)) {
-			irqtag = MMU_IRQ_TAG;
-		} else if (!strncmp(irq_res->name, "GPU", 4)) {
-			irqtag = GPU_IRQ_TAG;
-		} else {
-			dev_err(&pdev->dev, "Invalid irq res name: '%s'\n",
-				irq_res->name);
-			return -EINVAL;
-		}
-#else
-		irqtag = i;
-#endif /* CONFIG_OF */
-		kbdev->irqs[irqtag].irq = irq_res->start;
-		kbdev->irqs[irqtag].flags = irq_res->flags & IRQF_TRIGGER_MASK;
-	}
-
-	return 0;
-}
-
-/*
- * API to acquire device list mutex and
- * return pointer to the device list head
- */
-const struct list_head *kbase_dev_list_get(void)
-{
-	mutex_lock(&kbase_dev_list_lock);
-	return &kbase_dev_list;
-}
-KBASE_EXPORT_TEST_API(kbase_dev_list_get);
-
-/* API to release the device list mutex */
-void kbase_dev_list_put(const struct list_head *dev_list)
-{
-	mutex_unlock(&kbase_dev_list_lock);
-}
-KBASE_EXPORT_TEST_API(kbase_dev_list_put);
-
-/* Find a particular kbase device (as specified by minor number), or find the "first" device if -1 is specified */
-struct kbase_device *kbase_find_device(int minor)
-{
-	struct kbase_device *kbdev = NULL;
-	struct list_head *entry;
-	const struct list_head *dev_list = kbase_dev_list_get();
-
-	list_for_each(entry, dev_list) {
-		struct kbase_device *tmp;
-
-		tmp = list_entry(entry, struct kbase_device, entry);
-		if (tmp->mdev.minor == minor || minor == -1) {
-			kbdev = tmp;
-			get_device(kbdev->dev);
-			break;
-		}
-	}
-	kbase_dev_list_put(dev_list);
-
-	return kbdev;
-}
-EXPORT_SYMBOL(kbase_find_device);
-
-void kbase_release_device(struct kbase_device *kbdev)
-{
-	put_device(kbdev->dev);
-}
-EXPORT_SYMBOL(kbase_release_device);
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0) && \
-		!(LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 28) && \
-		LINUX_VERSION_CODE < KERNEL_VERSION(4, 5, 0))
-/*
- * Older versions, before v4.6, of the kernel doesn't have
- * kstrtobool_from_user(), except longterm 4.4.y which had it added in 4.4.28
- */
-static int kstrtobool_from_user(const char __user *s, size_t count, bool *res)
-{
-	char buf[32];
-
-	count = min(sizeof(buf), count);
-
-	if (copy_from_user(buf, s, count))
-		return -EFAULT;
-	buf[count] = '\0';
-
-	return strtobool(buf, res);
-}
-#endif
-
-static ssize_t write_ctx_infinite_cache(struct file *f, const char __user *ubuf, size_t size, loff_t *off)
-{
-	struct kbase_context *kctx = f->private_data;
-	int err;
-	bool value;
-
-	err = kstrtobool_from_user(ubuf, size, &value);
-	if (err)
-		return err;
-
-	if (value)
-		kbase_ctx_flag_set(kctx, KCTX_INFINITE_CACHE);
-	else
-		kbase_ctx_flag_clear(kctx, KCTX_INFINITE_CACHE);
-
-	return size;
-}
-
-static ssize_t read_ctx_infinite_cache(struct file *f, char __user *ubuf, size_t size, loff_t *off)
-{
-	struct kbase_context *kctx = f->private_data;
-	char buf[32];
-	int count;
-	bool value;
-
-	value = kbase_ctx_flag(kctx, KCTX_INFINITE_CACHE);
-
-	count = scnprintf(buf, sizeof(buf), "%s\n", value ? "Y" : "N");
-
-	return simple_read_from_buffer(ubuf, size, off, buf, count);
-}
-
-static const struct file_operations kbase_infinite_cache_fops = {
-	.open = simple_open,
-	.write = write_ctx_infinite_cache,
-	.read = read_ctx_infinite_cache,
-};
-
-static int kbase_open(struct inode *inode, struct file *filp)
-{
-	struct kbase_device *kbdev = NULL;
-	struct kbase_context *kctx;
-	int ret = 0;
-#ifdef CONFIG_DEBUG_FS
-	char kctx_name[64];
-#endif
-
-	kbdev = kbase_find_device(iminor(inode));
-
-	if (!kbdev)
-		return -ENODEV;
-
-	kctx = kbase_create_context(kbdev, is_compat_task());
-	if (!kctx) {
-		ret = -ENOMEM;
-		goto out;
-	}
-
-	init_waitqueue_head(&kctx->event_queue);
-	filp->private_data = kctx;
-	kctx->filp = filp;
-
-	if (kbdev->infinite_cache_active_default)
-		kbase_ctx_flag_set(kctx, KCTX_INFINITE_CACHE);
-
-#ifdef CONFIG_DEBUG_FS
-	snprintf(kctx_name, 64, "%d_%d", kctx->tgid, kctx->id);
-
-	kctx->kctx_dentry = debugfs_create_dir(kctx_name,
-			kbdev->debugfs_ctx_directory);
-
-	if (IS_ERR_OR_NULL(kctx->kctx_dentry)) {
-		ret = -ENOMEM;
-		goto out;
-	}
-
-	debugfs_create_file("infinite_cache", 0644, kctx->kctx_dentry,
-			    kctx, &kbase_infinite_cache_fops);
-
-	mutex_init(&kctx->mem_profile_lock);
-
-	kbasep_jd_debugfs_ctx_init(kctx);
-	kbase_debug_mem_view_init(filp);
-
-	kbase_debug_job_fault_context_init(kctx);
-
-	kbase_mem_pool_debugfs_init(kctx->kctx_dentry, &kctx->mem_pool, &kctx->lp_mem_pool);
-
-	kbase_jit_debugfs_init(kctx);
-#endif /* CONFIG_DEBUG_FS */
-
-	dev_dbg(kbdev->dev, "created base context\n");
-
-	{
-		struct kbasep_kctx_list_element *element;
-
-		element = kzalloc(sizeof(*element), GFP_KERNEL);
-		if (element) {
-			mutex_lock(&kbdev->kctx_list_lock);
-			element->kctx = kctx;
-			list_add(&element->link, &kbdev->kctx_list);
-			KBASE_TLSTREAM_TL_NEW_CTX(
-					element->kctx,
-					element->kctx->id,
-					(u32)(element->kctx->tgid));
-			mutex_unlock(&kbdev->kctx_list_lock);
-		} else {
-			/* we don't treat this as a fail - just warn about it */
-			dev_warn(kbdev->dev, "couldn't add kctx to kctx_list\n");
-		}
-	}
-	return 0;
-
- out:
-	kbase_release_device(kbdev);
-	return ret;
-}
-
-static int kbase_release(struct inode *inode, struct file *filp)
-{
-	struct kbase_context *kctx = filp->private_data;
-	struct kbase_device *kbdev = kctx->kbdev;
-	struct kbasep_kctx_list_element *element, *tmp;
-	bool found_element = false;
-
-	KBASE_TLSTREAM_TL_DEL_CTX(kctx);
-
-#ifdef CONFIG_DEBUG_FS
-	kbasep_mem_profile_debugfs_remove(kctx);
-	kbase_debug_job_fault_context_term(kctx);
-#endif
-
-	mutex_lock(&kbdev->kctx_list_lock);
-	list_for_each_entry_safe(element, tmp, &kbdev->kctx_list, link) {
-		if (element->kctx == kctx) {
-			list_del(&element->link);
-			kfree(element);
-			found_element = true;
-		}
-	}
-	mutex_unlock(&kbdev->kctx_list_lock);
-	if (!found_element)
-		dev_warn(kbdev->dev, "kctx not in kctx_list\n");
-
-	filp->private_data = NULL;
-
-	mutex_lock(&kctx->vinstr_cli_lock);
-	/* If this client was performing hwcnt dumping and did not explicitly
-	 * detach itself, remove it from the vinstr core now */
-	if (kctx->vinstr_cli) {
-		struct kbase_uk_hwcnt_setup setup;
-
-		setup.dump_buffer = 0llu;
-		kbase_vinstr_legacy_hwc_setup(
-				kbdev->vinstr_ctx, &kctx->vinstr_cli, &setup);
-	}
-	mutex_unlock(&kctx->vinstr_cli_lock);
-
-	kbase_destroy_context(kctx);
-
-	dev_dbg(kbdev->dev, "deleted base context\n");
-	kbase_release_device(kbdev);
-	return 0;
-}
-
-#define CALL_MAX_SIZE 536
-
-static long kbase_legacy_ioctl(struct file *filp, unsigned int cmd,
-		unsigned long arg)
-{
-	u64 msg[(CALL_MAX_SIZE + 7) >> 3] = { 0xdeadbeefdeadbeefull };	/* alignment fixup */
-	u32 size = _IOC_SIZE(cmd);
-	struct kbase_context *kctx = filp->private_data;
-
-	if (size > CALL_MAX_SIZE)
-		return -ENOTTY;
-
-	if (0 != copy_from_user(&msg, (void __user *)arg, size)) {
-		dev_err(kctx->kbdev->dev, "failed to copy ioctl argument into kernel space\n");
-		return -EFAULT;
-	}
-
-	if (kbase_legacy_dispatch(kctx, &msg, size) != 0)
-		return -EFAULT;
-
-	if (0 != copy_to_user((void __user *)arg, &msg, size)) {
-		dev_err(kctx->kbdev->dev, "failed to copy results of UK call back to user space\n");
-		return -EFAULT;
-	}
-	return 0;
-}
-
-static int kbase_api_set_flags(struct kbase_context *kctx,
-		struct kbase_ioctl_set_flags *flags)
-{
-	int err;
-
-	/* setup pending, try to signal that we'll do the setup,
-	 * if setup was already in progress, err this call
-	 */
-	if (atomic_cmpxchg(&kctx->setup_in_progress, 0, 1) != 0)
-		return -EINVAL;
-
-	err = kbase_context_set_create_flags(kctx, flags->create_flags);
-	/* if bad flags, will stay stuck in setup mode */
-	if (err)
-		return err;
-
-	atomic_set(&kctx->setup_complete, 1);
-	return 0;
-}
-
-static int kbase_api_job_submit(struct kbase_context *kctx,
-		struct kbase_ioctl_job_submit *submit)
-{
-	return kbase_jd_submit(kctx, u64_to_user_ptr(submit->addr),
-			submit->nr_atoms,
-			submit->stride, false);
-}
-
-static int kbase_api_get_gpuprops(struct kbase_context *kctx,
-		struct kbase_ioctl_get_gpuprops *get_props)
-{
-	struct kbase_gpu_props *kprops = &kctx->kbdev->gpu_props;
-	int err;
-
-	if (get_props->flags != 0) {
-		dev_err(kctx->kbdev->dev, "Unsupported flags to get_gpuprops");
-		return -EINVAL;
-	}
-
-	if (get_props->size == 0)
-		return kprops->prop_buffer_size;
-	if (get_props->size < kprops->prop_buffer_size)
-		return -EINVAL;
-
-	err = copy_to_user(u64_to_user_ptr(get_props->buffer),
-			kprops->prop_buffer,
-			kprops->prop_buffer_size);
-	if (err)
-		return -EFAULT;
-	return kprops->prop_buffer_size;
-}
-
-static int kbase_api_post_term(struct kbase_context *kctx)
-{
-	kbase_event_close(kctx);
-	return 0;
-}
-
-static int kbase_api_mem_alloc(struct kbase_context *kctx,
-		union kbase_ioctl_mem_alloc *alloc)
-{
-	struct kbase_va_region *reg;
-	u64 flags = alloc->in.flags;
-	u64 gpu_va;
-
-#if defined(CONFIG_64BIT)
-	if (!kbase_ctx_flag(kctx, KCTX_COMPAT)) {
-		/* force SAME_VA if a 64-bit client */
-		flags |= BASE_MEM_SAME_VA;
-	}
-#endif
-
-	reg = kbase_mem_alloc(kctx, alloc->in.va_pages,
-			alloc->in.commit_pages,
-			alloc->in.extent,
-			&flags, &gpu_va);
-
-	if (!reg)
-		return -ENOMEM;
-
-	alloc->out.flags = flags;
-	alloc->out.gpu_va = gpu_va;
-
-	return 0;
-}
-
-static int kbase_api_mem_query(struct kbase_context *kctx,
-		union kbase_ioctl_mem_query *query)
-{
-	return kbase_mem_query(kctx, query->in.gpu_addr,
-			query->in.query, &query->out.value);
-}
-
-static int kbase_api_mem_free(struct kbase_context *kctx,
-		struct kbase_ioctl_mem_free *free)
-{
-	return kbase_mem_free(kctx, free->gpu_addr);
-}
-
-static int kbase_api_hwcnt_reader_setup(struct kbase_context *kctx,
-		struct kbase_ioctl_hwcnt_reader_setup *setup)
-{
-	int ret;
-	struct kbase_uk_hwcnt_reader_setup args = {
-		.buffer_count = setup->buffer_count,
-		.jm_bm = setup->jm_bm,
-		.shader_bm = setup->shader_bm,
-		.tiler_bm = setup->tiler_bm,
-		.mmu_l2_bm = setup->mmu_l2_bm
-	};
-
-	mutex_lock(&kctx->vinstr_cli_lock);
-	ret = kbase_vinstr_hwcnt_reader_setup(kctx->kbdev->vinstr_ctx, &args);
-	mutex_unlock(&kctx->vinstr_cli_lock);
-
-	if (ret)
-		return ret;
-	return args.fd;
-}
-
-static int kbase_api_hwcnt_enable(struct kbase_context *kctx,
-		struct kbase_ioctl_hwcnt_enable *enable)
-{
-	int ret;
-	struct kbase_uk_hwcnt_setup args = {
-		.dump_buffer = enable->dump_buffer,
-		.jm_bm = enable->jm_bm,
-		.shader_bm = enable->shader_bm,
-		.tiler_bm = enable->tiler_bm,
-		.mmu_l2_bm = enable->mmu_l2_bm
-	};
-
-	mutex_lock(&kctx->vinstr_cli_lock);
-	ret = kbase_vinstr_legacy_hwc_setup(kctx->kbdev->vinstr_ctx,
-			&kctx->vinstr_cli, &args);
-	mutex_unlock(&kctx->vinstr_cli_lock);
-
-	return ret;
-}
-
-static int kbase_api_hwcnt_dump(struct kbase_context *kctx)
-{
-	int ret;
-
-	mutex_lock(&kctx->vinstr_cli_lock);
-	ret = kbase_vinstr_hwc_dump(kctx->vinstr_cli,
-			BASE_HWCNT_READER_EVENT_MANUAL);
-	mutex_unlock(&kctx->vinstr_cli_lock);
-
-	return ret;
-}
-
-static int kbase_api_hwcnt_clear(struct kbase_context *kctx)
-{
-	int ret;
-
-	mutex_lock(&kctx->vinstr_cli_lock);
-	ret = kbase_vinstr_hwc_clear(kctx->vinstr_cli);
-	mutex_unlock(&kctx->vinstr_cli_lock);
-
-	return ret;
-}
-
-static int kbase_api_disjoint_query(struct kbase_context *kctx,
-		struct kbase_ioctl_disjoint_query *query)
-{
-	query->counter = kbase_disjoint_event_get(kctx->kbdev);
-
-	return 0;
-}
-
-static int kbase_api_get_ddk_version(struct kbase_context *kctx,
-		struct kbase_ioctl_get_ddk_version *version)
-{
-	int ret;
-	int len = sizeof(KERNEL_SIDE_DDK_VERSION_STRING);
-
-	if (version->version_buffer == 0)
-		return len;
-
-	if (version->size < len)
-		return -EOVERFLOW;
-
-	ret = copy_to_user(u64_to_user_ptr(version->version_buffer),
-			KERNEL_SIDE_DDK_VERSION_STRING,
-			sizeof(KERNEL_SIDE_DDK_VERSION_STRING));
-
-	if (ret)
-		return -EFAULT;
-
-	return len;
-}
-
-static int kbase_api_mem_jit_init(struct kbase_context *kctx,
-		struct kbase_ioctl_mem_jit_init *jit_init)
-{
-	return kbase_region_tracker_init_jit(kctx, jit_init->va_pages);
-}
-
-static int kbase_api_mem_sync(struct kbase_context *kctx,
-		struct kbase_ioctl_mem_sync *sync)
-{
-	struct basep_syncset sset = {
-		.mem_handle.basep.handle = sync->handle,
-		.user_addr = sync->user_addr,
-		.size = sync->size,
-		.type = sync->type
-	};
-
-	return kbase_sync_now(kctx, &sset);
-}
-
-static int kbase_api_mem_find_cpu_offset(struct kbase_context *kctx,
-		union kbase_ioctl_mem_find_cpu_offset *find)
-{
-	return kbasep_find_enclosing_cpu_mapping_offset(
-			kctx,
-			find->in.cpu_addr,
-			find->in.size,
-			&find->out.offset);
-}
-
-static int kbase_api_get_context_id(struct kbase_context *kctx,
-		struct kbase_ioctl_get_context_id *info)
-{
-	info->id = kctx->id;
-
-	return 0;
-}
-
-static int kbase_api_tlstream_acquire(struct kbase_context *kctx,
-		struct kbase_ioctl_tlstream_acquire *acquire)
-{
-	return kbase_tlstream_acquire(kctx, acquire->flags);
-}
-
-static int kbase_api_tlstream_flush(struct kbase_context *kctx)
-{
-	kbase_tlstream_flush_streams();
-
-	return 0;
-}
-
-static int kbase_api_mem_commit(struct kbase_context *kctx,
-		struct kbase_ioctl_mem_commit *commit)
-{
-	return kbase_mem_commit(kctx, commit->gpu_addr, commit->pages);
-}
-
-static int kbase_api_mem_alias(struct kbase_context *kctx,
-		union kbase_ioctl_mem_alias *alias)
-{
-	struct base_mem_aliasing_info *ai;
-	u64 flags;
-	int err;
-
-	if (alias->in.nents == 0 || alias->in.nents > 2048)
-		return -EINVAL;
-
-	ai = vmalloc(sizeof(*ai) * alias->in.nents);
-	if (!ai)
-		return -ENOMEM;
-
-	err = copy_from_user(ai,
-			u64_to_user_ptr(alias->in.aliasing_info),
-			sizeof(*ai) * alias->in.nents);
-	if (err) {
-		vfree(ai);
-		return -EFAULT;
-	}
-
-	flags = alias->in.flags;
-
-	alias->out.gpu_va = kbase_mem_alias(kctx, &flags,
-			alias->in.stride, alias->in.nents,
-			ai, &alias->out.va_pages);
-
-	alias->out.flags = flags;
-
-	vfree(ai);
-
-	if (alias->out.gpu_va == 0)
-		return -ENOMEM;
-
-	return 0;
-}
-
-static int kbase_api_mem_import(struct kbase_context *kctx,
-		union kbase_ioctl_mem_import *import)
-{
-	int ret;
-	u64 flags = import->in.flags;
-
-	ret = kbase_mem_import(kctx,
-			import->in.type,
-			u64_to_user_ptr(import->in.phandle),
-			import->in.padding,
-			&import->out.gpu_va,
-			&import->out.va_pages,
-			&flags);
-
-	import->out.flags = flags;
-
-	return ret;
-}
-
-static int kbase_api_mem_flags_change(struct kbase_context *kctx,
-		struct kbase_ioctl_mem_flags_change *change)
-{
-	return kbase_mem_flags_change(kctx, change->gpu_va,
-			change->flags, change->mask);
-}
-
-static int kbase_api_stream_create(struct kbase_context *kctx,
-		struct kbase_ioctl_stream_create *stream)
-{
-#if defined(CONFIG_SYNC) || defined(CONFIG_SYNC_FILE)
-	int fd, ret;
-
-	/* Name must be NULL-terminated and padded with NULLs, so check last
-	 * character is NULL
-	 */
-	if (stream->name[sizeof(stream->name)-1] != 0)
-		return -EINVAL;
-
-	ret = kbase_sync_fence_stream_create(stream->name, &fd);
-
-	if (ret)
-		return ret;
-	return fd;
-#else
-	return -ENOENT;
-#endif
-}
-
-static int kbase_api_fence_validate(struct kbase_context *kctx,
-		struct kbase_ioctl_fence_validate *validate)
-{
-#if defined(CONFIG_SYNC) || defined(CONFIG_SYNC_FILE)
-	return kbase_sync_fence_validate(validate->fd);
-#else
-	return -ENOENT;
-#endif
-}
-
-static int kbase_api_get_profiling_controls(struct kbase_context *kctx,
-		struct kbase_ioctl_get_profiling_controls *controls)
-{
-	int ret;
-
-	if (controls->count > (FBDUMP_CONTROL_MAX - FBDUMP_CONTROL_MIN))
-		return -EINVAL;
-
-	ret = copy_to_user(u64_to_user_ptr(controls->buffer),
-			&kctx->kbdev->kbase_profiling_controls[
-				FBDUMP_CONTROL_MIN],
-			controls->count * sizeof(u32));
-
-	if (ret)
-		return -EFAULT;
-	return 0;
-}
-
-static int kbase_api_mem_profile_add(struct kbase_context *kctx,
-		struct kbase_ioctl_mem_profile_add *data)
-{
-	char *buf;
-	int err;
-
-	if (data->len > KBASE_MEM_PROFILE_MAX_BUF_SIZE) {
-		dev_err(kctx->kbdev->dev, "mem_profile_add: buffer too big\n");
-		return -EINVAL;
-	}
-
-	buf = kmalloc(data->len, GFP_KERNEL);
-	if (ZERO_OR_NULL_PTR(buf))
-		return -ENOMEM;
-
-	err = copy_from_user(buf, u64_to_user_ptr(data->buffer),
-			data->len);
-	if (err) {
-		kfree(buf);
-		return -EFAULT;
-	}
-
-	return kbasep_mem_profile_debugfs_insert(kctx, buf, data->len);
-}
-
-static int kbase_api_soft_event_update(struct kbase_context *kctx,
-		struct kbase_ioctl_soft_event_update *update)
-{
-	if (update->flags != 0)
-		return -EINVAL;
-
-	return kbase_soft_event_update(kctx, update->event, update->new_status);
-}
-
-#if MALI_UNIT_TEST
-static int kbase_api_tlstream_test(struct kbase_context *kctx,
-		struct kbase_ioctl_tlstream_test *test)
-{
-	kbase_tlstream_test(
-			test->tpw_count,
-			test->msg_delay,
-			test->msg_count,
-			test->aux_msg);
-
-	return 0;
-}
-
-static int kbase_api_tlstream_stats(struct kbase_context *kctx,
-		struct kbase_ioctl_tlstream_stats *stats)
-{
-	kbase_tlstream_stats(
-			&stats->bytes_collected,
-			&stats->bytes_generated);
-
-	return 0;
-}
-#endif /* MALI_UNIT_TEST */
-
-#define KBASE_HANDLE_IOCTL(cmd, function)                          \
-	case cmd:                                                  \
-	do {                                                       \
-		BUILD_BUG_ON(_IOC_DIR(cmd) != _IOC_NONE);          \
-		return function(kctx);                             \
-	} while (0)
-
-#define KBASE_HANDLE_IOCTL_IN(cmd, function, type)                 \
-	case cmd:                                                  \
-	do {                                                       \
-		type param;                                        \
-		int err;                                           \
-		BUILD_BUG_ON(_IOC_DIR(cmd) != _IOC_WRITE);         \
-		BUILD_BUG_ON(sizeof(param) != _IOC_SIZE(cmd));     \
-		err = copy_from_user(&param, uarg, sizeof(param)); \
-		if (err)                                           \
-			return -EFAULT;                            \
-		return function(kctx, &param);                     \
-	} while (0)
-
-#define KBASE_HANDLE_IOCTL_OUT(cmd, function, type)                \
-	case cmd:                                                  \
-	do {                                                       \
-		type param;                                        \
-		int ret, err;                                      \
-		BUILD_BUG_ON(_IOC_DIR(cmd) != _IOC_READ);          \
-		BUILD_BUG_ON(sizeof(param) != _IOC_SIZE(cmd));     \
-		ret = function(kctx, &param);                      \
-		err = copy_to_user(uarg, &param, sizeof(param));   \
-		if (err)                                           \
-			return -EFAULT;                            \
-		return ret;                                        \
-	} while (0)
-
-#define KBASE_HANDLE_IOCTL_INOUT(cmd, function, type)                  \
-	case cmd:                                                      \
-	do {                                                           \
-		type param;                                            \
-		int ret, err;                                          \
-		BUILD_BUG_ON(_IOC_DIR(cmd) != (_IOC_WRITE|_IOC_READ)); \
-		BUILD_BUG_ON(sizeof(param) != _IOC_SIZE(cmd));         \
-		err = copy_from_user(&param, uarg, sizeof(param));     \
-		if (err)                                               \
-			return -EFAULT;                                \
-		ret = function(kctx, &param);                          \
-		err = copy_to_user(uarg, &param, sizeof(param));       \
-		if (err)                                               \
-			return -EFAULT;                                \
-		return ret;                                            \
-	} while (0)
-
-static long kbase_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
-{
-	struct kbase_context *kctx = filp->private_data;
-	struct kbase_device *kbdev = kctx->kbdev;
-	void __user *uarg = (void __user *)arg;
-
-	/* The UK ioctl values overflow the cmd field causing the type to be
-	 * incremented
-	 */
-	if (_IOC_TYPE(cmd) == LINUX_UK_BASE_MAGIC+2)
-		return kbase_legacy_ioctl(filp, cmd, arg);
-
-	/* The UK version check IOCTL doesn't overflow the cmd field, so is
-	 * handled separately here
-	 */
-	if (cmd == _IOC(_IOC_READ|_IOC_WRITE, LINUX_UK_BASE_MAGIC,
-				UKP_FUNC_ID_CHECK_VERSION,
-				sizeof(struct uku_version_check_args)))
-		return kbase_legacy_ioctl(filp, cmd, arg);
-
-	/* Only these ioctls are available until setup is complete */
-	switch (cmd) {
-		KBASE_HANDLE_IOCTL_INOUT(KBASE_IOCTL_VERSION_CHECK,
-				kbase_api_handshake,
-				struct kbase_ioctl_version_check);
-		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_SET_FLAGS,
-				kbase_api_set_flags,
-				struct kbase_ioctl_set_flags);
-	}
-
-	/* Block call until version handshake and setup is complete */
-	if (kctx->api_version == 0 || !atomic_read(&kctx->setup_complete))
-		return -EINVAL;
-
-	/* Normal ioctls */
-	switch (cmd) {
-		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_JOB_SUBMIT,
-				kbase_api_job_submit,
-				struct kbase_ioctl_job_submit);
-		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_GET_GPUPROPS,
-				kbase_api_get_gpuprops,
-				struct kbase_ioctl_get_gpuprops);
-		KBASE_HANDLE_IOCTL(KBASE_IOCTL_POST_TERM,
-				kbase_api_post_term);
-		KBASE_HANDLE_IOCTL_INOUT(KBASE_IOCTL_MEM_ALLOC,
-				kbase_api_mem_alloc,
-				union kbase_ioctl_mem_alloc);
-		KBASE_HANDLE_IOCTL_INOUT(KBASE_IOCTL_MEM_QUERY,
-				kbase_api_mem_query,
-				union kbase_ioctl_mem_query);
-		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_MEM_FREE,
-				kbase_api_mem_free,
-				struct kbase_ioctl_mem_free);
-		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_HWCNT_READER_SETUP,
-				kbase_api_hwcnt_reader_setup,
-				struct kbase_ioctl_hwcnt_reader_setup);
-		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_HWCNT_ENABLE,
-				kbase_api_hwcnt_enable,
-				struct kbase_ioctl_hwcnt_enable);
-		KBASE_HANDLE_IOCTL(KBASE_IOCTL_HWCNT_DUMP,
-				kbase_api_hwcnt_dump);
-		KBASE_HANDLE_IOCTL(KBASE_IOCTL_HWCNT_CLEAR,
-				kbase_api_hwcnt_clear);
-		KBASE_HANDLE_IOCTL_OUT(KBASE_IOCTL_DISJOINT_QUERY,
-				kbase_api_disjoint_query,
-				struct kbase_ioctl_disjoint_query);
-		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_GET_DDK_VERSION,
-				kbase_api_get_ddk_version,
-				struct kbase_ioctl_get_ddk_version);
-		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_MEM_JIT_INIT,
-				kbase_api_mem_jit_init,
-				struct kbase_ioctl_mem_jit_init);
-		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_MEM_SYNC,
-				kbase_api_mem_sync,
-				struct kbase_ioctl_mem_sync);
-		KBASE_HANDLE_IOCTL_INOUT(KBASE_IOCTL_MEM_FIND_CPU_OFFSET,
-				kbase_api_mem_find_cpu_offset,
-				union kbase_ioctl_mem_find_cpu_offset);
-		KBASE_HANDLE_IOCTL_OUT(KBASE_IOCTL_GET_CONTEXT_ID,
-				kbase_api_get_context_id,
-				struct kbase_ioctl_get_context_id);
-		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_TLSTREAM_ACQUIRE,
-				kbase_api_tlstream_acquire,
-				struct kbase_ioctl_tlstream_acquire);
-		KBASE_HANDLE_IOCTL(KBASE_IOCTL_TLSTREAM_FLUSH,
-				kbase_api_tlstream_flush);
-		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_MEM_COMMIT,
-				kbase_api_mem_commit,
-				struct kbase_ioctl_mem_commit);
-		KBASE_HANDLE_IOCTL_INOUT(KBASE_IOCTL_MEM_ALIAS,
-				kbase_api_mem_alias,
-				union kbase_ioctl_mem_alias);
-		KBASE_HANDLE_IOCTL_INOUT(KBASE_IOCTL_MEM_IMPORT,
-				kbase_api_mem_import,
-				union kbase_ioctl_mem_import);
-		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_MEM_FLAGS_CHANGE,
-				kbase_api_mem_flags_change,
-				struct kbase_ioctl_mem_flags_change);
-		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_STREAM_CREATE,
-				kbase_api_stream_create,
-				struct kbase_ioctl_stream_create);
-		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_FENCE_VALIDATE,
-				kbase_api_fence_validate,
-				struct kbase_ioctl_fence_validate);
-		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_GET_PROFILING_CONTROLS,
-				kbase_api_get_profiling_controls,
-				struct kbase_ioctl_get_profiling_controls);
-		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_MEM_PROFILE_ADD,
-				kbase_api_mem_profile_add,
-				struct kbase_ioctl_mem_profile_add);
-		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_SOFT_EVENT_UPDATE,
-				kbase_api_soft_event_update,
-				struct kbase_ioctl_soft_event_update);
-
-#if MALI_UNIT_TEST
-		KBASE_HANDLE_IOCTL_IN(KBASE_IOCTL_TLSTREAM_TEST,
-				kbase_api_tlstream_test,
-				struct kbase_ioctl_tlstream_test);
-		KBASE_HANDLE_IOCTL_OUT(KBASE_IOCTL_TLSTREAM_STATS,
-				kbase_api_tlstream_stats,
-				struct kbase_ioctl_tlstream_stats);
-#endif
-	}
-
-	dev_warn(kbdev->dev, "Unknown ioctl 0x%x nr:%d", cmd, _IOC_NR(cmd));
-
-	return -ENOIOCTLCMD;
-}
-
-static ssize_t kbase_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
-{
-	struct kbase_context *kctx = filp->private_data;
-	struct base_jd_event_v2 uevent;
-	int out_count = 0;
-
-	if (count < sizeof(uevent))
-		return -ENOBUFS;
-
-	do {
-		while (kbase_event_dequeue(kctx, &uevent)) {
-			if (out_count > 0)
-				goto out;
-
-			if (filp->f_flags & O_NONBLOCK)
-				return -EAGAIN;
-
-			if (wait_event_interruptible(kctx->event_queue,
-					kbase_event_pending(kctx)) != 0)
-				return -ERESTARTSYS;
-		}
-		if (uevent.event_code == BASE_JD_EVENT_DRV_TERMINATED) {
-			if (out_count == 0)
-				return -EPIPE;
-			goto out;
-		}
-
-		if (copy_to_user(buf, &uevent, sizeof(uevent)) != 0)
-			return -EFAULT;
-
-		buf += sizeof(uevent);
-		out_count++;
-		count -= sizeof(uevent);
-	} while (count >= sizeof(uevent));
-
- out:
-	return out_count * sizeof(uevent);
-}
-
-static unsigned int kbase_poll(struct file *filp, poll_table *wait)
-{
-	struct kbase_context *kctx = filp->private_data;
-
-	poll_wait(filp, &kctx->event_queue, wait);
-	if (kbase_event_pending(kctx))
-		return POLLIN | POLLRDNORM;
-
-	return 0;
-}
-
-void kbase_event_wakeup(struct kbase_context *kctx)
-{
-	KBASE_DEBUG_ASSERT(kctx);
-
-	wake_up_interruptible(&kctx->event_queue);
-}
-
-KBASE_EXPORT_TEST_API(kbase_event_wakeup);
-
-static int kbase_check_flags(int flags)
-{
-	/* Enforce that the driver keeps the O_CLOEXEC flag so that execve() always
-	 * closes the file descriptor in a child process.
-	 */
-	if (0 == (flags & O_CLOEXEC))
-		return -EINVAL;
-
-	return 0;
-}
-
-
-/**
- * align_and_check - Align the specified pointer to the provided alignment and
- *                   check that it is still in range.
- * @gap_end:        Highest possible start address for allocation (end of gap in
- *                  address space)
- * @gap_start:      Start address of current memory area / gap in address space
- * @info:           vm_unmapped_area_info structure passed to caller, containing
- *                  alignment, length and limits for the allocation
- * @is_shader_code: True if the allocation is for shader code (which has
- *                  additional alignment requirements)
- *
- * Return: true if gap_end is now aligned correctly and is still in range,
- *         false otherwise
- */
-static bool align_and_check(unsigned long *gap_end, unsigned long gap_start,
-		struct vm_unmapped_area_info *info, bool is_shader_code)
-{
-	/* Compute highest gap address at the desired alignment */
-	(*gap_end) -= info->length;
-	(*gap_end) -= (*gap_end - info->align_offset) & info->align_mask;
-
-	if (is_shader_code) {
-		/* Check for 4GB boundary */
-		if (0 == (*gap_end & BASE_MEM_MASK_4GB))
-			(*gap_end) -= (info->align_offset ? info->align_offset :
-					info->length);
-		if (0 == ((*gap_end + info->length) & BASE_MEM_MASK_4GB))
-			(*gap_end) -= (info->align_offset ? info->align_offset :
-					info->length);
-
-		if (!(*gap_end & BASE_MEM_MASK_4GB) || !((*gap_end +
-				info->length) & BASE_MEM_MASK_4GB))
-			return false;
-	}
-
-
-	if ((*gap_end < info->low_limit) || (*gap_end < gap_start))
-		return false;
-
-
-	return true;
-}
-
-/* The following function is taken from the kernel and just
- * renamed. As it's not exported to modules we must copy-paste it here.
- */
-
-static unsigned long kbase_unmapped_area_topdown(struct vm_unmapped_area_info
-		*info, bool is_shader_code)
-{
-	struct mm_struct *mm = current->mm;
-	struct vm_area_struct *vma;
-	unsigned long length, low_limit, high_limit, gap_start, gap_end;
-
-	/* Adjust search length to account for worst case alignment overhead */
-	length = info->length + info->align_mask;
-	if (length < info->length)
-		return -ENOMEM;
-
-	/*
-	 * Adjust search limits by the desired length.
-	 * See implementation comment at top of unmapped_area().
-	 */
-	gap_end = info->high_limit;
-	if (gap_end < length)
-		return -ENOMEM;
-	high_limit = gap_end - length;
-
-	if (info->low_limit > high_limit)
-		return -ENOMEM;
-	low_limit = info->low_limit + length;
-
-	/* Check highest gap, which does not precede any rbtree node */
-	gap_start = mm->highest_vm_end;
-	if (gap_start <= high_limit) {
-		if (align_and_check(&gap_end, gap_start, info, is_shader_code))
-			return gap_end;
-	}
-
-	/* Check if rbtree root looks promising */
-	if (RB_EMPTY_ROOT(&mm->mm_rb))
-		return -ENOMEM;
-	vma = rb_entry(mm->mm_rb.rb_node, struct vm_area_struct, vm_rb);
-	if (vma->rb_subtree_gap < length)
-		return -ENOMEM;
-
-	while (true) {
-		/* Visit right subtree if it looks promising */
-		gap_start = vma->vm_prev ? vma->vm_prev->vm_end : 0;
-		if (gap_start <= high_limit && vma->vm_rb.rb_right) {
-			struct vm_area_struct *right =
-				rb_entry(vma->vm_rb.rb_right,
-					 struct vm_area_struct, vm_rb);
-			if (right->rb_subtree_gap >= length) {
-				vma = right;
-				continue;
-			}
-		}
-
-check_current:
-		/* Check if current node has a suitable gap */
-		gap_end = vma->vm_start;
-		if (gap_end < low_limit)
-			return -ENOMEM;
-		if (gap_start <= high_limit && gap_end - gap_start >= length) {
-			/* We found a suitable gap. Clip it with the original
-			 * high_limit. */
-			if (gap_end > info->high_limit)
-				gap_end = info->high_limit;
-
-			if (align_and_check(&gap_end, gap_start, info,
-					is_shader_code))
-				return gap_end;
-		}
-
-		/* Visit left subtree if it looks promising */
-		if (vma->vm_rb.rb_left) {
-			struct vm_area_struct *left =
-				rb_entry(vma->vm_rb.rb_left,
-					 struct vm_area_struct, vm_rb);
-			if (left->rb_subtree_gap >= length) {
-				vma = left;
-				continue;
-			}
-		}
-
-		/* Go back up the rbtree to find next candidate node */
-		while (true) {
-			struct rb_node *prev = &vma->vm_rb;
-			if (!rb_parent(prev))
-				return -ENOMEM;
-			vma = rb_entry(rb_parent(prev),
-				       struct vm_area_struct, vm_rb);
-			if (prev == vma->vm_rb.rb_right) {
-				gap_start = vma->vm_prev ?
-					vma->vm_prev->vm_end : 0;
-				goto check_current;
-			}
-		}
-	}
-
-	return -ENOMEM;
-}
-
-static unsigned long kbase_get_unmapped_area(struct file *filp,
-		const unsigned long addr, const unsigned long len,
-		const unsigned long pgoff, const unsigned long flags)
-{
-	/* based on get_unmapped_area, but simplified slightly due to that some
-	 * values are known in advance */
-	struct kbase_context *kctx = filp->private_data;
-	struct mm_struct *mm = current->mm;
-	struct vm_unmapped_area_info info;
-	unsigned long align_offset = 0;
-	unsigned long align_mask = 0;
-	unsigned long high_limit = mm->mmap_base;
-	unsigned long low_limit = PAGE_SIZE;
-	int cpu_va_bits = BITS_PER_LONG;
-	int gpu_pc_bits =
-	      kctx->kbdev->gpu_props.props.core_props.log2_program_counter_size;
-	bool is_shader_code = false;
-	unsigned long ret;
-
-	/* err on fixed address */
-	if ((flags & MAP_FIXED) || addr)
-		return -EINVAL;
-
-#ifdef CONFIG_64BIT
-	/* too big? */
-	if (len > TASK_SIZE - SZ_2M)
-		return -ENOMEM;
-
-	if (!kbase_ctx_flag(kctx, KCTX_COMPAT)) {
-
-		if (kbase_hw_has_feature(kctx->kbdev,
-						BASE_HW_FEATURE_33BIT_VA)) {
-			high_limit = kctx->same_va_end << PAGE_SHIFT;
-		} else {
-			high_limit = min_t(unsigned long, mm->mmap_base,
-					(kctx->same_va_end << PAGE_SHIFT));
-			if (len >= SZ_2M) {
-				align_offset = SZ_2M;
-				align_mask = SZ_2M - 1;
-			}
-		}
-
-		low_limit = SZ_2M;
-	} else {
-		cpu_va_bits = 32;
-	}
-#endif /* CONFIG_64BIT */
-	if ((PFN_DOWN(BASE_MEM_COOKIE_BASE) <= pgoff) &&
-		(PFN_DOWN(BASE_MEM_FIRST_FREE_ADDRESS) > pgoff)) {
-			int cookie = pgoff - PFN_DOWN(BASE_MEM_COOKIE_BASE);
-
-			if (!kctx->pending_regions[cookie])
-				return -EINVAL;
-
-			if (!(kctx->pending_regions[cookie]->flags &
-							KBASE_REG_GPU_NX)) {
-				if (cpu_va_bits > gpu_pc_bits) {
-					align_offset = 1ULL << gpu_pc_bits;
-					align_mask = align_offset - 1;
-					is_shader_code = true;
-				}
-			}
-#ifndef CONFIG_64BIT
-	} else {
-		return current->mm->get_unmapped_area(filp, addr, len, pgoff,
-						      flags);
-#endif
-	}
-
-	info.flags = 0;
-	info.length = len;
-	info.low_limit = low_limit;
-	info.high_limit = high_limit;
-	info.align_offset = align_offset;
-	info.align_mask = align_mask;
-
-	ret = kbase_unmapped_area_topdown(&info, is_shader_code);
-
-	if (IS_ERR_VALUE(ret) && high_limit == mm->mmap_base &&
-			high_limit < (kctx->same_va_end << PAGE_SHIFT)) {
-		/* Retry above mmap_base */
-		info.low_limit = mm->mmap_base;
-		info.high_limit = min_t(u64, TASK_SIZE,
-					(kctx->same_va_end << PAGE_SHIFT));
-
-		ret = kbase_unmapped_area_topdown(&info, is_shader_code);
-	}
-
-	return ret;
-}
-
-static const struct file_operations kbase_fops = {
-	.owner = THIS_MODULE,
-	.open = kbase_open,
-	.release = kbase_release,
-	.read = kbase_read,
-	.poll = kbase_poll,
-	.unlocked_ioctl = kbase_ioctl,
-	.compat_ioctl = kbase_ioctl,
-	.mmap = kbase_mmap,
-	.check_flags = kbase_check_flags,
-	.get_unmapped_area = kbase_get_unmapped_area,
-};
-
-#ifndef CONFIG_MALI_BIFROST_NO_MALI
-void kbase_os_reg_write(struct kbase_device *kbdev, u16 offset, u32 value)
-{
-	writel(value, kbdev->reg + offset);
-}
-
-u32 kbase_os_reg_read(struct kbase_device *kbdev, u16 offset)
-{
-	return readl(kbdev->reg + offset);
-}
-#endif /* !CONFIG_MALI_BIFROST_NO_MALI */
-
-/**
- * show_policy - Show callback for the power_policy sysfs file.
- *
- * This function is called to get the contents of the power_policy sysfs
- * file. This is a list of the available policies with the currently active one
- * surrounded by square brackets.
- *
- * @dev:	The device this sysfs file is for
- * @attr:	The attributes of the sysfs file
- * @buf:	The output buffer for the sysfs file contents
- *
- * Return: The number of bytes output to @buf.
- */
-static ssize_t show_policy(struct device *dev, struct device_attribute *attr, char *const buf)
-{
-	struct kbase_device *kbdev;
-	const struct kbase_pm_policy *current_policy;
-	const struct kbase_pm_policy *const *policy_list;
-	int policy_count;
-	int i;
-	ssize_t ret = 0;
-
-	kbdev = to_kbase_device(dev);
-
-	if (!kbdev)
-		return -ENODEV;
-
-	current_policy = kbase_pm_get_policy(kbdev);
-
-	policy_count = kbase_pm_list_policies(&policy_list);
-
-	for (i = 0; i < policy_count && ret < PAGE_SIZE; i++) {
-		if (policy_list[i] == current_policy)
-			ret += scnprintf(buf + ret, PAGE_SIZE - ret, "[%s] ", policy_list[i]->name);
-		else
-			ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%s ", policy_list[i]->name);
-	}
-
-	if (ret < PAGE_SIZE - 1) {
-		ret += scnprintf(buf + ret, PAGE_SIZE - ret, "\n");
-	} else {
-		buf[PAGE_SIZE - 2] = '\n';
-		buf[PAGE_SIZE - 1] = '\0';
-		ret = PAGE_SIZE - 1;
-	}
-
-	return ret;
-}
-
-/**
- * set_policy - Store callback for the power_policy sysfs file.
- *
- * This function is called when the power_policy sysfs file is written to.
- * It matches the requested policy against the available policies and if a
- * matching policy is found calls kbase_pm_set_policy() to change the
- * policy.
- *
- * @dev:	The device with sysfs file is for
- * @attr:	The attributes of the sysfs file
- * @buf:	The value written to the sysfs file
- * @count:	The number of bytes written to the sysfs file
- *
- * Return: @count if the function succeeded. An error code on failure.
- */
-static ssize_t set_policy(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct kbase_device *kbdev;
-	const struct kbase_pm_policy *new_policy = NULL;
-	const struct kbase_pm_policy *const *policy_list;
-	int policy_count;
-	int i;
-
-	kbdev = to_kbase_device(dev);
-
-	if (!kbdev)
-		return -ENODEV;
-
-	policy_count = kbase_pm_list_policies(&policy_list);
-
-	for (i = 0; i < policy_count; i++) {
-		if (sysfs_streq(policy_list[i]->name, buf)) {
-			new_policy = policy_list[i];
-			break;
-		}
-	}
-
-	if (!new_policy) {
-		dev_err(dev, "power_policy: policy not found\n");
-		return -EINVAL;
-	}
-
-	kbase_pm_set_policy(kbdev, new_policy);
-
-	return count;
-}
-
-/*
- * The sysfs file power_policy.
- *
- * This is used for obtaining information about the available policies,
- * determining which policy is currently active, and changing the active
- * policy.
- */
-static DEVICE_ATTR(power_policy, S_IRUGO | S_IWUSR, show_policy, set_policy);
-
-/**
- * show_ca_policy - Show callback for the core_availability_policy sysfs file.
- *
- * This function is called to get the contents of the core_availability_policy
- * sysfs file. This is a list of the available policies with the currently
- * active one surrounded by square brackets.
- *
- * @dev:	The device this sysfs file is for
- * @attr:	The attributes of the sysfs file
- * @buf:	The output buffer for the sysfs file contents
- *
- * Return: The number of bytes output to @buf.
- */
-static ssize_t show_ca_policy(struct device *dev, struct device_attribute *attr, char * const buf)
-{
-	struct kbase_device *kbdev;
-	const struct kbase_pm_ca_policy *current_policy;
-	const struct kbase_pm_ca_policy *const *policy_list;
-	int policy_count;
-	int i;
-	ssize_t ret = 0;
-
-	kbdev = to_kbase_device(dev);
-
-	if (!kbdev)
-		return -ENODEV;
-
-	current_policy = kbase_pm_ca_get_policy(kbdev);
-
-	policy_count = kbase_pm_ca_list_policies(&policy_list);
-
-	for (i = 0; i < policy_count && ret < PAGE_SIZE; i++) {
-		if (policy_list[i] == current_policy)
-			ret += scnprintf(buf + ret, PAGE_SIZE - ret, "[%s] ", policy_list[i]->name);
-		else
-			ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%s ", policy_list[i]->name);
-	}
-
-	if (ret < PAGE_SIZE - 1) {
-		ret += scnprintf(buf + ret, PAGE_SIZE - ret, "\n");
-	} else {
-		buf[PAGE_SIZE - 2] = '\n';
-		buf[PAGE_SIZE - 1] = '\0';
-		ret = PAGE_SIZE - 1;
-	}
-
-	return ret;
-}
-
-/**
- * set_ca_policy - Store callback for the core_availability_policy sysfs file.
- *
- * This function is called when the core_availability_policy sysfs file is
- * written to. It matches the requested policy against the available policies
- * and if a matching policy is found calls kbase_pm_set_policy() to change
- * the policy.
- *
- * @dev:	The device with sysfs file is for
- * @attr:	The attributes of the sysfs file
- * @buf:	The value written to the sysfs file
- * @count:	The number of bytes written to the sysfs file
- *
- * Return: @count if the function succeeded. An error code on failure.
- */
-static ssize_t set_ca_policy(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct kbase_device *kbdev;
-	const struct kbase_pm_ca_policy *new_policy = NULL;
-	const struct kbase_pm_ca_policy *const *policy_list;
-	int policy_count;
-	int i;
-
-	kbdev = to_kbase_device(dev);
-
-	if (!kbdev)
-		return -ENODEV;
-
-	policy_count = kbase_pm_ca_list_policies(&policy_list);
-
-	for (i = 0; i < policy_count; i++) {
-		if (sysfs_streq(policy_list[i]->name, buf)) {
-			new_policy = policy_list[i];
-			break;
-		}
-	}
-
-	if (!new_policy) {
-		dev_err(dev, "core_availability_policy: policy not found\n");
-		return -EINVAL;
-	}
-
-	kbase_pm_ca_set_policy(kbdev, new_policy);
-
-	return count;
-}
-
-/*
- * The sysfs file core_availability_policy
- *
- * This is used for obtaining information about the available policies,
- * determining which policy is currently active, and changing the active
- * policy.
- */
-static DEVICE_ATTR(core_availability_policy, S_IRUGO | S_IWUSR, show_ca_policy, set_ca_policy);
-
-/*
- * show_core_mask - Show callback for the core_mask sysfs file.
- *
- * This function is called to get the contents of the core_mask sysfs file.
- *
- * @dev:	The device this sysfs file is for
- * @attr:	The attributes of the sysfs file
- * @buf:	The output buffer for the sysfs file contents
- *
- * Return: The number of bytes output to @buf.
- */
-static ssize_t show_core_mask(struct device *dev, struct device_attribute *attr, char * const buf)
-{
-	struct kbase_device *kbdev;
-	ssize_t ret = 0;
-
-	kbdev = to_kbase_device(dev);
-
-	if (!kbdev)
-		return -ENODEV;
-
-	ret += scnprintf(buf + ret, PAGE_SIZE - ret,
-			"Current core mask (JS0) : 0x%llX\n",
-			kbdev->pm.debug_core_mask[0]);
-	ret += scnprintf(buf + ret, PAGE_SIZE - ret,
-			"Current core mask (JS1) : 0x%llX\n",
-			kbdev->pm.debug_core_mask[1]);
-	ret += scnprintf(buf + ret, PAGE_SIZE - ret,
-			"Current core mask (JS2) : 0x%llX\n",
-			kbdev->pm.debug_core_mask[2]);
-	ret += scnprintf(buf + ret, PAGE_SIZE - ret,
-			"Available core mask : 0x%llX\n",
-			kbdev->gpu_props.props.raw_props.shader_present);
-
-	return ret;
-}
-
-/**
- * set_core_mask - Store callback for the core_mask sysfs file.
- *
- * This function is called when the core_mask sysfs file is written to.
- *
- * @dev:	The device with sysfs file is for
- * @attr:	The attributes of the sysfs file
- * @buf:	The value written to the sysfs file
- * @count:	The number of bytes written to the sysfs file
- *
- * Return: @count if the function succeeded. An error code on failure.
- */
-static ssize_t set_core_mask(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct kbase_device *kbdev;
-	u64 new_core_mask[3];
-	int items;
-
-	kbdev = to_kbase_device(dev);
-
-	if (!kbdev)
-		return -ENODEV;
-
-	items = sscanf(buf, "%llx %llx %llx",
-			&new_core_mask[0], &new_core_mask[1],
-			&new_core_mask[2]);
-
-	if (items == 1)
-		new_core_mask[1] = new_core_mask[2] = new_core_mask[0];
-
-	if (items == 1 || items == 3) {
-		u64 shader_present =
-				kbdev->gpu_props.props.raw_props.shader_present;
-		u64 group0_core_mask =
-				kbdev->gpu_props.props.coherency_info.group[0].
-				core_mask;
-
-		if ((new_core_mask[0] & shader_present) != new_core_mask[0] ||
-				!(new_core_mask[0] & group0_core_mask) ||
-			(new_core_mask[1] & shader_present) !=
-						new_core_mask[1] ||
-				!(new_core_mask[1] & group0_core_mask) ||
-			(new_core_mask[2] & shader_present) !=
-						new_core_mask[2] ||
-				!(new_core_mask[2] & group0_core_mask)) {
-			dev_err(dev, "power_policy: invalid core specification\n");
-			return -EINVAL;
-		}
-
-		if (kbdev->pm.debug_core_mask[0] != new_core_mask[0] ||
-				kbdev->pm.debug_core_mask[1] !=
-						new_core_mask[1] ||
-				kbdev->pm.debug_core_mask[2] !=
-						new_core_mask[2]) {
-			unsigned long flags;
-
-			spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-			kbase_pm_set_debug_core_mask(kbdev, new_core_mask[0],
-					new_core_mask[1], new_core_mask[2]);
-
-			spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-		}
-
-		return count;
-	}
-
-	dev_err(kbdev->dev, "Couldn't process set_core_mask write operation.\n"
-		"Use format <core_mask>\n"
-		"or <core_mask_js0> <core_mask_js1> <core_mask_js2>\n");
-	return -EINVAL;
-}
-
-/*
- * The sysfs file core_mask.
- *
- * This is used to restrict shader core availability for debugging purposes.
- * Reading it will show the current core mask and the mask of cores available.
- * Writing to it will set the current core mask.
- */
-static DEVICE_ATTR(core_mask, S_IRUGO | S_IWUSR, show_core_mask, set_core_mask);
-
-/**
- * set_soft_job_timeout - Store callback for the soft_job_timeout sysfs
- * file.
- *
- * @dev: The device this sysfs file is for.
- * @attr: The attributes of the sysfs file.
- * @buf: The value written to the sysfs file.
- * @count: The number of bytes written to the sysfs file.
- *
- * This allows setting the timeout for software jobs. Waiting soft event wait
- * jobs will be cancelled after this period expires, while soft fence wait jobs
- * will print debug information if the fence debug feature is enabled.
- *
- * This is expressed in milliseconds.
- *
- * Return: count if the function succeeded. An error code on failure.
- */
-static ssize_t set_soft_job_timeout(struct device *dev,
-				      struct device_attribute *attr,
-				      const char *buf, size_t count)
-{
-	struct kbase_device *kbdev;
-	int soft_job_timeout_ms;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	if ((kstrtoint(buf, 0, &soft_job_timeout_ms) != 0) ||
-	    (soft_job_timeout_ms <= 0))
-		return -EINVAL;
-
-	atomic_set(&kbdev->js_data.soft_job_timeout_ms,
-		   soft_job_timeout_ms);
-
-	return count;
-}
-
-/**
- * show_soft_job_timeout - Show callback for the soft_job_timeout sysfs
- * file.
- *
- * This will return the timeout for the software jobs.
- *
- * @dev: The device this sysfs file is for.
- * @attr: The attributes of the sysfs file.
- * @buf: The output buffer for the sysfs file contents.
- *
- * Return: The number of bytes output to buf.
- */
-static ssize_t show_soft_job_timeout(struct device *dev,
-				       struct device_attribute *attr,
-				       char * const buf)
-{
-	struct kbase_device *kbdev;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	return scnprintf(buf, PAGE_SIZE, "%i\n",
-			 atomic_read(&kbdev->js_data.soft_job_timeout_ms));
-}
-
-static DEVICE_ATTR(soft_job_timeout, S_IRUGO | S_IWUSR,
-		   show_soft_job_timeout, set_soft_job_timeout);
-
-static u32 timeout_ms_to_ticks(struct kbase_device *kbdev, long timeout_ms,
-				int default_ticks, u32 old_ticks)
-{
-	if (timeout_ms > 0) {
-		u64 ticks = timeout_ms * 1000000ULL;
-		do_div(ticks, kbdev->js_data.scheduling_period_ns);
-		if (!ticks)
-			return 1;
-		return ticks;
-	} else if (timeout_ms < 0) {
-		return default_ticks;
-	} else {
-		return old_ticks;
-	}
-}
-
-/**
- * set_js_timeouts - Store callback for the js_timeouts sysfs file.
- *
- * This function is called to get the contents of the js_timeouts sysfs
- * file. This file contains five values separated by whitespace. The values
- * are basically the same as %JS_SOFT_STOP_TICKS, %JS_HARD_STOP_TICKS_SS,
- * %JS_HARD_STOP_TICKS_DUMPING, %JS_RESET_TICKS_SS, %JS_RESET_TICKS_DUMPING
- * configuration values (in that order), with the difference that the js_timeout
- * values are expressed in MILLISECONDS.
- *
- * The js_timeouts sysfile file allows the current values in
- * use by the job scheduler to get override. Note that a value needs to
- * be other than 0 for it to override the current job scheduler value.
- *
- * @dev:	The device with sysfs file is for
- * @attr:	The attributes of the sysfs file
- * @buf:	The value written to the sysfs file
- * @count:	The number of bytes written to the sysfs file
- *
- * Return: @count if the function succeeded. An error code on failure.
- */
-static ssize_t set_js_timeouts(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct kbase_device *kbdev;
-	int items;
-	long js_soft_stop_ms;
-	long js_soft_stop_ms_cl;
-	long js_hard_stop_ms_ss;
-	long js_hard_stop_ms_cl;
-	long js_hard_stop_ms_dumping;
-	long js_reset_ms_ss;
-	long js_reset_ms_cl;
-	long js_reset_ms_dumping;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	items = sscanf(buf, "%ld %ld %ld %ld %ld %ld %ld %ld",
-			&js_soft_stop_ms, &js_soft_stop_ms_cl,
-			&js_hard_stop_ms_ss, &js_hard_stop_ms_cl,
-			&js_hard_stop_ms_dumping, &js_reset_ms_ss,
-			&js_reset_ms_cl, &js_reset_ms_dumping);
-
-	if (items == 8) {
-		struct kbasep_js_device_data *js_data = &kbdev->js_data;
-		unsigned long flags;
-
-		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-#define UPDATE_TIMEOUT(ticks_name, ms_name, default) do {\
-	js_data->ticks_name = timeout_ms_to_ticks(kbdev, ms_name, \
-			default, js_data->ticks_name); \
-	dev_dbg(kbdev->dev, "Overriding " #ticks_name \
-			" with %lu ticks (%lu ms)\n", \
-			(unsigned long)js_data->ticks_name, \
-			ms_name); \
-	} while (0)
-
-		UPDATE_TIMEOUT(soft_stop_ticks, js_soft_stop_ms,
-				DEFAULT_JS_SOFT_STOP_TICKS);
-		UPDATE_TIMEOUT(soft_stop_ticks_cl, js_soft_stop_ms_cl,
-				DEFAULT_JS_SOFT_STOP_TICKS_CL);
-		UPDATE_TIMEOUT(hard_stop_ticks_ss, js_hard_stop_ms_ss,
-				kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8408) ?
-				DEFAULT_JS_HARD_STOP_TICKS_SS_8408 :
-				DEFAULT_JS_HARD_STOP_TICKS_SS);
-		UPDATE_TIMEOUT(hard_stop_ticks_cl, js_hard_stop_ms_cl,
-				DEFAULT_JS_HARD_STOP_TICKS_CL);
-		UPDATE_TIMEOUT(hard_stop_ticks_dumping,
-				js_hard_stop_ms_dumping,
-				DEFAULT_JS_HARD_STOP_TICKS_DUMPING);
-		UPDATE_TIMEOUT(gpu_reset_ticks_ss, js_reset_ms_ss,
-				kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8408) ?
-				DEFAULT_JS_RESET_TICKS_SS_8408 :
-				DEFAULT_JS_RESET_TICKS_SS);
-		UPDATE_TIMEOUT(gpu_reset_ticks_cl, js_reset_ms_cl,
-				DEFAULT_JS_RESET_TICKS_CL);
-		UPDATE_TIMEOUT(gpu_reset_ticks_dumping, js_reset_ms_dumping,
-				DEFAULT_JS_RESET_TICKS_DUMPING);
-
-		kbase_js_set_timeouts(kbdev);
-
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-		return count;
-	}
-
-	dev_err(kbdev->dev, "Couldn't process js_timeouts write operation.\n"
-			"Use format <soft_stop_ms> <soft_stop_ms_cl> <hard_stop_ms_ss> <hard_stop_ms_cl> <hard_stop_ms_dumping> <reset_ms_ss> <reset_ms_cl> <reset_ms_dumping>\n"
-			"Write 0 for no change, -1 to restore default timeout\n");
-	return -EINVAL;
-}
-
-static unsigned long get_js_timeout_in_ms(
-		u32 scheduling_period_ns,
-		u32 ticks)
-{
-	u64 ms = (u64)ticks * scheduling_period_ns;
-
-	do_div(ms, 1000000UL);
-	return ms;
-}
-
-/**
- * show_js_timeouts - Show callback for the js_timeouts sysfs file.
- *
- * This function is called to get the contents of the js_timeouts sysfs
- * file. It returns the last set values written to the js_timeouts sysfs file.
- * If the file didn't get written yet, the values will be current setting in
- * use.
- * @dev:	The device this sysfs file is for
- * @attr:	The attributes of the sysfs file
- * @buf:	The output buffer for the sysfs file contents
- *
- * Return: The number of bytes output to @buf.
- */
-static ssize_t show_js_timeouts(struct device *dev, struct device_attribute *attr, char * const buf)
-{
-	struct kbase_device *kbdev;
-	ssize_t ret;
-	unsigned long js_soft_stop_ms;
-	unsigned long js_soft_stop_ms_cl;
-	unsigned long js_hard_stop_ms_ss;
-	unsigned long js_hard_stop_ms_cl;
-	unsigned long js_hard_stop_ms_dumping;
-	unsigned long js_reset_ms_ss;
-	unsigned long js_reset_ms_cl;
-	unsigned long js_reset_ms_dumping;
-	u32 scheduling_period_ns;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	scheduling_period_ns = kbdev->js_data.scheduling_period_ns;
-
-#define GET_TIMEOUT(name) get_js_timeout_in_ms(\
-		scheduling_period_ns, \
-		kbdev->js_data.name)
-
-	js_soft_stop_ms = GET_TIMEOUT(soft_stop_ticks);
-	js_soft_stop_ms_cl = GET_TIMEOUT(soft_stop_ticks_cl);
-	js_hard_stop_ms_ss = GET_TIMEOUT(hard_stop_ticks_ss);
-	js_hard_stop_ms_cl = GET_TIMEOUT(hard_stop_ticks_cl);
-	js_hard_stop_ms_dumping = GET_TIMEOUT(hard_stop_ticks_dumping);
-	js_reset_ms_ss = GET_TIMEOUT(gpu_reset_ticks_ss);
-	js_reset_ms_cl = GET_TIMEOUT(gpu_reset_ticks_cl);
-	js_reset_ms_dumping = GET_TIMEOUT(gpu_reset_ticks_dumping);
-
-#undef GET_TIMEOUT
-
-	ret = scnprintf(buf, PAGE_SIZE, "%lu %lu %lu %lu %lu %lu %lu %lu\n",
-			js_soft_stop_ms, js_soft_stop_ms_cl,
-			js_hard_stop_ms_ss, js_hard_stop_ms_cl,
-			js_hard_stop_ms_dumping, js_reset_ms_ss,
-			js_reset_ms_cl, js_reset_ms_dumping);
-
-	if (ret >= PAGE_SIZE) {
-		buf[PAGE_SIZE - 2] = '\n';
-		buf[PAGE_SIZE - 1] = '\0';
-		ret = PAGE_SIZE - 1;
-	}
-
-	return ret;
-}
-
-/*
- * The sysfs file js_timeouts.
- *
- * This is used to override the current job scheduler values for
- * JS_STOP_STOP_TICKS_SS
- * JS_STOP_STOP_TICKS_CL
- * JS_HARD_STOP_TICKS_SS
- * JS_HARD_STOP_TICKS_CL
- * JS_HARD_STOP_TICKS_DUMPING
- * JS_RESET_TICKS_SS
- * JS_RESET_TICKS_CL
- * JS_RESET_TICKS_DUMPING.
- */
-static DEVICE_ATTR(js_timeouts, S_IRUGO | S_IWUSR, show_js_timeouts, set_js_timeouts);
-
-static u32 get_new_js_timeout(
-		u32 old_period,
-		u32 old_ticks,
-		u32 new_scheduling_period_ns)
-{
-	u64 ticks = (u64)old_period * (u64)old_ticks;
-	do_div(ticks, new_scheduling_period_ns);
-	return ticks?ticks:1;
-}
-
-/**
- * set_js_scheduling_period - Store callback for the js_scheduling_period sysfs
- *                            file
- * @dev:   The device the sysfs file is for
- * @attr:  The attributes of the sysfs file
- * @buf:   The value written to the sysfs file
- * @count: The number of bytes written to the sysfs file
- *
- * This function is called when the js_scheduling_period sysfs file is written
- * to. It checks the data written, and if valid updates the js_scheduling_period
- * value
- *
- * Return: @count if the function succeeded. An error code on failure.
- */
-static ssize_t set_js_scheduling_period(struct device *dev,
-		struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct kbase_device *kbdev;
-	int ret;
-	unsigned int js_scheduling_period;
-	u32 new_scheduling_period_ns;
-	u32 old_period;
-	struct kbasep_js_device_data *js_data;
-	unsigned long flags;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	js_data = &kbdev->js_data;
-
-	ret = kstrtouint(buf, 0, &js_scheduling_period);
-	if (ret || !js_scheduling_period) {
-		dev_err(kbdev->dev, "Couldn't process js_scheduling_period write operation.\n"
-				"Use format <js_scheduling_period_ms>\n");
-		return -EINVAL;
-	}
-
-	new_scheduling_period_ns = js_scheduling_period * 1000000;
-
-	/* Update scheduling timeouts */
-	mutex_lock(&js_data->runpool_mutex);
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	/* If no contexts have been scheduled since js_timeouts was last written
-	 * to, the new timeouts might not have been latched yet. So check if an
-	 * update is pending and use the new values if necessary. */
-
-	/* Use previous 'new' scheduling period as a base if present. */
-	old_period = js_data->scheduling_period_ns;
-
-#define SET_TIMEOUT(name) \
-		(js_data->name = get_new_js_timeout(\
-				old_period, \
-				kbdev->js_data.name, \
-				new_scheduling_period_ns))
-
-	SET_TIMEOUT(soft_stop_ticks);
-	SET_TIMEOUT(soft_stop_ticks_cl);
-	SET_TIMEOUT(hard_stop_ticks_ss);
-	SET_TIMEOUT(hard_stop_ticks_cl);
-	SET_TIMEOUT(hard_stop_ticks_dumping);
-	SET_TIMEOUT(gpu_reset_ticks_ss);
-	SET_TIMEOUT(gpu_reset_ticks_cl);
-	SET_TIMEOUT(gpu_reset_ticks_dumping);
-
-#undef SET_TIMEOUT
-
-	js_data->scheduling_period_ns = new_scheduling_period_ns;
-
-	kbase_js_set_timeouts(kbdev);
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-	mutex_unlock(&js_data->runpool_mutex);
-
-	dev_dbg(kbdev->dev, "JS scheduling period: %dms\n",
-			js_scheduling_period);
-
-	return count;
-}
-
-/**
- * show_js_scheduling_period - Show callback for the js_scheduling_period sysfs
- *                             entry.
- * @dev:  The device this sysfs file is for.
- * @attr: The attributes of the sysfs file.
- * @buf:  The output buffer to receive the GPU information.
- *
- * This function is called to get the current period used for the JS scheduling
- * period.
- *
- * Return: The number of bytes output to @buf.
- */
-static ssize_t show_js_scheduling_period(struct device *dev,
-		struct device_attribute *attr, char * const buf)
-{
-	struct kbase_device *kbdev;
-	u32 period;
-	ssize_t ret;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	period = kbdev->js_data.scheduling_period_ns;
-
-	ret = scnprintf(buf, PAGE_SIZE, "%d\n",
-			period / 1000000);
-
-	return ret;
-}
-
-static DEVICE_ATTR(js_scheduling_period, S_IRUGO | S_IWUSR,
-		show_js_scheduling_period, set_js_scheduling_period);
-
-#if !MALI_CUSTOMER_RELEASE
-/**
- * set_force_replay - Store callback for the force_replay sysfs file.
- *
- * @dev:	The device with sysfs file is for
- * @attr:	The attributes of the sysfs file
- * @buf:	The value written to the sysfs file
- * @count:	The number of bytes written to the sysfs file
- *
- * Return: @count if the function succeeded. An error code on failure.
- */
-static ssize_t set_force_replay(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct kbase_device *kbdev;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	if (!strncmp("limit=", buf, MIN(6, count))) {
-		int force_replay_limit;
-		int items = sscanf(buf, "limit=%u", &force_replay_limit);
-
-		if (items == 1) {
-			kbdev->force_replay_random = false;
-			kbdev->force_replay_limit = force_replay_limit;
-			kbdev->force_replay_count = 0;
-
-			return count;
-		}
-	} else if (!strncmp("random_limit", buf, MIN(12, count))) {
-		kbdev->force_replay_random = true;
-		kbdev->force_replay_count = 0;
-
-		return count;
-	} else if (!strncmp("norandom_limit", buf, MIN(14, count))) {
-		kbdev->force_replay_random = false;
-		kbdev->force_replay_limit = KBASEP_FORCE_REPLAY_DISABLED;
-		kbdev->force_replay_count = 0;
-
-		return count;
-	} else if (!strncmp("core_req=", buf, MIN(9, count))) {
-		unsigned int core_req;
-		int items = sscanf(buf, "core_req=%x", &core_req);
-
-		if (items == 1) {
-			kbdev->force_replay_core_req = (base_jd_core_req)core_req;
-
-			return count;
-		}
-	}
-	dev_err(kbdev->dev, "Couldn't process force_replay write operation.\nPossible settings: limit=<limit>, random_limit, norandom_limit, core_req=<core_req>\n");
-	return -EINVAL;
-}
-
-/**
- * show_force_replay - Show callback for the force_replay sysfs file.
- *
- * This function is called to get the contents of the force_replay sysfs
- * file. It returns the last set value written to the force_replay sysfs file.
- * If the file didn't get written yet, the values will be 0.
- *
- * @dev:	The device this sysfs file is for
- * @attr:	The attributes of the sysfs file
- * @buf:	The output buffer for the sysfs file contents
- *
- * Return: The number of bytes output to @buf.
- */
-static ssize_t show_force_replay(struct device *dev,
-		struct device_attribute *attr, char * const buf)
-{
-	struct kbase_device *kbdev;
-	ssize_t ret;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	if (kbdev->force_replay_random)
-		ret = scnprintf(buf, PAGE_SIZE,
-				"limit=0\nrandom_limit\ncore_req=%x\n",
-				kbdev->force_replay_core_req);
-	else
-		ret = scnprintf(buf, PAGE_SIZE,
-				"limit=%u\nnorandom_limit\ncore_req=%x\n",
-				kbdev->force_replay_limit,
-				kbdev->force_replay_core_req);
-
-	if (ret >= PAGE_SIZE) {
-		buf[PAGE_SIZE - 2] = '\n';
-		buf[PAGE_SIZE - 1] = '\0';
-		ret = PAGE_SIZE - 1;
-	}
-
-	return ret;
-}
-
-/*
- * The sysfs file force_replay.
- */
-static DEVICE_ATTR(force_replay, S_IRUGO | S_IWUSR, show_force_replay,
-		set_force_replay);
-#endif /* !MALI_CUSTOMER_RELEASE */
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-static ssize_t set_js_softstop_always(struct device *dev,
-		struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct kbase_device *kbdev;
-	int ret;
-	int softstop_always;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	ret = kstrtoint(buf, 0, &softstop_always);
-	if (ret || ((softstop_always != 0) && (softstop_always != 1))) {
-		dev_err(kbdev->dev, "Couldn't process js_softstop_always write operation.\n"
-				"Use format <soft_stop_always>\n");
-		return -EINVAL;
-	}
-
-	kbdev->js_data.softstop_always = (bool) softstop_always;
-	dev_dbg(kbdev->dev, "Support for softstop on a single context: %s\n",
-			(kbdev->js_data.softstop_always) ?
-			"Enabled" : "Disabled");
-	return count;
-}
-
-static ssize_t show_js_softstop_always(struct device *dev,
-		struct device_attribute *attr, char * const buf)
-{
-	struct kbase_device *kbdev;
-	ssize_t ret;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	ret = scnprintf(buf, PAGE_SIZE, "%d\n", kbdev->js_data.softstop_always);
-
-	if (ret >= PAGE_SIZE) {
-		buf[PAGE_SIZE - 2] = '\n';
-		buf[PAGE_SIZE - 1] = '\0';
-		ret = PAGE_SIZE - 1;
-	}
-
-	return ret;
-}
-
-/*
- * By default, soft-stops are disabled when only a single context is present.
- * The ability to enable soft-stop when only a single context is present can be
- * used for debug and unit-testing purposes.
- * (see CL t6xx_stress_1 unit-test as an example whereby this feature is used.)
- */
-static DEVICE_ATTR(js_softstop_always, S_IRUGO | S_IWUSR, show_js_softstop_always, set_js_softstop_always);
-#endif /* CONFIG_MALI_BIFROST_DEBUG */
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-typedef void (kbasep_debug_command_func) (struct kbase_device *);
-
-enum kbasep_debug_command_code {
-	KBASEP_DEBUG_COMMAND_DUMPTRACE,
-
-	/* This must be the last enum */
-	KBASEP_DEBUG_COMMAND_COUNT
-};
-
-struct kbasep_debug_command {
-	char *str;
-	kbasep_debug_command_func *func;
-};
-
-/* Debug commands supported by the driver */
-static const struct kbasep_debug_command debug_commands[] = {
-	{
-	 .str = "dumptrace",
-	 .func = &kbasep_trace_dump,
-	 }
-};
-
-/**
- * show_debug - Show callback for the debug_command sysfs file.
- *
- * This function is called to get the contents of the debug_command sysfs
- * file. This is a list of the available debug commands, separated by newlines.
- *
- * @dev:	The device this sysfs file is for
- * @attr:	The attributes of the sysfs file
- * @buf:	The output buffer for the sysfs file contents
- *
- * Return: The number of bytes output to @buf.
- */
-static ssize_t show_debug(struct device *dev, struct device_attribute *attr, char * const buf)
-{
-	struct kbase_device *kbdev;
-	int i;
-	ssize_t ret = 0;
-
-	kbdev = to_kbase_device(dev);
-
-	if (!kbdev)
-		return -ENODEV;
-
-	for (i = 0; i < KBASEP_DEBUG_COMMAND_COUNT && ret < PAGE_SIZE; i++)
-		ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%s\n", debug_commands[i].str);
-
-	if (ret >= PAGE_SIZE) {
-		buf[PAGE_SIZE - 2] = '\n';
-		buf[PAGE_SIZE - 1] = '\0';
-		ret = PAGE_SIZE - 1;
-	}
-
-	return ret;
-}
-
-/**
- * issue_debug - Store callback for the debug_command sysfs file.
- *
- * This function is called when the debug_command sysfs file is written to.
- * It matches the requested command against the available commands, and if
- * a matching command is found calls the associated function from
- * @debug_commands to issue the command.
- *
- * @dev:	The device with sysfs file is for
- * @attr:	The attributes of the sysfs file
- * @buf:	The value written to the sysfs file
- * @count:	The number of bytes written to the sysfs file
- *
- * Return: @count if the function succeeded. An error code on failure.
- */
-static ssize_t issue_debug(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct kbase_device *kbdev;
-	int i;
-
-	kbdev = to_kbase_device(dev);
-
-	if (!kbdev)
-		return -ENODEV;
-
-	for (i = 0; i < KBASEP_DEBUG_COMMAND_COUNT; i++) {
-		if (sysfs_streq(debug_commands[i].str, buf)) {
-			debug_commands[i].func(kbdev);
-			return count;
-		}
-	}
-
-	/* Debug Command not found */
-	dev_err(dev, "debug_command: command not known\n");
-	return -EINVAL;
-}
-
-/* The sysfs file debug_command.
- *
- * This is used to issue general debug commands to the device driver.
- * Reading it will produce a list of debug commands, separated by newlines.
- * Writing to it with one of those commands will issue said command.
- */
-static DEVICE_ATTR(debug_command, S_IRUGO | S_IWUSR, show_debug, issue_debug);
-#endif /* CONFIG_MALI_BIFROST_DEBUG */
-
-/**
- * kbase_show_gpuinfo - Show callback for the gpuinfo sysfs entry.
- * @dev: The device this sysfs file is for.
- * @attr: The attributes of the sysfs file.
- * @buf: The output buffer to receive the GPU information.
- *
- * This function is called to get a description of the present Mali
- * GPU via the gpuinfo sysfs entry.  This includes the GPU family, the
- * number of cores, the hardware version and the raw product id.  For
- * example
- *
- *    Mali-T60x MP4 r0p0 0x6956
- *
- * Return: The number of bytes output to @buf.
- */
-static ssize_t kbase_show_gpuinfo(struct device *dev,
-				  struct device_attribute *attr, char *buf)
-{
-	static const struct gpu_product_id_name {
-		unsigned id;
-		char *name;
-	} gpu_product_id_names[] = {
-		{ .id = GPU_ID_PI_T60X, .name = "Mali-T60x" },
-		{ .id = GPU_ID_PI_T62X, .name = "Mali-T62x" },
-		{ .id = GPU_ID_PI_T72X, .name = "Mali-T72x" },
-		{ .id = GPU_ID_PI_T76X, .name = "Mali-T76x" },
-		{ .id = GPU_ID_PI_T82X, .name = "Mali-T82x" },
-		{ .id = GPU_ID_PI_T83X, .name = "Mali-T83x" },
-		{ .id = GPU_ID_PI_T86X, .name = "Mali-T86x" },
-		{ .id = GPU_ID_PI_TFRX, .name = "Mali-T88x" },
-		{ .id = GPU_ID2_PRODUCT_TMIX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT,
-		  .name = "Mali-G71" },
-		{ .id = GPU_ID2_PRODUCT_THEX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT,
-		  .name = "Mali-G72" },
-		{ .id = GPU_ID2_PRODUCT_TSIX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT,
-		  .name = "Mali-G51" },
-		{ .id = GPU_ID2_PRODUCT_TDVX >> GPU_ID_VERSION_PRODUCT_ID_SHIFT,
-		  .name = "Mali-G31" },
-	};
-	const char *product_name = "(Unknown Mali GPU)";
-	struct kbase_device *kbdev;
-	u32 gpu_id;
-	unsigned product_id, product_id_mask;
-	unsigned i;
-	bool is_new_format;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	gpu_id = kbdev->gpu_props.props.raw_props.gpu_id;
-	product_id = gpu_id >> GPU_ID_VERSION_PRODUCT_ID_SHIFT;
-	is_new_format = GPU_ID_IS_NEW_FORMAT(product_id);
-	product_id_mask =
-		(is_new_format ?
-			GPU_ID2_PRODUCT_MODEL :
-			GPU_ID_VERSION_PRODUCT_ID) >>
-		GPU_ID_VERSION_PRODUCT_ID_SHIFT;
-
-	for (i = 0; i < ARRAY_SIZE(gpu_product_id_names); ++i) {
-		const struct gpu_product_id_name *p = &gpu_product_id_names[i];
-
-		if ((GPU_ID_IS_NEW_FORMAT(p->id) == is_new_format) &&
-		    (p->id & product_id_mask) ==
-		    (product_id & product_id_mask)) {
-			product_name = p->name;
-			break;
-		}
-	}
-
-	return scnprintf(buf, PAGE_SIZE, "%s %d cores 2EE r%dp%d 0x%04X\n",
-		product_name, kbdev->gpu_props.num_cores,
-		(gpu_id & GPU_ID_VERSION_MAJOR) >> GPU_ID_VERSION_MAJOR_SHIFT,
-		(gpu_id & GPU_ID_VERSION_MINOR) >> GPU_ID_VERSION_MINOR_SHIFT,
-		product_id);
-}
-static DEVICE_ATTR(gpuinfo, S_IRUGO, kbase_show_gpuinfo, NULL);
-
-/**
- * set_dvfs_period - Store callback for the dvfs_period sysfs file.
- * @dev:   The device with sysfs file is for
- * @attr:  The attributes of the sysfs file
- * @buf:   The value written to the sysfs file
- * @count: The number of bytes written to the sysfs file
- *
- * This function is called when the dvfs_period sysfs file is written to. It
- * checks the data written, and if valid updates the DVFS period variable,
- *
- * Return: @count if the function succeeded. An error code on failure.
- */
-static ssize_t set_dvfs_period(struct device *dev,
-		struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct kbase_device *kbdev;
-	int ret;
-	int dvfs_period;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	ret = kstrtoint(buf, 0, &dvfs_period);
-	if (ret || dvfs_period <= 0) {
-		dev_err(kbdev->dev, "Couldn't process dvfs_period write operation.\n"
-				"Use format <dvfs_period_ms>\n");
-		return -EINVAL;
-	}
-
-	kbdev->pm.dvfs_period = dvfs_period;
-	dev_dbg(kbdev->dev, "DVFS period: %dms\n", dvfs_period);
-
-	return count;
-}
-
-/**
- * show_dvfs_period - Show callback for the dvfs_period sysfs entry.
- * @dev:  The device this sysfs file is for.
- * @attr: The attributes of the sysfs file.
- * @buf:  The output buffer to receive the GPU information.
- *
- * This function is called to get the current period used for the DVFS sample
- * timer.
- *
- * Return: The number of bytes output to @buf.
- */
-static ssize_t show_dvfs_period(struct device *dev,
-		struct device_attribute *attr, char * const buf)
-{
-	struct kbase_device *kbdev;
-	ssize_t ret;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	ret = scnprintf(buf, PAGE_SIZE, "%d\n", kbdev->pm.dvfs_period);
-
-	return ret;
-}
-
-static DEVICE_ATTR(dvfs_period, S_IRUGO | S_IWUSR, show_dvfs_period,
-		set_dvfs_period);
-
-/**
- * set_pm_poweroff - Store callback for the pm_poweroff sysfs file.
- * @dev:   The device with sysfs file is for
- * @attr:  The attributes of the sysfs file
- * @buf:   The value written to the sysfs file
- * @count: The number of bytes written to the sysfs file
- *
- * This function is called when the pm_poweroff sysfs file is written to.
- *
- * This file contains three values separated by whitespace. The values
- * are gpu_poweroff_time (the period of the poweroff timer, in ns),
- * poweroff_shader_ticks (the number of poweroff timer ticks before an idle
- * shader is powered off), and poweroff_gpu_ticks (the number of poweroff timer
- * ticks before the GPU is powered off), in that order.
- *
- * Return: @count if the function succeeded. An error code on failure.
- */
-static ssize_t set_pm_poweroff(struct device *dev,
-		struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct kbase_device *kbdev;
-	int items;
-	s64 gpu_poweroff_time;
-	int poweroff_shader_ticks, poweroff_gpu_ticks;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	items = sscanf(buf, "%llu %u %u", &gpu_poweroff_time,
-			&poweroff_shader_ticks,
-			&poweroff_gpu_ticks);
-	if (items != 3) {
-		dev_err(kbdev->dev, "Couldn't process pm_poweroff write operation.\n"
-				"Use format <gpu_poweroff_time_ns> <poweroff_shader_ticks> <poweroff_gpu_ticks>\n");
-		return -EINVAL;
-	}
-
-	kbdev->pm.gpu_poweroff_time = HR_TIMER_DELAY_NSEC(gpu_poweroff_time);
-	kbdev->pm.poweroff_shader_ticks = poweroff_shader_ticks;
-	kbdev->pm.poweroff_gpu_ticks = poweroff_gpu_ticks;
-
-	return count;
-}
-
-/**
- * show_pm_poweroff - Show callback for the pm_poweroff sysfs entry.
- * @dev:  The device this sysfs file is for.
- * @attr: The attributes of the sysfs file.
- * @buf:  The output buffer to receive the GPU information.
- *
- * This function is called to get the current period used for the DVFS sample
- * timer.
- *
- * Return: The number of bytes output to @buf.
- */
-static ssize_t show_pm_poweroff(struct device *dev,
-		struct device_attribute *attr, char * const buf)
-{
-	struct kbase_device *kbdev;
-	ssize_t ret;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	ret = scnprintf(buf, PAGE_SIZE, "%llu %u %u\n",
-			ktime_to_ns(kbdev->pm.gpu_poweroff_time),
-			kbdev->pm.poweroff_shader_ticks,
-			kbdev->pm.poweroff_gpu_ticks);
-
-	return ret;
-}
-
-static DEVICE_ATTR(pm_poweroff, S_IRUGO | S_IWUSR, show_pm_poweroff,
-		set_pm_poweroff);
-
-/**
- * set_reset_timeout - Store callback for the reset_timeout sysfs file.
- * @dev:   The device with sysfs file is for
- * @attr:  The attributes of the sysfs file
- * @buf:   The value written to the sysfs file
- * @count: The number of bytes written to the sysfs file
- *
- * This function is called when the reset_timeout sysfs file is written to. It
- * checks the data written, and if valid updates the reset timeout.
- *
- * Return: @count if the function succeeded. An error code on failure.
- */
-static ssize_t set_reset_timeout(struct device *dev,
-		struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct kbase_device *kbdev;
-	int ret;
-	int reset_timeout;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	ret = kstrtoint(buf, 0, &reset_timeout);
-	if (ret || reset_timeout <= 0) {
-		dev_err(kbdev->dev, "Couldn't process reset_timeout write operation.\n"
-				"Use format <reset_timeout_ms>\n");
-		return -EINVAL;
-	}
-
-	kbdev->reset_timeout_ms = reset_timeout;
-	dev_dbg(kbdev->dev, "Reset timeout: %dms\n", reset_timeout);
-
-	return count;
-}
-
-/**
- * show_reset_timeout - Show callback for the reset_timeout sysfs entry.
- * @dev:  The device this sysfs file is for.
- * @attr: The attributes of the sysfs file.
- * @buf:  The output buffer to receive the GPU information.
- *
- * This function is called to get the current reset timeout.
- *
- * Return: The number of bytes output to @buf.
- */
-static ssize_t show_reset_timeout(struct device *dev,
-		struct device_attribute *attr, char * const buf)
-{
-	struct kbase_device *kbdev;
-	ssize_t ret;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	ret = scnprintf(buf, PAGE_SIZE, "%d\n", kbdev->reset_timeout_ms);
-
-	return ret;
-}
-
-static DEVICE_ATTR(reset_timeout, S_IRUGO | S_IWUSR, show_reset_timeout,
-		set_reset_timeout);
-
-
-
-static ssize_t show_mem_pool_size(struct device *dev,
-		struct device_attribute *attr, char * const buf)
-{
-	struct kbase_device *kbdev;
-	ssize_t ret;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	ret = scnprintf(buf, PAGE_SIZE, "%zu\n",
-			kbase_mem_pool_size(&kbdev->mem_pool));
-
-	return ret;
-}
-
-static ssize_t set_mem_pool_size(struct device *dev,
-		struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct kbase_device *kbdev;
-	size_t new_size;
-	int err;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	err = kstrtoul(buf, 0, (unsigned long *)&new_size);
-	if (err)
-		return err;
-
-	kbase_mem_pool_trim(&kbdev->mem_pool, new_size);
-
-	return count;
-}
-
-static DEVICE_ATTR(mem_pool_size, S_IRUGO | S_IWUSR, show_mem_pool_size,
-		set_mem_pool_size);
-
-static ssize_t show_mem_pool_max_size(struct device *dev,
-		struct device_attribute *attr, char * const buf)
-{
-	struct kbase_device *kbdev;
-	ssize_t ret;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	ret = scnprintf(buf, PAGE_SIZE, "%zu\n",
-			kbase_mem_pool_max_size(&kbdev->mem_pool));
-
-	return ret;
-}
-
-static ssize_t set_mem_pool_max_size(struct device *dev,
-		struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct kbase_device *kbdev;
-	size_t new_max_size;
-	int err;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	err = kstrtoul(buf, 0, (unsigned long *)&new_max_size);
-	if (err)
-		return -EINVAL;
-
-	kbase_mem_pool_set_max_size(&kbdev->mem_pool, new_max_size);
-
-	return count;
-}
-
-static DEVICE_ATTR(mem_pool_max_size, S_IRUGO | S_IWUSR, show_mem_pool_max_size,
-		set_mem_pool_max_size);
-
-/**
- * show_lp_mem_pool_size - Show size of the large memory pages pool.
- * @dev:  The device this sysfs file is for.
- * @attr: The attributes of the sysfs file.
- * @buf:  The output buffer to receive the pool size.
- *
- * This function is called to get the number of large memory pages which currently populate the kbdev pool.
- *
- * Return: The number of bytes output to @buf.
- */
-static ssize_t show_lp_mem_pool_size(struct device *dev,
-		struct device_attribute *attr, char * const buf)
-{
-	struct kbase_device *kbdev;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	return scnprintf(buf, PAGE_SIZE, "%zu\n", kbase_mem_pool_size(&kbdev->lp_mem_pool));
-}
-
-/**
- * set_lp_mem_pool_size - Set size of the large memory pages pool.
- * @dev:   The device this sysfs file is for.
- * @attr:  The attributes of the sysfs file.
- * @buf:   The value written to the sysfs file.
- * @count: The number of bytes written to the sysfs file.
- *
- * This function is called to set the number of large memory pages which should populate the kbdev pool.
- * This may cause existing pages to be removed from the pool, or new pages to be created and then added to the pool.
- *
- * Return: @count if the function succeeded. An error code on failure.
- */
-static ssize_t set_lp_mem_pool_size(struct device *dev,
-		struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct kbase_device *kbdev;
-	unsigned long new_size;
-	int err;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	err = kstrtoul(buf, 0, &new_size);
-	if (err)
-		return err;
-
-	kbase_mem_pool_trim(&kbdev->lp_mem_pool, new_size);
-
-	return count;
-}
-
-static DEVICE_ATTR(lp_mem_pool_size, S_IRUGO | S_IWUSR, show_lp_mem_pool_size,
-		set_lp_mem_pool_size);
-
-/**
- * show_lp_mem_pool_max_size - Show maximum size of the large memory pages pool.
- * @dev:  The device this sysfs file is for.
- * @attr: The attributes of the sysfs file.
- * @buf:  The output buffer to receive the pool size.
- *
- * This function is called to get the maximum number of large memory pages that the kbdev pool can possibly contain.
- *
- * Return: The number of bytes output to @buf.
- */
-static ssize_t show_lp_mem_pool_max_size(struct device *dev,
-		struct device_attribute *attr, char * const buf)
-{
-	struct kbase_device *kbdev;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	return scnprintf(buf, PAGE_SIZE, "%zu\n", kbase_mem_pool_max_size(&kbdev->lp_mem_pool));
-}
-
-/**
- * set_lp_mem_pool_max_size - Set maximum size of the large memory pages pool.
- * @dev:   The device this sysfs file is for.
- * @attr:  The attributes of the sysfs file.
- * @buf:   The value written to the sysfs file.
- * @count: The number of bytes written to the sysfs file.
- *
- * This function is called to set the maximum number of large memory pages that the kbdev pool can possibly contain.
- *
- * Return: @count if the function succeeded. An error code on failure.
- */
-static ssize_t set_lp_mem_pool_max_size(struct device *dev,
-		struct device_attribute *attr, const char *buf, size_t count)
-{
-	struct kbase_device *kbdev;
-	unsigned long new_max_size;
-	int err;
-
-	kbdev = to_kbase_device(dev);
-	if (!kbdev)
-		return -ENODEV;
-
-	err = kstrtoul(buf, 0, &new_max_size);
-	if (err)
-		return -EINVAL;
-
-	kbase_mem_pool_set_max_size(&kbdev->lp_mem_pool, new_max_size);
-
-	return count;
-}
-
-static DEVICE_ATTR(lp_mem_pool_max_size, S_IRUGO | S_IWUSR, show_lp_mem_pool_max_size,
-		set_lp_mem_pool_max_size);
-
-#ifdef CONFIG_DEBUG_FS
-
-/* Number of entries in serialize_jobs_settings[] */
-#define NR_SERIALIZE_JOBS_SETTINGS 5
-/* Maximum string length in serialize_jobs_settings[].name */
-#define MAX_SERIALIZE_JOBS_NAME_LEN 16
-
-static struct
-{
-	char *name;
-	u8 setting;
-} serialize_jobs_settings[NR_SERIALIZE_JOBS_SETTINGS] = {
-	{"none", 0},
-	{"intra-slot", KBASE_SERIALIZE_INTRA_SLOT},
-	{"inter-slot", KBASE_SERIALIZE_INTER_SLOT},
-	{"full", KBASE_SERIALIZE_INTRA_SLOT | KBASE_SERIALIZE_INTER_SLOT},
-	{"full-reset", KBASE_SERIALIZE_INTRA_SLOT | KBASE_SERIALIZE_INTER_SLOT |
-			KBASE_SERIALIZE_RESET}
-};
-
-/**
- * kbasep_serialize_jobs_seq_show - Show callback for the serialize_jobs debugfs
- *                                  file
- * @sfile: seq_file pointer
- * @data:  Private callback data
- *
- * This function is called to get the contents of the serialize_jobs debugfs
- * file. This is a list of the available settings with the currently active one
- * surrounded by square brackets.
- *
- * Return: 0 on success, or an error code on error
- */
-static int kbasep_serialize_jobs_seq_show(struct seq_file *sfile, void *data)
-{
-	struct kbase_device *kbdev = sfile->private;
-	int i;
-
-	CSTD_UNUSED(data);
-
-	for (i = 0; i < NR_SERIALIZE_JOBS_SETTINGS; i++) {
-		if (kbdev->serialize_jobs == serialize_jobs_settings[i].setting)
-			seq_printf(sfile, "[%s] ",
-					serialize_jobs_settings[i].name);
-		else
-			seq_printf(sfile, "%s ",
-					serialize_jobs_settings[i].name);
-	}
-
-	seq_puts(sfile, "\n");
-
-	return 0;
-}
-
-/**
- * kbasep_serialize_jobs_debugfs_write - Store callback for the serialize_jobs
- *                                       debugfs file.
- * @file:  File pointer
- * @ubuf:  User buffer containing data to store
- * @count: Number of bytes in user buffer
- * @ppos:  File position
- *
- * This function is called when the serialize_jobs debugfs file is written to.
- * It matches the requested setting against the available settings and if a
- * matching setting is found updates kbdev->serialize_jobs.
- *
- * Return: @count if the function succeeded. An error code on failure.
- */
-static ssize_t kbasep_serialize_jobs_debugfs_write(struct file *file,
-		const char __user *ubuf, size_t count, loff_t *ppos)
-{
-	struct seq_file *s = file->private_data;
-	struct kbase_device *kbdev = s->private;
-	char buf[MAX_SERIALIZE_JOBS_NAME_LEN];
-	int i;
-	bool valid = false;
-
-	CSTD_UNUSED(ppos);
-
-	count = min_t(size_t, sizeof(buf) - 1, count);
-	if (copy_from_user(buf, ubuf, count))
-		return -EFAULT;
-
-	buf[count] = 0;
-
-	for (i = 0; i < NR_SERIALIZE_JOBS_SETTINGS; i++) {
-		if (sysfs_streq(serialize_jobs_settings[i].name, buf)) {
-			kbdev->serialize_jobs =
-					serialize_jobs_settings[i].setting;
-			valid = true;
-			break;
-		}
-	}
-
-	if (!valid) {
-		dev_err(kbdev->dev, "serialize_jobs: invalid setting\n");
-		return -EINVAL;
-	}
-
-	return count;
-}
-
-/**
- * kbasep_serialize_jobs_debugfs_open - Open callback for the serialize_jobs
- *                                     debugfs file
- * @in:   inode pointer
- * @file: file pointer
- *
- * Return: Zero on success, error code on failure
- */
-static int kbasep_serialize_jobs_debugfs_open(struct inode *in,
-		struct file *file)
-{
-	return single_open(file, kbasep_serialize_jobs_seq_show, in->i_private);
-}
-
-static const struct file_operations kbasep_serialize_jobs_debugfs_fops = {
-	.open = kbasep_serialize_jobs_debugfs_open,
-	.read = seq_read,
-	.write = kbasep_serialize_jobs_debugfs_write,
-	.llseek = seq_lseek,
-	.release = single_release,
-};
-
-#endif /* CONFIG_DEBUG_FS */
-
-static int kbasep_protected_mode_init(struct kbase_device *kbdev)
-{
-#ifdef CONFIG_OF
-	struct device_node *protected_node;
-	struct platform_device *pdev;
-	struct protected_mode_device *protected_dev;
-#endif
-
-	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_PROTECTED_MODE)) {
-		/* Use native protected ops */
-		kbdev->protected_dev = kzalloc(sizeof(*kbdev->protected_dev),
-				GFP_KERNEL);
-		if (!kbdev->protected_dev)
-			return -ENOMEM;
-		kbdev->protected_dev->data = kbdev;
-		kbdev->protected_ops = &kbase_native_protected_ops;
-		kbdev->protected_mode_support = true;
-		return 0;
-	}
-
-	kbdev->protected_mode_support = false;
-
-#ifdef CONFIG_OF
-	protected_node = of_parse_phandle(kbdev->dev->of_node,
-			"protected-mode-switcher", 0);
-
-	if (!protected_node)
-		protected_node = of_parse_phandle(kbdev->dev->of_node,
-				"secure-mode-switcher", 0);
-
-	if (!protected_node) {
-		/* If protected_node cannot be looked up then we assume
-		 * protected mode is not supported on this platform. */
-		dev_info(kbdev->dev, "Protected mode not available\n");
-		return 0;
-	}
-
-	pdev = of_find_device_by_node(protected_node);
-	if (!pdev)
-		return -EINVAL;
-
-	protected_dev = platform_get_drvdata(pdev);
-	if (!protected_dev)
-		return -EPROBE_DEFER;
-
-	kbdev->protected_ops = &protected_dev->ops;
-	kbdev->protected_dev = protected_dev;
-
-	if (kbdev->protected_ops) {
-		int err;
-
-		/* Make sure protected mode is disabled on startup */
-		mutex_lock(&kbdev->pm.lock);
-		err = kbdev->protected_ops->protected_mode_disable(
-				kbdev->protected_dev);
-		mutex_unlock(&kbdev->pm.lock);
-
-		/* protected_mode_disable() returns -EINVAL if not supported */
-		kbdev->protected_mode_support = (err != -EINVAL);
-	}
-#endif
-	return 0;
-}
-
-static void kbasep_protected_mode_term(struct kbase_device *kbdev)
-{
-	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_PROTECTED_MODE))
-		kfree(kbdev->protected_dev);
-}
-
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-static int kbase_common_reg_map(struct kbase_device *kbdev)
-{
-	return 0;
-}
-static void kbase_common_reg_unmap(struct kbase_device * const kbdev)
-{
-}
-#else /* CONFIG_MALI_BIFROST_NO_MALI */
-static int kbase_common_reg_map(struct kbase_device *kbdev)
-{
-	int err = 0;
-
-	if (!request_mem_region(kbdev->reg_start, kbdev->reg_size, dev_name(kbdev->dev))) {
-		dev_err(kbdev->dev, "Register window unavailable\n");
-		err = -EIO;
-		goto out_region;
-	}
-
-	kbdev->reg = ioremap(kbdev->reg_start, kbdev->reg_size);
-	if (!kbdev->reg) {
-		dev_err(kbdev->dev, "Can't remap register window\n");
-		err = -EINVAL;
-		goto out_ioremap;
-	}
-
-	return err;
-
- out_ioremap:
-	release_mem_region(kbdev->reg_start, kbdev->reg_size);
- out_region:
-	return err;
-}
-
-static void kbase_common_reg_unmap(struct kbase_device * const kbdev)
-{
-	if (kbdev->reg) {
-		iounmap(kbdev->reg);
-		release_mem_region(kbdev->reg_start, kbdev->reg_size);
-		kbdev->reg = NULL;
-		kbdev->reg_start = 0;
-		kbdev->reg_size = 0;
-	}
-}
-#endif /* CONFIG_MALI_BIFROST_NO_MALI */
-
-static int registers_map(struct kbase_device * const kbdev)
-{
-
-		/* the first memory resource is the physical address of the GPU
-		 * registers */
-		struct platform_device *pdev = to_platform_device(kbdev->dev);
-		struct resource *reg_res;
-		int err;
-
-		reg_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-		if (!reg_res) {
-			dev_err(kbdev->dev, "Invalid register resource\n");
-			return -ENOENT;
-		}
-
-		kbdev->reg_start = reg_res->start;
-		kbdev->reg_size = resource_size(reg_res);
-
-		err = kbase_common_reg_map(kbdev);
-		if (err) {
-			dev_err(kbdev->dev, "Failed to map registers\n");
-			return err;
-		}
-
-	return 0;
-}
-
-static void registers_unmap(struct kbase_device *kbdev)
-{
-	kbase_common_reg_unmap(kbdev);
-}
-
-static int power_control_init(struct platform_device *pdev)
-{
-	struct kbase_device *kbdev = to_kbase_device(&pdev->dev);
-	int err = 0;
-
-	if (!kbdev)
-		return -ENODEV;
-
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)) && defined(CONFIG_OF) \
-			&& defined(CONFIG_REGULATOR)
-	kbdev->regulator = regulator_get_optional(kbdev->dev, "mali");
-	if (IS_ERR_OR_NULL(kbdev->regulator)) {
-		err = PTR_ERR(kbdev->regulator);
-		kbdev->regulator = NULL;
-		if (err == -EPROBE_DEFER) {
-			dev_err(&pdev->dev, "Failed to get regulator\n");
-			return err;
-		}
-		dev_info(kbdev->dev,
-			"Continuing without Mali regulator control\n");
-		/* Allow probe to continue without regulator */
-	}
-#endif /* LINUX_VERSION_CODE >= 3, 12, 0 */
-
-	kbdev->clock = clk_get(kbdev->dev, "clk_mali");
-	if (IS_ERR_OR_NULL(kbdev->clock)) {
-		err = PTR_ERR(kbdev->clock);
-		kbdev->clock = NULL;
-		if (err == -EPROBE_DEFER) {
-			dev_err(&pdev->dev, "Failed to get clock\n");
-			goto fail;
-		}
-		dev_info(kbdev->dev, "Continuing without Mali clock control\n");
-		/* Allow probe to continue without clock. */
-	} else {
-		err = clk_prepare(kbdev->clock);
-		if (err) {
-			dev_err(kbdev->dev,
-				"Failed to prepare and enable clock (%d)\n",
-				err);
-			goto fail;
-		}
-	}
-
-	err = kbase_platform_rk_init_opp_table(kbdev);
-	if (err)
-		dev_err(kbdev->dev, "Failed to init_opp_table (%d)\n", err);
-
-	return 0;
-
-fail:
-
-if (kbdev->clock != NULL) {
-	clk_put(kbdev->clock);
-	kbdev->clock = NULL;
-}
-
-#ifdef CONFIG_REGULATOR
-	if (NULL != kbdev->regulator) {
-		regulator_put(kbdev->regulator);
-		kbdev->regulator = NULL;
-	}
-#endif
-
-	return err;
-}
-
-static void power_control_term(struct kbase_device *kbdev)
-{
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0)) || \
-		defined(LSK_OPPV2_BACKPORT)
-	dev_pm_opp_of_remove_table(kbdev->dev);
-#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0))
-	of_free_opp_table(kbdev->dev);
-#endif
-
-	if (kbdev->clock) {
-		clk_unprepare(kbdev->clock);
-		clk_put(kbdev->clock);
-		kbdev->clock = NULL;
-	}
-
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)) && defined(CONFIG_OF) \
-			&& defined(CONFIG_REGULATOR)
-	if (kbdev->regulator) {
-		regulator_put(kbdev->regulator);
-		kbdev->regulator = NULL;
-	}
-#endif /* LINUX_VERSION_CODE >= 3, 12, 0 */
-}
-
-#ifdef CONFIG_DEBUG_FS
-
-#if KBASE_GPU_RESET_EN
-#include <mali_kbase_hwaccess_jm.h>
-
-static void trigger_quirks_reload(struct kbase_device *kbdev)
-{
-	kbase_pm_context_active(kbdev);
-	if (kbase_prepare_to_reset_gpu(kbdev))
-		kbase_reset_gpu(kbdev);
-	kbase_pm_context_idle(kbdev);
-}
-
-#define MAKE_QUIRK_ACCESSORS(type) \
-static int type##_quirks_set(void *data, u64 val) \
-{ \
-	struct kbase_device *kbdev; \
-	kbdev = (struct kbase_device *)data; \
-	kbdev->hw_quirks_##type = (u32)val; \
-	trigger_quirks_reload(kbdev); \
-	return 0;\
-} \
-\
-static int type##_quirks_get(void *data, u64 *val) \
-{ \
-	struct kbase_device *kbdev;\
-	kbdev = (struct kbase_device *)data;\
-	*val = kbdev->hw_quirks_##type;\
-	return 0;\
-} \
-DEFINE_SIMPLE_ATTRIBUTE(fops_##type##_quirks, type##_quirks_get,\
-		type##_quirks_set, "%llu\n")
-
-MAKE_QUIRK_ACCESSORS(sc);
-MAKE_QUIRK_ACCESSORS(tiler);
-MAKE_QUIRK_ACCESSORS(mmu);
-MAKE_QUIRK_ACCESSORS(jm);
-
-#endif /* KBASE_GPU_RESET_EN */
-
-/**
- * debugfs_protected_debug_mode_read - "protected_debug_mode" debugfs read
- * @file: File object to read is for
- * @buf:  User buffer to populate with data
- * @len:  Length of user buffer
- * @ppos: Offset within file object
- *
- * Retrieves the current status of protected debug mode
- * (0 = disabled, 1 = enabled)
- *
- * Return: Number of bytes added to user buffer
- */
-static ssize_t debugfs_protected_debug_mode_read(struct file *file,
-				char __user *buf, size_t len, loff_t *ppos)
-{
-	struct kbase_device *kbdev = (struct kbase_device *)file->private_data;
-	u32 gpu_status;
-	ssize_t ret_val;
-
-	kbase_pm_context_active(kbdev);
-	gpu_status = kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_STATUS), NULL);
-	kbase_pm_context_idle(kbdev);
-
-	if (gpu_status & GPU_DBGEN)
-		ret_val = simple_read_from_buffer(buf, len, ppos, "1\n", 2);
-	else
-		ret_val = simple_read_from_buffer(buf, len, ppos, "0\n", 2);
-
-	return ret_val;
-}
-
-/*
- * struct fops_protected_debug_mode - "protected_debug_mode" debugfs fops
- *
- * Contains the file operations for the "protected_debug_mode" debugfs file
- */
-static const struct file_operations fops_protected_debug_mode = {
-	.open = simple_open,
-	.read = debugfs_protected_debug_mode_read,
-	.llseek = default_llseek,
-};
-
-static int kbase_device_debugfs_init(struct kbase_device *kbdev)
-{
-	struct dentry *debugfs_ctx_defaults_directory;
-	int err;
-
-	kbdev->mali_debugfs_directory = debugfs_create_dir(kbdev->devname,
-			NULL);
-	if (!kbdev->mali_debugfs_directory) {
-		dev_err(kbdev->dev, "Couldn't create mali debugfs directory\n");
-		err = -ENOMEM;
-		goto out;
-	}
-
-	kbdev->debugfs_ctx_directory = debugfs_create_dir("ctx",
-			kbdev->mali_debugfs_directory);
-	if (!kbdev->debugfs_ctx_directory) {
-		dev_err(kbdev->dev, "Couldn't create mali debugfs ctx directory\n");
-		err = -ENOMEM;
-		goto out;
-	}
-
-	debugfs_ctx_defaults_directory = debugfs_create_dir("defaults",
-			kbdev->debugfs_ctx_directory);
-	if (!debugfs_ctx_defaults_directory) {
-		dev_err(kbdev->dev, "Couldn't create mali debugfs ctx defaults directory\n");
-		err = -ENOMEM;
-		goto out;
-	}
-
-#if !MALI_CUSTOMER_RELEASE
-	kbasep_regs_dump_debugfs_init(kbdev);
-#endif /* !MALI_CUSTOMER_RELEASE */
-	kbasep_regs_history_debugfs_init(kbdev);
-
-	kbase_debug_job_fault_debugfs_init(kbdev);
-	kbasep_gpu_memory_debugfs_init(kbdev);
-	kbase_as_fault_debugfs_init(kbdev);
-#if KBASE_GPU_RESET_EN
-	/* fops_* variables created by invocations of macro
-	 * MAKE_QUIRK_ACCESSORS() above. */
-	debugfs_create_file("quirks_sc", 0644,
-			kbdev->mali_debugfs_directory, kbdev,
-			&fops_sc_quirks);
-	debugfs_create_file("quirks_tiler", 0644,
-			kbdev->mali_debugfs_directory, kbdev,
-			&fops_tiler_quirks);
-	debugfs_create_file("quirks_mmu", 0644,
-			kbdev->mali_debugfs_directory, kbdev,
-			&fops_mmu_quirks);
-	debugfs_create_file("quirks_jm", 0644,
-			kbdev->mali_debugfs_directory, kbdev,
-			&fops_jm_quirks);
-#endif /* KBASE_GPU_RESET_EN */
-
-	debugfs_create_bool("infinite_cache", 0644,
-			debugfs_ctx_defaults_directory,
-			&kbdev->infinite_cache_active_default);
-
-	debugfs_create_size_t("mem_pool_max_size", 0644,
-			debugfs_ctx_defaults_directory,
-			&kbdev->mem_pool_max_size_default);
-
-	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_PROTECTED_DEBUG_MODE)) {
-		debugfs_create_file("protected_debug_mode", S_IRUGO,
-				kbdev->mali_debugfs_directory, kbdev,
-				&fops_protected_debug_mode);
-	}
-
-#if KBASE_TRACE_ENABLE
-	kbasep_trace_debugfs_init(kbdev);
-#endif /* KBASE_TRACE_ENABLE */
-
-#ifdef CONFIG_MALI_BIFROST_TRACE_TIMELINE
-	kbasep_trace_timeline_debugfs_init(kbdev);
-#endif /* CONFIG_MALI_BIFROST_TRACE_TIMELINE */
-
-#ifdef CONFIG_MALI_BIFROST_DEVFREQ
-#ifdef CONFIG_DEVFREQ_THERMAL
-	if ((kbdev->inited_subsys & inited_devfreq) && !kbdev->model_data)
-		kbase_ipa_debugfs_init(kbdev);
-#endif /* CONFIG_DEVFREQ_THERMAL */
-#endif /* CONFIG_MALI_BIFROST_DEVFREQ */
-
-#ifdef CONFIG_DEBUG_FS
-	debugfs_create_file("serialize_jobs", S_IRUGO | S_IWUSR,
-			kbdev->mali_debugfs_directory, kbdev,
-			&kbasep_serialize_jobs_debugfs_fops);
-#endif /* CONFIG_DEBUG_FS */
-
-	return 0;
-
-out:
-	debugfs_remove_recursive(kbdev->mali_debugfs_directory);
-	return err;
-}
-
-static void kbase_device_debugfs_term(struct kbase_device *kbdev)
-{
-	debugfs_remove_recursive(kbdev->mali_debugfs_directory);
-}
-
-#else /* CONFIG_DEBUG_FS */
-static inline int kbase_device_debugfs_init(struct kbase_device *kbdev)
-{
-	return 0;
-}
-
-static inline void kbase_device_debugfs_term(struct kbase_device *kbdev) { }
-#endif /* CONFIG_DEBUG_FS */
-
-static void kbase_device_coherency_init(struct kbase_device *kbdev,
-		unsigned prod_id)
-{
-#ifdef CONFIG_OF
-	u32 supported_coherency_bitmap =
-		kbdev->gpu_props.props.raw_props.coherency_mode;
-	const void *coherency_override_dts;
-	u32 override_coherency;
-
-	/* Only for tMIx :
-	 * (COHERENCY_ACE_LITE | COHERENCY_ACE) was incorrectly
-	 * documented for tMIx so force correct value here.
-	 */
-	if (GPU_ID_IS_NEW_FORMAT(prod_id) &&
-		   (GPU_ID2_MODEL_MATCH_VALUE(prod_id) ==
-				   GPU_ID2_PRODUCT_TMIX))
-		if (supported_coherency_bitmap ==
-				COHERENCY_FEATURE_BIT(COHERENCY_ACE))
-			supported_coherency_bitmap |=
-				COHERENCY_FEATURE_BIT(COHERENCY_ACE_LITE);
-
-#endif /* CONFIG_OF */
-
-	kbdev->system_coherency = COHERENCY_NONE;
-
-	/* device tree may override the coherency */
-#ifdef CONFIG_OF
-	coherency_override_dts = of_get_property(kbdev->dev->of_node,
-						"system-coherency",
-						NULL);
-	if (coherency_override_dts) {
-
-		override_coherency = be32_to_cpup(coherency_override_dts);
-
-		if ((override_coherency <= COHERENCY_NONE) &&
-			(supported_coherency_bitmap &
-			 COHERENCY_FEATURE_BIT(override_coherency))) {
-
-			kbdev->system_coherency = override_coherency;
-
-			dev_info(kbdev->dev,
-				"Using coherency mode %u set from dtb",
-				override_coherency);
-		} else
-			dev_warn(kbdev->dev,
-				"Ignoring unsupported coherency mode %u set from dtb",
-				override_coherency);
-	}
-
-#endif /* CONFIG_OF */
-
-	kbdev->gpu_props.props.raw_props.coherency_mode =
-		kbdev->system_coherency;
-}
-
-#ifdef CONFIG_MALI_FPGA_BUS_LOGGER
-
-/* Callback used by the kbase bus logger client, to initiate a GPU reset
- * when the bus log is restarted.  GPU reset is used as reference point
- * in HW bus log analyses.
- */
-static void kbase_logging_started_cb(void *data)
-{
-	struct kbase_device *kbdev = (struct kbase_device *)data;
-
-	if (kbase_prepare_to_reset_gpu(kbdev))
-		kbase_reset_gpu(kbdev);
-	dev_info(kbdev->dev, "KBASE - Bus logger restarted\n");
-}
-#endif
-
-static struct attribute *kbase_attrs[] = {
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-	&dev_attr_debug_command.attr,
-	&dev_attr_js_softstop_always.attr,
-#endif
-#if !MALI_CUSTOMER_RELEASE
-	&dev_attr_force_replay.attr,
-#endif
-	&dev_attr_js_timeouts.attr,
-	&dev_attr_soft_job_timeout.attr,
-	&dev_attr_gpuinfo.attr,
-	&dev_attr_dvfs_period.attr,
-	&dev_attr_pm_poweroff.attr,
-	&dev_attr_reset_timeout.attr,
-	&dev_attr_js_scheduling_period.attr,
-	&dev_attr_power_policy.attr,
-	&dev_attr_core_availability_policy.attr,
-	&dev_attr_core_mask.attr,
-	&dev_attr_mem_pool_size.attr,
-	&dev_attr_mem_pool_max_size.attr,
-	&dev_attr_lp_mem_pool_size.attr,
-	&dev_attr_lp_mem_pool_max_size.attr,
-	NULL
-};
-
-static const struct attribute_group kbase_attr_group = {
-	.attrs = kbase_attrs,
-};
-
-static int kbase_platform_device_remove(struct platform_device *pdev)
-{
-	struct kbase_device *kbdev = to_kbase_device(&pdev->dev);
-	const struct list_head *dev_list;
-
-	if (!kbdev)
-		return -ENODEV;
-
-	kfree(kbdev->gpu_props.prop_buffer);
-
-#ifdef CONFIG_MALI_FPGA_BUS_LOGGER
-	if (kbdev->inited_subsys & inited_buslogger) {
-		bl_core_client_unregister(kbdev->buslogger);
-		kbdev->inited_subsys &= ~inited_buslogger;
-	}
-#endif
-
-
-	if (kbdev->inited_subsys & inited_dev_list) {
-		dev_list = kbase_dev_list_get();
-		list_del(&kbdev->entry);
-		kbase_dev_list_put(dev_list);
-		kbdev->inited_subsys &= ~inited_dev_list;
-	}
-
-	if (kbdev->inited_subsys & inited_misc_register) {
-		misc_deregister(&kbdev->mdev);
-		kbdev->inited_subsys &= ~inited_misc_register;
-	}
-
-	if (kbdev->inited_subsys & inited_sysfs_group) {
-		sysfs_remove_group(&kbdev->dev->kobj, &kbase_attr_group);
-		kbdev->inited_subsys &= ~inited_sysfs_group;
-	}
-
-	if (kbdev->inited_subsys & inited_get_device) {
-		put_device(kbdev->dev);
-		kbdev->inited_subsys &= ~inited_get_device;
-	}
-
-	if (kbdev->inited_subsys & inited_debugfs) {
-		kbase_device_debugfs_term(kbdev);
-		kbdev->inited_subsys &= ~inited_debugfs;
-	}
-
-	if (kbdev->inited_subsys & inited_job_fault) {
-		kbase_debug_job_fault_dev_term(kbdev);
-		kbdev->inited_subsys &= ~inited_job_fault;
-	}
-	if (kbdev->inited_subsys & inited_vinstr) {
-		kbase_vinstr_term(kbdev->vinstr_ctx);
-		kbdev->inited_subsys &= ~inited_vinstr;
-	}
-
-#ifdef CONFIG_MALI_BIFROST_DEVFREQ
-	if (kbdev->inited_subsys & inited_devfreq) {
-		kbase_devfreq_term(kbdev);
-		kbdev->inited_subsys &= ~inited_devfreq;
-	}
-#endif
-
-	if (kbdev->inited_subsys & inited_backend_late) {
-		kbase_backend_late_term(kbdev);
-		kbdev->inited_subsys &= ~inited_backend_late;
-	}
-
-	if (kbdev->inited_subsys & inited_tlstream) {
-		kbase_tlstream_term();
-		kbdev->inited_subsys &= ~inited_tlstream;
-	}
-
-	/* Bring job and mem sys to a halt before we continue termination */
-
-	if (kbdev->inited_subsys & inited_js)
-		kbasep_js_devdata_halt(kbdev);
-
-	if (kbdev->inited_subsys & inited_mem)
-		kbase_mem_halt(kbdev);
-
-	if (kbdev->inited_subsys & inited_protected) {
-		kbasep_protected_mode_term(kbdev);
-		kbdev->inited_subsys &= ~inited_protected;
-	}
-
-	if (kbdev->inited_subsys & inited_js) {
-		kbasep_js_devdata_term(kbdev);
-		kbdev->inited_subsys &= ~inited_js;
-	}
-
-	if (kbdev->inited_subsys & inited_mem) {
-		kbase_mem_term(kbdev);
-		kbdev->inited_subsys &= ~inited_mem;
-	}
-
-	if (kbdev->inited_subsys & inited_pm_runtime_init) {
-		kbdev->pm.callback_power_runtime_term(kbdev);
-		kbdev->inited_subsys &= ~inited_pm_runtime_init;
-	}
-
-	if (kbdev->inited_subsys & inited_ctx_sched) {
-		kbase_ctx_sched_term(kbdev);
-		kbdev->inited_subsys &= ~inited_ctx_sched;
-	}
-
-	if (kbdev->inited_subsys & inited_device) {
-		kbase_device_term(kbdev);
-		kbdev->inited_subsys &= ~inited_device;
-	}
-
-	if (kbdev->inited_subsys & inited_backend_early) {
-		kbase_backend_early_term(kbdev);
-		kbdev->inited_subsys &= ~inited_backend_early;
-	}
-
-	if (kbdev->inited_subsys & inited_io_history) {
-		kbase_io_history_term(&kbdev->io_history);
-		kbdev->inited_subsys &= ~inited_io_history;
-	}
-
-	if (kbdev->inited_subsys & inited_power_control) {
-		power_control_term(kbdev);
-		kbdev->inited_subsys &= ~inited_power_control;
-	}
-
-	if (kbdev->inited_subsys & inited_registers_map) {
-		registers_unmap(kbdev);
-		kbdev->inited_subsys &= ~inited_registers_map;
-	}
-
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-	if (kbdev->inited_subsys & inited_gpu_device) {
-		gpu_device_destroy(kbdev);
-		kbdev->inited_subsys &= ~inited_gpu_device;
-	}
-#endif /* CONFIG_MALI_BIFROST_NO_MALI */
-
-	if (kbdev->inited_subsys != 0)
-		dev_err(kbdev->dev, "Missing sub system termination\n");
-
-	kbase_device_free(kbdev);
-
-	return 0;
-}
-
-
-/* Number of register accesses for the buffer that we allocate during
- * initialization time. The buffer size can be changed later via debugfs. */
-#define KBASEP_DEFAULT_REGISTER_HISTORY_SIZE ((u16)512)
-
-static int kbase_platform_device_probe(struct platform_device *pdev)
-{
-	struct kbase_device *kbdev;
-	struct mali_base_gpu_core_props *core_props;
-	u32 gpu_id;
-	unsigned prod_id;
-	const struct list_head *dev_list;
-	int err = 0;
-
-#ifdef CONFIG_OF
-	err = kbase_platform_early_init();
-	if (err) {
-		dev_err(&pdev->dev, "Early platform initialization failed\n");
-		kbase_platform_device_remove(pdev);
-		return err;
-	}
-#endif
-	kbdev = kbase_device_alloc();
-	if (!kbdev) {
-		dev_err(&pdev->dev, "Allocate device failed\n");
-		kbase_platform_device_remove(pdev);
-		return -ENOMEM;
-	}
-
-	kbdev->dev = &pdev->dev;
-	dev_set_drvdata(kbdev->dev, kbdev);
-
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-	err = gpu_device_create(kbdev);
-	if (err) {
-		dev_err(&pdev->dev, "Dummy model initialization failed\n");
-		kbase_platform_device_remove(pdev);
-		return err;
-	}
-	kbdev->inited_subsys |= inited_gpu_device;
-#endif /* CONFIG_MALI_BIFROST_NO_MALI */
-
-	err = assign_irqs(pdev);
-	if (err) {
-		dev_err(&pdev->dev, "IRQ search failed\n");
-		kbase_platform_device_remove(pdev);
-		return err;
-	}
-
-	err = registers_map(kbdev);
-	if (err) {
-		dev_err(&pdev->dev, "Register map failed\n");
-		kbase_platform_device_remove(pdev);
-		return err;
-	}
-	kbdev->inited_subsys |= inited_registers_map;
-
-	err = power_control_init(pdev);
-	if (err) {
-		dev_err(&pdev->dev, "Power control initialization failed\n");
-		kbase_platform_device_remove(pdev);
-		return err;
-	}
-	kbdev->inited_subsys |= inited_power_control;
-
-	err = kbase_io_history_init(&kbdev->io_history,
-			KBASEP_DEFAULT_REGISTER_HISTORY_SIZE);
-	if (err) {
-		dev_err(&pdev->dev, "Register access history initialization failed\n");
-		kbase_platform_device_remove(pdev);
-		return -ENOMEM;
-	}
-	kbdev->inited_subsys |= inited_io_history;
-
-	err = kbase_backend_early_init(kbdev);
-	if (err) {
-		dev_err(kbdev->dev, "Early backend initialization failed\n");
-		kbase_platform_device_remove(pdev);
-		return err;
-	}
-	kbdev->inited_subsys |= inited_backend_early;
-
-	scnprintf(kbdev->devname, DEVNAME_SIZE, "%s%d", kbase_drv_name,
-			kbase_dev_nr);
-
-	kbase_disjoint_init(kbdev);
-
-	/* obtain min/max configured gpu frequencies */
-	core_props = &(kbdev->gpu_props.props.core_props);
-	core_props->gpu_freq_khz_min = GPU_FREQ_KHZ_MIN;
-	core_props->gpu_freq_khz_max = GPU_FREQ_KHZ_MAX;
-
-	err = kbase_device_init(kbdev);
-	if (err) {
-		dev_err(kbdev->dev, "Device initialization failed (%d)\n", err);
-		kbase_platform_device_remove(pdev);
-		return err;
-	}
-	kbdev->inited_subsys |= inited_device;
-
-	err = kbase_ctx_sched_init(kbdev);
-	if (err) {
-		dev_err(kbdev->dev, "Context scheduler initialization failed (%d)\n",
-				err);
-		kbase_platform_device_remove(pdev);
-		return err;
-	}
-	kbdev->inited_subsys |= inited_ctx_sched;
-
-	if (kbdev->pm.callback_power_runtime_init) {
-		err = kbdev->pm.callback_power_runtime_init(kbdev);
-		if (err) {
-			dev_err(kbdev->dev,
-				"Runtime PM initialization failed\n");
-			kbase_platform_device_remove(pdev);
-			return err;
-		}
-		kbdev->inited_subsys |= inited_pm_runtime_init;
-	}
-
-	err = kbase_mem_init(kbdev);
-	if (err) {
-		dev_err(kbdev->dev, "Memory subsystem initialization failed\n");
-		kbase_platform_device_remove(pdev);
-		return err;
-	}
-	kbdev->inited_subsys |= inited_mem;
-
-	gpu_id = kbdev->gpu_props.props.raw_props.gpu_id;
-	gpu_id &= GPU_ID_VERSION_PRODUCT_ID;
-	prod_id = gpu_id >> GPU_ID_VERSION_PRODUCT_ID_SHIFT;
-
-	kbase_device_coherency_init(kbdev, prod_id);
-
-	err = kbasep_protected_mode_init(kbdev);
-	if (err) {
-		dev_err(kbdev->dev, "Protected mode subsystem initialization failed\n");
-		kbase_platform_device_remove(pdev);
-		return err;
-	}
-	kbdev->inited_subsys |= inited_protected;
-
-	dev_list = kbase_dev_list_get();
-	list_add(&kbdev->entry, &kbase_dev_list);
-	kbase_dev_list_put(dev_list);
-	kbdev->inited_subsys |= inited_dev_list;
-
-	err = kbasep_js_devdata_init(kbdev);
-	if (err) {
-		dev_err(kbdev->dev, "Job JS devdata initialization failed\n");
-		kbase_platform_device_remove(pdev);
-		return err;
-	}
-	kbdev->inited_subsys |= inited_js;
-
-	err = kbase_tlstream_init();
-	if (err) {
-		dev_err(kbdev->dev, "Timeline stream initialization failed\n");
-		kbase_platform_device_remove(pdev);
-		return err;
-	}
-	kbdev->inited_subsys |= inited_tlstream;
-
-	err = kbase_backend_late_init(kbdev);
-	if (err) {
-		dev_err(kbdev->dev, "Late backend initialization failed\n");
-		kbase_platform_device_remove(pdev);
-		return err;
-	}
-	kbdev->inited_subsys |= inited_backend_late;
-
-	/* Initialize the kctx list. This is used by vinstr. */
-	mutex_init(&kbdev->kctx_list_lock);
-	INIT_LIST_HEAD(&kbdev->kctx_list);
-
-	kbdev->vinstr_ctx = kbase_vinstr_init(kbdev);
-	if (!kbdev->vinstr_ctx) {
-		dev_err(kbdev->dev,
-			"Virtual instrumentation initialization failed\n");
-		kbase_platform_device_remove(pdev);
-		return -EINVAL;
-	}
-	kbdev->inited_subsys |= inited_vinstr;
-
-#ifdef CONFIG_MALI_BIFROST_DEVFREQ
-	/* Devfreq uses vinstr, so must be initialized after it. */
-	err = kbase_devfreq_init(kbdev);
-	if (!err)
-		kbdev->inited_subsys |= inited_devfreq;
-	else
-		dev_err(kbdev->dev, "Continuing without devfreq\n");
-#endif /* CONFIG_MALI_BIFROST_DEVFREQ */
-
-	err = kbase_debug_job_fault_dev_init(kbdev);
-	if (err) {
-		dev_err(kbdev->dev, "Job fault debug initialization failed\n");
-		kbase_platform_device_remove(pdev);
-		return err;
-	}
-	kbdev->inited_subsys |= inited_job_fault;
-
-	err = kbase_device_debugfs_init(kbdev);
-	if (err) {
-		dev_err(kbdev->dev, "DebugFS initialization failed");
-		kbase_platform_device_remove(pdev);
-		return err;
-	}
-	kbdev->inited_subsys |= inited_debugfs;
-
-	kbdev->mdev.minor = MISC_DYNAMIC_MINOR;
-	kbdev->mdev.name = kbdev->devname;
-	kbdev->mdev.fops = &kbase_fops;
-	kbdev->mdev.parent = get_device(kbdev->dev);
-	kbdev->inited_subsys |= inited_get_device;
-
-	/* This needs to happen before registering the device with misc_register(),
-	 * otherwise it causes a race condition between registering the device and a
-	 * uevent event being generated for userspace, causing udev rules to run
-	 * which might expect certain sysfs attributes present. As a result of the
-	 * race condition we avoid, some Mali sysfs entries may have appeared to
-	 * udev to not exist.
-
-	 * For more information, see
-	 * https://www.kernel.org/doc/Documentation/driver-model/device.txt, the
-	 * paragraph that starts with "Word of warning", currently the second-last
-	 * paragraph.
-	 */
-	err = sysfs_create_group(&kbdev->dev->kobj, &kbase_attr_group);
-	if (err) {
-		dev_err(&pdev->dev, "SysFS group creation failed\n");
-		kbase_platform_device_remove(pdev);
-		return err;
-	}
-	kbdev->inited_subsys |= inited_sysfs_group;
-
-	err = misc_register(&kbdev->mdev);
-	if (err) {
-		dev_err(kbdev->dev, "Misc device registration failed for %s\n",
-			kbdev->devname);
-		kbase_platform_device_remove(pdev);
-		return err;
-	}
-	kbdev->inited_subsys |= inited_misc_register;
-
-
-#ifdef CONFIG_MALI_FPGA_BUS_LOGGER
-	err = bl_core_client_register(kbdev->devname,
-						kbase_logging_started_cb,
-						kbdev, &kbdev->buslogger,
-						THIS_MODULE, NULL);
-	if (err == 0) {
-		kbdev->inited_subsys |= inited_buslogger;
-		bl_core_set_threshold(kbdev->buslogger, 1024*1024*1024);
-	} else {
-		dev_warn(kbdev->dev, "Bus log client registration failed\n");
-		err = 0;
-	}
-#endif
-
-	err = kbase_gpuprops_populate_user_buffer(kbdev);
-	if (err) {
-		dev_err(&pdev->dev, "GPU property population failed");
-		kbase_platform_device_remove(pdev);
-		return err;
-	}
-
-	dev_info(kbdev->dev,
-			"Probed as %s\n", dev_name(kbdev->mdev.this_device));
-
-	kbase_dev_nr++;
-
-	return err;
-}
-
-#undef KBASEP_DEFAULT_REGISTER_HISTORY_SIZE
-
-/**
- * kbase_device_suspend - Suspend callback from the OS.
- *
- * This is called by Linux when the device should suspend.
- *
- * @dev:  The device to suspend
- *
- * Return: A standard Linux error code
- */
-static int kbase_device_suspend(struct device *dev)
-{
-	struct kbase_device *kbdev = to_kbase_device(dev);
-
-	if (!kbdev)
-		return -ENODEV;
-
-#if defined(CONFIG_MALI_BIFROST_DEVFREQ) && \
-		(LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
-	if (kbdev->inited_subsys & inited_devfreq)
-		devfreq_suspend_device(kbdev->devfreq);
-#endif
-
-	kbase_pm_suspend(kbdev);
-	return 0;
-}
-
-/**
- * kbase_device_resume - Resume callback from the OS.
- *
- * This is called by Linux when the device should resume from suspension.
- *
- * @dev:  The device to resume
- *
- * Return: A standard Linux error code
- */
-static int kbase_device_resume(struct device *dev)
-{
-	struct kbase_device *kbdev = to_kbase_device(dev);
-
-	if (!kbdev)
-		return -ENODEV;
-
-	kbase_pm_resume(kbdev);
-
-#if defined(CONFIG_MALI_BIFROST_DEVFREQ) && \
-		(LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
-	if (kbdev->inited_subsys & inited_devfreq)
-		devfreq_resume_device(kbdev->devfreq);
-#endif
-	return 0;
-}
-
-/**
- * kbase_device_runtime_suspend - Runtime suspend callback from the OS.
- *
- * This is called by Linux when the device should prepare for a condition in
- * which it will not be able to communicate with the CPU(s) and RAM due to
- * power management.
- *
- * @dev:  The device to suspend
- *
- * Return: A standard Linux error code
- */
-#ifdef KBASE_PM_RUNTIME
-static int kbase_device_runtime_suspend(struct device *dev)
-{
-	struct kbase_device *kbdev = to_kbase_device(dev);
-
-	if (!kbdev)
-		return -ENODEV;
-
-#if defined(CONFIG_MALI_BIFROST_DEVFREQ) && \
-		(LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
-	if (kbdev->inited_subsys & inited_devfreq)
-		devfreq_suspend_device(kbdev->devfreq);
-#endif
-
-	if (kbdev->pm.backend.callback_power_runtime_off) {
-		kbdev->pm.backend.callback_power_runtime_off(kbdev);
-		dev_dbg(dev, "runtime suspend\n");
-	}
-	return 0;
-}
-#endif /* KBASE_PM_RUNTIME */
-
-/**
- * kbase_device_runtime_resume - Runtime resume callback from the OS.
- *
- * This is called by Linux when the device should go into a fully active state.
- *
- * @dev:  The device to suspend
- *
- * Return: A standard Linux error code
- */
-
-#ifdef KBASE_PM_RUNTIME
-static int kbase_device_runtime_resume(struct device *dev)
-{
-	int ret = 0;
-	struct kbase_device *kbdev = to_kbase_device(dev);
-
-	if (!kbdev)
-		return -ENODEV;
-
-	if (kbdev->pm.backend.callback_power_runtime_on) {
-		ret = kbdev->pm.backend.callback_power_runtime_on(kbdev);
-		dev_dbg(dev, "runtime resume\n");
-	}
-
-#if defined(CONFIG_MALI_BIFROST_DEVFREQ) && \
-		(LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
-	if (kbdev->inited_subsys & inited_devfreq)
-		devfreq_resume_device(kbdev->devfreq);
-#endif
-
-	return ret;
-}
-#endif /* KBASE_PM_RUNTIME */
-
-
-#ifdef KBASE_PM_RUNTIME
-/**
- * kbase_device_runtime_idle - Runtime idle callback from the OS.
- * @dev: The device to suspend
- *
- * This is called by Linux when the device appears to be inactive and it might
- * be placed into a low power state.
- *
- * Return: 0 if device can be suspended, non-zero to avoid runtime autosuspend,
- * otherwise a standard Linux error code
- */
-static int kbase_device_runtime_idle(struct device *dev)
-{
-	struct kbase_device *kbdev = to_kbase_device(dev);
-
-	if (!kbdev)
-		return -ENODEV;
-
-	/* Use platform specific implementation if it exists. */
-	if (kbdev->pm.backend.callback_power_runtime_idle)
-		return kbdev->pm.backend.callback_power_runtime_idle(kbdev);
-
-	return 0;
-}
-#endif /* KBASE_PM_RUNTIME */
-
-/* The power management operations for the platform driver.
- */
-static const struct dev_pm_ops kbase_pm_ops = {
-	.suspend = kbase_device_suspend,
-	.resume = kbase_device_resume,
-#ifdef KBASE_PM_RUNTIME
-	.runtime_suspend = kbase_device_runtime_suspend,
-	.runtime_resume = kbase_device_runtime_resume,
-	.runtime_idle = kbase_device_runtime_idle,
-#endif /* KBASE_PM_RUNTIME */
-};
-
-#ifdef CONFIG_OF
-static const struct of_device_id kbase_dt_ids[] = {
-	{ .compatible = "arm,malit6xx" },
-	{ .compatible = "arm,mali-midgard" },
-	{ /* sentinel */ }
-};
-MODULE_DEVICE_TABLE(of, kbase_dt_ids);
-#endif
-
-static struct platform_driver kbase_platform_driver = {
-	.probe = kbase_platform_device_probe,
-	.remove = kbase_platform_device_remove,
-	.driver = {
-		   .name = kbase_drv_name,
-		   .owner = THIS_MODULE,
-		   .pm = &kbase_pm_ops,
-		   .of_match_table = of_match_ptr(kbase_dt_ids),
-	},
-};
-
-/*
- * The driver will not provide a shortcut to create the Mali platform device
- * anymore when using Device Tree.
- */
-#ifdef CONFIG_OF
-module_platform_driver(kbase_platform_driver);
-#else
-
-static int __init kbase_driver_init(void)
-{
-	int ret;
-
-	ret = kbase_platform_early_init();
-	if (ret)
-		return ret;
-
-	ret = kbase_platform_register();
-	if (ret)
-		return ret;
-
-	ret = platform_driver_register(&kbase_platform_driver);
-
-	if (ret)
-		kbase_platform_unregister();
-
-	return ret;
-}
-
-static void __exit kbase_driver_exit(void)
-{
-	platform_driver_unregister(&kbase_platform_driver);
-	kbase_platform_unregister();
-}
-
-module_init(kbase_driver_init);
-module_exit(kbase_driver_exit);
-
-#endif /* CONFIG_OF */
-
-MODULE_LICENSE("GPL");
-MODULE_VERSION(MALI_RELEASE_NAME " (UK version " \
-		__stringify(BASE_UK_VERSION_MAJOR) "." \
-		__stringify(BASE_UK_VERSION_MINOR) ")");
-
-#if defined(CONFIG_MALI_BIFROST_GATOR_SUPPORT) || defined(CONFIG_MALI_BIFROST_SYSTEM_TRACE)
-#define CREATE_TRACE_POINTS
-#endif
-
-#ifdef CONFIG_MALI_BIFROST_GATOR_SUPPORT
-/* Create the trace points (otherwise we just get code to call a tracepoint) */
-#include "mali_linux_trace.h"
-
-EXPORT_TRACEPOINT_SYMBOL_GPL(mali_job_slots_event);
-EXPORT_TRACEPOINT_SYMBOL_GPL(mali_pm_status);
-EXPORT_TRACEPOINT_SYMBOL_GPL(mali_pm_power_on);
-EXPORT_TRACEPOINT_SYMBOL_GPL(mali_pm_power_off);
-EXPORT_TRACEPOINT_SYMBOL_GPL(mali_page_fault_insert_pages);
-EXPORT_TRACEPOINT_SYMBOL_GPL(mali_mmu_as_in_use);
-EXPORT_TRACEPOINT_SYMBOL_GPL(mali_mmu_as_released);
-EXPORT_TRACEPOINT_SYMBOL_GPL(mali_total_alloc_pages_change);
-
-void kbase_trace_mali_pm_status(u32 event, u64 value)
-{
-	trace_mali_pm_status(event, value);
-}
-
-void kbase_trace_mali_pm_power_off(u32 event, u64 value)
-{
-	trace_mali_pm_power_off(event, value);
-}
-
-void kbase_trace_mali_pm_power_on(u32 event, u64 value)
-{
-	trace_mali_pm_power_on(event, value);
-}
-
-void kbase_trace_mali_job_slots_event(u32 event, const struct kbase_context *kctx, u8 atom_id)
-{
-	trace_mali_job_slots_event(event, (kctx != NULL ? kctx->tgid : 0), (kctx != NULL ? kctx->pid : 0), atom_id);
-}
-
-void kbase_trace_mali_page_fault_insert_pages(int event, u32 value)
-{
-	trace_mali_page_fault_insert_pages(event, value);
-}
-
-void kbase_trace_mali_mmu_as_in_use(int event)
-{
-	trace_mali_mmu_as_in_use(event);
-}
-
-void kbase_trace_mali_mmu_as_released(int event)
-{
-	trace_mali_mmu_as_released(event);
-}
-
-void kbase_trace_mali_total_alloc_pages_change(long long int event)
-{
-	trace_mali_total_alloc_pages_change(event);
-}
-#endif /* CONFIG_MALI_BIFROST_GATOR_SUPPORT */
-#ifdef CONFIG_MALI_BIFROST_SYSTEM_TRACE
-#include "mali_linux_kbase_trace.h"
-#endif
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_ctx_sched.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_ctx_sched.c
deleted file mode 100644
index e2f7baabad43..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_ctx_sched.c
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <mali_kbase.h>
-#include <mali_kbase_config_defaults.h>
-
-#include "mali_kbase_ctx_sched.h"
-
-int kbase_ctx_sched_init(struct kbase_device *kbdev)
-{
-	int as_present = (1U << kbdev->nr_hw_address_spaces) - 1;
-
-	/* These two must be recalculated if nr_hw_address_spaces changes
-	 * (e.g. for HW workarounds) */
-	kbdev->nr_user_address_spaces = kbdev->nr_hw_address_spaces;
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8987)) {
-		bool use_workaround;
-
-		use_workaround = DEFAULT_SECURE_BUT_LOSS_OF_PERFORMANCE;
-		if (use_workaround) {
-			dev_dbg(kbdev->dev, "GPU has HW ISSUE 8987, and driver configured for security workaround: 1 address space only");
-			kbdev->nr_user_address_spaces = 1;
-		}
-	}
-
-	kbdev->as_free = as_present; /* All ASs initially free */
-
-	memset(kbdev->as_to_kctx, 0, sizeof(kbdev->as_to_kctx));
-
-	return 0;
-}
-
-void kbase_ctx_sched_term(struct kbase_device *kbdev)
-{
-	s8 i;
-
-	/* Sanity checks */
-	for (i = 0; i != kbdev->nr_hw_address_spaces; ++i) {
-		WARN_ON(kbdev->as_to_kctx[i] != NULL);
-		WARN_ON(!(kbdev->as_free & (1u << i)));
-	}
-}
-
-/* kbasep_ctx_sched_find_as_for_ctx - Find a free address space
- *
- * @kbdev: The context for which to find a free address space
- *
- * Return: A valid AS if successful, otherwise KBASEP_AS_NR_INVALID
- *
- * This function returns an address space available for use. It would prefer
- * returning an AS that has been previously assigned to the context to
- * avoid having to reprogram the MMU.
- */
-static int kbasep_ctx_sched_find_as_for_ctx(struct kbase_context *kctx)
-{
-	struct kbase_device *const kbdev = kctx->kbdev;
-	int free_as;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	/* First check if the previously assigned AS is available */
-	if ((kctx->as_nr != KBASEP_AS_NR_INVALID) &&
-			(kbdev->as_free & (1u << kctx->as_nr)))
-		return kctx->as_nr;
-
-	/* The previously assigned AS was taken, we'll be returning any free
-	 * AS at this point.
-	 */
-	free_as = ffs(kbdev->as_free) - 1;
-	if (free_as >= 0 && free_as < kbdev->nr_hw_address_spaces)
-		return free_as;
-
-	return KBASEP_AS_NR_INVALID;
-}
-
-int kbase_ctx_sched_retain_ctx(struct kbase_context *kctx)
-{
-	struct kbase_device *const kbdev = kctx->kbdev;
-
-	lockdep_assert_held(&kbdev->mmu_hw_mutex);
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	WARN_ON(!kbdev->pm.backend.gpu_powered);
-
-	if (atomic_inc_return(&kctx->refcount) == 1) {
-		int const free_as = kbasep_ctx_sched_find_as_for_ctx(kctx);
-
-		if (free_as != KBASEP_AS_NR_INVALID) {
-			kbdev->as_free &= ~(1u << free_as);
-			/* Only program the MMU if the context has not been
-			 * assigned the same address space before.
-			 */
-			if (free_as != kctx->as_nr) {
-				struct kbase_context *const prev_kctx =
-					kbdev->as_to_kctx[free_as];
-
-				if (prev_kctx) {
-					WARN_ON(atomic_read(&prev_kctx->refcount) != 0);
-					kbase_mmu_disable(prev_kctx);
-					prev_kctx->as_nr = KBASEP_AS_NR_INVALID;
-				}
-
-				kctx->as_nr = free_as;
-				kbdev->as_to_kctx[free_as] = kctx;
-				kbase_mmu_update(kctx);
-			}
-		} else {
-			atomic_dec(&kctx->refcount);
-
-			/* Failed to find an available address space, we must
-			 * be returning an error at this point.
-			 */
-			WARN_ON(kctx->as_nr != KBASEP_AS_NR_INVALID);
-		}
-	}
-
-	return kctx->as_nr;
-}
-
-void kbase_ctx_sched_retain_ctx_refcount(struct kbase_context *kctx)
-{
-	struct kbase_device *const kbdev = kctx->kbdev;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-	WARN_ON(atomic_read(&kctx->refcount) == 0);
-	WARN_ON(kctx->as_nr == KBASEP_AS_NR_INVALID);
-	WARN_ON(kbdev->as_to_kctx[kctx->as_nr] != kctx);
-
-	atomic_inc(&kctx->refcount);
-}
-
-void kbase_ctx_sched_release_ctx(struct kbase_context *kctx)
-{
-	struct kbase_device *const kbdev = kctx->kbdev;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	if (atomic_dec_return(&kctx->refcount) == 0)
-		kbdev->as_free |= (1u << kctx->as_nr);
-}
-
-void kbase_ctx_sched_remove_ctx(struct kbase_context *kctx)
-{
-	struct kbase_device *const kbdev = kctx->kbdev;
-
-	lockdep_assert_held(&kbdev->mmu_hw_mutex);
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	WARN_ON(atomic_read(&kctx->refcount) != 0);
-
-	if (kctx->as_nr != KBASEP_AS_NR_INVALID) {
-		if (kbdev->pm.backend.gpu_powered)
-			kbase_mmu_disable(kctx);
-
-		kbdev->as_to_kctx[kctx->as_nr] = NULL;
-		kctx->as_nr = KBASEP_AS_NR_INVALID;
-	}
-}
-
-void kbase_ctx_sched_restore_all_as(struct kbase_device *kbdev)
-{
-	s8 i;
-
-	lockdep_assert_held(&kbdev->mmu_hw_mutex);
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	WARN_ON(!kbdev->pm.backend.gpu_powered);
-
-	for (i = 0; i != kbdev->nr_hw_address_spaces; ++i) {
-		struct kbase_context *kctx;
-
-		kctx = kbdev->as_to_kctx[i];
-		if (kctx) {
-			if (atomic_read(&kctx->refcount)) {
-				WARN_ON(kctx->as_nr != i);
-
-				kbase_mmu_update(kctx);
-			} else {
-				/* This context might have been assigned an
-				 * AS before, clear it.
-				 */
-				kbdev->as_to_kctx[kctx->as_nr] = NULL;
-				kctx->as_nr = KBASEP_AS_NR_INVALID;
-			}
-		} else {
-			kbase_mmu_disable_as(kbdev, i);
-		}
-	}
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_ctx_sched.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_ctx_sched.h
deleted file mode 100644
index 2330d48c8e51..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_ctx_sched.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KBASE_CTX_SCHED_H_
-#define _KBASE_CTX_SCHED_H_
-
-#include <mali_kbase.h>
-
-/* The Context Scheduler manages address space assignment and reference
- * counting to kbase_context. The interface has been designed to minimise
- * interactions between the Job Scheduler and Power Management/MMU to support
- * the existing Job Scheduler interface.
- *
- * The initial implementation of the Context Scheduler does not schedule
- * contexts. Instead it relies on the Job Scheduler to make decisions of
- * when to schedule/evict contexts if address spaces are starved. In the
- * future, once an interface between the CS and JS have been devised to
- * provide enough information about how each context is consuming GPU resources,
- * those decisions can be made in the CS itself, thereby reducing duplicated
- * code.
- */
-
-/* base_ctx_sched_init - Initialise the context scheduler
- *
- * @kbdev: The device for which the context scheduler needs to be
- *         initialised
- *
- * Return: 0 for success, otherwise failure
- *
- * This must be called during device initilisation. The number of hardware
- * address spaces must already be established before calling this function.
- */
-int kbase_ctx_sched_init(struct kbase_device *kbdev);
-
-/* base_ctx_sched_term - Terminate the context scheduler
- *
- * @kbdev: The device for which the context scheduler needs to be
- *         terminated
- *
- * This must be called during device termination after all contexts have been
- * destroyed.
- */
-void kbase_ctx_sched_term(struct kbase_device *kbdev);
-
-/* kbase_ctx_sched_retain_ctx - Retain a reference to the @ref kbase_context
- *
- * @kctx: The context to which to retain a reference
- *
- * Return: The address space that the context has been assigned to or
- *         KBASEP_AS_NR_INVALID if no address space was available.
- *
- * This function should be called whenever an address space should be assigned
- * to a context and programmed onto the MMU. It should typically be called
- * when jobs are ready to be submitted to the GPU.
- *
- * It can be called as many times as necessary. The address space will be
- * assigned to the context for as long as there is a reference to said context.
- *
- * The kbase_device::mmu_hw_mutex and kbase_device::hwaccess_lock locks must be
- * held whilst calling this function.
- */
-int kbase_ctx_sched_retain_ctx(struct kbase_context *kctx);
-
-/* kbase_ctx_sched_retain_ctx_refcount
- *
- * @kctx: The context to which to retain a reference
- *
- * This function only retains a reference to the context. It must be called
- * only when the context already has a reference.
- *
- * This is typically called inside an atomic session where we know the context
- * is already scheduled in but want to take an extra reference to ensure that
- * it doesn't get descheduled.
- *
- * The kbase_device::hwaccess_lock must be held whilst calling this function
- */
-void kbase_ctx_sched_retain_ctx_refcount(struct kbase_context *kctx);
-
-/* kbase_ctx_sched_release_ctx - Release a reference to the @ref kbase_context
- *
- * @kctx: The context from which to release a reference
- *
- * This function should be called whenever an address space could be unassigned
- * from a context. When there are no more references to said context, the
- * address space previously assigned to this context shall be reassigned to
- * other contexts as needed.
- *
- * The kbase_device::hwaccess_lock must be held whilst calling this function
- */
-void kbase_ctx_sched_release_ctx(struct kbase_context *kctx);
-
-/* kbase_ctx_sched_remove_ctx - Unassign previously assigned address space
- *
- * @kctx: The context to be removed
- *
- * This function should be called when a context is being destroyed. The
- * context must no longer have any reference. If it has been assigned an
- * address space before then the AS will be unprogrammed.
- *
- * The kbase_device::mmu_hw_mutex and kbase_device::hwaccess_lock locks must be
- * held whilst calling this function.
- */
-void kbase_ctx_sched_remove_ctx(struct kbase_context *kctx);
-
-/* kbase_ctx_sched_restore_all_as - Reprogram all address spaces
- *
- * @kbdev: The device for which address spaces to be reprogrammed
- *
- * This function shall reprogram all address spaces previously assigned to
- * contexts. It can be used after the GPU is reset.
- *
- * The kbase_device::mmu_hw_mutex and kbase_device::hwaccess_lock locks must be
- * held whilst calling this function.
- */
-void kbase_ctx_sched_restore_all_as(struct kbase_device *kbdev);
-
-#endif /* _KBASE_CTX_SCHED_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug.c
deleted file mode 100644
index fb57ac2e31ad..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2014 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#include <mali_kbase.h>
-
-static struct kbasep_debug_assert_cb kbasep_debug_assert_registered_cb = {
-	NULL,
-	NULL
-};
-
-void kbase_debug_assert_register_hook(kbase_debug_assert_hook *func, void *param)
-{
-	kbasep_debug_assert_registered_cb.func = func;
-	kbasep_debug_assert_registered_cb.param = param;
-}
-
-void kbasep_debug_assert_call_hook(void)
-{
-	if (kbasep_debug_assert_registered_cb.func != NULL)
-		kbasep_debug_assert_registered_cb.func(kbasep_debug_assert_registered_cb.param);
-}
-KBASE_EXPORT_SYMBOL(kbasep_debug_assert_call_hook);
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug.h
deleted file mode 100644
index 31b754c5507b..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug.h
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2015, 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#ifndef _KBASE_DEBUG_H
-#define _KBASE_DEBUG_H
-
-#include <linux/bug.h>
-
-/** @brief If equals to 0, a trace containing the file, line, and function will be displayed before each message. */
-#define KBASE_DEBUG_SKIP_TRACE 0
-
-/** @brief If different from 0, the trace will only contain the file and line. */
-#define KBASE_DEBUG_SKIP_FUNCTION_NAME 0
-
-/** @brief Disable the asserts tests if set to 1. Default is to disable the asserts in release. */
-#ifndef KBASE_DEBUG_DISABLE_ASSERTS
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-#define KBASE_DEBUG_DISABLE_ASSERTS 0
-#else
-#define KBASE_DEBUG_DISABLE_ASSERTS 1
-#endif
-#endif				/* KBASE_DEBUG_DISABLE_ASSERTS */
-
-/** Function type that is called on an KBASE_DEBUG_ASSERT() or KBASE_DEBUG_ASSERT_MSG() */
-typedef void (kbase_debug_assert_hook) (void *);
-
-struct kbasep_debug_assert_cb {
-	kbase_debug_assert_hook *func;
-	void *param;
-};
-
-/**
- * @def KBASEP_DEBUG_PRINT_TRACE
- * @brief Private macro containing the format of the trace to display before every message
- * @sa KBASE_DEBUG_SKIP_TRACE, KBASE_DEBUG_SKIP_FUNCTION_NAME
- */
-#if !KBASE_DEBUG_SKIP_TRACE
-#define KBASEP_DEBUG_PRINT_TRACE \
-		"In file: " __FILE__ " line: " CSTD_STR2(__LINE__)
-#if !KBASE_DEBUG_SKIP_FUNCTION_NAME
-#define KBASEP_DEBUG_PRINT_FUNCTION __func__
-#else
-#define KBASEP_DEBUG_PRINT_FUNCTION ""
-#endif
-#else
-#define KBASEP_DEBUG_PRINT_TRACE ""
-#endif
-
-/**
- * @def KBASEP_DEBUG_ASSERT_OUT(trace, function, ...)
- * @brief (Private) system printing function associated to the @ref KBASE_DEBUG_ASSERT_MSG event.
- * @param trace location in the code from where the message is printed
- * @param function function from where the message is printed
- * @param ... Format string followed by format arguments.
- * @note function parameter cannot be concatenated with other strings
- */
-/* Select the correct system output function*/
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-#define KBASEP_DEBUG_ASSERT_OUT(trace, function, ...)\
-		do { \
-			pr_err("Mali<ASSERT>: %s function:%s ", trace, function);\
-			pr_err(__VA_ARGS__);\
-			pr_err("\n");\
-		} while (false)
-#else
-#define KBASEP_DEBUG_ASSERT_OUT(trace, function, ...) CSTD_NOP()
-#endif
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-#define KBASE_CALL_ASSERT_HOOK() kbasep_debug_assert_call_hook()
-#else
-#define KBASE_CALL_ASSERT_HOOK() CSTD_NOP()
-#endif
-
-/**
- * @def KBASE_DEBUG_ASSERT(expr)
- * @brief Calls @ref KBASE_PRINT_ASSERT and prints the expression @a expr if @a expr is false
- *
- * @note This macro does nothing if the flag @ref KBASE_DEBUG_DISABLE_ASSERTS is set to 1
- *
- * @param expr Boolean expression
- */
-#define KBASE_DEBUG_ASSERT(expr) \
-	KBASE_DEBUG_ASSERT_MSG(expr, #expr)
-
-#if KBASE_DEBUG_DISABLE_ASSERTS
-#define KBASE_DEBUG_ASSERT_MSG(expr, ...) CSTD_NOP()
-#else
-	/**
-	 * @def KBASE_DEBUG_ASSERT_MSG(expr, ...)
-	 * @brief Calls @ref KBASEP_DEBUG_ASSERT_OUT and prints the given message if @a expr is false
-	 *
-	 * @note This macro does nothing if the flag @ref KBASE_DEBUG_DISABLE_ASSERTS is set to 1
-	 *
-	 * @param expr Boolean expression
-	 * @param ...  Message to display when @a expr is false, as a format string followed by format arguments.
-	 */
-#define KBASE_DEBUG_ASSERT_MSG(expr, ...) \
-		do { \
-			if (!(expr)) { \
-				KBASEP_DEBUG_ASSERT_OUT(KBASEP_DEBUG_PRINT_TRACE, KBASEP_DEBUG_PRINT_FUNCTION, __VA_ARGS__);\
-				KBASE_CALL_ASSERT_HOOK();\
-				BUG();\
-			} \
-		} while (false)
-#endif				/* KBASE_DEBUG_DISABLE_ASSERTS */
-
-/**
- * @def KBASE_DEBUG_CODE( X )
- * @brief Executes the code inside the macro only in debug mode
- *
- * @param X Code to compile only in debug mode.
- */
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-#define KBASE_DEBUG_CODE(X) X
-#else
-#define KBASE_DEBUG_CODE(X) CSTD_NOP()
-#endif				/* CONFIG_MALI_BIFROST_DEBUG */
-
-/** @} */
-
-/**
- * @brief Register a function to call on ASSERT
- *
- * Such functions will \b only be called during Debug mode, and for debugging
- * features \b only. Do not rely on them to be called in general use.
- *
- * To disable the hook, supply NULL to \a func.
- *
- * @note This function is not thread-safe, and should only be used to
- * register/deregister once in the module's lifetime.
- *
- * @param[in] func the function to call when an assert is triggered.
- * @param[in] param the parameter to pass to \a func when calling it
- */
-void kbase_debug_assert_register_hook(kbase_debug_assert_hook *func, void *param);
-
-/**
- * @brief Call a debug assert hook previously registered with kbase_debug_assert_register_hook()
- *
- * @note This function is not thread-safe with respect to multiple threads
- * registering functions and parameters with
- * kbase_debug_assert_register_hook(). Otherwise, thread safety is the
- * responsibility of the registered hook.
- */
-void kbasep_debug_assert_call_hook(void);
-
-#endif				/* _KBASE_DEBUG_H */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_job_fault.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_job_fault.c
deleted file mode 100644
index f29430ddf8f9..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_job_fault.c
+++ /dev/null
@@ -1,499 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <mali_kbase.h>
-#include <linux/spinlock.h>
-#include <mali_kbase_hwaccess_jm.h>
-
-#ifdef CONFIG_DEBUG_FS
-
-static bool kbase_is_job_fault_event_pending(struct kbase_device *kbdev)
-{
-	struct list_head *event_list = &kbdev->job_fault_event_list;
-	unsigned long    flags;
-	bool             ret;
-
-	spin_lock_irqsave(&kbdev->job_fault_event_lock, flags);
-	ret = !list_empty(event_list);
-	spin_unlock_irqrestore(&kbdev->job_fault_event_lock, flags);
-
-	return ret;
-}
-
-static bool kbase_ctx_has_no_event_pending(struct kbase_context *kctx)
-{
-	struct kbase_device *kbdev = kctx->kbdev;
-	struct list_head *event_list = &kctx->kbdev->job_fault_event_list;
-	struct base_job_fault_event *event;
-	unsigned long               flags;
-
-	spin_lock_irqsave(&kbdev->job_fault_event_lock, flags);
-	if (list_empty(event_list)) {
-		spin_unlock_irqrestore(&kbdev->job_fault_event_lock, flags);
-		return true;
-	}
-	list_for_each_entry(event, event_list, head) {
-		if (event->katom->kctx == kctx) {
-			spin_unlock_irqrestore(&kbdev->job_fault_event_lock,
-					flags);
-			return false;
-		}
-	}
-	spin_unlock_irqrestore(&kbdev->job_fault_event_lock, flags);
-	return true;
-}
-
-/* wait until the fault happen and copy the event */
-static int kbase_job_fault_event_wait(struct kbase_device *kbdev,
-		struct base_job_fault_event *event)
-{
-	struct list_head            *event_list = &kbdev->job_fault_event_list;
-	struct base_job_fault_event *event_in;
-	unsigned long               flags;
-
-	spin_lock_irqsave(&kbdev->job_fault_event_lock, flags);
-	if (list_empty(event_list)) {
-		spin_unlock_irqrestore(&kbdev->job_fault_event_lock, flags);
-		if (wait_event_interruptible(kbdev->job_fault_wq,
-				 kbase_is_job_fault_event_pending(kbdev)))
-			return -ERESTARTSYS;
-		spin_lock_irqsave(&kbdev->job_fault_event_lock, flags);
-	}
-
-	event_in = list_entry(event_list->next,
-			struct base_job_fault_event, head);
-	event->event_code = event_in->event_code;
-	event->katom = event_in->katom;
-
-	spin_unlock_irqrestore(&kbdev->job_fault_event_lock, flags);
-
-	return 0;
-
-}
-
-/* remove the event from the queue */
-static struct base_job_fault_event *kbase_job_fault_event_dequeue(
-		struct kbase_device *kbdev, struct list_head *event_list)
-{
-	struct base_job_fault_event *event;
-
-	event = list_entry(event_list->next,
-			struct base_job_fault_event, head);
-	list_del(event_list->next);
-
-	return event;
-
-}
-
-/* Remove all the following atoms after the failed atom in the same context
- * Call the postponed bottom half of job done.
- * Then, this context could be rescheduled.
- */
-static void kbase_job_fault_resume_event_cleanup(struct kbase_context *kctx)
-{
-	struct list_head *event_list = &kctx->job_fault_resume_event_list;
-
-	while (!list_empty(event_list)) {
-		struct base_job_fault_event *event;
-
-		event = kbase_job_fault_event_dequeue(kctx->kbdev,
-				&kctx->job_fault_resume_event_list);
-		kbase_jd_done_worker(&event->katom->work);
-	}
-
-}
-
-/* Remove all the failed atoms that belong to different contexts
- * Resume all the contexts that were suspend due to failed job
- */
-static void kbase_job_fault_event_cleanup(struct kbase_device *kbdev)
-{
-	struct list_head *event_list = &kbdev->job_fault_event_list;
-	unsigned long    flags;
-
-	spin_lock_irqsave(&kbdev->job_fault_event_lock, flags);
-	while (!list_empty(event_list)) {
-		kbase_job_fault_event_dequeue(kbdev, event_list);
-		spin_unlock_irqrestore(&kbdev->job_fault_event_lock, flags);
-		wake_up(&kbdev->job_fault_resume_wq);
-		spin_lock_irqsave(&kbdev->job_fault_event_lock, flags);
-	}
-	spin_unlock_irqrestore(&kbdev->job_fault_event_lock, flags);
-}
-
-static void kbase_job_fault_resume_worker(struct work_struct *data)
-{
-	struct base_job_fault_event *event = container_of(data,
-			struct base_job_fault_event, job_fault_work);
-	struct kbase_context *kctx;
-	struct kbase_jd_atom *katom;
-
-	katom = event->katom;
-	kctx = katom->kctx;
-
-	dev_info(kctx->kbdev->dev, "Job dumping wait\n");
-
-	/* When it was waked up, it need to check if queue is empty or the
-	 * failed atom belongs to different context. If yes, wake up. Both
-	 * of them mean the failed job has been dumped. Please note, it
-	 * should never happen that the job_fault_event_list has the two
-	 * atoms belong to the same context.
-	 */
-	wait_event(kctx->kbdev->job_fault_resume_wq,
-			 kbase_ctx_has_no_event_pending(kctx));
-
-	atomic_set(&kctx->job_fault_count, 0);
-	kbase_jd_done_worker(&katom->work);
-
-	/* In case the following atoms were scheduled during failed job dump
-	 * the job_done_worker was held. We need to rerun it after the dump
-	 * was finished
-	 */
-	kbase_job_fault_resume_event_cleanup(kctx);
-
-	dev_info(kctx->kbdev->dev, "Job dumping finish, resume scheduler\n");
-}
-
-static struct base_job_fault_event *kbase_job_fault_event_queue(
-		struct list_head *event_list,
-		struct kbase_jd_atom *atom,
-		u32 completion_code)
-{
-	struct base_job_fault_event *event;
-
-	event = &atom->fault_event;
-
-	event->katom = atom;
-	event->event_code = completion_code;
-
-	list_add_tail(&event->head, event_list);
-
-	return event;
-
-}
-
-static void kbase_job_fault_event_post(struct kbase_device *kbdev,
-		struct kbase_jd_atom *katom, u32 completion_code)
-{
-	struct base_job_fault_event *event;
-	unsigned long flags;
-
-	spin_lock_irqsave(&kbdev->job_fault_event_lock, flags);
-	event = kbase_job_fault_event_queue(&kbdev->job_fault_event_list,
-				katom, completion_code);
-	spin_unlock_irqrestore(&kbdev->job_fault_event_lock, flags);
-
-	wake_up_interruptible(&kbdev->job_fault_wq);
-
-	INIT_WORK(&event->job_fault_work, kbase_job_fault_resume_worker);
-	queue_work(kbdev->job_fault_resume_workq, &event->job_fault_work);
-
-	dev_info(katom->kctx->kbdev->dev, "Job fault happen, start dump: %d_%d",
-			katom->kctx->tgid, katom->kctx->id);
-
-}
-
-/*
- * This function will process the job fault
- * Get the register copy
- * Send the failed job dump event
- * Create a Wait queue to wait until the job dump finish
- */
-
-bool kbase_debug_job_fault_process(struct kbase_jd_atom *katom,
-		u32 completion_code)
-{
-	struct kbase_context *kctx = katom->kctx;
-
-	/* Check if dumping is in the process
-	 * only one atom of each context can be dumped at the same time
-	 * If the atom belongs to different context, it can be dumped
-	 */
-	if (atomic_read(&kctx->job_fault_count) > 0) {
-		kbase_job_fault_event_queue(
-				&kctx->job_fault_resume_event_list,
-				katom, completion_code);
-		dev_info(kctx->kbdev->dev, "queue:%d\n",
-				kbase_jd_atom_id(kctx, katom));
-		return true;
-	}
-
-	if (kctx->kbdev->job_fault_debug == true) {
-
-		if (completion_code != BASE_JD_EVENT_DONE) {
-
-			if (kbase_job_fault_get_reg_snapshot(kctx) == false) {
-				dev_warn(kctx->kbdev->dev, "get reg dump failed\n");
-				return false;
-			}
-
-			kbase_job_fault_event_post(kctx->kbdev, katom,
-					completion_code);
-			atomic_inc(&kctx->job_fault_count);
-			dev_info(kctx->kbdev->dev, "post:%d\n",
-					kbase_jd_atom_id(kctx, katom));
-			return true;
-
-		}
-	}
-	return false;
-
-}
-
-static int debug_job_fault_show(struct seq_file *m, void *v)
-{
-	struct kbase_device *kbdev = m->private;
-	struct base_job_fault_event *event = (struct base_job_fault_event *)v;
-	struct kbase_context *kctx = event->katom->kctx;
-	int i;
-
-	dev_info(kbdev->dev, "debug job fault seq show:%d_%d, %d",
-			kctx->tgid, kctx->id, event->reg_offset);
-
-	if (kctx->reg_dump == NULL) {
-		dev_warn(kbdev->dev, "reg dump is NULL");
-		return -1;
-	}
-
-	if (kctx->reg_dump[event->reg_offset] ==
-			REGISTER_DUMP_TERMINATION_FLAG) {
-		/* Return the error here to stop the read. And the
-		 * following next() will not be called. The stop can
-		 * get the real event resource and release it
-		 */
-		return -1;
-	}
-
-	if (event->reg_offset == 0)
-		seq_printf(m, "%d_%d\n", kctx->tgid, kctx->id);
-
-	for (i = 0; i < 50; i++) {
-		if (kctx->reg_dump[event->reg_offset] ==
-				REGISTER_DUMP_TERMINATION_FLAG) {
-			break;
-		}
-		seq_printf(m, "%08x: %08x\n",
-				kctx->reg_dump[event->reg_offset],
-				kctx->reg_dump[1+event->reg_offset]);
-		event->reg_offset += 2;
-
-	}
-
-
-	return 0;
-}
-static void *debug_job_fault_next(struct seq_file *m, void *v, loff_t *pos)
-{
-	struct kbase_device *kbdev = m->private;
-	struct base_job_fault_event *event = (struct base_job_fault_event *)v;
-
-	dev_info(kbdev->dev, "debug job fault seq next:%d, %d",
-			event->reg_offset, (int)*pos);
-
-	return event;
-}
-
-static void *debug_job_fault_start(struct seq_file *m, loff_t *pos)
-{
-	struct kbase_device *kbdev = m->private;
-	struct base_job_fault_event *event;
-
-	dev_info(kbdev->dev, "fault job seq start:%d", (int)*pos);
-
-	/* The condition is trick here. It needs make sure the
-	 * fault hasn't happened and the dumping hasn't been started,
-	 * or the dumping has finished
-	 */
-	if (*pos == 0) {
-		event = kmalloc(sizeof(*event), GFP_KERNEL);
-		if (!event)
-			return NULL;
-		event->reg_offset = 0;
-		if (kbase_job_fault_event_wait(kbdev, event)) {
-			kfree(event);
-			return NULL;
-		}
-
-		/* The cache flush workaround is called in bottom half of
-		 * job done but we delayed it. Now we should clean cache
-		 * earlier. Then the GPU memory dump should be correct.
-		 */
-		kbase_backend_cacheclean(kbdev, event->katom);
-	} else
-		return NULL;
-
-	return event;
-}
-
-static void debug_job_fault_stop(struct seq_file *m, void *v)
-{
-	struct kbase_device *kbdev = m->private;
-
-	/* here we wake up the kbase_jd_done_worker after stop, it needs
-	 * get the memory dump before the register dump in debug daemon,
-	 * otherwise, the memory dump may be incorrect.
-	 */
-
-	if (v != NULL) {
-		kfree(v);
-		dev_info(kbdev->dev, "debug job fault seq stop stage 1");
-
-	} else {
-		unsigned long flags;
-
-		spin_lock_irqsave(&kbdev->job_fault_event_lock, flags);
-		if (!list_empty(&kbdev->job_fault_event_list)) {
-			kbase_job_fault_event_dequeue(kbdev,
-				&kbdev->job_fault_event_list);
-			wake_up(&kbdev->job_fault_resume_wq);
-		}
-		spin_unlock_irqrestore(&kbdev->job_fault_event_lock, flags);
-		dev_info(kbdev->dev, "debug job fault seq stop stage 2");
-	}
-
-}
-
-static const struct seq_operations ops = {
-	.start = debug_job_fault_start,
-	.next = debug_job_fault_next,
-	.stop = debug_job_fault_stop,
-	.show = debug_job_fault_show,
-};
-
-static int debug_job_fault_open(struct inode *in, struct file *file)
-{
-	struct kbase_device *kbdev = in->i_private;
-
-	seq_open(file, &ops);
-
-	((struct seq_file *)file->private_data)->private = kbdev;
-	dev_info(kbdev->dev, "debug job fault seq open");
-
-	kbdev->job_fault_debug = true;
-
-	return 0;
-
-}
-
-static int debug_job_fault_release(struct inode *in, struct file *file)
-{
-	struct kbase_device *kbdev = in->i_private;
-
-	seq_release(in, file);
-
-	kbdev->job_fault_debug = false;
-
-	/* Clean the unprocessed job fault. After that, all the suspended
-	 * contexts could be rescheduled.
-	 */
-	kbase_job_fault_event_cleanup(kbdev);
-
-	dev_info(kbdev->dev, "debug job fault seq close");
-
-	return 0;
-}
-
-static const struct file_operations kbasep_debug_job_fault_fops = {
-	.open = debug_job_fault_open,
-	.read = seq_read,
-	.llseek = seq_lseek,
-	.release = debug_job_fault_release,
-};
-
-/*
- *  Initialize debugfs entry for job fault dump
- */
-void kbase_debug_job_fault_debugfs_init(struct kbase_device *kbdev)
-{
-	debugfs_create_file("job_fault", S_IRUGO,
-			kbdev->mali_debugfs_directory, kbdev,
-			&kbasep_debug_job_fault_fops);
-}
-
-
-int kbase_debug_job_fault_dev_init(struct kbase_device *kbdev)
-{
-
-	INIT_LIST_HEAD(&kbdev->job_fault_event_list);
-
-	init_waitqueue_head(&(kbdev->job_fault_wq));
-	init_waitqueue_head(&(kbdev->job_fault_resume_wq));
-	spin_lock_init(&kbdev->job_fault_event_lock);
-
-	kbdev->job_fault_resume_workq = alloc_workqueue(
-			"kbase_job_fault_resume_work_queue", WQ_MEM_RECLAIM, 1);
-	if (!kbdev->job_fault_resume_workq)
-		return -ENOMEM;
-
-	kbdev->job_fault_debug = false;
-
-	return 0;
-}
-
-/*
- * Release the relevant resource per device
- */
-void kbase_debug_job_fault_dev_term(struct kbase_device *kbdev)
-{
-	destroy_workqueue(kbdev->job_fault_resume_workq);
-}
-
-
-/*
- *  Initialize the relevant data structure per context
- */
-void kbase_debug_job_fault_context_init(struct kbase_context *kctx)
-{
-
-	/* We need allocate double size register range
-	 * Because this memory will keep the register address and value
-	 */
-	kctx->reg_dump = vmalloc(0x4000 * 2);
-	if (kctx->reg_dump == NULL)
-		return;
-
-	if (kbase_debug_job_fault_reg_snapshot_init(kctx, 0x4000) == false) {
-		vfree(kctx->reg_dump);
-		kctx->reg_dump = NULL;
-	}
-	INIT_LIST_HEAD(&kctx->job_fault_resume_event_list);
-	atomic_set(&kctx->job_fault_count, 0);
-
-}
-
-/*
- *  release the relevant resource per context
- */
-void kbase_debug_job_fault_context_term(struct kbase_context *kctx)
-{
-	vfree(kctx->reg_dump);
-}
-
-#else /* CONFIG_DEBUG_FS */
-
-int kbase_debug_job_fault_dev_init(struct kbase_device *kbdev)
-{
-	kbdev->job_fault_debug = false;
-
-	return 0;
-}
-
-void kbase_debug_job_fault_dev_term(struct kbase_device *kbdev)
-{
-}
-
-#endif /* CONFIG_DEBUG_FS */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_job_fault.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_job_fault.h
deleted file mode 100644
index a2bf8983c37c..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_job_fault.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KBASE_DEBUG_JOB_FAULT_H
-#define _KBASE_DEBUG_JOB_FAULT_H
-
-#include <linux/debugfs.h>
-#include <linux/seq_file.h>
-
-#define REGISTER_DUMP_TERMINATION_FLAG 0xFFFFFFFF
-
-/**
- * kbase_debug_job_fault_dev_init - Create the fault event wait queue
- *		per device and initialize the required lists.
- * @kbdev:	Device pointer
- *
- * Return: Zero on success or a negative error code.
- */
-int kbase_debug_job_fault_dev_init(struct kbase_device *kbdev);
-
-/**
- * kbase_debug_job_fault_debugfs_init - Initialize job fault debug sysfs
- * @kbdev:	Device pointer
- */
-void kbase_debug_job_fault_debugfs_init(struct kbase_device *kbdev);
-
-/**
- * kbase_debug_job_fault_dev_term - Clean up resources created in
- *		kbase_debug_job_fault_dev_init.
- * @kbdev:	Device pointer
- */
-void kbase_debug_job_fault_dev_term(struct kbase_device *kbdev);
-
-/**
- * kbase_debug_job_fault_context_init - Initialize the relevant
- *		data structure per context
- * @kctx: KBase context pointer
- */
-void kbase_debug_job_fault_context_init(struct kbase_context *kctx);
-
-/**
- * kbase_debug_job_fault_context_term - Release the relevant
- *		resource per context
- * @kctx: KBase context pointer
- */
-void kbase_debug_job_fault_context_term(struct kbase_context *kctx);
-
-/**
- * kbase_debug_job_fault_process - Process the failed job.
- *      It will send a event and wake up the job fault waiting queue
- *      Then create a work queue to wait for job dump finish
- *      This function should be called in the interrupt handler and before
- *      jd_done that make sure the jd_done_worker will be delayed until the
- *      job dump finish
- * @katom: The failed atom pointer
- * @completion_code: the job status
- * @return true if dump is going on
- */
-bool kbase_debug_job_fault_process(struct kbase_jd_atom *katom,
-		u32 completion_code);
-
-
-/**
- * kbase_debug_job_fault_reg_snapshot_init - Set the interested registers
- *      address during the job fault process, the relevant registers will
- *      be saved when a job fault happen
- * @kctx: KBase context pointer
- * @reg_range: Maximum register address space
- * @return true if initializing successfully
- */
-bool kbase_debug_job_fault_reg_snapshot_init(struct kbase_context *kctx,
-		int reg_range);
-
-/**
- * kbase_job_fault_get_reg_snapshot - Read the interested registers for
- *      failed job dump
- * @kctx: KBase context pointer
- * @return true if getting registers successfully
- */
-bool kbase_job_fault_get_reg_snapshot(struct kbase_context *kctx);
-
-#endif  /*_KBASE_DEBUG_JOB_FAULT_H*/
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_mem_view.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_mem_view.c
deleted file mode 100644
index aa271566e917..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_mem_view.c
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2013-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * Debugfs interface to dump the memory visible to the GPU
- */
-
-#include "mali_kbase_debug_mem_view.h"
-#include "mali_kbase.h"
-
-#include <linux/list.h>
-#include <linux/file.h>
-
-#ifdef CONFIG_DEBUG_FS
-
-struct debug_mem_mapping {
-	struct list_head node;
-
-	struct kbase_mem_phy_alloc *alloc;
-	unsigned long flags;
-
-	u64 start_pfn;
-	size_t nr_pages;
-};
-
-struct debug_mem_data {
-	struct list_head mapping_list;
-	struct kbase_context *kctx;
-};
-
-struct debug_mem_seq_off {
-	struct list_head *lh;
-	size_t offset;
-};
-
-static void *debug_mem_start(struct seq_file *m, loff_t *_pos)
-{
-	struct debug_mem_data *mem_data = m->private;
-	struct debug_mem_seq_off *data;
-	struct debug_mem_mapping *map;
-	loff_t pos = *_pos;
-
-	list_for_each_entry(map, &mem_data->mapping_list, node) {
-		if (pos >= map->nr_pages) {
-			pos -= map->nr_pages;
-		} else {
-			data = kmalloc(sizeof(*data), GFP_KERNEL);
-			if (!data)
-				return NULL;
-			data->lh = &map->node;
-			data->offset = pos;
-			return data;
-		}
-	}
-
-	/* Beyond the end */
-	return NULL;
-}
-
-static void debug_mem_stop(struct seq_file *m, void *v)
-{
-	kfree(v);
-}
-
-static void *debug_mem_next(struct seq_file *m, void *v, loff_t *pos)
-{
-	struct debug_mem_data *mem_data = m->private;
-	struct debug_mem_seq_off *data = v;
-	struct debug_mem_mapping *map;
-
-	map = list_entry(data->lh, struct debug_mem_mapping, node);
-
-	if (data->offset < map->nr_pages - 1) {
-		data->offset++;
-		++*pos;
-		return data;
-	}
-
-	if (list_is_last(data->lh, &mem_data->mapping_list)) {
-		kfree(data);
-		return NULL;
-	}
-
-	data->lh = data->lh->next;
-	data->offset = 0;
-	++*pos;
-
-	return data;
-}
-
-static int debug_mem_show(struct seq_file *m, void *v)
-{
-	struct debug_mem_data *mem_data = m->private;
-	struct debug_mem_seq_off *data = v;
-	struct debug_mem_mapping *map;
-	int i, j;
-	struct page *page;
-	uint32_t *mapping;
-	pgprot_t prot = PAGE_KERNEL;
-
-	map = list_entry(data->lh, struct debug_mem_mapping, node);
-
-	kbase_gpu_vm_lock(mem_data->kctx);
-
-	if (data->offset >= map->alloc->nents) {
-		seq_printf(m, "%016llx: Unbacked page\n\n", (map->start_pfn +
-				data->offset) << PAGE_SHIFT);
-		goto out;
-	}
-
-	if (!(map->flags & KBASE_REG_CPU_CACHED))
-		prot = pgprot_writecombine(prot);
-
-	page = phys_to_page(as_phys_addr_t(map->alloc->pages[data->offset]));
-	mapping = vmap(&page, 1, VM_MAP, prot);
-	if (!mapping)
-		goto out;
-
-	for (i = 0; i < PAGE_SIZE; i += 4*sizeof(*mapping)) {
-		seq_printf(m, "%016llx:", i + ((map->start_pfn +
-				data->offset) << PAGE_SHIFT));
-
-		for (j = 0; j < 4*sizeof(*mapping); j += sizeof(*mapping))
-			seq_printf(m, " %08x", mapping[(i+j)/sizeof(*mapping)]);
-		seq_putc(m, '\n');
-	}
-
-	vunmap(mapping);
-
-	seq_putc(m, '\n');
-
-out:
-	kbase_gpu_vm_unlock(mem_data->kctx);
-	return 0;
-}
-
-static const struct seq_operations ops = {
-	.start = debug_mem_start,
-	.next = debug_mem_next,
-	.stop = debug_mem_stop,
-	.show = debug_mem_show,
-};
-
-static int debug_mem_zone_open(struct rb_root *rbtree,
-						struct debug_mem_data *mem_data)
-{
-	int ret = 0;
-	struct rb_node *p;
-	struct kbase_va_region *reg;
-	struct debug_mem_mapping *mapping;
-
-	for (p = rb_first(rbtree); p; p = rb_next(p)) {
-		reg = rb_entry(p, struct kbase_va_region, rblink);
-
-		if (reg->gpu_alloc == NULL)
-			/* Empty region - ignore */
-			continue;
-
-		mapping = kmalloc(sizeof(*mapping), GFP_KERNEL);
-		if (!mapping) {
-			ret = -ENOMEM;
-			goto out;
-		}
-
-		mapping->alloc = kbase_mem_phy_alloc_get(reg->gpu_alloc);
-		mapping->start_pfn = reg->start_pfn;
-		mapping->nr_pages = reg->nr_pages;
-		mapping->flags = reg->flags;
-		list_add_tail(&mapping->node, &mem_data->mapping_list);
-	}
-
-out:
-	return ret;
-}
-
-static int debug_mem_open(struct inode *i, struct file *file)
-{
-	struct file *kctx_file = i->i_private;
-	struct kbase_context *kctx = kctx_file->private_data;
-	struct debug_mem_data *mem_data;
-	int ret;
-
-	ret = seq_open(file, &ops);
-	if (ret)
-		return ret;
-
-	mem_data = kmalloc(sizeof(*mem_data), GFP_KERNEL);
-	if (!mem_data) {
-		ret = -ENOMEM;
-		goto out;
-	}
-
-	mem_data->kctx = kctx;
-
-	INIT_LIST_HEAD(&mem_data->mapping_list);
-
-	get_file(kctx_file);
-
-	kbase_gpu_vm_lock(kctx);
-
-	ret = debug_mem_zone_open(&kctx->reg_rbtree_same, mem_data);
-	if (0 != ret) {
-		kbase_gpu_vm_unlock(kctx);
-		goto out;
-	}
-
-	ret = debug_mem_zone_open(&kctx->reg_rbtree_exec, mem_data);
-	if (0 != ret) {
-		kbase_gpu_vm_unlock(kctx);
-		goto out;
-	}
-
-	ret = debug_mem_zone_open(&kctx->reg_rbtree_custom, mem_data);
-	if (0 != ret) {
-		kbase_gpu_vm_unlock(kctx);
-		goto out;
-	}
-
-	kbase_gpu_vm_unlock(kctx);
-
-	((struct seq_file *)file->private_data)->private = mem_data;
-
-	return 0;
-
-out:
-	if (mem_data) {
-		while (!list_empty(&mem_data->mapping_list)) {
-			struct debug_mem_mapping *mapping;
-
-			mapping = list_first_entry(&mem_data->mapping_list,
-					struct debug_mem_mapping, node);
-			kbase_mem_phy_alloc_put(mapping->alloc);
-			list_del(&mapping->node);
-			kfree(mapping);
-		}
-		fput(kctx_file);
-		kfree(mem_data);
-	}
-	seq_release(i, file);
-	return ret;
-}
-
-static int debug_mem_release(struct inode *inode, struct file *file)
-{
-	struct file *kctx_file = inode->i_private;
-	struct seq_file *sfile = file->private_data;
-	struct debug_mem_data *mem_data = sfile->private;
-	struct debug_mem_mapping *mapping;
-
-	seq_release(inode, file);
-
-	while (!list_empty(&mem_data->mapping_list)) {
-		mapping = list_first_entry(&mem_data->mapping_list,
-				struct debug_mem_mapping, node);
-		kbase_mem_phy_alloc_put(mapping->alloc);
-		list_del(&mapping->node);
-		kfree(mapping);
-	}
-
-	kfree(mem_data);
-
-	fput(kctx_file);
-
-	return 0;
-}
-
-static const struct file_operations kbase_debug_mem_view_fops = {
-	.open = debug_mem_open,
-	.release = debug_mem_release,
-	.read = seq_read,
-	.llseek = seq_lseek
-};
-
-/**
- * kbase_debug_mem_view_init - Initialise the mem_view sysfs file
- * @kctx_file: The /dev/mali0 file instance for the context
- *
- * This function creates a "mem_view" file which can be used to get a view of
- * the context's memory as the GPU sees it (i.e. using the GPU's page tables).
- *
- * The file is cleaned up by a call to debugfs_remove_recursive() deleting the
- * parent directory.
- */
-void kbase_debug_mem_view_init(struct file *kctx_file)
-{
-	struct kbase_context *kctx = kctx_file->private_data;
-
-	debugfs_create_file("mem_view", S_IRUGO, kctx->kctx_dentry, kctx_file,
-			&kbase_debug_mem_view_fops);
-}
-
-#endif
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_mem_view.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_mem_view.h
deleted file mode 100644
index 20ab51a776c6..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_debug_mem_view.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2013-2014 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KBASE_DEBUG_MEM_VIEW_H
-#define _KBASE_DEBUG_MEM_VIEW_H
-
-#include <mali_kbase.h>
-
-void kbase_debug_mem_view_init(struct file *kctx_file);
-
-#endif
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_defs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_defs.h
deleted file mode 100644
index 73721f5da139..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_defs.h
+++ /dev/null
@@ -1,1641 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/**
- * @file mali_kbase_defs.h
- *
- * Defintions (types, defines, etcs) common to Kbase. They are placed here to
- * allow the hierarchy of header files to work.
- */
-
-#ifndef _KBASE_DEFS_H_
-#define _KBASE_DEFS_H_
-
-#include <mali_kbase_config.h>
-#include <mali_base_hwconfig_features.h>
-#include <mali_base_hwconfig_issues.h>
-#include <mali_kbase_mem_lowlevel.h>
-#include <mali_kbase_mmu_hw.h>
-#include <mali_kbase_instr_defs.h>
-#include <mali_kbase_pm.h>
-#include <protected_mode_switcher.h>
-
-#include <linux/atomic.h>
-#include <linux/mempool.h>
-#include <linux/slab.h>
-#include <linux/file.h>
-#include <linux/sizes.h>
-
-#ifdef CONFIG_MALI_FPGA_BUS_LOGGER
-#include <linux/bus_logger.h>
-#endif
-
-
-#ifdef CONFIG_KDS
-#include <linux/kds.h>
-#endif				/* CONFIG_KDS */
-
-#if defined(CONFIG_SYNC)
-#include <sync.h>
-#else
-#include "mali_kbase_fence_defs.h"
-#endif
-
-#ifdef CONFIG_DEBUG_FS
-#include <linux/debugfs.h>
-#endif				/* CONFIG_DEBUG_FS */
-
-#ifdef CONFIG_MALI_BIFROST_DEVFREQ
-#include <linux/devfreq.h>
-#endif /* CONFIG_MALI_BIFROST_DEVFREQ */
-
-#include <linux/clk.h>
-#include <linux/regulator/consumer.h>
-
-#if defined(CONFIG_PM_RUNTIME) || \
-	(defined(CONFIG_PM) && LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0))
-#define KBASE_PM_RUNTIME 1
-#endif
-
-/** Enable SW tracing when set */
-#ifdef CONFIG_MALI_BIFROST_ENABLE_TRACE
-#define KBASE_TRACE_ENABLE 1
-#endif
-
-#ifndef KBASE_TRACE_ENABLE
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-#define KBASE_TRACE_ENABLE 1
-#else
-#define KBASE_TRACE_ENABLE 0
-#endif				/* CONFIG_MALI_BIFROST_DEBUG */
-#endif				/* KBASE_TRACE_ENABLE */
-
-/** Dump Job slot trace on error (only active if KBASE_TRACE_ENABLE != 0) */
-#define KBASE_TRACE_DUMP_ON_JOB_SLOT_ERROR 1
-
-/**
- * Number of milliseconds before resetting the GPU when a job cannot be "zapped" from the hardware.
- * Note that the time is actually ZAP_TIMEOUT+SOFT_STOP_RESET_TIMEOUT between the context zap starting and the GPU
- * actually being reset to give other contexts time for their jobs to be soft-stopped and removed from the hardware
- * before resetting.
- */
-#define ZAP_TIMEOUT             1000
-
-/** Number of milliseconds before we time out on a GPU soft/hard reset */
-#define RESET_TIMEOUT           500
-
-/**
- * Prevent soft-stops from occuring in scheduling situations
- *
- * This is not due to HW issues, but when scheduling is desired to be more predictable.
- *
- * Therefore, soft stop may still be disabled due to HW issues.
- *
- * @note Soft stop will still be used for non-scheduling purposes e.g. when terminating a context.
- *
- * @note if not in use, define this value to 0 instead of \#undef'ing it
- */
-#define KBASE_DISABLE_SCHEDULING_SOFT_STOPS 0
-
-/**
- * Prevent hard-stops from occuring in scheduling situations
- *
- * This is not due to HW issues, but when scheduling is desired to be more predictable.
- *
- * @note Hard stop will still be used for non-scheduling purposes e.g. when terminating a context.
- *
- * @note if not in use, define this value to 0 instead of \#undef'ing it
- */
-#define KBASE_DISABLE_SCHEDULING_HARD_STOPS 0
-
-/**
- * The maximum number of Job Slots to support in the Hardware.
- *
- * You can optimize this down if your target devices will only ever support a
- * small number of job slots.
- */
-#define BASE_JM_MAX_NR_SLOTS        3
-
-/**
- * The maximum number of Address Spaces to support in the Hardware.
- *
- * You can optimize this down if your target devices will only ever support a
- * small number of Address Spaces
- */
-#define BASE_MAX_NR_AS              16
-
-/* mmu */
-#define MIDGARD_MMU_VA_BITS 48
-
-#define MIDGARD_MMU_LEVEL(x) (x)
-
-#if MIDGARD_MMU_VA_BITS > 39
-#define MIDGARD_MMU_TOPLEVEL    MIDGARD_MMU_LEVEL(0)
-#else
-#define MIDGARD_MMU_TOPLEVEL    MIDGARD_MMU_LEVEL(1)
-#endif
-
-#define MIDGARD_MMU_BOTTOMLEVEL MIDGARD_MMU_LEVEL(3)
-
-#define GROWABLE_FLAGS_REQUIRED (KBASE_REG_PF_GROW | KBASE_REG_GPU_WR)
-
-/** setting in kbase_context::as_nr that indicates it's invalid */
-#define KBASEP_AS_NR_INVALID     (-1)
-
-#define KBASE_LOCK_REGION_MAX_SIZE (63)
-#define KBASE_LOCK_REGION_MIN_SIZE (11)
-
-#define KBASE_TRACE_SIZE_LOG2 8	/* 256 entries */
-#define KBASE_TRACE_SIZE (1 << KBASE_TRACE_SIZE_LOG2)
-#define KBASE_TRACE_MASK ((1 << KBASE_TRACE_SIZE_LOG2)-1)
-
-#include "mali_kbase_js_defs.h"
-#include "mali_kbase_hwaccess_defs.h"
-
-#define KBASEP_FORCE_REPLAY_DISABLED 0
-
-/* Maximum force replay limit when randomization is enabled */
-#define KBASEP_FORCE_REPLAY_RANDOM_LIMIT 16
-
-/** Atom has been previously soft-stoppped */
-#define KBASE_KATOM_FLAG_BEEN_SOFT_STOPPPED (1<<1)
-/** Atom has been previously retried to execute */
-#define KBASE_KATOM_FLAGS_RERUN (1<<2)
-#define KBASE_KATOM_FLAGS_JOBCHAIN (1<<3)
-/** Atom has been previously hard-stopped. */
-#define KBASE_KATOM_FLAG_BEEN_HARD_STOPPED (1<<4)
-/** Atom has caused us to enter disjoint state */
-#define KBASE_KATOM_FLAG_IN_DISJOINT (1<<5)
-/* Atom blocked on cross-slot dependency */
-#define KBASE_KATOM_FLAG_X_DEP_BLOCKED (1<<7)
-/* Atom has fail dependency on cross-slot dependency */
-#define KBASE_KATOM_FLAG_FAIL_BLOCKER (1<<8)
-/* Atom is currently in the list of atoms blocked on cross-slot dependencies */
-#define KBASE_KATOM_FLAG_JSCTX_IN_X_DEP_LIST (1<<9)
-/* Atom is currently holding a context reference */
-#define KBASE_KATOM_FLAG_HOLDING_CTX_REF (1<<10)
-/* Atom requires GPU to be in protected mode */
-#define KBASE_KATOM_FLAG_PROTECTED (1<<11)
-/* Atom has been stored in runnable_tree */
-#define KBASE_KATOM_FLAG_JSCTX_IN_TREE (1<<12)
-
-/* SW related flags about types of JS_COMMAND action
- * NOTE: These must be masked off by JS_COMMAND_MASK */
-
-/** This command causes a disjoint event */
-#define JS_COMMAND_SW_CAUSES_DISJOINT 0x100
-
-/** Bitmask of all SW related flags */
-#define JS_COMMAND_SW_BITS  (JS_COMMAND_SW_CAUSES_DISJOINT)
-
-#if (JS_COMMAND_SW_BITS & JS_COMMAND_MASK)
-#error JS_COMMAND_SW_BITS not masked off by JS_COMMAND_MASK. Must update JS_COMMAND_SW_<..> bitmasks
-#endif
-
-/** Soft-stop command that causes a Disjoint event. This of course isn't
- *  entirely masked off by JS_COMMAND_MASK */
-#define JS_COMMAND_SOFT_STOP_WITH_SW_DISJOINT \
-		(JS_COMMAND_SW_CAUSES_DISJOINT | JS_COMMAND_SOFT_STOP)
-
-#define KBASEP_ATOM_ID_INVALID BASE_JD_ATOM_COUNT
-
-/* Serialize atoms within a slot (ie only one atom per job slot) */
-#define KBASE_SERIALIZE_INTRA_SLOT (1 << 0)
-/* Serialize atoms between slots (ie only one job slot running at any time) */
-#define KBASE_SERIALIZE_INTER_SLOT (1 << 1)
-/* Reset the GPU after each atom completion */
-#define KBASE_SERIALIZE_RESET (1 << 2)
-
-/* Forward declarations */
-struct kbase_context;
-struct kbase_device;
-struct kbase_as;
-struct kbase_mmu_setup;
-
-#ifdef CONFIG_DEBUG_FS
-struct base_job_fault_event {
-
-	u32 event_code;
-	struct kbase_jd_atom *katom;
-	struct work_struct job_fault_work;
-	struct list_head head;
-	int reg_offset;
-};
-
-#endif
-
-struct kbase_jd_atom_dependency {
-	struct kbase_jd_atom *atom;
-	u8 dep_type;
-};
-
-/**
- * struct kbase_io_access - holds information about 1 register access
- *
- * @addr: first bit indicates r/w (r=0, w=1)
- * @value: value written or read
- */
-struct kbase_io_access {
-	uintptr_t addr;
-	u32 value;
-};
-
-/**
- * struct kbase_io_history - keeps track of all recent register accesses
- *
- * @enabled: true if register accesses are recorded, false otherwise
- * @lock: spinlock protecting kbase_io_access array
- * @count: number of registers read/written
- * @size: number of elements in kbase_io_access array
- * @buf: array of kbase_io_access
- */
-struct kbase_io_history {
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
-	bool enabled;
-#else
-	u32 enabled;
-#endif
-
-	spinlock_t lock;
-	size_t count;
-	u16 size;
-	struct kbase_io_access *buf;
-};
-
-/**
- * @brief The function retrieves a read-only reference to the atom field from
- * the  kbase_jd_atom_dependency structure
- *
- * @param[in] dep kbase jd atom dependency.
- *
- * @return readonly reference to dependent ATOM.
- */
-static inline const struct kbase_jd_atom * kbase_jd_katom_dep_atom(const struct kbase_jd_atom_dependency *dep)
-{
-	LOCAL_ASSERT(dep != NULL);
-
-	return (const struct kbase_jd_atom *)(dep->atom);
-}
-
-/**
- * @brief The function retrieves a read-only reference to the dependency type field from
- * the  kbase_jd_atom_dependency structure
- *
- * @param[in] dep kbase jd atom dependency.
- *
- * @return A dependency type value.
- */
-static inline u8 kbase_jd_katom_dep_type(const struct kbase_jd_atom_dependency *dep)
-{
-	LOCAL_ASSERT(dep != NULL);
-
-	return dep->dep_type;
-}
-
-/**
- * @brief Setter macro for dep_atom array entry in kbase_jd_atom
- *
- * @param[in] dep    The kbase jd atom dependency.
- * @param[in] a      The ATOM to be set as a dependency.
- * @param     type   The ATOM dependency type to be set.
- *
- */
-static inline void kbase_jd_katom_dep_set(const struct kbase_jd_atom_dependency *const_dep,
-		struct kbase_jd_atom *a, u8 type)
-{
-	struct kbase_jd_atom_dependency *dep;
-
-	LOCAL_ASSERT(const_dep != NULL);
-
-	dep = (struct kbase_jd_atom_dependency *)const_dep;
-
-	dep->atom = a;
-	dep->dep_type = type;
-}
-
-/**
- * @brief Setter macro for dep_atom array entry in kbase_jd_atom
- *
- * @param[in] dep    The kbase jd atom dependency to be cleared.
- *
- */
-static inline void kbase_jd_katom_dep_clear(const struct kbase_jd_atom_dependency *const_dep)
-{
-	struct kbase_jd_atom_dependency *dep;
-
-	LOCAL_ASSERT(const_dep != NULL);
-
-	dep = (struct kbase_jd_atom_dependency *)const_dep;
-
-	dep->atom = NULL;
-	dep->dep_type = BASE_JD_DEP_TYPE_INVALID;
-}
-
-enum kbase_atom_gpu_rb_state {
-	/* Atom is not currently present in slot ringbuffer */
-	KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB,
-	/* Atom is in slot ringbuffer but is blocked on a previous atom */
-	KBASE_ATOM_GPU_RB_WAITING_BLOCKED,
-	/* Atom is in slot ringbuffer but is waiting for a previous protected
-	 * mode transition to complete */
-	KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_PREV,
-	/* Atom is in slot ringbuffer but is waiting for proected mode
-	 * transition */
-	KBASE_ATOM_GPU_RB_WAITING_PROTECTED_MODE_TRANSITION,
-	/* Atom is in slot ringbuffer but is waiting for cores to become
-	 * available */
-	KBASE_ATOM_GPU_RB_WAITING_FOR_CORE_AVAILABLE,
-	/* Atom is in slot ringbuffer but is blocked on affinity */
-	KBASE_ATOM_GPU_RB_WAITING_AFFINITY,
-	/* Atom is in slot ringbuffer and ready to run */
-	KBASE_ATOM_GPU_RB_READY,
-	/* Atom is in slot ringbuffer and has been submitted to the GPU */
-	KBASE_ATOM_GPU_RB_SUBMITTED,
-	/* Atom must be returned to JS as soon as it reaches the head of the
-	 * ringbuffer due to a previous failure */
-	KBASE_ATOM_GPU_RB_RETURN_TO_JS = -1
-};
-
-enum kbase_atom_enter_protected_state {
-	/*
-	 * Starting state:
-	 * Check if a transition into protected mode is required.
-	 *
-	 * NOTE: The integer value of this must
-	 *       match KBASE_ATOM_EXIT_PROTECTED_CHECK.
-	 */
-	KBASE_ATOM_ENTER_PROTECTED_CHECK = 0,
-	/* Wait for vinstr to suspend. */
-	KBASE_ATOM_ENTER_PROTECTED_VINSTR,
-	/* Wait for the L2 to become idle in preparation for
-	 * the coherency change. */
-	KBASE_ATOM_ENTER_PROTECTED_IDLE_L2,
-	/* End state;
-	 * Prepare coherency change. */
-	KBASE_ATOM_ENTER_PROTECTED_FINISHED,
-};
-
-enum kbase_atom_exit_protected_state {
-	/*
-	 * Starting state:
-	 * Check if a transition out of protected mode is required.
-	 *
-	 * NOTE: The integer value of this must
-	 *       match KBASE_ATOM_ENTER_PROTECTED_CHECK.
-	 */
-	KBASE_ATOM_EXIT_PROTECTED_CHECK = 0,
-	/* Wait for the L2 to become idle in preparation
-	 * for the reset. */
-	KBASE_ATOM_EXIT_PROTECTED_IDLE_L2,
-	/* Issue the protected reset. */
-	KBASE_ATOM_EXIT_PROTECTED_RESET,
-	/* End state;
-	 * Wait for the reset to complete. */
-	KBASE_ATOM_EXIT_PROTECTED_RESET_WAIT,
-};
-
-struct kbase_ext_res {
-	u64 gpu_address;
-	struct kbase_mem_phy_alloc *alloc;
-};
-
-struct kbase_jd_atom {
-	struct work_struct work;
-	ktime_t start_timestamp;
-
-	struct base_jd_udata udata;
-	struct kbase_context *kctx;
-
-	struct list_head dep_head[2];
-	struct list_head dep_item[2];
-	const struct kbase_jd_atom_dependency dep[2];
-	/* List head used during job dispatch job_done processing - as
-	 * dependencies may not be entirely resolved at this point, we need to
-	 * use a separate list head. */
-	struct list_head jd_item;
-	/* true if atom's jd_item is currently on a list. Prevents atom being
-	 * processed twice. */
-	bool in_jd_list;
-
-	u16 nr_extres;
-	struct kbase_ext_res *extres;
-
-	u32 device_nr;
-	u64 affinity;
-	u64 jc;
-	enum kbase_atom_coreref_state coreref_state;
-#ifdef CONFIG_KDS
-	struct list_head node;
-	struct kds_resource_set *kds_rset;
-	bool kds_dep_satisfied;
-#endif				/* CONFIG_KDS */
-#if defined(CONFIG_SYNC)
-	/* Stores either an input or output fence, depending on soft-job type */
-	struct sync_fence *fence;
-	struct sync_fence_waiter sync_waiter;
-#endif				/* CONFIG_SYNC */
-#if defined(CONFIG_MALI_BIFROST_DMA_FENCE) || defined(CONFIG_SYNC_FILE)
-	struct {
-		/* Use the functions/API defined in mali_kbase_fence.h to
-		 * when working with this sub struct */
-#if defined(CONFIG_SYNC_FILE)
-		/* Input fence */
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-		struct fence *fence_in;
-#else
-		struct dma_fence *fence_in;
-#endif
-#endif
-		/* This points to the dma-buf output fence for this atom. If
-		 * this is NULL then there is no fence for this atom and the
-		 * following fields related to dma_fence may have invalid data.
-		 *
-		 * The context and seqno fields contain the details for this
-		 * fence.
-		 *
-		 * This fence is signaled when the katom is completed,
-		 * regardless of the event_code of the katom (signal also on
-		 * failure).
-		 */
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-		struct fence *fence;
-#else
-		struct dma_fence *fence;
-#endif
-		/* The dma-buf fence context number for this atom. A unique
-		 * context number is allocated to each katom in the context on
-		 * context creation.
-		 */
-		unsigned int context;
-		/* The dma-buf fence sequence number for this atom. This is
-		 * increased every time this katom uses dma-buf fence.
-		 */
-		atomic_t seqno;
-		/* This contains a list of all callbacks set up to wait on
-		 * other fences.  This atom must be held back from JS until all
-		 * these callbacks have been called and dep_count have reached
-		 * 0. The initial value of dep_count must be equal to the
-		 * number of callbacks on this list.
-		 *
-		 * This list is protected by jctx.lock. Callbacks are added to
-		 * this list when the atom is built and the wait are set up.
-		 * All the callbacks then stay on the list until all callbacks
-		 * have been called and the atom is queued, or cancelled, and
-		 * then all callbacks are taken off the list and freed.
-		 */
-		struct list_head callbacks;
-		/* Atomic counter of number of outstandind dma-buf fence
-		 * dependencies for this atom. When dep_count reaches 0 the
-		 * atom may be queued.
-		 *
-		 * The special value "-1" may only be set after the count
-		 * reaches 0, while holding jctx.lock. This indicates that the
-		 * atom has been handled, either queued in JS or cancelled.
-		 *
-		 * If anyone but the dma-fence worker sets this to -1 they must
-		 * ensure that any potentially queued worker must have
-		 * completed before allowing the atom to be marked as unused.
-		 * This can be done by flushing the fence work queue:
-		 * kctx->dma_fence.wq.
-		 */
-		atomic_t dep_count;
-	} dma_fence;
-#endif /* CONFIG_MALI_BIFROST_DMA_FENCE || CONFIG_SYNC_FILE*/
-
-	/* Note: refer to kbasep_js_atom_retained_state, which will take a copy of some of the following members */
-	enum base_jd_event_code event_code;
-	base_jd_core_req core_req;	    /**< core requirements */
-	/** Job Slot to retry submitting to if submission from IRQ handler failed
-	 *
-	 * NOTE: see if this can be unified into the another member e.g. the event */
-	int retry_submit_on_slot;
-
-	u32 ticks;
-	/* JS atom priority with respect to other atoms on its kctx. */
-	int sched_priority;
-
-	int poking;		/* BASE_HW_ISSUE_8316 */
-
-	wait_queue_head_t completed;
-	enum kbase_jd_atom_state status;
-#ifdef CONFIG_GPU_TRACEPOINTS
-	int work_id;
-#endif
-	/* Assigned after atom is completed. Used to check whether PRLAM-10676 workaround should be applied */
-	int slot_nr;
-
-	u32 atom_flags;
-
-	/* Number of times this atom has been retried. Used by replay soft job.
-	 */
-	int retry_count;
-
-	enum kbase_atom_gpu_rb_state gpu_rb_state;
-
-	u64 need_cache_flush_cores_retained;
-
-	atomic_t blocked;
-
-	/* Pointer to atom that this atom has same-slot dependency on */
-	struct kbase_jd_atom *pre_dep;
-	/* Pointer to atom that has same-slot dependency on this atom */
-	struct kbase_jd_atom *post_dep;
-
-	/* Pointer to atom that this atom has cross-slot dependency on */
-	struct kbase_jd_atom *x_pre_dep;
-	/* Pointer to atom that has cross-slot dependency on this atom */
-	struct kbase_jd_atom *x_post_dep;
-
-	/* The GPU's flush count recorded at the time of submission, used for
-	 * the cache flush optimisation */
-	u32 flush_id;
-
-	struct kbase_jd_atom_backend backend;
-#ifdef CONFIG_DEBUG_FS
-	struct base_job_fault_event fault_event;
-#endif
-
-	/* List head used for three different purposes:
-	 *  1. Overflow list for JS ring buffers. If an atom is ready to run,
-	 *     but there is no room in the JS ring buffer, then the atom is put
-	 *     on the ring buffer's overflow list using this list node.
-	 *  2. List of waiting soft jobs.
-	 */
-	struct list_head queue;
-
-	/* Used to keep track of all JIT free/alloc jobs in submission order
-	 */
-	struct list_head jit_node;
-	bool jit_blocked;
-
-	/* If non-zero, this indicates that the atom will fail with the set
-	 * event_code when the atom is processed. */
-	enum base_jd_event_code will_fail_event_code;
-
-	/* Atoms will only ever be transitioning into, or out of
-	 * protected mode so we do not need two separate fields.
-	 */
-	union {
-		enum kbase_atom_enter_protected_state enter;
-		enum kbase_atom_exit_protected_state exit;
-	} protected_state;
-
-	struct rb_node runnable_tree_node;
-
-	/* 'Age' of atom relative to other atoms in the context. */
-	u32 age;
-};
-
-static inline bool kbase_jd_katom_is_protected(const struct kbase_jd_atom *katom)
-{
-	return (bool)(katom->atom_flags & KBASE_KATOM_FLAG_PROTECTED);
-}
-
-/*
- * Theory of operations:
- *
- * Atom objects are statically allocated within the context structure.
- *
- * Each atom is the head of two lists, one for the "left" set of dependencies, one for the "right" set.
- */
-
-#define KBASE_JD_DEP_QUEUE_SIZE 256
-
-struct kbase_jd_context {
-	struct mutex lock;
-	struct kbasep_js_kctx_info sched_info;
-	struct kbase_jd_atom atoms[BASE_JD_ATOM_COUNT];
-
-	/** Tracks all job-dispatch jobs.  This includes those not tracked by
-	 * the scheduler: 'not ready to run' and 'dependency-only' jobs. */
-	u32 job_nr;
-
-	/** Waitq that reflects whether there are no jobs (including SW-only
-	 * dependency jobs). This is set when no jobs are present on the ctx,
-	 * and clear when there are jobs.
-	 *
-	 * @note: Job Dispatcher knows about more jobs than the Job Scheduler:
-	 * the Job Scheduler is unaware of jobs that are blocked on dependencies,
-	 * and SW-only dependency jobs.
-	 *
-	 * This waitq can be waited upon to find out when the context jobs are all
-	 * done/cancelled (including those that might've been blocked on
-	 * dependencies) - and so, whether it can be terminated. However, it should
-	 * only be terminated once it is not present in the run-pool (see
-	 * kbasep_js_kctx_info::ctx::is_scheduled).
-	 *
-	 * Since the waitq is only set under kbase_jd_context::lock,
-	 * the waiter should also briefly obtain and drop kbase_jd_context::lock to
-	 * guarentee that the setter has completed its work on the kbase_context
-	 *
-	 * This must be updated atomically with:
-	 * - kbase_jd_context::job_nr */
-	wait_queue_head_t zero_jobs_wait;
-
-	/** Job Done workqueue. */
-	struct workqueue_struct *job_done_wq;
-
-	spinlock_t tb_lock;
-	u32 *tb;
-	size_t tb_wrap_offset;
-
-#ifdef CONFIG_KDS
-	struct kds_callback kds_cb;
-#endif				/* CONFIG_KDS */
-#ifdef CONFIG_GPU_TRACEPOINTS
-	atomic_t work_id;
-#endif
-};
-
-struct kbase_device_info {
-	u32 features;
-};
-
-/** Poking state for BASE_HW_ISSUE_8316  */
-enum {
-	KBASE_AS_POKE_STATE_IN_FLIGHT     = 1<<0,
-	KBASE_AS_POKE_STATE_KILLING_POKE  = 1<<1
-};
-
-/** Poking state for BASE_HW_ISSUE_8316  */
-typedef u32 kbase_as_poke_state;
-
-struct kbase_mmu_setup {
-	u64	transtab;
-	u64	memattr;
-	u64	transcfg;
-};
-
-/**
- * Important: Our code makes assumptions that a struct kbase_as structure is always at
- * kbase_device->as[number]. This is used to recover the containing
- * struct kbase_device from a struct kbase_as structure.
- *
- * Therefore, struct kbase_as structures must not be allocated anywhere else.
- */
-struct kbase_as {
-	int number;
-
-	struct workqueue_struct *pf_wq;
-	struct work_struct work_pagefault;
-	struct work_struct work_busfault;
-	enum kbase_mmu_fault_type fault_type;
-	bool protected_mode;
-	u32 fault_status;
-	u64 fault_addr;
-	u64 fault_extra_addr;
-
-	struct kbase_mmu_setup current_setup;
-
-	/* BASE_HW_ISSUE_8316  */
-	struct workqueue_struct *poke_wq;
-	struct work_struct poke_work;
-	/** Protected by hwaccess_lock */
-	int poke_refcount;
-	/** Protected by hwaccess_lock */
-	kbase_as_poke_state poke_state;
-	struct hrtimer poke_timer;
-};
-
-static inline int kbase_as_has_bus_fault(struct kbase_as *as)
-{
-	return as->fault_type == KBASE_MMU_FAULT_TYPE_BUS;
-}
-
-static inline int kbase_as_has_page_fault(struct kbase_as *as)
-{
-	return as->fault_type == KBASE_MMU_FAULT_TYPE_PAGE;
-}
-
-struct kbasep_mem_device {
-	atomic_t used_pages;   /* Tracks usage of OS shared memory. Updated
-				   when OS memory is allocated/freed. */
-
-};
-
-#define KBASE_TRACE_CODE(X) KBASE_TRACE_CODE_ ## X
-
-enum kbase_trace_code {
-	/* IMPORTANT: USE OF SPECIAL #INCLUDE OF NON-STANDARD HEADER FILE
-	 * THIS MUST BE USED AT THE START OF THE ENUM */
-#define KBASE_TRACE_CODE_MAKE_CODE(X) KBASE_TRACE_CODE(X)
-#include "mali_kbase_trace_defs.h"
-#undef  KBASE_TRACE_CODE_MAKE_CODE
-	/* Comma on its own, to extend the list */
-	,
-	/* Must be the last in the enum */
-	KBASE_TRACE_CODE_COUNT
-};
-
-#define KBASE_TRACE_FLAG_REFCOUNT (((u8)1) << 0)
-#define KBASE_TRACE_FLAG_JOBSLOT  (((u8)1) << 1)
-
-struct kbase_trace {
-	struct timespec timestamp;
-	u32 thread_id;
-	u32 cpu;
-	void *ctx;
-	bool katom;
-	int atom_number;
-	u64 atom_udata[2];
-	u64 gpu_addr;
-	unsigned long info_val;
-	u8 code;
-	u8 jobslot;
-	u8 refcount;
-	u8 flags;
-};
-
-/** Event IDs for the power management framework.
- *
- * Any of these events might be missed, so they should not be relied upon to
- * find the precise state of the GPU at a particular time in the
- * trace. Overall, we should get a high percentage of these events for
- * statisical purposes, and so a few missing should not be a problem */
-enum kbase_timeline_pm_event {
-	/* helper for tests */
-	KBASEP_TIMELINE_PM_EVENT_FIRST,
-
-	/** Event reserved for backwards compatibility with 'init' events */
-	KBASE_TIMELINE_PM_EVENT_RESERVED_0 = KBASEP_TIMELINE_PM_EVENT_FIRST,
-
-	/** The power state of the device has changed.
-	 *
-	 * Specifically, the device has reached a desired or available state.
-	 */
-	KBASE_TIMELINE_PM_EVENT_GPU_STATE_CHANGED,
-
-	/** The GPU is becoming active.
-	 *
-	 * This event is sent when the first context is about to use the GPU.
-	 */
-	KBASE_TIMELINE_PM_EVENT_GPU_ACTIVE,
-
-	/** The GPU is becoming idle.
-	 *
-	 * This event is sent when the last context has finished using the GPU.
-	 */
-	KBASE_TIMELINE_PM_EVENT_GPU_IDLE,
-
-	/** Event reserved for backwards compatibility with 'policy_change'
-	 * events */
-	KBASE_TIMELINE_PM_EVENT_RESERVED_4,
-
-	/** Event reserved for backwards compatibility with 'system_suspend'
-	 * events */
-	KBASE_TIMELINE_PM_EVENT_RESERVED_5,
-
-	/** Event reserved for backwards compatibility with 'system_resume'
-	 * events */
-	KBASE_TIMELINE_PM_EVENT_RESERVED_6,
-
-	/** The job scheduler is requesting to power up/down cores.
-	 *
-	 * This event is sent when:
-	 * - powered down cores are needed to complete a job
-	 * - powered up cores are not needed anymore
-	 */
-	KBASE_TIMELINE_PM_EVENT_CHANGE_GPU_STATE,
-
-	KBASEP_TIMELINE_PM_EVENT_LAST = KBASE_TIMELINE_PM_EVENT_CHANGE_GPU_STATE,
-};
-
-#ifdef CONFIG_MALI_BIFROST_TRACE_TIMELINE
-struct kbase_trace_kctx_timeline {
-	atomic_t jd_atoms_in_flight;
-	u32 owner_tgid;
-};
-
-struct kbase_trace_kbdev_timeline {
-	/* Note: strictly speaking, not needed, because it's in sync with
-	 * kbase_device::jm_slots[]::submitted_nr
-	 *
-	 * But it's kept as an example of how to add global timeline tracking
-	 * information
-	 *
-	 * The caller must hold hwaccess_lock when accessing this */
-	u8 slot_atoms_submitted[BASE_JM_MAX_NR_SLOTS];
-
-	/* Last UID for each PM event */
-	atomic_t pm_event_uid[KBASEP_TIMELINE_PM_EVENT_LAST+1];
-	/* Counter for generating PM event UIDs */
-	atomic_t pm_event_uid_counter;
-	/*
-	 * L2 transition state - true indicates that the transition is ongoing
-	 * Expected to be protected by hwaccess_lock */
-	bool l2_transitioning;
-};
-#endif /* CONFIG_MALI_BIFROST_TRACE_TIMELINE */
-
-
-struct kbasep_kctx_list_element {
-	struct list_head link;
-	struct kbase_context *kctx;
-};
-
-/**
- * Data stored per device for power management.
- *
- * This structure contains data for the power management framework. There is one
- * instance of this structure per device in the system.
- */
-struct kbase_pm_device_data {
-	/**
-	 * The lock protecting Power Management structures accessed outside of
-	 * IRQ.
-	 *
-	 * This lock must also be held whenever the GPU is being powered on or
-	 * off.
-	 */
-	struct mutex lock;
-
-	/** The reference count of active contexts on this device. */
-	int active_count;
-	/** Flag indicating suspending/suspended */
-	bool suspending;
-	/* Wait queue set when active_count == 0 */
-	wait_queue_head_t zero_active_count_wait;
-
-	/**
-	 * Bit masks identifying the available shader cores that are specified
-	 * via sysfs. One mask per job slot.
-	 */
-	u64 debug_core_mask[BASE_JM_MAX_NR_SLOTS];
-	u64 debug_core_mask_all;
-
-	/**
-	 * Callback for initializing the runtime power management.
-	 *
-	 * @param kbdev The kbase device
-	 *
-	 * @return 0 on success, else error code
-	 */
-	 int (*callback_power_runtime_init)(struct kbase_device *kbdev);
-
-	/**
-	 * Callback for terminating the runtime power management.
-	 *
-	 * @param kbdev The kbase device
-	 */
-	void (*callback_power_runtime_term)(struct kbase_device *kbdev);
-
-	/* Time in milliseconds between each dvfs sample */
-	u32 dvfs_period;
-
-	/* Period of GPU poweroff timer */
-	ktime_t gpu_poweroff_time;
-
-	/* Number of ticks of GPU poweroff timer before shader is powered off */
-	int poweroff_shader_ticks;
-
-	/* Number of ticks of GPU poweroff timer before GPU is powered off */
-	int poweroff_gpu_ticks;
-
-	struct kbase_pm_backend_data backend;
-};
-
-/**
- * struct kbase_mem_pool - Page based memory pool for kctx/kbdev
- * @kbdev:     Kbase device where memory is used
- * @cur_size:  Number of free pages currently in the pool (may exceed @max_size
- *             in some corner cases)
- * @max_size:  Maximum number of free pages in the pool
- * @order:     order = 0 refers to a pool of 4 KB pages
- *             order = 9 refers to a pool of 2 MB pages (2^9 * 4KB = 2 MB)
- * @pool_lock: Lock protecting the pool - must be held when modifying @cur_size
- *             and @page_list
- * @page_list: List of free pages in the pool
- * @reclaim:   Shrinker for kernel reclaim of free pages
- * @next_pool: Pointer to next pool where pages can be allocated when this pool
- *             is empty. Pages will spill over to the next pool when this pool
- *             is full. Can be NULL if there is no next pool.
- */
-struct kbase_mem_pool {
-	struct kbase_device *kbdev;
-	size_t              cur_size;
-	size_t              max_size;
-	size_t		    order;
-	spinlock_t          pool_lock;
-	struct list_head    page_list;
-	struct shrinker     reclaim;
-
-	struct kbase_mem_pool *next_pool;
-};
-
-/**
- * struct kbase_devfreq_opp - Lookup table for converting between nominal OPP
- *                            frequency, and real frequency and core mask
- * @opp_freq:  Nominal OPP frequency
- * @real_freq: Real GPU frequency
- * @core_mask: Shader core mask
- */
-struct kbase_devfreq_opp {
-	u64 opp_freq;
-	u64 real_freq;
-	u64 core_mask;
-};
-
-struct kbase_mmu_mode {
-	void (*update)(struct kbase_context *kctx);
-	void (*get_as_setup)(struct kbase_context *kctx,
-			struct kbase_mmu_setup * const setup);
-	void (*disable_as)(struct kbase_device *kbdev, int as_nr);
-	phys_addr_t (*pte_to_phy_addr)(u64 entry);
-	int (*ate_is_valid)(u64 ate, unsigned int level);
-	int (*pte_is_valid)(u64 pte, unsigned int level);
-	void (*entry_set_ate)(u64 *entry, struct tagged_addr phy,
-			unsigned long flags, unsigned int level);
-	void (*entry_set_pte)(u64 *entry, phys_addr_t phy);
-	void (*entry_invalidate)(u64 *entry);
-};
-
-struct kbase_mmu_mode const *kbase_mmu_mode_get_lpae(void);
-struct kbase_mmu_mode const *kbase_mmu_mode_get_aarch64(void);
-
-
-#define DEVNAME_SIZE	16
-
-struct kbase_device {
-	s8 slot_submit_count_irq[BASE_JM_MAX_NR_SLOTS];
-
-	u32 hw_quirks_sc;
-	u32 hw_quirks_tiler;
-	u32 hw_quirks_mmu;
-	u32 hw_quirks_jm;
-
-	struct list_head entry;
-	struct device *dev;
-	struct miscdevice mdev;
-	u64 reg_start;
-	size_t reg_size;
-	void __iomem *reg;
-
-	struct {
-		int irq;
-		int flags;
-	} irqs[3];
-
-	struct clk *clock;
-#ifdef CONFIG_REGULATOR
-	struct regulator *regulator;
-#endif
-	char devname[DEVNAME_SIZE];
-
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-	void *model;
-	struct kmem_cache *irq_slab;
-	struct workqueue_struct *irq_workq;
-	atomic_t serving_job_irq;
-	atomic_t serving_gpu_irq;
-	atomic_t serving_mmu_irq;
-	spinlock_t reg_op_lock;
-#endif	/* CONFIG_MALI_BIFROST_NO_MALI */
-
-	struct kbase_pm_device_data pm;
-	struct kbasep_js_device_data js_data;
-	struct kbase_mem_pool mem_pool;
-	struct kbase_mem_pool lp_mem_pool;
-	struct kbasep_mem_device memdev;
-	struct kbase_mmu_mode const *mmu_mode;
-
-	struct kbase_as as[BASE_MAX_NR_AS];
-	/* The below variables (as_free and as_to_kctx) are managed by the
-	 * Context Scheduler. The kbasep_js_device_data::runpool_irq::lock must
-	 * be held whilst accessing these.
-	 */
-	u16 as_free; /* Bitpattern of free Address Spaces */
-	/* Mapping from active Address Spaces to kbase_context */
-	struct kbase_context *as_to_kctx[BASE_MAX_NR_AS];
-
-
-	spinlock_t mmu_mask_change;
-
-	struct kbase_gpu_props gpu_props;
-
-	/** List of SW workarounds for HW issues */
-	unsigned long hw_issues_mask[(BASE_HW_ISSUE_END + BITS_PER_LONG - 1) / BITS_PER_LONG];
-	/** List of features available */
-	unsigned long hw_features_mask[(BASE_HW_FEATURE_END + BITS_PER_LONG - 1) / BITS_PER_LONG];
-
-	/* Bitmaps of cores that are currently in use (running jobs).
-	 * These should be kept up to date by the job scheduler.
-	 *
-	 * pm.power_change_lock should be held when accessing these members.
-	 *
-	 * kbase_pm_check_transitions_nolock() should be called when bits are
-	 * cleared to update the power management system and allow transitions to
-	 * occur. */
-	u64 shader_inuse_bitmap;
-
-	/* Refcount for cores in use */
-	u32 shader_inuse_cnt[64];
-
-	/* Bitmaps of cores the JS needs for jobs ready to run */
-	u64 shader_needed_bitmap;
-
-	/* Refcount for cores needed */
-	u32 shader_needed_cnt[64];
-
-	u32 tiler_inuse_cnt;
-
-	u32 tiler_needed_cnt;
-
-	/* struct for keeping track of the disjoint information
-	 *
-	 * The state  is > 0 if the GPU is in a disjoint state. Otherwise 0
-	 * The count is the number of disjoint events that have occurred on the GPU
-	 */
-	struct {
-		atomic_t count;
-		atomic_t state;
-	} disjoint_event;
-
-	/* Refcount for tracking users of the l2 cache, e.g. when using hardware counter instrumentation. */
-	u32 l2_users_count;
-
-	/* Bitmaps of cores that are currently available (powered up and the power policy is happy for jobs to be
-	 * submitted to these cores. These are updated by the power management code. The job scheduler should avoid
-	 * submitting new jobs to any cores that are not marked as available.
-	 *
-	 * pm.power_change_lock should be held when accessing these members.
-	 */
-	u64 shader_available_bitmap;
-	u64 tiler_available_bitmap;
-	u64 l2_available_bitmap;
-	u64 stack_available_bitmap;
-
-	u64 shader_ready_bitmap;
-	u64 shader_transitioning_bitmap;
-
-	s8 nr_hw_address_spaces;			  /**< Number of address spaces in the GPU (constant after driver initialisation) */
-	s8 nr_user_address_spaces;			  /**< Number of address spaces available to user contexts */
-
-	/* Structure used for instrumentation and HW counters dumping */
-	struct kbase_hwcnt {
-		/* The lock should be used when accessing any of the following members */
-		spinlock_t lock;
-
-		struct kbase_context *kctx;
-		u64 addr;
-
-		struct kbase_instr_backend backend;
-	} hwcnt;
-
-	struct kbase_vinstr_context *vinstr_ctx;
-
-#if KBASE_TRACE_ENABLE
-	spinlock_t              trace_lock;
-	u16                     trace_first_out;
-	u16                     trace_next_in;
-	struct kbase_trace            *trace_rbuf;
-#endif
-
-	u32 reset_timeout_ms;
-
-	struct mutex cacheclean_lock;
-
-	/* Platform specific private data to be accessed by mali_kbase_config_xxx.c only */
-	void *platform_context;
-
-	/* List of kbase_contexts created */
-	struct list_head        kctx_list;
-	struct mutex            kctx_list_lock;
-
-#ifdef CONFIG_MALI_BIFROST_DEVFREQ
-	struct devfreq_dev_profile devfreq_profile;
-	struct devfreq *devfreq;
-	unsigned long current_freq;
-	unsigned long current_nominal_freq;
-	unsigned long current_voltage;
-	u64 current_core_mask;
-	struct kbase_devfreq_opp *opp_table;
-	int num_opps;
-	struct monitor_dev_info *mdev_info;
-	struct ipa_power_model_data *model_data;
-#ifdef CONFIG_DEVFREQ_THERMAL
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 0)
-	struct devfreq_cooling_device *devfreq_cooling;
-#else
-	struct thermal_cooling_device *devfreq_cooling;
-#endif
-	/* Current IPA model - true for configured model, false for fallback */
-	atomic_t ipa_use_configured_model;
-	struct {
-		/* Access to this struct must be with ipa.lock held */
-		struct mutex lock;
-		struct kbase_ipa_model *configured_model;
-		struct kbase_ipa_model *fallback_model;
-	} ipa;
-#endif /* CONFIG_DEVFREQ_THERMAL */
-#endif /* CONFIG_MALI_BIFROST_DEVFREQ */
-
-
-#ifdef CONFIG_MALI_BIFROST_TRACE_TIMELINE
-	struct kbase_trace_kbdev_timeline timeline;
-#endif
-
-	/*
-	 * Control for enabling job dump on failure, set when control debugfs
-	 * is opened.
-	 */
-	bool job_fault_debug;
-
-#ifdef CONFIG_DEBUG_FS
-	/* directory for debugfs entries */
-	struct dentry *mali_debugfs_directory;
-	/* Root directory for per context entry */
-	struct dentry *debugfs_ctx_directory;
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-	/* bit for each as, set if there is new data to report */
-	u64 debugfs_as_read_bitmap;
-#endif /* CONFIG_MALI_BIFROST_DEBUG */
-
-	/* failed job dump, used for separate debug process */
-	wait_queue_head_t job_fault_wq;
-	wait_queue_head_t job_fault_resume_wq;
-	struct workqueue_struct *job_fault_resume_workq;
-	struct list_head job_fault_event_list;
-	spinlock_t job_fault_event_lock;
-	struct kbase_context *kctx_fault;
-
-#if !MALI_CUSTOMER_RELEASE
-	/* Per-device data for register dumping interface */
-	struct {
-		u16 reg_offset; /* Offset of a GPU_CONTROL register to be
-				   dumped upon request */
-	} regs_dump_debugfs_data;
-#endif /* !MALI_CUSTOMER_RELEASE */
-#endif /* CONFIG_DEBUG_FS */
-
-	/* fbdump profiling controls set by gator */
-	u32 kbase_profiling_controls[FBDUMP_CONTROL_MAX];
-
-
-#if MALI_CUSTOMER_RELEASE == 0
-	/* Number of jobs that are run before a job is forced to fail and
-	 * replay. May be KBASEP_FORCE_REPLAY_DISABLED, to disable forced
-	 * failures. */
-	int force_replay_limit;
-	/* Count of jobs between forced failures. Incremented on each job. A
-	 * job is forced to fail once this is greater than or equal to
-	 * force_replay_limit. */
-	int force_replay_count;
-	/* Core requirement for jobs to be failed and replayed. May be zero. */
-	base_jd_core_req force_replay_core_req;
-	/* true if force_replay_limit should be randomized. The random
-	 * value will be in the range of 1 - KBASEP_FORCE_REPLAY_RANDOM_LIMIT.
-	 */
-	bool force_replay_random;
-#endif
-
-	/* Total number of created contexts */
-	atomic_t ctx_num;
-
-#ifdef CONFIG_DEBUG_FS
-	/* Holds the most recent register accesses */
-	struct kbase_io_history io_history;
-#endif /* CONFIG_DEBUG_FS */
-
-	struct kbase_hwaccess_data hwaccess;
-
-	/* Count of page/bus faults waiting for workqueues to process */
-	atomic_t faults_pending;
-
-	/* true if GPU is powered off or power off operation is in progress */
-	bool poweroff_pending;
-
-
-	/* defaults for new context created for this device */
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
-	bool infinite_cache_active_default;
-#else
-	u32 infinite_cache_active_default;
-#endif
-	size_t mem_pool_max_size_default;
-
-	/* current gpu coherency mode */
-	u32 current_gpu_coherency_mode;
-	/* system coherency mode  */
-	u32 system_coherency;
-	/* Flag to track when cci snoops have been enabled on the interface */
-	bool cci_snoop_enabled;
-
-	/* SMC function IDs to call into Trusted firmware to enable/disable
-	 * cache snooping. Value of 0 indicates that they are not used
-	 */
-	u32 snoop_enable_smc;
-	u32 snoop_disable_smc;
-
-	/* Protected mode operations */
-	struct protected_mode_ops *protected_ops;
-
-	/* Protected device attached to this kbase device */
-	struct protected_mode_device *protected_dev;
-
-	/*
-	 * true when GPU is put into protected mode
-	 */
-	bool protected_mode;
-
-	/*
-	 * true when GPU is transitioning into or out of protected mode
-	 */
-	bool protected_mode_transition;
-
-	/*
-	 * true if protected mode is supported
-	 */
-	bool protected_mode_support;
-
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-	wait_queue_head_t driver_inactive_wait;
-	bool driver_inactive;
-#endif /* CONFIG_MALI_BIFROST_DEBUG */
-
-#ifdef CONFIG_MALI_FPGA_BUS_LOGGER
-	/*
-	 * Bus logger integration.
-	 */
-	struct bus_logger_client *buslogger;
-#endif
-	/* Boolean indicating if an IRQ flush during reset is in progress. */
-	bool irq_reset_flush;
-
-	/* list of inited sub systems. Used during terminate/error recovery */
-	u32 inited_subsys;
-
-	spinlock_t hwaccess_lock;
-
-	/* Protects access to MMU operations */
-	struct mutex mmu_hw_mutex;
-
-	/* Current serialization mode. See KBASE_SERIALIZE_* for details */
-	u8 serialize_jobs;
-};
-
-/**
- * struct jsctx_queue - JS context atom queue
- * @runnable_tree: Root of RB-tree containing currently runnable atoms on this
- *                 job slot.
- * @x_dep_head:    Head item of the linked list of atoms blocked on cross-slot
- *                 dependencies. Atoms on this list will be moved to the
- *                 runnable_tree when the blocking atom completes.
- *
- * hwaccess_lock must be held when accessing this structure.
- */
-struct jsctx_queue {
-	struct rb_root runnable_tree;
-	struct list_head x_dep_head;
-};
-
-
-#define KBASE_API_VERSION(major, minor) ((((major) & 0xFFF) << 20)  | \
-					 (((minor) & 0xFFF) << 8) | \
-					 ((0 & 0xFF) << 0))
-
-/**
- * enum kbase_context_flags - Flags for kbase contexts
- *
- * @KCTX_COMPAT: Set when the context process is a compat process, 32-bit
- * process on a 64-bit kernel.
- *
- * @KCTX_RUNNABLE_REF: Set when context is counted in
- * kbdev->js_data.nr_contexts_runnable. Must hold queue_mutex when accessing.
- *
- * @KCTX_ACTIVE: Set when the context is active.
- *
- * @KCTX_PULLED: Set when last kick() caused atoms to be pulled from this
- * context.
- *
- * @KCTX_MEM_PROFILE_INITIALIZED: Set when the context's memory profile has been
- * initialized.
- *
- * @KCTX_INFINITE_CACHE: Set when infinite cache is to be enabled for new
- * allocations. Existing allocations will not change.
- *
- * @KCTX_SUBMIT_DISABLED: Set to prevent context from submitting any jobs.
- *
- * @KCTX_PRIVILEGED:Set if the context uses an address space and should be kept
- * scheduled in.
- *
- * @KCTX_SCHEDULED: Set when the context is scheduled on the Run Pool.
- * This is only ever updated whilst the jsctx_mutex is held.
- *
- * @KCTX_DYING: Set when the context process is in the process of being evicted.
- *
- * @KCTX_NO_IMPLICIT_SYNC: Set when explicit Android fences are in use on this
- * context, to disable use of implicit dma-buf fences. This is used to avoid
- * potential synchronization deadlocks.
- *
- * All members need to be separate bits. This enum is intended for use in a
- * bitmask where multiple values get OR-ed together.
- */
-enum kbase_context_flags {
-	KCTX_COMPAT = 1U << 0,
-	KCTX_RUNNABLE_REF = 1U << 1,
-	KCTX_ACTIVE = 1U << 2,
-	KCTX_PULLED = 1U << 3,
-	KCTX_MEM_PROFILE_INITIALIZED = 1U << 4,
-	KCTX_INFINITE_CACHE = 1U << 5,
-	KCTX_SUBMIT_DISABLED = 1U << 6,
-	KCTX_PRIVILEGED = 1U << 7,
-	KCTX_SCHEDULED = 1U << 8,
-	KCTX_DYING = 1U << 9,
-	KCTX_NO_IMPLICIT_SYNC = 1U << 10,
-};
-
-struct kbase_sub_alloc {
-	struct list_head link;
-	struct page *page;
-	DECLARE_BITMAP(sub_pages, SZ_2M / SZ_4K);
-};
-
-struct kbase_context {
-	struct file *filp;
-	struct kbase_device *kbdev;
-	u32 id; /* System wide unique id */
-	unsigned long api_version;
-	phys_addr_t pgd;
-	struct list_head event_list;
-	struct list_head event_coalesce_list;
-	struct mutex event_mutex;
-	atomic_t event_closed;
-	struct workqueue_struct *event_workq;
-	atomic_t event_count;
-	int event_coalesce_count;
-
-	atomic_t flags;
-
-	atomic_t                setup_complete;
-	atomic_t                setup_in_progress;
-
-	u64 *mmu_teardown_pages;
-
-	struct tagged_addr aliasing_sink_page;
-
-	struct mutex            mem_partials_lock;
-	struct list_head        mem_partials;
-
-	struct mutex            mmu_lock;
-	struct mutex            reg_lock; /* To be converted to a rwlock? */
-	struct rb_root reg_rbtree_same; /* RB tree of GPU (live) regions,
-					 * SAME_VA zone */
-	struct rb_root reg_rbtree_exec; /* RB tree of GPU (live) regions,
-					 * EXEC zone */
-	struct rb_root reg_rbtree_custom; /* RB tree of GPU (live) regions,
-					 * CUSTOM_VA zone */
-
-	unsigned long    cookies;
-	struct kbase_va_region *pending_regions[BITS_PER_LONG];
-
-	wait_queue_head_t event_queue;
-	pid_t tgid;
-	pid_t pid;
-
-	struct kbase_jd_context jctx;
-	atomic_t used_pages;
-	atomic_t         nonmapped_pages;
-
-	struct kbase_mem_pool mem_pool;
-	struct kbase_mem_pool lp_mem_pool;
-
-	struct shrinker         reclaim;
-	struct list_head        evict_list;
-
-	struct list_head waiting_soft_jobs;
-	spinlock_t waiting_soft_jobs_lock;
-#ifdef CONFIG_KDS
-	struct list_head waiting_kds_resource;
-#endif
-#ifdef CONFIG_MALI_BIFROST_DMA_FENCE
-	struct {
-		struct list_head waiting_resource;
-		struct workqueue_struct *wq;
-	} dma_fence;
-#endif /* CONFIG_MALI_BIFROST_DMA_FENCE */
-	/** This is effectively part of the Run Pool, because it only has a valid
-	 * setting (!=KBASEP_AS_NR_INVALID) whilst the context is scheduled in
-	 *
-	 * The hwaccess_lock must be held whilst accessing this.
-	 *
-	 * If the context relating to this as_nr is required, you must use
-	 * kbasep_js_runpool_retain_ctx() to ensure that the context doesn't disappear
-	 * whilst you're using it. Alternatively, just hold the hwaccess_lock
-	 * to ensure the context doesn't disappear (but this has restrictions on what other locks
-	 * you can take whilst doing this) */
-	int as_nr;
-
-	/* Keeps track of the number of users of this context. A user can be a
-	 * job that is available for execution, instrumentation needing to 'pin'
-	 * a context for counter collection, etc. If the refcount reaches 0 then
-	 * this context is considered inactive and the previously programmed
-	 * AS might be cleared at any point.
-	 */
-	atomic_t refcount;
-
-	/* NOTE:
-	 *
-	 * Flags are in jctx.sched_info.ctx.flags
-	 * Mutable flags *must* be accessed under jctx.sched_info.ctx.jsctx_mutex
-	 *
-	 * All other flags must be added there */
-	spinlock_t         mm_update_lock;
-	struct mm_struct *process_mm;
-	/* End of the SAME_VA zone */
-	u64 same_va_end;
-
-#ifdef CONFIG_MALI_BIFROST_TRACE_TIMELINE
-	struct kbase_trace_kctx_timeline timeline;
-#endif
-#ifdef CONFIG_DEBUG_FS
-	/* Content of mem_profile file */
-	char *mem_profile_data;
-	/* Size of @c mem_profile_data */
-	size_t mem_profile_size;
-	/* Mutex guarding memory profile state */
-	struct mutex mem_profile_lock;
-	/* Memory profile directory under debugfs */
-	struct dentry *kctx_dentry;
-
-	/* for job fault debug */
-	unsigned int *reg_dump;
-	atomic_t job_fault_count;
-	/* This list will keep the following atoms during the dump
-	 * in the same context
-	 */
-	struct list_head job_fault_resume_event_list;
-
-#endif /* CONFIG_DEBUG_FS */
-
-	struct jsctx_queue jsctx_queue
-		[KBASE_JS_ATOM_SCHED_PRIO_COUNT][BASE_JM_MAX_NR_SLOTS];
-
-	/* Number of atoms currently pulled from this context */
-	atomic_t atoms_pulled;
-	/* Number of atoms currently pulled from this context, per slot */
-	atomic_t atoms_pulled_slot[BASE_JM_MAX_NR_SLOTS];
-	/* Number of atoms currently pulled from this context, per slot and
-	 * priority. Hold hwaccess_lock when accessing */
-	int atoms_pulled_slot_pri[BASE_JM_MAX_NR_SLOTS][
-			KBASE_JS_ATOM_SCHED_PRIO_COUNT];
-
-	/* true if slot is blocked on the given priority. This will be set on a
-	 * soft-stop */
-	bool blocked_js[BASE_JM_MAX_NR_SLOTS][KBASE_JS_ATOM_SCHED_PRIO_COUNT];
-
-	/* Bitmask of slots that can be pulled from */
-	u32 slots_pullable;
-
-	/* Backend specific data */
-	struct kbase_context_backend backend;
-
-	/* Work structure used for deferred ASID assignment */
-	struct work_struct work;
-
-	/* Only one userspace vinstr client per kbase context */
-	struct kbase_vinstr_client *vinstr_cli;
-	struct mutex vinstr_cli_lock;
-
-	/* List of completed jobs waiting for events to be posted */
-	struct list_head completed_jobs;
-	/* Number of work items currently pending on job_done_wq */
-	atomic_t work_count;
-
-	/* Waiting soft-jobs will fail when this timer expires */
-	struct timer_list soft_job_timeout;
-
-	/* JIT allocation management */
-	struct kbase_va_region *jit_alloc[256];
-	struct list_head jit_active_head;
-	struct list_head jit_pool_head;
-	struct list_head jit_destroy_head;
-	struct mutex jit_evict_lock;
-	struct work_struct jit_work;
-
-	/* A list of the JIT soft-jobs in submission order
-	 * (protected by kbase_jd_context.lock)
-	 */
-	struct list_head jit_atoms_head;
-	/* A list of pending JIT alloc soft-jobs (using the 'queue' list_head)
-	 * (protected by kbase_jd_context.lock)
-	 */
-	struct list_head jit_pending_alloc;
-
-	/* External sticky resource management */
-	struct list_head ext_res_meta_head;
-
-	/* Used to record that a drain was requested from atomic context */
-	atomic_t drain_pending;
-
-	/* Current age count, used to determine age for newly submitted atoms */
-	u32 age_count;
-};
-
-/**
- * struct kbase_ctx_ext_res_meta - Structure which binds an external resource
- *                                 to a @kbase_context.
- * @ext_res_node:                  List head for adding the metadata to a
- *                                 @kbase_context.
- * @alloc:                         The physical memory allocation structure
- *                                 which is mapped.
- * @gpu_addr:                      The GPU virtual address the resource is
- *                                 mapped to.
- *
- * External resources can be mapped into multiple contexts as well as the same
- * context multiple times.
- * As kbase_va_region itself isn't refcounted we can't attach our extra
- * information to it as it could be removed under our feet leaving external
- * resources pinned.
- * This metadata structure binds a single external resource to a single
- * context, ensuring that per context mapping is tracked separately so it can
- * be overridden when needed and abuses by the application (freeing the resource
- * multiple times) don't effect the refcount of the physical allocation.
- */
-struct kbase_ctx_ext_res_meta {
-	struct list_head ext_res_node;
-	struct kbase_mem_phy_alloc *alloc;
-	u64 gpu_addr;
-};
-
-enum kbase_reg_access_type {
-	REG_READ,
-	REG_WRITE
-};
-
-enum kbase_share_attr_bits {
-	/* (1ULL << 8) bit is reserved */
-	SHARE_BOTH_BITS = (2ULL << 8),	/* inner and outer shareable coherency */
-	SHARE_INNER_BITS = (3ULL << 8)	/* inner shareable coherency */
-};
-
-/**
- * kbase_device_is_cpu_coherent - Returns if the device is CPU coherent.
- * @kbdev: kbase device
- *
- * Return: true if the device access are coherent, false if not.
- */
-static inline bool kbase_device_is_cpu_coherent(struct kbase_device *kbdev)
-{
-	if ((kbdev->system_coherency == COHERENCY_ACE_LITE) ||
-			(kbdev->system_coherency == COHERENCY_ACE))
-		return true;
-
-	return false;
-}
-
-/* Conversion helpers for setting up high resolution timers */
-#define HR_TIMER_DELAY_MSEC(x) (ns_to_ktime(((u64)(x))*1000000U))
-#define HR_TIMER_DELAY_NSEC(x) (ns_to_ktime(x))
-
-/* Maximum number of loops polling the GPU for a cache flush before we assume it must have completed */
-#define KBASE_CLEAN_CACHE_MAX_LOOPS     100000
-/* Maximum number of loops polling the GPU for an AS command to complete before we assume the GPU has hung */
-#define KBASE_AS_INACTIVE_MAX_LOOPS     100000
-
-/* Maximum number of times a job can be replayed */
-#define BASEP_JD_REPLAY_LIMIT 15
-
-/* JobDescriptorHeader - taken from the architecture specifications, the layout
- * is currently identical for all GPU archs. */
-struct job_descriptor_header {
-	u32 exception_status;
-	u32 first_incomplete_task;
-	u64 fault_pointer;
-	u8 job_descriptor_size : 1;
-	u8 job_type : 7;
-	u8 job_barrier : 1;
-	u8 _reserved_01 : 1;
-	u8 _reserved_1 : 1;
-	u8 _reserved_02 : 1;
-	u8 _reserved_03 : 1;
-	u8 _reserved_2 : 1;
-	u8 _reserved_04 : 1;
-	u8 _reserved_05 : 1;
-	u16 job_index;
-	u16 job_dependency_index_1;
-	u16 job_dependency_index_2;
-	union {
-		u64 _64;
-		u32 _32;
-	} next_job;
-};
-
-#endif				/* _KBASE_DEFS_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_device.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_device.c
deleted file mode 100644
index 2d11f11f3be0..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_device.c
+++ /dev/null
@@ -1,674 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * Base kernel device APIs
- */
-
-#include <linux/debugfs.h>
-#include <linux/dma-mapping.h>
-#include <linux/seq_file.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/of_platform.h>
-
-#include <mali_kbase.h>
-#include <mali_kbase_defs.h>
-#include <mali_kbase_hwaccess_instr.h>
-#include <mali_kbase_hw.h>
-#include <mali_kbase_config_defaults.h>
-
-#include <mali_kbase_profiling_gator_api.h>
-
-/* NOTE: Magic - 0x45435254 (TRCE in ASCII).
- * Supports tracing feature provided in the base module.
- * Please keep it in sync with the value of base module.
- */
-#define TRACE_BUFFER_HEADER_SPECIAL 0x45435254
-
-#if KBASE_TRACE_ENABLE
-static const char *kbasep_trace_code_string[] = {
-	/* IMPORTANT: USE OF SPECIAL #INCLUDE OF NON-STANDARD HEADER FILE
-	 * THIS MUST BE USED AT THE START OF THE ARRAY */
-#define KBASE_TRACE_CODE_MAKE_CODE(X) # X
-#include "mali_kbase_trace_defs.h"
-#undef  KBASE_TRACE_CODE_MAKE_CODE
-};
-#endif
-
-#define DEBUG_MESSAGE_SIZE 256
-
-static int kbasep_trace_init(struct kbase_device *kbdev);
-static void kbasep_trace_term(struct kbase_device *kbdev);
-static void kbasep_trace_hook_wrapper(void *param);
-
-struct kbase_device *kbase_device_alloc(void)
-{
-	return kzalloc(sizeof(struct kbase_device), GFP_KERNEL);
-}
-
-static int kbase_device_as_init(struct kbase_device *kbdev, int i)
-{
-	const char format[] = "mali_mmu%d";
-	char name[sizeof(format)];
-	const char poke_format[] = "mali_mmu%d_poker";
-	char poke_name[sizeof(poke_format)];
-
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8316))
-		snprintf(poke_name, sizeof(poke_name), poke_format, i);
-
-	snprintf(name, sizeof(name), format, i);
-
-	kbdev->as[i].number = i;
-	kbdev->as[i].fault_addr = 0ULL;
-
-	kbdev->as[i].pf_wq = alloc_workqueue(name, 0, 1);
-	if (!kbdev->as[i].pf_wq)
-		return -EINVAL;
-
-	INIT_WORK(&kbdev->as[i].work_pagefault, page_fault_worker);
-	INIT_WORK(&kbdev->as[i].work_busfault, bus_fault_worker);
-
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8316)) {
-		struct hrtimer *poke_timer = &kbdev->as[i].poke_timer;
-		struct work_struct *poke_work = &kbdev->as[i].poke_work;
-
-		kbdev->as[i].poke_wq = alloc_workqueue(poke_name, 0, 1);
-		if (!kbdev->as[i].poke_wq) {
-			destroy_workqueue(kbdev->as[i].pf_wq);
-			return -EINVAL;
-		}
-		KBASE_DEBUG_ASSERT(!object_is_on_stack(poke_work));
-		INIT_WORK(poke_work, kbasep_as_do_poke);
-
-		hrtimer_init(poke_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
-
-		poke_timer->function = kbasep_as_poke_timer_callback;
-
-		kbdev->as[i].poke_refcount = 0;
-		kbdev->as[i].poke_state = 0u;
-	}
-
-	return 0;
-}
-
-static void kbase_device_as_term(struct kbase_device *kbdev, int i)
-{
-	destroy_workqueue(kbdev->as[i].pf_wq);
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8316))
-		destroy_workqueue(kbdev->as[i].poke_wq);
-}
-
-static int kbase_device_all_as_init(struct kbase_device *kbdev)
-{
-	int i, err;
-
-	for (i = 0; i < kbdev->nr_hw_address_spaces; i++) {
-		err = kbase_device_as_init(kbdev, i);
-		if (err)
-			goto free_workqs;
-	}
-
-	return 0;
-
-free_workqs:
-	for (; i > 0; i--)
-		kbase_device_as_term(kbdev, i);
-
-	return err;
-}
-
-static void kbase_device_all_as_term(struct kbase_device *kbdev)
-{
-	int i;
-
-	for (i = 0; i < kbdev->nr_hw_address_spaces; i++)
-		kbase_device_as_term(kbdev, i);
-}
-
-int kbase_device_init(struct kbase_device * const kbdev)
-{
-	int i, err;
-#ifdef CONFIG_ARM64
-	struct device_node *np = NULL;
-#endif /* CONFIG_ARM64 */
-
-	spin_lock_init(&kbdev->mmu_mask_change);
-	mutex_init(&kbdev->mmu_hw_mutex);
-#ifdef CONFIG_ARM64
-	kbdev->cci_snoop_enabled = false;
-	np = kbdev->dev->of_node;
-	if (np != NULL) {
-		if (of_property_read_u32(np, "snoop_enable_smc",
-					&kbdev->snoop_enable_smc))
-			kbdev->snoop_enable_smc = 0;
-		if (of_property_read_u32(np, "snoop_disable_smc",
-					&kbdev->snoop_disable_smc))
-			kbdev->snoop_disable_smc = 0;
-		/* Either both or none of the calls should be provided. */
-		if (!((kbdev->snoop_disable_smc == 0
-			&& kbdev->snoop_enable_smc == 0)
-			|| (kbdev->snoop_disable_smc != 0
-			&& kbdev->snoop_enable_smc != 0))) {
-			WARN_ON(1);
-			err = -EINVAL;
-			goto fail;
-		}
-	}
-#endif /* CONFIG_ARM64 */
-	/* Get the list of workarounds for issues on the current HW
-	 * (identified by the GPU_ID register)
-	 */
-	err = kbase_hw_set_issues_mask(kbdev);
-	if (err)
-		goto fail;
-
-	/* Set the list of features available on the current HW
-	 * (identified by the GPU_ID register)
-	 */
-	kbase_hw_set_features_mask(kbdev);
-
-	kbase_gpuprops_set_features(kbdev);
-
-	/* On Linux 4.0+, dma coherency is determined from device tree */
-#if defined(CONFIG_ARM64) && LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)
-	set_dma_ops(kbdev->dev, &noncoherent_swiotlb_dma_ops);
-#endif
-
-	/* Workaround a pre-3.13 Linux issue, where dma_mask is NULL when our
-	 * device structure was created by device-tree
-	 */
-	if (!kbdev->dev->dma_mask)
-		kbdev->dev->dma_mask = &kbdev->dev->coherent_dma_mask;
-
-	err = dma_set_mask(kbdev->dev,
-			DMA_BIT_MASK(kbdev->gpu_props.mmu.pa_bits));
-	if (err)
-		goto dma_set_mask_failed;
-
-	err = dma_set_coherent_mask(kbdev->dev,
-			DMA_BIT_MASK(kbdev->gpu_props.mmu.pa_bits));
-	if (err)
-		goto dma_set_mask_failed;
-
-	kbdev->nr_hw_address_spaces = kbdev->gpu_props.num_address_spaces;
-
-	err = kbase_device_all_as_init(kbdev);
-	if (err)
-		goto as_init_failed;
-
-	spin_lock_init(&kbdev->hwcnt.lock);
-
-	err = kbasep_trace_init(kbdev);
-	if (err)
-		goto term_as;
-
-	mutex_init(&kbdev->cacheclean_lock);
-
-#ifdef CONFIG_MALI_BIFROST_TRACE_TIMELINE
-	for (i = 0; i < BASE_JM_MAX_NR_SLOTS; ++i)
-		kbdev->timeline.slot_atoms_submitted[i] = 0;
-
-	for (i = 0; i <= KBASEP_TIMELINE_PM_EVENT_LAST; ++i)
-		atomic_set(&kbdev->timeline.pm_event_uid[i], 0);
-#endif /* CONFIG_MALI_BIFROST_TRACE_TIMELINE */
-
-	/* fbdump profiling controls set to 0 - fbdump not enabled until changed by gator */
-	for (i = 0; i < FBDUMP_CONTROL_MAX; i++)
-		kbdev->kbase_profiling_controls[i] = 0;
-
-	kbase_debug_assert_register_hook(&kbasep_trace_hook_wrapper, kbdev);
-
-	atomic_set(&kbdev->ctx_num, 0);
-
-	err = kbase_instr_backend_init(kbdev);
-	if (err)
-		goto term_trace;
-
-	kbdev->pm.dvfs_period = DEFAULT_PM_DVFS_PERIOD;
-
-	kbdev->reset_timeout_ms = DEFAULT_RESET_TIMEOUT_MS;
-
-	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_AARCH64_MMU))
-		kbdev->mmu_mode = kbase_mmu_mode_get_aarch64();
-	else
-		kbdev->mmu_mode = kbase_mmu_mode_get_lpae();
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-	init_waitqueue_head(&kbdev->driver_inactive_wait);
-#endif /* CONFIG_MALI_BIFROST_DEBUG */
-
-	return 0;
-term_trace:
-	kbasep_trace_term(kbdev);
-term_as:
-	kbase_device_all_as_term(kbdev);
-as_init_failed:
-dma_set_mask_failed:
-fail:
-	return err;
-}
-
-void kbase_device_term(struct kbase_device *kbdev)
-{
-	KBASE_DEBUG_ASSERT(kbdev);
-
-#if KBASE_TRACE_ENABLE
-	kbase_debug_assert_register_hook(NULL, NULL);
-#endif
-
-	kbase_instr_backend_term(kbdev);
-
-	kbasep_trace_term(kbdev);
-
-	kbase_device_all_as_term(kbdev);
-}
-
-void kbase_device_free(struct kbase_device *kbdev)
-{
-	kfree(kbdev);
-}
-
-int kbase_device_trace_buffer_install(
-		struct kbase_context *kctx, u32 *tb, size_t size)
-{
-	unsigned long flags;
-
-	KBASE_DEBUG_ASSERT(kctx);
-	KBASE_DEBUG_ASSERT(tb);
-
-	/* Interface uses 16-bit value to track last accessed entry. Each entry
-	 * is composed of two 32-bit words.
-	 * This limits the size that can be handled without an overflow. */
-	if (0xFFFF * (2 * sizeof(u32)) < size)
-		return -EINVAL;
-
-	/* set up the header */
-	/* magic number in the first 4 bytes */
-	tb[0] = TRACE_BUFFER_HEADER_SPECIAL;
-	/* Store (write offset = 0, wrap counter = 0, transaction active = no)
-	 * write offset 0 means never written.
-	 * Offsets 1 to (wrap_offset - 1) used to store values when trace started
-	 */
-	tb[1] = 0;
-
-	/* install trace buffer */
-	spin_lock_irqsave(&kctx->jctx.tb_lock, flags);
-	kctx->jctx.tb_wrap_offset = size / 8;
-	kctx->jctx.tb = tb;
-	spin_unlock_irqrestore(&kctx->jctx.tb_lock, flags);
-
-	return 0;
-}
-
-void kbase_device_trace_buffer_uninstall(struct kbase_context *kctx)
-{
-	unsigned long flags;
-
-	KBASE_DEBUG_ASSERT(kctx);
-	spin_lock_irqsave(&kctx->jctx.tb_lock, flags);
-	kctx->jctx.tb = NULL;
-	kctx->jctx.tb_wrap_offset = 0;
-	spin_unlock_irqrestore(&kctx->jctx.tb_lock, flags);
-}
-
-void kbase_device_trace_register_access(struct kbase_context *kctx, enum kbase_reg_access_type type, u16 reg_offset, u32 reg_value)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&kctx->jctx.tb_lock, flags);
-	if (kctx->jctx.tb) {
-		u16 wrap_count;
-		u16 write_offset;
-		u32 *tb = kctx->jctx.tb;
-		u32 header_word;
-
-		header_word = tb[1];
-		KBASE_DEBUG_ASSERT(0 == (header_word & 0x1));
-
-		wrap_count = (header_word >> 1) & 0x7FFF;
-		write_offset = (header_word >> 16) & 0xFFFF;
-
-		/* mark as transaction in progress */
-		tb[1] |= 0x1;
-		mb();
-
-		/* calculate new offset */
-		write_offset++;
-		if (write_offset == kctx->jctx.tb_wrap_offset) {
-			/* wrap */
-			write_offset = 1;
-			wrap_count++;
-			wrap_count &= 0x7FFF;	/* 15bit wrap counter */
-		}
-
-		/* store the trace entry at the selected offset */
-		tb[write_offset * 2 + 0] = (reg_offset & ~0x3) | ((type == REG_WRITE) ? 0x1 : 0x0);
-		tb[write_offset * 2 + 1] = reg_value;
-		mb();
-
-		/* new header word */
-		header_word = (write_offset << 16) | (wrap_count << 1) | 0x0;	/* transaction complete */
-		tb[1] = header_word;
-	}
-	spin_unlock_irqrestore(&kctx->jctx.tb_lock, flags);
-}
-
-/*
- * Device trace functions
- */
-#if KBASE_TRACE_ENABLE
-
-static int kbasep_trace_init(struct kbase_device *kbdev)
-{
-	struct kbase_trace *rbuf;
-
-	rbuf = kmalloc_array(KBASE_TRACE_SIZE, sizeof(*rbuf), GFP_KERNEL);
-
-	if (!rbuf)
-		return -EINVAL;
-
-	kbdev->trace_rbuf = rbuf;
-	spin_lock_init(&kbdev->trace_lock);
-	return 0;
-}
-
-static void kbasep_trace_term(struct kbase_device *kbdev)
-{
-	kfree(kbdev->trace_rbuf);
-}
-
-static void kbasep_trace_format_msg(struct kbase_trace *trace_msg, char *buffer, int len)
-{
-	s32 written = 0;
-
-	/* Initial part of message */
-	written += MAX(snprintf(buffer + written, MAX(len - written, 0), "%d.%.6d,%d,%d,%s,%p,", (int)trace_msg->timestamp.tv_sec, (int)(trace_msg->timestamp.tv_nsec / 1000), trace_msg->thread_id, trace_msg->cpu, kbasep_trace_code_string[trace_msg->code], trace_msg->ctx), 0);
-
-	if (trace_msg->katom)
-		written += MAX(snprintf(buffer + written, MAX(len - written, 0), "atom %d (ud: 0x%llx 0x%llx)", trace_msg->atom_number, trace_msg->atom_udata[0], trace_msg->atom_udata[1]), 0);
-
-	written += MAX(snprintf(buffer + written, MAX(len - written, 0), ",%.8llx,", trace_msg->gpu_addr), 0);
-
-	/* NOTE: Could add function callbacks to handle different message types */
-	/* Jobslot present */
-	if (trace_msg->flags & KBASE_TRACE_FLAG_JOBSLOT)
-		written += MAX(snprintf(buffer + written, MAX(len - written, 0), "%d", trace_msg->jobslot), 0);
-
-	written += MAX(snprintf(buffer + written, MAX(len - written, 0), ","), 0);
-
-	/* Refcount present */
-	if (trace_msg->flags & KBASE_TRACE_FLAG_REFCOUNT)
-		written += MAX(snprintf(buffer + written, MAX(len - written, 0), "%d", trace_msg->refcount), 0);
-
-	written += MAX(snprintf(buffer + written, MAX(len - written, 0), ","), 0);
-
-	/* Rest of message */
-	written += MAX(snprintf(buffer + written, MAX(len - written, 0), "0x%.8lx", trace_msg->info_val), 0);
-}
-
-static void kbasep_trace_dump_msg(struct kbase_device *kbdev, struct kbase_trace *trace_msg)
-{
-	char buffer[DEBUG_MESSAGE_SIZE];
-
-	kbasep_trace_format_msg(trace_msg, buffer, DEBUG_MESSAGE_SIZE);
-	dev_dbg(kbdev->dev, "%s", buffer);
-}
-
-void kbasep_trace_add(struct kbase_device *kbdev, enum kbase_trace_code code, void *ctx, struct kbase_jd_atom *katom, u64 gpu_addr, u8 flags, int refcount, int jobslot, unsigned long info_val)
-{
-	unsigned long irqflags;
-	struct kbase_trace *trace_msg;
-
-	spin_lock_irqsave(&kbdev->trace_lock, irqflags);
-
-	trace_msg = &kbdev->trace_rbuf[kbdev->trace_next_in];
-
-	/* Fill the message */
-	trace_msg->thread_id = task_pid_nr(current);
-	trace_msg->cpu = task_cpu(current);
-
-	getnstimeofday(&trace_msg->timestamp);
-
-	trace_msg->code = code;
-	trace_msg->ctx = ctx;
-
-	if (NULL == katom) {
-		trace_msg->katom = false;
-	} else {
-		trace_msg->katom = true;
-		trace_msg->atom_number = kbase_jd_atom_id(katom->kctx, katom);
-		trace_msg->atom_udata[0] = katom->udata.blob[0];
-		trace_msg->atom_udata[1] = katom->udata.blob[1];
-	}
-
-	trace_msg->gpu_addr = gpu_addr;
-	trace_msg->jobslot = jobslot;
-	trace_msg->refcount = MIN((unsigned int)refcount, 0xFF);
-	trace_msg->info_val = info_val;
-	trace_msg->flags = flags;
-
-	/* Update the ringbuffer indices */
-	kbdev->trace_next_in = (kbdev->trace_next_in + 1) & KBASE_TRACE_MASK;
-	if (kbdev->trace_next_in == kbdev->trace_first_out)
-		kbdev->trace_first_out = (kbdev->trace_first_out + 1) & KBASE_TRACE_MASK;
-
-	/* Done */
-
-	spin_unlock_irqrestore(&kbdev->trace_lock, irqflags);
-}
-
-void kbasep_trace_clear(struct kbase_device *kbdev)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&kbdev->trace_lock, flags);
-	kbdev->trace_first_out = kbdev->trace_next_in;
-	spin_unlock_irqrestore(&kbdev->trace_lock, flags);
-}
-
-void kbasep_trace_dump(struct kbase_device *kbdev)
-{
-	unsigned long flags;
-	u32 start;
-	u32 end;
-
-	dev_dbg(kbdev->dev, "Dumping trace:\nsecs,nthread,cpu,code,ctx,katom,gpu_addr,jobslot,refcount,info_val");
-	spin_lock_irqsave(&kbdev->trace_lock, flags);
-	start = kbdev->trace_first_out;
-	end = kbdev->trace_next_in;
-
-	while (start != end) {
-		struct kbase_trace *trace_msg = &kbdev->trace_rbuf[start];
-
-		kbasep_trace_dump_msg(kbdev, trace_msg);
-
-		start = (start + 1) & KBASE_TRACE_MASK;
-	}
-	dev_dbg(kbdev->dev, "TRACE_END");
-
-	spin_unlock_irqrestore(&kbdev->trace_lock, flags);
-
-	KBASE_TRACE_CLEAR(kbdev);
-}
-
-static void kbasep_trace_hook_wrapper(void *param)
-{
-	struct kbase_device *kbdev = (struct kbase_device *)param;
-
-	kbasep_trace_dump(kbdev);
-}
-
-#ifdef CONFIG_DEBUG_FS
-struct trace_seq_state {
-	struct kbase_trace trace_buf[KBASE_TRACE_SIZE];
-	u32 start;
-	u32 end;
-};
-
-static void *kbasep_trace_seq_start(struct seq_file *s, loff_t *pos)
-{
-	struct trace_seq_state *state = s->private;
-	int i;
-
-	if (*pos > KBASE_TRACE_SIZE)
-		return NULL;
-	i = state->start + *pos;
-	if ((state->end >= state->start && i >= state->end) ||
-			i >= state->end + KBASE_TRACE_SIZE)
-		return NULL;
-
-	i &= KBASE_TRACE_MASK;
-
-	return &state->trace_buf[i];
-}
-
-static void kbasep_trace_seq_stop(struct seq_file *s, void *data)
-{
-}
-
-static void *kbasep_trace_seq_next(struct seq_file *s, void *data, loff_t *pos)
-{
-	struct trace_seq_state *state = s->private;
-	int i;
-
-	(*pos)++;
-
-	i = (state->start + *pos) & KBASE_TRACE_MASK;
-	if (i == state->end)
-		return NULL;
-
-	return &state->trace_buf[i];
-}
-
-static int kbasep_trace_seq_show(struct seq_file *s, void *data)
-{
-	struct kbase_trace *trace_msg = data;
-	char buffer[DEBUG_MESSAGE_SIZE];
-
-	kbasep_trace_format_msg(trace_msg, buffer, DEBUG_MESSAGE_SIZE);
-	seq_printf(s, "%s\n", buffer);
-	return 0;
-}
-
-static const struct seq_operations kbasep_trace_seq_ops = {
-	.start = kbasep_trace_seq_start,
-	.next = kbasep_trace_seq_next,
-	.stop = kbasep_trace_seq_stop,
-	.show = kbasep_trace_seq_show,
-};
-
-static int kbasep_trace_debugfs_open(struct inode *inode, struct file *file)
-{
-	struct kbase_device *kbdev = inode->i_private;
-	unsigned long flags;
-
-	struct trace_seq_state *state;
-
-	state = __seq_open_private(file, &kbasep_trace_seq_ops, sizeof(*state));
-	if (!state)
-		return -ENOMEM;
-
-	spin_lock_irqsave(&kbdev->trace_lock, flags);
-	state->start = kbdev->trace_first_out;
-	state->end = kbdev->trace_next_in;
-	memcpy(state->trace_buf, kbdev->trace_rbuf, sizeof(state->trace_buf));
-	spin_unlock_irqrestore(&kbdev->trace_lock, flags);
-
-	return 0;
-}
-
-static const struct file_operations kbasep_trace_debugfs_fops = {
-	.open = kbasep_trace_debugfs_open,
-	.read = seq_read,
-	.llseek = seq_lseek,
-	.release = seq_release_private,
-};
-
-void kbasep_trace_debugfs_init(struct kbase_device *kbdev)
-{
-	debugfs_create_file("mali_trace", S_IRUGO,
-			kbdev->mali_debugfs_directory, kbdev,
-			&kbasep_trace_debugfs_fops);
-}
-
-#else
-void kbasep_trace_debugfs_init(struct kbase_device *kbdev)
-{
-}
-#endif				/* CONFIG_DEBUG_FS */
-
-#else				/* KBASE_TRACE_ENABLE  */
-static int kbasep_trace_init(struct kbase_device *kbdev)
-{
-	CSTD_UNUSED(kbdev);
-	return 0;
-}
-
-static void kbasep_trace_term(struct kbase_device *kbdev)
-{
-	CSTD_UNUSED(kbdev);
-}
-
-static void kbasep_trace_hook_wrapper(void *param)
-{
-	CSTD_UNUSED(param);
-}
-
-void kbasep_trace_dump(struct kbase_device *kbdev)
-{
-	CSTD_UNUSED(kbdev);
-}
-#endif				/* KBASE_TRACE_ENABLE  */
-
-void kbase_set_profiling_control(struct kbase_device *kbdev, u32 control, u32 value)
-{
-	switch (control) {
-	case FBDUMP_CONTROL_ENABLE:
-		/* fall through */
-	case FBDUMP_CONTROL_RATE:
-		/* fall through */
-	case SW_COUNTER_ENABLE:
-		/* fall through */
-	case FBDUMP_CONTROL_RESIZE_FACTOR:
-		kbdev->kbase_profiling_controls[control] = value;
-		break;
-	default:
-		dev_err(kbdev->dev, "Profiling control %d not found\n", control);
-		break;
-	}
-}
-
-/*
- * Called by gator to control the production of
- * profiling information at runtime
- * */
-
-void _mali_profiling_control(u32 action, u32 value)
-{
-	struct kbase_device *kbdev = NULL;
-
-	/* find the first i.e. call with -1 */
-	kbdev = kbase_find_device(-1);
-
-	if (NULL != kbdev)
-		kbase_set_profiling_control(kbdev, action, value);
-}
-KBASE_EXPORT_SYMBOL(_mali_profiling_control);
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_disjoint_events.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_disjoint_events.c
deleted file mode 100644
index f70bcccf4050..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_disjoint_events.c
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * Base kernel disjoint events helper functions
- */
-
-#include <mali_kbase.h>
-
-void kbase_disjoint_init(struct kbase_device *kbdev)
-{
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	atomic_set(&kbdev->disjoint_event.count, 0);
-	atomic_set(&kbdev->disjoint_event.state, 0);
-}
-
-/* increment the disjoint event count */
-void kbase_disjoint_event(struct kbase_device *kbdev)
-{
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	atomic_inc(&kbdev->disjoint_event.count);
-}
-
-/* increment the state and the event counter */
-void kbase_disjoint_state_up(struct kbase_device *kbdev)
-{
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	atomic_inc(&kbdev->disjoint_event.state);
-
-	kbase_disjoint_event(kbdev);
-}
-
-/* decrement the state */
-void kbase_disjoint_state_down(struct kbase_device *kbdev)
-{
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(atomic_read(&kbdev->disjoint_event.state) > 0);
-
-	kbase_disjoint_event(kbdev);
-
-	atomic_dec(&kbdev->disjoint_event.state);
-}
-
-/* increments the count only if the state is > 0 */
-void kbase_disjoint_event_potential(struct kbase_device *kbdev)
-{
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	if (atomic_read(&kbdev->disjoint_event.state))
-		kbase_disjoint_event(kbdev);
-}
-
-u32 kbase_disjoint_event_get(struct kbase_device *kbdev)
-{
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	return atomic_read(&kbdev->disjoint_event.count);
-}
-KBASE_EXPORT_TEST_API(kbase_disjoint_event_get);
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_dma_fence.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_dma_fence.c
deleted file mode 100644
index 8a571266534b..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_dma_fence.c
+++ /dev/null
@@ -1,449 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-/* Include mali_kbase_dma_fence.h before checking for CONFIG_MALI_BIFROST_DMA_FENCE as
- * it will be set there.
- */
-#include "mali_kbase_dma_fence.h"
-
-#include <linux/atomic.h>
-#include <linux/list.h>
-#include <linux/lockdep.h>
-#include <linux/mutex.h>
-#include <linux/reservation.h>
-#include <linux/slab.h>
-#include <linux/spinlock.h>
-#include <linux/workqueue.h>
-#include <linux/ww_mutex.h>
-
-#include <mali_kbase.h>
-
-static void
-kbase_dma_fence_work(struct work_struct *pwork);
-
-static void
-kbase_dma_fence_waiters_add(struct kbase_jd_atom *katom)
-{
-	struct kbase_context *kctx = katom->kctx;
-
-	list_add_tail(&katom->queue, &kctx->dma_fence.waiting_resource);
-}
-
-static void
-kbase_dma_fence_waiters_remove(struct kbase_jd_atom *katom)
-{
-	list_del(&katom->queue);
-}
-
-static int
-kbase_dma_fence_lock_reservations(struct kbase_dma_fence_resv_info *info,
-				  struct ww_acquire_ctx *ctx)
-{
-	struct reservation_object *content_res = NULL;
-	unsigned int content_res_idx = 0;
-	unsigned int r;
-	int err = 0;
-
-	ww_acquire_init(ctx, &reservation_ww_class);
-
-retry:
-	for (r = 0; r < info->dma_fence_resv_count; r++) {
-		if (info->resv_objs[r] == content_res) {
-			content_res = NULL;
-			continue;
-		}
-
-		err = ww_mutex_lock(&info->resv_objs[r]->lock, ctx);
-		if (err)
-			goto error;
-	}
-
-	ww_acquire_done(ctx);
-	return err;
-
-error:
-	content_res_idx = r;
-
-	/* Unlock the locked one ones */
-	while (r--)
-		ww_mutex_unlock(&info->resv_objs[r]->lock);
-
-	if (content_res)
-		ww_mutex_unlock(&content_res->lock);
-
-	/* If we deadlock try with lock_slow and retry */
-	if (err == -EDEADLK) {
-		content_res = info->resv_objs[content_res_idx];
-		ww_mutex_lock_slow(&content_res->lock, ctx);
-		goto retry;
-	}
-
-	/* If we are here the function failed */
-	ww_acquire_fini(ctx);
-	return err;
-}
-
-static void
-kbase_dma_fence_unlock_reservations(struct kbase_dma_fence_resv_info *info,
-				    struct ww_acquire_ctx *ctx)
-{
-	unsigned int r;
-
-	for (r = 0; r < info->dma_fence_resv_count; r++)
-		ww_mutex_unlock(&info->resv_objs[r]->lock);
-	ww_acquire_fini(ctx);
-}
-
-/**
- * kbase_dma_fence_queue_work() - Queue work to handle @katom
- * @katom: Pointer to atom for which to queue work
- *
- * Queue kbase_dma_fence_work() for @katom to clean up the fence callbacks and
- * submit the atom.
- */
-static void
-kbase_dma_fence_queue_work(struct kbase_jd_atom *katom)
-{
-	struct kbase_context *kctx = katom->kctx;
-	bool ret;
-
-	INIT_WORK(&katom->work, kbase_dma_fence_work);
-	ret = queue_work(kctx->dma_fence.wq, &katom->work);
-	/* Warn if work was already queued, that should not happen. */
-	WARN_ON(!ret);
-}
-
-/**
- * kbase_dma_fence_cancel_atom() - Cancels waiting on an atom
- * @katom:	Katom to cancel
- *
- * Locking: katom->dma_fence.callbacks list assumes jctx.lock is held.
- */
-static void
-kbase_dma_fence_cancel_atom(struct kbase_jd_atom *katom)
-{
-	lockdep_assert_held(&katom->kctx->jctx.lock);
-
-	/* Cancel callbacks and clean up. */
-	kbase_fence_free_callbacks(katom);
-
-	/* Mark the atom as handled in case all fences signaled just before
-	 * canceling the callbacks and the worker was queued.
-	 */
-	kbase_fence_dep_count_set(katom, -1);
-
-	/* Prevent job_done_nolock from being called twice on an atom when
-	 * there is a race between job completion and cancellation.
-	 */
-
-	if (katom->status == KBASE_JD_ATOM_STATE_QUEUED) {
-		/* Wait was cancelled - zap the atom */
-		katom->event_code = BASE_JD_EVENT_JOB_CANCELLED;
-		if (jd_done_nolock(katom, NULL))
-			kbase_js_sched_all(katom->kctx->kbdev);
-	}
-}
-
-/**
- * kbase_dma_fence_work() - Worker thread called when a fence is signaled
- * @pwork:	work_struct containing a pointer to a katom
- *
- * This function will clean and mark all dependencies as satisfied
- */
-static void
-kbase_dma_fence_work(struct work_struct *pwork)
-{
-	struct kbase_jd_atom *katom;
-	struct kbase_jd_context *ctx;
-
-	katom = container_of(pwork, struct kbase_jd_atom, work);
-	ctx = &katom->kctx->jctx;
-
-	mutex_lock(&ctx->lock);
-	if (kbase_fence_dep_count_read(katom) != 0)
-		goto out;
-
-	kbase_fence_dep_count_set(katom, -1);
-
-	/* Remove atom from list of dma-fence waiting atoms. */
-	kbase_dma_fence_waiters_remove(katom);
-	/* Cleanup callbacks. */
-	kbase_fence_free_callbacks(katom);
-	/*
-	 * Queue atom on GPU, unless it has already completed due to a failing
-	 * dependency. Run jd_done_nolock() on the katom if it is completed.
-	 */
-	if (unlikely(katom->status == KBASE_JD_ATOM_STATE_COMPLETED))
-		jd_done_nolock(katom, NULL);
-	else
-		kbase_jd_dep_clear_locked(katom);
-
-out:
-	mutex_unlock(&ctx->lock);
-}
-
-static void
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-kbase_dma_fence_cb(struct fence *fence, struct fence_cb *cb)
-#else
-kbase_dma_fence_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
-#endif
-{
-	struct kbase_fence_cb *kcb = container_of(cb,
-				struct kbase_fence_cb,
-				fence_cb);
-	struct kbase_jd_atom *katom = kcb->katom;
-
-	/* If the atom is zapped dep_count will be forced to a negative number
-	 * preventing this callback from ever scheduling work. Which in turn
-	 * would reschedule the atom.
-	 */
-
-	if (kbase_fence_dep_count_dec_and_test(katom))
-		kbase_dma_fence_queue_work(katom);
-}
-
-static int
-kbase_dma_fence_add_reservation_callback(struct kbase_jd_atom *katom,
-					 struct reservation_object *resv,
-					 bool exclusive)
-{
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-	struct fence *excl_fence = NULL;
-	struct fence **shared_fences = NULL;
-#else
-	struct dma_fence *excl_fence = NULL;
-	struct dma_fence **shared_fences = NULL;
-#endif
-	unsigned int shared_count = 0;
-	int err, i;
-
-	err = reservation_object_get_fences_rcu(resv,
-						&excl_fence,
-						&shared_count,
-						&shared_fences);
-	if (err)
-		return err;
-
-	if (excl_fence) {
-		err = kbase_fence_add_callback(katom,
-						excl_fence,
-						kbase_dma_fence_cb);
-
-		/* Release our reference, taken by reservation_object_get_fences_rcu(),
-		 * to the fence. We have set up our callback (if that was possible),
-		 * and it's the fence's owner is responsible for singling the fence
-		 * before allowing it to disappear.
-		 */
-		dma_fence_put(excl_fence);
-
-		if (err)
-			goto out;
-	}
-
-	if (exclusive) {
-		for (i = 0; i < shared_count; i++) {
-			err = kbase_fence_add_callback(katom,
-							shared_fences[i],
-							kbase_dma_fence_cb);
-			if (err)
-				goto out;
-		}
-	}
-
-	/* Release all our references to the shared fences, taken by
-	 * reservation_object_get_fences_rcu(). We have set up our callback (if
-	 * that was possible), and it's the fence's owner is responsible for
-	 * signaling the fence before allowing it to disappear.
-	 */
-out:
-	for (i = 0; i < shared_count; i++)
-		dma_fence_put(shared_fences[i]);
-	kfree(shared_fences);
-
-	if (err) {
-		/*
-		 * On error, cancel and clean up all callbacks that was set up
-		 * before the error.
-		 */
-		kbase_fence_free_callbacks(katom);
-	}
-
-	return err;
-}
-
-void kbase_dma_fence_add_reservation(struct reservation_object *resv,
-				     struct kbase_dma_fence_resv_info *info,
-				     bool exclusive)
-{
-	unsigned int i;
-
-	for (i = 0; i < info->dma_fence_resv_count; i++) {
-		/* Duplicate resource, ignore */
-		if (info->resv_objs[i] == resv)
-			return;
-	}
-
-	info->resv_objs[info->dma_fence_resv_count] = resv;
-	if (exclusive)
-		set_bit(info->dma_fence_resv_count,
-			info->dma_fence_excl_bitmap);
-	(info->dma_fence_resv_count)++;
-}
-
-int kbase_dma_fence_wait(struct kbase_jd_atom *katom,
-			 struct kbase_dma_fence_resv_info *info)
-{
-	int err, i;
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-	struct fence *fence;
-#else
-	struct dma_fence *fence;
-#endif
-	struct ww_acquire_ctx ww_ctx;
-
-	lockdep_assert_held(&katom->kctx->jctx.lock);
-
-	fence = kbase_fence_out_new(katom);
-	if (!fence) {
-		err = -ENOMEM;
-		dev_err(katom->kctx->kbdev->dev,
-			"Error %d creating fence.\n", err);
-		return err;
-	}
-
-	kbase_fence_dep_count_set(katom, 1);
-
-	err = kbase_dma_fence_lock_reservations(info, &ww_ctx);
-	if (err) {
-		dev_err(katom->kctx->kbdev->dev,
-			"Error %d locking reservations.\n", err);
-		kbase_fence_dep_count_set(katom, -1);
-		kbase_fence_out_remove(katom);
-		return err;
-	}
-
-	for (i = 0; i < info->dma_fence_resv_count; i++) {
-		struct reservation_object *obj = info->resv_objs[i];
-
-		if (!test_bit(i, info->dma_fence_excl_bitmap)) {
-			err = reservation_object_reserve_shared(obj);
-			if (err) {
-				dev_err(katom->kctx->kbdev->dev,
-					"Error %d reserving space for shared fence.\n", err);
-				goto end;
-			}
-
-			err = kbase_dma_fence_add_reservation_callback(katom, obj, false);
-			if (err) {
-				dev_err(katom->kctx->kbdev->dev,
-					"Error %d adding reservation to callback.\n", err);
-				goto end;
-			}
-
-			reservation_object_add_shared_fence(obj, fence);
-		} else {
-			err = kbase_dma_fence_add_reservation_callback(katom, obj, true);
-			if (err) {
-				dev_err(katom->kctx->kbdev->dev,
-					"Error %d adding reservation to callback.\n", err);
-				goto end;
-			}
-
-			reservation_object_add_excl_fence(obj, fence);
-		}
-	}
-
-end:
-	kbase_dma_fence_unlock_reservations(info, &ww_ctx);
-
-	if (likely(!err)) {
-		/* Test if the callbacks are already triggered */
-		if (kbase_fence_dep_count_dec_and_test(katom)) {
-			kbase_fence_dep_count_set(katom, -1);
-			kbase_fence_free_callbacks(katom);
-		} else {
-			/* Add katom to the list of dma-buf fence waiting atoms
-			 * only if it is still waiting.
-			 */
-			kbase_dma_fence_waiters_add(katom);
-		}
-	} else {
-		/* There was an error, cancel callbacks, set dep_count to -1 to
-		 * indicate that the atom has been handled (the caller will
-		 * kill it for us), signal the fence, free callbacks and the
-		 * fence.
-		 */
-		kbase_fence_free_callbacks(katom);
-		kbase_fence_dep_count_set(katom, -1);
-		kbase_dma_fence_signal(katom);
-	}
-
-	return err;
-}
-
-void kbase_dma_fence_cancel_all_atoms(struct kbase_context *kctx)
-{
-	struct list_head *list = &kctx->dma_fence.waiting_resource;
-
-	while (!list_empty(list)) {
-		struct kbase_jd_atom *katom;
-
-		katom = list_first_entry(list, struct kbase_jd_atom, queue);
-		kbase_dma_fence_waiters_remove(katom);
-		kbase_dma_fence_cancel_atom(katom);
-	}
-}
-
-void kbase_dma_fence_cancel_callbacks(struct kbase_jd_atom *katom)
-{
-	/* Cancel callbacks and clean up. */
-	if (kbase_fence_free_callbacks(katom))
-		kbase_dma_fence_queue_work(katom);
-}
-
-void kbase_dma_fence_signal(struct kbase_jd_atom *katom)
-{
-	if (!katom->dma_fence.fence)
-		return;
-
-	/* Signal the atom's fence. */
-	dma_fence_signal(katom->dma_fence.fence);
-
-	kbase_fence_out_remove(katom);
-
-	kbase_fence_free_callbacks(katom);
-}
-
-void kbase_dma_fence_term(struct kbase_context *kctx)
-{
-	destroy_workqueue(kctx->dma_fence.wq);
-	kctx->dma_fence.wq = NULL;
-}
-
-int kbase_dma_fence_init(struct kbase_context *kctx)
-{
-	INIT_LIST_HEAD(&kctx->dma_fence.waiting_resource);
-
-	kctx->dma_fence.wq = alloc_workqueue("mali-fence-%d",
-					     WQ_UNBOUND, 1, kctx->pid);
-	if (!kctx->dma_fence.wq)
-		return -ENOMEM;
-
-	return 0;
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_dma_fence.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_dma_fence.h
deleted file mode 100644
index b02ea9774c4f..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_dma_fence.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KBASE_DMA_FENCE_H_
-#define _KBASE_DMA_FENCE_H_
-
-#ifdef CONFIG_MALI_BIFROST_DMA_FENCE
-
-#include <linux/list.h>
-#include <linux/reservation.h>
-#include <mali_kbase_fence.h>
-
-
-/* Forward declaration from mali_kbase_defs.h */
-struct kbase_jd_atom;
-struct kbase_context;
-
-/**
- * struct kbase_dma_fence_resv_info - Structure with list of reservation objects
- * @resv_objs:             Array of reservation objects to attach the
- *                         new fence to.
- * @dma_fence_resv_count:  Number of reservation objects in the array.
- * @dma_fence_excl_bitmap: Specifies which resv_obj are exclusive.
- *
- * This is used by some functions to pass around a collection of data about
- * reservation objects.
- */
-struct kbase_dma_fence_resv_info {
-	struct reservation_object **resv_objs;
-	unsigned int dma_fence_resv_count;
-	unsigned long *dma_fence_excl_bitmap;
-};
-
-/**
- * kbase_dma_fence_add_reservation() - Adds a resv to the array of resv_objs
- * @resv:      Reservation object to add to the array.
- * @info:      Pointer to struct with current reservation info
- * @exclusive: Boolean indicating if exclusive access is needed
- *
- * The function adds a new reservation_object to an existing array of
- * reservation_objects. At the same time keeps track of which objects require
- * exclusive access in dma_fence_excl_bitmap.
- */
-void kbase_dma_fence_add_reservation(struct reservation_object *resv,
-				     struct kbase_dma_fence_resv_info *info,
-				     bool exclusive);
-
-/**
- * kbase_dma_fence_wait() - Creates a new fence and attaches it to the resv_objs
- * @katom: Katom with the external dependency.
- * @info:  Pointer to struct with current reservation info
- *
- * Return: An error code or 0 if succeeds
- */
-int kbase_dma_fence_wait(struct kbase_jd_atom *katom,
-			 struct kbase_dma_fence_resv_info *info);
-
-/**
- * kbase_dma_fence_cancel_ctx() - Cancel all dma-fences blocked atoms on kctx
- * @kctx: Pointer to kbase context
- *
- * This function will cancel and clean up all katoms on @kctx that is waiting
- * on dma-buf fences.
- *
- * Locking: jctx.lock needs to be held when calling this function.
- */
-void kbase_dma_fence_cancel_all_atoms(struct kbase_context *kctx);
-
-/**
- * kbase_dma_fence_cancel_callbacks() - Cancel only callbacks on katom
- * @katom: Pointer to katom whose callbacks are to be canceled
- *
- * This function cancels all dma-buf fence callbacks on @katom, but does not
- * cancel the katom itself.
- *
- * The caller is responsible for ensuring that jd_done_nolock is called on
- * @katom.
- *
- * Locking: jctx.lock must be held when calling this function.
- */
-void kbase_dma_fence_cancel_callbacks(struct kbase_jd_atom *katom);
-
-/**
- * kbase_dma_fence_signal() - Signal katom's fence and clean up after wait
- * @katom: Pointer to katom to signal and clean up
- *
- * This function will signal the @katom's fence, if it has one, and clean up
- * the callback data from the katom's wait on earlier fences.
- *
- * Locking: jctx.lock must be held while calling this function.
- */
-void kbase_dma_fence_signal(struct kbase_jd_atom *katom);
-
-/**
- * kbase_dma_fence_term() - Terminate Mali dma-fence context
- * @kctx: kbase context to terminate
- */
-void kbase_dma_fence_term(struct kbase_context *kctx);
-
-/**
- * kbase_dma_fence_init() - Initialize Mali dma-fence context
- * @kctx: kbase context to initialize
- */
-int kbase_dma_fence_init(struct kbase_context *kctx);
-
-
-#else /* CONFIG_MALI_BIFROST_DMA_FENCE */
-/* Dummy functions for when dma-buf fence isn't enabled. */
-
-static inline int kbase_dma_fence_init(struct kbase_context *kctx)
-{
-	return 0;
-}
-
-static inline void kbase_dma_fence_term(struct kbase_context *kctx) {}
-#endif /* CONFIG_MALI_BIFROST_DMA_FENCE */
-#endif
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_event.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_event.c
deleted file mode 100644
index 188148645f37..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_event.c
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#include <mali_kbase.h>
-#include <mali_kbase_debug.h>
-#include <mali_kbase_tlstream.h>
-
-static struct base_jd_udata kbase_event_process(struct kbase_context *kctx, struct kbase_jd_atom *katom)
-{
-	struct base_jd_udata data;
-
-	lockdep_assert_held(&kctx->jctx.lock);
-
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	KBASE_DEBUG_ASSERT(katom != NULL);
-	KBASE_DEBUG_ASSERT(katom->status == KBASE_JD_ATOM_STATE_COMPLETED);
-
-	data = katom->udata;
-
-	KBASE_TIMELINE_ATOMS_IN_FLIGHT(kctx, atomic_sub_return(1, &kctx->timeline.jd_atoms_in_flight));
-
-	KBASE_TLSTREAM_TL_NRET_ATOM_CTX(katom, kctx);
-	KBASE_TLSTREAM_TL_DEL_ATOM(katom);
-
-	katom->status = KBASE_JD_ATOM_STATE_UNUSED;
-
-	wake_up(&katom->completed);
-
-	return data;
-}
-
-int kbase_event_pending(struct kbase_context *ctx)
-{
-	KBASE_DEBUG_ASSERT(ctx);
-
-	return (atomic_read(&ctx->event_count) != 0) ||
-			(atomic_read(&ctx->event_closed) != 0);
-}
-
-KBASE_EXPORT_TEST_API(kbase_event_pending);
-
-int kbase_event_dequeue(struct kbase_context *ctx, struct base_jd_event_v2 *uevent)
-{
-	struct kbase_jd_atom *atom;
-
-	KBASE_DEBUG_ASSERT(ctx);
-
-	mutex_lock(&ctx->event_mutex);
-
-	if (list_empty(&ctx->event_list)) {
-		if (!atomic_read(&ctx->event_closed)) {
-			mutex_unlock(&ctx->event_mutex);
-			return -1;
-		}
-
-		/* generate the BASE_JD_EVENT_DRV_TERMINATED message on the fly */
-		mutex_unlock(&ctx->event_mutex);
-		uevent->event_code = BASE_JD_EVENT_DRV_TERMINATED;
-		memset(&uevent->udata, 0, sizeof(uevent->udata));
-		dev_dbg(ctx->kbdev->dev,
-				"event system closed, returning BASE_JD_EVENT_DRV_TERMINATED(0x%X)\n",
-				BASE_JD_EVENT_DRV_TERMINATED);
-		return 0;
-	}
-
-	/* normal event processing */
-	atomic_dec(&ctx->event_count);
-	atom = list_entry(ctx->event_list.next, struct kbase_jd_atom, dep_item[0]);
-	list_del(ctx->event_list.next);
-
-	mutex_unlock(&ctx->event_mutex);
-
-	dev_dbg(ctx->kbdev->dev, "event dequeuing %p\n", (void *)atom);
-	uevent->event_code = atom->event_code;
-	uevent->atom_number = (atom - ctx->jctx.atoms);
-
-	if (atom->core_req & BASE_JD_REQ_EXTERNAL_RESOURCES)
-		kbase_jd_free_external_resources(atom);
-
-	mutex_lock(&ctx->jctx.lock);
-	uevent->udata = kbase_event_process(ctx, atom);
-	mutex_unlock(&ctx->jctx.lock);
-
-	return 0;
-}
-
-KBASE_EXPORT_TEST_API(kbase_event_dequeue);
-
-/**
- * kbase_event_process_noreport_worker - Worker for processing atoms that do not
- *                                       return an event but do have external
- *                                       resources
- * @data:  Work structure
- */
-static void kbase_event_process_noreport_worker(struct work_struct *data)
-{
-	struct kbase_jd_atom *katom = container_of(data, struct kbase_jd_atom,
-			work);
-	struct kbase_context *kctx = katom->kctx;
-
-	if (katom->core_req & BASE_JD_REQ_EXTERNAL_RESOURCES)
-		kbase_jd_free_external_resources(katom);
-
-	mutex_lock(&kctx->jctx.lock);
-	kbase_event_process(kctx, katom);
-	mutex_unlock(&kctx->jctx.lock);
-}
-
-/**
- * kbase_event_process_noreport - Process atoms that do not return an event
- * @kctx:  Context pointer
- * @katom: Atom to be processed
- *
- * Atoms that do not have external resources will be processed immediately.
- * Atoms that do have external resources will be processed on a workqueue, in
- * order to avoid locking issues.
- */
-static void kbase_event_process_noreport(struct kbase_context *kctx,
-		struct kbase_jd_atom *katom)
-{
-	if (katom->core_req & BASE_JD_REQ_EXTERNAL_RESOURCES) {
-		INIT_WORK(&katom->work, kbase_event_process_noreport_worker);
-		queue_work(kctx->event_workq, &katom->work);
-	} else {
-		kbase_event_process(kctx, katom);
-	}
-}
-
-/**
- * kbase_event_coalesce - Move pending events to the main event list
- * @kctx:  Context pointer
- *
- * kctx->event_list and kctx->event_coalesce_count must be protected
- * by a lock unless this is the last thread using them
- * (and we're about to terminate the lock).
- *
- * Return: The number of pending events moved to the main event list
- */
-static int kbase_event_coalesce(struct kbase_context *kctx)
-{
-	const int event_count = kctx->event_coalesce_count;
-
-	/* Join the list of pending events onto the tail of the main list
-	   and reset it */
-	list_splice_tail_init(&kctx->event_coalesce_list, &kctx->event_list);
-	kctx->event_coalesce_count = 0;
-
-	/* Return the number of events moved */
-	return event_count;
-}
-
-void kbase_event_post(struct kbase_context *ctx, struct kbase_jd_atom *atom)
-{
-	if (atom->core_req & BASE_JD_REQ_EVENT_ONLY_ON_FAILURE) {
-		if (atom->event_code == BASE_JD_EVENT_DONE) {
-			/* Don't report the event */
-			kbase_event_process_noreport(ctx, atom);
-			return;
-		}
-	}
-
-	if (atom->core_req & BASEP_JD_REQ_EVENT_NEVER) {
-		/* Don't report the event */
-		kbase_event_process_noreport(ctx, atom);
-		return;
-	}
-	KBASE_TLSTREAM_TL_ATTRIB_ATOM_STATE(atom, TL_ATOM_STATE_POSTED);
-	if (atom->core_req & BASE_JD_REQ_EVENT_COALESCE) {
-		/* Don't report the event until other event(s) have completed */
-		mutex_lock(&ctx->event_mutex);
-		list_add_tail(&atom->dep_item[0], &ctx->event_coalesce_list);
-		++ctx->event_coalesce_count;
-		mutex_unlock(&ctx->event_mutex);
-	} else {
-		/* Report the event and any pending events now */
-		int event_count = 1;
-
-		mutex_lock(&ctx->event_mutex);
-		event_count += kbase_event_coalesce(ctx);
-		list_add_tail(&atom->dep_item[0], &ctx->event_list);
-		atomic_add(event_count, &ctx->event_count);
-		mutex_unlock(&ctx->event_mutex);
-
-		kbase_event_wakeup(ctx);
-	}
-}
-KBASE_EXPORT_TEST_API(kbase_event_post);
-
-void kbase_event_close(struct kbase_context *kctx)
-{
-	mutex_lock(&kctx->event_mutex);
-	atomic_set(&kctx->event_closed, true);
-	mutex_unlock(&kctx->event_mutex);
-	kbase_event_wakeup(kctx);
-}
-
-int kbase_event_init(struct kbase_context *kctx)
-{
-	KBASE_DEBUG_ASSERT(kctx);
-
-	INIT_LIST_HEAD(&kctx->event_list);
-	INIT_LIST_HEAD(&kctx->event_coalesce_list);
-	mutex_init(&kctx->event_mutex);
-	atomic_set(&kctx->event_count, 0);
-	kctx->event_coalesce_count = 0;
-	atomic_set(&kctx->event_closed, false);
-	kctx->event_workq = alloc_workqueue("kbase_event", WQ_MEM_RECLAIM, 1);
-
-	if (NULL == kctx->event_workq)
-		return -EINVAL;
-
-	return 0;
-}
-
-KBASE_EXPORT_TEST_API(kbase_event_init);
-
-void kbase_event_cleanup(struct kbase_context *kctx)
-{
-	int event_count;
-
-	KBASE_DEBUG_ASSERT(kctx);
-	KBASE_DEBUG_ASSERT(kctx->event_workq);
-
-	flush_workqueue(kctx->event_workq);
-	destroy_workqueue(kctx->event_workq);
-
-	/* We use kbase_event_dequeue to remove the remaining events as that
-	 * deals with all the cleanup needed for the atoms.
-	 *
-	 * Note: use of kctx->event_list without a lock is safe because this must be the last
-	 * thread using it (because we're about to terminate the lock)
-	 */
-	event_count = kbase_event_coalesce(kctx);
-	atomic_add(event_count, &kctx->event_count);
-
-	while (!list_empty(&kctx->event_list)) {
-		struct base_jd_event_v2 event;
-
-		kbase_event_dequeue(kctx, &event);
-	}
-}
-
-KBASE_EXPORT_TEST_API(kbase_event_cleanup);
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_fence.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_fence.c
deleted file mode 100644
index fcb373372596..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_fence.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <linux/atomic.h>
-#include <linux/list.h>
-#include <linux/spinlock.h>
-#include <mali_kbase_fence_defs.h>
-#include <mali_kbase_fence.h>
-#include <mali_kbase.h>
-
-/* Spin lock protecting all Mali fences as fence->lock. */
-static DEFINE_SPINLOCK(kbase_fence_lock);
-
-static const char *
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-kbase_fence_get_driver_name(struct fence *fence)
-#else
-kbase_fence_get_driver_name(struct dma_fence *fence)
-#endif
-{
-	return kbase_drv_name;
-}
-
-static const char *
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-kbase_fence_get_timeline_name(struct fence *fence)
-#else
-kbase_fence_get_timeline_name(struct dma_fence *fence)
-#endif
-{
-	return kbase_timeline_name;
-}
-
-static bool
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-kbase_fence_enable_signaling(struct fence *fence)
-#else
-kbase_fence_enable_signaling(struct dma_fence *fence)
-#endif
-{
-	return true;
-}
-
-static void
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-kbase_fence_fence_value_str(struct fence *fence, char *str, int size)
-#else
-kbase_fence_fence_value_str(struct dma_fence *fence, char *str, int size)
-#endif
-{
-	snprintf(str, size, "%u", fence->seqno);
-}
-
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-const struct fence_ops kbase_fence_ops = {
-	.wait = fence_default_wait,
-#else
-const struct dma_fence_ops kbase_fence_ops = {
-	.wait = dma_fence_default_wait,
-#endif
-	.get_driver_name = kbase_fence_get_driver_name,
-	.get_timeline_name = kbase_fence_get_timeline_name,
-	.enable_signaling = kbase_fence_enable_signaling,
-	.fence_value_str = kbase_fence_fence_value_str
-};
-
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-struct fence *
-kbase_fence_out_new(struct kbase_jd_atom *katom)
-#else
-struct dma_fence *
-kbase_fence_out_new(struct kbase_jd_atom *katom)
-#endif
-{
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-	struct fence *fence;
-#else
-	struct dma_fence *fence;
-#endif
-
-	WARN_ON(katom->dma_fence.fence);
-
-	fence = kzalloc(sizeof(*fence), GFP_KERNEL);
-	if (!fence)
-		return NULL;
-
-	dma_fence_init(fence,
-		       &kbase_fence_ops,
-		       &kbase_fence_lock,
-		       katom->dma_fence.context,
-		       atomic_inc_return(&katom->dma_fence.seqno));
-
-	katom->dma_fence.fence = fence;
-
-	return fence;
-}
-
-bool
-kbase_fence_free_callbacks(struct kbase_jd_atom *katom)
-{
-	struct kbase_fence_cb *cb, *tmp;
-	bool res = false;
-
-	lockdep_assert_held(&katom->kctx->jctx.lock);
-
-	/* Clean up and free callbacks. */
-	list_for_each_entry_safe(cb, tmp, &katom->dma_fence.callbacks, node) {
-		bool ret;
-
-		/* Cancel callbacks that hasn't been called yet. */
-		ret = dma_fence_remove_callback(cb->fence, &cb->fence_cb);
-		if (ret) {
-			int ret;
-
-			/* Fence had not signaled, clean up after
-			 * canceling.
-			 */
-			ret = atomic_dec_return(&katom->dma_fence.dep_count);
-
-			if (unlikely(ret == 0))
-				res = true;
-		}
-
-		/*
-		 * Release the reference taken in
-		 * kbase_fence_add_callback().
-		 */
-		dma_fence_put(cb->fence);
-		list_del(&cb->node);
-		kfree(cb);
-	}
-
-	return res;
-}
-
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-int
-kbase_fence_add_callback(struct kbase_jd_atom *katom,
-			 struct fence *fence,
-			 fence_func_t callback)
-#else
-int
-kbase_fence_add_callback(struct kbase_jd_atom *katom,
-			 struct dma_fence *fence,
-			 dma_fence_func_t callback)
-#endif
-{
-	int err = 0;
-	struct kbase_fence_cb *kbase_fence_cb;
-
-	if (!fence)
-		return -EINVAL;
-
-	kbase_fence_cb = kmalloc(sizeof(*kbase_fence_cb), GFP_KERNEL);
-	if (!kbase_fence_cb)
-		return -ENOMEM;
-
-	kbase_fence_cb->fence = fence;
-	kbase_fence_cb->katom = katom;
-	INIT_LIST_HEAD(&kbase_fence_cb->node);
-
-	err = dma_fence_add_callback(fence, &kbase_fence_cb->fence_cb,
-				     callback);
-	if (err == -ENOENT) {
-		/* Fence signaled, clear the error and return */
-		err = 0;
-		kfree(kbase_fence_cb);
-	} else if (err) {
-		kfree(kbase_fence_cb);
-	} else {
-		/*
-		 * Get reference to fence that will be kept until callback gets
-		 * cleaned up in kbase_fence_free_callbacks().
-		 */
-		dma_fence_get(fence);
-		atomic_inc(&katom->dma_fence.dep_count);
-		/* Add callback to katom's list of callbacks */
-		list_add(&kbase_fence_cb->node, &katom->dma_fence.callbacks);
-	}
-
-	return err;
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_fence.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_fence.h
deleted file mode 100644
index 9f59d30a1e2e..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_fence.h
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KBASE_FENCE_H_
-#define _KBASE_FENCE_H_
-
-/*
- * mali_kbase_fence.[hc] has common fence code used by both
- * - CONFIG_MALI_BIFROST_DMA_FENCE - implicit DMA fences
- * - CONFIG_SYNC_FILE      - explicit fences beginning with 4.9 kernel
- */
-
-#if defined(CONFIG_MALI_BIFROST_DMA_FENCE) || defined(CONFIG_SYNC_FILE)
-
-#include <linux/list.h>
-#include "mali_kbase_fence_defs.h"
-#include "mali_kbase.h"
-
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-extern const struct fence_ops kbase_fence_ops;
-#else
-extern const struct dma_fence_ops kbase_fence_ops;
-#endif
-
-/**
-* struct kbase_fence_cb - Mali dma-fence callback data struct
-* @fence_cb: Callback function
-* @katom:    Pointer to katom that is waiting on this callback
-* @fence:    Pointer to the fence object on which this callback is waiting
-* @node:     List head for linking this callback to the katom
-*/
-struct kbase_fence_cb {
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-	struct fence_cb fence_cb;
-	struct fence *fence;
-#else
-	struct dma_fence_cb fence_cb;
-	struct dma_fence *fence;
-#endif
-	struct kbase_jd_atom *katom;
-	struct list_head node;
-};
-
-/**
- * kbase_fence_out_new() - Creates a new output fence and puts it on the atom
- * @katom: Atom to create an output fence for
- *
- * return: A new fence object on success, NULL on failure.
- */
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-struct fence *kbase_fence_out_new(struct kbase_jd_atom *katom);
-#else
-struct dma_fence *kbase_fence_out_new(struct kbase_jd_atom *katom);
-#endif
-
-#if defined(CONFIG_SYNC_FILE)
-/**
- * kbase_fence_fence_in_set() - Assign input fence to atom
- * @katom: Atom to assign input fence to
- * @fence: Input fence to assign to atom
- *
- * This function will take ownership of one fence reference!
- */
-#define kbase_fence_fence_in_set(katom, fence) \
-	do { \
-		WARN_ON((katom)->dma_fence.fence_in); \
-		(katom)->dma_fence.fence_in = fence; \
-	} while (0)
-#endif
-
-/**
- * kbase_fence_out_remove() - Removes the output fence from atom
- * @katom: Atom to remove output fence for
- *
- * This will also release the reference to this fence which the atom keeps
- */
-static inline void kbase_fence_out_remove(struct kbase_jd_atom *katom)
-{
-	if (katom->dma_fence.fence) {
-		dma_fence_put(katom->dma_fence.fence);
-		katom->dma_fence.fence = NULL;
-	}
-}
-
-#if defined(CONFIG_SYNC_FILE)
-/**
- * kbase_fence_out_remove() - Removes the input fence from atom
- * @katom: Atom to remove input fence for
- *
- * This will also release the reference to this fence which the atom keeps
- */
-static inline void kbase_fence_in_remove(struct kbase_jd_atom *katom)
-{
-	if (katom->dma_fence.fence_in) {
-		dma_fence_put(katom->dma_fence.fence_in);
-		katom->dma_fence.fence_in = NULL;
-	}
-}
-#endif
-
-/**
- * kbase_fence_out_is_ours() - Check if atom has a valid fence created by us
- * @katom: Atom to check output fence for
- *
- * Return: true if fence exists and is valid, otherwise false
- */
-static inline bool kbase_fence_out_is_ours(struct kbase_jd_atom *katom)
-{
-	return katom->dma_fence.fence &&
-				katom->dma_fence.fence->ops == &kbase_fence_ops;
-}
-
-/**
- * kbase_fence_out_signal() - Signal output fence of atom
- * @katom: Atom to signal output fence for
- * @status: Status to signal with (0 for success, < 0 for error)
- *
- * Return: 0 on success, < 0 on error
- */
-static inline int kbase_fence_out_signal(struct kbase_jd_atom *katom,
-					 int status)
-{
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0))
-	katom->dma_fence.fence->error = status;
-#else
-	katom->dma_fence.fence->status = status;
-#endif
-	return dma_fence_signal(katom->dma_fence.fence);
-}
-
-/**
- * kbase_fence_add_callback() - Add callback on @fence to block @katom
- * @katom: Pointer to katom that will be blocked by @fence
- * @fence: Pointer to fence on which to set up the callback
- * @callback: Pointer to function to be called when fence is signaled
- *
- * Caller needs to hold a reference to @fence when calling this function, and
- * the caller is responsible for releasing that reference.  An additional
- * reference to @fence will be taken when the callback was successfully set up
- * and @fence needs to be kept valid until the callback has been called and
- * cleanup have been done.
- *
- * Return: 0 on success: fence was either already signaled, or callback was
- * set up. Negative error code is returned on error.
- */
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-int kbase_fence_add_callback(struct kbase_jd_atom *katom,
-			     struct fence *fence,
-			     fence_func_t callback);
-#else
-int kbase_fence_add_callback(struct kbase_jd_atom *katom,
-			     struct dma_fence *fence,
-			     dma_fence_func_t callback);
-#endif
-
-/**
- * kbase_fence_dep_count_set() - Set dep_count value on atom to specified value
- * @katom: Atom to set dep_count for
- * @val: value to set dep_count to
- *
- * The dep_count is available to the users of this module so that they can
- * synchronize completion of the wait with cancellation and adding of more
- * callbacks. For instance, a user could do the following:
- *
- * dep_count set to 1
- * callback #1 added, dep_count is increased to 2
- *                             callback #1 happens, dep_count decremented to 1
- *                             since dep_count > 0, no completion is done
- * callback #2 is added, dep_count is increased to 2
- * dep_count decremented to 1
- *                             callback #2 happens, dep_count decremented to 0
- *                             since dep_count now is zero, completion executes
- *
- * The dep_count can also be used to make sure that the completion only
- * executes once. This is typically done by setting dep_count to -1 for the
- * thread that takes on this responsibility.
- */
-static inline void
-kbase_fence_dep_count_set(struct kbase_jd_atom *katom, int val)
-{
-	atomic_set(&katom->dma_fence.dep_count, val);
-}
-
-/**
- * kbase_fence_dep_count_dec_and_test() - Decrements dep_count
- * @katom: Atom to decrement dep_count for
- *
- * See @kbase_fence_dep_count_set for general description about dep_count
- *
- * Return: true if value was decremented to zero, otherwise false
- */
-static inline bool
-kbase_fence_dep_count_dec_and_test(struct kbase_jd_atom *katom)
-{
-	return atomic_dec_and_test(&katom->dma_fence.dep_count);
-}
-
-/**
- * kbase_fence_dep_count_read() - Returns the current dep_count value
- * @katom: Pointer to katom
- *
- * See @kbase_fence_dep_count_set for general description about dep_count
- *
- * Return: The current dep_count value
- */
-static inline int kbase_fence_dep_count_read(struct kbase_jd_atom *katom)
-{
-	return atomic_read(&katom->dma_fence.dep_count);
-}
-
-/**
- * kbase_fence_free_callbacks() - Free dma-fence callbacks on a katom
- * @katom: Pointer to katom
- *
- * This function will free all fence callbacks on the katom's list of
- * callbacks. Callbacks that have not yet been called, because their fence
- * hasn't yet signaled, will first be removed from the fence.
- *
- * Locking: katom->dma_fence.callbacks list assumes jctx.lock is held.
- *
- * Return: true if dep_count reached 0, otherwise false.
- */
-bool kbase_fence_free_callbacks(struct kbase_jd_atom *katom);
-
-#if defined(CONFIG_SYNC_FILE)
-/**
- * kbase_fence_in_get() - Retrieve input fence for atom.
- * @katom: Atom to get input fence from
- *
- * A ref will be taken for the fence, so use @kbase_fence_put() to release it
- *
- * Return: The fence, or NULL if there is no input fence for atom
- */
-#define kbase_fence_in_get(katom) dma_fence_get((katom)->dma_fence.fence_in)
-#endif
-
-/**
- * kbase_fence_out_get() - Retrieve output fence for atom.
- * @katom: Atom to get output fence from
- *
- * A ref will be taken for the fence, so use @kbase_fence_put() to release it
- *
- * Return: The fence, or NULL if there is no output fence for atom
- */
-#define kbase_fence_out_get(katom) dma_fence_get((katom)->dma_fence.fence)
-
-/**
- * kbase_fence_put() - Releases a reference to a fence
- * @fence: Fence to release reference for.
- */
-#define kbase_fence_put(fence) dma_fence_put(fence)
-
-
-#endif /* CONFIG_MALI_BIFROST_DMA_FENCE || defined(CONFIG_SYNC_FILE */
-
-#endif /* _KBASE_FENCE_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_fence_defs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_fence_defs.h
deleted file mode 100644
index d2d7c436918c..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_fence_defs.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KBASE_FENCE_DEFS_H_
-#define _KBASE_FENCE_DEFS_H_
-
-/*
- * There was a big rename in the 4.10 kernel (fence* -> dma_fence*)
- * This file hides the compatibility issues with this for the rest the driver
- */
-
-#if defined(CONFIG_MALI_BIFROST_DMA_FENCE) || defined(CONFIG_SYNC_FILE)
-
-#include <linux/version.h>
-
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-
-#include <linux/fence.h>
-
-#define dma_fence_context_alloc(a) fence_context_alloc(a)
-#define dma_fence_init(a, b, c, d, e) fence_init(a, b, c, d, e)
-#define dma_fence_get(a) fence_get(a)
-#define dma_fence_put(a) fence_put(a)
-#define dma_fence_signal(a) fence_signal(a)
-#define dma_fence_is_signaled(a) fence_is_signaled(a)
-#define dma_fence_add_callback(a, b, c) fence_add_callback(a, b, c)
-#define dma_fence_remove_callback(a, b) fence_remove_callback(a, b)
-
-#else
-
-#include <linux/dma-fence.h>
-
-#endif /* < 4.10.0 */
-
-#endif /* CONFIG_MALI_BIFROST_DMA_FENCE || CONFIG_SYNC_FILE */
-
-#endif /* _KBASE_FENCE_DEFS_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator.h
deleted file mode 100644
index 87697b15d986..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/* NB taken from gator  */
-/*
- * List of possible actions to be controlled by DS-5 Streamline.
- * The following numbers are used by gator to control the frame buffer dumping
- * and s/w counter reporting. We cannot use the enums in mali_uk_types.h because
- * they are unknown inside gator.
- */
-#ifndef _KBASE_GATOR_H_
-#define _KBASE_GATOR_H_
-
-#ifdef CONFIG_MALI_BIFROST_GATOR_SUPPORT
-#define GATOR_MAKE_EVENT(type, number) (((type) << 24) | ((number) << 16))
-#define GATOR_JOB_SLOT_START 1
-#define GATOR_JOB_SLOT_STOP  2
-#define GATOR_JOB_SLOT_SOFT_STOPPED  3
-
-void kbase_trace_mali_job_slots_event(u32 event, const struct kbase_context *kctx, u8 atom_id);
-void kbase_trace_mali_pm_status(u32 event, u64 value);
-void kbase_trace_mali_pm_power_off(u32 event, u64 value);
-void kbase_trace_mali_pm_power_on(u32 event, u64 value);
-void kbase_trace_mali_page_fault_insert_pages(int event, u32 value);
-void kbase_trace_mali_mmu_as_in_use(int event);
-void kbase_trace_mali_mmu_as_released(int event);
-void kbase_trace_mali_total_alloc_pages_change(long long int event);
-
-#endif /* CONFIG_MALI_BIFROST_GATOR_SUPPORT */
-
-#endif  /* _KBASE_GATOR_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_api.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_api.c
deleted file mode 100644
index 860e10159fb3..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_api.c
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include "mali_kbase.h"
-#include "mali_kbase_hw.h"
-#include "mali_kbase_mem_linux.h"
-#include "mali_kbase_gator_api.h"
-#include "mali_kbase_gator_hwcnt_names.h"
-
-#define MALI_MAX_CORES_PER_GROUP		4
-#define MALI_MAX_NUM_BLOCKS_PER_GROUP	8
-#define MALI_COUNTERS_PER_BLOCK			64
-#define MALI_BYTES_PER_COUNTER			4
-
-struct kbase_gator_hwcnt_handles {
-	struct kbase_device *kbdev;
-	struct kbase_vinstr_client *vinstr_cli;
-	void *vinstr_buffer;
-	struct work_struct dump_work;
-	int dump_complete;
-	spinlock_t dump_lock;
-};
-
-static void dump_worker(struct work_struct *work);
-
-const char * const *kbase_gator_hwcnt_init_names(uint32_t *total_counters)
-{
-	const char * const *hardware_counters;
-	struct kbase_device *kbdev;
-	uint32_t product_id;
-	uint32_t count;
-
-	if (!total_counters)
-		return NULL;
-
-	/* Get the first device - it doesn't matter in this case */
-	kbdev = kbase_find_device(-1);
-	if (!kbdev)
-		return NULL;
-
-	product_id = kbdev->gpu_props.props.core_props.product_id;
-
-	if (GPU_ID_IS_NEW_FORMAT(product_id)) {
-		switch (GPU_ID2_MODEL_MATCH_VALUE(product_id)) {
-		case GPU_ID2_PRODUCT_TMIX:
-			hardware_counters = hardware_counters_mali_tMIx;
-			count = ARRAY_SIZE(hardware_counters_mali_tMIx);
-			break;
-		case GPU_ID2_PRODUCT_THEX:
-			hardware_counters = hardware_counters_mali_tHEx;
-			count = ARRAY_SIZE(hardware_counters_mali_tHEx);
-			break;
-		case GPU_ID2_PRODUCT_TSIX:
-			hardware_counters = hardware_counters_mali_tSIx;
-			count = ARRAY_SIZE(hardware_counters_mali_tSIx);
-			break;
-		default:
-			hardware_counters = NULL;
-			count = 0;
-			dev_err(kbdev->dev, "Unrecognized product ID: %u\n",
-				product_id);
-			break;
-		}
-	} else {
-		switch (product_id) {
-			/* If we are using a Mali-T60x device */
-		case GPU_ID_PI_T60X:
-			hardware_counters = hardware_counters_mali_t60x;
-			count = ARRAY_SIZE(hardware_counters_mali_t60x);
-			break;
-			/* If we are using a Mali-T62x device */
-		case GPU_ID_PI_T62X:
-			hardware_counters = hardware_counters_mali_t62x;
-			count = ARRAY_SIZE(hardware_counters_mali_t62x);
-			break;
-			/* If we are using a Mali-T72x device */
-		case GPU_ID_PI_T72X:
-			hardware_counters = hardware_counters_mali_t72x;
-			count = ARRAY_SIZE(hardware_counters_mali_t72x);
-			break;
-			/* If we are using a Mali-T76x device */
-		case GPU_ID_PI_T76X:
-			hardware_counters = hardware_counters_mali_t76x;
-			count = ARRAY_SIZE(hardware_counters_mali_t76x);
-			break;
-			/* If we are using a Mali-T82x device */
-		case GPU_ID_PI_T82X:
-			hardware_counters = hardware_counters_mali_t82x;
-			count = ARRAY_SIZE(hardware_counters_mali_t82x);
-			break;
-			/* If we are using a Mali-T83x device */
-		case GPU_ID_PI_T83X:
-			hardware_counters = hardware_counters_mali_t83x;
-			count = ARRAY_SIZE(hardware_counters_mali_t83x);
-			break;
-			/* If we are using a Mali-T86x device */
-		case GPU_ID_PI_T86X:
-			hardware_counters = hardware_counters_mali_t86x;
-			count = ARRAY_SIZE(hardware_counters_mali_t86x);
-			break;
-			/* If we are using a Mali-T88x device */
-		case GPU_ID_PI_TFRX:
-			hardware_counters = hardware_counters_mali_t88x;
-			count = ARRAY_SIZE(hardware_counters_mali_t88x);
-			break;
-		default:
-			hardware_counters = NULL;
-			count = 0;
-			dev_err(kbdev->dev, "Unrecognized product ID: %u\n",
-				product_id);
-			break;
-		}
-	}
-
-	/* Release the kbdev reference. */
-	kbase_release_device(kbdev);
-
-	*total_counters = count;
-
-	/* If we return a string array take a reference on the module (or fail). */
-	if (hardware_counters && !try_module_get(THIS_MODULE))
-		return NULL;
-
-	return hardware_counters;
-}
-KBASE_EXPORT_SYMBOL(kbase_gator_hwcnt_init_names);
-
-void kbase_gator_hwcnt_term_names(void)
-{
-	/* Release the module reference. */
-	module_put(THIS_MODULE);
-}
-KBASE_EXPORT_SYMBOL(kbase_gator_hwcnt_term_names);
-
-struct kbase_gator_hwcnt_handles *kbase_gator_hwcnt_init(struct kbase_gator_hwcnt_info *in_out_info)
-{
-	struct kbase_gator_hwcnt_handles *hand;
-	struct kbase_uk_hwcnt_reader_setup setup;
-	uint32_t dump_size = 0, i = 0;
-
-	if (!in_out_info)
-		return NULL;
-
-	hand = kzalloc(sizeof(*hand), GFP_KERNEL);
-	if (!hand)
-		return NULL;
-
-	INIT_WORK(&hand->dump_work, dump_worker);
-	spin_lock_init(&hand->dump_lock);
-
-	/* Get the first device */
-	hand->kbdev = kbase_find_device(-1);
-	if (!hand->kbdev)
-		goto free_hand;
-
-	dump_size = kbase_vinstr_dump_size(hand->kbdev);
-	hand->vinstr_buffer = kzalloc(dump_size, GFP_KERNEL);
-	if (!hand->vinstr_buffer)
-		goto release_device;
-	in_out_info->kernel_dump_buffer = hand->vinstr_buffer;
-
-	in_out_info->nr_cores = hand->kbdev->gpu_props.num_cores;
-	in_out_info->nr_core_groups = hand->kbdev->gpu_props.num_core_groups;
-	in_out_info->gpu_id = hand->kbdev->gpu_props.props.core_props.product_id;
-
-	/* If we are using a v4 device (Mali-T6xx or Mali-T72x) */
-	if (kbase_hw_has_feature(hand->kbdev, BASE_HW_FEATURE_V4)) {
-		uint32_t cg, j;
-		uint64_t core_mask;
-
-		/* There are 8 hardware counters blocks per core group */
-		in_out_info->hwc_layout = kmalloc(sizeof(enum hwc_type) *
-			MALI_MAX_NUM_BLOCKS_PER_GROUP *
-			in_out_info->nr_core_groups, GFP_KERNEL);
-
-		if (!in_out_info->hwc_layout)
-			goto free_vinstr_buffer;
-
-		dump_size = in_out_info->nr_core_groups *
-			MALI_MAX_NUM_BLOCKS_PER_GROUP *
-			MALI_COUNTERS_PER_BLOCK *
-			MALI_BYTES_PER_COUNTER;
-
-		for (cg = 0; cg < in_out_info->nr_core_groups; cg++) {
-			core_mask = hand->kbdev->gpu_props.props.coherency_info.group[cg].core_mask;
-
-			for (j = 0; j < MALI_MAX_CORES_PER_GROUP; j++) {
-				if (core_mask & (1u << j))
-					in_out_info->hwc_layout[i++] = SHADER_BLOCK;
-				else
-					in_out_info->hwc_layout[i++] = RESERVED_BLOCK;
-			}
-
-			in_out_info->hwc_layout[i++] = TILER_BLOCK;
-			in_out_info->hwc_layout[i++] = MMU_L2_BLOCK;
-
-			in_out_info->hwc_layout[i++] = RESERVED_BLOCK;
-
-			if (0 == cg)
-				in_out_info->hwc_layout[i++] = JM_BLOCK;
-			else
-				in_out_info->hwc_layout[i++] = RESERVED_BLOCK;
-		}
-	/* If we are using any other device */
-	} else {
-		uint32_t nr_l2, nr_sc_bits, j;
-		uint64_t core_mask;
-
-		nr_l2 = hand->kbdev->gpu_props.props.l2_props.num_l2_slices;
-
-		core_mask = hand->kbdev->gpu_props.props.coherency_info.group[0].core_mask;
-
-		nr_sc_bits = fls64(core_mask);
-
-		/* The job manager and tiler sets of counters
-		 * are always present */
-		in_out_info->hwc_layout = kmalloc(sizeof(enum hwc_type) * (2 + nr_sc_bits + nr_l2), GFP_KERNEL);
-
-		if (!in_out_info->hwc_layout)
-			goto free_vinstr_buffer;
-
-		dump_size = (2 + nr_sc_bits + nr_l2) * MALI_COUNTERS_PER_BLOCK * MALI_BYTES_PER_COUNTER;
-
-		in_out_info->hwc_layout[i++] = JM_BLOCK;
-		in_out_info->hwc_layout[i++] = TILER_BLOCK;
-
-		for (j = 0; j < nr_l2; j++)
-			in_out_info->hwc_layout[i++] = MMU_L2_BLOCK;
-
-		while (core_mask != 0ull) {
-			if ((core_mask & 1ull) != 0ull)
-				in_out_info->hwc_layout[i++] = SHADER_BLOCK;
-			else
-				in_out_info->hwc_layout[i++] = RESERVED_BLOCK;
-			core_mask >>= 1;
-		}
-	}
-
-	in_out_info->nr_hwc_blocks = i;
-	in_out_info->size = dump_size;
-
-	setup.jm_bm = in_out_info->bitmask[0];
-	setup.tiler_bm = in_out_info->bitmask[1];
-	setup.shader_bm = in_out_info->bitmask[2];
-	setup.mmu_l2_bm = in_out_info->bitmask[3];
-	hand->vinstr_cli = kbase_vinstr_hwcnt_kernel_setup(hand->kbdev->vinstr_ctx,
-			&setup, hand->vinstr_buffer);
-	if (!hand->vinstr_cli) {
-		dev_err(hand->kbdev->dev, "Failed to register gator with vinstr core");
-		goto free_layout;
-	}
-
-	return hand;
-
-free_layout:
-	kfree(in_out_info->hwc_layout);
-
-free_vinstr_buffer:
-	kfree(hand->vinstr_buffer);
-
-release_device:
-	kbase_release_device(hand->kbdev);
-
-free_hand:
-	kfree(hand);
-	return NULL;
-}
-KBASE_EXPORT_SYMBOL(kbase_gator_hwcnt_init);
-
-void kbase_gator_hwcnt_term(struct kbase_gator_hwcnt_info *in_out_info, struct kbase_gator_hwcnt_handles *opaque_handles)
-{
-	if (in_out_info)
-		kfree(in_out_info->hwc_layout);
-
-	if (opaque_handles) {
-		cancel_work_sync(&opaque_handles->dump_work);
-		kbase_vinstr_detach_client(opaque_handles->vinstr_cli);
-		kfree(opaque_handles->vinstr_buffer);
-		kbase_release_device(opaque_handles->kbdev);
-		kfree(opaque_handles);
-	}
-}
-KBASE_EXPORT_SYMBOL(kbase_gator_hwcnt_term);
-
-static void dump_worker(struct work_struct *work)
-{
-	struct kbase_gator_hwcnt_handles *hand;
-
-	hand = container_of(work, struct kbase_gator_hwcnt_handles, dump_work);
-	if (!kbase_vinstr_hwc_dump(hand->vinstr_cli,
-			BASE_HWCNT_READER_EVENT_MANUAL)) {
-		spin_lock_bh(&hand->dump_lock);
-		hand->dump_complete = 1;
-		spin_unlock_bh(&hand->dump_lock);
-	} else {
-		schedule_work(&hand->dump_work);
-	}
-}
-
-uint32_t kbase_gator_instr_hwcnt_dump_complete(
-		struct kbase_gator_hwcnt_handles *opaque_handles,
-		uint32_t * const success)
-{
-
-	if (opaque_handles && success) {
-		*success = opaque_handles->dump_complete;
-		opaque_handles->dump_complete = 0;
-		return *success;
-	}
-	return 0;
-}
-KBASE_EXPORT_SYMBOL(kbase_gator_instr_hwcnt_dump_complete);
-
-uint32_t kbase_gator_instr_hwcnt_dump_irq(struct kbase_gator_hwcnt_handles *opaque_handles)
-{
-	if (opaque_handles)
-		schedule_work(&opaque_handles->dump_work);
-	return 0;
-}
-KBASE_EXPORT_SYMBOL(kbase_gator_instr_hwcnt_dump_irq);
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_api.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_api.h
deleted file mode 100644
index ef9ac0f7b633..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_api.h
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KBASE_GATOR_API_H_
-#define _KBASE_GATOR_API_H_
-
-/**
- * @brief This file describes the API used by Gator to fetch hardware counters.
- */
-
-/* This define is used by the gator kernel module compile to select which DDK
- * API calling convention to use. If not defined (legacy DDK) gator assumes
- * version 1. The version to DDK release mapping is:
- *     Version 1 API: DDK versions r1px, r2px
- *     Version 2 API: DDK versions r3px, r4px
- *     Version 3 API: DDK version r5p0 and newer
- *
- * API Usage
- * =========
- *
- * 1] Call kbase_gator_hwcnt_init_names() to return the list of short counter
- * names for the GPU present in this device.
- *
- * 2] Create a kbase_gator_hwcnt_info structure and set the counter enables for
- * the counters you want enabled. The enables can all be set for simplicity in
- * most use cases, but disabling some will let you minimize bandwidth impact.
- *
- * 3] Call kbase_gator_hwcnt_init() using the above structure, to create a
- * counter context. On successful return the DDK will have populated the
- * structure with a variety of useful information.
- *
- * 4] Call kbase_gator_hwcnt_dump_irq() to queue a non-blocking request for a
- * counter dump. If this returns a non-zero value the request has been queued,
- * otherwise the driver has been unable to do so (typically because of another
- * user of the instrumentation exists concurrently).
- *
- * 5] Call kbase_gator_hwcnt_dump_complete() to test whether the  previously
- * requested dump has been succesful. If this returns non-zero the counter dump
- * has resolved, but the value of *success must also be tested as the dump
- * may have not been successful. If it returns zero the counter dump was
- * abandoned due to the device being busy (typically because of another
- * user of the instrumentation exists concurrently).
- *
- * 6] Process the counters stored in the buffer pointed to by ...
- *
- *        kbase_gator_hwcnt_info->kernel_dump_buffer
- *
- *    In pseudo code you can find all of the counters via this approach:
- *
- *
- *        hwcnt_info # pointer to kbase_gator_hwcnt_info structure
- *        hwcnt_name # pointer to name list
- *
- *        u32 * hwcnt_data = (u32*)hwcnt_info->kernel_dump_buffer
- *
- *        # Iterate over each 64-counter block in this GPU configuration
- *        for( i = 0; i < hwcnt_info->nr_hwc_blocks; i++) {
- *            hwc_type type = hwcnt_info->hwc_layout[i];
- *
- *            # Skip reserved type blocks - they contain no counters at all
- *            if( type == RESERVED_BLOCK ) {
- *                continue;
- *            }
- *
- *            size_t name_offset = type * 64;
- *            size_t data_offset = i * 64;
- *
- *            # Iterate over the names of the counters in this block type
- *            for( j = 0; j < 64; j++) {
- *                const char * name = hwcnt_name[name_offset+j];
- *
- *                # Skip empty name strings - there is no counter here
- *                if( name[0] == '\0' ) {
- *                    continue;
- *                }
- *
- *                u32 data = hwcnt_data[data_offset+j];
- *
- *                printk( "COUNTER: %s DATA: %u\n", name, data );
- *            }
- *        }
- *
- *
- *     Note that in most implementations you typically want to either SUM or
- *     AVERAGE multiple instances of the same counter if, for example, you have
- *     multiple shader cores or multiple L2 caches. The most sensible view for
- *     analysis is to AVERAGE shader core counters, but SUM L2 cache and MMU
- *     counters.
- *
- * 7] Goto 4, repeating until you want to stop collecting counters.
- *
- * 8] Release the dump resources by calling kbase_gator_hwcnt_term().
- *
- * 9] Release the name table resources by calling
- *    kbase_gator_hwcnt_term_names(). This function must only be called if
- *    init_names() returned a non-NULL value.
- **/
-
-#define MALI_DDK_GATOR_API_VERSION 3
-
-enum hwc_type {
-	JM_BLOCK = 0,
-	TILER_BLOCK,
-	SHADER_BLOCK,
-	MMU_L2_BLOCK,
-	RESERVED_BLOCK
-};
-
-struct kbase_gator_hwcnt_info {
-	/* Passed from Gator to kbase */
-
-	/* the bitmask of enabled hardware counters for each counter block */
-	uint16_t bitmask[4];
-
-	/* Passed from kbase to Gator */
-
-	/* ptr to counter dump memory */
-	void *kernel_dump_buffer;
-
-	/* size of counter dump memory */
-	uint32_t size;
-
-	/* the ID of the Mali device */
-	uint32_t gpu_id;
-
-	/* the number of shader cores in the GPU */
-	uint32_t nr_cores;
-
-	/* the number of core groups */
-	uint32_t nr_core_groups;
-
-	/* the memory layout of the performance counters */
-	enum hwc_type *hwc_layout;
-
-	/* the total number of hardware couter blocks */
-	uint32_t nr_hwc_blocks;
-};
-
-/**
- * @brief Opaque block of Mali data which Gator needs to return to the API later.
- */
-struct kbase_gator_hwcnt_handles;
-
-/**
- * @brief Initialize the resources Gator needs for performance profiling.
- *
- * @param in_out_info   A pointer to a structure containing the enabled counters passed from Gator and all the Mali
- *                      specific information that will be returned to Gator. On entry Gator must have populated the
- *                      'bitmask' field with the counters it wishes to enable for each class of counter block.
- *                      Each entry in the array corresponds to a single counter class based on the "hwc_type"
- *                      enumeration, and each bit corresponds to an enable for 4 sequential counters (LSB enables
- *                      the first 4 counters in the block, and so on). See the GPU counter array as returned by
- *                      kbase_gator_hwcnt_get_names() for the index values of each counter for the curernt GPU.
- *
- * @return              Pointer to an opaque handle block on success, NULL on error.
- */
-extern struct kbase_gator_hwcnt_handles *kbase_gator_hwcnt_init(struct kbase_gator_hwcnt_info *in_out_info);
-
-/**
- * @brief Free all resources once Gator has finished using performance counters.
- *
- * @param in_out_info       A pointer to a structure containing the enabled counters passed from Gator and all the
- *                          Mali specific information that will be returned to Gator.
- * @param opaque_handles    A wrapper structure for kbase structures.
- */
-extern void kbase_gator_hwcnt_term(struct kbase_gator_hwcnt_info *in_out_info, struct kbase_gator_hwcnt_handles *opaque_handles);
-
-/**
- * @brief Poll whether a counter dump is successful.
- *
- * @param opaque_handles    A wrapper structure for kbase structures.
- * @param[out] success      Non-zero on success, zero on failure.
- *
- * @return                  Zero if the dump is still pending, non-zero if the dump has completed. Note that a
- *                          completed dump may not have dumped succesfully, so the caller must test for both
- *                          a completed and successful dump before processing counters.
- */
-extern uint32_t kbase_gator_instr_hwcnt_dump_complete(struct kbase_gator_hwcnt_handles *opaque_handles, uint32_t * const success);
-
-/**
- * @brief Request the generation of a new counter dump.
- *
- * @param opaque_handles    A wrapper structure for kbase structures.
- *
- * @return                  Zero if the hardware device is busy and cannot handle the request, non-zero otherwise.
- */
-extern uint32_t kbase_gator_instr_hwcnt_dump_irq(struct kbase_gator_hwcnt_handles *opaque_handles);
-
-/**
- * @brief This function is used to fetch the names table based on the Mali device in use.
- *
- * @param[out] total_counters The total number of counters short names in the Mali devices' list.
- *
- * @return                    Pointer to an array of strings of length *total_counters.
- */
-extern const char * const *kbase_gator_hwcnt_init_names(uint32_t *total_counters);
-
-/**
- * @brief This function is used to terminate the use of the names table.
- *
- * This function must only be called if the initial call to kbase_gator_hwcnt_init_names returned a non-NULL value.
- */
-extern void kbase_gator_hwcnt_term_names(void);
-
-#endif
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names.h
deleted file mode 100644
index 24103e292453..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names.h
+++ /dev/null
@@ -1,2167 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KBASE_GATOR_HWCNT_NAMES_H_
-#define _KBASE_GATOR_HWCNT_NAMES_H_
-
-/*
- * "Short names" for hardware counters used by Streamline. Counters names are
- * stored in accordance with their memory layout in the binary counter block
- * emitted by the Mali GPU. Each "master" in the GPU emits a fixed-size block
- * of 64 counters, and each GPU implements the same set of "masters" although
- * the counters each master exposes within its block of 64 may vary.
- *
- * Counters which are an empty string are simply "holes" in the counter memory
- * where no counter exists.
- */
-
-static const char * const hardware_counters_mali_t60x[] = {
-	/* Job Manager */
-	"",
-	"",
-	"",
-	"",
-	"T60x_MESSAGES_SENT",
-	"T60x_MESSAGES_RECEIVED",
-	"T60x_GPU_ACTIVE",
-	"T60x_IRQ_ACTIVE",
-	"T60x_JS0_JOBS",
-	"T60x_JS0_TASKS",
-	"T60x_JS0_ACTIVE",
-	"",
-	"T60x_JS0_WAIT_READ",
-	"T60x_JS0_WAIT_ISSUE",
-	"T60x_JS0_WAIT_DEPEND",
-	"T60x_JS0_WAIT_FINISH",
-	"T60x_JS1_JOBS",
-	"T60x_JS1_TASKS",
-	"T60x_JS1_ACTIVE",
-	"",
-	"T60x_JS1_WAIT_READ",
-	"T60x_JS1_WAIT_ISSUE",
-	"T60x_JS1_WAIT_DEPEND",
-	"T60x_JS1_WAIT_FINISH",
-	"T60x_JS2_JOBS",
-	"T60x_JS2_TASKS",
-	"T60x_JS2_ACTIVE",
-	"",
-	"T60x_JS2_WAIT_READ",
-	"T60x_JS2_WAIT_ISSUE",
-	"T60x_JS2_WAIT_DEPEND",
-	"T60x_JS2_WAIT_FINISH",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-
-	/*Tiler */
-	"",
-	"",
-	"",
-	"T60x_TI_JOBS_PROCESSED",
-	"T60x_TI_TRIANGLES",
-	"T60x_TI_QUADS",
-	"T60x_TI_POLYGONS",
-	"T60x_TI_POINTS",
-	"T60x_TI_LINES",
-	"T60x_TI_VCACHE_HIT",
-	"T60x_TI_VCACHE_MISS",
-	"T60x_TI_FRONT_FACING",
-	"T60x_TI_BACK_FACING",
-	"T60x_TI_PRIM_VISIBLE",
-	"T60x_TI_PRIM_CULLED",
-	"T60x_TI_PRIM_CLIPPED",
-	"T60x_TI_LEVEL0",
-	"T60x_TI_LEVEL1",
-	"T60x_TI_LEVEL2",
-	"T60x_TI_LEVEL3",
-	"T60x_TI_LEVEL4",
-	"T60x_TI_LEVEL5",
-	"T60x_TI_LEVEL6",
-	"T60x_TI_LEVEL7",
-	"T60x_TI_COMMAND_1",
-	"T60x_TI_COMMAND_2",
-	"T60x_TI_COMMAND_3",
-	"T60x_TI_COMMAND_4",
-	"T60x_TI_COMMAND_4_7",
-	"T60x_TI_COMMAND_8_15",
-	"T60x_TI_COMMAND_16_63",
-	"T60x_TI_COMMAND_64",
-	"T60x_TI_COMPRESS_IN",
-	"T60x_TI_COMPRESS_OUT",
-	"T60x_TI_COMPRESS_FLUSH",
-	"T60x_TI_TIMESTAMPS",
-	"T60x_TI_PCACHE_HIT",
-	"T60x_TI_PCACHE_MISS",
-	"T60x_TI_PCACHE_LINE",
-	"T60x_TI_PCACHE_STALL",
-	"T60x_TI_WRBUF_HIT",
-	"T60x_TI_WRBUF_MISS",
-	"T60x_TI_WRBUF_LINE",
-	"T60x_TI_WRBUF_PARTIAL",
-	"T60x_TI_WRBUF_STALL",
-	"T60x_TI_ACTIVE",
-	"T60x_TI_LOADING_DESC",
-	"T60x_TI_INDEX_WAIT",
-	"T60x_TI_INDEX_RANGE_WAIT",
-	"T60x_TI_VERTEX_WAIT",
-	"T60x_TI_PCACHE_WAIT",
-	"T60x_TI_WRBUF_WAIT",
-	"T60x_TI_BUS_READ",
-	"T60x_TI_BUS_WRITE",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"T60x_TI_UTLB_STALL",
-	"T60x_TI_UTLB_REPLAY_MISS",
-	"T60x_TI_UTLB_REPLAY_FULL",
-	"T60x_TI_UTLB_NEW_MISS",
-	"T60x_TI_UTLB_HIT",
-
-	/* Shader Core */
-	"",
-	"",
-	"",
-	"",
-	"T60x_FRAG_ACTIVE",
-	"T60x_FRAG_PRIMITIVES",
-	"T60x_FRAG_PRIMITIVES_DROPPED",
-	"T60x_FRAG_CYCLES_DESC",
-	"T60x_FRAG_CYCLES_PLR",
-	"T60x_FRAG_CYCLES_VERT",
-	"T60x_FRAG_CYCLES_TRISETUP",
-	"T60x_FRAG_CYCLES_RAST",
-	"T60x_FRAG_THREADS",
-	"T60x_FRAG_DUMMY_THREADS",
-	"T60x_FRAG_QUADS_RAST",
-	"T60x_FRAG_QUADS_EZS_TEST",
-	"T60x_FRAG_QUADS_EZS_KILLED",
-	"T60x_FRAG_THREADS_LZS_TEST",
-	"T60x_FRAG_THREADS_LZS_KILLED",
-	"T60x_FRAG_CYCLES_NO_TILE",
-	"T60x_FRAG_NUM_TILES",
-	"T60x_FRAG_TRANS_ELIM",
-	"T60x_COMPUTE_ACTIVE",
-	"T60x_COMPUTE_TASKS",
-	"T60x_COMPUTE_THREADS",
-	"T60x_COMPUTE_CYCLES_DESC",
-	"T60x_TRIPIPE_ACTIVE",
-	"T60x_ARITH_WORDS",
-	"T60x_ARITH_CYCLES_REG",
-	"T60x_ARITH_CYCLES_L0",
-	"T60x_ARITH_FRAG_DEPEND",
-	"T60x_LS_WORDS",
-	"T60x_LS_ISSUES",
-	"T60x_LS_RESTARTS",
-	"T60x_LS_REISSUES_MISS",
-	"T60x_LS_REISSUES_VD",
-	"T60x_LS_REISSUE_ATTRIB_MISS",
-	"T60x_LS_NO_WB",
-	"T60x_TEX_WORDS",
-	"T60x_TEX_BUBBLES",
-	"T60x_TEX_WORDS_L0",
-	"T60x_TEX_WORDS_DESC",
-	"T60x_TEX_ISSUES",
-	"T60x_TEX_RECIRC_FMISS",
-	"T60x_TEX_RECIRC_DESC",
-	"T60x_TEX_RECIRC_MULTI",
-	"T60x_TEX_RECIRC_PMISS",
-	"T60x_TEX_RECIRC_CONF",
-	"T60x_LSC_READ_HITS",
-	"T60x_LSC_READ_MISSES",
-	"T60x_LSC_WRITE_HITS",
-	"T60x_LSC_WRITE_MISSES",
-	"T60x_LSC_ATOMIC_HITS",
-	"T60x_LSC_ATOMIC_MISSES",
-	"T60x_LSC_LINE_FETCHES",
-	"T60x_LSC_DIRTY_LINE",
-	"T60x_LSC_SNOOPS",
-	"T60x_AXI_TLB_STALL",
-	"T60x_AXI_TLB_MISS",
-	"T60x_AXI_TLB_TRANSACTION",
-	"T60x_LS_TLB_MISS",
-	"T60x_LS_TLB_HIT",
-	"T60x_AXI_BEATS_READ",
-	"T60x_AXI_BEATS_WRITTEN",
-
-	/*L2 and MMU */
-	"",
-	"",
-	"",
-	"",
-	"T60x_MMU_HIT",
-	"T60x_MMU_NEW_MISS",
-	"T60x_MMU_REPLAY_FULL",
-	"T60x_MMU_REPLAY_MISS",
-	"T60x_MMU_TABLE_WALK",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"T60x_UTLB_HIT",
-	"T60x_UTLB_NEW_MISS",
-	"T60x_UTLB_REPLAY_FULL",
-	"T60x_UTLB_REPLAY_MISS",
-	"T60x_UTLB_STALL",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"T60x_L2_EXT_WRITE_BEATS",
-	"T60x_L2_EXT_READ_BEATS",
-	"T60x_L2_ANY_LOOKUP",
-	"T60x_L2_READ_LOOKUP",
-	"T60x_L2_SREAD_LOOKUP",
-	"T60x_L2_READ_REPLAY",
-	"T60x_L2_READ_SNOOP",
-	"T60x_L2_READ_HIT",
-	"T60x_L2_CLEAN_MISS",
-	"T60x_L2_WRITE_LOOKUP",
-	"T60x_L2_SWRITE_LOOKUP",
-	"T60x_L2_WRITE_REPLAY",
-	"T60x_L2_WRITE_SNOOP",
-	"T60x_L2_WRITE_HIT",
-	"T60x_L2_EXT_READ_FULL",
-	"T60x_L2_EXT_READ_HALF",
-	"T60x_L2_EXT_WRITE_FULL",
-	"T60x_L2_EXT_WRITE_HALF",
-	"T60x_L2_EXT_READ",
-	"T60x_L2_EXT_READ_LINE",
-	"T60x_L2_EXT_WRITE",
-	"T60x_L2_EXT_WRITE_LINE",
-	"T60x_L2_EXT_WRITE_SMALL",
-	"T60x_L2_EXT_BARRIER",
-	"T60x_L2_EXT_AR_STALL",
-	"T60x_L2_EXT_R_BUF_FULL",
-	"T60x_L2_EXT_RD_BUF_FULL",
-	"T60x_L2_EXT_R_RAW",
-	"T60x_L2_EXT_W_STALL",
-	"T60x_L2_EXT_W_BUF_FULL",
-	"T60x_L2_EXT_R_W_HAZARD",
-	"T60x_L2_TAG_HAZARD",
-	"T60x_L2_SNOOP_FULL",
-	"T60x_L2_REPLAY_FULL"
-};
-static const char * const hardware_counters_mali_t62x[] = {
-	/* Job Manager */
-	"",
-	"",
-	"",
-	"",
-	"T62x_MESSAGES_SENT",
-	"T62x_MESSAGES_RECEIVED",
-	"T62x_GPU_ACTIVE",
-	"T62x_IRQ_ACTIVE",
-	"T62x_JS0_JOBS",
-	"T62x_JS0_TASKS",
-	"T62x_JS0_ACTIVE",
-	"",
-	"T62x_JS0_WAIT_READ",
-	"T62x_JS0_WAIT_ISSUE",
-	"T62x_JS0_WAIT_DEPEND",
-	"T62x_JS0_WAIT_FINISH",
-	"T62x_JS1_JOBS",
-	"T62x_JS1_TASKS",
-	"T62x_JS1_ACTIVE",
-	"",
-	"T62x_JS1_WAIT_READ",
-	"T62x_JS1_WAIT_ISSUE",
-	"T62x_JS1_WAIT_DEPEND",
-	"T62x_JS1_WAIT_FINISH",
-	"T62x_JS2_JOBS",
-	"T62x_JS2_TASKS",
-	"T62x_JS2_ACTIVE",
-	"",
-	"T62x_JS2_WAIT_READ",
-	"T62x_JS2_WAIT_ISSUE",
-	"T62x_JS2_WAIT_DEPEND",
-	"T62x_JS2_WAIT_FINISH",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-
-	/*Tiler */
-	"",
-	"",
-	"",
-	"T62x_TI_JOBS_PROCESSED",
-	"T62x_TI_TRIANGLES",
-	"T62x_TI_QUADS",
-	"T62x_TI_POLYGONS",
-	"T62x_TI_POINTS",
-	"T62x_TI_LINES",
-	"T62x_TI_VCACHE_HIT",
-	"T62x_TI_VCACHE_MISS",
-	"T62x_TI_FRONT_FACING",
-	"T62x_TI_BACK_FACING",
-	"T62x_TI_PRIM_VISIBLE",
-	"T62x_TI_PRIM_CULLED",
-	"T62x_TI_PRIM_CLIPPED",
-	"T62x_TI_LEVEL0",
-	"T62x_TI_LEVEL1",
-	"T62x_TI_LEVEL2",
-	"T62x_TI_LEVEL3",
-	"T62x_TI_LEVEL4",
-	"T62x_TI_LEVEL5",
-	"T62x_TI_LEVEL6",
-	"T62x_TI_LEVEL7",
-	"T62x_TI_COMMAND_1",
-	"T62x_TI_COMMAND_2",
-	"T62x_TI_COMMAND_3",
-	"T62x_TI_COMMAND_4",
-	"T62x_TI_COMMAND_5_7",
-	"T62x_TI_COMMAND_8_15",
-	"T62x_TI_COMMAND_16_63",
-	"T62x_TI_COMMAND_64",
-	"T62x_TI_COMPRESS_IN",
-	"T62x_TI_COMPRESS_OUT",
-	"T62x_TI_COMPRESS_FLUSH",
-	"T62x_TI_TIMESTAMPS",
-	"T62x_TI_PCACHE_HIT",
-	"T62x_TI_PCACHE_MISS",
-	"T62x_TI_PCACHE_LINE",
-	"T62x_TI_PCACHE_STALL",
-	"T62x_TI_WRBUF_HIT",
-	"T62x_TI_WRBUF_MISS",
-	"T62x_TI_WRBUF_LINE",
-	"T62x_TI_WRBUF_PARTIAL",
-	"T62x_TI_WRBUF_STALL",
-	"T62x_TI_ACTIVE",
-	"T62x_TI_LOADING_DESC",
-	"T62x_TI_INDEX_WAIT",
-	"T62x_TI_INDEX_RANGE_WAIT",
-	"T62x_TI_VERTEX_WAIT",
-	"T62x_TI_PCACHE_WAIT",
-	"T62x_TI_WRBUF_WAIT",
-	"T62x_TI_BUS_READ",
-	"T62x_TI_BUS_WRITE",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"T62x_TI_UTLB_STALL",
-	"T62x_TI_UTLB_REPLAY_MISS",
-	"T62x_TI_UTLB_REPLAY_FULL",
-	"T62x_TI_UTLB_NEW_MISS",
-	"T62x_TI_UTLB_HIT",
-
-	/* Shader Core */
-	"",
-	"",
-	"",
-	"T62x_SHADER_CORE_ACTIVE",
-	"T62x_FRAG_ACTIVE",
-	"T62x_FRAG_PRIMITIVES",
-	"T62x_FRAG_PRIMITIVES_DROPPED",
-	"T62x_FRAG_CYCLES_DESC",
-	"T62x_FRAG_CYCLES_FPKQ_ACTIVE",
-	"T62x_FRAG_CYCLES_VERT",
-	"T62x_FRAG_CYCLES_TRISETUP",
-	"T62x_FRAG_CYCLES_EZS_ACTIVE",
-	"T62x_FRAG_THREADS",
-	"T62x_FRAG_DUMMY_THREADS",
-	"T62x_FRAG_QUADS_RAST",
-	"T62x_FRAG_QUADS_EZS_TEST",
-	"T62x_FRAG_QUADS_EZS_KILLED",
-	"T62x_FRAG_THREADS_LZS_TEST",
-	"T62x_FRAG_THREADS_LZS_KILLED",
-	"T62x_FRAG_CYCLES_NO_TILE",
-	"T62x_FRAG_NUM_TILES",
-	"T62x_FRAG_TRANS_ELIM",
-	"T62x_COMPUTE_ACTIVE",
-	"T62x_COMPUTE_TASKS",
-	"T62x_COMPUTE_THREADS",
-	"T62x_COMPUTE_CYCLES_DESC",
-	"T62x_TRIPIPE_ACTIVE",
-	"T62x_ARITH_WORDS",
-	"T62x_ARITH_CYCLES_REG",
-	"T62x_ARITH_CYCLES_L0",
-	"T62x_ARITH_FRAG_DEPEND",
-	"T62x_LS_WORDS",
-	"T62x_LS_ISSUES",
-	"T62x_LS_RESTARTS",
-	"T62x_LS_REISSUES_MISS",
-	"T62x_LS_REISSUES_VD",
-	"T62x_LS_REISSUE_ATTRIB_MISS",
-	"T62x_LS_NO_WB",
-	"T62x_TEX_WORDS",
-	"T62x_TEX_BUBBLES",
-	"T62x_TEX_WORDS_L0",
-	"T62x_TEX_WORDS_DESC",
-	"T62x_TEX_ISSUES",
-	"T62x_TEX_RECIRC_FMISS",
-	"T62x_TEX_RECIRC_DESC",
-	"T62x_TEX_RECIRC_MULTI",
-	"T62x_TEX_RECIRC_PMISS",
-	"T62x_TEX_RECIRC_CONF",
-	"T62x_LSC_READ_HITS",
-	"T62x_LSC_READ_MISSES",
-	"T62x_LSC_WRITE_HITS",
-	"T62x_LSC_WRITE_MISSES",
-	"T62x_LSC_ATOMIC_HITS",
-	"T62x_LSC_ATOMIC_MISSES",
-	"T62x_LSC_LINE_FETCHES",
-	"T62x_LSC_DIRTY_LINE",
-	"T62x_LSC_SNOOPS",
-	"T62x_AXI_TLB_STALL",
-	"T62x_AXI_TLB_MISS",
-	"T62x_AXI_TLB_TRANSACTION",
-	"T62x_LS_TLB_MISS",
-	"T62x_LS_TLB_HIT",
-	"T62x_AXI_BEATS_READ",
-	"T62x_AXI_BEATS_WRITTEN",
-
-	/*L2 and MMU */
-	"",
-	"",
-	"",
-	"",
-	"T62x_MMU_HIT",
-	"T62x_MMU_NEW_MISS",
-	"T62x_MMU_REPLAY_FULL",
-	"T62x_MMU_REPLAY_MISS",
-	"T62x_MMU_TABLE_WALK",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"T62x_UTLB_HIT",
-	"T62x_UTLB_NEW_MISS",
-	"T62x_UTLB_REPLAY_FULL",
-	"T62x_UTLB_REPLAY_MISS",
-	"T62x_UTLB_STALL",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"T62x_L2_EXT_WRITE_BEATS",
-	"T62x_L2_EXT_READ_BEATS",
-	"T62x_L2_ANY_LOOKUP",
-	"T62x_L2_READ_LOOKUP",
-	"T62x_L2_SREAD_LOOKUP",
-	"T62x_L2_READ_REPLAY",
-	"T62x_L2_READ_SNOOP",
-	"T62x_L2_READ_HIT",
-	"T62x_L2_CLEAN_MISS",
-	"T62x_L2_WRITE_LOOKUP",
-	"T62x_L2_SWRITE_LOOKUP",
-	"T62x_L2_WRITE_REPLAY",
-	"T62x_L2_WRITE_SNOOP",
-	"T62x_L2_WRITE_HIT",
-	"T62x_L2_EXT_READ_FULL",
-	"T62x_L2_EXT_READ_HALF",
-	"T62x_L2_EXT_WRITE_FULL",
-	"T62x_L2_EXT_WRITE_HALF",
-	"T62x_L2_EXT_READ",
-	"T62x_L2_EXT_READ_LINE",
-	"T62x_L2_EXT_WRITE",
-	"T62x_L2_EXT_WRITE_LINE",
-	"T62x_L2_EXT_WRITE_SMALL",
-	"T62x_L2_EXT_BARRIER",
-	"T62x_L2_EXT_AR_STALL",
-	"T62x_L2_EXT_R_BUF_FULL",
-	"T62x_L2_EXT_RD_BUF_FULL",
-	"T62x_L2_EXT_R_RAW",
-	"T62x_L2_EXT_W_STALL",
-	"T62x_L2_EXT_W_BUF_FULL",
-	"T62x_L2_EXT_R_W_HAZARD",
-	"T62x_L2_TAG_HAZARD",
-	"T62x_L2_SNOOP_FULL",
-	"T62x_L2_REPLAY_FULL"
-};
-
-static const char * const hardware_counters_mali_t72x[] = {
-	/* Job Manager */
-	"",
-	"",
-	"",
-	"",
-	"T72x_GPU_ACTIVE",
-	"T72x_IRQ_ACTIVE",
-	"T72x_JS0_JOBS",
-	"T72x_JS0_TASKS",
-	"T72x_JS0_ACTIVE",
-	"T72x_JS1_JOBS",
-	"T72x_JS1_TASKS",
-	"T72x_JS1_ACTIVE",
-	"T72x_JS2_JOBS",
-	"T72x_JS2_TASKS",
-	"T72x_JS2_ACTIVE",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-
-	/*Tiler */
-	"",
-	"",
-	"",
-	"T72x_TI_JOBS_PROCESSED",
-	"T72x_TI_TRIANGLES",
-	"T72x_TI_QUADS",
-	"T72x_TI_POLYGONS",
-	"T72x_TI_POINTS",
-	"T72x_TI_LINES",
-	"T72x_TI_FRONT_FACING",
-	"T72x_TI_BACK_FACING",
-	"T72x_TI_PRIM_VISIBLE",
-	"T72x_TI_PRIM_CULLED",
-	"T72x_TI_PRIM_CLIPPED",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"T72x_TI_ACTIVE",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-
-	/* Shader Core */
-	"",
-	"",
-	"",
-	"",
-	"T72x_FRAG_ACTIVE",
-	"T72x_FRAG_PRIMITIVES",
-	"T72x_FRAG_PRIMITIVES_DROPPED",
-	"T72x_FRAG_THREADS",
-	"T72x_FRAG_DUMMY_THREADS",
-	"T72x_FRAG_QUADS_RAST",
-	"T72x_FRAG_QUADS_EZS_TEST",
-	"T72x_FRAG_QUADS_EZS_KILLED",
-	"T72x_FRAG_THREADS_LZS_TEST",
-	"T72x_FRAG_THREADS_LZS_KILLED",
-	"T72x_FRAG_CYCLES_NO_TILE",
-	"T72x_FRAG_NUM_TILES",
-	"T72x_FRAG_TRANS_ELIM",
-	"T72x_COMPUTE_ACTIVE",
-	"T72x_COMPUTE_TASKS",
-	"T72x_COMPUTE_THREADS",
-	"T72x_TRIPIPE_ACTIVE",
-	"T72x_ARITH_WORDS",
-	"T72x_ARITH_CYCLES_REG",
-	"T72x_LS_WORDS",
-	"T72x_LS_ISSUES",
-	"T72x_LS_RESTARTS",
-	"T72x_LS_REISSUES_MISS",
-	"T72x_TEX_WORDS",
-	"T72x_TEX_BUBBLES",
-	"T72x_TEX_ISSUES",
-	"T72x_LSC_READ_HITS",
-	"T72x_LSC_READ_MISSES",
-	"T72x_LSC_WRITE_HITS",
-	"T72x_LSC_WRITE_MISSES",
-	"T72x_LSC_ATOMIC_HITS",
-	"T72x_LSC_ATOMIC_MISSES",
-	"T72x_LSC_LINE_FETCHES",
-	"T72x_LSC_DIRTY_LINE",
-	"T72x_LSC_SNOOPS",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-
-	/*L2 and MMU */
-	"",
-	"",
-	"",
-	"",
-	"T72x_L2_EXT_WRITE_BEAT",
-	"T72x_L2_EXT_READ_BEAT",
-	"T72x_L2_READ_SNOOP",
-	"T72x_L2_READ_HIT",
-	"T72x_L2_WRITE_SNOOP",
-	"T72x_L2_WRITE_HIT",
-	"T72x_L2_EXT_WRITE_SMALL",
-	"T72x_L2_EXT_BARRIER",
-	"T72x_L2_EXT_AR_STALL",
-	"T72x_L2_EXT_W_STALL",
-	"T72x_L2_SNOOP_FULL",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	""
-};
-
-static const char * const hardware_counters_mali_t76x[] = {
-	/* Job Manager */
-	"",
-	"",
-	"",
-	"",
-	"T76x_MESSAGES_SENT",
-	"T76x_MESSAGES_RECEIVED",
-	"T76x_GPU_ACTIVE",
-	"T76x_IRQ_ACTIVE",
-	"T76x_JS0_JOBS",
-	"T76x_JS0_TASKS",
-	"T76x_JS0_ACTIVE",
-	"",
-	"T76x_JS0_WAIT_READ",
-	"T76x_JS0_WAIT_ISSUE",
-	"T76x_JS0_WAIT_DEPEND",
-	"T76x_JS0_WAIT_FINISH",
-	"T76x_JS1_JOBS",
-	"T76x_JS1_TASKS",
-	"T76x_JS1_ACTIVE",
-	"",
-	"T76x_JS1_WAIT_READ",
-	"T76x_JS1_WAIT_ISSUE",
-	"T76x_JS1_WAIT_DEPEND",
-	"T76x_JS1_WAIT_FINISH",
-	"T76x_JS2_JOBS",
-	"T76x_JS2_TASKS",
-	"T76x_JS2_ACTIVE",
-	"",
-	"T76x_JS2_WAIT_READ",
-	"T76x_JS2_WAIT_ISSUE",
-	"T76x_JS2_WAIT_DEPEND",
-	"T76x_JS2_WAIT_FINISH",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-
-	/*Tiler */
-	"",
-	"",
-	"",
-	"T76x_TI_JOBS_PROCESSED",
-	"T76x_TI_TRIANGLES",
-	"T76x_TI_QUADS",
-	"T76x_TI_POLYGONS",
-	"T76x_TI_POINTS",
-	"T76x_TI_LINES",
-	"T76x_TI_VCACHE_HIT",
-	"T76x_TI_VCACHE_MISS",
-	"T76x_TI_FRONT_FACING",
-	"T76x_TI_BACK_FACING",
-	"T76x_TI_PRIM_VISIBLE",
-	"T76x_TI_PRIM_CULLED",
-	"T76x_TI_PRIM_CLIPPED",
-	"T76x_TI_LEVEL0",
-	"T76x_TI_LEVEL1",
-	"T76x_TI_LEVEL2",
-	"T76x_TI_LEVEL3",
-	"T76x_TI_LEVEL4",
-	"T76x_TI_LEVEL5",
-	"T76x_TI_LEVEL6",
-	"T76x_TI_LEVEL7",
-	"T76x_TI_COMMAND_1",
-	"T76x_TI_COMMAND_2",
-	"T76x_TI_COMMAND_3",
-	"T76x_TI_COMMAND_4",
-	"T76x_TI_COMMAND_5_7",
-	"T76x_TI_COMMAND_8_15",
-	"T76x_TI_COMMAND_16_63",
-	"T76x_TI_COMMAND_64",
-	"T76x_TI_COMPRESS_IN",
-	"T76x_TI_COMPRESS_OUT",
-	"T76x_TI_COMPRESS_FLUSH",
-	"T76x_TI_TIMESTAMPS",
-	"T76x_TI_PCACHE_HIT",
-	"T76x_TI_PCACHE_MISS",
-	"T76x_TI_PCACHE_LINE",
-	"T76x_TI_PCACHE_STALL",
-	"T76x_TI_WRBUF_HIT",
-	"T76x_TI_WRBUF_MISS",
-	"T76x_TI_WRBUF_LINE",
-	"T76x_TI_WRBUF_PARTIAL",
-	"T76x_TI_WRBUF_STALL",
-	"T76x_TI_ACTIVE",
-	"T76x_TI_LOADING_DESC",
-	"T76x_TI_INDEX_WAIT",
-	"T76x_TI_INDEX_RANGE_WAIT",
-	"T76x_TI_VERTEX_WAIT",
-	"T76x_TI_PCACHE_WAIT",
-	"T76x_TI_WRBUF_WAIT",
-	"T76x_TI_BUS_READ",
-	"T76x_TI_BUS_WRITE",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"T76x_TI_UTLB_HIT",
-	"T76x_TI_UTLB_NEW_MISS",
-	"T76x_TI_UTLB_REPLAY_FULL",
-	"T76x_TI_UTLB_REPLAY_MISS",
-	"T76x_TI_UTLB_STALL",
-
-	/* Shader Core */
-	"",
-	"",
-	"",
-	"",
-	"T76x_FRAG_ACTIVE",
-	"T76x_FRAG_PRIMITIVES",
-	"T76x_FRAG_PRIMITIVES_DROPPED",
-	"T76x_FRAG_CYCLES_DESC",
-	"T76x_FRAG_CYCLES_FPKQ_ACTIVE",
-	"T76x_FRAG_CYCLES_VERT",
-	"T76x_FRAG_CYCLES_TRISETUP",
-	"T76x_FRAG_CYCLES_EZS_ACTIVE",
-	"T76x_FRAG_THREADS",
-	"T76x_FRAG_DUMMY_THREADS",
-	"T76x_FRAG_QUADS_RAST",
-	"T76x_FRAG_QUADS_EZS_TEST",
-	"T76x_FRAG_QUADS_EZS_KILLED",
-	"T76x_FRAG_THREADS_LZS_TEST",
-	"T76x_FRAG_THREADS_LZS_KILLED",
-	"T76x_FRAG_CYCLES_NO_TILE",
-	"T76x_FRAG_NUM_TILES",
-	"T76x_FRAG_TRANS_ELIM",
-	"T76x_COMPUTE_ACTIVE",
-	"T76x_COMPUTE_TASKS",
-	"T76x_COMPUTE_THREADS",
-	"T76x_COMPUTE_CYCLES_DESC",
-	"T76x_TRIPIPE_ACTIVE",
-	"T76x_ARITH_WORDS",
-	"T76x_ARITH_CYCLES_REG",
-	"T76x_ARITH_CYCLES_L0",
-	"T76x_ARITH_FRAG_DEPEND",
-	"T76x_LS_WORDS",
-	"T76x_LS_ISSUES",
-	"T76x_LS_REISSUE_ATTR",
-	"T76x_LS_REISSUES_VARY",
-	"T76x_LS_VARY_RV_MISS",
-	"T76x_LS_VARY_RV_HIT",
-	"T76x_LS_NO_UNPARK",
-	"T76x_TEX_WORDS",
-	"T76x_TEX_BUBBLES",
-	"T76x_TEX_WORDS_L0",
-	"T76x_TEX_WORDS_DESC",
-	"T76x_TEX_ISSUES",
-	"T76x_TEX_RECIRC_FMISS",
-	"T76x_TEX_RECIRC_DESC",
-	"T76x_TEX_RECIRC_MULTI",
-	"T76x_TEX_RECIRC_PMISS",
-	"T76x_TEX_RECIRC_CONF",
-	"T76x_LSC_READ_HITS",
-	"T76x_LSC_READ_OP",
-	"T76x_LSC_WRITE_HITS",
-	"T76x_LSC_WRITE_OP",
-	"T76x_LSC_ATOMIC_HITS",
-	"T76x_LSC_ATOMIC_OP",
-	"T76x_LSC_LINE_FETCHES",
-	"T76x_LSC_DIRTY_LINE",
-	"T76x_LSC_SNOOPS",
-	"T76x_AXI_TLB_STALL",
-	"T76x_AXI_TLB_MISS",
-	"T76x_AXI_TLB_TRANSACTION",
-	"T76x_LS_TLB_MISS",
-	"T76x_LS_TLB_HIT",
-	"T76x_AXI_BEATS_READ",
-	"T76x_AXI_BEATS_WRITTEN",
-
-	/*L2 and MMU */
-	"",
-	"",
-	"",
-	"",
-	"T76x_MMU_HIT",
-	"T76x_MMU_NEW_MISS",
-	"T76x_MMU_REPLAY_FULL",
-	"T76x_MMU_REPLAY_MISS",
-	"T76x_MMU_TABLE_WALK",
-	"T76x_MMU_REQUESTS",
-	"",
-	"",
-	"T76x_UTLB_HIT",
-	"T76x_UTLB_NEW_MISS",
-	"T76x_UTLB_REPLAY_FULL",
-	"T76x_UTLB_REPLAY_MISS",
-	"T76x_UTLB_STALL",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"T76x_L2_EXT_WRITE_BEATS",
-	"T76x_L2_EXT_READ_BEATS",
-	"T76x_L2_ANY_LOOKUP",
-	"T76x_L2_READ_LOOKUP",
-	"T76x_L2_SREAD_LOOKUP",
-	"T76x_L2_READ_REPLAY",
-	"T76x_L2_READ_SNOOP",
-	"T76x_L2_READ_HIT",
-	"T76x_L2_CLEAN_MISS",
-	"T76x_L2_WRITE_LOOKUP",
-	"T76x_L2_SWRITE_LOOKUP",
-	"T76x_L2_WRITE_REPLAY",
-	"T76x_L2_WRITE_SNOOP",
-	"T76x_L2_WRITE_HIT",
-	"T76x_L2_EXT_READ_FULL",
-	"",
-	"T76x_L2_EXT_WRITE_FULL",
-	"T76x_L2_EXT_R_W_HAZARD",
-	"T76x_L2_EXT_READ",
-	"T76x_L2_EXT_READ_LINE",
-	"T76x_L2_EXT_WRITE",
-	"T76x_L2_EXT_WRITE_LINE",
-	"T76x_L2_EXT_WRITE_SMALL",
-	"T76x_L2_EXT_BARRIER",
-	"T76x_L2_EXT_AR_STALL",
-	"T76x_L2_EXT_R_BUF_FULL",
-	"T76x_L2_EXT_RD_BUF_FULL",
-	"T76x_L2_EXT_R_RAW",
-	"T76x_L2_EXT_W_STALL",
-	"T76x_L2_EXT_W_BUF_FULL",
-	"T76x_L2_EXT_R_BUF_FULL",
-	"T76x_L2_TAG_HAZARD",
-	"T76x_L2_SNOOP_FULL",
-	"T76x_L2_REPLAY_FULL"
-};
-
-static const char * const hardware_counters_mali_t82x[] = {
-	/* Job Manager */
-	"",
-	"",
-	"",
-	"",
-	"T82x_MESSAGES_SENT",
-	"T82x_MESSAGES_RECEIVED",
-	"T82x_GPU_ACTIVE",
-	"T82x_IRQ_ACTIVE",
-	"T82x_JS0_JOBS",
-	"T82x_JS0_TASKS",
-	"T82x_JS0_ACTIVE",
-	"",
-	"T82x_JS0_WAIT_READ",
-	"T82x_JS0_WAIT_ISSUE",
-	"T82x_JS0_WAIT_DEPEND",
-	"T82x_JS0_WAIT_FINISH",
-	"T82x_JS1_JOBS",
-	"T82x_JS1_TASKS",
-	"T82x_JS1_ACTIVE",
-	"",
-	"T82x_JS1_WAIT_READ",
-	"T82x_JS1_WAIT_ISSUE",
-	"T82x_JS1_WAIT_DEPEND",
-	"T82x_JS1_WAIT_FINISH",
-	"T82x_JS2_JOBS",
-	"T82x_JS2_TASKS",
-	"T82x_JS2_ACTIVE",
-	"",
-	"T82x_JS2_WAIT_READ",
-	"T82x_JS2_WAIT_ISSUE",
-	"T82x_JS2_WAIT_DEPEND",
-	"T82x_JS2_WAIT_FINISH",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-
-	/*Tiler */
-	"",
-	"",
-	"",
-	"T82x_TI_JOBS_PROCESSED",
-	"T82x_TI_TRIANGLES",
-	"T82x_TI_QUADS",
-	"T82x_TI_POLYGONS",
-	"T82x_TI_POINTS",
-	"T82x_TI_LINES",
-	"T82x_TI_FRONT_FACING",
-	"T82x_TI_BACK_FACING",
-	"T82x_TI_PRIM_VISIBLE",
-	"T82x_TI_PRIM_CULLED",
-	"T82x_TI_PRIM_CLIPPED",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"T82x_TI_ACTIVE",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-
-	/* Shader Core */
-	"",
-	"",
-	"",
-	"",
-	"T82x_FRAG_ACTIVE",
-	"T82x_FRAG_PRIMITIVES",
-	"T82x_FRAG_PRIMITIVES_DROPPED",
-	"T82x_FRAG_CYCLES_DESC",
-	"T82x_FRAG_CYCLES_FPKQ_ACTIVE",
-	"T82x_FRAG_CYCLES_VERT",
-	"T82x_FRAG_CYCLES_TRISETUP",
-	"T82x_FRAG_CYCLES_EZS_ACTIVE",
-	"T82x_FRAG_THREADS",
-	"T82x_FRAG_DUMMY_THREADS",
-	"T82x_FRAG_QUADS_RAST",
-	"T82x_FRAG_QUADS_EZS_TEST",
-	"T82x_FRAG_QUADS_EZS_KILLED",
-	"T82x_FRAG_THREADS_LZS_TEST",
-	"T82x_FRAG_THREADS_LZS_KILLED",
-	"T82x_FRAG_CYCLES_NO_TILE",
-	"T82x_FRAG_NUM_TILES",
-	"T82x_FRAG_TRANS_ELIM",
-	"T82x_COMPUTE_ACTIVE",
-	"T82x_COMPUTE_TASKS",
-	"T82x_COMPUTE_THREADS",
-	"T82x_COMPUTE_CYCLES_DESC",
-	"T82x_TRIPIPE_ACTIVE",
-	"T82x_ARITH_WORDS",
-	"T82x_ARITH_CYCLES_REG",
-	"T82x_ARITH_CYCLES_L0",
-	"T82x_ARITH_FRAG_DEPEND",
-	"T82x_LS_WORDS",
-	"T82x_LS_ISSUES",
-	"T82x_LS_REISSUE_ATTR",
-	"T82x_LS_REISSUES_VARY",
-	"T82x_LS_VARY_RV_MISS",
-	"T82x_LS_VARY_RV_HIT",
-	"T82x_LS_NO_UNPARK",
-	"T82x_TEX_WORDS",
-	"T82x_TEX_BUBBLES",
-	"T82x_TEX_WORDS_L0",
-	"T82x_TEX_WORDS_DESC",
-	"T82x_TEX_ISSUES",
-	"T82x_TEX_RECIRC_FMISS",
-	"T82x_TEX_RECIRC_DESC",
-	"T82x_TEX_RECIRC_MULTI",
-	"T82x_TEX_RECIRC_PMISS",
-	"T82x_TEX_RECIRC_CONF",
-	"T82x_LSC_READ_HITS",
-	"T82x_LSC_READ_OP",
-	"T82x_LSC_WRITE_HITS",
-	"T82x_LSC_WRITE_OP",
-	"T82x_LSC_ATOMIC_HITS",
-	"T82x_LSC_ATOMIC_OP",
-	"T82x_LSC_LINE_FETCHES",
-	"T82x_LSC_DIRTY_LINE",
-	"T82x_LSC_SNOOPS",
-	"T82x_AXI_TLB_STALL",
-	"T82x_AXI_TLB_MISS",
-	"T82x_AXI_TLB_TRANSACTION",
-	"T82x_LS_TLB_MISS",
-	"T82x_LS_TLB_HIT",
-	"T82x_AXI_BEATS_READ",
-	"T82x_AXI_BEATS_WRITTEN",
-
-	/*L2 and MMU */
-	"",
-	"",
-	"",
-	"",
-	"T82x_MMU_HIT",
-	"T82x_MMU_NEW_MISS",
-	"T82x_MMU_REPLAY_FULL",
-	"T82x_MMU_REPLAY_MISS",
-	"T82x_MMU_TABLE_WALK",
-	"T82x_MMU_REQUESTS",
-	"",
-	"",
-	"T82x_UTLB_HIT",
-	"T82x_UTLB_NEW_MISS",
-	"T82x_UTLB_REPLAY_FULL",
-	"T82x_UTLB_REPLAY_MISS",
-	"T82x_UTLB_STALL",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"T82x_L2_EXT_WRITE_BEATS",
-	"T82x_L2_EXT_READ_BEATS",
-	"T82x_L2_ANY_LOOKUP",
-	"T82x_L2_READ_LOOKUP",
-	"T82x_L2_SREAD_LOOKUP",
-	"T82x_L2_READ_REPLAY",
-	"T82x_L2_READ_SNOOP",
-	"T82x_L2_READ_HIT",
-	"T82x_L2_CLEAN_MISS",
-	"T82x_L2_WRITE_LOOKUP",
-	"T82x_L2_SWRITE_LOOKUP",
-	"T82x_L2_WRITE_REPLAY",
-	"T82x_L2_WRITE_SNOOP",
-	"T82x_L2_WRITE_HIT",
-	"T82x_L2_EXT_READ_FULL",
-	"",
-	"T82x_L2_EXT_WRITE_FULL",
-	"T82x_L2_EXT_R_W_HAZARD",
-	"T82x_L2_EXT_READ",
-	"T82x_L2_EXT_READ_LINE",
-	"T82x_L2_EXT_WRITE",
-	"T82x_L2_EXT_WRITE_LINE",
-	"T82x_L2_EXT_WRITE_SMALL",
-	"T82x_L2_EXT_BARRIER",
-	"T82x_L2_EXT_AR_STALL",
-	"T82x_L2_EXT_R_BUF_FULL",
-	"T82x_L2_EXT_RD_BUF_FULL",
-	"T82x_L2_EXT_R_RAW",
-	"T82x_L2_EXT_W_STALL",
-	"T82x_L2_EXT_W_BUF_FULL",
-	"T82x_L2_EXT_R_BUF_FULL",
-	"T82x_L2_TAG_HAZARD",
-	"T82x_L2_SNOOP_FULL",
-	"T82x_L2_REPLAY_FULL"
-};
-
-static const char * const hardware_counters_mali_t83x[] = {
-	/* Job Manager */
-	"",
-	"",
-	"",
-	"",
-	"T83x_MESSAGES_SENT",
-	"T83x_MESSAGES_RECEIVED",
-	"T83x_GPU_ACTIVE",
-	"T83x_IRQ_ACTIVE",
-	"T83x_JS0_JOBS",
-	"T83x_JS0_TASKS",
-	"T83x_JS0_ACTIVE",
-	"",
-	"T83x_JS0_WAIT_READ",
-	"T83x_JS0_WAIT_ISSUE",
-	"T83x_JS0_WAIT_DEPEND",
-	"T83x_JS0_WAIT_FINISH",
-	"T83x_JS1_JOBS",
-	"T83x_JS1_TASKS",
-	"T83x_JS1_ACTIVE",
-	"",
-	"T83x_JS1_WAIT_READ",
-	"T83x_JS1_WAIT_ISSUE",
-	"T83x_JS1_WAIT_DEPEND",
-	"T83x_JS1_WAIT_FINISH",
-	"T83x_JS2_JOBS",
-	"T83x_JS2_TASKS",
-	"T83x_JS2_ACTIVE",
-	"",
-	"T83x_JS2_WAIT_READ",
-	"T83x_JS2_WAIT_ISSUE",
-	"T83x_JS2_WAIT_DEPEND",
-	"T83x_JS2_WAIT_FINISH",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-
-	/*Tiler */
-	"",
-	"",
-	"",
-	"T83x_TI_JOBS_PROCESSED",
-	"T83x_TI_TRIANGLES",
-	"T83x_TI_QUADS",
-	"T83x_TI_POLYGONS",
-	"T83x_TI_POINTS",
-	"T83x_TI_LINES",
-	"T83x_TI_FRONT_FACING",
-	"T83x_TI_BACK_FACING",
-	"T83x_TI_PRIM_VISIBLE",
-	"T83x_TI_PRIM_CULLED",
-	"T83x_TI_PRIM_CLIPPED",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"T83x_TI_ACTIVE",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-
-	/* Shader Core */
-	"",
-	"",
-	"",
-	"",
-	"T83x_FRAG_ACTIVE",
-	"T83x_FRAG_PRIMITIVES",
-	"T83x_FRAG_PRIMITIVES_DROPPED",
-	"T83x_FRAG_CYCLES_DESC",
-	"T83x_FRAG_CYCLES_FPKQ_ACTIVE",
-	"T83x_FRAG_CYCLES_VERT",
-	"T83x_FRAG_CYCLES_TRISETUP",
-	"T83x_FRAG_CYCLES_EZS_ACTIVE",
-	"T83x_FRAG_THREADS",
-	"T83x_FRAG_DUMMY_THREADS",
-	"T83x_FRAG_QUADS_RAST",
-	"T83x_FRAG_QUADS_EZS_TEST",
-	"T83x_FRAG_QUADS_EZS_KILLED",
-	"T83x_FRAG_THREADS_LZS_TEST",
-	"T83x_FRAG_THREADS_LZS_KILLED",
-	"T83x_FRAG_CYCLES_NO_TILE",
-	"T83x_FRAG_NUM_TILES",
-	"T83x_FRAG_TRANS_ELIM",
-	"T83x_COMPUTE_ACTIVE",
-	"T83x_COMPUTE_TASKS",
-	"T83x_COMPUTE_THREADS",
-	"T83x_COMPUTE_CYCLES_DESC",
-	"T83x_TRIPIPE_ACTIVE",
-	"T83x_ARITH_WORDS",
-	"T83x_ARITH_CYCLES_REG",
-	"T83x_ARITH_CYCLES_L0",
-	"T83x_ARITH_FRAG_DEPEND",
-	"T83x_LS_WORDS",
-	"T83x_LS_ISSUES",
-	"T83x_LS_REISSUE_ATTR",
-	"T83x_LS_REISSUES_VARY",
-	"T83x_LS_VARY_RV_MISS",
-	"T83x_LS_VARY_RV_HIT",
-	"T83x_LS_NO_UNPARK",
-	"T83x_TEX_WORDS",
-	"T83x_TEX_BUBBLES",
-	"T83x_TEX_WORDS_L0",
-	"T83x_TEX_WORDS_DESC",
-	"T83x_TEX_ISSUES",
-	"T83x_TEX_RECIRC_FMISS",
-	"T83x_TEX_RECIRC_DESC",
-	"T83x_TEX_RECIRC_MULTI",
-	"T83x_TEX_RECIRC_PMISS",
-	"T83x_TEX_RECIRC_CONF",
-	"T83x_LSC_READ_HITS",
-	"T83x_LSC_READ_OP",
-	"T83x_LSC_WRITE_HITS",
-	"T83x_LSC_WRITE_OP",
-	"T83x_LSC_ATOMIC_HITS",
-	"T83x_LSC_ATOMIC_OP",
-	"T83x_LSC_LINE_FETCHES",
-	"T83x_LSC_DIRTY_LINE",
-	"T83x_LSC_SNOOPS",
-	"T83x_AXI_TLB_STALL",
-	"T83x_AXI_TLB_MISS",
-	"T83x_AXI_TLB_TRANSACTION",
-	"T83x_LS_TLB_MISS",
-	"T83x_LS_TLB_HIT",
-	"T83x_AXI_BEATS_READ",
-	"T83x_AXI_BEATS_WRITTEN",
-
-	/*L2 and MMU */
-	"",
-	"",
-	"",
-	"",
-	"T83x_MMU_HIT",
-	"T83x_MMU_NEW_MISS",
-	"T83x_MMU_REPLAY_FULL",
-	"T83x_MMU_REPLAY_MISS",
-	"T83x_MMU_TABLE_WALK",
-	"T83x_MMU_REQUESTS",
-	"",
-	"",
-	"T83x_UTLB_HIT",
-	"T83x_UTLB_NEW_MISS",
-	"T83x_UTLB_REPLAY_FULL",
-	"T83x_UTLB_REPLAY_MISS",
-	"T83x_UTLB_STALL",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"T83x_L2_EXT_WRITE_BEATS",
-	"T83x_L2_EXT_READ_BEATS",
-	"T83x_L2_ANY_LOOKUP",
-	"T83x_L2_READ_LOOKUP",
-	"T83x_L2_SREAD_LOOKUP",
-	"T83x_L2_READ_REPLAY",
-	"T83x_L2_READ_SNOOP",
-	"T83x_L2_READ_HIT",
-	"T83x_L2_CLEAN_MISS",
-	"T83x_L2_WRITE_LOOKUP",
-	"T83x_L2_SWRITE_LOOKUP",
-	"T83x_L2_WRITE_REPLAY",
-	"T83x_L2_WRITE_SNOOP",
-	"T83x_L2_WRITE_HIT",
-	"T83x_L2_EXT_READ_FULL",
-	"",
-	"T83x_L2_EXT_WRITE_FULL",
-	"T83x_L2_EXT_R_W_HAZARD",
-	"T83x_L2_EXT_READ",
-	"T83x_L2_EXT_READ_LINE",
-	"T83x_L2_EXT_WRITE",
-	"T83x_L2_EXT_WRITE_LINE",
-	"T83x_L2_EXT_WRITE_SMALL",
-	"T83x_L2_EXT_BARRIER",
-	"T83x_L2_EXT_AR_STALL",
-	"T83x_L2_EXT_R_BUF_FULL",
-	"T83x_L2_EXT_RD_BUF_FULL",
-	"T83x_L2_EXT_R_RAW",
-	"T83x_L2_EXT_W_STALL",
-	"T83x_L2_EXT_W_BUF_FULL",
-	"T83x_L2_EXT_R_BUF_FULL",
-	"T83x_L2_TAG_HAZARD",
-	"T83x_L2_SNOOP_FULL",
-	"T83x_L2_REPLAY_FULL"
-};
-
-static const char * const hardware_counters_mali_t86x[] = {
-	/* Job Manager */
-	"",
-	"",
-	"",
-	"",
-	"T86x_MESSAGES_SENT",
-	"T86x_MESSAGES_RECEIVED",
-	"T86x_GPU_ACTIVE",
-	"T86x_IRQ_ACTIVE",
-	"T86x_JS0_JOBS",
-	"T86x_JS0_TASKS",
-	"T86x_JS0_ACTIVE",
-	"",
-	"T86x_JS0_WAIT_READ",
-	"T86x_JS0_WAIT_ISSUE",
-	"T86x_JS0_WAIT_DEPEND",
-	"T86x_JS0_WAIT_FINISH",
-	"T86x_JS1_JOBS",
-	"T86x_JS1_TASKS",
-	"T86x_JS1_ACTIVE",
-	"",
-	"T86x_JS1_WAIT_READ",
-	"T86x_JS1_WAIT_ISSUE",
-	"T86x_JS1_WAIT_DEPEND",
-	"T86x_JS1_WAIT_FINISH",
-	"T86x_JS2_JOBS",
-	"T86x_JS2_TASKS",
-	"T86x_JS2_ACTIVE",
-	"",
-	"T86x_JS2_WAIT_READ",
-	"T86x_JS2_WAIT_ISSUE",
-	"T86x_JS2_WAIT_DEPEND",
-	"T86x_JS2_WAIT_FINISH",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-
-	/*Tiler */
-	"",
-	"",
-	"",
-	"T86x_TI_JOBS_PROCESSED",
-	"T86x_TI_TRIANGLES",
-	"T86x_TI_QUADS",
-	"T86x_TI_POLYGONS",
-	"T86x_TI_POINTS",
-	"T86x_TI_LINES",
-	"T86x_TI_VCACHE_HIT",
-	"T86x_TI_VCACHE_MISS",
-	"T86x_TI_FRONT_FACING",
-	"T86x_TI_BACK_FACING",
-	"T86x_TI_PRIM_VISIBLE",
-	"T86x_TI_PRIM_CULLED",
-	"T86x_TI_PRIM_CLIPPED",
-	"T86x_TI_LEVEL0",
-	"T86x_TI_LEVEL1",
-	"T86x_TI_LEVEL2",
-	"T86x_TI_LEVEL3",
-	"T86x_TI_LEVEL4",
-	"T86x_TI_LEVEL5",
-	"T86x_TI_LEVEL6",
-	"T86x_TI_LEVEL7",
-	"T86x_TI_COMMAND_1",
-	"T86x_TI_COMMAND_2",
-	"T86x_TI_COMMAND_3",
-	"T86x_TI_COMMAND_4",
-	"T86x_TI_COMMAND_5_7",
-	"T86x_TI_COMMAND_8_15",
-	"T86x_TI_COMMAND_16_63",
-	"T86x_TI_COMMAND_64",
-	"T86x_TI_COMPRESS_IN",
-	"T86x_TI_COMPRESS_OUT",
-	"T86x_TI_COMPRESS_FLUSH",
-	"T86x_TI_TIMESTAMPS",
-	"T86x_TI_PCACHE_HIT",
-	"T86x_TI_PCACHE_MISS",
-	"T86x_TI_PCACHE_LINE",
-	"T86x_TI_PCACHE_STALL",
-	"T86x_TI_WRBUF_HIT",
-	"T86x_TI_WRBUF_MISS",
-	"T86x_TI_WRBUF_LINE",
-	"T86x_TI_WRBUF_PARTIAL",
-	"T86x_TI_WRBUF_STALL",
-	"T86x_TI_ACTIVE",
-	"T86x_TI_LOADING_DESC",
-	"T86x_TI_INDEX_WAIT",
-	"T86x_TI_INDEX_RANGE_WAIT",
-	"T86x_TI_VERTEX_WAIT",
-	"T86x_TI_PCACHE_WAIT",
-	"T86x_TI_WRBUF_WAIT",
-	"T86x_TI_BUS_READ",
-	"T86x_TI_BUS_WRITE",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"T86x_TI_UTLB_HIT",
-	"T86x_TI_UTLB_NEW_MISS",
-	"T86x_TI_UTLB_REPLAY_FULL",
-	"T86x_TI_UTLB_REPLAY_MISS",
-	"T86x_TI_UTLB_STALL",
-
-	/* Shader Core */
-	"",
-	"",
-	"",
-	"",
-	"T86x_FRAG_ACTIVE",
-	"T86x_FRAG_PRIMITIVES",
-	"T86x_FRAG_PRIMITIVES_DROPPED",
-	"T86x_FRAG_CYCLES_DESC",
-	"T86x_FRAG_CYCLES_FPKQ_ACTIVE",
-	"T86x_FRAG_CYCLES_VERT",
-	"T86x_FRAG_CYCLES_TRISETUP",
-	"T86x_FRAG_CYCLES_EZS_ACTIVE",
-	"T86x_FRAG_THREADS",
-	"T86x_FRAG_DUMMY_THREADS",
-	"T86x_FRAG_QUADS_RAST",
-	"T86x_FRAG_QUADS_EZS_TEST",
-	"T86x_FRAG_QUADS_EZS_KILLED",
-	"T86x_FRAG_THREADS_LZS_TEST",
-	"T86x_FRAG_THREADS_LZS_KILLED",
-	"T86x_FRAG_CYCLES_NO_TILE",
-	"T86x_FRAG_NUM_TILES",
-	"T86x_FRAG_TRANS_ELIM",
-	"T86x_COMPUTE_ACTIVE",
-	"T86x_COMPUTE_TASKS",
-	"T86x_COMPUTE_THREADS",
-	"T86x_COMPUTE_CYCLES_DESC",
-	"T86x_TRIPIPE_ACTIVE",
-	"T86x_ARITH_WORDS",
-	"T86x_ARITH_CYCLES_REG",
-	"T86x_ARITH_CYCLES_L0",
-	"T86x_ARITH_FRAG_DEPEND",
-	"T86x_LS_WORDS",
-	"T86x_LS_ISSUES",
-	"T86x_LS_REISSUE_ATTR",
-	"T86x_LS_REISSUES_VARY",
-	"T86x_LS_VARY_RV_MISS",
-	"T86x_LS_VARY_RV_HIT",
-	"T86x_LS_NO_UNPARK",
-	"T86x_TEX_WORDS",
-	"T86x_TEX_BUBBLES",
-	"T86x_TEX_WORDS_L0",
-	"T86x_TEX_WORDS_DESC",
-	"T86x_TEX_ISSUES",
-	"T86x_TEX_RECIRC_FMISS",
-	"T86x_TEX_RECIRC_DESC",
-	"T86x_TEX_RECIRC_MULTI",
-	"T86x_TEX_RECIRC_PMISS",
-	"T86x_TEX_RECIRC_CONF",
-	"T86x_LSC_READ_HITS",
-	"T86x_LSC_READ_OP",
-	"T86x_LSC_WRITE_HITS",
-	"T86x_LSC_WRITE_OP",
-	"T86x_LSC_ATOMIC_HITS",
-	"T86x_LSC_ATOMIC_OP",
-	"T86x_LSC_LINE_FETCHES",
-	"T86x_LSC_DIRTY_LINE",
-	"T86x_LSC_SNOOPS",
-	"T86x_AXI_TLB_STALL",
-	"T86x_AXI_TLB_MISS",
-	"T86x_AXI_TLB_TRANSACTION",
-	"T86x_LS_TLB_MISS",
-	"T86x_LS_TLB_HIT",
-	"T86x_AXI_BEATS_READ",
-	"T86x_AXI_BEATS_WRITTEN",
-
-	/*L2 and MMU */
-	"",
-	"",
-	"",
-	"",
-	"T86x_MMU_HIT",
-	"T86x_MMU_NEW_MISS",
-	"T86x_MMU_REPLAY_FULL",
-	"T86x_MMU_REPLAY_MISS",
-	"T86x_MMU_TABLE_WALK",
-	"T86x_MMU_REQUESTS",
-	"",
-	"",
-	"T86x_UTLB_HIT",
-	"T86x_UTLB_NEW_MISS",
-	"T86x_UTLB_REPLAY_FULL",
-	"T86x_UTLB_REPLAY_MISS",
-	"T86x_UTLB_STALL",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"T86x_L2_EXT_WRITE_BEATS",
-	"T86x_L2_EXT_READ_BEATS",
-	"T86x_L2_ANY_LOOKUP",
-	"T86x_L2_READ_LOOKUP",
-	"T86x_L2_SREAD_LOOKUP",
-	"T86x_L2_READ_REPLAY",
-	"T86x_L2_READ_SNOOP",
-	"T86x_L2_READ_HIT",
-	"T86x_L2_CLEAN_MISS",
-	"T86x_L2_WRITE_LOOKUP",
-	"T86x_L2_SWRITE_LOOKUP",
-	"T86x_L2_WRITE_REPLAY",
-	"T86x_L2_WRITE_SNOOP",
-	"T86x_L2_WRITE_HIT",
-	"T86x_L2_EXT_READ_FULL",
-	"",
-	"T86x_L2_EXT_WRITE_FULL",
-	"T86x_L2_EXT_R_W_HAZARD",
-	"T86x_L2_EXT_READ",
-	"T86x_L2_EXT_READ_LINE",
-	"T86x_L2_EXT_WRITE",
-	"T86x_L2_EXT_WRITE_LINE",
-	"T86x_L2_EXT_WRITE_SMALL",
-	"T86x_L2_EXT_BARRIER",
-	"T86x_L2_EXT_AR_STALL",
-	"T86x_L2_EXT_R_BUF_FULL",
-	"T86x_L2_EXT_RD_BUF_FULL",
-	"T86x_L2_EXT_R_RAW",
-	"T86x_L2_EXT_W_STALL",
-	"T86x_L2_EXT_W_BUF_FULL",
-	"T86x_L2_EXT_R_BUF_FULL",
-	"T86x_L2_TAG_HAZARD",
-	"T86x_L2_SNOOP_FULL",
-	"T86x_L2_REPLAY_FULL"
-};
-
-static const char * const hardware_counters_mali_t88x[] = {
-	/* Job Manager */
-	"",
-	"",
-	"",
-	"",
-	"T88x_MESSAGES_SENT",
-	"T88x_MESSAGES_RECEIVED",
-	"T88x_GPU_ACTIVE",
-	"T88x_IRQ_ACTIVE",
-	"T88x_JS0_JOBS",
-	"T88x_JS0_TASKS",
-	"T88x_JS0_ACTIVE",
-	"",
-	"T88x_JS0_WAIT_READ",
-	"T88x_JS0_WAIT_ISSUE",
-	"T88x_JS0_WAIT_DEPEND",
-	"T88x_JS0_WAIT_FINISH",
-	"T88x_JS1_JOBS",
-	"T88x_JS1_TASKS",
-	"T88x_JS1_ACTIVE",
-	"",
-	"T88x_JS1_WAIT_READ",
-	"T88x_JS1_WAIT_ISSUE",
-	"T88x_JS1_WAIT_DEPEND",
-	"T88x_JS1_WAIT_FINISH",
-	"T88x_JS2_JOBS",
-	"T88x_JS2_TASKS",
-	"T88x_JS2_ACTIVE",
-	"",
-	"T88x_JS2_WAIT_READ",
-	"T88x_JS2_WAIT_ISSUE",
-	"T88x_JS2_WAIT_DEPEND",
-	"T88x_JS2_WAIT_FINISH",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-
-	/*Tiler */
-	"",
-	"",
-	"",
-	"T88x_TI_JOBS_PROCESSED",
-	"T88x_TI_TRIANGLES",
-	"T88x_TI_QUADS",
-	"T88x_TI_POLYGONS",
-	"T88x_TI_POINTS",
-	"T88x_TI_LINES",
-	"T88x_TI_VCACHE_HIT",
-	"T88x_TI_VCACHE_MISS",
-	"T88x_TI_FRONT_FACING",
-	"T88x_TI_BACK_FACING",
-	"T88x_TI_PRIM_VISIBLE",
-	"T88x_TI_PRIM_CULLED",
-	"T88x_TI_PRIM_CLIPPED",
-	"T88x_TI_LEVEL0",
-	"T88x_TI_LEVEL1",
-	"T88x_TI_LEVEL2",
-	"T88x_TI_LEVEL3",
-	"T88x_TI_LEVEL4",
-	"T88x_TI_LEVEL5",
-	"T88x_TI_LEVEL6",
-	"T88x_TI_LEVEL7",
-	"T88x_TI_COMMAND_1",
-	"T88x_TI_COMMAND_2",
-	"T88x_TI_COMMAND_3",
-	"T88x_TI_COMMAND_4",
-	"T88x_TI_COMMAND_5_7",
-	"T88x_TI_COMMAND_8_15",
-	"T88x_TI_COMMAND_16_63",
-	"T88x_TI_COMMAND_64",
-	"T88x_TI_COMPRESS_IN",
-	"T88x_TI_COMPRESS_OUT",
-	"T88x_TI_COMPRESS_FLUSH",
-	"T88x_TI_TIMESTAMPS",
-	"T88x_TI_PCACHE_HIT",
-	"T88x_TI_PCACHE_MISS",
-	"T88x_TI_PCACHE_LINE",
-	"T88x_TI_PCACHE_STALL",
-	"T88x_TI_WRBUF_HIT",
-	"T88x_TI_WRBUF_MISS",
-	"T88x_TI_WRBUF_LINE",
-	"T88x_TI_WRBUF_PARTIAL",
-	"T88x_TI_WRBUF_STALL",
-	"T88x_TI_ACTIVE",
-	"T88x_TI_LOADING_DESC",
-	"T88x_TI_INDEX_WAIT",
-	"T88x_TI_INDEX_RANGE_WAIT",
-	"T88x_TI_VERTEX_WAIT",
-	"T88x_TI_PCACHE_WAIT",
-	"T88x_TI_WRBUF_WAIT",
-	"T88x_TI_BUS_READ",
-	"T88x_TI_BUS_WRITE",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"T88x_TI_UTLB_HIT",
-	"T88x_TI_UTLB_NEW_MISS",
-	"T88x_TI_UTLB_REPLAY_FULL",
-	"T88x_TI_UTLB_REPLAY_MISS",
-	"T88x_TI_UTLB_STALL",
-
-	/* Shader Core */
-	"",
-	"",
-	"",
-	"",
-	"T88x_FRAG_ACTIVE",
-	"T88x_FRAG_PRIMITIVES",
-	"T88x_FRAG_PRIMITIVES_DROPPED",
-	"T88x_FRAG_CYCLES_DESC",
-	"T88x_FRAG_CYCLES_FPKQ_ACTIVE",
-	"T88x_FRAG_CYCLES_VERT",
-	"T88x_FRAG_CYCLES_TRISETUP",
-	"T88x_FRAG_CYCLES_EZS_ACTIVE",
-	"T88x_FRAG_THREADS",
-	"T88x_FRAG_DUMMY_THREADS",
-	"T88x_FRAG_QUADS_RAST",
-	"T88x_FRAG_QUADS_EZS_TEST",
-	"T88x_FRAG_QUADS_EZS_KILLED",
-	"T88x_FRAG_THREADS_LZS_TEST",
-	"T88x_FRAG_THREADS_LZS_KILLED",
-	"T88x_FRAG_CYCLES_NO_TILE",
-	"T88x_FRAG_NUM_TILES",
-	"T88x_FRAG_TRANS_ELIM",
-	"T88x_COMPUTE_ACTIVE",
-	"T88x_COMPUTE_TASKS",
-	"T88x_COMPUTE_THREADS",
-	"T88x_COMPUTE_CYCLES_DESC",
-	"T88x_TRIPIPE_ACTIVE",
-	"T88x_ARITH_WORDS",
-	"T88x_ARITH_CYCLES_REG",
-	"T88x_ARITH_CYCLES_L0",
-	"T88x_ARITH_FRAG_DEPEND",
-	"T88x_LS_WORDS",
-	"T88x_LS_ISSUES",
-	"T88x_LS_REISSUE_ATTR",
-	"T88x_LS_REISSUES_VARY",
-	"T88x_LS_VARY_RV_MISS",
-	"T88x_LS_VARY_RV_HIT",
-	"T88x_LS_NO_UNPARK",
-	"T88x_TEX_WORDS",
-	"T88x_TEX_BUBBLES",
-	"T88x_TEX_WORDS_L0",
-	"T88x_TEX_WORDS_DESC",
-	"T88x_TEX_ISSUES",
-	"T88x_TEX_RECIRC_FMISS",
-	"T88x_TEX_RECIRC_DESC",
-	"T88x_TEX_RECIRC_MULTI",
-	"T88x_TEX_RECIRC_PMISS",
-	"T88x_TEX_RECIRC_CONF",
-	"T88x_LSC_READ_HITS",
-	"T88x_LSC_READ_OP",
-	"T88x_LSC_WRITE_HITS",
-	"T88x_LSC_WRITE_OP",
-	"T88x_LSC_ATOMIC_HITS",
-	"T88x_LSC_ATOMIC_OP",
-	"T88x_LSC_LINE_FETCHES",
-	"T88x_LSC_DIRTY_LINE",
-	"T88x_LSC_SNOOPS",
-	"T88x_AXI_TLB_STALL",
-	"T88x_AXI_TLB_MISS",
-	"T88x_AXI_TLB_TRANSACTION",
-	"T88x_LS_TLB_MISS",
-	"T88x_LS_TLB_HIT",
-	"T88x_AXI_BEATS_READ",
-	"T88x_AXI_BEATS_WRITTEN",
-
-	/*L2 and MMU */
-	"",
-	"",
-	"",
-	"",
-	"T88x_MMU_HIT",
-	"T88x_MMU_NEW_MISS",
-	"T88x_MMU_REPLAY_FULL",
-	"T88x_MMU_REPLAY_MISS",
-	"T88x_MMU_TABLE_WALK",
-	"T88x_MMU_REQUESTS",
-	"",
-	"",
-	"T88x_UTLB_HIT",
-	"T88x_UTLB_NEW_MISS",
-	"T88x_UTLB_REPLAY_FULL",
-	"T88x_UTLB_REPLAY_MISS",
-	"T88x_UTLB_STALL",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"T88x_L2_EXT_WRITE_BEATS",
-	"T88x_L2_EXT_READ_BEATS",
-	"T88x_L2_ANY_LOOKUP",
-	"T88x_L2_READ_LOOKUP",
-	"T88x_L2_SREAD_LOOKUP",
-	"T88x_L2_READ_REPLAY",
-	"T88x_L2_READ_SNOOP",
-	"T88x_L2_READ_HIT",
-	"T88x_L2_CLEAN_MISS",
-	"T88x_L2_WRITE_LOOKUP",
-	"T88x_L2_SWRITE_LOOKUP",
-	"T88x_L2_WRITE_REPLAY",
-	"T88x_L2_WRITE_SNOOP",
-	"T88x_L2_WRITE_HIT",
-	"T88x_L2_EXT_READ_FULL",
-	"",
-	"T88x_L2_EXT_WRITE_FULL",
-	"T88x_L2_EXT_R_W_HAZARD",
-	"T88x_L2_EXT_READ",
-	"T88x_L2_EXT_READ_LINE",
-	"T88x_L2_EXT_WRITE",
-	"T88x_L2_EXT_WRITE_LINE",
-	"T88x_L2_EXT_WRITE_SMALL",
-	"T88x_L2_EXT_BARRIER",
-	"T88x_L2_EXT_AR_STALL",
-	"T88x_L2_EXT_R_BUF_FULL",
-	"T88x_L2_EXT_RD_BUF_FULL",
-	"T88x_L2_EXT_R_RAW",
-	"T88x_L2_EXT_W_STALL",
-	"T88x_L2_EXT_W_BUF_FULL",
-	"T88x_L2_EXT_R_BUF_FULL",
-	"T88x_L2_TAG_HAZARD",
-	"T88x_L2_SNOOP_FULL",
-	"T88x_L2_REPLAY_FULL"
-};
-
-#include "mali_kbase_gator_hwcnt_names_tmix.h"
-
-#include "mali_kbase_gator_hwcnt_names_thex.h"
-
-#include "mali_kbase_gator_hwcnt_names_tsix.h"
-
-
-
-#endif
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_thex.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_thex.h
deleted file mode 100644
index 15fd4efdc6ca..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_thex.h
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2016-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * This header was autogenerated, it should not be edited.
- */
-
-#ifndef _KBASE_GATOR_HWCNT_NAMES_THEX_H_
-#define _KBASE_GATOR_HWCNT_NAMES_THEX_H_
-
-static const char * const hardware_counters_mali_tHEx[] = {
-	/* Performance counters for the Job Manager */
-	"",
-	"",
-	"",
-	"",
-	"THEx_MESSAGES_SENT",
-	"THEx_MESSAGES_RECEIVED",
-	"THEx_GPU_ACTIVE",
-	"THEx_IRQ_ACTIVE",
-	"THEx_JS0_JOBS",
-	"THEx_JS0_TASKS",
-	"THEx_JS0_ACTIVE",
-	"",
-	"THEx_JS0_WAIT_READ",
-	"THEx_JS0_WAIT_ISSUE",
-	"THEx_JS0_WAIT_DEPEND",
-	"THEx_JS0_WAIT_FINISH",
-	"THEx_JS1_JOBS",
-	"THEx_JS1_TASKS",
-	"THEx_JS1_ACTIVE",
-	"",
-	"THEx_JS1_WAIT_READ",
-	"THEx_JS1_WAIT_ISSUE",
-	"THEx_JS1_WAIT_DEPEND",
-	"THEx_JS1_WAIT_FINISH",
-	"THEx_JS2_JOBS",
-	"THEx_JS2_TASKS",
-	"THEx_JS2_ACTIVE",
-	"",
-	"THEx_JS2_WAIT_READ",
-	"THEx_JS2_WAIT_ISSUE",
-	"THEx_JS2_WAIT_DEPEND",
-	"THEx_JS2_WAIT_FINISH",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-
-	/* Performance counters for the Tiler */
-	"",
-	"",
-	"",
-	"",
-	"THEx_TILER_ACTIVE",
-	"THEx_JOBS_PROCESSED",
-	"THEx_TRIANGLES",
-	"THEx_LINES",
-	"THEx_POINTS",
-	"THEx_FRONT_FACING",
-	"THEx_BACK_FACING",
-	"THEx_PRIM_VISIBLE",
-	"THEx_PRIM_CULLED",
-	"THEx_PRIM_CLIPPED",
-	"THEx_PRIM_SAT_CULLED",
-	"THEx_BIN_ALLOC_INIT",
-	"THEx_BIN_ALLOC_OVERFLOW",
-	"THEx_BUS_READ",
-	"",
-	"THEx_BUS_WRITE",
-	"THEx_LOADING_DESC",
-	"THEx_IDVS_POS_SHAD_REQ",
-	"THEx_IDVS_POS_SHAD_WAIT",
-	"THEx_IDVS_POS_SHAD_STALL",
-	"THEx_IDVS_POS_FIFO_FULL",
-	"THEx_PREFETCH_STALL",
-	"THEx_VCACHE_HIT",
-	"THEx_VCACHE_MISS",
-	"THEx_VCACHE_LINE_WAIT",
-	"THEx_VFETCH_POS_READ_WAIT",
-	"THEx_VFETCH_VERTEX_WAIT",
-	"THEx_VFETCH_STALL",
-	"THEx_PRIMASSY_STALL",
-	"THEx_BBOX_GEN_STALL",
-	"THEx_IDVS_VBU_HIT",
-	"THEx_IDVS_VBU_MISS",
-	"THEx_IDVS_VBU_LINE_DEALLOCATE",
-	"THEx_IDVS_VAR_SHAD_REQ",
-	"THEx_IDVS_VAR_SHAD_STALL",
-	"THEx_BINNER_STALL",
-	"THEx_ITER_STALL",
-	"THEx_COMPRESS_MISS",
-	"THEx_COMPRESS_STALL",
-	"THEx_PCACHE_HIT",
-	"THEx_PCACHE_MISS",
-	"THEx_PCACHE_MISS_STALL",
-	"THEx_PCACHE_EVICT_STALL",
-	"THEx_PMGR_PTR_WR_STALL",
-	"THEx_PMGR_PTR_RD_STALL",
-	"THEx_PMGR_CMD_WR_STALL",
-	"THEx_WRBUF_ACTIVE",
-	"THEx_WRBUF_HIT",
-	"THEx_WRBUF_MISS",
-	"THEx_WRBUF_NO_FREE_LINE_STALL",
-	"THEx_WRBUF_NO_AXI_ID_STALL",
-	"THEx_WRBUF_AXI_STALL",
-	"",
-	"",
-	"",
-	"THEx_UTLB_TRANS",
-	"THEx_UTLB_TRANS_HIT",
-	"THEx_UTLB_TRANS_STALL",
-	"THEx_UTLB_TRANS_MISS_DELAY",
-	"THEx_UTLB_MMU_REQ",
-
-	/* Performance counters for the Shader Core */
-	"",
-	"",
-	"",
-	"",
-	"THEx_FRAG_ACTIVE",
-	"THEx_FRAG_PRIMITIVES",
-	"THEx_FRAG_PRIM_RAST",
-	"THEx_FRAG_FPK_ACTIVE",
-	"THEx_FRAG_STARVING",
-	"THEx_FRAG_WARPS",
-	"THEx_FRAG_PARTIAL_WARPS",
-	"THEx_FRAG_QUADS_RAST",
-	"THEx_FRAG_QUADS_EZS_TEST",
-	"THEx_FRAG_QUADS_EZS_UPDATE",
-	"THEx_FRAG_QUADS_EZS_KILL",
-	"THEx_FRAG_LZS_TEST",
-	"THEx_FRAG_LZS_KILL",
-	"",
-	"THEx_FRAG_PTILES",
-	"THEx_FRAG_TRANS_ELIM",
-	"THEx_QUAD_FPK_KILLER",
-	"",
-	"THEx_COMPUTE_ACTIVE",
-	"THEx_COMPUTE_TASKS",
-	"THEx_COMPUTE_WARPS",
-	"THEx_COMPUTE_STARVING",
-	"THEx_EXEC_CORE_ACTIVE",
-	"THEx_EXEC_ACTIVE",
-	"THEx_EXEC_INSTR_COUNT",
-	"THEx_EXEC_INSTR_DIVERGED",
-	"THEx_EXEC_INSTR_STARVING",
-	"THEx_ARITH_INSTR_SINGLE_FMA",
-	"THEx_ARITH_INSTR_DOUBLE",
-	"THEx_ARITH_INSTR_MSG",
-	"THEx_ARITH_INSTR_MSG_ONLY",
-	"THEx_TEX_INSTR",
-	"THEx_TEX_INSTR_MIPMAP",
-	"THEx_TEX_INSTR_COMPRESSED",
-	"THEx_TEX_INSTR_3D",
-	"THEx_TEX_INSTR_TRILINEAR",
-	"THEx_TEX_COORD_ISSUE",
-	"THEx_TEX_COORD_STALL",
-	"THEx_TEX_STARVE_CACHE",
-	"THEx_TEX_STARVE_FILTER",
-	"THEx_LS_MEM_READ_FULL",
-	"THEx_LS_MEM_READ_SHORT",
-	"THEx_LS_MEM_WRITE_FULL",
-	"THEx_LS_MEM_WRITE_SHORT",
-	"THEx_LS_MEM_ATOMIC",
-	"THEx_VARY_INSTR",
-	"THEx_VARY_SLOT_32",
-	"THEx_VARY_SLOT_16",
-	"THEx_ATTR_INSTR",
-	"THEx_ARITH_INSTR_FP_MUL",
-	"THEx_BEATS_RD_FTC",
-	"THEx_BEATS_RD_FTC_EXT",
-	"THEx_BEATS_RD_LSC",
-	"THEx_BEATS_RD_LSC_EXT",
-	"THEx_BEATS_RD_TEX",
-	"THEx_BEATS_RD_TEX_EXT",
-	"THEx_BEATS_RD_OTHER",
-	"THEx_BEATS_WR_LSC",
-	"THEx_BEATS_WR_TIB",
-	"",
-
-	/* Performance counters for the Memory System */
-	"",
-	"",
-	"",
-	"",
-	"THEx_MMU_REQUESTS",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"THEx_L2_RD_MSG_IN",
-	"THEx_L2_RD_MSG_IN_STALL",
-	"THEx_L2_WR_MSG_IN",
-	"THEx_L2_WR_MSG_IN_STALL",
-	"THEx_L2_SNP_MSG_IN",
-	"THEx_L2_SNP_MSG_IN_STALL",
-	"THEx_L2_RD_MSG_OUT",
-	"THEx_L2_RD_MSG_OUT_STALL",
-	"THEx_L2_WR_MSG_OUT",
-	"THEx_L2_ANY_LOOKUP",
-	"THEx_L2_READ_LOOKUP",
-	"THEx_L2_WRITE_LOOKUP",
-	"THEx_L2_EXT_SNOOP_LOOKUP",
-	"THEx_L2_EXT_READ",
-	"THEx_L2_EXT_READ_NOSNP",
-	"THEx_L2_EXT_READ_UNIQUE",
-	"THEx_L2_EXT_READ_BEATS",
-	"THEx_L2_EXT_AR_STALL",
-	"THEx_L2_EXT_AR_CNT_Q1",
-	"THEx_L2_EXT_AR_CNT_Q2",
-	"THEx_L2_EXT_AR_CNT_Q3",
-	"THEx_L2_EXT_RRESP_0_127",
-	"THEx_L2_EXT_RRESP_128_191",
-	"THEx_L2_EXT_RRESP_192_255",
-	"THEx_L2_EXT_RRESP_256_319",
-	"THEx_L2_EXT_RRESP_320_383",
-	"THEx_L2_EXT_WRITE",
-	"THEx_L2_EXT_WRITE_NOSNP_FULL",
-	"THEx_L2_EXT_WRITE_NOSNP_PTL",
-	"THEx_L2_EXT_WRITE_SNP_FULL",
-	"THEx_L2_EXT_WRITE_SNP_PTL",
-	"THEx_L2_EXT_WRITE_BEATS",
-	"THEx_L2_EXT_W_STALL",
-	"THEx_L2_EXT_AW_CNT_Q1",
-	"THEx_L2_EXT_AW_CNT_Q2",
-	"THEx_L2_EXT_AW_CNT_Q3",
-	"THEx_L2_EXT_SNOOP",
-	"THEx_L2_EXT_SNOOP_STALL",
-	"THEx_L2_EXT_SNOOP_RESP_CLEAN",
-	"THEx_L2_EXT_SNOOP_RESP_DATA",
-	"THEx_L2_EXT_SNOOP_INTERNAL",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-};
-
-#endif /* _KBASE_GATOR_HWCNT_NAMES_THEX_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tmix.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tmix.h
deleted file mode 100644
index 8a215f723570..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tmix.h
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2016-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * This header was autogenerated, it should not be edited.
- */
-
-#ifndef _KBASE_GATOR_HWCNT_NAMES_TMIX_H_
-#define _KBASE_GATOR_HWCNT_NAMES_TMIX_H_
-
-static const char * const hardware_counters_mali_tMIx[] = {
-	/* Performance counters for the Job Manager */
-	"",
-	"",
-	"",
-	"",
-	"TMIx_MESSAGES_SENT",
-	"TMIx_MESSAGES_RECEIVED",
-	"TMIx_GPU_ACTIVE",
-	"TMIx_IRQ_ACTIVE",
-	"TMIx_JS0_JOBS",
-	"TMIx_JS0_TASKS",
-	"TMIx_JS0_ACTIVE",
-	"",
-	"TMIx_JS0_WAIT_READ",
-	"TMIx_JS0_WAIT_ISSUE",
-	"TMIx_JS0_WAIT_DEPEND",
-	"TMIx_JS0_WAIT_FINISH",
-	"TMIx_JS1_JOBS",
-	"TMIx_JS1_TASKS",
-	"TMIx_JS1_ACTIVE",
-	"",
-	"TMIx_JS1_WAIT_READ",
-	"TMIx_JS1_WAIT_ISSUE",
-	"TMIx_JS1_WAIT_DEPEND",
-	"TMIx_JS1_WAIT_FINISH",
-	"TMIx_JS2_JOBS",
-	"TMIx_JS2_TASKS",
-	"TMIx_JS2_ACTIVE",
-	"",
-	"TMIx_JS2_WAIT_READ",
-	"TMIx_JS2_WAIT_ISSUE",
-	"TMIx_JS2_WAIT_DEPEND",
-	"TMIx_JS2_WAIT_FINISH",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-
-	/* Performance counters for the Tiler */
-	"",
-	"",
-	"",
-	"",
-	"TMIx_TILER_ACTIVE",
-	"TMIx_JOBS_PROCESSED",
-	"TMIx_TRIANGLES",
-	"TMIx_LINES",
-	"TMIx_POINTS",
-	"TMIx_FRONT_FACING",
-	"TMIx_BACK_FACING",
-	"TMIx_PRIM_VISIBLE",
-	"TMIx_PRIM_CULLED",
-	"TMIx_PRIM_CLIPPED",
-	"TMIx_PRIM_SAT_CULLED",
-	"TMIx_BIN_ALLOC_INIT",
-	"TMIx_BIN_ALLOC_OVERFLOW",
-	"TMIx_BUS_READ",
-	"",
-	"TMIx_BUS_WRITE",
-	"TMIx_LOADING_DESC",
-	"TMIx_IDVS_POS_SHAD_REQ",
-	"TMIx_IDVS_POS_SHAD_WAIT",
-	"TMIx_IDVS_POS_SHAD_STALL",
-	"TMIx_IDVS_POS_FIFO_FULL",
-	"TMIx_PREFETCH_STALL",
-	"TMIx_VCACHE_HIT",
-	"TMIx_VCACHE_MISS",
-	"TMIx_VCACHE_LINE_WAIT",
-	"TMIx_VFETCH_POS_READ_WAIT",
-	"TMIx_VFETCH_VERTEX_WAIT",
-	"TMIx_VFETCH_STALL",
-	"TMIx_PRIMASSY_STALL",
-	"TMIx_BBOX_GEN_STALL",
-	"TMIx_IDVS_VBU_HIT",
-	"TMIx_IDVS_VBU_MISS",
-	"TMIx_IDVS_VBU_LINE_DEALLOCATE",
-	"TMIx_IDVS_VAR_SHAD_REQ",
-	"TMIx_IDVS_VAR_SHAD_STALL",
-	"TMIx_BINNER_STALL",
-	"TMIx_ITER_STALL",
-	"TMIx_COMPRESS_MISS",
-	"TMIx_COMPRESS_STALL",
-	"TMIx_PCACHE_HIT",
-	"TMIx_PCACHE_MISS",
-	"TMIx_PCACHE_MISS_STALL",
-	"TMIx_PCACHE_EVICT_STALL",
-	"TMIx_PMGR_PTR_WR_STALL",
-	"TMIx_PMGR_PTR_RD_STALL",
-	"TMIx_PMGR_CMD_WR_STALL",
-	"TMIx_WRBUF_ACTIVE",
-	"TMIx_WRBUF_HIT",
-	"TMIx_WRBUF_MISS",
-	"TMIx_WRBUF_NO_FREE_LINE_STALL",
-	"TMIx_WRBUF_NO_AXI_ID_STALL",
-	"TMIx_WRBUF_AXI_STALL",
-	"",
-	"",
-	"",
-	"TMIx_UTLB_TRANS",
-	"TMIx_UTLB_TRANS_HIT",
-	"TMIx_UTLB_TRANS_STALL",
-	"TMIx_UTLB_TRANS_MISS_DELAY",
-	"TMIx_UTLB_MMU_REQ",
-
-	/* Performance counters for the Shader Core */
-	"",
-	"",
-	"",
-	"",
-	"TMIx_FRAG_ACTIVE",
-	"TMIx_FRAG_PRIMITIVES",
-	"TMIx_FRAG_PRIM_RAST",
-	"TMIx_FRAG_FPK_ACTIVE",
-	"TMIx_FRAG_STARVING",
-	"TMIx_FRAG_WARPS",
-	"TMIx_FRAG_PARTIAL_WARPS",
-	"TMIx_FRAG_QUADS_RAST",
-	"TMIx_FRAG_QUADS_EZS_TEST",
-	"TMIx_FRAG_QUADS_EZS_UPDATE",
-	"TMIx_FRAG_QUADS_EZS_KILL",
-	"TMIx_FRAG_LZS_TEST",
-	"TMIx_FRAG_LZS_KILL",
-	"",
-	"TMIx_FRAG_PTILES",
-	"TMIx_FRAG_TRANS_ELIM",
-	"TMIx_QUAD_FPK_KILLER",
-	"",
-	"TMIx_COMPUTE_ACTIVE",
-	"TMIx_COMPUTE_TASKS",
-	"TMIx_COMPUTE_WARPS",
-	"TMIx_COMPUTE_STARVING",
-	"TMIx_EXEC_CORE_ACTIVE",
-	"TMIx_EXEC_ACTIVE",
-	"TMIx_EXEC_INSTR_COUNT",
-	"TMIx_EXEC_INSTR_DIVERGED",
-	"TMIx_EXEC_INSTR_STARVING",
-	"TMIx_ARITH_INSTR_SINGLE_FMA",
-	"TMIx_ARITH_INSTR_DOUBLE",
-	"TMIx_ARITH_INSTR_MSG",
-	"TMIx_ARITH_INSTR_MSG_ONLY",
-	"TMIx_TEX_INSTR",
-	"TMIx_TEX_INSTR_MIPMAP",
-	"TMIx_TEX_INSTR_COMPRESSED",
-	"TMIx_TEX_INSTR_3D",
-	"TMIx_TEX_INSTR_TRILINEAR",
-	"TMIx_TEX_COORD_ISSUE",
-	"TMIx_TEX_COORD_STALL",
-	"TMIx_TEX_STARVE_CACHE",
-	"TMIx_TEX_STARVE_FILTER",
-	"TMIx_LS_MEM_READ_FULL",
-	"TMIx_LS_MEM_READ_SHORT",
-	"TMIx_LS_MEM_WRITE_FULL",
-	"TMIx_LS_MEM_WRITE_SHORT",
-	"TMIx_LS_MEM_ATOMIC",
-	"TMIx_VARY_INSTR",
-	"TMIx_VARY_SLOT_32",
-	"TMIx_VARY_SLOT_16",
-	"TMIx_ATTR_INSTR",
-	"TMIx_ARITH_INSTR_FP_MUL",
-	"TMIx_BEATS_RD_FTC",
-	"TMIx_BEATS_RD_FTC_EXT",
-	"TMIx_BEATS_RD_LSC",
-	"TMIx_BEATS_RD_LSC_EXT",
-	"TMIx_BEATS_RD_TEX",
-	"TMIx_BEATS_RD_TEX_EXT",
-	"TMIx_BEATS_RD_OTHER",
-	"TMIx_BEATS_WR_LSC",
-	"TMIx_BEATS_WR_TIB",
-	"",
-
-	/* Performance counters for the Memory System */
-	"",
-	"",
-	"",
-	"",
-	"TMIx_MMU_REQUESTS",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"TMIx_L2_RD_MSG_IN",
-	"TMIx_L2_RD_MSG_IN_STALL",
-	"TMIx_L2_WR_MSG_IN",
-	"TMIx_L2_WR_MSG_IN_STALL",
-	"TMIx_L2_SNP_MSG_IN",
-	"TMIx_L2_SNP_MSG_IN_STALL",
-	"TMIx_L2_RD_MSG_OUT",
-	"TMIx_L2_RD_MSG_OUT_STALL",
-	"TMIx_L2_WR_MSG_OUT",
-	"TMIx_L2_ANY_LOOKUP",
-	"TMIx_L2_READ_LOOKUP",
-	"TMIx_L2_WRITE_LOOKUP",
-	"TMIx_L2_EXT_SNOOP_LOOKUP",
-	"TMIx_L2_EXT_READ",
-	"TMIx_L2_EXT_READ_NOSNP",
-	"TMIx_L2_EXT_READ_UNIQUE",
-	"TMIx_L2_EXT_READ_BEATS",
-	"TMIx_L2_EXT_AR_STALL",
-	"TMIx_L2_EXT_AR_CNT_Q1",
-	"TMIx_L2_EXT_AR_CNT_Q2",
-	"TMIx_L2_EXT_AR_CNT_Q3",
-	"TMIx_L2_EXT_RRESP_0_127",
-	"TMIx_L2_EXT_RRESP_128_191",
-	"TMIx_L2_EXT_RRESP_192_255",
-	"TMIx_L2_EXT_RRESP_256_319",
-	"TMIx_L2_EXT_RRESP_320_383",
-	"TMIx_L2_EXT_WRITE",
-	"TMIx_L2_EXT_WRITE_NOSNP_FULL",
-	"TMIx_L2_EXT_WRITE_NOSNP_PTL",
-	"TMIx_L2_EXT_WRITE_SNP_FULL",
-	"TMIx_L2_EXT_WRITE_SNP_PTL",
-	"TMIx_L2_EXT_WRITE_BEATS",
-	"TMIx_L2_EXT_W_STALL",
-	"TMIx_L2_EXT_AW_CNT_Q1",
-	"TMIx_L2_EXT_AW_CNT_Q2",
-	"TMIx_L2_EXT_AW_CNT_Q3",
-	"TMIx_L2_EXT_SNOOP",
-	"TMIx_L2_EXT_SNOOP_STALL",
-	"TMIx_L2_EXT_SNOOP_RESP_CLEAN",
-	"TMIx_L2_EXT_SNOOP_RESP_DATA",
-	"TMIx_L2_EXT_SNOOP_INTERNAL",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-};
-
-#endif /* _KBASE_GATOR_HWCNT_NAMES_TMIX_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tsix.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tsix.h
deleted file mode 100644
index fb6a1437a1f6..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gator_hwcnt_names_tsix.h
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2016-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * This header was autogenerated, it should not be edited.
- */
-
-#ifndef _KBASE_GATOR_HWCNT_NAMES_TSIX_H_
-#define _KBASE_GATOR_HWCNT_NAMES_TSIX_H_
-
-static const char * const hardware_counters_mali_tSIx[] = {
-	/* Performance counters for the Job Manager */
-	"",
-	"",
-	"",
-	"",
-	"TSIx_MESSAGES_SENT",
-	"TSIx_MESSAGES_RECEIVED",
-	"TSIx_GPU_ACTIVE",
-	"TSIx_IRQ_ACTIVE",
-	"TSIx_JS0_JOBS",
-	"TSIx_JS0_TASKS",
-	"TSIx_JS0_ACTIVE",
-	"",
-	"TSIx_JS0_WAIT_READ",
-	"TSIx_JS0_WAIT_ISSUE",
-	"TSIx_JS0_WAIT_DEPEND",
-	"TSIx_JS0_WAIT_FINISH",
-	"TSIx_JS1_JOBS",
-	"TSIx_JS1_TASKS",
-	"TSIx_JS1_ACTIVE",
-	"",
-	"TSIx_JS1_WAIT_READ",
-	"TSIx_JS1_WAIT_ISSUE",
-	"TSIx_JS1_WAIT_DEPEND",
-	"TSIx_JS1_WAIT_FINISH",
-	"TSIx_JS2_JOBS",
-	"TSIx_JS2_TASKS",
-	"TSIx_JS2_ACTIVE",
-	"",
-	"TSIx_JS2_WAIT_READ",
-	"TSIx_JS2_WAIT_ISSUE",
-	"TSIx_JS2_WAIT_DEPEND",
-	"TSIx_JS2_WAIT_FINISH",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-
-	/* Performance counters for the Tiler */
-	"",
-	"",
-	"",
-	"",
-	"TSIx_TILER_ACTIVE",
-	"TSIx_JOBS_PROCESSED",
-	"TSIx_TRIANGLES",
-	"TSIx_LINES",
-	"TSIx_POINTS",
-	"TSIx_FRONT_FACING",
-	"TSIx_BACK_FACING",
-	"TSIx_PRIM_VISIBLE",
-	"TSIx_PRIM_CULLED",
-	"TSIx_PRIM_CLIPPED",
-	"TSIx_PRIM_SAT_CULLED",
-	"TSIx_BIN_ALLOC_INIT",
-	"TSIx_BIN_ALLOC_OVERFLOW",
-	"TSIx_BUS_READ",
-	"",
-	"TSIx_BUS_WRITE",
-	"TSIx_LOADING_DESC",
-	"TSIx_IDVS_POS_SHAD_REQ",
-	"TSIx_IDVS_POS_SHAD_WAIT",
-	"TSIx_IDVS_POS_SHAD_STALL",
-	"TSIx_IDVS_POS_FIFO_FULL",
-	"TSIx_PREFETCH_STALL",
-	"TSIx_VCACHE_HIT",
-	"TSIx_VCACHE_MISS",
-	"TSIx_VCACHE_LINE_WAIT",
-	"TSIx_VFETCH_POS_READ_WAIT",
-	"TSIx_VFETCH_VERTEX_WAIT",
-	"TSIx_VFETCH_STALL",
-	"TSIx_PRIMASSY_STALL",
-	"TSIx_BBOX_GEN_STALL",
-	"TSIx_IDVS_VBU_HIT",
-	"TSIx_IDVS_VBU_MISS",
-	"TSIx_IDVS_VBU_LINE_DEALLOCATE",
-	"TSIx_IDVS_VAR_SHAD_REQ",
-	"TSIx_IDVS_VAR_SHAD_STALL",
-	"TSIx_BINNER_STALL",
-	"TSIx_ITER_STALL",
-	"TSIx_COMPRESS_MISS",
-	"TSIx_COMPRESS_STALL",
-	"TSIx_PCACHE_HIT",
-	"TSIx_PCACHE_MISS",
-	"TSIx_PCACHE_MISS_STALL",
-	"TSIx_PCACHE_EVICT_STALL",
-	"TSIx_PMGR_PTR_WR_STALL",
-	"TSIx_PMGR_PTR_RD_STALL",
-	"TSIx_PMGR_CMD_WR_STALL",
-	"TSIx_WRBUF_ACTIVE",
-	"TSIx_WRBUF_HIT",
-	"TSIx_WRBUF_MISS",
-	"TSIx_WRBUF_NO_FREE_LINE_STALL",
-	"TSIx_WRBUF_NO_AXI_ID_STALL",
-	"TSIx_WRBUF_AXI_STALL",
-	"",
-	"",
-	"",
-	"TSIx_UTLB_TRANS",
-	"TSIx_UTLB_TRANS_HIT",
-	"TSIx_UTLB_TRANS_STALL",
-	"TSIx_UTLB_TRANS_MISS_DELAY",
-	"TSIx_UTLB_MMU_REQ",
-
-	/* Performance counters for the Shader Core */
-	"",
-	"",
-	"",
-	"",
-	"TSIx_FRAG_ACTIVE",
-	"TSIx_FRAG_PRIMITIVES",
-	"TSIx_FRAG_PRIM_RAST",
-	"TSIx_FRAG_FPK_ACTIVE",
-	"TSIx_FRAG_STARVING",
-	"TSIx_FRAG_WARPS",
-	"TSIx_FRAG_PARTIAL_WARPS",
-	"TSIx_FRAG_QUADS_RAST",
-	"TSIx_FRAG_QUADS_EZS_TEST",
-	"TSIx_FRAG_QUADS_EZS_UPDATE",
-	"TSIx_FRAG_QUADS_EZS_KILL",
-	"TSIx_FRAG_LZS_TEST",
-	"TSIx_FRAG_LZS_KILL",
-	"",
-	"TSIx_FRAG_PTILES",
-	"TSIx_FRAG_TRANS_ELIM",
-	"TSIx_QUAD_FPK_KILLER",
-	"",
-	"TSIx_COMPUTE_ACTIVE",
-	"TSIx_COMPUTE_TASKS",
-	"TSIx_COMPUTE_WARPS",
-	"TSIx_COMPUTE_STARVING",
-	"TSIx_EXEC_CORE_ACTIVE",
-	"TSIx_EXEC_ACTIVE",
-	"TSIx_EXEC_INSTR_COUNT",
-	"TSIx_EXEC_INSTR_DIVERGED",
-	"TSIx_EXEC_INSTR_STARVING",
-	"TSIx_ARITH_INSTR_SINGLE_FMA",
-	"TSIx_ARITH_INSTR_DOUBLE",
-	"TSIx_ARITH_INSTR_MSG",
-	"TSIx_ARITH_INSTR_MSG_ONLY",
-	"TSIx_TEX_MSGI_NUM_QUADS",
-	"TSIx_TEX_DFCH_NUM_PASSES",
-	"TSIx_TEX_DFCH_NUM_PASSES_MISS",
-	"TSIx_TEX_DFCH_NUM_PASSES_MIP_MAP",
-	"TSIx_TEX_TIDX_NUM_SPLIT_MIP_MAP",
-	"TSIx_TEX_TFCH_NUM_LINES_FETCHED",
-	"TSIx_TEX_TFCH_NUM_LINES_FETCHED_BLOCK",
-	"TSIx_TEX_TFCH_NUM_OPERATIONS",
-	"TSIx_TEX_FILT_NUM_OPERATIONS",
-	"TSIx_LS_MEM_READ_FULL",
-	"TSIx_LS_MEM_READ_SHORT",
-	"TSIx_LS_MEM_WRITE_FULL",
-	"TSIx_LS_MEM_WRITE_SHORT",
-	"TSIx_LS_MEM_ATOMIC",
-	"TSIx_VARY_INSTR",
-	"TSIx_VARY_SLOT_32",
-	"TSIx_VARY_SLOT_16",
-	"TSIx_ATTR_INSTR",
-	"TSIx_ARITH_INSTR_FP_MUL",
-	"TSIx_BEATS_RD_FTC",
-	"TSIx_BEATS_RD_FTC_EXT",
-	"TSIx_BEATS_RD_LSC",
-	"TSIx_BEATS_RD_LSC_EXT",
-	"TSIx_BEATS_RD_TEX",
-	"TSIx_BEATS_RD_TEX_EXT",
-	"TSIx_BEATS_RD_OTHER",
-	"TSIx_BEATS_WR_LSC",
-	"TSIx_BEATS_WR_TIB",
-	"",
-
-	/* Performance counters for the Memory System */
-	"",
-	"",
-	"",
-	"",
-	"TSIx_MMU_REQUESTS",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"TSIx_L2_RD_MSG_IN",
-	"TSIx_L2_RD_MSG_IN_STALL",
-	"TSIx_L2_WR_MSG_IN",
-	"TSIx_L2_WR_MSG_IN_STALL",
-	"TSIx_L2_SNP_MSG_IN",
-	"TSIx_L2_SNP_MSG_IN_STALL",
-	"TSIx_L2_RD_MSG_OUT",
-	"TSIx_L2_RD_MSG_OUT_STALL",
-	"TSIx_L2_WR_MSG_OUT",
-	"TSIx_L2_ANY_LOOKUP",
-	"TSIx_L2_READ_LOOKUP",
-	"TSIx_L2_WRITE_LOOKUP",
-	"TSIx_L2_EXT_SNOOP_LOOKUP",
-	"TSIx_L2_EXT_READ",
-	"TSIx_L2_EXT_READ_NOSNP",
-	"TSIx_L2_EXT_READ_UNIQUE",
-	"TSIx_L2_EXT_READ_BEATS",
-	"TSIx_L2_EXT_AR_STALL",
-	"TSIx_L2_EXT_AR_CNT_Q1",
-	"TSIx_L2_EXT_AR_CNT_Q2",
-	"TSIx_L2_EXT_AR_CNT_Q3",
-	"TSIx_L2_EXT_RRESP_0_127",
-	"TSIx_L2_EXT_RRESP_128_191",
-	"TSIx_L2_EXT_RRESP_192_255",
-	"TSIx_L2_EXT_RRESP_256_319",
-	"TSIx_L2_EXT_RRESP_320_383",
-	"TSIx_L2_EXT_WRITE",
-	"TSIx_L2_EXT_WRITE_NOSNP_FULL",
-	"TSIx_L2_EXT_WRITE_NOSNP_PTL",
-	"TSIx_L2_EXT_WRITE_SNP_FULL",
-	"TSIx_L2_EXT_WRITE_SNP_PTL",
-	"TSIx_L2_EXT_WRITE_BEATS",
-	"TSIx_L2_EXT_W_STALL",
-	"TSIx_L2_EXT_AW_CNT_Q1",
-	"TSIx_L2_EXT_AW_CNT_Q2",
-	"TSIx_L2_EXT_AW_CNT_Q3",
-	"TSIx_L2_EXT_SNOOP",
-	"TSIx_L2_EXT_SNOOP_STALL",
-	"TSIx_L2_EXT_SNOOP_RESP_CLEAN",
-	"TSIx_L2_EXT_SNOOP_RESP_DATA",
-	"TSIx_L2_EXT_SNOOP_INTERNAL",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-	"",
-};
-
-#endif /* _KBASE_GATOR_HWCNT_NAMES_TSIX_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpu_id.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpu_id.h
deleted file mode 100644
index 2d368dfaf644..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpu_id.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2015-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-#ifndef _KBASE_GPU_ID_H_
-#define _KBASE_GPU_ID_H_
-
-/* GPU_ID register */
-#define GPU_ID_VERSION_STATUS_SHIFT       0
-#define GPU_ID_VERSION_MINOR_SHIFT        4
-#define GPU_ID_VERSION_MAJOR_SHIFT        12
-#define GPU_ID_VERSION_PRODUCT_ID_SHIFT   16
-#define GPU_ID_VERSION_STATUS             (0xF  << GPU_ID_VERSION_STATUS_SHIFT)
-#define GPU_ID_VERSION_MINOR              (0xFF << GPU_ID_VERSION_MINOR_SHIFT)
-#define GPU_ID_VERSION_MAJOR              (0xF  << GPU_ID_VERSION_MAJOR_SHIFT)
-#define GPU_ID_VERSION_PRODUCT_ID  (0xFFFF << GPU_ID_VERSION_PRODUCT_ID_SHIFT)
-
-/* Values for GPU_ID_VERSION_PRODUCT_ID bitfield */
-#define GPU_ID_PI_T60X                    0x6956
-#define GPU_ID_PI_T62X                    0x0620
-#define GPU_ID_PI_T76X                    0x0750
-#define GPU_ID_PI_T72X                    0x0720
-#define GPU_ID_PI_TFRX                    0x0880
-#define GPU_ID_PI_T86X                    0x0860
-#define GPU_ID_PI_T82X                    0x0820
-#define GPU_ID_PI_T83X                    0x0830
-
-/* New GPU ID format when PRODUCT_ID is >= 0x1000 (and not 0x6956) */
-#define GPU_ID_PI_NEW_FORMAT_START        0x1000
-#define GPU_ID_IS_NEW_FORMAT(product_id)  ((product_id) != GPU_ID_PI_T60X && \
-						(product_id) >= \
-						GPU_ID_PI_NEW_FORMAT_START)
-
-#define GPU_ID2_VERSION_STATUS_SHIFT      0
-#define GPU_ID2_VERSION_MINOR_SHIFT       4
-#define GPU_ID2_VERSION_MAJOR_SHIFT       12
-#define GPU_ID2_PRODUCT_MAJOR_SHIFT       16
-#define GPU_ID2_ARCH_REV_SHIFT            20
-#define GPU_ID2_ARCH_MINOR_SHIFT          24
-#define GPU_ID2_ARCH_MAJOR_SHIFT          28
-#define GPU_ID2_VERSION_STATUS            (0xF << GPU_ID2_VERSION_STATUS_SHIFT)
-#define GPU_ID2_VERSION_MINOR             (0xFF << GPU_ID2_VERSION_MINOR_SHIFT)
-#define GPU_ID2_VERSION_MAJOR             (0xF << GPU_ID2_VERSION_MAJOR_SHIFT)
-#define GPU_ID2_PRODUCT_MAJOR             (0xF << GPU_ID2_PRODUCT_MAJOR_SHIFT)
-#define GPU_ID2_ARCH_REV                  (0xF << GPU_ID2_ARCH_REV_SHIFT)
-#define GPU_ID2_ARCH_MINOR                (0xF << GPU_ID2_ARCH_MINOR_SHIFT)
-#define GPU_ID2_ARCH_MAJOR                (0xF << GPU_ID2_ARCH_MAJOR_SHIFT)
-#define GPU_ID2_PRODUCT_MODEL  (GPU_ID2_ARCH_MAJOR | GPU_ID2_PRODUCT_MAJOR)
-#define GPU_ID2_VERSION        (GPU_ID2_VERSION_MAJOR | \
-								GPU_ID2_VERSION_MINOR | \
-								GPU_ID2_VERSION_STATUS)
-
-/* Helper macro to create a partial GPU_ID (new format) that defines
-   a product ignoring its version. */
-#define GPU_ID2_PRODUCT_MAKE(arch_major, arch_minor, arch_rev, product_major) \
-		(((arch_major) << GPU_ID2_ARCH_MAJOR_SHIFT)  | \
-		 ((arch_minor) << GPU_ID2_ARCH_MINOR_SHIFT)  | \
-		 ((arch_rev) << GPU_ID2_ARCH_REV_SHIFT)      | \
-		 ((product_major) << GPU_ID2_PRODUCT_MAJOR_SHIFT))
-
-/* Helper macro to create a partial GPU_ID (new format) that specifies the
-   revision (major, minor, status) of a product */
-#define GPU_ID2_VERSION_MAKE(version_major, version_minor, version_status) \
-		(((version_major) << GPU_ID2_VERSION_MAJOR_SHIFT)  | \
-		 ((version_minor) << GPU_ID2_VERSION_MINOR_SHIFT)  | \
-		 ((version_status) << GPU_ID2_VERSION_STATUS_SHIFT))
-
-/* Helper macro to create a complete GPU_ID (new format) */
-#define GPU_ID2_MAKE(arch_major, arch_minor, arch_rev, product_major, \
-	version_major, version_minor, version_status) \
-		(GPU_ID2_PRODUCT_MAKE(arch_major, arch_minor, arch_rev, \
-			product_major) | \
-		 GPU_ID2_VERSION_MAKE(version_major, version_minor,     \
-			version_status))
-
-/* Helper macro to create a partial GPU_ID (new format) that identifies
-   a particular GPU model by its arch_major and product_major. */
-#define GPU_ID2_MODEL_MAKE(arch_major, product_major) \
-		(((arch_major) << GPU_ID2_ARCH_MAJOR_SHIFT)  | \
-		((product_major) << GPU_ID2_PRODUCT_MAJOR_SHIFT))
-
-/* Strip off the non-relevant bits from a product_id value and make it suitable
-   for comparison against the GPU_ID2_PRODUCT_xxx values which identify a GPU
-   model. */
-#define GPU_ID2_MODEL_MATCH_VALUE(product_id) \
-		(((product_id) << GPU_ID2_PRODUCT_MAJOR_SHIFT) & \
-		    GPU_ID2_PRODUCT_MODEL)
-
-#define GPU_ID2_PRODUCT_TMIX              GPU_ID2_MODEL_MAKE(6u, 0)
-#define GPU_ID2_PRODUCT_THEX              GPU_ID2_MODEL_MAKE(6u, 1)
-#define GPU_ID2_PRODUCT_TSIX              GPU_ID2_MODEL_MAKE(7u, 0)
-#define GPU_ID2_PRODUCT_TDVX              GPU_ID2_MODEL_MAKE(7u, 3)
-
-/* Values for GPU_ID_VERSION_STATUS field for PRODUCT_ID GPU_ID_PI_T60X */
-#define GPU_ID_S_15DEV0                   0x1
-#define GPU_ID_S_EAC                      0x2
-
-/* Helper macro to create a GPU_ID assuming valid values for id, major,
-   minor, status */
-#define GPU_ID_MAKE(id, major, minor, status) \
-		(((id) << GPU_ID_VERSION_PRODUCT_ID_SHIFT) | \
-		((major) << GPU_ID_VERSION_MAJOR_SHIFT) |   \
-		((minor) << GPU_ID_VERSION_MINOR_SHIFT) |   \
-		((status) << GPU_ID_VERSION_STATUS_SHIFT))
-
-#endif /* _KBASE_GPU_ID_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpu_memory_debugfs.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpu_memory_debugfs.c
deleted file mode 100644
index 6df0a1cb1264..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpu_memory_debugfs.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <mali_kbase.h>
-
-#ifdef CONFIG_DEBUG_FS
-/** Show callback for the @c gpu_memory debugfs file.
- *
- * This function is called to get the contents of the @c gpu_memory debugfs
- * file. This is a report of current gpu memory usage.
- *
- * @param sfile The debugfs entry
- * @param data Data associated with the entry
- *
- * @return 0 if successfully prints data in debugfs entry file
- *         -1 if it encountered an error
- */
-
-static int kbasep_gpu_memory_seq_show(struct seq_file *sfile, void *data)
-{
-	struct list_head *entry;
-	const struct list_head *kbdev_list;
-
-	kbdev_list = kbase_dev_list_get();
-	list_for_each(entry, kbdev_list) {
-		struct kbase_device *kbdev = NULL;
-		struct kbasep_kctx_list_element *element;
-
-		kbdev = list_entry(entry, struct kbase_device, entry);
-		/* output the total memory usage and cap for this device */
-		seq_printf(sfile, "%-16s  %10u\n",
-				kbdev->devname,
-				atomic_read(&(kbdev->memdev.used_pages)));
-		mutex_lock(&kbdev->kctx_list_lock);
-		list_for_each_entry(element, &kbdev->kctx_list, link) {
-			/* output the memory usage and cap for each kctx
-			* opened on this device */
-			seq_printf(sfile, "  %s-0x%p %10u\n",
-				"kctx",
-				element->kctx,
-				atomic_read(&(element->kctx->used_pages)));
-		}
-		mutex_unlock(&kbdev->kctx_list_lock);
-	}
-	kbase_dev_list_put(kbdev_list);
-	return 0;
-}
-
-/*
- *  File operations related to debugfs entry for gpu_memory
- */
-static int kbasep_gpu_memory_debugfs_open(struct inode *in, struct file *file)
-{
-	return single_open(file, kbasep_gpu_memory_seq_show , NULL);
-}
-
-static const struct file_operations kbasep_gpu_memory_debugfs_fops = {
-	.open = kbasep_gpu_memory_debugfs_open,
-	.read = seq_read,
-	.llseek = seq_lseek,
-	.release = single_release,
-};
-
-/*
- *  Initialize debugfs entry for gpu_memory
- */
-void kbasep_gpu_memory_debugfs_init(struct kbase_device *kbdev)
-{
-	debugfs_create_file("gpu_memory", S_IRUGO,
-			kbdev->mali_debugfs_directory, NULL,
-			&kbasep_gpu_memory_debugfs_fops);
-	return;
-}
-
-#else
-/*
- * Stub functions for when debugfs is disabled
- */
-void kbasep_gpu_memory_debugfs_init(struct kbase_device *kbdev)
-{
-	return;
-}
-#endif
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpu_memory_debugfs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpu_memory_debugfs.h
deleted file mode 100644
index 7045693eb910..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpu_memory_debugfs.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2014, 2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/**
- * @file mali_kbase_gpu_memory_debugfs.h
- * Header file for gpu_memory entry in debugfs
- *
- */
-
-#ifndef _KBASE_GPU_MEMORY_DEBUGFS_H
-#define _KBASE_GPU_MEMORY_DEBUGFS_H
-
-#include <linux/debugfs.h>
-#include <linux/seq_file.h>
-
-/**
- * @brief Initialize gpu_memory debugfs entry
- */
-void kbasep_gpu_memory_debugfs_init(struct kbase_device *kbdev);
-
-#endif  /*_KBASE_GPU_MEMORY_DEBUGFS_H*/
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpuprops.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpuprops.c
deleted file mode 100644
index 4130810f1038..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpuprops.c
+++ /dev/null
@@ -1,514 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * Base kernel property query APIs
- */
-
-#include <mali_kbase.h>
-#include <mali_midg_regmap.h>
-#include <mali_kbase_gpuprops.h>
-#include <mali_kbase_config_defaults.h>
-#include <mali_kbase_hwaccess_gpuprops.h>
-#include "mali_kbase_ioctl.h"
-#include <linux/clk.h>
-
-/**
- * KBASE_UBFX32 - Extracts bits from a 32-bit bitfield.
- * @value:  The value from which to extract bits.
- * @offset: The first bit to extract (0 being the LSB).
- * @size:   The number of bits to extract.
- *
- * Context: @offset + @size <= 32.
- *
- * Return: Bits [@offset, @offset + @size) from @value.
- */
-/* from mali_cdsb.h */
-#define KBASE_UBFX32(value, offset, size) \
-	(((u32)(value) >> (u32)(offset)) & (u32)((1ULL << (u32)(size)) - 1))
-
-int kbase_gpuprops_uk_get_props(struct kbase_context *kctx, struct kbase_uk_gpuprops * const kbase_props)
-{
-	kbase_gpu_clk_speed_func get_gpu_speed_mhz;
-	u32 gpu_speed_mhz;
-	int rc = 1;
-
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-	KBASE_DEBUG_ASSERT(NULL != kbase_props);
-
-	/* Current GPU speed is requested from the system integrator via the GPU_SPEED_FUNC function.
-	 * If that function fails, or the function is not provided by the system integrator, we report the maximum
-	 * GPU speed as specified by GPU_FREQ_KHZ_MAX.
-	 */
-	get_gpu_speed_mhz = (kbase_gpu_clk_speed_func) GPU_SPEED_FUNC;
-	if (get_gpu_speed_mhz != NULL) {
-		rc = get_gpu_speed_mhz(&gpu_speed_mhz);
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-		/* Issue a warning message when the reported GPU speed falls outside the min/max range */
-		if (rc == 0) {
-			u32 gpu_speed_khz = gpu_speed_mhz * 1000;
-
-			if (gpu_speed_khz < kctx->kbdev->gpu_props.props.core_props.gpu_freq_khz_min ||
-					gpu_speed_khz > kctx->kbdev->gpu_props.props.core_props.gpu_freq_khz_max)
-				dev_warn(kctx->kbdev->dev, "GPU Speed is outside of min/max range (got %lu Khz, min %lu Khz, max %lu Khz)\n",
-						(unsigned long)gpu_speed_khz,
-						(unsigned long)kctx->kbdev->gpu_props.props.core_props.gpu_freq_khz_min,
-						(unsigned long)kctx->kbdev->gpu_props.props.core_props.gpu_freq_khz_max);
-		}
-#endif				/* CONFIG_MALI_BIFROST_DEBUG */
-	}
-	if (kctx->kbdev->clock) {
-		gpu_speed_mhz = clk_get_rate(kctx->kbdev->clock) / 1000000;
-		rc = 0;
-	}
-	if (rc != 0)
-		gpu_speed_mhz = kctx->kbdev->gpu_props.props.core_props.gpu_freq_khz_max / 1000;
-
-	kctx->kbdev->gpu_props.props.core_props.gpu_speed_mhz = gpu_speed_mhz;
-
-	memcpy(&kbase_props->props, &kctx->kbdev->gpu_props.props, sizeof(kbase_props->props));
-
-	/* Before API 8.2 they expect L3 cache info here, which was always 0 */
-	if (kctx->api_version < KBASE_API_VERSION(8, 2))
-		kbase_props->props.raw_props.suspend_size = 0;
-
-	return 0;
-}
-
-static void kbase_gpuprops_construct_coherent_groups(base_gpu_props * const props)
-{
-	struct mali_base_gpu_coherent_group *current_group;
-	u64 group_present;
-	u64 group_mask;
-	u64 first_set, first_set_prev;
-	u32 num_groups = 0;
-
-	KBASE_DEBUG_ASSERT(NULL != props);
-
-	props->coherency_info.coherency = props->raw_props.mem_features;
-	props->coherency_info.num_core_groups = hweight64(props->raw_props.l2_present);
-
-	if (props->coherency_info.coherency & GROUPS_L2_COHERENT) {
-		/* Group is l2 coherent */
-		group_present = props->raw_props.l2_present;
-	} else {
-		/* Group is l1 coherent */
-		group_present = props->raw_props.shader_present;
-	}
-
-	/*
-	 * The coherent group mask can be computed from the l2 present
-	 * register.
-	 *
-	 * For the coherent group n:
-	 * group_mask[n] = (first_set[n] - 1) & ~(first_set[n-1] - 1)
-	 * where first_set is group_present with only its nth set-bit kept
-	 * (i.e. the position from where a new group starts).
-	 *
-	 * For instance if the groups are l2 coherent and l2_present=0x0..01111:
-	 * The first mask is:
-	 * group_mask[1] = (first_set[1] - 1) & ~(first_set[0] - 1)
-	 *               = (0x0..010     - 1) & ~(0x0..01      - 1)
-	 *               =  0x0..00f
-	 * The second mask is:
-	 * group_mask[2] = (first_set[2] - 1) & ~(first_set[1] - 1)
-	 *               = (0x0..100     - 1) & ~(0x0..010     - 1)
-	 *               =  0x0..0f0
-	 * And so on until all the bits from group_present have been cleared
-	 * (i.e. there is no group left).
-	 */
-
-	current_group = props->coherency_info.group;
-	first_set = group_present & ~(group_present - 1);
-
-	while (group_present != 0 && num_groups < BASE_MAX_COHERENT_GROUPS) {
-		group_present -= first_set;	/* Clear the current group bit */
-		first_set_prev = first_set;
-
-		first_set = group_present & ~(group_present - 1);
-		group_mask = (first_set - 1) & ~(first_set_prev - 1);
-
-		/* Populate the coherent_group structure for each group */
-		current_group->core_mask = group_mask & props->raw_props.shader_present;
-		current_group->num_cores = hweight64(current_group->core_mask);
-
-		num_groups++;
-		current_group++;
-	}
-
-	if (group_present != 0)
-		pr_warn("Too many coherent groups (keeping only %d groups).\n", BASE_MAX_COHERENT_GROUPS);
-
-	props->coherency_info.num_groups = num_groups;
-}
-
-/**
- * kbase_gpuprops_get_props - Get the GPU configuration
- * @gpu_props: The &base_gpu_props structure
- * @kbdev: The &struct kbase_device structure for the device
- *
- * Fill the &base_gpu_props structure with values from the GPU configuration
- * registers. Only the raw properties are filled in this function
- */
-static void kbase_gpuprops_get_props(base_gpu_props * const gpu_props, struct kbase_device *kbdev)
-{
-	struct kbase_gpuprops_regdump regdump;
-	int i;
-
-	KBASE_DEBUG_ASSERT(NULL != kbdev);
-	KBASE_DEBUG_ASSERT(NULL != gpu_props);
-
-	/* Dump relevant registers */
-	kbase_backend_gpuprops_get(kbdev, &regdump);
-
-	gpu_props->raw_props.gpu_id = regdump.gpu_id;
-	gpu_props->raw_props.tiler_features = regdump.tiler_features;
-	gpu_props->raw_props.mem_features = regdump.mem_features;
-	gpu_props->raw_props.mmu_features = regdump.mmu_features;
-	gpu_props->raw_props.l2_features = regdump.l2_features;
-	gpu_props->raw_props.suspend_size = regdump.suspend_size;
-
-	gpu_props->raw_props.as_present = regdump.as_present;
-	gpu_props->raw_props.js_present = regdump.js_present;
-	gpu_props->raw_props.shader_present =
-		((u64) regdump.shader_present_hi << 32) +
-		regdump.shader_present_lo;
-	gpu_props->raw_props.tiler_present =
-		((u64) regdump.tiler_present_hi << 32) +
-		regdump.tiler_present_lo;
-	gpu_props->raw_props.l2_present =
-		((u64) regdump.l2_present_hi << 32) +
-		regdump.l2_present_lo;
-#ifdef CONFIG_MALI_CORESTACK
-	gpu_props->raw_props.stack_present =
-		((u64) regdump.stack_present_hi << 32) +
-		regdump.stack_present_lo;
-#else /* CONFIG_MALI_CORESTACK */
-	gpu_props->raw_props.stack_present = 0;
-#endif /* CONFIG_MALI_CORESTACK */
-
-	for (i = 0; i < GPU_MAX_JOB_SLOTS; i++)
-		gpu_props->raw_props.js_features[i] = regdump.js_features[i];
-
-	for (i = 0; i < BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS; i++)
-		gpu_props->raw_props.texture_features[i] = regdump.texture_features[i];
-
-	gpu_props->raw_props.thread_max_barrier_size = regdump.thread_max_barrier_size;
-	gpu_props->raw_props.thread_max_threads = regdump.thread_max_threads;
-	gpu_props->raw_props.thread_max_workgroup_size = regdump.thread_max_workgroup_size;
-	gpu_props->raw_props.thread_features = regdump.thread_features;
-}
-
-void kbase_gpuprops_update_core_props_gpu_id(base_gpu_props * const gpu_props)
-{
-	gpu_props->core_props.version_status =
-		KBASE_UBFX32(gpu_props->raw_props.gpu_id, 0U, 4);
-	gpu_props->core_props.minor_revision =
-		KBASE_UBFX32(gpu_props->raw_props.gpu_id, 4U, 8);
-	gpu_props->core_props.major_revision =
-		KBASE_UBFX32(gpu_props->raw_props.gpu_id, 12U, 4);
-	gpu_props->core_props.product_id =
-		KBASE_UBFX32(gpu_props->raw_props.gpu_id, 16U, 16);
-}
-
-/**
- * kbase_gpuprops_calculate_props - Calculate the derived properties
- * @gpu_props: The &base_gpu_props structure
- * @kbdev:     The &struct kbase_device structure for the device
- *
- * Fill the &base_gpu_props structure with values derived from the GPU
- * configuration registers
- */
-static void kbase_gpuprops_calculate_props(base_gpu_props * const gpu_props, struct kbase_device *kbdev)
-{
-	int i;
-
-	/* Populate the base_gpu_props structure */
-	kbase_gpuprops_update_core_props_gpu_id(gpu_props);
-	gpu_props->core_props.log2_program_counter_size = KBASE_GPU_PC_SIZE_LOG2;
-	gpu_props->core_props.gpu_available_memory_size = totalram_pages << PAGE_SHIFT;
-
-	for (i = 0; i < BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS; i++)
-		gpu_props->core_props.texture_features[i] = gpu_props->raw_props.texture_features[i];
-
-	gpu_props->l2_props.log2_line_size = KBASE_UBFX32(gpu_props->raw_props.l2_features, 0U, 8);
-	gpu_props->l2_props.log2_cache_size = KBASE_UBFX32(gpu_props->raw_props.l2_features, 16U, 8);
-
-	/* Field with number of l2 slices is added to MEM_FEATURES register
-	 * since t76x. Below code assumes that for older GPU reserved bits will
-	 * be read as zero. */
-	gpu_props->l2_props.num_l2_slices =
-		KBASE_UBFX32(gpu_props->raw_props.mem_features, 8U, 4) + 1;
-
-	gpu_props->tiler_props.bin_size_bytes = 1 << KBASE_UBFX32(gpu_props->raw_props.tiler_features, 0U, 6);
-	gpu_props->tiler_props.max_active_levels = KBASE_UBFX32(gpu_props->raw_props.tiler_features, 8U, 4);
-
-	if (gpu_props->raw_props.thread_max_threads == 0)
-		gpu_props->thread_props.max_threads = THREAD_MT_DEFAULT;
-	else
-		gpu_props->thread_props.max_threads = gpu_props->raw_props.thread_max_threads;
-
-	if (gpu_props->raw_props.thread_max_workgroup_size == 0)
-		gpu_props->thread_props.max_workgroup_size = THREAD_MWS_DEFAULT;
-	else
-		gpu_props->thread_props.max_workgroup_size = gpu_props->raw_props.thread_max_workgroup_size;
-
-	if (gpu_props->raw_props.thread_max_barrier_size == 0)
-		gpu_props->thread_props.max_barrier_size = THREAD_MBS_DEFAULT;
-	else
-		gpu_props->thread_props.max_barrier_size = gpu_props->raw_props.thread_max_barrier_size;
-
-	gpu_props->thread_props.max_registers = KBASE_UBFX32(gpu_props->raw_props.thread_features, 0U, 16);
-	gpu_props->thread_props.max_task_queue = KBASE_UBFX32(gpu_props->raw_props.thread_features, 16U, 8);
-	gpu_props->thread_props.max_thread_group_split = KBASE_UBFX32(gpu_props->raw_props.thread_features, 24U, 6);
-	gpu_props->thread_props.impl_tech = KBASE_UBFX32(gpu_props->raw_props.thread_features, 30U, 2);
-
-	/* If values are not specified, then use defaults */
-	if (gpu_props->thread_props.max_registers == 0) {
-		gpu_props->thread_props.max_registers = THREAD_MR_DEFAULT;
-		gpu_props->thread_props.max_task_queue = THREAD_MTQ_DEFAULT;
-		gpu_props->thread_props.max_thread_group_split = THREAD_MTGS_DEFAULT;
-	}
-	/* Initialize the coherent_group structure for each group */
-	kbase_gpuprops_construct_coherent_groups(gpu_props);
-}
-
-void kbase_gpuprops_set(struct kbase_device *kbdev)
-{
-	struct kbase_gpu_props *gpu_props;
-	struct gpu_raw_gpu_props *raw;
-
-	KBASE_DEBUG_ASSERT(NULL != kbdev);
-	gpu_props = &kbdev->gpu_props;
-	raw = &gpu_props->props.raw_props;
-
-	/* Initialize the base_gpu_props structure from the hardware */
-	kbase_gpuprops_get_props(&gpu_props->props, kbdev);
-
-	/* Populate the derived properties */
-	kbase_gpuprops_calculate_props(&gpu_props->props, kbdev);
-
-	/* Populate kbase-only fields */
-	gpu_props->l2_props.associativity = KBASE_UBFX32(raw->l2_features, 8U, 8);
-	gpu_props->l2_props.external_bus_width = KBASE_UBFX32(raw->l2_features, 24U, 8);
-
-	gpu_props->mem.core_group = KBASE_UBFX32(raw->mem_features, 0U, 1);
-
-	gpu_props->mmu.va_bits = KBASE_UBFX32(raw->mmu_features, 0U, 8);
-	gpu_props->mmu.pa_bits = KBASE_UBFX32(raw->mmu_features, 8U, 8);
-
-	gpu_props->num_cores = hweight64(raw->shader_present);
-	gpu_props->num_core_groups = hweight64(raw->l2_present);
-	gpu_props->num_address_spaces = hweight32(raw->as_present);
-	gpu_props->num_job_slots = hweight32(raw->js_present);
-}
-
-void kbase_gpuprops_set_features(struct kbase_device *kbdev)
-{
-	base_gpu_props *gpu_props;
-	struct kbase_gpuprops_regdump regdump;
-
-	gpu_props = &kbdev->gpu_props.props;
-
-	/* Dump relevant registers */
-	kbase_backend_gpuprops_get_features(kbdev, &regdump);
-
-	/*
-	 * Copy the raw value from the register, later this will get turned
-	 * into the selected coherency mode.
-	 * Additionally, add non-coherent mode, as this is always supported.
-	 */
-	gpu_props->raw_props.coherency_mode = regdump.coherency_features |
-		COHERENCY_FEATURE_BIT(COHERENCY_NONE);
-}
-
-static struct {
-	u32 type;
-	size_t offset;
-	int size;
-} gpu_property_mapping[] = {
-#define PROP(name, member) \
-	{KBASE_GPUPROP_ ## name, offsetof(struct mali_base_gpu_props, member), \
-		sizeof(((struct mali_base_gpu_props *)0)->member)}
-	PROP(PRODUCT_ID,                  core_props.product_id),
-	PROP(VERSION_STATUS,              core_props.version_status),
-	PROP(MINOR_REVISION,              core_props.minor_revision),
-	PROP(MAJOR_REVISION,              core_props.major_revision),
-	PROP(GPU_SPEED_MHZ,               core_props.gpu_speed_mhz),
-	PROP(GPU_FREQ_KHZ_MAX,            core_props.gpu_freq_khz_max),
-	PROP(GPU_FREQ_KHZ_MIN,            core_props.gpu_freq_khz_min),
-	PROP(LOG2_PROGRAM_COUNTER_SIZE,   core_props.log2_program_counter_size),
-	PROP(TEXTURE_FEATURES_0,          core_props.texture_features[0]),
-	PROP(TEXTURE_FEATURES_1,          core_props.texture_features[1]),
-	PROP(TEXTURE_FEATURES_2,          core_props.texture_features[2]),
-	PROP(GPU_AVAILABLE_MEMORY_SIZE,   core_props.gpu_available_memory_size),
-
-	PROP(L2_LOG2_LINE_SIZE,           l2_props.log2_line_size),
-	PROP(L2_LOG2_CACHE_SIZE,          l2_props.log2_cache_size),
-	PROP(L2_NUM_L2_SLICES,            l2_props.num_l2_slices),
-
-	PROP(TILER_BIN_SIZE_BYTES,        tiler_props.bin_size_bytes),
-	PROP(TILER_MAX_ACTIVE_LEVELS,     tiler_props.max_active_levels),
-
-	PROP(MAX_THREADS,                 thread_props.max_threads),
-	PROP(MAX_WORKGROUP_SIZE,          thread_props.max_workgroup_size),
-	PROP(MAX_BARRIER_SIZE,            thread_props.max_barrier_size),
-	PROP(MAX_REGISTERS,               thread_props.max_registers),
-	PROP(MAX_TASK_QUEUE,              thread_props.max_task_queue),
-	PROP(MAX_THREAD_GROUP_SPLIT,      thread_props.max_thread_group_split),
-	PROP(IMPL_TECH,                   thread_props.impl_tech),
-
-	PROP(RAW_SHADER_PRESENT,          raw_props.shader_present),
-	PROP(RAW_TILER_PRESENT,           raw_props.tiler_present),
-	PROP(RAW_L2_PRESENT,              raw_props.l2_present),
-	PROP(RAW_STACK_PRESENT,           raw_props.stack_present),
-	PROP(RAW_L2_FEATURES,             raw_props.l2_features),
-	PROP(RAW_SUSPEND_SIZE,            raw_props.suspend_size),
-	PROP(RAW_MEM_FEATURES,            raw_props.mem_features),
-	PROP(RAW_MMU_FEATURES,            raw_props.mmu_features),
-	PROP(RAW_AS_PRESENT,              raw_props.as_present),
-	PROP(RAW_JS_PRESENT,              raw_props.js_present),
-	PROP(RAW_JS_FEATURES_0,           raw_props.js_features[0]),
-	PROP(RAW_JS_FEATURES_1,           raw_props.js_features[1]),
-	PROP(RAW_JS_FEATURES_2,           raw_props.js_features[2]),
-	PROP(RAW_JS_FEATURES_3,           raw_props.js_features[3]),
-	PROP(RAW_JS_FEATURES_4,           raw_props.js_features[4]),
-	PROP(RAW_JS_FEATURES_5,           raw_props.js_features[5]),
-	PROP(RAW_JS_FEATURES_6,           raw_props.js_features[6]),
-	PROP(RAW_JS_FEATURES_7,           raw_props.js_features[7]),
-	PROP(RAW_JS_FEATURES_8,           raw_props.js_features[8]),
-	PROP(RAW_JS_FEATURES_9,           raw_props.js_features[9]),
-	PROP(RAW_JS_FEATURES_10,          raw_props.js_features[10]),
-	PROP(RAW_JS_FEATURES_11,          raw_props.js_features[11]),
-	PROP(RAW_JS_FEATURES_12,          raw_props.js_features[12]),
-	PROP(RAW_JS_FEATURES_13,          raw_props.js_features[13]),
-	PROP(RAW_JS_FEATURES_14,          raw_props.js_features[14]),
-	PROP(RAW_JS_FEATURES_15,          raw_props.js_features[15]),
-	PROP(RAW_TILER_FEATURES,          raw_props.tiler_features),
-	PROP(RAW_TEXTURE_FEATURES_0,      raw_props.texture_features[0]),
-	PROP(RAW_TEXTURE_FEATURES_1,      raw_props.texture_features[1]),
-	PROP(RAW_TEXTURE_FEATURES_2,      raw_props.texture_features[2]),
-	PROP(RAW_GPU_ID,                  raw_props.gpu_id),
-	PROP(RAW_THREAD_MAX_THREADS,      raw_props.thread_max_threads),
-	PROP(RAW_THREAD_MAX_WORKGROUP_SIZE,
-			raw_props.thread_max_workgroup_size),
-	PROP(RAW_THREAD_MAX_BARRIER_SIZE, raw_props.thread_max_barrier_size),
-	PROP(RAW_THREAD_FEATURES,         raw_props.thread_features),
-	PROP(RAW_COHERENCY_MODE,          raw_props.coherency_mode),
-
-	PROP(COHERENCY_NUM_GROUPS,        coherency_info.num_groups),
-	PROP(COHERENCY_NUM_CORE_GROUPS,   coherency_info.num_core_groups),
-	PROP(COHERENCY_COHERENCY,         coherency_info.coherency),
-	PROP(COHERENCY_GROUP_0,           coherency_info.group[0].core_mask),
-	PROP(COHERENCY_GROUP_1,           coherency_info.group[1].core_mask),
-	PROP(COHERENCY_GROUP_2,           coherency_info.group[2].core_mask),
-	PROP(COHERENCY_GROUP_3,           coherency_info.group[3].core_mask),
-	PROP(COHERENCY_GROUP_4,           coherency_info.group[4].core_mask),
-	PROP(COHERENCY_GROUP_5,           coherency_info.group[5].core_mask),
-	PROP(COHERENCY_GROUP_6,           coherency_info.group[6].core_mask),
-	PROP(COHERENCY_GROUP_7,           coherency_info.group[7].core_mask),
-	PROP(COHERENCY_GROUP_8,           coherency_info.group[8].core_mask),
-	PROP(COHERENCY_GROUP_9,           coherency_info.group[9].core_mask),
-	PROP(COHERENCY_GROUP_10,          coherency_info.group[10].core_mask),
-	PROP(COHERENCY_GROUP_11,          coherency_info.group[11].core_mask),
-	PROP(COHERENCY_GROUP_12,          coherency_info.group[12].core_mask),
-	PROP(COHERENCY_GROUP_13,          coherency_info.group[13].core_mask),
-	PROP(COHERENCY_GROUP_14,          coherency_info.group[14].core_mask),
-	PROP(COHERENCY_GROUP_15,          coherency_info.group[15].core_mask),
-
-#undef PROP
-};
-
-int kbase_gpuprops_populate_user_buffer(struct kbase_device *kbdev)
-{
-	struct kbase_gpu_props *kprops = &kbdev->gpu_props;
-	struct mali_base_gpu_props *props = &kprops->props;
-	u32 count = ARRAY_SIZE(gpu_property_mapping);
-	u32 i;
-	u32 size = 0;
-	u8 *p;
-
-	for (i = 0; i < count; i++) {
-		/* 4 bytes for the ID, and the size of the property */
-		size += 4 + gpu_property_mapping[i].size;
-	}
-
-	kprops->prop_buffer_size = size;
-	kprops->prop_buffer = kmalloc(size, GFP_KERNEL);
-
-	if (!kprops->prop_buffer) {
-		kprops->prop_buffer_size = 0;
-		return -ENOMEM;
-	}
-
-	p = kprops->prop_buffer;
-
-#define WRITE_U8(v) (*p++ = (v) & 0xFF)
-#define WRITE_U16(v) do { WRITE_U8(v); WRITE_U8((v) >> 8); } while (0)
-#define WRITE_U32(v) do { WRITE_U16(v); WRITE_U16((v) >> 16); } while (0)
-#define WRITE_U64(v) do { WRITE_U32(v); WRITE_U32((v) >> 32); } while (0)
-
-	for (i = 0; i < count; i++) {
-		u32 type = gpu_property_mapping[i].type;
-		u8 type_size;
-		void *field = ((u8 *)props) + gpu_property_mapping[i].offset;
-
-		switch (gpu_property_mapping[i].size) {
-		case 1:
-			type_size = KBASE_GPUPROP_VALUE_SIZE_U8;
-			break;
-		case 2:
-			type_size = KBASE_GPUPROP_VALUE_SIZE_U16;
-			break;
-		case 4:
-			type_size = KBASE_GPUPROP_VALUE_SIZE_U32;
-			break;
-		case 8:
-			type_size = KBASE_GPUPROP_VALUE_SIZE_U64;
-			break;
-		default:
-			dev_err(kbdev->dev,
-				"Invalid gpu_property_mapping type=%d size=%d",
-				type, gpu_property_mapping[i].size);
-			return -EINVAL;
-		}
-
-		WRITE_U32((type<<2) | type_size);
-
-		switch (type_size) {
-		case KBASE_GPUPROP_VALUE_SIZE_U8:
-			WRITE_U8(*((u8 *)field));
-			break;
-		case KBASE_GPUPROP_VALUE_SIZE_U16:
-			WRITE_U16(*((u16 *)field));
-			break;
-		case KBASE_GPUPROP_VALUE_SIZE_U32:
-			WRITE_U32(*((u32 *)field));
-			break;
-		case KBASE_GPUPROP_VALUE_SIZE_U64:
-			WRITE_U64(*((u64 *)field));
-			break;
-		default: /* Cannot be reached */
-			WARN_ON(1);
-			return -EINVAL;
-		}
-	}
-
-	return 0;
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpuprops.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpuprops.h
deleted file mode 100644
index 57b3eaf9cd53..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpuprops.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2015,2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/**
- * @file mali_kbase_gpuprops.h
- * Base kernel property query APIs
- */
-
-#ifndef _KBASE_GPUPROPS_H_
-#define _KBASE_GPUPROPS_H_
-
-#include "mali_kbase_gpuprops_types.h"
-
-/* Forward definition - see mali_kbase.h */
-struct kbase_device;
-
-/**
- * @brief Set up Kbase GPU properties.
- *
- * Set up Kbase GPU properties with information from the GPU registers
- *
- * @param kbdev		The struct kbase_device structure for the device
- */
-void kbase_gpuprops_set(struct kbase_device *kbdev);
-
-/**
- * kbase_gpuprops_set_features - Set up Kbase GPU properties
- * @kbdev:   Device pointer
- *
- * This function sets up GPU properties that are dependent on the hardware
- * features bitmask. This function must be preceeded by a call to
- * kbase_hw_set_features_mask().
- */
-void kbase_gpuprops_set_features(struct kbase_device *kbdev);
-
-/**
- * @brief Provide GPU properties to userside through UKU call.
- *
- * Fill the struct kbase_uk_gpuprops with values from GPU configuration registers.
- *
- * @param kctx		The struct kbase_context structure
- * @param kbase_props	A copy of the struct kbase_uk_gpuprops structure from userspace
- *
- * @return 0 on success. Any other value indicates failure.
- */
-int kbase_gpuprops_uk_get_props(struct kbase_context *kctx, struct kbase_uk_gpuprops * const kbase_props);
-
-/**
- * kbase_gpuprops_populate_user_buffer - Populate the GPU properties buffer
- * @kbdev: The kbase device
- *
- * Fills kbdev->gpu_props->prop_buffer with the GPU properties for user
- * space to read.
- */
-int kbase_gpuprops_populate_user_buffer(struct kbase_device *kbdev);
-
-/**
- * kbase_gpuprops_update_core_props_gpu_id - break down gpu id value
- * @gpu_props: the &base_gpu_props structure
- *
- * Break down gpu_id value stored in base_gpu_props::raw_props.gpu_id into
- * separate fields (version_status, minor_revision, major_revision, product_id)
- * stored in base_gpu_props::core_props.
- */
-void kbase_gpuprops_update_core_props_gpu_id(base_gpu_props * const gpu_props);
-
-
-#endif				/* _KBASE_GPUPROPS_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpuprops_types.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpuprops_types.h
deleted file mode 100644
index 10794fc27318..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_gpuprops_types.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/**
- * @file mali_kbase_gpuprops_types.h
- * Base kernel property query APIs
- */
-
-#ifndef _KBASE_GPUPROPS_TYPES_H_
-#define _KBASE_GPUPROPS_TYPES_H_
-
-#include "mali_base_kernel.h"
-
-#define KBASE_GPU_SPEED_MHZ    123
-#define KBASE_GPU_PC_SIZE_LOG2 24U
-
-struct kbase_gpuprops_regdump {
-	u32 gpu_id;
-	u32 l2_features;
-	u32 suspend_size; /* API 8.2+ */
-	u32 tiler_features;
-	u32 mem_features;
-	u32 mmu_features;
-	u32 as_present;
-	u32 js_present;
-	u32 thread_max_threads;
-	u32 thread_max_workgroup_size;
-	u32 thread_max_barrier_size;
-	u32 thread_features;
-	u32 texture_features[BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS];
-	u32 js_features[GPU_MAX_JOB_SLOTS];
-	u32 shader_present_lo;
-	u32 shader_present_hi;
-	u32 tiler_present_lo;
-	u32 tiler_present_hi;
-	u32 l2_present_lo;
-	u32 l2_present_hi;
-	u32 stack_present_lo;
-	u32 stack_present_hi;
-	u32 coherency_features;
-};
-
-struct kbase_gpu_cache_props {
-	u8 associativity;
-	u8 external_bus_width;
-};
-
-struct kbase_gpu_mem_props {
-	u8 core_group;
-};
-
-struct kbase_gpu_mmu_props {
-	u8 va_bits;
-	u8 pa_bits;
-};
-
-struct kbase_gpu_props {
-	/* kernel-only properties */
-	u8 num_cores;
-	u8 num_core_groups;
-	u8 num_address_spaces;
-	u8 num_job_slots;
-
-	struct kbase_gpu_cache_props l2_props;
-
-	struct kbase_gpu_mem_props mem;
-	struct kbase_gpu_mmu_props mmu;
-
-	/* Properties shared with userspace */
-	base_gpu_props props;
-
-	u32 prop_buffer_size;
-	void *prop_buffer;
-};
-
-#endif				/* _KBASE_GPUPROPS_TYPES_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hw.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hw.c
deleted file mode 100644
index eb8368ccee5e..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hw.c
+++ /dev/null
@@ -1,446 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * Run-time work-arounds helpers
- */
-
-#include <mali_base_hwconfig_features.h>
-#include <mali_base_hwconfig_issues.h>
-#include <mali_midg_regmap.h>
-#include "mali_kbase.h"
-#include "mali_kbase_hw.h"
-
-void kbase_hw_set_features_mask(struct kbase_device *kbdev)
-{
-	const enum base_hw_feature *features;
-	u32 gpu_id;
-	u32 product_id;
-
-	gpu_id = kbdev->gpu_props.props.raw_props.gpu_id;
-	product_id = gpu_id & GPU_ID_VERSION_PRODUCT_ID;
-	product_id >>= GPU_ID_VERSION_PRODUCT_ID_SHIFT;
-
-	if (GPU_ID_IS_NEW_FORMAT(product_id)) {
-		switch (gpu_id & GPU_ID2_PRODUCT_MODEL) {
-		case GPU_ID2_PRODUCT_TMIX:
-			features = base_hw_features_tMIx;
-			break;
-		case GPU_ID2_PRODUCT_THEX:
-			features = base_hw_features_tHEx;
-			break;
-		case GPU_ID2_PRODUCT_TSIX:
-			features = base_hw_features_tSIx;
-			break;
-		case GPU_ID2_PRODUCT_TDVX:
-			features = base_hw_features_tDVx;
-			break;
-		default:
-			features = base_hw_features_generic;
-			break;
-		}
-	} else {
-		switch (product_id) {
-		case GPU_ID_PI_TFRX:
-			/* FALLTHROUGH */
-		case GPU_ID_PI_T86X:
-			features = base_hw_features_tFxx;
-			break;
-		case GPU_ID_PI_T83X:
-			features = base_hw_features_t83x;
-			break;
-		case GPU_ID_PI_T82X:
-			features = base_hw_features_t82x;
-			break;
-		case GPU_ID_PI_T76X:
-			features = base_hw_features_t76x;
-			break;
-		case GPU_ID_PI_T72X:
-			features = base_hw_features_t72x;
-			break;
-		case GPU_ID_PI_T62X:
-			features = base_hw_features_t62x;
-			break;
-		case GPU_ID_PI_T60X:
-			features = base_hw_features_t60x;
-			break;
-		default:
-			features = base_hw_features_generic;
-			break;
-		}
-	}
-
-	for (; *features != BASE_HW_FEATURE_END; features++)
-		set_bit(*features, &kbdev->hw_features_mask[0]);
-}
-
-/**
- * kbase_hw_get_issues_for_new_id - Get the hardware issues for a new GPU ID
- * @kbdev: Device pointer
- *
- * Return: pointer to an array of hardware issues, terminated by
- * BASE_HW_ISSUE_END.
- *
- * This function can only be used on new-format GPU IDs, i.e. those for which
- * GPU_ID_IS_NEW_FORMAT evaluates as true. The GPU ID is read from the @kbdev.
- *
- * In debugging versions of the driver, unknown versions of a known GPU will
- * be treated as the most recent known version not later than the actual
- * version. In such circumstances, the GPU ID in @kbdev will also be replaced
- * with the most recent known version.
- *
- * Note: The GPU configuration must have been read by kbase_gpuprops_get_props()
- * before calling this function.
- */
-static const enum base_hw_issue *kbase_hw_get_issues_for_new_id(
-					struct kbase_device *kbdev)
-{
-	const enum base_hw_issue *issues = NULL;
-
-	struct base_hw_product {
-		u32 product_model;
-		struct {
-			u32 version;
-			const enum base_hw_issue *issues;
-		} map[7];
-	};
-
-	static const struct base_hw_product base_hw_products[] = {
-		{GPU_ID2_PRODUCT_TMIX,
-		 {{GPU_ID2_VERSION_MAKE(0, 0, 1),
-		   base_hw_issues_tMIx_r0p0_05dev0},
-		  {GPU_ID2_VERSION_MAKE(0, 0, 2), base_hw_issues_tMIx_r0p0},
-		  {GPU_ID2_VERSION_MAKE(0, 1, 0), base_hw_issues_tMIx_r0p1},
-		  {U32_MAX /* sentinel value */, NULL} } },
-
-		{GPU_ID2_PRODUCT_THEX,
-		 {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tHEx_r0p0},
-		  {GPU_ID2_VERSION_MAKE(0, 0, 1), base_hw_issues_tHEx_r0p0},
-		  {GPU_ID2_VERSION_MAKE(0, 1, 0), base_hw_issues_tHEx_r0p1},
-		  {GPU_ID2_VERSION_MAKE(0, 1, 1), base_hw_issues_tHEx_r0p1},
-		  {GPU_ID2_VERSION_MAKE(0, 2, 0), base_hw_issues_tHEx_r0p2},
-		  {GPU_ID2_VERSION_MAKE(0, 3, 0), base_hw_issues_tHEx_r0p3},
-		  {U32_MAX, NULL} } },
-
-		{GPU_ID2_PRODUCT_TSIX,
-		 {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tSIx_r0p0},
-		  {GPU_ID2_VERSION_MAKE(0, 0, 1), base_hw_issues_tSIx_r0p0},
-		  {GPU_ID2_VERSION_MAKE(0, 1, 0), base_hw_issues_tSIx_r0p1},
-		  {GPU_ID2_VERSION_MAKE(1, 0, 0), base_hw_issues_tSIx_r1p0},
-		  {GPU_ID2_VERSION_MAKE(1, 1, 0), base_hw_issues_tSIx_r1p1},
-		  {U32_MAX, NULL} } },
-
-		{GPU_ID2_PRODUCT_TDVX,
-		 {{GPU_ID2_VERSION_MAKE(0, 0, 0), base_hw_issues_tDVx_r0p0},
-		  {U32_MAX, NULL} } },
-
-
-
-
-	};
-
-	u32 gpu_id = kbdev->gpu_props.props.raw_props.gpu_id;
-	const u32 product_model = gpu_id & GPU_ID2_PRODUCT_MODEL;
-	const struct base_hw_product *product = NULL;
-	size_t p;
-
-	/* Stop when we reach the end of the products array. */
-	for (p = 0; p < ARRAY_SIZE(base_hw_products); ++p) {
-		if (product_model == base_hw_products[p].product_model) {
-			product = &base_hw_products[p];
-			break;
-		}
-	}
-
-	if (product != NULL) {
-		/* Found a matching product. */
-		const u32 version = gpu_id & GPU_ID2_VERSION;
-#if !MALI_CUSTOMER_RELEASE
-		u32 fallback_version = 0;
-		const enum base_hw_issue *fallback_issues = NULL;
-#endif
-		size_t v;
-
-		/* Stop when we reach the end of the map. */
-		for (v = 0; product->map[v].version != U32_MAX; ++v) {
-
-			if (version == product->map[v].version) {
-				/* Exact match so stop. */
-				issues = product->map[v].issues;
-				break;
-			}
-
-#if !MALI_CUSTOMER_RELEASE
-			/* Check whether this is a candidate for most recent
-				known version not later than the actual
-				version. */
-			if ((version > product->map[v].version) &&
-				(product->map[v].version >= fallback_version)) {
-				fallback_version = product->map[v].version;
-				fallback_issues = product->map[v].issues;
-			}
-#endif
-		}
-
-#if !MALI_CUSTOMER_RELEASE
-		if ((issues == NULL) && (fallback_issues != NULL)) {
-			/* Fall back to the issue set of the most recent known
-				version not later than the actual version. */
-			issues = fallback_issues;
-
-			dev_info(kbdev->dev,
-				"r%dp%d status %d is unknown; treating as r%dp%d status %d",
-				(gpu_id & GPU_ID2_VERSION_MAJOR) >>
-					GPU_ID2_VERSION_MAJOR_SHIFT,
-				(gpu_id & GPU_ID2_VERSION_MINOR) >>
-					GPU_ID2_VERSION_MINOR_SHIFT,
-				(gpu_id & GPU_ID2_VERSION_STATUS) >>
-					GPU_ID2_VERSION_STATUS_SHIFT,
-				(fallback_version & GPU_ID2_VERSION_MAJOR) >>
-					GPU_ID2_VERSION_MAJOR_SHIFT,
-				(fallback_version & GPU_ID2_VERSION_MINOR) >>
-					GPU_ID2_VERSION_MINOR_SHIFT,
-				(fallback_version & GPU_ID2_VERSION_STATUS) >>
-					GPU_ID2_VERSION_STATUS_SHIFT);
-
-			gpu_id &= ~GPU_ID2_VERSION;
-			gpu_id |= fallback_version;
-			kbdev->gpu_props.props.raw_props.gpu_id = gpu_id;
-
-			kbase_gpuprops_update_core_props_gpu_id(
-				&kbdev->gpu_props.props);
-		}
-#endif
-	}
-	return issues;
-}
-
-int kbase_hw_set_issues_mask(struct kbase_device *kbdev)
-{
-	const enum base_hw_issue *issues;
-	u32 gpu_id;
-	u32 product_id;
-	u32 impl_tech;
-
-	gpu_id = kbdev->gpu_props.props.raw_props.gpu_id;
-	product_id = gpu_id & GPU_ID_VERSION_PRODUCT_ID;
-	product_id >>= GPU_ID_VERSION_PRODUCT_ID_SHIFT;
-	impl_tech = kbdev->gpu_props.props.thread_props.impl_tech;
-
-	if (impl_tech != IMPLEMENTATION_MODEL) {
-		if (GPU_ID_IS_NEW_FORMAT(product_id)) {
-			issues = kbase_hw_get_issues_for_new_id(kbdev);
-			if (issues == NULL) {
-				dev_err(kbdev->dev,
-					"Unknown GPU ID %x", gpu_id);
-				return -EINVAL;
-			}
-
-#if !MALI_CUSTOMER_RELEASE
-			/* The GPU ID might have been replaced with the last
-			   known version of the same GPU. */
-			gpu_id = kbdev->gpu_props.props.raw_props.gpu_id;
-#endif
-
-		} else {
-			switch (gpu_id) {
-			case GPU_ID_MAKE(GPU_ID_PI_T60X, 0, 0, GPU_ID_S_15DEV0):
-				issues = base_hw_issues_t60x_r0p0_15dev0;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T60X, 0, 0, GPU_ID_S_EAC):
-				issues = base_hw_issues_t60x_r0p0_eac;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T60X, 0, 1, 0):
-				issues = base_hw_issues_t60x_r0p1;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T62X, 0, 1, 0):
-				issues = base_hw_issues_t62x_r0p1;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T62X, 1, 0, 0):
-			case GPU_ID_MAKE(GPU_ID_PI_T62X, 1, 0, 1):
-				issues = base_hw_issues_t62x_r1p0;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T62X, 1, 1, 0):
-				issues = base_hw_issues_t62x_r1p1;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T76X, 0, 0, 1):
-				issues = base_hw_issues_t76x_r0p0;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T76X, 0, 1, 1):
-				issues = base_hw_issues_t76x_r0p1;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T76X, 0, 1, 9):
-				issues = base_hw_issues_t76x_r0p1_50rel0;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T76X, 0, 2, 1):
-				issues = base_hw_issues_t76x_r0p2;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T76X, 0, 3, 1):
-				issues = base_hw_issues_t76x_r0p3;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T76X, 1, 0, 0):
-				issues = base_hw_issues_t76x_r1p0;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T72X, 0, 0, 0):
-			case GPU_ID_MAKE(GPU_ID_PI_T72X, 0, 0, 1):
-			case GPU_ID_MAKE(GPU_ID_PI_T72X, 0, 0, 2):
-				issues = base_hw_issues_t72x_r0p0;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T72X, 1, 0, 0):
-				issues = base_hw_issues_t72x_r1p0;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T72X, 1, 1, 0):
-				issues = base_hw_issues_t72x_r1p1;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_TFRX, 0, 1, 2):
-				issues = base_hw_issues_tFRx_r0p1;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_TFRX, 0, 2, 0):
-				issues = base_hw_issues_tFRx_r0p2;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_TFRX, 1, 0, 0):
-			case GPU_ID_MAKE(GPU_ID_PI_TFRX, 1, 0, 8):
-				issues = base_hw_issues_tFRx_r1p0;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_TFRX, 2, 0, 0):
-				issues = base_hw_issues_tFRx_r2p0;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T86X, 0, 2, 0):
-				issues = base_hw_issues_t86x_r0p2;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T86X, 1, 0, 0):
-			case GPU_ID_MAKE(GPU_ID_PI_T86X, 1, 0, 8):
-				issues = base_hw_issues_t86x_r1p0;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T86X, 2, 0, 0):
-				issues = base_hw_issues_t86x_r2p0;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T83X, 0, 1, 0):
-				issues = base_hw_issues_t83x_r0p1;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T83X, 1, 0, 0):
-			case GPU_ID_MAKE(GPU_ID_PI_T83X, 1, 0, 8):
-				issues = base_hw_issues_t83x_r1p0;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T82X, 0, 0, 0):
-				issues = base_hw_issues_t82x_r0p0;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T82X, 0, 1, 0):
-				issues = base_hw_issues_t82x_r0p1;
-				break;
-			case GPU_ID_MAKE(GPU_ID_PI_T82X, 1, 0, 0):
-			case GPU_ID_MAKE(GPU_ID_PI_T82X, 1, 0, 8):
-				issues = base_hw_issues_t82x_r1p0;
-				break;
-			default:
-				dev_err(kbdev->dev,
-					"Unknown GPU ID %x", gpu_id);
-				return -EINVAL;
-			}
-		}
-	} else {
-		/* Software model */
-		if (GPU_ID_IS_NEW_FORMAT(product_id)) {
-			switch (gpu_id & GPU_ID2_PRODUCT_MODEL) {
-			case GPU_ID2_PRODUCT_TMIX:
-				issues = base_hw_issues_model_tMIx;
-				break;
-			case GPU_ID2_PRODUCT_THEX:
-				issues = base_hw_issues_model_tHEx;
-				break;
-			case GPU_ID2_PRODUCT_TSIX:
-				issues = base_hw_issues_model_tSIx;
-				break;
-			case GPU_ID2_PRODUCT_TDVX:
-				issues = base_hw_issues_model_tDVx;
-				break;
-			default:
-				dev_err(kbdev->dev,
-					"Unknown GPU ID %x", gpu_id);
-				return -EINVAL;
-			}
-		} else {
-			switch (product_id) {
-			case GPU_ID_PI_T60X:
-				issues = base_hw_issues_model_t60x;
-				break;
-			case GPU_ID_PI_T62X:
-				issues = base_hw_issues_model_t62x;
-				break;
-			case GPU_ID_PI_T72X:
-				issues = base_hw_issues_model_t72x;
-				break;
-			case GPU_ID_PI_T76X:
-				issues = base_hw_issues_model_t76x;
-				break;
-			case GPU_ID_PI_TFRX:
-				issues = base_hw_issues_model_tFRx;
-				break;
-			case GPU_ID_PI_T86X:
-				issues = base_hw_issues_model_t86x;
-				break;
-			case GPU_ID_PI_T83X:
-				issues = base_hw_issues_model_t83x;
-				break;
-			case GPU_ID_PI_T82X:
-				issues = base_hw_issues_model_t82x;
-				break;
-			default:
-				dev_err(kbdev->dev, "Unknown GPU ID %x",
-					gpu_id);
-				return -EINVAL;
-			}
-		}
-	}
-
-	if (GPU_ID_IS_NEW_FORMAT(product_id)) {
-		dev_info(kbdev->dev,
-			"GPU identified as 0x%x arch %d.%d.%d r%dp%d status %d",
-			(gpu_id & GPU_ID2_PRODUCT_MAJOR) >>
-				GPU_ID2_PRODUCT_MAJOR_SHIFT,
-			(gpu_id & GPU_ID2_ARCH_MAJOR) >>
-				GPU_ID2_ARCH_MAJOR_SHIFT,
-			(gpu_id & GPU_ID2_ARCH_MINOR) >>
-				GPU_ID2_ARCH_MINOR_SHIFT,
-			(gpu_id & GPU_ID2_ARCH_REV) >>
-				GPU_ID2_ARCH_REV_SHIFT,
-			(gpu_id & GPU_ID2_VERSION_MAJOR) >>
-				GPU_ID2_VERSION_MAJOR_SHIFT,
-			(gpu_id & GPU_ID2_VERSION_MINOR) >>
-				GPU_ID2_VERSION_MINOR_SHIFT,
-			(gpu_id & GPU_ID2_VERSION_STATUS) >>
-				GPU_ID2_VERSION_STATUS_SHIFT);
-	} else {
-		dev_info(kbdev->dev,
-			"GPU identified as 0x%04x r%dp%d status %d",
-			(gpu_id & GPU_ID_VERSION_PRODUCT_ID) >>
-				GPU_ID_VERSION_PRODUCT_ID_SHIFT,
-			(gpu_id & GPU_ID_VERSION_MAJOR) >>
-				GPU_ID_VERSION_MAJOR_SHIFT,
-			(gpu_id & GPU_ID_VERSION_MINOR) >>
-				GPU_ID_VERSION_MINOR_SHIFT,
-			(gpu_id & GPU_ID_VERSION_STATUS) >>
-				GPU_ID_VERSION_STATUS_SHIFT);
-	}
-
-	for (; *issues != BASE_HW_ISSUE_END; issues++)
-		set_bit(*issues, &kbdev->hw_issues_mask[0]);
-
-	return 0;
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hw.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hw.h
deleted file mode 100644
index 754250ce968d..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hw.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/**
- * @file
- * Run-time work-arounds helpers
- */
-
-#ifndef _KBASE_HW_H_
-#define _KBASE_HW_H_
-
-#include "mali_kbase_defs.h"
-
-/**
- * @brief Tell whether a work-around should be enabled
- */
-#define kbase_hw_has_issue(kbdev, issue)\
-	test_bit(issue, &(kbdev)->hw_issues_mask[0])
-
-/**
- * @brief Tell whether a feature is supported
- */
-#define kbase_hw_has_feature(kbdev, feature)\
-	test_bit(feature, &(kbdev)->hw_features_mask[0])
-
-/**
- * kbase_hw_set_issues_mask - Set the hardware issues mask based on the GPU ID
- * @kbdev: Device pointer
- *
- * Return: 0 if the GPU ID was recognized, otherwise -EINVAL.
- *
- * The GPU ID is read from the @kbdev.
- *
- * In debugging versions of the driver, unknown versions of a known GPU with a
- * new-format ID will be treated as the most recent known version not later
- * than the actual version. In such circumstances, the GPU ID in @kbdev will
- * also be replaced with the most recent known version.
- *
- * Note: The GPU configuration must have been read by
- * kbase_gpuprops_get_props() before calling this function.
- */
-int kbase_hw_set_issues_mask(struct kbase_device *kbdev);
-
-/**
- * @brief Set the features mask depending on the GPU ID
- */
-void kbase_hw_set_features_mask(struct kbase_device *kbdev);
-
-#endif				/* _KBASE_HW_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_backend.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_backend.h
deleted file mode 100644
index b09be99e6b4e..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_backend.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-/*
- * HW access backend common APIs
- */
-
-#ifndef _KBASE_HWACCESS_BACKEND_H_
-#define _KBASE_HWACCESS_BACKEND_H_
-
-/**
- * kbase_backend_early_init - Perform any backend-specific initialization.
- * @kbdev:	Device pointer
- *
- * Return: 0 on success, or an error code on failure.
- */
-int kbase_backend_early_init(struct kbase_device *kbdev);
-
-/**
- * kbase_backend_late_init - Perform any backend-specific initialization.
- * @kbdev:	Device pointer
- *
- * Return: 0 on success, or an error code on failure.
- */
-int kbase_backend_late_init(struct kbase_device *kbdev);
-
-/**
- * kbase_backend_early_term - Perform any backend-specific termination.
- * @kbdev:	Device pointer
- */
-void kbase_backend_early_term(struct kbase_device *kbdev);
-
-/**
- * kbase_backend_late_term - Perform any backend-specific termination.
- * @kbdev:	Device pointer
- */
-void kbase_backend_late_term(struct kbase_device *kbdev);
-
-#endif /* _KBASE_HWACCESS_BACKEND_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_defs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_defs.h
deleted file mode 100644
index 0acf297192fd..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_defs.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014, 2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-/**
- * @file mali_kbase_hwaccess_gpu_defs.h
- * HW access common definitions
- */
-
-#ifndef _KBASE_HWACCESS_DEFS_H_
-#define _KBASE_HWACCESS_DEFS_H_
-
-#include <mali_kbase_jm_defs.h>
-
-/* The hwaccess_lock (a spinlock) must be held when accessing this structure */
-struct kbase_hwaccess_data {
-	struct kbase_context *active_kctx;
-
-	struct kbase_backend_data backend;
-};
-
-#endif /* _KBASE_HWACCESS_DEFS_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_gpuprops.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_gpuprops.h
deleted file mode 100644
index cf8a8131c22e..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_gpuprops.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-/**
- * Base kernel property query backend APIs
- */
-
-#ifndef _KBASE_HWACCESS_GPUPROPS_H_
-#define _KBASE_HWACCESS_GPUPROPS_H_
-
-/**
- * kbase_backend_gpuprops_get() - Fill @regdump with GPU properties read from
- *				  GPU
- * @kbdev:	Device pointer
- * @regdump:	Pointer to struct kbase_gpuprops_regdump structure
- */
-void kbase_backend_gpuprops_get(struct kbase_device *kbdev,
-					struct kbase_gpuprops_regdump *regdump);
-
-/**
- * kbase_backend_gpuprops_get - Fill @regdump with GPU properties read from GPU
- * @kbdev:   Device pointer
- * @regdump: Pointer to struct kbase_gpuprops_regdump structure
- *
- * This function reads GPU properties that are dependent on the hardware
- * features bitmask
- */
-void kbase_backend_gpuprops_get_features(struct kbase_device *kbdev,
-					struct kbase_gpuprops_regdump *regdump);
-
-
-#endif /* _KBASE_HWACCESS_GPUPROPS_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_instr.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_instr.h
deleted file mode 100644
index 5de2b7535bb4..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_instr.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * HW Access instrumentation common APIs
- */
-
-#ifndef _KBASE_HWACCESS_INSTR_H_
-#define _KBASE_HWACCESS_INSTR_H_
-
-#include <mali_kbase_instr_defs.h>
-
-/**
- * kbase_instr_hwcnt_enable_internal - Enable HW counters collection
- * @kbdev:	Kbase device
- * @kctx:	Kbase context
- * @setup:	HW counter setup parameters
- *
- * Context: might sleep, waiting for reset to complete
- *
- * Return: 0 on success
- */
-int kbase_instr_hwcnt_enable_internal(struct kbase_device *kbdev,
-					struct kbase_context *kctx,
-					struct kbase_uk_hwcnt_setup *setup);
-
-/**
- * kbase_instr_hwcnt_disable_internal - Disable HW counters collection
- * @kctx: Kbase context
- *
- * Context: might sleep, waiting for an ongoing dump to complete
- *
- * Return: 0 on success
- */
-int kbase_instr_hwcnt_disable_internal(struct kbase_context *kctx);
-
-/**
- * kbase_instr_hwcnt_request_dump() - Request HW counter dump from GPU
- * @kctx:	Kbase context
- *
- * Caller must either wait for kbase_instr_hwcnt_dump_complete() to return true,
- * of call kbase_instr_hwcnt_wait_for_dump().
- *
- * Return: 0 on success
- */
-int kbase_instr_hwcnt_request_dump(struct kbase_context *kctx);
-
-/**
- * kbase_instr_hwcnt_wait_for_dump() - Wait until pending HW counter dump has
- *				       completed.
- * @kctx:	Kbase context
- *
- * Context: will sleep, waiting for dump to complete
- *
- * Return: 0 on success
- */
-int kbase_instr_hwcnt_wait_for_dump(struct kbase_context *kctx);
-
-/**
- * kbase_instr_hwcnt_dump_complete - Tell whether the HW counters dump has
- *				     completed
- * @kctx:	Kbase context
- * @success:	Set to true if successful
- *
- * Context: does not sleep.
- *
- * Return: true if the dump is complete
- */
-bool kbase_instr_hwcnt_dump_complete(struct kbase_context *kctx,
-						bool * const success);
-
-/**
- * kbase_instr_hwcnt_clear() - Clear HW counters
- * @kctx:	Kbase context
- *
- * Context: might sleep, waiting for reset to complete
- *
- * Return: 0 on success
- */
-int kbase_instr_hwcnt_clear(struct kbase_context *kctx);
-
-/**
- * kbase_instr_backend_init() - Initialise the instrumentation backend
- * @kbdev:	Kbase device
- *
- * This function should be called during driver initialization.
- *
- * Return: 0 on success
- */
-int kbase_instr_backend_init(struct kbase_device *kbdev);
-
-/**
- * kbase_instr_backend_init() - Terminate the instrumentation backend
- * @kbdev:	Kbase device
- *
- * This function should be called during driver termination.
- */
-void kbase_instr_backend_term(struct kbase_device *kbdev);
-
-#endif /* _KBASE_HWACCESS_INSTR_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_jm.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_jm.h
deleted file mode 100644
index 750fda2cd81d..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_jm.h
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-/*
- * HW access job manager common APIs
- */
-
-#ifndef _KBASE_HWACCESS_JM_H_
-#define _KBASE_HWACCESS_JM_H_
-
-/**
- * kbase_backend_run_atom() - Run an atom on the GPU
- * @kbdev:	Device pointer
- * @atom:	Atom to run
- *
- * Caller must hold the HW access lock
- */
-void kbase_backend_run_atom(struct kbase_device *kbdev,
-				struct kbase_jd_atom *katom);
-
-/**
- * kbase_backend_slot_update - Update state based on slot ringbuffers
- *
- * @kbdev:  Device pointer
- *
- * Inspect the jobs in the slot ringbuffers and update state.
- *
- * This will cause jobs to be submitted to hardware if they are unblocked
- */
-void kbase_backend_slot_update(struct kbase_device *kbdev);
-
-/**
- * kbase_backend_find_and_release_free_address_space() - Release a free AS
- * @kbdev:	Device pointer
- * @kctx:	Context pointer
- *
- * This function can evict an idle context from the runpool, freeing up the
- * address space it was using.
- *
- * The address space is marked as in use. The caller must either assign a
- * context using kbase_gpu_use_ctx(), or release it using
- * kbase_ctx_sched_release()
- *
- * Return: Number of free address space, or KBASEP_AS_NR_INVALID if none
- *	   available
- */
-int kbase_backend_find_and_release_free_address_space(
-		struct kbase_device *kbdev, struct kbase_context *kctx);
-
-/**
- * kbase_backend_use_ctx() - Activate a currently unscheduled context, using the
- *			     provided address space.
- * @kbdev:	Device pointer
- * @kctx:	Context pointer. May be NULL
- * @as_nr:	Free address space to use
- *
- * kbase_gpu_next_job() will pull atoms from the active context.
- *
- * Return: true if successful, false if ASID not assigned.
- */
-bool kbase_backend_use_ctx(struct kbase_device *kbdev,
-				struct kbase_context *kctx,
-				int as_nr);
-
-/**
- * kbase_backend_use_ctx_sched() - Activate a context.
- * @kbdev:	Device pointer
- * @kctx:	Context pointer
- *
- * kbase_gpu_next_job() will pull atoms from the active context.
- *
- * The context must already be scheduled and assigned to an address space. If
- * the context is not scheduled, then kbase_gpu_use_ctx() should be used
- * instead.
- *
- * Caller must hold hwaccess_lock
- *
- * Return: true if context is now active, false otherwise (ie if context does
- *	   not have an address space assigned)
- */
-bool kbase_backend_use_ctx_sched(struct kbase_device *kbdev,
-					struct kbase_context *kctx);
-
-/**
- * kbase_backend_release_ctx_irq - Release a context from the GPU. This will
- *                                 de-assign the assigned address space.
- * @kbdev: Device pointer
- * @kctx:  Context pointer
- *
- * Caller must hold kbase_device->mmu_hw_mutex and hwaccess_lock
- */
-void kbase_backend_release_ctx_irq(struct kbase_device *kbdev,
-				struct kbase_context *kctx);
-
-/**
- * kbase_backend_release_ctx_noirq - Release a context from the GPU. This will
- *                                   de-assign the assigned address space.
- * @kbdev: Device pointer
- * @kctx:  Context pointer
- *
- * Caller must hold kbase_device->mmu_hw_mutex
- *
- * This function must perform any operations that could not be performed in IRQ
- * context by kbase_backend_release_ctx_irq().
- */
-void kbase_backend_release_ctx_noirq(struct kbase_device *kbdev,
-						struct kbase_context *kctx);
-
-/**
- * kbase_backend_cacheclean - Perform a cache clean if the given atom requires
- *                            one
- * @kbdev:	Device pointer
- * @katom:	Pointer to the failed atom
- *
- * On some GPUs, the GPU cache must be cleaned following a failed atom. This
- * function performs a clean if it is required by @katom.
- */
-void kbase_backend_cacheclean(struct kbase_device *kbdev,
-		struct kbase_jd_atom *katom);
-
-
-/**
- * kbase_backend_complete_wq() - Perform backend-specific actions required on
- *				 completing an atom.
- * @kbdev:	Device pointer
- * @katom:	Pointer to the atom to complete
- *
- * This function should only be called from kbase_jd_done_worker() or
- * js_return_worker().
- *
- * Return: true if atom has completed, false if atom should be re-submitted
- */
-void kbase_backend_complete_wq(struct kbase_device *kbdev,
-				struct kbase_jd_atom *katom);
-
-/**
- * kbase_backend_complete_wq_post_sched - Perform backend-specific actions
- *                                        required on completing an atom, after
- *                                        any scheduling has taken place.
- * @kbdev:         Device pointer
- * @core_req:      Core requirements of atom
- * @affinity:      Affinity of atom
- * @coreref_state: Coreref state of atom
- *
- * This function should only be called from kbase_jd_done_worker() or
- * js_return_worker().
- */
-void kbase_backend_complete_wq_post_sched(struct kbase_device *kbdev,
-		base_jd_core_req core_req, u64 affinity,
-		enum kbase_atom_coreref_state coreref_state);
-
-/**
- * kbase_backend_reset() - The GPU is being reset. Cancel all jobs on the GPU
- *			   and remove any others from the ringbuffers.
- * @kbdev:		Device pointer
- * @end_timestamp:	Timestamp of reset
- */
-void kbase_backend_reset(struct kbase_device *kbdev, ktime_t *end_timestamp);
-
-/**
- * kbase_backend_inspect_head() - Return the atom currently at the head of slot
- *				  @js
- * @kbdev:	Device pointer
- * @js:		Job slot to inspect
- *
- * Return : Atom currently at the head of slot @js, or NULL
- */
-struct kbase_jd_atom *kbase_backend_inspect_head(struct kbase_device *kbdev,
-					int js);
-
-/**
- * kbase_backend_inspect_tail - Return the atom currently at the tail of slot
- *                              @js
- * @kbdev: Device pointer
- * @js:    Job slot to inspect
- *
- * Return : Atom currently at the head of slot @js, or NULL
- */
-struct kbase_jd_atom *kbase_backend_inspect_tail(struct kbase_device *kbdev,
-					int js);
-
-/**
- * kbase_backend_nr_atoms_on_slot() - Return the number of atoms currently on a
- *				      slot.
- * @kbdev:	Device pointer
- * @js:		Job slot to inspect
- *
- * Return : Number of atoms currently on slot
- */
-int kbase_backend_nr_atoms_on_slot(struct kbase_device *kbdev, int js);
-
-/**
- * kbase_backend_nr_atoms_submitted() - Return the number of atoms on a slot
- *					that are currently on the GPU.
- * @kbdev:	Device pointer
- * @js:		Job slot to inspect
- *
- * Return : Number of atoms currently on slot @js that are currently on the GPU.
- */
-int kbase_backend_nr_atoms_submitted(struct kbase_device *kbdev, int js);
-
-/**
- * kbase_backend_ctx_count_changed() - Number of contexts ready to submit jobs
- *				       has changed.
- * @kbdev:	Device pointer
- *
- * Perform any required backend-specific actions (eg starting/stopping
- * scheduling timers).
- */
-void kbase_backend_ctx_count_changed(struct kbase_device *kbdev);
-
-/**
- * kbase_backend_timeouts_changed() - Job Scheduler timeouts have changed.
- * @kbdev:	Device pointer
- *
- * Perform any required backend-specific actions (eg updating timeouts of
- * currently running atoms).
- */
-void kbase_backend_timeouts_changed(struct kbase_device *kbdev);
-
-/**
- * kbase_backend_slot_free() - Return the number of jobs that can be currently
- *			       submitted to slot @js.
- * @kbdev:	Device pointer
- * @js:		Job slot to inspect
- *
- * Return : Number of jobs that can be submitted.
- */
-int kbase_backend_slot_free(struct kbase_device *kbdev, int js);
-
-/**
- * kbase_job_check_enter_disjoint - potentially leave disjoint state
- * @kbdev: kbase device
- * @target_katom: atom which is finishing
- *
- * Work out whether to leave disjoint state when finishing an atom that was
- * originated by kbase_job_check_enter_disjoint().
- */
-void kbase_job_check_leave_disjoint(struct kbase_device *kbdev,
-		struct kbase_jd_atom *target_katom);
-
-/**
- * kbase_backend_jm_kill_jobs_from_kctx - Kill all jobs that are currently
- *                                        running from a context
- * @kctx: Context pointer
- *
- * This is used in response to a page fault to remove all jobs from the faulting
- * context from the hardware.
- */
-void kbase_backend_jm_kill_jobs_from_kctx(struct kbase_context *kctx);
-
-/**
- * kbase_jm_wait_for_zero_jobs - Wait for context to have zero jobs running, and
- *                               to be descheduled.
- * @kctx: Context pointer
- *
- * This should be called following kbase_js_zap_context(), to ensure the context
- * can be safely destroyed.
- */
-void kbase_jm_wait_for_zero_jobs(struct kbase_context *kctx);
-
-/**
- * kbase_backend_get_current_flush_id - Return the current flush ID
- *
- * @kbdev: Device pointer
- *
- * Return: the current flush ID to be recorded for each job chain
- */
-u32 kbase_backend_get_current_flush_id(struct kbase_device *kbdev);
-
-#if KBASE_GPU_RESET_EN
-/**
- * kbase_prepare_to_reset_gpu - Prepare for resetting the GPU.
- * @kbdev: Device pointer
- *
- * This function just soft-stops all the slots to ensure that as many jobs as
- * possible are saved.
- *
- * Return: a boolean which should be interpreted as follows:
- * - true  - Prepared for reset, kbase_reset_gpu should be called.
- * - false - Another thread is performing a reset, kbase_reset_gpu should
- *                not be called.
- */
-bool kbase_prepare_to_reset_gpu(struct kbase_device *kbdev);
-
-/**
- * kbase_reset_gpu - Reset the GPU
- * @kbdev: Device pointer
- *
- * This function should be called after kbase_prepare_to_reset_gpu if it returns
- * true. It should never be called without a corresponding call to
- * kbase_prepare_to_reset_gpu.
- *
- * After this function is called (or not called if kbase_prepare_to_reset_gpu
- * returned false), the caller should wait for kbdev->reset_waitq to be
- * signalled to know when the reset has completed.
- */
-void kbase_reset_gpu(struct kbase_device *kbdev);
-
-/**
- * kbase_prepare_to_reset_gpu_locked - Prepare for resetting the GPU.
- * @kbdev: Device pointer
- *
- * This function just soft-stops all the slots to ensure that as many jobs as
- * possible are saved.
- *
- * Return: a boolean which should be interpreted as follows:
- * - true  - Prepared for reset, kbase_reset_gpu should be called.
- * - false - Another thread is performing a reset, kbase_reset_gpu should
- *                not be called.
- */
-bool kbase_prepare_to_reset_gpu_locked(struct kbase_device *kbdev);
-
-/**
- * kbase_reset_gpu_locked - Reset the GPU
- * @kbdev: Device pointer
- *
- * This function should be called after kbase_prepare_to_reset_gpu if it
- * returns true. It should never be called without a corresponding call to
- * kbase_prepare_to_reset_gpu.
- *
- * After this function is called (or not called if kbase_prepare_to_reset_gpu
- * returned false), the caller should wait for kbdev->reset_waitq to be
- * signalled to know when the reset has completed.
- */
-void kbase_reset_gpu_locked(struct kbase_device *kbdev);
-
-/**
- * kbase_reset_gpu_silent - Reset the GPU silently
- * @kbdev: Device pointer
- *
- * Reset the GPU without trying to cancel jobs and don't emit messages into
- * the kernel log while doing the reset.
- *
- * This function should be used in cases where we are doing a controlled reset
- * of the GPU as part of normal processing (e.g. exiting protected mode) where
- * the driver will have ensured the scheduler has been idled and all other
- * users of the GPU (e.g. instrumentation) have been suspended.
- */
-void kbase_reset_gpu_silent(struct kbase_device *kbdev);
-
-/**
- * kbase_reset_gpu_active - Reports if the GPU is being reset
- * @kbdev: Device pointer
- *
- * Return: True if the GPU is in the process of being reset.
- */
-bool kbase_reset_gpu_active(struct kbase_device *kbdev);
-#endif
-
-/**
- * kbase_job_slot_hardstop - Hard-stop the specified job slot
- * @kctx:         The kbase context that contains the job(s) that should
- *                be hard-stopped
- * @js:           The job slot to hard-stop
- * @target_katom: The job that should be hard-stopped (or NULL for all
- *                jobs from the context)
- * Context:
- *   The job slot lock must be held when calling this function.
- */
-void kbase_job_slot_hardstop(struct kbase_context *kctx, int js,
-				struct kbase_jd_atom *target_katom);
-
-extern struct protected_mode_ops kbase_native_protected_ops;
-
-#endif /* _KBASE_HWACCESS_JM_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_pm.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_pm.h
deleted file mode 100644
index 71c7d495c40a..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_pm.h
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-/**
- * @file mali_kbase_hwaccess_pm.h
- * HW access power manager common APIs
- */
-
-#ifndef _KBASE_HWACCESS_PM_H_
-#define _KBASE_HWACCESS_PM_H_
-
-#include <mali_midg_regmap.h>
-#include <linux/atomic.h>
-
-#include <mali_kbase_pm_defs.h>
-
-/* Forward definition - see mali_kbase.h */
-struct kbase_device;
-
-/* Functions common to all HW access backends */
-
-/**
- * Initialize the power management framework.
- *
- * Must be called before any other power management function
- *
- * @param kbdev The kbase device structure for the device (must be a valid
- *              pointer)
- *
- * @return 0 if the power management framework was successfully
- *         initialized.
- */
-int kbase_hwaccess_pm_init(struct kbase_device *kbdev);
-
-/**
- * Terminate the power management framework.
- *
- * No power management functions may be called after this (except
- * @ref kbase_pm_init)
- *
- * @param kbdev The kbase device structure for the device (must be a valid
- *              pointer)
- */
-void kbase_hwaccess_pm_term(struct kbase_device *kbdev);
-
-/**
- * kbase_hwaccess_pm_powerup - Power up the GPU.
- * @kbdev: The kbase device structure for the device (must be a valid pointer)
- * @flags: Flags to pass on to kbase_pm_init_hw
- *
- * Power up GPU after all modules have been initialized and interrupt handlers
- * installed.
- *
- * Return: 0 if powerup was successful.
- */
-int kbase_hwaccess_pm_powerup(struct kbase_device *kbdev,
-		unsigned int flags);
-
-/**
- * Halt the power management framework.
- *
- * Should ensure that no new interrupts are generated, but allow any currently
- * running interrupt handlers to complete successfully. The GPU is forced off by
- * the time this function returns, regardless of whether or not the active power
- * policy asks for the GPU to be powered off.
- *
- * @param kbdev The kbase device structure for the device (must be a valid
- *              pointer)
- */
-void kbase_hwaccess_pm_halt(struct kbase_device *kbdev);
-
-/**
- * Perform any backend-specific actions to suspend the GPU
- *
- * @param kbdev The kbase device structure for the device (must be a valid
- *              pointer)
- */
-void kbase_hwaccess_pm_suspend(struct kbase_device *kbdev);
-
-/**
- * Perform any backend-specific actions to resume the GPU from a suspend
- *
- * @param kbdev The kbase device structure for the device (must be a valid
- *              pointer)
- */
-void kbase_hwaccess_pm_resume(struct kbase_device *kbdev);
-
-/**
- * Perform any required actions for activating the GPU. Called when the first
- * context goes active.
- *
- * @param kbdev The kbase device structure for the device (must be a valid
- *              pointer)
- */
-void kbase_hwaccess_pm_gpu_active(struct kbase_device *kbdev);
-
-/**
- * Perform any required actions for idling the GPU. Called when the last
- * context goes idle.
- *
- * @param kbdev The kbase device structure for the device (must be a valid
- *              pointer)
- */
-void kbase_hwaccess_pm_gpu_idle(struct kbase_device *kbdev);
-
-
-/**
- * Set the debug core mask.
- *
- * This determines which cores the power manager is allowed to use.
- *
- * @param kbdev         The kbase device structure for the device (must be a
- *                      valid pointer)
- * @param new_core_mask_js0 The core mask to use for job slot 0
- * @param new_core_mask_js0 The core mask to use for job slot 1
- * @param new_core_mask_js0 The core mask to use for job slot 2
- */
-void kbase_pm_set_debug_core_mask(struct kbase_device *kbdev,
-		u64 new_core_mask_js0, u64 new_core_mask_js1,
-		u64 new_core_mask_js2);
-
-
-/**
- * Get the current policy.
- *
- * Returns the policy that is currently active.
- *
- * @param kbdev The kbase device structure for the device (must be a valid
- *              pointer)
- *
- * @return The current policy
- */
-const struct kbase_pm_ca_policy
-*kbase_pm_ca_get_policy(struct kbase_device *kbdev);
-
-/**
- * Change the policy to the one specified.
- *
- * @param kbdev  The kbase device structure for the device (must be a valid
- *               pointer)
- * @param policy The policy to change to (valid pointer returned from
- *               @ref kbase_pm_ca_list_policies)
- */
-void kbase_pm_ca_set_policy(struct kbase_device *kbdev,
-				const struct kbase_pm_ca_policy *policy);
-
-/**
- * Retrieve a static list of the available policies.
- *
- * @param[out] policies An array pointer to take the list of policies. This may
- *                      be NULL. The contents of this array must not be
- *                      modified.
- *
- * @return The number of policies
- */
-int
-kbase_pm_ca_list_policies(const struct kbase_pm_ca_policy * const **policies);
-
-
-/**
- * Get the current policy.
- *
- * Returns the policy that is currently active.
- *
- * @param kbdev The kbase device structure for the device (must be a valid
- *              pointer)
- *
- * @return The current policy
- */
-const struct kbase_pm_policy *kbase_pm_get_policy(struct kbase_device *kbdev);
-
-/**
- * Change the policy to the one specified.
- *
- * @param kbdev  The kbase device structure for the device (must be a valid
- *               pointer)
- * @param policy The policy to change to (valid pointer returned from
- *               @ref kbase_pm_list_policies)
- */
-void kbase_pm_set_policy(struct kbase_device *kbdev,
-					const struct kbase_pm_policy *policy);
-
-/**
- * Retrieve a static list of the available policies.
- *
- * @param[out] policies An array pointer to take the list of policies. This may
- *                      be NULL. The contents of this array must not be
- *                      modified.
- *
- * @return The number of policies
- */
-int kbase_pm_list_policies(const struct kbase_pm_policy * const **policies);
-
-#endif /* _KBASE_HWACCESS_PM_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_time.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_time.h
deleted file mode 100644
index b9fe8e669c63..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwaccess_time.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-/**
- *
- */
-
-#ifndef _KBASE_BACKEND_TIME_H_
-#define _KBASE_BACKEND_TIME_H_
-
-/**
- * kbase_backend_get_gpu_time() - Get current GPU time
- * @kbdev:		Device pointer
- * @cycle_counter:	Pointer to u64 to store cycle counter in
- * @system_time:	Pointer to u64 to store system time in
- * @ts:			Pointer to struct timespec to store current monotonic
- *			time in
- */
-void kbase_backend_get_gpu_time(struct kbase_device *kbdev, u64 *cycle_counter,
-				u64 *system_time, struct timespec *ts);
-
-/**
- * kbase_wait_write_flush() -  Wait for GPU write flush
- * @kctx:	Context pointer
- *
- * Wait 1000 GPU clock cycles. This delay is known to give the GPU time to flush
- * its write buffer.
- *
- * If GPU resets occur then the counters are reset to zero, the delay may not be
- * as expected.
- *
- * This function is only in use for BASE_HW_ISSUE_6367
- */
-#ifndef CONFIG_MALI_BIFROST_NO_MALI
-void kbase_wait_write_flush(struct kbase_context *kctx);
-#endif
-
-#endif /* _KBASE_BACKEND_TIME_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwcnt_reader.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwcnt_reader.h
deleted file mode 100644
index cf7bf1b35dc5..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_hwcnt_reader.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KBASE_HWCNT_READER_H_
-#define _KBASE_HWCNT_READER_H_
-
-/* The ids of ioctl commands. */
-#define KBASE_HWCNT_READER 0xBE
-#define KBASE_HWCNT_READER_GET_HWVER       _IOR(KBASE_HWCNT_READER, 0x00, u32)
-#define KBASE_HWCNT_READER_GET_BUFFER_SIZE _IOR(KBASE_HWCNT_READER, 0x01, u32)
-#define KBASE_HWCNT_READER_DUMP            _IOW(KBASE_HWCNT_READER, 0x10, u32)
-#define KBASE_HWCNT_READER_CLEAR           _IOW(KBASE_HWCNT_READER, 0x11, u32)
-#define KBASE_HWCNT_READER_GET_BUFFER      _IOR(KBASE_HWCNT_READER, 0x20,\
-		struct kbase_hwcnt_reader_metadata)
-#define KBASE_HWCNT_READER_PUT_BUFFER      _IOW(KBASE_HWCNT_READER, 0x21,\
-		struct kbase_hwcnt_reader_metadata)
-#define KBASE_HWCNT_READER_SET_INTERVAL    _IOW(KBASE_HWCNT_READER, 0x30, u32)
-#define KBASE_HWCNT_READER_ENABLE_EVENT    _IOW(KBASE_HWCNT_READER, 0x40, u32)
-#define KBASE_HWCNT_READER_DISABLE_EVENT   _IOW(KBASE_HWCNT_READER, 0x41, u32)
-#define KBASE_HWCNT_READER_GET_API_VERSION _IOW(KBASE_HWCNT_READER, 0xFF, u32)
-
-/**
- * struct kbase_hwcnt_reader_metadata - hwcnt reader sample buffer metadata
- * @timestamp:  time when sample was collected
- * @event_id:   id of an event that triggered sample collection
- * @buffer_idx: position in sampling area where sample buffer was stored
- */
-struct kbase_hwcnt_reader_metadata {
-	u64 timestamp;
-	u32 event_id;
-	u32 buffer_idx;
-};
-
-/**
- * enum base_hwcnt_reader_event - hwcnt dumping events
- * @BASE_HWCNT_READER_EVENT_MANUAL:   manual request for dump
- * @BASE_HWCNT_READER_EVENT_PERIODIC: periodic dump
- * @BASE_HWCNT_READER_EVENT_PREJOB:   prejob dump request
- * @BASE_HWCNT_READER_EVENT_POSTJOB:  postjob dump request
- * @BASE_HWCNT_READER_EVENT_COUNT:    number of supported events
- */
-enum base_hwcnt_reader_event {
-	BASE_HWCNT_READER_EVENT_MANUAL,
-	BASE_HWCNT_READER_EVENT_PERIODIC,
-	BASE_HWCNT_READER_EVENT_PREJOB,
-	BASE_HWCNT_READER_EVENT_POSTJOB,
-
-	BASE_HWCNT_READER_EVENT_COUNT
-};
-
-#endif /* _KBASE_HWCNT_READER_H_ */
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_ioctl.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_ioctl.h
deleted file mode 100644
index e7c1daee470b..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_ioctl.h
+++ /dev/null
@@ -1,658 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KBASE_IOCTL_H_
-#define _KBASE_IOCTL_H_
-
-#ifdef __cpluscplus
-extern "C" {
-#endif
-
-#include <linux/types.h>
-
-#define KBASE_IOCTL_TYPE 0x80
-
-#ifdef ANDROID
-/* Android's definition of ioctl is incorrect, specifying the type argument as
- * 'int'. This creates a warning when using _IOWR (as the top bit is set). Work
- * round this by redefining _IOC to include a case to 'int'.
- */
-#undef _IOC
-#define _IOC(dir, type, nr, size) \
-	((int)(((dir) << _IOC_DIRSHIFT) | ((type) << _IOC_TYPESHIFT) | \
-	((nr) << _IOC_NRSHIFT) | ((size) << _IOC_SIZESHIFT)))
-#endif
-
-/**
- * struct kbase_ioctl_version_check - Check version compatibility with kernel
- *
- * @major: Major version number
- * @minor: Minor version number
- */
-struct kbase_ioctl_version_check {
-	__u16 major;
-	__u16 minor;
-};
-
-#define KBASE_IOCTL_VERSION_CHECK \
-	_IOWR(KBASE_IOCTL_TYPE, 0, struct kbase_ioctl_version_check)
-
-/**
- * struct kbase_ioctl_set_flags - Set kernel context creation flags
- *
- * @create_flags: Flags - see base_context_create_flags
- */
-struct kbase_ioctl_set_flags {
-	__u32 create_flags;
-};
-
-#define KBASE_IOCTL_SET_FLAGS \
-	_IOW(KBASE_IOCTL_TYPE, 1, struct kbase_ioctl_set_flags)
-
-/**
- * struct kbase_ioctl_job_submit - Submit jobs/atoms to the kernel
- *
- * @addr: Memory address of an array of struct base_jd_atom_v2
- * @nr_atoms: Number of entries in the array
- * @stride: sizeof(struct base_jd_atom_v2)
- */
-struct kbase_ioctl_job_submit {
-	__u64 addr;
-	__u32 nr_atoms;
-	__u32 stride;
-};
-
-#define KBASE_IOCTL_JOB_SUBMIT \
-	_IOW(KBASE_IOCTL_TYPE, 2, struct kbase_ioctl_job_submit)
-
-/**
- * struct kbase_ioctl_get_gpuprops - Read GPU properties from the kernel
- *
- * @buffer: Pointer to the buffer to store properties into
- * @size: Size of the buffer
- * @flags: Flags - must be zero for now
- *
- * The ioctl will return the number of bytes stored into @buffer or an error
- * on failure (e.g. @size is too small). If @size is specified as 0 then no
- * data will be written but the return value will be the number of bytes needed
- * for all the properties.
- *
- * @flags may be used in the future to request a different format for the
- * buffer. With @flags == 0 the following format is used.
- *
- * The buffer will be filled with pairs of values, a u32 key identifying the
- * property followed by the value. The size of the value is identified using
- * the bottom bits of the key. The value then immediately followed the key and
- * is tightly packed (there is no padding). All keys and values are
- * little-endian.
- *
- * 00 = u8
- * 01 = u16
- * 10 = u32
- * 11 = u64
- */
-struct kbase_ioctl_get_gpuprops {
-	__u64 buffer;
-	__u32 size;
-	__u32 flags;
-};
-
-#define KBASE_IOCTL_GET_GPUPROPS \
-	_IOW(KBASE_IOCTL_TYPE, 3, struct kbase_ioctl_get_gpuprops)
-
-#define KBASE_IOCTL_POST_TERM \
-	_IO(KBASE_IOCTL_TYPE, 4)
-
-/**
- * union kbase_ioctl_mem_alloc - Allocate memory on the GPU
- *
- * @va_pages: The number of pages of virtual address space to reserve
- * @commit_pages: The number of physical pages to allocate
- * @extent: The number of extra pages to allocate on each GPU fault which grows
- *          the region
- * @flags: Flags
- * @gpu_va: The GPU virtual address which is allocated
- *
- * @in: Input parameters
- * @out: Output parameters
- */
-union kbase_ioctl_mem_alloc {
-	struct {
-		__u64 va_pages;
-		__u64 commit_pages;
-		__u64 extent;
-		__u64 flags;
-	} in;
-	struct {
-		__u64 flags;
-		__u64 gpu_va;
-	} out;
-};
-
-#define KBASE_IOCTL_MEM_ALLOC \
-	_IOWR(KBASE_IOCTL_TYPE, 5, union kbase_ioctl_mem_alloc)
-
-/**
- * struct kbase_ioctl_mem_query - Query properties of a GPU memory region
- * @gpu_addr: A GPU address contained within the region
- * @query: The type of query
- * @value: The result of the query
- *
- * Use a %KBASE_MEM_QUERY_xxx flag as input for @query.
- *
- * @in: Input parameters
- * @out: Output parameters
- */
-union kbase_ioctl_mem_query {
-	struct {
-		__u64 gpu_addr;
-		__u64 query;
-	} in;
-	struct {
-		__u64 value;
-	} out;
-};
-
-#define KBASE_IOCTL_MEM_QUERY \
-	_IOWR(KBASE_IOCTL_TYPE, 6, union kbase_ioctl_mem_query)
-
-#define KBASE_MEM_QUERY_COMMIT_SIZE	1
-#define KBASE_MEM_QUERY_VA_SIZE		2
-#define KBASE_MEM_QUERY_FLAGS		3
-
-/**
- * struct kbase_ioctl_mem_free - Free a memory region
- * @gpu_addr: Handle to the region to free
- */
-struct kbase_ioctl_mem_free {
-	__u64 gpu_addr;
-};
-
-#define KBASE_IOCTL_MEM_FREE \
-	_IOW(KBASE_IOCTL_TYPE, 7, struct kbase_ioctl_mem_free)
-
-/**
- * struct kbase_ioctl_hwcnt_reader_setup - Setup HWC dumper/reader
- * @buffer_count: requested number of dumping buffers
- * @jm_bm:        counters selection bitmask (JM)
- * @shader_bm:    counters selection bitmask (Shader)
- * @tiler_bm:     counters selection bitmask (Tiler)
- * @mmu_l2_bm:    counters selection bitmask (MMU_L2)
- *
- * A fd is returned from the ioctl if successful, or a negative value on error
- */
-struct kbase_ioctl_hwcnt_reader_setup {
-	__u32 buffer_count;
-	__u32 jm_bm;
-	__u32 shader_bm;
-	__u32 tiler_bm;
-	__u32 mmu_l2_bm;
-};
-
-#define KBASE_IOCTL_HWCNT_READER_SETUP \
-	_IOW(KBASE_IOCTL_TYPE, 8, struct kbase_ioctl_hwcnt_reader_setup)
-
-/**
- * struct kbase_ioctl_hwcnt_enable - Enable hardware counter collection
- * @dump_buffer:  GPU address to write counters to
- * @jm_bm:        counters selection bitmask (JM)
- * @shader_bm:    counters selection bitmask (Shader)
- * @tiler_bm:     counters selection bitmask (Tiler)
- * @mmu_l2_bm:    counters selection bitmask (MMU_L2)
- */
-struct kbase_ioctl_hwcnt_enable {
-	__u64 dump_buffer;
-	__u32 jm_bm;
-	__u32 shader_bm;
-	__u32 tiler_bm;
-	__u32 mmu_l2_bm;
-};
-
-#define KBASE_IOCTL_HWCNT_ENABLE \
-	_IOW(KBASE_IOCTL_TYPE, 9, struct kbase_ioctl_hwcnt_enable)
-
-#define KBASE_IOCTL_HWCNT_DUMP \
-	_IO(KBASE_IOCTL_TYPE, 10)
-
-#define KBASE_IOCTL_HWCNT_CLEAR \
-	_IO(KBASE_IOCTL_TYPE, 11)
-
-/**
- * struct kbase_ioctl_disjoint_query - Query the disjoint counter
- * @counter:   A counter of disjoint events in the kernel
- */
-struct kbase_ioctl_disjoint_query {
-	__u32 counter;
-};
-
-#define KBASE_IOCTL_DISJOINT_QUERY \
-	_IOR(KBASE_IOCTL_TYPE, 12, struct kbase_ioctl_disjoint_query)
-
-/**
- * struct kbase_ioctl_get_ddk_version - Query the kernel version
- * @version_buffer: Buffer to receive the kernel version string
- * @size: Size of the buffer
- *
- * The ioctl will return the number of bytes written into version_buffer
- * (which includes a NULL byte) or a negative error code
- */
-struct kbase_ioctl_get_ddk_version {
-	__u64 version_buffer;
-	__u32 size;
-};
-
-#define KBASE_IOCTL_GET_DDK_VERSION \
-	_IOW(KBASE_IOCTL_TYPE, 13, struct kbase_ioctl_get_ddk_version)
-
-/**
- * struct kbase_ioctl_mem_jit_init - Initialise the JIT memory allocator
- *
- * @va_pages: Number of VA pages to reserve for JIT
- *
- * Note that depending on the VA size of the application and GPU, the value
- * specified in @va_pages may be ignored.
- */
-struct kbase_ioctl_mem_jit_init {
-	__u64 va_pages;
-};
-
-#define KBASE_IOCTL_MEM_JIT_INIT \
-	_IOW(KBASE_IOCTL_TYPE, 14, struct kbase_ioctl_mem_jit_init)
-
-/**
- * struct kbase_ioctl_mem_sync - Perform cache maintenance on memory
- *
- * @handle: GPU memory handle (GPU VA)
- * @user_addr: The address where it is mapped in user space
- * @size: The number of bytes to synchronise
- * @type: The direction to synchronise: 0 is sync to memory (clean),
- * 1 is sync from memory (invalidate). Use the BASE_SYNCSET_OP_xxx constants.
- * @padding: Padding to round up to a multiple of 8 bytes, must be zero
- */
-struct kbase_ioctl_mem_sync {
-	__u64 handle;
-	__u64 user_addr;
-	__u64 size;
-	__u8 type;
-	__u8 padding[7];
-};
-
-#define KBASE_IOCTL_MEM_SYNC \
-	_IOW(KBASE_IOCTL_TYPE, 15, struct kbase_ioctl_mem_sync)
-
-/**
- * union kbase_ioctl_mem_find_cpu_offset - Find the offset of a CPU pointer
- *
- * @gpu_addr: The GPU address of the memory region
- * @cpu_addr: The CPU address to locate
- * @size: A size in bytes to validate is contained within the region
- * @offset: The offset from the start of the memory region to @cpu_addr
- *
- * @in: Input parameters
- * @out: Output parameters
- */
-union kbase_ioctl_mem_find_cpu_offset {
-	struct {
-		__u64 gpu_addr;
-		__u64 cpu_addr;
-		__u64 size;
-	} in;
-	struct {
-		__u64 offset;
-	} out;
-};
-
-#define KBASE_IOCTL_MEM_FIND_CPU_OFFSET \
-	_IOWR(KBASE_IOCTL_TYPE, 16, union kbase_ioctl_mem_find_cpu_offset)
-
-/**
- * struct kbase_ioctl_get_context_id - Get the kernel context ID
- *
- * @id: The kernel context ID
- */
-struct kbase_ioctl_get_context_id {
-	__u32 id;
-};
-
-#define KBASE_IOCTL_GET_CONTEXT_ID \
-	_IOR(KBASE_IOCTL_TYPE, 17, struct kbase_ioctl_get_context_id)
-
-/**
- * struct kbase_ioctl_tlstream_acquire - Acquire a tlstream fd
- *
- * @flags: Flags
- *
- * The ioctl returns a file descriptor when successful
- */
-struct kbase_ioctl_tlstream_acquire {
-	__u32 flags;
-};
-
-#define KBASE_IOCTL_TLSTREAM_ACQUIRE \
-	_IOW(KBASE_IOCTL_TYPE, 18, struct kbase_ioctl_tlstream_acquire)
-
-#define KBASE_IOCTL_TLSTREAM_FLUSH \
-	_IO(KBASE_IOCTL_TYPE, 19)
-
-/**
- * struct kbase_ioctl_mem_commit - Change the amount of memory backing a region
- *
- * @gpu_addr: The memory region to modify
- * @pages:    The number of physical pages that should be present
- *
- * The ioctl may return on the following error codes or 0 for success:
- *   -ENOMEM: Out of memory
- *   -EINVAL: Invalid arguments
- */
-struct kbase_ioctl_mem_commit {
-	__u64 gpu_addr;
-	__u64 pages;
-};
-
-#define KBASE_IOCTL_MEM_COMMIT \
-	_IOW(KBASE_IOCTL_TYPE, 20, struct kbase_ioctl_mem_commit)
-
-/**
- * union kbase_ioctl_mem_alias - Create an alias of memory regions
- * @flags: Flags, see BASE_MEM_xxx
- * @stride: Bytes between start of each memory region
- * @nents: The number of regions to pack together into the alias
- * @aliasing_info: Pointer to an array of struct base_mem_aliasing_info
- * @gpu_va: Address of the new alias
- * @va_pages: Size of the new alias
- *
- * @in: Input parameters
- * @out: Output parameters
- */
-union kbase_ioctl_mem_alias {
-	struct {
-		__u64 flags;
-		__u64 stride;
-		__u64 nents;
-		__u64 aliasing_info;
-	} in;
-	struct {
-		__u64 flags;
-		__u64 gpu_va;
-		__u64 va_pages;
-	} out;
-};
-
-#define KBASE_IOCTL_MEM_ALIAS \
-	_IOWR(KBASE_IOCTL_TYPE, 21, union kbase_ioctl_mem_alias)
-
-/**
- * union kbase_ioctl_mem_import - Import memory for use by the GPU
- * @flags: Flags, see BASE_MEM_xxx
- * @phandle: Handle to the external memory
- * @type: Type of external memory, see base_mem_import_type
- * @padding: Amount of extra VA pages to append to the imported buffer
- * @gpu_va: Address of the new alias
- * @va_pages: Size of the new alias
- *
- * @in: Input parameters
- * @out: Output parameters
- */
-union kbase_ioctl_mem_import {
-	struct {
-		__u64 flags;
-		__u64 phandle;
-		__u32 type;
-		__u32 padding;
-	} in;
-	struct {
-		__u64 flags;
-		__u64 gpu_va;
-		__u64 va_pages;
-	} out;
-};
-
-#define KBASE_IOCTL_MEM_IMPORT \
-	_IOWR(KBASE_IOCTL_TYPE, 22, union kbase_ioctl_mem_import)
-
-/**
- * struct kbase_ioctl_mem_flags_change - Change the flags for a memory region
- * @gpu_va: The GPU region to modify
- * @flags: The new flags to set
- * @mask: Mask of the flags to modify
- */
-struct kbase_ioctl_mem_flags_change {
-	__u64 gpu_va;
-	__u64 flags;
-	__u64 mask;
-};
-
-#define KBASE_IOCTL_MEM_FLAGS_CHANGE \
-	_IOW(KBASE_IOCTL_TYPE, 23, struct kbase_ioctl_mem_flags_change)
-
-/**
- * struct kbase_ioctl_stream_create - Create a synchronisation stream
- * @name: A name to identify this stream. Must be NULL-terminated.
- *
- * Note that this is also called a "timeline", but is named stream to avoid
- * confusion with other uses of the word.
- *
- * Unused bytes in @name (after the first NULL byte) must be also be NULL bytes.
- *
- * The ioctl returns a file descriptor.
- */
-struct kbase_ioctl_stream_create {
-	char name[32];
-};
-
-#define KBASE_IOCTL_STREAM_CREATE \
-	_IOW(KBASE_IOCTL_TYPE, 24, struct kbase_ioctl_stream_create)
-
-/**
- * struct kbase_ioctl_fence_validate - Validate a fd refers to a fence
- * @fd: The file descriptor to validate
- */
-struct kbase_ioctl_fence_validate {
-	int fd;
-};
-
-#define KBASE_IOCTL_FENCE_VALIDATE \
-	_IOW(KBASE_IOCTL_TYPE, 25, struct kbase_ioctl_fence_validate)
-
-/**
- * struct kbase_ioctl_get_profiling_controls - Get the profiling controls
- * @count: The size of @buffer in u32 words
- * @buffer: The buffer to receive the profiling controls
- */
-struct kbase_ioctl_get_profiling_controls {
-	__u64 buffer;
-	__u32 count;
-};
-
-#define KBASE_IOCTL_GET_PROFILING_CONTROLS \
-	_IOW(KBASE_IOCTL_TYPE, 26, struct kbase_ioctl_get_profiling_controls)
-
-/**
- * struct kbase_ioctl_mem_profile_add - Provide profiling information to kernel
- * @buffer: Pointer to the information
- * @len: Length
- * @padding: Padding
- *
- * The data provided is accessible through a debugfs file
- */
-struct kbase_ioctl_mem_profile_add {
-	__u64 buffer;
-	__u32 len;
-	__u32 padding;
-};
-
-#define KBASE_IOCTL_MEM_PROFILE_ADD \
-	_IOW(KBASE_IOCTL_TYPE, 27, struct kbase_ioctl_mem_profile_add)
-
-/**
- * struct kbase_ioctl_soft_event_update - Update the status of a soft-event
- * @event: GPU address of the event which has been updated
- * @new_status: The new status to set
- * @flags: Flags for future expansion
- */
-struct kbase_ioctl_soft_event_update {
-	__u64 event;
-	__u32 new_status;
-	__u32 flags;
-};
-
-#define KBASE_IOCTL_SOFT_EVENT_UPDATE \
-	_IOW(KBASE_IOCTL_TYPE, 28, struct kbase_ioctl_soft_event_update)
-
-/* IOCTLs 29-32 are reserved */
-
-/***************
- * test ioctls *
- ***************/
-#if MALI_UNIT_TEST
-/* These ioctls are purely for test purposes and are not used in the production
- * driver, they therefore may change without notice
- */
-
-#define KBASE_IOCTL_TEST_TYPE (KBASE_IOCTL_TYPE + 1)
-
-/**
- * struct kbase_ioctl_tlstream_test - Start a timeline stream test
- *
- * @tpw_count: number of trace point writers in each context
- * @msg_delay: time delay between tracepoints from one writer in milliseconds
- * @msg_count: number of trace points written by one writer
- * @aux_msg:   if non-zero aux messages will be included
- */
-struct kbase_ioctl_tlstream_test {
-	__u32 tpw_count;
-	__u32 msg_delay;
-	__u32 msg_count;
-	__u32 aux_msg;
-};
-
-#define KBASE_IOCTL_TLSTREAM_TEST \
-	_IOW(KBASE_IOCTL_TEST_TYPE, 1, struct kbase_ioctl_tlstream_test)
-
-/**
- * struct kbase_ioctl_tlstream_stats - Read tlstream stats for test purposes
- * @bytes_collected: number of bytes read by user
- * @bytes_generated: number of bytes generated by tracepoints
- */
-struct kbase_ioctl_tlstream_stats {
-	__u32 bytes_collected;
-	__u32 bytes_generated;
-};
-
-#define KBASE_IOCTL_TLSTREAM_STATS \
-	_IOR(KBASE_IOCTL_TEST_TYPE, 2, struct kbase_ioctl_tlstream_stats)
-
-#endif
-
-/**********************************
- * Definitions for GPU properties *
- **********************************/
-#define KBASE_GPUPROP_VALUE_SIZE_U8	(0x0)
-#define KBASE_GPUPROP_VALUE_SIZE_U16	(0x1)
-#define KBASE_GPUPROP_VALUE_SIZE_U32	(0x2)
-#define KBASE_GPUPROP_VALUE_SIZE_U64	(0x3)
-
-#define KBASE_GPUPROP_PRODUCT_ID			1
-#define KBASE_GPUPROP_VERSION_STATUS			2
-#define KBASE_GPUPROP_MINOR_REVISION			3
-#define KBASE_GPUPROP_MAJOR_REVISION			4
-#define KBASE_GPUPROP_GPU_SPEED_MHZ			5
-#define KBASE_GPUPROP_GPU_FREQ_KHZ_MAX			6
-#define KBASE_GPUPROP_GPU_FREQ_KHZ_MIN			7
-#define KBASE_GPUPROP_LOG2_PROGRAM_COUNTER_SIZE		8
-#define KBASE_GPUPROP_TEXTURE_FEATURES_0		9
-#define KBASE_GPUPROP_TEXTURE_FEATURES_1		10
-#define KBASE_GPUPROP_TEXTURE_FEATURES_2		11
-#define KBASE_GPUPROP_GPU_AVAILABLE_MEMORY_SIZE		12
-
-#define KBASE_GPUPROP_L2_LOG2_LINE_SIZE			13
-#define KBASE_GPUPROP_L2_LOG2_CACHE_SIZE		14
-#define KBASE_GPUPROP_L2_NUM_L2_SLICES			15
-
-#define KBASE_GPUPROP_TILER_BIN_SIZE_BYTES		16
-#define KBASE_GPUPROP_TILER_MAX_ACTIVE_LEVELS		17
-
-#define KBASE_GPUPROP_MAX_THREADS			18
-#define KBASE_GPUPROP_MAX_WORKGROUP_SIZE		19
-#define KBASE_GPUPROP_MAX_BARRIER_SIZE			20
-#define KBASE_GPUPROP_MAX_REGISTERS			21
-#define KBASE_GPUPROP_MAX_TASK_QUEUE			22
-#define KBASE_GPUPROP_MAX_THREAD_GROUP_SPLIT		23
-#define KBASE_GPUPROP_IMPL_TECH				24
-
-#define KBASE_GPUPROP_RAW_SHADER_PRESENT		25
-#define KBASE_GPUPROP_RAW_TILER_PRESENT			26
-#define KBASE_GPUPROP_RAW_L2_PRESENT			27
-#define KBASE_GPUPROP_RAW_STACK_PRESENT			28
-#define KBASE_GPUPROP_RAW_L2_FEATURES			29
-#define KBASE_GPUPROP_RAW_SUSPEND_SIZE			30
-#define KBASE_GPUPROP_RAW_MEM_FEATURES			31
-#define KBASE_GPUPROP_RAW_MMU_FEATURES			32
-#define KBASE_GPUPROP_RAW_AS_PRESENT			33
-#define KBASE_GPUPROP_RAW_JS_PRESENT			34
-#define KBASE_GPUPROP_RAW_JS_FEATURES_0			35
-#define KBASE_GPUPROP_RAW_JS_FEATURES_1			36
-#define KBASE_GPUPROP_RAW_JS_FEATURES_2			37
-#define KBASE_GPUPROP_RAW_JS_FEATURES_3			38
-#define KBASE_GPUPROP_RAW_JS_FEATURES_4			39
-#define KBASE_GPUPROP_RAW_JS_FEATURES_5			40
-#define KBASE_GPUPROP_RAW_JS_FEATURES_6			41
-#define KBASE_GPUPROP_RAW_JS_FEATURES_7			42
-#define KBASE_GPUPROP_RAW_JS_FEATURES_8			43
-#define KBASE_GPUPROP_RAW_JS_FEATURES_9			44
-#define KBASE_GPUPROP_RAW_JS_FEATURES_10		45
-#define KBASE_GPUPROP_RAW_JS_FEATURES_11		46
-#define KBASE_GPUPROP_RAW_JS_FEATURES_12		47
-#define KBASE_GPUPROP_RAW_JS_FEATURES_13		48
-#define KBASE_GPUPROP_RAW_JS_FEATURES_14		49
-#define KBASE_GPUPROP_RAW_JS_FEATURES_15		50
-#define KBASE_GPUPROP_RAW_TILER_FEATURES		51
-#define KBASE_GPUPROP_RAW_TEXTURE_FEATURES_0		52
-#define KBASE_GPUPROP_RAW_TEXTURE_FEATURES_1		53
-#define KBASE_GPUPROP_RAW_TEXTURE_FEATURES_2		54
-#define KBASE_GPUPROP_RAW_GPU_ID			55
-#define KBASE_GPUPROP_RAW_THREAD_MAX_THREADS		56
-#define KBASE_GPUPROP_RAW_THREAD_MAX_WORKGROUP_SIZE	57
-#define KBASE_GPUPROP_RAW_THREAD_MAX_BARRIER_SIZE	58
-#define KBASE_GPUPROP_RAW_THREAD_FEATURES		59
-#define KBASE_GPUPROP_RAW_COHERENCY_MODE		60
-
-#define KBASE_GPUPROP_COHERENCY_NUM_GROUPS		61
-#define KBASE_GPUPROP_COHERENCY_NUM_CORE_GROUPS		62
-#define KBASE_GPUPROP_COHERENCY_COHERENCY		63
-#define KBASE_GPUPROP_COHERENCY_GROUP_0			64
-#define KBASE_GPUPROP_COHERENCY_GROUP_1			65
-#define KBASE_GPUPROP_COHERENCY_GROUP_2			66
-#define KBASE_GPUPROP_COHERENCY_GROUP_3			67
-#define KBASE_GPUPROP_COHERENCY_GROUP_4			68
-#define KBASE_GPUPROP_COHERENCY_GROUP_5			69
-#define KBASE_GPUPROP_COHERENCY_GROUP_6			70
-#define KBASE_GPUPROP_COHERENCY_GROUP_7			71
-#define KBASE_GPUPROP_COHERENCY_GROUP_8			72
-#define KBASE_GPUPROP_COHERENCY_GROUP_9			73
-#define KBASE_GPUPROP_COHERENCY_GROUP_10		74
-#define KBASE_GPUPROP_COHERENCY_GROUP_11		75
-#define KBASE_GPUPROP_COHERENCY_GROUP_12		76
-#define KBASE_GPUPROP_COHERENCY_GROUP_13		77
-#define KBASE_GPUPROP_COHERENCY_GROUP_14		78
-#define KBASE_GPUPROP_COHERENCY_GROUP_15		79
-
-#ifdef __cpluscplus
-}
-#endif
-
-#endif
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jd.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jd.c
deleted file mode 100644
index 144ebfcdfc59..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jd.c
+++ /dev/null
@@ -1,1847 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#if defined(CONFIG_DMA_SHARED_BUFFER)
-#include <linux/dma-buf.h>
-#endif				/* defined(CONFIG_DMA_SHARED_BUFFER) */
-#ifdef CONFIG_COMPAT
-#include <linux/compat.h>
-#endif
-#include <mali_kbase.h>
-#include <mali_kbase_uku.h>
-#include <linux/random.h>
-#include <linux/version.h>
-#include <linux/ratelimit.h>
-
-#include <mali_kbase_jm.h>
-#include <mali_kbase_hwaccess_jm.h>
-#include <mali_kbase_tlstream.h>
-
-#include "mali_kbase_dma_fence.h"
-
-#define beenthere(kctx, f, a...)  dev_dbg(kctx->kbdev->dev, "%s:" f, __func__, ##a)
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)
-/* random32 was renamed to prandom_u32 in 3.8 */
-#define prandom_u32 random32
-#endif
-
-/* Return whether katom will run on the GPU or not. Currently only soft jobs and
- * dependency-only atoms do not run on the GPU */
-#define IS_GPU_ATOM(katom) (!((katom->core_req & BASE_JD_REQ_SOFT_JOB) ||  \
-			((katom->core_req & BASE_JD_REQ_ATOM_TYPE) ==    \
-							BASE_JD_REQ_DEP)))
-/*
- * This is the kernel side of the API. Only entry points are:
- * - kbase_jd_submit(): Called from userspace to submit a single bag
- * - kbase_jd_done(): Called from interrupt context to track the
- *   completion of a job.
- * Callouts:
- * - to the job manager (enqueue a job)
- * - to the event subsystem (signals the completion/failure of bag/job-chains).
- */
-
-static void __user *
-get_compat_pointer(struct kbase_context *kctx, const u64 p)
-{
-#ifdef CONFIG_COMPAT
-	if (kbase_ctx_flag(kctx, KCTX_COMPAT))
-		return compat_ptr(p);
-#endif
-	return u64_to_user_ptr(p);
-}
-
-/* Runs an atom, either by handing to the JS or by immediately running it in the case of soft-jobs
- *
- * Returns whether the JS needs a reschedule.
- *
- * Note that the caller must also check the atom status and
- * if it is KBASE_JD_ATOM_STATE_COMPLETED must call jd_done_nolock
- */
-static int jd_run_atom(struct kbase_jd_atom *katom)
-{
-	struct kbase_context *kctx = katom->kctx;
-
-	KBASE_DEBUG_ASSERT(katom->status != KBASE_JD_ATOM_STATE_UNUSED);
-
-	if ((katom->core_req & BASE_JD_REQ_ATOM_TYPE) == BASE_JD_REQ_DEP) {
-		/* Dependency only atom */
-		katom->status = KBASE_JD_ATOM_STATE_COMPLETED;
-		return 0;
-	} else if (katom->core_req & BASE_JD_REQ_SOFT_JOB) {
-		/* Soft-job */
-		if (katom->will_fail_event_code) {
-			katom->status = KBASE_JD_ATOM_STATE_COMPLETED;
-			return 0;
-		}
-		if ((katom->core_req & BASE_JD_REQ_SOFT_JOB_TYPE)
-						  == BASE_JD_REQ_SOFT_REPLAY) {
-			if (!kbase_replay_process(katom))
-				katom->status = KBASE_JD_ATOM_STATE_COMPLETED;
-		} else if (kbase_process_soft_job(katom) == 0) {
-			kbase_finish_soft_job(katom);
-			katom->status = KBASE_JD_ATOM_STATE_COMPLETED;
-		}
-		return 0;
-	}
-
-	katom->status = KBASE_JD_ATOM_STATE_IN_JS;
-	/* Queue an action about whether we should try scheduling a context */
-	return kbasep_js_add_job(kctx, katom);
-}
-
-#if defined(CONFIG_KDS) || defined(CONFIG_MALI_BIFROST_DMA_FENCE)
-void kbase_jd_dep_clear_locked(struct kbase_jd_atom *katom)
-{
-	struct kbase_device *kbdev;
-
-	KBASE_DEBUG_ASSERT(katom);
-	kbdev = katom->kctx->kbdev;
-	KBASE_DEBUG_ASSERT(kbdev);
-
-	/* Check whether the atom's other dependencies were already met. If
-	 * katom is a GPU atom then the job scheduler may be able to represent
-	 * the dependencies, hence we may attempt to submit it before they are
-	 * met. Other atoms must have had both dependencies resolved.
-	 */
-	if (IS_GPU_ATOM(katom) ||
-			(!kbase_jd_katom_dep_atom(&katom->dep[0]) &&
-			!kbase_jd_katom_dep_atom(&katom->dep[1]))) {
-		/* katom dep complete, attempt to run it */
-		bool resched = false;
-
-		resched = jd_run_atom(katom);
-
-		if (katom->status == KBASE_JD_ATOM_STATE_COMPLETED) {
-			/* The atom has already finished */
-			resched |= jd_done_nolock(katom, NULL);
-		}
-
-		if (resched)
-			kbase_js_sched_all(kbdev);
-	}
-}
-#endif
-
-#ifdef CONFIG_KDS
-
-/* Add the katom to the kds waiting list.
- * Atoms must be added to the waiting list after a successful call to kds_async_waitall.
- * The caller must hold the kbase_jd_context.lock */
-
-static void kbase_jd_kds_waiters_add(struct kbase_jd_atom *katom)
-{
-	struct kbase_context *kctx;
-
-	KBASE_DEBUG_ASSERT(katom);
-
-	kctx = katom->kctx;
-
-	list_add_tail(&katom->node, &kctx->waiting_kds_resource);
-}
-
-/* Remove the katom from the kds waiting list.
- * Atoms must be removed from the waiting list before a call to kds_resource_set_release_sync.
- * The supplied katom must first have been added to the list with a call to kbase_jd_kds_waiters_add.
- * The caller must hold the kbase_jd_context.lock */
-
-static void kbase_jd_kds_waiters_remove(struct kbase_jd_atom *katom)
-{
-	KBASE_DEBUG_ASSERT(katom);
-	list_del(&katom->node);
-}
-
-static void kds_dep_clear(void *callback_parameter, void *callback_extra_parameter)
-{
-	struct kbase_jd_atom *katom;
-	struct kbase_jd_context *ctx;
-
-	katom = (struct kbase_jd_atom *)callback_parameter;
-	KBASE_DEBUG_ASSERT(katom);
-
-	ctx = &katom->kctx->jctx;
-
-	/* If KDS resource has already been satisfied (e.g. due to zapping)
-	 * do nothing.
-	 */
-	mutex_lock(&ctx->lock);
-	if (!katom->kds_dep_satisfied) {
-		katom->kds_dep_satisfied = true;
-		kbase_jd_dep_clear_locked(katom);
-	}
-	mutex_unlock(&ctx->lock);
-}
-
-static void kbase_cancel_kds_wait_job(struct kbase_jd_atom *katom)
-{
-	KBASE_DEBUG_ASSERT(katom);
-
-	/* Prevent job_done_nolock from being called twice on an atom when
-	 *  there is a race between job completion and cancellation */
-
-	if (katom->status == KBASE_JD_ATOM_STATE_QUEUED) {
-		/* Wait was cancelled - zap the atom */
-		katom->event_code = BASE_JD_EVENT_JOB_CANCELLED;
-		if (jd_done_nolock(katom, NULL))
-			kbase_js_sched_all(katom->kctx->kbdev);
-	}
-}
-#endif				/* CONFIG_KDS */
-
-void kbase_jd_free_external_resources(struct kbase_jd_atom *katom)
-{
-#ifdef CONFIG_KDS
-	if (katom->kds_rset) {
-		struct kbase_jd_context *jctx = &katom->kctx->jctx;
-
-		/*
-		 * As the atom is no longer waiting, remove it from
-		 * the waiting list.
-		 */
-
-		mutex_lock(&jctx->lock);
-		kbase_jd_kds_waiters_remove(katom);
-		mutex_unlock(&jctx->lock);
-
-		/* Release the kds resource or cancel if zapping */
-		kds_resource_set_release_sync(&katom->kds_rset);
-	}
-#endif				/* CONFIG_KDS */
-
-#ifdef CONFIG_MALI_BIFROST_DMA_FENCE
-	/* Flush dma-fence workqueue to ensure that any callbacks that may have
-	 * been queued are done before continuing.
-	 * Any successfully completed atom would have had all it's callbacks
-	 * completed before the atom was run, so only flush for failed atoms.
-	 */
-	if (katom->event_code != BASE_JD_EVENT_DONE)
-		flush_workqueue(katom->kctx->dma_fence.wq);
-#endif /* CONFIG_MALI_BIFROST_DMA_FENCE */
-}
-
-static void kbase_jd_post_external_resources(struct kbase_jd_atom *katom)
-{
-	KBASE_DEBUG_ASSERT(katom);
-	KBASE_DEBUG_ASSERT(katom->core_req & BASE_JD_REQ_EXTERNAL_RESOURCES);
-
-#ifdef CONFIG_KDS
-	/* Prevent the KDS resource from triggering the atom in case of zapping */
-	if (katom->kds_rset)
-		katom->kds_dep_satisfied = true;
-#endif				/* CONFIG_KDS */
-
-#ifdef CONFIG_MALI_BIFROST_DMA_FENCE
-	kbase_dma_fence_signal(katom);
-#endif /* CONFIG_MALI_BIFROST_DMA_FENCE */
-
-	kbase_gpu_vm_lock(katom->kctx);
-	/* only roll back if extres is non-NULL */
-	if (katom->extres) {
-		u32 res_no;
-
-		res_no = katom->nr_extres;
-		while (res_no-- > 0) {
-			struct kbase_mem_phy_alloc *alloc = katom->extres[res_no].alloc;
-			struct kbase_va_region *reg;
-
-			reg = kbase_region_tracker_find_region_base_address(
-					katom->kctx,
-					katom->extres[res_no].gpu_address);
-			kbase_unmap_external_resource(katom->kctx, reg, alloc);
-		}
-		kfree(katom->extres);
-		katom->extres = NULL;
-	}
-	kbase_gpu_vm_unlock(katom->kctx);
-}
-
-/*
- * Set up external resources needed by this job.
- *
- * jctx.lock must be held when this is called.
- */
-
-static int kbase_jd_pre_external_resources(struct kbase_jd_atom *katom, const struct base_jd_atom_v2 *user_atom)
-{
-	int err_ret_val = -EINVAL;
-	u32 res_no;
-#ifdef CONFIG_KDS
-	u32 kds_res_count = 0;
-	struct kds_resource **kds_resources = NULL;
-	unsigned long *kds_access_bitmap = NULL;
-#endif				/* CONFIG_KDS */
-#ifdef CONFIG_MALI_BIFROST_DMA_FENCE
-	struct kbase_dma_fence_resv_info info = {
-		.dma_fence_resv_count = 0,
-	};
-#ifdef CONFIG_SYNC
-	/*
-	 * When both dma-buf fence and Android native sync is enabled, we
-	 * disable dma-buf fence for contexts that are using Android native
-	 * fences.
-	 */
-	const bool implicit_sync = !kbase_ctx_flag(katom->kctx,
-						   KCTX_NO_IMPLICIT_SYNC);
-#else /* CONFIG_SYNC */
-	const bool implicit_sync = true;
-#endif /* CONFIG_SYNC */
-#endif /* CONFIG_MALI_BIFROST_DMA_FENCE */
-	struct base_external_resource *input_extres;
-
-	KBASE_DEBUG_ASSERT(katom);
-	KBASE_DEBUG_ASSERT(katom->core_req & BASE_JD_REQ_EXTERNAL_RESOURCES);
-
-	/* no resources encoded, early out */
-	if (!katom->nr_extres)
-		return -EINVAL;
-
-	katom->extres = kmalloc_array(katom->nr_extres, sizeof(*katom->extres), GFP_KERNEL);
-	if (NULL == katom->extres) {
-		err_ret_val = -ENOMEM;
-		goto early_err_out;
-	}
-
-	/* copy user buffer to the end of our real buffer.
-	 * Make sure the struct sizes haven't changed in a way
-	 * we don't support */
-	BUILD_BUG_ON(sizeof(*input_extres) > sizeof(*katom->extres));
-	input_extres = (struct base_external_resource *)
-			(((unsigned char *)katom->extres) +
-			(sizeof(*katom->extres) - sizeof(*input_extres)) *
-			katom->nr_extres);
-
-	if (copy_from_user(input_extres,
-			get_compat_pointer(katom->kctx, user_atom->extres_list),
-			sizeof(*input_extres) * katom->nr_extres) != 0) {
-		err_ret_val = -EINVAL;
-		goto early_err_out;
-	}
-#ifdef CONFIG_KDS
-	/* assume we have to wait for all */
-	KBASE_DEBUG_ASSERT(0 != katom->nr_extres);
-	kds_resources = kmalloc_array(katom->nr_extres, sizeof(struct kds_resource *), GFP_KERNEL);
-
-	if (!kds_resources) {
-		err_ret_val = -ENOMEM;
-		goto early_err_out;
-	}
-
-	KBASE_DEBUG_ASSERT(0 != katom->nr_extres);
-	kds_access_bitmap = kcalloc(BITS_TO_LONGS(katom->nr_extres),
-				    sizeof(unsigned long),
-				    GFP_KERNEL);
-	if (!kds_access_bitmap) {
-		err_ret_val = -ENOMEM;
-		goto early_err_out;
-	}
-#endif				/* CONFIG_KDS */
-
-#ifdef CONFIG_MALI_BIFROST_DMA_FENCE
-	if (implicit_sync) {
-		info.resv_objs = kmalloc_array(katom->nr_extres,
-					sizeof(struct reservation_object *),
-					GFP_KERNEL);
-		if (!info.resv_objs) {
-			err_ret_val = -ENOMEM;
-			goto early_err_out;
-		}
-
-		info.dma_fence_excl_bitmap =
-				kcalloc(BITS_TO_LONGS(katom->nr_extres),
-					sizeof(unsigned long), GFP_KERNEL);
-		if (!info.dma_fence_excl_bitmap) {
-			err_ret_val = -ENOMEM;
-			goto early_err_out;
-		}
-	}
-#endif /* CONFIG_MALI_BIFROST_DMA_FENCE */
-
-	/* Take the processes mmap lock */
-	down_read(&current->mm->mmap_sem);
-
-	/* need to keep the GPU VM locked while we set up UMM buffers */
-	kbase_gpu_vm_lock(katom->kctx);
-	for (res_no = 0; res_no < katom->nr_extres; res_no++) {
-		struct base_external_resource *res;
-		struct kbase_va_region *reg;
-		struct kbase_mem_phy_alloc *alloc;
-		bool exclusive;
-
-		res = &input_extres[res_no];
-		exclusive = (res->ext_resource & BASE_EXT_RES_ACCESS_EXCLUSIVE)
-				? true : false;
-		reg = kbase_region_tracker_find_region_enclosing_address(
-				katom->kctx,
-				res->ext_resource & ~BASE_EXT_RES_ACCESS_EXCLUSIVE);
-		/* did we find a matching region object? */
-		if (NULL == reg || (reg->flags & KBASE_REG_FREE)) {
-			/* roll back */
-			goto failed_loop;
-		}
-
-		if (!(katom->core_req & BASE_JD_REQ_SOFT_JOB) &&
-				(reg->flags & KBASE_REG_SECURE)) {
-			katom->atom_flags |= KBASE_KATOM_FLAG_PROTECTED;
-		}
-
-		alloc = kbase_map_external_resource(katom->kctx, reg,
-				current->mm
-#ifdef CONFIG_KDS
-				, &kds_res_count, kds_resources,
-				kds_access_bitmap, exclusive
-#endif
-				);
-		if (!alloc) {
-			err_ret_val = -EINVAL;
-			goto failed_loop;
-		}
-
-#ifdef CONFIG_MALI_BIFROST_DMA_FENCE
-		if (implicit_sync &&
-		    reg->gpu_alloc->type == KBASE_MEM_TYPE_IMPORTED_UMM) {
-			struct reservation_object *resv;
-
-			resv = reg->gpu_alloc->imported.umm.dma_buf->resv;
-			if (resv)
-				kbase_dma_fence_add_reservation(resv, &info,
-								exclusive);
-		}
-#endif /* CONFIG_MALI_BIFROST_DMA_FENCE */
-
-		/* finish with updating out array with the data we found */
-		/* NOTE: It is important that this is the last thing we do (or
-		 * at least not before the first write) as we overwrite elements
-		 * as we loop and could be overwriting ourself, so no writes
-		 * until the last read for an element.
-		 * */
-		katom->extres[res_no].gpu_address = reg->start_pfn << PAGE_SHIFT; /* save the start_pfn (as an address, not pfn) to use fast lookup later */
-		katom->extres[res_no].alloc = alloc;
-	}
-	/* successfully parsed the extres array */
-	/* drop the vm lock before we call into kds */
-	kbase_gpu_vm_unlock(katom->kctx);
-
-	/* Release the processes mmap lock */
-	up_read(&current->mm->mmap_sem);
-
-#ifdef CONFIG_KDS
-	if (kds_res_count) {
-		int wait_failed;
-
-		/* We have resources to wait for with kds */
-		katom->kds_dep_satisfied = false;
-
-		wait_failed = kds_async_waitall(&katom->kds_rset,
-				&katom->kctx->jctx.kds_cb, katom, NULL,
-				kds_res_count, kds_access_bitmap,
-				kds_resources);
-
-		if (wait_failed)
-			goto failed_kds_setup;
-		else
-			kbase_jd_kds_waiters_add(katom);
-	} else {
-		/* Nothing to wait for, so kds dep met */
-		katom->kds_dep_satisfied = true;
-	}
-	kfree(kds_resources);
-	kfree(kds_access_bitmap);
-#endif				/* CONFIG_KDS */
-
-#ifdef CONFIG_MALI_BIFROST_DMA_FENCE
-	if (implicit_sync) {
-		if (info.dma_fence_resv_count) {
-			int ret;
-
-			ret = kbase_dma_fence_wait(katom, &info);
-			if (ret < 0)
-				goto failed_dma_fence_setup;
-		}
-
-		kfree(info.resv_objs);
-		kfree(info.dma_fence_excl_bitmap);
-	}
-#endif /* CONFIG_MALI_BIFROST_DMA_FENCE */
-
-	/* all done OK */
-	return 0;
-
-/* error handling section */
-
-#ifdef CONFIG_MALI_BIFROST_DMA_FENCE
-failed_dma_fence_setup:
-#ifdef CONFIG_KDS
-	/* If we are here, dma_fence setup failed but KDS didn't.
-	 * Revert KDS setup if any.
-	 */
-	if (kds_res_count) {
-		mutex_unlock(&katom->kctx->jctx.lock);
-		kds_resource_set_release_sync(&katom->kds_rset);
-		mutex_lock(&katom->kctx->jctx.lock);
-
-		kbase_jd_kds_waiters_remove(katom);
-		katom->kds_dep_satisfied = true;
-	}
-#endif /* CONFIG_KDS */
-#endif /* CONFIG_MALI_BIFROST_DMA_FENCE */
-#ifdef CONFIG_KDS
-failed_kds_setup:
-#endif
-#if defined(CONFIG_KDS) || defined(CONFIG_MALI_BIFROST_DMA_FENCE)
-	/* Lock the processes mmap lock */
-	down_read(&current->mm->mmap_sem);
-
-	/* lock before we unmap */
-	kbase_gpu_vm_lock(katom->kctx);
-#endif
-
- failed_loop:
-	/* undo the loop work */
-	while (res_no-- > 0) {
-		struct kbase_mem_phy_alloc *alloc = katom->extres[res_no].alloc;
-
-		kbase_unmap_external_resource(katom->kctx, NULL, alloc);
-	}
-	kbase_gpu_vm_unlock(katom->kctx);
-
-	/* Release the processes mmap lock */
-	up_read(&current->mm->mmap_sem);
-
- early_err_out:
-	kfree(katom->extres);
-	katom->extres = NULL;
-#ifdef CONFIG_KDS
-	kfree(kds_resources);
-	kfree(kds_access_bitmap);
-#endif				/* CONFIG_KDS */
-#ifdef CONFIG_MALI_BIFROST_DMA_FENCE
-	if (implicit_sync) {
-		kfree(info.resv_objs);
-		kfree(info.dma_fence_excl_bitmap);
-	}
-#endif
-	return err_ret_val;
-}
-
-static inline void jd_resolve_dep(struct list_head *out_list,
-					struct kbase_jd_atom *katom,
-					u8 d, bool ctx_is_dying)
-{
-	u8 other_d = !d;
-
-	while (!list_empty(&katom->dep_head[d])) {
-		struct kbase_jd_atom *dep_atom;
-		struct kbase_jd_atom *other_dep_atom;
-		u8 dep_type;
-
-		dep_atom = list_entry(katom->dep_head[d].next,
-				struct kbase_jd_atom, dep_item[d]);
-		list_del(katom->dep_head[d].next);
-
-		dep_type = kbase_jd_katom_dep_type(&dep_atom->dep[d]);
-		kbase_jd_katom_dep_clear(&dep_atom->dep[d]);
-
-		if (katom->event_code != BASE_JD_EVENT_DONE &&
-			(dep_type != BASE_JD_DEP_TYPE_ORDER)) {
-#ifdef CONFIG_KDS
-			if (!dep_atom->kds_dep_satisfied) {
-				/* Just set kds_dep_satisfied to true. If the callback happens after this then it will early out and
-				 * do nothing. If the callback doesn't happen then kbase_jd_post_external_resources will clean up
-				 */
-				dep_atom->kds_dep_satisfied = true;
-			}
-#endif
-
-#ifdef CONFIG_MALI_BIFROST_DMA_FENCE
-			kbase_dma_fence_cancel_callbacks(dep_atom);
-#endif
-
-			dep_atom->event_code = katom->event_code;
-			KBASE_DEBUG_ASSERT(dep_atom->status !=
-						KBASE_JD_ATOM_STATE_UNUSED);
-
-			if ((dep_atom->core_req & BASE_JD_REQ_SOFT_REPLAY)
-					!= BASE_JD_REQ_SOFT_REPLAY) {
-				dep_atom->will_fail_event_code =
-					dep_atom->event_code;
-			} else {
-				dep_atom->status =
-					KBASE_JD_ATOM_STATE_COMPLETED;
-			}
-		}
-		other_dep_atom = (struct kbase_jd_atom *)
-			kbase_jd_katom_dep_atom(&dep_atom->dep[other_d]);
-
-		if (!dep_atom->in_jd_list && (!other_dep_atom ||
-				(IS_GPU_ATOM(dep_atom) && !ctx_is_dying &&
-				!dep_atom->will_fail_event_code &&
-				!other_dep_atom->will_fail_event_code))) {
-			bool dep_satisfied = true;
-#ifdef CONFIG_MALI_BIFROST_DMA_FENCE
-			int dep_count;
-
-			dep_count = kbase_fence_dep_count_read(dep_atom);
-			if (likely(dep_count == -1)) {
-				dep_satisfied = true;
-			} else {
-				/*
-				 * There are either still active callbacks, or
-				 * all fences for this @dep_atom has signaled,
-				 * but the worker that will queue the atom has
-				 * not yet run.
-				 *
-				 * Wait for the fences to signal and the fence
-				 * worker to run and handle @dep_atom. If
-				 * @dep_atom was completed due to error on
-				 * @katom, then the fence worker will pick up
-				 * the complete status and error code set on
-				 * @dep_atom above.
-				 */
-				dep_satisfied = false;
-			}
-#endif /* CONFIG_MALI_BIFROST_DMA_FENCE */
-
-#ifdef CONFIG_KDS
-			dep_satisfied = dep_satisfied && dep_atom->kds_dep_satisfied;
-#endif
-
-			if (dep_satisfied) {
-				dep_atom->in_jd_list = true;
-				list_add_tail(&dep_atom->jd_item, out_list);
-			}
-		}
-	}
-}
-
-KBASE_EXPORT_TEST_API(jd_resolve_dep);
-
-#if MALI_CUSTOMER_RELEASE == 0
-static void jd_force_failure(struct kbase_device *kbdev, struct kbase_jd_atom *katom)
-{
-	kbdev->force_replay_count++;
-
-	if (kbdev->force_replay_count >= kbdev->force_replay_limit) {
-		kbdev->force_replay_count = 0;
-		katom->event_code = BASE_JD_EVENT_FORCE_REPLAY;
-
-		if (kbdev->force_replay_random)
-			kbdev->force_replay_limit =
-			   (prandom_u32() % KBASEP_FORCE_REPLAY_RANDOM_LIMIT) + 1;
-
-		dev_info(kbdev->dev, "force_replay : promoting to error\n");
-	}
-}
-
-/** Test to see if atom should be forced to fail.
- *
- * This function will check if an atom has a replay job as a dependent. If so
- * then it will be considered for forced failure. */
-static void jd_check_force_failure(struct kbase_jd_atom *katom)
-{
-	struct kbase_context *kctx = katom->kctx;
-	struct kbase_device *kbdev = kctx->kbdev;
-	int i;
-
-	if ((kbdev->force_replay_limit == KBASEP_FORCE_REPLAY_DISABLED) ||
-	    (katom->core_req & BASEP_JD_REQ_EVENT_NEVER))
-		return;
-
-	for (i = 1; i < BASE_JD_ATOM_COUNT; i++) {
-		if (kbase_jd_katom_dep_atom(&kctx->jctx.atoms[i].dep[0]) == katom ||
-		    kbase_jd_katom_dep_atom(&kctx->jctx.atoms[i].dep[1]) == katom) {
-			struct kbase_jd_atom *dep_atom = &kctx->jctx.atoms[i];
-
-			if ((dep_atom->core_req & BASE_JD_REQ_SOFT_JOB_TYPE) ==
-						     BASE_JD_REQ_SOFT_REPLAY &&
-			    (dep_atom->core_req & kbdev->force_replay_core_req)
-					     == kbdev->force_replay_core_req) {
-				jd_force_failure(kbdev, katom);
-				return;
-			}
-		}
-	}
-}
-#endif
-
-/**
- * is_dep_valid - Validate that a dependency is valid for early dependency
- *                submission
- * @katom: Dependency atom to validate
- *
- * A dependency is valid if any of the following are true :
- * - It does not exist (a non-existent dependency does not block submission)
- * - It is in the job scheduler
- * - It has completed, does not have a failure event code, and has not been
- *   marked to fail in the future
- *
- * Return: true if valid, false otherwise
- */
-static bool is_dep_valid(struct kbase_jd_atom *katom)
-{
-	/* If there's no dependency then this is 'valid' from the perspective of
-	 * early dependency submission */
-	if (!katom)
-		return true;
-
-	/* Dependency must have reached the job scheduler */
-	if (katom->status < KBASE_JD_ATOM_STATE_IN_JS)
-		return false;
-
-	/* If dependency has completed and has failed or will fail then it is
-	 * not valid */
-	if (katom->status >= KBASE_JD_ATOM_STATE_HW_COMPLETED &&
-			(katom->event_code != BASE_JD_EVENT_DONE ||
-			katom->will_fail_event_code))
-		return false;
-
-	return true;
-}
-
-static void jd_try_submitting_deps(struct list_head *out_list,
-		struct kbase_jd_atom *node)
-{
-	int i;
-
-	for (i = 0; i < 2; i++) {
-		struct list_head *pos;
-
-		list_for_each(pos, &node->dep_head[i]) {
-			struct kbase_jd_atom *dep_atom = list_entry(pos,
-					struct kbase_jd_atom, dep_item[i]);
-
-			if (IS_GPU_ATOM(dep_atom) && !dep_atom->in_jd_list) {
-				/*Check if atom deps look sane*/
-				bool dep0_valid = is_dep_valid(
-						dep_atom->dep[0].atom);
-				bool dep1_valid = is_dep_valid(
-						dep_atom->dep[1].atom);
-				bool dep_satisfied = true;
-#ifdef CONFIG_MALI_BIFROST_DMA_FENCE
-				int dep_count;
-
-				dep_count = kbase_fence_dep_count_read(
-								dep_atom);
-				if (likely(dep_count == -1)) {
-					dep_satisfied = true;
-				} else {
-				/*
-				 * There are either still active callbacks, or
-				 * all fences for this @dep_atom has signaled,
-				 * but the worker that will queue the atom has
-				 * not yet run.
-				 *
-				 * Wait for the fences to signal and the fence
-				 * worker to run and handle @dep_atom. If
-				 * @dep_atom was completed due to error on
-				 * @katom, then the fence worker will pick up
-				 * the complete status and error code set on
-				 * @dep_atom above.
-				 */
-					dep_satisfied = false;
-				}
-#endif /* CONFIG_MALI_BIFROST_DMA_FENCE */
-#ifdef CONFIG_KDS
-				dep_satisfied = dep_satisfied &&
-						dep_atom->kds_dep_satisfied;
-#endif
-
-				if (dep0_valid && dep1_valid && dep_satisfied) {
-					dep_atom->in_jd_list = true;
-					list_add(&dep_atom->jd_item, out_list);
-				}
-			}
-		}
-	}
-}
-
-/*
- * Perform the necessary handling of an atom that has finished running
- * on the GPU.
- *
- * Note that if this is a soft-job that has had kbase_prepare_soft_job called on it then the caller
- * is responsible for calling kbase_finish_soft_job *before* calling this function.
- *
- * The caller must hold the kbase_jd_context.lock.
- */
-bool jd_done_nolock(struct kbase_jd_atom *katom,
-		struct list_head *completed_jobs_ctx)
-{
-	struct kbase_context *kctx = katom->kctx;
-	struct kbase_device *kbdev = kctx->kbdev;
-	struct list_head completed_jobs;
-	struct list_head runnable_jobs;
-	bool need_to_try_schedule_context = false;
-	int i;
-
-	INIT_LIST_HEAD(&completed_jobs);
-	INIT_LIST_HEAD(&runnable_jobs);
-
-	KBASE_DEBUG_ASSERT(katom->status != KBASE_JD_ATOM_STATE_UNUSED);
-
-#if MALI_CUSTOMER_RELEASE == 0
-	jd_check_force_failure(katom);
-#endif
-
-	/* This is needed in case an atom is failed due to being invalid, this
-	 * can happen *before* the jobs that the atom depends on have completed */
-	for (i = 0; i < 2; i++) {
-		if (kbase_jd_katom_dep_atom(&katom->dep[i])) {
-			list_del(&katom->dep_item[i]);
-			kbase_jd_katom_dep_clear(&katom->dep[i]);
-		}
-	}
-
-	/* With PRLAM-10817 or PRLAM-10959 the last tile of a fragment job being soft-stopped can fail with
-	 * BASE_JD_EVENT_TILE_RANGE_FAULT.
-	 *
-	 * So here if the fragment job failed with TILE_RANGE_FAULT and it has been soft-stopped, then we promote the
-	 * error code to BASE_JD_EVENT_DONE
-	 */
-
-	if ((kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_10817) || kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_10959)) &&
-		  katom->event_code == BASE_JD_EVENT_TILE_RANGE_FAULT) {
-		if ((katom->core_req & BASE_JD_REQ_FS) && (katom->atom_flags & KBASE_KATOM_FLAG_BEEN_SOFT_STOPPPED)) {
-			/* Promote the failure to job done */
-			katom->event_code = BASE_JD_EVENT_DONE;
-			katom->atom_flags = katom->atom_flags & (~KBASE_KATOM_FLAG_BEEN_SOFT_STOPPPED);
-		}
-	}
-
-	katom->status = KBASE_JD_ATOM_STATE_COMPLETED;
-	list_add_tail(&katom->jd_item, &completed_jobs);
-
-	while (!list_empty(&completed_jobs)) {
-		katom = list_entry(completed_jobs.prev, struct kbase_jd_atom, jd_item);
-		list_del(completed_jobs.prev);
-		KBASE_DEBUG_ASSERT(katom->status == KBASE_JD_ATOM_STATE_COMPLETED);
-
-		for (i = 0; i < 2; i++)
-			jd_resolve_dep(&runnable_jobs, katom, i,
-					kbase_ctx_flag(kctx, KCTX_DYING));
-
-		if (katom->core_req & BASE_JD_REQ_EXTERNAL_RESOURCES)
-			kbase_jd_post_external_resources(katom);
-
-		while (!list_empty(&runnable_jobs)) {
-			struct kbase_jd_atom *node;
-
-			node = list_entry(runnable_jobs.next,
-					struct kbase_jd_atom, jd_item);
-			list_del(runnable_jobs.next);
-			node->in_jd_list = false;
-
-			KBASE_DEBUG_ASSERT(node->status != KBASE_JD_ATOM_STATE_UNUSED);
-
-			if (node->status != KBASE_JD_ATOM_STATE_COMPLETED &&
-					!kbase_ctx_flag(kctx, KCTX_DYING)) {
-				need_to_try_schedule_context |= jd_run_atom(node);
-			} else {
-				node->event_code = katom->event_code;
-
-				if ((node->core_req &
-					BASE_JD_REQ_SOFT_JOB_TYPE) ==
-					BASE_JD_REQ_SOFT_REPLAY) {
-					if (kbase_replay_process(node))
-						/* Don't complete this atom */
-						continue;
-				} else if (node->core_req &
-							BASE_JD_REQ_SOFT_JOB) {
-					/* If this is a fence wait soft job
-					 * then remove it from the list of sync
-					 * waiters.
-					 */
-					if (BASE_JD_REQ_SOFT_FENCE_WAIT == node->core_req)
-						kbasep_remove_waiting_soft_job(node);
-
-					kbase_finish_soft_job(node);
-				}
-				node->status = KBASE_JD_ATOM_STATE_COMPLETED;
-			}
-
-			if (node->status == KBASE_JD_ATOM_STATE_COMPLETED) {
-				list_add_tail(&node->jd_item, &completed_jobs);
-			} else if (node->status == KBASE_JD_ATOM_STATE_IN_JS &&
-					!node->will_fail_event_code) {
-				/* Node successfully submitted, try submitting
-				 * dependencies as they may now be representable
-				 * in JS */
-				jd_try_submitting_deps(&runnable_jobs, node);
-			}
-		}
-
-		/* Register a completed job as a disjoint event when the GPU
-		 * is in a disjoint state (ie. being reset or replaying jobs).
-		 */
-		kbase_disjoint_event_potential(kctx->kbdev);
-		if (completed_jobs_ctx)
-			list_add_tail(&katom->jd_item, completed_jobs_ctx);
-		else
-			kbase_event_post(kctx, katom);
-
-		/* Decrement and check the TOTAL number of jobs. This includes
-		 * those not tracked by the scheduler: 'not ready to run' and
-		 * 'dependency-only' jobs. */
-		if (--kctx->jctx.job_nr == 0)
-			wake_up(&kctx->jctx.zero_jobs_wait);	/* All events are safely queued now, and we can signal any waiter
-								 * that we've got no more jobs (so we can be safely terminated) */
-	}
-
-	return need_to_try_schedule_context;
-}
-
-KBASE_EXPORT_TEST_API(jd_done_nolock);
-
-#ifdef CONFIG_GPU_TRACEPOINTS
-enum {
-	CORE_REQ_DEP_ONLY,
-	CORE_REQ_SOFT,
-	CORE_REQ_COMPUTE,
-	CORE_REQ_FRAGMENT,
-	CORE_REQ_VERTEX,
-	CORE_REQ_TILER,
-	CORE_REQ_FRAGMENT_VERTEX,
-	CORE_REQ_FRAGMENT_VERTEX_TILER,
-	CORE_REQ_FRAGMENT_TILER,
-	CORE_REQ_VERTEX_TILER,
-	CORE_REQ_UNKNOWN
-};
-static const char * const core_req_strings[] = {
-	"Dependency Only Job",
-	"Soft Job",
-	"Compute Shader Job",
-	"Fragment Shader Job",
-	"Vertex/Geometry Shader Job",
-	"Tiler Job",
-	"Fragment Shader + Vertex/Geometry Shader Job",
-	"Fragment Shader + Vertex/Geometry Shader Job + Tiler Job",
-	"Fragment Shader + Tiler Job",
-	"Vertex/Geometry Shader Job + Tiler Job",
-	"Unknown Job"
-};
-static const char *kbasep_map_core_reqs_to_string(base_jd_core_req core_req)
-{
-	if (core_req & BASE_JD_REQ_SOFT_JOB)
-		return core_req_strings[CORE_REQ_SOFT];
-	if (core_req & BASE_JD_REQ_ONLY_COMPUTE)
-		return core_req_strings[CORE_REQ_COMPUTE];
-	switch (core_req & (BASE_JD_REQ_FS | BASE_JD_REQ_CS | BASE_JD_REQ_T)) {
-	case BASE_JD_REQ_DEP:
-		return core_req_strings[CORE_REQ_DEP_ONLY];
-	case BASE_JD_REQ_FS:
-		return core_req_strings[CORE_REQ_FRAGMENT];
-	case BASE_JD_REQ_CS:
-		return core_req_strings[CORE_REQ_VERTEX];
-	case BASE_JD_REQ_T:
-		return core_req_strings[CORE_REQ_TILER];
-	case (BASE_JD_REQ_FS | BASE_JD_REQ_CS):
-		return core_req_strings[CORE_REQ_FRAGMENT_VERTEX];
-	case (BASE_JD_REQ_FS | BASE_JD_REQ_T):
-		return core_req_strings[CORE_REQ_FRAGMENT_TILER];
-	case (BASE_JD_REQ_CS | BASE_JD_REQ_T):
-		return core_req_strings[CORE_REQ_VERTEX_TILER];
-	case (BASE_JD_REQ_FS | BASE_JD_REQ_CS | BASE_JD_REQ_T):
-		return core_req_strings[CORE_REQ_FRAGMENT_VERTEX_TILER];
-	}
-	return core_req_strings[CORE_REQ_UNKNOWN];
-}
-#endif
-
-bool jd_submit_atom(struct kbase_context *kctx, const struct base_jd_atom_v2 *user_atom, struct kbase_jd_atom *katom)
-{
-	struct kbase_jd_context *jctx = &kctx->jctx;
-	int queued = 0;
-	int i;
-	int sched_prio;
-	bool ret;
-	bool will_fail = false;
-
-	/* Update the TOTAL number of jobs. This includes those not tracked by
-	 * the scheduler: 'not ready to run' and 'dependency-only' jobs. */
-	jctx->job_nr++;
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
-	katom->start_timestamp.tv64 = 0;
-#else
-	katom->start_timestamp = 0;
-#endif
-	katom->udata = user_atom->udata;
-	katom->kctx = kctx;
-	katom->nr_extres = user_atom->nr_extres;
-	katom->extres = NULL;
-	katom->device_nr = user_atom->device_nr;
-	katom->affinity = 0;
-	katom->jc = user_atom->jc;
-	katom->coreref_state = KBASE_ATOM_COREREF_STATE_NO_CORES_REQUESTED;
-	katom->core_req = user_atom->core_req;
-	katom->atom_flags = 0;
-	katom->retry_count = 0;
-	katom->need_cache_flush_cores_retained = 0;
-	katom->pre_dep = NULL;
-	katom->post_dep = NULL;
-	katom->x_pre_dep = NULL;
-	katom->x_post_dep = NULL;
-	katom->will_fail_event_code = BASE_JD_EVENT_NOT_STARTED;
-
-	/* Implicitly sets katom->protected_state.enter as well. */
-	katom->protected_state.exit = KBASE_ATOM_EXIT_PROTECTED_CHECK;
-
-	katom->age = kctx->age_count++;
-
-	INIT_LIST_HEAD(&katom->jd_item);
-#ifdef CONFIG_KDS
-	/* Start by assuming that the KDS dependencies are satisfied,
-	 * kbase_jd_pre_external_resources will correct this if there are dependencies */
-	katom->kds_dep_satisfied = true;
-	katom->kds_rset = NULL;
-#endif				/* CONFIG_KDS */
-#ifdef CONFIG_MALI_BIFROST_DMA_FENCE
-	kbase_fence_dep_count_set(katom, -1);
-#endif
-
-	/* Don't do anything if there is a mess up with dependencies.
-	   This is done in a separate cycle to check both the dependencies at ones, otherwise
-	   it will be extra complexity to deal with 1st dependency ( just added to the list )
-	   if only the 2nd one has invalid config.
-	 */
-	for (i = 0; i < 2; i++) {
-		int dep_atom_number = user_atom->pre_dep[i].atom_id;
-		base_jd_dep_type dep_atom_type = user_atom->pre_dep[i].dependency_type;
-
-		if (dep_atom_number) {
-			if (dep_atom_type != BASE_JD_DEP_TYPE_ORDER &&
-					dep_atom_type != BASE_JD_DEP_TYPE_DATA) {
-				katom->event_code = BASE_JD_EVENT_JOB_CONFIG_FAULT;
-				katom->status = KBASE_JD_ATOM_STATE_COMPLETED;
-
-				/* Wrong dependency setup. Atom will be sent
-				 * back to user space. Do not record any
-				 * dependencies. */
-				KBASE_TLSTREAM_TL_NEW_ATOM(
-						katom,
-						kbase_jd_atom_id(kctx, katom));
-				KBASE_TLSTREAM_TL_RET_ATOM_CTX(
-						katom, kctx);
-				KBASE_TLSTREAM_TL_ATTRIB_ATOM_STATE(katom,
-						TL_ATOM_STATE_IDLE);
-
-				ret = jd_done_nolock(katom, NULL);
-				goto out;
-			}
-		}
-	}
-
-	/* Add dependencies */
-	for (i = 0; i < 2; i++) {
-		int dep_atom_number = user_atom->pre_dep[i].atom_id;
-		base_jd_dep_type dep_atom_type;
-		struct kbase_jd_atom *dep_atom = &jctx->atoms[dep_atom_number];
-
-		dep_atom_type = user_atom->pre_dep[i].dependency_type;
-		kbase_jd_katom_dep_clear(&katom->dep[i]);
-
-		if (!dep_atom_number)
-			continue;
-
-		if (dep_atom->status == KBASE_JD_ATOM_STATE_UNUSED ||
-				dep_atom->status == KBASE_JD_ATOM_STATE_COMPLETED) {
-
-			if (dep_atom->event_code == BASE_JD_EVENT_DONE)
-				continue;
-			/* don't stop this atom if it has an order dependency
-			 * only to the failed one, try to submit it through
-			 * the normal path
-			 */
-			if (dep_atom_type == BASE_JD_DEP_TYPE_ORDER &&
-					dep_atom->event_code > BASE_JD_EVENT_ACTIVE) {
-				continue;
-			}
-
-			/* Atom has completed, propagate the error code if any */
-			katom->event_code = dep_atom->event_code;
-			katom->status = KBASE_JD_ATOM_STATE_QUEUED;
-
-			/* This atom is going through soft replay or
-			 * will be sent back to user space. Do not record any
-			 * dependencies. */
-			KBASE_TLSTREAM_TL_NEW_ATOM(
-					katom,
-					kbase_jd_atom_id(kctx, katom));
-			KBASE_TLSTREAM_TL_RET_ATOM_CTX(katom, kctx);
-			KBASE_TLSTREAM_TL_ATTRIB_ATOM_STATE(katom,
-					TL_ATOM_STATE_IDLE);
-
-			if ((katom->core_req & BASE_JD_REQ_SOFT_JOB_TYPE)
-					 == BASE_JD_REQ_SOFT_REPLAY) {
-				if (kbase_replay_process(katom)) {
-					ret = false;
-					goto out;
-				}
-			}
-			will_fail = true;
-
-		} else {
-			/* Atom is in progress, add this atom to the list */
-			list_add_tail(&katom->dep_item[i], &dep_atom->dep_head[i]);
-			kbase_jd_katom_dep_set(&katom->dep[i], dep_atom, dep_atom_type);
-			queued = 1;
-		}
-	}
-
-	if (will_fail) {
-		if (!queued) {
-			ret = jd_done_nolock(katom, NULL);
-
-			goto out;
-		} else {
-			katom->will_fail_event_code = katom->event_code;
-			ret = false;
-
-			goto out;
-		}
-	} else {
-		/* These must occur after the above loop to ensure that an atom
-		 * that depends on a previous atom with the same number behaves
-		 * as expected */
-		katom->event_code = BASE_JD_EVENT_DONE;
-		katom->status = KBASE_JD_ATOM_STATE_QUEUED;
-	}
-
-	/* For invalid priority, be most lenient and choose the default */
-	sched_prio = kbasep_js_atom_prio_to_sched_prio(user_atom->prio);
-	if (sched_prio == KBASE_JS_ATOM_SCHED_PRIO_INVALID)
-		sched_prio = KBASE_JS_ATOM_SCHED_PRIO_DEFAULT;
-	katom->sched_priority = sched_prio;
-
-	/* Create a new atom recording all dependencies it was set up with. */
-	KBASE_TLSTREAM_TL_NEW_ATOM(
-			katom,
-			kbase_jd_atom_id(kctx, katom));
-	KBASE_TLSTREAM_TL_ATTRIB_ATOM_STATE(katom, TL_ATOM_STATE_IDLE);
-	KBASE_TLSTREAM_TL_ATTRIB_ATOM_PRIORITY(katom, katom->sched_priority);
-	KBASE_TLSTREAM_TL_RET_ATOM_CTX(katom, kctx);
-	for (i = 0; i < 2; i++)
-		if (BASE_JD_DEP_TYPE_INVALID != kbase_jd_katom_dep_type(
-					&katom->dep[i])) {
-			KBASE_TLSTREAM_TL_DEP_ATOM_ATOM(
-					(void *)kbase_jd_katom_dep_atom(
-						&katom->dep[i]),
-					(void *)katom);
-		} else if (BASE_JD_DEP_TYPE_INVALID !=
-				user_atom->pre_dep[i].dependency_type) {
-			/* Resolved dependency. */
-			int dep_atom_number =
-				user_atom->pre_dep[i].atom_id;
-			struct kbase_jd_atom *dep_atom =
-				&jctx->atoms[dep_atom_number];
-
-			KBASE_TLSTREAM_TL_RDEP_ATOM_ATOM(
-					(void *)dep_atom,
-					(void *)katom);
-		}
-
-	/* Reject atoms with job chain = NULL, as these cause issues with soft-stop */
-	if (!katom->jc && (katom->core_req & BASE_JD_REQ_ATOM_TYPE) != BASE_JD_REQ_DEP) {
-		dev_warn(kctx->kbdev->dev, "Rejecting atom with jc = NULL");
-		katom->event_code = BASE_JD_EVENT_JOB_INVALID;
-		ret = jd_done_nolock(katom, NULL);
-		goto out;
-	}
-
-	/* Reject atoms with an invalid device_nr */
-	if ((katom->core_req & BASE_JD_REQ_SPECIFIC_COHERENT_GROUP) &&
-	    (katom->device_nr >= kctx->kbdev->gpu_props.num_core_groups)) {
-		dev_warn(kctx->kbdev->dev,
-				"Rejecting atom with invalid device_nr %d",
-				katom->device_nr);
-		katom->event_code = BASE_JD_EVENT_JOB_INVALID;
-		ret = jd_done_nolock(katom, NULL);
-		goto out;
-	}
-
-	/* Reject atoms with invalid core requirements */
-	if ((katom->core_req & BASE_JD_REQ_EXTERNAL_RESOURCES) &&
-			(katom->core_req & BASE_JD_REQ_EVENT_COALESCE)) {
-		dev_warn(kctx->kbdev->dev,
-				"Rejecting atom with invalid core requirements");
-		katom->event_code = BASE_JD_EVENT_JOB_INVALID;
-		katom->core_req &= ~BASE_JD_REQ_EVENT_COALESCE;
-		ret = jd_done_nolock(katom, NULL);
-		goto out;
-	}
-
-	if (katom->core_req & BASE_JD_REQ_EXTERNAL_RESOURCES) {
-		/* handle what we need to do to access the external resources */
-		if (kbase_jd_pre_external_resources(katom, user_atom) != 0) {
-			/* setup failed (no access, bad resource, unknown resource types, etc.) */
-			katom->event_code = BASE_JD_EVENT_JOB_INVALID;
-			ret = jd_done_nolock(katom, NULL);
-			goto out;
-		}
-	}
-
-	/* Validate the atom. Function will return error if the atom is
-	 * malformed.
-	 *
-	 * Soft-jobs never enter the job scheduler but have their own initialize method.
-	 *
-	 * If either fail then we immediately complete the atom with an error.
-	 */
-	if ((katom->core_req & BASE_JD_REQ_SOFT_JOB) == 0) {
-		if (!kbase_js_is_atom_valid(kctx->kbdev, katom)) {
-			katom->event_code = BASE_JD_EVENT_JOB_INVALID;
-			ret = jd_done_nolock(katom, NULL);
-			goto out;
-		}
-	} else {
-		/* Soft-job */
-		if (kbase_prepare_soft_job(katom) != 0) {
-			katom->event_code = BASE_JD_EVENT_JOB_INVALID;
-			ret = jd_done_nolock(katom, NULL);
-			goto out;
-		}
-	}
-
-#ifdef CONFIG_GPU_TRACEPOINTS
-	katom->work_id = atomic_inc_return(&jctx->work_id);
-	trace_gpu_job_enqueue(kctx->id, katom->work_id,
-			kbasep_map_core_reqs_to_string(katom->core_req));
-#endif
-
-	if (queued && !IS_GPU_ATOM(katom)) {
-		ret = false;
-		goto out;
-	}
-#ifdef CONFIG_KDS
-	if (!katom->kds_dep_satisfied) {
-		/* Queue atom due to KDS dependency */
-		ret = false;
-		goto out;
-	}
-#endif				/* CONFIG_KDS */
-
-
-#ifdef CONFIG_MALI_BIFROST_DMA_FENCE
-	if (kbase_fence_dep_count_read(katom) != -1) {
-		ret = false;
-		goto out;
-	}
-#endif /* CONFIG_MALI_BIFROST_DMA_FENCE */
-
-	if ((katom->core_req & BASE_JD_REQ_SOFT_JOB_TYPE)
-						  == BASE_JD_REQ_SOFT_REPLAY) {
-		if (kbase_replay_process(katom))
-			ret = false;
-		else
-			ret = jd_done_nolock(katom, NULL);
-
-		goto out;
-	} else if (katom->core_req & BASE_JD_REQ_SOFT_JOB) {
-		if (kbase_process_soft_job(katom) == 0) {
-			kbase_finish_soft_job(katom);
-			ret = jd_done_nolock(katom, NULL);
-			goto out;
-		}
-
-		ret = false;
-	} else if ((katom->core_req & BASE_JD_REQ_ATOM_TYPE) != BASE_JD_REQ_DEP) {
-		katom->status = KBASE_JD_ATOM_STATE_IN_JS;
-		ret = kbasep_js_add_job(kctx, katom);
-		/* If job was cancelled then resolve immediately */
-		if (katom->event_code == BASE_JD_EVENT_JOB_CANCELLED)
-			ret = jd_done_nolock(katom, NULL);
-	} else {
-		/* This is a pure dependency. Resolve it immediately */
-		ret = jd_done_nolock(katom, NULL);
-	}
-
- out:
-	return ret;
-}
-
-int kbase_jd_submit(struct kbase_context *kctx,
-		void __user *user_addr, u32 nr_atoms, u32 stride,
-		bool uk6_atom)
-{
-	struct kbase_jd_context *jctx = &kctx->jctx;
-	int err = 0;
-	int i;
-	bool need_to_try_schedule_context = false;
-	struct kbase_device *kbdev;
-	u32 latest_flush;
-
-	/*
-	 * kbase_jd_submit isn't expected to fail and so all errors with the
-	 * jobs are reported by immediately failing them (through event system)
-	 */
-	kbdev = kctx->kbdev;
-
-	beenthere(kctx, "%s", "Enter");
-
-	if (kbase_ctx_flag(kctx, KCTX_SUBMIT_DISABLED)) {
-		dev_err(kbdev->dev, "Attempt to submit to a context that has SUBMIT_DISABLED set on it");
-		return -EINVAL;
-	}
-
-	if (stride != sizeof(base_jd_atom_v2)) {
-		dev_err(kbdev->dev, "Stride passed to job_submit doesn't match kernel");
-		return -EINVAL;
-	}
-
-	KBASE_TIMELINE_ATOMS_IN_FLIGHT(kctx, atomic_add_return(nr_atoms,
-				&kctx->timeline.jd_atoms_in_flight));
-
-	/* All atoms submitted in this call have the same flush ID */
-	latest_flush = kbase_backend_get_current_flush_id(kbdev);
-
-	for (i = 0; i < nr_atoms; i++) {
-		struct base_jd_atom_v2 user_atom;
-		struct kbase_jd_atom *katom;
-
-		if (copy_from_user(&user_atom, user_addr,
-					sizeof(user_atom)) != 0) {
-			err = -EINVAL;
-			KBASE_TIMELINE_ATOMS_IN_FLIGHT(kctx,
-				atomic_sub_return(nr_atoms - i,
-				&kctx->timeline.jd_atoms_in_flight));
-			break;
-		}
-
-#ifdef BASE_LEGACY_UK10_2_SUPPORT
-		if (KBASE_API_VERSION(10, 3) > kctx->api_version)
-			user_atom.core_req = (u32)(user_atom.compat_core_req
-					      & 0x7fff);
-#endif /* BASE_LEGACY_UK10_2_SUPPORT */
-
-		user_addr = (void __user *)((uintptr_t) user_addr + stride);
-
-		mutex_lock(&jctx->lock);
-#ifndef compiletime_assert
-#define compiletime_assert_defined
-#define compiletime_assert(x, msg) do { switch (0) { case 0: case (x):; } } \
-while (false)
-#endif
-		compiletime_assert((1 << (8*sizeof(user_atom.atom_number))) ==
-					BASE_JD_ATOM_COUNT,
-			"BASE_JD_ATOM_COUNT and base_atom_id type out of sync");
-		compiletime_assert(sizeof(user_atom.pre_dep[0].atom_id) ==
-					sizeof(user_atom.atom_number),
-			"BASE_JD_ATOM_COUNT and base_atom_id type out of sync");
-#ifdef compiletime_assert_defined
-#undef compiletime_assert
-#undef compiletime_assert_defined
-#endif
-		katom = &jctx->atoms[user_atom.atom_number];
-
-		/* Record the flush ID for the cache flush optimisation */
-		katom->flush_id = latest_flush;
-
-		while (katom->status != KBASE_JD_ATOM_STATE_UNUSED) {
-			/* Atom number is already in use, wait for the atom to
-			 * complete
-			 */
-			mutex_unlock(&jctx->lock);
-
-			/* This thread will wait for the atom to complete. Due
-			 * to thread scheduling we are not sure that the other
-			 * thread that owns the atom will also schedule the
-			 * context, so we force the scheduler to be active and
-			 * hence eventually schedule this context at some point
-			 * later.
-			 */
-			kbase_js_sched_all(kbdev);
-
-			if (wait_event_killable(katom->completed,
-					katom->status ==
-					KBASE_JD_ATOM_STATE_UNUSED) != 0) {
-				/* We're being killed so the result code
-				 * doesn't really matter
-				 */
-				return 0;
-			}
-			mutex_lock(&jctx->lock);
-		}
-
-		need_to_try_schedule_context |=
-				       jd_submit_atom(kctx, &user_atom, katom);
-
-		/* Register a completed job as a disjoint event when the GPU is in a disjoint state
-		 * (ie. being reset or replaying jobs).
-		 */
-		kbase_disjoint_event_potential(kbdev);
-
-		mutex_unlock(&jctx->lock);
-	}
-
-	if (need_to_try_schedule_context)
-		kbase_js_sched_all(kbdev);
-
-	return err;
-}
-
-KBASE_EXPORT_TEST_API(kbase_jd_submit);
-
-void kbase_jd_done_worker(struct work_struct *data)
-{
-	struct kbase_jd_atom *katom = container_of(data, struct kbase_jd_atom, work);
-	struct kbase_jd_context *jctx;
-	struct kbase_context *kctx;
-	struct kbasep_js_kctx_info *js_kctx_info;
-	struct kbase_device *kbdev;
-	struct kbasep_js_device_data *js_devdata;
-	u64 cache_jc = katom->jc;
-	struct kbasep_js_atom_retained_state katom_retained_state;
-	bool context_idle;
-	base_jd_core_req core_req = katom->core_req;
-	u64 affinity = katom->affinity;
-	enum kbase_atom_coreref_state coreref_state = katom->coreref_state;
-
-	/* Soft jobs should never reach this function */
-	KBASE_DEBUG_ASSERT((katom->core_req & BASE_JD_REQ_SOFT_JOB) == 0);
-
-	kctx = katom->kctx;
-	jctx = &kctx->jctx;
-	kbdev = kctx->kbdev;
-	js_kctx_info = &kctx->jctx.sched_info;
-	js_devdata = &kbdev->js_data;
-
-	KBASE_TRACE_ADD(kbdev, JD_DONE_WORKER, kctx, katom, katom->jc, 0);
-
-	kbase_backend_complete_wq(kbdev, katom);
-
-	/*
-	 * Begin transaction on JD context and JS context
-	 */
-	mutex_lock(&jctx->lock);
-	KBASE_TLSTREAM_TL_ATTRIB_ATOM_STATE(katom, TL_ATOM_STATE_DONE);
-	mutex_lock(&js_devdata->queue_mutex);
-	mutex_lock(&js_kctx_info->ctx.jsctx_mutex);
-
-	/* This worker only gets called on contexts that are scheduled *in*. This is
-	 * because it only happens in response to an IRQ from a job that was
-	 * running.
-	 */
-	KBASE_DEBUG_ASSERT(kbase_ctx_flag(kctx, KCTX_SCHEDULED));
-
-	if (katom->event_code == BASE_JD_EVENT_STOPPED) {
-		/* Atom has been promoted to stopped */
-		unsigned long flags;
-
-		mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
-		mutex_unlock(&js_devdata->queue_mutex);
-
-		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-		katom->status = KBASE_JD_ATOM_STATE_IN_JS;
-		kbase_js_unpull(kctx, katom);
-
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-		mutex_unlock(&jctx->lock);
-
-		return;
-	}
-
-	if (katom->event_code != BASE_JD_EVENT_DONE)
-		dev_err(kbdev->dev,
-			"t6xx: GPU fault 0x%02lx from job slot %d\n",
-					(unsigned long)katom->event_code,
-								katom->slot_nr);
-
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8316))
-		kbase_as_poking_timer_release_atom(kbdev, kctx, katom);
-
-	/* Retain state before the katom disappears */
-	kbasep_js_atom_retained_state_copy(&katom_retained_state, katom);
-
-	context_idle = kbase_js_complete_atom_wq(kctx, katom);
-
-	KBASE_DEBUG_ASSERT(kbasep_js_has_atom_finished(&katom_retained_state));
-
-	kbasep_js_remove_job(kbdev, kctx, katom);
-	mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
-	mutex_unlock(&js_devdata->queue_mutex);
-	katom->atom_flags &= ~KBASE_KATOM_FLAG_HOLDING_CTX_REF;
-	/* jd_done_nolock() requires the jsctx_mutex lock to be dropped */
-	jd_done_nolock(katom, &kctx->completed_jobs);
-
-	/* katom may have been freed now, do not use! */
-
-	if (context_idle) {
-		unsigned long flags;
-
-		context_idle = false;
-		mutex_lock(&js_devdata->queue_mutex);
-		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-		/* If kbase_sched() has scheduled this context back in then
-		 * KCTX_ACTIVE will have been set after we marked it as
-		 * inactive, and another pm reference will have been taken, so
-		 * drop our reference. But do not call kbase_jm_idle_ctx(), as
-		 * the context is active and fast-starting is allowed.
-		 *
-		 * If an atom has been fast-started then kctx->atoms_pulled will
-		 * be non-zero but KCTX_ACTIVE will still be false (as the
-		 * previous pm reference has been inherited). Do NOT drop our
-		 * reference, as it has been re-used, and leave the context as
-		 * active.
-		 *
-		 * If no new atoms have been started then KCTX_ACTIVE will still
-		 * be false and atoms_pulled will be zero, so drop the reference
-		 * and call kbase_jm_idle_ctx().
-		 *
-		 * As the checks are done under both the queue_mutex and
-		 * hwaccess_lock is should be impossible for this to race
-		 * with the scheduler code.
-		 */
-		if (kbase_ctx_flag(kctx, KCTX_ACTIVE) ||
-		    !atomic_read(&kctx->atoms_pulled)) {
-			/* Calling kbase_jm_idle_ctx() here will ensure that
-			 * atoms are not fast-started when we drop the
-			 * hwaccess_lock. This is not performed if
-			 * KCTX_ACTIVE is set as in that case another pm
-			 * reference has been taken and a fast-start would be
-			 * valid.
-			 */
-			if (!kbase_ctx_flag(kctx, KCTX_ACTIVE))
-				kbase_jm_idle_ctx(kbdev, kctx);
-			context_idle = true;
-		} else {
-			kbase_ctx_flag_set(kctx, KCTX_ACTIVE);
-		}
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-		mutex_unlock(&js_devdata->queue_mutex);
-	}
-
-	/*
-	 * Transaction complete
-	 */
-	mutex_unlock(&jctx->lock);
-
-	/* Job is now no longer running, so can now safely release the context
-	 * reference, and handle any actions that were logged against the atom's retained state */
-
-	kbasep_js_runpool_release_ctx_and_katom_retained_state(kbdev, kctx, &katom_retained_state);
-
-	kbase_js_sched_all(kbdev);
-
-	if (!atomic_dec_return(&kctx->work_count)) {
-		/* If worker now idle then post all events that jd_done_nolock()
-		 * has queued */
-		mutex_lock(&jctx->lock);
-		while (!list_empty(&kctx->completed_jobs)) {
-			struct kbase_jd_atom *atom = list_entry(
-					kctx->completed_jobs.next,
-					struct kbase_jd_atom, jd_item);
-			list_del(kctx->completed_jobs.next);
-
-			kbase_event_post(kctx, atom);
-		}
-		mutex_unlock(&jctx->lock);
-	}
-
-	kbase_backend_complete_wq_post_sched(kbdev, core_req, affinity,
-			coreref_state);
-
-	if (context_idle)
-		kbase_pm_context_idle(kbdev);
-
-	KBASE_TRACE_ADD(kbdev, JD_DONE_WORKER_END, kctx, NULL, cache_jc, 0);
-}
-
-/**
- * jd_cancel_worker - Work queue job cancel function.
- * @data: a &struct work_struct
- *
- * Only called as part of 'Zapping' a context (which occurs on termination).
- * Operates serially with the kbase_jd_done_worker() on the work queue.
- *
- * This can only be called on contexts that aren't scheduled.
- *
- * We don't need to release most of the resources that would occur on
- * kbase_jd_done() or kbase_jd_done_worker(), because the atoms here must not be
- * running (by virtue of only being called on contexts that aren't
- * scheduled).
- */
-static void jd_cancel_worker(struct work_struct *data)
-{
-	struct kbase_jd_atom *katom = container_of(data, struct kbase_jd_atom, work);
-	struct kbase_jd_context *jctx;
-	struct kbase_context *kctx;
-	struct kbasep_js_kctx_info *js_kctx_info;
-	bool need_to_try_schedule_context;
-	bool attr_state_changed;
-	struct kbase_device *kbdev;
-
-	/* Soft jobs should never reach this function */
-	KBASE_DEBUG_ASSERT((katom->core_req & BASE_JD_REQ_SOFT_JOB) == 0);
-
-	kctx = katom->kctx;
-	kbdev = kctx->kbdev;
-	jctx = &kctx->jctx;
-	js_kctx_info = &kctx->jctx.sched_info;
-
-	KBASE_TRACE_ADD(kbdev, JD_CANCEL_WORKER, kctx, katom, katom->jc, 0);
-
-	/* This only gets called on contexts that are scheduled out. Hence, we must
-	 * make sure we don't de-ref the number of running jobs (there aren't
-	 * any), nor must we try to schedule out the context (it's already
-	 * scheduled out).
-	 */
-	KBASE_DEBUG_ASSERT(!kbase_ctx_flag(kctx, KCTX_SCHEDULED));
-
-	/* Scheduler: Remove the job from the system */
-	mutex_lock(&js_kctx_info->ctx.jsctx_mutex);
-	attr_state_changed = kbasep_js_remove_cancelled_job(kbdev, kctx, katom);
-	mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
-
-	mutex_lock(&jctx->lock);
-
-	need_to_try_schedule_context = jd_done_nolock(katom, NULL);
-	/* Because we're zapping, we're not adding any more jobs to this ctx, so no need to
-	 * schedule the context. There's also no need for the jsctx_mutex to have been taken
-	 * around this too. */
-	KBASE_DEBUG_ASSERT(!need_to_try_schedule_context);
-
-	/* katom may have been freed now, do not use! */
-	mutex_unlock(&jctx->lock);
-
-	if (attr_state_changed)
-		kbase_js_sched_all(kbdev);
-}
-
-/**
- * kbase_jd_done - Complete a job that has been removed from the Hardware
- * @katom: atom which has been completed
- * @slot_nr: slot the atom was on
- * @end_timestamp: completion time
- * @done_code: completion code
- *
- * This must be used whenever a job has been removed from the Hardware, e.g.:
- * An IRQ indicates that the job finished (for both error and 'done' codes), or
- * the job was evicted from the JS_HEAD_NEXT registers during a Soft/Hard stop.
- *
- * Some work is carried out immediately, and the rest is deferred onto a
- * workqueue
- *
- * Context:
- *   This can be called safely from atomic context.
- *   The caller must hold kbdev->hwaccess_lock
- */
-void kbase_jd_done(struct kbase_jd_atom *katom, int slot_nr,
-		ktime_t *end_timestamp, kbasep_js_atom_done_code done_code)
-{
-	struct kbase_context *kctx;
-	struct kbase_device *kbdev;
-
-	KBASE_DEBUG_ASSERT(katom);
-	kctx = katom->kctx;
-	KBASE_DEBUG_ASSERT(kctx);
-	kbdev = kctx->kbdev;
-	KBASE_DEBUG_ASSERT(kbdev);
-
-	if (done_code & KBASE_JS_ATOM_DONE_EVICTED_FROM_NEXT)
-		katom->event_code = BASE_JD_EVENT_REMOVED_FROM_NEXT;
-
-	KBASE_TRACE_ADD(kbdev, JD_DONE, kctx, katom, katom->jc, 0);
-
-	kbase_job_check_leave_disjoint(kbdev, katom);
-
-	katom->slot_nr = slot_nr;
-
-	atomic_inc(&kctx->work_count);
-
-#ifdef CONFIG_DEBUG_FS
-	/* a failed job happened and is waiting for dumping*/
-	if (!katom->will_fail_event_code &&
-			kbase_debug_job_fault_process(katom, katom->event_code))
-		return;
-#endif
-
-	WARN_ON(work_pending(&katom->work));
-	KBASE_DEBUG_ASSERT(0 == object_is_on_stack(&katom->work));
-	INIT_WORK(&katom->work, kbase_jd_done_worker);
-	queue_work(kctx->jctx.job_done_wq, &katom->work);
-}
-
-KBASE_EXPORT_TEST_API(kbase_jd_done);
-
-void kbase_jd_cancel(struct kbase_device *kbdev, struct kbase_jd_atom *katom)
-{
-	struct kbase_context *kctx;
-
-	KBASE_DEBUG_ASSERT(NULL != kbdev);
-	KBASE_DEBUG_ASSERT(NULL != katom);
-	kctx = katom->kctx;
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-
-	KBASE_TRACE_ADD(kbdev, JD_CANCEL, kctx, katom, katom->jc, 0);
-
-	/* This should only be done from a context that is not scheduled */
-	KBASE_DEBUG_ASSERT(!kbase_ctx_flag(kctx, KCTX_SCHEDULED));
-
-	WARN_ON(work_pending(&katom->work));
-
-	katom->event_code = BASE_JD_EVENT_JOB_CANCELLED;
-
-	KBASE_DEBUG_ASSERT(0 == object_is_on_stack(&katom->work));
-	INIT_WORK(&katom->work, jd_cancel_worker);
-	queue_work(kctx->jctx.job_done_wq, &katom->work);
-}
-
-
-void kbase_jd_zap_context(struct kbase_context *kctx)
-{
-	struct kbase_jd_atom *katom;
-	struct list_head *entry, *tmp;
-	struct kbase_device *kbdev;
-
-	KBASE_DEBUG_ASSERT(kctx);
-
-	kbdev = kctx->kbdev;
-
-	KBASE_TRACE_ADD(kbdev, JD_ZAP_CONTEXT, kctx, NULL, 0u, 0u);
-
-	kbase_js_zap_context(kctx);
-
-	mutex_lock(&kctx->jctx.lock);
-
-	/*
-	 * While holding the struct kbase_jd_context lock clean up jobs which are known to kbase but are
-	 * queued outside the job scheduler.
-	 */
-
-	del_timer_sync(&kctx->soft_job_timeout);
-	list_for_each_safe(entry, tmp, &kctx->waiting_soft_jobs) {
-		katom = list_entry(entry, struct kbase_jd_atom, queue);
-		kbase_cancel_soft_job(katom);
-	}
-
-
-#ifdef CONFIG_KDS
-
-	/* For each job waiting on a kds resource, cancel the wait and force the job to
-	 * complete early, this is done so that we don't leave jobs outstanding waiting
-	 * on kds resources which may never be released when contexts are zapped, resulting
-	 * in a hang.
-	 *
-	 * Note that we can safely iterate over the list as the struct kbase_jd_context lock is held,
-	 * this prevents items being removed when calling job_done_nolock in kbase_cancel_kds_wait_job.
-	 */
-
-	list_for_each(entry, &kctx->waiting_kds_resource) {
-		katom = list_entry(entry, struct kbase_jd_atom, node);
-
-		kbase_cancel_kds_wait_job(katom);
-	}
-#endif
-
-#ifdef CONFIG_MALI_BIFROST_DMA_FENCE
-	kbase_dma_fence_cancel_all_atoms(kctx);
-#endif
-
-	mutex_unlock(&kctx->jctx.lock);
-
-#ifdef CONFIG_MALI_BIFROST_DMA_FENCE
-	/* Flush dma-fence workqueue to ensure that any callbacks that may have
-	 * been queued are done before continuing.
-	 */
-	flush_workqueue(kctx->dma_fence.wq);
-#endif
-
-	kbase_jm_wait_for_zero_jobs(kctx);
-}
-
-KBASE_EXPORT_TEST_API(kbase_jd_zap_context);
-
-int kbase_jd_init(struct kbase_context *kctx)
-{
-	int i;
-	int mali_err = 0;
-#ifdef CONFIG_KDS
-	int err;
-#endif				/* CONFIG_KDS */
-
-	KBASE_DEBUG_ASSERT(kctx);
-
-	kctx->jctx.job_done_wq = alloc_workqueue("mali_jd",
-			WQ_HIGHPRI | WQ_UNBOUND, 1);
-	if (NULL == kctx->jctx.job_done_wq) {
-		mali_err = -ENOMEM;
-		goto out1;
-	}
-
-	for (i = 0; i < BASE_JD_ATOM_COUNT; i++) {
-		init_waitqueue_head(&kctx->jctx.atoms[i].completed);
-
-		INIT_LIST_HEAD(&kctx->jctx.atoms[i].dep_head[0]);
-		INIT_LIST_HEAD(&kctx->jctx.atoms[i].dep_head[1]);
-
-		/* Catch userspace attempting to use an atom which doesn't exist as a pre-dependency */
-		kctx->jctx.atoms[i].event_code = BASE_JD_EVENT_JOB_INVALID;
-		kctx->jctx.atoms[i].status = KBASE_JD_ATOM_STATE_UNUSED;
-
-#if defined(CONFIG_MALI_BIFROST_DMA_FENCE) || defined(CONFIG_SYNC_FILE)
-		kctx->jctx.atoms[i].dma_fence.context =
-						dma_fence_context_alloc(1);
-		atomic_set(&kctx->jctx.atoms[i].dma_fence.seqno, 0);
-		INIT_LIST_HEAD(&kctx->jctx.atoms[i].dma_fence.callbacks);
-#endif
-	}
-
-	mutex_init(&kctx->jctx.lock);
-
-	init_waitqueue_head(&kctx->jctx.zero_jobs_wait);
-
-	spin_lock_init(&kctx->jctx.tb_lock);
-
-#ifdef CONFIG_KDS
-	err = kds_callback_init(&kctx->jctx.kds_cb, 0, kds_dep_clear);
-	if (0 != err) {
-		mali_err = -EINVAL;
-		goto out2;
-	}
-#endif				/* CONFIG_KDS */
-
-	kctx->jctx.job_nr = 0;
-	INIT_LIST_HEAD(&kctx->completed_jobs);
-	atomic_set(&kctx->work_count, 0);
-
-	return 0;
-
-#ifdef CONFIG_KDS
- out2:
-	destroy_workqueue(kctx->jctx.job_done_wq);
-#endif				/* CONFIG_KDS */
- out1:
-	return mali_err;
-}
-
-KBASE_EXPORT_TEST_API(kbase_jd_init);
-
-void kbase_jd_exit(struct kbase_context *kctx)
-{
-	KBASE_DEBUG_ASSERT(kctx);
-
-#ifdef CONFIG_KDS
-	kds_callback_term(&kctx->jctx.kds_cb);
-#endif				/* CONFIG_KDS */
-	/* Work queue is emptied by this */
-	destroy_workqueue(kctx->jctx.job_done_wq);
-}
-
-KBASE_EXPORT_TEST_API(kbase_jd_exit);
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jd_debugfs.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jd_debugfs.c
deleted file mode 100644
index fed4ad5816ab..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jd_debugfs.c
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifdef CONFIG_DEBUG_FS
-
-#include <linux/seq_file.h>
-#include <mali_kbase.h>
-#include <mali_kbase_jd_debugfs.h>
-#include <mali_kbase_dma_fence.h>
-#if defined(CONFIG_SYNC) || defined(CONFIG_SYNC_FILE)
-#include <mali_kbase_sync.h>
-#endif
-
-struct kbase_jd_debugfs_depinfo {
-	u8 id;
-	char type;
-};
-
-static void kbase_jd_debugfs_fence_info(struct kbase_jd_atom *atom,
-					struct seq_file *sfile)
-{
-#if defined(CONFIG_SYNC) || defined(CONFIG_SYNC_FILE)
-	struct kbase_sync_fence_info info;
-	int res;
-
-	switch (atom->core_req & BASE_JD_REQ_SOFT_JOB_TYPE) {
-	case BASE_JD_REQ_SOFT_FENCE_TRIGGER:
-		res = kbase_sync_fence_out_info_get(atom, &info);
-		if (0 == res) {
-			seq_printf(sfile, "Sa([%p]%d) ",
-				   info.fence, info.status);
-			break;
-		}
-	case BASE_JD_REQ_SOFT_FENCE_WAIT:
-		res = kbase_sync_fence_in_info_get(atom, &info);
-		if (0 == res) {
-			seq_printf(sfile, "Wa([%p]%d) ",
-				   info.fence, info.status);
-			break;
-		}
-	default:
-		break;
-	}
-#endif /* CONFIG_SYNC || CONFIG_SYNC_FILE */
-
-#ifdef CONFIG_MALI_BIFROST_DMA_FENCE
-	if (atom->core_req & BASE_JD_REQ_EXTERNAL_RESOURCES) {
-		struct kbase_fence_cb *cb;
-
-		if (atom->dma_fence.fence) {
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-			struct fence *fence = atom->dma_fence.fence;
-#else
-			struct dma_fence *fence = atom->dma_fence.fence;
-#endif
-
-			seq_printf(sfile,
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 8, 0))
-					"Sd(%u#%u: %s) ",
-#else
-					"Sd(%llu#%u: %s) ",
-#endif
-					fence->context,
-					fence->seqno,
-					dma_fence_is_signaled(fence) ?
-						"signaled" : "active");
-		}
-
-		list_for_each_entry(cb, &atom->dma_fence.callbacks,
-				    node) {
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-			struct fence *fence = cb->fence;
-#else
-			struct dma_fence *fence = cb->fence;
-#endif
-
-			seq_printf(sfile,
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 8, 0))
-					"Wd(%u#%u: %s) ",
-#else
-					"Wd(%llu#%u: %s) ",
-#endif
-					fence->context,
-					fence->seqno,
-					dma_fence_is_signaled(fence) ?
-						"signaled" : "active");
-		}
-	}
-#endif /* CONFIG_MALI_BIFROST_DMA_FENCE */
-
-}
-
-static void kbasep_jd_debugfs_atom_deps(
-		struct kbase_jd_debugfs_depinfo *deps,
-		struct kbase_jd_atom *atom)
-{
-	struct kbase_context *kctx = atom->kctx;
-	int i;
-
-	for (i = 0; i < 2; i++)	{
-		deps[i].id = (unsigned)(atom->dep[i].atom ?
-				kbase_jd_atom_id(kctx, atom->dep[i].atom) : 0);
-
-		switch (atom->dep[i].dep_type) {
-		case BASE_JD_DEP_TYPE_INVALID:
-			deps[i].type = ' ';
-			break;
-		case BASE_JD_DEP_TYPE_DATA:
-			deps[i].type = 'D';
-			break;
-		case BASE_JD_DEP_TYPE_ORDER:
-			deps[i].type = '>';
-			break;
-		default:
-			deps[i].type = '?';
-			break;
-		}
-	}
-}
-/**
- * kbasep_jd_debugfs_atoms_show - Show callback for the JD atoms debugfs file.
- * @sfile: The debugfs entry
- * @data:  Data associated with the entry
- *
- * This function is called to get the contents of the JD atoms debugfs file.
- * This is a report of all atoms managed by kbase_jd_context.atoms
- *
- * Return: 0 if successfully prints data in debugfs entry file, failure
- * otherwise
- */
-static int kbasep_jd_debugfs_atoms_show(struct seq_file *sfile, void *data)
-{
-	struct kbase_context *kctx = sfile->private;
-	struct kbase_jd_atom *atoms;
-	unsigned long irq_flags;
-	int i;
-
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-
-	/* Print version */
-	seq_printf(sfile, "v%u\n", MALI_JD_DEBUGFS_VERSION);
-
-	/* Print U/K API version */
-	seq_printf(sfile, "ukv%u.%u\n", BASE_UK_VERSION_MAJOR,
-			BASE_UK_VERSION_MINOR);
-
-	/* Print table heading */
-	seq_puts(sfile, " ID, Core req, St, CR,   Predeps,           Start time, Additional info...\n");
-
-	atoms = kctx->jctx.atoms;
-	/* General atom states */
-	mutex_lock(&kctx->jctx.lock);
-	/* JS-related states */
-	spin_lock_irqsave(&kctx->kbdev->hwaccess_lock, irq_flags);
-	for (i = 0; i != BASE_JD_ATOM_COUNT; ++i) {
-		struct kbase_jd_atom *atom = &atoms[i];
-		s64 start_timestamp = 0;
-		struct kbase_jd_debugfs_depinfo deps[2];
-
-		if (atom->status == KBASE_JD_ATOM_STATE_UNUSED)
-			continue;
-
-		/* start_timestamp is cleared as soon as the atom leaves UNUSED state
-		 * and set before a job is submitted to the h/w, a non-zero value means
-		 * it is valid */
-		if (ktime_to_ns(atom->start_timestamp))
-			start_timestamp = ktime_to_ns(
-					ktime_sub(ktime_get(), atom->start_timestamp));
-
-		kbasep_jd_debugfs_atom_deps(deps, atom);
-
-		seq_printf(sfile,
-				"%3u, %8x, %2u, %2u, %c%3u %c%3u, %20lld, ",
-				i, atom->core_req, atom->status,
-				atom->coreref_state,
-				deps[0].type, deps[0].id,
-				deps[1].type, deps[1].id,
-				start_timestamp);
-
-
-		kbase_jd_debugfs_fence_info(atom, sfile);
-
-		seq_puts(sfile, "\n");
-	}
-	spin_unlock_irqrestore(&kctx->kbdev->hwaccess_lock, irq_flags);
-	mutex_unlock(&kctx->jctx.lock);
-
-	return 0;
-}
-
-
-/**
- * kbasep_jd_debugfs_atoms_open - open operation for atom debugfs file
- * @in: &struct inode pointer
- * @file: &struct file pointer
- *
- * Return: file descriptor
- */
-static int kbasep_jd_debugfs_atoms_open(struct inode *in, struct file *file)
-{
-	return single_open(file, kbasep_jd_debugfs_atoms_show, in->i_private);
-}
-
-static const struct file_operations kbasep_jd_debugfs_atoms_fops = {
-	.open = kbasep_jd_debugfs_atoms_open,
-	.read = seq_read,
-	.llseek = seq_lseek,
-	.release = single_release,
-};
-
-void kbasep_jd_debugfs_ctx_init(struct kbase_context *kctx)
-{
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-
-	/* Expose all atoms */
-	debugfs_create_file("atoms", S_IRUGO, kctx->kctx_dentry, kctx,
-			&kbasep_jd_debugfs_atoms_fops);
-
-}
-
-#endif /* CONFIG_DEBUG_FS */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jd_debugfs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jd_debugfs.h
deleted file mode 100644
index fae32919b22f..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jd_debugfs.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/**
- * @file mali_kbase_jd_debugfs.h
- * Header file for job dispatcher-related entries in debugfs
- */
-
-#ifndef _KBASE_JD_DEBUGFS_H
-#define _KBASE_JD_DEBUGFS_H
-
-#include <linux/debugfs.h>
-
-#define MALI_JD_DEBUGFS_VERSION 2
-
-/* Forward declarations */
-struct kbase_context;
-
-/**
- * kbasep_jd_debugfs_ctx_init() - Add debugfs entries for JD system
- *
- * @kctx Pointer to kbase_context
- */
-void kbasep_jd_debugfs_ctx_init(struct kbase_context *kctx);
-
-#endif  /*_KBASE_JD_DEBUGFS_H*/
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jm.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jm.c
deleted file mode 100644
index 0c5c6a6f78cb..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jm.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-/*
- * HW access job manager common APIs
- */
-
-#include <mali_kbase.h>
-#include "mali_kbase_hwaccess_jm.h"
-#include "mali_kbase_jm.h"
-
-/**
- * kbase_jm_next_job() - Attempt to run the next @nr_jobs_to_submit jobs on slot
- *			 @js on the active context.
- * @kbdev:		Device pointer
- * @js:			Job slot to run on
- * @nr_jobs_to_submit:	Number of jobs to attempt to submit
- *
- * Return: true if slot can still be submitted on, false if slot is now full.
- */
-static bool kbase_jm_next_job(struct kbase_device *kbdev, int js,
-				int nr_jobs_to_submit)
-{
-	struct kbase_context *kctx;
-	int i;
-
-	kctx = kbdev->hwaccess.active_kctx;
-
-	if (!kctx)
-		return true;
-
-	for (i = 0; i < nr_jobs_to_submit; i++) {
-		struct kbase_jd_atom *katom = kbase_js_pull(kctx, js);
-
-		if (!katom)
-			return true; /* Context has no jobs on this slot */
-
-		kbase_backend_run_atom(kbdev, katom);
-	}
-
-	return false; /* Slot ringbuffer should now be full */
-}
-
-u32 kbase_jm_kick(struct kbase_device *kbdev, u32 js_mask)
-{
-	u32 ret_mask = 0;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	while (js_mask) {
-		int js = ffs(js_mask) - 1;
-		int nr_jobs_to_submit = kbase_backend_slot_free(kbdev, js);
-
-		if (kbase_jm_next_job(kbdev, js, nr_jobs_to_submit))
-			ret_mask |= (1 << js);
-
-		js_mask &= ~(1 << js);
-	}
-
-	return ret_mask;
-}
-
-void kbase_jm_try_kick(struct kbase_device *kbdev, u32 js_mask)
-{
-	struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	if (!down_trylock(&js_devdata->schedule_sem)) {
-		kbase_jm_kick(kbdev, js_mask);
-		up(&js_devdata->schedule_sem);
-	}
-}
-
-void kbase_jm_try_kick_all(struct kbase_device *kbdev)
-{
-	struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	if (!down_trylock(&js_devdata->schedule_sem)) {
-		kbase_jm_kick_all(kbdev);
-		up(&js_devdata->schedule_sem);
-	}
-}
-
-void kbase_jm_idle_ctx(struct kbase_device *kbdev, struct kbase_context *kctx)
-{
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	if (kbdev->hwaccess.active_kctx == kctx)
-		kbdev->hwaccess.active_kctx = NULL;
-}
-
-struct kbase_jd_atom *kbase_jm_return_atom_to_js(struct kbase_device *kbdev,
-				struct kbase_jd_atom *katom)
-{
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	if (katom->event_code != BASE_JD_EVENT_STOPPED &&
-			katom->event_code != BASE_JD_EVENT_REMOVED_FROM_NEXT) {
-		return kbase_js_complete_atom(katom, NULL);
-	} else {
-		kbase_js_unpull(katom->kctx, katom);
-		return NULL;
-	}
-}
-
-struct kbase_jd_atom *kbase_jm_complete(struct kbase_device *kbdev,
-		struct kbase_jd_atom *katom, ktime_t *end_timestamp)
-{
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	return kbase_js_complete_atom(katom, end_timestamp);
-}
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jm.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jm.h
deleted file mode 100644
index a74ee24c8058..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_jm.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014, 2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-/*
- * Job manager common APIs
- */
-
-#ifndef _KBASE_JM_H_
-#define _KBASE_JM_H_
-
-/**
- * kbase_jm_kick() - Indicate that there are jobs ready to run.
- * @kbdev:	Device pointer
- * @js_mask:	Mask of the job slots that can be pulled from.
- *
- * Caller must hold the hwaccess_lock and schedule_sem semaphore
- *
- * Return: Mask of the job slots that can still be submitted to.
- */
-u32 kbase_jm_kick(struct kbase_device *kbdev, u32 js_mask);
-
-/**
- * kbase_jm_kick_all() - Indicate that there are jobs ready to run on all job
- *			 slots.
- * @kbdev:	Device pointer
- *
- * Caller must hold the hwaccess_lock and schedule_sem semaphore
- *
- * Return: Mask of the job slots that can still be submitted to.
- */
-static inline u32 kbase_jm_kick_all(struct kbase_device *kbdev)
-{
-	return kbase_jm_kick(kbdev, (1 << kbdev->gpu_props.num_job_slots) - 1);
-}
-
-/**
- * kbase_jm_try_kick - Attempt to call kbase_jm_kick
- * @kbdev:   Device pointer
- * @js_mask: Mask of the job slots that can be pulled from
- * Context: Caller must hold hwaccess_lock
- *
- * If schedule_sem can be immediately obtained then this function will call
- * kbase_jm_kick() otherwise it will do nothing.
- */
-void kbase_jm_try_kick(struct kbase_device *kbdev, u32 js_mask);
-
-/**
- * kbase_jm_try_kick_all() - Attempt to call kbase_jm_kick_all
- * @kbdev:  Device pointer
- * Context: Caller must hold hwaccess_lock
- *
- * If schedule_sem can be immediately obtained then this function will call
- * kbase_jm_kick_all() otherwise it will do nothing.
- */
-void kbase_jm_try_kick_all(struct kbase_device *kbdev);
-
-/**
- * kbase_jm_idle_ctx() - Mark a context as idle.
- * @kbdev:	Device pointer
- * @kctx:	Context to mark as idle
- *
- * No more atoms will be pulled from this context until it is marked as active
- * by kbase_js_use_ctx().
- *
- * The context should have no atoms currently pulled from it
- * (kctx->atoms_pulled == 0).
- *
- * Caller must hold the hwaccess_lock
- */
-void kbase_jm_idle_ctx(struct kbase_device *kbdev, struct kbase_context *kctx);
-
-/**
- * kbase_jm_return_atom_to_js() - Return an atom to the job scheduler that has
- *				  been soft-stopped or will fail due to a
- *				  dependency
- * @kbdev:	Device pointer
- * @katom:	Atom that has been stopped or will be failed
- *
- * Return: Atom that has now been unblocked and can now be run, or NULL if none
- */
-struct kbase_jd_atom *kbase_jm_return_atom_to_js(struct kbase_device *kbdev,
-			struct kbase_jd_atom *katom);
-
-/**
- * kbase_jm_complete() - Complete an atom
- * @kbdev:		Device pointer
- * @katom:		Atom that has completed
- * @end_timestamp:	Timestamp of atom completion
- *
- * Return: Atom that has now been unblocked and can now be run, or NULL if none
- */
-struct kbase_jd_atom *kbase_jm_complete(struct kbase_device *kbdev,
-		struct kbase_jd_atom *katom, ktime_t *end_timestamp);
-
-#endif /* _KBASE_JM_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js.c
deleted file mode 100644
index 677e438aedfa..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js.c
+++ /dev/null
@@ -1,2798 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/*
- * Job Scheduler Implementation
- */
-#include <mali_kbase.h>
-#include <mali_kbase_js.h>
-#if defined(CONFIG_MALI_BIFROST_GATOR_SUPPORT)
-#include <mali_kbase_gator.h>
-#endif
-#include <mali_kbase_tlstream.h>
-#include <mali_kbase_hw.h>
-#include <mali_kbase_ctx_sched.h>
-
-#include <mali_kbase_defs.h>
-#include <mali_kbase_config_defaults.h>
-
-#include "mali_kbase_jm.h"
-#include "mali_kbase_hwaccess_jm.h"
-
-/*
- * Private types
- */
-
-/* Bitpattern indicating the result of releasing a context */
-enum {
-	/* The context was descheduled - caller should try scheduling in a new
-	 * one to keep the runpool full */
-	KBASEP_JS_RELEASE_RESULT_WAS_DESCHEDULED = (1u << 0),
-	/* Ctx attributes were changed - caller should try scheduling all
-	 * contexts */
-	KBASEP_JS_RELEASE_RESULT_SCHED_ALL = (1u << 1)
-};
-
-typedef u32 kbasep_js_release_result;
-
-const int kbasep_js_atom_priority_to_relative[BASE_JD_NR_PRIO_LEVELS] = {
-	KBASE_JS_ATOM_SCHED_PRIO_MED, /* BASE_JD_PRIO_MEDIUM */
-	KBASE_JS_ATOM_SCHED_PRIO_HIGH, /* BASE_JD_PRIO_HIGH */
-	KBASE_JS_ATOM_SCHED_PRIO_LOW  /* BASE_JD_PRIO_LOW */
-};
-
-const base_jd_prio
-kbasep_js_relative_priority_to_atom[KBASE_JS_ATOM_SCHED_PRIO_COUNT] = {
-	BASE_JD_PRIO_HIGH,   /* KBASE_JS_ATOM_SCHED_PRIO_HIGH */
-	BASE_JD_PRIO_MEDIUM, /* KBASE_JS_ATOM_SCHED_PRIO_MED */
-	BASE_JD_PRIO_LOW     /* KBASE_JS_ATOM_SCHED_PRIO_LOW */
-};
-
-
-/*
- * Private function prototypes
- */
-static kbasep_js_release_result kbasep_js_runpool_release_ctx_internal(
-		struct kbase_device *kbdev, struct kbase_context *kctx,
-		struct kbasep_js_atom_retained_state *katom_retained_state);
-
-static int kbase_js_get_slot(struct kbase_device *kbdev,
-				struct kbase_jd_atom *katom);
-
-static void kbase_js_foreach_ctx_job(struct kbase_context *kctx,
-		kbasep_js_ctx_job_cb callback);
-
-/* Helper for trace subcodes */
-#if KBASE_TRACE_ENABLE
-static int kbasep_js_trace_get_refcnt(struct kbase_device *kbdev,
-		struct kbase_context *kctx)
-{
-	return atomic_read(&kctx->refcount);
-}
-#else				/* KBASE_TRACE_ENABLE  */
-static int kbasep_js_trace_get_refcnt(struct kbase_device *kbdev,
-		struct kbase_context *kctx)
-{
-	CSTD_UNUSED(kbdev);
-	CSTD_UNUSED(kctx);
-	return 0;
-}
-#endif				/* KBASE_TRACE_ENABLE  */
-
-/*
- * Private functions
- */
-
-/**
- * core_reqs_from_jsn_features - Convert JSn_FEATURES to core requirements
- * @features: JSn_FEATURE register value
- *
- * Given a JSn_FEATURE register value returns the core requirements that match
- *
- * Return: Core requirement bit mask
- */
-static base_jd_core_req core_reqs_from_jsn_features(u16 features)
-{
-	base_jd_core_req core_req = 0u;
-
-	if ((features & JS_FEATURE_SET_VALUE_JOB) != 0)
-		core_req |= BASE_JD_REQ_V;
-
-	if ((features & JS_FEATURE_CACHE_FLUSH_JOB) != 0)
-		core_req |= BASE_JD_REQ_CF;
-
-	if ((features & JS_FEATURE_COMPUTE_JOB) != 0)
-		core_req |= BASE_JD_REQ_CS;
-
-	if ((features & JS_FEATURE_TILER_JOB) != 0)
-		core_req |= BASE_JD_REQ_T;
-
-	if ((features & JS_FEATURE_FRAGMENT_JOB) != 0)
-		core_req |= BASE_JD_REQ_FS;
-
-	return core_req;
-}
-
-static void kbase_js_sync_timers(struct kbase_device *kbdev)
-{
-	mutex_lock(&kbdev->js_data.runpool_mutex);
-	kbase_backend_ctx_count_changed(kbdev);
-	mutex_unlock(&kbdev->js_data.runpool_mutex);
-}
-
-/* Hold the mmu_hw_mutex and hwaccess_lock for this */
-bool kbasep_js_runpool_retain_ctx_nolock(struct kbase_device *kbdev,
-		struct kbase_context *kctx)
-{
-	struct kbasep_js_device_data *js_devdata;
-	bool result = false;
-	int as_nr;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	js_devdata = &kbdev->js_data;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	as_nr = kctx->as_nr;
-	if (atomic_read(&kctx->refcount) > 0) {
-		KBASE_DEBUG_ASSERT(as_nr >= 0);
-
-		kbase_ctx_sched_retain_ctx_refcount(kctx);
-		KBASE_TRACE_ADD_REFCOUNT(kbdev, JS_RETAIN_CTX_NOLOCK, kctx,
-				NULL, 0u, atomic_read(&kctx->refcount));
-		result = true;
-	}
-
-	return result;
-}
-
-/**
- * jsctx_rb_none_to_pull_prio(): - Check if there are no pullable atoms
- * @kctx: Pointer to kbase context with ring buffer.
- * @js:   Job slot id to check.
- * @prio: Priority to check.
- *
- * Return true if there are no atoms to pull. There may be running atoms in the
- * ring buffer even if there are no atoms to pull. It is also possible for the
- * ring buffer to be full (with running atoms) when this functions returns
- * true.
- *
- * Return: true if there are no atoms to pull, false otherwise.
- */
-static inline bool
-jsctx_rb_none_to_pull_prio(struct kbase_context *kctx, int js, int prio)
-{
-	struct jsctx_queue *rb = &kctx->jsctx_queue[prio][js];
-
-	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
-
-	return RB_EMPTY_ROOT(&rb->runnable_tree);
-}
-
-/**
- * jsctx_rb_none_to_pull(): - Check if all priority ring buffers have no
- * pullable atoms
- * @kctx: Pointer to kbase context with ring buffer.
- * @js:   Job slot id to check.
- *
- * Caller must hold hwaccess_lock
- *
- * Return: true if the ring buffers for all priorities have no pullable atoms,
- *	   false otherwise.
- */
-static inline bool
-jsctx_rb_none_to_pull(struct kbase_context *kctx, int js)
-{
-	int prio;
-
-	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
-
-	for (prio = 0; prio < KBASE_JS_ATOM_SCHED_PRIO_COUNT; prio++) {
-		if (!jsctx_rb_none_to_pull_prio(kctx, js, prio))
-			return false;
-	}
-
-	return true;
-}
-
-/**
- * jsctx_queue_foreach_prio(): - Execute callback for each entry in the queue.
- * @kctx:     Pointer to kbase context with the queue.
- * @js:       Job slot id to iterate.
- * @prio:     Priority id to iterate.
- * @callback: Function pointer to callback.
- *
- * Iterate over a queue and invoke @callback for each entry in the queue, and
- * remove the entry from the queue.
- *
- * If entries are added to the queue while this is running those entries may, or
- * may not be covered. To ensure that all entries in the buffer have been
- * enumerated when this function returns jsctx->lock must be held when calling
- * this function.
- *
- * The HW access lock must always be held when calling this function.
- */
-static void
-jsctx_queue_foreach_prio(struct kbase_context *kctx, int js, int prio,
-		kbasep_js_ctx_job_cb callback)
-{
-	struct jsctx_queue *queue = &kctx->jsctx_queue[prio][js];
-
-	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
-
-	while (!RB_EMPTY_ROOT(&queue->runnable_tree)) {
-		struct rb_node *node = rb_first(&queue->runnable_tree);
-		struct kbase_jd_atom *entry = rb_entry(node,
-				struct kbase_jd_atom, runnable_tree_node);
-
-		rb_erase(node, &queue->runnable_tree);
-		callback(kctx->kbdev, entry);
-	}
-
-	while (!list_empty(&queue->x_dep_head)) {
-		struct kbase_jd_atom *entry = list_entry(queue->x_dep_head.next,
-				struct kbase_jd_atom, queue);
-
-		list_del(queue->x_dep_head.next);
-
-		callback(kctx->kbdev, entry);
-	}
-}
-
-/**
- * jsctx_queue_foreach(): - Execute callback for each entry in every queue
- * @kctx:     Pointer to kbase context with queue.
- * @js:       Job slot id to iterate.
- * @callback: Function pointer to callback.
- *
- * Iterate over all the different priorities, and for each call
- * jsctx_queue_foreach_prio() to iterate over the queue and invoke @callback
- * for each entry, and remove the entry from the queue.
- */
-static inline void
-jsctx_queue_foreach(struct kbase_context *kctx, int js,
-		kbasep_js_ctx_job_cb callback)
-{
-	int prio;
-
-	for (prio = 0; prio < KBASE_JS_ATOM_SCHED_PRIO_COUNT; prio++)
-		jsctx_queue_foreach_prio(kctx, js, prio, callback);
-}
-
-/**
- * jsctx_rb_peek_prio(): - Check buffer and get next atom
- * @kctx: Pointer to kbase context with ring buffer.
- * @js:   Job slot id to check.
- * @prio: Priority id to check.
- *
- * Check the ring buffer for the specified @js and @prio and return a pointer to
- * the next atom, unless the ring buffer is empty.
- *
- * Return: Pointer to next atom in buffer, or NULL if there is no atom.
- */
-static inline struct kbase_jd_atom *
-jsctx_rb_peek_prio(struct kbase_context *kctx, int js, int prio)
-{
-	struct jsctx_queue *rb = &kctx->jsctx_queue[prio][js];
-	struct rb_node *node;
-
-	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
-
-	node = rb_first(&rb->runnable_tree);
-	if (!node)
-		return NULL;
-
-	return rb_entry(node, struct kbase_jd_atom, runnable_tree_node);
-}
-
-/**
- * jsctx_rb_peek(): - Check all priority buffers and get next atom
- * @kctx: Pointer to kbase context with ring buffer.
- * @js:   Job slot id to check.
- *
- * Check the ring buffers for all priorities, starting from
- * KBASE_JS_ATOM_SCHED_PRIO_HIGH, for the specified @js and @prio and return a
- * pointer to the next atom, unless all the priority's ring buffers are empty.
- *
- * Caller must hold the hwaccess_lock.
- *
- * Return: Pointer to next atom in buffer, or NULL if there is no atom.
- */
-static inline struct kbase_jd_atom *
-jsctx_rb_peek(struct kbase_context *kctx, int js)
-{
-	int prio;
-
-	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
-
-	for (prio = 0; prio < KBASE_JS_ATOM_SCHED_PRIO_COUNT; prio++) {
-		struct kbase_jd_atom *katom;
-
-		katom = jsctx_rb_peek_prio(kctx, js, prio);
-		if (katom)
-			return katom;
-	}
-
-	return NULL;
-}
-
-/**
- * jsctx_rb_pull(): - Mark atom in list as running
- * @kctx:  Pointer to kbase context with ring buffer.
- * @katom: Pointer to katom to pull.
- *
- * Mark an atom previously obtained from jsctx_rb_peek() as running.
- *
- * @katom must currently be at the head of the ring buffer.
- */
-static inline void
-jsctx_rb_pull(struct kbase_context *kctx, struct kbase_jd_atom *katom)
-{
-	int prio = katom->sched_priority;
-	int js = katom->slot_nr;
-	struct jsctx_queue *rb = &kctx->jsctx_queue[prio][js];
-
-	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
-
-	/* Atoms must be pulled in the correct order. */
-	WARN_ON(katom != jsctx_rb_peek_prio(kctx, js, prio));
-
-	rb_erase(&katom->runnable_tree_node, &rb->runnable_tree);
-}
-
-#define LESS_THAN_WRAP(a, b) ((s32)(a - b) < 0)
-
-static void
-jsctx_tree_add(struct kbase_context *kctx, struct kbase_jd_atom *katom)
-{
-	int prio = katom->sched_priority;
-	int js = katom->slot_nr;
-	struct jsctx_queue *queue = &kctx->jsctx_queue[prio][js];
-	struct rb_node **new = &(queue->runnable_tree.rb_node), *parent = NULL;
-
-	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
-
-	while (*new) {
-		struct kbase_jd_atom *entry = container_of(*new,
-				struct kbase_jd_atom, runnable_tree_node);
-
-		parent = *new;
-		if (LESS_THAN_WRAP(katom->age, entry->age))
-			new = &((*new)->rb_left);
-		else
-			new = &((*new)->rb_right);
-	}
-
-	/* Add new node and rebalance tree. */
-	rb_link_node(&katom->runnable_tree_node, parent, new);
-	rb_insert_color(&katom->runnable_tree_node, &queue->runnable_tree);
-}
-
-/**
- * jsctx_rb_unpull(): - Undo marking of atom in list as running
- * @kctx:  Pointer to kbase context with ring buffer.
- * @katom: Pointer to katom to unpull.
- *
- * Undo jsctx_rb_pull() and put @katom back in the queue.
- *
- * jsctx_rb_unpull() must be called on atoms in the same order the atoms were
- * pulled.
- */
-static inline void
-jsctx_rb_unpull(struct kbase_context *kctx, struct kbase_jd_atom *katom)
-{
-	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
-
-	jsctx_tree_add(kctx, katom);
-}
-
-static bool kbase_js_ctx_pullable(struct kbase_context *kctx,
-					int js,
-					bool is_scheduled);
-static bool kbase_js_ctx_list_add_pullable_nolock(struct kbase_device *kbdev,
-						struct kbase_context *kctx,
-						int js);
-static bool kbase_js_ctx_list_add_unpullable_nolock(struct kbase_device *kbdev,
-						struct kbase_context *kctx,
-						int js);
-
-/*
- * Functions private to KBase ('Protected' functions)
- */
-int kbasep_js_devdata_init(struct kbase_device * const kbdev)
-{
-	struct kbasep_js_device_data *jsdd;
-	int i;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	jsdd = &kbdev->js_data;
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-	/* Soft-stop will be disabled on a single context by default unless
-	 * softstop_always is set */
-	jsdd->softstop_always = false;
-#endif				/* CONFIG_MALI_BIFROST_DEBUG */
-	jsdd->nr_all_contexts_running = 0;
-	jsdd->nr_user_contexts_running = 0;
-	jsdd->nr_contexts_pullable = 0;
-	atomic_set(&jsdd->nr_contexts_runnable, 0);
-	/* No ctx allowed to submit */
-	jsdd->runpool_irq.submit_allowed = 0u;
-	memset(jsdd->runpool_irq.ctx_attr_ref_count, 0,
-			sizeof(jsdd->runpool_irq.ctx_attr_ref_count));
-	memset(jsdd->runpool_irq.slot_affinities, 0,
-			sizeof(jsdd->runpool_irq.slot_affinities));
-	memset(jsdd->runpool_irq.slot_affinity_refcount, 0,
-			sizeof(jsdd->runpool_irq.slot_affinity_refcount));
-	INIT_LIST_HEAD(&jsdd->suspended_soft_jobs_list);
-
-	/* Config attributes */
-	jsdd->scheduling_period_ns = DEFAULT_JS_SCHEDULING_PERIOD_NS;
-	jsdd->soft_stop_ticks = DEFAULT_JS_SOFT_STOP_TICKS;
-	jsdd->soft_stop_ticks_cl = DEFAULT_JS_SOFT_STOP_TICKS_CL;
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8408))
-		jsdd->hard_stop_ticks_ss = DEFAULT_JS_HARD_STOP_TICKS_SS_8408;
-	else
-		jsdd->hard_stop_ticks_ss = DEFAULT_JS_HARD_STOP_TICKS_SS;
-	jsdd->hard_stop_ticks_cl = DEFAULT_JS_HARD_STOP_TICKS_CL;
-	jsdd->hard_stop_ticks_dumping = DEFAULT_JS_HARD_STOP_TICKS_DUMPING;
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8408))
-		jsdd->gpu_reset_ticks_ss = DEFAULT_JS_RESET_TICKS_SS_8408;
-	else
-		jsdd->gpu_reset_ticks_ss = DEFAULT_JS_RESET_TICKS_SS;
-	jsdd->gpu_reset_ticks_cl = DEFAULT_JS_RESET_TICKS_CL;
-	jsdd->gpu_reset_ticks_dumping = DEFAULT_JS_RESET_TICKS_DUMPING;
-	jsdd->ctx_timeslice_ns = DEFAULT_JS_CTX_TIMESLICE_NS;
-	atomic_set(&jsdd->soft_job_timeout_ms, DEFAULT_JS_SOFT_JOB_TIMEOUT);
-
-	dev_dbg(kbdev->dev, "JS Config Attribs: ");
-	dev_dbg(kbdev->dev, "\tscheduling_period_ns:%u",
-			jsdd->scheduling_period_ns);
-	dev_dbg(kbdev->dev, "\tsoft_stop_ticks:%u",
-			jsdd->soft_stop_ticks);
-	dev_dbg(kbdev->dev, "\tsoft_stop_ticks_cl:%u",
-			jsdd->soft_stop_ticks_cl);
-	dev_dbg(kbdev->dev, "\thard_stop_ticks_ss:%u",
-			jsdd->hard_stop_ticks_ss);
-	dev_dbg(kbdev->dev, "\thard_stop_ticks_cl:%u",
-			jsdd->hard_stop_ticks_cl);
-	dev_dbg(kbdev->dev, "\thard_stop_ticks_dumping:%u",
-			jsdd->hard_stop_ticks_dumping);
-	dev_dbg(kbdev->dev, "\tgpu_reset_ticks_ss:%u",
-			jsdd->gpu_reset_ticks_ss);
-	dev_dbg(kbdev->dev, "\tgpu_reset_ticks_cl:%u",
-			jsdd->gpu_reset_ticks_cl);
-	dev_dbg(kbdev->dev, "\tgpu_reset_ticks_dumping:%u",
-			jsdd->gpu_reset_ticks_dumping);
-	dev_dbg(kbdev->dev, "\tctx_timeslice_ns:%u",
-			jsdd->ctx_timeslice_ns);
-	dev_dbg(kbdev->dev, "\tsoft_job_timeout:%i",
-		atomic_read(&jsdd->soft_job_timeout_ms));
-
-	if (!(jsdd->soft_stop_ticks < jsdd->hard_stop_ticks_ss &&
-			jsdd->hard_stop_ticks_ss < jsdd->gpu_reset_ticks_ss &&
-			jsdd->soft_stop_ticks < jsdd->hard_stop_ticks_dumping &&
-			jsdd->hard_stop_ticks_dumping <
-			jsdd->gpu_reset_ticks_dumping)) {
-		dev_err(kbdev->dev, "Job scheduler timeouts invalid; soft/hard/reset tick counts should be in increasing order\n");
-		return -EINVAL;
-	}
-
-#if KBASE_DISABLE_SCHEDULING_SOFT_STOPS
-	dev_dbg(kbdev->dev, "Job Scheduling Soft-stops disabled, ignoring value for soft_stop_ticks==%u at %uns per tick. Other soft-stops may still occur.",
-			jsdd->soft_stop_ticks,
-			jsdd->scheduling_period_ns);
-#endif
-#if KBASE_DISABLE_SCHEDULING_HARD_STOPS
-	dev_dbg(kbdev->dev, "Job Scheduling Hard-stops disabled, ignoring values for hard_stop_ticks_ss==%d and hard_stop_ticks_dumping==%u at %uns per tick. Other hard-stops may still occur.",
-			jsdd->hard_stop_ticks_ss,
-			jsdd->hard_stop_ticks_dumping,
-			jsdd->scheduling_period_ns);
-#endif
-#if KBASE_DISABLE_SCHEDULING_SOFT_STOPS && KBASE_DISABLE_SCHEDULING_HARD_STOPS
-	dev_dbg(kbdev->dev, "Note: The JS tick timer (if coded) will still be run, but do nothing.");
-#endif
-
-	for (i = 0; i < kbdev->gpu_props.num_job_slots; ++i)
-		jsdd->js_reqs[i] = core_reqs_from_jsn_features(
-			kbdev->gpu_props.props.raw_props.js_features[i]);
-
-	/* On error, we could continue on: providing none of the below resources
-	 * rely on the ones above */
-
-	mutex_init(&jsdd->runpool_mutex);
-	mutex_init(&jsdd->queue_mutex);
-	spin_lock_init(&kbdev->hwaccess_lock);
-	sema_init(&jsdd->schedule_sem, 1);
-
-	for (i = 0; i < kbdev->gpu_props.num_job_slots; ++i) {
-		INIT_LIST_HEAD(&jsdd->ctx_list_pullable[i]);
-		INIT_LIST_HEAD(&jsdd->ctx_list_unpullable[i]);
-	}
-
-	return 0;
-}
-
-void kbasep_js_devdata_halt(struct kbase_device *kbdev)
-{
-	CSTD_UNUSED(kbdev);
-}
-
-void kbasep_js_devdata_term(struct kbase_device *kbdev)
-{
-	struct kbasep_js_device_data *js_devdata;
-	s8 zero_ctx_attr_ref_count[KBASEP_JS_CTX_ATTR_COUNT] = { 0, };
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	js_devdata = &kbdev->js_data;
-
-	/* The caller must de-register all contexts before calling this
-	 */
-	KBASE_DEBUG_ASSERT(js_devdata->nr_all_contexts_running == 0);
-	KBASE_DEBUG_ASSERT(memcmp(
-	        js_devdata->runpool_irq.ctx_attr_ref_count,
-	        zero_ctx_attr_ref_count,
-	        sizeof(zero_ctx_attr_ref_count)) == 0);
-	CSTD_UNUSED(zero_ctx_attr_ref_count);
-}
-
-int kbasep_js_kctx_init(struct kbase_context * const kctx)
-{
-	struct kbase_device *kbdev;
-	struct kbasep_js_kctx_info *js_kctx_info;
-	int i, j;
-
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-
-	kbdev = kctx->kbdev;
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	for (i = 0; i < BASE_JM_MAX_NR_SLOTS; ++i)
-		INIT_LIST_HEAD(&kctx->jctx.sched_info.ctx.ctx_list_entry[i]);
-
-	js_kctx_info = &kctx->jctx.sched_info;
-
-	js_kctx_info->ctx.nr_jobs = 0;
-	kbase_ctx_flag_clear(kctx, KCTX_SCHEDULED);
-	kbase_ctx_flag_clear(kctx, KCTX_DYING);
-	memset(js_kctx_info->ctx.ctx_attr_ref_count, 0,
-			sizeof(js_kctx_info->ctx.ctx_attr_ref_count));
-
-	/* Initially, the context is disabled from submission until the create
-	 * flags are set */
-	kbase_ctx_flag_set(kctx, KCTX_SUBMIT_DISABLED);
-
-	/* On error, we could continue on: providing none of the below resources
-	 * rely on the ones above */
-	mutex_init(&js_kctx_info->ctx.jsctx_mutex);
-
-	init_waitqueue_head(&js_kctx_info->ctx.is_scheduled_wait);
-
-	for (i = 0; i < KBASE_JS_ATOM_SCHED_PRIO_COUNT; i++) {
-		for (j = 0; j < BASE_JM_MAX_NR_SLOTS; j++) {
-			INIT_LIST_HEAD(&kctx->jsctx_queue[i][j].x_dep_head);
-			kctx->jsctx_queue[i][j].runnable_tree = RB_ROOT;
-		}
-	}
-
-	return 0;
-}
-
-void kbasep_js_kctx_term(struct kbase_context *kctx)
-{
-	struct kbase_device *kbdev;
-	struct kbasep_js_kctx_info *js_kctx_info;
-	int js;
-	bool update_ctx_count = false;
-
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-
-	kbdev = kctx->kbdev;
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	js_kctx_info = &kctx->jctx.sched_info;
-
-	/* The caller must de-register all jobs before calling this */
-	KBASE_DEBUG_ASSERT(!kbase_ctx_flag(kctx, KCTX_SCHEDULED));
-	KBASE_DEBUG_ASSERT(js_kctx_info->ctx.nr_jobs == 0);
-
-	mutex_lock(&kbdev->js_data.queue_mutex);
-	mutex_lock(&kctx->jctx.sched_info.ctx.jsctx_mutex);
-
-	for (js = 0; js < kbdev->gpu_props.num_job_slots; js++)
-		list_del_init(&kctx->jctx.sched_info.ctx.ctx_list_entry[js]);
-
-	if (kbase_ctx_flag(kctx, KCTX_RUNNABLE_REF)) {
-		WARN_ON(atomic_read(&kbdev->js_data.nr_contexts_runnable) <= 0);
-		atomic_dec(&kbdev->js_data.nr_contexts_runnable);
-		update_ctx_count = true;
-		kbase_ctx_flag_clear(kctx, KCTX_RUNNABLE_REF);
-	}
-
-	mutex_unlock(&kctx->jctx.sched_info.ctx.jsctx_mutex);
-	mutex_unlock(&kbdev->js_data.queue_mutex);
-
-	if (update_ctx_count) {
-		mutex_lock(&kbdev->js_data.runpool_mutex);
-		kbase_backend_ctx_count_changed(kbdev);
-		mutex_unlock(&kbdev->js_data.runpool_mutex);
-	}
-}
-
-/**
- * kbase_js_ctx_list_add_pullable_nolock - Variant of
- *                                         kbase_jd_ctx_list_add_pullable()
- *                                         where the caller must hold
- *                                         hwaccess_lock
- * @kbdev:  Device pointer
- * @kctx:   Context to add to queue
- * @js:     Job slot to use
- *
- * Caller must hold hwaccess_lock
- *
- * Return: true if caller should call kbase_backend_ctx_count_changed()
- */
-static bool kbase_js_ctx_list_add_pullable_nolock(struct kbase_device *kbdev,
-						struct kbase_context *kctx,
-						int js)
-{
-	bool ret = false;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	if (!list_empty(&kctx->jctx.sched_info.ctx.ctx_list_entry[js]))
-		list_del_init(&kctx->jctx.sched_info.ctx.ctx_list_entry[js]);
-
-	list_add_tail(&kctx->jctx.sched_info.ctx.ctx_list_entry[js],
-					&kbdev->js_data.ctx_list_pullable[js]);
-
-	if (!kctx->slots_pullable) {
-		kbdev->js_data.nr_contexts_pullable++;
-		ret = true;
-		if (!atomic_read(&kctx->atoms_pulled)) {
-			WARN_ON(kbase_ctx_flag(kctx, KCTX_RUNNABLE_REF));
-			kbase_ctx_flag_set(kctx, KCTX_RUNNABLE_REF);
-			atomic_inc(&kbdev->js_data.nr_contexts_runnable);
-		}
-	}
-	kctx->slots_pullable |= (1 << js);
-
-	return ret;
-}
-
-/**
- * kbase_js_ctx_list_add_pullable_head_nolock - Variant of
- *                                              kbase_js_ctx_list_add_pullable_head()
- *                                              where the caller must hold
- *                                              hwaccess_lock
- * @kbdev:  Device pointer
- * @kctx:   Context to add to queue
- * @js:     Job slot to use
- *
- * Caller must hold hwaccess_lock
- *
- * Return:  true if caller should call kbase_backend_ctx_count_changed()
- */
-static bool kbase_js_ctx_list_add_pullable_head_nolock(
-		struct kbase_device *kbdev, struct kbase_context *kctx, int js)
-{
-	bool ret = false;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	if (!list_empty(&kctx->jctx.sched_info.ctx.ctx_list_entry[js]))
-		list_del_init(&kctx->jctx.sched_info.ctx.ctx_list_entry[js]);
-
-	list_add(&kctx->jctx.sched_info.ctx.ctx_list_entry[js],
-					&kbdev->js_data.ctx_list_pullable[js]);
-
-	if (!kctx->slots_pullable) {
-		kbdev->js_data.nr_contexts_pullable++;
-		ret = true;
-		if (!atomic_read(&kctx->atoms_pulled)) {
-			WARN_ON(kbase_ctx_flag(kctx, KCTX_RUNNABLE_REF));
-			kbase_ctx_flag_set(kctx, KCTX_RUNNABLE_REF);
-			atomic_inc(&kbdev->js_data.nr_contexts_runnable);
-		}
-	}
-	kctx->slots_pullable |= (1 << js);
-
-	return ret;
-}
-
-/**
- * kbase_js_ctx_list_add_pullable_head - Add context to the head of the
- *                                       per-slot pullable context queue
- * @kbdev:  Device pointer
- * @kctx:   Context to add to queue
- * @js:     Job slot to use
- *
- * If the context is on either the pullable or unpullable queues, then it is
- * removed before being added to the head.
- *
- * This function should be used when a context has been scheduled, but no jobs
- * can currently be pulled from it.
- *
- * Return:  true if caller should call kbase_backend_ctx_count_changed()
- */
-static bool kbase_js_ctx_list_add_pullable_head(struct kbase_device *kbdev,
-						struct kbase_context *kctx,
-						int js)
-{
-	bool ret;
-	unsigned long flags;
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	ret = kbase_js_ctx_list_add_pullable_head_nolock(kbdev, kctx, js);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	return ret;
-}
-
-/**
- * kbase_js_ctx_list_add_unpullable_nolock - Add context to the tail of the
- *                                           per-slot unpullable context queue
- * @kbdev:  Device pointer
- * @kctx:   Context to add to queue
- * @js:     Job slot to use
- *
- * The context must already be on the per-slot pullable queue. It will be
- * removed from the pullable queue before being added to the unpullable queue.
- *
- * This function should be used when a context has been pulled from, and there
- * are no jobs remaining on the specified slot.
- *
- * Caller must hold hwaccess_lock
- *
- * Return:  true if caller should call kbase_backend_ctx_count_changed()
- */
-static bool kbase_js_ctx_list_add_unpullable_nolock(struct kbase_device *kbdev,
-						struct kbase_context *kctx,
-						int js)
-{
-	bool ret = false;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	list_move_tail(&kctx->jctx.sched_info.ctx.ctx_list_entry[js],
-				&kbdev->js_data.ctx_list_unpullable[js]);
-
-	if (kctx->slots_pullable == (1 << js)) {
-		kbdev->js_data.nr_contexts_pullable--;
-		ret = true;
-		if (!atomic_read(&kctx->atoms_pulled)) {
-			WARN_ON(!kbase_ctx_flag(kctx, KCTX_RUNNABLE_REF));
-			kbase_ctx_flag_clear(kctx, KCTX_RUNNABLE_REF);
-			atomic_dec(&kbdev->js_data.nr_contexts_runnable);
-		}
-	}
-	kctx->slots_pullable &= ~(1 << js);
-
-	return ret;
-}
-
-/**
- * kbase_js_ctx_list_remove_nolock - Remove context from the per-slot pullable
- *                                   or unpullable context queues
- * @kbdev:  Device pointer
- * @kctx:   Context to remove from queue
- * @js:     Job slot to use
- *
- * The context must already be on one of the queues.
- *
- * This function should be used when a context has no jobs on the GPU, and no
- * jobs remaining for the specified slot.
- *
- * Caller must hold hwaccess_lock
- *
- * Return:  true if caller should call kbase_backend_ctx_count_changed()
- */
-static bool kbase_js_ctx_list_remove_nolock(struct kbase_device *kbdev,
-					struct kbase_context *kctx,
-					int js)
-{
-	bool ret = false;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	WARN_ON(list_empty(&kctx->jctx.sched_info.ctx.ctx_list_entry[js]));
-
-	list_del_init(&kctx->jctx.sched_info.ctx.ctx_list_entry[js]);
-
-	if (kctx->slots_pullable == (1 << js)) {
-		kbdev->js_data.nr_contexts_pullable--;
-		ret = true;
-		if (!atomic_read(&kctx->atoms_pulled)) {
-			WARN_ON(!kbase_ctx_flag(kctx, KCTX_RUNNABLE_REF));
-			kbase_ctx_flag_clear(kctx, KCTX_RUNNABLE_REF);
-			atomic_dec(&kbdev->js_data.nr_contexts_runnable);
-		}
-	}
-	kctx->slots_pullable &= ~(1 << js);
-
-	return ret;
-}
-
-/**
- * kbase_js_ctx_list_pop_head_nolock - Variant of kbase_js_ctx_list_pop_head()
- *                                     where the caller must hold
- *                                     hwaccess_lock
- * @kbdev:  Device pointer
- * @js:     Job slot to use
- *
- * Caller must hold hwaccess_lock
- *
- * Return:  Context to use for specified slot.
- *          NULL if no contexts present for specified slot
- */
-static struct kbase_context *kbase_js_ctx_list_pop_head_nolock(
-						struct kbase_device *kbdev,
-						int js)
-{
-	struct kbase_context *kctx;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	if (list_empty(&kbdev->js_data.ctx_list_pullable[js]))
-		return NULL;
-
-	kctx = list_entry(kbdev->js_data.ctx_list_pullable[js].next,
-					struct kbase_context,
-					jctx.sched_info.ctx.ctx_list_entry[js]);
-
-	list_del_init(&kctx->jctx.sched_info.ctx.ctx_list_entry[js]);
-
-	return kctx;
-}
-
-/**
- * kbase_js_ctx_list_pop_head - Pop the head context off the per-slot pullable
- *                              queue.
- * @kbdev:  Device pointer
- * @js:     Job slot to use
- *
- * Return:  Context to use for specified slot.
- *          NULL if no contexts present for specified slot
- */
-static struct kbase_context *kbase_js_ctx_list_pop_head(
-		struct kbase_device *kbdev, int js)
-{
-	struct kbase_context *kctx;
-	unsigned long flags;
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	kctx = kbase_js_ctx_list_pop_head_nolock(kbdev, js);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	return kctx;
-}
-
-/**
- * kbase_js_ctx_pullable - Return if a context can be pulled from on the
- *                         specified slot
- * @kctx:          Context pointer
- * @js:            Job slot to use
- * @is_scheduled:  true if the context is currently scheduled
- *
- * Caller must hold hwaccess_lock
- *
- * Return:         true if context can be pulled from on specified slot
- *                 false otherwise
- */
-static bool kbase_js_ctx_pullable(struct kbase_context *kctx, int js,
-					bool is_scheduled)
-{
-	struct kbasep_js_device_data *js_devdata;
-	struct kbase_jd_atom *katom;
-
-	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
-
-	js_devdata = &kctx->kbdev->js_data;
-
-	if (is_scheduled) {
-		if (!kbasep_js_is_submit_allowed(js_devdata, kctx))
-			return false;
-	}
-	katom = jsctx_rb_peek(kctx, js);
-	if (!katom)
-		return false; /* No pullable atoms */
-	if (kctx->blocked_js[js][katom->sched_priority])
-		return false;
-	if (atomic_read(&katom->blocked))
-		return false; /* next atom blocked */
-	if (katom->atom_flags & KBASE_KATOM_FLAG_X_DEP_BLOCKED) {
-		if (katom->x_pre_dep->gpu_rb_state ==
-					KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB ||
-					katom->x_pre_dep->will_fail_event_code)
-			return false;
-		if ((katom->atom_flags & KBASE_KATOM_FLAG_FAIL_BLOCKER) &&
-				kbase_backend_nr_atoms_on_slot(kctx->kbdev, js))
-			return false;
-	}
-
-	return true;
-}
-
-static bool kbase_js_dep_validate(struct kbase_context *kctx,
-				struct kbase_jd_atom *katom)
-{
-	struct kbase_device *kbdev = kctx->kbdev;
-	bool ret = true;
-	bool has_dep = false, has_x_dep = false;
-	int js = kbase_js_get_slot(kbdev, katom);
-	int prio = katom->sched_priority;
-	int i;
-
-	for (i = 0; i < 2; i++) {
-		struct kbase_jd_atom *dep_atom = katom->dep[i].atom;
-
-		if (dep_atom) {
-			int dep_js = kbase_js_get_slot(kbdev, dep_atom);
-			int dep_prio = dep_atom->sched_priority;
-
-			/* Dependent atom must already have been submitted */
-			if (!(dep_atom->atom_flags &
-					KBASE_KATOM_FLAG_JSCTX_IN_TREE)) {
-				ret = false;
-				break;
-			}
-
-			/* Dependencies with different priorities can't
-			  be represented in the ringbuffer */
-			if (prio != dep_prio) {
-				ret = false;
-				break;
-			}
-
-			if (js == dep_js) {
-				/* Only one same-slot dependency can be
-				 * represented in the ringbuffer */
-				if (has_dep) {
-					ret = false;
-					break;
-				}
-				/* Each dependee atom can only have one
-				 * same-slot dependency */
-				if (dep_atom->post_dep) {
-					ret = false;
-					break;
-				}
-				has_dep = true;
-			} else {
-				/* Only one cross-slot dependency can be
-				 * represented in the ringbuffer */
-				if (has_x_dep) {
-					ret = false;
-					break;
-				}
-				/* Each dependee atom can only have one
-				 * cross-slot dependency */
-				if (dep_atom->x_post_dep) {
-					ret = false;
-					break;
-				}
-				/* The dependee atom can not already be in the
-				 * HW access ringbuffer */
-				if (dep_atom->gpu_rb_state !=
-					KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB) {
-					ret = false;
-					break;
-				}
-				/* The dependee atom can not already have
-				 * completed */
-				if (dep_atom->status !=
-						KBASE_JD_ATOM_STATE_IN_JS) {
-					ret = false;
-					break;
-				}
-				/* Cross-slot dependencies must not violate
-				 * PRLAM-8987 affinity restrictions */
-				if (kbase_hw_has_issue(kbdev,
-							BASE_HW_ISSUE_8987) &&
-						(js == 2 || dep_js == 2)) {
-					ret = false;
-					break;
-				}
-				has_x_dep = true;
-			}
-
-			/* Dependency can be represented in ringbuffers */
-		}
-	}
-
-	/* If dependencies can be represented by ringbuffer then clear them from
-	 * atom structure */
-	if (ret) {
-		for (i = 0; i < 2; i++) {
-			struct kbase_jd_atom *dep_atom = katom->dep[i].atom;
-
-			if (dep_atom) {
-				int dep_js = kbase_js_get_slot(kbdev, dep_atom);
-
-				if ((js != dep_js) &&
-					(dep_atom->status !=
-						KBASE_JD_ATOM_STATE_COMPLETED)
-					&& (dep_atom->status !=
-					KBASE_JD_ATOM_STATE_HW_COMPLETED)
-					&& (dep_atom->status !=
-						KBASE_JD_ATOM_STATE_UNUSED)) {
-
-					katom->atom_flags |=
-						KBASE_KATOM_FLAG_X_DEP_BLOCKED;
-					katom->x_pre_dep = dep_atom;
-					dep_atom->x_post_dep = katom;
-					if (kbase_jd_katom_dep_type(
-							&katom->dep[i]) ==
-							BASE_JD_DEP_TYPE_DATA)
-						katom->atom_flags |=
-						KBASE_KATOM_FLAG_FAIL_BLOCKER;
-				}
-				if ((kbase_jd_katom_dep_type(&katom->dep[i])
-						== BASE_JD_DEP_TYPE_DATA) &&
-						(js == dep_js)) {
-					katom->pre_dep = dep_atom;
-					dep_atom->post_dep = katom;
-				}
-
-				list_del(&katom->dep_item[i]);
-				kbase_jd_katom_dep_clear(&katom->dep[i]);
-			}
-		}
-	}
-
-	return ret;
-}
-
-bool kbasep_js_add_job(struct kbase_context *kctx,
-		struct kbase_jd_atom *atom)
-{
-	unsigned long flags;
-	struct kbasep_js_kctx_info *js_kctx_info;
-	struct kbase_device *kbdev;
-	struct kbasep_js_device_data *js_devdata;
-
-	bool enqueue_required = false;
-	bool timer_sync = false;
-
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	KBASE_DEBUG_ASSERT(atom != NULL);
-	lockdep_assert_held(&kctx->jctx.lock);
-
-	kbdev = kctx->kbdev;
-	js_devdata = &kbdev->js_data;
-	js_kctx_info = &kctx->jctx.sched_info;
-
-	mutex_lock(&js_devdata->queue_mutex);
-	mutex_lock(&js_kctx_info->ctx.jsctx_mutex);
-
-	/*
-	 * Begin Runpool transaction
-	 */
-	mutex_lock(&js_devdata->runpool_mutex);
-
-	/* Refcount ctx.nr_jobs */
-	KBASE_DEBUG_ASSERT(js_kctx_info->ctx.nr_jobs < U32_MAX);
-	++(js_kctx_info->ctx.nr_jobs);
-
-	/* Setup any scheduling information */
-	kbasep_js_clear_job_retry_submit(atom);
-
-	/* Lock for state available during IRQ */
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	if (!kbase_js_dep_validate(kctx, atom)) {
-		/* Dependencies could not be represented */
-		--(js_kctx_info->ctx.nr_jobs);
-
-		/* Setting atom status back to queued as it still has unresolved
-		 * dependencies */
-		atom->status = KBASE_JD_ATOM_STATE_QUEUED;
-
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-		mutex_unlock(&js_devdata->runpool_mutex);
-
-		goto out_unlock;
-	}
-
-	KBASE_TLSTREAM_TL_ATTRIB_ATOM_STATE(atom, TL_ATOM_STATE_READY);
-	KBASE_TIMELINE_ATOM_READY(kctx, kbase_jd_atom_id(kctx, atom));
-
-	enqueue_required = kbase_js_dep_resolved_submit(kctx, atom);
-
-	KBASE_TRACE_ADD_REFCOUNT(kbdev, JS_ADD_JOB, kctx, atom, atom->jc,
-				kbasep_js_trace_get_refcnt(kbdev, kctx));
-
-	/* Context Attribute Refcounting */
-	kbasep_js_ctx_attr_ctx_retain_atom(kbdev, kctx, atom);
-
-	if (enqueue_required) {
-		if (kbase_js_ctx_pullable(kctx, atom->slot_nr, false))
-			timer_sync = kbase_js_ctx_list_add_pullable_nolock(
-					kbdev, kctx, atom->slot_nr);
-		else
-			timer_sync = kbase_js_ctx_list_add_unpullable_nolock(
-					kbdev, kctx, atom->slot_nr);
-	}
-	/* If this context is active and the atom is the first on its slot,
-	 * kick the job manager to attempt to fast-start the atom */
-	if (enqueue_required && kctx == kbdev->hwaccess.active_kctx)
-		kbase_jm_try_kick(kbdev, 1 << atom->slot_nr);
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-	if (timer_sync)
-		kbase_backend_ctx_count_changed(kbdev);
-	mutex_unlock(&js_devdata->runpool_mutex);
-	/* End runpool transaction */
-
-	if (!kbase_ctx_flag(kctx, KCTX_SCHEDULED)) {
-		if (kbase_ctx_flag(kctx, KCTX_DYING)) {
-			/* A job got added while/after kbase_job_zap_context()
-			 * was called on a non-scheduled context (e.g. KDS
-			 * dependency resolved). Kill that job by killing the
-			 * context. */
-			kbasep_js_runpool_requeue_or_kill_ctx(kbdev, kctx,
-					false);
-		} else if (js_kctx_info->ctx.nr_jobs == 1) {
-			/* Handle Refcount going from 0 to 1: schedule the
-			 * context on the Queue */
-			KBASE_DEBUG_ASSERT(!kbase_ctx_flag(kctx, KCTX_SCHEDULED));
-			dev_dbg(kbdev->dev, "JS: Enqueue Context %p", kctx);
-
-			/* Queue was updated - caller must try to
-			 * schedule the head context */
-			WARN_ON(!enqueue_required);
-		}
-	}
-out_unlock:
-	mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
-
-	mutex_unlock(&js_devdata->queue_mutex);
-
-	return enqueue_required;
-}
-
-void kbasep_js_remove_job(struct kbase_device *kbdev,
-		struct kbase_context *kctx, struct kbase_jd_atom *atom)
-{
-	struct kbasep_js_kctx_info *js_kctx_info;
-	struct kbasep_js_device_data *js_devdata;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	KBASE_DEBUG_ASSERT(atom != NULL);
-
-	js_devdata = &kbdev->js_data;
-	js_kctx_info = &kctx->jctx.sched_info;
-
-	KBASE_TRACE_ADD_REFCOUNT(kbdev, JS_REMOVE_JOB, kctx, atom, atom->jc,
-			kbasep_js_trace_get_refcnt(kbdev, kctx));
-
-	/* De-refcount ctx.nr_jobs */
-	KBASE_DEBUG_ASSERT(js_kctx_info->ctx.nr_jobs > 0);
-	--(js_kctx_info->ctx.nr_jobs);
-}
-
-bool kbasep_js_remove_cancelled_job(struct kbase_device *kbdev,
-		struct kbase_context *kctx, struct kbase_jd_atom *katom)
-{
-	unsigned long flags;
-	struct kbasep_js_atom_retained_state katom_retained_state;
-	struct kbasep_js_device_data *js_devdata;
-	bool attr_state_changed;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	KBASE_DEBUG_ASSERT(katom != NULL);
-
-	js_devdata = &kbdev->js_data;
-
-	kbasep_js_atom_retained_state_copy(&katom_retained_state, katom);
-	kbasep_js_remove_job(kbdev, kctx, katom);
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	/* The atom has 'finished' (will not be re-run), so no need to call
-	 * kbasep_js_has_atom_finished().
-	 *
-	 * This is because it returns false for soft-stopped atoms, but we
-	 * want to override that, because we're cancelling an atom regardless of
-	 * whether it was soft-stopped or not */
-	attr_state_changed = kbasep_js_ctx_attr_ctx_release_atom(kbdev, kctx,
-			&katom_retained_state);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	return attr_state_changed;
-}
-
-bool kbasep_js_runpool_retain_ctx(struct kbase_device *kbdev,
-		struct kbase_context *kctx)
-{
-	unsigned long flags;
-	struct kbasep_js_device_data *js_devdata;
-	bool result;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	js_devdata = &kbdev->js_data;
-
-	mutex_lock(&kbdev->mmu_hw_mutex);
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	result = kbasep_js_runpool_retain_ctx_nolock(kbdev, kctx);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-	mutex_unlock(&kbdev->mmu_hw_mutex);
-
-	return result;
-}
-
-struct kbase_context *kbasep_js_runpool_lookup_ctx(struct kbase_device *kbdev,
-		int as_nr)
-{
-	unsigned long flags;
-	struct kbase_context *found_kctx = NULL;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(0 <= as_nr && as_nr < BASE_MAX_NR_AS);
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	found_kctx = kbdev->as_to_kctx[as_nr];
-
-	if (found_kctx != NULL)
-		kbase_ctx_sched_retain_ctx_refcount(found_kctx);
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	return found_kctx;
-}
-
-/**
- * kbasep_js_release_result - Try running more jobs after releasing a context
- *                            and/or atom
- *
- * @kbdev:                   The kbase_device to operate on
- * @kctx:                    The kbase_context to operate on
- * @katom_retained_state:    Retained state from the atom
- * @runpool_ctx_attr_change: True if the runpool context attributes have changed
- *
- * This collates a set of actions that must happen whilst hwaccess_lock is held.
- *
- * This includes running more jobs when:
- * - The previously released kctx caused a ctx attribute change,
- * - The released atom caused a ctx attribute change,
- * - Slots were previously blocked due to affinity restrictions,
- * - Submission during IRQ handling failed.
- *
- * Return: %KBASEP_JS_RELEASE_RESULT_SCHED_ALL if context attributes were
- *         changed. The caller should try scheduling all contexts
- */
-static kbasep_js_release_result kbasep_js_run_jobs_after_ctx_and_atom_release(
-		struct kbase_device *kbdev,
-		struct kbase_context *kctx,
-		struct kbasep_js_atom_retained_state *katom_retained_state,
-		bool runpool_ctx_attr_change)
-{
-	struct kbasep_js_device_data *js_devdata;
-	kbasep_js_release_result result = 0;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	KBASE_DEBUG_ASSERT(katom_retained_state != NULL);
-	js_devdata = &kbdev->js_data;
-
-	lockdep_assert_held(&kctx->jctx.sched_info.ctx.jsctx_mutex);
-	lockdep_assert_held(&js_devdata->runpool_mutex);
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	if (js_devdata->nr_user_contexts_running != 0) {
-		bool retry_submit = false;
-		int retry_jobslot = 0;
-
-		if (katom_retained_state)
-			retry_submit = kbasep_js_get_atom_retry_submit_slot(
-					katom_retained_state, &retry_jobslot);
-
-		if (runpool_ctx_attr_change || retry_submit) {
-			/* A change in runpool ctx attributes might mean we can
-			 * run more jobs than before  */
-			result = KBASEP_JS_RELEASE_RESULT_SCHED_ALL;
-
-			KBASE_TRACE_ADD_SLOT(kbdev, JD_DONE_TRY_RUN_NEXT_JOB,
-						kctx, NULL, 0u, retry_jobslot);
-		}
-	}
-	return result;
-}
-
-/*
- * Internal function to release the reference on a ctx and an atom's "retained
- * state", only taking the runpool and as transaction mutexes
- *
- * This also starts more jobs running in the case of an ctx-attribute state
- * change
- *
- * This does none of the followup actions for scheduling:
- * - It does not schedule in a new context
- * - It does not requeue or handle dying contexts
- *
- * For those tasks, just call kbasep_js_runpool_release_ctx() instead
- *
- * Requires:
- * - Context is scheduled in, and kctx->as_nr matches kctx_as_nr
- * - Context has a non-zero refcount
- * - Caller holds js_kctx_info->ctx.jsctx_mutex
- * - Caller holds js_devdata->runpool_mutex
- */
-static kbasep_js_release_result kbasep_js_runpool_release_ctx_internal(
-		struct kbase_device *kbdev,
-		struct kbase_context *kctx,
-		struct kbasep_js_atom_retained_state *katom_retained_state)
-{
-	unsigned long flags;
-	struct kbasep_js_device_data *js_devdata;
-	struct kbasep_js_kctx_info *js_kctx_info;
-
-	kbasep_js_release_result release_result = 0u;
-	bool runpool_ctx_attr_change = false;
-	int kctx_as_nr;
-	int new_ref_count;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	js_kctx_info = &kctx->jctx.sched_info;
-	js_devdata = &kbdev->js_data;
-
-	/* Ensure context really is scheduled in */
-	KBASE_DEBUG_ASSERT(kbase_ctx_flag(kctx, KCTX_SCHEDULED));
-
-	kctx_as_nr = kctx->as_nr;
-	KBASE_DEBUG_ASSERT(kctx_as_nr != KBASEP_AS_NR_INVALID);
-	KBASE_DEBUG_ASSERT(atomic_read(&kctx->refcount) > 0);
-
-	/*
-	 * Transaction begins on AS and runpool_irq
-	 *
-	 * Assert about out calling contract
-	 */
-	mutex_lock(&kbdev->pm.lock);
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	KBASE_DEBUG_ASSERT(kctx_as_nr == kctx->as_nr);
-	KBASE_DEBUG_ASSERT(atomic_read(&kctx->refcount) > 0);
-
-	/* Update refcount */
-	kbase_ctx_sched_release_ctx(kctx);
-	new_ref_count = atomic_read(&kctx->refcount);
-
-	/* Release the atom if it finished (i.e. wasn't soft-stopped) */
-	if (kbasep_js_has_atom_finished(katom_retained_state))
-		runpool_ctx_attr_change |= kbasep_js_ctx_attr_ctx_release_atom(
-				kbdev, kctx, katom_retained_state);
-
-	KBASE_TRACE_ADD_REFCOUNT(kbdev, JS_RELEASE_CTX, kctx, NULL, 0u,
-			new_ref_count);
-
-	if (new_ref_count == 2 && kbase_ctx_flag(kctx, KCTX_PRIVILEGED) &&
-			!kbase_pm_is_suspending(kbdev)) {
-		/* Context is kept scheduled into an address space even when
-		 * there are no jobs, in this case we have to handle the
-		 * situation where all jobs have been evicted from the GPU and
-		 * submission is disabled.
-		 *
-		 * At this point we re-enable submission to allow further jobs
-		 * to be executed
-		 */
-		kbasep_js_set_submit_allowed(js_devdata, kctx);
-	}
-
-	/* Make a set of checks to see if the context should be scheduled out.
-	 * Note that there'll always be at least 1 reference to the context
-	 * which was previously acquired by kbasep_js_schedule_ctx(). */
-	if (new_ref_count == 1 &&
-		(!kbasep_js_is_submit_allowed(js_devdata, kctx) ||
-							kbdev->pm.suspending)) {
-		int num_slots = kbdev->gpu_props.num_job_slots;
-		int slot;
-
-		/* Last reference, and we've been told to remove this context
-		 * from the Run Pool */
-		dev_dbg(kbdev->dev, "JS: RunPool Remove Context %p because refcount=%d, jobs=%d, allowed=%d",
-				kctx, new_ref_count, js_kctx_info->ctx.nr_jobs,
-				kbasep_js_is_submit_allowed(js_devdata, kctx));
-
-#if defined(CONFIG_MALI_BIFROST_GATOR_SUPPORT)
-		kbase_trace_mali_mmu_as_released(kctx->as_nr);
-#endif
-		KBASE_TLSTREAM_TL_NRET_AS_CTX(&kbdev->as[kctx->as_nr], kctx);
-
-		kbase_backend_release_ctx_irq(kbdev, kctx);
-
-		if (kbdev->hwaccess.active_kctx == kctx)
-			kbdev->hwaccess.active_kctx = NULL;
-
-		/* Ctx Attribute handling
-		 *
-		 * Releasing atoms attributes must either happen before this, or
-		 * after the KCTX_SHEDULED flag is changed, otherwise we
-		 * double-decount the attributes
-		 */
-		runpool_ctx_attr_change |=
-			kbasep_js_ctx_attr_runpool_release_ctx(kbdev, kctx);
-
-		/* Releasing the context and katom retained state can allow
-		 * more jobs to run */
-		release_result |=
-			kbasep_js_run_jobs_after_ctx_and_atom_release(kbdev,
-						kctx, katom_retained_state,
-						runpool_ctx_attr_change);
-
-		/*
-		 * Transaction ends on AS and runpool_irq:
-		 *
-		 * By this point, the AS-related data is now clear and ready
-		 * for re-use.
-		 *
-		 * Since releases only occur once for each previous successful
-		 * retain, and no more retains are allowed on this context, no
-		 * other thread will be operating in this
-		 * code whilst we are
-		 */
-
-		/* Recalculate pullable status for all slots */
-		for (slot = 0; slot < num_slots; slot++) {
-			if (kbase_js_ctx_pullable(kctx, slot, false))
-				kbase_js_ctx_list_add_pullable_nolock(kbdev,
-						kctx, slot);
-		}
-
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-		kbase_backend_release_ctx_noirq(kbdev, kctx);
-
-		mutex_unlock(&kbdev->pm.lock);
-
-		/* Note: Don't reuse kctx_as_nr now */
-
-		/* Synchronize with any timers */
-		kbase_backend_ctx_count_changed(kbdev);
-
-		/* update book-keeping info */
-		kbase_ctx_flag_clear(kctx, KCTX_SCHEDULED);
-		/* Signal any waiter that the context is not scheduled, so is
-		 * safe for termination - once the jsctx_mutex is also dropped,
-		 * and jobs have finished. */
-		wake_up(&js_kctx_info->ctx.is_scheduled_wait);
-
-		/* Queue an action to occur after we've dropped the lock */
-		release_result |= KBASEP_JS_RELEASE_RESULT_WAS_DESCHEDULED |
-			KBASEP_JS_RELEASE_RESULT_SCHED_ALL;
-	} else {
-		kbasep_js_run_jobs_after_ctx_and_atom_release(kbdev, kctx,
-				katom_retained_state, runpool_ctx_attr_change);
-
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-		mutex_unlock(&kbdev->pm.lock);
-	}
-
-	return release_result;
-}
-
-void kbasep_js_runpool_release_ctx_nolock(struct kbase_device *kbdev,
-						struct kbase_context *kctx)
-{
-	struct kbasep_js_atom_retained_state katom_retained_state;
-
-	/* Setup a dummy katom_retained_state */
-	kbasep_js_atom_retained_state_init_invalid(&katom_retained_state);
-
-	kbasep_js_runpool_release_ctx_internal(kbdev, kctx,
-							&katom_retained_state);
-}
-
-void kbasep_js_runpool_requeue_or_kill_ctx(struct kbase_device *kbdev,
-		struct kbase_context *kctx, bool has_pm_ref)
-{
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-
-	/* This is called if and only if you've you've detached the context from
-	 * the Runpool Queue, and not added it back to the Runpool
-	 */
-	KBASE_DEBUG_ASSERT(!kbase_ctx_flag(kctx, KCTX_SCHEDULED));
-
-	if (kbase_ctx_flag(kctx, KCTX_DYING)) {
-		/* Dying: don't requeue, but kill all jobs on the context. This
-		 * happens asynchronously */
-		dev_dbg(kbdev->dev,
-			"JS: ** Killing Context %p on RunPool Remove **", kctx);
-		kbase_js_foreach_ctx_job(kctx, &kbase_jd_cancel);
-	}
-}
-
-void kbasep_js_runpool_release_ctx_and_katom_retained_state(
-		struct kbase_device *kbdev, struct kbase_context *kctx,
-		struct kbasep_js_atom_retained_state *katom_retained_state)
-{
-	struct kbasep_js_device_data *js_devdata;
-	struct kbasep_js_kctx_info *js_kctx_info;
-	kbasep_js_release_result release_result;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	js_kctx_info = &kctx->jctx.sched_info;
-	js_devdata = &kbdev->js_data;
-
-	mutex_lock(&js_devdata->queue_mutex);
-	mutex_lock(&js_kctx_info->ctx.jsctx_mutex);
-	mutex_lock(&js_devdata->runpool_mutex);
-
-	release_result = kbasep_js_runpool_release_ctx_internal(kbdev, kctx,
-			katom_retained_state);
-
-	/* Drop the runpool mutex to allow requeing kctx */
-	mutex_unlock(&js_devdata->runpool_mutex);
-
-	if ((release_result & KBASEP_JS_RELEASE_RESULT_WAS_DESCHEDULED) != 0u)
-		kbasep_js_runpool_requeue_or_kill_ctx(kbdev, kctx, true);
-
-	/* Drop the jsctx_mutex to allow scheduling in a new context */
-
-	mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
-	mutex_unlock(&js_devdata->queue_mutex);
-
-	if (release_result & KBASEP_JS_RELEASE_RESULT_SCHED_ALL)
-		kbase_js_sched_all(kbdev);
-}
-
-void kbasep_js_runpool_release_ctx(struct kbase_device *kbdev,
-		struct kbase_context *kctx)
-{
-	struct kbasep_js_atom_retained_state katom_retained_state;
-
-	kbasep_js_atom_retained_state_init_invalid(&katom_retained_state);
-
-	kbasep_js_runpool_release_ctx_and_katom_retained_state(kbdev, kctx,
-			&katom_retained_state);
-}
-
-/* Variant of kbasep_js_runpool_release_ctx() that doesn't call into
- * kbase_js_sched_all() */
-static void kbasep_js_runpool_release_ctx_no_schedule(
-		struct kbase_device *kbdev, struct kbase_context *kctx)
-{
-	struct kbasep_js_device_data *js_devdata;
-	struct kbasep_js_kctx_info *js_kctx_info;
-	kbasep_js_release_result release_result;
-	struct kbasep_js_atom_retained_state katom_retained_state_struct;
-	struct kbasep_js_atom_retained_state *katom_retained_state =
-		&katom_retained_state_struct;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	js_kctx_info = &kctx->jctx.sched_info;
-	js_devdata = &kbdev->js_data;
-	kbasep_js_atom_retained_state_init_invalid(katom_retained_state);
-
-	mutex_lock(&js_kctx_info->ctx.jsctx_mutex);
-	mutex_lock(&js_devdata->runpool_mutex);
-
-	release_result = kbasep_js_runpool_release_ctx_internal(kbdev, kctx,
-			katom_retained_state);
-
-	/* Drop the runpool mutex to allow requeing kctx */
-	mutex_unlock(&js_devdata->runpool_mutex);
-	if ((release_result & KBASEP_JS_RELEASE_RESULT_WAS_DESCHEDULED) != 0u)
-		kbasep_js_runpool_requeue_or_kill_ctx(kbdev, kctx, true);
-
-	/* Drop the jsctx_mutex to allow scheduling in a new context */
-	mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
-
-	/* NOTE: could return release_result if the caller would like to know
-	 * whether it should schedule a new context, but currently no callers do
-	 */
-}
-
-void kbase_js_set_timeouts(struct kbase_device *kbdev)
-{
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	kbase_backend_timeouts_changed(kbdev);
-}
-
-static bool kbasep_js_schedule_ctx(struct kbase_device *kbdev,
-					struct kbase_context *kctx)
-{
-	struct kbasep_js_device_data *js_devdata;
-	struct kbasep_js_kctx_info *js_kctx_info;
-	unsigned long flags;
-	bool kctx_suspended = false;
-	int as_nr;
-
-	js_devdata = &kbdev->js_data;
-	js_kctx_info = &kctx->jctx.sched_info;
-
-	/* Pick available address space for this context */
-	mutex_lock(&kbdev->mmu_hw_mutex);
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	as_nr = kbase_ctx_sched_retain_ctx(kctx);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-	mutex_unlock(&kbdev->mmu_hw_mutex);
-	if (as_nr == KBASEP_AS_NR_INVALID) {
-		as_nr = kbase_backend_find_and_release_free_address_space(
-				kbdev, kctx);
-		if (as_nr != KBASEP_AS_NR_INVALID) {
-			/* Attempt to retain the context again, this should
-			 * succeed */
-			mutex_lock(&kbdev->mmu_hw_mutex);
-			spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-			as_nr = kbase_ctx_sched_retain_ctx(kctx);
-			spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-			mutex_unlock(&kbdev->mmu_hw_mutex);
-
-			WARN_ON(as_nr == KBASEP_AS_NR_INVALID);
-		}
-	}
-	if (as_nr == KBASEP_AS_NR_INVALID)
-		return false; /* No address spaces currently available */
-
-	/*
-	 * Atomic transaction on the Context and Run Pool begins
-	 */
-	mutex_lock(&js_kctx_info->ctx.jsctx_mutex);
-	mutex_lock(&js_devdata->runpool_mutex);
-	mutex_lock(&kbdev->mmu_hw_mutex);
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	/* Check to see if context is dying due to kbase_job_zap_context() */
-	if (kbase_ctx_flag(kctx, KCTX_DYING)) {
-		/* Roll back the transaction so far and return */
-		kbase_ctx_sched_release_ctx(kctx);
-
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-		mutex_unlock(&kbdev->mmu_hw_mutex);
-		mutex_unlock(&js_devdata->runpool_mutex);
-		mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
-
-		return false;
-	}
-
-	KBASE_TRACE_ADD_REFCOUNT(kbdev, JS_TRY_SCHEDULE_HEAD_CTX, kctx, NULL,
-				0u,
-				kbasep_js_trace_get_refcnt(kbdev, kctx));
-
-	kbase_ctx_flag_set(kctx, KCTX_SCHEDULED);
-
-	/* Assign context to previously chosen address space */
-	if (!kbase_backend_use_ctx(kbdev, kctx, as_nr)) {
-		/* Roll back the transaction so far and return */
-		kbase_ctx_sched_release_ctx(kctx);
-		kbase_ctx_flag_clear(kctx, KCTX_SCHEDULED);
-
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-		mutex_unlock(&kbdev->mmu_hw_mutex);
-		mutex_unlock(&js_devdata->runpool_mutex);
-		mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
-
-		return false;
-	}
-
-	kbdev->hwaccess.active_kctx = kctx;
-
-#if defined(CONFIG_MALI_BIFROST_GATOR_SUPPORT)
-	kbase_trace_mali_mmu_as_in_use(kctx->as_nr);
-#endif
-	KBASE_TLSTREAM_TL_RET_AS_CTX(&kbdev->as[kctx->as_nr], kctx);
-
-	/* Cause any future waiter-on-termination to wait until the context is
-	 * descheduled */
-	wake_up(&js_kctx_info->ctx.is_scheduled_wait);
-
-	/* Re-check for suspending: a suspend could've occurred, and all the
-	 * contexts could've been removed from the runpool before we took this
-	 * lock. In this case, we don't want to allow this context to run jobs,
-	 * we just want it out immediately.
-	 *
-	 * The DMB required to read the suspend flag was issued recently as part
-	 * of the hwaccess_lock locking. If a suspend occurs *after* that lock
-	 * was taken (i.e. this condition doesn't execute), then the
-	 * kbasep_js_suspend() code will cleanup this context instead (by virtue
-	 * of it being called strictly after the suspend flag is set, and will
-	 * wait for this lock to drop) */
-	if (kbase_pm_is_suspending(kbdev)) {
-		/* Cause it to leave at some later point */
-		bool retained;
-
-		retained = kbasep_js_runpool_retain_ctx_nolock(kbdev, kctx);
-		KBASE_DEBUG_ASSERT(retained);
-
-		kbasep_js_clear_submit_allowed(js_devdata, kctx);
-		kctx_suspended = true;
-	}
-
-	/* Transaction complete */
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-	mutex_unlock(&kbdev->mmu_hw_mutex);
-
-	/* Synchronize with any timers */
-	kbase_backend_ctx_count_changed(kbdev);
-
-	mutex_unlock(&js_devdata->runpool_mutex);
-	mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
-	/* Note: after this point, the context could potentially get scheduled
-	 * out immediately */
-
-	if (kctx_suspended) {
-		/* Finishing forcing out the context due to a suspend. Use a
-		 * variant of kbasep_js_runpool_release_ctx() that doesn't
-		 * schedule a new context, to prevent a risk of recursion back
-		 * into this function */
-		kbasep_js_runpool_release_ctx_no_schedule(kbdev, kctx);
-		return false;
-	}
-	return true;
-}
-
-static bool kbase_js_use_ctx(struct kbase_device *kbdev,
-				struct kbase_context *kctx)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	if (kbase_ctx_flag(kctx, KCTX_SCHEDULED) &&
-			kbase_backend_use_ctx_sched(kbdev, kctx)) {
-		/* Context already has ASID - mark as active */
-		kbdev->hwaccess.active_kctx = kctx;
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-		return true; /* Context already scheduled */
-	}
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	return kbasep_js_schedule_ctx(kbdev, kctx);
-}
-
-void kbasep_js_schedule_privileged_ctx(struct kbase_device *kbdev,
-		struct kbase_context *kctx)
-{
-	struct kbasep_js_kctx_info *js_kctx_info;
-	struct kbasep_js_device_data *js_devdata;
-	bool is_scheduled;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-
-	js_devdata = &kbdev->js_data;
-	js_kctx_info = &kctx->jctx.sched_info;
-
-	/* This must never be attempted whilst suspending - i.e. it should only
-	 * happen in response to a syscall from a user-space thread */
-	BUG_ON(kbase_pm_is_suspending(kbdev));
-
-	mutex_lock(&js_devdata->queue_mutex);
-	mutex_lock(&js_kctx_info->ctx.jsctx_mutex);
-
-	/* Mark the context as privileged */
-	kbase_ctx_flag_set(kctx, KCTX_PRIVILEGED);
-
-	is_scheduled = kbase_ctx_flag(kctx, KCTX_SCHEDULED);
-	if (!is_scheduled) {
-		/* Add the context to the pullable list */
-		if (kbase_js_ctx_list_add_pullable_head(kbdev, kctx, 0))
-			kbase_js_sync_timers(kbdev);
-
-		/* Fast-starting requires the jsctx_mutex to be dropped,
-		 * because it works on multiple ctxs */
-		mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
-		mutex_unlock(&js_devdata->queue_mutex);
-
-		/* Try to schedule the context in */
-		kbase_js_sched_all(kbdev);
-
-		/* Wait for the context to be scheduled in */
-		wait_event(kctx->jctx.sched_info.ctx.is_scheduled_wait,
-			   kbase_ctx_flag(kctx, KCTX_SCHEDULED));
-	} else {
-		/* Already scheduled in - We need to retain it to keep the
-		 * corresponding address space */
-		kbasep_js_runpool_retain_ctx(kbdev, kctx);
-		mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
-		mutex_unlock(&js_devdata->queue_mutex);
-	}
-}
-KBASE_EXPORT_TEST_API(kbasep_js_schedule_privileged_ctx);
-
-void kbasep_js_release_privileged_ctx(struct kbase_device *kbdev,
-		struct kbase_context *kctx)
-{
-	struct kbasep_js_kctx_info *js_kctx_info;
-
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	js_kctx_info = &kctx->jctx.sched_info;
-
-	/* We don't need to use the address space anymore */
-	mutex_lock(&js_kctx_info->ctx.jsctx_mutex);
-	kbase_ctx_flag_clear(kctx, KCTX_PRIVILEGED);
-	mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
-
-	/* Release the context - it will be scheduled out */
-	kbasep_js_runpool_release_ctx(kbdev, kctx);
-
-	kbase_js_sched_all(kbdev);
-}
-KBASE_EXPORT_TEST_API(kbasep_js_release_privileged_ctx);
-
-void kbasep_js_suspend(struct kbase_device *kbdev)
-{
-	unsigned long flags;
-	struct kbasep_js_device_data *js_devdata;
-	int i;
-	u16 retained = 0u;
-	int nr_privileged_ctx = 0;
-
-	KBASE_DEBUG_ASSERT(kbdev);
-	KBASE_DEBUG_ASSERT(kbase_pm_is_suspending(kbdev));
-	js_devdata = &kbdev->js_data;
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	/* Prevent all contexts from submitting */
-	js_devdata->runpool_irq.submit_allowed = 0;
-
-	/* Retain each of the contexts, so we can cause it to leave even if it
-	 * had no refcount to begin with */
-	for (i = BASE_MAX_NR_AS - 1; i >= 0; --i) {
-		struct kbase_context *kctx = kbdev->as_to_kctx[i];
-
-		retained = retained << 1;
-
-		if (kctx) {
-			kbase_ctx_sched_retain_ctx_refcount(kctx);
-			retained |= 1u;
-			/* We can only cope with up to 1 privileged context -
-			 * the instrumented context. It'll be suspended by
-			 * disabling instrumentation */
-			if (kbase_ctx_flag(kctx, KCTX_PRIVILEGED)) {
-				++nr_privileged_ctx;
-				WARN_ON(nr_privileged_ctx != 1);
-			}
-		}
-	}
-	CSTD_UNUSED(nr_privileged_ctx);
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	/* De-ref the previous retain to ensure each context gets pulled out
-	 * sometime later. */
-	for (i = 0;
-		 i < BASE_MAX_NR_AS;
-		 ++i, retained = retained >> 1) {
-		struct kbase_context *kctx = kbdev->as_to_kctx[i];
-
-		if (retained & 1u)
-			kbasep_js_runpool_release_ctx(kbdev, kctx);
-	}
-
-	/* Caller must wait for all Power Manager active references to be
-	 * dropped */
-}
-
-void kbasep_js_resume(struct kbase_device *kbdev)
-{
-	struct kbasep_js_device_data *js_devdata;
-	int js;
-
-	KBASE_DEBUG_ASSERT(kbdev);
-	js_devdata = &kbdev->js_data;
-	KBASE_DEBUG_ASSERT(!kbase_pm_is_suspending(kbdev));
-
-	mutex_lock(&js_devdata->queue_mutex);
-	for (js = 0; js < kbdev->gpu_props.num_job_slots; js++) {
-		struct kbase_context *kctx, *n;
-
-		list_for_each_entry_safe(kctx, n,
-				&kbdev->js_data.ctx_list_unpullable[js],
-				jctx.sched_info.ctx.ctx_list_entry[js]) {
-			struct kbasep_js_kctx_info *js_kctx_info;
-			unsigned long flags;
-			bool timer_sync = false;
-
-			js_kctx_info = &kctx->jctx.sched_info;
-
-			mutex_lock(&js_kctx_info->ctx.jsctx_mutex);
-			mutex_lock(&js_devdata->runpool_mutex);
-			spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-			if (!kbase_ctx_flag(kctx, KCTX_SCHEDULED) &&
-				kbase_js_ctx_pullable(kctx, js, false))
-				timer_sync =
-					kbase_js_ctx_list_add_pullable_nolock(
-							kbdev, kctx, js);
-			spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-			if (timer_sync)
-				kbase_backend_ctx_count_changed(kbdev);
-			mutex_unlock(&js_devdata->runpool_mutex);
-			mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
-		}
-	}
-	mutex_unlock(&js_devdata->queue_mutex);
-
-	/* Restart atom processing */
-	kbase_js_sched_all(kbdev);
-
-	/* JS Resume complete */
-}
-
-bool kbase_js_is_atom_valid(struct kbase_device *kbdev,
-				struct kbase_jd_atom *katom)
-{
-	if ((katom->core_req & BASE_JD_REQ_FS) &&
-	    (katom->core_req & (BASE_JD_REQ_CS | BASE_JD_REQ_ONLY_COMPUTE |
-								BASE_JD_REQ_T)))
-		return false;
-
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8987) &&
-	    (katom->core_req & BASE_JD_REQ_ONLY_COMPUTE) &&
-	    (katom->core_req & (BASE_JD_REQ_CS | BASE_JD_REQ_T)))
-		return false;
-
-	return true;
-}
-
-static int kbase_js_get_slot(struct kbase_device *kbdev,
-				struct kbase_jd_atom *katom)
-{
-	if (katom->core_req & BASE_JD_REQ_FS)
-		return 0;
-
-	if (katom->core_req & BASE_JD_REQ_ONLY_COMPUTE) {
-		if (katom->device_nr == 1 &&
-				kbdev->gpu_props.num_core_groups == 2)
-			return 2;
-		if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8987))
-			return 2;
-	}
-
-	return 1;
-}
-
-bool kbase_js_dep_resolved_submit(struct kbase_context *kctx,
-					struct kbase_jd_atom *katom)
-{
-	bool enqueue_required;
-
-	katom->slot_nr = kbase_js_get_slot(kctx->kbdev, katom);
-
-	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
-	lockdep_assert_held(&kctx->jctx.lock);
-
-	/* If slot will transition from unpullable to pullable then add to
-	 * pullable list */
-	if (jsctx_rb_none_to_pull(kctx, katom->slot_nr)) {
-		enqueue_required = true;
-	} else {
-		enqueue_required = false;
-	}
-	if ((katom->atom_flags & KBASE_KATOM_FLAG_X_DEP_BLOCKED) ||
-			(katom->pre_dep && (katom->pre_dep->atom_flags &
-			KBASE_KATOM_FLAG_JSCTX_IN_X_DEP_LIST))) {
-		int prio = katom->sched_priority;
-		int js = katom->slot_nr;
-		struct jsctx_queue *queue = &kctx->jsctx_queue[prio][js];
-
-		list_add_tail(&katom->queue, &queue->x_dep_head);
-		katom->atom_flags |= KBASE_KATOM_FLAG_JSCTX_IN_X_DEP_LIST;
-		enqueue_required = false;
-	} else {
-		/* Check if there are lower priority jobs to soft stop */
-		kbase_job_slot_ctx_priority_check_locked(kctx, katom);
-
-		/* Add atom to ring buffer. */
-		jsctx_tree_add(kctx, katom);
-		katom->atom_flags |= KBASE_KATOM_FLAG_JSCTX_IN_TREE;
-	}
-
-	return enqueue_required;
-}
-
-/**
- * kbase_js_move_to_tree - Move atom (and any dependent atoms) to the
- *                         runnable_tree, ready for execution
- * @katom: Atom to submit
- *
- * It is assumed that @katom does not have KBASE_KATOM_FLAG_X_DEP_BLOCKED set,
- * but is still present in the x_dep list. If @katom has a same-slot dependent
- * atom then that atom (and any dependents) will also be moved.
- */
-static void kbase_js_move_to_tree(struct kbase_jd_atom *katom)
-{
-	lockdep_assert_held(&katom->kctx->kbdev->hwaccess_lock);
-
-	while (katom) {
-		WARN_ON(!(katom->atom_flags &
-				KBASE_KATOM_FLAG_JSCTX_IN_X_DEP_LIST));
-
-		if (!(katom->atom_flags & KBASE_KATOM_FLAG_X_DEP_BLOCKED)) {
-			list_del(&katom->queue);
-			katom->atom_flags &=
-					~KBASE_KATOM_FLAG_JSCTX_IN_X_DEP_LIST;
-			jsctx_tree_add(katom->kctx, katom);
-			katom->atom_flags |= KBASE_KATOM_FLAG_JSCTX_IN_TREE;
-		} else {
-			break;
-		}
-
-		katom = katom->post_dep;
-	}
-}
-
-
-/**
- * kbase_js_evict_deps - Evict dependencies of a failed atom.
- * @kctx:       Context pointer
- * @katom:      Pointer to the atom that has failed.
- * @js:         The job slot the katom was run on.
- * @prio:       Priority of the katom.
- *
- * Remove all post dependencies of an atom from the context ringbuffers.
- *
- * The original atom's event_code will be propogated to all dependent atoms.
- *
- * Context: Caller must hold the HW access lock
- */
-static void kbase_js_evict_deps(struct kbase_context *kctx,
-				struct kbase_jd_atom *katom, int js, int prio)
-{
-	struct kbase_jd_atom *x_dep = katom->x_post_dep;
-	struct kbase_jd_atom *next_katom = katom->post_dep;
-
-	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
-
-	if (next_katom) {
-		KBASE_DEBUG_ASSERT(next_katom->status !=
-				KBASE_JD_ATOM_STATE_HW_COMPLETED);
-		next_katom->will_fail_event_code = katom->event_code;
-
-	}
-
-	/* Has cross slot depenency. */
-	if (x_dep && (x_dep->atom_flags & (KBASE_KATOM_FLAG_JSCTX_IN_TREE |
-				KBASE_KATOM_FLAG_JSCTX_IN_X_DEP_LIST))) {
-		/* Remove dependency.*/
-		x_dep->atom_flags &= ~KBASE_KATOM_FLAG_X_DEP_BLOCKED;
-
-		/* Fail if it had a data dependency. */
-		if (x_dep->atom_flags & KBASE_KATOM_FLAG_FAIL_BLOCKER) {
-			x_dep->will_fail_event_code = katom->event_code;
-		}
-		if (x_dep->atom_flags & KBASE_KATOM_FLAG_JSCTX_IN_X_DEP_LIST)
-			kbase_js_move_to_tree(x_dep);
-	}
-}
-
-struct kbase_jd_atom *kbase_js_pull(struct kbase_context *kctx, int js)
-{
-	struct kbase_jd_atom *katom;
-	struct kbasep_js_device_data *js_devdata;
-	struct kbase_device *kbdev;
-	int pulled;
-
-	KBASE_DEBUG_ASSERT(kctx);
-
-	kbdev = kctx->kbdev;
-
-	js_devdata = &kbdev->js_data;
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	if (!kbasep_js_is_submit_allowed(js_devdata, kctx))
-		return NULL;
-	if (kbase_pm_is_suspending(kbdev))
-		return NULL;
-
-	katom = jsctx_rb_peek(kctx, js);
-	if (!katom)
-		return NULL;
-	if (kctx->blocked_js[js][katom->sched_priority])
-		return NULL;
-	if (atomic_read(&katom->blocked))
-		return NULL;
-
-	/* Due to ordering restrictions when unpulling atoms on failure, we do
-	 * not allow multiple runs of fail-dep atoms from the same context to be
-	 * present on the same slot */
-	if (katom->pre_dep && atomic_read(&kctx->atoms_pulled_slot[js])) {
-		struct kbase_jd_atom *prev_atom =
-				kbase_backend_inspect_tail(kbdev, js);
-
-		if (prev_atom && prev_atom->kctx != kctx)
-			return NULL;
-	}
-
-	if (katom->atom_flags & KBASE_KATOM_FLAG_X_DEP_BLOCKED) {
-		if (katom->x_pre_dep->gpu_rb_state ==
-					KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB ||
-					katom->x_pre_dep->will_fail_event_code)
-			return NULL;
-		if ((katom->atom_flags & KBASE_KATOM_FLAG_FAIL_BLOCKER) &&
-				kbase_backend_nr_atoms_on_slot(kbdev, js))
-			return NULL;
-	}
-
-	kbase_ctx_flag_set(kctx, KCTX_PULLED);
-
-	pulled = atomic_inc_return(&kctx->atoms_pulled);
-	if (pulled == 1 && !kctx->slots_pullable) {
-		WARN_ON(kbase_ctx_flag(kctx, KCTX_RUNNABLE_REF));
-		kbase_ctx_flag_set(kctx, KCTX_RUNNABLE_REF);
-		atomic_inc(&kbdev->js_data.nr_contexts_runnable);
-	}
-	atomic_inc(&kctx->atoms_pulled_slot[katom->slot_nr]);
-	kctx->atoms_pulled_slot_pri[katom->slot_nr][katom->sched_priority]++;
-	jsctx_rb_pull(kctx, katom);
-
-	kbasep_js_runpool_retain_ctx_nolock(kbdev, kctx);
-
-	katom->atom_flags |= KBASE_KATOM_FLAG_HOLDING_CTX_REF;
-
-	katom->ticks = 0;
-
-	return katom;
-}
-
-
-static void js_return_worker(struct work_struct *data)
-{
-	struct kbase_jd_atom *katom = container_of(data, struct kbase_jd_atom,
-									work);
-	struct kbase_context *kctx = katom->kctx;
-	struct kbase_device *kbdev = kctx->kbdev;
-	struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
-	struct kbasep_js_kctx_info *js_kctx_info = &kctx->jctx.sched_info;
-	struct kbasep_js_atom_retained_state retained_state;
-	int js = katom->slot_nr;
-	int prio = katom->sched_priority;
-	bool timer_sync = false;
-	bool context_idle = false;
-	unsigned long flags;
-	base_jd_core_req core_req = katom->core_req;
-	u64 affinity = katom->affinity;
-	enum kbase_atom_coreref_state coreref_state = katom->coreref_state;
-
-	KBASE_TLSTREAM_TL_EVENT_ATOM_SOFTSTOP_EX(katom);
-
-	kbase_backend_complete_wq(kbdev, katom);
-
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8316))
-		kbase_as_poking_timer_release_atom(kbdev, kctx, katom);
-
-	kbasep_js_atom_retained_state_copy(&retained_state, katom);
-
-	mutex_lock(&js_devdata->queue_mutex);
-	mutex_lock(&js_kctx_info->ctx.jsctx_mutex);
-
-	atomic_dec(&kctx->atoms_pulled);
-	atomic_dec(&kctx->atoms_pulled_slot[js]);
-
-	atomic_dec(&katom->blocked);
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	kctx->atoms_pulled_slot_pri[js][katom->sched_priority]--;
-
-	if (!atomic_read(&kctx->atoms_pulled_slot[js]) &&
-			jsctx_rb_none_to_pull(kctx, js))
-		timer_sync |= kbase_js_ctx_list_remove_nolock(kbdev, kctx, js);
-
-	/* If this slot has been blocked due to soft-stopped atoms, and all
-	 * atoms have now been processed, then unblock the slot */
-	if (!kctx->atoms_pulled_slot_pri[js][prio] &&
-			kctx->blocked_js[js][prio]) {
-		kctx->blocked_js[js][prio] = false;
-
-		/* Only mark the slot as pullable if the context is not idle -
-		 * that case is handled below */
-		if (atomic_read(&kctx->atoms_pulled) &&
-				kbase_js_ctx_pullable(kctx, js, true))
-			timer_sync |= kbase_js_ctx_list_add_pullable_nolock(
-					kbdev, kctx, js);
-	}
-
-	if (!atomic_read(&kctx->atoms_pulled)) {
-		if (!kctx->slots_pullable) {
-			WARN_ON(!kbase_ctx_flag(kctx, KCTX_RUNNABLE_REF));
-			kbase_ctx_flag_clear(kctx, KCTX_RUNNABLE_REF);
-			atomic_dec(&kbdev->js_data.nr_contexts_runnable);
-			timer_sync = true;
-		}
-
-		if (kctx->as_nr != KBASEP_AS_NR_INVALID &&
-				!kbase_ctx_flag(kctx, KCTX_DYING)) {
-			int num_slots = kbdev->gpu_props.num_job_slots;
-			int slot;
-
-			if (!kbasep_js_is_submit_allowed(js_devdata, kctx))
-				kbasep_js_set_submit_allowed(js_devdata, kctx);
-
-			for (slot = 0; slot < num_slots; slot++) {
-				if (kbase_js_ctx_pullable(kctx, slot, true))
-					timer_sync |=
-					kbase_js_ctx_list_add_pullable_nolock(
-							kbdev, kctx, slot);
-			}
-		}
-
-		kbase_jm_idle_ctx(kbdev, kctx);
-
-		context_idle = true;
-	}
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	if (context_idle) {
-		WARN_ON(!kbase_ctx_flag(kctx, KCTX_ACTIVE));
-		kbase_ctx_flag_clear(kctx, KCTX_ACTIVE);
-		kbase_pm_context_idle(kbdev);
-	}
-
-	if (timer_sync)
-		kbase_js_sync_timers(kbdev);
-
-	mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
-	mutex_unlock(&js_devdata->queue_mutex);
-
-	katom->atom_flags &= ~KBASE_KATOM_FLAG_HOLDING_CTX_REF;
-	kbasep_js_runpool_release_ctx_and_katom_retained_state(kbdev, kctx,
-							&retained_state);
-
-	kbase_js_sched_all(kbdev);
-
-	kbase_backend_complete_wq_post_sched(kbdev, core_req, affinity,
-			coreref_state);
-}
-
-void kbase_js_unpull(struct kbase_context *kctx, struct kbase_jd_atom *katom)
-{
-	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
-
-	jsctx_rb_unpull(kctx, katom);
-
-	WARN_ON(work_pending(&katom->work));
-
-	/* Block re-submission until workqueue has run */
-	atomic_inc(&katom->blocked);
-
-	kbase_job_check_leave_disjoint(kctx->kbdev, katom);
-
-	KBASE_DEBUG_ASSERT(0 == object_is_on_stack(&katom->work));
-	INIT_WORK(&katom->work, js_return_worker);
-	queue_work(kctx->jctx.job_done_wq, &katom->work);
-}
-
-bool kbase_js_complete_atom_wq(struct kbase_context *kctx,
-						struct kbase_jd_atom *katom)
-{
-	struct kbasep_js_kctx_info *js_kctx_info;
-	struct kbasep_js_device_data *js_devdata;
-	struct kbase_device *kbdev;
-	unsigned long flags;
-	bool timer_sync = false;
-	int atom_slot;
-	bool context_idle = false;
-	int prio = katom->sched_priority;
-
-	kbdev = kctx->kbdev;
-	atom_slot = katom->slot_nr;
-
-	js_kctx_info = &kctx->jctx.sched_info;
-	js_devdata = &kbdev->js_data;
-
-	lockdep_assert_held(&js_kctx_info->ctx.jsctx_mutex);
-
-	mutex_lock(&js_devdata->runpool_mutex);
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	if (katom->atom_flags & KBASE_KATOM_FLAG_JSCTX_IN_TREE) {
-		context_idle = !atomic_dec_return(&kctx->atoms_pulled);
-		atomic_dec(&kctx->atoms_pulled_slot[atom_slot]);
-		kctx->atoms_pulled_slot_pri[atom_slot][prio]--;
-
-		if (!atomic_read(&kctx->atoms_pulled) &&
-				!kctx->slots_pullable) {
-			WARN_ON(!kbase_ctx_flag(kctx, KCTX_RUNNABLE_REF));
-			kbase_ctx_flag_clear(kctx, KCTX_RUNNABLE_REF);
-			atomic_dec(&kbdev->js_data.nr_contexts_runnable);
-			timer_sync = true;
-		}
-
-		/* If this slot has been blocked due to soft-stopped atoms, and
-		 * all atoms have now been processed, then unblock the slot */
-		if (!kctx->atoms_pulled_slot_pri[atom_slot][prio]
-				&& kctx->blocked_js[atom_slot][prio]) {
-			kctx->blocked_js[atom_slot][prio] = false;
-			if (kbase_js_ctx_pullable(kctx, atom_slot, true))
-				timer_sync |=
-					kbase_js_ctx_list_add_pullable_nolock(
-						kbdev, kctx, atom_slot);
-		}
-	}
-	WARN_ON(!(katom->atom_flags & KBASE_KATOM_FLAG_JSCTX_IN_TREE));
-
-	if (!atomic_read(&kctx->atoms_pulled_slot[atom_slot]) &&
-			jsctx_rb_none_to_pull(kctx, atom_slot)) {
-		if (!list_empty(
-			&kctx->jctx.sched_info.ctx.ctx_list_entry[atom_slot]))
-			timer_sync |= kbase_js_ctx_list_remove_nolock(
-					kctx->kbdev, kctx, atom_slot);
-	}
-
-	/*
-	 * If submission is disabled on this context (most likely due to an
-	 * atom failure) and there are now no atoms left in the system then
-	 * re-enable submission so that context can be scheduled again.
-	 */
-	if (!kbasep_js_is_submit_allowed(js_devdata, kctx) &&
-					!atomic_read(&kctx->atoms_pulled) &&
-					!kbase_ctx_flag(kctx, KCTX_DYING)) {
-		int js;
-
-		kbasep_js_set_submit_allowed(js_devdata, kctx);
-
-		for (js = 0; js < kbdev->gpu_props.num_job_slots; js++) {
-			if (kbase_js_ctx_pullable(kctx, js, true))
-				timer_sync |=
-					kbase_js_ctx_list_add_pullable_nolock(
-							kbdev, kctx, js);
-		}
-	} else if (katom->x_post_dep &&
-			kbasep_js_is_submit_allowed(js_devdata, kctx)) {
-		int js;
-
-		for (js = 0; js < kbdev->gpu_props.num_job_slots; js++) {
-			if (kbase_js_ctx_pullable(kctx, js, true))
-				timer_sync |=
-					kbase_js_ctx_list_add_pullable_nolock(
-							kbdev, kctx, js);
-		}
-	}
-
-	/* Mark context as inactive. The pm reference will be dropped later in
-	 * jd_done_worker().
-	 */
-	if (context_idle)
-		kbase_ctx_flag_clear(kctx, KCTX_ACTIVE);
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-	if (timer_sync)
-		kbase_backend_ctx_count_changed(kbdev);
-	mutex_unlock(&js_devdata->runpool_mutex);
-
-	return context_idle;
-}
-
-struct kbase_jd_atom *kbase_js_complete_atom(struct kbase_jd_atom *katom,
-		ktime_t *end_timestamp)
-{
-	struct kbase_device *kbdev;
-	struct kbase_context *kctx = katom->kctx;
-	struct kbase_jd_atom *x_dep = katom->x_post_dep;
-
-	kbdev = kctx->kbdev;
-
-
-	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
-
-	if (katom->will_fail_event_code)
-		katom->event_code = katom->will_fail_event_code;
-
-	katom->status = KBASE_JD_ATOM_STATE_HW_COMPLETED;
-
-	if (katom->event_code != BASE_JD_EVENT_DONE) {
-		kbase_js_evict_deps(kctx, katom, katom->slot_nr,
-				katom->sched_priority);
-	}
-
-#if defined(CONFIG_MALI_BIFROST_GATOR_SUPPORT)
-	kbase_trace_mali_job_slots_event(GATOR_MAKE_EVENT(GATOR_JOB_SLOT_STOP,
-				katom->slot_nr), NULL, 0);
-#endif
-
-	kbase_jd_done(katom, katom->slot_nr, end_timestamp, 0);
-
-	/* Unblock cross dependency if present */
-	if (x_dep && (katom->event_code == BASE_JD_EVENT_DONE ||
-			!(x_dep->atom_flags & KBASE_KATOM_FLAG_FAIL_BLOCKER)) &&
-			(x_dep->atom_flags & KBASE_KATOM_FLAG_X_DEP_BLOCKED)) {
-		bool was_pullable = kbase_js_ctx_pullable(kctx, x_dep->slot_nr,
-				false);
-		x_dep->atom_flags &= ~KBASE_KATOM_FLAG_X_DEP_BLOCKED;
-		kbase_js_move_to_tree(x_dep);
-		if (!was_pullable && kbase_js_ctx_pullable(kctx, x_dep->slot_nr,
-				false))
-			kbase_js_ctx_list_add_pullable_nolock(kbdev, kctx,
-					x_dep->slot_nr);
-
-		if (x_dep->atom_flags & KBASE_KATOM_FLAG_JSCTX_IN_TREE)
-			return x_dep;
-	}
-
-	return NULL;
-}
-
-void kbase_js_sched(struct kbase_device *kbdev, int js_mask)
-{
-	struct kbasep_js_device_data *js_devdata;
-	struct kbase_context *last_active;
-	bool timer_sync = false;
-	bool ctx_waiting = false;
-
-	js_devdata = &kbdev->js_data;
-
-	down(&js_devdata->schedule_sem);
-	mutex_lock(&js_devdata->queue_mutex);
-
-	last_active = kbdev->hwaccess.active_kctx;
-
-	while (js_mask) {
-		int js;
-
-		js = ffs(js_mask) - 1;
-
-		while (1) {
-			struct kbase_context *kctx;
-			unsigned long flags;
-			bool context_idle = false;
-
-			kctx = kbase_js_ctx_list_pop_head(kbdev, js);
-
-			if (!kctx) {
-				js_mask &= ~(1 << js);
-				break; /* No contexts on pullable list */
-			}
-
-			if (!kbase_ctx_flag(kctx, KCTX_ACTIVE)) {
-				context_idle = true;
-
-				if (kbase_pm_context_active_handle_suspend(
-									kbdev,
-				      KBASE_PM_SUSPEND_HANDLER_DONT_INCREASE)) {
-					/* Suspend pending - return context to
-					 * queue and stop scheduling */
-					mutex_lock(
-					&kctx->jctx.sched_info.ctx.jsctx_mutex);
-					if (kbase_js_ctx_list_add_pullable_head(
-						kctx->kbdev, kctx, js))
-						kbase_js_sync_timers(kbdev);
-					mutex_unlock(
-					&kctx->jctx.sched_info.ctx.jsctx_mutex);
-					mutex_unlock(&js_devdata->queue_mutex);
-					up(&js_devdata->schedule_sem);
-					return;
-				}
-				kbase_ctx_flag_set(kctx, KCTX_ACTIVE);
-			}
-
-			if (!kbase_js_use_ctx(kbdev, kctx)) {
-				mutex_lock(
-					&kctx->jctx.sched_info.ctx.jsctx_mutex);
-				/* Context can not be used at this time */
-				spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-				if (kbase_js_ctx_pullable(kctx, js, false)
-				    || kbase_ctx_flag(kctx, KCTX_PRIVILEGED))
-					timer_sync |=
-					kbase_js_ctx_list_add_pullable_head_nolock(
-							kctx->kbdev, kctx, js);
-				else
-					timer_sync |=
-					kbase_js_ctx_list_add_unpullable_nolock(
-							kctx->kbdev, kctx, js);
-				spin_unlock_irqrestore(&kbdev->hwaccess_lock,
-						flags);
-				mutex_unlock(
-					&kctx->jctx.sched_info.ctx.jsctx_mutex);
-				if (context_idle) {
-					WARN_ON(!kbase_ctx_flag(kctx, KCTX_ACTIVE));
-					kbase_ctx_flag_clear(kctx, KCTX_ACTIVE);
-					kbase_pm_context_idle(kbdev);
-				}
-
-				/* No more jobs can be submitted on this slot */
-				js_mask &= ~(1 << js);
-				break;
-			}
-			mutex_lock(&kctx->jctx.sched_info.ctx.jsctx_mutex);
-			spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-			kbase_ctx_flag_clear(kctx, KCTX_PULLED);
-
-			if (!kbase_jm_kick(kbdev, 1 << js))
-				/* No more jobs can be submitted on this slot */
-				js_mask &= ~(1 << js);
-
-			if (!kbase_ctx_flag(kctx, KCTX_PULLED)) {
-				bool pullable = kbase_js_ctx_pullable(kctx, js,
-						true);
-
-				/* Failed to pull jobs - push to head of list.
-				 * Unless this context is already 'active', in
-				 * which case it's effectively already scheduled
-				 * so push it to the back of the list. */
-				if (pullable && kctx == last_active)
-					timer_sync |=
-					kbase_js_ctx_list_add_pullable_nolock(
-							kctx->kbdev,
-							kctx, js);
-				else if (pullable)
-					timer_sync |=
-					kbase_js_ctx_list_add_pullable_head_nolock(
-							kctx->kbdev,
-							kctx, js);
-				else
-					timer_sync |=
-					kbase_js_ctx_list_add_unpullable_nolock(
-								kctx->kbdev,
-								kctx, js);
-
-				/* If this context is not the active context,
-				 * but the active context is pullable on this
-				 * slot, then we need to remove the active
-				 * marker to prevent it from submitting atoms in
-				 * the IRQ handler, which would prevent this
-				 * context from making progress. */
-				if (last_active && kctx != last_active &&
-						kbase_js_ctx_pullable(
-						last_active, js, true))
-					ctx_waiting = true;
-
-				if (context_idle) {
-					kbase_jm_idle_ctx(kbdev, kctx);
-					spin_unlock_irqrestore(
-							&kbdev->hwaccess_lock,
-							flags);
-					WARN_ON(!kbase_ctx_flag(kctx, KCTX_ACTIVE));
-					kbase_ctx_flag_clear(kctx, KCTX_ACTIVE);
-					kbase_pm_context_idle(kbdev);
-				} else {
-					spin_unlock_irqrestore(
-							&kbdev->hwaccess_lock,
-							flags);
-				}
-				mutex_unlock(
-					&kctx->jctx.sched_info.ctx.jsctx_mutex);
-
-				js_mask &= ~(1 << js);
-				break; /* Could not run atoms on this slot */
-			}
-
-			/* Push to back of list */
-			if (kbase_js_ctx_pullable(kctx, js, true))
-				timer_sync |=
-					kbase_js_ctx_list_add_pullable_nolock(
-							kctx->kbdev, kctx, js);
-			else
-				timer_sync |=
-					kbase_js_ctx_list_add_unpullable_nolock(
-							kctx->kbdev, kctx, js);
-
-			spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-			mutex_unlock(&kctx->jctx.sched_info.ctx.jsctx_mutex);
-		}
-	}
-
-	if (timer_sync)
-		kbase_js_sync_timers(kbdev);
-
-	if (kbdev->hwaccess.active_kctx == last_active && ctx_waiting)
-		kbdev->hwaccess.active_kctx = NULL;
-
-	mutex_unlock(&js_devdata->queue_mutex);
-	up(&js_devdata->schedule_sem);
-}
-
-void kbase_js_zap_context(struct kbase_context *kctx)
-{
-	struct kbase_device *kbdev = kctx->kbdev;
-	struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
-	struct kbasep_js_kctx_info *js_kctx_info = &kctx->jctx.sched_info;
-	int js;
-
-	/*
-	 * Critical assumption: No more submission is possible outside of the
-	 * workqueue. This is because the OS *must* prevent U/K calls (IOCTLs)
-	 * whilst the struct kbase_context is terminating.
-	 */
-
-	/* First, atomically do the following:
-	 * - mark the context as dying
-	 * - try to evict it from the queue */
-	mutex_lock(&kctx->jctx.lock);
-	mutex_lock(&js_devdata->queue_mutex);
-	mutex_lock(&js_kctx_info->ctx.jsctx_mutex);
-	kbase_ctx_flag_set(kctx, KCTX_DYING);
-
-	dev_dbg(kbdev->dev, "Zap: Try Evict Ctx %p", kctx);
-
-	/*
-	 * At this point we know:
-	 * - If eviction succeeded, it was in the queue, but now no
-	 *   longer is
-	 *  - We must cancel the jobs here. No Power Manager active reference to
-	 *    release.
-	 *  - This happens asynchronously - kbase_jd_zap_context() will wait for
-	 *    those jobs to be killed.
-	 * - If eviction failed, then it wasn't in the queue. It is one
-	 *   of the following:
-	 *  - a. it didn't have any jobs, and so is not in the Queue or
-	 *       the Run Pool (not scheduled)
-	 *   - Hence, no more work required to cancel jobs. No Power Manager
-	 *     active reference to release.
-	 *  - b. it was in the middle of a scheduling transaction (and thus must
-	 *       have at least 1 job). This can happen from a syscall or a
-	 *       kernel thread. We still hold the jsctx_mutex, and so the thread
-	 *       must be waiting inside kbasep_js_try_schedule_head_ctx(),
-	 *       before checking whether the runpool is full. That thread will
-	 *       continue after we drop the mutex, and will notice the context
-	 *       is dying. It will rollback the transaction, killing all jobs at
-	 *       the same time. kbase_jd_zap_context() will wait for those jobs
-	 *       to be killed.
-	 *   - Hence, no more work required to cancel jobs, or to release the
-	 *     Power Manager active reference.
-	 *  - c. it is scheduled, and may or may not be running jobs
-	 * - We must cause it to leave the runpool by stopping it from
-	 * submitting any more jobs. When it finally does leave,
-	 * kbasep_js_runpool_requeue_or_kill_ctx() will kill all remaining jobs
-	 * (because it is dying), release the Power Manager active reference,
-	 * and will not requeue the context in the queue.
-	 * kbase_jd_zap_context() will wait for those jobs to be killed.
-	 *  - Hence, work required just to make it leave the runpool. Cancelling
-	 *    jobs and releasing the Power manager active reference will be
-	 *    handled when it leaves the runpool.
-	 */
-	if (!kbase_ctx_flag(kctx, KCTX_SCHEDULED)) {
-		for (js = 0; js < kbdev->gpu_props.num_job_slots; js++) {
-			if (!list_empty(
-				&kctx->jctx.sched_info.ctx.ctx_list_entry[js]))
-				list_del_init(
-				&kctx->jctx.sched_info.ctx.ctx_list_entry[js]);
-		}
-
-		/* The following events require us to kill off remaining jobs
-		 * and update PM book-keeping:
-		 * - we evicted it correctly (it must have jobs to be in the
-		 *   Queue)
-		 *
-		 * These events need no action, but take this path anyway:
-		 * - Case a: it didn't have any jobs, and was never in the Queue
-		 * - Case b: scheduling transaction will be partially rolled-
-		 *           back (this already cancels the jobs)
-		 */
-
-		KBASE_TRACE_ADD(kbdev, JM_ZAP_NON_SCHEDULED, kctx, NULL, 0u,
-						kbase_ctx_flag(kctx, KCTX_SCHEDULED));
-
-		dev_dbg(kbdev->dev, "Zap: Ctx %p scheduled=0", kctx);
-
-		/* Only cancel jobs when we evicted from the
-		 * queue. No Power Manager active reference was held.
-		 *
-		 * Having is_dying set ensures that this kills, and
-		 * doesn't requeue */
-		kbasep_js_runpool_requeue_or_kill_ctx(kbdev, kctx, false);
-
-		mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
-		mutex_unlock(&js_devdata->queue_mutex);
-		mutex_unlock(&kctx->jctx.lock);
-	} else {
-		unsigned long flags;
-		bool was_retained;
-
-		/* Case c: didn't evict, but it is scheduled - it's in the Run
-		 * Pool */
-		KBASE_TRACE_ADD(kbdev, JM_ZAP_SCHEDULED, kctx, NULL, 0u,
-						kbase_ctx_flag(kctx, KCTX_SCHEDULED));
-		dev_dbg(kbdev->dev, "Zap: Ctx %p is in RunPool", kctx);
-
-		/* Disable the ctx from submitting any more jobs */
-		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-		kbasep_js_clear_submit_allowed(js_devdata, kctx);
-
-		/* Retain and (later) release the context whilst it is is now
-		 * disallowed from submitting jobs - ensures that someone
-		 * somewhere will be removing the context later on */
-		was_retained = kbasep_js_runpool_retain_ctx_nolock(kbdev, kctx);
-
-		/* Since it's scheduled and we have the jsctx_mutex, it must be
-		 * retained successfully */
-		KBASE_DEBUG_ASSERT(was_retained);
-
-		dev_dbg(kbdev->dev, "Zap: Ctx %p Kill Any Running jobs", kctx);
-
-		/* Cancel any remaining running jobs for this kctx - if any.
-		 * Submit is disallowed which takes effect immediately, so no
-		 * more new jobs will appear after we do this. */
-		for (js = 0; js < kbdev->gpu_props.num_job_slots; js++)
-			kbase_job_slot_hardstop(kctx, js, NULL);
-
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-		mutex_unlock(&js_kctx_info->ctx.jsctx_mutex);
-		mutex_unlock(&js_devdata->queue_mutex);
-		mutex_unlock(&kctx->jctx.lock);
-
-		dev_dbg(kbdev->dev, "Zap: Ctx %p Release (may or may not schedule out immediately)",
-									kctx);
-
-		kbasep_js_runpool_release_ctx(kbdev, kctx);
-	}
-
-	KBASE_TRACE_ADD(kbdev, JM_ZAP_DONE, kctx, NULL, 0u, 0u);
-
-	/* After this, you must wait on both the
-	 * kbase_jd_context::zero_jobs_wait and the
-	 * kbasep_js_kctx_info::ctx::is_scheduled_waitq - to wait for the jobs
-	 * to be destroyed, and the context to be de-scheduled (if it was on the
-	 * runpool).
-	 *
-	 * kbase_jd_zap_context() will do this. */
-}
-
-static inline int trace_get_refcnt(struct kbase_device *kbdev,
-					struct kbase_context *kctx)
-{
-	return atomic_read(&kctx->refcount);
-}
-
-/**
- * kbase_js_foreach_ctx_job(): - Call a function on all jobs in context
- * @kctx:     Pointer to context.
- * @callback: Pointer to function to call for each job.
- *
- * Call a function on all jobs belonging to a non-queued, non-running
- * context, and detach the jobs from the context as it goes.
- *
- * Due to the locks that might be held at the time of the call, the callback
- * may need to defer work on a workqueue to complete its actions (e.g. when
- * cancelling jobs)
- *
- * Atoms will be removed from the queue, so this must only be called when
- * cancelling jobs (which occurs as part of context destruction).
- *
- * The locking conditions on the caller are as follows:
- * - it will be holding kbasep_js_kctx_info::ctx::jsctx_mutex.
- */
-static void kbase_js_foreach_ctx_job(struct kbase_context *kctx,
-		kbasep_js_ctx_job_cb callback)
-{
-	struct kbase_device *kbdev;
-	unsigned long flags;
-	u32 js;
-
-	kbdev = kctx->kbdev;
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-	KBASE_TRACE_ADD_REFCOUNT(kbdev, JS_POLICY_FOREACH_CTX_JOBS, kctx, NULL,
-					0u, trace_get_refcnt(kbdev, kctx));
-
-	/* Invoke callback on jobs on each slot in turn */
-	for (js = 0; js < kbdev->gpu_props.num_job_slots; js++)
-		jsctx_queue_foreach(kctx, js, callback);
-
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js.h
deleted file mode 100644
index ddada8e468a1..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js.h
+++ /dev/null
@@ -1,925 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/**
- * @file mali_kbase_js.h
- * Job Scheduler APIs.
- */
-
-#ifndef _KBASE_JS_H_
-#define _KBASE_JS_H_
-
-#include "mali_kbase_js_defs.h"
-#include "mali_kbase_context.h"
-#include "mali_kbase_defs.h"
-#include "mali_kbase_debug.h"
-
-#include "mali_kbase_js_ctx_attr.h"
-
-/**
- * @addtogroup base_api
- * @{
- */
-
-/**
- * @addtogroup base_kbase_api
- * @{
- */
-
-/**
- * @addtogroup kbase_js Job Scheduler Internal APIs
- * @{
- *
- * These APIs are Internal to KBase.
- */
-
-/**
- * @brief Initialize the Job Scheduler
- *
- * The struct kbasep_js_device_data sub-structure of \a kbdev must be zero
- * initialized before passing to the kbasep_js_devdata_init() function. This is
- * to give efficient error path code.
- */
-int kbasep_js_devdata_init(struct kbase_device * const kbdev);
-
-/**
- * @brief Halt the Job Scheduler.
- *
- * It is safe to call this on \a kbdev even if it the kbasep_js_device_data
- * sub-structure was never initialized/failed initialization, to give efficient
- * error-path code.
- *
- * For this to work, the struct kbasep_js_device_data sub-structure of \a kbdev must
- * be zero initialized before passing to the kbasep_js_devdata_init()
- * function. This is to give efficient error path code.
- *
- * It is a Programming Error to call this whilst there are still kbase_context
- * structures registered with this scheduler.
- *
- */
-void kbasep_js_devdata_halt(struct kbase_device *kbdev);
-
-/**
- * @brief Terminate the Job Scheduler
- *
- * It is safe to call this on \a kbdev even if it the kbasep_js_device_data
- * sub-structure was never initialized/failed initialization, to give efficient
- * error-path code.
- *
- * For this to work, the struct kbasep_js_device_data sub-structure of \a kbdev must
- * be zero initialized before passing to the kbasep_js_devdata_init()
- * function. This is to give efficient error path code.
- *
- * It is a Programming Error to call this whilst there are still kbase_context
- * structures registered with this scheduler.
- */
-void kbasep_js_devdata_term(struct kbase_device *kbdev);
-
-/**
- * @brief Initialize the Scheduling Component of a struct kbase_context on the Job Scheduler.
- *
- * This effectively registers a struct kbase_context with a Job Scheduler.
- *
- * It does not register any jobs owned by the struct kbase_context with the scheduler.
- * Those must be separately registered by kbasep_js_add_job().
- *
- * The struct kbase_context must be zero intitialized before passing to the
- * kbase_js_init() function. This is to give efficient error path code.
- */
-int kbasep_js_kctx_init(struct kbase_context * const kctx);
-
-/**
- * @brief Terminate the Scheduling Component of a struct kbase_context on the Job Scheduler
- *
- * This effectively de-registers a struct kbase_context from its Job Scheduler
- *
- * It is safe to call this on a struct kbase_context that has never had or failed
- * initialization of its jctx.sched_info member, to give efficient error-path
- * code.
- *
- * For this to work, the struct kbase_context must be zero intitialized before passing
- * to the kbase_js_init() function.
- *
- * It is a Programming Error to call this whilst there are still jobs
- * registered with this context.
- */
-void kbasep_js_kctx_term(struct kbase_context *kctx);
-
-/**
- * @brief Add a job chain to the Job Scheduler, and take necessary actions to
- * schedule the context/run the job.
- *
- * This atomically does the following:
- * - Update the numbers of jobs information
- * - Add the job to the run pool if necessary (part of init_job)
- *
- * Once this is done, then an appropriate action is taken:
- * - If the ctx is scheduled, it attempts to start the next job (which might be
- * this added job)
- * - Otherwise, and if this is the first job on the context, it enqueues it on
- * the Policy Queue
- *
- * The Policy's Queue can be updated by this in the following ways:
- * - In the above case that this is the first job on the context
- * - If the context is high priority and the context is not scheduled, then it
- * could cause the Policy to schedule out a low-priority context, allowing
- * this context to be scheduled in.
- *
- * If the context is already scheduled on the RunPool, then adding a job to it
- * is guarenteed not to update the Policy Queue. And so, the caller is
- * guarenteed to not need to try scheduling a context from the Run Pool - it
- * can safely assert that the result is false.
- *
- * It is a programming error to have more than U32_MAX jobs in flight at a time.
- *
- * The following locking conditions are made on the caller:
- * - it must \em not hold kbasep_js_kctx_info::ctx::jsctx_mutex.
- * - it must \em not hold hwaccess_lock (as this will be obtained internally)
- * - it must \em not hold kbasep_js_device_data::runpool_mutex (as this will be
- * obtained internally)
- * - it must \em not hold kbasep_jd_device_data::queue_mutex (again, it's used internally).
- *
- * @return true indicates that the Policy Queue was updated, and so the
- * caller will need to try scheduling a context onto the Run Pool.
- * @return false indicates that no updates were made to the Policy Queue,
- * so no further action is required from the caller. This is \b always returned
- * when the context is currently scheduled.
- */
-bool kbasep_js_add_job(struct kbase_context *kctx, struct kbase_jd_atom *atom);
-
-/**
- * @brief Remove a job chain from the Job Scheduler, except for its 'retained state'.
- *
- * Completely removing a job requires several calls:
- * - kbasep_js_copy_atom_retained_state(), to capture the 'retained state' of
- *   the atom
- * - kbasep_js_remove_job(), to partially remove the atom from the Job Scheduler
- * - kbasep_js_runpool_release_ctx_and_katom_retained_state(), to release the
- *   remaining state held as part of the job having been run.
- *
- * In the common case of atoms completing normally, this set of actions is more optimal for spinlock purposes than having kbasep_js_remove_job() handle all of the actions.
- *
- * In the case of cancelling atoms, it is easier to call kbasep_js_remove_cancelled_job(), which handles all the necessary actions.
- *
- * It is a programming error to call this when:
- * - \a atom is not a job belonging to kctx.
- * - \a atom has already been removed from the Job Scheduler.
- * - \a atom is still in the runpool
- *
- * Do not use this for removing jobs being killed by kbase_jd_cancel() - use
- * kbasep_js_remove_cancelled_job() instead.
- *
- * The following locking conditions are made on the caller:
- * - it must hold kbasep_js_kctx_info::ctx::jsctx_mutex.
- *
- */
-void kbasep_js_remove_job(struct kbase_device *kbdev, struct kbase_context *kctx, struct kbase_jd_atom *atom);
-
-/**
- * @brief Completely remove a job chain from the Job Scheduler, in the case
- * where the job chain was cancelled.
- *
- * This is a variant of kbasep_js_remove_job() that takes care of removing all
- * of the retained state too. This is generally useful for cancelled atoms,
- * which need not be handled in an optimal way.
- *
- * It is a programming error to call this when:
- * - \a atom is not a job belonging to kctx.
- * - \a atom has already been removed from the Job Scheduler.
- * - \a atom is still in the runpool:
- *  - it is not being killed with kbasep_jd_cancel()
- *
- * The following locking conditions are made on the caller:
- * - it must hold kbasep_js_kctx_info::ctx::jsctx_mutex.
- * - it must \em not hold the hwaccess_lock, (as this will be obtained
- *   internally)
- * - it must \em not hold kbasep_js_device_data::runpool_mutex (as this could be
- * obtained internally)
- *
- * @return true indicates that ctx attributes have changed and the caller
- * should call kbase_js_sched_all() to try to run more jobs
- * @return false otherwise
- */
-bool kbasep_js_remove_cancelled_job(struct kbase_device *kbdev,
-						struct kbase_context *kctx,
-						struct kbase_jd_atom *katom);
-
-/**
- * @brief Refcount a context as being busy, preventing it from being scheduled
- * out.
- *
- * @note This function can safely be called from IRQ context.
- *
- * The following locking conditions are made on the caller:
- * - it must \em not hold mmu_hw_mutex and hwaccess_lock, because they will be
- *   used internally.
- *
- * @return value != false if the retain succeeded, and the context will not be scheduled out.
- * @return false if the retain failed (because the context is being/has been scheduled out).
- */
-bool kbasep_js_runpool_retain_ctx(struct kbase_device *kbdev, struct kbase_context *kctx);
-
-/**
- * @brief Refcount a context as being busy, preventing it from being scheduled
- * out.
- *
- * @note This function can safely be called from IRQ context.
- *
- * The following locks must be held by the caller:
- * - mmu_hw_mutex, hwaccess_lock
- *
- * @return value != false if the retain succeeded, and the context will not be scheduled out.
- * @return false if the retain failed (because the context is being/has been scheduled out).
- */
-bool kbasep_js_runpool_retain_ctx_nolock(struct kbase_device *kbdev, struct kbase_context *kctx);
-
-/**
- * @brief Lookup a context in the Run Pool based upon its current address space
- * and ensure that is stays scheduled in.
- *
- * The context is refcounted as being busy to prevent it from scheduling
- * out. It must be released with kbasep_js_runpool_release_ctx() when it is no
- * longer required to stay scheduled in.
- *
- * @note This function can safely be called from IRQ context.
- *
- * The following locking conditions are made on the caller:
- * - it must \em not hold the hwaccess_lock, because it will be used internally.
- *   If the hwaccess_lock is already held, then the caller should use
- *   kbasep_js_runpool_lookup_ctx_nolock() instead.
- *
- * @return a valid struct kbase_context on success, which has been refcounted as being busy.
- * @return NULL on failure, indicating that no context was found in \a as_nr
- */
-struct kbase_context *kbasep_js_runpool_lookup_ctx(struct kbase_device *kbdev, int as_nr);
-
-/**
- * @brief Handling the requeuing/killing of a context that was evicted from the
- * policy queue or runpool.
- *
- * This should be used whenever handing off a context that has been evicted
- * from the policy queue or the runpool:
- * - If the context is not dying and has jobs, it gets re-added to the policy
- * queue
- * - Otherwise, it is not added
- *
- * In addition, if the context is dying the jobs are killed asynchronously.
- *
- * In all cases, the Power Manager active reference is released
- * (kbase_pm_context_idle()) whenever the has_pm_ref parameter is true.  \a
- * has_pm_ref must be set to false whenever the context was not previously in
- * the runpool and does not hold a Power Manager active refcount. Note that
- * contexts in a rollback of kbasep_js_try_schedule_head_ctx() might have an
- * active refcount even though they weren't in the runpool.
- *
- * The following locking conditions are made on the caller:
- * - it must hold kbasep_js_kctx_info::ctx::jsctx_mutex.
- * - it must \em not hold kbasep_jd_device_data::queue_mutex (as this will be
- * obtained internally)
- */
-void kbasep_js_runpool_requeue_or_kill_ctx(struct kbase_device *kbdev, struct kbase_context *kctx, bool has_pm_ref);
-
-/**
- * @brief Release a refcount of a context being busy, allowing it to be
- * scheduled out.
- *
- * When the refcount reaches zero and the context \em might be scheduled out
- * (depending on whether the Scheudling Policy has deemed it so, or if it has run
- * out of jobs).
- *
- * If the context does get scheduled out, then The following actions will be
- * taken as part of deschduling a context:
- * - For the context being descheduled:
- *  - If the context is in the processing of dying (all the jobs are being
- * removed from it), then descheduling also kills off any jobs remaining in the
- * context.
- *  - If the context is not dying, and any jobs remain after descheduling the
- * context then it is re-enqueued to the Policy's Queue.
- *  - Otherwise, the context is still known to the scheduler, but remains absent
- * from the Policy Queue until a job is next added to it.
- *  - In all descheduling cases, the Power Manager active reference (obtained
- * during kbasep_js_try_schedule_head_ctx()) is released (kbase_pm_context_idle()).
- *
- * Whilst the context is being descheduled, this also handles actions that
- * cause more atoms to be run:
- * - Attempt submitting atoms when the Context Attributes on the Runpool have
- * changed. This is because the context being scheduled out could mean that
- * there are more opportunities to run atoms.
- * - Attempt submitting to a slot that was previously blocked due to affinity
- * restrictions. This is usually only necessary when releasing a context
- * happens as part of completing a previous job, but is harmless nonetheless.
- * - Attempt scheduling in a new context (if one is available), and if necessary,
- * running a job from that new context.
- *
- * Unlike retaining a context in the runpool, this function \b cannot be called
- * from IRQ context.
- *
- * It is a programming error to call this on a \a kctx that is not currently
- * scheduled, or that already has a zero refcount.
- *
- * The following locking conditions are made on the caller:
- * - it must \em not hold the hwaccess_lock, because it will be used internally.
- * - it must \em not hold kbasep_js_kctx_info::ctx::jsctx_mutex.
- * - it must \em not hold kbasep_js_device_data::runpool_mutex (as this will be
- * obtained internally)
- * - it must \em not hold the kbase_device::mmu_hw_mutex (as this will be
- * obtained internally)
- * - it must \em not hold kbasep_jd_device_data::queue_mutex (as this will be
- * obtained internally)
- *
- */
-void kbasep_js_runpool_release_ctx(struct kbase_device *kbdev, struct kbase_context *kctx);
-
-/**
- * @brief Variant of kbasep_js_runpool_release_ctx() that handles additional
- * actions from completing an atom.
- *
- * This is usually called as part of completing an atom and releasing the
- * refcount on the context held by the atom.
- *
- * Therefore, the extra actions carried out are part of handling actions queued
- * on a completed atom, namely:
- * - Releasing the atom's context attributes
- * - Retrying the submission on a particular slot, because we couldn't submit
- * on that slot from an IRQ handler.
- *
- * The locking conditions of this function are the same as those for
- * kbasep_js_runpool_release_ctx()
- */
-void kbasep_js_runpool_release_ctx_and_katom_retained_state(struct kbase_device *kbdev, struct kbase_context *kctx, struct kbasep_js_atom_retained_state *katom_retained_state);
-
-/**
- * @brief Variant of kbase_js_runpool_release_ctx() that assumes that
- * kbasep_js_device_data::runpool_mutex and
- * kbasep_js_kctx_info::ctx::jsctx_mutex are held by the caller, and does not
- * attempt to schedule new contexts.
- */
-void kbasep_js_runpool_release_ctx_nolock(struct kbase_device *kbdev,
-						struct kbase_context *kctx);
-
-/**
- * @brief Schedule in a privileged context
- *
- * This schedules a context in regardless of the context priority.
- * If the runpool is full, a context will be forced out of the runpool and the function will wait
- * for the new context to be scheduled in.
- * The context will be kept scheduled in (and the corresponding address space reserved) until
- * kbasep_js_release_privileged_ctx is called).
- *
- * The following locking conditions are made on the caller:
- * - it must \em not hold the hwaccess_lock, because it will be used internally.
- * - it must \em not hold kbasep_js_device_data::runpool_mutex (as this will be
- * obtained internally)
- * - it must \em not hold the kbase_device::mmu_hw_mutex (as this will be
- * obtained internally)
- * - it must \em not hold kbasep_jd_device_data::queue_mutex (again, it's used internally).
- * - it must \em not hold kbasep_js_kctx_info::ctx::jsctx_mutex, because it will
- * be used internally.
- *
- */
-void kbasep_js_schedule_privileged_ctx(struct kbase_device *kbdev, struct kbase_context *kctx);
-
-/**
- * @brief Release a privileged context, allowing it to be scheduled out.
- *
- * See kbasep_js_runpool_release_ctx for potential side effects.
- *
- * The following locking conditions are made on the caller:
- * - it must \em not hold the hwaccess_lock, because it will be used internally.
- * - it must \em not hold kbasep_js_kctx_info::ctx::jsctx_mutex.
- * - it must \em not hold kbasep_js_device_data::runpool_mutex (as this will be
- * obtained internally)
- * - it must \em not hold the kbase_device::mmu_hw_mutex (as this will be
- * obtained internally)
- *
- */
-void kbasep_js_release_privileged_ctx(struct kbase_device *kbdev, struct kbase_context *kctx);
-
-/**
- * @brief Try to submit the next job on each slot
- *
- * The following locks may be used:
- * - kbasep_js_device_data::runpool_mutex
- * - hwaccess_lock
- */
-void kbase_js_try_run_jobs(struct kbase_device *kbdev);
-
-/**
- * @brief Suspend the job scheduler during a Power Management Suspend event.
- *
- * Causes all contexts to be removed from the runpool, and prevents any
- * contexts from (re)entering the runpool.
- *
- * This does not handle suspending the one privileged context: the caller must
- * instead do this by by suspending the GPU HW Counter Instrumentation.
- *
- * This will eventually cause all Power Management active references held by
- * contexts on the runpool to be released, without running any more atoms.
- *
- * The caller must then wait for all Power Mangement active refcount to become
- * zero before completing the suspend.
- *
- * The emptying mechanism may take some time to complete, since it can wait for
- * jobs to complete naturally instead of forcing them to end quickly. However,
- * this is bounded by the Job Scheduler's Job Timeouts. Hence, this
- * function is guaranteed to complete in a finite time.
- */
-void kbasep_js_suspend(struct kbase_device *kbdev);
-
-/**
- * @brief Resume the Job Scheduler after a Power Management Resume event.
- *
- * This restores the actions from kbasep_js_suspend():
- * - Schedules contexts back into the runpool
- * - Resumes running atoms on the GPU
- */
-void kbasep_js_resume(struct kbase_device *kbdev);
-
-/**
- * @brief Submit an atom to the job scheduler.
- *
- * The atom is enqueued on the context's ringbuffer. The caller must have
- * ensured that all dependencies can be represented in the ringbuffer.
- *
- * Caller must hold jctx->lock
- *
- * @param[in] kctx  Context pointer
- * @param[in] atom  Pointer to the atom to submit
- *
- * @return Whether the context requires to be enqueued. */
-bool kbase_js_dep_resolved_submit(struct kbase_context *kctx,
-					struct kbase_jd_atom *katom);
-
-/**
-  * jsctx_ll_flush_to_rb() - Pushes atoms from the linked list to ringbuffer.
-  * @kctx:  Context Pointer
-  * @prio:  Priority (specifies the queue together with js).
-  * @js:    Job slot (specifies the queue together with prio).
-  *
-  * Pushes all possible atoms from the linked list to the ringbuffer.
-  * Number of atoms are limited to free space in the ringbuffer and
-  * number of available atoms in the linked list.
-  *
-  */
-void jsctx_ll_flush_to_rb(struct kbase_context *kctx, int prio, int js);
-/**
- * @brief Pull an atom from a context in the job scheduler for execution.
- *
- * The atom will not be removed from the ringbuffer at this stage.
- *
- * The HW access lock must be held when calling this function.
- *
- * @param[in] kctx  Context to pull from
- * @param[in] js    Job slot to pull from
- * @return          Pointer to an atom, or NULL if there are no atoms for this
- *                  slot that can be currently run.
- */
-struct kbase_jd_atom *kbase_js_pull(struct kbase_context *kctx, int js);
-
-/**
- * @brief Return an atom to the job scheduler ringbuffer.
- *
- * An atom is 'unpulled' if execution is stopped but intended to be returned to
- * later. The most common reason for this is that the atom has been
- * soft-stopped.
- *
- * Note that if multiple atoms are to be 'unpulled', they must be returned in
- * the reverse order to which they were originally pulled. It is a programming
- * error to return atoms in any other order.
- *
- * The HW access lock must be held when calling this function.
- *
- * @param[in] kctx  Context pointer
- * @param[in] atom  Pointer to the atom to unpull
- */
-void kbase_js_unpull(struct kbase_context *kctx, struct kbase_jd_atom *katom);
-
-/**
- * @brief Complete an atom from jd_done_worker(), removing it from the job
- * scheduler ringbuffer.
- *
- * If the atom failed then all dependee atoms marked for failure propagation
- * will also fail.
- *
- * @param[in] kctx  Context pointer
- * @param[in] katom Pointer to the atom to complete
- * @return true if the context is now idle (no jobs pulled)
- *         false otherwise
- */
-bool kbase_js_complete_atom_wq(struct kbase_context *kctx,
-				struct kbase_jd_atom *katom);
-
-/**
- * @brief Complete an atom.
- *
- * Most of the work required to complete an atom will be performed by
- * jd_done_worker().
- *
- * The HW access lock must be held when calling this function.
- *
- * @param[in] katom         Pointer to the atom to complete
- * @param[in] end_timestamp The time that the atom completed (may be NULL)
- *
- * Return: Atom that has now been unblocked and can now be run, or NULL if none
- */
-struct kbase_jd_atom *kbase_js_complete_atom(struct kbase_jd_atom *katom,
-		ktime_t *end_timestamp);
-
-/**
- * @brief Submit atoms from all available contexts.
- *
- * This will attempt to submit as many jobs as possible to the provided job
- * slots. It will exit when either all job slots are full, or all contexts have
- * been used.
- *
- * @param[in] kbdev    Device pointer
- * @param[in] js_mask  Mask of job slots to submit to
- */
-void kbase_js_sched(struct kbase_device *kbdev, int js_mask);
-
-/**
- * kbase_jd_zap_context - Attempt to deschedule a context that is being
- *                        destroyed
- * @kctx: Context pointer
- *
- * This will attempt to remove a context from any internal job scheduler queues
- * and perform any other actions to ensure a context will not be submitted
- * from.
- *
- * If the context is currently scheduled, then the caller must wait for all
- * pending jobs to complete before taking any further action.
- */
-void kbase_js_zap_context(struct kbase_context *kctx);
-
-/**
- * @brief Validate an atom
- *
- * This will determine whether the atom can be scheduled onto the GPU. Atoms
- * with invalid combinations of core requirements will be rejected.
- *
- * @param[in] kbdev  Device pointer
- * @param[in] katom  Atom to validate
- * @return           true if atom is valid
- *                   false otherwise
- */
-bool kbase_js_is_atom_valid(struct kbase_device *kbdev,
-				struct kbase_jd_atom *katom);
-
-/**
- * kbase_js_set_timeouts - update all JS timeouts with user specified data
- * @kbdev: Device pointer
- *
- * Timeouts are specified through the 'js_timeouts' sysfs file. If a timeout is
- * set to a positive number then that becomes the new value used, if a timeout
- * is negative then the default is set.
- */
-void kbase_js_set_timeouts(struct kbase_device *kbdev);
-
-/*
- * Helpers follow
- */
-
-/**
- * @brief Check that a context is allowed to submit jobs on this policy
- *
- * The purpose of this abstraction is to hide the underlying data size, and wrap up
- * the long repeated line of code.
- *
- * As with any bool, never test the return value with true.
- *
- * The caller must hold hwaccess_lock.
- */
-static inline bool kbasep_js_is_submit_allowed(struct kbasep_js_device_data *js_devdata, struct kbase_context *kctx)
-{
-	u16 test_bit;
-
-	/* Ensure context really is scheduled in */
-	KBASE_DEBUG_ASSERT(kctx->as_nr != KBASEP_AS_NR_INVALID);
-	KBASE_DEBUG_ASSERT(kbase_ctx_flag(kctx, KCTX_SCHEDULED));
-
-	test_bit = (u16) (1u << kctx->as_nr);
-
-	return (bool) (js_devdata->runpool_irq.submit_allowed & test_bit);
-}
-
-/**
- * @brief Allow a context to submit jobs on this policy
- *
- * The purpose of this abstraction is to hide the underlying data size, and wrap up
- * the long repeated line of code.
- *
- * The caller must hold hwaccess_lock.
- */
-static inline void kbasep_js_set_submit_allowed(struct kbasep_js_device_data *js_devdata, struct kbase_context *kctx)
-{
-	u16 set_bit;
-
-	/* Ensure context really is scheduled in */
-	KBASE_DEBUG_ASSERT(kctx->as_nr != KBASEP_AS_NR_INVALID);
-	KBASE_DEBUG_ASSERT(kbase_ctx_flag(kctx, KCTX_SCHEDULED));
-
-	set_bit = (u16) (1u << kctx->as_nr);
-
-	dev_dbg(kctx->kbdev->dev, "JS: Setting Submit Allowed on %p (as=%d)", kctx, kctx->as_nr);
-
-	js_devdata->runpool_irq.submit_allowed |= set_bit;
-}
-
-/**
- * @brief Prevent a context from submitting more jobs on this policy
- *
- * The purpose of this abstraction is to hide the underlying data size, and wrap up
- * the long repeated line of code.
- *
- * The caller must hold hwaccess_lock.
- */
-static inline void kbasep_js_clear_submit_allowed(struct kbasep_js_device_data *js_devdata, struct kbase_context *kctx)
-{
-	u16 clear_bit;
-	u16 clear_mask;
-
-	/* Ensure context really is scheduled in */
-	KBASE_DEBUG_ASSERT(kctx->as_nr != KBASEP_AS_NR_INVALID);
-	KBASE_DEBUG_ASSERT(kbase_ctx_flag(kctx, KCTX_SCHEDULED));
-
-	clear_bit = (u16) (1u << kctx->as_nr);
-	clear_mask = ~clear_bit;
-
-	dev_dbg(kctx->kbdev->dev, "JS: Clearing Submit Allowed on %p (as=%d)", kctx, kctx->as_nr);
-
-	js_devdata->runpool_irq.submit_allowed &= clear_mask;
-}
-
-/**
- * @brief Manage the 'retry_submit_on_slot' part of a kbase_jd_atom
- */
-static inline void kbasep_js_clear_job_retry_submit(struct kbase_jd_atom *atom)
-{
-	atom->retry_submit_on_slot = KBASEP_JS_RETRY_SUBMIT_SLOT_INVALID;
-}
-
-/**
- * Mark a slot as requiring resubmission by carrying that information on a
- * completing atom.
- *
- * @note This can ASSERT in debug builds if the submit slot has been set to
- * something other than the current value for @a js. This is because you might
- * be unintentionally stopping more jobs being submitted on the old submit
- * slot, and that might cause a scheduling-hang.
- *
- * @note If you can guarantee that the atoms for the original slot will be
- * submitted on some other slot, then call kbasep_js_clear_job_retry_submit()
- * first to silence the ASSERT.
- */
-static inline void kbasep_js_set_job_retry_submit_slot(struct kbase_jd_atom *atom, int js)
-{
-	KBASE_DEBUG_ASSERT(0 <= js && js <= BASE_JM_MAX_NR_SLOTS);
-	KBASE_DEBUG_ASSERT((atom->retry_submit_on_slot ==
-					KBASEP_JS_RETRY_SUBMIT_SLOT_INVALID)
-				|| (atom->retry_submit_on_slot == js));
-
-	atom->retry_submit_on_slot = js;
-}
-
-/**
- * Create an initial 'invalid' atom retained state, that requires no
- * atom-related work to be done on releasing with
- * kbasep_js_runpool_release_ctx_and_katom_retained_state()
- */
-static inline void kbasep_js_atom_retained_state_init_invalid(struct kbasep_js_atom_retained_state *retained_state)
-{
-	retained_state->event_code = BASE_JD_EVENT_NOT_STARTED;
-	retained_state->core_req = KBASEP_JS_ATOM_RETAINED_STATE_CORE_REQ_INVALID;
-	retained_state->retry_submit_on_slot = KBASEP_JS_RETRY_SUBMIT_SLOT_INVALID;
-}
-
-/**
- * Copy atom state that can be made available after jd_done_nolock() is called
- * on that atom.
- */
-static inline void kbasep_js_atom_retained_state_copy(struct kbasep_js_atom_retained_state *retained_state, const struct kbase_jd_atom *katom)
-{
-	retained_state->event_code = katom->event_code;
-	retained_state->core_req = katom->core_req;
-	retained_state->retry_submit_on_slot = katom->retry_submit_on_slot;
-	retained_state->sched_priority = katom->sched_priority;
-	retained_state->device_nr = katom->device_nr;
-}
-
-/**
- * @brief Determine whether an atom has finished (given its retained state),
- * and so should be given back to userspace/removed from the system.
- *
- * Reasons for an atom not finishing include:
- * - Being soft-stopped (and so, the atom should be resubmitted sometime later)
- *
- * @param[in] katom_retained_state the retained state of the atom to check
- * @return    false if the atom has not finished
- * @return    !=false if the atom has finished
- */
-static inline bool kbasep_js_has_atom_finished(const struct kbasep_js_atom_retained_state *katom_retained_state)
-{
-	return (bool) (katom_retained_state->event_code != BASE_JD_EVENT_STOPPED && katom_retained_state->event_code != BASE_JD_EVENT_REMOVED_FROM_NEXT);
-}
-
-/**
- * @brief Determine whether a struct kbasep_js_atom_retained_state is valid
- *
- * An invalid struct kbasep_js_atom_retained_state is allowed, and indicates that the
- * code should just ignore it.
- *
- * @param[in] katom_retained_state the atom's retained state to check
- * @return    false if the retained state is invalid, and can be ignored
- * @return    !=false if the retained state is valid
- */
-static inline bool kbasep_js_atom_retained_state_is_valid(const struct kbasep_js_atom_retained_state *katom_retained_state)
-{
-	return (bool) (katom_retained_state->core_req != KBASEP_JS_ATOM_RETAINED_STATE_CORE_REQ_INVALID);
-}
-
-static inline bool kbasep_js_get_atom_retry_submit_slot(const struct kbasep_js_atom_retained_state *katom_retained_state, int *res)
-{
-	int js = katom_retained_state->retry_submit_on_slot;
-
-	*res = js;
-	return (bool) (js >= 0);
-}
-
-/**
- * @brief Variant of kbasep_js_runpool_lookup_ctx() that can be used when the
- * context is guaranteed to be already previously retained.
- *
- * It is a programming error to supply the \a as_nr of a context that has not
- * been previously retained/has a busy refcount of zero. The only exception is
- * when there is no ctx in \a as_nr (NULL returned).
- *
- * The following locking conditions are made on the caller:
- * - it must \em not hold the hwaccess_lock, because it will be used internally.
- *
- * @return a valid struct kbase_context on success, with a refcount that is guaranteed
- * to be non-zero and unmodified by this function.
- * @return NULL on failure, indicating that no context was found in \a as_nr
- */
-static inline struct kbase_context *kbasep_js_runpool_lookup_ctx_noretain(struct kbase_device *kbdev, int as_nr)
-{
-	struct kbase_context *found_kctx;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(0 <= as_nr && as_nr < BASE_MAX_NR_AS);
-
-	found_kctx = kbdev->as_to_kctx[as_nr];
-	KBASE_DEBUG_ASSERT(found_kctx == NULL ||
-			atomic_read(&found_kctx->refcount) > 0);
-
-	return found_kctx;
-}
-
-/*
- * The following locking conditions are made on the caller:
- * - The caller must hold the kbasep_js_kctx_info::ctx::jsctx_mutex.
- * - The caller must hold the kbasep_js_device_data::runpool_mutex
- */
-static inline void kbase_js_runpool_inc_context_count(
-						struct kbase_device *kbdev,
-						struct kbase_context *kctx)
-{
-	struct kbasep_js_device_data *js_devdata;
-	struct kbasep_js_kctx_info *js_kctx_info;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-
-	js_devdata = &kbdev->js_data;
-	js_kctx_info = &kctx->jctx.sched_info;
-
-	lockdep_assert_held(&js_kctx_info->ctx.jsctx_mutex);
-	lockdep_assert_held(&js_devdata->runpool_mutex);
-
-	/* Track total contexts */
-	KBASE_DEBUG_ASSERT(js_devdata->nr_all_contexts_running < S8_MAX);
-	++(js_devdata->nr_all_contexts_running);
-
-	if (!kbase_ctx_flag(kctx, KCTX_SUBMIT_DISABLED)) {
-		/* Track contexts that can submit jobs */
-		KBASE_DEBUG_ASSERT(js_devdata->nr_user_contexts_running <
-									S8_MAX);
-		++(js_devdata->nr_user_contexts_running);
-	}
-}
-
-/*
- * The following locking conditions are made on the caller:
- * - The caller must hold the kbasep_js_kctx_info::ctx::jsctx_mutex.
- * - The caller must hold the kbasep_js_device_data::runpool_mutex
- */
-static inline void kbase_js_runpool_dec_context_count(
-						struct kbase_device *kbdev,
-						struct kbase_context *kctx)
-{
-	struct kbasep_js_device_data *js_devdata;
-	struct kbasep_js_kctx_info *js_kctx_info;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-
-	js_devdata = &kbdev->js_data;
-	js_kctx_info = &kctx->jctx.sched_info;
-
-	lockdep_assert_held(&js_kctx_info->ctx.jsctx_mutex);
-	lockdep_assert_held(&js_devdata->runpool_mutex);
-
-	/* Track total contexts */
-	--(js_devdata->nr_all_contexts_running);
-	KBASE_DEBUG_ASSERT(js_devdata->nr_all_contexts_running >= 0);
-
-	if (!kbase_ctx_flag(kctx, KCTX_SUBMIT_DISABLED)) {
-		/* Track contexts that can submit jobs */
-		--(js_devdata->nr_user_contexts_running);
-		KBASE_DEBUG_ASSERT(js_devdata->nr_user_contexts_running >= 0);
-	}
-}
-
-
-/**
- * @brief Submit atoms from all available contexts to all job slots.
- *
- * This will attempt to submit as many jobs as possible. It will exit when
- * either all job slots are full, or all contexts have been used.
- *
- * @param[in] kbdev    Device pointer
- */
-static inline void kbase_js_sched_all(struct kbase_device *kbdev)
-{
-	kbase_js_sched(kbdev, (1 << kbdev->gpu_props.num_job_slots) - 1);
-}
-
-extern const int
-kbasep_js_atom_priority_to_relative[BASE_JD_NR_PRIO_LEVELS];
-
-extern const base_jd_prio
-kbasep_js_relative_priority_to_atom[KBASE_JS_ATOM_SCHED_PRIO_COUNT];
-
-/**
- * kbasep_js_atom_prio_to_sched_prio(): - Convert atom priority (base_jd_prio)
- *                                        to relative ordering
- * @atom_prio: Priority ID to translate.
- *
- * Atom priority values for @ref base_jd_prio cannot be compared directly to
- * find out which are higher or lower.
- *
- * This function will convert base_jd_prio values for successively lower
- * priorities into a monotonically increasing sequence. That is, the lower the
- * base_jd_prio priority, the higher the value produced by this function. This
- * is in accordance with how the rest of the kernel treates priority.
- *
- * The mapping is 1:1 and the size of the valid input range is the same as the
- * size of the valid output range, i.e.
- * KBASE_JS_ATOM_SCHED_PRIO_COUNT == BASE_JD_NR_PRIO_LEVELS
- *
- * Note This must be kept in sync with BASE_JD_PRIO_<...> definitions
- *
- * Return: On success: a value in the inclusive range
- *         0..KBASE_JS_ATOM_SCHED_PRIO_COUNT-1. On failure:
- *         KBASE_JS_ATOM_SCHED_PRIO_INVALID
- */
-static inline int kbasep_js_atom_prio_to_sched_prio(base_jd_prio atom_prio)
-{
-	if (atom_prio >= BASE_JD_NR_PRIO_LEVELS)
-		return KBASE_JS_ATOM_SCHED_PRIO_INVALID;
-
-	return kbasep_js_atom_priority_to_relative[atom_prio];
-}
-
-static inline base_jd_prio kbasep_js_sched_prio_to_atom_prio(int sched_prio)
-{
-	unsigned int prio_idx;
-
-	KBASE_DEBUG_ASSERT(0 <= sched_prio
-			&& sched_prio < KBASE_JS_ATOM_SCHED_PRIO_COUNT);
-
-	prio_idx = (unsigned int)sched_prio;
-
-	return kbasep_js_relative_priority_to_atom[prio_idx];
-}
-
-	  /** @} *//* end group kbase_js */
-	  /** @} *//* end group base_kbase_api */
-	  /** @} *//* end group base_api */
-
-#endif				/* _KBASE_JS_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js_ctx_attr.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js_ctx_attr.c
deleted file mode 100644
index 321506ada835..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js_ctx_attr.c
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-#include <mali_kbase.h>
-#include <mali_kbase_config.h>
-
-/*
- * Private functions follow
- */
-
-/**
- * @brief Check whether a ctx has a certain attribute, and if so, retain that
- * attribute on the runpool.
- *
- * Requires:
- * - jsctx mutex
- * - runpool_irq spinlock
- * - ctx is scheduled on the runpool
- *
- * @return true indicates a change in ctx attributes state of the runpool.
- * In this state, the scheduler might be able to submit more jobs than
- * previously, and so the caller should ensure kbasep_js_try_run_next_job_nolock()
- * or similar is called sometime later.
- * @return false indicates no change in ctx attributes state of the runpool.
- */
-static bool kbasep_js_ctx_attr_runpool_retain_attr(struct kbase_device *kbdev, struct kbase_context *kctx, enum kbasep_js_ctx_attr attribute)
-{
-	struct kbasep_js_device_data *js_devdata;
-	struct kbasep_js_kctx_info *js_kctx_info;
-	bool runpool_state_changed = false;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	KBASE_DEBUG_ASSERT(attribute < KBASEP_JS_CTX_ATTR_COUNT);
-	js_devdata = &kbdev->js_data;
-	js_kctx_info = &kctx->jctx.sched_info;
-
-	lockdep_assert_held(&js_kctx_info->ctx.jsctx_mutex);
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	KBASE_DEBUG_ASSERT(kbase_ctx_flag(kctx, KCTX_SCHEDULED));
-
-	if (kbasep_js_ctx_attr_is_attr_on_ctx(kctx, attribute) != false) {
-		KBASE_DEBUG_ASSERT(js_devdata->runpool_irq.ctx_attr_ref_count[attribute] < S8_MAX);
-		++(js_devdata->runpool_irq.ctx_attr_ref_count[attribute]);
-
-		if (js_devdata->runpool_irq.ctx_attr_ref_count[attribute] == 1) {
-			/* First refcount indicates a state change */
-			runpool_state_changed = true;
-			KBASE_TRACE_ADD(kbdev, JS_CTX_ATTR_NOW_ON_RUNPOOL, kctx, NULL, 0u, attribute);
-		}
-	}
-
-	return runpool_state_changed;
-}
-
-/**
- * @brief Check whether a ctx has a certain attribute, and if so, release that
- * attribute on the runpool.
- *
- * Requires:
- * - jsctx mutex
- * - runpool_irq spinlock
- * - ctx is scheduled on the runpool
- *
- * @return true indicates a change in ctx attributes state of the runpool.
- * In this state, the scheduler might be able to submit more jobs than
- * previously, and so the caller should ensure kbasep_js_try_run_next_job_nolock()
- * or similar is called sometime later.
- * @return false indicates no change in ctx attributes state of the runpool.
- */
-static bool kbasep_js_ctx_attr_runpool_release_attr(struct kbase_device *kbdev, struct kbase_context *kctx, enum kbasep_js_ctx_attr attribute)
-{
-	struct kbasep_js_device_data *js_devdata;
-	struct kbasep_js_kctx_info *js_kctx_info;
-	bool runpool_state_changed = false;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	KBASE_DEBUG_ASSERT(attribute < KBASEP_JS_CTX_ATTR_COUNT);
-	js_devdata = &kbdev->js_data;
-	js_kctx_info = &kctx->jctx.sched_info;
-
-	lockdep_assert_held(&js_kctx_info->ctx.jsctx_mutex);
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-	KBASE_DEBUG_ASSERT(kbase_ctx_flag(kctx, KCTX_SCHEDULED));
-
-	if (kbasep_js_ctx_attr_is_attr_on_ctx(kctx, attribute) != false) {
-		KBASE_DEBUG_ASSERT(js_devdata->runpool_irq.ctx_attr_ref_count[attribute] > 0);
-		--(js_devdata->runpool_irq.ctx_attr_ref_count[attribute]);
-
-		if (js_devdata->runpool_irq.ctx_attr_ref_count[attribute] == 0) {
-			/* Last de-refcount indicates a state change */
-			runpool_state_changed = true;
-			KBASE_TRACE_ADD(kbdev, JS_CTX_ATTR_NOW_OFF_RUNPOOL, kctx, NULL, 0u, attribute);
-		}
-	}
-
-	return runpool_state_changed;
-}
-
-/**
- * @brief Retain a certain attribute on a ctx, also retaining it on the runpool
- * if the context is scheduled.
- *
- * Requires:
- * - jsctx mutex
- * - If the context is scheduled, then runpool_irq spinlock must also be held
- *
- * @return true indicates a change in ctx attributes state of the runpool.
- * This may allow the scheduler to submit more jobs than previously.
- * @return false indicates no change in ctx attributes state of the runpool.
- */
-static bool kbasep_js_ctx_attr_ctx_retain_attr(struct kbase_device *kbdev, struct kbase_context *kctx, enum kbasep_js_ctx_attr attribute)
-{
-	struct kbasep_js_kctx_info *js_kctx_info;
-	bool runpool_state_changed = false;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	KBASE_DEBUG_ASSERT(attribute < KBASEP_JS_CTX_ATTR_COUNT);
-	js_kctx_info = &kctx->jctx.sched_info;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-	lockdep_assert_held(&js_kctx_info->ctx.jsctx_mutex);
-	KBASE_DEBUG_ASSERT(js_kctx_info->ctx.ctx_attr_ref_count[attribute] < U32_MAX);
-
-	++(js_kctx_info->ctx.ctx_attr_ref_count[attribute]);
-
-	if (kbase_ctx_flag(kctx, KCTX_SCHEDULED) && js_kctx_info->ctx.ctx_attr_ref_count[attribute] == 1) {
-		/* Only ref-count the attribute on the runpool for the first time this contexts sees this attribute */
-		KBASE_TRACE_ADD(kbdev, JS_CTX_ATTR_NOW_ON_CTX, kctx, NULL, 0u, attribute);
-		runpool_state_changed = kbasep_js_ctx_attr_runpool_retain_attr(kbdev, kctx, attribute);
-	}
-
-	return runpool_state_changed;
-}
-
-/*
- * @brief Release a certain attribute on a ctx, also releasing it from the runpool
- * if the context is scheduled.
- *
- * Requires:
- * - jsctx mutex
- * - If the context is scheduled, then runpool_irq spinlock must also be held
- *
- * @return true indicates a change in ctx attributes state of the runpool.
- * This may allow the scheduler to submit more jobs than previously.
- * @return false indicates no change in ctx attributes state of the runpool.
- */
-static bool kbasep_js_ctx_attr_ctx_release_attr(struct kbase_device *kbdev, struct kbase_context *kctx, enum kbasep_js_ctx_attr attribute)
-{
-	struct kbasep_js_kctx_info *js_kctx_info;
-	bool runpool_state_changed = false;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	KBASE_DEBUG_ASSERT(attribute < KBASEP_JS_CTX_ATTR_COUNT);
-	js_kctx_info = &kctx->jctx.sched_info;
-
-	lockdep_assert_held(&js_kctx_info->ctx.jsctx_mutex);
-	KBASE_DEBUG_ASSERT(js_kctx_info->ctx.ctx_attr_ref_count[attribute] > 0);
-
-	if (kbase_ctx_flag(kctx, KCTX_SCHEDULED) && js_kctx_info->ctx.ctx_attr_ref_count[attribute] == 1) {
-		lockdep_assert_held(&kbdev->hwaccess_lock);
-		/* Only de-ref-count the attribute on the runpool when this is the last ctx-reference to it */
-		runpool_state_changed = kbasep_js_ctx_attr_runpool_release_attr(kbdev, kctx, attribute);
-		KBASE_TRACE_ADD(kbdev, JS_CTX_ATTR_NOW_OFF_CTX, kctx, NULL, 0u, attribute);
-	}
-
-	/* De-ref must happen afterwards, because kbasep_js_ctx_attr_runpool_release() needs to check it too */
-	--(js_kctx_info->ctx.ctx_attr_ref_count[attribute]);
-
-	return runpool_state_changed;
-}
-
-/*
- * More commonly used public functions
- */
-
-void kbasep_js_ctx_attr_set_initial_attrs(struct kbase_device *kbdev, struct kbase_context *kctx)
-{
-	bool runpool_state_changed = false;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-
-	if (kbase_ctx_flag(kctx, KCTX_SUBMIT_DISABLED)) {
-		/* This context never submits, so don't track any scheduling attributes */
-		return;
-	}
-
-	/* Transfer attributes held in the context flags for contexts that have submit enabled */
-
-	/* ... More attributes can be added here ... */
-
-	/* The context should not have been scheduled yet, so ASSERT if this caused
-	 * runpool state changes (note that other threads *can't* affect the value
-	 * of runpool_state_changed, due to how it's calculated) */
-	KBASE_DEBUG_ASSERT(runpool_state_changed == false);
-	CSTD_UNUSED(runpool_state_changed);
-}
-
-void kbasep_js_ctx_attr_runpool_retain_ctx(struct kbase_device *kbdev, struct kbase_context *kctx)
-{
-	bool runpool_state_changed;
-	int i;
-
-	/* Retain any existing attributes */
-	for (i = 0; i < KBASEP_JS_CTX_ATTR_COUNT; ++i) {
-		if (kbasep_js_ctx_attr_is_attr_on_ctx(kctx, (enum kbasep_js_ctx_attr) i) != false) {
-			/* The context is being scheduled in, so update the runpool with the new attributes */
-			runpool_state_changed = kbasep_js_ctx_attr_runpool_retain_attr(kbdev, kctx, (enum kbasep_js_ctx_attr) i);
-
-			/* We don't need to know about state changed, because retaining a
-			 * context occurs on scheduling it, and that itself will also try
-			 * to run new atoms */
-			CSTD_UNUSED(runpool_state_changed);
-		}
-	}
-}
-
-bool kbasep_js_ctx_attr_runpool_release_ctx(struct kbase_device *kbdev, struct kbase_context *kctx)
-{
-	bool runpool_state_changed = false;
-	int i;
-
-	/* Release any existing attributes */
-	for (i = 0; i < KBASEP_JS_CTX_ATTR_COUNT; ++i) {
-		if (kbasep_js_ctx_attr_is_attr_on_ctx(kctx, (enum kbasep_js_ctx_attr) i) != false) {
-			/* The context is being scheduled out, so update the runpool on the removed attributes */
-			runpool_state_changed |= kbasep_js_ctx_attr_runpool_release_attr(kbdev, kctx, (enum kbasep_js_ctx_attr) i);
-		}
-	}
-
-	return runpool_state_changed;
-}
-
-void kbasep_js_ctx_attr_ctx_retain_atom(struct kbase_device *kbdev, struct kbase_context *kctx, struct kbase_jd_atom *katom)
-{
-	bool runpool_state_changed = false;
-	base_jd_core_req core_req;
-
-	KBASE_DEBUG_ASSERT(katom);
-	core_req = katom->core_req;
-
-	if (core_req & BASE_JD_REQ_ONLY_COMPUTE)
-		runpool_state_changed |= kbasep_js_ctx_attr_ctx_retain_attr(kbdev, kctx, KBASEP_JS_CTX_ATTR_COMPUTE);
-	else
-		runpool_state_changed |= kbasep_js_ctx_attr_ctx_retain_attr(kbdev, kctx, KBASEP_JS_CTX_ATTR_NON_COMPUTE);
-
-	if ((core_req & (BASE_JD_REQ_CS | BASE_JD_REQ_ONLY_COMPUTE | BASE_JD_REQ_T)) != 0 && (core_req & (BASE_JD_REQ_COHERENT_GROUP | BASE_JD_REQ_SPECIFIC_COHERENT_GROUP)) == 0) {
-		/* Atom that can run on slot1 or slot2, and can use all cores */
-		runpool_state_changed |= kbasep_js_ctx_attr_ctx_retain_attr(kbdev, kctx, KBASEP_JS_CTX_ATTR_COMPUTE_ALL_CORES);
-	}
-
-	/* We don't need to know about state changed, because retaining an
-	 * atom occurs on adding it, and that itself will also try to run
-	 * new atoms */
-	CSTD_UNUSED(runpool_state_changed);
-}
-
-bool kbasep_js_ctx_attr_ctx_release_atom(struct kbase_device *kbdev, struct kbase_context *kctx, struct kbasep_js_atom_retained_state *katom_retained_state)
-{
-	bool runpool_state_changed = false;
-	base_jd_core_req core_req;
-
-	KBASE_DEBUG_ASSERT(katom_retained_state);
-	core_req = katom_retained_state->core_req;
-
-	/* No-op for invalid atoms */
-	if (kbasep_js_atom_retained_state_is_valid(katom_retained_state) == false)
-		return false;
-
-	if (core_req & BASE_JD_REQ_ONLY_COMPUTE)
-		runpool_state_changed |= kbasep_js_ctx_attr_ctx_release_attr(kbdev, kctx, KBASEP_JS_CTX_ATTR_COMPUTE);
-	else
-		runpool_state_changed |= kbasep_js_ctx_attr_ctx_release_attr(kbdev, kctx, KBASEP_JS_CTX_ATTR_NON_COMPUTE);
-
-	if ((core_req & (BASE_JD_REQ_CS | BASE_JD_REQ_ONLY_COMPUTE | BASE_JD_REQ_T)) != 0 && (core_req & (BASE_JD_REQ_COHERENT_GROUP | BASE_JD_REQ_SPECIFIC_COHERENT_GROUP)) == 0) {
-		/* Atom that can run on slot1 or slot2, and can use all cores */
-		runpool_state_changed |= kbasep_js_ctx_attr_ctx_release_attr(kbdev, kctx, KBASEP_JS_CTX_ATTR_COMPUTE_ALL_CORES);
-	}
-
-	return runpool_state_changed;
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js_ctx_attr.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js_ctx_attr.h
deleted file mode 100644
index ce9183326a57..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js_ctx_attr.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/**
- * @file mali_kbase_js_ctx_attr.h
- * Job Scheduler Context Attribute APIs
- */
-
-#ifndef _KBASE_JS_CTX_ATTR_H_
-#define _KBASE_JS_CTX_ATTR_H_
-
-/**
- * @addtogroup base_api
- * @{
- */
-
-/**
- * @addtogroup base_kbase_api
- * @{
- */
-
-/**
- * @addtogroup kbase_js
- * @{
- */
-
-/**
- * Set the initial attributes of a context (when context create flags are set)
- *
- * Requires:
- * - Hold the jsctx_mutex
- */
-void kbasep_js_ctx_attr_set_initial_attrs(struct kbase_device *kbdev, struct kbase_context *kctx);
-
-/**
- * Retain all attributes of a context
- *
- * This occurs on scheduling in the context on the runpool (but after
- * is_scheduled is set)
- *
- * Requires:
- * - jsctx mutex
- * - runpool_irq spinlock
- * - ctx->is_scheduled is true
- */
-void kbasep_js_ctx_attr_runpool_retain_ctx(struct kbase_device *kbdev, struct kbase_context *kctx);
-
-/**
- * Release all attributes of a context
- *
- * This occurs on scheduling out the context from the runpool (but before
- * is_scheduled is cleared)
- *
- * Requires:
- * - jsctx mutex
- * - runpool_irq spinlock
- * - ctx->is_scheduled is true
- *
- * @return true indicates a change in ctx attributes state of the runpool.
- * In this state, the scheduler might be able to submit more jobs than
- * previously, and so the caller should ensure kbasep_js_try_run_next_job_nolock()
- * or similar is called sometime later.
- * @return false indicates no change in ctx attributes state of the runpool.
- */
-bool kbasep_js_ctx_attr_runpool_release_ctx(struct kbase_device *kbdev, struct kbase_context *kctx);
-
-/**
- * Retain all attributes of an atom
- *
- * This occurs on adding an atom to a context
- *
- * Requires:
- * - jsctx mutex
- * - If the context is scheduled, then runpool_irq spinlock must also be held
- */
-void kbasep_js_ctx_attr_ctx_retain_atom(struct kbase_device *kbdev, struct kbase_context *kctx, struct kbase_jd_atom *katom);
-
-/**
- * Release all attributes of an atom, given its retained state.
- *
- * This occurs after (permanently) removing an atom from a context
- *
- * Requires:
- * - jsctx mutex
- * - If the context is scheduled, then runpool_irq spinlock must also be held
- *
- * This is a no-op when \a katom_retained_state is invalid.
- *
- * @return true indicates a change in ctx attributes state of the runpool.
- * In this state, the scheduler might be able to submit more jobs than
- * previously, and so the caller should ensure kbasep_js_try_run_next_job_nolock()
- * or similar is called sometime later.
- * @return false indicates no change in ctx attributes state of the runpool.
- */
-bool kbasep_js_ctx_attr_ctx_release_atom(struct kbase_device *kbdev, struct kbase_context *kctx, struct kbasep_js_atom_retained_state *katom_retained_state);
-
-/**
- * Requires:
- * - runpool_irq spinlock
- */
-static inline s8 kbasep_js_ctx_attr_count_on_runpool(struct kbase_device *kbdev, enum kbasep_js_ctx_attr attribute)
-{
-	struct kbasep_js_device_data *js_devdata;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-	KBASE_DEBUG_ASSERT(attribute < KBASEP_JS_CTX_ATTR_COUNT);
-	js_devdata = &kbdev->js_data;
-
-	return js_devdata->runpool_irq.ctx_attr_ref_count[attribute];
-}
-
-/**
- * Requires:
- * - runpool_irq spinlock
- */
-static inline bool kbasep_js_ctx_attr_is_attr_on_runpool(struct kbase_device *kbdev, enum kbasep_js_ctx_attr attribute)
-{
-	/* In general, attributes are 'on' when they have a non-zero refcount (note: the refcount will never be < 0) */
-	return (bool) kbasep_js_ctx_attr_count_on_runpool(kbdev, attribute);
-}
-
-/**
- * Requires:
- * - jsctx mutex
- */
-static inline bool kbasep_js_ctx_attr_is_attr_on_ctx(struct kbase_context *kctx, enum kbasep_js_ctx_attr attribute)
-{
-	struct kbasep_js_kctx_info *js_kctx_info;
-
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	KBASE_DEBUG_ASSERT(attribute < KBASEP_JS_CTX_ATTR_COUNT);
-	js_kctx_info = &kctx->jctx.sched_info;
-
-	/* In general, attributes are 'on' when they have a refcount (which should never be < 0) */
-	return (bool) (js_kctx_info->ctx.ctx_attr_ref_count[attribute]);
-}
-
-	  /** @} *//* end group kbase_js */
-	  /** @} *//* end group base_kbase_api */
-	  /** @} *//* end group base_api */
-
-#endif				/* _KBASE_JS_DEFS_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js_defs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js_defs.h
deleted file mode 100644
index 0b4890d6b50e..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_js_defs.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/**
- * @file mali_kbase_js.h
- * Job Scheduler Type Definitions
- */
-
-#ifndef _KBASE_JS_DEFS_H_
-#define _KBASE_JS_DEFS_H_
-
-/**
- * @addtogroup base_api
- * @{
- */
-
-/**
- * @addtogroup base_kbase_api
- * @{
- */
-
-/**
- * @addtogroup kbase_js
- * @{
- */
-/* Forward decls */
-struct kbase_device;
-struct kbase_jd_atom;
-
-
-typedef u32 kbase_context_flags;
-
-struct kbasep_atom_req {
-	base_jd_core_req core_req;
-	kbase_context_flags ctx_req;
-	u32 device_nr;
-};
-
-/** Callback function run on all of a context's jobs registered with the Job
- * Scheduler */
-typedef void (*kbasep_js_ctx_job_cb)(struct kbase_device *kbdev, struct kbase_jd_atom *katom);
-
-/**
- * @brief Maximum number of jobs that can be submitted to a job slot whilst
- * inside the IRQ handler.
- *
- * This is important because GPU NULL jobs can complete whilst the IRQ handler
- * is running. Otherwise, it potentially allows an unlimited number of GPU NULL
- * jobs to be submitted inside the IRQ handler, which increases IRQ latency.
- */
-#define KBASE_JS_MAX_JOB_SUBMIT_PER_SLOT_PER_IRQ 2
-
-/**
- * @brief Context attributes
- *
- * Each context attribute can be thought of as a boolean value that caches some
- * state information about either the runpool, or the context:
- * - In the case of the runpool, it is a cache of "Do any contexts owned by
- * the runpool have attribute X?"
- * - In the case of a context, it is a cache of "Do any atoms owned by the
- * context have attribute X?"
- *
- * The boolean value of the context attributes often affect scheduling
- * decisions, such as affinities to use and job slots to use.
- *
- * To accomodate changes of state in the context, each attribute is refcounted
- * in the context, and in the runpool for all running contexts. Specifically:
- * - The runpool holds a refcount of how many contexts in the runpool have this
- * attribute.
- * - The context holds a refcount of how many atoms have this attribute.
- */
-enum kbasep_js_ctx_attr {
-	/** Attribute indicating a context that contains Compute jobs. That is,
-	 * the context has jobs of type @ref BASE_JD_REQ_ONLY_COMPUTE
-	 *
-	 * @note A context can be both 'Compute' and 'Non Compute' if it contains
-	 * both types of jobs.
-	 */
-	KBASEP_JS_CTX_ATTR_COMPUTE,
-
-	/** Attribute indicating a context that contains Non-Compute jobs. That is,
-	 * the context has some jobs that are \b not of type @ref
-	 * BASE_JD_REQ_ONLY_COMPUTE.
-	 *
-	 * @note A context can be both 'Compute' and 'Non Compute' if it contains
-	 * both types of jobs.
-	 */
-	KBASEP_JS_CTX_ATTR_NON_COMPUTE,
-
-	/** Attribute indicating that a context contains compute-job atoms that
-	 * aren't restricted to a coherent group, and can run on all cores.
-	 *
-	 * Specifically, this is when the atom's \a core_req satisfy:
-	 * - (\a core_req & (BASE_JD_REQ_CS | BASE_JD_REQ_ONLY_COMPUTE | BASE_JD_REQ_T) // uses slot 1 or slot 2
-	 * - && !(\a core_req & BASE_JD_REQ_COHERENT_GROUP) // not restricted to coherent groups
-	 *
-	 * Such atoms could be blocked from running if one of the coherent groups
-	 * is being used by another job slot, so tracking this context attribute
-	 * allows us to prevent such situations.
-	 *
-	 * @note This doesn't take into account the 1-coregroup case, where all
-	 * compute atoms would effectively be able to run on 'all cores', but
-	 * contexts will still not always get marked with this attribute. Instead,
-	 * it is the caller's responsibility to take into account the number of
-	 * coregroups when interpreting this attribute.
-	 *
-	 * @note Whilst Tiler atoms are normally combined with
-	 * BASE_JD_REQ_COHERENT_GROUP, it is possible to send such atoms without
-	 * BASE_JD_REQ_COHERENT_GROUP set. This is an unlikely case, but it's easy
-	 * enough to handle anyway.
-	 */
-	KBASEP_JS_CTX_ATTR_COMPUTE_ALL_CORES,
-
-	/** Must be the last in the enum */
-	KBASEP_JS_CTX_ATTR_COUNT
-};
-
-enum {
-	/** Bit indicating that new atom should be started because this atom completed */
-	KBASE_JS_ATOM_DONE_START_NEW_ATOMS = (1u << 0),
-	/** Bit indicating that the atom was evicted from the JS_NEXT registers */
-	KBASE_JS_ATOM_DONE_EVICTED_FROM_NEXT = (1u << 1)
-};
-
-/** Combination of KBASE_JS_ATOM_DONE_<...> bits */
-typedef u32 kbasep_js_atom_done_code;
-
-/**
- * @brief KBase Device Data Job Scheduler sub-structure
- *
- * This encapsulates the current context of the Job Scheduler on a particular
- * device. This context is global to the device, and is not tied to any
- * particular struct kbase_context running on the device.
- *
- * nr_contexts_running and as_free are optimized for packing together (by making
- * them smaller types than u32). The operations on them should rarely involve
- * masking. The use of signed types for arithmetic indicates to the compiler that
- * the value will not rollover (which would be undefined behavior), and so under
- * the Total License model, it is free to make optimizations based on that (i.e.
- * to remove masking).
- */
-struct kbasep_js_device_data {
-	/* Sub-structure to collect together Job Scheduling data used in IRQ
-	 * context. The hwaccess_lock must be held when accessing. */
-	struct runpool_irq {
-		/** Bitvector indicating whether a currently scheduled context is allowed to submit jobs.
-		 * When bit 'N' is set in this, it indicates whether the context bound to address space
-		 * 'N' is allowed to submit jobs.
-		 */
-		u16 submit_allowed;
-
-		/** Context Attributes:
-		 * Each is large enough to hold a refcount of the number of contexts
-		 * that can fit into the runpool. This is currently BASE_MAX_NR_AS
-		 *
-		 * Note that when BASE_MAX_NR_AS==16 we need 5 bits (not 4) to store
-		 * the refcount. Hence, it's not worthwhile reducing this to
-		 * bit-manipulation on u32s to save space (where in contrast, 4 bit
-		 * sub-fields would be easy to do and would save space).
-		 *
-		 * Whilst this must not become negative, the sign bit is used for:
-		 * - error detection in debug builds
-		 * - Optimization: it is undefined for a signed int to overflow, and so
-		 * the compiler can optimize for that never happening (thus, no masking
-		 * is required on updating the variable) */
-		s8 ctx_attr_ref_count[KBASEP_JS_CTX_ATTR_COUNT];
-
-		/*
-		 * Affinity management and tracking
-		 */
-		/** Bitvector to aid affinity checking. Element 'n' bit 'i' indicates
-		 * that slot 'n' is using core i (i.e. slot_affinity_refcount[n][i] > 0) */
-		u64 slot_affinities[BASE_JM_MAX_NR_SLOTS];
-		/** Refcount for each core owned by each slot. Used to generate the
-		 * slot_affinities array of bitvectors
-		 *
-		 * The value of the refcount will not exceed BASE_JM_SUBMIT_SLOTS,
-		 * because it is refcounted only when a job is definitely about to be
-		 * submitted to a slot, and is de-refcounted immediately after a job
-		 * finishes */
-		s8 slot_affinity_refcount[BASE_JM_MAX_NR_SLOTS][64];
-	} runpool_irq;
-
-	/**
-	 * Run Pool mutex, for managing contexts within the runpool.
-	 * Unless otherwise specified, you must hold this lock whilst accessing any
-	 * members that follow
-	 *
-	 * In addition, this is used to access:
-	 * - the kbasep_js_kctx_info::runpool substructure
-	 */
-	struct mutex runpool_mutex;
-
-	/**
-	 * Queue Lock, used to access the Policy's queue of contexts independently
-	 * of the Run Pool.
-	 *
-	 * Of course, you don't need the Run Pool lock to access this.
-	 */
-	struct mutex queue_mutex;
-
-	/**
-	 * Scheduling semaphore. This must be held when calling
-	 * kbase_jm_kick()
-	 */
-	struct semaphore schedule_sem;
-
-	/**
-	 * List of contexts that can currently be pulled from
-	 */
-	struct list_head ctx_list_pullable[BASE_JM_MAX_NR_SLOTS];
-	/**
-	 * List of contexts that can not currently be pulled from, but have
-	 * jobs currently running.
-	 */
-	struct list_head ctx_list_unpullable[BASE_JM_MAX_NR_SLOTS];
-
-	/** Number of currently scheduled user contexts (excluding ones that are not submitting jobs) */
-	s8 nr_user_contexts_running;
-	/** Number of currently scheduled contexts (including ones that are not submitting jobs) */
-	s8 nr_all_contexts_running;
-
-	/** Core Requirements to match up with base_js_atom's core_req memeber
-	 * @note This is a write-once member, and so no locking is required to read */
-	base_jd_core_req js_reqs[BASE_JM_MAX_NR_SLOTS];
-
-	u32 scheduling_period_ns;    /*< Value for JS_SCHEDULING_PERIOD_NS */
-	u32 soft_stop_ticks;	     /*< Value for JS_SOFT_STOP_TICKS */
-	u32 soft_stop_ticks_cl;	     /*< Value for JS_SOFT_STOP_TICKS_CL */
-	u32 hard_stop_ticks_ss;	     /*< Value for JS_HARD_STOP_TICKS_SS */
-	u32 hard_stop_ticks_cl;	     /*< Value for JS_HARD_STOP_TICKS_CL */
-	u32 hard_stop_ticks_dumping; /*< Value for JS_HARD_STOP_TICKS_DUMPING */
-	u32 gpu_reset_ticks_ss;	     /*< Value for JS_RESET_TICKS_SS */
-	u32 gpu_reset_ticks_cl;	     /*< Value for JS_RESET_TICKS_CL */
-	u32 gpu_reset_ticks_dumping; /*< Value for JS_RESET_TICKS_DUMPING */
-	u32 ctx_timeslice_ns;		 /**< Value for JS_CTX_TIMESLICE_NS */
-
-	/**< Value for JS_SOFT_JOB_TIMEOUT */
-	atomic_t soft_job_timeout_ms;
-
-	/** List of suspended soft jobs */
-	struct list_head suspended_soft_jobs_list;
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-	/* Support soft-stop on a single context */
-	bool softstop_always;
-#endif				/* CONFIG_MALI_BIFROST_DEBUG */
-
-	/** The initalized-flag is placed at the end, to avoid cache-pollution (we should
-	 * only be using this during init/term paths).
-	 * @note This is a write-once member, and so no locking is required to read */
-	int init_status;
-
-	/* Number of contexts that can currently be pulled from */
-	u32 nr_contexts_pullable;
-
-	/* Number of contexts that can either be pulled from or are currently
-	 * running */
-	atomic_t nr_contexts_runnable;
-};
-
-/**
- * @brief KBase Context Job Scheduling information structure
- *
- * This is a substructure in the struct kbase_context that encapsulates all the
- * scheduling information.
- */
-struct kbasep_js_kctx_info {
-
-	/**
-	 * Job Scheduler Context information sub-structure. These members are
-	 * accessed regardless of whether the context is:
-	 * - In the Policy's Run Pool
-	 * - In the Policy's Queue
-	 * - Not queued nor in the Run Pool.
-	 *
-	 * You must obtain the jsctx_mutex before accessing any other members of
-	 * this substructure.
-	 *
-	 * You may not access any of these members from IRQ context.
-	 */
-	struct kbase_jsctx {
-		struct mutex jsctx_mutex;		    /**< Job Scheduler Context lock */
-
-		/** Number of jobs <b>ready to run</b> - does \em not include the jobs waiting in
-		 * the dispatcher, and dependency-only jobs. See kbase_jd_context::job_nr
-		 * for such jobs*/
-		u32 nr_jobs;
-
-		/** Context Attributes:
-		 * Each is large enough to hold a refcount of the number of atoms on
-		 * the context. **/
-		u32 ctx_attr_ref_count[KBASEP_JS_CTX_ATTR_COUNT];
-
-		/**
-		 * Wait queue to wait for KCTX_SHEDULED flag state changes.
-		 * */
-		wait_queue_head_t is_scheduled_wait;
-
-		/** Link implementing JS queues. Context can be present on one
-		 * list per job slot
-		 */
-		struct list_head ctx_list_entry[BASE_JM_MAX_NR_SLOTS];
-	} ctx;
-
-	/* The initalized-flag is placed at the end, to avoid cache-pollution (we should
-	 * only be using this during init/term paths) */
-	int init_status;
-};
-
-/** Subset of atom state that can be available after jd_done_nolock() is called
- * on that atom. A copy must be taken via kbasep_js_atom_retained_state_copy(),
- * because the original atom could disappear. */
-struct kbasep_js_atom_retained_state {
-	/** Event code - to determine whether the atom has finished */
-	enum base_jd_event_code event_code;
-	/** core requirements */
-	base_jd_core_req core_req;
-	/* priority */
-	int sched_priority;
-	/** Job Slot to retry submitting to if submission from IRQ handler failed */
-	int retry_submit_on_slot;
-	/* Core group atom was executed on */
-	u32 device_nr;
-
-};
-
-/**
- * Value signifying 'no retry on a slot required' for:
- * - kbase_js_atom_retained_state::retry_submit_on_slot
- * - kbase_jd_atom::retry_submit_on_slot
- */
-#define KBASEP_JS_RETRY_SUBMIT_SLOT_INVALID (-1)
-
-/**
- * base_jd_core_req value signifying 'invalid' for a kbase_jd_atom_retained_state.
- *
- * @see kbase_atom_retained_state_is_valid()
- */
-#define KBASEP_JS_ATOM_RETAINED_STATE_CORE_REQ_INVALID BASE_JD_REQ_DEP
-
-/**
- * @brief The JS timer resolution, in microseconds
- *
- * Any non-zero difference in time will be at least this size.
- */
-#define KBASEP_JS_TICK_RESOLUTION_US 1
-
-/*
- * Internal atom priority defines for kbase_jd_atom::sched_prio
- */
-enum {
-	KBASE_JS_ATOM_SCHED_PRIO_HIGH = 0,
-	KBASE_JS_ATOM_SCHED_PRIO_MED,
-	KBASE_JS_ATOM_SCHED_PRIO_LOW,
-	KBASE_JS_ATOM_SCHED_PRIO_COUNT,
-};
-
-/* Invalid priority for kbase_jd_atom::sched_prio */
-#define KBASE_JS_ATOM_SCHED_PRIO_INVALID -1
-
-/* Default priority in the case of contexts with no atoms, or being lenient
- * about invalid priorities from userspace */
-#define KBASE_JS_ATOM_SCHED_PRIO_DEFAULT KBASE_JS_ATOM_SCHED_PRIO_MED
-
-	  /** @} *//* end group kbase_js */
-	  /** @} *//* end group base_kbase_api */
-	  /** @} *//* end group base_api */
-
-#endif				/* _KBASE_JS_DEFS_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_linux.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_linux.h
deleted file mode 100644
index 6d1e61fd41e0..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_linux.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2014 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/**
- * @file mali_kbase_linux.h
- * Base kernel APIs, Linux implementation.
- */
-
-#ifndef _KBASE_LINUX_H_
-#define _KBASE_LINUX_H_
-
-/* All things that are needed for the Linux port. */
-#include <linux/platform_device.h>
-#include <linux/miscdevice.h>
-#include <linux/list.h>
-#include <linux/module.h>
-#include <linux/atomic.h>
-
-#if (defined(MALI_KERNEL_TEST_API) && (1 == MALI_KERNEL_TEST_API))
-	#define KBASE_EXPORT_TEST_API(func) EXPORT_SYMBOL(func)
-#else
-	#define KBASE_EXPORT_TEST_API(func)
-#endif
-
-#define KBASE_EXPORT_SYMBOL(func) EXPORT_SYMBOL(func)
-
-#endif /* _KBASE_LINUX_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem.c
deleted file mode 100644
index a105b15d641c..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem.c
+++ /dev/null
@@ -1,2875 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/**
- * @file mali_kbase_mem.c
- * Base kernel memory APIs
- */
-#ifdef CONFIG_DMA_SHARED_BUFFER
-#include <linux/dma-buf.h>
-#endif				/* CONFIG_DMA_SHARED_BUFFER */
-#ifdef CONFIG_UMP
-#include <linux/ump.h>
-#endif				/* CONFIG_UMP */
-#include <linux/kernel.h>
-#include <linux/bug.h>
-#include <linux/compat.h>
-#include <linux/version.h>
-
-#include <mali_kbase_config.h>
-#include <mali_kbase.h>
-#include <mali_midg_regmap.h>
-#include <mali_kbase_cache_policy.h>
-#include <mali_kbase_hw.h>
-#include <mali_kbase_tlstream.h>
-
-/* This function finds out which RB tree the given GPU VA region belongs to
- * based on the region zone */
-static struct rb_root *kbase_reg_flags_to_rbtree(struct kbase_context *kctx,
-						    struct kbase_va_region *reg)
-{
-	struct rb_root *rbtree = NULL;
-
-	switch (reg->flags & KBASE_REG_ZONE_MASK) {
-	case KBASE_REG_ZONE_CUSTOM_VA:
-		rbtree = &kctx->reg_rbtree_custom;
-		break;
-	case KBASE_REG_ZONE_EXEC:
-		rbtree = &kctx->reg_rbtree_exec;
-		break;
-	case KBASE_REG_ZONE_SAME_VA:
-		rbtree = &kctx->reg_rbtree_same;
-		/* fall through */
-	default:
-		rbtree = &kctx->reg_rbtree_same;
-		break;
-	}
-
-	return rbtree;
-}
-
-/* This function finds out which RB tree the given pfn from the GPU VA belongs
- * to based on the memory zone the pfn refers to */
-static struct rb_root *kbase_gpu_va_to_rbtree(struct kbase_context *kctx,
-								    u64 gpu_pfn)
-{
-	struct rb_root *rbtree = NULL;
-
-#ifdef CONFIG_64BIT
-	if (kbase_ctx_flag(kctx, KCTX_COMPAT)) {
-#endif /* CONFIG_64BIT */
-		if (gpu_pfn >= KBASE_REG_ZONE_CUSTOM_VA_BASE)
-			rbtree = &kctx->reg_rbtree_custom;
-		else if (gpu_pfn >= KBASE_REG_ZONE_EXEC_BASE)
-			rbtree = &kctx->reg_rbtree_exec;
-		else
-			rbtree = &kctx->reg_rbtree_same;
-#ifdef CONFIG_64BIT
-	} else {
-		if (gpu_pfn >= kctx->same_va_end)
-			rbtree = &kctx->reg_rbtree_custom;
-		else
-			rbtree = &kctx->reg_rbtree_same;
-	}
-#endif /* CONFIG_64BIT */
-
-	return rbtree;
-}
-
-/* This function inserts a region into the tree. */
-static void kbase_region_tracker_insert(struct kbase_context *kctx,
-						struct kbase_va_region *new_reg)
-{
-	u64 start_pfn = new_reg->start_pfn;
-	struct rb_node **link = NULL;
-	struct rb_node *parent = NULL;
-	struct rb_root *rbtree = NULL;
-
-	rbtree = kbase_reg_flags_to_rbtree(kctx, new_reg);
-
-	link = &(rbtree->rb_node);
-	/* Find the right place in the tree using tree search */
-	while (*link) {
-		struct kbase_va_region *old_reg;
-
-		parent = *link;
-		old_reg = rb_entry(parent, struct kbase_va_region, rblink);
-
-		/* RBTree requires no duplicate entries. */
-		KBASE_DEBUG_ASSERT(old_reg->start_pfn != start_pfn);
-
-		if (old_reg->start_pfn > start_pfn)
-			link = &(*link)->rb_left;
-		else
-			link = &(*link)->rb_right;
-	}
-
-	/* Put the new node there, and rebalance tree */
-	rb_link_node(&(new_reg->rblink), parent, link);
-
-	rb_insert_color(&(new_reg->rblink), rbtree);
-}
-
-/* Find allocated region enclosing free range. */
-static struct kbase_va_region *kbase_region_tracker_find_region_enclosing_range_free(
-		struct kbase_context *kctx, u64 start_pfn, size_t nr_pages)
-{
-	struct rb_node *rbnode = NULL;
-	struct kbase_va_region *reg = NULL;
-	struct rb_root *rbtree = NULL;
-
-	u64 end_pfn = start_pfn + nr_pages;
-
-	rbtree = kbase_gpu_va_to_rbtree(kctx, start_pfn);
-
-	rbnode = rbtree->rb_node;
-
-	while (rbnode) {
-		u64 tmp_start_pfn, tmp_end_pfn;
-
-		reg = rb_entry(rbnode, struct kbase_va_region, rblink);
-		tmp_start_pfn = reg->start_pfn;
-		tmp_end_pfn = reg->start_pfn + reg->nr_pages;
-
-		/* If start is lower than this, go left. */
-		if (start_pfn < tmp_start_pfn)
-			rbnode = rbnode->rb_left;
-		/* If end is higher than this, then go right. */
-		else if (end_pfn > tmp_end_pfn)
-			rbnode = rbnode->rb_right;
-		else	/* Enclosing */
-			return reg;
-	}
-
-	return NULL;
-}
-
-/* Find region enclosing given address. */
-struct kbase_va_region *kbase_region_tracker_find_region_enclosing_address(struct kbase_context *kctx, u64 gpu_addr)
-{
-	struct rb_node *rbnode;
-	struct kbase_va_region *reg;
-	u64 gpu_pfn = gpu_addr >> PAGE_SHIFT;
-	struct rb_root *rbtree = NULL;
-
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-
-	lockdep_assert_held(&kctx->reg_lock);
-
-	rbtree = kbase_gpu_va_to_rbtree(kctx, gpu_pfn);
-
-	rbnode = rbtree->rb_node;
-
-	while (rbnode) {
-		u64 tmp_start_pfn, tmp_end_pfn;
-
-		reg = rb_entry(rbnode, struct kbase_va_region, rblink);
-		tmp_start_pfn = reg->start_pfn;
-		tmp_end_pfn = reg->start_pfn + reg->nr_pages;
-
-		/* If start is lower than this, go left. */
-		if (gpu_pfn < tmp_start_pfn)
-			rbnode = rbnode->rb_left;
-		/* If end is higher than this, then go right. */
-		else if (gpu_pfn >= tmp_end_pfn)
-			rbnode = rbnode->rb_right;
-		else	/* Enclosing */
-			return reg;
-	}
-
-	return NULL;
-}
-
-KBASE_EXPORT_TEST_API(kbase_region_tracker_find_region_enclosing_address);
-
-/* Find region with given base address */
-struct kbase_va_region *kbase_region_tracker_find_region_base_address(struct kbase_context *kctx, u64 gpu_addr)
-{
-	u64 gpu_pfn = gpu_addr >> PAGE_SHIFT;
-	struct rb_node *rbnode = NULL;
-	struct kbase_va_region *reg = NULL;
-	struct rb_root *rbtree = NULL;
-
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-
-	lockdep_assert_held(&kctx->reg_lock);
-
-	rbtree = kbase_gpu_va_to_rbtree(kctx, gpu_pfn);
-
-	rbnode = rbtree->rb_node;
-
-	while (rbnode) {
-		reg = rb_entry(rbnode, struct kbase_va_region, rblink);
-		if (reg->start_pfn > gpu_pfn)
-			rbnode = rbnode->rb_left;
-		else if (reg->start_pfn < gpu_pfn)
-			rbnode = rbnode->rb_right;
-		else
-			return reg;
-
-	}
-
-	return NULL;
-}
-
-KBASE_EXPORT_TEST_API(kbase_region_tracker_find_region_base_address);
-
-/* Find region meeting given requirements */
-static struct kbase_va_region *kbase_region_tracker_find_region_meeting_reqs(struct kbase_context *kctx, struct kbase_va_region *reg_reqs, size_t nr_pages, size_t align)
-{
-	struct rb_node *rbnode = NULL;
-	struct kbase_va_region *reg = NULL;
-	struct rb_root *rbtree = NULL;
-
-	/* Note that this search is a linear search, as we do not have a target
-	   address in mind, so does not benefit from the rbtree search */
-
-	rbtree = kbase_reg_flags_to_rbtree(kctx, reg_reqs);
-
-	rbnode = rb_first(rbtree);
-
-	while (rbnode) {
-		reg = rb_entry(rbnode, struct kbase_va_region, rblink);
-		if ((reg->nr_pages >= nr_pages) &&
-				(reg->flags & KBASE_REG_FREE)) {
-			/* Check alignment */
-			u64 start_pfn = (reg->start_pfn + align - 1) & ~(align - 1);
-
-			if ((start_pfn >= reg->start_pfn) &&
-					(start_pfn <= (reg->start_pfn + reg->nr_pages - 1)) &&
-					((start_pfn + nr_pages - 1) <= (reg->start_pfn + reg->nr_pages - 1)))
-				return reg;
-		}
-		rbnode = rb_next(rbnode);
-	}
-
-	return NULL;
-}
-
-/**
- * @brief Remove a region object from the global list.
- *
- * The region reg is removed, possibly by merging with other free and
- * compatible adjacent regions.  It must be called with the context
- * region lock held. The associated memory is not released (see
- * kbase_free_alloced_region). Internal use only.
- */
-static int kbase_remove_va_region(struct kbase_context *kctx, struct kbase_va_region *reg)
-{
-	struct rb_node *rbprev;
-	struct kbase_va_region *prev = NULL;
-	struct rb_node *rbnext;
-	struct kbase_va_region *next = NULL;
-	struct rb_root *reg_rbtree = NULL;
-
-	int merged_front = 0;
-	int merged_back = 0;
-	int err = 0;
-
-	reg_rbtree = kbase_reg_flags_to_rbtree(kctx, reg);
-
-	/* Try to merge with the previous block first */
-	rbprev = rb_prev(&(reg->rblink));
-	if (rbprev) {
-		prev = rb_entry(rbprev, struct kbase_va_region, rblink);
-		if (prev->flags & KBASE_REG_FREE) {
-			/* We're compatible with the previous VMA,
-			 * merge with it */
-			WARN_ON((prev->flags & KBASE_REG_ZONE_MASK) !=
-					    (reg->flags & KBASE_REG_ZONE_MASK));
-			prev->nr_pages += reg->nr_pages;
-			rb_erase(&(reg->rblink), reg_rbtree);
-			reg = prev;
-			merged_front = 1;
-		}
-	}
-
-	/* Try to merge with the next block second */
-	/* Note we do the lookup here as the tree may have been rebalanced. */
-	rbnext = rb_next(&(reg->rblink));
-	if (rbnext) {
-		/* We're compatible with the next VMA, merge with it */
-		next = rb_entry(rbnext, struct kbase_va_region, rblink);
-		if (next->flags & KBASE_REG_FREE) {
-			WARN_ON((next->flags & KBASE_REG_ZONE_MASK) !=
-					    (reg->flags & KBASE_REG_ZONE_MASK));
-			next->start_pfn = reg->start_pfn;
-			next->nr_pages += reg->nr_pages;
-			rb_erase(&(reg->rblink), reg_rbtree);
-			merged_back = 1;
-			if (merged_front) {
-				/* We already merged with prev, free it */
-				kbase_free_alloced_region(reg);
-			}
-		}
-	}
-
-	/* If we failed to merge then we need to add a new block */
-	if (!(merged_front || merged_back)) {
-		/*
-		 * We didn't merge anything. Add a new free
-		 * placeholder and remove the original one.
-		 */
-		struct kbase_va_region *free_reg;
-
-		free_reg = kbase_alloc_free_region(kctx, reg->start_pfn, reg->nr_pages, reg->flags & KBASE_REG_ZONE_MASK);
-		if (!free_reg) {
-			err = -ENOMEM;
-			goto out;
-		}
-		rb_replace_node(&(reg->rblink), &(free_reg->rblink), reg_rbtree);
-	}
-
- out:
-	return err;
-}
-
-KBASE_EXPORT_TEST_API(kbase_remove_va_region);
-
-/**
- * @brief Insert a VA region to the list, replacing the current at_reg.
- */
-static int kbase_insert_va_region_nolock(struct kbase_context *kctx, struct kbase_va_region *new_reg, struct kbase_va_region *at_reg, u64 start_pfn, size_t nr_pages)
-{
-	struct rb_root *reg_rbtree = NULL;
-	int err = 0;
-
-	reg_rbtree = kbase_reg_flags_to_rbtree(kctx, at_reg);
-
-	/* Must be a free region */
-	KBASE_DEBUG_ASSERT((at_reg->flags & KBASE_REG_FREE) != 0);
-	/* start_pfn should be contained within at_reg */
-	KBASE_DEBUG_ASSERT((start_pfn >= at_reg->start_pfn) && (start_pfn < at_reg->start_pfn + at_reg->nr_pages));
-	/* at least nr_pages from start_pfn should be contained within at_reg */
-	KBASE_DEBUG_ASSERT(start_pfn + nr_pages <= at_reg->start_pfn + at_reg->nr_pages);
-
-	new_reg->start_pfn = start_pfn;
-	new_reg->nr_pages = nr_pages;
-
-	/* Regions are a whole use, so swap and delete old one. */
-	if (at_reg->start_pfn == start_pfn && at_reg->nr_pages == nr_pages) {
-		rb_replace_node(&(at_reg->rblink), &(new_reg->rblink),
-								reg_rbtree);
-		kbase_free_alloced_region(at_reg);
-	}
-	/* New region replaces the start of the old one, so insert before. */
-	else if (at_reg->start_pfn == start_pfn) {
-		at_reg->start_pfn += nr_pages;
-		KBASE_DEBUG_ASSERT(at_reg->nr_pages >= nr_pages);
-		at_reg->nr_pages -= nr_pages;
-
-		kbase_region_tracker_insert(kctx, new_reg);
-	}
-	/* New region replaces the end of the old one, so insert after. */
-	else if ((at_reg->start_pfn + at_reg->nr_pages) == (start_pfn + nr_pages)) {
-		at_reg->nr_pages -= nr_pages;
-
-		kbase_region_tracker_insert(kctx, new_reg);
-	}
-	/* New region splits the old one, so insert and create new */
-	else {
-		struct kbase_va_region *new_front_reg;
-
-		new_front_reg = kbase_alloc_free_region(kctx,
-				at_reg->start_pfn,
-				start_pfn - at_reg->start_pfn,
-				at_reg->flags & KBASE_REG_ZONE_MASK);
-
-		if (new_front_reg) {
-			at_reg->nr_pages -= nr_pages + new_front_reg->nr_pages;
-			at_reg->start_pfn = start_pfn + nr_pages;
-
-			kbase_region_tracker_insert(kctx, new_front_reg);
-			kbase_region_tracker_insert(kctx, new_reg);
-		} else {
-			err = -ENOMEM;
-		}
-	}
-
-	return err;
-}
-
-/**
- * @brief Add a VA region to the list.
- */
-int kbase_add_va_region(struct kbase_context *kctx,
-		struct kbase_va_region *reg, u64 addr,
-		size_t nr_pages, size_t align)
-{
-	struct kbase_va_region *tmp;
-	u64 gpu_pfn = addr >> PAGE_SHIFT;
-	int err = 0;
-
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-	KBASE_DEBUG_ASSERT(NULL != reg);
-
-	lockdep_assert_held(&kctx->reg_lock);
-
-	if (!align)
-		align = 1;
-
-	/* must be a power of 2 */
-	KBASE_DEBUG_ASSERT((align & (align - 1)) == 0);
-	KBASE_DEBUG_ASSERT(nr_pages > 0);
-
-	/* Path 1: Map a specific address. Find the enclosing region, which *must* be free. */
-	if (gpu_pfn) {
-		struct device *dev = kctx->kbdev->dev;
-
-		KBASE_DEBUG_ASSERT(!(gpu_pfn & (align - 1)));
-
-		tmp = kbase_region_tracker_find_region_enclosing_range_free(kctx, gpu_pfn, nr_pages);
-		if (!tmp) {
-			dev_warn(dev, "Enclosing region not found: 0x%08llx gpu_pfn, %zu nr_pages", gpu_pfn, nr_pages);
-			err = -ENOMEM;
-			goto exit;
-		}
-		if (!(tmp->flags & KBASE_REG_FREE)) {
-			dev_warn(dev, "Zone mismatch: %lu != %lu", tmp->flags & KBASE_REG_ZONE_MASK, reg->flags & KBASE_REG_ZONE_MASK);
-			dev_warn(dev, "!(tmp->flags & KBASE_REG_FREE): tmp->start_pfn=0x%llx tmp->flags=0x%lx tmp->nr_pages=0x%zx gpu_pfn=0x%llx nr_pages=0x%zx\n", tmp->start_pfn, tmp->flags, tmp->nr_pages, gpu_pfn, nr_pages);
-			dev_warn(dev, "in function %s (%p, %p, 0x%llx, 0x%zx, 0x%zx)\n", __func__, kctx, reg, addr, nr_pages, align);
-			err = -ENOMEM;
-			goto exit;
-		}
-
-		err = kbase_insert_va_region_nolock(kctx, reg, tmp, gpu_pfn, nr_pages);
-		if (err) {
-			dev_warn(dev, "Failed to insert va region");
-			err = -ENOMEM;
-			goto exit;
-		}
-
-		goto exit;
-	}
-
-	/* Path 2: Map any free address which meets the requirements.  */
-	{
-		u64 start_pfn;
-
-		/*
-		 * Depending on the zone the allocation request is for
-		 * we might need to retry it.
-		 */
-		do {
-			tmp = kbase_region_tracker_find_region_meeting_reqs(
-					kctx, reg, nr_pages, align);
-			if (tmp) {
-				start_pfn = (tmp->start_pfn + align - 1) &
-						~(align - 1);
-				err = kbase_insert_va_region_nolock(kctx, reg,
-						tmp, start_pfn, nr_pages);
-				break;
-			}
-
-			/*
-			 * If the allocation is not from the same zone as JIT
-			 * then don't retry, we're out of VA and there is
-			 * nothing which can be done about it.
-			 */
-			if ((reg->flags & KBASE_REG_ZONE_MASK) !=
-					KBASE_REG_ZONE_CUSTOM_VA)
-				break;
-		} while (kbase_jit_evict(kctx));
-
-		if (!tmp)
-			err = -ENOMEM;
-	}
-
- exit:
-	return err;
-}
-
-KBASE_EXPORT_TEST_API(kbase_add_va_region);
-
-/**
- * @brief Initialize the internal region tracker data structure.
- */
-static void kbase_region_tracker_ds_init(struct kbase_context *kctx,
-		struct kbase_va_region *same_va_reg,
-		struct kbase_va_region *exec_reg,
-		struct kbase_va_region *custom_va_reg)
-{
-	kctx->reg_rbtree_same = RB_ROOT;
-	kbase_region_tracker_insert(kctx, same_va_reg);
-
-	/* Although exec and custom_va_reg don't always exist,
-	 * initialize unconditionally because of the mem_view debugfs
-	 * implementation which relies on these being empty */
-	kctx->reg_rbtree_exec = RB_ROOT;
-	kctx->reg_rbtree_custom = RB_ROOT;
-
-	if (exec_reg)
-		kbase_region_tracker_insert(kctx, exec_reg);
-	if (custom_va_reg)
-		kbase_region_tracker_insert(kctx, custom_va_reg);
-}
-
-static void kbase_region_tracker_erase_rbtree(struct rb_root *rbtree)
-{
-	struct rb_node *rbnode;
-	struct kbase_va_region *reg;
-
-	do {
-		rbnode = rb_first(rbtree);
-		if (rbnode) {
-			rb_erase(rbnode, rbtree);
-			reg = rb_entry(rbnode, struct kbase_va_region, rblink);
-			kbase_free_alloced_region(reg);
-		}
-	} while (rbnode);
-}
-
-void kbase_region_tracker_term(struct kbase_context *kctx)
-{
-	kbase_region_tracker_erase_rbtree(&kctx->reg_rbtree_same);
-	kbase_region_tracker_erase_rbtree(&kctx->reg_rbtree_exec);
-	kbase_region_tracker_erase_rbtree(&kctx->reg_rbtree_custom);
-}
-
-/**
- * Initialize the region tracker data structure.
- */
-int kbase_region_tracker_init(struct kbase_context *kctx)
-{
-	struct kbase_va_region *same_va_reg;
-	struct kbase_va_region *exec_reg = NULL;
-	struct kbase_va_region *custom_va_reg = NULL;
-	size_t same_va_bits = sizeof(void *) * BITS_PER_BYTE;
-	u64 custom_va_size = KBASE_REG_ZONE_CUSTOM_VA_SIZE;
-	u64 gpu_va_limit = (1ULL << kctx->kbdev->gpu_props.mmu.va_bits) >> PAGE_SHIFT;
-	u64 same_va_pages;
-	int err;
-
-	/* Take the lock as kbase_free_alloced_region requires it */
-	kbase_gpu_vm_lock(kctx);
-
-#if defined(CONFIG_ARM64)
-	same_va_bits = VA_BITS;
-#elif defined(CONFIG_X86_64)
-	same_va_bits = 47;
-#elif defined(CONFIG_64BIT)
-#error Unsupported 64-bit architecture
-#endif
-
-#ifdef CONFIG_64BIT
-	if (kbase_ctx_flag(kctx, KCTX_COMPAT))
-		same_va_bits = 32;
-	else if (kbase_hw_has_feature(kctx->kbdev, BASE_HW_FEATURE_33BIT_VA))
-		same_va_bits = 33;
-#endif
-
-	if (kctx->kbdev->gpu_props.mmu.va_bits < same_va_bits) {
-		err = -EINVAL;
-		goto fail_unlock;
-	}
-
-	same_va_pages = (1ULL << (same_va_bits - PAGE_SHIFT)) - 1;
-	/* all have SAME_VA */
-	same_va_reg = kbase_alloc_free_region(kctx, 1,
-			same_va_pages,
-			KBASE_REG_ZONE_SAME_VA);
-
-	if (!same_va_reg) {
-		err = -ENOMEM;
-		goto fail_unlock;
-	}
-
-#ifdef CONFIG_64BIT
-	/* 32-bit clients have exec and custom VA zones */
-	if (kbase_ctx_flag(kctx, KCTX_COMPAT)) {
-#endif
-		if (gpu_va_limit <= KBASE_REG_ZONE_CUSTOM_VA_BASE) {
-			err = -EINVAL;
-			goto fail_free_same_va;
-		}
-		/* If the current size of TMEM is out of range of the
-		 * virtual address space addressable by the MMU then
-		 * we should shrink it to fit
-		 */
-		if ((KBASE_REG_ZONE_CUSTOM_VA_BASE + KBASE_REG_ZONE_CUSTOM_VA_SIZE) >= gpu_va_limit)
-			custom_va_size = gpu_va_limit - KBASE_REG_ZONE_CUSTOM_VA_BASE;
-
-		exec_reg = kbase_alloc_free_region(kctx,
-				KBASE_REG_ZONE_EXEC_BASE,
-				KBASE_REG_ZONE_EXEC_SIZE,
-				KBASE_REG_ZONE_EXEC);
-
-		if (!exec_reg) {
-			err = -ENOMEM;
-			goto fail_free_same_va;
-		}
-
-		custom_va_reg = kbase_alloc_free_region(kctx,
-				KBASE_REG_ZONE_CUSTOM_VA_BASE,
-				custom_va_size, KBASE_REG_ZONE_CUSTOM_VA);
-
-		if (!custom_va_reg) {
-			err = -ENOMEM;
-			goto fail_free_exec;
-		}
-#ifdef CONFIG_64BIT
-	}
-#endif
-
-	kbase_region_tracker_ds_init(kctx, same_va_reg, exec_reg, custom_va_reg);
-
-	kctx->same_va_end = same_va_pages + 1;
-
-	kbase_gpu_vm_unlock(kctx);
-	return 0;
-
-fail_free_exec:
-	kbase_free_alloced_region(exec_reg);
-fail_free_same_va:
-	kbase_free_alloced_region(same_va_reg);
-fail_unlock:
-	kbase_gpu_vm_unlock(kctx);
-	return err;
-}
-
-int kbase_region_tracker_init_jit(struct kbase_context *kctx, u64 jit_va_pages)
-{
-#ifdef CONFIG_64BIT
-	struct kbase_va_region *same_va;
-	struct kbase_va_region *custom_va_reg;
-	u64 same_va_bits;
-	u64 total_va_size;
-	int err;
-
-	/*
-	 * Nothing to do for 32-bit clients, JIT uses the existing
-	 * custom VA zone.
-	 */
-	if (kbase_ctx_flag(kctx, KCTX_COMPAT))
-		return 0;
-
-#if defined(CONFIG_ARM64)
-	same_va_bits = VA_BITS;
-#elif defined(CONFIG_X86_64)
-	same_va_bits = 47;
-#elif defined(CONFIG_64BIT)
-#error Unsupported 64-bit architecture
-#endif
-
-	if (kbase_hw_has_feature(kctx->kbdev, BASE_HW_FEATURE_33BIT_VA))
-		same_va_bits = 33;
-
-	total_va_size = (1ULL << (same_va_bits - PAGE_SHIFT)) - 1;
-
-	kbase_gpu_vm_lock(kctx);
-
-	/*
-	 * Modify the same VA free region after creation. Be careful to ensure
-	 * that allocations haven't been made as they could cause an overlap
-	 * to happen with existing same VA allocations and the custom VA zone.
-	 */
-	same_va = kbase_region_tracker_find_region_base_address(kctx,
-			PAGE_SIZE);
-	if (!same_va) {
-		err = -ENOMEM;
-		goto fail_unlock;
-	}
-
-	/* The region flag or region size has changed since creation so bail. */
-	if ((!(same_va->flags & KBASE_REG_FREE)) ||
-			(same_va->nr_pages != total_va_size)) {
-		err = -ENOMEM;
-		goto fail_unlock;
-	}
-
-	if (same_va->nr_pages < jit_va_pages ||
-			kctx->same_va_end < jit_va_pages) {
-		err = -ENOMEM;
-		goto fail_unlock;
-	}
-
-	/* It's safe to adjust the same VA zone now */
-	same_va->nr_pages -= jit_va_pages;
-	kctx->same_va_end -= jit_va_pages;
-
-	/*
-	 * Create a custom VA zone at the end of the VA for allocations which
-	 * JIT can use so it doesn't have to allocate VA from the kernel.
-	 */
-	custom_va_reg = kbase_alloc_free_region(kctx,
-				kctx->same_va_end,
-				jit_va_pages,
-				KBASE_REG_ZONE_CUSTOM_VA);
-
-	if (!custom_va_reg) {
-		/*
-		 * The context will be destroyed if we fail here so no point
-		 * reverting the change we made to same_va.
-		 */
-		err = -ENOMEM;
-		goto fail_unlock;
-	}
-
-	kbase_region_tracker_insert(kctx, custom_va_reg);
-
-	kbase_gpu_vm_unlock(kctx);
-	return 0;
-
-fail_unlock:
-	kbase_gpu_vm_unlock(kctx);
-	return err;
-#else
-	return 0;
-#endif
-}
-
-int kbase_mem_init(struct kbase_device *kbdev)
-{
-	struct kbasep_mem_device *memdev;
-	int ret;
-
-	KBASE_DEBUG_ASSERT(kbdev);
-
-	memdev = &kbdev->memdev;
-	kbdev->mem_pool_max_size_default = KBASE_MEM_POOL_MAX_SIZE_KCTX;
-
-	/* Initialize memory usage */
-	atomic_set(&memdev->used_pages, 0);
-
-	ret = kbase_mem_pool_init(&kbdev->mem_pool,
-			KBASE_MEM_POOL_MAX_SIZE_KBDEV,
-			KBASE_MEM_POOL_4KB_PAGE_TABLE_ORDER,
-			kbdev,
-			NULL);
-	if (ret)
-		return ret;
-
-	ret = kbase_mem_pool_init(&kbdev->lp_mem_pool,
-			(KBASE_MEM_POOL_MAX_SIZE_KBDEV >> 9),
-			KBASE_MEM_POOL_2MB_PAGE_TABLE_ORDER,
-			kbdev,
-			NULL);
-	if (ret)
-		kbase_mem_pool_term(&kbdev->mem_pool);
-
-	return ret;
-}
-
-void kbase_mem_halt(struct kbase_device *kbdev)
-{
-	CSTD_UNUSED(kbdev);
-}
-
-void kbase_mem_term(struct kbase_device *kbdev)
-{
-	struct kbasep_mem_device *memdev;
-	int pages;
-
-	KBASE_DEBUG_ASSERT(kbdev);
-
-	memdev = &kbdev->memdev;
-
-	pages = atomic_read(&memdev->used_pages);
-	if (pages != 0)
-		dev_warn(kbdev->dev, "%s: %d pages in use!\n", __func__, pages);
-
-	kbase_mem_pool_term(&kbdev->mem_pool);
-	kbase_mem_pool_term(&kbdev->lp_mem_pool);
-}
-
-KBASE_EXPORT_TEST_API(kbase_mem_term);
-
-
-
-
-/**
- * @brief Allocate a free region object.
- *
- * The allocated object is not part of any list yet, and is flagged as
- * KBASE_REG_FREE. No mapping is allocated yet.
- *
- * zone is KBASE_REG_ZONE_CUSTOM_VA, KBASE_REG_ZONE_SAME_VA, or KBASE_REG_ZONE_EXEC
- *
- */
-struct kbase_va_region *kbase_alloc_free_region(struct kbase_context *kctx, u64 start_pfn, size_t nr_pages, int zone)
-{
-	struct kbase_va_region *new_reg;
-
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-
-	/* zone argument should only contain zone related region flags */
-	KBASE_DEBUG_ASSERT((zone & ~KBASE_REG_ZONE_MASK) == 0);
-	KBASE_DEBUG_ASSERT(nr_pages > 0);
-	/* 64-bit address range is the max */
-	KBASE_DEBUG_ASSERT(start_pfn + nr_pages <= (U64_MAX / PAGE_SIZE));
-
-	new_reg = kzalloc(sizeof(*new_reg), GFP_KERNEL);
-
-	if (!new_reg)
-		return NULL;
-
-	new_reg->cpu_alloc = NULL; /* no alloc bound yet */
-	new_reg->gpu_alloc = NULL; /* no alloc bound yet */
-	new_reg->kctx = kctx;
-	new_reg->flags = zone | KBASE_REG_FREE;
-
-	new_reg->flags |= KBASE_REG_GROWABLE;
-
-	new_reg->start_pfn = start_pfn;
-	new_reg->nr_pages = nr_pages;
-
-	return new_reg;
-}
-
-KBASE_EXPORT_TEST_API(kbase_alloc_free_region);
-
-/**
- * @brief Free a region object.
- *
- * The described region must be freed of any mapping.
- *
- * If the region is not flagged as KBASE_REG_FREE, the region's
- * alloc object will be released.
- * It is a bug if no alloc object exists for non-free regions.
- *
- */
-void kbase_free_alloced_region(struct kbase_va_region *reg)
-{
-	if (!(reg->flags & KBASE_REG_FREE)) {
-		/*
-		 * The physical allocation should have been removed from the
-		 * eviction list before this function is called. However, in the
-		 * case of abnormal process termination or the app leaking the
-		 * memory kbase_mem_free_region is not called so it can still be
-		 * on the list at termination time of the region tracker.
-		 */
-		if (!list_empty(&reg->gpu_alloc->evict_node)) {
-			/*
-			 * Unlink the physical allocation before unmaking it
-			 * evictable so that the allocation isn't grown back to
-			 * its last backed size as we're going to unmap it
-			 * anyway.
-			 */
-			reg->cpu_alloc->reg = NULL;
-			if (reg->cpu_alloc != reg->gpu_alloc)
-				reg->gpu_alloc->reg = NULL;
-
-			/*
-			 * If a region has been made evictable then we must
-			 * unmake it before trying to free it.
-			 * If the memory hasn't been reclaimed it will be
-			 * unmapped and freed below, if it has been reclaimed
-			 * then the operations below are no-ops.
-			 */
-			if (reg->flags & KBASE_REG_DONT_NEED) {
-				KBASE_DEBUG_ASSERT(reg->cpu_alloc->type ==
-						   KBASE_MEM_TYPE_NATIVE);
-				kbase_mem_evictable_unmake(reg->gpu_alloc);
-			}
-		}
-
-		/*
-		 * Remove the region from the sticky resource metadata
-		 * list should it be there.
-		 */
-		kbase_sticky_resource_release(reg->kctx, NULL,
-				reg->start_pfn << PAGE_SHIFT);
-
-		kbase_mem_phy_alloc_put(reg->cpu_alloc);
-		kbase_mem_phy_alloc_put(reg->gpu_alloc);
-		/* To detect use-after-free in debug builds */
-		KBASE_DEBUG_CODE(reg->flags |= KBASE_REG_FREE);
-	}
-	kfree(reg);
-}
-
-KBASE_EXPORT_TEST_API(kbase_free_alloced_region);
-
-int kbase_gpu_mmap(struct kbase_context *kctx, struct kbase_va_region *reg, u64 addr, size_t nr_pages, size_t align)
-{
-	int err;
-	size_t i = 0;
-	unsigned long attr;
-	unsigned long mask = ~KBASE_REG_MEMATTR_MASK;
-
-	if ((kctx->kbdev->system_coherency == COHERENCY_ACE) &&
-		(reg->flags & KBASE_REG_SHARE_BOTH))
-		attr = KBASE_REG_MEMATTR_INDEX(AS_MEMATTR_INDEX_OUTER_WA);
-	else
-		attr = KBASE_REG_MEMATTR_INDEX(AS_MEMATTR_INDEX_WRITE_ALLOC);
-
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-	KBASE_DEBUG_ASSERT(NULL != reg);
-
-	err = kbase_add_va_region(kctx, reg, addr, nr_pages, align);
-	if (err)
-		return err;
-
-	if (reg->gpu_alloc->type == KBASE_MEM_TYPE_ALIAS) {
-		u64 stride;
-		struct kbase_mem_phy_alloc *alloc;
-
-		alloc = reg->gpu_alloc;
-		stride = alloc->imported.alias.stride;
-		KBASE_DEBUG_ASSERT(alloc->imported.alias.aliased);
-		for (i = 0; i < alloc->imported.alias.nents; i++) {
-			if (alloc->imported.alias.aliased[i].alloc) {
-				err = kbase_mmu_insert_pages(kctx,
-						reg->start_pfn + (i * stride),
-						alloc->imported.alias.aliased[i].alloc->pages + alloc->imported.alias.aliased[i].offset,
-						alloc->imported.alias.aliased[i].length,
-						reg->flags);
-				if (err)
-					goto bad_insert;
-
-				kbase_mem_phy_alloc_gpu_mapped(alloc->imported.alias.aliased[i].alloc);
-			} else {
-				err = kbase_mmu_insert_single_page(kctx,
-					reg->start_pfn + i * stride,
-					kctx->aliasing_sink_page,
-					alloc->imported.alias.aliased[i].length,
-					(reg->flags & mask) | attr);
-
-				if (err)
-					goto bad_insert;
-			}
-		}
-	} else {
-		err = kbase_mmu_insert_pages(kctx, reg->start_pfn,
-				kbase_get_gpu_phy_pages(reg),
-				kbase_reg_current_backed_size(reg),
-				reg->flags);
-		if (err)
-			goto bad_insert;
-		kbase_mem_phy_alloc_gpu_mapped(reg->gpu_alloc);
-	}
-
-	return err;
-
-bad_insert:
-	if (reg->gpu_alloc->type == KBASE_MEM_TYPE_ALIAS) {
-		u64 stride;
-
-		stride = reg->gpu_alloc->imported.alias.stride;
-		KBASE_DEBUG_ASSERT(reg->gpu_alloc->imported.alias.aliased);
-		while (i--)
-			if (reg->gpu_alloc->imported.alias.aliased[i].alloc) {
-				kbase_mmu_teardown_pages(kctx, reg->start_pfn + (i * stride), reg->gpu_alloc->imported.alias.aliased[i].length);
-				kbase_mem_phy_alloc_gpu_unmapped(reg->gpu_alloc->imported.alias.aliased[i].alloc);
-			}
-	}
-
-	kbase_remove_va_region(kctx, reg);
-
-	return err;
-}
-
-KBASE_EXPORT_TEST_API(kbase_gpu_mmap);
-
-static void kbase_jd_user_buf_unmap(struct kbase_context *kctx,
-		struct kbase_mem_phy_alloc *alloc, bool writeable);
-
-int kbase_gpu_munmap(struct kbase_context *kctx, struct kbase_va_region *reg)
-{
-	int err;
-
-	if (reg->start_pfn == 0)
-		return 0;
-
-	if (reg->gpu_alloc && reg->gpu_alloc->type == KBASE_MEM_TYPE_ALIAS) {
-		size_t i;
-
-		err = kbase_mmu_teardown_pages(kctx, reg->start_pfn, reg->nr_pages);
-		KBASE_DEBUG_ASSERT(reg->gpu_alloc->imported.alias.aliased);
-		for (i = 0; i < reg->gpu_alloc->imported.alias.nents; i++)
-			if (reg->gpu_alloc->imported.alias.aliased[i].alloc)
-				kbase_mem_phy_alloc_gpu_unmapped(reg->gpu_alloc->imported.alias.aliased[i].alloc);
-	} else {
-		err = kbase_mmu_teardown_pages(kctx, reg->start_pfn, kbase_reg_current_backed_size(reg));
-		kbase_mem_phy_alloc_gpu_unmapped(reg->gpu_alloc);
-	}
-
-	if (reg->gpu_alloc && reg->gpu_alloc->type ==
-			KBASE_MEM_TYPE_IMPORTED_USER_BUF) {
-		struct kbase_alloc_import_user_buf *user_buf =
-			&reg->gpu_alloc->imported.user_buf;
-
-		if (user_buf->current_mapping_usage_count & PINNED_ON_IMPORT) {
-			user_buf->current_mapping_usage_count &=
-				~PINNED_ON_IMPORT;
-
-			kbase_jd_user_buf_unmap(kctx, reg->gpu_alloc,
-					(reg->flags & KBASE_REG_GPU_WR));
-		}
-	}
-
-	if (err)
-		return err;
-
-	err = kbase_remove_va_region(kctx, reg);
-	return err;
-}
-
-static struct kbase_cpu_mapping *kbasep_find_enclosing_cpu_mapping(
-		struct kbase_context *kctx,
-		unsigned long uaddr, size_t size, u64 *offset)
-{
-	struct vm_area_struct *vma;
-	struct kbase_cpu_mapping *map;
-	unsigned long vm_pgoff_in_region;
-	unsigned long vm_off_in_region;
-	unsigned long map_start;
-	size_t map_size;
-
-	lockdep_assert_held(&current->mm->mmap_sem);
-
-	if ((uintptr_t) uaddr + size < (uintptr_t) uaddr) /* overflow check */
-		return NULL;
-
-	vma = find_vma_intersection(current->mm, uaddr, uaddr+size);
-
-	if (!vma || vma->vm_start > uaddr)
-		return NULL;
-	if (vma->vm_ops != &kbase_vm_ops)
-		/* Not ours! */
-		return NULL;
-
-	map = vma->vm_private_data;
-
-	if (map->kctx != kctx)
-		/* Not from this context! */
-		return NULL;
-
-	vm_pgoff_in_region = vma->vm_pgoff - map->region->start_pfn;
-	vm_off_in_region = vm_pgoff_in_region << PAGE_SHIFT;
-	map_start = vma->vm_start - vm_off_in_region;
-	map_size = map->region->nr_pages << PAGE_SHIFT;
-
-	if ((uaddr + size) > (map_start + map_size))
-		/* Not within the CPU mapping */
-		return NULL;
-
-	*offset = (uaddr - vma->vm_start) + vm_off_in_region;
-
-	return map;
-}
-
-int kbasep_find_enclosing_cpu_mapping_offset(
-		struct kbase_context *kctx,
-		unsigned long uaddr, size_t size, u64 *offset)
-{
-	struct kbase_cpu_mapping *map;
-
-	kbase_os_mem_map_lock(kctx);
-
-	map = kbasep_find_enclosing_cpu_mapping(kctx, uaddr, size, offset);
-
-	kbase_os_mem_map_unlock(kctx);
-
-	if (!map)
-		return -EINVAL;
-
-	return 0;
-}
-
-KBASE_EXPORT_TEST_API(kbasep_find_enclosing_cpu_mapping_offset);
-
-void kbase_sync_single(struct kbase_context *kctx,
-		struct tagged_addr t_cpu_pa, struct tagged_addr t_gpu_pa,
-		off_t offset, size_t size, enum kbase_sync_type sync_fn)
-{
-	struct page *cpu_page;
-	phys_addr_t cpu_pa = as_phys_addr_t(t_cpu_pa);
-	phys_addr_t gpu_pa = as_phys_addr_t(t_gpu_pa);
-
-	cpu_page = pfn_to_page(PFN_DOWN(cpu_pa));
-
-	if (likely(cpu_pa == gpu_pa)) {
-		dma_addr_t dma_addr;
-
-		BUG_ON(!cpu_page);
-		BUG_ON(offset + size > PAGE_SIZE);
-
-		dma_addr = kbase_dma_addr(cpu_page) + offset;
-		if (sync_fn == KBASE_SYNC_TO_CPU)
-			dma_sync_single_for_cpu(kctx->kbdev->dev, dma_addr,
-					size, DMA_BIDIRECTIONAL);
-		else if (sync_fn == KBASE_SYNC_TO_DEVICE)
-			dma_sync_single_for_device(kctx->kbdev->dev, dma_addr,
-					size, DMA_BIDIRECTIONAL);
-	} else {
-		void *src = NULL;
-		void *dst = NULL;
-		struct page *gpu_page;
-
-		if (WARN(!gpu_pa, "No GPU PA found for infinite cache op"))
-			return;
-
-		gpu_page = pfn_to_page(PFN_DOWN(gpu_pa));
-
-		if (sync_fn == KBASE_SYNC_TO_DEVICE) {
-			src = ((unsigned char *)kmap(cpu_page)) + offset;
-			dst = ((unsigned char *)kmap(gpu_page)) + offset;
-		} else if (sync_fn == KBASE_SYNC_TO_CPU) {
-			dma_sync_single_for_cpu(kctx->kbdev->dev,
-					kbase_dma_addr(gpu_page) + offset,
-					size, DMA_BIDIRECTIONAL);
-			src = ((unsigned char *)kmap(gpu_page)) + offset;
-			dst = ((unsigned char *)kmap(cpu_page)) + offset;
-		}
-		memcpy(dst, src, size);
-		kunmap(gpu_page);
-		kunmap(cpu_page);
-		if (sync_fn == KBASE_SYNC_TO_DEVICE)
-			dma_sync_single_for_device(kctx->kbdev->dev,
-					kbase_dma_addr(gpu_page) + offset,
-					size, DMA_BIDIRECTIONAL);
-	}
-}
-
-static int kbase_do_syncset(struct kbase_context *kctx,
-		struct basep_syncset *sset, enum kbase_sync_type sync_fn)
-{
-	int err = 0;
-	struct kbase_va_region *reg;
-	struct kbase_cpu_mapping *map;
-	unsigned long start;
-	size_t size;
-	struct tagged_addr *cpu_pa;
-	struct tagged_addr *gpu_pa;
-	u64 page_off, page_count;
-	u64 i;
-	u64 offset;
-
-	kbase_os_mem_map_lock(kctx);
-	kbase_gpu_vm_lock(kctx);
-
-	/* find the region where the virtual address is contained */
-	reg = kbase_region_tracker_find_region_enclosing_address(kctx,
-			sset->mem_handle.basep.handle);
-	if (!reg) {
-		dev_warn(kctx->kbdev->dev, "Can't find region at VA 0x%016llX",
-				sset->mem_handle.basep.handle);
-		err = -EINVAL;
-		goto out_unlock;
-	}
-
-	if (!(reg->flags & KBASE_REG_CPU_CACHED) ||
-			kbase_mem_is_imported(reg->gpu_alloc->type))
-		goto out_unlock;
-
-	start = (uintptr_t)sset->user_addr;
-	size = (size_t)sset->size;
-
-	map = kbasep_find_enclosing_cpu_mapping(kctx, start, size, &offset);
-	if (!map) {
-		dev_warn(kctx->kbdev->dev, "Can't find CPU mapping 0x%016lX for VA 0x%016llX",
-				start, sset->mem_handle.basep.handle);
-		err = -EINVAL;
-		goto out_unlock;
-	}
-
-	page_off = offset >> PAGE_SHIFT;
-	offset &= ~PAGE_MASK;
-	page_count = (size + offset + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
-	cpu_pa = kbase_get_cpu_phy_pages(reg);
-	gpu_pa = kbase_get_gpu_phy_pages(reg);
-
-	if (page_off > reg->nr_pages ||
-			page_off + page_count > reg->nr_pages) {
-		/* Sync overflows the region */
-		err = -EINVAL;
-		goto out_unlock;
-	}
-
-	/* Sync first page */
-	if (as_phys_addr_t(cpu_pa[page_off])) {
-		size_t sz = MIN(((size_t) PAGE_SIZE - offset), size);
-
-		kbase_sync_single(kctx, cpu_pa[page_off], gpu_pa[page_off],
-				offset, sz, sync_fn);
-	}
-
-	/* Sync middle pages (if any) */
-	for (i = 1; page_count > 2 && i < page_count - 1; i++) {
-		/* we grow upwards, so bail on first non-present page */
-		if (!as_phys_addr_t(cpu_pa[page_off + i]))
-			break;
-
-		kbase_sync_single(kctx, cpu_pa[page_off + i],
-				gpu_pa[page_off + i], 0, PAGE_SIZE, sync_fn);
-	}
-
-	/* Sync last page (if any) */
-	if (page_count > 1 &&
-	    as_phys_addr_t(cpu_pa[page_off + page_count - 1])) {
-		size_t sz = ((start + size - 1) & ~PAGE_MASK) + 1;
-
-		kbase_sync_single(kctx, cpu_pa[page_off + page_count - 1],
-				gpu_pa[page_off + page_count - 1], 0, sz,
-				sync_fn);
-	}
-
-out_unlock:
-	kbase_gpu_vm_unlock(kctx);
-	kbase_os_mem_map_unlock(kctx);
-	return err;
-}
-
-int kbase_sync_now(struct kbase_context *kctx, struct basep_syncset *sset)
-{
-	int err = -EINVAL;
-
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	KBASE_DEBUG_ASSERT(sset != NULL);
-
-	if (sset->mem_handle.basep.handle & ~PAGE_MASK) {
-		dev_warn(kctx->kbdev->dev,
-				"mem_handle: passed parameter is invalid");
-		return -EINVAL;
-	}
-
-	switch (sset->type) {
-	case BASE_SYNCSET_OP_MSYNC:
-		err = kbase_do_syncset(kctx, sset, KBASE_SYNC_TO_DEVICE);
-		break;
-
-	case BASE_SYNCSET_OP_CSYNC:
-		err = kbase_do_syncset(kctx, sset, KBASE_SYNC_TO_CPU);
-		break;
-
-	default:
-		dev_warn(kctx->kbdev->dev, "Unknown msync op %d\n", sset->type);
-		break;
-	}
-
-	return err;
-}
-
-KBASE_EXPORT_TEST_API(kbase_sync_now);
-
-/* vm lock must be held */
-int kbase_mem_free_region(struct kbase_context *kctx, struct kbase_va_region *reg)
-{
-	int err;
-
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-	KBASE_DEBUG_ASSERT(NULL != reg);
-	lockdep_assert_held(&kctx->reg_lock);
-
-	/*
-	 * Unlink the physical allocation before unmaking it evictable so
-	 * that the allocation isn't grown back to its last backed size
-	 * as we're going to unmap it anyway.
-	 */
-	reg->cpu_alloc->reg = NULL;
-	if (reg->cpu_alloc != reg->gpu_alloc)
-		reg->gpu_alloc->reg = NULL;
-
-	/*
-	 * If a region has been made evictable then we must unmake it
-	 * before trying to free it.
-	 * If the memory hasn't been reclaimed it will be unmapped and freed
-	 * below, if it has been reclaimed then the operations below are no-ops.
-	 */
-	if (reg->flags & KBASE_REG_DONT_NEED) {
-		KBASE_DEBUG_ASSERT(reg->cpu_alloc->type ==
-				   KBASE_MEM_TYPE_NATIVE);
-		kbase_mem_evictable_unmake(reg->gpu_alloc);
-	}
-
-	err = kbase_gpu_munmap(kctx, reg);
-	if (err) {
-		dev_warn(reg->kctx->kbdev->dev, "Could not unmap from the GPU...\n");
-		goto out;
-	}
-
-	/* This will also free the physical pages */
-	kbase_free_alloced_region(reg);
-
- out:
-	return err;
-}
-
-KBASE_EXPORT_TEST_API(kbase_mem_free_region);
-
-/**
- * @brief Free the region from the GPU and unregister it.
- *
- * This function implements the free operation on a memory segment.
- * It will loudly fail if called with outstanding mappings.
- */
-int kbase_mem_free(struct kbase_context *kctx, u64 gpu_addr)
-{
-	int err = 0;
-	struct kbase_va_region *reg;
-
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-
-	if ((gpu_addr & ~PAGE_MASK) && (gpu_addr >= PAGE_SIZE)) {
-		dev_warn(kctx->kbdev->dev, "kbase_mem_free: gpu_addr parameter is invalid");
-		return -EINVAL;
-	}
-
-	if (0 == gpu_addr) {
-		dev_warn(kctx->kbdev->dev, "gpu_addr 0 is reserved for the ringbuffer and it's an error to try to free it using kbase_mem_free\n");
-		return -EINVAL;
-	}
-	kbase_gpu_vm_lock(kctx);
-
-	if (gpu_addr >= BASE_MEM_COOKIE_BASE &&
-	    gpu_addr < BASE_MEM_FIRST_FREE_ADDRESS) {
-		int cookie = PFN_DOWN(gpu_addr - BASE_MEM_COOKIE_BASE);
-
-		reg = kctx->pending_regions[cookie];
-		if (!reg) {
-			err = -EINVAL;
-			goto out_unlock;
-		}
-
-		/* ask to unlink the cookie as we'll free it */
-
-		kctx->pending_regions[cookie] = NULL;
-		kctx->cookies |= (1UL << cookie);
-
-		kbase_free_alloced_region(reg);
-	} else {
-		/* A real GPU va */
-		/* Validate the region */
-		reg = kbase_region_tracker_find_region_base_address(kctx, gpu_addr);
-		if (!reg || (reg->flags & KBASE_REG_FREE)) {
-			dev_warn(kctx->kbdev->dev, "kbase_mem_free called with nonexistent gpu_addr 0x%llX",
-					gpu_addr);
-			err = -EINVAL;
-			goto out_unlock;
-		}
-
-		if ((reg->flags & KBASE_REG_ZONE_MASK) == KBASE_REG_ZONE_SAME_VA) {
-			/* SAME_VA must be freed through munmap */
-			dev_warn(kctx->kbdev->dev, "%s called on SAME_VA memory 0x%llX", __func__,
-					gpu_addr);
-			err = -EINVAL;
-			goto out_unlock;
-		}
-		err = kbase_mem_free_region(kctx, reg);
-	}
-
- out_unlock:
-	kbase_gpu_vm_unlock(kctx);
-	return err;
-}
-
-KBASE_EXPORT_TEST_API(kbase_mem_free);
-
-int kbase_update_region_flags(struct kbase_context *kctx,
-		struct kbase_va_region *reg, unsigned long flags)
-{
-	KBASE_DEBUG_ASSERT(NULL != reg);
-	KBASE_DEBUG_ASSERT((flags & ~((1ul << BASE_MEM_FLAGS_NR_BITS) - 1)) == 0);
-
-	reg->flags |= kbase_cache_enabled(flags, reg->nr_pages);
-	/* all memory is now growable */
-	reg->flags |= KBASE_REG_GROWABLE;
-
-	if (flags & BASE_MEM_GROW_ON_GPF)
-		reg->flags |= KBASE_REG_PF_GROW;
-
-	if (flags & BASE_MEM_PROT_CPU_WR)
-		reg->flags |= KBASE_REG_CPU_WR;
-
-	if (flags & BASE_MEM_PROT_CPU_RD)
-		reg->flags |= KBASE_REG_CPU_RD;
-
-	if (flags & BASE_MEM_PROT_GPU_WR)
-		reg->flags |= KBASE_REG_GPU_WR;
-
-	if (flags & BASE_MEM_PROT_GPU_RD)
-		reg->flags |= KBASE_REG_GPU_RD;
-
-	if (0 == (flags & BASE_MEM_PROT_GPU_EX))
-		reg->flags |= KBASE_REG_GPU_NX;
-
-	if (!kbase_device_is_cpu_coherent(kctx->kbdev)) {
-		if (flags & BASE_MEM_COHERENT_SYSTEM_REQUIRED)
-			return -EINVAL;
-	} else if (flags & (BASE_MEM_COHERENT_SYSTEM |
-			BASE_MEM_COHERENT_SYSTEM_REQUIRED)) {
-		reg->flags |= KBASE_REG_SHARE_BOTH;
-	}
-
-	if (!(reg->flags & KBASE_REG_SHARE_BOTH) &&
-			flags & BASE_MEM_COHERENT_LOCAL) {
-		reg->flags |= KBASE_REG_SHARE_IN;
-	}
-
-	/* Set up default MEMATTR usage */
-	if (kctx->kbdev->system_coherency == COHERENCY_ACE &&
-		(reg->flags & KBASE_REG_SHARE_BOTH)) {
-		reg->flags |=
-			KBASE_REG_MEMATTR_INDEX(AS_MEMATTR_INDEX_DEFAULT_ACE);
-	} else {
-		reg->flags |=
-			KBASE_REG_MEMATTR_INDEX(AS_MEMATTR_INDEX_DEFAULT);
-	}
-
-	return 0;
-}
-
-int kbase_alloc_phy_pages_helper(
-	struct kbase_mem_phy_alloc *alloc,
-	size_t nr_pages_requested)
-{
-	int new_page_count __maybe_unused;
-	size_t old_page_count = alloc->nents;
-	size_t nr_left = nr_pages_requested;
-	int res;
-	struct kbase_context *kctx;
-	struct tagged_addr *tp;
-
-	KBASE_DEBUG_ASSERT(alloc->type == KBASE_MEM_TYPE_NATIVE);
-	KBASE_DEBUG_ASSERT(alloc->imported.kctx);
-
-	kctx = alloc->imported.kctx;
-
-	if (nr_pages_requested == 0)
-		goto done; /*nothing to do*/
-
-	new_page_count = kbase_atomic_add_pages(
-			nr_pages_requested, &kctx->used_pages);
-	kbase_atomic_add_pages(nr_pages_requested,
-			       &kctx->kbdev->memdev.used_pages);
-
-	/* Increase mm counters before we allocate pages so that this
-	 * allocation is visible to the OOM killer */
-	kbase_process_page_usage_inc(kctx, nr_pages_requested);
-
-	tp = alloc->pages + old_page_count;
-
-#ifdef CONFIG_MALI_2MB_ALLOC
-	/* Check if we have enough pages requested so we can allocate a large
-	 * page (512 * 4KB = 2MB )
-	 */
-	if (nr_left >= (SZ_2M / SZ_4K)) {
-		int nr_lp = nr_left / (SZ_2M / SZ_4K);
-
-		res = kbase_mem_pool_alloc_pages(&kctx->lp_mem_pool,
-						 nr_lp * (SZ_2M / SZ_4K),
-						 tp,
-						 true);
-
-		if (res > 0) {
-			nr_left -= res;
-			tp += res;
-		}
-
-		if (nr_left) {
-			struct kbase_sub_alloc *sa, *temp_sa;
-
-			mutex_lock(&kctx->mem_partials_lock);
-
-			list_for_each_entry_safe(sa, temp_sa,
-						 &kctx->mem_partials, link) {
-				int pidx = 0;
-
-				while (nr_left) {
-					pidx = find_next_zero_bit(sa->sub_pages,
-								  SZ_2M / SZ_4K,
-								  pidx);
-					bitmap_set(sa->sub_pages, pidx, 1);
-					*tp++ = as_tagged_tag(page_to_phys(sa->page +
-									   pidx),
-							      FROM_PARTIAL);
-					nr_left--;
-
-					if (bitmap_full(sa->sub_pages, SZ_2M / SZ_4K)) {
-						/* unlink from partial list when full */
-						list_del_init(&sa->link);
-						break;
-					}
-				}
-			}
-			mutex_unlock(&kctx->mem_partials_lock);
-		}
-
-		/* only if we actually have a chunk left <512. If more it indicates
-		 * that we couldn't allocate a 2MB above, so no point to retry here.
-		 */
-		if (nr_left > 0 && nr_left < (SZ_2M / SZ_4K)) {
-			/* create a new partial and suballocate the rest from it */
-			struct page *np = NULL;
-
-			do {
-				int err;
-
-				np = kbase_mem_pool_alloc(&kctx->lp_mem_pool);
-				if (np)
-					break;
-				err = kbase_mem_pool_grow(&kctx->lp_mem_pool, 1);
-				if (err)
-					break;
-			} while (1);
-
-			if (np) {
-				int i;
-				struct kbase_sub_alloc *sa;
-				struct page *p;
-
-				sa = kmalloc(sizeof(*sa), GFP_KERNEL);
-				if (!sa) {
-					kbase_mem_pool_free(&kctx->lp_mem_pool, np, false);
-					goto no_new_partial;
-				}
-
-				/* store pointers back to the control struct */
-				np->lru.next = (void *)sa;
-				for (p = np; p < np + SZ_2M / SZ_4K; p++)
-					p->lru.prev = (void *)np;
-				INIT_LIST_HEAD(&sa->link);
-				bitmap_zero(sa->sub_pages, SZ_2M / SZ_4K);
-				sa->page = np;
-
-				for (i = 0; i < nr_left; i++)
-					*tp++ = as_tagged_tag(page_to_phys(np + i), FROM_PARTIAL);
-
-				bitmap_set(sa->sub_pages, 0, nr_left);
-				nr_left = 0;
-
-				/* expose for later use */
-				mutex_lock(&kctx->mem_partials_lock);
-				list_add(&sa->link, &kctx->mem_partials);
-				mutex_unlock(&kctx->mem_partials_lock);
-			}
-		}
-	}
-no_new_partial:
-#endif
-
-	if (nr_left) {
-		res = kbase_mem_pool_alloc_pages(&kctx->mem_pool,
-						 nr_left,
-						 tp,
-						 false);
-		if (res <= 0)
-			goto alloc_failed;
-	}
-
-	/*
-	 * Request a zone cache update, this scans only the new pages an
-	 * appends their information to the zone cache. if the update
-	 * fails then clear the cache so we fall-back to doing things
-	 * page by page.
-	 */
-	if (kbase_zone_cache_update(alloc, old_page_count) != 0)
-		kbase_zone_cache_clear(alloc);
-
-	KBASE_TLSTREAM_AUX_PAGESALLOC(
-			kctx->id,
-			(u64)new_page_count);
-
-	alloc->nents += nr_pages_requested;
-done:
-	return 0;
-
-alloc_failed:
-	/* rollback needed if got one or more 2MB but failed later */
-	if (nr_left != nr_pages_requested)
-		kbase_mem_pool_free_pages(&kctx->lp_mem_pool,
-				  nr_pages_requested - nr_left,
-				  alloc->pages + old_page_count,
-				  false,
-				  false);
-
-	kbase_process_page_usage_dec(kctx, nr_pages_requested);
-	kbase_atomic_sub_pages(nr_pages_requested, &kctx->used_pages);
-	kbase_atomic_sub_pages(nr_pages_requested,
-			       &kctx->kbdev->memdev.used_pages);
-
-	return -ENOMEM;
-}
-
-static void free_partial(struct kbase_context *kctx, struct tagged_addr tp)
-{
-	struct page *p, *head_page;
-	struct kbase_sub_alloc *sa;
-
-	p = phys_to_page(as_phys_addr_t(tp));
-	head_page = (struct page *)p->lru.prev;
-	sa = (struct kbase_sub_alloc *)head_page->lru.next;
-	mutex_lock(&kctx->mem_partials_lock);
-	clear_bit(p - head_page, sa->sub_pages);
-	if (bitmap_empty(sa->sub_pages, SZ_2M / SZ_4K)) {
-		list_del(&sa->link);
-		kbase_mem_pool_free(&kctx->lp_mem_pool, head_page, true);
-		kfree(sa);
-	} else if (bitmap_weight(sa->sub_pages, SZ_2M / SZ_4K) ==
-		   SZ_2M / SZ_4K - 1) {
-		/* expose the partial again */
-		list_add(&sa->link, &kctx->mem_partials);
-	}
-	mutex_unlock(&kctx->mem_partials_lock);
-}
-
-int kbase_free_phy_pages_helper(
-	struct kbase_mem_phy_alloc *alloc,
-	size_t nr_pages_to_free)
-{
-	struct kbase_context *kctx = alloc->imported.kctx;
-	bool syncback;
-	bool reclaimed = (alloc->evicted != 0);
-	struct tagged_addr *start_free;
-	int new_page_count __maybe_unused;
-	size_t freed = 0;
-
-	KBASE_DEBUG_ASSERT(alloc->type == KBASE_MEM_TYPE_NATIVE);
-	KBASE_DEBUG_ASSERT(alloc->imported.kctx);
-	KBASE_DEBUG_ASSERT(alloc->nents >= nr_pages_to_free);
-
-	/* early out if nothing to do */
-	if (0 == nr_pages_to_free)
-		return 0;
-
-	start_free = alloc->pages + alloc->nents - nr_pages_to_free;
-
-	syncback = alloc->properties & KBASE_MEM_PHY_ALLOC_ACCESSED_CACHED;
-
-	/* pad start_free to a valid start location */
-	while (nr_pages_to_free && is_huge(*start_free) &&
-	       !is_huge_head(*start_free)) {
-		nr_pages_to_free--;
-		start_free++;
-	}
-
-	/*
-	 * Clear the zone cache, we don't expect JIT allocations to be
-	 * shrunk in parts so there is no point trying to optimize for that
-	 * by scanning for the changes caused by freeing this memory and
-	 * updating the existing cache entries.
-	 */
-	kbase_zone_cache_clear(alloc);
-
-
-	while (nr_pages_to_free) {
-		if (is_huge_head(*start_free)) {
-			/* This is a 2MB entry, so free all the 512 pages that
-			 * it points to
-			 */
-			kbase_mem_pool_free_pages(&kctx->lp_mem_pool,
-					512,
-					start_free,
-					syncback,
-					reclaimed);
-			nr_pages_to_free -= 512;
-			start_free += 512;
-			freed += 512;
-		} else if (is_partial(*start_free)) {
-			free_partial(kctx, *start_free);
-			nr_pages_to_free--;
-			start_free++;
-			freed++;
-		} else {
-			struct tagged_addr *local_end_free;
-
-			local_end_free = start_free;
-			while (nr_pages_to_free &&
-			       !is_huge(*local_end_free) &&
-			       !is_partial(*local_end_free)) {
-				local_end_free++;
-				nr_pages_to_free--;
-			}
-			kbase_mem_pool_free_pages(&kctx->mem_pool,
-					local_end_free - start_free,
-					start_free,
-					syncback,
-					reclaimed);
-			freed += local_end_free - start_free;
-			start_free += local_end_free - start_free;
-		}
-	}
-
-	alloc->nents -= freed;
-
-	/*
-	 * If the allocation was not evicted (i.e. evicted == 0) then
-	 * the page accounting needs to be done.
-	 */
-	if (!reclaimed) {
-		kbase_process_page_usage_dec(kctx, freed);
-		new_page_count = kbase_atomic_sub_pages(freed,
-							&kctx->used_pages);
-		kbase_atomic_sub_pages(freed,
-				       &kctx->kbdev->memdev.used_pages);
-
-		KBASE_TLSTREAM_AUX_PAGESALLOC(
-				kctx->id,
-				(u64)new_page_count);
-	}
-
-	return 0;
-}
-
-void kbase_mem_kref_free(struct kref *kref)
-{
-	struct kbase_mem_phy_alloc *alloc;
-
-	alloc = container_of(kref, struct kbase_mem_phy_alloc, kref);
-
-	switch (alloc->type) {
-	case KBASE_MEM_TYPE_NATIVE: {
-		WARN_ON(!alloc->imported.kctx);
-		/*
-		 * The physical allocation must have been removed from the
-		 * eviction list before trying to free it.
-		 */
-		WARN_ON(!list_empty(&alloc->evict_node));
-		kbase_free_phy_pages_helper(alloc, alloc->nents);
-		break;
-	}
-	case KBASE_MEM_TYPE_ALIAS: {
-		/* just call put on the underlying phy allocs */
-		size_t i;
-		struct kbase_aliased *aliased;
-
-		aliased = alloc->imported.alias.aliased;
-		if (aliased) {
-			for (i = 0; i < alloc->imported.alias.nents; i++)
-				if (aliased[i].alloc)
-					kbase_mem_phy_alloc_put(aliased[i].alloc);
-			vfree(aliased);
-		}
-		break;
-	}
-	case KBASE_MEM_TYPE_RAW:
-		/* raw pages, external cleanup */
-		break;
- #ifdef CONFIG_UMP
-	case KBASE_MEM_TYPE_IMPORTED_UMP:
-		ump_dd_release(alloc->imported.ump_handle);
-		break;
-#endif
-#ifdef CONFIG_DMA_SHARED_BUFFER
-	case KBASE_MEM_TYPE_IMPORTED_UMM:
-		dma_buf_detach(alloc->imported.umm.dma_buf,
-			       alloc->imported.umm.dma_attachment);
-		dma_buf_put(alloc->imported.umm.dma_buf);
-		break;
-#endif
-	case KBASE_MEM_TYPE_IMPORTED_USER_BUF:
-		if (alloc->imported.user_buf.mm)
-			mmdrop(alloc->imported.user_buf.mm);
-		kfree(alloc->imported.user_buf.pages);
-		break;
-	case KBASE_MEM_TYPE_TB:{
-		void *tb;
-
-		tb = alloc->imported.kctx->jctx.tb;
-		kbase_device_trace_buffer_uninstall(alloc->imported.kctx);
-		vfree(tb);
-		break;
-	}
-	default:
-		WARN(1, "Unexecpted free of type %d\n", alloc->type);
-		break;
-	}
-
-	/* Free based on allocation type */
-	if (alloc->properties & KBASE_MEM_PHY_ALLOC_LARGE)
-		vfree(alloc);
-	else
-		kfree(alloc);
-}
-
-KBASE_EXPORT_TEST_API(kbase_mem_kref_free);
-
-int kbase_alloc_phy_pages(struct kbase_va_region *reg, size_t vsize, size_t size)
-{
-	KBASE_DEBUG_ASSERT(NULL != reg);
-	KBASE_DEBUG_ASSERT(vsize > 0);
-
-	/* validate user provided arguments */
-	if (size > vsize || vsize > reg->nr_pages)
-		goto out_term;
-
-	/* Prevent vsize*sizeof from wrapping around.
-	 * For instance, if vsize is 2**29+1, we'll allocate 1 byte and the alloc won't fail.
-	 */
-	if ((size_t) vsize > ((size_t) -1 / sizeof(*reg->cpu_alloc->pages)))
-		goto out_term;
-
-	KBASE_DEBUG_ASSERT(0 != vsize);
-
-	if (kbase_alloc_phy_pages_helper(reg->cpu_alloc, size) != 0)
-		goto out_term;
-
-	reg->cpu_alloc->reg = reg;
-	if (reg->cpu_alloc != reg->gpu_alloc) {
-		if (kbase_alloc_phy_pages_helper(reg->gpu_alloc, size) != 0)
-			goto out_rollback;
-		reg->gpu_alloc->reg = reg;
-	}
-
-	return 0;
-
-out_rollback:
-	kbase_free_phy_pages_helper(reg->cpu_alloc, size);
-out_term:
-	return -1;
-}
-
-KBASE_EXPORT_TEST_API(kbase_alloc_phy_pages);
-
-bool kbase_check_alloc_flags(unsigned long flags)
-{
-	/* Only known input flags should be set. */
-	if (flags & ~BASE_MEM_FLAGS_INPUT_MASK)
-		return false;
-
-	/* At least one flag should be set */
-	if (flags == 0)
-		return false;
-
-	/* Either the GPU or CPU must be reading from the allocated memory */
-	if ((flags & (BASE_MEM_PROT_CPU_RD | BASE_MEM_PROT_GPU_RD)) == 0)
-		return false;
-
-	/* Either the GPU or CPU must be writing to the allocated memory */
-	if ((flags & (BASE_MEM_PROT_CPU_WR | BASE_MEM_PROT_GPU_WR)) == 0)
-		return false;
-
-	/* GPU cannot be writing to GPU executable memory and cannot grow the memory on page fault. */
-	if ((flags & BASE_MEM_PROT_GPU_EX) && (flags & (BASE_MEM_PROT_GPU_WR | BASE_MEM_GROW_ON_GPF)))
-		return false;
-
-	/* GPU should have at least read or write access otherwise there is no
-	   reason for allocating. */
-	if ((flags & (BASE_MEM_PROT_GPU_RD | BASE_MEM_PROT_GPU_WR)) == 0)
-		return false;
-
-	/* BASE_MEM_IMPORT_SHARED is only valid for imported memory */
-	if ((flags & BASE_MEM_IMPORT_SHARED) == BASE_MEM_IMPORT_SHARED)
-		return false;
-
-	return true;
-}
-
-bool kbase_check_import_flags(unsigned long flags)
-{
-	/* Only known input flags should be set. */
-	if (flags & ~BASE_MEM_FLAGS_INPUT_MASK)
-		return false;
-
-	/* At least one flag should be set */
-	if (flags == 0)
-		return false;
-
-	/* Imported memory cannot be GPU executable */
-	if (flags & BASE_MEM_PROT_GPU_EX)
-		return false;
-
-	/* Imported memory cannot grow on page fault */
-	if (flags & BASE_MEM_GROW_ON_GPF)
-		return false;
-
-	/* GPU should have at least read or write access otherwise there is no
-	   reason for importing. */
-	if ((flags & (BASE_MEM_PROT_GPU_RD | BASE_MEM_PROT_GPU_WR)) == 0)
-		return false;
-
-	/* Secure memory cannot be read by the CPU */
-	if ((flags & BASE_MEM_SECURE) && (flags & BASE_MEM_PROT_CPU_RD))
-		return false;
-
-	return true;
-}
-
-/**
- * @brief Acquire the per-context region list lock
- */
-void kbase_gpu_vm_lock(struct kbase_context *kctx)
-{
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	mutex_lock(&kctx->reg_lock);
-}
-
-KBASE_EXPORT_TEST_API(kbase_gpu_vm_lock);
-
-/**
- * @brief Release the per-context region list lock
- */
-void kbase_gpu_vm_unlock(struct kbase_context *kctx)
-{
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	mutex_unlock(&kctx->reg_lock);
-}
-
-KBASE_EXPORT_TEST_API(kbase_gpu_vm_unlock);
-
-#ifdef CONFIG_DEBUG_FS
-struct kbase_jit_debugfs_data {
-	int (*func)(struct kbase_jit_debugfs_data *);
-	struct mutex lock;
-	struct kbase_context *kctx;
-	u64 active_value;
-	u64 pool_value;
-	u64 destroy_value;
-	char buffer[50];
-};
-
-static int kbase_jit_debugfs_common_open(struct inode *inode,
-		struct file *file, int (*func)(struct kbase_jit_debugfs_data *))
-{
-	struct kbase_jit_debugfs_data *data;
-
-	data = kzalloc(sizeof(*data), GFP_KERNEL);
-	if (!data)
-		return -ENOMEM;
-
-	data->func = func;
-	mutex_init(&data->lock);
-	data->kctx = (struct kbase_context *) inode->i_private;
-
-	file->private_data = data;
-
-	return nonseekable_open(inode, file);
-}
-
-static ssize_t kbase_jit_debugfs_common_read(struct file *file,
-		char __user *buf, size_t len, loff_t *ppos)
-{
-	struct kbase_jit_debugfs_data *data;
-	size_t size;
-	int ret;
-
-	data = (struct kbase_jit_debugfs_data *) file->private_data;
-	mutex_lock(&data->lock);
-
-	if (*ppos) {
-		size = strnlen(data->buffer, sizeof(data->buffer));
-	} else {
-		if (!data->func) {
-			ret = -EACCES;
-			goto out_unlock;
-		}
-
-		if (data->func(data)) {
-			ret = -EACCES;
-			goto out_unlock;
-		}
-
-		size = scnprintf(data->buffer, sizeof(data->buffer),
-				"%llu,%llu,%llu", data->active_value,
-				data->pool_value, data->destroy_value);
-	}
-
-	ret = simple_read_from_buffer(buf, len, ppos, data->buffer, size);
-
-out_unlock:
-	mutex_unlock(&data->lock);
-	return ret;
-}
-
-static int kbase_jit_debugfs_common_release(struct inode *inode,
-		struct file *file)
-{
-	kfree(file->private_data);
-	return 0;
-}
-
-#define KBASE_JIT_DEBUGFS_DECLARE(__fops, __func) \
-static int __fops ## _open(struct inode *inode, struct file *file) \
-{ \
-	return kbase_jit_debugfs_common_open(inode, file, __func); \
-} \
-static const struct file_operations __fops = { \
-	.owner = THIS_MODULE, \
-	.open = __fops ## _open, \
-	.release = kbase_jit_debugfs_common_release, \
-	.read = kbase_jit_debugfs_common_read, \
-	.write = NULL, \
-	.llseek = generic_file_llseek, \
-}
-
-static int kbase_jit_debugfs_count_get(struct kbase_jit_debugfs_data *data)
-{
-	struct kbase_context *kctx = data->kctx;
-	struct list_head *tmp;
-
-	mutex_lock(&kctx->jit_evict_lock);
-	list_for_each(tmp, &kctx->jit_active_head) {
-		data->active_value++;
-	}
-
-	list_for_each(tmp, &kctx->jit_pool_head) {
-		data->pool_value++;
-	}
-
-	list_for_each(tmp, &kctx->jit_destroy_head) {
-		data->destroy_value++;
-	}
-	mutex_unlock(&kctx->jit_evict_lock);
-
-	return 0;
-}
-KBASE_JIT_DEBUGFS_DECLARE(kbase_jit_debugfs_count_fops,
-		kbase_jit_debugfs_count_get);
-
-static int kbase_jit_debugfs_vm_get(struct kbase_jit_debugfs_data *data)
-{
-	struct kbase_context *kctx = data->kctx;
-	struct kbase_va_region *reg;
-
-	mutex_lock(&kctx->jit_evict_lock);
-	list_for_each_entry(reg, &kctx->jit_active_head, jit_node) {
-		data->active_value += reg->nr_pages;
-	}
-
-	list_for_each_entry(reg, &kctx->jit_pool_head, jit_node) {
-		data->pool_value += reg->nr_pages;
-	}
-
-	list_for_each_entry(reg, &kctx->jit_destroy_head, jit_node) {
-		data->destroy_value += reg->nr_pages;
-	}
-	mutex_unlock(&kctx->jit_evict_lock);
-
-	return 0;
-}
-KBASE_JIT_DEBUGFS_DECLARE(kbase_jit_debugfs_vm_fops,
-		kbase_jit_debugfs_vm_get);
-
-static int kbase_jit_debugfs_phys_get(struct kbase_jit_debugfs_data *data)
-{
-	struct kbase_context *kctx = data->kctx;
-	struct kbase_va_region *reg;
-
-	mutex_lock(&kctx->jit_evict_lock);
-	list_for_each_entry(reg, &kctx->jit_active_head, jit_node) {
-		data->active_value += reg->gpu_alloc->nents;
-	}
-
-	list_for_each_entry(reg, &kctx->jit_pool_head, jit_node) {
-		data->pool_value += reg->gpu_alloc->nents;
-	}
-
-	list_for_each_entry(reg, &kctx->jit_destroy_head, jit_node) {
-		data->destroy_value += reg->gpu_alloc->nents;
-	}
-	mutex_unlock(&kctx->jit_evict_lock);
-
-	return 0;
-}
-KBASE_JIT_DEBUGFS_DECLARE(kbase_jit_debugfs_phys_fops,
-		kbase_jit_debugfs_phys_get);
-
-void kbase_jit_debugfs_init(struct kbase_context *kctx)
-{
-	/* Debugfs entry for getting the number of JIT allocations. */
-	debugfs_create_file("mem_jit_count", S_IRUGO, kctx->kctx_dentry,
-			kctx, &kbase_jit_debugfs_count_fops);
-
-	/*
-	 * Debugfs entry for getting the total number of virtual pages
-	 * used by JIT allocations.
-	 */
-	debugfs_create_file("mem_jit_vm", S_IRUGO, kctx->kctx_dentry,
-			kctx, &kbase_jit_debugfs_vm_fops);
-
-	/*
-	 * Debugfs entry for getting the number of physical pages used
-	 * by JIT allocations.
-	 */
-	debugfs_create_file("mem_jit_phys", S_IRUGO, kctx->kctx_dentry,
-			kctx, &kbase_jit_debugfs_phys_fops);
-}
-#endif /* CONFIG_DEBUG_FS */
-
-/**
- * kbase_jit_destroy_worker - Deferred worker which frees JIT allocations
- * @work: Work item
- *
- * This function does the work of freeing JIT allocations whose physical
- * backing has been released.
- */
-static void kbase_jit_destroy_worker(struct work_struct *work)
-{
-	struct kbase_context *kctx;
-	struct kbase_va_region *reg;
-
-	kctx = container_of(work, struct kbase_context, jit_work);
-	do {
-		mutex_lock(&kctx->jit_evict_lock);
-		if (list_empty(&kctx->jit_destroy_head)) {
-			mutex_unlock(&kctx->jit_evict_lock);
-			break;
-		}
-
-		reg = list_first_entry(&kctx->jit_destroy_head,
-				struct kbase_va_region, jit_node);
-
-		list_del(&reg->jit_node);
-		mutex_unlock(&kctx->jit_evict_lock);
-
-		kbase_gpu_vm_lock(kctx);
-		kbase_mem_free_region(kctx, reg);
-		kbase_gpu_vm_unlock(kctx);
-	} while (1);
-}
-
-int kbase_jit_init(struct kbase_context *kctx)
-{
-	INIT_LIST_HEAD(&kctx->jit_active_head);
-	INIT_LIST_HEAD(&kctx->jit_pool_head);
-	INIT_LIST_HEAD(&kctx->jit_destroy_head);
-	INIT_WORK(&kctx->jit_work, kbase_jit_destroy_worker);
-
-	INIT_LIST_HEAD(&kctx->jit_pending_alloc);
-	INIT_LIST_HEAD(&kctx->jit_atoms_head);
-
-	return 0;
-}
-
-struct kbase_va_region *kbase_jit_allocate(struct kbase_context *kctx,
-		struct base_jit_alloc_info *info)
-{
-	struct kbase_va_region *reg = NULL;
-	struct kbase_va_region *walker;
-	struct kbase_va_region *temp;
-	size_t current_diff = SIZE_MAX;
-
-	int ret;
-
-	mutex_lock(&kctx->jit_evict_lock);
-	/*
-	 * Scan the pool for an existing allocation which meets our
-	 * requirements and remove it.
-	 */
-	list_for_each_entry_safe(walker, temp, &kctx->jit_pool_head, jit_node) {
-
-		if (walker->nr_pages >= info->va_pages) {
-			size_t min_size, max_size, diff;
-
-			/*
-			 * The JIT allocations VA requirements have been
-			 * meet, it's suitable but other allocations
-			 * might be a better fit.
-			 */
-			min_size = min_t(size_t, walker->gpu_alloc->nents,
-					info->commit_pages);
-			max_size = max_t(size_t, walker->gpu_alloc->nents,
-					info->commit_pages);
-			diff = max_size - min_size;
-
-			if (current_diff > diff) {
-				current_diff = diff;
-				reg = walker;
-			}
-
-			/* The allocation is an exact match, stop looking */
-			if (current_diff == 0)
-				break;
-		}
-	}
-
-	if (reg) {
-		/*
-		 * Remove the found region from the pool and add it to the
-		 * active list.
-		 */
-		list_move(&reg->jit_node, &kctx->jit_active_head);
-
-		/*
-		 * Remove the allocation from the eviction list as it's no
-		 * longer eligible for eviction. This must be done before
-		 * dropping the jit_evict_lock
-		 */
-		list_del_init(&reg->gpu_alloc->evict_node);
-		mutex_unlock(&kctx->jit_evict_lock);
-
-		kbase_gpu_vm_lock(kctx);
-
-		/* Make the physical backing no longer reclaimable */
-		if (!kbase_mem_evictable_unmake(reg->gpu_alloc))
-			goto update_failed;
-
-		/* Grow the backing if required */
-		if (reg->gpu_alloc->nents < info->commit_pages) {
-			size_t delta;
-			size_t old_size = reg->gpu_alloc->nents;
-
-			/* Allocate some more pages */
-			delta = info->commit_pages - reg->gpu_alloc->nents;
-			if (kbase_alloc_phy_pages_helper(reg->gpu_alloc, delta)
-					!= 0)
-				goto update_failed;
-
-			if (reg->cpu_alloc != reg->gpu_alloc) {
-				if (kbase_alloc_phy_pages_helper(
-						reg->cpu_alloc, delta) != 0) {
-					kbase_free_phy_pages_helper(
-							reg->gpu_alloc, delta);
-					goto update_failed;
-				}
-			}
-
-			ret = kbase_mem_grow_gpu_mapping(kctx, reg,
-					info->commit_pages, old_size);
-			/*
-			 * The grow failed so put the allocation back in the
-			 * pool and return failure.
-			 */
-			if (ret)
-				goto update_failed;
-		}
-		kbase_gpu_vm_unlock(kctx);
-	} else {
-		/* No suitable JIT allocation was found so create a new one */
-		u64 flags = BASE_MEM_PROT_CPU_RD | BASE_MEM_PROT_GPU_RD |
-				BASE_MEM_PROT_GPU_WR | BASE_MEM_GROW_ON_GPF |
-				BASE_MEM_COHERENT_LOCAL;
-		u64 gpu_addr;
-
-		mutex_unlock(&kctx->jit_evict_lock);
-
-		reg = kbase_mem_alloc(kctx, info->va_pages, info->commit_pages,
-				info->extent, &flags, &gpu_addr);
-		if (!reg)
-			goto out_unlocked;
-
-		mutex_lock(&kctx->jit_evict_lock);
-		list_add(&reg->jit_node, &kctx->jit_active_head);
-		mutex_unlock(&kctx->jit_evict_lock);
-	}
-
-	return reg;
-
-update_failed:
-	/*
-	 * An update to an allocation from the pool failed, chances
-	 * are slim a new allocation would fair any better so return
-	 * the allocation to the pool and return the function with failure.
-	 */
-	kbase_gpu_vm_unlock(kctx);
-	mutex_lock(&kctx->jit_evict_lock);
-	list_move(&reg->jit_node, &kctx->jit_pool_head);
-	mutex_unlock(&kctx->jit_evict_lock);
-out_unlocked:
-	return NULL;
-}
-
-void kbase_jit_free(struct kbase_context *kctx, struct kbase_va_region *reg)
-{
-	/* The physical backing of memory in the pool is always reclaimable */
-	kbase_gpu_vm_lock(kctx);
-	kbase_mem_evictable_make(reg->gpu_alloc);
-	kbase_gpu_vm_unlock(kctx);
-
-	mutex_lock(&kctx->jit_evict_lock);
-	list_move(&reg->jit_node, &kctx->jit_pool_head);
-	mutex_unlock(&kctx->jit_evict_lock);
-}
-
-void kbase_jit_backing_lost(struct kbase_va_region *reg)
-{
-	struct kbase_context *kctx = reg->kctx;
-
-	lockdep_assert_held(&kctx->jit_evict_lock);
-
-	/*
-	 * JIT allocations will always be on a list, if the region
-	 * is not on a list then it's not a JIT allocation.
-	 */
-	if (list_empty(&reg->jit_node))
-		return;
-
-	/*
-	 * Freeing the allocation requires locks we might not be able
-	 * to take now, so move the allocation to the free list and kick
-	 * the worker which will do the freeing.
-	 */
-	list_move(&reg->jit_node, &kctx->jit_destroy_head);
-
-	schedule_work(&kctx->jit_work);
-}
-
-bool kbase_jit_evict(struct kbase_context *kctx)
-{
-	struct kbase_va_region *reg = NULL;
-
-	lockdep_assert_held(&kctx->reg_lock);
-
-	/* Free the oldest allocation from the pool */
-	mutex_lock(&kctx->jit_evict_lock);
-	if (!list_empty(&kctx->jit_pool_head)) {
-		reg = list_entry(kctx->jit_pool_head.prev,
-				struct kbase_va_region, jit_node);
-		list_del(&reg->jit_node);
-	}
-	mutex_unlock(&kctx->jit_evict_lock);
-
-	if (reg)
-		kbase_mem_free_region(kctx, reg);
-
-	return (reg != NULL);
-}
-
-void kbase_jit_term(struct kbase_context *kctx)
-{
-	struct kbase_va_region *walker;
-
-	/* Free all allocations for this context */
-
-	/*
-	 * Flush the freeing of allocations whose backing has been freed
-	 * (i.e. everything in jit_destroy_head).
-	 */
-	cancel_work_sync(&kctx->jit_work);
-
-	kbase_gpu_vm_lock(kctx);
-	mutex_lock(&kctx->jit_evict_lock);
-	/* Free all allocations from the pool */
-	while (!list_empty(&kctx->jit_pool_head)) {
-		walker = list_first_entry(&kctx->jit_pool_head,
-				struct kbase_va_region, jit_node);
-		list_del(&walker->jit_node);
-		mutex_unlock(&kctx->jit_evict_lock);
-		kbase_mem_free_region(kctx, walker);
-		mutex_lock(&kctx->jit_evict_lock);
-	}
-
-	/* Free all allocations from active list */
-	while (!list_empty(&kctx->jit_active_head)) {
-		walker = list_first_entry(&kctx->jit_active_head,
-				struct kbase_va_region, jit_node);
-		list_del(&walker->jit_node);
-		mutex_unlock(&kctx->jit_evict_lock);
-		kbase_mem_free_region(kctx, walker);
-		mutex_lock(&kctx->jit_evict_lock);
-	}
-	mutex_unlock(&kctx->jit_evict_lock);
-	kbase_gpu_vm_unlock(kctx);
-}
-
-static int kbase_jd_user_buf_map(struct kbase_context *kctx,
-		struct kbase_va_region *reg)
-{
-	long pinned_pages;
-	struct kbase_mem_phy_alloc *alloc;
-	struct page **pages;
-	struct tagged_addr *pa;
-	long i;
-	int err = -ENOMEM;
-	unsigned long address;
-	struct mm_struct *mm;
-	struct device *dev;
-	unsigned long offset;
-	unsigned long local_size;
-
-	alloc = reg->gpu_alloc;
-	pa = kbase_get_gpu_phy_pages(reg);
-	address = alloc->imported.user_buf.address;
-	mm = alloc->imported.user_buf.mm;
-
-	KBASE_DEBUG_ASSERT(alloc->type == KBASE_MEM_TYPE_IMPORTED_USER_BUF);
-
-	pages = alloc->imported.user_buf.pages;
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0)
-	pinned_pages = get_user_pages(NULL, mm,
-			address,
-			alloc->imported.user_buf.nr_pages,
-			reg->flags & KBASE_REG_GPU_WR,
-			0, pages, NULL);
-#elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
-	pinned_pages = get_user_pages_remote(NULL, mm,
-			address,
-			alloc->imported.user_buf.nr_pages,
-			reg->flags & KBASE_REG_GPU_WR,
-			0, pages, NULL);
-#elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
-	pinned_pages = get_user_pages_remote(NULL, mm,
-			address,
-			alloc->imported.user_buf.nr_pages,
-			reg->flags & KBASE_REG_GPU_WR ? FOLL_WRITE : 0,
-			pages, NULL);
-#else
-	pinned_pages = get_user_pages_remote(NULL, mm,
-			address,
-			alloc->imported.user_buf.nr_pages,
-			reg->flags & KBASE_REG_GPU_WR ? FOLL_WRITE : 0,
-			pages, NULL, NULL);
-#endif
-
-	if (pinned_pages <= 0)
-		return pinned_pages;
-
-	if (pinned_pages != alloc->imported.user_buf.nr_pages) {
-		for (i = 0; i < pinned_pages; i++)
-			put_page(pages[i]);
-		return -ENOMEM;
-	}
-
-	dev = kctx->kbdev->dev;
-	offset = address & ~PAGE_MASK;
-	local_size = alloc->imported.user_buf.size;
-
-	for (i = 0; i < pinned_pages; i++) {
-		dma_addr_t dma_addr;
-		unsigned long min;
-
-		min = MIN(PAGE_SIZE - offset, local_size);
-		dma_addr = dma_map_page(dev, pages[i],
-				offset, min,
-				DMA_BIDIRECTIONAL);
-		if (dma_mapping_error(dev, dma_addr))
-			goto unwind;
-
-		alloc->imported.user_buf.dma_addrs[i] = dma_addr;
-		pa[i] = as_tagged(page_to_phys(pages[i]));
-
-		local_size -= min;
-		offset = 0;
-	}
-
-	alloc->nents = pinned_pages;
-
-	err = kbase_mmu_insert_pages(kctx, reg->start_pfn, pa,
-			kbase_reg_current_backed_size(reg),
-			reg->flags);
-	if (err == 0)
-		return 0;
-
-	alloc->nents = 0;
-	/* fall down */
-unwind:
-	while (i--) {
-		dma_unmap_page(kctx->kbdev->dev,
-				alloc->imported.user_buf.dma_addrs[i],
-				PAGE_SIZE, DMA_BIDIRECTIONAL);
-	}
-
-	while (++i < pinned_pages) {
-		put_page(pages[i]);
-		pages[i] = NULL;
-	}
-
-	return err;
-}
-
-static void kbase_jd_user_buf_unmap(struct kbase_context *kctx,
-		struct kbase_mem_phy_alloc *alloc, bool writeable)
-{
-	long i;
-	struct page **pages;
-	unsigned long size = alloc->imported.user_buf.size;
-
-	KBASE_DEBUG_ASSERT(alloc->type == KBASE_MEM_TYPE_IMPORTED_USER_BUF);
-	pages = alloc->imported.user_buf.pages;
-	for (i = 0; i < alloc->imported.user_buf.nr_pages; i++) {
-		unsigned long local_size;
-		dma_addr_t dma_addr = alloc->imported.user_buf.dma_addrs[i];
-
-		local_size = MIN(size, PAGE_SIZE - (dma_addr & ~PAGE_MASK));
-		dma_unmap_page(kctx->kbdev->dev, dma_addr, local_size,
-				DMA_BIDIRECTIONAL);
-		if (writeable)
-			set_page_dirty_lock(pages[i]);
-		put_page(pages[i]);
-		pages[i] = NULL;
-
-		size -= local_size;
-	}
-	alloc->nents = 0;
-}
-
-/* to replace sg_dma_len. */
-#define MALI_SG_DMA_LEN(sg)        ((sg)->length)
-
-#ifdef CONFIG_DMA_SHARED_BUFFER
-static int kbase_jd_umm_map(struct kbase_context *kctx,
-		struct kbase_va_region *reg)
-{
-	struct sg_table *sgt;
-	struct scatterlist *s;
-	int i;
-	struct tagged_addr *pa;
-	int err;
-	size_t count = 0;
-	struct kbase_mem_phy_alloc *alloc;
-
-	alloc = reg->gpu_alloc;
-
-	KBASE_DEBUG_ASSERT(alloc->type == KBASE_MEM_TYPE_IMPORTED_UMM);
-	KBASE_DEBUG_ASSERT(NULL == alloc->imported.umm.sgt);
-	sgt = dma_buf_map_attachment(alloc->imported.umm.dma_attachment,
-			DMA_BIDIRECTIONAL);
-
-	if (IS_ERR_OR_NULL(sgt))
-		return -EINVAL;
-
-	/* save for later */
-	alloc->imported.umm.sgt = sgt;
-
-	pa = kbase_get_gpu_phy_pages(reg);
-	KBASE_DEBUG_ASSERT(pa);
-
-	for_each_sg(sgt->sgl, s, sgt->nents, i) {
-		int j;
-		size_t pages = PFN_UP(MALI_SG_DMA_LEN(s));
-
-		WARN_ONCE(MALI_SG_DMA_LEN(s) & (PAGE_SIZE-1),
-		"MALI_SG_DMA_LEN(s)=%u is not a multiple of PAGE_SIZE\n",
-		MALI_SG_DMA_LEN(s));
-
-		WARN_ONCE(sg_dma_address(s) & (PAGE_SIZE-1),
-		"sg_dma_address(s)=%llx is not aligned to PAGE_SIZE\n",
-		(unsigned long long) sg_dma_address(s));
-
-		for (j = 0; (j < pages) && (count < reg->nr_pages); j++,
-				count++)
-			*pa++ = as_tagged(sg_dma_address(s) +
-				(j << PAGE_SHIFT));
-		WARN_ONCE(j < pages,
-			  "sg list from dma_buf_map_attachment > dma_buf->size=%zu\n",
-		alloc->imported.umm.dma_buf->size);
-	}
-
-	if (!(reg->flags & KBASE_REG_IMPORT_PAD) &&
-			WARN_ONCE(count < reg->nr_pages,
-			"sg list from dma_buf_map_attachment < dma_buf->size=%zu\n",
-			alloc->imported.umm.dma_buf->size)) {
-		err = -EINVAL;
-		goto err_unmap_attachment;
-	}
-
-	/* Update nents as we now have pages to map */
-	alloc->nents = reg->nr_pages;
-
-	err = kbase_mmu_insert_pages(kctx, reg->start_pfn,
-			kbase_get_gpu_phy_pages(reg),
-			count,
-			reg->flags | KBASE_REG_GPU_WR | KBASE_REG_GPU_RD);
-	if (err)
-		goto err_unmap_attachment;
-
-	if (reg->flags & KBASE_REG_IMPORT_PAD) {
-		err = kbase_mmu_insert_single_page(kctx,
-				reg->start_pfn + count,
-				kctx->aliasing_sink_page,
-				reg->nr_pages - count,
-				(reg->flags | KBASE_REG_GPU_RD) &
-				~KBASE_REG_GPU_WR);
-		if (err)
-			goto err_teardown_orig_pages;
-	}
-
-	return 0;
-
-err_teardown_orig_pages:
-	kbase_mmu_teardown_pages(kctx, reg->start_pfn, count);
-err_unmap_attachment:
-	dma_buf_unmap_attachment(alloc->imported.umm.dma_attachment,
-			alloc->imported.umm.sgt, DMA_BIDIRECTIONAL);
-	alloc->imported.umm.sgt = NULL;
-
-	return err;
-}
-
-static void kbase_jd_umm_unmap(struct kbase_context *kctx,
-		struct kbase_mem_phy_alloc *alloc)
-{
-	KBASE_DEBUG_ASSERT(kctx);
-	KBASE_DEBUG_ASSERT(alloc);
-	KBASE_DEBUG_ASSERT(alloc->imported.umm.dma_attachment);
-	KBASE_DEBUG_ASSERT(alloc->imported.umm.sgt);
-	dma_buf_unmap_attachment(alloc->imported.umm.dma_attachment,
-	    alloc->imported.umm.sgt, DMA_BIDIRECTIONAL);
-	alloc->imported.umm.sgt = NULL;
-	alloc->nents = 0;
-}
-#endif				/* CONFIG_DMA_SHARED_BUFFER */
-
-#if (defined(CONFIG_KDS) && defined(CONFIG_UMP)) \
-		|| defined(CONFIG_DMA_SHARED_BUFFER_USES_KDS)
-static void add_kds_resource(struct kds_resource *kds_res,
-		struct kds_resource **kds_resources, u32 *kds_res_count,
-		unsigned long *kds_access_bitmap, bool exclusive)
-{
-	u32 i;
-
-	for (i = 0; i < *kds_res_count; i++) {
-		/* Duplicate resource, ignore */
-		if (kds_resources[i] == kds_res)
-			return;
-	}
-
-	kds_resources[*kds_res_count] = kds_res;
-	if (exclusive)
-		set_bit(*kds_res_count, kds_access_bitmap);
-	(*kds_res_count)++;
-}
-#endif
-
-struct kbase_mem_phy_alloc *kbase_map_external_resource(
-		struct kbase_context *kctx, struct kbase_va_region *reg,
-		struct mm_struct *locked_mm
-#ifdef CONFIG_KDS
-		, u32 *kds_res_count, struct kds_resource **kds_resources,
-		unsigned long *kds_access_bitmap, bool exclusive
-#endif
-		)
-{
-	int err;
-
-	/* decide what needs to happen for this resource */
-	switch (reg->gpu_alloc->type) {
-	case KBASE_MEM_TYPE_IMPORTED_USER_BUF: {
-		if (reg->gpu_alloc->imported.user_buf.mm != locked_mm)
-			goto exit;
-
-		reg->gpu_alloc->imported.user_buf.current_mapping_usage_count++;
-		if (1 == reg->gpu_alloc->imported.user_buf.current_mapping_usage_count) {
-			err = kbase_jd_user_buf_map(kctx, reg);
-			if (err) {
-				reg->gpu_alloc->imported.user_buf.current_mapping_usage_count--;
-				goto exit;
-			}
-		}
-	}
-	break;
-	case KBASE_MEM_TYPE_IMPORTED_UMP: {
-#if defined(CONFIG_KDS) && defined(CONFIG_UMP)
-		if (kds_res_count) {
-			struct kds_resource *kds_res;
-
-			kds_res = ump_dd_kds_resource_get(
-					reg->gpu_alloc->imported.ump_handle);
-			if (kds_res)
-				add_kds_resource(kds_res, kds_resources,
-						kds_res_count,
-						kds_access_bitmap, exclusive);
-		}
-#endif				/*defined(CONFIG_KDS) && defined(CONFIG_UMP) */
-		break;
-	}
-#ifdef CONFIG_DMA_SHARED_BUFFER
-	case KBASE_MEM_TYPE_IMPORTED_UMM: {
-#ifdef CONFIG_DMA_SHARED_BUFFER_USES_KDS
-		if (kds_res_count) {
-			struct kds_resource *kds_res;
-
-			kds_res = get_dma_buf_kds_resource(
-					reg->gpu_alloc->imported.umm.dma_buf);
-			if (kds_res)
-				add_kds_resource(kds_res, kds_resources,
-						kds_res_count,
-						kds_access_bitmap, exclusive);
-		}
-#endif
-		reg->gpu_alloc->imported.umm.current_mapping_usage_count++;
-		if (1 == reg->gpu_alloc->imported.umm.current_mapping_usage_count) {
-			err = kbase_jd_umm_map(kctx, reg);
-			if (err) {
-				reg->gpu_alloc->imported.umm.current_mapping_usage_count--;
-				goto exit;
-			}
-		}
-		break;
-	}
-#endif
-	default:
-		goto exit;
-	}
-
-	return kbase_mem_phy_alloc_get(reg->gpu_alloc);
-exit:
-	return NULL;
-}
-
-void kbase_unmap_external_resource(struct kbase_context *kctx,
-		struct kbase_va_region *reg, struct kbase_mem_phy_alloc *alloc)
-{
-	switch (alloc->type) {
-#ifdef CONFIG_DMA_SHARED_BUFFER
-	case KBASE_MEM_TYPE_IMPORTED_UMM: {
-		alloc->imported.umm.current_mapping_usage_count--;
-
-		if (0 == alloc->imported.umm.current_mapping_usage_count) {
-			if (reg && reg->gpu_alloc == alloc) {
-				int err;
-
-				err = kbase_mmu_teardown_pages(
-						kctx,
-						reg->start_pfn,
-						alloc->nents);
-				WARN_ON(err);
-			}
-
-			kbase_jd_umm_unmap(kctx, alloc);
-		}
-	}
-	break;
-#endif /* CONFIG_DMA_SHARED_BUFFER */
-	case KBASE_MEM_TYPE_IMPORTED_USER_BUF: {
-		alloc->imported.user_buf.current_mapping_usage_count--;
-
-		if (0 == alloc->imported.user_buf.current_mapping_usage_count) {
-			bool writeable = true;
-
-			if (reg && reg->gpu_alloc == alloc)
-				kbase_mmu_teardown_pages(
-						kctx,
-						reg->start_pfn,
-						kbase_reg_current_backed_size(reg));
-
-			if (reg && ((reg->flags & KBASE_REG_GPU_WR) == 0))
-				writeable = false;
-
-			kbase_jd_user_buf_unmap(kctx, alloc, writeable);
-		}
-	}
-	break;
-	default:
-	break;
-	}
-	kbase_mem_phy_alloc_put(alloc);
-}
-
-struct kbase_ctx_ext_res_meta *kbase_sticky_resource_acquire(
-		struct kbase_context *kctx, u64 gpu_addr)
-{
-	struct kbase_ctx_ext_res_meta *meta = NULL;
-	struct kbase_ctx_ext_res_meta *walker;
-
-	lockdep_assert_held(&kctx->reg_lock);
-
-	/*
-	 * Walk the per context external resource metadata list for the
-	 * metadata which matches the region which is being acquired.
-	 */
-	list_for_each_entry(walker, &kctx->ext_res_meta_head, ext_res_node) {
-		if (walker->gpu_addr == gpu_addr) {
-			meta = walker;
-			break;
-		}
-	}
-
-	/* No metadata exists so create one. */
-	if (!meta) {
-		struct kbase_va_region *reg;
-
-		/* Find the region */
-		reg = kbase_region_tracker_find_region_enclosing_address(
-				kctx, gpu_addr);
-		if (NULL == reg || (reg->flags & KBASE_REG_FREE))
-			goto failed;
-
-		/* Allocate the metadata object */
-		meta = kzalloc(sizeof(*meta), GFP_KERNEL);
-		if (!meta)
-			goto failed;
-
-		/*
-		 * Fill in the metadata object and acquire a reference
-		 * for the physical resource.
-		 */
-		meta->alloc = kbase_map_external_resource(kctx, reg, NULL
-#ifdef CONFIG_KDS
-				, NULL, NULL,
-				NULL, false
-#endif
-				);
-
-		if (!meta->alloc)
-			goto fail_map;
-
-		meta->gpu_addr = reg->start_pfn << PAGE_SHIFT;
-
-		list_add(&meta->ext_res_node, &kctx->ext_res_meta_head);
-	}
-
-	return meta;
-
-fail_map:
-	kfree(meta);
-failed:
-	return NULL;
-}
-
-bool kbase_sticky_resource_release(struct kbase_context *kctx,
-		struct kbase_ctx_ext_res_meta *meta, u64 gpu_addr)
-{
-	struct kbase_ctx_ext_res_meta *walker;
-	struct kbase_va_region *reg;
-
-	lockdep_assert_held(&kctx->reg_lock);
-
-	/* Search of the metadata if one isn't provided. */
-	if (!meta) {
-		/*
-		 * Walk the per context external resource metadata list for the
-		 * metadata which matches the region which is being released.
-		 */
-		list_for_each_entry(walker, &kctx->ext_res_meta_head,
-				ext_res_node) {
-			if (walker->gpu_addr == gpu_addr) {
-				meta = walker;
-				break;
-			}
-		}
-	}
-
-	/* No metadata so just return. */
-	if (!meta)
-		return false;
-
-	/* Drop the physical memory reference and free the metadata. */
-	reg = kbase_region_tracker_find_region_enclosing_address(
-			kctx,
-			meta->gpu_addr);
-
-	kbase_unmap_external_resource(kctx, reg, meta->alloc);
-	list_del(&meta->ext_res_node);
-	kfree(meta);
-
-	return true;
-}
-
-int kbase_sticky_resource_init(struct kbase_context *kctx)
-{
-	INIT_LIST_HEAD(&kctx->ext_res_meta_head);
-
-	return 0;
-}
-
-void kbase_sticky_resource_term(struct kbase_context *kctx)
-{
-	struct kbase_ctx_ext_res_meta *walker;
-
-	lockdep_assert_held(&kctx->reg_lock);
-
-	/*
-	 * Free any sticky resources which haven't been unmapped.
-	 *
-	 * Note:
-	 * We don't care about refcounts at this point as no future
-	 * references to the meta data will be made.
-	 * Region termination would find these if we didn't free them
-	 * here, but it's more efficient if we do the clean up here.
-	 */
-	while (!list_empty(&kctx->ext_res_meta_head)) {
-		walker = list_first_entry(&kctx->ext_res_meta_head,
-				struct kbase_ctx_ext_res_meta, ext_res_node);
-
-		kbase_sticky_resource_release(kctx, walker, 0);
-	}
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem.h
deleted file mode 100644
index f2fd75e2018b..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem.h
+++ /dev/null
@@ -1,1142 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/**
- * @file mali_kbase_mem.h
- * Base kernel memory APIs
- */
-
-#ifndef _KBASE_MEM_H_
-#define _KBASE_MEM_H_
-
-#ifndef _KBASE_H_
-#error "Don't include this file directly, use mali_kbase.h instead"
-#endif
-
-#include <linux/kref.h>
-#ifdef CONFIG_KDS
-#include <linux/kds.h>
-#endif				/* CONFIG_KDS */
-#ifdef CONFIG_UMP
-#include <linux/ump.h>
-#endif				/* CONFIG_UMP */
-#include "mali_base_kernel.h"
-#include <mali_kbase_hw.h>
-#include "mali_kbase_pm.h"
-#include "mali_kbase_defs.h"
-#if defined(CONFIG_MALI_BIFROST_GATOR_SUPPORT)
-#include "mali_kbase_gator.h"
-#endif
-/* Required for kbase_mem_evictable_unmake */
-#include "mali_kbase_mem_linux.h"
-
-/* Part of the workaround for uTLB invalid pages is to ensure we grow/shrink tmem by 4 pages at a time */
-#define KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_LOG2_HW_ISSUE_8316 (2)	/* round to 4 pages */
-
-/* Part of the workaround for PRLAM-9630 requires us to grow/shrink memory by 8 pages.
-The MMU reads in 8 page table entries from memory at a time, if we have more than one page fault within the same 8 pages and
-page tables are updated accordingly, the MMU does not re-read the page table entries from memory for the subsequent page table
-updates and generates duplicate page faults as the page table information used by the MMU is not valid.   */
-#define KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_LOG2_HW_ISSUE_9630 (3)	/* round to 8 pages */
-
-#define KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_LOG2 (0)	/* round to 1 page */
-
-/* This must always be a power of 2 */
-#define KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES (1u << KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_LOG2)
-#define KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_HW_ISSUE_8316 (1u << KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_LOG2_HW_ISSUE_8316)
-#define KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_HW_ISSUE_9630 (1u << KBASEP_TMEM_GROWABLE_BLOCKSIZE_PAGES_LOG2_HW_ISSUE_9630)
-/**
- * A CPU mapping
- */
-struct kbase_cpu_mapping {
-	struct   list_head mappings_list;
-	struct   kbase_mem_phy_alloc *alloc;
-	struct   kbase_context *kctx;
-	struct   kbase_va_region *region;
-	int      count;
-	int      free_on_close;
-};
-
-enum kbase_memory_type {
-	KBASE_MEM_TYPE_NATIVE,
-	KBASE_MEM_TYPE_IMPORTED_UMP,
-	KBASE_MEM_TYPE_IMPORTED_UMM,
-	KBASE_MEM_TYPE_IMPORTED_USER_BUF,
-	KBASE_MEM_TYPE_ALIAS,
-	KBASE_MEM_TYPE_TB,
-	KBASE_MEM_TYPE_RAW
-};
-
-/* internal structure, mirroring base_mem_aliasing_info,
- * but with alloc instead of a gpu va (handle) */
-struct kbase_aliased {
-	struct kbase_mem_phy_alloc *alloc; /* NULL for special, non-NULL for native */
-	u64 offset; /* in pages */
-	u64 length; /* in pages */
-};
-
-/**
- * @brief Physical pages tracking object properties
-  */
-#define KBASE_MEM_PHY_ALLOC_ACCESSED_CACHED  (1ul << 0)
-#define KBASE_MEM_PHY_ALLOC_LARGE            (1ul << 1)
-
-/* physical pages tracking object.
- * Set up to track N pages.
- * N not stored here, the creator holds that info.
- * This object only tracks how many elements are actually valid (present).
- * Changing of nents or *pages should only happen if the kbase_mem_phy_alloc is not
- * shared with another region or client. CPU mappings are OK to exist when changing, as
- * long as the tracked mappings objects are updated as part of the change.
- */
-struct kbase_mem_phy_alloc {
-	struct kref           kref; /* number of users of this alloc */
-	atomic_t              gpu_mappings;
-	size_t                nents; /* 0..N */
-	struct tagged_addr    *pages; /* N elements, only 0..nents are valid */
-
-	/* kbase_cpu_mappings */
-	struct list_head      mappings;
-
-	/* Node used to store this allocation on the eviction list */
-	struct list_head      evict_node;
-	/* Physical backing size when the pages where evicted */
-	size_t                evicted;
-	/*
-	 * Back reference to the region structure which created this
-	 * allocation, or NULL if it has been freed.
-	 */
-	struct kbase_va_region *reg;
-
-	/* type of buffer */
-	enum kbase_memory_type type;
-
-	unsigned long properties;
-
-	struct list_head       zone_cache;
-
-	/* member in union valid based on @a type */
-	union {
-#ifdef CONFIG_UMP
-		ump_dd_handle ump_handle;
-#endif /* CONFIG_UMP */
-#if defined(CONFIG_DMA_SHARED_BUFFER)
-		struct {
-			struct dma_buf *dma_buf;
-			struct dma_buf_attachment *dma_attachment;
-			unsigned int current_mapping_usage_count;
-			struct sg_table *sgt;
-		} umm;
-#endif /* defined(CONFIG_DMA_SHARED_BUFFER) */
-		struct {
-			u64 stride;
-			size_t nents;
-			struct kbase_aliased *aliased;
-		} alias;
-		/* Used by type = (KBASE_MEM_TYPE_NATIVE, KBASE_MEM_TYPE_TB) */
-		struct kbase_context *kctx;
-		struct kbase_alloc_import_user_buf {
-			unsigned long address;
-			unsigned long size;
-			unsigned long nr_pages;
-			struct page **pages;
-			/* top bit (1<<31) of current_mapping_usage_count
-			 * specifies that this import was pinned on import
-			 * See PINNED_ON_IMPORT
-			 */
-			u32 current_mapping_usage_count;
-			struct mm_struct *mm;
-			dma_addr_t *dma_addrs;
-		} user_buf;
-	} imported;
-};
-
-/* The top bit of kbase_alloc_import_user_buf::current_mapping_usage_count is
- * used to signify that a buffer was pinned when it was imported. Since the
- * reference count is limited by the number of atoms that can be submitted at
- * once there should be no danger of overflowing into this bit.
- * Stealing the top bit also has the benefit that
- * current_mapping_usage_count != 0 if and only if the buffer is mapped.
- */
-#define PINNED_ON_IMPORT	(1<<31)
-
-static inline void kbase_mem_phy_alloc_gpu_mapped(struct kbase_mem_phy_alloc *alloc)
-{
-	KBASE_DEBUG_ASSERT(alloc);
-	/* we only track mappings of NATIVE buffers */
-	if (alloc->type == KBASE_MEM_TYPE_NATIVE)
-		atomic_inc(&alloc->gpu_mappings);
-}
-
-static inline void kbase_mem_phy_alloc_gpu_unmapped(struct kbase_mem_phy_alloc *alloc)
-{
-	KBASE_DEBUG_ASSERT(alloc);
-	/* we only track mappings of NATIVE buffers */
-	if (alloc->type == KBASE_MEM_TYPE_NATIVE)
-		if (0 > atomic_dec_return(&alloc->gpu_mappings)) {
-			pr_err("Mismatched %s:\n", __func__);
-			dump_stack();
-		}
-}
-
-/**
- * kbase_mem_is_imported - Indicate whether a memory type is imported
- *
- * @type: the memory type
- *
- * Return: true if the memory type is imported, false otherwise
- */
-static inline bool kbase_mem_is_imported(enum kbase_memory_type type)
-{
-	return (type == KBASE_MEM_TYPE_IMPORTED_UMP) ||
-		(type == KBASE_MEM_TYPE_IMPORTED_UMM) ||
-		(type == KBASE_MEM_TYPE_IMPORTED_USER_BUF);
-}
-
-void kbase_mem_kref_free(struct kref *kref);
-
-int kbase_mem_init(struct kbase_device *kbdev);
-void kbase_mem_halt(struct kbase_device *kbdev);
-void kbase_mem_term(struct kbase_device *kbdev);
-
-static inline struct kbase_mem_phy_alloc *kbase_mem_phy_alloc_get(struct kbase_mem_phy_alloc *alloc)
-{
-	kref_get(&alloc->kref);
-	return alloc;
-}
-
-static inline struct kbase_mem_phy_alloc *kbase_mem_phy_alloc_put(struct kbase_mem_phy_alloc *alloc)
-{
-	kref_put(&alloc->kref, kbase_mem_kref_free);
-	return NULL;
-}
-
-/**
- * A GPU memory region, and attributes for CPU mappings.
- */
-struct kbase_va_region {
-	struct rb_node rblink;
-	struct list_head link;
-
-	struct kbase_context *kctx;	/* Backlink to base context */
-
-	u64 start_pfn;		/* The PFN in GPU space */
-	size_t nr_pages;
-
-/* Free region */
-#define KBASE_REG_FREE              (1ul << 0)
-/* CPU write access */
-#define KBASE_REG_CPU_WR            (1ul << 1)
-/* GPU write access */
-#define KBASE_REG_GPU_WR            (1ul << 2)
-/* No eXecute flag */
-#define KBASE_REG_GPU_NX            (1ul << 3)
-/* Is CPU cached? */
-#define KBASE_REG_CPU_CACHED        (1ul << 4)
-/* Is GPU cached? */
-#define KBASE_REG_GPU_CACHED        (1ul << 5)
-
-#define KBASE_REG_GROWABLE          (1ul << 6)
-/* Can grow on pf? */
-#define KBASE_REG_PF_GROW           (1ul << 7)
-
-/* Bit 8 is unused */
-
-/* inner shareable coherency */
-#define KBASE_REG_SHARE_IN          (1ul << 9)
-/* inner & outer shareable coherency */
-#define KBASE_REG_SHARE_BOTH        (1ul << 10)
-
-/* Space for 4 different zones */
-#define KBASE_REG_ZONE_MASK         (3ul << 11)
-#define KBASE_REG_ZONE(x)           (((x) & 3) << 11)
-
-/* GPU read access */
-#define KBASE_REG_GPU_RD            (1ul<<13)
-/* CPU read access */
-#define KBASE_REG_CPU_RD            (1ul<<14)
-
-/* Index of chosen MEMATTR for this region (0..7) */
-#define KBASE_REG_MEMATTR_MASK      (7ul << 16)
-#define KBASE_REG_MEMATTR_INDEX(x)  (((x) & 7) << 16)
-#define KBASE_REG_MEMATTR_VALUE(x)  (((x) & KBASE_REG_MEMATTR_MASK) >> 16)
-
-#define KBASE_REG_SECURE            (1ul << 19)
-
-#define KBASE_REG_DONT_NEED         (1ul << 20)
-
-/* Imported buffer is padded? */
-#define KBASE_REG_IMPORT_PAD        (1ul << 21)
-
-/* Bit 22 is reserved.
- *
- * Do not remove, use the next unreserved bit for new flags */
-#define KBASE_REG_RESERVED_BIT_22   (1ul << 22)
-
-#define KBASE_REG_ZONE_SAME_VA      KBASE_REG_ZONE(0)
-
-/* only used with 32-bit clients */
-/*
- * On a 32bit platform, custom VA should be wired from (4GB + shader region)
- * to the VA limit of the GPU. Unfortunately, the Linux mmap() interface
- * limits us to 2^32 pages (2^44 bytes, see mmap64 man page for reference).
- * So we put the default limit to the maximum possible on Linux and shrink
- * it down, if required by the GPU, during initialization.
- */
-
-/*
- * Dedicated 16MB region for shader code:
- * VA range 0x101000000-0x102000000
- */
-#define KBASE_REG_ZONE_EXEC         KBASE_REG_ZONE(1)
-#define KBASE_REG_ZONE_EXEC_BASE    (0x101000000ULL >> PAGE_SHIFT)
-#define KBASE_REG_ZONE_EXEC_SIZE    ((16ULL * 1024 * 1024) >> PAGE_SHIFT)
-
-#define KBASE_REG_ZONE_CUSTOM_VA         KBASE_REG_ZONE(2)
-#define KBASE_REG_ZONE_CUSTOM_VA_BASE    (KBASE_REG_ZONE_EXEC_BASE + KBASE_REG_ZONE_EXEC_SIZE) /* Starting after KBASE_REG_ZONE_EXEC */
-#define KBASE_REG_ZONE_CUSTOM_VA_SIZE    (((1ULL << 44) >> PAGE_SHIFT) - KBASE_REG_ZONE_CUSTOM_VA_BASE)
-/* end 32-bit clients only */
-
-	unsigned long flags;
-
-	size_t extent; /* nr of pages alloc'd on PF */
-
-	struct kbase_mem_phy_alloc *cpu_alloc; /* the one alloc object we mmap to the CPU when mapping this region */
-	struct kbase_mem_phy_alloc *gpu_alloc; /* the one alloc object we mmap to the GPU when mapping this region */
-
-	/* non-NULL if this memory object is a kds_resource */
-	struct kds_resource *kds_res;
-
-	/* List head used to store the region in the JIT allocation pool */
-	struct list_head jit_node;
-};
-
-/* Common functions */
-static inline struct tagged_addr *kbase_get_cpu_phy_pages(
-		struct kbase_va_region *reg)
-{
-	KBASE_DEBUG_ASSERT(reg);
-	KBASE_DEBUG_ASSERT(reg->cpu_alloc);
-	KBASE_DEBUG_ASSERT(reg->gpu_alloc);
-	KBASE_DEBUG_ASSERT(reg->cpu_alloc->nents == reg->gpu_alloc->nents);
-
-	return reg->cpu_alloc->pages;
-}
-
-static inline struct tagged_addr *kbase_get_gpu_phy_pages(
-		struct kbase_va_region *reg)
-{
-	KBASE_DEBUG_ASSERT(reg);
-	KBASE_DEBUG_ASSERT(reg->cpu_alloc);
-	KBASE_DEBUG_ASSERT(reg->gpu_alloc);
-	KBASE_DEBUG_ASSERT(reg->cpu_alloc->nents == reg->gpu_alloc->nents);
-
-	return reg->gpu_alloc->pages;
-}
-
-static inline size_t kbase_reg_current_backed_size(struct kbase_va_region *reg)
-{
-	KBASE_DEBUG_ASSERT(reg);
-	/* if no alloc object the backed size naturally is 0 */
-	if (!reg->cpu_alloc)
-		return 0;
-
-	KBASE_DEBUG_ASSERT(reg->cpu_alloc);
-	KBASE_DEBUG_ASSERT(reg->gpu_alloc);
-	KBASE_DEBUG_ASSERT(reg->cpu_alloc->nents == reg->gpu_alloc->nents);
-
-	return reg->cpu_alloc->nents;
-}
-
-#define KBASE_MEM_PHY_ALLOC_LARGE_THRESHOLD ((size_t)(4*1024)) /* size above which vmalloc is used over kmalloc */
-
-static inline struct kbase_mem_phy_alloc *kbase_alloc_create(size_t nr_pages, enum kbase_memory_type type)
-{
-	struct kbase_mem_phy_alloc *alloc;
-	size_t alloc_size = sizeof(*alloc) + sizeof(*alloc->pages) * nr_pages;
-	size_t per_page_size = sizeof(*alloc->pages);
-
-	/* Imported pages may have page private data already in use */
-	if (type == KBASE_MEM_TYPE_IMPORTED_USER_BUF) {
-		alloc_size += nr_pages *
-				sizeof(*alloc->imported.user_buf.dma_addrs);
-		per_page_size += sizeof(*alloc->imported.user_buf.dma_addrs);
-	}
-
-	/*
-	 * Prevent nr_pages*per_page_size + sizeof(*alloc) from
-	 * wrapping around.
-	 */
-	if (nr_pages > ((((size_t) -1) - sizeof(*alloc))
-			/ per_page_size))
-		return ERR_PTR(-ENOMEM);
-
-	/* Allocate based on the size to reduce internal fragmentation of vmem */
-	if (alloc_size > KBASE_MEM_PHY_ALLOC_LARGE_THRESHOLD)
-		alloc = vzalloc(alloc_size);
-	else
-		alloc = kzalloc(alloc_size, GFP_KERNEL);
-
-	if (!alloc)
-		return ERR_PTR(-ENOMEM);
-
-	/* Store allocation method */
-	if (alloc_size > KBASE_MEM_PHY_ALLOC_LARGE_THRESHOLD)
-		alloc->properties |= KBASE_MEM_PHY_ALLOC_LARGE;
-
-	kref_init(&alloc->kref);
-	atomic_set(&alloc->gpu_mappings, 0);
-	alloc->nents = 0;
-	alloc->pages = (void *)(alloc + 1);
-	INIT_LIST_HEAD(&alloc->mappings);
-	alloc->type = type;
-	INIT_LIST_HEAD(&alloc->zone_cache);
-
-	if (type == KBASE_MEM_TYPE_IMPORTED_USER_BUF)
-		alloc->imported.user_buf.dma_addrs =
-				(void *) (alloc->pages + nr_pages);
-
-	return alloc;
-}
-
-static inline int kbase_reg_prepare_native(struct kbase_va_region *reg,
-		struct kbase_context *kctx)
-{
-	KBASE_DEBUG_ASSERT(reg);
-	KBASE_DEBUG_ASSERT(!reg->cpu_alloc);
-	KBASE_DEBUG_ASSERT(!reg->gpu_alloc);
-	KBASE_DEBUG_ASSERT(reg->flags & KBASE_REG_FREE);
-
-	reg->cpu_alloc = kbase_alloc_create(reg->nr_pages,
-			KBASE_MEM_TYPE_NATIVE);
-	if (IS_ERR(reg->cpu_alloc))
-		return PTR_ERR(reg->cpu_alloc);
-	else if (!reg->cpu_alloc)
-		return -ENOMEM;
-	reg->cpu_alloc->imported.kctx = kctx;
-	INIT_LIST_HEAD(&reg->cpu_alloc->evict_node);
-	if (kbase_ctx_flag(kctx, KCTX_INFINITE_CACHE)
-	    && (reg->flags & KBASE_REG_CPU_CACHED)) {
-		reg->gpu_alloc = kbase_alloc_create(reg->nr_pages,
-				KBASE_MEM_TYPE_NATIVE);
-		reg->gpu_alloc->imported.kctx = kctx;
-		INIT_LIST_HEAD(&reg->gpu_alloc->evict_node);
-	} else {
-		reg->gpu_alloc = kbase_mem_phy_alloc_get(reg->cpu_alloc);
-	}
-
-	INIT_LIST_HEAD(&reg->jit_node);
-	reg->flags &= ~KBASE_REG_FREE;
-	return 0;
-}
-
-static inline int kbase_atomic_add_pages(int num_pages, atomic_t *used_pages)
-{
-	int new_val = atomic_add_return(num_pages, used_pages);
-#if defined(CONFIG_MALI_BIFROST_GATOR_SUPPORT)
-	kbase_trace_mali_total_alloc_pages_change((long long int)new_val);
-#endif
-	return new_val;
-}
-
-static inline int kbase_atomic_sub_pages(int num_pages, atomic_t *used_pages)
-{
-	int new_val = atomic_sub_return(num_pages, used_pages);
-#if defined(CONFIG_MALI_BIFROST_GATOR_SUPPORT)
-	kbase_trace_mali_total_alloc_pages_change((long long int)new_val);
-#endif
-	return new_val;
-}
-
-/*
- * Max size for kbdev memory pool (in pages)
- */
-#define KBASE_MEM_POOL_MAX_SIZE_KBDEV (SZ_64M >> PAGE_SHIFT)
-
-/*
- * Max size for kctx memory pool (in pages)
- */
-#define KBASE_MEM_POOL_MAX_SIZE_KCTX  (SZ_64M >> PAGE_SHIFT)
-
-/*
- * The order required for a 2MB page allocation (2^order * 4KB = 2MB)
- */
-#define KBASE_MEM_POOL_2MB_PAGE_TABLE_ORDER	9
-
-/*
- * The order required for a 4KB page allocation
- */
-#define KBASE_MEM_POOL_4KB_PAGE_TABLE_ORDER	0
-
-/**
- * kbase_mem_pool_init - Create a memory pool for a kbase device
- * @pool:      Memory pool to initialize
- * @max_size:  Maximum number of free pages the pool can hold
- * @order:     Page order for physical page size (order=0=>4kB, order=9=>2MB)
- * @kbdev:     Kbase device where memory is used
- * @next_pool: Pointer to the next pool or NULL.
- *
- * Allocations from @pool are in whole pages. Each @pool has a free list where
- * pages can be quickly allocated from. The free list is initially empty and
- * filled whenever pages are freed back to the pool. The number of free pages
- * in the pool will in general not exceed @max_size, but the pool may in
- * certain corner cases grow above @max_size.
- *
- * If @next_pool is not NULL, we will allocate from @next_pool before going to
- * the kernel allocator. Similarily pages can spill over to @next_pool when
- * @pool is full. Pages are zeroed before they spill over to another pool, to
- * prevent leaking information between applications.
- *
- * A shrinker is registered so that Linux mm can reclaim pages from the pool as
- * needed.
- *
- * Return: 0 on success, negative -errno on error
- */
-int kbase_mem_pool_init(struct kbase_mem_pool *pool,
-		size_t max_size,
-		size_t order,
-		struct kbase_device *kbdev,
-		struct kbase_mem_pool *next_pool);
-
-/**
- * kbase_mem_pool_term - Destroy a memory pool
- * @pool:  Memory pool to destroy
- *
- * Pages in the pool will spill over to @next_pool (if available) or freed to
- * the kernel.
- */
-void kbase_mem_pool_term(struct kbase_mem_pool *pool);
-
-/**
- * kbase_mem_pool_alloc - Allocate a page from memory pool
- * @pool:  Memory pool to allocate from
- *
- * Allocations from the pool are made as follows:
- * 1. If there are free pages in the pool, allocate a page from @pool.
- * 2. Otherwise, if @next_pool is not NULL and has free pages, allocate a page
- *    from @next_pool.
- * 3. Return NULL if no memory in the pool
- *
- * Return: Pointer to allocated page, or NULL if allocation failed.
- */
-struct page *kbase_mem_pool_alloc(struct kbase_mem_pool *pool);
-
-/**
- * kbase_mem_pool_free - Free a page to memory pool
- * @pool:  Memory pool where page should be freed
- * @page:  Page to free to the pool
- * @dirty: Whether some of the page may be dirty in the cache.
- *
- * Pages are freed to the pool as follows:
- * 1. If @pool is not full, add @page to @pool.
- * 2. Otherwise, if @next_pool is not NULL and not full, add @page to
- *    @next_pool.
- * 3. Finally, free @page to the kernel.
- */
-void kbase_mem_pool_free(struct kbase_mem_pool *pool, struct page *page,
-		bool dirty);
-
-/**
- * kbase_mem_pool_alloc_pages - Allocate pages from memory pool
- * @pool:     Memory pool to allocate from
- * @nr_pages: Number of pages to allocate
- * @pages:    Pointer to array where the physical address of the allocated
- *            pages will be stored.
- * @partial_allowed: If fewer pages allocated is allowed
- *
- * Like kbase_mem_pool_alloc() but optimized for allocating many pages.
- *
- * Return:
- * On success number of pages allocated (could be less than nr_pages if
- * partial_allowed).
- * On error an error code.
- */
-int kbase_mem_pool_alloc_pages(struct kbase_mem_pool *pool, size_t nr_pages,
-		struct tagged_addr *pages, bool partial_allowed);
-
-/**
- * kbase_mem_pool_free_pages - Free pages to memory pool
- * @pool:     Memory pool where pages should be freed
- * @nr_pages: Number of pages to free
- * @pages:    Pointer to array holding the physical addresses of the pages to
- *            free.
- * @dirty:    Whether any pages may be dirty in the cache.
- * @reclaimed: Whether the pages where reclaimable and thus should bypass
- *             the pool and go straight to the kernel.
- *
- * Like kbase_mem_pool_free() but optimized for freeing many pages.
- */
-void kbase_mem_pool_free_pages(struct kbase_mem_pool *pool, size_t nr_pages,
-		struct tagged_addr *pages, bool dirty, bool reclaimed);
-
-/**
- * kbase_mem_pool_size - Get number of free pages in memory pool
- * @pool:  Memory pool to inspect
- *
- * Note: the size of the pool may in certain corner cases exceed @max_size!
- *
- * Return: Number of free pages in the pool
- */
-static inline size_t kbase_mem_pool_size(struct kbase_mem_pool *pool)
-{
-	return READ_ONCE(pool->cur_size);
-}
-
-/**
- * kbase_mem_pool_max_size - Get maximum number of free pages in memory pool
- * @pool:  Memory pool to inspect
- *
- * Return: Maximum number of free pages in the pool
- */
-static inline size_t kbase_mem_pool_max_size(struct kbase_mem_pool *pool)
-{
-	return pool->max_size;
-}
-
-
-/**
- * kbase_mem_pool_set_max_size - Set maximum number of free pages in memory pool
- * @pool:     Memory pool to inspect
- * @max_size: Maximum number of free pages the pool can hold
- *
- * If @max_size is reduced, the pool will be shrunk to adhere to the new limit.
- * For details see kbase_mem_pool_shrink().
- */
-void kbase_mem_pool_set_max_size(struct kbase_mem_pool *pool, size_t max_size);
-
-/**
- * kbase_mem_pool_grow - Grow the pool
- * @pool:       Memory pool to grow
- * @nr_to_grow: Number of pages to add to the pool
- *
- * Adds @nr_to_grow pages to the pool. Note that this may cause the pool to
- * become larger than the maximum size specified.
- *
- * Returns: 0 on success, -ENOMEM if unable to allocate sufficent pages
- */
-int kbase_mem_pool_grow(struct kbase_mem_pool *pool, size_t nr_to_grow);
-
-/**
- * kbase_mem_pool_trim - Grow or shrink the pool to a new size
- * @pool:     Memory pool to trim
- * @new_size: New number of pages in the pool
- *
- * If @new_size > @cur_size, fill the pool with new pages from the kernel, but
- * not above the max_size for the pool.
- * If @new_size < @cur_size, shrink the pool by freeing pages to the kernel.
- */
-void kbase_mem_pool_trim(struct kbase_mem_pool *pool, size_t new_size);
-
-/**
- * kbase_mem_alloc_page - Allocate a new page for a device
- * @pool:  Memory pool to allocate a page from
- *
- * Most uses should use kbase_mem_pool_alloc to allocate a page. However that
- * function can fail in the event the pool is empty.
- *
- * Return: A new page or NULL if no memory
- */
-struct page *kbase_mem_alloc_page(struct kbase_mem_pool *pool);
-
-int kbase_region_tracker_init(struct kbase_context *kctx);
-int kbase_region_tracker_init_jit(struct kbase_context *kctx, u64 jit_va_pages);
-void kbase_region_tracker_term(struct kbase_context *kctx);
-
-struct kbase_va_region *kbase_region_tracker_find_region_enclosing_address(struct kbase_context *kctx, u64 gpu_addr);
-
-/**
- * @brief Check that a pointer is actually a valid region.
- *
- * Must be called with context lock held.
- */
-struct kbase_va_region *kbase_region_tracker_find_region_base_address(struct kbase_context *kctx, u64 gpu_addr);
-
-struct kbase_va_region *kbase_alloc_free_region(struct kbase_context *kctx, u64 start_pfn, size_t nr_pages, int zone);
-void kbase_free_alloced_region(struct kbase_va_region *reg);
-int kbase_add_va_region(struct kbase_context *kctx, struct kbase_va_region *reg, u64 addr, size_t nr_pages, size_t align);
-
-bool kbase_check_alloc_flags(unsigned long flags);
-bool kbase_check_import_flags(unsigned long flags);
-
-/**
- * kbase_update_region_flags - Convert user space flags to kernel region flags
- *
- * @kctx:  kbase context
- * @reg:   The region to update the flags on
- * @flags: The flags passed from user space
- *
- * The user space flag BASE_MEM_COHERENT_SYSTEM_REQUIRED will be rejected and
- * this function will fail if the system does not support system coherency.
- *
- * Return: 0 if successful, -EINVAL if the flags are not supported
- */
-int kbase_update_region_flags(struct kbase_context *kctx,
-		struct kbase_va_region *reg, unsigned long flags);
-
-void kbase_gpu_vm_lock(struct kbase_context *kctx);
-void kbase_gpu_vm_unlock(struct kbase_context *kctx);
-
-int kbase_alloc_phy_pages(struct kbase_va_region *reg, size_t vsize, size_t size);
-
-int kbase_mmu_init(struct kbase_context *kctx);
-void kbase_mmu_term(struct kbase_context *kctx);
-
-phys_addr_t kbase_mmu_alloc_pgd(struct kbase_context *kctx);
-void kbase_mmu_free_pgd(struct kbase_context *kctx);
-int kbase_mmu_insert_pages_no_flush(struct kbase_context *kctx, u64 vpfn,
-				  struct tagged_addr *phys, size_t nr,
-				  unsigned long flags);
-int kbase_mmu_insert_pages(struct kbase_context *kctx, u64 vpfn,
-				  struct tagged_addr *phys, size_t nr,
-				  unsigned long flags);
-int kbase_mmu_insert_single_page(struct kbase_context *kctx, u64 vpfn,
-					struct tagged_addr phys, size_t nr,
-					unsigned long flags);
-
-int kbase_mmu_teardown_pages(struct kbase_context *kctx, u64 vpfn, size_t nr);
-int kbase_mmu_update_pages(struct kbase_context *kctx, u64 vpfn,
-			   struct tagged_addr *phys, size_t nr,
-			   unsigned long flags);
-
-/**
- * @brief Register region and map it on the GPU.
- *
- * Call kbase_add_va_region() and map the region on the GPU.
- */
-int kbase_gpu_mmap(struct kbase_context *kctx, struct kbase_va_region *reg, u64 addr, size_t nr_pages, size_t align);
-
-/**
- * @brief Remove the region from the GPU and unregister it.
- *
- * Must be called with context lock held.
- */
-int kbase_gpu_munmap(struct kbase_context *kctx, struct kbase_va_region *reg);
-
-/**
- * The caller has the following locking conditions:
- * - It must hold kbase_device->mmu_hw_mutex
- * - It must hold the hwaccess_lock
- */
-void kbase_mmu_update(struct kbase_context *kctx);
-
-/**
- * kbase_mmu_disable() - Disable the MMU for a previously active kbase context.
- * @kctx:	Kbase context
- *
- * Disable and perform the required cache maintenance to remove the all
- * data from provided kbase context from the GPU caches.
- *
- * The caller has the following locking conditions:
- * - It must hold kbase_device->mmu_hw_mutex
- * - It must hold the hwaccess_lock
- */
-void kbase_mmu_disable(struct kbase_context *kctx);
-
-/**
- * kbase_mmu_disable_as() - Set the MMU to unmapped mode for the specified
- * address space.
- * @kbdev:	Kbase device
- * @as_nr:	The address space number to set to unmapped.
- *
- * This function must only be called during reset/power-up and it used to
- * ensure the registers are in a known state.
- *
- * The caller must hold kbdev->mmu_hw_mutex.
- */
-void kbase_mmu_disable_as(struct kbase_device *kbdev, int as_nr);
-
-void kbase_mmu_interrupt(struct kbase_device *kbdev, u32 irq_stat);
-
-/** Dump the MMU tables to a buffer
- *
- * This function allocates a buffer (of @c nr_pages pages) to hold a dump of the MMU tables and fills it. If the
- * buffer is too small then the return value will be NULL.
- *
- * The GPU vm lock must be held when calling this function.
- *
- * The buffer returned should be freed with @ref vfree when it is no longer required.
- *
- * @param[in]   kctx        The kbase context to dump
- * @param[in]   nr_pages    The number of pages to allocate for the buffer.
- *
- * @return The address of the buffer containing the MMU dump or NULL on error (including if the @c nr_pages is too
- * small)
- */
-void *kbase_mmu_dump(struct kbase_context *kctx, int nr_pages);
-
-/**
- * kbase_sync_now - Perform cache maintenance on a memory region
- *
- * @kctx: The kbase context of the region
- * @sset: A syncset structure describing the region and direction of the
- *        synchronisation required
- *
- * Return: 0 on success or error code
- */
-int kbase_sync_now(struct kbase_context *kctx, struct basep_syncset *sset);
-void kbase_sync_single(struct kbase_context *kctx, struct tagged_addr cpu_pa,
-		struct tagged_addr gpu_pa, off_t offset, size_t size,
-		enum kbase_sync_type sync_fn);
-void kbase_pre_job_sync(struct kbase_context *kctx, struct base_syncset *syncsets, size_t nr);
-void kbase_post_job_sync(struct kbase_context *kctx, struct base_syncset *syncsets, size_t nr);
-
-/* OS specific functions */
-int kbase_mem_free(struct kbase_context *kctx, u64 gpu_addr);
-int kbase_mem_free_region(struct kbase_context *kctx, struct kbase_va_region *reg);
-void kbase_os_mem_map_lock(struct kbase_context *kctx);
-void kbase_os_mem_map_unlock(struct kbase_context *kctx);
-
-/**
- * @brief Update the memory allocation counters for the current process
- *
- * OS specific call to updates the current memory allocation counters for the current process with
- * the supplied delta.
- *
- * @param[in] kctx  The kbase context
- * @param[in] pages The desired delta to apply to the memory usage counters.
- */
-
-void kbasep_os_process_page_usage_update(struct kbase_context *kctx, int pages);
-
-/**
- * @brief Add to the memory allocation counters for the current process
- *
- * OS specific call to add to the current memory allocation counters for the current process by
- * the supplied amount.
- *
- * @param[in] kctx  The kernel base context used for the allocation.
- * @param[in] pages The desired delta to apply to the memory usage counters.
- */
-
-static inline void kbase_process_page_usage_inc(struct kbase_context *kctx, int pages)
-{
-	kbasep_os_process_page_usage_update(kctx, pages);
-}
-
-/**
- * @brief Subtract from the memory allocation counters for the current process
- *
- * OS specific call to subtract from the current memory allocation counters for the current process by
- * the supplied amount.
- *
- * @param[in] kctx  The kernel base context used for the allocation.
- * @param[in] pages The desired delta to apply to the memory usage counters.
- */
-
-static inline void kbase_process_page_usage_dec(struct kbase_context *kctx, int pages)
-{
-	kbasep_os_process_page_usage_update(kctx, 0 - pages);
-}
-
-/**
- * kbasep_find_enclosing_cpu_mapping_offset() - Find the offset of the CPU
- * mapping of a memory allocation containing a given address range
- *
- * Searches for a CPU mapping of any part of any region that fully encloses the
- * CPU virtual address range specified by @uaddr and @size. Returns a failure
- * indication if only part of the address range lies within a CPU mapping.
- *
- * @kctx:      The kernel base context used for the allocation.
- * @uaddr:     Start of the CPU virtual address range.
- * @size:      Size of the CPU virtual address range (in bytes).
- * @offset:    The offset from the start of the allocation to the specified CPU
- *             virtual address.
- *
- * Return: 0 if offset was obtained successfully. Error code otherwise.
- */
-int kbasep_find_enclosing_cpu_mapping_offset(
-		struct kbase_context *kctx,
-		unsigned long uaddr, size_t size, u64 *offset);
-
-enum hrtimer_restart kbasep_as_poke_timer_callback(struct hrtimer *timer);
-void kbase_as_poking_timer_retain_atom(struct kbase_device *kbdev, struct kbase_context *kctx, struct kbase_jd_atom *katom);
-void kbase_as_poking_timer_release_atom(struct kbase_device *kbdev, struct kbase_context *kctx, struct kbase_jd_atom *katom);
-
-/**
-* @brief Allocates physical pages.
-*
-* Allocates \a nr_pages_requested and updates the alloc object.
-*
-* @param[in] alloc allocation object to add pages to
-* @param[in] nr_pages_requested number of physical pages to allocate
-*
-* @return 0 if all pages have been successfully allocated. Error code otherwise
-*/
-int kbase_alloc_phy_pages_helper(struct kbase_mem_phy_alloc *alloc, size_t nr_pages_requested);
-
-/**
-* @brief Free physical pages.
-*
-* Frees \a nr_pages and updates the alloc object.
-*
-* @param[in] alloc allocation object to free pages from
-* @param[in] nr_pages_to_free number of physical pages to free
-*/
-int kbase_free_phy_pages_helper(struct kbase_mem_phy_alloc *alloc, size_t nr_pages_to_free);
-
-static inline void kbase_set_dma_addr(struct page *p, dma_addr_t dma_addr)
-{
-	SetPagePrivate(p);
-	if (sizeof(dma_addr_t) > sizeof(p->private)) {
-		/* on 32-bit ARM with LPAE dma_addr_t becomes larger, but the
-		 * private field stays the same. So we have to be clever and
-		 * use the fact that we only store DMA addresses of whole pages,
-		 * so the low bits should be zero */
-		KBASE_DEBUG_ASSERT(!(dma_addr & (PAGE_SIZE - 1)));
-		set_page_private(p, dma_addr >> PAGE_SHIFT);
-	} else {
-		set_page_private(p, dma_addr);
-	}
-}
-
-static inline dma_addr_t kbase_dma_addr(struct page *p)
-{
-	if (sizeof(dma_addr_t) > sizeof(p->private))
-		return ((dma_addr_t)page_private(p)) << PAGE_SHIFT;
-
-	return (dma_addr_t)page_private(p);
-}
-
-static inline void kbase_clear_dma_addr(struct page *p)
-{
-	ClearPagePrivate(p);
-}
-
-/**
-* @brief Process a bus or page fault.
-*
-* This function will process a fault on a specific address space
-*
-* @param[in] kbdev   The @ref kbase_device the fault happened on
-* @param[in] kctx    The @ref kbase_context for the faulting address space if
-*                    one was found.
-* @param[in] as      The address space that has the fault
-*/
-void kbase_mmu_interrupt_process(struct kbase_device *kbdev,
-		struct kbase_context *kctx, struct kbase_as *as);
-
-/**
- * @brief Process a page fault.
- *
- * @param[in] data  work_struct passed by queue_work()
- */
-void page_fault_worker(struct work_struct *data);
-
-/**
- * @brief Process a bus fault.
- *
- * @param[in] data  work_struct passed by queue_work()
- */
-void bus_fault_worker(struct work_struct *data);
-
-/**
- * @brief Flush MMU workqueues.
- *
- * This function will cause any outstanding page or bus faults to be processed.
- * It should be called prior to powering off the GPU.
- *
- * @param[in] kbdev   Device pointer
- */
-void kbase_flush_mmu_wqs(struct kbase_device *kbdev);
-
-/**
- * kbase_sync_single_for_device - update physical memory and give GPU ownership
- * @kbdev: Device pointer
- * @handle: DMA address of region
- * @size: Size of region to sync
- * @dir:  DMA data direction
- */
-
-void kbase_sync_single_for_device(struct kbase_device *kbdev, dma_addr_t handle,
-		size_t size, enum dma_data_direction dir);
-
-/**
- * kbase_sync_single_for_cpu - update physical memory and give CPU ownership
- * @kbdev: Device pointer
- * @handle: DMA address of region
- * @size: Size of region to sync
- * @dir:  DMA data direction
- */
-
-void kbase_sync_single_for_cpu(struct kbase_device *kbdev, dma_addr_t handle,
-		size_t size, enum dma_data_direction dir);
-
-#ifdef CONFIG_DEBUG_FS
-/**
- * kbase_jit_debugfs_init - Add per context debugfs entry for JIT.
- * @kctx: kbase context
- */
-void kbase_jit_debugfs_init(struct kbase_context *kctx);
-#endif /* CONFIG_DEBUG_FS */
-
-/**
- * kbase_jit_init - Initialize the JIT memory pool management
- * @kctx: kbase context
- *
- * Returns zero on success or negative error number on failure.
- */
-int kbase_jit_init(struct kbase_context *kctx);
-
-/**
- * kbase_jit_allocate - Allocate JIT memory
- * @kctx: kbase context
- * @info: JIT allocation information
- *
- * Return: JIT allocation on success or NULL on failure.
- */
-struct kbase_va_region *kbase_jit_allocate(struct kbase_context *kctx,
-		struct base_jit_alloc_info *info);
-
-/**
- * kbase_jit_free - Free a JIT allocation
- * @kctx: kbase context
- * @reg: JIT allocation
- *
- * Frees a JIT allocation and places it into the free pool for later reuse.
- */
-void kbase_jit_free(struct kbase_context *kctx, struct kbase_va_region *reg);
-
-/**
- * kbase_jit_backing_lost - Inform JIT that an allocation has lost backing
- * @reg: JIT allocation
- */
-void kbase_jit_backing_lost(struct kbase_va_region *reg);
-
-/**
- * kbase_jit_evict - Evict a JIT allocation from the pool
- * @kctx: kbase context
- *
- * Evict the least recently used JIT allocation from the pool. This can be
- * required if normal VA allocations are failing due to VA exhaustion.
- *
- * Return: True if a JIT allocation was freed, false otherwise.
- */
-bool kbase_jit_evict(struct kbase_context *kctx);
-
-/**
- * kbase_jit_term - Terminate the JIT memory pool management
- * @kctx: kbase context
- */
-void kbase_jit_term(struct kbase_context *kctx);
-
-/**
- * kbase_map_external_resource - Map an external resource to the GPU.
- * @kctx:              kbase context.
- * @reg:               The region to map.
- * @locked_mm:         The mm_struct which has been locked for this operation.
- * @kds_res_count:     The number of KDS resources.
- * @kds_resources:     Array of KDS resources.
- * @kds_access_bitmap: Access bitmap for KDS.
- * @exclusive:         If the KDS resource requires exclusive access.
- *
- * Return: The physical allocation which backs the region on success or NULL
- * on failure.
- */
-struct kbase_mem_phy_alloc *kbase_map_external_resource(
-		struct kbase_context *kctx, struct kbase_va_region *reg,
-		struct mm_struct *locked_mm
-#ifdef CONFIG_KDS
-		, u32 *kds_res_count, struct kds_resource **kds_resources,
-		unsigned long *kds_access_bitmap, bool exclusive
-#endif
-		);
-
-/**
- * kbase_unmap_external_resource - Unmap an external resource from the GPU.
- * @kctx:  kbase context.
- * @reg:   The region to unmap or NULL if it has already been released.
- * @alloc: The physical allocation being unmapped.
- */
-void kbase_unmap_external_resource(struct kbase_context *kctx,
-		struct kbase_va_region *reg, struct kbase_mem_phy_alloc *alloc);
-
-/**
- * kbase_sticky_resource_init - Initialize sticky resource management.
- * @kctx: kbase context
- *
- * Returns zero on success or negative error number on failure.
- */
-int kbase_sticky_resource_init(struct kbase_context *kctx);
-
-/**
- * kbase_sticky_resource_acquire - Acquire a reference on a sticky resource.
- * @kctx:     kbase context.
- * @gpu_addr: The GPU address of the external resource.
- *
- * Return: The metadata object which represents the binding between the
- * external resource and the kbase context on success or NULL on failure.
- */
-struct kbase_ctx_ext_res_meta *kbase_sticky_resource_acquire(
-		struct kbase_context *kctx, u64 gpu_addr);
-
-/**
- * kbase_sticky_resource_release - Release a reference on a sticky resource.
- * @kctx:     kbase context.
- * @meta:     Binding metadata.
- * @gpu_addr: GPU address of the external resource.
- *
- * If meta is NULL then gpu_addr will be used to scan the metadata list and
- * find the matching metadata (if any), otherwise the provided meta will be
- * used and gpu_addr will be ignored.
- *
- * Return: True if the release found the metadata and the reference was dropped.
- */
-bool kbase_sticky_resource_release(struct kbase_context *kctx,
-		struct kbase_ctx_ext_res_meta *meta, u64 gpu_addr);
-
-/**
- * kbase_sticky_resource_term - Terminate sticky resource management.
- * @kctx: kbase context
- */
-void kbase_sticky_resource_term(struct kbase_context *kctx);
-
-/**
- * kbase_zone_cache_update - Update the memory zone cache after new pages have
- * been added.
- * @alloc:        The physical memory allocation to build the cache for.
- * @start_offset: Offset to where the new pages start.
- *
- * Updates an existing memory zone cache, updating the counters for the
- * various zones.
- * If the memory allocation doesn't already have a zone cache assume that
- * one isn't created and thus don't do anything.
- *
- * Return: Zero cache was updated, negative error code on error.
- */
-int kbase_zone_cache_update(struct kbase_mem_phy_alloc *alloc,
-		size_t start_offset);
-
-/**
- * kbase_zone_cache_build - Build the memory zone cache.
- * @alloc:        The physical memory allocation to build the cache for.
- *
- * Create a new zone cache for the provided physical memory allocation if
- * one doesn't already exist, if one does exist then just return.
- *
- * Return: Zero if the zone cache was created, negative error code on error.
- */
-int kbase_zone_cache_build(struct kbase_mem_phy_alloc *alloc);
-
-/**
- * kbase_zone_cache_clear - Clear the memory zone cache.
- * @alloc:        The physical memory allocation to clear the cache on.
- */
-void kbase_zone_cache_clear(struct kbase_mem_phy_alloc *alloc);
-
-#endif				/* _KBASE_MEM_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_linux.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_linux.c
deleted file mode 100644
index 842444c9b0bd..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_linux.c
+++ /dev/null
@@ -1,2678 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/**
- * @file mali_kbase_mem_linux.c
- * Base kernel memory APIs, Linux implementation.
- */
-
-#include <linux/compat.h>
-#include <linux/kernel.h>
-#include <linux/bug.h>
-#include <linux/mm.h>
-#include <linux/mman.h>
-#include <linux/fs.h>
-#include <linux/version.h>
-#include <linux/dma-mapping.h>
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)) && \
-	(LINUX_VERSION_CODE < KERNEL_VERSION(4, 8, 0))
-#include <linux/dma-attrs.h>
-#endif /* LINUX_VERSION_CODE >= 3.5.0 && < 4.8.0 */
-#ifdef CONFIG_DMA_SHARED_BUFFER
-#include <linux/dma-buf.h>
-#endif				/* defined(CONFIG_DMA_SHARED_BUFFER) */
-#include <linux/shrinker.h>
-#include <linux/cache.h>
-
-#include <mali_kbase.h>
-#include <mali_kbase_mem_linux.h>
-#include <mali_kbase_config_defaults.h>
-#include <mali_kbase_tlstream.h>
-
-static int kbase_tracking_page_setup(struct kbase_context *kctx, struct vm_area_struct *vma);
-
-/**
- * kbase_mem_shrink_cpu_mapping - Shrink the CPU mapping(s) of an allocation
- * @kctx:      Context the region belongs to
- * @reg:       The GPU region
- * @new_pages: The number of pages after the shrink
- * @old_pages: The number of pages before the shrink
- *
- * Shrink (or completely remove) all CPU mappings which reference the shrunk
- * part of the allocation.
- *
- * Note: Caller must be holding the processes mmap_sem lock.
- */
-static void kbase_mem_shrink_cpu_mapping(struct kbase_context *kctx,
-		struct kbase_va_region *reg,
-		u64 new_pages, u64 old_pages);
-
-/**
- * kbase_mem_shrink_gpu_mapping - Shrink the GPU mapping of an allocation
- * @kctx:      Context the region belongs to
- * @reg:       The GPU region or NULL if there isn't one
- * @new_pages: The number of pages after the shrink
- * @old_pages: The number of pages before the shrink
- *
- * Return: 0 on success, negative -errno on error
- *
- * Unmap the shrunk pages from the GPU mapping. Note that the size of the region
- * itself is unmodified as we still need to reserve the VA, only the page tables
- * will be modified by this function.
- */
-static int kbase_mem_shrink_gpu_mapping(struct kbase_context *kctx,
-		struct kbase_va_region *reg,
-		u64 new_pages, u64 old_pages);
-
-struct kbase_va_region *kbase_mem_alloc(struct kbase_context *kctx,
-		u64 va_pages, u64 commit_pages, u64 extent, u64 *flags,
-		u64 *gpu_va)
-{
-	int zone;
-	int gpu_pc_bits;
-	struct kbase_va_region *reg;
-	struct device *dev;
-
-	KBASE_DEBUG_ASSERT(kctx);
-	KBASE_DEBUG_ASSERT(flags);
-	KBASE_DEBUG_ASSERT(gpu_va);
-
-	dev = kctx->kbdev->dev;
-	*gpu_va = 0; /* return 0 on failure */
-
-	gpu_pc_bits = kctx->kbdev->gpu_props.props.core_props.log2_program_counter_size;
-
-	if (0 == va_pages) {
-		dev_warn(dev, "kbase_mem_alloc called with 0 va_pages!");
-		goto bad_size;
-	}
-
-	if (va_pages > (U64_MAX / PAGE_SIZE))
-		/* 64-bit address range is the max */
-		goto bad_size;
-
-	if (!kbase_check_alloc_flags(*flags)) {
-		dev_warn(dev,
-				"kbase_mem_alloc called with bad flags (%llx)",
-				(unsigned long long)*flags);
-		goto bad_flags;
-	}
-
-	if ((*flags & BASE_MEM_COHERENT_SYSTEM_REQUIRED) != 0 &&
-			!kbase_device_is_cpu_coherent(kctx->kbdev)) {
-		dev_warn(dev, "kbase_mem_alloc call required coherent mem when unavailable");
-		goto bad_flags;
-	}
-	if ((*flags & BASE_MEM_COHERENT_SYSTEM) != 0 &&
-			!kbase_device_is_cpu_coherent(kctx->kbdev)) {
-		/* Remove COHERENT_SYSTEM flag if coherent mem is unavailable */
-		*flags &= ~BASE_MEM_COHERENT_SYSTEM;
-	}
-
-	/* Limit GPU executable allocs to GPU PC size */
-	if ((*flags & BASE_MEM_PROT_GPU_EX) &&
-	    (va_pages > (1ULL << gpu_pc_bits >> PAGE_SHIFT)))
-		goto bad_ex_size;
-
-	/* find out which VA zone to use */
-	if (*flags & BASE_MEM_SAME_VA)
-		zone = KBASE_REG_ZONE_SAME_VA;
-	else if (*flags & BASE_MEM_PROT_GPU_EX)
-		zone = KBASE_REG_ZONE_EXEC;
-	else
-		zone = KBASE_REG_ZONE_CUSTOM_VA;
-
-	reg = kbase_alloc_free_region(kctx, 0, va_pages, zone);
-	if (!reg) {
-		dev_err(dev, "Failed to allocate free region");
-		goto no_region;
-	}
-
-	if (kbase_update_region_flags(kctx, reg, *flags) != 0)
-		goto invalid_flags;
-
-	if (kbase_reg_prepare_native(reg, kctx) != 0) {
-		dev_err(dev, "Failed to prepare region");
-		goto prepare_failed;
-	}
-
-	if (*flags & BASE_MEM_GROW_ON_GPF)
-		reg->extent = extent;
-	else
-		reg->extent = 0;
-
-	if (kbase_alloc_phy_pages(reg, va_pages, commit_pages) != 0) {
-		dev_warn(dev, "Failed to allocate %lld pages (va_pages=%lld)",
-				(unsigned long long)commit_pages,
-				(unsigned long long)va_pages);
-		goto no_mem;
-	}
-
-	kbase_gpu_vm_lock(kctx);
-
-	/* mmap needed to setup VA? */
-	if (*flags & BASE_MEM_SAME_VA) {
-		unsigned long prot = PROT_NONE;
-		unsigned long va_size = va_pages << PAGE_SHIFT;
-		unsigned long va_map = va_size;
-		unsigned long cookie, cookie_nr;
-		unsigned long cpu_addr;
-
-		/* Bind to a cookie */
-		if (!kctx->cookies) {
-			dev_err(dev, "No cookies available for allocation!");
-			kbase_gpu_vm_unlock(kctx);
-			goto no_cookie;
-		}
-		/* return a cookie */
-		cookie_nr = __ffs(kctx->cookies);
-		kctx->cookies &= ~(1UL << cookie_nr);
-		BUG_ON(kctx->pending_regions[cookie_nr]);
-		kctx->pending_regions[cookie_nr] = reg;
-
-		kbase_gpu_vm_unlock(kctx);
-
-		/* relocate to correct base */
-		cookie = cookie_nr + PFN_DOWN(BASE_MEM_COOKIE_BASE);
-		cookie <<= PAGE_SHIFT;
-
-		/*
-		 * 10.1-10.4 UKU userland relies on the kernel to call mmap.
-		 * For all other versions we can just return the cookie
-		 */
-		if (kctx->api_version < KBASE_API_VERSION(10, 1) ||
-		    kctx->api_version > KBASE_API_VERSION(10, 4)) {
-			*gpu_va = (u64) cookie;
-			return reg;
-		}
-		if (*flags & BASE_MEM_PROT_CPU_RD)
-			prot |= PROT_READ;
-		if (*flags & BASE_MEM_PROT_CPU_WR)
-			prot |= PROT_WRITE;
-
-		cpu_addr = vm_mmap(kctx->filp, 0, va_map, prot,
-				MAP_SHARED, cookie);
-
-		if (IS_ERR_VALUE(cpu_addr)) {
-			kbase_gpu_vm_lock(kctx);
-			kctx->pending_regions[cookie_nr] = NULL;
-			kctx->cookies |= (1UL << cookie_nr);
-			kbase_gpu_vm_unlock(kctx);
-			goto no_mmap;
-		}
-
-		*gpu_va = (u64) cpu_addr;
-	} else /* we control the VA */ {
-		if (kbase_gpu_mmap(kctx, reg, 0, va_pages, 1) != 0) {
-			dev_warn(dev, "Failed to map memory on GPU");
-			kbase_gpu_vm_unlock(kctx);
-			goto no_mmap;
-		}
-		/* return real GPU VA */
-		*gpu_va = reg->start_pfn << PAGE_SHIFT;
-
-		kbase_gpu_vm_unlock(kctx);
-	}
-
-	return reg;
-
-no_mmap:
-no_cookie:
-no_mem:
-	kbase_mem_phy_alloc_put(reg->cpu_alloc);
-	kbase_mem_phy_alloc_put(reg->gpu_alloc);
-invalid_flags:
-prepare_failed:
-	kfree(reg);
-no_region:
-bad_ex_size:
-bad_flags:
-bad_size:
-	return NULL;
-}
-KBASE_EXPORT_TEST_API(kbase_mem_alloc);
-
-int kbase_mem_query(struct kbase_context *kctx, u64 gpu_addr, int query, u64 * const out)
-{
-	struct kbase_va_region *reg;
-	int ret = -EINVAL;
-
-	KBASE_DEBUG_ASSERT(kctx);
-	KBASE_DEBUG_ASSERT(out);
-
-	if (gpu_addr & ~PAGE_MASK) {
-		dev_warn(kctx->kbdev->dev, "mem_query: gpu_addr: passed parameter is invalid");
-		return -EINVAL;
-	}
-
-	kbase_gpu_vm_lock(kctx);
-
-	/* Validate the region */
-	reg = kbase_region_tracker_find_region_base_address(kctx, gpu_addr);
-	if (!reg || (reg->flags & KBASE_REG_FREE))
-		goto out_unlock;
-
-	switch (query) {
-	case KBASE_MEM_QUERY_COMMIT_SIZE:
-		if (reg->cpu_alloc->type != KBASE_MEM_TYPE_ALIAS) {
-			*out = kbase_reg_current_backed_size(reg);
-		} else {
-			size_t i;
-			struct kbase_aliased *aliased;
-			*out = 0;
-			aliased = reg->cpu_alloc->imported.alias.aliased;
-			for (i = 0; i < reg->cpu_alloc->imported.alias.nents; i++)
-				*out += aliased[i].length;
-		}
-		break;
-	case KBASE_MEM_QUERY_VA_SIZE:
-		*out = reg->nr_pages;
-		break;
-	case KBASE_MEM_QUERY_FLAGS:
-	{
-		*out = 0;
-		if (KBASE_REG_CPU_WR & reg->flags)
-			*out |= BASE_MEM_PROT_CPU_WR;
-		if (KBASE_REG_CPU_RD & reg->flags)
-			*out |= BASE_MEM_PROT_CPU_RD;
-		if (KBASE_REG_CPU_CACHED & reg->flags)
-			*out |= BASE_MEM_CACHED_CPU;
-		if (KBASE_REG_GPU_WR & reg->flags)
-			*out |= BASE_MEM_PROT_GPU_WR;
-		if (KBASE_REG_GPU_RD & reg->flags)
-			*out |= BASE_MEM_PROT_GPU_RD;
-		if (!(KBASE_REG_GPU_NX & reg->flags))
-			*out |= BASE_MEM_PROT_GPU_EX;
-		if (KBASE_REG_SHARE_BOTH & reg->flags)
-			*out |= BASE_MEM_COHERENT_SYSTEM;
-		if (KBASE_REG_SHARE_IN & reg->flags)
-			*out |= BASE_MEM_COHERENT_LOCAL;
-		break;
-	}
-	default:
-		*out = 0;
-		goto out_unlock;
-	}
-
-	ret = 0;
-
-out_unlock:
-	kbase_gpu_vm_unlock(kctx);
-	return ret;
-}
-
-/**
- * kbase_mem_evictable_reclaim_count_objects - Count number of pages in the
- * Ephemeral memory eviction list.
- * @s:        Shrinker
- * @sc:       Shrinker control
- *
- * Return: Number of pages which can be freed.
- */
-static
-unsigned long kbase_mem_evictable_reclaim_count_objects(struct shrinker *s,
-		struct shrink_control *sc)
-{
-	struct kbase_context *kctx;
-	struct kbase_mem_phy_alloc *alloc;
-	unsigned long pages = 0;
-
-	kctx = container_of(s, struct kbase_context, reclaim);
-
-	mutex_lock(&kctx->jit_evict_lock);
-
-	list_for_each_entry(alloc, &kctx->evict_list, evict_node)
-		pages += alloc->nents;
-
-	mutex_unlock(&kctx->jit_evict_lock);
-	return pages;
-}
-
-/**
- * kbase_mem_evictable_reclaim_scan_objects - Scan the Ephemeral memory eviction
- * list for pages and try to reclaim them.
- * @s:        Shrinker
- * @sc:       Shrinker control
- *
- * Return: Number of pages freed (can be less then requested) or -1 if the
- * shrinker failed to free pages in its pool.
- *
- * Note:
- * This function accesses region structures without taking the region lock,
- * this is required as the OOM killer can call the shrinker after the region
- * lock has already been held.
- * This is safe as we can guarantee that a region on the eviction list will
- * not be freed (kbase_mem_free_region removes the allocation from the list
- * before destroying it), or modified by other parts of the driver.
- * The eviction list itself is guarded by the eviction lock and the MMU updates
- * are protected by their own lock.
- */
-static
-unsigned long kbase_mem_evictable_reclaim_scan_objects(struct shrinker *s,
-		struct shrink_control *sc)
-{
-	struct kbase_context *kctx;
-	struct kbase_mem_phy_alloc *alloc;
-	struct kbase_mem_phy_alloc *tmp;
-	unsigned long freed = 0;
-
-	kctx = container_of(s, struct kbase_context, reclaim);
-	mutex_lock(&kctx->jit_evict_lock);
-
-	list_for_each_entry_safe(alloc, tmp, &kctx->evict_list, evict_node) {
-		int err;
-
-		err = kbase_mem_shrink_gpu_mapping(kctx, alloc->reg,
-				0, alloc->nents);
-		if (err != 0) {
-			/*
-			 * Failed to remove GPU mapping, tell the shrinker
-			 * to stop trying to shrink our slab even though we
-			 * have pages in it.
-			 */
-			freed = -1;
-			goto out_unlock;
-		}
-
-		/*
-		 * Update alloc->evicted before freeing the backing so the
-		 * helper can determine that it needs to bypass the accounting
-		 * and memory pool.
-		 */
-		alloc->evicted = alloc->nents;
-
-		kbase_free_phy_pages_helper(alloc, alloc->evicted);
-		freed += alloc->evicted;
-		list_del_init(&alloc->evict_node);
-
-		/*
-		 * Inform the JIT allocator this region has lost backing
-		 * as it might need to free the allocation.
-		 */
-		kbase_jit_backing_lost(alloc->reg);
-
-		/* Enough pages have been freed so stop now */
-		if (freed > sc->nr_to_scan)
-			break;
-	}
-out_unlock:
-	mutex_unlock(&kctx->jit_evict_lock);
-
-	return freed;
-}
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 12, 0)
-static int kbase_mem_evictable_reclaim_shrink(struct shrinker *s,
-		struct shrink_control *sc)
-{
-	if (sc->nr_to_scan == 0)
-		return kbase_mem_evictable_reclaim_count_objects(s, sc);
-
-	return kbase_mem_evictable_reclaim_scan_objects(s, sc);
-}
-#endif
-
-int kbase_mem_evictable_init(struct kbase_context *kctx)
-{
-	INIT_LIST_HEAD(&kctx->evict_list);
-	mutex_init(&kctx->jit_evict_lock);
-
-	/* Register shrinker */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 12, 0)
-	kctx->reclaim.shrink = kbase_mem_evictable_reclaim_shrink;
-#else
-	kctx->reclaim.count_objects = kbase_mem_evictable_reclaim_count_objects;
-	kctx->reclaim.scan_objects = kbase_mem_evictable_reclaim_scan_objects;
-#endif
-	kctx->reclaim.seeks = DEFAULT_SEEKS;
-	/* Kernel versions prior to 3.1 :
-	 * struct shrinker does not define batch */
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
-	kctx->reclaim.batch = 0;
-#endif
-	register_shrinker(&kctx->reclaim);
-	return 0;
-}
-
-void kbase_mem_evictable_deinit(struct kbase_context *kctx)
-{
-	unregister_shrinker(&kctx->reclaim);
-}
-
-struct kbase_mem_zone_cache_entry {
-	/* List head used to link the cache entry to the memory allocation. */
-	struct list_head zone_node;
-	/* The zone the cacheline is for. */
-	struct zone *zone;
-	/* The number of pages in the allocation which belong to this zone. */
-	u64 count;
-};
-
-static bool kbase_zone_cache_builder(struct kbase_mem_phy_alloc *alloc,
-		size_t start_offset)
-{
-	struct kbase_mem_zone_cache_entry *cache = NULL;
-	size_t i;
-	int ret = 0;
-
-	for (i = start_offset; i < alloc->nents; i++) {
-		struct page *p = phys_to_page(as_phys_addr_t(alloc->pages[i]));
-		struct zone *zone = page_zone(p);
-		bool create = true;
-
-		if (cache && (cache->zone == zone)) {
-			/*
-			 * Fast path check as most of the time adjacent
-			 * pages come from the same zone.
-			 */
-			create = false;
-		} else {
-			/*
-			 * Slow path check, walk all the cache entries to see
-			 * if we already know about this zone.
-			 */
-			list_for_each_entry(cache, &alloc->zone_cache, zone_node) {
-				if (cache->zone == zone) {
-					create = false;
-					break;
-				}
-			}
-		}
-
-		/* This zone wasn't found in the cache, create an entry for it */
-		if (create) {
-			cache = kmalloc(sizeof(*cache), GFP_KERNEL);
-			if (!cache) {
-				ret = -ENOMEM;
-				goto bail;
-			}
-			cache->zone = zone;
-			cache->count = 0;
-			list_add(&cache->zone_node, &alloc->zone_cache);
-		}
-
-		cache->count++;
-	}
-	return 0;
-
-bail:
-	return ret;
-}
-
-int kbase_zone_cache_update(struct kbase_mem_phy_alloc *alloc,
-		size_t start_offset)
-{
-	/*
-	 * Bail if the zone cache is empty, only update the cache if it
-	 * existed in the first place.
-	 */
-	if (list_empty(&alloc->zone_cache))
-		return 0;
-
-	return kbase_zone_cache_builder(alloc, start_offset);
-}
-
-int kbase_zone_cache_build(struct kbase_mem_phy_alloc *alloc)
-{
-	/* Bail if the zone cache already exists */
-	if (!list_empty(&alloc->zone_cache))
-		return 0;
-
-	return kbase_zone_cache_builder(alloc, 0);
-}
-
-void kbase_zone_cache_clear(struct kbase_mem_phy_alloc *alloc)
-{
-	struct kbase_mem_zone_cache_entry *walker;
-
-	while(!list_empty(&alloc->zone_cache)){
-		walker = list_first_entry(&alloc->zone_cache,
-				struct kbase_mem_zone_cache_entry, zone_node);
-		list_del(&walker->zone_node);
-		kfree(walker);
-	}
-}
-
-/**
- * kbase_mem_evictable_mark_reclaim - Mark the pages as reclaimable.
- * @alloc: The physical allocation
- */
-static void kbase_mem_evictable_mark_reclaim(struct kbase_mem_phy_alloc *alloc)
-{
-	struct kbase_context *kctx = alloc->imported.kctx;
-	struct kbase_mem_zone_cache_entry *zone_cache;
-	int __maybe_unused new_page_count;
-	int err;
-
-	/* Attempt to build a zone cache of tracking */
-	err = kbase_zone_cache_build(alloc);
-	if (err == 0) {
-		/* Bulk update all the zones */
-		list_for_each_entry(zone_cache, &alloc->zone_cache, zone_node) {
-			zone_page_state_add(zone_cache->count,
-					zone_cache->zone, NR_SLAB_RECLAIMABLE);
-		}
-	} else {
-		/* Fall-back to page by page updates */
-		int i;
-
-		for (i = 0; i < alloc->nents; i++) {
-			struct page *p;
-			struct zone *zone;
-
-			p = phys_to_page(as_phys_addr_t(alloc->pages[i]));
-			zone = page_zone(p);
-
-			zone_page_state_add(1, zone, NR_SLAB_RECLAIMABLE);
-		}
-	}
-
-	kbase_process_page_usage_dec(kctx, alloc->nents);
-	new_page_count = kbase_atomic_sub_pages(alloc->nents,
-						&kctx->used_pages);
-	kbase_atomic_sub_pages(alloc->nents, &kctx->kbdev->memdev.used_pages);
-
-	KBASE_TLSTREAM_AUX_PAGESALLOC(
-			kctx->id,
-			(u64)new_page_count);
-}
-
-/**
- * kbase_mem_evictable_unmark_reclaim - Mark the pages as no longer reclaimable.
- * @alloc: The physical allocation
- */
-static
-void kbase_mem_evictable_unmark_reclaim(struct kbase_mem_phy_alloc *alloc)
-{
-	struct kbase_context *kctx = alloc->imported.kctx;
-	struct kbase_mem_zone_cache_entry *zone_cache;
-	int __maybe_unused new_page_count;
-	int err;
-
-	new_page_count = kbase_atomic_add_pages(alloc->nents,
-						&kctx->used_pages);
-	kbase_atomic_add_pages(alloc->nents, &kctx->kbdev->memdev.used_pages);
-
-	/* Increase mm counters so that the allocation is accounted for
-	 * against the process and thus is visible to the OOM killer,
-	 * then remove it from the reclaimable accounting. */
-	kbase_process_page_usage_inc(kctx, alloc->nents);
-
-	/* Attempt to build a zone cache of tracking */
-	err = kbase_zone_cache_build(alloc);
-	if (err == 0) {
-		/* Bulk update all the zones */
-		list_for_each_entry(zone_cache, &alloc->zone_cache, zone_node) {
-			zone_page_state_add(-zone_cache->count,
-					zone_cache->zone, NR_SLAB_RECLAIMABLE);
-		}
-	} else {
-		/* Fall-back to page by page updates */
-		int i;
-
-		for (i = 0; i < alloc->nents; i++) {
-			struct page *p;
-			struct zone *zone;
-
-			p = phys_to_page(as_phys_addr_t(alloc->pages[i]));
-			zone = page_zone(p);
-			zone_page_state_add(-1, zone, NR_SLAB_RECLAIMABLE);
-		}
-	}
-
-	KBASE_TLSTREAM_AUX_PAGESALLOC(
-			kctx->id,
-			(u64)new_page_count);
-}
-
-int kbase_mem_evictable_make(struct kbase_mem_phy_alloc *gpu_alloc)
-{
-	struct kbase_context *kctx = gpu_alloc->imported.kctx;
-
-	lockdep_assert_held(&kctx->reg_lock);
-
-	/* This alloction can't already be on a list. */
-	WARN_ON(!list_empty(&gpu_alloc->evict_node));
-
-	kbase_mem_shrink_cpu_mapping(kctx, gpu_alloc->reg,
-			0, gpu_alloc->nents);
-
-	/*
-	 * Add the allocation to the eviction list, after this point the shrink
-	 * can reclaim it.
-	 */
-	mutex_lock(&kctx->jit_evict_lock);
-	list_add(&gpu_alloc->evict_node, &kctx->evict_list);
-	mutex_unlock(&kctx->jit_evict_lock);
-	kbase_mem_evictable_mark_reclaim(gpu_alloc);
-
-	gpu_alloc->reg->flags |= KBASE_REG_DONT_NEED;
-	return 0;
-}
-
-bool kbase_mem_evictable_unmake(struct kbase_mem_phy_alloc *gpu_alloc)
-{
-	struct kbase_context *kctx = gpu_alloc->imported.kctx;
-	int err = 0;
-
-	lockdep_assert_held(&kctx->reg_lock);
-
-	/*
-	 * First remove the allocation from the eviction list as it's no
-	 * longer eligible for eviction.
-	 */
-	list_del_init(&gpu_alloc->evict_node);
-
-	if (gpu_alloc->evicted == 0) {
-		/*
-		 * The backing is still present, update the VM stats as it's
-		 * in use again.
-		 */
-		kbase_mem_evictable_unmark_reclaim(gpu_alloc);
-	} else {
-		/* If the region is still alive ... */
-		if (gpu_alloc->reg) {
-			/* ... allocate replacement backing ... */
-			err = kbase_alloc_phy_pages_helper(gpu_alloc,
-					gpu_alloc->evicted);
-
-			/*
-			 * ... and grow the mapping back to its
-			 * pre-eviction size.
-			 */
-			if (!err)
-				err = kbase_mem_grow_gpu_mapping(kctx,
-						gpu_alloc->reg,
-						gpu_alloc->evicted, 0);
-
-			gpu_alloc->evicted = 0;
-		}
-	}
-
-	/* If the region is still alive remove the DONT_NEED attribute. */
-	if (gpu_alloc->reg)
-		gpu_alloc->reg->flags &= ~KBASE_REG_DONT_NEED;
-
-	return (err == 0);
-}
-
-int kbase_mem_flags_change(struct kbase_context *kctx, u64 gpu_addr, unsigned int flags, unsigned int mask)
-{
-	struct kbase_va_region *reg;
-	int ret = -EINVAL;
-	unsigned int real_flags = 0;
-	unsigned int prev_flags = 0;
-	bool prev_needed, new_needed;
-
-	KBASE_DEBUG_ASSERT(kctx);
-
-	if (!gpu_addr)
-		return -EINVAL;
-
-	if ((gpu_addr & ~PAGE_MASK) && (gpu_addr >= PAGE_SIZE))
-		return -EINVAL;
-
-	/* nuke other bits */
-	flags &= mask;
-
-	/* check for only supported flags */
-	if (flags & ~(BASE_MEM_FLAGS_MODIFIABLE))
-		goto out;
-
-	/* mask covers bits we don't support? */
-	if (mask & ~(BASE_MEM_FLAGS_MODIFIABLE))
-		goto out;
-
-	/* convert flags */
-	if (BASE_MEM_COHERENT_SYSTEM & flags)
-		real_flags |= KBASE_REG_SHARE_BOTH;
-	else if (BASE_MEM_COHERENT_LOCAL & flags)
-		real_flags |= KBASE_REG_SHARE_IN;
-
-	/* now we can lock down the context, and find the region */
-	down_write(&current->mm->mmap_sem);
-	kbase_gpu_vm_lock(kctx);
-
-	/* Validate the region */
-	reg = kbase_region_tracker_find_region_base_address(kctx, gpu_addr);
-	if (!reg || (reg->flags & KBASE_REG_FREE))
-		goto out_unlock;
-
-	/* Is the region being transitioning between not needed and needed? */
-	prev_needed = (KBASE_REG_DONT_NEED & reg->flags) == KBASE_REG_DONT_NEED;
-	new_needed = (BASE_MEM_DONT_NEED & flags) == BASE_MEM_DONT_NEED;
-	if (prev_needed != new_needed) {
-		/* Aliased allocations can't be made ephemeral */
-		if (atomic_read(&reg->cpu_alloc->gpu_mappings) > 1)
-			goto out_unlock;
-
-		if (new_needed) {
-			/* Only native allocations can be marked not needed */
-			if (reg->cpu_alloc->type != KBASE_MEM_TYPE_NATIVE) {
-				ret = -EINVAL;
-				goto out_unlock;
-			}
-			ret = kbase_mem_evictable_make(reg->gpu_alloc);
-			if (ret)
-				goto out_unlock;
-		} else {
-			kbase_mem_evictable_unmake(reg->gpu_alloc);
-		}
-	}
-
-	/* limit to imported memory */
-	if ((reg->gpu_alloc->type != KBASE_MEM_TYPE_IMPORTED_UMP) &&
-	     (reg->gpu_alloc->type != KBASE_MEM_TYPE_IMPORTED_UMM))
-		goto out_unlock;
-
-	/* no change? */
-	if (real_flags == (reg->flags & (KBASE_REG_SHARE_IN | KBASE_REG_SHARE_BOTH))) {
-		ret = 0;
-		goto out_unlock;
-	}
-
-	/* save for roll back */
-	prev_flags = reg->flags;
-	reg->flags &= ~(KBASE_REG_SHARE_IN | KBASE_REG_SHARE_BOTH);
-	reg->flags |= real_flags;
-
-	/* Currently supporting only imported memory */
-	switch (reg->gpu_alloc->type) {
-#ifdef CONFIG_UMP
-	case KBASE_MEM_TYPE_IMPORTED_UMP:
-		ret = kbase_mmu_update_pages(kctx, reg->start_pfn,
-					     kbase_get_gpu_phy_pages(reg),
-				             reg->gpu_alloc->nents, reg->flags);
-		break;
-#endif
-#ifdef CONFIG_DMA_SHARED_BUFFER
-	case KBASE_MEM_TYPE_IMPORTED_UMM:
-		/* Future use will use the new flags, existing mapping will NOT be updated
-		 * as memory should not be in use by the GPU when updating the flags.
-		 */
-		ret = 0;
-		WARN_ON(reg->gpu_alloc->imported.umm.current_mapping_usage_count);
-		break;
-#endif
-	default:
-		break;
-	}
-
-	/* roll back on error, i.e. not UMP */
-	if (ret)
-		reg->flags = prev_flags;
-
-out_unlock:
-	kbase_gpu_vm_unlock(kctx);
-	up_write(&current->mm->mmap_sem);
-out:
-	return ret;
-}
-
-#define KBASE_MEM_IMPORT_HAVE_PAGES (1UL << BASE_MEM_FLAGS_NR_BITS)
-
-#ifdef CONFIG_UMP
-static struct kbase_va_region *kbase_mem_from_ump(struct kbase_context *kctx, ump_secure_id id, u64 *va_pages, u64 *flags)
-{
-	struct kbase_va_region *reg;
-	ump_dd_handle umph;
-	u64 block_count;
-	const ump_dd_physical_block_64 *block_array;
-	u64 i, j;
-	int page = 0;
-	ump_alloc_flags ump_flags;
-	ump_alloc_flags cpu_flags;
-	ump_alloc_flags gpu_flags;
-
-	if (*flags & BASE_MEM_SECURE)
-		goto bad_flags;
-
-	umph = ump_dd_from_secure_id(id);
-	if (UMP_DD_INVALID_MEMORY_HANDLE == umph)
-		goto bad_id;
-
-	ump_flags = ump_dd_allocation_flags_get(umph);
-	cpu_flags = (ump_flags >> UMP_DEVICE_CPU_SHIFT) & UMP_DEVICE_MASK;
-	gpu_flags = (ump_flags >> DEFAULT_UMP_GPU_DEVICE_SHIFT) &
-			UMP_DEVICE_MASK;
-
-	*va_pages = ump_dd_size_get_64(umph);
-	*va_pages >>= PAGE_SHIFT;
-
-	if (!*va_pages)
-		goto bad_size;
-
-	if (*va_pages > (U64_MAX / PAGE_SIZE))
-		/* 64-bit address range is the max */
-		goto bad_size;
-
-	if (*flags & BASE_MEM_SAME_VA)
-		reg = kbase_alloc_free_region(kctx, 0, *va_pages, KBASE_REG_ZONE_SAME_VA);
-	else
-		reg = kbase_alloc_free_region(kctx, 0, *va_pages, KBASE_REG_ZONE_CUSTOM_VA);
-
-	if (!reg)
-		goto no_region;
-
-	/* we've got pages to map now, and support SAME_VA */
-	*flags |= KBASE_MEM_IMPORT_HAVE_PAGES;
-
-	reg->gpu_alloc = kbase_alloc_create(*va_pages, KBASE_MEM_TYPE_IMPORTED_UMP);
-	if (IS_ERR_OR_NULL(reg->gpu_alloc))
-		goto no_alloc_obj;
-
-	reg->cpu_alloc = kbase_mem_phy_alloc_get(reg->gpu_alloc);
-
-	reg->gpu_alloc->imported.ump_handle = umph;
-
-	reg->flags &= ~KBASE_REG_FREE;
-	reg->flags |= KBASE_REG_GPU_NX;	/* UMP is always No eXecute */
-	reg->flags &= ~KBASE_REG_GROWABLE;	/* UMP cannot be grown */
-
-	/* Override import flags based on UMP flags */
-	*flags &= ~(BASE_MEM_CACHED_CPU);
-	*flags &= ~(BASE_MEM_PROT_CPU_RD | BASE_MEM_PROT_CPU_WR);
-	*flags &= ~(BASE_MEM_PROT_GPU_RD | BASE_MEM_PROT_GPU_WR);
-
-	if ((cpu_flags & (UMP_HINT_DEVICE_RD | UMP_HINT_DEVICE_WR)) ==
-	    (UMP_HINT_DEVICE_RD | UMP_HINT_DEVICE_WR)) {
-		reg->flags |= KBASE_REG_CPU_CACHED;
-		*flags |= BASE_MEM_CACHED_CPU;
-	}
-
-	if (cpu_flags & UMP_PROT_CPU_WR) {
-		reg->flags |= KBASE_REG_CPU_WR;
-		*flags |= BASE_MEM_PROT_CPU_WR;
-	}
-
-	if (cpu_flags & UMP_PROT_CPU_RD) {
-		reg->flags |= KBASE_REG_CPU_RD;
-		*flags |= BASE_MEM_PROT_CPU_RD;
-	}
-
-	if ((gpu_flags & (UMP_HINT_DEVICE_RD | UMP_HINT_DEVICE_WR)) ==
-	    (UMP_HINT_DEVICE_RD | UMP_HINT_DEVICE_WR))
-		reg->flags |= KBASE_REG_GPU_CACHED;
-
-	if (gpu_flags & UMP_PROT_DEVICE_WR) {
-		reg->flags |= KBASE_REG_GPU_WR;
-		*flags |= BASE_MEM_PROT_GPU_WR;
-	}
-
-	if (gpu_flags & UMP_PROT_DEVICE_RD) {
-		reg->flags |= KBASE_REG_GPU_RD;
-		*flags |= BASE_MEM_PROT_GPU_RD;
-	}
-
-	/* ump phys block query */
-	ump_dd_phys_blocks_get_64(umph, &block_count, &block_array);
-
-	for (i = 0; i < block_count; i++) {
-		for (j = 0; j < (block_array[i].size >> PAGE_SHIFT); j++) {
-			struct tagged_addr tagged;
-
-			tagged = as_tagged(block_array[i].addr +
-					   (j << PAGE_SHIFT));
-			reg->gpu_alloc->pages[page] = tagged;
-			page++;
-		}
-	}
-	reg->gpu_alloc->nents = *va_pages;
-	reg->extent = 0;
-
-	return reg;
-
-no_alloc_obj:
-	kfree(reg);
-no_region:
-bad_size:
-	ump_dd_release(umph);
-bad_id:
-bad_flags:
-	return NULL;
-}
-#endif				/* CONFIG_UMP */
-
-#ifdef CONFIG_DMA_SHARED_BUFFER
-static struct kbase_va_region *kbase_mem_from_umm(struct kbase_context *kctx,
-		int fd, u64 *va_pages, u64 *flags, u32 padding)
-{
-	struct kbase_va_region *reg;
-	struct dma_buf *dma_buf;
-	struct dma_buf_attachment *dma_attachment;
-	bool shared_zone = false;
-
-	dma_buf = dma_buf_get(fd);
-	if (IS_ERR_OR_NULL(dma_buf))
-		goto no_buf;
-
-	dma_attachment = dma_buf_attach(dma_buf, kctx->kbdev->dev);
-	if (!dma_attachment)
-		goto no_attachment;
-
-	*va_pages = (PAGE_ALIGN(dma_buf->size) >> PAGE_SHIFT) + padding;
-	if (!*va_pages)
-		goto bad_size;
-
-	if (*va_pages > (U64_MAX / PAGE_SIZE))
-		/* 64-bit address range is the max */
-		goto bad_size;
-
-	/* ignore SAME_VA */
-	*flags &= ~BASE_MEM_SAME_VA;
-
-	if (*flags & BASE_MEM_IMPORT_SHARED)
-		shared_zone = true;
-
-#ifdef CONFIG_64BIT
-	if (!kbase_ctx_flag(kctx, KCTX_COMPAT)) {
-		/*
-		 * 64-bit tasks require us to reserve VA on the CPU that we use
-		 * on the GPU.
-		 */
-		shared_zone = true;
-	}
-#endif
-
-	if (shared_zone) {
-		*flags |= BASE_MEM_NEED_MMAP;
-		reg = kbase_alloc_free_region(kctx, 0, *va_pages, KBASE_REG_ZONE_SAME_VA);
-	} else {
-		reg = kbase_alloc_free_region(kctx, 0, *va_pages, KBASE_REG_ZONE_CUSTOM_VA);
-	}
-
-	if (!reg)
-		goto no_region;
-
-	reg->gpu_alloc = kbase_alloc_create(*va_pages, KBASE_MEM_TYPE_IMPORTED_UMM);
-	if (IS_ERR_OR_NULL(reg->gpu_alloc))
-		goto no_alloc_obj;
-
-	reg->cpu_alloc = kbase_mem_phy_alloc_get(reg->gpu_alloc);
-
-	/* No pages to map yet */
-	reg->gpu_alloc->nents = 0;
-
-	if (kbase_update_region_flags(kctx, reg, *flags) != 0)
-		goto invalid_flags;
-
-	reg->flags &= ~KBASE_REG_FREE;
-	reg->flags |= KBASE_REG_GPU_NX;	/* UMM is always No eXecute */
-	reg->flags &= ~KBASE_REG_GROWABLE;	/* UMM cannot be grown */
-	reg->flags |= KBASE_REG_GPU_CACHED;
-
-	if (*flags & BASE_MEM_SECURE)
-		reg->flags |= KBASE_REG_SECURE;
-
-	if (padding)
-		reg->flags |= KBASE_REG_IMPORT_PAD;
-
-	reg->gpu_alloc->type = KBASE_MEM_TYPE_IMPORTED_UMM;
-	reg->gpu_alloc->imported.umm.sgt = NULL;
-	reg->gpu_alloc->imported.umm.dma_buf = dma_buf;
-	reg->gpu_alloc->imported.umm.dma_attachment = dma_attachment;
-	reg->gpu_alloc->imported.umm.current_mapping_usage_count = 0;
-	reg->extent = 0;
-
-	return reg;
-
-invalid_flags:
-	kbase_mem_phy_alloc_put(reg->gpu_alloc);
-no_alloc_obj:
-	kfree(reg);
-no_region:
-bad_size:
-	dma_buf_detach(dma_buf, dma_attachment);
-no_attachment:
-	dma_buf_put(dma_buf);
-no_buf:
-	return NULL;
-}
-#endif  /* CONFIG_DMA_SHARED_BUFFER */
-
-static u32 kbase_get_cache_line_alignment(struct kbase_context *kctx)
-{
-	u32 cpu_cache_line_size = cache_line_size();
-	u32 gpu_cache_line_size =
-		(1UL << kctx->kbdev->gpu_props.props.l2_props.log2_line_size);
-
-	return ((cpu_cache_line_size > gpu_cache_line_size) ?
-				cpu_cache_line_size :
-				gpu_cache_line_size);
-}
-
-static struct kbase_va_region *kbase_mem_from_user_buffer(
-		struct kbase_context *kctx, unsigned long address,
-		unsigned long size, u64 *va_pages, u64 *flags)
-{
-	long i;
-	struct kbase_va_region *reg;
-	long faulted_pages;
-	int zone = KBASE_REG_ZONE_CUSTOM_VA;
-	bool shared_zone = false;
-	u32 cache_line_alignment = kbase_get_cache_line_alignment(kctx);
-	struct kbase_alloc_import_user_buf *user_buf;
-	struct page **pages = NULL;
-
-	if ((address & (cache_line_alignment - 1)) != 0 ||
-			(size & (cache_line_alignment - 1)) != 0) {
-		/* Coherency must be enabled to handle partial cache lines */
-		if (*flags & (BASE_MEM_COHERENT_SYSTEM |
-			BASE_MEM_COHERENT_SYSTEM_REQUIRED)) {
-			/* Force coherent system required flag, import will
-			 * then fail if coherency isn't available
-			 */
-			*flags |= BASE_MEM_COHERENT_SYSTEM_REQUIRED;
-		} else {
-			dev_warn(kctx->kbdev->dev,
-					"User buffer is not cache line aligned and no coherency enabled\n");
-			goto bad_size;
-		}
-	}
-
-	*va_pages = (PAGE_ALIGN(address + size) >> PAGE_SHIFT) -
-		PFN_DOWN(address);
-	if (!*va_pages)
-		goto bad_size;
-
-	if (*va_pages > (UINT64_MAX / PAGE_SIZE))
-		/* 64-bit address range is the max */
-		goto bad_size;
-
-	/* SAME_VA generally not supported with imported memory (no known use cases) */
-	*flags &= ~BASE_MEM_SAME_VA;
-
-	if (*flags & BASE_MEM_IMPORT_SHARED)
-		shared_zone = true;
-
-#ifdef CONFIG_64BIT
-	if (!kbase_ctx_flag(kctx, KCTX_COMPAT)) {
-		/*
-		 * 64-bit tasks require us to reserve VA on the CPU that we use
-		 * on the GPU.
-		 */
-		shared_zone = true;
-	}
-#endif
-
-	if (shared_zone) {
-		*flags |= BASE_MEM_NEED_MMAP;
-		zone = KBASE_REG_ZONE_SAME_VA;
-	}
-
-	reg = kbase_alloc_free_region(kctx, 0, *va_pages, zone);
-
-	if (!reg)
-		goto no_region;
-
-	reg->gpu_alloc = kbase_alloc_create(*va_pages,
-			KBASE_MEM_TYPE_IMPORTED_USER_BUF);
-	if (IS_ERR_OR_NULL(reg->gpu_alloc))
-		goto no_alloc_obj;
-
-	reg->cpu_alloc = kbase_mem_phy_alloc_get(reg->gpu_alloc);
-
-	if (kbase_update_region_flags(kctx, reg, *flags) != 0)
-		goto invalid_flags;
-
-	reg->flags &= ~KBASE_REG_FREE;
-	reg->flags |= KBASE_REG_GPU_NX; /* User-buffers are always No eXecute */
-	reg->flags &= ~KBASE_REG_GROWABLE; /* Cannot be grown */
-
-	user_buf = &reg->gpu_alloc->imported.user_buf;
-
-	user_buf->size = size;
-	user_buf->address = address;
-	user_buf->nr_pages = *va_pages;
-	user_buf->mm = current->mm;
-	user_buf->pages = kmalloc_array(*va_pages, sizeof(struct page *),
-			GFP_KERNEL);
-
-	if (!user_buf->pages)
-		goto no_page_array;
-
-	/* If the region is coherent with the CPU then the memory is imported
-	 * and mapped onto the GPU immediately.
-	 * Otherwise get_user_pages is called as a sanity check, but with
-	 * NULL as the pages argument which will fault the pages, but not
-	 * pin them. The memory will then be pinned only around the jobs that
-	 * specify the region as an external resource.
-	 */
-	if (reg->flags & KBASE_REG_SHARE_BOTH) {
-		pages = user_buf->pages;
-		*flags |= KBASE_MEM_IMPORT_HAVE_PAGES;
-	}
-
-	down_read(&current->mm->mmap_sem);
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0)
-	faulted_pages = get_user_pages(current, current->mm, address, *va_pages,
-			reg->flags & KBASE_REG_GPU_WR, 0, pages, NULL);
-#elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
-	faulted_pages = get_user_pages(address, *va_pages,
-			reg->flags & KBASE_REG_GPU_WR, 0, pages, NULL);
-#else
-	faulted_pages = get_user_pages(address, *va_pages,
-			reg->flags & KBASE_REG_GPU_WR ? FOLL_WRITE : 0,
-			pages, NULL);
-#endif
-
-	up_read(&current->mm->mmap_sem);
-
-	if (faulted_pages != *va_pages)
-		goto fault_mismatch;
-
-	atomic_inc(&current->mm->mm_count);
-
-	reg->gpu_alloc->nents = 0;
-	reg->extent = 0;
-
-	if (pages) {
-		struct device *dev = kctx->kbdev->dev;
-		unsigned long local_size = user_buf->size;
-		unsigned long offset = user_buf->address & ~PAGE_MASK;
-		struct tagged_addr *pa = kbase_get_gpu_phy_pages(reg);
-
-		/* Top bit signifies that this was pinned on import */
-		user_buf->current_mapping_usage_count |= PINNED_ON_IMPORT;
-
-		for (i = 0; i < faulted_pages; i++) {
-			dma_addr_t dma_addr;
-			unsigned long min;
-
-			min = MIN(PAGE_SIZE - offset, local_size);
-			dma_addr = dma_map_page(dev, pages[i],
-					offset, min,
-					DMA_BIDIRECTIONAL);
-			if (dma_mapping_error(dev, dma_addr))
-				goto unwind_dma_map;
-
-			user_buf->dma_addrs[i] = dma_addr;
-			pa[i] = as_tagged(page_to_phys(pages[i]));
-
-			local_size -= min;
-			offset = 0;
-		}
-
-		reg->gpu_alloc->nents = faulted_pages;
-	}
-
-	return reg;
-
-unwind_dma_map:
-	while (i--) {
-		dma_unmap_page(kctx->kbdev->dev,
-				user_buf->dma_addrs[i],
-				PAGE_SIZE, DMA_BIDIRECTIONAL);
-	}
-fault_mismatch:
-	if (pages) {
-		for (i = 0; i < faulted_pages; i++)
-			put_page(pages[i]);
-	}
-	kfree(user_buf->pages);
-no_page_array:
-invalid_flags:
-	kbase_mem_phy_alloc_put(reg->cpu_alloc);
-	kbase_mem_phy_alloc_put(reg->gpu_alloc);
-no_alloc_obj:
-	kfree(reg);
-no_region:
-bad_size:
-	return NULL;
-
-}
-
-
-u64 kbase_mem_alias(struct kbase_context *kctx, u64 *flags, u64 stride,
-		    u64 nents, struct base_mem_aliasing_info *ai,
-		    u64 *num_pages)
-{
-	struct kbase_va_region *reg;
-	u64 gpu_va;
-	size_t i;
-	bool coherent;
-
-	KBASE_DEBUG_ASSERT(kctx);
-	KBASE_DEBUG_ASSERT(flags);
-	KBASE_DEBUG_ASSERT(ai);
-	KBASE_DEBUG_ASSERT(num_pages);
-
-	/* mask to only allowed flags */
-	*flags &= (BASE_MEM_PROT_GPU_RD | BASE_MEM_PROT_GPU_WR |
-		   BASE_MEM_COHERENT_SYSTEM | BASE_MEM_COHERENT_LOCAL |
-		   BASE_MEM_COHERENT_SYSTEM_REQUIRED);
-
-	if (!(*flags & (BASE_MEM_PROT_GPU_RD | BASE_MEM_PROT_GPU_WR))) {
-		dev_warn(kctx->kbdev->dev,
-				"kbase_mem_alias called with bad flags (%llx)",
-				(unsigned long long)*flags);
-		goto bad_flags;
-	}
-	coherent = (*flags & BASE_MEM_COHERENT_SYSTEM) != 0 ||
-			(*flags & BASE_MEM_COHERENT_SYSTEM_REQUIRED) != 0;
-
-	if (!stride)
-		goto bad_stride;
-
-	if (!nents)
-		goto bad_nents;
-
-	if ((nents * stride) > (U64_MAX / PAGE_SIZE))
-		/* 64-bit address range is the max */
-		goto bad_size;
-
-	/* calculate the number of pages this alias will cover */
-	*num_pages = nents * stride;
-
-#ifdef CONFIG_64BIT
-	if (!kbase_ctx_flag(kctx, KCTX_COMPAT)) {
-		/* 64-bit tasks must MMAP anyway, but not expose this address to
-		 * clients */
-		*flags |= BASE_MEM_NEED_MMAP;
-		reg = kbase_alloc_free_region(kctx, 0, *num_pages,
-					      KBASE_REG_ZONE_SAME_VA);
-	} else {
-#else
-	if (1) {
-#endif
-		reg = kbase_alloc_free_region(kctx, 0, *num_pages,
-					      KBASE_REG_ZONE_CUSTOM_VA);
-	}
-
-	if (!reg)
-		goto no_reg;
-
-	/* zero-sized page array, as we don't need one/can support one */
-	reg->gpu_alloc = kbase_alloc_create(0, KBASE_MEM_TYPE_ALIAS);
-	if (IS_ERR_OR_NULL(reg->gpu_alloc))
-		goto no_alloc_obj;
-
-	reg->cpu_alloc = kbase_mem_phy_alloc_get(reg->gpu_alloc);
-
-	if (kbase_update_region_flags(kctx, reg, *flags) != 0)
-		goto invalid_flags;
-
-	reg->gpu_alloc->imported.alias.nents = nents;
-	reg->gpu_alloc->imported.alias.stride = stride;
-	reg->gpu_alloc->imported.alias.aliased = vzalloc(sizeof(*reg->gpu_alloc->imported.alias.aliased) * nents);
-	if (!reg->gpu_alloc->imported.alias.aliased)
-		goto no_aliased_array;
-
-	kbase_gpu_vm_lock(kctx);
-
-	/* validate and add src handles */
-	for (i = 0; i < nents; i++) {
-		if (ai[i].handle.basep.handle < BASE_MEM_FIRST_FREE_ADDRESS) {
-			if (ai[i].handle.basep.handle !=
-			    BASEP_MEM_WRITE_ALLOC_PAGES_HANDLE)
-				goto bad_handle; /* unsupported magic handle */
-			if (!ai[i].length)
-				goto bad_handle; /* must be > 0 */
-			if (ai[i].length > stride)
-				goto bad_handle; /* can't be larger than the
-						    stride */
-			reg->gpu_alloc->imported.alias.aliased[i].length = ai[i].length;
-		} else {
-			struct kbase_va_region *aliasing_reg;
-			struct kbase_mem_phy_alloc *alloc;
-
-			aliasing_reg = kbase_region_tracker_find_region_base_address(
-				kctx,
-				(ai[i].handle.basep.handle >> PAGE_SHIFT) << PAGE_SHIFT);
-
-			/* validate found region */
-			if (!aliasing_reg)
-				goto bad_handle; /* Not found */
-			if (aliasing_reg->flags & KBASE_REG_FREE)
-				goto bad_handle; /* Free region */
-			if (aliasing_reg->flags & KBASE_REG_DONT_NEED)
-				goto bad_handle; /* Ephemeral region */
-			if (!aliasing_reg->gpu_alloc)
-				goto bad_handle; /* No alloc */
-			if (aliasing_reg->gpu_alloc->type != KBASE_MEM_TYPE_NATIVE)
-				goto bad_handle; /* Not a native alloc */
-			if (coherent != ((aliasing_reg->flags & KBASE_REG_SHARE_BOTH) != 0))
-				goto bad_handle;
-				/* Non-coherent memory cannot alias
-				   coherent memory, and vice versa.*/
-
-			/* check size against stride */
-			if (!ai[i].length)
-				goto bad_handle; /* must be > 0 */
-			if (ai[i].length > stride)
-				goto bad_handle; /* can't be larger than the
-						    stride */
-
-			alloc = aliasing_reg->gpu_alloc;
-
-			/* check against the alloc's size */
-			if (ai[i].offset > alloc->nents)
-				goto bad_handle; /* beyond end */
-			if (ai[i].offset + ai[i].length > alloc->nents)
-				goto bad_handle; /* beyond end */
-
-			reg->gpu_alloc->imported.alias.aliased[i].alloc = kbase_mem_phy_alloc_get(alloc);
-			reg->gpu_alloc->imported.alias.aliased[i].length = ai[i].length;
-			reg->gpu_alloc->imported.alias.aliased[i].offset = ai[i].offset;
-		}
-	}
-
-#ifdef CONFIG_64BIT
-	if (!kbase_ctx_flag(kctx, KCTX_COMPAT)) {
-		/* Bind to a cookie */
-		if (!kctx->cookies) {
-			dev_err(kctx->kbdev->dev, "No cookies available for allocation!");
-			goto no_cookie;
-		}
-		/* return a cookie */
-		gpu_va = __ffs(kctx->cookies);
-		kctx->cookies &= ~(1UL << gpu_va);
-		BUG_ON(kctx->pending_regions[gpu_va]);
-		kctx->pending_regions[gpu_va] = reg;
-
-		/* relocate to correct base */
-		gpu_va += PFN_DOWN(BASE_MEM_COOKIE_BASE);
-		gpu_va <<= PAGE_SHIFT;
-	} else /* we control the VA */ {
-#else
-	if (1) {
-#endif
-		if (kbase_gpu_mmap(kctx, reg, 0, *num_pages, 1) != 0) {
-			dev_warn(kctx->kbdev->dev, "Failed to map memory on GPU");
-			goto no_mmap;
-		}
-		/* return real GPU VA */
-		gpu_va = reg->start_pfn << PAGE_SHIFT;
-	}
-
-	reg->flags &= ~KBASE_REG_FREE;
-	reg->flags &= ~KBASE_REG_GROWABLE;
-
-	kbase_gpu_vm_unlock(kctx);
-
-	return gpu_va;
-
-#ifdef CONFIG_64BIT
-no_cookie:
-#endif
-no_mmap:
-bad_handle:
-	kbase_gpu_vm_unlock(kctx);
-no_aliased_array:
-invalid_flags:
-	kbase_mem_phy_alloc_put(reg->cpu_alloc);
-	kbase_mem_phy_alloc_put(reg->gpu_alloc);
-no_alloc_obj:
-	kfree(reg);
-no_reg:
-bad_size:
-bad_nents:
-bad_stride:
-bad_flags:
-	return 0;
-}
-
-int kbase_mem_import(struct kbase_context *kctx, enum base_mem_import_type type,
-		void __user *phandle, u32 padding, u64 *gpu_va, u64 *va_pages,
-		u64 *flags)
-{
-	struct kbase_va_region *reg;
-
-	KBASE_DEBUG_ASSERT(kctx);
-	KBASE_DEBUG_ASSERT(gpu_va);
-	KBASE_DEBUG_ASSERT(va_pages);
-	KBASE_DEBUG_ASSERT(flags);
-
-#ifdef CONFIG_64BIT
-	if (!kbase_ctx_flag(kctx, KCTX_COMPAT))
-		*flags |= BASE_MEM_SAME_VA;
-#endif
-
-	if (!kbase_check_import_flags(*flags)) {
-		dev_warn(kctx->kbdev->dev,
-				"kbase_mem_import called with bad flags (%llx)",
-				(unsigned long long)*flags);
-		goto bad_flags;
-	}
-
-	if ((*flags & BASE_MEM_COHERENT_SYSTEM_REQUIRED) != 0 &&
-			!kbase_device_is_cpu_coherent(kctx->kbdev)) {
-		dev_warn(kctx->kbdev->dev,
-				"kbase_mem_import call required coherent mem when unavailable");
-		goto bad_flags;
-	}
-	if ((*flags & BASE_MEM_COHERENT_SYSTEM) != 0 &&
-			!kbase_device_is_cpu_coherent(kctx->kbdev)) {
-		/* Remove COHERENT_SYSTEM flag if coherent mem is unavailable */
-		*flags &= ~BASE_MEM_COHERENT_SYSTEM;
-	}
-
-	if ((padding != 0) && (type != BASE_MEM_IMPORT_TYPE_UMM)) {
-		dev_warn(kctx->kbdev->dev,
-				"padding is only supported for UMM");
-		goto bad_flags;
-	}
-
-	switch (type) {
-#ifdef CONFIG_UMP
-	case BASE_MEM_IMPORT_TYPE_UMP: {
-		ump_secure_id id;
-
-		if (get_user(id, (ump_secure_id __user *)phandle))
-			reg = NULL;
-		else
-			reg = kbase_mem_from_ump(kctx, id, va_pages, flags);
-	}
-	break;
-#endif /* CONFIG_UMP */
-#ifdef CONFIG_DMA_SHARED_BUFFER
-	case BASE_MEM_IMPORT_TYPE_UMM: {
-		int fd;
-
-		if (get_user(fd, (int __user *)phandle))
-			reg = NULL;
-		else
-			reg = kbase_mem_from_umm(kctx, fd, va_pages, flags,
-					padding);
-	}
-	break;
-#endif /* CONFIG_DMA_SHARED_BUFFER */
-	case BASE_MEM_IMPORT_TYPE_USER_BUFFER: {
-		struct base_mem_import_user_buffer user_buffer;
-		void __user *uptr;
-
-		if (copy_from_user(&user_buffer, phandle,
-				sizeof(user_buffer))) {
-			reg = NULL;
-		} else {
-#ifdef CONFIG_COMPAT
-			if (kbase_ctx_flag(kctx, KCTX_COMPAT))
-				uptr = compat_ptr(user_buffer.ptr);
-			else
-#endif
-				uptr = u64_to_user_ptr(user_buffer.ptr);
-
-			reg = kbase_mem_from_user_buffer(kctx,
-					(unsigned long)uptr, user_buffer.length,
-					va_pages, flags);
-		}
-		break;
-	}
-	default: {
-		reg = NULL;
-		break;
-	}
-	}
-
-	if (!reg)
-		goto no_reg;
-
-	kbase_gpu_vm_lock(kctx);
-
-	/* mmap needed to setup VA? */
-	if (*flags & (BASE_MEM_SAME_VA | BASE_MEM_NEED_MMAP)) {
-		/* Bind to a cookie */
-		if (!kctx->cookies)
-			goto no_cookie;
-		/* return a cookie */
-		*gpu_va = __ffs(kctx->cookies);
-		kctx->cookies &= ~(1UL << *gpu_va);
-		BUG_ON(kctx->pending_regions[*gpu_va]);
-		kctx->pending_regions[*gpu_va] = reg;
-
-		/* relocate to correct base */
-		*gpu_va += PFN_DOWN(BASE_MEM_COOKIE_BASE);
-		*gpu_va <<= PAGE_SHIFT;
-
-	} else if (*flags & KBASE_MEM_IMPORT_HAVE_PAGES)  {
-		/* we control the VA, mmap now to the GPU */
-		if (kbase_gpu_mmap(kctx, reg, 0, *va_pages, 1) != 0)
-			goto no_gpu_va;
-		/* return real GPU VA */
-		*gpu_va = reg->start_pfn << PAGE_SHIFT;
-	} else {
-		/* we control the VA, but nothing to mmap yet */
-		if (kbase_add_va_region(kctx, reg, 0, *va_pages, 1) != 0)
-			goto no_gpu_va;
-		/* return real GPU VA */
-		*gpu_va = reg->start_pfn << PAGE_SHIFT;
-	}
-
-	/* clear out private flags */
-	*flags &= ((1UL << BASE_MEM_FLAGS_NR_BITS) - 1);
-
-	kbase_gpu_vm_unlock(kctx);
-
-	return 0;
-
-no_gpu_va:
-no_cookie:
-	kbase_gpu_vm_unlock(kctx);
-	kbase_mem_phy_alloc_put(reg->cpu_alloc);
-	kbase_mem_phy_alloc_put(reg->gpu_alloc);
-	kfree(reg);
-no_reg:
-bad_flags:
-	*gpu_va = 0;
-	*va_pages = 0;
-	*flags = 0;
-	return -ENOMEM;
-}
-
-int kbase_mem_grow_gpu_mapping(struct kbase_context *kctx,
-		struct kbase_va_region *reg,
-		u64 new_pages, u64 old_pages)
-{
-	struct tagged_addr *phy_pages;
-	u64 delta = new_pages - old_pages;
-	int ret = 0;
-
-	lockdep_assert_held(&kctx->reg_lock);
-
-	/* Map the new pages into the GPU */
-	phy_pages = kbase_get_gpu_phy_pages(reg);
-	ret = kbase_mmu_insert_pages(kctx, reg->start_pfn + old_pages,
-			phy_pages + old_pages, delta, reg->flags);
-
-	return ret;
-}
-
-static void kbase_mem_shrink_cpu_mapping(struct kbase_context *kctx,
-		struct kbase_va_region *reg,
-		u64 new_pages, u64 old_pages)
-{
-	u64 gpu_va_start = reg->start_pfn;
-
-	if (new_pages == old_pages)
-		/* Nothing to do */
-		return;
-
-	unmap_mapping_range(kctx->filp->f_inode->i_mapping,
-			(gpu_va_start + new_pages)<<PAGE_SHIFT,
-			(old_pages - new_pages)<<PAGE_SHIFT, 1);
-}
-
-static int kbase_mem_shrink_gpu_mapping(struct kbase_context *kctx,
-		struct kbase_va_region *reg,
-		u64 new_pages, u64 old_pages)
-{
-	u64 delta = old_pages - new_pages;
-	int ret = 0;
-
-	ret = kbase_mmu_teardown_pages(kctx,
-			reg->start_pfn + new_pages, delta);
-
-	return ret;
-}
-
-int kbase_mem_commit(struct kbase_context *kctx, u64 gpu_addr, u64 new_pages)
-{
-	u64 old_pages;
-	u64 delta;
-	int res = -EINVAL;
-	struct kbase_va_region *reg;
-	bool read_locked = false;
-
-	KBASE_DEBUG_ASSERT(kctx);
-	KBASE_DEBUG_ASSERT(gpu_addr != 0);
-
-	if (gpu_addr & ~PAGE_MASK) {
-		dev_warn(kctx->kbdev->dev, "kbase:mem_commit: gpu_addr: passed parameter is invalid");
-		return -EINVAL;
-	}
-
-	down_write(&current->mm->mmap_sem);
-	kbase_gpu_vm_lock(kctx);
-
-	/* Validate the region */
-	reg = kbase_region_tracker_find_region_base_address(kctx, gpu_addr);
-	if (!reg || (reg->flags & KBASE_REG_FREE))
-		goto out_unlock;
-
-	KBASE_DEBUG_ASSERT(reg->cpu_alloc);
-	KBASE_DEBUG_ASSERT(reg->gpu_alloc);
-
-	if (reg->gpu_alloc->type != KBASE_MEM_TYPE_NATIVE)
-		goto out_unlock;
-
-	if (0 == (reg->flags & KBASE_REG_GROWABLE))
-		goto out_unlock;
-
-	/* Would overflow the VA region */
-	if (new_pages > reg->nr_pages)
-		goto out_unlock;
-
-	/* can't be mapped more than once on the GPU */
-	if (atomic_read(&reg->gpu_alloc->gpu_mappings) > 1)
-		goto out_unlock;
-	/* can't grow regions which are ephemeral */
-	if (reg->flags & KBASE_REG_DONT_NEED)
-		goto out_unlock;
-
-	if (new_pages == reg->gpu_alloc->nents) {
-		/* no change */
-		res = 0;
-		goto out_unlock;
-	}
-
-	old_pages = kbase_reg_current_backed_size(reg);
-	if (new_pages > old_pages) {
-		delta = new_pages - old_pages;
-
-		/*
-		 * No update to the mm so downgrade the writer lock to a read
-		 * lock so other readers aren't blocked after this point.
-		 */
-		downgrade_write(&current->mm->mmap_sem);
-		read_locked = true;
-
-		/* Allocate some more pages */
-		if (kbase_alloc_phy_pages_helper(reg->cpu_alloc, delta) != 0) {
-			res = -ENOMEM;
-			goto out_unlock;
-		}
-		if (reg->cpu_alloc != reg->gpu_alloc) {
-			if (kbase_alloc_phy_pages_helper(
-					reg->gpu_alloc, delta) != 0) {
-				res = -ENOMEM;
-				kbase_free_phy_pages_helper(reg->cpu_alloc,
-						delta);
-				goto out_unlock;
-			}
-		}
-
-		/* No update required for CPU mappings, that's done on fault. */
-
-		/* Update GPU mapping. */
-		res = kbase_mem_grow_gpu_mapping(kctx, reg,
-				new_pages, old_pages);
-
-		/* On error free the new pages */
-		if (res) {
-			kbase_free_phy_pages_helper(reg->cpu_alloc, delta);
-			if (reg->cpu_alloc != reg->gpu_alloc)
-				kbase_free_phy_pages_helper(reg->gpu_alloc,
-						delta);
-			res = -ENOMEM;
-			goto out_unlock;
-		}
-	} else {
-		delta = old_pages - new_pages;
-
-		/* Update all CPU mapping(s) */
-		kbase_mem_shrink_cpu_mapping(kctx, reg,
-				new_pages, old_pages);
-
-		/* Update the GPU mapping */
-		res = kbase_mem_shrink_gpu_mapping(kctx, reg,
-				new_pages, old_pages);
-		if (res) {
-			res = -ENOMEM;
-			goto out_unlock;
-		}
-
-		kbase_free_phy_pages_helper(reg->cpu_alloc, delta);
-		if (reg->cpu_alloc != reg->gpu_alloc)
-			kbase_free_phy_pages_helper(reg->gpu_alloc, delta);
-	}
-
-out_unlock:
-	kbase_gpu_vm_unlock(kctx);
-	if (read_locked)
-		up_read(&current->mm->mmap_sem);
-	else
-		up_write(&current->mm->mmap_sem);
-
-	return res;
-}
-
-static void kbase_cpu_vm_open(struct vm_area_struct *vma)
-{
-	struct kbase_cpu_mapping *map = vma->vm_private_data;
-
-	KBASE_DEBUG_ASSERT(map);
-	KBASE_DEBUG_ASSERT(map->count > 0);
-	/* non-atomic as we're under Linux' mm lock */
-	map->count++;
-}
-
-static void kbase_cpu_vm_close(struct vm_area_struct *vma)
-{
-	struct kbase_cpu_mapping *map = vma->vm_private_data;
-
-	KBASE_DEBUG_ASSERT(map);
-	KBASE_DEBUG_ASSERT(map->count > 0);
-
-	/* non-atomic as we're under Linux' mm lock */
-	if (--map->count)
-		return;
-
-	KBASE_DEBUG_ASSERT(map->kctx);
-	KBASE_DEBUG_ASSERT(map->alloc);
-
-	kbase_gpu_vm_lock(map->kctx);
-
-	if (map->free_on_close) {
-		KBASE_DEBUG_ASSERT((map->region->flags & KBASE_REG_ZONE_MASK) ==
-				KBASE_REG_ZONE_SAME_VA);
-		/* Avoid freeing memory on the process death which results in
-		 * GPU Page Fault. Memory will be freed in kbase_destroy_context
-		 */
-		if (!(current->flags & PF_EXITING))
-			kbase_mem_free_region(map->kctx, map->region);
-	}
-
-	list_del(&map->mappings_list);
-
-	kbase_gpu_vm_unlock(map->kctx);
-
-	kbase_mem_phy_alloc_put(map->alloc);
-	kfree(map);
-}
-
-KBASE_EXPORT_TEST_API(kbase_cpu_vm_close);
-
-
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0))
-static int kbase_cpu_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
-{
-#else
-static int kbase_cpu_vm_fault(struct vm_fault *vmf)
-{
-	struct vm_area_struct *vma = vmf->vma;
-#endif
-	struct kbase_cpu_mapping *map = vma->vm_private_data;
-	pgoff_t rel_pgoff;
-	size_t i;
-	pgoff_t addr;
-
-	KBASE_DEBUG_ASSERT(map);
-	KBASE_DEBUG_ASSERT(map->count > 0);
-	KBASE_DEBUG_ASSERT(map->kctx);
-	KBASE_DEBUG_ASSERT(map->alloc);
-
-	rel_pgoff = vmf->pgoff - map->region->start_pfn;
-
-	kbase_gpu_vm_lock(map->kctx);
-	if (rel_pgoff >= map->alloc->nents)
-		goto locked_bad_fault;
-
-	/* Fault on access to DONT_NEED regions */
-	if (map->alloc->reg && (map->alloc->reg->flags & KBASE_REG_DONT_NEED))
-		goto locked_bad_fault;
-
-	/* insert all valid pages from the fault location */
-	i = rel_pgoff;
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-	addr = (pgoff_t)((uintptr_t)vmf->virtual_address >> PAGE_SHIFT);
-#else
-	addr = (pgoff_t)(vmf->address >> PAGE_SHIFT);
-#endif
-	while (i < map->alloc->nents && (addr < vma->vm_end >> PAGE_SHIFT)) {
-		int ret = vm_insert_pfn(vma, addr << PAGE_SHIFT,
-		    PFN_DOWN(as_phys_addr_t(map->alloc->pages[i])));
-		if (ret < 0 && ret != -EBUSY)
-			goto locked_bad_fault;
-
-		i++; addr++;
-	}
-
-	kbase_gpu_vm_unlock(map->kctx);
-	/* we resolved it, nothing for VM to do */
-	return VM_FAULT_NOPAGE;
-
-locked_bad_fault:
-	kbase_gpu_vm_unlock(map->kctx);
-	return VM_FAULT_SIGBUS;
-}
-
-const struct vm_operations_struct kbase_vm_ops = {
-	.open  = kbase_cpu_vm_open,
-	.close = kbase_cpu_vm_close,
-	.fault = kbase_cpu_vm_fault
-};
-
-static int kbase_cpu_mmap(struct kbase_va_region *reg, struct vm_area_struct *vma, void *kaddr, size_t nr_pages, unsigned long aligned_offset, int free_on_close)
-{
-	struct kbase_cpu_mapping *map;
-	struct tagged_addr *page_array;
-	int err = 0;
-	int i;
-
-	map = kzalloc(sizeof(*map), GFP_KERNEL);
-
-	if (!map) {
-		WARN_ON(1);
-		err = -ENOMEM;
-		goto out;
-	}
-
-	/*
-	 * VM_DONTCOPY - don't make this mapping available in fork'ed processes
-	 * VM_DONTEXPAND - disable mremap on this region
-	 * VM_IO - disables paging
-	 * VM_DONTDUMP - Don't include in core dumps (3.7 only)
-	 * VM_MIXEDMAP - Support mixing struct page*s and raw pfns.
-	 *               This is needed to support using the dedicated and
-	 *               the OS based memory backends together.
-	 */
-	/*
-	 * This will need updating to propagate coherency flags
-	 * See MIDBASE-1057
-	 */
-
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0))
-	vma->vm_flags |= VM_DONTCOPY | VM_DONTDUMP | VM_DONTEXPAND | VM_IO;
-#else
-	vma->vm_flags |= VM_DONTCOPY | VM_DONTEXPAND | VM_RESERVED | VM_IO;
-#endif
-	vma->vm_ops = &kbase_vm_ops;
-	vma->vm_private_data = map;
-
-	page_array = kbase_get_cpu_phy_pages(reg);
-
-	if (!(reg->flags & KBASE_REG_CPU_CACHED) &&
-	    (reg->flags & (KBASE_REG_CPU_WR|KBASE_REG_CPU_RD))) {
-		/* We can't map vmalloc'd memory uncached.
-		 * Other memory will have been returned from
-		 * kbase_mem_pool which would be
-		 * suitable for mapping uncached.
-		 */
-		BUG_ON(kaddr);
-		vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
-	}
-
-	if (!kaddr) {
-		unsigned long addr = vma->vm_start + aligned_offset;
-		u64 start_off = vma->vm_pgoff - reg->start_pfn +
-			(aligned_offset>>PAGE_SHIFT);
-
-		vma->vm_flags |= VM_PFNMAP;
-		for (i = 0; i < nr_pages; i++) {
-			phys_addr_t phys;
-
-			phys = as_phys_addr_t(page_array[i + start_off]);
-			err = vm_insert_pfn(vma, addr, PFN_DOWN(phys));
-			if (WARN_ON(err))
-				break;
-
-			addr += PAGE_SIZE;
-		}
-	} else {
-		WARN_ON(aligned_offset);
-		/* MIXEDMAP so we can vfree the kaddr early and not track it after map time */
-		vma->vm_flags |= VM_MIXEDMAP;
-		/* vmalloc remaping is easy... */
-		err = remap_vmalloc_range(vma, kaddr, 0);
-		WARN_ON(err);
-	}
-
-	if (err) {
-		kfree(map);
-		goto out;
-	}
-
-	map->region = reg;
-	map->free_on_close = free_on_close;
-	map->kctx = reg->kctx;
-	map->alloc = kbase_mem_phy_alloc_get(reg->cpu_alloc);
-	map->count = 1; /* start with one ref */
-
-	if (reg->flags & KBASE_REG_CPU_CACHED)
-		map->alloc->properties |= KBASE_MEM_PHY_ALLOC_ACCESSED_CACHED;
-
-	list_add(&map->mappings_list, &map->alloc->mappings);
-
- out:
-	return err;
-}
-
-static int kbase_trace_buffer_mmap(struct kbase_context *kctx, struct vm_area_struct *vma, struct kbase_va_region **const reg, void **const kaddr)
-{
-	struct kbase_va_region *new_reg;
-	u32 nr_pages;
-	size_t size;
-	int err = 0;
-	u32 *tb;
-	int owns_tb = 1;
-
-	dev_dbg(kctx->kbdev->dev, "in %s\n", __func__);
-	size = (vma->vm_end - vma->vm_start);
-	nr_pages = size >> PAGE_SHIFT;
-
-	if (!kctx->jctx.tb) {
-		KBASE_DEBUG_ASSERT(0 != size);
-		tb = vmalloc_user(size);
-
-		if (NULL == tb) {
-			err = -ENOMEM;
-			goto out;
-		}
-
-		err = kbase_device_trace_buffer_install(kctx, tb, size);
-		if (err) {
-			vfree(tb);
-			goto out;
-		}
-	} else {
-		err = -EINVAL;
-		goto out;
-	}
-
-	*kaddr = kctx->jctx.tb;
-
-	new_reg = kbase_alloc_free_region(kctx, 0, nr_pages, KBASE_REG_ZONE_SAME_VA);
-	if (!new_reg) {
-		err = -ENOMEM;
-		WARN_ON(1);
-		goto out_no_region;
-	}
-
-	new_reg->cpu_alloc = kbase_alloc_create(0, KBASE_MEM_TYPE_TB);
-	if (IS_ERR_OR_NULL(new_reg->cpu_alloc)) {
-		err = -ENOMEM;
-		new_reg->cpu_alloc = NULL;
-		WARN_ON(1);
-		goto out_no_alloc;
-	}
-
-	new_reg->gpu_alloc = kbase_mem_phy_alloc_get(new_reg->cpu_alloc);
-
-	new_reg->cpu_alloc->imported.kctx = kctx;
-	new_reg->flags &= ~KBASE_REG_FREE;
-	new_reg->flags |= KBASE_REG_CPU_CACHED;
-
-	/* alloc now owns the tb */
-	owns_tb = 0;
-
-	if (kbase_add_va_region(kctx, new_reg, vma->vm_start, nr_pages, 1) != 0) {
-		err = -ENOMEM;
-		WARN_ON(1);
-		goto out_no_va_region;
-	}
-
-	*reg = new_reg;
-
-	/* map read only, noexec */
-	vma->vm_flags &= ~(VM_WRITE | VM_MAYWRITE | VM_EXEC | VM_MAYEXEC);
-	/* the rest of the flags is added by the cpu_mmap handler */
-
-	dev_dbg(kctx->kbdev->dev, "%s done\n", __func__);
-	return 0;
-
-out_no_va_region:
-out_no_alloc:
-	kbase_free_alloced_region(new_reg);
-out_no_region:
-	if (owns_tb) {
-		kbase_device_trace_buffer_uninstall(kctx);
-		vfree(tb);
-	}
-out:
-	return err;
-}
-
-static int kbase_mmu_dump_mmap(struct kbase_context *kctx, struct vm_area_struct *vma, struct kbase_va_region **const reg, void **const kmap_addr)
-{
-	struct kbase_va_region *new_reg;
-	void *kaddr;
-	u32 nr_pages;
-	size_t size;
-	int err = 0;
-
-	dev_dbg(kctx->kbdev->dev, "in kbase_mmu_dump_mmap\n");
-	size = (vma->vm_end - vma->vm_start);
-	nr_pages = size >> PAGE_SHIFT;
-
-	kaddr = kbase_mmu_dump(kctx, nr_pages);
-
-	if (!kaddr) {
-		err = -ENOMEM;
-		goto out;
-	}
-
-	new_reg = kbase_alloc_free_region(kctx, 0, nr_pages, KBASE_REG_ZONE_SAME_VA);
-	if (!new_reg) {
-		err = -ENOMEM;
-		WARN_ON(1);
-		goto out;
-	}
-
-	new_reg->cpu_alloc = kbase_alloc_create(0, KBASE_MEM_TYPE_RAW);
-	if (IS_ERR_OR_NULL(new_reg->cpu_alloc)) {
-		err = -ENOMEM;
-		new_reg->cpu_alloc = NULL;
-		WARN_ON(1);
-		goto out_no_alloc;
-	}
-
-	new_reg->gpu_alloc = kbase_mem_phy_alloc_get(new_reg->cpu_alloc);
-
-	new_reg->flags &= ~KBASE_REG_FREE;
-	new_reg->flags |= KBASE_REG_CPU_CACHED;
-	if (kbase_add_va_region(kctx, new_reg, vma->vm_start, nr_pages, 1) != 0) {
-		err = -ENOMEM;
-		WARN_ON(1);
-		goto out_va_region;
-	}
-
-	*kmap_addr = kaddr;
-	*reg = new_reg;
-
-	dev_dbg(kctx->kbdev->dev, "kbase_mmu_dump_mmap done\n");
-	return 0;
-
-out_no_alloc:
-out_va_region:
-	kbase_free_alloced_region(new_reg);
-out:
-	return err;
-}
-
-
-void kbase_os_mem_map_lock(struct kbase_context *kctx)
-{
-	struct mm_struct *mm = current->mm;
-	(void)kctx;
-	down_read(&mm->mmap_sem);
-}
-
-void kbase_os_mem_map_unlock(struct kbase_context *kctx)
-{
-	struct mm_struct *mm = current->mm;
-	(void)kctx;
-	up_read(&mm->mmap_sem);
-}
-
-static int kbasep_reg_mmap(struct kbase_context *kctx,
-			   struct vm_area_struct *vma,
-			   struct kbase_va_region **regm,
-			   size_t *nr_pages, size_t *aligned_offset)
-
-{
-	int cookie = vma->vm_pgoff - PFN_DOWN(BASE_MEM_COOKIE_BASE);
-	struct kbase_va_region *reg;
-	int err = 0;
-
-	*aligned_offset = 0;
-
-	dev_dbg(kctx->kbdev->dev, "in kbasep_reg_mmap\n");
-
-	/* SAME_VA stuff, fetch the right region */
-	reg = kctx->pending_regions[cookie];
-	if (!reg) {
-		err = -ENOMEM;
-		goto out;
-	}
-
-	if ((reg->flags & KBASE_REG_GPU_NX) && (reg->nr_pages != *nr_pages)) {
-		/* incorrect mmap size */
-		/* leave the cookie for a potential later
-		 * mapping, or to be reclaimed later when the
-		 * context is freed */
-		err = -ENOMEM;
-		goto out;
-	}
-
-	if ((vma->vm_flags & VM_READ && !(reg->flags & KBASE_REG_CPU_RD)) ||
-	    (vma->vm_flags & VM_WRITE && !(reg->flags & KBASE_REG_CPU_WR))) {
-		/* VM flags inconsistent with region flags */
-		err = -EPERM;
-		dev_err(kctx->kbdev->dev, "%s:%d inconsistent VM flags\n",
-							__FILE__, __LINE__);
-		goto out;
-	}
-
-	/* adjust down nr_pages to what we have physically */
-	*nr_pages = kbase_reg_current_backed_size(reg);
-
-	if (kbase_gpu_mmap(kctx, reg, vma->vm_start + *aligned_offset,
-						reg->nr_pages, 1) != 0) {
-		dev_err(kctx->kbdev->dev, "%s:%d\n", __FILE__, __LINE__);
-		/* Unable to map in GPU space. */
-		WARN_ON(1);
-		err = -ENOMEM;
-		goto out;
-	}
-	/* no need for the cookie anymore */
-	kctx->pending_regions[cookie] = NULL;
-	kctx->cookies |= (1UL << cookie);
-
-	/*
-	 * Overwrite the offset with the region start_pfn, so we effectively
-	 * map from offset 0 in the region. However subtract the aligned
-	 * offset so that when user space trims the mapping the beginning of
-	 * the trimmed VMA has the correct vm_pgoff;
-	 */
-	vma->vm_pgoff = reg->start_pfn - ((*aligned_offset)>>PAGE_SHIFT);
-out:
-	*regm = reg;
-	dev_dbg(kctx->kbdev->dev, "kbasep_reg_mmap done\n");
-
-	return err;
-}
-
-int kbase_mmap(struct file *file, struct vm_area_struct *vma)
-{
-	struct kbase_context *kctx = file->private_data;
-	struct kbase_va_region *reg = NULL;
-	void *kaddr = NULL;
-	size_t nr_pages = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
-	int err = 0;
-	int free_on_close = 0;
-	struct device *dev = kctx->kbdev->dev;
-	size_t aligned_offset = 0;
-
-	dev_dbg(dev, "kbase_mmap\n");
-
-	/* strip away corresponding VM_MAY% flags to the VM_% flags requested */
-	vma->vm_flags &= ~((vma->vm_flags & (VM_READ | VM_WRITE)) << 4);
-
-	if (0 == nr_pages) {
-		err = -EINVAL;
-		goto out;
-	}
-
-	if (!(vma->vm_flags & VM_SHARED)) {
-		err = -EINVAL;
-		goto out;
-	}
-
-	kbase_gpu_vm_lock(kctx);
-
-	if (vma->vm_pgoff == PFN_DOWN(BASE_MEM_MAP_TRACKING_HANDLE)) {
-		/* The non-mapped tracking helper page */
-		err = kbase_tracking_page_setup(kctx, vma);
-		goto out_unlock;
-	}
-
-	/* if not the MTP, verify that the MTP has been mapped */
-	rcu_read_lock();
-	/* catches both when the special page isn't present or
-	 * when we've forked */
-	if (rcu_dereference(kctx->process_mm) != current->mm) {
-		err = -EINVAL;
-		rcu_read_unlock();
-		goto out_unlock;
-	}
-	rcu_read_unlock();
-
-	switch (vma->vm_pgoff) {
-	case PFN_DOWN(BASEP_MEM_INVALID_HANDLE):
-	case PFN_DOWN(BASEP_MEM_WRITE_ALLOC_PAGES_HANDLE):
-		/* Illegal handle for direct map */
-		err = -EINVAL;
-		goto out_unlock;
-	case PFN_DOWN(BASE_MEM_TRACE_BUFFER_HANDLE):
-		err = kbase_trace_buffer_mmap(kctx, vma, &reg, &kaddr);
-		if (0 != err)
-			goto out_unlock;
-		dev_dbg(dev, "kbase_trace_buffer_mmap ok\n");
-		/* free the region on munmap */
-		free_on_close = 1;
-		break;
-	case PFN_DOWN(BASE_MEM_MMU_DUMP_HANDLE):
-		/* MMU dump */
-		err = kbase_mmu_dump_mmap(kctx, vma, &reg, &kaddr);
-		if (0 != err)
-			goto out_unlock;
-		/* free the region on munmap */
-		free_on_close = 1;
-		break;
-	case PFN_DOWN(BASE_MEM_COOKIE_BASE) ...
-	     PFN_DOWN(BASE_MEM_FIRST_FREE_ADDRESS) - 1: {
-		err = kbasep_reg_mmap(kctx, vma, &reg, &nr_pages,
-							&aligned_offset);
-		if (0 != err)
-			goto out_unlock;
-		/* free the region on munmap */
-		free_on_close = 1;
-		break;
-	}
-	default: {
-		reg = kbase_region_tracker_find_region_enclosing_address(kctx,
-					(u64)vma->vm_pgoff << PAGE_SHIFT);
-
-		if (reg && !(reg->flags & KBASE_REG_FREE)) {
-			/* will this mapping overflow the size of the region? */
-			if (nr_pages > (reg->nr_pages -
-					(vma->vm_pgoff - reg->start_pfn))) {
-				err = -ENOMEM;
-				goto out_unlock;
-			}
-
-			if ((vma->vm_flags & VM_READ &&
-			     !(reg->flags & KBASE_REG_CPU_RD)) ||
-			    (vma->vm_flags & VM_WRITE &&
-			     !(reg->flags & KBASE_REG_CPU_WR))) {
-				/* VM flags inconsistent with region flags */
-				err = -EPERM;
-				dev_err(dev, "%s:%d inconsistent VM flags\n",
-					__FILE__, __LINE__);
-				goto out_unlock;
-			}
-
-#ifdef CONFIG_DMA_SHARED_BUFFER
-			if (KBASE_MEM_TYPE_IMPORTED_UMM ==
-							reg->cpu_alloc->type) {
-				err = dma_buf_mmap(
-					reg->cpu_alloc->imported.umm.dma_buf,
-					vma, vma->vm_pgoff - reg->start_pfn);
-				goto out_unlock;
-			}
-#endif /* CONFIG_DMA_SHARED_BUFFER */
-
-			/* limit what we map to the amount currently backed */
-			if (reg->cpu_alloc->nents < (vma->vm_pgoff - reg->start_pfn + nr_pages)) {
-				if ((vma->vm_pgoff - reg->start_pfn) >= reg->cpu_alloc->nents)
-					nr_pages = 0;
-				else
-					nr_pages = reg->cpu_alloc->nents - (vma->vm_pgoff - reg->start_pfn);
-			}
-		} else {
-			err = -ENOMEM;
-			goto out_unlock;
-		}
-	} /* default */
-	} /* switch */
-
-	err = kbase_cpu_mmap(reg, vma, kaddr, nr_pages, aligned_offset, free_on_close);
-
-	if (vma->vm_pgoff == PFN_DOWN(BASE_MEM_MMU_DUMP_HANDLE)) {
-		/* MMU dump - userspace should now have a reference on
-		 * the pages, so we can now free the kernel mapping */
-		vfree(kaddr);
-	}
-
-out_unlock:
-	kbase_gpu_vm_unlock(kctx);
-out:
-	if (err)
-		dev_err(dev, "mmap failed %d\n", err);
-
-	return err;
-}
-
-KBASE_EXPORT_TEST_API(kbase_mmap);
-
-static void kbasep_sync_mem_regions(struct kbase_context *kctx,
-		struct kbase_vmap_struct *map, enum kbase_sync_type dest)
-{
-	size_t i;
-	off_t const offset = (uintptr_t)map->gpu_addr & ~PAGE_MASK;
-	size_t const page_count = PFN_UP(offset + map->size);
-
-	/* Sync first page */
-	size_t sz = MIN(((size_t) PAGE_SIZE - offset), map->size);
-	struct tagged_addr cpu_pa = map->cpu_pages[0];
-	struct tagged_addr gpu_pa = map->gpu_pages[0];
-
-	kbase_sync_single(kctx, cpu_pa, gpu_pa, offset, sz, dest);
-
-	/* Sync middle pages (if any) */
-	for (i = 1; page_count > 2 && i < page_count - 1; i++) {
-		cpu_pa = map->cpu_pages[i];
-		gpu_pa = map->gpu_pages[i];
-		kbase_sync_single(kctx, cpu_pa, gpu_pa, 0, PAGE_SIZE, dest);
-	}
-
-	/* Sync last page (if any) */
-	if (page_count > 1) {
-		cpu_pa = map->cpu_pages[page_count - 1];
-		gpu_pa = map->gpu_pages[page_count - 1];
-		sz = ((offset + map->size - 1) & ~PAGE_MASK) + 1;
-		kbase_sync_single(kctx, cpu_pa, gpu_pa, 0, sz, dest);
-	}
-}
-
-void *kbase_vmap_prot(struct kbase_context *kctx, u64 gpu_addr, size_t size,
-		      unsigned long prot_request, struct kbase_vmap_struct *map)
-{
-	struct kbase_va_region *reg;
-	unsigned long page_index;
-	unsigned int offset = gpu_addr & ~PAGE_MASK;
-	size_t page_count = PFN_UP(offset + size);
-	struct tagged_addr *page_array;
-	struct page **pages;
-	void *cpu_addr = NULL;
-	pgprot_t prot;
-	size_t i;
-
-	if (!size || !map)
-		return NULL;
-
-	/* check if page_count calculation will wrap */
-	if (size > ((size_t)-1 / PAGE_SIZE))
-		return NULL;
-
-	kbase_gpu_vm_lock(kctx);
-
-	reg = kbase_region_tracker_find_region_enclosing_address(kctx, gpu_addr);
-	if (!reg || (reg->flags & KBASE_REG_FREE))
-		goto out_unlock;
-
-	page_index = (gpu_addr >> PAGE_SHIFT) - reg->start_pfn;
-
-	/* check if page_index + page_count will wrap */
-	if (-1UL - page_count < page_index)
-		goto out_unlock;
-
-	if (page_index + page_count > kbase_reg_current_backed_size(reg))
-		goto out_unlock;
-
-	if (reg->flags & KBASE_REG_DONT_NEED)
-		goto out_unlock;
-
-	/* check access permissions can be satisfied
-	 * Intended only for checking KBASE_REG_{CPU,GPU}_{RD,WR} */
-	if ((reg->flags & prot_request) != prot_request)
-		goto out_unlock;
-
-	page_array = kbase_get_cpu_phy_pages(reg);
-	if (!page_array)
-		goto out_unlock;
-
-	pages = kmalloc_array(page_count, sizeof(struct page *), GFP_KERNEL);
-	if (!pages)
-		goto out_unlock;
-
-	for (i = 0; i < page_count; i++)
-		pages[i] = phys_to_page(as_phys_addr_t(page_array[page_index +
-								  i]));
-
-	prot = PAGE_KERNEL;
-	if (!(reg->flags & KBASE_REG_CPU_CACHED)) {
-		/* Map uncached */
-		prot = pgprot_writecombine(prot);
-	}
-	/* Note: enforcing a RO prot_request onto prot is not done, since:
-	 * - CPU-arch-specific integration required
-	 * - kbase_vmap() requires no access checks to be made/enforced */
-
-	cpu_addr = vmap(pages, page_count, VM_MAP, prot);
-
-	kfree(pages);
-
-	if (!cpu_addr)
-		goto out_unlock;
-
-	map->gpu_addr = gpu_addr;
-	map->cpu_alloc = kbase_mem_phy_alloc_get(reg->cpu_alloc);
-	map->cpu_pages = &kbase_get_cpu_phy_pages(reg)[page_index];
-	map->gpu_alloc = kbase_mem_phy_alloc_get(reg->gpu_alloc);
-	map->gpu_pages = &kbase_get_gpu_phy_pages(reg)[page_index];
-	map->addr = (void *)((uintptr_t)cpu_addr + offset);
-	map->size = size;
-	map->sync_needed = ((reg->flags & KBASE_REG_CPU_CACHED) != 0) &&
-		!kbase_mem_is_imported(map->gpu_alloc->type);
-
-	if (map->sync_needed)
-		kbasep_sync_mem_regions(kctx, map, KBASE_SYNC_TO_CPU);
-	kbase_gpu_vm_unlock(kctx);
-
-	return map->addr;
-
-out_unlock:
-	kbase_gpu_vm_unlock(kctx);
-	return NULL;
-}
-
-void *kbase_vmap(struct kbase_context *kctx, u64 gpu_addr, size_t size,
-		struct kbase_vmap_struct *map)
-{
-	/* 0 is specified for prot_request to indicate no access checks should
-	 * be made.
-	 *
-	 * As mentioned in kbase_vmap_prot() this means that a kernel-side
-	 * CPU-RO mapping is not enforced to allow this to work */
-	return kbase_vmap_prot(kctx, gpu_addr, size, 0u, map);
-}
-KBASE_EXPORT_TEST_API(kbase_vmap);
-
-void kbase_vunmap(struct kbase_context *kctx, struct kbase_vmap_struct *map)
-{
-	void *addr = (void *)((uintptr_t)map->addr & PAGE_MASK);
-	vunmap(addr);
-
-	if (map->sync_needed)
-		kbasep_sync_mem_regions(kctx, map, KBASE_SYNC_TO_DEVICE);
-	map->gpu_addr = 0;
-	map->cpu_alloc = kbase_mem_phy_alloc_put(map->cpu_alloc);
-	map->gpu_alloc = kbase_mem_phy_alloc_put(map->gpu_alloc);
-	map->cpu_pages = NULL;
-	map->gpu_pages = NULL;
-	map->addr = NULL;
-	map->size = 0;
-	map->sync_needed = false;
-}
-KBASE_EXPORT_TEST_API(kbase_vunmap);
-
-void kbasep_os_process_page_usage_update(struct kbase_context *kctx, int pages)
-{
-	struct mm_struct *mm;
-
-	rcu_read_lock();
-	mm = rcu_dereference(kctx->process_mm);
-	if (mm) {
-		atomic_add(pages, &kctx->nonmapped_pages);
-#ifdef SPLIT_RSS_COUNTING
-		add_mm_counter(mm, MM_FILEPAGES, pages);
-#else
-		spin_lock(&mm->page_table_lock);
-		add_mm_counter(mm, MM_FILEPAGES, pages);
-		spin_unlock(&mm->page_table_lock);
-#endif
-	}
-	rcu_read_unlock();
-}
-
-static void kbasep_os_process_page_usage_drain(struct kbase_context *kctx)
-{
-	int pages;
-	struct mm_struct *mm;
-
-	spin_lock(&kctx->mm_update_lock);
-	mm = rcu_dereference_protected(kctx->process_mm, lockdep_is_held(&kctx->mm_update_lock));
-	if (!mm) {
-		spin_unlock(&kctx->mm_update_lock);
-		return;
-	}
-
-	rcu_assign_pointer(kctx->process_mm, NULL);
-	spin_unlock(&kctx->mm_update_lock);
-	synchronize_rcu();
-
-	pages = atomic_xchg(&kctx->nonmapped_pages, 0);
-#ifdef SPLIT_RSS_COUNTING
-	add_mm_counter(mm, MM_FILEPAGES, -pages);
-#else
-	spin_lock(&mm->page_table_lock);
-	add_mm_counter(mm, MM_FILEPAGES, -pages);
-	spin_unlock(&mm->page_table_lock);
-#endif
-}
-
-static void kbase_special_vm_close(struct vm_area_struct *vma)
-{
-	struct kbase_context *kctx;
-
-	kctx = vma->vm_private_data;
-	kbasep_os_process_page_usage_drain(kctx);
-}
-
-static const struct vm_operations_struct kbase_vm_special_ops = {
-	.close = kbase_special_vm_close,
-};
-
-static int kbase_tracking_page_setup(struct kbase_context *kctx, struct vm_area_struct *vma)
-{
-	/* check that this is the only tracking page */
-	spin_lock(&kctx->mm_update_lock);
-	if (rcu_dereference_protected(kctx->process_mm, lockdep_is_held(&kctx->mm_update_lock))) {
-		spin_unlock(&kctx->mm_update_lock);
-		return -EFAULT;
-	}
-
-	rcu_assign_pointer(kctx->process_mm, current->mm);
-
-	spin_unlock(&kctx->mm_update_lock);
-
-	/* no real access */
-	vma->vm_flags &= ~(VM_READ | VM_MAYREAD | VM_WRITE | VM_MAYWRITE | VM_EXEC | VM_MAYEXEC);
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0))
-	vma->vm_flags |= VM_DONTCOPY | VM_DONTEXPAND | VM_DONTDUMP | VM_IO;
-#else
-	vma->vm_flags |= VM_DONTCOPY | VM_DONTEXPAND | VM_RESERVED | VM_IO;
-#endif
-	vma->vm_ops = &kbase_vm_special_ops;
-	vma->vm_private_data = kctx;
-
-	return 0;
-}
-void *kbase_va_alloc(struct kbase_context *kctx, u32 size, struct kbase_hwc_dma_mapping *handle)
-{
-	int res;
-	void *va;
-	dma_addr_t  dma_pa;
-	struct kbase_va_region *reg;
-	struct tagged_addr *page_array;
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0))
-	unsigned long attrs = DMA_ATTR_WRITE_COMBINE;
-#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0))
-	DEFINE_DMA_ATTRS(attrs);
-#endif
-
-	u32 pages = ((size - 1) >> PAGE_SHIFT) + 1;
-	u32 flags = BASE_MEM_PROT_CPU_RD | BASE_MEM_PROT_CPU_WR |
-		    BASE_MEM_PROT_GPU_RD | BASE_MEM_PROT_GPU_WR;
-	u32 i;
-
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	KBASE_DEBUG_ASSERT(0 != size);
-	KBASE_DEBUG_ASSERT(0 != pages);
-
-	if (size == 0)
-		goto err;
-
-	/* All the alloc calls return zeroed memory */
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0))
-	va = dma_alloc_attrs(kctx->kbdev->dev, size, &dma_pa, GFP_KERNEL,
-			     attrs);
-#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0))
-	dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs);
-	va = dma_alloc_attrs(kctx->kbdev->dev, size, &dma_pa, GFP_KERNEL,
-			     &attrs);
-#else
-	va = dma_alloc_writecombine(kctx->kbdev->dev, size, &dma_pa, GFP_KERNEL);
-#endif
-	if (!va)
-		goto err;
-
-	/* Store the state so we can free it later. */
-	handle->cpu_va = va;
-	handle->dma_pa = dma_pa;
-	handle->size   = size;
-
-
-	reg = kbase_alloc_free_region(kctx, 0, pages, KBASE_REG_ZONE_SAME_VA);
-	if (!reg)
-		goto no_reg;
-
-	reg->flags &= ~KBASE_REG_FREE;
-	if (kbase_update_region_flags(kctx, reg, flags) != 0)
-		goto invalid_flags;
-
-	reg->cpu_alloc = kbase_alloc_create(pages, KBASE_MEM_TYPE_RAW);
-	if (IS_ERR_OR_NULL(reg->cpu_alloc))
-		goto no_alloc;
-
-	reg->gpu_alloc = kbase_mem_phy_alloc_get(reg->cpu_alloc);
-
-	page_array = kbase_get_cpu_phy_pages(reg);
-
-	for (i = 0; i < pages; i++)
-		page_array[i] = as_tagged(dma_pa + (i << PAGE_SHIFT));
-
-	reg->cpu_alloc->nents = pages;
-
-	kbase_gpu_vm_lock(kctx);
-	res = kbase_gpu_mmap(kctx, reg, (uintptr_t) va, pages, 1);
-	kbase_gpu_vm_unlock(kctx);
-	if (res)
-		goto no_mmap;
-
-	return va;
-
-no_mmap:
-	kbase_mem_phy_alloc_put(reg->cpu_alloc);
-	kbase_mem_phy_alloc_put(reg->gpu_alloc);
-no_alloc:
-invalid_flags:
-	kfree(reg);
-no_reg:
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0))
-	dma_free_attrs(kctx->kbdev->dev, size, va, dma_pa, attrs);
-#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0))
-	dma_free_attrs(kctx->kbdev->dev, size, va, dma_pa, &attrs);
-#else
-	dma_free_writecombine(kctx->kbdev->dev, size, va, dma_pa);
-#endif
-err:
-	return NULL;
-}
-KBASE_EXPORT_SYMBOL(kbase_va_alloc);
-
-void kbase_va_free(struct kbase_context *kctx, struct kbase_hwc_dma_mapping *handle)
-{
-	struct kbase_va_region *reg;
-	int err;
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)) && \
-	(LINUX_VERSION_CODE < KERNEL_VERSION(4, 8, 0))
-	DEFINE_DMA_ATTRS(attrs);
-#endif
-
-	KBASE_DEBUG_ASSERT(kctx != NULL);
-	KBASE_DEBUG_ASSERT(handle->cpu_va != NULL);
-
-	kbase_gpu_vm_lock(kctx);
-	reg = kbase_region_tracker_find_region_base_address(kctx, (uintptr_t)handle->cpu_va);
-	KBASE_DEBUG_ASSERT(reg);
-	err = kbase_gpu_munmap(kctx, reg);
-	kbase_gpu_vm_unlock(kctx);
-	KBASE_DEBUG_ASSERT(!err);
-
-	kbase_mem_phy_alloc_put(reg->cpu_alloc);
-	kbase_mem_phy_alloc_put(reg->gpu_alloc);
-	kfree(reg);
-
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0))
-	dma_free_attrs(kctx->kbdev->dev, handle->size,
-		       handle->cpu_va, handle->dma_pa, DMA_ATTR_WRITE_COMBINE);
-#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0))
-	dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs);
-	dma_free_attrs(kctx->kbdev->dev, handle->size,
-			handle->cpu_va, handle->dma_pa, &attrs);
-#else
-	dma_free_writecombine(kctx->kbdev->dev, handle->size,
-				handle->cpu_va, handle->dma_pa);
-#endif
-}
-KBASE_EXPORT_SYMBOL(kbase_va_free);
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_linux.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_linux.h
deleted file mode 100644
index db35f62a7431..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_linux.h
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010, 2012-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/**
- * @file mali_kbase_mem_linux.h
- * Base kernel memory APIs, Linux implementation.
- */
-
-#ifndef _KBASE_MEM_LINUX_H_
-#define _KBASE_MEM_LINUX_H_
-
-/** A HWC dump mapping */
-struct kbase_hwc_dma_mapping {
-	void       *cpu_va;
-	dma_addr_t  dma_pa;
-	size_t      size;
-};
-
-struct kbase_va_region *kbase_mem_alloc(struct kbase_context *kctx,
-		u64 va_pages, u64 commit_pages, u64 extent, u64 *flags,
-		u64 *gpu_va);
-int kbase_mem_query(struct kbase_context *kctx, u64 gpu_addr, int query, u64 *const pages);
-int kbase_mem_import(struct kbase_context *kctx, enum base_mem_import_type type,
-		void __user *phandle, u32 padding, u64 *gpu_va, u64 *va_pages,
-		u64 *flags);
-u64 kbase_mem_alias(struct kbase_context *kctx, u64 *flags, u64 stride, u64 nents, struct base_mem_aliasing_info *ai, u64 *num_pages);
-int kbase_mem_flags_change(struct kbase_context *kctx, u64 gpu_addr, unsigned int flags, unsigned int mask);
-
-/**
- * kbase_mem_commit - Change the physical backing size of a region
- *
- * @kctx: The kernel context
- * @gpu_addr: Handle to the memory region
- * @new_pages: Number of physical pages to back the region with
- *
- * Return: 0 on success or error code
- */
-int kbase_mem_commit(struct kbase_context *kctx, u64 gpu_addr, u64 new_pages);
-
-int kbase_mmap(struct file *file, struct vm_area_struct *vma);
-
-/**
- * kbase_mem_evictable_init - Initialize the Ephemeral memory the eviction
- * mechanism.
- * @kctx: The kbase context to initialize.
- *
- * Return: Zero on success or -errno on failure.
- */
-int kbase_mem_evictable_init(struct kbase_context *kctx);
-
-/**
- * kbase_mem_evictable_deinit - De-initialize the Ephemeral memory eviction
- * mechanism.
- * @kctx: The kbase context to de-initialize.
- */
-void kbase_mem_evictable_deinit(struct kbase_context *kctx);
-
-/**
- * kbase_mem_grow_gpu_mapping - Grow the GPU mapping of an allocation
- * @kctx:      Context the region belongs to
- * @reg:       The GPU region
- * @new_pages: The number of pages after the grow
- * @old_pages: The number of pages before the grow
- *
- * Return: 0 on success, -errno on error.
- *
- * Expand the GPU mapping to encompass the new psychical pages which have
- * been added to the allocation.
- *
- * Note: Caller must be holding the region lock.
- */
-int kbase_mem_grow_gpu_mapping(struct kbase_context *kctx,
-		struct kbase_va_region *reg,
-		u64 new_pages, u64 old_pages);
-
-/**
- * kbase_mem_evictable_make - Make a physical allocation eligible for eviction
- * @gpu_alloc: The physical allocation to make evictable
- *
- * Return: 0 on success, -errno on error.
- *
- * Take the provided region and make all the physical pages within it
- * reclaimable by the kernel, updating the per-process VM stats as well.
- * Remove any CPU mappings (as these can't be removed in the shrinker callback
- * as mmap_sem might already be taken) but leave the GPU mapping intact as
- * and until the shrinker reclaims the allocation.
- *
- * Note: Must be called with the region lock of the containing context.
- */
-int kbase_mem_evictable_make(struct kbase_mem_phy_alloc *gpu_alloc);
-
-/**
- * kbase_mem_evictable_unmake - Remove a physical allocations eligibility for
- * eviction.
- * @alloc: The physical allocation to remove eviction eligibility from.
- *
- * Return: True if the allocation had its backing restored and false if
- * it hasn't.
- *
- * Make the physical pages in the region no longer reclaimable and update the
- * per-process stats, if the shrinker has already evicted the memory then
- * re-allocate it if the region is still alive.
- *
- * Note: Must be called with the region lock of the containing context.
- */
-bool kbase_mem_evictable_unmake(struct kbase_mem_phy_alloc *alloc);
-
-struct kbase_vmap_struct {
-	u64 gpu_addr;
-	struct kbase_mem_phy_alloc *cpu_alloc;
-	struct kbase_mem_phy_alloc *gpu_alloc;
-	struct tagged_addr *cpu_pages;
-	struct tagged_addr *gpu_pages;
-	void *addr;
-	size_t size;
-	bool sync_needed;
-};
-
-
-/**
- * kbase_vmap_prot - Map a GPU VA range into the kernel safely, only if the
- * requested access permissions are supported
- * @kctx:         Context the VA range belongs to
- * @gpu_addr:     Start address of VA range
- * @size:         Size of VA range
- * @prot_request: Flags indicating how the caller will then access the memory
- * @map:          Structure to be given to kbase_vunmap() on freeing
- *
- * Return: Kernel-accessible CPU pointer to the VA range, or NULL on error
- *
- * Map a GPU VA Range into the kernel. The VA range must be contained within a
- * GPU memory region. Appropriate CPU cache-flushing operations are made as
- * required, dependent on the CPU mapping for the memory region.
- *
- * This is safer than using kmap() on the pages directly,
- * because the pages here are refcounted to prevent freeing (and hence reuse
- * elsewhere in the system) until an kbase_vunmap()
- *
- * The flags in @prot_request should use KBASE_REG_{CPU,GPU}_{RD,WR}, to check
- * whether the region should allow the intended access, and return an error if
- * disallowed. This is essential for security of imported memory, particularly
- * a user buf from SHM mapped into the process as RO. In that case, write
- * access must be checked if the intention is for kernel to write to the
- * memory.
- *
- * The checks are also there to help catch access errors on memory where
- * security is not a concern: imported memory that is always RW, and memory
- * that was allocated and owned by the process attached to @kctx. In this case,
- * it helps to identify memory that was was mapped with the wrong access type.
- *
- * Note: KBASE_REG_GPU_{RD,WR} flags are currently supported for legacy cases
- * where either the security of memory is solely dependent on those flags, or
- * when userspace code was expecting only the GPU to access the memory (e.g. HW
- * workarounds).
- *
- * All cache maintenance operations shall be ignored if the
- * memory region has been imported.
- *
- */
-void *kbase_vmap_prot(struct kbase_context *kctx, u64 gpu_addr, size_t size,
-		      unsigned long prot_request, struct kbase_vmap_struct *map);
-
-/**
- * kbase_vmap - Map a GPU VA range into the kernel safely
- * @kctx:     Context the VA range belongs to
- * @gpu_addr: Start address of VA range
- * @size:     Size of VA range
- * @map:      Structure to be given to kbase_vunmap() on freeing
- *
- * Return: Kernel-accessible CPU pointer to the VA range, or NULL on error
- *
- * Map a GPU VA Range into the kernel. The VA range must be contained within a
- * GPU memory region. Appropriate CPU cache-flushing operations are made as
- * required, dependent on the CPU mapping for the memory region.
- *
- * This is safer than using kmap() on the pages directly,
- * because the pages here are refcounted to prevent freeing (and hence reuse
- * elsewhere in the system) until an kbase_vunmap()
- *
- * kbase_vmap_prot() should be used in preference, since kbase_vmap() makes no
- * checks to ensure the security of e.g. imported user bufs from RO SHM.
- *
- * Note: All cache maintenance operations shall be ignored if the memory region
- * has been imported.
- */
-void *kbase_vmap(struct kbase_context *kctx, u64 gpu_addr, size_t size,
-		struct kbase_vmap_struct *map);
-
-/**
- * kbase_vunmap - Unmap a GPU VA range from the kernel
- * @kctx: Context the VA range belongs to
- * @map:  Structure describing the mapping from the corresponding kbase_vmap()
- *        call
- *
- * Unmaps a GPU VA range from the kernel, given its @map structure obtained
- * from kbase_vmap(). Appropriate CPU cache-flushing operations are made as
- * required, dependent on the CPU mapping for the memory region.
- *
- * The reference taken on pages during kbase_vmap() is released.
- *
- * Note: All cache maintenance operations shall be ignored if the memory region
- * has been imported.
- */
-void kbase_vunmap(struct kbase_context *kctx, struct kbase_vmap_struct *map);
-
-/** @brief Allocate memory from kernel space and map it onto the GPU
- *
- * @param kctx   The context used for the allocation/mapping
- * @param size   The size of the allocation in bytes
- * @param handle An opaque structure used to contain the state needed to free the memory
- * @return the VA for kernel space and GPU MMU
- */
-void *kbase_va_alloc(struct kbase_context *kctx, u32 size, struct kbase_hwc_dma_mapping *handle);
-
-/** @brief Free/unmap memory allocated by kbase_va_alloc
- *
- * @param kctx   The context used for the allocation/mapping
- * @param handle An opaque structure returned by the kbase_va_alloc function.
- */
-void kbase_va_free(struct kbase_context *kctx, struct kbase_hwc_dma_mapping *handle);
-
-extern const struct vm_operations_struct kbase_vm_ops;
-
-#endif				/* _KBASE_MEM_LINUX_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_lowlevel.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_lowlevel.h
deleted file mode 100644
index f4e88491327e..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_lowlevel.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2014,2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#ifndef _KBASE_MEM_LOWLEVEL_H
-#define _KBASE_MEM_LOWLEVEL_H
-
-#ifndef _KBASE_H_
-#error "Don't include this file directly, use mali_kbase.h instead"
-#endif
-
-#include <linux/dma-mapping.h>
-
-/**
- * @brief Flags for kbase_phy_allocator_pages_alloc
- */
-#define KBASE_PHY_PAGES_FLAG_DEFAULT (0)	/** Default allocation flag */
-#define KBASE_PHY_PAGES_FLAG_CLEAR   (1 << 0)	/** Clear the pages after allocation */
-#define KBASE_PHY_PAGES_FLAG_POISON  (1 << 1)	/** Fill the memory with a poison value */
-
-#define KBASE_PHY_PAGES_SUPPORTED_FLAGS (KBASE_PHY_PAGES_FLAG_DEFAULT|KBASE_PHY_PAGES_FLAG_CLEAR|KBASE_PHY_PAGES_FLAG_POISON)
-
-#define KBASE_PHY_PAGES_POISON_VALUE  0xFD /** Value to fill the memory with when KBASE_PHY_PAGES_FLAG_POISON is set */
-
-enum kbase_sync_type {
-	KBASE_SYNC_TO_CPU,
-	KBASE_SYNC_TO_DEVICE
-};
-
-struct tagged_addr { phys_addr_t tagged_addr; };
-
-#define HUGE_PAGE    (1u << 0)
-#define HUGE_HEAD    (1u << 1)
-#define FROM_PARTIAL (1u << 2)
-
-static inline phys_addr_t as_phys_addr_t(struct tagged_addr t)
-{
-	return t.tagged_addr & PAGE_MASK;
-}
-
-static inline struct tagged_addr as_tagged(phys_addr_t phys)
-{
-	struct tagged_addr t;
-
-	t.tagged_addr = phys & PAGE_MASK;
-	return t;
-}
-
-static inline struct tagged_addr as_tagged_tag(phys_addr_t phys, int tag)
-{
-	struct tagged_addr t;
-
-	t.tagged_addr = (phys & PAGE_MASK) | (tag & ~PAGE_MASK);
-	return t;
-}
-
-static inline bool is_huge(struct tagged_addr t)
-{
-	return t.tagged_addr & HUGE_PAGE;
-}
-
-static inline bool is_huge_head(struct tagged_addr t)
-{
-	int mask = HUGE_HEAD | HUGE_PAGE;
-
-	return mask == (t.tagged_addr & mask);
-}
-
-static inline bool is_partial(struct tagged_addr t)
-{
-	return t.tagged_addr & FROM_PARTIAL;
-}
-
-#endif /* _KBASE_LOWLEVEL_H */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_pool.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_pool.c
deleted file mode 100644
index 696730ac5b2b..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_pool.c
+++ /dev/null
@@ -1,651 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2015-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <mali_kbase.h>
-#include <linux/mm.h>
-#include <linux/dma-mapping.h>
-#include <linux/highmem.h>
-#include <linux/spinlock.h>
-#include <linux/shrinker.h>
-#include <linux/atomic.h>
-#include <linux/version.h>
-
-#define pool_dbg(pool, format, ...) \
-	dev_dbg(pool->kbdev->dev, "%s-pool [%zu/%zu]: " format,	\
-		(pool->next_pool) ? "kctx" : "kbdev",	\
-		kbase_mem_pool_size(pool),	\
-		kbase_mem_pool_max_size(pool),	\
-		##__VA_ARGS__)
-
-#define NOT_DIRTY false
-#define NOT_RECLAIMED false
-
-static inline void kbase_mem_pool_lock(struct kbase_mem_pool *pool)
-{
-	spin_lock(&pool->pool_lock);
-}
-
-static inline void kbase_mem_pool_unlock(struct kbase_mem_pool *pool)
-{
-	spin_unlock(&pool->pool_lock);
-}
-
-static size_t kbase_mem_pool_capacity(struct kbase_mem_pool *pool)
-{
-	ssize_t max_size = kbase_mem_pool_max_size(pool);
-	ssize_t cur_size = kbase_mem_pool_size(pool);
-
-	return max(max_size - cur_size, (ssize_t)0);
-}
-
-static bool kbase_mem_pool_is_full(struct kbase_mem_pool *pool)
-{
-	return kbase_mem_pool_size(pool) >= kbase_mem_pool_max_size(pool);
-}
-
-static bool kbase_mem_pool_is_empty(struct kbase_mem_pool *pool)
-{
-	return kbase_mem_pool_size(pool) == 0;
-}
-
-static void kbase_mem_pool_add_locked(struct kbase_mem_pool *pool,
-		struct page *p)
-{
-	lockdep_assert_held(&pool->pool_lock);
-
-	list_add(&p->lru, &pool->page_list);
-	pool->cur_size++;
-
-	zone_page_state_add(1, page_zone(p), NR_SLAB_RECLAIMABLE);
-
-	pool_dbg(pool, "added page\n");
-}
-
-static void kbase_mem_pool_add(struct kbase_mem_pool *pool, struct page *p)
-{
-	kbase_mem_pool_lock(pool);
-	kbase_mem_pool_add_locked(pool, p);
-	kbase_mem_pool_unlock(pool);
-}
-
-static void kbase_mem_pool_add_list_locked(struct kbase_mem_pool *pool,
-		struct list_head *page_list, size_t nr_pages)
-{
-	struct page *p;
-
-	lockdep_assert_held(&pool->pool_lock);
-
-	list_for_each_entry(p, page_list, lru) {
-		zone_page_state_add(1, page_zone(p), NR_SLAB_RECLAIMABLE);
-	}
-
-	list_splice(page_list, &pool->page_list);
-	pool->cur_size += nr_pages;
-
-	pool_dbg(pool, "added %zu pages\n", nr_pages);
-}
-
-static void kbase_mem_pool_add_list(struct kbase_mem_pool *pool,
-		struct list_head *page_list, size_t nr_pages)
-{
-	kbase_mem_pool_lock(pool);
-	kbase_mem_pool_add_list_locked(pool, page_list, nr_pages);
-	kbase_mem_pool_unlock(pool);
-}
-
-static struct page *kbase_mem_pool_remove_locked(struct kbase_mem_pool *pool)
-{
-	struct page *p;
-
-	lockdep_assert_held(&pool->pool_lock);
-
-	if (kbase_mem_pool_is_empty(pool))
-		return NULL;
-
-	p = list_first_entry(&pool->page_list, struct page, lru);
-	list_del_init(&p->lru);
-	pool->cur_size--;
-
-	zone_page_state_add(-1, page_zone(p), NR_SLAB_RECLAIMABLE);
-
-	pool_dbg(pool, "removed page\n");
-
-	return p;
-}
-
-static struct page *kbase_mem_pool_remove(struct kbase_mem_pool *pool)
-{
-	struct page *p;
-
-	kbase_mem_pool_lock(pool);
-	p = kbase_mem_pool_remove_locked(pool);
-	kbase_mem_pool_unlock(pool);
-
-	return p;
-}
-
-static void kbase_mem_pool_sync_page(struct kbase_mem_pool *pool,
-		struct page *p)
-{
-	struct device *dev = pool->kbdev->dev;
-	dma_sync_single_for_device(dev, kbase_dma_addr(p),
-			(PAGE_SIZE << pool->order), DMA_BIDIRECTIONAL);
-}
-
-static void kbase_mem_pool_zero_page(struct kbase_mem_pool *pool,
-		struct page *p)
-{
-	int i;
-
-	for (i = 0; i < (1U << pool->order); i++)
-		clear_highpage(p+i);
-
-	kbase_mem_pool_sync_page(pool, p);
-}
-
-static void kbase_mem_pool_spill(struct kbase_mem_pool *next_pool,
-		struct page *p)
-{
-	/* Zero page before spilling */
-	kbase_mem_pool_zero_page(next_pool, p);
-
-	kbase_mem_pool_add(next_pool, p);
-}
-
-struct page *kbase_mem_alloc_page(struct kbase_mem_pool *pool)
-{
-	struct page *p;
-	gfp_t gfp;
-	struct device *dev = pool->kbdev->dev;
-	dma_addr_t dma_addr;
-	int i;
-
-#if defined(CONFIG_ARM) && !defined(CONFIG_HAVE_DMA_ATTRS) && \
-	LINUX_VERSION_CODE < KERNEL_VERSION(3, 5, 0)
-	/* DMA cache sync fails for HIGHMEM before 3.5 on ARM */
-	gfp = GFP_USER | __GFP_ZERO;
-#else
-	gfp = GFP_HIGHUSER | __GFP_ZERO;
-#endif
-
-	if (current->flags & PF_KTHREAD) {
-		/* Don't trigger OOM killer from kernel threads, e.g. when
-		 * growing memory on GPU page fault */
-		gfp |= __GFP_NORETRY;
-	}
-
-	/* don't warn on higer order failures */
-	if (pool->order)
-		gfp |= __GFP_NOWARN;
-
-	p = alloc_pages(gfp, pool->order);
-	if (!p)
-		return NULL;
-
-	dma_addr = dma_map_page(dev, p, 0, (PAGE_SIZE << pool->order),
-				DMA_BIDIRECTIONAL);
-	if (dma_mapping_error(dev, dma_addr)) {
-		__free_pages(p, pool->order);
-		return NULL;
-	}
-
-	WARN_ON(dma_addr != page_to_phys(p));
-	for (i = 0; i < (1u << pool->order); i++)
-		kbase_set_dma_addr(p+i, dma_addr + PAGE_SIZE * i);
-
-	return p;
-}
-
-static void kbase_mem_pool_free_page(struct kbase_mem_pool *pool,
-		struct page *p)
-{
-	struct device *dev = pool->kbdev->dev;
-	dma_addr_t dma_addr = kbase_dma_addr(p);
-	int i;
-
-	dma_unmap_page(dev, dma_addr, (PAGE_SIZE << pool->order),
-		       DMA_BIDIRECTIONAL);
-	for (i = 0; i < (1u << pool->order); i++)
-		kbase_clear_dma_addr(p+i);
-	__free_pages(p, pool->order);
-
-	pool_dbg(pool, "freed page to kernel\n");
-}
-
-static size_t kbase_mem_pool_shrink_locked(struct kbase_mem_pool *pool,
-		size_t nr_to_shrink)
-{
-	struct page *p;
-	size_t i;
-
-	lockdep_assert_held(&pool->pool_lock);
-
-	for (i = 0; i < nr_to_shrink && !kbase_mem_pool_is_empty(pool); i++) {
-		p = kbase_mem_pool_remove_locked(pool);
-		kbase_mem_pool_free_page(pool, p);
-	}
-
-	return i;
-}
-
-static size_t kbase_mem_pool_shrink(struct kbase_mem_pool *pool,
-		size_t nr_to_shrink)
-{
-	size_t nr_freed;
-
-	kbase_mem_pool_lock(pool);
-	nr_freed = kbase_mem_pool_shrink_locked(pool, nr_to_shrink);
-	kbase_mem_pool_unlock(pool);
-
-	return nr_freed;
-}
-
-int kbase_mem_pool_grow(struct kbase_mem_pool *pool,
-		size_t nr_to_grow)
-{
-	struct page *p;
-	size_t i;
-
-	for (i = 0; i < nr_to_grow; i++) {
-		p = kbase_mem_alloc_page(pool);
-		if (!p)
-			return -ENOMEM;
-		kbase_mem_pool_add(pool, p);
-	}
-
-	return 0;
-}
-
-void kbase_mem_pool_trim(struct kbase_mem_pool *pool, size_t new_size)
-{
-	size_t cur_size;
-	int err = 0;
-
-	cur_size = kbase_mem_pool_size(pool);
-
-	if (new_size > pool->max_size)
-		new_size = pool->max_size;
-
-	if (new_size < cur_size)
-		kbase_mem_pool_shrink(pool, cur_size - new_size);
-	else if (new_size > cur_size)
-		err = kbase_mem_pool_grow(pool, new_size - cur_size);
-
-	if (err) {
-		size_t grown_size = kbase_mem_pool_size(pool);
-
-		dev_warn(pool->kbdev->dev,
-			 "Mem pool not grown to the required size of %zu bytes, grown for additional %zu bytes instead!\n",
-			 (new_size - cur_size), (grown_size - cur_size));
-	}
-}
-
-void kbase_mem_pool_set_max_size(struct kbase_mem_pool *pool, size_t max_size)
-{
-	size_t cur_size;
-	size_t nr_to_shrink;
-
-	kbase_mem_pool_lock(pool);
-
-	pool->max_size = max_size;
-
-	cur_size = kbase_mem_pool_size(pool);
-	if (max_size < cur_size) {
-		nr_to_shrink = cur_size - max_size;
-		kbase_mem_pool_shrink_locked(pool, nr_to_shrink);
-	}
-
-	kbase_mem_pool_unlock(pool);
-}
-
-
-static unsigned long kbase_mem_pool_reclaim_count_objects(struct shrinker *s,
-		struct shrink_control *sc)
-{
-	struct kbase_mem_pool *pool;
-
-	pool = container_of(s, struct kbase_mem_pool, reclaim);
-	pool_dbg(pool, "reclaim count: %zu\n", kbase_mem_pool_size(pool));
-	return kbase_mem_pool_size(pool);
-}
-
-static unsigned long kbase_mem_pool_reclaim_scan_objects(struct shrinker *s,
-		struct shrink_control *sc)
-{
-	struct kbase_mem_pool *pool;
-	unsigned long freed;
-
-	pool = container_of(s, struct kbase_mem_pool, reclaim);
-
-	pool_dbg(pool, "reclaim scan %ld:\n", sc->nr_to_scan);
-
-	freed = kbase_mem_pool_shrink(pool, sc->nr_to_scan);
-
-	pool_dbg(pool, "reclaim freed %ld pages\n", freed);
-
-	return freed;
-}
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 12, 0)
-static int kbase_mem_pool_reclaim_shrink(struct shrinker *s,
-		struct shrink_control *sc)
-{
-	if (sc->nr_to_scan == 0)
-		return kbase_mem_pool_reclaim_count_objects(s, sc);
-
-	return kbase_mem_pool_reclaim_scan_objects(s, sc);
-}
-#endif
-
-int kbase_mem_pool_init(struct kbase_mem_pool *pool,
-		size_t max_size,
-		size_t order,
-		struct kbase_device *kbdev,
-		struct kbase_mem_pool *next_pool)
-{
-	pool->cur_size = 0;
-	pool->max_size = max_size;
-	pool->order = order;
-	pool->kbdev = kbdev;
-	pool->next_pool = next_pool;
-
-	spin_lock_init(&pool->pool_lock);
-	INIT_LIST_HEAD(&pool->page_list);
-
-	/* Register shrinker */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 12, 0)
-	pool->reclaim.shrink = kbase_mem_pool_reclaim_shrink;
-#else
-	pool->reclaim.count_objects = kbase_mem_pool_reclaim_count_objects;
-	pool->reclaim.scan_objects = kbase_mem_pool_reclaim_scan_objects;
-#endif
-	pool->reclaim.seeks = DEFAULT_SEEKS;
-	/* Kernel versions prior to 3.1 :
-	 * struct shrinker does not define batch */
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
-	pool->reclaim.batch = 0;
-#endif
-	register_shrinker(&pool->reclaim);
-
-	pool_dbg(pool, "initialized\n");
-
-	return 0;
-}
-
-void kbase_mem_pool_term(struct kbase_mem_pool *pool)
-{
-	struct kbase_mem_pool *next_pool = pool->next_pool;
-	struct page *p;
-	size_t nr_to_spill = 0;
-	LIST_HEAD(spill_list);
-	int i;
-
-	pool_dbg(pool, "terminate()\n");
-
-	unregister_shrinker(&pool->reclaim);
-
-	kbase_mem_pool_lock(pool);
-	pool->max_size = 0;
-
-	if (next_pool && !kbase_mem_pool_is_full(next_pool)) {
-		/* Spill to next pool (may overspill) */
-		nr_to_spill = kbase_mem_pool_capacity(next_pool);
-		nr_to_spill = min(kbase_mem_pool_size(pool), nr_to_spill);
-
-		/* Zero pages first without holding the next_pool lock */
-		for (i = 0; i < nr_to_spill; i++) {
-			p = kbase_mem_pool_remove_locked(pool);
-			kbase_mem_pool_zero_page(pool, p);
-			list_add(&p->lru, &spill_list);
-		}
-	}
-
-	while (!kbase_mem_pool_is_empty(pool)) {
-		/* Free remaining pages to kernel */
-		p = kbase_mem_pool_remove_locked(pool);
-		kbase_mem_pool_free_page(pool, p);
-	}
-
-	kbase_mem_pool_unlock(pool);
-
-	if (next_pool && nr_to_spill) {
-		/* Add new page list to next_pool */
-		kbase_mem_pool_add_list(next_pool, &spill_list, nr_to_spill);
-
-		pool_dbg(pool, "terminate() spilled %zu pages\n", nr_to_spill);
-	}
-
-	pool_dbg(pool, "terminated\n");
-}
-
-struct page *kbase_mem_pool_alloc(struct kbase_mem_pool *pool)
-{
-	struct page *p;
-
-	do {
-		pool_dbg(pool, "alloc()\n");
-		p = kbase_mem_pool_remove(pool);
-
-		if (p)
-			return p;
-
-		pool = pool->next_pool;
-	} while (pool);
-
-	return NULL;
-}
-
-void kbase_mem_pool_free(struct kbase_mem_pool *pool, struct page *p,
-		bool dirty)
-{
-	struct kbase_mem_pool *next_pool = pool->next_pool;
-
-	pool_dbg(pool, "free()\n");
-
-	if (!kbase_mem_pool_is_full(pool)) {
-		/* Add to our own pool */
-		if (dirty)
-			kbase_mem_pool_sync_page(pool, p);
-
-		kbase_mem_pool_add(pool, p);
-	} else if (next_pool && !kbase_mem_pool_is_full(next_pool)) {
-		/* Spill to next pool */
-		kbase_mem_pool_spill(next_pool, p);
-	} else {
-		/* Free page */
-		kbase_mem_pool_free_page(pool, p);
-	}
-}
-
-int kbase_mem_pool_alloc_pages(struct kbase_mem_pool *pool, size_t nr_4k_pages,
-		struct tagged_addr *pages, bool partial_allowed)
-{
-	struct page *p;
-	size_t nr_from_pool;
-	size_t i = 0;
-	int err = -ENOMEM;
-	size_t nr_pages_internal;
-
-	nr_pages_internal = nr_4k_pages / (1u << (pool->order));
-
-	if (nr_pages_internal * (1u << pool->order) != nr_4k_pages)
-		return -EINVAL;
-
-	pool_dbg(pool, "alloc_pages(4k=%zu):\n", nr_4k_pages);
-	pool_dbg(pool, "alloc_pages(internal=%zu):\n", nr_pages_internal);
-
-	/* Get pages from this pool */
-	kbase_mem_pool_lock(pool);
-	nr_from_pool = min(nr_pages_internal, kbase_mem_pool_size(pool));
-	while (nr_from_pool--) {
-		int j;
-		p = kbase_mem_pool_remove_locked(pool);
-		if (pool->order) {
-			pages[i++] = as_tagged_tag(page_to_phys(p),
-						   HUGE_HEAD | HUGE_PAGE);
-			for (j = 1; j < (1u << pool->order); j++)
-				pages[i++] = as_tagged_tag(page_to_phys(p) +
-							   PAGE_SIZE * j,
-							   HUGE_PAGE);
-		} else {
-			pages[i++] = as_tagged(page_to_phys(p));
-		}
-	}
-	kbase_mem_pool_unlock(pool);
-
-	if (i != nr_4k_pages && pool->next_pool) {
-		/* Allocate via next pool */
-		err = kbase_mem_pool_alloc_pages(pool->next_pool,
-				nr_4k_pages - i, pages + i, partial_allowed);
-
-		if (err < 0)
-			goto err_rollback;
-
-		i += err;
-	} else {
-		/* Get any remaining pages from kernel */
-		while (i != nr_4k_pages) {
-			p = kbase_mem_alloc_page(pool);
-			if (!p) {
-				if (partial_allowed)
-					goto done;
-				else
-					goto err_rollback;
-			}
-
-			if (pool->order) {
-				int j;
-
-				pages[i++] = as_tagged_tag(page_to_phys(p),
-							   HUGE_PAGE |
-							   HUGE_HEAD);
-				for (j = 1; j < (1u << pool->order); j++) {
-					phys_addr_t phys;
-
-					phys = page_to_phys(p) + PAGE_SIZE * j;
-					pages[i++] = as_tagged_tag(phys,
-								   HUGE_PAGE);
-				}
-			} else {
-				pages[i++] = as_tagged(page_to_phys(p));
-			}
-		}
-	}
-
-done:
-	pool_dbg(pool, "alloc_pages(%zu) done\n", i);
-
-	return i;
-
-err_rollback:
-	kbase_mem_pool_free_pages(pool, i, pages, NOT_DIRTY, NOT_RECLAIMED);
-	return err;
-}
-
-static void kbase_mem_pool_add_array(struct kbase_mem_pool *pool,
-				     size_t nr_pages, struct tagged_addr *pages,
-				     bool zero, bool sync)
-{
-	struct page *p;
-	size_t nr_to_pool = 0;
-	LIST_HEAD(new_page_list);
-	size_t i;
-
-	if (!nr_pages)
-		return;
-
-	pool_dbg(pool, "add_array(%zu, zero=%d, sync=%d):\n",
-			nr_pages, zero, sync);
-
-	/* Zero/sync pages first without holding the pool lock */
-	for (i = 0; i < nr_pages; i++) {
-		if (unlikely(!as_phys_addr_t(pages[i])))
-			continue;
-
-		if (is_huge_head(pages[i]) || !is_huge(pages[i])) {
-			p = phys_to_page(as_phys_addr_t(pages[i]));
-			if (zero)
-				kbase_mem_pool_zero_page(pool, p);
-			else if (sync)
-				kbase_mem_pool_sync_page(pool, p);
-
-			list_add(&p->lru, &new_page_list);
-			nr_to_pool++;
-		}
-		pages[i] = as_tagged(0);
-	}
-
-	/* Add new page list to pool */
-	kbase_mem_pool_add_list(pool, &new_page_list, nr_to_pool);
-
-	pool_dbg(pool, "add_array(%zu) added %zu pages\n",
-			nr_pages, nr_to_pool);
-}
-
-void kbase_mem_pool_free_pages(struct kbase_mem_pool *pool, size_t nr_pages,
-		struct tagged_addr *pages, bool dirty, bool reclaimed)
-{
-	struct kbase_mem_pool *next_pool = pool->next_pool;
-	struct page *p;
-	size_t nr_to_pool;
-	LIST_HEAD(to_pool_list);
-	size_t i = 0;
-
-	pool_dbg(pool, "free_pages(%zu):\n", nr_pages);
-
-	if (!reclaimed) {
-		/* Add to this pool */
-		nr_to_pool = kbase_mem_pool_capacity(pool);
-		nr_to_pool = min(nr_pages, nr_to_pool);
-
-		kbase_mem_pool_add_array(pool, nr_to_pool, pages, false, dirty);
-
-		i += nr_to_pool;
-
-		if (i != nr_pages && next_pool) {
-			/* Spill to next pool (may overspill) */
-			nr_to_pool = kbase_mem_pool_capacity(next_pool);
-			nr_to_pool = min(nr_pages - i, nr_to_pool);
-
-			kbase_mem_pool_add_array(next_pool, nr_to_pool,
-					pages + i, true, dirty);
-			i += nr_to_pool;
-		}
-	}
-
-	/* Free any remaining pages to kernel */
-	for (; i < nr_pages; i++) {
-		if (unlikely(!as_phys_addr_t(pages[i])))
-			continue;
-
-		if (is_huge(pages[i]) && !is_huge_head(pages[i])) {
-			pages[i] = as_tagged(0);
-			continue;
-		}
-
-		p = phys_to_page(as_phys_addr_t(pages[i]));
-
-		if (reclaimed)
-			zone_page_state_add(-1, page_zone(p),
-					NR_SLAB_RECLAIMABLE);
-
-		kbase_mem_pool_free_page(pool, p);
-		pages[i] = as_tagged(0);
-	}
-
-	pool_dbg(pool, "free_pages(%zu) done\n", nr_pages);
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_pool_debugfs.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_pool_debugfs.c
deleted file mode 100644
index 319cf2568aba..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_pool_debugfs.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2015, 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <linux/debugfs.h>
-#include <linux/seq_file.h>
-
-#include <mali_kbase_mem_pool_debugfs.h>
-
-#ifdef CONFIG_DEBUG_FS
-
-static int kbase_mem_pool_debugfs_size_get(void *data, u64 *val)
-{
-	struct kbase_mem_pool *pool = (struct kbase_mem_pool *)data;
-
-	*val = kbase_mem_pool_size(pool);
-
-	return 0;
-}
-
-static int kbase_mem_pool_debugfs_size_set(void *data, u64 val)
-{
-	struct kbase_mem_pool *pool = (struct kbase_mem_pool *)data;
-
-	kbase_mem_pool_trim(pool, val);
-
-	return 0;
-}
-
-DEFINE_SIMPLE_ATTRIBUTE(kbase_mem_pool_debugfs_size_fops,
-		kbase_mem_pool_debugfs_size_get,
-		kbase_mem_pool_debugfs_size_set,
-		"%llu\n");
-
-static int kbase_mem_pool_debugfs_max_size_get(void *data, u64 *val)
-{
-	struct kbase_mem_pool *pool = (struct kbase_mem_pool *)data;
-
-	*val = kbase_mem_pool_max_size(pool);
-
-	return 0;
-}
-
-static int kbase_mem_pool_debugfs_max_size_set(void *data, u64 val)
-{
-	struct kbase_mem_pool *pool = (struct kbase_mem_pool *)data;
-
-	kbase_mem_pool_set_max_size(pool, val);
-
-	return 0;
-}
-
-DEFINE_SIMPLE_ATTRIBUTE(kbase_mem_pool_debugfs_max_size_fops,
-		kbase_mem_pool_debugfs_max_size_get,
-		kbase_mem_pool_debugfs_max_size_set,
-		"%llu\n");
-
-void kbase_mem_pool_debugfs_init(struct dentry *parent,
-		struct kbase_mem_pool *pool,
-		struct kbase_mem_pool *lp_pool)
-{
-	debugfs_create_file("mem_pool_size", S_IRUGO | S_IWUSR, parent,
-			pool, &kbase_mem_pool_debugfs_size_fops);
-
-	debugfs_create_file("mem_pool_max_size", S_IRUGO | S_IWUSR, parent,
-			pool, &kbase_mem_pool_debugfs_max_size_fops);
-
-	debugfs_create_file("lp_mem_pool_size", S_IRUGO | S_IWUSR, parent,
-			lp_pool, &kbase_mem_pool_debugfs_size_fops);
-
-	debugfs_create_file("lp_mem_pool_max_size", S_IRUGO | S_IWUSR, parent,
-			lp_pool, &kbase_mem_pool_debugfs_max_size_fops);
-}
-
-#endif /* CONFIG_DEBUG_FS */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_pool_debugfs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_pool_debugfs.h
deleted file mode 100644
index 496eaf3f1e1a..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_pool_debugfs.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2015, 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KBASE_MEM_POOL_DEBUGFS_H
-#define _KBASE_MEM_POOL_DEBUGFS_H
-
-#include <mali_kbase.h>
-
-/**
- * kbase_mem_pool_debugfs_init - add debugfs knobs for @pool
- * @parent:  Parent debugfs dentry
- * @pool:    Memory pool of small pages to control
- * @lp_pool: Memory pool of large pages to control
- *
- * Adds four debugfs files under @parent:
- * - mem_pool_size: get/set the current size of @pool
- * - mem_pool_max_size: get/set the max size of @pool
- * - lp_mem_pool_size: get/set the current size of @lp_pool
- * - lp_mem_pool_max_size: get/set the max size of @lp_pool
- */
-void kbase_mem_pool_debugfs_init(struct dentry *parent,
-		struct kbase_mem_pool *pool,
-		struct kbase_mem_pool *lp_pool);
-
-#endif  /*_KBASE_MEM_POOL_DEBUGFS_H*/
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_profile_debugfs.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_profile_debugfs.c
deleted file mode 100644
index d58fd8d62fde..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_profile_debugfs.c
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <mali_kbase.h>
-
-#ifdef CONFIG_DEBUG_FS
-
-/** Show callback for the @c mem_profile debugfs file.
- *
- * This function is called to get the contents of the @c mem_profile debugfs
- * file. This is a report of current memory usage and distribution in userspace.
- *
- * @param sfile The debugfs entry
- * @param data Data associated with the entry
- *
- * @return 0 if it successfully prints data in debugfs entry file, non-zero otherwise
- */
-static int kbasep_mem_profile_seq_show(struct seq_file *sfile, void *data)
-{
-	struct kbase_context *kctx = sfile->private;
-
-	mutex_lock(&kctx->mem_profile_lock);
-
-	seq_write(sfile, kctx->mem_profile_data, kctx->mem_profile_size);
-
-	seq_putc(sfile, '\n');
-
-	mutex_unlock(&kctx->mem_profile_lock);
-
-	return 0;
-}
-
-/*
- *  File operations related to debugfs entry for mem_profile
- */
-static int kbasep_mem_profile_debugfs_open(struct inode *in, struct file *file)
-{
-	return single_open(file, kbasep_mem_profile_seq_show, in->i_private);
-}
-
-static const struct file_operations kbasep_mem_profile_debugfs_fops = {
-	.open = kbasep_mem_profile_debugfs_open,
-	.read = seq_read,
-	.llseek = seq_lseek,
-	.release = single_release,
-};
-
-int kbasep_mem_profile_debugfs_insert(struct kbase_context *kctx, char *data,
-					size_t size)
-{
-	int err = 0;
-
-	mutex_lock(&kctx->mem_profile_lock);
-
-	dev_dbg(kctx->kbdev->dev, "initialised: %d",
-		kbase_ctx_flag(kctx, KCTX_MEM_PROFILE_INITIALIZED));
-
-	if (!kbase_ctx_flag(kctx, KCTX_MEM_PROFILE_INITIALIZED)) {
-		if (!debugfs_create_file("mem_profile", S_IRUGO,
-					kctx->kctx_dentry, kctx,
-					&kbasep_mem_profile_debugfs_fops)) {
-			err = -EAGAIN;
-		} else {
-			kbase_ctx_flag_set(kctx,
-					   KCTX_MEM_PROFILE_INITIALIZED);
-		}
-	}
-
-	if (kbase_ctx_flag(kctx, KCTX_MEM_PROFILE_INITIALIZED)) {
-		kfree(kctx->mem_profile_data);
-		kctx->mem_profile_data = data;
-		kctx->mem_profile_size = size;
-	} else {
-		kfree(data);
-	}
-
-	dev_dbg(kctx->kbdev->dev, "returning: %d, initialised: %d",
-		err, kbase_ctx_flag(kctx, KCTX_MEM_PROFILE_INITIALIZED));
-
-	mutex_unlock(&kctx->mem_profile_lock);
-
-	return err;
-}
-
-void kbasep_mem_profile_debugfs_remove(struct kbase_context *kctx)
-{
-	mutex_lock(&kctx->mem_profile_lock);
-
-	dev_dbg(kctx->kbdev->dev, "initialised: %d",
-				kbase_ctx_flag(kctx, KCTX_MEM_PROFILE_INITIALIZED));
-
-	kfree(kctx->mem_profile_data);
-	kctx->mem_profile_data = NULL;
-	kctx->mem_profile_size = 0;
-
-	mutex_unlock(&kctx->mem_profile_lock);
-}
-
-#else /* CONFIG_DEBUG_FS */
-
-int kbasep_mem_profile_debugfs_insert(struct kbase_context *kctx, char *data,
-					size_t size)
-{
-	kfree(data);
-	return 0;
-}
-#endif /* CONFIG_DEBUG_FS */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_profile_debugfs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_profile_debugfs.h
deleted file mode 100644
index a1dc2e0b165b..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_profile_debugfs.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/**
- * @file mali_kbase_mem_profile_debugfs.h
- * Header file for mem profiles entries in debugfs
- *
- */
-
-#ifndef _KBASE_MEM_PROFILE_DEBUGFS_H
-#define _KBASE_MEM_PROFILE_DEBUGFS_H
-
-#include <linux/debugfs.h>
-#include <linux/seq_file.h>
-
-/**
- * @brief Remove entry from Mali memory profile debugfs
- */
-void kbasep_mem_profile_debugfs_remove(struct kbase_context *kctx);
-
-/**
- * @brief Insert @p data to the debugfs file so it can be read by userspace
- *
- * The function takes ownership of @p data and frees it later when new data
- * is inserted.
- *
- * If the debugfs entry corresponding to the @p kctx doesn't exist,
- * an attempt will be made to create it.
- *
- * @param kctx The context whose debugfs file @p data should be inserted to
- * @param data A NULL-terminated string to be inserted to the debugfs file,
- *             without the trailing new line character
- * @param size The length of the @p data string
- * @return 0 if @p data inserted correctly
- *         -EAGAIN in case of error
- * @post @ref mem_profile_initialized will be set to @c true
- *       the first time this function succeeds.
- */
-int kbasep_mem_profile_debugfs_insert(struct kbase_context *kctx, char *data,
-					size_t size);
-
-#endif  /*_KBASE_MEM_PROFILE_DEBUGFS_H*/
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_profile_debugfs_buf_size.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_profile_debugfs_buf_size.h
deleted file mode 100644
index 82f0702974c2..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mem_profile_debugfs_buf_size.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/**
- * @file mali_kbase_mem_profile_debugfs_buf_size.h
- * Header file for the size of the buffer to accumulate the histogram report text in
- */
-
-#ifndef _KBASE_MEM_PROFILE_DEBUGFS_BUF_SIZE_H_
-#define _KBASE_MEM_PROFILE_DEBUGFS_BUF_SIZE_H_
-
-/**
- * The size of the buffer to accumulate the histogram report text in
- * @see @ref CCTXP_HIST_BUF_SIZE_MAX_LENGTH_REPORT
- */
-#define KBASE_MEM_PROFILE_MAX_BUF_SIZE ((size_t) (64 + ((80 + (56 * 64)) * 15) + 56))
-
-#endif  /*_KBASE_MEM_PROFILE_DEBUGFS_BUF_SIZE_H_*/
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu.c
deleted file mode 100644
index c63269aed53c..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu.c
+++ /dev/null
@@ -1,2138 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/**
- * @file mali_kbase_mmu.c
- * Base kernel MMU management.
- */
-
-/* #define DEBUG    1 */
-#include <linux/kernel.h>
-#include <linux/dma-mapping.h>
-#include <mali_kbase.h>
-#include <mali_midg_regmap.h>
-#if defined(CONFIG_MALI_BIFROST_GATOR_SUPPORT)
-#include <mali_kbase_gator.h>
-#endif
-#include <mali_kbase_tlstream.h>
-#include <mali_kbase_instr_defs.h>
-#include <mali_kbase_debug.h>
-
-#define beenthere(kctx, f, a...)  dev_dbg(kctx->kbdev->dev, "%s:" f, __func__, ##a)
-
-#include <mali_kbase_defs.h>
-#include <mali_kbase_hw.h>
-#include <mali_kbase_mmu_hw.h>
-#include <mali_kbase_hwaccess_jm.h>
-#include <mali_kbase_time.h>
-#include <mali_kbase_mem.h>
-
-#define KBASE_MMU_PAGE_ENTRIES 512
-
-/**
- * kbase_mmu_flush_invalidate() - Flush and invalidate the GPU caches.
- * @kctx: The KBase context.
- * @vpfn: The virtual page frame number to start the flush on.
- * @nr: The number of pages to flush.
- * @sync: Set if the operation should be synchronous or not.
- *
- * Issue a cache flush + invalidate to the GPU caches and invalidate the TLBs.
- *
- * If sync is not set then transactions still in flight when the flush is issued
- * may use the old page tables and the data they write will not be written out
- * to memory, this function returns after the flush has been issued but
- * before all accesses which might effect the flushed region have completed.
- *
- * If sync is set then accesses in the flushed region will be drained
- * before data is flush and invalidated through L1, L2 and into memory,
- * after which point this function will return.
- */
-static void kbase_mmu_flush_invalidate(struct kbase_context *kctx,
-		u64 vpfn, size_t nr, bool sync);
-
-/**
- * kbase_mmu_sync_pgd - sync page directory to memory
- * @kbdev:	Device pointer.
- * @handle:	Address of DMA region.
- * @size:       Size of the region to sync.
- *
- * This should be called after each page directory update.
- */
-
-static void kbase_mmu_sync_pgd(struct kbase_device *kbdev,
-		dma_addr_t handle, size_t size)
-{
-	/* If page table is not coherent then ensure the gpu can read
-	 * the pages from memory
-	 */
-	if (kbdev->system_coherency != COHERENCY_ACE)
-		dma_sync_single_for_device(kbdev->dev, handle, size,
-				DMA_TO_DEVICE);
-}
-
-/*
- * Definitions:
- * - PGD: Page Directory.
- * - PTE: Page Table Entry. A 64bit value pointing to the next
- *        level of translation
- * - ATE: Address Transation Entry. A 64bit value pointing to
- *        a 4kB physical page.
- */
-
-static void kbase_mmu_report_fault_and_kill(struct kbase_context *kctx,
-		struct kbase_as *as, const char *reason_str);
-
-
-static size_t make_multiple(size_t minimum, size_t multiple)
-{
-	size_t remainder = minimum % multiple;
-
-	if (remainder == 0)
-		return minimum;
-
-	return minimum + multiple - remainder;
-}
-
-void page_fault_worker(struct work_struct *data)
-{
-	u64 fault_pfn;
-	u32 fault_status;
-	size_t new_pages;
-	size_t fault_rel_pfn;
-	struct kbase_as *faulting_as;
-	int as_no;
-	struct kbase_context *kctx;
-	struct kbase_device *kbdev;
-	struct kbase_va_region *region;
-	int err;
-	bool grown = false;
-
-	faulting_as = container_of(data, struct kbase_as, work_pagefault);
-	fault_pfn = faulting_as->fault_addr >> PAGE_SHIFT;
-	as_no = faulting_as->number;
-
-	kbdev = container_of(faulting_as, struct kbase_device, as[as_no]);
-
-	/* Grab the context that was already refcounted in kbase_mmu_interrupt().
-	 * Therefore, it cannot be scheduled out of this AS until we explicitly release it
-	 */
-	kctx = kbasep_js_runpool_lookup_ctx_noretain(kbdev, as_no);
-	if (WARN_ON(!kctx)) {
-		atomic_dec(&kbdev->faults_pending);
-		return;
-	}
-
-	KBASE_DEBUG_ASSERT(kctx->kbdev == kbdev);
-
-	if (unlikely(faulting_as->protected_mode))
-	{
-		kbase_mmu_report_fault_and_kill(kctx, faulting_as,
-				"Protected mode fault");
-		kbase_mmu_hw_clear_fault(kbdev, faulting_as, kctx,
-				KBASE_MMU_FAULT_TYPE_PAGE);
-
-		goto fault_done;
-	}
-
-	fault_status = faulting_as->fault_status;
-	switch (fault_status & AS_FAULTSTATUS_EXCEPTION_CODE_MASK) {
-
-	case AS_FAULTSTATUS_EXCEPTION_CODE_TRANSLATION_FAULT:
-		/* need to check against the region to handle this one */
-		break;
-
-	case AS_FAULTSTATUS_EXCEPTION_CODE_PERMISSION_FAULT:
-		kbase_mmu_report_fault_and_kill(kctx, faulting_as,
-				"Permission failure");
-		goto fault_done;
-
-	case AS_FAULTSTATUS_EXCEPTION_CODE_TRANSTAB_BUS_FAULT:
-		kbase_mmu_report_fault_and_kill(kctx, faulting_as,
-				"Translation table bus fault");
-		goto fault_done;
-
-	case AS_FAULTSTATUS_EXCEPTION_CODE_ACCESS_FLAG:
-		/* nothing to do, but we don't expect this fault currently */
-		dev_warn(kbdev->dev, "Access flag unexpectedly set");
-		goto fault_done;
-
-	case AS_FAULTSTATUS_EXCEPTION_CODE_ADDRESS_SIZE_FAULT:
-		if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_AARCH64_MMU))
-			kbase_mmu_report_fault_and_kill(kctx, faulting_as,
-					"Address size fault");
-		else
-			kbase_mmu_report_fault_and_kill(kctx, faulting_as,
-					"Unknown fault code");
-		goto fault_done;
-
-	case AS_FAULTSTATUS_EXCEPTION_CODE_MEMORY_ATTRIBUTES_FAULT:
-		if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_AARCH64_MMU))
-			kbase_mmu_report_fault_and_kill(kctx, faulting_as,
-					"Memory attributes fault");
-		else
-			kbase_mmu_report_fault_and_kill(kctx, faulting_as,
-					"Unknown fault code");
-		goto fault_done;
-
-	default:
-		kbase_mmu_report_fault_and_kill(kctx, faulting_as,
-				"Unknown fault code");
-		goto fault_done;
-	}
-
-	/* so we have a translation fault, let's see if it is for growable
-	 * memory */
-	kbase_gpu_vm_lock(kctx);
-
-	region = kbase_region_tracker_find_region_enclosing_address(kctx,
-			faulting_as->fault_addr);
-	if (!region || region->flags & KBASE_REG_FREE) {
-		kbase_gpu_vm_unlock(kctx);
-		kbase_mmu_report_fault_and_kill(kctx, faulting_as,
-				"Memory is not mapped on the GPU");
-		goto fault_done;
-	}
-
-	if (region->gpu_alloc->type == KBASE_MEM_TYPE_IMPORTED_UMM) {
-		kbase_gpu_vm_unlock(kctx);
-		kbase_mmu_report_fault_and_kill(kctx, faulting_as,
-				"DMA-BUF is not mapped on the GPU");
-		goto fault_done;
-	}
-
-	if ((region->flags & GROWABLE_FLAGS_REQUIRED)
-			!= GROWABLE_FLAGS_REQUIRED) {
-		kbase_gpu_vm_unlock(kctx);
-		kbase_mmu_report_fault_and_kill(kctx, faulting_as,
-				"Memory is not growable");
-		goto fault_done;
-	}
-
-	if ((region->flags & KBASE_REG_DONT_NEED)) {
-		kbase_gpu_vm_unlock(kctx);
-		kbase_mmu_report_fault_and_kill(kctx, faulting_as,
-				"Don't need memory can't be grown");
-		goto fault_done;
-	}
-
-	/* find the size we need to grow it by */
-	/* we know the result fit in a size_t due to kbase_region_tracker_find_region_enclosing_address
-	 * validating the fault_adress to be within a size_t from the start_pfn */
-	fault_rel_pfn = fault_pfn - region->start_pfn;
-
-	if (fault_rel_pfn < kbase_reg_current_backed_size(region)) {
-		dev_dbg(kbdev->dev, "Page fault @ 0x%llx in allocated region 0x%llx-0x%llx of growable TMEM: Ignoring",
-				faulting_as->fault_addr, region->start_pfn,
-				region->start_pfn +
-				kbase_reg_current_backed_size(region));
-
-		mutex_lock(&kbdev->mmu_hw_mutex);
-
-		kbase_mmu_hw_clear_fault(kbdev, faulting_as, kctx,
-				KBASE_MMU_FAULT_TYPE_PAGE);
-		/* [1] in case another page fault occurred while we were
-		 * handling the (duplicate) page fault we need to ensure we
-		 * don't loose the other page fault as result of us clearing
-		 * the MMU IRQ. Therefore, after we clear the MMU IRQ we send
-		 * an UNLOCK command that will retry any stalled memory
-		 * transaction (which should cause the other page fault to be
-		 * raised again).
-		 */
-		kbase_mmu_hw_do_operation(kbdev, faulting_as, NULL, 0, 0,
-				AS_COMMAND_UNLOCK, 1);
-
-		mutex_unlock(&kbdev->mmu_hw_mutex);
-
-		kbase_mmu_hw_enable_fault(kbdev, faulting_as, kctx,
-				KBASE_MMU_FAULT_TYPE_PAGE);
-		kbase_gpu_vm_unlock(kctx);
-
-		goto fault_done;
-	}
-
-	new_pages = make_multiple(fault_rel_pfn -
-			kbase_reg_current_backed_size(region) + 1,
-			region->extent);
-
-	/* cap to max vsize */
-	if (new_pages + kbase_reg_current_backed_size(region) >
-			region->nr_pages)
-		new_pages = region->nr_pages -
-				kbase_reg_current_backed_size(region);
-
-	if (0 == new_pages) {
-		mutex_lock(&kbdev->mmu_hw_mutex);
-
-		/* Duplicate of a fault we've already handled, nothing to do */
-		kbase_mmu_hw_clear_fault(kbdev, faulting_as, kctx,
-				KBASE_MMU_FAULT_TYPE_PAGE);
-		/* See comment [1] about UNLOCK usage */
-		kbase_mmu_hw_do_operation(kbdev, faulting_as, NULL, 0, 0,
-				AS_COMMAND_UNLOCK, 1);
-
-		mutex_unlock(&kbdev->mmu_hw_mutex);
-
-		kbase_mmu_hw_enable_fault(kbdev, faulting_as, kctx,
-				KBASE_MMU_FAULT_TYPE_PAGE);
-		kbase_gpu_vm_unlock(kctx);
-		goto fault_done;
-	}
-
-	if (kbase_alloc_phy_pages_helper(region->gpu_alloc, new_pages) == 0) {
-		if (region->gpu_alloc != region->cpu_alloc) {
-			if (kbase_alloc_phy_pages_helper(
-					region->cpu_alloc, new_pages) == 0) {
-				grown = true;
-			} else {
-				kbase_free_phy_pages_helper(region->gpu_alloc,
-						new_pages);
-			}
-		} else {
-			grown = true;
-		}
-	}
-
-
-	if (grown) {
-		u64 pfn_offset;
-		u32 op;
-
-		/* alloc success */
-		KBASE_DEBUG_ASSERT(kbase_reg_current_backed_size(region) <= region->nr_pages);
-
-		/* set up the new pages */
-		pfn_offset = kbase_reg_current_backed_size(region) - new_pages;
-		/*
-		 * Note:
-		 * Issuing an MMU operation will unlock the MMU and cause the
-		 * translation to be replayed. If the page insertion fails then
-		 * rather then trying to continue the context should be killed
-		 * so the no_flush version of insert_pages is used which allows
-		 * us to unlock the MMU as we see fit.
-		 */
-		err = kbase_mmu_insert_pages_no_flush(kctx,
-				region->start_pfn + pfn_offset,
-				&kbase_get_gpu_phy_pages(region)[pfn_offset],
-				new_pages, region->flags);
-		if (err) {
-			kbase_free_phy_pages_helper(region->gpu_alloc, new_pages);
-			if (region->gpu_alloc != region->cpu_alloc)
-				kbase_free_phy_pages_helper(region->cpu_alloc,
-						new_pages);
-			kbase_gpu_vm_unlock(kctx);
-			/* The locked VA region will be unlocked and the cache invalidated in here */
-			kbase_mmu_report_fault_and_kill(kctx, faulting_as,
-					"Page table update failure");
-			goto fault_done;
-		}
-#if defined(CONFIG_MALI_BIFROST_GATOR_SUPPORT)
-		kbase_trace_mali_page_fault_insert_pages(as_no, new_pages);
-#endif
-		KBASE_TLSTREAM_AUX_PAGEFAULT(kctx->id, (u64)new_pages);
-
-		/* AS transaction begin */
-		mutex_lock(&kbdev->mmu_hw_mutex);
-
-		/* flush L2 and unlock the VA (resumes the MMU) */
-		if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_6367))
-			op = AS_COMMAND_FLUSH;
-		else
-			op = AS_COMMAND_FLUSH_PT;
-
-		/* clear MMU interrupt - this needs to be done after updating
-		 * the page tables but before issuing a FLUSH command. The
-		 * FLUSH cmd has a side effect that it restarts stalled memory
-		 * transactions in other address spaces which may cause
-		 * another fault to occur. If we didn't clear the interrupt at
-		 * this stage a new IRQ might not be raised when the GPU finds
-		 * a MMU IRQ is already pending.
-		 */
-		kbase_mmu_hw_clear_fault(kbdev, faulting_as, kctx,
-					 KBASE_MMU_FAULT_TYPE_PAGE);
-
-		kbase_mmu_hw_do_operation(kbdev, faulting_as, kctx,
-					  faulting_as->fault_addr >> PAGE_SHIFT,
-					  new_pages,
-					  op, 1);
-
-		mutex_unlock(&kbdev->mmu_hw_mutex);
-		/* AS transaction end */
-
-		/* reenable this in the mask */
-		kbase_mmu_hw_enable_fault(kbdev, faulting_as, kctx,
-					 KBASE_MMU_FAULT_TYPE_PAGE);
-		kbase_gpu_vm_unlock(kctx);
-	} else {
-		/* failed to extend, handle as a normal PF */
-		kbase_gpu_vm_unlock(kctx);
-		kbase_mmu_report_fault_and_kill(kctx, faulting_as,
-				"Page allocation failure");
-	}
-
-fault_done:
-	/*
-	 * By this point, the fault was handled in some way,
-	 * so release the ctx refcount
-	 */
-	kbasep_js_runpool_release_ctx(kbdev, kctx);
-
-	atomic_dec(&kbdev->faults_pending);
-}
-
-phys_addr_t kbase_mmu_alloc_pgd(struct kbase_context *kctx)
-{
-	u64 *page;
-	int i;
-	struct page *p;
-	int new_page_count __maybe_unused;
-
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-	new_page_count = kbase_atomic_add_pages(1, &kctx->used_pages);
-	kbase_atomic_add_pages(1, &kctx->kbdev->memdev.used_pages);
-
-	p = kbase_mem_pool_alloc(&kctx->mem_pool);
-	if (!p)
-		goto sub_pages;
-
-	KBASE_TLSTREAM_AUX_PAGESALLOC(
-			kctx->id,
-			(u64)new_page_count);
-
-	page = kmap(p);
-	if (NULL == page)
-		goto alloc_free;
-
-	kbase_process_page_usage_inc(kctx, 1);
-
-	for (i = 0; i < KBASE_MMU_PAGE_ENTRIES; i++)
-		kctx->kbdev->mmu_mode->entry_invalidate(&page[i]);
-
-	kbase_mmu_sync_pgd(kctx->kbdev, kbase_dma_addr(p), PAGE_SIZE);
-
-	kunmap(p);
-	return page_to_phys(p);
-
-alloc_free:
-	kbase_mem_pool_free(&kctx->mem_pool, p, false);
-sub_pages:
-	kbase_atomic_sub_pages(1, &kctx->used_pages);
-	kbase_atomic_sub_pages(1, &kctx->kbdev->memdev.used_pages);
-
-	return 0;
-}
-
-KBASE_EXPORT_TEST_API(kbase_mmu_alloc_pgd);
-
-/* Given PGD PFN for level N, return PGD PFN for level N+1, allocating the
- * new table from the pool if needed and possible
- */
-static int mmu_get_next_pgd(struct kbase_context *kctx,
-		phys_addr_t *pgd, u64 vpfn, int level)
-{
-	u64 *page;
-	phys_addr_t target_pgd;
-	struct page *p;
-
-	KBASE_DEBUG_ASSERT(*pgd);
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-
-	lockdep_assert_held(&kctx->mmu_lock);
-
-	/*
-	 * Architecture spec defines level-0 as being the top-most.
-	 * This is a bit unfortunate here, but we keep the same convention.
-	 */
-	vpfn >>= (3 - level) * 9;
-	vpfn &= 0x1FF;
-
-	p = pfn_to_page(PFN_DOWN(*pgd));
-	page = kmap(p);
-	if (NULL == page) {
-		dev_warn(kctx->kbdev->dev, "mmu_get_next_pgd: kmap failure\n");
-		return -EINVAL;
-	}
-
-	target_pgd = kctx->kbdev->mmu_mode->pte_to_phy_addr(page[vpfn]);
-
-	if (!target_pgd) {
-		target_pgd = kbase_mmu_alloc_pgd(kctx);
-		if (!target_pgd) {
-			dev_dbg(kctx->kbdev->dev, "mmu_get_next_pgd: kbase_mmu_alloc_pgd failure\n");
-			kunmap(p);
-			return -ENOMEM;
-		}
-
-		kctx->kbdev->mmu_mode->entry_set_pte(&page[vpfn], target_pgd);
-
-		kbase_mmu_sync_pgd(kctx->kbdev, kbase_dma_addr(p), PAGE_SIZE);
-		/* Rely on the caller to update the address space flags. */
-	}
-
-	kunmap(p);
-	*pgd = target_pgd;
-
-	return 0;
-}
-
-/*
- * Returns the PGD for the specified level of translation
- */
-static int mmu_get_pgd_at_level(struct kbase_context *kctx,
-					u64 vpfn,
-					unsigned int level,
-					phys_addr_t *out_pgd)
-{
-	phys_addr_t pgd;
-	int l;
-
-	lockdep_assert_held(&kctx->mmu_lock);
-	pgd = kctx->pgd;
-
-	for (l = MIDGARD_MMU_TOPLEVEL; l < level; l++) {
-		int err = mmu_get_next_pgd(kctx, &pgd, vpfn, l);
-		/* Handle failure condition */
-		if (err) {
-			dev_dbg(kctx->kbdev->dev,
-				 "%s: mmu_get_next_pgd failure at level %d\n",
-				 __func__, l);
-			return err;
-		}
-	}
-
-	*out_pgd = pgd;
-
-	return 0;
-}
-
-#define mmu_get_bottom_pgd(kctx, vpfn, out_pgd) \
-	mmu_get_pgd_at_level((kctx), (vpfn), MIDGARD_MMU_BOTTOMLEVEL, (out_pgd))
-
-
-static void mmu_insert_pages_failure_recovery(struct kbase_context *kctx,
-					      u64 from_vpfn, u64 to_vpfn)
-{
-	phys_addr_t pgd;
-	u64 vpfn = from_vpfn;
-	struct kbase_mmu_mode const *mmu_mode;
-
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-	KBASE_DEBUG_ASSERT(0 != vpfn);
-	/* 64-bit address range is the max */
-	KBASE_DEBUG_ASSERT(vpfn <= (U64_MAX / PAGE_SIZE));
-	KBASE_DEBUG_ASSERT(from_vpfn <= to_vpfn);
-
-	lockdep_assert_held(&kctx->mmu_lock);
-	lockdep_assert_held(&kctx->reg_lock);
-
-	mmu_mode = kctx->kbdev->mmu_mode;
-
-	while (vpfn < to_vpfn) {
-		unsigned int i;
-		unsigned int idx = vpfn & 0x1FF;
-		unsigned int count = KBASE_MMU_PAGE_ENTRIES - idx;
-		unsigned int pcount = 0;
-		unsigned int left = to_vpfn - vpfn;
-		unsigned int level;
-		u64 *page;
-
-		if (count > left)
-			count = left;
-
-		/* need to check if this is a 2MB page or a 4kB */
-		pgd = kctx->pgd;
-
-		for (level = MIDGARD_MMU_TOPLEVEL;
-				level <= MIDGARD_MMU_BOTTOMLEVEL; level++) {
-			idx = (vpfn >> ((3 - level) * 9)) & 0x1FF;
-			page = kmap(phys_to_page(pgd));
-			if (mmu_mode->ate_is_valid(page[idx], level))
-				break; /* keep the mapping */
-			kunmap(phys_to_page(pgd));
-			pgd = mmu_mode->pte_to_phy_addr(page[idx]);
-		}
-
-		switch (level) {
-		case MIDGARD_MMU_LEVEL(2):
-			/* remap to single entry to update */
-			pcount = 1;
-			break;
-		case MIDGARD_MMU_BOTTOMLEVEL:
-			/* page count is the same as the logical count */
-			pcount = count;
-			break;
-		default:
-			dev_warn(kctx->kbdev->dev, "%sNo support for ATEs at level %d\n",
-			       __func__, level);
-			goto next;
-		}
-
-		/* Invalidate the entries we added */
-		for (i = 0; i < pcount; i++)
-			mmu_mode->entry_invalidate(&page[idx + i]);
-
-		kbase_mmu_sync_pgd(kctx->kbdev,
-				   kbase_dma_addr(phys_to_page(pgd)) + 8 * idx,
-				   8 * pcount);
-		kunmap(phys_to_page(pgd));
-
-next:
-		vpfn += count;
-	}
-}
-
-/*
- * Map the single page 'phys' 'nr' of times, starting at GPU PFN 'vpfn'
- */
-int kbase_mmu_insert_single_page(struct kbase_context *kctx, u64 vpfn,
-					struct tagged_addr phys, size_t nr,
-					unsigned long flags)
-{
-	phys_addr_t pgd;
-	u64 *pgd_page;
-	/* In case the insert_single_page only partially completes we need to be
-	 * able to recover */
-	bool recover_required = false;
-	u64 recover_vpfn = vpfn;
-	size_t recover_count = 0;
-	size_t remain = nr;
-	int err;
-	struct kbase_mmu_mode const *mmu_mode;
-
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-	KBASE_DEBUG_ASSERT(0 != vpfn);
-	/* 64-bit address range is the max */
-	KBASE_DEBUG_ASSERT(vpfn <= (U64_MAX / PAGE_SIZE));
-
-	mmu_mode = kctx->kbdev->mmu_mode;
-
-	/* Early out if there is nothing to do */
-	if (nr == 0)
-		return 0;
-
-	mutex_lock(&kctx->mmu_lock);
-
-	while (remain) {
-		unsigned int i;
-		unsigned int index = vpfn & 0x1FF;
-		unsigned int count = KBASE_MMU_PAGE_ENTRIES - index;
-		struct page *p;
-
-		if (count > remain)
-			count = remain;
-
-		/*
-		 * Repeatedly calling mmu_get_bottom_pte() is clearly
-		 * suboptimal. We don't have to re-parse the whole tree
-		 * each time (just cache the l0-l2 sequence).
-		 * On the other hand, it's only a gain when we map more than
-		 * 256 pages at once (on average). Do we really care?
-		 */
-		do {
-			err = mmu_get_bottom_pgd(kctx, vpfn, &pgd);
-			if (err != -ENOMEM)
-				break;
-			/* Fill the memory pool with enough pages for
-			 * the page walk to succeed
-			 */
-			mutex_unlock(&kctx->mmu_lock);
-			err = kbase_mem_pool_grow(&kctx->mem_pool,
-					MIDGARD_MMU_BOTTOMLEVEL);
-			mutex_lock(&kctx->mmu_lock);
-		} while (!err);
-		if (err) {
-			dev_warn(kctx->kbdev->dev, "kbase_mmu_insert_pages: mmu_get_bottom_pgd failure\n");
-			if (recover_required) {
-				/* Invalidate the pages we have partially
-				 * completed */
-				mmu_insert_pages_failure_recovery(kctx,
-								  recover_vpfn,
-								  recover_vpfn +
-								  recover_count
-								  );
-			}
-			goto fail_unlock;
-		}
-
-		p = pfn_to_page(PFN_DOWN(pgd));
-		pgd_page = kmap(p);
-		if (!pgd_page) {
-			dev_warn(kctx->kbdev->dev, "kbase_mmu_insert_pages: kmap failure\n");
-			if (recover_required) {
-				/* Invalidate the pages we have partially
-				 * completed */
-				mmu_insert_pages_failure_recovery(kctx,
-								  recover_vpfn,
-								  recover_vpfn +
-								  recover_count
-								  );
-			}
-			err = -ENOMEM;
-			goto fail_unlock;
-		}
-
-		for (i = 0; i < count; i++) {
-			unsigned int ofs = index + i;
-
-			/* Fail if the current page is a valid ATE entry */
-			KBASE_DEBUG_ASSERT(0 == (pgd_page[ofs] & 1UL));
-
-			mmu_mode->entry_set_ate(&pgd_page[ofs],
-						phys, flags,
-						MIDGARD_MMU_BOTTOMLEVEL);
-		}
-
-		vpfn += count;
-		remain -= count;
-
-		kbase_mmu_sync_pgd(kctx->kbdev,
-				kbase_dma_addr(p) + (index * sizeof(u64)),
-				count * sizeof(u64));
-
-		kunmap(p);
-		/* We have started modifying the page table.
-		 * If further pages need inserting and fail we need to undo what
-		 * has already taken place */
-		recover_required = true;
-		recover_count += count;
-	}
-	mutex_unlock(&kctx->mmu_lock);
-	kbase_mmu_flush_invalidate(kctx, vpfn, nr, false);
-	return 0;
-
-fail_unlock:
-	mutex_unlock(&kctx->mmu_lock);
-	kbase_mmu_flush_invalidate(kctx, vpfn, nr, false);
-	return err;
-}
-
-static inline void cleanup_empty_pte(struct kbase_context *kctx, u64 *pte)
-{
-	phys_addr_t tmp_pgd;
-	struct page *tmp_p;
-
-	tmp_pgd = kctx->kbdev->mmu_mode->pte_to_phy_addr(*pte);
-	tmp_p = phys_to_page(tmp_pgd);
-	kbase_mem_pool_free(&kctx->mem_pool, tmp_p, false);
-	kbase_process_page_usage_dec(kctx, 1);
-	kbase_atomic_sub_pages(1, &kctx->used_pages);
-	kbase_atomic_sub_pages(1, &kctx->kbdev->memdev.used_pages);
-}
-
-int kbase_mmu_insert_pages_no_flush(struct kbase_context *kctx,
-				    const u64 start_vpfn,
-				    struct tagged_addr *phys, size_t nr,
-				    unsigned long flags)
-{
-	phys_addr_t pgd;
-	u64 *pgd_page;
-	u64 insert_vpfn = start_vpfn;
-	size_t remain = nr;
-	int err;
-	struct kbase_mmu_mode const *mmu_mode;
-
-	KBASE_DEBUG_ASSERT(kctx);
-	KBASE_DEBUG_ASSERT(start_vpfn);
-	/* 64-bit address range is the max */
-	KBASE_DEBUG_ASSERT(start_vpfn <= (U64_MAX / PAGE_SIZE));
-
-	mmu_mode = kctx->kbdev->mmu_mode;
-
-	/* Early out if there is nothing to do */
-	if (nr == 0)
-		return 0;
-
-	mutex_lock(&kctx->mmu_lock);
-
-	while (remain) {
-		unsigned int i;
-		unsigned int vindex = insert_vpfn & 0x1FF;
-		unsigned int count = KBASE_MMU_PAGE_ENTRIES - vindex;
-		struct page *p;
-		unsigned int cur_level;
-
-		if (count > remain)
-			count = remain;
-
-		if (!vindex && is_huge_head(*phys))
-			cur_level = MIDGARD_MMU_LEVEL(2);
-		else
-			cur_level = MIDGARD_MMU_BOTTOMLEVEL;
-
-		/*
-		 * Repeatedly calling mmu_get_pgd_at_level() is clearly
-		 * suboptimal. We don't have to re-parse the whole tree
-		 * each time (just cache the l0-l2 sequence).
-		 * On the other hand, it's only a gain when we map more than
-		 * 256 pages at once (on average). Do we really care?
-		 */
-		do {
-			err = mmu_get_pgd_at_level(kctx, insert_vpfn, cur_level,
-						   &pgd);
-			if (err != -ENOMEM)
-				break;
-			/* Fill the memory pool with enough pages for
-			 * the page walk to succeed
-			 */
-			mutex_unlock(&kctx->mmu_lock);
-			err = kbase_mem_pool_grow(&kctx->mem_pool,
-					cur_level);
-			mutex_lock(&kctx->mmu_lock);
-		} while (!err);
-
-		if (err) {
-			dev_warn(kctx->kbdev->dev,
-				 "%s: mmu_get_bottom_pgd failure\n", __func__);
-			if (insert_vpfn != start_vpfn) {
-				/* Invalidate the pages we have partially
-				 * completed */
-				mmu_insert_pages_failure_recovery(kctx,
-								  start_vpfn,
-								  insert_vpfn);
-			}
-			goto fail_unlock;
-		}
-
-		p = pfn_to_page(PFN_DOWN(pgd));
-		pgd_page = kmap(p);
-		if (!pgd_page) {
-			dev_warn(kctx->kbdev->dev, "%s: kmap failure\n",
-				 __func__);
-			if (insert_vpfn != start_vpfn) {
-				/* Invalidate the pages we have partially
-				 * completed */
-				mmu_insert_pages_failure_recovery(kctx,
-								  start_vpfn,
-								  insert_vpfn);
-			}
-			err = -ENOMEM;
-			goto fail_unlock;
-		}
-
-		if (cur_level == MIDGARD_MMU_LEVEL(2)) {
-			unsigned int level_index = (insert_vpfn >> 9) & 0x1FF;
-			u64 *target = &pgd_page[level_index];
-
-			if (mmu_mode->pte_is_valid(*target, cur_level))
-				cleanup_empty_pte(kctx, target);
-			mmu_mode->entry_set_ate(target, *phys, flags,
-						cur_level);
-		} else {
-			for (i = 0; i < count; i++) {
-				unsigned int ofs = vindex + i;
-				u64 *target = &pgd_page[ofs];
-
-				/* Fail if the current page is a valid ATE entry
-				 */
-				KBASE_DEBUG_ASSERT(0 == (*target & 1UL));
-
-				kctx->kbdev->mmu_mode->entry_set_ate(target,
-						phys[i], flags, cur_level);
-			}
-		}
-
-		phys += count;
-		insert_vpfn += count;
-		remain -= count;
-
-		kbase_mmu_sync_pgd(kctx->kbdev,
-				kbase_dma_addr(p) + (vindex * sizeof(u64)),
-				count * sizeof(u64));
-
-		kunmap(p);
-	}
-
-	mutex_unlock(&kctx->mmu_lock);
-	return 0;
-
-fail_unlock:
-	mutex_unlock(&kctx->mmu_lock);
-	return err;
-}
-
-/*
- * Map 'nr' pages pointed to by 'phys' at GPU PFN 'vpfn'
- */
-int kbase_mmu_insert_pages(struct kbase_context *kctx, u64 vpfn,
-				  struct tagged_addr *phys, size_t nr,
-				  unsigned long flags)
-{
-	int err;
-
-	err = kbase_mmu_insert_pages_no_flush(kctx, vpfn, phys, nr, flags);
-	kbase_mmu_flush_invalidate(kctx, vpfn, nr, false);
-	return err;
-}
-
-KBASE_EXPORT_TEST_API(kbase_mmu_insert_pages);
-
-/**
- * kbase_mmu_flush_invalidate_noretain() - Flush and invalidate the GPU caches
- * without retaining the kbase context.
- * @kctx: The KBase context.
- * @vpfn: The virtual page frame number to start the flush on.
- * @nr: The number of pages to flush.
- * @sync: Set if the operation should be synchronous or not.
- *
- * As per kbase_mmu_flush_invalidate but doesn't retain the kctx or do any
- * other locking.
- */
-static void kbase_mmu_flush_invalidate_noretain(struct kbase_context *kctx,
-		u64 vpfn, size_t nr, bool sync)
-{
-	struct kbase_device *kbdev = kctx->kbdev;
-	int err;
-	u32 op;
-
-	/* Early out if there is nothing to do */
-	if (nr == 0)
-		return;
-
-	if (sync)
-		op = AS_COMMAND_FLUSH_MEM;
-	else
-		op = AS_COMMAND_FLUSH_PT;
-
-	err = kbase_mmu_hw_do_operation(kbdev,
-				&kbdev->as[kctx->as_nr],
-				kctx, vpfn, nr, op, 0);
-#if KBASE_GPU_RESET_EN
-	if (err) {
-		/* Flush failed to complete, assume the
-		 * GPU has hung and perform a reset to
-		 * recover */
-		dev_err(kbdev->dev, "Flush for GPU page table update did not complete. Issuing GPU soft-reset to recover\n");
-
-		if (kbase_prepare_to_reset_gpu_locked(kbdev))
-			kbase_reset_gpu_locked(kbdev);
-	}
-#endif /* KBASE_GPU_RESET_EN */
-
-#ifndef CONFIG_MALI_BIFROST_NO_MALI
-	/*
-	 * As this function could be called in interrupt context the sync
-	 * request can't block. Instead log the request and the next flush
-	 * request will pick it up.
-	 */
-	if ((!err) && sync &&
-			kbase_hw_has_issue(kctx->kbdev, BASE_HW_ISSUE_6367))
-		atomic_set(&kctx->drain_pending, 1);
-#endif /* !CONFIG_MALI_BIFROST_NO_MALI */
-}
-
-static void kbase_mmu_flush_invalidate(struct kbase_context *kctx,
-		u64 vpfn, size_t nr, bool sync)
-{
-	struct kbase_device *kbdev;
-	bool ctx_is_in_runpool;
-#ifndef CONFIG_MALI_BIFROST_NO_MALI
-	bool drain_pending = false;
-
-	if (atomic_xchg(&kctx->drain_pending, 0))
-		drain_pending = true;
-#endif /* !CONFIG_MALI_BIFROST_NO_MALI */
-
-	/* Early out if there is nothing to do */
-	if (nr == 0)
-		return;
-
-	kbdev = kctx->kbdev;
-	mutex_lock(&kbdev->js_data.queue_mutex);
-	ctx_is_in_runpool = kbasep_js_runpool_retain_ctx(kbdev, kctx);
-	mutex_unlock(&kbdev->js_data.queue_mutex);
-
-	if (ctx_is_in_runpool) {
-		KBASE_DEBUG_ASSERT(kctx->as_nr != KBASEP_AS_NR_INVALID);
-
-		if (!kbase_pm_context_active_handle_suspend(kbdev,
-			KBASE_PM_SUSPEND_HANDLER_DONT_REACTIVATE)) {
-			int err;
-			u32 op;
-
-			/* AS transaction begin */
-			mutex_lock(&kbdev->mmu_hw_mutex);
-
-			if (sync)
-				op = AS_COMMAND_FLUSH_MEM;
-			else
-				op = AS_COMMAND_FLUSH_PT;
-
-			err = kbase_mmu_hw_do_operation(kbdev,
-						&kbdev->as[kctx->as_nr],
-						kctx, vpfn, nr, op, 0);
-
-#if KBASE_GPU_RESET_EN
-			if (err) {
-				/* Flush failed to complete, assume the
-				 * GPU has hung and perform a reset to
-				 * recover */
-				dev_err(kbdev->dev, "Flush for GPU page table update did not complete. Issueing GPU soft-reset to recover\n");
-
-				if (kbase_prepare_to_reset_gpu(kbdev))
-					kbase_reset_gpu(kbdev);
-			}
-#endif /* KBASE_GPU_RESET_EN */
-
-			mutex_unlock(&kbdev->mmu_hw_mutex);
-			/* AS transaction end */
-
-#ifndef CONFIG_MALI_BIFROST_NO_MALI
-			/*
-			 * The transaction lock must be dropped before here
-			 * as kbase_wait_write_flush could take it if
-			 * the GPU was powered down (static analysis doesn't
-			 * know this can't happen).
-			 */
-			drain_pending |= (!err) && sync &&
-					kbase_hw_has_issue(kctx->kbdev,
-							BASE_HW_ISSUE_6367);
-			if (drain_pending) {
-				/* Wait for GPU to flush write buffer */
-				kbase_wait_write_flush(kctx);
-			}
-#endif /* !CONFIG_MALI_BIFROST_NO_MALI */
-
-			kbase_pm_context_idle(kbdev);
-		}
-		kbasep_js_runpool_release_ctx(kbdev, kctx);
-	}
-}
-
-void kbase_mmu_update(struct kbase_context *kctx)
-{
-	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
-	lockdep_assert_held(&kctx->kbdev->mmu_hw_mutex);
-	/* ASSERT that the context has a valid as_nr, which is only the case
-	 * when it's scheduled in.
-	 *
-	 * as_nr won't change because the caller has the hwaccess_lock */
-	KBASE_DEBUG_ASSERT(kctx->as_nr != KBASEP_AS_NR_INVALID);
-
-	kctx->kbdev->mmu_mode->update(kctx);
-}
-KBASE_EXPORT_TEST_API(kbase_mmu_update);
-
-void kbase_mmu_disable_as(struct kbase_device *kbdev, int as_nr)
-{
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-	lockdep_assert_held(&kbdev->mmu_hw_mutex);
-
-	kbdev->mmu_mode->disable_as(kbdev, as_nr);
-}
-
-void kbase_mmu_disable(struct kbase_context *kctx)
-{
-	/* ASSERT that the context has a valid as_nr, which is only the case
-	 * when it's scheduled in.
-	 *
-	 * as_nr won't change because the caller has the hwaccess_lock */
-	KBASE_DEBUG_ASSERT(kctx->as_nr != KBASEP_AS_NR_INVALID);
-
-	lockdep_assert_held(&kctx->kbdev->hwaccess_lock);
-
-	/*
-	 * The address space is being disabled, drain all knowledge of it out
-	 * from the caches as pages and page tables might be freed after this.
-	 *
-	 * The job scheduler code will already be holding the locks and context
-	 * so just do the flush.
-	 */
-	kbase_mmu_flush_invalidate_noretain(kctx, 0, ~0, true);
-
-	kctx->kbdev->mmu_mode->disable_as(kctx->kbdev, kctx->as_nr);
-}
-KBASE_EXPORT_TEST_API(kbase_mmu_disable);
-
-/*
- * We actually only discard the ATE, and not the page table
- * pages. There is a potential DoS here, as we'll leak memory by
- * having PTEs that are potentially unused.  Will require physical
- * page accounting, so MMU pages are part of the process allocation.
- *
- * IMPORTANT: This uses kbasep_js_runpool_release_ctx() when the context is
- * currently scheduled into the runpool, and so potentially uses a lot of locks.
- * These locks must be taken in the correct order with respect to others
- * already held by the caller. Refer to kbasep_js_runpool_release_ctx() for more
- * information.
- */
-int kbase_mmu_teardown_pages(struct kbase_context *kctx, u64 vpfn, size_t nr)
-{
-	phys_addr_t pgd;
-	size_t requested_nr = nr;
-	struct kbase_mmu_mode const *mmu_mode;
-	int err = -EFAULT;
-
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-	beenthere(kctx, "kctx %p vpfn %lx nr %zd", (void *)kctx, (unsigned long)vpfn, nr);
-
-	if (0 == nr) {
-		/* early out if nothing to do */
-		return 0;
-	}
-
-	mutex_lock(&kctx->mmu_lock);
-
-	mmu_mode = kctx->kbdev->mmu_mode;
-
-	while (nr) {
-		unsigned int i;
-		unsigned int index = vpfn & 0x1FF;
-		unsigned int count = KBASE_MMU_PAGE_ENTRIES - index;
-		unsigned int pcount;
-		unsigned int level;
-		u64 *page;
-
-		if (count > nr)
-			count = nr;
-
-		/* need to check if this is a 2MB or a 4kB page */
-		pgd = kctx->pgd;
-
-		for (level = MIDGARD_MMU_TOPLEVEL;
-				level <= MIDGARD_MMU_BOTTOMLEVEL; level++) {
-			phys_addr_t next_pgd;
-
-			index = (vpfn >> ((3 - level) * 9)) & 0x1FF;
-			page = kmap(phys_to_page(pgd));
-			if (mmu_mode->ate_is_valid(page[index], level))
-				break; /* keep the mapping */
-			else if (!mmu_mode->pte_is_valid(page[index], level)) {
-				/* nothing here, advance */
-				switch (level) {
-				case MIDGARD_MMU_LEVEL(0):
-					count = 134217728;
-					break;
-				case MIDGARD_MMU_LEVEL(1):
-					count = 262144;
-					break;
-				case MIDGARD_MMU_LEVEL(2):
-					count = 512;
-					break;
-				case MIDGARD_MMU_LEVEL(3):
-					count = 1;
-					break;
-				}
-				if (count > nr)
-					count = nr;
-				goto next;
-			}
-			next_pgd = mmu_mode->pte_to_phy_addr(page[index]);
-			kunmap(phys_to_page(pgd));
-			pgd = next_pgd;
-		}
-
-		switch (level) {
-		case MIDGARD_MMU_LEVEL(0):
-		case MIDGARD_MMU_LEVEL(1):
-			dev_warn(kctx->kbdev->dev,
-				 "%s: No support for ATEs at level %d\n",
-				 __func__, level);
-			kunmap(phys_to_page(pgd));
-			goto out;
-		case MIDGARD_MMU_LEVEL(2):
-			/* can only teardown if count >= 512 */
-			if (count >= 512) {
-				pcount = 1;
-			} else {
-				dev_warn(kctx->kbdev->dev,
-					 "%s: limiting teardown as it tries to do a partial 2MB teardown, need 512, but have %d to tear down\n",
-					 __func__, count);
-				pcount = 0;
-			}
-			break;
-		case MIDGARD_MMU_BOTTOMLEVEL:
-			/* page count is the same as the logical count */
-			pcount = count;
-			break;
-		default:
-			dev_err(kctx->kbdev->dev,
-				"%s: found non-mapped memory, early out\n",
-				__func__);
-			vpfn += count;
-			nr -= count;
-			continue;
-		}
-
-		/* Invalidate the entries we added */
-		for (i = 0; i < pcount; i++)
-			mmu_mode->entry_invalidate(&page[index + i]);
-
-		kbase_mmu_sync_pgd(kctx->kbdev,
-				   kbase_dma_addr(phys_to_page(pgd)) +
-				   8 * index, 8*pcount);
-
-next:
-		kunmap(phys_to_page(pgd));
-		vpfn += count;
-		nr -= count;
-	}
-	err = 0;
-out:
-	mutex_unlock(&kctx->mmu_lock);
-	kbase_mmu_flush_invalidate(kctx, vpfn, requested_nr, true);
-	return err;
-}
-
-KBASE_EXPORT_TEST_API(kbase_mmu_teardown_pages);
-
-/**
- * Update the entries for specified number of pages pointed to by 'phys' at GPU PFN 'vpfn'.
- * This call is being triggered as a response to the changes of the mem attributes
- *
- * @pre : The caller is responsible for validating the memory attributes
- *
- * IMPORTANT: This uses kbasep_js_runpool_release_ctx() when the context is
- * currently scheduled into the runpool, and so potentially uses a lot of locks.
- * These locks must be taken in the correct order with respect to others
- * already held by the caller. Refer to kbasep_js_runpool_release_ctx() for more
- * information.
- */
-int kbase_mmu_update_pages(struct kbase_context *kctx, u64 vpfn,
-			   struct tagged_addr *phys, size_t nr,
-			   unsigned long flags)
-{
-	phys_addr_t pgd;
-	u64 *pgd_page;
-	size_t requested_nr = nr;
-	struct kbase_mmu_mode const *mmu_mode;
-	int err;
-
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-	KBASE_DEBUG_ASSERT(0 != vpfn);
-	KBASE_DEBUG_ASSERT(vpfn <= (U64_MAX / PAGE_SIZE));
-
-	/* Early out if there is nothing to do */
-	if (nr == 0)
-		return 0;
-
-	mutex_lock(&kctx->mmu_lock);
-
-	mmu_mode = kctx->kbdev->mmu_mode;
-
-	dev_warn(kctx->kbdev->dev, "kbase_mmu_update_pages(): updating page share flags on GPU PFN 0x%llx from phys %p, %zu pages",
-			vpfn, phys, nr);
-
-	while (nr) {
-		unsigned int i;
-		unsigned int index = vpfn & 0x1FF;
-		size_t count = KBASE_MMU_PAGE_ENTRIES - index;
-		struct page *p;
-
-		if (count > nr)
-			count = nr;
-
-		do {
-			err = mmu_get_bottom_pgd(kctx, vpfn, &pgd);
-			if (err != -ENOMEM)
-				break;
-			/* Fill the memory pool with enough pages for
-			 * the page walk to succeed
-			 */
-			mutex_unlock(&kctx->mmu_lock);
-			err = kbase_mem_pool_grow(&kctx->mem_pool,
-					MIDGARD_MMU_BOTTOMLEVEL);
-			mutex_lock(&kctx->mmu_lock);
-		} while (!err);
-		if (err) {
-			dev_warn(kctx->kbdev->dev,
-				 "mmu_get_bottom_pgd failure\n");
-			goto fail_unlock;
-		}
-
-		p = pfn_to_page(PFN_DOWN(pgd));
-		pgd_page = kmap(p);
-		if (!pgd_page) {
-			dev_warn(kctx->kbdev->dev, "kmap failure\n");
-			err = -ENOMEM;
-			goto fail_unlock;
-		}
-
-		for (i = 0; i < count; i++)
-			mmu_mode->entry_set_ate(&pgd_page[index + i], phys[i],
-						flags, MIDGARD_MMU_BOTTOMLEVEL);
-
-		phys += count;
-		vpfn += count;
-		nr -= count;
-
-		kbase_mmu_sync_pgd(kctx->kbdev,
-				kbase_dma_addr(p) + (index * sizeof(u64)),
-				count * sizeof(u64));
-
-		kunmap(pfn_to_page(PFN_DOWN(pgd)));
-	}
-
-	mutex_unlock(&kctx->mmu_lock);
-	kbase_mmu_flush_invalidate(kctx, vpfn, requested_nr, true);
-	return 0;
-
-fail_unlock:
-	mutex_unlock(&kctx->mmu_lock);
-	kbase_mmu_flush_invalidate(kctx, vpfn, requested_nr, true);
-	return err;
-}
-
-static void mmu_teardown_level(struct kbase_context *kctx, phys_addr_t pgd,
-			       int level, u64 *pgd_page_buffer)
-{
-	phys_addr_t target_pgd;
-	struct page *p;
-	u64 *pgd_page;
-	int i;
-	struct kbase_mmu_mode const *mmu_mode;
-
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-	lockdep_assert_held(&kctx->mmu_lock);
-	lockdep_assert_held(&kctx->reg_lock);
-
-	pgd_page = kmap_atomic(pfn_to_page(PFN_DOWN(pgd)));
-	/* kmap_atomic should NEVER fail. */
-	KBASE_DEBUG_ASSERT(NULL != pgd_page);
-	/* Copy the page to our preallocated buffer so that we can minimize
-	 * kmap_atomic usage */
-	memcpy(pgd_page_buffer, pgd_page, PAGE_SIZE);
-	kunmap_atomic(pgd_page);
-	pgd_page = pgd_page_buffer;
-
-	mmu_mode = kctx->kbdev->mmu_mode;
-
-	for (i = 0; i < KBASE_MMU_PAGE_ENTRIES; i++) {
-		target_pgd = mmu_mode->pte_to_phy_addr(pgd_page[i]);
-
-		if (target_pgd) {
-			if (mmu_mode->pte_is_valid(pgd_page[i], level)) {
-				mmu_teardown_level(kctx,
-						   target_pgd,
-						   level + 1,
-						   pgd_page_buffer +
-						   (PAGE_SIZE / sizeof(u64)));
-			}
-		}
-	}
-
-	p = pfn_to_page(PFN_DOWN(pgd));
-	kbase_mem_pool_free(&kctx->mem_pool, p, true);
-	kbase_process_page_usage_dec(kctx, 1);
-	kbase_atomic_sub_pages(1, &kctx->used_pages);
-	kbase_atomic_sub_pages(1, &kctx->kbdev->memdev.used_pages);
-}
-
-int kbase_mmu_init(struct kbase_context *kctx)
-{
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-	KBASE_DEBUG_ASSERT(NULL == kctx->mmu_teardown_pages);
-
-	mutex_init(&kctx->mmu_lock);
-
-	/* Preallocate MMU depth of four pages for mmu_teardown_level to use */
-	kctx->mmu_teardown_pages = kmalloc(PAGE_SIZE * 4, GFP_KERNEL);
-
-	if (NULL == kctx->mmu_teardown_pages)
-		return -ENOMEM;
-
-	return 0;
-}
-
-void kbase_mmu_term(struct kbase_context *kctx)
-{
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-	KBASE_DEBUG_ASSERT(NULL != kctx->mmu_teardown_pages);
-
-	kfree(kctx->mmu_teardown_pages);
-	kctx->mmu_teardown_pages = NULL;
-}
-
-void kbase_mmu_free_pgd(struct kbase_context *kctx)
-{
-	int new_page_count = 0;
-
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-	KBASE_DEBUG_ASSERT(NULL != kctx->mmu_teardown_pages);
-
-	mutex_lock(&kctx->mmu_lock);
-	mmu_teardown_level(kctx, kctx->pgd, MIDGARD_MMU_TOPLEVEL,
-			   kctx->mmu_teardown_pages);
-	mutex_unlock(&kctx->mmu_lock);
-
-	KBASE_TLSTREAM_AUX_PAGESALLOC(
-			kctx->id,
-			(u64)new_page_count);
-}
-
-KBASE_EXPORT_TEST_API(kbase_mmu_free_pgd);
-
-static size_t kbasep_mmu_dump_level(struct kbase_context *kctx, phys_addr_t pgd, int level, char ** const buffer, size_t *size_left)
-{
-	phys_addr_t target_pgd;
-	u64 *pgd_page;
-	int i;
-	size_t size = KBASE_MMU_PAGE_ENTRIES * sizeof(u64) + sizeof(u64);
-	size_t dump_size;
-	struct kbase_mmu_mode const *mmu_mode;
-
-	KBASE_DEBUG_ASSERT(NULL != kctx);
-	lockdep_assert_held(&kctx->mmu_lock);
-
-	mmu_mode = kctx->kbdev->mmu_mode;
-
-	pgd_page = kmap(pfn_to_page(PFN_DOWN(pgd)));
-	if (!pgd_page) {
-		dev_warn(kctx->kbdev->dev, "kbasep_mmu_dump_level: kmap failure\n");
-		return 0;
-	}
-
-	if (*size_left >= size) {
-		/* A modified physical address that contains the page table level */
-		u64 m_pgd = pgd | level;
-
-		/* Put the modified physical address in the output buffer */
-		memcpy(*buffer, &m_pgd, sizeof(m_pgd));
-		*buffer += sizeof(m_pgd);
-
-		/* Followed by the page table itself */
-		memcpy(*buffer, pgd_page, sizeof(u64) * KBASE_MMU_PAGE_ENTRIES);
-		*buffer += sizeof(u64) * KBASE_MMU_PAGE_ENTRIES;
-
-		*size_left -= size;
-	}
-
-	if (level < MIDGARD_MMU_BOTTOMLEVEL) {
-		for (i = 0; i < KBASE_MMU_PAGE_ENTRIES; i++) {
-			if (mmu_mode->pte_is_valid(pgd_page[i], level)) {
-				target_pgd = mmu_mode->pte_to_phy_addr(
-						pgd_page[i]);
-
-				dump_size = kbasep_mmu_dump_level(kctx,
-						target_pgd, level + 1,
-						buffer, size_left);
-				if (!dump_size) {
-					kunmap(pfn_to_page(PFN_DOWN(pgd)));
-					return 0;
-				}
-				size += dump_size;
-			}
-		}
-	}
-
-	kunmap(pfn_to_page(PFN_DOWN(pgd)));
-
-	return size;
-}
-
-void *kbase_mmu_dump(struct kbase_context *kctx, int nr_pages)
-{
-	void *kaddr;
-	size_t size_left;
-
-	KBASE_DEBUG_ASSERT(kctx);
-
-	if (0 == nr_pages) {
-		/* can't dump in a 0 sized buffer, early out */
-		return NULL;
-	}
-
-	size_left = nr_pages * PAGE_SIZE;
-
-	KBASE_DEBUG_ASSERT(0 != size_left);
-	kaddr = vmalloc_user(size_left);
-
-	mutex_lock(&kctx->mmu_lock);
-
-	if (kaddr) {
-		u64 end_marker = 0xFFULL;
-		char *buffer;
-		char *mmu_dump_buffer;
-		u64 config[3];
-		size_t dump_size, size = 0;
-
-		buffer = (char *)kaddr;
-		mmu_dump_buffer = buffer;
-
-		if (kctx->api_version >= KBASE_API_VERSION(8, 4)) {
-			struct kbase_mmu_setup as_setup;
-
-			kctx->kbdev->mmu_mode->get_as_setup(kctx, &as_setup);
-			config[0] = as_setup.transtab;
-			config[1] = as_setup.memattr;
-			config[2] = as_setup.transcfg;
-			memcpy(buffer, &config, sizeof(config));
-			mmu_dump_buffer += sizeof(config);
-			size_left -= sizeof(config);
-			size += sizeof(config);
-		}
-
-		dump_size = kbasep_mmu_dump_level(kctx,
-				kctx->pgd,
-				MIDGARD_MMU_TOPLEVEL,
-				&mmu_dump_buffer,
-				&size_left);
-
-		if (!dump_size)
-			goto fail_free;
-
-		size += dump_size;
-
-		/* Add on the size for the end marker */
-		size += sizeof(u64);
-
-		if (size > (nr_pages * PAGE_SIZE)) {
-			/* The buffer isn't big enough - free the memory and return failure */
-			goto fail_free;
-		}
-
-		/* Add the end marker */
-		memcpy(mmu_dump_buffer, &end_marker, sizeof(u64));
-	}
-
-	mutex_unlock(&kctx->mmu_lock);
-	return kaddr;
-
-fail_free:
-	vfree(kaddr);
-	mutex_unlock(&kctx->mmu_lock);
-	return NULL;
-}
-KBASE_EXPORT_TEST_API(kbase_mmu_dump);
-
-void bus_fault_worker(struct work_struct *data)
-{
-	struct kbase_as *faulting_as;
-	int as_no;
-	struct kbase_context *kctx;
-	struct kbase_device *kbdev;
-#if KBASE_GPU_RESET_EN
-	bool reset_status = false;
-#endif /* KBASE_GPU_RESET_EN */
-
-	faulting_as = container_of(data, struct kbase_as, work_busfault);
-
-	as_no = faulting_as->number;
-
-	kbdev = container_of(faulting_as, struct kbase_device, as[as_no]);
-
-	/* Grab the context that was already refcounted in kbase_mmu_interrupt().
-	 * Therefore, it cannot be scheduled out of this AS until we explicitly release it
-	 */
-	kctx = kbasep_js_runpool_lookup_ctx_noretain(kbdev, as_no);
-	if (WARN_ON(!kctx)) {
-		atomic_dec(&kbdev->faults_pending);
-		return;
-	}
-
-	if (unlikely(faulting_as->protected_mode))
-	{
-		kbase_mmu_report_fault_and_kill(kctx, faulting_as,
-				"Permission failure");
-		kbase_mmu_hw_clear_fault(kbdev, faulting_as, kctx,
-				KBASE_MMU_FAULT_TYPE_BUS_UNEXPECTED);
-		kbasep_js_runpool_release_ctx(kbdev, kctx);
-		atomic_dec(&kbdev->faults_pending);
-		return;
-
-	}
-
-#if KBASE_GPU_RESET_EN
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8245)) {
-		/* Due to H/W issue 8245 we need to reset the GPU after using UNMAPPED mode.
-		 * We start the reset before switching to UNMAPPED to ensure that unrelated jobs
-		 * are evicted from the GPU before the switch.
-		 */
-		dev_err(kbdev->dev, "GPU bus error occurred. For this GPU version we now soft-reset as part of bus error recovery\n");
-		reset_status = kbase_prepare_to_reset_gpu(kbdev);
-	}
-#endif /* KBASE_GPU_RESET_EN */
-	/* NOTE: If GPU already powered off for suspend, we don't need to switch to unmapped */
-	if (!kbase_pm_context_active_handle_suspend(kbdev, KBASE_PM_SUSPEND_HANDLER_DONT_REACTIVATE)) {
-		unsigned long flags;
-
-		/* switch to UNMAPPED mode, will abort all jobs and stop any hw counter dumping */
-		/* AS transaction begin */
-		mutex_lock(&kbdev->mmu_hw_mutex);
-
-		/* Set the MMU into unmapped mode */
-		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-		kbase_mmu_disable(kctx);
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-		mutex_unlock(&kbdev->mmu_hw_mutex);
-		/* AS transaction end */
-
-		kbase_mmu_hw_clear_fault(kbdev, faulting_as, kctx,
-					 KBASE_MMU_FAULT_TYPE_BUS_UNEXPECTED);
-		kbase_mmu_hw_enable_fault(kbdev, faulting_as, kctx,
-					 KBASE_MMU_FAULT_TYPE_BUS_UNEXPECTED);
-
-		kbase_pm_context_idle(kbdev);
-	}
-
-#if KBASE_GPU_RESET_EN
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8245) && reset_status)
-		kbase_reset_gpu(kbdev);
-#endif /* KBASE_GPU_RESET_EN */
-
-	kbasep_js_runpool_release_ctx(kbdev, kctx);
-
-	atomic_dec(&kbdev->faults_pending);
-}
-
-const char *kbase_exception_name(struct kbase_device *kbdev, u32 exception_code)
-{
-	const char *e;
-
-	switch (exception_code) {
-		/* Non-Fault Status code */
-	case 0x00:
-		e = "NOT_STARTED/IDLE/OK";
-		break;
-	case 0x01:
-		e = "DONE";
-		break;
-	case 0x02:
-		e = "INTERRUPTED";
-		break;
-	case 0x03:
-		e = "STOPPED";
-		break;
-	case 0x04:
-		e = "TERMINATED";
-		break;
-	case 0x08:
-		e = "ACTIVE";
-		break;
-		/* Job exceptions */
-	case 0x40:
-		e = "JOB_CONFIG_FAULT";
-		break;
-	case 0x41:
-		e = "JOB_POWER_FAULT";
-		break;
-	case 0x42:
-		e = "JOB_READ_FAULT";
-		break;
-	case 0x43:
-		e = "JOB_WRITE_FAULT";
-		break;
-	case 0x44:
-		e = "JOB_AFFINITY_FAULT";
-		break;
-	case 0x48:
-		e = "JOB_BUS_FAULT";
-		break;
-	case 0x50:
-		e = "INSTR_INVALID_PC";
-		break;
-	case 0x51:
-		e = "INSTR_INVALID_ENC";
-		break;
-	case 0x52:
-		e = "INSTR_TYPE_MISMATCH";
-		break;
-	case 0x53:
-		e = "INSTR_OPERAND_FAULT";
-		break;
-	case 0x54:
-		e = "INSTR_TLS_FAULT";
-		break;
-	case 0x55:
-		e = "INSTR_BARRIER_FAULT";
-		break;
-	case 0x56:
-		e = "INSTR_ALIGN_FAULT";
-		break;
-	case 0x58:
-		e = "DATA_INVALID_FAULT";
-		break;
-	case 0x59:
-		e = "TILE_RANGE_FAULT";
-		break;
-	case 0x5A:
-		e = "ADDR_RANGE_FAULT";
-		break;
-	case 0x60:
-		e = "OUT_OF_MEMORY";
-		break;
-		/* GPU exceptions */
-	case 0x80:
-		e = "DELAYED_BUS_FAULT";
-		break;
-	case 0x88:
-		e = "SHAREABILITY_FAULT";
-		break;
-		/* MMU exceptions */
-	case 0xC0:
-	case 0xC1:
-	case 0xC2:
-	case 0xC3:
-	case 0xC4:
-	case 0xC5:
-	case 0xC6:
-	case 0xC7:
-		e = "TRANSLATION_FAULT";
-		break;
-	case 0xC8:
-		e = "PERMISSION_FAULT";
-		break;
-	case 0xC9:
-	case 0xCA:
-	case 0xCB:
-	case 0xCC:
-	case 0xCD:
-	case 0xCE:
-	case 0xCF:
-		if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_AARCH64_MMU))
-			e = "PERMISSION_FAULT";
-		else
-			e = "UNKNOWN";
-		break;
-	case 0xD0:
-	case 0xD1:
-	case 0xD2:
-	case 0xD3:
-	case 0xD4:
-	case 0xD5:
-	case 0xD6:
-	case 0xD7:
-		e = "TRANSTAB_BUS_FAULT";
-		break;
-	case 0xD8:
-		e = "ACCESS_FLAG";
-		break;
-	case 0xD9:
-	case 0xDA:
-	case 0xDB:
-	case 0xDC:
-	case 0xDD:
-	case 0xDE:
-	case 0xDF:
-		if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_AARCH64_MMU))
-			e = "ACCESS_FLAG";
-		else
-			e = "UNKNOWN";
-		break;
-	case 0xE0:
-	case 0xE1:
-	case 0xE2:
-	case 0xE3:
-	case 0xE4:
-	case 0xE5:
-	case 0xE6:
-	case 0xE7:
-		if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_AARCH64_MMU))
-			e = "ADDRESS_SIZE_FAULT";
-		else
-			e = "UNKNOWN";
-		break;
-	case 0xE8:
-	case 0xE9:
-	case 0xEA:
-	case 0xEB:
-	case 0xEC:
-	case 0xED:
-	case 0xEE:
-	case 0xEF:
-		if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_AARCH64_MMU))
-			e = "MEMORY_ATTRIBUTES_FAULT";
-		else
-			e = "UNKNOWN";
-		break;
-	default:
-		e = "UNKNOWN";
-		break;
-	};
-
-	return e;
-}
-
-static const char *access_type_name(struct kbase_device *kbdev,
-		u32 fault_status)
-{
-	switch (fault_status & AS_FAULTSTATUS_ACCESS_TYPE_MASK) {
-	case AS_FAULTSTATUS_ACCESS_TYPE_ATOMIC:
-		if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_AARCH64_MMU))
-			return "ATOMIC";
-		else
-			return "UNKNOWN";
-	case AS_FAULTSTATUS_ACCESS_TYPE_READ:
-		return "READ";
-	case AS_FAULTSTATUS_ACCESS_TYPE_WRITE:
-		return "WRITE";
-	case AS_FAULTSTATUS_ACCESS_TYPE_EX:
-		return "EXECUTE";
-	default:
-		WARN_ON(1);
-		return NULL;
-	}
-}
-
-/**
- * The caller must ensure it's retained the ctx to prevent it from being scheduled out whilst it's being worked on.
- */
-static void kbase_mmu_report_fault_and_kill(struct kbase_context *kctx,
-		struct kbase_as *as, const char *reason_str)
-{
-	unsigned long flags;
-	int exception_type;
-	int access_type;
-	int source_id;
-	int as_no;
-	struct kbase_device *kbdev;
-	struct kbasep_js_device_data *js_devdata;
-
-#if KBASE_GPU_RESET_EN
-	bool reset_status = false;
-#endif
-
-	as_no = as->number;
-	kbdev = kctx->kbdev;
-	js_devdata = &kbdev->js_data;
-
-	/* ASSERT that the context won't leave the runpool */
-	KBASE_DEBUG_ASSERT(atomic_read(&kctx->refcount) > 0);
-
-	/* decode the fault status */
-	exception_type = as->fault_status & 0xFF;
-	access_type = (as->fault_status >> 8) & 0x3;
-	source_id = (as->fault_status >> 16);
-
-	/* terminal fault, print info about the fault */
-	dev_err(kbdev->dev,
-		"Unhandled Page fault in AS%d at VA 0x%016llX\n"
-		"Reason: %s\n"
-		"raw fault status: 0x%X\n"
-		"decoded fault status: %s\n"
-		"exception type 0x%X: %s\n"
-		"access type 0x%X: %s\n"
-		"source id 0x%X\n"
-		"pid: %d\n",
-		as_no, as->fault_addr,
-		reason_str,
-		as->fault_status,
-		(as->fault_status & (1 << 10) ? "DECODER FAULT" : "SLAVE FAULT"),
-		exception_type, kbase_exception_name(kbdev, exception_type),
-		access_type, access_type_name(kbdev, as->fault_status),
-		source_id,
-		kctx->pid);
-
-	/* hardware counters dump fault handling */
-	if ((kbdev->hwcnt.kctx) && (kbdev->hwcnt.kctx->as_nr == as_no) &&
-			(kbdev->hwcnt.backend.state ==
-						KBASE_INSTR_STATE_DUMPING)) {
-		unsigned int num_core_groups = kbdev->gpu_props.num_core_groups;
-
-		if ((as->fault_addr >= kbdev->hwcnt.addr) &&
-				(as->fault_addr < (kbdev->hwcnt.addr +
-						(num_core_groups * 2048))))
-			kbdev->hwcnt.backend.state = KBASE_INSTR_STATE_FAULT;
-	}
-
-	/* Stop the kctx from submitting more jobs and cause it to be scheduled
-	 * out/rescheduled - this will occur on releasing the context's refcount */
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	kbasep_js_clear_submit_allowed(js_devdata, kctx);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	/* Kill any running jobs from the context. Submit is disallowed, so no more jobs from this
-	 * context can appear in the job slots from this point on */
-	kbase_backend_jm_kill_jobs_from_kctx(kctx);
-	/* AS transaction begin */
-	mutex_lock(&kbdev->mmu_hw_mutex);
-#if KBASE_GPU_RESET_EN
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8245)) {
-		/* Due to H/W issue 8245 we need to reset the GPU after using UNMAPPED mode.
-		 * We start the reset before switching to UNMAPPED to ensure that unrelated jobs
-		 * are evicted from the GPU before the switch.
-		 */
-		dev_err(kbdev->dev, "Unhandled page fault. For this GPU version we now soft-reset the GPU as part of page fault recovery.");
-		reset_status = kbase_prepare_to_reset_gpu(kbdev);
-	}
-#endif /* KBASE_GPU_RESET_EN */
-	/* switch to UNMAPPED mode, will abort all jobs and stop any hw counter dumping */
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	kbase_mmu_disable(kctx);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	mutex_unlock(&kbdev->mmu_hw_mutex);
-	/* AS transaction end */
-	/* Clear down the fault */
-	kbase_mmu_hw_clear_fault(kbdev, as, kctx,
-			KBASE_MMU_FAULT_TYPE_PAGE_UNEXPECTED);
-	kbase_mmu_hw_enable_fault(kbdev, as, kctx,
-			KBASE_MMU_FAULT_TYPE_PAGE_UNEXPECTED);
-
-#if KBASE_GPU_RESET_EN
-	if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8245) && reset_status)
-		kbase_reset_gpu(kbdev);
-#endif /* KBASE_GPU_RESET_EN */
-}
-
-void kbasep_as_do_poke(struct work_struct *work)
-{
-	struct kbase_as *as;
-	struct kbase_device *kbdev;
-	struct kbase_context *kctx;
-	unsigned long flags;
-
-	KBASE_DEBUG_ASSERT(work);
-	as = container_of(work, struct kbase_as, poke_work);
-	kbdev = container_of(as, struct kbase_device, as[as->number]);
-	KBASE_DEBUG_ASSERT(as->poke_state & KBASE_AS_POKE_STATE_IN_FLIGHT);
-
-	/* GPU power will already be active by virtue of the caller holding a JS
-	 * reference on the address space, and will not release it until this worker
-	 * has finished */
-
-	/* Further to the comment above, we know that while this function is running
-	 * the AS will not be released as before the atom is released this workqueue
-	 * is flushed (in kbase_as_poking_timer_release_atom)
-	 */
-	kctx = kbasep_js_runpool_lookup_ctx_noretain(kbdev, as->number);
-
-	/* AS transaction begin */
-	mutex_lock(&kbdev->mmu_hw_mutex);
-	/* Force a uTLB invalidate */
-	kbase_mmu_hw_do_operation(kbdev, as, kctx, 0, 0,
-				  AS_COMMAND_UNLOCK, 0);
-	mutex_unlock(&kbdev->mmu_hw_mutex);
-	/* AS transaction end */
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	if (as->poke_refcount &&
-		!(as->poke_state & KBASE_AS_POKE_STATE_KILLING_POKE)) {
-		/* Only queue up the timer if we need it, and we're not trying to kill it */
-		hrtimer_start(&as->poke_timer, HR_TIMER_DELAY_MSEC(5), HRTIMER_MODE_REL);
-	}
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-}
-
-enum hrtimer_restart kbasep_as_poke_timer_callback(struct hrtimer *timer)
-{
-	struct kbase_as *as;
-	int queue_work_ret;
-
-	KBASE_DEBUG_ASSERT(NULL != timer);
-	as = container_of(timer, struct kbase_as, poke_timer);
-	KBASE_DEBUG_ASSERT(as->poke_state & KBASE_AS_POKE_STATE_IN_FLIGHT);
-
-	queue_work_ret = queue_work(as->poke_wq, &as->poke_work);
-	KBASE_DEBUG_ASSERT(queue_work_ret);
-	return HRTIMER_NORESTART;
-}
-
-/**
- * Retain the poking timer on an atom's context (if the atom hasn't already
- * done so), and start the timer (if it's not already started).
- *
- * This must only be called on a context that's scheduled in, and an atom
- * that's running on the GPU.
- *
- * The caller must hold hwaccess_lock
- *
- * This can be called safely from atomic context
- */
-void kbase_as_poking_timer_retain_atom(struct kbase_device *kbdev, struct kbase_context *kctx, struct kbase_jd_atom *katom)
-{
-	struct kbase_as *as;
-
-	KBASE_DEBUG_ASSERT(kbdev);
-	KBASE_DEBUG_ASSERT(kctx);
-	KBASE_DEBUG_ASSERT(katom);
-	KBASE_DEBUG_ASSERT(kctx->as_nr != KBASEP_AS_NR_INVALID);
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	if (katom->poking)
-		return;
-
-	katom->poking = 1;
-
-	/* It's safe to work on the as/as_nr without an explicit reference,
-	 * because the caller holds the hwaccess_lock, and the atom itself
-	 * was also running and had already taken a reference  */
-	as = &kbdev->as[kctx->as_nr];
-
-	if (++(as->poke_refcount) == 1) {
-		/* First refcount for poke needed: check if not already in flight */
-		if (!as->poke_state) {
-			/* need to start poking */
-			as->poke_state |= KBASE_AS_POKE_STATE_IN_FLIGHT;
-			queue_work(as->poke_wq, &as->poke_work);
-		}
-	}
-}
-
-/**
- * If an atom holds a poking timer, release it and wait for it to finish
- *
- * This must only be called on a context that's scheduled in, and an atom
- * that still has a JS reference on the context
- *
- * This must \b not be called from atomic context, since it can sleep.
- */
-void kbase_as_poking_timer_release_atom(struct kbase_device *kbdev, struct kbase_context *kctx, struct kbase_jd_atom *katom)
-{
-	struct kbase_as *as;
-	unsigned long flags;
-
-	KBASE_DEBUG_ASSERT(kbdev);
-	KBASE_DEBUG_ASSERT(kctx);
-	KBASE_DEBUG_ASSERT(katom);
-	KBASE_DEBUG_ASSERT(kctx->as_nr != KBASEP_AS_NR_INVALID);
-
-	if (!katom->poking)
-		return;
-
-	as = &kbdev->as[kctx->as_nr];
-
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	KBASE_DEBUG_ASSERT(as->poke_refcount > 0);
-	KBASE_DEBUG_ASSERT(as->poke_state & KBASE_AS_POKE_STATE_IN_FLIGHT);
-
-	if (--(as->poke_refcount) == 0) {
-		as->poke_state |= KBASE_AS_POKE_STATE_KILLING_POKE;
-		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-		hrtimer_cancel(&as->poke_timer);
-		flush_workqueue(as->poke_wq);
-
-		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-
-		/* Re-check whether it's still needed */
-		if (as->poke_refcount) {
-			int queue_work_ret;
-			/* Poking still needed:
-			 * - Another retain will not be starting the timer or queueing work,
-			 * because it's still marked as in-flight
-			 * - The hrtimer has finished, and has not started a new timer or
-			 * queued work because it's been marked as killing
-			 *
-			 * So whatever happens now, just queue the work again */
-			as->poke_state &= ~((kbase_as_poke_state)KBASE_AS_POKE_STATE_KILLING_POKE);
-			queue_work_ret = queue_work(as->poke_wq, &as->poke_work);
-			KBASE_DEBUG_ASSERT(queue_work_ret);
-		} else {
-			/* It isn't - so mark it as not in flight, and not killing */
-			as->poke_state = 0u;
-
-			/* The poke associated with the atom has now finished. If this is
-			 * also the last atom on the context, then we can guarentee no more
-			 * pokes (and thus no more poking register accesses) will occur on
-			 * the context until new atoms are run */
-		}
-	}
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-
-	katom->poking = 0;
-}
-
-void kbase_mmu_interrupt_process(struct kbase_device *kbdev, struct kbase_context *kctx, struct kbase_as *as)
-{
-	struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
-
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	if (!kctx) {
-		dev_warn(kbdev->dev, "%s in AS%d at 0x%016llx with no context present! Suprious IRQ or SW Design Error?\n",
-				 kbase_as_has_bus_fault(as) ? "Bus error" : "Page fault",
-				 as->number, as->fault_addr);
-
-		/* Since no ctx was found, the MMU must be disabled. */
-		WARN_ON(as->current_setup.transtab);
-
-		if (kbase_as_has_bus_fault(as)) {
-			kbase_mmu_hw_clear_fault(kbdev, as, kctx,
-					KBASE_MMU_FAULT_TYPE_BUS_UNEXPECTED);
-			kbase_mmu_hw_enable_fault(kbdev, as, kctx,
-					KBASE_MMU_FAULT_TYPE_BUS_UNEXPECTED);
-		} else if (kbase_as_has_page_fault(as)) {
-			kbase_mmu_hw_clear_fault(kbdev, as, kctx,
-					KBASE_MMU_FAULT_TYPE_PAGE_UNEXPECTED);
-			kbase_mmu_hw_enable_fault(kbdev, as, kctx,
-					KBASE_MMU_FAULT_TYPE_PAGE_UNEXPECTED);
-		}
-
-#if KBASE_GPU_RESET_EN
-		if (kbase_as_has_bus_fault(as) &&
-				kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_8245)) {
-			bool reset_status;
-			/*
-			 * Reset the GPU, like in bus_fault_worker, in case an
-			 * earlier error hasn't been properly cleared by this
-			 * point.
-			 */
-			dev_err(kbdev->dev, "GPU bus error occurred. For this GPU version we now soft-reset as part of bus error recovery\n");
-			reset_status = kbase_prepare_to_reset_gpu_locked(kbdev);
-			if (reset_status)
-				kbase_reset_gpu_locked(kbdev);
-		}
-#endif /* KBASE_GPU_RESET_EN */
-
-		return;
-	}
-
-	if (kbase_as_has_bus_fault(as)) {
-		/*
-		 * hw counters dumping in progress, signal the
-		 * other thread that it failed
-		 */
-		if ((kbdev->hwcnt.kctx == kctx) &&
-		    (kbdev->hwcnt.backend.state ==
-					KBASE_INSTR_STATE_DUMPING))
-			kbdev->hwcnt.backend.state =
-						KBASE_INSTR_STATE_FAULT;
-
-		/*
-		 * Stop the kctx from submitting more jobs and cause it
-		 * to be scheduled out/rescheduled when all references
-		 * to it are released
-		 */
-		kbasep_js_clear_submit_allowed(js_devdata, kctx);
-
-		if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_AARCH64_MMU))
-			dev_warn(kbdev->dev,
-					"Bus error in AS%d at VA=0x%016llx, IPA=0x%016llx\n",
-					as->number, as->fault_addr,
-					as->fault_extra_addr);
-		else
-			dev_warn(kbdev->dev, "Bus error in AS%d at 0x%016llx\n",
-					as->number, as->fault_addr);
-
-		/*
-		 * We need to switch to UNMAPPED mode - but we do this in a
-		 * worker so that we can sleep
-		 */
-		KBASE_DEBUG_ASSERT(0 == object_is_on_stack(&as->work_busfault));
-		WARN_ON(work_pending(&as->work_busfault));
-		queue_work(as->pf_wq, &as->work_busfault);
-		atomic_inc(&kbdev->faults_pending);
-	} else {
-		KBASE_DEBUG_ASSERT(0 == object_is_on_stack(&as->work_pagefault));
-		WARN_ON(work_pending(&as->work_pagefault));
-		queue_work(as->pf_wq, &as->work_pagefault);
-		atomic_inc(&kbdev->faults_pending);
-	}
-}
-
-void kbase_flush_mmu_wqs(struct kbase_device *kbdev)
-{
-	int i;
-
-	for (i = 0; i < kbdev->nr_hw_address_spaces; i++) {
-		struct kbase_as *as = &kbdev->as[i];
-
-		flush_workqueue(as->pf_wq);
-	}
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu_hw.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu_hw.h
deleted file mode 100644
index 986e959e9a0c..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu_hw.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/**
- * @file
- * Interface file for accessing MMU hardware functionality
- */
-
-/**
- * @page mali_kbase_mmu_hw_page MMU hardware interface
- *
- * @section mali_kbase_mmu_hw_intro_sec Introduction
- * This module provides an abstraction for accessing the functionality provided
- * by the midgard MMU and thus allows all MMU HW access to be contained within
- * one common place and allows for different backends (implementations) to
- * be provided.
- */
-
-#ifndef _MALI_KBASE_MMU_HW_H_
-#define _MALI_KBASE_MMU_HW_H_
-
-/* Forward declarations */
-struct kbase_device;
-struct kbase_as;
-struct kbase_context;
-
-/**
- * @addtogroup base_kbase_api
- * @{
- */
-
-/**
- * @addtogroup mali_kbase_mmu_hw  MMU access APIs
- * @{
- */
-
-/** @brief MMU fault type descriptor.
- */
-enum kbase_mmu_fault_type {
-	KBASE_MMU_FAULT_TYPE_UNKNOWN = 0,
-	KBASE_MMU_FAULT_TYPE_PAGE,
-	KBASE_MMU_FAULT_TYPE_BUS,
-	KBASE_MMU_FAULT_TYPE_PAGE_UNEXPECTED,
-	KBASE_MMU_FAULT_TYPE_BUS_UNEXPECTED
-};
-
-/** @brief Configure an address space for use.
- *
- * Configure the MMU using the address space details setup in the
- * @ref kbase_context structure.
- *
- * @param[in]  kbdev          kbase device to configure.
- * @param[in]  as             address space to configure.
- * @param[in]  kctx           kbase context to configure.
- */
-void kbase_mmu_hw_configure(struct kbase_device *kbdev,
-		struct kbase_as *as, struct kbase_context *kctx);
-
-/** @brief Issue an operation to the MMU.
- *
- * Issue an operation (MMU invalidate, MMU flush, etc) on the address space that
- * is associated with the provided @ref kbase_context over the specified range
- *
- * @param[in]  kbdev         kbase device to issue the MMU operation on.
- * @param[in]  as            address space to issue the MMU operation on.
- * @param[in]  kctx          kbase context to issue the MMU operation on.
- * @param[in]  vpfn          MMU Virtual Page Frame Number to start the
- *                           operation on.
- * @param[in]  nr            Number of pages to work on.
- * @param[in]  type          Operation type (written to ASn_COMMAND).
- * @param[in]  handling_irq  Is this operation being called during the handling
- *                           of an interrupt?
- *
- * @return Zero if the operation was successful, non-zero otherwise.
- */
-int kbase_mmu_hw_do_operation(struct kbase_device *kbdev, struct kbase_as *as,
-		struct kbase_context *kctx, u64 vpfn, u32 nr, u32 type,
-		unsigned int handling_irq);
-
-/** @brief Clear a fault that has been previously reported by the MMU.
- *
- * Clear a bus error or page fault that has been reported by the MMU.
- *
- * @param[in]  kbdev         kbase device to  clear the fault from.
- * @param[in]  as            address space to  clear the fault from.
- * @param[in]  kctx          kbase context to clear the fault from or NULL.
- * @param[in]  type          The type of fault that needs to be cleared.
- */
-void kbase_mmu_hw_clear_fault(struct kbase_device *kbdev, struct kbase_as *as,
-		struct kbase_context *kctx, enum kbase_mmu_fault_type type);
-
-/** @brief Enable fault that has been previously reported by the MMU.
- *
- * After a page fault or bus error has been reported by the MMU these
- * will be disabled. After these are handled this function needs to be
- * called to enable the page fault or bus error fault again.
- *
- * @param[in]  kbdev         kbase device to again enable the fault from.
- * @param[in]  as            address space to again enable the fault from.
- * @param[in]  kctx          kbase context to again enable the fault from.
- * @param[in]  type          The type of fault that needs to be enabled again.
- */
-void kbase_mmu_hw_enable_fault(struct kbase_device *kbdev, struct kbase_as *as,
-		struct kbase_context *kctx, enum kbase_mmu_fault_type type);
-
-/** @} *//* end group mali_kbase_mmu_hw */
-/** @} *//* end group base_kbase_api */
-
-#endif	/* _MALI_KBASE_MMU_HW_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu_mode_aarch64.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu_mode_aarch64.c
deleted file mode 100644
index 0fb717b67af9..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu_mode_aarch64.c
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2014, 2016-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#include "mali_kbase.h"
-#include "mali_midg_regmap.h"
-#include "mali_kbase_defs.h"
-
-#define ENTRY_TYPE_MASK     3ULL
-/* For valid ATEs bit 1 = ((level == 3) ? 1 : 0).
- * Valid ATE entries at level 3 are flagged with the value 3.
- * Valid ATE entries at level 0-2 are flagged with the value 1.
- */
-#define ENTRY_IS_ATE_L3		3ULL
-#define ENTRY_IS_ATE_L02	1ULL
-#define ENTRY_IS_INVAL		2ULL
-#define ENTRY_IS_PTE		3ULL
-
-#define ENTRY_ATTR_BITS (7ULL << 2)	/* bits 4:2 */
-#define ENTRY_ACCESS_RW (1ULL << 6)     /* bits 6:7 */
-#define ENTRY_ACCESS_RO (3ULL << 6)
-#define ENTRY_SHARE_BITS (3ULL << 8)	/* bits 9:8 */
-#define ENTRY_ACCESS_BIT (1ULL << 10)
-#define ENTRY_NX_BIT (1ULL << 54)
-
-/* Helper Function to perform assignment of page table entries, to
- * ensure the use of strd, which is required on LPAE systems.
- */
-static inline void page_table_entry_set(u64 *pte, u64 phy)
-{
-#ifdef CONFIG_64BIT
-	*pte = phy;
-#elif defined(CONFIG_ARM)
-	/*
-	 * In order to prevent the compiler keeping cached copies of
-	 * memory, we have to explicitly say that we have updated memory.
-	 *
-	 * Note: We could manually move the data ourselves into R0 and
-	 * R1 by specifying register variables that are explicitly
-	 * given registers assignments, the down side of this is that
-	 * we have to assume cpu endianness.  To avoid this we can use
-	 * the ldrd to read the data from memory into R0 and R1 which
-	 * will respect the cpu endianness, we then use strd to make
-	 * the 64 bit assignment to the page table entry.
-	 */
-	asm volatile("ldrd r0, r1, [%[ptemp]]\n\t"
-			"strd r0, r1, [%[pte]]\n\t"
-			: "=m" (*pte)
-			: [ptemp] "r" (&phy), [pte] "r" (pte), "m" (phy)
-			: "r0", "r1");
-#else
-#error "64-bit atomic write must be implemented for your architecture"
-#endif
-}
-
-static void mmu_get_as_setup(struct kbase_context *kctx,
-		struct kbase_mmu_setup * const setup)
-{
-	/* Set up the required caching policies at the correct indices
-	 * in the memattr register.
-	 */
-	setup->memattr =
-		(AS_MEMATTR_IMPL_DEF_CACHE_POLICY <<
-			(AS_MEMATTR_INDEX_IMPL_DEF_CACHE_POLICY * 8)) |
-		(AS_MEMATTR_FORCE_TO_CACHE_ALL    <<
-			(AS_MEMATTR_INDEX_FORCE_TO_CACHE_ALL * 8)) |
-		(AS_MEMATTR_WRITE_ALLOC           <<
-			(AS_MEMATTR_INDEX_WRITE_ALLOC * 8)) |
-		(AS_MEMATTR_AARCH64_OUTER_IMPL_DEF   <<
-			(AS_MEMATTR_INDEX_OUTER_IMPL_DEF * 8)) |
-		(AS_MEMATTR_AARCH64_OUTER_WA         <<
-			(AS_MEMATTR_INDEX_OUTER_WA * 8));
-
-	setup->transtab = (u64)kctx->pgd & AS_TRANSTAB_BASE_MASK;
-	setup->transcfg = AS_TRANSCFG_ADRMODE_AARCH64_4K;
-}
-
-static void mmu_update(struct kbase_context *kctx)
-{
-	struct kbase_device * const kbdev = kctx->kbdev;
-	struct kbase_as * const as = &kbdev->as[kctx->as_nr];
-	struct kbase_mmu_setup * const current_setup = &as->current_setup;
-
-	mmu_get_as_setup(kctx, current_setup);
-
-	/* Apply the address space setting */
-	kbase_mmu_hw_configure(kbdev, as, kctx);
-}
-
-static void mmu_disable_as(struct kbase_device *kbdev, int as_nr)
-{
-	struct kbase_as * const as = &kbdev->as[as_nr];
-	struct kbase_mmu_setup * const current_setup = &as->current_setup;
-
-	current_setup->transtab = 0ULL;
-	current_setup->transcfg = AS_TRANSCFG_ADRMODE_UNMAPPED;
-
-	/* Apply the address space setting */
-	kbase_mmu_hw_configure(kbdev, as, NULL);
-}
-
-static phys_addr_t pte_to_phy_addr(u64 entry)
-{
-	if (!(entry & 1))
-		return 0;
-
-	return entry & ~0xFFF;
-}
-
-static int ate_is_valid(u64 ate, unsigned int level)
-{
-	if (level == MIDGARD_MMU_BOTTOMLEVEL)
-		return ((ate & ENTRY_TYPE_MASK) == ENTRY_IS_ATE_L3);
-	else
-		return ((ate & ENTRY_TYPE_MASK) == ENTRY_IS_ATE_L02);
-}
-
-static int pte_is_valid(u64 pte, unsigned int level)
-{
-	/* PTEs cannot exist at the bottom level */
-	if (level == MIDGARD_MMU_BOTTOMLEVEL)
-		return false;
-	return ((pte & ENTRY_TYPE_MASK) == ENTRY_IS_PTE);
-}
-
-/*
- * Map KBASE_REG flags to MMU flags
- */
-static u64 get_mmu_flags(unsigned long flags)
-{
-	u64 mmu_flags;
-
-	/* store mem_attr index as 4:2 (macro called ensures 3 bits already) */
-	mmu_flags = KBASE_REG_MEMATTR_VALUE(flags) << 2;
-
-	/* Set access flags - note that AArch64 stage 1 does not support
-	 * write-only access, so we use read/write instead
-	 */
-	if (flags & KBASE_REG_GPU_WR)
-		mmu_flags |= ENTRY_ACCESS_RW;
-	else if (flags & KBASE_REG_GPU_RD)
-		mmu_flags |= ENTRY_ACCESS_RO;
-
-	/* nx if requested */
-	mmu_flags |= (flags & KBASE_REG_GPU_NX) ? ENTRY_NX_BIT : 0;
-
-	if (flags & KBASE_REG_SHARE_BOTH) {
-		/* inner and outer shareable */
-		mmu_flags |= SHARE_BOTH_BITS;
-	} else if (flags & KBASE_REG_SHARE_IN) {
-		/* inner shareable coherency */
-		mmu_flags |= SHARE_INNER_BITS;
-	}
-
-	return mmu_flags;
-}
-
-static void entry_set_ate(u64 *entry,
-		struct tagged_addr phy,
-		unsigned long flags,
-		unsigned int level)
-{
-	if (level == MIDGARD_MMU_BOTTOMLEVEL)
-		page_table_entry_set(entry, as_phys_addr_t(phy) |
-				get_mmu_flags(flags) |
-				ENTRY_ACCESS_BIT | ENTRY_IS_ATE_L3);
-	else
-		page_table_entry_set(entry, as_phys_addr_t(phy) |
-				get_mmu_flags(flags) |
-				ENTRY_ACCESS_BIT | ENTRY_IS_ATE_L02);
-}
-
-static void entry_set_pte(u64 *entry, phys_addr_t phy)
-{
-	page_table_entry_set(entry, (phy & PAGE_MASK) |
-			ENTRY_ACCESS_BIT | ENTRY_IS_PTE);
-}
-
-static void entry_invalidate(u64 *entry)
-{
-	page_table_entry_set(entry, ENTRY_IS_INVAL);
-}
-
-static struct kbase_mmu_mode const aarch64_mode = {
-	.update = mmu_update,
-	.get_as_setup = mmu_get_as_setup,
-	.disable_as = mmu_disable_as,
-	.pte_to_phy_addr = pte_to_phy_addr,
-	.ate_is_valid = ate_is_valid,
-	.pte_is_valid = pte_is_valid,
-	.entry_set_ate = entry_set_ate,
-	.entry_set_pte = entry_set_pte,
-	.entry_invalidate = entry_invalidate
-};
-
-struct kbase_mmu_mode const *kbase_mmu_mode_get_aarch64(void)
-{
-	return &aarch64_mode;
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu_mode_lpae.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu_mode_lpae.c
deleted file mode 100644
index f080fdc0be88..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_mmu_mode_lpae.c
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#include "mali_kbase.h"
-#include "mali_midg_regmap.h"
-#include "mali_kbase_defs.h"
-
-#define ENTRY_TYPE_MASK     3ULL
-#define ENTRY_IS_ATE        1ULL
-#define ENTRY_IS_INVAL      2ULL
-#define ENTRY_IS_PTE        3ULL
-
-#define ENTRY_ATTR_BITS (7ULL << 2)	/* bits 4:2 */
-#define ENTRY_RD_BIT (1ULL << 6)
-#define ENTRY_WR_BIT (1ULL << 7)
-#define ENTRY_SHARE_BITS (3ULL << 8)	/* bits 9:8 */
-#define ENTRY_ACCESS_BIT (1ULL << 10)
-#define ENTRY_NX_BIT (1ULL << 54)
-
-#define ENTRY_FLAGS_MASK (ENTRY_ATTR_BITS | ENTRY_RD_BIT | ENTRY_WR_BIT | \
-		ENTRY_SHARE_BITS | ENTRY_ACCESS_BIT | ENTRY_NX_BIT)
-
-/* Helper Function to perform assignment of page table entries, to
- * ensure the use of strd, which is required on LPAE systems.
- */
-static inline void page_table_entry_set(u64 *pte, u64 phy)
-{
-#ifdef CONFIG_64BIT
-	*pte = phy;
-#elif defined(CONFIG_ARM)
-	/*
-	 * In order to prevent the compiler keeping cached copies of
-	 * memory, we have to explicitly say that we have updated
-	 * memory.
-	 *
-	 * Note: We could manually move the data ourselves into R0 and
-	 * R1 by specifying register variables that are explicitly
-	 * given registers assignments, the down side of this is that
-	 * we have to assume cpu endianness.  To avoid this we can use
-	 * the ldrd to read the data from memory into R0 and R1 which
-	 * will respect the cpu endianness, we then use strd to make
-	 * the 64 bit assignment to the page table entry.
-	 */
-	asm volatile("ldrd r0, r1, [%[ptemp]]\n\t"
-			"strd r0, r1, [%[pte]]\n\t"
-			: "=m" (*pte)
-			: [ptemp] "r" (&phy), [pte] "r" (pte), "m" (phy)
-			: "r0", "r1");
-#else
-#error "64-bit atomic write must be implemented for your architecture"
-#endif
-}
-
-static void mmu_get_as_setup(struct kbase_context *kctx,
-		struct kbase_mmu_setup * const setup)
-{
-	/* Set up the required caching policies at the correct indices
-	 * in the memattr register. */
-	setup->memattr =
-		(AS_MEMATTR_LPAE_IMPL_DEF_CACHE_POLICY <<
-		(AS_MEMATTR_INDEX_IMPL_DEF_CACHE_POLICY * 8)) |
-		(AS_MEMATTR_LPAE_FORCE_TO_CACHE_ALL    <<
-		(AS_MEMATTR_INDEX_FORCE_TO_CACHE_ALL * 8))    |
-		(AS_MEMATTR_LPAE_WRITE_ALLOC           <<
-		(AS_MEMATTR_INDEX_WRITE_ALLOC * 8))           |
-		(AS_MEMATTR_LPAE_OUTER_IMPL_DEF        <<
-		(AS_MEMATTR_INDEX_OUTER_IMPL_DEF * 8))        |
-		(AS_MEMATTR_LPAE_OUTER_WA              <<
-		(AS_MEMATTR_INDEX_OUTER_WA * 8))              |
-		0; /* The other indices are unused for now */
-
-	setup->transtab = ((u64)kctx->pgd &
-		((0xFFFFFFFFULL << 32) | AS_TRANSTAB_LPAE_ADDR_SPACE_MASK)) |
-		AS_TRANSTAB_LPAE_ADRMODE_TABLE |
-		AS_TRANSTAB_LPAE_READ_INNER;
-
-	setup->transcfg = 0;
-}
-
-static void mmu_update(struct kbase_context *kctx)
-{
-	struct kbase_device * const kbdev = kctx->kbdev;
-	struct kbase_as * const as = &kbdev->as[kctx->as_nr];
-	struct kbase_mmu_setup * const current_setup = &as->current_setup;
-
-	mmu_get_as_setup(kctx, current_setup);
-
-	/* Apply the address space setting */
-	kbase_mmu_hw_configure(kbdev, as, kctx);
-}
-
-static void mmu_disable_as(struct kbase_device *kbdev, int as_nr)
-{
-	struct kbase_as * const as = &kbdev->as[as_nr];
-	struct kbase_mmu_setup * const current_setup = &as->current_setup;
-
-	current_setup->transtab = AS_TRANSTAB_LPAE_ADRMODE_UNMAPPED;
-
-	/* Apply the address space setting */
-	kbase_mmu_hw_configure(kbdev, as, NULL);
-}
-
-static phys_addr_t pte_to_phy_addr(u64 entry)
-{
-	if (!(entry & 1))
-		return 0;
-
-	return entry & ~0xFFF;
-}
-
-static int ate_is_valid(u64 ate, unsigned int level)
-{
-	return ((ate & ENTRY_TYPE_MASK) == ENTRY_IS_ATE);
-}
-
-static int pte_is_valid(u64 pte, unsigned int level)
-{
-	return ((pte & ENTRY_TYPE_MASK) == ENTRY_IS_PTE);
-}
-
-/*
- * Map KBASE_REG flags to MMU flags
- */
-static u64 get_mmu_flags(unsigned long flags)
-{
-	u64 mmu_flags;
-
-	/* store mem_attr index as 4:2 (macro called ensures 3 bits already) */
-	mmu_flags = KBASE_REG_MEMATTR_VALUE(flags) << 2;
-
-	/* write perm if requested */
-	mmu_flags |= (flags & KBASE_REG_GPU_WR) ? ENTRY_WR_BIT : 0;
-	/* read perm if requested */
-	mmu_flags |= (flags & KBASE_REG_GPU_RD) ? ENTRY_RD_BIT : 0;
-	/* nx if requested */
-	mmu_flags |= (flags & KBASE_REG_GPU_NX) ? ENTRY_NX_BIT : 0;
-
-	if (flags & KBASE_REG_SHARE_BOTH) {
-		/* inner and outer shareable */
-		mmu_flags |= SHARE_BOTH_BITS;
-	} else if (flags & KBASE_REG_SHARE_IN) {
-		/* inner shareable coherency */
-		mmu_flags |= SHARE_INNER_BITS;
-	}
-
-	return mmu_flags;
-}
-
-static void entry_set_ate(u64 *entry,
-		struct tagged_addr phy,
-		unsigned long flags,
-		unsigned int level)
-{
-	page_table_entry_set(entry, as_phys_addr_t(phy) | get_mmu_flags(flags) |
-			     ENTRY_IS_ATE);
-}
-
-static void entry_set_pte(u64 *entry, phys_addr_t phy)
-{
-	page_table_entry_set(entry, (phy & ~0xFFF) | ENTRY_IS_PTE);
-}
-
-static void entry_invalidate(u64 *entry)
-{
-	page_table_entry_set(entry, ENTRY_IS_INVAL);
-}
-
-static struct kbase_mmu_mode const lpae_mode = {
-	.update = mmu_update,
-	.get_as_setup = mmu_get_as_setup,
-	.disable_as = mmu_disable_as,
-	.pte_to_phy_addr = pte_to_phy_addr,
-	.ate_is_valid = ate_is_valid,
-	.pte_is_valid = pte_is_valid,
-	.entry_set_ate = entry_set_ate,
-	.entry_set_pte = entry_set_pte,
-	.entry_invalidate = entry_invalidate
-};
-
-struct kbase_mmu_mode const *kbase_mmu_mode_get_lpae(void)
-{
-	return &lpae_mode;
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_platform_fake.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_platform_fake.c
deleted file mode 100644
index 0152b35f711b..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_platform_fake.c
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2014, 2016-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <linux/errno.h>
-#include <linux/export.h>
-#include <linux/ioport.h>
-#include <linux/platform_device.h>
-#include <linux/string.h>
-
-
-/*
- * This file is included only for type definitions and functions belonging to
- * specific platform folders. Do not add dependencies with symbols that are
- * defined somewhere else.
- */
-#include <mali_kbase_config.h>
-
-#define PLATFORM_CONFIG_RESOURCE_COUNT 4
-#define PLATFORM_CONFIG_IRQ_RES_COUNT  3
-
-static struct platform_device *mali_device;
-
-#ifndef CONFIG_OF
-/**
- * @brief Convert data in struct kbase_io_resources struct to Linux-specific resources
- *
- * Function converts data in struct kbase_io_resources struct to an array of Linux resource structures. Note that function
- * assumes that size of linux_resource array is at least PLATFORM_CONFIG_RESOURCE_COUNT.
- * Resources are put in fixed order: I/O memory region, job IRQ, MMU IRQ, GPU IRQ.
- *
- * @param[in]  io_resource      Input IO resource data
- * @param[out] linux_resources  Pointer to output array of Linux resource structures
- */
-static void kbasep_config_parse_io_resources(const struct kbase_io_resources *io_resources, struct resource *const linux_resources)
-{
-	if (!io_resources || !linux_resources) {
-		pr_err("%s: couldn't find proper resources\n", __func__);
-		return;
-	}
-
-	memset(linux_resources, 0, PLATFORM_CONFIG_RESOURCE_COUNT * sizeof(struct resource));
-
-	linux_resources[0].start = io_resources->io_memory_region.start;
-	linux_resources[0].end   = io_resources->io_memory_region.end;
-	linux_resources[0].flags = IORESOURCE_MEM;
-
-	linux_resources[1].start = io_resources->job_irq_number;
-	linux_resources[1].end   = io_resources->job_irq_number;
-	linux_resources[1].flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL;
-
-	linux_resources[2].start = io_resources->mmu_irq_number;
-	linux_resources[2].end   = io_resources->mmu_irq_number;
-	linux_resources[2].flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL;
-
-	linux_resources[3].start = io_resources->gpu_irq_number;
-	linux_resources[3].end   = io_resources->gpu_irq_number;
-	linux_resources[3].flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL;
-}
-#endif /* CONFIG_OF */
-
-int kbase_platform_register(void)
-{
-	struct kbase_platform_config *config;
-#ifndef CONFIG_OF
-	struct resource resources[PLATFORM_CONFIG_RESOURCE_COUNT];
-#endif
-	int err;
-
-	config = kbase_get_platform_config(); /* declared in midgard/mali_kbase_config.h but defined in platform folder */
-	if (config == NULL) {
-		pr_err("%s: couldn't get platform config\n", __func__);
-		return -ENODEV;
-	}
-
-	mali_device = platform_device_alloc("mali", 0);
-	if (mali_device == NULL)
-		return -ENOMEM;
-
-#ifndef CONFIG_OF
-	kbasep_config_parse_io_resources(config->io_resources, resources);
-	err = platform_device_add_resources(mali_device, resources, PLATFORM_CONFIG_RESOURCE_COUNT);
-	if (err) {
-		platform_device_put(mali_device);
-		mali_device = NULL;
-		return err;
-	}
-#endif /* CONFIG_OF */
-
-	err = platform_device_add(mali_device);
-	if (err) {
-		platform_device_unregister(mali_device);
-		mali_device = NULL;
-		return err;
-	}
-
-	return 0;
-}
-EXPORT_SYMBOL(kbase_platform_register);
-
-void kbase_platform_unregister(void)
-{
-	if (mali_device)
-		platform_device_unregister(mali_device);
-}
-EXPORT_SYMBOL(kbase_platform_unregister);
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_pm.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_pm.c
deleted file mode 100644
index 97d543464c28..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_pm.c
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/**
- * @file mali_kbase_pm.c
- * Base kernel power management APIs
- */
-
-#include <mali_kbase.h>
-#include <mali_midg_regmap.h>
-#include <mali_kbase_vinstr.h>
-
-#include <mali_kbase_pm.h>
-
-int kbase_pm_powerup(struct kbase_device *kbdev, unsigned int flags)
-{
-	return kbase_hwaccess_pm_powerup(kbdev, flags);
-}
-
-void kbase_pm_halt(struct kbase_device *kbdev)
-{
-	kbase_hwaccess_pm_halt(kbdev);
-}
-
-void kbase_pm_context_active(struct kbase_device *kbdev)
-{
-	(void)kbase_pm_context_active_handle_suspend(kbdev, KBASE_PM_SUSPEND_HANDLER_NOT_POSSIBLE);
-}
-
-int kbase_pm_context_active_handle_suspend(struct kbase_device *kbdev, enum kbase_pm_suspend_handler suspend_handler)
-{
-	struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
-	int c;
-	int old_count;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	/* Trace timeline information about how long it took to handle the decision
-	 * to powerup. Sometimes the event might be missed due to reading the count
-	 * outside of mutex, but this is necessary to get the trace timing
-	 * correct. */
-	old_count = kbdev->pm.active_count;
-	if (old_count == 0)
-		kbase_timeline_pm_send_event(kbdev, KBASE_TIMELINE_PM_EVENT_GPU_ACTIVE);
-
-	mutex_lock(&js_devdata->runpool_mutex);
-	mutex_lock(&kbdev->pm.lock);
-	if (kbase_pm_is_suspending(kbdev)) {
-		switch (suspend_handler) {
-		case KBASE_PM_SUSPEND_HANDLER_DONT_REACTIVATE:
-			if (kbdev->pm.active_count != 0)
-				break;
-			/* FALLTHROUGH */
-		case KBASE_PM_SUSPEND_HANDLER_DONT_INCREASE:
-			mutex_unlock(&kbdev->pm.lock);
-			mutex_unlock(&js_devdata->runpool_mutex);
-			if (old_count == 0)
-				kbase_timeline_pm_handle_event(kbdev, KBASE_TIMELINE_PM_EVENT_GPU_ACTIVE);
-			return 1;
-
-		case KBASE_PM_SUSPEND_HANDLER_NOT_POSSIBLE:
-			/* FALLTHROUGH */
-		default:
-			KBASE_DEBUG_ASSERT_MSG(false, "unreachable");
-			break;
-		}
-	}
-	c = ++kbdev->pm.active_count;
-	KBASE_TIMELINE_CONTEXT_ACTIVE(kbdev, c);
-	KBASE_TRACE_ADD_REFCOUNT(kbdev, PM_CONTEXT_ACTIVE, NULL, NULL, 0u, c);
-
-	/* Trace the event being handled */
-	if (old_count == 0)
-		kbase_timeline_pm_handle_event(kbdev, KBASE_TIMELINE_PM_EVENT_GPU_ACTIVE);
-
-	if (c == 1)
-		/* First context active: Power on the GPU and any cores requested by
-		 * the policy */
-		kbase_hwaccess_pm_gpu_active(kbdev);
-
-	mutex_unlock(&kbdev->pm.lock);
-	mutex_unlock(&js_devdata->runpool_mutex);
-
-	return 0;
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_context_active);
-
-void kbase_pm_context_idle(struct kbase_device *kbdev)
-{
-	struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
-	int c;
-	int old_count;
-
-	KBASE_DEBUG_ASSERT(kbdev != NULL);
-
-	/* Trace timeline information about how long it took to handle the decision
-	 * to powerdown. Sometimes the event might be missed due to reading the
-	 * count outside of mutex, but this is necessary to get the trace timing
-	 * correct. */
-	old_count = kbdev->pm.active_count;
-	if (old_count == 0)
-		kbase_timeline_pm_send_event(kbdev, KBASE_TIMELINE_PM_EVENT_GPU_IDLE);
-
-	mutex_lock(&js_devdata->runpool_mutex);
-	mutex_lock(&kbdev->pm.lock);
-
-	c = --kbdev->pm.active_count;
-	KBASE_TIMELINE_CONTEXT_ACTIVE(kbdev, c);
-	KBASE_TRACE_ADD_REFCOUNT(kbdev, PM_CONTEXT_IDLE, NULL, NULL, 0u, c);
-
-	KBASE_DEBUG_ASSERT(c >= 0);
-
-	/* Trace the event being handled */
-	if (old_count == 0)
-		kbase_timeline_pm_handle_event(kbdev, KBASE_TIMELINE_PM_EVENT_GPU_IDLE);
-
-	if (c == 0) {
-		/* Last context has gone idle */
-		kbase_hwaccess_pm_gpu_idle(kbdev);
-
-		/* Wake up anyone waiting for this to become 0 (e.g. suspend). The
-		 * waiters must synchronize with us by locking the pm.lock after
-		 * waiting */
-		wake_up(&kbdev->pm.zero_active_count_wait);
-	}
-
-	mutex_unlock(&kbdev->pm.lock);
-	mutex_unlock(&js_devdata->runpool_mutex);
-}
-
-KBASE_EXPORT_TEST_API(kbase_pm_context_idle);
-
-void kbase_pm_suspend(struct kbase_device *kbdev)
-{
-	KBASE_DEBUG_ASSERT(kbdev);
-
-	/* Suspend vinstr.
-	 * This call will block until vinstr is suspended. */
-	kbase_vinstr_suspend(kbdev->vinstr_ctx);
-
-	mutex_lock(&kbdev->pm.lock);
-	KBASE_DEBUG_ASSERT(!kbase_pm_is_suspending(kbdev));
-	kbdev->pm.suspending = true;
-	mutex_unlock(&kbdev->pm.lock);
-
-	/* From now on, the active count will drop towards zero. Sometimes, it'll
-	 * go up briefly before going down again. However, once it reaches zero it
-	 * will stay there - guaranteeing that we've idled all pm references */
-
-	/* Suspend job scheduler and associated components, so that it releases all
-	 * the PM active count references */
-	kbasep_js_suspend(kbdev);
-
-	/* Wait for the active count to reach zero. This is not the same as
-	 * waiting for a power down, since not all policies power down when this
-	 * reaches zero. */
-	wait_event(kbdev->pm.zero_active_count_wait, kbdev->pm.active_count == 0);
-
-	/* NOTE: We synchronize with anything that was just finishing a
-	 * kbase_pm_context_idle() call by locking the pm.lock below */
-
-	kbase_hwaccess_pm_suspend(kbdev);
-}
-
-void kbase_pm_resume(struct kbase_device *kbdev)
-{
-	/* MUST happen before any pm_context_active calls occur */
-	kbase_hwaccess_pm_resume(kbdev);
-
-	/* Initial active call, to power on the GPU/cores if needed */
-	kbase_pm_context_active(kbdev);
-
-	/* Resume any blocked atoms (which may cause contexts to be scheduled in
-	 * and dependent atoms to run) */
-	kbase_resume_suspended_soft_jobs(kbdev);
-
-	/* Resume the Job Scheduler and associated components, and start running
-	 * atoms */
-	kbasep_js_resume(kbdev);
-
-	/* Matching idle call, to power off the GPU/cores if we didn't actually
-	 * need it and the policy doesn't want it on */
-	kbase_pm_context_idle(kbdev);
-
-	/* Resume vinstr operation */
-	kbase_vinstr_resume(kbdev->vinstr_ctx);
-}
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_pm.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_pm.h
deleted file mode 100644
index 37fa2479df74..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_pm.h
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/**
- * @file mali_kbase_pm.h
- * Power management API definitions
- */
-
-#ifndef _KBASE_PM_H_
-#define _KBASE_PM_H_
-
-#include "mali_kbase_hwaccess_pm.h"
-
-#define PM_ENABLE_IRQS       0x01
-#define PM_HW_ISSUES_DETECT  0x02
-
-
-/** Initialize the power management framework.
- *
- * Must be called before any other power management function
- *
- * @param kbdev     The kbase device structure for the device (must be a valid pointer)
- *
- * @return 0 if the power management framework was successfully initialized.
- */
-int kbase_pm_init(struct kbase_device *kbdev);
-
-/** Power up GPU after all modules have been initialized and interrupt handlers installed.
- *
- * @param kbdev     The kbase device structure for the device (must be a valid pointer)
- *
- * @param flags     Flags to pass on to kbase_pm_init_hw
- *
- * @return 0 if powerup was successful.
- */
-int kbase_pm_powerup(struct kbase_device *kbdev, unsigned int flags);
-
-/**
- * Halt the power management framework.
- * Should ensure that no new interrupts are generated,
- * but allow any currently running interrupt handlers to complete successfully.
- * The GPU is forced off by the time this function returns, regardless of
- * whether or not the active power policy asks for the GPU to be powered off.
- *
- * @param kbdev     The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_halt(struct kbase_device *kbdev);
-
-/** Terminate the power management framework.
- *
- * No power management functions may be called after this
- * (except @ref kbase_pm_init)
- *
- * @param kbdev     The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_term(struct kbase_device *kbdev);
-
-/** Increment the count of active contexts.
- *
- * This function should be called when a context is about to submit a job. It informs the active power policy that the
- * GPU is going to be in use shortly and the policy is expected to start turning on the GPU.
- *
- * This function will block until the GPU is available.
- *
- * This function ASSERTS if a suspend is occuring/has occurred whilst this is
- * in use. Use kbase_pm_contect_active_unless_suspending() instead.
- *
- * @note a Suspend is only visible to Kernel threads; user-space threads in a
- * syscall cannot witness a suspend, because they are frozen before the suspend
- * begins.
- *
- * @param kbdev     The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_context_active(struct kbase_device *kbdev);
-
-
-/** Handler codes for doing kbase_pm_context_active_handle_suspend() */
-enum kbase_pm_suspend_handler {
-	/** A suspend is not expected/not possible - this is the same as
-	 * kbase_pm_context_active() */
-	KBASE_PM_SUSPEND_HANDLER_NOT_POSSIBLE,
-	/** If we're suspending, fail and don't increase the active count */
-	KBASE_PM_SUSPEND_HANDLER_DONT_INCREASE,
-	/** If we're suspending, succeed and allow the active count to increase iff
-	 * it didn't go from 0->1 (i.e., we didn't re-activate the GPU).
-	 *
-	 * This should only be used when there is a bounded time on the activation
-	 * (e.g. guarantee it's going to be idled very soon after) */
-	KBASE_PM_SUSPEND_HANDLER_DONT_REACTIVATE
-};
-
-/** Suspend 'safe' variant of kbase_pm_context_active()
- *
- * If a suspend is in progress, this allows for various different ways of
- * handling the suspend. Refer to @ref enum kbase_pm_suspend_handler for details.
- *
- * We returns a status code indicating whether we're allowed to keep the GPU
- * active during the suspend, depending on the handler code. If the status code
- * indicates a failure, the caller must abort whatever operation it was
- * attempting, and potentially queue it up for after the OS has resumed.
- *
- * @param kbdev     The kbase device structure for the device (must be a valid pointer)
- * @param suspend_handler The handler code for how to handle a suspend that might occur
- * @return zero     Indicates success
- * @return non-zero Indicates failure due to the system being suspending/suspended.
- */
-int kbase_pm_context_active_handle_suspend(struct kbase_device *kbdev, enum kbase_pm_suspend_handler suspend_handler);
-
-/** Decrement the reference count of active contexts.
- *
- * This function should be called when a context becomes idle. After this call the GPU may be turned off by the power
- * policy so the calling code should ensure that it does not access the GPU's registers.
- *
- * @param kbdev     The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_context_idle(struct kbase_device *kbdev);
-
-/**
- * Suspend the GPU and prevent any further register accesses to it from Kernel
- * threads.
- *
- * This is called in response to an OS suspend event, and calls into the various
- * kbase components to complete the suspend.
- *
- * @note the mechanisms used here rely on all user-space threads being frozen
- * by the OS before we suspend. Otherwise, an IOCTL could occur that powers up
- * the GPU e.g. via atom submission.
- *
- * @param kbdev     The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_suspend(struct kbase_device *kbdev);
-
-/**
- * Resume the GPU, allow register accesses to it, and resume running atoms on
- * the GPU.
- *
- * This is called in response to an OS resume event, and calls into the various
- * kbase components to complete the resume.
- *
- * @param kbdev     The kbase device structure for the device (must be a valid pointer)
- */
-void kbase_pm_resume(struct kbase_device *kbdev);
-
-/**
- * kbase_pm_vsync_callback - vsync callback
- *
- * @buffer_updated: 1 if a new frame was displayed, 0 otherwise
- * @data: Pointer to the kbase device as returned by kbase_find_device()
- *
- * Callback function used to notify the power management code that a vsync has
- * occurred on the display.
- */
-void kbase_pm_vsync_callback(int buffer_updated, void *data);
-
-#endif				/* _KBASE_PM_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_profiling_gator_api.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_profiling_gator_api.h
deleted file mode 100644
index 7fb674eded37..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_profiling_gator_api.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010, 2013 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/**
- * @file mali_kbase_profiling_gator_api.h
- * Model interface
- */
-
-#ifndef _KBASE_PROFILING_GATOR_API_H_
-#define _KBASE_PROFILING_GATOR_API_H_
-
-/*
- * List of possible actions to be controlled by Streamline.
- * The following numbers are used by gator to control
- * the frame buffer dumping and s/w counter reporting.
- */
-#define FBDUMP_CONTROL_ENABLE (1)
-#define FBDUMP_CONTROL_RATE (2)
-#define SW_COUNTER_ENABLE (3)
-#define FBDUMP_CONTROL_RESIZE_FACTOR (4)
-#define FBDUMP_CONTROL_MAX (5)
-#define FBDUMP_CONTROL_MIN FBDUMP_CONTROL_ENABLE
-
-void _mali_profiling_control(u32 action, u32 value);
-
-#endif				/* _KBASE_PROFILING_GATOR_API */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_regs_history_debugfs.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_regs_history_debugfs.c
deleted file mode 100644
index 9e73f9f4999e..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_regs_history_debugfs.c
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include "mali_kbase.h"
-
-#include "mali_kbase_regs_history_debugfs.h"
-
-#if defined(CONFIG_DEBUG_FS) && !defined(CONFIG_MALI_BIFROST_NO_MALI)
-
-#include <linux/debugfs.h>
-
-
-static int regs_history_size_get(void *data, u64 *val)
-{
-	struct kbase_io_history *const h = data;
-
-	*val = h->size;
-
-	return 0;
-}
-
-static int regs_history_size_set(void *data, u64 val)
-{
-	struct kbase_io_history *const h = data;
-
-	return kbase_io_history_resize(h, (u16)val);
-}
-
-
-DEFINE_SIMPLE_ATTRIBUTE(regs_history_size_fops,
-		regs_history_size_get,
-		regs_history_size_set,
-		"%llu\n");
-
-
-/**
- * regs_history_show - show callback for the register access history file.
- *
- * @sfile: The debugfs entry
- * @data: Data associated with the entry
- *
- * This function is called to dump all recent accesses to the GPU registers.
- *
- * @return 0 if successfully prints data in debugfs entry file, failure
- * otherwise
- */
-static int regs_history_show(struct seq_file *sfile, void *data)
-{
-	struct kbase_io_history *const h = sfile->private;
-	u16 i;
-	size_t iters;
-	unsigned long flags;
-
-	if (!h->enabled) {
-		seq_puts(sfile, "The register access history is disabled\n");
-		goto out;
-	}
-
-	spin_lock_irqsave(&h->lock, flags);
-
-	iters = (h->size > h->count) ? h->count : h->size;
-	seq_printf(sfile, "Last %zu register accesses of %zu total:\n", iters,
-			h->count);
-	for (i = 0; i < iters; ++i) {
-		struct kbase_io_access *io =
-			&h->buf[(h->count - iters + i) % h->size];
-		char const access = (io->addr & 1) ? 'w' : 'r';
-
-		seq_printf(sfile, "%6i: %c: reg 0x%p val %08x\n", i, access,
-				(void *)(io->addr & ~0x1), io->value);
-	}
-
-	spin_unlock_irqrestore(&h->lock, flags);
-
-out:
-	return 0;
-}
-
-
-/**
- * regs_history_open - open operation for regs_history debugfs file
- *
- * @in: &struct inode pointer
- * @file: &struct file pointer
- *
- * @return file descriptor
- */
-static int regs_history_open(struct inode *in, struct file *file)
-{
-	return single_open(file, &regs_history_show, in->i_private);
-}
-
-
-static const struct file_operations regs_history_fops = {
-	.open = &regs_history_open,
-	.read = seq_read,
-	.llseek = seq_lseek,
-	.release = single_release,
-};
-
-
-void kbasep_regs_history_debugfs_init(struct kbase_device *kbdev)
-{
-	debugfs_create_bool("regs_history_enabled", S_IRUGO | S_IWUSR,
-			kbdev->mali_debugfs_directory,
-			&kbdev->io_history.enabled);
-	debugfs_create_file("regs_history_size", S_IRUGO | S_IWUSR,
-			kbdev->mali_debugfs_directory,
-			&kbdev->io_history, &regs_history_size_fops);
-	debugfs_create_file("regs_history", S_IRUGO,
-			kbdev->mali_debugfs_directory, &kbdev->io_history,
-			&regs_history_fops);
-}
-
-
-#endif /* CONFIG_DEBUG_FS */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_regs_history_debugfs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_regs_history_debugfs.h
deleted file mode 100644
index fbb36b3f22e4..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_regs_history_debugfs.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/**
- * Header file for register access history support via debugfs
- *
- * This interface is made available via /sys/kernel/debug/mali#/regs_history*.
- *
- * Usage:
- * - regs_history_enabled: whether recording of register accesses is enabled.
- *   Write 'y' to enable, 'n' to disable.
- * - regs_history_size: size of the register history buffer, must be > 0
- * - regs_history: return the information about last accesses to the registers.
- */
-
-#ifndef _KBASE_REGS_HISTORY_DEBUGFS_H
-#define _KBASE_REGS_HISTORY_DEBUGFS_H
-
-struct kbase_device;
-
-#if defined(CONFIG_DEBUG_FS) && !defined(CONFIG_MALI_BIFROST_NO_MALI)
-
-/**
- * kbasep_regs_history_debugfs_init - add debugfs entries for register history
- *
- * @kbdev: Pointer to kbase_device containing the register history
- */
-void kbasep_regs_history_debugfs_init(struct kbase_device *kbdev);
-
-#else /* CONFIG_DEBUG_FS */
-
-#define kbasep_regs_history_debugfs_init CSTD_NOP
-
-#endif /* CONFIG_DEBUG_FS */
-
-#endif  /*_KBASE_REGS_HISTORY_DEBUGFS_H*/
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_replay.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_replay.c
deleted file mode 100644
index 9f4dc372770d..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_replay.c
+++ /dev/null
@@ -1,1166 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/**
- * @file mali_kbase_replay.c
- * Replay soft job handlers
- */
-
-#include <linux/dma-mapping.h>
-#include <mali_kbase_config.h>
-#include <mali_kbase.h>
-#include <mali_kbase_mem.h>
-#include <mali_kbase_mem_linux.h>
-
-#define JOB_NOT_STARTED 0
-#define JOB_TYPE_NULL      (1)
-#define JOB_TYPE_VERTEX    (5)
-#define JOB_TYPE_TILER     (7)
-#define JOB_TYPE_FUSED     (8)
-#define JOB_TYPE_FRAGMENT  (9)
-
-#define JOB_HEADER_32_FBD_OFFSET (31*4)
-#define JOB_HEADER_64_FBD_OFFSET (44*4)
-
-#define FBD_POINTER_MASK (~0x3f)
-
-#define SFBD_TILER_OFFSET (48*4)
-
-#define MFBD_TILER_OFFSET       (14*4)
-
-#define FBD_HIERARCHY_WEIGHTS 8
-#define FBD_HIERARCHY_MASK_MASK 0x1fff
-
-#define FBD_TYPE 1
-
-#define HIERARCHY_WEIGHTS 13
-
-#define JOB_HEADER_ID_MAX                 0xffff
-
-#define JOB_SOURCE_ID(status)		(((status) >> 16) & 0xFFFF)
-#define JOB_POLYGON_LIST		(0x03)
-
-struct fragment_job {
-	struct job_descriptor_header header;
-
-	u32 x[2];
-	union {
-		u64 _64;
-		u32 _32;
-	} fragment_fbd;
-};
-
-static void dump_job_head(struct kbase_context *kctx, char *head_str,
-		struct job_descriptor_header *job)
-{
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-	dev_dbg(kctx->kbdev->dev, "%s\n", head_str);
-	dev_dbg(kctx->kbdev->dev,
-			"addr                  = %p\n"
-			"exception_status      = %x (Source ID: 0x%x Access: 0x%x Exception: 0x%x)\n"
-			"first_incomplete_task = %x\n"
-			"fault_pointer         = %llx\n"
-			"job_descriptor_size   = %x\n"
-			"job_type              = %x\n"
-			"job_barrier           = %x\n"
-			"_reserved_01          = %x\n"
-			"_reserved_02          = %x\n"
-			"_reserved_03          = %x\n"
-			"_reserved_04/05       = %x,%x\n"
-			"job_index             = %x\n"
-			"dependencies          = %x,%x\n",
-			job, job->exception_status,
-			JOB_SOURCE_ID(job->exception_status),
-			(job->exception_status >> 8) & 0x3,
-			job->exception_status  & 0xFF,
-			job->first_incomplete_task,
-			job->fault_pointer, job->job_descriptor_size,
-			job->job_type, job->job_barrier, job->_reserved_01,
-			job->_reserved_02, job->_reserved_03,
-			job->_reserved_04, job->_reserved_05,
-			job->job_index,
-			job->job_dependency_index_1,
-			job->job_dependency_index_2);
-
-	if (job->job_descriptor_size)
-		dev_dbg(kctx->kbdev->dev, "next               = %llx\n",
-				job->next_job._64);
-	else
-		dev_dbg(kctx->kbdev->dev, "next               = %x\n",
-				job->next_job._32);
-#endif
-}
-
-static int kbasep_replay_reset_sfbd(struct kbase_context *kctx,
-		u64 fbd_address, u64 tiler_heap_free,
-		u16 hierarchy_mask, u32 default_weight)
-{
-	struct {
-		u32 padding_1[1];
-		u32 flags;
-		u64 padding_2[2];
-		u64 heap_free_address;
-		u32 padding[8];
-		u32 weights[FBD_HIERARCHY_WEIGHTS];
-	} *fbd_tiler;
-	struct kbase_vmap_struct map;
-
-	dev_dbg(kctx->kbdev->dev, "fbd_address: %llx\n", fbd_address);
-
-	fbd_tiler = kbase_vmap(kctx, fbd_address + SFBD_TILER_OFFSET,
-			sizeof(*fbd_tiler), &map);
-	if (!fbd_tiler) {
-		dev_err(kctx->kbdev->dev, "kbasep_replay_reset_fbd: failed to map fbd\n");
-		return -EINVAL;
-	}
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-	dev_dbg(kctx->kbdev->dev,
-		"FBD tiler:\n"
-		"flags = %x\n"
-		"heap_free_address = %llx\n",
-		fbd_tiler->flags, fbd_tiler->heap_free_address);
-#endif
-	if (hierarchy_mask) {
-		u32 weights[HIERARCHY_WEIGHTS];
-		u16 old_hierarchy_mask = fbd_tiler->flags &
-						       FBD_HIERARCHY_MASK_MASK;
-		int i, j = 0;
-
-		for (i = 0; i < HIERARCHY_WEIGHTS; i++) {
-			if (old_hierarchy_mask & (1 << i)) {
-				KBASE_DEBUG_ASSERT(j < FBD_HIERARCHY_WEIGHTS);
-				weights[i] = fbd_tiler->weights[j++];
-			} else {
-				weights[i] = default_weight;
-			}
-		}
-
-
-		dev_dbg(kctx->kbdev->dev, "Old hierarchy mask=%x  New hierarchy mask=%x\n",
-				old_hierarchy_mask, hierarchy_mask);
-
-		for (i = 0; i < HIERARCHY_WEIGHTS; i++)
-			dev_dbg(kctx->kbdev->dev, " Hierarchy weight %02d: %08x\n",
-					i, weights[i]);
-
-		j = 0;
-
-		for (i = 0; i < HIERARCHY_WEIGHTS; i++) {
-			if (hierarchy_mask & (1 << i)) {
-				KBASE_DEBUG_ASSERT(j < FBD_HIERARCHY_WEIGHTS);
-
-				dev_dbg(kctx->kbdev->dev, " Writing hierarchy level %02d (%08x) to %d\n",
-						i, weights[i], j);
-
-				fbd_tiler->weights[j++] = weights[i];
-			}
-		}
-
-		for (; j < FBD_HIERARCHY_WEIGHTS; j++)
-			fbd_tiler->weights[j] = 0;
-
-		fbd_tiler->flags = hierarchy_mask | (1 << 16);
-	}
-
-	fbd_tiler->heap_free_address = tiler_heap_free;
-
-	dev_dbg(kctx->kbdev->dev, "heap_free_address=%llx flags=%x\n",
-			fbd_tiler->heap_free_address, fbd_tiler->flags);
-
-	kbase_vunmap(kctx, &map);
-
-	return 0;
-}
-
-static int kbasep_replay_reset_mfbd(struct kbase_context *kctx,
-		u64 fbd_address, u64 tiler_heap_free,
-		u16 hierarchy_mask, u32 default_weight)
-{
-	struct kbase_vmap_struct map;
-	struct {
-		u32 padding_0;
-		u32 flags;
-		u64 padding_1[2];
-		u64 heap_free_address;
-		u64 padding_2;
-		u32 weights[FBD_HIERARCHY_WEIGHTS];
-	} *fbd_tiler;
-
-	dev_dbg(kctx->kbdev->dev, "fbd_address: %llx\n", fbd_address);
-
-	fbd_tiler = kbase_vmap(kctx, fbd_address + MFBD_TILER_OFFSET,
-			sizeof(*fbd_tiler), &map);
-	if (!fbd_tiler) {
-		dev_err(kctx->kbdev->dev,
-			       "kbasep_replay_reset_fbd: failed to map fbd\n");
-		return -EINVAL;
-	}
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-	dev_dbg(kctx->kbdev->dev, "FBD tiler:\n"
-			"flags = %x\n"
-			"heap_free_address = %llx\n",
-			fbd_tiler->flags,
-			fbd_tiler->heap_free_address);
-#endif
-	if (hierarchy_mask) {
-		u32 weights[HIERARCHY_WEIGHTS];
-		u16 old_hierarchy_mask = (fbd_tiler->flags) &
-						       FBD_HIERARCHY_MASK_MASK;
-		int i, j = 0;
-
-		for (i = 0; i < HIERARCHY_WEIGHTS; i++) {
-			if (old_hierarchy_mask & (1 << i)) {
-				KBASE_DEBUG_ASSERT(j < FBD_HIERARCHY_WEIGHTS);
-				weights[i] = fbd_tiler->weights[j++];
-			} else {
-				weights[i] = default_weight;
-			}
-		}
-
-
-		dev_dbg(kctx->kbdev->dev, "Old hierarchy mask=%x  New hierarchy mask=%x\n",
-				old_hierarchy_mask, hierarchy_mask);
-
-		for (i = 0; i < HIERARCHY_WEIGHTS; i++)
-			dev_dbg(kctx->kbdev->dev, " Hierarchy weight %02d: %08x\n",
-					i, weights[i]);
-
-		j = 0;
-
-		for (i = 0; i < HIERARCHY_WEIGHTS; i++) {
-			if (hierarchy_mask & (1 << i)) {
-				KBASE_DEBUG_ASSERT(j < FBD_HIERARCHY_WEIGHTS);
-
-				dev_dbg(kctx->kbdev->dev,
-				" Writing hierarchy level %02d (%08x) to %d\n",
-							     i, weights[i], j);
-
-				fbd_tiler->weights[j++] = weights[i];
-			}
-		}
-
-		for (; j < FBD_HIERARCHY_WEIGHTS; j++)
-			fbd_tiler->weights[j] = 0;
-
-		fbd_tiler->flags = hierarchy_mask | (1 << 16);
-	}
-
-	fbd_tiler->heap_free_address = tiler_heap_free;
-
-	kbase_vunmap(kctx, &map);
-
-	return 0;
-}
-
-/**
- * @brief Reset the status of an FBD pointed to by a tiler job
- *
- * This performs two functions :
- * - Set the hierarchy mask
- * - Reset the tiler free heap address
- *
- * @param[in] kctx              Context pointer
- * @param[in] job_header        Address of job header to reset.
- * @param[in] tiler_heap_free   The value to reset Tiler Heap Free to
- * @param[in] hierarchy_mask    The hierarchy mask to use
- * @param[in] default_weight    Default hierarchy weight to write when no other
- *                              weight is given in the FBD
- * @param[in] job_64            true if this job is using 64-bit
- *                              descriptors
- *
- * @return 0 on success, error code on failure
- */
-static int kbasep_replay_reset_tiler_job(struct kbase_context *kctx,
-		u64 job_header,	u64 tiler_heap_free,
-		u16 hierarchy_mask, u32 default_weight,	bool job_64)
-{
-	struct kbase_vmap_struct map;
-	u64 fbd_address;
-
-	if (job_64) {
-		u64 *job_ext;
-
-		job_ext = kbase_vmap(kctx,
-				job_header + JOB_HEADER_64_FBD_OFFSET,
-				sizeof(*job_ext), &map);
-
-		if (!job_ext) {
-			dev_err(kctx->kbdev->dev, "kbasep_replay_reset_tiler_job: failed to map jc\n");
-			return -EINVAL;
-		}
-
-		fbd_address = *job_ext;
-
-		kbase_vunmap(kctx, &map);
-	} else {
-		u32 *job_ext;
-
-		job_ext = kbase_vmap(kctx,
-				job_header + JOB_HEADER_32_FBD_OFFSET,
-				sizeof(*job_ext), &map);
-
-		if (!job_ext) {
-			dev_err(kctx->kbdev->dev, "kbasep_replay_reset_tiler_job: failed to map jc\n");
-			return -EINVAL;
-		}
-
-		fbd_address = *job_ext;
-
-		kbase_vunmap(kctx, &map);
-	}
-
-	if (fbd_address & FBD_TYPE) {
-		return kbasep_replay_reset_mfbd(kctx,
-						fbd_address & FBD_POINTER_MASK,
-						tiler_heap_free,
-						hierarchy_mask,
-						default_weight);
-	} else {
-		return kbasep_replay_reset_sfbd(kctx,
-						fbd_address & FBD_POINTER_MASK,
-						tiler_heap_free,
-						hierarchy_mask,
-						default_weight);
-	}
-}
-
-/**
- * @brief Reset the status of a job
- *
- * This performs the following functions :
- *
- * - Reset the Job Status field of each job to NOT_STARTED.
- * - Set the Job Type field of any Vertex Jobs to Null Job.
- * - For any jobs using an FBD, set the Tiler Heap Free field to the value of
- *   the tiler_heap_free parameter, and set the hierarchy level mask to the
- *   hier_mask parameter.
- * - Offset HW dependencies by the hw_job_id_offset parameter
- * - Set the Perform Job Barrier flag if this job is the first in the chain
- * - Read the address of the next job header
- *
- * @param[in] kctx              Context pointer
- * @param[in,out] job_header    Address of job header to reset. Set to address
- *                              of next job header on exit.
- * @param[in] prev_jc           Previous job chain to link to, if this job is
- *                              the last in the chain.
- * @param[in] hw_job_id_offset  Offset for HW job IDs
- * @param[in] tiler_heap_free   The value to reset Tiler Heap Free to
- * @param[in] hierarchy_mask    The hierarchy mask to use
- * @param[in] default_weight    Default hierarchy weight to write when no other
- *                              weight is given in the FBD
- * @param[in] first_in_chain    true if this job is the first in the chain
- * @param[in] fragment_chain    true if this job is in the fragment chain
- *
- * @return 0 on success, error code on failure
- */
-static int kbasep_replay_reset_job(struct kbase_context *kctx,
-		u64 *job_header, u64 prev_jc,
-		u64 tiler_heap_free, u16 hierarchy_mask,
-		u32 default_weight, u16 hw_job_id_offset,
-		bool first_in_chain, bool fragment_chain)
-{
-	struct fragment_job *frag_job;
-	struct job_descriptor_header *job;
-	u64 new_job_header;
-	struct kbase_vmap_struct map;
-
-	frag_job = kbase_vmap(kctx, *job_header, sizeof(*frag_job), &map);
-	if (!frag_job) {
-		dev_err(kctx->kbdev->dev,
-				 "kbasep_replay_parse_jc: failed to map jc\n");
-		return -EINVAL;
-	}
-	job = &frag_job->header;
-
-	dump_job_head(kctx, "Job header:", job);
-
-	if (job->exception_status == JOB_NOT_STARTED && !fragment_chain) {
-		dev_err(kctx->kbdev->dev, "Job already not started\n");
-		goto out_unmap;
-	}
-	job->exception_status = JOB_NOT_STARTED;
-
-	if (job->job_type == JOB_TYPE_VERTEX)
-		job->job_type = JOB_TYPE_NULL;
-
-	if (job->job_type == JOB_TYPE_FUSED) {
-		dev_err(kctx->kbdev->dev, "Fused jobs can not be replayed\n");
-		goto out_unmap;
-	}
-
-	if (first_in_chain)
-		job->job_barrier = 1;
-
-	if ((job->job_dependency_index_1 + hw_job_id_offset) >
-			JOB_HEADER_ID_MAX ||
-	    (job->job_dependency_index_2 + hw_job_id_offset) >
-			JOB_HEADER_ID_MAX ||
-	    (job->job_index + hw_job_id_offset) > JOB_HEADER_ID_MAX) {
-		dev_err(kctx->kbdev->dev,
-			     "Job indicies/dependencies out of valid range\n");
-		goto out_unmap;
-	}
-
-	if (job->job_dependency_index_1)
-		job->job_dependency_index_1 += hw_job_id_offset;
-	if (job->job_dependency_index_2)
-		job->job_dependency_index_2 += hw_job_id_offset;
-
-	job->job_index += hw_job_id_offset;
-
-	if (job->job_descriptor_size) {
-		new_job_header = job->next_job._64;
-		if (!job->next_job._64)
-			job->next_job._64 = prev_jc;
-	} else {
-		new_job_header = job->next_job._32;
-		if (!job->next_job._32)
-			job->next_job._32 = prev_jc;
-	}
-	dump_job_head(kctx, "Updated to:", job);
-
-	if (job->job_type == JOB_TYPE_TILER) {
-		bool job_64 = job->job_descriptor_size != 0;
-
-		if (kbasep_replay_reset_tiler_job(kctx, *job_header,
-				tiler_heap_free, hierarchy_mask,
-				default_weight, job_64) != 0)
-			goto out_unmap;
-
-	} else if (job->job_type == JOB_TYPE_FRAGMENT) {
-		u64 fbd_address;
-
-		if (job->job_descriptor_size)
-			fbd_address = frag_job->fragment_fbd._64;
-		else
-			fbd_address = (u64)frag_job->fragment_fbd._32;
-
-		if (fbd_address & FBD_TYPE) {
-			if (kbasep_replay_reset_mfbd(kctx,
-					fbd_address & FBD_POINTER_MASK,
-					tiler_heap_free,
-					hierarchy_mask,
-					default_weight) != 0)
-				goto out_unmap;
-		} else {
-			if (kbasep_replay_reset_sfbd(kctx,
-					fbd_address & FBD_POINTER_MASK,
-					tiler_heap_free,
-					hierarchy_mask,
-					default_weight) != 0)
-				goto out_unmap;
-		}
-	}
-
-	kbase_vunmap(kctx, &map);
-
-	*job_header = new_job_header;
-
-	return 0;
-
-out_unmap:
-	kbase_vunmap(kctx, &map);
-	return -EINVAL;
-}
-
-/**
- * @brief Find the highest job ID in a job chain
- *
- * @param[in] kctx        Context pointer
- * @param[in] jc          Job chain start address
- * @param[out] hw_job_id  Highest job ID in chain
- *
- * @return 0 on success, error code on failure
- */
-static int kbasep_replay_find_hw_job_id(struct kbase_context *kctx,
-		u64 jc,	u16 *hw_job_id)
-{
-	while (jc) {
-		struct job_descriptor_header *job;
-		struct kbase_vmap_struct map;
-
-		dev_dbg(kctx->kbdev->dev,
-			"kbasep_replay_find_hw_job_id: parsing jc=%llx\n", jc);
-
-		job = kbase_vmap(kctx, jc, sizeof(*job), &map);
-		if (!job) {
-			dev_err(kctx->kbdev->dev, "failed to map jc\n");
-
-			return -EINVAL;
-		}
-
-		if (job->job_index > *hw_job_id)
-			*hw_job_id = job->job_index;
-
-		if (job->job_descriptor_size)
-			jc = job->next_job._64;
-		else
-			jc = job->next_job._32;
-
-		kbase_vunmap(kctx, &map);
-	}
-
-	return 0;
-}
-
-/**
- * @brief Reset the status of a number of jobs
- *
- * This function walks the provided job chain, and calls
- * kbasep_replay_reset_job for each job. It also links the job chain to the
- * provided previous job chain.
- *
- * The function will fail if any of the jobs passed already have status of
- * NOT_STARTED.
- *
- * @param[in] kctx              Context pointer
- * @param[in] jc                Job chain to be processed
- * @param[in] prev_jc           Job chain to be added to. May be NULL
- * @param[in] tiler_heap_free   The value to reset Tiler Heap Free to
- * @param[in] hierarchy_mask    The hierarchy mask to use
- * @param[in] default_weight    Default hierarchy weight to write when no other
- *                              weight is given in the FBD
- * @param[in] hw_job_id_offset  Offset for HW job IDs
- * @param[in] fragment_chain    true if this chain is the fragment chain
- *
- * @return 0 on success, error code otherwise
- */
-static int kbasep_replay_parse_jc(struct kbase_context *kctx,
-		u64 jc,	u64 prev_jc,
-		u64 tiler_heap_free, u16 hierarchy_mask,
-		u32 default_weight, u16 hw_job_id_offset,
-		bool fragment_chain)
-{
-	bool first_in_chain = true;
-	int nr_jobs = 0;
-
-	dev_dbg(kctx->kbdev->dev, "kbasep_replay_parse_jc: jc=%llx hw_job_id=%x\n",
-			jc, hw_job_id_offset);
-
-	while (jc) {
-		dev_dbg(kctx->kbdev->dev, "kbasep_replay_parse_jc: parsing jc=%llx\n", jc);
-
-		if (kbasep_replay_reset_job(kctx, &jc, prev_jc,
-				tiler_heap_free, hierarchy_mask,
-				default_weight, hw_job_id_offset,
-				first_in_chain, fragment_chain) != 0)
-			return -EINVAL;
-
-		first_in_chain = false;
-
-		nr_jobs++;
-		if (fragment_chain &&
-		    nr_jobs >= BASE_JD_REPLAY_F_CHAIN_JOB_LIMIT) {
-			dev_err(kctx->kbdev->dev,
-				"Exceeded maximum number of jobs in fragment chain\n");
-			return -EINVAL;
-		}
-	}
-
-	return 0;
-}
-
-/**
- * @brief Reset the status of a replay job, and set up dependencies
- *
- * This performs the actions to allow the replay job to be re-run following
- * completion of the passed dependency.
- *
- * @param[in] katom     The atom to be reset
- * @param[in] dep_atom  The dependency to be attached to the atom
- */
-static void kbasep_replay_reset_softjob(struct kbase_jd_atom *katom,
-		struct kbase_jd_atom *dep_atom)
-{
-	katom->status = KBASE_JD_ATOM_STATE_QUEUED;
-	kbase_jd_katom_dep_set(&katom->dep[0], dep_atom, BASE_JD_DEP_TYPE_DATA);
-	list_add_tail(&katom->dep_item[0], &dep_atom->dep_head[0]);
-}
-
-/**
- * @brief Allocate an unused katom
- *
- * This will search the provided context for an unused katom, and will mark it
- * as KBASE_JD_ATOM_STATE_QUEUED.
- *
- * If no atoms are available then the function will fail.
- *
- * @param[in] kctx      Context pointer
- * @return An atom ID, or -1 on failure
- */
-static int kbasep_allocate_katom(struct kbase_context *kctx)
-{
-	struct kbase_jd_context *jctx = &kctx->jctx;
-	int i;
-
-	for (i = BASE_JD_ATOM_COUNT-1; i > 0; i--) {
-		if (jctx->atoms[i].status == KBASE_JD_ATOM_STATE_UNUSED) {
-			jctx->atoms[i].status = KBASE_JD_ATOM_STATE_QUEUED;
-			dev_dbg(kctx->kbdev->dev,
-				  "kbasep_allocate_katom: Allocated atom %d\n",
-									    i);
-			return i;
-		}
-	}
-
-	return -1;
-}
-
-/**
- * @brief Release a katom
- *
- * This will mark the provided atom as available, and remove any dependencies.
- *
- * For use on error path.
- *
- * @param[in] kctx      Context pointer
- * @param[in] atom_id   ID of atom to release
- */
-static void kbasep_release_katom(struct kbase_context *kctx, int atom_id)
-{
-	struct kbase_jd_context *jctx = &kctx->jctx;
-
-	dev_dbg(kctx->kbdev->dev, "kbasep_release_katom: Released atom %d\n",
-			atom_id);
-
-	while (!list_empty(&jctx->atoms[atom_id].dep_head[0]))
-		list_del(jctx->atoms[atom_id].dep_head[0].next);
-
-	while (!list_empty(&jctx->atoms[atom_id].dep_head[1]))
-		list_del(jctx->atoms[atom_id].dep_head[1].next);
-
-	jctx->atoms[atom_id].status = KBASE_JD_ATOM_STATE_UNUSED;
-}
-
-static void kbasep_replay_create_atom(struct kbase_context *kctx,
-				      struct base_jd_atom_v2 *atom,
-				      int atom_nr,
-				      base_jd_prio prio)
-{
-	atom->nr_extres = 0;
-	atom->extres_list = 0;
-	atom->device_nr = 0;
-	atom->prio = prio;
-	atom->atom_number = atom_nr;
-
-	base_jd_atom_dep_set(&atom->pre_dep[0], 0 , BASE_JD_DEP_TYPE_INVALID);
-	base_jd_atom_dep_set(&atom->pre_dep[1], 0 , BASE_JD_DEP_TYPE_INVALID);
-
-	atom->udata.blob[0] = 0;
-	atom->udata.blob[1] = 0;
-}
-
-/**
- * @brief Create two atoms for the purpose of replaying jobs
- *
- * Two atoms are allocated and created. The jc pointer is not set at this
- * stage. The second atom has a dependency on the first. The remaining fields
- * are set up as follows :
- *
- * - No external resources. Any required external resources will be held by the
- *   replay atom.
- * - device_nr is set to 0. This is not relevant as
- *   BASE_JD_REQ_SPECIFIC_COHERENT_GROUP should not be set.
- * - Priority is inherited from the replay job.
- *
- * @param[out] t_atom      Atom to use for tiler jobs
- * @param[out] f_atom      Atom to use for fragment jobs
- * @param[in]  prio        Priority of new atom (inherited from replay soft
- *                         job)
- * @return 0 on success, error code on failure
- */
-static int kbasep_replay_create_atoms(struct kbase_context *kctx,
-		struct base_jd_atom_v2 *t_atom,
-		struct base_jd_atom_v2 *f_atom,
-		base_jd_prio prio)
-{
-	int t_atom_nr, f_atom_nr;
-
-	t_atom_nr = kbasep_allocate_katom(kctx);
-	if (t_atom_nr < 0) {
-		dev_err(kctx->kbdev->dev, "Failed to allocate katom\n");
-		return -EINVAL;
-	}
-
-	f_atom_nr = kbasep_allocate_katom(kctx);
-	if (f_atom_nr < 0) {
-		dev_err(kctx->kbdev->dev, "Failed to allocate katom\n");
-		kbasep_release_katom(kctx, t_atom_nr);
-		return -EINVAL;
-	}
-
-	kbasep_replay_create_atom(kctx, t_atom, t_atom_nr, prio);
-	kbasep_replay_create_atom(kctx, f_atom, f_atom_nr, prio);
-
-	base_jd_atom_dep_set(&f_atom->pre_dep[0], t_atom_nr , BASE_JD_DEP_TYPE_DATA);
-
-	return 0;
-}
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-static void payload_dump(struct kbase_context *kctx, base_jd_replay_payload *payload)
-{
-	u64 next;
-
-	dev_dbg(kctx->kbdev->dev, "Tiler jc list :\n");
-	next = payload->tiler_jc_list;
-
-	while (next) {
-		struct kbase_vmap_struct map;
-		base_jd_replay_jc *jc_struct;
-
-		jc_struct = kbase_vmap(kctx, next, sizeof(*jc_struct), &map);
-
-		if (!jc_struct)
-			return;
-
-		dev_dbg(kctx->kbdev->dev, "* jc_struct=%p jc=%llx next=%llx\n",
-				jc_struct, jc_struct->jc, jc_struct->next);
-
-		next = jc_struct->next;
-
-		kbase_vunmap(kctx, &map);
-	}
-}
-#endif
-
-/**
- * @brief Parse a base_jd_replay_payload provided by userspace
- *
- * This will read the payload from userspace, and parse the job chains.
- *
- * @param[in] kctx         Context pointer
- * @param[in] replay_atom  Replay soft job atom
- * @param[in] t_atom       Atom to use for tiler jobs
- * @param[in] f_atom       Atom to use for fragment jobs
- * @return 0 on success, error code on failure
- */
-static int kbasep_replay_parse_payload(struct kbase_context *kctx,
-					      struct kbase_jd_atom *replay_atom,
-					      struct base_jd_atom_v2 *t_atom,
-					      struct base_jd_atom_v2 *f_atom)
-{
-	base_jd_replay_payload *payload = NULL;
-	u64 next;
-	u64 prev_jc = 0;
-	u16 hw_job_id_offset = 0;
-	int ret = -EINVAL;
-	struct kbase_vmap_struct map;
-
-	dev_dbg(kctx->kbdev->dev, "kbasep_replay_parse_payload: replay_atom->jc = %llx sizeof(payload) = %zu\n",
-			replay_atom->jc, sizeof(payload));
-
-	payload = kbase_vmap(kctx, replay_atom->jc, sizeof(*payload), &map);
-	if (!payload) {
-		dev_err(kctx->kbdev->dev, "kbasep_replay_parse_payload: failed to map payload into kernel space\n");
-		return -EINVAL;
-	}
-
-#ifdef BASE_LEGACY_UK10_2_SUPPORT
-	if (KBASE_API_VERSION(10, 3) > replay_atom->kctx->api_version) {
-		base_jd_replay_payload_uk10_2 *payload_uk10_2;
-		u16 tiler_core_req;
-		u16 fragment_core_req;
-
-		payload_uk10_2 = (base_jd_replay_payload_uk10_2 *) payload;
-		memcpy(&tiler_core_req, &payload_uk10_2->tiler_core_req,
-				sizeof(tiler_core_req));
-		memcpy(&fragment_core_req, &payload_uk10_2->fragment_core_req,
-				sizeof(fragment_core_req));
-		payload->tiler_core_req = (u32)(tiler_core_req & 0x7fff);
-		payload->fragment_core_req = (u32)(fragment_core_req & 0x7fff);
-	}
-#endif /* BASE_LEGACY_UK10_2_SUPPORT */
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-	dev_dbg(kctx->kbdev->dev, "kbasep_replay_parse_payload: payload=%p\n", payload);
-	dev_dbg(kctx->kbdev->dev, "Payload structure:\n"
-				  "tiler_jc_list            = %llx\n"
-				  "fragment_jc              = %llx\n"
-				  "tiler_heap_free          = %llx\n"
-				  "fragment_hierarchy_mask  = %x\n"
-				  "tiler_hierarchy_mask     = %x\n"
-				  "hierarchy_default_weight = %x\n"
-				  "tiler_core_req           = %x\n"
-				  "fragment_core_req        = %x\n",
-							payload->tiler_jc_list,
-							  payload->fragment_jc,
-						      payload->tiler_heap_free,
-					      payload->fragment_hierarchy_mask,
-						 payload->tiler_hierarchy_mask,
-					     payload->hierarchy_default_weight,
-						       payload->tiler_core_req,
-						   payload->fragment_core_req);
-	payload_dump(kctx, payload);
-#endif
-	t_atom->core_req = payload->tiler_core_req | BASEP_JD_REQ_EVENT_NEVER;
-	f_atom->core_req = payload->fragment_core_req | BASEP_JD_REQ_EVENT_NEVER;
-
-	/* Sanity check core requirements*/
-	if ((t_atom->core_req & BASE_JD_REQ_ATOM_TYPE) != BASE_JD_REQ_T ||
-	    (f_atom->core_req & BASE_JD_REQ_ATOM_TYPE) != BASE_JD_REQ_FS ||
-	     t_atom->core_req & BASE_JD_REQ_EXTERNAL_RESOURCES ||
-	     f_atom->core_req & BASE_JD_REQ_EXTERNAL_RESOURCES) {
-
-		int t_atom_type = t_atom->core_req & BASE_JD_REQ_ATOM_TYPE & ~BASE_JD_REQ_COHERENT_GROUP;
-		int f_atom_type = f_atom->core_req & BASE_JD_REQ_ATOM_TYPE & ~BASE_JD_REQ_COHERENT_GROUP & ~BASE_JD_REQ_FS_AFBC;
-		int t_has_ex_res = t_atom->core_req & BASE_JD_REQ_EXTERNAL_RESOURCES;
-		int f_has_ex_res = f_atom->core_req & BASE_JD_REQ_EXTERNAL_RESOURCES;
-
-		if (t_atom_type != BASE_JD_REQ_T) {
-			dev_err(kctx->kbdev->dev, "Invalid core requirement: Tiler atom not a tiler job. Was: 0x%x\n Expected: 0x%x",
-			    t_atom_type, BASE_JD_REQ_T);
-		}
-		if (f_atom_type != BASE_JD_REQ_FS) {
-			dev_err(kctx->kbdev->dev, "Invalid core requirement: Fragment shader atom not a fragment shader. Was 0x%x Expected: 0x%x\n",
-			    f_atom_type, BASE_JD_REQ_FS);
-		}
-		if (t_has_ex_res) {
-			dev_err(kctx->kbdev->dev, "Invalid core requirement: Tiler atom has external resources.\n");
-		}
-		if (f_has_ex_res) {
-			dev_err(kctx->kbdev->dev, "Invalid core requirement: Fragment shader atom has external resources.\n");
-		}
-
-		goto out;
-	}
-
-	/* Process tiler job chains */
-	next = payload->tiler_jc_list;
-	if (!next) {
-		dev_err(kctx->kbdev->dev, "Invalid tiler JC list\n");
-		goto out;
-	}
-
-	while (next) {
-		base_jd_replay_jc *jc_struct;
-		struct kbase_vmap_struct jc_map;
-		u64 jc;
-
-		jc_struct = kbase_vmap(kctx, next, sizeof(*jc_struct), &jc_map);
-
-		if (!jc_struct) {
-			dev_err(kctx->kbdev->dev, "Failed to map jc struct\n");
-			goto out;
-		}
-
-		jc = jc_struct->jc;
-		next = jc_struct->next;
-		if (next)
-			jc_struct->jc = 0;
-
-		kbase_vunmap(kctx, &jc_map);
-
-		if (jc) {
-			u16 max_hw_job_id = 0;
-
-			if (kbasep_replay_find_hw_job_id(kctx, jc,
-					&max_hw_job_id) != 0)
-				goto out;
-
-			if (kbasep_replay_parse_jc(kctx, jc, prev_jc,
-					payload->tiler_heap_free,
-					payload->tiler_hierarchy_mask,
-					payload->hierarchy_default_weight,
-					hw_job_id_offset, false) != 0) {
-				goto out;
-			}
-
-			hw_job_id_offset += max_hw_job_id;
-
-			prev_jc = jc;
-		}
-	}
-	t_atom->jc = prev_jc;
-
-	/* Process fragment job chain */
-	f_atom->jc = payload->fragment_jc;
-	if (kbasep_replay_parse_jc(kctx, payload->fragment_jc, 0,
-			payload->tiler_heap_free,
-			payload->fragment_hierarchy_mask,
-			payload->hierarchy_default_weight, 0,
-			true) != 0) {
-		goto out;
-	}
-
-	if (!t_atom->jc || !f_atom->jc) {
-		dev_err(kctx->kbdev->dev, "Invalid payload\n");
-		goto out;
-	}
-
-	dev_dbg(kctx->kbdev->dev, "t_atom->jc=%llx f_atom->jc=%llx\n",
-			t_atom->jc, f_atom->jc);
-	ret = 0;
-
-out:
-	kbase_vunmap(kctx, &map);
-
-	return ret;
-}
-
-static void kbase_replay_process_worker(struct work_struct *data)
-{
-	struct kbase_jd_atom *katom;
-	struct kbase_context *kctx;
-	struct kbase_jd_context *jctx;
-	bool need_to_try_schedule_context = false;
-
-	struct base_jd_atom_v2 t_atom, f_atom;
-	struct kbase_jd_atom *t_katom, *f_katom;
-	base_jd_prio atom_prio;
-
-	katom = container_of(data, struct kbase_jd_atom, work);
-	kctx = katom->kctx;
-	jctx = &kctx->jctx;
-
-	mutex_lock(&jctx->lock);
-
-	atom_prio = kbasep_js_sched_prio_to_atom_prio(katom->sched_priority);
-
-	if (kbasep_replay_create_atoms(
-			kctx, &t_atom, &f_atom, atom_prio) != 0) {
-		katom->event_code = BASE_JD_EVENT_JOB_CANCELLED;
-		goto out;
-	}
-
-	t_katom = &jctx->atoms[t_atom.atom_number];
-	f_katom = &jctx->atoms[f_atom.atom_number];
-
-	if (kbasep_replay_parse_payload(kctx, katom, &t_atom, &f_atom) != 0) {
-		kbasep_release_katom(kctx, t_atom.atom_number);
-		kbasep_release_katom(kctx, f_atom.atom_number);
-		katom->event_code = BASE_JD_EVENT_JOB_CANCELLED;
-		goto out;
-	}
-
-	kbasep_replay_reset_softjob(katom, f_katom);
-
-	need_to_try_schedule_context |= jd_submit_atom(kctx, &t_atom, t_katom);
-	if (t_katom->event_code == BASE_JD_EVENT_JOB_INVALID) {
-		dev_err(kctx->kbdev->dev, "Replay failed to submit atom\n");
-		kbasep_release_katom(kctx, f_atom.atom_number);
-		katom->event_code = BASE_JD_EVENT_JOB_CANCELLED;
-		goto out;
-	}
-	need_to_try_schedule_context |= jd_submit_atom(kctx, &f_atom, f_katom);
-	if (f_katom->event_code == BASE_JD_EVENT_JOB_INVALID) {
-		dev_err(kctx->kbdev->dev, "Replay failed to submit atom\n");
-		katom->event_code = BASE_JD_EVENT_JOB_CANCELLED;
-		goto out;
-	}
-
-	katom->event_code = BASE_JD_EVENT_DONE;
-
-out:
-	if (katom->event_code != BASE_JD_EVENT_DONE) {
-		kbase_disjoint_state_down(kctx->kbdev);
-
-		need_to_try_schedule_context |= jd_done_nolock(katom, NULL);
-	}
-
-	if (need_to_try_schedule_context)
-		kbase_js_sched_all(kctx->kbdev);
-
-	mutex_unlock(&jctx->lock);
-}
-
-/**
- * @brief Check job replay fault
- *
- * This will read the job payload, checks fault type and source, then decides
- * whether replay is required.
- *
- * @param[in] katom       The atom to be processed
- * @return  true (success) if replay required or false on failure.
- */
-static bool kbase_replay_fault_check(struct kbase_jd_atom *katom)
-{
-	struct kbase_context *kctx = katom->kctx;
-	struct device *dev = kctx->kbdev->dev;
-	base_jd_replay_payload *payload;
-	u64 job_header;
-	u64 job_loop_detect;
-	struct job_descriptor_header *job;
-	struct kbase_vmap_struct job_map;
-	struct kbase_vmap_struct map;
-	bool err = false;
-
-	/* Replay job if fault is of type BASE_JD_EVENT_JOB_WRITE_FAULT or
-	 * if force_replay is enabled.
-	 */
-	if (BASE_JD_EVENT_TERMINATED == katom->event_code) {
-		return false;
-	} else if (BASE_JD_EVENT_JOB_WRITE_FAULT == katom->event_code) {
-		return true;
-	} else if (BASE_JD_EVENT_FORCE_REPLAY == katom->event_code) {
-		katom->event_code = BASE_JD_EVENT_DATA_INVALID_FAULT;
-		return true;
-	} else if (BASE_JD_EVENT_DATA_INVALID_FAULT != katom->event_code) {
-		/* No replay for faults of type other than
-		 * BASE_JD_EVENT_DATA_INVALID_FAULT.
-		 */
-		return false;
-	}
-
-	/* Job fault is BASE_JD_EVENT_DATA_INVALID_FAULT, now scan fragment jc
-	 * to find out whether the source of exception is POLYGON_LIST. Replay
-	 * is required if the source of fault is POLYGON_LIST.
-	 */
-	payload = kbase_vmap(kctx, katom->jc, sizeof(*payload), &map);
-	if (!payload) {
-		dev_err(dev, "kbase_replay_fault_check: failed to map payload.\n");
-		return false;
-	}
-
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-	dev_dbg(dev, "kbase_replay_fault_check: payload=%p\n", payload);
-	dev_dbg(dev, "\nPayload structure:\n"
-		     "fragment_jc              = 0x%llx\n"
-		     "fragment_hierarchy_mask  = 0x%x\n"
-		     "fragment_core_req        = 0x%x\n",
-		     payload->fragment_jc,
-		     payload->fragment_hierarchy_mask,
-		     payload->fragment_core_req);
-#endif
-	/* Process fragment job chain */
-	job_header      = (u64) payload->fragment_jc;
-	job_loop_detect = job_header;
-	while (job_header) {
-		job = kbase_vmap(kctx, job_header, sizeof(*job), &job_map);
-		if (!job) {
-			dev_err(dev, "failed to map jc\n");
-			/* unmap payload*/
-			kbase_vunmap(kctx, &map);
-			return false;
-		}
-
-
-		dump_job_head(kctx, "\njob_head structure:\n", job);
-
-		/* Replay only when the polygon list reader caused the
-		 * DATA_INVALID_FAULT */
-		if ((BASE_JD_EVENT_DATA_INVALID_FAULT == katom->event_code) &&
-		   (JOB_POLYGON_LIST == JOB_SOURCE_ID(job->exception_status))) {
-			err = true;
-			kbase_vunmap(kctx, &job_map);
-			break;
-		}
-
-		/* Move on to next fragment job in the list */
-		if (job->job_descriptor_size)
-			job_header = job->next_job._64;
-		else
-			job_header = job->next_job._32;
-
-		kbase_vunmap(kctx, &job_map);
-
-		/* Job chain loop detected */
-		if (job_header == job_loop_detect)
-			break;
-	}
-
-	/* unmap payload*/
-	kbase_vunmap(kctx, &map);
-
-	return err;
-}
-
-
-/**
- * @brief Process a replay job
- *
- * Called from kbase_process_soft_job.
- *
- * On exit, if the job has completed, katom->event_code will have been updated.
- * If the job has not completed, and is replaying jobs, then the atom status
- * will have been reset to KBASE_JD_ATOM_STATE_QUEUED.
- *
- * @param[in] katom  The atom to be processed
- * @return           false if the atom has completed
- *                   true if the atom is replaying jobs
- */
-bool kbase_replay_process(struct kbase_jd_atom *katom)
-{
-	struct kbase_context *kctx = katom->kctx;
-	struct kbase_device *kbdev = kctx->kbdev;
-
-	/* Don't replay this atom if these issues are not present in the
-	 * hardware */
-	if (!kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_11020) &&
-			!kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_11024)) {
-		dev_dbg(kbdev->dev, "Hardware does not need replay workaround");
-
-		/* Signal failure to userspace */
-		katom->event_code = BASE_JD_EVENT_JOB_INVALID;
-
-		return false;
-	}
-
-	if (katom->event_code == BASE_JD_EVENT_DONE) {
-		dev_dbg(kbdev->dev, "Previous job succeeded - not replaying\n");
-
-		if (katom->retry_count)
-			kbase_disjoint_state_down(kbdev);
-
-		return false;
-	}
-
-	if (kbase_ctx_flag(kctx, KCTX_DYING)) {
-		dev_dbg(kbdev->dev, "Not replaying; context is dying\n");
-
-		if (katom->retry_count)
-			kbase_disjoint_state_down(kbdev);
-
-		return false;
-	}
-
-	/* Check job exception type and source before replaying. */
-	if (!kbase_replay_fault_check(katom)) {
-		dev_dbg(kbdev->dev,
-			"Replay cancelled on event %x\n", katom->event_code);
-		/* katom->event_code is already set to the failure code of the
-		 * previous job.
-		 */
-		return false;
-	}
-
-	dev_warn(kbdev->dev, "Replaying jobs retry=%d\n",
-			katom->retry_count);
-
-	katom->retry_count++;
-
-	if (katom->retry_count > BASEP_JD_REPLAY_LIMIT) {
-		dev_err(kbdev->dev, "Replay exceeded limit - failing jobs\n");
-
-		kbase_disjoint_state_down(kbdev);
-
-		/* katom->event_code is already set to the failure code of the
-		   previous job */
-		return false;
-	}
-
-	/* only enter the disjoint state once for the whole time while the replay is ongoing */
-	if (katom->retry_count == 1)
-		kbase_disjoint_state_up(kbdev);
-
-	INIT_WORK(&katom->work, kbase_replay_process_worker);
-	queue_work(kctx->event_workq, &katom->work);
-
-	return true;
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_smc.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_smc.c
deleted file mode 100644
index 43175c85988f..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_smc.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifdef CONFIG_ARM64
-
-#include <mali_kbase.h>
-#include <mali_kbase_smc.h>
-
-#include <linux/compiler.h>
-
-static noinline u64 invoke_smc_fid(u64 function_id,
-		u64 arg0, u64 arg1, u64 arg2)
-{
-	register u64 x0 asm("x0") = function_id;
-	register u64 x1 asm("x1") = arg0;
-	register u64 x2 asm("x2") = arg1;
-	register u64 x3 asm("x3") = arg2;
-
-	asm volatile(
-			__asmeq("%0", "x0")
-			__asmeq("%1", "x1")
-			__asmeq("%2", "x2")
-			__asmeq("%3", "x3")
-			"smc    #0\n"
-			: "+r" (x0)
-			: "r" (x1), "r" (x2), "r" (x3));
-
-	return x0;
-}
-
-u64 kbase_invoke_smc_fid(u32 fid, u64 arg0, u64 arg1, u64 arg2)
-{
-	/* Is fast call (bit 31 set) */
-	KBASE_DEBUG_ASSERT(fid & ~SMC_FAST_CALL);
-	/* bits 16-23 must be zero for fast calls */
-	KBASE_DEBUG_ASSERT((fid & (0xFF << 16)) == 0);
-
-	return invoke_smc_fid(fid, arg0, arg1, arg2);
-}
-
-u64 kbase_invoke_smc(u32 oen, u16 function_number, bool smc64,
-		u64 arg0, u64 arg1, u64 arg2)
-{
-	u32 fid = 0;
-
-	/* Only the six bits allowed should be used. */
-	KBASE_DEBUG_ASSERT((oen & ~SMC_OEN_MASK) == 0);
-
-	fid |= SMC_FAST_CALL; /* Bit 31: Fast call */
-	if (smc64)
-		fid |= SMC_64; /* Bit 30: 1=SMC64, 0=SMC32 */
-	fid |= oen; /* Bit 29:24: OEN */
-	/* Bit 23:16: Must be zero for fast calls */
-	fid |= (function_number); /* Bit 15:0: function number */
-
-	return kbase_invoke_smc_fid(fid, arg0, arg1, arg2);
-}
-
-#endif /* CONFIG_ARM64 */
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_smc.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_smc.h
deleted file mode 100644
index 9bff3d2e8b4d..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_smc.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#ifndef _KBASE_SMC_H_
-#define _KBASE_SMC_H_
-
-#ifdef CONFIG_ARM64
-
-#include <mali_kbase.h>
-
-#define SMC_FAST_CALL (1 << 31)
-#define SMC_64 (1 << 30)
-
-#define SMC_OEN_OFFSET 24
-#define SMC_OEN_MASK (0x3F << SMC_OEN_OFFSET) /* 6 bits */
-#define SMC_OEN_SIP (2 << SMC_OEN_OFFSET)
-#define SMC_OEN_STD (4 << SMC_OEN_OFFSET)
-
-
-/**
-  * kbase_invoke_smc_fid - Perform a secure monitor call
-  * @fid: The SMC function to call, see SMC Calling convention.
-  * @arg0: First argument to the SMC.
-  * @arg1: Second argument to the SMC.
-  * @arg2: Third argument to the SMC.
-  *
-  * See SMC Calling Convention for details.
-  *
-  * Return: the return value from the SMC.
-  */
-u64 kbase_invoke_smc_fid(u32 fid, u64 arg0, u64 arg1, u64 arg2);
-
-/**
-  * kbase_invoke_smc_fid - Perform a secure monitor call
-  * @oen: Owning Entity number (SIP, STD etc).
-  * @function_number: The function number within the OEN.
-  * @smc64: use SMC64 calling convention instead of SMC32.
-  * @arg0: First argument to the SMC.
-  * @arg1: Second argument to the SMC.
-  * @arg2: Third argument to the SMC.
-  *
-  * See SMC Calling Convention for details.
-  *
-  * Return: the return value from the SMC call.
-  */
-u64 kbase_invoke_smc(u32 oen, u16 function_number, bool smc64,
-		u64 arg0, u64 arg1, u64 arg2);
-
-#endif /* CONFIG_ARM64 */
-
-#endif /* _KBASE_SMC_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_softjobs.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_softjobs.c
deleted file mode 100644
index c24b94e0d6eb..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_softjobs.c
+++ /dev/null
@@ -1,1513 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#include <mali_kbase.h>
-
-#if defined(CONFIG_DMA_SHARED_BUFFER)
-#include <linux/dma-buf.h>
-#include <asm/cacheflush.h>
-#endif /* defined(CONFIG_DMA_SHARED_BUFFER) */
-#if defined(CONFIG_SYNC) || defined(CONFIG_SYNC_FILE)
-#include <mali_kbase_sync.h>
-#endif
-#include <linux/dma-mapping.h>
-#include <mali_base_kernel.h>
-#include <mali_kbase_hwaccess_time.h>
-#include <mali_kbase_mem_linux.h>
-#include <mali_kbase_tlstream.h>
-#include <linux/version.h>
-#include <linux/ktime.h>
-#include <linux/pfn.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/cache.h>
-
-/**
- * @file mali_kbase_softjobs.c
- *
- * This file implements the logic behind software only jobs that are
- * executed within the driver rather than being handed over to the GPU.
- */
-
-static void kbasep_add_waiting_soft_job(struct kbase_jd_atom *katom)
-{
-	struct kbase_context *kctx = katom->kctx;
-	unsigned long lflags;
-
-	spin_lock_irqsave(&kctx->waiting_soft_jobs_lock, lflags);
-	list_add_tail(&katom->queue, &kctx->waiting_soft_jobs);
-	spin_unlock_irqrestore(&kctx->waiting_soft_jobs_lock, lflags);
-}
-
-void kbasep_remove_waiting_soft_job(struct kbase_jd_atom *katom)
-{
-	struct kbase_context *kctx = katom->kctx;
-	unsigned long lflags;
-
-	spin_lock_irqsave(&kctx->waiting_soft_jobs_lock, lflags);
-	list_del(&katom->queue);
-	spin_unlock_irqrestore(&kctx->waiting_soft_jobs_lock, lflags);
-}
-
-static void kbasep_add_waiting_with_timeout(struct kbase_jd_atom *katom)
-{
-	struct kbase_context *kctx = katom->kctx;
-
-	/* Record the start time of this atom so we could cancel it at
-	 * the right time.
-	 */
-	katom->start_timestamp = ktime_get();
-
-	/* Add the atom to the waiting list before the timer is
-	 * (re)started to make sure that it gets processed.
-	 */
-	kbasep_add_waiting_soft_job(katom);
-
-	/* Schedule timeout of this atom after a period if it is not active */
-	if (!timer_pending(&kctx->soft_job_timeout)) {
-		int timeout_ms = atomic_read(
-				&kctx->kbdev->js_data.soft_job_timeout_ms);
-		mod_timer(&kctx->soft_job_timeout,
-			  jiffies + msecs_to_jiffies(timeout_ms));
-	}
-}
-
-static int kbasep_read_soft_event_status(
-		struct kbase_context *kctx, u64 evt, unsigned char *status)
-{
-	unsigned char *mapped_evt;
-	struct kbase_vmap_struct map;
-
-	mapped_evt = kbase_vmap(kctx, evt, sizeof(*mapped_evt), &map);
-	if (!mapped_evt)
-		return -EFAULT;
-
-	*status = *mapped_evt;
-
-	kbase_vunmap(kctx, &map);
-
-	return 0;
-}
-
-static int kbasep_write_soft_event_status(
-		struct kbase_context *kctx, u64 evt, unsigned char new_status)
-{
-	unsigned char *mapped_evt;
-	struct kbase_vmap_struct map;
-
-	if ((new_status != BASE_JD_SOFT_EVENT_SET) &&
-	    (new_status != BASE_JD_SOFT_EVENT_RESET))
-		return -EINVAL;
-
-	mapped_evt = kbase_vmap(kctx, evt, sizeof(*mapped_evt), &map);
-	if (!mapped_evt)
-		return -EFAULT;
-
-	*mapped_evt = new_status;
-
-	kbase_vunmap(kctx, &map);
-
-	return 0;
-}
-
-static int kbase_dump_cpu_gpu_time(struct kbase_jd_atom *katom)
-{
-	struct kbase_vmap_struct map;
-	void *user_result;
-	struct timespec ts;
-	struct base_dump_cpu_gpu_counters data;
-	u64 system_time;
-	u64 cycle_counter;
-	u64 jc = katom->jc;
-	struct kbase_context *kctx = katom->kctx;
-	int pm_active_err;
-
-	memset(&data, 0, sizeof(data));
-
-	/* Take the PM active reference as late as possible - otherwise, it could
-	 * delay suspend until we process the atom (which may be at the end of a
-	 * long chain of dependencies */
-	pm_active_err = kbase_pm_context_active_handle_suspend(kctx->kbdev, KBASE_PM_SUSPEND_HANDLER_DONT_REACTIVATE);
-	if (pm_active_err) {
-		struct kbasep_js_device_data *js_devdata = &kctx->kbdev->js_data;
-
-		/* We're suspended - queue this on the list of suspended jobs
-		 * Use dep_item[1], because dep_item[0] was previously in use
-		 * for 'waiting_soft_jobs'.
-		 */
-		mutex_lock(&js_devdata->runpool_mutex);
-		list_add_tail(&katom->dep_item[1], &js_devdata->suspended_soft_jobs_list);
-		mutex_unlock(&js_devdata->runpool_mutex);
-
-		/* Also adding this to the list of waiting soft job */
-		kbasep_add_waiting_soft_job(katom);
-
-		return pm_active_err;
-	}
-
-	kbase_backend_get_gpu_time(kctx->kbdev, &cycle_counter, &system_time,
-									&ts);
-
-	kbase_pm_context_idle(kctx->kbdev);
-
-	data.sec = ts.tv_sec;
-	data.usec = ts.tv_nsec / 1000;
-	data.system_time = system_time;
-	data.cycle_counter = cycle_counter;
-
-	/* Assume this atom will be cancelled until we know otherwise */
-	katom->event_code = BASE_JD_EVENT_JOB_CANCELLED;
-
-	/* GPU_WR access is checked on the range for returning the result to
-	 * userspace for the following reasons:
-	 * - security, this is currently how imported user bufs are checked.
-	 * - userspace ddk guaranteed to assume region was mapped as GPU_WR */
-	user_result = kbase_vmap_prot(kctx, jc, sizeof(data), KBASE_REG_GPU_WR, &map);
-	if (!user_result)
-		return 0;
-
-	memcpy(user_result, &data, sizeof(data));
-
-	kbase_vunmap(kctx, &map);
-
-	/* Atom was fine - mark it as done */
-	katom->event_code = BASE_JD_EVENT_DONE;
-
-	return 0;
-}
-
-#if defined(CONFIG_SYNC) || defined(CONFIG_SYNC_FILE)
-/* Called by the explicit fence mechanism when a fence wait has completed */
-void kbase_soft_event_wait_callback(struct kbase_jd_atom *katom)
-{
-	struct kbase_context *kctx = katom->kctx;
-
-	mutex_lock(&kctx->jctx.lock);
-	kbasep_remove_waiting_soft_job(katom);
-	kbase_finish_soft_job(katom);
-	if (jd_done_nolock(katom, NULL))
-		kbase_js_sched_all(kctx->kbdev);
-	mutex_unlock(&kctx->jctx.lock);
-}
-#endif
-
-static void kbasep_soft_event_complete_job(struct work_struct *work)
-{
-	struct kbase_jd_atom *katom = container_of(work, struct kbase_jd_atom,
-			work);
-	struct kbase_context *kctx = katom->kctx;
-	int resched;
-
-	mutex_lock(&kctx->jctx.lock);
-	resched = jd_done_nolock(katom, NULL);
-	mutex_unlock(&kctx->jctx.lock);
-
-	if (resched)
-		kbase_js_sched_all(kctx->kbdev);
-}
-
-void kbasep_complete_triggered_soft_events(struct kbase_context *kctx, u64 evt)
-{
-	int cancel_timer = 1;
-	struct list_head *entry, *tmp;
-	unsigned long lflags;
-
-	spin_lock_irqsave(&kctx->waiting_soft_jobs_lock, lflags);
-	list_for_each_safe(entry, tmp, &kctx->waiting_soft_jobs) {
-		struct kbase_jd_atom *katom = list_entry(
-				entry, struct kbase_jd_atom, queue);
-
-		switch (katom->core_req & BASE_JD_REQ_SOFT_JOB_TYPE) {
-		case BASE_JD_REQ_SOFT_EVENT_WAIT:
-			if (katom->jc == evt) {
-				list_del(&katom->queue);
-
-				katom->event_code = BASE_JD_EVENT_DONE;
-				INIT_WORK(&katom->work,
-					  kbasep_soft_event_complete_job);
-				queue_work(kctx->jctx.job_done_wq,
-					   &katom->work);
-			} else {
-				/* There are still other waiting jobs, we cannot
-				 * cancel the timer yet.
-				 */
-				cancel_timer = 0;
-			}
-			break;
-#ifdef CONFIG_MALI_BIFROST_FENCE_DEBUG
-		case BASE_JD_REQ_SOFT_FENCE_WAIT:
-			/* Keep the timer running if fence debug is enabled and
-			 * there are waiting fence jobs.
-			 */
-			cancel_timer = 0;
-			break;
-#endif
-		}
-	}
-
-	if (cancel_timer)
-		del_timer(&kctx->soft_job_timeout);
-	spin_unlock_irqrestore(&kctx->waiting_soft_jobs_lock, lflags);
-}
-
-#ifdef CONFIG_MALI_BIFROST_FENCE_DEBUG
-static void kbase_fence_debug_check_atom(struct kbase_jd_atom *katom)
-{
-	struct kbase_context *kctx = katom->kctx;
-	struct device *dev = kctx->kbdev->dev;
-	int i;
-
-	for (i = 0; i < 2; i++) {
-		struct kbase_jd_atom *dep;
-
-		list_for_each_entry(dep, &katom->dep_head[i], dep_item[i]) {
-			if (dep->status == KBASE_JD_ATOM_STATE_UNUSED ||
-			    dep->status == KBASE_JD_ATOM_STATE_COMPLETED)
-				continue;
-
-			if ((dep->core_req & BASE_JD_REQ_SOFT_JOB_TYPE)
-					== BASE_JD_REQ_SOFT_FENCE_TRIGGER) {
-				/* Found blocked trigger fence. */
-				struct kbase_sync_fence_info info;
-
-				if (!kbase_sync_fence_in_info_get(dep, &info)) {
-					dev_warn(dev,
-						 "\tVictim trigger atom %d fence [%p] %s: %s\n",
-						 kbase_jd_atom_id(kctx, dep),
-						 info.fence,
-						 info.name,
-						 kbase_sync_status_string(info.status));
-				 }
-			}
-
-			kbase_fence_debug_check_atom(dep);
-		}
-	}
-}
-
-static void kbase_fence_debug_wait_timeout(struct kbase_jd_atom *katom)
-{
-	struct kbase_context *kctx = katom->kctx;
-	struct device *dev = katom->kctx->kbdev->dev;
-	int timeout_ms = atomic_read(&kctx->kbdev->js_data.soft_job_timeout_ms);
-	unsigned long lflags;
-	struct kbase_sync_fence_info info;
-
-	spin_lock_irqsave(&kctx->waiting_soft_jobs_lock, lflags);
-
-	if (kbase_sync_fence_in_info_get(katom, &info)) {
-		/* Fence must have signaled just after timeout. */
-		spin_unlock_irqrestore(&kctx->waiting_soft_jobs_lock, lflags);
-		return;
-	}
-
-	dev_warn(dev, "ctx %d_%d: Atom %d still waiting for fence [%p] after %dms\n",
-		 kctx->tgid, kctx->id,
-		 kbase_jd_atom_id(kctx, katom),
-		 info.fence, timeout_ms);
-	dev_warn(dev, "\tGuilty fence [%p] %s: %s\n",
-		 info.fence, info.name,
-		 kbase_sync_status_string(info.status));
-
-	/* Search for blocked trigger atoms */
-	kbase_fence_debug_check_atom(katom);
-
-	spin_unlock_irqrestore(&kctx->waiting_soft_jobs_lock, lflags);
-
-	kbase_sync_fence_in_dump(katom);
-}
-
-struct kbase_fence_debug_work {
-	struct kbase_jd_atom *katom;
-	struct work_struct work;
-};
-
-static void kbase_fence_debug_wait_timeout_worker(struct work_struct *work)
-{
-	struct kbase_fence_debug_work *w = container_of(work,
-			struct kbase_fence_debug_work, work);
-	struct kbase_jd_atom *katom = w->katom;
-	struct kbase_context *kctx = katom->kctx;
-
-	mutex_lock(&kctx->jctx.lock);
-	kbase_fence_debug_wait_timeout(katom);
-	mutex_unlock(&kctx->jctx.lock);
-
-	kfree(w);
-}
-
-static void kbase_fence_debug_timeout(struct kbase_jd_atom *katom)
-{
-	struct kbase_fence_debug_work *work;
-	struct kbase_context *kctx = katom->kctx;
-
-	/* Enqueue fence debug worker. Use job_done_wq to get
-	 * debug print ordered with job completion.
-	 */
-	work = kzalloc(sizeof(struct kbase_fence_debug_work), GFP_ATOMIC);
-	/* Ignore allocation failure. */
-	if (work) {
-		work->katom = katom;
-		INIT_WORK(&work->work, kbase_fence_debug_wait_timeout_worker);
-		queue_work(kctx->jctx.job_done_wq, &work->work);
-	}
-}
-#endif /* CONFIG_MALI_BIFROST_FENCE_DEBUG */
-
-void kbasep_soft_job_timeout_worker(struct timer_list *t)
-{
-       struct kbase_context *kctx = from_timer(kctx, t, soft_job_timeout);
-	u32 timeout_ms = (u32)atomic_read(
-			&kctx->kbdev->js_data.soft_job_timeout_ms);
-	struct timer_list *timer = &kctx->soft_job_timeout;
-	ktime_t cur_time = ktime_get();
-	bool restarting = false;
-	unsigned long lflags;
-	struct list_head *entry, *tmp;
-
-	spin_lock_irqsave(&kctx->waiting_soft_jobs_lock, lflags);
-	list_for_each_safe(entry, tmp, &kctx->waiting_soft_jobs) {
-		struct kbase_jd_atom *katom = list_entry(entry,
-				struct kbase_jd_atom, queue);
-		s64 elapsed_time = ktime_to_ms(ktime_sub(cur_time,
-					katom->start_timestamp));
-
-		if (elapsed_time < (s64)timeout_ms) {
-			restarting = true;
-			continue;
-		}
-
-		switch (katom->core_req & BASE_JD_REQ_SOFT_JOB_TYPE) {
-		case BASE_JD_REQ_SOFT_EVENT_WAIT:
-			/* Take it out of the list to ensure that it
-			 * will be cancelled in all cases
-			 */
-			list_del(&katom->queue);
-
-			katom->event_code = BASE_JD_EVENT_JOB_CANCELLED;
-			INIT_WORK(&katom->work, kbasep_soft_event_complete_job);
-			queue_work(kctx->jctx.job_done_wq, &katom->work);
-			break;
-#ifdef CONFIG_MALI_BIFROST_FENCE_DEBUG
-		case BASE_JD_REQ_SOFT_FENCE_WAIT:
-			kbase_fence_debug_timeout(katom);
-			break;
-#endif
-		}
-	}
-
-	if (restarting)
-		mod_timer(timer, jiffies + msecs_to_jiffies(timeout_ms));
-	spin_unlock_irqrestore(&kctx->waiting_soft_jobs_lock, lflags);
-}
-
-static int kbasep_soft_event_wait(struct kbase_jd_atom *katom)
-{
-	struct kbase_context *kctx = katom->kctx;
-	unsigned char status;
-
-	/* The status of this soft-job is stored in jc */
-	if (kbasep_read_soft_event_status(kctx, katom->jc, &status)) {
-		katom->event_code = BASE_JD_EVENT_JOB_CANCELLED;
-		return 0;
-	}
-
-	if (status == BASE_JD_SOFT_EVENT_SET)
-		return 0; /* Event already set, nothing to do */
-
-	kbasep_add_waiting_with_timeout(katom);
-
-	return 1;
-}
-
-static void kbasep_soft_event_update_locked(struct kbase_jd_atom *katom,
-				     unsigned char new_status)
-{
-	/* Complete jobs waiting on the same event */
-	struct kbase_context *kctx = katom->kctx;
-
-	if (kbasep_write_soft_event_status(kctx, katom->jc, new_status) != 0) {
-		katom->event_code = BASE_JD_EVENT_JOB_CANCELLED;
-		return;
-	}
-
-	if (new_status == BASE_JD_SOFT_EVENT_SET)
-		kbasep_complete_triggered_soft_events(kctx, katom->jc);
-}
-
-/**
- * kbase_soft_event_update() - Update soft event state
- * @kctx: Pointer to context
- * @event: Event to update
- * @new_status: New status value of event
- *
- * Update the event, and wake up any atoms waiting for the event.
- *
- * Return: 0 on success, a negative error code on failure.
- */
-int kbase_soft_event_update(struct kbase_context *kctx,
-			     u64 event,
-			     unsigned char new_status)
-{
-	int err = 0;
-
-	mutex_lock(&kctx->jctx.lock);
-
-	if (kbasep_write_soft_event_status(kctx, event, new_status)) {
-		err = -ENOENT;
-		goto out;
-	}
-
-	if (new_status == BASE_JD_SOFT_EVENT_SET)
-		kbasep_complete_triggered_soft_events(kctx, event);
-
-out:
-	mutex_unlock(&kctx->jctx.lock);
-
-	return err;
-}
-
-static void kbasep_soft_event_cancel_job(struct kbase_jd_atom *katom)
-{
-	katom->event_code = BASE_JD_EVENT_JOB_CANCELLED;
-	if (jd_done_nolock(katom, NULL))
-		kbase_js_sched_all(katom->kctx->kbdev);
-}
-
-struct kbase_debug_copy_buffer {
-	size_t size;
-	struct page **pages;
-	int nr_pages;
-	size_t offset;
-	struct kbase_mem_phy_alloc *gpu_alloc;
-
-	struct page **extres_pages;
-	int nr_extres_pages;
-};
-
-static inline void free_user_buffer(struct kbase_debug_copy_buffer *buffer)
-{
-	struct page **pages = buffer->extres_pages;
-	int nr_pages = buffer->nr_extres_pages;
-
-	if (pages) {
-		int i;
-
-		for (i = 0; i < nr_pages; i++) {
-			struct page *pg = pages[i];
-
-			if (pg)
-				put_page(pg);
-		}
-		kfree(pages);
-	}
-}
-
-static void kbase_debug_copy_finish(struct kbase_jd_atom *katom)
-{
-	struct kbase_debug_copy_buffer *buffers =
-			(struct kbase_debug_copy_buffer *)(uintptr_t)katom->jc;
-	unsigned int i;
-	unsigned int nr = katom->nr_extres;
-
-	if (!buffers)
-		return;
-
-	kbase_gpu_vm_lock(katom->kctx);
-	for (i = 0; i < nr; i++) {
-		int p;
-		struct kbase_mem_phy_alloc *gpu_alloc = buffers[i].gpu_alloc;
-
-		if (!buffers[i].pages)
-			break;
-		for (p = 0; p < buffers[i].nr_pages; p++) {
-			struct page *pg = buffers[i].pages[p];
-
-			if (pg)
-				put_page(pg);
-		}
-		kfree(buffers[i].pages);
-		if (gpu_alloc) {
-			switch (gpu_alloc->type) {
-			case KBASE_MEM_TYPE_IMPORTED_USER_BUF:
-			{
-				free_user_buffer(&buffers[i]);
-				break;
-			}
-			default:
-				/* Nothing to be done. */
-				break;
-			}
-			kbase_mem_phy_alloc_put(gpu_alloc);
-		}
-	}
-	kbase_gpu_vm_unlock(katom->kctx);
-	kfree(buffers);
-
-	katom->jc = 0;
-}
-
-static int kbase_debug_copy_prepare(struct kbase_jd_atom *katom)
-{
-	struct kbase_debug_copy_buffer *buffers;
-	struct base_jd_debug_copy_buffer *user_buffers = NULL;
-	unsigned int i;
-	unsigned int nr = katom->nr_extres;
-	int ret = 0;
-	void __user *user_structs = (void __user *)(uintptr_t)katom->jc;
-
-	if (!user_structs)
-		return -EINVAL;
-
-	buffers = kcalloc(nr, sizeof(*buffers), GFP_KERNEL);
-	if (!buffers) {
-		ret = -ENOMEM;
-		katom->jc = 0;
-		goto out_cleanup;
-	}
-	katom->jc = (u64)(uintptr_t)buffers;
-
-	user_buffers = kmalloc_array(nr, sizeof(*user_buffers), GFP_KERNEL);
-
-	if (!user_buffers) {
-		ret = -ENOMEM;
-		goto out_cleanup;
-	}
-
-	ret = copy_from_user(user_buffers, user_structs,
-			sizeof(*user_buffers)*nr);
-	if (ret) {
-		ret = -EFAULT;
-		goto out_cleanup;
-	}
-
-	for (i = 0; i < nr; i++) {
-		u64 addr = user_buffers[i].address;
-		u64 page_addr = addr & PAGE_MASK;
-		u64 end_page_addr = addr + user_buffers[i].size - 1;
-		u64 last_page_addr = end_page_addr & PAGE_MASK;
-		int nr_pages = (last_page_addr-page_addr)/PAGE_SIZE+1;
-		int pinned_pages;
-		struct kbase_va_region *reg;
-		struct base_external_resource user_extres;
-
-		if (!addr)
-			continue;
-
-		buffers[i].nr_pages = nr_pages;
-		buffers[i].offset = addr & ~PAGE_MASK;
-		if (buffers[i].offset >= PAGE_SIZE) {
-			ret = -EINVAL;
-			goto out_cleanup;
-		}
-		buffers[i].size = user_buffers[i].size;
-
-		buffers[i].pages = kcalloc(nr_pages, sizeof(struct page *),
-				GFP_KERNEL);
-		if (!buffers[i].pages) {
-			ret = -ENOMEM;
-			goto out_cleanup;
-		}
-
-		pinned_pages = get_user_pages_fast(page_addr,
-					nr_pages,
-					1, /* Write */
-					buffers[i].pages);
-		if (pinned_pages < 0) {
-			ret = pinned_pages;
-			goto out_cleanup;
-		}
-		if (pinned_pages != nr_pages) {
-			ret = -EINVAL;
-			goto out_cleanup;
-		}
-
-		user_extres = user_buffers[i].extres;
-		if (user_extres.ext_resource == 0ULL) {
-			ret = -EINVAL;
-			goto out_cleanup;
-		}
-
-		kbase_gpu_vm_lock(katom->kctx);
-		reg = kbase_region_tracker_find_region_enclosing_address(
-				katom->kctx, user_extres.ext_resource &
-				~BASE_EXT_RES_ACCESS_EXCLUSIVE);
-
-		if (NULL == reg || NULL == reg->gpu_alloc ||
-				(reg->flags & KBASE_REG_FREE)) {
-			ret = -EINVAL;
-			goto out_unlock;
-		}
-
-		buffers[i].gpu_alloc = kbase_mem_phy_alloc_get(reg->gpu_alloc);
-		buffers[i].nr_extres_pages = reg->nr_pages;
-
-		if (reg->nr_pages*PAGE_SIZE != buffers[i].size)
-			dev_warn(katom->kctx->kbdev->dev, "Copy buffer is not of same size as the external resource to copy.\n");
-
-		switch (reg->gpu_alloc->type) {
-		case KBASE_MEM_TYPE_IMPORTED_USER_BUF:
-		{
-			struct kbase_mem_phy_alloc *alloc = reg->gpu_alloc;
-			unsigned long nr_pages =
-				alloc->imported.user_buf.nr_pages;
-
-			if (alloc->imported.user_buf.mm != current->mm) {
-				ret = -EINVAL;
-				goto out_unlock;
-			}
-			buffers[i].extres_pages = kcalloc(nr_pages,
-					sizeof(struct page *), GFP_KERNEL);
-			if (!buffers[i].extres_pages) {
-				ret = -ENOMEM;
-				goto out_unlock;
-			}
-
-			ret = get_user_pages_fast(
-					alloc->imported.user_buf.address,
-					nr_pages, 0,
-					buffers[i].extres_pages);
-			if (ret != nr_pages)
-				goto out_unlock;
-			ret = 0;
-			break;
-		}
-		case KBASE_MEM_TYPE_IMPORTED_UMP:
-		{
-			dev_warn(katom->kctx->kbdev->dev,
-					"UMP is not supported for debug_copy jobs\n");
-			ret = -EINVAL;
-			goto out_unlock;
-		}
-		default:
-			/* Nothing to be done. */
-			break;
-		}
-		kbase_gpu_vm_unlock(katom->kctx);
-	}
-	kfree(user_buffers);
-
-	return ret;
-
-out_unlock:
-	kbase_gpu_vm_unlock(katom->kctx);
-
-out_cleanup:
-	/* Frees allocated memory for kbase_debug_copy_job struct, including
-	 * members, and sets jc to 0 */
-	kbase_debug_copy_finish(katom);
-	kfree(user_buffers);
-
-	return ret;
-}
-
-static void kbase_mem_copy_from_extres_page(struct kbase_context *kctx,
-		void *extres_page, struct page **pages, unsigned int nr_pages,
-		unsigned int *target_page_nr, size_t offset, size_t *to_copy)
-{
-	void *target_page = kmap(pages[*target_page_nr]);
-	size_t chunk = PAGE_SIZE-offset;
-
-	lockdep_assert_held(&kctx->reg_lock);
-
-	if (!target_page) {
-		*target_page_nr += 1;
-		dev_warn(kctx->kbdev->dev, "kmap failed in debug_copy job.");
-		return;
-	}
-
-	chunk = min(chunk, *to_copy);
-
-	memcpy(target_page + offset, extres_page, chunk);
-	*to_copy -= chunk;
-
-	kunmap(pages[*target_page_nr]);
-
-	*target_page_nr += 1;
-	if (*target_page_nr >= nr_pages)
-		return;
-
-	target_page = kmap(pages[*target_page_nr]);
-	if (!target_page) {
-		*target_page_nr += 1;
-		dev_warn(kctx->kbdev->dev, "kmap failed in debug_copy job.");
-		return;
-	}
-
-	KBASE_DEBUG_ASSERT(target_page);
-
-	chunk = min(offset, *to_copy);
-	memcpy(target_page, extres_page + PAGE_SIZE-offset, chunk);
-	*to_copy -= chunk;
-
-	kunmap(pages[*target_page_nr]);
-}
-
-static int kbase_mem_copy_from_extres(struct kbase_context *kctx,
-		struct kbase_debug_copy_buffer *buf_data)
-{
-	unsigned int i;
-	unsigned int target_page_nr = 0;
-	struct page **pages = buf_data->pages;
-	u64 offset = buf_data->offset;
-	size_t extres_size = buf_data->nr_extres_pages*PAGE_SIZE;
-	size_t to_copy = min(extres_size, buf_data->size);
-	size_t dma_to_copy;
-	struct kbase_mem_phy_alloc *gpu_alloc = buf_data->gpu_alloc;
-	int ret = 0;
-
-	KBASE_DEBUG_ASSERT(pages != NULL);
-
-	kbase_gpu_vm_lock(kctx);
-	if (!gpu_alloc) {
-		ret = -EINVAL;
-		goto out_unlock;
-	}
-
-	switch (gpu_alloc->type) {
-	case KBASE_MEM_TYPE_IMPORTED_USER_BUF:
-	{
-		for (i = 0; i < buf_data->nr_extres_pages; i++) {
-			struct page *pg = buf_data->extres_pages[i];
-			void *extres_page = kmap(pg);
-
-			if (extres_page)
-				kbase_mem_copy_from_extres_page(kctx,
-						extres_page, pages,
-						buf_data->nr_pages,
-						&target_page_nr,
-						offset, &to_copy);
-
-			kunmap(pg);
-			if (target_page_nr >= buf_data->nr_pages)
-				break;
-		}
-		break;
-	}
-	break;
-#ifdef CONFIG_DMA_SHARED_BUFFER
-	case KBASE_MEM_TYPE_IMPORTED_UMM: {
-		struct dma_buf *dma_buf = gpu_alloc->imported.umm.dma_buf;
-
-		KBASE_DEBUG_ASSERT(dma_buf != NULL);
-		if (dma_buf->size > buf_data->nr_extres_pages * PAGE_SIZE)
-			dev_warn(kctx->kbdev->dev, "External resources buffer size mismatch");
-
-		dma_to_copy = min(dma_buf->size,
-			(size_t)(buf_data->nr_extres_pages * PAGE_SIZE));
-		ret = dma_buf_begin_cpu_access(dma_buf,
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0) && !defined(CONFIG_CHROMEOS)
-				0, dma_to_copy,
-#endif
-				DMA_FROM_DEVICE);
-		if (ret)
-			goto out_unlock;
-
-		for (i = 0; i < dma_to_copy/PAGE_SIZE; i++) {
-
-			void *extres_page = dma_buf_kmap(dma_buf, i);
-
-			if (extres_page)
-				kbase_mem_copy_from_extres_page(kctx,
-						extres_page, pages,
-						buf_data->nr_pages,
-						&target_page_nr,
-						offset, &to_copy);
-
-			dma_buf_kunmap(dma_buf, i, extres_page);
-			if (target_page_nr >= buf_data->nr_pages)
-				break;
-		}
-		dma_buf_end_cpu_access(dma_buf,
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0) && !defined(CONFIG_CHROMEOS)
-				0, dma_to_copy,
-#endif
-				DMA_FROM_DEVICE);
-		break;
-	}
-#endif
-	default:
-		ret = -EINVAL;
-	}
-out_unlock:
-	kbase_gpu_vm_unlock(kctx);
-	return ret;
-
-}
-
-static int kbase_debug_copy(struct kbase_jd_atom *katom)
-{
-	struct kbase_debug_copy_buffer *buffers =
-			(struct kbase_debug_copy_buffer *)(uintptr_t)katom->jc;
-	unsigned int i;
-
-	for (i = 0; i < katom->nr_extres; i++) {
-		int res = kbase_mem_copy_from_extres(katom->kctx, &buffers[i]);
-
-		if (res)
-			return res;
-	}
-
-	return 0;
-}
-
-static int kbase_jit_allocate_prepare(struct kbase_jd_atom *katom)
-{
-	__user void *data = (__user void *)(uintptr_t) katom->jc;
-	struct base_jit_alloc_info *info;
-	struct kbase_context *kctx = katom->kctx;
-	int ret;
-
-	/* Fail the job if there is no info structure */
-	if (!data) {
-		ret = -EINVAL;
-		goto fail;
-	}
-
-	/* Copy the information for safe access and future storage */
-	info = kzalloc(sizeof(*info), GFP_KERNEL);
-	if (!info) {
-		ret = -ENOMEM;
-		goto fail;
-	}
-
-	if (copy_from_user(info, data, sizeof(*info)) != 0) {
-		ret = -EINVAL;
-		goto free_info;
-	}
-
-	/* If the ID is zero then fail the job */
-	if (info->id == 0) {
-		ret = -EINVAL;
-		goto free_info;
-	}
-
-	/* Sanity check that the PA fits within the VA */
-	if (info->va_pages < info->commit_pages) {
-		ret = -EINVAL;
-		goto free_info;
-	}
-
-	/* Ensure the GPU address is correctly aligned */
-	if ((info->gpu_alloc_addr & 0x7) != 0) {
-		ret = -EINVAL;
-		goto free_info;
-	}
-
-	/* Replace the user pointer with our kernel allocated info structure */
-	katom->jc = (u64)(uintptr_t) info;
-	katom->jit_blocked = false;
-
-	lockdep_assert_held(&kctx->jctx.lock);
-	list_add_tail(&katom->jit_node, &kctx->jit_atoms_head);
-
-	/*
-	 * Note:
-	 * The provided info->gpu_alloc_addr isn't validated here as
-	 * userland can cache allocations which means that even
-	 * though the region is valid it doesn't represent the
-	 * same thing it used to.
-	 *
-	 * Complete validation of va_pages, commit_pages and extent
-	 * isn't done here as it will be done during the call to
-	 * kbase_mem_alloc.
-	 */
-	return 0;
-
-free_info:
-	kfree(info);
-fail:
-	katom->jc = 0;
-	return ret;
-}
-
-static u8 kbase_jit_free_get_id(struct kbase_jd_atom *katom)
-{
-	if (WARN_ON(katom->core_req != BASE_JD_REQ_SOFT_JIT_FREE))
-		return 0;
-
-	return (u8) katom->jc;
-}
-
-static int kbase_jit_allocate_process(struct kbase_jd_atom *katom)
-{
-	struct kbase_context *kctx = katom->kctx;
-	struct base_jit_alloc_info *info;
-	struct kbase_va_region *reg;
-	struct kbase_vmap_struct mapping;
-	u64 *ptr, new_addr;
-
-	if (katom->jit_blocked) {
-		list_del(&katom->queue);
-		katom->jit_blocked = false;
-	}
-
-	info = (struct base_jit_alloc_info *) (uintptr_t) katom->jc;
-
-	/* The JIT ID is still in use so fail the allocation */
-	if (kctx->jit_alloc[info->id]) {
-		katom->event_code = BASE_JD_EVENT_MEM_GROWTH_FAILED;
-		return 0;
-	}
-
-	/* Create a JIT allocation */
-	reg = kbase_jit_allocate(kctx, info);
-	if (!reg) {
-		struct kbase_jd_atom *jit_atom;
-		bool can_block = false;
-
-		lockdep_assert_held(&kctx->jctx.lock);
-
-		jit_atom = list_first_entry(&kctx->jit_atoms_head,
-				struct kbase_jd_atom, jit_node);
-
-		list_for_each_entry(jit_atom, &kctx->jit_atoms_head, jit_node) {
-			if (jit_atom == katom)
-				break;
-			if (jit_atom->core_req == BASE_JD_REQ_SOFT_JIT_FREE) {
-				u8 free_id = kbase_jit_free_get_id(jit_atom);
-
-				if (free_id && kctx->jit_alloc[free_id]) {
-					/* A JIT free which is active and
-					 * submitted before this atom
-					 */
-					can_block = true;
-					break;
-				}
-			}
-		}
-
-		if (!can_block) {
-			/* Mark the allocation so we know it's in use even if
-			 * the allocation itself fails.
-			 */
-			kctx->jit_alloc[info->id] =
-				(struct kbase_va_region *) -1;
-
-			katom->event_code = BASE_JD_EVENT_MEM_GROWTH_FAILED;
-			return 0;
-		}
-
-		/* There are pending frees for an active allocation
-		 * so we should wait to see whether they free the memory.
-		 * Add to the beginning of the list to ensure that the atom is
-		 * processed only once in kbase_jit_free_finish
-		 */
-		list_add(&katom->queue, &kctx->jit_pending_alloc);
-		katom->jit_blocked = true;
-
-		return 1;
-	}
-
-	/*
-	 * Write the address of the JIT allocation to the user provided
-	 * GPU allocation.
-	 */
-	ptr = kbase_vmap(kctx, info->gpu_alloc_addr, sizeof(*ptr),
-			&mapping);
-	if (!ptr) {
-		/*
-		 * Leave the allocation "live" as the JIT free jit will be
-		 * submitted anyway.
-		 */
-		katom->event_code = BASE_JD_EVENT_JOB_INVALID;
-		return 0;
-	}
-
-	new_addr = reg->start_pfn << PAGE_SHIFT;
-	*ptr = new_addr;
-	KBASE_TLSTREAM_TL_ATTRIB_ATOM_JIT(
-			katom, info->gpu_alloc_addr, new_addr);
-	kbase_vunmap(kctx, &mapping);
-
-	katom->event_code = BASE_JD_EVENT_DONE;
-
-	/*
-	 * Bind it to the user provided ID. Do this last so we can check for
-	 * the JIT free racing this JIT alloc job.
-	 */
-	kctx->jit_alloc[info->id] = reg;
-
-	return 0;
-}
-
-static void kbase_jit_allocate_finish(struct kbase_jd_atom *katom)
-{
-	struct base_jit_alloc_info *info;
-
-	lockdep_assert_held(&katom->kctx->jctx.lock);
-
-	/* Remove atom from jit_atoms_head list */
-	list_del(&katom->jit_node);
-
-	if (katom->jit_blocked) {
-		list_del(&katom->queue);
-		katom->jit_blocked = false;
-	}
-
-	info = (struct base_jit_alloc_info *) (uintptr_t) katom->jc;
-	/* Free the info structure */
-	kfree(info);
-}
-
-static int kbase_jit_free_prepare(struct kbase_jd_atom *katom)
-{
-	struct kbase_context *kctx = katom->kctx;
-
-	lockdep_assert_held(&kctx->jctx.lock);
-	list_add_tail(&katom->jit_node, &kctx->jit_atoms_head);
-
-	return 0;
-}
-
-static void kbase_jit_free_process(struct kbase_jd_atom *katom)
-{
-	struct kbase_context *kctx = katom->kctx;
-	u8 id = kbase_jit_free_get_id(katom);
-
-	/*
-	 * If the ID is zero or it is not in use yet then fail the job.
-	 */
-	if ((id == 0) || (kctx->jit_alloc[id] == NULL)) {
-		katom->event_code = BASE_JD_EVENT_JOB_INVALID;
-		return;
-	}
-
-	/*
-	 * If the ID is valid but the allocation request failed still succeed
-	 * this soft job but don't try and free the allocation.
-	 */
-	if (kctx->jit_alloc[id] != (struct kbase_va_region *) -1)
-		kbase_jit_free(kctx, kctx->jit_alloc[id]);
-
-	kctx->jit_alloc[id] = NULL;
-}
-
-static void kbasep_jit_free_finish_worker(struct work_struct *work)
-{
-	struct kbase_jd_atom *katom = container_of(work, struct kbase_jd_atom,
-			work);
-	struct kbase_context *kctx = katom->kctx;
-	int resched;
-
-	mutex_lock(&kctx->jctx.lock);
-	kbase_finish_soft_job(katom);
-	resched = jd_done_nolock(katom, NULL);
-	mutex_unlock(&kctx->jctx.lock);
-
-	if (resched)
-		kbase_js_sched_all(kctx->kbdev);
-}
-
-static void kbase_jit_free_finish(struct kbase_jd_atom *katom)
-{
-	struct list_head *i, *tmp;
-	struct kbase_context *kctx = katom->kctx;
-
-	lockdep_assert_held(&kctx->jctx.lock);
-	/* Remove this atom from the kctx->jit_atoms_head list */
-	list_del(&katom->jit_node);
-
-	list_for_each_safe(i, tmp, &kctx->jit_pending_alloc) {
-		struct kbase_jd_atom *pending_atom = list_entry(i,
-				struct kbase_jd_atom, queue);
-		if (kbase_jit_allocate_process(pending_atom) == 0) {
-			/* Atom has completed */
-			INIT_WORK(&pending_atom->work,
-					kbasep_jit_free_finish_worker);
-			queue_work(kctx->jctx.job_done_wq, &pending_atom->work);
-		}
-	}
-}
-
-static int kbase_ext_res_prepare(struct kbase_jd_atom *katom)
-{
-	__user struct base_external_resource_list *user_ext_res;
-	struct base_external_resource_list *ext_res;
-	u64 count = 0;
-	size_t copy_size;
-	int ret;
-
-	user_ext_res = (__user struct base_external_resource_list *)
-			(uintptr_t) katom->jc;
-
-	/* Fail the job if there is no info structure */
-	if (!user_ext_res) {
-		ret = -EINVAL;
-		goto fail;
-	}
-
-	if (copy_from_user(&count, &user_ext_res->count, sizeof(u64)) != 0) {
-		ret = -EINVAL;
-		goto fail;
-	}
-
-	/* Is the number of external resources in range? */
-	if (!count || count > BASE_EXT_RES_COUNT_MAX) {
-		ret = -EINVAL;
-		goto fail;
-	}
-
-	/* Copy the information for safe access and future storage */
-	copy_size = sizeof(*ext_res);
-	copy_size += sizeof(struct base_external_resource) * (count - 1);
-	ext_res = kzalloc(copy_size, GFP_KERNEL);
-	if (!ext_res) {
-		ret = -ENOMEM;
-		goto fail;
-	}
-
-	if (copy_from_user(ext_res, user_ext_res, copy_size) != 0) {
-		ret = -EINVAL;
-		goto free_info;
-	}
-
-	/*
-	 * Overwrite the count with the first value incase it was changed
-	 * after the fact.
-	 */
-	ext_res->count = count;
-
-	/*
-	 * Replace the user pointer with our kernel allocated
-	 * ext_res structure.
-	 */
-	katom->jc = (u64)(uintptr_t) ext_res;
-
-	return 0;
-
-free_info:
-	kfree(ext_res);
-fail:
-	return ret;
-}
-
-static void kbase_ext_res_process(struct kbase_jd_atom *katom, bool map)
-{
-	struct base_external_resource_list *ext_res;
-	int i;
-	bool failed = false;
-
-	ext_res = (struct base_external_resource_list *) (uintptr_t) katom->jc;
-	if (!ext_res)
-		goto failed_jc;
-
-	kbase_gpu_vm_lock(katom->kctx);
-
-	for (i = 0; i < ext_res->count; i++) {
-		u64 gpu_addr;
-
-		gpu_addr = ext_res->ext_res[i].ext_resource &
-				~BASE_EXT_RES_ACCESS_EXCLUSIVE;
-		if (map) {
-			if (!kbase_sticky_resource_acquire(katom->kctx,
-					gpu_addr))
-				goto failed_loop;
-		} else
-			if (!kbase_sticky_resource_release(katom->kctx, NULL,
-					gpu_addr))
-				failed = true;
-	}
-
-	/*
-	 * In the case of unmap we continue unmapping other resources in the
-	 * case of failure but will always report failure if _any_ unmap
-	 * request fails.
-	 */
-	if (failed)
-		katom->event_code = BASE_JD_EVENT_JOB_INVALID;
-	else
-		katom->event_code = BASE_JD_EVENT_DONE;
-
-	kbase_gpu_vm_unlock(katom->kctx);
-
-	return;
-
-failed_loop:
-	while (--i > 0) {
-		u64 gpu_addr;
-
-		gpu_addr = ext_res->ext_res[i].ext_resource &
-				~BASE_EXT_RES_ACCESS_EXCLUSIVE;
-
-		kbase_sticky_resource_release(katom->kctx, NULL, gpu_addr);
-	}
-
-	katom->event_code = BASE_JD_EVENT_JOB_INVALID;
-	kbase_gpu_vm_unlock(katom->kctx);
-
-failed_jc:
-	return;
-}
-
-static void kbase_ext_res_finish(struct kbase_jd_atom *katom)
-{
-	struct base_external_resource_list *ext_res;
-
-	ext_res = (struct base_external_resource_list *) (uintptr_t) katom->jc;
-	/* Free the info structure */
-	kfree(ext_res);
-}
-
-int kbase_process_soft_job(struct kbase_jd_atom *katom)
-{
-	switch (katom->core_req & BASE_JD_REQ_SOFT_JOB_TYPE) {
-	case BASE_JD_REQ_SOFT_DUMP_CPU_GPU_TIME:
-		return kbase_dump_cpu_gpu_time(katom);
-
-#if defined(CONFIG_SYNC) || defined(CONFIG_SYNC_FILE)
-	case BASE_JD_REQ_SOFT_FENCE_TRIGGER:
-		katom->event_code = kbase_sync_fence_out_trigger(katom,
-				katom->event_code == BASE_JD_EVENT_DONE ?
-								0 : -EFAULT);
-		break;
-	case BASE_JD_REQ_SOFT_FENCE_WAIT:
-	{
-		int ret = kbase_sync_fence_in_wait(katom);
-
-		if (ret == 1) {
-#ifdef CONFIG_MALI_BIFROST_FENCE_DEBUG
-			kbasep_add_waiting_with_timeout(katom);
-#else
-			kbasep_add_waiting_soft_job(katom);
-#endif
-		}
-		return ret;
-	}
-#endif
-
-	case BASE_JD_REQ_SOFT_REPLAY:
-		return kbase_replay_process(katom);
-	case BASE_JD_REQ_SOFT_EVENT_WAIT:
-		return kbasep_soft_event_wait(katom);
-	case BASE_JD_REQ_SOFT_EVENT_SET:
-		kbasep_soft_event_update_locked(katom, BASE_JD_SOFT_EVENT_SET);
-		break;
-	case BASE_JD_REQ_SOFT_EVENT_RESET:
-		kbasep_soft_event_update_locked(katom, BASE_JD_SOFT_EVENT_RESET);
-		break;
-	case BASE_JD_REQ_SOFT_DEBUG_COPY:
-	{
-		int res = kbase_debug_copy(katom);
-
-		if (res)
-			katom->event_code = BASE_JD_EVENT_JOB_INVALID;
-		break;
-	}
-	case BASE_JD_REQ_SOFT_JIT_ALLOC:
-		return kbase_jit_allocate_process(katom);
-	case BASE_JD_REQ_SOFT_JIT_FREE:
-		kbase_jit_free_process(katom);
-		break;
-	case BASE_JD_REQ_SOFT_EXT_RES_MAP:
-		kbase_ext_res_process(katom, true);
-		break;
-	case BASE_JD_REQ_SOFT_EXT_RES_UNMAP:
-		kbase_ext_res_process(katom, false);
-		break;
-	}
-
-	/* Atom is complete */
-	return 0;
-}
-
-void kbase_cancel_soft_job(struct kbase_jd_atom *katom)
-{
-	switch (katom->core_req & BASE_JD_REQ_SOFT_JOB_TYPE) {
-#if defined(CONFIG_SYNC) || defined(CONFIG_SYNC_FILE)
-	case BASE_JD_REQ_SOFT_FENCE_WAIT:
-		kbase_sync_fence_in_cancel_wait(katom);
-		break;
-#endif
-	case BASE_JD_REQ_SOFT_EVENT_WAIT:
-		kbasep_soft_event_cancel_job(katom);
-		break;
-	default:
-		/* This soft-job doesn't support cancellation! */
-		KBASE_DEBUG_ASSERT(0);
-	}
-}
-
-int kbase_prepare_soft_job(struct kbase_jd_atom *katom)
-{
-	switch (katom->core_req & BASE_JD_REQ_SOFT_JOB_TYPE) {
-	case BASE_JD_REQ_SOFT_DUMP_CPU_GPU_TIME:
-		{
-			if (!IS_ALIGNED(katom->jc, cache_line_size()))
-				return -EINVAL;
-		}
-		break;
-#if defined(CONFIG_SYNC) || defined(CONFIG_SYNC_FILE)
-	case BASE_JD_REQ_SOFT_FENCE_TRIGGER:
-		{
-			struct base_fence fence;
-			int fd;
-
-			if (0 != copy_from_user(&fence, (__user void *)(uintptr_t) katom->jc, sizeof(fence)))
-				return -EINVAL;
-
-			fd = kbase_sync_fence_out_create(katom,
-							 fence.basep.stream_fd);
-			if (fd < 0)
-				return -EINVAL;
-
-			fence.basep.fd = fd;
-			if (0 != copy_to_user((__user void *)(uintptr_t) katom->jc, &fence, sizeof(fence))) {
-				kbase_sync_fence_out_remove(katom);
-				kbase_sync_fence_close_fd(fd);
-				fence.basep.fd = -EINVAL;
-				return -EINVAL;
-			}
-		}
-		break;
-	case BASE_JD_REQ_SOFT_FENCE_WAIT:
-		{
-			struct base_fence fence;
-			int ret;
-
-			if (0 != copy_from_user(&fence, (__user void *)(uintptr_t) katom->jc, sizeof(fence)))
-				return -EINVAL;
-
-			/* Get a reference to the fence object */
-			ret = kbase_sync_fence_in_from_fd(katom,
-							  fence.basep.fd);
-			if (ret < 0)
-				return ret;
-
-#ifdef CONFIG_MALI_BIFROST_DMA_FENCE
-			/*
-			 * Set KCTX_NO_IMPLICIT_FENCE in the context the first
-			 * time a soft fence wait job is observed. This will
-			 * prevent the implicit dma-buf fence to conflict with
-			 * the Android native sync fences.
-			 */
-			if (!kbase_ctx_flag(katom->kctx, KCTX_NO_IMPLICIT_SYNC))
-				kbase_ctx_flag_set(katom->kctx, KCTX_NO_IMPLICIT_SYNC);
-#endif /* CONFIG_MALI_BIFROST_DMA_FENCE */
-		}
-		break;
-#endif /* CONFIG_SYNC || CONFIG_SYNC_FILE */
-	case BASE_JD_REQ_SOFT_JIT_ALLOC:
-		return kbase_jit_allocate_prepare(katom);
-	case BASE_JD_REQ_SOFT_REPLAY:
-		break;
-	case BASE_JD_REQ_SOFT_JIT_FREE:
-		return kbase_jit_free_prepare(katom);
-	case BASE_JD_REQ_SOFT_EVENT_WAIT:
-	case BASE_JD_REQ_SOFT_EVENT_SET:
-	case BASE_JD_REQ_SOFT_EVENT_RESET:
-		if (katom->jc == 0)
-			return -EINVAL;
-		break;
-	case BASE_JD_REQ_SOFT_DEBUG_COPY:
-		return kbase_debug_copy_prepare(katom);
-	case BASE_JD_REQ_SOFT_EXT_RES_MAP:
-		return kbase_ext_res_prepare(katom);
-	case BASE_JD_REQ_SOFT_EXT_RES_UNMAP:
-		return kbase_ext_res_prepare(katom);
-	default:
-		/* Unsupported soft-job */
-		return -EINVAL;
-	}
-	return 0;
-}
-
-void kbase_finish_soft_job(struct kbase_jd_atom *katom)
-{
-	switch (katom->core_req & BASE_JD_REQ_SOFT_JOB_TYPE) {
-	case BASE_JD_REQ_SOFT_DUMP_CPU_GPU_TIME:
-		/* Nothing to do */
-		break;
-#if defined(CONFIG_SYNC) || defined(CONFIG_SYNC_FILE)
-	case BASE_JD_REQ_SOFT_FENCE_TRIGGER:
-		/* If fence has not yet been signaled, do it now */
-		kbase_sync_fence_out_trigger(katom, katom->event_code ==
-				BASE_JD_EVENT_DONE ? 0 : -EFAULT);
-		break;
-	case BASE_JD_REQ_SOFT_FENCE_WAIT:
-		/* Release katom's reference to fence object */
-		kbase_sync_fence_in_remove(katom);
-		break;
-#endif /* CONFIG_SYNC || CONFIG_SYNC_FILE */
-	case BASE_JD_REQ_SOFT_DEBUG_COPY:
-		kbase_debug_copy_finish(katom);
-		break;
-	case BASE_JD_REQ_SOFT_JIT_ALLOC:
-		kbase_jit_allocate_finish(katom);
-		break;
-	case BASE_JD_REQ_SOFT_EXT_RES_MAP:
-		kbase_ext_res_finish(katom);
-		break;
-	case BASE_JD_REQ_SOFT_EXT_RES_UNMAP:
-		kbase_ext_res_finish(katom);
-		break;
-	case BASE_JD_REQ_SOFT_JIT_FREE:
-		kbase_jit_free_finish(katom);
-		break;
-	}
-}
-
-void kbase_resume_suspended_soft_jobs(struct kbase_device *kbdev)
-{
-	LIST_HEAD(local_suspended_soft_jobs);
-	struct kbase_jd_atom *tmp_iter;
-	struct kbase_jd_atom *katom_iter;
-	struct kbasep_js_device_data *js_devdata;
-	bool resched = false;
-
-	KBASE_DEBUG_ASSERT(kbdev);
-
-	js_devdata = &kbdev->js_data;
-
-	/* Move out the entire list */
-	mutex_lock(&js_devdata->runpool_mutex);
-	list_splice_init(&js_devdata->suspended_soft_jobs_list,
-			&local_suspended_soft_jobs);
-	mutex_unlock(&js_devdata->runpool_mutex);
-
-	/*
-	 * Each atom must be detached from the list and ran separately -
-	 * it could be re-added to the old list, but this is unlikely
-	 */
-	list_for_each_entry_safe(katom_iter, tmp_iter,
-			&local_suspended_soft_jobs, dep_item[1]) {
-		struct kbase_context *kctx = katom_iter->kctx;
-
-		mutex_lock(&kctx->jctx.lock);
-
-		/* Remove from the global list */
-		list_del(&katom_iter->dep_item[1]);
-		/* Remove from the context's list of waiting soft jobs */
-		kbasep_remove_waiting_soft_job(katom_iter);
-
-		if (kbase_process_soft_job(katom_iter) == 0) {
-			kbase_finish_soft_job(katom_iter);
-			resched |= jd_done_nolock(katom_iter, NULL);
-		} else {
-			KBASE_DEBUG_ASSERT((katom_iter->core_req &
-					BASE_JD_REQ_SOFT_JOB_TYPE)
-					!= BASE_JD_REQ_SOFT_REPLAY);
-		}
-
-		mutex_unlock(&kctx->jctx.lock);
-	}
-
-	if (resched)
-		kbase_js_sched_all(kbdev);
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_strings.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_strings.c
deleted file mode 100644
index c98762cec244..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_strings.c
+++ /dev/null
@@ -1,23 +0,0 @@
- /*
- *
- * (C) COPYRIGHT 2010-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-#include "mali_kbase_strings.h"
-
-#define KBASE_DRV_NAME "mali"
-#define KBASE_TIMELINE_NAME KBASE_DRV_NAME ".timeline"
-
-const char kbase_drv_name[] = KBASE_DRV_NAME;
-const char kbase_timeline_name[] = KBASE_TIMELINE_NAME;
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_strings.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_strings.h
deleted file mode 100644
index 41b8fdbec6a4..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_strings.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-extern const char kbase_drv_name[];
-extern const char kbase_timeline_name[];
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync.h
deleted file mode 100644
index 54159262314a..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync.h
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/**
- * @file mali_kbase_sync.h
- *
- * This file contains our internal "API" for explicit fences.
- * It hides the implementation details of the actual explicit fence mechanism
- * used (Android fences or sync file with DMA fences).
- */
-
-#ifndef MALI_KBASE_SYNC_H
-#define MALI_KBASE_SYNC_H
-
-#include <linux/syscalls.h>
-#ifdef CONFIG_SYNC
-#include <sync.h>
-#endif
-#ifdef CONFIG_SYNC_FILE
-#include "mali_kbase_fence_defs.h"
-#include <linux/sync_file.h>
-#endif
-
-#include "mali_kbase.h"
-
-/**
- * struct kbase_sync_fence_info - Information about a fence
- * @fence: Pointer to fence (type is void*, as underlaying struct can differ)
- * @name: The name given to this fence when it was created
- * @status: < 0 means error, 0 means active, 1 means signaled
- *
- * Use kbase_sync_fence_in_info_get() or kbase_sync_fence_out_info_get()
- * to get the information.
- */
-struct kbase_sync_fence_info {
-	void *fence;
-	char name[32];
-	int status;
-};
-
-/**
- * kbase_sync_fence_stream_create() - Create a stream object
- * @name: Name of stream (only used to ease debugging/visualization)
- * @out_fd: A file descriptor representing the created stream object
- *
- * Can map down to a timeline implementation in some implementations.
- * Exposed as a file descriptor.
- * Life-time controlled via the file descriptor:
- * - dup to add a ref
- * - close to remove a ref
- *
- * return: 0 on success, < 0 on error
- */
-int kbase_sync_fence_stream_create(const char *name, int *const out_fd);
-
-/**
- * kbase_sync_fence_out_create Create an explicit output fence to specified atom
- * @katom: Atom to assign the new explicit fence to
- * @stream_fd: File descriptor for stream object to create fence on
- *
- * return: Valid file descriptor to fence or < 0 on error
- */
-int kbase_sync_fence_out_create(struct kbase_jd_atom *katom, int stream_fd);
-
-/**
- * kbase_sync_fence_in_from_fd() Assigns an existing fence to specified atom
- * @katom: Atom to assign the existing explicit fence to
- * @fd: File descriptor to an existing fence
- *
- * Assigns an explicit input fence to atom.
- * This can later be waited for by calling @kbase_sync_fence_in_wait
- *
- * return: 0 on success, < 0 on error
- */
-int kbase_sync_fence_in_from_fd(struct kbase_jd_atom *katom, int fd);
-
-/**
- * kbase_sync_fence_validate() - Validate a fd to be a valid fence
- * @fd: File descriptor to check
- *
- * This function is only usable to catch unintentional user errors early,
- * it does not stop malicious code changing the fd after this function returns.
- *
- * return 0: if fd is for a valid fence, < 0 if invalid
- */
-int kbase_sync_fence_validate(int fd);
-
-/**
- * kbase_sync_fence_out_trigger - Signal explicit output fence attached on katom
- * @katom: Atom with an explicit fence to signal
- * @result: < 0 means signal with error, 0 >= indicates success
- *
- * Signal output fence attached on katom and remove the fence from the atom.
- *
- * return: The "next" event code for atom, typically JOB_CANCELLED or EVENT_DONE
- */
-enum base_jd_event_code
-kbase_sync_fence_out_trigger(struct kbase_jd_atom *katom, int result);
-
-/**
- * kbase_sync_fence_in_wait() - Wait for explicit input fence to be signaled
- * @katom: Atom with explicit fence to wait for
- *
- * If the fence is already signaled, then 0 is returned, and the caller must
- * continue processing of the katom.
- *
- * If the fence isn't already signaled, then this kbase_sync framework will
- * take responsibility to continue the processing once the fence is signaled.
- *
- * return: 0 if already signaled, otherwise 1
- */
-int kbase_sync_fence_in_wait(struct kbase_jd_atom *katom);
-
-/**
- * kbase_sync_fence_in_cancel_wait() - Cancel explicit input fence waits
- * @katom: Atom to cancel wait for
- *
- * This function is fully responsible for continuing processing of this atom
- * (remove_waiting_soft_job + finish_soft_job + jd_done + js_sched_all)
- */
-void kbase_sync_fence_in_cancel_wait(struct kbase_jd_atom *katom);
-
-/**
- * kbase_sync_fence_in_remove() - Remove the input fence from the katom
- * @katom: Atom to remove explicit input fence for
- *
- * This will also release the corresponding reference.
- */
-void kbase_sync_fence_in_remove(struct kbase_jd_atom *katom);
-
-/**
- * kbase_sync_fence_out_remove() - Remove the output fence from the katom
- * @katom: Atom to remove explicit output fence for
- *
- * This will also release the corresponding reference.
- */
-void kbase_sync_fence_out_remove(struct kbase_jd_atom *katom);
-
-/**
- * kbase_sync_fence_close_fd() - Close a file descriptor representing a fence
- * @fd: File descriptor to close
- */
-static inline void kbase_sync_fence_close_fd(int fd)
-{
-	ksys_close(fd);
-}
-
-/**
- * kbase_sync_fence_in_info_get() - Retrieves information about input fence
- * @katom: Atom to get fence information from
- * @info: Struct to be filled with fence information
- *
- * return: 0 on success, < 0 on error
- */
-int kbase_sync_fence_in_info_get(struct kbase_jd_atom *katom,
-				 struct kbase_sync_fence_info *info);
-
-/**
- * kbase_sync_fence_out_info_get() - Retrieves information about output fence
- * @katom: Atom to get fence information from
- * @info: Struct to be filled with fence information
- *
- * return: 0 on success, < 0 on error
- */
-int kbase_sync_fence_out_info_get(struct kbase_jd_atom *katom,
-				  struct kbase_sync_fence_info *info);
-
-/**
- * kbase_sync_status_string() - Get string matching @status
- * @status: Value of fence status.
- *
- * return: Pointer to string describing @status.
- */
-const char *kbase_sync_status_string(int status);
-
-/*
- * Internal worker used to continue processing of atom.
- */
-void kbase_sync_fence_wait_worker(struct work_struct *data);
-
-#ifdef CONFIG_MALI_BIFROST_FENCE_DEBUG
-/**
- * kbase_sync_fence_in_dump() Trigger a debug dump of atoms input fence state
- * @katom: Atom to trigger fence debug dump for
- */
-void kbase_sync_fence_in_dump(struct kbase_jd_atom *katom);
-#endif
-
-#endif /* MALI_KBASE_SYNC_H */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync_android.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync_android.c
deleted file mode 100644
index e4528e2b9f25..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync_android.c
+++ /dev/null
@@ -1,537 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * Code for supporting explicit Android fences (CONFIG_SYNC)
- * Known to be good for kernels 4.5 and earlier.
- * Replaced with CONFIG_SYNC_FILE for 4.9 and later kernels
- * (see mali_kbase_sync_file.c)
- */
-
-#include <linux/sched.h>
-#include <linux/fdtable.h>
-#include <linux/file.h>
-#include <linux/fs.h>
-#include <linux/module.h>
-#include <linux/anon_inodes.h>
-#include <linux/version.h>
-#include "sync.h"
-#include <mali_kbase.h>
-#include <mali_kbase_sync.h>
-
-struct mali_sync_timeline {
-	struct sync_timeline timeline;
-	atomic_t counter;
-	atomic_t signaled;
-};
-
-struct mali_sync_pt {
-	struct sync_pt pt;
-	int order;
-	int result;
-};
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
-/* For backwards compatibility with kernels before 3.17. After 3.17
- * sync_pt_parent is included in the kernel. */
-static inline struct sync_timeline *sync_pt_parent(struct sync_pt *pt)
-{
-	return pt->parent;
-}
-#endif
-
-static struct mali_sync_timeline *to_mali_sync_timeline(
-						struct sync_timeline *timeline)
-{
-	return container_of(timeline, struct mali_sync_timeline, timeline);
-}
-
-static struct mali_sync_pt *to_mali_sync_pt(struct sync_pt *pt)
-{
-	return container_of(pt, struct mali_sync_pt, pt);
-}
-
-static struct sync_pt *timeline_dup(struct sync_pt *pt)
-{
-	struct mali_sync_pt *mpt = to_mali_sync_pt(pt);
-	struct mali_sync_pt *new_mpt;
-	struct sync_pt *new_pt = sync_pt_create(sync_pt_parent(pt),
-						sizeof(struct mali_sync_pt));
-
-	if (!new_pt)
-		return NULL;
-
-	new_mpt = to_mali_sync_pt(new_pt);
-	new_mpt->order = mpt->order;
-	new_mpt->result = mpt->result;
-
-	return new_pt;
-}
-
-static int timeline_has_signaled(struct sync_pt *pt)
-{
-	struct mali_sync_pt *mpt = to_mali_sync_pt(pt);
-	struct mali_sync_timeline *mtl = to_mali_sync_timeline(
-							sync_pt_parent(pt));
-	int result = mpt->result;
-
-	int diff = atomic_read(&mtl->signaled) - mpt->order;
-
-	if (diff >= 0)
-		return (result < 0) ? result : 1;
-
-	return 0;
-}
-
-static int timeline_compare(struct sync_pt *a, struct sync_pt *b)
-{
-	struct mali_sync_pt *ma = container_of(a, struct mali_sync_pt, pt);
-	struct mali_sync_pt *mb = container_of(b, struct mali_sync_pt, pt);
-
-	int diff = ma->order - mb->order;
-
-	if (diff == 0)
-		return 0;
-
-	return (diff < 0) ? -1 : 1;
-}
-
-static void timeline_value_str(struct sync_timeline *timeline, char *str,
-			       int size)
-{
-	struct mali_sync_timeline *mtl = to_mali_sync_timeline(timeline);
-
-	snprintf(str, size, "%d", atomic_read(&mtl->signaled));
-}
-
-static void pt_value_str(struct sync_pt *pt, char *str, int size)
-{
-	struct mali_sync_pt *mpt = to_mali_sync_pt(pt);
-
-	snprintf(str, size, "%d(%d)", mpt->order, mpt->result);
-}
-
-static struct sync_timeline_ops mali_timeline_ops = {
-	.driver_name = "Mali",
-	.dup = timeline_dup,
-	.has_signaled = timeline_has_signaled,
-	.compare = timeline_compare,
-	.timeline_value_str = timeline_value_str,
-	.pt_value_str       = pt_value_str,
-};
-
-/* Allocates a timeline for Mali
- *
- * One timeline should be allocated per API context.
- */
-static struct sync_timeline *mali_sync_timeline_alloc(const char *name)
-{
-	struct sync_timeline *tl;
-	struct mali_sync_timeline *mtl;
-
-	tl = sync_timeline_create(&mali_timeline_ops,
-				  sizeof(struct mali_sync_timeline), name);
-	if (!tl)
-		return NULL;
-
-	/* Set the counter in our private struct */
-	mtl = to_mali_sync_timeline(tl);
-	atomic_set(&mtl->counter, 0);
-	atomic_set(&mtl->signaled, 0);
-
-	return tl;
-}
-
-static int kbase_stream_close(struct inode *inode, struct file *file)
-{
-	struct sync_timeline *tl;
-
-	tl = (struct sync_timeline *)file->private_data;
-	sync_timeline_destroy(tl);
-	return 0;
-}
-
-static const struct file_operations stream_fops = {
-	.owner = THIS_MODULE,
-	.release = kbase_stream_close,
-};
-
-int kbase_sync_fence_stream_create(const char *name, int *const out_fd)
-{
-	struct sync_timeline *tl;
-
-	if (!out_fd)
-		return -EINVAL;
-
-	tl = mali_sync_timeline_alloc(name);
-	if (!tl)
-		return -EINVAL;
-
-	*out_fd = anon_inode_getfd(name, &stream_fops, tl, O_RDONLY|O_CLOEXEC);
-
-	if (*out_fd < 0) {
-		sync_timeline_destroy(tl);
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-/* Allocates a sync point within the timeline.
- *
- * The timeline must be the one allocated by kbase_sync_timeline_alloc
- *
- * Sync points must be triggered in *exactly* the same order as they are
- * allocated.
- */
-static struct sync_pt *kbase_sync_pt_alloc(struct sync_timeline *parent)
-{
-	struct sync_pt *pt = sync_pt_create(parent,
-					    sizeof(struct mali_sync_pt));
-	struct mali_sync_timeline *mtl = to_mali_sync_timeline(parent);
-	struct mali_sync_pt *mpt;
-
-	if (!pt)
-		return NULL;
-
-	mpt = to_mali_sync_pt(pt);
-	mpt->order = atomic_inc_return(&mtl->counter);
-	mpt->result = 0;
-
-	return pt;
-}
-
-int kbase_sync_fence_out_create(struct kbase_jd_atom *katom, int tl_fd)
-{
-	struct sync_timeline *tl;
-	struct sync_pt *pt;
-	struct sync_fence *fence;
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 7, 0)
-	struct files_struct *files;
-	struct fdtable *fdt;
-#endif
-	int fd;
-	struct file *tl_file;
-
-	tl_file = fget(tl_fd);
-	if (tl_file == NULL)
-		return -EBADF;
-
-	if (tl_file->f_op != &stream_fops) {
-		fd = -EBADF;
-		goto out;
-	}
-
-	tl = tl_file->private_data;
-
-	pt = kbase_sync_pt_alloc(tl);
-	if (!pt) {
-		fd = -EFAULT;
-		goto out;
-	}
-
-	fence = sync_fence_create("mali_fence", pt);
-	if (!fence) {
-		sync_pt_free(pt);
-		fd = -EFAULT;
-		goto out;
-	}
-
-	/* from here the fence owns the sync_pt */
-
-	/* create a fd representing the fence */
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0)
-	fd = get_unused_fd_flags(O_RDWR | O_CLOEXEC);
-	if (fd < 0) {
-		sync_fence_put(fence);
-		goto out;
-	}
-#else
-	fd = get_unused_fd();
-	if (fd < 0) {
-		sync_fence_put(fence);
-		goto out;
-	}
-
-	files = current->files;
-	spin_lock(&files->file_lock);
-	fdt = files_fdtable(files);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)
-	__set_close_on_exec(fd, fdt);
-#else
-	FD_SET(fd, fdt->close_on_exec);
-#endif
-	spin_unlock(&files->file_lock);
-#endif  /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0) */
-
-	/* bind fence to the new fd */
-	sync_fence_install(fence, fd);
-
-	katom->fence = sync_fence_fdget(fd);
-	if (katom->fence == NULL) {
-		/* The only way the fence can be NULL is if userspace closed it
-		 * for us, so we don't need to clear it up */
-		fd = -EINVAL;
-		goto out;
-	}
-
-out:
-	fput(tl_file);
-
-	return fd;
-}
-
-int kbase_sync_fence_in_from_fd(struct kbase_jd_atom *katom, int fd)
-{
-	katom->fence = sync_fence_fdget(fd);
-	return katom->fence ? 0 : -ENOENT;
-}
-
-int kbase_sync_fence_validate(int fd)
-{
-	struct sync_fence *fence;
-
-	fence = sync_fence_fdget(fd);
-	if (!fence)
-		return -EINVAL;
-
-	sync_fence_put(fence);
-	return 0;
-}
-
-/* Returns true if the specified timeline is allocated by Mali */
-static int kbase_sync_timeline_is_ours(struct sync_timeline *timeline)
-{
-	return timeline->ops == &mali_timeline_ops;
-}
-
-/* Signals a particular sync point
- *
- * Sync points must be triggered in *exactly* the same order as they are
- * allocated.
- *
- * If they are signaled in the wrong order then a message will be printed in
- * debug builds and otherwise attempts to signal order sync_pts will be ignored.
- *
- * result can be negative to indicate error, any other value is interpreted as
- * success.
- */
-static void kbase_sync_signal_pt(struct sync_pt *pt, int result)
-{
-	struct mali_sync_pt *mpt = to_mali_sync_pt(pt);
-	struct mali_sync_timeline *mtl = to_mali_sync_timeline(
-							sync_pt_parent(pt));
-	int signaled;
-	int diff;
-
-	mpt->result = result;
-
-	do {
-		signaled = atomic_read(&mtl->signaled);
-
-		diff = signaled - mpt->order;
-
-		if (diff > 0) {
-			/* The timeline is already at or ahead of this point.
-			 * This should not happen unless userspace has been
-			 * signaling fences out of order, so warn but don't
-			 * violate the sync_pt API.
-			 * The warning is only in debug builds to prevent
-			 * a malicious user being able to spam dmesg.
-			 */
-#ifdef CONFIG_MALI_BIFROST_DEBUG
-			pr_err("Fences were triggered in a different order to allocation!");
-#endif				/* CONFIG_MALI_BIFROST_DEBUG */
-			return;
-		}
-	} while (atomic_cmpxchg(&mtl->signaled,
-				signaled, mpt->order) != signaled);
-}
-
-enum base_jd_event_code
-kbase_sync_fence_out_trigger(struct kbase_jd_atom *katom, int result)
-{
-	struct sync_pt *pt;
-	struct sync_timeline *timeline;
-
-	if (!katom->fence)
-		return BASE_JD_EVENT_JOB_CANCELLED;
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
-	if (!list_is_singular(&katom->fence->pt_list_head)) {
-#else
-	if (katom->fence->num_fences != 1) {
-#endif
-		/* Not exactly one item in the list - so it didn't (directly)
-		 * come from us */
-		return BASE_JD_EVENT_JOB_CANCELLED;
-	}
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
-	pt = list_first_entry(&katom->fence->pt_list_head,
-			      struct sync_pt, pt_list);
-#else
-	pt = container_of(katom->fence->cbs[0].sync_pt, struct sync_pt, base);
-#endif
-	timeline = sync_pt_parent(pt);
-
-	if (!kbase_sync_timeline_is_ours(timeline)) {
-		/* Fence has a sync_pt which isn't ours! */
-		return BASE_JD_EVENT_JOB_CANCELLED;
-	}
-
-	kbase_sync_signal_pt(pt, result);
-
-	sync_timeline_signal(timeline);
-
-	kbase_sync_fence_out_remove(katom);
-
-	return (result < 0) ? BASE_JD_EVENT_JOB_CANCELLED : BASE_JD_EVENT_DONE;
-}
-
-static inline int kbase_fence_get_status(struct sync_fence *fence)
-{
-	if (!fence)
-		return -ENOENT;
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0)
-	return fence->status;
-#else
-	return atomic_read(&fence->status);
-#endif
-}
-
-static void kbase_fence_wait_callback(struct sync_fence *fence,
-				      struct sync_fence_waiter *waiter)
-{
-	struct kbase_jd_atom *katom = container_of(waiter,
-					struct kbase_jd_atom, sync_waiter);
-	struct kbase_context *kctx = katom->kctx;
-
-	/* Propagate the fence status to the atom.
-	 * If negative then cancel this atom and its dependencies.
-	 */
-	if (kbase_fence_get_status(fence) < 0)
-		katom->event_code = BASE_JD_EVENT_JOB_CANCELLED;
-
-	/* To prevent a potential deadlock we schedule the work onto the
-	 * job_done_wq workqueue
-	 *
-	 * The issue is that we may signal the timeline while holding
-	 * kctx->jctx.lock and the callbacks are run synchronously from
-	 * sync_timeline_signal. So we simply defer the work.
-	 */
-
-	INIT_WORK(&katom->work, kbase_sync_fence_wait_worker);
-	queue_work(kctx->jctx.job_done_wq, &katom->work);
-}
-
-int kbase_sync_fence_in_wait(struct kbase_jd_atom *katom)
-{
-	int ret;
-
-	sync_fence_waiter_init(&katom->sync_waiter, kbase_fence_wait_callback);
-
-	ret = sync_fence_wait_async(katom->fence, &katom->sync_waiter);
-
-	if (ret == 1) {
-		/* Already signaled */
-		return 0;
-	}
-
-	if (ret < 0) {
-		katom->event_code = BASE_JD_EVENT_JOB_CANCELLED;
-		/* We should cause the dependent jobs in the bag to be failed,
-		 * to do this we schedule the work queue to complete this job */
-		INIT_WORK(&katom->work, kbase_sync_fence_wait_worker);
-		queue_work(katom->kctx->jctx.job_done_wq, &katom->work);
-	}
-
-	return 1;
-}
-
-void kbase_sync_fence_in_cancel_wait(struct kbase_jd_atom *katom)
-{
-	if (sync_fence_cancel_async(katom->fence, &katom->sync_waiter) != 0) {
-		/* The wait wasn't cancelled - leave the cleanup for
-		 * kbase_fence_wait_callback */
-		return;
-	}
-
-	/* Wait was cancelled - zap the atoms */
-	katom->event_code = BASE_JD_EVENT_JOB_CANCELLED;
-
-	kbasep_remove_waiting_soft_job(katom);
-	kbase_finish_soft_job(katom);
-
-	if (jd_done_nolock(katom, NULL))
-		kbase_js_sched_all(katom->kctx->kbdev);
-}
-
-void kbase_sync_fence_out_remove(struct kbase_jd_atom *katom)
-{
-	if (katom->fence) {
-		sync_fence_put(katom->fence);
-		katom->fence = NULL;
-	}
-}
-
-void kbase_sync_fence_in_remove(struct kbase_jd_atom *katom)
-{
-	if (katom->fence) {
-		sync_fence_put(katom->fence);
-		katom->fence = NULL;
-	}
-}
-
-int kbase_sync_fence_in_info_get(struct kbase_jd_atom *katom,
-				 struct kbase_sync_fence_info *info)
-{
-	if (!katom->fence)
-		return -ENOENT;
-
-	info->fence = katom->fence;
-	info->status = kbase_fence_get_status(katom->fence);
-	strlcpy(info->name, katom->fence->name, sizeof(info->name));
-
-	return 0;
-}
-
-int kbase_sync_fence_out_info_get(struct kbase_jd_atom *katom,
-				 struct kbase_sync_fence_info *info)
-{
-	if (!katom->fence)
-		return -ENOENT;
-
-	info->fence = katom->fence;
-	info->status = kbase_fence_get_status(katom->fence);
-	strlcpy(info->name, katom->fence->name, sizeof(info->name));
-
-	return 0;
-}
-
-#ifdef CONFIG_MALI_BIFROST_FENCE_DEBUG
-void kbase_sync_fence_in_dump(struct kbase_jd_atom *katom)
-{
-	/* Dump out the full state of all the Android sync fences.
-	 * The function sync_dump() isn't exported to modules, so force
-	 * sync_fence_wait() to time out to trigger sync_dump().
-	 */
-	if (katom->fence)
-		sync_fence_wait(katom->fence, 1);
-}
-#endif
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync_common.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync_common.c
deleted file mode 100644
index 457def296684..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync_common.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * @file mali_kbase_sync_common.c
- *
- * Common code for our explicit fence functionality
- */
-
-#include <linux/workqueue.h>
-#include "mali_kbase.h"
-
-void kbase_sync_fence_wait_worker(struct work_struct *data)
-{
-	struct kbase_jd_atom *katom;
-
-	katom = container_of(data, struct kbase_jd_atom, work);
-	kbase_soft_event_wait_callback(katom);
-}
-
-const char *kbase_sync_status_string(int status)
-{
-	if (status == 0)
-		return "signaled";
-	else if (status > 0)
-		return "active";
-	else
-		return "error";
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync_file.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync_file.c
deleted file mode 100644
index 509c0666f10f..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_sync_file.c
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/*
- * Code for supporting explicit Linux fences (CONFIG_SYNC_FILE)
- * Introduced in kernel 4.9.
- * Android explicit fences (CONFIG_SYNC) can be used for older kernels
- * (see mali_kbase_sync_android.c)
- */
-
-#include <linux/sched.h>
-#include <linux/fdtable.h>
-#include <linux/file.h>
-#include <linux/fs.h>
-#include <linux/module.h>
-#include <linux/anon_inodes.h>
-#include <linux/version.h>
-#include <linux/uaccess.h>
-#include <linux/sync_file.h>
-#include <linux/slab.h>
-#include "mali_kbase_fence_defs.h"
-#include "mali_kbase_sync.h"
-#include "mali_kbase_fence.h"
-#include "mali_kbase.h"
-
-static const struct file_operations stream_fops = {
-	.owner = THIS_MODULE
-};
-
-int kbase_sync_fence_stream_create(const char *name, int *const out_fd)
-{
-	if (!out_fd)
-		return -EINVAL;
-
-	*out_fd = anon_inode_getfd(name, &stream_fops, NULL,
-				   O_RDONLY | O_CLOEXEC);
-	if (*out_fd < 0)
-		return -EINVAL;
-
-	return 0;
-}
-
-int kbase_sync_fence_out_create(struct kbase_jd_atom *katom, int stream_fd)
-{
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-	struct fence *fence;
-#else
-	struct dma_fence *fence;
-#endif
-	struct sync_file *sync_file;
-	int fd;
-
-	fence = kbase_fence_out_new(katom);
-	if (!fence)
-		return -ENOMEM;
-
-	/* Take an extra reference to the fence on behalf of the katom.
-	 * This is needed because sync_file_create() will take ownership of
-	 * one of these refs */
-	dma_fence_get(fence);
-
-	/* create a sync_file fd representing the fence */
-	sync_file = sync_file_create(fence);
-	if (!sync_file) {
-		dma_fence_put(fence);
-		kbase_fence_out_remove(katom);
-		return -ENOMEM;
-	}
-
-	fd = get_unused_fd_flags(O_CLOEXEC);
-	if (fd < 0) {
-		fput(sync_file->file);
-		kbase_fence_out_remove(katom);
-		return fd;
-	}
-
-	fd_install(fd, sync_file->file);
-
-	return fd;
-}
-
-int kbase_sync_fence_in_from_fd(struct kbase_jd_atom *katom, int fd)
-{
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-	struct fence *fence = sync_file_get_fence(fd);
-#else
-	struct dma_fence *fence = sync_file_get_fence(fd);
-#endif
-
-	if (!fence)
-		return -ENOENT;
-
-	kbase_fence_fence_in_set(katom, fence);
-
-	return 0;
-}
-
-int kbase_sync_fence_validate(int fd)
-{
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-	struct fence *fence = sync_file_get_fence(fd);
-#else
-	struct dma_fence *fence = sync_file_get_fence(fd);
-#endif
-
-	if (!fence)
-		return -EINVAL;
-
-	dma_fence_put(fence);
-
-	return 0; /* valid */
-}
-
-enum base_jd_event_code
-kbase_sync_fence_out_trigger(struct kbase_jd_atom *katom, int result)
-{
-	int res;
-
-	if (!kbase_fence_out_is_ours(katom)) {
-		/* Not our fence */
-		return BASE_JD_EVENT_JOB_CANCELLED;
-	}
-
-	res = kbase_fence_out_signal(katom, result);
-	if (unlikely(res < 0)) {
-		dev_warn(katom->kctx->kbdev->dev,
-				"fence_signal() failed with %d\n", res);
-	}
-
-	kbase_sync_fence_out_remove(katom);
-
-	return (result != 0) ? BASE_JD_EVENT_JOB_CANCELLED : BASE_JD_EVENT_DONE;
-}
-
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-static void kbase_fence_wait_callback(struct fence *fence,
-				      struct fence_cb *cb)
-#else
-static void kbase_fence_wait_callback(struct dma_fence *fence,
-				      struct dma_fence_cb *cb)
-#endif
-{
-	struct kbase_fence_cb *kcb = container_of(cb,
-				struct kbase_fence_cb,
-				fence_cb);
-	struct kbase_jd_atom *katom = kcb->katom;
-	struct kbase_context *kctx = katom->kctx;
-
-	/* Cancel atom if fence is erroneous */
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0))
-	if (dma_fence_is_signaled(kcb->fence) && kcb->fence->error)
-#else
-	if (dma_fence_is_signaled(kcb->fence) && kcb->fence->status < 0)
-#endif
-		katom->event_code = BASE_JD_EVENT_JOB_CANCELLED;
-
-	if (kbase_fence_dep_count_dec_and_test(katom)) {
-		/* We take responsibility of handling this */
-		kbase_fence_dep_count_set(katom, -1);
-
-		/* To prevent a potential deadlock we schedule the work onto the
-		 * job_done_wq workqueue
-		 *
-		 * The issue is that we may signal the timeline while holding
-		 * kctx->jctx.lock and the callbacks are run synchronously from
-		 * sync_timeline_signal. So we simply defer the work.
-		 */
-		INIT_WORK(&katom->work, kbase_sync_fence_wait_worker);
-		queue_work(kctx->jctx.job_done_wq, &katom->work);
-	}
-}
-
-int kbase_sync_fence_in_wait(struct kbase_jd_atom *katom)
-{
-	int err;
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-	struct fence *fence;
-#else
-	struct dma_fence *fence;
-#endif
-
-	fence = kbase_fence_in_get(katom);
-	if (!fence)
-		return 0; /* no input fence to wait for, good to go! */
-
-	kbase_fence_dep_count_set(katom, 1);
-
-	err = kbase_fence_add_callback(katom, fence, kbase_fence_wait_callback);
-
-	kbase_fence_put(fence);
-
-	if (likely(!err)) {
-		/* Test if the callbacks are already triggered */
-		if (kbase_fence_dep_count_dec_and_test(katom)) {
-			kbase_fence_free_callbacks(katom);
-			kbase_fence_dep_count_set(katom, -1);
-			return 0; /* Already signaled, good to go right now */
-		}
-
-		/* Callback installed, so we just need to wait for it... */
-	} else {
-		/* Failure */
-		kbase_fence_free_callbacks(katom);
-		kbase_fence_dep_count_set(katom, -1);
-
-		katom->event_code = BASE_JD_EVENT_JOB_CANCELLED;
-
-		/* We should cause the dependent jobs in the bag to be failed,
-		 * to do this we schedule the work queue to complete this job */
-
-		INIT_WORK(&katom->work, kbase_sync_fence_wait_worker);
-		queue_work(katom->kctx->jctx.job_done_wq, &katom->work);
-	}
-
-	return 1; /* completion to be done later by callback/worker */
-}
-
-void kbase_sync_fence_in_cancel_wait(struct kbase_jd_atom *katom)
-{
-	if (!kbase_fence_free_callbacks(katom)) {
-		/* The wait wasn't cancelled -
-		 * leave the cleanup for kbase_fence_wait_callback */
-		return;
-	}
-
-	/* Take responsibility of completion */
-	kbase_fence_dep_count_set(katom, -1);
-
-	/* Wait was cancelled - zap the atoms */
-	katom->event_code = BASE_JD_EVENT_JOB_CANCELLED;
-
-	kbasep_remove_waiting_soft_job(katom);
-	kbase_finish_soft_job(katom);
-
-	if (jd_done_nolock(katom, NULL))
-		kbase_js_sched_all(katom->kctx->kbdev);
-}
-
-void kbase_sync_fence_out_remove(struct kbase_jd_atom *katom)
-{
-	kbase_fence_out_remove(katom);
-}
-
-void kbase_sync_fence_in_remove(struct kbase_jd_atom *katom)
-{
-	kbase_fence_free_callbacks(katom);
-	kbase_fence_in_remove(katom);
-}
-
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-static void kbase_sync_fence_info_get(struct fence *fence,
-				      struct kbase_sync_fence_info *info)
-#else
-static void kbase_sync_fence_info_get(struct dma_fence *fence,
-				      struct kbase_sync_fence_info *info)
-#endif
-{
-	info->fence = fence;
-
-	/* translate into CONFIG_SYNC status:
-	 * < 0 : error
-	 * 0 : active
-	 * 1 : signaled
-	 */
-	if (dma_fence_is_signaled(fence)) {
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0))
-		int status = fence->error;
-#else
-		int status = fence->status;
-#endif
-		if (status < 0)
-			info->status = status; /* signaled with error */
-		else
-			info->status = 1; /* signaled with success */
-	} else  {
-		info->status = 0; /* still active (unsignaled) */
-	}
-
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 8, 0))
-	scnprintf(info->name, sizeof(info->name), "%u#%u",
-		  fence->context, fence->seqno);
-#else
-	scnprintf(info->name, sizeof(info->name), "%llu#%u",
-		  fence->context, fence->seqno);
-#endif
-}
-
-int kbase_sync_fence_in_info_get(struct kbase_jd_atom *katom,
-				 struct kbase_sync_fence_info *info)
-{
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-	struct fence *fence;
-#else
-	struct dma_fence *fence;
-#endif
-
-	fence = kbase_fence_in_get(katom);
-	if (!fence)
-		return -ENOENT;
-
-	kbase_sync_fence_info_get(fence, info);
-
-	kbase_fence_put(fence);
-
-	return 0;
-}
-
-int kbase_sync_fence_out_info_get(struct kbase_jd_atom *katom,
-				  struct kbase_sync_fence_info *info)
-{
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0))
-	struct fence *fence;
-#else
-	struct dma_fence *fence;
-#endif
-
-	fence = kbase_fence_out_get(katom);
-	if (!fence)
-		return -ENOENT;
-
-	kbase_sync_fence_info_get(fence, info);
-
-	kbase_fence_put(fence);
-
-	return 0;
-}
-
-
-#ifdef CONFIG_MALI_BIFROST_FENCE_DEBUG
-void kbase_sync_fence_in_dump(struct kbase_jd_atom *katom)
-{
-	/* Not implemented */
-}
-#endif
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_tlstream.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_tlstream.c
deleted file mode 100644
index 485565ebfe80..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_tlstream.c
+++ /dev/null
@@ -1,2569 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2015-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <linux/anon_inodes.h>
-#include <linux/atomic.h>
-#include <linux/file.h>
-#include <linux/mutex.h>
-#include <linux/poll.h>
-#include <linux/spinlock.h>
-#include <linux/string.h>
-#include <linux/stringify.h>
-#include <linux/timer.h>
-#include <linux/wait.h>
-
-#include <mali_kbase.h>
-#include <mali_kbase_jm.h>
-#include <mali_kbase_tlstream.h>
-
-/*****************************************************************************/
-
-/* The version of swtrace protocol used in timeline stream. */
-#define SWTRACE_VERSION    3
-
-/* The maximum expected length of string in tracepoint descriptor. */
-#define STRLEN_MAX         64 /* bytes */
-
-/* The number of nanoseconds in a second. */
-#define NSECS_IN_SEC       1000000000ull /* ns */
-
-/* The period of autoflush checker execution in milliseconds. */
-#define AUTOFLUSH_INTERVAL 1000 /* ms */
-
-/* The maximum size of a single packet used by timeline. */
-#define PACKET_SIZE        4096 /* bytes */
-
-/* The number of packets used by one timeline stream. */
-#define PACKET_COUNT       16
-
-/* The number of bytes reserved for packet header.
- * These value must be defined according to MIPE documentation. */
-#define PACKET_HEADER_SIZE 8 /* bytes */
-
-/* The number of bytes reserved for packet sequence number.
- * These value must be defined according to MIPE documentation. */
-#define PACKET_NUMBER_SIZE 4 /* bytes */
-
-/* Packet header - first word.
- * These values must be defined according to MIPE documentation. */
-#define PACKET_STREAMID_POS  0
-#define PACKET_STREAMID_LEN  8
-#define PACKET_RSVD1_POS     (PACKET_STREAMID_POS + PACKET_STREAMID_LEN)
-#define PACKET_RSVD1_LEN     8
-#define PACKET_TYPE_POS      (PACKET_RSVD1_POS + PACKET_RSVD1_LEN)
-#define PACKET_TYPE_LEN      3
-#define PACKET_CLASS_POS     (PACKET_TYPE_POS + PACKET_TYPE_LEN)
-#define PACKET_CLASS_LEN     7
-#define PACKET_FAMILY_POS    (PACKET_CLASS_POS + PACKET_CLASS_LEN)
-#define PACKET_FAMILY_LEN    6
-
-/* Packet header - second word
- * These values must be defined according to MIPE documentation. */
-#define PACKET_LENGTH_POS    0
-#define PACKET_LENGTH_LEN    24
-#define PACKET_SEQBIT_POS    (PACKET_LENGTH_POS + PACKET_LENGTH_LEN)
-#define PACKET_SEQBIT_LEN    1
-#define PACKET_RSVD2_POS     (PACKET_SEQBIT_POS + PACKET_SEQBIT_LEN)
-#define PACKET_RSVD2_LEN     7
-
-/* Types of streams generated by timeline.
- * Order is significant! Header streams must precede respective body streams. */
-enum tl_stream_type {
-	TL_STREAM_TYPE_OBJ_HEADER,
-	TL_STREAM_TYPE_OBJ_SUMMARY,
-	TL_STREAM_TYPE_OBJ,
-	TL_STREAM_TYPE_AUX_HEADER,
-	TL_STREAM_TYPE_AUX,
-
-	TL_STREAM_TYPE_COUNT
-};
-
-/* Timeline packet family ids.
- * Values are significant! Check MIPE documentation. */
-enum tl_packet_family {
-	TL_PACKET_FAMILY_CTRL = 0, /* control packets */
-	TL_PACKET_FAMILY_TL   = 1, /* timeline packets */
-
-	TL_PACKET_FAMILY_COUNT
-};
-
-/* Packet classes used in timeline streams.
- * Values are significant! Check MIPE documentation. */
-enum tl_packet_class {
-	TL_PACKET_CLASS_OBJ = 0, /* timeline objects packet */
-	TL_PACKET_CLASS_AUX = 1, /* auxiliary events packet */
-};
-
-/* Packet types used in timeline streams.
- * Values are significant! Check MIPE documentation. */
-enum tl_packet_type {
-	TL_PACKET_TYPE_HEADER  = 0, /* stream's header/directory */
-	TL_PACKET_TYPE_BODY    = 1, /* stream's body */
-	TL_PACKET_TYPE_SUMMARY = 2, /* stream's summary */
-};
-
-/* Message ids of trace events that are recorded in the timeline stream. */
-enum tl_msg_id_obj {
-	/* Timeline object events. */
-	KBASE_TL_NEW_CTX,
-	KBASE_TL_NEW_GPU,
-	KBASE_TL_NEW_LPU,
-	KBASE_TL_NEW_ATOM,
-	KBASE_TL_NEW_AS,
-	KBASE_TL_DEL_CTX,
-	KBASE_TL_DEL_ATOM,
-	KBASE_TL_LIFELINK_LPU_GPU,
-	KBASE_TL_LIFELINK_AS_GPU,
-	KBASE_TL_RET_CTX_LPU,
-	KBASE_TL_RET_ATOM_CTX,
-	KBASE_TL_RET_ATOM_LPU,
-	KBASE_TL_NRET_CTX_LPU,
-	KBASE_TL_NRET_ATOM_CTX,
-	KBASE_TL_NRET_ATOM_LPU,
-	KBASE_TL_RET_AS_CTX,
-	KBASE_TL_NRET_AS_CTX,
-	KBASE_TL_RET_ATOM_AS,
-	KBASE_TL_NRET_ATOM_AS,
-	KBASE_TL_DEP_ATOM_ATOM,
-	KBASE_TL_NDEP_ATOM_ATOM,
-	KBASE_TL_RDEP_ATOM_ATOM,
-	KBASE_TL_ATTRIB_ATOM_CONFIG,
-	KBASE_TL_ATTRIB_ATOM_PRIORITY,
-	KBASE_TL_ATTRIB_ATOM_STATE,
-	KBASE_TL_ATTRIB_ATOM_PRIORITY_CHANGE,
-	KBASE_TL_ATTRIB_ATOM_JIT,
-	KBASE_TL_ATTRIB_AS_CONFIG,
-	KBASE_TL_EVENT_LPU_SOFTSTOP,
-	KBASE_TL_EVENT_ATOM_SOFTSTOP_EX,
-	KBASE_TL_EVENT_ATOM_SOFTSTOP_ISSUE,
-
-	/* Job dump specific events. */
-	KBASE_JD_GPU_SOFT_RESET
-};
-
-/* Message ids of trace events that are recorded in the auxiliary stream. */
-enum tl_msg_id_aux {
-	KBASE_AUX_PM_STATE,
-	KBASE_AUX_PAGEFAULT,
-	KBASE_AUX_PAGESALLOC,
-	KBASE_AUX_DEVFREQ_TARGET,
-	KBASE_AUX_PROTECTED_ENTER_START,
-	KBASE_AUX_PROTECTED_ENTER_END,
-	KBASE_AUX_PROTECTED_LEAVE_START,
-	KBASE_AUX_PROTECTED_LEAVE_END
-};
-
-/*****************************************************************************/
-
-/**
- * struct tl_stream - timeline stream structure
- * @lock: message order lock
- * @buffer: array of buffers
- * @wbi: write buffer index
- * @rbi: read buffer index
- * @numbered: if non-zero stream's packets are sequentially numbered
- * @autoflush_counter: counter tracking stream's autoflush state
- *
- * This structure holds information needed to construct proper packets in the
- * timeline stream. Each message in sequence must bear timestamp that is greater
- * to one in previous message in the same stream. For this reason lock is held
- * throughout the process of message creation. Each stream contains set of
- * buffers. Each buffer will hold one MIPE packet. In case there is no free
- * space required to store incoming message the oldest buffer is discarded.
- * Each packet in timeline body stream has sequence number embedded (this value
- * must increment monotonically and is used by packets receiver to discover
- * buffer overflows.
- * Autoflush counter is set to negative number when there is no data pending
- * for flush and it is set to zero on every update of the buffer. Autoflush
- * timer will increment the counter by one on every expiry. In case there will
- * be no activity on the buffer during two consecutive timer expiries, stream
- * buffer will be flushed.
- */
-struct tl_stream {
-	spinlock_t lock;
-
-	struct {
-		atomic_t size;              /* number of bytes in buffer */
-		char     data[PACKET_SIZE]; /* buffer's data */
-	} buffer[PACKET_COUNT];
-
-	atomic_t wbi;
-	atomic_t rbi;
-
-	int      numbered;
-	atomic_t autoflush_counter;
-};
-
-/**
- * struct tp_desc - tracepoint message descriptor structure
- * @id:        tracepoint ID identifying message in stream
- * @id_str:    human readable version of tracepoint ID
- * @name:      tracepoint description
- * @arg_types: tracepoint's arguments types declaration
- * @arg_names: comma separated list of tracepoint's arguments names
- */
-struct tp_desc {
-	u32        id;
-	const char *id_str;
-	const char *name;
-	const char *arg_types;
-	const char *arg_names;
-};
-
-/*****************************************************************************/
-
-/* Configuration of timeline streams generated by kernel.
- * Kernel emit only streams containing either timeline object events or
- * auxiliary events. All streams have stream id value of 1 (as opposed to user
- * space streams that have value of 0). */
-static const struct {
-	enum tl_packet_family pkt_family;
-	enum tl_packet_class  pkt_class;
-	enum tl_packet_type   pkt_type;
-	unsigned int          stream_id;
-} tl_stream_cfg[TL_STREAM_TYPE_COUNT] = {
-	{TL_PACKET_FAMILY_TL, TL_PACKET_CLASS_OBJ, TL_PACKET_TYPE_HEADER,  1},
-	{TL_PACKET_FAMILY_TL, TL_PACKET_CLASS_OBJ, TL_PACKET_TYPE_SUMMARY, 1},
-	{TL_PACKET_FAMILY_TL, TL_PACKET_CLASS_OBJ, TL_PACKET_TYPE_BODY,    1},
-	{TL_PACKET_FAMILY_TL, TL_PACKET_CLASS_AUX, TL_PACKET_TYPE_HEADER,  1},
-	{TL_PACKET_FAMILY_TL, TL_PACKET_CLASS_AUX, TL_PACKET_TYPE_BODY,    1}
-};
-
-/* The timeline streams generated by kernel. */
-static struct tl_stream *tl_stream[TL_STREAM_TYPE_COUNT];
-
-/* Autoflush timer. */
-static struct timer_list autoflush_timer;
-
-/* If non-zero autoflush timer is active. */
-static atomic_t autoflush_timer_active;
-
-/* Reader lock. Only one reader is allowed to have access to the timeline
- * streams at any given time. */
-static DEFINE_MUTEX(tl_reader_lock);
-
-/* Timeline stream event queue. */
-static DECLARE_WAIT_QUEUE_HEAD(tl_event_queue);
-
-/* The timeline stream file operations functions. */
-static ssize_t kbasep_tlstream_read(
-		struct file *filp,
-		char __user *buffer,
-		size_t      size,
-		loff_t      *f_pos);
-static unsigned int kbasep_tlstream_poll(struct file *filp, poll_table *wait);
-static int kbasep_tlstream_release(struct inode *inode, struct file *filp);
-
-/* The timeline stream file operations structure. */
-static const struct file_operations kbasep_tlstream_fops = {
-	.release = kbasep_tlstream_release,
-	.read    = kbasep_tlstream_read,
-	.poll    = kbasep_tlstream_poll,
-};
-
-/* Descriptors of timeline messages transmitted in object events stream. */
-static const struct tp_desc tp_desc_obj[] = {
-	{
-		KBASE_TL_NEW_CTX,
-		__stringify(KBASE_TL_NEW_CTX),
-		"object ctx is created",
-		"@pII",
-		"ctx,ctx_nr,tgid"
-	},
-	{
-		KBASE_TL_NEW_GPU,
-		__stringify(KBASE_TL_NEW_GPU),
-		"object gpu is created",
-		"@pII",
-		"gpu,gpu_id,core_count"
-	},
-	{
-		KBASE_TL_NEW_LPU,
-		__stringify(KBASE_TL_NEW_LPU),
-		"object lpu is created",
-		"@pII",
-		"lpu,lpu_nr,lpu_fn"
-	},
-	{
-		KBASE_TL_NEW_ATOM,
-		__stringify(KBASE_TL_NEW_ATOM),
-		"object atom is created",
-		"@pI",
-		"atom,atom_nr"
-	},
-	{
-		KBASE_TL_NEW_AS,
-		__stringify(KBASE_TL_NEW_AS),
-		"address space object is created",
-		"@pI",
-		"address_space,as_nr"
-	},
-	{
-		KBASE_TL_DEL_CTX,
-		__stringify(KBASE_TL_DEL_CTX),
-		"context is destroyed",
-		"@p",
-		"ctx"
-	},
-	{
-		KBASE_TL_DEL_ATOM,
-		__stringify(KBASE_TL_DEL_ATOM),
-		"atom is destroyed",
-		"@p",
-		"atom"
-	},
-	{
-		KBASE_TL_LIFELINK_LPU_GPU,
-		__stringify(KBASE_TL_LIFELINK_LPU_GPU),
-		"lpu is deleted with gpu",
-		"@pp",
-		"lpu,gpu"
-	},
-	{
-		KBASE_TL_LIFELINK_AS_GPU,
-		__stringify(KBASE_TL_LIFELINK_AS_GPU),
-		"address space is deleted with gpu",
-		"@pp",
-		"address_space,gpu"
-	},
-	{
-		KBASE_TL_RET_CTX_LPU,
-		__stringify(KBASE_TL_RET_CTX_LPU),
-		"context is retained by lpu",
-		"@pp",
-		"ctx,lpu"
-	},
-	{
-		KBASE_TL_RET_ATOM_CTX,
-		__stringify(KBASE_TL_RET_ATOM_CTX),
-		"atom is retained by context",
-		"@pp",
-		"atom,ctx"
-	},
-	{
-		KBASE_TL_RET_ATOM_LPU,
-		__stringify(KBASE_TL_RET_ATOM_LPU),
-		"atom is retained by lpu",
-		"@pps",
-		"atom,lpu,attrib_match_list"
-	},
-	{
-		KBASE_TL_NRET_CTX_LPU,
-		__stringify(KBASE_TL_NRET_CTX_LPU),
-		"context is released by lpu",
-		"@pp",
-		"ctx,lpu"
-	},
-	{
-		KBASE_TL_NRET_ATOM_CTX,
-		__stringify(KBASE_TL_NRET_ATOM_CTX),
-		"atom is released by context",
-		"@pp",
-		"atom,ctx"
-	},
-	{
-		KBASE_TL_NRET_ATOM_LPU,
-		__stringify(KBASE_TL_NRET_ATOM_LPU),
-		"atom is released by lpu",
-		"@pp",
-		"atom,lpu"
-	},
-	{
-		KBASE_TL_RET_AS_CTX,
-		__stringify(KBASE_TL_RET_AS_CTX),
-		"address space is retained by context",
-		"@pp",
-		"address_space,ctx"
-	},
-	{
-		KBASE_TL_NRET_AS_CTX,
-		__stringify(KBASE_TL_NRET_AS_CTX),
-		"address space is released by context",
-		"@pp",
-		"address_space,ctx"
-	},
-	{
-		KBASE_TL_RET_ATOM_AS,
-		__stringify(KBASE_TL_RET_ATOM_AS),
-		"atom is retained by address space",
-		"@pp",
-		"atom,address_space"
-	},
-	{
-		KBASE_TL_NRET_ATOM_AS,
-		__stringify(KBASE_TL_NRET_ATOM_AS),
-		"atom is released by address space",
-		"@pp",
-		"atom,address_space"
-	},
-	{
-		KBASE_TL_DEP_ATOM_ATOM,
-		__stringify(KBASE_TL_DEP_ATOM_ATOM),
-		"atom2 depends on atom1",
-		"@pp",
-		"atom1,atom2"
-	},
-	{
-		KBASE_TL_NDEP_ATOM_ATOM,
-		__stringify(KBASE_TL_NDEP_ATOM_ATOM),
-		"atom2 no longer depends on atom1",
-		"@pp",
-		"atom1,atom2"
-	},
-	{
-		KBASE_TL_RDEP_ATOM_ATOM,
-		__stringify(KBASE_TL_RDEP_ATOM_ATOM),
-		"resolved dependecy of atom2 depending on atom1",
-		"@pp",
-		"atom1,atom2"
-	},
-	{
-		KBASE_TL_ATTRIB_ATOM_CONFIG,
-		__stringify(KBASE_TL_ATTRIB_ATOM_CONFIG),
-		"atom job slot attributes",
-		"@pLLI",
-		"atom,descriptor,affinity,config"
-	},
-	{
-		KBASE_TL_ATTRIB_ATOM_PRIORITY,
-		__stringify(KBASE_TL_ATTRIB_ATOM_PRIORITY),
-		"atom priority",
-		"@pI",
-		"atom,prio"
-	},
-	{
-		KBASE_TL_ATTRIB_ATOM_STATE,
-		__stringify(KBASE_TL_ATTRIB_ATOM_STATE),
-		"atom state",
-		"@pI",
-		"atom,state"
-	},
-	{
-		KBASE_TL_ATTRIB_ATOM_PRIORITY_CHANGE,
-		__stringify(KBASE_TL_ATTRIB_ATOM_PRIORITY_CHANGE),
-		"atom caused priority change",
-		"@p",
-		"atom"
-	},
-	{
-		KBASE_TL_ATTRIB_ATOM_JIT,
-		__stringify(KBASE_TL_ATTRIB_ATOM_JIT),
-		"jit done for atom",
-		"@pLL",
-		"atom,edit_addr,new_addr"
-	},
-	{
-		KBASE_TL_ATTRIB_AS_CONFIG,
-		__stringify(KBASE_TL_ATTRIB_AS_CONFIG),
-		"address space attributes",
-		"@pLLL",
-		"address_space,transtab,memattr,transcfg"
-	},
-	{
-		KBASE_TL_EVENT_LPU_SOFTSTOP,
-		__stringify(KBASE_TL_EVENT_LPU_SOFTSTOP),
-		"softstop event on given lpu",
-		"@p",
-		"lpu"
-	},
-	{
-		KBASE_TL_EVENT_ATOM_SOFTSTOP_EX,
-		__stringify(KBASE_TL_EVENT_ATOM_SOFTSTOP_EX),
-		"atom softstopped",
-		"@p",
-		"atom"
-	},
-	{
-		KBASE_TL_EVENT_ATOM_SOFTSTOP_ISSUE,
-		__stringify(KBASE_TL_EVENT_SOFTSTOP_ISSUE),
-		"atom softstop issued",
-		"@p",
-		"atom"
-	},
-	{
-		KBASE_JD_GPU_SOFT_RESET,
-		__stringify(KBASE_JD_GPU_SOFT_RESET),
-		"gpu soft reset",
-		"@p",
-		"gpu"
-	},
-};
-
-/* Descriptors of timeline messages transmitted in auxiliary events stream. */
-static const struct tp_desc tp_desc_aux[] = {
-	{
-		KBASE_AUX_PM_STATE,
-		__stringify(KBASE_AUX_PM_STATE),
-		"PM state",
-		"@IL",
-		"core_type,core_state_bitset"
-	},
-	{
-		KBASE_AUX_PAGEFAULT,
-		__stringify(KBASE_AUX_PAGEFAULT),
-		"Page fault",
-		"@IL",
-		"ctx_nr,page_cnt_change"
-	},
-	{
-		KBASE_AUX_PAGESALLOC,
-		__stringify(KBASE_AUX_PAGESALLOC),
-		"Total alloc pages change",
-		"@IL",
-		"ctx_nr,page_cnt"
-	},
-	{
-		KBASE_AUX_DEVFREQ_TARGET,
-		__stringify(KBASE_AUX_DEVFREQ_TARGET),
-		"New device frequency target",
-		"@L",
-		"target_freq"
-	},
-	{
-		KBASE_AUX_PROTECTED_ENTER_START,
-		__stringify(KBASE_AUX_PROTECTED_ENTER_START),
-		"enter protected mode start",
-		"@p",
-		"gpu"
-	},
-	{
-		KBASE_AUX_PROTECTED_ENTER_END,
-		__stringify(KBASE_AUX_PROTECTED_ENTER_END),
-		"enter protected mode end",
-		"@p",
-		"gpu"
-	},
-	{
-		KBASE_AUX_PROTECTED_LEAVE_START,
-		__stringify(KBASE_AUX_PROTECTED_LEAVE_START),
-		"leave protected mode start",
-		"@p",
-		"gpu"
-	},
-	{
-		KBASE_AUX_PROTECTED_LEAVE_END,
-		__stringify(KBASE_AUX_PROTECTED_LEAVE_END),
-		"leave protected mode end",
-		"@p",
-		"gpu"
-	}
-};
-
-#if MALI_UNIT_TEST
-/* Number of bytes read by user. */
-static atomic_t tlstream_bytes_collected = {0};
-
-/* Number of bytes generated by tracepoint messages. */
-static atomic_t tlstream_bytes_generated = {0};
-#endif /* MALI_UNIT_TEST */
-
-/*****************************************************************************/
-
-/* Indicator of whether the timeline stream file descriptor is used. */
-atomic_t kbase_tlstream_enabled = {0};
-
-/*****************************************************************************/
-
-/**
- * kbasep_tlstream_get_timestamp - return timestamp
- *
- * Function returns timestamp value based on raw monotonic timer. Value will
- * wrap around zero in case of overflow.
- * Return: timestamp value
- */
-static u64 kbasep_tlstream_get_timestamp(void)
-{
-	struct timespec ts;
-	u64             timestamp;
-
-	getrawmonotonic(&ts);
-	timestamp = (u64)ts.tv_sec * NSECS_IN_SEC + ts.tv_nsec;
-	return timestamp;
-}
-
-/**
- * kbasep_tlstream_write_bytes - write data to message buffer
- * @buffer: buffer where data will be written
- * @pos:    position in the buffer where to place data
- * @bytes:  pointer to buffer holding data
- * @len:    length of data to be written
- *
- * Return: updated position in the buffer
- */
-static size_t kbasep_tlstream_write_bytes(
-		char       *buffer,
-		size_t     pos,
-		const void *bytes,
-		size_t     len)
-{
-	KBASE_DEBUG_ASSERT(buffer);
-	KBASE_DEBUG_ASSERT(bytes);
-
-	memcpy(&buffer[pos], bytes, len);
-
-	return pos + len;
-}
-
-/**
- * kbasep_tlstream_write_string - write string to message buffer
- * @buffer:         buffer where data will be written
- * @pos:            position in the buffer where to place data
- * @string:         pointer to buffer holding the source string
- * @max_write_size: number of bytes that can be stored in buffer
- *
- * Return: updated position in the buffer
- */
-static size_t kbasep_tlstream_write_string(
-		char       *buffer,
-		size_t     pos,
-		const char *string,
-		size_t     max_write_size)
-{
-	u32 string_len;
-
-	KBASE_DEBUG_ASSERT(buffer);
-	KBASE_DEBUG_ASSERT(string);
-	/* Timeline string consists of at least string length and nul
-	 * terminator. */
-	KBASE_DEBUG_ASSERT(max_write_size >= sizeof(string_len) + sizeof(char));
-	max_write_size -= sizeof(string_len);
-
-	string_len = strlcpy(
-			&buffer[pos + sizeof(string_len)],
-			string,
-			max_write_size);
-	string_len += sizeof(char);
-
-	/* Make sure that the source string fit into the buffer. */
-	KBASE_DEBUG_ASSERT(string_len <= max_write_size);
-
-	/* Update string length. */
-	memcpy(&buffer[pos], &string_len, sizeof(string_len));
-
-	return pos + sizeof(string_len) + string_len;
-}
-
-/**
- * kbasep_tlstream_write_timestamp - write timestamp to message buffer
- * @buffer: buffer where data will be written
- * @pos:    position in the buffer where to place data
- *
- * Return: updated position in the buffer
- */
-static size_t kbasep_tlstream_write_timestamp(void *buffer, size_t pos)
-{
-	u64 timestamp = kbasep_tlstream_get_timestamp();
-
-	return kbasep_tlstream_write_bytes(
-			buffer, pos,
-			&timestamp, sizeof(timestamp));
-}
-
-/**
- * kbasep_tlstream_put_bits - put bits in a word
- * @word:   pointer to the words being modified
- * @value:  value that shall be written to given position
- * @bitpos: position where value shall be written (in bits)
- * @bitlen: length of value (in bits)
- */
-static void kbasep_tlstream_put_bits(
-		u32          *word,
-		u32          value,
-		unsigned int bitpos,
-		unsigned int bitlen)
-{
-	const u32 mask = ((1 << bitlen) - 1) << bitpos;
-
-	KBASE_DEBUG_ASSERT(word);
-	KBASE_DEBUG_ASSERT((0 != bitlen) && (32 >= bitlen));
-	KBASE_DEBUG_ASSERT((bitpos + bitlen) <= 32);
-
-	*word &= ~mask;
-	*word |= ((value << bitpos) & mask);
-}
-
-/**
- * kbasep_tlstream_packet_header_setup - setup the packet header
- * @buffer:     pointer to the buffer
- * @pkt_family: packet's family
- * @pkt_type:   packet's type
- * @pkt_class:  packet's class
- * @stream_id:  stream id
- * @numbered:   non-zero if this stream is numbered
- *
- * Function sets up immutable part of packet header in the given buffer.
- */
-static void kbasep_tlstream_packet_header_setup(
-		char                  *buffer,
-		enum tl_packet_family pkt_family,
-		enum tl_packet_class  pkt_class,
-		enum tl_packet_type   pkt_type,
-		unsigned int          stream_id,
-		int                   numbered)
-{
-	u32 word0 = 0;
-	u32 word1 = 0;
-
-	KBASE_DEBUG_ASSERT(buffer);
-	KBASE_DEBUG_ASSERT(pkt_family == TL_PACKET_FAMILY_TL);
-	KBASE_DEBUG_ASSERT(
-			(pkt_type == TL_PACKET_TYPE_HEADER)  ||
-			(pkt_type == TL_PACKET_TYPE_SUMMARY) ||
-			(pkt_type == TL_PACKET_TYPE_BODY));
-	KBASE_DEBUG_ASSERT(
-			(pkt_class == TL_PACKET_CLASS_OBJ) ||
-			(pkt_class == TL_PACKET_CLASS_AUX));
-
-	kbasep_tlstream_put_bits(
-			&word0, pkt_family,
-			PACKET_FAMILY_POS, PACKET_FAMILY_LEN);
-	kbasep_tlstream_put_bits(
-			&word0, pkt_class,
-			PACKET_CLASS_POS, PACKET_CLASS_LEN);
-	kbasep_tlstream_put_bits(
-			&word0, pkt_type,
-			PACKET_TYPE_POS, PACKET_TYPE_LEN);
-	kbasep_tlstream_put_bits(
-			&word0, stream_id,
-			PACKET_STREAMID_POS, PACKET_STREAMID_LEN);
-
-	if (numbered)
-		kbasep_tlstream_put_bits(
-				&word1, 1,
-				PACKET_SEQBIT_POS, PACKET_SEQBIT_LEN);
-
-	memcpy(&buffer[0],             &word0, sizeof(word0));
-	memcpy(&buffer[sizeof(word0)], &word1, sizeof(word1));
-}
-
-/**
- * kbasep_tlstream_packet_header_update - update the packet header
- * @buffer:    pointer to the buffer
- * @data_size: amount of data carried in this packet
- *
- * Function updates mutable part of packet header in the given buffer.
- * Note that value of data_size must not including size of the header.
- */
-static void kbasep_tlstream_packet_header_update(
-		char   *buffer,
-		size_t data_size)
-{
-	u32 word0;
-	u32 word1;
-
-	KBASE_DEBUG_ASSERT(buffer);
-	CSTD_UNUSED(word0);
-
-	memcpy(&word1, &buffer[sizeof(word0)], sizeof(word1));
-
-	kbasep_tlstream_put_bits(
-			&word1, data_size,
-			PACKET_LENGTH_POS, PACKET_LENGTH_LEN);
-
-	memcpy(&buffer[sizeof(word0)], &word1, sizeof(word1));
-}
-
-/**
- * kbasep_tlstream_packet_number_update - update the packet number
- * @buffer:  pointer to the buffer
- * @counter: value of packet counter for this packet's stream
- *
- * Function updates packet number embedded within the packet placed in the
- * given buffer.
- */
-static void kbasep_tlstream_packet_number_update(char *buffer, u32 counter)
-{
-	KBASE_DEBUG_ASSERT(buffer);
-
-	memcpy(&buffer[PACKET_HEADER_SIZE], &counter, sizeof(counter));
-}
-
-/**
- * kbasep_timeline_stream_reset - reset stream
- * @stream:  pointer to the stream structure
- *
- * Function discards all pending messages and resets packet counters.
- */
-static void kbasep_timeline_stream_reset(struct tl_stream *stream)
-{
-	unsigned int i;
-
-	for (i = 0; i < PACKET_COUNT; i++) {
-		if (stream->numbered)
-			atomic_set(
-					&stream->buffer[i].size,
-					PACKET_HEADER_SIZE +
-					PACKET_NUMBER_SIZE);
-		else
-			atomic_set(&stream->buffer[i].size, PACKET_HEADER_SIZE);
-	}
-
-	atomic_set(&stream->wbi, 0);
-	atomic_set(&stream->rbi, 0);
-}
-
-/**
- * kbasep_timeline_stream_init - initialize timeline stream
- * @stream:      pointer to the stream structure
- * @stream_type: stream type
- */
-static void kbasep_timeline_stream_init(
-		struct tl_stream    *stream,
-		enum tl_stream_type stream_type)
-{
-	unsigned int i;
-
-	KBASE_DEBUG_ASSERT(stream);
-	KBASE_DEBUG_ASSERT(TL_STREAM_TYPE_COUNT > stream_type);
-
-	spin_lock_init(&stream->lock);
-
-	/* All packets carrying tracepoints shall be numbered. */
-	if (TL_PACKET_TYPE_BODY == tl_stream_cfg[stream_type].pkt_type)
-		stream->numbered = 1;
-	else
-		stream->numbered = 0;
-
-	for (i = 0; i < PACKET_COUNT; i++)
-		kbasep_tlstream_packet_header_setup(
-				stream->buffer[i].data,
-				tl_stream_cfg[stream_type].pkt_family,
-				tl_stream_cfg[stream_type].pkt_class,
-				tl_stream_cfg[stream_type].pkt_type,
-				tl_stream_cfg[stream_type].stream_id,
-				stream->numbered);
-
-	kbasep_timeline_stream_reset(tl_stream[stream_type]);
-}
-
-/**
- * kbasep_timeline_stream_term - terminate timeline stream
- * @stream: pointer to the stream structure
- */
-static void kbasep_timeline_stream_term(struct tl_stream *stream)
-{
-	KBASE_DEBUG_ASSERT(stream);
-}
-
-/**
- * kbasep_tlstream_msgbuf_submit - submit packet to the user space
- * @stream:     pointer to the stream structure
- * @wb_idx_raw: write buffer index
- * @wb_size:    length of data stored in current buffer
- *
- * Function updates currently written buffer with packet header. Then write
- * index is incremented and buffer is handled to user space. Parameters
- * of new buffer are returned using provided arguments.
- *
- * Return: length of data in new buffer
- *
- * Warning:  User must update the stream structure with returned value.
- */
-static size_t kbasep_tlstream_msgbuf_submit(
-		struct tl_stream *stream,
-		unsigned int      wb_idx_raw,
-		unsigned int      wb_size)
-{
-	unsigned int rb_idx_raw = atomic_read(&stream->rbi);
-	unsigned int wb_idx = wb_idx_raw % PACKET_COUNT;
-
-	/* Set stream as flushed. */
-	atomic_set(&stream->autoflush_counter, -1);
-
-	kbasep_tlstream_packet_header_update(
-			stream->buffer[wb_idx].data,
-			wb_size - PACKET_HEADER_SIZE);
-
-	if (stream->numbered)
-		kbasep_tlstream_packet_number_update(
-				stream->buffer[wb_idx].data,
-				wb_idx_raw);
-
-	/* Increasing write buffer index will expose this packet to the reader.
-	 * As stream->lock is not taken on reader side we must make sure memory
-	 * is updated correctly before this will happen. */
-	smp_wmb();
-	wb_idx_raw++;
-	atomic_set(&stream->wbi, wb_idx_raw);
-
-	/* Inform user that packets are ready for reading. */
-	wake_up_interruptible(&tl_event_queue);
-
-	/* Detect and mark overflow in this stream. */
-	if (PACKET_COUNT == wb_idx_raw - rb_idx_raw) {
-		/* Reader side depends on this increment to correctly handle
-		 * overflows. The value shall be updated only if it was not
-		 * modified by the reader. The data holding buffer will not be
-		 * updated before stream->lock is released, however size of the
-		 * buffer will. Make sure this increment is globally visible
-		 * before information about selected write buffer size. */
-		atomic_cmpxchg(&stream->rbi, rb_idx_raw, rb_idx_raw + 1);
-	}
-
-	wb_size = PACKET_HEADER_SIZE;
-	if (stream->numbered)
-		wb_size += PACKET_NUMBER_SIZE;
-
-	return wb_size;
-}
-
-/**
- * kbasep_tlstream_msgbuf_acquire - lock selected stream and reserves buffer
- * @stream_type: type of the stream that shall be locked
- * @msg_size:    message size
- * @flags:       pointer to store flags passed back on stream release
- *
- * Function will lock the stream and reserve the number of bytes requested
- * in msg_size for the user.
- *
- * Return: pointer to the buffer where message can be stored
- *
- * Warning: Stream must be released with kbasep_tlstream_msgbuf_release().
- *          Only atomic operations are allowed while stream is locked
- *          (i.e. do not use any operation that may sleep).
- */
-static char *kbasep_tlstream_msgbuf_acquire(
-		enum tl_stream_type stream_type,
-		size_t              msg_size,
-		unsigned long       *flags) __acquires(&stream->lock)
-{
-	struct tl_stream *stream;
-	unsigned int     wb_idx_raw;
-	unsigned int     wb_idx;
-	size_t           wb_size;
-
-	KBASE_DEBUG_ASSERT(TL_STREAM_TYPE_COUNT > stream_type);
-	KBASE_DEBUG_ASSERT(
-			PACKET_SIZE - PACKET_HEADER_SIZE - PACKET_NUMBER_SIZE >=
-			msg_size);
-
-	stream = tl_stream[stream_type];
-
-	spin_lock_irqsave(&stream->lock, *flags);
-
-	wb_idx_raw = atomic_read(&stream->wbi);
-	wb_idx     = wb_idx_raw % PACKET_COUNT;
-	wb_size    = atomic_read(&stream->buffer[wb_idx].size);
-
-	/* Select next buffer if data will not fit into current one. */
-	if (PACKET_SIZE < wb_size + msg_size) {
-		wb_size = kbasep_tlstream_msgbuf_submit(
-				stream, wb_idx_raw, wb_size);
-		wb_idx  = (wb_idx_raw + 1) % PACKET_COUNT;
-	}
-
-	/* Reserve space in selected buffer. */
-	atomic_set(&stream->buffer[wb_idx].size, wb_size + msg_size);
-
-#if MALI_UNIT_TEST
-	atomic_add(msg_size, &tlstream_bytes_generated);
-#endif /* MALI_UNIT_TEST */
-
-	return &stream->buffer[wb_idx].data[wb_size];
-}
-
-/**
- * kbasep_tlstream_msgbuf_release - unlock selected stream
- * @stream_type:  type of the stream that shall be locked
- * @flags:        value obtained during stream acquire
- *
- * Function releases stream that has been previously locked with a call to
- * kbasep_tlstream_msgbuf_acquire().
- */
-static void kbasep_tlstream_msgbuf_release(
-		enum tl_stream_type stream_type,
-		unsigned long       flags) __releases(&stream->lock)
-{
-	struct tl_stream *stream;
-
-	KBASE_DEBUG_ASSERT(TL_STREAM_TYPE_COUNT > stream_type);
-
-	stream = tl_stream[stream_type];
-
-	/* Mark stream as containing unflushed data. */
-	atomic_set(&stream->autoflush_counter, 0);
-
-	spin_unlock_irqrestore(&stream->lock, flags);
-}
-
-/*****************************************************************************/
-
-/**
- * kbasep_tlstream_flush_stream - flush stream
- * @stype:  type of stream to be flushed
- *
- * Flush pending data in timeline stream.
- */
-static void kbasep_tlstream_flush_stream(enum tl_stream_type stype)
-{
-	struct tl_stream *stream = tl_stream[stype];
-	unsigned long    flags;
-	unsigned int     wb_idx_raw;
-	unsigned int     wb_idx;
-	size_t           wb_size;
-	size_t           min_size = PACKET_HEADER_SIZE;
-
-	if (stream->numbered)
-		min_size += PACKET_NUMBER_SIZE;
-
-	spin_lock_irqsave(&stream->lock, flags);
-
-	wb_idx_raw = atomic_read(&stream->wbi);
-	wb_idx     = wb_idx_raw % PACKET_COUNT;
-	wb_size    = atomic_read(&stream->buffer[wb_idx].size);
-
-	if (wb_size > min_size) {
-		wb_size = kbasep_tlstream_msgbuf_submit(
-				stream, wb_idx_raw, wb_size);
-		wb_idx = (wb_idx_raw + 1) % PACKET_COUNT;
-		atomic_set(&stream->buffer[wb_idx].size, wb_size);
-	}
-	spin_unlock_irqrestore(&stream->lock, flags);
-}
-
-/**
- * kbasep_tlstream_autoflush_timer_callback - autoflush timer callback
- * @data:  unused
- *
- * Timer is executed periodically to check if any of the stream contains
- * buffer ready to be submitted to user space.
- */
-static void kbasep_tlstream_autoflush_timer_callback(struct timer_list *t)
-{
-	enum tl_stream_type stype;
-	int                 rcode;
-
-	for (stype = 0; stype < TL_STREAM_TYPE_COUNT; stype++) {
-		struct tl_stream *stream = tl_stream[stype];
-		unsigned long    flags;
-		unsigned int     wb_idx_raw;
-		unsigned int     wb_idx;
-		size_t           wb_size;
-		size_t           min_size = PACKET_HEADER_SIZE;
-
-		int af_cnt = atomic_read(&stream->autoflush_counter);
-
-		/* Check if stream contain unflushed data. */
-		if (0 > af_cnt)
-			continue;
-
-		/* Check if stream should be flushed now. */
-		if (af_cnt != atomic_cmpxchg(
-					&stream->autoflush_counter,
-					af_cnt,
-					af_cnt + 1))
-			continue;
-		if (!af_cnt)
-			continue;
-
-		/* Autoflush this stream. */
-		if (stream->numbered)
-			min_size += PACKET_NUMBER_SIZE;
-
-		spin_lock_irqsave(&stream->lock, flags);
-
-		wb_idx_raw = atomic_read(&stream->wbi);
-		wb_idx     = wb_idx_raw % PACKET_COUNT;
-		wb_size    = atomic_read(&stream->buffer[wb_idx].size);
-
-		if (wb_size > min_size) {
-			wb_size = kbasep_tlstream_msgbuf_submit(
-					stream, wb_idx_raw, wb_size);
-			wb_idx = (wb_idx_raw + 1) % PACKET_COUNT;
-			atomic_set(&stream->buffer[wb_idx].size,
-					wb_size);
-		}
-		spin_unlock_irqrestore(&stream->lock, flags);
-	}
-
-	if (atomic_read(&autoflush_timer_active))
-		rcode = mod_timer(
-				&autoflush_timer,
-				jiffies + msecs_to_jiffies(AUTOFLUSH_INTERVAL));
-	CSTD_UNUSED(rcode);
-}
-
-/**
- * kbasep_tlstream_packet_pending - check timeline streams for pending packets
- * @stype:      pointer to variable where stream type will be placed
- * @rb_idx_raw: pointer to variable where read buffer index will be placed
- *
- * Function checks all streams for pending packets. It will stop as soon as
- * packet ready to be submitted to user space is detected. Variables under
- * pointers, passed as the parameters to this function will be updated with
- * values pointing to right stream and buffer.
- *
- * Return: non-zero if any of timeline streams has at last one packet ready
- */
-static int kbasep_tlstream_packet_pending(
-		enum tl_stream_type *stype,
-		unsigned int        *rb_idx_raw)
-{
-	int pending = 0;
-
-	KBASE_DEBUG_ASSERT(stype);
-	KBASE_DEBUG_ASSERT(rb_idx_raw);
-
-	for (
-			*stype = 0;
-			(*stype < TL_STREAM_TYPE_COUNT) && !pending;
-			(*stype)++) {
-		if (NULL != tl_stream[*stype]) {
-			*rb_idx_raw = atomic_read(&tl_stream[*stype]->rbi);
-			/* Read buffer index may be updated by writer in case of
-			 * overflow. Read and write buffer indexes must be
-			 * loaded in correct order. */
-			smp_rmb();
-			if (atomic_read(&tl_stream[*stype]->wbi) != *rb_idx_raw)
-				pending = 1;
-		}
-	}
-	(*stype)--;
-
-	return pending;
-}
-
-/**
- * kbasep_tlstream_read - copy data from streams to buffer provided by user
- * @filp:   pointer to file structure (unused)
- * @buffer: pointer to the buffer provided by user
- * @size:   maximum amount of data that can be stored in the buffer
- * @f_pos:  pointer to file offset (unused)
- *
- * Return: number of bytes stored in the buffer
- */
-static ssize_t kbasep_tlstream_read(
-		struct file *filp,
-		char __user *buffer,
-		size_t      size,
-		loff_t      *f_pos)
-{
-	ssize_t copy_len = 0;
-
-	KBASE_DEBUG_ASSERT(filp);
-	KBASE_DEBUG_ASSERT(f_pos);
-
-	if (!buffer)
-		return -EINVAL;
-
-	if ((0 > *f_pos) || (PACKET_SIZE > size))
-		return -EINVAL;
-
-	mutex_lock(&tl_reader_lock);
-
-	while (copy_len < size) {
-		enum tl_stream_type stype;
-		unsigned int        rb_idx_raw = 0;
-		unsigned int        rb_idx;
-		size_t              rb_size;
-
-		/* If we don't have any data yet, wait for packet to be
-		 * submitted. If we already read some packets and there is no
-		 * packet pending return back to user. */
-		if (0 < copy_len) {
-			if (!kbasep_tlstream_packet_pending(
-						&stype,
-						&rb_idx_raw))
-				break;
-		} else {
-			if (wait_event_interruptible(
-						tl_event_queue,
-						kbasep_tlstream_packet_pending(
-							&stype,
-							&rb_idx_raw))) {
-				copy_len = -ERESTARTSYS;
-				break;
-			}
-		}
-
-		/* Check if this packet fits into the user buffer.
-		 * If so copy its content. */
-		rb_idx = rb_idx_raw % PACKET_COUNT;
-		rb_size = atomic_read(&tl_stream[stype]->buffer[rb_idx].size);
-		if (rb_size > size - copy_len)
-			break;
-		if (copy_to_user(
-					&buffer[copy_len],
-					tl_stream[stype]->buffer[rb_idx].data,
-					rb_size)) {
-			copy_len = -EFAULT;
-			break;
-		}
-
-		/* If the rbi still points to the packet we just processed
-		 * then there was no overflow so we add the copied size to
-		 * copy_len and move rbi on to the next packet
-		 */
-		smp_rmb();
-		if (atomic_read(&tl_stream[stype]->rbi) == rb_idx_raw) {
-			copy_len += rb_size;
-			atomic_inc(&tl_stream[stype]->rbi);
-
-#if MALI_UNIT_TEST
-			atomic_add(rb_size, &tlstream_bytes_collected);
-#endif /* MALI_UNIT_TEST */
-		}
-	}
-
-	mutex_unlock(&tl_reader_lock);
-
-	return copy_len;
-}
-
-/**
- * kbasep_tlstream_poll - poll timeline stream for packets
- * @filp: pointer to file structure
- * @wait: pointer to poll table
- * Return: POLLIN if data can be read without blocking, otherwise zero
- */
-static unsigned int kbasep_tlstream_poll(struct file *filp, poll_table *wait)
-{
-	enum tl_stream_type stream_type;
-	unsigned int        rb_idx;
-
-	KBASE_DEBUG_ASSERT(filp);
-	KBASE_DEBUG_ASSERT(wait);
-
-	poll_wait(filp, &tl_event_queue, wait);
-	if (kbasep_tlstream_packet_pending(&stream_type, &rb_idx))
-		return POLLIN;
-	return 0;
-}
-
-/**
- * kbasep_tlstream_release - release timeline stream descriptor
- * @inode: pointer to inode structure
- * @filp:  pointer to file structure
- *
- * Return always return zero
- */
-static int kbasep_tlstream_release(struct inode *inode, struct file *filp)
-{
-	KBASE_DEBUG_ASSERT(inode);
-	KBASE_DEBUG_ASSERT(filp);
-	CSTD_UNUSED(inode);
-	CSTD_UNUSED(filp);
-
-	/* Stop autoflush timer before releasing access to streams. */
-	atomic_set(&autoflush_timer_active, 0);
-	del_timer_sync(&autoflush_timer);
-
-	atomic_set(&kbase_tlstream_enabled, 0);
-	return 0;
-}
-
-/**
- * kbasep_tlstream_timeline_header - prepare timeline header stream packet
- * @stream_type: type of the stream that will carry header data
- * @tp_desc:     pointer to array with tracepoint descriptors
- * @tp_count:    number of descriptors in the given array
- *
- * Functions fills in information about tracepoints stored in body stream
- * associated with this header stream.
- */
-static void kbasep_tlstream_timeline_header(
-		enum tl_stream_type  stream_type,
-		const struct tp_desc *tp_desc,
-		u32                  tp_count)
-{
-	const u8      tv = SWTRACE_VERSION; /* protocol version */
-	const u8      ps = sizeof(void *); /* pointer size */
-	size_t        msg_size = sizeof(tv) + sizeof(ps) + sizeof(tp_count);
-	char          *buffer;
-	size_t        pos = 0;
-	unsigned long flags;
-	unsigned int  i;
-
-	KBASE_DEBUG_ASSERT(TL_STREAM_TYPE_COUNT > stream_type);
-	KBASE_DEBUG_ASSERT(tp_desc);
-
-	/* Calculate the size of the timeline message. */
-	for (i = 0; i < tp_count; i++) {
-		msg_size += sizeof(tp_desc[i].id);
-		msg_size +=
-			strnlen(tp_desc[i].id_str,    STRLEN_MAX) +
-			sizeof(char) + sizeof(u32);
-		msg_size +=
-			strnlen(tp_desc[i].name,      STRLEN_MAX) +
-			sizeof(char) + sizeof(u32);
-		msg_size +=
-			strnlen(tp_desc[i].arg_types, STRLEN_MAX) +
-			sizeof(char) + sizeof(u32);
-		msg_size +=
-			strnlen(tp_desc[i].arg_names, STRLEN_MAX) +
-			sizeof(char) + sizeof(u32);
-	}
-
-	KBASE_DEBUG_ASSERT(PACKET_SIZE - PACKET_HEADER_SIZE >= msg_size);
-
-	buffer = kbasep_tlstream_msgbuf_acquire(stream_type, msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &tv, sizeof(tv));
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &ps, sizeof(ps));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &tp_count, sizeof(tp_count));
-
-	for (i = 0; i < tp_count; i++) {
-		pos = kbasep_tlstream_write_bytes(
-				buffer, pos,
-				&tp_desc[i].id, sizeof(tp_desc[i].id));
-		pos = kbasep_tlstream_write_string(
-				buffer, pos,
-				tp_desc[i].id_str, msg_size - pos);
-		pos = kbasep_tlstream_write_string(
-				buffer, pos,
-				tp_desc[i].name, msg_size - pos);
-		pos = kbasep_tlstream_write_string(
-				buffer, pos,
-				tp_desc[i].arg_types, msg_size - pos);
-		pos = kbasep_tlstream_write_string(
-				buffer, pos,
-				tp_desc[i].arg_names, msg_size - pos);
-	}
-
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(stream_type, flags);
-
-	/* We don't expect any more data to be read in this stream.
-	 * As header stream must be read before its associated body stream,
-	 * make this packet visible to the user straightaway. */
-	kbasep_tlstream_flush_stream(stream_type);
-}
-
-/*****************************************************************************/
-
-int kbase_tlstream_init(void)
-{
-	enum tl_stream_type i;
-
-	/* Prepare stream structures. */
-	for (i = 0; i < TL_STREAM_TYPE_COUNT; i++) {
-		tl_stream[i] = kmalloc(sizeof(**tl_stream), GFP_KERNEL);
-		if (!tl_stream[i])
-			break;
-		kbasep_timeline_stream_init(tl_stream[i], i);
-	}
-	if (TL_STREAM_TYPE_COUNT > i) {
-		for (; i > 0; i--) {
-			kbasep_timeline_stream_term(tl_stream[i - 1]);
-			kfree(tl_stream[i - 1]);
-		}
-		return -ENOMEM;
-	}
-
-	/* Initialize autoflush timer. */
-	timer_setup(&autoflush_timer,
-		    kbasep_tlstream_autoflush_timer_callback,
-		    0);
-
-	return 0;
-}
-
-void kbase_tlstream_term(void)
-{
-	enum tl_stream_type i;
-
-	for (i = 0; i < TL_STREAM_TYPE_COUNT; i++) {
-		kbasep_timeline_stream_term(tl_stream[i]);
-		kfree(tl_stream[i]);
-	}
-}
-
-static void kbase_create_timeline_objects(struct kbase_context *kctx)
-{
-	struct kbase_device             *kbdev = kctx->kbdev;
-	unsigned int                    lpu_id;
-	unsigned int                    as_nr;
-	struct kbasep_kctx_list_element *element;
-
-	/* Create LPU objects. */
-	for (lpu_id = 0; lpu_id < kbdev->gpu_props.num_job_slots; lpu_id++) {
-		u32 *lpu =
-			&kbdev->gpu_props.props.raw_props.js_features[lpu_id];
-		KBASE_TLSTREAM_TL_SUMMARY_NEW_LPU(lpu, lpu_id, *lpu);
-	}
-
-	/* Create Address Space objects. */
-	for (as_nr = 0; as_nr < kbdev->nr_hw_address_spaces; as_nr++)
-		KBASE_TLSTREAM_TL_SUMMARY_NEW_AS(&kbdev->as[as_nr], as_nr);
-
-	/* Create GPU object and make it retain all LPUs and address spaces. */
-	KBASE_TLSTREAM_TL_SUMMARY_NEW_GPU(
-			kbdev,
-			kbdev->gpu_props.props.raw_props.gpu_id,
-			kbdev->gpu_props.num_cores);
-
-	for (lpu_id = 0; lpu_id < kbdev->gpu_props.num_job_slots; lpu_id++) {
-		void *lpu =
-			&kbdev->gpu_props.props.raw_props.js_features[lpu_id];
-		KBASE_TLSTREAM_TL_SUMMARY_LIFELINK_LPU_GPU(lpu, kbdev);
-	}
-	for (as_nr = 0; as_nr < kbdev->nr_hw_address_spaces; as_nr++)
-		KBASE_TLSTREAM_TL_SUMMARY_LIFELINK_AS_GPU(
-				&kbdev->as[as_nr],
-				kbdev);
-
-	/* Create object for each known context. */
-	mutex_lock(&kbdev->kctx_list_lock);
-	list_for_each_entry(element, &kbdev->kctx_list, link) {
-		KBASE_TLSTREAM_TL_SUMMARY_NEW_CTX(
-				element->kctx,
-				element->kctx->id,
-				(u32)(element->kctx->tgid));
-	}
-	/* Before releasing the lock, reset body stream buffers.
-	 * This will prevent context creation message to be directed to both
-	 * summary and body stream.
-	 */
-	kbase_tlstream_reset_body_streams();
-	mutex_unlock(&kbdev->kctx_list_lock);
-	/* Static object are placed into summary packet that needs to be
-	 * transmitted first. Flush all streams to make it available to
-	 * user space.
-	 */
-	kbase_tlstream_flush_streams();
-}
-
-int kbase_tlstream_acquire(struct kbase_context *kctx, u32 flags)
-{
-	int ret;
-	u32 tlstream_enabled = TLSTREAM_ENABLED | flags;
-
-	if (0 == atomic_cmpxchg(&kbase_tlstream_enabled, 0, tlstream_enabled)) {
-		int rcode;
-
-		ret = anon_inode_getfd(
-				"[mali_tlstream]",
-				&kbasep_tlstream_fops,
-				kctx,
-				O_RDONLY | O_CLOEXEC);
-		if (ret < 0) {
-			atomic_set(&kbase_tlstream_enabled, 0);
-			return ret;
-		}
-
-		/* Reset and initialize header streams. */
-		kbasep_timeline_stream_reset(
-				tl_stream[TL_STREAM_TYPE_OBJ_HEADER]);
-		kbasep_timeline_stream_reset(
-				tl_stream[TL_STREAM_TYPE_OBJ_SUMMARY]);
-		kbasep_timeline_stream_reset(
-				tl_stream[TL_STREAM_TYPE_AUX_HEADER]);
-		kbasep_tlstream_timeline_header(
-				TL_STREAM_TYPE_OBJ_HEADER,
-				tp_desc_obj,
-				ARRAY_SIZE(tp_desc_obj));
-		kbasep_tlstream_timeline_header(
-				TL_STREAM_TYPE_AUX_HEADER,
-				tp_desc_aux,
-				ARRAY_SIZE(tp_desc_aux));
-
-		/* Start autoflush timer. */
-		atomic_set(&autoflush_timer_active, 1);
-		rcode = mod_timer(
-				&autoflush_timer,
-				jiffies + msecs_to_jiffies(AUTOFLUSH_INTERVAL));
-		CSTD_UNUSED(rcode);
-
-		/* If job dumping is enabled, readjust the software event's
-		 * timeout as the default value of 3 seconds is often
-		 * insufficient. */
-		if (flags & BASE_TLSTREAM_JOB_DUMPING_ENABLED) {
-			dev_info(kctx->kbdev->dev,
-					"Job dumping is enabled, readjusting the software event's timeout\n");
-			atomic_set(&kctx->kbdev->js_data.soft_job_timeout_ms,
-					1800000);
-		}
-
-		/* Summary stream was cleared during acquire.
-		 * Create static timeline objects that will be
-		 * read by client.
-		 */
-		kbase_create_timeline_objects(kctx);
-
-	} else {
-		ret = -EBUSY;
-	}
-
-	return ret;
-}
-
-void kbase_tlstream_flush_streams(void)
-{
-	enum tl_stream_type stype;
-
-	for (stype = 0; stype < TL_STREAM_TYPE_COUNT; stype++)
-		kbasep_tlstream_flush_stream(stype);
-}
-
-void kbase_tlstream_reset_body_streams(void)
-{
-	kbasep_timeline_stream_reset(
-			tl_stream[TL_STREAM_TYPE_OBJ]);
-	kbasep_timeline_stream_reset(
-			tl_stream[TL_STREAM_TYPE_AUX]);
-}
-
-#if MALI_UNIT_TEST
-void kbase_tlstream_stats(u32 *bytes_collected, u32 *bytes_generated)
-{
-	KBASE_DEBUG_ASSERT(bytes_collected);
-	KBASE_DEBUG_ASSERT(bytes_generated);
-	*bytes_collected = atomic_read(&tlstream_bytes_collected);
-	*bytes_generated = atomic_read(&tlstream_bytes_generated);
-}
-#endif /* MALI_UNIT_TEST */
-
-/*****************************************************************************/
-
-void __kbase_tlstream_tl_summary_new_ctx(void *context, u32 nr, u32 tgid)
-{
-	const u32     msg_id = KBASE_TL_NEW_CTX;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(context) + sizeof(nr) +
-		sizeof(tgid);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ_SUMMARY,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &context, sizeof(context));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &nr, sizeof(nr));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &tgid, sizeof(tgid));
-
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ_SUMMARY, flags);
-}
-
-void __kbase_tlstream_tl_summary_new_gpu(void *gpu, u32 id, u32 core_count)
-{
-	const u32     msg_id = KBASE_TL_NEW_GPU;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(gpu) + sizeof(id) +
-		sizeof(core_count);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ_SUMMARY,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &gpu, sizeof(gpu));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &id, sizeof(id));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &core_count, sizeof(core_count));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ_SUMMARY, flags);
-}
-
-void __kbase_tlstream_tl_summary_new_lpu(void *lpu, u32 nr, u32 fn)
-{
-	const u32     msg_id = KBASE_TL_NEW_LPU;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(lpu) + sizeof(nr) +
-		sizeof(fn);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ_SUMMARY,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &lpu, sizeof(lpu));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &nr, sizeof(nr));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &fn, sizeof(fn));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ_SUMMARY, flags);
-}
-
-void __kbase_tlstream_tl_summary_lifelink_lpu_gpu(void *lpu, void *gpu)
-{
-	const u32     msg_id = KBASE_TL_LIFELINK_LPU_GPU;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(lpu) + sizeof(gpu);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ_SUMMARY,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &lpu, sizeof(lpu));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &gpu, sizeof(gpu));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ_SUMMARY, flags);
-}
-
-void __kbase_tlstream_tl_summary_new_as(void *as, u32 nr)
-{
-	const u32     msg_id = KBASE_TL_NEW_AS;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(as) + sizeof(nr);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ_SUMMARY,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &as, sizeof(as));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &nr, sizeof(nr));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ_SUMMARY, flags);
-}
-
-void __kbase_tlstream_tl_summary_lifelink_as_gpu(void *as, void *gpu)
-{
-	const u32     msg_id = KBASE_TL_LIFELINK_AS_GPU;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(as) + sizeof(gpu);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ_SUMMARY,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &as, sizeof(as));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &gpu, sizeof(gpu));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ_SUMMARY, flags);
-}
-
-/*****************************************************************************/
-
-void __kbase_tlstream_tl_new_ctx(void *context, u32 nr, u32 tgid)
-{
-	const u32     msg_id = KBASE_TL_NEW_CTX;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(context) + sizeof(nr) +
-		sizeof(tgid);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &context, sizeof(context));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &nr, sizeof(nr));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &tgid, sizeof(tgid));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_new_atom(void *atom, u32 nr)
-{
-	const u32     msg_id = KBASE_TL_NEW_ATOM;
-	const size_t  msg_size = sizeof(msg_id) + sizeof(u64) + sizeof(atom) +
-			sizeof(nr);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &atom, sizeof(atom));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &nr, sizeof(nr));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_del_ctx(void *context)
-{
-	const u32     msg_id = KBASE_TL_DEL_CTX;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(context);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &context, sizeof(context));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_del_atom(void *atom)
-{
-	const u32     msg_id = KBASE_TL_DEL_ATOM;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(atom);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &atom, sizeof(atom));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_ret_ctx_lpu(void *context, void *lpu)
-{
-	const u32     msg_id = KBASE_TL_RET_CTX_LPU;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(context) + sizeof(lpu);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &context, sizeof(context));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &lpu, sizeof(lpu));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_ret_atom_ctx(void *atom, void *context)
-{
-	const u32     msg_id = KBASE_TL_RET_ATOM_CTX;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(atom) + sizeof(context);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &atom, sizeof(atom));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &context, sizeof(context));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_ret_atom_lpu(
-		void *atom, void *lpu, const char *attrib_match_list)
-{
-	const u32     msg_id = KBASE_TL_RET_ATOM_LPU;
-	const size_t  msg_s0 = sizeof(u32) + sizeof(char) +
-			strnlen(attrib_match_list, STRLEN_MAX);
-	const size_t  msg_size =
-			sizeof(msg_id) + sizeof(u64) +
-			sizeof(atom) + sizeof(lpu) + msg_s0;
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &atom, sizeof(atom));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &lpu, sizeof(lpu));
-	pos = kbasep_tlstream_write_string(
-			buffer, pos, attrib_match_list, msg_s0);
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_nret_ctx_lpu(void *context, void *lpu)
-{
-	const u32     msg_id = KBASE_TL_NRET_CTX_LPU;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(context) + sizeof(lpu);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &context, sizeof(context));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &lpu, sizeof(lpu));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_nret_atom_ctx(void *atom, void *context)
-{
-	const u32     msg_id = KBASE_TL_NRET_ATOM_CTX;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(atom) + sizeof(context);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &atom, sizeof(atom));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &context, sizeof(context));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_dep_atom_atom(void *atom1, void *atom2)
-{
-	const u32     msg_id = KBASE_TL_DEP_ATOM_ATOM;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(atom1) + sizeof(atom2);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &atom1, sizeof(atom1));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &atom2, sizeof(atom2));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_ndep_atom_atom(void *atom1, void *atom2)
-{
-	const u32     msg_id = KBASE_TL_NDEP_ATOM_ATOM;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(atom1) + sizeof(atom2);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &atom1, sizeof(atom1));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &atom2, sizeof(atom2));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_rdep_atom_atom(void *atom1, void *atom2)
-{
-	const u32     msg_id = KBASE_TL_RDEP_ATOM_ATOM;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(atom1) + sizeof(atom2);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &atom1, sizeof(atom1));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &atom2, sizeof(atom2));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_nret_atom_lpu(void *atom, void *lpu)
-{
-	const u32     msg_id = KBASE_TL_NRET_ATOM_LPU;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(atom) + sizeof(lpu);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &atom, sizeof(atom));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &lpu, sizeof(lpu));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_ret_as_ctx(void *as, void *ctx)
-{
-	const u32     msg_id = KBASE_TL_RET_AS_CTX;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(as) + sizeof(ctx);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &as, sizeof(as));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &ctx, sizeof(ctx));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_nret_as_ctx(void *as, void *ctx)
-{
-	const u32     msg_id = KBASE_TL_NRET_AS_CTX;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(as) + sizeof(ctx);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &as, sizeof(as));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &ctx, sizeof(ctx));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_ret_atom_as(void *atom, void *as)
-{
-	const u32     msg_id = KBASE_TL_RET_ATOM_AS;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(atom) + sizeof(as);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &atom, sizeof(atom));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &as, sizeof(as));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_nret_atom_as(void *atom, void *as)
-{
-	const u32     msg_id = KBASE_TL_NRET_ATOM_AS;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(atom) + sizeof(as);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &atom, sizeof(atom));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &as, sizeof(as));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_attrib_atom_config(
-		void *atom, u64 jd, u64 affinity, u32 config)
-{
-	const u32     msg_id = KBASE_TL_ATTRIB_ATOM_CONFIG;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(atom) +
-		sizeof(jd) + sizeof(affinity) + sizeof(config);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &atom, sizeof(atom));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &jd, sizeof(jd));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &affinity, sizeof(affinity));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &config, sizeof(config));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_attrib_atom_priority(void *atom, u32 prio)
-{
-	const u32     msg_id = KBASE_TL_ATTRIB_ATOM_PRIORITY;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(atom) + sizeof(prio);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &atom, sizeof(atom));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &prio, sizeof(prio));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_attrib_atom_state(void *atom, u32 state)
-{
-	const u32     msg_id = KBASE_TL_ATTRIB_ATOM_STATE;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(atom) + sizeof(state);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &atom, sizeof(atom));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &state, sizeof(state));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_attrib_atom_priority_change(void *atom)
-{
-	const u32     msg_id = KBASE_TL_ATTRIB_ATOM_PRIORITY_CHANGE;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(atom);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &atom, sizeof(atom));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_attrib_atom_jit(
-		void *atom, u64 edit_addr, u64 new_addr)
-{
-	const u32     msg_id = KBASE_TL_ATTRIB_ATOM_JIT;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(atom)
-		+ sizeof(edit_addr) + sizeof(new_addr);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &atom, sizeof(atom));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &edit_addr, sizeof(edit_addr));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &new_addr, sizeof(new_addr));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_attrib_as_config(
-		void *as, u64 transtab, u64 memattr, u64 transcfg)
-{
-	const u32     msg_id = KBASE_TL_ATTRIB_AS_CONFIG;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(as) +
-		sizeof(transtab) + sizeof(memattr) + sizeof(transcfg);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &as, sizeof(as));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &transtab, sizeof(transtab));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &memattr, sizeof(memattr));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &transcfg, sizeof(transcfg));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_event_lpu_softstop(void *lpu)
-{
-	const u32     msg_id = KBASE_TL_EVENT_LPU_SOFTSTOP;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(lpu);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &lpu, sizeof(lpu));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_event_atom_softstop_ex(void *atom)
-{
-	const u32     msg_id = KBASE_TL_EVENT_ATOM_SOFTSTOP_EX;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(atom);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &atom, sizeof(atom));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_tl_event_atom_softstop_issue(void *atom)
-{
-	const u32     msg_id = KBASE_TL_EVENT_ATOM_SOFTSTOP_ISSUE;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(atom);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &atom, sizeof(atom));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-void __kbase_tlstream_jd_gpu_soft_reset(void *gpu)
-{
-	const u32     msg_id = KBASE_JD_GPU_SOFT_RESET;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(gpu);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_OBJ,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &gpu, sizeof(gpu));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_OBJ, flags);
-}
-
-/*****************************************************************************/
-
-void __kbase_tlstream_aux_pm_state(u32 core_type, u64 state)
-{
-	const u32     msg_id = KBASE_AUX_PM_STATE;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(core_type) +
-		sizeof(state);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_AUX,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &core_type, sizeof(core_type));
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &state, sizeof(state));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_AUX, flags);
-}
-
-void __kbase_tlstream_aux_pagefault(u32 ctx_nr, u64 page_count_change)
-{
-	const u32     msg_id = KBASE_AUX_PAGEFAULT;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(ctx_nr) +
-		sizeof(page_count_change);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_AUX, msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &ctx_nr, sizeof(ctx_nr));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos,
-			&page_count_change, sizeof(page_count_change));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_AUX, flags);
-}
-
-void __kbase_tlstream_aux_pagesalloc(u32 ctx_nr, u64 page_count)
-{
-	const u32     msg_id = KBASE_AUX_PAGESALLOC;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(ctx_nr) +
-		sizeof(page_count);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_AUX, msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &ctx_nr, sizeof(ctx_nr));
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &page_count, sizeof(page_count));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_AUX, flags);
-}
-
-void __kbase_tlstream_aux_devfreq_target(u64 target_freq)
-{
-	const u32       msg_id = KBASE_AUX_DEVFREQ_TARGET;
-	const size_t    msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(target_freq);
-	unsigned long   flags;
-	char            *buffer;
-	size_t          pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_AUX, msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &target_freq, sizeof(target_freq));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_AUX, flags);
-}
-
-void __kbase_tlstream_aux_protected_enter_start(void *gpu)
-{
-	const u32     msg_id = KBASE_AUX_PROTECTED_ENTER_START;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(gpu);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_AUX,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &gpu, sizeof(gpu));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_AUX, flags);
-}
-void __kbase_tlstream_aux_protected_enter_end(void *gpu)
-{
-	const u32     msg_id = KBASE_AUX_PROTECTED_ENTER_END;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(gpu);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_AUX,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &gpu, sizeof(gpu));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_AUX, flags);
-}
-
-void __kbase_tlstream_aux_protected_leave_start(void *gpu)
-{
-	const u32     msg_id = KBASE_AUX_PROTECTED_LEAVE_START;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(gpu);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_AUX,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &gpu, sizeof(gpu));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_AUX, flags);
-}
-void __kbase_tlstream_aux_protected_leave_end(void *gpu)
-{
-	const u32     msg_id = KBASE_AUX_PROTECTED_LEAVE_END;
-	const size_t  msg_size =
-		sizeof(msg_id) + sizeof(u64) + sizeof(gpu);
-	unsigned long flags;
-	char          *buffer;
-	size_t        pos = 0;
-
-	buffer = kbasep_tlstream_msgbuf_acquire(
-			TL_STREAM_TYPE_AUX,
-			msg_size, &flags);
-	KBASE_DEBUG_ASSERT(buffer);
-
-	pos = kbasep_tlstream_write_bytes(buffer, pos, &msg_id, sizeof(msg_id));
-	pos = kbasep_tlstream_write_timestamp(buffer, pos);
-	pos = kbasep_tlstream_write_bytes(
-			buffer, pos, &gpu, sizeof(gpu));
-	KBASE_DEBUG_ASSERT(msg_size == pos);
-
-	kbasep_tlstream_msgbuf_release(TL_STREAM_TYPE_AUX, flags);
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_tlstream.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_tlstream.h
deleted file mode 100644
index c0a1117d5f25..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_tlstream.h
+++ /dev/null
@@ -1,623 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2015-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#if !defined(_KBASE_TLSTREAM_H)
-#define _KBASE_TLSTREAM_H
-
-#include <mali_kbase.h>
-
-/*****************************************************************************/
-
-/**
- * kbase_tlstream_init - initialize timeline infrastructure in kernel
- * Return: zero on success, negative number on error
- */
-int kbase_tlstream_init(void);
-
-/**
- * kbase_tlstream_term - terminate timeline infrastructure in kernel
- *
- * Timeline need have to been previously enabled with kbase_tlstream_init().
- */
-void kbase_tlstream_term(void);
-
-/**
- * kbase_tlstream_acquire - acquire timeline stream file descriptor
- * @kctx:  kernel common context
- * @flags: timeline stream flags
- *
- * This descriptor is meant to be used by userspace timeline to gain access to
- * kernel timeline stream. This stream is later broadcasted by user space to the
- * timeline client.
- * Only one entity can own the descriptor at any given time. Descriptor shall be
- * closed if unused. If descriptor cannot be obtained (i.e. when it is already
- * being used) return will be a negative value.
- *
- * Return: file descriptor on success, negative number on error
- */
-int kbase_tlstream_acquire(struct kbase_context *kctx, u32 flags);
-
-/**
- * kbase_tlstream_flush_streams - flush timeline streams.
- *
- * Function will flush pending data in all timeline streams.
- */
-void kbase_tlstream_flush_streams(void);
-
-/**
- * kbase_tlstream_reset_body_streams - reset timeline body streams.
- *
- * Function will discard pending data in all timeline body streams.
- */
-void kbase_tlstream_reset_body_streams(void);
-
-#if MALI_UNIT_TEST
-/**
- * kbase_tlstream_test - start timeline stream data generator
- * @tpw_count: number of trace point writers in each context
- * @msg_delay: time delay in milliseconds between trace points written by one
- *             writer
- * @msg_count: number of trace points written by one writer
- * @aux_msg:   if non-zero aux messages will be included
- *
- * This test starts a requested number of asynchronous writers in both IRQ and
- * thread context. Each writer will generate required number of test
- * tracepoints (tracepoints with embedded information about writer that
- * should be verified by user space reader). Tracepoints will be emitted in
- * all timeline body streams. If aux_msg is non-zero writer will also
- * generate not testable tracepoints (tracepoints without information about
- * writer). These tracepoints are used to check correctness of remaining
- * timeline message generating functions. Writer will wait requested time
- * between generating another set of messages. This call blocks until all
- * writers finish.
- */
-void kbase_tlstream_test(
-		unsigned int tpw_count,
-		unsigned int msg_delay,
-		unsigned int msg_count,
-		int          aux_msg);
-
-/**
- * kbase_tlstream_stats - read timeline stream statistics
- * @bytes_collected: will hold number of bytes read by the user
- * @bytes_generated: will hold number of bytes generated by trace points
- */
-void kbase_tlstream_stats(u32 *bytes_collected, u32 *bytes_generated);
-#endif /* MALI_UNIT_TEST */
-
-/*****************************************************************************/
-
-#define TL_ATOM_STATE_IDLE 0
-#define TL_ATOM_STATE_READY 1
-#define TL_ATOM_STATE_DONE 2
-#define TL_ATOM_STATE_POSTED 3
-
-void __kbase_tlstream_tl_summary_new_ctx(void *context, u32 nr, u32 tgid);
-void __kbase_tlstream_tl_summary_new_gpu(void *gpu, u32 id, u32 core_count);
-void __kbase_tlstream_tl_summary_new_lpu(void *lpu, u32 nr, u32 fn);
-void __kbase_tlstream_tl_summary_lifelink_lpu_gpu(void *lpu, void *gpu);
-void __kbase_tlstream_tl_summary_new_as(void *as, u32 nr);
-void __kbase_tlstream_tl_summary_lifelink_as_gpu(void *as, void *gpu);
-void __kbase_tlstream_tl_new_ctx(void *context, u32 nr, u32 tgid);
-void __kbase_tlstream_tl_new_atom(void *atom, u32 nr);
-void __kbase_tlstream_tl_del_ctx(void *context);
-void __kbase_tlstream_tl_del_atom(void *atom);
-void __kbase_tlstream_tl_ret_ctx_lpu(void *context, void *lpu);
-void __kbase_tlstream_tl_ret_atom_ctx(void *atom, void *context);
-void __kbase_tlstream_tl_ret_atom_lpu(
-		void *atom, void *lpu, const char *attrib_match_list);
-void __kbase_tlstream_tl_nret_ctx_lpu(void *context, void *lpu);
-void __kbase_tlstream_tl_nret_atom_ctx(void *atom, void *context);
-void __kbase_tlstream_tl_nret_atom_lpu(void *atom, void *lpu);
-void __kbase_tlstream_tl_ret_as_ctx(void *as, void *ctx);
-void __kbase_tlstream_tl_nret_as_ctx(void *as, void *ctx);
-void __kbase_tlstream_tl_ret_atom_as(void *atom, void *as);
-void __kbase_tlstream_tl_nret_atom_as(void *atom, void *as);
-void __kbase_tlstream_tl_dep_atom_atom(void *atom1, void *atom2);
-void __kbase_tlstream_tl_ndep_atom_atom(void *atom1, void *atom2);
-void __kbase_tlstream_tl_rdep_atom_atom(void *atom1, void *atom2);
-void __kbase_tlstream_tl_attrib_atom_config(
-		void *atom, u64 jd, u64 affinity, u32 config);
-void __kbase_tlstream_tl_attrib_atom_priority(void *atom, u32 prio);
-void __kbase_tlstream_tl_attrib_atom_state(void *atom, u32 state);
-void __kbase_tlstream_tl_attrib_atom_priority_change(void *atom);
-void __kbase_tlstream_tl_attrib_atom_jit(
-		void *atom, u64 edit_addr, u64 new_addr);
-void __kbase_tlstream_tl_attrib_as_config(
-		void *as, u64 transtab, u64 memattr, u64 transcfg);
-void __kbase_tlstream_tl_event_atom_softstop_ex(void *atom);
-void __kbase_tlstream_tl_event_lpu_softstop(void *lpu);
-void __kbase_tlstream_tl_event_atom_softstop_issue(void *atom);
-void __kbase_tlstream_jd_gpu_soft_reset(void *gpu);
-void __kbase_tlstream_aux_pm_state(u32 core_type, u64 state);
-void __kbase_tlstream_aux_pagefault(u32 ctx_nr, u64 page_count_change);
-void __kbase_tlstream_aux_pagesalloc(u32 ctx_nr, u64 page_count);
-void __kbase_tlstream_aux_devfreq_target(u64 target_freq);
-void __kbase_tlstream_aux_protected_enter_start(void *gpu);
-void __kbase_tlstream_aux_protected_enter_end(void *gpu);
-void __kbase_tlstream_aux_protected_leave_start(void *gpu);
-void __kbase_tlstream_aux_protected_leave_end(void *gpu);
-
-#define TLSTREAM_ENABLED (1 << 31)
-
-extern atomic_t kbase_tlstream_enabled;
-
-#define __TRACE_IF_ENABLED(trace_name, ...)                         \
-	do {                                                        \
-		int enabled = atomic_read(&kbase_tlstream_enabled); \
-		if (enabled & TLSTREAM_ENABLED)                     \
-			__kbase_tlstream_##trace_name(__VA_ARGS__); \
-	} while (0)
-
-#define __TRACE_IF_ENABLED_LATENCY(trace_name, ...)                     \
-	do {                                                            \
-		int enabled = atomic_read(&kbase_tlstream_enabled);     \
-		if (enabled & BASE_TLSTREAM_ENABLE_LATENCY_TRACEPOINTS) \
-			__kbase_tlstream_##trace_name(__VA_ARGS__);     \
-	} while (0)
-
-#define __TRACE_IF_ENABLED_JD(trace_name, ...)                      \
-	do {                                                        \
-		int enabled = atomic_read(&kbase_tlstream_enabled); \
-		if (enabled & BASE_TLSTREAM_JOB_DUMPING_ENABLED)    \
-			__kbase_tlstream_##trace_name(__VA_ARGS__); \
-	} while (0)
-
-/*****************************************************************************/
-
-/**
- * KBASE_TLSTREAM_TL_SUMMARY_NEW_CTX - create context object in timeline
- *                                     summary
- * @context: name of the context object
- * @nr:      context number
- * @tgid:    thread Group Id
- *
- * Function emits a timeline message informing about context creation. Context
- * is created with context number (its attribute), that can be used to link
- * kbase context with userspace context.
- * This message is directed to timeline summary stream.
- */
-#define KBASE_TLSTREAM_TL_SUMMARY_NEW_CTX(context, nr, tgid) \
-	__TRACE_IF_ENABLED(tl_summary_new_ctx, context, nr, tgid)
-
-/**
- * KBASE_TLSTREAM_TL_SUMMARY_NEW_GPU - create GPU object in timeline summary
- * @gpu:        name of the GPU object
- * @id:         id value of this GPU
- * @core_count: number of cores this GPU hosts
- *
- * Function emits a timeline message informing about GPU creation. GPU is
- * created with two attributes: id and core count.
- * This message is directed to timeline summary stream.
- */
-#define KBASE_TLSTREAM_TL_SUMMARY_NEW_GPU(gpu, id, core_count) \
-	__TRACE_IF_ENABLED(tl_summary_new_gpu, gpu, id, core_count)
-
-/**
- * KBASE_TLSTREAM_TL_SUMMARY_NEW_LPU - create LPU object in timeline summary
- * @lpu: name of the Logical Processing Unit object
- * @nr:  sequential number assigned to this LPU
- * @fn:  property describing this LPU's functional abilities
- *
- * Function emits a timeline message informing about LPU creation. LPU is
- * created with two attributes: number linking this LPU with GPU's job slot
- * and function bearing information about this LPU abilities.
- * This message is directed to timeline summary stream.
- */
-#define KBASE_TLSTREAM_TL_SUMMARY_NEW_LPU(lpu, nr, fn) \
-	__TRACE_IF_ENABLED(tl_summary_new_lpu, lpu, nr, fn)
-
-/**
- * KBASE_TLSTREAM_TL_SUMMARY_LIFELINK_LPU_GPU - lifelink LPU object to GPU
- * @lpu: name of the Logical Processing Unit object
- * @gpu: name of the GPU object
- *
- * Function emits a timeline message informing that LPU object shall be deleted
- * along with GPU object.
- * This message is directed to timeline summary stream.
- */
-#define KBASE_TLSTREAM_TL_SUMMARY_LIFELINK_LPU_GPU(lpu, gpu) \
-	__TRACE_IF_ENABLED(tl_summary_lifelink_lpu_gpu, lpu, gpu)
-
-/**
- * KBASE_TLSTREAM_TL_SUMMARY_NEW_AS - create address space object in timeline summary
- * @as: name of the address space object
- * @nr: sequential number assigned to this address space
- *
- * Function emits a timeline message informing about address space creation.
- * Address space is created with one attribute: number identifying this
- * address space.
- * This message is directed to timeline summary stream.
- */
-#define KBASE_TLSTREAM_TL_SUMMARY_NEW_AS(as, nr) \
-	__TRACE_IF_ENABLED(tl_summary_new_as, as, nr)
-
-/**
- * KBASE_TLSTREAM_TL_SUMMARY_LIFELINK_AS_GPU - lifelink address space object to GPU
- * @as:  name of the address space object
- * @gpu: name of the GPU object
- *
- * Function emits a timeline message informing that address space object
- * shall be deleted along with GPU object.
- * This message is directed to timeline summary stream.
- */
-#define KBASE_TLSTREAM_TL_SUMMARY_LIFELINK_AS_GPU(as, gpu) \
-	__TRACE_IF_ENABLED(tl_summary_lifelink_as_gpu, as, gpu)
-
-/**
- * KBASE_TLSTREAM_TL_NEW_CTX - create context object in timeline
- * @context: name of the context object
- * @nr:      context number
- * @tgid:    thread Group Id
- *
- * Function emits a timeline message informing about context creation. Context
- * is created with context number (its attribute), that can be used to link
- * kbase context with userspace context.
- */
-#define KBASE_TLSTREAM_TL_NEW_CTX(context, nr, tgid) \
-	__TRACE_IF_ENABLED(tl_new_ctx, context, nr, tgid)
-
-/**
- * KBASE_TLSTREAM_TL_NEW_ATOM - create atom object in timeline
- * @atom: name of the atom object
- * @nr:   sequential number assigned to this atom
- *
- * Function emits a timeline message informing about atom creation. Atom is
- * created with atom number (its attribute) that links it with actual work
- * bucket id understood by hardware.
- */
-#define KBASE_TLSTREAM_TL_NEW_ATOM(atom, nr) \
-	__TRACE_IF_ENABLED(tl_new_atom, atom, nr)
-
-/**
- * KBASE_TLSTREAM_TL_DEL_CTX - destroy context object in timeline
- * @context: name of the context object
- *
- * Function emits a timeline message informing that context object ceased to
- * exist.
- */
-#define KBASE_TLSTREAM_TL_DEL_CTX(context) \
-	__TRACE_IF_ENABLED(tl_del_ctx, context)
-
-/**
- * KBASE_TLSTREAM_TL_DEL_ATOM - destroy atom object in timeline
- * @atom: name of the atom object
- *
- * Function emits a timeline message informing that atom object ceased to
- * exist.
- */
-#define KBASE_TLSTREAM_TL_DEL_ATOM(atom) \
-	__TRACE_IF_ENABLED(tl_del_atom, atom)
-
-/**
- * KBASE_TLSTREAM_TL_RET_CTX_LPU - retain context by LPU
- * @context: name of the context object
- * @lpu:     name of the Logical Processing Unit object
- *
- * Function emits a timeline message informing that context is being held
- * by LPU and must not be deleted unless it is released.
- */
-#define KBASE_TLSTREAM_TL_RET_CTX_LPU(context, lpu) \
-	__TRACE_IF_ENABLED(tl_ret_ctx_lpu, context, lpu)
-
-/**
- * KBASE_TLSTREAM_TL_RET_ATOM_CTX - retain atom by context
- * @atom:    name of the atom object
- * @context: name of the context object
- *
- * Function emits a timeline message informing that atom object is being held
- * by context and must not be deleted unless it is released.
- */
-#define KBASE_TLSTREAM_TL_RET_ATOM_CTX(atom, context) \
-	__TRACE_IF_ENABLED(tl_ret_atom_ctx, atom, context)
-
-/**
- * KBASE_TLSTREAM_TL_RET_ATOM_LPU - retain atom by LPU
- * @atom:              name of the atom object
- * @lpu:               name of the Logical Processing Unit object
- * @attrib_match_list: list containing match operator attributes
- *
- * Function emits a timeline message informing that atom object is being held
- * by LPU and must not be deleted unless it is released.
- */
-#define KBASE_TLSTREAM_TL_RET_ATOM_LPU(atom, lpu, attrib_match_list) \
-	__TRACE_IF_ENABLED(tl_ret_atom_lpu, atom, lpu, attrib_match_list)
-
-/**
- * KBASE_TLSTREAM_TL_NRET_CTX_LPU - release context by LPU
- * @context: name of the context object
- * @lpu:     name of the Logical Processing Unit object
- *
- * Function emits a timeline message informing that context is being released
- * by LPU object.
- */
-#define KBASE_TLSTREAM_TL_NRET_CTX_LPU(context, lpu) \
-	__TRACE_IF_ENABLED(tl_nret_ctx_lpu, context, lpu)
-
-/**
- * KBASE_TLSTREAM_TL_NRET_ATOM_CTX - release atom by context
- * @atom:    name of the atom object
- * @context: name of the context object
- *
- * Function emits a timeline message informing that atom object is being
- * released by context.
- */
-#define KBASE_TLSTREAM_TL_NRET_ATOM_CTX(atom, context) \
-	__TRACE_IF_ENABLED(tl_nret_atom_ctx, atom, context)
-
-/**
- * KBASE_TLSTREAM_TL_NRET_ATOM_LPU - release atom by LPU
- * @atom: name of the atom object
- * @lpu:  name of the Logical Processing Unit object
- *
- * Function emits a timeline message informing that atom object is being
- * released by LPU.
- */
-#define KBASE_TLSTREAM_TL_NRET_ATOM_LPU(atom, lpu) \
-	__TRACE_IF_ENABLED(tl_nret_atom_lpu, atom, lpu)
-
-/**
- * KBASE_TLSTREAM_TL_RET_AS_CTX - lifelink address space object to context
- * @as:  name of the address space object
- * @ctx: name of the context object
- *
- * Function emits a timeline message informing that address space object
- * is being held by the context object.
- */
-#define KBASE_TLSTREAM_TL_RET_AS_CTX(as, ctx) \
-	__TRACE_IF_ENABLED(tl_ret_as_ctx, as, ctx)
-
-/**
- * KBASE_TLSTREAM_TL_NRET_AS_CTX - release address space by context
- * @as:  name of the address space object
- * @ctx: name of the context object
- *
- * Function emits a timeline message informing that address space object
- * is being released by atom.
- */
-#define KBASE_TLSTREAM_TL_NRET_AS_CTX(as, ctx) \
-	__TRACE_IF_ENABLED(tl_nret_as_ctx, as, ctx)
-
-/**
- * KBASE_TLSTREAM_TL_RET_ATOM_AS - retain atom by address space
- * @atom: name of the atom object
- * @as:   name of the address space object
- *
- * Function emits a timeline message informing that atom object is being held
- * by address space and must not be deleted unless it is released.
- */
-#define KBASE_TLSTREAM_TL_RET_ATOM_AS(atom, as) \
-	__TRACE_IF_ENABLED(tl_ret_atom_as, atom, as)
-
-/**
- * KBASE_TLSTREAM_TL_NRET_ATOM_AS - release atom by address space
- * @atom: name of the atom object
- * @as:   name of the address space object
- *
- * Function emits a timeline message informing that atom object is being
- * released by address space.
- */
-#define KBASE_TLSTREAM_TL_NRET_ATOM_AS(atom, as) \
-	__TRACE_IF_ENABLED(tl_nret_atom_as, atom, as)
-
-/**
- * KBASE_TLSTREAM_TL_DEP_ATOM_ATOM - parent atom depends on child atom
- * @atom1: name of the child atom object
- * @atom2: name of the parent atom object that depends on child atom
- *
- * Function emits a timeline message informing that parent atom waits for
- * child atom object to be completed before start its execution.
- */
-#define KBASE_TLSTREAM_TL_DEP_ATOM_ATOM(atom1, atom2) \
-	__TRACE_IF_ENABLED(tl_dep_atom_atom, atom1, atom2)
-
-/**
- * KBASE_TLSTREAM_TL_NDEP_ATOM_ATOM - dependency between atoms resolved
- * @atom1: name of the child atom object
- * @atom2: name of the parent atom object that depended on child atom
- *
- * Function emits a timeline message informing that parent atom execution
- * dependency on child atom has been resolved.
- */
-#define KBASE_TLSTREAM_TL_NDEP_ATOM_ATOM(atom1, atom2) \
-	__TRACE_IF_ENABLED(tl_ndep_atom_atom, atom1, atom2)
-
-/**
- * KBASE_TLSTREAM_TL_RDEP_ATOM_ATOM - information about already resolved dependency between atoms
- * @atom1: name of the child atom object
- * @atom2: name of the parent atom object that depended on child atom
- *
- * Function emits a timeline message informing that parent atom execution
- * dependency on child atom has been resolved.
- */
-#define KBASE_TLSTREAM_TL_RDEP_ATOM_ATOM(atom1, atom2) \
-	__TRACE_IF_ENABLED(tl_rdep_atom_atom, atom1, atom2)
-
-/**
- * KBASE_TLSTREAM_TL_ATTRIB_ATOM_CONFIG - atom job slot attributes
- * @atom:     name of the atom object
- * @jd:       job descriptor address
- * @affinity: job affinity
- * @config:   job config
- *
- * Function emits a timeline message containing atom attributes.
- */
-#define KBASE_TLSTREAM_TL_ATTRIB_ATOM_CONFIG(atom, jd, affinity, config) \
-	__TRACE_IF_ENABLED(tl_attrib_atom_config, atom, jd, affinity, config)
-
-/**
- * KBASE_TLSTREAM_TL_ATTRIB_ATOM_PRIORITY - atom priority
- * @atom: name of the atom object
- * @prio: atom priority
- *
- * Function emits a timeline message containing atom priority.
- */
-#define KBASE_TLSTREAM_TL_ATTRIB_ATOM_PRIORITY(atom, prio) \
-	__TRACE_IF_ENABLED_LATENCY(tl_attrib_atom_priority, atom, prio)
-
-/**
- * KBASE_TLSTREAM_TL_ATTRIB_ATOM_STATE - atom state
- * @atom:  name of the atom object
- * @state: atom state
- *
- * Function emits a timeline message containing atom state.
- */
-#define KBASE_TLSTREAM_TL_ATTRIB_ATOM_STATE(atom, state) \
-	__TRACE_IF_ENABLED_LATENCY(tl_attrib_atom_state, atom, state)
-
-/**
- * KBASE_TLSTREAM_TL_ATTRIB_ATOM_PRIORITY_CHANGE - atom caused priority change
- * @atom:  name of the atom object
- *
- * Function emits a timeline message signalling priority change
- */
-#define KBASE_TLSTREAM_TL_ATTRIB_ATOM_PRIORITY_CHANGE(atom) \
-	__TRACE_IF_ENABLED_LATENCY(tl_attrib_atom_priority_change, atom)
-
-/**
- * KBASE_TLSTREAM_TL_ATTRIB_ATOM_JIT - jit happened on atom
- * @atom:       atom identifier
- * @edit_addr:  address edited by jit
- * @new_addr:   address placed into the edited location
- */
-#define KBASE_TLSTREAM_TL_ATTRIB_ATOM_JIT(atom, edit_addr, new_addr) \
-	__TRACE_IF_ENABLED_JD(tl_attrib_atom_jit, atom, edit_addr, new_addr)
-
-/**
- * KBASE_TLSTREAM_TL_ATTRIB_AS_CONFIG - address space attributes
- * @as:       assigned address space
- * @transtab: configuration of the TRANSTAB register
- * @memattr:  configuration of the MEMATTR register
- * @transcfg: configuration of the TRANSCFG register (or zero if not present)
- *
- * Function emits a timeline message containing address space attributes.
- */
-#define KBASE_TLSTREAM_TL_ATTRIB_AS_CONFIG(as, transtab, memattr, transcfg) \
-	__TRACE_IF_ENABLED(tl_attrib_as_config, as, transtab, memattr, transcfg)
-
-/**
- * KBASE_TLSTREAM_TL_EVENT_ATOM_SOFTSTOP_ex
- * @atom:       atom identifier
- */
-#define KBASE_TLSTREAM_TL_EVENT_ATOM_SOFTSTOP_EX(atom) \
-	__TRACE_IF_ENABLED(tl_event_atom_softstop_ex, atom)
-
-/**
- * KBASE_TLSTREAM_TL_EVENT_LPU_softstop
- * @lpu:        name of the LPU object
- */
-#define KBASE_TLSTREAM_TL_EVENT_LPU_SOFTSTOP(lpu) \
-	__TRACE_IF_ENABLED(tl_event_lpu_softstop, lpu)
-
-/**
- * KBASE_TLSTREAM_TL_EVENT_ATOM_SOFTSTOP_issue
- * @atom:       atom identifier
- */
-#define KBASE_TLSTREAM_TL_EVENT_ATOM_SOFTSTOP_ISSUE(atom) \
-	__TRACE_IF_ENABLED(tl_event_atom_softstop_issue, atom)
-
-/**
- * KBASE_TLSTREAM_JD_GPU_SOFT_RESET - The GPU is being soft reset
- * @gpu:        name of the GPU object
- *
- * This imperative tracepoint is specific to job dumping.
- * Function emits a timeline message indicating GPU soft reset.
- */
-#define KBASE_TLSTREAM_JD_GPU_SOFT_RESET(gpu) \
-	__TRACE_IF_ENABLED(jd_gpu_soft_reset, gpu)
-
-
-/**
- * KBASE_TLSTREAM_AUX_PM_STATE - timeline message: power management state
- * @core_type: core type (shader, tiler, l2 cache, l3 cache)
- * @state:     64bits bitmask reporting power state of the cores (1-ON, 0-OFF)
- */
-#define KBASE_TLSTREAM_AUX_PM_STATE(core_type, state) \
-	__TRACE_IF_ENABLED(aux_pm_state, core_type, state)
-
-/**
- * KBASE_TLSTREAM_AUX_PAGEFAULT - timeline message: MMU page fault event
- *                                resulting in new pages being mapped
- * @ctx_nr:            kernel context number
- * @page_count_change: number of pages to be added
- */
-#define KBASE_TLSTREAM_AUX_PAGEFAULT(ctx_nr, page_count_change) \
-	__TRACE_IF_ENABLED(aux_pagefault, ctx_nr, page_count_change)
-
-/**
- * KBASE_TLSTREAM_AUX_PAGESALLOC - timeline message: total number of allocated
- *                                 pages is changed
- * @ctx_nr:     kernel context number
- * @page_count: number of pages used by the context
- */
-#define KBASE_TLSTREAM_AUX_PAGESALLOC(ctx_nr, page_count) \
-	__TRACE_IF_ENABLED(aux_pagesalloc, ctx_nr, page_count)
-
-/**
- * KBASE_TLSTREAM_AUX_DEVFREQ_TARGET - timeline message: new target DVFS
- *                                     frequency
- * @target_freq: new target frequency
- */
-#define KBASE_TLSTREAM_AUX_DEVFREQ_TARGET(target_freq) \
-	__TRACE_IF_ENABLED(aux_devfreq_target, target_freq)
-
-/**
- * KBASE_TLSTREAM_AUX_PROTECTED_ENTER_START - The GPU has started transitioning
- *                                            to protected mode
- * @gpu: name of the GPU object
- *
- * Function emits a timeline message indicating the GPU is starting to
- * transition to protected mode.
- */
-#define KBASE_TLSTREAM_AUX_PROTECTED_ENTER_START(gpu) \
-	__TRACE_IF_ENABLED_LATENCY(aux_protected_enter_start, gpu)
-
-/**
- * KBASE_TLSTREAM_AUX_PROTECTED_ENTER_END - The GPU has finished transitioning
- *                                          to protected mode
- * @gpu: name of the GPU object
- *
- * Function emits a timeline message indicating the GPU has finished
- * transitioning to protected mode.
- */
-#define KBASE_TLSTREAM_AUX_PROTECTED_ENTER_END(gpu) \
-	__TRACE_IF_ENABLED_LATENCY(aux_protected_enter_end, gpu)
-
-/**
- * KBASE_TLSTREAM_AUX_PROTECTED_LEAVE_START - The GPU has started transitioning
- *                                            to non-protected mode
- * @gpu: name of the GPU object
- *
- * Function emits a timeline message indicating the GPU is starting to
- * transition to non-protected mode.
- */
-#define KBASE_TLSTREAM_AUX_PROTECTED_LEAVE_START(gpu) \
-	__TRACE_IF_ENABLED_LATENCY(aux_protected_leave_start, gpu)
-
-/**
- * KBASE_TLSTREAM_AUX_PROTECTED_LEAVE_END - The GPU has finished transitioning
- *                                          to non-protected mode
- * @gpu: name of the GPU object
- *
- * Function emits a timeline message indicating the GPU has finished
- * transitioning to non-protected mode.
- */
-#define KBASE_TLSTREAM_AUX_PROTECTED_LEAVE_END(gpu) \
-	__TRACE_IF_ENABLED_LATENCY(aux_protected_leave_end, gpu)
-
-#endif /* _KBASE_TLSTREAM_H */
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_defs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_defs.h
deleted file mode 100644
index e2e0544208ce..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_defs.h
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2014 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/* ***** IMPORTANT: THIS IS NOT A NORMAL HEADER FILE         *****
- * *****            DO NOT INCLUDE DIRECTLY                  *****
- * *****            THE LACK OF HEADER GUARDS IS INTENTIONAL ***** */
-
-/*
- * The purpose of this header file is just to contain a list of trace code idenitifers
- *
- * Each identifier is wrapped in a macro, so that its string form and enum form can be created
- *
- * Each macro is separated with a comma, to allow insertion into an array initializer or enum definition block.
- *
- * This allows automatic creation of an enum and a corresponding array of strings
- *
- * Before #including, the includer MUST #define KBASE_TRACE_CODE_MAKE_CODE.
- * After #including, the includer MUST #under KBASE_TRACE_CODE_MAKE_CODE.
- *
- * e.g.:
- * #define KBASE_TRACE_CODE( X ) KBASE_TRACE_CODE_ ## X
- * typedef enum
- * {
- * #define KBASE_TRACE_CODE_MAKE_CODE( X ) KBASE_TRACE_CODE( X )
- * #include "mali_kbase_trace_defs.h"
- * #undef  KBASE_TRACE_CODE_MAKE_CODE
- * } kbase_trace_code;
- *
- * IMPORTANT: THIS FILE MUST NOT BE USED FOR ANY OTHER PURPOSE OTHER THAN THE ABOVE
- *
- *
- * The use of the macro here is:
- * - KBASE_TRACE_CODE_MAKE_CODE( X )
- *
- * Which produces:
- * - For an enum, KBASE_TRACE_CODE_X
- * - For a string, "X"
- *
- *
- * For example:
- * - KBASE_TRACE_CODE_MAKE_CODE( JM_JOB_COMPLETE ) expands to:
- *  - KBASE_TRACE_CODE_JM_JOB_COMPLETE for the enum
- *  - "JM_JOB_COMPLETE" for the string
- * - To use it to trace an event, do:
- *  - KBASE_TRACE_ADD( kbdev, JM_JOB_COMPLETE, subcode, kctx, uatom, val );
- */
-
-#if 0 /* Dummy section to avoid breaking formatting */
-int dummy_array[] = {
-#endif
-
-/*
- * Core events
- */
-	/* no info_val, no gpu_addr, no atom */
-	KBASE_TRACE_CODE_MAKE_CODE(CORE_CTX_DESTROY),
-	/* no info_val, no gpu_addr, no atom */
-	KBASE_TRACE_CODE_MAKE_CODE(CORE_CTX_HWINSTR_TERM),
-	/* info_val == GPU_IRQ_STATUS register */
-	KBASE_TRACE_CODE_MAKE_CODE(CORE_GPU_IRQ),
-	/* info_val == bits cleared */
-	KBASE_TRACE_CODE_MAKE_CODE(CORE_GPU_IRQ_CLEAR),
-	/* info_val == GPU_IRQ_STATUS register */
-	KBASE_TRACE_CODE_MAKE_CODE(CORE_GPU_IRQ_DONE),
-	KBASE_TRACE_CODE_MAKE_CODE(CORE_GPU_SOFT_RESET),
-	KBASE_TRACE_CODE_MAKE_CODE(CORE_GPU_HARD_RESET),
-	KBASE_TRACE_CODE_MAKE_CODE(CORE_GPU_PRFCNT_CLEAR),
-	/* GPU addr==dump address */
-	KBASE_TRACE_CODE_MAKE_CODE(CORE_GPU_PRFCNT_SAMPLE),
-	KBASE_TRACE_CODE_MAKE_CODE(CORE_GPU_CLEAN_INV_CACHES),
-/*
- * Job Slot management events
- */
-	/* info_val==irq rawstat at start */
-	KBASE_TRACE_CODE_MAKE_CODE(JM_IRQ),
-	/* info_val==jobs processed */
-	KBASE_TRACE_CODE_MAKE_CODE(JM_IRQ_END),
-/* In the following:
- *
- * - ctx is set if a corresponding job found (NULL otherwise, e.g. some soft-stop cases)
- * - uatom==kernel-side mapped uatom address (for correlation with user-side)
- */
-	/* info_val==exit code; gpu_addr==chain gpuaddr */
-	KBASE_TRACE_CODE_MAKE_CODE(JM_JOB_DONE),
-	/* gpu_addr==JS_HEAD_NEXT written, info_val==lower 32 bits of affinity */
-	KBASE_TRACE_CODE_MAKE_CODE(JM_SUBMIT),
-	/* gpu_addr is as follows:
-	 * - If JS_STATUS active after soft-stop, val==gpu addr written to
-	 *   JS_HEAD on submit
-	 * - otherwise gpu_addr==0 */
-	KBASE_TRACE_CODE_MAKE_CODE(JM_SOFTSTOP),
-	KBASE_TRACE_CODE_MAKE_CODE(JM_SOFTSTOP_0),
-	KBASE_TRACE_CODE_MAKE_CODE(JM_SOFTSTOP_1),
-	/* gpu_addr==JS_HEAD read */
-	KBASE_TRACE_CODE_MAKE_CODE(JM_HARDSTOP),
-	/* gpu_addr==JS_HEAD read */
-	KBASE_TRACE_CODE_MAKE_CODE(JM_HARDSTOP_0),
-	/* gpu_addr==JS_HEAD read */
-	KBASE_TRACE_CODE_MAKE_CODE(JM_HARDSTOP_1),
-	/* gpu_addr==JS_TAIL read */
-	KBASE_TRACE_CODE_MAKE_CODE(JM_UPDATE_HEAD),
-/* gpu_addr is as follows:
- * - If JS_STATUS active before soft-stop, val==JS_HEAD
- * - otherwise gpu_addr==0
- */
-	/* gpu_addr==JS_HEAD read */
-	KBASE_TRACE_CODE_MAKE_CODE(JM_CHECK_HEAD),
-	KBASE_TRACE_CODE_MAKE_CODE(JM_FLUSH_WORKQS),
-	KBASE_TRACE_CODE_MAKE_CODE(JM_FLUSH_WORKQS_DONE),
-	/* info_val == is_scheduled */
-	KBASE_TRACE_CODE_MAKE_CODE(JM_ZAP_NON_SCHEDULED),
-	/* info_val == is_scheduled */
-	KBASE_TRACE_CODE_MAKE_CODE(JM_ZAP_SCHEDULED),
-	KBASE_TRACE_CODE_MAKE_CODE(JM_ZAP_DONE),
-	/* info_val == nr jobs submitted */
-	KBASE_TRACE_CODE_MAKE_CODE(JM_SLOT_SOFT_OR_HARD_STOP),
-	/* gpu_addr==JS_HEAD_NEXT last written */
-	KBASE_TRACE_CODE_MAKE_CODE(JM_SLOT_EVICT),
-	KBASE_TRACE_CODE_MAKE_CODE(JM_SUBMIT_AFTER_RESET),
-	KBASE_TRACE_CODE_MAKE_CODE(JM_BEGIN_RESET_WORKER),
-	KBASE_TRACE_CODE_MAKE_CODE(JM_END_RESET_WORKER),
-/*
- * Job dispatch events
- */
-	/* gpu_addr==value to write into JS_HEAD */
-	KBASE_TRACE_CODE_MAKE_CODE(JD_DONE),
-	/* gpu_addr==value to write into JS_HEAD */
-	KBASE_TRACE_CODE_MAKE_CODE(JD_DONE_WORKER),
-	/* gpu_addr==value to write into JS_HEAD */
-	KBASE_TRACE_CODE_MAKE_CODE(JD_DONE_WORKER_END),
-	/* gpu_addr==value to write into JS_HEAD */
-	KBASE_TRACE_CODE_MAKE_CODE(JD_DONE_TRY_RUN_NEXT_JOB),
-	/* gpu_addr==0, info_val==0, uatom==0 */
-	KBASE_TRACE_CODE_MAKE_CODE(JD_ZAP_CONTEXT),
-	/* gpu_addr==value to write into JS_HEAD */
-	KBASE_TRACE_CODE_MAKE_CODE(JD_CANCEL),
-	/* gpu_addr==value to write into JS_HEAD */
-	KBASE_TRACE_CODE_MAKE_CODE(JD_CANCEL_WORKER),
-/*
- * Scheduler Core events
- */
-	KBASE_TRACE_CODE_MAKE_CODE(JS_RETAIN_CTX_NOLOCK),
-	/* gpu_addr==value to write into JS_HEAD */
-	KBASE_TRACE_CODE_MAKE_CODE(JS_ADD_JOB),
-	/* gpu_addr==last value written/would be written to JS_HEAD */
-	KBASE_TRACE_CODE_MAKE_CODE(JS_REMOVE_JOB),
-	KBASE_TRACE_CODE_MAKE_CODE(JS_RETAIN_CTX),
-	KBASE_TRACE_CODE_MAKE_CODE(JS_RELEASE_CTX),
-	KBASE_TRACE_CODE_MAKE_CODE(JS_TRY_SCHEDULE_HEAD_CTX),
-	/* gpu_addr==value to write into JS_HEAD */
-	KBASE_TRACE_CODE_MAKE_CODE(JS_JOB_DONE_TRY_RUN_NEXT_JOB),
-	/* gpu_addr==value to write into JS_HEAD */
-	KBASE_TRACE_CODE_MAKE_CODE(JS_JOB_DONE_RETRY_NEEDED),
-	/* kctx is the one being evicted, info_val == kctx to put in  */
-	KBASE_TRACE_CODE_MAKE_CODE(JS_FAST_START_EVICTS_CTX),
-	KBASE_TRACE_CODE_MAKE_CODE(JS_AFFINITY_SUBMIT_TO_BLOCKED),
-	/* info_val == lower 32 bits of affinity */
-	KBASE_TRACE_CODE_MAKE_CODE(JS_AFFINITY_CURRENT),
-	/* info_val == lower 32 bits of affinity */
-	KBASE_TRACE_CODE_MAKE_CODE(JS_CORE_REF_REQUEST_CORES_FAILED),
-	/* info_val == lower 32 bits of affinity */
-	KBASE_TRACE_CODE_MAKE_CODE(JS_CORE_REF_REGISTER_INUSE_FAILED),
-	/* info_val == lower 32 bits of rechecked affinity */
-	KBASE_TRACE_CODE_MAKE_CODE(JS_CORE_REF_REQUEST_ON_RECHECK_FAILED),
-	/* info_val == lower 32 bits of rechecked affinity */
-	KBASE_TRACE_CODE_MAKE_CODE(JS_CORE_REF_REGISTER_ON_RECHECK_FAILED),
-	/* info_val == lower 32 bits of affinity */
-	KBASE_TRACE_CODE_MAKE_CODE(JS_CORE_REF_AFFINITY_WOULD_VIOLATE),
-	/* info_val == the ctx attribute now on ctx */
-	KBASE_TRACE_CODE_MAKE_CODE(JS_CTX_ATTR_NOW_ON_CTX),
-	/* info_val == the ctx attribute now on runpool */
-	KBASE_TRACE_CODE_MAKE_CODE(JS_CTX_ATTR_NOW_ON_RUNPOOL),
-	/* info_val == the ctx attribute now off ctx */
-	KBASE_TRACE_CODE_MAKE_CODE(JS_CTX_ATTR_NOW_OFF_CTX),
-	/* info_val == the ctx attribute now off runpool */
-	KBASE_TRACE_CODE_MAKE_CODE(JS_CTX_ATTR_NOW_OFF_RUNPOOL),
-/*
- * Scheduler Policy events
- */
-	KBASE_TRACE_CODE_MAKE_CODE(JS_POLICY_INIT_CTX),
-	KBASE_TRACE_CODE_MAKE_CODE(JS_POLICY_TERM_CTX),
-	/* info_val == whether it was evicted */
-	KBASE_TRACE_CODE_MAKE_CODE(JS_POLICY_TRY_EVICT_CTX),
-	KBASE_TRACE_CODE_MAKE_CODE(JS_POLICY_FOREACH_CTX_JOBS),
-	KBASE_TRACE_CODE_MAKE_CODE(JS_POLICY_ENQUEUE_CTX),
-	KBASE_TRACE_CODE_MAKE_CODE(JS_POLICY_DEQUEUE_HEAD_CTX),
-	KBASE_TRACE_CODE_MAKE_CODE(JS_POLICY_RUNPOOL_ADD_CTX),
-	KBASE_TRACE_CODE_MAKE_CODE(JS_POLICY_RUNPOOL_REMOVE_CTX),
-	KBASE_TRACE_CODE_MAKE_CODE(JS_POLICY_DEQUEUE_JOB),
-	KBASE_TRACE_CODE_MAKE_CODE(JS_POLICY_DEQUEUE_JOB_IRQ),
-	/* gpu_addr==JS_HEAD to write if the job were run */
-	KBASE_TRACE_CODE_MAKE_CODE(JS_POLICY_ENQUEUE_JOB),
-	KBASE_TRACE_CODE_MAKE_CODE(JS_POLICY_TIMER_START),
-	KBASE_TRACE_CODE_MAKE_CODE(JS_POLICY_TIMER_END),
-/*
- * Power Management Events
- */
-	KBASE_TRACE_CODE_MAKE_CODE(PM_JOB_SUBMIT_AFTER_POWERING_UP),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_JOB_SUBMIT_AFTER_POWERED_UP),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_PWRON),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_PWRON_TILER),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_PWRON_L2),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_PWROFF),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_PWROFF_TILER),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_PWROFF_L2),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_CORES_POWERED),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_CORES_POWERED_TILER),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_CORES_POWERED_L2),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_CORES_CHANGE_DESIRED),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_CORES_CHANGE_DESIRED_TILER),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_CORES_CHANGE_AVAILABLE),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_CORES_CHANGE_AVAILABLE_TILER),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_CORES_AVAILABLE),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_CORES_AVAILABLE_TILER),
-	/* PM_DESIRED_REACHED: gpu_addr == pm.gpu_in_desired_state */
-	KBASE_TRACE_CODE_MAKE_CODE(PM_DESIRED_REACHED),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_DESIRED_REACHED_TILER),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_REGISTER_CHANGE_SHADER_INUSE),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_REGISTER_CHANGE_TILER_INUSE),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_REGISTER_CHANGE_SHADER_NEEDED),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_REGISTER_CHANGE_TILER_NEEDED),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_RELEASE_CHANGE_SHADER_INUSE),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_RELEASE_CHANGE_TILER_INUSE),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_UNREQUEST_CHANGE_SHADER_NEEDED),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_UNREQUEST_CHANGE_TILER_NEEDED),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_REQUEST_CHANGE_SHADER_NEEDED),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_REQUEST_CHANGE_TILER_NEEDED),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_WAKE_WAITERS),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_CONTEXT_ACTIVE),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_CONTEXT_IDLE),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_GPU_ON),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_GPU_OFF),
-	/* info_val == policy number, or -1 for "Already changing" */
-	KBASE_TRACE_CODE_MAKE_CODE(PM_SET_POLICY),
-	KBASE_TRACE_CODE_MAKE_CODE(PM_CA_SET_POLICY),
-	/* info_val == policy number */
-	KBASE_TRACE_CODE_MAKE_CODE(PM_CURRENT_POLICY_INIT),
-	/* info_val == policy number */
-	KBASE_TRACE_CODE_MAKE_CODE(PM_CURRENT_POLICY_TERM),
-/* Unused code just to make it easier to not have a comma at the end.
- * All other codes MUST come before this */
-	KBASE_TRACE_CODE_MAKE_CODE(DUMMY)
-
-#if 0 /* Dummy section to avoid breaking formatting */
-};
-#endif
-
-/* ***** THE LACK OF HEADER GUARDS IS INTENTIONAL ***** */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_timeline.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_timeline.c
deleted file mode 100644
index d9854749f45b..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_timeline.c
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#include <mali_kbase.h>
-#include <mali_kbase_jm.h>
-#include <mali_kbase_hwaccess_jm.h>
-
-#define CREATE_TRACE_POINTS
-
-#ifdef CONFIG_MALI_BIFROST_TRACE_TIMELINE
-#include "mali_timeline.h"
-
-#include <linux/debugfs.h>
-#include <linux/seq_file.h>
-
-EXPORT_TRACEPOINT_SYMBOL_GPL(mali_timeline_atoms_in_flight);
-EXPORT_TRACEPOINT_SYMBOL_GPL(mali_timeline_atom);
-EXPORT_TRACEPOINT_SYMBOL_GPL(mali_timeline_gpu_slot_active);
-EXPORT_TRACEPOINT_SYMBOL_GPL(mali_timeline_gpu_slot_action);
-EXPORT_TRACEPOINT_SYMBOL_GPL(mali_timeline_gpu_power_active);
-EXPORT_TRACEPOINT_SYMBOL_GPL(mali_timeline_l2_power_active);
-EXPORT_TRACEPOINT_SYMBOL_GPL(mali_timeline_pm_event);
-EXPORT_TRACEPOINT_SYMBOL_GPL(mali_timeline_slot_atom);
-EXPORT_TRACEPOINT_SYMBOL_GPL(mali_timeline_pm_checktrans);
-EXPORT_TRACEPOINT_SYMBOL_GPL(mali_timeline_context_active);
-
-struct kbase_trace_timeline_desc {
-	char *enum_str;
-	char *desc;
-	char *format;
-	char *format_desc;
-};
-
-static struct kbase_trace_timeline_desc kbase_trace_timeline_desc_table[] = {
-	#define KBASE_TIMELINE_TRACE_CODE(enum_val, desc, format, format_desc) { #enum_val, desc, format, format_desc }
-	#include "mali_kbase_trace_timeline_defs.h"
-	#undef KBASE_TIMELINE_TRACE_CODE
-};
-
-#define KBASE_NR_TRACE_CODES ARRAY_SIZE(kbase_trace_timeline_desc_table)
-
-static void *kbasep_trace_timeline_seq_start(struct seq_file *s, loff_t *pos)
-{
-	if (*pos >= KBASE_NR_TRACE_CODES)
-		return NULL;
-
-	return &kbase_trace_timeline_desc_table[*pos];
-}
-
-static void kbasep_trace_timeline_seq_stop(struct seq_file *s, void *data)
-{
-}
-
-static void *kbasep_trace_timeline_seq_next(struct seq_file *s, void *data, loff_t *pos)
-{
-	(*pos)++;
-
-	if (*pos == KBASE_NR_TRACE_CODES)
-		return NULL;
-
-	return &kbase_trace_timeline_desc_table[*pos];
-}
-
-static int kbasep_trace_timeline_seq_show(struct seq_file *s, void *data)
-{
-	struct kbase_trace_timeline_desc *trace_desc = data;
-
-	seq_printf(s, "%s#%s#%s#%s\n", trace_desc->enum_str, trace_desc->desc, trace_desc->format, trace_desc->format_desc);
-	return 0;
-}
-
-
-static const struct seq_operations kbasep_trace_timeline_seq_ops = {
-	.start = kbasep_trace_timeline_seq_start,
-	.next = kbasep_trace_timeline_seq_next,
-	.stop = kbasep_trace_timeline_seq_stop,
-	.show = kbasep_trace_timeline_seq_show,
-};
-
-static int kbasep_trace_timeline_debugfs_open(struct inode *inode, struct file *file)
-{
-	return seq_open(file, &kbasep_trace_timeline_seq_ops);
-}
-
-static const struct file_operations kbasep_trace_timeline_debugfs_fops = {
-	.open = kbasep_trace_timeline_debugfs_open,
-	.read = seq_read,
-	.llseek = seq_lseek,
-	.release = seq_release,
-};
-
-#ifdef CONFIG_DEBUG_FS
-
-void kbasep_trace_timeline_debugfs_init(struct kbase_device *kbdev)
-{
-	debugfs_create_file("mali_timeline_defs",
-			S_IRUGO, kbdev->mali_debugfs_directory, NULL,
-			&kbasep_trace_timeline_debugfs_fops);
-}
-
-#endif /* CONFIG_DEBUG_FS */
-
-void kbase_timeline_job_slot_submit(struct kbase_device *kbdev, struct kbase_context *kctx,
-		struct kbase_jd_atom *katom, int js)
-{
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	if (kbdev->timeline.slot_atoms_submitted[js] > 0) {
-		KBASE_TIMELINE_JOB_START_NEXT(kctx, js, 1);
-	} else {
-		base_atom_id atom_number = kbase_jd_atom_id(kctx, katom);
-
-		KBASE_TIMELINE_JOB_START_HEAD(kctx, js, 1);
-		KBASE_TIMELINE_JOB_START(kctx, js, atom_number);
-	}
-	++kbdev->timeline.slot_atoms_submitted[js];
-
-	KBASE_TIMELINE_ATOMS_SUBMITTED(kctx, js, kbdev->timeline.slot_atoms_submitted[js]);
-}
-
-void kbase_timeline_job_slot_done(struct kbase_device *kbdev, struct kbase_context *kctx,
-		struct kbase_jd_atom *katom, int js,
-		kbasep_js_atom_done_code done_code)
-{
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-
-	if (done_code & KBASE_JS_ATOM_DONE_EVICTED_FROM_NEXT) {
-		KBASE_TIMELINE_JOB_START_NEXT(kctx, js, 0);
-	} else {
-		/* Job finished in JS_HEAD */
-		base_atom_id atom_number = kbase_jd_atom_id(kctx, katom);
-
-		KBASE_TIMELINE_JOB_START_HEAD(kctx, js, 0);
-		KBASE_TIMELINE_JOB_STOP(kctx, js, atom_number);
-
-		/* see if we need to trace the job in JS_NEXT moving to JS_HEAD */
-		if (kbase_backend_nr_atoms_submitted(kbdev, js)) {
-			struct kbase_jd_atom *next_katom;
-			struct kbase_context *next_kctx;
-
-			/* Peek the next atom - note that the atom in JS_HEAD will already
-			 * have been dequeued */
-			next_katom = kbase_backend_inspect_head(kbdev, js);
-			WARN_ON(!next_katom);
-			next_kctx = next_katom->kctx;
-			KBASE_TIMELINE_JOB_START_NEXT(next_kctx, js, 0);
-			KBASE_TIMELINE_JOB_START_HEAD(next_kctx, js, 1);
-			KBASE_TIMELINE_JOB_START(next_kctx, js, kbase_jd_atom_id(next_kctx, next_katom));
-		}
-	}
-
-	--kbdev->timeline.slot_atoms_submitted[js];
-
-	KBASE_TIMELINE_ATOMS_SUBMITTED(kctx, js, kbdev->timeline.slot_atoms_submitted[js]);
-}
-
-void kbase_timeline_pm_send_event(struct kbase_device *kbdev, enum kbase_timeline_pm_event event_sent)
-{
-	int uid = 0;
-	int old_uid;
-
-	/* If a producer already exists for the event, try to use their UID (multiple-producers) */
-	uid = atomic_read(&kbdev->timeline.pm_event_uid[event_sent]);
-	old_uid = uid;
-
-	/* Get a new non-zero UID if we don't have one yet */
-	while (!uid)
-		uid = atomic_inc_return(&kbdev->timeline.pm_event_uid_counter);
-
-	/* Try to use this UID */
-	if (old_uid != atomic_cmpxchg(&kbdev->timeline.pm_event_uid[event_sent], old_uid, uid))
-		/* If it changed, raced with another producer: we've lost this UID */
-		uid = 0;
-
-	KBASE_TIMELINE_PM_SEND_EVENT(kbdev, event_sent, uid);
-}
-
-void kbase_timeline_pm_check_handle_event(struct kbase_device *kbdev, enum kbase_timeline_pm_event event)
-{
-	int uid = atomic_read(&kbdev->timeline.pm_event_uid[event]);
-
-	if (uid != 0) {
-		if (uid != atomic_cmpxchg(&kbdev->timeline.pm_event_uid[event], uid, 0))
-			/* If it changed, raced with another consumer: we've lost this UID */
-			uid = 0;
-
-		KBASE_TIMELINE_PM_HANDLE_EVENT(kbdev, event, uid);
-	}
-}
-
-void kbase_timeline_pm_handle_event(struct kbase_device *kbdev, enum kbase_timeline_pm_event event)
-{
-	int uid = atomic_read(&kbdev->timeline.pm_event_uid[event]);
-
-	if (uid != atomic_cmpxchg(&kbdev->timeline.pm_event_uid[event], uid, 0))
-		/* If it changed, raced with another consumer: we've lost this UID */
-		uid = 0;
-
-	KBASE_TIMELINE_PM_HANDLE_EVENT(kbdev, event, uid);
-}
-
-void kbase_timeline_pm_l2_transition_start(struct kbase_device *kbdev)
-{
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-	/* Simply log the start of the transition */
-	kbdev->timeline.l2_transitioning = true;
-	KBASE_TIMELINE_POWERING_L2(kbdev);
-}
-
-void kbase_timeline_pm_l2_transition_done(struct kbase_device *kbdev)
-{
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-	/* Simply log the end of the transition */
-	if (kbdev->timeline.l2_transitioning) {
-		kbdev->timeline.l2_transitioning = false;
-		KBASE_TIMELINE_POWERED_L2(kbdev);
-	}
-}
-
-#endif /* CONFIG_MALI_BIFROST_TRACE_TIMELINE */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_timeline.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_timeline.h
deleted file mode 100644
index 4b517f396f8c..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_timeline.h
+++ /dev/null
@@ -1,363 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#if !defined(_KBASE_TRACE_TIMELINE_H)
-#define _KBASE_TRACE_TIMELINE_H
-
-#ifdef CONFIG_MALI_BIFROST_TRACE_TIMELINE
-
-enum kbase_trace_timeline_code {
-	#define KBASE_TIMELINE_TRACE_CODE(enum_val, desc, format, format_desc) enum_val
-	#include "mali_kbase_trace_timeline_defs.h"
-	#undef KBASE_TIMELINE_TRACE_CODE
-};
-
-#ifdef CONFIG_DEBUG_FS
-
-/** Initialize Timeline DebugFS entries */
-void kbasep_trace_timeline_debugfs_init(struct kbase_device *kbdev);
-
-#else /* CONFIG_DEBUG_FS */
-
-#define kbasep_trace_timeline_debugfs_init CSTD_NOP
-
-#endif /* CONFIG_DEBUG_FS */
-
-/* mali_timeline.h defines kernel tracepoints used by the KBASE_TIMELINE
- * functions.
- * Output is timestamped by either sched_clock() (default), local_clock(), or
- * cpu_clock(), depending on /sys/kernel/debug/tracing/trace_clock */
-#include "mali_timeline.h"
-
-/* Trace number of atoms in flight for kctx (atoms either not completed, or in
-   process of being returned to user */
-#define KBASE_TIMELINE_ATOMS_IN_FLIGHT(kctx, count)                          \
-	do {                                                                 \
-		struct timespec ts;                                          \
-		getrawmonotonic(&ts);                                        \
-		trace_mali_timeline_atoms_in_flight(ts.tv_sec, ts.tv_nsec,   \
-				(int)kctx->timeline.owner_tgid,              \
-				count);                                      \
-	} while (0)
-
-/* Trace atom_id being Ready to Run */
-#define KBASE_TIMELINE_ATOM_READY(kctx, atom_id)                             \
-	do {                                                                 \
-		struct timespec ts;                                          \
-		getrawmonotonic(&ts);                                        \
-		trace_mali_timeline_atom(ts.tv_sec, ts.tv_nsec,              \
-				CTX_FLOW_ATOM_READY,                         \
-				(int)kctx->timeline.owner_tgid,              \
-				atom_id);                                    \
-	} while (0)
-
-/* Trace number of atoms submitted to job slot js
- *
- * NOTE: This uses a different tracepoint to the head/next/soft-stop actions,
- * so that those actions can be filtered out separately from this
- *
- * This is because this is more useful, as we can use it to calculate general
- * utilization easily and accurately */
-#define KBASE_TIMELINE_ATOMS_SUBMITTED(kctx, js, count)                      \
-	do {                                                                 \
-		struct timespec ts;                                          \
-		getrawmonotonic(&ts);                                        \
-		trace_mali_timeline_gpu_slot_active(ts.tv_sec, ts.tv_nsec,   \
-				SW_SET_GPU_SLOT_ACTIVE,                      \
-				(int)kctx->timeline.owner_tgid,              \
-				js, count);                                  \
-	} while (0)
-
-
-/* Trace atoms present in JS_NEXT */
-#define KBASE_TIMELINE_JOB_START_NEXT(kctx, js, count)                       \
-	do {                                                                 \
-		struct timespec ts;                                          \
-		getrawmonotonic(&ts);                                        \
-		trace_mali_timeline_gpu_slot_action(ts.tv_sec, ts.tv_nsec,   \
-				SW_SET_GPU_SLOT_NEXT,                        \
-				(int)kctx->timeline.owner_tgid,              \
-				js, count);                                  \
-	} while (0)
-
-/* Trace atoms present in JS_HEAD */
-#define KBASE_TIMELINE_JOB_START_HEAD(kctx, js, count)                       \
-	do {                                                                 \
-		struct timespec ts;                                          \
-		getrawmonotonic(&ts);                                        \
-		trace_mali_timeline_gpu_slot_action(ts.tv_sec, ts.tv_nsec,   \
-				SW_SET_GPU_SLOT_HEAD,                        \
-				(int)kctx->timeline.owner_tgid,              \
-				js, count);                                  \
-	} while (0)
-
-/* Trace that a soft stop/evict from next is being attempted on a slot */
-#define KBASE_TIMELINE_TRY_SOFT_STOP(kctx, js, count) \
-	do {                                                                 \
-		struct timespec ts;                                          \
-		getrawmonotonic(&ts);                                        \
-		trace_mali_timeline_gpu_slot_action(ts.tv_sec, ts.tv_nsec,   \
-				SW_SET_GPU_SLOT_STOPPING,                    \
-				(kctx) ? (int)kctx->timeline.owner_tgid : 0, \
-				js, count);                                  \
-	} while (0)
-
-
-
-/* Trace state of overall GPU power */
-#define KBASE_TIMELINE_GPU_POWER(kbdev, active)                              \
-	do {                                                                 \
-		struct timespec ts;                                          \
-		getrawmonotonic(&ts);                                        \
-		trace_mali_timeline_gpu_power_active(ts.tv_sec, ts.tv_nsec,  \
-				SW_SET_GPU_POWER_ACTIVE, active);            \
-	} while (0)
-
-/* Trace state of tiler power */
-#define KBASE_TIMELINE_POWER_TILER(kbdev, bitmap)                            \
-	do {                                                                 \
-		struct timespec ts;                                          \
-		getrawmonotonic(&ts);                                        \
-		trace_mali_timeline_gpu_power_active(ts.tv_sec, ts.tv_nsec,  \
-				SW_SET_GPU_POWER_TILER_ACTIVE,               \
-				hweight64(bitmap));                          \
-	} while (0)
-
-/* Trace number of shaders currently powered */
-#define KBASE_TIMELINE_POWER_SHADER(kbdev, bitmap)                           \
-	do {                                                                 \
-		struct timespec ts;                                          \
-		getrawmonotonic(&ts);                                        \
-		trace_mali_timeline_gpu_power_active(ts.tv_sec, ts.tv_nsec,  \
-				SW_SET_GPU_POWER_SHADER_ACTIVE,              \
-				hweight64(bitmap));                          \
-	} while (0)
-
-/* Trace state of L2 power */
-#define KBASE_TIMELINE_POWER_L2(kbdev, bitmap)                               \
-	do {                                                                 \
-		struct timespec ts;                                          \
-		getrawmonotonic(&ts);                                        \
-		trace_mali_timeline_gpu_power_active(ts.tv_sec, ts.tv_nsec,  \
-				SW_SET_GPU_POWER_L2_ACTIVE,                  \
-				hweight64(bitmap));                          \
-	} while (0)
-
-/* Trace state of L2 cache*/
-#define KBASE_TIMELINE_POWERING_L2(kbdev)                                    \
-	do {                                                                 \
-		struct timespec ts;                                          \
-		getrawmonotonic(&ts);                                        \
-		trace_mali_timeline_l2_power_active(ts.tv_sec, ts.tv_nsec,   \
-				SW_FLOW_GPU_POWER_L2_POWERING,               \
-				1);                                          \
-	} while (0)
-
-#define KBASE_TIMELINE_POWERED_L2(kbdev)                                     \
-	do {                                                                 \
-		struct timespec ts;                                          \
-		getrawmonotonic(&ts);                                        \
-		trace_mali_timeline_l2_power_active(ts.tv_sec, ts.tv_nsec,   \
-				SW_FLOW_GPU_POWER_L2_ACTIVE,                 \
-				1);                                          \
-	} while (0)
-
-/* Trace kbase_pm_send_event message send */
-#define KBASE_TIMELINE_PM_SEND_EVENT(kbdev, event_type, pm_event_id)         \
-	do {                                                                 \
-		struct timespec ts;                                          \
-		getrawmonotonic(&ts);                                        \
-		trace_mali_timeline_pm_event(ts.tv_sec, ts.tv_nsec,          \
-				SW_FLOW_PM_SEND_EVENT,                       \
-				event_type, pm_event_id);                    \
-	} while (0)
-
-/* Trace kbase_pm_worker message receive */
-#define KBASE_TIMELINE_PM_HANDLE_EVENT(kbdev, event_type, pm_event_id)       \
-	do {                                                                 \
-		struct timespec ts;                                          \
-		getrawmonotonic(&ts);                                        \
-		trace_mali_timeline_pm_event(ts.tv_sec, ts.tv_nsec,          \
-				SW_FLOW_PM_HANDLE_EVENT,                     \
-				event_type, pm_event_id);                    \
-	} while (0)
-
-
-/* Trace atom_id starting in JS_HEAD */
-#define KBASE_TIMELINE_JOB_START(kctx, js, _consumerof_atom_number)          \
-	do {                                                                 \
-		struct timespec ts;                                          \
-		getrawmonotonic(&ts);                                        \
-		trace_mali_timeline_slot_atom(ts.tv_sec, ts.tv_nsec,         \
-				HW_START_GPU_JOB_CHAIN_SW_APPROX,            \
-				(int)kctx->timeline.owner_tgid,              \
-				js, _consumerof_atom_number);                \
-	} while (0)
-
-/* Trace atom_id stopping on JS_HEAD */
-#define KBASE_TIMELINE_JOB_STOP(kctx, js, _producerof_atom_number_completed) \
-	do {                                                                 \
-		struct timespec ts;                                          \
-		getrawmonotonic(&ts);                                        \
-		trace_mali_timeline_slot_atom(ts.tv_sec, ts.tv_nsec,         \
-				HW_STOP_GPU_JOB_CHAIN_SW_APPROX,             \
-				(int)kctx->timeline.owner_tgid,              \
-				js, _producerof_atom_number_completed);      \
-	} while (0)
-
-/** Trace beginning/end of a call to kbase_pm_check_transitions_nolock from a
- * certin caller */
-#define KBASE_TIMELINE_PM_CHECKTRANS(kbdev, trace_code)                      \
-	do {                                                                 \
-		struct timespec ts;                                          \
-		getrawmonotonic(&ts);                                        \
-		trace_mali_timeline_pm_checktrans(ts.tv_sec, ts.tv_nsec,     \
-				trace_code, 1);                              \
-	} while (0)
-
-/* Trace number of contexts active */
-#define KBASE_TIMELINE_CONTEXT_ACTIVE(kbdev, count)                          \
-	do {                                                                 \
-		struct timespec ts;                                          \
-		getrawmonotonic(&ts);                                        \
-		trace_mali_timeline_context_active(ts.tv_sec, ts.tv_nsec,    \
-				count);                                      \
-	} while (0)
-
-/* NOTE: kbase_timeline_pm_cores_func() is in mali_kbase_pm_policy.c */
-
-/**
- * Trace that an atom is starting on a job slot
- *
- * The caller must be holding hwaccess_lock
- */
-void kbase_timeline_job_slot_submit(struct kbase_device *kbdev, struct kbase_context *kctx,
-		struct kbase_jd_atom *katom, int js);
-
-/**
- * Trace that an atom has done on a job slot
- *
- * 'Done' in this sense can occur either because:
- * - the atom in JS_HEAD finished
- * - the atom in JS_NEXT was evicted
- *
- * Whether the atom finished or was evicted is passed in @a done_code
- *
- * It is assumed that the atom has already been removed from the submit slot,
- * with either:
- * - kbasep_jm_dequeue_submit_slot()
- * - kbasep_jm_dequeue_tail_submit_slot()
- *
- * The caller must be holding hwaccess_lock
- */
-void kbase_timeline_job_slot_done(struct kbase_device *kbdev, struct kbase_context *kctx,
-		struct kbase_jd_atom *katom, int js,
-		kbasep_js_atom_done_code done_code);
-
-
-/** Trace a pm event starting */
-void kbase_timeline_pm_send_event(struct kbase_device *kbdev,
-		enum kbase_timeline_pm_event event_sent);
-
-/** Trace a pm event finishing */
-void kbase_timeline_pm_check_handle_event(struct kbase_device *kbdev, enum kbase_timeline_pm_event event);
-
-/** Check whether a pm event was present, and if so trace finishing it */
-void kbase_timeline_pm_handle_event(struct kbase_device *kbdev, enum kbase_timeline_pm_event event);
-
-/** Trace L2 power-up start */
-void kbase_timeline_pm_l2_transition_start(struct kbase_device *kbdev);
-
-/** Trace L2 power-up done */
-void kbase_timeline_pm_l2_transition_done(struct kbase_device *kbdev);
-
-#else
-
-#define KBASE_TIMELINE_ATOMS_IN_FLIGHT(kctx, count) CSTD_NOP()
-
-#define KBASE_TIMELINE_ATOM_READY(kctx, atom_id) CSTD_NOP()
-
-#define KBASE_TIMELINE_ATOMS_SUBMITTED(kctx, js, count) CSTD_NOP()
-
-#define KBASE_TIMELINE_JOB_START_NEXT(kctx, js, count) CSTD_NOP()
-
-#define KBASE_TIMELINE_JOB_START_HEAD(kctx, js, count) CSTD_NOP()
-
-#define KBASE_TIMELINE_TRY_SOFT_STOP(kctx, js, count) CSTD_NOP()
-
-#define KBASE_TIMELINE_GPU_POWER(kbdev, active) CSTD_NOP()
-
-#define KBASE_TIMELINE_POWER_TILER(kbdev, bitmap) CSTD_NOP()
-
-#define KBASE_TIMELINE_POWER_SHADER(kbdev, bitmap) CSTD_NOP()
-
-#define KBASE_TIMELINE_POWER_L2(kbdev, active) CSTD_NOP()
-
-#define KBASE_TIMELINE_POWERING_L2(kbdev) CSTD_NOP()
-
-#define KBASE_TIMELINE_POWERED_L2(kbdev)  CSTD_NOP()
-
-#define KBASE_TIMELINE_PM_SEND_EVENT(kbdev, event_type, pm_event_id) CSTD_NOP()
-
-#define KBASE_TIMELINE_PM_HANDLE_EVENT(kbdev, event_type, pm_event_id) CSTD_NOP()
-
-#define KBASE_TIMELINE_JOB_START(kctx, js, _consumerof_atom_number) CSTD_NOP()
-
-#define KBASE_TIMELINE_JOB_STOP(kctx, js, _producerof_atom_number_completed) CSTD_NOP()
-
-#define KBASE_TIMELINE_PM_CHECKTRANS(kbdev, trace_code) CSTD_NOP()
-
-#define KBASE_TIMELINE_CONTEXT_ACTIVE(kbdev, count) CSTD_NOP()
-
-static inline void kbase_timeline_job_slot_submit(struct kbase_device *kbdev, struct kbase_context *kctx,
-		struct kbase_jd_atom *katom, int js)
-{
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-}
-
-static inline void kbase_timeline_job_slot_done(struct kbase_device *kbdev, struct kbase_context *kctx,
-		struct kbase_jd_atom *katom, int js,
-		kbasep_js_atom_done_code done_code)
-{
-	lockdep_assert_held(&kbdev->hwaccess_lock);
-}
-
-static inline void kbase_timeline_pm_send_event(struct kbase_device *kbdev, enum kbase_timeline_pm_event event_sent)
-{
-}
-
-static inline void kbase_timeline_pm_check_handle_event(struct kbase_device *kbdev, enum kbase_timeline_pm_event event)
-{
-}
-
-static inline void kbase_timeline_pm_handle_event(struct kbase_device *kbdev, enum kbase_timeline_pm_event event)
-{
-}
-
-static inline void kbase_timeline_pm_l2_transition_start(struct kbase_device *kbdev)
-{
-}
-
-static inline void kbase_timeline_pm_l2_transition_done(struct kbase_device *kbdev)
-{
-}
-#endif				/* CONFIG_MALI_BIFROST_TRACE_TIMELINE */
-
-#endif				/* _KBASE_TRACE_TIMELINE_H */
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_timeline_defs.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_timeline_defs.h
deleted file mode 100644
index 156a95a67f4a..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_trace_timeline_defs.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/* ***** IMPORTANT: THIS IS NOT A NORMAL HEADER FILE         *****
- * *****            DO NOT INCLUDE DIRECTLY                  *****
- * *****            THE LACK OF HEADER GUARDS IS INTENTIONAL ***** */
-
-/*
- * Conventions on Event Names:
- *
- * - The prefix determines something about how the timeline should be
- *   displayed, and is split up into various parts, separated by underscores:
- *  - 'SW' and 'HW' as the first part will be used to determine whether a
- *     timeline is to do with Software or Hardware - effectively, separate
- *     'channels' for Software and Hardware
- *  - 'START', 'STOP', 'ENTER', 'LEAVE' can be used in the second part, and
- *    signify related pairs of events - these are optional.
- *  - 'FLOW' indicates a generic event, which can use dependencies
- * - This gives events such as:
- *  - 'SW_ENTER_FOO'
- *  - 'SW_LEAVE_FOO'
- *  - 'SW_FLOW_BAR_1'
- *  - 'SW_FLOW_BAR_2'
- *  - 'HW_START_BAZ'
- *  - 'HW_STOP_BAZ'
- * - And an unadorned HW event:
- *  - 'HW_BAZ_FROZBOZ'
- */
-
-/*
- * Conventions on parameter names:
- * - anything with 'instance' in the name will have a separate timeline based
- *   on that instances.
- * - underscored-prefixed parameters will by hidden by default on timelines
- *
- * Hence:
- * - Different job slots have their own 'instance', based on the instance value
- * - Per-context info (e.g. atoms on a context) have their own 'instance'
- *   (i.e. each context should be on a different timeline)
- *
- * Note that globally-shared resources can be tagged with a tgid, but we don't
- * want an instance per context:
- * - There's no point having separate Job Slot timelines for each context, that
- *   would be confusing - there's only really 3 job slots!
- * - There's no point having separate Shader-powered timelines for each
- *   context, that would be confusing - all shader cores (whether it be 4, 8,
- *   etc) are shared in the system.
- */
-
-	/*
-	 * CTX events
-	 */
-	/* Separate timelines for each context 'instance'*/
-	KBASE_TIMELINE_TRACE_CODE(CTX_SET_NR_ATOMS_IN_FLIGHT,     "CTX: Atoms in flight",            "%d,%d",    "_instance_tgid,_value_number_of_atoms"),
-	KBASE_TIMELINE_TRACE_CODE(CTX_FLOW_ATOM_READY,            "CTX: Atoms Ready to Run",         "%d,%d,%d", "_instance_tgid,_consumerof_atom_number,_producerof_atom_number_ready"),
-
-	/*
-	 * SW Events
-	 */
-	/* Separate timelines for each slot 'instance' */
-	KBASE_TIMELINE_TRACE_CODE(SW_SET_GPU_SLOT_ACTIVE,         "SW: GPU slot active",             "%d,%d,%d", "_tgid,_instance_slot,_value_number_of_atoms"),
-	KBASE_TIMELINE_TRACE_CODE(SW_SET_GPU_SLOT_NEXT,           "SW: GPU atom in NEXT",            "%d,%d,%d", "_tgid,_instance_slot,_value_is_an_atom_in_next"),
-	KBASE_TIMELINE_TRACE_CODE(SW_SET_GPU_SLOT_HEAD,           "SW: GPU atom in HEAD",            "%d,%d,%d", "_tgid,_instance_slot,_value_is_an_atom_in_head"),
-	KBASE_TIMELINE_TRACE_CODE(SW_SET_GPU_SLOT_STOPPING,       "SW: Try Soft-Stop on GPU slot",   "%d,%d,%d", "_tgid,_instance_slot,_value_is_slot_stopping"),
-	/* Shader and overall power is shared - can't have separate instances of
-	 * it, just tagging with the context */
-	KBASE_TIMELINE_TRACE_CODE(SW_SET_GPU_POWER_ACTIVE,        "SW: GPU power active",            "%d,%d",    "_tgid,_value_is_power_active"),
-	KBASE_TIMELINE_TRACE_CODE(SW_SET_GPU_POWER_TILER_ACTIVE,  "SW: GPU tiler powered",           "%d,%d",    "_tgid,_value_number_of_tilers"),
-	KBASE_TIMELINE_TRACE_CODE(SW_SET_GPU_POWER_SHADER_ACTIVE, "SW: GPU shaders powered",         "%d,%d",    "_tgid,_value_number_of_shaders"),
-	KBASE_TIMELINE_TRACE_CODE(SW_SET_GPU_POWER_L2_ACTIVE,     "SW: GPU L2 powered",              "%d,%d",    "_tgid,_value_number_of_l2"),
-
-	/* SW Power event messaging. _event_type is one from the kbase_pm_event enum  */
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_SEND_EVENT,          "SW: PM Send Event",               "%d,%d,%d", "_tgid,_event_type,_writerof_pm_event_id"),
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_HANDLE_EVENT,        "SW: PM Handle Event",             "%d,%d,%d", "_tgid,_event_type,_finalconsumerof_pm_event_id"),
-	/* SW L2 power events */
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_GPU_POWER_L2_POWERING,  "SW: GPU L2 powering",             "%d,%d", "_tgid,_writerof_l2_transitioning"),
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_GPU_POWER_L2_ACTIVE,	  "SW: GPU L2 powering done",        "%d,%d", "_tgid,_finalconsumerof_l2_transitioning"),
-
-	KBASE_TIMELINE_TRACE_CODE(SW_SET_CONTEXT_ACTIVE,          "SW: Context Active",              "%d,%d",    "_tgid,_value_active"),
-
-	/*
-	 * BEGIN: Significant SW Functions that call kbase_pm_check_transitions_nolock()
-	 */
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_CHECKTRANS_PM_DO_POWEROFF_START, "SW: PM CheckTrans from kbase_pm_do_poweroff", "%d,%d", "_tgid,_writerof_pm_checktrans_pm_do_poweroff"),
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_CHECKTRANS_PM_DO_POWEROFF_END,   "SW: PM CheckTrans from kbase_pm_do_poweroff", "%d,%d", "_tgid,_finalconsumerof_pm_checktrans_pm_do_poweroff"),
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_CHECKTRANS_PM_DO_POWERON_START, "SW: PM CheckTrans from kbase_pm_do_poweron", "%d,%d", "_tgid,_writerof_pm_checktrans_pm_do_poweron"),
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_CHECKTRANS_PM_DO_POWERON_END,   "SW: PM CheckTrans from kbase_pm_do_poweron", "%d,%d", "_tgid,_finalconsumerof_pm_checktrans_pm_do_poweron"),
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_CHECKTRANS_GPU_INTERRUPT_START, "SW: PM CheckTrans from kbase_gpu_interrupt", "%d,%d", "_tgid,_writerof_pm_checktrans_gpu_interrupt"),
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_CHECKTRANS_GPU_INTERRUPT_END,   "SW: PM CheckTrans from kbase_gpu_interrupt", "%d,%d", "_tgid,_finalconsumerof_pm_checktrans_gpu_interrupt"),
-
-	/*
-	 * Significant Indirect callers of kbase_pm_check_transitions_nolock()
-	 */
-	/* kbase_pm_request_cores */
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_CHECKTRANS_PM_REQUEST_CORES_SHADER_START, "SW: PM CheckTrans from kbase_pm_request_cores(shader)", "%d,%d", "_tgid,_writerof_pm_checktrans_pm_request_cores_shader"),
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_CHECKTRANS_PM_REQUEST_CORES_SHADER_END,   "SW: PM CheckTrans from kbase_pm_request_cores(shader)", "%d,%d", "_tgid,_finalconsumerof_pm_checktrans_pm_request_cores_shader"),
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_CHECKTRANS_PM_REQUEST_CORES_TILER_START, "SW: PM CheckTrans from kbase_pm_request_cores(tiler)", "%d,%d", "_tgid,_writerof_pm_checktrans_pm_request_cores_tiler"),
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_CHECKTRANS_PM_REQUEST_CORES_TILER_END,   "SW: PM CheckTrans from kbase_pm_request_cores(tiler)", "%d,%d", "_tgid,_finalconsumerof_pm_checktrans_pm_request_cores_tiler"),
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_CHECKTRANS_PM_REQUEST_CORES_SHADER_TILER_START, "SW: PM CheckTrans from kbase_pm_request_cores(shader+tiler)", "%d,%d", "_tgid,_writerof_pm_checktrans_pm_request_cores_shader_tiler"),
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_CHECKTRANS_PM_REQUEST_CORES_SHADER_TILER_END,   "SW: PM CheckTrans from kbase_pm_request_cores(shader+tiler)", "%d,%d", "_tgid,_finalconsumerof_pm_checktrans_pm_request_cores_shader_tiler"),
-	/* kbase_pm_release_cores */
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_SHADER_START, "SW: PM CheckTrans from kbase_pm_release_cores(shader)", "%d,%d", "_tgid,_writerof_pm_checktrans_pm_release_cores_shader"),
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_SHADER_END,   "SW: PM CheckTrans from kbase_pm_release_cores(shader)", "%d,%d", "_tgid,_finalconsumerof_pm_checktrans_pm_release_cores_shader"),
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_TILER_START, "SW: PM CheckTrans from kbase_pm_release_cores(tiler)", "%d,%d", "_tgid,_writerof_pm_checktrans_pm_release_cores_tiler"),
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_TILER_END,   "SW: PM CheckTrans from kbase_pm_release_cores(tiler)", "%d,%d", "_tgid,_finalconsumerof_pm_checktrans_pm_release_cores_tiler"),
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_SHADER_TILER_START, "SW: PM CheckTrans from kbase_pm_release_cores(shader+tiler)", "%d,%d", "_tgid,_writerof_pm_checktrans_pm_release_cores_shader_tiler"),
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_SHADER_TILER_END,   "SW: PM CheckTrans from kbase_pm_release_cores(shader+tiler)", "%d,%d", "_tgid,_finalconsumerof_pm_checktrans_pm_release_cores_shader_tiler"),
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_DEFERRED_START, "SW: PM CheckTrans from kbasep_pm_do_shader_poweroff_callback", "%d,%d", "_tgid,_writerof_pm_checktrans_pm_do_shader_poweroff_callback"),
-	KBASE_TIMELINE_TRACE_CODE(SW_FLOW_PM_CHECKTRANS_PM_RELEASE_CORES_DEFERRED_END,   "SW: PM CheckTrans from kbasep_pm_do_shader_poweroff_callback", "%d,%d", "_tgid,_finalconsumerof_pm_checktrans_pm_do_shader_poweroff_callback"),
-	/*
-	 * END: SW Functions that call kbase_pm_check_transitions_nolock()
-	 */
-
-	/*
-	 * HW Events
-	 */
-	KBASE_TIMELINE_TRACE_CODE(HW_MMU_FAULT,
-"HW: MMU Fault", "%d,%d,%d", "_tgid,fault_type,fault_stage,asid"),
-	KBASE_TIMELINE_TRACE_CODE(HW_START_GPU_JOB_CHAIN_SW_APPROX,
-"HW: Job Chain start (SW approximated)", "%d,%d,%d",
-"_tgid,job_slot,_consumerof_atom_number_ready"),
-	KBASE_TIMELINE_TRACE_CODE(HW_STOP_GPU_JOB_CHAIN_SW_APPROX,
-"HW: Job Chain stop (SW approximated)",  "%d,%d,%d",
-"_tgid,job_slot,_producerof_atom_number_completed")
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_uku.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_uku.h
deleted file mode 100644
index cf8ee0572dc5..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_uku.h
+++ /dev/null
@@ -1,532 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2008-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#ifndef _KBASE_UKU_H_
-#define _KBASE_UKU_H_
-
-#include "mali_uk.h"
-#include "mali_base_kernel.h"
-
-/* This file needs to support being included from kernel and userside (which use different defines) */
-#if defined(CONFIG_MALI_BIFROST_ERROR_INJECT) || MALI_ERROR_INJECT_ON
-#define SUPPORT_MALI_ERROR_INJECT
-#endif /* defined(CONFIG_MALI_BIFROST_ERROR_INJECT) || MALI_ERROR_INJECT_ON */
-#if defined(CONFIG_MALI_BIFROST_NO_MALI)
-#define SUPPORT_MALI_NO_MALI
-#elif defined(MALI_BIFROST_NO_MALI)
-#if MALI_BIFROST_NO_MALI
-#define SUPPORT_MALI_NO_MALI
-#endif
-#endif
-
-#if defined(SUPPORT_MALI_NO_MALI) || defined(SUPPORT_MALI_ERROR_INJECT)
-#include "backend/gpu/mali_kbase_model_dummy.h"
-#endif
-
-#include "mali_kbase_gpuprops_types.h"
-
-/*
- * 10.1:
- * - Do mmap in kernel for SAME_VA memory allocations rather then
- *   calling back into the kernel as a 2nd stage of the allocation request.
- *
- * 10.2:
- * - Add KBASE_FUNC_MEM_JIT_INIT which allows clients to request a custom VA
- *   region for use with JIT (ignored on 32-bit platforms)
- *
- * 10.3:
- * - base_jd_core_req typedef-ed to u32 (instead of to u16)
- * - two flags added: BASE_JD_REQ_SKIP_CACHE_STAT / _END
- *
- * 10.4:
- * - Removed KBASE_FUNC_EXT_BUFFER_LOCK used only in internal tests
- *
- * 10.5:
- * - Reverted to performing mmap in user space so that tools like valgrind work.
- *
- * 10.6:
- * - Add flags input variable to KBASE_FUNC_TLSTREAM_ACQUIRE
- */
-#define BASE_UK_VERSION_MAJOR 10
-#define BASE_UK_VERSION_MINOR 6
-
-#define LINUX_UK_BASE_MAGIC 0x80
-
-struct kbase_uk_mem_alloc {
-	union uk_header header;
-	/* IN */
-	u64 va_pages;
-	u64 commit_pages;
-	u64 extent;
-	/* IN/OUT */
-	u64 flags;
-	/* OUT */
-	u64 gpu_va;
-	u16 va_alignment;
-	u8  padding[6];
-};
-
-struct kbase_uk_mem_free {
-	union uk_header header;
-	/* IN */
-	u64 gpu_addr;
-	/* OUT */
-};
-
-struct kbase_uk_mem_alias {
-	union uk_header header;
-	/* IN/OUT */
-	u64 flags;
-	/* IN */
-	u64 stride;
-	u64 nents;
-	u64 ai;
-	/* OUT */
-	u64         gpu_va;
-	u64         va_pages;
-};
-
-struct kbase_uk_mem_import {
-	union uk_header header;
-	/* IN */
-	u64 phandle;
-	u32 type;
-	u32 padding;
-	/* IN/OUT */
-	u64         flags;
-	/* OUT */
-	u64 gpu_va;
-	u64         va_pages;
-};
-
-struct kbase_uk_mem_flags_change {
-	union uk_header header;
-	/* IN */
-	u64 gpu_va;
-	u64 flags;
-	u64 mask;
-};
-
-struct kbase_uk_job_submit {
-	union uk_header header;
-	/* IN */
-	u64 addr;
-	u32 nr_atoms;
-	u32 stride;		/* bytes between atoms, i.e. sizeof(base_jd_atom_v2) */
-	/* OUT */
-};
-
-struct kbase_uk_post_term {
-	union uk_header header;
-};
-
-struct kbase_uk_sync_now {
-	union uk_header header;
-
-	/* IN */
-	struct base_syncset sset;
-
-	/* OUT */
-};
-
-struct kbase_uk_hwcnt_setup {
-	union uk_header header;
-
-	/* IN */
-	u64 dump_buffer;
-	u32 jm_bm;
-	u32 shader_bm;
-	u32 tiler_bm;
-	u32 unused_1; /* keep for backwards compatibility */
-	u32 mmu_l2_bm;
-	u32 padding;
-	/* OUT */
-};
-
-/**
- * struct kbase_uk_hwcnt_reader_setup - User/Kernel space data exchange structure
- * @header:       UK structure header
- * @buffer_count: requested number of dumping buffers
- * @jm_bm:        counters selection bitmask (JM)
- * @shader_bm:    counters selection bitmask (Shader)
- * @tiler_bm:     counters selection bitmask (Tiler)
- * @mmu_l2_bm:    counters selection bitmask (MMU_L2)
- * @fd:           dumping notification file descriptor
- *
- * This structure sets up HWC dumper/reader for this context.
- * Multiple instances can be created for single context.
- */
-struct kbase_uk_hwcnt_reader_setup {
-	union uk_header header;
-
-	/* IN */
-	u32 buffer_count;
-	u32 jm_bm;
-	u32 shader_bm;
-	u32 tiler_bm;
-	u32 mmu_l2_bm;
-
-	/* OUT */
-	s32 fd;
-};
-
-struct kbase_uk_hwcnt_dump {
-	union uk_header header;
-};
-
-struct kbase_uk_hwcnt_clear {
-	union uk_header header;
-};
-
-struct kbase_uk_fence_validate {
-	union uk_header header;
-	/* IN */
-	s32 fd;
-	u32 padding;
-	/* OUT */
-};
-
-struct kbase_uk_stream_create {
-	union uk_header header;
-	/* IN */
-	char name[32];
-	/* OUT */
-	s32 fd;
-	u32 padding;
-};
-
-struct kbase_uk_gpuprops {
-	union uk_header header;
-
-	/* IN */
-	struct mali_base_gpu_props props;
-	/* OUT */
-};
-
-struct kbase_uk_mem_query {
-	union uk_header header;
-	/* IN */
-	u64 gpu_addr;
-#define KBASE_MEM_QUERY_COMMIT_SIZE  1
-#define KBASE_MEM_QUERY_VA_SIZE      2
-#define KBASE_MEM_QUERY_FLAGS        3
-	u64         query;
-	/* OUT */
-	u64         value;
-};
-
-struct kbase_uk_mem_commit {
-	union uk_header header;
-	/* IN */
-	u64 gpu_addr;
-	u64         pages;
-	/* OUT */
-	u32 result_subcode;
-	u32 padding;
-};
-
-struct kbase_uk_find_cpu_offset {
-	union uk_header header;
-	/* IN */
-	u64 gpu_addr;
-	u64 cpu_addr;
-	u64 size;
-	/* OUT */
-	u64 offset;
-};
-
-#define KBASE_GET_VERSION_BUFFER_SIZE 64
-struct kbase_uk_get_ddk_version {
-	union uk_header header;
-	/* OUT */
-	char version_buffer[KBASE_GET_VERSION_BUFFER_SIZE];
-	u32 version_string_size;
-	u32 padding;
-};
-
-struct kbase_uk_disjoint_query {
-	union uk_header header;
-	/* OUT */
-	u32 counter;
-	u32 padding;
-};
-
-struct kbase_uk_set_flags {
-	union uk_header header;
-	/* IN */
-	u32 create_flags;
-	u32 padding;
-};
-
-#if MALI_UNIT_TEST
-#define TEST_ADDR_COUNT 4
-#define KBASE_TEST_BUFFER_SIZE 128
-struct kbase_exported_test_data {
-	u64 test_addr[TEST_ADDR_COUNT];		/**< memory address */
-	u32 test_addr_pages[TEST_ADDR_COUNT];		/**<  memory size in pages */
-	u64 kctx;				/**<  base context created by process */
-	u64 mm;				/**< pointer to process address space */
-	u8 buffer1[KBASE_TEST_BUFFER_SIZE];   /**<  unit test defined parameter */
-	u8 buffer2[KBASE_TEST_BUFFER_SIZE];   /**<  unit test defined parameter */
-};
-
-struct kbase_uk_set_test_data {
-	union uk_header header;
-	/* IN */
-	struct kbase_exported_test_data test_data;
-};
-
-#endif				/* MALI_UNIT_TEST */
-
-#ifdef SUPPORT_MALI_ERROR_INJECT
-struct kbase_uk_error_params {
-	union uk_header header;
-	/* IN */
-	struct kbase_error_params params;
-};
-#endif				/* SUPPORT_MALI_ERROR_INJECT */
-
-#ifdef SUPPORT_MALI_NO_MALI
-struct kbase_uk_model_control_params {
-	union uk_header header;
-	/* IN */
-	struct kbase_model_control_params params;
-};
-#endif				/* SUPPORT_MALI_NO_MALI */
-
-struct kbase_uk_profiling_controls {
-	union uk_header header;
-	u32 profiling_controls[FBDUMP_CONTROL_MAX];
-};
-
-struct kbase_uk_debugfs_mem_profile_add {
-	union uk_header header;
-	u32 len;
-	u32 padding;
-	u64 buf;
-};
-
-struct kbase_uk_context_id {
-	union uk_header header;
-	/* OUT */
-	int id;
-};
-
-/**
- * struct kbase_uk_tlstream_acquire - User/Kernel space data exchange structure
- * @header: UK structure header
- * @flags:  timeline stream flags
- * @fd:     timeline stream file descriptor
- *
- * This structure is used when performing a call to acquire kernel side timeline
- * stream file descriptor.
- */
-struct kbase_uk_tlstream_acquire {
-	union uk_header header;
-	/* IN */
-	u32 flags;
-	/* OUT */
-	s32  fd;
-};
-
-/**
- * struct kbase_uk_tlstream_acquire_v10_4 - User/Kernel space data exchange
- *                                          structure
- * @header: UK structure header
- * @fd:     timeline stream file descriptor
- *
- * This structure is used when performing a call to acquire kernel side timeline
- * stream file descriptor.
- */
-struct kbase_uk_tlstream_acquire_v10_4 {
-	union uk_header header;
-	/* IN */
-	/* OUT */
-	s32  fd;
-};
-
-/**
- * struct kbase_uk_tlstream_flush - User/Kernel space data exchange structure
- * @header: UK structure header
- *
- * This structure is used when performing a call to flush kernel side
- * timeline streams.
- */
-struct kbase_uk_tlstream_flush {
-	union uk_header header;
-	/* IN */
-	/* OUT */
-};
-
-#if MALI_UNIT_TEST
-/**
- * struct kbase_uk_tlstream_test - User/Kernel space data exchange structure
- * @header:    UK structure header
- * @tpw_count: number of trace point writers in each context
- * @msg_delay: time delay between tracepoints from one writer in milliseconds
- * @msg_count: number of trace points written by one writer
- * @aux_msg:   if non-zero aux messages will be included
- *
- * This structure is used when performing a call to start timeline stream test
- * embedded in kernel.
- */
-struct kbase_uk_tlstream_test {
-	union uk_header header;
-	/* IN */
-	u32 tpw_count;
-	u32 msg_delay;
-	u32 msg_count;
-	u32 aux_msg;
-	/* OUT */
-};
-
-/**
- * struct kbase_uk_tlstream_stats - User/Kernel space data exchange structure
- * @header:          UK structure header
- * @bytes_collected: number of bytes read by user
- * @bytes_generated: number of bytes generated by tracepoints
- *
- * This structure is used when performing a call to obtain timeline stream
- * statistics.
- */
-struct kbase_uk_tlstream_stats {
-	union uk_header header; /**< UK structure header. */
-	/* IN */
-	/* OUT */
-	u32 bytes_collected;
-	u32 bytes_generated;
-};
-#endif /* MALI_UNIT_TEST */
-
-/**
- * struct struct kbase_uk_prfcnt_value for the KBASE_FUNC_SET_PRFCNT_VALUES ioctl
- * @header:          UK structure header
- * @data:            Counter samples for the dummy model
- * @size:............Size of the counter sample data
- */
-struct kbase_uk_prfcnt_values {
-	union uk_header header;
-	/* IN */
-	u32 *data;
-	u32 size;
-};
-
-/**
- * struct kbase_uk_soft_event_update - User/Kernel space data exchange structure
- * @header:     UK structure header
- * @evt:        the GPU address containing the event
- * @new_status: the new event status, must be either BASE_JD_SOFT_EVENT_SET or
- *              BASE_JD_SOFT_EVENT_RESET
- * @flags:      reserved for future uses, must be set to 0
- *
- * This structure is used to update the status of a software event. If the
- * event's status is set to BASE_JD_SOFT_EVENT_SET, any job currently waiting
- * on this event will complete.
- */
-struct kbase_uk_soft_event_update {
-	union uk_header header;
-	/* IN */
-	u64 evt;
-	u32 new_status;
-	u32 flags;
-};
-
-/**
- * struct kbase_uk_mem_jit_init - User/Kernel space data exchange structure
- * @header:     UK structure header
- * @va_pages:   Number of virtual pages required for JIT
- *
- * This structure is used when requesting initialization of JIT.
- */
-struct kbase_uk_mem_jit_init {
-	union uk_header header;
-	/* IN */
-	u64 va_pages;
-};
-
-enum kbase_uk_function_id {
-	KBASE_FUNC_MEM_ALLOC = (UK_FUNC_ID + 0),
-	KBASE_FUNC_MEM_IMPORT = (UK_FUNC_ID + 1),
-	KBASE_FUNC_MEM_COMMIT = (UK_FUNC_ID + 2),
-	KBASE_FUNC_MEM_QUERY = (UK_FUNC_ID + 3),
-	KBASE_FUNC_MEM_FREE = (UK_FUNC_ID + 4),
-	KBASE_FUNC_MEM_FLAGS_CHANGE = (UK_FUNC_ID + 5),
-	KBASE_FUNC_MEM_ALIAS = (UK_FUNC_ID + 6),
-
-	/* UK_FUNC_ID + 7 not in use since BASE_LEGACY_UK6_SUPPORT dropped */
-
-	KBASE_FUNC_SYNC  = (UK_FUNC_ID + 8),
-
-	KBASE_FUNC_POST_TERM = (UK_FUNC_ID + 9),
-
-	KBASE_FUNC_HWCNT_SETUP = (UK_FUNC_ID + 10),
-	KBASE_FUNC_HWCNT_DUMP = (UK_FUNC_ID + 11),
-	KBASE_FUNC_HWCNT_CLEAR = (UK_FUNC_ID + 12),
-
-	KBASE_FUNC_GPU_PROPS_REG_DUMP = (UK_FUNC_ID + 14),
-
-	KBASE_FUNC_FIND_CPU_OFFSET = (UK_FUNC_ID + 15),
-
-	KBASE_FUNC_GET_VERSION = (UK_FUNC_ID + 16),
-	KBASE_FUNC_SET_FLAGS = (UK_FUNC_ID + 18),
-
-	KBASE_FUNC_SET_TEST_DATA = (UK_FUNC_ID + 19),
-	KBASE_FUNC_INJECT_ERROR = (UK_FUNC_ID + 20),
-	KBASE_FUNC_MODEL_CONTROL = (UK_FUNC_ID + 21),
-
-	/* UK_FUNC_ID + 22 not in use since BASE_LEGACY_UK8_SUPPORT dropped */
-
-	KBASE_FUNC_FENCE_VALIDATE = (UK_FUNC_ID + 23),
-	KBASE_FUNC_STREAM_CREATE = (UK_FUNC_ID + 24),
-	KBASE_FUNC_GET_PROFILING_CONTROLS = (UK_FUNC_ID + 25),
-	KBASE_FUNC_SET_PROFILING_CONTROLS = (UK_FUNC_ID + 26),
-					    /* to be used only for testing
-					    * purposes, otherwise these controls
-					    * are set through gator API */
-
-	KBASE_FUNC_DEBUGFS_MEM_PROFILE_ADD = (UK_FUNC_ID + 27),
-	KBASE_FUNC_JOB_SUBMIT = (UK_FUNC_ID + 28),
-	KBASE_FUNC_DISJOINT_QUERY = (UK_FUNC_ID + 29),
-
-	KBASE_FUNC_GET_CONTEXT_ID = (UK_FUNC_ID + 31),
-
-	KBASE_FUNC_TLSTREAM_ACQUIRE_V10_4 = (UK_FUNC_ID + 32),
-#if MALI_UNIT_TEST
-	KBASE_FUNC_TLSTREAM_TEST = (UK_FUNC_ID + 33),
-	KBASE_FUNC_TLSTREAM_STATS = (UK_FUNC_ID + 34),
-#endif /* MALI_UNIT_TEST */
-	KBASE_FUNC_TLSTREAM_FLUSH = (UK_FUNC_ID + 35),
-
-	KBASE_FUNC_HWCNT_READER_SETUP = (UK_FUNC_ID + 36),
-
-#ifdef SUPPORT_MALI_NO_MALI
-	KBASE_FUNC_SET_PRFCNT_VALUES = (UK_FUNC_ID + 37),
-#endif
-
-	KBASE_FUNC_SOFT_EVENT_UPDATE = (UK_FUNC_ID + 38),
-
-	KBASE_FUNC_MEM_JIT_INIT = (UK_FUNC_ID + 39),
-
-	KBASE_FUNC_TLSTREAM_ACQUIRE = (UK_FUNC_ID + 40),
-
-	KBASE_FUNC_MAX
-};
-
-#endif				/* _KBASE_UKU_H_ */
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_utility.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_utility.c
deleted file mode 100644
index be474ff87401..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_utility.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2013, 2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#include <mali_kbase.h>
-
-bool kbasep_list_member_of(const struct list_head *base, struct list_head *entry)
-{
-	struct list_head *pos = base->next;
-
-	while (pos != base) {
-		if (pos == entry)
-			return true;
-
-		pos = pos->next;
-	}
-	return false;
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_utility.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_utility.h
deleted file mode 100644
index fd7252dab0de..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_utility.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2013, 2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#ifndef _KBASE_UTILITY_H
-#define _KBASE_UTILITY_H
-
-#ifndef _KBASE_H_
-#error "Don't include this file directly, use mali_kbase.h instead"
-#endif
-
-/** Test whether the given list entry is a member of the given list.
- *
- * @param base      The head of the list to be tested
- * @param entry     The list entry to be tested
- *
- * @return          true if entry is a member of base
- *                  false otherwise
- */
-bool kbasep_list_member_of(const struct list_head *base, struct list_head *entry);
-
-#endif				/* _KBASE_UTILITY_H */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_vinstr.c b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_vinstr.c
deleted file mode 100644
index 9c5b2e46c0e5..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_vinstr.c
+++ /dev/null
@@ -1,2072 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <linux/anon_inodes.h>
-#include <linux/atomic.h>
-#include <linux/hrtimer.h>
-#include <linux/jiffies.h>
-#include <linux/kthread.h>
-#include <linux/list.h>
-#include <linux/mm.h>
-#include <linux/poll.h>
-#include <linux/preempt.h>
-#include <linux/slab.h>
-#include <linux/wait.h>
-
-#include <mali_kbase.h>
-#include <mali_kbase_hwaccess_instr.h>
-#include <mali_kbase_hwaccess_jm.h>
-#include <mali_kbase_hwcnt_reader.h>
-#include <mali_kbase_mem_linux.h>
-#include <mali_kbase_tlstream.h>
-
-/*****************************************************************************/
-
-/* Hwcnt reader API version */
-#define HWCNT_READER_API        1
-
-/* The number of nanoseconds in a second. */
-#define NSECS_IN_SEC            1000000000ull /* ns */
-
-/* The time resolution of dumping service. */
-#define DUMPING_RESOLUTION      500000ull /* ns */
-
-/* The maximal supported number of dumping buffers. */
-#define MAX_BUFFER_COUNT        32
-
-/* Size and number of hw counters blocks. */
-#define NR_CNT_BLOCKS_PER_GROUP 8
-#define NR_CNT_PER_BLOCK        64
-#define NR_BYTES_PER_CNT        4
-#define NR_BYTES_PER_HDR        16
-#define PRFCNT_EN_MASK_OFFSET   0x8
-
-/*****************************************************************************/
-
-enum {
-	SHADER_HWCNT_BM,
-	TILER_HWCNT_BM,
-	MMU_L2_HWCNT_BM,
-	JM_HWCNT_BM
-};
-
-enum vinstr_state {
-	VINSTR_IDLE,
-	VINSTR_DUMPING,
-	VINSTR_SUSPENDING,
-	VINSTR_SUSPENDED,
-	VINSTR_RESUMING
-};
-
-/**
- * struct kbase_vinstr_context - vinstr context per device
- * @lock:              protects the entire vinstr context
- * @kbdev:             pointer to kbase device
- * @kctx:              pointer to kbase context
- * @vmap:              vinstr vmap for mapping hwcnt dump buffer
- * @gpu_va:            GPU hwcnt dump buffer address
- * @cpu_va:            the CPU side mapping of the hwcnt dump buffer
- * @dump_size:         size of the dump buffer in bytes
- * @bitmap:            current set of counters monitored, not always in sync
- *                     with hardware
- * @reprogram:         when true, reprogram hwcnt block with the new set of
- *                     counters
- * @state:             vinstr state
- * @state_lock:        protects information about vinstr state
- * @suspend_waitq:     notification queue to trigger state re-validation
- * @suspend_cnt:       reference counter of vinstr's suspend state
- * @suspend_work:      worker to execute on entering suspended state
- * @resume_work:       worker to execute on leaving suspended state
- * @nclients:          number of attached clients, pending or otherwise
- * @waiting_clients:   head of list of clients being periodically sampled
- * @idle_clients:      head of list of clients being idle
- * @suspended_clients: head of list of clients being suspended
- * @thread:            periodic sampling thread
- * @waitq:             notification queue of sampling thread
- * @request_pending:   request for action for sampling thread
- * @clients_present:   when true, we have at least one client
- *                     Note: this variable is in sync. with nclients and is
- *                     present to preserve simplicity. Protected by state_lock.
- */
-struct kbase_vinstr_context {
-	struct mutex             lock;
-	struct kbase_device      *kbdev;
-	struct kbase_context     *kctx;
-
-	struct kbase_vmap_struct vmap;
-	u64                      gpu_va;
-	void                     *cpu_va;
-	size_t                   dump_size;
-	u32                      bitmap[4];
-	bool                     reprogram;
-
-	enum vinstr_state        state;
-	struct spinlock          state_lock;
-	wait_queue_head_t        suspend_waitq;
-	unsigned int             suspend_cnt;
-	struct work_struct       suspend_work;
-	struct work_struct       resume_work;
-
-	u32                      nclients;
-	struct list_head         waiting_clients;
-	struct list_head         idle_clients;
-	struct list_head         suspended_clients;
-
-	struct task_struct       *thread;
-	wait_queue_head_t        waitq;
-	atomic_t                 request_pending;
-
-	bool                     clients_present;
-};
-
-/**
- * struct kbase_vinstr_client - a vinstr client attached to a vinstr context
- * @vinstr_ctx:    vinstr context client is attached to
- * @list:          node used to attach this client to list in vinstr context
- * @buffer_count:  number of buffers this client is using
- * @event_mask:    events this client reacts to
- * @dump_size:     size of one dump buffer in bytes
- * @bitmap:        bitmap request for JM, TILER, SHADER and MMU counters
- * @legacy_buffer: userspace hwcnt dump buffer (legacy interface)
- * @kernel_buffer: kernel hwcnt dump buffer (kernel client interface)
- * @accum_buffer:  temporary accumulation buffer for preserving counters
- * @dump_time:     next time this clients shall request hwcnt dump
- * @dump_interval: interval between periodic hwcnt dumps
- * @dump_buffers:  kernel hwcnt dump buffers allocated by this client
- * @dump_buffers_meta: metadata of dump buffers
- * @meta_idx:      index of metadata being accessed by userspace
- * @read_idx:      index of buffer read by userspace
- * @write_idx:     index of buffer being written by dumping service
- * @waitq:         client's notification queue
- * @pending:       when true, client has attached but hwcnt not yet updated
- */
-struct kbase_vinstr_client {
-	struct kbase_vinstr_context        *vinstr_ctx;
-	struct list_head                   list;
-	unsigned int                       buffer_count;
-	u32                                event_mask;
-	size_t                             dump_size;
-	u32                                bitmap[4];
-	void __user                        *legacy_buffer;
-	void                               *kernel_buffer;
-	void                               *accum_buffer;
-	u64                                dump_time;
-	u32                                dump_interval;
-	char                               *dump_buffers;
-	struct kbase_hwcnt_reader_metadata *dump_buffers_meta;
-	atomic_t                           meta_idx;
-	atomic_t                           read_idx;
-	atomic_t                           write_idx;
-	wait_queue_head_t                  waitq;
-	bool                               pending;
-};
-
-/**
- * struct kbasep_vinstr_wake_up_timer - vinstr service thread wake up timer
- * @hrtimer:    high resolution timer
- * @vinstr_ctx: vinstr context
- */
-struct kbasep_vinstr_wake_up_timer {
-	struct hrtimer              hrtimer;
-	struct kbase_vinstr_context *vinstr_ctx;
-};
-
-/*****************************************************************************/
-
-static int kbasep_vinstr_service_task(void *data);
-
-static unsigned int kbasep_vinstr_hwcnt_reader_poll(
-		struct file *filp,
-		poll_table  *wait);
-static long kbasep_vinstr_hwcnt_reader_ioctl(
-		struct file   *filp,
-		unsigned int  cmd,
-		unsigned long arg);
-static int kbasep_vinstr_hwcnt_reader_mmap(
-		struct file           *filp,
-		struct vm_area_struct *vma);
-static int kbasep_vinstr_hwcnt_reader_release(
-		struct inode *inode,
-		struct file  *filp);
-
-/* The timeline stream file operations structure. */
-static const struct file_operations vinstr_client_fops = {
-	.poll           = kbasep_vinstr_hwcnt_reader_poll,
-	.unlocked_ioctl = kbasep_vinstr_hwcnt_reader_ioctl,
-	.compat_ioctl   = kbasep_vinstr_hwcnt_reader_ioctl,
-	.mmap           = kbasep_vinstr_hwcnt_reader_mmap,
-	.release        = kbasep_vinstr_hwcnt_reader_release,
-};
-
-/*****************************************************************************/
-
-static int enable_hwcnt(struct kbase_vinstr_context *vinstr_ctx)
-{
-	struct kbase_context *kctx = vinstr_ctx->kctx;
-	struct kbase_device *kbdev = kctx->kbdev;
-	struct kbase_uk_hwcnt_setup setup;
-	int err;
-
-	setup.dump_buffer = vinstr_ctx->gpu_va;
-	setup.jm_bm       = vinstr_ctx->bitmap[JM_HWCNT_BM];
-	setup.tiler_bm    = vinstr_ctx->bitmap[TILER_HWCNT_BM];
-	setup.shader_bm   = vinstr_ctx->bitmap[SHADER_HWCNT_BM];
-	setup.mmu_l2_bm   = vinstr_ctx->bitmap[MMU_L2_HWCNT_BM];
-
-	/* Mark the context as active so the GPU is kept turned on */
-	/* A suspend won't happen here, because we're in a syscall from a
-	 * userspace thread. */
-	kbase_pm_context_active(kbdev);
-
-	/* Schedule the context in */
-	kbasep_js_schedule_privileged_ctx(kbdev, kctx);
-	err = kbase_instr_hwcnt_enable_internal(kbdev, kctx, &setup);
-	if (err) {
-		/* Release the context. This had its own Power Manager Active
-		 * reference */
-		kbasep_js_release_privileged_ctx(kbdev, kctx);
-
-		/* Also release our Power Manager Active reference */
-		kbase_pm_context_idle(kbdev);
-	}
-
-	return err;
-}
-
-static void disable_hwcnt(struct kbase_vinstr_context *vinstr_ctx)
-{
-	struct kbase_context *kctx = vinstr_ctx->kctx;
-	struct kbase_device *kbdev = kctx->kbdev;
-	int err;
-
-	err = kbase_instr_hwcnt_disable_internal(kctx);
-	if (err) {
-		dev_warn(kbdev->dev, "Failed to disable HW counters (ctx:%p)",
-				kctx);
-		return;
-	}
-
-	/* Release the context. This had its own Power Manager Active reference. */
-	kbasep_js_release_privileged_ctx(kbdev, kctx);
-
-	/* Also release our Power Manager Active reference. */
-	kbase_pm_context_idle(kbdev);
-
-	dev_dbg(kbdev->dev, "HW counters dumping disabled for context %p", kctx);
-}
-
-static int reprogram_hwcnt(struct kbase_vinstr_context *vinstr_ctx)
-{
-	disable_hwcnt(vinstr_ctx);
-	return enable_hwcnt(vinstr_ctx);
-}
-
-static void hwcnt_bitmap_set(u32 dst[4], u32 src[4])
-{
-	dst[JM_HWCNT_BM]     = src[JM_HWCNT_BM];
-	dst[TILER_HWCNT_BM]  = src[TILER_HWCNT_BM];
-	dst[SHADER_HWCNT_BM] = src[SHADER_HWCNT_BM];
-	dst[MMU_L2_HWCNT_BM] = src[MMU_L2_HWCNT_BM];
-}
-
-static void hwcnt_bitmap_union(u32 dst[4], u32 src[4])
-{
-	dst[JM_HWCNT_BM]     |= src[JM_HWCNT_BM];
-	dst[TILER_HWCNT_BM]  |= src[TILER_HWCNT_BM];
-	dst[SHADER_HWCNT_BM] |= src[SHADER_HWCNT_BM];
-	dst[MMU_L2_HWCNT_BM] |= src[MMU_L2_HWCNT_BM];
-}
-
-size_t kbase_vinstr_dump_size(struct kbase_device *kbdev)
-{
-	size_t dump_size;
-
-#ifndef CONFIG_MALI_BIFROST_NO_MALI
-	if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_V4)) {
-		u32 nr_cg;
-
-		nr_cg = kbdev->gpu_props.num_core_groups;
-		dump_size = nr_cg * NR_CNT_BLOCKS_PER_GROUP *
-				NR_CNT_PER_BLOCK *
-				NR_BYTES_PER_CNT;
-	} else
-#endif /* CONFIG_MALI_BIFROST_NO_MALI */
-	{
-		/* assume v5 for now */
-		base_gpu_props *props = &kbdev->gpu_props.props;
-		u32 nr_l2 = props->l2_props.num_l2_slices;
-		u64 core_mask = props->coherency_info.group[0].core_mask;
-		u32 nr_blocks = fls64(core_mask);
-
-		/* JM and tiler counter blocks are always present */
-		dump_size = (2 + nr_l2 + nr_blocks) *
-				NR_CNT_PER_BLOCK *
-				NR_BYTES_PER_CNT;
-	}
-	return dump_size;
-}
-KBASE_EXPORT_TEST_API(kbase_vinstr_dump_size);
-
-static size_t kbasep_vinstr_dump_size_ctx(
-		struct kbase_vinstr_context *vinstr_ctx)
-{
-	return kbase_vinstr_dump_size(vinstr_ctx->kctx->kbdev);
-}
-
-static int kbasep_vinstr_map_kernel_dump_buffer(
-		struct kbase_vinstr_context *vinstr_ctx)
-{
-	struct kbase_va_region *reg;
-	struct kbase_context *kctx = vinstr_ctx->kctx;
-	u64 flags, nr_pages;
-
-	flags = BASE_MEM_PROT_CPU_RD | BASE_MEM_PROT_GPU_WR;
-	vinstr_ctx->dump_size = kbasep_vinstr_dump_size_ctx(vinstr_ctx);
-	nr_pages = PFN_UP(vinstr_ctx->dump_size);
-
-	reg = kbase_mem_alloc(kctx, nr_pages, nr_pages, 0, &flags,
-			&vinstr_ctx->gpu_va);
-	if (!reg)
-		return -ENOMEM;
-
-	vinstr_ctx->cpu_va = kbase_vmap(
-			kctx,
-			vinstr_ctx->gpu_va,
-			vinstr_ctx->dump_size,
-			&vinstr_ctx->vmap);
-	if (!vinstr_ctx->cpu_va) {
-		kbase_mem_free(kctx, vinstr_ctx->gpu_va);
-		return -ENOMEM;
-	}
-
-	return 0;
-}
-
-static void kbasep_vinstr_unmap_kernel_dump_buffer(
-		struct kbase_vinstr_context *vinstr_ctx)
-{
-	struct kbase_context *kctx = vinstr_ctx->kctx;
-
-	kbase_vunmap(kctx, &vinstr_ctx->vmap);
-	kbase_mem_free(kctx, vinstr_ctx->gpu_va);
-}
-
-/**
- * kbasep_vinstr_create_kctx - create kernel context for vinstr
- * @vinstr_ctx: vinstr context
- * Return: zero on success
- */
-static int kbasep_vinstr_create_kctx(struct kbase_vinstr_context *vinstr_ctx)
-{
-	struct kbase_device *kbdev = vinstr_ctx->kbdev;
-	struct kbasep_kctx_list_element *element = NULL;
-	unsigned long flags;
-	bool enable_backend = false;
-	int err;
-
-	vinstr_ctx->kctx = kbase_create_context(vinstr_ctx->kbdev, true);
-	if (!vinstr_ctx->kctx)
-		return -ENOMEM;
-
-	/* Map the master kernel dump buffer.  The HW dumps the counters
-	 * into this memory region. */
-	err = kbasep_vinstr_map_kernel_dump_buffer(vinstr_ctx);
-	if (err)
-		goto failed_map;
-
-	/* Add kernel context to list of contexts associated with device. */
-	element = kzalloc(sizeof(*element), GFP_KERNEL);
-	if (element) {
-		element->kctx = vinstr_ctx->kctx;
-		mutex_lock(&kbdev->kctx_list_lock);
-		list_add(&element->link, &kbdev->kctx_list);
-
-		/* Inform timeline client about new context.
-		 * Do this while holding the lock to avoid tracepoint
-		 * being created in both body and summary stream. */
-		KBASE_TLSTREAM_TL_NEW_CTX(
-				vinstr_ctx->kctx,
-				vinstr_ctx->kctx->id,
-				(u32)(vinstr_ctx->kctx->tgid));
-
-		mutex_unlock(&kbdev->kctx_list_lock);
-	} else {
-		/* Don't treat this as a fail - just warn about it. */
-		dev_warn(kbdev->dev,
-				"couldn't add kctx to kctx_list\n");
-	}
-
-	/* Don't enable hardware counters if vinstr is suspended.
-	 * Note that vinstr resume code is run under vinstr context lock,
-	 * lower layer will be enabled as needed on resume. */
-	spin_lock_irqsave(&vinstr_ctx->state_lock, flags);
-	if (VINSTR_IDLE == vinstr_ctx->state)
-		enable_backend = true;
-	vinstr_ctx->clients_present = true;
-	spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags);
-	if (enable_backend)
-		err = enable_hwcnt(vinstr_ctx);
-	if (err)
-		goto failed_enable;
-
-	vinstr_ctx->thread = kthread_run(
-			kbasep_vinstr_service_task,
-			vinstr_ctx,
-			"mali_vinstr_service");
-	if (IS_ERR(vinstr_ctx->thread)) {
-		err = PTR_ERR(vinstr_ctx->thread);
-		goto failed_kthread;
-	}
-
-	return 0;
-
-failed_kthread:
-	disable_hwcnt(vinstr_ctx);
-failed_enable:
-	spin_lock_irqsave(&vinstr_ctx->state_lock, flags);
-	vinstr_ctx->clients_present = false;
-	spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags);
-	kbasep_vinstr_unmap_kernel_dump_buffer(vinstr_ctx);
-	if (element) {
-		mutex_lock(&kbdev->kctx_list_lock);
-		list_del(&element->link);
-		kfree(element);
-		mutex_unlock(&kbdev->kctx_list_lock);
-		KBASE_TLSTREAM_TL_DEL_CTX(vinstr_ctx->kctx);
-	}
-failed_map:
-	kbase_destroy_context(vinstr_ctx->kctx);
-	vinstr_ctx->kctx = NULL;
-	return err;
-}
-
-/**
- * kbasep_vinstr_destroy_kctx - destroy vinstr's kernel context
- * @vinstr_ctx: vinstr context
- */
-static void kbasep_vinstr_destroy_kctx(struct kbase_vinstr_context *vinstr_ctx)
-{
-	struct kbase_device             *kbdev = vinstr_ctx->kbdev;
-	struct kbasep_kctx_list_element *element;
-	struct kbasep_kctx_list_element *tmp;
-	bool                            found = false;
-	unsigned long                   flags;
-
-	/* Release hw counters dumping resources. */
-	vinstr_ctx->thread = NULL;
-	disable_hwcnt(vinstr_ctx);
-	kbasep_vinstr_unmap_kernel_dump_buffer(vinstr_ctx);
-
-	/* Simplify state transitions by specifying that we have no clients. */
-	spin_lock_irqsave(&vinstr_ctx->state_lock, flags);
-	vinstr_ctx->clients_present = false;
-	spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags);
-
-	/* Remove kernel context from the device's contexts list. */
-	mutex_lock(&kbdev->kctx_list_lock);
-	list_for_each_entry_safe(element, tmp, &kbdev->kctx_list, link) {
-		if (element->kctx == vinstr_ctx->kctx) {
-			list_del(&element->link);
-			kfree(element);
-			found = true;
-		}
-	}
-	mutex_unlock(&kbdev->kctx_list_lock);
-
-	if (!found)
-		dev_warn(kbdev->dev, "kctx not in kctx_list\n");
-
-	/* Destroy context. */
-	kbase_destroy_context(vinstr_ctx->kctx);
-
-	/* Inform timeline client about context destruction. */
-	KBASE_TLSTREAM_TL_DEL_CTX(vinstr_ctx->kctx);
-
-	vinstr_ctx->kctx = NULL;
-}
-
-/**
- * kbasep_vinstr_attach_client - Attach a client to the vinstr core
- * @vinstr_ctx:    vinstr context
- * @buffer_count:  requested number of dump buffers
- * @bitmap:        bitmaps describing which counters should be enabled
- * @argp:          pointer where notification descriptor shall be stored
- * @kernel_buffer: pointer to kernel side buffer
- *
- * Return: vinstr opaque client handle or NULL on failure
- */
-static struct kbase_vinstr_client *kbasep_vinstr_attach_client(
-		struct kbase_vinstr_context *vinstr_ctx, u32 buffer_count,
-		u32 bitmap[4], void *argp, void *kernel_buffer)
-{
-	struct task_struct         *thread = NULL;
-	struct kbase_vinstr_client *cli;
-
-	KBASE_DEBUG_ASSERT(vinstr_ctx);
-
-	if (buffer_count > MAX_BUFFER_COUNT
-	    || (buffer_count & (buffer_count - 1)))
-		return NULL;
-
-	cli = kzalloc(sizeof(*cli), GFP_KERNEL);
-	if (!cli)
-		return NULL;
-
-	cli->vinstr_ctx   = vinstr_ctx;
-	cli->buffer_count = buffer_count;
-	cli->event_mask   =
-		(1 << BASE_HWCNT_READER_EVENT_MANUAL) |
-		(1 << BASE_HWCNT_READER_EVENT_PERIODIC);
-	cli->pending      = true;
-
-	hwcnt_bitmap_set(cli->bitmap, bitmap);
-
-	mutex_lock(&vinstr_ctx->lock);
-
-	hwcnt_bitmap_union(vinstr_ctx->bitmap, cli->bitmap);
-	vinstr_ctx->reprogram = true;
-
-	/* If this is the first client, create the vinstr kbase
-	 * context. This context is permanently resident until the
-	 * last client exits. */
-	if (!vinstr_ctx->nclients) {
-		hwcnt_bitmap_set(vinstr_ctx->bitmap, cli->bitmap);
-		if (kbasep_vinstr_create_kctx(vinstr_ctx) < 0)
-			goto error;
-
-		vinstr_ctx->reprogram = false;
-		cli->pending = false;
-	}
-
-	/* The GPU resets the counter block every time there is a request
-	 * to dump it. We need a per client kernel buffer for accumulating
-	 * the counters. */
-	cli->dump_size    = kbasep_vinstr_dump_size_ctx(vinstr_ctx);
-	cli->accum_buffer = kzalloc(cli->dump_size, GFP_KERNEL);
-	if (!cli->accum_buffer)
-		goto error;
-
-	/* Prepare buffers. */
-	if (cli->buffer_count) {
-		int *fd = (int *)argp;
-		size_t tmp;
-
-		/* Allocate area for buffers metadata storage. */
-		tmp = sizeof(struct kbase_hwcnt_reader_metadata) *
-			cli->buffer_count;
-		cli->dump_buffers_meta = kmalloc(tmp, GFP_KERNEL);
-		if (!cli->dump_buffers_meta)
-			goto error;
-
-		/* Allocate required number of dumping buffers. */
-		cli->dump_buffers = (char *)__get_free_pages(
-				GFP_KERNEL | __GFP_ZERO,
-				get_order(cli->dump_size * cli->buffer_count));
-		if (!cli->dump_buffers)
-			goto error;
-
-		/* Create descriptor for user-kernel data exchange. */
-		*fd = anon_inode_getfd(
-				"[mali_vinstr_desc]",
-				&vinstr_client_fops,
-				cli,
-				O_RDONLY | O_CLOEXEC);
-		if (0 > *fd)
-			goto error;
-	} else if (kernel_buffer) {
-		cli->kernel_buffer = kernel_buffer;
-	} else {
-		cli->legacy_buffer = (void __user *)argp;
-	}
-
-	atomic_set(&cli->read_idx, 0);
-	atomic_set(&cli->meta_idx, 0);
-	atomic_set(&cli->write_idx, 0);
-	init_waitqueue_head(&cli->waitq);
-
-	vinstr_ctx->nclients++;
-	list_add(&cli->list, &vinstr_ctx->idle_clients);
-
-	mutex_unlock(&vinstr_ctx->lock);
-
-	return cli;
-
-error:
-	kfree(cli->dump_buffers_meta);
-	if (cli->dump_buffers)
-		free_pages(
-				(unsigned long)cli->dump_buffers,
-				get_order(cli->dump_size * cli->buffer_count));
-	kfree(cli->accum_buffer);
-	if (!vinstr_ctx->nclients && vinstr_ctx->kctx) {
-		thread = vinstr_ctx->thread;
-		kbasep_vinstr_destroy_kctx(vinstr_ctx);
-	}
-	kfree(cli);
-
-	mutex_unlock(&vinstr_ctx->lock);
-
-	/* Thread must be stopped after lock is released. */
-	if (thread)
-		kthread_stop(thread);
-
-	return NULL;
-}
-
-void kbase_vinstr_detach_client(struct kbase_vinstr_client *cli)
-{
-	struct kbase_vinstr_context *vinstr_ctx;
-	struct kbase_vinstr_client  *iter, *tmp;
-	struct task_struct          *thread = NULL;
-	u32 zerobitmap[4] = { 0 };
-	int cli_found = 0;
-
-	KBASE_DEBUG_ASSERT(cli);
-	vinstr_ctx = cli->vinstr_ctx;
-	KBASE_DEBUG_ASSERT(vinstr_ctx);
-
-	mutex_lock(&vinstr_ctx->lock);
-
-	list_for_each_entry_safe(iter, tmp, &vinstr_ctx->idle_clients, list) {
-		if (iter == cli) {
-			vinstr_ctx->reprogram = true;
-			cli_found = 1;
-			list_del(&iter->list);
-			break;
-		}
-	}
-	if (!cli_found) {
-		list_for_each_entry_safe(
-				iter, tmp, &vinstr_ctx->waiting_clients, list) {
-			if (iter == cli) {
-				vinstr_ctx->reprogram = true;
-				cli_found = 1;
-				list_del(&iter->list);
-				break;
-			}
-		}
-	}
-	KBASE_DEBUG_ASSERT(cli_found);
-
-	kfree(cli->dump_buffers_meta);
-	free_pages(
-			(unsigned long)cli->dump_buffers,
-			get_order(cli->dump_size * cli->buffer_count));
-	kfree(cli->accum_buffer);
-	kfree(cli);
-
-	vinstr_ctx->nclients--;
-	if (!vinstr_ctx->nclients) {
-		thread = vinstr_ctx->thread;
-		kbasep_vinstr_destroy_kctx(vinstr_ctx);
-	}
-
-	/* Rebuild context bitmap now that the client has detached */
-	hwcnt_bitmap_set(vinstr_ctx->bitmap, zerobitmap);
-	list_for_each_entry(iter, &vinstr_ctx->idle_clients, list)
-		hwcnt_bitmap_union(vinstr_ctx->bitmap, iter->bitmap);
-	list_for_each_entry(iter, &vinstr_ctx->waiting_clients, list)
-		hwcnt_bitmap_union(vinstr_ctx->bitmap, iter->bitmap);
-
-	mutex_unlock(&vinstr_ctx->lock);
-
-	/* Thread must be stopped after lock is released. */
-	if (thread)
-		kthread_stop(thread);
-}
-KBASE_EXPORT_TEST_API(kbase_vinstr_detach_client);
-
-/* Accumulate counters in the dump buffer */
-static void accum_dump_buffer(void *dst, void *src, size_t dump_size)
-{
-	size_t block_size = NR_CNT_PER_BLOCK * NR_BYTES_PER_CNT;
-	u32 *d = dst;
-	u32 *s = src;
-	size_t i, j;
-
-	for (i = 0; i < dump_size; i += block_size) {
-		/* skip over the header block */
-		d += NR_BYTES_PER_HDR / sizeof(u32);
-		s += NR_BYTES_PER_HDR / sizeof(u32);
-		for (j = 0; j < (block_size - NR_BYTES_PER_HDR) / sizeof(u32); j++) {
-			/* saturate result if addition would result in wraparound */
-			if (U32_MAX - *d < *s)
-				*d = U32_MAX;
-			else
-				*d += *s;
-			d++;
-			s++;
-		}
-	}
-}
-
-/* This is the Midgard v4 patch function.  It copies the headers for each
- * of the defined blocks from the master kernel buffer and then patches up
- * the performance counter enable mask for each of the blocks to exclude
- * counters that were not requested by the client. */
-static void patch_dump_buffer_hdr_v4(
-		struct kbase_vinstr_context *vinstr_ctx,
-		struct kbase_vinstr_client *cli)
-{
-	u32 *mask;
-	u8 *dst = cli->accum_buffer;
-	u8 *src = vinstr_ctx->cpu_va;
-	u32 nr_cg = vinstr_ctx->kctx->kbdev->gpu_props.num_core_groups;
-	size_t i, group_size, group;
-	enum {
-		SC0_BASE    = 0 * NR_CNT_PER_BLOCK * NR_BYTES_PER_CNT,
-		SC1_BASE    = 1 * NR_CNT_PER_BLOCK * NR_BYTES_PER_CNT,
-		SC2_BASE    = 2 * NR_CNT_PER_BLOCK * NR_BYTES_PER_CNT,
-		SC3_BASE    = 3 * NR_CNT_PER_BLOCK * NR_BYTES_PER_CNT,
-		TILER_BASE  = 4 * NR_CNT_PER_BLOCK * NR_BYTES_PER_CNT,
-		MMU_L2_BASE = 5 * NR_CNT_PER_BLOCK * NR_BYTES_PER_CNT,
-		JM_BASE     = 7 * NR_CNT_PER_BLOCK * NR_BYTES_PER_CNT
-	};
-
-	group_size = NR_CNT_BLOCKS_PER_GROUP *
-			NR_CNT_PER_BLOCK *
-			NR_BYTES_PER_CNT;
-	for (i = 0; i < nr_cg; i++) {
-		group = i * group_size;
-		/* copy shader core headers */
-		memcpy(&dst[group + SC0_BASE], &src[group + SC0_BASE],
-		       NR_BYTES_PER_HDR);
-		memcpy(&dst[group + SC1_BASE], &src[group + SC1_BASE],
-		       NR_BYTES_PER_HDR);
-		memcpy(&dst[group + SC2_BASE], &src[group + SC2_BASE],
-		      NR_BYTES_PER_HDR);
-		memcpy(&dst[group + SC3_BASE], &src[group + SC3_BASE],
-		      NR_BYTES_PER_HDR);
-
-		/* copy tiler header */
-		memcpy(&dst[group + TILER_BASE], &src[group + TILER_BASE],
-		      NR_BYTES_PER_HDR);
-
-		/* copy mmu header */
-		memcpy(&dst[group + MMU_L2_BASE], &src[group + MMU_L2_BASE],
-		      NR_BYTES_PER_HDR);
-
-		/* copy job manager header */
-		memcpy(&dst[group + JM_BASE], &src[group + JM_BASE],
-		      NR_BYTES_PER_HDR);
-
-		/* patch the shader core enable mask */
-		mask = (u32 *)&dst[group + SC0_BASE + PRFCNT_EN_MASK_OFFSET];
-		*mask &= cli->bitmap[SHADER_HWCNT_BM];
-		mask = (u32 *)&dst[group + SC1_BASE + PRFCNT_EN_MASK_OFFSET];
-		*mask &= cli->bitmap[SHADER_HWCNT_BM];
-		mask = (u32 *)&dst[group + SC2_BASE + PRFCNT_EN_MASK_OFFSET];
-		*mask &= cli->bitmap[SHADER_HWCNT_BM];
-		mask = (u32 *)&dst[group + SC3_BASE + PRFCNT_EN_MASK_OFFSET];
-		*mask &= cli->bitmap[SHADER_HWCNT_BM];
-
-		/* patch the tiler core enable mask */
-		mask = (u32 *)&dst[group + TILER_BASE + PRFCNT_EN_MASK_OFFSET];
-		*mask &= cli->bitmap[TILER_HWCNT_BM];
-
-		/* patch the mmu core enable mask */
-		mask = (u32 *)&dst[group + MMU_L2_BASE + PRFCNT_EN_MASK_OFFSET];
-		*mask &= cli->bitmap[MMU_L2_HWCNT_BM];
-
-		/* patch the job manager enable mask */
-		mask = (u32 *)&dst[group + JM_BASE + PRFCNT_EN_MASK_OFFSET];
-		*mask &= cli->bitmap[JM_HWCNT_BM];
-	}
-}
-
-/* This is the Midgard v5 patch function.  It copies the headers for each
- * of the defined blocks from the master kernel buffer and then patches up
- * the performance counter enable mask for each of the blocks to exclude
- * counters that were not requested by the client. */
-static void patch_dump_buffer_hdr_v5(
-		struct kbase_vinstr_context *vinstr_ctx,
-		struct kbase_vinstr_client *cli)
-{
-	struct kbase_device *kbdev = vinstr_ctx->kctx->kbdev;
-	u32 i, nr_l2;
-	u64 core_mask;
-	u32 *mask;
-	u8 *dst = cli->accum_buffer;
-	u8 *src = vinstr_ctx->cpu_va;
-	size_t block_size = NR_CNT_PER_BLOCK * NR_BYTES_PER_CNT;
-
-	/* copy and patch job manager header */
-	memcpy(dst, src, NR_BYTES_PER_HDR);
-	mask = (u32 *)&dst[PRFCNT_EN_MASK_OFFSET];
-	*mask &= cli->bitmap[JM_HWCNT_BM];
-	dst += block_size;
-	src += block_size;
-
-	/* copy and patch tiler header */
-	memcpy(dst, src, NR_BYTES_PER_HDR);
-	mask = (u32 *)&dst[PRFCNT_EN_MASK_OFFSET];
-	*mask &= cli->bitmap[TILER_HWCNT_BM];
-	dst += block_size;
-	src += block_size;
-
-	/* copy and patch MMU/L2C headers */
-	nr_l2 = kbdev->gpu_props.props.l2_props.num_l2_slices;
-	for (i = 0; i < nr_l2; i++) {
-		memcpy(dst, src, NR_BYTES_PER_HDR);
-		mask = (u32 *)&dst[PRFCNT_EN_MASK_OFFSET];
-		*mask &= cli->bitmap[MMU_L2_HWCNT_BM];
-		dst += block_size;
-		src += block_size;
-	}
-
-	/* copy and patch shader core headers */
-	core_mask = kbdev->gpu_props.props.coherency_info.group[0].core_mask;
-	while (0ull != core_mask) {
-		memcpy(dst, src, NR_BYTES_PER_HDR);
-		if (0ull != (core_mask & 1ull)) {
-			/* if block is not reserved update header */
-			mask = (u32 *)&dst[PRFCNT_EN_MASK_OFFSET];
-			*mask &= cli->bitmap[SHADER_HWCNT_BM];
-		}
-		dst += block_size;
-		src += block_size;
-
-		core_mask >>= 1;
-	}
-}
-
-/**
- * accum_clients - accumulate dumped hw counters for all known clients
- * @vinstr_ctx: vinstr context
- */
-static void accum_clients(struct kbase_vinstr_context *vinstr_ctx)
-{
-	struct kbase_vinstr_client *iter;
-	int v4 = 0;
-
-#ifndef CONFIG_MALI_BIFROST_NO_MALI
-	v4 = kbase_hw_has_feature(vinstr_ctx->kbdev, BASE_HW_FEATURE_V4);
-#endif
-
-	list_for_each_entry(iter, &vinstr_ctx->idle_clients, list) {
-		/* Don't bother accumulating clients whose hwcnt requests
-		 * have not yet been honoured. */
-		if (iter->pending)
-			continue;
-		if (v4)
-			patch_dump_buffer_hdr_v4(vinstr_ctx, iter);
-		else
-			patch_dump_buffer_hdr_v5(vinstr_ctx, iter);
-		accum_dump_buffer(
-				iter->accum_buffer,
-				vinstr_ctx->cpu_va,
-				iter->dump_size);
-	}
-	list_for_each_entry(iter, &vinstr_ctx->waiting_clients, list) {
-		/* Don't bother accumulating clients whose hwcnt requests
-		 * have not yet been honoured. */
-		if (iter->pending)
-			continue;
-		if (v4)
-			patch_dump_buffer_hdr_v4(vinstr_ctx, iter);
-		else
-			patch_dump_buffer_hdr_v5(vinstr_ctx, iter);
-		accum_dump_buffer(
-				iter->accum_buffer,
-				vinstr_ctx->cpu_va,
-				iter->dump_size);
-	}
-}
-
-/*****************************************************************************/
-
-/**
- * kbasep_vinstr_get_timestamp - return timestamp
- *
- * Function returns timestamp value based on raw monotonic timer. Value will
- * wrap around zero in case of overflow.
- *
- * Return: timestamp value
- */
-static u64 kbasep_vinstr_get_timestamp(void)
-{
-	struct timespec ts;
-
-	getrawmonotonic(&ts);
-	return (u64)ts.tv_sec * NSECS_IN_SEC + ts.tv_nsec;
-}
-
-/**
- * kbasep_vinstr_add_dump_request - register client's dumping request
- * @cli:             requesting client
- * @waiting_clients: list of pending dumping requests
- */
-static void kbasep_vinstr_add_dump_request(
-		struct kbase_vinstr_client *cli,
-		struct list_head *waiting_clients)
-{
-	struct kbase_vinstr_client *tmp;
-
-	if (list_empty(waiting_clients)) {
-		list_add(&cli->list, waiting_clients);
-		return;
-	}
-	list_for_each_entry(tmp, waiting_clients, list) {
-		if (tmp->dump_time > cli->dump_time) {
-			list_add_tail(&cli->list, &tmp->list);
-			return;
-		}
-	}
-	list_add_tail(&cli->list, waiting_clients);
-}
-
-/**
- * kbasep_vinstr_collect_and_accumulate - collect hw counters via low level
- *                                        dump and accumulate them for known
- *                                        clients
- * @vinstr_ctx: vinstr context
- * @timestamp: pointer where collection timestamp will be recorded
- *
- * Return: zero on success
- */
-static int kbasep_vinstr_collect_and_accumulate(
-		struct kbase_vinstr_context *vinstr_ctx, u64 *timestamp)
-{
-	unsigned long flags;
-	int rcode;
-
-#ifdef CONFIG_MALI_BIFROST_NO_MALI
-	/* The dummy model needs the CPU mapping. */
-	gpu_model_set_dummy_prfcnt_base_cpu(vinstr_ctx->cpu_va);
-#endif
-
-	spin_lock_irqsave(&vinstr_ctx->state_lock, flags);
-	if (VINSTR_IDLE != vinstr_ctx->state) {
-		spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags);
-		return -EAGAIN;
-	} else {
-		vinstr_ctx->state = VINSTR_DUMPING;
-	}
-	spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags);
-
-	/* Request HW counters dump.
-	 * Disable preemption to make dump timestamp more accurate. */
-	preempt_disable();
-	*timestamp = kbasep_vinstr_get_timestamp();
-	rcode = kbase_instr_hwcnt_request_dump(vinstr_ctx->kctx);
-	preempt_enable();
-
-	if (!rcode)
-		rcode = kbase_instr_hwcnt_wait_for_dump(vinstr_ctx->kctx);
-	WARN_ON(rcode);
-
-	spin_lock_irqsave(&vinstr_ctx->state_lock, flags);
-	switch (vinstr_ctx->state)
-	{
-	case VINSTR_SUSPENDING:
-		schedule_work(&vinstr_ctx->suspend_work);
-		break;
-	case VINSTR_DUMPING:
-		vinstr_ctx->state = VINSTR_IDLE;
-		wake_up_all(&vinstr_ctx->suspend_waitq);
-		break;
-	default:
-		break;
-	}
-	spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags);
-
-	/* Accumulate values of collected counters. */
-	if (!rcode)
-		accum_clients(vinstr_ctx);
-
-	return rcode;
-}
-
-/**
- * kbasep_vinstr_fill_dump_buffer - copy accumulated counters to empty kernel
- *                                  buffer
- * @cli:       requesting client
- * @timestamp: timestamp when counters were collected
- * @event_id:  id of event that caused triggered counters collection
- *
- * Return: zero on success
- */
-static int kbasep_vinstr_fill_dump_buffer(
-		struct kbase_vinstr_client *cli, u64 timestamp,
-		enum base_hwcnt_reader_event event_id)
-{
-	unsigned int write_idx = atomic_read(&cli->write_idx);
-	unsigned int read_idx  = atomic_read(&cli->read_idx);
-
-	struct kbase_hwcnt_reader_metadata *meta;
-	void                               *buffer;
-
-	/* Check if there is a place to copy HWC block into. */
-	if (write_idx - read_idx == cli->buffer_count)
-		return -1;
-	write_idx %= cli->buffer_count;
-
-	/* Fill in dump buffer and its metadata. */
-	buffer = &cli->dump_buffers[write_idx * cli->dump_size];
-	meta   = &cli->dump_buffers_meta[write_idx];
-	meta->timestamp  = timestamp;
-	meta->event_id   = event_id;
-	meta->buffer_idx = write_idx;
-	memcpy(buffer, cli->accum_buffer, cli->dump_size);
-	return 0;
-}
-
-/**
- * kbasep_vinstr_fill_dump_buffer_legacy - copy accumulated counters to buffer
- *                                         allocated in userspace
- * @cli: requesting client
- *
- * Return: zero on success
- *
- * This is part of legacy ioctl interface.
- */
-static int kbasep_vinstr_fill_dump_buffer_legacy(
-		struct kbase_vinstr_client *cli)
-{
-	void __user  *buffer = cli->legacy_buffer;
-	int          rcode;
-
-	/* Copy data to user buffer. */
-	rcode = copy_to_user(buffer, cli->accum_buffer, cli->dump_size);
-	if (rcode) {
-		pr_warn("error while copying buffer to user\n");
-		return -EFAULT;
-	}
-	return 0;
-}
-
-/**
- * kbasep_vinstr_fill_dump_buffer_kernel - copy accumulated counters to buffer
- *                                         allocated in kernel space
- * @cli: requesting client
- *
- * Return: zero on success
- *
- * This is part of the kernel client interface.
- */
-static int kbasep_vinstr_fill_dump_buffer_kernel(
-		struct kbase_vinstr_client *cli)
-{
-	memcpy(cli->kernel_buffer, cli->accum_buffer, cli->dump_size);
-
-	return 0;
-}
-
-/**
- * kbasep_vinstr_reprogram - reprogram hwcnt set collected by inst
- * @vinstr_ctx: vinstr context
- */
-static void kbasep_vinstr_reprogram(
-		struct kbase_vinstr_context *vinstr_ctx)
-{
-	unsigned long flags;
-	bool suspended = false;
-
-	/* Don't enable hardware counters if vinstr is suspended. */
-	spin_lock_irqsave(&vinstr_ctx->state_lock, flags);
-	if (VINSTR_IDLE != vinstr_ctx->state)
-		suspended = true;
-	spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags);
-	if (suspended)
-		return;
-
-	/* Change to suspended state is done while holding vinstr context
-	 * lock. Below code will then no re-enable the instrumentation. */
-
-	if (vinstr_ctx->reprogram) {
-		struct kbase_vinstr_client *iter;
-
-		if (!reprogram_hwcnt(vinstr_ctx)) {
-			vinstr_ctx->reprogram = false;
-			list_for_each_entry(
-					iter,
-					&vinstr_ctx->idle_clients,
-					list)
-				iter->pending = false;
-			list_for_each_entry(
-					iter,
-					&vinstr_ctx->waiting_clients,
-					list)
-				iter->pending = false;
-		}
-	}
-}
-
-/**
- * kbasep_vinstr_update_client - copy accumulated counters to user readable
- *                               buffer and notify the user
- * @cli:       requesting client
- * @timestamp: timestamp when counters were collected
- * @event_id:  id of event that caused triggered counters collection
- *
- * Return: zero on success
- */
-static int kbasep_vinstr_update_client(
-		struct kbase_vinstr_client *cli, u64 timestamp,
-		enum base_hwcnt_reader_event event_id)
-{
-	int rcode = 0;
-
-	/* Copy collected counters to user readable buffer. */
-	if (cli->buffer_count)
-		rcode = kbasep_vinstr_fill_dump_buffer(
-				cli, timestamp, event_id);
-	else if (cli->kernel_buffer)
-		rcode = kbasep_vinstr_fill_dump_buffer_kernel(cli);
-	else
-		rcode = kbasep_vinstr_fill_dump_buffer_legacy(cli);
-
-	if (rcode)
-		goto exit;
-
-
-	/* Notify client. Make sure all changes to memory are visible. */
-	wmb();
-	atomic_inc(&cli->write_idx);
-	wake_up_interruptible(&cli->waitq);
-
-	/* Prepare for next request. */
-	memset(cli->accum_buffer, 0, cli->dump_size);
-
-exit:
-	return rcode;
-}
-
-/**
- * kbasep_vinstr_wake_up_callback - vinstr wake up timer wake up function
- *
- * @hrtimer: high resolution timer
- *
- * Return: High resolution timer restart enum.
- */
-static enum hrtimer_restart kbasep_vinstr_wake_up_callback(
-		struct hrtimer *hrtimer)
-{
-	struct kbasep_vinstr_wake_up_timer *timer =
-		container_of(
-			hrtimer,
-			struct kbasep_vinstr_wake_up_timer,
-			hrtimer);
-
-	KBASE_DEBUG_ASSERT(timer);
-
-	atomic_set(&timer->vinstr_ctx->request_pending, 1);
-	wake_up_all(&timer->vinstr_ctx->waitq);
-
-	return HRTIMER_NORESTART;
-}
-
-/**
- * kbasep_vinstr_service_task - HWC dumping service thread
- *
- * @data: Pointer to vinstr context structure.
- *
- * Return: 0 on success; -ENOMEM if timer allocation fails
- */
-static int kbasep_vinstr_service_task(void *data)
-{
-	struct kbase_vinstr_context        *vinstr_ctx = data;
-	struct kbasep_vinstr_wake_up_timer *timer;
-
-	KBASE_DEBUG_ASSERT(vinstr_ctx);
-
-	timer = kmalloc(sizeof(*timer), GFP_KERNEL);
-
-	if (!timer) {
-		dev_warn(vinstr_ctx->kbdev->dev, "Timer allocation failed!\n");
-		return -ENOMEM;
-	}
-
-	hrtimer_init(&timer->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
-
-	timer->hrtimer.function = kbasep_vinstr_wake_up_callback;
-	timer->vinstr_ctx       = vinstr_ctx;
-
-	while (!kthread_should_stop()) {
-		struct kbase_vinstr_client *cli = NULL;
-		struct kbase_vinstr_client *tmp;
-		int                        rcode;
-
-		u64              timestamp = kbasep_vinstr_get_timestamp();
-		u64              dump_time = 0;
-		struct list_head expired_requests;
-
-		/* Hold lock while performing operations on lists of clients. */
-		mutex_lock(&vinstr_ctx->lock);
-
-		/* Closing thread must not interact with client requests. */
-		if (current == vinstr_ctx->thread) {
-			atomic_set(&vinstr_ctx->request_pending, 0);
-
-			if (!list_empty(&vinstr_ctx->waiting_clients)) {
-				cli = list_first_entry(
-						&vinstr_ctx->waiting_clients,
-						struct kbase_vinstr_client,
-						list);
-				dump_time = cli->dump_time;
-			}
-		}
-
-		if (!cli || ((s64)timestamp - (s64)dump_time < 0ll)) {
-			mutex_unlock(&vinstr_ctx->lock);
-
-			/* Sleep until next dumping event or service request. */
-			if (cli) {
-				u64 diff = dump_time - timestamp;
-
-				hrtimer_start(
-						&timer->hrtimer,
-						ns_to_ktime(diff),
-						HRTIMER_MODE_REL);
-			}
-			wait_event(
-					vinstr_ctx->waitq,
-					atomic_read(
-						&vinstr_ctx->request_pending) ||
-					kthread_should_stop());
-			hrtimer_cancel(&timer->hrtimer);
-			continue;
-		}
-
-		rcode = kbasep_vinstr_collect_and_accumulate(vinstr_ctx,
-				&timestamp);
-
-		INIT_LIST_HEAD(&expired_requests);
-
-		/* Find all expired requests. */
-		list_for_each_entry_safe(
-				cli,
-				tmp,
-				&vinstr_ctx->waiting_clients,
-				list) {
-			s64 tdiff =
-				(s64)(timestamp + DUMPING_RESOLUTION) -
-				(s64)cli->dump_time;
-			if (tdiff >= 0ll) {
-				list_del(&cli->list);
-				list_add(&cli->list, &expired_requests);
-			} else {
-				break;
-			}
-		}
-
-		/* Fill data for each request found. */
-		list_for_each_entry_safe(cli, tmp, &expired_requests, list) {
-			/* Ensure that legacy buffer will not be used from
-			 * this kthread context. */
-			BUG_ON(0 == cli->buffer_count);
-			/* Expect only periodically sampled clients. */
-			BUG_ON(0 == cli->dump_interval);
-
-			if (!rcode)
-				kbasep_vinstr_update_client(
-						cli,
-						timestamp,
-						BASE_HWCNT_READER_EVENT_PERIODIC);
-
-			/* Set new dumping time. Drop missed probing times. */
-			do {
-				cli->dump_time += cli->dump_interval;
-			} while (cli->dump_time < timestamp);
-
-			list_del(&cli->list);
-			kbasep_vinstr_add_dump_request(
-					cli,
-					&vinstr_ctx->waiting_clients);
-		}
-
-		/* Reprogram counters set if required. */
-		kbasep_vinstr_reprogram(vinstr_ctx);
-
-		mutex_unlock(&vinstr_ctx->lock);
-	}
-
-	kfree(timer);
-
-	return 0;
-}
-
-/*****************************************************************************/
-
-/**
- * kbasep_vinstr_hwcnt_reader_buffer_ready - check if client has ready buffers
- * @cli: pointer to vinstr client structure
- *
- * Return: non-zero if client has at least one dumping buffer filled that was
- *         not notified to user yet
- */
-static int kbasep_vinstr_hwcnt_reader_buffer_ready(
-		struct kbase_vinstr_client *cli)
-{
-	KBASE_DEBUG_ASSERT(cli);
-	return atomic_read(&cli->write_idx) != atomic_read(&cli->meta_idx);
-}
-
-/**
- * kbasep_vinstr_hwcnt_reader_ioctl_get_buffer - hwcnt reader's ioctl command
- * @cli:    pointer to vinstr client structure
- * @buffer: pointer to userspace buffer
- * @size:   size of buffer
- *
- * Return: zero on success
- */
-static long kbasep_vinstr_hwcnt_reader_ioctl_get_buffer(
-		struct kbase_vinstr_client *cli, void __user *buffer,
-		size_t size)
-{
-	unsigned int meta_idx = atomic_read(&cli->meta_idx);
-	unsigned int idx = meta_idx % cli->buffer_count;
-
-	struct kbase_hwcnt_reader_metadata *meta = &cli->dump_buffers_meta[idx];
-
-	/* Metadata sanity check. */
-	KBASE_DEBUG_ASSERT(idx == meta->buffer_idx);
-
-	if (sizeof(struct kbase_hwcnt_reader_metadata) != size)
-		return -EINVAL;
-
-	/* Check if there is any buffer available. */
-	if (atomic_read(&cli->write_idx) == meta_idx)
-		return -EAGAIN;
-
-	/* Check if previously taken buffer was put back. */
-	if (atomic_read(&cli->read_idx) != meta_idx)
-		return -EBUSY;
-
-	/* Copy next available buffer's metadata to user. */
-	if (copy_to_user(buffer, meta, size))
-		return -EFAULT;
-
-	atomic_inc(&cli->meta_idx);
-
-	return 0;
-}
-
-/**
- * kbasep_vinstr_hwcnt_reader_ioctl_put_buffer - hwcnt reader's ioctl command
- * @cli:    pointer to vinstr client structure
- * @buffer: pointer to userspace buffer
- * @size:   size of buffer
- *
- * Return: zero on success
- */
-static long kbasep_vinstr_hwcnt_reader_ioctl_put_buffer(
-		struct kbase_vinstr_client *cli, void __user *buffer,
-		size_t size)
-{
-	unsigned int read_idx = atomic_read(&cli->read_idx);
-	unsigned int idx = read_idx % cli->buffer_count;
-
-	struct kbase_hwcnt_reader_metadata meta;
-
-	if (sizeof(struct kbase_hwcnt_reader_metadata) != size)
-		return -EINVAL;
-
-	/* Check if any buffer was taken. */
-	if (atomic_read(&cli->meta_idx) == read_idx)
-		return -EPERM;
-
-	/* Check if correct buffer is put back. */
-	if (copy_from_user(&meta, buffer, size))
-		return -EFAULT;
-	if (idx != meta.buffer_idx)
-		return -EINVAL;
-
-	atomic_inc(&cli->read_idx);
-
-	return 0;
-}
-
-/**
- * kbasep_vinstr_hwcnt_reader_ioctl_set_interval - hwcnt reader's ioctl command
- * @cli:      pointer to vinstr client structure
- * @interval: periodic dumping interval (disable periodic dumping if zero)
- *
- * Return: zero on success
- */
-static long kbasep_vinstr_hwcnt_reader_ioctl_set_interval(
-		struct kbase_vinstr_client *cli, u32 interval)
-{
-	struct kbase_vinstr_context *vinstr_ctx = cli->vinstr_ctx;
-
-	KBASE_DEBUG_ASSERT(vinstr_ctx);
-
-	mutex_lock(&vinstr_ctx->lock);
-
-	list_del(&cli->list);
-
-	cli->dump_interval = interval;
-
-	/* If interval is non-zero, enable periodic dumping for this client. */
-	if (cli->dump_interval) {
-		if (DUMPING_RESOLUTION > cli->dump_interval)
-			cli->dump_interval = DUMPING_RESOLUTION;
-		cli->dump_time =
-			kbasep_vinstr_get_timestamp() + cli->dump_interval;
-
-		kbasep_vinstr_add_dump_request(
-				cli, &vinstr_ctx->waiting_clients);
-
-		atomic_set(&vinstr_ctx->request_pending, 1);
-		wake_up_all(&vinstr_ctx->waitq);
-	} else {
-		list_add(&cli->list, &vinstr_ctx->idle_clients);
-	}
-
-	mutex_unlock(&vinstr_ctx->lock);
-
-	return 0;
-}
-
-/**
- * kbasep_vinstr_hwcnt_reader_event_mask - return event mask for event id
- * @event_id: id of event
- * Return: event_mask or zero if event is not supported or maskable
- */
-static u32 kbasep_vinstr_hwcnt_reader_event_mask(
-		enum base_hwcnt_reader_event event_id)
-{
-	u32 event_mask = 0;
-
-	switch (event_id) {
-	case BASE_HWCNT_READER_EVENT_PREJOB:
-	case BASE_HWCNT_READER_EVENT_POSTJOB:
-		/* These event are maskable. */
-		event_mask = (1 << event_id);
-		break;
-
-	case BASE_HWCNT_READER_EVENT_MANUAL:
-	case BASE_HWCNT_READER_EVENT_PERIODIC:
-		/* These event are non-maskable. */
-	default:
-		/* These event are not supported. */
-		break;
-	}
-
-	return event_mask;
-}
-
-/**
- * kbasep_vinstr_hwcnt_reader_ioctl_enable_event - hwcnt reader's ioctl command
- * @cli:      pointer to vinstr client structure
- * @event_id: id of event to enable
- *
- * Return: zero on success
- */
-static long kbasep_vinstr_hwcnt_reader_ioctl_enable_event(
-		struct kbase_vinstr_client *cli,
-		enum base_hwcnt_reader_event event_id)
-{
-	struct kbase_vinstr_context *vinstr_ctx = cli->vinstr_ctx;
-	u32                         event_mask;
-
-	KBASE_DEBUG_ASSERT(vinstr_ctx);
-
-	event_mask = kbasep_vinstr_hwcnt_reader_event_mask(event_id);
-	if (!event_mask)
-		return -EINVAL;
-
-	mutex_lock(&vinstr_ctx->lock);
-	cli->event_mask |= event_mask;
-	mutex_unlock(&vinstr_ctx->lock);
-
-	return 0;
-}
-
-/**
- * kbasep_vinstr_hwcnt_reader_ioctl_disable_event - hwcnt reader's ioctl command
- * @cli:      pointer to vinstr client structure
- * @event_id: id of event to disable
- *
- * Return: zero on success
- */
-static long kbasep_vinstr_hwcnt_reader_ioctl_disable_event(
-		struct kbase_vinstr_client *cli,
-		enum base_hwcnt_reader_event event_id)
-{
-	struct kbase_vinstr_context *vinstr_ctx = cli->vinstr_ctx;
-	u32                         event_mask;
-
-	KBASE_DEBUG_ASSERT(vinstr_ctx);
-
-	event_mask = kbasep_vinstr_hwcnt_reader_event_mask(event_id);
-	if (!event_mask)
-		return -EINVAL;
-
-	mutex_lock(&vinstr_ctx->lock);
-	cli->event_mask &= ~event_mask;
-	mutex_unlock(&vinstr_ctx->lock);
-
-	return 0;
-}
-
-/**
- * kbasep_vinstr_hwcnt_reader_ioctl_get_hwver - hwcnt reader's ioctl command
- * @cli:   pointer to vinstr client structure
- * @hwver: pointer to user buffer where hw version will be stored
- *
- * Return: zero on success
- */
-static long kbasep_vinstr_hwcnt_reader_ioctl_get_hwver(
-		struct kbase_vinstr_client *cli, u32 __user *hwver)
-{
-#ifndef CONFIG_MALI_BIFROST_NO_MALI
-	struct kbase_vinstr_context *vinstr_ctx = cli->vinstr_ctx;
-#endif
-
-	u32                         ver = 5;
-
-#ifndef CONFIG_MALI_BIFROST_NO_MALI
-	KBASE_DEBUG_ASSERT(vinstr_ctx);
-	if (kbase_hw_has_feature(vinstr_ctx->kbdev, BASE_HW_FEATURE_V4))
-		ver = 4;
-#endif
-
-	return put_user(ver, hwver);
-}
-
-/**
- * kbasep_vinstr_hwcnt_reader_ioctl - hwcnt reader's ioctl
- * @filp:   pointer to file structure
- * @cmd:    user command
- * @arg:    command's argument
- *
- * Return: zero on success
- */
-static long kbasep_vinstr_hwcnt_reader_ioctl(struct file *filp,
-		unsigned int cmd, unsigned long arg)
-{
-	long                       rcode = 0;
-	struct kbase_vinstr_client *cli;
-
-	KBASE_DEBUG_ASSERT(filp);
-
-	cli = filp->private_data;
-	KBASE_DEBUG_ASSERT(cli);
-
-	if (unlikely(KBASE_HWCNT_READER != _IOC_TYPE(cmd)))
-		return -EINVAL;
-
-	switch (cmd) {
-	case KBASE_HWCNT_READER_GET_API_VERSION:
-		rcode = put_user(HWCNT_READER_API, (u32 __user *)arg);
-		break;
-	case KBASE_HWCNT_READER_GET_HWVER:
-		rcode = kbasep_vinstr_hwcnt_reader_ioctl_get_hwver(
-				cli, (u32 __user *)arg);
-		break;
-	case KBASE_HWCNT_READER_GET_BUFFER_SIZE:
-		KBASE_DEBUG_ASSERT(cli->vinstr_ctx);
-		rcode = put_user(
-				(u32)cli->vinstr_ctx->dump_size,
-				(u32 __user *)arg);
-		break;
-	case KBASE_HWCNT_READER_DUMP:
-		rcode = kbase_vinstr_hwc_dump(
-				cli, BASE_HWCNT_READER_EVENT_MANUAL);
-		break;
-	case KBASE_HWCNT_READER_CLEAR:
-		rcode = kbase_vinstr_hwc_clear(cli);
-		break;
-	case KBASE_HWCNT_READER_GET_BUFFER:
-		rcode = kbasep_vinstr_hwcnt_reader_ioctl_get_buffer(
-				cli, (void __user *)arg, _IOC_SIZE(cmd));
-		break;
-	case KBASE_HWCNT_READER_PUT_BUFFER:
-		rcode = kbasep_vinstr_hwcnt_reader_ioctl_put_buffer(
-				cli, (void __user *)arg, _IOC_SIZE(cmd));
-		break;
-	case KBASE_HWCNT_READER_SET_INTERVAL:
-		rcode = kbasep_vinstr_hwcnt_reader_ioctl_set_interval(
-				cli, (u32)arg);
-		break;
-	case KBASE_HWCNT_READER_ENABLE_EVENT:
-		rcode = kbasep_vinstr_hwcnt_reader_ioctl_enable_event(
-				cli, (enum base_hwcnt_reader_event)arg);
-		break;
-	case KBASE_HWCNT_READER_DISABLE_EVENT:
-		rcode = kbasep_vinstr_hwcnt_reader_ioctl_disable_event(
-				cli, (enum base_hwcnt_reader_event)arg);
-		break;
-	default:
-		rcode = -EINVAL;
-		break;
-	}
-
-	return rcode;
-}
-
-/**
- * kbasep_vinstr_hwcnt_reader_poll - hwcnt reader's poll
- * @filp: pointer to file structure
- * @wait: pointer to poll table
- * Return: POLLIN if data can be read without blocking, otherwise zero
- */
-static unsigned int kbasep_vinstr_hwcnt_reader_poll(struct file *filp,
-		poll_table *wait)
-{
-	struct kbase_vinstr_client *cli;
-
-	KBASE_DEBUG_ASSERT(filp);
-	KBASE_DEBUG_ASSERT(wait);
-
-	cli = filp->private_data;
-	KBASE_DEBUG_ASSERT(cli);
-
-	poll_wait(filp, &cli->waitq, wait);
-	if (kbasep_vinstr_hwcnt_reader_buffer_ready(cli))
-		return POLLIN;
-	return 0;
-}
-
-/**
- * kbasep_vinstr_hwcnt_reader_mmap - hwcnt reader's mmap
- * @filp: pointer to file structure
- * @vma:  pointer to vma structure
- * Return: zero on success
- */
-static int kbasep_vinstr_hwcnt_reader_mmap(struct file *filp,
-		struct vm_area_struct *vma)
-{
-	struct kbase_vinstr_client *cli;
-	unsigned long size, addr, pfn, offset;
-	unsigned long vm_size = vma->vm_end - vma->vm_start;
-
-	KBASE_DEBUG_ASSERT(filp);
-	KBASE_DEBUG_ASSERT(vma);
-
-	cli = filp->private_data;
-	KBASE_DEBUG_ASSERT(cli);
-
-	size = cli->buffer_count * cli->dump_size;
-
-	if (vma->vm_pgoff > (size >> PAGE_SHIFT))
-		return -EINVAL;
-
-	offset = vma->vm_pgoff << PAGE_SHIFT;
-	if (vm_size > size - offset)
-		return -EINVAL;
-
-	addr = __pa((unsigned long)cli->dump_buffers + offset);
-	pfn = addr >> PAGE_SHIFT;
-
-	return remap_pfn_range(
-			vma,
-			vma->vm_start,
-			pfn,
-			vm_size,
-			vma->vm_page_prot);
-}
-
-/**
- * kbasep_vinstr_hwcnt_reader_release - hwcnt reader's release
- * @inode: pointer to inode structure
- * @filp:  pointer to file structure
- * Return always return zero
- */
-static int kbasep_vinstr_hwcnt_reader_release(struct inode *inode,
-		struct file *filp)
-{
-	struct kbase_vinstr_client *cli;
-
-	KBASE_DEBUG_ASSERT(inode);
-	KBASE_DEBUG_ASSERT(filp);
-
-	cli = filp->private_data;
-	KBASE_DEBUG_ASSERT(cli);
-
-	kbase_vinstr_detach_client(cli);
-	return 0;
-}
-
-/*****************************************************************************/
-
-/**
- * kbasep_vinstr_kick_scheduler - trigger scheduler cycle
- * @kbdev: pointer to kbase device structure
- */
-static void kbasep_vinstr_kick_scheduler(struct kbase_device *kbdev)
-{
-	struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
-	unsigned long flags;
-
-	down(&js_devdata->schedule_sem);
-	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
-	kbase_backend_slot_update(kbdev);
-	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
-	up(&js_devdata->schedule_sem);
-}
-
-/**
- * kbasep_vinstr_suspend_worker - worker suspending vinstr module
- * @data: pointer to work structure
- */
-static void kbasep_vinstr_suspend_worker(struct work_struct *data)
-{
-	struct kbase_vinstr_context *vinstr_ctx;
-	unsigned long flags;
-
-	vinstr_ctx = container_of(data, struct kbase_vinstr_context,
-			suspend_work);
-
-	mutex_lock(&vinstr_ctx->lock);
-
-	if (vinstr_ctx->kctx)
-		disable_hwcnt(vinstr_ctx);
-
-	spin_lock_irqsave(&vinstr_ctx->state_lock, flags);
-	vinstr_ctx->state = VINSTR_SUSPENDED;
-	wake_up_all(&vinstr_ctx->suspend_waitq);
-	spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags);
-
-	mutex_unlock(&vinstr_ctx->lock);
-
-	/* Kick GPU scheduler to allow entering protected mode.
-	 * This must happen after vinstr was suspended. */
-	kbasep_vinstr_kick_scheduler(vinstr_ctx->kbdev);
-}
-
-/**
- * kbasep_vinstr_suspend_worker - worker resuming vinstr module
- * @data: pointer to work structure
- */
-static void kbasep_vinstr_resume_worker(struct work_struct *data)
-{
-	struct kbase_vinstr_context *vinstr_ctx;
-	unsigned long flags;
-
-	vinstr_ctx = container_of(data, struct kbase_vinstr_context,
-			resume_work);
-
-	mutex_lock(&vinstr_ctx->lock);
-
-	if (vinstr_ctx->kctx)
-		enable_hwcnt(vinstr_ctx);
-
-	spin_lock_irqsave(&vinstr_ctx->state_lock, flags);
-	vinstr_ctx->state = VINSTR_IDLE;
-	wake_up_all(&vinstr_ctx->suspend_waitq);
-	spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags);
-
-	mutex_unlock(&vinstr_ctx->lock);
-
-	/* Kick GPU scheduler to allow entering protected mode.
-	 * Note that scheduler state machine might requested re-entry to
-	 * protected mode before vinstr was resumed.
-	 * This must happen after vinstr was release. */
-	kbasep_vinstr_kick_scheduler(vinstr_ctx->kbdev);
-}
-
-/*****************************************************************************/
-
-struct kbase_vinstr_context *kbase_vinstr_init(struct kbase_device *kbdev)
-{
-	struct kbase_vinstr_context *vinstr_ctx;
-
-	vinstr_ctx = kzalloc(sizeof(*vinstr_ctx), GFP_KERNEL);
-	if (!vinstr_ctx)
-		return NULL;
-
-	INIT_LIST_HEAD(&vinstr_ctx->idle_clients);
-	INIT_LIST_HEAD(&vinstr_ctx->waiting_clients);
-	mutex_init(&vinstr_ctx->lock);
-	spin_lock_init(&vinstr_ctx->state_lock);
-	vinstr_ctx->kbdev = kbdev;
-	vinstr_ctx->thread = NULL;
-	vinstr_ctx->state = VINSTR_IDLE;
-	vinstr_ctx->suspend_cnt = 0;
-	INIT_WORK(&vinstr_ctx->suspend_work, kbasep_vinstr_suspend_worker);
-	INIT_WORK(&vinstr_ctx->resume_work, kbasep_vinstr_resume_worker);
-	init_waitqueue_head(&vinstr_ctx->suspend_waitq);
-
-	atomic_set(&vinstr_ctx->request_pending, 0);
-	init_waitqueue_head(&vinstr_ctx->waitq);
-
-	return vinstr_ctx;
-}
-
-void kbase_vinstr_term(struct kbase_vinstr_context *vinstr_ctx)
-{
-	struct kbase_vinstr_client *cli;
-
-	/* Stop service thread first. */
-	if (vinstr_ctx->thread)
-		kthread_stop(vinstr_ctx->thread);
-
-	/* Wait for workers. */
-	flush_work(&vinstr_ctx->suspend_work);
-	flush_work(&vinstr_ctx->resume_work);
-
-	while (1) {
-		struct list_head *list = &vinstr_ctx->idle_clients;
-
-		if (list_empty(list)) {
-			list = &vinstr_ctx->waiting_clients;
-			if (list_empty(list))
-				break;
-		}
-
-		cli = list_first_entry(list, struct kbase_vinstr_client, list);
-		list_del(&cli->list);
-		kfree(cli->accum_buffer);
-		kfree(cli);
-		vinstr_ctx->nclients--;
-	}
-	KBASE_DEBUG_ASSERT(!vinstr_ctx->nclients);
-	if (vinstr_ctx->kctx)
-		kbasep_vinstr_destroy_kctx(vinstr_ctx);
-	kfree(vinstr_ctx);
-}
-
-int kbase_vinstr_hwcnt_reader_setup(struct kbase_vinstr_context *vinstr_ctx,
-		struct kbase_uk_hwcnt_reader_setup *setup)
-{
-	struct kbase_vinstr_client  *cli;
-	u32                         bitmap[4];
-
-	KBASE_DEBUG_ASSERT(vinstr_ctx);
-	KBASE_DEBUG_ASSERT(setup);
-	KBASE_DEBUG_ASSERT(setup->buffer_count);
-
-	bitmap[SHADER_HWCNT_BM] = setup->shader_bm;
-	bitmap[TILER_HWCNT_BM]  = setup->tiler_bm;
-	bitmap[MMU_L2_HWCNT_BM] = setup->mmu_l2_bm;
-	bitmap[JM_HWCNT_BM]     = setup->jm_bm;
-
-	cli = kbasep_vinstr_attach_client(
-			vinstr_ctx,
-			setup->buffer_count,
-			bitmap,
-			&setup->fd,
-			NULL);
-
-	if (!cli)
-		return -ENOMEM;
-
-	return 0;
-}
-
-int kbase_vinstr_legacy_hwc_setup(
-		struct kbase_vinstr_context *vinstr_ctx,
-		struct kbase_vinstr_client  **cli,
-		struct kbase_uk_hwcnt_setup *setup)
-{
-	KBASE_DEBUG_ASSERT(vinstr_ctx);
-	KBASE_DEBUG_ASSERT(setup);
-	KBASE_DEBUG_ASSERT(cli);
-
-	if (setup->dump_buffer) {
-		u32 bitmap[4];
-
-		bitmap[SHADER_HWCNT_BM] = setup->shader_bm;
-		bitmap[TILER_HWCNT_BM]  = setup->tiler_bm;
-		bitmap[MMU_L2_HWCNT_BM] = setup->mmu_l2_bm;
-		bitmap[JM_HWCNT_BM]     = setup->jm_bm;
-
-		if (*cli)
-			return -EBUSY;
-
-		*cli = kbasep_vinstr_attach_client(
-				vinstr_ctx,
-				0,
-				bitmap,
-				(void *)(long)setup->dump_buffer,
-				NULL);
-
-		if (!(*cli))
-			return -ENOMEM;
-	} else {
-		if (!*cli)
-			return -EINVAL;
-
-		kbase_vinstr_detach_client(*cli);
-		*cli = NULL;
-	}
-
-	return 0;
-}
-
-struct kbase_vinstr_client *kbase_vinstr_hwcnt_kernel_setup(
-		struct kbase_vinstr_context *vinstr_ctx,
-		struct kbase_uk_hwcnt_reader_setup *setup,
-		void *kernel_buffer)
-{
-	u32 bitmap[4];
-
-	if (!vinstr_ctx || !setup || !kernel_buffer)
-		return NULL;
-
-	bitmap[SHADER_HWCNT_BM] = setup->shader_bm;
-	bitmap[TILER_HWCNT_BM]  = setup->tiler_bm;
-	bitmap[MMU_L2_HWCNT_BM] = setup->mmu_l2_bm;
-	bitmap[JM_HWCNT_BM]     = setup->jm_bm;
-
-	return kbasep_vinstr_attach_client(
-			vinstr_ctx,
-			0,
-			bitmap,
-			NULL,
-			kernel_buffer);
-}
-KBASE_EXPORT_TEST_API(kbase_vinstr_hwcnt_kernel_setup);
-
-int kbase_vinstr_hwc_dump(struct kbase_vinstr_client *cli,
-		enum base_hwcnt_reader_event event_id)
-{
-	int                         rcode = 0;
-	struct kbase_vinstr_context *vinstr_ctx;
-	u64                         timestamp;
-	u32                         event_mask;
-
-	if (!cli)
-		return -EINVAL;
-
-	vinstr_ctx = cli->vinstr_ctx;
-	KBASE_DEBUG_ASSERT(vinstr_ctx);
-
-	KBASE_DEBUG_ASSERT(event_id < BASE_HWCNT_READER_EVENT_COUNT);
-	event_mask = 1 << event_id;
-
-	mutex_lock(&vinstr_ctx->lock);
-
-	if (event_mask & cli->event_mask) {
-		rcode = kbasep_vinstr_collect_and_accumulate(
-				vinstr_ctx,
-				&timestamp);
-		if (rcode)
-			goto exit;
-
-		rcode = kbasep_vinstr_update_client(cli, timestamp, event_id);
-		if (rcode)
-			goto exit;
-
-		kbasep_vinstr_reprogram(vinstr_ctx);
-	}
-
-exit:
-	mutex_unlock(&vinstr_ctx->lock);
-
-	return rcode;
-}
-KBASE_EXPORT_TEST_API(kbase_vinstr_hwc_dump);
-
-int kbase_vinstr_hwc_clear(struct kbase_vinstr_client *cli)
-{
-	struct kbase_vinstr_context *vinstr_ctx;
-	int                         rcode;
-	u64                         unused;
-
-	if (!cli)
-		return -EINVAL;
-
-	vinstr_ctx = cli->vinstr_ctx;
-	KBASE_DEBUG_ASSERT(vinstr_ctx);
-
-	mutex_lock(&vinstr_ctx->lock);
-
-	rcode = kbasep_vinstr_collect_and_accumulate(vinstr_ctx, &unused);
-	if (rcode)
-		goto exit;
-	rcode = kbase_instr_hwcnt_clear(vinstr_ctx->kctx);
-	if (rcode)
-		goto exit;
-	memset(cli->accum_buffer, 0, cli->dump_size);
-
-	kbasep_vinstr_reprogram(vinstr_ctx);
-
-exit:
-	mutex_unlock(&vinstr_ctx->lock);
-
-	return rcode;
-}
-
-int kbase_vinstr_try_suspend(struct kbase_vinstr_context *vinstr_ctx)
-{
-	unsigned long flags;
-	int ret = -EAGAIN;
-
-	KBASE_DEBUG_ASSERT(vinstr_ctx);
-
-	spin_lock_irqsave(&vinstr_ctx->state_lock, flags);
-	switch (vinstr_ctx->state) {
-	case VINSTR_SUSPENDED:
-		vinstr_ctx->suspend_cnt++;
-		/* overflow shall not happen */
-		BUG_ON(0 == vinstr_ctx->suspend_cnt);
-		ret = 0;
-		break;
-
-	case VINSTR_IDLE:
-		if (vinstr_ctx->clients_present) {
-			vinstr_ctx->state = VINSTR_SUSPENDING;
-			schedule_work(&vinstr_ctx->suspend_work);
-		} else {
-			vinstr_ctx->state = VINSTR_SUSPENDED;
-
-			vinstr_ctx->suspend_cnt++;
-			/* overflow shall not happen */
-			WARN_ON(0 == vinstr_ctx->suspend_cnt);
-			ret = 0;
-		}
-		break;
-
-	case VINSTR_DUMPING:
-		vinstr_ctx->state = VINSTR_SUSPENDING;
-		break;
-
-	case VINSTR_SUSPENDING:
-		/* fall through */
-	case VINSTR_RESUMING:
-		break;
-
-	default:
-		BUG();
-		break;
-	}
-	spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags);
-
-	return ret;
-}
-
-void kbase_vinstr_suspend(struct kbase_vinstr_context *vinstr_ctx)
-{
-	wait_event(vinstr_ctx->suspend_waitq,
-			(0 == kbase_vinstr_try_suspend(vinstr_ctx)));
-}
-
-void kbase_vinstr_resume(struct kbase_vinstr_context *vinstr_ctx)
-{
-	unsigned long flags;
-
-	KBASE_DEBUG_ASSERT(vinstr_ctx);
-
-	spin_lock_irqsave(&vinstr_ctx->state_lock, flags);
-	BUG_ON(VINSTR_SUSPENDING == vinstr_ctx->state);
-	if (VINSTR_SUSPENDED == vinstr_ctx->state) {
-		BUG_ON(0 == vinstr_ctx->suspend_cnt);
-		vinstr_ctx->suspend_cnt--;
-		if (0 == vinstr_ctx->suspend_cnt) {
-			if (vinstr_ctx->clients_present) {
-				vinstr_ctx->state = VINSTR_RESUMING;
-				schedule_work(&vinstr_ctx->resume_work);
-			} else {
-				vinstr_ctx->state = VINSTR_IDLE;
-			}
-		}
-	}
-	spin_unlock_irqrestore(&vinstr_ctx->state_lock, flags);
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_vinstr.h b/drivers/gpu/arm/bifrost_for_linux/mali_kbase_vinstr.h
deleted file mode 100644
index 6207d25aef06..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_kbase_vinstr.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2015-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KBASE_VINSTR_H_
-#define _KBASE_VINSTR_H_
-
-#include <mali_kbase.h>
-#include <mali_kbase_hwcnt_reader.h>
-
-/*****************************************************************************/
-
-struct kbase_vinstr_context;
-struct kbase_vinstr_client;
-
-/*****************************************************************************/
-
-/**
- * kbase_vinstr_init() - initialize the vinstr core
- * @kbdev: kbase device
- *
- * Return: pointer to the vinstr context on success or NULL on failure
- */
-struct kbase_vinstr_context *kbase_vinstr_init(struct kbase_device *kbdev);
-
-/**
- * kbase_vinstr_term() - terminate the vinstr core
- * @vinstr_ctx: vinstr context
- */
-void kbase_vinstr_term(struct kbase_vinstr_context *vinstr_ctx);
-
-/**
- * kbase_vinstr_hwcnt_reader_setup - configure hw counters reader
- * @vinstr_ctx: vinstr context
- * @setup:      reader's configuration
- *
- * Return: zero on success
- */
-int kbase_vinstr_hwcnt_reader_setup(
-		struct kbase_vinstr_context        *vinstr_ctx,
-		struct kbase_uk_hwcnt_reader_setup *setup);
-
-/**
- * kbase_vinstr_legacy_hwc_setup - configure hw counters for dumping
- * @vinstr_ctx: vinstr context
- * @cli:        pointer where to store pointer to new vinstr client structure
- * @setup:      hwc configuration
- *
- * Return: zero on success
- */
-int kbase_vinstr_legacy_hwc_setup(
-		struct kbase_vinstr_context *vinstr_ctx,
-		struct kbase_vinstr_client  **cli,
-		struct kbase_uk_hwcnt_setup *setup);
-
-/**
- * kbase_vinstr_hwcnt_kernel_setup - configure hw counters for kernel side
- *                                   client
- * @vinstr_ctx:    vinstr context
- * @setup:         reader's configuration
- * @kernel_buffer: pointer to dump buffer
- *
- * setup->buffer_count and setup->fd are not used for kernel side clients.
- *
- * Return: pointer to client structure, or NULL on failure
- */
-struct kbase_vinstr_client *kbase_vinstr_hwcnt_kernel_setup(
-		struct kbase_vinstr_context *vinstr_ctx,
-		struct kbase_uk_hwcnt_reader_setup *setup,
-		void *kernel_buffer);
-
-/**
- * kbase_vinstr_hwc_dump - issue counter dump for vinstr client
- * @cli:      pointer to vinstr client
- * @event_id: id of event that triggered hwcnt dump
- *
- * Return: zero on success
- */
-int kbase_vinstr_hwc_dump(
-		struct kbase_vinstr_client   *cli,
-		enum base_hwcnt_reader_event event_id);
-
-/**
- * kbase_vinstr_hwc_clear - performs a reset of the hardware counters for
- *                          a given kbase context
- * @cli: pointer to vinstr client
- *
- * Return: zero on success
- */
-int kbase_vinstr_hwc_clear(struct kbase_vinstr_client *cli);
-
-/**
- * kbase_vinstr_try_suspend - try suspending operation of a given vinstr context
- * @vinstr_ctx: vinstr context
- *
- * Return: 0 on success, or negative if state change is in progress
- *
- * Warning: This API call is non-generic. It is meant to be used only by
- *          job scheduler state machine.
- *
- * Function initiates vinstr switch to suspended state. Once it was called
- * vinstr enters suspending state. If function return non-zero value, it
- * indicates that state switch is not complete and function must be called
- * again. On state switch vinstr will trigger job scheduler state machine
- * cycle.
- */
-int kbase_vinstr_try_suspend(struct kbase_vinstr_context *vinstr_ctx);
-
-/**
- * kbase_vinstr_suspend - suspends operation of a given vinstr context
- * @vinstr_ctx: vinstr context
- *
- * Function initiates vinstr switch to suspended state. Then it blocks until
- * operation is completed.
- */
-void kbase_vinstr_suspend(struct kbase_vinstr_context *vinstr_ctx);
-
-/**
- * kbase_vinstr_resume - resumes operation of a given vinstr context
- * @vinstr_ctx: vinstr context
- *
- * Function can be called only if it was preceded by a successful call
- * to kbase_vinstr_suspend.
- */
-void kbase_vinstr_resume(struct kbase_vinstr_context *vinstr_ctx);
-
-/**
- * kbase_vinstr_dump_size - Return required size of dump buffer
- * @kbdev: device pointer
- *
- * Return : buffer size in bytes
- */
-size_t kbase_vinstr_dump_size(struct kbase_device *kbdev);
-
-/**
- * kbase_vinstr_detach_client - Detach a client from the vinstr core
- * @cli: pointer to vinstr client
- */
-void kbase_vinstr_detach_client(struct kbase_vinstr_client *cli);
-
-#endif /* _KBASE_VINSTR_H_ */
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_linux_kbase_trace.h b/drivers/gpu/arm/bifrost_for_linux/mali_linux_kbase_trace.h
deleted file mode 100644
index 5d6b4021d626..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_linux_kbase_trace.h
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-#if !defined(_TRACE_MALI_KBASE_H) || defined(TRACE_HEADER_MULTI_READ)
-#define _TRACE_MALI_KBASE_H
-
-#undef TRACE_SYSTEM
-#define TRACE_SYSTEM mali
-
-#include <linux/tracepoint.h>
-
-DECLARE_EVENT_CLASS(mali_slot_template,
-	TP_PROTO(int jobslot, unsigned int info_val),
-	TP_ARGS(jobslot, info_val),
-	TP_STRUCT__entry(
-		__field(unsigned int, jobslot)
-		__field(unsigned int, info_val)
-	),
-	TP_fast_assign(
-		__entry->jobslot = jobslot;
-		__entry->info_val = info_val;
-	),
-	TP_printk("jobslot=%u info=%u", __entry->jobslot, __entry->info_val)
-);
-
-#define DEFINE_MALI_SLOT_EVENT(name) \
-DEFINE_EVENT(mali_slot_template, mali_##name, \
-	TP_PROTO(int jobslot, unsigned int info_val), \
-	TP_ARGS(jobslot, info_val))
-DEFINE_MALI_SLOT_EVENT(JM_SUBMIT);
-DEFINE_MALI_SLOT_EVENT(JM_JOB_DONE);
-DEFINE_MALI_SLOT_EVENT(JM_UPDATE_HEAD);
-DEFINE_MALI_SLOT_EVENT(JM_CHECK_HEAD);
-DEFINE_MALI_SLOT_EVENT(JM_SOFTSTOP);
-DEFINE_MALI_SLOT_EVENT(JM_SOFTSTOP_0);
-DEFINE_MALI_SLOT_EVENT(JM_SOFTSTOP_1);
-DEFINE_MALI_SLOT_EVENT(JM_HARDSTOP);
-DEFINE_MALI_SLOT_EVENT(JM_HARDSTOP_0);
-DEFINE_MALI_SLOT_EVENT(JM_HARDSTOP_1);
-DEFINE_MALI_SLOT_EVENT(JM_SLOT_SOFT_OR_HARD_STOP);
-DEFINE_MALI_SLOT_EVENT(JM_SLOT_EVICT);
-DEFINE_MALI_SLOT_EVENT(JM_BEGIN_RESET_WORKER);
-DEFINE_MALI_SLOT_EVENT(JM_END_RESET_WORKER);
-DEFINE_MALI_SLOT_EVENT(JS_CORE_REF_REGISTER_ON_RECHECK_FAILED);
-DEFINE_MALI_SLOT_EVENT(JS_AFFINITY_SUBMIT_TO_BLOCKED);
-DEFINE_MALI_SLOT_EVENT(JS_AFFINITY_CURRENT);
-DEFINE_MALI_SLOT_EVENT(JD_DONE_TRY_RUN_NEXT_JOB);
-DEFINE_MALI_SLOT_EVENT(JS_CORE_REF_REQUEST_CORES_FAILED);
-DEFINE_MALI_SLOT_EVENT(JS_CORE_REF_REGISTER_INUSE_FAILED);
-DEFINE_MALI_SLOT_EVENT(JS_CORE_REF_REQUEST_ON_RECHECK_FAILED);
-DEFINE_MALI_SLOT_EVENT(JS_CORE_REF_AFFINITY_WOULD_VIOLATE);
-DEFINE_MALI_SLOT_EVENT(JS_JOB_DONE_TRY_RUN_NEXT_JOB);
-DEFINE_MALI_SLOT_EVENT(JS_JOB_DONE_RETRY_NEEDED);
-DEFINE_MALI_SLOT_EVENT(JS_POLICY_DEQUEUE_JOB);
-DEFINE_MALI_SLOT_EVENT(JS_POLICY_DEQUEUE_JOB_IRQ);
-#undef DEFINE_MALI_SLOT_EVENT
-
-DECLARE_EVENT_CLASS(mali_refcount_template,
-	TP_PROTO(int refcount, unsigned int info_val),
-	TP_ARGS(refcount, info_val),
-	TP_STRUCT__entry(
-		__field(unsigned int, refcount)
-		__field(unsigned int, info_val)
-	),
-	TP_fast_assign(
-		__entry->refcount = refcount;
-		__entry->info_val = info_val;
-	),
-	TP_printk("refcount=%u info=%u", __entry->refcount, __entry->info_val)
-);
-
-#define DEFINE_MALI_REFCOUNT_EVENT(name) \
-DEFINE_EVENT(mali_refcount_template, mali_##name, \
-	TP_PROTO(int refcount, unsigned int info_val), \
-	TP_ARGS(refcount, info_val))
-DEFINE_MALI_REFCOUNT_EVENT(JS_RETAIN_CTX_NOLOCK);
-DEFINE_MALI_REFCOUNT_EVENT(JS_ADD_JOB);
-DEFINE_MALI_REFCOUNT_EVENT(JS_REMOVE_JOB);
-DEFINE_MALI_REFCOUNT_EVENT(JS_RETAIN_CTX);
-DEFINE_MALI_REFCOUNT_EVENT(JS_RELEASE_CTX);
-DEFINE_MALI_REFCOUNT_EVENT(JS_TRY_SCHEDULE_HEAD_CTX);
-DEFINE_MALI_REFCOUNT_EVENT(JS_POLICY_INIT_CTX);
-DEFINE_MALI_REFCOUNT_EVENT(JS_POLICY_TERM_CTX);
-DEFINE_MALI_REFCOUNT_EVENT(JS_POLICY_ENQUEUE_CTX);
-DEFINE_MALI_REFCOUNT_EVENT(JS_POLICY_DEQUEUE_HEAD_CTX);
-DEFINE_MALI_REFCOUNT_EVENT(JS_POLICY_TRY_EVICT_CTX);
-DEFINE_MALI_REFCOUNT_EVENT(JS_POLICY_RUNPOOL_ADD_CTX);
-DEFINE_MALI_REFCOUNT_EVENT(JS_POLICY_RUNPOOL_REMOVE_CTX);
-DEFINE_MALI_REFCOUNT_EVENT(JS_POLICY_FOREACH_CTX_JOBS);
-DEFINE_MALI_REFCOUNT_EVENT(PM_CONTEXT_ACTIVE);
-DEFINE_MALI_REFCOUNT_EVENT(PM_CONTEXT_IDLE);
-#undef DEFINE_MALI_REFCOUNT_EVENT
-
-DECLARE_EVENT_CLASS(mali_add_template,
-	TP_PROTO(int gpu_addr, unsigned int info_val),
-	TP_ARGS(gpu_addr, info_val),
-	TP_STRUCT__entry(
-		__field(unsigned int, gpu_addr)
-		__field(unsigned int, info_val)
-	),
-	TP_fast_assign(
-		__entry->gpu_addr = gpu_addr;
-		__entry->info_val = info_val;
-	),
-	TP_printk("gpu_addr=%u info=%u", __entry->gpu_addr, __entry->info_val)
-);
-
-#define DEFINE_MALI_ADD_EVENT(name) \
-DEFINE_EVENT(mali_add_template, mali_##name, \
-	TP_PROTO(int gpu_addr, unsigned int info_val), \
-	TP_ARGS(gpu_addr, info_val))
-DEFINE_MALI_ADD_EVENT(CORE_CTX_DESTROY);
-DEFINE_MALI_ADD_EVENT(CORE_CTX_HWINSTR_TERM);
-DEFINE_MALI_ADD_EVENT(CORE_GPU_IRQ);
-DEFINE_MALI_ADD_EVENT(CORE_GPU_IRQ_CLEAR);
-DEFINE_MALI_ADD_EVENT(CORE_GPU_IRQ_DONE);
-DEFINE_MALI_ADD_EVENT(CORE_GPU_SOFT_RESET);
-DEFINE_MALI_ADD_EVENT(CORE_GPU_HARD_RESET);
-DEFINE_MALI_ADD_EVENT(CORE_GPU_PRFCNT_SAMPLE);
-DEFINE_MALI_ADD_EVENT(CORE_GPU_PRFCNT_CLEAR);
-DEFINE_MALI_ADD_EVENT(CORE_GPU_CLEAN_INV_CACHES);
-DEFINE_MALI_ADD_EVENT(JD_DONE_WORKER);
-DEFINE_MALI_ADD_EVENT(JD_DONE_WORKER_END);
-DEFINE_MALI_ADD_EVENT(JD_CANCEL_WORKER);
-DEFINE_MALI_ADD_EVENT(JD_DONE);
-DEFINE_MALI_ADD_EVENT(JD_CANCEL);
-DEFINE_MALI_ADD_EVENT(JD_ZAP_CONTEXT);
-DEFINE_MALI_ADD_EVENT(JM_IRQ);
-DEFINE_MALI_ADD_EVENT(JM_IRQ_END);
-DEFINE_MALI_ADD_EVENT(JM_FLUSH_WORKQS);
-DEFINE_MALI_ADD_EVENT(JM_FLUSH_WORKQS_DONE);
-DEFINE_MALI_ADD_EVENT(JM_ZAP_NON_SCHEDULED);
-DEFINE_MALI_ADD_EVENT(JM_ZAP_SCHEDULED);
-DEFINE_MALI_ADD_EVENT(JM_ZAP_DONE);
-DEFINE_MALI_ADD_EVENT(JM_SUBMIT_AFTER_RESET);
-DEFINE_MALI_ADD_EVENT(JM_JOB_COMPLETE);
-DEFINE_MALI_ADD_EVENT(JS_FAST_START_EVICTS_CTX);
-DEFINE_MALI_ADD_EVENT(JS_CTX_ATTR_NOW_ON_RUNPOOL);
-DEFINE_MALI_ADD_EVENT(JS_CTX_ATTR_NOW_OFF_RUNPOOL);
-DEFINE_MALI_ADD_EVENT(JS_CTX_ATTR_NOW_ON_CTX);
-DEFINE_MALI_ADD_EVENT(JS_CTX_ATTR_NOW_OFF_CTX);
-DEFINE_MALI_ADD_EVENT(JS_POLICY_TIMER_END);
-DEFINE_MALI_ADD_EVENT(JS_POLICY_TIMER_START);
-DEFINE_MALI_ADD_EVENT(JS_POLICY_ENQUEUE_JOB);
-DEFINE_MALI_ADD_EVENT(PM_CORES_CHANGE_DESIRED);
-DEFINE_MALI_ADD_EVENT(PM_JOB_SUBMIT_AFTER_POWERING_UP);
-DEFINE_MALI_ADD_EVENT(PM_JOB_SUBMIT_AFTER_POWERED_UP);
-DEFINE_MALI_ADD_EVENT(PM_PWRON);
-DEFINE_MALI_ADD_EVENT(PM_PWRON_TILER);
-DEFINE_MALI_ADD_EVENT(PM_PWRON_L2);
-DEFINE_MALI_ADD_EVENT(PM_PWROFF);
-DEFINE_MALI_ADD_EVENT(PM_PWROFF_TILER);
-DEFINE_MALI_ADD_EVENT(PM_PWROFF_L2);
-DEFINE_MALI_ADD_EVENT(PM_CORES_POWERED);
-DEFINE_MALI_ADD_EVENT(PM_CORES_POWERED_TILER);
-DEFINE_MALI_ADD_EVENT(PM_CORES_POWERED_L2);
-DEFINE_MALI_ADD_EVENT(PM_DESIRED_REACHED);
-DEFINE_MALI_ADD_EVENT(PM_DESIRED_REACHED_TILER);
-DEFINE_MALI_ADD_EVENT(PM_UNREQUEST_CHANGE_SHADER_NEEDED);
-DEFINE_MALI_ADD_EVENT(PM_REQUEST_CHANGE_SHADER_NEEDED);
-DEFINE_MALI_ADD_EVENT(PM_REGISTER_CHANGE_SHADER_NEEDED);
-DEFINE_MALI_ADD_EVENT(PM_REGISTER_CHANGE_SHADER_INUSE);
-DEFINE_MALI_ADD_EVENT(PM_RELEASE_CHANGE_SHADER_INUSE);
-DEFINE_MALI_ADD_EVENT(PM_CORES_AVAILABLE);
-DEFINE_MALI_ADD_EVENT(PM_CORES_AVAILABLE_TILER);
-DEFINE_MALI_ADD_EVENT(PM_CORES_CHANGE_AVAILABLE);
-DEFINE_MALI_ADD_EVENT(PM_CORES_CHANGE_AVAILABLE_TILER);
-DEFINE_MALI_ADD_EVENT(PM_GPU_ON);
-DEFINE_MALI_ADD_EVENT(PM_GPU_OFF);
-DEFINE_MALI_ADD_EVENT(PM_SET_POLICY);
-DEFINE_MALI_ADD_EVENT(PM_CURRENT_POLICY_INIT);
-DEFINE_MALI_ADD_EVENT(PM_CURRENT_POLICY_TERM);
-DEFINE_MALI_ADD_EVENT(PM_CA_SET_POLICY);
-DEFINE_MALI_ADD_EVENT(PM_WAKE_WAITERS);
-#undef DEFINE_MALI_ADD_EVENT
-
-#endif /* _TRACE_MALI_KBASE_H */
-
-#undef TRACE_INCLUDE_PATH
-#undef linux
-#define TRACE_INCLUDE_PATH .
-#undef TRACE_INCLUDE_FILE
-#define TRACE_INCLUDE_FILE mali_linux_kbase_trace
-
-/* This part must be outside protection */
-#include <trace/define_trace.h>
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_linux_trace.h b/drivers/gpu/arm/bifrost_for_linux/mali_linux_trace.h
deleted file mode 100644
index 2be06a552768..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_linux_trace.h
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#if !defined(_TRACE_MALI_H) || defined(TRACE_HEADER_MULTI_READ)
-#define _TRACE_MALI_H
-
-#undef TRACE_SYSTEM
-#define TRACE_SYSTEM mali
-#define TRACE_INCLUDE_FILE mali_linux_trace
-
-#include <linux/tracepoint.h>
-
-#define MALI_JOB_SLOTS_EVENT_CHANGED
-
-/**
- * mali_job_slots_event - called from mali_kbase_core_linux.c
- * @event_id: ORed together bitfields representing a type of event, made with the GATOR_MAKE_EVENT() macro.
- */
-TRACE_EVENT(mali_job_slots_event,
-	TP_PROTO(unsigned int event_id, unsigned int tgid, unsigned int pid,
-			unsigned char job_id),
-	TP_ARGS(event_id, tgid, pid, job_id),
-	TP_STRUCT__entry(
-		__field(unsigned int, event_id)
-		__field(unsigned int, tgid)
-		__field(unsigned int, pid)
-		__field(unsigned char, job_id)
-	),
-	TP_fast_assign(
-		__entry->event_id = event_id;
-		__entry->tgid = tgid;
-		__entry->pid = pid;
-		__entry->job_id = job_id;
-	),
-	TP_printk("event=%u tgid=%u pid=%u job_id=%u",
-		__entry->event_id, __entry->tgid, __entry->pid, __entry->job_id)
-);
-
-/**
- * mali_pm_status - Called by mali_kbase_pm_driver.c
- * @event_id: core type (shader, tiler, l2 cache)
- * @value: 64bits bitmask reporting either power status of the cores (1-ON, 0-OFF)
- */
-TRACE_EVENT(mali_pm_status,
-	TP_PROTO(unsigned int event_id, unsigned long long value),
-	TP_ARGS(event_id, value),
-	TP_STRUCT__entry(
-		__field(unsigned int, event_id)
-		__field(unsigned long long, value)
-	),
-	TP_fast_assign(
-		__entry->event_id = event_id;
-		__entry->value = value;
-	),
-	TP_printk("event %u = %llu", __entry->event_id, __entry->value)
-);
-
-/**
- * mali_pm_power_on - Called by mali_kbase_pm_driver.c
- * @event_id: core type (shader, tiler, l2 cache)
- * @value: 64bits bitmask reporting the cores to power up
- */
-TRACE_EVENT(mali_pm_power_on,
-	TP_PROTO(unsigned int event_id, unsigned long long value),
-	TP_ARGS(event_id, value),
-	TP_STRUCT__entry(
-		__field(unsigned int, event_id)
-		__field(unsigned long long, value)
-	),
-	TP_fast_assign(
-		__entry->event_id = event_id;
-		__entry->value = value;
-	),
-	TP_printk("event %u = %llu", __entry->event_id, __entry->value)
-);
-
-/**
- * mali_pm_power_off - Called by mali_kbase_pm_driver.c
- * @event_id: core type (shader, tiler, l2 cache)
- * @value: 64bits bitmask reporting the cores to power down
- */
-TRACE_EVENT(mali_pm_power_off,
-	TP_PROTO(unsigned int event_id, unsigned long long value),
-	TP_ARGS(event_id, value),
-	TP_STRUCT__entry(
-		__field(unsigned int, event_id)
-		__field(unsigned long long, value)
-	),
-	TP_fast_assign(
-		__entry->event_id = event_id;
-		__entry->value = value;
-	),
-	TP_printk("event %u = %llu", __entry->event_id, __entry->value)
-);
-
-/**
- * mali_page_fault_insert_pages - Called by page_fault_worker()
- * it reports an MMU page fault resulting in new pages being mapped.
- * @event_id: MMU address space number.
- * @value: number of newly allocated pages
- */
-TRACE_EVENT(mali_page_fault_insert_pages,
-	TP_PROTO(int event_id, unsigned long value),
-	TP_ARGS(event_id, value),
-	TP_STRUCT__entry(
-		__field(int, event_id)
-		__field(unsigned long, value)
-	),
-	TP_fast_assign(
-		__entry->event_id = event_id;
-		__entry->value = value;
-	),
-	TP_printk("event %d = %lu", __entry->event_id, __entry->value)
-);
-
-/**
- * mali_mmu_as_in_use - Called by assign_and_activate_kctx_addr_space()
- * it reports that a certain MMU address space is in use now.
- * @event_id: MMU address space number.
- */
-TRACE_EVENT(mali_mmu_as_in_use,
-	TP_PROTO(int event_id),
-	TP_ARGS(event_id),
-	TP_STRUCT__entry(
-		__field(int, event_id)
-	),
-	TP_fast_assign(
-		__entry->event_id = event_id;
-	),
-	TP_printk("event=%d", __entry->event_id)
-);
-
-/**
- * mali_mmu_as_released - Called by kbasep_js_runpool_release_ctx_internal()
- * it reports that a certain MMU address space has been released now.
- * @event_id: MMU address space number.
- */
-TRACE_EVENT(mali_mmu_as_released,
-	TP_PROTO(int event_id),
-	TP_ARGS(event_id),
-	TP_STRUCT__entry(
-		__field(int, event_id)
-	),
-	TP_fast_assign(
-		__entry->event_id = event_id;
-	),
-	TP_printk("event=%d", __entry->event_id)
-);
-
-/**
- * mali_total_alloc_pages_change - Called by kbase_atomic_add_pages()
- *                                 and by kbase_atomic_sub_pages()
- * it reports that the total number of allocated pages is changed.
- * @event_id: number of pages to be added or subtracted (according to the sign).
- */
-TRACE_EVENT(mali_total_alloc_pages_change,
-	TP_PROTO(long long int event_id),
-	TP_ARGS(event_id),
-	TP_STRUCT__entry(
-		__field(long long int, event_id)
-	),
-	TP_fast_assign(
-		__entry->event_id = event_id;
-	),
-	TP_printk("event=%lld", __entry->event_id)
-);
-
-#endif				/*  _TRACE_MALI_H */
-
-#undef TRACE_INCLUDE_PATH
-#undef linux
-#define TRACE_INCLUDE_PATH .
-
-/* This part must be outside protection */
-#include <trace/define_trace.h>
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_malisw.h b/drivers/gpu/arm/bifrost_for_linux/mali_malisw.h
deleted file mode 100644
index 99452933eab4..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_malisw.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/**
- * Kernel-wide include for common macros and types.
- */
-
-#ifndef _MALISW_H_
-#define _MALISW_H_
-
-#include <linux/version.h>
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)
-#define U8_MAX          ((u8)~0U)
-#define S8_MAX          ((s8)(U8_MAX>>1))
-#define S8_MIN          ((s8)(-S8_MAX - 1))
-#define U16_MAX         ((u16)~0U)
-#define S16_MAX         ((s16)(U16_MAX>>1))
-#define S16_MIN         ((s16)(-S16_MAX - 1))
-#define U32_MAX         ((u32)~0U)
-#define S32_MAX         ((s32)(U32_MAX>>1))
-#define S32_MIN         ((s32)(-S32_MAX - 1))
-#define U64_MAX         ((u64)~0ULL)
-#define S64_MAX         ((s64)(U64_MAX>>1))
-#define S64_MIN         ((s64)(-S64_MAX - 1))
-#endif /* LINUX_VERSION_CODE */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 5, 0)
-#define SIZE_MAX        (~(size_t)0)
-#endif /* LINUX_VERSION_CODE */
-
-/**
- * MIN - Return the lesser of two values.
- *
- * As a macro it may evaluate its arguments more than once.
- * Refer to MAX macro for more details
- */
-#define MIN(x, y)	((x) < (y) ? (x) : (y))
-
-/**
- * MAX -  Return the greater of two values.
- *
- * As a macro it may evaluate its arguments more than once.
- * If called on the same two arguments as MIN it is guaranteed to return
- * the one that MIN didn't return. This is significant for types where not
- * all values are comparable e.g. NaNs in floating-point types. But if you want
- * to retrieve the min and max of two values, consider using a conditional swap
- * instead.
- */
-#define MAX(x, y)	((x) < (y) ? (y) : (x))
-
-/**
- * @hideinitializer
- * Function-like macro for suppressing unused variable warnings. Where possible
- * such variables should be removed; this macro is present for cases where we
- * much support API backwards compatibility.
- */
-#define CSTD_UNUSED(x)	((void)(x))
-
-/**
- * @hideinitializer
- * Function-like macro for use where "no behavior" is desired. This is useful
- * when compile time macros turn a function-like macro in to a no-op, but
- * where having no statement is otherwise invalid.
- */
-#define CSTD_NOP(...)	((void)#__VA_ARGS__)
-
-/**
- * Function-like macro for converting a pointer in to a u64 for storing into
- * an external data structure. This is commonly used when pairing a 32-bit
- * CPU with a 64-bit peripheral, such as a Midgard GPU. C's type promotion
- * is complex and a straight cast does not work reliably as pointers are
- * often considered as signed.
- */
-#define PTR_TO_U64(x)	((uint64_t)((uintptr_t)(x)))
-
-/**
- * @hideinitializer
- * Function-like macro for stringizing a single level macro.
- * @code
- * #define MY_MACRO 32
- * CSTD_STR1( MY_MACRO )
- * > "MY_MACRO"
- * @endcode
- */
-#define CSTD_STR1(x)	#x
-
-/**
- * @hideinitializer
- * Function-like macro for stringizing a macro's value. This should not be used
- * if the macro is defined in a way which may have no value; use the
- * alternative @c CSTD_STR2N macro should be used instead.
- * @code
- * #define MY_MACRO 32
- * CSTD_STR2( MY_MACRO )
- * > "32"
- * @endcode
- */
-#define CSTD_STR2(x)	CSTD_STR1(x)
-
-/**
- * Specify an assertion value which is evaluated at compile time. Recommended
- * usage is specification of a @c static @c INLINE function containing all of
- * the assertions thus:
- *
- * @code
- * static INLINE [module]_compile_time_assertions( void )
- * {
- *     COMPILE_TIME_ASSERT( sizeof(uintptr_t) == sizeof(intptr_t) );
- * }
- * @endcode
- *
- * @note Use @c static not @c STATIC. We never want to turn off this @c static
- * specification for testing purposes.
- */
-#define CSTD_COMPILE_TIME_ASSERT(expr) \
-	do { switch (0) { case 0: case (expr):; } } while (false)
-
-#endif /* _MALISW_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_midg_coherency.h b/drivers/gpu/arm/bifrost_for_linux/mali_midg_coherency.h
deleted file mode 100644
index a509cbd5f175..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_midg_coherency.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _MIDG_COHERENCY_H_
-#define _MIDG_COHERENCY_H_
-
-#define COHERENCY_ACE_LITE 0
-#define COHERENCY_ACE      1
-#define COHERENCY_NONE     31
-#define COHERENCY_FEATURE_BIT(x) (1 << (x))
-
-#endif /* _MIDG_COHERENCY_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_midg_regmap.h b/drivers/gpu/arm/bifrost_for_linux/mali_midg_regmap.h
deleted file mode 100644
index 554ed8dcb3eb..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_midg_regmap.h
+++ /dev/null
@@ -1,611 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _MIDGARD_REGMAP_H_
-#define _MIDGARD_REGMAP_H_
-
-#include "mali_midg_coherency.h"
-#include "mali_kbase_gpu_id.h"
-
-/*
- * Begin Register Offsets
- */
-
-#define GPU_CONTROL_BASE        0x0000
-#define GPU_CONTROL_REG(r)      (GPU_CONTROL_BASE + (r))
-#define GPU_ID                  0x000	/* (RO) GPU and revision identifier */
-#define L2_FEATURES             0x004	/* (RO) Level 2 cache features */
-#define SUSPEND_SIZE            0x008   /* (RO) Fixed-function suspend buffer
-						size */
-#define TILER_FEATURES          0x00C	/* (RO) Tiler Features */
-#define MEM_FEATURES            0x010	/* (RO) Memory system features */
-#define MMU_FEATURES            0x014	/* (RO) MMU features */
-#define AS_PRESENT              0x018	/* (RO) Address space slots present */
-#define JS_PRESENT              0x01C	/* (RO) Job slots present */
-#define GPU_IRQ_RAWSTAT         0x020	/* (RW) */
-#define GPU_IRQ_CLEAR           0x024	/* (WO) */
-#define GPU_IRQ_MASK            0x028	/* (RW) */
-#define GPU_IRQ_STATUS          0x02C	/* (RO) */
-
-/* IRQ flags */
-#define GPU_FAULT               (1 << 0)	/* A GPU Fault has occurred */
-#define MULTIPLE_GPU_FAULTS     (1 << 7)	/* More than one GPU Fault occurred. */
-#define RESET_COMPLETED         (1 << 8)	/* Set when a reset has completed. Intended to use with SOFT_RESET
-						   commands which may take time. */
-#define POWER_CHANGED_SINGLE    (1 << 9)	/* Set when a single core has finished powering up or down. */
-#define POWER_CHANGED_ALL       (1 << 10)	/* Set when all cores have finished powering up or down
-						   and the power manager is idle. */
-
-#define PRFCNT_SAMPLE_COMPLETED (1 << 16)	/* Set when a performance count sample has completed. */
-#define CLEAN_CACHES_COMPLETED  (1 << 17)	/* Set when a cache clean operation has completed. */
-
-#define GPU_IRQ_REG_ALL (GPU_FAULT | MULTIPLE_GPU_FAULTS | RESET_COMPLETED \
-			| POWER_CHANGED_ALL | PRFCNT_SAMPLE_COMPLETED)
-
-#define GPU_COMMAND             0x030	/* (WO) */
-#define GPU_STATUS              0x034	/* (RO) */
-#define LATEST_FLUSH            0x038	/* (RO) */
-
-#define GROUPS_L2_COHERENT      (1 << 0)	/* Cores groups are l2 coherent */
-#define GPU_DBGEN               (1 << 8)	/* DBGEN wire status */
-
-#define GPU_FAULTSTATUS         0x03C	/* (RO) GPU exception type and fault status */
-#define GPU_FAULTADDRESS_LO     0x040	/* (RO) GPU exception fault address, low word */
-#define GPU_FAULTADDRESS_HI     0x044	/* (RO) GPU exception fault address, high word */
-
-#define PWR_KEY                 0x050	/* (WO) Power manager key register */
-#define PWR_OVERRIDE0           0x054	/* (RW) Power manager override settings */
-#define PWR_OVERRIDE1           0x058	/* (RW) Power manager override settings */
-
-#define PRFCNT_BASE_LO          0x060	/* (RW) Performance counter memory region base address, low word */
-#define PRFCNT_BASE_HI          0x064	/* (RW) Performance counter memory region base address, high word */
-#define PRFCNT_CONFIG           0x068	/* (RW) Performance counter configuration */
-#define PRFCNT_JM_EN            0x06C	/* (RW) Performance counter enable flags for Job Manager */
-#define PRFCNT_SHADER_EN        0x070	/* (RW) Performance counter enable flags for shader cores */
-#define PRFCNT_TILER_EN         0x074	/* (RW) Performance counter enable flags for tiler */
-#define PRFCNT_MMU_L2_EN        0x07C	/* (RW) Performance counter enable flags for MMU/L2 cache */
-
-#define CYCLE_COUNT_LO          0x090	/* (RO) Cycle counter, low word */
-#define CYCLE_COUNT_HI          0x094	/* (RO) Cycle counter, high word */
-#define TIMESTAMP_LO            0x098	/* (RO) Global time stamp counter, low word */
-#define TIMESTAMP_HI            0x09C	/* (RO) Global time stamp counter, high word */
-
-#define THREAD_MAX_THREADS		0x0A0	/* (RO) Maximum number of threads per core */
-#define THREAD_MAX_WORKGROUP_SIZE 0x0A4	/* (RO) Maximum workgroup size */
-#define THREAD_MAX_BARRIER_SIZE 0x0A8	/* (RO) Maximum threads waiting at a barrier */
-#define THREAD_FEATURES         0x0AC	/* (RO) Thread features */
-
-#define TEXTURE_FEATURES_0      0x0B0	/* (RO) Support flags for indexed texture formats 0..31 */
-#define TEXTURE_FEATURES_1      0x0B4	/* (RO) Support flags for indexed texture formats 32..63 */
-#define TEXTURE_FEATURES_2      0x0B8	/* (RO) Support flags for indexed texture formats 64..95 */
-
-#define TEXTURE_FEATURES_REG(n) GPU_CONTROL_REG(TEXTURE_FEATURES_0 + ((n) << 2))
-
-#define JS0_FEATURES            0x0C0	/* (RO) Features of job slot 0 */
-#define JS1_FEATURES            0x0C4	/* (RO) Features of job slot 1 */
-#define JS2_FEATURES            0x0C8	/* (RO) Features of job slot 2 */
-#define JS3_FEATURES            0x0CC	/* (RO) Features of job slot 3 */
-#define JS4_FEATURES            0x0D0	/* (RO) Features of job slot 4 */
-#define JS5_FEATURES            0x0D4	/* (RO) Features of job slot 5 */
-#define JS6_FEATURES            0x0D8	/* (RO) Features of job slot 6 */
-#define JS7_FEATURES            0x0DC	/* (RO) Features of job slot 7 */
-#define JS8_FEATURES            0x0E0	/* (RO) Features of job slot 8 */
-#define JS9_FEATURES            0x0E4	/* (RO) Features of job slot 9 */
-#define JS10_FEATURES           0x0E8	/* (RO) Features of job slot 10 */
-#define JS11_FEATURES           0x0EC	/* (RO) Features of job slot 11 */
-#define JS12_FEATURES           0x0F0	/* (RO) Features of job slot 12 */
-#define JS13_FEATURES           0x0F4	/* (RO) Features of job slot 13 */
-#define JS14_FEATURES           0x0F8	/* (RO) Features of job slot 14 */
-#define JS15_FEATURES           0x0FC	/* (RO) Features of job slot 15 */
-
-#define JS_FEATURES_REG(n)      GPU_CONTROL_REG(JS0_FEATURES + ((n) << 2))
-
-#define SHADER_PRESENT_LO       0x100	/* (RO) Shader core present bitmap, low word */
-#define SHADER_PRESENT_HI       0x104	/* (RO) Shader core present bitmap, high word */
-
-#define TILER_PRESENT_LO        0x110	/* (RO) Tiler core present bitmap, low word */
-#define TILER_PRESENT_HI        0x114	/* (RO) Tiler core present bitmap, high word */
-
-#define L2_PRESENT_LO           0x120	/* (RO) Level 2 cache present bitmap, low word */
-#define L2_PRESENT_HI           0x124	/* (RO) Level 2 cache present bitmap, high word */
-
-#define STACK_PRESENT_LO        0xE00   /* (RO) Core stack present bitmap, low word */
-#define STACK_PRESENT_HI        0xE04   /* (RO) Core stack present bitmap, high word */
-
-
-#define SHADER_READY_LO         0x140	/* (RO) Shader core ready bitmap, low word */
-#define SHADER_READY_HI         0x144	/* (RO) Shader core ready bitmap, high word */
-
-#define TILER_READY_LO          0x150	/* (RO) Tiler core ready bitmap, low word */
-#define TILER_READY_HI          0x154	/* (RO) Tiler core ready bitmap, high word */
-
-#define L2_READY_LO             0x160	/* (RO) Level 2 cache ready bitmap, low word */
-#define L2_READY_HI             0x164	/* (RO) Level 2 cache ready bitmap, high word */
-
-#define STACK_READY_LO          0xE10   /* (RO) Core stack ready bitmap, low word */
-#define STACK_READY_HI          0xE14   /* (RO) Core stack ready bitmap, high word */
-
-
-#define SHADER_PWRON_LO         0x180	/* (WO) Shader core power on bitmap, low word */
-#define SHADER_PWRON_HI         0x184	/* (WO) Shader core power on bitmap, high word */
-
-#define TILER_PWRON_LO          0x190	/* (WO) Tiler core power on bitmap, low word */
-#define TILER_PWRON_HI          0x194	/* (WO) Tiler core power on bitmap, high word */
-
-#define L2_PWRON_LO             0x1A0	/* (WO) Level 2 cache power on bitmap, low word */
-#define L2_PWRON_HI             0x1A4	/* (WO) Level 2 cache power on bitmap, high word */
-
-#define STACK_PWRON_LO          0xE20   /* (RO) Core stack power on bitmap, low word */
-#define STACK_PWRON_HI          0xE24   /* (RO) Core stack power on bitmap, high word */
-
-
-#define SHADER_PWROFF_LO        0x1C0	/* (WO) Shader core power off bitmap, low word */
-#define SHADER_PWROFF_HI        0x1C4	/* (WO) Shader core power off bitmap, high word */
-
-#define TILER_PWROFF_LO         0x1D0	/* (WO) Tiler core power off bitmap, low word */
-#define TILER_PWROFF_HI         0x1D4	/* (WO) Tiler core power off bitmap, high word */
-
-#define L2_PWROFF_LO            0x1E0	/* (WO) Level 2 cache power off bitmap, low word */
-#define L2_PWROFF_HI            0x1E4	/* (WO) Level 2 cache power off bitmap, high word */
-
-#define STACK_PWROFF_LO         0xE30   /* (RO) Core stack power off bitmap, low word */
-#define STACK_PWROFF_HI         0xE34   /* (RO) Core stack power off bitmap, high word */
-
-
-#define SHADER_PWRTRANS_LO      0x200	/* (RO) Shader core power transition bitmap, low word */
-#define SHADER_PWRTRANS_HI      0x204	/* (RO) Shader core power transition bitmap, high word */
-
-#define TILER_PWRTRANS_LO       0x210	/* (RO) Tiler core power transition bitmap, low word */
-#define TILER_PWRTRANS_HI       0x214	/* (RO) Tiler core power transition bitmap, high word */
-
-#define L2_PWRTRANS_LO          0x220	/* (RO) Level 2 cache power transition bitmap, low word */
-#define L2_PWRTRANS_HI          0x224	/* (RO) Level 2 cache power transition bitmap, high word */
-
-#define STACK_PWRTRANS_LO       0xE40   /* (RO) Core stack power transition bitmap, low word */
-#define STACK_PWRTRANS_HI       0xE44   /* (RO) Core stack power transition bitmap, high word */
-
-
-#define SHADER_PWRACTIVE_LO     0x240	/* (RO) Shader core active bitmap, low word */
-#define SHADER_PWRACTIVE_HI     0x244	/* (RO) Shader core active bitmap, high word */
-
-#define TILER_PWRACTIVE_LO      0x250	/* (RO) Tiler core active bitmap, low word */
-#define TILER_PWRACTIVE_HI      0x254	/* (RO) Tiler core active bitmap, high word */
-
-#define L2_PWRACTIVE_LO         0x260	/* (RO) Level 2 cache active bitmap, low word */
-#define L2_PWRACTIVE_HI         0x264	/* (RO) Level 2 cache active bitmap, high word */
-
-#define COHERENCY_FEATURES      0x300	/* (RO) Coherency features present */
-#define COHERENCY_ENABLE        0x304	/* (RW) Coherency enable */
-
-#define JM_CONFIG               0xF00   /* (RW) Job Manager configuration register (Implementation specific register) */
-#define SHADER_CONFIG           0xF04	/* (RW) Shader core configuration settings (Implementation specific register) */
-#define TILER_CONFIG            0xF08   /* (RW) Tiler core configuration settings (Implementation specific register) */
-#define L2_MMU_CONFIG           0xF0C	/* (RW) Configuration of the L2 cache and MMU (Implementation specific register) */
-
-#define JOB_CONTROL_BASE        0x1000
-
-#define JOB_CONTROL_REG(r)      (JOB_CONTROL_BASE + (r))
-
-#define JOB_IRQ_RAWSTAT         0x000	/* Raw interrupt status register */
-#define JOB_IRQ_CLEAR           0x004	/* Interrupt clear register */
-#define JOB_IRQ_MASK            0x008	/* Interrupt mask register */
-#define JOB_IRQ_STATUS          0x00C	/* Interrupt status register */
-#define JOB_IRQ_JS_STATE        0x010	/* status==active and _next == busy snapshot from last JOB_IRQ_CLEAR */
-#define JOB_IRQ_THROTTLE        0x014	/* cycles to delay delivering an interrupt externally. The JOB_IRQ_STATUS is NOT affected by this, just the delivery of the interrupt.  */
-
-#define JOB_SLOT0               0x800	/* Configuration registers for job slot 0 */
-#define JOB_SLOT1               0x880	/* Configuration registers for job slot 1 */
-#define JOB_SLOT2               0x900	/* Configuration registers for job slot 2 */
-#define JOB_SLOT3               0x980	/* Configuration registers for job slot 3 */
-#define JOB_SLOT4               0xA00	/* Configuration registers for job slot 4 */
-#define JOB_SLOT5               0xA80	/* Configuration registers for job slot 5 */
-#define JOB_SLOT6               0xB00	/* Configuration registers for job slot 6 */
-#define JOB_SLOT7               0xB80	/* Configuration registers for job slot 7 */
-#define JOB_SLOT8               0xC00	/* Configuration registers for job slot 8 */
-#define JOB_SLOT9               0xC80	/* Configuration registers for job slot 9 */
-#define JOB_SLOT10              0xD00	/* Configuration registers for job slot 10 */
-#define JOB_SLOT11              0xD80	/* Configuration registers for job slot 11 */
-#define JOB_SLOT12              0xE00	/* Configuration registers for job slot 12 */
-#define JOB_SLOT13              0xE80	/* Configuration registers for job slot 13 */
-#define JOB_SLOT14              0xF00	/* Configuration registers for job slot 14 */
-#define JOB_SLOT15              0xF80	/* Configuration registers for job slot 15 */
-
-#define JOB_SLOT_REG(n, r)      (JOB_CONTROL_REG(JOB_SLOT0 + ((n) << 7)) + (r))
-
-#define JS_HEAD_LO             0x00	/* (RO) Job queue head pointer for job slot n, low word */
-#define JS_HEAD_HI             0x04	/* (RO) Job queue head pointer for job slot n, high word */
-#define JS_TAIL_LO             0x08	/* (RO) Job queue tail pointer for job slot n, low word */
-#define JS_TAIL_HI             0x0C	/* (RO) Job queue tail pointer for job slot n, high word */
-#define JS_AFFINITY_LO         0x10	/* (RO) Core affinity mask for job slot n, low word */
-#define JS_AFFINITY_HI         0x14	/* (RO) Core affinity mask for job slot n, high word */
-#define JS_CONFIG              0x18	/* (RO) Configuration settings for job slot n */
-#define JS_XAFFINITY           0x1C	/* (RO) Extended affinity mask for job
-					   slot n */
-
-#define JS_COMMAND             0x20	/* (WO) Command register for job slot n */
-#define JS_STATUS              0x24	/* (RO) Status register for job slot n */
-
-#define JS_HEAD_NEXT_LO        0x40	/* (RW) Next job queue head pointer for job slot n, low word */
-#define JS_HEAD_NEXT_HI        0x44	/* (RW) Next job queue head pointer for job slot n, high word */
-
-#define JS_AFFINITY_NEXT_LO    0x50	/* (RW) Next core affinity mask for job slot n, low word */
-#define JS_AFFINITY_NEXT_HI    0x54	/* (RW) Next core affinity mask for job slot n, high word */
-#define JS_CONFIG_NEXT         0x58	/* (RW) Next configuration settings for job slot n */
-#define JS_XAFFINITY_NEXT      0x5C	/* (RW) Next extended affinity mask for
-					   job slot n */
-
-#define JS_COMMAND_NEXT        0x60	/* (RW) Next command register for job slot n */
-
-#define JS_FLUSH_ID_NEXT       0x70	/* (RW) Next job slot n cache flush ID */
-
-#define MEMORY_MANAGEMENT_BASE  0x2000
-#define MMU_REG(r)              (MEMORY_MANAGEMENT_BASE + (r))
-
-#define MMU_IRQ_RAWSTAT         0x000	/* (RW) Raw interrupt status register */
-#define MMU_IRQ_CLEAR           0x004	/* (WO) Interrupt clear register */
-#define MMU_IRQ_MASK            0x008	/* (RW) Interrupt mask register */
-#define MMU_IRQ_STATUS          0x00C	/* (RO) Interrupt status register */
-
-#define MMU_AS0                 0x400	/* Configuration registers for address space 0 */
-#define MMU_AS1                 0x440	/* Configuration registers for address space 1 */
-#define MMU_AS2                 0x480	/* Configuration registers for address space 2 */
-#define MMU_AS3                 0x4C0	/* Configuration registers for address space 3 */
-#define MMU_AS4                 0x500	/* Configuration registers for address space 4 */
-#define MMU_AS5                 0x540	/* Configuration registers for address space 5 */
-#define MMU_AS6                 0x580	/* Configuration registers for address space 6 */
-#define MMU_AS7                 0x5C0	/* Configuration registers for address space 7 */
-#define MMU_AS8                 0x600	/* Configuration registers for address space 8 */
-#define MMU_AS9                 0x640	/* Configuration registers for address space 9 */
-#define MMU_AS10                0x680	/* Configuration registers for address space 10 */
-#define MMU_AS11                0x6C0	/* Configuration registers for address space 11 */
-#define MMU_AS12                0x700	/* Configuration registers for address space 12 */
-#define MMU_AS13                0x740	/* Configuration registers for address space 13 */
-#define MMU_AS14                0x780	/* Configuration registers for address space 14 */
-#define MMU_AS15                0x7C0	/* Configuration registers for address space 15 */
-
-#define MMU_AS_REG(n, r)        (MMU_REG(MMU_AS0 + ((n) << 6)) + (r))
-
-#define AS_TRANSTAB_LO         0x00	/* (RW) Translation Table Base Address for address space n, low word */
-#define AS_TRANSTAB_HI         0x04	/* (RW) Translation Table Base Address for address space n, high word */
-#define AS_MEMATTR_LO          0x08	/* (RW) Memory attributes for address space n, low word. */
-#define AS_MEMATTR_HI          0x0C	/* (RW) Memory attributes for address space n, high word. */
-#define AS_LOCKADDR_LO         0x10	/* (RW) Lock region address for address space n, low word */
-#define AS_LOCKADDR_HI         0x14	/* (RW) Lock region address for address space n, high word */
-#define AS_COMMAND             0x18	/* (WO) MMU command register for address space n */
-#define AS_FAULTSTATUS         0x1C	/* (RO) MMU fault status register for address space n */
-#define AS_FAULTADDRESS_LO     0x20	/* (RO) Fault Address for address space n, low word */
-#define AS_FAULTADDRESS_HI     0x24	/* (RO) Fault Address for address space n, high word */
-#define AS_STATUS              0x28	/* (RO) Status flags for address space n */
-
-
-/* (RW) Translation table configuration for address space n, low word */
-#define AS_TRANSCFG_LO         0x30
-/* (RW) Translation table configuration for address space n, high word */
-#define AS_TRANSCFG_HI         0x34
-/* (RO) Secondary fault address for address space n, low word */
-#define AS_FAULTEXTRA_LO       0x38
-/* (RO) Secondary fault address for address space n, high word */
-#define AS_FAULTEXTRA_HI       0x3C
-
-/* End Register Offsets */
-
-/*
- * MMU_IRQ_RAWSTAT register values. Values are valid also for
-   MMU_IRQ_CLEAR, MMU_IRQ_MASK, MMU_IRQ_STATUS registers.
- */
-
-#define MMU_PAGE_FAULT_FLAGS   16
-
-/* Macros returning a bitmask to retrieve page fault or bus error flags from
- * MMU registers */
-#define MMU_PAGE_FAULT(n)      (1UL << (n))
-#define MMU_BUS_ERROR(n)       (1UL << ((n) + MMU_PAGE_FAULT_FLAGS))
-
-/*
- * Begin LPAE MMU TRANSTAB register values
- */
-#define AS_TRANSTAB_LPAE_ADDR_SPACE_MASK   0xfffff000
-#define AS_TRANSTAB_LPAE_ADRMODE_UNMAPPED  (0u << 0)
-#define AS_TRANSTAB_LPAE_ADRMODE_IDENTITY  (1u << 1)
-#define AS_TRANSTAB_LPAE_ADRMODE_TABLE     (3u << 0)
-#define AS_TRANSTAB_LPAE_READ_INNER        (1u << 2)
-#define AS_TRANSTAB_LPAE_SHARE_OUTER       (1u << 4)
-
-#define AS_TRANSTAB_LPAE_ADRMODE_MASK      0x00000003
-
-/*
- * Begin AARCH64 MMU TRANSTAB register values
- */
-#define MMU_HW_OUTA_BITS 40
-#define AS_TRANSTAB_BASE_MASK ((1ULL << MMU_HW_OUTA_BITS) - (1ULL << 4))
-
-/*
- * Begin MMU STATUS register values
- */
-#define AS_STATUS_AS_ACTIVE 0x01
-
-#define AS_FAULTSTATUS_EXCEPTION_CODE_MASK                    (0x7<<3)
-#define AS_FAULTSTATUS_EXCEPTION_CODE_TRANSLATION_FAULT       (0x0<<3)
-#define AS_FAULTSTATUS_EXCEPTION_CODE_PERMISSION_FAULT        (0x1<<3)
-#define AS_FAULTSTATUS_EXCEPTION_CODE_TRANSTAB_BUS_FAULT      (0x2<<3)
-#define AS_FAULTSTATUS_EXCEPTION_CODE_ACCESS_FLAG             (0x3<<3)
-
-#define AS_FAULTSTATUS_EXCEPTION_CODE_ADDRESS_SIZE_FAULT      (0x4<<3)
-#define AS_FAULTSTATUS_EXCEPTION_CODE_MEMORY_ATTRIBUTES_FAULT (0x5<<3)
-
-#define AS_FAULTSTATUS_ACCESS_TYPE_MASK                  (0x3<<8)
-#define AS_FAULTSTATUS_ACCESS_TYPE_ATOMIC                (0x0<<8)
-#define AS_FAULTSTATUS_ACCESS_TYPE_EX                    (0x1<<8)
-#define AS_FAULTSTATUS_ACCESS_TYPE_READ                  (0x2<<8)
-#define AS_FAULTSTATUS_ACCESS_TYPE_WRITE                 (0x3<<8)
-
-/*
- * Begin MMU TRANSCFG register values
- */
-
-#define AS_TRANSCFG_ADRMODE_LEGACY      0
-#define AS_TRANSCFG_ADRMODE_UNMAPPED    1
-#define AS_TRANSCFG_ADRMODE_IDENTITY    2
-#define AS_TRANSCFG_ADRMODE_AARCH64_4K  6
-#define AS_TRANSCFG_ADRMODE_AARCH64_64K 8
-
-#define AS_TRANSCFG_ADRMODE_MASK        0xF
-
-
-/*
- * Begin TRANSCFG register values
- */
-#define AS_TRANSCFG_PTW_MEMATTR_MASK (3 << 24)
-#define AS_TRANSCFG_PTW_MEMATTR_NON_CACHEABLE (1 << 24)
-#define AS_TRANSCFG_PTW_MEMATTR_WRITE_BACK (2 << 24)
-
-#define AS_TRANSCFG_PTW_SH_MASK ((3 << 28))
-#define AS_TRANSCFG_PTW_SH_OS (2 << 28)
-#define AS_TRANSCFG_PTW_SH_IS (3 << 28)
-
-/*
- * Begin Command Values
- */
-
-/* JS_COMMAND register commands */
-#define JS_COMMAND_NOP         0x00	/* NOP Operation. Writing this value is ignored */
-#define JS_COMMAND_START       0x01	/* Start processing a job chain. Writing this value is ignored */
-#define JS_COMMAND_SOFT_STOP   0x02	/* Gently stop processing a job chain */
-#define JS_COMMAND_HARD_STOP   0x03	/* Rudely stop processing a job chain */
-#define JS_COMMAND_SOFT_STOP_0 0x04	/* Execute SOFT_STOP if JOB_CHAIN_FLAG is 0 */
-#define JS_COMMAND_HARD_STOP_0 0x05	/* Execute HARD_STOP if JOB_CHAIN_FLAG is 0 */
-#define JS_COMMAND_SOFT_STOP_1 0x06	/* Execute SOFT_STOP if JOB_CHAIN_FLAG is 1 */
-#define JS_COMMAND_HARD_STOP_1 0x07	/* Execute HARD_STOP if JOB_CHAIN_FLAG is 1 */
-
-#define JS_COMMAND_MASK        0x07    /* Mask of bits currently in use by the HW */
-
-/* AS_COMMAND register commands */
-#define AS_COMMAND_NOP         0x00	/* NOP Operation */
-#define AS_COMMAND_UPDATE      0x01	/* Broadcasts the values in AS_TRANSTAB and ASn_MEMATTR to all MMUs */
-#define AS_COMMAND_LOCK        0x02	/* Issue a lock region command to all MMUs */
-#define AS_COMMAND_UNLOCK      0x03	/* Issue a flush region command to all MMUs */
-#define AS_COMMAND_FLUSH       0x04	/* Flush all L2 caches then issue a flush region command to all MMUs
-					   (deprecated - only for use with T60x) */
-#define AS_COMMAND_FLUSH_PT    0x04	/* Flush all L2 caches then issue a flush region command to all MMUs */
-#define AS_COMMAND_FLUSH_MEM   0x05	/* Wait for memory accesses to complete, flush all the L1s cache then
-					   flush all L2 caches then issue a flush region command to all MMUs */
-
-/* Possible values of JS_CONFIG and JS_CONFIG_NEXT registers */
-#define JS_CONFIG_START_FLUSH_NO_ACTION        (0u << 0)
-#define JS_CONFIG_START_FLUSH_CLEAN            (1u << 8)
-#define JS_CONFIG_START_FLUSH_CLEAN_INVALIDATE (3u << 8)
-#define JS_CONFIG_START_MMU                    (1u << 10)
-#define JS_CONFIG_JOB_CHAIN_FLAG               (1u << 11)
-#define JS_CONFIG_END_FLUSH_NO_ACTION          JS_CONFIG_START_FLUSH_NO_ACTION
-#define JS_CONFIG_END_FLUSH_CLEAN              (1u << 12)
-#define JS_CONFIG_END_FLUSH_CLEAN_INVALIDATE   (3u << 12)
-#define JS_CONFIG_ENABLE_FLUSH_REDUCTION       (1u << 14)
-#define JS_CONFIG_DISABLE_DESCRIPTOR_WR_BK     (1u << 15)
-#define JS_CONFIG_THREAD_PRI(n)                ((n) << 16)
-
-/* JS_XAFFINITY register values */
-#define JS_XAFFINITY_XAFFINITY_ENABLE (1u << 0)
-#define JS_XAFFINITY_TILER_ENABLE     (1u << 8)
-#define JS_XAFFINITY_CACHE_ENABLE     (1u << 16)
-
-/* JS_STATUS register values */
-
-/* NOTE: Please keep this values in sync with enum base_jd_event_code in mali_base_kernel.h.
- * The values are separated to avoid dependency of userspace and kernel code.
- */
-
-/* Group of values representing the job status insead a particular fault */
-#define JS_STATUS_NO_EXCEPTION_BASE   0x00
-#define JS_STATUS_INTERRUPTED         (JS_STATUS_NO_EXCEPTION_BASE + 0x02)	/* 0x02 means INTERRUPTED */
-#define JS_STATUS_STOPPED             (JS_STATUS_NO_EXCEPTION_BASE + 0x03)	/* 0x03 means STOPPED */
-#define JS_STATUS_TERMINATED          (JS_STATUS_NO_EXCEPTION_BASE + 0x04)	/* 0x04 means TERMINATED */
-
-/* General fault values */
-#define JS_STATUS_FAULT_BASE          0x40
-#define JS_STATUS_CONFIG_FAULT        (JS_STATUS_FAULT_BASE)	/* 0x40 means CONFIG FAULT */
-#define JS_STATUS_POWER_FAULT         (JS_STATUS_FAULT_BASE + 0x01)	/* 0x41 means POWER FAULT */
-#define JS_STATUS_READ_FAULT          (JS_STATUS_FAULT_BASE + 0x02)	/* 0x42 means READ FAULT */
-#define JS_STATUS_WRITE_FAULT         (JS_STATUS_FAULT_BASE + 0x03)	/* 0x43 means WRITE FAULT */
-#define JS_STATUS_AFFINITY_FAULT      (JS_STATUS_FAULT_BASE + 0x04)	/* 0x44 means AFFINITY FAULT */
-#define JS_STATUS_BUS_FAULT           (JS_STATUS_FAULT_BASE + 0x08)	/* 0x48 means BUS FAULT */
-
-/* Instruction or data faults */
-#define JS_STATUS_INSTRUCTION_FAULT_BASE  0x50
-#define JS_STATUS_INSTR_INVALID_PC        (JS_STATUS_INSTRUCTION_FAULT_BASE)	/* 0x50 means INSTR INVALID PC */
-#define JS_STATUS_INSTR_INVALID_ENC       (JS_STATUS_INSTRUCTION_FAULT_BASE + 0x01)	/* 0x51 means INSTR INVALID ENC */
-#define JS_STATUS_INSTR_TYPE_MISMATCH     (JS_STATUS_INSTRUCTION_FAULT_BASE + 0x02)	/* 0x52 means INSTR TYPE MISMATCH */
-#define JS_STATUS_INSTR_OPERAND_FAULT     (JS_STATUS_INSTRUCTION_FAULT_BASE + 0x03)	/* 0x53 means INSTR OPERAND FAULT */
-#define JS_STATUS_INSTR_TLS_FAULT         (JS_STATUS_INSTRUCTION_FAULT_BASE + 0x04)	/* 0x54 means INSTR TLS FAULT */
-#define JS_STATUS_INSTR_BARRIER_FAULT     (JS_STATUS_INSTRUCTION_FAULT_BASE + 0x05)	/* 0x55 means INSTR BARRIER FAULT */
-#define JS_STATUS_INSTR_ALIGN_FAULT       (JS_STATUS_INSTRUCTION_FAULT_BASE + 0x06)	/* 0x56 means INSTR ALIGN FAULT */
-/* NOTE: No fault with 0x57 code defined in spec. */
-#define JS_STATUS_DATA_INVALID_FAULT      (JS_STATUS_INSTRUCTION_FAULT_BASE + 0x08)	/* 0x58 means DATA INVALID FAULT */
-#define JS_STATUS_TILE_RANGE_FAULT        (JS_STATUS_INSTRUCTION_FAULT_BASE + 0x09)	/* 0x59 means TILE RANGE FAULT */
-#define JS_STATUS_ADDRESS_RANGE_FAULT     (JS_STATUS_INSTRUCTION_FAULT_BASE + 0x0A)	/* 0x5A means ADDRESS RANGE FAULT */
-
-/* Other faults */
-#define JS_STATUS_MEMORY_FAULT_BASE   0x60
-#define JS_STATUS_OUT_OF_MEMORY       (JS_STATUS_MEMORY_FAULT_BASE)	/* 0x60 means OUT OF MEMORY */
-#define JS_STATUS_UNKNOWN             0x7F	/* 0x7F means UNKNOWN */
-
-/* GPU_COMMAND values */
-#define GPU_COMMAND_NOP                0x00	/* No operation, nothing happens */
-#define GPU_COMMAND_SOFT_RESET         0x01	/* Stop all external bus interfaces, and then reset the entire GPU. */
-#define GPU_COMMAND_HARD_RESET         0x02	/* Immediately reset the entire GPU. */
-#define GPU_COMMAND_PRFCNT_CLEAR       0x03	/* Clear all performance counters, setting them all to zero. */
-#define GPU_COMMAND_PRFCNT_SAMPLE      0x04	/* Sample all performance counters, writing them out to memory */
-#define GPU_COMMAND_CYCLE_COUNT_START  0x05	/* Starts the cycle counter, and system timestamp propagation */
-#define GPU_COMMAND_CYCLE_COUNT_STOP   0x06	/* Stops the cycle counter, and system timestamp propagation */
-#define GPU_COMMAND_CLEAN_CACHES       0x07	/* Clean all caches */
-#define GPU_COMMAND_CLEAN_INV_CACHES   0x08	/* Clean and invalidate all caches */
-#define GPU_COMMAND_SET_PROTECTED_MODE 0x09	/* Places the GPU in protected mode */
-
-/* End Command Values */
-
-/* GPU_STATUS values */
-#define GPU_STATUS_PRFCNT_ACTIVE           (1 << 2)	/* Set if the performance counters are active. */
-#define GPU_STATUS_PROTECTED_MODE_ACTIVE   (1 << 7)	/* Set if protected mode is active */
-
-/* PRFCNT_CONFIG register values */
-#define PRFCNT_CONFIG_MODE_SHIFT      0 /* Counter mode position. */
-#define PRFCNT_CONFIG_AS_SHIFT        4 /* Address space bitmap position. */
-#define PRFCNT_CONFIG_SETSELECT_SHIFT 8 /* Set select position. */
-
-#define PRFCNT_CONFIG_MODE_OFF    0	/* The performance counters are disabled. */
-#define PRFCNT_CONFIG_MODE_MANUAL 1	/* The performance counters are enabled, but are only written out when a PRFCNT_SAMPLE command is issued using the GPU_COMMAND register. */
-#define PRFCNT_CONFIG_MODE_TILE   2	/* The performance counters are enabled, and are written out each time a tile finishes rendering. */
-
-/* AS<n>_MEMATTR values: */
-/* Use GPU implementation-defined caching policy. */
-#define AS_MEMATTR_IMPL_DEF_CACHE_POLICY 0x88ull
-/* The attribute set to force all resources to be cached. */
-#define AS_MEMATTR_FORCE_TO_CACHE_ALL    0x8Full
-/* Inner write-alloc cache setup, no outer caching */
-#define AS_MEMATTR_WRITE_ALLOC           0x8Dull
-
-/* Set to implementation defined, outer caching */
-#define AS_MEMATTR_AARCH64_OUTER_IMPL_DEF 0x88ull
-/* Set to write back memory, outer caching */
-#define AS_MEMATTR_AARCH64_OUTER_WA       0x8Dull
-
-/* Use GPU implementation-defined  caching policy. */
-#define AS_MEMATTR_LPAE_IMPL_DEF_CACHE_POLICY 0x48ull
-/* The attribute set to force all resources to be cached. */
-#define AS_MEMATTR_LPAE_FORCE_TO_CACHE_ALL    0x4Full
-/* Inner write-alloc cache setup, no outer caching */
-#define AS_MEMATTR_LPAE_WRITE_ALLOC           0x4Dull
-/* Set to implementation defined, outer caching */
-#define AS_MEMATTR_LPAE_OUTER_IMPL_DEF        0x88ull
-/* Set to write back memory, outer caching */
-#define AS_MEMATTR_LPAE_OUTER_WA              0x8Dull
-
-/* Symbols for default MEMATTR to use
- * Default is - HW implementation defined caching */
-#define AS_MEMATTR_INDEX_DEFAULT               0
-#define AS_MEMATTR_INDEX_DEFAULT_ACE           3
-
-/* HW implementation defined caching */
-#define AS_MEMATTR_INDEX_IMPL_DEF_CACHE_POLICY 0
-/* Force cache on */
-#define AS_MEMATTR_INDEX_FORCE_TO_CACHE_ALL    1
-/* Write-alloc */
-#define AS_MEMATTR_INDEX_WRITE_ALLOC           2
-/* Outer coherent, inner implementation defined policy */
-#define AS_MEMATTR_INDEX_OUTER_IMPL_DEF        3
-/* Outer coherent, write alloc inner */
-#define AS_MEMATTR_INDEX_OUTER_WA              4
-
-/* JS<n>_FEATURES register */
-
-#define JS_FEATURE_NULL_JOB              (1u << 1)
-#define JS_FEATURE_SET_VALUE_JOB         (1u << 2)
-#define JS_FEATURE_CACHE_FLUSH_JOB       (1u << 3)
-#define JS_FEATURE_COMPUTE_JOB           (1u << 4)
-#define JS_FEATURE_VERTEX_JOB            (1u << 5)
-#define JS_FEATURE_GEOMETRY_JOB          (1u << 6)
-#define JS_FEATURE_TILER_JOB             (1u << 7)
-#define JS_FEATURE_FUSED_JOB             (1u << 8)
-#define JS_FEATURE_FRAGMENT_JOB          (1u << 9)
-
-/* End JS<n>_FEATURES register */
-
-/* L2_MMU_CONFIG register */
-#define L2_MMU_CONFIG_ALLOW_SNOOP_DISPARITY_SHIFT       (23)
-#define L2_MMU_CONFIG_ALLOW_SNOOP_DISPARITY             (0x1 << L2_MMU_CONFIG_ALLOW_SNOOP_DISPARITY_SHIFT)
-#define L2_MMU_CONFIG_LIMIT_EXTERNAL_READS_SHIFT        (24)
-#define L2_MMU_CONFIG_LIMIT_EXTERNAL_READS              (0x3 << L2_MMU_CONFIG_LIMIT_EXTERNAL_READS_SHIFT)
-#define L2_MMU_CONFIG_LIMIT_EXTERNAL_READS_OCTANT       (0x1 << L2_MMU_CONFIG_LIMIT_EXTERNAL_READS_SHIFT)
-#define L2_MMU_CONFIG_LIMIT_EXTERNAL_READS_QUARTER      (0x2 << L2_MMU_CONFIG_LIMIT_EXTERNAL_READS_SHIFT)
-#define L2_MMU_CONFIG_LIMIT_EXTERNAL_READS_HALF         (0x3 << L2_MMU_CONFIG_LIMIT_EXTERNAL_READS_SHIFT)
-
-#define L2_MMU_CONFIG_LIMIT_EXTERNAL_WRITES_SHIFT       (26)
-#define L2_MMU_CONFIG_LIMIT_EXTERNAL_WRITES             (0x3 << L2_MMU_CONFIG_LIMIT_EXTERNAL_WRITES_SHIFT)
-#define L2_MMU_CONFIG_LIMIT_EXTERNAL_WRITES_OCTANT      (0x1 << L2_MMU_CONFIG_LIMIT_EXTERNAL_WRITES_SHIFT)
-#define L2_MMU_CONFIG_LIMIT_EXTERNAL_WRITES_QUARTER     (0x2 << L2_MMU_CONFIG_LIMIT_EXTERNAL_WRITES_SHIFT)
-#define L2_MMU_CONFIG_LIMIT_EXTERNAL_WRITES_HALF        (0x3 << L2_MMU_CONFIG_LIMIT_EXTERNAL_WRITES_SHIFT)
-/* End L2_MMU_CONFIG register */
-
-/* THREAD_* registers */
-
-/* THREAD_FEATURES IMPLEMENTATION_TECHNOLOGY values */
-#define IMPLEMENTATION_UNSPECIFIED  0
-#define IMPLEMENTATION_SILICON      1
-#define IMPLEMENTATION_FPGA         2
-#define IMPLEMENTATION_MODEL        3
-
-/* Default values when registers are not supported by the implemented hardware */
-#define THREAD_MT_DEFAULT     256
-#define THREAD_MWS_DEFAULT    256
-#define THREAD_MBS_DEFAULT    256
-#define THREAD_MR_DEFAULT     1024
-#define THREAD_MTQ_DEFAULT    4
-#define THREAD_MTGS_DEFAULT   10
-
-/* End THREAD_* registers */
-
-/* SHADER_CONFIG register */
-
-#define SC_ALT_COUNTERS             (1ul << 3)
-#define SC_OVERRIDE_FWD_PIXEL_KILL  (1ul << 4)
-#define SC_SDC_DISABLE_OQ_DISCARD   (1ul << 6)
-#define SC_LS_ALLOW_ATTR_TYPES      (1ul << 16)
-#define SC_LS_PAUSEBUFFER_DISABLE   (1ul << 16)
-#define SC_TLS_HASH_ENABLE          (1ul << 17)
-#define SC_LS_ATTR_CHECK_DISABLE    (1ul << 18)
-#define SC_ENABLE_TEXGRD_FLAGS      (1ul << 25)
-/* End SHADER_CONFIG register */
-
-/* TILER_CONFIG register */
-
-#define TC_CLOCK_GATE_OVERRIDE      (1ul << 0)
-
-/* End TILER_CONFIG register */
-
-/* JM_CONFIG register */
-
-#define JM_TIMESTAMP_OVERRIDE  (1ul << 0)
-#define JM_CLOCK_GATE_OVERRIDE (1ul << 1)
-#define JM_JOB_THROTTLE_ENABLE (1ul << 2)
-#define JM_JOB_THROTTLE_LIMIT_SHIFT (3)
-#define JM_MAX_JOB_THROTTLE_LIMIT (0x3F)
-#define JM_FORCE_COHERENCY_FEATURES_SHIFT (2)
-#define JM_IDVS_GROUP_SIZE_SHIFT (16)
-#define JM_MAX_IDVS_GROUP_SIZE (0x3F)
-/* End JM_CONFIG register */
-
-
-#endif /* _MIDGARD_REGMAP_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_timeline.h b/drivers/gpu/arm/bifrost_for_linux/mali_timeline.h
deleted file mode 100644
index bd5f6614b6bb..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_timeline.h
+++ /dev/null
@@ -1,396 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#undef TRACE_SYSTEM
-#define TRACE_SYSTEM mali_timeline
-
-#if !defined(_MALI_TIMELINE_H) || defined(TRACE_HEADER_MULTI_READ)
-#define _MALI_TIMELINE_H
-
-#include <linux/tracepoint.h>
-
-TRACE_EVENT(mali_timeline_atoms_in_flight,
-
-	TP_PROTO(u64 ts_sec,
-		u32 ts_nsec,
-		int tgid,
-		int count),
-
-	TP_ARGS(ts_sec,
-		ts_nsec,
-		tgid,
-		count),
-
-	TP_STRUCT__entry(
-			__field(u64, ts_sec)
-			__field(u32, ts_nsec)
-			__field(int, tgid)
-			__field(int, count)
-	),
-
-	TP_fast_assign(
-		__entry->ts_sec = ts_sec;
-		__entry->ts_nsec = ts_nsec;
-		__entry->tgid = tgid;
-		__entry->count = count;
-	),
-
-	TP_printk("%i,%i.%.9i,%i,%i", CTX_SET_NR_ATOMS_IN_FLIGHT,
-				(int)__entry->ts_sec,
-				(int)__entry->ts_nsec,
-				__entry->tgid,
-				__entry->count)
-);
-
-
-TRACE_EVENT(mali_timeline_atom,
-
-	TP_PROTO(u64 ts_sec,
-		u32 ts_nsec,
-		int event_type,
-		int tgid,
-		int atom_id),
-
-	TP_ARGS(ts_sec,
-		ts_nsec,
-		event_type,
-		tgid,
-		atom_id),
-
-	TP_STRUCT__entry(
-			__field(u64, ts_sec)
-			__field(u32, ts_nsec)
-			__field(int, event_type)
-			__field(int, tgid)
-			__field(int, atom_id)
-	),
-
-	TP_fast_assign(
-		__entry->ts_sec = ts_sec;
-		__entry->ts_nsec = ts_nsec;
-		__entry->event_type = event_type;
-		__entry->tgid = tgid;
-		__entry->atom_id = atom_id;
-	),
-
-	TP_printk("%i,%i.%.9i,%i,%i,%i", __entry->event_type,
-			(int)__entry->ts_sec,
-			(int)__entry->ts_nsec,
-			__entry->tgid,
-			__entry->atom_id,
-			__entry->atom_id)
-);
-
-TRACE_EVENT(mali_timeline_gpu_slot_active,
-
-	TP_PROTO(u64 ts_sec,
-		u32 ts_nsec,
-		int event_type,
-		int tgid,
-		int js,
-		int count),
-
-	TP_ARGS(ts_sec,
-		ts_nsec,
-		event_type,
-		tgid,
-		js,
-		count),
-
-	TP_STRUCT__entry(
-			__field(u64, ts_sec)
-			__field(u32, ts_nsec)
-			__field(int, event_type)
-			__field(int, tgid)
-			__field(int, js)
-			__field(int, count)
-	),
-
-	TP_fast_assign(
-		__entry->ts_sec = ts_sec;
-		__entry->ts_nsec = ts_nsec;
-		__entry->event_type = event_type;
-		__entry->tgid = tgid;
-		__entry->js = js;
-		__entry->count = count;
-	),
-
-	TP_printk("%i,%i.%.9i,%i,%i,%i", __entry->event_type,
-			(int)__entry->ts_sec,
-			(int)__entry->ts_nsec,
-			__entry->tgid,
-			__entry->js,
-			__entry->count)
-);
-
-TRACE_EVENT(mali_timeline_gpu_slot_action,
-
-	TP_PROTO(u64 ts_sec,
-		u32 ts_nsec,
-		int event_type,
-		int tgid,
-		int js,
-		int count),
-
-	TP_ARGS(ts_sec,
-		ts_nsec,
-		event_type,
-		tgid,
-		js,
-		count),
-
-	TP_STRUCT__entry(
-			__field(u64, ts_sec)
-			__field(u32, ts_nsec)
-			__field(int, event_type)
-			__field(int, tgid)
-			__field(int, js)
-			__field(int, count)
-	),
-
-	TP_fast_assign(
-		__entry->ts_sec = ts_sec;
-		__entry->ts_nsec = ts_nsec;
-		__entry->event_type = event_type;
-		__entry->tgid = tgid;
-		__entry->js = js;
-		__entry->count = count;
-	),
-
-	TP_printk("%i,%i.%.9i,%i,%i,%i", __entry->event_type,
-			(int)__entry->ts_sec,
-			(int)__entry->ts_nsec,
-			__entry->tgid,
-			__entry->js,
-			__entry->count)
-);
-
-TRACE_EVENT(mali_timeline_gpu_power_active,
-
-	TP_PROTO(u64 ts_sec,
-		u32 ts_nsec,
-		int event_type,
-		int active),
-
-	TP_ARGS(ts_sec,
-		ts_nsec,
-		event_type,
-		active),
-
-	TP_STRUCT__entry(
-			__field(u64, ts_sec)
-			__field(u32, ts_nsec)
-			__field(int, event_type)
-			__field(int, active)
-	),
-
-	TP_fast_assign(
-		__entry->ts_sec = ts_sec;
-		__entry->ts_nsec = ts_nsec;
-		__entry->event_type = event_type;
-		__entry->active = active;
-	),
-
-	TP_printk("%i,%i.%.9i,0,%i", __entry->event_type,
-			(int)__entry->ts_sec,
-			(int)__entry->ts_nsec,
-			__entry->active)
-
-);
-
-TRACE_EVENT(mali_timeline_l2_power_active,
-
-	TP_PROTO(u64 ts_sec,
-		u32 ts_nsec,
-		int event_type,
-		int state),
-
-	TP_ARGS(ts_sec,
-		ts_nsec,
-		event_type,
-		state),
-
-	TP_STRUCT__entry(
-			__field(u64, ts_sec)
-			__field(u32, ts_nsec)
-			__field(int, event_type)
-			__field(int, state)
-	),
-
-	TP_fast_assign(
-		__entry->ts_sec = ts_sec;
-		__entry->ts_nsec = ts_nsec;
-		__entry->event_type = event_type;
-		__entry->state = state;
-	),
-
-	TP_printk("%i,%i.%.9i,0,%i", __entry->event_type,
-			(int)__entry->ts_sec,
-			(int)__entry->ts_nsec,
-			__entry->state)
-
-);
-TRACE_EVENT(mali_timeline_pm_event,
-
-	TP_PROTO(u64 ts_sec,
-		u32 ts_nsec,
-		int event_type,
-		int pm_event_type,
-		unsigned int pm_event_id),
-
-	TP_ARGS(ts_sec,
-		ts_nsec,
-		event_type,
-		pm_event_type,
-		pm_event_id),
-
-	TP_STRUCT__entry(
-			__field(u64, ts_sec)
-			__field(u32, ts_nsec)
-			__field(int, event_type)
-			__field(int, pm_event_type)
-			__field(unsigned int, pm_event_id)
-	),
-
-	TP_fast_assign(
-		__entry->ts_sec = ts_sec;
-		__entry->ts_nsec = ts_nsec;
-		__entry->event_type = event_type;
-		__entry->pm_event_type = pm_event_type;
-		__entry->pm_event_id = pm_event_id;
-	),
-
-	TP_printk("%i,%i.%.9i,0,%i,%u", __entry->event_type,
-			(int)__entry->ts_sec,
-			(int)__entry->ts_nsec,
-			__entry->pm_event_type, __entry->pm_event_id)
-
-);
-
-TRACE_EVENT(mali_timeline_slot_atom,
-
-	TP_PROTO(u64 ts_sec,
-		u32 ts_nsec,
-		int event_type,
-		int tgid,
-		int js,
-		int atom_id),
-
-	TP_ARGS(ts_sec,
-		ts_nsec,
-		event_type,
-		tgid,
-		js,
-		atom_id),
-
-	TP_STRUCT__entry(
-			__field(u64, ts_sec)
-			__field(u32, ts_nsec)
-			__field(int, event_type)
-			__field(int, tgid)
-			__field(int, js)
-			__field(int, atom_id)
-	),
-
-	TP_fast_assign(
-		__entry->ts_sec = ts_sec;
-		__entry->ts_nsec = ts_nsec;
-		__entry->event_type = event_type;
-		__entry->tgid = tgid;
-		__entry->js = js;
-		__entry->atom_id = atom_id;
-	),
-
-	TP_printk("%i,%i.%.9i,%i,%i,%i", __entry->event_type,
-			(int)__entry->ts_sec,
-			(int)__entry->ts_nsec,
-			__entry->tgid,
-			__entry->js,
-			__entry->atom_id)
-);
-
-TRACE_EVENT(mali_timeline_pm_checktrans,
-
-	TP_PROTO(u64 ts_sec,
-		u32 ts_nsec,
-		int trans_code,
-		int trans_id),
-
-	TP_ARGS(ts_sec,
-		ts_nsec,
-		trans_code,
-		trans_id),
-
-	TP_STRUCT__entry(
-			__field(u64, ts_sec)
-			__field(u32, ts_nsec)
-			__field(int, trans_code)
-			__field(int, trans_id)
-	),
-
-	TP_fast_assign(
-		__entry->ts_sec = ts_sec;
-		__entry->ts_nsec = ts_nsec;
-		__entry->trans_code = trans_code;
-		__entry->trans_id = trans_id;
-	),
-
-	TP_printk("%i,%i.%.9i,0,%i", __entry->trans_code,
-			(int)__entry->ts_sec,
-			(int)__entry->ts_nsec,
-			__entry->trans_id)
-
-);
-
-TRACE_EVENT(mali_timeline_context_active,
-
-	TP_PROTO(u64 ts_sec,
-		u32 ts_nsec,
-		int count),
-
-	TP_ARGS(ts_sec,
-		ts_nsec,
-		count),
-
-	TP_STRUCT__entry(
-			__field(u64, ts_sec)
-			__field(u32, ts_nsec)
-			__field(int, count)
-	),
-
-	TP_fast_assign(
-		__entry->ts_sec = ts_sec;
-		__entry->ts_nsec = ts_nsec;
-		__entry->count = count;
-	),
-
-	TP_printk("%i,%i.%.9i,0,%i", SW_SET_CONTEXT_ACTIVE,
-			(int)__entry->ts_sec,
-			(int)__entry->ts_nsec,
-			__entry->count)
-);
-
-#endif /* _MALI_TIMELINE_H */
-
-#undef TRACE_INCLUDE_PATH
-#define TRACE_INCLUDE_PATH .
-
-/* This part must be outside protection */
-#include <trace/define_trace.h>
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/mali_uk.h b/drivers/gpu/arm/bifrost_for_linux/mali_uk.h
deleted file mode 100644
index 841d03fb5873..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/mali_uk.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010, 2012-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/**
- * @file mali_uk.h
- * Types and definitions that are common across OSs for both the user
- * and kernel side of the User-Kernel interface.
- */
-
-#ifndef _UK_H_
-#define _UK_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif				/* __cplusplus */
-
-/**
- * @addtogroup base_api
- * @{
- */
-
-/**
- * @defgroup uk_api User-Kernel Interface API
- *
- * The User-Kernel Interface abstracts the communication mechanism between the user and kernel-side code of device
- * drivers developed as part of the Midgard DDK. Currently that includes the Base driver and the UMP driver.
- *
- * It exposes an OS independent API to user-side code (UKU) which routes functions calls to an OS-independent
- * kernel-side API (UKK) via an OS-specific communication mechanism.
- *
- * This API is internal to the Midgard DDK and is not exposed to any applications.
- *
- * @{
- */
-
-/**
- * These are identifiers for kernel-side drivers implementing a UK interface, aka UKK clients. The
- * UK module maps this to an OS specific device name, e.g. "gpu_base" -> "GPU0:". Specify this
- * identifier to select a UKK client to the uku_open() function.
- *
- * When a new UKK client driver is created a new identifier needs to be added to the uk_client_id
- * enumeration and the uku_open() implemenation for the various OS ports need to be updated to
- * provide a mapping of the identifier to the OS specific device name.
- *
- */
-enum uk_client_id {
-	/**
-	 * Value used to identify the Base driver UK client.
-	 */
-	UK_CLIENT_MALI_T600_BASE,
-
-	/** The number of uk clients supported. This must be the last member of the enum */
-	UK_CLIENT_COUNT
-};
-
-/**
- * Each function callable through the UK interface has a unique number.
- * Functions provided by UK clients start from number UK_FUNC_ID.
- * Numbers below UK_FUNC_ID are used for internal UK functions.
- */
-enum uk_func {
-	UKP_FUNC_ID_CHECK_VERSION,   /**< UKK Core internal function */
-	/**
-	 * Each UK client numbers the functions they provide starting from
-	 * number UK_FUNC_ID. This number is then eventually assigned to the
-	 * id field of the union uk_header structure when preparing to make a
-	 * UK call. See your UK client for a list of their function numbers.
-	 */
-	UK_FUNC_ID = 512
-};
-
-/**
- * Arguments for a UK call are stored in a structure. This structure consists
- * of a fixed size header and a payload. The header carries a 32-bit number
- * identifying the UK function to be called (see uk_func). When the UKK client
- * receives this header and executed the requested UK function, it will use
- * the same header to store the result of the function in the form of a
- * int return code. The size of this structure is such that the
- * first member of the payload following the header can be accessed efficiently
- * on a 32 and 64-bit kernel and the structure has the same size regardless
- * of a 32 or 64-bit kernel. The uk_kernel_size_type type should be defined
- * accordingly in the OS specific mali_uk_os.h header file.
- */
-union uk_header {
-	/**
-	 * 32-bit number identifying the UK function to be called.
-	 * Also see uk_func.
-	 */
-	u32 id;
-	/**
-	 * The int return code returned by the called UK function.
-	 * See the specification of the particular UK function you are
-	 * calling for the meaning of the error codes returned. All
-	 * UK functions return 0 on success.
-	 */
-	u32 ret;
-	/*
-	 * Used to ensure 64-bit alignment of this union. Do not remove.
-	 * This field is used for padding and does not need to be initialized.
-	 */
-	u64 sizer;
-};
-
-/**
- * This structure carries a 16-bit major and minor number and is sent along with an internal UK call
- * used during uku_open to identify the versions of the UK module in use by the user-side and kernel-side.
- */
-struct uku_version_check_args {
-	union uk_header header;
-		  /**< UK call header */
-	u16 major;
-	   /**< This field carries the user-side major version on input and the kernel-side major version on output */
-	u16 minor;
-	   /**< This field carries the user-side minor version on input and the kernel-side minor version on output. */
-	u8 padding[4];
-};
-
-/** @} end group uk_api */
-
-/** @} *//* end group base_api */
-
-#ifdef __cplusplus
-}
-#endif				/* __cplusplus */
-#endif				/* _UK_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/Kconfig b/drivers/gpu/arm/bifrost_for_linux/platform/Kconfig
deleted file mode 100644
index 38835d3d1531..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/Kconfig
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# (C) COPYRIGHT 2012-2013, 2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-
-
-# Add your platform specific Kconfig file here
-#
-# "drivers/gpu/arm/midgard/platform/xxx/Kconfig"
-#
-# Where xxx is the platform name is the name set in MALI_PLATFORM_NAME
-#
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/Kbuild b/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/Kbuild
deleted file mode 100644
index d40d7982ff04..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/Kbuild
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# (C) COPYRIGHT 2012-2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-mali_kbase-y += \
-	$(MALI_PLATFORM_DIR)/mali_kbase_config_devicetree.o \
-	$(MALI_PLATFORM_DIR)/mali_kbase_runtime_pm.o
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/mali_kbase_config_devicetree.c b/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/mali_kbase_config_devicetree.c
deleted file mode 100644
index 29ccc29e4125..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/mali_kbase_config_devicetree.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2015, 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <mali_kbase_config.h>
-
-int kbase_platform_early_init(void)
-{
-	/* Nothing needed at this stage */
-	return 0;
-}
-
-static struct kbase_platform_config dummy_platform_config;
-
-struct kbase_platform_config *kbase_get_platform_config(void)
-{
-	return &dummy_platform_config;
-}
-
-int kbase_platform_register(void)
-{
-	return 0;
-}
-
-void kbase_platform_unregister(void)
-{
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/mali_kbase_config_platform.h b/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/mali_kbase_config_platform.h
deleted file mode 100644
index 2ceca34945b9..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/mali_kbase_config_platform.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/**
- * Maximum frequency GPU will be clocked at. Given in kHz.
- * This must be specified as there is no default value.
- *
- * Attached value: number in kHz
- * Default value: NA
- */
-#define GPU_FREQ_KHZ_MAX (5000)
-/**
- * Minimum frequency GPU will be clocked at. Given in kHz.
- * This must be specified as there is no default value.
- *
- * Attached value: number in kHz
- * Default value: NA
- */
-#define GPU_FREQ_KHZ_MIN (5000)
-
-/**
- * CPU_SPEED_FUNC - A pointer to a function that calculates the CPU clock
- *
- * CPU clock speed of the platform is in MHz - see kbase_cpu_clk_speed_func
- * for the function prototype.
- *
- * Attached value: A kbase_cpu_clk_speed_func.
- * Default Value:  NA
- */
-#define CPU_SPEED_FUNC (NULL)
-
-/**
- * GPU_SPEED_FUNC - A pointer to a function that calculates the GPU clock
- *
- * GPU clock speed of the platform in MHz - see kbase_gpu_clk_speed_func
- * for the function prototype.
- *
- * Attached value: A kbase_gpu_clk_speed_func.
- * Default Value:  NA
- */
-#define GPU_SPEED_FUNC (NULL)
-
-/**
- * Power management configuration
- *
- * Attached value: pointer to @ref kbase_pm_callback_conf
- * Default value: See @ref kbase_pm_callback_conf
- */
-#define POWER_MANAGEMENT_CALLBACKS (&pm_callbacks)
-
-/**
- * Platform specific configuration functions
- *
- * Attached value: pointer to @ref kbase_platform_funcs_conf
- * Default value: See @ref kbase_platform_funcs_conf
- */
-#define PLATFORM_FUNCS (NULL)
-
-extern struct kbase_pm_callback_conf pm_callbacks;
-
-/**
- * Autosuspend delay
- *
- * The delay time (in milliseconds) to be used for autosuspend
- */
-#define AUTO_SUSPEND_DELAY (100)
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/mali_kbase_runtime_pm.c b/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/mali_kbase_runtime_pm.c
deleted file mode 100644
index 9fe37c8d835e..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/devicetree/mali_kbase_runtime_pm.c
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2015, 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <mali_kbase.h>
-#include <mali_kbase_defs.h>
-#include <linux/pm_runtime.h>
-#include "mali_kbase_config_platform.h"
-
-static int pm_callback_power_on(struct kbase_device *kbdev)
-{
-	int ret = 1; /* Assume GPU has been powered off */
-	int error;
-
-	dev_dbg(kbdev->dev, "pm_callback_power_on %p\n",
-			(void *)kbdev->dev->pm_domain);
-
-	error = pm_runtime_get_sync(kbdev->dev);
-	if (error == 1) {
-		/*
-		 * Let core know that the chip has not been
-		 * powered off, so we can save on re-initialization.
-		 */
-		ret = 0;
-	}
-
-	dev_dbg(kbdev->dev, "pm_runtime_get_sync returned %d\n", error);
-
-	return ret;
-}
-
-static void pm_callback_power_off(struct kbase_device *kbdev)
-{
-	dev_dbg(kbdev->dev, "pm_callback_power_off\n");
-
-	pm_runtime_mark_last_busy(kbdev->dev);
-	pm_runtime_put_autosuspend(kbdev->dev);
-}
-
-int kbase_device_runtime_init(struct kbase_device *kbdev)
-{
-	int ret = 0;
-
-	dev_dbg(kbdev->dev, "kbase_device_runtime_init\n");
-
-	pm_runtime_set_autosuspend_delay(kbdev->dev, AUTO_SUSPEND_DELAY);
-	pm_runtime_use_autosuspend(kbdev->dev);
-
-	pm_runtime_set_active(kbdev->dev);
-	pm_runtime_enable(kbdev->dev);
-
-	if (!pm_runtime_enabled(kbdev->dev)) {
-		dev_warn(kbdev->dev, "pm_runtime not enabled");
-		ret = -ENOSYS;
-	}
-
-	return ret;
-}
-
-void kbase_device_runtime_disable(struct kbase_device *kbdev)
-{
-	dev_dbg(kbdev->dev, "kbase_device_runtime_disable\n");
-	pm_runtime_disable(kbdev->dev);
-}
-
-static int pm_callback_runtime_on(struct kbase_device *kbdev)
-{
-	dev_dbg(kbdev->dev, "pm_callback_runtime_on\n");
-
-	return 0;
-}
-
-static void pm_callback_runtime_off(struct kbase_device *kbdev)
-{
-	dev_dbg(kbdev->dev, "pm_callback_runtime_off\n");
-}
-
-static void pm_callback_resume(struct kbase_device *kbdev)
-{
-	int ret = pm_callback_runtime_on(kbdev);
-
-	WARN_ON(ret);
-}
-
-static void pm_callback_suspend(struct kbase_device *kbdev)
-{
-	pm_callback_runtime_off(kbdev);
-}
-
-struct kbase_pm_callback_conf pm_callbacks = {
-	.power_on_callback = pm_callback_power_on,
-	.power_off_callback = pm_callback_power_off,
-	.power_suspend_callback = pm_callback_suspend,
-	.power_resume_callback = pm_callback_resume,
-#ifdef KBASE_PM_RUNTIME
-	.power_runtime_init_callback = kbase_device_runtime_init,
-	.power_runtime_term_callback = kbase_device_runtime_disable,
-	.power_runtime_on_callback = pm_callback_runtime_on,
-	.power_runtime_off_callback = pm_callback_runtime_off,
-#else				/* KBASE_PM_RUNTIME */
-	.power_runtime_init_callback = NULL,
-	.power_runtime_term_callback = NULL,
-	.power_runtime_on_callback = NULL,
-	.power_runtime_off_callback = NULL,
-#endif				/* KBASE_PM_RUNTIME */
-};
-
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/mali_kbase_platform_common.h b/drivers/gpu/arm/bifrost_for_linux/platform/mali_kbase_platform_common.h
deleted file mode 100644
index 7cb3be7f78ce..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/mali_kbase_platform_common.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2013 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/**
- * @brief Entry point to transfer control to a platform for early initialization
- *
- * This function is called early on in the initialization during execution of
- * @ref kbase_driver_init.
- *
- * @return Zero to indicate success non-zero for failure.
- */
-int kbase_platform_early_init(void);
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/rk/Kbuild b/drivers/gpu/arm/bifrost_for_linux/platform/rk/Kbuild
deleted file mode 100755
index 7cc6c59d969f..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/rk/Kbuild
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# (C) COPYRIGHT 2012-2013 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-bifrost_kbase-y += \
-	$(MALI_PLATFORM_DIR)/mali_kbase_config_rk.o \
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/rk/custom_log.h b/drivers/gpu/arm/bifrost_for_linux/platform/rk/custom_log.h
deleted file mode 100755
index 5de70ee13d25..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/rk/custom_log.h
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * (C) COPYRIGHT RockChip Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- */
-
-#ifndef __CUSTOM_LOG_H__
-#define __CUSTOM_LOG_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* -----------------------------------------------------------------------------
- *  Include Files
- * -----------------------------------------------------------------------------
- */
-#include <linux/kernel.h>
-#include <linux/printk.h>
-
-/* -----------------------------------------------------------------------------
- *  Macros Definition
- * -----------------------------------------------------------------------------
- */
-
-/** ????macro ?被定?, ??使能 log 输出. */
-/* #define ENABLE_DEBUG_LOG */
-
-/*----------------------------------------------------------------------------*/
-
-#ifdef ENABLE_VERBOSE_LOG
-/** Verbose log. */
-#define V(fmt, args...) \
-	pr_debug("V : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \
-			"\n",	\
-		__FILE__,	\
-		__LINE__,	\
-		__func__,	\
-		## args)
-#else
-#define  V(...)  ((void)0)
-#endif
-
-#ifdef ENABLE_DEBUG_LOG
-/** Debug log. */
-#define D(fmt, args...) \
-	pr_info("D : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \
-			"\n",	\
-		__FILE__,	\
-		__LINE__,	\
-		__func__,	\
-		## args)
-#else
-#define  D(...)  ((void)0)
-#endif
-
-#define I(fmt, args...) \
-	pr_info("I : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \
-			"\n", \
-		__FILE__, \
-		__LINE__, \
-		__func__, \
-		## args)
-
-#define W(fmt, args...) \
-	pr_warn("W : [File] : %s; [Line] : %d; [Func] : %s(); " \
-			fmt "\n", \
-		__FILE__, \
-		__LINE__, \
-		__func__, \
-		## args)
-
-#define E(fmt, args...) \
-	pr_err("E : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \
-			"\n", \
-		__FILE__, \
-		__LINE__, \
-		__func__, \
-		## args)
-
-/*-------------------------------------------------------*/
-
-/** 使用 D(), 以?进制?形式?????'var' ??value. */
-#define D_DEC(var)  D(#var " = %d.", var)
-
-#define E_DEC(var)  E(#var " = %d.", var)
-
-/** 使用 D(), 以?????形??印?? 'var' ??value. */
-#define D_HEX(var)  D(#var " = 0x%x.", var)
-
-#define E_HEX(var)  E(#var " = 0x%x.", var)
-
-/**
- * 使用 D(), 以?????形?,
- * ?印??类??? 'ptr' ??value.
- */
-#define D_PTR(ptr)  D(#ptr " = %p.", ptr)
-
-#define E_PTR(ptr)  E(#ptr " = %p.", ptr)
-
-/** 使用 D(), ?印 char 字串. */
-#define D_STR(p_str) \
-do { \
-	if (!p_str) { \
-		D(#p_str " = NULL."); \
-	else \
-		D(#p_str " = '%s'.", p_str); \
-} while (0)
-
-#define E_STR(p_str) \
-do { \
-	if (!p_str) \
-		E(#p_str " = NULL."); \
-	else \
-		E(#p_str " = '%s'.", p_str); \
-} while (0)
-
-#ifdef ENABLE_DEBUG_LOG
-/**
- * log ?'p_start' ??开始? 'len' 个????据.
- */
-#define D_MEM(p_start, len) \
-do { \
-	int i = 0; \
-	char *p = (char *)(p_start); \
-	D("dump memory from addr of '" #p_start "', from %p, length %d' : ", \
-		(p_start), \
-		(len)); \
-	pr_debug("\t\t"); \
-	for (i = 0; i < (len); i++) \
-		pr_debug("0x%02x, ", p[i]); \
-	pr_debug("\n"); \
-} while (0)
-#else
-#define  D_MEM(...)  ((void)0)
-#endif
-
-/*-------------------------------------------------------*/
-
-/**
- * ?特定条件?, ?? error ??,
- * 将???'ret_var' 设置 'err_code',
- * log 输出对???Error Caution,
- * ??跳转 'label' ???代????.
- * @param msg
- *	纯?串形式??示信息.
- * @param ret_var
- *	???数???态???????,
- *	将被设置????Error Code.
- *	?常??'ret' or 'result'.
- * @param err_code
- *	表??? error ?常???
- *	?常??宏?形?
- * @param label
- *      程?将?跳转???误处???????
- *      ?常就是 'EXIT'.
- * @param args...
- *      对? 'msg_fmt' 实??
- *      '%s', '%d', ... 等转?说?符?具体可?长实?.
- */
-#define SET_ERROR_AND_JUMP(msg_fmt, ret_var, err_code, label, args...) \
-do { \
-	E("To set '" #ret_var "' to %d('" #err_code "'), because : " msg_fmt, \
-		(err_code), \
-		## args); \
-	(ret_var) = (err_code); \
-	goto label; \
-} while (0)
-
-/* -----------------------------------------------------------------------------
- *  Types and Structures Definition
- * -----------------------------------------------------------------------------
- */
-
-/* -----------------------------------------------------------------------------
- *  Global Functions' Prototype
- * -----------------------------------------------------------------------------
- */
-
-/* -----------------------------------------------------------------------------
- *  Inline Functions Implementation
- * -----------------------------------------------------------------------------
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CUSTOM_LOG_H__ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/rk/mali_kbase_config_platform.h b/drivers/gpu/arm/bifrost_for_linux/platform/rk/mali_kbase_config_platform.h
deleted file mode 100755
index 07c5b6f8a760..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/rk/mali_kbase_config_platform.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- */
-
-/**
- * @file mali_kbase_config_platform.h
- * 声? platform_config_of_rk (platform_rk ??platform_config).
- */
-
-/**
- * Maximum frequency GPU will be clocked at.
- * Given in kHz.
- * This must be specified as there is no default value.
- *
- * Attached value: number in kHz
- * Default value: NA
- */
-#define GPU_FREQ_KHZ_MAX (5000)
-
-/**
- * Minimum frequency GPU will be clocked at.
- * Given in kHz.
- * This must be specified as there is no default value.
- *
- * Attached value: number in kHz
- * Default value: NA
- */
-#define GPU_FREQ_KHZ_MIN (5000)
-
-/**
- * CPU_SPEED_FUNC
- * - A pointer to a function that calculates the CPU clock
- *
- * CPU clock speed of the platform is in MHz
- * - see kbase_cpu_clk_speed_func for the function prototype.
- *
- * Attached value: A kbase_cpu_clk_speed_func.
- * Default Value:  NA
- */
-#define CPU_SPEED_FUNC (NULL)
-
-/**
- * GPU_SPEED_FUNC
- * - A pointer to a function that calculates the GPU clock
- *
- * GPU clock speed of the platform in MHz
- * - see kbase_gpu_clk_speed_func for the function prototype.
- *
- * Attached value: A kbase_gpu_clk_speed_func.
- * Default Value:  NA
- */
-#define GPU_SPEED_FUNC (NULL)
-
-/**
- * Power management configuration
- *
- * Attached value:
- *	pointer to @ref kbase_pm_callback_conf
- * Default value:
- *	See @ref kbase_pm_callback_conf
- */
-#define POWER_MANAGEMENT_CALLBACKS (&pm_callbacks)
-extern struct kbase_pm_callback_conf pm_callbacks;
-
-/**
- * Platform specific configuration functions
- *
- * Attached value:
- *	pointer to @ref kbase_platform_funcs_conf
- * Default value:
- *	See @ref kbase_platform_funcs_conf
- */
-#define PLATFORM_FUNCS (&platform_funcs)
-extern struct kbase_platform_funcs_conf platform_funcs;
-
-/**
- * Secure mode switch
- *
- * Attached value: pointer to @ref kbase_secure_ops
- */
-#define SECURE_CALLBACKS (NULL)
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/rk/mali_kbase_config_rk.c b/drivers/gpu/arm/bifrost_for_linux/platform/rk/mali_kbase_config_rk.c
deleted file mode 100755
index 926c2dd3f8c9..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/rk/mali_kbase_config_rk.c
+++ /dev/null
@@ -1,459 +0,0 @@
-/*
- * (C) COPYRIGHT RockChip Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- */
-
-/* #define ENABLE_DEBUG_LOG */
-#include "custom_log.h"
-
-#include <mali_kbase.h>
-#include <mali_kbase_defs.h>
-#include <mali_kbase_config.h>
-#include <backend/gpu/mali_kbase_pm_internal.h>
-
-#include <linux/pm_runtime.h>
-#include <linux/suspend.h>
-#include <linux/of.h>
-#include <linux/delay.h>
-#include <linux/nvmem-consumer.h>
-#include <linux/soc/rockchip/pvtm.h>
-#include <linux/thermal.h>
-#include <soc/rockchip/rockchip_opp_select.h>
-
-#include "mali_kbase_rk.h"
-
-#define MAX_PROP_NAME_LEN	3
-#define LEAKAGE_TABLE_END	~1
-#define LEAKAGE_INVALID		0xff
-
-struct pvtm_config {
-	unsigned int freq;
-	unsigned int volt;
-	unsigned int ch[2];
-	unsigned int sample_time;
-	unsigned int num;
-	unsigned int err;
-	unsigned int ref_temp;
-	int temp_prop[2];
-	const char *tz_name;
-	struct thermal_zone_device *tz;
-};
-
-struct volt_sel_table {
-	int min;
-	int max;
-	int sel;
-};
-
-/**
- * @file mali_kbase_config_rk.c
- * ?platform_config_of_rk ?具体???
- *
- * mali_device_driver ?含两部??:
- *      .DP : platform_dependent_part_in_mdd :
- *		依? platform ??,
- *		源???<mdd_src_dir>/platform/<platform_name>/
- *		??mali_device_driver ?部,
- *			记为 platform_dependent_part,
- *			也被记为 platform_specific_code.
- *      .DP : common_parts_in_mdd :
- *		arm 实现?通用?部??
- *		源???<mdd_src_dir>/ ?
- *		??mali_device_driver ?部, 记为 common_parts.
- */
-
-/*---------------------------------------------------------------------------*/
-
-#ifdef CONFIG_REGULATOR
-static int rk_pm_enable_regulator(struct kbase_device *kbdev);
-static void rk_pm_disable_regulator(struct kbase_device *kbdev);
-#else
-static inline int rk_pm_enable_regulator(struct kbase_device *kbdev)
-{
-	return 0;
-}
-
-static inline void rk_pm_disable_regulator(struct kbase_device *kbdev)
-{
-}
-#endif
-
-static int rk_pm_enable_clk(struct kbase_device *kbdev);
-
-static void rk_pm_disable_clk(struct kbase_device *kbdev);
-
-static int kbase_platform_rk_create_sysfs_files(struct device *dev);
-
-static void kbase_platform_rk_remove_sysfs_files(struct device *dev);
-
-/*---------------------------------------------------------------------------*/
-
-static void rk_pm_power_off_delay_work(struct work_struct *work)
-{
-	struct rk_context *platform =
-		container_of(to_delayed_work(work), struct rk_context, work);
-	struct kbase_device *kbdev = platform->kbdev;
-
-	if (!platform->is_powered) {
-		D("mali_dev is already powered off.");
-		return;
-	}
-
-	if (pm_runtime_enabled(kbdev->dev)) {
-		D("to put_sync_suspend mali_dev.");
-		pm_runtime_put_sync_suspend(kbdev->dev);
-	}
-
-	rk_pm_disable_regulator(kbdev);
-
-	platform->is_powered = false;
-	KBASE_TIMELINE_GPU_POWER(kbdev, 0);
-	wake_unlock(&platform->wake_lock);
-}
-
-static int kbase_platform_rk_init(struct kbase_device *kbdev)
-{
-	int ret = 0;
-	struct rk_context *platform;
-
-	platform = kzalloc(sizeof(*platform), GFP_KERNEL);
-	if (!platform) {
-		E("err.");
-		return -ENOMEM;
-	}
-
-	platform->is_powered = false;
-	platform->kbdev = kbdev;
-
-	platform->delay_ms = 200;
-	if (of_property_read_u32(kbdev->dev->of_node, "power-off-delay-ms",
-				 &platform->delay_ms))
-		W("power-off-delay-ms not available.");
-
-	platform->power_off_wq = create_freezable_workqueue("gpu_power_off_wq");
-	if (!platform->power_off_wq) {
-		E("couldn't create workqueue");
-		ret = -ENOMEM;
-		goto err_wq;
-	}
-	INIT_DEFERRABLE_WORK(&platform->work, rk_pm_power_off_delay_work);
-
-	wake_lock_init(&platform->wake_lock, WAKE_LOCK_SUSPEND, "gpu");
-
-	platform->utilisation_period = DEFAULT_UTILISATION_PERIOD_IN_MS;
-
-	ret = kbase_platform_rk_create_sysfs_files(kbdev->dev);
-	if (ret) {
-		E("fail to create sysfs_files. ret = %d.", ret);
-		goto err_sysfs_files;
-	}
-
-	kbdev->platform_context = (void *)platform;
-	pm_runtime_enable(kbdev->dev);
-
-	return 0;
-
-err_sysfs_files:
-	wake_lock_destroy(&platform->wake_lock);
-	destroy_workqueue(platform->power_off_wq);
-err_wq:
-	return ret;
-}
-
-static void kbase_platform_rk_term(struct kbase_device *kbdev)
-{
-	struct rk_context *platform =
-		(struct rk_context *)kbdev->platform_context;
-
-	pm_runtime_disable(kbdev->dev);
-	kbdev->platform_context = NULL;
-
-	if (platform) {
-		cancel_delayed_work_sync(&platform->work);
-		wake_lock_destroy(&platform->wake_lock);
-		destroy_workqueue(platform->power_off_wq);
-		platform->is_powered = false;
-		platform->kbdev = NULL;
-		kfree(platform);
-	}
-	kbase_platform_rk_remove_sysfs_files(kbdev->dev);
-}
-
-struct kbase_platform_funcs_conf platform_funcs = {
-	.platform_init_func = &kbase_platform_rk_init,
-	.platform_term_func = &kbase_platform_rk_term,
-};
-
-/*---------------------------------------------------------------------------*/
-
-static int rk_pm_callback_runtime_on(struct kbase_device *kbdev)
-{
-	return 0;
-}
-
-static void rk_pm_callback_runtime_off(struct kbase_device *kbdev)
-{
-}
-
-static int rk_pm_callback_power_on(struct kbase_device *kbdev)
-{
-	int ret = 1; /* Assume GPU has been powered off */
-	int err = 0;
-	struct rk_context *platform = get_rk_context(kbdev);
-
-	cancel_delayed_work_sync(&platform->work);
-
-	err = rk_pm_enable_clk(kbdev);
-	if (err) {
-		E("failed to enable clk: %d", err);
-		return err;
-	}
-
-	if (platform->is_powered) {
-		D("mali_device is already powered.");
-		return 0;
-	}
-
-	/* we must enable vdd_gpu before pd_gpu_in_chip. */
-	err = rk_pm_enable_regulator(kbdev);
-	if (err) {
-		E("fail to enable regulator, err : %d.", err);
-		return err;
-	}
-
-	/* ??mali_dev ??runtime_pm ??enabled ?? ??.. */
-	if (pm_runtime_enabled(kbdev->dev)) {
-		D("to resume mali_dev syncly.");
-		/* ?pd_in_chip ??on ??,
-		 * 将在 pm_domain ??runtime_pm_callbacks 中???
-		 */
-		err = pm_runtime_get_sync(kbdev->dev);
-		if (err < 0) {
-			E("failed to runtime resume device: %d.", err);
-			return err;
-		} else if (err == 1) { /* runtime_pm_status is still active */
-			D("chip has NOT been powered off, no need to re-init.");
-			ret = 0;
-		}
-	}
-
-	platform->is_powered = true;
-	KBASE_TIMELINE_GPU_POWER(kbdev, 1);
-	wake_lock(&platform->wake_lock);
-
-	return ret;
-}
-
-static void rk_pm_callback_power_off(struct kbase_device *kbdev)
-{
-	struct rk_context *platform = get_rk_context(kbdev);
-
-	rk_pm_disable_clk(kbdev);
-	queue_delayed_work(platform->power_off_wq, &platform->work,
-			   msecs_to_jiffies(platform->delay_ms));
-}
-
-int rk_kbase_device_runtime_init(struct kbase_device *kbdev)
-{
-	return 0;
-}
-
-void rk_kbase_device_runtime_disable(struct kbase_device *kbdev)
-{
-}
-
-struct kbase_pm_callback_conf pm_callbacks = {
-	.power_on_callback = rk_pm_callback_power_on,
-	.power_off_callback = rk_pm_callback_power_off,
-#ifdef CONFIG_PM
-	.power_runtime_init_callback = rk_kbase_device_runtime_init,
-	.power_runtime_term_callback = rk_kbase_device_runtime_disable,
-	.power_runtime_on_callback = rk_pm_callback_runtime_on,
-	.power_runtime_off_callback = rk_pm_callback_runtime_off,
-#else				/* CONFIG_PM */
-	.power_runtime_init_callback = NULL,
-	.power_runtime_term_callback = NULL,
-	.power_runtime_on_callback = NULL,
-	.power_runtime_off_callback = NULL,
-#endif				/* CONFIG_PM */
-};
-
-int kbase_platform_early_init(void)
-{
-	/* Nothing needed at this stage */
-	return 0;
-}
-
-/*---------------------------------------------------------------------------*/
-
-void kbase_platform_rk_shutdown(struct kbase_device *kbdev)
-{
-	I("to make vdd_gpu enabled for turning off pd_gpu in pm_framework.");
-	rk_pm_enable_regulator(kbdev);
-}
-
-/*---------------------------------------------------------------------------*/
-
-#ifdef CONFIG_REGULATOR
-static int rk_pm_enable_regulator(struct kbase_device *kbdev)
-{
-	int ret = 0;
-
-	if (!kbdev->regulator) {
-		W("no mali regulator control, no need to enable.");
-		goto EXIT;
-	}
-
-	D("to enable regulator.");
-	ret = regulator_enable(kbdev->regulator);
-	if (ret) {
-		E("fail to enable regulator, ret : %d.", ret);
-		goto EXIT;
-	}
-
-EXIT:
-	return ret;
-}
-
-static void rk_pm_disable_regulator(struct kbase_device *kbdev)
-{
-	if (!(kbdev->regulator)) {
-		W("no mali regulator control, no need to disable.");
-		return;
-	}
-
-	D("to disable regulator.");
-	regulator_disable(kbdev->regulator);
-}
-#endif
-
-static int rk_pm_enable_clk(struct kbase_device *kbdev)
-{
-	int err = 0;
-
-	if (!(kbdev->clock)) {
-		W("no mali clock control, no need to enable.");
-	} else {
-		D("to enable clk.");
-		err = clk_enable(kbdev->clock);
-		if (err)
-			E("failed to enable clk: %d.", err);
-	}
-
-	return err;
-}
-
-static void rk_pm_disable_clk(struct kbase_device *kbdev)
-{
-	if (!(kbdev->clock)) {
-		W("no mali clock control, no need to disable.");
-	} else {
-		D("to disable clk.");
-		clk_disable(kbdev->clock);
-	}
-}
-
-/*---------------------------------------------------------------------------*/
-
-static ssize_t utilisation_period_show(struct device *dev,
-				       struct device_attribute *attr,
-				       char *buf)
-{
-	struct kbase_device *kbdev = dev_get_drvdata(dev);
-	struct rk_context *platform = get_rk_context(kbdev);
-	ssize_t ret = 0;
-
-	ret += snprintf(buf, PAGE_SIZE, "%u\n", platform->utilisation_period);
-
-	return ret;
-}
-
-static ssize_t utilisation_period_store(struct device *dev,
-					struct device_attribute *attr,
-					const char *buf,
-					size_t count)
-{
-	struct kbase_device *kbdev = dev_get_drvdata(dev);
-	struct rk_context *platform = get_rk_context(kbdev);
-	int ret = 0;
-
-	ret = kstrtouint(buf, 0, &platform->utilisation_period);
-	if (ret) {
-		E("invalid input period : %s.", buf);
-		return ret;
-	}
-	D("set utilisation_period to '%d'.", platform->utilisation_period);
-
-	return count;
-}
-
-static ssize_t utilisation_show(struct device *dev,
-				struct device_attribute *attr,
-				char *buf)
-{
-	struct kbase_device *kbdev = dev_get_drvdata(dev);
-	struct rk_context *platform = get_rk_context(kbdev);
-	ssize_t ret = 0;
-	unsigned long period_in_us = platform->utilisation_period * 1000;
-	unsigned long total_time;
-	unsigned long busy_time;
-	unsigned long utilisation;
-
-	kbase_pm_reset_dvfs_utilisation(kbdev);
-	usleep_range(period_in_us, period_in_us + 100);
-	kbase_pm_get_dvfs_utilisation(kbdev, &total_time, &busy_time);
-	/* 'devfreq_dev_profile' instance registered to devfreq
-	 * also uses kbase_pm_reset_dvfs_utilisation
-	 * and kbase_pm_get_dvfs_utilisation.
-	 * it's better to cat this file when DVFS is disabled.
-	 */
-	D("total_time : %lu, busy_time : %lu.", total_time, busy_time);
-
-	utilisation = busy_time * 100 / total_time;
-	ret += snprintf(buf, PAGE_SIZE, "%ld\n", utilisation);
-
-	return ret;
-}
-
-static DEVICE_ATTR_RW(utilisation_period);
-static DEVICE_ATTR_RO(utilisation);
-
-static int kbase_platform_rk_create_sysfs_files(struct device *dev)
-{
-	int ret = 0;
-
-	ret = device_create_file(dev, &dev_attr_utilisation_period);
-	if (ret) {
-		E("fail to create sysfs file 'utilisation_period'.");
-		goto out;
-	}
-
-	ret = device_create_file(dev, &dev_attr_utilisation);
-	if (ret) {
-		E("fail to create sysfs file 'utilisation'.");
-		goto remove_utilisation_period;
-	}
-
-	return 0;
-
-remove_utilisation_period:
-	device_remove_file(dev, &dev_attr_utilisation_period);
-out:
-	return ret;
-}
-
-static void kbase_platform_rk_remove_sysfs_files(struct device *dev)
-{
-	device_remove_file(dev, &dev_attr_utilisation_period);
-	device_remove_file(dev, &dev_attr_utilisation);
-}
-
-int kbase_platform_rk_init_opp_table(struct kbase_device *kbdev)
-{
-	return rockchip_init_opp_table(kbdev->dev, NULL,
-				       "gpu_leakage", "mali");
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/rk/mali_kbase_rk.h b/drivers/gpu/arm/bifrost_for_linux/platform/rk/mali_kbase_rk.h
deleted file mode 100755
index 6eab25014d21..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/rk/mali_kbase_rk.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* drivers/gpu/t6xx/kbase/src/platform/rk/mali_kbase_platform.h
- * Rockchip SoC Mali-Midgard platform-dependent codes
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software FoundatIon.
- */
-
-/**
- * @file mali_kbase_rk.h
- *
- * defines work_context type of platform_dependent_part.
- */
-
-#ifndef _MALI_KBASE_RK_H_
-#define _MALI_KBASE_RK_H_
-
-#include <linux/wakelock.h>
-
-/*---------------------------------------------------------------------------*/
-
-#define DEFAULT_UTILISATION_PERIOD_IN_MS (100)
-
-/*---------------------------------------------------------------------------*/
-
-/*
- * struct rk_context - work_context of platform_dependent_part_of_rk.
- */
-struct rk_context {
-	/*
-	 * record the status of common_parts calling 'power_on_callback'
-	 * and 'power_off_callback'.
-	 */
-	bool is_powered;
-
-	struct kbase_device *kbdev;
-
-	struct workqueue_struct *power_off_wq;
-	/* delayed_work_to_power_off_gpu. */
-	struct delayed_work work;
-	unsigned int delay_ms;
-
-	/*
-	 * WAKE_LOCK_SUSPEND for ensuring to run
-	 * delayed_work_to_power_off_gpu before suspend.
-	 */
-	struct wake_lock wake_lock;
-
-	/* debug only, the period in ms to count gpu_utilisation. */
-	unsigned int utilisation_period;
-};
-
-/*---------------------------------------------------------------------------*/
-
-static inline struct rk_context *get_rk_context(
-		const struct kbase_device *kbdev)
-{
-	return (struct rk_context *)(kbdev->platform_context);
-}
-
-#endif				/* _MALI_KBASE_RK_H_ */
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/Kbuild b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/Kbuild
deleted file mode 100644
index d9d5e9085231..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/Kbuild
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# (C) COPYRIGHT 2012-2013, 2016-2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-mali_kbase-y += \
-	$(MALI_PLATFORM_DIR)/mali_kbase_config_vexpress.o \
-	$(MALI_PLATFORM_DIR)/mali_kbase_cpu_vexpress.o \
-	mali_kbase_platform_fake.o
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/mali_kbase_config_platform.h b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/mali_kbase_config_platform.h
deleted file mode 100644
index 02835f129aa3..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/mali_kbase_config_platform.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include "mali_kbase_cpu_vexpress.h"
-
-/**
- * Maximum frequency GPU will be clocked at. Given in kHz.
- * This must be specified as there is no default value.
- *
- * Attached value: number in kHz
- * Default value: NA
- */
-#define GPU_FREQ_KHZ_MAX kbase_get_platform_max_freq()
-/**
- * Minimum frequency GPU will be clocked at. Given in kHz.
- * This must be specified as there is no default value.
- *
- * Attached value: number in kHz
- * Default value: NA
- */
-#define GPU_FREQ_KHZ_MIN kbase_get_platform_min_freq()
-
-/**
- * CPU_SPEED_FUNC - A pointer to a function that calculates the CPU clock
- *
- * CPU clock speed of the platform is in MHz - see kbase_cpu_clk_speed_func
- * for the function prototype.
- *
- * Attached value: A kbase_cpu_clk_speed_func.
- * Default Value:  NA
- */
-#define CPU_SPEED_FUNC (&kbase_get_vexpress_cpu_clock_speed)
-
-/**
- * GPU_SPEED_FUNC - A pointer to a function that calculates the GPU clock
- *
- * GPU clock speed of the platform in MHz - see kbase_gpu_clk_speed_func
- * for the function prototype.
- *
- * Attached value: A kbase_gpu_clk_speed_func.
- * Default Value:  NA
- */
-#define GPU_SPEED_FUNC (NULL)
-
-/**
- * Power management configuration
- *
- * Attached value: pointer to @ref kbase_pm_callback_conf
- * Default value: See @ref kbase_pm_callback_conf
- */
-#define POWER_MANAGEMENT_CALLBACKS (&pm_callbacks)
-
-/**
- * Platform specific configuration functions
- *
- * Attached value: pointer to @ref kbase_platform_funcs_conf
- * Default value: See @ref kbase_platform_funcs_conf
- */
-#define PLATFORM_FUNCS (NULL)
-
-extern struct kbase_pm_callback_conf pm_callbacks;
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/mali_kbase_config_vexpress.c b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/mali_kbase_config_vexpress.c
deleted file mode 100644
index 15ce2bc5eea5..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/mali_kbase_config_vexpress.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#include <linux/ioport.h>
-#include <mali_kbase.h>
-#include <mali_kbase_defs.h>
-#include <mali_kbase_config.h>
-#include "mali_kbase_cpu_vexpress.h"
-#include "mali_kbase_config_platform.h"
-
-#define HARD_RESET_AT_POWER_OFF 0
-
-#ifndef CONFIG_OF
-static struct kbase_io_resources io_resources = {
-	.job_irq_number = 68,
-	.mmu_irq_number = 69,
-	.gpu_irq_number = 70,
-	.io_memory_region = {
-	.start = 0xFC010000,
-	.end = 0xFC010000 + (4096 * 4) - 1
-	}
-};
-#endif /* CONFIG_OF */
-
-static int pm_callback_power_on(struct kbase_device *kbdev)
-{
-	/* Nothing is needed on VExpress, but we may have destroyed GPU state (if the below HARD_RESET code is active) */
-	return 1;
-}
-
-static void pm_callback_power_off(struct kbase_device *kbdev)
-{
-#if HARD_RESET_AT_POWER_OFF
-	/* Cause a GPU hard reset to test whether we have actually idled the GPU
-	 * and that we properly reconfigure the GPU on power up.
-	 * Usually this would be dangerous, but if the GPU is working correctly it should
-	 * be completely safe as the GPU should not be active at this point.
-	 * However this is disabled normally because it will most likely interfere with
-	 * bus logging etc.
-	 */
-	KBASE_TRACE_ADD(kbdev, CORE_GPU_HARD_RESET, NULL, NULL, 0u, 0);
-	kbase_os_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND), GPU_COMMAND_HARD_RESET);
-#endif
-}
-
-struct kbase_pm_callback_conf pm_callbacks = {
-	.power_on_callback = pm_callback_power_on,
-	.power_off_callback = pm_callback_power_off,
-	.power_suspend_callback  = NULL,
-	.power_resume_callback = NULL
-};
-
-static struct kbase_platform_config versatile_platform_config = {
-#ifndef CONFIG_OF
-	.io_resources = &io_resources
-#endif
-};
-
-struct kbase_platform_config *kbase_get_platform_config(void)
-{
-	return &versatile_platform_config;
-}
-
-
-int kbase_platform_early_init(void)
-{
-	/* Nothing needed at this stage */
-	return 0;
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/mali_kbase_cpu_vexpress.c b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/mali_kbase_cpu_vexpress.c
deleted file mode 100644
index 4665f98cbbe4..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/mali_kbase_cpu_vexpress.c
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <linux/io.h>
-#include <mali_kbase.h>
-#include "mali_kbase_cpu_vexpress.h"
-
-#define HZ_IN_MHZ (1000000)
-
-#define CORETILE_EXPRESS_A9X4_SCC_START	(0x100E2000)
-#define MOTHERBOARD_SYS_CFG_START	(0x10000000)
-#define SYS_CFGDATA_OFFSET		(0x000000A0)
-#define SYS_CFGCTRL_OFFSET		(0x000000A4)
-#define SYS_CFGSTAT_OFFSET		(0x000000A8)
-
-#define SYS_CFGCTRL_START_BIT_VALUE		(1 << 31)
-#define READ_REG_BIT_VALUE			(0 << 30)
-#define DCC_DEFAULT_BIT_VALUE			(0 << 26)
-#define SYS_CFG_OSC_FUNC_BIT_VALUE		(1 << 20)
-#define SITE_DEFAULT_BIT_VALUE			(1 << 16)
-#define BOARD_STACK_POS_DEFAULT_BIT_VALUE	(0 << 12)
-#define DEVICE_DEFAULT_BIT_VALUE		(2 <<  0)
-#define SYS_CFG_COMPLETE_BIT_VALUE		(1 <<  0)
-#define SYS_CFG_ERROR_BIT_VALUE			(1 <<  1)
-
-#define FEED_REG_BIT_MASK			(0x0F)
-#define FCLK_PA_DIVIDE_BIT_SHIFT		(0x03)
-#define FCLK_PB_DIVIDE_BIT_SHIFT		(0x07)
-#define FCLK_PC_DIVIDE_BIT_SHIFT		(0x0B)
-#define AXICLK_PA_DIVIDE_BIT_SHIFT		(0x0F)
-#define AXICLK_PB_DIVIDE_BIT_SHIFT		(0x13)
-
-/* the following three values used for reading
- * HBI value of the LogicTile daughterboard */
-#define VE_MOTHERBOARD_PERIPHERALS_SMB_CS7 (0x10000000)
-#define VE_SYS_PROC_ID1_OFFSET (0x00000088)
-#define VE_LOGIC_TILE_HBI_MASK (0x00000FFF)
-
-#define IS_SINGLE_BIT_SET(val, pos) (val&(1<<pos))
-
-/**
- * Values used for determining the GPU frequency based on the LogicTile type
- * Used by the function kbase_get_platform_logic_tile_type
- */
-#define VE_VIRTEX6_GPU_FREQ_MIN 5000
-#define VE_VIRTEX6_GPU_FREQ_MAX 5000
-#define VE_VIRTEX7_GPU_FREQ_MIN 40000
-#define VE_VIRTEX7_GPU_FREQ_MAX 40000
-#define VE_DEFAULT_GPU_FREQ_MIN 5000
-#define VE_DEFAULT_GPU_FREQ_MAX 5000
-
-
-#define CPU_CLOCK_SPEED_UNDEFINED (0)
-
-static u32 cpu_clock_speed = CPU_CLOCK_SPEED_UNDEFINED;
-
-static DEFINE_RAW_SPINLOCK(syscfg_lock);
-/**
- * kbase_get_vendor_specific_cpu_clock_speed -Retrieves the CPU clock speed
- * @cpu_clock - the value of CPU clock speed in MHz
- *
- * Returns 0 on success, error code otherwise.
- *
- * The implementation is platform specific.
-*/
-int kbase_get_vexpress_cpu_clock_speed(u32 *cpu_clock)
-{
-	int err = 0;
-	u32 reg_val = 0;
-	u32 osc2_value = 0;
-	u32 pa_divide = 0;
-	u32 pb_divide = 0;
-	u32 pc_divide = 0;
-	void __iomem *syscfg_reg = NULL;
-	void __iomem *scc_reg = NULL;
-
-	if (CPU_CLOCK_SPEED_UNDEFINED != cpu_clock_speed) {
-		*cpu_clock = cpu_clock_speed;
-		return 0;
-	}
-
-	/* Init the value in case something goes wrong */
-	*cpu_clock = 0;
-
-	/* Map CPU register into virtual memory */
-	syscfg_reg = ioremap(MOTHERBOARD_SYS_CFG_START, 0x1000);
-	if (syscfg_reg == NULL) {
-		err = -EIO;
-		goto syscfg_reg_map_failed;
-	}
-
-	scc_reg = ioremap(CORETILE_EXPRESS_A9X4_SCC_START, 0x1000);
-	if (scc_reg == NULL) {
-		err = -EIO;
-		goto scc_reg_map_failed;
-	}
-
-	raw_spin_lock(&syscfg_lock);
-
-	/* Read SYS regs - OSC2 */
-	reg_val = readl(syscfg_reg + SYS_CFGCTRL_OFFSET);
-
-	/* Check if there is any other undergoing request */
-	if (reg_val & SYS_CFGCTRL_START_BIT_VALUE) {
-		err = -EBUSY;
-		goto ongoing_request;
-	}
-	/* Reset the CGFGSTAT reg */
-	writel(0, (syscfg_reg + SYS_CFGSTAT_OFFSET));
-
-	writel(SYS_CFGCTRL_START_BIT_VALUE | READ_REG_BIT_VALUE |
-			DCC_DEFAULT_BIT_VALUE |
-			SYS_CFG_OSC_FUNC_BIT_VALUE |
-			SITE_DEFAULT_BIT_VALUE |
-			BOARD_STACK_POS_DEFAULT_BIT_VALUE |
-			DEVICE_DEFAULT_BIT_VALUE,
-			(syscfg_reg + SYS_CFGCTRL_OFFSET));
-	/* Wait for the transaction to complete */
-	while (!(readl(syscfg_reg + SYS_CFGSTAT_OFFSET) &
-			SYS_CFG_COMPLETE_BIT_VALUE))
-		;
-	/* Read SYS_CFGSTAT Register to get the status of submitted
-	 * transaction */
-	reg_val = readl(syscfg_reg + SYS_CFGSTAT_OFFSET);
-
-	if (reg_val & SYS_CFG_ERROR_BIT_VALUE) {
-		/* Error while setting register */
-		err = -EIO;
-		goto set_reg_error;
-	}
-
-	osc2_value = readl(syscfg_reg + SYS_CFGDATA_OFFSET);
-	/* Read the SCC CFGRW0 register */
-	reg_val = readl(scc_reg);
-
-	/*
-	 * Select the appropriate feed:
-	 * CFGRW0[0] - CLKOB
-	 * CFGRW0[1] - CLKOC
-	 * CFGRW0[2] - FACLK (CLK)B FROM AXICLK PLL)
-	 */
-	/* Calculate the  FCLK */
-	if (IS_SINGLE_BIT_SET(reg_val, 0)) {
-		/* CFGRW0[0] - CLKOB */
-		/* CFGRW0[6:3] */
-		pa_divide = ((reg_val & (FEED_REG_BIT_MASK <<
-				FCLK_PA_DIVIDE_BIT_SHIFT)) >>
-				FCLK_PA_DIVIDE_BIT_SHIFT);
-		/* CFGRW0[10:7] */
-		pb_divide = ((reg_val & (FEED_REG_BIT_MASK <<
-				FCLK_PB_DIVIDE_BIT_SHIFT)) >>
-				FCLK_PB_DIVIDE_BIT_SHIFT);
-		*cpu_clock = osc2_value * (pa_divide + 1) / (pb_divide + 1);
-	} else if (IS_SINGLE_BIT_SET(reg_val, 1)) {
-		/* CFGRW0[1] - CLKOC */
-		/* CFGRW0[6:3] */
-		pa_divide = ((reg_val & (FEED_REG_BIT_MASK <<
-				FCLK_PA_DIVIDE_BIT_SHIFT)) >>
-				FCLK_PA_DIVIDE_BIT_SHIFT);
-		/* CFGRW0[14:11] */
-		pc_divide = ((reg_val & (FEED_REG_BIT_MASK <<
-				FCLK_PC_DIVIDE_BIT_SHIFT)) >>
-				FCLK_PC_DIVIDE_BIT_SHIFT);
-		*cpu_clock = osc2_value * (pa_divide + 1) / (pc_divide + 1);
-	} else if (IS_SINGLE_BIT_SET(reg_val, 2)) {
-		/* CFGRW0[2] - FACLK */
-		/* CFGRW0[18:15] */
-		pa_divide = ((reg_val & (FEED_REG_BIT_MASK <<
-				AXICLK_PA_DIVIDE_BIT_SHIFT)) >>
-				AXICLK_PA_DIVIDE_BIT_SHIFT);
-		/* CFGRW0[22:19] */
-		pb_divide = ((reg_val & (FEED_REG_BIT_MASK <<
-				AXICLK_PB_DIVIDE_BIT_SHIFT)) >>
-				AXICLK_PB_DIVIDE_BIT_SHIFT);
-		*cpu_clock = osc2_value * (pa_divide + 1) / (pb_divide + 1);
-	} else {
-		err = -EIO;
-	}
-
-set_reg_error:
-ongoing_request:
-	raw_spin_unlock(&syscfg_lock);
-	*cpu_clock /= HZ_IN_MHZ;
-
-	if (!err)
-		cpu_clock_speed = *cpu_clock;
-
-	iounmap(scc_reg);
-
-scc_reg_map_failed:
-	iounmap(syscfg_reg);
-
-syscfg_reg_map_failed:
-
-	return err;
-}
-
-/**
- * kbase_get_platform_logic_tile_type -  determines which LogicTile type
- * is used by Versatile Express
- *
- * When platform_config build parameter is specified as vexpress, i.e.,
- * platform_config=vexpress, GPU frequency may vary dependent on the
- * particular platform. The GPU frequency depends on the LogicTile type.
- *
- * This function determines which LogicTile type is used by the platform by
- * reading the HBI value of the daughterboard which holds the LogicTile:
- *
- * 0x217 HBI0217 Virtex-6
- * 0x192 HBI0192 Virtex-5
- * 0x247 HBI0247 Virtex-7
- *
- * Return: HBI value of the logic tile daughterboard, zero if not accessible
- */
-static u32 kbase_get_platform_logic_tile_type(void)
-{
-	void __iomem *syscfg_reg = NULL;
-	u32 sys_procid1 = 0;
-
-	syscfg_reg = ioremap(VE_MOTHERBOARD_PERIPHERALS_SMB_CS7 + VE_SYS_PROC_ID1_OFFSET, 4);
-	if (NULL != syscfg_reg) {
-		sys_procid1 = readl(syscfg_reg);
-		iounmap(syscfg_reg);
-	}
-
-	return sys_procid1 & VE_LOGIC_TILE_HBI_MASK;
-}
-
-u32 kbase_get_platform_min_freq(void)
-{
-	u32 ve_logic_tile = kbase_get_platform_logic_tile_type();
-
-	switch (ve_logic_tile) {
-	case 0x217:
-		/* Virtex 6, HBI0217 */
-		return VE_VIRTEX6_GPU_FREQ_MIN;
-	case 0x247:
-		/* Virtex 7, HBI0247 */
-		return VE_VIRTEX7_GPU_FREQ_MIN;
-	default:
-		/* all other logic tiles, i.e., Virtex 5 HBI0192
-		 * or unsuccessful reading from the platform -
-		 * fall back to some default value */
-		return VE_DEFAULT_GPU_FREQ_MIN;
-	}
-}
-
-u32 kbase_get_platform_max_freq(void)
-{
-	u32 ve_logic_tile = kbase_get_platform_logic_tile_type();
-
-	switch (ve_logic_tile) {
-	case 0x217:
-		/* Virtex 6, HBI0217 */
-		return VE_VIRTEX6_GPU_FREQ_MAX;
-	case 0x247:
-		/* Virtex 7, HBI0247 */
-		return VE_VIRTEX7_GPU_FREQ_MAX;
-	default:
-		/* all other logic tiles, i.e., Virtex 5 HBI0192
-		 * or unsuccessful reading from the platform -
-		 * fall back to some default value */
-		return VE_DEFAULT_GPU_FREQ_MAX;
-	}
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/mali_kbase_cpu_vexpress.h b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/mali_kbase_cpu_vexpress.h
deleted file mode 100644
index da865698133a..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress/mali_kbase_cpu_vexpress.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2013, 2015-2016 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#ifndef _KBASE_CPU_VEXPRESS_H_
-#define _KBASE_CPU_VEXPRESS_H_
-
-/**
- * Versatile Express implementation of @ref kbase_cpu_clk_speed_func.
- */
-int kbase_get_vexpress_cpu_clock_speed(u32 *cpu_clock);
-
-/**
- * Get the minimum GPU frequency for the attached logic tile
- */
-u32 kbase_get_platform_min_freq(void);
-
-/**
- * Get the maximum GPU frequency for the attached logic tile
- */
-u32 kbase_get_platform_max_freq(void);
-
-#endif				/* _KBASE_CPU_VEXPRESS_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_1xv7_a57/Kbuild b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_1xv7_a57/Kbuild
deleted file mode 100644
index df87c74f43ba..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_1xv7_a57/Kbuild
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# (C) COPYRIGHT 2013-2014, 2016-2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-mali_kbase-y += \
-	$(MALI_PLATFORM_DIR)/mali_kbase_config_vexpress.o \
-	mali_kbase_platform_fake.o
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_1xv7_a57/mali_kbase_config_platform.h b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_1xv7_a57/mali_kbase_config_platform.h
deleted file mode 100644
index 0efbf3962f98..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_1xv7_a57/mali_kbase_config_platform.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/**
- * Maximum frequency GPU will be clocked at. Given in kHz.
- * This must be specified as there is no default value.
- *
- * Attached value: number in kHz
- * Default value: NA
- */
-#define GPU_FREQ_KHZ_MAX 5000
-/**
- * Minimum frequency GPU will be clocked at. Given in kHz.
- * This must be specified as there is no default value.
- *
- * Attached value: number in kHz
- * Default value: NA
- */
-#define GPU_FREQ_KHZ_MIN 5000
-
-/**
- * CPU_SPEED_FUNC - A pointer to a function that calculates the CPU clock
- *
- * CPU clock speed of the platform is in MHz - see kbase_cpu_clk_speed_func
- * for the function prototype.
- *
- * Attached value: A kbase_cpu_clk_speed_func.
- * Default Value:  NA
- */
-#define CPU_SPEED_FUNC (&kbase_cpuprops_get_default_clock_speed)
-
-/**
- * GPU_SPEED_FUNC - A pointer to a function that calculates the GPU clock
- *
- * GPU clock speed of the platform in MHz - see kbase_gpu_clk_speed_func
- * for the function prototype.
- *
- * Attached value: A kbase_gpu_clk_speed_func.
- * Default Value:  NA
- */
-#define GPU_SPEED_FUNC (NULL)
-
-/**
- * Power management configuration
- *
- * Attached value: pointer to @ref kbase_pm_callback_conf
- * Default value: See @ref kbase_pm_callback_conf
- */
-#define POWER_MANAGEMENT_CALLBACKS (&pm_callbacks)
-
-/**
- * Platform specific configuration functions
- *
- * Attached value: pointer to @ref kbase_platform_funcs_conf
- * Default value: See @ref kbase_platform_funcs_conf
- */
-#define PLATFORM_FUNCS (NULL)
-
-extern struct kbase_pm_callback_conf pm_callbacks;
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_1xv7_a57/mali_kbase_config_vexpress.c b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_1xv7_a57/mali_kbase_config_vexpress.c
deleted file mode 100644
index 3ff0930fb4a3..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_1xv7_a57/mali_kbase_config_vexpress.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2014 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <linux/ioport.h>
-#include <mali_kbase.h>
-#include <mali_kbase_defs.h>
-#include <mali_kbase_config.h>
-
-#define HARD_RESET_AT_POWER_OFF 0
-
-#ifndef CONFIG_OF
-static struct kbase_io_resources io_resources = {
-	.job_irq_number = 68,
-	.mmu_irq_number = 69,
-	.gpu_irq_number = 70,
-	.io_memory_region = {
-			     .start = 0x2f010000,
-			     .end = 0x2f010000 + (4096 * 4) - 1}
-};
-#endif
-
-static int pm_callback_power_on(struct kbase_device *kbdev)
-{
-	/* Nothing is needed on VExpress, but we may have destroyed GPU state (if the below HARD_RESET code is active) */
-	return 1;
-}
-
-static void pm_callback_power_off(struct kbase_device *kbdev)
-{
-#if HARD_RESET_AT_POWER_OFF
-	/* Cause a GPU hard reset to test whether we have actually idled the GPU
-	 * and that we properly reconfigure the GPU on power up.
-	 * Usually this would be dangerous, but if the GPU is working correctly it should
-	 * be completely safe as the GPU should not be active at this point.
-	 * However this is disabled normally because it will most likely interfere with
-	 * bus logging etc.
-	 */
-	KBASE_TRACE_ADD(kbdev, CORE_GPU_HARD_RESET, NULL, NULL, 0u, 0);
-	kbase_os_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND), GPU_COMMAND_HARD_RESET);
-#endif
-}
-
-struct kbase_pm_callback_conf pm_callbacks = {
-	.power_on_callback = pm_callback_power_on,
-	.power_off_callback = pm_callback_power_off,
-	.power_suspend_callback  = NULL,
-	.power_resume_callback = NULL
-};
-
-static struct kbase_platform_config versatile_platform_config = {
-#ifndef CONFIG_OF
-	.io_resources = &io_resources
-#endif
-};
-
-struct kbase_platform_config *kbase_get_platform_config(void)
-{
-	return &versatile_platform_config;
-}
-
-int kbase_platform_early_init(void)
-{
-	/* Nothing needed at this stage */
-	return 0;
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/Kbuild b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/Kbuild
deleted file mode 100644
index d9d5e9085231..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/Kbuild
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# (C) COPYRIGHT 2012-2013, 2016-2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-mali_kbase-y += \
-	$(MALI_PLATFORM_DIR)/mali_kbase_config_vexpress.o \
-	$(MALI_PLATFORM_DIR)/mali_kbase_cpu_vexpress.o \
-	mali_kbase_platform_fake.o
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_platform.h b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_platform.h
deleted file mode 100644
index dbdf21e009f9..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_platform.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include "mali_kbase_cpu_vexpress.h"
-
-/**
- * Maximum frequency GPU will be clocked at. Given in kHz.
- * This must be specified as there is no default value.
- *
- * Attached value: number in kHz
- * Default value: NA
- */
-#define GPU_FREQ_KHZ_MAX 10000
-/**
- * Minimum frequency GPU will be clocked at. Given in kHz.
- * This must be specified as there is no default value.
- *
- * Attached value: number in kHz
- * Default value: NA
- */
-#define GPU_FREQ_KHZ_MIN 10000
-
-/**
- * CPU_SPEED_FUNC - A pointer to a function that calculates the CPU clock
- *
- * CPU clock speed of the platform is in MHz - see kbase_cpu_clk_speed_func
- * for the function prototype.
- *
- * Attached value: A kbase_cpu_clk_speed_func.
- * Default Value:  NA
- */
-#define CPU_SPEED_FUNC (&kbase_get_vexpress_cpu_clock_speed)
-
-/**
- * GPU_SPEED_FUNC - A pointer to a function that calculates the GPU clock
- *
- * GPU clock speed of the platform in MHz - see kbase_gpu_clk_speed_func
- * for the function prototype.
- *
- * Attached value: A kbase_gpu_clk_speed_func.
- * Default Value:  NA
- */
-#define GPU_SPEED_FUNC (NULL)
-
-/**
- * Power management configuration
- *
- * Attached value: pointer to @ref kbase_pm_callback_conf
- * Default value: See @ref kbase_pm_callback_conf
- */
-#define POWER_MANAGEMENT_CALLBACKS (&pm_callbacks)
-
-/**
- * Platform specific configuration functions
- *
- * Attached value: pointer to @ref kbase_platform_funcs_conf
- * Default value: See @ref kbase_platform_funcs_conf
- */
-#define PLATFORM_FUNCS (NULL)
-
-extern struct kbase_pm_callback_conf pm_callbacks;
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_vexpress.c b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_vexpress.c
deleted file mode 100644
index 76ffe4a1e59e..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/mali_kbase_config_vexpress.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2014 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#include <linux/ioport.h>
-#include <mali_kbase.h>
-#include <mali_kbase_defs.h>
-#include <mali_kbase_config.h>
-#include "mali_kbase_cpu_vexpress.h"
-
-#define HARD_RESET_AT_POWER_OFF 0
-
-#ifndef CONFIG_OF
-static struct kbase_io_resources io_resources = {
-	.job_irq_number = 75,
-	.mmu_irq_number = 76,
-	.gpu_irq_number = 77,
-	.io_memory_region = {
-			     .start = 0x2F000000,
-			     .end = 0x2F000000 + (4096 * 4) - 1}
-};
-#endif
-
-static int pm_callback_power_on(struct kbase_device *kbdev)
-{
-	/* Nothing is needed on VExpress, but we may have destroyed GPU state (if the below HARD_RESET code is active) */
-	return 1;
-}
-
-static void pm_callback_power_off(struct kbase_device *kbdev)
-{
-#if HARD_RESET_AT_POWER_OFF
-	/* Cause a GPU hard reset to test whether we have actually idled the GPU
-	 * and that we properly reconfigure the GPU on power up.
-	 * Usually this would be dangerous, but if the GPU is working correctly it should
-	 * be completely safe as the GPU should not be active at this point.
-	 * However this is disabled normally because it will most likely interfere with
-	 * bus logging etc.
-	 */
-	KBASE_TRACE_ADD(kbdev, CORE_GPU_HARD_RESET, NULL, NULL, 0u, 0);
-	kbase_os_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND), GPU_COMMAND_HARD_RESET);
-#endif
-}
-
-struct kbase_pm_callback_conf pm_callbacks = {
-	.power_on_callback = pm_callback_power_on,
-	.power_off_callback = pm_callback_power_off,
-	.power_suspend_callback  = NULL,
-	.power_resume_callback = NULL
-};
-
-static struct kbase_platform_config versatile_platform_config = {
-#ifndef CONFIG_OF
-	.io_resources = &io_resources
-#endif
-};
-
-struct kbase_platform_config *kbase_get_platform_config(void)
-{
-	return &versatile_platform_config;
-}
-
-int kbase_platform_early_init(void)
-{
-	/* Nothing needed at this stage */
-	return 0;
-}
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/mali_kbase_cpu_vexpress.c b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/mali_kbase_cpu_vexpress.c
deleted file mode 100644
index 816dff49835f..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/mali_kbase_cpu_vexpress.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2011-2013 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#include <linux/io.h>
-#include <mali_kbase.h>
-#include "mali_kbase_cpu_vexpress.h"
-
-#define HZ_IN_MHZ					    (1000000)
-
-#define CORETILE_EXPRESS_A9X4_SCC_START	(0x100E2000)
-#define MOTHERBOARD_SYS_CFG_START		(0x10000000)
-#define SYS_CFGDATA_OFFSET				(0x000000A0)
-#define SYS_CFGCTRL_OFFSET				(0x000000A4)
-#define SYS_CFGSTAT_OFFSET				(0x000000A8)
-
-#define SYS_CFGCTRL_START_BIT_VALUE		  (1 << 31)
-#define READ_REG_BIT_VALUE				  (0 << 30)
-#define DCC_DEFAULT_BIT_VALUE			  (0 << 26)
-#define SYS_CFG_OSC_FUNC_BIT_VALUE		  (1 << 20)
-#define SITE_DEFAULT_BIT_VALUE			  (1 << 16)
-#define BOARD_STACK_POS_DEFAULT_BIT_VALUE (0 << 12)
-#define DEVICE_DEFAULT_BIT_VALUE	      (2 <<  0)
-#define SYS_CFG_COMPLETE_BIT_VALUE		  (1 <<  0)
-#define SYS_CFG_ERROR_BIT_VALUE			  (1 <<  1)
-
-#define FEED_REG_BIT_MASK				(0x0F)
-#define FCLK_PA_DIVIDE_BIT_SHIFT		(0x03)
-#define FCLK_PB_DIVIDE_BIT_SHIFT		(0x07)
-#define FCLK_PC_DIVIDE_BIT_SHIFT		(0x0B)
-#define AXICLK_PA_DIVIDE_BIT_SHIFT		(0x0F)
-#define AXICLK_PB_DIVIDE_BIT_SHIFT		(0x13)
-
-#define IS_SINGLE_BIT_SET(val, pos)		(val&(1<<pos))
-
-#define CPU_CLOCK_SPEED_UNDEFINED 0
-
-#define CPU_CLOCK_SPEED_6XV7 50
-
-static u32 cpu_clock_speed = CPU_CLOCK_SPEED_UNDEFINED;
-
-static DEFINE_RAW_SPINLOCK(syscfg_lock);
-/**
- * kbase_get_vendor_specific_cpu_clock_speed
- * @brief  Retrieves the CPU clock speed.
- *         The implementation is platform specific.
- * @param[out]    cpu_clock - the value of CPU clock speed in MHz
- * @return        0 on success, 1 otherwise
-*/
-int kbase_get_vexpress_cpu_clock_speed(u32 *cpu_clock)
-{
-	/* TODO: MIDBASE-2873 - Provide runtime detection of CPU clock freq for 6XV7 board */
-	*cpu_clock = CPU_CLOCK_SPEED_6XV7;
-
-	return 0;
-}
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/mali_kbase_cpu_vexpress.h b/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/mali_kbase_cpu_vexpress.h
deleted file mode 100644
index 23647ccb0871..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform/vexpress_6xvirtex7_10mhz/mali_kbase_cpu_vexpress.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2012-2013, 2015 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-#ifndef _KBASE_CPU_VEXPRESS_H_
-#define _KBASE_CPU_VEXPRESS_H_
-
-/**
- * Versatile Express implementation of @ref kbase_cpu_clk_speed_func.
- */
-int kbase_get_vexpress_cpu_clock_speed(u32 *cpu_clock);
-
-#endif				/* _KBASE_CPU_VEXPRESS_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/platform_dummy/mali_ukk_os.h b/drivers/gpu/arm/bifrost_for_linux/platform_dummy/mali_ukk_os.h
deleted file mode 100644
index 5fa9b39c4bc0..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/platform_dummy/mali_ukk_os.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010, 2012-2014 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-
-
-/**
- * @file mali_ukk_os.h
- * Types and definitions that are common for Linux OSs for the kernel side of the
- * User-Kernel interface.
- */
-
-#ifndef _UKK_OS_H_ /* Linux version */
-#define _UKK_OS_H_
-
-#include <linux/fs.h>
-
-/**
- * @addtogroup uk_api User-Kernel Interface API
- * @{
- */
-
-/**
- * @addtogroup uk_api_kernel UKK (Kernel side)
- * @{
- */
-
-/**
- * Internal OS specific data structure associated with each UKK session. Part
- * of a ukk_session object.
- */
-typedef struct ukkp_session {
-	int dummy;     /**< No internal OS specific data at this time */
-} ukkp_session;
-
-/** @} end group uk_api_kernel */
-
-/** @} end group uk_api */
-
-#endif /* _UKK_OS_H__ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/protected_mode_switcher.h b/drivers/gpu/arm/bifrost_for_linux/protected_mode_switcher.h
deleted file mode 100644
index 5dc2f3ba8cf6..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/protected_mode_switcher.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _PROTECTED_MODE_SWITCH_H_
-#define _PROTECTED_MODE_SWITCH_H_
-
-struct protected_mode_device;
-
-/**
- * struct protected_mode_ops - Callbacks for protected mode switch operations
- *
- * @protected_mode_enable:  Callback to enable protected mode for device
- * @protected_mode_disable: Callback to disable protected mode for device
- */
-struct protected_mode_ops {
-	/**
-	 * protected_mode_enable() - Enable protected mode on device
-	 * @dev:	The struct device
-	 *
-	 * Return: 0 on success, non-zero on error
-	 */
-	int (*protected_mode_enable)(
-			struct protected_mode_device *protected_dev);
-
-	/**
-	 * protected_mode_disable() - Disable protected mode on device, and
-	 *                            reset device
-	 * @dev:	The struct device
-	 *
-	 * Return: 0 on success, non-zero on error
-	 */
-	int (*protected_mode_disable)(
-			struct protected_mode_device *protected_dev);
-};
-
-/**
- * struct protected_mode_device - Device structure for protected mode devices
- *
- * @ops  - Callbacks associated with this device
- * @data - Pointer to device private data
- *
- * This structure should be registered with the platform device using
- * platform_set_drvdata().
- */
-struct protected_mode_device {
-	struct protected_mode_ops ops;
-	void *data;
-};
-
-#endif /* _PROTECTED_MODE_SWITCH_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/sconscript b/drivers/gpu/arm/bifrost_for_linux/sconscript
deleted file mode 100644
index e738dd7a3869..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/sconscript
+++ /dev/null
@@ -1,72 +0,0 @@
-#
-# (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-import sys
-Import('env')
-
-SConscript( 'tests/sconscript' )
-
-mock_test = 0
-
-# Source files required for kbase.
-kbase_src = [
-	Glob('*.c'),
-	Glob('backend/*/*.c'),
-	Glob('internal/*/*.c'),
-	Glob('ipa/*.c'),
-	Glob('platform/%s/*.c' % env['platform_config']),
-]
-
-if env['platform_config']=='juno_soc':
-	kbase_src += [Glob('platform/devicetree/*.c')]
-else:
-	kbase_src += [Glob('platform/%s/*.c' % env['platform_config'])]
-
-if Glob('#kernel/drivers/gpu/arm/midgard/tests/internal/src/mock') and env['unit'] == '1':
-	kbase_src += [Glob('#kernel/drivers/gpu/arm/midgard/tests/internal/src/mock/*.c')]
-	mock_test = 1
-
-make_args = env.kernel_get_config_defines(ret_list = True) + [
-	'PLATFORM=%s' % env['platform'],
-	'MALI_ERROR_INJECT_ON=%s' % env['error_inject'],
-	'MALI_KERNEL_TEST_API=%s' % env['debug'],
-	'MALI_UNIT_TEST=%s' % env['unit'],
-	'MALI_RELEASE_NAME=%s' % env['mali_release_name'],
-	'MALI_MOCK_TEST=%s' % mock_test,
-	'MALI_CUSTOMER_RELEASE=%s' % env['release'],
-	'MALI_INSTRUMENTATION_LEVEL=%s' % env['instr'],
-	'MALI_COVERAGE=%s' % env['coverage'],
-]
-
-kbase = env.BuildKernelModule('$STATIC_LIB_PATH/mali_kbase.ko', kbase_src,
-                              make_args = make_args)
-
-# Add a dependency on kds.ko.
-# Only necessary when KDS is not built into the kernel.
-#
-if env['os'] != 'android':
-	if not env.KernelConfigEnabled("CONFIG_KDS"):
-		env.Depends(kbase, '$STATIC_LIB_PATH/kds.ko')
-
-# need Module.symvers from ump.ko build
-if int(env['ump']) == 1:
-	env.Depends(kbase, '$STATIC_LIB_PATH/ump.ko')
-
-if 'smc_protected_mode_switcher' in env:
-	env.Depends('$STATIC_LIB_PATH/mali_kbase.ko', '$STATIC_LIB_PATH/smc_protected_mode_switcher.ko')
-
-env.KernelObjTarget('kbase', kbase)
-
-env.AppendUnique(BASE=['cutils_linked_list'])
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/Kbuild b/drivers/gpu/arm/bifrost_for_linux/tests/Kbuild
deleted file mode 100644
index b4bed0473439..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/Kbuild
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-obj-$(CONFIG_MALI_KUTF) += kutf/
-obj-$(CONFIG_MALI_IRQ_LATENCY) += mali_kutf_irq_test/
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/Kconfig b/drivers/gpu/arm/bifrost_for_linux/tests/Kconfig
deleted file mode 100644
index da0515c065de..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/Kconfig
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-source "drivers/gpu/arm/midgard/tests/kutf/Kconfig"
-source "drivers/gpu/arm/midgard/tests/mali_kutf_irq_test/Kconfig"
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_helpers.h b/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_helpers.h
deleted file mode 100644
index 3f1dfc244d30..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_helpers.h
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KERNEL_UTF_HELPERS_H_
-#define _KERNEL_UTF_HELPERS_H_
-
-/* kutf_helpers.h
- * Test helper functions for the kernel UTF test infrastructure.
- *
- * This collection of helper functions are provided as 'stock' implementation
- * helpers for certain features of kutf. Tests can implement common/boilerplate
- * functionality using these, whilst still providing them the option of
- * implementing completely custom functions themselves to use those kutf
- * features.
- */
-
-#include <kutf/kutf_suite.h>
-#include <kutf/kutf_mem.h>
-#include <linux/wait.h>
-
-/**
- * enum kutf_helper_textbuf_flag - flags for textbufs
- * @KUTF_HELPER_TEXTBUF_FLAG_DYING:	Test is dying, textbuf should not allow
- *                                      writes, nor block on empty.
- */
-enum kutf_helper_textbuf_flag {
-	KUTF_HELPER_TEXTBUF_FLAG_DYING = (1u << 0),
-};
-
-/**
- * struct kutf_helper_textbuf_line - Structure representing a line of text
- *
- * The string itself is stored immediately after this.
- *
- * @node:		List node for the textbuf's textbuf_list
- * @str_size:		Length of the string buffer, including the \0 terminator
- * @str:		'Flexible array' for the string representing the line
- */
-struct kutf_helper_textbuf_line {
-	struct list_head node;
-	int str_size;
-	char str[];
-};
-
-/**
- * struct kutf_helper_textbuf - Structure to representing sequential lines of
- *                              text
- * @lock:		mutex to hold whilst accessing the structure
- * @nr_user_clients:	Number of userspace clients connected via an open()
- *                      call
- * @mempool:		mempool for allocating lines
- * @scratchpad:		scratch area for receiving text of size max_line_size
- * @used_bytes:		number of valid bytes in the scratchpad
- * @prev_pos:		Previous position userspace has accessed
- * @prev_line_pos:	Previous start of line position userspace has accessed
- * @textbuf_list:	List head to store all the lines of text
- * @max_line_size:	Maximum size in memory allowed for a line of text
- * @max_nr_lines:	Maximum number of lines permitted in this textbuf
- * @nr_lines:		Number of entries in textbuf_list
- * @flags:		Flags indicating state of the textbuf, using values
- *                      from enum kutf_helper_textbuf_flag
- * @user_opened_wq:	Waitq for when there's at least one userspace client
- *                      connected to the textbuf via an open() call
- * @not_full_wq:	Waitq for when the textbuf can be enqueued into/can
- *                      consume data from userspace
- * @not_empty_wq:	Waitq for when the textbuf can be dequeued from/can
- *                      produce data for userspace
- */
-
-struct kutf_helper_textbuf {
-	struct mutex lock;
-	int nr_user_clients;
-	struct kutf_mempool *mempool;
-	char *scratchpad;
-	int used_bytes;
-	loff_t prev_pos;
-	loff_t prev_line_pos;
-	struct list_head textbuf_list;
-	int max_line_size;
-	int max_nr_lines;
-	int nr_lines;
-	unsigned long flags;
-	wait_queue_head_t user_opened_wq;
-	wait_queue_head_t not_full_wq;
-	wait_queue_head_t not_empty_wq;
-
-};
-
-/* stock callbacks for userspace to read from/write to the 'data' file as a
- * textbuf */
-extern struct kutf_userdata_ops kutf_helper_textbuf_userdata_ops;
-
-/**
- * kutf_helper_textbuf_init() - init a textbuf for use as a 'data' file
- *                              consumer/producer
- * @textbuf:		textbuf to initialize
- * @mempool:		mempool to allocate from
- * @max_line_size:	maximum line size expected to/from userspace
- * @max_nr_lines:	maximum number of lines to expect to/from userspace
- *
- * Initialize a textbuf so that it can consume writes made to the 'data' file,
- * and produce reads for userspace on the 'data' file. Tests may then read the
- * lines written by userspace, or fill the buffer so it may be read back by
- * userspace.
- *
- * The caller should write the @textbuf pointer into the kutf_context's
- * userdata_producer_priv or userdata_consumer_priv member during fixture
- * creation.
- *
- * Usually a test will have separate textbufs for userspace to write to and
- * read from. Using the same one for both will echo back to the user what they
- * are writing.
- *
- * Lines are understood as being separated by the '\n' character, but no '\n'
- * characters will be observed by the test
- *
- * @max_line_size puts an upper bound on the size of lines in a textbuf,
- * including the \0 terminator. Lines exceeding this will be truncated,
- * effectively ignoring incoming data until the next '\n'
- *
- * Combining this with @max_nr_lines puts an upper bound on the size of the
- * file read in
- *
- * Return:		0 on success, or negative value on error.
- */
-int kutf_helper_textbuf_init(struct kutf_helper_textbuf *textbuf,
-		struct kutf_mempool *mempool, int max_line_size,
-		int max_nr_lines);
-
-/**
- * kutf_helper_textbuf_wait_for_user() - wait for userspace to open the 'data'
- *                                       file
- * @textbuf:		textbuf to wait on
- *
- * This can be used to synchronize with userspace so that subsequent calls to
- * kutf_helper_textbuf_dequeue() and kutf_helper_textbuf_enqueue() should
- * succeed.
- *
- * Waiting is done on a timeout.
- *
- * There is of course no guarantee that userspace will keep the file open after
- * this, but any error in the dequeue/enqueue functions afterwards can be
- * treated as such rather than "we're still waiting for userspace to begin"
- *
- * Return:		0 if waited successfully, -ETIMEDOUT if we exceeded the
- *                      timeout, or some other negative value if there was an
- *                      error during waiting.
- */
-
-int kutf_helper_textbuf_wait_for_user(struct kutf_helper_textbuf *textbuf);
-
-
-/**
- * kutf_helper_textbuf_dequeue() - dequeue a line from a textbuf
- * @textbuf:		textbuf dequeue a line as a string from
- * @str_size:		pointer to storage to receive the size of the string,
- *                      which includes the '\0' terminator, or NULL if not
- *                      required
- *
- * Dequeue (remove) a line from the start of the textbuf as a string, and
- * return it.
- *
- * If no lines are available, then this will block until a line has been
- * submitted. If a userspace client is not connected and there are no remaining
- * lines, then this function returns NULL instead.
- *
- * The memory for the string comes from the kutf_mempool given during
- * initialization of the textbuf, and shares the same lifetime as it.
- *
- * Return:		pointer to the next line of the textbuf. NULL indicated
- *                      all userspace clients disconnected. An error value to be
- *                      checked with IS_ERR() family of functions if a signal or
- *                      some other error occurred
- */
-char *kutf_helper_textbuf_dequeue(struct kutf_helper_textbuf *textbuf,
-		int *str_size);
-
-/**
- * kutf_helper_textbuf_enqueue() - enqueue a line to a textbuf
- * @textbuf:		textbuf to enqueue a line as a string to
- * @enqueue_str:	pointer to the string to enqueue to the textbuf
- * @buf_max_size:	maximum size of the buffer holding @enqueue_str
- *
- * Enqueue (add) a line to the end of a textbuf as a string.
- *
- * The caller should avoid placing '\n' characters in their strings, as these
- * will not be split into multiple lines.
- *
- * A copy of the string will be made into the textbuf, so @enqueue_str can be
- * freed immediately after if.the caller wishes to do so.
- *
- * If the maximum amount of lines has been reached, then this will block until
- * a line has been removed to make space. If a userspace client is not
- * connected and there is no space available, then this function returns
- * -EBUSY.
- *
- * Return:		0 on success, or negative value on error
- */
-int kutf_helper_textbuf_enqueue(struct kutf_helper_textbuf *textbuf,
-		char *enqueue_str, int buf_max_size);
-
-#endif	/* _KERNEL_UTF_HELPERS_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_helpers_user.h b/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_helpers_user.h
deleted file mode 100644
index 759bf717c7cd..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_helpers_user.h
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KERNEL_UTF_HELPERS_USER_H_
-#define _KERNEL_UTF_HELPERS_USER_H_
-
-/* kutf_helpers.h
- * Test helper functions for the kernel UTF test infrastructure, whose
- * implementation mirrors that of similar functions for kutf-userside
- */
-
-#include <kutf/kutf_suite.h>
-#include <kutf/kutf_helpers.h>
-
-
-#define KUTF_HELPER_MAX_VAL_NAME_LEN 255
-
-enum kutf_helper_valtype {
-	KUTF_HELPER_VALTYPE_INVALID,
-	KUTF_HELPER_VALTYPE_U64,
-	KUTF_HELPER_VALTYPE_STR,
-
-	KUTF_HELPER_VALTYPE_COUNT /* Must be last */
-};
-
-struct kutf_helper_named_val {
-	enum kutf_helper_valtype type;
-	char *val_name;
-	union {
-		u64 val_u64;
-		char *val_str;
-	} u;
-};
-
-/* Extra error values for certain helpers when we want to distinguish between
- * Linux's own error values too.
- *
- * These can only be used on certain functions returning an int type that are
- * documented as returning one of these potential values, they cannot be used
- * from functions return a ptr type, since we can't decode it with PTR_ERR
- *
- * No negative values are used - Linux error codes should be used instead, and
- * indicate a problem in accessing the data file itself (are generally
- * unrecoverable)
- *
- * Positive values indicate correct access but invalid parsing (can be
- * recovered from assuming data in the future is correct) */
-enum kutf_helper_err {
-	/* No error - must be zero */
-	KUTF_HELPER_ERR_NONE = 0,
-	/* Named value parsing encountered an invalid name */
-	KUTF_HELPER_ERR_INVALID_NAME,
-	/* Named value parsing of string or u64 type encountered extra
-	 * characters after the value (after the last digit for a u64 type or
-	 * after the string end delimiter for string type) */
-	KUTF_HELPER_ERR_CHARS_AFTER_VAL,
-	/* Named value parsing of string type couldn't find the string end
-	 * delimiter.
-	 *
-	 * This cannot be encountered when the NAME="value" message exceeds the
-	 * textbuf's maximum line length, because such messages are not checked
-	 * for an end string delimiter */
-	KUTF_HELPER_ERR_NO_END_DELIMITER,
-	/* Named value didn't parse as any of the known types */
-	KUTF_HELPER_ERR_INVALID_VALUE,
-};
-
-
-/* textbuf Send named NAME=value pair, u64 value
- *
- * NAME must match [A-Z0-9_]\+ and can be up to MAX_VAL_NAME_LEN characters long
- *
- * This is assuming the kernel-side test is using the 'textbuf' helpers
- *
- * Any failure will be logged on the suite's current test fixture
- *
- * Returns 0 on success, non-zero on failure
- */
-int kutf_helper_textbuf_send_named_u64(struct kutf_context *context,
-		struct kutf_helper_textbuf *textbuf, char *val_name, u64 val);
-
-/* Get the maximum length of a string that can be represented as a particular
- * NAME="value" pair without string-value truncation in the kernel's buffer
- *
- * Given val_name and the kernel buffer's size, this can be used to determine
- * the maximum length of a string that can be sent as val_name="value" pair
- * without having the string value truncated. Any string longer than this will
- * be truncated at some point during communication to this size.
- *
- * The calculation is valid both for sending strings of val_str_len to kernel,
- * and for receiving a string that was originally val_str_len from the kernel.
- *
- * It is assumed that valname is a valid name for
- * kutf_test_helpers_textbuf_send_named_str(), and no checking will be made to
- * ensure this.
- *
- * Returns the maximum string length that can be represented, or a negative
- * value if the NAME="value" encoding itself wouldn't fit in kern_buf_sz
- */
-int kutf_helper_textbuf_max_str_len_for_kern(char *val_name, int kern_buf_sz);
-
-/* textbuf Send named NAME="str" pair
- *
- * no escaping allowed in str. Any of the following characters will terminate
- * the string: '"' '\\' '\n'
- *
- * NAME must match [A-Z0-9_]\+ and can be up to MAX_VAL_NAME_LEN characters long
- *
- * This is assuming the kernel-side test is using the 'textbuf' helpers
- *
- * Any failure will be logged on the suite's current test fixture
- *
- * Returns 0 on success, non-zero on failure */
-int kutf_helper_textbuf_send_named_str(struct kutf_context *context,
-		struct kutf_helper_textbuf *textbuf, char *val_name,
-		char *val_str);
-
-/* textbuf Receive named NAME=value pair
- *
- * This can receive u64 and string values - check named_val->type
- *
- * If you are not planning on dynamic handling of the named value's name and
- * type, then kutf_test_helpers_textbuf_receive_check_val() is more useful as a
- * convenience function.
- *
- * String members of named_val will come from memory allocated on the fixture's mempool
- *
- * Returns 0 on success. Negative value on failure to receive from the 'data'
- * file, positive value indicates an enum kutf_helper_err value for correct
- * reception of data but invalid parsing */
-int kutf_helper_textbuf_receive_named_val(struct kutf_helper_named_val *named_val,
-		struct kutf_helper_textbuf *textbuf);
-
-/* textbuf Receive and validate NAME=value pair
- *
- * As with kutf_test_helpers_textbuf_receive_named_val, but validate that the
- * name and type are as expected, as a convenience for a common pattern found
- * in tests.
- *
- * NOTE: this only returns an error value if there was actually a problem
- * receiving data.
- *
- * NOTE: If the underlying data was received correctly, but:
- * - isn't of the expected name
- * - isn't the expected type
- * - isn't correctly parsed for the type
- * then the following happens:
- * - failure result is recorded
- * - named_val->type will be KUTF_HELPER_VALTYPE_INVALID
- * - named_val->u will contain some default value that should be relatively
- *   harmless for the test, including being writable in the case of string
- *   values
- * - return value will be 0 to indicate success
- *
- * The rationale behind this is that we'd prefer to continue the rest of the
- * test with failures propagated, rather than hitting a timeout */
-int kutf_helper_textbuf_receive_check_val(struct kutf_helper_named_val *named_val,
-		struct kutf_context *context, struct kutf_helper_textbuf *textbuf,
-		char *expect_val_name, enum kutf_helper_valtype expect_val_type);
-
-/* Output a named value to kmsg */
-void kutf_helper_output_named_val(struct kutf_helper_named_val *named_val);
-
-
-#endif	/* _KERNEL_UTF_HELPERS_USER_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_mem.h b/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_mem.h
deleted file mode 100644
index 584c9dd4bc13..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_mem.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014, 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KERNEL_UTF_MEM_H_
-#define _KERNEL_UTF_MEM_H_
-
-/* kutf_mem.h
- * Functions for management of memory pools in the kernel.
- *
- * This module implements a memory pool allocator, allowing a test
- * implementation to allocate linked allocations which can then be freed by a
- * single free which releases all of the resources held by the entire pool.
- *
- * Note that it is not possible to free single resources within the pool once
- * allocated.
- */
-
-#include <linux/list.h>
-#include <linux/mutex.h>
-
-/**
- * struct kutf_mempool - the memory pool context management structure
- * @head:	list head on which the allocations in this context are added to
- * @lock:	mutex for concurrent allocation from multiple threads
- *
- */
-struct kutf_mempool {
-	struct list_head head;
-	struct mutex lock;
-};
-
-/**
- * kutf_mempool_init() - Initialize a memory pool.
- * @pool:	Memory pool structure to initialize, provided by the user
- *
- * Return:	zero on success
- */
-int kutf_mempool_init(struct kutf_mempool *pool);
-
-/**
- * kutf_mempool_alloc() - Allocate memory from a pool
- * @pool:	Memory pool to allocate from
- * @size:	Size of memory wanted in number of bytes
- *
- * Return:	Pointer to memory on success, NULL on failure.
- */
-void *kutf_mempool_alloc(struct kutf_mempool *pool, size_t size);
-
-/**
- * kutf_mempool_destroy() - Destroy a memory pool, freeing all memory within it.
- * @pool:	The memory pool to free
- */
-void kutf_mempool_destroy(struct kutf_mempool *pool);
-#endif	/* _KERNEL_UTF_MEM_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_resultset.h b/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_resultset.h
deleted file mode 100644
index 1cc85f1b7a46..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_resultset.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014, 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KERNEL_UTF_RESULTSET_H_
-#define _KERNEL_UTF_RESULTSET_H_
-
-/* kutf_resultset.h
- * Functions and structures for handling test results and result sets.
- *
- * This section of the kernel UTF contains structures and functions used for the
- * management of Results and Result Sets.
- */
-
-/**
- * enum kutf_result_status - Status values for a single Test error.
- * @KUTF_RESULT_BENCHMARK:	Result is a meta-result containing benchmark
- *                              results.
- * @KUTF_RESULT_SKIP:		The test was skipped.
- * @KUTF_RESULT_UNKNOWN:	The test has an unknown result.
- * @KUTF_RESULT_PASS:		The test result passed.
- * @KUTF_RESULT_DEBUG:		The test result passed, but raised a debug
- *                              message.
- * @KUTF_RESULT_INFO:		The test result passed, but raised
- *                              an informative message.
- * @KUTF_RESULT_WARN:		The test result passed, but raised a warning
- *                              message.
- * @KUTF_RESULT_FAIL:		The test result failed with a non-fatal error.
- * @KUTF_RESULT_FATAL:		The test result failed with a fatal error.
- * @KUTF_RESULT_ABORT:		The test result failed due to a non-UTF
- *                              assertion failure.
- * @KUTF_RESULT_COUNT:		The current number of possible status messages.
- */
-enum kutf_result_status {
-	KUTF_RESULT_BENCHMARK = -3,
-	KUTF_RESULT_SKIP    = -2,
-	KUTF_RESULT_UNKNOWN = -1,
-
-	KUTF_RESULT_PASS    = 0,
-	KUTF_RESULT_DEBUG   = 1,
-	KUTF_RESULT_INFO    = 2,
-	KUTF_RESULT_WARN    = 3,
-	KUTF_RESULT_FAIL    = 4,
-	KUTF_RESULT_FATAL   = 5,
-	KUTF_RESULT_ABORT   = 6,
-
-	KUTF_RESULT_COUNT
-};
-
-/* The maximum size of a kutf_result_status result when
- * converted to a string
- */
-#define KUTF_ERROR_MAX_NAME_SIZE 21
-
-#ifdef __KERNEL__
-
-#include <kutf/kutf_mem.h>
-
-/**
- * struct kutf_result - Represents a single test result.
- * @node:	Next result in the list of results.
- * @status:	The status summary (pass / warn / fail / etc).
- * @message:	A more verbose status message.
- */
-struct kutf_result {
-	struct list_head            node;
-	enum kutf_result_status     status;
-	const char                  *message;
-};
-
-/**
- * kutf_create_result_set() - Create a new result set
- *                            to which results can be added.
- *
- * Return: The created resultset.
- */
-struct kutf_result_set *kutf_create_result_set(void);
-
-/**
- * kutf_add_result() - Add a result to the end of an existing resultset.
- *
- * @mempool:	The memory pool to allocate the result storage from.
- * @set:	The resultset to add the result to.
- * @status:	The result status to add.
- * @message:	The result message to add.
- */
-void kutf_add_result(struct kutf_mempool *mempool, struct kutf_result_set *set,
-		enum kutf_result_status status, const char *message);
-
-/**
- * kutf_remove_result() - Remove a result from the head of a resultset.
- * @set:	The resultset.
- *
- * Return: result or NULL if there are no further results in the resultset.
- */
-struct kutf_result *kutf_remove_result(
-		struct kutf_result_set *set);
-
-/**
- * kutf_destroy_result_set() - Free a previously created resultset.
- *
- * @results:	The result set whose resources to free.
- */
-void kutf_destroy_result_set(struct kutf_result_set *results);
-
-#endif	/* __KERNEL__ */
-
-#endif	/* _KERNEL_UTF_RESULTSET_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_suite.h b/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_suite.h
deleted file mode 100644
index cba2b2d84d62..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_suite.h
+++ /dev/null
@@ -1,568 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014, 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KERNEL_UTF_SUITE_H_
-#define _KERNEL_UTF_SUITE_H_
-
-/* kutf_suite.h
- * Functions for management of test suites.
- *
- * This collection of data structures, macros, and functions are used to
- * create Test Suites, Tests within those Test Suites, and Fixture variants
- * of each test.
- */
-
-#include <linux/kref.h>
-
-#include <kutf/kutf_mem.h>
-#include <kutf/kutf_resultset.h>
-
-/**
- * Pseudo-flag indicating an absence of any specified test class. Note that
- * tests should not be annotated with this constant as it is simply a zero
- * value; tests without a more specific class must be marked with the flag
- * KUTF_F_TEST_GENERIC.
- */
-#define KUTF_F_TEST_NONE                ((unsigned int)(0))
-
-/**
- * Class indicating this test is a smoke test.
- * A given set of smoke tests should be quick to run, enabling rapid turn-around
- * of "regress-on-commit" test runs.
- */
-#define KUTF_F_TEST_SMOKETEST           ((unsigned int)(1 << 1))
-
-/**
- * Class indicating this test is a performance test.
- * These tests typically produce a performance metric, such as "time to run" or
- * "frames per second",
- */
-#define KUTF_F_TEST_PERFORMANCE         ((unsigned int)(1 << 2))
-
-/**
- * Class indicating that this test is a deprecated test.
- * These tests have typically been replaced by an alternative test which is
- * more efficient, or has better coverage.
- */
-#define KUTF_F_TEST_DEPRECATED          ((unsigned int)(1 << 3))
-
-/**
- * Class indicating that this test is a known failure.
- * These tests have typically been run and failed, but marking them as a known
- * failure means it is easier to triage results.
- *
- * It is typically more convenient to triage known failures using the
- * results database and web UI, as this means there is no need to modify the
- * test code.
- */
-#define KUTF_F_TEST_EXPECTED_FAILURE    ((unsigned int)(1 << 4))
-
-/**
- * Class indicating that this test is a generic test, which is not a member of
- * a more specific test class. Tests which are not created with a specific set
- * of filter flags by the user are assigned this test class by default.
- */
-#define KUTF_F_TEST_GENERIC             ((unsigned int)(1 << 5))
-
-/**
- * Class indicating this test is a resource allocation failure test.
- * A resource allocation failure test will test that an error code is
- * correctly propagated when an allocation fails.
- */
-#define KUTF_F_TEST_RESFAIL             ((unsigned int)(1 << 6))
-
-/**
- * Additional flag indicating that this test is an expected failure when
- * run in resource failure mode. These tests are never run when running
- * the low resource mode.
- */
-#define KUTF_F_TEST_EXPECTED_FAILURE_RF ((unsigned int)(1 << 7))
-
-/**
- * Flag reserved for user-defined filter zero.
- */
-#define KUTF_F_TEST_USER_0 ((unsigned int)(1 << 24))
-
-/**
- * Flag reserved for user-defined filter one.
- */
-#define KUTF_F_TEST_USER_1 ((unsigned int)(1 << 25))
-
-/**
- * Flag reserved for user-defined filter two.
- */
-#define KUTF_F_TEST_USER_2 ((unsigned int)(1 << 26))
-
-/**
- * Flag reserved for user-defined filter three.
- */
-#define KUTF_F_TEST_USER_3 ((unsigned int)(1 << 27))
-
-/**
- * Flag reserved for user-defined filter four.
- */
-#define KUTF_F_TEST_USER_4 ((unsigned int)(1 << 28))
-
-/**
- * Flag reserved for user-defined filter five.
- */
-#define KUTF_F_TEST_USER_5 ((unsigned int)(1 << 29))
-
-/**
- * Flag reserved for user-defined filter six.
- */
-#define KUTF_F_TEST_USER_6 ((unsigned int)(1 << 30))
-
-/**
- * Flag reserved for user-defined filter seven.
- */
-#define KUTF_F_TEST_USER_7 ((unsigned int)(1 << 31))
-
-/**
- * Pseudo-flag indicating that all test classes should be executed.
- */
-#define KUTF_F_TEST_ALL                 ((unsigned int)(0xFFFFFFFFU))
-
-/**
- * union kutf_callback_data - Union used to store test callback data
- * @ptr_value:		pointer to the location where test callback data
- *                      are stored
- * @u32_value:		a number which represents test callback data
- */
-union kutf_callback_data {
-	void *ptr_value;
-	u32  u32_value;
-};
-
-/**
- * struct kutf_userdata_ops- Structure defining methods to exchange data
- *                           with userspace via the 'data' file
- * @open:		Function used to notify when the 'data' file was opened
- * @release:		Function used to notify when the 'data' file was closed
- * @notify_ended:	Function used to notify when the test has ended.
- * @consumer:		Function used to consume writes from userspace
- * @producer:		Function used to produce data for userspace to read
- *
- * All ops can be NULL.
- */
-struct kutf_userdata_ops {
-	int (*open)(void *priv);
-	void (*release)(void *priv);
-	void (*notify_ended)(void *priv);
-	ssize_t (*consumer)(void *priv, const char  __user *userbuf,
-			size_t userbuf_len, loff_t *ppos);
-	ssize_t (*producer)(void *priv, char  __user *userbuf,
-			size_t userbuf_len, loff_t *ppos);
-};
-
-/**
- * struct kutf_context - Structure representing a kernel test context
- * @kref:		Refcount for number of users of this context
- * @suite:		Convenience pointer to the suite this context
- *                      is running
- * @test_fix:		The fixture that is being run in this context
- * @fixture_pool:	The memory pool used for the duration of
- *                      the fixture/text context.
- * @fixture:		The user provided fixture structure.
- * @fixture_index:	The index (id) of the current fixture.
- * @fixture_name:	The name of the current fixture (or NULL if unnamed).
- * @test_data:		Any user private data associated with this test
- * @result_set:		All the results logged by this test context
- * @status:		The status of the currently running fixture.
- * @expected_status:	The expected status on exist of the currently
- *                      running fixture.
- * @userdata_consumer_priv:	Parameter to pass into kutf_userdata_ops
- *                              consumer function. Must not be NULL if a
- *                              consumer function was specified
- * @userdata_producer_priv:	Parameter to pass into kutf_userdata_ops
- *                              producer function. Must not be NULL if a
- *                              producer function was specified
- * @userdata_dentry:	The debugfs file for userdata exchange
- */
-struct kutf_context {
-	struct kref                     kref;
-	struct kutf_suite               *suite;
-	struct kutf_test_fixture        *test_fix;
-	struct kutf_mempool             fixture_pool;
-	void                            *fixture;
-	unsigned int                    fixture_index;
-	const char                      *fixture_name;
-	union kutf_callback_data        test_data;
-	struct kutf_result_set          *result_set;
-	enum kutf_result_status         status;
-	enum kutf_result_status         expected_status;
-	void                            *userdata_consumer_priv;
-	void                            *userdata_producer_priv;
-	struct dentry                   *userdata_dentry;
-};
-
-/**
- * struct kutf_suite - Structure representing a kernel test suite
- * @app:			The application this suite belongs to.
- * @name:			The name of this suite.
- * @suite_data:			Any user private data associated with this
- *                              suite.
- * @create_fixture:		Function used to create a new fixture instance
- * @remove_fixture:		Function used to destroy a new fixture instance
- * @fixture_variants:		The number of variants (must be at least 1).
- * @suite_default_flags:	Suite global filter flags which are set on
- *                              all tests.
- * @node:			List node for suite_list
- * @dir:			The debugfs directory for this suite
- * @test_list:			List head to store all the tests which are
- *                              part of this suite
- */
-struct kutf_suite {
-	struct kutf_application        *app;
-	const char                     *name;
-	union kutf_callback_data       suite_data;
-	void *(*create_fixture)(struct kutf_context *context);
-	void  (*remove_fixture)(struct kutf_context *context);
-	unsigned int                   fixture_variants;
-	unsigned int                   suite_default_flags;
-	struct list_head               node;
-	struct dentry                  *dir;
-	struct list_head               test_list;
-};
-
-/* ============================================================================
-	Application functions
-============================================================================ */
-
-/**
- * kutf_create_application() - Create an in kernel test application.
- * @name:	The name of the test application.
- *
- * Return: pointer to the kutf_application  on success or NULL
- * on failure
- */
-struct kutf_application *kutf_create_application(const char *name);
-
-/**
- * kutf_destroy_application() - Destroy an in kernel test application.
- *
- * @app:	The test application to destroy.
- */
-void kutf_destroy_application(struct kutf_application *app);
-
-/* ============================================================================
-	Suite functions
-============================================================================ */
-
-/**
- * kutf_create_suite() - Create a kernel test suite.
- * @app:		The test application to create the suite in.
- * @name:		The name of the suite.
- * @fixture_count:	The number of fixtures to run over the test
- *                      functions in this suite
- * @create_fixture:	Callback used to create a fixture. The returned value
- *                      is stored in the fixture pointer in the context for
- *                      use in the test functions.
- * @remove_fixture:	Callback used to remove a previously created fixture.
- *
- * Suite names must be unique. Should two suites with the same name be
- * registered with the same application then this function will fail, if they
- * are registered with different applications then the function will not detect
- * this and the call will succeed.
- *
- * Return: pointer to the created kutf_suite on success or NULL
- * on failure
- */
-struct kutf_suite *kutf_create_suite(
-		struct kutf_application *app,
-		const char *name,
-		unsigned int fixture_count,
-		void *(*create_fixture)(struct kutf_context *context),
-		void (*remove_fixture)(struct kutf_context *context));
-
-/**
- * kutf_create_suite_with_filters() - Create a kernel test suite with user
- *                                    defined default filters.
- * @app:		The test application to create the suite in.
- * @name:		The name of the suite.
- * @fixture_count:	The number of fixtures to run over the test
- *                      functions in this suite
- * @create_fixture:	Callback used to create a fixture. The returned value
- *			is stored in the fixture pointer in the context for
- *			use in the test functions.
- * @remove_fixture:	Callback used to remove a previously created fixture.
- * @filters:		Filters to apply to a test if it doesn't provide its own
- *
- * Suite names must be unique. Should two suites with the same name be
- * registered with the same application then this function will fail, if they
- * are registered with different applications then the function will not detect
- * this and the call will succeed.
- *
- * Return: pointer to the created kutf_suite on success or NULL on failure
- */
-struct kutf_suite *kutf_create_suite_with_filters(
-		struct kutf_application *app,
-		const char *name,
-		unsigned int fixture_count,
-		void *(*create_fixture)(struct kutf_context *context),
-		void (*remove_fixture)(struct kutf_context *context),
-		unsigned int filters);
-
-/**
- * kutf_create_suite_with_filters_and_data() - Create a kernel test suite with
- *                                             user defined default filters.
- * @app:		The test application to create the suite in.
- * @name:		The name of the suite.
- * @fixture_count:	The number of fixtures to run over the test
- *			functions in this suite
- * @create_fixture:	Callback used to create a fixture. The returned value
- *			is stored in the fixture pointer in the context for
- *			use in the test functions.
- * @remove_fixture:	Callback used to remove a previously created fixture.
- * @filters:		Filters to apply to a test if it doesn't provide its own
- * @suite_data:		Suite specific callback data, provided during the
- *			running of the test in the kutf_context
- *
- * Return: pointer to the created kutf_suite on success or NULL
- * on failure
- */
-struct kutf_suite *kutf_create_suite_with_filters_and_data(
-		struct kutf_application *app,
-		const char *name,
-		unsigned int fixture_count,
-		void *(*create_fixture)(struct kutf_context *context),
-		void (*remove_fixture)(struct kutf_context *context),
-		unsigned int filters,
-		union kutf_callback_data suite_data);
-
-/**
- * kutf_add_test() - Add a test to a kernel test suite.
- * @suite:	The suite to add the test to.
- * @id:		The ID of the test.
- * @name:	The name of the test.
- * @execute:	Callback to the test function to run.
- *
- * Note: As no filters are provided the test will use the suite filters instead
- */
-void kutf_add_test(struct kutf_suite *suite,
-		unsigned int id,
-		const char *name,
-		void (*execute)(struct kutf_context *context));
-
-/**
- * kutf_add_test_with_filters() - Add a test to a kernel test suite with filters
- * @suite:	The suite to add the test to.
- * @id:		The ID of the test.
- * @name:	The name of the test.
- * @execute:	Callback to the test function to run.
- * @filters:	A set of filtering flags, assigning test categories.
- */
-void kutf_add_test_with_filters(struct kutf_suite *suite,
-		unsigned int id,
-		const char *name,
-		void (*execute)(struct kutf_context *context),
-		unsigned int filters);
-
-/**
- * kutf_add_test_with_filters_and_data() - Add a test to a kernel test suite
- *					   with filters.
- * @suite:	The suite to add the test to.
- * @id:		The ID of the test.
- * @name:	The name of the test.
- * @execute:	Callback to the test function to run.
- * @filters:	A set of filtering flags, assigning test categories.
- * @test_data:	Test specific callback data, provided during the
- *		running of the test in the kutf_context
- */
-void kutf_add_test_with_filters_and_data(
-		struct kutf_suite *suite,
-		unsigned int id,
-		const char *name,
-		void (*execute)(struct kutf_context *context),
-		unsigned int filters,
-		union kutf_callback_data test_data);
-
-/**
- * kutf_add_test_with_filters_data_and_userdata() - Add a test to a kernel test suite with filters and setup for
- *                                                  receiving data from userside
- * @suite:		The suite to add the test to.
- * @id:			The ID of the test.
- * @name:		The name of the test.
- * @execute:		Callback to the test function to run.
- * @filters:		A set of filtering flags, assigning test categories.
- * @test_data:		Test specific callback data, provided during the
- *			running of the test in the kutf_context
- * @userdata_ops:	Callbacks to use for sending and receiving data to
- *			userspace. A copy of the struct kutf_userdata_ops is
- *			taken. Each callback can be NULL.
- *
- */
-void kutf_add_test_with_filters_data_and_userdata(
-		struct kutf_suite *suite,
-		unsigned int id,
-		const char *name,
-		void (*execute)(struct kutf_context *context),
-		unsigned int filters,
-		union kutf_callback_data test_data,
-		struct kutf_userdata_ops *userdata_ops);
-
-
-/* ============================================================================
-	Test functions
-============================================================================ */
-/**
- * kutf_test_log_result_external() - Log a result which has been created
- *                                   externally into a in a standard form
- *                                   recognized by the log parser.
- * @context:	The test context the test is running in
- * @message:	The message for this result
- * @new_status:	The result status of this log message
- */
-void kutf_test_log_result_external(
-	struct kutf_context *context,
-	const char *message,
-	enum kutf_result_status new_status);
-
-/**
- * kutf_test_expect_abort() - Tell the kernel that you expect the current
- *                            fixture to produce an abort.
- * @context:	The test context this test is running in.
- */
-void kutf_test_expect_abort(struct kutf_context *context);
-
-/**
- * kutf_test_expect_fatal() - Tell the kernel that you expect the current
- *                            fixture to produce a fatal error.
- * @context:	The test context this test is running in.
- */
-void kutf_test_expect_fatal(struct kutf_context *context);
-
-/**
- * kutf_test_expect_fail() - Tell the kernel that you expect the current
- *                           fixture to fail.
- * @context:	The test context this test is running in.
- */
-void kutf_test_expect_fail(struct kutf_context *context);
-
-/**
- * kutf_test_expect_warn() - Tell the kernel that you expect the current
- *                           fixture to produce a warning.
- * @context:	The test context this test is running in.
- */
-void kutf_test_expect_warn(struct kutf_context *context);
-
-/**
- * kutf_test_expect_pass() - Tell the kernel that you expect the current
- *                           fixture to pass.
- * @context:	The test context this test is running in.
- */
-void kutf_test_expect_pass(struct kutf_context *context);
-
-/**
- * kutf_test_skip() - Tell the kernel that the test should be skipped.
- * @context:	The test context this test is running in.
- */
-void kutf_test_skip(struct kutf_context *context);
-
-/**
- * kutf_test_skip_msg() - Tell the kernel that this test has been skipped,
- *                        supplying a reason string.
- * @context:	The test context this test is running in.
- * @message:	A message string containing the reason for the skip.
- *
- * Note: The message must not be freed during the lifetime of the test run.
- * This means it should either be a prebaked string, or if a dynamic string
- * is required it must be created with kutf_dsprintf which will store
- * the resultant string in a buffer who's lifetime is the same as the test run.
- */
-void kutf_test_skip_msg(struct kutf_context *context, const char *message);
-
-/**
- * kutf_test_pass() - Tell the kernel that this test has passed.
- * @context:	The test context this test is running in.
- * @message:	A message string containing the reason for the pass.
- *
- * Note: The message must not be freed during the lifetime of the test run.
- * This means it should either be a pre-baked string, or if a dynamic string
- * is required it must be created with kutf_dsprintf which will store
- * the resultant string in a buffer who's lifetime is the same as the test run.
- */
-void kutf_test_pass(struct kutf_context *context, char const *message);
-
-/**
- * kutf_test_debug() - Send a debug message
- * @context:	The test context this test is running in.
- * @message:	A message string containing the debug information.
- *
- * Note: The message must not be freed during the lifetime of the test run.
- * This means it should either be a pre-baked string, or if a dynamic string
- * is required it must be created with kutf_dsprintf which will store
- * the resultant string in a buffer who's lifetime is the same as the test run.
- */
-void kutf_test_debug(struct kutf_context *context, char const *message);
-
-/**
- * kutf_test_info() - Send an information message
- * @context:	The test context this test is running in.
- * @message:	A message string containing the information message.
- *
- * Note: The message must not be freed during the lifetime of the test run.
- * This means it should either be a pre-baked string, or if a dynamic string
- * is required it must be created with kutf_dsprintf which will store
- * the resultant string in a buffer who's lifetime is the same as the test run.
- */
-void kutf_test_info(struct kutf_context *context, char const *message);
-
-/**
- * kutf_test_warn() - Send a warning message
- * @context:	The test context this test is running in.
- * @message:	A message string containing the warning message.
- *
- * Note: The message must not be freed during the lifetime of the test run.
- * This means it should either be a pre-baked string, or if a dynamic string
- * is required it must be created with kutf_dsprintf which will store
- * the resultant string in a buffer who's lifetime is the same as the test run.
- */
-void kutf_test_warn(struct kutf_context *context, char const *message);
-
-/**
- * kutf_test_fail() - Tell the kernel that a test has failed
- * @context:	The test context this test is running in.
- * @message:	A message string containing the failure message.
- *
- * Note: The message must not be freed during the lifetime of the test run.
- * This means it should either be a pre-baked string, or if a dynamic string
- * is required it must be created with kutf_dsprintf which will store
- * the resultant string in a buffer who's lifetime is the same as the test run.
- */
-void kutf_test_fail(struct kutf_context *context, char const *message);
-
-/**
- * kutf_test_fatal() - Tell the kernel that a test has triggered a fatal error
- * @context:	The test context this test is running in.
- * @message:	A message string containing the fatal error message.
- *
- * Note: The message must not be freed during the lifetime of the test run.
- * This means it should either be a pre-baked string, or if a dynamic string
- * is required it must be created with kutf_dsprintf which will store
- * the resultant string in a buffer who's lifetime is the same as the test run.
- */
-void kutf_test_fatal(struct kutf_context *context, char const *message);
-
-/**
- * kutf_test_abort() - Tell the kernel that a test triggered an abort in the test
- *
- * @context:	The test context this test is running in.
- */
-void kutf_test_abort(struct kutf_context *context);
-
-#endif	/* _KERNEL_UTF_SUITE_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_utils.h b/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_utils.h
deleted file mode 100644
index c458c1f73802..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/include/kutf/kutf_utils.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014, 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#ifndef _KERNEL_UTF_UTILS_H_
-#define _KERNEL_UTF_UTILS_H_
-
-/* kutf_utils.h
- * Utilities for the kernel UTF test infrastructure.
- *
- * This collection of library functions are provided for use by kernel UTF
- * and users of kernel UTF which don't directly fit within the other
- * code modules.
- */
-
-#include <kutf/kutf_mem.h>
-
-/**
- * Maximum size of the message strings within kernel UTF, messages longer then
- * this will be truncated.
- */
-#define KUTF_MAX_DSPRINTF_LEN	1024
-
-/**
- * kutf_dsprintf() - dynamic sprintf
- * @pool:	memory pool to allocate from
- * @fmt:	The format string describing the string to document.
- * @...		The parameters to feed in to the format string.
- *
- * This function implements sprintf which dynamically allocates memory to store
- * the string. The library will free the memory containing the string when the
- * result set is cleared or destroyed.
- *
- * Note The returned string may be truncated to fit an internal temporary
- * buffer, which is KUTF_MAX_DSPRINTF_LEN bytes in length.
- *
- * Return: Returns pointer to allocated string, or NULL on error.
- */
-const char *kutf_dsprintf(struct kutf_mempool *pool,
-		const char *fmt, ...);
-
-#endif	/* _KERNEL_UTF_UTILS_H_ */
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/Kbuild b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/Kbuild
deleted file mode 100644
index 97f80057224f..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/Kbuild
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-ccflags-y += -I$(src)/../include
-
-obj-$(CONFIG_MALI_KUTF) += kutf.o
-
-kutf-y := kutf_mem.o kutf_resultset.o kutf_suite.o kutf_utils.o kutf_helpers.o kutf_helpers_user.o
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/Kconfig b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/Kconfig
deleted file mode 100644
index 6a87bdbf746e..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/Kconfig
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-
-config MALI_KUTF
- tristate "Mali Kernel Unit Test Framework"
- default m
- help
-   Enables MALI testing framework. To compile it as a module,
-   choose M here - this will generate a single module called kutf.
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/Makefile b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/Makefile
deleted file mode 100644
index 010c92ca39b9..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/Makefile
+++ /dev/null
@@ -1,29 +0,0 @@
-#
-# (C) COPYRIGHT 2014-2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-# linux build system bootstrap for out-of-tree module
-
-# default to building for the host
-ARCH ?= $(shell uname -m)
-
-ifeq ($(KDIR),)
-$(error Must specify KDIR to point to the kernel to target))
-endif
-
-all:
-	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) $(SCONS_CONFIGS) EXTRA_CFLAGS=-I$(CURDIR)/../include modules
-
-clean:
-	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) clean
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_helpers.c b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_helpers.c
deleted file mode 100644
index 793d58c789ff..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_helpers.c
+++ /dev/null
@@ -1,768 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/* Kernel UTF test helpers */
-#include <kutf/kutf_helpers.h>
-
-/* 10s timeout for user thread to open the 'data' file once the test is started */
-#define USERDATA_WAIT_TIMEOUT_MS 10000
-#include <linux/err.h>
-#include <linux/jiffies.h>
-#include <linux/sched.h>
-#include <linux/preempt.h>
-#include <linux/wait.h>
-#include <linux/uaccess.h>
-
-
-int kutf_helper_textbuf_init(struct kutf_helper_textbuf *textbuf,
-		struct kutf_mempool *mempool, int max_line_size,
-		int max_nr_lines)
-{
-	textbuf->scratchpad = kutf_mempool_alloc(mempool, max_line_size);
-
-	if (!textbuf->scratchpad)
-		return -ENOMEM;
-
-	mutex_init(&textbuf->lock);
-	textbuf->nr_user_clients = 0;
-	textbuf->mempool = mempool;
-	textbuf->used_bytes = 0;
-	textbuf->prev_pos = 0;
-	textbuf->prev_line_pos = 0;
-	INIT_LIST_HEAD(&textbuf->textbuf_list);
-	textbuf->max_line_size = max_line_size;
-	textbuf->max_nr_lines = max_nr_lines;
-	textbuf->nr_lines = 0;
-	textbuf->flags = 0ul;
-	init_waitqueue_head(&textbuf->user_opened_wq);
-	init_waitqueue_head(&textbuf->not_full_wq);
-	init_waitqueue_head(&textbuf->not_empty_wq);
-
-	return 0;
-}
-EXPORT_SYMBOL(kutf_helper_textbuf_init);
-
-/**
- * kutf_helper_textbuf_open() - Notify that userspace has opened the 'data'
- *                              file for a textbuf
- *
- * @priv:		private pointer from a kutf_userdata_exchange, which
- *                      should be a pointer to a struct kutf_helper_textbuf
- *
- * Return:		0 on success, or negative value on error.
- */
-static int kutf_helper_textbuf_open(void *priv)
-{
-	struct kutf_helper_textbuf *textbuf = priv;
-	int ret;
-
-	ret = mutex_lock_interruptible(&textbuf->lock);
-	if (ret)
-		return -ERESTARTSYS;
-
-	++(textbuf->nr_user_clients);
-	wake_up(&textbuf->user_opened_wq);
-
-	mutex_unlock(&textbuf->lock);
-	return ret;
-}
-
-/**
- * kutf_helper_textbuf_release() - Notify that userspace has closed the 'data'
- *                                 file for a textbuf
- *
- * @priv:		private pointer from a kutf_userdata_exchange, which
- *                      should be a pointer to a struct kutf_helper_textbuf
- */
-static void kutf_helper_textbuf_release(void *priv)
-{
-	struct kutf_helper_textbuf *textbuf = priv;
-
-	/* Shouldn't use interruptible variants here because if a signal is
-	 * pending, we can't abort and restart the call */
-	mutex_lock(&textbuf->lock);
-
-	--(textbuf->nr_user_clients);
-	if (!textbuf->nr_user_clients) {
-		/* All clients disconnected, wakeup kernel-side waiters */
-		wake_up(&textbuf->not_full_wq);
-		wake_up(&textbuf->not_empty_wq);
-	}
-
-	mutex_unlock(&textbuf->lock);
-}
-
-/**
- * kutf_helper_textbuf_notify_test_ended() - Notify that the test has ended
- *
- * @priv:		private pointer from a kutf_userdata_exchange, which
- *                      should be a pointer to a struct kutf_helper_textbuf
- *
- * After this call, userspace should be allowed to finish remaining reads but
- * not make new ones, and not be allowed to make new writes.
- */
-static void kutf_helper_textbuf_notify_test_ended(void *priv)
-{
-	struct kutf_helper_textbuf *textbuf = priv;
-
-	/* Shouldn't use interruptible variants here because if a signal is
-	 * pending, we can't abort and restart the call */
-	mutex_lock(&textbuf->lock);
-
-	textbuf->flags |= KUTF_HELPER_TEXTBUF_FLAG_DYING;
-
-	/* Consumers waiting due to being full should wake up and abort */
-	wake_up(&textbuf->not_full_wq);
-	/* Producers waiting due to being empty should wake up and abort */
-	wake_up(&textbuf->not_empty_wq);
-
-	mutex_unlock(&textbuf->lock);
-}
-
-/* Collect text in a textbuf scratchpad up to (but excluding) specified
- * newline_off, and add it as a textbuf_line
- *
- * newline_off is permissible to be at the character after the end of the
- * scratchpad (i.e. equal to textbuf->max_line_size), for handling when the
- * line was longer than the size of the scratchpad. Nevertheless, the resulting
- * size of the line is kept at textbuf->max_line_size, including the '\0'
- * terminator. That is, the string length will be textbuf->max_line_size-1.
- *
- * Remaining characters strictly after newline_off are moved to the beginning
- * of the scratchpad, to allow space for a longer line to be collected. This
- * means the character specified at newline_off will be removed from/no longer
- * be within the valid region of the scratchpad
- *
- * Returns number of bytes the scratchpad was shortened by, or an error
- * otherwise
- */
-static size_t collect_line(struct kutf_helper_textbuf *textbuf, int newline_off)
-{
-	/* '\n' terminator will be replaced as '\0' */
-	int str_buf_size;
-	struct kutf_helper_textbuf_line *textbuf_line;
-	char *str_start;
-	int bytes_remain;
-	char *scratch = textbuf->scratchpad;
-	int nextline_off;
-
-	str_buf_size = newline_off + 1;
-	if (str_buf_size > textbuf->max_line_size)
-		str_buf_size = textbuf->max_line_size;
-
-	/* String is stored immediately after the line */
-	textbuf_line = kutf_mempool_alloc(textbuf->mempool, str_buf_size + sizeof(struct kutf_helper_textbuf_line));
-	if (!textbuf_line)
-		return -ENOMEM;
-
-	str_start = &textbuf_line->str[0];
-
-	/* Copy in string, excluding the terminating '\n' character, replacing
-	 * it with '\0' */
-	strncpy(str_start, scratch, str_buf_size - 1);
-	str_start[str_buf_size-1] = '\0';
-	textbuf_line->str_size = str_buf_size;
-
-	/* Append to the textbuf */
-	list_add_tail(&textbuf_line->node, &textbuf->textbuf_list);
-	++(textbuf->nr_lines);
-
-	/* Move the rest of the scratchpad to the start */
-	nextline_off = newline_off + 1;
-	if (nextline_off > textbuf->used_bytes)
-		nextline_off =  textbuf->used_bytes;
-
-	bytes_remain = textbuf->used_bytes - nextline_off;
-	memmove(scratch, scratch + nextline_off, bytes_remain);
-	textbuf->used_bytes = bytes_remain;
-
-	/* Wakeup anyone blocked on empty */
-	wake_up(&textbuf->not_empty_wq);
-
-	return nextline_off;
-}
-
-/* Buffer size for truncating a string to its newline.
- * Allocated on the stack, so keep it moderately small (within PAGE_SIZE) */
-#define TRUNCATE_BUF_SZ 512
-
-/* Discard input from a userbuf up to a newline, then collect what was in the
- * scratchpad into a new textbuf line */
-static ssize_t collect_longline_truncate(struct kutf_helper_textbuf *textbuf,
-		const char  __user *userbuf, size_t userbuf_len)
-{
-	ssize_t bytes_processed = 0;
-
-	while (userbuf_len > 0) {
-		int userbuf_copy_sz = userbuf_len;
-		size_t res;
-		char *newline_ptr;
-		char truncate_buf[TRUNCATE_BUF_SZ];
-
-		if (userbuf_len > TRUNCATE_BUF_SZ)
-			userbuf_copy_sz = TRUNCATE_BUF_SZ;
-		else
-			userbuf_copy_sz = (int)userbuf_len;
-
-		/* copy what we can */
-		res = copy_from_user(truncate_buf, userbuf, userbuf_copy_sz);
-		if (res == userbuf_copy_sz)
-			return -EFAULT;
-		userbuf_copy_sz -= res;
-
-		/* Search for newline in what was copied */
-		newline_ptr = strnchr(truncate_buf, userbuf_copy_sz, '\n');
-
-		if (newline_ptr) {
-			ssize_t sres;
-			/* Newline found: collect scratchpad and exit out */
-			int newline_off = newline_ptr - truncate_buf;
-
-			sres = collect_line(textbuf, textbuf->used_bytes);
-			if (sres < 0)
-				return sres;
-
-			bytes_processed += newline_off + 1;
-			break;
-		}
-
-		/* Newline not yet found: advance to the next part to copy */
-		userbuf += userbuf_copy_sz;
-		userbuf_len -= userbuf_copy_sz;
-		bytes_processed += userbuf_copy_sz;
-	}
-
-	return bytes_processed;
-}
-
-/**
- * kutf_helper_textbuf_consume() - 'data' file consumer function for writing to
- *                                 a textbuf
- * @priv:		private pointer from a kutf_userdata_exchange, which
- *                      should be a pointer to a struct kutf_helper_textbuf to
- *                      write into
- * @userbuf:		the userspace buffer to read from
- * @userbuf_len:	size of the userspace buffer
- * @ppos:		the current position in the buffer
- *
- * This consumer function is used as a write consumer for the 'data' file,
- * receiving data that has been written to the 'data' file by userspace. It
- * will read from the userspace buffer @userbuf and separates it into '\n'
- * delimited lines for the textbuf pointed to by @priv .
- *
- * If there is insufficient space in textbuf, then it will block until there is
- * space - for example, a kernel-side test calls
- * kutf_helper_textbuf_dequeue(). Since this is expected to be called in the
- * context of a syscall, the call can only be cancelled by sending an
- * appropriate signal to the userspace process.
- *
- * The current position @ppos is advanced by the number of bytes successfully
- * read.
- *
- * Return:		the number of bytes read, or negative value on error.
- */
-static ssize_t kutf_helper_textbuf_consume(void *priv,
-		const char  __user *userbuf, size_t userbuf_len, loff_t *ppos)
-{
-	struct kutf_helper_textbuf *textbuf = priv;
-	int userbuf_copy_sz;
-	char *next_newline_ptr;
-	size_t bytes_processed = 0;
-	int newdata_off;
-	ssize_t ret;
-
-	ret = mutex_lock_interruptible(&textbuf->lock);
-	if (ret)
-		return -ERESTARTSYS;
-
-	/* Validate input */
-	if (*ppos < 0) {
-		ret = -EINVAL;
-		goto out_unlock;
-	}
-	if (!userbuf_len) {
-		ret = 0;
-		goto out_unlock;
-	}
-
-	while (textbuf->nr_lines >= textbuf->max_nr_lines &&
-			!(textbuf->flags & KUTF_HELPER_TEXTBUF_FLAG_DYING)) {
-		/* Block on kernel-side dequeue making space available
-		 * NOTE: should also handle O_NONBLOCK */
-		mutex_unlock(&textbuf->lock);
-		ret = wait_event_interruptible(textbuf->not_full_wq,
-				(textbuf->nr_lines < textbuf->max_nr_lines ||
-				(textbuf->flags & KUTF_HELPER_TEXTBUF_FLAG_DYING)));
-		if (ret)
-			return -ERESTARTSYS;
-		ret = mutex_lock_interruptible(&textbuf->lock);
-		if (ret)
-			return -ERESTARTSYS;
-	}
-
-	if (textbuf->flags & KUTF_HELPER_TEXTBUF_FLAG_DYING) {
-		ret = -ENODEV;
-		goto out_unlock;
-	}
-
-	if (textbuf->prev_pos != *ppos && textbuf->used_bytes) {
-		/* Seeking causes a new line to occur:
-		 * Truncate what data was there into a textbuf-line, and reset
-		 * the buffer */
-		ret = collect_line(textbuf, textbuf->used_bytes);
-		if (ret < 0)
-			goto finish;
-	} else if (textbuf->used_bytes >= (textbuf->max_line_size - 1)) {
-		/* Line too long discard input until we find a '\n' */
-		ret = collect_longline_truncate(textbuf, userbuf, userbuf_len);
-
-		if (ret < 0)
-			goto finish;
-
-		/* Update userbuf with how much was processed, which may be the
-		 * entire buffer now */
-		userbuf += ret;
-		userbuf_len -= ret;
-		bytes_processed += ret;
-
-		/* If there's buffer remaining and we fault later (e.g. can't
-		 * read or OOM) ensure ppos is updated */
-		*ppos += ret;
-
-		/* recheck in case entire buffer processed */
-		if (!userbuf_len)
-			goto finish;
-	}
-
-	/* An extra line may've been added, ensure we don't overfill */
-	if (textbuf->nr_lines >= textbuf->max_nr_lines)
-		goto finish_noerr;
-
-	userbuf_copy_sz = userbuf_len;
-
-	/* Copy in as much as we can */
-	if (userbuf_copy_sz > textbuf->max_line_size - textbuf->used_bytes)
-		userbuf_copy_sz = textbuf->max_line_size - textbuf->used_bytes;
-
-	ret = copy_from_user(textbuf->scratchpad + textbuf->used_bytes, userbuf, userbuf_copy_sz);
-	if (ret == userbuf_copy_sz) {
-		ret = -EFAULT;
-		goto finish;
-	}
-	userbuf_copy_sz -= ret;
-
-	newdata_off = textbuf->used_bytes;
-	textbuf->used_bytes += userbuf_copy_sz;
-
-	while (textbuf->used_bytes && textbuf->nr_lines < textbuf->max_nr_lines) {
-		int new_bytes_remain = textbuf->used_bytes - newdata_off;
-		/* Find a new line - only the new part should be checked */
-		next_newline_ptr = strnchr(textbuf->scratchpad + newdata_off, new_bytes_remain, '\n');
-
-		if (next_newline_ptr) {
-			int newline_off = next_newline_ptr - textbuf->scratchpad;
-
-			/* if found, collect up to it, then memmove the rest */
-			/* reset positions and see if we can fill any further */
-			/* repeat until run out of data or line is filled */
-			ret = collect_line(textbuf, newline_off);
-
-			/* If filled up or OOM, rollback the remaining new
-			 * data. Instead we'll try to grab it next time we're
-			 * called */
-			if (textbuf->nr_lines >= textbuf->max_nr_lines || ret < 0)
-				textbuf->used_bytes = newdata_off;
-
-			if (ret < 0)
-				goto finish;
-
-			/* Fix up ppos etc in case we'll be ending the loop */
-			*ppos += ret - newdata_off;
-			bytes_processed += ret - newdata_off;
-			newdata_off = 0;
-		} else {
-			/* there's bytes left, but no new-line, so try to fill up next time */
-			*ppos += new_bytes_remain;
-			bytes_processed += new_bytes_remain;
-			break;
-		}
-	}
-
-finish_noerr:
-	ret = bytes_processed;
-finish:
-	textbuf->prev_pos = *ppos;
-out_unlock:
-	mutex_unlock(&textbuf->lock);
-
-	return ret;
-}
-
-/**
- * kutf_helper_textbuf_produce() - 'data' file producer function for reading
- *                                 from a textbuf
- * @priv:		private pointer from a kutf_userdata_exchange, which
- *                      should be a pointer to a struct kutf_helper_textbuf to
- *                      read from
- * @userbuf:		the userspace buffer to write to
- * @userbuf_len:	size of the userspace buffer
- * @ppos:		the current position in the buffer
- *
- * This producer function is used as a read producer for the 'data' file,
- * allowing userspace to read from the 'data' file. It will write to the
- * userspace buffer @userbuf, taking lines from the textbuf pointed to by
- * @priv, separating each line with '\n'.
- *
- * If there is no data in the textbuf, then it will block until some appears -
- * for example, a kernel-side test calls kutf_helper_textbuf_enqueue(). Since
- * this is expected to be called in the context of a syscall, the call can only
- * be cancelled by sending an appropriate signal to the userspace process.
- *
- * The current position @ppos is advanced by the number of bytes successfully
- * written.
- *
- * Return:		the number of bytes written, or negative value on error
- */
-static ssize_t kutf_helper_textbuf_produce(void *priv, char  __user *userbuf,
-		size_t userbuf_len, loff_t *ppos)
-{
-	struct kutf_helper_textbuf *textbuf = priv;
-	loff_t pos_offset;
-	struct kutf_helper_textbuf_line *line = NULL;
-	int line_start_pos;
-	size_t bytes_processed = 0;
-	ssize_t ret;
-	int copy_length;
-
-	ret = mutex_lock_interruptible(&textbuf->lock);
-	if (ret)
-		return -ERESTARTSYS;
-
-	/* Validate input */
-	if (*ppos < 0) {
-		ret = -EINVAL;
-		goto finish;
-	}
-	if (!userbuf_len) {
-		ret = 0;
-		goto finish;
-	}
-
-	/* Seeking to before the beginning of the line will have the effect of
-	 * resetting the position to the start of the current data, since we've
-	 * already discarded previous data */
-	if (*ppos < textbuf->prev_line_pos)
-		textbuf->prev_line_pos = *ppos;
-
-	while (!line) {
-		int needs_wake = 0;
-
-		pos_offset = *ppos - textbuf->prev_line_pos;
-		line_start_pos = 0;
-
-		/* Find the line for the offset, emptying the textbuf as we go */
-		while (!list_empty(&textbuf->textbuf_list)) {
-			int line_end_pos;
-
-			line = list_first_entry(&textbuf->textbuf_list, struct kutf_helper_textbuf_line, node);
-
-			/* str_size used in line_end_pos because lines implicitly have
-			 * a '\n', but we count the '\0' string terminator as that */
-			line_end_pos = line_start_pos + line->str_size;
-
-			if (pos_offset < line_end_pos)
-				break;
-
-			line_start_pos += line->str_size;
-			/* Only discard a line when we're sure it's finished
-			 * with, to avoid awkward rollback conditions if we've
-			 * had to block */
-			list_del(&line->node);
-			--(textbuf->nr_lines);
-			line = NULL;
-			needs_wake = 1;
-		}
-
-		/* Update the start of the line pos for next time we're called */
-		textbuf->prev_line_pos += line_start_pos;
-
-		/* If space was freed up, wake waiters */
-		if (needs_wake)
-			wake_up(&textbuf->not_full_wq);
-;
-		if (!line) {
-			/* Only check before waiting, to ensure if the test
-			 * does the last enqueue and immediately finishes, then
-			 * we'll go back round the loop to receive the line
-			 * instead of just dying straight away */
-			if (textbuf->flags & KUTF_HELPER_TEXTBUF_FLAG_DYING) {
-				/* Indicate EOF rather than an error */
-				ret = 0;
-				goto finish;
-			}
-
-			/* No lines found, block for new ones
-			 * NOTE: should also handle O_NONBLOCK */
-			mutex_unlock(&textbuf->lock);
-			ret = wait_event_interruptible(textbuf->not_empty_wq,
-					(textbuf->nr_lines > 0 ||
-					(textbuf->flags & KUTF_HELPER_TEXTBUF_FLAG_DYING)));
-
-			/* signals here are not restartable */
-			if (ret)
-				return ret;
-			ret = mutex_lock_interruptible(&textbuf->lock);
-			if (ret)
-				return ret;
-		}
-
-	}
-
-
-	/* Find offset within the line, guaranteed to be within line->str_size */
-	pos_offset -= line_start_pos;
-
-	while (userbuf_len && line) {
-		/* Copy at most to the end of string, excluding terminator */
-		copy_length = line->str_size - 1 - pos_offset;
-		if (copy_length > userbuf_len)
-			copy_length = userbuf_len;
-
-		if (copy_length) {
-			ret = copy_to_user(userbuf, &line->str[pos_offset], copy_length);
-			if (ret == copy_length) {
-				ret = -EFAULT;
-				goto finish;
-			}
-			copy_length -= ret;
-
-			userbuf += copy_length;
-			userbuf_len -= copy_length;
-			bytes_processed += copy_length;
-			*ppos += copy_length;
-			if (ret)
-				goto finish_noerr;
-		}
-
-		/* Add terminator if one was needed */
-		if (userbuf_len) {
-			copy_length = 1;
-			ret = copy_to_user(userbuf, "\n", copy_length);
-			if (ret == copy_length) {
-				ret = -EFAULT;
-				goto finish;
-			}
-			copy_length -= ret;
-
-			userbuf += copy_length;
-			userbuf_len -= copy_length;
-			bytes_processed += copy_length;
-			*ppos += copy_length;
-		} else {
-			/* string wasn't completely copied this time - try to
-			 * finish it next call */
-			break;
-		}
-
-		/* Line Completed - only now can safely delete it */
-		textbuf->prev_line_pos += line->str_size;
-		list_del(&line->node);
-		--(textbuf->nr_lines);
-		line = NULL;
-		/* Space freed up, wake up waiters */
-		wake_up(&textbuf->not_full_wq);
-
-		/* Pick the next line  */
-		if (!list_empty(&textbuf->textbuf_list)) {
-			line = list_first_entry(&textbuf->textbuf_list, struct kutf_helper_textbuf_line, node);
-			pos_offset = 0;
-		}
-		/* if no more lines, we've copied at least some bytes, so only
-		 * need to block on new lines the next time we're called */
-	}
-
-finish_noerr:
-	ret = bytes_processed;
-finish:
-	mutex_unlock(&textbuf->lock);
-
-	return ret;
-}
-
-int kutf_helper_textbuf_wait_for_user(struct kutf_helper_textbuf *textbuf)
-{
-	int err;
-	unsigned long now;
-	unsigned long timeout_jiffies = msecs_to_jiffies(USERDATA_WAIT_TIMEOUT_MS);
-	unsigned long time_end;
-	int ret = 0;
-
-	/* Mutex locking using non-interruptible variants, since a signal to
-	 * the user process will generally have to wait until we finish the
-	 * test, because we can't restart the test. The exception is where
-	 * we're blocked on a waitq */
-	mutex_lock(&textbuf->lock);
-
-	now = jiffies;
-	time_end = now + timeout_jiffies;
-
-	while (!textbuf->nr_user_clients && time_before_eq(now, time_end)) {
-		unsigned long time_to_wait = time_end - now;
-		/* No users yet, block or timeout */
-		mutex_unlock(&textbuf->lock);
-		/* Use interruptible here - in case we block for a long time
-		 * and want to kill the user process */
-		err = wait_event_interruptible_timeout(textbuf->user_opened_wq,
-				(textbuf->nr_user_clients > 0), time_to_wait);
-		/* Any error is not restartable due to how kutf runs tests */
-		if (err < 0)
-			return -EINTR;
-		mutex_lock(&textbuf->lock);
-
-		now = jiffies;
-	}
-	if (!textbuf->nr_user_clients)
-		ret = -ETIMEDOUT;
-
-	mutex_unlock(&textbuf->lock);
-
-	return ret;
-}
-EXPORT_SYMBOL(kutf_helper_textbuf_wait_for_user);
-
-char *kutf_helper_textbuf_dequeue(struct kutf_helper_textbuf *textbuf,
-		int *str_size)
-{
-	struct kutf_helper_textbuf_line *line;
-	char *ret = NULL;
-
-	/* Mutex locking using non-interruptible variants, since a signal to
-	 * the user process will generally have to wait until we finish the
-	 * test, because we can't restart the test. The exception is where
-	 * we're blocked on a waitq */
-	mutex_lock(&textbuf->lock);
-
-	while (list_empty(&textbuf->textbuf_list)) {
-		int err;
-
-		if (!textbuf->nr_user_clients) {
-			/* No user-side clients - error */
-			goto out;
-		}
-
-		/* No lines found, block for new ones from user-side consumer */
-		mutex_unlock(&textbuf->lock);
-		/* Use interruptible here - in case we block for a long time
-		 * and want to kill the user process */
-		err = wait_event_interruptible(textbuf->not_empty_wq,
-				(textbuf->nr_lines > 0 || !textbuf->nr_user_clients));
-		/* Any error is not restartable due to how kutf runs tests */
-		if (err)
-			return ERR_PTR(-EINTR);
-		mutex_lock(&textbuf->lock);
-	}
-
-	line = list_first_entry(&textbuf->textbuf_list, struct kutf_helper_textbuf_line, node);
-	list_del(&line->node);
-	--(textbuf->nr_lines);
-	/* Space freed up, wake up waiters */
-	wake_up(&textbuf->not_full_wq);
-
-	if (str_size)
-		*str_size = line->str_size;
-
-	ret = &line->str[0];
-
-out:
-	mutex_unlock(&textbuf->lock);
-	return ret;
-}
-EXPORT_SYMBOL(kutf_helper_textbuf_dequeue);
-
-int kutf_helper_textbuf_enqueue(struct kutf_helper_textbuf *textbuf,
-		char *enqueue_str, int buf_max_size)
-{
-	struct kutf_helper_textbuf_line *textbuf_line;
-	int str_size = strnlen(enqueue_str, buf_max_size) + 1;
-	char *str_start;
-	int ret = 0;
-
-	/* Mutex locking using non-interruptible variants, since a signal to
-	 * the user process will generally have to wait until we finish the
-	 * test, because we can't restart the test. The exception is where
-	 * we're blocked on a waitq */
-	mutex_lock(&textbuf->lock);
-
-	if (str_size > textbuf->max_line_size)
-		str_size = textbuf->max_line_size;
-
-	while (textbuf->nr_lines >= textbuf->max_nr_lines) {
-		if (!textbuf->nr_user_clients) {
-			/* No user-side clients - error */
-			ret = -EBUSY;
-			goto out;
-		}
-
-		/* Block on user-side producer making space available */
-		mutex_unlock(&textbuf->lock);
-		/* Use interruptible here - in case we block for a long time
-		 * and want to kill the user process */
-		ret = wait_event_interruptible(textbuf->not_full_wq,
-				(textbuf->nr_lines < textbuf->max_nr_lines || !textbuf->nr_user_clients));
-		/* Any error is not restartable due to how kutf runs tests */
-		if (ret)
-			return -EINTR;
-		mutex_lock(&textbuf->lock);
-	}
-
-	/* String is stored immediately after the line */
-	textbuf_line = kutf_mempool_alloc(textbuf->mempool, str_size + sizeof(struct kutf_helper_textbuf_line));
-	if (!textbuf_line) {
-		ret = -ENOMEM;
-		goto out;
-	}
-
-	str_start = &textbuf_line->str[0];
-
-	/* Copy in string */
-	strncpy(str_start, enqueue_str, str_size);
-	/* Enforce the '\0' termination */
-	str_start[str_size-1] = '\0';
-	textbuf_line->str_size = str_size;
-
-	/* Append to the textbuf */
-	list_add_tail(&textbuf_line->node, &textbuf->textbuf_list);
-	++(textbuf->nr_lines);
-
-	/* Wakeup anyone blocked on empty */
-	wake_up(&textbuf->not_empty_wq);
-
-out:
-	mutex_unlock(&textbuf->lock);
-	return ret;
-}
-EXPORT_SYMBOL(kutf_helper_textbuf_enqueue);
-
-
-struct kutf_userdata_ops kutf_helper_textbuf_userdata_ops = {
-	.open = kutf_helper_textbuf_open,
-	.release = kutf_helper_textbuf_release,
-	.notify_ended = kutf_helper_textbuf_notify_test_ended,
-	.consumer = kutf_helper_textbuf_consume,
-	.producer = kutf_helper_textbuf_produce,
-};
-EXPORT_SYMBOL(kutf_helper_textbuf_userdata_ops);
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_helpers_user.c b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_helpers_user.c
deleted file mode 100644
index cf3b00563c5f..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_helpers_user.c
+++ /dev/null
@@ -1,460 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/* Kernel UTF test helpers that mirror those for kutf-userside */
-#include <kutf/kutf_helpers_user.h>
-#include <kutf/kutf_utils.h>
-
-#include <linux/err.h>
-#include <linux/slab.h>
-
-const char *valtype_names[] = {
-	"INVALID",
-	"U64",
-	"STR",
-};
-
-static const char *get_val_type_name(enum kutf_helper_valtype valtype)
-{
-	/* enums can be signed or unsigned (implementation dependant), so
-	 * enforce it to prevent:
-	 * a) "<0 comparison on unsigned type" warning - if we did both upper
-	 *    and lower bound check
-	 * b) incorrect range checking if it was a signed type - if we did
-	 *    upper bound check only */
-	unsigned int type_idx = (unsigned int)valtype;
-
-	if (type_idx >= (unsigned int)KUTF_HELPER_VALTYPE_COUNT)
-		type_idx = (unsigned int)KUTF_HELPER_VALTYPE_INVALID;
-
-	return valtype_names[type_idx];
-}
-
-/* Check up to str_len chars of val_str to see if it's a valid value name:
- *
- * - Has between 1 and KUTF_HELPER_MAX_VAL_NAME_LEN characters before the \0 terminator
- * - And, each char is in the character set [A-Z0-9_] */
-static int validate_val_name(char *val_str, int str_len)
-{
-	int i = 0;
-
-	for (i = 0; str_len && i <= KUTF_HELPER_MAX_VAL_NAME_LEN && val_str[i] != '\0'; ++i, --str_len) {
-		char val_chr = val_str[i];
-
-		if (val_chr >= 'A' && val_chr <= 'Z')
-			continue;
-		if (val_chr >= '0' && val_chr <= '9')
-			continue;
-		if (val_chr == '_')
-			continue;
-
-		/* Character not in the set [A-Z0-9_] - report error */
-		return 1;
-	}
-
-	/* Names of 0 length are not valid */
-	if (i == 0)
-		return 1;
-	/* Length greater than KUTF_HELPER_MAX_VAL_NAME_LEN not allowed */
-	if (i > KUTF_HELPER_MAX_VAL_NAME_LEN || (i == KUTF_HELPER_MAX_VAL_NAME_LEN && val_str[i] != '\0'))
-		return 1;
-
-	return 0;
-}
-
-/* Find the length of the valid part of the string when it will be in quotes
- * e.g. "str"
- *
- * That is, before any '\\', '\n' or '"' characters. This is so we don't have
- * to escape the string */
-static int find_quoted_string_valid_len(char *str)
-{
-	char *ptr;
-	const char *check_chars = "\\\n\"";
-
-	ptr = strpbrk(str, check_chars);
-	if (ptr)
-		return ptr-str;
-
-	return strlen(str);
-}
-
-#define MAX_U64_HEX_LEN 16
-/* (Name size) + ("=0x" size) + (64-bit hex value size) + (terminator) */
-#define NAMED_U64_VAL_BUF_SZ (KUTF_HELPER_MAX_VAL_NAME_LEN + 3 + MAX_U64_HEX_LEN + 1)
-
-int kutf_helper_textbuf_send_named_u64(struct kutf_context *context,
-		struct kutf_helper_textbuf *textbuf, char *val_name, u64 val)
-{
-	int ret = 1;
-	char msgbuf[NAMED_U64_VAL_BUF_SZ];
-	const char *errmsg = NULL;
-
-	if (validate_val_name(val_name, KUTF_HELPER_MAX_VAL_NAME_LEN + 1)) {
-		errmsg = kutf_dsprintf(&context->fixture_pool,
-				"Failed to send u64 value named '%s': Invalid value name", val_name);
-		goto out_err;
-	}
-
-	ret = snprintf(msgbuf, NAMED_U64_VAL_BUF_SZ, "%s=0x%llx", val_name, val);
-	if (ret >= NAMED_U64_VAL_BUF_SZ || ret < 0) {
-		errmsg = kutf_dsprintf(&context->fixture_pool,
-				"Failed to send u64 value named '%s': snprintf() problem buffer size==%d ret=%d",
-				val_name, NAMED_U64_VAL_BUF_SZ, ret);
-		goto out_err;
-	}
-	msgbuf[NAMED_U64_VAL_BUF_SZ-1] = '\0';
-
-	ret = kutf_helper_textbuf_enqueue(textbuf, msgbuf, NAMED_U64_VAL_BUF_SZ);
-	if (ret) {
-		errmsg = kutf_dsprintf(&context->fixture_pool,
-				"Failed to send u64 value named '%s': send returned %d",
-				val_name, ret);
-		goto out_err;
-	}
-
-	return ret;
-out_err:
-	kutf_test_fail(context, errmsg);
-	return ret;
-}
-EXPORT_SYMBOL(kutf_helper_textbuf_send_named_u64);
-
-#define NAMED_VALUE_SEP "="
-#define NAMED_STR_START_DELIM NAMED_VALUE_SEP "\""
-#define NAMED_STR_END_DELIM "\""
-
-int kutf_helper_textbuf_max_str_len_for_kern(char *val_name,
-		int kern_buf_sz)
-{
-	int val_name_len = strlen(val_name);
-	int start_delim_len = strlen(NAMED_STR_START_DELIM);
-	int max_msg_len = kern_buf_sz - 1;
-	int max_str_len;
-
-	/* We do not include the end delimiter. Providing there is a line
-	 * ending character when sending the message, the end delimiter can be
-	 * truncated off safely to allow proper NAME="value" reception when
-	 * value's length is too long */
-	max_str_len = max_msg_len - val_name_len - start_delim_len;
-
-	return max_str_len;
-}
-EXPORT_SYMBOL(kutf_helper_textbuf_max_str_len_for_kern);
-
-int kutf_helper_textbuf_send_named_str(struct kutf_context *context,
-		struct kutf_helper_textbuf *textbuf, char *val_name,
-		char *val_str)
-{
-	int val_str_len;
-	int str_buf_sz;
-	char *str_buf = NULL;
-	int ret = 1;
-	char *copy_ptr;
-	int val_name_len;
-	int start_delim_len = strlen(NAMED_STR_START_DELIM);
-	int end_delim_len = strlen(NAMED_STR_END_DELIM);
-	const char *errmsg = NULL;
-
-	if (validate_val_name(val_name, KUTF_HELPER_MAX_VAL_NAME_LEN + 1)) {
-		errmsg = kutf_dsprintf(&context->fixture_pool,
-				"Failed to send u64 value named '%s': Invalid value name", val_name);
-		goto out_err;
-	}
-	val_name_len = strlen(val_name);
-
-	val_str_len = find_quoted_string_valid_len(val_str);
-
-	/* (name length) + ("=\"" length) + (val_str len) + ("\"" length) + terminator */
-	str_buf_sz = val_name_len + start_delim_len + val_str_len + end_delim_len + 1;
-
-	/* Using kmalloc() here instead of mempool since we know we need to free
-	 * before we return */
-	str_buf = kmalloc(str_buf_sz, GFP_KERNEL);
-	if (!str_buf) {
-		errmsg = kutf_dsprintf(&context->fixture_pool,
-				"Failed to send str value named '%s': kmalloc failed, str_buf_sz=%d",
-				val_name, str_buf_sz);
-		goto out_err;
-	}
-	copy_ptr = str_buf;
-
-	/* Manually copy each string component instead of snprintf because
-	 * val_str may need to end early, and less error path handling */
-
-	/* name */
-	memcpy(copy_ptr, val_name, val_name_len);
-	copy_ptr += val_name_len;
-
-	/* str start delimiter */
-	memcpy(copy_ptr, NAMED_STR_START_DELIM, start_delim_len);
-	copy_ptr += start_delim_len;
-
-	/* str value */
-	memcpy(copy_ptr, val_str, val_str_len);
-	copy_ptr += val_str_len;
-
-	/* str end delimiter */
-	memcpy(copy_ptr, NAMED_STR_END_DELIM, end_delim_len);
-	copy_ptr += end_delim_len;
-
-	/* Terminator */
-	*copy_ptr = '\0';
-
-	ret = kutf_helper_textbuf_enqueue(textbuf, str_buf, str_buf_sz);
-
-	if (ret) {
-		errmsg = kutf_dsprintf(&context->fixture_pool,
-				"Failed to send str value named '%s': send returned %d",
-				val_name, ret);
-		goto out_err;
-	}
-
-	kfree(str_buf);
-	return ret;
-
-out_err:
-	kutf_test_fail(context, errmsg);
-	kfree(str_buf);
-	return ret;
-}
-EXPORT_SYMBOL(kutf_helper_textbuf_send_named_str);
-
-int kutf_helper_textbuf_receive_named_val(struct kutf_helper_named_val *named_val,
-		struct kutf_helper_textbuf *textbuf)
-{
-	int recv_sz;
-	char *recv_str;
-	char *search_ptr;
-	char *name_str = NULL;
-	int name_len;
-	int strval_len;
-	enum kutf_helper_valtype type = KUTF_HELPER_VALTYPE_INVALID;
-	char *strval = NULL;
-	u64 u64val = 0;
-	int orig_recv_sz;
-	int err = KUTF_HELPER_ERR_INVALID_VALUE;
-
-	recv_str = kutf_helper_textbuf_dequeue(textbuf, &recv_sz);
-	if (!recv_str)
-		return -EBUSY;
-	else if (IS_ERR(recv_str))
-		return PTR_ERR(recv_str);
-	orig_recv_sz = recv_sz;
-
-	/* Find the '=', grab the name and validate it */
-	search_ptr = strnchr(recv_str, recv_sz, NAMED_VALUE_SEP[0]);
-	if (search_ptr) {
-		name_len = search_ptr - recv_str;
-		if (!validate_val_name(recv_str, name_len)) {
-			/* no need to reallocate - just modify string in place */
-			name_str = recv_str;
-			name_str[name_len] = '\0';
-
-			/* Move until after the '=' */
-			recv_str += (name_len + 1);
-			recv_sz -= (name_len + 1);
-		}
-	}
-	if (!name_str) {
-		pr_err("Invalid name part for recevied string '%s'\n", recv_str);
-		return KUTF_HELPER_ERR_INVALID_NAME;
-	}
-
-	/* detect value type */
-	if (*recv_str == NAMED_STR_START_DELIM[1]) {
-		/* string delimiter start*/
-		++recv_str;
-		--recv_sz;
-
-		/* Find end of string */
-		search_ptr = strnchr(recv_str, recv_sz, NAMED_STR_END_DELIM[0]);
-		if (search_ptr) {
-			strval_len = search_ptr - recv_str;
-			/* Validate the string to ensure it contains no quotes */
-			if (strval_len == find_quoted_string_valid_len(recv_str)) {
-				/* no need to reallocate - just modify string in place */
-				strval = recv_str;
-				strval[strval_len] = '\0';
-
-				/* Move until after the end delimiter */
-				recv_str += (strval_len + 1);
-				recv_sz -= (strval_len + 1);
-				type = KUTF_HELPER_VALTYPE_STR;
-			} else {
-				pr_err("String value contains invalid characters in rest of received string '%s'\n", recv_str);
-				err = KUTF_HELPER_ERR_CHARS_AFTER_VAL;
-			}
-		} else if (orig_recv_sz == textbuf->max_line_size) {
-			/* No end-delimiter found, but the line is at
-			 * the max line size. Assume that before
-			 * truncation the line had a closing delimiter
-			 * anyway */
-			strval_len = strlen(recv_str);
-			/* Validate the string to ensure it contains no quotes */
-			if (strval_len == find_quoted_string_valid_len(recv_str)) {
-				strval = recv_str;
-
-				/* Move to the end of the string */
-				recv_str += strval_len;
-				recv_sz -= strval_len;
-				type = KUTF_HELPER_VALTYPE_STR;
-			} else {
-				pr_err("String value contains invalid characters in rest of received string '%s'\n", recv_str);
-				err = KUTF_HELPER_ERR_CHARS_AFTER_VAL;
-			}
-		} else {
-			pr_err("End of string delimiter not found in rest of received string '%s'\n", recv_str);
-			err = KUTF_HELPER_ERR_NO_END_DELIMITER;
-		}
-	} else {
-		/* possibly a number value - strtoull will parse it */
-		err = kstrtoull(recv_str, 0, &u64val);
-		/* unlike userspace can't get an end ptr, but if kstrtoull()
-		 * reads characters after the number it'll report -EINVAL */
-		if (!err) {
-			int len_remain = strnlen(recv_str, recv_sz);
-
-			type = KUTF_HELPER_VALTYPE_U64;
-			recv_str += len_remain;
-			recv_sz -= len_remain;
-		} else {
-			/* special case: not a number, report as such */
-			pr_err("Rest of received string was not a numeric value or quoted string value: '%s'\n", recv_str);
-		}
-	}
-
-	if (type == KUTF_HELPER_VALTYPE_INVALID)
-		return err;
-
-	/* Any remaining characters - error */
-	if (strnlen(recv_str, recv_sz) != 0) {
-		pr_err("Characters remain after value of type %s: '%s'\n",
-				get_val_type_name(type), recv_str);
-		return KUTF_HELPER_ERR_CHARS_AFTER_VAL;
-	}
-
-	/* Success - write into the output structure */
-	switch (type) {
-	case KUTF_HELPER_VALTYPE_U64:
-		named_val->u.val_u64 = u64val;
-		break;
-	case KUTF_HELPER_VALTYPE_STR:
-		named_val->u.val_str = strval;
-		break;
-	default:
-		pr_err("Unreachable, fix textbuf_receive_named_val\n");
-		/* Coding error, report as though 'data' file failed */
-		return -EINVAL;
-	}
-
-	named_val->val_name = name_str;
-	named_val->type = type;
-
-	return KUTF_HELPER_ERR_NONE;
-}
-EXPORT_SYMBOL(kutf_helper_textbuf_receive_named_val);
-
-#define DUMMY_MSG "<placeholder due to test fail>"
-int kutf_helper_textbuf_receive_check_val(struct kutf_helper_named_val *named_val,
-		struct kutf_context *context, struct kutf_helper_textbuf *textbuf,
-		char *expect_val_name, enum kutf_helper_valtype expect_val_type)
-{
-	int err;
-
-	err = kutf_helper_textbuf_receive_named_val(named_val, textbuf);
-	if (err < 0) {
-		const char *msg = kutf_dsprintf(&context->fixture_pool,
-				"Failed to receive value named '%s'",
-				expect_val_name);
-		kutf_test_fail(context, msg);
-		return err;
-	} else if (err > 0) {
-		const char *msg = kutf_dsprintf(&context->fixture_pool,
-				"Named-value parse error when expecting value named '%s'",
-				expect_val_name);
-		kutf_test_fail(context, msg);
-		goto out_fail_and_fixup;
-	}
-
-	if (strcmp(named_val->val_name, expect_val_name) != 0) {
-		const char *msg = kutf_dsprintf(&context->fixture_pool,
-				"Expecting to receive value named '%s' but got '%s'",
-				expect_val_name, named_val->val_name);
-		kutf_test_fail(context, msg);
-		goto out_fail_and_fixup;
-	}
-
-
-	if (named_val->type != expect_val_type) {
-		const char *msg = kutf_dsprintf(&context->fixture_pool,
-				"Expecting value named '%s' to be of type %s but got %s",
-				expect_val_name, get_val_type_name(expect_val_type),
-				get_val_type_name(named_val->type));
-		kutf_test_fail(context, msg);
-		goto out_fail_and_fixup;
-	}
-
-	return err;
-
-out_fail_and_fixup:
-	/* Produce a valid but incorrect value */
-	switch (expect_val_type) {
-	case KUTF_HELPER_VALTYPE_U64:
-		named_val->u.val_u64 = 0ull;
-		break;
-	case KUTF_HELPER_VALTYPE_STR:
-		{
-			char *str = kutf_mempool_alloc(&context->fixture_pool, sizeof(DUMMY_MSG));
-
-			if (!str)
-				return -1;
-
-			strcpy(str, DUMMY_MSG);
-			named_val->u.val_str = str;
-			break;
-		}
-	default:
-		break;
-	}
-
-	/* Indicate that this is invalid */
-	named_val->type = KUTF_HELPER_VALTYPE_INVALID;
-
-	/* But at least allow the caller to continue in the test with failures */
-	return 0;
-}
-EXPORT_SYMBOL(kutf_helper_textbuf_receive_check_val);
-
-void kutf_helper_output_named_val(struct kutf_helper_named_val *named_val)
-{
-	switch (named_val->type) {
-	case KUTF_HELPER_VALTYPE_U64:
-		pr_warn("%s=0x%llx\n", named_val->val_name, named_val->u.val_u64);
-		break;
-	case KUTF_HELPER_VALTYPE_STR:
-		pr_warn("%s=\"%s\"\n", named_val->val_name, named_val->u.val_str);
-		break;
-	case KUTF_HELPER_VALTYPE_INVALID:
-		pr_warn("%s is invalid\n", named_val->val_name);
-		break;
-	default:
-		pr_warn("%s has unknown type %d\n", named_val->val_name, named_val->type);
-		break;
-	}
-}
-EXPORT_SYMBOL(kutf_helper_output_named_val);
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_mem.c b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_mem.c
deleted file mode 100644
index a75e15fde05f..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_mem.c
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014, 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/* Kernel UTF memory management functions */
-
-#include <linux/list.h>
-#include <linux/slab.h>
-
-#include <kutf/kutf_mem.h>
-
-
-/**
- * struct kutf_alloc_entry - Structure representing an allocation.
- * @node:	List node for use with kutf_mempool.
- * @data:	Data area of the allocation
- */
-struct kutf_alloc_entry {
-	struct list_head node;
-	u8 data[0];
-};
-
-int kutf_mempool_init(struct kutf_mempool *pool)
-{
-	if (!pool) {
-		pr_err("NULL pointer passed to %s\n", __func__);
-		return -1;
-	}
-
-	INIT_LIST_HEAD(&pool->head);
-	mutex_init(&pool->lock);
-
-	return 0;
-}
-EXPORT_SYMBOL(kutf_mempool_init);
-
-void kutf_mempool_destroy(struct kutf_mempool *pool)
-{
-	struct list_head *remove;
-	struct list_head *tmp;
-
-	if (!pool) {
-		pr_err("NULL pointer passed to %s\n", __func__);
-		return;
-	}
-
-	mutex_lock(&pool->lock);
-	list_for_each_safe(remove, tmp, &pool->head) {
-		struct kutf_alloc_entry *remove_alloc;
-
-		remove_alloc = list_entry(remove, struct kutf_alloc_entry, node);
-		list_del(&remove_alloc->node);
-		kfree(remove_alloc);
-	}
-	mutex_unlock(&pool->lock);
-
-}
-EXPORT_SYMBOL(kutf_mempool_destroy);
-
-void *kutf_mempool_alloc(struct kutf_mempool *pool, size_t size)
-{
-	struct kutf_alloc_entry *ret;
-
-	if (!pool) {
-		pr_err("NULL pointer passed to %s\n", __func__);
-		goto fail_pool;
-	}
-
-	mutex_lock(&pool->lock);
-
-	ret = kmalloc(sizeof(*ret) + size, GFP_KERNEL);
-	if (!ret) {
-		pr_err("Failed to allocate memory\n");
-		goto fail_alloc;
-	}
-
-	INIT_LIST_HEAD(&ret->node);
-	list_add(&ret->node, &pool->head);
-
-	mutex_unlock(&pool->lock);
-
-	return &ret->data[0];
-
-fail_alloc:
-	mutex_unlock(&pool->lock);
-fail_pool:
-	return NULL;
-}
-EXPORT_SYMBOL(kutf_mempool_alloc);
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_resultset.c b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_resultset.c
deleted file mode 100644
index 5bd04969fd55..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_resultset.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014, 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/* Kernel UTF result management functions */
-
-#include <linux/list.h>
-#include <linux/slab.h>
-#include <linux/printk.h>
-
-#include <kutf/kutf_resultset.h>
-
-/**
- * struct kutf_result_set - Represents a set of results.
- * @results:	Pointer to the linked list where the results are stored.
- */
-struct kutf_result_set {
-	struct list_head          results;
-};
-
-struct kutf_result_set *kutf_create_result_set(void)
-{
-	struct kutf_result_set *set;
-
-	set = kmalloc(sizeof(*set), GFP_KERNEL);
-	if (!set) {
-		pr_err("Failed to allocate resultset");
-		goto fail_alloc;
-	}
-
-	INIT_LIST_HEAD(&set->results);
-
-	return set;
-
-fail_alloc:
-	return NULL;
-}
-
-void kutf_add_result(struct kutf_mempool *mempool,
-		struct kutf_result_set *set,
-		enum kutf_result_status status,
-		const char *message)
-{
-	/* Create the new result */
-	struct kutf_result *new_result;
-
-	BUG_ON(set == NULL);
-
-	new_result = kutf_mempool_alloc(mempool, sizeof(*new_result));
-	if (!new_result) {
-		pr_err("Result allocation failed\n");
-		return;
-	}
-
-	INIT_LIST_HEAD(&new_result->node);
-	new_result->status = status;
-	new_result->message = message;
-
-	list_add_tail(&new_result->node, &set->results);
-}
-
-void kutf_destroy_result_set(struct kutf_result_set *set)
-{
-	if (!list_empty(&set->results))
-		pr_err("kutf_destroy_result_set: Unread results from test\n");
-
-	kfree(set);
-}
-
-struct kutf_result *kutf_remove_result(struct kutf_result_set *set)
-{
-	if (!list_empty(&set->results)) {
-		struct kutf_result *ret;
-
-		ret = list_first_entry(&set->results, struct kutf_result, node);
-		list_del(&ret->node);
-		return ret;
-	}
-
-	return NULL;
-}
-
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_suite.c b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_suite.c
deleted file mode 100644
index ad30cc86a3b0..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_suite.c
+++ /dev/null
@@ -1,1398 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014, 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/* Kernel UTF suite, test and fixture management including user to kernel
- * interaction */
-
-#include <linux/list.h>
-#include <linux/slab.h>
-#include <linux/debugfs.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/uaccess.h>
-#include <linux/fs.h>
-#include <linux/version.h>
-#include <linux/atomic.h>
-
-#include <generated/autoconf.h>
-
-#include <kutf/kutf_suite.h>
-#include <kutf/kutf_resultset.h>
-#include <kutf/kutf_utils.h>
-
-#if defined(CONFIG_DEBUG_FS)
-
-/**
- * struct kutf_application - Structure which represents kutf application
- * @name:	The name of this test application.
- * @dir:	The debugfs directory for this test
- * @suite_list:	List head to store all the suites which are part of this
- *              application
- */
-struct kutf_application {
-	const char         *name;
-	struct dentry      *dir;
-	struct list_head   suite_list;
-};
-
-/**
- * struct kutf_test_function - Structure which represents kutf test function
- * @suite:		Back reference to the suite this test function
- *                      belongs to
- * @filters:		Filters that apply to this test function
- * @test_id:		Test ID
- * @execute:		Function to run for this test
- * @test_data:		Static data for this test
- * @node:		List node for test_list
- * @variant_list:	List head to store all the variants which can run on
- *                      this function
- * @dir:		debugfs directory for this test function
- * @userdata_ops:	Callbacks to use for sending and receiving data to
- *                      userspace.
- */
-struct kutf_test_function {
-	struct kutf_suite  *suite;
-	unsigned int       filters;
-	unsigned int       test_id;
-	void (*execute)(struct kutf_context *context);
-	union kutf_callback_data test_data;
-	struct list_head   node;
-	struct list_head   variant_list;
-	struct dentry      *dir;
-	struct kutf_userdata_ops userdata_ops;
-};
-
-/**
- * struct kutf_test_fixture - Structure which holds information on the kutf
- *                            test fixture
- * @test_func:		Test function this fixture belongs to
- * @fixture_index:	Index of this fixture
- * @node:		List node for variant_list
- * @dir:		debugfs directory for this test fixture
- * @nr_running:		Current count of user-clients running this fixture
- */
-struct kutf_test_fixture {
-	struct kutf_test_function *test_func;
-	unsigned int              fixture_index;
-	struct list_head          node;
-	struct dentry             *dir;
-	atomic_t                  nr_running;
-};
-
-struct dentry *base_dir;
-
-/**
- * struct kutf_convert_table - Structure which keeps test results
- * @result_name:	Status of the test result
- * @result:		Status value for a single test
- */
-struct kutf_convert_table {
-	char                    result_name[50];
-	enum kutf_result_status result;
-};
-
-struct kutf_convert_table kutf_convert[] = {
-#define ADD_UTF_RESULT(_name) \
-{ \
-	#_name, \
-	_name, \
-},
-ADD_UTF_RESULT(KUTF_RESULT_BENCHMARK)
-ADD_UTF_RESULT(KUTF_RESULT_SKIP)
-ADD_UTF_RESULT(KUTF_RESULT_UNKNOWN)
-ADD_UTF_RESULT(KUTF_RESULT_PASS)
-ADD_UTF_RESULT(KUTF_RESULT_DEBUG)
-ADD_UTF_RESULT(KUTF_RESULT_INFO)
-ADD_UTF_RESULT(KUTF_RESULT_WARN)
-ADD_UTF_RESULT(KUTF_RESULT_FAIL)
-ADD_UTF_RESULT(KUTF_RESULT_FATAL)
-ADD_UTF_RESULT(KUTF_RESULT_ABORT)
-};
-
-#define UTF_CONVERT_SIZE (ARRAY_SIZE(kutf_convert))
-
-/**
- * kutf_create_context() - Create a test context in which a specific fixture
- *                         of an application will be run and its results
- *                         reported back to the user
- * @test_fix:	Test fixture to be run.
- *
- * The context's refcount will be initialized to 1.
- *
- * Return: Returns the created test context on success or NULL on failure
- */
-static struct kutf_context *kutf_create_context(
-		struct kutf_test_fixture *test_fix);
-
-/**
- * kutf_destroy_context() - Destroy a previously created test context, only
- *                          once its refcount has become zero
- * @kref:	pointer to kref member within the context
- *
- * This should only be used via a kref_put() call on the context's kref member
- */
-static void kutf_destroy_context(struct kref *kref);
-
-/**
- * kutf_context_get() - increment refcount on a context
- * @context:	the kutf context
- *
- * This must be used when the lifetime of the context might exceed that of the
- * thread creating @context
- */
-static void kutf_context_get(struct kutf_context *context);
-
-/**
- * kutf_context_put() - decrement refcount on a context, destroying it when it
- *                      reached zero
- * @context:	the kutf context
- *
- * This must be used only after a corresponding kutf_context_get() call on
- * @context, and the caller no longer needs access to @context.
- */
-static void kutf_context_put(struct kutf_context *context);
-
-/**
- * kutf_set_result() - Set the test result against the specified test context
- * @context:	Test context
- * @status:	Result status
- */
-static void kutf_set_result(struct kutf_context *context,
-		enum kutf_result_status status);
-
-/**
- * kutf_set_expected_result() - Set the expected test result for the specified
- *                              test context
- * @context:		Test context
- * @expected_status:	Expected result status
- */
-static void kutf_set_expected_result(struct kutf_context *context,
-		enum kutf_result_status expected_status);
-
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0))
-/* Pre 3.4.0 kernels don't have the simple_open helper */
-
-/**
- * simple_open() - Helper for file opening which stores the inode private data
- *                 into the file private data
- * @inode:	File entry representation
- * @file:	A specific opening of the file
- *
- * Return: always 0; if inode private data do not exist, the file will not
- *         be assigned private data
- */
-static int simple_open(struct inode *inode, struct file *file)
-{
-	if (inode->i_private)
-		file->private_data = inode->i_private;
-	return 0;
-}
-#endif
-
-/**
- * kutf_result_to_string() - Converts a KUTF result into a string
- * @result_str:      Output result string
- * @result:          Result status to convert
- *
- * Return: 1 if test result was successfully converted to string, 0 otherwise
- */
-static int kutf_result_to_string(char **result_str,
-		enum kutf_result_status result)
-{
-	int i;
-	int ret = 0;
-
-	for (i = 0; i < UTF_CONVERT_SIZE; i++) {
-		if (result == kutf_convert[i].result) {
-			*result_str = kutf_convert[i].result_name;
-			ret = 1;
-		}
-	}
-	return ret;
-}
-
-/**
- * kutf_debugfs_const_string_read() - Simple debugfs read callback which
- *                                    returns a constant string
- * @file:	Opened file to read from
- * @buf:	User buffer to write the data into
- * @len:	Amount of data to read
- * @ppos:	Offset into file to read from
- *
- * Return: On success, the number of bytes read and offset @ppos advanced by
- *         this number; on error, negative value
- */
-static ssize_t kutf_debugfs_const_string_read(struct file *file,
-		char __user *buf, size_t len, loff_t *ppos)
-{
-	char *str = file->private_data;
-
-	return simple_read_from_buffer(buf, len, ppos, str, strlen(str));
-}
-
-static const struct file_operations kutf_debugfs_const_string_ops = {
-	.owner = THIS_MODULE,
-	.open = simple_open,
-	.read = kutf_debugfs_const_string_read,
-	.llseek  = default_llseek,
-};
-
-/**
- * kutf_debugfs_data_open() Debugfs open callback for the "data" entry.
- * @inode:	inode of the opened file
- * @file:	Opened file to read from
- *
- * This function notifies the userdata callbacks that the userdata file has
- * been opened, for tracking purposes.
- *
- * It is called on both the context's userdata_consumer_priv and
- * userdata_producer_priv.
- *
- * This takes a refcount on the kutf_context
- *
- * Return: 0 on success
- */
-static int kutf_debugfs_data_open(struct inode *inode, struct file *file)
-{
-	struct kutf_context *test_context = inode->i_private;
-	struct kutf_test_fixture *test_fix = test_context->test_fix;
-	struct kutf_test_function *test_func = test_fix->test_func;
-	int err;
-
-	simple_open(inode, file);
-
-	/* This is not an error */
-	if (!test_func->userdata_ops.open)
-		goto out_no_ops;
-
-	/* This is safe here - the 'data' file is only openable whilst the
-	 * initial refcount is still present, and the initial refcount is only
-	 * dropped strictly after the 'data' file is removed */
-	kutf_context_get(test_context);
-
-	if (test_context->userdata_consumer_priv) {
-		err = test_func->userdata_ops.open(test_context->userdata_consumer_priv);
-		if (err)
-			goto out_consumer_fail;
-	}
-
-	if (test_context->userdata_producer_priv) {
-		err = test_func->userdata_ops.open(test_context->userdata_producer_priv);
-		if (err)
-			goto out_producer_fail;
-	}
-
-out_no_ops:
-	return 0;
-
-out_producer_fail:
-	if (test_func->userdata_ops.release && test_context->userdata_consumer_priv)
-		test_func->userdata_ops.release(test_context->userdata_consumer_priv);
-out_consumer_fail:
-	kutf_context_put(test_context);
-
-	return err;
-}
-
-
-/**
- * kutf_debugfs_data_read() Debugfs read callback for the "data" entry.
- * @file:	Opened file to read from
- * @buf:	User buffer to write the data into
- * @len:	Amount of data to read
- * @ppos:	Offset into file to read from
- *
- * This function allows user and kernel to exchange extra data necessary for
- * the test fixture.
- *
- * The data is read from the first struct kutf_context running the fixture
- *
- * Return: Number of bytes read
- */
-static ssize_t kutf_debugfs_data_read(struct file *file, char __user *buf,
-		size_t len, loff_t *ppos)
-{
-	struct kutf_context *test_context = file->private_data;
-	struct kutf_test_fixture *test_fix = test_context->test_fix;
-	struct kutf_test_function *test_func = test_fix->test_func;
-	ssize_t (*producer)(void *private, char  __user *userbuf,
-			size_t userbuf_len, loff_t *ppos);
-	ssize_t count;
-
-	producer = test_func->userdata_ops.producer;
-	/* Can only read if there's a producer callback */
-	if (!producer)
-		return -ENODEV;
-
-	count = producer(test_context->userdata_producer_priv, buf, len, ppos);
-
-	return count;
-}
-
-/**
- * kutf_debugfs_data_write() Debugfs write callback for the "data" entry.
- * @file:	Opened file to write to
- * @buf:	User buffer to read the data from
- * @len:	Amount of data to write
- * @ppos:	Offset into file to write to
- *
- * This function allows user and kernel to exchange extra data necessary for
- * the test fixture.
- *
- * The data is added to the first struct kutf_context running the fixture
- *
- * Return: Number of bytes written
- */
-static ssize_t kutf_debugfs_data_write(struct file *file,
-		const char __user *buf, size_t len, loff_t *ppos)
-{
-	struct kutf_context *test_context = file->private_data;
-	struct kutf_test_fixture *test_fix = test_context->test_fix;
-	struct kutf_test_function *test_func = test_fix->test_func;
-	ssize_t (*consumer)(void *private, const char  __user *userbuf,
-			size_t userbuf_len, loff_t *ppos);
-	ssize_t count;
-
-	consumer = test_func->userdata_ops.consumer;
-	/* Can only write if there's a consumer callback */
-	if (!consumer)
-		return -ENODEV;
-
-	count = consumer(test_context->userdata_consumer_priv, buf, len, ppos);
-
-	return count;
-}
-
-
-/**
- * kutf_debugfs_data_release() - Debugfs release callback for the "data" entry.
- * @inode:	File entry representation
- * @file:	A specific opening of the file
- *
- * This function notifies the userdata callbacks that the userdata file has
- * been closed, for tracking purposes.
- *
- * It is called on both the context's userdata_consumer_priv and
- * userdata_producer_priv.
- *
- * It also drops the refcount on the kutf_context that was taken during
- * kutf_debugfs_data_open()
- */
-static int kutf_debugfs_data_release(struct inode *inode, struct file *file)
-{
-	struct kutf_context *test_context = file->private_data;
-	struct kutf_test_fixture *test_fix = test_context->test_fix;
-	struct kutf_test_function *test_func = test_fix->test_func;
-
-	if (!test_func->userdata_ops.release)
-		return 0;
-
-	if (test_context->userdata_consumer_priv)
-		test_func->userdata_ops.release(test_context->userdata_consumer_priv);
-	if (test_context->userdata_producer_priv)
-		test_func->userdata_ops.release(test_context->userdata_producer_priv);
-
-	kutf_context_put(test_context);
-
-	return 0;
-}
-
-
-static const struct file_operations kutf_debugfs_data_ops = {
-	.owner = THIS_MODULE,
-	.open = kutf_debugfs_data_open,
-	.read = kutf_debugfs_data_read,
-	.write = kutf_debugfs_data_write,
-	.release = kutf_debugfs_data_release,
-	.llseek  = default_llseek,
-};
-
-/**
- * userdata_init() - Initialize userspace data exchange for a test, if
- *                   specified by that test
- * @test_context:	Test context
- *
- * Note that this allows new refcounts to be made on test_context by userspace
- * threads opening the 'data' file.
- *
- * Return: 0 on success, negative value corresponding to error code in failure
- *         and kutf result will be set appropriately to indicate the error
- */
-static int userdata_init(struct kutf_context *test_context)
-{
-	struct kutf_test_fixture *test_fix = test_context->test_fix;
-	struct kutf_test_function *test_func = test_fix->test_func;
-	int err = 0;
-	struct dentry *userdata_dentry;
-
-	/* Valid to have neither a producer or consumer, which is the case for
-	 * tests not requiring usersdata */
-	if ((!test_func->userdata_ops.consumer) && (!test_func->userdata_ops.producer))
-		return err;
-
-	if (test_func->userdata_ops.consumer && !test_context->userdata_consumer_priv) {
-		kutf_test_fatal(test_context,
-				"incorrect test setup - userdata consumer provided without private data");
-		return -EFAULT;
-	}
-
-	if (test_func->userdata_ops.producer && !test_context->userdata_producer_priv) {
-		kutf_test_fatal(test_context,
-				"incorrect test setup - userdata producer provided without private data");
-		return -EFAULT;
-	}
-
-	userdata_dentry = debugfs_create_file("data", S_IROTH, test_fix->dir,
-			test_context, &kutf_debugfs_data_ops);
-
-	if (!userdata_dentry) {
-		pr_err("Failed to create debugfs file \"data\" when running fixture\n");
-		/* Not using Fatal (which stops other tests running),
-		 * nor Abort (which indicates teardown should not be done) */
-		kutf_test_fail(test_context,
-				"failed to create 'data' file for userside data exchange");
-
-		/* Error code is discarded by caller, but consistent with other
-		 * debugfs_create_file failures */
-		err = -EEXIST;
-	} else {
-		test_context->userdata_dentry = userdata_dentry;
-	}
-
-
-	return err;
-}
-
-/**
- * userdata_term() - Terminate userspace data exchange for a test, if specified
- *                   by that test
- * @test_context:	Test context
- *
- * Note This also prevents new refcounts being made on @test_context by userspace
- * threads opening the 'data' file for this test. Any existing open file descriptors
- * to the 'data' file will still be safe to use by userspace.
- */
-static void userdata_term(struct kutf_context *test_context)
-{
-	struct kutf_test_fixture *test_fix = test_context->test_fix;
-	struct kutf_test_function *test_func = test_fix->test_func;
-	void (*notify_ended)(void *priv) = test_func->userdata_ops.notify_ended;
-
-	/* debugfs_remove() is safe when parameter is error or NULL */
-	debugfs_remove(test_context->userdata_dentry);
-
-	/* debugfs_remove() doesn't kill any currently open file descriptors on
-	 * this file, and such fds are still safe to use providing test_context
-	 * is properly refcounted */
-
-	if (notify_ended) {
-		if (test_context->userdata_consumer_priv)
-			notify_ended(test_context->userdata_consumer_priv);
-		if (test_context->userdata_producer_priv)
-			notify_ended(test_context->userdata_producer_priv);
-	}
-
-}
-
-/**
- * kutf_add_explicit_result() - Check if an explicit result needs to be added
- * @context:	KUTF test context
- */
-static void kutf_add_explicit_result(struct kutf_context *context)
-{
-	switch (context->expected_status) {
-	case KUTF_RESULT_UNKNOWN:
-		if (context->status == KUTF_RESULT_UNKNOWN)
-			kutf_test_pass(context, "(implicit pass)");
-		break;
-
-	case KUTF_RESULT_WARN:
-		if (context->status == KUTF_RESULT_WARN)
-			kutf_test_pass(context,
-					"Pass (expected warn occurred)");
-		else if (context->status != KUTF_RESULT_SKIP)
-			kutf_test_fail(context,
-					"Fail (expected warn missing)");
-		break;
-
-	case KUTF_RESULT_FAIL:
-		if (context->status == KUTF_RESULT_FAIL)
-			kutf_test_pass(context,
-					"Pass (expected fail occurred)");
-		else if (context->status != KUTF_RESULT_SKIP) {
-			/* Force the expected status so the fail gets logged */
-			context->expected_status = KUTF_RESULT_PASS;
-			kutf_test_fail(context,
-					"Fail (expected fail missing)");
-		}
-		break;
-
-	case KUTF_RESULT_FATAL:
-		if (context->status == KUTF_RESULT_FATAL)
-			kutf_test_pass(context,
-					"Pass (expected fatal occurred)");
-		else if (context->status != KUTF_RESULT_SKIP)
-			kutf_test_fail(context,
-					"Fail (expected fatal missing)");
-		break;
-
-	case KUTF_RESULT_ABORT:
-		if (context->status == KUTF_RESULT_ABORT)
-			kutf_test_pass(context,
-					"Pass (expected abort occurred)");
-		else if (context->status != KUTF_RESULT_SKIP)
-			kutf_test_fail(context,
-					"Fail (expected abort missing)");
-		break;
-	default:
-		break;
-	}
-}
-
-/**
- * kutf_debugfs_run_open() Debugfs open callback for the "run" entry.
- * @inode:	inode of the opened file
- * @file:	Opened file to read from
- *
- * This function retrieves the test fixture data that is associated with the
- * opened file and works back to get the test, suite and application so
- * it can then run the test that is associated with the file entry.
- *
- * Return: 0 on success
- */
-static int kutf_debugfs_run_open(struct inode *inode, struct file *file)
-{
-	struct kutf_test_fixture *test_fix = inode->i_private;
-	struct kutf_test_function *test_func = test_fix->test_func;
-	struct kutf_suite *suite = test_func->suite;
-	struct kutf_context *test_context;
-	int err = 0;
-
-	/* For the moment, only one user-client should be attempting to run
-	 * this at a time. This simplifies how we lookup the kutf_context when
-	 * using the 'data' file.
-	 * Removing this restriction would require a rewrite of the mechanism
-	 * of the 'data' file to pass data in, perhaps 'data' created here and
-	 * based upon userspace thread's pid */
-	if (atomic_inc_return(&test_fix->nr_running) != 1) {
-		err = -EBUSY;
-		goto finish;
-	}
-
-	test_context = kutf_create_context(test_fix);
-	if (!test_context) {
-		err = -ENODEV;
-		goto finish;
-	}
-
-	file->private_data = test_context;
-
-	/*
-	 *  Call the create fixture function if required before the
-	 * fixture is run
-	 */
-	if (suite->create_fixture)
-		test_context->fixture = suite->create_fixture(test_context);
-
-	/* Only run the test if the fixture was created (if required) */
-	if ((suite->create_fixture && test_context->fixture) ||
-			(!suite->create_fixture)) {
-		int late_err;
-		/* Setup any userdata exchange */
-		late_err = userdata_init(test_context);
-
-		if (!late_err)
-			/* Run this fixture */
-			test_func->execute(test_context);
-
-		userdata_term(test_context);
-
-		if (suite->remove_fixture)
-			suite->remove_fixture(test_context);
-
-		kutf_add_explicit_result(test_context);
-	}
-
-finish:
-	atomic_dec(&test_fix->nr_running);
-	return err;
-}
-
-/**
- * kutf_debugfs_run_read() - Debugfs read callback for the "run" entry.
- * @file:	Opened file to read from
- * @buf:	User buffer to write the data into
- * @len:	Amount of data to read
- * @ppos:	Offset into file to read from
- *
- * This function emits the results which where logged during the opening of
- * the file kutf_debugfs_run_open.
- * Results will be emitted one at a time, once all the results have been read
- * 0 will be returned to indicate there is no more data.
- *
- * Return: Number of bytes read.
- */
-static ssize_t kutf_debugfs_run_read(struct file *file, char __user *buf,
-		size_t len, loff_t *ppos)
-{
-	struct kutf_context *test_context = file->private_data;
-	struct kutf_result *res;
-	unsigned long bytes_not_copied;
-	ssize_t bytes_copied = 0;
-
-	/* Note: This code assumes a result is read completely */
-	res = kutf_remove_result(test_context->result_set);
-	if (res) {
-		char *kutf_str_ptr = NULL;
-		unsigned int kutf_str_len = 0;
-		unsigned int message_len = 0;
-		char separator = ':';
-		char terminator = '\n';
-
-		kutf_result_to_string(&kutf_str_ptr, res->status);
-		if (kutf_str_ptr)
-			kutf_str_len = strlen(kutf_str_ptr);
-
-		if (res->message)
-			message_len = strlen(res->message);
-
-		if ((kutf_str_len + 1 + message_len + 1) > len) {
-			pr_err("Not enough space in user buffer for a single result");
-			return 0;
-		}
-
-		/* First copy the result string */
-		if (kutf_str_ptr) {
-			bytes_not_copied = copy_to_user(&buf[0], kutf_str_ptr,
-							kutf_str_len);
-			bytes_copied += kutf_str_len - bytes_not_copied;
-			if (bytes_not_copied)
-				goto exit;
-		}
-
-		/* Then the separator */
-		bytes_not_copied = copy_to_user(&buf[bytes_copied],
-						&separator, 1);
-		bytes_copied += 1 - bytes_not_copied;
-		if (bytes_not_copied)
-			goto exit;
-
-		/* Finally Next copy the result string */
-		if (res->message) {
-			bytes_not_copied = copy_to_user(&buf[bytes_copied],
-							res->message, message_len);
-			bytes_copied += message_len - bytes_not_copied;
-			if (bytes_not_copied)
-				goto exit;
-		}
-
-		/* Finally the terminator */
-		bytes_not_copied = copy_to_user(&buf[bytes_copied],
-						&terminator, 1);
-		bytes_copied += 1 - bytes_not_copied;
-	}
-exit:
-	return bytes_copied;
-}
-
-/**
- * kutf_debugfs_run_release() - Debugfs release callback for the "run" entry.
- * @inode:	File entry representation
- * @file:	A specific opening of the file
- *
- * Release any resources that where created during the opening of the file
- *
- * Note that resources may not be released immediately, that might only happen
- * later when other users of the kutf_context release their refcount.
- *
- * Return: 0 on success
- */
-static int kutf_debugfs_run_release(struct inode *inode, struct file *file)
-{
-	struct kutf_context *test_context = file->private_data;
-
-	kutf_context_put(test_context);
-	return 0;
-}
-
-static const struct file_operations kutf_debugfs_run_ops = {
-	.owner = THIS_MODULE,
-	.open = kutf_debugfs_run_open,
-	.read = kutf_debugfs_run_read,
-	.release = kutf_debugfs_run_release,
-	.llseek  = default_llseek,
-};
-
-/**
- * create_fixture_variant() - Creates a fixture variant for the specified
- *                            test function and index and the debugfs entries
- *                            that represent it.
- * @test_func:		Test function
- * @fixture_index:	Fixture index
- *
- * Return: 0 on success, negative value corresponding to error code in failure
- */
-static int create_fixture_variant(struct kutf_test_function *test_func,
-		unsigned int fixture_index)
-{
-	struct kutf_test_fixture *test_fix;
-	char name[11];	/* Enough to print the MAX_UINT32 + the null terminator */
-	struct dentry *tmp;
-	int err;
-
-	test_fix = kmalloc(sizeof(*test_fix), GFP_KERNEL);
-	if (!test_fix) {
-		pr_err("Failed to create debugfs directory when adding fixture\n");
-		err = -ENOMEM;
-		goto fail_alloc;
-	}
-
-	test_fix->test_func = test_func;
-	test_fix->fixture_index = fixture_index;
-	atomic_set(&test_fix->nr_running, 0);
-
-	snprintf(name, sizeof(name), "%d", fixture_index);
-	test_fix->dir = debugfs_create_dir(name, test_func->dir);
-	if (!test_func->dir) {
-		pr_err("Failed to create debugfs directory when adding fixture\n");
-		/* Might not be the right error, we don't get it passed back to us */
-		err = -EEXIST;
-		goto fail_dir;
-	}
-
-	tmp = debugfs_create_file("type", S_IROTH, test_fix->dir, "fixture\n",
-				  &kutf_debugfs_const_string_ops);
-	if (!tmp) {
-		pr_err("Failed to create debugfs file \"type\" when adding fixture\n");
-		/* Might not be the right error, we don't get it passed back to us */
-		err = -EEXIST;
-		goto fail_file;
-	}
-
-	tmp = debugfs_create_file("run", S_IROTH, test_fix->dir, test_fix,
-				  &kutf_debugfs_run_ops);
-	if (!tmp) {
-		pr_err("Failed to create debugfs file \"run\" when adding fixture\n");
-		/* Might not be the right error, we don't get it passed back to us */
-		err = -EEXIST;
-		goto fail_file;
-	}
-
-	list_add(&test_fix->node, &test_func->variant_list);
-	return 0;
-
-fail_file:
-	debugfs_remove_recursive(test_fix->dir);
-fail_dir:
-	kfree(test_fix);
-fail_alloc:
-	return err;
-}
-
-/**
- * kutf_remove_test_variant() - Destroy a previously created fixture variant.
- * @test_fix:	Test fixture
- */
-static void kutf_remove_test_variant(struct kutf_test_fixture *test_fix)
-{
-	debugfs_remove_recursive(test_fix->dir);
-	kfree(test_fix);
-}
-
-void kutf_add_test_with_filters_data_and_userdata(
-		struct kutf_suite *suite,
-		unsigned int id,
-		const char *name,
-		void (*execute)(struct kutf_context *context),
-		unsigned int filters,
-		union kutf_callback_data test_data,
-		struct kutf_userdata_ops *userdata_ops)
-{
-	struct kutf_test_function *test_func;
-	struct dentry *tmp;
-	unsigned int i;
-
-	test_func = kmalloc(sizeof(*test_func), GFP_KERNEL);
-	if (!test_func) {
-		pr_err("Failed to allocate memory when adding test %s\n", name);
-		goto fail_alloc;
-	}
-
-	INIT_LIST_HEAD(&test_func->variant_list);
-
-	test_func->dir = debugfs_create_dir(name, suite->dir);
-	if (!test_func->dir) {
-		pr_err("Failed to create debugfs directory when adding test %s\n", name);
-		goto fail_dir;
-	}
-
-	tmp = debugfs_create_file("type", S_IROTH, test_func->dir, "test\n",
-				  &kutf_debugfs_const_string_ops);
-	if (!tmp) {
-		pr_err("Failed to create debugfs file \"type\" when adding test %s\n", name);
-		goto fail_file;
-	}
-
-	test_func->filters = filters;
-	tmp = debugfs_create_x32("filters", S_IROTH, test_func->dir,
-				 &test_func->filters);
-	if (!tmp) {
-		pr_err("Failed to create debugfs file \"filters\" when adding test %s\n", name);
-		goto fail_file;
-	}
-
-	test_func->test_id = id;
-	tmp = debugfs_create_u32("test_id", S_IROTH, test_func->dir,
-				 &test_func->test_id);
-	if (!tmp) {
-		pr_err("Failed to create debugfs file \"test_id\" when adding test %s\n", name);
-		goto fail_file;
-	}
-
-	for (i = 0; i < suite->fixture_variants; i++) {
-		if (create_fixture_variant(test_func, i)) {
-			pr_err("Failed to create fixture %d when adding test %s\n", i, name);
-			goto fail_file;
-		}
-	}
-
-	test_func->suite = suite;
-	test_func->execute = execute;
-	test_func->test_data = test_data;
-	memcpy(&test_func->userdata_ops, userdata_ops, sizeof(*userdata_ops));
-
-	list_add(&test_func->node, &suite->test_list);
-	return;
-
-fail_file:
-	debugfs_remove_recursive(test_func->dir);
-fail_dir:
-	kfree(test_func);
-fail_alloc:
-	return;
-}
-EXPORT_SYMBOL(kutf_add_test_with_filters_data_and_userdata);
-
-void kutf_add_test_with_filters_and_data(
-		struct kutf_suite *suite,
-		unsigned int id,
-		const char *name,
-		void (*execute)(struct kutf_context *context),
-		unsigned int filters,
-		union kutf_callback_data test_data)
-{
-	struct kutf_userdata_ops userdata_ops = {
-		.open = NULL,
-		.release = NULL,
-		.consumer = NULL,
-		.producer = NULL,
-	};
-
-	kutf_add_test_with_filters_data_and_userdata(suite, id, name, execute,
-			filters, test_data, &userdata_ops);
-}
-
-EXPORT_SYMBOL(kutf_add_test_with_filters_and_data);
-
-void kutf_add_test_with_filters(
-		struct kutf_suite *suite,
-		unsigned int id,
-		const char *name,
-		void (*execute)(struct kutf_context *context),
-		unsigned int filters)
-{
-	union kutf_callback_data data;
-
-	data.ptr_value = NULL;
-
-	kutf_add_test_with_filters_and_data(suite,
-					    id,
-					    name,
-					    execute,
-					    suite->suite_default_flags,
-					    data);
-}
-EXPORT_SYMBOL(kutf_add_test_with_filters);
-
-void kutf_add_test(struct kutf_suite *suite,
-		unsigned int id,
-		const char *name,
-		void (*execute)(struct kutf_context *context))
-{
-	union kutf_callback_data data;
-
-	data.ptr_value = NULL;
-
-	kutf_add_test_with_filters_and_data(suite,
-					    id,
-					    name,
-					    execute,
-					    suite->suite_default_flags,
-					    data);
-}
-EXPORT_SYMBOL(kutf_add_test);
-
-/**
- * kutf_remove_test(): Remove a previously added test function.
- * @test_func: Test function
- */
-static void kutf_remove_test(struct kutf_test_function *test_func)
-{
-	struct list_head *pos;
-	struct list_head *tmp;
-
-	list_for_each_safe(pos, tmp, &test_func->variant_list) {
-		struct kutf_test_fixture *test_fix;
-
-		test_fix = list_entry(pos, struct kutf_test_fixture, node);
-		kutf_remove_test_variant(test_fix);
-	}
-
-	list_del(&test_func->node);
-	debugfs_remove_recursive(test_func->dir);
-	kfree(test_func);
-}
-
-struct kutf_suite *kutf_create_suite_with_filters_and_data(
-		struct kutf_application *app,
-		const char *name,
-		unsigned int fixture_count,
-		void *(*create_fixture)(struct kutf_context *context),
-		void (*remove_fixture)(struct kutf_context *context),
-		unsigned int filters,
-		union kutf_callback_data suite_data)
-{
-	struct kutf_suite *suite;
-	struct dentry *tmp;
-
-	suite = kmalloc(sizeof(*suite), GFP_KERNEL);
-	if (!suite) {
-		pr_err("Failed to allocate memory when creating suite %s\n", name);
-		goto fail_kmalloc;
-	}
-
-	suite->dir = debugfs_create_dir(name, app->dir);
-	if (!suite->dir) {
-		pr_err("Failed to create debugfs directory when adding test %s\n", name);
-		goto fail_debugfs;
-	}
-
-	tmp = debugfs_create_file("type", S_IROTH, suite->dir, "suite\n",
-				  &kutf_debugfs_const_string_ops);
-	if (!tmp) {
-		pr_err("Failed to create debugfs file \"type\" when adding test %s\n", name);
-		goto fail_file;
-	}
-
-	INIT_LIST_HEAD(&suite->test_list);
-	suite->app = app;
-	suite->name = name;
-	suite->fixture_variants = fixture_count;
-	suite->create_fixture = create_fixture;
-	suite->remove_fixture = remove_fixture;
-	suite->suite_default_flags = filters;
-	suite->suite_data = suite_data;
-
-	list_add(&suite->node, &app->suite_list);
-
-	return suite;
-
-fail_file:
-	debugfs_remove_recursive(suite->dir);
-fail_debugfs:
-	kfree(suite);
-fail_kmalloc:
-	return NULL;
-}
-EXPORT_SYMBOL(kutf_create_suite_with_filters_and_data);
-
-struct kutf_suite *kutf_create_suite_with_filters(
-		struct kutf_application *app,
-		const char *name,
-		unsigned int fixture_count,
-		void *(*create_fixture)(struct kutf_context *context),
-		void (*remove_fixture)(struct kutf_context *context),
-		unsigned int filters)
-{
-	union kutf_callback_data data;
-
-	data.ptr_value = NULL;
-	return kutf_create_suite_with_filters_and_data(app,
-						       name,
-						       fixture_count,
-						       create_fixture,
-						       remove_fixture,
-						       filters,
-						       data);
-}
-EXPORT_SYMBOL(kutf_create_suite_with_filters);
-
-struct kutf_suite *kutf_create_suite(
-		struct kutf_application *app,
-		const char *name,
-		unsigned int fixture_count,
-		void *(*create_fixture)(struct kutf_context *context),
-		void (*remove_fixture)(struct kutf_context *context))
-{
-	union kutf_callback_data data;
-
-	data.ptr_value = NULL;
-	return kutf_create_suite_with_filters_and_data(app,
-						       name,
-						       fixture_count,
-						       create_fixture,
-						       remove_fixture,
-						       KUTF_F_TEST_GENERIC,
-						       data);
-}
-EXPORT_SYMBOL(kutf_create_suite);
-
-/**
- * kutf_destroy_suite() - Destroy a previously added test suite.
- * @suite:	Test suite
- */
-static void kutf_destroy_suite(struct kutf_suite *suite)
-{
-	struct list_head *pos;
-	struct list_head *tmp;
-
-	list_for_each_safe(pos, tmp, &suite->test_list) {
-		struct kutf_test_function *test_func;
-
-		test_func = list_entry(pos, struct kutf_test_function, node);
-		kutf_remove_test(test_func);
-	}
-
-	list_del(&suite->node);
-	debugfs_remove_recursive(suite->dir);
-	kfree(suite);
-}
-
-struct kutf_application *kutf_create_application(const char *name)
-{
-	struct kutf_application *app;
-	struct dentry *tmp;
-
-	app = kmalloc(sizeof(*app), GFP_KERNEL);
-	if (!app) {
-		pr_err("Failed to create allocate memory when creating application %s\n", name);
-		goto fail_kmalloc;
-	}
-
-	app->dir = debugfs_create_dir(name, base_dir);
-	if (!app->dir) {
-		pr_err("Failed to create debugfs direcotry when creating application %s\n", name);
-		goto fail_debugfs;
-	}
-
-	tmp = debugfs_create_file("type", S_IROTH, app->dir, "application\n",
-				  &kutf_debugfs_const_string_ops);
-	if (!tmp) {
-		pr_err("Failed to create debugfs file \"type\" when creating application %s\n", name);
-		goto fail_file;
-	}
-
-	INIT_LIST_HEAD(&app->suite_list);
-	app->name = name;
-
-	return app;
-
-fail_file:
-	debugfs_remove_recursive(app->dir);
-fail_debugfs:
-	kfree(app);
-fail_kmalloc:
-	return NULL;
-}
-EXPORT_SYMBOL(kutf_create_application);
-
-void kutf_destroy_application(struct kutf_application *app)
-{
-	struct list_head *pos;
-	struct list_head *tmp;
-
-	list_for_each_safe(pos, tmp, &app->suite_list) {
-		struct kutf_suite *suite;
-
-		suite = list_entry(pos, struct kutf_suite, node);
-		kutf_destroy_suite(suite);
-	}
-
-	debugfs_remove_recursive(app->dir);
-	kfree(app);
-}
-EXPORT_SYMBOL(kutf_destroy_application);
-
-static struct kutf_context *kutf_create_context(
-		struct kutf_test_fixture *test_fix)
-{
-	struct kutf_context *new_context;
-
-	new_context = kmalloc(sizeof(*new_context), GFP_KERNEL);
-	if (!new_context) {
-		pr_err("Failed to allocate test context");
-		goto fail_alloc;
-	}
-
-	new_context->result_set = kutf_create_result_set();
-	if (!new_context->result_set) {
-		pr_err("Failed to create resultset");
-		goto fail_result_set;
-	}
-
-	new_context->test_fix = test_fix;
-	/* Save the pointer to the suite as the callbacks will require it */
-	new_context->suite = test_fix->test_func->suite;
-	new_context->status = KUTF_RESULT_UNKNOWN;
-	new_context->expected_status = KUTF_RESULT_UNKNOWN;
-
-	kutf_mempool_init(&new_context->fixture_pool);
-	new_context->fixture = NULL;
-	new_context->fixture_index = test_fix->fixture_index;
-	new_context->fixture_name = NULL;
-	new_context->test_data = test_fix->test_func->test_data;
-	new_context->userdata_consumer_priv = NULL;
-	new_context->userdata_producer_priv = NULL;
-	new_context->userdata_dentry = NULL;
-
-	kref_init(&new_context->kref);
-
-	return new_context;
-
-fail_result_set:
-	kfree(new_context);
-fail_alloc:
-	return NULL;
-}
-
-static void kutf_destroy_context(struct kref *kref)
-{
-	struct kutf_context *context;
-
-	context = container_of(kref, struct kutf_context, kref);
-	kutf_destroy_result_set(context->result_set);
-	kutf_mempool_destroy(&context->fixture_pool);
-	kfree(context);
-}
-
-static void kutf_context_get(struct kutf_context *context)
-{
-	kref_get(&context->kref);
-}
-
-static void kutf_context_put(struct kutf_context *context)
-{
-	kref_put(&context->kref, kutf_destroy_context);
-}
-
-
-static void kutf_set_result(struct kutf_context *context,
-		enum kutf_result_status status)
-{
-	context->status = status;
-}
-
-static void kutf_set_expected_result(struct kutf_context *context,
-		enum kutf_result_status expected_status)
-{
-	context->expected_status = expected_status;
-}
-
-/**
- * kutf_test_log_result() - Log a result for the specified test context
- * @context:	Test context
- * @message:	Result string
- * @new_status:	Result status
- */
-static void kutf_test_log_result(
-	struct kutf_context *context,
-	const char *message,
-	enum kutf_result_status new_status)
-{
-	if (context->status < new_status)
-		context->status = new_status;
-
-	if (context->expected_status != new_status)
-		kutf_add_result(&context->fixture_pool, context->result_set,
-				new_status, message);
-}
-
-void kutf_test_log_result_external(
-	struct kutf_context *context,
-	const char *message,
-	enum kutf_result_status new_status)
-{
-	kutf_test_log_result(context, message, new_status);
-}
-EXPORT_SYMBOL(kutf_test_log_result_external);
-
-void kutf_test_expect_abort(struct kutf_context *context)
-{
-	kutf_set_expected_result(context, KUTF_RESULT_ABORT);
-}
-EXPORT_SYMBOL(kutf_test_expect_abort);
-
-void kutf_test_expect_fatal(struct kutf_context *context)
-{
-	kutf_set_expected_result(context, KUTF_RESULT_FATAL);
-}
-EXPORT_SYMBOL(kutf_test_expect_fatal);
-
-void kutf_test_expect_fail(struct kutf_context *context)
-{
-	kutf_set_expected_result(context, KUTF_RESULT_FAIL);
-}
-EXPORT_SYMBOL(kutf_test_expect_fail);
-
-void kutf_test_expect_warn(struct kutf_context *context)
-{
-	kutf_set_expected_result(context, KUTF_RESULT_WARN);
-}
-EXPORT_SYMBOL(kutf_test_expect_warn);
-
-void kutf_test_expect_pass(struct kutf_context *context)
-{
-	kutf_set_expected_result(context, KUTF_RESULT_PASS);
-}
-EXPORT_SYMBOL(kutf_test_expect_pass);
-
-void kutf_test_skip(struct kutf_context *context)
-{
-	kutf_set_result(context, KUTF_RESULT_SKIP);
-	kutf_set_expected_result(context, KUTF_RESULT_UNKNOWN);
-
-	kutf_test_log_result(context, "Test skipped", KUTF_RESULT_SKIP);
-}
-EXPORT_SYMBOL(kutf_test_skip);
-
-void kutf_test_skip_msg(struct kutf_context *context, const char *message)
-{
-	kutf_set_result(context, KUTF_RESULT_SKIP);
-	kutf_set_expected_result(context, KUTF_RESULT_UNKNOWN);
-
-	kutf_test_log_result(context, kutf_dsprintf(&context->fixture_pool,
-			     "Test skipped: %s", message), KUTF_RESULT_SKIP);
-	kutf_test_log_result(context, "!!!Test skipped!!!", KUTF_RESULT_SKIP);
-}
-EXPORT_SYMBOL(kutf_test_skip_msg);
-
-void kutf_test_debug(struct kutf_context *context, char const *message)
-{
-	kutf_test_log_result(context, message, KUTF_RESULT_DEBUG);
-}
-EXPORT_SYMBOL(kutf_test_debug);
-
-void kutf_test_pass(struct kutf_context *context, char const *message)
-{
-	static const char explicit_message[] = "(explicit pass)";
-
-	if (!message)
-		message = explicit_message;
-
-	kutf_test_log_result(context, message, KUTF_RESULT_PASS);
-}
-EXPORT_SYMBOL(kutf_test_pass);
-
-void kutf_test_info(struct kutf_context *context, char const *message)
-{
-	kutf_test_log_result(context, message, KUTF_RESULT_INFO);
-}
-EXPORT_SYMBOL(kutf_test_info);
-
-void kutf_test_warn(struct kutf_context *context, char const *message)
-{
-	kutf_test_log_result(context, message, KUTF_RESULT_WARN);
-}
-EXPORT_SYMBOL(kutf_test_warn);
-
-void kutf_test_fail(struct kutf_context *context, char const *message)
-{
-	kutf_test_log_result(context, message, KUTF_RESULT_FAIL);
-}
-EXPORT_SYMBOL(kutf_test_fail);
-
-void kutf_test_fatal(struct kutf_context *context, char const *message)
-{
-	kutf_test_log_result(context, message, KUTF_RESULT_FATAL);
-}
-EXPORT_SYMBOL(kutf_test_fatal);
-
-void kutf_test_abort(struct kutf_context *context)
-{
-	kutf_test_log_result(context, "", KUTF_RESULT_ABORT);
-}
-EXPORT_SYMBOL(kutf_test_abort);
-
-/**
- * init_kutf_core() - Module entry point.
- *
- * Create the base entry point in debugfs.
- */
-static int __init init_kutf_core(void)
-{
-	int ret;
-
-	base_dir = debugfs_create_dir("kutf_tests", NULL);
-	if (!base_dir) {
-		ret = -ENODEV;
-		goto exit_dir;
-	}
-
-	return 0;
-
-exit_dir:
-	return ret;
-}
-
-/**
- * exit_kutf_core() - Module exit point.
- *
- * Remove the base entry point in debugfs.
- */
-static void __exit exit_kutf_core(void)
-{
-	debugfs_remove_recursive(base_dir);
-}
-
-#else	/* defined(CONFIG_DEBUG_FS) */
-
-/**
- * init_kutf_core() - Module entry point.
- *
- * Stub for when build against a kernel without debugfs support
- */
-static int __init init_kutf_core(void)
-{
-	pr_debug("KUTF requires a kernel with debug fs support");
-
-	return -ENODEV;
-}
-
-/**
- * exit_kutf_core() - Module exit point.
- *
- * Stub for when build against a kernel without debugfs support
- */
-static void __exit exit_kutf_core(void)
-{
-}
-#endif	/* defined(CONFIG_DEBUG_FS) */
-
-MODULE_LICENSE("GPL");
-
-module_init(init_kutf_core);
-module_exit(exit_kutf_core);
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_utils.c b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_utils.c
deleted file mode 100644
index a429a2dbf788..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/kutf_utils.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2014, 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-/* Kernel UTF utility functions */
-
-#include <linux/mutex.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/printk.h>
-
-#include <kutf/kutf_utils.h>
-#include <kutf/kutf_mem.h>
-
-static char tmp_buffer[KUTF_MAX_DSPRINTF_LEN];
-
-DEFINE_MUTEX(buffer_lock);
-
-const char *kutf_dsprintf(struct kutf_mempool *pool,
-		const char *fmt, ...)
-{
-	va_list args;
-	int len;
-	int size;
-	void *buffer;
-
-	mutex_lock(&buffer_lock);
-	va_start(args, fmt);
-	len = vsnprintf(tmp_buffer, sizeof(tmp_buffer), fmt, args);
-	va_end(args);
-
-	if (len < 0) {
-		pr_err("kutf_dsprintf: Bad format dsprintf format %s\n", fmt);
-		goto fail_format;
-	}
-
-	if (len >= sizeof(tmp_buffer)) {
-		pr_warn("kutf_dsprintf: Truncated dsprintf message %s\n", fmt);
-		size = sizeof(tmp_buffer);
-	} else {
-		size = len + 1;
-	}
-
-	buffer = kutf_mempool_alloc(pool, size);
-	if (!buffer)
-		goto fail_alloc;
-
-	memcpy(buffer, tmp_buffer, size);
-	mutex_unlock(&buffer_lock);
-
-	return buffer;
-
-fail_alloc:
-fail_format:
-	mutex_unlock(&buffer_lock);
-	return NULL;
-}
-EXPORT_SYMBOL(kutf_dsprintf);
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/sconscript b/drivers/gpu/arm/bifrost_for_linux/tests/kutf/sconscript
deleted file mode 100644
index d7f112448e42..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/kutf/sconscript
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# (C) COPYRIGHT 2014-2016, 2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-Import('kutf_env')
-
-make_args = kutf_env.kernel_get_config_defines(ret_list = True)
-
-mod = kutf_env.BuildKernelModule('$STATIC_LIB_PATH/kutf.ko', Glob('*.c'), make_args = make_args)
-kutf_env.KernelObjTarget('kutf', mod)
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/Kbuild b/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/Kbuild
deleted file mode 100644
index 0cd9cebe9d8b..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/Kbuild
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-ccflags-y += -I$(src)/../include -I$(src)/../../../ -I$(src)/../../ -I$(src)/../../backend/gpu -I$(srctree)/drivers/staging/android
-
-obj-$(CONFIG_MALI_IRQ_LATENCY) += mali_kutf_irq_test.o
-
-mali_kutf_irq_test-y := mali_kutf_irq_test_main.o
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/Kconfig b/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/Kconfig
deleted file mode 100644
index 4caa8ec8a0e2..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/Kconfig
+++ /dev/null
@@ -1,23 +0,0 @@
-#
-# (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-config MALI_IRQ_LATENCY
- tristate "Mali GPU IRQ latency measurement"
- depends on MALI_BIFROST && MALI_BIFROST_DEBUG && MALI_KUTF
- default m
- help
-   This option will build a test module mali_kutf_irq_test that
-   can determine the latency of the Mali GPU IRQ on your system.
-   Choosing M here will generate a single module called mali_kutf_irq_test.
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/Makefile b/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/Makefile
deleted file mode 100644
index ced37b08e532..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/Makefile
+++ /dev/null
@@ -1,47 +0,0 @@
-#
-# (C) COPYRIGHT 2015, 2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-# linux build system bootstrap for out-of-tree module
-
-# default to building for the host
-ARCH ?= $(shell uname -m)
-
-ifeq ($(KDIR),)
-$(error Must specify KDIR to point to the kernel to target))
-endif
-
-TEST_CCFLAGS := \
-	-DMALI_DEBUG=$(MALI_BIFROST_DEBUG) \
-	-DMALI_BACKEND_KERNEL=$(MALI_BACKEND_KERNEL) \
-	-DMALI_NO_MALI=$(MALI_BIFROST_NO_MALI) \
-	-DMALI_UNIT_TEST=$(MALI_UNIT_TEST) \
-	-DMALI_USE_UMP=$(MALI_USE_UMP) \
-	-DMALI_ERROR_INJECT_ON=$(MALI_ERROR_INJECT_ON) \
-	-DMALI_CUSTOMER_RELEASE=$(MALI_CUSTOMER_RELEASE) \
-	$(SCONS_CFLAGS) \
-	-I$(CURDIR)/../include \
-	-I$(CURDIR)/../../../../../../include \
-	-I$(CURDIR)/../../../ \
-	-I$(CURDIR)/../../ \
-	-I$(CURDIR)/../../backend/gpu \
-	-I$(CURDIR)/ \
-	-I$(srctree)/drivers/staging/android \
-	-I$(srctree)/include/linux
-
-all:
-	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) $(SCONS_CONFIGS) EXTRA_CFLAGS="$(TEST_CCFLAGS)" KBUILD_EXTRA_SYMBOLS="$(CURDIR)/../kutf/Module.symvers $(CURDIR)/../../Module.symvers" modules
-
-clean:
-	$(MAKE) ARCH=$(ARCH) -C $(KDIR) M=$(CURDIR) clean
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/mali_kutf_irq_test_main.c b/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/mali_kutf_irq_test_main.c
deleted file mode 100644
index c9cc4447cf37..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/mali_kutf_irq_test_main.c
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2016, 2017 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the
- * GNU General Public License version 2 as published by the Free Software
- * Foundation, and any use by you of this program is subject to the terms
- * of such GNU licence.
- *
- * A copy of the licence is included with the program, and can also be obtained
- * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301, USA.
- *
- */
-
-
-
-#include <linux/module.h>
-#include <linux/delay.h>
-#include <linux/interrupt.h>
-
-#include "mali_kbase.h"
-#include <midgard/backend/gpu/mali_kbase_device_internal.h>
-
-#include <kutf/kutf_suite.h>
-#include <kutf/kutf_utils.h>
-
-/*
- * This file contains the code which is used for measuring interrupt latency
- * of the Mali GPU IRQ. In particular, function mali_kutf_irq_latency() is
- * used with this purpose and it is called within KUTF framework - a kernel
- * unit test framework. The measured latency provided by this test should
- * be representative for the latency of the Mali JOB/MMU IRQs as well.
- */
-
-/* KUTF test application pointer for this test */
-struct kutf_application *irq_app;
-
-/**
- * struct kutf_irq_fixture data - test fixture used by the test functions.
- * @kbdev:	kbase device for the GPU.
- *
- */
-struct kutf_irq_fixture_data {
-	struct kbase_device *kbdev;
-};
-
-#define SEC_TO_NANO(s)	      ((s)*1000000000LL)
-
-/* ID for the GPU IRQ */
-#define GPU_IRQ_HANDLER 2
-
-#define NR_TEST_IRQS 1000000
-
-/* IRQ for the test to trigger. Currently MULTIPLE_GPU_FAULTS as we would not
- * expect to see this in normal use (e.g., when Android is running). */
-#define TEST_IRQ MULTIPLE_GPU_FAULTS
-
-#define IRQ_TIMEOUT HZ
-
-/* Kernel API for setting irq throttle hook callback and irq time in us*/
-extern int kbase_set_custom_irq_handler(struct kbase_device *kbdev,
-		irq_handler_t custom_handler,
-		int irq_type);
-extern irqreturn_t kbase_gpu_irq_handler(int irq, void *data);
-
-static DECLARE_WAIT_QUEUE_HEAD(wait);
-static bool triggered;
-static u64 irq_time;
-
-static void *kbase_untag(void *ptr)
-{
-	return (void *)(((uintptr_t) ptr) & ~3);
-}
-
-/**
- * kbase_gpu_irq_custom_handler - Custom IRQ throttle handler
- * @irq:  IRQ number
- * @data: Data associated with this IRQ
- *
- * Return: state of the IRQ
- */
-static irqreturn_t kbase_gpu_irq_custom_handler(int irq, void *data)
-{
-	struct kbase_device *kbdev = kbase_untag(data);
-	u32 val;
-
-	val = kbase_reg_read(kbdev, GPU_CONTROL_REG(GPU_IRQ_STATUS), NULL);
-	if (val & TEST_IRQ) {
-		struct timespec tval;
-
-		getnstimeofday(&tval);
-		irq_time = SEC_TO_NANO(tval.tv_sec) + (tval.tv_nsec);
-
-		kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_IRQ_CLEAR), val,
-				NULL);
-
-		triggered = true;
-		wake_up(&wait);
-
-		return IRQ_HANDLED;
-	}
-
-	/* Trigger main irq handler */
-	return kbase_gpu_irq_handler(irq, data);
-}
-
-/**
- * mali_kutf_irq_default_create_fixture() - Creates the fixture data required
- *                                          for all the tests in the irq suite.
- * @context:             KUTF context.
- *
- * Return: Fixture data created on success or NULL on failure
- */
-static void *mali_kutf_irq_default_create_fixture(
-		struct kutf_context *context)
-{
-	struct kutf_irq_fixture_data *data;
-
-	data = kutf_mempool_alloc(&context->fixture_pool,
-			sizeof(struct kutf_irq_fixture_data));
-
-	if (!data)
-		goto fail;
-
-	/* Acquire the kbase device */
-	data->kbdev = kbase_find_device(-1);
-	if (data->kbdev == NULL) {
-		kutf_test_fail(context, "Failed to find kbase device");
-		goto fail;
-	}
-
-	return data;
-
-fail:
-	return NULL;
-}
-
-/**
- * mali_kutf_irq_default_remove_fixture() - Destroy fixture data previously
- *                          created by mali_kutf_irq_default_create_fixture.
- *
- * @context:             KUTF context.
- */
-static void mali_kutf_irq_default_remove_fixture(
-		struct kutf_context *context)
-{
-	struct kutf_irq_fixture_data *data = context->fixture;
-	struct kbase_device *kbdev = data->kbdev;
-
-	kbase_release_device(kbdev);
-}
-
-/**
- * mali_kutf_irq_latency() - measure GPU IRQ latency
- * @context:		kutf context within which to perform the test
- *
- * The test triggers IRQs manually, and measures the
- * time between triggering the IRQ and the IRQ handler being executed.
- *
- * This is not a traditional test, in that the pass/fail status has little
- * meaning (other than indicating that the IRQ handler executed at all). Instead
- * the results are in the latencies provided with the test result. There is no
- * meaningful pass/fail result that can be obtained here, instead the latencies
- * are provided for manual analysis only.
- */
-static void mali_kutf_irq_latency(struct kutf_context *context)
-{
-	struct kutf_irq_fixture_data *data = context->fixture;
-	struct kbase_device *kbdev = data->kbdev;
-	u64 min_time = U64_MAX, max_time = 0, average_time = 0;
-	int i;
-	bool test_failed = false;
-
-	/* Force GPU to be powered */
-	kbase_pm_context_active(kbdev);
-
-	kbase_set_custom_irq_handler(kbdev, kbase_gpu_irq_custom_handler,
-			GPU_IRQ_HANDLER);
-
-	for (i = 0; i < NR_TEST_IRQS; i++) {
-		struct timespec tval;
-		u64 start_time;
-		int ret;
-
-		triggered = false;
-		getnstimeofday(&tval);
-		start_time = SEC_TO_NANO(tval.tv_sec) + (tval.tv_nsec);
-
-		/* Trigger fake IRQ */
-		kbase_reg_write(kbdev, GPU_CONTROL_REG(GPU_IRQ_RAWSTAT),
-				TEST_IRQ, NULL);
-
-		ret = wait_event_timeout(wait, triggered != false, IRQ_TIMEOUT);
-
-		if (ret == 0) {
-			kutf_test_fail(context, "Timed out waiting for IRQ\n");
-			test_failed = true;
-			break;
-		}
-
-		if ((irq_time - start_time) < min_time)
-			min_time = irq_time - start_time;
-		if ((irq_time - start_time) > max_time)
-			max_time = irq_time - start_time;
-		average_time += irq_time - start_time;
-
-		udelay(10);
-	}
-
-	/* Go back to default handler */
-	kbase_set_custom_irq_handler(kbdev, NULL, GPU_IRQ_HANDLER);
-
-	kbase_pm_context_idle(kbdev);
-
-	if (!test_failed) {
-		const char *results;
-
-		do_div(average_time, NR_TEST_IRQS);
-		results = kutf_dsprintf(&context->fixture_pool,
-				"Min latency = %lldns, Max latency = %lldns, Average latency = %lldns\n",
-				min_time, max_time, average_time);
-		kutf_test_pass(context, results);
-	}
-}
-
-/**
- * Module entry point for this test.
- */
-int mali_kutf_irq_test_main_init(void)
-{
-	struct kutf_suite *suite;
-
-	irq_app = kutf_create_application("irq");
-
-	if (NULL == irq_app) {
-		pr_warn("Creation of test application failed!\n");
-		return -ENOMEM;
-	}
-
-	suite = kutf_create_suite(irq_app, "irq_default",
-			1, mali_kutf_irq_default_create_fixture,
-			mali_kutf_irq_default_remove_fixture);
-
-	if (NULL == suite) {
-		pr_warn("Creation of test suite failed!\n");
-		kutf_destroy_application(irq_app);
-		return -ENOMEM;
-	}
-
-	kutf_add_test(suite, 0x0, "irq_latency",
-			mali_kutf_irq_latency);
-	return 0;
-}
-
-/**
- * Module exit point for this test.
- */
-void mali_kutf_irq_test_main_exit(void)
-{
-	kutf_destroy_application(irq_app);
-}
-
-module_init(mali_kutf_irq_test_main_init);
-module_exit(mali_kutf_irq_test_main_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("ARM Ltd.");
-MODULE_VERSION("1.0");
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/sconscript b/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/sconscript
deleted file mode 100644
index b06d9ea32924..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/mali_kutf_irq_test/sconscript
+++ /dev/null
@@ -1,30 +0,0 @@
-#
-# (C) COPYRIGHT 2015, 2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-import os
-Import('env')
-
-src = [Glob('#kernel/drivers/gpu/arm/midgard/tests/mali_kutf_irq_test/*.c'), Glob('#kernel/drivers/gpu/arm/midgard/tests/mali_kutf_irq_test/Makefile')]
-
-if env.GetOption('clean') :
-	env.Execute(Action("make clean", '[CLEAN] mali_kutf_irq_test'))
-	cmd = env.Command('$STATIC_LIB_PATH/mali_kutf_irq_test.ko', src, [])
-	env.KernelObjTarget('mali_kutf_irq_test', cmd)
-else:
-	makeAction=Action("cd ${SOURCE.dir} && make MALI_BIFROST_DEBUG=${debug} MALI_BACKEND_KERNEL=1 MALI_ERROR_INJECT_ON=${error_inject} MALI_BIFROST_NO_MALI=${no_mali} MALI_UNIT_TEST=${unit} MALI_USE_UMP=${ump} MALI_CUSTOMER_RELEASE=${release} %s && ( ( [ -f mali_kutf_irq_test.ko ] && cp mali_kutf_irq_test.ko $STATIC_LIB_PATH/ ) || touch $STATIC_LIB_PATH/mali_kutf_irq_test.ko)" % env.kernel_get_config_defines(), '$MAKECOMSTR')
-	cmd = env.Command('$STATIC_LIB_PATH/mali_kutf_irq_test.ko', src, [makeAction])
-	env.Depends('$STATIC_LIB_PATH/mali_kutf_irq_test.ko', '$STATIC_LIB_PATH/kutf.ko')
-	env.Depends('$STATIC_LIB_PATH/mali_kutf_irq_test.ko', '$STATIC_LIB_PATH/mali_kbase.ko')
-	env.KernelObjTarget('mali_kutf_irq_test', cmd)
diff --git a/drivers/gpu/arm/bifrost_for_linux/tests/sconscript b/drivers/gpu/arm/bifrost_for_linux/tests/sconscript
deleted file mode 100644
index 04584117ccef..000000000000
--- a/drivers/gpu/arm/bifrost_for_linux/tests/sconscript
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# (C) COPYRIGHT 2010-2011, 2013, 2017 ARM Limited. All rights reserved.
-#
-# This program is free software and is provided to you under the terms of the
-# GNU General Public License version 2 as published by the Free Software
-# Foundation, and any use by you of this program is subject to the terms
-# of such GNU licence.
-#
-# A copy of the licence is included with the program, and can also be obtained
-# from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA  02110-1301, USA.
-#
-#
-
-
-Import ('env')
-
-kutf_env = env.Clone()
-kutf_env.Append(CPPPATH = '#kernel/drivers/gpu/arm/midgard/tests/include')
-Export('kutf_env')
-
-if Glob('internal/sconscript'):
-	SConscript('internal/sconscript')
-
-if kutf_env['debug'] == '1':
-	SConscript('kutf/sconscript')
-	SConscript('mali_kutf_irq_test/sconscript')
-
-	if Glob('kutf_test/sconscript'):
-		SConscript('kutf_test/sconscript')
-
-	if Glob('kutf_test_runner/sconscript'):
-		SConscript('kutf_test_runner/sconscript')
-
-if env['unit'] == '1':
-	SConscript('mali_kutf_ipa_test/sconscript')
-	SConscript('mali_kutf_ipa_unit_test/sconscript')
-	SConscript('mali_kutf_vinstr_test/sconscript')

commit 572af1468b316051e7702431152b0341bb122793
Author: Zhen Chen <chenzhen@rock-chips.com>
Date:   Mon Sep 13 15:40:10 2021 +0800

    MALI: remove definitions of MALI_BIFROST_FOR_ANDROID and MALI_BIFROST_FOR_LINUX
    
    Signed-off-by: Zhen Chen <chenzhen@rock-chips.com>
    Change-Id: Idd03a830e62582fe738919b7ef4d43163e9cdcb1

diff --git a/drivers/gpu/arm/Kbuild b/drivers/gpu/arm/Kbuild
index 2622f2941a64..62b4706f7326 100644
--- a/drivers/gpu/arm/Kbuild
+++ b/drivers/gpu/arm/Kbuild
@@ -23,6 +23,4 @@ obj-$(CONFIG_MALI_MIDGARD) += midgard/
 
 obj-$(CONFIG_MALI400)      += mali400/
 
-obj-$(CONFIG_MALI_BIFROST_FOR_ANDROID) += bifrost/
-
-obj-$(CONFIG_MALI_BIFROST_FOR_LINUX) += bifrost_for_linux/
+obj-$(CONFIG_MALI_BIFROST) += bifrost/
diff --git a/drivers/gpu/arm/Kconfig b/drivers/gpu/arm/Kconfig
index d6211e33276c..64ede484d1dc 100644
--- a/drivers/gpu/arm/Kconfig
+++ b/drivers/gpu/arm/Kconfig
@@ -23,15 +23,4 @@ source "drivers/gpu/arm/mali400/mali/Kconfig"
 
 source "drivers/gpu/arm/midgard/Kconfig"
 
-choice
-	prompt "Mali bifrost driver"
-
-config MALI_BIFROST_FOR_ANDROID
-	bool "Mali Bifrost for Android"
-
-config MALI_BIFROST_FOR_LINUX
-	bool "Mali Bifrost for Linux only"
-
-endchoice
-
 source "drivers/gpu/arm/bifrost/Kconfig"

commit dc87a4564bfbc3c35659c65c5a5a15a25b31f6ba
Author: Zhen Chen <chenzhen@rock-chips.com>
Date:   Mon Sep 13 15:34:42 2021 +0800

    arm64: configs: rockchip: not to use CONFIG_MALI_BIFROST_FOR_LINUX
    
    No need to use CONFIG_MALI_BIFROST_FOR_LINUX
    after px30/rk3326 Android and Linux device
    use the same bifrost_device_driver "drivers/gpu/arm/bifrost".
    
    Signed-off-by: Zhen Chen <chenzhen@rock-chips.com>
    Change-Id: Ia4c9c79be2c10d5d708a8ea1bb4bc5d49c97267b

diff --git a/arch/arm/configs/rockchip_linux_defconfig b/arch/arm/configs/rockchip_linux_defconfig
index b752dc33845b..3dfd077defa9 100644
--- a/arch/arm/configs/rockchip_linux_defconfig
+++ b/arch/arm/configs/rockchip_linux_defconfig
@@ -325,7 +325,6 @@ CONFIG_MALI_EXPERT=y
 CONFIG_MALI_PLATFORM_THIRDPARTY=y
 CONFIG_MALI_PLATFORM_THIRDPARTY_NAME="rk"
 CONFIG_MALI_PWRSOFT_765=y
-CONFIG_MALI_BIFROST_FOR_LINUX=y
 CONFIG_FB_MODE_HELPERS=y
 CONFIG_BACKLIGHT_LCD_SUPPORT=y
 # CONFIG_LCD_CLASS_DEVICE is not set
diff --git a/arch/arm64/configs/px30_linux_defconfig b/arch/arm64/configs/px30_linux_defconfig
index a8ebc6b72af8..537c6db800b6 100644
--- a/arch/arm64/configs/px30_linux_defconfig
+++ b/arch/arm64/configs/px30_linux_defconfig
@@ -313,7 +313,6 @@ CONFIG_ROCKCHIP_LVDS=y
 CONFIG_ROCKCHIP_DRM_TVE=y
 CONFIG_DRM_PANEL_SIMPLE=y
 CONFIG_MALI_PWRSOFT_765=y
-CONFIG_MALI_BIFROST_FOR_LINUX=y
 CONFIG_MALI_BIFROST=y
 CONFIG_MALI_BIFROST_DEVFREQ=y
 CONFIG_MALI_PLATFORM_NAME="rk"
diff --git a/arch/arm64/configs/px30_linux_robot_defconfig b/arch/arm64/configs/px30_linux_robot_defconfig
index 3cd6a9bcd67c..21d55a7706ca 100644
--- a/arch/arm64/configs/px30_linux_robot_defconfig
+++ b/arch/arm64/configs/px30_linux_robot_defconfig
@@ -191,7 +191,6 @@ CONFIG_VIDEO_GC2155=y
 # CONFIG_DVB_TUNER_DIB0070 is not set
 # CONFIG_DVB_TUNER_DIB0090 is not set
 CONFIG_MALI_PWRSOFT_765=y
-CONFIG_MALI_BIFROST_FOR_LINUX=y
 CONFIG_MALI_BIFROST=y
 CONFIG_MALI_BIFROST_DEVFREQ=y
 CONFIG_MALI_PLATFORM_NAME="rk"
diff --git a/arch/arm64/configs/rk3326_linux_defconfig b/arch/arm64/configs/rk3326_linux_defconfig
index b25b67751d05..682969aa2b60 100644
--- a/arch/arm64/configs/rk3326_linux_defconfig
+++ b/arch/arm64/configs/rk3326_linux_defconfig
@@ -268,7 +268,6 @@ CONFIG_ROCKCHIP_LVDS=y
 CONFIG_ROCKCHIP_DRM_TVE=y
 CONFIG_DRM_PANEL_SIMPLE=y
 CONFIG_MALI_PWRSOFT_765=y
-CONFIG_MALI_BIFROST_FOR_LINUX=y
 CONFIG_MALI_BIFROST=y
 CONFIG_MALI_BIFROST_DEVFREQ=y
 CONFIG_MALI_PLATFORM_NAME="rk"
diff --git a/arch/arm64/configs/rk3326_linux_robot_defconfig b/arch/arm64/configs/rk3326_linux_robot_defconfig
index 3cd6a9bcd67c..21d55a7706ca 100644
--- a/arch/arm64/configs/rk3326_linux_robot_defconfig
+++ b/arch/arm64/configs/rk3326_linux_robot_defconfig
@@ -191,7 +191,6 @@ CONFIG_VIDEO_GC2155=y
 # CONFIG_DVB_TUNER_DIB0070 is not set
 # CONFIG_DVB_TUNER_DIB0090 is not set
 CONFIG_MALI_PWRSOFT_765=y
-CONFIG_MALI_BIFROST_FOR_LINUX=y
 CONFIG_MALI_BIFROST=y
 CONFIG_MALI_BIFROST_DEVFREQ=y
 CONFIG_MALI_PLATFORM_NAME="rk"

commit fedf4bcc701e60531fd67f4914aa6439d6b97e12
Author: Zhen Chen <chenzhen@rock-chips.com>
Date:   Mon Sep 13 11:33:15 2021 +0800

    MALI: remove MALI_MIDGARD_FOR_ANDROID and MALI_MIDGARD_FOR_LINUX
    
    Because they are no longer useful,
    after rk3288/rk3399 Android and Linux device
    use the same midgard_device_driver "drivers/gpu/arm/midgard".
    
    Change-Id: I7ccc3c99fdfdde5a0ea12a7f3e1931fd5f1ce4cb
    Signed-off-by: Zhen Chen <chenzhen@rock-chips.com>

diff --git a/drivers/gpu/arm/Kbuild b/drivers/gpu/arm/Kbuild
index b3466f167d8e..2622f2941a64 100644
--- a/drivers/gpu/arm/Kbuild
+++ b/drivers/gpu/arm/Kbuild
@@ -19,10 +19,7 @@
 #
 #
 
-
-# obj-$(CONFIG_MALI_MIDGARD_FOR_LINUX) += midgard_for_linux/
-
-obj-$(CONFIG_MALI_MIDGARD_FOR_ANDROID) += midgard/
+obj-$(CONFIG_MALI_MIDGARD) += midgard/
 
 obj-$(CONFIG_MALI400)      += mali400/
 
diff --git a/drivers/gpu/arm/Kconfig b/drivers/gpu/arm/Kconfig
index 599711c18af9..d6211e33276c 100644
--- a/drivers/gpu/arm/Kconfig
+++ b/drivers/gpu/arm/Kconfig
@@ -21,17 +21,6 @@
 #
 source "drivers/gpu/arm/mali400/mali/Kconfig"
 
-choice
-	prompt "Mali Midgard driver"
-
-config MALI_MIDGARD_FOR_ANDROID
-	bool "Mali Midgard for Android"
-
-config MALI_MIDGARD_FOR_LINUX
-	bool "Mali Midgard for Linux only"
-
-endchoice
-
 source "drivers/gpu/arm/midgard/Kconfig"
 
 choice

commit 0d9ef4a3253a338f57f0a5bc13f8634f79b60ceb
Author: Jianwei Fan <jianwei.fan@rock-chips.com>
Date:   Thu Sep 9 12:42:20 2021 +0000

    arm64: dts: rockchip: rk3399-evb-ind-lpddr4-android-avb: add tc35874x
    configuration
    
    Signed-off-by: Jianwei Fan <jianwei.fan@rock-chips.com>
    Change-Id: Ib3e274017f3a971b5fb301c81e3ade43141af1d3

diff --git a/arch/arm64/boot/dts/rockchip/rk3399-evb-ind-lpddr4-android-avb.dts b/arch/arm64/boot/dts/rockchip/rk3399-evb-ind-lpddr4-android-avb.dts
index 343a9fc389e1..c68644d7b358 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-evb-ind-lpddr4-android-avb.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3399-evb-ind-lpddr4-android-avb.dts
@@ -31,6 +31,13 @@
 		vin-supply = <&vcc5v0_sys>;
 	};
 
+	ext_cam_clk: external-camera-clock {
+		compatible = "fixed-clock";
+		clock-frequency = <27000000>;
+		clock-output-names = "CLK_CAMERA_27MHZ";
+		#clock-cells = <0>;
+	};
+
 	panel: panel {
 		compatible = "simple-panel";
 		backlight = <&backlight>;
@@ -221,6 +228,35 @@
 			};
 		};
 	};
+
+	/delete-node/ tc358749x@0f;
+
+	tc35874x: tc35874x@0f {
+		status = "disabled";
+		reg = <0x0f>;
+		compatible = "toshiba,tc358749";
+		clocks = <&ext_cam_clk>;
+		clock-names = "refclk";
+		reset-gpios = <&gpio0 2 GPIO_ACTIVE_LOW>;
+		/* interrupt-parent = <&gpio2>; */
+		/* interrupts = <12 IRQ_TYPE_LEVEL_HIGH>; */
+		pinctrl-names = "default";
+		pinctrl-0 = <&tc35874x_gpios>;
+		rockchip,camera-module-index = <0>;
+		rockchip,camera-module-facing = "back";
+		rockchip,camera-module-name = "TC358749XBG";
+		rockchip,camera-module-lens-name = "NC";
+
+		port {
+			hdmiin_out0: endpoint {
+				remote-endpoint = <&hdmi_to_mipi_in>;
+				data-lanes = <1 2 3 4>;
+				clock-noncontinuous;
+				link-frequencies =
+					/bits/ 64 <297000000>;
+			};
+		};
+	};
 };
 
 &i2s2 {
@@ -280,6 +316,11 @@
 			#address-cells = <1>;
 			#size-cells = <0>;
 
+			hdmi_to_mipi_in: endpoint@0 {
+				reg = <0>;
+				remote-endpoint = <&hdmiin_out0>;
+				data-lanes = <1 2 3 4>;
+			};
 			mipi_in_ucam1: endpoint@1 {
 				reg = <1>;
 				remote-endpoint = <&ucam_out1>;
@@ -380,6 +421,19 @@
 };
 
 &pinctrl {
+	hdmiin {
+		tc35874x_gpios: tc35874x_gpios {
+			rockchip,pins =
+				/* PWREN_3.3 */
+				<0 RK_PB5 RK_FUNC_GPIO &pcfg_output_high>,
+				/* HDMIIN_RST */
+				<0 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>,
+				/* HDMIIN_STBY */
+				<3 RK_PD1 RK_FUNC_GPIO &pcfg_output_high>,
+				/* HDMIIN_INT */
+				<4 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
 	lcd-panel {
 		lcd_panel_reset: lcd-panel-reset {
 			rockchip,pins = <1 RK_PC7 RK_FUNC_GPIO &pcfg_pull_up>;

commit 1bc3ec16fd8a681f4663068783281c915e5cabf2
Author: Jianwei Fan <jianwei.fan@rock-chips.com>
Date:   Sat Sep 18 09:42:05 2021 +0000

    arm64: dts: rockchip: rk3399-evb-ind-lpddr4-v13-android-avb: add
    tc35874x configuration
    
    Signed-off-by: Jianwei Fan <jianwei.fan@rock-chips.com>
    Change-Id: Ia8e5c19ae4d37e0c7e16f8f149c17716e9f54d2d

diff --git a/arch/arm64/boot/dts/rockchip/rk3399-evb-ind-lpddr4-v13-android-avb.dts b/arch/arm64/boot/dts/rockchip/rk3399-evb-ind-lpddr4-v13-android-avb.dts
index 8439d91dd125..67975128357b 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-evb-ind-lpddr4-v13-android-avb.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3399-evb-ind-lpddr4-v13-android-avb.dts
@@ -42,6 +42,13 @@
 		vin-supply = <&vcc5v0_sys>;
 	};
 
+	ext_cam_clk: external-camera-clock {
+		compatible = "fixed-clock";
+		clock-frequency = <27000000>;
+		clock-output-names = "CLK_CAMERA_27MHZ";
+		#clock-cells = <0>;
+	};
+
 	panel: panel {
 		compatible = "simple-panel";
 		backlight = <&backlight>;
@@ -232,6 +239,35 @@
 			};
 		};
 	};
+
+	/delete-node/ tc358749x@0f;
+
+	tc35874x: tc35874x@0f {
+		status = "disabled";
+		reg = <0x0f>;
+		compatible = "toshiba,tc358749";
+		clocks = <&ext_cam_clk>;
+		clock-names = "refclk";
+		reset-gpios = <&gpio0 2 GPIO_ACTIVE_LOW>;
+		/* interrupt-parent = <&gpio2>; */
+		/* interrupts = <12 IRQ_TYPE_LEVEL_HIGH>; */
+		pinctrl-names = "default";
+		pinctrl-0 = <&tc35874x_gpios>;
+		rockchip,camera-module-index = <0>;
+		rockchip,camera-module-facing = "back";
+		rockchip,camera-module-name = "TC358749XBG";
+		rockchip,camera-module-lens-name = "NC";
+
+		port {
+			hdmiin_out0: endpoint {
+				remote-endpoint = <&hdmi_to_mipi_in>;
+				data-lanes = <1 2 3 4>;
+				clock-noncontinuous;
+				link-frequencies =
+					/bits/ 64 <297000000>;
+			};
+		};
+	};
 };
 
 &i2s2 {
@@ -291,6 +327,11 @@
 			#address-cells = <1>;
 			#size-cells = <0>;
 
+			hdmi_to_mipi_in: endpoint@0 {
+				reg = <0>;
+				remote-endpoint = <&hdmiin_out0>;
+				data-lanes = <1 2 3 4>;
+			};
 			mipi_in_ucam1: endpoint@1 {
 				reg = <1>;
 				remote-endpoint = <&ucam_out1>;
@@ -416,6 +457,19 @@
 };
 
 &pinctrl {
+	hdmiin {
+		tc35874x_gpios: tc35874x_gpios {
+			rockchip,pins =
+				/* PWREN_3.3 */
+				<0 RK_PB5 RK_FUNC_GPIO &pcfg_output_high>,
+				/* HDMIIN_RST */
+				<0 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>,
+				/* HDMIIN_STBY */
+				<3 RK_PD1 RK_FUNC_GPIO &pcfg_output_high>,
+				/* HDMIIN_INT */
+				<4 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
 	lcd-panel {
 		lcd_panel_reset: lcd-panel-reset {
 			rockchip,pins = <1 RK_PC7 RK_FUNC_GPIO &pcfg_pull_up>;

commit d0444258a7d89ed2b755b0b6aa81b74d70c688c5
Author: Shunhua Lan <lsh@rock-chips.com>
Date:   Sat Sep 18 07:55:53 2021 +0000

    pinctrl: rockchip: add i2sx_sclk_rx/i2sx_sclk_tx mux route for rk3568
    
    Change-Id: I35525224a39ce45962bfb1559b5002eb841ddd00
    Signed-off-by: Shunhua Lan <lsh@rock-chips.com>

diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
index 871c49ef0c2a..7d2c6dac8bc3 100644
--- a/drivers/pinctrl/pinctrl-rockchip.c
+++ b/drivers/pinctrl/pinctrl-rockchip.c
@@ -1047,12 +1047,24 @@ static struct rockchip_mux_route_data rk3568_mux_route_data[] = {
 	RK_MUXROUTE_GRF(4, RK_PC5, 4, 0x0310, WRITE_MASK_VAL(9, 8, 1)), /* UART9 IO mux M1 */
 	RK_MUXROUTE_GRF(4, RK_PA4, 4, 0x0310, WRITE_MASK_VAL(9, 8, 2)), /* UART9 IO mux M2 */
 	RK_MUXROUTE_GRF(1, RK_PA2, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1 IO mux M0 */
+	RK_MUXROUTE_GRF(1, RK_PA3, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1 IO mux sclk tx M0 */
+	RK_MUXROUTE_GRF(1, RK_PA4, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1 IO mux sclk rx M0 */
 	RK_MUXROUTE_GRF(3, RK_PC6, 4, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1 IO mux M1 */
+	RK_MUXROUTE_GRF(3, RK_PC7, 4, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1 IO mux sclk tx M1 */
+	RK_MUXROUTE_GRF(4, RK_PA6, 5, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1 IO mux sclk rx M1 */
 	RK_MUXROUTE_GRF(2, RK_PD0, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1 IO mux M2 */
+	RK_MUXROUTE_GRF(2, RK_PD1, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1 IO mux sclk tx M2 */
+	RK_MUXROUTE_GRF(3, RK_PC3, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1 IO mux sclk rx M2 */
 	RK_MUXROUTE_GRF(2, RK_PC1, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2 IO mux M0 */
+	RK_MUXROUTE_GRF(2, RK_PC2, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2 IO mux sclk tx M0 */
+	RK_MUXROUTE_GRF(2, RK_PB7, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2 IO mux sclk rx M0 */
 	RK_MUXROUTE_GRF(4, RK_PB6, 5, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S2 IO mux M1 */
+	RK_MUXROUTE_GRF(4, RK_PB7, 4, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S1 IO mux sclk tx M1 */
+	RK_MUXROUTE_GRF(4, RK_PC1, 5, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S1 IO mux sclk rx M1 */
 	RK_MUXROUTE_GRF(3, RK_PA2, 4, 0x0310, WRITE_MASK_VAL(14, 14, 0)), /* I2S3 IO mux M0 */
+	RK_MUXROUTE_GRF(3, RK_PA3, 4, 0x0310, WRITE_MASK_VAL(14, 14, 0)), /* I2S3 IO mux sclk M0 */
 	RK_MUXROUTE_GRF(4, RK_PC2, 5, 0x0310, WRITE_MASK_VAL(14, 14, 1)), /* I2S3 IO mux M1 */
+	RK_MUXROUTE_GRF(4, RK_PC3, 5, 0x0310, WRITE_MASK_VAL(14, 14, 1)), /* I2S3 IO mux sclk M1 */
 	RK_MUXROUTE_GRF(1, RK_PA4, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO mux M0 */
 	RK_MUXROUTE_GRF(1, RK_PA6, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO mux M0 */
 	RK_MUXROUTE_GRF(3, RK_PD6, 5, 0x0314, WRITE_MASK_VAL(1, 0, 1)), /* PDM IO mux M1 */

commit aab3af8ad0c3f70578145d5fc7488cc2f071e709
Author: David Wu <david.wu@rock-chips.com>
Date:   Fri Sep 17 15:28:28 2021 +0800

    net: ethernet: stmmac: dwmac-rk: Add config option for dwmac-rk-tool
    
    Add this config option to reduce memory usage, if it was not necessary.
    
    ./ksize.sh drivers/net/ethernet/stmicro/
    
    before size: 105216 Bytes
    after  size: 94474  Bytes
    save   size: 10742  Bytes
    
    Signed-off-by: David Wu <david.wu@rock-chips.com>
    Change-Id: I96c88d5eb5109fc956a85b8685e1746d76545a87

diff --git a/drivers/net/ethernet/stmicro/stmmac/Kconfig b/drivers/net/ethernet/stmicro/stmmac/Kconfig
index 324049eebb9b..ebf3ac900084 100644
--- a/drivers/net/ethernet/stmicro/stmmac/Kconfig
+++ b/drivers/net/ethernet/stmicro/stmmac/Kconfig
@@ -108,6 +108,16 @@ config DWMAC_ROCKCHIP
 	  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/drivers/net/ethernet/stmicro/stmmac/Makefile b/drivers/net/ethernet/stmicro/stmmac/Makefile
index 2a3afda51f95..5e1746960132 100644
--- a/drivers/net/ethernet/stmicro/stmmac/Makefile
+++ b/drivers/net/ethernet/stmicro/stmmac/Makefile
@@ -16,7 +16,8 @@ obj-$(CONFIG_DWMAC_LPC18XX)	+= dwmac-lpc18xx.o
 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_DWMAC_SOCFPGA)	+= dwmac-altr-socfpga.o
 obj-$(CONFIG_DWMAC_STI)		+= dwmac-sti.o
 obj-$(CONFIG_DWMAC_STM32)	+= dwmac-stm32.o
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.h b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.h
index d71989b0fc74..5fc7a1b1095f 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.h
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.h
@@ -13,8 +13,20 @@ void dwmac_rk_set_rgmii_delayline(struct stmmac_priv *priv, int tx_delay, int rx
 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 @@ int dwmac_rk_search_rgmii_delayline(struct stmmac_priv *priv);
 #endif
 
 #endif /* __DWMAC_RK_TOOL_H__ */
-

commit c66b7345f611c814759900bd5b9bf087be5f064d
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Sat Sep 18 10:19:18 2021 +0800

    drm/rockchip: vop: fix alpha mode error for vop lite
    
    1. vop lite can't support pixel-alpha + scale and can support global
    alpha + scale;
    2. global alpha must be non-premul alpha mode;
    3. vop lite and vop full premul alpha config bit is reversed;
    4. vop full add premul and non-premul config from userspace;
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: Ic42892eac39f07a41d46ed1a77398862f37894c0

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index a0d0cd4c1c1b..fc41d9dd9428 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -1894,6 +1894,7 @@ static void vop_plane_atomic_update(struct drm_plane *plane,
 	if ((is_alpha_support(fb->format->format) || global_alpha_en) &&
 	    (s->dsp_layer_sel & 0x3) != win->win_id) {
 		int src_blend_m0;
+		int pre_multi_alpha = ALPHA_SRC_PRE_MUL;
 
 		if (is_alpha_support(fb->format->format) && global_alpha_en)
 			src_blend_m0 = ALPHA_PER_PIX_GLOBAL;
@@ -1902,18 +1903,21 @@ static void vop_plane_atomic_update(struct drm_plane *plane,
 		else
 			src_blend_m0 = ALPHA_GLOBAL;
 
+
+		if (vop_plane_state->blend_mode == 0 || src_blend_m0 == ALPHA_GLOBAL)
+			pre_multi_alpha = ALPHA_SRC_NO_PRE_MUL;
+
 		VOP_WIN_SET(vop, win, dst_alpha_ctl,
 			    DST_FACTOR_M0(ALPHA_SRC_INVERSE));
-		val = SRC_ALPHA_EN(1) | SRC_COLOR_M0(ALPHA_SRC_PRE_MUL) |
+		val = SRC_ALPHA_EN(1) | SRC_COLOR_M0(pre_multi_alpha) |
 			SRC_ALPHA_M0(ALPHA_STRAIGHT) |
 			SRC_BLEND_M0(src_blend_m0) |
 			SRC_ALPHA_CAL_M0(ALPHA_SATURATION) |
 			SRC_FACTOR_M0(global_alpha_en ?
 				      ALPHA_SRC_GLOBAL : ALPHA_ONE);
 		VOP_WIN_SET(vop, win, src_alpha_ctl, val);
-		VOP_WIN_SET(vop, win, alpha_pre_mul,
-			    vop_plane_state->blend_mode);
-		VOP_WIN_SET(vop, win, alpha_mode, 1);
+		VOP_WIN_SET(vop, win, alpha_pre_mul, !pre_multi_alpha); /* VOP lite only */
+		VOP_WIN_SET(vop, win, alpha_mode, src_blend_m0); /* VOP lite only */
 		VOP_WIN_SET(vop, win, alpha_en, 1);
 	} else {
 		VOP_WIN_SET(vop, win, src_alpha_ctl, SRC_ALPHA_EN(0));

commit 9efdeb1c2a5414f41871b8fdcad92d1dd4458762
Author: Caesar Wang <wxt@rock-chips.com>
Date:   Fri Sep 17 11:14:42 2021 +0800

    arm64: dts: rockchip: fixes ramoops for rk3399-linux.dtsi
    
    This patch fixes the ramoops right register for kernel.
    
    check the '/sys/fs/pstore/console-ramoops-0' after the reboot system.
    
    Signed-off-by: Caesar Wang <wxt@rock-chips.com>
    Change-Id: I345ca0b497031c5d18c2b10eb661efe39a4b3025

diff --git a/arch/arm64/boot/dts/rockchip/rk3399-linux.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-linux.dtsi
index 0549701d615e..bbe1eed20c5e 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-linux.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399-linux.dtsi
@@ -60,21 +60,16 @@
 			reg = <0x0 0x0 0x0 0x0>;
 		};
 
-		ramoops_mem: region@110000 {
+		ramoops: ramoops@110000 {
+			compatible = "ramoops";
 			reg = <0x0 0x110000 0x0 0xf0000>;
-			reg-names = "ramoops_mem";
+			record-size = <0x20000>;
+			console-size = <0x80000>;
+			ftrace-size = <0x00000>;
+			pmsg-size = <0x50000>;
 		};
 	};
 
-	ramoops: ramoops {
-		compatible = "ramoops";
-		record-size = <0x0 0x40000>;
-		console-size = <0x0 0x80000>;
-		ftrace-size = <0x0 0x00000>;
-		pmsg-size = <0x0 0x00000>;
-		memory-region = <&ramoops_mem>;
-	};
-
 	fiq_debugger: fiq-debugger {
 		compatible = "rockchip,fiq-debugger";
 		rockchip,serial-id = <2>;

commit 54614e8ea689de2b48747bc387c7a37812a84fe8
Author: Algea Cao <algea.cao@rock-chips.com>
Date:   Fri Sep 17 15:43:50 2021 +0800

    drm/rockchip: dw_hdmi: set capacity properties immutable
    
    Signed-off-by: Algea Cao <algea.cao@rock-chips.com>
    Change-Id: Ia9774706b9647217c4065ade3f1a9f21e46edccc

diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
index cac7d614e756..e7a6cb09b9ce 100644
--- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
+++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
@@ -1098,7 +1098,7 @@ dw_hdmi_rockchip_attach_properties(struct drm_connector *connector,
 		drm_object_attach_property(&connector->base, prop, 0);
 	}
 
-	prop = drm_property_create_range(connector->dev, 0,
+	prop = drm_property_create_range(connector->dev, DRM_MODE_PROP_IMMUTABLE,
 					 "hdmi_color_depth_capacity",
 					 0, 0xff);
 	if (prop) {
@@ -1106,7 +1106,7 @@ dw_hdmi_rockchip_attach_properties(struct drm_connector *connector,
 		drm_object_attach_property(&connector->base, prop, 0);
 	}
 
-	prop = drm_property_create_range(connector->dev, 0,
+	prop = drm_property_create_range(connector->dev, DRM_MODE_PROP_IMMUTABLE,
 					 "hdmi_output_mode_capacity",
 					 0, 0xf);
 	if (prop) {
@@ -1142,7 +1142,7 @@ dw_hdmi_rockchip_attach_properties(struct drm_connector *connector,
 		drm_object_attach_property(&connector->base, prop, 0);
 	}
 
-	prop = drm_property_create_enum(connector->dev, 0,
+	prop = drm_property_create_enum(connector->dev, DRM_MODE_PROP_IMMUTABLE,
 					 "output_type_capacity",
 					 output_type_cap_list,
 					 ARRAY_SIZE(output_type_cap_list));

commit 6fa47f3ec27add71156c390e82552878d9b090f8
Author: Caesar Wang <wxt@rock-chips.com>
Date:   Fri Sep 17 09:13:30 2021 +0800

    arm64/configs: update rockchip_lnux_defconfig
    
    1) Enable LT6911UXC and LT8619C
    
        Enable lt6911uxc HDMI to MIPI CSI-2 bridge driver for hdmi-in
    application. Which found on rk3568-evb2-lp4x-v10.
    Enable lt8619c HDMI to BT656/BT1120 bridge driver for hdmi-in
    application. Which found on rk3568-evb6-ddr3-v10.
    
    2) Enable CONFIG_DEVFREQ_EVENT_ROCKCHIP_NOCP
    
        This add the devfreq-event driver for Rockchip SoC. It provides NoC
    (Network on Chip) Probe counters to monitor traffic statistics.
    
    Signed-off-by: Caesar Wang <wxt@rock-chips.com>
    Change-Id: I7d4e50329ff9576f5e16599b04c6b7af37d5d306

diff --git a/arch/arm64/configs/rockchip_linux_defconfig b/arch/arm64/configs/rockchip_linux_defconfig
index deccc57d509f..f538e125ff1a 100644
--- a/arch/arm64/configs/rockchip_linux_defconfig
+++ b/arch/arm64/configs/rockchip_linux_defconfig
@@ -307,6 +307,8 @@ CONFIG_VIDEO_ROCKCHIP_RGA=y
 # CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set
 CONFIG_VIDEO_TC35874X=y
 CONFIG_VIDEO_RK628_CSI=y
+CONFIG_VIDEO_LT6911UXC=y
+CONFIG_VIDEO_LT8619C=y
 CONFIG_VIDEO_OS04A10=y
 CONFIG_VIDEO_OV4689=y
 CONFIG_VIDEO_OV5695=y
@@ -481,6 +483,7 @@ CONFIG_DEVFREQ_GOV_USERSPACE=y
 CONFIG_ARM_ROCKCHIP_BUS_DEVFREQ=y
 CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ=y
 CONFIG_ARM_ROCKCHIP_DMC_DEBUG=y
+CONFIG_DEVFREQ_EVENT_ROCKCHIP_NOCP=y
 CONFIG_MEMORY=y
 CONFIG_IIO=y
 CONFIG_IIO_BUFFER=y

commit 709c17f34187e722f9a0622df68972f75fbea264
Author: Fenrir Lin <fenrir.lin@rock-chips.com>
Date:   Thu Sep 16 19:19:13 2021 +0800

    ARM: dts: rockchip: add rv1126-bat-evb-v11.dts
    
    Signed-off-by: Fenrir Lin <fenrir.lin@rock-chips.com>
    Change-Id: I33365b97e74ff35d26a16861b6c81ab07f3e0f54

diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
index 6a757bdb9c2d..61f51d5419c3 100644
--- a/arch/arm/boot/dts/Makefile
+++ b/arch/arm/boot/dts/Makefile
@@ -855,6 +855,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += \
 	rv1126-ai-cam-ddr3-v1-spi-nand.dtb \
 	rv1126-ai-cam-plus.dtb \
 	rv1126-bat-evb-v10.dtb \
+	rv1126-bat-evb-v11.dtb \
 	rv1126-bat-ipc-v10.dtb \
 	rv1126-bat-ipc-4k-v10.dtb \
 	rv1126-dictionary-pen-v11.dtb \
diff --git a/arch/arm/boot/dts/rv1126-bat-evb-v10.dtsi b/arch/arm/boot/dts/rv1126-bat-evb-v10.dtsi
index 4fbf6b69abfd..3740e35fb8a4 100644
--- a/arch/arm/boot/dts/rv1126-bat-evb-v10.dtsi
+++ b/arch/arm/boot/dts/rv1126-bat-evb-v10.dtsi
@@ -180,7 +180,7 @@
 		regulator-boot-on;
 	};
 
-	wireless-wlan {
+	wireless_wlan: wireless-wlan {
 		compatible = "wlan-platdata";
 		rockchip,grf = <&grf>;
 		pinctrl-names = "default";
diff --git a/arch/arm/boot/dts/rv1126-bat-evb-v11.dts b/arch/arm/boot/dts/rv1126-bat-evb-v11.dts
new file mode 100644
index 000000000000..b858b2d80b13
--- /dev/null
+++ b/arch/arm/boot/dts/rv1126-bat-evb-v11.dts
@@ -0,0 +1,92 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
+ */
+
+/dts-v1/;
+#include "rv1126-bat-evb-v10.dtsi"
+
+/ {
+	model = "Rockchip RV1126 BAT EVB V11 Board";
+	compatible = "rockchip,rv1126-bat-evb-v11", "rockchip,rv1126";
+
+	/delete-node/ i2s0-sound;
+
+	es7202_sound: es7202-sound {
+		status = "okay";
+		compatible = "simple-audio-card";
+		simple-audio-card,format = "pdm";
+		simple-audio-card,mclk-fs = <256>;
+		simple-audio-card,name = "rockchip,es7202-sound";
+		simple-audio-card,cpu {
+			sound-dai = <&pdm>;
+		};
+		simple-audio-card,codec {
+			sound-dai = <&es7202>;
+		};
+	};
+
+	rkacdc_dig_sound: rkacdc-dig-sound {
+		status = "okay";
+		compatible = "simple-audio-card";
+		simple-audio-card,format = "i2s";
+		simple-audio-card,mclk-fs = <256>;
+		simple-audio-card,name = "rockchip,acdc-dig-sound";
+		simple-audio-card,bitclock-master = <&sndcodec>;
+		simple-audio-card,frame-master = <&sndcodec>;
+		sndcpu: simple-audio-card,cpu {
+			sound-dai = <&i2s0_8ch>;
+		};
+		sndcodec: simple-audio-card,codec {
+			sound-dai = <&rkacdc_dig>;
+		};
+	};
+};
+
+&i2s0_8ch {
+	status = "okay";
+	#sound-dai-cells = <0>;
+	/delete-property/ pinctrl-names;
+	/delete-property/ pinctrl-0;
+};
+
+&i2c4 {
+	status = "okay";
+	pinctrl-0 = <&i2c4m0_xfer>;
+	/delete-node/ es8311@18;
+
+	es7202: es7202@30 {
+		status = "okay";
+		#sound-dai-cells = <0>;
+		compatible = "ES7202_PDM_ADC_1";
+		reg = <0x30>;
+	};
+};
+
+&i2c5 {
+	status = "disabled";
+	/delete-node/ CW2015@62;
+};
+
+&rkacdc_dig {
+	status = "okay";
+	#sound-dai-cells = <0>;
+	pinctrl-names = "default";
+	pinctrl-0 = <&auddsm_pins>;
+	rockchip,pwm-output-mode;
+	rockchip,clk-sync-mode;
+	rockchip,pa-ctl-mdelay = <200>;
+	pa-ctl-gpios = <&gpio2 RK_PA4 GPIO_ACTIVE_HIGH>;
+};
+
+&pdm {
+	status = "okay";
+	#sound-dai-cells = <0>;
+	pinctrl-names = "default";
+	pinctrl-0 = <&pdmm0_clk &pdmm0_sdi3>;
+	rockchip,path-map = <3 0 1 2>;
+};
+
+&wireless_wlan {
+	wifi_chip_type = "ap6203";
+};

commit e70299d6e812f5ef5e37e851f2a0e5bd2e365df2
Author: Liang Chen <cl@rock-chips.com>
Date:   Fri Sep 10 09:19:53 2021 +0800

    soc: rockchip: add depends for config ROCKCHIP_SCHED_PERFORMANCE_BIAS
    
    CONFIG_ROCKCHIP_SCHED_PERFORMANCE_BIAS depends on CONFIG_SMP and
    CONFIG_CPU_FREQ_GOV_INTERACTIVE.
    
    Change-Id: I6b564b1693e225ff6310f2dc8c8adabfb509cae9
    Signed-off-by: Liang Chen <cl@rock-chips.com>

diff --git a/drivers/soc/rockchip/Kconfig b/drivers/soc/rockchip/Kconfig
index 7c9e7e768928..b7c1bf17f436 100644
--- a/drivers/soc/rockchip/Kconfig
+++ b/drivers/soc/rockchip/Kconfig
@@ -148,6 +148,7 @@ config ROCKCHIP_THUNDER_BOOT_CRYPTO
 
 config ROCKCHIP_SCHED_PERFORMANCE_BIAS
 	bool "Rockchip task scheduler optimization"
+	depends on SMP && CPU_FREQ_GOV_INTERACTIVE
 	default y
 	help
 	  Say y here to enable rockchip optimize task scheduler for performance bias,

commit 2e6dc356c9759cb7436f72de6a58ceeecb40df0f
Author: Yu Qiaowei <cerf.yu@rock-chips.com>
Date:   Fri Sep 17 11:20:24 2021 +0800

    video/rockchip: rga2: Added support for ARGB format
    
    Add ARGB8888/XRGB8888/ARGB5551/ARGB4444/ABGR8888/XBGR8888/ABGR5551/ABGR4444.
    
    Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
    Change-Id: I9eb8f5fbcc1a87a5750b7dc2eaf808f8395856a0

diff --git a/drivers/video/rockchip/rga2/rga2.h b/drivers/video/rockchip/rga2/rga2.h
index 68268bb461c1..335970c44ed6 100644
--- a/drivers/video/rockchip/rga2/rga2.h
+++ b/drivers/video/rockchip/rga2/rga2.h
@@ -124,7 +124,16 @@ enum
 	RGA2_FORMAT_BPP_1            = 0x24,
 	RGA2_FORMAT_BPP_2            = 0x25,
 	RGA2_FORMAT_BPP_4            = 0x26,
-	RGA2_FORMAT_BPP_8            = 0x27
+	RGA2_FORMAT_BPP_8            = 0x27,
+
+	RGA2_FORMAT_ARGB_8888    = 0x28,
+	RGA2_FORMAT_XRGB_8888    = 0x29,
+	RGA2_FORMAT_ARGB_5551    = 0x2a,
+	RGA2_FORMAT_ARGB_4444    = 0x2b,
+	RGA2_FORMAT_ABGR_8888    = 0x2c,
+	RGA2_FORMAT_XBGR_8888    = 0x2d,
+	RGA2_FORMAT_ABGR_5551    = 0x2e,
+	RGA2_FORMAT_ABGR_4444    = 0x2f,
 };
 
 typedef struct mdp_img
@@ -316,7 +325,7 @@ typedef struct rga_img_info_t
     unsigned short vir_h;
 
     unsigned short endian_mode; //for BPP
-    unsigned short alpha_swap;
+    unsigned short alpha_swap;    /* not use */
 }
 rga_img_info_t;
 
@@ -584,7 +593,7 @@ struct rga2_req
     u8 alpha_zero_key;
     u8 src_trans_mode;
 
-    u8 alpha_swp;
+    u8 alpha_swp;           /* not use */
     u8 dither_mode;
 
     u8 rgb2yuv_mode;
diff --git a/drivers/video/rockchip/rga2/rga2_drv.c b/drivers/video/rockchip/rga2/rga2_drv.c
index 15064e7615fb..3d7891306272 100644
--- a/drivers/video/rockchip/rga2/rga2_drv.c
+++ b/drivers/video/rockchip/rga2/rga2_drv.c
@@ -247,6 +247,23 @@ static const char *rga2_get_format_name(uint32_t format)
 	case RGA2_FORMAT_BGRA_4444:
 		return "BGRA4444";
 
+	case RGA2_FORMAT_ARGB_8888:
+		return "ARGB8888";
+	case RGA2_FORMAT_XRGB_8888:
+		return "XBGR8888";
+	case RGA2_FORMAT_ARGB_5551:
+		return "ARGB5551";
+	case RGA2_FORMAT_ARGB_4444:
+		return "ARGB4444";
+	case RGA2_FORMAT_ABGR_8888:
+		return "ABGR8888";
+	case RGA2_FORMAT_XBGR_8888:
+		return "XBGR8888";
+	case RGA2_FORMAT_ABGR_5551:
+		return "ABGR5551";
+	case RGA2_FORMAT_ABGR_4444:
+		return "ABGR4444";
+
 	case RGA2_FORMAT_YCbCr_422_SP:
 		return "YCbCr422SP";
 	case RGA2_FORMAT_YCbCr_422_P:
diff --git a/drivers/video/rockchip/rga2/rga2_mmu_info.c b/drivers/video/rockchip/rga2/rga2_mmu_info.c
index 6f38719f7242..af97f7a93998 100644
--- a/drivers/video/rockchip/rga2/rga2_mmu_info.c
+++ b/drivers/video/rockchip/rga2/rga2_mmu_info.c
@@ -151,6 +151,10 @@ static int rga2_memory_check(void *vaddr, u32 w, u32 h, u32 format, int fd)
 	case RGA2_FORMAT_RGBX_8888:
 	case RGA2_FORMAT_BGRA_8888:
 	case RGA2_FORMAT_BGRX_8888:
+	case RGA2_FORMAT_ARGB_8888:
+	case RGA2_FORMAT_XRGB_8888:
+	case RGA2_FORMAT_ABGR_8888:
+	case RGA2_FORMAT_XBGR_8888:
 		bits = 32;
 		break;
 	case RGA2_FORMAT_RGB_888:
@@ -167,6 +171,10 @@ static int rga2_memory_check(void *vaddr, u32 w, u32 h, u32 format, int fd)
 	case RGA2_FORMAT_YCrCb_422_P:
 	case RGA2_FORMAT_BGRA_5551:
 	case RGA2_FORMAT_BGRA_4444:
+	case RGA2_FORMAT_ARGB_5551:
+	case RGA2_FORMAT_ARGB_4444:
+	case RGA2_FORMAT_ABGR_5551:
+	case RGA2_FORMAT_ABGR_4444:
 		bits = 16;
 		break;
 	case RGA2_FORMAT_YCbCr_420_SP:
@@ -619,6 +627,10 @@ static int rga2_buf_size_cal(unsigned long yrgb_addr, unsigned long uv_addr, uns
         case RGA2_FORMAT_RGBX_8888 :
         case RGA2_FORMAT_BGRA_8888 :
         case RGA2_FORMAT_BGRX_8888 :
+        case RGA2_FORMAT_ARGB_8888 :
+        case RGA2_FORMAT_XRGB_8888 :
+        case RGA2_FORMAT_ABGR_8888 :
+        case RGA2_FORMAT_XBGR_8888 :
             stride = (w * 4 + 3) & (~3);
             size_yrgb = stride*h;
             start = yrgb_addr >> PAGE_SHIFT;
@@ -641,6 +653,10 @@ static int rga2_buf_size_cal(unsigned long yrgb_addr, unsigned long uv_addr, uns
         case RGA2_FORMAT_BGR_565 :
         case RGA2_FORMAT_BGRA_5551 :
         case RGA2_FORMAT_BGRA_4444 :
+        case RGA2_FORMAT_ARGB_5551 :
+        case RGA2_FORMAT_ARGB_4444 :
+        case RGA2_FORMAT_ABGR_5551 :
+        case RGA2_FORMAT_ABGR_4444 :
             stride = (w*2 + 3) & (~3);
             size_yrgb = stride * h;
             start = yrgb_addr >> PAGE_SHIFT;
@@ -787,6 +803,10 @@ static int rga2_UserMemory_cheeck(struct page **pages, u32 w, u32 h, u32 format,
 	case RGA2_FORMAT_RGBX_8888:
 	case RGA2_FORMAT_BGRA_8888:
 	case RGA2_FORMAT_BGRX_8888:
+	case RGA2_FORMAT_ARGB_8888:
+	case RGA2_FORMAT_XRGB_8888:
+	case RGA2_FORMAT_ABGR_8888:
+	case RGA2_FORMAT_XBGR_8888:
 		bits = 32;
 		break;
 	case RGA2_FORMAT_RGB_888:
@@ -803,6 +823,10 @@ static int rga2_UserMemory_cheeck(struct page **pages, u32 w, u32 h, u32 format,
 	case RGA2_FORMAT_YCrCb_422_P:
 	case RGA2_FORMAT_BGRA_5551:
 	case RGA2_FORMAT_BGRA_4444:
+	case RGA2_FORMAT_ARGB_5551:
+	case RGA2_FORMAT_ARGB_4444:
+	case RGA2_FORMAT_ABGR_5551:
+	case RGA2_FORMAT_ABGR_4444:
 		bits = 16;
 		break;
 	case RGA2_FORMAT_YCbCr_420_SP:
diff --git a/drivers/video/rockchip/rga2/rga2_reg_info.c b/drivers/video/rockchip/rga2/rga2_reg_info.c
index 544e968a3d92..d66df54ee595 100644
--- a/drivers/video/rockchip/rga2/rga2_reg_info.c
+++ b/drivers/video/rockchip/rga2/rga2_reg_info.c
@@ -162,6 +162,7 @@ static void RGA2_set_reg_src_info(RK_U8 *base, struct rga2_req *msg)
 
     RK_U8 src0_rb_swp = 0;
     RK_U8 src0_rgb_pack = 0;
+    RK_U8 src0_alpha_swp = 0;
 
     RK_U8 src0_cbcr_swp = 0;
     RK_U8 pixel_width = 1;
@@ -251,6 +252,17 @@ static void RGA2_set_reg_src_info(RK_U8 *base, struct rga2_req *msg)
         case RGA2_FORMAT_BGRA_5551    : src0_format = 0x5; pixel_width = 2; break;
         case RGA2_FORMAT_BGRA_4444    : src0_format = 0x6; pixel_width = 2; break;
 
+        /* ARGB */
+        /* In colorkey mode, xrgb/xbgr does not need to enable the alpha channel */
+        case RGA2_FORMAT_ARGB_8888    : src0_format = 0x0; pixel_width = 4; src0_alpha_swp = 1; break;
+        case RGA2_FORMAT_ABGR_8888    : src0_format = 0x0; pixel_width = 4; src0_alpha_swp = 1; src0_rb_swp = 0x1; break;
+        case RGA2_FORMAT_XRGB_8888    : src0_format = 0x1; pixel_width = 4; src0_alpha_swp = 1; msg->src_trans_mode &= 0x07; break;
+        case RGA2_FORMAT_XBGR_8888    : src0_format = 0x1; pixel_width = 4; src0_alpha_swp = 1; src0_rb_swp = 0x1; msg->src_trans_mode &= 0x07; break;
+        case RGA2_FORMAT_ARGB_5551    : src0_format = 0x5; pixel_width = 2; src0_alpha_swp = 1; break;
+        case RGA2_FORMAT_ABGR_5551    : src0_format = 0x5; pixel_width = 2; src0_alpha_swp = 1; src0_rb_swp = 0x1; break;
+        case RGA2_FORMAT_ARGB_4444    : src0_format = 0x6; pixel_width = 2; src0_alpha_swp = 1; break;
+        case RGA2_FORMAT_ABGR_4444    : src0_format = 0x6; pixel_width = 2; src0_alpha_swp = 1; src0_rb_swp = 0x1; break;
+
 		case RGA2_FORMAT_YVYU_422     : src0_format = 0x7; pixel_width = 2; src0_cbcr_swp = 1; src0_rb_swp = 0x1; break;//rbswap=ycswap
 		case RGA2_FORMAT_VYUY_422     : src0_format = 0x7; pixel_width = 2; src0_cbcr_swp = 1; src0_rb_swp = 0x0; break;
 		case RGA2_FORMAT_YUYV_422     : src0_format = 0x7; pixel_width = 2; src0_cbcr_swp = 0; src0_rb_swp = 0x1; break;
@@ -275,7 +287,7 @@ static void RGA2_set_reg_src_info(RK_U8 *base, struct rga2_req *msg)
 
     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SRC_FMT)) | (s_RGA2_SRC_INFO_SW_SRC_FMT(src0_format)));
     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_RB_SWAP)) | (s_RGA2_SRC_INFO_SW_SW_SRC_RB_SWAP(src0_rb_swp)));
-    reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_ALPHA_SWAP)) | (s_RGA2_SRC_INFO_SW_SW_SRC_ALPHA_SWAP(msg->alpha_swp)));
+    reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_ALPHA_SWAP)) | (s_RGA2_SRC_INFO_SW_SW_SRC_ALPHA_SWAP(src0_alpha_swp)));
     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_UV_SWAP)) | (s_RGA2_SRC_INFO_SW_SW_SRC_UV_SWAP(src0_cbcr_swp)));
     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE(msg->yuv2rgb_mode)));
 
@@ -363,10 +375,12 @@ static void RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
     RK_U8 src1_format = 0;
     RK_U8 src1_rb_swp = 0;
     RK_U8 src1_rgb_pack = 0;
+    RK_U8 src1_alpha_swp = 0;
     RK_U8 dst_format = 0;
     RK_U8 dst_rb_swp = 0;
     RK_U8 dst_rgb_pack = 0;
     RK_U8 dst_cbcr_swp = 0;
+    RK_U8 dst_alpha_swp = 0;
 
 	RK_U8 dst_fmt_yuv400_en = 0;
 	RK_U8 dst_fmt_y4_en   = 0;
@@ -416,12 +430,22 @@ static void RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
         case RGA2_FORMAT_BGR_565      : src1_format = 0x4; spw = 2; src1_rb_swp = 0x1; break;
         case RGA2_FORMAT_BGRA_5551    : src1_format = 0x5; spw = 2; break;
         case RGA2_FORMAT_BGRA_4444    : src1_format = 0x6; spw = 2; break;
+
+        /* ARGB */
+        case RGA2_FORMAT_ARGB_8888    : src1_format = 0x0; spw = 4; src1_alpha_swp = 1; break;
+        case RGA2_FORMAT_ABGR_8888    : src1_format = 0x0; spw = 4; src1_alpha_swp = 1; src1_rb_swp = 0x1; break;
+        case RGA2_FORMAT_XRGB_8888    : src1_format = 0x1; spw = 4; src1_alpha_swp = 1; break;
+        case RGA2_FORMAT_XBGR_8888    : src1_format = 0x1; spw = 4; src1_alpha_swp = 1; src1_rb_swp = 0x1; break;
+        case RGA2_FORMAT_ARGB_5551    : src1_format = 0x5; spw = 2; src1_alpha_swp = 1; break;
+        case RGA2_FORMAT_ABGR_5551    : src1_format = 0x5; spw = 2; src1_alpha_swp = 1; src1_rb_swp = 0x1; break;
+        case RGA2_FORMAT_ARGB_4444    : src1_format = 0x6; spw = 2; src1_alpha_swp = 1; break;
+        case RGA2_FORMAT_ABGR_4444    : src1_format = 0x6; spw = 2; src1_alpha_swp = 1; src1_rb_swp = 0x1; break;
         default                       : spw = 4; break;
     };
 
     reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_FMT)) | (s_RGA2_DST_INFO_SW_SRC1_FMT(src1_format)));
     reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_RB_SWP)) | (s_RGA2_DST_INFO_SW_SRC1_RB_SWP(src1_rb_swp)));
-    reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_ALPHA_SWP)) | (s_RGA2_DST_INFO_SW_SRC1_ALPHA_SWP(msg->alpha_swp >> 1)));
+    reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_ALPHA_SWP)) | (s_RGA2_DST_INFO_SW_SRC1_ALPHA_SWP(src1_alpha_swp)));
 
 
     switch (msg->dst.format)
@@ -439,6 +463,16 @@ static void RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
         case RGA2_FORMAT_BGRA_5551    : dst_format = 0x5; dpw = 2; break;
         case RGA2_FORMAT_BGRA_4444    : dst_format = 0x6; dpw = 2; break;
 
+        /* ARGB */
+        case RGA2_FORMAT_ARGB_8888    : dst_format = 0x0; dpw = 4; dst_alpha_swp = 1; break;
+        case RGA2_FORMAT_ABGR_8888    : dst_format = 0x0; dpw = 4; dst_alpha_swp = 1; dst_rb_swp = 0x1; break;
+        case RGA2_FORMAT_XRGB_8888    : dst_format = 0x1; dpw = 4; dst_alpha_swp = 1; break;
+        case RGA2_FORMAT_XBGR_8888    : dst_format = 0x1; dpw = 4; dst_alpha_swp = 1; dst_rb_swp = 0x1; break;
+        case RGA2_FORMAT_ARGB_5551    : dst_format = 0x5; dpw = 2; dst_alpha_swp = 1; break;
+        case RGA2_FORMAT_ABGR_5551    : dst_format = 0x5; dpw = 2; dst_alpha_swp = 1; dst_rb_swp = 0x1; break;
+        case RGA2_FORMAT_ARGB_4444    : dst_format = 0x6; dpw = 2; dst_alpha_swp = 1; break;
+        case RGA2_FORMAT_ABGR_4444    : dst_format = 0x6; dpw = 2; dst_alpha_swp = 1; dst_rb_swp = 0x1; break;
+
         case RGA2_FORMAT_YCbCr_422_SP : dst_format = 0x8; x_div = 1; y_div = 1; break;
         case RGA2_FORMAT_YCbCr_422_P  : dst_format = 0x9; x_div = 2; y_div = 1; break;
         case RGA2_FORMAT_YCbCr_420_SP : dst_format = 0xa; x_div = 1; y_div = 2; break;
@@ -463,7 +497,7 @@ static void RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
 
     reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_FMT)) | (s_RGA2_DST_INFO_SW_DST_FMT(dst_format)));
     reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_RB_SWAP)) | (s_RGA2_DST_INFO_SW_DST_RB_SWAP(dst_rb_swp)));
-    reg = ((reg & (~m_RGA2_DST_INFO_SW_ALPHA_SWAP)) | (s_RGA2_DST_INFO_SW_ALPHA_SWAP(msg->alpha_swp >> 2)));
+    reg = ((reg & (~m_RGA2_DST_INFO_SW_ALPHA_SWAP)) | (s_RGA2_DST_INFO_SW_ALPHA_SWAP(dst_alpha_swp)));
     reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_UV_SWAP)) | (s_RGA2_DST_INFO_SW_DST_UV_SWAP(dst_cbcr_swp)));
 
 	reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_FMT_YUV400_EN)) | (s_RGA2_DST_INFO_SW_DST_FMT_YUV400_EN(dst_fmt_yuv400_en)));
@@ -1119,6 +1153,16 @@ static void format_name_convert(uint32_t *df, uint32_t sf)
 	case 0x24:*df = RGA2_FORMAT_BGR_565; break;
 	case 0x25:*df = RGA2_FORMAT_BGRA_5551; break;
 	case 0x26:*df = RGA2_FORMAT_BGRA_4444; break;
+
+
+	case 0x28 : *df = RGA2_FORMAT_ARGB_8888; break;
+	case 0x29 : *df = RGA2_FORMAT_XRGB_8888; break;
+	case 0x2a : *df = RGA2_FORMAT_ARGB_5551; break;
+	case 0x2b : *df = RGA2_FORMAT_ARGB_4444; break;
+	case 0x2c : *df = RGA2_FORMAT_ABGR_8888; break;
+	case 0x2d : *df = RGA2_FORMAT_XBGR_8888; break;
+	case 0x2e : *df = RGA2_FORMAT_ABGR_5551; break;
+	case 0x2f : *df = RGA2_FORMAT_ABGR_4444; break;
     }
 }
 

commit b4d1ec5cd2457389c039878f8a9f6486bf2fcfed
Author: Yu Qiaowei <cerf.yu@rock-chips.com>
Date:   Thu Sep 16 15:38:10 2021 +0800

    video/rockchip: rga2: Optimize the process of mapping dma.
    
    Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
    Change-Id: Ie8d140d8fc102c9a3677b266ac7848c4c3ade78e

diff --git a/drivers/video/rockchip/rga2/rga2.h b/drivers/video/rockchip/rga2/rga2.h
index 80af65400edd..68268bb461c1 100644
--- a/drivers/video/rockchip/rga2/rga2.h
+++ b/drivers/video/rockchip/rga2/rga2.h
@@ -337,6 +337,18 @@ typedef struct rga_img_info_32_t
 }
 rga_img_info_32_t;
 
+struct rga_dma_buffer_t {
+	/* DMABUF information */
+	struct dma_buf *dma_buf;
+	struct dma_buf_attachment *attach;
+	struct sg_table *sgt;
+
+	dma_addr_t iova;
+	unsigned long size;
+	void *vaddr;
+	enum dma_data_direction dir;
+};
+
 struct rga_req {
     uint8_t render_mode;            /* (enum) process mode sel */
 
@@ -578,14 +590,6 @@ struct rga2_req
     u8 rgb2yuv_mode;
 
 	u8 buf_type;
-	struct sg_table *sg_src0;
-	struct sg_table *sg_src1;
-	struct sg_table *sg_dst;
-	struct sg_table *sg_els;
-	struct dma_buf_attachment *attach_src0;
-	struct dma_buf_attachment *attach_src1;
-	struct dma_buf_attachment *attach_dst;
-	struct dma_buf_attachment *attach_els;
 };
 
 struct rga2_mmu_buf_t {
@@ -726,15 +730,10 @@ struct rga2_reg {
 	uint32_t MMU_len;
 	bool MMU_map;
 
-	struct sg_table *sg_src0;
-	struct sg_table *sg_src1;
-	struct sg_table *sg_dst;
-	struct sg_table *sg_els;
-
-	struct dma_buf_attachment *attach_src0;
-	struct dma_buf_attachment *attach_src1;
-	struct dma_buf_attachment *attach_dst;
-	struct dma_buf_attachment *attach_els;
+	struct rga_dma_buffer_t dma_buffer_src0;
+	struct rga_dma_buffer_t dma_buffer_src1;
+	struct rga_dma_buffer_t dma_buffer_dst;
+	struct rga_dma_buffer_t dma_buffer_els;
 };
 
 struct rga2_service_info {
diff --git a/drivers/video/rockchip/rga2/rga2_drv.c b/drivers/video/rockchip/rga2/rga2_drv.c
index b203587a89fb..15064e7615fb 100644
--- a/drivers/video/rockchip/rga2/rga2_drv.c
+++ b/drivers/video/rockchip/rga2/rga2_drv.c
@@ -367,71 +367,6 @@ static int rga2_align_check(struct rga2_req *req)
 	return 0;
 }
 
-static int rga2_memory_check(void *vaddr, u32 w, u32 h, u32 format, int fd)
-{
-	int bits = 32;
-	int temp_data = 0;
-	void *one_line = kzalloc(w * 4, GFP_KERNEL);
-
-	if (!one_line) {
-		ERR("kzalloc fail %s[%d]\n", __func__, __LINE__);
-		return 0;
-	}
-	switch (format) {
-	case RGA2_FORMAT_RGBA_8888:
-	case RGA2_FORMAT_RGBX_8888:
-	case RGA2_FORMAT_BGRA_8888:
-	case RGA2_FORMAT_BGRX_8888:
-		bits = 32;
-		break;
-	case RGA2_FORMAT_RGB_888:
-	case RGA2_FORMAT_BGR_888:
-		bits = 24;
-		break;
-	case RGA2_FORMAT_RGB_565:
-	case RGA2_FORMAT_RGBA_5551:
-	case RGA2_FORMAT_RGBA_4444:
-	case RGA2_FORMAT_BGR_565:
-	case RGA2_FORMAT_YCbCr_422_SP:
-	case RGA2_FORMAT_YCbCr_422_P:
-	case RGA2_FORMAT_YCrCb_422_SP:
-	case RGA2_FORMAT_YCrCb_422_P:
-	case RGA2_FORMAT_BGRA_5551:
-	case RGA2_FORMAT_BGRA_4444:
-		bits = 16;
-		break;
-	case RGA2_FORMAT_YCbCr_420_SP:
-	case RGA2_FORMAT_YCbCr_420_P:
-	case RGA2_FORMAT_YCrCb_420_SP:
-	case RGA2_FORMAT_YCrCb_420_P:
-		bits = 12;
-		break;
-	case RGA2_FORMAT_YCbCr_420_SP_10B:
-	case RGA2_FORMAT_YCrCb_420_SP_10B:
-	case RGA2_FORMAT_YCbCr_422_SP_10B:
-	case RGA2_FORMAT_YCrCb_422_SP_10B:
-		bits = 15;
-		break;
-	default:
-		INFO("un know format\n");
-		kfree(one_line);
-		return -1;
-	}
-	temp_data = w * (h - 1) * bits >> 3;
-	if (fd > 0) {
-		INFO("vaddr is%p, bits is %d, fd check\n", vaddr, bits);
-		memcpy(one_line, (char *)vaddr + temp_data, w * bits >> 3);
-		INFO("fd check ok\n");
-	} else {
-		INFO("vir addr memory check.\n");
-		memcpy((void *)((char *)vaddr + temp_data), one_line,
-		       w * bits >> 3);
-		INFO("vir addr check ok.\n");
-	}
-	kfree(one_line);
-	return 0;
-}
-
 int rga2_scale_check(struct rga2_req *req)
 {
 	u32 saw, sah, daw, dah;
@@ -486,19 +421,6 @@ static void rga2_printf_cmd_buf(u32 *cmd_buf)
 	     dst_aw, dst_ah, dst_stride, dst_format);
 }
 
-static bool is_yuv422p_format(u32 format)
-{
-	bool ret = false;
-
-	switch (format) {
-	case RGA2_FORMAT_YCbCr_422_P:
-	case RGA2_FORMAT_YCrCb_422_P:
-		ret = true;
-		break;
-	}
-	return ret;
-}
-
 static inline void rga2_write(u32 b, u32 r)
 {
 	*((volatile unsigned int *)(rga2_drvdata->rga_base + r)) = b;
@@ -843,6 +765,14 @@ static struct rga2_reg * rga2_reg_init(rga2_session *session, struct rga2_req *r
 	INIT_LIST_HEAD(&reg->session_link);
 	INIT_LIST_HEAD(&reg->status_link);
 
+    ret = rga2_get_dma_info(reg, req);
+    if (ret < 0) {
+        pr_err("fail to get dma buffer info!\n");
+        free_page((unsigned long)reg);
+
+        return NULL;
+    }
+
     if ((req->mmu_info.src0_mmu_flag & 1) || (req->mmu_info.src1_mmu_flag & 1)
         || (req->mmu_info.dst_mmu_flag & 1) || (req->mmu_info.els_mmu_flag & 1))
     {
@@ -861,16 +791,6 @@ static struct rga2_reg * rga2_reg_init(rga2_session *session, struct rga2_req *r
 
         return NULL;
     }
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
-	reg->sg_src0 = req->sg_src0;
-	reg->sg_dst = req->sg_dst;
-	reg->sg_src1 = req->sg_src1;
-	reg->sg_els = req->sg_els;
-	reg->attach_src0 = req->attach_src0;
-	reg->attach_dst = req->attach_dst;
-	reg->attach_src1 = req->attach_src1;
-	reg->attach_els = req->attach_els;
-#endif
 
     mutex_lock(&rga2_service.lock);
 	list_add_tail(&reg->status_link, &rga2_service.waiting);
@@ -1009,59 +929,6 @@ static void rga2_try_set_reg(void)
 		}
 	}
 }
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
-static int rga2_put_dma_buf(struct rga2_req *req, struct rga2_reg *reg)
-{
-	struct dma_buf_attachment *attach = NULL;
-	struct sg_table *sgt = NULL;
-	struct dma_buf *dma_buf = NULL;
-
-	if (!req && !reg)
-		return -EINVAL;
-
-	attach = reg ? reg->attach_src0 : req->attach_src0;
-	sgt = reg ? reg->sg_src0 : req->sg_src0;
-	if (attach && sgt)
-		dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL);
-	if (attach) {
-		dma_buf = attach->dmabuf;
-		dma_buf_detach(dma_buf, attach);
-		dma_buf_put(dma_buf);
-	}
-
-	attach = reg ? reg->attach_dst : req->attach_dst;
-	sgt = reg ? reg->sg_dst : req->sg_dst;
-	if (attach && sgt)
-		dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL);
-	if (attach) {
-		dma_buf = attach->dmabuf;
-		dma_buf_detach(dma_buf, attach);
-		dma_buf_put(dma_buf);
-	}
-
-	attach = reg ? reg->attach_src1 : req->attach_src1;
-	sgt = reg ? reg->sg_src1 : req->sg_src1;
-	if (attach && sgt)
-		dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL);
-	if (attach) {
-		dma_buf = attach->dmabuf;
-		dma_buf_detach(dma_buf, attach);
-		dma_buf_put(dma_buf);
-	}
-
-	attach = reg ? reg->attach_els : req->attach_els;
-	sgt = reg ? reg->sg_els : req->sg_els;
-	if (attach && sgt)
-		dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL);
-	if (attach) {
-		dma_buf = attach->dmabuf;
-		dma_buf_detach(dma_buf, attach);
-		dma_buf_put(dma_buf);
-	}
-
-	return 0;
-}
-#endif
 
 static void rga2_del_running_list(void)
 {
@@ -1077,9 +944,7 @@ static void rga2_del_running_list(void)
 			else
 				tbuf->back += reg->MMU_len;
 		}
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
-		rga2_put_dma_buf(NULL, reg);
-#endif
+		rga2_put_dma_info(reg);
 		atomic_sub(1, &reg->session->task_running);
 		atomic_sub(1, &rga2_service.total_running);
 
@@ -1110,9 +975,7 @@ static void rga2_del_running_list_timeout(void)
 			else
 				tbuf->back += reg->MMU_len;
 		}
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
-		rga2_put_dma_buf(NULL, reg);
-#endif
+		rga2_put_dma_info(reg);
 		atomic_sub(1, &reg->session->task_running);
 		atomic_sub(1, &rga2_service.total_running);
 		rga2_soft_reset();
@@ -1124,315 +987,6 @@ static void rga2_del_running_list_timeout(void)
 	}
 	return;
 }
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
-static int rga2_get_img_info(rga_img_info_t *img,
-			     u8 mmu_flag,
-			     struct sg_table **psgt,
-			     struct dma_buf_attachment **pattach)
-{
-	struct dma_buf_attachment *attach = NULL;
-	struct device *rga_dev = NULL;
-	struct sg_table *sgt = NULL;
-	struct dma_buf *dma_buf = NULL;
-	u32 vir_w, vir_h;
-	int yrgb_addr = -1;
-	int ret = 0;
-
-	rga_dev = rga2_drvdata->dev;
-	yrgb_addr = (int)img->yrgb_addr;
-	vir_w = img->vir_w;
-	vir_h = img->vir_h;
-
-	if (yrgb_addr > 0) {
-		dma_buf = dma_buf_get(img->yrgb_addr);
-		if (IS_ERR(dma_buf)) {
-			ret = -EINVAL;
-			pr_err("dma_buf_get fail fd[%d]\n", yrgb_addr);
-			return ret;
-		}
-
-		attach = dma_buf_attach(dma_buf, rga_dev);
-		if (IS_ERR(attach)) {
-			dma_buf_put(dma_buf);
-			ret = -EINVAL;
-			pr_err("Failed to attach dma_buf\n");
-			return ret;
-		}
-#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
-	if (RGA2_CHECK_MODE) {
-		void *vaddr = dma_buf_vmap(dma_buf);
-		if (vaddr)
-			rga2_memory_check(vaddr, img->vir_w, img->vir_h,
-					  img->format, img->yrgb_addr);
-		dma_buf_vunmap(dma_buf, vaddr);
-	}
-#endif
-
-		*pattach = attach;
-		sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL);
-		if (IS_ERR(sgt)) {
-			ret = -EINVAL;
-			pr_err("Failed to map src attachment\n");
-			goto err_get_sg;
-		}
-		if (!mmu_flag) {
-			ret = -EINVAL;
-			pr_err("Fix it please enable iommu flag\n");
-			goto err_get_sg;
-		}
-
-		if (mmu_flag) {
-			*psgt = sgt;
-			img->yrgb_addr = img->uv_addr;
-			img->uv_addr = img->yrgb_addr + (vir_w * vir_h);
-			if (is_yuv422p_format(img->format))
-				img->v_addr = img->uv_addr + (vir_w * vir_h) / 2;
-			else
-				img->v_addr = img->uv_addr + (vir_w * vir_h) / 4;
-		}
-	} else {
-		img->yrgb_addr = img->uv_addr;
-		img->uv_addr = img->yrgb_addr + (vir_w * vir_h);
-		if (is_yuv422p_format(img->format))
-			img->v_addr = img->uv_addr + (vir_w * vir_h) / 2;
-		else
-			img->v_addr = img->uv_addr + (vir_w * vir_h) / 4;
-	}
-
-	return ret;
-
-err_get_sg:
-	if (!IS_ERR(sgt) && sgt)
-		dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL);
-	if (!IS_ERR(attach) && attach) {
-		dma_buf = attach->dmabuf;
-		dma_buf_detach(dma_buf, attach);
-		*pattach = NULL;
-		dma_buf_put(dma_buf);
-	}
-	return ret;
-}
-
-static int rga2_get_dma_buf(struct rga2_req *req)
-{
-	struct dma_buf *dma_buf = NULL;
-	u8 mmu_flag = 0;
-	int ret = 0;
-
-	req->sg_src0 = NULL;
-	req->sg_src1 = NULL;
-	req->sg_dst = NULL;
-	req->sg_els = NULL;
-	req->attach_src0 = NULL;
-	req->attach_dst = NULL;
-	req->attach_src1 = NULL;
-	req->attach_els = NULL;
-	mmu_flag = req->mmu_info.src0_mmu_flag;
-	ret = rga2_get_img_info(&req->src, mmu_flag, &req->sg_src0,
-				&req->attach_src0);
-	if (ret) {
-		pr_err("src:rga2_get_img_info fail\n");
-		goto err_src;
-	}
-
-	mmu_flag = req->mmu_info.dst_mmu_flag;
-	ret = rga2_get_img_info(&req->dst, mmu_flag, &req->sg_dst,
-				&req->attach_dst);
-	if (ret) {
-		pr_err("dst:rga2_get_img_info fail\n");
-		goto err_dst;
-	}
-
-	mmu_flag = req->mmu_info.src1_mmu_flag;
-	ret = rga2_get_img_info(&req->src1, mmu_flag, &req->sg_src1,
-				&req->attach_src1);
-	if (ret) {
-		pr_err("src1:rga2_get_img_info fail\n");
-		goto err_src1;
-	}
-
-	mmu_flag = req->mmu_info.els_mmu_flag;
-	ret = rga2_get_img_info(&req->pat, mmu_flag, &req->sg_els,
-							&req->attach_els);
-	if (ret) {
-		pr_err("els:rga2_get_img_info fail\n");
-		goto err_els;
-	}
-
-	return ret;
-
-err_els:
-	if (req->sg_src1 && req->attach_src1) {
-		dma_buf_unmap_attachment(req->attach_src1,
-			req->sg_src1, DMA_BIDIRECTIONAL);
-		dma_buf = req->attach_src1->dmabuf;
-		dma_buf_detach(dma_buf, req->attach_src1);
-		dma_buf_put(dma_buf);
-	}
-err_src1:
-	if (req->sg_dst && req->attach_dst) {
-		dma_buf_unmap_attachment(req->attach_dst,
-					 req->sg_dst, DMA_BIDIRECTIONAL);
-		dma_buf = req->attach_dst->dmabuf;
-		dma_buf_detach(dma_buf, req->attach_dst);
-		dma_buf_put(dma_buf);
-	}
-err_dst:
-	if (req->sg_src0 && req->attach_src0) {
-		dma_buf_unmap_attachment(req->attach_src0,
-					 req->sg_src0, DMA_BIDIRECTIONAL);
-		dma_buf = req->attach_src0->dmabuf;
-		dma_buf_detach(dma_buf, req->attach_src0);
-		dma_buf_put(dma_buf);
-	}
-err_src:
-
-	return ret;
-}
-#else
-static int rga2_convert_dma_buf(struct rga2_req *req)
-{
-	struct ion_handle *hdl;
-	ion_phys_addr_t phy_addr;
-	size_t len;
-	int ret;
-	u32 src_vir_w, dst_vir_w;
-	void *vaddr = NULL;
-
-	src_vir_w = req->src.vir_w;
-	dst_vir_w = req->dst.vir_w;
-
-	req->sg_src0 = NULL;
-	req->sg_src1 = NULL;
-	req->sg_dst  = NULL;
-	req->sg_els  = NULL;
-
-	if ((int)req->src.yrgb_addr > 0) {
-		hdl = ion_import_dma_buf(rga2_drvdata->ion_client,
-					 req->src.yrgb_addr);
-		if (IS_ERR(hdl)) {
-			ret = PTR_ERR(hdl);
-			pr_err("RGA2 SRC ERROR ion buf handle\n");
-			return ret;
-		}
-#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
-	if (RGA2_CHECK_MODE) {
-		vaddr = ion_map_kernel(rga2_drvdata->ion_client, hdl);
-		if (vaddr)
-			rga2_memory_check(vaddr, req->src.vir_w, req->src.vir_h,
-					  req->src.format, req->src.yrgb_addr);
-		ion_unmap_kernel(rga2_drvdata->ion_client, hdl);
-	}
-#endif
-		if (req->mmu_info.src0_mmu_flag) {
-			req->sg_src0 =
-				ion_sg_table(rga2_drvdata->ion_client, hdl);
-			req->src.yrgb_addr = req->src.uv_addr;
-			req->src.uv_addr =
-				req->src.yrgb_addr + (src_vir_w * req->src.vir_h);
-			req->src.v_addr =
-				req->src.uv_addr + (src_vir_w * req->src.vir_h) / 4;
-		} else {
-			ion_phys(rga2_drvdata->ion_client, hdl, &phy_addr, &len);
-			req->src.yrgb_addr = phy_addr;
-			req->src.uv_addr =
-				req->src.yrgb_addr + (src_vir_w * req->src.vir_h);
-			req->src.v_addr =
-				req->src.uv_addr + (src_vir_w * req->src.vir_h) / 4;
-		}
-		ion_free(rga2_drvdata->ion_client, hdl);
-	} else {
-		req->src.yrgb_addr = req->src.uv_addr;
-		req->src.uv_addr =
-			req->src.yrgb_addr + (src_vir_w * req->src.vir_h);
-		req->src.v_addr =
-			req->src.uv_addr + (src_vir_w * req->src.vir_h) / 4;
-	}
-
-	if ((int)req->dst.yrgb_addr > 0) {
-		hdl = ion_import_dma_buf(rga2_drvdata->ion_client,
-					 req->dst.yrgb_addr);
-		if (IS_ERR(hdl)) {
-			ret = PTR_ERR(hdl);
-			pr_err("RGA2 DST ERROR ion buf handle\n");
-			return ret;
-		}
-#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
-	if (RGA2_CHECK_MODE) {
-		vaddr = ion_map_kernel(rga2_drvdata->ion_client, hdl);
-		if (vaddr)
-			rga2_memory_check(vaddr, req->dst.vir_w, req->dst.vir_h,
-					  req->dst.format, req->dst.yrgb_addr);
-		ion_unmap_kernel(rga2_drvdata->ion_client, hdl);
-	}
-#endif
-		if (req->mmu_info.dst_mmu_flag) {
-			req->sg_dst =
-				ion_sg_table(rga2_drvdata->ion_client, hdl);
-			req->dst.yrgb_addr = req->dst.uv_addr;
-			req->dst.uv_addr =
-				req->dst.yrgb_addr + (dst_vir_w * req->dst.vir_h);
-			req->dst.v_addr =
-				req->dst.uv_addr + (dst_vir_w * req->dst.vir_h) / 4;
-		} else {
-			ion_phys(rga2_drvdata->ion_client, hdl, &phy_addr, &len);
-			req->dst.yrgb_addr = phy_addr;
-			req->dst.uv_addr =
-				req->dst.yrgb_addr + (dst_vir_w * req->dst.vir_h);
-			req->dst.v_addr =
-				req->dst.uv_addr + (dst_vir_w * req->dst.vir_h) / 4;
-		}
-		ion_free(rga2_drvdata->ion_client, hdl);
-	} else {
-		req->dst.yrgb_addr = req->dst.uv_addr;
-		req->dst.uv_addr =
-			req->dst.yrgb_addr + (dst_vir_w * req->dst.vir_h);
-		req->dst.v_addr =
-			req->dst.uv_addr + (dst_vir_w * req->dst.vir_h) / 4;
-	}
-
-	if ((int)req->src1.yrgb_addr > 0) {
-		hdl = ion_import_dma_buf(rga2_drvdata->ion_client,
-					 req->src1.yrgb_addr);
-		if (IS_ERR(hdl)) {
-			ret = PTR_ERR(hdl);
-			pr_err("RGA2 ERROR ion buf handle\n");
-			return ret;
-		}
-		if (req->mmu_info.dst_mmu_flag) {
-			req->sg_src1 =
-				ion_sg_table(rga2_drvdata->ion_client, hdl);
-			req->src1.yrgb_addr = req->src1.uv_addr;
-			req->src1.uv_addr =
-				req->src1.yrgb_addr + (req->src1.vir_w * req->src1.vir_h);
-			req->src1.v_addr =
-				req->src1.uv_addr + (req->src1.vir_w * req->src1.vir_h) / 4;
-		} else {
-			ion_phys(rga2_drvdata->ion_client, hdl, &phy_addr, &len);
-			req->src1.yrgb_addr = phy_addr;
-			req->src1.uv_addr =
-				req->src1.yrgb_addr + (req->src1.vir_w * req->src1.vir_h);
-			req->src1.v_addr =
-				req->src1.uv_addr + (req->src1.vir_w * req->src1.vir_h) / 4;
-		}
-		ion_free(rga2_drvdata->ion_client, hdl);
-	} else {
-		req->src1.yrgb_addr = req->src1.uv_addr;
-		req->src1.uv_addr =
-			req->src1.yrgb_addr + (req->src1.vir_w * req->src1.vir_h);
-		req->src1.v_addr =
-			req->src1.uv_addr + (req->src1.vir_w * req->src1.vir_h) / 4;
-	}
-	if (is_yuv422p_format(req->src.format))
-		req->src.v_addr = req->src.uv_addr + (req->src.vir_w * req->src.vir_h) / 2;
-	if (is_yuv422p_format(req->dst.format))
-		req->dst.v_addr = req->dst.uv_addr + (req->dst.vir_w * req->dst.vir_h) / 2;
-	if (is_yuv422p_format(req->src1.format))
-		req->src1.v_addr = req->src1.uv_addr + (req->src1.vir_w * req->dst.vir_h) / 2;
-
-	return 0;
-}
-#endif
 
 static int rga2_blit_flush_cache(rga2_session *session, struct rga2_req *req)
 {
@@ -1446,19 +1000,13 @@ static int rga2_blit_flush_cache(rga2_session *session, struct rga2_req *req)
 		ret = -ENOMEM;
 		goto err_free_reg;
 	}
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
-	if (rga2_get_dma_buf(req)) {
-		pr_err("RGA2 : DMA buf copy error\n");
-		ret = -EFAULT;
-		goto err_free_reg;
-	}
-#else
-	if (rga2_convert_dma_buf(req)) {
-		pr_err("RGA2 : DMA buf copy error\n");
-		ret = -EFAULT;
+
+	ret = rga2_get_dma_info(reg, req);
+	if (ret < 0) {
+		pr_err("fail to get dma buffer info!\n");
 		goto err_free_reg;
 	}
-#endif
+
 	if ((req->mmu_info.src0_mmu_flag & 1) || (req->mmu_info.src1_mmu_flag & 1) ||
 	    (req->mmu_info.dst_mmu_flag & 1) || (req->mmu_info.els_mmu_flag & 1)) {
 		reg->MMU_map = true;
@@ -1487,54 +1035,26 @@ static int rga2_blit(rga2_session *session, struct rga2_req *req)
 	int num = 0;
 	struct rga2_reg *reg;
 
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
-	if (rga2_get_dma_buf(req)) {
-		pr_err("RGA2 : DMA buf copy error\n");
-		return -EFAULT;
+	/* check value if legal */
+	ret = rga2_check_param(req);
+	if (ret == -EINVAL) {
+		pr_err("req argument is inval\n");
+		return ret;
 	}
-#else
-	if (rga2_convert_dma_buf(req)) {
-		pr_err("RGA2 : DMA buf copy error\n");
+
+	reg = rga2_reg_init(session, req);
+	if (reg == NULL) {
+		pr_err("init reg fail\n");
 		return -EFAULT;
 	}
-#endif
-	do {
-		/* check value if legal */
-		ret = rga2_check_param(req);
-		if(ret == -EINVAL) {
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
-			pr_err("req argument is inval\n");
-			goto err_put_dma_buf;
-#else
-			pr_err("req argument is inval\n");
-			break;
-#endif
-		}
-
-		reg = rga2_reg_init(session, req);
-		if(reg == NULL) {
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
-			pr_err("init reg fail\n");
-			goto err_put_dma_buf;
-#else
-			break;
-#endif
-		}
 
-		num = 1;
-		mutex_lock(&rga2_service.lock);
-		atomic_add(num, &rga2_service.total_running);
-		rga2_try_set_reg();
-		mutex_unlock(&rga2_service.lock);
+	num = 1;
+	mutex_lock(&rga2_service.lock);
+	atomic_add(num, &rga2_service.total_running);
+	rga2_try_set_reg();
+	mutex_unlock(&rga2_service.lock);
 
-		return 0;
-	}
-	while(0);
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
-err_put_dma_buf:
-	rga2_put_dma_buf(req, NULL);
-#endif
-	return -EFAULT;
+	return 0;
 }
 
 static int rga2_blit_async(rga2_session *session, struct rga2_req *req)
diff --git a/drivers/video/rockchip/rga2/rga2_mmu_info.c b/drivers/video/rockchip/rga2/rga2_mmu_info.c
index 51d20a77848e..6f38719f7242 100644
--- a/drivers/video/rockchip/rga2/rga2_mmu_info.c
+++ b/drivers/video/rockchip/rga2/rga2_mmu_info.c
@@ -19,11 +19,15 @@
 #include <asm/memory.h>
 #include <asm/atomic.h>
 #include <asm/cacheflush.h>
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 0))
+#include <linux/rockchip_ion.h>
+#endif
 #include "rga2_mmu_info.h"
 #include "rga2_debugger.h"
 
 extern struct rga2_service_info rga2_service;
 extern struct rga2_mmu_buf_t rga2_mmu_buf;
+extern struct rga2_drvdata_t *rga2_drvdata;
 
 //extern int mmu_buff_temp[1024];
 
@@ -118,6 +122,431 @@ static unsigned int armv7_va_to_pa(unsigned int v_addr)
 }
 #endif
 
+static bool rga2_is_yuv422p_format(u32 format)
+{
+	bool ret = false;
+
+	switch (format) {
+	case RGA2_FORMAT_YCbCr_422_P:
+	case RGA2_FORMAT_YCrCb_422_P:
+		ret = true;
+		break;
+	}
+	return ret;
+}
+
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
+static int rga2_memory_check(void *vaddr, u32 w, u32 h, u32 format, int fd)
+{
+	int bits = 32;
+	int temp_data = 0;
+	void *one_line = kzalloc(w * 4, GFP_KERNEL);
+
+	if (!one_line) {
+		ERR("kzalloc fail %s[%d]\n", __func__, __LINE__);
+		return 0;
+	}
+	switch (format) {
+	case RGA2_FORMAT_RGBA_8888:
+	case RGA2_FORMAT_RGBX_8888:
+	case RGA2_FORMAT_BGRA_8888:
+	case RGA2_FORMAT_BGRX_8888:
+		bits = 32;
+		break;
+	case RGA2_FORMAT_RGB_888:
+	case RGA2_FORMAT_BGR_888:
+		bits = 24;
+		break;
+	case RGA2_FORMAT_RGB_565:
+	case RGA2_FORMAT_RGBA_5551:
+	case RGA2_FORMAT_RGBA_4444:
+	case RGA2_FORMAT_BGR_565:
+	case RGA2_FORMAT_YCbCr_422_SP:
+	case RGA2_FORMAT_YCbCr_422_P:
+	case RGA2_FORMAT_YCrCb_422_SP:
+	case RGA2_FORMAT_YCrCb_422_P:
+	case RGA2_FORMAT_BGRA_5551:
+	case RGA2_FORMAT_BGRA_4444:
+		bits = 16;
+		break;
+	case RGA2_FORMAT_YCbCr_420_SP:
+	case RGA2_FORMAT_YCbCr_420_P:
+	case RGA2_FORMAT_YCrCb_420_SP:
+	case RGA2_FORMAT_YCrCb_420_P:
+		bits = 12;
+		break;
+	case RGA2_FORMAT_YCbCr_420_SP_10B:
+	case RGA2_FORMAT_YCrCb_420_SP_10B:
+	case RGA2_FORMAT_YCbCr_422_SP_10B:
+	case RGA2_FORMAT_YCrCb_422_SP_10B:
+		bits = 15;
+		break;
+	default:
+		INFO("un know format\n");
+		kfree(one_line);
+		return -1;
+	}
+	temp_data = w * (h - 1) * bits >> 3;
+	if (fd > 0) {
+		INFO("vaddr is%p, bits is %d, fd check\n", vaddr, bits);
+		memcpy(one_line, (char *)vaddr + temp_data, w * bits >> 3);
+		INFO("fd check ok\n");
+	} else {
+		INFO("vir addr memory check.\n");
+		memcpy((void *)((char *)vaddr + temp_data), one_line,
+		       w * bits >> 3);
+		INFO("vir addr check ok.\n");
+	}
+	kfree(one_line);
+	return 0;
+}
+#endif
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
+static int rga2_map_dma_buffer(struct rga_img_info_t *img,
+			       struct rga_dma_buffer_t *rga_dma_buffer,
+			       enum dma_data_direction dir)
+{
+	struct device *rga_dev = NULL;
+	struct dma_buf *dma_buf = NULL;
+	struct dma_buf_attachment *attach = NULL;
+	struct sg_table *sgt = NULL;
+	u32 vir_w, vir_h;
+	int fd = -1;
+	int ret = 0;
+
+	rga_dev = rga2_drvdata->dev;
+	fd = (int)img->yrgb_addr;
+	vir_w = img->vir_w;
+	vir_h = img->vir_h;
+
+	dma_buf = dma_buf_get(fd);
+	if (IS_ERR(dma_buf)) {
+		ret = -EINVAL;
+		pr_err("dma_buf_get fail fd[%d]\n", fd);
+		return ret;
+	}
+
+	attach = dma_buf_attach(dma_buf, rga_dev);
+	if (IS_ERR(attach)) {
+		ret = -EINVAL;
+		pr_err("Failed to attach dma_buf\n");
+		goto err_get_attach;
+	}
+
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
+	if (RGA2_CHECK_MODE) {
+		void *vaddr = dma_buf_vmap(dma_buf);
+
+		if (vaddr)
+			rga2_memory_check(vaddr, img->vir_w, img->vir_h,
+					  img->format, img->yrgb_addr);
+		dma_buf_vunmap(dma_buf, vaddr);
+	}
+#endif
+
+	sgt = dma_buf_map_attachment(attach, dir);
+	if (IS_ERR(sgt)) {
+		ret = -EINVAL;
+		pr_err("Failed to map src attachment\n");
+		goto err_get_sgt;
+	}
+
+	rga_dma_buffer->dma_buf = dma_buf;
+	rga_dma_buffer->attach = attach;
+	rga_dma_buffer->sgt = sgt;
+	rga_dma_buffer->size = sg_dma_len(sgt->sgl);
+	rga_dma_buffer->dir = dir;
+
+	return ret;
+
+err_get_sgt:
+	if (attach)
+		dma_buf_detach(dma_buf, attach);
+err_get_attach:
+	if (dma_buf)
+		dma_buf_put(dma_buf);
+
+	return ret;
+}
+
+static void rga2_unmap_dma_buffer(struct rga_dma_buffer_t *rga_dma_buffer)
+{
+	if (rga_dma_buffer->attach && rga_dma_buffer->sgt)
+		dma_buf_unmap_attachment(rga_dma_buffer->attach,
+					 rga_dma_buffer->sgt,
+					 rga_dma_buffer->dir);
+	if (rga_dma_buffer->attach) {
+		dma_buf_detach(rga_dma_buffer->dma_buf, rga_dma_buffer->attach);
+		dma_buf_put(rga_dma_buffer->dma_buf);
+	}
+}
+
+static void rga2_convert_addr(struct rga_img_info_t *img)
+{
+	/*
+	 * If it is not using dma fd, the virtual/phyical address is assigned
+	 * to the address of the corresponding channel.
+	 */
+	img->yrgb_addr = img->uv_addr;
+	img->uv_addr = img->yrgb_addr + (img->vir_w * img->vir_h);
+	if (rga2_is_yuv422p_format(img->format))
+		img->v_addr = img->uv_addr + (img->vir_w * img->vir_h) / 2;
+	else
+		img->v_addr = img->uv_addr + (img->vir_w * img->vir_h) / 4;
+}
+
+int rga2_get_dma_info(struct rga2_reg *reg, struct rga2_req *req)
+{
+	uint32_t mmu_flag;
+	int ret;
+
+	struct rga_dma_buffer_t *buffer_src0, *buffer_src1, *buffer_dst, *buffer_els;
+	struct rga_img_info_t *src0, *src1, *dst, *els;
+
+	/*
+	 * Since the life cycle of rga2_req cannot satisfy the release of
+	 * dmabuffer after the task is over, the mapped dmabuffer is saved
+	 * in rga2_reg.
+	 */
+	buffer_src0 = &reg->dma_buffer_src0;
+	buffer_src1 = &reg->dma_buffer_src1;
+	buffer_dst = &reg->dma_buffer_dst;
+	buffer_els = &reg->dma_buffer_els;
+
+	src0 = &req->src;
+	src1 = &req->src1;
+	dst = &req->dst;
+	els = &req->pat;
+
+	/* src0 chanel */
+	mmu_flag = req->mmu_info.src0_mmu_flag;
+	if (unlikely(!mmu_flag && src0->yrgb_addr)) {
+		pr_err("Fix it please enable src0 mmu\n");
+		return -EINVAL;
+	} else if (mmu_flag && src0->yrgb_addr) {
+		ret = rga2_map_dma_buffer(src0, buffer_src0, DMA_BIDIRECTIONAL);
+		if (ret < 0) {
+			pr_err("src0: can't map dma-buf\n");
+			return ret;
+		}
+	}
+	rga2_convert_addr(src0);
+
+	/* src1 chanel */
+	mmu_flag = req->mmu_info.src1_mmu_flag;
+	if (unlikely(!mmu_flag && src1->yrgb_addr)) {
+		pr_err("Fix it please enable src1 mmu\n");
+		ret = -EINVAL;
+		goto err_src1_channel;
+	} else if (mmu_flag && src1->yrgb_addr) {
+		ret = rga2_map_dma_buffer(src1, buffer_src1, DMA_BIDIRECTIONAL);
+		if (ret < 0) {
+			pr_err("src1: can't map dma-buf\n");
+			goto err_src1_channel;
+		}
+	}
+	rga2_convert_addr(src1);
+
+	/* dst chanel */
+	mmu_flag = req->mmu_info.dst_mmu_flag;
+	if (unlikely(!mmu_flag && dst->yrgb_addr)) {
+		pr_err("Fix it please enable dst mmu\n");
+		ret = -EINVAL;
+		goto err_dst_channel;
+	} else if (mmu_flag && dst->yrgb_addr) {
+		ret = rga2_map_dma_buffer(dst, buffer_dst, DMA_BIDIRECTIONAL);
+		if (ret < 0) {
+			pr_err("dst: can't map dma-buf\n");
+			goto err_dst_channel;
+		}
+	}
+	rga2_convert_addr(dst);
+
+	/* els chanel */
+	mmu_flag = req->mmu_info.els_mmu_flag;
+	if (unlikely(!mmu_flag && els->yrgb_addr)) {
+		pr_err("Fix it please enable els mmu\n");
+		ret = -EINVAL;
+		goto err_els_channel;
+	} else if (mmu_flag && els->yrgb_addr) {
+		ret = rga2_map_dma_buffer(els, buffer_els, DMA_BIDIRECTIONAL);
+		if (ret < 0) {
+			pr_err("els: can't map dma-buf\n");
+			goto err_els_channel;
+		}
+	}
+	rga2_convert_addr(els);
+
+	return 0;
+
+err_els_channel:
+	rga2_unmap_dma_buffer(buffer_dst);
+err_dst_channel:
+	rga2_unmap_dma_buffer(buffer_src1);
+err_src1_channel:
+	rga2_unmap_dma_buffer(buffer_src0);
+
+	return ret;
+}
+
+void rga2_put_dma_info(struct rga2_reg *reg)
+{
+	rga2_unmap_dma_buffer(&reg->dma_buffer_src0);
+	rga2_unmap_dma_buffer(&reg->dma_buffer_src1);
+	rga2_unmap_dma_buffer(&reg->dma_buffer_dst);
+	rga2_unmap_dma_buffer(&reg->dma_buffer_els);
+}
+
+#else
+static int rga2_get_dma_info(struct rga2_reg *reg, struct rga2_req *req)
+{
+	struct ion_handle *hdl;
+	ion_phys_addr_t phy_addr;
+	size_t len;
+	int ret;
+	u32 src_vir_w, dst_vir_w;
+	void *vaddr = NULL;
+	struct rga_dma_buffer_t *buffer_src0, *buffer_src1, *buffer_dst, *buffer_els;
+
+	src_vir_w = req->src.vir_w;
+	dst_vir_w = req->dst.vir_w;
+
+	buffer_src0 = &reg->dma_buffer_src0;
+	buffer_src1 = &reg->dma_buffer_src1;
+	buffer_dst = &reg->dma_buffer_dst;
+	buffer_els = &reg->dma_buffer_els;
+
+	if ((int)req->src.yrgb_addr > 0) {
+		hdl = ion_import_dma_buf(rga2_drvdata->ion_client,
+					 req->src.yrgb_addr);
+		if (IS_ERR(hdl)) {
+			ret = PTR_ERR(hdl);
+			pr_err("RGA2 SRC ERROR ion buf handle\n");
+			return ret;
+		}
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
+	if (RGA2_CHECK_MODE) {
+		vaddr = ion_map_kernel(rga2_drvdata->ion_client, hdl);
+		if (vaddr)
+			rga2_memory_check(vaddr, req->src.vir_w, req->src.vir_h,
+					  req->src.format, req->src.yrgb_addr);
+		ion_unmap_kernel(rga2_drvdata->ion_client, hdl);
+	}
+#endif
+		if (req->mmu_info.src0_mmu_flag) {
+			buffer_src0.sgt =
+				ion_sg_table(rga2_drvdata->ion_client, hdl);
+			req->src.yrgb_addr = req->src.uv_addr;
+			req->src.uv_addr =
+				req->src.yrgb_addr + (src_vir_w * req->src.vir_h);
+			req->src.v_addr =
+				req->src.uv_addr + (src_vir_w * req->src.vir_h) / 4;
+		} else {
+			ion_phys(rga2_drvdata->ion_client, hdl, &phy_addr, &len);
+			req->src.yrgb_addr = phy_addr;
+			req->src.uv_addr =
+				req->src.yrgb_addr + (src_vir_w * req->src.vir_h);
+			req->src.v_addr =
+				req->src.uv_addr + (src_vir_w * req->src.vir_h) / 4;
+		}
+		ion_free(rga2_drvdata->ion_client, hdl);
+	} else {
+		req->src.yrgb_addr = req->src.uv_addr;
+		req->src.uv_addr =
+			req->src.yrgb_addr + (src_vir_w * req->src.vir_h);
+		req->src.v_addr =
+			req->src.uv_addr + (src_vir_w * req->src.vir_h) / 4;
+	}
+
+	if ((int)req->dst.yrgb_addr > 0) {
+		hdl = ion_import_dma_buf(rga2_drvdata->ion_client,
+					 req->dst.yrgb_addr);
+		if (IS_ERR(hdl)) {
+			ret = PTR_ERR(hdl);
+			pr_err("RGA2 DST ERROR ion buf handle\n");
+			return ret;
+		}
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
+	if (RGA2_CHECK_MODE) {
+		vaddr = ion_map_kernel(rga2_drvdata->ion_client, hdl);
+		if (vaddr)
+			rga2_memory_check(vaddr, req->dst.vir_w, req->dst.vir_h,
+					  req->dst.format, req->dst.yrgb_addr);
+		ion_unmap_kernel(rga2_drvdata->ion_client, hdl);
+	}
+#endif
+		if (req->mmu_info.dst_mmu_flag) {
+			buffer_dst.sgt =
+				ion_sg_table(rga2_drvdata->ion_client, hdl);
+			req->dst.yrgb_addr = req->dst.uv_addr;
+			req->dst.uv_addr =
+				req->dst.yrgb_addr + (dst_vir_w * req->dst.vir_h);
+			req->dst.v_addr =
+				req->dst.uv_addr + (dst_vir_w * req->dst.vir_h) / 4;
+		} else {
+			ion_phys(rga2_drvdata->ion_client, hdl, &phy_addr, &len);
+			req->dst.yrgb_addr = phy_addr;
+			req->dst.uv_addr =
+				req->dst.yrgb_addr + (dst_vir_w * req->dst.vir_h);
+			req->dst.v_addr =
+				req->dst.uv_addr + (dst_vir_w * req->dst.vir_h) / 4;
+		}
+		ion_free(rga2_drvdata->ion_client, hdl);
+	} else {
+		req->dst.yrgb_addr = req->dst.uv_addr;
+		req->dst.uv_addr =
+			req->dst.yrgb_addr + (dst_vir_w * req->dst.vir_h);
+		req->dst.v_addr =
+			req->dst.uv_addr + (dst_vir_w * req->dst.vir_h) / 4;
+	}
+
+	if ((int)req->src1.yrgb_addr > 0) {
+		hdl = ion_import_dma_buf(rga2_drvdata->ion_client,
+					 req->src1.yrgb_addr);
+		if (IS_ERR(hdl)) {
+			ret = PTR_ERR(hdl);
+			pr_err("RGA2 ERROR ion buf handle\n");
+			return ret;
+		}
+		if (req->mmu_info.dst_mmu_flag) {
+			buffer_src1.sgt =
+				ion_sg_table(rga2_drvdata->ion_client, hdl);
+			req->src1.yrgb_addr = req->src1.uv_addr;
+			req->src1.uv_addr =
+				req->src1.yrgb_addr + (req->src1.vir_w * req->src1.vir_h);
+			req->src1.v_addr =
+				req->src1.uv_addr + (req->src1.vir_w * req->src1.vir_h) / 4;
+		} else {
+			ion_phys(rga2_drvdata->ion_client, hdl, &phy_addr, &len);
+			req->src1.yrgb_addr = phy_addr;
+			req->src1.uv_addr =
+				req->src1.yrgb_addr + (req->src1.vir_w * req->src1.vir_h);
+			req->src1.v_addr =
+				req->src1.uv_addr + (req->src1.vir_w * req->src1.vir_h) / 4;
+		}
+		ion_free(rga2_drvdata->ion_client, hdl);
+	} else {
+		req->src1.yrgb_addr = req->src1.uv_addr;
+		req->src1.uv_addr =
+			req->src1.yrgb_addr + (req->src1.vir_w * req->src1.vir_h);
+		req->src1.v_addr =
+			req->src1.uv_addr + (req->src1.vir_w * req->src1.vir_h) / 4;
+	}
+	if (rga2_is_yuv422p_format(req->src.format))
+		req->src.v_addr = req->src.uv_addr + (req->src.vir_w * req->src.vir_h) / 2;
+	if (rga2_is_yuv422p_format(req->dst.format))
+		req->dst.v_addr = req->dst.uv_addr + (req->dst.vir_w * req->dst.vir_h) / 2;
+	if (rga2_is_yuv422p_format(req->src1.format))
+		req->src1.v_addr = req->src1.uv_addr + (req->src1.vir_w * req->dst.vir_h) / 2;
+
+	return 0;
+}
+
+/* When the kernel version is lower than 4.4, no put buffer operation is required. */
+void rga2_put_dma_info(struct rga2_reg *reg) {}
+#endif
+
 static int rga2_mmu_buf_get(struct rga2_mmu_buf_t *t, uint32_t size)
 {
     mutex_lock(&rga2_service.lock);
@@ -597,6 +1026,7 @@ static int rga2_mmu_flush_cache(struct rga2_reg *reg, struct rga2_req *req)
 	int ret;
 	int status;
 	struct page **pages = NULL;
+	struct rga_dma_buffer_t *dma_buffer = NULL;
 
 	MMU_Base = NULL;
 	DstMemSize  = 0;
@@ -637,7 +1067,8 @@ static int rga2_mmu_flush_cache(struct rga2_reg *reg, struct rga2_req *req)
 
 	mutex_unlock(&rga2_service.lock);
 	if (DstMemSize) {
-		if (req->sg_dst) {
+		dma_buffer = &reg->dma_buffer_dst;
+		if (dma_buffer->sgt) {
 			status = -EINVAL;
 			goto out;
 		} else {
@@ -678,6 +1109,8 @@ static int rga2_mmu_info_BitBlt_mode(struct rga2_reg *reg, struct rga2_req *req)
 	int status;
 	uint32_t uv_size, v_size;
 	struct page **pages = NULL;
+	struct rga_dma_buffer_t *dma_buffer = NULL;
+
 	MMU_Base = NULL;
 	Src0MemSize = 0;
 	Src1MemSize = 0;
@@ -749,8 +1182,10 @@ static int rga2_mmu_info_BitBlt_mode(struct rga2_reg *reg, struct rga2_req *req)
 	mutex_unlock(&rga2_service.lock);
 
         if (Src0MemSize) {
-		if (req->sg_src0) {
-			ret = rga2_MapION(req->sg_src0,
+		dma_buffer = &reg->dma_buffer_src0;
+
+		if (dma_buffer->sgt) {
+			ret = rga2_MapION(dma_buffer->sgt,
 					  &MMU_Base[0], Src0MemSize);
 		} else {
 			ret = rga2_MapUserMemory(&pages[0], &MMU_Base[0],
@@ -788,9 +1223,12 @@ static int rga2_mmu_info_BitBlt_mode(struct rga2_reg *reg, struct rga2_req *req)
 		req->src.v_addr = (req->src.v_addr & (~PAGE_MASK)) |
 							(v_size << PAGE_SHIFT);
 	}
+
         if (Src1MemSize) {
-		if (req->sg_src1) {
-			ret = rga2_MapION(req->sg_src1,
+		dma_buffer = &reg->dma_buffer_src1;
+
+		if (dma_buffer->sgt) {
+			ret = rga2_MapION(dma_buffer->sgt,
 					MMU_Base + Src0MemSize, Src1MemSize);
 		} else {
 			ret = rga2_MapUserMemory(&pages[0],
@@ -813,8 +1251,10 @@ static int rga2_mmu_info_BitBlt_mode(struct rga2_reg *reg, struct rga2_req *req)
 		req->src1.yrgb_addr = (req->src1.yrgb_addr & (~PAGE_MASK));
 	}
         if (DstMemSize) {
-		if (req->sg_dst) {
-			ret = rga2_MapION(req->sg_dst, MMU_Base + Src0MemSize
+		dma_buffer = &reg->dma_buffer_dst;
+
+		if (dma_buffer->sgt) {
+			ret = rga2_MapION(dma_buffer->sgt, MMU_Base + Src0MemSize
 					  + Src1MemSize, DstMemSize);
 		} else if (req->alpha_mode_0 != 0 && req->bitblt_mode == 0) {
 			/* The blend mode of src + dst => dst requires clean and invalidate */
@@ -900,6 +1340,7 @@ static int rga2_mmu_info_color_palette_mode(struct rga2_reg *reg, struct rga2_re
 
     uint8_t shift;
     uint32_t sw, byte_num;
+    struct rga_dma_buffer_t *dma_buffer = NULL;
 
     shift = 3 - (req->palette_mode & 3);
     sw = req->src.vir_w*req->src.vir_h;
@@ -961,8 +1402,10 @@ static int rga2_mmu_info_color_palette_mode(struct rga2_reg *reg, struct rga2_re
         mutex_unlock(&rga2_service.lock);
 
         if(SrcMemSize) {
-            if (req->sg_src0) {
-                ret = rga2_MapION(req->sg_src0,
+            dma_buffer = &reg->dma_buffer_src0;
+
+            if (dma_buffer->sgt) {
+                ret = rga2_MapION(dma_buffer->sgt,
                 &MMU_Base[0], SrcMemSize);
             } else {
                 ret = rga2_MapUserMemory(&pages[0], &MMU_Base[0],
@@ -990,8 +1433,10 @@ static int rga2_mmu_info_color_palette_mode(struct rga2_reg *reg, struct rga2_re
         }
 
         if(DstMemSize) {
-            if (req->sg_dst) {
-                ret = rga2_MapION(req->sg_dst,
+            dma_buffer = &reg->dma_buffer_dst;
+
+	    if (dma_buffer->sgt) {
+                ret = rga2_MapION(dma_buffer->sgt,
                 MMU_Base + SrcMemSize, DstMemSize);
             } else {
                 ret = rga2_MapUserMemory(&pages[0], MMU_Base + SrcMemSize,
@@ -1045,6 +1490,7 @@ static int rga2_mmu_info_color_fill_mode(struct rga2_reg *reg, struct rga2_req *
     uint32_t *MMU_Base, *MMU_Base_phys;
     int ret;
     int status;
+    struct rga_dma_buffer_t *dma_buffer = NULL;
 
     DstMemSize = 0;
     DstPageCount = 0;
@@ -1082,8 +1528,10 @@ static int rga2_mmu_info_color_fill_mode(struct rga2_reg *reg, struct rga2_req *
         mutex_unlock(&rga2_service.lock);
 
         if (DstMemSize) {
-            if (req->sg_dst) {
-                ret = rga2_MapION(req->sg_dst, &MMU_Base[0], DstMemSize);
+            dma_buffer = &reg->dma_buffer_dst;
+
+            if (dma_buffer->sgt) {
+                ret = rga2_MapION(dma_buffer->sgt, &MMU_Base[0], DstMemSize);
             }
             else {
 		    ret = rga2_MapUserMemory(&pages[0], &MMU_Base[0],
@@ -1133,6 +1581,7 @@ static int rga2_mmu_info_update_palette_table_mode(struct rga2_reg *reg, struct
     uint32_t AllSize;
     uint32_t *MMU_Base, *MMU_Base_phys;
     int ret, status;
+    struct rga_dma_buffer_t *dma_buffer = NULL;
 
     MMU_Base = NULL;
     LutPageCount = 0;
@@ -1175,8 +1624,10 @@ static int rga2_mmu_info_update_palette_table_mode(struct rga2_reg *reg, struct
         mutex_unlock(&rga2_service.lock);
 
         if (LutMemSize) {
-            if (req->sg_els) {
-                ret = rga2_MapION(req->sg_els,
+            dma_buffer = &reg->dma_buffer_els;
+
+            if (dma_buffer->sgt) {
+                ret = rga2_MapION(dma_buffer->sgt,
                 &MMU_Base[0], LutMemSize);
             } else {
                 ret = rga2_MapUserMemory(&pages[0], &MMU_Base[0],
diff --git a/drivers/video/rockchip/rga2/rga2_mmu_info.h b/drivers/video/rockchip/rga2/rga2_mmu_info.h
index 6809a4f40230..a823f2fe7c3a 100644
--- a/drivers/video/rockchip/rga2/rga2_mmu_info.h
+++ b/drivers/video/rockchip/rga2/rga2_mmu_info.h
@@ -28,5 +28,8 @@ int rga2_set_mmu_info(struct rga2_reg *reg, struct rga2_req *req);
 void rga2_dma_flush_range(void *pstart, void *pend);
 dma_addr_t rga2_dma_flush_page(struct page *page, int map);
 
+int rga2_get_dma_info(struct rga2_reg *reg, struct rga2_req *req);
+void rga2_put_dma_info(struct rga2_reg *reg);
+
 #endif
 

commit 9f1d22a8f0c551bf2a9a1938bd35722c9b1ba9a7
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Thu Sep 16 18:19:12 2021 +0800

    regulator: xz3216: add resume function
    
    enable sleep vol when resume, if not reboot will failed after sleep out
    by vdd_cpu off
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: If56bc9894abb37b771ed1097e0deb73c679cc315

diff --git a/drivers/regulator/xz3216.c b/drivers/regulator/xz3216.c
index eff6ad48caa0..e3edd1099e94 100644
--- a/drivers/regulator/xz3216.c
+++ b/drivers/regulator/xz3216.c
@@ -216,6 +216,20 @@ static int xz3216_dcdc_set_suspend_mode(struct regulator_dev *dev,
 	}
 }
 
+static int xz3216_resume(struct regulator_dev *rdev)
+{
+	int ret;
+
+	if (!rdev->constraints->state_mem.changeable)
+		return 0;
+
+	ret = xz3216_dcdc_suspend_enable(rdev);
+	if (ret)
+		return ret;
+
+	return regulator_suspend_enable(rdev, PM_SUSPEND_MEM);
+}
+
 static const int slew_rates[] = {
 	64000,
 	32000,
@@ -263,6 +277,7 @@ static struct regulator_ops xz3216_dcdc_ops = {
 	.set_suspend_mode = xz3216_dcdc_set_suspend_mode,
 	.set_ramp_delay = xz3216_set_ramp,
 	.set_voltage_time_sel = regulator_set_voltage_time_sel,
+	.resume = xz3216_resume,
 };
 
 static int xz3216_regulator_register(struct xz3216 *xz3216, struct regulator_config *config)

commit 5f47c9f404c0a5ad530b5ecc07342ea64636cf89
Author: XiaoTan Luo <lxt@rock-chips.com>
Date:   Thu Sep 16 15:36:39 2021 +0800

    UPSTREAM: ASoC: hdmi-codec: Use set_jack ops to set jack
    
    Use set_jack ops to set jack so machine drivers do not need to
    includehdmi-codec.h explicitly.
    
    Signed-off-by: Cheng-Yi Chiang <cychiang@chromium.org>
    Reviewed-by: Tzung-Bi Shih <tzungbi@google.com>
    Link:https://lore.kernel.org/r/20200922062316.1172935-1-cychiang@chromium.org
    Signed-off-by: Mark Brown <broonie@kernel.org>
    (cherry picked from commit 55c5cc63ab3277aa20637dc20f6528987ac23743)
    
    Change-Id: I5717c3e47ac9a8feb05b830b159c9ac9224f4136
    Signed-off-by: XiaoTan Luo <lxt@rock-chips.com>

diff --git a/include/sound/hdmi-codec.h b/include/sound/hdmi-codec.h
index 0ee30ad26788..8506cee97d25 100644
--- a/include/sound/hdmi-codec.h
+++ b/include/sound/hdmi-codec.h
@@ -128,9 +128,6 @@ struct hdmi_codec_pdata {
 struct snd_soc_component;
 struct snd_soc_jack;
 
-int hdmi_codec_set_jack_detect(struct snd_soc_component *component,
-			       struct snd_soc_jack *jack);
-
 #define HDMI_CODEC_DRV_NAME "hdmi-audio-codec"
 
 #endif /* __HDMI_CODEC_H__ */
diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c
index 6bc4b1627445..c46cb441076f 100644
--- a/sound/soc/codecs/hdmi-codec.c
+++ b/sound/soc/codecs/hdmi-codec.c
@@ -773,13 +773,9 @@ static void plugged_cb(struct device *dev, bool plugged)
 		hdmi_codec_jack_report(hcp, 0);
 }
 
-/**
- * hdmi_codec_set_jack_detect - register HDMI plugged callback
- * @component: the hdmi-codec instance
- * @jack: ASoC jack to report (dis)connection events on
- */
-int hdmi_codec_set_jack_detect(struct snd_soc_component *component,
-			       struct snd_soc_jack *jack)
+static int hdmi_codec_set_jack(struct snd_soc_component *component,
+			       struct snd_soc_jack *jack,
+			       void *data)
 {
 	struct hdmi_codec_priv *hcp = snd_soc_component_get_drvdata(component);
 	int ret = -EOPNOTSUPP;
@@ -795,7 +791,6 @@ int hdmi_codec_set_jack_detect(struct snd_soc_component *component,
 	}
 	return ret;
 }
-EXPORT_SYMBOL_GPL(hdmi_codec_set_jack_detect);
 
 static const struct snd_soc_dai_driver hdmi_i2s_dai = {
 	.name = "i2s-hifi",
@@ -848,6 +843,7 @@ static const struct snd_soc_component_driver hdmi_driver = {
 	.use_pmdown_time	= 1,
 	.endianness		= 1,
 	.non_legacy_dai_naming	= 1,
+	.set_jack		= hdmi_codec_set_jack,
 };
 
 static int hdmi_codec_probe(struct platform_device *pdev)

commit 0315c89b253e5f90b2367b0834629ce0e2f365e6
Author: Cheng-Yi Chiang <cychiang@chromium.org>
Date:   Mon Oct 28 15:19:25 2019 +0800

    UPSTREAM: drm: bridge: dw-hdmi: Report connector status using callback
    
    Allow codec driver register callback function for plug event.
    
    The callback registration flow:
    dw-hdmi <--- hw-hdmi-i2s-audio <--- hdmi-codec
    
    dw-hdmi-i2s-audio implements hook_plugged_cb op
    so codec driver can register the callback.
    
    dw-hdmi exports a function dw_hdmi_set_plugged_cb so platform device
    can register the callback.
    
    When connector plug/unplug event happens, report this event using the
    callback.
    
    Make sure that audio and drm are using the single source of truth for
    connector status.
    
    Signed-off-by: Cheng-Yi Chiang <cychiang@chromium.org>
    Link: https://lore.kernel.org/r/20191028071930.145899-2-cychiang@chromium.org
    Signed-off-by: Mark Brown <broonie@kernel.org>
    (cherry picked from commit a9c82d63ca4819d3d03964dbf4aa427b36c5a67f)
    
    Change-Id: Ieea468bf53165e2436996b453b048db049bcbf67
    Signed-off-by: XiaoTan Luo <lxt@rock-chips.com>

diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c
index 0343bfbdba0f..507cb76122fe 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c
@@ -237,10 +237,21 @@ static int dw_hdmi_i2s_get_dai_id(struct snd_soc_component *component,
 	return -EINVAL;
 }
 
+static int dw_hdmi_i2s_hook_plugged_cb(struct device *dev, void *data,
+				       hdmi_codec_plugged_cb fn,
+				       struct device *codec_dev)
+{
+	struct dw_hdmi_i2s_audio_data *audio = data;
+	struct dw_hdmi *hdmi = audio->hdmi;
+
+	return dw_hdmi_set_plugged_cb(hdmi, fn, codec_dev);
+}
+
 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,
 };
 
 static int snd_dw_hdmi_probe(struct platform_device *pdev)
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index d68476f6c121..f620b817a95a 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -358,6 +358,9 @@ struct dw_hdmi {
 	struct cec_notifier *cec_notifier;
 
 	bool initialized;		/* hdmi is enabled before bind */
+	hdmi_codec_plugged_cb plugged_cb;
+	struct device *codec_dev;
+	enum drm_connector_status last_connector_result;
 };
 
 #define HDMI_IH_PHY_STAT0_RX_SENSE \
@@ -382,6 +385,28 @@ static inline u8 hdmi_readb(struct dw_hdmi *hdmi, int offset)
 	return val;
 }
 
+static void handle_plugged_change(struct dw_hdmi *hdmi, bool plugged)
+{
+	if (hdmi->plugged_cb && hdmi->codec_dev)
+		hdmi->plugged_cb(hdmi->codec_dev, plugged);
+}
+
+int dw_hdmi_set_plugged_cb(struct dw_hdmi *hdmi, hdmi_codec_plugged_cb fn,
+			   struct device *codec_dev)
+{
+	bool plugged;
+
+	mutex_lock(&hdmi->mutex);
+	hdmi->plugged_cb = fn;
+	hdmi->codec_dev = codec_dev;
+	plugged = hdmi->last_connector_result == connector_status_connected;
+	handle_plugged_change(hdmi, plugged);
+	mutex_unlock(&hdmi->mutex);
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(dw_hdmi_set_plugged_cb);
+
 static void hdmi_modb(struct dw_hdmi *hdmi, u8 data, u8 mask, unsigned reg)
 {
 	regmap_update_bits(hdmi->regm, reg << hdmi->reg_shift, mask, data);
@@ -2687,7 +2712,7 @@ dw_hdmi_connector_detect(struct drm_connector *connector, bool force)
 {
 	struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi,
 					     connector);
-	int connect_status;
+	enum drm_connector_status result;
 
 	if (!hdmi->force_logo) {
 		mutex_lock(&hdmi->mutex);
@@ -2697,13 +2722,21 @@ dw_hdmi_connector_detect(struct drm_connector *connector, bool force)
 		mutex_unlock(&hdmi->mutex);
 	}
 
-	connect_status = hdmi->phy.ops->read_hpd(hdmi, hdmi->phy.data);
-	if (connect_status == connector_status_connected)
+	result = hdmi->phy.ops->read_hpd(hdmi, hdmi->phy.data);
+	if (result == connector_status_connected)
 		extcon_set_state_sync(hdmi->extcon, EXTCON_DISP_HDMI, true);
 	else
 		extcon_set_state_sync(hdmi->extcon, EXTCON_DISP_HDMI, false);
 
-	return connect_status;
+	mutex_lock(&hdmi->mutex);
+	if (result != hdmi->last_connector_result) {
+		dev_dbg(hdmi->dev, "read_hpd result: %d", result);
+		handle_plugged_change(hdmi,
+				result == connector_status_connected);
+		hdmi->last_connector_result = result;
+	}
+	mutex_unlock(&hdmi->mutex);
+	return result;
 }
 
 static int
@@ -3807,6 +3840,7 @@ __dw_hdmi_probe(struct platform_device *pdev,
 	hdmi->rxsense = true;
 	hdmi->phy_mask = (u8)~(HDMI_PHY_HPD | HDMI_PHY_RX_SENSE);
 	hdmi->mc_clkdis = 0x7f;
+	hdmi->last_connector_result = connector_status_disconnected;
 
 	mutex_init(&hdmi->mutex);
 	mutex_init(&hdmi->audio_mutex);
diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h
index 12451542a2ec..ad0b7499949c 100644
--- a/include/drm/bridge/dw_hdmi.h
+++ b/include/drm/bridge/dw_hdmi.h
@@ -11,6 +11,7 @@
 #define __DW_HDMI__
 
 #include <drm/drmP.h>
+#include <sound/hdmi-codec.h>
 
 struct dw_hdmi;
 
@@ -197,6 +198,8 @@ void dw_hdmi_resume(struct device *dev, struct dw_hdmi *hdmi);
 
 void dw_hdmi_setup_rx_sense(struct dw_hdmi *hdmi, bool hpd, bool rx_sense);
 
+int dw_hdmi_set_plugged_cb(struct dw_hdmi *hdmi, hdmi_codec_plugged_cb fn,
+			   struct device *codec_dev);
 void dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate);
 void dw_hdmi_audio_enable(struct dw_hdmi *hdmi);
 void dw_hdmi_audio_disable(struct dw_hdmi *hdmi);

commit 3bfb85ec203444419c1dd68fca8e6c768817d8ca
Author: Cheng-Yi Chiang <cychiang@chromium.org>
Date:   Wed Jul 17 16:33:23 2019 +0800

    UPSTREAM: ASoC: hdmi-codec: Add an op to set callback function for plug event
    
    Add an op in hdmi_codec_ops so codec driver can register callback
    function to handle plug event.
    
    Driver in DRM can use this callback function to report connector status.
    
    Signed-off-by: Cheng-Yi Chiang <cychiang@chromium.org>
    Link: https://lore.kernel.org/r/20190717083327.47646-2-cychiang@chromium.org
    Reviewed-by: Tzung-Bi Shih <tzungbi@google.com>
    Signed-off-by: Mark Brown <broonie@kernel.org>
    (cherry picked from commit 6fa5963c37a2e3335eba0b7455e35a01318ebc15)
    
    Change-Id: I5f4a931c3b91c2b230ce5a61b60f191628d93105
    Signed-off-by: XiaoTan Luo <lxt@rock-chips.com>

diff --git a/include/sound/hdmi-codec.h b/include/sound/hdmi-codec.h
index 52d16ded8c21..0ee30ad26788 100644
--- a/include/sound/hdmi-codec.h
+++ b/include/sound/hdmi-codec.h
@@ -62,6 +62,9 @@ enum {
 	HBR,
 };
 
+typedef void (*hdmi_codec_plugged_cb)(struct device *dev,
+				      bool plugged);
+
 struct hdmi_codec_pdata;
 struct hdmi_codec_ops {
 	/*
@@ -103,6 +106,14 @@ struct hdmi_codec_ops {
 	 */
 	int (*get_dai_id)(struct snd_soc_component *comment,
 			  struct device_node *endpoint);
+
+	/*
+	 * Hook callback function to handle connector plug event.
+	 * Optional
+	 */
+	int (*hook_plugged_cb)(struct device *dev, void *data,
+			       hdmi_codec_plugged_cb fn,
+			       struct device *codec_dev);
 };
 
 /* HDMI codec initalization data */
@@ -114,6 +125,12 @@ struct hdmi_codec_pdata {
 	void *data;
 };
 
+struct snd_soc_component;
+struct snd_soc_jack;
+
+int hdmi_codec_set_jack_detect(struct snd_soc_component *component,
+			       struct snd_soc_jack *jack);
+
 #define HDMI_CODEC_DRV_NAME "hdmi-audio-codec"
 
 #endif /* __HDMI_CODEC_H__ */
diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c
index 77203706c2d5..6bc4b1627445 100644
--- a/sound/soc/codecs/hdmi-codec.c
+++ b/sound/soc/codecs/hdmi-codec.c
@@ -15,6 +15,7 @@
 #include <linux/module.h>
 #include <linux/string.h>
 #include <sound/core.h>
+#include <sound/jack.h>
 #include <sound/pcm.h>
 #include <sound/pcm_params.h>
 #include <sound/soc.h>
@@ -286,6 +287,8 @@ struct hdmi_codec_priv {
 	struct snd_pcm_chmap *chmap_info;
 	unsigned int chmap_idx;
 	unsigned int mode;
+	struct snd_soc_jack *jack;
+	unsigned int jack_status;
 };
 
 static const struct snd_soc_dapm_widget hdmi_widgets[] = {
@@ -751,6 +754,49 @@ static int hdmi_dai_probe(struct snd_soc_dai *dai)
 	return snd_soc_dapm_add_routes(dapm, &route, 1);
 }
 
+static void hdmi_codec_jack_report(struct hdmi_codec_priv *hcp,
+				   unsigned int jack_status)
+{
+	if (hcp->jack && jack_status != hcp->jack_status) {
+		snd_soc_jack_report(hcp->jack, jack_status, SND_JACK_LINEOUT);
+		hcp->jack_status = jack_status;
+	}
+}
+
+static void plugged_cb(struct device *dev, bool plugged)
+{
+	struct hdmi_codec_priv *hcp = dev_get_drvdata(dev);
+
+	if (plugged)
+		hdmi_codec_jack_report(hcp, SND_JACK_LINEOUT);
+	else
+		hdmi_codec_jack_report(hcp, 0);
+}
+
+/**
+ * hdmi_codec_set_jack_detect - register HDMI plugged callback
+ * @component: the hdmi-codec instance
+ * @jack: ASoC jack to report (dis)connection events on
+ */
+int hdmi_codec_set_jack_detect(struct snd_soc_component *component,
+			       struct snd_soc_jack *jack)
+{
+	struct hdmi_codec_priv *hcp = snd_soc_component_get_drvdata(component);
+	int ret = -EOPNOTSUPP;
+
+	if (hcp->hcd.ops->hook_plugged_cb) {
+		hcp->jack = jack;
+		ret = hcp->hcd.ops->hook_plugged_cb(component->dev->parent,
+						    hcp->hcd.data,
+						    plugged_cb,
+						    component->dev);
+		if (ret)
+			hcp->jack = NULL;
+	}
+	return ret;
+}
+EXPORT_SYMBOL_GPL(hdmi_codec_set_jack_detect);
+
 static const struct snd_soc_dai_driver hdmi_i2s_dai = {
 	.name = "i2s-hifi",
 	.id = DAI_ID_I2S,

commit 77dd1a64ea3cced893ce504771213e34bd358e8d
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Mon Sep 13 14:58:01 2021 +0800

    media: rockchip: cif: build depends on CPU config
    
    When build with rv1126_defconfig:
    
    before:
       text    data     bss     dec     hex filename
       7820     144       0    7964    1f1c drivers/media/platform/rockchip/cif/hw.o
    
    after:
       text    data     bss     dec     hex filename
       4301     144       0    4445    115d drivers/media/platform/rockchip/cif/hw.o
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: I0dee5f7f43da3eb58a65342319ccb77b5501e0ce

diff --git a/drivers/media/platform/rockchip/cif/hw.c b/drivers/media/platform/rockchip/cif/hw.c
index 4181e0d135d6..8eb1059d18c2 100644
--- a/drivers/media/platform/rockchip/cif/hw.c
+++ b/drivers/media/platform/rockchip/cif/hw.c
@@ -680,34 +680,49 @@ static const struct rkcif_hw_match_data rk3568_cif_match_data = {
 
 
 static const struct of_device_id rkcif_plat_of_match[] = {
+#ifdef CONFIG_CPU_PX30
 	{
 		.compatible = "rockchip,px30-cif",
 		.data = &px30_cif_match_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RK1808
 	{
 		.compatible = "rockchip,rk1808-cif",
 		.data = &rk1808_cif_match_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RK312X
 	{
 		.compatible = "rockchip,rk3128-cif",
 		.data = &rk3128_cif_match_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3288
 	{
 		.compatible = "rockchip,rk3288-cif",
 		.data = &rk3288_cif_match_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3328
 	{
 		.compatible = "rockchip,rk3328-cif",
 		.data = &rk3328_cif_match_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3368
 	{
 		.compatible = "rockchip,rk3368-cif",
 		.data = &rk3368_cif_match_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3568
 	{
 		.compatible = "rockchip,rk3568-cif",
 		.data = &rk3568_cif_match_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RV1126
 	{
 		.compatible = "rockchip,rv1126-cif",
 		.data = &rv1126_cif_match_data,
@@ -716,6 +731,7 @@ static const struct of_device_id rkcif_plat_of_match[] = {
 		.compatible = "rockchip,rv1126-cif-lite",
 		.data = &rv1126_cif_lite_match_data,
 	},
+#endif
 	{},
 };
 

commit 1a0176f009ee3c9e6a9c6dd0db81146140b13d9e
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Mon Sep 13 14:40:58 2021 +0800

    net: stmmac: dwmac-rk: build depends on CPU config
    
    When build with rv1126_defconfig:
    
    before:
       text    data     bss     dec     hex filename
      17063     144       0   17207    4337 drivers/net/ethernet/stmicro/stmmac/dwmac-rk.o
    
    after:
       text    data     bss     dec     hex filename
       7387     144       0    7531    1d6b drivers/net/ethernet/stmicro/stmmac/dwmac-rk.o
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: I941f79357f686f5d35e727abea2fe26c4ea0dafa

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index daab8994994a..c3a382faec58 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -2226,19 +2226,45 @@ static int rk_gmac_resume(struct device *dev)
 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_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);

commit 5fa24759c092747916ba960494fc0a1c0d624667
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Mon Sep 13 14:26:39 2021 +0800

    soc: rockchip: pvtm: build depends on CPU config
    
    When build with rv1126_defconfig:
    
    before:
       text    data     bss     dec     hex filename
       8796     156       4    8956    22fc drivers/soc/rockchip/rockchip_pvtm.o
    
    after:
       text    data     bss     dec     hex filename
       4508     156       4    4668    123c drivers/soc/rockchip/rockchip_pvtm.o
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: I8c49713ebc48586aa4f08fb3ec965890c2beb1a2

diff --git a/drivers/soc/rockchip/rockchip_pvtm.c b/drivers/soc/rockchip/rockchip_pvtm.c
index 4cc6923b8eb8..d9ff745d699c 100644
--- a/drivers/soc/rockchip/rockchip_pvtm.c
+++ b/drivers/soc/rockchip/rockchip_pvtm.c
@@ -627,6 +627,7 @@ static const struct rockchip_pvtm_data rv1126_pmupvtm = {
 };
 
 static const struct of_device_id rockchip_pvtm_match[] = {
+#ifdef CONFIG_CPU_PX30
 	{
 		.compatible = "rockchip,px30-pvtm",
 		.data = (void *)&px30_pvtm,
@@ -635,6 +636,8 @@ static const struct of_device_id rockchip_pvtm_match[] = {
 		.compatible = "rockchip,px30-pmu-pvtm",
 		.data = (void *)&px30_pmupvtm,
 	},
+#endif
+#ifdef CONFIG_CPU_RK1808
 	{
 		.compatible = "rockchip,rk1808-pvtm",
 		.data = (void *)&rk1808_pvtm,
@@ -647,10 +650,14 @@ static const struct of_device_id rockchip_pvtm_match[] = {
 		.compatible = "rockchip,rk1808-npu-pvtm",
 		.data = (void *)&rk1808_npupvtm,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3288
 	{
 		.compatible = "rockchip,rk3288-pvtm",
 		.data = (void *)&rk3288_pvtm,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3308
 	{
 		.compatible = "rockchip,rk3308-pvtm",
 		.data = (void *)&px30_pvtm,
@@ -659,6 +666,8 @@ static const struct of_device_id rockchip_pvtm_match[] = {
 		.compatible = "rockchip,rk3308-pmu-pvtm",
 		.data = (void *)&rk3308_pmupvtm,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3399
 	{
 		.compatible = "rockchip,rk3399-pvtm",
 		.data = (void *)&rk3399_pvtm,
@@ -667,6 +676,8 @@ static const struct of_device_id rockchip_pvtm_match[] = {
 		.compatible = "rockchip,rk3399-pmu-pvtm",
 		.data = (void *)&rk3399_pmupvtm,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3568
 	{
 		.compatible = "rockchip,rK3568-core-pvtm",
 		.data = (void *)&rk3568_corepvtm,
@@ -679,6 +690,8 @@ static const struct of_device_id rockchip_pvtm_match[] = {
 		.compatible = "rockchip,rk3568-npu-pvtm",
 		.data = (void *)&rk3568_npupvtm,
 	},
+#endif
+#ifdef CONFIG_CPU_RV1126
 	{
 		.compatible = "rockchip,rv1126-cpu-pvtm",
 		.data = (void *)&rv1126_cpupvtm,
@@ -691,6 +704,7 @@ static const struct of_device_id rockchip_pvtm_match[] = {
 		.compatible = "rockchip,rv1126-pmu-pvtm",
 		.data = (void *)&rv1126_pmupvtm,
 	},
+#endif
 	{ /* sentinel */ },
 };
 MODULE_DEVICE_TABLE(of, rockchip_pvtm_match);

commit c6fc171e09575e94726a2db51dcf9377a4867b74
Author: Meiyou Chen <cmy@rock-chips.com>
Date:   Mon Sep 13 15:48:49 2021 +0800

    arm64: dts: rockchip: rk3399-ind: tc358749x use dummy codec
    
    Signed-off-by: Meiyou Chen <cmy@rock-chips.com>
    Change-Id: Id6213f44e64cd92b0369f8dfdb411bba9b108930

diff --git a/arch/arm64/boot/dts/rockchip/rk3399-evb-ind.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-evb-ind.dtsi
index 0f809f490d5f..ae44c42b9196 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-evb-ind.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399-evb-ind.dtsi
@@ -206,6 +206,11 @@
 		status = "okay";
 	};
 
+	dummy_codec: dummy-codec {
+		compatible = "rockchip,dummy-codec";
+		#sound-dai-cells = <0>;
+	};
+
 	tc358749x_sound:tc358749x-sound {
 		status = "okay";
 		compatible = "simple-audio-card";
@@ -214,10 +219,10 @@
 		simple-audio-card,bitclock-master = <&sound0_master>;
 		simple-audio-card,frame-master = <&sound0_master>;
 		simple-audio-card,cpu {
-				sound-dai = <&i2s0>;
+			sound-dai = <&i2s0>;
 		};
 		sound0_master: simple-audio-card,codec {
-				sound-dai = <&tc358749x>;
+			sound-dai = <&dummy_codec>;
 		};
 	};
 

commit 6c37d44def623913dba9e4d259be04b5d70bd3ee
Author: Douglas Anderson <dianders@chromium.org>
Date:   Wed Apr 17 17:13:52 2019 -0700

    BACKPORT: usb: dwc2: bus suspend/resume for hosts with DWC2_POWER_DOWN_PARAM_NONE
    
    This is an attempt to rehash commit 0cf884e819e0 ("usb: dwc2: add bus
    suspend/resume for dwc2") on ToT.  That commit was reverted in commit
    b0bb9bb6ce01 ("Revert "usb: dwc2: add bus suspend/resume for dwc2"")
    because apparently it broke the Altera SOCFPGA.
    
    With all the changes that have happened to dwc2 in the meantime, it's
    possible that the Altera SOCFPGA will just magically work with this
    change now.  ...and it would be good to get bus suspend/resume
    implemented.
    
    This change is a forward port of one that's been living in the Chrome
    OS 3.14 kernel tree.
    
    Signed-off-by: Douglas Anderson <dianders@chromium.org>
    Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
    Signed-off-by: William Wu <william.wu@rock-chips.com>
    Change-Id: Iba408750729ce6c8f1cb0c94a5e8891c7b240014
    (cherry picked from commit 6f6d70597c15b2a406afa541517e6ad35f56a8a3)

diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c
index 2e079cfb9938..1e4702eefd09 100644
--- a/drivers/usb/dwc2/hcd.c
+++ b/drivers/usb/dwc2/hcd.c
@@ -4523,6 +4523,7 @@ static int _dwc2_hcd_suspend(struct usb_hcd *hcd)
 	unsigned long flags;
 	int ret = 0;
 	u32 hprt0;
+	u32 pcgctl;
 
 	spin_lock_irqsave(&hsotg->lock, flags);
 
@@ -4538,30 +4539,46 @@ static int _dwc2_hcd_suspend(struct usb_hcd *hcd)
 	if (hsotg->op_state == OTG_STATE_B_PERIPHERAL)
 		goto unlock;
 
-	if (hsotg->params.power_down != DWC2_POWER_DOWN_PARAM_PARTIAL)
-		goto skip_power_saving;
-
 	/*
 	 * Drive USB suspend and disable port Power
 	 * if usb bus is not suspended.
 	 */
 	if (!hsotg->bus_suspended) {
 		hprt0 = dwc2_read_hprt0(hsotg);
-		hprt0 |= HPRT0_SUSP;
-		hprt0 &= ~HPRT0_PWR;
-		dwc2_writel(hsotg, hprt0, HPRT0);
-		spin_unlock_irqrestore(&hsotg->lock, flags);
-		dwc2_vbus_supply_exit(hsotg);
-		spin_lock_irqsave(&hsotg->lock, flags);
+		if (hprt0 & HPRT0_CONNSTS) {
+			hprt0 |= HPRT0_SUSP;
+			if (hsotg->params.power_down ==
+			    DWC2_POWER_DOWN_PARAM_PARTIAL)
+				hprt0 &= ~HPRT0_PWR;
+			dwc2_writel(hsotg, hprt0, HPRT0);
+			hsotg->bus_suspended = true;
+		}
+		if (hsotg->params.power_down == DWC2_POWER_DOWN_PARAM_PARTIAL) {
+			spin_unlock_irqrestore(&hsotg->lock, flags);
+			dwc2_vbus_supply_exit(hsotg);
+			spin_lock_irqsave(&hsotg->lock, flags);
+		} else {
+			pcgctl = dwc2_readl(hsotg, PCGCTL);
+			pcgctl |= PCGCTL_STOPPCLK;
+			dwc2_writel(hsotg, pcgctl, PCGCTL);
+		}
 	}
 
-	/* Enter partial_power_down */
-	ret = dwc2_enter_partial_power_down(hsotg);
-	if (ret) {
-		if (ret != -ENOTSUPP)
-			dev_err(hsotg->dev,
-				"enter partial_power_down failed\n");
-		goto skip_power_saving;
+	if (hsotg->params.power_down == DWC2_POWER_DOWN_PARAM_PARTIAL) {
+		/* Enter partial_power_down */
+		ret = dwc2_enter_partial_power_down(hsotg);
+		if (ret) {
+			if (ret != -ENOTSUPP)
+				dev_err(hsotg->dev,
+					"enter partial_power_down failed\n");
+			goto skip_power_saving;
+		}
+
+		/*
+		 * After entering partial_power_down,
+		 * hardware is no more accessible.
+		 */
+		clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
 	}
 
 	/* Ask phy to be suspended */
@@ -4571,9 +4588,6 @@ static int _dwc2_hcd_suspend(struct usb_hcd *hcd)
 		spin_lock_irqsave(&hsotg->lock, flags);
 	}
 
-	/* After entering partial_power_down, hardware is no more accessible */
-	clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
-
 skip_power_saving:
 	hsotg->lx_state = DWC2_L2;
 unlock:
@@ -4587,6 +4601,7 @@ static int _dwc2_hcd_resume(struct usb_hcd *hcd)
 	struct dwc2_hsotg *hsotg = dwc2_hcd_to_hsotg(hcd);
 	unsigned long flags;
 	int ret = 0;
+	u32 pcgctl;
 
 	spin_lock_irqsave(&hsotg->lock, flags);
 
@@ -4596,17 +4611,6 @@ static int _dwc2_hcd_resume(struct usb_hcd *hcd)
 	if (hsotg->lx_state != DWC2_L2)
 		goto unlock;
 
-	if (hsotg->params.power_down != DWC2_POWER_DOWN_PARAM_PARTIAL) {
-		hsotg->lx_state = DWC2_L0;
-		goto unlock;
-	}
-
-	/*
-	 * Set HW accessible bit before powering on the controller
-	 * since an interrupt may rise.
-	 */
-	set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
-
 	/*
 	 * Enable power if not already done.
 	 * This must not be spinlocked since duration
@@ -4618,10 +4622,22 @@ static int _dwc2_hcd_resume(struct usb_hcd *hcd)
 		spin_lock_irqsave(&hsotg->lock, flags);
 	}
 
-	/* Exit partial_power_down */
-	ret = dwc2_exit_partial_power_down(hsotg, true);
-	if (ret && (ret != -ENOTSUPP))
-		dev_err(hsotg->dev, "exit partial_power_down failed\n");
+	if (hsotg->params.power_down == DWC2_POWER_DOWN_PARAM_PARTIAL) {
+		/*
+		 * Set HW accessible bit before powering on the controller
+		 * since an interrupt may rise.
+		 */
+		set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
+
+		/* Exit partial_power_down */
+		ret = dwc2_exit_partial_power_down(hsotg, true);
+		if (ret && (ret != -ENOTSUPP))
+			dev_err(hsotg->dev, "exit partial_power_down failed\n");
+	} else {
+		pcgctl = dwc2_readl(hsotg, PCGCTL);
+		pcgctl &= ~PCGCTL_STOPPCLK;
+		dwc2_writel(hsotg, pcgctl, PCGCTL);
+	}
 
 	hsotg->lx_state = DWC2_L0;
 
@@ -4633,10 +4649,15 @@ static int _dwc2_hcd_resume(struct usb_hcd *hcd)
 		spin_unlock_irqrestore(&hsotg->lock, flags);
 		dwc2_port_resume(hsotg);
 	} else {
-		dwc2_vbus_supply_init(hsotg);
+		if (hsotg->params.power_down == DWC2_POWER_DOWN_PARAM_PARTIAL) {
+			dwc2_vbus_supply_init(hsotg);
 
-		/* Wait for controller to correctly update D+/D- level */
-		usleep_range(3000, 5000);
+			/*
+			 * Wait for controller to correctly
+			 * update D+/D- level.
+			 */
+			usleep_range(3000, 5000);
+		}
 
 		/*
 		 * Clear Port Enable and Port Status changes.

commit 0d97d2220bb896727de46af06f44f91ec1917a6e
Author: Finley Xiao <finley.xiao@rock-chips.com>
Date:   Wed Sep 15 15:32:35 2021 +0800

    arm64: dts: rockchip: rk3308b-evb-v10: Remove invalid configuration for tsadc
    
    Change-Id: I9eecd97f7a4df74f696fa6c8e337829800d3fcd0
    Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3308b-evb-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3308b-evb-v10.dtsi
index 69af6280d7ef..f98925f1b5bd 100644
--- a/arch/arm64/boot/dts/rockchip/rk3308b-evb-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3308b-evb-v10.dtsi
@@ -743,10 +743,6 @@
 &tsadc {
 	rockchip,hw-tshut-mode = <0>; /* tshut mode 0:CRU 1:GPIO */
 	rockchip,hw-tshut-polarity = <1>; /* tshut polarity 0:LOW 1:HIGH */
-	pinctrl-names = "init", "default", "sleep";
-	pinctrl-0 = <&tsadc_otp_gpio>;
-	pinctrl-1 = <&tsadc_otp_gpio>;
-	pinctrl-2 = <&tsadc_otp_gpio>;
 	status = "okay";
 };
 

commit 955acd592f3aed82a04a9fa2a71a43a54a646322
Author: Wang Panzhenzhuan <randy.wang@rock-chips.com>
Date:   Tue Jun 29 17:01:47 2021 +0800

    media: i2c: nvp6158: add workqueue & more resolution support
    
    1. add workqueue to detect ahd state.
    2. add following resolution support:
        AHD30_3M_18P //2048 x 1536@18
        AHD30_4M_15P //2560x1440@15
        AHD30_4M_30P //2560x1440@30
        AHD30_5M_12_5P //2592x 1944 @12.5
        AHD30_5M_20P //2592x 1944 @20
        AHD30_8M_7_5P //3840x2160 @7.5
        AHD30_8M_15P //3840x2160 @15
    
    Signed-off-by: Wang Panzhenzhuan <randy.wang@rock-chips.com>
    Change-Id: I6c7b762cacefe7de473a63cb275e1861c9ef096b

diff --git a/drivers/media/i2c/nvp6158_drv/nvp6158_drv.c b/drivers/media/i2c/nvp6158_drv/nvp6158_drv.c
index f0321179fb3f..b9bb7312a980 100644
--- a/drivers/media/i2c/nvp6158_drv/nvp6158_drv.c
+++ b/drivers/media/i2c/nvp6158_drv/nvp6158_drv.c
@@ -352,7 +352,7 @@ unsigned int nvp6158_g_vloss=0xFFFF;
 
 long nvp6158_native_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
-	unsigned int __user *argp = (unsigned int __user *)arg;	
+	unsigned int __user *argp = (unsigned int __user *)arg;
 	int cpy2usr_ret;
 	unsigned char i;
 	//unsigned char oCableDistance = 0;
@@ -743,7 +743,7 @@ void nvp6158_set_bt1120_1080P_mode(void)
 }
 #endif
 
-void nvp6158_start(video_init_all *video_init)
+void nvp6158_start(video_init_all *video_init, bool dual_edge)
 {
 	unsigned char ch = 0;
 	int chip = 0;
@@ -765,59 +765,75 @@ void nvp6158_start(video_init_all *video_init)
 	{
 		/* normal output */
 		case AHD20_720P_25P:
-			for(ch=0;ch<nvp6158_cnt*4;ch++)
-			{
-				nvp6158_set_chnmode(ch, AHD20_720P_25P); 
-			}
+			for (ch = 0; ch < nvp6158_cnt * 4; ch++)
+				nvp6158_set_chnmode(ch, AHD20_720P_25P);
 			break;
 		case AHD20_720P_30P:
-			for(ch=0;ch<nvp6158_cnt*4;ch++)
-			{
-				nvp6158_set_chnmode(ch, AHD20_720P_30P); 
-			}
+			for (ch = 0; ch < nvp6158_cnt * 4; ch++)
+				nvp6158_set_chnmode(ch, AHD20_720P_30P);
 			break;
 		case AHD20_1080P_25P:
-			for(ch=0;ch<nvp6158_cnt*4;ch++)
-			{
-				nvp6158_set_chnmode(ch, AHD20_1080P_25P); 
-			}
+			for (ch = 0; ch < nvp6158_cnt * 4; ch++)
+				nvp6158_set_chnmode(ch, AHD20_1080P_25P);
 			break;
 		case AHD20_1080P_30P:
-			for(ch=0;ch<nvp6158_cnt*4;ch++)
-			{
-				nvp6158_set_chnmode(ch, AHD20_1080P_30P); 
+			for (ch = 0; ch < nvp6158_cnt * 4; ch++)
+				nvp6158_set_chnmode(ch, AHD20_1080P_30P);
+			break;
+		case AHD30_3M_18P:
+			for (ch = 0; ch < nvp6158_cnt * 4; ch++) {
+				if (dual_edge)
+					nvp6158_set_chnmode(ch, AHD30_3M_30P);
+				else
+					nvp6158_set_chnmode(ch, AHD30_3M_18P);
+
 			}
 			break;
+		case AHD30_4M_15P:
+			for (ch = 0; ch < nvp6158_cnt * 4; ch++) {
+				if (dual_edge)
+					nvp6158_set_chnmode(ch, AHD30_4M_30P);
+				else
+					nvp6158_set_chnmode(ch, AHD30_4M_15P);
+			}
+			break;
+		case AHD30_5M_12_5P:
+			for (ch = 0; ch < nvp6158_cnt * 4; ch++) {
+				if (dual_edge)
+					nvp6158_set_chnmode(ch, AHD30_5M_20P);
+				else
+					nvp6158_set_chnmode(ch, AHD30_5M_12_5P);
+			}
+			break;
+		case AHD30_8M_7_5P:
+			for (ch = 0; ch < nvp6158_cnt * 4; ch++) {
+				if (dual_edge)
+					nvp6158_set_chnmode(ch, AHD30_8M_15P);
+				else
+					nvp6158_set_chnmode(ch, AHD30_8M_7_5P);
+			}
+			break;
+
 		/* test output */
 		case AHD20_SD_SH720_NT:
-			for(ch=0;ch<nvp6158_cnt*4;ch++)
-			{
+			for (ch = 0; ch < nvp6158_cnt * 4; ch++)
 				nvp6158_set_chnmode(ch, AHD20_SD_SH720_NT); /* 720*480i*/
-			}
 			break;
 		case AHD20_SD_SH720_PAL:
-			for(ch=0;ch<nvp6158_cnt*4;ch++)
-			{
+			for (ch = 0; ch < nvp6158_cnt * 4; ch++)
 				nvp6158_set_chnmode(ch, AHD20_SD_SH720_PAL); /* 720*576i*/
-			}
 			break;
 		case AHD20_SD_H960_PAL:
-			for(ch=0;ch<nvp6158_cnt*4;ch++)
-			{
+			for (ch = 0; ch < nvp6158_cnt * 4; ch++)
 				nvp6158_set_chnmode(ch, AHD20_SD_H960_PAL); /* 960*576i*/
-			}
 			break;
 		case AHD20_SD_H960_EX_PAL:
-			for(ch=0;ch<nvp6158_cnt*4;ch++)
-			{
+			for (ch = 0; ch < nvp6158_cnt * 4; ch++)
 				nvp6158_set_chnmode(ch, AHD20_SD_H960_EX_PAL); /*1920*576i*/
-			}
 			break;
 		default:
-			for(ch=0;ch<nvp6158_cnt*4;ch++)
-			{
+			for (ch = 0; ch < nvp6158_cnt * 4; ch++)
 				nvp6158_set_chnmode(ch, AHD20_1080P_30P); 
-			}
 			break;	
 	}
 
@@ -830,35 +846,45 @@ void nvp6158_start(video_init_all *video_init)
 		/* normal output */
 		case BT656_1MUX:
 			if ((fmt_idx == AHD20_1080P_25P) || (fmt_idx == AHD20_1080P_30P)) {
-				for(chip=0;chip<nvp6158_cnt;chip++)
-				{
+				for (chip = 0; chip < nvp6158_cnt; chip++) {
 					nvp6158_set_portmode(chip, 1, NVP6158_OUTMODE_1MUX_FHD, 0);
 					nvp6158_set_portmode(chip, 2, NVP6158_OUTMODE_1MUX_FHD, 1);
 				}
 			} else if ((fmt_idx == AHD20_720P_25P) || (fmt_idx == AHD20_720P_30P)) {
-				for(chip=0;chip<nvp6158_cnt;chip++)
-				{
+				for (chip = 0; chip < nvp6158_cnt; chip++) {
 					nvp6158_set_portmode(chip, 1, NVP6158_OUTMODE_1MUX_HD, 0);
 					nvp6158_set_portmode(chip, 2, NVP6158_OUTMODE_1MUX_HD, 1);
 				}
+			} else if ((fmt_idx == AHD30_3M_18P) || (fmt_idx == AHD30_4M_15P) ||
+					(fmt_idx == AHD30_5M_12_5P) || (fmt_idx == AHD30_8M_7_5P)) {
+				for (chip = 0; chip < nvp6158_cnt; chip++) {
+					nvp6158_set_portmode(chip, 1, NVP6158_OUTMODE_1MUX_FHD, 0);
+					nvp6158_set_portmode(chip, 2, NVP6158_OUTMODE_1MUX_FHD, 1);
+				}
+			} else if ((fmt_idx == AHD20_1080P_50P) || (fmt_idx == AHD20_1080P_60P) ||
+					(fmt_idx == AHD30_3M_30P) || (fmt_idx == AHD30_4M_30P) ||
+					(fmt_idx == AHD30_3M_25P) || (fmt_idx == AHD30_4M_25P) ||
+					(fmt_idx == AHD30_5M_20P) || (fmt_idx == AHD30_8M_15P)) {
+				for (chip = 0; chip < nvp6158_cnt; chip++) {
+					nvp6158_set_portmode(chip, 1, NVP6158_OUTMODE_1MUX_FHD, 0);
+					nvp6158_set_portmode(chip, 2, NVP6158_OUTMODE_1MUX_FHD, 1);
+				}
 			}
 			//standard sync head
 			gpio_i2c_write(0x60, 0xFF, 0x00);
 			gpio_i2c_write(0x60, 0x54, 0x00);
-			//VDO2 enabled VDO1 disabled VCLK_1_EN
+			//VDO2/VDO1 enabled VCLK_1/2_EN
 			gpio_i2c_write(0x60, 0xFF, 0x01);
-			gpio_i2c_write(0x60, 0xCA, 0x64);
+			gpio_i2c_write(0x60, 0xCA, 0x66);
 			break;
 		case BT656_2MUX:
 			if ((fmt_idx == AHD20_1080P_25P) || (fmt_idx == AHD20_1080P_30P)) {
-				for(chip=0;chip<nvp6158_cnt;chip++)
-				{
+				for (chip = 0; chip < nvp6158_cnt; chip++) {
 					nvp6158_set_portmode(chip, 1, NVP6158_OUTMODE_2MUX_FHD, 0);
 					nvp6158_set_portmode(chip, 2, NVP6158_OUTMODE_2MUX_FHD, 0);
 				}
 			} else if ((fmt_idx == AHD20_720P_25P) || (fmt_idx == AHD20_720P_30P)) {
-				for(chip=0;chip<nvp6158_cnt;chip++)
-				{
+				for (chip = 0; chip < nvp6158_cnt; chip++) {
 					nvp6158_set_portmode(chip, 1, NVP6158_OUTMODE_2MUX_HD, 0);
 					nvp6158_set_portmode(chip, 2, NVP6158_OUTMODE_2MUX_HD, 0);
 				}
@@ -872,14 +898,12 @@ void nvp6158_start(video_init_all *video_init)
 			break;
 		case BT1120_1MUX:
 			if ((fmt_idx == AHD20_1080P_25P) || (fmt_idx == AHD20_1080P_30P)) {
-				for(chip=0;chip<nvp6158_cnt;chip++)
-				{
+				for (chip = 0; chip < nvp6158_cnt; chip++) {
 					nvp6158_set_portmode(chip, 1, NVP6158_OUTMODE_1MUX_BT1120S_1080P, 0);
 					nvp6158_set_portmode(chip, 2, NVP6158_OUTMODE_1MUX_BT1120S_1080P, 0);
 				}
 			} else if ((fmt_idx == AHD20_720P_25P) || (fmt_idx == AHD20_720P_30P)) {
-				for(chip=0;chip<nvp6158_cnt;chip++)
-				{
+				for (chip = 0; chip < nvp6158_cnt; chip++) {
 					nvp6158_set_portmode(chip, 1, NVP6158_OUTMODE_1MUX_BT1120S_720P, 1);
 					nvp6158_set_portmode(chip, 2, NVP6158_OUTMODE_1MUX_BT1120S_720P, 1);
 				}
@@ -890,14 +914,12 @@ void nvp6158_start(video_init_all *video_init)
 			break;
 		case BT1120_2MUX:
 			if ((fmt_idx == AHD20_1080P_25P) || (fmt_idx == AHD20_1080P_30P)) {
-				for(chip=0;chip<nvp6158_cnt;chip++)
-				{
+				for (chip = 0; chip < nvp6158_cnt; chip++) {
 					nvp6158_set_portmode(chip, 1, NVP6158_OUTMODE_2MUX_BT1120S_1080P, 0);
 					nvp6158_set_portmode(chip, 2, NVP6158_OUTMODE_2MUX_BT1120S_1080P, 1);
 				}
 			} else if ((fmt_idx == AHD20_720P_25P) || (fmt_idx == AHD20_720P_30P)) {
-				for(chip=0;chip<nvp6158_cnt;chip++)
-				{
+				for (chip = 0; chip < nvp6158_cnt; chip++) {
 					nvp6158_set_portmode(chip, 1, NVP6158_OUTMODE_2MUX_BT1120S_720P, 0);
 					nvp6158_set_portmode(chip, 2, NVP6158_OUTMODE_2MUX_BT1120S_720P, 1);
 				}
@@ -908,16 +930,19 @@ void nvp6158_start(video_init_all *video_init)
 			break;
 		case BT1120_4MUX:
 			if ((fmt_idx == AHD20_1080P_25P) || (fmt_idx == AHD20_1080P_30P)) {
-				for(chip=0;chip<nvp6158_cnt;chip++)
-				{
+				for (chip = 0; chip < nvp6158_cnt; chip++) {
 					nvp6158_set_portmode(chip, 1, NVP6158_OUTMODE_4MUX_BT1120S_1080P, 0);
 					nvp6158_set_portmode(chip, 2, NVP6158_OUTMODE_4MUX_BT1120S_1080P, 1);
 				}
 			} else if ((fmt_idx == AHD20_720P_25P) || (fmt_idx == AHD20_720P_30P)) {
-				for(chip=0;chip<nvp6158_cnt;chip++)
-				{
-					nvp6158_set_portmode(chip, 1, NVP6158_OUTMODE_4MUX_BT1120S, 0);
-					nvp6158_set_portmode(chip, 2, NVP6158_OUTMODE_4MUX_BT1120S, 1);
+				for (chip = 0; chip < nvp6158_cnt; chip++) {
+					if (dual_edge) {
+						nvp6158_set_portmode(chip, 1, NVP6158_OUTMODE_4MUX_BT1120S_DDR, 0);
+						nvp6158_set_portmode(chip, 2, NVP6158_OUTMODE_4MUX_BT1120S_DDR, 1);
+					} else {
+						nvp6158_set_portmode(chip, 1, NVP6158_OUTMODE_4MUX_BT1120S, 0);
+						nvp6158_set_portmode(chip, 2, NVP6158_OUTMODE_4MUX_BT1120S, 1);
+					}
 				}
 			}
 			//VDO2/VDO1 enabled VCLK_1_EN/VCLK_2_EN
@@ -927,21 +952,21 @@ void nvp6158_start(video_init_all *video_init)
 		/* test output */
 		case BT656I_TEST_MODES:
 			if (fmt_idx == AHD20_SD_H960_EX_PAL) {
-				for(chip=0;chip<nvp6158_cnt;chip++)
-				{
+				for (chip = 0; chip < nvp6158_cnt; chip++) {
 					nvp6158_set_portmode(chip, 1, NVP6158_OUTMODE_1MUX_HD, 0);
 					nvp6158_set_portmode(chip, 2, NVP6158_OUTMODE_1MUX_HD, 1);
 				}
 			} else {
-				for(chip=0;chip<nvp6158_cnt;chip++)
-				{
+				for (chip = 0; chip < nvp6158_cnt; chip++) {
 					nvp6158_set_portmode(chip, 1, NVP6158_OUTMODE_1MUX_SD, 0);
 					nvp6158_set_portmode(chip, 2, NVP6158_OUTMODE_1MUX_SD, 1);
 				}
 			}
 			//VDO2 enabled VDO1 disabled VCLK_1_EN
 			gpio_i2c_write(0x60, 0xFF, 0x01);
-			gpio_i2c_write(0x60, 0xCA, 0x64);
+			//gpio_i2c_write(0x60, 0xCA, 0x64);
+			//VDO2/VDO1 enabled VCLK_1_EN/VCLK_2_EN
+			gpio_i2c_write(0x60, 0xCA, 0x66);
 			break;
 		default:
 			printk("mode %d not supported yet\n", mode);
diff --git a/drivers/media/i2c/nvp6158_drv/nvp6158_drv.h b/drivers/media/i2c/nvp6158_drv/nvp6158_drv.h
index 949d50653cc8..35f52ba53e67 100644
--- a/drivers/media/i2c/nvp6158_drv/nvp6158_drv.h
+++ b/drivers/media/i2c/nvp6158_drv/nvp6158_drv.h
@@ -26,7 +26,7 @@ long nvp6158_native_ioctl(struct file *file, unsigned int cmd, unsigned long arg
 void nvp6158_i2c_client_exit(void);
 
 void nvp6158_set_mclk(unsigned int mclk);
-void nvp6158_start(video_init_all *video_init);
+void nvp6158_start(video_init_all *video_init, bool dual_edge);
 void nvp6158_stop(void);
 int nvp6158_init(int i2c_bus);
 void nvp6158_exit(void);
diff --git a/drivers/media/i2c/nvp6158_drv/nvp6158_v4l2.c b/drivers/media/i2c/nvp6158_drv/nvp6158_v4l2.c
index 70558b4f9332..2f4d1c16519c 100644
--- a/drivers/media/i2c/nvp6158_drv/nvp6158_v4l2.c
+++ b/drivers/media/i2c/nvp6158_drv/nvp6158_v4l2.c
@@ -5,7 +5,9 @@
  * Copyright (c) 2021 Rockchip Electronics Co. Ltd.
  *
  * V0.0X01.0X00 first version.
- *
+ * V0.0X01.0X01
+ * 1. add workqueue to detect ahd state.
+ * 2. add more resolution support.
  */
 
 #include <linux/clk.h>
@@ -43,7 +45,19 @@
 #include "nvp6158_video_auto_detect.h"
 #include "nvp6158_drv.h"
 
-#define DRIVER_VERSION				KERNEL_VERSION(0, 0x01, 0x0)
+//#define WORK_QUEUE
+
+#ifdef WORK_QUEUE
+#include <linux/workqueue.h>
+
+struct sensor_state_check_work {
+	struct workqueue_struct *state_check_wq;
+	struct delayed_work d_work;
+};
+
+#endif
+
+#define DRIVER_VERSION				KERNEL_VERSION(0, 0x01, 0x1)
 
 #ifndef V4L2_CID_DIGITAL_GAIN
 #define V4L2_CID_DIGITAL_GAIN			V4L2_CID_GAIN
@@ -115,6 +129,14 @@ struct nvp6158_default_rect {
 	unsigned int height;
 };
 
+#ifdef WORK_QUEUE
+enum nvp6158_hot_plug_state {
+	PLUG_IN = 0,
+	PLUG_OUT,
+	PLUG_STATE_MAX,
+};
+#endif
+
 struct nvp6158 {
 	struct i2c_client	*client;
 	struct clk		*xvclk;
@@ -149,6 +171,14 @@ struct nvp6158 {
 	const struct nvp6158_framesize *frame_size;
 	int streaming;
 	struct nvp6158_default_rect defrect;
+#ifdef WORK_QUEUE
+	struct sensor_state_check_work plug_state_check;
+	u8 cur_detect_status;
+	u8 last_detect_status;
+#endif
+	bool hot_plug;
+	u8 is_reset;
+
 };
 
 #define to_nvp6158(sd) container_of(sd, struct nvp6158, subdev)
@@ -172,6 +202,52 @@ static const struct nvp6158_framesize nvp6158_framesizes[] = {
 			.denominator = 250000,
 		},
 	},
+	{
+		.width		= 2048,
+		.height		= 1536,
+		.fmt_idx	= AHD30_3M_18P,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 180000,
+		},
+	},
+	{
+		.width		= 1280,
+		.height		= 1440,
+		.fmt_idx	= AHD30_4M_30P,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+	},
+	{
+		.width		= 2560,
+		.height		= 1440,
+		.fmt_idx	= AHD30_4M_15P,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 150000,
+		},
+	},
+	{
+		.width		= 2592,
+		.height		= 1944,
+		.fmt_idx	= AHD30_5M_12_5P,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 125000,
+		},
+	},
+	{
+		.width		= 3840,
+		.height		= 2160,
+		.fmt_idx	= AHD30_8M_7_5P,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 75000,
+		},
+	},
+
 	/* test modes, Interlace mode*/
 	{
 		.width		= 720,
@@ -242,6 +318,62 @@ static int nvp6158_querystd(struct v4l2_subdev *sd, v4l2_std_id *std)
 	return 0;
 }
 
+/* sensor register write */
+static int nvp6158_write(struct i2c_client *client, u8 reg, u8 val)
+{
+	struct i2c_msg msg;
+	u8 buf[2];
+	int ret;
+
+	dev_info(&client->dev, "write reg(0x%x val:0x%x)!\n", reg, val);
+	buf[0] = reg & 0xFF;
+	buf[1] = val;
+
+	msg.addr = client->addr;
+	msg.flags = client->flags;
+	msg.buf = buf;
+	msg.len = sizeof(buf);
+
+	ret = i2c_transfer(client->adapter, &msg, 1);
+	if (ret >= 0)
+		return 0;
+
+	dev_err(&client->dev,
+		"nvp6158 write reg(0x%x val:0x%x) failed !\n", reg, val);
+
+	return ret;
+}
+
+/* sensor register read */
+static int nvp6158_read(struct i2c_client *client, u8 reg, u8 *val)
+{
+	struct i2c_msg msg[2];
+	u8 buf[1];
+	int ret;
+
+	buf[0] = reg & 0xFF;
+
+	msg[0].addr = client->addr;
+	msg[0].flags = client->flags;
+	msg[0].buf = buf;
+	msg[0].len = sizeof(buf);
+
+	msg[1].addr = client->addr;
+	msg[1].flags = client->flags | I2C_M_RD;
+	msg[1].buf = buf;
+	msg[1].len = 1;
+
+	ret = i2c_transfer(client->adapter, msg, 2);
+	if (ret >= 0) {
+		*val = buf[0];
+		return 0;
+	}
+
+	dev_err(&client->dev, "nvp6158 read reg(0x%x) failed !\n", reg);
+
+	return ret;
+}
+
 static int __nvp6158_power_on(struct nvp6158 *nvp6158)
 {
 	u32 i;
@@ -375,7 +507,7 @@ static int nvp6158_power(struct v4l2_subdev *sd, int on)
 	struct nvp6158 *nvp6158 = to_nvp6158(sd);
 	int ret = 0;
 
-	dev_dbg(&client->dev, "%s: on %d\n", __func__, on);
+	dev_info(&client->dev, "%s: on %d\n", __func__, on);
 	mutex_lock(&nvp6158->mutex);
 
 	/* If the power state is not modified - no work to do. */
@@ -514,8 +646,20 @@ static int nvp6158_stream(struct v4l2_subdev *sd, int on)
 			video_init.ch_param[ch].format = fmt_idx;
 		}
 		video_init.mode = nvp6158->mode;
-		nvp6158_start(&video_init);
+		nvp6158_start(&video_init, nvp6158->dual_edge ? true : false);
+#ifdef WORK_QUEUE
+		if (nvp6158->plug_state_check.state_check_wq) {
+			dev_info(&client->dev, "%s queue_delayed_work 1000ms", __func__);
+			queue_delayed_work(nvp6158->plug_state_check.state_check_wq,
+					   &nvp6158->plug_state_check.d_work,
+					   msecs_to_jiffies(1000));
+		}
+#endif
 	} else {
+#ifdef WORK_QUEUE
+		cancel_delayed_work_sync(&nvp6158->plug_state_check.d_work);
+		dev_info(&client->dev, "cancle_queue_delayed_work");
+#endif
 		nvp6158_stop();
 	}
 
@@ -583,6 +727,100 @@ static int nvp6158_enum_frame_sizes(struct v4l2_subdev *sd,
 	return 0;
 }
 
+/* indicate N4 no signal channel */
+static inline bool nvp6158_no_signal(struct v4l2_subdev *sd, u8 *novid)
+{
+	struct nvp6158 *nvp6158 = to_nvp6158(sd);
+	struct i2c_client *client = nvp6158->client;
+	u8 videoloss = 0;
+	int ret;
+	bool no_signal = false;
+
+	nvp6158_write(client, 0xff, 0x00);
+	ret = nvp6158_read(client, 0xa8, &videoloss);
+	if (ret < 0)
+		dev_err(&client->dev, "Failed to read videoloss state!\n");
+
+	*novid = videoloss;
+	dev_info(&client->dev, "%s: video loss status:0x%x.\n", __func__, videoloss);
+	if (videoloss == 0xf) {
+		dev_info(&client->dev, "%s: all channels No Video detected.\n", __func__);
+		no_signal = true;
+	} else {
+		dev_info(&client->dev, "%s: channel has some video detection.\n", __func__);
+		no_signal = false;
+	}
+	return no_signal;
+}
+
+/* indicate N4 channel locked status */
+static inline bool nvp6158_sync(struct v4l2_subdev *sd, u8 *lock_st)
+{
+	struct i2c_client *client = v4l2_get_subdevdata(sd);
+	u8 video_lock_status = 0;
+	int ret;
+	bool has_sync = false;
+
+	nvp6158_write(client, 0xff, 0x00);
+	ret = nvp6158_read(client, 0xe0, &video_lock_status);
+	if (ret < 0)
+		dev_err(&client->dev, "Failed to read sync state!\n");
+
+	dev_info(&client->dev, "%s: video AGC LOCK status:0x%x.\n",
+			__func__, video_lock_status);
+	*lock_st = video_lock_status;
+	if (video_lock_status) {
+		dev_info(&client->dev, "%s: channel has AGC LOCK.\n", __func__);
+		has_sync = true;
+	} else {
+		dev_info(&client->dev, "%s: channel has no AGC LOCK.\n", __func__);
+		has_sync = false;
+	}
+	return has_sync;
+}
+
+#ifdef WORK_QUEUE
+static void nvp6158_plug_state_check_work(struct work_struct *work)
+{
+	struct sensor_state_check_work *params_check =
+		container_of(work, struct sensor_state_check_work, d_work.work);
+	struct nvp6158 *nvp6158 =
+		container_of(params_check, struct nvp6158, plug_state_check);
+	struct i2c_client *client = nvp6158->client;
+	struct v4l2_subdev *sd = &nvp6158->subdev;
+	u8 novid_status = 0x00;
+	u8 sync_status = 0x00;
+
+	nvp6158_no_signal(sd, &novid_status);
+	nvp6158_sync(sd, &sync_status);
+	nvp6158->cur_detect_status = novid_status;
+
+	/* detect state change to determine is there has plug motion */
+	novid_status = nvp6158->cur_detect_status ^ nvp6158->last_detect_status;
+	if (novid_status)
+		nvp6158->hot_plug = true;
+	else
+		nvp6158->hot_plug = false;
+	nvp6158->last_detect_status = nvp6158->cur_detect_status;
+
+	dev_info(&client->dev, "%s has plug motion? (%s)", __func__,
+			 nvp6158->hot_plug ? "true" : "false");
+	if (nvp6158->hot_plug) {
+		dev_info(&client->dev, "queue_delayed_work 1500ms, if has hot plug motion.");
+		queue_delayed_work(nvp6158->plug_state_check.state_check_wq,
+				   &nvp6158->plug_state_check.d_work, msecs_to_jiffies(1500));
+		nvp6158_write(client, 0xFF, 0x20);
+		nvp6158_write(client, 0x00, (sync_status << 4) | sync_status);
+		usleep_range(3000, 5000);
+		nvp6158_write(client, 0x00, 0xFF);
+	} else {
+		dev_info(&client->dev, "queue_delayed_work 100ms, if no hot plug motion.");
+		queue_delayed_work(nvp6158->plug_state_check.state_check_wq,
+				   &nvp6158->plug_state_check.d_work, msecs_to_jiffies(100));
+	}
+}
+#endif
+
 static int nvp6158_g_mbus_config(struct v4l2_subdev *sd,
 				 struct v4l2_mbus_config *cfg)
 {
@@ -738,10 +976,46 @@ nvp6158_get_bt656_module_inf(struct nvp6158 *nvp6158,
 	}
 }
 
+static void nvp6158_get_vicap_rst_inf(struct nvp6158 *nvp6158,
+				   struct rkmodule_vicap_reset_info *rst_info)
+{
+	struct i2c_client *client = nvp6158->client;
+
+	rst_info->is_reset = nvp6158->hot_plug;
+	nvp6158->hot_plug = false;
+	rst_info->src = RKCIF_RESET_SRC_ERR_HOTPLUG;
+	dev_info(&client->dev, "%s: rst_info->is_reset:%d.\n", __func__, rst_info->is_reset);
+}
+
+static void nvp6158_set_vicap_rst_inf(struct nvp6158 *nvp6158,
+				   struct rkmodule_vicap_reset_info rst_info)
+{
+	nvp6158->is_reset = rst_info.is_reset;
+}
+
+static void nvp6158_set_streaming(struct nvp6158 *nvp6158, int on)
+{
+	struct i2c_client *client = nvp6158->client;
+
+
+	dev_info(&client->dev, "%s: on: %d\n", __func__, on);
+
+	if (on) {
+		//VDO2/VDO1 enabled VCLK_1_EN/VCLK_2_EN
+		nvp6158_write(client, 0xFF, 0x01);
+		nvp6158_write(client, 0xCA, 0x66);
+	} else {
+		//VDO2/VDO1 disable VCLK_1/VCLK_2_DISABLE
+		nvp6158_write(client, 0xFF, 0x01);
+		nvp6158_write(client, 0xCA, 0x00);
+	}
+}
+
 static long nvp6158_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 {
 	struct nvp6158 *nvp6158 = to_nvp6158(sd);
 	long ret = 0;
+	u32 stream = 0;
 
 	switch (cmd) {
 	case RKMODULE_GET_MODULE_INFO:
@@ -757,6 +1031,16 @@ static long nvp6158_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 			(nvp6158->mode < NVP6158_DVP_MODES_END))
 			*(int *)arg = RKMODULE_START_STREAM_FRONT;
 		break;
+	case RKMODULE_GET_VICAP_RST_INFO:
+		nvp6158_get_vicap_rst_inf(nvp6158, (struct rkmodule_vicap_reset_info *)arg);
+		break;
+	case RKMODULE_SET_VICAP_RST_INFO:
+		nvp6158_set_vicap_rst_inf(nvp6158, *(struct rkmodule_vicap_reset_info *)arg);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		stream = *((u32 *)arg);
+		nvp6158_set_streaming(nvp6158, !!stream);
+		break;
 	default:
 		ret = -ENOTTY;
 		break;
@@ -775,6 +1059,8 @@ static long nvp6158_compat_ioctl32(struct v4l2_subdev *sd,
 	long ret;
 	struct rkmodule_bt656_mbus_info *bt565_inf;
 	int *seq;
+	struct rkmodule_vicap_reset_info *vicap_rst_inf;
+	u32 stream = 0;
 
 	switch (cmd) {
 	case RKMODULE_GET_MODULE_INFO:
@@ -785,8 +1071,11 @@ static long nvp6158_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = nvp6158_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:
@@ -799,6 +1088,8 @@ static long nvp6158_compat_ioctl32(struct v4l2_subdev *sd,
 		ret = copy_from_user(cfg, up, sizeof(*cfg));
 		if (!ret)
 			ret = nvp6158_ioctl(sd, cmd, cfg);
+		else
+			ret = -EFAULT;
 		kfree(cfg);
 		break;
 	case RKMODULE_GET_BT656_MBUS_INFO:
@@ -809,8 +1100,11 @@ static long nvp6158_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = nvp6158_ioctl(sd, cmd, bt565_inf);
-		if (!ret)
+		if (!ret) {
 			ret = copy_to_user(up, bt565_inf, sizeof(*bt565_inf));
+			if (ret)
+				ret = -EFAULT;
+		}
 		kfree(bt565_inf);
 		break;
 	case RKMODULE_GET_START_STREAM_SEQ:
@@ -820,11 +1114,49 @@ static long nvp6158_compat_ioctl32(struct v4l2_subdev *sd,
 			return ret;
 		}
 		ret = nvp6158_ioctl(sd, cmd, seq);
-		if (!ret)
+		if (!ret) {
 			ret = copy_to_user(up, seq, sizeof(*seq));
+			if (ret)
+				ret = -EFAULT;
+		}
 		kfree(seq);
 		break;
+	case RKMODULE_GET_VICAP_RST_INFO:
+		vicap_rst_inf = kzalloc(sizeof(*vicap_rst_inf), GFP_KERNEL);
+		if (!vicap_rst_inf) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = nvp6158_ioctl(sd, cmd, vicap_rst_inf);
+		if (!ret) {
+			ret = copy_to_user(up, vicap_rst_inf, sizeof(*vicap_rst_inf));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(vicap_rst_inf);
+		break;
+	case RKMODULE_SET_VICAP_RST_INFO:
+		vicap_rst_inf = kzalloc(sizeof(*vicap_rst_inf), GFP_KERNEL);
+		if (!vicap_rst_inf) {
+			ret = -ENOMEM;
+			return ret;
+		}
 
+		ret = copy_from_user(vicap_rst_inf, up, sizeof(*vicap_rst_inf));
+		if (!ret)
+			ret = nvp6158_ioctl(sd, cmd, vicap_rst_inf);
+		else
+			ret = -EFAULT;
+		kfree(vicap_rst_inf);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		ret = copy_from_user(&stream, up, sizeof(u32));
+		if (!ret)
+			ret = nvp6158_ioctl(sd, cmd, &stream);
+		else
+			ret = -EFAULT;
+		break;
 	default:
 		ret = -ENOIOCTLCMD;
 		break;
@@ -1178,7 +1510,21 @@ static int nvp6158_probe(struct i2c_client *client,
 	pm_runtime_set_active(dev);
 	pm_runtime_enable(dev);
 	pm_runtime_idle(dev);
+#ifdef WORK_QUEUE
+	/* init work_queue for state_check */
+	INIT_DELAYED_WORK(&nvp6158->plug_state_check.d_work, nvp6158_plug_state_check_work);
+	nvp6158->plug_state_check.state_check_wq =
+		create_singlethread_workqueue("nvp6158_work_queue");
+	if (nvp6158->plug_state_check.state_check_wq == NULL) {
+		dev_err(dev, "%s(%d): %s create failed.\n", __func__, __LINE__,
+			  "nvp6158_work_queue");
+	}
+	nvp6158->cur_detect_status = 0x0;
+	nvp6158->last_detect_status = 0x0;
+	nvp6158->hot_plug = false;
+	nvp6158->is_reset = 0;
 
+#endif
 	return 0;
 
 err_clean_entity:
@@ -1206,7 +1552,10 @@ static int nvp6158_remove(struct i2c_client *client)
 	if (!pm_runtime_status_suspended(&client->dev))
 		__nvp6158_power_off(nvp6158);
 	pm_runtime_set_suspended(&client->dev);
-
+#ifdef WORK_QUEUE
+	if (nvp6158->plug_state_check.state_check_wq != NULL)
+		destroy_workqueue(nvp6158->plug_state_check.state_check_wq);
+#endif
 	return 0;
 }
 
diff --git a/drivers/media/i2c/nvp6158_drv/nvp6158_video.c b/drivers/media/i2c/nvp6158_drv/nvp6158_video.c
index b27c6bab55e2..81a36f39384b 100644
--- a/drivers/media/i2c/nvp6158_drv/nvp6158_video.c
+++ b/drivers/media/i2c/nvp6158_drv/nvp6158_video.c
@@ -1140,7 +1140,7 @@ int nvp6168_set_chnmode(const unsigned char ch, const unsigned char chnmode)
 	video_equalizer_info_s vin_eq_set;
 	video_input_novid auto_novid;
 	nvp6158_coax_str s_coax_str;
-	
+
 	if(ch >= (nvp6158_cnt*4))
 	{
 		printk("func[nvp6168_set_chnmode] Channel %d is out of range!!!\n", ch);
@@ -1258,7 +1258,18 @@ int nvp6158_set_portmode(const unsigned char chip, const unsigned char portsel,
 			gpio_i2c_write(chipaddr, 0xC1+portsel*2, (chid<<4)|chid);
 			tmp = gpio_i2c_read(chipaddr, 0xC8+(portsel/2)) & (portsel%2?0x0F:0xF0);
 			gpio_i2c_write(chipaddr, 0xC8+(portsel/2), tmp);
-			gpio_i2c_write(chipaddr, 0xCC+portsel, 0x58);
+			gpio_i2c_write(chipaddr, 0xCC+portsel, 0x56); //0x40~0x5f adjust delay
+			break;
+		case NVP6158_OUTMODE_1MUX_FHD_DDR:
+			/*Output 720P@5060 /1080P Single Channel data,Data Rate 148.5MHz,Pclk 148.5MHz, Single Edge.*/
+			gpio_i2c_write(chipaddr, 0xFF, 0x00);
+			gpio_i2c_write(chipaddr, 0x56, 0x10);
+			gpio_i2c_write(chipaddr, 0xFF, 0x01);
+			gpio_i2c_write(chipaddr, 0xC0+portsel*2, (chid<<4)|chid);
+			gpio_i2c_write(chipaddr, 0xC1+portsel*2, (chid<<4)|chid);
+			tmp = gpio_i2c_read(chipaddr, 0xC8+(portsel/2)) & (portsel%2?0x0F:0xF0);
+			gpio_i2c_write(chipaddr, 0xC8+(portsel/2), tmp);
+			gpio_i2c_write(chipaddr, 0xCC+portsel, 0x06); //0x00~0x3f adjust delay
 			break;
 		case NVP6158_OUTMODE_2MUX_SD:
 			/*Output 720H/960H 2 Channel data,Data Rate 74.25MHz,Pclk 74.25MHz, Single Edge.*/
@@ -1526,6 +1537,36 @@ int nvp6158_set_portmode(const unsigned char chip, const unsigned char portsel,
 			}
 			break;
 		case NVP6158_OUTMODE_4MUX_BT1120S:
+			gpio_i2c_write(chipaddr, 0xFF, 0x00);
+			gpio_i2c_write(chipaddr, 0x56, 0x32);
+			gpio_i2c_write(chipaddr, 0xFF, 0x01);
+			if (nvp6158_chip_id[chip] == NVP6158C_R0_ID ||
+			    nvp6158_chip_id[chip] == NVP6168C_R0_ID) {
+				//6158C makes 2 bt656 ports to 1 bt1120 port.  portsel=[1,2] to choose clock.
+				gpio_i2c_write(chipaddr, 0xC2, 0x54);
+				gpio_i2c_write(chipaddr, 0xC3, 0x76);
+				gpio_i2c_write(chipaddr, 0xC4, 0xdc);
+				gpio_i2c_write(chipaddr, 0xC5, 0xfe);
+				gpio_i2c_write(chipaddr, 0xC8, 0x88);
+				gpio_i2c_write(chipaddr, 0xC9, 0x88);
+
+				//single edge
+				gpio_i2c_write(chipaddr, 0xCD, 0x46);		//148.5MHz clock
+				gpio_i2c_write(chipaddr, 0xCE, 0x46);		//148.5MHz clock
+//				//dual_edge
+//				gpio_i2c_write(chipaddr, 0xCD, 0x06);		//74.25MHz clock
+//				gpio_i2c_write(chipaddr, 0xCE, 0x06);		//74.25MHz clock
+			} else {
+				//6158 makes 4 bt656 ports to 2 bt1120 port.   portsel=[0,1] to choose clock.
+				gpio_i2c_write(chipaddr, 0xC0+portsel*4, 0xdc);
+				gpio_i2c_write(chipaddr, 0xC1+portsel*4, 0xfe);
+				gpio_i2c_write(chipaddr, 0xC2+portsel*4, 0x54);
+				gpio_i2c_write(chipaddr, 0xC3+portsel*4, 0x76);
+				gpio_i2c_write(chipaddr, 0xC8+(portsel), 0x88);
+				gpio_i2c_write(chipaddr, 0xCC+portsel*2, 0x58); //148.5MHz clock
+			}
+			break;
+		case NVP6158_OUTMODE_4MUX_BT1120S_DDR:
 			gpio_i2c_write(chipaddr, 0xFF, 0x00);
 			gpio_i2c_write(chipaddr, 0x56, 0x32);
 			gpio_i2c_write(chipaddr, 0xFF, 0x01);
@@ -1541,9 +1582,6 @@ int nvp6158_set_portmode(const unsigned char chip, const unsigned char portsel,
 				//dual_edge
 				gpio_i2c_write(chipaddr, 0xCD, 0x06);		//74.25MHz clock
 				gpio_i2c_write(chipaddr, 0xCE, 0x06);		//74.25MHz clock
-//				//single edge
-//				gpio_i2c_write(chipaddr, 0xCD, 0x46);		//148.5MHz clock
-//				gpio_i2c_write(chipaddr, 0xCE, 0x46);		//148.5MHz clock
 			}
 			else
 			{
@@ -1553,9 +1591,10 @@ int nvp6158_set_portmode(const unsigned char chip, const unsigned char portsel,
 				gpio_i2c_write(chipaddr, 0xC2+portsel*4, 0x54);
 				gpio_i2c_write(chipaddr, 0xC3+portsel*4, 0x76);
 				gpio_i2c_write(chipaddr, 0xC8+(portsel), 0x88);
-				gpio_i2c_write(chipaddr, 0xCC+portsel*2, 0x58);		//148.5MHz clock
+				gpio_i2c_write(chipaddr, 0xCC+portsel*2, 0x58); //148.5MHz clock
 			}
 			break;
+
 		case NVP6158_OUTMODE_4MUX_BT1120S_1080P:
 			gpio_i2c_write(chipaddr, 0xFF, 0x00);
 			gpio_i2c_write(chipaddr, 0x56, 0x32);
diff --git a/drivers/media/i2c/nvp6158_drv/nvp6158_video.h b/drivers/media/i2c/nvp6158_drv/nvp6158_video.h
index ea675e71659b..9dff2bae9328 100644
--- a/drivers/media/i2c/nvp6158_drv/nvp6158_video.h
+++ b/drivers/media/i2c/nvp6158_drv/nvp6158_video.h
@@ -43,6 +43,7 @@ typedef enum _nvp6158_outmode_sel
 	NVP6158_OUTMODE_1MUX_SD = 0,
 	NVP6158_OUTMODE_1MUX_HD,
 	NVP6158_OUTMODE_1MUX_FHD,
+	NVP6158_OUTMODE_1MUX_FHD_DDR,
 	NVP6158_OUTMODE_2MUX_SD,
 	NVP6158_OUTMODE_2MUX_HD,
 	NVP6158_OUTMODE_2MUX_MIX,
@@ -57,6 +58,7 @@ typedef enum _nvp6158_outmode_sel
 	NVP6158_OUTMODE_2MUX_BT1120S_720P,
 	NVP6158_OUTMODE_2MUX_BT1120S_1080P,
 	NVP6158_OUTMODE_4MUX_BT1120S,
+	NVP6158_OUTMODE_4MUX_BT1120S_DDR,
 	NVP6158_OUTMODE_4MUX_BT1120S_720P,
 	NVP6158_OUTMODE_4MUX_BT1120S_1080P,
 	NVP6158_OUTMODE_BUTT

commit 5b1eeee089ed6a369213f299cfb762c52f14304c
Author: Wyon Bi <bivvy.bi@rock-chips.com>
Date:   Tue Sep 14 17:59:44 2021 +0800

    drm/bridge: analogix_dp: Fix display corruption in low temperature environment
    
    Change-Id: I46b3dbc57c1f2b8482559d4ba44bd7f339657ccd
    Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>

diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
index 42d1cbe28b40..35290d65fa76 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
@@ -100,10 +100,11 @@ void analogix_dp_init_analog_param(struct analogix_dp_device *dp)
 			reg ^= REF_CLK_MASK;
 
 		analogix_dp_write(dp, ANALOGIX_DP_PLL_REG_1, reg);
-		analogix_dp_write(dp, ANALOGIX_DP_PLL_REG_2, 0x95);
+		analogix_dp_write(dp, ANALOGIX_DP_PLL_REG_2, 0x99);
 		analogix_dp_write(dp, ANALOGIX_DP_PLL_REG_3, 0x40);
 		analogix_dp_write(dp, ANALOGIX_DP_PLL_REG_4, 0x58);
 		analogix_dp_write(dp, ANALOGIX_DP_PLL_REG_5, 0x22);
+		analogix_dp_write(dp, ANALOGIX_DP_BIAS, 0x44);
 	}
 
 	reg = DRIVE_DVDD_BIT_1_0625V | VCO_BIT_600_MICRO;
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h
index 28286e31d809..a1b6b53cf232 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h
@@ -49,6 +49,7 @@
 #define ANALOGIX_DP_PLL_REG_5			0xa00
 
 #define ANALOIGX_DP_SSC_REG			0x104
+#define ANALOGIX_DP_BIAS			0x124
 #define ANALOGIX_DP_PD				0x12c
 
 #define ANALOGIX_DP_IF_TYPE			0x244

commit b45203862c21f3b054020603dcce311ca30ecd19
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Wed Sep 15 11:14:12 2021 +0800

    media: rockchip: isp: remove associated of cproc and ie
    
    Change-Id: Ic4d6171398322e24993e4a0419fd43fae85672b8
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/isp_params_v1x.c b/drivers/media/platform/rockchip/isp/isp_params_v1x.c
index 6719422bf8ca..1a62bd278165 100644
--- a/drivers/media/platform/rockchip/isp/isp_params_v1x.c
+++ b/drivers/media/platform/rockchip/isp/isp_params_v1x.c
@@ -769,10 +769,6 @@ static void isp_aec_config_v12(struct rkisp_isp_params_vdev *params_vdev,
 static void isp_cproc_config(struct rkisp_isp_params_vdev *params_vdev,
 			     const struct cifisp_cproc_config *arg)
 {
-	struct cifisp_isp_other_cfg *cur_other_cfg =
-		&params_vdev->isp1x_params->others;
-	struct cifisp_ie_config *cur_ie_config = &cur_other_cfg->ie_config;
-	u32 effect = cur_ie_config->effect;
 	u32 quantization = params_vdev->quantization;
 
 	rkisp1_iowrite32(params_vdev, arg->contrast, CIF_C_PROC_CONTRAST);
@@ -780,8 +776,7 @@ static void isp_cproc_config(struct rkisp_isp_params_vdev *params_vdev,
 	rkisp1_iowrite32(params_vdev, arg->sat, CIF_C_PROC_SATURATION);
 	rkisp1_iowrite32(params_vdev, arg->brightness, CIF_C_PROC_BRIGHTNESS);
 
-	if (quantization != V4L2_QUANTIZATION_FULL_RANGE ||
-	    effect != V4L2_COLORFX_NONE) {
+	if (quantization != V4L2_QUANTIZATION_FULL_RANGE) {
 		isp_param_clear_bits(params_vdev, CIF_C_PROC_CTRL,
 				     CIF_C_PROC_YOUT_FULL |
 				     CIF_C_PROC_YIN_FULL |
diff --git a/drivers/media/platform/rockchip/isp/isp_params_v21.c b/drivers/media/platform/rockchip/isp/isp_params_v21.c
index a0741e5887ba..4cacb4a9a102 100644
--- a/drivers/media/platform/rockchip/isp/isp_params_v21.c
+++ b/drivers/media/platform/rockchip/isp/isp_params_v21.c
@@ -905,10 +905,6 @@ static void
 isp_cproc_config(struct rkisp_isp_params_vdev *params_vdev,
 		 const struct isp2x_cproc_cfg *arg)
 {
-	struct isp21_isp_other_cfg *cur_other_cfg =
-		&params_vdev->isp21_params->others;
-	struct isp2x_ie_cfg *cur_ie_config = &cur_other_cfg->ie_cfg;
-	u32 effect = cur_ie_config->effect;
 	u32 quantization = params_vdev->quantization;
 
 	rkisp_iowrite32(params_vdev, arg->contrast, CPROC_CONTRAST);
@@ -916,8 +912,7 @@ isp_cproc_config(struct rkisp_isp_params_vdev *params_vdev,
 	rkisp_iowrite32(params_vdev, arg->sat, CPROC_SATURATION);
 	rkisp_iowrite32(params_vdev, arg->brightness, CPROC_BRIGHTNESS);
 
-	if (quantization != V4L2_QUANTIZATION_FULL_RANGE ||
-	    effect != V4L2_COLORFX_NONE) {
+	if (quantization != V4L2_QUANTIZATION_FULL_RANGE) {
 		isp_param_clear_bits(params_vdev, CPROC_CTRL,
 				     CIF_C_PROC_YOUT_FULL |
 				     CIF_C_PROC_YIN_FULL |
diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.c b/drivers/media/platform/rockchip/isp/isp_params_v2x.c
index b3e0088e8174..5bb8043cc347 100644
--- a/drivers/media/platform/rockchip/isp/isp_params_v2x.c
+++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.c
@@ -954,10 +954,6 @@ static void
 isp_cproc_config(struct rkisp_isp_params_vdev *params_vdev,
 		 const struct isp2x_cproc_cfg *arg)
 {
-	struct isp2x_isp_other_cfg *cur_other_cfg =
-		&params_vdev->isp2x_params->others;
-	struct isp2x_ie_cfg *cur_ie_config = &cur_other_cfg->ie_cfg;
-	u32 effect = cur_ie_config->effect;
 	u32 quantization = params_vdev->quantization;
 
 	rkisp_iowrite32(params_vdev, arg->contrast, CPROC_CONTRAST);
@@ -965,8 +961,7 @@ isp_cproc_config(struct rkisp_isp_params_vdev *params_vdev,
 	rkisp_iowrite32(params_vdev, arg->sat, CPROC_SATURATION);
 	rkisp_iowrite32(params_vdev, arg->brightness, CPROC_BRIGHTNESS);
 
-	if (quantization != V4L2_QUANTIZATION_FULL_RANGE ||
-	    effect != V4L2_COLORFX_NONE) {
+	if (quantization != V4L2_QUANTIZATION_FULL_RANGE) {
 		isp_param_clear_bits(params_vdev, CPROC_CTRL,
 				     CIF_C_PROC_YOUT_FULL |
 				     CIF_C_PROC_YIN_FULL |

commit dedc22f3ee1602b6de7b372e051663ed0ce3da81
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Sat Sep 11 10:25:24 2021 +0800

    media: rockchip: ispp: add frame loss info to procfs
    
    Change-Id: I413608060c2245809a4b1f9d908511531901608d
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/ispp/procfs.c b/drivers/media/platform/rockchip/ispp/procfs.c
index 93c890f6c54d..a2ebb5c31480 100644
--- a/drivers/media/platform/rockchip/ispp/procfs.c
+++ b/drivers/media/platform/rockchip/ispp/procfs.c
@@ -50,7 +50,7 @@ static int ispp_show(struct seq_file *p, void *v)
 		stream = &dev->stream_vdev.stream[val];
 		if (!stream->streaming)
 			continue;
-		seq_printf(p, "%-10s %s Format:%c%c%c%c Size:%dx%d (frame:%d rate:%dms delay:%dms)\n",
+		seq_printf(p, "%-10s %s Format:%c%c%c%c Size:%dx%d (frame:%d rate:%dms delay:%dms frameloss:%d)\n",
 			   "Output",
 			   stream->vnode.vdev.name,
 			   stream->out_fmt.pixelformat,
@@ -61,7 +61,8 @@ static int ispp_show(struct seq_file *p, void *v)
 			   stream->out_fmt.height,
 			   stream->dbg.id,
 			   stream->dbg.interval / 1000 / 1000,
-			   stream->dbg.delay / 1000 / 1000);
+			   stream->dbg.delay / 1000 / 1000,
+			   stream->dbg.frameloss);
 	}
 
 	val = rkispp_read(dev, RKISPP_TNR_CORE_CTRL);
diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c
index 2cda6d352429..cae472cf0697 100644
--- a/drivers/media/platform/rockchip/ispp/stream.c
+++ b/drivers/media/platform/rockchip/ispp/stream.c
@@ -489,17 +489,25 @@ static int rkispp_frame_end(struct rkispp_stream *stream, u32 state)
 		stream->dbg.id = stream->curr_buf->vb.sequence;
 
 		stream->curr_buf = NULL;
-	} else if (stream->is_reg_withstream &&
-		   (fmt->wr_fmt & FMT_FBC || fmt->wr_fmt == FMT_YUV420)) {
-		u32 frame_id;
-
-		frame_id = dev->ispp_sdev.frm_sync_seq;
-		rkispp_find_regbuf_by_id(dev, &reg_buf, dev->dev_id, frame_id);
-		if (reg_buf) {
-			rkispp_release_regbuf(dev, reg_buf);
-			v4l2_info(&dev->v4l2_dev,
-				  "%s: current frame use dummy buffer(dev_id %d, sequence %d)\n",
-				  __func__, dev->dev_id, frame_id);
+	} else {
+		u32 frame_id = dev->ispp_sdev.frm_sync_seq;
+
+		if (stream->is_cfg) {
+			stream->dbg.frameloss++;
+			v4l2_dbg(0, rkispp_debug, &dev->v4l2_dev,
+				 "stream:%d no buf, lost frame:%d\n",
+				 stream->id, frame_id);
+		}
+
+		if (stream->is_reg_withstream &&
+		    (fmt->wr_fmt & FMT_FBC || fmt->wr_fmt == FMT_YUV420)) {
+			rkispp_find_regbuf_by_id(dev, &reg_buf, dev->dev_id, frame_id);
+			if (reg_buf) {
+				rkispp_release_regbuf(dev, reg_buf);
+				v4l2_info(&dev->v4l2_dev,
+					  "%s: current frame use dummy buffer(dev_id %d, sequence %d)\n",
+					  __func__, dev->dev_id, frame_id);
+			}
 		}
 	}
 

commit 066b913603ea202ac375d1bf62bcbeb6e855d3f9
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Thu Aug 19 10:21:59 2021 +0800

    media: rockchip: isp: add frame loss info to procfs
    
    Change-Id: Idecd94535da352fcde5f2a462d4596316f9ea049
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/bridge.c b/drivers/media/platform/rockchip/isp/bridge.c
index 7cc018622e23..b235d6ef06a2 100644
--- a/drivers/media/platform/rockchip/isp/bridge.c
+++ b/drivers/media/platform/rockchip/isp/bridge.c
@@ -487,11 +487,12 @@ static void rkisp_bridge_save_fbcgain(struct rkisp_device *dev, struct rkisp_isp
 
 	spin_lock_irqsave(&hw->buf_lock, lock_flags);
 	if (dev->cur_fbcgain) {
-		v4l2_dbg(3, rkisp_debug, &br_dev->sd,
+		v4l2_dbg(1, rkisp_debug, &br_dev->sd,
 			 "%s old mfbcgain buf is exit, frame_id %d\n",
 			 __func__, dev->cur_fbcgain->frame_id);
 		list_add_tail(&dev->cur_fbcgain->list, &hw->list);
 		dev->cur_fbcgain = NULL;
+		br_dev->dbg.frameloss++;
 	}
 	dev->cur_fbcgain = fbcgain;
 	rkisp_bridge_try_sendtohal(dev);
@@ -597,6 +598,7 @@ static int frame_end(struct rkisp_bridge_device *dev, bool en, u32 state)
 		hw->cur_buf = NULL;
 	} else {
 		v4l2_dbg(1, rkisp_debug, &dev->sd, "no buf, lost frame:%d\n", dev->dbg.id);
+		dev->dbg.frameloss++;
 	}
 
 	if (hw->nxt_buf) {
@@ -1276,6 +1278,7 @@ static int bridge_s_stream(struct v4l2_subdev *sd, int on)
 		 "%s %d\n", __func__, on);
 
 	if (on) {
+		memset(&dev->dbg, 0, sizeof(dev->dbg));
 		atomic_inc(&dev->ispdev->cap_dev.refcnt);
 		ret = bridge_start_stream(sd);
 	} else {
@@ -1467,11 +1470,12 @@ void rkisp_bridge_save_spbuf(struct rkisp_device *dev, struct rkisp_buffer *sp_b
 
 	spin_lock_irqsave(&hw->buf_lock, lock_flags);
 	if (dev->cur_spbuf) {
-		v4l2_dbg(3, rkisp_debug, &br_dev->sd,
+		v4l2_dbg(1, rkisp_debug, &br_dev->sd,
 			 "%s old sp buf is exit, frame_id %d\n",
 			 __func__, dev->cur_spbuf->vb.sequence);
 		rkisp_spbuf_queue(&dev->cap_dev.stream[RKISP_STREAM_SP], dev->cur_spbuf);
 		dev->cur_spbuf = NULL;
+		dev->cap_dev.stream[RKISP_STREAM_SP].dbg.frameloss++;
 	}
 	dev->cur_spbuf = sp_buf;
 	rkisp_bridge_try_sendtohal(dev);
diff --git a/drivers/media/platform/rockchip/isp/capture_v20.c b/drivers/media/platform/rockchip/isp/capture_v20.c
index 2480591d9edb..e865c790206f 100644
--- a/drivers/media/platform/rockchip/isp/capture_v20.c
+++ b/drivers/media/platform/rockchip/isp/capture_v20.c
@@ -762,8 +762,10 @@ static void update_dmatx_v2(struct rkisp_stream *stream)
 			else
 				hdr_qbuf(&dev->hdr.q_tx[index], buf);
 		}
-		if (!buf && dev->hw_dev->dummy_buf.mem_priv)
+		if (!buf && dev->hw_dev->dummy_buf.mem_priv) {
 			buf = &dev->hw_dev->dummy_buf;
+			stream->dbg.frameloss++;
+		}
 		if (buf)
 			mi_set_y_addr(stream, buf->dma_addr);
 	}
@@ -794,6 +796,7 @@ static void update_mi(struct rkisp_stream *stream)
 		mi_set_y_addr(stream, dummy_buf->dma_addr);
 		mi_set_cb_addr(stream, dummy_buf->dma_addr);
 		mi_set_cr_addr(stream, dummy_buf->dma_addr);
+		stream->dbg.frameloss++;
 	}
 
 	mi_set_y_offset(stream, 0);
@@ -1076,6 +1079,7 @@ static int mi_frame_end(struct rkisp_stream *stream)
 					v4l2_err(&dev->v4l2_dev,
 						 "multiple long data in hdr frame\n");
 					rkisp_buf_queue(&cap->rdbk_buf[RDBK_L]->vb.vb2_buf);
+					stream->dbg.frameloss++;
 				}
 				cap->rdbk_buf[RDBK_L] = stream->curr_buf;
 			} else if (stream->id == RKISP_STREAM_DMATX1) {
@@ -1083,6 +1087,7 @@ static int mi_frame_end(struct rkisp_stream *stream)
 					v4l2_err(&dev->v4l2_dev,
 						 "multiple middle data in hdr frame\n");
 					rkisp_buf_queue(&cap->rdbk_buf[RDBK_M]->vb.vb2_buf);
+					stream->dbg.frameloss++;
 				}
 				cap->rdbk_buf[RDBK_M] = stream->curr_buf;
 			} else if (stream->id == RKISP_STREAM_DMATX2) {
@@ -1090,6 +1095,7 @@ static int mi_frame_end(struct rkisp_stream *stream)
 					v4l2_err(&dev->v4l2_dev,
 						 "multiple short data in hdr frame\n");
 					rkisp_buf_queue(&cap->rdbk_buf[RDBK_S]->vb.vb2_buf);
+					stream->dbg.frameloss++;
 				}
 				cap->rdbk_buf[RDBK_S] = stream->curr_buf;
 				rdbk_frame_end(stream);
@@ -1536,6 +1542,7 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count)
 			return -EBUSY;
 	}
 
+	memset(&stream->dbg, 0, sizeof(stream->dbg));
 	atomic_inc(&dev->cap_dev.refcnt);
 	if (!dev->isp_inp || !stream->linked) {
 		v4l2_err(v4l2_dev, "check video link or isp input\n");
diff --git a/drivers/media/platform/rockchip/isp/capture_v21.c b/drivers/media/platform/rockchip/isp/capture_v21.c
index 6aa3de1332e2..38961520f4c2 100644
--- a/drivers/media/platform/rockchip/isp/capture_v21.c
+++ b/drivers/media/platform/rockchip/isp/capture_v21.c
@@ -656,8 +656,10 @@ static void update_dmatx_v2(struct rkisp_stream *stream)
 			else
 				hdr_qbuf(&dev->hdr.q_tx[index], buf);
 		}
-		if (!buf && dev->hw_dev->dummy_buf.mem_priv)
+		if (!buf && dev->hw_dev->dummy_buf.mem_priv) {
 			buf = &dev->hw_dev->dummy_buf;
+			stream->dbg.frameloss++;
+		}
 		if (buf)
 			mi_set_y_addr(stream, buf->dma_addr);
 	}
@@ -696,6 +698,7 @@ static void update_mi(struct rkisp_stream *stream)
 			    dummy_buf->dma_addr, false);
 		rkisp_write(dev, stream->config->mi.cr_base_ad_init,
 			    dummy_buf->dma_addr, false);
+		stream->dbg.frameloss++;
 	}
 
 	mi_set_y_offset(stream, 0);
@@ -842,6 +845,7 @@ static void rdbk_frame_end(struct rkisp_stream *stream)
 	return;
 
 RDBK_FRM_UNMATCH:
+	stream->dbg.frameloss++;
 	if (cap->rdbk_buf[RDBK_L])
 		rkisp_buf_queue(&cap->rdbk_buf[RDBK_L]->vb.vb2_buf);
 	if (cap->rdbk_buf[RDBK_S])
@@ -1319,6 +1323,7 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count)
 		return -EBUSY;
 	}
 
+	memset(&stream->dbg, 0, sizeof(stream->dbg));
 	atomic_inc(&dev->cap_dev.refcnt);
 	if (!dev->isp_inp || !stream->linked) {
 		v4l2_err(v4l2_dev, "check video link or isp input\n");
diff --git a/drivers/media/platform/rockchip/isp/isp_ispp.h b/drivers/media/platform/rockchip/isp/isp_ispp.h
index 120fda108b1a..6ebb89ff4811 100644
--- a/drivers/media/platform/rockchip/isp/isp_ispp.h
+++ b/drivers/media/platform/rockchip/isp/isp_ispp.h
@@ -71,6 +71,7 @@ struct frame_debug_info {
 	u32 interval;
 	u32 delay;
 	u32 id;
+	u32 frameloss;
 };
 
 struct max_input {
diff --git a/drivers/media/platform/rockchip/isp/procfs.c b/drivers/media/platform/rockchip/isp/procfs.c
index 467e46dd3079..92987e8dc42e 100644
--- a/drivers/media/platform/rockchip/isp/procfs.c
+++ b/drivers/media/platform/rockchip/isp/procfs.c
@@ -245,13 +245,14 @@ static int isp_show(struct seq_file *p, void *v)
 		   sdev->in_crop.width, sdev->in_crop.height, val,
 		   sdev->in_crop.left, sdev->in_crop.top);
 	if (IS_HDR_RDBK(dev->hdr.op_mode))
-		seq_printf(p, "%-10s mode:frame%d (frame:%d rate:%dms %s time:%dms) cnt(total:%d X1:%d X2:%d X3:%d)\n",
+		seq_printf(p, "%-10s mode:frame%d (frame:%d rate:%dms %s time:%dms frameloss:%d) cnt(total:%d X1:%d X2:%d X3:%d)\n",
 			   "Isp Read",
 			   dev->rd_mode - 3,
 			   dev->dmarx_dev.cur_frame.id,
 			   (u32)(dev->dmarx_dev.cur_frame.timestamp - dev->dmarx_dev.pre_frame.timestamp) / 1000 / 1000,
 			   (dev->isp_state & ISP_FRAME_END) ? "idle" : "working",
 			   sdev->dbg.interval / 1000 / 1000,
+			   sdev->dbg.frameloss,
 			   dev->rdbk_cnt,
 			   dev->rdbk_cnt_x1,
 			   dev->rdbk_cnt_x2,
@@ -265,7 +266,7 @@ static int isp_show(struct seq_file *p, void *v)
 			   sdev->dbg.delay / 1000);
 
 	if (dev->br_dev.en)
-		seq_printf(p, "%-10s rkispp%d Format:%s%s Size:%dx%d (frame:%d rate:%dms)\n",
+		seq_printf(p, "%-10s rkispp%d Format:%s%s Size:%dx%d (frame:%d rate:%dms frameloss:%d)\n",
 			   "Output",
 			   dev->dev_id,
 			   (dev->br_dev.work_mode & ISP_ISPP_FBC) ? "FBC" : "YUV",
@@ -273,13 +274,14 @@ static int isp_show(struct seq_file *p, void *v)
 			   dev->br_dev.crop.width,
 			   dev->br_dev.crop.height,
 			   dev->br_dev.dbg.id,
-			   dev->br_dev.dbg.interval / 1000 / 1000);
+			   dev->br_dev.dbg.interval / 1000 / 1000,
+			   dev->br_dev.dbg.frameloss);
 	for (val = 0; val < RKISP_MAX_STREAM; val++) {
 		struct rkisp_stream *stream = &dev->cap_dev.stream[val];
 
 		if (!stream->streaming)
 			continue;
-		seq_printf(p, "%-10s %s Format:%c%c%c%c Size:%dx%d (frame:%d rate:%dms delay:%dms)\n",
+		seq_printf(p, "%-10s %s Format:%c%c%c%c Size:%dx%d (frame:%d rate:%dms delay:%dms frameloss:%d)\n",
 			   "Output",
 			   stream->vnode.vdev.name,
 			   stream->out_fmt.pixelformat,
@@ -290,7 +292,8 @@ static int isp_show(struct seq_file *p, void *v)
 			   stream->out_fmt.height,
 			   stream->dbg.id,
 			   stream->dbg.interval / 1000 / 1000,
-			   stream->dbg.delay / 1000 / 1000);
+			   stream->dbg.delay / 1000 / 1000,
+			   stream->dbg.frameloss);
 	}
 
 	switch (dev->isp_ver) {
diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c
index 82198a861951..2195180d72a2 100644
--- a/drivers/media/platform/rockchip/isp/rkisp.c
+++ b/drivers/media/platform/rockchip/isp/rkisp.c
@@ -650,6 +650,10 @@ static void rkisp_rdbk_trigger_handle(struct rkisp_device *dev, u32 cmd)
 		isp = hw->isp[id];
 		rkisp_rdbk_trigger_event(isp, T_CMD_DEQUEUE, &t);
 		isp->dmarx_dev.pre_frame = isp->dmarx_dev.cur_frame;
+		if (t.frame_id > isp->dmarx_dev.pre_frame.id &&
+		    t.frame_id - isp->dmarx_dev.pre_frame.id > 1)
+			isp->isp_sdev.dbg.frameloss +=
+				t.frame_id - isp->dmarx_dev.pre_frame.id + 1;
 		isp->dmarx_dev.cur_frame.id = t.frame_id;
 		isp->dmarx_dev.cur_frame.sof_timestamp = t.sof_timestamp;
 		isp->dmarx_dev.cur_frame.timestamp = t.frame_timestamp;
@@ -2226,6 +2230,7 @@ static int rkisp_isp_sd_s_stream(struct v4l2_subdev *sd, int on)
 	}
 
 	rkisp_start_3a_run(isp_dev);
+	memset(&isp_dev->isp_sdev.dbg, 0, sizeof(isp_dev->isp_sdev.dbg));
 	mutex_lock(&isp_dev->hw_dev->dev_lock);
 	atomic_inc(&isp_dev->hw_dev->refcnt);
 	atomic_set(&isp_dev->isp_sdev.frm_sync_seq, 0);

commit 75d5fa521cd8476559a44fc69e9a1cd85a2dc3fa
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Fri Sep 10 11:05:53 2021 +0800

    media: rockchip: ispp: frame start to check stream output buffer
    
    Change-Id: I8ca95767705ffd705c90e22ab5d067fe7d79ad9e
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c
index e5894339da2a..2cda6d352429 100644
--- a/drivers/media/platform/rockchip/ispp/stream.c
+++ b/drivers/media/platform/rockchip/ispp/stream.c
@@ -402,6 +402,20 @@ static void update_mi(struct rkispp_stream *stream)
 		 rkispp_read(dev, stream->config->reg.cur_uv_base));
 }
 
+static void get_stream_buf(struct rkispp_stream *stream)
+{
+	unsigned long lock_flags = 0;
+
+	spin_lock_irqsave(&stream->vbq_lock, lock_flags);
+	if (!list_empty(&stream->buf_queue) && !stream->curr_buf) {
+		stream->curr_buf =
+			list_first_entry(&stream->buf_queue,
+					 struct rkispp_buffer, queue);
+		list_del(&stream->curr_buf->queue);
+	}
+	spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
+}
+
 static int rkispp_frame_end(struct rkispp_stream *stream, u32 state)
 {
 	struct rkispp_device *dev = stream->isppdev;
@@ -489,15 +503,7 @@ static int rkispp_frame_end(struct rkispp_stream *stream, u32 state)
 		}
 	}
 
-	spin_lock_irqsave(&stream->vbq_lock, lock_flags);
-	if (!list_empty(&stream->buf_queue) && !stream->curr_buf) {
-		stream->curr_buf =
-			list_first_entry(&stream->buf_queue,
-					 struct rkispp_buffer, queue);
-		list_del(&stream->curr_buf->queue);
-	}
-	spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
-
+	get_stream_buf(stream);
 	update_mi(stream);
 	return 0;
 }
@@ -2596,9 +2602,19 @@ static void fec_work_event(struct rkispp_device *dev,
 			dev->ispp_sdev.frm_sync_seq = seq;
 		}
 
+		/* check MB config and output buf beforce start, when MB connect to FEC
+		 * MB update by FEC_FORCE_UPD
+		 */
 		stream = &vdev->stream[STREAM_MB];
-		if (stream->streaming && !stream->is_cfg)
-			secure_config_mb(stream);
+		if (stream->streaming) {
+			if (!stream->is_cfg) {
+				secure_config_mb(stream);
+			} else if (!stream->curr_buf) {
+				get_stream_buf(stream);
+				if (stream->curr_buf)
+					update_mi(stream);
+			}
+		}
 
 		if (!dev->hw_dev->is_single)
 			rkispp_update_regs(dev, RKISPP_FEC, RKISPP_FEC_CROP);
@@ -2877,9 +2893,31 @@ static void nr_work_event(struct rkispp_device *dev,
 			}
 		}
 
+		/* check MB config and output buf beforce start, when MB connect to SHARP
+		 * MB update by OTHER_FORCE_UPD
+		 */
 		stream = &vdev->stream[STREAM_MB];
-		if (!is_fec_en && stream->streaming && !stream->is_cfg)
-			secure_config_mb(stream);
+		if (!is_fec_en && stream->streaming) {
+			if (!stream->is_cfg) {
+				secure_config_mb(stream);
+			} else if (!stream->curr_buf) {
+				get_stream_buf(stream);
+				if (stream->curr_buf)
+					update_mi(stream);
+			}
+		}
+
+		/* check SCL output buf beforce start
+		 * SCL update by OTHER_FORCE_UPD
+		 */
+		for (val = STREAM_S0; val <= STREAM_S2; val++) {
+			stream = &vdev->stream[val];
+			if (!stream->streaming || !stream->is_cfg || stream->curr_buf)
+				continue;
+			get_stream_buf(stream);
+			if (stream->curr_buf)
+				update_mi(stream);
+		}
 
 		if (!dev->hw_dev->is_single) {
 			if (vdev->nr.cur_rd &&

commit 70c1ef2a9e6a8d63b2b4d07ca91e1e85cac16a45
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Tue Sep 14 11:46:17 2021 +0800

    drm/rockchip: ebc_dev: release version v2.11
    
    register /dev/waveform for hwc with eink regal lib
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: I4a1db7199015f48423cd79905562b29dd28a8696

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index b539d76951f9..9ed386ebbf21 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -23,49 +23,49 @@ __initcall_ebc_init6s:
 get_auto_image:
 .LFB2811:
 	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
-	.loc 1 453 0
+	.loc 1 455 0
 	.cfi_startproc
 .LVL0:
-	.loc 1 454 0
+	.loc 1 456 0
 	adrp	x5, .LANCHOR0
-	.loc 1 462 0
-	ldrb	w11, [x4, 32]
+	.loc 1 464 0
+	ldrb	w11, [x4, 48]
 .LVL1:
-	.loc 1 454 0
+	.loc 1 456 0
 	ldr	x16, [x5, #:lo12:.LANCHOR0]
-	.loc 1 466 0
+	.loc 1 468 0
 	add	x16, x16, 24
 	ldr	w18, [x16, 156]
-	.loc 1 472 0
-	ldp	w12, w17, [x16, 84]
 	.loc 1 474 0
-	str	wzr, [x4, 36]
+	ldp	w12, w17, [x16, 84]
+	.loc 1 476 0
+	str	wzr, [x4, 52]
 .LVL2:
-	.loc 1 480 0
+	.loc 1 482 0
 	cmp	w17, 0
 	ble	.L54
 	lsr	w12, w12, 3
 .LVL3:
-	.loc 1 453 0
+	.loc 1 455 0
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
 	sub	w15, w12, #1
-	.loc 1 480 0
+	.loc 1 482 0
 	mov	w14, 0
 .LVL4:
 	add	x15, x15, 1
-	.loc 1 453 0
+	.loc 1 455 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	lsl	x30, x15, 3
 	lsl	x15, x15, 2
 	stp	x19, x20, [sp, 16]
 	stp	x21, x22, [sp, 32]
-	.loc 1 492 0
+	.loc 1 494 0
 	mov	w13, 1
-	.loc 1 453 0
+	.loc 1 455 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 19, -48
 	.cfi_offset 20, -40
@@ -76,9 +76,9 @@ get_auto_image:
 .LVL5:
 	.p2align 2
 .L26:
-	.loc 1 481 0
+	.loc 1 483 0
 	cbz	w18, .L3
-	.loc 1 482 0
+	.loc 1 484 0
 	ldp	w5, w10, [x16, 84]
 .LVL6:
 	sub	w10, w10, #1
@@ -91,306 +91,306 @@ get_auto_image:
 	add	x10, x10, 2
 .LVL8:
 	add	x6, x3, 8
-	.loc 1 486 0 discriminator 1
+	.loc 1 488 0 discriminator 1
 	mov	x9, 0
 	cbz	w12, .L5
 	.p2align 2
 .L42:
-	.loc 1 489 0
+	.loc 1 491 0
 	ldr	w7, [x1, x9, lsl 2]
 .LVL9:
-	.loc 1 490 0
+	.loc 1 492 0
 	ldr	w5, [x2, x9, lsl 2]
 .LVL10:
-	.loc 1 491 0
+	.loc 1 493 0
 	cmp	w7, w5
 	beq	.L7
-	.loc 1 493 0
+	.loc 1 495 0
 	eor	w8, w7, w5
-	.loc 1 492 0
-	str	w13, [x4, 36]
-	.loc 1 488 0
-	mov	w19, 0
 	.loc 1 494 0
+	str	w13, [x4, 52]
+	.loc 1 490 0
+	mov	w19, 0
+	.loc 1 496 0
 	tst	x8, 15
 	beq	.L8
-	.loc 1 495 0
-	ldrb	w21, [x6, -8]
 	.loc 1 497 0
+	ldrb	w21, [x6, -8]
+	.loc 1 499 0
 	ubfiz	w19, w5, 8, 8
-	ldr	x22, [x4, 112]
+	ldr	x22, [x4, 128]
 	add	w19, w19, w7, uxtb
-	.loc 1 499 0
+	.loc 1 501 0
 	add	w20, w21, 1
-	.loc 1 497 0
+	.loc 1 499 0
 	add	x19, x22, x19
-	.loc 1 496 0
+	.loc 1 498 0
 	lsl	w21, w21, 16
-	.loc 1 499 0
+	.loc 1 501 0
 	and	w20, w20, 255
-	.loc 1 500 0
+	.loc 1 502 0
 	cmp	w11, w20
-	.loc 1 497 0
+	.loc 1 499 0
 	ldrb	w19, [x19, w21, sxtw]
 	and	w19, w19, 3
-	.loc 1 500 0
+	.loc 1 502 0
 	beq	.L58
 .L9:
-	.loc 1 504 0
+	.loc 1 506 0
 	strb	w20, [x6, -8]
 .L8:
-	.loc 1 507 0
+	.loc 1 509 0
 	tst	w8, 240
 	beq	.L10
-	.loc 1 510 0
+	.loc 1 512 0
 	lsr	w20, w5, 4
-	.loc 1 508 0
-	ldrb	w21, [x6, -7]
 	.loc 1 510 0
+	ldrb	w21, [x6, -7]
+	.loc 1 512 0
 	ubfx	x22, x7, 4, 8
 	ubfiz	w20, w20, 8, 8
 	add	w20, w20, w22
-	ldr	x22, [x4, 112]
-	.loc 1 509 0
+	ldr	x22, [x4, 128]
+	.loc 1 511 0
 	lsl	w23, w21, 16
-	.loc 1 512 0
+	.loc 1 514 0
 	add	w21, w21, 1
-	.loc 1 510 0
-	add	x20, x22, x20
 	.loc 1 512 0
+	add	x20, x22, x20
+	.loc 1 514 0
 	and	w21, w21, 255
-	.loc 1 513 0
+	.loc 1 515 0
 	cmp	w11, w21
-	.loc 1 510 0
+	.loc 1 512 0
 	ldrb	w20, [x20, w23, sxtw]
-	.loc 1 511 0
+	.loc 1 513 0
 	ubfiz	w20, w20, 2, 2
 	orr	w19, w20, w19
-	.loc 1 513 0
+	.loc 1 515 0
 	beq	.L59
 .L11:
-	.loc 1 517 0
+	.loc 1 519 0
 	strb	w21, [x6, -7]
 .L10:
-	.loc 1 520 0
+	.loc 1 522 0
 	tst	w8, 3840
 	beq	.L12
-	.loc 1 521 0
-	ldrb	w22, [x6, -6]
 	.loc 1 523 0
+	ldrb	w22, [x6, -6]
+	.loc 1 525 0
 	and	w21, w5, 65280
-	ldr	x23, [x4, 112]
+	ldr	x23, [x4, 128]
 	ubfx	x20, x7, 8, 8
 	orr	w20, w20, w21
-	.loc 1 525 0
+	.loc 1 527 0
 	add	w21, w22, 1
-	.loc 1 522 0
+	.loc 1 524 0
 	lsl	w22, w22, 16
-	.loc 1 525 0
+	.loc 1 527 0
 	and	w21, w21, 255
-	.loc 1 523 0
+	.loc 1 525 0
 	add	x20, x23, x20, uxth
-	.loc 1 526 0
+	.loc 1 528 0
 	cmp	w11, w21
-	.loc 1 523 0
+	.loc 1 525 0
 	ldrb	w20, [x20, w22, sxtw]
-	.loc 1 524 0
+	.loc 1 526 0
 	ubfiz	w20, w20, 4, 2
 	orr	w19, w20, w19
-	.loc 1 526 0
+	.loc 1 528 0
 	beq	.L60
 .L13:
-	.loc 1 530 0
+	.loc 1 532 0
 	strb	w21, [x6, -6]
 .L12:
-	.loc 1 533 0
+	.loc 1 535 0
 	tst	w8, 61440
 	beq	.L14
-	.loc 1 536 0
+	.loc 1 538 0
 	lsr	w20, w5, 12
-	.loc 1 534 0
-	ldrb	w21, [x6, -5]
 	.loc 1 536 0
+	ldrb	w21, [x6, -5]
+	.loc 1 538 0
 	ubfx	x22, x7, 12, 8
 	ubfiz	w20, w20, 8, 8
 	add	w20, w20, w22
-	ldr	x22, [x4, 112]
-	.loc 1 535 0
+	ldr	x22, [x4, 128]
+	.loc 1 537 0
 	lsl	w23, w21, 16
-	.loc 1 538 0
+	.loc 1 540 0
 	add	w21, w21, 1
-	.loc 1 536 0
-	add	x20, x22, x20
 	.loc 1 538 0
+	add	x20, x22, x20
+	.loc 1 540 0
 	and	w21, w21, 255
-	.loc 1 539 0
+	.loc 1 541 0
 	cmp	w11, w21
-	.loc 1 536 0
+	.loc 1 538 0
 	ldrb	w20, [x20, w23, sxtw]
-	.loc 1 537 0
+	.loc 1 539 0
 	ubfiz	w20, w20, 6, 2
 	orr	w19, w20, w19
-	.loc 1 539 0
+	.loc 1 541 0
 	beq	.L61
 .L15:
-	.loc 1 543 0
+	.loc 1 545 0
 	strb	w21, [x6, -5]
 .L14:
-	.loc 1 546 0
+	.loc 1 548 0
 	strb	w19, [x10, -2]
-	.loc 1 549 0
+	.loc 1 551 0
 	tst	w8, 983040
-	.loc 1 548 0
+	.loc 1 550 0
 	mov	w19, 0
-	.loc 1 549 0
+	.loc 1 551 0
 	beq	.L16
-	.loc 1 552 0
+	.loc 1 554 0
 	lsr	w19, w5, 16
-	.loc 1 550 0
-	ldrb	w20, [x6, -4]
 	.loc 1 552 0
+	ldrb	w20, [x6, -4]
+	.loc 1 554 0
 	ubfx	x21, x7, 16, 8
 	ubfiz	w19, w19, 8, 8
 	add	w19, w19, w21
-	ldr	x21, [x4, 112]
-	.loc 1 551 0
+	ldr	x21, [x4, 128]
+	.loc 1 553 0
 	lsl	w22, w20, 16
-	.loc 1 554 0
+	.loc 1 556 0
 	add	w20, w20, 1
-	.loc 1 552 0
-	add	x19, x21, x19
 	.loc 1 554 0
+	add	x19, x21, x19
+	.loc 1 556 0
 	and	w20, w20, 255
-	.loc 1 555 0
+	.loc 1 557 0
 	cmp	w11, w20
-	.loc 1 552 0
+	.loc 1 554 0
 	ldrb	w19, [x19, w22, sxtw]
 	and	w19, w19, 3
-	.loc 1 555 0
+	.loc 1 557 0
 	beq	.L62
 .L17:
-	.loc 1 559 0
+	.loc 1 561 0
 	strb	w20, [x6, -4]
 .L16:
-	.loc 1 562 0
+	.loc 1 564 0
 	tst	w8, 15728640
 	beq	.L18
-	.loc 1 565 0
+	.loc 1 567 0
 	lsr	w20, w5, 20
-	.loc 1 563 0
-	ldrb	w21, [x6, -3]
 	.loc 1 565 0
+	ldrb	w21, [x6, -3]
+	.loc 1 567 0
 	ubfx	x22, x7, 20, 8
 	ubfiz	w20, w20, 8, 8
 	add	w20, w20, w22
-	ldr	x22, [x4, 112]
-	.loc 1 564 0
+	ldr	x22, [x4, 128]
+	.loc 1 566 0
 	lsl	w23, w21, 16
-	.loc 1 567 0
+	.loc 1 569 0
 	add	w21, w21, 1
-	.loc 1 565 0
-	add	x20, x22, x20
 	.loc 1 567 0
+	add	x20, x22, x20
+	.loc 1 569 0
 	and	w21, w21, 255
-	.loc 1 568 0
+	.loc 1 570 0
 	cmp	w11, w21
-	.loc 1 565 0
+	.loc 1 567 0
 	ldrb	w20, [x20, w23, sxtw]
-	.loc 1 566 0
+	.loc 1 568 0
 	ubfiz	w20, w20, 2, 2
 	orr	w19, w20, w19
-	.loc 1 568 0
+	.loc 1 570 0
 	beq	.L63
 .L19:
-	.loc 1 572 0
+	.loc 1 574 0
 	strb	w21, [x6, -3]
 .L18:
-	.loc 1 575 0
+	.loc 1 577 0
 	tst	w8, 251658240
 	beq	.L20
-	.loc 1 576 0
-	ldrb	w22, [x6, -2]
 	.loc 1 578 0
+	ldrb	w22, [x6, -2]
+	.loc 1 580 0
 	lsr	w20, w5, 24
 	mov	w21, w20
 	lsr	w24, w7, 24
-	ldr	x23, [x4, 112]
+	ldr	x23, [x4, 128]
 	add	w20, w24, w21, lsl 8
-	.loc 1 580 0
+	.loc 1 582 0
 	add	w21, w22, 1
-	.loc 1 577 0
+	.loc 1 579 0
 	lsl	w22, w22, 16
-	.loc 1 578 0
-	add	x20, x23, x20
 	.loc 1 580 0
+	add	x20, x23, x20
+	.loc 1 582 0
 	and	w21, w21, 255
-	.loc 1 581 0
+	.loc 1 583 0
 	cmp	w11, w21
-	.loc 1 578 0
+	.loc 1 580 0
 	ldrb	w20, [x20, w22, sxtw]
-	.loc 1 579 0
+	.loc 1 581 0
 	ubfiz	w20, w20, 4, 2
 	orr	w19, w20, w19
-	.loc 1 581 0
+	.loc 1 583 0
 	beq	.L64
 .L21:
-	.loc 1 585 0
+	.loc 1 587 0
 	strb	w21, [x6, -2]
 .L20:
-	.loc 1 588 0
+	.loc 1 590 0
 	tst	w8, -268435456
 	beq	.L22
-	.loc 1 589 0
-	ldrb	w21, [x6, -1]
 	.loc 1 591 0
+	ldrb	w21, [x6, -1]
+	.loc 1 593 0
 	lsr	w8, w5, 28
 .LVL11:
 	mov	w20, w8
 	lsr	w23, w7, 28
-	ldr	x22, [x4, 112]
+	ldr	x22, [x4, 128]
 	add	w8, w23, w20, lsl 8
-	.loc 1 593 0
+	.loc 1 595 0
 	add	w20, w21, 1
-	.loc 1 590 0
+	.loc 1 592 0
 	lsl	w21, w21, 16
-	.loc 1 591 0
-	add	x8, x22, x8
 	.loc 1 593 0
+	add	x8, x22, x8
+	.loc 1 595 0
 	and	w20, w20, 255
-	.loc 1 594 0
+	.loc 1 596 0
 	cmp	w11, w20
-	.loc 1 591 0
+	.loc 1 593 0
 	ldrb	w8, [x8, w21, sxtw]
-	.loc 1 592 0
+	.loc 1 594 0
 	ubfiz	w8, w8, 6, 2
 	orr	w19, w8, w19
-	.loc 1 594 0
+	.loc 1 596 0
 	beq	.L65
 .L23:
-	.loc 1 598 0
+	.loc 1 600 0
 	strb	w20, [x6, -1]
 .LVL12:
 .L22:
-	.loc 1 601 0
+	.loc 1 603 0
 	str	w5, [x2, x9, lsl 2]
-	.loc 1 602 0
+	.loc 1 604 0
 	strb	w19, [x10, -1]
 .L24:
 	add	x9, x9, 1
 	add	x10, x10, 2
 	add	x6, x6, 8
-	.loc 1 486 0 discriminator 2
+	.loc 1 488 0 discriminator 2
 	cmp	w12, w9
 	bgt	.L42
 	add	x3, x3, x30
 	add	x2, x2, x15
 	add	x1, x1, x15
 .L5:
-	.loc 1 480 0 discriminator 2
+	.loc 1 482 0 discriminator 2
 	add	w14, w14, 1
 	cmp	w17, w14
 	bne	.L26
-	.loc 1 614 0
+	.loc 1 616 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
@@ -410,100 +410,100 @@ get_auto_image:
 	.p2align 3
 .L65:
 	.cfi_restore_state
-	.loc 1 596 0
+	.loc 1 598 0
 	and	w5, w5, 268435455
 .LVL14:
 	and	w7, w7, -268435456
 .LVL15:
 	orr	w5, w7, w5
 .LVL16:
-	.loc 1 595 0
+	.loc 1 597 0
 	mov	w20, 0
 	b	.L23
 .LVL17:
 	.p2align 3
 .L64:
-	.loc 1 583 0
+	.loc 1 585 0
 	and	w5, w5, -251658241
 .LVL18:
 	and	w20, w7, 251658240
 	orr	w5, w20, w5
 .LVL19:
-	.loc 1 582 0
+	.loc 1 584 0
 	mov	w21, 0
 	b	.L21
 	.p2align 3
 .L62:
-	.loc 1 557 0
+	.loc 1 559 0
 	and	w20, w7, 983040
 	and	w5, w5, -983041
 .LVL20:
 	orr	w5, w20, w5
 .LVL21:
-	.loc 1 556 0
+	.loc 1 558 0
 	mov	w20, 0
 	b	.L17
 	.p2align 3
 .L63:
-	.loc 1 570 0
+	.loc 1 572 0
 	and	w5, w5, -15728641
 .LVL22:
 	and	w20, w7, 15728640
 	orr	w5, w20, w5
 .LVL23:
-	.loc 1 569 0
+	.loc 1 571 0
 	mov	w21, 0
 	b	.L19
 	.p2align 3
 .L61:
-	.loc 1 541 0
+	.loc 1 543 0
 	and	w5, w5, -61441
 .LVL24:
 	and	w20, w7, 61440
 	orr	w5, w20, w5
 .LVL25:
-	.loc 1 540 0
+	.loc 1 542 0
 	mov	w21, 0
 	b	.L15
 	.p2align 3
 .L59:
-	.loc 1 515 0
+	.loc 1 517 0
 	and	w5, w5, -241
 .LVL26:
 	and	w20, w7, 240
 	orr	w5, w20, w5
 .LVL27:
-	.loc 1 514 0
+	.loc 1 516 0
 	mov	w21, 0
 	b	.L11
 	.p2align 3
 .L60:
-	.loc 1 528 0
+	.loc 1 530 0
 	and	w5, w5, -3841
 .LVL28:
 	and	w20, w7, 3840
 	orr	w5, w20, w5
 .LVL29:
-	.loc 1 527 0
+	.loc 1 529 0
 	mov	w21, 0
 	b	.L13
 	.p2align 3
 .L58:
-	.loc 1 502 0
+	.loc 1 504 0
 	bfi	w5, w7, 0, 4
-	.loc 1 501 0
+	.loc 1 503 0
 	mov	w20, 0
 	b	.L9
 	.p2align 3
 .L7:
-	.loc 1 605 0
+	.loc 1 607 0
 	strb	wzr, [x10, -2]
-	.loc 1 606 0
+	.loc 1 608 0
 	strb	wzr, [x10, -1]
 	b	.L24
 	.p2align 3
 .L3:
-	.loc 1 484 0
+	.loc 1 486 0
 	ldr	w10, [x16, 84]
 	mul	w10, w14, w10
 	lsr	w10, w10, 2
@@ -530,25 +530,25 @@ get_auto_image:
 	.type	get_overlay_image, %function
 get_overlay_image:
 .LFB2812:
-	.loc 1 618 0
+	.loc 1 620 0
 	.cfi_startproc
 .LVL32:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
 	.cfi_offset 30, -88
-	.loc 1 619 0
+	.loc 1 621 0
 	adrp	x5, .LANCHOR0
-	.loc 1 618 0
+	.loc 1 620 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 619 0
+	.loc 1 621 0
 	ldr	x17, [x5, #:lo12:.LANCHOR0]
-	.loc 1 618 0
+	.loc 1 620 0
 	stp	x19, x20, [sp, 16]
-	.loc 1 631 0
+	.loc 1 633 0
 	add	x17, x17, 24
-	.loc 1 618 0
+	.loc 1 620 0
 	stp	x21, x22, [sp, 32]
 	stp	x23, x24, [sp, 48]
 	stp	x25, x26, [sp, 64]
@@ -562,14 +562,14 @@ get_overlay_image:
 	.cfi_offset 25, -32
 	.cfi_offset 26, -24
 	.cfi_offset 27, -16
-	.loc 1 637 0
+	.loc 1 639 0
 	ldp	w11, w18, [x17, 84]
-	.loc 1 631 0
+	.loc 1 633 0
 	ldr	w30, [x17, 156]
-	.loc 1 639 0
-	str	wzr, [x4, 36]
+	.loc 1 641 0
+	str	wzr, [x4, 52]
 .LVL33:
-	.loc 1 645 0
+	.loc 1 647 0
 	cmp	w18, 0
 	ble	.L66
 	lsr	w11, w11, 3
@@ -577,21 +577,21 @@ get_overlay_image:
 	mov	w13, 0
 .LVL35:
 	sub	w16, w11, #1
-	.loc 1 657 0
+	.loc 1 659 0
 	mov	w12, 1
 	add	x16, x16, 1
-	.loc 1 795 0
+	.loc 1 797 0
 	mov	w15, -268435456
 	lsl	x19, x16, 3
 	lsl	x16, x16, 2
-	.loc 1 777 0
+	.loc 1 779 0
 	mov	w14, 251658240
 .LVL36:
 	.p2align 2
 .L99:
-	.loc 1 646 0
+	.loc 1 648 0
 	cbz	w30, .L68
-	.loc 1 647 0
+	.loc 1 649 0
 	ldp	w5, w10, [x17, 84]
 .LVL37:
 	sub	w10, w10, #1
@@ -604,390 +604,390 @@ get_overlay_image:
 	add	x10, x10, 2
 .LVL39:
 	add	x7, x3, 8
-	.loc 1 651 0 discriminator 1
+	.loc 1 653 0 discriminator 1
 	mov	x9, 0
 	cbz	w11, .L70
 	.p2align 2
 .L131:
-	.loc 1 654 0
+	.loc 1 656 0
 	ldr	w5, [x1, x9, lsl 2]
 .LVL40:
-	.loc 1 655 0
+	.loc 1 657 0
 	ldr	w6, [x2, x9, lsl 2]
 .LVL41:
-	.loc 1 656 0
+	.loc 1 658 0
 	cmp	w5, w6
 	beq	.L72
-	.loc 1 658 0
+	.loc 1 660 0
 	eor	w8, w5, w6
-	.loc 1 657 0
-	str	w12, [x4, 36]
-	.loc 1 653 0
-	mov	w20, 0
 	.loc 1 659 0
+	str	w12, [x4, 52]
+	.loc 1 655 0
+	mov	w20, 0
+	.loc 1 661 0
 	tst	x8, 15
 	beq	.L73
-	.loc 1 661 0
-	ldrb	w21, [x7, -8]
 	.loc 1 663 0
+	ldrb	w21, [x7, -8]
+	.loc 1 665 0
 	ubfiz	w20, w6, 8, 8
-	ldr	x23, [x4, 112]
+	ldr	x23, [x4, 128]
 	add	w20, w20, w5, uxtb
-	.loc 1 669 0
-	ldrb	w22, [x4, 32]
-	.loc 1 662 0
+	.loc 1 671 0
+	ldrb	w22, [x4, 48]
+	.loc 1 664 0
 	lsl	w25, w21, 16
-	.loc 1 663 0
+	.loc 1 665 0
 	add	x20, x23, x20
-	.loc 1 667 0
-	ldrb	w24, [x4, 33]
-	.loc 1 666 0
+	.loc 1 669 0
+	ldrb	w24, [x4, 49]
+	.loc 1 668 0
 	ands	w23, w5, 15
-	.loc 1 667 0
+	.loc 1 669 0
 	ccmp	w23, 15, 4, ne
-	.loc 1 665 0
+	.loc 1 667 0
 	add	w21, w21, 1
-	.loc 1 663 0
-	ldrb	w20, [x20, w25, sxtw]
 	.loc 1 665 0
-	and	w21, w21, 255
+	ldrb	w20, [x20, w25, sxtw]
 	.loc 1 667 0
+	and	w21, w21, 255
+	.loc 1 669 0
 	csel	w22, w22, w24, ne
-	.loc 1 663 0
+	.loc 1 665 0
 	and	w20, w20, 3
-	.loc 1 670 0
+	.loc 1 672 0
 	cmp	w22, w21
 	beq	.L143
 .L75:
-	.loc 1 674 0
+	.loc 1 676 0
 	strb	w21, [x7, -8]
 .L73:
-	.loc 1 677 0
+	.loc 1 679 0
 	tst	w8, 240
 	beq	.L76
-	.loc 1 679 0
-	ldrb	w22, [x7, -7]
 	.loc 1 681 0
+	ldrb	w22, [x7, -7]
+	.loc 1 683 0
 	lsr	w21, w6, 4
 	ubfx	x23, x5, 4, 8
 	ubfiz	w21, w21, 8, 8
-	ldr	x24, [x4, 112]
+	ldr	x24, [x4, 128]
 	add	w21, w21, w23
-	.loc 1 680 0
+	.loc 1 682 0
 	lsl	w27, w22, 16
-	.loc 1 678 0
+	.loc 1 680 0
 	and	w25, w5, 240
-	.loc 1 681 0
-	add	x24, x24, x21
 	.loc 1 683 0
+	add	x24, x24, x21
+	.loc 1 685 0
 	add	w21, w22, 1
-	.loc 1 687 0
-	ldrb	w23, [x4, 32]
-	.loc 1 684 0
+	.loc 1 689 0
+	ldrb	w23, [x4, 48]
+	.loc 1 686 0
 	cmp	w25, 240
-	.loc 1 685 0
-	ldrb	w26, [x4, 33]
+	.loc 1 687 0
+	ldrb	w26, [x4, 49]
 	ccmp	w25, 0, 4, ne
-	.loc 1 681 0
-	ldrb	w22, [x24, w27, sxtw]
 	.loc 1 683 0
-	and	w21, w21, 255
+	ldrb	w22, [x24, w27, sxtw]
 	.loc 1 685 0
+	and	w21, w21, 255
+	.loc 1 687 0
 	csel	w23, w23, w26, ne
-	.loc 1 688 0
+	.loc 1 690 0
 	cmp	w23, w21
-	.loc 1 682 0
+	.loc 1 684 0
 	ubfiz	w22, w22, 2, 2
 	orr	w20, w22, w20
-	.loc 1 688 0
+	.loc 1 690 0
 	beq	.L144
 .L78:
-	.loc 1 692 0
+	.loc 1 694 0
 	strb	w21, [x7, -7]
 .L76:
-	.loc 1 695 0
+	.loc 1 697 0
 	tst	w8, 3840
 	beq	.L79
-	.loc 1 697 0
-	ldrb	w21, [x7, -6]
 	.loc 1 699 0
+	ldrb	w21, [x7, -6]
+	.loc 1 701 0
 	and	w23, w6, 65280
-	ldr	x24, [x4, 112]
+	ldr	x24, [x4, 128]
 	ubfx	x22, x5, 8, 8
 	orr	w22, w22, w23
-	.loc 1 696 0
-	and	w23, w5, 3840
 	.loc 1 698 0
+	and	w23, w5, 3840
+	.loc 1 700 0
 	lsl	w26, w21, 16
-	.loc 1 703 0
-	ldrb	w25, [x4, 33]
-	.loc 1 699 0
+	.loc 1 705 0
+	ldrb	w25, [x4, 49]
+	.loc 1 701 0
 	add	x22, x24, x22, uxth
-	.loc 1 702 0
+	.loc 1 704 0
 	cmp	w23, 3840
+	.loc 1 707 0
+	ldrb	w24, [x4, 48]
 	.loc 1 705 0
-	ldrb	w24, [x4, 32]
-	.loc 1 703 0
 	ccmp	w23, 0, 4, ne
-	.loc 1 701 0
+	.loc 1 703 0
 	add	w21, w21, 1
-	.loc 1 699 0
-	ldrb	w22, [x22, w26, sxtw]
 	.loc 1 701 0
-	and	w21, w21, 255
+	ldrb	w22, [x22, w26, sxtw]
 	.loc 1 703 0
+	and	w21, w21, 255
+	.loc 1 705 0
 	csel	w24, w24, w25, ne
-	.loc 1 706 0
+	.loc 1 708 0
 	cmp	w24, w21
-	.loc 1 700 0
+	.loc 1 702 0
 	ubfiz	w22, w22, 4, 2
 	orr	w20, w22, w20
-	.loc 1 706 0
+	.loc 1 708 0
 	beq	.L145
 .L81:
-	.loc 1 710 0
+	.loc 1 712 0
 	strb	w21, [x7, -6]
 .L79:
-	.loc 1 713 0
+	.loc 1 715 0
 	tst	w8, 61440
 	beq	.L82
-	.loc 1 715 0
-	ldrb	w22, [x7, -5]
 	.loc 1 717 0
+	ldrb	w22, [x7, -5]
+	.loc 1 719 0
 	lsr	w21, w6, 12
 	ubfx	x23, x5, 12, 8
 	ubfiz	w21, w21, 8, 8
-	ldr	x24, [x4, 112]
+	ldr	x24, [x4, 128]
 	add	w21, w21, w23
-	.loc 1 716 0
+	.loc 1 718 0
 	lsl	w27, w22, 16
-	.loc 1 714 0
+	.loc 1 716 0
 	and	w25, w5, 61440
-	.loc 1 717 0
-	add	x24, x24, x21
 	.loc 1 719 0
+	add	x24, x24, x21
+	.loc 1 721 0
 	add	w21, w22, 1
-	.loc 1 723 0
-	ldrb	w23, [x4, 32]
-	.loc 1 720 0
+	.loc 1 725 0
+	ldrb	w23, [x4, 48]
+	.loc 1 722 0
 	cmp	w25, 61440
-	.loc 1 721 0
-	ldrb	w26, [x4, 33]
+	.loc 1 723 0
+	ldrb	w26, [x4, 49]
 	ccmp	w25, 0, 4, ne
-	.loc 1 717 0
-	ldrb	w22, [x24, w27, sxtw]
 	.loc 1 719 0
-	and	w21, w21, 255
+	ldrb	w22, [x24, w27, sxtw]
 	.loc 1 721 0
+	and	w21, w21, 255
+	.loc 1 723 0
 	csel	w23, w23, w26, ne
-	.loc 1 724 0
+	.loc 1 726 0
 	cmp	w23, w21
-	.loc 1 718 0
+	.loc 1 720 0
 	ubfiz	w22, w22, 6, 2
 	orr	w20, w22, w20
-	.loc 1 724 0
+	.loc 1 726 0
 	beq	.L146
 .L84:
-	.loc 1 728 0
+	.loc 1 730 0
 	strb	w21, [x7, -5]
 .L82:
-	.loc 1 731 0
+	.loc 1 733 0
 	strb	w20, [x10, -2]
-	.loc 1 734 0
+	.loc 1 736 0
 	tst	w8, 983040
-	.loc 1 733 0
+	.loc 1 735 0
 	mov	w20, 0
-	.loc 1 734 0
+	.loc 1 736 0
 	beq	.L85
-	.loc 1 738 0
+	.loc 1 740 0
 	lsr	w20, w6, 16
-	.loc 1 736 0
-	ldrb	w21, [x7, -4]
 	.loc 1 738 0
+	ldrb	w21, [x7, -4]
+	.loc 1 740 0
 	ubfx	x22, x5, 16, 8
 	ubfiz	w20, w20, 8, 8
 	add	w20, w20, w22
-	ldr	x22, [x4, 112]
-	.loc 1 737 0
+	ldr	x22, [x4, 128]
+	.loc 1 739 0
 	lsl	w25, w21, 16
-	.loc 1 735 0
+	.loc 1 737 0
 	and	w23, w5, 983040
-	.loc 1 738 0
+	.loc 1 740 0
 	add	x20, x22, x20
-	.loc 1 742 0
-	ldrb	w24, [x4, 33]
-	.loc 1 741 0
+	.loc 1 744 0
+	ldrb	w24, [x4, 49]
+	.loc 1 743 0
 	cmp	w23, 983040
+	.loc 1 746 0
+	ldrb	w22, [x4, 48]
 	.loc 1 744 0
-	ldrb	w22, [x4, 32]
-	.loc 1 742 0
 	ccmp	w23, 0, 4, ne
-	.loc 1 740 0
+	.loc 1 742 0
 	add	w21, w21, 1
-	.loc 1 738 0
-	ldrb	w20, [x20, w25, sxtw]
 	.loc 1 740 0
-	and	w21, w21, 255
+	ldrb	w20, [x20, w25, sxtw]
 	.loc 1 742 0
+	and	w21, w21, 255
+	.loc 1 744 0
 	csel	w22, w22, w24, ne
-	.loc 1 738 0
+	.loc 1 740 0
 	and	w20, w20, 3
-	.loc 1 745 0
+	.loc 1 747 0
 	cmp	w22, w21
 	beq	.L147
 .L87:
-	.loc 1 749 0
+	.loc 1 751 0
 	strb	w21, [x7, -4]
 .L85:
-	.loc 1 752 0
+	.loc 1 754 0
 	tst	w8, 15728640
 	beq	.L88
-	.loc 1 754 0
-	ldrb	w22, [x7, -3]
 	.loc 1 756 0
+	ldrb	w22, [x7, -3]
+	.loc 1 758 0
 	lsr	w21, w6, 20
 	ubfx	x23, x5, 20, 8
 	ubfiz	w21, w21, 8, 8
-	ldr	x24, [x4, 112]
+	ldr	x24, [x4, 128]
 	add	w21, w21, w23
-	.loc 1 755 0
+	.loc 1 757 0
 	lsl	w27, w22, 16
-	.loc 1 753 0
+	.loc 1 755 0
 	and	w25, w5, 15728640
-	.loc 1 756 0
-	add	x24, x24, x21
 	.loc 1 758 0
+	add	x24, x24, x21
+	.loc 1 760 0
 	add	w21, w22, 1
-	.loc 1 762 0
-	ldrb	w23, [x4, 32]
-	.loc 1 759 0
+	.loc 1 764 0
+	ldrb	w23, [x4, 48]
+	.loc 1 761 0
 	cmp	w25, 15728640
-	.loc 1 760 0
-	ldrb	w26, [x4, 33]
+	.loc 1 762 0
+	ldrb	w26, [x4, 49]
 	ccmp	w25, 0, 4, ne
-	.loc 1 756 0
-	ldrb	w22, [x24, w27, sxtw]
 	.loc 1 758 0
-	and	w21, w21, 255
+	ldrb	w22, [x24, w27, sxtw]
 	.loc 1 760 0
+	and	w21, w21, 255
+	.loc 1 762 0
 	csel	w23, w23, w26, ne
-	.loc 1 763 0
+	.loc 1 765 0
 	cmp	w23, w21
-	.loc 1 757 0
+	.loc 1 759 0
 	ubfiz	w22, w22, 2, 2
 	orr	w20, w22, w20
-	.loc 1 763 0
+	.loc 1 765 0
 	beq	.L148
 .L90:
-	.loc 1 767 0
+	.loc 1 769 0
 	strb	w21, [x7, -3]
 .L88:
-	.loc 1 770 0
+	.loc 1 772 0
 	tst	w8, 251658240
 	beq	.L91
-	.loc 1 772 0
-	ldrb	w21, [x7, -2]
 	.loc 1 774 0
+	ldrb	w21, [x7, -2]
+	.loc 1 776 0
 	lsr	w22, w6, 24
 	lsr	w25, w5, 24
 	mov	w23, w22
-	ldr	x24, [x4, 112]
+	ldr	x24, [x4, 128]
 	add	w22, w25, w23, lsl 8
-	.loc 1 773 0
+	.loc 1 775 0
 	lsl	w26, w21, 16
-	.loc 1 780 0
-	ldrb	w23, [x4, 32]
-	.loc 1 774 0
+	.loc 1 782 0
+	ldrb	w23, [x4, 48]
+	.loc 1 776 0
 	add	x22, x24, x22
-	.loc 1 778 0
-	ldrb	w25, [x4, 33]
-	.loc 1 777 0
+	.loc 1 780 0
+	ldrb	w25, [x4, 49]
+	.loc 1 779 0
 	ands	w24, w5, 251658240
-	.loc 1 776 0
-	add	w21, w21, 1
 	.loc 1 778 0
+	add	w21, w21, 1
+	.loc 1 780 0
 	ccmp	w24, w14, 4, ne
-	.loc 1 776 0
+	.loc 1 778 0
 	and	w21, w21, 255
-	.loc 1 774 0
+	.loc 1 776 0
 	ldrb	w22, [x22, w26, sxtw]
-	.loc 1 778 0
+	.loc 1 780 0
 	csel	w23, w23, w25, ne
-	.loc 1 781 0
+	.loc 1 783 0
 	cmp	w23, w21
-	.loc 1 775 0
+	.loc 1 777 0
 	ubfiz	w22, w22, 4, 2
 	orr	w20, w22, w20
-	.loc 1 781 0
+	.loc 1 783 0
 	beq	.L149
 .L93:
-	.loc 1 785 0
+	.loc 1 787 0
 	strb	w21, [x7, -2]
 .L91:
-	.loc 1 788 0
+	.loc 1 790 0
 	tst	w8, -268435456
 	beq	.L94
-	.loc 1 790 0
+	.loc 1 792 0
 	ldrb	w8, [x7, -1]
 .LVL42:
-	.loc 1 792 0
+	.loc 1 794 0
 	lsr	w22, w5, 28
-	ldr	x23, [x4, 112]
+	ldr	x23, [x4, 128]
 	lsr	w21, w6, 28
 	add	w21, w22, w21, lsl 8
-	.loc 1 795 0
+	.loc 1 797 0
 	ands	w5, w5, -268435456
 .LVL43:
-	.loc 1 791 0
+	.loc 1 793 0
 	lsl	w24, w8, 16
-	.loc 1 792 0
+	.loc 1 794 0
 	add	x21, x23, x21
+	.loc 1 800 0
+	ldrb	w22, [x4, 48]
 	.loc 1 798 0
-	ldrb	w22, [x4, 32]
-	.loc 1 796 0
 	ccmp	w5, w15, 4, ne
-	ldrb	w23, [x4, 33]
-	.loc 1 794 0
+	ldrb	w23, [x4, 49]
+	.loc 1 796 0
 	add	w8, w8, 1
-	.loc 1 792 0
-	ldrb	w21, [x21, w24, sxtw]
 	.loc 1 794 0
-	and	w8, w8, 255
+	ldrb	w21, [x21, w24, sxtw]
 	.loc 1 796 0
+	and	w8, w8, 255
+	.loc 1 798 0
 	csel	w22, w22, w23, ne
-	.loc 1 799 0
+	.loc 1 801 0
 	cmp	w22, w8
-	.loc 1 793 0
+	.loc 1 795 0
 	ubfiz	w21, w21, 6, 2
 	orr	w20, w21, w20
-	.loc 1 799 0
+	.loc 1 801 0
 	beq	.L150
 .L96:
-	.loc 1 803 0
+	.loc 1 805 0
 	strb	w8, [x7, -1]
 .LVL44:
 .L94:
-	.loc 1 806 0
+	.loc 1 808 0
 	str	w6, [x2, x9, lsl 2]
-	.loc 1 807 0
+	.loc 1 809 0
 	strb	w20, [x10, -1]
 .L97:
 	add	x9, x9, 1
 	add	x10, x10, 2
 	add	x7, x7, 8
-	.loc 1 651 0 discriminator 2
+	.loc 1 653 0 discriminator 2
 	cmp	w11, w9
 	bgt	.L131
 	add	x3, x3, x19
 	add	x2, x2, x16
 	add	x1, x1, x16
 .L70:
-	.loc 1 645 0 discriminator 2
+	.loc 1 647 0 discriminator 2
 	add	w13, w13, 1
 	cmp	w18, w13
 	bne	.L99
 .L66:
-	.loc 1 819 0
+	.loc 1 821 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
@@ -1011,100 +1011,100 @@ get_overlay_image:
 	.p2align 3
 .L149:
 	.cfi_restore_state
-	.loc 1 783 0
+	.loc 1 785 0
 	and	w6, w6, -251658241
 .LVL45:
-	.loc 1 782 0
+	.loc 1 784 0
 	mov	w21, 0
-	.loc 1 783 0
+	.loc 1 785 0
 	orr	w6, w24, w6
 .LVL46:
 	b	.L93
 .LVL47:
 	.p2align 3
 .L150:
-	.loc 1 801 0
+	.loc 1 803 0
 	and	w6, w6, 268435455
 .LVL48:
-	.loc 1 800 0
+	.loc 1 802 0
 	mov	w8, 0
-	.loc 1 801 0
+	.loc 1 803 0
 	orr	w6, w5, w6
 .LVL49:
 	b	.L96
 .LVL50:
 	.p2align 3
 .L148:
-	.loc 1 765 0
+	.loc 1 767 0
 	and	w6, w6, -15728641
 .LVL51:
-	.loc 1 764 0
+	.loc 1 766 0
 	mov	w21, 0
-	.loc 1 765 0
+	.loc 1 767 0
 	orr	w6, w25, w6
 .LVL52:
 	b	.L90
 	.p2align 3
 .L146:
-	.loc 1 726 0
+	.loc 1 728 0
 	and	w6, w6, -61441
 .LVL53:
-	.loc 1 725 0
+	.loc 1 727 0
 	mov	w21, 0
-	.loc 1 726 0
+	.loc 1 728 0
 	orr	w6, w25, w6
 .LVL54:
 	b	.L84
 	.p2align 3
 .L147:
-	.loc 1 747 0
+	.loc 1 749 0
 	and	w6, w6, -983041
 .LVL55:
-	.loc 1 746 0
+	.loc 1 748 0
 	mov	w21, 0
-	.loc 1 747 0
+	.loc 1 749 0
 	orr	w6, w23, w6
 .LVL56:
 	b	.L87
 	.p2align 3
 .L145:
-	.loc 1 708 0
+	.loc 1 710 0
 	and	w6, w6, -3841
 .LVL57:
-	.loc 1 707 0
+	.loc 1 709 0
 	mov	w21, 0
-	.loc 1 708 0
+	.loc 1 710 0
 	orr	w6, w23, w6
 .LVL58:
 	b	.L81
 	.p2align 3
 .L143:
-	.loc 1 672 0
+	.loc 1 674 0
 	bfi	w6, w23, 0, 4
-	.loc 1 671 0
+	.loc 1 673 0
 	mov	w21, 0
 	b	.L75
 	.p2align 3
 .L144:
-	.loc 1 690 0
+	.loc 1 692 0
 	and	w6, w6, -241
 .LVL59:
-	.loc 1 689 0
+	.loc 1 691 0
 	mov	w21, 0
-	.loc 1 690 0
+	.loc 1 692 0
 	orr	w6, w25, w6
 .LVL60:
 	b	.L78
 	.p2align 3
 .L72:
-	.loc 1 810 0
+	.loc 1 812 0
 	strb	wzr, [x10, -2]
-	.loc 1 811 0
+	.loc 1 813 0
 	strb	wzr, [x10, -1]
 	b	.L97
 	.p2align 3
 .L68:
-	.loc 1 649 0
+	.loc 1 651 0
 	ldr	w10, [x17, 84]
 	mul	w10, w13, w10
 	lsr	w10, w10, 2
@@ -1116,58 +1116,58 @@ get_overlay_image:
 	.size	get_overlay_image, .-get_overlay_image
 	.align	2
 	.p2align 3,,7
-	.type	ebc_open, %function
-ebc_open:
-.LFB2833:
-	.loc 1 1948 0
+	.type	waveform_open, %function
+waveform_open:
+.LFB2835:
+	.loc 1 1989 0
 	.cfi_startproc
 .LVL62:
-	.loc 1 1952 0
+	.loc 1 1993 0
 	mov	w0, 0
 .LVL63:
-	.loc 1 1949 0
+	.loc 1 1990 0
 	str	xzr, [x1, 104]
-	.loc 1 1952 0
+	.loc 1 1993 0
 	ret
 	.cfi_endproc
-.LFE2833:
-	.size	ebc_open, .-ebc_open
+.LFE2835:
+	.size	waveform_open, .-waveform_open
 	.section	.exit.text,"ax",@progbits
 	.align	2
 	.type	ebc_exit, %function
 ebc_exit:
-.LFB2853:
-	.loc 1 2525 0
+.LFB2855:
+	.loc 1 2566 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2526 0
+	.loc 1 2567 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2525 0
+	.loc 1 2566 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2526 0
+	.loc 1 2567 0
 	bl	platform_driver_unregister
 .LVL64:
-	.loc 1 2527 0
+	.loc 1 2568 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2853:
+.LFE2855:
 	.size	ebc_exit, .-ebc_exit
 	.text
 	.align	2
 	.p2align 3,,7
 	.type	ebc_resume, %function
 ebc_resume:
-.LFB2851:
-	.loc 1 2487 0
+.LFB2853:
+	.loc 1 2528 0
 	.cfi_startproc
 .LVL65:
 	stp	x29, x30, [sp, -32]!
@@ -1178,17 +1178,17 @@ ebc_resume:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-.LBB940:
-.LBB941:
+.LBB938:
+.LBB939:
 	.file 2 "./include/linux/device.h"
 	.loc 2 1181 0
 	ldr	x19, [x0, 184]
-.LBE941:
-.LBE940:
-	.loc 1 2491 0
+.LBE939:
+.LBE938:
+	.loc 1 2532 0
 	ldr	x1, [x19, 16]
-.LBB942:
-.LBB943:
+.LBB940:
+.LBB941:
 	.file 3 "drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic.h"
 	.loc 3 45 0
 	mov	x0, x1
@@ -1196,17 +1196,17 @@ ebc_resume:
 	ldr	x1, [x1, 48]
 	blr	x1
 .LVL67:
-.LBE943:
-.LBE942:
-	.loc 1 2492 0
-	str	wzr, [x19, 780]
-	.loc 1 2493 0
-	ldr	x0, [x19, 272]
+.LBE941:
+.LBE940:
+	.loc 1 2533 0
+	str	wzr, [x19, 796]
+	.loc 1 2534 0
+	ldr	x0, [x19, 288]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
 .LVL68:
-	.loc 1 2496 0
+	.loc 1 2537 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -1216,51 +1216,51 @@ ebc_resume:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2851:
+.LFE2853:
 	.size	ebc_resume, .-ebc_resume
 	.align	2
 	.p2align 3,,7
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
 .LFB2828:
-	.loc 1 1647 0
+	.loc 1 1649 0
 	.cfi_startproc
 .LVL69:
-	.loc 1 1648 0
+	.loc 1 1650 0
 	adrp	x0, .LANCHOR0
 .LVL70:
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1650 0
-	ldr	w2, [x0, 608]
+	.loc 1 1652 0
+	ldr	w2, [x0, 624]
 	cbnz	w2, .L165
 	ret
 	.p2align 3
 .L165:
-	.loc 1 1647 0
+	.loc 1 1649 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-.LBB944:
-.LBB945:
+.LBB942:
+.LBB943:
 	.file 4 "./include/linux/wakelock.h"
 	.loc 4 68 0
-	add	x0, x0, 400
-.LBE945:
-.LBE944:
-	.loc 1 1647 0
+	add	x0, x0, 416
+.LBE943:
+.LBE942:
+	.loc 1 1649 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1651 0
+	.loc 1 1653 0
 	str	wzr, [x0, 208]
-.LBB947:
-.LBB946:
+.LBB945:
+.LBB944:
 	.loc 4 68 0
 	bl	__pm_relax
 .LVL71:
-.LBE946:
-.LBE947:
-	.loc 1 1656 0
+.LBE944:
+.LBE945:
+	.loc 1 1658 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1273,28 +1273,28 @@ ebc_vdd_power_timeout:
 	.p2align 3,,7
 	.type	ebc_remove, %function
 ebc_remove:
-.LFB2849:
-	.loc 1 2463 0
+.LFB2851:
+	.loc 1 2504 0
 	.cfi_startproc
 .LVL72:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2464 0
+	.loc 1 2505 0
 	adrp	x0, .LANCHOR1
 .LVL73:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2463 0
+	.loc 1 2504 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2464 0
+	.loc 1 2505 0
 	add	x0, x0, 224
-	.loc 1 2463 0
-	.loc 1 2464 0
+	.loc 1 2504 0
+	.loc 1 2505 0
 	bl	misc_deregister
 .LVL74:
-	.loc 1 2467 0
+	.loc 1 2508 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -1302,14 +1302,14 @@ ebc_remove:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2849:
+.LFE2851:
 	.size	ebc_remove, .-ebc_remove
 	.align	2
 	.p2align 3,,7
 	.type	ebc_mmap, %function
 ebc_mmap:
 .LFB2832:
-	.loc 1 1933 0
+	.loc 1 1935 0
 	.cfi_startproc
 .LVL75:
 	stp	x29, x30, [sp, -32]!
@@ -1320,33 +1320,33 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1933 0
+	.loc 1 1935 0
 	mov	x19, x1
-	.loc 1 1936 0
+	.loc 1 1938 0
 	bl	ebc_phy_buf_base_get
 .LVL76:
-	.loc 1 1939 0
+	.loc 1 1941 0
 	lsr	x2, x0, 12
-	.loc 1 1937 0
-	mov	x6, 16384
 	.loc 1 1939 0
+	mov	x6, 16384
+	.loc 1 1941 0
 	mov	x0, x19
-	.loc 1 1937 0
+	.loc 1 1939 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 1939 0
+	.loc 1 1941 0
 	ldp	x1, x3, [x19]
-	.loc 1 1937 0
+	.loc 1 1939 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 1939 0
+	.loc 1 1941 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
 .LVL77:
-	.loc 1 1942 0
+	.loc 1 1944 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 1945 0
+	.loc 1 1947 0
 	ldr	x19, [sp, 16]
 .LVL78:
 	csel	w0, w0, w1, eq
@@ -1361,19 +1361,74 @@ ebc_mmap:
 	.size	ebc_mmap, .-ebc_mmap
 	.align	2
 	.p2align 3,,7
+	.type	waveform_mmap, %function
+waveform_mmap:
+.LFB2834:
+	.loc 1 1973 0
+	.cfi_startproc
+.LVL79:
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	.loc 1 1974 0
+	adrp	x2, .LANCHOR0
+	.loc 1 1978 0
+	mov	x7, 16384
+	.loc 1 1980 0
+	mov	x0, x1
+.LVL80:
+	.loc 1 1973 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 1977 0
+	ldr	x2, [x2, #:lo12:.LANCHOR0]
+	.loc 1 1978 0
+	movk	x7, 0x404, lsl 16
+	ldp	x4, x5, [x1, 72]
+	.loc 1 1980 0
+	ldp	x6, x3, [x1]
+	.loc 1 1978 0
+	orr	x5, x5, x7
+	.loc 1 1977 0
+	ldr	x2, [x2, 216]
+	.loc 1 1978 0
+	str	x5, [x1, 80]
+	.loc 1 1980 0
+	sub	x3, x3, x6
+	mov	x1, x6
+.LVL81:
+	lsr	x2, x2, 12
+	bl	remap_pfn_range
+.LVL82:
+	.loc 1 1983 0
+	cmp	w0, 0
+	mov	w1, -11
+	.loc 1 1986 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
+.LFE2834:
+	.size	waveform_mmap, .-waveform_mmap
+	.align	2
+	.p2align 3,,7
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
 .LFB2831:
-	.loc 1 1732 0
+	.loc 1 1734 0
 	.cfi_startproc
-.LVL79:
+.LVL83:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 1742 0
+	.loc 1 1744 0
 	cmp	w1, 28672
-	.loc 1 1732 0
+	.loc 1 1734 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -1382,151 +1437,151 @@ ebc_io_ctl:
 	adrp	x19, __stack_chk_guard
 	stp	x21, x22, [sp, 32]
 	add	x0, x19, :lo12:__stack_chk_guard
-.LVL80:
+.LVL84:
 	str	x23, [sp, 48]
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
 	.cfi_offset 23, -112
-	.loc 1 1732 0
+	.loc 1 1734 0
 	mov	x21, x2
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 1734 0
+	.loc 1 1736 0
 	adrp	x0, .LANCHOR0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1742 0
-	bcc	.L173
+	.loc 1 1744 0
+	bcc	.L177
 	mov	w0, 28675
 	cmp	w1, w0
-	bls	.L174
+	bls	.L178
 	mov	w0, -28678
 	add	w0, w1, w0
 	cmp	w0, 1
-	bls	.L174
-.L173:
-	.loc 1 1758 0
+	bls	.L178
+.L177:
+	.loc 1 1760 0
 	mov	w0, 28677
 	cmp	w1, w0
-	beq	.L177
-	bls	.L306
+	beq	.L181
+	bls	.L310
 	mov	w0, 28680
 	cmp	w1, w0
-	beq	.L185
-	bls	.L307
+	beq	.L189
+	bls	.L311
 	mov	w0, 28682
 	cmp	w1, w0
-	beq	.L189
-	bcc	.L190
+	beq	.L193
+	bcc	.L194
 	mov	w0, 28683
 	cmp	w1, w0
-	bne	.L176
-	.loc 1 1910 0
+	bne	.L180
+	.loc 1 1912 0
 	bl	ebc_empty_buf_get
-.LVL81:
+.LVL85:
 	mov	x23, x0
-	.loc 1 1911 0
-	cbz	x0, .L197
 	.loc 1 1913 0
+	cbz	x0, .L201
+	.loc 1 1915 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
-	ldr	x1, [x20, 392]
+	ldr	x1, [x20, 408]
 	ldr	x0, [x0, 16]
 	mul	w2, w2, w3
 	ldr	x1, [x1, 16]
-.L303:
+.L307:
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL82:
-	.loc 1 1914 0
+.LVL86:
+	.loc 1 1916 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
-.LVL83:
+.LVL87:
 	sub	w0, w20, w0
+.LBB946:
+.LBB947:
 .LBB948:
 .LBB949:
 .LBB950:
 .LBB951:
 .LBB952:
-.LBB953:
-.LBB954:
 	.file 5 "./arch/arm64/include/asm/current.h"
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL84:
+.LVL88:
 #NO_APP
-.LBE954:
-.LBE953:
+.LBE952:
+.LBE951:
 	.file 6 "./arch/arm64/include/asm/uaccess.h"
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE952:
-.LBE951:
 .LBE950:
 .LBE949:
 .LBE948:
-	.loc 1 1916 0
+.LBE947:
+.LBE946:
+	.loc 1 1918 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 1915 0
-	str	w0, [x29, 104]
 	.loc 1 1917 0
+	str	w0, [x29, 104]
+	.loc 1 1919 0
 	stp	w4, w1, [x29, 112]
-.LBB979:
-.LBB976:
-.LBB973:
-.LBB963:
+.LBB977:
+.LBB974:
+.LBB971:
 .LBB961:
+.LBB959:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL85:
+.LVL89:
 	.loc 6 84 0
-	tbnz	x3, 21, .L234
-.LVL86:
-.L300:
+	tbnz	x3, 21, .L238
+.LVL90:
+.L304:
+.LBB953:
+.LBB954:
 .LBB955:
-.LBB956:
-.LBB957:
 	.file 7 "./include/asm-generic/bitops/non-atomic.h"
 	.loc 7 106 0
 	ldr	x2, [x2]
-.LVL87:
-.LBE957:
-.LBE956:
+.LVL91:
 .LBE955:
+.LBE954:
+.LBE953:
+.LBE959:
 .LBE961:
-.LBE963:
-.LBE973:
-.LBE976:
-.LBE979:
-	.loc 1 1733 0
+.LBE971:
+.LBE974:
+.LBE977:
+	.loc 1 1735 0
 	mov	x0, x21
-.LVL88:
-.LBB980:
-.LBB977:
-.LBB974:
-.LBB964:
+.LVL92:
+.LBB978:
+.LBB975:
+.LBB972:
 .LBB962:
+.LBB960:
 	.loc 6 84 0
-	tbz	x2, 26, .L235
-.LVL89:
-.L234:
+	tbz	x2, 26, .L239
+.LVL93:
+.L238:
+.LBB956:
+.LBB957:
 .LBB958:
-.LBB959:
-.LBB960:
 	.file 8 "./include/linux/bitops.h"
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL90:
-.LBE960:
-.LBE959:
+.LVL94:
+.LBE958:
+.LBE957:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL91:
-.L235:
-.LBE958:
+.LVL95:
+.L239:
+.LBE956:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1537,86 +1592,86 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL92:
+.LVL96:
 #NO_APP
+.LBE960:
 .LBE962:
-.LBE964:
 	.file 9 "./include/linux/uaccess.h"
 	.loc 9 132 0
 	mov	x22, 44
-	cbnz	x0, .L308
-.L236:
-.LBE974:
-.LBE977:
-.LBE980:
-	.loc 1 1919 0
+	cbnz	x0, .L312
+.L240:
+.LBE972:
+.LBE975:
+.LBE978:
+	.loc 1 1921 0
 	mov	x0, x23
-.LVL93:
+.LVL97:
 	bl	ebc_buf_release
-.LVL94:
-	.loc 1 1920 0
-	b	.L172
-.LVL95:
+.LVL98:
+	.loc 1 1922 0
+	b	.L176
+.LVL99:
 	.p2align 3
-.L174:
-	.loc 1 1749 0
-	cbnz	x21, .L173
-	.loc 1 1750 0
-	ldr	x0, [x20, 272]
+.L178:
+	.loc 1 1751 0
+	cbnz	x21, .L177
+	.loc 1 1752 0
+	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
-.LVL96:
+.LVL100:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC1
-	.loc 1 1751 0
+	.loc 1 1753 0
 	mov	x22, -14
-	.loc 1 1750 0
+	.loc 1 1752 0
 	bl	_dev_err
-.LVL97:
-	.loc 1 1751 0
-	b	.L172
-.LVL98:
+.LVL101:
+	.loc 1 1753 0
+	b	.L176
+.LVL102:
 	.p2align 3
-.L306:
-	.loc 1 1758 0
+.L310:
+	.loc 1 1760 0
 	mov	w0, 28674
 	cmp	w1, w0
-	beq	.L179
-	bls	.L309
+	beq	.L183
+	bls	.L313
 	mov	w0, 28675
 	cmp	w1, w0
-	beq	.L183
+	beq	.L187
 	mov	w0, 28676
 	cmp	w1, w0
-	bne	.L176
-	.loc 1 1842 0
-	ldr	x0, [x20, 272]
-	.loc 1 1841 0
+	bne	.L180
+	.loc 1 1844 0
+	ldr	x0, [x20, 288]
+	.loc 1 1843 0
 	mov	w2, 1
-	str	w2, [x20, 788]
-	.loc 1 1842 0
+	str	w2, [x20, 804]
+	.loc 1 1844 0
 	adrp	x1, .LC2
-.LVL99:
-	.loc 1 1843 0
+.LVL103:
+	.loc 1 1845 0
 	mov	x22, 0
-	.loc 1 1842 0
+	.loc 1 1844 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
-.LVL100:
+.LVL104:
 	.p2align 2
-.L172:
-	.loc 1 1930 0
+.L176:
+	.loc 1 1932 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
-.LVL101:
+.LVL105:
 	ldr	x2, [x29, 152]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-.LVL102:
-	cbnz	x1, .L310
+.LVL106:
+	cbnz	x1, .L314
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL103:
+.LVL107:
 	ldr	x23, [sp, 48]
 	ldp	x29, x30, [sp], 160
 	.cfi_remember_state
@@ -1629,54 +1684,54 @@ ebc_io_ctl:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL104:
+.LVL108:
 	.p2align 3
-.L309:
+.L313:
 	.cfi_restore_state
-	.loc 1 1758 0
+	.loc 1 1760 0
 	cmp	w1, 28672
-	beq	.L181
+	beq	.L185
 	mov	w0, 28673
 	cmp	w1, w0
-	bne	.L176
+	bne	.L180
+.LBB979:
+.LBB980:
 .LBB981:
 .LBB982:
 .LBB983:
 .LBB984:
 .LBB985:
-.LBB986:
-.LBB987:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL105:
+.LVL109:
 #NO_APP
-.LBE987:
-.LBE986:
+.LBE985:
+.LBE984:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
-.LVL106:
+.LVL110:
 	.loc 6 84 0
-	tbz	x2, 21, .L311
-.LVL107:
-.L202:
+	tbz	x2, 21, .L315
+.LVL111:
+.L206:
+.LBB986:
+.LBB987:
 .LBB988:
-.LBB989:
-.LBB990:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL108:
-.LBE990:
-.LBE989:
+.LVL112:
+.LBE988:
+.LBE987:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL109:
-.L203:
-.LBE988:
+.LVL113:
+.L207:
+.LBE986:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1687,39 +1742,39 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL110:
+.LVL114:
 #NO_APP
-.LBE985:
-.LBE984:
+.LBE983:
+.LBE982:
 	.loc 9 114 0
-	cbz	x0, .L205
+	cbz	x0, .L209
+.LBB994:
+.LBB995:
 .LBB996:
 .LBB997:
 .LBB998:
-.LBB999:
-.LBB1000:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL111:
-.LBE1000:
-.LBE999:
+.LVL115:
 .LBE998:
-.LBB1001:
-.LBB1002:
+.LBE997:
+.LBE996:
+.LBB999:
+.LBB1000:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL112:
+.LVL116:
 #NO_APP
-.LBE1002:
-.LBE1001:
-.LBB1003:
+.LBE1000:
+.LBE999:
+.LBB1001:
 	.loc 6 254 0
 	and	x0, x0, x21
-.LVL113:
-.LBE1003:
+.LVL117:
+.LBE1001:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1728,174 +1783,174 @@ ebc_io_ctl:
 	csel	x1, x21, xzr, eq
 
 // 0 "" 2
-.LVL114:
+.LVL118:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE997:
-.LBE996:
+.LBE995:
+.LBE994:
 	.loc 9 116 0
 	mov	x2, 44
 	add	x0, x29, 104
-.LVL115:
+.LVL119:
 	bl	__arch_copy_from_user
-.LVL116:
+.LVL120:
 	.loc 9 118 0
-	cbnz	x0, .L205
-.LBE983:
-.LBE982:
+	cbnz	x0, .L209
 .LBE981:
-	.loc 1 1796 0
+.LBE980:
+.LBE979:
+	.loc 1 1798 0
 	bl	ebc_phy_buf_base_get
-.LVL117:
+.LVL121:
 	ldrsw	x1, [x29, 104]
-	.loc 1 1797 0
+	.loc 1 1799 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
-.LVL118:
+.LVL122:
 	mov	x21, x0
-.LVL119:
-	.loc 1 1798 0
-	cbz	x0, .L212
-	.loc 1 1799 0
+.LVL123:
+	.loc 1 1800 0
+	cbz	x0, .L216
+	.loc 1 1801 0
 	ldr	w5, [x29, 108]
-	.loc 1 1808 0
+	.loc 1 1810 0
 	add	x20, x20, 184
-	.loc 1 1803 0
+	.loc 1 1805 0
 	ldp	w4, w2, [x29, 124]
-	.loc 1 1799 0
+	.loc 1 1801 0
 	str	w5, [x21, 40]
-	.loc 1 1804 0
+	.loc 1 1806 0
 	ldp	w3, w1, [x29, 132]
-	.loc 1 1803 0
+	.loc 1 1805 0
 	stp	w4, w2, [x21, 48]
-	.loc 1 1804 0
-	stp	w3, w1, [x21, 56]
 	.loc 1 1806 0
-	bl	ebc_add_to_dsp_buf_list
-.LVL120:
+	stp	w3, w1, [x21, 56]
 	.loc 1 1808 0
-	ldr	w0, [x20, 80]
-	cbz	w0, .L312
-.L207:
-	.loc 1 1812 0
+	bl	ebc_add_to_dsp_buf_list
+.LVL124:
+	.loc 1 1810 0
+	ldr	w0, [x20, 96]
+	cbz	w0, .L316
+.L211:
+	.loc 1 1814 0
 	ldr	w0, [x21, 40]
 	cmp	w0, 18
-	beq	.L313
-	.loc 1 1812 0 is_stmt 0 discriminator 3
+	beq	.L317
+	.loc 1 1814 0 is_stmt 0 discriminator 3
 	cmp	w0, 20
-	bne	.L212
-.L209:
-	.loc 1 1813 0 is_stmt 1
+	bne	.L216
+.L213:
+	.loc 1 1815 0 is_stmt 1
 	mov	w0, 1
-	str	w0, [x20, 188]
-.LBB1010:
-.LBB1011:
-	.loc 1 1814 0
+	str	w0, [x20, 204]
+.LBB1008:
+.LBB1009:
+	.loc 1 1816 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
-.LVL121:
+.LVL125:
 	adrp	x0, .LANCHOR1
-.LBB1012:
+.LBB1010:
 	add	x0, x0, :lo12:.LANCHOR1
 	add	x21, x0, 328
-	b	.L213
+	b	.L217
 	.p2align 3
-.L314:
-.LVL122:
-	.loc 1 1814 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L212
-	.loc 1 1814 0 discriminator 7
+.L318:
+.LVL126:
+	.loc 1 1816 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L216
+	.loc 1 1816 0 discriminator 7
 	bl	schedule
-.LVL123:
-.L213:
-	.loc 1 1814 0 discriminator 9
+.LVL127:
+.L217:
+	.loc 1 1816 0 discriminator 9
 	add	x1, x29, 64
 	mov	w2, 1
 	mov	x0, x21
 	bl	prepare_to_wait_event
-.LVL124:
-	ldr	w1, [x20, 188]
-	cbnz	w1, .L314
-.LBE1012:
-	.loc 1 1814 0 discriminator 4
+.LVL128:
+	ldr	w1, [x20, 204]
+	cbnz	w1, .L318
+.LBE1010:
+	.loc 1 1816 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
 	bl	finish_wait
-.LVL125:
+.LVL129:
 	.p2align 2
-.L212:
+.L216:
 	mov	x22, 0
-	b	.L172
-.LVL126:
+	b	.L176
+.LVL130:
 	.p2align 3
-.L189:
-.LBE1011:
-.LBE1010:
-	.loc 1 1897 0 is_stmt 1
+.L193:
+.LBE1009:
+.LBE1008:
+	.loc 1 1899 0 is_stmt 1
 	bl	ebc_empty_buf_get
-.LVL127:
+.LVL131:
 	mov	x23, x0
-	.loc 1 1898 0
-	cbz	x0, .L197
 	.loc 1 1900 0
+	cbz	x0, .L201
+	.loc 1 1902 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
-	ldr	x1, [x20, 328]
+	ldr	x1, [x20, 344]
 	ldr	x0, [x0, 16]
 	mul	w2, w2, w3
-	b	.L303
-.LVL128:
+	b	.L307
+.LVL132:
 	.p2align 3
-.L307:
-	.loc 1 1758 0
+.L311:
+	.loc 1 1760 0
 	mov	w0, 28678
 	cmp	w1, w0
-	beq	.L187
+	beq	.L191
 	mov	w0, 28679
 	cmp	w1, w0
-	bne	.L176
+	bne	.L180
+.LBB1014:
+.LBB1015:
 .LBB1016:
 .LBB1017:
 .LBB1018:
 .LBB1019:
 .LBB1020:
-.LBB1021:
-.LBB1022:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL129:
+.LVL133:
 #NO_APP
-.LBE1022:
-.LBE1021:
+.LBE1020:
+.LBE1019:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
-.LVL130:
+.LVL134:
 	.loc 6 84 0
-	tbz	x2, 21, .L315
-.LVL131:
-.L214:
+	tbz	x2, 21, .L319
+.LVL135:
+.L218:
+.LBB1021:
+.LBB1022:
 .LBB1023:
-.LBB1024:
-.LBB1025:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL132:
-.LBE1025:
-.LBE1024:
+.LVL136:
+.LBE1023:
+.LBE1022:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL133:
-.L215:
-.LBE1023:
+.LVL137:
+.L219:
+.LBE1021:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1906,39 +1961,39 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL134:
+.LVL138:
 #NO_APP
-.LBE1020:
-.LBE1019:
+.LBE1018:
+.LBE1017:
 	.loc 9 114 0
-	cbz	x0, .L205
+	cbz	x0, .L209
+.LBB1029:
+.LBB1030:
 .LBB1031:
 .LBB1032:
 .LBB1033:
-.LBB1034:
-.LBB1035:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL135:
-.LBE1035:
-.LBE1034:
+.LVL139:
 .LBE1033:
-.LBB1036:
-.LBB1037:
+.LBE1032:
+.LBE1031:
+.LBB1034:
+.LBB1035:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL136:
+.LVL140:
 #NO_APP
-.LBE1037:
-.LBE1036:
-.LBB1038:
+.LBE1035:
+.LBE1034:
+.LBB1036:
 	.loc 6 254 0
 	and	x0, x0, x21
-.LVL137:
-.LBE1038:
+.LVL141:
+.LBE1036:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1947,196 +2002,196 @@ ebc_io_ctl:
 	csel	x1, x21, xzr, eq
 
 // 0 "" 2
-.LVL138:
+.LVL142:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1032:
-.LBE1031:
+.LBE1030:
+.LBE1029:
 	.loc 9 116 0
 	mov	x2, 44
 	add	x0, x29, 104
-.LVL139:
+.LVL143:
 	bl	__arch_copy_from_user
-.LVL140:
+.LVL144:
 	.loc 9 118 0
-	cbnz	x0, .L205
-.LBE1018:
-.LBE1017:
+	cbnz	x0, .L209
 .LBE1016:
-	.loc 1 1823 0
+.LBE1015:
+.LBE1014:
+	.loc 1 1825 0
 	bl	ebc_osd_buf_clone
-.LVL141:
+.LVL145:
 	mov	x1, x0
-	.loc 1 1824 0
-	cbz	x0, .L212
-	.loc 1 1825 0
+	.loc 1 1826 0
+	cbz	x0, .L216
+	.loc 1 1827 0
 	ldr	w6, [x29, 108]
-	.loc 1 1834 0
+	.loc 1 1836 0
 	add	x20, x20, 184
-	.loc 1 1829 0
+	.loc 1 1831 0
 	ldp	w5, w3, [x29, 124]
-	.loc 1 1825 0
+	.loc 1 1827 0
 	str	w6, [x1, 40]
-	.loc 1 1830 0
+	.loc 1 1832 0
 	ldp	w4, w2, [x29, 132]
-	.loc 1 1829 0
+	.loc 1 1831 0
 	stp	w5, w3, [x1, 48]
-	.loc 1 1830 0
-	stp	w4, w2, [x1, 56]
 	.loc 1 1832 0
-	bl	ebc_add_to_dsp_buf_list
-.LVL142:
+	stp	w4, w2, [x1, 56]
 	.loc 1 1834 0
-	ldr	w0, [x20, 80]
-	cbnz	w0, .L212
-	.loc 1 1835 0
-	mov	w2, 1
-	str	w2, [x20, 80]
+	bl	ebc_add_to_dsp_buf_list
+.LVL146:
 	.loc 1 1836 0
+	ldr	w0, [x20, 96]
+	cbnz	w0, .L216
+	.loc 1 1837 0
+	mov	w2, 1
+	str	w2, [x20, 96]
+	.loc 1 1838 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	mov	x22, 0
 	bl	__wake_up_sync
-.LVL143:
-	b	.L172
-.LVL144:
+.LVL147:
+	b	.L176
+.LVL148:
 	.p2align 3
-.L308:
-.LBB1045:
-.LBB978:
-.LBB975:
+.L312:
+.LBB1043:
+.LBB976:
+.LBB973:
+.LBB963:
+.LBB964:
 .LBB965:
 .LBB966:
 .LBB967:
-.LBB968:
-.LBB969:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL145:
-.LBE969:
-.LBE968:
+.LVL149:
 .LBE967:
-.LBB970:
-.LBB971:
+.LBE966:
+.LBE965:
+.LBB968:
+.LBB969:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL146:
+.LVL150:
 #NO_APP
-.LBE971:
-.LBE970:
-.LBB972:
+.LBE969:
+.LBE968:
+.LBB970:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL147:
-.LBE972:
+.LVL151:
+.LBE970:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL148:
+.LVL152:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL149:
+.LVL153:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE966:
-.LBE965:
+.LBE964:
+.LBE963:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
-.LVL150:
+.LVL154:
 	bl	__arch_copy_to_user
-.LVL151:
+.LVL155:
 	sxtw	x22, w0
-	b	.L236
-.LVL152:
+	b	.L240
+.LVL156:
 	.p2align 3
-.L187:
-.LBE975:
-.LBE978:
-.LBE1045:
-	.loc 1 1760 0
+.L191:
+.LBE973:
+.LBE976:
+.LBE1043:
+	.loc 1 1762 0
 	bl	ebc_osd_buf_get
-.LVL153:
-	.loc 1 1761 0
-	cbz	x0, .L197
-	.loc 1 1764 0
+.LVL157:
+	.loc 1 1763 0
+	cbz	x0, .L201
+	.loc 1 1766 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
-.LVL154:
+.LVL158:
+.LBB1044:
+.LBB1045:
 .LBB1046:
 .LBB1047:
 .LBB1048:
 .LBB1049:
 .LBB1050:
-.LBB1051:
-.LBB1052:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL155:
+.LVL159:
 #NO_APP
-.LBE1052:
-.LBE1051:
-	.loc 6 85 0
-	ldr	w3, [x2, 52]
 .LBE1050:
 .LBE1049:
+	.loc 6 85 0
+	ldr	w3, [x2, 52]
 .LBE1048:
 .LBE1047:
 .LBE1046:
-	.loc 1 1764 0
+.LBE1045:
+.LBE1044:
+	.loc 1 1766 0
 	sub	w0, w22, w0
-	.loc 1 1769 0
+	.loc 1 1771 0
 	ldr	w1, [x20, 176]
-	.loc 1 1768 0
+	.loc 1 1770 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1767 0
-	stp	w4, w5, [x29, 112]
 	.loc 1 1769 0
+	stp	w4, w5, [x29, 112]
+	.loc 1 1771 0
 	str	w1, [x29, 120]
-	.loc 1 1766 0
+	.loc 1 1768 0
 	str	w0, [x29, 104]
-.LBB1079:
-.LBB1076:
-.LBB1073:
-.LBB1062:
-.LBB1059:
+.LBB1077:
+.LBB1074:
+.LBB1071:
+.LBB1060:
+.LBB1057:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL156:
+.LVL160:
 	.loc 6 84 0
-	tbz	x3, 21, .L316
-.LVL157:
-.L193:
+	tbz	x3, 21, .L320
+.LVL161:
+.L197:
+.LBB1051:
+.LBB1052:
 .LBB1053:
-.LBB1054:
-.LBB1055:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL158:
-.LBE1055:
-.LBE1054:
+.LVL162:
+.LBE1053:
+.LBE1052:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL159:
-.L194:
-.LBE1053:
+.LVL163:
+.L198:
+.LBE1051:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2147,121 +2202,121 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL160:
+.LVL164:
 #NO_APP
-.LBE1059:
-.LBE1062:
+.LBE1057:
+.LBE1060:
 	.loc 9 132 0
 	mov	x22, 44
-	cbz	x0, .L172
+	cbz	x0, .L176
+.LBB1061:
+.LBB1062:
 .LBB1063:
 .LBB1064:
 .LBB1065:
-.LBB1066:
-.LBB1067:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL161:
-.LBE1067:
-.LBE1066:
+.LVL165:
 .LBE1065:
-.LBB1068:
-.LBB1069:
+.LBE1064:
+.LBE1063:
+.LBB1066:
+.LBB1067:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL162:
+.LVL166:
 #NO_APP
-.LBE1069:
-.LBE1068:
-.LBB1070:
+.LBE1067:
+.LBE1066:
+.LBB1068:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL163:
-.LBE1070:
+.LVL167:
+.LBE1068:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL164:
+.LVL168:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL165:
+.LVL169:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1064:
-.LBE1063:
+.LBE1062:
+.LBE1061:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
-.LVL166:
+.LVL170:
 	bl	__arch_copy_to_user
-.LVL167:
+.LVL171:
 	sxtw	x22, w0
-	b	.L172
-.LVL168:
+	b	.L176
+.LVL172:
 	.p2align 3
-.L183:
-.LBE1073:
-.LBE1076:
-.LBE1079:
+.L187:
+.LBE1071:
+.LBE1074:
+.LBE1077:
+.LBB1078:
+.LBB1079:
 .LBB1080:
 .LBB1081:
 .LBB1082:
 .LBB1083:
 .LBB1084:
-.LBB1085:
-.LBB1086:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL169:
+.LVL173:
 #NO_APP
-.LBE1086:
-.LBE1085:
-	.loc 6 85 0
-	ldr	w2, [x0, 52]
 .LBE1084:
 .LBE1083:
+	.loc 6 85 0
+	ldr	w2, [x0, 52]
 .LBE1082:
 .LBE1081:
 .LBE1080:
-	.loc 1 1850 0
-	add	x22, x20, 232
-.LBB1115:
-.LBB1111:
-.LBB1107:
-.LBB1096:
-.LBB1093:
+.LBE1079:
+.LBE1078:
+	.loc 1 1852 0
+	add	x22, x20, 248
+.LBB1113:
+.LBB1109:
+.LBB1105:
+.LBB1094:
+.LBB1091:
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
-.LVL170:
+.LVL174:
 	.loc 6 84 0
-	tbz	x2, 21, .L317
-.LVL171:
-.L217:
+	tbz	x2, 21, .L321
+.LVL175:
+.L221:
+.LBB1085:
+.LBB1086:
 .LBB1087:
-.LBB1088:
-.LBB1089:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL172:
-.LBE1089:
-.LBE1088:
+.LVL176:
+.LBE1087:
+.LBE1086:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL173:
-.L218:
-.LBE1087:
+.LVL177:
+.L222:
+.LBE1085:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2272,39 +2327,39 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL174:
+.LVL178:
 #NO_APP
 	mov	x3, x0
-.LBE1093:
-.LBE1096:
+.LBE1091:
+.LBE1094:
 	.loc 9 114 0
-	cbz	x0, .L246
+	cbz	x0, .L250
+.LBB1095:
+.LBB1096:
 .LBB1097:
 .LBB1098:
 .LBB1099:
-.LBB1100:
-.LBB1101:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LBE1101:
-.LBE1100:
 .LBE1099:
-.LBB1102:
-.LBB1103:
+.LBE1098:
+.LBE1097:
+.LBB1100:
+.LBB1101:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL175:
+.LVL179:
 #NO_APP
-.LBE1103:
-.LBE1102:
-.LBB1104:
+.LBE1101:
+.LBE1100:
+.LBB1102:
 	.loc 6 254 0
 	and	x0, x0, x21
-.LVL176:
-.LBE1104:
+.LVL180:
+.LBE1102:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -2313,204 +2368,204 @@ ebc_io_ctl:
 	csel	x1, x21, xzr, eq
 
 // 0 "" 2
-.LVL177:
+.LVL181:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1098:
-.LBE1097:
+.LBE1096:
+.LBE1095:
 	.loc 9 116 0
 	mov	x2, 4
 	mov	x0, x22
-.LVL178:
+.LVL182:
 	bl	__arch_copy_from_user
-.LVL179:
+.LVL183:
 	.loc 9 118 0
-	cbnz	x0, .L318
-.LBE1107:
-.LBE1111:
-.LBE1115:
-	.loc 1 1854 0
+	cbnz	x0, .L322
+.LBE1105:
+.LBE1109:
+.LBE1113:
+	.loc 1 1856 0
 	add	x20, x20, 184
-	ldr	w2, [x20, 48]
-	ldr	x0, [x20, 88]
-.LVL180:
-	.loc 1 1855 0
+	ldr	w2, [x20, 64]
+	ldr	x0, [x20, 104]
+.LVL184:
+	.loc 1 1857 0
 	mov	x22, 0
-	.loc 1 1854 0
+	.loc 1 1856 0
 	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	_dev_info
-.LVL181:
-	.loc 1 1855 0
-	b	.L172
-.LVL182:
+.LVL185:
+	.loc 1 1857 0
+	b	.L176
+.LVL186:
 	.p2align 3
-.L177:
-	.loc 1 1847 0
-	ldr	x0, [x20, 272]
+.L181:
+	.loc 1 1849 0
+	ldr	x0, [x20, 288]
 	adrp	x1, .LC3
-.LVL183:
-	.loc 1 1845 0
-	str	wzr, [x20, 788]
-	.loc 1 1848 0
-	mov	x22, 0
-	.loc 1 1846 0
-	str	wzr, [x20, 792]
+.LVL187:
 	.loc 1 1847 0
+	str	wzr, [x20, 804]
+	.loc 1 1850 0
+	mov	x22, 0
+	.loc 1 1848 0
+	str	wzr, [x20, 808]
+	.loc 1 1849 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
-.LVL184:
-	.loc 1 1848 0
-	b	.L172
-.LVL185:
+.LVL188:
+	.loc 1 1850 0
+	b	.L176
+.LVL189:
 	.p2align 3
-.L185:
-	.loc 1 1884 0
+.L189:
+	.loc 1 1886 0
 	bl	ebc_empty_buf_get
-.LVL186:
+.LVL190:
 	mov	x23, x0
-	.loc 1 1885 0
-	cbz	x0, .L197
 	.loc 1 1887 0
+	cbz	x0, .L201
+	.loc 1 1889 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
-	ldr	x1, [x20, 320]
+	ldr	x1, [x20, 336]
 	ldr	x0, [x0, 16]
 	mul	w2, w2, w3
-	b	.L303
-.LVL187:
+	b	.L307
+.LVL191:
 	.p2align 3
-.L190:
-	.loc 1 1871 0
+.L194:
+	.loc 1 1873 0
 	bl	ebc_empty_buf_get
-.LVL188:
+.LVL192:
 	mov	x23, x0
-	.loc 1 1872 0
-	cbz	x0, .L197
 	.loc 1 1874 0
+	cbz	x0, .L201
+	.loc 1 1876 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
-	ldr	x1, [x20, 312]
+	ldr	x1, [x20, 328]
 	ldr	x0, [x0, 16]
 	mul	w2, w2, w3
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL189:
-	.loc 1 1875 0
+.LVL193:
+	.loc 1 1877 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
-.LVL190:
+.LVL194:
 	sub	w0, w20, w0
+.LBB1114:
+.LBB1115:
 .LBB1116:
 .LBB1117:
 .LBB1118:
 .LBB1119:
 .LBB1120:
-.LBB1121:
-.LBB1122:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL191:
+.LVL195:
 #NO_APP
-.LBE1122:
-.LBE1121:
-	.loc 6 85 0
-	ldr	w3, [x2, 52]
 .LBE1120:
 .LBE1119:
+	.loc 6 85 0
+	ldr	w3, [x2, 52]
 .LBE1118:
 .LBE1117:
 .LBE1116:
-	.loc 1 1878 0
+.LBE1115:
+.LBE1114:
+	.loc 1 1880 0
 	ldp	w4, w1, [x22, 84]
-	.loc 1 1876 0
+	.loc 1 1878 0
 	str	w0, [x29, 104]
-	.loc 1 1877 0
+	.loc 1 1879 0
 	stp	w1, w4, [x29, 112]
-.LBB1127:
-.LBB1126:
 .LBB1125:
 .LBB1124:
 .LBB1123:
+.LBB1122:
+.LBB1121:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL192:
+.LVL196:
 	.loc 6 84 0
-	tbnz	x3, 21, .L234
-	b	.L300
-.LVL193:
+	tbnz	x3, 21, .L238
+	b	.L304
+.LVL197:
 	.p2align 3
-.L179:
+.L183:
+.LBE1121:
+.LBE1122:
 .LBE1123:
 .LBE1124:
 .LBE1125:
-.LBE1126:
-.LBE1127:
+.LBB1126:
+.LBB1127:
 .LBB1128:
 .LBB1129:
 .LBB1130:
 .LBB1131:
 .LBB1132:
-.LBB1133:
-.LBB1134:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL194:
+.LVL198:
 #NO_APP
-.LBE1134:
-.LBE1133:
-	.loc 6 85 0
-	ldr	w3, [x2, 52]
 .LBE1132:
 .LBE1131:
+	.loc 6 85 0
+	ldr	w3, [x2, 52]
 .LBE1130:
 .LBE1129:
 .LBE1128:
-	.loc 1 1861 0
+.LBE1127:
+.LBE1126:
+	.loc 1 1863 0
 	ldp	w1, w0, [x20, 116]
-.LVL195:
+.LVL199:
 	stp	w1, w0, [x29, 140]
-	.loc 1 1858 0
+	.loc 1 1860 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 1857 0
-	stp	w5, w6, [x29, 112]
 	.loc 1 1859 0
+	stp	w5, w6, [x29, 112]
+	.loc 1 1861 0
 	ldr	w4, [x20, 176]
 	str	w4, [x29, 120]
-.LBB1163:
-.LBB1159:
-.LBB1155:
-.LBB1144:
-.LBB1141:
+.LBB1161:
+.LBB1157:
+.LBB1153:
+.LBB1142:
+.LBB1139:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL196:
+.LVL200:
 	.loc 6 84 0
-	tbz	x3, 21, .L319
-.LVL197:
-.L221:
+	tbz	x3, 21, .L323
+.LVL201:
+.L225:
+.LBB1133:
+.LBB1134:
 .LBB1135:
-.LBB1136:
-.LBB1137:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL198:
-.LBE1137:
-.LBE1136:
+.LVL202:
+.LBE1135:
+.LBE1134:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL199:
-.L222:
-.LBE1135:
+.LVL203:
+.L226:
+.LBE1133:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2521,119 +2576,119 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL200:
+.LVL204:
 #NO_APP
-.LBE1141:
-.LBE1144:
+.LBE1139:
+.LBE1142:
 	.loc 9 132 0
-	cbnz	x0, .L223
-.L224:
-.LBE1155:
-.LBE1159:
-.LBE1163:
-	.loc 1 1864 0
-	ldr	x0, [x20, 272]
-.LVL201:
+	cbnz	x0, .L227
+.L228:
+.LBE1153:
+.LBE1157:
+.LBE1161:
+	.loc 1 1866 0
+	ldr	x0, [x20, 288]
+.LVL205:
 	adrp	x1, .LC5
-.LVL202:
-	.loc 1 1865 0
+.LVL206:
+	.loc 1 1867 0
 	mov	x22, -14
-	.loc 1 1864 0
+	.loc 1 1866 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
-.LVL203:
-	.loc 1 1865 0
-	b	.L172
-.LVL204:
+.LVL207:
+	.loc 1 1867 0
+	b	.L176
+.LVL208:
 	.p2align 3
-.L176:
-	.loc 1 1925 0
-	ldr	x0, [x20, 272]
+.L180:
+	.loc 1 1927 0
+	ldr	x0, [x20, 288]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
-.LVL205:
+.LVL209:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
-	.loc 1 1926 0
+	.loc 1 1928 0
 	mov	x22, 0
-	.loc 1 1925 0
+	.loc 1 1927 0
 	bl	_dev_err
-.LVL206:
-	.loc 1 1929 0
-	b	.L172
-.LVL207:
+.LVL210:
+	.loc 1 1931 0
+	b	.L176
+.LVL211:
 	.p2align 3
-.L181:
-	.loc 1 1774 0
+.L185:
+	.loc 1 1776 0
 	bl	ebc_empty_buf_get
-.LVL208:
+.LVL212:
 	mov	x23, x0
-	.loc 1 1775 0
-	cbz	x0, .L197
-	.loc 1 1778 0
+	.loc 1 1777 0
+	cbz	x0, .L201
+	.loc 1 1780 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
-.LVL209:
+.LVL213:
+.LBB1162:
+.LBB1163:
 .LBB1164:
 .LBB1165:
 .LBB1166:
 .LBB1167:
 .LBB1168:
-.LBB1169:
-.LBB1170:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL210:
+.LVL214:
 #NO_APP
-.LBE1170:
-.LBE1169:
-	.loc 6 85 0
-	ldr	w3, [x2, 52]
 .LBE1168:
 .LBE1167:
+	.loc 6 85 0
+	ldr	w3, [x2, 52]
 .LBE1166:
 .LBE1165:
 .LBE1164:
-	.loc 1 1778 0
+.LBE1163:
+.LBE1162:
+	.loc 1 1780 0
 	sub	w0, w22, w0
-	.loc 1 1783 0
+	.loc 1 1785 0
 	ldr	w1, [x20, 176]
-	.loc 1 1782 0
+	.loc 1 1784 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1781 0
-	stp	w4, w5, [x29, 112]
 	.loc 1 1783 0
+	stp	w4, w5, [x29, 112]
+	.loc 1 1785 0
 	str	w1, [x29, 120]
-	.loc 1 1780 0
+	.loc 1 1782 0
 	str	w0, [x29, 104]
-.LBB1199:
-.LBB1195:
-.LBB1191:
-.LBB1180:
-.LBB1177:
+.LBB1197:
+.LBB1193:
+.LBB1189:
+.LBB1178:
+.LBB1175:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL211:
+.LVL215:
 	.loc 6 84 0
-	tbz	x3, 21, .L320
-.LVL212:
-.L198:
+	tbz	x3, 21, .L324
+.LVL216:
+.L202:
+.LBB1169:
+.LBB1170:
 .LBB1171:
-.LBB1172:
-.LBB1173:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL213:
-.LBE1173:
-.LBE1172:
+.LVL217:
+.LBE1171:
+.LBE1170:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL214:
-.L199:
-.LBE1171:
+.LVL218:
+.L203:
+.LBE1169:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2644,461 +2699,461 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL215:
+.LVL219:
 #NO_APP
-.LBE1177:
-.LBE1180:
+.LBE1175:
+.LBE1178:
 	.loc 9 132 0
-	cbnz	x0, .L200
-.L201:
-.LBE1191:
-.LBE1195:
-.LBE1199:
-	.loc 1 1787 0
+	cbnz	x0, .L204
+.L205:
+.LBE1189:
+.LBE1193:
+.LBE1197:
+	.loc 1 1789 0
 	mov	x0, x23
-.LVL216:
-	.loc 1 1788 0
+.LVL220:
+	.loc 1 1790 0
 	mov	x22, -14
-	.loc 1 1787 0
+	.loc 1 1789 0
 	bl	ebc_buf_release
-.LVL217:
-	.loc 1 1788 0
-	b	.L172
-.LVL218:
+.LVL221:
+	.loc 1 1790 0
+	b	.L176
+.LVL222:
 	.p2align 3
-.L315:
-.LBB1200:
-.LBB1043:
+.L319:
+.LBB1198:
 .LBB1041:
 .LBB1039:
-.LBB1029:
-.LBB1026:
+.LBB1037:
 .LBB1027:
-.LBB1028:
+.LBB1024:
+.LBB1025:
+.LBB1026:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1028:
-.LBE1027:
 .LBE1026:
-.LBE1029:
+.LBE1025:
+.LBE1024:
+.LBE1027:
+.LBE1037:
 .LBE1039:
 .LBE1041:
-.LBE1043:
-.LBE1200:
-	.loc 1 1733 0
+.LBE1198:
+	.loc 1 1735 0
 	mov	x0, x21
-.LVL219:
-.LBB1201:
-.LBB1044:
+.LVL223:
+.LBB1199:
 .LBB1042:
 .LBB1040:
-.LBB1030:
+.LBB1038:
+.LBB1028:
 	.loc 6 84 0
-	tbz	x2, 26, .L215
-	b	.L214
-.LVL220:
+	tbz	x2, 26, .L219
+	b	.L218
+.LVL224:
 	.p2align 3
-.L311:
-.LBE1030:
+.L315:
+.LBE1028:
+.LBE1038:
 .LBE1040:
 .LBE1042:
-.LBE1044:
-.LBE1201:
-.LBB1202:
-.LBB1008:
+.LBE1199:
+.LBB1200:
 .LBB1006:
 .LBB1004:
-.LBB994:
-.LBB991:
+.LBB1002:
 .LBB992:
-.LBB993:
+.LBB989:
+.LBB990:
+.LBB991:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE993:
-.LBE992:
 .LBE991:
-.LBE994:
+.LBE990:
+.LBE989:
+.LBE992:
+.LBE1002:
 .LBE1004:
 .LBE1006:
-.LBE1008:
-.LBE1202:
-	.loc 1 1733 0
+.LBE1200:
+	.loc 1 1735 0
 	mov	x0, x21
-.LVL221:
-.LBB1203:
-.LBB1009:
+.LVL225:
+.LBB1201:
 .LBB1007:
 .LBB1005:
-.LBB995:
+.LBB1003:
+.LBB993:
 	.loc 6 84 0
-	tbz	x2, 26, .L203
-	b	.L202
-.LVL222:
+	tbz	x2, 26, .L207
+	b	.L206
+.LVL226:
 	.p2align 3
-.L319:
-.LBE995:
+.L323:
+.LBE993:
+.LBE1003:
 .LBE1005:
 .LBE1007:
-.LBE1009:
-.LBE1203:
-.LBB1204:
-.LBB1160:
-.LBB1156:
-.LBB1145:
-.LBB1142:
-.LBB1138:
-.LBB1139:
+.LBE1201:
+.LBB1202:
+.LBB1158:
+.LBB1154:
+.LBB1143:
 .LBB1140:
+.LBB1136:
+.LBB1137:
+.LBB1138:
 	.loc 7 106 0
 	ldr	x2, [x2]
-.LVL223:
-.LBE1140:
-.LBE1139:
+.LVL227:
 .LBE1138:
-.LBE1142:
-.LBE1145:
-.LBE1156:
-.LBE1160:
+.LBE1137:
+.LBE1136:
+.LBE1140:
+.LBE1143:
+.LBE1154:
+.LBE1158:
+.LBE1202:
+	.loc 1 1735 0
+	mov	x0, x21
+.LVL228:
+.LBB1203:
+.LBB1159:
+.LBB1155:
+.LBB1144:
+.LBB1141:
+	.loc 6 84 0
+	tbz	x2, 26, .L226
+	b	.L225
+.LVL229:
+	.p2align 3
+.L321:
+.LBE1141:
+.LBE1144:
+.LBE1155:
+.LBE1159:
+.LBE1203:
+.LBB1204:
+.LBB1110:
+.LBB1106:
+.LBB1103:
+.LBB1092:
+.LBB1088:
+.LBB1089:
+.LBB1090:
+	.loc 7 106 0
+	ldr	x2, [x0]
+.LBE1090:
+.LBE1089:
+.LBE1088:
+.LBE1092:
+.LBE1103:
+.LBE1106:
+.LBE1110:
 .LBE1204:
-	.loc 1 1733 0
+	.loc 1 1735 0
 	mov	x0, x21
-.LVL224:
+.LVL230:
 .LBB1205:
-.LBB1161:
-.LBB1157:
-.LBB1146:
-.LBB1143:
+.LBB1111:
+.LBB1107:
+.LBB1104:
+.LBB1093:
 	.loc 6 84 0
 	tbz	x2, 26, .L222
 	b	.L221
-.LVL225:
+.LVL231:
 	.p2align 3
-.L317:
-.LBE1143:
-.LBE1146:
-.LBE1157:
-.LBE1161:
+.L324:
+.LBE1093:
+.LBE1104:
+.LBE1107:
+.LBE1111:
 .LBE1205:
 .LBB1206:
-.LBB1112:
-.LBB1108:
-.LBB1105:
-.LBB1094:
-.LBB1090:
-.LBB1091:
-.LBB1092:
+.LBB1194:
+.LBB1190:
+.LBB1179:
+.LBB1176:
+.LBB1172:
+.LBB1173:
+.LBB1174:
 	.loc 7 106 0
-	ldr	x2, [x0]
-.LBE1092:
-.LBE1091:
-.LBE1090:
-.LBE1094:
-.LBE1105:
-.LBE1108:
-.LBE1112:
+	ldr	x2, [x2]
+.LVL232:
+.LBE1174:
+.LBE1173:
+.LBE1172:
+.LBE1176:
+.LBE1179:
+.LBE1190:
+.LBE1194:
 .LBE1206:
-	.loc 1 1733 0
+	.loc 1 1735 0
 	mov	x0, x21
-.LVL226:
+.LVL233:
 .LBB1207:
-.LBB1113:
-.LBB1109:
-.LBB1106:
-.LBB1095:
+.LBB1195:
+.LBB1191:
+.LBB1180:
+.LBB1177:
 	.loc 6 84 0
-	tbz	x2, 26, .L218
-	b	.L217
-.LVL227:
+	tbz	x2, 26, .L203
+	b	.L202
+.LVL234:
 	.p2align 3
 .L320:
-.LBE1095:
-.LBE1106:
-.LBE1109:
-.LBE1113:
+.LBE1177:
+.LBE1180:
+.LBE1191:
+.LBE1195:
 .LBE1207:
 .LBB1208:
-.LBB1196:
-.LBB1192:
-.LBB1181:
-.LBB1178:
-.LBB1174:
-.LBB1175:
-.LBB1176:
+.LBB1075:
+.LBB1072:
+.LBB1069:
+.LBB1058:
+.LBB1054:
+.LBB1055:
+.LBB1056:
 	.loc 7 106 0
 	ldr	x2, [x2]
-.LVL228:
-.LBE1176:
-.LBE1175:
-.LBE1174:
-.LBE1178:
-.LBE1181:
-.LBE1192:
-.LBE1196:
+.LVL235:
+.LBE1056:
+.LBE1055:
+.LBE1054:
+.LBE1058:
+.LBE1069:
+.LBE1072:
+.LBE1075:
 .LBE1208:
-	.loc 1 1733 0
+	.loc 1 1735 0
 	mov	x0, x21
-.LVL229:
+.LVL236:
 .LBB1209:
-.LBB1197:
-.LBB1193:
-.LBB1182:
-.LBB1179:
+.LBB1076:
+.LBB1073:
+.LBB1070:
+.LBB1059:
 	.loc 6 84 0
-	tbz	x2, 26, .L199
-	b	.L198
-.LVL230:
+	tbz	x2, 26, .L198
+	b	.L197
+.LVL237:
 	.p2align 3
-.L316:
-.LBE1179:
-.LBE1182:
-.LBE1193:
-.LBE1197:
+.L227:
+.LBE1059:
+.LBE1070:
+.LBE1073:
+.LBE1076:
 .LBE1209:
 .LBB1210:
-.LBB1077:
-.LBB1074:
-.LBB1071:
-.LBB1060:
-.LBB1056:
-.LBB1057:
-.LBB1058:
-	.loc 7 106 0
-	ldr	x2, [x2]
-.LVL231:
-.LBE1058:
-.LBE1057:
-.LBE1056:
-.LBE1060:
-.LBE1071:
-.LBE1074:
-.LBE1077:
-.LBE1210:
-	.loc 1 1733 0
-	mov	x0, x21
-.LVL232:
-.LBB1211:
-.LBB1078:
-.LBB1075:
-.LBB1072:
-.LBB1061:
-	.loc 6 84 0
-	tbz	x2, 26, .L194
-	b	.L193
-.LVL233:
-	.p2align 3
-.L223:
-.LBE1061:
-.LBE1072:
-.LBE1075:
-.LBE1078:
-.LBE1211:
-.LBB1212:
-.LBB1162:
-.LBB1158:
+.LBB1160:
+.LBB1156:
+.LBB1145:
+.LBB1146:
 .LBB1147:
 .LBB1148:
 .LBB1149:
-.LBB1150:
-.LBB1151:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL234:
-.LBE1151:
-.LBE1150:
+.LVL238:
 .LBE1149:
-.LBB1152:
-.LBB1153:
+.LBE1148:
+.LBE1147:
+.LBB1150:
+.LBB1151:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL235:
+.LVL239:
 #NO_APP
-.LBE1153:
-.LBE1152:
-.LBB1154:
+.LBE1151:
+.LBE1150:
+.LBB1152:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL236:
-.LBE1154:
+.LVL240:
+.LBE1152:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL237:
+.LVL241:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL238:
+.LVL242:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1148:
-.LBE1147:
+.LBE1146:
+.LBE1145:
 	.loc 9 134 0
 	mov	x2, 44
 	add	x1, x29, 104
-.LVL239:
+.LVL243:
 	bl	__arch_copy_to_user
-.LVL240:
-.LBE1158:
-.LBE1162:
-.LBE1212:
-	.loc 1 1863 0
-	cbnz	x0, .L224
-.LBB1213:
-.LBB1013:
+.LVL244:
+.LBE1156:
+.LBE1160:
+.LBE1210:
+	.loc 1 1865 0
+	cbnz	x0, .L228
+.LBB1211:
+.LBB1011:
 	mov	x22, 0
-	b	.L172
-.LVL241:
+	b	.L176
+.LVL245:
 	.p2align 3
-.L200:
-.LBE1013:
-.LBE1213:
-.LBB1214:
-.LBB1198:
-.LBB1194:
+.L204:
+.LBE1011:
+.LBE1211:
+.LBB1212:
+.LBB1196:
+.LBB1192:
+.LBB1181:
+.LBB1182:
 .LBB1183:
 .LBB1184:
 .LBB1185:
-.LBB1186:
-.LBB1187:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL242:
-.LBE1187:
-.LBE1186:
+.LVL246:
 .LBE1185:
-.LBB1188:
-.LBB1189:
+.LBE1184:
+.LBE1183:
+.LBB1186:
+.LBB1187:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL243:
+.LVL247:
 #NO_APP
-.LBE1189:
-.LBE1188:
-.LBB1190:
+.LBE1187:
+.LBE1186:
+.LBB1188:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL244:
-.LBE1190:
+.LVL248:
+.LBE1188:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL245:
+.LVL249:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL246:
+.LVL250:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1184:
-.LBE1183:
+.LBE1182:
+.LBE1181:
 	.loc 9 134 0
 	mov	x2, 44
 	add	x1, x29, 104
-.LVL247:
+.LVL251:
 	bl	__arch_copy_to_user
-.LVL248:
-.LBE1194:
-.LBE1198:
-.LBE1214:
-	.loc 1 1786 0
-	cbnz	w0, .L201
-.LBB1215:
-.LBB1014:
+.LVL252:
+.LBE1192:
+.LBE1196:
+.LBE1212:
+	.loc 1 1788 0
+	cbnz	w0, .L205
+.LBB1213:
+.LBB1012:
 	mov	x22, 0
-	b	.L172
-.LVL249:
+	b	.L176
+.LVL253:
 	.p2align 3
-.L205:
-.LBE1014:
-.LBE1215:
-	.loc 1 1794 0
+.L209:
+.LBE1012:
+.LBE1213:
+	.loc 1 1796 0
 	mov	x22, -14
-	b	.L172
-.LVL250:
+	b	.L176
+.LVL254:
 	.p2align 3
-.L312:
-	.loc 1 1809 0
+.L316:
+	.loc 1 1811 0
 	mov	w2, 1
-	str	w2, [x20, 80]
-	.loc 1 1810 0
+	str	w2, [x20, 96]
+	.loc 1 1812 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL251:
-	b	.L207
+.LVL255:
+	b	.L211
 	.p2align 3
-.L313:
-	.loc 1 1812 0 discriminator 1
-	ldr	w0, [x20, 592]
-	cbz	w0, .L209
-.LBB1216:
-.LBB1015:
+.L317:
+	.loc 1 1814 0 discriminator 1
+	ldr	w0, [x20, 608]
+	cbz	w0, .L213
+.LBB1214:
+.LBB1013:
 	mov	x22, 0
-	b	.L172
-.LVL252:
-.L197:
-.LBE1015:
-.LBE1216:
-	.loc 1 1762 0
+	b	.L176
+.LVL256:
+.L201:
+.LBE1013:
+.LBE1214:
+	.loc 1 1764 0
 	mov	x22, -1
-	b	.L172
-.LVL253:
-.L246:
-.LBB1217:
-.LBB1114:
-.LBB1110:
+	b	.L176
+.LVL257:
+.L250:
+.LBB1215:
+.LBB1112:
+.LBB1108:
 	.loc 9 112 0
 	mov	x0, 4
-.LVL254:
-.L219:
+.LVL258:
+.L223:
 	.loc 9 119 0
 	mov	x2, x0
 	mov	w1, 0
-.LVL255:
+.LVL259:
 	add	x0, x22, x3
-.LVL256:
+.LVL260:
 	bl	memset
-.LVL257:
-.LBE1110:
-.LBE1114:
-.LBE1217:
-	.loc 1 1851 0
-	ldr	x0, [x20, 272]
+.LVL261:
+.LBE1108:
+.LBE1112:
+.LBE1215:
+	.loc 1 1853 0
+	ldr	x0, [x20, 288]
 	adrp	x1, .LC4
-	.loc 1 1852 0
+	.loc 1 1854 0
 	mov	x22, -14
-	.loc 1 1851 0
+	.loc 1 1853 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
-.LVL258:
-	.loc 1 1852 0
-	b	.L172
-.L310:
-	.loc 1 1930 0
+.LVL262:
+	.loc 1 1854 0
+	b	.L176
+.L314:
+	.loc 1 1932 0
 	bl	__stack_chk_fail
-.LVL259:
-.L318:
+.LVL263:
+.L322:
 	mov	x3, 4
 	sub	x3, x3, x0
-.LVL260:
-	b	.L219
+.LVL264:
+	b	.L223
 	.cfi_endproc
 .LFE2831:
 	.size	ebc_io_ctl, .-ebc_io_ctl
@@ -3107,40 +3162,40 @@ ebc_io_ctl:
 	.type	frame_done_callback, %function
 frame_done_callback:
 .LFB2823:
-	.loc 1 1173 0
+	.loc 1 1175 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 1174 0
+	.loc 1 1176 0
 	adrp	x0, .LANCHOR0
 	add	x1, x0, :lo12:.LANCHOR0
-	.loc 1 1173 0
+	.loc 1 1175 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 1174 0
+	.loc 1 1176 0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1173 0
+	.loc 1 1175 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 1177 0
+	.loc 1 1179 0
 	add	x19, x20, 184
-	ldr	x0, [x19, 208]
+	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
-	bhi	.L322
-	.loc 1 1180 0
-	ldr	w0, [x19, 36]
-	cbz	w0, .L324
-	.loc 1 1181 0
+	bhi	.L326
+	.loc 1 1182 0
+	ldr	w0, [x19, 52]
+	cbz	w0, .L328
+	.loc 1 1183 0
 	ldr	x0, [x1, 8]
 	bl	wake_up_process
-.LVL261:
-	.loc 1 1207 0
+.LVL265:
+	.loc 1 1209 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -3153,42 +3208,42 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L322:
+.L326:
 	.cfi_restore_state
-	.loc 1 1195 0
-	ldr	w0, [x19, 40]
-	cbnz	w0, .L328
-	.loc 1 1201 0
-	ldr	x0, [x19, 88]
-	.loc 1 1200 0
+	.loc 1 1197 0
+	ldr	w0, [x19, 56]
+	cbnz	w0, .L332
+	.loc 1 1203 0
+	ldr	x0, [x19, 104]
+	.loc 1 1202 0
 	mov	w20, 1
-	.loc 1 1199 0
-	str	wzr, [x19, 28]
 	.loc 1 1201 0
+	str	wzr, [x19, 44]
+	.loc 1 1203 0
 	adrp	x1, .LC9
-	.loc 1 1200 0
-	str	w20, [x19, 76]
-	.loc 1 1201 0
-	add	x1, x1, :lo12:.LC9
 	.loc 1 1202 0
+	str	w20, [x19, 92]
+	.loc 1 1203 0
+	add	x1, x1, :lo12:.LC9
+	.loc 1 1204 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
-	.loc 1 1201 0
+	.loc 1 1203 0
 	bl	_dev_info
-.LVL262:
-	.loc 1 1202 0
+.LVL266:
+	.loc 1 1204 0
 	mov	w2, w20
 	add	x0, x19, 352
 	mov	w1, w20
 	bl	__wake_up_sync
-.LVL263:
-	.loc 1 1203 0
+.LVL267:
+	.loc 1 1205 0
 	mov	w2, w20
 	mov	w1, w20
 	add	x0, x19, 304
 	bl	__wake_up_sync
-.LVL264:
-	.loc 1 1207 0
+.LVL268:
+	.loc 1 1209 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -3201,51 +3256,51 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L324:
+.L328:
 	.cfi_restore_state
-	.loc 1 1184 0
-	ldr	x0, [x19, 88]
+	.loc 1 1186 0
+	ldr	x0, [x19, 104]
 	adrp	x1, .LC8
 	add	x1, x1, :lo12:.LC8
-	.loc 1 1189 0
+	.loc 1 1191 0
 	mov	w21, 1
-	.loc 1 1184 0
-	bl	_dev_info
-.LVL265:
 	.loc 1 1186 0
+	bl	_dev_info
+.LVL269:
+	.loc 1 1188 0
 	ldp	w3, w2, [x20, 108]
 	mov	w1, 0
-	ldr	x0, [x19, 152]
+	ldr	x0, [x19, 168]
 	mul	w2, w3, w2
 	bl	memset
-.LVL266:
-	.loc 1 1187 0
+.LVL270:
+	.loc 1 1189 0
 	adrp	x2, jiffies
-	add	x0, x20, 672
+	add	x0, x20, 688
 	mov	x1, 402653184
 	ldr	x2, [x2, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL267:
-	.loc 1 1189 0
-	str	w21, [x19, 76]
-	.loc 1 1188 0
-	str	wzr, [x19, 28]
+.LVL271:
+	.loc 1 1191 0
+	str	w21, [x19, 92]
 	.loc 1 1190 0
+	str	wzr, [x19, 44]
+	.loc 1 1192 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x19, 352
 	bl	__wake_up_sync
-.LVL268:
-	.loc 1 1191 0
+.LVL272:
+	.loc 1 1193 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x19, 304
 	bl	__wake_up_sync
-.LVL269:
-	.loc 1 1207 0
+.LVL273:
+	.loc 1 1209 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -3258,17 +3313,17 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L328:
+.L332:
 	.cfi_restore_state
-	.loc 1 1197 0
+	.loc 1 1199 0
 	ldr	x0, [x1, 8]
-	.loc 1 1196 0
+	.loc 1 1198 0
 	mov	w1, 1
-	str	w1, [x19, 28]
-	.loc 1 1197 0
+	str	w1, [x19, 44]
+	.loc 1 1199 0
 	bl	wake_up_process
-.LVL270:
-	.loc 1 1207 0
+.LVL274:
+	.loc 1 1209 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -3287,19 +3342,19 @@ frame_done_callback:
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
 .LFB2829:
-	.loc 1 1659 0
+	.loc 1 1661 0
 	.cfi_startproc
-.LVL271:
+.LVL275:
 	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 1660 0
-	bl	frame_done_callback
-.LVL272:
 	.loc 1 1662 0
+	bl	frame_done_callback
+.LVL276:
+	.loc 1 1664 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3313,16 +3368,16 @@ ebc_frame_timeout:
 	.type	ebc_lut_update, %function
 ebc_lut_update:
 .LFB2824:
-	.loc 1 1210 0
+	.loc 1 1212 0
 	.cfi_startproc
-.LVL273:
+.LVL277:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 1212 0
+	.loc 1 1214 0
 	mov	w3, 25
-	.loc 1 1210 0
+	.loc 1 1212 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x21, x22, [sp, 32]
@@ -3332,78 +3387,78 @@ ebc_lut_update:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -48
 	.cfi_offset 20, -40
-	.loc 1 1212 0
+	.loc 1 1214 0
 	add	x1, x29, 64
-	.loc 1 1210 0
+	.loc 1 1212 0
 	adrp	x19, __stack_chk_guard
 	add	x0, x19, :lo12:__stack_chk_guard
-.LVL274:
-	.loc 1 1216 0
+.LVL278:
+	.loc 1 1218 0
 	ldr	x2, [x21, 16]
-	.loc 1 1212 0
+	.loc 1 1214 0
 	str	w3, [x1, -12]!
-.LVL275:
-	.loc 1 1210 0
+.LVL279:
+	.loc 1 1212 0
 	ldr	x3, [x0]
 	str	x3, [x29, 56]
 	mov	x3,0
-.LBB1218:
-.LBB1219:
+.LBB1216:
+.LBB1217:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL276:
+.LVL280:
 	mov	w20, w0
-.LBE1219:
-.LBE1218:
-	.loc 1 1217 0
-	cbnz	w0, .L332
-.LVL277:
-	.loc 1 1218 0
-	ldr	w2, [x29, 52]
+.LBE1217:
+.LBE1216:
 	.loc 1 1219 0
+	cbnz	w0, .L336
+.LVL281:
+	.loc 1 1220 0
+	ldr	w2, [x29, 52]
+	.loc 1 1221 0
 	add	x22, x21, 184
-	.loc 1 1218 0
-	tbnz	w2, #31, .L356
-	.loc 1 1222 0
+	.loc 1 1220 0
+	tbnz	w2, #31, .L360
+	.loc 1 1224 0
 	cmp	w2, 50
-	bgt	.L357
-.L334:
-	.loc 1 1230 0
-	ldr	x0, [x22, 88]
+	bgt	.L361
+.L338:
+	.loc 1 1232 0
+	ldr	x0, [x22, 104]
 	adrp	x1, .LC13
 	add	x1, x1, :lo12:.LC13
 	bl	_dev_info
-.LVL278:
-	.loc 1 1233 0
-	ldr	x0, [x22, 208]
+.LVL282:
+	.loc 1 1235 0
+	ldr	x0, [x22, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 21
-	bls	.L358
-	.loc 1 1287 0
+	bls	.L362
+	.loc 1 1289 0
 	ldr	w2, [x29, 52]
-.L355:
+.L359:
 	mov	w1, 7
-	add	x0, x21, 280
+	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL279:
-	cbnz	w0, .L347
+.LVL283:
+	cbnz	w0, .L351
 	.p2align 2
-.L350:
-	.loc 1 1292 0
-	cbnz	w20, .L348
-.L331:
-	.loc 1 1298 0
+.L354:
+	.loc 1 1294 0
+	cbnz	w20, .L352
+.L335:
+	.loc 1 1300 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	w0, w20
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L359
+	cbnz	x1, .L363
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL280:
+.LVL284:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -3414,183 +3469,183 @@ ebc_lut_update:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL281:
+.LVL285:
 	.p2align 3
-.L358:
+.L362:
 	.cfi_restore_state
-	.loc 1 1233 0
-	adrp	x1, .L337
 	.loc 1 1235 0
+	adrp	x1, .L341
+	.loc 1 1237 0
 	ldr	w2, [x29, 52]
-	.loc 1 1233 0
-	add	x1, x1, :lo12:.L337
+	.loc 1 1235 0
+	add	x1, x1, :lo12:.L341
 	ldrb	w0, [x1,w0,uxtw]
-	adr	x1, .Lrtx337
+	adr	x1, .Lrtx341
 	add	x0, x1, w0, sxtb #2
 	br	x0
-.Lrtx337:
+.Lrtx341:
 	.section	.rodata
 	.align	0
 	.align	2
-.L337:
-	.byte	(.L355 - .Lrtx337) / 4
-	.byte	(.L338 - .Lrtx337) / 4
-	.byte	(.L355 - .Lrtx337) / 4
-	.byte	(.L339 - .Lrtx337) / 4
-	.byte	(.L340 - .Lrtx337) / 4
-	.byte	(.L341 - .Lrtx337) / 4
-	.byte	(.L342 - .Lrtx337) / 4
-	.byte	(.L355 - .Lrtx337) / 4
-	.byte	(.L339 - .Lrtx337) / 4
-	.byte	(.L340 - .Lrtx337) / 4
-	.byte	(.L341 - .Lrtx337) / 4
-	.byte	(.L342 - .Lrtx337) / 4
-	.byte	(.L343 - .Lrtx337) / 4
-	.byte	(.L343 - .Lrtx337) / 4
-	.byte	(.L344 - .Lrtx337) / 4
-	.byte	(.L345 - .Lrtx337) / 4
-	.byte	(.L344 - .Lrtx337) / 4
-	.byte	(.L346 - .Lrtx337) / 4
-	.byte	(.L355 - .Lrtx337) / 4
-	.byte	(.L355 - .Lrtx337) / 4
-	.byte	(.L355 - .Lrtx337) / 4
-	.byte	(.L355 - .Lrtx337) / 4
+.L341:
+	.byte	(.L359 - .Lrtx341) / 4
+	.byte	(.L342 - .Lrtx341) / 4
+	.byte	(.L359 - .Lrtx341) / 4
+	.byte	(.L343 - .Lrtx341) / 4
+	.byte	(.L344 - .Lrtx341) / 4
+	.byte	(.L345 - .Lrtx341) / 4
+	.byte	(.L346 - .Lrtx341) / 4
+	.byte	(.L359 - .Lrtx341) / 4
+	.byte	(.L343 - .Lrtx341) / 4
+	.byte	(.L344 - .Lrtx341) / 4
+	.byte	(.L345 - .Lrtx341) / 4
+	.byte	(.L346 - .Lrtx341) / 4
+	.byte	(.L347 - .Lrtx341) / 4
+	.byte	(.L347 - .Lrtx341) / 4
+	.byte	(.L348 - .Lrtx341) / 4
+	.byte	(.L349 - .Lrtx341) / 4
+	.byte	(.L348 - .Lrtx341) / 4
+	.byte	(.L350 - .Lrtx341) / 4
+	.byte	(.L359 - .Lrtx341) / 4
+	.byte	(.L359 - .Lrtx341) / 4
+	.byte	(.L359 - .Lrtx341) / 4
+	.byte	(.L359 - .Lrtx341) / 4
 	.text
-.LVL282:
+.LVL286:
 	.p2align 3
-.L332:
-	.loc 1 1228 0
+.L336:
+	.loc 1 1230 0
 	add	x22, x21, 184
 	mov	w2, w0
 	adrp	x1, .LC12
 	add	x1, x1, :lo12:.LC12
-	ldr	x0, [x22, 88]
+	ldr	x0, [x22, 104]
 	bl	_dev_err
-.LVL283:
+.LVL287:
 	ldr	w2, [x29, 52]
-	b	.L334
+	b	.L338
 	.p2align 3
-.L357:
-	.loc 1 1223 0
-	ldr	x0, [x22, 88]
+.L361:
+	.loc 1 1225 0
+	ldr	x0, [x22, 104]
 	adrp	x1, .LC11
 	add	x1, x1, :lo12:.LC11
 	bl	_dev_info
-.LVL284:
-	.loc 1 1224 0
+.LVL288:
+	.loc 1 1226 0
 	mov	w2, 50
 	str	w2, [x29, 52]
-.LVL285:
-	b	.L334
+.LVL289:
+	b	.L338
 	.p2align 3
-.L346:
-	.loc 1 1235 0
+.L350:
+	.loc 1 1237 0
 	mov	w1, 1
-	add	x0, x21, 280
+	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL286:
-	cbz	w0, .L350
+.LVL290:
+	cbz	w0, .L354
 	.p2align 2
-.L347:
-	.loc 1 1224 0
+.L351:
+	.loc 1 1226 0
 	mov	w20, -1
-.L348:
-	.loc 1 1293 0
-	ldr	x0, [x22, 88]
+.L352:
+	.loc 1 1295 0
+	ldr	x0, [x22, 104]
 	adrp	x1, .LC14
 	add	x1, x1, :lo12:.LC14
 	bl	_dev_err
-.LVL287:
-	.loc 1 1294 0
-	b	.L331
+.LVL291:
+	.loc 1 1296 0
+	b	.L335
 	.p2align 3
-.L340:
-	.loc 1 1273 0
+.L344:
+	.loc 1 1275 0
 	mov	w1, 9
-	add	x0, x21, 280
+	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL288:
-	cbnz	w0, .L347
-	b	.L350
+.LVL292:
+	cbnz	w0, .L351
+	b	.L354
 	.p2align 3
-.L341:
-	.loc 1 1278 0
+.L345:
+	.loc 1 1280 0
 	mov	w1, 10
-	add	x0, x21, 280
+	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL289:
-	cbnz	w0, .L347
-	b	.L350
+.LVL293:
+	cbnz	w0, .L351
+	b	.L354
 	.p2align 3
-.L338:
-	.loc 1 1249 0
+.L342:
+	.loc 1 1251 0
 	mov	w1, 5
-	add	x0, x21, 280
+	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL290:
-	cbnz	w0, .L347
-	b	.L350
+.LVL294:
+	cbnz	w0, .L351
+	b	.L354
 	.p2align 3
-.L339:
-	.loc 1 1268 0
+.L343:
+	.loc 1 1270 0
 	mov	w1, 8
-	add	x0, x21, 280
+	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL291:
-	cbnz	w0, .L347
-	b	.L350
+.LVL295:
+	cbnz	w0, .L351
+	b	.L354
 	.p2align 3
-.L342:
-	.loc 1 1283 0
+.L346:
+	.loc 1 1285 0
 	mov	w1, 11
-	add	x0, x21, 280
+	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL292:
-	cbnz	w0, .L347
-	b	.L350
+.LVL296:
+	cbnz	w0, .L351
+	b	.L354
 	.p2align 3
-.L343:
-	.loc 1 1254 0
+.L347:
+	.loc 1 1256 0
 	mov	w1, 6
-	add	x0, x21, 280
+	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL293:
-	cbnz	w0, .L347
-	b	.L350
+.LVL297:
+	cbnz	w0, .L351
+	b	.L354
 	.p2align 3
-.L344:
-	.loc 1 1259 0
+.L348:
+	.loc 1 1261 0
 	mov	w1, 4
-	add	x0, x21, 280
+	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL294:
-	cbnz	w0, .L347
-	b	.L350
+.LVL298:
+	cbnz	w0, .L351
+	b	.L354
 	.p2align 3
-.L345:
-	.loc 1 1263 0
+.L349:
+	.loc 1 1265 0
 	mov	w1, 3
-	add	x0, x21, 280
+	add	x0, x21, 296
 	bl	epd_lut_get
-.LVL295:
-	cbnz	w0, .L347
-	b	.L350
+.LVL299:
+	cbnz	w0, .L351
+	b	.L354
 	.p2align 3
-.L356:
-	.loc 1 1219 0
-	ldr	x0, [x22, 88]
+.L360:
+	.loc 1 1221 0
+	ldr	x0, [x22, 104]
 	adrp	x1, .LC10
 	add	x1, x1, :lo12:.LC10
 	bl	_dev_info
-.LVL296:
-	.loc 1 1220 0
+.LVL300:
+	.loc 1 1222 0
 	str	wzr, [x29, 52]
 	mov	w2, 0
-	b	.L334
-.L359:
-	.loc 1 1298 0
+	b	.L338
+.L363:
+	.loc 1 1300 0
 	bl	__stack_chk_fail
-.LVL297:
+.LVL301:
 	.cfi_endproc
 .LFE2824:
 	.size	ebc_lut_update, .-ebc_lut_update
@@ -3598,24 +3653,24 @@ ebc_lut_update:
 	.p2align 3,,7
 	.type	ebc_buf_state_read, %function
 ebc_buf_state_read:
-.LFB2841:
-	.loc 1 2063 0
+.LFB2843:
+	.loc 1 2100 0
 	.cfi_startproc
-.LVL298:
+.LVL302:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2064 0
+	.loc 1 2101 0
 	mov	x0, x2
-.LVL299:
-	.loc 1 2063 0
+.LVL303:
+	.loc 1 2100 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2064 0
+	.loc 1 2101 0
 	bl	ebc_buf_state_show
-.LVL300:
-	.loc 1 2065 0
+.LVL304:
+	.loc 1 2102 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3623,39 +3678,39 @@ ebc_buf_state_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2841:
+.LFE2843:
 	.size	ebc_buf_state_read, .-ebc_buf_state_read
 	.align	2
 	.p2align 3,,7
 	.type	ebc_state_read, %function
 ebc_state_read:
-.LFB2840:
-	.loc 1 2054 0
+.LFB2842:
+	.loc 1 2091 0
 	.cfi_startproc
-.LVL301:
+.LVL305:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2055 0
+	.loc 1 2092 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2054 0
+	.loc 1 2091 0
 	mov	x0, x2
-.LVL302:
-	.loc 1 2055 0
+.LVL306:
+	.loc 1 2092 0
 	adrp	x1, .LC15
-.LVL303:
-	.loc 1 2054 0
+.LVL307:
+	.loc 1 2091 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2055 0
+	.loc 1 2092 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL304:
+.LVL308:
 	add	x1, x1, :lo12:.LC15
-	ldr	w2, [x2, 608]
+	ldr	w2, [x2, 624]
 	bl	sprintf
-.LVL305:
-	.loc 1 2056 0
+.LVL309:
+	.loc 1 2093 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3663,38 +3718,38 @@ ebc_state_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2840:
+.LFE2842:
 	.size	ebc_state_read, .-ebc_state_read
 	.align	2
 	.p2align 3,,7
 	.type	ebc_version_read, %function
 ebc_version_read:
-.LFB2839:
-	.loc 1 2045 0
+.LFB2841:
+	.loc 1 2082 0
 	.cfi_startproc
-.LVL306:
+.LVL310:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mov	x0, x2
-.LVL307:
-	.loc 1 2046 0
+.LVL311:
+	.loc 1 2083 0
 	adrp	x1, .LC17
-.LVL308:
+.LVL312:
 	adrp	x2, .LC16
-.LVL309:
-	.loc 1 2045 0
+.LVL313:
+	.loc 1 2082 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2046 0
+	.loc 1 2083 0
 	add	x2, x2, :lo12:.LC16
-	.loc 1 2045 0
-	.loc 1 2046 0
+	.loc 1 2082 0
+	.loc 1 2083 0
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
-.LVL310:
-	.loc 1 2047 0
+.LVL314:
+	.loc 1 2084 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3702,56 +3757,56 @@ ebc_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2839:
+.LFE2841:
 	.size	ebc_version_read, .-ebc_version_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
-.LFB2837:
-	.loc 1 2009 0
+.LFB2839:
+	.loc 1 2046 0
 	.cfi_startproc
-.LVL311:
+.LVL315:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 2010 0
+	.loc 1 2047 0
 	adrp	x0, .LANCHOR0
-.LVL312:
-	.loc 1 2009 0
+.LVL316:
+	.loc 1 2046 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2013 0
+	.loc 1 2050 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2009 0
+	.loc 1 2046 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2009 0
+	.loc 1 2046 0
 	mov	x19, x2
-	.loc 1 2013 0
+	.loc 1 2050 0
 	ldr	x1, [x0, 16]
-.LVL313:
-.LBB1220:
-.LBB1221:
+.LVL317:
+.LBB1218:
+.LBB1219:
 	.loc 3 55 0
 	mov	x0, x1
 	ldr	x1, [x1, 64]
 	blr	x1
-.LVL314:
-.LBE1221:
-.LBE1220:
-	.loc 1 2015 0
+.LVL318:
+.LBE1219:
+.LBE1218:
+	.loc 1 2052 0
 	mov	w2, w0
 	adrp	x1, .LC15
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
-.LVL315:
-	.loc 1 2016 0
+.LVL319:
+	.loc 1 2053 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL316:
+.LVL320:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3759,72 +3814,72 @@ pmic_vcom_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2837:
+.LFE2839:
 	.size	pmic_vcom_read, .-pmic_vcom_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_temp_read, %function
 pmic_temp_read:
-.LFB2836:
-	.loc 1 1995 0
+.LFB2838:
+	.loc 1 2032 0
 	.cfi_startproc
-.LVL317:
+.LVL321:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 1996 0
+	.loc 1 2033 0
 	adrp	x0, .LANCHOR0
-.LVL318:
-	.loc 1 1995 0
+.LVL322:
+	.loc 1 2032 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1999 0
+	.loc 1 2036 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-.LBB1222:
-.LBB1223:
+.LBB1220:
+.LBB1221:
 	.loc 3 50 0
 	add	x1, x29, 36
-.LVL319:
-.LBE1223:
-.LBE1222:
-	.loc 1 1995 0
+.LVL323:
+.LBE1221:
+.LBE1220:
+	.loc 1 2032 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 1995 0
+	.loc 1 2032 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
-.LVL320:
-	.loc 1 1999 0
+.LVL324:
+	.loc 1 2036 0
 	ldr	x2, [x0, 16]
-.LBB1225:
-.LBB1224:
+.LBB1223:
+.LBB1222:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL321:
-.LBE1224:
-.LBE1225:
-	.loc 1 2001 0
+.LVL325:
+.LBE1222:
+.LBE1223:
+	.loc 1 2038 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC15
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
-.LVL322:
-	.loc 1 2002 0
+.LVL326:
+	.loc 1 2039 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L371
+	cbnz	x1, .L375
 	ldp	x19, x20, [sp, 16]
-.LVL323:
+.LVL327:
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -3834,46 +3889,46 @@ pmic_temp_read:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL324:
-.L371:
+.LVL328:
+.L375:
 	.cfi_restore_state
 	bl	__stack_chk_fail
-.LVL325:
+.LVL329:
 	.cfi_endproc
-.LFE2836:
+.LFE2838:
 	.size	pmic_temp_read, .-pmic_temp_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_name_read, %function
 pmic_name_read:
-.LFB2835:
-	.loc 1 1984 0
+.LFB2837:
+	.loc 1 2021 0
 	.cfi_startproc
-.LVL326:
+.LVL330:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1985 0
+	.loc 1 2022 0
 	adrp	x3, .LANCHOR0
-	.loc 1 1984 0
+	.loc 1 2021 0
 	mov	x0, x2
-.LVL327:
-	.loc 1 1987 0
+.LVL331:
+	.loc 1 2024 0
 	adrp	x1, .LC17
-.LVL328:
-	.loc 1 1984 0
+.LVL332:
+	.loc 1 2021 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1987 0
+	.loc 1 2024 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL329:
+.LVL333:
 	add	x1, x1, :lo12:.LC17
 	ldr	x2, [x2, 16]
 	add	x2, x2, 8
 	bl	sprintf
-.LVL330:
-	.loc 1 1988 0
+.LVL334:
+	.loc 1 2025 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3881,24 +3936,24 @@ pmic_name_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2835:
+.LFE2837:
 	.size	pmic_name_read, .-pmic_name_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
-.LFB2838:
-	.loc 1 2021 0
+.LFB2840:
+	.loc 1 2058 0
 	.cfi_startproc
-.LVL331:
+.LVL335:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 2022 0
+	.loc 1 2059 0
 	adrp	x0, .LANCHOR0
-.LVL332:
-	.loc 1 2021 0
+.LVL336:
+	.loc 1 2058 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -3908,47 +3963,47 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 2021 0
+	.loc 1 2058 0
 	add	x1, x19, :lo12:__stack_chk_guard
-.LVL333:
+.LVL337:
 	mov	x21, x2
-	.loc 1 2022 0
+	.loc 1 2059 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
-.LVL334:
-	.loc 1 2021 0
+.LVL338:
+	.loc 1 2058 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
-.LVL335:
+.LVL339:
 	mov	x20, x3
-	.loc 1 2025 0
+	.loc 1 2062 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
-.LVL336:
-	.loc 1 2026 0
-	cbnz	w0, .L381
-.LVL337:
-	.loc 1 2030 0
+.LVL340:
+	.loc 1 2063 0
+	cbnz	w0, .L385
+.LVL341:
+	.loc 1 2067 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
-.LVL338:
-	.loc 1 2031 0
-	cbnz	w0, .L382
-.L374:
-	.loc 1 2037 0
+.LVL342:
+	.loc 1 2068 0
+	cbnz	w0, .L386
+.L378:
+	.loc 1 2074 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
-.LVL339:
+.LVL343:
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L383
+	cbnz	x1, .L387
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL340:
+.LVL344:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -3959,53 +4014,53 @@ pmic_vcom_write:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL341:
+.LVL345:
 	.p2align 3
-.L381:
+.L385:
 	.cfi_restore_state
-	.loc 1 2027 0
+	.loc 1 2064 0
 	ldr	x0, [x22]
 	adrp	x1, .LC18
 	mov	x2, x21
 	add	x1, x1, :lo12:.LC18
-	.loc 1 2028 0
+	.loc 1 2065 0
 	mov	x20, -1
-.LVL342:
-	.loc 1 2027 0
+.LVL346:
+	.loc 1 2064 0
 	bl	_dev_err
-.LVL343:
-	.loc 1 2028 0
-	b	.L374
-.LVL344:
+.LVL347:
+	.loc 1 2065 0
+	b	.L378
+.LVL348:
 	.p2align 3
-.L382:
-	.loc 1 2032 0
+.L386:
+	.loc 1 2069 0
 	ldr	x0, [x22]
 	adrp	x1, .LC19
-	.loc 1 2033 0
+	.loc 1 2070 0
 	mov	x20, -1
-.LVL345:
-	.loc 1 2032 0
+.LVL349:
+	.loc 1 2069 0
 	add	x1, x1, :lo12:.LC19
 	bl	_dev_err
-.LVL346:
-	.loc 1 2033 0
-	b	.L374
-.L383:
-	.loc 1 2037 0
+.LVL350:
+	.loc 1 2070 0
+	b	.L378
+.L387:
+	.loc 1 2074 0
 	bl	__stack_chk_fail
-.LVL347:
+.LVL351:
 	.cfi_endproc
-.LFE2838:
+.LFE2840:
 	.size	pmic_vcom_write, .-pmic_vcom_write
 	.align	2
 	.p2align 3,,7
 	.type	waveform_version_read, %function
 waveform_version_read:
-.LFB2834:
-	.loc 1 1973 0
+.LFB2836:
+	.loc 1 2010 0
 	.cfi_startproc
-.LVL348:
+.LVL352:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -4014,22 +4069,22 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1973 0
+	.loc 1 2010 0
 	mov	x19, x2
-	.loc 1 1974 0
+	.loc 1 2011 0
 	bl	epd_lut_get_wf_version
-.LVL349:
-	.loc 1 1976 0
+.LVL353:
+	.loc 1 2013 0
 	mov	x2, x0
 	adrp	x1, .LC17
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
-.LVL350:
-	.loc 1 1977 0
+.LVL354:
+	.loc 1 2014 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL351:
+.LVL355:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -4037,37 +4092,37 @@ waveform_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2834:
+.LFE2836:
 	.size	waveform_version_read, .-waveform_version_read
 	.section	.init.text,"ax",@progbits
 	.align	2
 	.type	ebc_init, %function
 ebc_init:
-.LFB2852:
-	.loc 1 2520 0
+.LFB2854:
+	.loc 1 2561 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2521 0
+	.loc 1 2562 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2520 0
+	.loc 1 2561 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2521 0
+	.loc 1 2562 0
 	bl	__platform_driver_register
-.LVL352:
-	.loc 1 2522 0
+.LVL356:
+	.loc 1 2563 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2852:
+.LFE2854:
 	.size	ebc_init, .-ebc_init
 	.text
 	.align	2
@@ -4075,241 +4130,241 @@ ebc_init:
 	.type	direct_mode_data_change, %function
 direct_mode_data_change:
 .LFB2815:
-	.loc 1 900 0
+	.loc 1 902 0
 	.cfi_startproc
-.LVL353:
-	.loc 1 901 0
-	ldr	w13, [x3, 72]
-.LVL354:
-	cbnz	w13, .L422
-.LBB1244:
-.LBB1245:
-	.loc 1 865 0
+.LVL357:
+	.loc 1 903 0
+	ldr	w13, [x3, 88]
+.LVL358:
+	cbnz	w13, .L426
+.LBB1242:
+.LBB1243:
+	.loc 1 867 0
 	adrp	x5, .LANCHOR0
-	.loc 1 871 0
-	ldrb	w7, [x3, 32]
-	ldr	w4, [x3, 40]
-	.loc 1 865 0
+	.loc 1 873 0
+	ldrb	w7, [x3, 48]
+	ldr	w4, [x3, 56]
+	.loc 1 867 0
 	ldr	x15, [x5, #:lo12:.LANCHOR0]
-	.loc 1 872 0
-	ldr	x3, [x3, 112]
-.LVL355:
-	.loc 1 871 0
-	sub	w7, w7, w4
-.LVL356:
+	.loc 1 874 0
+	ldr	x3, [x3, 128]
+.LVL359:
 	.loc 1 873 0
+	sub	w7, w7, w4
+.LVL360:
+	.loc 1 875 0
 	add	x15, x15, 24
-	.loc 1 872 0
+	.loc 1 874 0
 	lsl	w7, w7, 16
-.LVL357:
+.LVL361:
 	add	x7, x3, x7, sxtw
-.LVL358:
-	.loc 1 876 0
+.LVL362:
+	.loc 1 878 0
 	ldr	w16, [x15, 88]
-	.loc 1 875 0
+	.loc 1 877 0
 	ldr	w3, [x15, 84]
-	.loc 1 873 0
+	.loc 1 875 0
 	ldr	w17, [x15, 156]
-.LVL359:
-	.loc 1 881 0
+.LVL363:
+	.loc 1 883 0
 	cmp	w16, 0
-	.loc 1 875 0
+	.loc 1 877 0
 	lsr	w12, w3, 3
-.LVL360:
-	.loc 1 881 0
-	ble	.L410
+.LVL364:
+	.loc 1 883 0
+	ble	.L414
 	sub	w14, w12, #1
 	add	x14, x14, 1
 	lsl	x14, x14, 2
-	.loc 1 882 0
-	cbz	w17, .L396
-.LVL361:
+	.loc 1 884 0
+	cbz	w17, .L400
+.LVL365:
 	.p2align 2
-.L423:
-	.loc 1 883 0
+.L427:
+	.loc 1 885 0
 	ldr	w10, [x15, 88]
-.LVL362:
+.LVL366:
 	sub	w10, w10, #1
 	sub	w10, w10, w13
 	mul	w10, w10, w3
 	lsr	w10, w10, 2
 	add	x10, x0, x10
-.LVL363:
-.L397:
-	.loc 1 887 0
-	cbz	w12, .L398
+.LVL367:
+.L401:
+	.loc 1 889 0
+	cbz	w12, .L402
 	mov	x5, 0
 	.p2align 2
-.L399:
-	.loc 1 889 0
+.L403:
+	.loc 1 891 0
 	ldr	w3, [x2, x5, lsl 2]
-	.loc 1 888 0
+	.loc 1 890 0
 	ldr	w4, [x1, x5, lsl 2]
 	add	x5, x5, 1
-.LVL364:
-.LBB1246:
-.LBB1247:
-	.loc 1 131 0
+.LVL368:
+.LBB1244:
+.LBB1245:
+	.loc 1 133 0
 	and	w9, w3, 65280
-.LBE1247:
-.LBE1246:
-	.loc 1 887 0
+.LBE1245:
+.LBE1244:
+	.loc 1 889 0
 	cmp	w12, w5
-.LVL365:
-	.loc 1 891 0
+.LVL369:
+	.loc 1 893 0
 	and	w6, w4, 65535
-.LBB1252:
-.LBB1248:
-	.loc 1 130 0
+.LBB1250:
+.LBB1246:
+	.loc 1 132 0
 	ubfiz	w8, w3, 8, 8
-	.loc 1 131 0
+	.loc 1 133 0
 	add	w9, w9, w6, lsr 8
-	.loc 1 130 0
+	.loc 1 132 0
 	add	w6, w8, w6, uxtb
-.LBE1248:
-.LBE1252:
-	.loc 1 892 0
+.LBE1246:
+.LBE1250:
+	.loc 1 894 0
 	lsr	w3, w3, 16
-.LVL366:
+.LVL370:
 	lsr	w4, w4, 16
-.LBB1253:
-.LBB1254:
-	.loc 1 130 0
+.LBB1251:
+.LBB1252:
+	.loc 1 132 0
 	ubfiz	w8, w3, 8, 8
-	.loc 1 131 0
+	.loc 1 133 0
 	and	w3, w3, 65280
-.LBE1254:
+.LBE1252:
+.LBE1251:
+.LBB1256:
+.LBB1247:
+	.loc 1 132 0
+	ldrb	w11, [x7, w6, sxtw]
+.LBE1247:
+.LBE1256:
+.LBB1257:
+.LBB1253:
+	.loc 1 133 0
+	add	w3, w3, w4, lsr 8
 .LBE1253:
+.LBE1257:
 .LBB1258:
-.LBB1249:
-	.loc 1 130 0
-	ldrb	w11, [x7, w6, sxtw]
-.LBE1249:
+.LBB1248:
+	ldrb	w9, [x7, w9, sxtw]
+.LBE1248:
 .LBE1258:
 .LBB1259:
-.LBB1255:
-	.loc 1 131 0
-	add	w3, w3, w4, lsr 8
-.LBE1255:
+.LBB1254:
+	.loc 1 132 0
+	add	w6, w8, w4, uxtb
+.LBE1254:
 .LBE1259:
 .LBB1260:
-.LBB1250:
-	ldrb	w9, [x7, w9, sxtw]
-.LBE1250:
-.LBE1260:
-.LBB1261:
-.LBB1256:
-	.loc 1 130 0
-	add	w6, w8, w4, uxtb
-.LBE1256:
-.LBE1261:
-.LBB1262:
-.LBB1251:
+.LBB1249:
 	orr	w4, w11, w9, lsl 4
-.LBE1251:
-.LBE1262:
-	.loc 1 891 0
+.LBE1249:
+.LBE1260:
+	.loc 1 893 0
 	strb	w4, [x10], 2
-.LBB1263:
-.LBB1257:
-	.loc 1 131 0
+.LBB1261:
+.LBB1255:
+	.loc 1 133 0
 	ldrb	w3, [x7, w3, sxtw]
-	.loc 1 130 0
+	.loc 1 132 0
 	ldrb	w4, [x7, w6, sxtw]
 	orr	w3, w4, w3, lsl 4
-.LBE1257:
-.LBE1263:
-	.loc 1 892 0
+.LBE1255:
+.LBE1261:
+	.loc 1 894 0
 	strb	w3, [x10, -1]
-	.loc 1 887 0
-	bgt	.L399
+	.loc 1 889 0
+	bgt	.L403
 	add	x1, x1, x14
 	add	x2, x2, x14
-.L398:
-	.loc 1 881 0
+.L402:
+	.loc 1 883 0
 	add	w13, w13, 1
 	cmp	w16, w13
-	beq	.L410
+	beq	.L414
 	ldr	w3, [x15, 84]
-	.loc 1 882 0
-	cbnz	w17, .L423
-.L396:
-	.loc 1 885 0
+	.loc 1 884 0
+	cbnz	w17, .L427
+.L400:
+	.loc 1 887 0
 	mul	w10, w13, w3
-.LVL367:
+.LVL371:
 	lsr	w10, w10, 2
 	add	x10, x0, x10
-.LVL368:
-	b	.L397
-.LVL369:
-.L422:
-.LBE1245:
-.LBE1244:
+.LVL372:
+	b	.L401
+.LVL373:
+.L426:
+.LBE1243:
+.LBE1242:
+.LBB1262:
+.LBB1263:
 .LBB1264:
-.LBB1265:
-.LBB1266:
-	.loc 1 826 0
+	.loc 1 828 0
 	adrp	x7, .LANCHOR0
-	.loc 1 832 0
-	ldrb	w4, [x3, 32]
-	ldr	w6, [x3, 40]
-	.loc 1 826 0
+	.loc 1 834 0
+	ldrb	w4, [x3, 48]
+	ldr	w6, [x3, 56]
+	.loc 1 828 0
 	ldr	x13, [x7, #:lo12:.LANCHOR0]
-.LVL370:
-	.loc 1 833 0
-	ldr	x5, [x3, 112]
-	.loc 1 832 0
-	sub	w3, w4, w6
-.LVL371:
+.LVL374:
+	.loc 1 835 0
+	ldr	x5, [x3, 128]
 	.loc 1 834 0
+	sub	w3, w4, w6
+.LVL375:
+	.loc 1 836 0
 	add	x13, x13, 24
-	.loc 1 833 0
+	.loc 1 835 0
 	lsl	w3, w3, 16
-.LVL372:
+.LVL376:
 	add	x3, x5, x3, sxtw
-.LVL373:
-	.loc 1 837 0
+.LVL377:
+	.loc 1 839 0
 	ldr	w15, [x13, 88]
-	.loc 1 836 0
+	.loc 1 838 0
 	ldr	w5, [x13, 84]
-	.loc 1 834 0
+	.loc 1 836 0
 	ldr	w16, [x13, 156]
-.LVL374:
-	.loc 1 842 0
+.LVL378:
+	.loc 1 844 0
 	cmp	w15, 0
-	.loc 1 836 0
+	.loc 1 838 0
 	lsr	w14, w5, 4
-	.loc 1 842 0
-	ble	.L410
+	.loc 1 844 0
+	ble	.L414
 	sub	w11, w14, #1
 	mov	x10, x2
-.LVL375:
+.LVL379:
 	add	x11, x11, 1
 	mov	x9, x1
-.LVL376:
+.LVL380:
 	lsl	x11, x11, 3
 	mov	w12, 0
-.LVL377:
-	.loc 1 843 0
-	cbz	w16, .L413
-.LVL378:
-.L426:
-	.loc 1 844 0
+.LVL381:
+	.loc 1 845 0
+	cbz	w16, .L417
+.LVL382:
+.L430:
+	.loc 1 846 0
 	ldr	w4, [x13, 88]
-.LVL379:
+.LVL383:
 	sub	w4, w4, #1
 	sub	w4, w4, w12
 	mul	w4, w4, w5
 	lsr	w4, w4, 2
 	add	x4, x0, x4
-.LVL380:
-.L414:
-	.loc 1 848 0
-	cbz	w14, .L424
-.LBE1266:
-.LBE1265:
+.LVL384:
+.L418:
+	.loc 1 850 0
+	cbz	w14, .L428
 .LBE1264:
-	.loc 1 900 0
+.LBE1263:
+.LBE1262:
+	.loc 1 902 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -4317,261 +4372,261 @@ direct_mode_data_change:
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	.p2align 2
-.L415:
-.LBB1311:
+.L419:
 .LBB1309:
 .LBB1307:
-	.loc 1 848 0
+.LBB1305:
+	.loc 1 850 0
 	mov	x5, 0
 	.p2align 2
-.L395:
-	.loc 1 850 0
+.L399:
+	.loc 1 852 0
 	ldr	x2, [x10, x5]
-.LVL381:
+.LVL385:
 	add	x4, x4, 4
-	.loc 1 849 0
+	.loc 1 851 0
 	ldr	x1, [x9, x5]
-.LVL382:
+.LVL386:
 	add	x5, x5, 8
-	.loc 1 852 0
+	.loc 1 854 0
 	and	w7, w2, 65535
-	.loc 1 848 0
+	.loc 1 850 0
 	cmp	x11, x5
-	.loc 1 852 0
+	.loc 1 854 0
 	and	w6, w1, 65535
-.LBB1267:
-.LBB1268:
-	.loc 1 130 0
+.LBB1265:
+.LBB1266:
+	.loc 1 132 0
 	ubfiz	w30, w7, 8, 8
-	.loc 1 131 0
+	.loc 1 133 0
 	and	w7, w7, 65280
-	.loc 1 130 0
+	.loc 1 132 0
 	add	w30, w30, w6, uxtb
-	.loc 1 131 0
+	.loc 1 133 0
 	add	w7, w7, w6, lsr 8
-.LBE1268:
-.LBE1267:
-	.loc 1 853 0
+.LBE1266:
+.LBE1265:
+	.loc 1 855 0
 	lsr	w8, w2, 16
 	lsr	w6, w1, 16
-.LBB1272:
-.LBB1273:
-	.loc 1 130 0
+.LBB1270:
+.LBB1271:
+	.loc 1 132 0
 	ubfiz	w18, w8, 8, 8
-.LBE1273:
+.LBE1271:
+.LBE1270:
+.LBB1277:
+.LBB1267:
+	ldrb	w30, [x3, w30, sxtw]
+.LBE1267:
+.LBE1277:
+.LBB1278:
+.LBB1272:
+	.loc 1 133 0
+	and	w8, w8, 65280
 .LBE1272:
+.LBE1278:
 .LBB1279:
-.LBB1269:
-	ldrb	w30, [x3, w30, sxtw]
-.LBE1269:
+.LBB1268:
+	ldrb	w17, [x3, w7, sxtw]
+.LBE1268:
 .LBE1279:
 .LBB1280:
-.LBB1274:
-	.loc 1 131 0
-	and	w8, w8, 65280
-.LBE1274:
-.LBE1280:
-.LBB1281:
-.LBB1270:
-	ldrb	w17, [x3, w7, sxtw]
-.LBE1270:
-.LBE1281:
-.LBB1282:
-.LBB1275:
-	.loc 1 130 0
+.LBB1273:
+	.loc 1 132 0
 	add	w18, w18, w6, uxtb
-	.loc 1 131 0
+	.loc 1 133 0
 	add	w8, w8, w6, lsr 8
-.LBE1275:
-.LBE1282:
-	.loc 1 854 0
+.LBE1273:
+.LBE1280:
+	.loc 1 856 0
 	ubfx	x7, x2, 32, 16
 	ubfx	x6, x1, 32, 16
-	.loc 1 855 0
+	.loc 1 857 0
 	lsr	x2, x2, 48
-.LVL383:
-.LBB1283:
-.LBB1271:
-	.loc 1 130 0
+.LVL387:
+.LBB1281:
+.LBB1269:
+	.loc 1 132 0
 	orr	w17, w30, w17, lsl 4
-.LBE1271:
-.LBE1283:
-	.loc 1 852 0
+.LBE1269:
+.LBE1281:
+	.loc 1 854 0
 	strb	w17, [x4, -4]
-.LBB1284:
-.LBB1285:
-	.loc 1 130 0
+.LBB1282:
+.LBB1283:
+	.loc 1 132 0
 	ubfiz	w17, w7, 8, 8
-	.loc 1 131 0
+	.loc 1 133 0
 	and	w7, w7, 65280
-.LBE1285:
+.LBE1283:
+.LBE1282:
+.LBB1289:
+.LBB1274:
+	ldrb	w8, [x3, w8, sxtw]
+.LBE1274:
+.LBE1289:
+.LBB1290:
+.LBB1284:
+	.loc 1 132 0
+	add	w17, w17, w6, uxtb
 .LBE1284:
+.LBE1290:
 .LBB1291:
-.LBB1276:
-	ldrb	w8, [x3, w8, sxtw]
-.LBE1276:
+.LBB1275:
+	ldrb	w18, [x3, w18, sxtw]
+.LBE1275:
 .LBE1291:
 .LBB1292:
-.LBB1286:
-	.loc 1 130 0
-	add	w17, w17, w6, uxtb
-.LBE1286:
+.LBB1285:
+	.loc 1 133 0
+	add	w6, w7, w6, lsr 8
+.LBE1285:
 .LBE1292:
+	.loc 1 857 0
+	lsr	x1, x1, 48
+.LVL388:
 .LBB1293:
-.LBB1277:
-	ldrb	w18, [x3, w18, sxtw]
-.LBE1277:
+.LBB1276:
+	.loc 1 132 0
+	orr	w7, w18, w8, lsl 4
+.LBE1276:
 .LBE1293:
-.LBB1294:
-.LBB1287:
-	.loc 1 131 0
-	add	w6, w7, w6, lsr 8
-.LBE1287:
-.LBE1294:
 	.loc 1 855 0
-	lsr	x1, x1, 48
-.LVL384:
-.LBB1295:
-.LBB1278:
-	.loc 1 130 0
-	orr	w7, w18, w8, lsl 4
-.LBE1278:
-.LBE1295:
-	.loc 1 853 0
 	strb	w7, [x4, -3]
-.LBB1296:
-.LBB1297:
-	.loc 1 130 0
+.LBB1294:
+.LBB1295:
+	.loc 1 132 0
 	ubfiz	w7, w2, 8, 8
-	.loc 1 131 0
+	.loc 1 133 0
 	and	w2, w2, 65280
-.LBE1297:
+.LBE1295:
+.LBE1294:
+.LBB1299:
+.LBB1286:
+	ldrb	w8, [x3, w6, sxtw]
+.LBE1286:
+.LBE1299:
+.LBB1300:
+.LBB1296:
+	.loc 1 132 0
+	add	w6, w7, w1, uxtb
 .LBE1296:
+.LBE1300:
 .LBB1301:
-.LBB1288:
-	ldrb	w8, [x3, w6, sxtw]
-.LBE1288:
+.LBB1287:
+	ldrb	w17, [x3, w17, sxtw]
+.LBE1287:
 .LBE1301:
 .LBB1302:
-.LBB1298:
-	.loc 1 130 0
-	add	w6, w7, w1, uxtb
-.LBE1298:
+.LBB1297:
+	.loc 1 133 0
+	add	w1, w2, w1, lsr 8
+.LBE1297:
 .LBE1302:
 .LBB1303:
-.LBB1289:
-	ldrb	w17, [x3, w17, sxtw]
-.LBE1289:
-.LBE1303:
-.LBB1304:
-.LBB1299:
-	.loc 1 131 0
-	add	w1, w2, w1, lsr 8
-.LBE1299:
-.LBE1304:
-.LBB1305:
-.LBB1290:
-	.loc 1 130 0
+.LBB1288:
+	.loc 1 132 0
 	orr	w2, w17, w8, lsl 4
-.LBE1290:
-.LBE1305:
-	.loc 1 854 0
+.LBE1288:
+.LBE1303:
+	.loc 1 856 0
 	strb	w2, [x4, -2]
-.LBB1306:
-.LBB1300:
-	.loc 1 131 0
+.LBB1304:
+.LBB1298:
+	.loc 1 133 0
 	ldrb	w1, [x3, w1, sxtw]
-	.loc 1 130 0
+	.loc 1 132 0
 	ldrb	w2, [x3, w6, sxtw]
 	orr	w1, w2, w1, lsl 4
-.LBE1300:
-.LBE1306:
-	.loc 1 855 0
+.LBE1298:
+.LBE1304:
+	.loc 1 857 0
 	strb	w1, [x4, -1]
-	.loc 1 848 0
-	bne	.L395
-	.loc 1 842 0
+	.loc 1 850 0
+	bne	.L399
+	.loc 1 844 0
 	add	w12, w12, 1
 	add	x9, x9, x11
 	add	x10, x10, x11
 	cmp	w15, w12
-	beq	.L388
-.L425:
+	beq	.L392
+.L429:
 	ldr	w5, [x13, 84]
-	.loc 1 843 0
-	cbz	w16, .L392
-	.loc 1 844 0
+	.loc 1 845 0
+	cbz	w16, .L396
+	.loc 1 846 0
 	ldr	w4, [x13, 88]
-.LVL385:
+.LVL389:
 	sub	w4, w4, #1
 	sub	w4, w4, w12
 	mul	w4, w4, w5
 	lsr	w4, w4, 2
 	add	x4, x0, x4
-.LVL386:
-	.loc 1 848 0
-	cbnz	w14, .L415
-.L421:
-	.loc 1 842 0
+.LVL390:
+	.loc 1 850 0
+	cbnz	w14, .L419
+.L425:
+	.loc 1 844 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	bne	.L425
-.L388:
+	bne	.L429
+.L392:
+.LBE1305:
 .LBE1307:
 .LBE1309:
-.LBE1311:
-	.loc 1 905 0
+	.loc 1 907 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
-.LVL387:
-.L413:
-.LBB1312:
+.LVL391:
+.L417:
 .LBB1310:
 .LBB1308:
-	.loc 1 846 0
+.LBB1306:
+	.loc 1 848 0
 	mul	w4, w12, w5
-.LVL388:
+.LVL392:
 	lsr	w4, w4, 2
 	add	x4, x0, x4
-.LVL389:
-	b	.L414
-.LVL390:
+.LVL393:
+	b	.L418
+.LVL394:
 	.p2align 3
-.L392:
+.L396:
 	.cfi_def_cfa 29, 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mul	w4, w12, w5
-.LVL391:
+.LVL395:
 	lsr	w4, w4, 2
 	add	x4, x0, x4
-.LVL392:
-	.loc 1 848 0
-	cbnz	w14, .L415
-	b	.L421
-.LVL393:
-.L424:
+.LVL396:
+	.loc 1 850 0
+	cbnz	w14, .L419
+	b	.L425
+.LVL397:
+.L428:
 	.cfi_def_cfa 31, 0
 	.cfi_restore 29
 	.cfi_restore 30
-	.loc 1 842 0
+	.loc 1 844 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L410
+	beq	.L414
 	ldr	w5, [x13, 84]
-	.loc 1 843 0
-	cbz	w16, .L413
-	b	.L426
-.LVL394:
+	.loc 1 845 0
+	cbz	w16, .L417
+	b	.L430
+.LVL398:
 	.p2align 3
-.L410:
+.L414:
 	ret
+.LBE1306:
 .LBE1308:
 .LBE1310:
-.LBE1312:
 	.cfi_endproc
 .LFE2815:
 	.size	direct_mode_data_change, .-direct_mode_data_change
@@ -4580,22 +4635,22 @@ direct_mode_data_change:
 	.type	direct_mode_data_change_part, %function
 direct_mode_data_change_part:
 .LFB2818:
-	.loc 1 994 0
+	.loc 1 996 0
 	.cfi_startproc
-.LVL395:
+.LVL399:
 	stp	x29, x30, [sp, -80]!
 	.cfi_def_cfa_offset 80
 	.cfi_offset 29, -80
 	.cfi_offset 30, -72
+.LBB1329:
+.LBB1330:
 .LBB1331:
-.LBB1332:
-.LBB1333:
-	.loc 1 953 0
+	.loc 1 955 0
 	adrp	x5, .LANCHOR0
-.LBE1333:
-.LBE1332:
 .LBE1331:
-	.loc 1 994 0
+.LBE1330:
+.LBE1329:
+	.loc 1 996 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -4609,264 +4664,264 @@ direct_mode_data_change_part:
 	.cfi_offset 23, -32
 	.cfi_offset 24, -24
 	.cfi_offset 25, -16
-	.loc 1 995 0
-	ldr	w16, [x3, 72]
-.LVL396:
-	cbnz	w16, .L531
-.LBB1346:
-.LBB1347:
-	.loc 1 912 0
+	.loc 1 997 0
+	ldr	w16, [x3, 88]
+.LVL400:
+	cbnz	w16, .L535
+.LBB1344:
+.LBB1345:
+	.loc 1 914 0
 	ldr	x18, [x5, #:lo12:.LANCHOR0]
-	.loc 1 917 0
-	ldrb	w14, [x3, 32]
-	ldr	w4, [x3, 40]
 	.loc 1 919 0
+	ldrb	w14, [x3, 48]
+	ldr	w4, [x3, 56]
+	.loc 1 921 0
 	add	x18, x18, 24
-	.loc 1 918 0
-	ldr	x3, [x3, 112]
-.LVL397:
-	.loc 1 917 0
+	.loc 1 920 0
+	ldr	x3, [x3, 128]
+.LVL401:
+	.loc 1 919 0
 	sub	w14, w14, w4
-.LVL398:
-	.loc 1 922 0
+.LVL402:
+	.loc 1 924 0
 	ldr	w30, [x18, 88]
-	.loc 1 918 0
+	.loc 1 920 0
 	lsl	w14, w14, 16
-.LVL399:
-	.loc 1 919 0
+.LVL403:
+	.loc 1 921 0
 	ldr	w19, [x18, 156]
-	.loc 1 918 0
+	.loc 1 920 0
 	add	x14, x3, x14, sxtw
-.LVL400:
-	.loc 1 921 0
+.LVL404:
+	.loc 1 923 0
 	ldr	w3, [x18, 84]
-.LVL401:
-	.loc 1 927 0
+.LVL405:
+	.loc 1 929 0
 	cmp	w30, 0
-	.loc 1 921 0
+	.loc 1 923 0
 	lsr	w9, w3, 3
-.LVL402:
-	.loc 1 927 0
-	ble	.L427
+.LVL406:
+	.loc 1 929 0
+	ble	.L431
 	sub	w17, w9, #1
-.LBB1348:
-.LBB1349:
-	.loc 1 136 0
+.LBB1346:
+.LBB1347:
+	.loc 1 138 0
 	mov	w15, 3
 	add	x17, x17, 1
 	lsl	x17, x17, 2
-.LBE1349:
-.LBE1348:
-	.loc 1 928 0
-	cbz	w19, .L457
-.LVL403:
+.LBE1347:
+.LBE1346:
+	.loc 1 930 0
+	cbz	w19, .L461
+.LVL407:
 	.p2align 2
-.L532:
-	.loc 1 929 0
+.L536:
+	.loc 1 931 0
 	ldr	w13, [x18, 88]
-.LVL404:
+.LVL408:
 	sub	w13, w13, #1
 	sub	w13, w13, w16
 	mul	w13, w13, w3
 	lsr	w13, w13, 2
 	add	x13, x0, x13
-.LVL405:
-.L458:
-	.loc 1 933 0
-	cbz	w9, .L459
+.LVL409:
+.L462:
+	.loc 1 935 0
+	cbz	w9, .L463
 	add	x13, x13, 2
-.LVL406:
+.LVL410:
 	mov	x10, 0
 	.p2align 2
-.L472:
-	.loc 1 935 0
+.L476:
+	.loc 1 937 0
 	ldr	w6, [x2, x10, lsl 2]
-.LBB1355:
-.LBB1356:
-	.loc 1 140 0
+.LBB1353:
+.LBB1354:
+	.loc 1 142 0
 	mov	w4, 0
-.LBE1356:
-.LBE1355:
-	.loc 1 934 0
+.LBE1354:
+.LBE1353:
+	.loc 1 936 0
 	ldr	w7, [x1, x10, lsl 2]
-.LBB1361:
-.LBB1350:
-	.loc 1 140 0
+.LBB1359:
+.LBB1348:
+	.loc 1 142 0
 	mov	w5, 0
-.LBE1350:
-.LBE1361:
-	.loc 1 937 0
+.LBE1348:
+.LBE1359:
+	.loc 1 939 0
 	and	w20, w6, 65535
 	and	w12, w7, 65535
-.LBB1362:
-.LBB1357:
-	.loc 1 151 0
+.LBB1360:
+.LBB1355:
+	.loc 1 153 0
 	and	w3, w20, 65280
 	add	w8, w3, w12, lsr 8
-.LBE1357:
-.LBE1362:
-	.loc 1 938 0
+.LBE1355:
+.LBE1360:
+	.loc 1 940 0
 	lsr	w3, w6, 16
-.LBB1363:
-.LBB1351:
-	.loc 1 150 0
+.LBB1361:
+.LBB1349:
+	.loc 1 152 0
 	ubfiz	w23, w3, 8, 8
-.LBE1351:
-.LBE1363:
-	.loc 1 938 0
+.LBE1349:
+.LBE1361:
+	.loc 1 940 0
 	and	w3, w3, 65535
 	lsr	w11, w7, 16
-.LBB1364:
-.LBB1358:
-	.loc 1 150 0
+.LBB1362:
+.LBB1356:
+	.loc 1 152 0
 	ubfiz	w24, w6, 8, 8
-.LBE1358:
-.LBE1364:
-.LBB1365:
-.LBB1352:
-	.loc 1 151 0
-	and	w21, w3, 65280
-.LBE1352:
-.LBE1365:
-.LBB1366:
-.LBB1359:
-	.loc 1 137 0
+.LBE1356:
+.LBE1362:
+.LBB1363:
+.LBB1350:
+	.loc 1 153 0
+	and	w21, w3, 65280
+.LBE1350:
+.LBE1363:
+.LBB1364:
+.LBB1357:
+	.loc 1 139 0
 	eor	w25, w20, w12
-	.loc 1 150 0
+	.loc 1 152 0
 	add	w24, w24, w12, uxtb
-.LBE1359:
-.LBE1366:
-.LBB1367:
-.LBB1353:
+.LBE1357:
+.LBE1364:
+.LBB1365:
+.LBB1351:
 	add	w23, w23, w11, uxtb
-	.loc 1 137 0
+	.loc 1 139 0
 	eor	w22, w3, w11
-	.loc 1 151 0
+	.loc 1 153 0
 	add	w21, w21, w11, lsr 8
-.LBE1353:
-.LBE1367:
-	.loc 1 936 0
+.LBE1351:
+.LBE1365:
+	.loc 1 938 0
 	cmp	w7, w6
-	beq	.L460
-.LBB1368:
-.LBB1360:
-	.loc 1 139 0
+	beq	.L464
+.LBB1366:
+.LBB1358:
+	.loc 1 141 0
 	cmp	w20, w12
-	beq	.L461
-	.loc 1 136 0
+	beq	.L465
+	.loc 1 138 0
 	tst	x25, 15
-	.loc 1 151 0
+	.loc 1 153 0
 	ldrb	w6, [x14, w8, sxtw]
-	.loc 1 136 0
+	.loc 1 138 0
 	csel	w4, w15, wzr, ne
-	.loc 1 144 0
+	.loc 1 146 0
 	tst	w25, 240
 	orr	w7, w4, 12
-	.loc 1 150 0
+	.loc 1 152 0
 	ldrb	w8, [x14, w24, sxtw]
-	.loc 1 144 0
-	csel	w4, w7, w4, ne
 	.loc 1 146 0
+	csel	w4, w7, w4, ne
+	.loc 1 148 0
 	tst	w25, 3840
 	orr	w7, w4, 48
 	csel	w4, w7, w4, ne
-	.loc 1 148 0
+	.loc 1 150 0
 	tst	w25, 61440
 	orr	w7, w4, -64
-	.loc 1 150 0
+	.loc 1 152 0
 	orr	w6, w8, w6, lsl 4
-	.loc 1 148 0
+	.loc 1 150 0
 	and	w7, w7, 255
 	csel	w4, w7, w4, ne
-	.loc 1 150 0
+	.loc 1 152 0
 	and	w4, w6, w4
 	and	w4, w4, 255
-.L461:
-.LBE1360:
-.LBE1368:
-	.loc 1 937 0
+.L465:
+.LBE1358:
+.LBE1366:
+	.loc 1 939 0
 	strb	w4, [x13, -2]
-.LBB1369:
-.LBB1354:
-	.loc 1 139 0
+.LBB1367:
+.LBB1352:
+	.loc 1 141 0
 	cmp	w3, w11
-	beq	.L466
-	.loc 1 136 0
+	beq	.L470
+	.loc 1 138 0
 	tst	x22, 15
-	.loc 1 150 0
+	.loc 1 152 0
 	ldrb	w6, [x14, w23, sxtw]
-	.loc 1 136 0
+	.loc 1 138 0
 	csel	w3, w15, wzr, ne
-	.loc 1 144 0
+	.loc 1 146 0
 	tst	w22, 240
 	orr	w4, w3, 12
-	.loc 1 151 0
+	.loc 1 153 0
 	ldrb	w5, [x14, w21, sxtw]
-	.loc 1 144 0
-	csel	w3, w4, w3, ne
 	.loc 1 146 0
+	csel	w3, w4, w3, ne
+	.loc 1 148 0
 	tst	w22, 3840
 	orr	w4, w3, 48
 	csel	w3, w4, w3, ne
-	.loc 1 148 0
+	.loc 1 150 0
 	tst	w22, 61440
 	orr	w4, w3, -64
-	.loc 1 150 0
+	.loc 1 152 0
 	orr	w5, w6, w5, lsl 4
-	.loc 1 148 0
+	.loc 1 150 0
 	and	w4, w4, 255
 	csel	w3, w4, w3, ne
-	.loc 1 150 0
+	.loc 1 152 0
 	and	w3, w5, w3
 	and	w5, w3, 255
-.L466:
-.LBE1354:
-.LBE1369:
-	.loc 1 938 0
+.L470:
+.LBE1352:
+.LBE1367:
+	.loc 1 940 0
 	strb	w5, [x13, -1]
-.L471:
+.L475:
 	add	x10, x10, 1
 	add	x13, x13, 2
-	.loc 1 933 0
+	.loc 1 935 0
 	cmp	w9, w10
-	bgt	.L472
+	bgt	.L476
 	add	x1, x1, x17
 	add	x2, x2, x17
-.LVL407:
-.L459:
-	.loc 1 927 0
+.LVL411:
+.L463:
+	.loc 1 929 0
 	add	w16, w16, 1
 	cmp	w30, w16
-	beq	.L427
+	beq	.L431
 	ldr	w3, [x18, 84]
-	.loc 1 928 0
-	cbnz	w19, .L532
-.L457:
-	.loc 1 931 0
+	.loc 1 930 0
+	cbnz	w19, .L536
+.L461:
+	.loc 1 933 0
 	mul	w13, w16, w3
-.LVL408:
+.LVL412:
 	lsr	w13, w13, 2
 	add	x13, x0, x13
-.LVL409:
-	b	.L458
-.LVL410:
+.LVL413:
+	b	.L462
+.LVL414:
 	.p2align 3
-.L460:
-	.loc 1 941 0
+.L464:
+	.loc 1 943 0
 	strh	wzr, [x13, -2]
-	b	.L471
-.LVL411:
+	b	.L475
+.LVL415:
 	.p2align 3
-.L427:
-.LBE1347:
-.LBE1346:
-	.loc 1 999 0
+.L431:
+.LBE1345:
+.LBE1344:
+	.loc 1 1001 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL412:
+.LVL416:
 	ldp	x23, x24, [sp, 48]
 	ldr	x25, [sp, 64]
-.LVL413:
+.LVL417:
 	ldp	x29, x30, [sp], 80
 	.cfi_remember_state
 	.cfi_restore 30
@@ -4879,357 +4934,357 @@ direct_mode_data_change_part:
 	.cfi_restore 19
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
-.LVL414:
+.LVL418:
 	ret
-.LVL415:
-.L531:
+.LVL419:
+.L535:
 	.cfi_restore_state
-.LBB1370:
-.LBB1345:
-.LBB1344:
-	.loc 1 953 0
+.LBB1368:
+.LBB1343:
+.LBB1342:
+	.loc 1 955 0
 	ldr	x14, [x5, #:lo12:.LANCHOR0]
-	.loc 1 958 0
-	ldrb	w7, [x3, 32]
-	ldr	w4, [x3, 40]
 	.loc 1 960 0
+	ldrb	w7, [x3, 48]
+	ldr	w4, [x3, 56]
+	.loc 1 962 0
 	add	x14, x14, 24
-	.loc 1 959 0
-	ldr	x3, [x3, 112]
-.LVL416:
-	.loc 1 958 0
+	.loc 1 961 0
+	ldr	x3, [x3, 128]
+.LVL420:
+	.loc 1 960 0
 	sub	w7, w7, w4
-.LVL417:
-	.loc 1 963 0
+.LVL421:
+	.loc 1 965 0
 	ldr	w15, [x14, 88]
-	.loc 1 959 0
+	.loc 1 961 0
 	lsl	w7, w7, 16
-.LVL418:
-	.loc 1 960 0
+.LVL422:
+	.loc 1 962 0
 	ldr	w16, [x14, 156]
-.LVL419:
-	.loc 1 959 0
+.LVL423:
+	.loc 1 961 0
 	add	x7, x3, x7, sxtw
-.LVL420:
-	.loc 1 962 0
+.LVL424:
+	.loc 1 964 0
 	ldr	w3, [x14, 84]
-.LVL421:
-	.loc 1 968 0
+.LVL425:
+	.loc 1 970 0
 	cmp	w15, 0
-	.loc 1 962 0
+	.loc 1 964 0
 	lsr	w11, w3, 4
-.LVL422:
-	.loc 1 968 0
-	ble	.L427
+.LVL426:
+	.loc 1 970 0
+	ble	.L431
 	sub	w13, w11, #1
 	mov	x9, x2
-.LVL423:
+.LVL427:
 	add	x13, x13, 1
 	mov	x8, x1
-.LVL424:
+.LVL428:
 	lsl	x13, x13, 3
 	mov	w12, 0
-.LVL425:
-.LBB1334:
-.LBB1335:
-	.loc 1 136 0
+.LVL429:
+.LBB1332:
+.LBB1333:
+	.loc 1 138 0
 	mov	w10, 3
-.LBE1335:
-.LBE1334:
-	.loc 1 969 0
-	cbz	w16, .L431
-.LVL426:
+.LBE1333:
+.LBE1332:
+	.loc 1 971 0
+	cbz	w16, .L435
+.LVL430:
 	.p2align 2
-.L533:
-	.loc 1 970 0
+.L537:
+	.loc 1 972 0
 	ldr	w1, [x14, 88]
-.LVL427:
+.LVL431:
 	sub	w1, w1, #1
 	sub	w1, w1, w12
 	mul	w3, w1, w3
 	lsr	w3, w3, 2
 	add	x3, x0, x3
-.LVL428:
-.L432:
-	.loc 1 974 0
-	cbz	w11, .L433
+.LVL432:
+.L436:
+	.loc 1 976 0
+	cbz	w11, .L437
 	add	x3, x3, 4
-.LVL429:
+.LVL433:
 	mov	x5, 0
 	.p2align 2
-.L456:
-	.loc 1 975 0
+.L460:
+	.loc 1 977 0
 	ldr	x1, [x8, x5, lsl 3]
-.LVL430:
-	.loc 1 976 0
+.LVL434:
+	.loc 1 978 0
 	ldr	x2, [x9, x5, lsl 3]
-.LVL431:
-	.loc 1 977 0
+.LVL435:
+	.loc 1 979 0
 	cmp	x1, x2
-	beq	.L434
-	.loc 1 978 0
+	beq	.L438
+	.loc 1 980 0
 	and	w17, w2, 65535
 	and	w6, w1, 65535
-.LVL432:
-.LBB1337:
-.LBB1338:
-	.loc 1 140 0
+.LVL436:
+.LBB1335:
+.LBB1336:
+	.loc 1 142 0
 	mov	w4, 0
-	.loc 1 139 0
+	.loc 1 141 0
 	cmp	w17, w6
-	beq	.L435
-	.loc 1 137 0
+	beq	.L439
+	.loc 1 139 0
 	eor	w18, w17, w6
-.LVL433:
-	.loc 1 150 0
+.LVL437:
+	.loc 1 152 0
 	ubfiz	w19, w17, 8, 8
-	.loc 1 151 0
+	.loc 1 153 0
 	and	w17, w17, 65280
-	.loc 1 150 0
+	.loc 1 152 0
 	add	w19, w19, w6, uxtb
-	.loc 1 136 0
+	.loc 1 138 0
 	tst	x18, 15
-	.loc 1 151 0
+	.loc 1 153 0
 	add	w6, w17, w6, lsr 8
-	.loc 1 136 0
+	.loc 1 138 0
 	csel	w4, w10, wzr, ne
-	.loc 1 144 0
+	.loc 1 146 0
 	tst	w18, 240
 	orr	w17, w4, 12
-	.loc 1 150 0
+	.loc 1 152 0
 	ldrb	w19, [x7, w19, sxtw]
-	.loc 1 144 0
-	csel	w4, w17, w4, ne
 	.loc 1 146 0
+	csel	w4, w17, w4, ne
+	.loc 1 148 0
 	tst	w18, 3840
 	orr	w17, w4, 48
-	.loc 1 151 0
+	.loc 1 153 0
 	ldrb	w6, [x7, w6, sxtw]
-	.loc 1 146 0
-	csel	w4, w17, w4, ne
 	.loc 1 148 0
+	csel	w4, w17, w4, ne
+	.loc 1 150 0
 	tst	w18, 61440
 	orr	w17, w4, -64
 	and	w17, w17, 255
-	.loc 1 150 0
+	.loc 1 152 0
 	orr	w6, w19, w6, lsl 4
-	.loc 1 148 0
-	csel	w4, w17, w4, ne
 	.loc 1 150 0
+	csel	w4, w17, w4, ne
+	.loc 1 152 0
 	and	w4, w6, w4
 	and	w4, w4, 255
-.LVL434:
-.L435:
-.LBE1338:
-.LBE1337:
-	.loc 1 978 0
+.LVL438:
+.L439:
+.LBE1336:
+.LBE1335:
+	.loc 1 980 0
 	strb	w4, [x3, -4]
-	.loc 1 979 0
+	.loc 1 981 0
 	lsr	w17, w2, 16
 	lsr	w6, w1, 16
-.LBB1339:
-.LBB1340:
-	.loc 1 140 0
+.LBB1337:
+.LBB1338:
+	.loc 1 142 0
 	mov	w4, 0
-	.loc 1 139 0
+	.loc 1 141 0
 	cmp	w17, w6
-	beq	.L440
-	.loc 1 137 0
+	beq	.L444
+	.loc 1 139 0
 	eor	w18, w17, w6
-.LVL435:
-	.loc 1 150 0
+.LVL439:
+	.loc 1 152 0
 	ubfiz	w19, w17, 8, 8
-	.loc 1 151 0
+	.loc 1 153 0
 	and	w17, w17, 65280
-	.loc 1 150 0
+	.loc 1 152 0
 	add	w19, w19, w6, uxtb
-	.loc 1 136 0
+	.loc 1 138 0
 	tst	x18, 15
-	.loc 1 151 0
+	.loc 1 153 0
 	add	w6, w17, w6, lsr 8
-	.loc 1 136 0
+	.loc 1 138 0
 	csel	w4, w10, wzr, ne
-	.loc 1 144 0
+	.loc 1 146 0
 	tst	w18, 240
 	orr	w17, w4, 12
-	.loc 1 150 0
+	.loc 1 152 0
 	ldrb	w19, [x7, w19, sxtw]
-	.loc 1 144 0
-	csel	w4, w17, w4, ne
 	.loc 1 146 0
+	csel	w4, w17, w4, ne
+	.loc 1 148 0
 	tst	w18, 3840
 	orr	w17, w4, 48
-	.loc 1 151 0
+	.loc 1 153 0
 	ldrb	w6, [x7, w6, sxtw]
-	.loc 1 146 0
-	csel	w4, w17, w4, ne
 	.loc 1 148 0
+	csel	w4, w17, w4, ne
+	.loc 1 150 0
 	tst	w18, 61440
 	orr	w17, w4, -64
 	and	w17, w17, 255
-	.loc 1 150 0
+	.loc 1 152 0
 	orr	w6, w19, w6, lsl 4
-	.loc 1 148 0
-	csel	w4, w17, w4, ne
 	.loc 1 150 0
+	csel	w4, w17, w4, ne
+	.loc 1 152 0
 	and	w4, w6, w4
 	and	w4, w4, 255
-.LVL436:
-.L440:
-.LBE1340:
-.LBE1339:
-	.loc 1 979 0
+.LVL440:
+.L444:
+.LBE1338:
+.LBE1337:
+	.loc 1 981 0
 	strb	w4, [x3, -3]
-	.loc 1 980 0
+	.loc 1 982 0
 	ubfx	x17, x2, 32, 16
 	ubfx	x6, x1, 32, 16
-.LBB1341:
-.LBB1342:
-	.loc 1 140 0
+.LBB1339:
+.LBB1340:
+	.loc 1 142 0
 	mov	w4, 0
-	.loc 1 139 0
+	.loc 1 141 0
 	cmp	w17, w6
-	beq	.L445
-	.loc 1 137 0
+	beq	.L449
+	.loc 1 139 0
 	eor	w18, w17, w6
-.LVL437:
-	.loc 1 150 0
+.LVL441:
+	.loc 1 152 0
 	ubfiz	w19, w17, 8, 8
-	.loc 1 151 0
+	.loc 1 153 0
 	and	w17, w17, 65280
-	.loc 1 150 0
+	.loc 1 152 0
 	add	w19, w19, w6, uxtb
-	.loc 1 136 0
+	.loc 1 138 0
 	tst	x18, 15
-	.loc 1 151 0
+	.loc 1 153 0
 	add	w6, w17, w6, lsr 8
-	.loc 1 136 0
+	.loc 1 138 0
 	csel	w4, w10, wzr, ne
-	.loc 1 144 0
+	.loc 1 146 0
 	tst	w18, 240
 	orr	w17, w4, 12
-	.loc 1 150 0
+	.loc 1 152 0
 	ldrb	w19, [x7, w19, sxtw]
-	.loc 1 144 0
-	csel	w4, w17, w4, ne
 	.loc 1 146 0
+	csel	w4, w17, w4, ne
+	.loc 1 148 0
 	tst	w18, 3840
 	orr	w17, w4, 48
-	.loc 1 151 0
+	.loc 1 153 0
 	ldrb	w6, [x7, w6, sxtw]
-	.loc 1 146 0
-	csel	w4, w17, w4, ne
 	.loc 1 148 0
+	csel	w4, w17, w4, ne
+	.loc 1 150 0
 	tst	w18, 61440
 	orr	w17, w4, -64
 	and	w17, w17, 255
-	.loc 1 150 0
+	.loc 1 152 0
 	orr	w6, w19, w6, lsl 4
-	.loc 1 148 0
-	csel	w4, w17, w4, ne
 	.loc 1 150 0
+	csel	w4, w17, w4, ne
+	.loc 1 152 0
 	and	w4, w6, w4
 	and	w4, w4, 255
-.LVL438:
-.L445:
-.LBE1342:
-.LBE1341:
-	.loc 1 980 0
+.LVL442:
+.L449:
+.LBE1340:
+.LBE1339:
+	.loc 1 982 0
 	strb	w4, [x3, -2]
-	.loc 1 981 0
+	.loc 1 983 0
 	lsr	x2, x2, 48
-.LVL439:
+.LVL443:
 	lsr	x1, x1, 48
-.LVL440:
-.LBB1343:
-.LBB1336:
-	.loc 1 140 0
+.LVL444:
+.LBB1341:
+.LBB1334:
+	.loc 1 142 0
 	mov	w4, 0
-	.loc 1 139 0
+	.loc 1 141 0
 	cmp	w2, w1
-	beq	.L450
-	.loc 1 137 0
+	beq	.L454
+	.loc 1 139 0
 	eor	w6, w2, w1
-.LVL441:
-	.loc 1 150 0
+.LVL445:
+	.loc 1 152 0
 	ubfiz	w4, w2, 8, 8
-	.loc 1 151 0
+	.loc 1 153 0
 	and	w2, w2, 65280
-	.loc 1 150 0
+	.loc 1 152 0
 	add	w4, w4, w1, uxtb
-	.loc 1 136 0
+	.loc 1 138 0
 	tst	x6, 15
-	.loc 1 151 0
+	.loc 1 153 0
 	add	w1, w2, w1, lsr 8
-	.loc 1 136 0
+	.loc 1 138 0
 	csel	w2, w10, wzr, ne
-	.loc 1 144 0
+	.loc 1 146 0
 	tst	w6, 240
 	orr	w18, w2, 12
-.LVL442:
-	.loc 1 150 0
+.LVL446:
+	.loc 1 152 0
 	ldrb	w17, [x7, w4, sxtw]
-	.loc 1 144 0
-	csel	w2, w18, w2, ne
 	.loc 1 146 0
+	csel	w2, w18, w2, ne
+	.loc 1 148 0
 	tst	w6, 3840
 	orr	w18, w2, 48
-	.loc 1 151 0
+	.loc 1 153 0
 	ldrb	w4, [x7, w1, sxtw]
-	.loc 1 146 0
-	csel	w2, w18, w2, ne
 	.loc 1 148 0
+	csel	w2, w18, w2, ne
+	.loc 1 150 0
 	tst	w6, 61440
 	orr	w1, w2, -64
 	and	w1, w1, 255
-	.loc 1 150 0
+	.loc 1 152 0
 	orr	w4, w17, w4, lsl 4
-	.loc 1 148 0
-	csel	w2, w1, w2, ne
 	.loc 1 150 0
+	csel	w2, w1, w2, ne
+	.loc 1 152 0
 	and	w2, w4, w2
 	and	w4, w2, 255
-.LVL443:
-.L450:
-.LBE1336:
-.LBE1343:
-	.loc 1 981 0
+.LVL447:
+.L454:
+.LBE1334:
+.LBE1341:
+	.loc 1 983 0
 	strb	w4, [x3, -1]
-.LVL444:
-.L455:
+.LVL448:
+.L459:
 	add	x5, x5, 1
 	add	x3, x3, 4
-	.loc 1 974 0
+	.loc 1 976 0
 	cmp	w11, w5
-	bgt	.L456
+	bgt	.L460
 	add	x8, x8, x13
 	add	x9, x9, x13
-.LVL445:
-.L433:
-	.loc 1 968 0
+.LVL449:
+.L437:
+	.loc 1 970 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L427
+	beq	.L431
 	ldr	w3, [x14, 84]
-.LVL446:
-	.loc 1 969 0
-	cbnz	w16, .L533
-.L431:
-	.loc 1 972 0
+.LVL450:
+	.loc 1 971 0
+	cbnz	w16, .L537
+.L435:
+	.loc 1 974 0
 	mul	w3, w12, w3
 	lsr	w3, w3, 2
 	add	x3, x0, x3
-.LVL447:
-	b	.L432
-.LVL448:
+.LVL451:
+	b	.L436
+.LVL452:
 	.p2align 3
-.L434:
-	.loc 1 984 0
+.L438:
+	.loc 1 986 0
 	str	wzr, [x3, -4]
-	b	.L455
-.LBE1344:
-.LBE1345:
-.LBE1370:
+	b	.L459
+.LBE1342:
+.LBE1343:
+.LBE1368:
 	.cfi_endproc
 .LFE2818:
 	.size	direct_mode_data_change_part, .-direct_mode_data_change_part
@@ -5237,74 +5292,74 @@ direct_mode_data_change_part:
 	.p2align 3,,7
 	.type	flip.isra.7, %function
 flip.isra.7:
-.LFB2861:
-	.loc 1 1001 0
+.LFB2863:
+	.loc 1 1003 0
 	.cfi_startproc
-.LVL449:
+.LVL453:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 1005 0
+	.loc 1 1007 0
 	sxtw	x2, w1
-	.loc 1 1001 0
+	.loc 1 1003 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 1001 0
-	mov	x20, x0
 	.loc 1 1003 0
-	ldr	w19, [x0, 72]
+	mov	x20, x0
 	.loc 1 1005 0
+	ldr	w19, [x0, 72]
+	.loc 1 1007 0
 	ldr	x0, [x0]
-.LVL450:
+.LVL454:
+.LBB1369:
+.LBB1370:
 .LBB1371:
 .LBB1372:
-.LBB1373:
-.LBB1374:
 	.file 10 "./include/linux/dma-mapping.h"
 	.loc 10 266 0
-	cbz	x0, .L537
+	cbz	x0, .L541
 	ldr	x3, [x0, 648]
 	.loc 10 268 0
 	adrp	x4, dummy_dma_ops
 	add	x4, x4, :lo12:dummy_dma_ops
 	cmp	x3, 0
 	csel	x3, x4, x3, eq
-.L535:
-.LBE1374:
-.LBE1373:
+.L539:
+.LBE1372:
+.LBE1371:
 	.loc 10 434 0
 	ldr	x5, [x3, 88]
 	sxtw	x19, w19
-	cbz	x5, .L536
-.LBE1372:
-.LBE1371:
-	.loc 1 1005 0
+	cbz	x5, .L540
+.LBE1370:
+.LBE1369:
+	.loc 1 1007 0
 	add	x4, x19, x19, lsl 1
-.LBB1380:
-.LBB1377:
+.LBB1378:
+.LBB1375:
 	.loc 10 435 0
 	mov	w3, 1
-.LBE1377:
-.LBE1380:
-	.loc 1 1005 0
+.LBE1375:
+.LBE1378:
+	.loc 1 1007 0
 	add	x4, x20, x4, lsl 3
-.LBB1381:
-.LBB1378:
+.LBB1379:
+.LBB1376:
 	.loc 10 435 0
 	ldr	x1, [x4, 32]
 	blr	x5
-.LVL451:
-.L536:
-.LBE1378:
-.LBE1381:
-	.loc 1 1006 0
+.LVL455:
+.L540:
+.LBE1376:
+.LBE1379:
+	.loc 1 1008 0
 	ldr	x5, [x20, 8]
-.LBB1382:
-.LBB1383:
+.LBB1380:
+.LBB1381:
 	.file 11 "drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.h"
 	.loc 11 57 0
 	mov	w4, 0
@@ -5312,58 +5367,58 @@ flip.isra.7:
 	mov	w2, 0
 	mov	x0, x5
 	mov	w1, 0
-.LBE1383:
-.LBE1382:
-	.loc 1 1007 0
+.LBE1381:
+.LBE1380:
+	.loc 1 1009 0
 	add	x19, x19, x19, lsl 1
-.LBB1386:
 .LBB1384:
+.LBB1382:
 	.loc 11 57 0
 	ldr	x5, [x5, 64]
+.LBE1382:
 .LBE1384:
-.LBE1386:
-	.loc 1 1007 0
+	.loc 1 1009 0
 	add	x19, x20, x19, lsl 3
-.LBB1387:
 .LBB1385:
+.LBB1383:
 	.loc 11 57 0
 	blr	x5
-.LVL452:
+.LVL456:
+.LBE1383:
 .LBE1385:
-.LBE1387:
-	.loc 1 1007 0
+	.loc 1 1009 0
 	ldr	x1, [x20, 8]
-.LBB1388:
-.LBB1389:
+.LBB1386:
+.LBB1387:
 	.loc 11 62 0
 	mov	w2, 0
 	mov	x0, x1
 	ldr	x3, [x1, 72]
 	ldr	w1, [x19, 32]
 	blr	x3
-.LVL453:
-.LBE1389:
-.LBE1388:
-	.loc 1 1008 0
+.LVL457:
+.LBE1387:
+.LBE1386:
+	.loc 1 1010 0
 	ldr	x2, [x20, 8]
-.LBB1390:
-.LBB1391:
+.LBB1388:
+.LBB1389:
 	.loc 11 77 0
 	mov	w1, 1
 	mov	x0, x2
 	ldr	x2, [x2, 96]
 	blr	x2
-.LVL454:
-.LBE1391:
-.LBE1390:
-	.loc 1 1009 0
+.LVL458:
+.LBE1389:
+.LBE1388:
+	.loc 1 1011 0
 	ldr	w1, [x20, 72]
 	mov	w0, 1
 	sub	w0, w0, w1
 	str	w0, [x20, 72]
-	.loc 1 1010 0
+	.loc 1 1012 0
 	ldp	x19, x20, [sp, 16]
-.LVL455:
+.LVL459:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -5372,33 +5427,33 @@ flip.isra.7:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL456:
+.LVL460:
 	.p2align 3
-.L537:
+.L541:
 	.cfi_restore_state
-.LBB1392:
-.LBB1379:
-.LBB1376:
-.LBB1375:
+.LBB1390:
+.LBB1377:
+.LBB1374:
+.LBB1373:
 	.loc 10 268 0
 	adrp	x3, dummy_dma_ops
 	add	x3, x3, :lo12:dummy_dma_ops
-	b	.L535
-.LBE1375:
-.LBE1376:
-.LBE1379:
-.LBE1392:
+	b	.L539
+.LBE1373:
+.LBE1374:
+.LBE1377:
+.LBE1390:
 	.cfi_endproc
-.LFE2861:
+.LFE2863:
 	.size	flip.isra.7, .-flip.isra.7
 	.align	2
 	.p2align 3,,7
 	.type	ebc_frame_start, %function
 ebc_frame_start:
 .LFB2821:
-	.loc 1 1019 0
+	.loc 1 1021 0
 	.cfi_startproc
-.LVL457:
+.LVL461:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
@@ -5408,68 +5463,68 @@ ebc_frame_start:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 1021 0
+	.loc 1 1023 0
 	add	x19, x0, 184
-	.loc 1 1019 0
+	.loc 1 1021 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 1019 0
+	.loc 1 1021 0
 	mov	x20, x0
-	.loc 1 1020 0
+	.loc 1 1022 0
 	add	x21, x0, 24
-	.loc 1 1023 0
-	ldr	x1, [x19, 208]
+	.loc 1 1025 0
+	ldr	x1, [x19, 224]
 	ldr	w0, [x1, 40]
-.LVL458:
+.LVL462:
 	cmp	w0, 1
-	beq	.L544
-	ble	.L553
+	beq	.L548
+	ble	.L557
 	sub	w0, w0, #7
 	cmp	w0, 9
-	bhi	.L543
+	bhi	.L547
+	.loc 1 1075 0
+	ldr	x2, [x19, 216]
 	.loc 1 1073 0
-	ldr	x2, [x19, 200]
-	.loc 1 1071 0
 	mov	x3, x19
-	.loc 1 1070 0
-	ldrb	w0, [x19, 32]
-	str	w0, [x19, 40]
-	.loc 1 1071 0
-	ldr	x0, [x19, 168]
+	.loc 1 1072 0
+	ldrb	w0, [x19, 48]
+	str	w0, [x19, 56]
+	.loc 1 1073 0
+	ldr	x0, [x19, 184]
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change_part
-.LVL459:
-.LBB1393:
-.LBB1394:
-	.loc 1 1014 0
+.LVL463:
+.LBB1391:
+.LBB1392:
+	.loc 1 1016 0
 	str	wzr, [x21, 72]
-	.loc 1 1015 0
+	.loc 1 1017 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
-.LVL460:
-.LBE1394:
-.LBE1393:
-	.loc 1 1076 0
-	ldr	w0, [x19, 40]
-	.loc 1 1077 0
+.LVL464:
+.LBE1392:
+.LBE1391:
+	.loc 1 1078 0
+	ldr	w0, [x19, 56]
+	.loc 1 1079 0
 	mov	x3, x19
+	.loc 1 1080 0
+	ldp	x2, x1, [x19, 216]
 	.loc 1 1078 0
-	ldp	x2, x1, [x19, 200]
-	.loc 1 1076 0
 	sub	w0, w0, #1
-	str	w0, [x19, 40]
-	.loc 1 1077 0
-	ldr	x0, [x19, 176]
+	str	w0, [x19, 56]
+	.loc 1 1079 0
+	ldr	x0, [x19, 192]
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part
-.LVL461:
-	.loc 1 1098 0
+.LVL465:
+	.loc 1 1100 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL462:
+.LVL466:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 30
@@ -5479,44 +5534,44 @@ ebc_frame_start:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL463:
+.LVL467:
 	.p2align 3
-.L553:
+.L557:
 	.cfi_restore_state
-	.loc 1 1023 0
-	cbnz	w0, .L543
-	.loc 1 1043 0
-	ldr	x0, [x19, 168]
+	.loc 1 1025 0
+	cbnz	w0, .L547
+	.loc 1 1045 0
+	ldr	x0, [x19, 184]
 	mov	x4, x19
-	ldp	x1, x2, [x19, 128]
-	ldr	x3, [x19, 152]
+	ldp	x1, x2, [x19, 144]
+	ldr	x3, [x19, 168]
 	bl	get_auto_image
-.LVL464:
-	.loc 1 1048 0
-	ldr	w0, [x19, 36]
-	cbz	w0, .L550
-.LBB1395:
-.LBB1396:
-	.loc 1 1014 0
+.LVL468:
+	.loc 1 1050 0
+	ldr	w0, [x19, 52]
+	cbz	w0, .L554
+.LBB1393:
+.LBB1394:
+	.loc 1 1016 0
 	str	wzr, [x21, 72]
-	.loc 1 1015 0
+	.loc 1 1017 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
-.LVL465:
-.LBE1396:
-.LBE1395:
-	.loc 1 1050 0
-	ldp	x1, x2, [x19, 128]
+.LVL469:
+.LBE1394:
+.LBE1393:
+	.loc 1 1052 0
+	ldp	x1, x2, [x19, 144]
 	mov	x4, x19
-	ldr	x3, [x19, 152]
-	ldr	x0, [x19, 176]
+	ldr	x3, [x19, 168]
+	ldr	x0, [x19, 192]
 	bl	get_auto_image
-.LVL466:
-	.loc 1 1098 0
+.LVL470:
+	.loc 1 1100 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL467:
+.LVL471:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -5526,42 +5581,42 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL468:
+.LVL472:
 	.p2align 3
-.L544:
+.L548:
 	.cfi_restore_state
-	.loc 1 1025 0
-	ldr	x0, [x19, 168]
+	.loc 1 1027 0
+	ldr	x0, [x19, 184]
 	mov	x4, x19
-	ldp	x1, x2, [x19, 128]
-	ldr	x3, [x19, 152]
+	ldp	x1, x2, [x19, 144]
+	ldr	x3, [x19, 168]
 	bl	get_overlay_image
-.LVL469:
-	.loc 1 1030 0
-	ldr	w0, [x19, 36]
-	cbz	w0, .L548
-.LBB1397:
-.LBB1398:
-	.loc 1 1014 0
+.LVL473:
+	.loc 1 1032 0
+	ldr	w0, [x19, 52]
+	cbz	w0, .L552
+.LBB1395:
+.LBB1396:
+	.loc 1 1016 0
 	str	wzr, [x21, 72]
-	.loc 1 1015 0
+	.loc 1 1017 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
-.LVL470:
-.LBE1398:
-.LBE1397:
-	.loc 1 1032 0
-	ldp	x1, x2, [x19, 128]
+.LVL474:
+.LBE1396:
+.LBE1395:
+	.loc 1 1034 0
+	ldp	x1, x2, [x19, 144]
 	mov	x4, x19
-	ldr	x3, [x19, 152]
-	ldr	x0, [x19, 176]
+	ldr	x3, [x19, 168]
+	ldr	x0, [x19, 192]
 	bl	get_overlay_image
-.LVL471:
-	.loc 1 1098 0
+.LVL475:
+	.loc 1 1100 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL472:
+.LVL476:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -5571,53 +5626,53 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL473:
+.LVL477:
 	.p2align 3
-.L543:
+.L547:
 	.cfi_restore_state
+	.loc 1 1088 0
+	ldr	x2, [x19, 216]
 	.loc 1 1086 0
-	ldr	x2, [x19, 200]
-	.loc 1 1084 0
 	mov	x3, x19
-	.loc 1 1083 0
-	ldrb	w0, [x19, 32]
-	str	w0, [x19, 40]
-	.loc 1 1084 0
-	ldr	x0, [x19, 168]
+	.loc 1 1085 0
+	ldrb	w0, [x19, 48]
+	str	w0, [x19, 56]
+	.loc 1 1086 0
+	ldr	x0, [x19, 184]
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change
-.LVL474:
-.LBB1399:
-.LBB1400:
-	.loc 1 1014 0
+.LVL478:
+.LBB1397:
+.LBB1398:
+	.loc 1 1016 0
 	str	wzr, [x21, 72]
-	.loc 1 1015 0
+	.loc 1 1017 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
-.LVL475:
-.LBE1400:
-.LBE1399:
-	.loc 1 1089 0
-	ldr	w0, [x19, 40]
-	.loc 1 1090 0
+.LVL479:
+.LBE1398:
+.LBE1397:
+	.loc 1 1091 0
+	ldr	w0, [x19, 56]
+	.loc 1 1092 0
 	mov	x3, x19
+	.loc 1 1093 0
+	ldp	x2, x1, [x19, 216]
 	.loc 1 1091 0
-	ldp	x2, x1, [x19, 200]
-	.loc 1 1089 0
 	sub	w0, w0, #1
-	str	w0, [x19, 40]
-	.loc 1 1090 0
-	ldr	x0, [x19, 176]
+	str	w0, [x19, 56]
+	.loc 1 1092 0
+	ldr	x0, [x19, 192]
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
-.LVL476:
-	.loc 1 1098 0
+.LVL480:
+	.loc 1 1100 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL477:
+.LVL481:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -5627,23 +5682,23 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL478:
+.LVL482:
 	.p2align 3
-.L548:
+.L552:
 	.cfi_restore_state
-	.loc 1 1038 0
-	ldr	x0, [x19, 88]
+	.loc 1 1040 0
+	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	adrp	x1, .LC20
 	add	x2, x2, :lo12:.LANCHOR3
 	add	x1, x1, :lo12:.LC20
 	bl	_dev_info
-.LVL479:
-	.loc 1 1039 0
-	str	wzr, [x19, 28]
-	.loc 1 1098 0
+.LVL483:
+	.loc 1 1041 0
+	str	wzr, [x19, 44]
+	.loc 1 1100 0
 	ldp	x19, x20, [sp, 16]
-.LVL480:
+.LVL484:
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -5654,23 +5709,23 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL481:
+.LVL485:
 	.p2align 3
-.L550:
+.L554:
 	.cfi_restore_state
-	.loc 1 1056 0
-	ldr	x0, [x19, 88]
+	.loc 1 1058 0
+	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	adrp	x1, .LC21
 	add	x2, x2, :lo12:.LANCHOR3
 	add	x1, x1, :lo12:.LC21
 	bl	_dev_info
-.LVL482:
-	.loc 1 1057 0
-	str	wzr, [x19, 28]
-	.loc 1 1098 0
+.LVL486:
+	.loc 1 1059 0
+	str	wzr, [x19, 44]
+	.loc 1 1100 0
 	ldp	x19, x20, [sp, 16]
-.LVL483:
+.LVL487:
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	.cfi_restore 20
@@ -5688,18 +5743,18 @@ ebc_frame_start:
 	.type	ebc_auto_tast_function, %function
 ebc_auto_tast_function:
 .LFB2822:
-	.loc 1 1101 0
+	.loc 1 1103 0
 	.cfi_startproc
-.LVL484:
+.LVL488:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
 	.cfi_offset 30, -88
-	.loc 1 1102 0
+	.loc 1 1104 0
 	adrp	x1, .LANCHOR0
-	.loc 1 1101 0
+	.loc 1 1103 0
 	adrp	x0, __stack_chk_guard
-.LVL485:
+.LVL489:
 	add	x0, x0, :lo12:__stack_chk_guard
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -5708,238 +5763,238 @@ ebc_auto_tast_function:
 	.cfi_offset 20, -72
 	adrp	x20, .LANCHOR1
 	stp	x21, x22, [sp, 32]
-	.loc 1 1107 0
+	.loc 1 1109 0
 	add	x20, x20, :lo12:.LANCHOR1
 	.cfi_offset 21, -64
 	.cfi_offset 22, -56
-	.loc 1 1102 0
+	.loc 1 1104 0
 	ldr	x22, [x1, #:lo12:.LANCHOR0]
-.LVL486:
-	.loc 1 1107 0
+.LVL490:
+	.loc 1 1109 0
 	add	x20, x20, 376
-	.loc 1 1101 0
+	.loc 1 1103 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
+.LBB1399:
+.LBB1400:
 .LBB1401:
-.LBB1402:
-.LBB1403:
 	.file 12 "./include/linux/compiler.h"
 	.loc 12 288 0
 	mov	x24, 2
-.LBE1403:
-.LBE1402:
 .LBE1401:
-	.loc 1 1101 0
+.LBE1400:
+.LBE1399:
+	.loc 1 1103 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -32
 	.cfi_offset 26, -24
-	.loc 1 1103 0
+	.loc 1 1105 0
 	add	x21, x22, 24
-	.loc 1 1104 0
+	.loc 1 1106 0
 	add	x19, x22, 184
-	add	x26, x22, 728
-	.loc 1 1101 0
+	add	x26, x22, 744
+	.loc 1 1103 0
 	ldr	x1, [x0]
 	str	x1, [x29, 88]
 	mov	x1,0
 	adrp	x25, system_wq
-.LBB1408:
-.LBB1405:
 .LBB1406:
+.LBB1403:
+.LBB1404:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x23, sp_el0
 // 0 "" 2
-.LVL487:
+.LVL491:
 #NO_APP
-	b	.L565
+	b	.L569
 	.p2align 3
-.L582:
+.L586:
+.LBE1404:
+.LBE1403:
 .LBE1406:
-.LBE1405:
-.LBE1408:
-	.loc 1 1112 0
-	cbnz	w0, .L555
-	.loc 1 1122 0
+	.loc 1 1114 0
+	cbnz	w0, .L559
+	.loc 1 1124 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
 	bl	flip.isra.7
-.LVL488:
-	.loc 1 1123 0
+.LVL492:
+	.loc 1 1125 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
-	ldp	x1, x2, [x19, 128]
+	ldp	x1, x2, [x19, 144]
 	add	x0, x19, x0, lsl 3
-	ldr	x3, [x19, 152]
-	ldr	x0, [x0, 168]
+	ldr	x3, [x19, 168]
+	ldr	x0, [x0, 184]
 	bl	get_auto_image
-.LVL489:
-.L560:
-	.loc 1 1161 0
-	ldr	x0, [x19, 208]
+.LVL493:
+.L564:
+	.loc 1 1163 0
+	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
-	cbz	w0, .L563
-.L583:
-	.loc 1 1162 0
+	cbz	w0, .L567
+.L587:
+	.loc 1 1164 0
 	cmp	w0, 1
-	beq	.L581
-.L564:
-	.loc 1 1165 0
+	beq	.L585
+.L568:
+	.loc 1 1167 0
 	mov	x0, x20
 	bl	up
-.LVL490:
-	.loc 1 1166 0
+.LVL494:
+	.loc 1 1168 0
 	bl	schedule
-.LVL491:
-.L565:
-	.loc 1 1107 0
+.LVL495:
+.L569:
+	.loc 1 1109 0
 	mov	x0, x20
 	bl	down
-.LVL492:
-.LBB1409:
+.LVL496:
 .LBB1407:
-.LBB1404:
+.LBB1405:
+.LBB1402:
 	.loc 12 288 0
 	str	x24, [x23, 32]
-.LBE1404:
+.LBE1402:
+.LBE1405:
 .LBE1407:
-.LBE1409:
-	.loc 1 1111 0
+	.loc 1 1113 0
 #APP
-// 1111 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
+// 1113 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
 	dmb ish
 // 0 "" 2
-	.loc 1 1112 0
+	.loc 1 1114 0
 #NO_APP
-	ldr	x0, [x19, 208]
+	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
-	beq	.L556
-	ble	.L582
+	beq	.L560
+	ble	.L586
 	sub	w0, w0, #7
 	cmp	w0, 9
-	bhi	.L555
-	.loc 1 1139 0
-	ldr	w1, [x19, 40]
-	.loc 1 1140 0
+	bhi	.L559
+	.loc 1 1141 0
+	ldr	w1, [x19, 56]
+	.loc 1 1142 0
 	mov	x0, x21
-	.loc 1 1139 0
+	.loc 1 1141 0
 	sub	w1, w1, #1
-	str	w1, [x19, 40]
-	.loc 1 1140 0
+	str	w1, [x19, 56]
+	.loc 1 1142 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.7
-.LVL493:
-	.loc 1 1141 0
-	ldr	w0, [x19, 40]
-	cbz	w0, .L560
+.LVL497:
 	.loc 1 1143 0
+	ldr	w0, [x19, 56]
+	cbz	w0, .L564
+	.loc 1 1145 0
 	ldrsw	x0, [x21, 72]
 	mov	x3, x19
-	.loc 1 1144 0
-	ldp	x2, x1, [x19, 200]
-	.loc 1 1143 0
+	.loc 1 1146 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1145 0
 	add	x0, x19, x0, lsl 3
 	ldr	x1, [x1, 16]
-	ldr	x0, [x0, 168]
+	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part
-.LVL494:
-	.loc 1 1161 0
-	ldr	x0, [x19, 208]
+.LVL498:
+	.loc 1 1163 0
+	ldr	x0, [x19, 224]
 	ldr	w0, [x0, 40]
-	cbnz	w0, .L583
+	cbnz	w0, .L587
 	.p2align 2
-.L563:
+.L567:
+.LBB1408:
+.LBB1409:
 .LBB1410:
 .LBB1411:
-.LBB1412:
-.LBB1413:
 	.file 13 "./include/linux/workqueue.h"
 	.loc 13 518 0
 	ldr	x1, [x25, #:lo12:system_wq]
 	mov	x2, x26
 	mov	w0, 8
 	bl	queue_work_on
-.LVL495:
-	b	.L564
+.LVL499:
+	b	.L568
 	.p2align 3
-.L555:
-.LBE1413:
-.LBE1412:
+.L559:
 .LBE1411:
 .LBE1410:
-	.loc 1 1149 0
-	ldr	w1, [x19, 40]
-	.loc 1 1150 0
+.LBE1409:
+.LBE1408:
+	.loc 1 1151 0
+	ldr	w1, [x19, 56]
+	.loc 1 1152 0
 	mov	x0, x21
-	.loc 1 1149 0
+	.loc 1 1151 0
 	sub	w1, w1, #1
-	str	w1, [x19, 40]
-	.loc 1 1150 0
+	str	w1, [x19, 56]
+	.loc 1 1152 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.7
-.LVL496:
-	.loc 1 1151 0
-	ldr	w0, [x19, 40]
-	cbz	w0, .L560
+.LVL500:
 	.loc 1 1153 0
+	ldr	w0, [x19, 56]
+	cbz	w0, .L564
+	.loc 1 1155 0
 	ldrsw	x0, [x21, 72]
 	mov	x3, x19
-	.loc 1 1154 0
-	ldp	x2, x1, [x19, 200]
-	.loc 1 1153 0
+	.loc 1 1156 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1155 0
 	add	x0, x19, x0, lsl 3
 	ldr	x1, [x1, 16]
-	ldr	x0, [x0, 168]
+	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
-.LVL497:
-	.loc 1 1157 0
-	b	.L560
+.LVL501:
+	.loc 1 1159 0
+	b	.L564
 	.p2align 3
-.L556:
-	.loc 1 1114 0
+.L560:
+	.loc 1 1116 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
 	bl	flip.isra.7
-.LVL498:
-	.loc 1 1115 0
+.LVL502:
+	.loc 1 1117 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
-	ldp	x1, x2, [x19, 128]
+	ldp	x1, x2, [x19, 144]
 	add	x0, x19, x0, lsl 3
-	ldr	x3, [x19, 152]
-	ldr	x0, [x0, 168]
+	ldr	x3, [x19, 168]
+	ldr	x0, [x0, 184]
 	bl	get_overlay_image
-.LVL499:
-	.loc 1 1120 0
-	b	.L560
+.LVL503:
+	.loc 1 1122 0
+	b	.L564
 	.p2align 3
-.L581:
-	.loc 1 1162 0 discriminator 1
-	ldr	w0, [x19, 604]
-	cbz	w0, .L564
-	.loc 1 1162 0 is_stmt 0 discriminator 2
-	ldr	w0, [x19, 608]
-	cbz	w0, .L564
-.LBB1417:
-.LBB1416:
+.L585:
+	.loc 1 1164 0 discriminator 1
+	ldr	w0, [x19, 620]
+	cbz	w0, .L568
+	.loc 1 1164 0 is_stmt 0 discriminator 2
+	ldr	w0, [x19, 624]
+	cbz	w0, .L568
 .LBB1415:
 .LBB1414:
+.LBB1413:
+.LBB1412:
 	.loc 13 518 0 is_stmt 1
 	ldr	x1, [x25, #:lo12:system_wq]
 	mov	x2, x26
 	mov	w0, 8
 	bl	queue_work_on
-.LVL500:
-	b	.L564
+.LVL504:
+	b	.L568
+.LBE1412:
+.LBE1413:
 .LBE1414:
 .LBE1415:
-.LBE1416:
-.LBE1417:
 	.cfi_endproc
 .LFE2822:
 	.size	ebc_auto_tast_function, .-ebc_auto_tast_function
@@ -5947,10 +6002,10 @@ ebc_auto_tast_function:
 	.p2align 3,,7
 	.type	ebc_power_set.part.8, %function
 ebc_power_set.part.8:
-.LFB2862:
-	.loc 1 180 0
+.LFB2864:
+	.loc 1 182 0
 	.cfi_startproc
-.LVL501:
+.LVL505:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -5960,47 +6015,47 @@ ebc_power_set.part.8:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-	.loc 1 180 0
+	.loc 1 182 0
 	mov	x19, x0
-	.loc 1 197 0
-	str	w1, [x0, 368]
-	.loc 1 198 0
+	.loc 1 199 0
+	str	w1, [x0, 384]
+	.loc 1 200 0
 	ldr	x1, [x0, 8]
-.LVL502:
-.LBB1418:
-.LBB1419:
+.LVL506:
+.LBB1416:
+.LBB1417:
 	.loc 11 51 0
 	mov	x0, x1
-.LVL503:
+.LVL507:
 	ldr	x1, [x1, 56]
 	blr	x1
-.LVL504:
-.LBE1419:
-.LBE1418:
-	.loc 1 199 0
+.LVL508:
+.LBE1417:
+.LBE1416:
+	.loc 1 201 0
 	ldr	x2, [x19, 16]
-.LBB1420:
-.LBB1421:
+.LBB1418:
+.LBB1419:
 	.loc 3 35 0
 	mov	w1, 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL505:
-.LBE1421:
-.LBE1420:
-	.loc 1 200 0
-	ldr	w0, [x19, 608]
-	cbnz	w0, .L590
-	.loc 1 204 0
+.LVL509:
+.LBE1419:
+.LBE1418:
+	.loc 1 202 0
+	ldr	w0, [x19, 624]
+	cbnz	w0, .L594
+	.loc 1 206 0
 	ldr	x0, [x19]
 	adrp	x1, .LC22
 	add	x1, x1, :lo12:.LC22
 	bl	_dev_info
-.LVL506:
-	.loc 1 208 0
+.LVL510:
+	.loc 1 210 0
 	ldp	x19, x20, [sp, 16]
-.LVL507:
+.LVL511:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -6009,29 +6064,29 @@ ebc_power_set.part.8:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL508:
+.LVL512:
 	.p2align 3
-.L590:
+.L594:
 	.cfi_restore_state
-	.loc 1 201 0
-	str	wzr, [x19, 608]
-.LBB1422:
-.LBB1423:
+	.loc 1 203 0
+	str	wzr, [x19, 624]
+.LBB1420:
+.LBB1421:
 	.loc 4 68 0
-	add	x0, x19, 400
+	add	x0, x19, 416
 	bl	__pm_relax
-.LVL509:
-.LBE1423:
-.LBE1422:
-	.loc 1 204 0
+.LVL513:
+.LBE1421:
+.LBE1420:
+	.loc 1 206 0
 	ldr	x0, [x19]
 	adrp	x1, .LC22
 	add	x1, x1, :lo12:.LC22
 	bl	_dev_info
-.LVL510:
-	.loc 1 208 0
+.LVL514:
+	.loc 1 210 0
 	ldp	x19, x20, [sp, 16]
-.LVL511:
+.LVL515:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -6040,16 +6095,16 @@ ebc_power_set.part.8:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2862:
+.LFE2864:
 	.size	ebc_power_set.part.8, .-ebc_power_set.part.8
 	.align	2
 	.p2align 3,,7
 	.type	ebc_suspend, %function
 ebc_suspend:
-.LFB2850:
-	.loc 1 2470 0
+.LFB2852:
+	.loc 1 2511 0
 	.cfi_startproc
-.LVL512:
+.LVL516:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -6059,40 +6114,40 @@ ebc_suspend:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-.LBB1424:
-.LBB1425:
+.LBB1422:
+.LBB1423:
 	.loc 2 1181 0
 	ldr	x20, [x0, 184]
-.LBE1425:
-.LBE1424:
-	.loc 1 2474 0
+.LBE1423:
+.LBE1422:
+	.loc 1 2515 0
 	add	x19, x20, 184
-	ldr	w0, [x19, 184]
-.LVL513:
+	ldr	w0, [x19, 200]
+.LVL517:
 	cmp	w0, 1
-	beq	.L594
-.L592:
-	.loc 1 2478 0
+	beq	.L598
+.L596:
+	.loc 1 2519 0
 	mov	w0, 1
-	str	w0, [x19, 596]
-	.loc 1 2480 0
+	str	w0, [x19, 612]
+	.loc 1 2521 0
 	ldr	x1, [x20, 16]
-.LBB1426:
-.LBB1427:
+.LBB1424:
+.LBB1425:
 	.loc 3 40 0
 	mov	x0, x1
 	ldr	x1, [x1, 40]
 	blr	x1
-.LVL514:
-.LBE1427:
-.LBE1426:
-	.loc 1 2481 0
-	ldr	x0, [x19, 88]
+.LVL518:
+.LBE1425:
+.LBE1424:
+	.loc 1 2522 0
+	ldr	x0, [x19, 104]
 	adrp	x1, .LC24
 	add	x1, x1, :lo12:.LC24
 	bl	_dev_info
-.LVL515:
-	.loc 1 2484 0
+.LVL519:
+	.loc 1 2525 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -6104,64 +6159,64 @@ ebc_suspend:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L594:
+.L598:
 	.cfi_restore_state
-	.loc 1 2475 0
-	ldr	x0, [x19, 88]
+	.loc 1 2516 0
+	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
 	adrp	x1, .LC23
 	add	x2, x2, 16
 	add	x1, x1, :lo12:.LC23
 	bl	_dev_info
-.LVL516:
-.LBB1428:
-.LBB1429:
+.LVL520:
+.LBB1426:
+.LBB1427:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
-.LVL517:
-	b	.L592
-.LBE1429:
-.LBE1428:
+.LVL521:
+	b	.L596
+.LBE1427:
+.LBE1426:
 	.cfi_endproc
-.LFE2850:
+.LFE2852:
 	.size	ebc_suspend, .-ebc_suspend
 	.align	2
 	.p2align 3,,7
 	.type	ebc_probe, %function
 ebc_probe:
-.LFB2848:
-	.loc 1 2334 0
+.LFB2850:
+	.loc 1 2375 0
 	.cfi_startproc
-.LVL518:
+.LVL522:
 	stp	x29, x30, [sp, -208]!
 	.cfi_def_cfa_offset 208
 	.cfi_offset 29, -208
 	.cfi_offset 30, -200
-.LBB1580:
-.LBB1581:
+.LBB1578:
+.LBB1579:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
-.LBE1581:
-.LBE1580:
-	.loc 1 2334 0
+.LBE1579:
+.LBE1578:
+	.loc 1 2375 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 2335 0
+	.loc 1 2376 0
 	add	x22, x0, 16
-	.loc 1 2334 0
+	.loc 1 2375 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
-.LVL519:
+.LVL523:
 	stp	x25, x26, [sp, 64]
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 19, -192
@@ -6170,148 +6225,148 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 2334 0
+	.loc 1 2375 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
-.LBB1583:
-.LBB1582:
+.LBB1581:
+.LBB1580:
 	.loc 2 711 0
 	mov	x0, x22
-	mov	x1, 800
+	mov	x1, 816
 	bl	devm_kmalloc
-.LVL520:
-.LBE1582:
-.LBE1583:
-	.loc 1 2350 0
-	cbz	x0, .L645
-	.loc 1 2354 0
+.LVL524:
+.LBE1580:
+.LBE1581:
+	.loc 1 2391 0
+	cbz	x0, .L649
+	.loc 1 2395 0
 	adrp	x24, .LANCHOR0
 	mov	x20, x0
-	.loc 1 2356 0
+	.loc 1 2397 0
 	adrp	x1, .LC25
 	mov	w2, 0
-	.loc 1 2354 0
+	.loc 1 2395 0
 	str	x0, [x24, #:lo12:.LANCHOR0]
-	.loc 1 2356 0
+	.loc 1 2397 0
 	add	x1, x1, :lo12:.LC25
 	ldr	x0, [x22, 752]
-	.loc 1 2353 0
+	.loc 1 2394 0
 	str	x22, [x20]
-	.loc 1 2356 0
+	.loc 1 2397 0
 	bl	of_parse_phandle
-.LVL521:
-	.loc 1 2357 0
-	cbz	x0, .L690
-	.loc 1 2362 0
+.LVL525:
+	.loc 1 2398 0
+	cbz	x0, .L694
+	.loc 1 2403 0
 	bl	of_find_device_by_node
-.LVL522:
-	.loc 1 2364 0
-	cbz	x0, .L599
+.LVL526:
+	.loc 1 2405 0
+	cbz	x0, .L603
+.LBB1582:
+.LBB1583:
 .LBB1584:
-.LBB1585:
-.LBB1586:
 	.loc 2 1181 0
 	ldr	x0, [x0, 200]
-.LVL523:
-.LBE1586:
-.LBE1585:
+.LVL527:
 .LBE1584:
-	.loc 1 2367 0
+.LBE1583:
+.LBE1582:
+	.loc 1 2408 0
 	str	x0, [x20, 8]
-	.loc 1 2368 0
-	cbz	x0, .L599
-	.loc 1 2370 0
+	.loc 1 2409 0
+	cbz	x0, .L603
+	.loc 1 2411 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 2372 0
+	.loc 1 2413 0
 	add	x2, x29, 96
 	adrp	x1, .LC27
 	add	x1, x1, :lo12:.LC27
 	ldr	x0, [x22, 752]
 	bl	of_get_property
-.LVL524:
+.LVL528:
 	mov	x21, x0
-.LVL525:
-	.loc 1 2373 0
+.LVL529:
+	.loc 1 2414 0
 	ldrsw	x0, [x29, 96]
-.LVL526:
+.LVL530:
 	lsr	x0, x0, 2
-.LVL527:
+.LVL531:
 	str	w0, [x29, 96]
-.LVL528:
-	.loc 1 2374 0
+.LVL532:
+	.loc 1 2415 0
 	cmp	w0, 0
-	beq	.L600
-	.loc 1 2379 0 discriminator 1
+	beq	.L604
+	.loc 1 2420 0 discriminator 1
 	mov	w19, 0
-.LVL529:
-	bgt	.L674
-	b	.L602
+.LVL533:
+	bgt	.L678
+	b	.L606
 	.p2align 3
-.L603:
-	.loc 1 2387 0
+.L607:
+	.loc 1 2428 0
 	bl	of_find_i2c_device_by_node
-.LVL530:
-	.loc 1 2389 0
-	cbz	x0, .L691
+.LVL534:
+	.loc 1 2430 0
+	cbz	x0, .L695
+.LBB1585:
+.LBB1586:
 .LBB1587:
-.LBB1588:
-.LBB1589:
 	.loc 2 1181 0
 	ldr	x0, [x0, 216]
-.LVL531:
-.LBE1589:
-.LBE1588:
+.LVL535:
 .LBE1587:
-	.loc 1 2394 0
+.LBE1586:
+.LBE1585:
+	.loc 1 2435 0
 	str	x0, [x20, 16]
-	.loc 1 2395 0
-	cbnz	x0, .L692
-	.loc 1 2379 0 discriminator 2
+	.loc 1 2436 0
+	cbnz	x0, .L696
+	.loc 1 2420 0 discriminator 2
 	ldr	w0, [x29, 96]
 	add	w19, w19, 1
-.LVL532:
+.LVL536:
 	cmp	w0, w19
-	ble	.L607
-.L674:
+	ble	.L611
+.L678:
 	ldr	w0, [x21], 4
-	.loc 1 2381 0
+	.loc 1 2422 0
 	rev	w0, w0
 	bl	of_find_node_by_phandle
-.LVL533:
-	.loc 1 2382 0
-	cbnz	x0, .L603
-	.loc 1 2383 0
+.LVL537:
+	.loc 1 2423 0
+	cbnz	x0, .L607
+	.loc 1 2424 0
 	adrp	x1, .LC29
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC29
-	.loc 1 2384 0
+	.loc 1 2425 0
 	mov	w25, -19
-	.loc 1 2383 0
+	.loc 1 2424 0
 	bl	_dev_err
-.LVL534:
+.LVL538:
 	.p2align 2
-.L595:
-	.loc 1 2460 0
+.L599:
+	.loc 1 2501 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w25
-.LVL535:
+.LVL539:
 	ldr	x2, [x29, 200]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L693
+	cbnz	x1, .L697
 	ldp	x19, x20, [sp, 16]
-.LVL536:
+.LVL540:
 	ldp	x21, x22, [sp, 32]
-.LVL537:
+.LVL541:
 	ldp	x23, x24, [sp, 48]
-.LVL538:
+.LVL542:
 	ldp	x25, x26, [sp, 64]
-.LVL539:
+.LVL543:
 	ldp	x27, x28, [sp, 80]
-.LVL540:
+.LVL544:
 	ldp	x29, x30, [sp], 208
 	.cfi_remember_state
 	.cfi_restore 30
@@ -6328,91 +6383,91 @@ ebc_probe:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL541:
+.LVL545:
 	.p2align 3
-.L692:
+.L696:
 	.cfi_restore_state
-	.loc 1 2396 0
+	.loc 1 2437 0
 	adrp	x1, .LC31
 	mov	w2, w19
 	add	x1, x1, :lo12:.LC31
 	mov	x0, x22
 	bl	_dev_info
-.LVL542:
-.L602:
-	.loc 1 2401 0
+.LVL546:
+.L606:
+	.loc 1 2442 0
 	ldr	x0, [x20, 16]
-	cbz	x0, .L607
-	.loc 1 2407 0
+	cbz	x0, .L611
+	.loc 1 2448 0
 	add	x19, x20, 184
-.LVL543:
-	.loc 1 2409 0
+.LVL547:
+	.loc 1 2450 0
 	add	x21, x20, 24
-.LVL544:
-	.loc 1 2407 0
-	str	x22, [x19, 88]
+.LVL548:
+	.loc 1 2448 0
+	str	x22, [x19, 104]
+.LBB1588:
+.LBB1589:
 .LBB1590:
 .LBB1591:
 .LBB1592:
-.LBB1593:
-.LBB1594:
 	.file 14 "./include/linux/of.h"
 	.loc 14 499 0
 	adrp	x1, .LC33
-.LBE1594:
-.LBE1593:
 .LBE1592:
 .LBE1591:
 .LBE1590:
-	.loc 1 2409 0
+.LBE1589:
+.LBE1588:
+	.loc 1 2450 0
 	str	x22, [x20, 24]
-.LBB1664:
-.LBB1661:
-.LBB1601:
-.LBB1598:
-.LBB1595:
-	.loc 14 499 0
-	mov	x4, 0
-.LBE1595:
-.LBE1598:
-.LBE1601:
-.LBE1661:
-.LBE1664:
-	.loc 1 2410 0
-	ldr	x2, [x20, 8]
-.LBB1665:
 .LBB1662:
-.LBB1602:
+.LBB1659:
 .LBB1599:
 .LBB1596:
+.LBB1593:
 	.loc 14 499 0
-	add	x1, x1, :lo12:.LC33
+	mov	x4, 0
+.LBE1593:
 .LBE1596:
 .LBE1599:
-.LBE1602:
+.LBE1659:
 .LBE1662:
-.LBE1665:
-	.loc 1 2411 0
-	stp	x2, x0, [x21, 8]
-.LBB1666:
+	.loc 1 2451 0
+	ldr	x2, [x20, 8]
 .LBB1663:
-.LBB1603:
+.LBB1660:
 .LBB1600:
 .LBB1597:
+.LBB1594:
+	.loc 14 499 0
+	add	x1, x1, :lo12:.LC33
+.LBE1594:
+.LBE1597:
+.LBE1600:
+.LBE1660:
+.LBE1663:
+	.loc 1 2452 0
+	stp	x2, x0, [x21, 8]
+.LBB1664:
+.LBB1661:
+.LBB1601:
+.LBB1598:
+.LBB1595:
 	.loc 14 499 0
 	mov	x3, 1
 	ldr	x0, [x22, 752]
 	add	x2, x20, 100
 	bl	of_property_read_variable_u32_array
-.LVL545:
+.LVL549:
 	.loc 14 501 0
-	tbnz	w0, #31, .L609
-.LBE1597:
-.LBE1600:
-.LBE1603:
+	tbnz	w0, #31, .L613
+.LBE1595:
+.LBE1598:
+.LBE1601:
+.LBB1602:
+.LBB1603:
 .LBB1604:
-.LBB1605:
-.LBB1606:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC57
@@ -6421,15 +6476,15 @@ ebc_probe:
 	add	x2, x20, 104
 	add	x1, x1, :lo12:.LC57
 	bl	of_property_read_variable_u32_array
-.LVL546:
+.LVL550:
 	.loc 14 501 0
-	tbnz	w0, #31, .L609
-.LBE1606:
-.LBE1605:
+	tbnz	w0, #31, .L613
 .LBE1604:
+.LBE1603:
+.LBE1602:
+.LBB1605:
+.LBB1606:
 .LBB1607:
-.LBB1608:
-.LBB1609:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC58
@@ -6438,15 +6493,15 @@ ebc_probe:
 	add	x2, x20, 108
 	add	x1, x1, :lo12:.LC58
 	bl	of_property_read_variable_u32_array
-.LVL547:
+.LVL551:
 	.loc 14 501 0
-	tbnz	w0, #31, .L609
-.LBE1609:
-.LBE1608:
+	tbnz	w0, #31, .L613
 .LBE1607:
+.LBE1606:
+.LBE1605:
+.LBB1608:
+.LBB1609:
 .LBB1610:
-.LBB1611:
-.LBB1612:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC59
@@ -6455,15 +6510,15 @@ ebc_probe:
 	add	x2, x20, 112
 	add	x1, x1, :lo12:.LC59
 	bl	of_property_read_variable_u32_array
-.LVL548:
+.LVL552:
 	.loc 14 501 0
-	tbnz	w0, #31, .L609
-.LBE1612:
-.LBE1611:
+	tbnz	w0, #31, .L613
 .LBE1610:
+.LBE1609:
+.LBE1608:
+.LBB1611:
+.LBB1612:
 .LBB1613:
-.LBB1614:
-.LBB1615:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC60
@@ -6472,15 +6527,15 @@ ebc_probe:
 	add	x2, x20, 128
 	add	x1, x1, :lo12:.LC60
 	bl	of_property_read_variable_u32_array
-.LVL549:
+.LVL553:
 	.loc 14 501 0
-	tbnz	w0, #31, .L609
-.LBE1615:
-.LBE1614:
+	tbnz	w0, #31, .L613
 .LBE1613:
+.LBE1612:
+.LBE1611:
+.LBB1614:
+.LBB1615:
 .LBB1616:
-.LBB1617:
-.LBB1618:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC61
@@ -6489,15 +6544,15 @@ ebc_probe:
 	add	x2, x20, 132
 	add	x1, x1, :lo12:.LC61
 	bl	of_property_read_variable_u32_array
-.LVL550:
+.LVL554:
 	.loc 14 501 0
-	tbnz	w0, #31, .L609
-.LBE1618:
-.LBE1617:
+	tbnz	w0, #31, .L613
 .LBE1616:
+.LBE1615:
+.LBE1614:
+.LBB1617:
+.LBB1618:
 .LBB1619:
-.LBB1620:
-.LBB1621:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC62
@@ -6506,15 +6561,15 @@ ebc_probe:
 	add	x2, x20, 136
 	add	x1, x1, :lo12:.LC62
 	bl	of_property_read_variable_u32_array
-.LVL551:
+.LVL555:
 	.loc 14 501 0
-	tbnz	w0, #31, .L609
-.LBE1621:
-.LBE1620:
+	tbnz	w0, #31, .L613
 .LBE1619:
+.LBE1618:
+.LBE1617:
+.LBB1620:
+.LBB1621:
 .LBB1622:
-.LBB1623:
-.LBB1624:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC63
@@ -6523,15 +6578,15 @@ ebc_probe:
 	add	x2, x20, 140
 	add	x1, x1, :lo12:.LC63
 	bl	of_property_read_variable_u32_array
-.LVL552:
+.LVL556:
 	.loc 14 501 0
-	tbnz	w0, #31, .L609
-.LBE1624:
-.LBE1623:
+	tbnz	w0, #31, .L613
 .LBE1622:
+.LBE1621:
+.LBE1620:
+.LBB1623:
+.LBB1624:
 .LBB1625:
-.LBB1626:
-.LBB1627:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC64
@@ -6540,15 +6595,15 @@ ebc_probe:
 	add	x2, x20, 144
 	add	x1, x1, :lo12:.LC64
 	bl	of_property_read_variable_u32_array
-.LVL553:
+.LVL557:
 	.loc 14 501 0
-	tbnz	w0, #31, .L609
-.LBE1627:
-.LBE1626:
+	tbnz	w0, #31, .L613
 .LBE1625:
+.LBE1624:
+.LBE1623:
+.LBB1626:
+.LBB1627:
 .LBB1628:
-.LBB1629:
-.LBB1630:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC65
@@ -6557,15 +6612,15 @@ ebc_probe:
 	add	x2, x20, 148
 	add	x1, x1, :lo12:.LC65
 	bl	of_property_read_variable_u32_array
-.LVL554:
+.LVL558:
 	.loc 14 501 0
-	tbnz	w0, #31, .L609
-.LBE1630:
-.LBE1629:
+	tbnz	w0, #31, .L613
 .LBE1628:
+.LBE1627:
+.LBE1626:
+.LBB1629:
+.LBB1630:
 .LBB1631:
-.LBB1632:
-.LBB1633:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC66
@@ -6574,15 +6629,15 @@ ebc_probe:
 	add	x2, x20, 152
 	add	x1, x1, :lo12:.LC66
 	bl	of_property_read_variable_u32_array
-.LVL555:
+.LVL559:
 	.loc 14 501 0
-	tbnz	w0, #31, .L609
-.LBE1633:
-.LBE1632:
+	tbnz	w0, #31, .L613
 .LBE1631:
+.LBE1630:
+.LBE1629:
+.LBB1632:
+.LBB1633:
 .LBB1634:
-.LBB1635:
-.LBB1636:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC67
@@ -6591,15 +6646,15 @@ ebc_probe:
 	add	x2, x20, 156
 	add	x1, x1, :lo12:.LC67
 	bl	of_property_read_variable_u32_array
-.LVL556:
+.LVL560:
 	.loc 14 501 0
-	tbnz	w0, #31, .L609
-.LBE1636:
-.LBE1635:
+	tbnz	w0, #31, .L613
 .LBE1634:
+.LBE1633:
+.LBE1632:
+.LBB1635:
+.LBB1636:
 .LBB1637:
-.LBB1638:
-.LBB1639:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC68
@@ -6608,15 +6663,15 @@ ebc_probe:
 	add	x2, x20, 160
 	add	x1, x1, :lo12:.LC68
 	bl	of_property_read_variable_u32_array
-.LVL557:
+.LVL561:
 	.loc 14 501 0
-	tbnz	w0, #31, .L609
-.LBE1639:
-.LBE1638:
+	tbnz	w0, #31, .L613
 .LBE1637:
+.LBE1636:
+.LBE1635:
+.LBB1638:
+.LBB1639:
 .LBB1640:
-.LBB1641:
-.LBB1642:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC69
@@ -6625,15 +6680,15 @@ ebc_probe:
 	add	x2, x20, 164
 	add	x1, x1, :lo12:.LC69
 	bl	of_property_read_variable_u32_array
-.LVL558:
+.LVL562:
 	.loc 14 501 0
-	tbnz	w0, #31, .L609
-.LBE1642:
-.LBE1641:
+	tbnz	w0, #31, .L613
 .LBE1640:
+.LBE1639:
+.LBE1638:
+.LBB1641:
+.LBB1642:
 .LBB1643:
-.LBB1644:
-.LBB1645:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC70
@@ -6642,15 +6697,15 @@ ebc_probe:
 	add	x2, x20, 168
 	add	x1, x1, :lo12:.LC70
 	bl	of_property_read_variable_u32_array
-.LVL559:
+.LVL563:
 	.loc 14 501 0
-	tbnz	w0, #31, .L609
-.LBE1645:
-.LBE1644:
+	tbnz	w0, #31, .L613
 .LBE1643:
+.LBE1642:
+.LBE1641:
+.LBB1644:
+.LBB1645:
 .LBB1646:
-.LBB1647:
-.LBB1648:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC71
@@ -6659,18 +6714,18 @@ ebc_probe:
 	add	x2, x20, 172
 	add	x1, x1, :lo12:.LC71
 	bl	of_property_read_variable_u32_array
-.LVL560:
+.LVL564:
 	.loc 14 501 0
-	tbz	w0, #31, .L635
-.LBE1648:
-.LBE1647:
+	tbz	w0, #31, .L639
 .LBE1646:
-	.loc 1 1714 0
+.LBE1645:
+.LBE1644:
+	.loc 1 1716 0
 	str	wzr, [x21, 148]
-.L635:
+.L639:
+.LBB1647:
+.LBB1648:
 .LBB1649:
-.LBB1650:
-.LBB1651:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC34
@@ -6679,18 +6734,18 @@ ebc_probe:
 	add	x2, x20, 176
 	add	x1, x1, :lo12:.LC34
 	bl	of_property_read_variable_u32_array
-.LVL561:
+.LVL565:
 	.loc 14 501 0
-	tbz	w0, #31, .L636
-.LBE1651:
-.LBE1650:
+	tbz	w0, #31, .L640
 .LBE1649:
-	.loc 1 1717 0
+.LBE1648:
+.LBE1647:
+	.loc 1 1719 0
 	str	wzr, [x21, 152]
-.L636:
+.L640:
+.LBB1650:
+.LBB1651:
 .LBB1652:
-.LBB1653:
-.LBB1654:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC35
@@ -6699,18 +6754,18 @@ ebc_probe:
 	add	x2, x20, 180
 	add	x1, x1, :lo12:.LC35
 	bl	of_property_read_variable_u32_array
-.LVL562:
+.LVL566:
 	.loc 14 501 0
-	tbz	w0, #31, .L637
-.LBE1654:
-.LBE1653:
+	tbz	w0, #31, .L641
 .LBE1652:
-	.loc 1 1720 0
+.LBE1651:
+.LBE1650:
+	.loc 1 1722 0
 	str	wzr, [x21, 156]
-.L637:
+.L641:
+.LBB1653:
+.LBB1654:
 .LBB1655:
-.LBB1656:
-.LBB1657:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC36
@@ -6719,18 +6774,18 @@ ebc_probe:
 	add	x2, x20, 116
 	add	x1, x1, :lo12:.LC36
 	bl	of_property_read_variable_u32_array
-.LVL563:
+.LVL567:
 	.loc 14 501 0
-	tbz	w0, #31, .L638
-.LBE1657:
-.LBE1656:
+	tbz	w0, #31, .L642
 .LBE1655:
-	.loc 1 1723 0
+.LBE1654:
+.LBE1653:
+	.loc 1 1725 0
 	str	wzr, [x21, 92]
-.L638:
+.L642:
+.LBB1656:
+.LBB1657:
 .LBB1658:
-.LBB1659:
-.LBB1660:
 	.loc 14 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC37
@@ -6739,164 +6794,179 @@ ebc_probe:
 	add	x2, x20, 120
 	add	x1, x1, :lo12:.LC37
 	bl	of_property_read_variable_u32_array
-.LVL564:
+.LVL568:
 	.loc 14 501 0
-	tbz	w0, #31, .L639
-.LBE1660:
-.LBE1659:
+	tbz	w0, #31, .L643
 .LBE1658:
-	.loc 1 1726 0
+.LBE1657:
+.LBE1656:
+	.loc 1 1728 0
 	str	wzr, [x21, 96]
-.L639:
-.LBE1663:
-.LBE1666:
-	.loc 1 2419 0
+.L643:
+.LBE1661:
+.LBE1664:
+	.loc 1 2460 0
 	ldr	w0, [x21, 88]
-.LBB1667:
-.LBB1668:
-	.loc 1 2136 0
+.LBB1665:
+.LBB1666:
+	.loc 1 2177 0
 	mov	w2, 0
-.LBE1668:
-.LBE1667:
-	.loc 1 2419 0
-	str	w0, [x19, 52]
-	.loc 1 2420 0
+.LBE1666:
+.LBE1665:
+	.loc 1 2460 0
+	str	w0, [x19, 68]
+	.loc 1 2461 0
 	ldr	w1, [x21, 84]
-	str	w1, [x19, 56]
-	.loc 1 2423 0
+	str	w1, [x19, 72]
+	.loc 1 2464 0
 	tst	x1, 15
-	.loc 1 2421 0
+	.loc 1 2462 0
 	mul	w0, w0, w1
-	.loc 1 2423 0
+	.loc 1 2464 0
 	cset	w1, eq
-	str	w1, [x19, 72]
-.LBB1692:
-.LBB1687:
-	.loc 1 2136 0
+	str	w1, [x19, 88]
+.LBB1690:
+.LBB1685:
+	.loc 1 2177 0
 	adrp	x1, .LC38
 	add	x1, x1, :lo12:.LC38
-.LBE1687:
-.LBE1692:
-	.loc 1 2421 0
+.LBE1685:
+.LBE1690:
+	.loc 1 2462 0
 	lsr	w3, w0, 1
-	.loc 1 2422 0
+	.loc 1 2463 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x19, 20]
-.LBB1693:
-.LBB1688:
-	.loc 1 2127 0
+.LBB1691:
+.LBB1686:
+	.loc 1 2168 0
 	ldr	x26, [x20]
-.LVL565:
-	.loc 1 2136 0
+.LVL569:
+	.loc 1 2177 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL566:
-	.loc 1 2137 0
-	cbz	x0, .L646
-	.loc 1 2140 0
+.LVL570:
+	.loc 1 2178 0
+	cbz	x0, .L650
+	.loc 1 2181 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL567:
+.LVL571:
 	mov	w25, w0
-	.loc 1 2142 0
-	cbnz	w0, .L694
-.LBB1669:
-.LBB1670:
+	.loc 1 2183 0
+	cbnz	w0, .L698
+.LBB1667:
+.LBB1668:
 	.file 15 "./include/linux/ioport.h"
 	.loc 15 204 0
 	ldp	x1, x2, [x29, 104]
-.LBE1670:
-.LBE1669:
-	.loc 1 2147 0
+.LBE1668:
+.LBE1667:
+	.loc 1 2188 0
 	str	x1, [x20, 184]
-	.loc 1 2150 0
+	.loc 1 2191 0
 	mov	x3, 1
 	mov	x0, x26
-.LBB1672:
-.LBB1671:
+.LBB1670:
+.LBB1669:
 	.loc 15 204 0
 	add	x2, x2, 1
 	sub	x2, x2, x1
-.LBE1671:
-.LBE1672:
-	.loc 1 2148 0
+.LBE1669:
+.LBE1670:
+	.loc 1 2189 0
 	str	w2, [x19, 16]
-	.loc 1 2150 0
+	.loc 1 2191 0
 	sxtw	x2, w2
 	bl	devm_memremap
-.LVL568:
+.LVL572:
 	str	x0, [x19, 8]
-	.loc 1 2152 0
-	cbz	x0, .L617
-	.loc 1 2160 0
+	.loc 1 2193 0
+	cbz	x0, .L621
+	.loc 1 2201 0
 	mov	x1, x0
 	ldr	w2, [x19, 16]
 	ldr	x0, [x20, 184]
 	mov	w4, 4
 	mov	w3, 2097152
 	bl	ebc_buf_init
-.LVL569:
-	.loc 1 2161 0
-	cbnz	w0, .L617
-	.loc 1 2166 0
+.LVL573:
+	.loc 1 2202 0
+	cbnz	w0, .L621
+	.loc 1 2207 0
 	ldr	x0, [x19, 8]
-	.loc 1 2167 0
+	.loc 1 2208 0
 	mov	x5, 1048576
 	str	x5, [x21, 40]
-.LBB1673:
-.LBB1674:
+.LBB1671:
+.LBB1672:
 	.loc 2 711 0
 	mov	w2, 32960
-.LBE1674:
-.LBE1673:
-	.loc 1 2166 0
+.LBE1672:
+.LBE1671:
+	.loc 1 2207 0
 	add	x6, x0, 10485760
 	str	x6, [x21, 24]
 	add	x4, x0, 11534336
-	.loc 1 2172 0
+	.loc 1 2213 0
 	add	x1, x0, 12582912
-	.loc 1 2168 0
+	.loc 1 2209 0
 	ldr	x3, [x20, 184]
-.LBB1678:
-.LBB1675:
+.LBB1676:
+.LBB1673:
 	.loc 2 711 0
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
-.LBE1675:
-.LBE1678:
-	.loc 1 2168 0
+.LBE1673:
+.LBE1676:
+	.loc 1 2209 0
 	add	x7, x3, 10485760
 	str	x7, [x21, 32]
-	.loc 1 2169 0
-	str	x6, [x19, 168]
-	.loc 1 2168 0
+	.loc 1 2210 0
+	str	x6, [x19, 184]
+	.loc 1 2209 0
 	add	x3, x3, 11534336
-	.loc 1 2167 0
+	.loc 1 2208 0
 	str	x5, [x21, 64]
-	.loc 1 2168 0
+	.loc 1 2209 0
 	stp	x4, x3, [x21, 48]
-	.loc 1 2172 0
-	str	x1, [x19, 112]
-.LBB1679:
-.LBB1676:
+	.loc 1 2213 0
+	str	x1, [x19, 128]
+.LBB1677:
+.LBB1674:
 	.loc 2 711 0
 	ldrsw	x1, [x19, 20]
-.LBE1676:
-.LBE1679:
-	.loc 1 2169 0
-	str	x4, [x19, 176]
+.LBE1674:
+.LBE1677:
+	.loc 1 2210 0
+	str	x4, [x19, 192]
+.LBB1678:
+.LBB1675:
+	.loc 2 711 0
+	bl	devm_kmalloc
+.LVL574:
+.LBE1675:
+.LBE1678:
+	.loc 1 2216 0
+	str	x0, [x19, 144]
+	.loc 1 2217 0
+	cbz	x0, .L621
+.LBB1679:
 .LBB1680:
-.LBB1677:
 	.loc 2 711 0
+	ldrsw	x1, [x19, 20]
+	mov	w2, 32960
+	movk	w2, 0x60, lsl 16
+	mov	x0, x26
 	bl	devm_kmalloc
-.LVL570:
-.LBE1677:
+.LVL575:
 .LBE1680:
-	.loc 1 2175 0
-	str	x0, [x19, 128]
-	.loc 1 2176 0
-	cbz	x0, .L617
+.LBE1679:
+	.loc 1 2219 0
+	str	x0, [x19, 152]
+	.loc 1 2220 0
+	cbz	x0, .L621
 .LBB1681:
 .LBB1682:
 	.loc 2 711 0
@@ -6905,195 +6975,189 @@ ebc_probe:
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL571:
+.LVL576:
 .LBE1682:
 .LBE1681:
-	.loc 1 2178 0
-	str	x0, [x19, 136]
-	.loc 1 2179 0
-	cbz	x0, .L617
+	.loc 1 2222 0
+	str	x0, [x19, 160]
+	.loc 1 2223 0
+	cbz	x0, .L621
+	.loc 1 2230 0
+	ldp	w1, w0, [x21, 84]
 .LBB1683:
 .LBB1684:
 	.loc 2 711 0
-	ldrsw	x1, [x19, 20]
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
+	mul	w1, w1, w0
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL572:
+.LVL577:
 .LBE1684:
 .LBE1683:
-	.loc 1 2181 0
-	str	x0, [x19, 144]
-	.loc 1 2182 0
-	cbz	x0, .L617
-	.loc 1 2189 0
-	ldp	w1, w0, [x21, 84]
-.LBB1685:
-.LBB1686:
-	.loc 2 711 0
-	mov	w2, 32960
-	movk	w2, 0x60, lsl 16
-	mul	w1, w1, w0
-	mov	x0, x26
-	bl	devm_kmalloc
-.LVL573:
-.LBE1686:
-.LBE1685:
-	.loc 1 2189 0
-	str	x0, [x19, 152]
-	.loc 1 2190 0
-	cbz	x0, .L617
-	.loc 1 2192 0
+	.loc 1 2230 0
+	str	x0, [x19, 168]
+	.loc 1 2231 0
+	cbz	x0, .L621
+	.loc 1 2233 0
 	ldp	w2, w1, [x21, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
-.LVL574:
-	.loc 1 2193 0
+.LVL578:
+	.loc 1 2234 0
 	ldrsw	x2, [x19, 20]
 	mov	w1, 255
-	ldr	x0, [x19, 144]
+	ldr	x0, [x19, 160]
 	bl	memset
-.LVL575:
-.LBE1688:
-.LBE1693:
-.LBB1694:
-.LBB1695:
-	.loc 1 2087 0
-	ldr	x26, [x20, 272]
-.LVL576:
-	.loc 1 2093 0
+.LVL579:
+.LBE1686:
+.LBE1691:
+.LBB1692:
+.LBB1693:
+	.loc 1 2125 0
+	ldr	x26, [x19, 104]
+.LVL580:
+	.loc 1 2131 0
 	adrp	x1, .LC40
 	mov	w2, 0
 	add	x1, x1, :lo12:.LC40
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL577:
-	.loc 1 2094 0
-	cbz	x0, .L647
-	.loc 1 2097 0
+.LVL581:
+	.loc 1 2132 0
+	cbz	x0, .L651
+	.loc 1 2135 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL578:
+.LVL582:
 	mov	w25, w0
-	.loc 1 2099 0
-	cbz	w0, .L695
-.L618:
-.LBE1695:
-.LBE1694:
-	.loc 1 2435 0
+	.loc 1 2137 0
+	cbz	w0, .L699
+.L622:
+.LBE1693:
+.LBE1692:
+	.loc 1 2476 0
 	adrp	x1, .LC73
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC73
 	bl	_dev_err
-.LVL579:
-	.loc 1 2436 0
-	b	.L595
-.LVL580:
+.LVL583:
+	.loc 1 2477 0
+	b	.L599
+.LVL584:
 	.p2align 3
-.L609:
-	.loc 1 2417 0
+.L613:
+	.loc 1 2458 0
 	mov	w25, -22
-	.loc 1 2416 0
+	.loc 1 2457 0
 	adrp	x1, .LC77
 	mov	w2, w25
 	add	x1, x1, :lo12:.LC77
 	mov	x0, x22
 	bl	_dev_err
-.LVL581:
-	.loc 1 2417 0
-	b	.L595
-.LVL582:
+.LVL585:
+	.loc 1 2458 0
+	b	.L599
+.LVL586:
 	.p2align 3
-.L691:
-	.loc 1 2390 0
+.L695:
+	.loc 1 2431 0
 	adrp	x1, .LC30
 	mov	x0, x22
-.LVL583:
+.LVL587:
 	add	x1, x1, :lo12:.LC30
-	.loc 1 2391 0
+	.loc 1 2432 0
 	mov	w25, -19
-	.loc 1 2390 0
+	.loc 1 2431 0
 	bl	_dev_err
-.LVL584:
-	.loc 1 2391 0
-	b	.L595
-.LVL585:
+.LVL588:
+	.loc 1 2432 0
+	b	.L599
+.LVL589:
 	.p2align 3
-.L607:
-	.loc 1 2402 0
+.L611:
+	.loc 1 2443 0
 	adrp	x1, .LC32
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC32
-	.loc 1 2403 0
+	.loc 1 2444 0
 	mov	w25, -517
-	.loc 1 2402 0
+	.loc 1 2443 0
 	bl	_dev_err
-.LVL586:
-	.loc 1 2403 0
-	b	.L595
-.LVL587:
+.LVL590:
+	.loc 1 2444 0
+	b	.L599
+.LVL591:
 	.p2align 3
-.L694:
+.L698:
 .LBB1702:
-.LBB1689:
-	.loc 1 2143 0
+.LBB1687:
+	.loc 1 2184 0
 	adrp	x1, .LC39
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC39
 	bl	_dev_err
-.LVL588:
-.L614:
-.LBE1689:
+.LVL592:
+.L618:
+.LBE1687:
 .LBE1702:
-	.loc 1 2428 0
+	.loc 1 2469 0
 	adrp	x1, .LC72
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC72
 	bl	_dev_err
-.LVL589:
-	.loc 1 2429 0
-	b	.L595
-.LVL590:
-.L695:
+.LVL593:
+	.loc 1 2470 0
+	b	.L599
+.LVL594:
+.L699:
 .LBB1703:
 .LBB1698:
-	.loc 1 2105 0
+	.loc 1 2146 0
 	mov	x0, x26
 	mov	x3, 1
-.LBB1696:
-.LBB1697:
+.LBB1694:
+.LBB1695:
 	.loc 15 204 0
 	ldp	x1, x26, [x29, 104]
-.LVL591:
+.LVL595:
+.LBE1695:
+.LBE1694:
+	.loc 1 2143 0
+	str	x1, [x19, 32]
+.LBB1697:
+.LBB1696:
+	.loc 15 204 0
 	add	x26, x26, 1
 	sub	x26, x26, x1
-.LBE1697:
 .LBE1696:
-	.loc 1 2105 0
+.LBE1697:
+	.loc 1 2144 0
+	str	w26, [x19, 40]
+	.loc 1 2146 0
 	sxtw	x2, w26
 	bl	devm_memremap
-.LVL592:
-	str	x0, [x20, 376]
-	.loc 1 2107 0
-	cbz	x0, .L696
-	.loc 1 2112 0
+.LVL596:
+	str	x0, [x19, 208]
+	.loc 1 2148 0
+	cbz	x0, .L700
+	.loc 1 2153 0
 	bl	epd_lut_from_mem_init
-.LVL593:
-	.loc 1 2113 0
-	tbnz	w0, #31, .L697
-.L620:
+.LVL597:
+	.loc 1 2154 0
+	tbnz	w0, #31, .L701
+.L624:
 .LBE1698:
 .LBE1703:
 .LBB1704:
 .LBB1705:
-	.loc 1 2202 0
-	add	x0, x20, 736
+	.loc 1 2243 0
+	add	x0, x20, 752
 	mov	x1, 68719476704
-	str	x1, [x19, 544]
-	.loc 1 2204 0
+	str	x1, [x19, 560]
+	.loc 1 2245 0
 	add	x24, x24, :lo12:.LANCHOR0
 .LBB1706:
 .LBB1707:
@@ -7101,13 +7165,13 @@ ebc_probe:
 .LBB1709:
 .LBB1710:
 	.loc 12 288 0
-	str	x0, [x20, 736]
+	str	x0, [x20, 752]
 .LBE1710:
 .LBE1709:
 .LBE1708:
 .LBE1707:
 .LBE1706:
-	.loc 1 2200 0
+	.loc 1 2241 0
 	mov	w26, 99
 .LBB1712:
 .LBB1711:
@@ -7116,41 +7180,41 @@ ebc_probe:
 	str	x0, [x0, 8]
 .LBE1711:
 .LBE1712:
-	.loc 1 2202 0
+	.loc 1 2243 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
-	str	x0, [x19, 568]
-	.loc 1 2204 0
+	str	x0, [x19, 584]
+	.loc 1 2245 0
 	adrp	x3, .LC74
 	mov	w2, -1
 	add	x3, x3, :lo12:.LC74
 	mov	x1, x19
 	adrp	x0, ebc_auto_tast_function
-	.loc 1 2200 0
+	.loc 1 2241 0
 	str	w26, [x29, 104]
-	.loc 1 2204 0
+	.loc 1 2245 0
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
-.LVL594:
+.LVL598:
 	str	x0, [x24, 8]
-	.loc 1 2205 0
+	.loc 1 2246 0
 	cmn	x0, #4096
-	bhi	.L698
-	.loc 1 2209 0
+	bhi	.L702
+	.loc 1 2250 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
-.LVL595:
-	.loc 1 2210 0
+.LVL599:
+	.loc 1 2251 0
 	ldr	x2, [x24, 8]
 .LBB1713:
 .LBB1714:
 	.file 17 "./arch/arm64/include/asm/atomic_lse.h"
 	.loc 17 47 0
 	mov	w0, 1
-.LVL596:
+.LVL600:
 	add	x1, x2, 48
-.LVL597:
+.LVL601:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -7178,49 +7242,49 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL598:
+.LVL602:
 #NO_APP
 .LBE1714:
 .LBE1713:
 .LBB1715:
-	.loc 1 2213 0
+	.loc 1 2254 0
 	adrp	x3, .LC45
 	adrp	x0, ebc_thread
-.LVL599:
+.LVL603:
 	add	x3, x3, :lo12:.LC45
 	mov	w2, -1
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x19
 .LBE1715:
-	.loc 1 2212 0
+	.loc 1 2253 0
 	str	w26, [x29, 104]
 .LBB1716:
-	.loc 1 2213 0
+	.loc 1 2254 0
 	bl	kthread_create_on_node
-.LVL600:
+.LVL604:
 	mov	x24, x0
-.LVL601:
+.LVL605:
 	cmn	x0, #4096
-	bhi	.L622
+	bhi	.L626
 	bl	wake_up_process
-.LVL602:
+.LVL606:
 .LBE1716:
-	str	x24, [x19, 120]
-	.loc 1 2218 0
+	str	x24, [x19, 136]
+	.loc 1 2259 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x24
 	bl	sched_setscheduler_nocheck
-.LVL603:
-	.loc 1 2219 0
-	ldr	x2, [x19, 120]
+.LVL607:
+	.loc 1 2260 0
+	ldr	x2, [x19, 136]
 .LBB1717:
 .LBB1718:
 	.loc 17 47 0
 	mov	w0, 1
-.LVL604:
+.LVL608:
 	add	x1, x2, 48
-.LVL605:
+.LVL609:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -7248,7 +7312,7 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL606:
+.LVL610:
 #NO_APP
 .LBE1718:
 .LBE1717:
@@ -7256,43 +7320,43 @@ ebc_probe:
 .LBE1704:
 .LBB1721:
 .LBB1722:
-	.loc 1 2228 0
+	.loc 1 2269 0
 	mov	w0, -1
-.LVL607:
-	str	w0, [x19, 48]
+.LVL611:
+	str	w0, [x19, 64]
 .LBB1723:
 .LBB1724:
 	.loc 4 39 0
-	add	x0, x20, 400
-.LVL608:
+	add	x0, x20, 416
+.LVL612:
 .LBE1724:
 .LBE1723:
-	.loc 1 2232 0
-	str	wzr, [x19, 28]
-	.loc 1 2231 0
-	str	wzr, [x19, 80]
+	.loc 1 2273 0
+	str	wzr, [x19, 44]
+	.loc 1 2272 0
+	str	wzr, [x19, 96]
 .LBB1729:
 .LBB1725:
 	.loc 4 43 0
 	adrp	x1, .LC46
 .LBE1725:
 .LBE1729:
-	.loc 1 2227 0
-	str	wzr, [x19, 184]
+	.loc 1 2268 0
+	str	wzr, [x19, 200]
 .LBB1730:
 .LBB1726:
 	.loc 4 43 0
 	add	x1, x1, :lo12:.LC46
 .LBE1726:
 .LBE1730:
-	.loc 1 2229 0
-	str	wzr, [x19, 592]
-	.loc 1 2239 0
-	add	x24, x20, 616
-.LVL609:
-	.loc 1 2230 0
-	str	wzr, [x19, 596]
-	.loc 1 2240 0
+	.loc 1 2270 0
+	str	wzr, [x19, 608]
+	.loc 1 2280 0
+	add	x24, x20, 632
+.LVL613:
+	.loc 1 2271 0
+	str	wzr, [x19, 612]
+	.loc 1 2281 0
 	adrp	x26, jiffies
 .LBB1731:
 .LBB1727:
@@ -7300,7 +7364,7 @@ ebc_probe:
 	stp	xzr, xzr, [x0]
 .LBE1727:
 .LBE1731:
-	.loc 1 2240 0
+	.loc 1 2281 0
 	mov	x27, 268435455
 .LBB1732:
 .LBB1728:
@@ -7318,15 +7382,15 @@ ebc_probe:
 	stp	xzr, xzr, [x0, 176]
 	stp	xzr, xzr, [x0, 192]
 	.loc 4 43 0
-	str	x1, [x20, 400]
+	str	x1, [x20, 416]
 	.loc 4 45 0
 	bl	wakeup_source_add
-.LVL610:
+.LVL614:
 .LBE1728:
 .LBE1732:
-	.loc 1 2236 0
-	str	wzr, [x19, 424]
-	.loc 1 2239 0
+	.loc 1 2277 0
+	str	wzr, [x19, 440]
+	.loc 1 2280 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -7334,17 +7398,17 @@ ebc_probe:
 	adrp	x1, ebc_vdd_power_timeout
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
-.LVL611:
-	.loc 1 2240 0
+.LVL615:
+	.loc 1 2281 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
-	.loc 1 2243 0
-	add	x24, x20, 672
-	.loc 1 2240 0
+	.loc 1 2284 0
+	add	x24, x20, 688
+	.loc 1 2281 0
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL612:
-	.loc 1 2243 0
+.LVL616:
+	.loc 1 2284 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -7352,158 +7416,158 @@ ebc_probe:
 	adrp	x1, ebc_frame_timeout
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
-.LVL613:
-	.loc 1 2244 0
+.LVL617:
+	.loc 1 2285 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL614:
+.LVL618:
 .LBE1722:
 .LBE1721:
 .LBB1733:
 .LBB1734:
-	.loc 1 2254 0
+	.loc 1 2295 0
 	adrp	x0, saved_command_line
 	adrp	x1, .LC47
-	.loc 1 2251 0
+	.loc 1 2292 0
 	stp	wzr, wzr, [x29, 100]
-.LVL615:
-	.loc 1 2254 0
+.LVL619:
+	.loc 1 2295 0
 	add	x1, x1, :lo12:.LC47
 	ldr	x24, [x0, #:lo12:saved_command_line]
 	mov	x0, x24
 	bl	strstr
-.LVL616:
-	.loc 1 2255 0
+.LVL620:
+	.loc 1 2296 0
 	adrp	x1, .LC48
-	.loc 1 2254 0
+	.loc 1 2295 0
 	mov	x26, x0
-.LVL617:
-	.loc 1 2255 0
+.LVL621:
+	.loc 1 2296 0
 	add	x1, x1, :lo12:.LC48
 	mov	x0, x24
 	bl	strstr
-.LVL618:
+.LVL622:
 	mov	x28, x0
-.LVL619:
-	.loc 1 2260 0
-	cbz	x26, .L623
-	.loc 1 2261 0
+.LVL623:
+	.loc 1 2301 0
+	cbz	x26, .L627
+	.loc 1 2302 0
 	add	x2, x29, 100
 	adrp	x1, .LC49
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC49
 	bl	sscanf
-.LVL620:
-	.loc 1 2262 0
+.LVL624:
+	.loc 1 2303 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
-	bls	.L699
-.L623:
-	.loc 1 2274 0
+	bls	.L703
+.L627:
+	.loc 1 2315 0
 	mov	w24, 0
-.LVL621:
+.LVL625:
 	mov	x27, 0
-.LVL622:
-	.loc 1 2258 0
+.LVL626:
+	.loc 1 2299 0
 	mov	x26, 0
-.LVL623:
-	.loc 1 2274 0
-	cbz	x28, .L643
-.LVL624:
-.L642:
-	.loc 1 2275 0
+.LVL627:
+	.loc 1 2315 0
+	cbz	x28, .L647
+.LVL628:
+.L646:
+	.loc 1 2316 0
 	add	x2, x29, 104
 	mov	x0, x28
 	adrp	x1, .LC52
 	add	x1, x1, :lo12:.LC52
 	bl	sscanf
-.LVL625:
-	.loc 1 2253 0
+.LVL629:
+	.loc 1 2294 0
 	mov	w28, 0
-.LVL626:
-	.loc 1 2276 0
+.LVL630:
+	.loc 1 2317 0
 	ldr	w2, [x29, 104]
-	.loc 1 2258 0
+	.loc 1 2299 0
 	mov	x26, 0
-.LVL627:
-	.loc 1 2276 0
+.LVL631:
+	.loc 1 2317 0
 	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
-	bls	.L700
-.L627:
-	.loc 1 2288 0
-	cbnz	w24, .L626
-.LVL628:
-.L643:
-	.loc 1 2289 0
-	ldr	x0, [x19, 88]
+	bls	.L704
+.L631:
+	.loc 1 2329 0
+	cbnz	w24, .L630
+.LVL632:
+.L647:
+	.loc 1 2330 0
+	ldr	x0, [x19, 104]
 	adrp	x1, .LC55
 	add	x1, x1, :lo12:.LC55
 	bl	_dev_info
-.LVL629:
-	.loc 1 2290 0
+.LVL633:
+	.loc 1 2331 0
 	ldr	x0, [x20, 16]
 	bl	ebc_pmic_verity_vcom
-.LVL630:
+.LVL634:
 .LBB1735:
 .LBB1736:
-	.loc 1 1634 0
+	.loc 1 1636 0
 	bl	ebc_empty_buf_get
-.LVL631:
+.LVL635:
 	mov	x24, x0
-.LVL632:
-	.loc 1 1635 0
+.LVL636:
+	.loc 1 1637 0
 	ldp	w2, w0, [x20, 108]
 	mov	w1, 255
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memset
-.LVL633:
-	.loc 1 1638 0
+.LVL637:
+	.loc 1 1640 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 1636 0
+	.loc 1 1638 0
 	mov	w0, 17
 	str	w0, [x24, 40]
-	.loc 1 1641 0
+	.loc 1 1643 0
 	mov	x0, x24
-	.loc 1 1639 0
+	.loc 1 1641 0
 	ldr	w1, [x20, 108]
 	str	w1, [x24, 56]
-	.loc 1 1640 0
+	.loc 1 1642 0
 	ldr	w1, [x20, 112]
 	str	w1, [x24, 60]
-	.loc 1 1641 0
+	.loc 1 1643 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL634:
-.L629:
+.LVL638:
+.L633:
 .LBE1736:
 .LBE1735:
-	.loc 1 2307 0
-	cbnz	w28, .L701
-.L631:
-	.loc 1 2320 0
-	ldr	w0, [x19, 80]
+	.loc 1 2348 0
+	cbnz	w28, .L705
+.L635:
+	.loc 1 2361 0
+	ldr	w0, [x19, 96]
 	adrp	x21, .LANCHOR1
-	cbz	w0, .L702
-.L633:
-	.loc 1 2325 0
-	cbz	x27, .L634
-	.loc 1 2326 0
+	cbz	w0, .L706
+.L637:
+	.loc 1 2366 0
+	cbz	x27, .L638
+	.loc 1 2367 0
 	mov	x0, x27
 	bl	kfree
-.LVL635:
-.L634:
-	.loc 1 2327 0
-	cbz	x26, .L625
-	.loc 1 2328 0
+.LVL639:
+.L638:
+	.loc 1 2368 0
+	cbz	x26, .L629
+	.loc 1 2369 0
 	mov	x0, x26
 	bl	kfree
-.LVL636:
-.L625:
+.LVL640:
+.L629:
 .LBE1734:
 .LBE1733:
 .LBB1747:
@@ -7516,81 +7580,88 @@ ebc_probe:
 .LBE1747:
 .LBB1750:
 .LBB1751:
-	.loc 1 2071 0
+	.loc 1 2108 0
 	add	x21, x21, :lo12:.LANCHOR1
 	add	x0, x21, 224
+	.loc 1 2109 0
+	add	x22, x21, 512
+	.loc 1 2108 0
 	bl	misc_register
-.LVL637:
-	.loc 1 2073 0
-	ldr	x0, [x20, 272]
-	add	x1, x21, 400
+.LVL641:
+	.loc 1 2109 0
+	add	x0, x21, 400
+	bl	misc_register
+.LVL642:
+	.loc 1 2111 0
+	ldr	x0, [x20, 288]
+	add	x1, x21, 480
 	bl	device_create_file
-.LVL638:
-	.loc 1 2074 0
-	ldr	x0, [x20, 272]
-	add	x1, x21, 432
+.LVL643:
+	.loc 1 2112 0
+	ldr	x0, [x20, 288]
+	mov	x1, x22
 	bl	device_create_file
-.LVL639:
-	.loc 1 2075 0
-	ldr	x0, [x20, 272]
-	add	x1, x21, 464
+.LVL644:
+	.loc 1 2113 0
+	ldr	x0, [x20, 288]
+	add	x1, x21, 544
 	bl	device_create_file
-.LVL640:
-	.loc 1 2076 0
-	ldr	x0, [x20, 272]
-	add	x1, x21, 496
+.LVL645:
+	.loc 1 2114 0
+	ldr	x0, [x20, 288]
+	add	x1, x21, 576
 	bl	device_create_file
-.LVL641:
-	.loc 1 2077 0
-	ldr	x0, [x20, 272]
-	add	x1, x21, 528
+.LVL646:
+	.loc 1 2115 0
+	ldr	x0, [x20, 288]
+	add	x1, x21, 608
 	bl	device_create_file
-.LVL642:
-	.loc 1 2078 0
-	ldr	x0, [x20, 272]
-	add	x1, x21, 560
+.LVL647:
+	.loc 1 2116 0
+	ldr	x0, [x20, 288]
+	add	x1, x21, 640
 	bl	device_create_file
-.LVL643:
-	.loc 1 2079 0
-	ldr	x0, [x20, 272]
-	add	x1, x21, 592
+.LVL648:
+	.loc 1 2117 0
+	ldr	x0, [x20, 288]
+	add	x1, x21, 672
 	bl	device_create_file
-.LVL644:
+.LVL649:
 .LBE1751:
 .LBE1750:
-	.loc 1 2457 0
-	ldr	x0, [x19, 88]
+	.loc 1 2498 0
+	ldr	x0, [x19, 104]
 	adrp	x2, .LC16
 	adrp	x1, .LC56
 	add	x2, x2, :lo12:.LC16
 	add	x1, x1, :lo12:.LC56
 	bl	_dev_info
-.LVL645:
-	.loc 1 2459 0
-	b	.L595
-.LVL646:
-.L702:
+.LVL650:
+	.loc 1 2500 0
+	b	.L599
+.LVL651:
+.L706:
 .LBB1752:
 .LBB1743:
-	.loc 1 2321 0
+	.loc 1 2362 0
 	mov	w2, 1
-	str	w2, [x19, 80]
-	.loc 1 2322 0
+	str	w2, [x19, 96]
+	.loc 1 2363 0
 	add	x0, x21, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL647:
-	b	.L633
-.LVL648:
-.L699:
-	.loc 1 2264 0
-	ldr	x0, [x19, 88]
+.LVL652:
+	b	.L637
+.LVL653:
+.L703:
+	.loc 1 2305 0
+	ldr	x0, [x19, 104]
 	adrp	x1, .LC50
 	add	x1, x1, :lo12:.LC50
 	bl	_dev_info
-.LVL649:
-	.loc 1 2265 0
+.LVL654:
+	.loc 1 2306 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
 .LBB1737:
@@ -7602,77 +7673,77 @@ ebc_probe:
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL650:
+.LVL655:
 	mov	x27, x0
-.LVL651:
+.LVL656:
 .LBE1739:
 .LBE1738:
 .LBE1737:
-	.loc 1 2266 0
-	cbz	x0, .L703
-	.loc 1 2270 0
+	.loc 1 2307 0
+	cbz	x0, .L707
+	.loc 1 2311 0
 	ldp	w2, w1, [x21, 84]
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 100]
-.LVL652:
+.LVL657:
 	sub	x1, x1, x3
-.LVL653:
+.LVL658:
 	ldr	x3, [x19, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL654:
-	.loc 1 2274 0
-	cbnz	x28, .L704
-	.loc 1 2253 0
+.LVL659:
+	.loc 1 2315 0
+	cbnz	x28, .L708
+	.loc 1 2294 0
 	mov	w28, 0
-.LVL655:
-	.loc 1 2258 0
+.LVL660:
+	.loc 1 2299 0
 	mov	x26, 0
-.LVL656:
-.L626:
-	.loc 1 2295 0
+.LVL661:
+.L630:
+	.loc 1 2336 0
 	bl	ebc_empty_buf_get
-.LVL657:
+.LVL662:
 	mov	x24, x0
-.LVL658:
-	.loc 1 2296 0
-	cbz	x0, .L629
-	.loc 1 2297 0
+.LVL663:
+	.loc 1 2337 0
+	cbz	x0, .L633
+	.loc 1 2338 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL659:
-	.loc 1 2300 0
+.LVL664:
+	.loc 1 2341 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2298 0
+	.loc 1 2339 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2303 0
+	.loc 1 2344 0
 	mov	x0, x24
-	.loc 1 2301 0
+	.loc 1 2342 0
 	ldr	w1, [x21, 84]
 	str	w1, [x24, 56]
-	.loc 1 2302 0
+	.loc 1 2343 0
 	ldr	w1, [x21, 88]
 	str	w1, [x24, 60]
-	.loc 1 2303 0
+	.loc 1 2344 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL660:
-	b	.L629
-.LVL661:
-.L700:
-	.loc 1 2278 0
-	ldr	x0, [x19, 88]
+.LVL665:
+	b	.L633
+.LVL666:
+.L704:
+	.loc 1 2319 0
+	ldr	x0, [x19, 104]
 	adrp	x1, .LC53
 	add	x1, x1, :lo12:.LC53
 	bl	_dev_info
-.LVL662:
-	.loc 1 2279 0
+.LVL667:
+	.loc 1 2320 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
 .LBB1740:
@@ -7683,275 +7754,275 @@ ebc_probe:
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL663:
+.LVL668:
 	mov	x26, x0
 .LBE1742:
 .LBE1741:
 .LBE1740:
-	.loc 1 2280 0
-	cbz	x0, .L705
-	.loc 1 2284 0
+	.loc 1 2321 0
+	cbz	x0, .L709
+	.loc 1 2325 0
 	ldp	w2, w1, [x21, 84]
-	.loc 1 2277 0
+	.loc 1 2318 0
 	mov	w28, 1
-	.loc 1 2284 0
+	.loc 1 2325 0
 	ldr	x3, [x20, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
-.LVL664:
+.LVL669:
 	sub	x1, x1, x3
-.LVL665:
+.LVL670:
 	ldr	x3, [x19, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL666:
-	b	.L627
-.LVL667:
-.L599:
+.LVL671:
+	b	.L631
+.LVL672:
+.L603:
 .LBE1743:
 .LBE1752:
-	.loc 1 2365 0
+	.loc 1 2406 0
 	mov	w25, -517
-	b	.L595
-.LVL668:
-.L617:
+	b	.L599
+.LVL673:
+.L621:
 .LBB1753:
-.LBB1690:
-	.loc 1 2153 0
+.LBB1688:
+	.loc 1 2194 0
 	mov	w25, -12
-	b	.L614
-.LVL669:
-.L701:
-.LBE1690:
+	b	.L618
+.LVL674:
+.L705:
+.LBE1688:
 .LBE1753:
 .LBB1754:
 .LBB1744:
-	.loc 1 2308 0
+	.loc 1 2349 0
 	bl	ebc_empty_buf_get
-.LVL670:
+.LVL675:
 	mov	x24, x0
-.LVL671:
-	.loc 1 2309 0
-	cbz	x0, .L631
-	.loc 1 2310 0
+.LVL676:
+	.loc 1 2350 0
+	cbz	x0, .L635
+	.loc 1 2351 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL672:
-	.loc 1 2313 0
+.LVL677:
+	.loc 1 2354 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2311 0
+	.loc 1 2352 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 2314 0
+	.loc 1 2355 0
 	ldr	w0, [x21, 84]
 	str	w0, [x24, 56]
-	.loc 1 2316 0
+	.loc 1 2357 0
 	mov	x0, x24
-	.loc 1 2315 0
+	.loc 1 2356 0
 	ldr	w1, [x21, 88]
 	str	w1, [x24, 60]
-	.loc 1 2316 0
+	.loc 1 2357 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL673:
-	b	.L631
-.LVL674:
-.L645:
+.LVL678:
+	b	.L635
+.LVL679:
+.L649:
 .LBE1744:
 .LBE1754:
-	.loc 1 2351 0
+	.loc 1 2392 0
 	mov	w25, -12
-	b	.L595
-.LVL675:
-.L600:
-	.loc 1 2375 0
+	b	.L599
+.LVL680:
+.L604:
+	.loc 1 2416 0
 	adrp	x1, .LC28
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC28
-	.loc 1 2376 0
+	.loc 1 2417 0
 	mov	w25, -22
-	.loc 1 2375 0
+	.loc 1 2416 0
 	bl	_dev_err
-.LVL676:
-	.loc 1 2376 0
-	b	.L595
-.LVL677:
-.L697:
+.LVL681:
+	.loc 1 2417 0
+	b	.L599
+.LVL682:
+.L701:
 .LBB1755:
 .LBB1699:
-	.loc 1 2114 0
-	ldr	x0, [x20, 272]
+	.loc 1 2155 0
+	ldr	x0, [x19, 104]
 	adrp	x1, .LC42
 	add	x1, x1, :lo12:.LC42
 	bl	_dev_err
-.LVL678:
-	.loc 1 2115 0
-	ldr	x0, [x20, 272]
+.LVL683:
+	.loc 1 2156 0
+	ldr	x0, [x19, 104]
 	mov	w2, w26
-	ldr	x1, [x20, 376]
+	ldr	x1, [x19, 208]
 	bl	epd_lut_from_file_init
-.LVL679:
-	.loc 1 2116 0
-	tbz	w0, #31, .L620
-	.loc 1 2117 0
-	ldr	x0, [x20, 272]
+.LVL684:
+	.loc 1 2157 0
+	tbz	w0, #31, .L624
+	.loc 1 2158 0
+	ldr	x0, [x19, 104]
 	adrp	x1, .LC43
-	.loc 1 2118 0
+	.loc 1 2159 0
 	mov	w25, -1
-	.loc 1 2117 0
+	.loc 1 2158 0
 	add	x1, x1, :lo12:.LC43
 	bl	_dev_err
-.LVL680:
-	b	.L618
+.LVL685:
+	b	.L622
 	.p2align 3
-.L698:
+.L702:
 .LBE1699:
 .LBE1755:
 .LBB1756:
 .LBB1719:
-	.loc 1 2206 0
-	ldr	x0, [x19, 88]
+	.loc 1 2247 0
+	ldr	x0, [x19, 104]
 	adrp	x1, .LC44
 	add	x1, x1, :lo12:.LC44
 	bl	_dev_err
-.LVL681:
-.L621:
+.LVL686:
+.L625:
 .LBE1719:
 .LBE1756:
-	.loc 1 2442 0
+	.loc 1 2483 0
 	adrp	x1, .LC76
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC76
-	.loc 1 2443 0
+	.loc 1 2484 0
 	mov	w25, -1
-	.loc 1 2442 0
+	.loc 1 2483 0
 	bl	_dev_err
-.LVL682:
-	.loc 1 2443 0
-	b	.L595
-.LVL683:
-.L622:
+.LVL687:
+	.loc 1 2484 0
+	b	.L599
+.LVL688:
+.L626:
 .LBB1757:
 .LBB1720:
-	.loc 1 2215 0
-	ldr	x0, [x19, 88]
-.LVL684:
+	.loc 1 2256 0
+	ldr	x0, [x19, 104]
+.LVL689:
 	adrp	x1, .LC75
-	.loc 1 2213 0
-	str	x24, [x19, 120]
-	.loc 1 2215 0
+	.loc 1 2254 0
+	str	x24, [x19, 136]
+	.loc 1 2256 0
 	add	x1, x1, :lo12:.LC75
 	bl	_dev_err
-.LVL685:
-	b	.L621
-.LVL686:
-.L690:
+.LVL690:
+	b	.L625
+.LVL691:
+.L694:
 .LBE1720:
 .LBE1757:
-	.loc 1 2358 0
+	.loc 1 2399 0
 	adrp	x1, .LC26
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC26
-	.loc 1 2359 0
+	.loc 1 2400 0
 	mov	w25, -19
-	.loc 1 2358 0
+	.loc 1 2399 0
 	bl	_dev_err
-.LVL687:
-	.loc 1 2359 0
-	b	.L595
-.LVL688:
-.L646:
+.LVL692:
+	.loc 1 2400 0
+	b	.L599
+.LVL693:
+.L650:
 .LBB1758:
-.LBB1691:
-	.loc 1 2138 0
+.LBB1689:
+	.loc 1 2179 0
 	mov	w25, -19
-	b	.L614
-.LVL689:
-.L647:
-.LBE1691:
+	b	.L618
+.LVL694:
+.L651:
+.LBE1689:
 .LBE1758:
 .LBB1759:
 .LBB1700:
-	.loc 1 2095 0
+	.loc 1 2133 0
 	mov	w25, -19
-	b	.L618
-.LVL690:
-.L705:
+	b	.L622
+.LVL695:
+.L709:
 .LBE1700:
 .LBE1759:
 .LBB1760:
 .LBB1745:
-	.loc 1 2281 0
-	ldr	x0, [x19, 88]
-.LVL691:
+	.loc 1 2322 0
+	ldr	x0, [x19, 104]
+.LVL696:
 	adrp	x1, .LC54
 	adrp	x21, .LANCHOR1
 	add	x1, x1, :lo12:.LC54
 	bl	_dev_err
-.LVL692:
-	b	.L625
-.LVL693:
-.L696:
+.LVL697:
+	b	.L629
+.LVL698:
+.L700:
 .LBE1745:
 .LBE1760:
 .LBB1761:
 .LBB1701:
-	.loc 1 2108 0
-	ldr	x0, [x20, 272]
+	.loc 1 2149 0
+	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
 	adrp	x1, .LC41
-	mov	w3, 2108
+	mov	w3, 2149
 	add	x2, x2, 32
 	add	x1, x1, :lo12:.LC41
-	.loc 1 2109 0
+	.loc 1 2150 0
 	mov	w25, -12
-	.loc 1 2108 0
+	.loc 1 2149 0
 	bl	_dev_err
-.LVL694:
-	b	.L618
-.LVL695:
-.L693:
+.LVL699:
+	b	.L622
+.LVL700:
+.L697:
 .LBE1701:
 .LBE1761:
-	.loc 1 2460 0
+	.loc 1 2501 0
 	bl	__stack_chk_fail
-.LVL696:
-.L704:
+.LVL701:
+.L708:
 .LBB1762:
 .LBB1746:
-	.loc 1 2263 0
+	.loc 1 2304 0
 	mov	w24, 1
-.LVL697:
-	b	.L642
-.LVL698:
-.L703:
-	.loc 1 2267 0
-	ldr	x0, [x19, 88]
-.LVL699:
+.LVL702:
+	b	.L646
+.LVL703:
+.L707:
+	.loc 1 2308 0
+	ldr	x0, [x19, 104]
+.LVL704:
 	adrp	x1, .LC51
 	adrp	x21, .LANCHOR1
 	add	x1, x1, :lo12:.LC51
 	bl	_dev_err
-.LVL700:
-	b	.L625
+.LVL705:
+	b	.L629
 .LBE1746:
 .LBE1762:
 	.cfi_endproc
-.LFE2848:
+.LFE2850:
 	.size	ebc_probe, .-ebc_probe
 	.align	2
 	.p2align 3,,7
-	.type	ebc_power_set.constprop.12, %function
-ebc_power_set.constprop.12:
-.LFB2866:
-	.loc 1 180 0
+	.type	ebc_power_set.constprop.11, %function
+ebc_power_set.constprop.11:
+.LFB2869:
+	.loc 1 182 0
 	.cfi_startproc
-.LVL701:
+.LVL706:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -7961,19 +8032,19 @@ ebc_power_set.constprop.12:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-	.loc 1 186 0
+	.loc 1 188 0
 	add	x20, x0, 184
-	.loc 1 180 0
+	.loc 1 182 0
 	mov	x19, x0
-	.loc 1 186 0
-	ldr	w0, [x20, 424]
-.LVL702:
-	cbz	w0, .L709
-.L707:
-	.loc 1 190 0
+	.loc 1 188 0
+	ldr	w0, [x20, 440]
+.LVL707:
+	cbz	w0, .L713
+.L711:
+	.loc 1 192 0
 	mov	w1, 1
-	str	w1, [x20, 184]
-	.loc 1 191 0
+	str	w1, [x20, 200]
+	.loc 1 193 0
 	ldr	x2, [x19, 16]
 .LBB1763:
 .LBB1764:
@@ -7981,10 +8052,10 @@ ebc_power_set.constprop.12:
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL703:
+.LVL708:
 .LBE1764:
 .LBE1763:
-	.loc 1 192 0
+	.loc 1 194 0
 	ldr	x2, [x19, 8]
 .LBB1765:
 .LBB1766:
@@ -7993,19 +8064,19 @@ ebc_power_set.constprop.12:
 	mov	x0, x2
 	ldr	x2, [x2, 48]
 	blr	x2
-.LVL704:
+.LVL709:
 .LBE1766:
 .LBE1765:
-	.loc 1 193 0
+	.loc 1 195 0
 	ldr	x0, [x19]
 	adrp	x1, .LC78
 	add	x1, x1, :lo12:.LC78
 	bl	_dev_info
-.LVL705:
-	.loc 1 208 0
+.LVL710:
+	.loc 1 210 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
-.LVL706:
+.LVL711:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -8014,250 +8085,262 @@ ebc_power_set.constprop.12:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL707:
+.LVL712:
 	.p2align 3
-.L709:
+.L713:
 	.cfi_restore_state
-	.loc 1 187 0
+	.loc 1 189 0
 	mov	w0, 1
-	str	w0, [x20, 424]
+	str	w0, [x20, 440]
 .LBB1767:
 .LBB1768:
 	.loc 4 58 0
-	add	x0, x19, 400
+	add	x0, x19, 416
 	bl	__pm_stay_awake
-.LVL708:
-	b	.L707
+.LVL713:
+	b	.L711
 .LBE1768:
 .LBE1767:
 	.cfi_endproc
-.LFE2866:
-	.size	ebc_power_set.constprop.12, .-ebc_power_set.constprop.12
+.LFE2869:
+	.size	ebc_power_set.constprop.11, .-ebc_power_set.constprop.11
+	.align	2
+	.p2align 3,,7
+	.type	ebc_open, %function
+ebc_open:
+.LFB2868:
+	.cfi_startproc
+	mov	w0, 0
+	str	xzr, [x1, 104]
+	ret
+	.cfi_endproc
+.LFE2868:
+	.size	ebc_open, .-ebc_open
 	.align	2
 	.p2align 3,,7
 	.global	refresh_new_image2
 	.type	refresh_new_image2, %function
 refresh_new_image2:
 .LFB2807:
-	.loc 1 213 0
+	.loc 1 215 0
 	.cfi_startproc
-.LVL709:
-	.loc 1 220 0
-	ldp	w16, w5, [x4, 52]
-.LVL710:
+.LVL714:
+	.loc 1 222 0
+	ldp	w16, w5, [x4, 68]
+.LVL715:
 	cmp	w5, 0
 	add	w11, w5, 7
 	csel	w11, w11, w5, lt
-.LVL711:
-	.loc 1 222 0
+.LVL716:
+	.loc 1 224 0
 	cmp	w16, 0
-	.loc 1 220 0
-	asr	w11, w11, 3
-.LVL712:
 	.loc 1 222 0
-	ble	.L710
+	asr	w11, w11, 3
+.LVL717:
+	.loc 1 224 0
+	ble	.L715
 	sub	w14, w11, #1
 	mov	w15, 0
-.LVL713:
+.LVL718:
 	add	x14, x14, 1
-	.loc 1 267 0
+	.loc 1 269 0
 	mov	w13, 234881024
 	lsl	x17, x14, 3
 	lsl	x14, x14, 2
-	.loc 1 273 0
+	.loc 1 275 0
 	mov	w12, -536870912
-.LVL714:
+.LVL719:
 	.p2align 2
-.L712:
-	.loc 1 223 0 discriminator 1
+.L717:
+	.loc 1 225 0 discriminator 1
 	mov	x6, 0
 	cmp	w11, 0
-	bgt	.L733
-	b	.L730
-.LVL715:
+	bgt	.L738
+	b	.L735
+.LVL720:
 	.p2align 3
-.L713:
-	.loc 1 236 0
+.L718:
+	.loc 1 238 0
 	tst	x5, 65280
-	bne	.L714
-	.loc 1 237 0
+	bne	.L719
+	.loc 1 239 0
 	and	w10, w4, 240
 	cmp	w10, 224
-	beq	.L735
-	.loc 1 240 0
-	orr	w7, w7, 240
-.L714:
+	beq	.L740
 	.loc 1 242 0
+	orr	w7, w7, 240
+.L719:
+	.loc 1 244 0
 	tst	x5, 16711680
-	bne	.L716
-	.loc 1 243 0
+	bne	.L721
+	.loc 1 245 0
 	and	w10, w4, 3840
 	cmp	w10, 3584
-	beq	.L736
-	.loc 1 246 0
-	orr	w7, w7, 3840
-.L716:
+	beq	.L741
 	.loc 1 248 0
+	orr	w7, w7, 3840
+.L721:
+	.loc 1 250 0
 	tst	x5, 4278190080
-	bne	.L718
-	.loc 1 249 0
+	bne	.L723
+	.loc 1 251 0
 	and	w10, w4, 61440
 	cmp	w10, 57344
-	beq	.L737
-	.loc 1 252 0
-	orr	w7, w7, 61440
-.L718:
+	beq	.L742
 	.loc 1 254 0
+	orr	w7, w7, 61440
+.L723:
+	.loc 1 256 0
 	tst	x5, 1095216660480
-	bne	.L720
-	.loc 1 255 0
+	bne	.L725
+	.loc 1 257 0
 	and	w10, w4, 983040
 	cmp	w10, 917504
-	beq	.L738
-	.loc 1 258 0
-	orr	w7, w7, 983040
-.L720:
+	beq	.L743
 	.loc 1 260 0
+	orr	w7, w7, 983040
+.L725:
+	.loc 1 262 0
 	tst	x5, 280375465082880
-	bne	.L722
-	.loc 1 261 0
+	bne	.L727
+	.loc 1 263 0
 	and	w10, w4, 15728640
 	cmp	w10, 14680064
-	beq	.L739
-	.loc 1 264 0
-	orr	w7, w7, 15728640
-.L722:
+	beq	.L744
 	.loc 1 266 0
+	orr	w7, w7, 15728640
+.L727:
+	.loc 1 268 0
 	tst	x5, 71776119061217280
-	bne	.L724
-	.loc 1 267 0
+	bne	.L729
+	.loc 1 269 0
 	and	w10, w4, 251658240
 	cmp	w10, w13
-	beq	.L740
-	.loc 1 270 0
-	orr	w7, w7, 251658240
-.L724:
+	beq	.L745
 	.loc 1 272 0
+	orr	w7, w7, 251658240
+.L729:
+	.loc 1 274 0
 	tst	x5, -72057594037927936
-	bne	.L726
-	.loc 1 273 0
+	bne	.L731
+	.loc 1 275 0
 	and	w5, w4, -268435456
-.LVL716:
+.LVL721:
 	cmp	w5, w12
-	beq	.L741
-	.loc 1 276 0
+	beq	.L746
+	.loc 1 278 0
 	orr	w7, w7, -268435456
-.LVL717:
-.L726:
-	.loc 1 280 0 discriminator 2
+.LVL722:
+.L731:
+	.loc 1 282 0 discriminator 2
 	and	w4, w4, w9
-.LVL718:
+.LVL723:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
-	.loc 1 281 0 discriminator 2
+	.loc 1 283 0 discriminator 2
 	str	w4, [x0, x6, lsl 2]
 	add	x6, x6, 1
-	.loc 1 223 0 discriminator 2
+	.loc 1 225 0 discriminator 2
 	cmp	w11, w6
-	ble	.L742
-.LVL719:
-.L733:
-	.loc 1 224 0
+	ble	.L747
+.LVL724:
+.L738:
+	.loc 1 226 0
 	ldr	x5, [x3, x6, lsl 3]
-	.loc 1 228 0
+	.loc 1 230 0
 	mov	w7, 0
-	.loc 1 225 0
+	.loc 1 227 0
 	ldr	w4, [x1, x6, lsl 2]
-.LVL720:
-	.loc 1 226 0
+.LVL725:
+	.loc 1 228 0
 	ldr	w8, [x0, x6, lsl 2]
-	.loc 1 230 0
+	.loc 1 232 0
 	and	x10, x5, 255
-	.loc 1 227 0
+	.loc 1 229 0
 	ldr	w9, [x2, x6, lsl 2]
-.LVL721:
-	.loc 1 230 0
-	cbnz	x10, .L713
-.LVL722:
-	.loc 1 231 0
+.LVL726:
+	.loc 1 232 0
+	cbnz	x10, .L718
+.LVL727:
+	.loc 1 233 0
 	and	w10, w4, 15
-	.loc 1 234 0
+	.loc 1 236 0
 	mov	w7, 15
-	.loc 1 231 0
+	.loc 1 233 0
 	cmp	w10, 14
-	bne	.L713
-	.loc 1 232 0
+	bne	.L718
+	.loc 1 234 0
 	orr	w8, w8, w7
-.LVL723:
-	.loc 1 228 0
+.LVL728:
+	.loc 1 230 0
 	mov	w7, 0
-.LVL724:
-	b	.L713
+.LVL729:
+	b	.L718
 	.p2align 3
-.L740:
-	.loc 1 268 0
+.L745:
+	.loc 1 270 0
 	orr	w8, w8, 251658240
-	b	.L724
-.LVL725:
+	b	.L729
+.LVL730:
 	.p2align 3
-.L741:
-	.loc 1 274 0
+.L746:
+	.loc 1 276 0
 	orr	w8, w8, -268435456
-.LVL726:
-	.loc 1 280 0
+.LVL731:
+	.loc 1 282 0
 	and	w4, w4, w9
-.LVL727:
+.LVL732:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
-	.loc 1 281 0
+	.loc 1 283 0
 	str	w4, [x0, x6, lsl 2]
 	add	x6, x6, 1
-	.loc 1 223 0
+	.loc 1 225 0
 	cmp	w11, w6
-	bgt	.L733
-.LVL728:
+	bgt	.L738
+.LVL733:
 	.p2align 2
-.L742:
+.L747:
 	add	x3, x3, x17
 	add	x1, x1, x14
 	add	x2, x2, x14
 	add	x0, x0, x14
-.LVL729:
-.L730:
-	.loc 1 222 0 discriminator 2
+.LVL734:
+.L735:
+	.loc 1 224 0 discriminator 2
 	add	w15, w15, 1
 	cmp	w16, w15
-	bne	.L712
-.L710:
+	bne	.L717
+.L715:
 	ret
-.LVL730:
+.LVL735:
 	.p2align 3
-.L736:
-	.loc 1 244 0
+.L741:
+	.loc 1 246 0
 	orr	w8, w8, 3840
-	b	.L716
+	b	.L721
 	.p2align 3
-.L737:
-	.loc 1 250 0
+.L742:
+	.loc 1 252 0
 	orr	w8, w8, 61440
-	b	.L718
+	b	.L723
 	.p2align 3
-.L738:
-	.loc 1 256 0
+.L743:
+	.loc 1 258 0
 	orr	w8, w8, 983040
-	b	.L720
+	b	.L725
 	.p2align 3
-.L739:
-	.loc 1 262 0
+.L744:
+	.loc 1 264 0
 	orr	w8, w8, 15728640
-	b	.L722
+	b	.L727
 	.p2align 3
-.L735:
-	.loc 1 238 0
+.L740:
+	.loc 1 240 0
 	orr	w8, w8, 240
-	b	.L714
+	b	.L719
 	.cfi_endproc
 .LFE2807:
 	.size	refresh_new_image2, .-refresh_new_image2
@@ -8267,103 +8350,103 @@ refresh_new_image2:
 	.type	refresh_new_image_auto, %function
 refresh_new_image_auto:
 .LFB2808:
-	.loc 1 288 0
+	.loc 1 290 0
 	.cfi_startproc
-.LVL731:
-	.loc 1 295 0
-	ldp	w13, w4, [x3, 52]
+.LVL736:
+	.loc 1 297 0
+	ldp	w13, w4, [x3, 68]
 	cmp	w4, 0
 	add	w9, w4, 7
 	csel	w9, w9, w4, lt
-.LVL732:
-	.loc 1 297 0
+.LVL737:
+	.loc 1 299 0
 	cmp	w13, 0
-	.loc 1 295 0
-	asr	w9, w9, 3
-.LVL733:
 	.loc 1 297 0
-	ble	.L743
+	asr	w9, w9, 3
+.LVL738:
+	.loc 1 299 0
+	ble	.L748
 	sub	w12, w9, #1
 	mov	w11, 0
-.LVL734:
+.LVL739:
 	add	x12, x12, 1
-	.loc 1 305 0
+	.loc 1 307 0
 	mov	w10, 15
 	lsl	x14, x12, 3
 	lsl	x12, x12, 2
 	.p2align 2
-.L745:
-	.loc 1 298 0 discriminator 1
+.L750:
+	.loc 1 300 0 discriminator 1
 	mov	x6, 0
 	cmp	w9, 0
-	ble	.L756
+	ble	.L761
 	.p2align 2
-.L758:
-	.loc 1 299 0
-	ldr	x4, [x2, x6, lsl 3]
-.LVL735:
+.L763:
 	.loc 1 301 0
+	ldr	x4, [x2, x6, lsl 3]
+.LVL740:
+	.loc 1 303 0
 	ldr	w7, [x0, x6, lsl 2]
-	.loc 1 300 0
+	.loc 1 302 0
 	ldr	w3, [x1, x6, lsl 2]
-.LVL736:
-	.loc 1 304 0
+.LVL741:
+	.loc 1 306 0
 	and	x5, x4, 255
-	.loc 1 305 0
+	.loc 1 307 0
 	cmp	x5, 0
-.LVL737:
+.LVL742:
 	eor	w5, w3, w7
 	csel	w3, wzr, w10, ne
-.LVL738:
-	.loc 1 308 0
+.LVL743:
+	.loc 1 310 0
 	orr	w8, w3, 240
 	tst	x4, 65280
 	csel	w3, w8, w3, eq
-	.loc 1 311 0
+	.loc 1 313 0
 	tst	x4, 16711680
 	orr	w8, w3, 3840
 	csel	w3, w8, w3, eq
-	.loc 1 314 0
+	.loc 1 316 0
 	tst	x4, 4278190080
 	orr	w8, w3, 61440
 	csel	w3, w8, w3, eq
-	.loc 1 317 0
+	.loc 1 319 0
 	tst	x4, 1095216660480
 	orr	w8, w3, 983040
 	csel	w3, w8, w3, eq
-	.loc 1 320 0
+	.loc 1 322 0
 	tst	x4, 280375465082880
 	orr	w8, w3, 15728640
 	csel	w3, w8, w3, eq
-	.loc 1 323 0
+	.loc 1 325 0
 	tst	x4, 71776119061217280
 	orr	w8, w3, 251658240
 	csel	w3, w8, w3, eq
-	.loc 1 326 0
+	.loc 1 328 0
 	tst	x4, -72057594037927936
 	orr	w4, w3, -268435456
-.LVL739:
+.LVL744:
 	csel	w3, w4, w3, eq
 	and	w3, w5, w3
-.LVL740:
-	.loc 1 329 0
+.LVL745:
+	.loc 1 331 0
 	eor	w3, w3, w7
-	.loc 1 330 0
+	.loc 1 332 0
 	str	w3, [x0, x6, lsl 2]
 	add	x6, x6, 1
-	.loc 1 298 0
+	.loc 1 300 0
 	cmp	w9, w6
-	bgt	.L758
+	bgt	.L763
 	add	x2, x2, x14
 	add	x1, x1, x12
 	add	x0, x0, x12
-.LVL741:
-.L756:
-	.loc 1 297 0 discriminator 2
+.LVL746:
+.L761:
+	.loc 1 299 0 discriminator 2
 	add	w11, w11, 1
 	cmp	w13, w11
-	bne	.L745
-.L743:
+	bne	.L750
+.L748:
 	ret
 	.cfi_endproc
 .LFE2808:
@@ -8374,54 +8457,54 @@ refresh_new_image_auto:
 	.type	new_buffer_refresh, %function
 new_buffer_refresh:
 .LFB2809:
-	.loc 1 336 0
+	.loc 1 338 0
 	.cfi_startproc
-.LVL742:
+.LVL747:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 337 0
+	.loc 1 339 0
 	adrp	x1, .LANCHOR0
-	.loc 1 336 0
+	.loc 1 338 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 340 0
+	.loc 1 342 0
 	adrp	x20, .LANCHOR1
-	.loc 1 337 0
+	.loc 1 339 0
 	ldr	x19, [x1, #:lo12:.LANCHOR0]
-.LVL743:
-	.loc 1 340 0
+.LVL748:
+	.loc 1 342 0
 	add	x0, x20, :lo12:.LANCHOR1
-.LVL744:
-	add	x0, x0, 624
+.LVL749:
+	add	x0, x0, 704
 	bl	down_write
-.LVL745:
-	.loc 1 338 0
+.LVL750:
+	.loc 1 340 0
 	add	x19, x19, 184
-.LVL746:
-	.loc 1 341 0
-	ldr	x0, [x19, 208]
+.LVL751:
+	.loc 1 343 0
+	ldr	x0, [x19, 224]
 	ldr	w5, [x0, 40]
-	cbz	w5, .L764
-	.loc 1 347 0
+	cbz	w5, .L769
+	.loc 1 349 0
 	ldr	x1, [x0, 16]
 	mov	x4, x19
-	ldp	x2, x3, [x19, 144]
-	ldr	x0, [x19, 128]
+	ldp	x2, x3, [x19, 160]
+	ldr	x0, [x19, 144]
 	bl	refresh_new_image2
-.LVL747:
-	.loc 1 352 0
+.LVL752:
+	.loc 1 354 0
 	add	x0, x20, :lo12:.LANCHOR1
-	add	x0, x0, 624
+	add	x0, x0, 704
 	bl	up_write
-.LVL748:
-	.loc 1 353 0
+.LVL753:
+	.loc 1 355 0
 	ldp	x19, x20, [sp, 16]
-.LVL749:
+.LVL754:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -8430,25 +8513,25 @@ new_buffer_refresh:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL750:
+.LVL755:
 	.p2align 3
-.L764:
+.L769:
 	.cfi_restore_state
-	.loc 1 342 0
+	.loc 1 344 0
 	ldr	x1, [x0, 16]
 	mov	x3, x19
-	ldr	x2, [x19, 152]
-	ldr	x0, [x19, 128]
+	ldr	x2, [x19, 168]
+	ldr	x0, [x19, 144]
 	bl	refresh_new_image_auto
-.LVL751:
-	.loc 1 352 0
+.LVL756:
+	.loc 1 354 0
 	add	x0, x20, :lo12:.LANCHOR1
-	add	x0, x0, 624
+	add	x0, x0, 704
 	bl	up_write
-.LVL752:
-	.loc 1 353 0
+.LVL757:
+	.loc 1 355 0
 	ldp	x19, x20, [sp, 16]
-.LVL753:
+.LVL758:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -8464,16 +8547,16 @@ new_buffer_refresh:
 	.type	ebc_thread, %function
 ebc_thread:
 .LFB2826:
-	.loc 1 1324 0
+	.loc 1 1326 0
 	.cfi_startproc
-.LVL754:
+.LVL759:
 	stp	x29, x30, [sp, -224]!
 	.cfi_def_cfa_offset 224
 	.cfi_offset 29, -224
 	.cfi_offset 30, -216
-	.loc 1 1325 0
+	.loc 1 1327 0
 	adrp	x1, .LANCHOR0
-	.loc 1 1324 0
+	.loc 1 1326 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -8485,22 +8568,22 @@ ebc_thread:
 	adrp	x22, __stack_chk_guard
 	stp	x23, x24, [sp, 48]
 	adrp	x21, .LANCHOR1
-	.loc 1 1325 0
+	.loc 1 1327 0
 	ldr	x20, [x1, #:lo12:.LANCHOR0]
-.LVL755:
-	.loc 1 1324 0
+.LVL760:
+	.loc 1 1326 0
 	add	x0, x22, :lo12:__stack_chk_guard
-.LVL756:
+.LVL761:
 	stp	x25, x26, [sp, 64]
 .LBB1791:
 .LBB1792:
 .LBB1793:
-	.loc 1 1622 0
+	.loc 1 1624 0
 	add	x21, x21, :lo12:.LANCHOR1
 .LBE1793:
 .LBE1792:
 .LBE1791:
-	.loc 1 1324 0
+	.loc 1 1326 0
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 23, -176
 	.cfi_offset 24, -168
@@ -8508,188 +8591,188 @@ ebc_thread:
 	.cfi_offset 26, -152
 	.cfi_offset 27, -144
 	.cfi_offset 28, -136
-	.loc 1 1326 0
+	.loc 1 1328 0
 	add	x24, x20, 184
 .LBB1798:
 .LBB1796:
 .LBB1794:
-	.loc 1 1622 0
+	.loc 1 1624 0
 	add	x19, x21, 304
 .LBE1794:
 .LBE1796:
 .LBE1798:
-	.loc 1 1329 0
+	.loc 1 1331 0
 	mov	w23, 0
-.LVL757:
-	.loc 1 1324 0
+.LVL762:
+	.loc 1 1326 0
 	ldr	x1, [x0]
 	str	x1, [x29, 216]
 	mov	x1,0
-.LVL758:
+.LVL763:
 	.p2align 2
-.L766:
-	.loc 1 1334 0
-	ldr	w0, [x24, 600]
-.LVL759:
-	cbnz	w0, .L895
-.L767:
-	.loc 1 1340 0
+.L771:
+	.loc 1 1336 0
+	ldr	w0, [x24, 616]
+.LVL764:
+	cbnz	w0, .L900
+.L772:
+	.loc 1 1342 0
 	bl	ebc_dsp_buf_get
-.LVL760:
+.LVL765:
 	mov	x28, x0
-	.loc 1 1342 0
-	cbz	x0, .L769
-	.loc 1 1342 0 is_stmt 0 discriminator 1
+	.loc 1 1344 0
+	cbz	x0, .L774
+	.loc 1 1344 0 is_stmt 0 discriminator 1
 	ldr	x1, [x0, 8]
-	cbz	x1, .L769
-	.loc 1 1343 0 is_stmt 1
+	cbz	x1, .L774
+	.loc 1 1345 0 is_stmt 1
 	ldr	w1, [x0, 40]
 	cmp	w1, 20
-	beq	.L896
-	.loc 1 1347 0
-	ldr	x2, [x24, 592]
-	cbz	x2, .L772
-	.loc 1 1348 0
+	beq	.L901
+	.loc 1 1349 0
+	ldr	x2, [x24, 608]
+	cbz	x2, .L777
+	.loc 1 1350 0
 	cmp	w1, 19
-	beq	.L897
-	.loc 1 1353 0
+	beq	.L902
+	.loc 1 1355 0
 	mov	w2, 18
 	tst	w1, w2
-	beq	.L888
-	.loc 1 1354 0
-	ldr	x0, [x24, 88]
+	beq	.L893
+	.loc 1 1356 0
+	ldr	x0, [x24, 104]
 	adrp	x1, .LC80
 	add	x1, x1, :lo12:.LC80
 	bl	_dev_info
-.LVL761:
-.L771:
-	.loc 1 1387 0
+.LVL766:
+.L776:
+	.loc 1 1389 0
 	adrp	x25, jiffies
-.LVL762:
+.LVL767:
 	mov	x1, 402653184
-	add	x0, x20, 616
+	add	x0, x20, 632
 	ldr	x2, [x25, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL763:
-	.loc 1 1389 0
-	ldr	w0, [x24, 428]
-	cbz	w0, .L778
-	ldr	x0, [x24, 200]
-.L779:
-	.loc 1 1392 0
+.LVL768:
+	.loc 1 1391 0
+	ldr	w0, [x24, 444]
+	cbz	w0, .L783
+	ldr	x0, [x24, 216]
+.L784:
+	.loc 1 1394 0
 	ldr	w2, [x0, 40]
 	ldr	w3, [x28, 40]
 	cmp	w3, w2
-	beq	.L780
-	.loc 1 1393 0
-	ldr	x0, [x24, 88]
+	beq	.L785
+	.loc 1 1395 0
+	ldr	x0, [x24, 104]
 	adrp	x1, .LC82
 	add	x1, x1, :lo12:.LC82
 	bl	_dev_info
-.LVL764:
-	.loc 1 1394 0
-	ldr	w0, [x24, 28]
+.LVL769:
+	.loc 1 1396 0
+	ldr	w0, [x24, 44]
 	cmp	w0, 1
-	beq	.L898
-.L889:
+	beq	.L903
+.L894:
 	ldr	w2, [x28, 40]
-.L780:
-	.loc 1 1401 0
+.L785:
+	.loc 1 1403 0
 	cmp	w2, 11
-	bgt	.L787
+	bgt	.L792
 	cmp	w2, 7
-	bge	.L788
+	bge	.L793
 	cmp	w2, 1
-	beq	.L789
-	bgt	.L859
-	cbnz	w2, .L786
-	.loc 1 1446 0
-	add	x0, x21, 624
+	beq	.L794
+	bgt	.L864
+	cbnz	w2, .L791
+	.loc 1 1448 0
+	add	x0, x21, 704
 	bl	down_write
-.LVL765:
-	.loc 1 1452 0
-	ldr	x0, [x24, 200]
-	.loc 1 1447 0
-	str	x28, [x24, 208]
-	.loc 1 1452 0
+.LVL770:
+	.loc 1 1454 0
+	ldr	x0, [x24, 216]
+	.loc 1 1449 0
+	str	x28, [x24, 224]
+	.loc 1 1454 0
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
-	bls	.L823
-	.loc 1 1454 0
+	bls	.L828
+	.loc 1 1456 0
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x28, 16]
-	ldr	x0, [x24, 128]
+	ldr	x0, [x24, 144]
 	bl	memcpy
-.LVL766:
-	.loc 1 1455 0
-	ldr	x0, [x24, 200]
+.LVL771:
+	.loc 1 1457 0
+	ldr	x0, [x24, 216]
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x0, 16]
-	ldr	x0, [x24, 136]
+	ldr	x0, [x24, 152]
 	bl	memcpy
-.LVL767:
-.L824:
-	.loc 1 1461 0
-	add	x0, x21, 624
-	bl	up_write
-.LVL768:
+.LVL772:
+.L829:
 	.loc 1 1463 0
-	ldr	w0, [x24, 28]
-	cbz	w0, .L899
-.LVL769:
+	add	x0, x21, 704
+	bl	up_write
+.LVL773:
+	.loc 1 1465 0
+	ldr	w0, [x24, 44]
+	cbz	w0, .L904
+.LVL774:
 	.p2align 2
-.L801:
-	.loc 1 1583 0
-	ldr	x0, [x24, 208]
+.L806:
+	.loc 1 1585 0
+	ldr	x0, [x24, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
-	beq	.L900
-.L840:
-	.loc 1 1589 0
+	beq	.L905
+.L845:
+	.loc 1 1591 0
 	cmp	w0, 18
-	beq	.L901
-.L841:
-	.loc 1 1598 0
+	beq	.L906
+.L846:
+	.loc 1 1600 0
 	mov	x0, x28
 	bl	ebc_remove_from_dsp_buf_list
-.LVL770:
-	.loc 1 1600 0
-	ldr	w0, [x24, 428]
-	cbnz	w0, .L902
-.L842:
-	.loc 1 1603 0
-	mov	w0, 1
-	str	w0, [x24, 428]
-.L843:
+.LVL775:
+	.loc 1 1602 0
+	ldr	w0, [x24, 444]
+	cbnz	w0, .L907
+.L847:
 	.loc 1 1605 0
-	ldr	x0, [x24, 208]
-	str	x0, [x24, 200]
-	.loc 1 1334 0
-	ldr	w0, [x24, 600]
-	cbz	w0, .L767
-.L895:
-	.loc 1 1335 0
-	ldr	w0, [x24, 184]
+	mov	w0, 1
+	str	w0, [x24, 444]
+.L848:
+	.loc 1 1607 0
+	ldr	x0, [x24, 224]
+	str	x0, [x24, 216]
+	.loc 1 1336 0
+	ldr	w0, [x24, 616]
+	cbz	w0, .L772
+.L900:
+	.loc 1 1337 0
+	ldr	w0, [x24, 200]
 	cmp	w0, 1
-	beq	.L903
-.L768:
-	.loc 1 1628 0
+	beq	.L908
+.L773:
+	.loc 1 1630 0
 	add	x22, x22, :lo12:__stack_chk_guard
 	mov	w0, 0
 	ldr	x2, [x29, 216]
 	ldr	x1, [x22]
 	eor	x1, x2, x1
-	cbnz	x1, .L904
+	cbnz	x1, .L909
 	ldp	x19, x20, [sp, 16]
-.LVL771:
+.LVL776:
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
-.LVL772:
+.LVL777:
 	ldp	x25, x26, [sp, 64]
-.LVL773:
+.LVL778:
 	ldp	x27, x28, [sp, 80]
-.LVL774:
+.LVL779:
 	ldp	x29, x30, [sp], 224
 	.cfi_remember_state
 	.cfi_restore 30
@@ -8706,1159 +8789,1159 @@ ebc_thread:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL775:
+.LVL780:
 	.p2align 3
-.L769:
+.L774:
 	.cfi_restore_state
-	.loc 1 1609 0
-	ldr	w0, [x24, 28]
-.LVL776:
+	.loc 1 1611 0
+	ldr	w0, [x24, 44]
+.LVL781:
 	cmp	w0, 1
-	beq	.L905
-	.loc 1 1618 0
-	ldr	w0, [x24, 184]
+	beq	.L910
+	.loc 1 1620 0
+	ldr	w0, [x24, 200]
 	cmp	w0, 1
-	beq	.L906
-.LVL777:
-.L891:
-	ldr	w0, [x24, 80]
-.LVL778:
-	.loc 1 1621 0
-	cbz	w0, .L907
-.L854:
-.LVL779:
-.L844:
+	beq	.L911
+.LVL782:
+.L896:
+	ldr	w0, [x24, 96]
+.LVL783:
 	.loc 1 1623 0
-	str	wzr, [x24, 80]
-	b	.L766
-.LVL780:
+	cbz	w0, .L912
+.L859:
+.LVL784:
+.L849:
+	.loc 1 1625 0
+	str	wzr, [x24, 96]
+	b	.L771
+.LVL785:
 	.p2align 3
-.L907:
+.L912:
 .LBB1799:
 .LBB1797:
-	.loc 1 1622 0 discriminator 1
+	.loc 1 1624 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL781:
-	b	.L855
+.LVL786:
+	b	.L860
 	.p2align 3
-.L908:
-.LVL782:
+.L913:
+.LVL787:
 .LBB1795:
-	.loc 1 1622 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L844
-	.loc 1 1622 0 discriminator 7
+	.loc 1 1624 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L849
+	.loc 1 1624 0 discriminator 7
 	bl	schedule
-.LVL783:
-.L855:
-	.loc 1 1622 0 discriminator 9
+.LVL788:
+.L860:
+	.loc 1 1624 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL784:
-	ldr	w1, [x24, 80]
-	cbz	w1, .L908
+.LVL789:
+	ldr	w1, [x24, 96]
+	cbz	w1, .L913
 .LBE1795:
-	.loc 1 1622 0 discriminator 4
+	.loc 1 1624 0 discriminator 4
 	add	x1, x29, 112
 	mov	x0, x19
 	bl	finish_wait
-.LVL785:
+.LVL790:
 .LBE1797:
 .LBE1799:
-	.loc 1 1623 0 is_stmt 1 discriminator 4
-	str	wzr, [x24, 80]
-	b	.L766
-.LVL786:
+	.loc 1 1625 0 is_stmt 1 discriminator 4
+	str	wzr, [x24, 96]
+	b	.L771
+.LVL791:
 	.p2align 3
-.L778:
-	.loc 1 1390 0
+.L783:
+	.loc 1 1392 0
 	mov	x0, x28
-	str	x28, [x24, 200]
-	b	.L779
-.LVL787:
+	str	x28, [x24, 216]
+	b	.L784
+.LVL792:
 	.p2align 3
-.L772:
-	.loc 1 1363 0
+.L777:
+	.loc 1 1365 0
 	cmp	w1, 18
 	ccmp	w1, 21, 4, ne
-	bne	.L776
-	.loc 1 1364 0
-	str	wzr, [x24, 608]
-	b	.L771
-.LVL788:
+	bne	.L781
+	.loc 1 1366 0
+	str	wzr, [x24, 624]
+	b	.L776
+.LVL793:
 	.p2align 3
-.L792:
-	.loc 1 1401 0
+.L797:
+	.loc 1 1403 0
 	cmp	w2, 21
-	ble	.L859
-.L786:
-	.loc 1 1572 0
-	ldr	x0, [x24, 88]
+	ble	.L864
+.L791:
+	.loc 1 1574 0
+	ldr	x0, [x24, 104]
 	adrp	x1, .LC90
 	add	x1, x1, :lo12:.LC90
 	bl	_dev_err
-.LVL789:
-	.loc 1 1573 0
+.LVL794:
+	.loc 1 1575 0
 	mov	x0, x28
-.LVL790:
-.L888:
+.LVL795:
+.L893:
 	bl	ebc_remove_from_dsp_buf_list
-.LVL791:
-	.loc 1 1574 0
+.LVL796:
+	.loc 1 1576 0
 	mov	x0, x28
 	bl	ebc_buf_release
-.LVL792:
-	.loc 1 1576 0
-	b	.L766
-.LVL793:
-	.p2align 3
-.L896:
-	.loc 1 1345 0
-	str	wzr, [x24, 604]
-	.loc 1 1344 0
-	str	wzr, [x24, 608]
+.LVL797:
+	.loc 1 1578 0
 	b	.L771
-.LVL794:
+.LVL798:
 	.p2align 3
-.L787:
-	.loc 1 1401 0
+.L901:
+	.loc 1 1347 0
+	str	wzr, [x24, 620]
+	.loc 1 1346 0
+	str	wzr, [x24, 624]
+	b	.L776
+.LVL799:
+	.p2align 3
+.L792:
+	.loc 1 1403 0
 	cmp	w2, 15
-	bgt	.L792
+	bgt	.L797
 	cmp	w2, 14
-	bge	.L788
-.L859:
-	.loc 1 1502 0
-	ldr	x26, [x24, 200]
-	.loc 1 1493 0
+	bge	.L793
+.L864:
+	.loc 1 1504 0
+	ldr	x26, [x24, 216]
+	.loc 1 1495 0
 	mov	w7, 1
-.LVL795:
-	.loc 1 1503 0
+.LVL800:
+	.loc 1 1505 0
 	ldr	w0, [x26, 40]
 	cmp	w0, 1
-	bls	.L909
-.L827:
-	.loc 1 1514 0
-	str	wzr, [x24, 76]
-	.loc 1 1515 0
-	str	x28, [x24, 208]
-	.loc 1 1518 0
+	bls	.L914
+.L832:
+	.loc 1 1516 0
+	str	wzr, [x24, 92]
+	.loc 1 1517 0
+	str	x28, [x24, 224]
+	.loc 1 1520 0
 	ldr	w0, [x28, 40]
 	sub	w0, w0, #2
-	.loc 1 1517 0
+	.loc 1 1519 0
 	cmp	w0, 14
-	bhi	.L828
-.L910:
-	.loc 1 1520 0
-	ldr	x0, [x24, 200]
+	bhi	.L833
+.L915:
+	.loc 1 1522 0
+	ldr	x0, [x24, 216]
 .LBB1800:
 .LBB1801:
-	.loc 1 1309 0
+	.loc 1 1311 0
 	ldr	w1, [x24, 20]
 .LBE1801:
 .LBE1800:
-	.loc 1 1519 0
+	.loc 1 1521 0
 	ldr	x4, [x28, 16]
 .LBB1804:
 .LBB1802:
-	.loc 1 1309 0
+	.loc 1 1311 0
 	cmp	w1, 0
 .LBE1802:
 .LBE1804:
-	.loc 1 1520 0
+	.loc 1 1522 0
 	ldr	x5, [x0, 16]
 .LBB1805:
 .LBB1803:
-	.loc 1 1309 0
+	.loc 1 1311 0
 	add	w0, w1, 7
 	csel	w0, w0, w1, lt
 	asr	w0, w0, 3
 	cmp	w0, 0
-	ble	.L829
-	.loc 1 1313 0
+	ble	.L834
+	.loc 1 1315 0
 	ldr	x1, [x4]
 	ldr	x2, [x5]
 	cmp	x2, x1
-	bne	.L828
+	bne	.L833
 	sub	w1, w0, #1
 	mov	x0, 8
 	add	x1, x1, 1
 	lsl	x1, x1, 3
-	b	.L831
+	b	.L836
 	.p2align 3
-.L832:
-	.loc 1 1310 0
+.L837:
+	.loc 1 1312 0
 	ldr	x3, [x4, x0]
 	add	x0, x0, 8
-	.loc 1 1311 0
-	add	x2, x5, x0
 	.loc 1 1313 0
+	add	x2, x5, x0
+	.loc 1 1315 0
 	ldr	x2, [x2, -8]
 	cmp	x3, x2
-	bne	.L828
-.L831:
-	.loc 1 1309 0
+	bne	.L833
+.L836:
+	.loc 1 1311 0
 	cmp	x1, x0
-	bne	.L832
-.L829:
+	bne	.L837
+.L834:
 .LBE1803:
 .LBE1805:
-	.loc 1 1522 0
-	ldr	x0, [x24, 88]
+	.loc 1 1524 0
+	ldr	x0, [x24, 104]
 	adrp	x1, .LC93
 	add	x1, x1, :lo12:.LC93
 	bl	_dev_info
-.LVL796:
-	.loc 1 1524 0
-	str	x26, [x24, 200]
-	.loc 1 1583 0
-	ldr	x0, [x24, 208]
+.LVL801:
+	.loc 1 1526 0
+	str	x26, [x24, 216]
+	.loc 1 1585 0
+	ldr	x0, [x24, 224]
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
-	bne	.L840
-.LVL797:
-.L900:
+	bne	.L845
+.LVL802:
+.L905:
+	.loc 1 1588 0
+	ldr	x0, [x24, 104]
 	.loc 1 1586 0
-	ldr	x0, [x24, 88]
-	.loc 1 1584 0
 	mov	w25, 1
-.LVL798:
-	.loc 1 1585 0
-	str	wzr, [x24, 188]
-	.loc 1 1586 0
+.LVL803:
+	.loc 1 1587 0
+	str	wzr, [x24, 204]
+	.loc 1 1588 0
 	adrp	x1, .LC91
-	.loc 1 1584 0
-	str	w25, [x24, 600]
 	.loc 1 1586 0
+	str	w25, [x24, 616]
+	.loc 1 1588 0
 	add	x1, x1, :lo12:.LC91
 	bl	_dev_info
-.LVL799:
-	.loc 1 1587 0
+.LVL804:
+	.loc 1 1589 0
 	mov	w2, w25
 	mov	w1, w25
 	add	x0, x21, 328
 	bl	__wake_up_sync
-.LVL800:
-	.loc 1 1598 0
+.LVL805:
+	.loc 1 1600 0
 	mov	x0, x28
 	bl	ebc_remove_from_dsp_buf_list
-.LVL801:
-	.loc 1 1600 0
-	ldr	w0, [x24, 428]
-	cbz	w0, .L842
-.LVL802:
+.LVL806:
+	.loc 1 1602 0
+	ldr	w0, [x24, 444]
+	cbz	w0, .L847
+.LVL807:
 	.p2align 2
-.L902:
-	.loc 1 1601 0
-	ldr	x0, [x24, 200]
+.L907:
+	.loc 1 1603 0
+	ldr	x0, [x24, 216]
 	bl	ebc_buf_release
-.LVL803:
-	b	.L843
-.LVL804:
+.LVL808:
+	b	.L848
+.LVL809:
 	.p2align 3
-.L788:
-	.loc 1 1502 0
-	ldr	x26, [x24, 200]
-	.loc 1 1401 0
+.L793:
+	.loc 1 1504 0
+	ldr	x26, [x24, 216]
+	.loc 1 1403 0
 	mov	w7, 0
-.LVL805:
-	.loc 1 1503 0
+.LVL810:
+	.loc 1 1505 0
 	ldr	w0, [x26, 40]
 	cmp	w0, 1
-	bhi	.L827
-.L909:
-	.loc 1 1508 0
+	bhi	.L832
+.L914:
+	.loc 1 1510 0
 	add	x0, x29, 152
-	.loc 1 1514 0
-	str	wzr, [x24, 76]
-	.loc 1 1508 0
-	str	x0, [x24, 200]
-	.loc 1 1515 0
-	str	x28, [x24, 208]
-	.loc 1 1509 0
-	ldr	x0, [x24, 136]
+	.loc 1 1516 0
+	str	wzr, [x24, 92]
+	.loc 1 1510 0
+	str	x0, [x24, 216]
+	.loc 1 1517 0
+	str	x28, [x24, 224]
+	.loc 1 1511 0
+	ldr	x0, [x24, 152]
 	str	x0, [x29, 168]
-	.loc 1 1518 0
+	.loc 1 1520 0
 	ldr	w0, [x28, 40]
 	sub	w0, w0, #2
-	.loc 1 1517 0
+	.loc 1 1519 0
 	cmp	w0, 14
-	bls	.L910
+	bls	.L915
 	.p2align 2
-.L828:
-	.loc 1 1530 0
-	cbnz	w7, .L863
-	.loc 1 1534 0
-	ldr	w0, [x24, 48]
+.L833:
+	.loc 1 1532 0
+	cbnz	w7, .L868
+	.loc 1 1536 0
+	ldr	w0, [x24, 64]
 	cmp	w0, 0
-	ble	.L833
-	.loc 1 1535 0
+	ble	.L838
+	.loc 1 1537 0
 	add	w23, w23, 1
-	.loc 1 1536 0
+	.loc 1 1538 0
 	cmp	w0, w23
-	bgt	.L833
-	.loc 1 1537 0
+	bgt	.L838
+	.loc 1 1539 0
 	mov	w0, 2
-	.loc 1 1538 0
+	.loc 1 1540 0
 	mov	w23, 0
-	.loc 1 1537 0
+	.loc 1 1539 0
 	str	w0, [x28, 40]
-.L833:
-	.loc 1 1542 0
-	ldr	w0, [x24, 184]
-	cbz	w0, .L911
-.L834:
-	.loc 1 1545 0
+.L838:
+	.loc 1 1544 0
+	ldr	w0, [x24, 200]
+	cbz	w0, .L916
+.L839:
+	.loc 1 1547 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL806:
-	cbz	w0, .L835
-	.loc 1 1546 0
-	ldr	x0, [x24, 88]
+.LVL811:
+	cbz	w0, .L840
+	.loc 1 1548 0
+	ldr	x0, [x24, 104]
 	adrp	x1, .LC87
 	add	x1, x1, :lo12:.LC87
 	bl	_dev_err
-.LVL807:
-	.loc 1 1548 0
-	str	x26, [x24, 200]
-	.loc 1 1549 0
-	b	.L801
-.LVL808:
+.LVL812:
+	.loc 1 1550 0
+	str	x26, [x24, 216]
+	.loc 1 1551 0
+	b	.L806
+.LVL813:
 	.p2align 3
-.L905:
+.L910:
 .LBB1806:
-	.loc 1 1610 0 discriminator 1
-	ldr	w0, [x24, 80]
-	cbnz	w0, .L844
+	.loc 1 1612 0 discriminator 1
+	ldr	w0, [x24, 96]
+	cbnz	w0, .L849
 .LBB1807:
-	.loc 1 1610 0 is_stmt 0 discriminator 3
+	.loc 1 1612 0 is_stmt 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL809:
-	b	.L848
+.LVL814:
+	b	.L853
 	.p2align 3
-.L912:
+.L917:
 .LBB1808:
-	.loc 1 1610 0 discriminator 7
-	ldr	w1, [x24, 80]
-	cbnz	w1, .L845
-.LVL810:
-	.loc 1 1610 0 discriminator 9
-	cbnz	x0, .L891
-	.loc 1 1610 0 discriminator 11
+	.loc 1 1612 0 discriminator 7
+	ldr	w1, [x24, 96]
+	cbnz	w1, .L850
+.LVL815:
+	.loc 1 1612 0 discriminator 9
+	cbnz	x0, .L896
+	.loc 1 1612 0 discriminator 11
 	bl	schedule
-.LVL811:
-.L848:
-	.loc 1 1610 0 discriminator 13
+.LVL816:
+.L853:
+	.loc 1 1612 0 discriminator 13
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL812:
-	ldr	w1, [x24, 28]
-	cbnz	w1, .L912
-.L845:
+.LVL817:
+	ldr	w1, [x24, 44]
+	cbnz	w1, .L917
+.L850:
 .LBE1808:
-	.loc 1 1610 0 discriminator 8
+	.loc 1 1612 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL813:
-	ldr	w0, [x24, 28]
+.LVL818:
+	ldr	w0, [x24, 44]
 .LBE1807:
 .LBE1806:
-	.loc 1 1613 0 is_stmt 1 discriminator 8
-	cbnz	w0, .L891
-	.loc 1 1618 0
-	ldr	w0, [x24, 184]
+	.loc 1 1615 0 is_stmt 1 discriminator 8
+	cbnz	w0, .L896
+	.loc 1 1620 0
+	ldr	w0, [x24, 200]
 	cmp	w0, 1
-	bne	.L891
+	bne	.L896
 	.p2align 2
-.L906:
+.L911:
 .LBB1809:
 .LBB1810:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
-.LVL814:
-	b	.L891
-.LVL815:
+.LVL819:
+	b	.L896
+.LVL820:
 	.p2align 3
-.L776:
+.L781:
 .LBE1810:
 .LBE1809:
-	.loc 1 1366 0
-	ldr	w0, [x24, 608]
-.LVL816:
+	.loc 1 1368 0
+	ldr	w0, [x24, 624]
+.LVL821:
 	cmp	w0, 0
 	ccmp	w1, 1, 4, ne
-	beq	.L771
-	.loc 1 1367 0
-	add	x25, x21, 624
-.LVL817:
+	beq	.L776
+	.loc 1 1369 0
+	add	x25, x21, 704
+.LVL822:
 	mov	x0, x25
 	bl	down_write
-.LVL818:
-	.loc 1 1368 0
+.LVL823:
+	.loc 1 1370 0
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x28, 16]
-	ldr	x0, [x24, 144]
+	ldr	x0, [x24, 160]
 	bl	memcpy
-.LVL819:
-	.loc 1 1369 0
+.LVL824:
+	.loc 1 1371 0
 	mov	x0, x28
 	bl	ebc_remove_from_dsp_buf_list
-.LVL820:
-	.loc 1 1370 0
+.LVL825:
+	.loc 1 1372 0
 	mov	x0, x28
 	bl	ebc_buf_release
-.LVL821:
-	.loc 1 1372 0
-	ldr	x1, [x24, 208]
+.LVL826:
+	.loc 1 1374 0
+	ldr	x1, [x24, 224]
 	mov	x4, x24
-	ldr	x0, [x24, 128]
-	ldp	x2, x3, [x24, 144]
+	ldr	x0, [x24, 144]
+	ldp	x2, x3, [x24, 160]
 	ldr	w5, [x1, 40]
 	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
-.LVL822:
-	.loc 1 1375 0
+.LVL827:
+	.loc 1 1377 0
 	mov	x0, x25
 	bl	up_write
-.LVL823:
-	.loc 1 1376 0
-	ldr	w0, [x24, 28]
-	cbnz	w0, .L766
+.LVL828:
+	.loc 1 1378 0
+	ldr	w0, [x24, 44]
+	cbnz	w0, .L771
+	.loc 1 1381 0
+	ldr	w0, [x24, 200]
 	.loc 1 1379 0
-	ldr	w0, [x24, 184]
-	.loc 1 1377 0
 	mov	w1, 1
-	.loc 1 1378 0
-	str	wzr, [x24, 76]
-	.loc 1 1377 0
-	str	w1, [x24, 28]
+	.loc 1 1380 0
+	str	wzr, [x24, 92]
 	.loc 1 1379 0
-	cbz	w0, .L913
-.L777:
+	str	w1, [x24, 44]
 	.loc 1 1381 0
-	ldr	x0, [x24, 88]
+	cbz	w0, .L918
+.L782:
+	.loc 1 1383 0
+	ldr	x0, [x24, 104]
 	adrp	x1, .LC81
-	ldrb	w2, [x24, 32]
+	ldrb	w2, [x24, 48]
 	add	x1, x1, :lo12:.LC81
 	bl	_dev_info
-.LVL824:
-	.loc 1 1382 0
+.LVL829:
+	.loc 1 1384 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL825:
-	b	.L766
+.LVL830:
+	b	.L771
 	.p2align 3
-.L789:
-	.loc 1 1403 0
-	ldr	w0, [x24, 604]
-	cbz	w0, .L793
-	.loc 1 1404 0
-	str	w2, [x24, 608]
-	.loc 1 1413 0
-	add	x0, x21, 624
+.L794:
+	.loc 1 1405 0
+	ldr	w0, [x24, 620]
+	cbz	w0, .L798
+	.loc 1 1406 0
+	str	w2, [x24, 624]
+	.loc 1 1415 0
+	add	x0, x21, 704
 	bl	down_write
-.LVL826:
-	.loc 1 1414 0
-	str	x28, [x24, 208]
+.LVL831:
 	.loc 1 1416 0
-	ldr	x0, [x24, 200]
+	str	x28, [x24, 224]
+	.loc 1 1418 0
+	ldr	x0, [x24, 216]
 	ldr	w1, [x0, 40]
 	cmp	w1, 1
-	bls	.L914
-	.loc 1 1418 0
+	bls	.L919
+	.loc 1 1420 0
 	ldr	x1, [x0, 16]
 	ldrsw	x2, [x24, 20]
-	ldr	x0, [x24, 128]
+	ldr	x0, [x24, 144]
 	bl	memcpy
-.LVL827:
-	.loc 1 1419 0
-	ldr	x0, [x24, 200]
+.LVL832:
+	.loc 1 1421 0
+	ldr	x0, [x24, 216]
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x0, 16]
-	ldr	x0, [x24, 136]
+	ldr	x0, [x24, 152]
 	bl	memcpy
-.LVL828:
-	.loc 1 1420 0
-	ldr	x0, [x24, 200]
+.LVL833:
+	.loc 1 1422 0
+	ldr	x0, [x24, 216]
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x0, 16]
-	ldr	x0, [x24, 144]
+	ldr	x0, [x24, 160]
 	bl	memcpy
-.LVL829:
-	ldr	x0, [x24, 208]
-.L796:
+.LVL834:
+	ldr	x0, [x24, 224]
+.L801:
 .LBB1811:
 .LBB1812:
-	.loc 1 374 0
+	.loc 1 376 0
 	ldp	w3, w14, [x0, 48]
-	.loc 1 433 0
+	.loc 1 435 0
 	mov	w13, 234881024
-	.loc 1 375 0
+	.loc 1 377 0
 	ldp	w2, w17, [x0, 56]
-	.loc 1 372 0
+	.loc 1 374 0
 	cmp	w3, 0
-	.loc 1 377 0
-	ldr	w1, [x20, 240]
-	.loc 1 372 0
+	.loc 1 379 0
+	ldr	w1, [x20, 256]
+	.loc 1 374 0
 	add	w15, w3, 7
 	csel	w15, w15, w3, lt
-	.loc 1 373 0
+	.loc 1 375 0
 	add	w8, w2, 7
 	cmp	w2, 0
-	.loc 1 377 0
+	.loc 1 379 0
 	add	w16, w1, 7
-	.loc 1 373 0
+	.loc 1 375 0
 	csel	w8, w8, w2, lt
-	.loc 1 377 0
+	.loc 1 379 0
 	cmp	w1, 0
 	csel	w16, w16, w1, lt
-	.loc 1 373 0
+	.loc 1 375 0
 	asr	w8, w8, 3
-	.loc 1 377 0
+	.loc 1 379 0
 	asr	w16, w16, 3
-.LVL830:
-	.loc 1 373 0
+.LVL835:
+	.loc 1 375 0
 	add	w8, w8, 1
-.LVL831:
-	ldr	w1, [x20, 236]
-	.loc 1 380 0
+.LVL836:
+	ldr	w1, [x20, 252]
+	.loc 1 382 0
 	cmp	w8, w16
 .LBE1812:
 .LBE1811:
-	.loc 1 1425 0
+	.loc 1 1427 0
 	ldr	x11, [x0, 16]
 .LBB1817:
 .LBB1813:
-	.loc 1 380 0
+	.loc 1 382 0
 	sub	w0, w16, #1
 	csel	w8, w0, w8, ge
-.LVL832:
-	.loc 1 382 0
+.LVL837:
+	.loc 1 384 0
 	cmp	w1, w17
 	sub	w1, w1, #1
-	.loc 1 439 0
+	.loc 1 441 0
 	mov	w12, -536870912
-	.loc 1 382 0
+	.loc 1 384 0
 	csel	w17, w1, w17, le
-	.loc 1 372 0
+	.loc 1 374 0
 	asr	w15, w15, 3
-.LVL833:
+.LVL838:
 	mul	w5, w14, w16
-	.loc 1 384 0
+	.loc 1 386 0
 	cmp	w14, w17
 .LBE1813:
 .LBE1817:
-	.loc 1 1425 0
-	ldr	x7, [x24, 128]
-	.loc 1 1426 0
-	ldp	x10, x9, [x24, 144]
+	.loc 1 1427 0
+	ldr	x7, [x24, 144]
+	.loc 1 1428 0
+	ldp	x10, x9, [x24, 160]
 .LBB1818:
 .LBB1814:
-	.loc 1 384 0
-	bgt	.L804
-.LVL834:
+	.loc 1 386 0
+	bgt	.L809
+.LVL839:
 	.p2align 2
-.L874:
-	.loc 1 389 0
+.L879:
+	.loc 1 391 0
 	mov	w4, w15
 	cmp	w15, w8
-	ble	.L875
-	b	.L821
-.LVL835:
+	ble	.L880
+	b	.L826
+.LVL840:
 	.p2align 3
-.L805:
-	.loc 1 402 0
+.L810:
+	.loc 1 404 0
 	tst	x2, 65280
-	bne	.L806
-	.loc 1 403 0
+	bne	.L811
+	.loc 1 405 0
 	and	w26, w1, 240
 	cmp	w26, 224
-	beq	.L915
-	.loc 1 406 0
-	orr	w18, w18, 240
-.L806:
+	beq	.L920
 	.loc 1 408 0
+	orr	w18, w18, 240
+.L811:
+	.loc 1 410 0
 	tst	x2, 16711680
-	bne	.L808
-	.loc 1 409 0
+	bne	.L813
+	.loc 1 411 0
 	and	w26, w1, 3840
 	cmp	w26, 3584
-	beq	.L916
-	.loc 1 412 0
-	orr	w18, w18, 3840
-.L808:
+	beq	.L921
 	.loc 1 414 0
+	orr	w18, w18, 3840
+.L813:
+	.loc 1 416 0
 	tst	x2, 4278190080
-	bne	.L810
-	.loc 1 415 0
+	bne	.L815
+	.loc 1 417 0
 	and	w26, w1, 61440
 	cmp	w26, 57344
-	beq	.L917
-	.loc 1 418 0
-	orr	w18, w18, 61440
-.L810:
+	beq	.L922
 	.loc 1 420 0
+	orr	w18, w18, 61440
+.L815:
+	.loc 1 422 0
 	tst	x2, 1095216660480
-	bne	.L812
-	.loc 1 421 0
+	bne	.L817
+	.loc 1 423 0
 	and	w26, w1, 983040
 	cmp	w26, 917504
-	beq	.L918
-	.loc 1 424 0
-	orr	w18, w18, 983040
-.L812:
+	beq	.L923
 	.loc 1 426 0
+	orr	w18, w18, 983040
+.L817:
+	.loc 1 428 0
 	tst	x2, 280375465082880
-	bne	.L814
-	.loc 1 427 0
+	bne	.L819
+	.loc 1 429 0
 	and	w26, w1, 15728640
 	cmp	w26, 14680064
-	beq	.L919
-	.loc 1 430 0
-	orr	w18, w18, 15728640
-.L814:
+	beq	.L924
 	.loc 1 432 0
+	orr	w18, w18, 15728640
+.L819:
+	.loc 1 434 0
 	tst	x2, 71776119061217280
-	bne	.L816
-	.loc 1 433 0
+	bne	.L821
+	.loc 1 435 0
 	and	w26, w1, 251658240
 	cmp	w26, w13
-	beq	.L920
-	.loc 1 436 0
-	orr	w18, w18, 251658240
-.L816:
+	beq	.L925
 	.loc 1 438 0
+	orr	w18, w18, 251658240
+.L821:
+	.loc 1 440 0
 	tst	x2, -72057594037927936
-	bne	.L818
-	.loc 1 439 0
+	bne	.L823
+	.loc 1 441 0
 	and	w2, w1, -268435456
-.LVL836:
+.LVL841:
 	cmp	w2, w12
-	beq	.L921
-	.loc 1 442 0
+	beq	.L926
+	.loc 1 444 0
 	orr	w18, w18, -268435456
-.LVL837:
-.L818:
-	.loc 1 445 0
+.LVL842:
+.L823:
+	.loc 1 447 0
 	and	w1, w1, w25
-.LVL838:
-	.loc 1 389 0
+.LVL843:
+	.loc 1 391 0
 	add	w4, w4, 1
 	eor	w1, w1, w3
 	cmp	w4, w8
 	and	w1, w1, w18
-	.loc 1 445 0
+	.loc 1 447 0
 	eor	w1, w3, w1
-	.loc 1 446 0
+	.loc 1 448 0
 	str	w1, [x7, x0]
-	.loc 1 389 0
-	bgt	.L821
-.LVL839:
-.L875:
-	.loc 1 390 0
+	.loc 1 391 0
+	bgt	.L826
+.LVL844:
+.L880:
+	.loc 1 392 0
 	sxtw	x0, w4
-.LVL840:
-	.loc 1 394 0
+.LVL845:
+	.loc 1 396 0
 	mov	w18, 0
-	.loc 1 393 0
+	.loc 1 395 0
 	lsl	x1, x0, 3
-	.loc 1 390 0
+	.loc 1 392 0
 	lsl	x0, x0, 2
-.LVL841:
-	.loc 1 393 0
+.LVL846:
+	.loc 1 395 0
 	add	x1, x1, x5, sxtw 3
 	add	x0, x0, x5, sxtw 2
 	ldr	x2, [x9, x1]
-	.loc 1 390 0
+	.loc 1 392 0
 	ldr	w3, [x7, x0]
-	.loc 1 391 0
+	.loc 1 393 0
 	ldr	w1, [x11, x0]
-	.loc 1 396 0
+	.loc 1 398 0
 	and	x26, x2, 255
-.LVL842:
-	.loc 1 392 0
+.LVL847:
+	.loc 1 394 0
 	ldr	w25, [x10, x0]
-.LVL843:
-	.loc 1 396 0
-	cbnz	x26, .L805
-.LVL844:
-	.loc 1 397 0
+.LVL848:
+	.loc 1 398 0
+	cbnz	x26, .L810
+.LVL849:
+	.loc 1 399 0
 	and	w26, w1, 15
-	.loc 1 400 0
+	.loc 1 402 0
 	mov	w18, 15
-	.loc 1 397 0
+	.loc 1 399 0
 	cmp	w26, 14
-	bne	.L805
-	.loc 1 398 0
+	bne	.L810
+	.loc 1 400 0
 	orr	w3, w3, w18
-.LVL845:
-	.loc 1 394 0
+.LVL850:
+	.loc 1 396 0
 	mov	w18, 0
-.LVL846:
-	b	.L805
-.LVL847:
+.LVL851:
+	b	.L810
+.LVL852:
 	.p2align 3
-.L835:
+.L840:
 .LBE1814:
 .LBE1818:
-	.loc 1 1557 0
-	ldr	x0, [x24, 208]
+	.loc 1 1559 0
+	ldr	x0, [x24, 224]
 	adrp	x1, .LC89
-	.loc 1 1554 0
-	ldr	w3, [x24, 96]
-	.loc 1 1557 0
+	.loc 1 1556 0
+	ldr	w3, [x24, 112]
+	.loc 1 1559 0
 	add	x1, x1, :lo12:.LC89
-	.loc 1 1554 0
-	strb	w3, [x24, 32]
-	.loc 1 1557 0
+	.loc 1 1556 0
+	strb	w3, [x24, 48]
+	.loc 1 1559 0
 	and	w3, w3, 255
 	ldr	w2, [x0, 40]
-	ldr	x0, [x24, 88]
+	ldr	x0, [x24, 104]
 	bl	_dev_info
-.LVL848:
-	.loc 1 1558 0
+.LVL853:
+	.loc 1 1560 0
 	mov	w0, 1
-	str	w0, [x24, 28]
-	.loc 1 1559 0
+	str	w0, [x24, 44]
+	.loc 1 1561 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL849:
-	.loc 1 1561 0
+.LVL854:
+	.loc 1 1563 0
 	ldr	x1, [x25, #:lo12:jiffies]
-	add	x0, x20, 672
+	add	x0, x20, 688
 	str	x0, [x29, 104]
 	add	x1, x1, 900
 	bl	mod_timer
-.LVL850:
+.LVL855:
 .LBB1819:
-	.loc 1 1562 0
-	ldr	w0, [x24, 76]
-	cbz	w0, .L922
-.L838:
-.LVL851:
-.L836:
+	.loc 1 1564 0
+	ldr	w0, [x24, 92]
+	cbz	w0, .L927
+.L843:
+.LVL856:
+.L841:
 .LBE1819:
-	.loc 1 1564 0 discriminator 11
+	.loc 1 1566 0 discriminator 11
 	ldr	x2, [x25, #:lo12:jiffies]
 	mov	x1, 402653184
 	ldr	x0, [x29, 104]
-.LVL852:
+.LVL857:
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL853:
-	.loc 1 1565 0 discriminator 11
-	str	wzr, [x24, 76]
+.LVL858:
 	.loc 1 1567 0 discriminator 11
-	str	x26, [x24, 200]
+	str	wzr, [x24, 92]
 	.loc 1 1569 0 discriminator 11
-	b	.L801
-.LVL854:
+	str	x26, [x24, 216]
+	.loc 1 1571 0 discriminator 11
+	b	.L806
+.LVL859:
 	.p2align 3
-.L863:
-	.loc 1 1542 0
-	ldr	w0, [x24, 184]
-	.loc 1 1531 0
+.L868:
+	.loc 1 1544 0
+	ldr	w0, [x24, 200]
+	.loc 1 1533 0
 	mov	w23, 0
-	.loc 1 1542 0
-	cbnz	w0, .L834
-.L911:
-	.loc 1 1543 0
+	.loc 1 1544 0
+	cbnz	w0, .L839
+.L916:
+	.loc 1 1545 0
 	mov	x0, x20
-	bl	ebc_power_set.constprop.12
-.LVL855:
-	b	.L834
-.L793:
-	.loc 1 1407 0
-	ldr	x0, [x24, 88]
+	bl	ebc_power_set.constprop.11
+.LVL860:
+	b	.L839
+.L798:
+	.loc 1 1409 0
+	ldr	x0, [x24, 104]
 	adrp	x1, .LC85
 	add	x1, x1, :lo12:.LC85
 	bl	_dev_info
-.LVL856:
-	.loc 1 1408 0
+.LVL861:
+	.loc 1 1410 0
 	mov	x0, x28
 	bl	ebc_remove_from_dsp_buf_list
-.LVL857:
-	.loc 1 1409 0
+.LVL862:
+	.loc 1 1411 0
 	mov	x0, x28
 	bl	ebc_buf_release
-.LVL858:
-	.loc 1 1411 0
-	b	.L766
-.L899:
-	.loc 1 1464 0
-	mov	w0, 1
-	str	w0, [x24, 28]
-	.loc 1 1466 0
-	ldr	w0, [x24, 184]
-	.loc 1 1465 0
-	str	wzr, [x24, 76]
+.LVL863:
+	.loc 1 1413 0
+	b	.L771
+.L904:
 	.loc 1 1466 0
-	cbz	w0, .L923
+	mov	w0, 1
+	str	w0, [x24, 44]
+	.loc 1 1468 0
+	ldr	w0, [x24, 200]
+	.loc 1 1467 0
+	str	wzr, [x24, 92]
 	.loc 1 1468 0
+	cbz	w0, .L928
+	.loc 1 1470 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL859:
+.LVL864:
 	cmn	w0, #1
-	beq	.L924
-.L826:
-	.loc 1 1476 0
-	ldr	x0, [x24, 88]
+	beq	.L929
+.L831:
+	.loc 1 1478 0
+	ldr	x0, [x24, 104]
 	adrp	x1, .LC88
-	.loc 1 1473 0
-	ldr	w3, [x24, 96]
-	.loc 1 1476 0
+	.loc 1 1475 0
+	ldr	w3, [x24, 112]
+	.loc 1 1478 0
 	add	x1, x1, :lo12:.LC88
-	.loc 1 1473 0
-	strb	w3, [x24, 32]
-.LVL860:
-.L890:
-	.loc 1 1476 0
+	.loc 1 1475 0
+	strb	w3, [x24, 48]
+.LVL865:
+.L895:
+	.loc 1 1478 0
 	and	w2, w3, 255
-	.loc 1 1474 0
-	lsr	w3, w3, 8
-	strb	w3, [x24, 33]
 	.loc 1 1476 0
+	lsr	w3, w3, 8
+	strb	w3, [x24, 49]
+	.loc 1 1478 0
 	bl	_dev_info
-.LVL861:
-	.loc 1 1477 0
+.LVL866:
+	.loc 1 1479 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL862:
-	b	.L801
-.LVL863:
-.L898:
-	.loc 1 1395 0
-	ldr	x0, [x24, 88]
+.LVL867:
+	b	.L806
+.LVL868:
+.L903:
+	.loc 1 1397 0
+	ldr	x0, [x24, 104]
 	adrp	x1, .LC83
 	add	x1, x1, :lo12:.LC83
 	bl	_dev_info
-.LVL864:
+.LVL869:
 .LBB1823:
-	.loc 1 1396 0
-	ldr	w0, [x24, 76]
-	cbz	w0, .L925
-.L784:
-.LVL865:
-.L782:
+	.loc 1 1398 0
+	ldr	w0, [x24, 92]
+	cbz	w0, .L930
+.L789:
+.LVL870:
+.L787:
 .LBE1823:
-	.loc 1 1397 0 discriminator 11
-	ldr	x0, [x24, 88]
-.LVL866:
+	.loc 1 1399 0 discriminator 11
+	ldr	x0, [x24, 104]
+.LVL871:
 	adrp	x1, .LC84
 	add	x1, x1, :lo12:.LC84
 	bl	_dev_info
-.LVL867:
-	b	.L889
-.LVL868:
-.L901:
+.LVL872:
+	b	.L894
+.LVL873:
+.L906:
+	.loc 1 1595 0
+	ldr	x0, [x24, 104]
 	.loc 1 1593 0
-	ldr	x0, [x24, 88]
-	.loc 1 1591 0
 	mov	w25, 1
-.LVL869:
-	.loc 1 1590 0
-	str	wzr, [x24, 188]
-	.loc 1 1593 0
+.LVL874:
+	.loc 1 1592 0
+	str	wzr, [x24, 204]
+	.loc 1 1595 0
 	adrp	x1, .LC92
-	.loc 1 1591 0
-	str	w25, [x24, 592]
 	.loc 1 1593 0
+	str	w25, [x24, 608]
+	.loc 1 1595 0
 	add	x1, x1, :lo12:.LC92
-	.loc 1 1592 0
-	str	wzr, [x24, 608]
-	.loc 1 1593 0
-	bl	_dev_info
-.LVL870:
 	.loc 1 1594 0
+	str	wzr, [x24, 624]
+	.loc 1 1595 0
+	bl	_dev_info
+.LVL875:
+	.loc 1 1596 0
 	mov	x0, 2
 	bl	ebc_notify
-.LVL871:
-	.loc 1 1595 0
+.LVL876:
+	.loc 1 1597 0
 	mov	w2, w25
 	mov	w1, w25
 	add	x0, x21, 328
 	bl	__wake_up_sync
-.LVL872:
-	b	.L841
-.LVL873:
-.L897:
-	.loc 1 1349 0
-	str	wzr, [x24, 592]
-	.loc 1 1350 0
+.LVL877:
+	b	.L846
+.LVL878:
+.L902:
+	.loc 1 1351 0
+	str	wzr, [x24, 608]
+	.loc 1 1352 0
 	mov	x0, 3
-.LVL874:
+.LVL879:
 	bl	ebc_notify
-.LVL875:
-	.loc 1 1351 0
-	ldr	x0, [x24, 88]
+.LVL880:
+	.loc 1 1353 0
+	ldr	x0, [x24, 104]
 	adrp	x1, .LC79
 	add	x1, x1, :lo12:.LC79
 	bl	_dev_info
-.LVL876:
-	b	.L771
-.LVL877:
-.L922:
+.LVL881:
+	b	.L776
+.LVL882:
+.L927:
 .LBB1827:
 .LBB1820:
 .LBB1821:
-	.loc 1 1562 0 discriminator 1
+	.loc 1 1564 0 discriminator 1
 	add	x27, x21, 352
 .LBE1821:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL878:
-	b	.L839
+.LVL883:
+	b	.L844
 	.p2align 3
-.L926:
-.LVL879:
+.L931:
+.LVL884:
 .LBB1822:
-	.loc 1 1562 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L836
-	.loc 1 1562 0 discriminator 7
+	.loc 1 1564 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L841
+	.loc 1 1564 0 discriminator 7
 	bl	schedule
-.LVL880:
-.L839:
-	.loc 1 1562 0 discriminator 9
+.LVL885:
+.L844:
+	.loc 1 1564 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x27
 	bl	prepare_to_wait_event
-.LVL881:
-	ldr	w1, [x24, 76]
-	cbz	w1, .L926
+.LVL886:
+	ldr	w1, [x24, 92]
+	cbz	w1, .L931
 .LBE1822:
-	.loc 1 1562 0 discriminator 4
+	.loc 1 1564 0 discriminator 4
 	mov	x0, x27
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL882:
-	b	.L836
-.L914:
+.LVL887:
+	b	.L841
+.L919:
 .LBE1820:
 .LBE1827:
 	mov	x0, x28
-	.loc 1 1421 0 is_stmt 1
-	cbnz	w1, .L796
-	.loc 1 1422 0
+	.loc 1 1423 0 is_stmt 1
+	cbnz	w1, .L801
+	.loc 1 1424 0
 	ldrsw	x2, [x24, 20]
-	ldp	x1, x0, [x24, 136]
+	ldp	x1, x0, [x24, 152]
 	bl	memcpy
-.LVL883:
-	ldr	x0, [x24, 208]
-	b	.L796
-.L925:
+.LVL888:
+	ldr	x0, [x24, 224]
+	b	.L801
+.L930:
 .LBB1828:
 .LBB1824:
 .LBB1825:
-	.loc 1 1396 0 discriminator 1
+	.loc 1 1398 0 discriminator 1
 	add	x26, x21, 352
-.LVL884:
+.LVL889:
 .LBE1825:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL885:
-	b	.L785
+.LVL890:
+	b	.L790
 	.p2align 3
-.L927:
-.LVL886:
+.L932:
+.LVL891:
 .LBB1826:
-	.loc 1 1396 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L782
-	.loc 1 1396 0 discriminator 7
+	.loc 1 1398 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L787
+	.loc 1 1398 0 discriminator 7
 	bl	schedule
-.LVL887:
-.L785:
-	.loc 1 1396 0 discriminator 9
+.LVL892:
+.L790:
+	.loc 1 1398 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x26
 	bl	prepare_to_wait_event
-.LVL888:
-	ldr	w1, [x24, 76]
-	cbz	w1, .L927
+.LVL893:
+	ldr	w1, [x24, 92]
+	cbz	w1, .L932
 .LBE1826:
-	.loc 1 1396 0 discriminator 4
+	.loc 1 1398 0 discriminator 4
 	mov	x0, x26
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL889:
-	b	.L782
-.LVL890:
+.LVL894:
+	b	.L787
+.LVL895:
 	.p2align 3
-.L915:
+.L920:
 .LBE1824:
 .LBE1828:
 .LBB1829:
 .LBB1815:
-	.loc 1 404 0 is_stmt 1
+	.loc 1 406 0 is_stmt 1
 	orr	w3, w3, 240
-	b	.L806
+	b	.L811
 	.p2align 3
-.L916:
-	.loc 1 410 0
+.L921:
+	.loc 1 412 0
 	orr	w3, w3, 3840
-	b	.L808
+	b	.L813
 	.p2align 3
-.L917:
-	.loc 1 416 0
+.L922:
+	.loc 1 418 0
 	orr	w3, w3, 61440
-	b	.L810
+	b	.L815
 	.p2align 3
-.L918:
-	.loc 1 422 0
+.L923:
+	.loc 1 424 0
 	orr	w3, w3, 983040
-	b	.L812
-.LVL891:
+	b	.L817
+.LVL896:
 	.p2align 3
-.L921:
-	.loc 1 440 0
+.L926:
+	.loc 1 442 0
 	orr	w3, w3, -268435456
-.LVL892:
-	.loc 1 445 0
+.LVL897:
+	.loc 1 447 0
 	and	w1, w1, w25
-.LVL893:
+.LVL898:
 	eor	w1, w1, w3
-.LVL894:
-	.loc 1 389 0
+.LVL899:
+	.loc 1 391 0
 	add	w4, w4, 1
 	and	w1, w1, w18
 	cmp	w4, w8
-	.loc 1 445 0
+	.loc 1 447 0
 	eor	w1, w3, w1
-	.loc 1 446 0
+	.loc 1 448 0
 	str	w1, [x7, x0]
-	.loc 1 389 0
-	ble	.L875
-.LVL895:
+	.loc 1 391 0
+	ble	.L880
+.LVL900:
 	.p2align 2
-.L821:
-	.loc 1 384 0
+.L826:
+	.loc 1 386 0
 	add	w14, w14, 1
 	add	w5, w5, w16
 	cmp	w14, w17
-	ble	.L874
-.L804:
+	ble	.L879
+.L809:
 .LBE1815:
 .LBE1829:
-	.loc 1 1428 0
-	add	x0, x21, 624
-	bl	up_write
-.LVL896:
-	.loc 1 1429 0
-	ldr	w0, [x24, 28]
-	cbnz	w0, .L801
 	.loc 1 1430 0
-	mov	w0, 1
-	str	w0, [x24, 28]
-	.loc 1 1432 0
-	ldr	w0, [x24, 184]
+	add	x0, x21, 704
+	bl	up_write
+.LVL901:
 	.loc 1 1431 0
-	str	wzr, [x24, 76]
+	ldr	w0, [x24, 44]
+	cbnz	w0, .L806
 	.loc 1 1432 0
-	cbz	w0, .L928
-.L822:
+	mov	w0, 1
+	str	w0, [x24, 44]
+	.loc 1 1434 0
+	ldr	w0, [x24, 200]
+	.loc 1 1433 0
+	str	wzr, [x24, 92]
 	.loc 1 1434 0
+	cbz	w0, .L933
+.L827:
+	.loc 1 1436 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL897:
+.LVL902:
 	cmn	w0, #1
-	beq	.L801
-	.loc 1 1438 0
-	ldr	w3, [x24, 96]
-	.loc 1 1441 0
+	beq	.L806
+	.loc 1 1440 0
+	ldr	w3, [x24, 112]
+	.loc 1 1443 0
 	adrp	x1, .LC86
-	.loc 1 1438 0
-	strb	w3, [x24, 32]
-	.loc 1 1441 0
+	.loc 1 1440 0
+	strb	w3, [x24, 48]
+	.loc 1 1443 0
 	add	x1, x1, :lo12:.LC86
-	ldr	x0, [x24, 88]
-	b	.L890
-.LVL898:
+	ldr	x0, [x24, 104]
+	b	.L895
+.LVL903:
 	.p2align 3
-.L919:
+.L924:
 .LBB1830:
 .LBB1816:
-	.loc 1 428 0
+	.loc 1 430 0
 	orr	w3, w3, 15728640
-	b	.L814
+	b	.L819
 	.p2align 3
-.L920:
-	.loc 1 434 0
+.L925:
+	.loc 1 436 0
 	orr	w3, w3, 251658240
-	b	.L816
-.LVL899:
-.L823:
+	b	.L821
+.LVL904:
+.L828:
 .LBE1816:
 .LBE1830:
-	.loc 1 1458 0
-	ldr	x0, [x24, 128]
+	.loc 1 1460 0
+	ldr	x0, [x24, 144]
 	mov	x3, x24
-	ldr	x2, [x24, 152]
+	ldr	x2, [x24, 168]
 	ldr	x1, [x28, 16]
 	bl	refresh_new_image_auto
-.LVL900:
-	b	.L824
-.LVL901:
-.L903:
+.LVL905:
+	b	.L829
+.LVL906:
+.L908:
 .LBB1831:
 .LBB1832:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
-.LVL902:
-	b	.L768
-.LVL903:
-.L923:
+.LVL907:
+	b	.L773
+.LVL908:
+.L928:
 .LBE1832:
 .LBE1831:
-	.loc 1 1467 0
+	.loc 1 1469 0
 	mov	x0, x20
-	bl	ebc_power_set.constprop.12
-.LVL904:
-	.loc 1 1468 0
+	bl	ebc_power_set.constprop.11
+.LVL909:
+	.loc 1 1470 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL905:
+.LVL910:
 	cmn	w0, #1
-	bne	.L826
-.L924:
-	.loc 1 1469 0
-	ldr	x0, [x24, 88]
+	bne	.L831
+.L929:
+	.loc 1 1471 0
+	ldr	x0, [x24, 104]
 	adrp	x1, .LC87
 	add	x1, x1, :lo12:.LC87
 	bl	_dev_err
-.LVL906:
-	.loc 1 1470 0
-	b	.L801
-.LVL907:
-.L928:
-	.loc 1 1433 0
+.LVL911:
+	.loc 1 1472 0
+	b	.L806
+.LVL912:
+.L933:
+	.loc 1 1435 0
 	mov	x0, x20
-	bl	ebc_power_set.constprop.12
-.LVL908:
-	b	.L822
-.LVL909:
-.L913:
-	.loc 1 1380 0
+	bl	ebc_power_set.constprop.11
+.LVL913:
+	b	.L827
+.LVL914:
+.L918:
+	.loc 1 1382 0
 	mov	x0, x20
-	bl	ebc_power_set.constprop.12
-.LVL910:
-	b	.L777
-.LVL911:
-.L904:
-	.loc 1 1628 0
+	bl	ebc_power_set.constprop.11
+.LVL915:
+	b	.L782
+.LVL916:
+.L909:
+	.loc 1 1630 0
 	bl	__stack_chk_fail
-.LVL912:
+.LVL917:
 	.cfi_endproc
 .LFE2826:
 	.size	ebc_thread, .-ebc_thread
@@ -9914,6 +9997,14 @@ ebc_auto_thread_sem:
 	.word	1
 	.xword	ebc_auto_thread_sem+8
 	.xword	ebc_auto_thread_sem+8
+	.type	waveform_misc, %object
+	.size	waveform_misc, 80
+waveform_misc:
+	.word	244
+	.zero	4
+	.xword	.LC102
+	.xword	waveform_ops
+	.zero	56
 	.type	dev_attr_waveform_version, %object
 	.size	dev_attr_waveform_version, 32
 dev_attr_waveform_version:
@@ -9994,24 +10085,24 @@ ebc_auto_task:
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.34976, %object
-	.size	__func__.34976, 11
-__func__.34976:
+	.type	__func__.34978, %object
+	.size	__func__.34978, 11
+__func__.34978:
 	.string	"ebc_io_ctl"
 	.align	3
 	.set	.LANCHOR3,. + 0
-	.type	__func__.34774, %object
-	.size	__func__.34774, 16
-__func__.34774:
+	.type	__func__.34776, %object
+	.size	__func__.34776, 16
+__func__.34776:
 	.string	"ebc_frame_start"
-	.type	__func__.35274, %object
-	.size	__func__.35274, 12
-__func__.35274:
+	.type	__func__.35288, %object
+	.size	__func__.35288, 12
+__func__.35288:
 	.string	"ebc_suspend"
 	.zero	4
-	.type	__func__.35208, %object
-	.size	__func__.35208, 19
-__func__.35208:
+	.type	__func__.35222, %object
+	.size	__func__.35222, 19
+__func__.35222:
 	.string	"ebc_lut_table_init"
 	.zero	5
 	.type	ebc_match, %object
@@ -10029,6 +10120,15 @@ ebc_pm:
 	.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:
@@ -10042,9 +10142,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init2529, %object
-	.size	__addressable_ebc_init2529, 8
-__addressable_ebc_init2529:
+	.type	__addressable_ebc_init2570, %object
+	.size	__addressable_ebc_init2570, 8
+__addressable_ebc_init2570:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -10102,7 +10202,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC16:
-	.string	"2.10"
+	.string	"2.11"
 	.zero	3
 .LC17:
 	.string	"%s\n"
@@ -10350,6 +10450,9 @@ __exitcall_ebc_exit:
 	.zero	6
 .LC101:
 	.string	"waveform_version"
+	.zero	7
+.LC102:
+	.string	"waveform"
 	.text
 .Letext0:
 	.file 19 "./include/uapi/asm-generic/int-ll64.h"
@@ -10550,16 +10653,16 @@ __exitcall_ebc_exit:
 	.file 214 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x1462c
+	.4byte	0x14730
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF3293
+	.4byte	.LASF3297
 	.byte	0x1
-	.4byte	.LASF3294
-	.4byte	.LASF3295
-	.4byte	.Ldebug_ranges0+0x1160
+	.4byte	.LASF3298
+	.4byte	.LASF3299
+	.4byte	.Ldebug_ranges0+0x1190
 	.8byte	0
 	.4byte	.Ldebug_line0
 	.uleb128 0x2
@@ -28109,7 +28212,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x3
 	.4byte	0x9224
 	.uleb128 0x46
-	.4byte	.LASF3024
+	.4byte	.LASF3028
 	.byte	0x1f
 	.2byte	0xba2
 	.4byte	0x9234
@@ -37812,10 +37915,10 @@ __exitcall_ebc_exit:
 	.4byte	0xe1f7
 	.uleb128 0x26
 	.4byte	.LASF2959
-	.2byte	0x268
+	.2byte	0x278
 	.byte	0x1
 	.byte	0x33
-	.4byte	0xe429
+	.4byte	0xe441
 	.uleb128 0xe
 	.4byte	.LASF2960
 	.byte	0x1
@@ -37850,64 +37953,64 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2965
 	.byte	0x1
 	.byte	0x39
-	.4byte	0xc6
-	.byte	0x1c
+	.4byte	0x29
+	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF2966
 	.byte	0x1
 	.byte	0x3a
-	.4byte	0x61
-	.byte	0x20
+	.4byte	0xc6
+	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF2967
 	.byte	0x1
 	.byte	0x3b
-	.4byte	0x61
-	.byte	0x21
+	.4byte	0xc6
+	.byte	0x2c
 	.uleb128 0xe
 	.4byte	.LASF2968
 	.byte	0x1
 	.byte	0x3c
-	.4byte	0xc6
-	.byte	0x24
+	.4byte	0x61
+	.byte	0x30
 	.uleb128 0xe
 	.4byte	.LASF2969
 	.byte	0x1
 	.byte	0x3d
-	.4byte	0xc6
-	.byte	0x28
+	.4byte	0x61
+	.byte	0x31
 	.uleb128 0xe
 	.4byte	.LASF2970
 	.byte	0x1
 	.byte	0x3e
 	.4byte	0xc6
-	.byte	0x2c
+	.byte	0x34
 	.uleb128 0xe
 	.4byte	.LASF2971
 	.byte	0x1
 	.byte	0x3f
 	.4byte	0xc6
-	.byte	0x30
+	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2898
+	.4byte	.LASF2972
 	.byte	0x1
 	.byte	0x40
 	.4byte	0xc6
-	.byte	0x34
+	.byte	0x3c
 	.uleb128 0xe
-	.4byte	.LASF262
+	.4byte	.LASF2973
 	.byte	0x1
 	.byte	0x41
 	.4byte	0xc6
-	.byte	0x38
+	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2972
+	.4byte	.LASF2898
 	.byte	0x1
 	.byte	0x42
-	.4byte	0x467e
-	.byte	0x40
+	.4byte	0xc6
+	.byte	0x44
 	.uleb128 0xe
-	.4byte	.LASF2973
+	.4byte	.LASF262
 	.byte	0x1
 	.byte	0x43
 	.4byte	0xc6
@@ -37916,43 +38019,43 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2974
 	.byte	0x1
 	.byte	0x44
-	.4byte	0xc6
-	.byte	0x4c
+	.4byte	0x467e
+	.byte	0x50
 	.uleb128 0xe
 	.4byte	.LASF2975
 	.byte	0x1
 	.byte	0x45
 	.4byte	0xc6
-	.byte	0x50
-	.uleb128 0x20
-	.string	"dev"
-	.byte	0x1
-	.byte	0x46
-	.4byte	0xa570
 	.byte	0x58
 	.uleb128 0xe
 	.4byte	.LASF2976
 	.byte	0x1
-	.byte	0x47
-	.4byte	0xd88c
-	.byte	0x60
+	.byte	0x46
+	.4byte	0xc6
+	.byte	0x5c
 	.uleb128 0xe
 	.4byte	.LASF2977
 	.byte	0x1
+	.byte	0x47
+	.4byte	0xc6
+	.byte	0x60
+	.uleb128 0x20
+	.string	"dev"
+	.byte	0x1
 	.byte	0x48
-	.4byte	0x2f05
-	.byte	0x78
+	.4byte	0xa570
+	.byte	0x68
 	.uleb128 0xe
 	.4byte	.LASF2978
 	.byte	0x1
-	.byte	0x4a
-	.4byte	0x467e
-	.byte	0x80
+	.byte	0x49
+	.4byte	0xd88c
+	.byte	0x70
 	.uleb128 0xe
 	.4byte	.LASF2979
 	.byte	0x1
-	.byte	0x4b
-	.4byte	0x467e
+	.byte	0x4a
+	.4byte	0x2f05
 	.byte	0x88
 	.uleb128 0xe
 	.4byte	.LASF2980
@@ -37963,121 +38066,133 @@ __exitcall_ebc_exit:
 	.uleb128 0xe
 	.4byte	.LASF2981
 	.byte	0x1
-	.byte	0x4e
-	.4byte	0xc0c8
+	.byte	0x4d
+	.4byte	0x467e
 	.byte	0x98
 	.uleb128 0xe
 	.4byte	.LASF2982
 	.byte	0x1
-	.byte	0x4f
-	.4byte	0xc0c8
+	.byte	0x4e
+	.4byte	0x467e
 	.byte	0xa0
 	.uleb128 0xe
 	.4byte	.LASF2983
 	.byte	0x1
 	.byte	0x50
-	.4byte	0xe429
+	.4byte	0xc0c8
 	.byte	0xa8
 	.uleb128 0xe
 	.4byte	.LASF2984
 	.byte	0x1
 	.byte	0x51
-	.4byte	0xc6
-	.byte	0xb8
+	.4byte	0xc0c8
+	.byte	0xb0
 	.uleb128 0xe
 	.4byte	.LASF2985
 	.byte	0x1
 	.byte	0x52
-	.4byte	0xc6
-	.byte	0xbc
+	.4byte	0xe441
+	.byte	0xb8
 	.uleb128 0xe
 	.4byte	.LASF2986
 	.byte	0x1
 	.byte	0x53
-	.4byte	0x21e
-	.byte	0xc0
+	.4byte	0xc6
+	.byte	0xc8
 	.uleb128 0xe
 	.4byte	.LASF2987
 	.byte	0x1
 	.byte	0x54
-	.4byte	0xe439
-	.byte	0xc8
+	.4byte	0xc6
+	.byte	0xcc
 	.uleb128 0xe
 	.4byte	.LASF2988
 	.byte	0x1
 	.byte	0x55
-	.4byte	0xe439
+	.4byte	0x21e
 	.byte	0xd0
 	.uleb128 0xe
 	.4byte	.LASF2989
 	.byte	0x1
-	.byte	0x57
-	.4byte	0xd802
+	.byte	0x56
+	.4byte	0xe451
 	.byte	0xd8
-	.uleb128 0x27
+	.uleb128 0xe
 	.4byte	.LASF2990
 	.byte	0x1
-	.byte	0x58
-	.4byte	0xc6
-	.2byte	0x1a8
-	.uleb128 0x27
+	.byte	0x57
+	.4byte	0xe451
+	.byte	0xe0
+	.uleb128 0xe
 	.4byte	.LASF2991
 	.byte	0x1
-	.byte	0x5a
-	.4byte	0xc6
-	.2byte	0x1ac
+	.byte	0x59
+	.4byte	0xd802
+	.byte	0xe8
 	.uleb128 0x27
 	.4byte	.LASF2992
 	.byte	0x1
-	.byte	0x5c
-	.4byte	0x3172
-	.2byte	0x1b0
+	.byte	0x5a
+	.4byte	0xc6
+	.2byte	0x1b8
 	.uleb128 0x27
 	.4byte	.LASF2993
 	.byte	0x1
-	.byte	0x5f
-	.4byte	0x3172
-	.2byte	0x1e8
+	.byte	0x5c
+	.4byte	0xc6
+	.2byte	0x1bc
 	.uleb128 0x27
 	.4byte	.LASF2994
 	.byte	0x1
-	.byte	0x62
-	.4byte	0x320b
-	.2byte	0x220
+	.byte	0x5e
+	.4byte	0x3172
+	.2byte	0x1c0
 	.uleb128 0x27
 	.4byte	.LASF2995
 	.byte	0x1
-	.byte	0x65
-	.4byte	0xc6
-	.2byte	0x250
+	.byte	0x61
+	.4byte	0x3172
+	.2byte	0x1f8
 	.uleb128 0x27
 	.4byte	.LASF2996
 	.byte	0x1
+	.byte	0x64
+	.4byte	0x320b
+	.2byte	0x230
+	.uleb128 0x27
+	.4byte	.LASF2997
+	.byte	0x1
 	.byte	0x67
 	.4byte	0xc6
-	.2byte	0x254
+	.2byte	0x260
 	.uleb128 0x27
-	.4byte	.LASF2997
+	.4byte	.LASF2998
 	.byte	0x1
 	.byte	0x69
 	.4byte	0xc6
-	.2byte	0x258
+	.2byte	0x264
 	.uleb128 0x27
-	.4byte	.LASF2998
+	.4byte	.LASF2999
 	.byte	0x1
 	.byte	0x6b
 	.4byte	0xc6
-	.2byte	0x25c
+	.2byte	0x268
 	.uleb128 0x27
-	.4byte	.LASF2999
+	.4byte	.LASF3000
 	.byte	0x1
-	.byte	0x6c
+	.byte	0x6d
 	.4byte	0xc6
-	.2byte	0x260
+	.2byte	0x26c
+	.uleb128 0x27
+	.4byte	.LASF3001
+	.byte	0x1
+	.byte	0x6e
+	.4byte	0xc6
+	.2byte	0x270
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x458
-	.4byte	0xe439
+	.4byte	0xe451
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
@@ -38087,2668 +38202,2732 @@ __exitcall_ebc_exit:
 	.4byte	0xd8ec
 	.uleb128 0x4a
 	.string	"ebc"
-	.2byte	0x320
+	.2byte	0x330
 	.byte	0x1
-	.byte	0x6f
-	.4byte	0xe489
+	.byte	0x71
+	.4byte	0xe4a1
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x1
-	.byte	0x70
+	.byte	0x72
 	.4byte	0xa570
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF2934
 	.byte	0x1
-	.byte	0x71
+	.byte	0x73
 	.4byte	0xe120
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF2935
 	.byte	0x1
-	.byte	0x72
+	.byte	0x74
 	.4byte	0xdb20
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF3000
+	.4byte	.LASF3002
 	.byte	0x1
-	.byte	0x73
+	.byte	0x75
 	.4byte	0xdf1b
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF1774
 	.byte	0x1
-	.byte	0x74
+	.byte	0x76
 	.4byte	0xe20d
 	.byte	0xb8
 	.byte	0
 	.uleb128 0x4b
-	.4byte	.LASF3001
+	.4byte	.LASF3003
 	.byte	0x1
-	.byte	0x77
-	.4byte	0xe49e
+	.byte	0x79
+	.4byte	0xe4b6
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	global_ebc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe43f
+	.4byte	0xe457
 	.uleb128 0x4b
-	.4byte	.LASF3002
+	.4byte	.LASF3004
 	.byte	0x1
-	.byte	0x78
+	.byte	0x7a
 	.4byte	0x2f05
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_auto_task
 	.uleb128 0x4b
-	.4byte	.LASF3003
+	.4byte	.LASF3005
 	.byte	0x1
-	.byte	0x79
+	.byte	0x7b
 	.4byte	0x4e36
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	auto_buf_sema
 	.uleb128 0x4b
-	.4byte	.LASF3004
+	.4byte	.LASF3006
 	.byte	0x1
-	.byte	0x7b
+	.byte	0x7d
 	.4byte	0x159a
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_wq
 	.uleb128 0x4b
-	.4byte	.LASF3005
+	.4byte	.LASF3007
 	.byte	0x1
-	.byte	0x7c
+	.byte	0x7e
 	.4byte	0x159a
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_thread_wq
 	.uleb128 0x4b
-	.4byte	.LASF3006
+	.4byte	.LASF3008
 	.byte	0x1
-	.byte	0x7d
+	.byte	0x7f
 	.4byte	0x159a
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_poweroff_wq
 	.uleb128 0x4b
-	.4byte	.LASF3007
+	.4byte	.LASF3009
 	.byte	0x1
-	.byte	0x7e
+	.byte	0x80
 	.4byte	0x5b71
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_auto_thread_sem
 	.uleb128 0x4c
-	.4byte	.LASF3008
+	.4byte	.LASF3010
+	.byte	0x1
+	.2byte	0x7a4
+	.4byte	0x7c9
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	ebc_ops
+	.uleb128 0x4c
+	.4byte	.LASF3011
+	.byte	0x1
+	.2byte	0x7ae
+	.4byte	0xc610
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	ebc_misc
+	.uleb128 0x4c
+	.4byte	.LASF3012
 	.byte	0x1
-	.2byte	0x7a2
+	.2byte	0x7cb
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	ebc_ops
+	.8byte	waveform_ops
 	.uleb128 0x4c
-	.4byte	.LASF3009
+	.4byte	.LASF3013
 	.byte	0x1
-	.2byte	0x7ac
+	.2byte	0x7d1
 	.4byte	0xc610
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	ebc_misc
+	.8byte	waveform_misc
 	.uleb128 0x4c
-	.4byte	.LASF3010
+	.4byte	.LASF3014
 	.byte	0x1
-	.2byte	0x7bb
+	.2byte	0x7e0
 	.4byte	0xb39d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_waveform_version
 	.uleb128 0x4c
-	.4byte	.LASF3011
+	.4byte	.LASF3015
 	.byte	0x1
-	.2byte	0x7c6
+	.2byte	0x7eb
 	.4byte	0xb39d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_name
 	.uleb128 0x4c
-	.4byte	.LASF3012
+	.4byte	.LASF3016
 	.byte	0x1
-	.2byte	0x7d4
+	.2byte	0x7f9
 	.4byte	0xb39d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_temp
 	.uleb128 0x4c
-	.4byte	.LASF3013
+	.4byte	.LASF3017
 	.byte	0x1
-	.2byte	0x7f7
+	.2byte	0x81c
 	.4byte	0xb39d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_vcom
 	.uleb128 0x4c
-	.4byte	.LASF3014
+	.4byte	.LASF3018
 	.byte	0x1
-	.2byte	0x801
+	.2byte	0x826
 	.4byte	0xb39d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_version
 	.uleb128 0x4c
-	.4byte	.LASF3015
+	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x80a
+	.2byte	0x82f
 	.4byte	0xb39d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_state
 	.uleb128 0x4c
-	.4byte	.LASF3016
+	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x813
+	.2byte	0x838
 	.4byte	0xb39d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_buf_state
 	.uleb128 0x4c
-	.4byte	.LASF3017
+	.4byte	.LASF3021
 	.byte	0x1
-	.2byte	0x9c2
+	.2byte	0x9eb
 	.4byte	0xa55c
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_pm
 	.uleb128 0x5
 	.4byte	0xb19b
-	.4byte	0xe60e
+	.4byte	0xe652
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe5fe
+	.4byte	0xe642
 	.uleb128 0x4c
-	.4byte	.LASF3018
+	.4byte	.LASF3022
 	.byte	0x1
-	.2byte	0x9c7
-	.4byte	0xe60e
+	.2byte	0x9f0
+	.4byte	0xe652
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_match
 	.uleb128 0x4c
-	.4byte	.LASF3019
+	.4byte	.LASF3023
 	.byte	0x1
-	.2byte	0x9cd
+	.2byte	0x9f6
 	.4byte	0xd69e
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_driver
 	.uleb128 0x4c
-	.4byte	.LASF3020
+	.4byte	.LASF3024
 	.byte	0x1
-	.2byte	0x9e1
+	.2byte	0xa0a
 	.4byte	0x458
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init2529
+	.8byte	__addressable_ebc_init2570
 	.uleb128 0x4c
-	.4byte	.LASF3021
+	.4byte	.LASF3025
 	.byte	0x1
-	.2byte	0x9e2
+	.2byte	0xa0b
 	.4byte	0x4ac
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	__exitcall_ebc_exit
 	.uleb128 0x4d
-	.4byte	.LASF3071
+	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0x9dc
-	.8byte	.LFB2853
-	.8byte	.LFE2853-.LFB2853
+	.2byte	0xa05
+	.8byte	.LFB2855
+	.8byte	.LFE2855-.LFB2855
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe697
+	.4byte	0xe6db
 	.uleb128 0x4e
 	.8byte	.LVL64
-	.4byte	0x14316
+	.4byte	0x1441a
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3022
+	.4byte	.LASF3026
 	.byte	0x1
-	.2byte	0x9d7
+	.2byte	0xa00
 	.4byte	0xc6
-	.8byte	.LFB2852
-	.8byte	.LFE2852-.LFB2852
+	.8byte	.LFB2854
+	.8byte	.LFE2854-.LFB2854
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe6c7
+	.4byte	0xe70b
 	.uleb128 0x4e
-	.8byte	.LVL352
-	.4byte	0x14322
+	.8byte	.LVL356
+	.4byte	0x14426
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3023
+	.4byte	.LASF3027
 	.byte	0x1
-	.2byte	0x9b6
+	.2byte	0x9df
 	.4byte	0xc6
-	.8byte	.LFB2851
-	.8byte	.LFE2851-.LFB2851
+	.8byte	.LFB2853
+	.8byte	.LFE2853-.LFB2853
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe763
+	.4byte	0xe7a7
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x9b6
+	.2byte	0x9df
 	.4byte	0xa570
 	.4byte	.LLST11
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x9b8
-	.4byte	0xe49e
+	.2byte	0x9e1
+	.4byte	0xe4b6
 	.uleb128 0x46
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x9b9
-	.4byte	0xe763
+	.2byte	0x9e2
+	.4byte	0xe7a7
 	.uleb128 0x53
-	.4byte	0x136b1
-	.8byte	.LBB940
-	.8byte	.LBE940-.LBB940
+	.4byte	0x13781
+	.8byte	.LBB938
+	.8byte	.LBE938-.LBB938
 	.byte	0x1
-	.2byte	0x9b8
-	.4byte	0xe733
+	.2byte	0x9e1
+	.4byte	0xe777
 	.uleb128 0x54
-	.4byte	0x136c2
+	.4byte	0x13792
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132a2
-	.8byte	.LBB942
-	.8byte	.LBE942-.LBB942
+	.4byte	0x13369
+	.8byte	.LBB940
+	.8byte	.LBE940-.LBB940
 	.byte	0x1
-	.2byte	0x9bb
-	.4byte	0xe755
+	.2byte	0x9e4
+	.4byte	0xe799
 	.uleb128 0x54
-	.4byte	0x132ae
+	.4byte	0x13376
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL68
-	.4byte	0x1432e
+	.4byte	0x14432
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xe20d
 	.uleb128 0x50
-	.4byte	.LASF3025
+	.4byte	.LASF3029
 	.byte	0x1
-	.2byte	0x9a5
+	.2byte	0x9ce
 	.4byte	0xc6
-	.8byte	.LFB2850
-	.8byte	.LFE2850-.LFB2850
+	.8byte	.LFB2852
+	.8byte	.LFE2852-.LFB2852
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe870
+	.4byte	0xe8b4
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x9a5
+	.2byte	0x9ce
 	.4byte	0xa570
-	.4byte	.LLST146
+	.4byte	.LLST148
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x9a7
-	.4byte	0xe49e
+	.2byte	0x9d0
+	.4byte	0xe4b6
 	.uleb128 0x46
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x9a8
-	.4byte	0xe763
+	.2byte	0x9d1
+	.4byte	0xe7a7
 	.uleb128 0x55
-	.4byte	.LASF3026
-	.4byte	0xe880
+	.4byte	.LASF3030
+	.4byte	0xe8c4
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35274
+	.8byte	__func__.35288
 	.uleb128 0x53
-	.4byte	0x136b1
-	.8byte	.LBB1424
-	.8byte	.LBE1424-.LBB1424
+	.4byte	0x13781
+	.8byte	.LBB1422
+	.8byte	.LBE1422-.LBB1422
 	.byte	0x1
-	.2byte	0x9a7
-	.4byte	0xe7e8
+	.2byte	0x9d0
+	.4byte	0xe82c
 	.uleb128 0x54
-	.4byte	0x136c2
+	.4byte	0x13792
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132ba
-	.8byte	.LBB1426
-	.8byte	.LBE1426-.LBB1426
+	.4byte	0x13382
+	.8byte	.LBB1424
+	.8byte	.LBE1424-.LBB1424
 	.byte	0x1
-	.2byte	0x9b0
-	.4byte	0xe80a
+	.2byte	0x9d9
+	.4byte	0xe84e
 	.uleb128 0x54
-	.4byte	0x132c6
+	.4byte	0x1338f
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13008
-	.8byte	.LBB1428
-	.8byte	.LBE1428-.LBB1428
+	.4byte	0x130ca
+	.8byte	.LBB1426
+	.8byte	.LBE1426-.LBB1426
 	.byte	0x1
-	.2byte	0x9ac
-	.4byte	0xe855
+	.2byte	0x9d5
+	.4byte	0xe899
 	.uleb128 0x54
-	.4byte	0x13023
+	.4byte	0x130e5
 	.uleb128 0x54
-	.4byte	0x13018
+	.4byte	0x130da
 	.uleb128 0x56
-	.8byte	.LBB1429
-	.8byte	.LBE1429-.LBB1429
+	.8byte	.LBB1427
+	.8byte	.LBE1427-.LBB1427
 	.uleb128 0x57
-	.4byte	0x1302e
+	.4byte	0x130f0
 	.uleb128 0x4e
-	.8byte	.LVL517
-	.4byte	0x141a6
+	.8byte	.LVL521
+	.4byte	0x142aa
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL515
-	.4byte	0x1432e
+	.8byte	.LVL519
+	.4byte	0x14432
 	.uleb128 0x4e
-	.8byte	.LVL516
-	.4byte	0x1432e
+	.8byte	.LVL520
+	.4byte	0x14432
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xe880
+	.4byte	0xe8c4
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xb
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe870
+	.4byte	0xe8b4
 	.uleb128 0x4f
-	.4byte	.LASF3027
+	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0x99e
+	.2byte	0x9c7
 	.4byte	0xc6
-	.8byte	.LFB2849
-	.8byte	.LFE2849-.LFB2849
+	.8byte	.LFB2851
+	.8byte	.LFE2851-.LFB2851
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe8c5
+	.4byte	0xe909
 	.uleb128 0x58
-	.4byte	.LASF3028
+	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0x99e
+	.2byte	0x9c7
 	.4byte	0xd71a
 	.4byte	.LLST13
 	.uleb128 0x4e
 	.8byte	.LVL74
-	.4byte	0x1433b
+	.4byte	0x1443f
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3029
+	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0x91d
+	.2byte	0x946
 	.4byte	0xc6
-	.8byte	.LFB2848
-	.8byte	.LFE2848-.LFB2848
+	.8byte	.LFB2850
+	.8byte	.LFE2850-.LFB2850
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfd3c
+	.4byte	0xfd84
 	.uleb128 0x58
-	.4byte	.LASF3028
+	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0x91d
+	.2byte	0x946
 	.4byte	0xd71a
-	.4byte	.LLST147
+	.4byte	.LLST149
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x91f
+	.2byte	0x948
 	.4byte	0xa570
 	.uleb128 0x46
-	.4byte	.LASF3030
+	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0x920
+	.2byte	0x949
 	.4byte	0xb894
 	.uleb128 0x59
-	.4byte	.LASF3031
+	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0x921
+	.2byte	0x94a
 	.4byte	0xd71a
-	.4byte	.LLST148
+	.4byte	.LLST150
 	.uleb128 0x46
-	.4byte	.LASF3032
+	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0x922
+	.2byte	0x94b
 	.4byte	0xb894
 	.uleb128 0x59
-	.4byte	.LASF3033
+	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0x923
+	.2byte	0x94c
 	.4byte	0xc043
-	.4byte	.LLST149
+	.4byte	.LLST151
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x924
-	.4byte	0xe49e
+	.2byte	0x94d
+	.4byte	0xe4b6
 	.uleb128 0x59
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x925
-	.4byte	0xe763
-	.4byte	.LLST150
+	.2byte	0x94e
+	.4byte	0xe7a7
+	.4byte	.LLST152
 	.uleb128 0x46
-	.4byte	.LASF3000
+	.4byte	.LASF3002
 	.byte	0x1
-	.2byte	0x926
+	.2byte	0x94f
 	.4byte	0xe160
 	.uleb128 0x59
 	.4byte	.LASF962
 	.byte	0x1
-	.2byte	0x927
+	.2byte	0x950
 	.4byte	0xbcc0
-	.4byte	.LLST151
+	.4byte	.LLST153
 	.uleb128 0x46
 	.4byte	.LASF2421
 	.byte	0x1
-	.2byte	0x928
+	.2byte	0x951
 	.4byte	0xbc60
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x929
+	.2byte	0x952
 	.4byte	0xc6
 	.uleb128 0x59
 	.4byte	.LASF987
 	.byte	0x1
-	.2byte	0x92a
+	.2byte	0x953
 	.4byte	0xc6
-	.4byte	.LLST152
+	.4byte	.LLST154
 	.uleb128 0x5a
 	.string	"i"
 	.byte	0x1
-	.2byte	0x92b
+	.2byte	0x954
 	.4byte	0xc6
-	.4byte	.LLST153
+	.4byte	.LLST155
 	.uleb128 0x5b
-	.4byte	0x136cf
-	.8byte	.LBB1580
+	.4byte	0x1379f
+	.8byte	.LBB1578
 	.4byte	.Ldebug_ranges0+0xc00
 	.byte	0x1
-	.2byte	0x92d
-	.4byte	0xe9de
+	.2byte	0x956
+	.4byte	0xea22
 	.uleb128 0x54
-	.4byte	0x136f8
+	.4byte	0x137c8
 	.uleb128 0x54
-	.4byte	0x136ec
+	.4byte	0x137bc
 	.uleb128 0x54
-	.4byte	0x136e0
+	.4byte	0x137b0
 	.uleb128 0x4e
-	.8byte	.LVL520
-	.4byte	0x14347
+	.8byte	.LVL524
+	.4byte	0x1444b
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135ac
-	.8byte	.LBB1584
-	.8byte	.LBE1584-.LBB1584
+	.4byte	0x1367b
+	.8byte	.LBB1582
+	.8byte	.LBE1582-.LBB1582
 	.byte	0x1
-	.2byte	0x93f
-	.4byte	0xea1d
+	.2byte	0x968
+	.4byte	0xea61
 	.uleb128 0x54
-	.4byte	0x135bc
+	.4byte	0x1368b
 	.uleb128 0x5c
-	.4byte	0x136b1
-	.8byte	.LBB1585
-	.8byte	.LBE1585-.LBB1585
+	.4byte	0x13781
+	.8byte	.LBB1583
+	.8byte	.LBE1583-.LBB1583
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x54
-	.4byte	0x136c2
+	.4byte	0x13792
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135ce
-	.8byte	.LBB1587
-	.8byte	.LBE1587-.LBB1587
+	.4byte	0x1369d
+	.8byte	.LBB1585
+	.8byte	.LBE1585-.LBB1585
 	.byte	0x1
-	.2byte	0x95a
-	.4byte	0xea5d
+	.2byte	0x983
+	.4byte	0xeaa1
 	.uleb128 0x54
-	.4byte	0x135df
+	.4byte	0x136ae
 	.uleb128 0x5d
-	.4byte	0x136b1
-	.8byte	.LBB1588
-	.8byte	.LBE1588-.LBB1588
+	.4byte	0x13781
+	.8byte	.LBB1586
+	.8byte	.LBE1586-.LBB1586
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x54
-	.4byte	0x136c2
+	.4byte	0x13792
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x116cd
-	.8byte	.LBB1590
+	.4byte	0x1178f
+	.8byte	.LBB1588
 	.4byte	.Ldebug_ranges0+0xc30
 	.byte	0x1
-	.2byte	0x96e
-	.4byte	0xf432
+	.2byte	0x997
+	.4byte	0xf476
 	.uleb128 0x54
-	.4byte	0x116de
+	.4byte	0x117a0
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xc30
 	.uleb128 0x57
-	.4byte	0x116ea
+	.4byte	0x117ac
 	.uleb128 0x5b
-	.4byte	0x135f2
-	.8byte	.LBB1592
+	.4byte	0x136c1
+	.8byte	.LBB1590
 	.4byte	.Ldebug_ranges0+0xc80
 	.byte	0x1
-	.2byte	0x684
-	.4byte	0xeaed
+	.2byte	0x686
+	.4byte	0xeb31
 	.uleb128 0x54
-	.4byte	0x1361a
+	.4byte	0x136e9
 	.uleb128 0x54
-	.4byte	0x1360e
+	.4byte	0x136dd
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x136d2
 	.uleb128 0x5f
-	.4byte	0x13627
-	.8byte	.LBB1593
+	.4byte	0x136f6
+	.8byte	.LBB1591
 	.4byte	.Ldebug_ranges0+0xc80
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1365b
+	.4byte	0x1372a
 	.uleb128 0x54
-	.4byte	0x1364f
+	.4byte	0x1371e
 	.uleb128 0x54
-	.4byte	0x13643
+	.4byte	0x13712
 	.uleb128 0x54
-	.4byte	0x13638
+	.4byte	0x13707
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xc80
 	.uleb128 0x57
-	.4byte	0x13666
+	.4byte	0x13735
 	.uleb128 0x4e
-	.8byte	.LVL545
-	.4byte	0x14354
+	.8byte	.LVL549
+	.4byte	0x14458
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135f2
-	.8byte	.LBB1604
-	.8byte	.LBE1604-.LBB1604
+	.4byte	0x136c1
+	.8byte	.LBB1602
+	.8byte	.LBE1602-.LBB1602
 	.byte	0x1
-	.2byte	0x687
-	.4byte	0xeb6a
+	.2byte	0x689
+	.4byte	0xebae
 	.uleb128 0x54
-	.4byte	0x1361a
+	.4byte	0x136e9
 	.uleb128 0x54
-	.4byte	0x1360e
+	.4byte	0x136dd
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x136d2
 	.uleb128 0x5d
-	.4byte	0x13627
-	.8byte	.LBB1605
-	.8byte	.LBE1605-.LBB1605
+	.4byte	0x136f6
+	.8byte	.LBB1603
+	.8byte	.LBE1603-.LBB1603
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1365b
+	.4byte	0x1372a
 	.uleb128 0x54
-	.4byte	0x1364f
+	.4byte	0x1371e
 	.uleb128 0x54
-	.4byte	0x13643
+	.4byte	0x13712
 	.uleb128 0x54
-	.4byte	0x13638
+	.4byte	0x13707
 	.uleb128 0x56
-	.8byte	.LBB1606
-	.8byte	.LBE1606-.LBB1606
+	.8byte	.LBB1604
+	.8byte	.LBE1604-.LBB1604
 	.uleb128 0x57
-	.4byte	0x13666
+	.4byte	0x13735
 	.uleb128 0x4e
-	.8byte	.LVL546
-	.4byte	0x14354
+	.8byte	.LVL550
+	.4byte	0x14458
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135f2
-	.8byte	.LBB1607
-	.8byte	.LBE1607-.LBB1607
+	.4byte	0x136c1
+	.8byte	.LBB1605
+	.8byte	.LBE1605-.LBB1605
 	.byte	0x1
-	.2byte	0x68a
-	.4byte	0xebe7
+	.2byte	0x68c
+	.4byte	0xec2b
 	.uleb128 0x54
-	.4byte	0x1361a
+	.4byte	0x136e9
 	.uleb128 0x54
-	.4byte	0x1360e
+	.4byte	0x136dd
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x136d2
 	.uleb128 0x5d
-	.4byte	0x13627
-	.8byte	.LBB1608
-	.8byte	.LBE1608-.LBB1608
+	.4byte	0x136f6
+	.8byte	.LBB1606
+	.8byte	.LBE1606-.LBB1606
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1365b
+	.4byte	0x1372a
 	.uleb128 0x54
-	.4byte	0x1364f
+	.4byte	0x1371e
 	.uleb128 0x54
-	.4byte	0x13643
+	.4byte	0x13712
 	.uleb128 0x54
-	.4byte	0x13638
+	.4byte	0x13707
 	.uleb128 0x56
-	.8byte	.LBB1609
-	.8byte	.LBE1609-.LBB1609
+	.8byte	.LBB1607
+	.8byte	.LBE1607-.LBB1607
 	.uleb128 0x57
-	.4byte	0x13666
+	.4byte	0x13735
 	.uleb128 0x4e
-	.8byte	.LVL547
-	.4byte	0x14354
+	.8byte	.LVL551
+	.4byte	0x14458
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135f2
-	.8byte	.LBB1610
-	.8byte	.LBE1610-.LBB1610
+	.4byte	0x136c1
+	.8byte	.LBB1608
+	.8byte	.LBE1608-.LBB1608
 	.byte	0x1
-	.2byte	0x68d
-	.4byte	0xec64
+	.2byte	0x68f
+	.4byte	0xeca8
 	.uleb128 0x54
-	.4byte	0x1361a
+	.4byte	0x136e9
 	.uleb128 0x54
-	.4byte	0x1360e
+	.4byte	0x136dd
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x136d2
 	.uleb128 0x5d
-	.4byte	0x13627
-	.8byte	.LBB1611
-	.8byte	.LBE1611-.LBB1611
+	.4byte	0x136f6
+	.8byte	.LBB1609
+	.8byte	.LBE1609-.LBB1609
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1365b
+	.4byte	0x1372a
 	.uleb128 0x54
-	.4byte	0x1364f
+	.4byte	0x1371e
 	.uleb128 0x54
-	.4byte	0x13643
+	.4byte	0x13712
 	.uleb128 0x54
-	.4byte	0x13638
+	.4byte	0x13707
 	.uleb128 0x56
-	.8byte	.LBB1612
-	.8byte	.LBE1612-.LBB1612
+	.8byte	.LBB1610
+	.8byte	.LBE1610-.LBB1610
 	.uleb128 0x57
-	.4byte	0x13666
+	.4byte	0x13735
 	.uleb128 0x4e
-	.8byte	.LVL548
-	.4byte	0x14354
+	.8byte	.LVL552
+	.4byte	0x14458
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135f2
-	.8byte	.LBB1613
-	.8byte	.LBE1613-.LBB1613
+	.4byte	0x136c1
+	.8byte	.LBB1611
+	.8byte	.LBE1611-.LBB1611
 	.byte	0x1
-	.2byte	0x690
-	.4byte	0xece1
+	.2byte	0x692
+	.4byte	0xed25
 	.uleb128 0x54
-	.4byte	0x1361a
+	.4byte	0x136e9
 	.uleb128 0x54
-	.4byte	0x1360e
+	.4byte	0x136dd
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x136d2
 	.uleb128 0x5d
-	.4byte	0x13627
-	.8byte	.LBB1614
-	.8byte	.LBE1614-.LBB1614
+	.4byte	0x136f6
+	.8byte	.LBB1612
+	.8byte	.LBE1612-.LBB1612
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1365b
+	.4byte	0x1372a
 	.uleb128 0x54
-	.4byte	0x1364f
+	.4byte	0x1371e
 	.uleb128 0x54
-	.4byte	0x13643
+	.4byte	0x13712
 	.uleb128 0x54
-	.4byte	0x13638
+	.4byte	0x13707
 	.uleb128 0x56
-	.8byte	.LBB1615
-	.8byte	.LBE1615-.LBB1615
+	.8byte	.LBB1613
+	.8byte	.LBE1613-.LBB1613
 	.uleb128 0x57
-	.4byte	0x13666
+	.4byte	0x13735
 	.uleb128 0x4e
-	.8byte	.LVL549
-	.4byte	0x14354
+	.8byte	.LVL553
+	.4byte	0x14458
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135f2
-	.8byte	.LBB1616
-	.8byte	.LBE1616-.LBB1616
+	.4byte	0x136c1
+	.8byte	.LBB1614
+	.8byte	.LBE1614-.LBB1614
 	.byte	0x1
-	.2byte	0x693
-	.4byte	0xed5e
+	.2byte	0x695
+	.4byte	0xeda2
 	.uleb128 0x54
-	.4byte	0x1361a
+	.4byte	0x136e9
 	.uleb128 0x54
-	.4byte	0x1360e
+	.4byte	0x136dd
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x136d2
 	.uleb128 0x5d
-	.4byte	0x13627
-	.8byte	.LBB1617
-	.8byte	.LBE1617-.LBB1617
+	.4byte	0x136f6
+	.8byte	.LBB1615
+	.8byte	.LBE1615-.LBB1615
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1365b
+	.4byte	0x1372a
 	.uleb128 0x54
-	.4byte	0x1364f
+	.4byte	0x1371e
 	.uleb128 0x54
-	.4byte	0x13643
+	.4byte	0x13712
 	.uleb128 0x54
-	.4byte	0x13638
+	.4byte	0x13707
 	.uleb128 0x56
-	.8byte	.LBB1618
-	.8byte	.LBE1618-.LBB1618
+	.8byte	.LBB1616
+	.8byte	.LBE1616-.LBB1616
 	.uleb128 0x57
-	.4byte	0x13666
+	.4byte	0x13735
 	.uleb128 0x4e
-	.8byte	.LVL550
-	.4byte	0x14354
+	.8byte	.LVL554
+	.4byte	0x14458
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135f2
-	.8byte	.LBB1619
-	.8byte	.LBE1619-.LBB1619
+	.4byte	0x136c1
+	.8byte	.LBB1617
+	.8byte	.LBE1617-.LBB1617
 	.byte	0x1
-	.2byte	0x696
-	.4byte	0xeddb
+	.2byte	0x698
+	.4byte	0xee1f
 	.uleb128 0x54
-	.4byte	0x1361a
+	.4byte	0x136e9
 	.uleb128 0x54
-	.4byte	0x1360e
+	.4byte	0x136dd
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x136d2
 	.uleb128 0x5d
-	.4byte	0x13627
-	.8byte	.LBB1620
-	.8byte	.LBE1620-.LBB1620
+	.4byte	0x136f6
+	.8byte	.LBB1618
+	.8byte	.LBE1618-.LBB1618
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1365b
+	.4byte	0x1372a
 	.uleb128 0x54
-	.4byte	0x1364f
+	.4byte	0x1371e
 	.uleb128 0x54
-	.4byte	0x13643
+	.4byte	0x13712
 	.uleb128 0x54
-	.4byte	0x13638
+	.4byte	0x13707
 	.uleb128 0x56
-	.8byte	.LBB1621
-	.8byte	.LBE1621-.LBB1621
+	.8byte	.LBB1619
+	.8byte	.LBE1619-.LBB1619
 	.uleb128 0x57
-	.4byte	0x13666
+	.4byte	0x13735
 	.uleb128 0x4e
-	.8byte	.LVL551
-	.4byte	0x14354
+	.8byte	.LVL555
+	.4byte	0x14458
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135f2
-	.8byte	.LBB1622
-	.8byte	.LBE1622-.LBB1622
+	.4byte	0x136c1
+	.8byte	.LBB1620
+	.8byte	.LBE1620-.LBB1620
 	.byte	0x1
-	.2byte	0x699
-	.4byte	0xee58
+	.2byte	0x69b
+	.4byte	0xee9c
 	.uleb128 0x54
-	.4byte	0x1361a
+	.4byte	0x136e9
 	.uleb128 0x54
-	.4byte	0x1360e
+	.4byte	0x136dd
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x136d2
 	.uleb128 0x5d
-	.4byte	0x13627
-	.8byte	.LBB1623
-	.8byte	.LBE1623-.LBB1623
+	.4byte	0x136f6
+	.8byte	.LBB1621
+	.8byte	.LBE1621-.LBB1621
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1365b
+	.4byte	0x1372a
 	.uleb128 0x54
-	.4byte	0x1364f
+	.4byte	0x1371e
 	.uleb128 0x54
-	.4byte	0x13643
+	.4byte	0x13712
 	.uleb128 0x54
-	.4byte	0x13638
+	.4byte	0x13707
 	.uleb128 0x56
-	.8byte	.LBB1624
-	.8byte	.LBE1624-.LBB1624
+	.8byte	.LBB1622
+	.8byte	.LBE1622-.LBB1622
 	.uleb128 0x57
-	.4byte	0x13666
+	.4byte	0x13735
 	.uleb128 0x4e
-	.8byte	.LVL552
-	.4byte	0x14354
+	.8byte	.LVL556
+	.4byte	0x14458
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135f2
-	.8byte	.LBB1625
-	.8byte	.LBE1625-.LBB1625
+	.4byte	0x136c1
+	.8byte	.LBB1623
+	.8byte	.LBE1623-.LBB1623
 	.byte	0x1
-	.2byte	0x69c
-	.4byte	0xeed5
+	.2byte	0x69e
+	.4byte	0xef19
 	.uleb128 0x54
-	.4byte	0x1361a
+	.4byte	0x136e9
 	.uleb128 0x54
-	.4byte	0x1360e
+	.4byte	0x136dd
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x136d2
 	.uleb128 0x5d
-	.4byte	0x13627
-	.8byte	.LBB1626
-	.8byte	.LBE1626-.LBB1626
+	.4byte	0x136f6
+	.8byte	.LBB1624
+	.8byte	.LBE1624-.LBB1624
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1365b
+	.4byte	0x1372a
 	.uleb128 0x54
-	.4byte	0x1364f
+	.4byte	0x1371e
 	.uleb128 0x54
-	.4byte	0x13643
+	.4byte	0x13712
 	.uleb128 0x54
-	.4byte	0x13638
+	.4byte	0x13707
 	.uleb128 0x56
-	.8byte	.LBB1627
-	.8byte	.LBE1627-.LBB1627
+	.8byte	.LBB1625
+	.8byte	.LBE1625-.LBB1625
 	.uleb128 0x57
-	.4byte	0x13666
+	.4byte	0x13735
 	.uleb128 0x4e
-	.8byte	.LVL553
-	.4byte	0x14354
+	.8byte	.LVL557
+	.4byte	0x14458
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135f2
-	.8byte	.LBB1628
-	.8byte	.LBE1628-.LBB1628
+	.4byte	0x136c1
+	.8byte	.LBB1626
+	.8byte	.LBE1626-.LBB1626
 	.byte	0x1
-	.2byte	0x69f
-	.4byte	0xef52
+	.2byte	0x6a1
+	.4byte	0xef96
 	.uleb128 0x54
-	.4byte	0x1361a
+	.4byte	0x136e9
 	.uleb128 0x54
-	.4byte	0x1360e
+	.4byte	0x136dd
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x136d2
 	.uleb128 0x5d
-	.4byte	0x13627
-	.8byte	.LBB1629
-	.8byte	.LBE1629-.LBB1629
+	.4byte	0x136f6
+	.8byte	.LBB1627
+	.8byte	.LBE1627-.LBB1627
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1365b
+	.4byte	0x1372a
 	.uleb128 0x54
-	.4byte	0x1364f
+	.4byte	0x1371e
 	.uleb128 0x54
-	.4byte	0x13643
+	.4byte	0x13712
 	.uleb128 0x54
-	.4byte	0x13638
+	.4byte	0x13707
 	.uleb128 0x56
-	.8byte	.LBB1630
-	.8byte	.LBE1630-.LBB1630
+	.8byte	.LBB1628
+	.8byte	.LBE1628-.LBB1628
 	.uleb128 0x57
-	.4byte	0x13666
+	.4byte	0x13735
 	.uleb128 0x4e
-	.8byte	.LVL554
-	.4byte	0x14354
+	.8byte	.LVL558
+	.4byte	0x14458
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135f2
-	.8byte	.LBB1631
-	.8byte	.LBE1631-.LBB1631
+	.4byte	0x136c1
+	.8byte	.LBB1629
+	.8byte	.LBE1629-.LBB1629
 	.byte	0x1
-	.2byte	0x6a2
-	.4byte	0xefcf
+	.2byte	0x6a4
+	.4byte	0xf013
 	.uleb128 0x54
-	.4byte	0x1361a
+	.4byte	0x136e9
 	.uleb128 0x54
-	.4byte	0x1360e
+	.4byte	0x136dd
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x136d2
 	.uleb128 0x5d
-	.4byte	0x13627
-	.8byte	.LBB1632
-	.8byte	.LBE1632-.LBB1632
+	.4byte	0x136f6
+	.8byte	.LBB1630
+	.8byte	.LBE1630-.LBB1630
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1365b
+	.4byte	0x1372a
 	.uleb128 0x54
-	.4byte	0x1364f
+	.4byte	0x1371e
 	.uleb128 0x54
-	.4byte	0x13643
+	.4byte	0x13712
 	.uleb128 0x54
-	.4byte	0x13638
+	.4byte	0x13707
 	.uleb128 0x56
-	.8byte	.LBB1633
-	.8byte	.LBE1633-.LBB1633
+	.8byte	.LBB1631
+	.8byte	.LBE1631-.LBB1631
 	.uleb128 0x57
-	.4byte	0x13666
+	.4byte	0x13735
 	.uleb128 0x4e
-	.8byte	.LVL555
-	.4byte	0x14354
+	.8byte	.LVL559
+	.4byte	0x14458
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135f2
-	.8byte	.LBB1634
-	.8byte	.LBE1634-.LBB1634
+	.4byte	0x136c1
+	.8byte	.LBB1632
+	.8byte	.LBE1632-.LBB1632
 	.byte	0x1
-	.2byte	0x6a5
-	.4byte	0xf04c
+	.2byte	0x6a7
+	.4byte	0xf090
 	.uleb128 0x54
-	.4byte	0x1361a
+	.4byte	0x136e9
 	.uleb128 0x54
-	.4byte	0x1360e
+	.4byte	0x136dd
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x136d2
 	.uleb128 0x5d
-	.4byte	0x13627
-	.8byte	.LBB1635
-	.8byte	.LBE1635-.LBB1635
+	.4byte	0x136f6
+	.8byte	.LBB1633
+	.8byte	.LBE1633-.LBB1633
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1365b
+	.4byte	0x1372a
 	.uleb128 0x54
-	.4byte	0x1364f
+	.4byte	0x1371e
 	.uleb128 0x54
-	.4byte	0x13643
+	.4byte	0x13712
 	.uleb128 0x54
-	.4byte	0x13638
+	.4byte	0x13707
 	.uleb128 0x56
-	.8byte	.LBB1636
-	.8byte	.LBE1636-.LBB1636
+	.8byte	.LBB1634
+	.8byte	.LBE1634-.LBB1634
 	.uleb128 0x57
-	.4byte	0x13666
+	.4byte	0x13735
 	.uleb128 0x4e
-	.8byte	.LVL556
-	.4byte	0x14354
+	.8byte	.LVL560
+	.4byte	0x14458
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135f2
-	.8byte	.LBB1637
-	.8byte	.LBE1637-.LBB1637
+	.4byte	0x136c1
+	.8byte	.LBB1635
+	.8byte	.LBE1635-.LBB1635
 	.byte	0x1
-	.2byte	0x6a8
-	.4byte	0xf0c9
+	.2byte	0x6aa
+	.4byte	0xf10d
 	.uleb128 0x54
-	.4byte	0x1361a
+	.4byte	0x136e9
 	.uleb128 0x54
-	.4byte	0x1360e
+	.4byte	0x136dd
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x136d2
 	.uleb128 0x5d
-	.4byte	0x13627
-	.8byte	.LBB1638
-	.8byte	.LBE1638-.LBB1638
+	.4byte	0x136f6
+	.8byte	.LBB1636
+	.8byte	.LBE1636-.LBB1636
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1365b
+	.4byte	0x1372a
 	.uleb128 0x54
-	.4byte	0x1364f
+	.4byte	0x1371e
 	.uleb128 0x54
-	.4byte	0x13643
+	.4byte	0x13712
 	.uleb128 0x54
-	.4byte	0x13638
+	.4byte	0x13707
 	.uleb128 0x56
-	.8byte	.LBB1639
-	.8byte	.LBE1639-.LBB1639
+	.8byte	.LBB1637
+	.8byte	.LBE1637-.LBB1637
 	.uleb128 0x57
-	.4byte	0x13666
+	.4byte	0x13735
 	.uleb128 0x4e
-	.8byte	.LVL557
-	.4byte	0x14354
+	.8byte	.LVL561
+	.4byte	0x14458
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135f2
-	.8byte	.LBB1640
-	.8byte	.LBE1640-.LBB1640
+	.4byte	0x136c1
+	.8byte	.LBB1638
+	.8byte	.LBE1638-.LBB1638
 	.byte	0x1
-	.2byte	0x6ab
-	.4byte	0xf146
+	.2byte	0x6ad
+	.4byte	0xf18a
 	.uleb128 0x54
-	.4byte	0x1361a
+	.4byte	0x136e9
 	.uleb128 0x54
-	.4byte	0x1360e
+	.4byte	0x136dd
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x136d2
 	.uleb128 0x5d
-	.4byte	0x13627
-	.8byte	.LBB1641
-	.8byte	.LBE1641-.LBB1641
+	.4byte	0x136f6
+	.8byte	.LBB1639
+	.8byte	.LBE1639-.LBB1639
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1365b
+	.4byte	0x1372a
 	.uleb128 0x54
-	.4byte	0x1364f
+	.4byte	0x1371e
 	.uleb128 0x54
-	.4byte	0x13643
+	.4byte	0x13712
 	.uleb128 0x54
-	.4byte	0x13638
+	.4byte	0x13707
 	.uleb128 0x56
-	.8byte	.LBB1642
-	.8byte	.LBE1642-.LBB1642
+	.8byte	.LBB1640
+	.8byte	.LBE1640-.LBB1640
 	.uleb128 0x57
-	.4byte	0x13666
+	.4byte	0x13735
 	.uleb128 0x4e
-	.8byte	.LVL558
-	.4byte	0x14354
+	.8byte	.LVL562
+	.4byte	0x14458
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135f2
-	.8byte	.LBB1643
-	.8byte	.LBE1643-.LBB1643
+	.4byte	0x136c1
+	.8byte	.LBB1641
+	.8byte	.LBE1641-.LBB1641
 	.byte	0x1
-	.2byte	0x6ae
-	.4byte	0xf1c3
+	.2byte	0x6b0
+	.4byte	0xf207
 	.uleb128 0x54
-	.4byte	0x1361a
+	.4byte	0x136e9
 	.uleb128 0x54
-	.4byte	0x1360e
+	.4byte	0x136dd
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x136d2
 	.uleb128 0x5d
-	.4byte	0x13627
-	.8byte	.LBB1644
-	.8byte	.LBE1644-.LBB1644
+	.4byte	0x136f6
+	.8byte	.LBB1642
+	.8byte	.LBE1642-.LBB1642
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1365b
+	.4byte	0x1372a
 	.uleb128 0x54
-	.4byte	0x1364f
+	.4byte	0x1371e
 	.uleb128 0x54
-	.4byte	0x13643
+	.4byte	0x13712
 	.uleb128 0x54
-	.4byte	0x13638
+	.4byte	0x13707
 	.uleb128 0x56
-	.8byte	.LBB1645
-	.8byte	.LBE1645-.LBB1645
+	.8byte	.LBB1643
+	.8byte	.LBE1643-.LBB1643
 	.uleb128 0x57
-	.4byte	0x13666
+	.4byte	0x13735
 	.uleb128 0x4e
-	.8byte	.LVL559
-	.4byte	0x14354
+	.8byte	.LVL563
+	.4byte	0x14458
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135f2
-	.8byte	.LBB1646
-	.8byte	.LBE1646-.LBB1646
+	.4byte	0x136c1
+	.8byte	.LBB1644
+	.8byte	.LBE1644-.LBB1644
 	.byte	0x1
-	.2byte	0x6b1
-	.4byte	0xf240
+	.2byte	0x6b3
+	.4byte	0xf284
 	.uleb128 0x54
-	.4byte	0x1361a
+	.4byte	0x136e9
 	.uleb128 0x54
-	.4byte	0x1360e
+	.4byte	0x136dd
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x136d2
 	.uleb128 0x5d
-	.4byte	0x13627
-	.8byte	.LBB1647
-	.8byte	.LBE1647-.LBB1647
+	.4byte	0x136f6
+	.8byte	.LBB1645
+	.8byte	.LBE1645-.LBB1645
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1365b
+	.4byte	0x1372a
 	.uleb128 0x54
-	.4byte	0x1364f
+	.4byte	0x1371e
 	.uleb128 0x54
-	.4byte	0x13643
+	.4byte	0x13712
 	.uleb128 0x54
-	.4byte	0x13638
+	.4byte	0x13707
 	.uleb128 0x56
-	.8byte	.LBB1648
-	.8byte	.LBE1648-.LBB1648
+	.8byte	.LBB1646
+	.8byte	.LBE1646-.LBB1646
 	.uleb128 0x57
-	.4byte	0x13666
+	.4byte	0x13735
 	.uleb128 0x4e
-	.8byte	.LVL560
-	.4byte	0x14354
+	.8byte	.LVL564
+	.4byte	0x14458
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135f2
-	.8byte	.LBB1649
-	.8byte	.LBE1649-.LBB1649
+	.4byte	0x136c1
+	.8byte	.LBB1647
+	.8byte	.LBE1647-.LBB1647
 	.byte	0x1
-	.2byte	0x6b4
-	.4byte	0xf2bd
+	.2byte	0x6b6
+	.4byte	0xf301
 	.uleb128 0x54
-	.4byte	0x1361a
+	.4byte	0x136e9
 	.uleb128 0x54
-	.4byte	0x1360e
+	.4byte	0x136dd
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x136d2
 	.uleb128 0x5d
-	.4byte	0x13627
-	.8byte	.LBB1650
-	.8byte	.LBE1650-.LBB1650
+	.4byte	0x136f6
+	.8byte	.LBB1648
+	.8byte	.LBE1648-.LBB1648
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1365b
+	.4byte	0x1372a
 	.uleb128 0x54
-	.4byte	0x1364f
+	.4byte	0x1371e
 	.uleb128 0x54
-	.4byte	0x13643
+	.4byte	0x13712
 	.uleb128 0x54
-	.4byte	0x13638
+	.4byte	0x13707
 	.uleb128 0x56
-	.8byte	.LBB1651
-	.8byte	.LBE1651-.LBB1651
+	.8byte	.LBB1649
+	.8byte	.LBE1649-.LBB1649
 	.uleb128 0x57
-	.4byte	0x13666
+	.4byte	0x13735
 	.uleb128 0x4e
-	.8byte	.LVL561
-	.4byte	0x14354
+	.8byte	.LVL565
+	.4byte	0x14458
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135f2
-	.8byte	.LBB1652
-	.8byte	.LBE1652-.LBB1652
+	.4byte	0x136c1
+	.8byte	.LBB1650
+	.8byte	.LBE1650-.LBB1650
 	.byte	0x1
-	.2byte	0x6b7
-	.4byte	0xf33a
+	.2byte	0x6b9
+	.4byte	0xf37e
 	.uleb128 0x54
-	.4byte	0x1361a
+	.4byte	0x136e9
 	.uleb128 0x54
-	.4byte	0x1360e
+	.4byte	0x136dd
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x136d2
 	.uleb128 0x5d
-	.4byte	0x13627
-	.8byte	.LBB1653
-	.8byte	.LBE1653-.LBB1653
+	.4byte	0x136f6
+	.8byte	.LBB1651
+	.8byte	.LBE1651-.LBB1651
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1365b
+	.4byte	0x1372a
 	.uleb128 0x54
-	.4byte	0x1364f
+	.4byte	0x1371e
 	.uleb128 0x54
-	.4byte	0x13643
+	.4byte	0x13712
 	.uleb128 0x54
-	.4byte	0x13638
+	.4byte	0x13707
 	.uleb128 0x56
-	.8byte	.LBB1654
-	.8byte	.LBE1654-.LBB1654
+	.8byte	.LBB1652
+	.8byte	.LBE1652-.LBB1652
 	.uleb128 0x57
-	.4byte	0x13666
+	.4byte	0x13735
 	.uleb128 0x4e
-	.8byte	.LVL562
-	.4byte	0x14354
+	.8byte	.LVL566
+	.4byte	0x14458
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135f2
-	.8byte	.LBB1655
-	.8byte	.LBE1655-.LBB1655
+	.4byte	0x136c1
+	.8byte	.LBB1653
+	.8byte	.LBE1653-.LBB1653
 	.byte	0x1
-	.2byte	0x6ba
-	.4byte	0xf3b7
+	.2byte	0x6bc
+	.4byte	0xf3fb
 	.uleb128 0x54
-	.4byte	0x1361a
+	.4byte	0x136e9
 	.uleb128 0x54
-	.4byte	0x1360e
+	.4byte	0x136dd
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x136d2
 	.uleb128 0x5d
-	.4byte	0x13627
-	.8byte	.LBB1656
-	.8byte	.LBE1656-.LBB1656
+	.4byte	0x136f6
+	.8byte	.LBB1654
+	.8byte	.LBE1654-.LBB1654
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1365b
+	.4byte	0x1372a
 	.uleb128 0x54
-	.4byte	0x1364f
+	.4byte	0x1371e
 	.uleb128 0x54
-	.4byte	0x13643
+	.4byte	0x13712
 	.uleb128 0x54
-	.4byte	0x13638
+	.4byte	0x13707
 	.uleb128 0x56
-	.8byte	.LBB1657
-	.8byte	.LBE1657-.LBB1657
+	.8byte	.LBB1655
+	.8byte	.LBE1655-.LBB1655
 	.uleb128 0x57
-	.4byte	0x13666
+	.4byte	0x13735
 	.uleb128 0x4e
-	.8byte	.LVL563
-	.4byte	0x14354
+	.8byte	.LVL567
+	.4byte	0x14458
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x135f2
-	.8byte	.LBB1658
-	.8byte	.LBE1658-.LBB1658
+	.4byte	0x136c1
+	.8byte	.LBB1656
+	.8byte	.LBE1656-.LBB1656
 	.byte	0x1
-	.2byte	0x6bd
+	.2byte	0x6bf
 	.uleb128 0x54
-	.4byte	0x1361a
+	.4byte	0x136e9
 	.uleb128 0x54
-	.4byte	0x1360e
+	.4byte	0x136dd
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x136d2
 	.uleb128 0x5d
-	.4byte	0x13627
-	.8byte	.LBB1659
-	.8byte	.LBE1659-.LBB1659
+	.4byte	0x136f6
+	.8byte	.LBB1657
+	.8byte	.LBE1657-.LBB1657
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1365b
+	.4byte	0x1372a
 	.uleb128 0x54
-	.4byte	0x1364f
+	.4byte	0x1371e
 	.uleb128 0x54
-	.4byte	0x13643
+	.4byte	0x13712
 	.uleb128 0x54
-	.4byte	0x13638
+	.4byte	0x13707
 	.uleb128 0x56
-	.8byte	.LBB1660
-	.8byte	.LBE1660-.LBB1660
+	.8byte	.LBB1658
+	.8byte	.LBE1658-.LBB1658
 	.uleb128 0x57
-	.4byte	0x13666
+	.4byte	0x13735
 	.uleb128 0x4e
-	.8byte	.LVL564
-	.4byte	0x14354
+	.8byte	.LVL568
+	.4byte	0x14458
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0xfe30
-	.8byte	.LBB1667
+	.4byte	0xfe78
+	.8byte	.LBB1665
 	.4byte	.Ldebug_ranges0+0xcd0
 	.byte	0x1
-	.2byte	0x97a
-	.4byte	0xf5df
+	.2byte	0x9a3
+	.4byte	0xf623
 	.uleb128 0x54
-	.4byte	0xfe41
+	.4byte	0xfe89
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xcd0
 	.uleb128 0x60
-	.4byte	0xfe4d
-	.4byte	.LLST154
+	.4byte	0xfe95
+	.4byte	.LLST156
 	.uleb128 0x57
-	.4byte	0xfe59
+	.4byte	0xfea1
 	.uleb128 0x57
-	.4byte	0xfe65
+	.4byte	0xfead
 	.uleb128 0x57
-	.4byte	0xfe71
+	.4byte	0xfeb9
 	.uleb128 0x61
-	.4byte	0xfe7d
+	.4byte	0xfec5
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x57
-	.4byte	0xfe87
+	.4byte	0xfecf
 	.uleb128 0x57
-	.4byte	0xfe93
+	.4byte	0xfedb
 	.uleb128 0x57
-	.4byte	0xfe9f
+	.4byte	0xfee7
 	.uleb128 0x5b
-	.4byte	0x13705
-	.8byte	.LBB1669
+	.4byte	0x137d5
+	.8byte	.LBB1667
 	.4byte	.Ldebug_ranges0+0xd40
 	.byte	0x1
-	.2byte	0x864
-	.4byte	0xf4a2
+	.2byte	0x88d
+	.4byte	0xf4e6
 	.uleb128 0x54
-	.4byte	0x13715
+	.4byte	0x137e5
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x136cf
-	.8byte	.LBB1673
+	.4byte	0x1379f
+	.8byte	.LBB1671
 	.4byte	.Ldebug_ranges0+0xd70
 	.byte	0x1
-	.2byte	0x87f
-	.4byte	0xf4d7
+	.2byte	0x8a8
+	.4byte	0xf51b
 	.uleb128 0x54
-	.4byte	0x136f8
+	.4byte	0x137c8
 	.uleb128 0x54
-	.4byte	0x136ec
+	.4byte	0x137bc
 	.uleb128 0x54
-	.4byte	0x136e0
+	.4byte	0x137b0
 	.uleb128 0x4e
-	.8byte	.LVL570
-	.4byte	0x14347
+	.8byte	.LVL574
+	.4byte	0x1444b
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136cf
-	.8byte	.LBB1681
-	.8byte	.LBE1681-.LBB1681
+	.4byte	0x1379f
+	.8byte	.LBB1679
+	.8byte	.LBE1679-.LBB1679
 	.byte	0x1
-	.2byte	0x882
-	.4byte	0xf510
+	.2byte	0x8ab
+	.4byte	0xf554
 	.uleb128 0x54
-	.4byte	0x136f8
+	.4byte	0x137c8
 	.uleb128 0x54
-	.4byte	0x136ec
+	.4byte	0x137bc
 	.uleb128 0x54
-	.4byte	0x136e0
+	.4byte	0x137b0
 	.uleb128 0x4e
-	.8byte	.LVL571
-	.4byte	0x14347
+	.8byte	.LVL575
+	.4byte	0x1444b
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136cf
-	.8byte	.LBB1683
-	.8byte	.LBE1683-.LBB1683
+	.4byte	0x1379f
+	.8byte	.LBB1681
+	.8byte	.LBE1681-.LBB1681
 	.byte	0x1
-	.2byte	0x885
-	.4byte	0xf549
+	.2byte	0x8ae
+	.4byte	0xf58d
 	.uleb128 0x54
-	.4byte	0x136f8
+	.4byte	0x137c8
 	.uleb128 0x54
-	.4byte	0x136ec
+	.4byte	0x137bc
 	.uleb128 0x54
-	.4byte	0x136e0
+	.4byte	0x137b0
 	.uleb128 0x4e
-	.8byte	.LVL572
-	.4byte	0x14347
+	.8byte	.LVL576
+	.4byte	0x1444b
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136cf
-	.8byte	.LBB1685
-	.8byte	.LBE1685-.LBB1685
+	.4byte	0x1379f
+	.8byte	.LBB1683
+	.8byte	.LBE1683-.LBB1683
 	.byte	0x1
-	.2byte	0x88d
-	.4byte	0xf582
+	.2byte	0x8b6
+	.4byte	0xf5c6
 	.uleb128 0x54
-	.4byte	0x136f8
+	.4byte	0x137c8
 	.uleb128 0x54
-	.4byte	0x136ec
+	.4byte	0x137bc
 	.uleb128 0x54
-	.4byte	0x136e0
+	.4byte	0x137b0
 	.uleb128 0x4e
-	.8byte	.LVL573
-	.4byte	0x14347
+	.8byte	.LVL577
+	.4byte	0x1444b
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL566
-	.4byte	0x14361
+	.8byte	.LVL570
+	.4byte	0x14465
 	.uleb128 0x4e
-	.8byte	.LVL567
-	.4byte	0x1436e
+	.8byte	.LVL571
+	.4byte	0x14472
 	.uleb128 0x4e
-	.8byte	.LVL568
-	.4byte	0x1437a
+	.8byte	.LVL572
+	.4byte	0x1447e
 	.uleb128 0x4e
-	.8byte	.LVL569
-	.4byte	0x14386
+	.8byte	.LVL573
+	.4byte	0x1448a
 	.uleb128 0x4e
-	.8byte	.LVL574
-	.4byte	0x14392
+	.8byte	.LVL578
+	.4byte	0x14496
 	.uleb128 0x4e
-	.8byte	.LVL575
-	.4byte	0x1439c
+	.8byte	.LVL579
+	.4byte	0x144a0
 	.uleb128 0x4e
-	.8byte	.LVL588
-	.4byte	0x143a8
+	.8byte	.LVL592
+	.4byte	0x144ac
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0xfeaa
-	.8byte	.LBB1694
+	.4byte	0xfef2
+	.8byte	.LBB1692
 	.4byte	.Ldebug_ranges0+0xdc0
 	.byte	0x1
-	.2byte	0x981
-	.4byte	0xf6c1
-	.uleb128 0x54
-	.4byte	0xfebb
+	.2byte	0x9aa
+	.4byte	0xf6fc
 	.uleb128 0x54
-	.4byte	0xfebb
+	.4byte	0xff03
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xdc0
 	.uleb128 0x57
-	.4byte	0xfec7
+	.4byte	0xff0f
 	.uleb128 0x60
-	.4byte	0xfed3
-	.4byte	.LLST155
+	.4byte	0xff1b
+	.4byte	.LLST157
 	.uleb128 0x57
-	.4byte	0xfedf
+	.4byte	0xff27
 	.uleb128 0x61
-	.4byte	0xfeeb
+	.4byte	0xff33
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x60
-	.4byte	0xfef5
-	.4byte	.LLST156
+	.4byte	0xff3d
+	.4byte	.LLST158
 	.uleb128 0x57
-	.4byte	0xff01
+	.4byte	0xff49
 	.uleb128 0x57
-	.4byte	0xff0d
-	.uleb128 0x53
-	.4byte	0x13705
-	.8byte	.LBB1696
-	.8byte	.LBE1696-.LBB1696
+	.4byte	0xff55
+	.uleb128 0x5b
+	.4byte	0x137d5
+	.8byte	.LBB1694
+	.4byte	.Ldebug_ranges0+0xe20
 	.byte	0x1
-	.2byte	0x837
-	.4byte	0xf657
+	.2byte	0x85d
+	.4byte	0xf692
 	.uleb128 0x54
-	.4byte	0x13715
+	.4byte	0x137e5
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL577
-	.4byte	0x14361
+	.8byte	.LVL581
+	.4byte	0x14465
 	.uleb128 0x4e
-	.8byte	.LVL578
-	.4byte	0x1436e
+	.8byte	.LVL582
+	.4byte	0x14472
 	.uleb128 0x4e
-	.8byte	.LVL592
-	.4byte	0x1437a
+	.8byte	.LVL596
+	.4byte	0x1447e
 	.uleb128 0x4e
-	.8byte	.LVL593
-	.4byte	0x143b5
+	.8byte	.LVL597
+	.4byte	0x144b9
 	.uleb128 0x4e
-	.8byte	.LVL678
-	.4byte	0x143a8
+	.8byte	.LVL683
+	.4byte	0x144ac
 	.uleb128 0x4e
-	.8byte	.LVL679
-	.4byte	0x143c1
+	.8byte	.LVL684
+	.4byte	0x144c5
 	.uleb128 0x4e
-	.8byte	.LVL680
-	.4byte	0x143a8
+	.8byte	.LVL685
+	.4byte	0x144ac
 	.uleb128 0x4e
-	.8byte	.LVL694
-	.4byte	0x143a8
+	.8byte	.LVL699
+	.4byte	0x144ac
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0xfdf8
+	.4byte	0xfe40
 	.8byte	.LBB1704
-	.4byte	.Ldebug_ranges0+0xe20
+	.4byte	.Ldebug_ranges0+0xe50
 	.byte	0x1
-	.2byte	0x988
-	.4byte	0xf84e
+	.2byte	0x9b1
+	.4byte	0xf889
 	.uleb128 0x54
-	.4byte	0xfe09
+	.4byte	0xfe51
 	.uleb128 0x5e
-	.4byte	.Ldebug_ranges0+0xe20
+	.4byte	.Ldebug_ranges0+0xe50
 	.uleb128 0x61
-	.4byte	0xfe15
+	.4byte	0xfe5d
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5b
-	.4byte	0x138db
+	.4byte	0x139ae
 	.8byte	.LBB1706
-	.4byte	.Ldebug_ranges0+0xe60
+	.4byte	.Ldebug_ranges0+0xe90
 	.byte	0x1
-	.2byte	0x89a
-	.4byte	0xf748
+	.2byte	0x8c3
+	.4byte	0xf783
 	.uleb128 0x54
-	.4byte	0x138e7
+	.4byte	0x139bb
 	.uleb128 0x56
 	.8byte	.LBB1708
 	.8byte	.LBE1708-.LBB1708
 	.uleb128 0x57
-	.4byte	0x13912
+	.4byte	0x139e6
 	.uleb128 0x5c
-	.4byte	0x13ab5
+	.4byte	0x13b8c
 	.8byte	.LBB1709
 	.8byte	.LBE1709-.LBB1709
 	.byte	0x10
 	.byte	0x1c
 	.uleb128 0x54
-	.4byte	0x13ad8
+	.4byte	0x13baf
 	.uleb128 0x54
-	.4byte	0x13acc
+	.4byte	0x13ba3
 	.uleb128 0x54
-	.4byte	0x13ac2
+	.4byte	0x13b99
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x139f7
+	.4byte	0x13acb
 	.8byte	.LBB1713
 	.8byte	.LBE1713-.LBB1713
 	.byte	0x1
-	.2byte	0x8a2
-	.4byte	0xf793
+	.2byte	0x8cb
+	.4byte	0xf7ce
 	.uleb128 0x54
-	.4byte	0x13a0c
+	.4byte	0x13ae1
 	.uleb128 0x54
-	.4byte	0x13a03
+	.4byte	0x13ad8
 	.uleb128 0x56
 	.8byte	.LBB1714
 	.8byte	.LBE1714-.LBB1714
 	.uleb128 0x60
-	.4byte	0x13a15
-	.4byte	.LLST157
+	.4byte	0x13aea
+	.4byte	.LLST159
 	.uleb128 0x60
-	.4byte	0x13a1f
-	.4byte	.LLST158
+	.4byte	0x13af4
+	.4byte	.LLST160
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.Ldebug_ranges0+0xe90
-	.4byte	0xf7c0
+	.4byte	.Ldebug_ranges0+0xec0
+	.4byte	0xf7fb
 	.uleb128 0x60
-	.4byte	0xfe22
-	.4byte	.LLST159
+	.4byte	0xfe6a
+	.4byte	.LLST161
 	.uleb128 0x4e
-	.8byte	.LVL600
-	.4byte	0x143cd
+	.8byte	.LVL604
+	.4byte	0x144d1
 	.uleb128 0x4e
-	.8byte	.LVL602
-	.4byte	0x143d9
+	.8byte	.LVL606
+	.4byte	0x144dd
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x139f7
+	.4byte	0x13acb
 	.8byte	.LBB1717
 	.8byte	.LBE1717-.LBB1717
 	.byte	0x1
-	.2byte	0x8ab
-	.4byte	0xf80b
+	.2byte	0x8d4
+	.4byte	0xf846
 	.uleb128 0x54
-	.4byte	0x13a0c
+	.4byte	0x13ae1
 	.uleb128 0x54
-	.4byte	0x13a03
+	.4byte	0x13ad8
 	.uleb128 0x56
 	.8byte	.LBB1718
 	.8byte	.LBE1718-.LBB1718
 	.uleb128 0x60
-	.4byte	0x13a15
-	.4byte	.LLST160
+	.4byte	0x13aea
+	.4byte	.LLST162
 	.uleb128 0x60
-	.4byte	0x13a1f
-	.4byte	.LLST161
+	.4byte	0x13af4
+	.4byte	.LLST163
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL594
-	.4byte	0x143cd
+	.8byte	.LVL598
+	.4byte	0x144d1
 	.uleb128 0x4e
-	.8byte	.LVL595
-	.4byte	0x143e6
+	.8byte	.LVL599
+	.4byte	0x144ea
 	.uleb128 0x4e
-	.8byte	.LVL603
-	.4byte	0x143e6
+	.8byte	.LVL607
+	.4byte	0x144ea
 	.uleb128 0x4e
-	.8byte	.LVL681
-	.4byte	0x143a8
+	.8byte	.LVL686
+	.4byte	0x144ac
 	.uleb128 0x4e
-	.8byte	.LVL685
-	.4byte	0x143a8
+	.8byte	.LVL690
+	.4byte	0x144ac
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0xfdde
+	.4byte	0xfe26
 	.8byte	.LBB1721
 	.8byte	.LBE1721-.LBB1721
 	.byte	0x1
-	.2byte	0x98f
-	.4byte	0xf8e8
+	.2byte	0x9b8
+	.4byte	0xf923
 	.uleb128 0x54
-	.4byte	0xfdeb
+	.4byte	0xfe33
 	.uleb128 0x5b
-	.4byte	0x13338
+	.4byte	0x13405
 	.8byte	.LBB1723
-	.4byte	.Ldebug_ranges0+0xec0
+	.4byte	.Ldebug_ranges0+0xef0
 	.byte	0x1
-	.2byte	0x8bb
-	.4byte	0xf8b3
+	.2byte	0x8e4
+	.4byte	0xf8ee
 	.uleb128 0x54
-	.4byte	0x1335a
+	.4byte	0x13428
 	.uleb128 0x54
-	.4byte	0x1334f
+	.4byte	0x1341d
 	.uleb128 0x54
-	.4byte	0x13344
+	.4byte	0x13412
 	.uleb128 0x5e
-	.4byte	.Ldebug_ranges0+0xec0
+	.4byte	.Ldebug_ranges0+0xef0
 	.uleb128 0x60
-	.4byte	0x13365
-	.4byte	.LLST162
+	.4byte	0x13433
+	.4byte	.LLST164
 	.uleb128 0x4e
-	.8byte	.LVL610
-	.4byte	0x143f3
+	.8byte	.LVL614
+	.4byte	0x144f7
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL611
-	.4byte	0x143ff
+	.8byte	.LVL615
+	.4byte	0x14503
 	.uleb128 0x4e
-	.8byte	.LVL612
-	.4byte	0x1440b
+	.8byte	.LVL616
+	.4byte	0x1450f
 	.uleb128 0x4e
-	.8byte	.LVL613
-	.4byte	0x143ff
+	.8byte	.LVL617
+	.4byte	0x14503
 	.uleb128 0x4e
-	.8byte	.LVL614
-	.4byte	0x1440b
+	.8byte	.LVL618
+	.4byte	0x1450f
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0xfd3c
+	.4byte	0xfd84
 	.8byte	.LBB1733
-	.4byte	.Ldebug_ranges0+0xf20
+	.4byte	.Ldebug_ranges0+0xf50
 	.byte	0x1
-	.2byte	0x992
-	.4byte	0xfb8b
+	.2byte	0x9bb
+	.4byte	0xfbc6
 	.uleb128 0x54
-	.4byte	0xfd59
+	.4byte	0xfda1
 	.uleb128 0x54
-	.4byte	0xfd4d
+	.4byte	0xfd95
 	.uleb128 0x5e
-	.4byte	.Ldebug_ranges0+0xf20
+	.4byte	.Ldebug_ranges0+0xf50
 	.uleb128 0x57
-	.4byte	0xfd65
-	.uleb128 0x60
-	.4byte	0xfd71
-	.4byte	.LLST163
-	.uleb128 0x60
-	.4byte	0xfd7d
-	.4byte	.LLST164
+	.4byte	0xfdad
 	.uleb128 0x60
-	.4byte	0xfd89
+	.4byte	0xfdb9
 	.4byte	.LLST165
 	.uleb128 0x60
-	.4byte	0xfd95
+	.4byte	0xfdc5
 	.4byte	.LLST166
 	.uleb128 0x60
-	.4byte	0xfda1
+	.4byte	0xfdd1
 	.4byte	.LLST167
 	.uleb128 0x60
-	.4byte	0xfdad
+	.4byte	0xfddd
 	.4byte	.LLST168
-	.uleb128 0x57
-	.4byte	0xfdb9
 	.uleb128 0x60
-	.4byte	0xfdc5
+	.4byte	0xfde9
 	.4byte	.LLST169
 	.uleb128 0x60
-	.4byte	0xfdd1
+	.4byte	0xfdf5
 	.4byte	.LLST170
+	.uleb128 0x57
+	.4byte	0xfe01
+	.uleb128 0x60
+	.4byte	0xfe0d
+	.4byte	.LLST171
+	.uleb128 0x60
+	.4byte	0xfe19
+	.4byte	.LLST172
 	.uleb128 0x53
-	.4byte	0x11791
+	.4byte	0x11853
 	.8byte	.LBB1735
 	.8byte	.LBE1735-.LBB1735
 	.byte	0x1
-	.2byte	0x8f3
-	.4byte	0xf9ca
+	.2byte	0x91c
+	.4byte	0xfa05
 	.uleb128 0x54
-	.4byte	0x117a2
+	.4byte	0x11864
 	.uleb128 0x54
-	.4byte	0x117a2
+	.4byte	0x11864
 	.uleb128 0x56
 	.8byte	.LBB1736
 	.8byte	.LBE1736-.LBB1736
 	.uleb128 0x60
-	.4byte	0x117ae
-	.4byte	.LLST171
+	.4byte	0x11870
+	.4byte	.LLST173
 	.uleb128 0x4e
-	.8byte	.LVL631
-	.4byte	0x14417
+	.8byte	.LVL635
+	.4byte	0x1451b
 	.uleb128 0x4e
-	.8byte	.LVL633
-	.4byte	0x1439c
+	.8byte	.LVL637
+	.4byte	0x144a0
 	.uleb128 0x4e
-	.8byte	.LVL634
-	.4byte	0x14423
+	.8byte	.LVL638
+	.4byte	0x14527
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x134b5
+	.4byte	0x13583
 	.8byte	.LBB1737
 	.8byte	.LBE1737-.LBB1737
 	.byte	0x1
-	.2byte	0x8d9
-	.4byte	0xfa21
+	.2byte	0x902
+	.4byte	0xfa5c
 	.uleb128 0x54
-	.4byte	0x134d2
+	.4byte	0x135a0
 	.uleb128 0x54
-	.4byte	0x134c6
+	.4byte	0x13594
 	.uleb128 0x5d
-	.4byte	0x134df
+	.4byte	0x135ad
 	.8byte	.LBB1738
 	.8byte	.LBE1738-.LBB1738
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x134fc
+	.4byte	0x135ca
 	.uleb128 0x54
-	.4byte	0x134f0
+	.4byte	0x135be
 	.uleb128 0x4e
-	.8byte	.LVL650
-	.4byte	0x1442f
+	.8byte	.LVL655
+	.4byte	0x14533
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x134b5
+	.4byte	0x13583
 	.8byte	.LBB1740
 	.8byte	.LBE1740-.LBB1740
 	.byte	0x1
-	.2byte	0x8e7
-	.4byte	0xfa78
+	.2byte	0x910
+	.4byte	0xfab3
 	.uleb128 0x54
-	.4byte	0x134d2
+	.4byte	0x135a0
 	.uleb128 0x54
-	.4byte	0x134c6
+	.4byte	0x13594
 	.uleb128 0x5d
-	.4byte	0x134df
+	.4byte	0x135ad
 	.8byte	.LBB1741
 	.8byte	.LBE1741-.LBB1741
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x134fc
+	.4byte	0x135ca
 	.uleb128 0x54
-	.4byte	0x134f0
+	.4byte	0x135be
 	.uleb128 0x4e
-	.8byte	.LVL663
-	.4byte	0x1442f
+	.8byte	.LVL668
+	.4byte	0x14533
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL616
-	.4byte	0x1443c
-	.uleb128 0x4e
-	.8byte	.LVL618
-	.4byte	0x1443c
-	.uleb128 0x4e
 	.8byte	.LVL620
-	.4byte	0x14448
+	.4byte	0x14540
 	.uleb128 0x4e
-	.8byte	.LVL625
-	.4byte	0x14448
+	.8byte	.LVL622
+	.4byte	0x14540
+	.uleb128 0x4e
+	.8byte	.LVL624
+	.4byte	0x1454c
 	.uleb128 0x4e
 	.8byte	.LVL629
-	.4byte	0x1432e
+	.4byte	0x1454c
 	.uleb128 0x4e
-	.8byte	.LVL630
-	.4byte	0x14455
+	.8byte	.LVL633
+	.4byte	0x14432
 	.uleb128 0x4e
-	.8byte	.LVL635
-	.4byte	0x14461
+	.8byte	.LVL634
+	.4byte	0x14559
 	.uleb128 0x4e
-	.8byte	.LVL636
-	.4byte	0x14461
+	.8byte	.LVL639
+	.4byte	0x14565
 	.uleb128 0x4e
-	.8byte	.LVL647
-	.4byte	0x1446d
+	.8byte	.LVL640
+	.4byte	0x14565
 	.uleb128 0x4e
-	.8byte	.LVL649
-	.4byte	0x1432e
+	.8byte	.LVL652
+	.4byte	0x14571
 	.uleb128 0x4e
 	.8byte	.LVL654
-	.4byte	0x14479
-	.uleb128 0x4e
-	.8byte	.LVL657
-	.4byte	0x14417
+	.4byte	0x14432
 	.uleb128 0x4e
 	.8byte	.LVL659
-	.4byte	0x14479
-	.uleb128 0x4e
-	.8byte	.LVL660
-	.4byte	0x14423
+	.4byte	0x1457d
 	.uleb128 0x4e
 	.8byte	.LVL662
-	.4byte	0x1432e
+	.4byte	0x1451b
 	.uleb128 0x4e
-	.8byte	.LVL666
-	.4byte	0x14479
+	.8byte	.LVL664
+	.4byte	0x1457d
 	.uleb128 0x4e
-	.8byte	.LVL670
-	.4byte	0x14417
+	.8byte	.LVL665
+	.4byte	0x14527
 	.uleb128 0x4e
-	.8byte	.LVL672
-	.4byte	0x14479
+	.8byte	.LVL667
+	.4byte	0x14432
 	.uleb128 0x4e
-	.8byte	.LVL673
-	.4byte	0x14423
+	.8byte	.LVL671
+	.4byte	0x1457d
 	.uleb128 0x4e
-	.8byte	.LVL692
-	.4byte	0x143a8
+	.8byte	.LVL675
+	.4byte	0x1451b
 	.uleb128 0x4e
-	.8byte	.LVL700
-	.4byte	0x143a8
+	.8byte	.LVL677
+	.4byte	0x1457d
+	.uleb128 0x4e
+	.8byte	.LVL678
+	.4byte	0x14527
+	.uleb128 0x4e
+	.8byte	.LVL697
+	.4byte	0x144ac
+	.uleb128 0x4e
+	.8byte	.LVL705
+	.4byte	0x144ac
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13589
+	.4byte	0x13657
 	.8byte	.LBB1747
 	.8byte	.LBE1747-.LBB1747
 	.byte	0x1
-	.2byte	0x994
-	.4byte	0xfbd4
+	.2byte	0x9bd
+	.4byte	0xfc0f
 	.uleb128 0x54
-	.4byte	0x135a0
+	.4byte	0x1366f
 	.uleb128 0x54
-	.4byte	0x13595
+	.4byte	0x13664
 	.uleb128 0x5c
-	.4byte	0x1368b
+	.4byte	0x1375b
 	.8byte	.LBB1748
 	.8byte	.LBE1748-.LBB1748
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x54
-	.4byte	0x136a4
+	.4byte	0x13774
 	.uleb128 0x54
-	.4byte	0x13698
+	.4byte	0x13768
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0xff30
+	.4byte	0xff78
 	.8byte	.LBB1750
 	.8byte	.LBE1750-.LBB1750
 	.byte	0x1
-	.2byte	0x997
-	.4byte	0xfc5e
+	.2byte	0x9c0
+	.4byte	0xfca6
 	.uleb128 0x54
-	.4byte	0xff41
-	.uleb128 0x4e
-	.8byte	.LVL637
-	.4byte	0x14483
-	.uleb128 0x4e
-	.8byte	.LVL638
-	.4byte	0x1448f
-	.uleb128 0x4e
-	.8byte	.LVL639
-	.4byte	0x1448f
-	.uleb128 0x4e
-	.8byte	.LVL640
-	.4byte	0x1448f
+	.4byte	0xff89
 	.uleb128 0x4e
 	.8byte	.LVL641
-	.4byte	0x1448f
+	.4byte	0x14587
 	.uleb128 0x4e
 	.8byte	.LVL642
-	.4byte	0x1448f
+	.4byte	0x14587
 	.uleb128 0x4e
 	.8byte	.LVL643
-	.4byte	0x1448f
+	.4byte	0x14593
 	.uleb128 0x4e
 	.8byte	.LVL644
-	.4byte	0x1448f
-	.byte	0
+	.4byte	0x14593
 	.uleb128 0x4e
-	.8byte	.LVL521
-	.4byte	0x14361
+	.8byte	.LVL645
+	.4byte	0x14593
 	.uleb128 0x4e
-	.8byte	.LVL522
-	.4byte	0x1449c
+	.8byte	.LVL646
+	.4byte	0x14593
 	.uleb128 0x4e
-	.8byte	.LVL524
-	.4byte	0x144a8
+	.8byte	.LVL647
+	.4byte	0x14593
 	.uleb128 0x4e
-	.8byte	.LVL530
-	.4byte	0x144b5
+	.8byte	.LVL648
+	.4byte	0x14593
 	.uleb128 0x4e
-	.8byte	.LVL533
-	.4byte	0x144c2
+	.8byte	.LVL649
+	.4byte	0x14593
+	.byte	0
+	.uleb128 0x4e
+	.8byte	.LVL525
+	.4byte	0x14465
+	.uleb128 0x4e
+	.8byte	.LVL526
+	.4byte	0x145a0
+	.uleb128 0x4e
+	.8byte	.LVL528
+	.4byte	0x145ac
 	.uleb128 0x4e
 	.8byte	.LVL534
-	.4byte	0x143a8
+	.4byte	0x145b9
 	.uleb128 0x4e
-	.8byte	.LVL542
-	.4byte	0x1432e
+	.8byte	.LVL537
+	.4byte	0x145c6
 	.uleb128 0x4e
-	.8byte	.LVL579
-	.4byte	0x143a8
+	.8byte	.LVL538
+	.4byte	0x144ac
 	.uleb128 0x4e
-	.8byte	.LVL581
-	.4byte	0x143a8
+	.8byte	.LVL546
+	.4byte	0x14432
 	.uleb128 0x4e
-	.8byte	.LVL584
-	.4byte	0x143a8
+	.8byte	.LVL583
+	.4byte	0x144ac
 	.uleb128 0x4e
-	.8byte	.LVL586
-	.4byte	0x143a8
+	.8byte	.LVL585
+	.4byte	0x144ac
 	.uleb128 0x4e
-	.8byte	.LVL589
-	.4byte	0x143a8
+	.8byte	.LVL588
+	.4byte	0x144ac
 	.uleb128 0x4e
-	.8byte	.LVL645
-	.4byte	0x1432e
+	.8byte	.LVL590
+	.4byte	0x144ac
 	.uleb128 0x4e
-	.8byte	.LVL676
-	.4byte	0x143a8
+	.8byte	.LVL593
+	.4byte	0x144ac
 	.uleb128 0x4e
-	.8byte	.LVL682
-	.4byte	0x143a8
+	.8byte	.LVL650
+	.4byte	0x14432
+	.uleb128 0x4e
+	.8byte	.LVL681
+	.4byte	0x144ac
 	.uleb128 0x4e
 	.8byte	.LVL687
-	.4byte	0x143a8
+	.4byte	0x144ac
 	.uleb128 0x4e
-	.8byte	.LVL696
-	.4byte	0x144cf
+	.8byte	.LVL692
+	.4byte	0x144ac
+	.uleb128 0x4e
+	.8byte	.LVL701
+	.4byte	0x145d3
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3042
+	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0x8c7
+	.2byte	0x8f0
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfdde
+	.4byte	0xfe26
 	.uleb128 0x64
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x8c7
-	.4byte	0xe49e
+	.2byte	0x8f0
+	.4byte	0xe4b6
 	.uleb128 0x65
-	.4byte	.LASF3000
+	.4byte	.LASF3002
 	.byte	0x1
-	.2byte	0x8c7
+	.2byte	0x8f0
 	.4byte	0xe160
 	.uleb128 0x46
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x8c9
-	.4byte	0xe763
+	.2byte	0x8f2
+	.4byte	0xe7a7
 	.uleb128 0x46
-	.4byte	.LASF3034
+	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0x8ca
+	.2byte	0x8f3
 	.4byte	0x6d
 	.uleb128 0x46
-	.4byte	.LASF3035
+	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0x8cb
+	.2byte	0x8f4
 	.4byte	0x6d
 	.uleb128 0x46
-	.4byte	.LASF3036
+	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0x8cc
+	.2byte	0x8f5
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3037
+	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0x8cd
+	.2byte	0x8f6
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3038
+	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0x8ce
+	.2byte	0x8f7
 	.4byte	0x21e
 	.uleb128 0x46
-	.4byte	.LASF3039
+	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0x8cf
+	.2byte	0x8f8
 	.4byte	0x21e
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x8d0
-	.4byte	0xe439
+	.2byte	0x8f9
+	.4byte	0xe451
 	.uleb128 0x46
-	.4byte	.LASF3040
+	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0x8d1
+	.2byte	0x8fa
 	.4byte	0x458
 	.uleb128 0x46
-	.4byte	.LASF3041
+	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0x8d2
+	.2byte	0x8fb
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3097
+	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x8b0
+	.2byte	0x8d9
 	.byte	0x1
-	.4byte	0xfdf8
+	.4byte	0xfe40
 	.uleb128 0x65
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x8b0
-	.4byte	0xe763
+	.2byte	0x8d9
+	.4byte	0xe7a7
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3043
+	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0x896
+	.2byte	0x8bf
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe30
+	.4byte	0xfe78
 	.uleb128 0x65
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x896
-	.4byte	0xe763
+	.2byte	0x8bf
+	.4byte	0xe7a7
 	.uleb128 0x46
 	.4byte	.LASF2466
 	.byte	0x1
-	.2byte	0x898
+	.2byte	0x8c1
 	.4byte	0xd81a
 	.uleb128 0x67
 	.uleb128 0x52
 	.string	"__k"
 	.byte	0x1
-	.2byte	0x8a5
+	.2byte	0x8ce
 	.4byte	0x2f05
 	.byte	0
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3044
+	.4byte	.LASF3048
 	.byte	0x1
-	.2byte	0x84d
+	.2byte	0x876
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfeaa
+	.4byte	0xfef2
 	.uleb128 0x64
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x84d
-	.4byte	0xe49e
+	.2byte	0x876
+	.4byte	0xe4b6
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x84f
+	.2byte	0x878
 	.4byte	0xa570
 	.uleb128 0x46
-	.4byte	.LASF3000
+	.4byte	.LASF3002
 	.byte	0x1
-	.2byte	0x850
+	.2byte	0x879
 	.4byte	0xe160
 	.uleb128 0x46
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x851
-	.4byte	0xe763
+	.2byte	0x87a
+	.4byte	0xe7a7
 	.uleb128 0x46
-	.4byte	.LASF3045
+	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0x852
+	.2byte	0x87b
 	.4byte	0xb894
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x853
+	.2byte	0x87c
 	.4byte	0x974c
 	.uleb128 0x46
-	.4byte	.LASF3046
+	.4byte	.LASF3050
 	.byte	0x1
-	.2byte	0x854
+	.2byte	0x87d
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x855
+	.2byte	0x87e
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x855
+	.2byte	0x87e
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3047
+	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0x824
+	.2byte	0x84a
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xff1b
+	.4byte	0xff63
 	.uleb128 0x65
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x824
-	.4byte	0xe763
+	.2byte	0x84a
+	.4byte	0xe7a7
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x826
+	.2byte	0x84c
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x827
+	.2byte	0x84d
 	.4byte	0xa570
 	.uleb128 0x46
-	.4byte	.LASF3045
+	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0x828
+	.2byte	0x84e
 	.4byte	0xb894
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x829
+	.2byte	0x84f
 	.4byte	0x974c
 	.uleb128 0x46
-	.4byte	.LASF3048
+	.4byte	.LASF2965
 	.byte	0x1
-	.2byte	0x82a
+	.2byte	0x850
 	.4byte	0x29
 	.uleb128 0x46
-	.4byte	.LASF3049
+	.4byte	.LASF2966
 	.byte	0x1
-	.2byte	0x82b
+	.2byte	0x851
 	.4byte	0xc6
 	.uleb128 0x68
-	.4byte	.LASF3026
-	.4byte	0xff2b
-	.4byte	.LASF3047
+	.4byte	.LASF3030
+	.4byte	0xff73
+	.4byte	.LASF3051
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xff2b
+	.4byte	0xff73
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x12
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xff1b
+	.4byte	0xff63
 	.uleb128 0x63
-	.4byte	.LASF3050
+	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0x815
+	.2byte	0x83a
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xff4e
+	.4byte	0xff96
 	.uleb128 0x65
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x815
-	.4byte	0xe763
+	.2byte	0x83a
+	.4byte	0xe7a7
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3051
+	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0x80c
+	.2byte	0x831
 	.4byte	0x2ee
-	.8byte	.LFB2841
-	.8byte	.LFE2841-.LFB2841
+	.8byte	.LFB2843
+	.8byte	.LFE2843-.LFB2843
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xffae
+	.4byte	0xfff6
 	.uleb128 0x58
 	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x80c
+	.2byte	0x831
 	.4byte	0xa570
-	.4byte	.LLST75
+	.4byte	.LLST77
 	.uleb128 0x58
 	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x80d
+	.2byte	0x832
 	.4byte	0xb3eb
-	.4byte	.LLST76
+	.4byte	.LLST78
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x80e
+	.2byte	0x833
 	.4byte	0x21e
-	.4byte	.LLST77
+	.4byte	.LLST79
 	.uleb128 0x4e
-	.8byte	.LVL300
-	.4byte	0x144d9
+	.8byte	.LVL304
+	.4byte	0x145dd
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3052
+	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0x803
+	.2byte	0x828
 	.4byte	0x2ee
-	.8byte	.LFB2840
-	.8byte	.LFE2840-.LFB2840
+	.8byte	.LFB2842
+	.8byte	.LFE2842-.LFB2842
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1000e
+	.4byte	0x10056
 	.uleb128 0x58
 	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x803
+	.2byte	0x828
 	.4byte	0xa570
-	.4byte	.LLST78
+	.4byte	.LLST80
 	.uleb128 0x58
 	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x804
+	.2byte	0x829
 	.4byte	0xb3eb
-	.4byte	.LLST79
+	.4byte	.LLST81
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x805
+	.2byte	0x82a
 	.4byte	0x21e
-	.4byte	.LLST80
+	.4byte	.LLST82
 	.uleb128 0x4e
-	.8byte	.LVL305
-	.4byte	0x144e5
+	.8byte	.LVL309
+	.4byte	0x145e9
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3053
+	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0x7fa
+	.2byte	0x81f
 	.4byte	0x2ee
-	.8byte	.LFB2839
-	.8byte	.LFE2839-.LFB2839
+	.8byte	.LFB2841
+	.8byte	.LFE2841-.LFB2841
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1006e
+	.4byte	0x100b6
 	.uleb128 0x58
 	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x7fa
+	.2byte	0x81f
 	.4byte	0xa570
-	.4byte	.LLST81
+	.4byte	.LLST83
 	.uleb128 0x58
 	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x7fb
+	.2byte	0x820
 	.4byte	0xb3eb
-	.4byte	.LLST82
+	.4byte	.LLST84
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7fc
+	.2byte	0x821
 	.4byte	0x21e
-	.4byte	.LLST83
+	.4byte	.LLST85
 	.uleb128 0x4e
-	.8byte	.LVL310
-	.4byte	0x144e5
+	.8byte	.LVL314
+	.4byte	0x145e9
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3054
+	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0x7e2
+	.2byte	0x807
 	.4byte	0x2ee
-	.8byte	.LFB2838
-	.8byte	.LFE2838-.LFB2838
+	.8byte	.LFB2840
+	.8byte	.LFE2840-.LFB2840
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1013e
+	.4byte	0x10186
 	.uleb128 0x58
 	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x7e2
+	.2byte	0x807
 	.4byte	0xa570
-	.4byte	.LLST93
+	.4byte	.LLST95
 	.uleb128 0x58
 	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x7e3
+	.2byte	0x808
 	.4byte	0xb3eb
-	.4byte	.LLST94
+	.4byte	.LLST96
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7e4
+	.2byte	0x809
 	.4byte	0x56
-	.4byte	.LLST95
+	.4byte	.LLST97
 	.uleb128 0x58
 	.4byte	.LASF383
 	.byte	0x1
-	.2byte	0x7e4
+	.2byte	0x809
 	.4byte	0x2e3
-	.4byte	.LLST96
+	.4byte	.LLST98
 	.uleb128 0x5a
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x7e6
-	.4byte	0xe49e
-	.4byte	.LLST97
+	.2byte	0x80b
+	.4byte	0xe4b6
+	.4byte	.LLST99
 	.uleb128 0x59
 	.4byte	.LASF2456
 	.byte	0x1
-	.2byte	0x7e7
+	.2byte	0x80c
 	.4byte	0xc6
-	.4byte	.LLST98
+	.4byte	.LLST100
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x7e7
+	.2byte	0x80c
 	.4byte	0xc6
 	.uleb128 0x4e
-	.8byte	.LVL336
-	.4byte	0x144f2
+	.8byte	.LVL340
+	.4byte	0x145f6
 	.uleb128 0x4e
-	.8byte	.LVL338
-	.4byte	0x144ff
+	.8byte	.LVL342
+	.4byte	0x14603
 	.uleb128 0x4e
-	.8byte	.LVL343
-	.4byte	0x143a8
+	.8byte	.LVL347
+	.4byte	0x144ac
 	.uleb128 0x4e
-	.8byte	.LVL346
-	.4byte	0x143a8
+	.8byte	.LVL350
+	.4byte	0x144ac
 	.uleb128 0x4e
-	.8byte	.LVL347
-	.4byte	0x144cf
+	.8byte	.LVL351
+	.4byte	0x145d3
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3055
+	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0x7d6
+	.2byte	0x7fb
 	.4byte	0x2ee
-	.8byte	.LFB2837
-	.8byte	.LFE2837-.LFB2837
+	.8byte	.LFB2839
+	.8byte	.LFE2839-.LFB2839
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x101d8
+	.4byte	0x10220
 	.uleb128 0x58
 	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x7d6
+	.2byte	0x7fb
 	.4byte	0xa570
-	.4byte	.LLST84
+	.4byte	.LLST86
 	.uleb128 0x58
 	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x7d7
+	.2byte	0x7fc
 	.4byte	0xb3eb
-	.4byte	.LLST85
+	.4byte	.LLST87
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7d8
+	.2byte	0x7fd
 	.4byte	0x21e
-	.4byte	.LLST86
+	.4byte	.LLST88
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x7da
-	.4byte	0xe49e
+	.2byte	0x7ff
+	.4byte	0xe4b6
 	.uleb128 0x46
 	.4byte	.LASF2456
 	.byte	0x1
-	.2byte	0x7db
+	.2byte	0x800
 	.4byte	0xc6
 	.uleb128 0x53
-	.4byte	0x13261
-	.8byte	.LBB1220
-	.8byte	.LBE1220-.LBB1220
+	.4byte	0x13328
+	.8byte	.LBB1218
+	.8byte	.LBE1218-.LBB1218
 	.byte	0x1
-	.2byte	0x7dd
-	.4byte	0x101ca
+	.2byte	0x802
+	.4byte	0x10212
 	.uleb128 0x54
-	.4byte	0x13271
+	.4byte	0x13338
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL315
-	.4byte	0x144e5
+	.8byte	.LVL319
+	.4byte	0x145e9
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3056
+	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x7c8
+	.2byte	0x7ed
 	.4byte	0x2ee
-	.8byte	.LFB2836
-	.8byte	.LFE2836-.LFB2836
+	.8byte	.LFB2838
+	.8byte	.LFE2838-.LFB2838
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10281
+	.4byte	0x102c9
 	.uleb128 0x58
 	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x7c8
+	.2byte	0x7ed
 	.4byte	0xa570
-	.4byte	.LLST87
+	.4byte	.LLST89
 	.uleb128 0x58
 	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x7c9
+	.2byte	0x7ee
 	.4byte	0xb3eb
-	.4byte	.LLST88
+	.4byte	.LLST90
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7ca
+	.2byte	0x7ef
 	.4byte	0x21e
-	.4byte	.LLST89
+	.4byte	.LLST91
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x7cc
-	.4byte	0xe49e
+	.2byte	0x7f1
+	.4byte	0xe4b6
 	.uleb128 0x69
 	.string	"t"
 	.byte	0x1
-	.2byte	0x7cd
+	.2byte	0x7f2
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x5b
-	.4byte	0x1327d
-	.8byte	.LBB1222
+	.4byte	0x13344
+	.8byte	.LBB1220
 	.4byte	.Ldebug_ranges0+0x6a0
 	.byte	0x1
-	.2byte	0x7cf
-	.4byte	0x10266
+	.2byte	0x7f4
+	.4byte	0x102ae
 	.uleb128 0x54
-	.4byte	0x13298
+	.4byte	0x1335f
 	.uleb128 0x54
-	.4byte	0x1328d
+	.4byte	0x13354
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL322
-	.4byte	0x144e5
+	.8byte	.LVL326
+	.4byte	0x145e9
 	.uleb128 0x4e
-	.8byte	.LVL325
-	.4byte	0x144cf
+	.8byte	.LVL329
+	.4byte	0x145d3
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3057
+	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x7bd
+	.2byte	0x7e2
 	.4byte	0x2ee
-	.8byte	.LFB2835
-	.8byte	.LFE2835-.LFB2835
+	.8byte	.LFB2837
+	.8byte	.LFE2837-.LFB2837
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x102ed
+	.4byte	0x10335
 	.uleb128 0x58
 	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x7bd
+	.2byte	0x7e2
 	.4byte	0xa570
-	.4byte	.LLST90
+	.4byte	.LLST92
 	.uleb128 0x58
 	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x7be
+	.2byte	0x7e3
 	.4byte	0xb3eb
-	.4byte	.LLST91
+	.4byte	.LLST93
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7bf
+	.2byte	0x7e4
 	.4byte	0x21e
-	.4byte	.LLST92
+	.4byte	.LLST94
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x7c1
-	.4byte	0xe49e
+	.2byte	0x7e6
+	.4byte	0xe4b6
 	.uleb128 0x4e
-	.8byte	.LVL330
-	.4byte	0x144e5
+	.8byte	.LVL334
+	.4byte	0x145e9
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3058
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x7b2
+	.2byte	0x7d7
 	.4byte	0x2ee
-	.8byte	.LFB2834
-	.8byte	.LFE2834-.LFB2834
+	.8byte	.LFB2836
+	.8byte	.LFE2836-.LFB2836
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10366
+	.4byte	0x103ae
 	.uleb128 0x58
 	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x7b2
+	.2byte	0x7d7
 	.4byte	0xa570
-	.4byte	.LLST99
+	.4byte	.LLST101
 	.uleb128 0x58
 	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x7b3
+	.2byte	0x7d8
 	.4byte	0xb3eb
-	.4byte	.LLST100
+	.4byte	.LLST102
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7b4
+	.2byte	0x7d9
 	.4byte	0x21e
-	.4byte	.LLST101
+	.4byte	.LLST103
 	.uleb128 0x46
-	.4byte	.LASF3059
+	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x7b6
+	.2byte	0x7db
 	.4byte	0x56
 	.uleb128 0x4e
-	.8byte	.LVL349
-	.4byte	0x1450b
+	.8byte	.LVL353
+	.4byte	0x1460f
 	.uleb128 0x4e
-	.8byte	.LVL350
-	.4byte	0x144e5
+	.8byte	.LVL354
+	.4byte	0x145e9
+	.byte	0
+	.uleb128 0x63
+	.4byte	.LASF3062
+	.byte	0x1
+	.2byte	0x7c4
+	.4byte	0xc6
+	.byte	0x1
+	.4byte	0x103d8
+	.uleb128 0x65
+	.4byte	.LASF418
+	.byte	0x1
+	.2byte	0x7c4
+	.4byte	0x1c7f
+	.uleb128 0x65
+	.4byte	.LASF1273
+	.byte	0x1
+	.2byte	0x7c4
+	.4byte	0x555c
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3060
+	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x79b
+	.2byte	0x7b4
 	.4byte	0xc6
-	.8byte	.LFB2833
-	.8byte	.LFE2833-.LFB2833
+	.8byte	.LFB2834
+	.8byte	.LFE2834-.LFB2834
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x103a7
+	.4byte	0x10440
 	.uleb128 0x58
+	.4byte	.LASF1273
+	.byte	0x1
+	.2byte	0x7b4
+	.4byte	0x555c
+	.4byte	.LLST16
+	.uleb128 0x51
+	.string	"vma"
+	.byte	0x1
+	.2byte	0x7b4
+	.4byte	0x3cb5
+	.4byte	.LLST17
+	.uleb128 0x46
+	.4byte	.LASF2959
+	.byte	0x1
+	.2byte	0x7b6
+	.4byte	0xe7a7
+	.uleb128 0x46
+	.4byte	.LASF884
+	.byte	0x1
+	.2byte	0x7b7
+	.4byte	0x29
+	.uleb128 0x4e
+	.8byte	.LVL82
+	.4byte	0x1461b
+	.byte	0
+	.uleb128 0x6a
+	.4byte	.LASF3065
+	.byte	0x1
+	.2byte	0x79d
+	.4byte	0xc6
+	.4byte	0x10469
+	.uleb128 0x65
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0x79b
+	.2byte	0x79d
 	.4byte	0x1c7f
-	.4byte	.LLST10
-	.uleb128 0x6a
+	.uleb128 0x65
 	.4byte	.LASF1273
 	.byte	0x1
-	.2byte	0x79b
+	.2byte	0x79d
 	.4byte	0x555c
-	.uleb128 0x1
-	.byte	0x51
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3061
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x78c
+	.2byte	0x78e
 	.4byte	0xc6
 	.8byte	.LFB2832
 	.8byte	.LFE2832-.LFB2832
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10410
+	.4byte	0x104d2
 	.uleb128 0x58
 	.4byte	.LASF1273
 	.byte	0x1
-	.2byte	0x78c
+	.2byte	0x78e
 	.4byte	0x555c
 	.4byte	.LLST14
 	.uleb128 0x51
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x78c
+	.2byte	0x78e
 	.4byte	0x3cb5
 	.4byte	.LLST15
 	.uleb128 0x46
 	.4byte	.LASF884
 	.byte	0x1
-	.2byte	0x78e
+	.2byte	0x790
 	.4byte	0x29
 	.uleb128 0x4e
 	.8byte	.LVL76
-	.4byte	0x14517
+	.4byte	0x14628
 	.uleb128 0x4e
 	.8byte	.LVL77
-	.4byte	0x14523
+	.4byte	0x1461b
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3062
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x6c3
+	.2byte	0x6c5
 	.4byte	0x199
 	.8byte	.LFB2831
 	.8byte	.LFE2831-.LFB2831
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x116b8
+	.4byte	0x1177a
 	.uleb128 0x58
 	.4byte	.LASF1273
 	.byte	0x1
-	.2byte	0x6c3
+	.2byte	0x6c5
 	.4byte	0x555c
-	.4byte	.LLST16
+	.4byte	.LLST18
 	.uleb128 0x51
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0x6c3
+	.2byte	0x6c5
 	.4byte	0x6d
-	.4byte	.LLST17
+	.4byte	.LLST19
 	.uleb128 0x51
 	.string	"arg"
 	.byte	0x1
-	.2byte	0x6c3
+	.2byte	0x6c5
 	.4byte	0x29
-	.4byte	.LLST18
+	.4byte	.LLST20
 	.uleb128 0x46
-	.4byte	.LASF3063
+	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x6c5
+	.2byte	0x6c7
 	.4byte	0x458
 	.uleb128 0x46
-	.4byte	.LASF3000
+	.4byte	.LASF3002
 	.byte	0x1
-	.2byte	0x6c6
+	.2byte	0x6c8
 	.4byte	0xe160
 	.uleb128 0x46
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x6c7
-	.4byte	0xe763
+	.2byte	0x6c9
+	.4byte	0xe7a7
 	.uleb128 0x4c
-	.4byte	.LASF3064
+	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0x6c8
+	.2byte	0x6ca
 	.4byte	0xda06
 	.uleb128 0x2
 	.byte	0x91
@@ -40756,997 +40935,997 @@ __exitcall_ebc_exit:
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6c9
-	.4byte	0xe439
+	.2byte	0x6cb
+	.4byte	0xe451
 	.uleb128 0x46
-	.4byte	.LASF3065
+	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0x6ca
+	.2byte	0x6cc
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3066
+	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0x6cb
+	.2byte	0x6cd
 	.4byte	0x29
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x6cc
+	.2byte	0x6ce
 	.4byte	0xc6
 	.uleb128 0x55
-	.4byte	.LASF3026
-	.4byte	0x116c8
+	.4byte	.LASF3030
+	.4byte	0x1178a
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34976
+	.8byte	__func__.34978
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x1a0
-	.4byte	0x1057a
+	.4byte	0x1063c
 	.uleb128 0x46
-	.4byte	.LASF3067
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x716
+	.2byte	0x718
 	.4byte	0xc6
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x1a0
 	.uleb128 0x6b
-	.4byte	.LASF3079
+	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0x716
-	.8byte	.L212
+	.2byte	0x718
+	.8byte	.L216
 	.uleb128 0x4c
-	.4byte	.LASF3068
+	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0x716
+	.2byte	0x718
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -96
 	.uleb128 0x46
-	.4byte	.LASF3067
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x716
+	.2byte	0x718
 	.4byte	0x199
 	.uleb128 0x6c
-	.8byte	.LBB1012
-	.8byte	.LBE1012-.LBB1012
-	.4byte	0x1055e
+	.8byte	.LBB1010
+	.8byte	.LBE1010-.LBB1010
+	.4byte	0x10620
 	.uleb128 0x59
-	.4byte	.LASF3069
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x716
+	.2byte	0x718
 	.4byte	0x199
-	.4byte	.LLST33
+	.4byte	.LLST35
 	.uleb128 0x4e
-	.8byte	.LVL123
-	.4byte	0x14530
+	.8byte	.LVL127
+	.4byte	0x14634
 	.uleb128 0x4e
-	.8byte	.LVL124
-	.4byte	0x1453c
+	.8byte	.LVL128
+	.4byte	0x14640
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL121
-	.4byte	0x14549
-	.uleb128 0x4e
 	.8byte	.LVL125
-	.4byte	0x14555
+	.4byte	0x1464d
+	.uleb128 0x4e
+	.8byte	.LVL129
+	.4byte	0x14659
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13370
-	.8byte	.LBB948
+	.4byte	0x1343e
+	.8byte	.LBB946
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x77e
-	.4byte	0x1079a
+	.2byte	0x780
+	.4byte	0x1085c
 	.uleb128 0x54
-	.4byte	0x13395
+	.4byte	0x13463
 	.uleb128 0x54
-	.4byte	0x1338a
+	.4byte	0x13458
 	.uleb128 0x54
-	.4byte	0x13380
+	.4byte	0x1344e
 	.uleb128 0x6d
-	.4byte	0x133ce
-	.8byte	.LBB949
+	.4byte	0x1349c
+	.8byte	.LBB947
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x133f3
+	.4byte	0x134c1
 	.uleb128 0x54
-	.4byte	0x133e8
+	.4byte	0x134b6
 	.uleb128 0x54
-	.4byte	0x133de
+	.4byte	0x134ac
 	.uleb128 0x6e
-	.4byte	0x1346b
-	.8byte	.LBB951
+	.4byte	0x13539
+	.8byte	.LBB949
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x106d0
+	.4byte	0x10792
 	.uleb128 0x54
-	.4byte	0x13486
+	.4byte	0x13554
 	.uleb128 0x6f
-	.4byte	0x1347b
-	.4byte	.LLST19
+	.4byte	0x13549
+	.4byte	.LLST21
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x80
 	.uleb128 0x60
-	.4byte	0x13491
-	.4byte	.LLST20
+	.4byte	0x1355f
+	.4byte	.LLST22
 	.uleb128 0x60
-	.4byte	0x1349c
-	.4byte	.LLST21
+	.4byte	0x1356a
+	.4byte	.LLST23
 	.uleb128 0x70
-	.4byte	0x138bf
-	.8byte	.LBB953
-	.8byte	.LBE953-.LBB953
+	.4byte	0x13992
+	.8byte	.LBB951
+	.8byte	.LBE951-.LBB951
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10636
+	.4byte	0x106f8
 	.uleb128 0x56
-	.8byte	.LBB954
-	.8byte	.LBE954-.LBB954
+	.8byte	.LBB952
+	.8byte	.LBE952-.LBB952
 	.uleb128 0x60
-	.4byte	0x138cf
-	.4byte	.LLST22
+	.4byte	0x139a2
+	.4byte	.LLST24
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13893
-	.8byte	.LBB955
-	.8byte	.LBE955-.LBB955
+	.4byte	0x13966
+	.8byte	.LBB953
+	.8byte	.LBE953-.LBB953
 	.byte	0x6
 	.byte	0x55
-	.4byte	0x1067e
+	.4byte	0x10740
 	.uleb128 0x54
-	.4byte	0x138ad
+	.4byte	0x13980
 	.uleb128 0x54
-	.4byte	0x138a3
+	.4byte	0x13976
 	.uleb128 0x5c
-	.4byte	0x139cb
-	.8byte	.LBB956
-	.8byte	.LBE956-.LBB956
+	.4byte	0x13a9f
+	.8byte	.LBB954
+	.8byte	.LBE954-.LBB954
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x139e5
+	.4byte	0x13ab9
 	.uleb128 0x54
-	.4byte	0x139db
+	.4byte	0x13aaf
 	.byte	0
 	.byte	0
 	.uleb128 0x56
-	.8byte	.LBB958
-	.8byte	.LBE958-.LBB958
+	.8byte	.LBB956
+	.8byte	.LBE956-.LBB956
 	.uleb128 0x57
-	.4byte	0x134a8
+	.4byte	0x13576
 	.uleb128 0x5c
-	.4byte	0x13943
-	.8byte	.LBB959
-	.8byte	.LBE959-.LBB959
+	.4byte	0x13a17
+	.8byte	.LBB957
+	.8byte	.LBE957-.LBB957
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x1395e
+	.4byte	0x13a32
 	.uleb128 0x54
-	.4byte	0x13953
+	.4byte	0x13a27
 	.uleb128 0x56
-	.8byte	.LBB960
-	.8byte	.LBE960-.LBB960
+	.8byte	.LBB958
+	.8byte	.LBE958-.LBB958
 	.uleb128 0x57
-	.4byte	0x13969
+	.4byte	0x13a3d
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13437
-	.8byte	.LBB965
-	.8byte	.LBE965-.LBB965
+	.4byte	0x13505
+	.8byte	.LBB963
+	.8byte	.LBE963-.LBB963
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x1078b
+	.4byte	0x1084d
 	.uleb128 0x54
-	.4byte	0x13447
+	.4byte	0x13515
 	.uleb128 0x56
-	.8byte	.LBB966
-	.8byte	.LBE966-.LBB966
+	.8byte	.LBB964
+	.8byte	.LBE964-.LBB964
 	.uleb128 0x60
-	.4byte	0x13452
-	.4byte	.LLST23
+	.4byte	0x13520
+	.4byte	.LLST25
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0xc0
-	.4byte	0x10756
+	.4byte	0x10818
 	.uleb128 0x60
-	.4byte	0x1345e
-	.4byte	.LLST24
+	.4byte	0x1352c
+	.4byte	.LLST26
 	.uleb128 0x5c
-	.4byte	0x13943
-	.8byte	.LBB968
-	.8byte	.LBE968-.LBB968
+	.4byte	0x13a17
+	.8byte	.LBB966
+	.8byte	.LBE966-.LBB966
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x1395e
+	.4byte	0x13a32
 	.uleb128 0x54
-	.4byte	0x13953
+	.4byte	0x13a27
 	.uleb128 0x56
-	.8byte	.LBB969
-	.8byte	.LBE969-.LBB969
+	.8byte	.LBB967
+	.8byte	.LBE967-.LBB967
 	.uleb128 0x57
-	.4byte	0x13969
+	.4byte	0x13a3d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x138bf
-	.8byte	.LBB970
-	.8byte	.LBE970-.LBB970
+	.4byte	0x13992
+	.8byte	.LBB968
+	.8byte	.LBE968-.LBB968
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB971
-	.8byte	.LBE971-.LBB971
+	.8byte	.LBB969
+	.8byte	.LBE969-.LBB969
 	.uleb128 0x60
-	.4byte	0x138cf
-	.4byte	.LLST25
+	.4byte	0x139a2
+	.4byte	.LLST27
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL151
-	.4byte	0x14562
+	.8byte	.LVL155
+	.4byte	0x14666
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x1339f
-	.8byte	.LBB981
+	.4byte	0x1346d
+	.8byte	.LBB979
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
-	.2byte	0x701
-	.4byte	0x109c5
+	.2byte	0x703
+	.4byte	0x10a87
 	.uleb128 0x54
-	.4byte	0x133c4
+	.4byte	0x13492
 	.uleb128 0x54
-	.4byte	0x133b9
+	.4byte	0x13487
 	.uleb128 0x54
-	.4byte	0x133af
+	.4byte	0x1347d
 	.uleb128 0x6d
-	.4byte	0x133fd
-	.8byte	.LBB982
+	.4byte	0x134cb
+	.8byte	.LBB980
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x13422
+	.4byte	0x134f0
 	.uleb128 0x54
-	.4byte	0x13417
+	.4byte	0x134e5
 	.uleb128 0x54
-	.4byte	0x1340d
+	.4byte	0x134db
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x57
-	.4byte	0x1342b
+	.4byte	0x134f9
 	.uleb128 0x6e
-	.4byte	0x1346b
-	.8byte	.LBB984
+	.4byte	0x13539
+	.8byte	.LBB982
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x108fa
+	.4byte	0x109bc
 	.uleb128 0x54
-	.4byte	0x13486
+	.4byte	0x13554
 	.uleb128 0x6f
-	.4byte	0x1347b
-	.4byte	.LLST26
+	.4byte	0x13549
+	.4byte	.LLST28
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x130
 	.uleb128 0x60
-	.4byte	0x13491
-	.4byte	.LLST27
+	.4byte	0x1355f
+	.4byte	.LLST29
 	.uleb128 0x60
-	.4byte	0x1349c
-	.4byte	.LLST28
+	.4byte	0x1356a
+	.4byte	.LLST30
 	.uleb128 0x70
-	.4byte	0x138bf
-	.8byte	.LBB986
-	.8byte	.LBE986-.LBB986
+	.4byte	0x13992
+	.8byte	.LBB984
+	.8byte	.LBE984-.LBB984
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10860
+	.4byte	0x10922
 	.uleb128 0x56
-	.8byte	.LBB987
-	.8byte	.LBE987-.LBB987
+	.8byte	.LBB985
+	.8byte	.LBE985-.LBB985
 	.uleb128 0x60
-	.4byte	0x138cf
-	.4byte	.LLST29
+	.4byte	0x139a2
+	.4byte	.LLST31
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB988
-	.8byte	.LBE988-.LBB988
-	.4byte	0x108b4
+	.8byte	.LBB986
+	.8byte	.LBE986-.LBB986
+	.4byte	0x10976
 	.uleb128 0x57
-	.4byte	0x134a8
+	.4byte	0x13576
 	.uleb128 0x5c
-	.4byte	0x13943
-	.8byte	.LBB989
-	.8byte	.LBE989-.LBB989
+	.4byte	0x13a17
+	.8byte	.LBB987
+	.8byte	.LBE987-.LBB987
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x1395e
+	.4byte	0x13a32
 	.uleb128 0x54
-	.4byte	0x13953
+	.4byte	0x13a27
 	.uleb128 0x56
-	.8byte	.LBB990
-	.8byte	.LBE990-.LBB990
+	.8byte	.LBB988
+	.8byte	.LBE988-.LBB988
 	.uleb128 0x57
-	.4byte	0x13969
+	.4byte	0x13a3d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13893
-	.8byte	.LBB991
-	.8byte	.LBE991-.LBB991
+	.4byte	0x13966
+	.8byte	.LBB989
+	.8byte	.LBE989-.LBB989
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x138ad
+	.4byte	0x13980
 	.uleb128 0x54
-	.4byte	0x138a3
+	.4byte	0x13976
 	.uleb128 0x5c
-	.4byte	0x139cb
-	.8byte	.LBB992
-	.8byte	.LBE992-.LBB992
+	.4byte	0x13a9f
+	.8byte	.LBB990
+	.8byte	.LBE990-.LBB990
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x139e5
+	.4byte	0x13ab9
 	.uleb128 0x54
-	.4byte	0x139db
+	.4byte	0x13aaf
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13437
-	.8byte	.LBB996
-	.8byte	.LBE996-.LBB996
+	.4byte	0x13505
+	.8byte	.LBB994
+	.8byte	.LBE994-.LBB994
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x109b5
+	.4byte	0x10a77
 	.uleb128 0x54
-	.4byte	0x13447
+	.4byte	0x13515
 	.uleb128 0x56
-	.8byte	.LBB997
-	.8byte	.LBE997-.LBB997
+	.8byte	.LBB995
+	.8byte	.LBE995-.LBB995
 	.uleb128 0x60
-	.4byte	0x13452
-	.4byte	.LLST30
+	.4byte	0x13520
+	.4byte	.LLST32
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x170
-	.4byte	0x10980
+	.4byte	0x10a42
 	.uleb128 0x60
-	.4byte	0x1345e
-	.4byte	.LLST31
+	.4byte	0x1352c
+	.4byte	.LLST33
 	.uleb128 0x5c
-	.4byte	0x13943
-	.8byte	.LBB999
-	.8byte	.LBE999-.LBB999
+	.4byte	0x13a17
+	.8byte	.LBB997
+	.8byte	.LBE997-.LBB997
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x1395e
+	.4byte	0x13a32
 	.uleb128 0x54
-	.4byte	0x13953
+	.4byte	0x13a27
 	.uleb128 0x56
-	.8byte	.LBB1000
-	.8byte	.LBE1000-.LBB1000
+	.8byte	.LBB998
+	.8byte	.LBE998-.LBB998
 	.uleb128 0x57
-	.4byte	0x13969
+	.4byte	0x13a3d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x138bf
-	.8byte	.LBB1001
-	.8byte	.LBE1001-.LBB1001
+	.4byte	0x13992
+	.8byte	.LBB999
+	.8byte	.LBE999-.LBB999
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB1002
-	.8byte	.LBE1002-.LBB1002
+	.8byte	.LBB1000
+	.8byte	.LBE1000-.LBB1000
 	.uleb128 0x60
-	.4byte	0x138cf
-	.4byte	.LLST32
+	.4byte	0x139a2
+	.4byte	.LLST34
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL116
-	.4byte	0x1456f
+	.8byte	.LVL120
+	.4byte	0x14673
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x1339f
-	.8byte	.LBB1016
+	.4byte	0x1346d
+	.8byte	.LBB1014
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
-	.2byte	0x71d
-	.4byte	0x10bf0
+	.2byte	0x71f
+	.4byte	0x10cb2
 	.uleb128 0x54
-	.4byte	0x133c4
+	.4byte	0x13492
 	.uleb128 0x54
-	.4byte	0x133b9
+	.4byte	0x13487
 	.uleb128 0x54
-	.4byte	0x133af
+	.4byte	0x1347d
 	.uleb128 0x6d
-	.4byte	0x133fd
-	.8byte	.LBB1017
+	.4byte	0x134cb
+	.8byte	.LBB1015
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x13422
+	.4byte	0x134f0
 	.uleb128 0x54
-	.4byte	0x13417
+	.4byte	0x134e5
 	.uleb128 0x54
-	.4byte	0x1340d
+	.4byte	0x134db
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x1f0
 	.uleb128 0x57
-	.4byte	0x1342b
+	.4byte	0x134f9
 	.uleb128 0x6e
-	.4byte	0x1346b
-	.8byte	.LBB1019
+	.4byte	0x13539
+	.8byte	.LBB1017
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x10b25
+	.4byte	0x10be7
 	.uleb128 0x54
-	.4byte	0x13486
+	.4byte	0x13554
 	.uleb128 0x6f
-	.4byte	0x1347b
-	.4byte	.LLST34
+	.4byte	0x13549
+	.4byte	.LLST36
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x230
 	.uleb128 0x60
-	.4byte	0x13491
-	.4byte	.LLST35
+	.4byte	0x1355f
+	.4byte	.LLST37
 	.uleb128 0x60
-	.4byte	0x1349c
-	.4byte	.LLST36
+	.4byte	0x1356a
+	.4byte	.LLST38
 	.uleb128 0x70
-	.4byte	0x138bf
-	.8byte	.LBB1021
-	.8byte	.LBE1021-.LBB1021
+	.4byte	0x13992
+	.8byte	.LBB1019
+	.8byte	.LBE1019-.LBB1019
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10a8b
+	.4byte	0x10b4d
 	.uleb128 0x56
-	.8byte	.LBB1022
-	.8byte	.LBE1022-.LBB1022
+	.8byte	.LBB1020
+	.8byte	.LBE1020-.LBB1020
 	.uleb128 0x60
-	.4byte	0x138cf
-	.4byte	.LLST37
+	.4byte	0x139a2
+	.4byte	.LLST39
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1023
-	.8byte	.LBE1023-.LBB1023
-	.4byte	0x10adf
+	.8byte	.LBB1021
+	.8byte	.LBE1021-.LBB1021
+	.4byte	0x10ba1
 	.uleb128 0x57
-	.4byte	0x134a8
+	.4byte	0x13576
 	.uleb128 0x5c
-	.4byte	0x13943
-	.8byte	.LBB1024
-	.8byte	.LBE1024-.LBB1024
+	.4byte	0x13a17
+	.8byte	.LBB1022
+	.8byte	.LBE1022-.LBB1022
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x1395e
+	.4byte	0x13a32
 	.uleb128 0x54
-	.4byte	0x13953
+	.4byte	0x13a27
 	.uleb128 0x56
-	.8byte	.LBB1025
-	.8byte	.LBE1025-.LBB1025
+	.8byte	.LBB1023
+	.8byte	.LBE1023-.LBB1023
 	.uleb128 0x57
-	.4byte	0x13969
+	.4byte	0x13a3d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13893
-	.8byte	.LBB1026
-	.8byte	.LBE1026-.LBB1026
+	.4byte	0x13966
+	.8byte	.LBB1024
+	.8byte	.LBE1024-.LBB1024
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x138ad
+	.4byte	0x13980
 	.uleb128 0x54
-	.4byte	0x138a3
+	.4byte	0x13976
 	.uleb128 0x5c
-	.4byte	0x139cb
-	.8byte	.LBB1027
-	.8byte	.LBE1027-.LBB1027
+	.4byte	0x13a9f
+	.8byte	.LBB1025
+	.8byte	.LBE1025-.LBB1025
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x139e5
+	.4byte	0x13ab9
 	.uleb128 0x54
-	.4byte	0x139db
+	.4byte	0x13aaf
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13437
-	.8byte	.LBB1031
-	.8byte	.LBE1031-.LBB1031
+	.4byte	0x13505
+	.8byte	.LBB1029
+	.8byte	.LBE1029-.LBB1029
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10be0
+	.4byte	0x10ca2
 	.uleb128 0x54
-	.4byte	0x13447
+	.4byte	0x13515
 	.uleb128 0x56
-	.8byte	.LBB1032
-	.8byte	.LBE1032-.LBB1032
+	.8byte	.LBB1030
+	.8byte	.LBE1030-.LBB1030
 	.uleb128 0x60
-	.4byte	0x13452
-	.4byte	.LLST38
+	.4byte	0x13520
+	.4byte	.LLST40
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x270
-	.4byte	0x10bab
+	.4byte	0x10c6d
 	.uleb128 0x60
-	.4byte	0x1345e
-	.4byte	.LLST39
+	.4byte	0x1352c
+	.4byte	.LLST41
 	.uleb128 0x5c
-	.4byte	0x13943
-	.8byte	.LBB1034
-	.8byte	.LBE1034-.LBB1034
+	.4byte	0x13a17
+	.8byte	.LBB1032
+	.8byte	.LBE1032-.LBB1032
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x1395e
+	.4byte	0x13a32
 	.uleb128 0x54
-	.4byte	0x13953
+	.4byte	0x13a27
 	.uleb128 0x56
-	.8byte	.LBB1035
-	.8byte	.LBE1035-.LBB1035
+	.8byte	.LBB1033
+	.8byte	.LBE1033-.LBB1033
 	.uleb128 0x57
-	.4byte	0x13969
+	.4byte	0x13a3d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x138bf
-	.8byte	.LBB1036
-	.8byte	.LBE1036-.LBB1036
+	.4byte	0x13992
+	.8byte	.LBB1034
+	.8byte	.LBE1034-.LBB1034
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB1037
-	.8byte	.LBE1037-.LBB1037
+	.8byte	.LBB1035
+	.8byte	.LBE1035-.LBB1035
 	.uleb128 0x60
-	.4byte	0x138cf
-	.4byte	.LLST40
+	.4byte	0x139a2
+	.4byte	.LLST42
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL140
-	.4byte	0x1456f
+	.8byte	.LVL144
+	.4byte	0x14673
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13370
-	.8byte	.LBB1046
+	.4byte	0x1343e
+	.8byte	.LBB1044
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
-	.2byte	0x6eb
-	.4byte	0x10e10
+	.2byte	0x6ed
+	.4byte	0x10ed2
 	.uleb128 0x54
-	.4byte	0x13395
+	.4byte	0x13463
 	.uleb128 0x54
-	.4byte	0x1338a
+	.4byte	0x13458
 	.uleb128 0x54
-	.4byte	0x13380
+	.4byte	0x1344e
 	.uleb128 0x6d
-	.4byte	0x133ce
-	.8byte	.LBB1047
+	.4byte	0x1349c
+	.8byte	.LBB1045
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x133f3
+	.4byte	0x134c1
 	.uleb128 0x54
-	.4byte	0x133e8
+	.4byte	0x134b6
 	.uleb128 0x54
-	.4byte	0x133de
+	.4byte	0x134ac
 	.uleb128 0x6e
-	.4byte	0x1346b
-	.8byte	.LBB1049
+	.4byte	0x13539
+	.8byte	.LBB1047
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10d46
+	.4byte	0x10e08
 	.uleb128 0x54
-	.4byte	0x13486
+	.4byte	0x13554
 	.uleb128 0x6f
-	.4byte	0x1347b
-	.4byte	.LLST41
+	.4byte	0x13549
+	.4byte	.LLST43
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x2f0
 	.uleb128 0x60
-	.4byte	0x13491
-	.4byte	.LLST42
+	.4byte	0x1355f
+	.4byte	.LLST44
 	.uleb128 0x60
-	.4byte	0x1349c
-	.4byte	.LLST43
+	.4byte	0x1356a
+	.4byte	.LLST45
 	.uleb128 0x70
-	.4byte	0x138bf
-	.8byte	.LBB1051
-	.8byte	.LBE1051-.LBB1051
+	.4byte	0x13992
+	.8byte	.LBB1049
+	.8byte	.LBE1049-.LBB1049
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10cac
+	.4byte	0x10d6e
 	.uleb128 0x56
-	.8byte	.LBB1052
-	.8byte	.LBE1052-.LBB1052
+	.8byte	.LBB1050
+	.8byte	.LBE1050-.LBB1050
 	.uleb128 0x60
-	.4byte	0x138cf
-	.4byte	.LLST44
+	.4byte	0x139a2
+	.4byte	.LLST46
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1053
-	.8byte	.LBE1053-.LBB1053
-	.4byte	0x10d00
+	.8byte	.LBB1051
+	.8byte	.LBE1051-.LBB1051
+	.4byte	0x10dc2
 	.uleb128 0x57
-	.4byte	0x134a8
+	.4byte	0x13576
 	.uleb128 0x5c
-	.4byte	0x13943
-	.8byte	.LBB1054
-	.8byte	.LBE1054-.LBB1054
+	.4byte	0x13a17
+	.8byte	.LBB1052
+	.8byte	.LBE1052-.LBB1052
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x1395e
+	.4byte	0x13a32
 	.uleb128 0x54
-	.4byte	0x13953
+	.4byte	0x13a27
 	.uleb128 0x56
-	.8byte	.LBB1055
-	.8byte	.LBE1055-.LBB1055
+	.8byte	.LBB1053
+	.8byte	.LBE1053-.LBB1053
 	.uleb128 0x57
-	.4byte	0x13969
+	.4byte	0x13a3d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13893
-	.8byte	.LBB1056
-	.8byte	.LBE1056-.LBB1056
+	.4byte	0x13966
+	.8byte	.LBB1054
+	.8byte	.LBE1054-.LBB1054
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x138ad
+	.4byte	0x13980
 	.uleb128 0x54
-	.4byte	0x138a3
+	.4byte	0x13976
 	.uleb128 0x5c
-	.4byte	0x139cb
-	.8byte	.LBB1057
-	.8byte	.LBE1057-.LBB1057
+	.4byte	0x13a9f
+	.8byte	.LBB1055
+	.8byte	.LBE1055-.LBB1055
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x139e5
+	.4byte	0x13ab9
 	.uleb128 0x54
-	.4byte	0x139db
+	.4byte	0x13aaf
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13437
-	.8byte	.LBB1063
-	.8byte	.LBE1063-.LBB1063
+	.4byte	0x13505
+	.8byte	.LBB1061
+	.8byte	.LBE1061-.LBB1061
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x10e01
+	.4byte	0x10ec3
 	.uleb128 0x54
-	.4byte	0x13447
+	.4byte	0x13515
 	.uleb128 0x56
-	.8byte	.LBB1064
-	.8byte	.LBE1064-.LBB1064
+	.8byte	.LBB1062
+	.8byte	.LBE1062-.LBB1062
 	.uleb128 0x60
-	.4byte	0x13452
-	.4byte	.LLST45
+	.4byte	0x13520
+	.4byte	.LLST47
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x340
-	.4byte	0x10dcc
+	.4byte	0x10e8e
 	.uleb128 0x60
-	.4byte	0x1345e
-	.4byte	.LLST46
+	.4byte	0x1352c
+	.4byte	.LLST48
 	.uleb128 0x5c
-	.4byte	0x13943
-	.8byte	.LBB1066
-	.8byte	.LBE1066-.LBB1066
+	.4byte	0x13a17
+	.8byte	.LBB1064
+	.8byte	.LBE1064-.LBB1064
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x1395e
+	.4byte	0x13a32
 	.uleb128 0x54
-	.4byte	0x13953
+	.4byte	0x13a27
 	.uleb128 0x56
-	.8byte	.LBB1067
-	.8byte	.LBE1067-.LBB1067
+	.8byte	.LBB1065
+	.8byte	.LBE1065-.LBB1065
 	.uleb128 0x57
-	.4byte	0x13969
+	.4byte	0x13a3d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x138bf
-	.8byte	.LBB1068
-	.8byte	.LBE1068-.LBB1068
+	.4byte	0x13992
+	.8byte	.LBB1066
+	.8byte	.LBE1066-.LBB1066
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB1069
-	.8byte	.LBE1069-.LBB1069
+	.8byte	.LBB1067
+	.8byte	.LBE1067-.LBB1067
 	.uleb128 0x60
-	.4byte	0x138cf
-	.4byte	.LLST47
+	.4byte	0x139a2
+	.4byte	.LLST49
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL167
-	.4byte	0x14562
+	.8byte	.LVL171
+	.4byte	0x14666
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x1339f
-	.8byte	.LBB1080
+	.4byte	0x1346d
+	.8byte	.LBB1078
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
-	.2byte	0x73a
-	.4byte	0x1104c
+	.2byte	0x73c
+	.4byte	0x1110e
 	.uleb128 0x54
-	.4byte	0x133c4
+	.4byte	0x13492
 	.uleb128 0x54
-	.4byte	0x133b9
+	.4byte	0x13487
 	.uleb128 0x54
-	.4byte	0x133af
+	.4byte	0x1347d
 	.uleb128 0x6d
-	.4byte	0x133fd
-	.8byte	.LBB1081
+	.4byte	0x134cb
+	.8byte	.LBB1079
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x13422
+	.4byte	0x134f0
 	.uleb128 0x54
-	.4byte	0x13417
+	.4byte	0x134e5
 	.uleb128 0x54
-	.4byte	0x1340d
+	.4byte	0x134db
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x370
 	.uleb128 0x60
-	.4byte	0x1342b
-	.4byte	.LLST48
+	.4byte	0x134f9
+	.4byte	.LLST50
 	.uleb128 0x6e
-	.4byte	0x1346b
-	.8byte	.LBB1083
+	.4byte	0x13539
+	.8byte	.LBB1081
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x10f74
+	.4byte	0x11036
 	.uleb128 0x54
-	.4byte	0x13486
+	.4byte	0x13554
 	.uleb128 0x6f
-	.4byte	0x1347b
-	.4byte	.LLST49
+	.4byte	0x13549
+	.4byte	.LLST51
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x60
-	.4byte	0x13491
-	.4byte	.LLST50
+	.4byte	0x1355f
+	.4byte	.LLST52
 	.uleb128 0x60
-	.4byte	0x1349c
-	.4byte	.LLST51
+	.4byte	0x1356a
+	.4byte	.LLST53
 	.uleb128 0x70
-	.4byte	0x138bf
-	.8byte	.LBB1085
-	.8byte	.LBE1085-.LBB1085
+	.4byte	0x13992
+	.8byte	.LBB1083
+	.8byte	.LBE1083-.LBB1083
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10eda
+	.4byte	0x10f9c
 	.uleb128 0x56
-	.8byte	.LBB1086
-	.8byte	.LBE1086-.LBB1086
+	.8byte	.LBB1084
+	.8byte	.LBE1084-.LBB1084
 	.uleb128 0x60
-	.4byte	0x138cf
-	.4byte	.LLST52
+	.4byte	0x139a2
+	.4byte	.LLST54
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1087
-	.8byte	.LBE1087-.LBB1087
-	.4byte	0x10f2e
+	.8byte	.LBB1085
+	.8byte	.LBE1085-.LBB1085
+	.4byte	0x10ff0
 	.uleb128 0x57
-	.4byte	0x134a8
+	.4byte	0x13576
 	.uleb128 0x5c
-	.4byte	0x13943
-	.8byte	.LBB1088
-	.8byte	.LBE1088-.LBB1088
+	.4byte	0x13a17
+	.8byte	.LBB1086
+	.8byte	.LBE1086-.LBB1086
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x1395e
+	.4byte	0x13a32
 	.uleb128 0x54
-	.4byte	0x13953
+	.4byte	0x13a27
 	.uleb128 0x56
-	.8byte	.LBB1089
-	.8byte	.LBE1089-.LBB1089
+	.8byte	.LBB1087
+	.8byte	.LBE1087-.LBB1087
 	.uleb128 0x57
-	.4byte	0x13969
+	.4byte	0x13a3d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13893
-	.8byte	.LBB1090
-	.8byte	.LBE1090-.LBB1090
+	.4byte	0x13966
+	.8byte	.LBB1088
+	.8byte	.LBE1088-.LBB1088
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x138ad
+	.4byte	0x13980
 	.uleb128 0x54
-	.4byte	0x138a3
+	.4byte	0x13976
 	.uleb128 0x5c
-	.4byte	0x139cb
-	.8byte	.LBB1091
-	.8byte	.LBE1091-.LBB1091
+	.4byte	0x13a9f
+	.8byte	.LBB1089
+	.8byte	.LBE1089-.LBB1089
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x139e5
+	.4byte	0x13ab9
 	.uleb128 0x54
-	.4byte	0x139db
+	.4byte	0x13aaf
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13437
-	.8byte	.LBB1097
-	.8byte	.LBE1097-.LBB1097
+	.4byte	0x13505
+	.8byte	.LBB1095
+	.8byte	.LBE1095-.LBB1095
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x1102f
+	.4byte	0x110f1
 	.uleb128 0x54
-	.4byte	0x13447
+	.4byte	0x13515
 	.uleb128 0x56
-	.8byte	.LBB1098
-	.8byte	.LBE1098-.LBB1098
+	.8byte	.LBB1096
+	.8byte	.LBE1096-.LBB1096
 	.uleb128 0x60
-	.4byte	0x13452
-	.4byte	.LLST53
+	.4byte	0x13520
+	.4byte	.LLST55
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x420
-	.4byte	0x10ffa
+	.4byte	0x110bc
 	.uleb128 0x60
-	.4byte	0x1345e
-	.4byte	.LLST54
+	.4byte	0x1352c
+	.4byte	.LLST56
 	.uleb128 0x5c
-	.4byte	0x13943
-	.8byte	.LBB1100
-	.8byte	.LBE1100-.LBB1100
+	.4byte	0x13a17
+	.8byte	.LBB1098
+	.8byte	.LBE1098-.LBB1098
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x1395e
+	.4byte	0x13a32
 	.uleb128 0x54
-	.4byte	0x13953
+	.4byte	0x13a27
 	.uleb128 0x56
-	.8byte	.LBB1101
-	.8byte	.LBE1101-.LBB1101
+	.8byte	.LBB1099
+	.8byte	.LBE1099-.LBB1099
 	.uleb128 0x57
-	.4byte	0x13969
+	.4byte	0x13a3d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x138bf
-	.8byte	.LBB1102
-	.8byte	.LBE1102-.LBB1102
+	.4byte	0x13992
+	.8byte	.LBB1100
+	.8byte	.LBE1100-.LBB1100
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB1103
-	.8byte	.LBE1103-.LBB1103
+	.8byte	.LBB1101
+	.8byte	.LBE1101-.LBB1101
 	.uleb128 0x60
-	.4byte	0x138cf
-	.4byte	.LLST55
+	.4byte	0x139a2
+	.4byte	.LLST57
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL179
-	.4byte	0x1456f
+	.8byte	.LVL183
+	.4byte	0x14673
 	.uleb128 0x4e
-	.8byte	.LVL257
-	.4byte	0x14392
+	.8byte	.LVL261
+	.4byte	0x14496
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13370
-	.8byte	.LBB1116
+	.4byte	0x1343e
+	.8byte	.LBB1114
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
-	.2byte	0x757
-	.4byte	0x110fe
+	.2byte	0x759
+	.4byte	0x111c0
 	.uleb128 0x54
-	.4byte	0x13395
+	.4byte	0x13463
 	.uleb128 0x54
-	.4byte	0x1338a
+	.4byte	0x13458
 	.uleb128 0x54
-	.4byte	0x13380
+	.4byte	0x1344e
 	.uleb128 0x6d
-	.4byte	0x133ce
-	.8byte	.LBB1117
+	.4byte	0x1349c
+	.8byte	.LBB1115
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x133f3
+	.4byte	0x134c1
 	.uleb128 0x54
-	.4byte	0x133e8
+	.4byte	0x134b6
 	.uleb128 0x54
-	.4byte	0x133de
+	.4byte	0x134ac
 	.uleb128 0x6d
-	.4byte	0x1346b
-	.8byte	.LBB1119
+	.4byte	0x13539
+	.8byte	.LBB1117
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x54
-	.4byte	0x13486
+	.4byte	0x13554
 	.uleb128 0x71
-	.4byte	0x1347b
+	.4byte	0x13549
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x4b0
 	.uleb128 0x57
-	.4byte	0x13491
+	.4byte	0x1355f
 	.uleb128 0x60
-	.4byte	0x1349c
-	.4byte	.LLST56
+	.4byte	0x1356a
+	.4byte	.LLST58
 	.uleb128 0x5c
-	.4byte	0x138bf
-	.8byte	.LBB1121
-	.8byte	.LBE1121-.LBB1121
+	.4byte	0x13992
+	.8byte	.LBB1119
+	.8byte	.LBE1119-.LBB1119
 	.byte	0x6
 	.byte	0x4d
 	.uleb128 0x56
-	.8byte	.LBB1122
-	.8byte	.LBE1122-.LBB1122
+	.8byte	.LBB1120
+	.8byte	.LBE1120-.LBB1120
 	.uleb128 0x60
-	.4byte	0x138cf
-	.4byte	.LLST57
+	.4byte	0x139a2
+	.4byte	.LLST59
 	.byte	0
 	.byte	0
 	.byte	0
@@ -41754,2918 +41933,2918 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13370
-	.8byte	.LBB1128
+	.4byte	0x1343e
+	.8byte	.LBB1126
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
-	.2byte	0x747
-	.4byte	0x1131e
+	.2byte	0x749
+	.4byte	0x113e0
 	.uleb128 0x54
-	.4byte	0x13395
+	.4byte	0x13463
 	.uleb128 0x54
-	.4byte	0x1338a
+	.4byte	0x13458
 	.uleb128 0x54
-	.4byte	0x13380
+	.4byte	0x1344e
 	.uleb128 0x6d
-	.4byte	0x133ce
-	.8byte	.LBB1129
+	.4byte	0x1349c
+	.8byte	.LBB1127
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x133f3
+	.4byte	0x134c1
 	.uleb128 0x54
-	.4byte	0x133e8
+	.4byte	0x134b6
 	.uleb128 0x54
-	.4byte	0x133de
+	.4byte	0x134ac
 	.uleb128 0x6e
-	.4byte	0x1346b
-	.8byte	.LBB1131
+	.4byte	0x13539
+	.8byte	.LBB1129
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x11254
+	.4byte	0x11316
 	.uleb128 0x54
-	.4byte	0x13486
+	.4byte	0x13554
 	.uleb128 0x6f
-	.4byte	0x1347b
-	.4byte	.LLST58
+	.4byte	0x13549
+	.4byte	.LLST60
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x540
 	.uleb128 0x60
-	.4byte	0x13491
-	.4byte	.LLST59
+	.4byte	0x1355f
+	.4byte	.LLST61
 	.uleb128 0x60
-	.4byte	0x1349c
-	.4byte	.LLST60
+	.4byte	0x1356a
+	.4byte	.LLST62
 	.uleb128 0x70
-	.4byte	0x138bf
-	.8byte	.LBB1133
-	.8byte	.LBE1133-.LBB1133
+	.4byte	0x13992
+	.8byte	.LBB1131
+	.8byte	.LBE1131-.LBB1131
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x111ba
+	.4byte	0x1127c
 	.uleb128 0x56
-	.8byte	.LBB1134
-	.8byte	.LBE1134-.LBB1134
+	.8byte	.LBB1132
+	.8byte	.LBE1132-.LBB1132
 	.uleb128 0x60
-	.4byte	0x138cf
-	.4byte	.LLST61
+	.4byte	0x139a2
+	.4byte	.LLST63
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1135
-	.8byte	.LBE1135-.LBB1135
-	.4byte	0x1120e
+	.8byte	.LBB1133
+	.8byte	.LBE1133-.LBB1133
+	.4byte	0x112d0
 	.uleb128 0x57
-	.4byte	0x134a8
+	.4byte	0x13576
 	.uleb128 0x5c
-	.4byte	0x13943
-	.8byte	.LBB1136
-	.8byte	.LBE1136-.LBB1136
+	.4byte	0x13a17
+	.8byte	.LBB1134
+	.8byte	.LBE1134-.LBB1134
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x1395e
+	.4byte	0x13a32
 	.uleb128 0x54
-	.4byte	0x13953
+	.4byte	0x13a27
 	.uleb128 0x56
-	.8byte	.LBB1137
-	.8byte	.LBE1137-.LBB1137
+	.8byte	.LBB1135
+	.8byte	.LBE1135-.LBB1135
 	.uleb128 0x57
-	.4byte	0x13969
+	.4byte	0x13a3d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13893
-	.8byte	.LBB1138
-	.8byte	.LBE1138-.LBB1138
+	.4byte	0x13966
+	.8byte	.LBB1136
+	.8byte	.LBE1136-.LBB1136
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x138ad
+	.4byte	0x13980
 	.uleb128 0x54
-	.4byte	0x138a3
+	.4byte	0x13976
 	.uleb128 0x5c
-	.4byte	0x139cb
-	.8byte	.LBB1139
-	.8byte	.LBE1139-.LBB1139
+	.4byte	0x13a9f
+	.8byte	.LBB1137
+	.8byte	.LBE1137-.LBB1137
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x139e5
+	.4byte	0x13ab9
 	.uleb128 0x54
-	.4byte	0x139db
+	.4byte	0x13aaf
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13437
-	.8byte	.LBB1147
-	.8byte	.LBE1147-.LBB1147
+	.4byte	0x13505
+	.8byte	.LBB1145
+	.8byte	.LBE1145-.LBB1145
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x1130f
+	.4byte	0x113d1
 	.uleb128 0x54
-	.4byte	0x13447
+	.4byte	0x13515
 	.uleb128 0x56
-	.8byte	.LBB1148
-	.8byte	.LBE1148-.LBB1148
+	.8byte	.LBB1146
+	.8byte	.LBE1146-.LBB1146
 	.uleb128 0x60
-	.4byte	0x13452
-	.4byte	.LLST62
+	.4byte	0x13520
+	.4byte	.LLST64
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x590
-	.4byte	0x112da
+	.4byte	0x1139c
 	.uleb128 0x60
-	.4byte	0x1345e
-	.4byte	.LLST63
+	.4byte	0x1352c
+	.4byte	.LLST65
 	.uleb128 0x5c
-	.4byte	0x13943
-	.8byte	.LBB1150
-	.8byte	.LBE1150-.LBB1150
+	.4byte	0x13a17
+	.8byte	.LBB1148
+	.8byte	.LBE1148-.LBB1148
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x1395e
+	.4byte	0x13a32
 	.uleb128 0x54
-	.4byte	0x13953
+	.4byte	0x13a27
 	.uleb128 0x56
-	.8byte	.LBB1151
-	.8byte	.LBE1151-.LBB1151
+	.8byte	.LBB1149
+	.8byte	.LBE1149-.LBB1149
 	.uleb128 0x57
-	.4byte	0x13969
+	.4byte	0x13a3d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x138bf
-	.8byte	.LBB1152
-	.8byte	.LBE1152-.LBB1152
+	.4byte	0x13992
+	.8byte	.LBB1150
+	.8byte	.LBE1150-.LBB1150
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB1153
-	.8byte	.LBE1153-.LBB1153
+	.8byte	.LBB1151
+	.8byte	.LBE1151-.LBB1151
 	.uleb128 0x60
-	.4byte	0x138cf
-	.4byte	.LLST64
+	.4byte	0x139a2
+	.4byte	.LLST66
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL240
-	.4byte	0x14562
+	.8byte	.LVL244
+	.4byte	0x14666
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13370
-	.8byte	.LBB1164
+	.4byte	0x1343e
+	.8byte	.LBB1162
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
-	.2byte	0x6f9
-	.4byte	0x1153e
+	.2byte	0x6fb
+	.4byte	0x11600
 	.uleb128 0x54
-	.4byte	0x13395
+	.4byte	0x13463
 	.uleb128 0x54
-	.4byte	0x1338a
+	.4byte	0x13458
 	.uleb128 0x54
-	.4byte	0x13380
+	.4byte	0x1344e
 	.uleb128 0x6d
-	.4byte	0x133ce
-	.8byte	.LBB1165
+	.4byte	0x1349c
+	.8byte	.LBB1163
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x133f3
+	.4byte	0x134c1
 	.uleb128 0x54
-	.4byte	0x133e8
+	.4byte	0x134b6
 	.uleb128 0x54
-	.4byte	0x133de
+	.4byte	0x134ac
 	.uleb128 0x6e
-	.4byte	0x1346b
-	.8byte	.LBB1167
+	.4byte	0x13539
+	.8byte	.LBB1165
 	.4byte	.Ldebug_ranges0+0x620
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x11474
+	.4byte	0x11536
 	.uleb128 0x54
-	.4byte	0x13486
+	.4byte	0x13554
 	.uleb128 0x6f
-	.4byte	0x1347b
-	.4byte	.LLST65
+	.4byte	0x13549
+	.4byte	.LLST67
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x620
 	.uleb128 0x60
-	.4byte	0x13491
-	.4byte	.LLST66
+	.4byte	0x1355f
+	.4byte	.LLST68
 	.uleb128 0x60
-	.4byte	0x1349c
-	.4byte	.LLST67
+	.4byte	0x1356a
+	.4byte	.LLST69
 	.uleb128 0x70
-	.4byte	0x138bf
-	.8byte	.LBB1169
-	.8byte	.LBE1169-.LBB1169
+	.4byte	0x13992
+	.8byte	.LBB1167
+	.8byte	.LBE1167-.LBB1167
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x113da
+	.4byte	0x1149c
 	.uleb128 0x56
-	.8byte	.LBB1170
-	.8byte	.LBE1170-.LBB1170
+	.8byte	.LBB1168
+	.8byte	.LBE1168-.LBB1168
 	.uleb128 0x60
-	.4byte	0x138cf
-	.4byte	.LLST68
+	.4byte	0x139a2
+	.4byte	.LLST70
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1171
-	.8byte	.LBE1171-.LBB1171
-	.4byte	0x1142e
+	.8byte	.LBB1169
+	.8byte	.LBE1169-.LBB1169
+	.4byte	0x114f0
 	.uleb128 0x57
-	.4byte	0x134a8
+	.4byte	0x13576
 	.uleb128 0x5c
-	.4byte	0x13943
-	.8byte	.LBB1172
-	.8byte	.LBE1172-.LBB1172
+	.4byte	0x13a17
+	.8byte	.LBB1170
+	.8byte	.LBE1170-.LBB1170
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x1395e
+	.4byte	0x13a32
 	.uleb128 0x54
-	.4byte	0x13953
+	.4byte	0x13a27
 	.uleb128 0x56
-	.8byte	.LBB1173
-	.8byte	.LBE1173-.LBB1173
+	.8byte	.LBB1171
+	.8byte	.LBE1171-.LBB1171
 	.uleb128 0x57
-	.4byte	0x13969
+	.4byte	0x13a3d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13893
-	.8byte	.LBB1174
-	.8byte	.LBE1174-.LBB1174
+	.4byte	0x13966
+	.8byte	.LBB1172
+	.8byte	.LBE1172-.LBB1172
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x138ad
+	.4byte	0x13980
 	.uleb128 0x54
-	.4byte	0x138a3
+	.4byte	0x13976
 	.uleb128 0x5c
-	.4byte	0x139cb
-	.8byte	.LBB1175
-	.8byte	.LBE1175-.LBB1175
+	.4byte	0x13a9f
+	.8byte	.LBB1173
+	.8byte	.LBE1173-.LBB1173
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x139e5
+	.4byte	0x13ab9
 	.uleb128 0x54
-	.4byte	0x139db
+	.4byte	0x13aaf
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13437
-	.8byte	.LBB1183
-	.8byte	.LBE1183-.LBB1183
+	.4byte	0x13505
+	.8byte	.LBB1181
+	.8byte	.LBE1181-.LBB1181
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x1152f
+	.4byte	0x115f1
 	.uleb128 0x54
-	.4byte	0x13447
+	.4byte	0x13515
 	.uleb128 0x56
-	.8byte	.LBB1184
-	.8byte	.LBE1184-.LBB1184
+	.8byte	.LBB1182
+	.8byte	.LBE1182-.LBB1182
 	.uleb128 0x60
-	.4byte	0x13452
-	.4byte	.LLST69
+	.4byte	0x13520
+	.4byte	.LLST71
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x670
-	.4byte	0x114fa
+	.4byte	0x115bc
 	.uleb128 0x60
-	.4byte	0x1345e
-	.4byte	.LLST70
+	.4byte	0x1352c
+	.4byte	.LLST72
 	.uleb128 0x5c
-	.4byte	0x13943
-	.8byte	.LBB1186
-	.8byte	.LBE1186-.LBB1186
+	.4byte	0x13a17
+	.8byte	.LBB1184
+	.8byte	.LBE1184-.LBB1184
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x1395e
+	.4byte	0x13a32
 	.uleb128 0x54
-	.4byte	0x13953
+	.4byte	0x13a27
 	.uleb128 0x56
-	.8byte	.LBB1187
-	.8byte	.LBE1187-.LBB1187
+	.8byte	.LBB1185
+	.8byte	.LBE1185-.LBB1185
 	.uleb128 0x57
-	.4byte	0x13969
+	.4byte	0x13a3d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x138bf
-	.8byte	.LBB1188
-	.8byte	.LBE1188-.LBB1188
+	.4byte	0x13992
+	.8byte	.LBB1186
+	.8byte	.LBE1186-.LBB1186
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB1189
-	.8byte	.LBE1189-.LBB1189
+	.8byte	.LBB1187
+	.8byte	.LBE1187-.LBB1187
 	.uleb128 0x60
-	.4byte	0x138cf
-	.4byte	.LLST71
+	.4byte	0x139a2
+	.4byte	.LLST73
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL248
-	.4byte	0x14562
+	.8byte	.LVL252
+	.4byte	0x14666
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL81
-	.4byte	0x14417
-	.uleb128 0x4e
-	.8byte	.LVL82
-	.4byte	0x14479
-	.uleb128 0x4e
-	.8byte	.LVL83
-	.4byte	0x14517
+	.8byte	.LVL85
+	.4byte	0x1451b
 	.uleb128 0x4e
-	.8byte	.LVL94
-	.4byte	0x1457c
+	.8byte	.LVL86
+	.4byte	0x1457d
 	.uleb128 0x4e
-	.8byte	.LVL97
-	.4byte	0x143a8
+	.8byte	.LVL87
+	.4byte	0x14628
 	.uleb128 0x4e
-	.8byte	.LVL100
-	.4byte	0x1432e
+	.8byte	.LVL98
+	.4byte	0x14680
 	.uleb128 0x4e
-	.8byte	.LVL117
-	.4byte	0x14517
+	.8byte	.LVL101
+	.4byte	0x144ac
 	.uleb128 0x4e
-	.8byte	.LVL118
-	.4byte	0x14588
+	.8byte	.LVL104
+	.4byte	0x14432
 	.uleb128 0x4e
-	.8byte	.LVL120
-	.4byte	0x14423
+	.8byte	.LVL121
+	.4byte	0x14628
 	.uleb128 0x4e
-	.8byte	.LVL127
-	.4byte	0x14417
+	.8byte	.LVL122
+	.4byte	0x1468c
 	.uleb128 0x4e
-	.8byte	.LVL141
-	.4byte	0x14594
+	.8byte	.LVL124
+	.4byte	0x14527
 	.uleb128 0x4e
-	.8byte	.LVL142
-	.4byte	0x14423
+	.8byte	.LVL131
+	.4byte	0x1451b
 	.uleb128 0x4e
-	.8byte	.LVL143
-	.4byte	0x1446d
+	.8byte	.LVL145
+	.4byte	0x14698
 	.uleb128 0x4e
-	.8byte	.LVL153
-	.4byte	0x145a0
+	.8byte	.LVL146
+	.4byte	0x14527
 	.uleb128 0x4e
-	.8byte	.LVL154
-	.4byte	0x14517
+	.8byte	.LVL147
+	.4byte	0x14571
 	.uleb128 0x4e
-	.8byte	.LVL181
-	.4byte	0x1432e
+	.8byte	.LVL157
+	.4byte	0x146a4
 	.uleb128 0x4e
-	.8byte	.LVL184
-	.4byte	0x1432e
+	.8byte	.LVL158
+	.4byte	0x14628
 	.uleb128 0x4e
-	.8byte	.LVL186
-	.4byte	0x14417
+	.8byte	.LVL185
+	.4byte	0x14432
 	.uleb128 0x4e
 	.8byte	.LVL188
-	.4byte	0x14417
-	.uleb128 0x4e
-	.8byte	.LVL189
-	.4byte	0x14479
+	.4byte	0x14432
 	.uleb128 0x4e
 	.8byte	.LVL190
-	.4byte	0x14517
+	.4byte	0x1451b
 	.uleb128 0x4e
-	.8byte	.LVL203
-	.4byte	0x143a8
+	.8byte	.LVL192
+	.4byte	0x1451b
 	.uleb128 0x4e
-	.8byte	.LVL206
-	.4byte	0x143a8
+	.8byte	.LVL193
+	.4byte	0x1457d
 	.uleb128 0x4e
-	.8byte	.LVL208
-	.4byte	0x14417
+	.8byte	.LVL194
+	.4byte	0x14628
 	.uleb128 0x4e
-	.8byte	.LVL209
-	.4byte	0x14517
+	.8byte	.LVL207
+	.4byte	0x144ac
 	.uleb128 0x4e
-	.8byte	.LVL217
-	.4byte	0x1457c
+	.8byte	.LVL210
+	.4byte	0x144ac
 	.uleb128 0x4e
-	.8byte	.LVL251
-	.4byte	0x1446d
+	.8byte	.LVL212
+	.4byte	0x1451b
 	.uleb128 0x4e
-	.8byte	.LVL258
-	.4byte	0x143a8
+	.8byte	.LVL213
+	.4byte	0x14628
 	.uleb128 0x4e
-	.8byte	.LVL259
-	.4byte	0x144cf
+	.8byte	.LVL221
+	.4byte	0x14680
+	.uleb128 0x4e
+	.8byte	.LVL255
+	.4byte	0x14571
+	.uleb128 0x4e
+	.8byte	.LVL262
+	.4byte	0x144ac
+	.uleb128 0x4e
+	.8byte	.LVL263
+	.4byte	0x145d3
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0x116c8
+	.4byte	0x1178a
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xa
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x116b8
+	.4byte	0x1177a
 	.uleb128 0x63
-	.4byte	.LASF3070
+	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x680
+	.2byte	0x682
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x116f7
+	.4byte	0x117b9
 	.uleb128 0x65
-	.4byte	.LASF3000
+	.4byte	.LASF3002
 	.byte	0x1
-	.2byte	0x680
+	.2byte	0x682
 	.4byte	0xe160
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x682
+	.2byte	0x684
 	.4byte	0xa570
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3072
+	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x67a
+	.2byte	0x67c
 	.8byte	.LFB2829
 	.8byte	.LFE2829-.LFB2829
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11731
+	.4byte	0x117f3
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x67a
+	.2byte	0x67c
 	.4byte	0x31d2
-	.4byte	.LLST72
+	.4byte	.LLST74
 	.uleb128 0x4e
-	.8byte	.LVL272
-	.4byte	0x1217a
+	.8byte	.LVL276
+	.4byte	0x1223c
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3073
+	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0x66e
+	.2byte	0x670
 	.8byte	.LFB2828
 	.8byte	.LFE2828-.LFB2828
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11791
+	.4byte	0x11853
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x66e
+	.2byte	0x670
 	.4byte	0x31d2
 	.4byte	.LLST12
 	.uleb128 0x46
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x670
-	.4byte	0xe763
+	.2byte	0x672
+	.4byte	0xe7a7
 	.uleb128 0x5f
-	.4byte	0x13302
-	.8byte	.LBB944
+	.4byte	0x133cd
+	.8byte	.LBB942
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.2byte	0x674
+	.2byte	0x676
 	.uleb128 0x54
-	.4byte	0x1330e
+	.4byte	0x133da
 	.uleb128 0x4e
 	.8byte	.LVL71
-	.4byte	0x145ac
+	.4byte	0x146b0
 	.byte	0
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3074
+	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0x65e
+	.2byte	0x660
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x117bb
+	.4byte	0x1187d
 	.uleb128 0x65
-	.4byte	.LASF3000
+	.4byte	.LASF3002
 	.byte	0x1
-	.2byte	0x65e
+	.2byte	0x660
 	.4byte	0xe160
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x660
-	.4byte	0xe439
+	.2byte	0x662
+	.4byte	0xe451
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3075
+	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0x52b
+	.2byte	0x52d
 	.4byte	0xc6
 	.8byte	.LFB2826
 	.8byte	.LFE2826-.LFB2826
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11fa2
+	.4byte	0x12064
 	.uleb128 0x51
 	.string	"ptr"
 	.byte	0x1
-	.2byte	0x52b
+	.2byte	0x52d
 	.4byte	0x458
-	.4byte	.LLST186
+	.4byte	.LLST188
 	.uleb128 0x5a
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x52d
-	.4byte	0xe49e
-	.4byte	.LLST187
+	.2byte	0x52f
+	.4byte	0xe4b6
+	.4byte	.LLST189
 	.uleb128 0x46
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x52e
-	.4byte	0xe763
+	.2byte	0x530
+	.4byte	0xe7a7
 	.uleb128 0x5a
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x52f
-	.4byte	0xe439
-	.4byte	.LLST188
+	.2byte	0x531
+	.4byte	0xe451
+	.4byte	.LLST190
 	.uleb128 0x59
-	.4byte	.LASF3076
+	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0x530
+	.2byte	0x532
 	.4byte	0xc6
-	.4byte	.LLST189
+	.4byte	.LLST191
 	.uleb128 0x59
-	.4byte	.LASF2970
+	.4byte	.LASF2972
 	.byte	0x1
-	.2byte	0x531
+	.2byte	0x533
 	.4byte	0xc6
-	.4byte	.LLST190
+	.4byte	.LLST192
 	.uleb128 0x4c
-	.4byte	.LASF3077
+	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0x532
+	.2byte	0x534
 	.4byte	0xd8ec
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -72
 	.uleb128 0x59
-	.4byte	.LASF3078
+	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0x533
-	.4byte	0xe439
-	.4byte	.LLST191
+	.2byte	0x535
+	.4byte	0xe451
+	.4byte	.LLST193
 	.uleb128 0x6b
-	.4byte	.LASF3080
+	.4byte	.LASF3085
 	.byte	0x1
-	.2byte	0x62e
-	.8byte	.L801
+	.2byte	0x630
+	.8byte	.L806
 	.uleb128 0x62
-	.4byte	.Ldebug_ranges0+0x1100
-	.4byte	0x1190b
+	.4byte	.Ldebug_ranges0+0x1130
+	.4byte	0x119cd
 	.uleb128 0x46
-	.4byte	.LASF3067
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x574
+	.2byte	0x576
 	.4byte	0xc6
 	.uleb128 0x56
 	.8byte	.LBB1824
 	.8byte	.LBE1824-.LBB1824
 	.uleb128 0x6b
-	.4byte	.LASF3079
+	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0x574
-	.8byte	.L784
+	.2byte	0x576
+	.8byte	.L789
 	.uleb128 0x4c
-	.4byte	.LASF3068
+	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0x574
+	.2byte	0x576
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3067
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x574
+	.2byte	0x576
 	.4byte	0x199
 	.uleb128 0x62
-	.4byte	.Ldebug_ranges0+0x1130
-	.4byte	0x118ef
+	.4byte	.Ldebug_ranges0+0x1160
+	.4byte	0x119b1
 	.uleb128 0x59
-	.4byte	.LASF3069
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x574
+	.2byte	0x576
 	.4byte	0x199
-	.4byte	.LLST205
+	.4byte	.LLST207
 	.uleb128 0x4e
-	.8byte	.LVL887
-	.4byte	0x14530
+	.8byte	.LVL892
+	.4byte	0x14634
 	.uleb128 0x4e
-	.8byte	.LVL888
-	.4byte	0x1453c
+	.8byte	.LVL893
+	.4byte	0x14640
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL885
-	.4byte	0x14549
+	.8byte	.LVL890
+	.4byte	0x1464d
 	.uleb128 0x4e
-	.8byte	.LVL889
-	.4byte	0x14555
+	.8byte	.LVL894
+	.4byte	0x14659
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.Ldebug_ranges0+0x10a0
-	.4byte	0x119ad
+	.4byte	.Ldebug_ranges0+0x10d0
+	.4byte	0x11a6f
 	.uleb128 0x46
-	.4byte	.LASF3067
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x61a
+	.2byte	0x61c
 	.4byte	0xc6
 	.uleb128 0x56
 	.8byte	.LBB1820
 	.8byte	.LBE1820-.LBB1820
 	.uleb128 0x6b
-	.4byte	.LASF3079
+	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0x61a
-	.8byte	.L838
+	.2byte	0x61c
+	.8byte	.L843
 	.uleb128 0x4c
-	.4byte	.LASF3068
+	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0x61a
+	.2byte	0x61c
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3067
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x61a
+	.2byte	0x61c
 	.4byte	0x199
 	.uleb128 0x62
-	.4byte	.Ldebug_ranges0+0x10d0
-	.4byte	0x11991
+	.4byte	.Ldebug_ranges0+0x1100
+	.4byte	0x11a53
 	.uleb128 0x59
-	.4byte	.LASF3069
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x61a
+	.2byte	0x61c
 	.4byte	0x199
-	.4byte	.LLST204
+	.4byte	.LLST206
 	.uleb128 0x4e
-	.8byte	.LVL880
-	.4byte	0x14530
+	.8byte	.LVL885
+	.4byte	0x14634
 	.uleb128 0x4e
-	.8byte	.LVL881
-	.4byte	0x1453c
+	.8byte	.LVL886
+	.4byte	0x14640
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL878
-	.4byte	0x14549
+	.8byte	.LVL883
+	.4byte	0x1464d
 	.uleb128 0x4e
-	.8byte	.LVL882
-	.4byte	0x14555
+	.8byte	.LVL887
+	.4byte	0x14659
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1806
 	.8byte	.LBE1806-.LBB1806
-	.4byte	0x11a5f
+	.4byte	0x11b21
 	.uleb128 0x46
-	.4byte	.LASF3067
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x64a
+	.2byte	0x64c
 	.4byte	0xc6
 	.uleb128 0x56
 	.8byte	.LBB1807
 	.8byte	.LBE1807-.LBB1807
 	.uleb128 0x72
-	.4byte	.LASF3079
+	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0x64a
+	.2byte	0x64c
 	.uleb128 0x4c
-	.4byte	.LASF3068
+	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0x64a
+	.2byte	0x64c
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3067
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x64a
+	.2byte	0x64c
 	.4byte	0x199
 	.uleb128 0x6c
 	.8byte	.LBB1808
 	.8byte	.LBE1808-.LBB1808
-	.4byte	0x11a43
+	.4byte	0x11b05
 	.uleb128 0x59
-	.4byte	.LASF3069
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x64a
+	.2byte	0x64c
 	.4byte	0x199
-	.4byte	.LLST193
+	.4byte	.LLST195
 	.uleb128 0x4e
-	.8byte	.LVL811
-	.4byte	0x14530
+	.8byte	.LVL816
+	.4byte	0x14634
 	.uleb128 0x4e
-	.8byte	.LVL812
-	.4byte	0x1453c
+	.8byte	.LVL817
+	.4byte	0x14640
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL809
-	.4byte	0x14549
+	.8byte	.LVL814
+	.4byte	0x1464d
 	.uleb128 0x4e
-	.8byte	.LVL813
-	.4byte	0x14555
+	.8byte	.LVL818
+	.4byte	0x14659
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.Ldebug_ranges0+0xf80
-	.4byte	0x11af5
+	.4byte	.Ldebug_ranges0+0xfb0
+	.4byte	0x11bb7
 	.uleb128 0x46
-	.4byte	.LASF3067
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x656
+	.2byte	0x658
 	.4byte	0xc6
 	.uleb128 0x5e
-	.4byte	.Ldebug_ranges0+0xf80
+	.4byte	.Ldebug_ranges0+0xfb0
 	.uleb128 0x6b
-	.4byte	.LASF3079
+	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0x656
-	.8byte	.L854
+	.2byte	0x658
+	.8byte	.L859
 	.uleb128 0x4c
-	.4byte	.LASF3068
+	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0x656
+	.2byte	0x658
 	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3067
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x656
+	.2byte	0x658
 	.4byte	0x199
 	.uleb128 0x62
-	.4byte	.Ldebug_ranges0+0xfc0
-	.4byte	0x11ad9
+	.4byte	.Ldebug_ranges0+0xff0
+	.4byte	0x11b9b
 	.uleb128 0x59
-	.4byte	.LASF3069
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x656
+	.2byte	0x658
 	.4byte	0x199
-	.4byte	.LLST192
+	.4byte	.LLST194
 	.uleb128 0x4e
-	.8byte	.LVL783
-	.4byte	0x14530
+	.8byte	.LVL788
+	.4byte	0x14634
 	.uleb128 0x4e
-	.8byte	.LVL784
-	.4byte	0x1453c
+	.8byte	.LVL789
+	.4byte	0x14640
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL781
-	.4byte	0x14549
+	.8byte	.LVL786
+	.4byte	0x1464d
 	.uleb128 0x4e
-	.8byte	.LVL785
-	.4byte	0x14555
+	.8byte	.LVL790
+	.4byte	0x14659
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x11fa2
+	.4byte	0x12064
 	.8byte	.LBB1800
-	.4byte	.Ldebug_ranges0+0x1000
+	.4byte	.Ldebug_ranges0+0x1030
 	.byte	0x1
-	.2byte	0x5ef
-	.4byte	0x11b46
+	.2byte	0x5f1
+	.4byte	0x11c08
 	.uleb128 0x54
-	.4byte	0x11fcb
+	.4byte	0x1208d
 	.uleb128 0x54
-	.4byte	0x11fbf
+	.4byte	0x12081
 	.uleb128 0x54
-	.4byte	0x11fb3
+	.4byte	0x12075
 	.uleb128 0x5e
-	.4byte	.Ldebug_ranges0+0x1000
+	.4byte	.Ldebug_ranges0+0x1030
 	.uleb128 0x57
-	.4byte	0x11fd7
+	.4byte	0x12099
 	.uleb128 0x57
-	.4byte	0x11fe1
+	.4byte	0x120a3
 	.uleb128 0x57
-	.4byte	0x11fed
+	.4byte	0x120af
 	.uleb128 0x57
-	.4byte	0x11ff9
+	.4byte	0x120bb
 	.uleb128 0x57
-	.4byte	0x12005
+	.4byte	0x120c7
 	.uleb128 0x57
-	.4byte	0x12011
+	.4byte	0x120d3
 	.uleb128 0x73
-	.4byte	0x1201d
+	.4byte	0x120df
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13008
+	.4byte	0x130ca
 	.8byte	.LBB1809
 	.8byte	.LBE1809-.LBB1809
 	.byte	0x1
-	.2byte	0x653
-	.4byte	0x11b91
+	.2byte	0x655
+	.4byte	0x11c53
 	.uleb128 0x54
-	.4byte	0x13023
+	.4byte	0x130e5
 	.uleb128 0x54
-	.4byte	0x13018
+	.4byte	0x130da
 	.uleb128 0x56
 	.8byte	.LBB1810
 	.8byte	.LBE1810-.LBB1810
 	.uleb128 0x57
-	.4byte	0x1302e
+	.4byte	0x130f0
 	.uleb128 0x4e
-	.8byte	.LVL814
-	.4byte	0x141a6
+	.8byte	.LVL819
+	.4byte	0x142aa
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x12cae
+	.4byte	0x12d70
 	.8byte	.LBB1811
-	.4byte	.Ldebug_ranges0+0x1040
+	.4byte	.Ldebug_ranges0+0x1070
 	.byte	0x1
-	.2byte	0x591
-	.4byte	0x11c57
+	.2byte	0x593
+	.4byte	0x11d19
 	.uleb128 0x54
-	.4byte	0x12ceb
+	.4byte	0x12dad
 	.uleb128 0x54
-	.4byte	0x12ceb
+	.4byte	0x12dad
 	.uleb128 0x54
-	.4byte	0x12ceb
+	.4byte	0x12dad
 	.uleb128 0x54
-	.4byte	0x12cf7
+	.4byte	0x12db9
 	.uleb128 0x54
-	.4byte	0x12cdf
+	.4byte	0x12da1
 	.uleb128 0x54
-	.4byte	0x12cd3
+	.4byte	0x12d95
 	.uleb128 0x54
-	.4byte	0x12cc7
+	.4byte	0x12d89
 	.uleb128 0x54
-	.4byte	0x12cbb
+	.4byte	0x12d7d
 	.uleb128 0x5e
-	.4byte	.Ldebug_ranges0+0x1040
+	.4byte	.Ldebug_ranges0+0x1070
 	.uleb128 0x57
-	.4byte	0x12d03
+	.4byte	0x12dc5
 	.uleb128 0x60
-	.4byte	0x12d0f
-	.4byte	.LLST194
+	.4byte	0x12dd1
+	.4byte	.LLST196
 	.uleb128 0x57
-	.4byte	0x12d1b
+	.4byte	0x12ddd
 	.uleb128 0x60
-	.4byte	0x12d27
-	.4byte	.LLST195
+	.4byte	0x12de9
+	.4byte	.LLST197
 	.uleb128 0x60
-	.4byte	0x12d33
-	.4byte	.LLST196
+	.4byte	0x12df5
+	.4byte	.LLST198
 	.uleb128 0x57
-	.4byte	0x12d3f
+	.4byte	0x12e01
 	.uleb128 0x57
-	.4byte	0x12d4b
+	.4byte	0x12e0d
 	.uleb128 0x57
-	.4byte	0x12d57
+	.4byte	0x12e19
 	.uleb128 0x60
-	.4byte	0x12d63
-	.4byte	.LLST197
+	.4byte	0x12e25
+	.4byte	.LLST199
 	.uleb128 0x57
-	.4byte	0x12d6f
+	.4byte	0x12e31
 	.uleb128 0x60
-	.4byte	0x12d7b
-	.4byte	.LLST198
+	.4byte	0x12e3d
+	.4byte	.LLST200
 	.uleb128 0x61
-	.4byte	0x12d87
+	.4byte	0x12e49
 	.uleb128 0x1
 	.byte	0x5e
 	.uleb128 0x60
-	.4byte	0x12d91
-	.4byte	.LLST199
-	.uleb128 0x60
-	.4byte	0x12d9b
-	.4byte	.LLST200
-	.uleb128 0x60
-	.4byte	0x12da7
+	.4byte	0x12e53
 	.4byte	.LLST201
 	.uleb128 0x60
-	.4byte	0x12db3
+	.4byte	0x12e5d
 	.4byte	.LLST202
 	.uleb128 0x60
-	.4byte	0x12dbf
+	.4byte	0x12e69
 	.4byte	.LLST203
+	.uleb128 0x60
+	.4byte	0x12e75
+	.4byte	.LLST204
+	.uleb128 0x60
+	.4byte	0x12e81
+	.4byte	.LLST205
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13008
+	.4byte	0x130ca
 	.8byte	.LBB1831
 	.8byte	.LBE1831-.LBB1831
 	.byte	0x1
-	.2byte	0x538
-	.4byte	0x11ca2
+	.2byte	0x53a
+	.4byte	0x11d64
 	.uleb128 0x54
-	.4byte	0x13023
+	.4byte	0x130e5
 	.uleb128 0x54
-	.4byte	0x13018
+	.4byte	0x130da
 	.uleb128 0x56
 	.8byte	.LBB1832
 	.8byte	.LBE1832-.LBB1832
 	.uleb128 0x57
-	.4byte	0x1302e
+	.4byte	0x130f0
 	.uleb128 0x4e
-	.8byte	.LVL902
-	.4byte	0x141a6
+	.8byte	.LVL907
+	.4byte	0x142aa
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL760
-	.4byte	0x145b8
-	.uleb128 0x4e
-	.8byte	.LVL761
-	.4byte	0x1432e
-	.uleb128 0x4e
-	.8byte	.LVL763
-	.4byte	0x1440b
-	.uleb128 0x4e
-	.8byte	.LVL764
-	.4byte	0x1432e
-	.uleb128 0x4e
 	.8byte	.LVL765
-	.4byte	0x145c4
+	.4byte	0x146bc
 	.uleb128 0x4e
 	.8byte	.LVL766
-	.4byte	0x14479
-	.uleb128 0x4e
-	.8byte	.LVL767
-	.4byte	0x14479
+	.4byte	0x14432
 	.uleb128 0x4e
 	.8byte	.LVL768
-	.4byte	0x145d0
+	.4byte	0x1450f
 	.uleb128 0x4e
-	.8byte	.LVL770
-	.4byte	0x145dc
+	.8byte	.LVL769
+	.4byte	0x14432
 	.uleb128 0x4e
-	.8byte	.LVL789
-	.4byte	0x143a8
+	.8byte	.LVL770
+	.4byte	0x146c8
 	.uleb128 0x4e
-	.8byte	.LVL791
-	.4byte	0x145dc
+	.8byte	.LVL771
+	.4byte	0x1457d
 	.uleb128 0x4e
-	.8byte	.LVL792
-	.4byte	0x1457c
+	.8byte	.LVL772
+	.4byte	0x1457d
 	.uleb128 0x4e
-	.8byte	.LVL796
-	.4byte	0x1432e
+	.8byte	.LVL773
+	.4byte	0x146d4
 	.uleb128 0x4e
-	.8byte	.LVL799
-	.4byte	0x1432e
+	.8byte	.LVL775
+	.4byte	0x146e0
 	.uleb128 0x4e
-	.8byte	.LVL800
-	.4byte	0x1446d
+	.8byte	.LVL794
+	.4byte	0x144ac
 	.uleb128 0x4e
-	.8byte	.LVL801
-	.4byte	0x145dc
+	.8byte	.LVL796
+	.4byte	0x146e0
 	.uleb128 0x4e
-	.8byte	.LVL803
-	.4byte	0x1457c
+	.8byte	.LVL797
+	.4byte	0x14680
 	.uleb128 0x4e
-	.8byte	.LVL806
-	.4byte	0x12026
+	.8byte	.LVL801
+	.4byte	0x14432
 	.uleb128 0x4e
-	.8byte	.LVL807
-	.4byte	0x143a8
+	.8byte	.LVL804
+	.4byte	0x14432
 	.uleb128 0x4e
-	.8byte	.LVL818
-	.4byte	0x145c4
+	.8byte	.LVL805
+	.4byte	0x14571
 	.uleb128 0x4e
-	.8byte	.LVL819
-	.4byte	0x14479
+	.8byte	.LVL806
+	.4byte	0x146e0
 	.uleb128 0x4e
-	.8byte	.LVL820
-	.4byte	0x145dc
+	.8byte	.LVL808
+	.4byte	0x14680
 	.uleb128 0x4e
-	.8byte	.LVL821
-	.4byte	0x1457c
+	.8byte	.LVL811
+	.4byte	0x120e8
 	.uleb128 0x4e
-	.8byte	.LVL822
-	.4byte	0x12f23
+	.8byte	.LVL812
+	.4byte	0x144ac
 	.uleb128 0x4e
 	.8byte	.LVL823
-	.4byte	0x145d0
+	.4byte	0x146c8
 	.uleb128 0x4e
 	.8byte	.LVL824
-	.4byte	0x1432e
+	.4byte	0x1457d
 	.uleb128 0x4e
 	.8byte	.LVL825
-	.4byte	0x12414
+	.4byte	0x146e0
 	.uleb128 0x4e
 	.8byte	.LVL826
-	.4byte	0x145c4
+	.4byte	0x14680
 	.uleb128 0x4e
 	.8byte	.LVL827
-	.4byte	0x14479
+	.4byte	0x12fe5
 	.uleb128 0x4e
 	.8byte	.LVL828
-	.4byte	0x14479
+	.4byte	0x146d4
 	.uleb128 0x4e
 	.8byte	.LVL829
-	.4byte	0x14479
+	.4byte	0x14432
 	.uleb128 0x4e
-	.8byte	.LVL848
-	.4byte	0x1432e
+	.8byte	.LVL830
+	.4byte	0x124d6
 	.uleb128 0x4e
-	.8byte	.LVL849
-	.4byte	0x12414
+	.8byte	.LVL831
+	.4byte	0x146c8
 	.uleb128 0x4e
-	.8byte	.LVL850
-	.4byte	0x1440b
+	.8byte	.LVL832
+	.4byte	0x1457d
 	.uleb128 0x4e
-	.8byte	.LVL853
-	.4byte	0x1440b
+	.8byte	.LVL833
+	.4byte	0x1457d
 	.uleb128 0x4e
-	.8byte	.LVL855
-	.4byte	0x14264
+	.8byte	.LVL834
+	.4byte	0x1457d
 	.uleb128 0x4e
-	.8byte	.LVL856
-	.4byte	0x1432e
+	.8byte	.LVL853
+	.4byte	0x14432
 	.uleb128 0x4e
-	.8byte	.LVL857
-	.4byte	0x145dc
+	.8byte	.LVL854
+	.4byte	0x124d6
+	.uleb128 0x4e
+	.8byte	.LVL855
+	.4byte	0x1450f
 	.uleb128 0x4e
 	.8byte	.LVL858
-	.4byte	0x1457c
+	.4byte	0x1450f
 	.uleb128 0x4e
-	.8byte	.LVL859
-	.4byte	0x12026
+	.8byte	.LVL860
+	.4byte	0x14368
 	.uleb128 0x4e
 	.8byte	.LVL861
-	.4byte	0x1432e
+	.4byte	0x14432
 	.uleb128 0x4e
 	.8byte	.LVL862
-	.4byte	0x12414
+	.4byte	0x146e0
+	.uleb128 0x4e
+	.8byte	.LVL863
+	.4byte	0x14680
 	.uleb128 0x4e
 	.8byte	.LVL864
-	.4byte	0x1432e
+	.4byte	0x120e8
 	.uleb128 0x4e
-	.8byte	.LVL867
-	.4byte	0x1432e
+	.8byte	.LVL866
+	.4byte	0x14432
 	.uleb128 0x4e
-	.8byte	.LVL870
-	.4byte	0x1432e
+	.8byte	.LVL867
+	.4byte	0x124d6
 	.uleb128 0x4e
-	.8byte	.LVL871
-	.4byte	0x145e8
+	.8byte	.LVL869
+	.4byte	0x14432
 	.uleb128 0x4e
 	.8byte	.LVL872
-	.4byte	0x1446d
+	.4byte	0x14432
 	.uleb128 0x4e
 	.8byte	.LVL875
-	.4byte	0x145e8
+	.4byte	0x14432
 	.uleb128 0x4e
 	.8byte	.LVL876
-	.4byte	0x1432e
+	.4byte	0x146ec
 	.uleb128 0x4e
-	.8byte	.LVL883
-	.4byte	0x14479
+	.8byte	.LVL877
+	.4byte	0x14571
 	.uleb128 0x4e
-	.8byte	.LVL896
-	.4byte	0x145d0
+	.8byte	.LVL880
+	.4byte	0x146ec
 	.uleb128 0x4e
-	.8byte	.LVL897
-	.4byte	0x12026
+	.8byte	.LVL881
+	.4byte	0x14432
 	.uleb128 0x4e
-	.8byte	.LVL900
-	.4byte	0x12e5c
+	.8byte	.LVL888
+	.4byte	0x1457d
 	.uleb128 0x4e
-	.8byte	.LVL904
-	.4byte	0x14264
+	.8byte	.LVL901
+	.4byte	0x146d4
 	.uleb128 0x4e
-	.8byte	.LVL905
-	.4byte	0x12026
+	.8byte	.LVL902
+	.4byte	0x120e8
 	.uleb128 0x4e
-	.8byte	.LVL906
-	.4byte	0x143a8
+	.8byte	.LVL905
+	.4byte	0x12f1e
 	.uleb128 0x4e
-	.8byte	.LVL908
-	.4byte	0x14264
+	.8byte	.LVL909
+	.4byte	0x14368
 	.uleb128 0x4e
 	.8byte	.LVL910
-	.4byte	0x14264
+	.4byte	0x120e8
 	.uleb128 0x4e
-	.8byte	.LVL912
-	.4byte	0x144cf
+	.8byte	.LVL911
+	.4byte	0x144ac
+	.uleb128 0x4e
+	.8byte	.LVL913
+	.4byte	0x14368
+	.uleb128 0x4e
+	.8byte	.LVL915
+	.4byte	0x14368
+	.uleb128 0x4e
+	.8byte	.LVL917
+	.4byte	0x145d3
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3081
+	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0x514
+	.2byte	0x516
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x12026
+	.4byte	0x120e8
 	.uleb128 0x65
-	.4byte	.LASF3082
+	.4byte	.LASF3087
 	.byte	0x1
-	.2byte	0x514
+	.2byte	0x516
 	.4byte	0x467e
 	.uleb128 0x65
-	.4byte	.LASF3083
+	.4byte	.LASF3088
 	.byte	0x1
-	.2byte	0x514
+	.2byte	0x516
 	.4byte	0x467e
 	.uleb128 0x65
-	.4byte	.LASF3084
+	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x514
+	.2byte	0x516
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x516
+	.2byte	0x518
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3085
+	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x517
+	.2byte	0x519
 	.4byte	0x15a
 	.uleb128 0x46
-	.4byte	.LASF3086
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x517
+	.2byte	0x519
 	.4byte	0x15a
 	.uleb128 0x46
-	.4byte	.LASF3087
+	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x518
+	.2byte	0x51a
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3088
+	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x519
+	.2byte	0x51b
 	.4byte	0x4684
 	.uleb128 0x46
-	.4byte	.LASF3089
+	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x51a
+	.2byte	0x51c
 	.4byte	0x4684
 	.uleb128 0x72
-	.4byte	.LASF3090
+	.4byte	.LASF3095
 	.byte	0x1
-	.2byte	0x527
+	.2byte	0x529
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3091
+	.4byte	.LASF3096
 	.byte	0x1
-	.2byte	0x4b9
+	.2byte	0x4bb
 	.4byte	0xc6
 	.8byte	.LFB2824
 	.8byte	.LFE2824-.LFB2824
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1217a
+	.4byte	0x1223c
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x4b9
-	.4byte	0xe49e
-	.4byte	.LLST73
+	.2byte	0x4bb
+	.4byte	0xe4b6
+	.4byte	.LLST75
 	.uleb128 0x46
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x4bb
-	.4byte	0xe763
+	.2byte	0x4bd
+	.4byte	0xe7a7
 	.uleb128 0x59
-	.4byte	.LASF3092
+	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x4bc
+	.2byte	0x4be
 	.4byte	0xc6
-	.4byte	.LLST74
+	.4byte	.LLST76
 	.uleb128 0x69
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x4bd
+	.2byte	0x4bf
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x64
 	.uleb128 0x53
-	.4byte	0x1327d
-	.8byte	.LBB1218
-	.8byte	.LBE1218-.LBB1218
+	.4byte	0x13344
+	.8byte	.LBB1216
+	.8byte	.LBE1216-.LBB1216
 	.byte	0x1
-	.2byte	0x4c0
-	.4byte	0x120a9
+	.2byte	0x4c2
+	.4byte	0x1216b
 	.uleb128 0x54
-	.4byte	0x13298
+	.4byte	0x1335f
 	.uleb128 0x54
-	.4byte	0x1328d
+	.4byte	0x13354
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL278
-	.4byte	0x1432e
-	.uleb128 0x4e
-	.8byte	.LVL279
-	.4byte	0x145f4
+	.8byte	.LVL282
+	.4byte	0x14432
 	.uleb128 0x4e
 	.8byte	.LVL283
-	.4byte	0x143a8
-	.uleb128 0x4e
-	.8byte	.LVL284
-	.4byte	0x1432e
-	.uleb128 0x4e
-	.8byte	.LVL286
-	.4byte	0x145f4
+	.4byte	0x146f8
 	.uleb128 0x4e
 	.8byte	.LVL287
-	.4byte	0x143a8
+	.4byte	0x144ac
 	.uleb128 0x4e
 	.8byte	.LVL288
-	.4byte	0x145f4
-	.uleb128 0x4e
-	.8byte	.LVL289
-	.4byte	0x145f4
+	.4byte	0x14432
 	.uleb128 0x4e
 	.8byte	.LVL290
-	.4byte	0x145f4
+	.4byte	0x146f8
 	.uleb128 0x4e
 	.8byte	.LVL291
-	.4byte	0x145f4
+	.4byte	0x144ac
 	.uleb128 0x4e
 	.8byte	.LVL292
-	.4byte	0x145f4
+	.4byte	0x146f8
 	.uleb128 0x4e
 	.8byte	.LVL293
-	.4byte	0x145f4
+	.4byte	0x146f8
 	.uleb128 0x4e
 	.8byte	.LVL294
-	.4byte	0x145f4
+	.4byte	0x146f8
 	.uleb128 0x4e
 	.8byte	.LVL295
-	.4byte	0x145f4
+	.4byte	0x146f8
 	.uleb128 0x4e
 	.8byte	.LVL296
-	.4byte	0x1432e
+	.4byte	0x146f8
 	.uleb128 0x4e
 	.8byte	.LVL297
-	.4byte	0x144cf
+	.4byte	0x146f8
+	.uleb128 0x4e
+	.8byte	.LVL298
+	.4byte	0x146f8
+	.uleb128 0x4e
+	.8byte	.LVL299
+	.4byte	0x146f8
+	.uleb128 0x4e
+	.8byte	.LVL300
+	.4byte	0x14432
+	.uleb128 0x4e
+	.8byte	.LVL301
+	.4byte	0x145d3
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3093
+	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x494
+	.2byte	0x496
 	.8byte	.LFB2823
 	.8byte	.LFE2823-.LFB2823
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12233
+	.4byte	0x122f5
 	.uleb128 0x46
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x496
-	.4byte	0xe763
+	.2byte	0x498
+	.4byte	0xe7a7
 	.uleb128 0x46
-	.4byte	.LASF3000
+	.4byte	.LASF3002
 	.byte	0x1
-	.2byte	0x497
+	.2byte	0x499
 	.4byte	0xe160
 	.uleb128 0x4e
-	.8byte	.LVL261
-	.4byte	0x143d9
-	.uleb128 0x4e
-	.8byte	.LVL262
-	.4byte	0x1432e
-	.uleb128 0x4e
-	.8byte	.LVL263
-	.4byte	0x1446d
-	.uleb128 0x4e
-	.8byte	.LVL264
-	.4byte	0x1446d
-	.uleb128 0x4e
 	.8byte	.LVL265
-	.4byte	0x1432e
+	.4byte	0x144dd
 	.uleb128 0x4e
 	.8byte	.LVL266
-	.4byte	0x14392
+	.4byte	0x14432
 	.uleb128 0x4e
 	.8byte	.LVL267
-	.4byte	0x1440b
+	.4byte	0x14571
 	.uleb128 0x4e
 	.8byte	.LVL268
-	.4byte	0x1446d
+	.4byte	0x14571
 	.uleb128 0x4e
 	.8byte	.LVL269
-	.4byte	0x1446d
+	.4byte	0x14432
 	.uleb128 0x4e
 	.8byte	.LVL270
-	.4byte	0x143d9
+	.4byte	0x14496
+	.uleb128 0x4e
+	.8byte	.LVL271
+	.4byte	0x1450f
+	.uleb128 0x4e
+	.8byte	.LVL272
+	.4byte	0x14571
+	.uleb128 0x4e
+	.8byte	.LVL273
+	.4byte	0x14571
+	.uleb128 0x4e
+	.8byte	.LVL274
+	.4byte	0x144dd
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3094
+	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x44c
+	.2byte	0x44e
 	.4byte	0xc6
 	.8byte	.LFB2822
 	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12404
+	.4byte	0x124c6
 	.uleb128 0x58
 	.4byte	.LASF794
 	.byte	0x1
-	.2byte	0x44c
+	.2byte	0x44e
 	.4byte	0x458
-	.4byte	.LLST143
+	.4byte	.LLST145
 	.uleb128 0x69
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x44e
-	.4byte	0xe49e
+	.2byte	0x450
+	.4byte	0xe4b6
 	.uleb128 0x1
 	.byte	0x66
 	.uleb128 0x46
-	.4byte	.LASF3000
+	.4byte	.LASF3002
 	.byte	0x1
-	.2byte	0x44f
+	.2byte	0x451
 	.4byte	0xe160
 	.uleb128 0x46
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x450
-	.4byte	0xe763
+	.2byte	0x452
+	.4byte	0xe7a7
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0xb30
-	.4byte	0x1231d
+	.4byte	0x123df
 	.uleb128 0x3f
 	.byte	0x8
 	.byte	0x1
-	.2byte	0x457
-	.4byte	0x122b6
+	.2byte	0x459
+	.4byte	0x12378
 	.uleb128 0x41
-	.4byte	.LASF3095
+	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x457
+	.2byte	0x459
 	.4byte	0x1a0
 	.uleb128 0x3d
 	.string	"__c"
 	.byte	0x1
-	.2byte	0x457
-	.4byte	0x12404
+	.2byte	0x459
+	.4byte	0x124c6
 	.byte	0
 	.uleb128 0x52
 	.string	"__u"
 	.byte	0x1
-	.2byte	0x457
-	.4byte	0x12294
+	.2byte	0x459
+	.4byte	0x12356
 	.uleb128 0x5b
-	.4byte	0x13ab5
-	.8byte	.LBB1402
+	.4byte	0x13b8c
+	.8byte	.LBB1400
 	.4byte	.Ldebug_ranges0+0xb70
 	.byte	0x1
-	.2byte	0x457
-	.4byte	0x122ea
+	.2byte	0x459
+	.4byte	0x123ac
 	.uleb128 0x54
-	.4byte	0x13ad8
+	.4byte	0x13baf
 	.uleb128 0x54
-	.4byte	0x13acc
+	.4byte	0x13ba3
 	.uleb128 0x54
-	.4byte	0x13ac2
+	.4byte	0x13b99
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x138bf
-	.8byte	.LBB1405
-	.8byte	.LBE1405-.LBB1405
+	.4byte	0x13992
+	.8byte	.LBB1403
+	.8byte	.LBE1403-.LBB1403
 	.byte	0x1
-	.2byte	0x457
+	.2byte	0x459
 	.uleb128 0x56
-	.8byte	.LBB1406
-	.8byte	.LBE1406-.LBB1406
+	.8byte	.LBB1404
+	.8byte	.LBE1404-.LBB1404
 	.uleb128 0x61
-	.4byte	0x138cf
+	.4byte	0x139a2
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13759
-	.8byte	.LBB1410
+	.4byte	0x13829
+	.8byte	.LBB1408
 	.4byte	.Ldebug_ranges0+0xba0
 	.byte	0x1
-	.2byte	0x48b
-	.4byte	0x12374
+	.2byte	0x48d
+	.4byte	0x12436
 	.uleb128 0x54
-	.4byte	0x1376a
+	.4byte	0x1383a
 	.uleb128 0x5f
-	.4byte	0x13777
-	.8byte	.LBB1412
+	.4byte	0x13847
+	.8byte	.LBB1410
 	.4byte	.Ldebug_ranges0+0xbd0
 	.byte	0xd
 	.2byte	0x240
 	.uleb128 0x54
-	.4byte	0x13793
+	.4byte	0x13863
 	.uleb128 0x54
-	.4byte	0x13788
+	.4byte	0x13858
 	.uleb128 0x4e
-	.8byte	.LVL495
-	.4byte	0x14600
+	.8byte	.LVL499
+	.4byte	0x14704
 	.uleb128 0x4e
-	.8byte	.LVL500
-	.4byte	0x14600
+	.8byte	.LVL504
+	.4byte	0x14704
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL488
-	.4byte	0x140a3
-	.uleb128 0x4e
-	.8byte	.LVL489
-	.4byte	0x12b53
-	.uleb128 0x4e
-	.8byte	.LVL490
-	.4byte	0x1460d
-	.uleb128 0x4e
-	.8byte	.LVL491
-	.4byte	0x14530
-	.uleb128 0x4e
 	.8byte	.LVL492
-	.4byte	0x14617
+	.4byte	0x141a7
 	.uleb128 0x4e
 	.8byte	.LVL493
-	.4byte	0x140a3
+	.4byte	0x12c15
 	.uleb128 0x4e
 	.8byte	.LVL494
-	.4byte	0x1261e
+	.4byte	0x14711
+	.uleb128 0x4e
+	.8byte	.LVL495
+	.4byte	0x14634
 	.uleb128 0x4e
 	.8byte	.LVL496
-	.4byte	0x140a3
+	.4byte	0x1471b
 	.uleb128 0x4e
 	.8byte	.LVL497
-	.4byte	0x12808
+	.4byte	0x141a7
 	.uleb128 0x4e
 	.8byte	.LVL498
-	.4byte	0x140a3
+	.4byte	0x126e0
 	.uleb128 0x4e
-	.8byte	.LVL499
-	.4byte	0x129f2
+	.8byte	.LVL500
+	.4byte	0x141a7
+	.uleb128 0x4e
+	.8byte	.LVL501
+	.4byte	0x128ca
+	.uleb128 0x4e
+	.8byte	.LVL502
+	.4byte	0x141a7
+	.uleb128 0x4e
+	.8byte	.LVL503
+	.4byte	0x12ab4
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x12414
+	.4byte	0x124d6
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3096
+	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x3fa
+	.2byte	0x3fc
 	.8byte	.LFB2821
 	.8byte	.LFE2821-.LFB2821
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x125c0
+	.4byte	0x12682
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x3fa
-	.4byte	0xe49e
-	.4byte	.LLST142
+	.2byte	0x3fc
+	.4byte	0xe4b6
+	.4byte	.LLST144
 	.uleb128 0x46
-	.4byte	.LASF3000
+	.4byte	.LASF3002
 	.byte	0x1
-	.2byte	0x3fc
+	.2byte	0x3fe
 	.4byte	0xe160
 	.uleb128 0x46
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x3fd
-	.4byte	0xe763
+	.2byte	0x3ff
+	.4byte	0xe7a7
 	.uleb128 0x55
-	.4byte	.LASF3026
+	.4byte	.LASF3030
 	.4byte	0xb940
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34774
+	.8byte	__func__.34776
 	.uleb128 0x53
-	.4byte	0x125c0
-	.8byte	.LBB1393
-	.8byte	.LBE1393-.LBB1393
+	.4byte	0x12682
+	.8byte	.LBB1391
+	.8byte	.LBE1391-.LBB1391
 	.byte	0x1
-	.2byte	0x433
-	.4byte	0x124a1
+	.2byte	0x435
+	.4byte	0x12563
 	.uleb128 0x54
-	.4byte	0x125d9
+	.4byte	0x1269b
 	.uleb128 0x54
-	.4byte	0x125cd
+	.4byte	0x1268f
 	.uleb128 0x4e
-	.8byte	.LVL460
-	.4byte	0x140a3
+	.8byte	.LVL464
+	.4byte	0x141a7
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x125c0
-	.8byte	.LBB1395
-	.8byte	.LBE1395-.LBB1395
+	.4byte	0x12682
+	.8byte	.LBB1393
+	.8byte	.LBE1393-.LBB1393
 	.byte	0x1
-	.2byte	0x419
-	.4byte	0x124d5
+	.2byte	0x41b
+	.4byte	0x12597
 	.uleb128 0x54
-	.4byte	0x125d9
+	.4byte	0x1269b
 	.uleb128 0x54
-	.4byte	0x125cd
+	.4byte	0x1268f
 	.uleb128 0x4e
-	.8byte	.LVL465
-	.4byte	0x140a3
+	.8byte	.LVL469
+	.4byte	0x141a7
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x125c0
-	.8byte	.LBB1397
-	.8byte	.LBE1397-.LBB1397
+	.4byte	0x12682
+	.8byte	.LBB1395
+	.8byte	.LBE1395-.LBB1395
 	.byte	0x1
-	.2byte	0x407
-	.4byte	0x12509
+	.2byte	0x409
+	.4byte	0x125cb
 	.uleb128 0x54
-	.4byte	0x125d9
+	.4byte	0x1269b
 	.uleb128 0x54
-	.4byte	0x125cd
+	.4byte	0x1268f
 	.uleb128 0x4e
-	.8byte	.LVL470
-	.4byte	0x140a3
+	.8byte	.LVL474
+	.4byte	0x141a7
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x125c0
-	.8byte	.LBB1399
-	.8byte	.LBE1399-.LBB1399
+	.4byte	0x12682
+	.8byte	.LBB1397
+	.8byte	.LBE1397-.LBB1397
 	.byte	0x1
-	.2byte	0x440
-	.4byte	0x1253d
+	.2byte	0x442
+	.4byte	0x125ff
 	.uleb128 0x54
-	.4byte	0x125d9
+	.4byte	0x1269b
 	.uleb128 0x54
-	.4byte	0x125cd
+	.4byte	0x1268f
 	.uleb128 0x4e
-	.8byte	.LVL475
-	.4byte	0x140a3
+	.8byte	.LVL479
+	.4byte	0x141a7
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL459
-	.4byte	0x1261e
+	.8byte	.LVL463
+	.4byte	0x126e0
 	.uleb128 0x4e
-	.8byte	.LVL461
-	.4byte	0x1261e
+	.8byte	.LVL465
+	.4byte	0x126e0
 	.uleb128 0x4e
-	.8byte	.LVL464
-	.4byte	0x12b53
+	.8byte	.LVL468
+	.4byte	0x12c15
 	.uleb128 0x4e
-	.8byte	.LVL466
-	.4byte	0x12b53
+	.8byte	.LVL470
+	.4byte	0x12c15
 	.uleb128 0x4e
-	.8byte	.LVL469
-	.4byte	0x129f2
+	.8byte	.LVL473
+	.4byte	0x12ab4
 	.uleb128 0x4e
-	.8byte	.LVL471
-	.4byte	0x129f2
+	.8byte	.LVL475
+	.4byte	0x12ab4
 	.uleb128 0x4e
-	.8byte	.LVL474
-	.4byte	0x12808
+	.8byte	.LVL478
+	.4byte	0x128ca
 	.uleb128 0x4e
-	.8byte	.LVL476
-	.4byte	0x12808
+	.8byte	.LVL480
+	.4byte	0x128ca
 	.uleb128 0x4e
-	.8byte	.LVL479
-	.4byte	0x1432e
+	.8byte	.LVL483
+	.4byte	0x14432
 	.uleb128 0x4e
-	.8byte	.LVL482
-	.4byte	0x1432e
+	.8byte	.LVL486
+	.4byte	0x14432
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3098
+	.4byte	.LASF3102
 	.byte	0x1
-	.2byte	0x3f4
+	.2byte	0x3f6
 	.byte	0x1
-	.4byte	0x125e6
+	.4byte	0x126a8
 	.uleb128 0x65
-	.4byte	.LASF3000
+	.4byte	.LASF3002
 	.byte	0x1
-	.2byte	0x3f4
+	.2byte	0x3f6
 	.4byte	0xe160
 	.uleb128 0x65
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x3f4
-	.4byte	0xe763
+	.2byte	0x3f6
+	.4byte	0xe7a7
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3099
+	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x3e9
+	.2byte	0x3eb
 	.byte	0x1
-	.4byte	0x12618
+	.4byte	0x126da
 	.uleb128 0x65
-	.4byte	.LASF3000
+	.4byte	.LASF3002
 	.byte	0x1
-	.2byte	0x3e9
+	.2byte	0x3eb
 	.4byte	0xe160
 	.uleb128 0x65
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x3e9
-	.4byte	0xe763
+	.2byte	0x3eb
+	.4byte	0xe7a7
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x3eb
-	.4byte	0x12618
+	.2byte	0x3ed
+	.4byte	0x126da
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xdeea
 	.uleb128 0x66
-	.4byte	.LASF3100
+	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x3df
+	.2byte	0x3e1
 	.byte	0x1
-	.4byte	0x1265c
+	.4byte	0x1271e
 	.uleb128 0x65
-	.4byte	.LASF3101
+	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x3df
+	.2byte	0x3e1
 	.4byte	0xc0c8
 	.uleb128 0x65
-	.4byte	.LASF3102
+	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x3e0
+	.2byte	0x3e2
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF3103
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x3e0
+	.2byte	0x3e2
 	.4byte	0xac0
 	.uleb128 0x65
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x3e1
-	.4byte	0xe763
+	.2byte	0x3e3
+	.4byte	0xe7a7
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3104
+	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x3b5
+	.2byte	0x3b7
 	.byte	0x1
-	.4byte	0x12732
+	.4byte	0x127f4
 	.uleb128 0x65
-	.4byte	.LASF3101
+	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x3b5
+	.2byte	0x3b7
 	.4byte	0xc0c8
 	.uleb128 0x65
-	.4byte	.LASF3102
+	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x3b6
+	.2byte	0x3b8
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF3103
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x3b6
+	.2byte	0x3b8
 	.4byte	0xac0
 	.uleb128 0x65
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x3b7
-	.4byte	0xe763
+	.2byte	0x3b9
+	.4byte	0xe7a7
 	.uleb128 0x46
-	.4byte	.LASF3000
+	.4byte	.LASF3002
 	.byte	0x1
-	.2byte	0x3b9
+	.2byte	0x3bb
 	.4byte	0xe160
 	.uleb128 0x46
-	.4byte	.LASF3105
+	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x3ba
+	.2byte	0x3bc
 	.4byte	0x15a
 	.uleb128 0x46
-	.4byte	.LASF3106
+	.4byte	.LASF3110
 	.byte	0x1
-	.2byte	0x3ba
+	.2byte	0x3bc
 	.4byte	0x15a
 	.uleb128 0x46
-	.4byte	.LASF3107
+	.4byte	.LASF3111
 	.byte	0x1
-	.2byte	0x3ba
+	.2byte	0x3bc
 	.4byte	0x4684
 	.uleb128 0x46
-	.4byte	.LASF3108
+	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x3ba
+	.2byte	0x3bc
 	.4byte	0x4684
 	.uleb128 0x46
-	.4byte	.LASF3109
+	.4byte	.LASF3113
 	.byte	0x1
-	.2byte	0x3bb
+	.2byte	0x3bd
 	.4byte	0xc0c8
 	.uleb128 0x46
 	.4byte	.LASF2898
 	.byte	0x1
-	.2byte	0x3bc
+	.2byte	0x3be
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x3bc
+	.2byte	0x3be
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x3bd
+	.2byte	0x3bf
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x3bd
+	.2byte	0x3bf
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3110
+	.4byte	.LASF3114
 	.byte	0x1
-	.2byte	0x3be
+	.2byte	0x3c0
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2857
 	.byte	0x1
-	.2byte	0x3bf
+	.2byte	0x3c1
 	.4byte	0xc0c8
 	.uleb128 0x46
 	.4byte	.LASF2944
 	.byte	0x1
-	.2byte	0x3c0
+	.2byte	0x3c2
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3111
+	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x38c
+	.2byte	0x38e
 	.byte	0x1
-	.4byte	0x12808
+	.4byte	0x128ca
 	.uleb128 0x65
-	.4byte	.LASF3101
+	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x38c
+	.2byte	0x38e
 	.4byte	0xc0c8
 	.uleb128 0x65
-	.4byte	.LASF3102
+	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x38d
+	.2byte	0x38f
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF3103
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x38d
+	.2byte	0x38f
 	.4byte	0xac0
 	.uleb128 0x65
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x38e
-	.4byte	0xe763
+	.2byte	0x390
+	.4byte	0xe7a7
 	.uleb128 0x46
-	.4byte	.LASF3000
+	.4byte	.LASF3002
 	.byte	0x1
-	.2byte	0x390
+	.2byte	0x392
 	.4byte	0xe160
 	.uleb128 0x46
-	.4byte	.LASF3105
+	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x391
+	.2byte	0x393
 	.4byte	0x13f
 	.uleb128 0x46
-	.4byte	.LASF3106
+	.4byte	.LASF3110
 	.byte	0x1
-	.2byte	0x391
+	.2byte	0x393
 	.4byte	0x13f
 	.uleb128 0x46
-	.4byte	.LASF3107
+	.4byte	.LASF3111
 	.byte	0x1
-	.2byte	0x391
+	.2byte	0x393
 	.4byte	0xac0
 	.uleb128 0x46
-	.4byte	.LASF3108
+	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x391
+	.2byte	0x393
 	.4byte	0xac0
 	.uleb128 0x46
-	.4byte	.LASF3109
+	.4byte	.LASF3113
 	.byte	0x1
-	.2byte	0x392
+	.2byte	0x394
 	.4byte	0xc0c8
 	.uleb128 0x46
 	.4byte	.LASF2898
 	.byte	0x1
-	.2byte	0x393
+	.2byte	0x395
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x393
+	.2byte	0x395
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x394
+	.2byte	0x396
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x394
+	.2byte	0x396
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3110
+	.4byte	.LASF3114
 	.byte	0x1
-	.2byte	0x395
+	.2byte	0x397
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2857
 	.byte	0x1
-	.2byte	0x396
+	.2byte	0x398
 	.4byte	0xc0c8
 	.uleb128 0x46
 	.4byte	.LASF2944
 	.byte	0x1
-	.2byte	0x397
+	.2byte	0x399
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3112
+	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x381
+	.2byte	0x383
 	.byte	0x1
-	.4byte	0x12846
+	.4byte	0x12908
 	.uleb128 0x65
-	.4byte	.LASF3101
+	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x381
+	.2byte	0x383
 	.4byte	0xc0c8
 	.uleb128 0x65
-	.4byte	.LASF3102
+	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x382
+	.2byte	0x384
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF3103
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x382
+	.2byte	0x384
 	.4byte	0xac0
 	.uleb128 0x65
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x383
-	.4byte	0xe763
+	.2byte	0x385
+	.4byte	0xe7a7
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3113
+	.4byte	.LASF3117
 	.byte	0x1
-	.2byte	0x35d
+	.2byte	0x35f
 	.byte	0x1
-	.4byte	0x1291c
+	.4byte	0x129de
 	.uleb128 0x65
-	.4byte	.LASF3101
+	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x35d
+	.2byte	0x35f
 	.4byte	0xc0c8
 	.uleb128 0x65
-	.4byte	.LASF3102
+	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x35e
+	.2byte	0x360
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF3103
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x35e
+	.2byte	0x360
 	.4byte	0xac0
 	.uleb128 0x65
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x35f
-	.4byte	0xe763
+	.2byte	0x361
+	.4byte	0xe7a7
 	.uleb128 0x46
-	.4byte	.LASF3000
+	.4byte	.LASF3002
 	.byte	0x1
-	.2byte	0x361
+	.2byte	0x363
 	.4byte	0xe160
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x362
+	.2byte	0x364
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x362
+	.2byte	0x364
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2898
 	.byte	0x1
-	.2byte	0x363
+	.2byte	0x365
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x364
+	.2byte	0x366
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3105
+	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x365
+	.2byte	0x367
 	.4byte	0x13f
 	.uleb128 0x46
-	.4byte	.LASF3106
+	.4byte	.LASF3110
 	.byte	0x1
-	.2byte	0x365
+	.2byte	0x367
 	.4byte	0x13f
 	.uleb128 0x46
-	.4byte	.LASF3107
+	.4byte	.LASF3111
 	.byte	0x1
-	.2byte	0x365
+	.2byte	0x367
 	.4byte	0xac0
 	.uleb128 0x46
-	.4byte	.LASF3108
+	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x365
+	.2byte	0x367
 	.4byte	0xac0
 	.uleb128 0x46
-	.4byte	.LASF3109
+	.4byte	.LASF3113
 	.byte	0x1
-	.2byte	0x366
+	.2byte	0x368
 	.4byte	0xc0c8
 	.uleb128 0x46
-	.4byte	.LASF3110
+	.4byte	.LASF3114
 	.byte	0x1
-	.2byte	0x367
+	.2byte	0x369
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2857
 	.byte	0x1
-	.2byte	0x368
+	.2byte	0x36a
 	.4byte	0xc0c8
 	.uleb128 0x46
 	.4byte	.LASF2944
 	.byte	0x1
-	.2byte	0x369
+	.2byte	0x36b
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3114
+	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x336
+	.2byte	0x338
 	.byte	0x1
-	.4byte	0x129f2
+	.4byte	0x12ab4
 	.uleb128 0x65
-	.4byte	.LASF3101
+	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x336
+	.2byte	0x338
 	.4byte	0xc0c8
 	.uleb128 0x65
-	.4byte	.LASF3102
+	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x337
+	.2byte	0x339
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF3103
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x337
+	.2byte	0x339
 	.4byte	0xac0
 	.uleb128 0x65
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x338
-	.4byte	0xe763
+	.2byte	0x33a
+	.4byte	0xe7a7
 	.uleb128 0x46
-	.4byte	.LASF3000
+	.4byte	.LASF3002
 	.byte	0x1
-	.2byte	0x33a
+	.2byte	0x33c
 	.4byte	0xe160
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x33b
+	.2byte	0x33d
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x33b
+	.2byte	0x33d
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2898
 	.byte	0x1
-	.2byte	0x33c
+	.2byte	0x33e
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x33d
+	.2byte	0x33f
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3105
+	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x33e
+	.2byte	0x340
 	.4byte	0x15a
 	.uleb128 0x46
-	.4byte	.LASF3106
+	.4byte	.LASF3110
 	.byte	0x1
-	.2byte	0x33e
+	.2byte	0x340
 	.4byte	0x15a
 	.uleb128 0x46
-	.4byte	.LASF3107
+	.4byte	.LASF3111
 	.byte	0x1
-	.2byte	0x33e
+	.2byte	0x340
 	.4byte	0x4684
 	.uleb128 0x46
-	.4byte	.LASF3108
+	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x33e
+	.2byte	0x340
 	.4byte	0x4684
 	.uleb128 0x46
-	.4byte	.LASF3109
+	.4byte	.LASF3113
 	.byte	0x1
-	.2byte	0x33f
+	.2byte	0x341
 	.4byte	0xc0c8
 	.uleb128 0x46
-	.4byte	.LASF3110
+	.4byte	.LASF3114
 	.byte	0x1
-	.2byte	0x340
+	.2byte	0x342
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2857
 	.byte	0x1
-	.2byte	0x341
+	.2byte	0x343
 	.4byte	0xc0c8
 	.uleb128 0x46
 	.4byte	.LASF2944
 	.byte	0x1
-	.2byte	0x342
+	.2byte	0x344
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3115
+	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x268
+	.2byte	0x26a
 	.8byte	.LFB2812
 	.8byte	.LFE2812-.LFB2812
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12b53
-	.uleb128 0x6a
-	.4byte	.LASF3101
+	.4byte	0x12c15
+	.uleb128 0x74
+	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x268
+	.2byte	0x26a
 	.4byte	0xc0c8
 	.uleb128 0x1
 	.byte	0x50
-	.uleb128 0x6a
-	.4byte	.LASF3102
+	.uleb128 0x74
+	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x268
+	.2byte	0x26a
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
-	.uleb128 0x6a
-	.4byte	.LASF3103
+	.uleb128 0x74
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x268
+	.2byte	0x26a
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
-	.uleb128 0x6a
-	.4byte	.LASF3116
+	.uleb128 0x74
+	.4byte	.LASF3120
 	.byte	0x1
-	.2byte	0x269
+	.2byte	0x26b
 	.4byte	0xc0c8
 	.uleb128 0x1
 	.byte	0x53
-	.uleb128 0x6a
+	.uleb128 0x74
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x269
-	.4byte	0xe763
+	.2byte	0x26b
+	.4byte	0xe7a7
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x46
-	.4byte	.LASF3000
+	.4byte	.LASF3002
 	.byte	0x1
-	.2byte	0x26b
+	.2byte	0x26d
 	.4byte	0xe160
 	.uleb128 0x69
 	.string	"i"
 	.byte	0x1
-	.2byte	0x26c
+	.2byte	0x26e
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5d
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x26d
+	.2byte	0x26f
 	.4byte	0xc6
 	.uleb128 0x4c
 	.4byte	.LASF2898
 	.byte	0x1
-	.2byte	0x26e
+	.2byte	0x270
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x62
 	.uleb128 0x4c
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x26f
+	.2byte	0x271
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x59
-	.4byte	.LASF3105
+	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x270
+	.2byte	0x272
 	.4byte	0x13f
 	.4byte	.LLST6
 	.uleb128 0x59
-	.4byte	.LASF3106
+	.4byte	.LASF3110
 	.byte	0x1
-	.2byte	0x270
+	.2byte	0x272
 	.4byte	0x13f
 	.4byte	.LLST7
 	.uleb128 0x46
-	.4byte	.LASF3117
+	.4byte	.LASF3121
 	.byte	0x1
-	.2byte	0x270
+	.2byte	0x272
 	.4byte	0x13f
 	.uleb128 0x4c
-	.4byte	.LASF3107
+	.4byte	.LASF3111
 	.byte	0x1
-	.2byte	0x271
+	.2byte	0x273
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4c
-	.4byte	.LASF3108
+	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x271
+	.2byte	0x273
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x59
-	.4byte	.LASF3109
+	.4byte	.LASF3113
 	.byte	0x1
-	.2byte	0x272
+	.2byte	0x274
 	.4byte	0xc0c8
 	.4byte	.LLST8
 	.uleb128 0x46
-	.4byte	.LASF2966
+	.4byte	.LASF2968
 	.byte	0x1
-	.2byte	0x273
+	.2byte	0x275
 	.4byte	0x110
 	.uleb128 0x4c
-	.4byte	.LASF3118
+	.4byte	.LASF3122
 	.byte	0x1
-	.2byte	0x274
+	.2byte	0x276
 	.4byte	0xc0c8
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x46
-	.4byte	.LASF3119
+	.4byte	.LASF3123
 	.byte	0x1
-	.2byte	0x275
+	.2byte	0x277
 	.4byte	0x110
 	.uleb128 0x46
 	.4byte	.LASF2857
 	.byte	0x1
-	.2byte	0x276
+	.2byte	0x278
 	.4byte	0xc0c8
 	.uleb128 0x46
 	.4byte	.LASF2944
 	.byte	0x1
-	.2byte	0x277
+	.2byte	0x279
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3120
+	.4byte	.LASF3124
 	.byte	0x1
-	.2byte	0x278
+	.2byte	0x27a
 	.4byte	0x110
 	.uleb128 0x46
-	.4byte	.LASF3121
+	.4byte	.LASF3125
 	.byte	0x1
-	.2byte	0x278
+	.2byte	0x27a
 	.4byte	0x110
 	.uleb128 0x59
-	.4byte	.LASF3122
+	.4byte	.LASF3126
 	.byte	0x1
-	.2byte	0x279
+	.2byte	0x27b
 	.4byte	0x13f
 	.4byte	.LLST9
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3123
+	.4byte	.LASF3127
 	.byte	0x1
-	.2byte	0x1c3
+	.2byte	0x1c5
 	.8byte	.LFB2811
 	.8byte	.LFE2811-.LFB2811
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12cae
-	.uleb128 0x6a
-	.4byte	.LASF3101
+	.4byte	0x12d70
+	.uleb128 0x74
+	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x1c3
+	.2byte	0x1c5
 	.4byte	0xc0c8
 	.uleb128 0x1
 	.byte	0x50
-	.uleb128 0x6a
-	.4byte	.LASF3102
+	.uleb128 0x74
+	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x1c3
+	.2byte	0x1c5
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
-	.uleb128 0x6a
-	.4byte	.LASF3103
+	.uleb128 0x74
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x1c3
+	.2byte	0x1c5
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
-	.uleb128 0x6a
-	.4byte	.LASF3116
+	.uleb128 0x74
+	.4byte	.LASF3120
 	.byte	0x1
-	.2byte	0x1c4
+	.2byte	0x1c6
 	.4byte	0xc0c8
 	.uleb128 0x1
 	.byte	0x53
-	.uleb128 0x6a
+	.uleb128 0x74
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x1c4
-	.4byte	0xe763
+	.2byte	0x1c6
+	.4byte	0xe7a7
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x46
-	.4byte	.LASF3000
+	.4byte	.LASF3002
 	.byte	0x1
-	.2byte	0x1c6
+	.2byte	0x1c8
 	.4byte	0xe160
 	.uleb128 0x5a
 	.string	"i"
 	.byte	0x1
-	.2byte	0x1c7
+	.2byte	0x1c9
 	.4byte	0xc6
 	.4byte	.LLST0
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x1c8
+	.2byte	0x1ca
 	.4byte	0xc6
 	.uleb128 0x4c
 	.4byte	.LASF2898
 	.byte	0x1
-	.2byte	0x1c9
+	.2byte	0x1cb
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x61
 	.uleb128 0x59
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x1ca
+	.2byte	0x1cc
 	.4byte	0xc6
 	.4byte	.LLST1
 	.uleb128 0x59
-	.4byte	.LASF3105
+	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x1cb
+	.2byte	0x1cd
 	.4byte	0x13f
 	.4byte	.LLST2
 	.uleb128 0x59
-	.4byte	.LASF3106
+	.4byte	.LASF3110
 	.byte	0x1
-	.2byte	0x1cb
+	.2byte	0x1cd
 	.4byte	0x13f
 	.4byte	.LLST3
 	.uleb128 0x4c
-	.4byte	.LASF3107
+	.4byte	.LASF3111
 	.byte	0x1
-	.2byte	0x1cc
+	.2byte	0x1ce
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4c
-	.4byte	.LASF3108
+	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x1cc
+	.2byte	0x1ce
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x59
-	.4byte	.LASF3109
+	.4byte	.LASF3113
 	.byte	0x1
-	.2byte	0x1cd
+	.2byte	0x1cf
 	.4byte	0xc0c8
 	.4byte	.LLST4
 	.uleb128 0x4c
-	.4byte	.LASF2966
+	.4byte	.LASF2968
 	.byte	0x1
-	.2byte	0x1ce
+	.2byte	0x1d0
 	.4byte	0x110
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x4c
-	.4byte	.LASF3118
+	.4byte	.LASF3122
 	.byte	0x1
-	.2byte	0x1cf
+	.2byte	0x1d1
 	.4byte	0xc0c8
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x46
-	.4byte	.LASF3119
+	.4byte	.LASF3123
 	.byte	0x1
-	.2byte	0x1d0
+	.2byte	0x1d2
 	.4byte	0x110
 	.uleb128 0x46
 	.4byte	.LASF2857
 	.byte	0x1
-	.2byte	0x1d1
+	.2byte	0x1d3
 	.4byte	0xc0c8
 	.uleb128 0x46
 	.4byte	.LASF2944
 	.byte	0x1
-	.2byte	0x1d2
+	.2byte	0x1d4
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3120
+	.4byte	.LASF3124
 	.byte	0x1
-	.2byte	0x1d3
+	.2byte	0x1d5
 	.4byte	0x110
 	.uleb128 0x46
-	.4byte	.LASF3121
+	.4byte	.LASF3125
 	.byte	0x1
-	.2byte	0x1d3
+	.2byte	0x1d5
 	.4byte	0x110
 	.uleb128 0x59
-	.4byte	.LASF3122
+	.4byte	.LASF3126
 	.byte	0x1
-	.2byte	0x1d4
+	.2byte	0x1d6
 	.4byte	0x13f
 	.4byte	.LLST5
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3124
+	.4byte	.LASF3128
 	.byte	0x1
-	.2byte	0x164
+	.2byte	0x166
 	.byte	0x1
-	.4byte	0x12dcc
+	.4byte	0x12e8e
 	.uleb128 0x65
-	.4byte	.LASF3125
+	.4byte	.LASF3129
 	.byte	0x1
-	.2byte	0x164
+	.2byte	0x166
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF3126
+	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x164
+	.2byte	0x166
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF3127
+	.4byte	.LASF3131
 	.byte	0x1
-	.2byte	0x164
+	.2byte	0x166
 	.4byte	0xac0
 	.uleb128 0x65
-	.4byte	.LASF3116
+	.4byte	.LASF3120
 	.byte	0x1
-	.2byte	0x164
+	.2byte	0x166
 	.4byte	0x4684
 	.uleb128 0x65
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x165
-	.4byte	0xe763
+	.2byte	0x167
+	.4byte	0xe7a7
 	.uleb128 0x65
 	.4byte	.LASF2868
 	.byte	0x1
-	.2byte	0x165
+	.2byte	0x167
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2898
 	.byte	0x1
-	.2byte	0x167
+	.2byte	0x169
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x167
+	.2byte	0x169
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3128
+	.4byte	.LASF3132
 	.byte	0x1
-	.2byte	0x168
+	.2byte	0x16a
 	.4byte	0x13f
 	.uleb128 0x46
-	.4byte	.LASF3129
+	.4byte	.LASF3133
 	.byte	0x1
-	.2byte	0x168
+	.2byte	0x16a
 	.4byte	0x13f
 	.uleb128 0x46
-	.4byte	.LASF3130
+	.4byte	.LASF3134
 	.byte	0x1
-	.2byte	0x168
+	.2byte	0x16a
 	.4byte	0x13f
 	.uleb128 0x46
-	.4byte	.LASF3131
+	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x169
+	.2byte	0x16b
 	.4byte	0xac0
 	.uleb128 0x46
-	.4byte	.LASF3132
+	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x169
+	.2byte	0x16b
 	.4byte	0xac0
 	.uleb128 0x46
-	.4byte	.LASF3133
+	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x169
+	.2byte	0x16b
 	.4byte	0xac0
 	.uleb128 0x46
-	.4byte	.LASF3119
+	.4byte	.LASF3123
 	.byte	0x1
-	.2byte	0x16a
+	.2byte	0x16c
 	.4byte	0x15a
 	.uleb128 0x46
-	.4byte	.LASF3118
+	.4byte	.LASF3122
 	.byte	0x1
-	.2byte	0x16b
+	.2byte	0x16d
 	.4byte	0x4684
 	.uleb128 0x46
-	.4byte	.LASF3134
+	.4byte	.LASF3138
 	.byte	0x1
-	.2byte	0x16c
+	.2byte	0x16e
 	.4byte	0x13f
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x16d
+	.2byte	0x16f
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x16e
+	.2byte	0x170
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2869
 	.byte	0x1
-	.2byte	0x16f
+	.2byte	0x171
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2871
 	.byte	0x1
-	.2byte	0x170
+	.2byte	0x172
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2870
 	.byte	0x1
-	.2byte	0x171
+	.2byte	0x173
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2872
 	.byte	0x1
-	.2byte	0x172
+	.2byte	0x174
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x74
-	.4byte	.LASF3135
+	.uleb128 0x75
+	.4byte	.LASF3139
 	.byte	0x1
-	.2byte	0x14f
+	.2byte	0x151
 	.8byte	.LFB2809
 	.8byte	.LFE2809-.LFB2809
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12e5c
+	.4byte	0x12f1e
 	.uleb128 0x58
 	.4byte	.LASF2274
 	.byte	0x1
-	.2byte	0x14f
+	.2byte	0x151
 	.4byte	0x3205
-	.4byte	.LLST183
+	.4byte	.LLST185
 	.uleb128 0x5a
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x151
-	.4byte	0xe49e
-	.4byte	.LLST184
+	.2byte	0x153
+	.4byte	0xe4b6
+	.4byte	.LLST186
 	.uleb128 0x59
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x152
-	.4byte	0xe763
-	.4byte	.LLST185
+	.2byte	0x154
+	.4byte	0xe7a7
+	.4byte	.LLST187
 	.uleb128 0x4e
-	.8byte	.LVL745
-	.4byte	0x145c4
+	.8byte	.LVL750
+	.4byte	0x146c8
 	.uleb128 0x4e
-	.8byte	.LVL747
-	.4byte	0x12f23
+	.8byte	.LVL752
+	.4byte	0x12fe5
 	.uleb128 0x4e
-	.8byte	.LVL748
-	.4byte	0x145d0
+	.8byte	.LVL753
+	.4byte	0x146d4
 	.uleb128 0x4e
-	.8byte	.LVL751
-	.4byte	0x12e5c
+	.8byte	.LVL756
+	.4byte	0x12f1e
 	.uleb128 0x4e
-	.8byte	.LVL752
-	.4byte	0x145d0
+	.8byte	.LVL757
+	.4byte	0x146d4
 	.byte	0
-	.uleb128 0x74
-	.4byte	.LASF3136
+	.uleb128 0x75
+	.4byte	.LASF3140
 	.byte	0x1
-	.2byte	0x11e
+	.2byte	0x120
 	.8byte	.LFB2808
 	.8byte	.LFE2808-.LFB2808
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12f23
-	.uleb128 0x6a
-	.4byte	.LASF3125
+	.4byte	0x12fe5
+	.uleb128 0x74
+	.4byte	.LASF3129
 	.byte	0x1
-	.2byte	0x11e
+	.2byte	0x120
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
-	.uleb128 0x6a
-	.4byte	.LASF3126
+	.uleb128 0x74
+	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x11e
+	.2byte	0x120
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
-	.uleb128 0x6a
-	.4byte	.LASF3116
+	.uleb128 0x74
+	.4byte	.LASF3120
 	.byte	0x1
-	.2byte	0x11e
+	.2byte	0x120
 	.4byte	0x4684
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x58
 	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x11f
-	.4byte	0xe763
-	.4byte	.LLST179
+	.2byte	0x121
+	.4byte	0xe7a7
+	.4byte	.LLST181
 	.uleb128 0x4c
 	.4byte	.LASF2898
 	.byte	0x1
-	.2byte	0x121
+	.2byte	0x123
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5d
 	.uleb128 0x4c
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x121
+	.2byte	0x123
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x59
 	.uleb128 0x46
-	.4byte	.LASF3128
+	.4byte	.LASF3132
 	.byte	0x1
-	.2byte	0x122
+	.2byte	0x124
 	.4byte	0x13f
 	.uleb128 0x59
-	.4byte	.LASF3129
+	.4byte	.LASF3133
 	.byte	0x1
-	.2byte	0x122
+	.2byte	0x124
 	.4byte	0x13f
-	.4byte	.LLST180
+	.4byte	.LLST182
 	.uleb128 0x59
-	.4byte	.LASF3119
+	.4byte	.LASF3123
 	.byte	0x1
-	.2byte	0x123
+	.2byte	0x125
 	.4byte	0x15a
-	.4byte	.LLST181
+	.4byte	.LLST183
 	.uleb128 0x69
 	.string	"i"
 	.byte	0x1
-	.2byte	0x124
+	.2byte	0x126
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x124
+	.2byte	0x126
 	.4byte	0xc6
 	.uleb128 0x59
-	.4byte	.LASF3134
+	.4byte	.LASF3138
 	.byte	0x1
-	.2byte	0x125
+	.2byte	0x127
 	.4byte	0x13f
-	.4byte	.LLST182
+	.4byte	.LLST184
 	.byte	0
-	.uleb128 0x75
-	.4byte	.LASF3137
+	.uleb128 0x76
+	.4byte	.LASF3141
 	.byte	0x1
-	.byte	0xd3
+	.byte	0xd5
 	.8byte	.LFB2807
 	.8byte	.LFE2807-.LFB2807
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13008
-	.uleb128 0x76
-	.4byte	.LASF3125
+	.4byte	0x130ca
+	.uleb128 0x77
+	.4byte	.LASF3129
 	.byte	0x1
-	.byte	0xd3
+	.byte	0xd5
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
-	.uleb128 0x76
-	.4byte	.LASF3126
+	.uleb128 0x77
+	.4byte	.LASF3130
 	.byte	0x1
-	.byte	0xd3
+	.byte	0xd5
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
-	.uleb128 0x76
-	.4byte	.LASF3127
+	.uleb128 0x77
+	.4byte	.LASF3131
 	.byte	0x1
-	.byte	0xd3
+	.byte	0xd5
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
-	.uleb128 0x76
-	.4byte	.LASF3116
+	.uleb128 0x77
+	.4byte	.LASF3120
 	.byte	0x1
-	.byte	0xd3
+	.byte	0xd5
 	.4byte	0x4684
 	.uleb128 0x1
 	.byte	0x53
-	.uleb128 0x77
+	.uleb128 0x78
 	.4byte	.LASF2959
 	.byte	0x1
-	.byte	0xd4
-	.4byte	0xe763
-	.4byte	.LLST173
-	.uleb128 0x77
+	.byte	0xd6
+	.4byte	0xe7a7
+	.4byte	.LLST175
+	.uleb128 0x78
 	.4byte	.LASF2868
 	.byte	0x1
-	.byte	0xd4
+	.byte	0xd6
 	.4byte	0xc6
-	.4byte	.LLST174
+	.4byte	.LLST176
 	.uleb128 0x4b
 	.4byte	.LASF2898
 	.byte	0x1
-	.byte	0xd6
+	.byte	0xd8
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x60
 	.uleb128 0x4b
 	.4byte	.LASF262
 	.byte	0x1
-	.byte	0xd6
+	.byte	0xd8
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5b
-	.uleb128 0x78
-	.4byte	.LASF3128
+	.uleb128 0x79
+	.4byte	.LASF3132
 	.byte	0x1
-	.byte	0xd7
+	.byte	0xd9
 	.4byte	0x13f
-	.uleb128 0x79
-	.4byte	.LASF3129
+	.uleb128 0x7a
+	.4byte	.LASF3133
 	.byte	0x1
-	.byte	0xd7
+	.byte	0xd9
 	.4byte	0x13f
-	.4byte	.LLST175
-	.uleb128 0x79
-	.4byte	.LASF3130
+	.4byte	.LLST177
+	.uleb128 0x7a
+	.4byte	.LASF3134
 	.byte	0x1
-	.byte	0xd7
+	.byte	0xd9
 	.4byte	0x13f
-	.4byte	.LLST176
-	.uleb128 0x79
-	.4byte	.LASF3119
+	.4byte	.LLST178
+	.uleb128 0x7a
+	.4byte	.LASF3123
 	.byte	0x1
-	.byte	0xd8
+	.byte	0xda
 	.4byte	0x15a
-	.4byte	.LLST177
-	.uleb128 0x7a
+	.4byte	.LLST179
+	.uleb128 0x7b
 	.string	"i"
 	.byte	0x1
-	.byte	0xd9
+	.byte	0xdb
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5f
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.string	"j"
 	.byte	0x1
-	.byte	0xd9
+	.byte	0xdb
 	.4byte	0xc6
-	.uleb128 0x79
-	.4byte	.LASF3134
+	.uleb128 0x7a
+	.4byte	.LASF3138
 	.byte	0x1
-	.byte	0xda
+	.byte	0xdc
 	.4byte	0x13f
-	.4byte	.LLST178
+	.4byte	.LLST180
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3138
+	.uleb128 0x7d
+	.4byte	.LASF3142
 	.byte	0x1
-	.byte	0xb4
+	.byte	0xb6
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1303a
-	.uleb128 0x7d
+	.4byte	0x130fc
+	.uleb128 0x7e
 	.string	"ebc"
 	.byte	0x1
-	.byte	0xb4
-	.4byte	0xe49e
-	.uleb128 0x7e
-	.4byte	.LASF3139
+	.byte	0xb6
+	.4byte	0xe4b6
+	.uleb128 0x7f
+	.4byte	.LASF3143
 	.byte	0x1
-	.byte	0xb4
+	.byte	0xb6
 	.4byte	0xc6
-	.uleb128 0x78
+	.uleb128 0x79
 	.4byte	.LASF2959
 	.byte	0x1
-	.byte	0xb6
-	.4byte	0xe763
+	.byte	0xb8
+	.4byte	0xe7a7
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3140
+	.uleb128 0x7d
+	.4byte	.LASF3144
 	.byte	0x1
-	.byte	0x86
+	.byte	0x88
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x13082
-	.uleb128 0x7e
+	.4byte	0x13144
+	.uleb128 0x7f
 	.4byte	.LASF2857
 	.byte	0x1
-	.byte	0x86
+	.byte	0x88
 	.4byte	0xc0c8
-	.uleb128 0x7e
-	.4byte	.LASF3105
+	.uleb128 0x7f
+	.4byte	.LASF3109
 	.byte	0x1
-	.byte	0x86
+	.byte	0x88
 	.4byte	0x11f
-	.uleb128 0x7e
-	.4byte	.LASF3106
+	.uleb128 0x7f
+	.4byte	.LASF3110
 	.byte	0x1
-	.byte	0x86
+	.byte	0x88
 	.4byte	0x11f
-	.uleb128 0x78
-	.4byte	.LASF3141
+	.uleb128 0x79
+	.4byte	.LASF3145
 	.byte	0x1
-	.byte	0x88
+	.byte	0x8a
 	.4byte	0x110
-	.uleb128 0x78
-	.4byte	.LASF3122
+	.uleb128 0x79
+	.4byte	.LASF3126
 	.byte	0x1
-	.byte	0x89
+	.byte	0x8b
 	.4byte	0x11f
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3142
+	.uleb128 0x7d
+	.4byte	.LASF3146
 	.byte	0x1
-	.byte	0x80
+	.byte	0x82
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x130b4
-	.uleb128 0x7e
+	.4byte	0x13176
+	.uleb128 0x7f
 	.4byte	.LASF2857
 	.byte	0x1
-	.byte	0x80
+	.byte	0x82
 	.4byte	0xc0c8
-	.uleb128 0x7e
-	.4byte	.LASF3105
+	.uleb128 0x7f
+	.4byte	.LASF3109
 	.byte	0x1
-	.byte	0x80
+	.byte	0x82
 	.4byte	0x11f
-	.uleb128 0x7e
-	.4byte	.LASF3106
+	.uleb128 0x7f
+	.4byte	.LASF3110
 	.byte	0x1
-	.byte	0x80
+	.byte	0x82
 	.4byte	0x11f
 	.byte	0
-	.uleb128 0x7f
-	.4byte	.LASF3143
+	.uleb128 0x80
+	.4byte	.LASF3147
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x130d7
-	.uleb128 0x7e
+	.4byte	0x1319a
+	.uleb128 0x7f
 	.4byte	.LASF2934
 	.byte	0xb
 	.byte	0x4b
 	.4byte	0xe120
-	.uleb128 0x7e
-	.4byte	.LASF2966
+	.uleb128 0x7f
+	.4byte	.LASF2968
 	.byte	0xb
 	.byte	0x4b
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x7f
-	.4byte	.LASF3144
+	.uleb128 0x80
+	.4byte	.LASF3148
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x13105
-	.uleb128 0x7e
+	.4byte	0x131c9
+	.uleb128 0x7f
 	.4byte	.LASF2934
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0xe120
-	.uleb128 0x7e
-	.4byte	.LASF3145
+	.uleb128 0x7f
+	.4byte	.LASF3149
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13f
-	.uleb128 0x7e
-	.4byte	.LASF3146
+	.uleb128 0x7f
+	.4byte	.LASF3150
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13f
 	.byte	0
-	.uleb128 0x7f
-	.4byte	.LASF3147
+	.uleb128 0x80
+	.4byte	.LASF3151
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x13149
-	.uleb128 0x7e
+	.4byte	0x1320e
+	.uleb128 0x7f
 	.4byte	.LASF2934
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xe120
-	.uleb128 0x7e
-	.4byte	.LASF3148
+	.uleb128 0x7f
+	.4byte	.LASF3152
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xc6
-	.uleb128 0x7e
-	.4byte	.LASF3149
+	.uleb128 0x7f
+	.4byte	.LASF3153
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
-	.uleb128 0x7e
-	.4byte	.LASF3150
+	.uleb128 0x7f
+	.4byte	.LASF3154
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
-	.uleb128 0x7e
-	.4byte	.LASF3151
+	.uleb128 0x7f
+	.4byte	.LASF3155
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x7f
-	.4byte	.LASF3152
+	.uleb128 0x80
+	.4byte	.LASF3156
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x13161
-	.uleb128 0x7e
+	.4byte	0x13227
+	.uleb128 0x7f
 	.4byte	.LASF2934
 	.byte	0xb
 	.byte	0x31
 	.4byte	0xe120
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3153
+	.uleb128 0x7d
+	.4byte	.LASF3157
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13188
-	.uleb128 0x7e
+	.4byte	0x1324e
+	.uleb128 0x7f
 	.4byte	.LASF2934
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xe120
-	.uleb128 0x7e
-	.4byte	.LASF3000
+	.uleb128 0x7f
+	.4byte	.LASF3002
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xe160
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3154
+	.4byte	.LASF3158
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x131d2
+	.4byte	0x13298
 	.uleb128 0x64
 	.string	"dev"
 	.byte	0xa
@@ -44693,368 +44872,368 @@ __exitcall_ebc_exit:
 	.4byte	0xb7b9
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3155
+	.4byte	.LASF3159
 	.byte	0xa
 	.2byte	0x108
 	.4byte	0xb7b9
 	.byte	0x3
-	.4byte	0x131f0
+	.4byte	0x132b6
 	.uleb128 0x64
 	.string	"dev"
 	.byte	0xa
 	.2byte	0x108
 	.4byte	0xa570
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3156
+	.uleb128 0x7d
+	.4byte	.LASF3160
 	.byte	0xc8
 	.byte	0x1d
 	.4byte	0xb7b9
 	.byte	0x3
-	.4byte	0x1320c
-	.uleb128 0x7d
+	.4byte	0x132d2
+	.uleb128 0x7e
 	.string	"bus"
 	.byte	0xc8
 	.byte	0x1d
 	.4byte	0xadd7
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3157
+	.uleb128 0x7d
+	.4byte	.LASF3161
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13228
-	.uleb128 0x7e
-	.4byte	.LASF3158
+	.4byte	0x132ee
+	.uleb128 0x7f
+	.4byte	.LASF3162
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x7f
-	.4byte	.LASF3159
+	.uleb128 0x80
+	.4byte	.LASF3163
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x13261
-	.uleb128 0x7d
+	.4byte	0x13328
+	.uleb128 0x7e
 	.string	"dev"
 	.byte	0xcb
 	.byte	0xa3
 	.4byte	0xa570
-	.uleb128 0x7e
-	.4byte	.LASF3160
+	.uleb128 0x7f
+	.4byte	.LASF3164
 	.byte	0xcb
 	.byte	0xa4
 	.4byte	0x325
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF987
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0x2e3
-	.uleb128 0x7e
-	.4byte	.LASF3161
+	.uleb128 0x7f
+	.4byte	.LASF3165
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3162
+	.uleb128 0x7d
+	.4byte	.LASF3166
 	.byte	0x3
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1327d
-	.uleb128 0x7e
+	.4byte	0x13344
+	.uleb128 0x7f
 	.4byte	.LASF2935
 	.byte	0x3
 	.byte	0x35
 	.4byte	0xdb20
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3163
+	.uleb128 0x7d
+	.4byte	.LASF3167
 	.byte	0x3
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x132a2
-	.uleb128 0x7e
+	.4byte	0x13369
+	.uleb128 0x7f
 	.4byte	.LASF2935
 	.byte	0x3
 	.byte	0x30
 	.4byte	0xdb20
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.string	"t"
 	.byte	0x3
 	.byte	0x30
 	.4byte	0x467e
 	.byte	0
-	.uleb128 0x7f
-	.4byte	.LASF3164
+	.uleb128 0x80
+	.4byte	.LASF3168
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x132ba
-	.uleb128 0x7e
+	.4byte	0x13382
+	.uleb128 0x7f
 	.4byte	.LASF2935
 	.byte	0x3
 	.byte	0x2b
 	.4byte	0xdb20
 	.byte	0
-	.uleb128 0x7f
-	.4byte	.LASF3165
+	.uleb128 0x80
+	.4byte	.LASF3169
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x132d2
-	.uleb128 0x7e
+	.4byte	0x1339b
+	.uleb128 0x7f
 	.4byte	.LASF2935
 	.byte	0x3
 	.byte	0x26
 	.4byte	0xdb20
 	.byte	0
-	.uleb128 0x7f
-	.4byte	.LASF3166
+	.uleb128 0x80
+	.4byte	.LASF3170
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x132ea
-	.uleb128 0x7e
+	.4byte	0x133b4
+	.uleb128 0x7f
 	.4byte	.LASF2935
 	.byte	0x3
 	.byte	0x21
 	.4byte	0xdb20
 	.byte	0
-	.uleb128 0x7f
-	.4byte	.LASF3167
+	.uleb128 0x80
+	.4byte	.LASF3171
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x13302
-	.uleb128 0x7e
+	.4byte	0x133cd
+	.uleb128 0x7f
 	.4byte	.LASF2935
 	.byte	0x3
 	.byte	0x1c
 	.4byte	0xdb20
 	.byte	0
-	.uleb128 0x7f
-	.4byte	.LASF3168
+	.uleb128 0x80
+	.4byte	.LASF3172
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x1331a
-	.uleb128 0x7e
+	.4byte	0x133e6
+	.uleb128 0x7f
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x1331a
+	.4byte	0x133e6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xd802
-	.uleb128 0x7f
+	.uleb128 0x80
 	.4byte	.LASF2839
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x13338
-	.uleb128 0x7e
+	.4byte	0x13405
+	.uleb128 0x7f
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x1331a
+	.4byte	0x133e6
 	.byte	0
-	.uleb128 0x7f
-	.4byte	.LASF3169
+	.uleb128 0x80
+	.4byte	.LASF3173
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x13370
-	.uleb128 0x7e
+	.4byte	0x1343e
+	.uleb128 0x7f
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x1331a
-	.uleb128 0x7e
+	.4byte	0x133e6
+	.uleb128 0x7f
 	.4byte	.LASF193
 	.byte	0x4
 	.byte	0x24
 	.4byte	0xc6
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF265
 	.byte	0x4
 	.byte	0x25
 	.4byte	0x56
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.string	"ws"
 	.byte	0x4
 	.byte	0x27
 	.4byte	0xad0d
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3170
+	.uleb128 0x7d
+	.4byte	.LASF3174
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1339f
-	.uleb128 0x7d
+	.4byte	0x1346d
+	.uleb128 0x7e
 	.string	"to"
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x458
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF2005
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x30bc
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.string	"n"
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3171
+	.uleb128 0x7d
+	.4byte	.LASF3175
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x133ce
-	.uleb128 0x7d
+	.4byte	0x1349c
+	.uleb128 0x7e
 	.string	"to"
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x458
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF2005
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x30bc
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.string	"n"
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3172
+	.uleb128 0x7d
+	.4byte	.LASF3176
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x133fd
-	.uleb128 0x7d
+	.4byte	0x134cb
+	.uleb128 0x7e
 	.string	"to"
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x458
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF2005
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x30bc
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.string	"n"
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3173
+	.uleb128 0x7d
+	.4byte	.LASF3177
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13437
-	.uleb128 0x7d
+	.4byte	0x13505
+	.uleb128 0x7e
 	.string	"to"
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x458
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF2005
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x30bc
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.string	"n"
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x29
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.string	"res"
 	.byte	0x9
 	.byte	0x70
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3174
+	.uleb128 0x7d
+	.4byte	.LASF3178
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x1346b
-	.uleb128 0x7d
+	.4byte	0x13539
+	.uleb128 0x7e
 	.string	"ptr"
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x30bc
-	.uleb128 0x78
-	.4byte	.LASF3175
+	.uleb128 0x79
+	.4byte	.LASF3179
 	.byte	0x6
 	.byte	0xf7
 	.4byte	0x458
 	.uleb128 0x67
-	.uleb128 0x78
-	.4byte	.LASF3176
+	.uleb128 0x79
+	.4byte	.LASF3180
 	.byte	0x6
 	.byte	0xfe
 	.4byte	0x15a
 	.byte	0
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3177
+	.uleb128 0x7d
+	.4byte	.LASF3181
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x134b5
-	.uleb128 0x7e
+	.4byte	0x13583
+	.uleb128 0x7f
 	.4byte	.LASF1150
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x30bc
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF987
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.string	"ret"
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
-	.uleb128 0x78
-	.4byte	.LASF3178
+	.uleb128 0x79
+	.4byte	.LASF3182
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x67
-	.uleb128 0x78
-	.4byte	.LASF3176
+	.uleb128 0x79
+	.4byte	.LASF3180
 	.byte	0x6
 	.byte	0x56
 	.4byte	0x15a
 	.byte	0
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3179
+	.4byte	.LASF3183
 	.byte	0x12
 	.2byte	0x2e5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x134df
+	.4byte	0x135ad
 	.uleb128 0x65
 	.4byte	.LASF987
 	.byte	0x12
@@ -45067,12 +45246,12 @@ __exitcall_ebc_exit:
 	.4byte	0x330
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3180
+	.4byte	.LASF3184
 	.byte	0x12
 	.2byte	0x216
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x13517
+	.4byte	0x135e5
 	.uleb128 0x65
 	.4byte	.LASF987
 	.byte	0x12
@@ -45092,12 +45271,12 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3181
+	.4byte	.LASF3185
 	.byte	0x12
 	.2byte	0x1dd
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x1354d
+	.4byte	0x1361b
 	.uleb128 0x65
 	.4byte	.LASF987
 	.byte	0x12
@@ -45109,18 +45288,18 @@ __exitcall_ebc_exit:
 	.2byte	0x1dd
 	.4byte	0x330
 	.uleb128 0x46
-	.4byte	.LASF3182
+	.4byte	.LASF3186
 	.byte	0x12
 	.2byte	0x1df
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3183
+	.4byte	.LASF3187
 	.byte	0x12
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x1356b
+	.4byte	0x13639
 	.uleb128 0x65
 	.4byte	.LASF987
 	.byte	0x12
@@ -45128,109 +45307,109 @@ __exitcall_ebc_exit:
 	.4byte	0x2e3
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3184
+	.4byte	.LASF3188
 	.byte	0x12
 	.2byte	0x13d
 	.4byte	0xd7a3
 	.byte	0x3
-	.4byte	0x13589
+	.4byte	0x13657
 	.uleb128 0x65
 	.4byte	.LASF171
 	.byte	0x12
 	.2byte	0x13d
 	.4byte	0x330
 	.byte	0
-	.uleb128 0x7f
-	.4byte	.LASF3185
+	.uleb128 0x80
+	.4byte	.LASF3189
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x135ac
-	.uleb128 0x7e
-	.4byte	.LASF3028
+	.4byte	0x1367b
+	.uleb128 0x7f
+	.4byte	.LASF3032
 	.byte	0xbe
 	.byte	0xdb
 	.4byte	0xd71a
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF794
 	.byte	0xbe
 	.byte	0xdc
 	.4byte	0x458
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3186
+	.uleb128 0x7d
+	.4byte	.LASF3190
 	.byte	0xbe
 	.byte	0xd6
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x135c8
-	.uleb128 0x7e
-	.4byte	.LASF3028
+	.4byte	0x13697
+	.uleb128 0x7f
+	.4byte	.LASF3032
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x135c8
+	.4byte	0x13697
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xd672
 	.uleb128 0x63
-	.4byte	.LASF3187
+	.4byte	.LASF3191
 	.byte	0xa3
 	.2byte	0x164
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x135ec
+	.4byte	0x136bb
 	.uleb128 0x64
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x135ec
+	.4byte	0x136bb
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc0c3
 	.uleb128 0x63
-	.4byte	.LASF3188
+	.4byte	.LASF3192
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13627
+	.4byte	0x136f6
 	.uleb128 0x64
 	.string	"np"
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xbcba
 	.uleb128 0x65
-	.4byte	.LASF3189
+	.4byte	.LASF3193
 	.byte	0xe
 	.2byte	0x499
 	.4byte	0x56
 	.uleb128 0x65
-	.4byte	.LASF3190
+	.4byte	.LASF3194
 	.byte	0xe
 	.2byte	0x49a
 	.4byte	0xac0
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3191
+	.4byte	.LASF3195
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13673
+	.4byte	0x13742
 	.uleb128 0x64
 	.string	"np"
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xbcba
 	.uleb128 0x65
-	.4byte	.LASF3189
+	.4byte	.LASF3193
 	.byte	0xe
 	.2byte	0x1f0
 	.4byte	0x56
 	.uleb128 0x65
-	.4byte	.LASF3192
+	.4byte	.LASF3196
 	.byte	0xe
 	.2byte	0x1f1
 	.4byte	0xac0
@@ -45245,24 +45424,24 @@ __exitcall_ebc_exit:
 	.2byte	0x1f3
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x7f
-	.4byte	.LASF3193
+	.uleb128 0x80
+	.4byte	.LASF3197
 	.byte	0xe
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x1368b
-	.uleb128 0x7e
+	.4byte	0x1375b
+	.uleb128 0x7f
 	.4byte	.LASF868
 	.byte	0xe
 	.byte	0x83
 	.4byte	0xb894
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3194
+	.4byte	.LASF3198
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x136b1
+	.4byte	0x13781
 	.uleb128 0x64
 	.string	"dev"
 	.byte	0x2
@@ -45275,12 +45454,12 @@ __exitcall_ebc_exit:
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3195
+	.4byte	.LASF3199
 	.byte	0x2
 	.2byte	0x49b
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x136cf
+	.4byte	0x1379f
 	.uleb128 0x64
 	.string	"dev"
 	.byte	0x2
@@ -45288,12 +45467,12 @@ __exitcall_ebc_exit:
 	.4byte	0xbb2a
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3196
+	.4byte	.LASF3200
 	.byte	0x2
 	.2byte	0x2c5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x13705
+	.4byte	0x137d5
 	.uleb128 0x64
 	.string	"dev"
 	.byte	0x2
@@ -45310,52 +45489,52 @@ __exitcall_ebc_exit:
 	.2byte	0x2c5
 	.4byte	0x330
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3197
+	.uleb128 0x7d
+	.4byte	.LASF3201
 	.byte	0xf
 	.byte	0xca
 	.4byte	0x351
 	.byte	0x3
-	.4byte	0x13721
-	.uleb128 0x7d
+	.4byte	0x137f1
+	.uleb128 0x7e
 	.string	"res"
 	.byte	0xf
 	.byte	0xca
 	.4byte	0xc1d4
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3198
+	.uleb128 0x7d
+	.4byte	.LASF3202
 	.byte	0xcc
 	.byte	0x22
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x1373d
-	.uleb128 0x7d
+	.4byte	0x1380d
+	.uleb128 0x7e
 	.string	"ptr"
 	.byte	0xcc
 	.byte	0x22
 	.4byte	0x30bc
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3199
+	.uleb128 0x7d
+	.4byte	.LASF3203
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13759
-	.uleb128 0x7e
+	.4byte	0x13829
+	.uleb128 0x7f
 	.4byte	.LASF987
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3200
+	.4byte	.LASF3204
 	.byte	0xd
 	.2byte	0x23e
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x13777
+	.4byte	0x13847
 	.uleb128 0x65
 	.4byte	.LASF2274
 	.byte	0xd
@@ -45363,12 +45542,12 @@ __exitcall_ebc_exit:
 	.4byte	0x3205
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3201
+	.4byte	.LASF3205
 	.byte	0xd
 	.2byte	0x203
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x137a0
+	.4byte	0x13870
 	.uleb128 0x64
 	.string	"wq"
 	.byte	0xd
@@ -45380,30 +45559,30 @@ __exitcall_ebc_exit:
 	.2byte	0x204
 	.4byte	0x3205
 	.byte	0
-	.uleb128 0x7f
-	.4byte	.LASF3202
+	.uleb128 0x80
+	.4byte	.LASF3206
 	.byte	0xd
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x137c3
-	.uleb128 0x7e
+	.4byte	0x13894
+	.uleb128 0x7f
 	.4byte	.LASF2274
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0x3205
-	.uleb128 0x7e
-	.4byte	.LASF3203
+	.uleb128 0x7f
+	.4byte	.LASF3207
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3204
+	.4byte	.LASF3208
 	.byte	0x51
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x137df
+	.4byte	0x138b0
 	.uleb128 0x64
 	.string	"m"
 	.byte	0x51
@@ -45411,106 +45590,106 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3205
+	.4byte	.LASF3209
 	.byte	0x51
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x137fb
+	.4byte	0x138cc
 	.uleb128 0x64
 	.string	"m"
 	.byte	0x51
 	.2byte	0x148
 	.4byte	0x74
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3206
+	.uleb128 0x7d
+	.4byte	.LASF3210
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x13837
-	.uleb128 0x7e
+	.4byte	0x13908
+	.uleb128 0x7f
 	.4byte	.LASF1150
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x30bc
-	.uleb128 0x7e
-	.4byte	.LASF3207
+	.uleb128 0x7f
+	.4byte	.LASF3211
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2e3
-	.uleb128 0x7e
-	.4byte	.LASF3208
+	.uleb128 0x7f
+	.4byte	.LASF3212
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2b0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.string	"sz"
 	.byte	0xca
 	.byte	0x99
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x7f
-	.4byte	.LASF3209
+	.uleb128 0x80
+	.4byte	.LASF3213
 	.byte	0xca
 	.byte	0x91
 	.byte	0x3
-	.4byte	0x13867
-	.uleb128 0x7e
+	.4byte	0x13939
+	.uleb128 0x7f
 	.4byte	.LASF987
 	.byte	0xca
 	.byte	0x91
 	.4byte	0xc6
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF383
 	.byte	0xca
 	.byte	0x91
 	.4byte	0x29
 	.uleb128 0x67
-	.uleb128 0x78
-	.4byte	.LASF3210
+	.uleb128 0x79
+	.4byte	.LASF3214
 	.byte	0xca
 	.byte	0x93
 	.4byte	0xc6
 	.byte	0
 	.byte	0
-	.uleb128 0x7f
-	.4byte	.LASF3211
+	.uleb128 0x80
+	.4byte	.LASF3215
 	.byte	0xca
 	.byte	0x80
 	.byte	0x3
-	.4byte	0x13893
-	.uleb128 0x7d
+	.4byte	0x13966
+	.uleb128 0x7e
 	.string	"ptr"
 	.byte	0xca
 	.byte	0x80
 	.4byte	0x30bc
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.string	"n"
 	.byte	0xca
 	.byte	0x80
 	.4byte	0x29
-	.uleb128 0x7e
-	.4byte	.LASF3212
+	.uleb128 0x7f
+	.4byte	.LASF3216
 	.byte	0xca
 	.byte	0x81
 	.4byte	0x2b0
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3213
+	.uleb128 0x7d
+	.4byte	.LASF3217
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x138b9
-	.uleb128 0x7d
+	.4byte	0x1398c
+	.uleb128 0x7e
 	.string	"ti"
 	.byte	0xca
 	.byte	0x5f
-	.4byte	0x138b9
-	.uleb128 0x7e
-	.4byte	.LASF3214
+	.4byte	0x1398c
+	.uleb128 0x7f
+	.4byte	.LASF3218
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
@@ -45518,26 +45697,26 @@ __exitcall_ebc_exit:
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc33
-	.uleb128 0x7c
-	.4byte	.LASF3215
+	.uleb128 0x7d
+	.4byte	.LASF3219
 	.byte	0x5
 	.byte	0xf
 	.4byte	0x2f05
 	.byte	0x3
-	.4byte	0x138db
-	.uleb128 0x78
-	.4byte	.LASF3216
+	.4byte	0x139ae
+	.uleb128 0x79
+	.4byte	.LASF3220
 	.byte	0x5
 	.byte	0x11
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x7f
-	.4byte	.LASF3217
+	.uleb128 0x80
+	.4byte	.LASF3221
 	.byte	0x10
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x1391f
-	.uleb128 0x7e
+	.4byte	0x139f3
+	.uleb128 0x7f
 	.4byte	.LASF962
 	.byte	0x10
 	.byte	0x1a
@@ -45547,9 +45726,9 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x13912
+	.4byte	0x139e6
 	.uleb128 0x22
-	.4byte	.LASF3095
+	.4byte	.LASF3100
 	.byte	0x10
 	.byte	0x1c
 	.4byte	0x3cc
@@ -45557,187 +45736,187 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x12404
+	.4byte	0x124c6
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.string	"__u"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x138f3
+	.4byte	0x139c7
 	.byte	0
 	.byte	0
-	.uleb128 0x80
-	.4byte	.LASF3296
+	.uleb128 0x81
+	.4byte	.LASF3300
 	.byte	0x20
 	.2byte	0x126
 	.byte	0x3
-	.uleb128 0x7c
-	.4byte	.LASF3218
+	.uleb128 0x7d
+	.4byte	.LASF3222
 	.byte	0xce
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13943
-	.uleb128 0x7d
+	.4byte	0x13a17
+	.uleb128 0x7e
 	.string	"n"
 	.byte	0xce
 	.byte	0x22
 	.4byte	0x15a
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3219
+	.uleb128 0x7d
+	.4byte	.LASF3223
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xe2
 	.byte	0x3
-	.4byte	0x13975
-	.uleb128 0x7e
+	.4byte	0x13a49
+	.uleb128 0x7f
 	.4byte	.LASF2456
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xf4
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF880
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xc6
-	.uleb128 0x78
+	.uleb128 0x79
 	.4byte	.LASF261
 	.byte	0x8
 	.byte	0x9c
 	.4byte	0x8b
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3220
+	.uleb128 0x7d
+	.4byte	.LASF3224
 	.byte	0xcf
 	.byte	0x50
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x1398f
-	.uleb128 0x7d
+	.4byte	0x13a63
+	.uleb128 0x7e
 	.string	"p"
 	.byte	0xcf
 	.byte	0x50
 	.4byte	0xbcc0
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3221
+	.uleb128 0x7d
+	.4byte	.LASF3225
 	.byte	0xd0
 	.byte	0xb8
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x139a9
-	.uleb128 0x7d
+	.4byte	0x13a7d
+	.uleb128 0x7e
 	.string	"p"
 	.byte	0xd0
 	.byte	0xb8
-	.4byte	0x139a9
+	.4byte	0x13a7d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xdd
-	.uleb128 0x7c
-	.4byte	.LASF3222
+	.uleb128 0x7d
+	.4byte	.LASF3226
 	.byte	0xd0
 	.byte	0x39
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x139cb
-	.uleb128 0x7d
+	.4byte	0x13a9f
+	.uleb128 0x7e
 	.string	"val"
 	.byte	0xd0
 	.byte	0x39
 	.4byte	0xd2
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3223
+	.uleb128 0x7d
+	.4byte	.LASF3227
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x139f1
-	.uleb128 0x7d
+	.4byte	0x13ac5
+	.uleb128 0x7e
 	.string	"nr"
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF1150
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x139f1
+	.4byte	0x13ac5
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x3a
-	.uleb128 0x7f
-	.4byte	.LASF3224
+	.uleb128 0x80
+	.4byte	.LASF3228
 	.byte	0x11
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x13a2a
-	.uleb128 0x7d
+	.4byte	0x13aff
+	.uleb128 0x7e
 	.string	"i"
 	.byte	0x11
 	.byte	0x2f
 	.4byte	0xc6
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.string	"v"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13a2a
-	.uleb128 0x7b
+	.4byte	0x13aff
+	.uleb128 0x7c
 	.string	"w0"
 	.byte	0x11
 	.byte	0x2f
 	.4byte	0xc6
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.string	"x1"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13a2a
+	.4byte	0x13aff
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x37c
-	.uleb128 0x7c
-	.4byte	.LASF3225
+	.uleb128 0x7d
+	.4byte	.LASF3229
 	.byte	0xd1
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13a4a
-	.uleb128 0x7d
+	.4byte	0x13b1f
+	.uleb128 0x7e
 	.string	"x"
 	.byte	0xd1
 	.byte	0x1b
 	.4byte	0xf4
 	.byte	0
-	.uleb128 0x7c
-	.4byte	.LASF3226
+	.uleb128 0x7d
+	.4byte	.LASF3230
 	.byte	0xd2
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13a66
-	.uleb128 0x7e
+	.4byte	0x13b3b
+	.uleb128 0x7f
 	.4byte	.LASF2489
 	.byte	0xd2
 	.byte	0xb
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x7f
-	.4byte	.LASF3227
+	.uleb128 0x80
+	.4byte	.LASF3231
 	.byte	0xd3
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x13a87
-	.uleb128 0x7d
+	.4byte	0x13b5d
+	.uleb128 0x7e
 	.string	"p"
 	.byte	0xd3
 	.byte	0xb
-	.4byte	0x13a87
-	.uleb128 0x7e
+	.4byte	0x13b5d
+	.uleb128 0x7f
 	.4byte	.LASF987
 	.byte	0xd3
 	.byte	0xb
@@ -45745,38 +45924,38 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x13a8f
-	.uleb128 0x81
+	.4byte	0x13b65
+	.uleb128 0x82
 	.uleb128 0x3
-	.4byte	0x13a8d
-	.uleb128 0x7f
-	.4byte	.LASF3228
+	.4byte	0x13b63
+	.uleb128 0x80
+	.4byte	.LASF3232
 	.byte	0xd3
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x13ab5
-	.uleb128 0x7d
+	.4byte	0x13b8c
+	.uleb128 0x7e
 	.string	"p"
 	.byte	0xd3
 	.byte	0x9
-	.4byte	0x13a87
-	.uleb128 0x7e
+	.4byte	0x13b5d
+	.uleb128 0x7f
 	.4byte	.LASF987
 	.byte	0xd3
 	.byte	0x9
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x66
-	.4byte	.LASF3229
+	.4byte	.LASF3233
 	.byte	0xc
 	.2byte	0x11a
 	.byte	0x3
-	.4byte	0x13ae5
+	.4byte	0x13bbc
 	.uleb128 0x64
 	.string	"p"
 	.byte	0xc
 	.2byte	0x11a
-	.4byte	0x13ae5
+	.4byte	0x13bbc
 	.uleb128 0x64
 	.string	"res"
 	.byte	0xc
@@ -45790,1040 +45969,1055 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x13a8d
-	.uleb128 0x82
-	.4byte	0x12808
+	.4byte	0x13b63
+	.uleb128 0x83
+	.4byte	0x103ae
+	.8byte	.LFB2835
+	.8byte	.LFE2835-.LFB2835
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x13bef
+	.uleb128 0x6f
+	.4byte	0x103bf
+	.4byte	.LLST10
+	.uleb128 0x71
+	.4byte	0x103cb
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0
+	.uleb128 0x83
+	.4byte	0x128ca
 	.8byte	.LFB2815
 	.8byte	.LFE2815-.LFB2815
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13d6e
+	.4byte	0x13e72
 	.uleb128 0x71
-	.4byte	0x12815
+	.4byte	0x128d7
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x12821
-	.4byte	.LLST102
+	.4byte	0x128e3
+	.4byte	.LLST104
 	.uleb128 0x6f
-	.4byte	0x1282d
-	.4byte	.LLST103
+	.4byte	0x128ef
+	.4byte	.LLST105
 	.uleb128 0x6f
-	.4byte	0x12839
-	.4byte	.LLST104
+	.4byte	0x128fb
+	.4byte	.LLST106
 	.uleb128 0x53
-	.4byte	0x12846
-	.8byte	.LBB1244
-	.8byte	.LBE1244-.LBB1244
+	.4byte	0x12908
+	.8byte	.LBB1242
+	.8byte	.LBE1242-.LBB1242
 	.byte	0x1
-	.2byte	0x388
-	.4byte	0x13c23
+	.2byte	0x38a
+	.4byte	0x13d27
 	.uleb128 0x54
-	.4byte	0x12877
+	.4byte	0x12939
 	.uleb128 0x54
-	.4byte	0x12877
+	.4byte	0x12939
 	.uleb128 0x54
-	.4byte	0x12877
+	.4byte	0x12939
 	.uleb128 0x54
-	.4byte	0x1286b
+	.4byte	0x1292d
 	.uleb128 0x54
-	.4byte	0x1285f
+	.4byte	0x12921
 	.uleb128 0x54
-	.4byte	0x12853
+	.4byte	0x12915
 	.uleb128 0x56
-	.8byte	.LBB1245
-	.8byte	.LBE1245-.LBB1245
+	.8byte	.LBB1243
+	.8byte	.LBE1243-.LBB1243
 	.uleb128 0x57
-	.4byte	0x12883
+	.4byte	0x12945
 	.uleb128 0x60
-	.4byte	0x1288f
-	.4byte	.LLST105
+	.4byte	0x12951
+	.4byte	.LLST107
 	.uleb128 0x57
-	.4byte	0x12899
+	.4byte	0x1295b
 	.uleb128 0x60
-	.4byte	0x128a3
-	.4byte	.LLST106
+	.4byte	0x12965
+	.4byte	.LLST108
 	.uleb128 0x60
-	.4byte	0x128af
-	.4byte	.LLST107
+	.4byte	0x12971
+	.4byte	.LLST109
 	.uleb128 0x60
-	.4byte	0x128bb
-	.4byte	.LLST108
+	.4byte	0x1297d
+	.4byte	.LLST110
 	.uleb128 0x57
-	.4byte	0x128c7
+	.4byte	0x12989
 	.uleb128 0x61
-	.4byte	0x128d3
+	.4byte	0x12995
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x61
-	.4byte	0x128df
+	.4byte	0x129a1
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x60
-	.4byte	0x128eb
-	.4byte	.LLST109
+	.4byte	0x129ad
+	.4byte	.LLST111
 	.uleb128 0x60
-	.4byte	0x128f7
-	.4byte	.LLST110
+	.4byte	0x129b9
+	.4byte	.LLST112
 	.uleb128 0x60
-	.4byte	0x12903
-	.4byte	.LLST111
+	.4byte	0x129c5
+	.4byte	.LLST113
 	.uleb128 0x57
-	.4byte	0x1290f
+	.4byte	0x129d1
 	.uleb128 0x5b
-	.4byte	0x13082
-	.8byte	.LBB1246
+	.4byte	0x13144
+	.8byte	.LBB1244
 	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
-	.2byte	0x37b
-	.4byte	0x13bfd
+	.2byte	0x37d
+	.4byte	0x13d01
 	.uleb128 0x54
-	.4byte	0x130a8
+	.4byte	0x1316a
 	.uleb128 0x54
-	.4byte	0x1309d
+	.4byte	0x1315f
 	.uleb128 0x54
-	.4byte	0x13092
+	.4byte	0x13154
 	.byte	0
 	.uleb128 0x5f
-	.4byte	0x13082
-	.8byte	.LBB1253
+	.4byte	0x13144
+	.8byte	.LBB1251
 	.4byte	.Ldebug_ranges0+0x730
 	.byte	0x1
-	.2byte	0x37c
+	.2byte	0x37e
 	.uleb128 0x54
-	.4byte	0x130a8
+	.4byte	0x1316a
 	.uleb128 0x54
-	.4byte	0x1309d
+	.4byte	0x1315f
 	.uleb128 0x54
-	.4byte	0x13092
+	.4byte	0x13154
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x780
 	.uleb128 0x54
-	.4byte	0x12839
+	.4byte	0x128fb
 	.uleb128 0x54
-	.4byte	0x1282d
+	.4byte	0x128ef
 	.uleb128 0x54
-	.4byte	0x12821
+	.4byte	0x128e3
 	.uleb128 0x54
-	.4byte	0x12815
+	.4byte	0x128d7
 	.uleb128 0x5f
-	.4byte	0x1291c
-	.8byte	.LBB1265
+	.4byte	0x129de
+	.8byte	.LBB1263
 	.4byte	.Ldebug_ranges0+0x780
 	.byte	0x1
-	.2byte	0x386
+	.2byte	0x388
 	.uleb128 0x54
-	.4byte	0x1294d
+	.4byte	0x12a0f
 	.uleb128 0x54
-	.4byte	0x1294d
+	.4byte	0x12a0f
 	.uleb128 0x54
-	.4byte	0x1294d
+	.4byte	0x12a0f
 	.uleb128 0x54
-	.4byte	0x12941
+	.4byte	0x12a03
 	.uleb128 0x54
-	.4byte	0x12935
+	.4byte	0x129f7
 	.uleb128 0x54
-	.4byte	0x12929
+	.4byte	0x129eb
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x780
 	.uleb128 0x57
-	.4byte	0x12959
+	.4byte	0x12a1b
 	.uleb128 0x61
-	.4byte	0x12965
+	.4byte	0x12a27
 	.uleb128 0x1
 	.byte	0x5c
 	.uleb128 0x57
-	.4byte	0x1296f
+	.4byte	0x12a31
 	.uleb128 0x61
-	.4byte	0x12979
+	.4byte	0x12a3b
 	.uleb128 0x1
 	.byte	0x5f
 	.uleb128 0x57
-	.4byte	0x12985
+	.4byte	0x12a47
 	.uleb128 0x60
-	.4byte	0x12991
-	.4byte	.LLST112
+	.4byte	0x12a53
+	.4byte	.LLST114
 	.uleb128 0x60
-	.4byte	0x1299d
-	.4byte	.LLST113
+	.4byte	0x12a5f
+	.4byte	.LLST115
 	.uleb128 0x61
-	.4byte	0x129a9
+	.4byte	0x12a6b
 	.uleb128 0x1
 	.byte	0x59
 	.uleb128 0x61
-	.4byte	0x129b5
+	.4byte	0x12a77
 	.uleb128 0x1
 	.byte	0x5a
 	.uleb128 0x60
-	.4byte	0x129c1
-	.4byte	.LLST114
+	.4byte	0x12a83
+	.4byte	.LLST116
 	.uleb128 0x60
-	.4byte	0x129cd
-	.4byte	.LLST115
+	.4byte	0x12a8f
+	.4byte	.LLST117
 	.uleb128 0x61
-	.4byte	0x129d9
+	.4byte	0x12a9b
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x57
-	.4byte	0x129e5
+	.4byte	0x12aa7
 	.uleb128 0x5b
-	.4byte	0x13082
-	.8byte	.LBB1267
+	.4byte	0x13144
+	.8byte	.LBB1265
 	.4byte	.Ldebug_ranges0+0x7c0
 	.byte	0x1
-	.2byte	0x354
-	.4byte	0x13cf6
+	.2byte	0x356
+	.4byte	0x13dfa
 	.uleb128 0x54
-	.4byte	0x130a8
+	.4byte	0x1316a
 	.uleb128 0x54
-	.4byte	0x1309d
+	.4byte	0x1315f
 	.uleb128 0x54
-	.4byte	0x13092
+	.4byte	0x13154
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13082
-	.8byte	.LBB1272
+	.4byte	0x13144
+	.8byte	.LBB1270
 	.4byte	.Ldebug_ranges0+0x810
 	.byte	0x1
-	.2byte	0x355
-	.4byte	0x13d1e
+	.2byte	0x357
+	.4byte	0x13e22
 	.uleb128 0x54
-	.4byte	0x130a8
+	.4byte	0x1316a
 	.uleb128 0x54
-	.4byte	0x1309d
+	.4byte	0x1315f
 	.uleb128 0x54
-	.4byte	0x13092
+	.4byte	0x13154
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13082
-	.8byte	.LBB1284
+	.4byte	0x13144
+	.8byte	.LBB1282
 	.4byte	.Ldebug_ranges0+0x880
 	.byte	0x1
-	.2byte	0x356
-	.4byte	0x13d46
+	.2byte	0x358
+	.4byte	0x13e4a
 	.uleb128 0x54
-	.4byte	0x130a8
+	.4byte	0x1316a
 	.uleb128 0x54
-	.4byte	0x1309d
+	.4byte	0x1315f
 	.uleb128 0x54
-	.4byte	0x13092
+	.4byte	0x13154
 	.byte	0
 	.uleb128 0x5f
-	.4byte	0x13082
-	.8byte	.LBB1296
+	.4byte	0x13144
+	.8byte	.LBB1294
 	.4byte	.Ldebug_ranges0+0x8f0
 	.byte	0x1
-	.2byte	0x357
+	.2byte	0x359
 	.uleb128 0x54
-	.4byte	0x130a8
+	.4byte	0x1316a
 	.uleb128 0x54
-	.4byte	0x1309d
+	.4byte	0x1315f
 	.uleb128 0x54
-	.4byte	0x13092
+	.4byte	0x13154
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x82
-	.4byte	0x1261e
+	.uleb128 0x83
+	.4byte	0x126e0
 	.8byte	.LFB2818
 	.8byte	.LFE2818-.LFB2818
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x140a3
+	.4byte	0x141a7
 	.uleb128 0x71
-	.4byte	0x1262b
+	.4byte	0x126ed
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x12637
-	.4byte	.LLST116
+	.4byte	0x126f9
+	.4byte	.LLST118
 	.uleb128 0x6f
-	.4byte	0x12643
-	.4byte	.LLST117
+	.4byte	0x12705
+	.4byte	.LLST119
 	.uleb128 0x6f
-	.4byte	0x1264f
-	.4byte	.LLST118
+	.4byte	0x12711
+	.4byte	.LLST120
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x940
-	.4byte	0x13f88
+	.4byte	0x1408c
 	.uleb128 0x54
-	.4byte	0x1264f
+	.4byte	0x12711
 	.uleb128 0x54
-	.4byte	0x12643
+	.4byte	0x12705
 	.uleb128 0x54
-	.4byte	0x12637
+	.4byte	0x126f9
 	.uleb128 0x54
-	.4byte	0x1262b
+	.4byte	0x126ed
 	.uleb128 0x5f
-	.4byte	0x1265c
-	.8byte	.LBB1332
+	.4byte	0x1271e
+	.8byte	.LBB1330
 	.4byte	.Ldebug_ranges0+0x940
 	.byte	0x1
-	.2byte	0x3e4
+	.2byte	0x3e6
 	.uleb128 0x54
-	.4byte	0x1268d
+	.4byte	0x1274f
 	.uleb128 0x54
-	.4byte	0x1268d
+	.4byte	0x1274f
 	.uleb128 0x54
-	.4byte	0x1268d
+	.4byte	0x1274f
 	.uleb128 0x54
-	.4byte	0x12681
+	.4byte	0x12743
 	.uleb128 0x54
-	.4byte	0x12675
+	.4byte	0x12737
 	.uleb128 0x54
-	.4byte	0x12669
+	.4byte	0x1272b
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x940
 	.uleb128 0x57
-	.4byte	0x12699
-	.uleb128 0x60
-	.4byte	0x126a5
-	.4byte	.LLST119
-	.uleb128 0x60
-	.4byte	0x126b1
-	.4byte	.LLST120
+	.4byte	0x1275b
 	.uleb128 0x60
-	.4byte	0x126bd
+	.4byte	0x12767
 	.4byte	.LLST121
 	.uleb128 0x60
-	.4byte	0x126c9
+	.4byte	0x12773
 	.4byte	.LLST122
 	.uleb128 0x60
-	.4byte	0x126d5
+	.4byte	0x1277f
 	.4byte	.LLST123
 	.uleb128 0x60
-	.4byte	0x126e1
+	.4byte	0x1278b
 	.4byte	.LLST124
 	.uleb128 0x60
-	.4byte	0x126ed
+	.4byte	0x12797
 	.4byte	.LLST125
 	.uleb128 0x60
-	.4byte	0x126f9
+	.4byte	0x127a3
 	.4byte	.LLST126
-	.uleb128 0x57
-	.4byte	0x12703
 	.uleb128 0x60
-	.4byte	0x1270d
+	.4byte	0x127af
 	.4byte	.LLST127
 	.uleb128 0x60
-	.4byte	0x12719
+	.4byte	0x127bb
 	.4byte	.LLST128
 	.uleb128 0x57
-	.4byte	0x12725
+	.4byte	0x127c5
+	.uleb128 0x60
+	.4byte	0x127cf
+	.4byte	.LLST129
+	.uleb128 0x60
+	.4byte	0x127db
+	.4byte	.LLST130
+	.uleb128 0x57
+	.4byte	0x127e7
 	.uleb128 0x5b
-	.4byte	0x1303a
-	.8byte	.LBB1334
+	.4byte	0x130fc
+	.8byte	.LBB1332
 	.4byte	.Ldebug_ranges0+0x970
 	.byte	0x1
-	.2byte	0x3d5
-	.4byte	0x13ea5
+	.2byte	0x3d7
+	.4byte	0x13fa9
 	.uleb128 0x54
-	.4byte	0x13060
+	.4byte	0x13122
 	.uleb128 0x54
-	.4byte	0x13055
+	.4byte	0x13117
 	.uleb128 0x54
-	.4byte	0x1304a
+	.4byte	0x1310c
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x970
 	.uleb128 0x57
-	.4byte	0x1306b
+	.4byte	0x1312d
 	.uleb128 0x60
-	.4byte	0x13076
-	.4byte	.LLST129
+	.4byte	0x13138
+	.4byte	.LLST131
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1303a
-	.8byte	.LBB1337
-	.8byte	.LBE1337-.LBB1337
+	.4byte	0x130fc
+	.8byte	.LBB1335
+	.8byte	.LBE1335-.LBB1335
 	.byte	0x1
-	.2byte	0x3d2
-	.4byte	0x13ef1
+	.2byte	0x3d4
+	.4byte	0x13ff5
 	.uleb128 0x54
-	.4byte	0x13060
+	.4byte	0x13122
 	.uleb128 0x54
-	.4byte	0x13055
+	.4byte	0x13117
 	.uleb128 0x54
-	.4byte	0x1304a
+	.4byte	0x1310c
 	.uleb128 0x56
-	.8byte	.LBB1338
-	.8byte	.LBE1338-.LBB1338
+	.8byte	.LBB1336
+	.8byte	.LBE1336-.LBB1336
 	.uleb128 0x57
-	.4byte	0x1306b
+	.4byte	0x1312d
 	.uleb128 0x60
-	.4byte	0x13076
-	.4byte	.LLST130
+	.4byte	0x13138
+	.4byte	.LLST132
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1303a
-	.8byte	.LBB1339
-	.8byte	.LBE1339-.LBB1339
+	.4byte	0x130fc
+	.8byte	.LBB1337
+	.8byte	.LBE1337-.LBB1337
 	.byte	0x1
-	.2byte	0x3d3
-	.4byte	0x13f3d
+	.2byte	0x3d5
+	.4byte	0x14041
 	.uleb128 0x54
-	.4byte	0x13060
+	.4byte	0x13122
 	.uleb128 0x54
-	.4byte	0x13055
+	.4byte	0x13117
 	.uleb128 0x54
-	.4byte	0x1304a
+	.4byte	0x1310c
 	.uleb128 0x56
-	.8byte	.LBB1340
-	.8byte	.LBE1340-.LBB1340
+	.8byte	.LBB1338
+	.8byte	.LBE1338-.LBB1338
 	.uleb128 0x57
-	.4byte	0x1306b
+	.4byte	0x1312d
 	.uleb128 0x60
-	.4byte	0x13076
-	.4byte	.LLST131
+	.4byte	0x13138
+	.4byte	.LLST133
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x1303a
-	.8byte	.LBB1341
-	.8byte	.LBE1341-.LBB1341
+	.4byte	0x130fc
+	.8byte	.LBB1339
+	.8byte	.LBE1339-.LBB1339
 	.byte	0x1
-	.2byte	0x3d4
+	.2byte	0x3d6
 	.uleb128 0x54
-	.4byte	0x13060
+	.4byte	0x13122
 	.uleb128 0x54
-	.4byte	0x13055
+	.4byte	0x13117
 	.uleb128 0x54
-	.4byte	0x1304a
+	.4byte	0x1310c
 	.uleb128 0x56
-	.8byte	.LBB1342
-	.8byte	.LBE1342-.LBB1342
+	.8byte	.LBB1340
+	.8byte	.LBE1340-.LBB1340
 	.uleb128 0x57
-	.4byte	0x1306b
+	.4byte	0x1312d
 	.uleb128 0x60
-	.4byte	0x13076
-	.4byte	.LLST132
+	.4byte	0x13138
+	.4byte	.LLST134
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x12732
-	.8byte	.LBB1346
-	.8byte	.LBE1346-.LBB1346
+	.4byte	0x127f4
+	.8byte	.LBB1344
+	.8byte	.LBE1344-.LBB1344
 	.byte	0x1
-	.2byte	0x3e6
+	.2byte	0x3e8
 	.uleb128 0x54
-	.4byte	0x12763
+	.4byte	0x12825
 	.uleb128 0x54
-	.4byte	0x12763
+	.4byte	0x12825
 	.uleb128 0x54
-	.4byte	0x12763
+	.4byte	0x12825
 	.uleb128 0x54
-	.4byte	0x12757
+	.4byte	0x12819
 	.uleb128 0x54
-	.4byte	0x1274b
+	.4byte	0x1280d
 	.uleb128 0x54
-	.4byte	0x1273f
+	.4byte	0x12801
 	.uleb128 0x56
-	.8byte	.LBB1347
-	.8byte	.LBE1347-.LBB1347
+	.8byte	.LBB1345
+	.8byte	.LBE1345-.LBB1345
 	.uleb128 0x57
-	.4byte	0x1276f
+	.4byte	0x12831
 	.uleb128 0x57
-	.4byte	0x1277b
+	.4byte	0x1283d
 	.uleb128 0x57
-	.4byte	0x12787
+	.4byte	0x12849
 	.uleb128 0x61
-	.4byte	0x12793
+	.4byte	0x12855
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x61
-	.4byte	0x1279f
+	.4byte	0x12861
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x60
-	.4byte	0x127ab
-	.4byte	.LLST133
-	.uleb128 0x60
-	.4byte	0x127b7
-	.4byte	.LLST134
-	.uleb128 0x60
-	.4byte	0x127c3
+	.4byte	0x1286d
 	.4byte	.LLST135
 	.uleb128 0x60
-	.4byte	0x127cf
+	.4byte	0x12879
 	.4byte	.LLST136
-	.uleb128 0x57
-	.4byte	0x127d9
 	.uleb128 0x60
-	.4byte	0x127e3
+	.4byte	0x12885
 	.4byte	.LLST137
 	.uleb128 0x60
-	.4byte	0x127ef
+	.4byte	0x12891
 	.4byte	.LLST138
 	.uleb128 0x57
-	.4byte	0x127fb
+	.4byte	0x1289b
+	.uleb128 0x60
+	.4byte	0x128a5
+	.4byte	.LLST139
+	.uleb128 0x60
+	.4byte	0x128b1
+	.4byte	.LLST140
+	.uleb128 0x57
+	.4byte	0x128bd
 	.uleb128 0x5b
-	.4byte	0x1303a
-	.8byte	.LBB1348
+	.4byte	0x130fc
+	.8byte	.LBB1346
 	.4byte	.Ldebug_ranges0+0x9a0
 	.byte	0x1
-	.2byte	0x3aa
-	.4byte	0x14068
+	.2byte	0x3ac
+	.4byte	0x1416c
 	.uleb128 0x54
-	.4byte	0x13060
+	.4byte	0x13122
 	.uleb128 0x54
-	.4byte	0x13055
+	.4byte	0x13117
 	.uleb128 0x54
-	.4byte	0x1304a
+	.4byte	0x1310c
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x9a0
 	.uleb128 0x57
-	.4byte	0x1306b
+	.4byte	0x1312d
 	.uleb128 0x60
-	.4byte	0x13076
-	.4byte	.LLST139
+	.4byte	0x13138
+	.4byte	.LLST141
 	.byte	0
 	.byte	0
 	.uleb128 0x5f
-	.4byte	0x1303a
-	.8byte	.LBB1355
+	.4byte	0x130fc
+	.8byte	.LBB1353
 	.4byte	.Ldebug_ranges0+0xa10
 	.byte	0x1
-	.2byte	0x3a9
+	.2byte	0x3ab
 	.uleb128 0x54
-	.4byte	0x13060
+	.4byte	0x13122
 	.uleb128 0x54
-	.4byte	0x13055
+	.4byte	0x13117
 	.uleb128 0x54
-	.4byte	0x1304a
+	.4byte	0x1310c
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xa10
 	.uleb128 0x57
-	.4byte	0x1306b
+	.4byte	0x1312d
 	.uleb128 0x60
-	.4byte	0x13076
-	.4byte	.LLST140
+	.4byte	0x13138
+	.4byte	.LLST142
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x83
-	.4byte	0x125e6
-	.8byte	.LFB2861
-	.8byte	.LFE2861-.LFB2861
+	.uleb128 0x84
+	.4byte	0x126a8
+	.8byte	.LFB2863
+	.8byte	.LFE2863-.LFB2863
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x141a6
+	.4byte	0x142aa
 	.uleb128 0x6f
-	.4byte	0x125f3
-	.4byte	.LLST141
+	.4byte	0x126b5
+	.4byte	.LLST143
 	.uleb128 0x54
-	.4byte	0x125ff
+	.4byte	0x126c1
 	.uleb128 0x57
-	.4byte	0x1260b
+	.4byte	0x126cd
 	.uleb128 0x5b
-	.4byte	0x13188
-	.8byte	.LBB1371
+	.4byte	0x1324e
+	.8byte	.LBB1369
 	.4byte	.Ldebug_ranges0+0xa70
 	.byte	0x1
-	.2byte	0x3ed
-	.4byte	0x14124
+	.2byte	0x3ef
+	.4byte	0x14228
 	.uleb128 0x54
-	.4byte	0x131b9
+	.4byte	0x1327f
 	.uleb128 0x54
-	.4byte	0x131ad
+	.4byte	0x13273
 	.uleb128 0x54
-	.4byte	0x131a1
+	.4byte	0x13267
 	.uleb128 0x54
-	.4byte	0x13195
+	.4byte	0x1325b
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xa70
 	.uleb128 0x57
-	.4byte	0x131c5
+	.4byte	0x1328b
 	.uleb128 0x5f
-	.4byte	0x131d2
-	.8byte	.LBB1373
+	.4byte	0x13298
+	.8byte	.LBB1371
 	.4byte	.Ldebug_ranges0+0xac0
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x54
-	.4byte	0x131e3
+	.4byte	0x132a9
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13105
-	.8byte	.LBB1382
+	.4byte	0x131c9
+	.8byte	.LBB1380
 	.4byte	.Ldebug_ranges0+0xaf0
 	.byte	0x1
-	.2byte	0x3ee
-	.4byte	0x14156
+	.2byte	0x3f0
+	.4byte	0x1425a
 	.uleb128 0x54
-	.4byte	0x1313d
+	.4byte	0x13202
 	.uleb128 0x54
-	.4byte	0x13132
+	.4byte	0x131f7
 	.uleb128 0x54
-	.4byte	0x13127
+	.4byte	0x131ec
 	.uleb128 0x54
-	.4byte	0x1311c
+	.4byte	0x131e1
 	.uleb128 0x54
-	.4byte	0x13111
+	.4byte	0x131d6
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x130d7
-	.8byte	.LBB1388
-	.8byte	.LBE1388-.LBB1388
+	.4byte	0x1319a
+	.8byte	.LBB1386
+	.8byte	.LBE1386-.LBB1386
 	.byte	0x1
-	.2byte	0x3ef
-	.4byte	0x14182
+	.2byte	0x3f1
+	.4byte	0x14286
 	.uleb128 0x54
-	.4byte	0x130f9
+	.4byte	0x131bd
 	.uleb128 0x54
-	.4byte	0x130ee
+	.4byte	0x131b2
 	.uleb128 0x54
-	.4byte	0x130e3
+	.4byte	0x131a7
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x130b4
-	.8byte	.LBB1390
-	.8byte	.LBE1390-.LBB1390
+	.4byte	0x13176
+	.8byte	.LBB1388
+	.8byte	.LBE1388-.LBB1388
 	.byte	0x1
-	.2byte	0x3f0
+	.2byte	0x3f2
 	.uleb128 0x54
-	.4byte	0x130cb
+	.4byte	0x1318e
 	.uleb128 0x54
-	.4byte	0x130c0
+	.4byte	0x13183
 	.byte	0
 	.byte	0
-	.uleb128 0x83
-	.4byte	0x13008
-	.8byte	.LFB2862
-	.8byte	.LFE2862-.LFB2862
+	.uleb128 0x84
+	.4byte	0x130ca
+	.8byte	.LFB2864
+	.8byte	.LFE2864-.LFB2864
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14264
+	.4byte	0x14368
 	.uleb128 0x6f
-	.4byte	0x13018
-	.4byte	.LLST144
+	.4byte	0x130da
+	.4byte	.LLST146
 	.uleb128 0x6f
-	.4byte	0x13023
-	.4byte	.LLST145
+	.4byte	0x130e5
+	.4byte	.LLST147
 	.uleb128 0x57
-	.4byte	0x1302e
+	.4byte	0x130f0
 	.uleb128 0x70
-	.4byte	0x13149
-	.8byte	.LBB1418
-	.8byte	.LBE1418-.LBB1418
+	.4byte	0x1320e
+	.8byte	.LBB1416
+	.8byte	.LBE1416-.LBB1416
 	.byte	0x1
-	.byte	0xc6
-	.4byte	0x141fa
+	.byte	0xc8
+	.4byte	0x142fe
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x1321b
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x132d2
-	.8byte	.LBB1420
-	.8byte	.LBE1420-.LBB1420
+	.4byte	0x1339b
+	.8byte	.LBB1418
+	.8byte	.LBE1418-.LBB1418
 	.byte	0x1
-	.byte	0xc7
-	.4byte	0x1421b
+	.byte	0xc9
+	.4byte	0x1431f
 	.uleb128 0x54
-	.4byte	0x132de
+	.4byte	0x133a8
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13302
-	.8byte	.LBB1422
-	.8byte	.LBE1422-.LBB1422
+	.4byte	0x133cd
+	.8byte	.LBB1420
+	.8byte	.LBE1420-.LBB1420
 	.byte	0x1
-	.byte	0xca
-	.4byte	0x14249
+	.byte	0xcc
+	.4byte	0x1434d
 	.uleb128 0x54
-	.4byte	0x1330e
+	.4byte	0x133da
 	.uleb128 0x4e
-	.8byte	.LVL509
-	.4byte	0x145ac
+	.8byte	.LVL513
+	.4byte	0x146b0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL506
-	.4byte	0x1432e
-	.uleb128 0x4e
 	.8byte	.LVL510
-	.4byte	0x1432e
+	.4byte	0x14432
+	.uleb128 0x4e
+	.8byte	.LVL514
+	.4byte	0x14432
 	.byte	0
-	.uleb128 0x83
-	.4byte	0x13008
-	.8byte	.LFB2866
-	.8byte	.LFE2866-.LFB2866
+	.uleb128 0x84
+	.4byte	0x130ca
+	.8byte	.LFB2869
+	.8byte	.LFE2869-.LFB2869
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14316
+	.4byte	0x1441a
 	.uleb128 0x6f
-	.4byte	0x13018
-	.4byte	.LLST172
+	.4byte	0x130da
+	.4byte	.LLST174
 	.uleb128 0x57
-	.4byte	0x1302e
+	.4byte	0x130f0
 	.uleb128 0x54
-	.4byte	0x13023
+	.4byte	0x130e5
 	.uleb128 0x70
-	.4byte	0x132ea
+	.4byte	0x133b4
 	.8byte	.LBB1763
 	.8byte	.LBE1763-.LBB1763
 	.byte	0x1
-	.byte	0xbf
-	.4byte	0x142b4
+	.byte	0xc1
+	.4byte	0x143b8
 	.uleb128 0x54
-	.4byte	0x132f6
+	.4byte	0x133c1
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13161
+	.4byte	0x13227
 	.8byte	.LBB1765
 	.8byte	.LBE1765-.LBB1765
 	.byte	0x1
-	.byte	0xc0
-	.4byte	0x142da
+	.byte	0xc2
+	.4byte	0x143de
 	.uleb128 0x54
-	.4byte	0x1317c
+	.4byte	0x13242
 	.uleb128 0x54
-	.4byte	0x13171
+	.4byte	0x13237
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13320
+	.4byte	0x133ec
 	.8byte	.LBB1767
 	.8byte	.LBE1767-.LBB1767
 	.byte	0x1
-	.byte	0xbc
-	.4byte	0x14308
+	.byte	0xbe
+	.4byte	0x1440c
 	.uleb128 0x54
-	.4byte	0x1332c
+	.4byte	0x133f9
 	.uleb128 0x4e
-	.8byte	.LVL708
-	.4byte	0x14623
+	.8byte	.LVL713
+	.4byte	0x14727
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL705
-	.4byte	0x1432e
+	.8byte	.LVL710
+	.4byte	0x14432
 	.byte	0
-	.uleb128 0x84
-	.4byte	.LASF3230
-	.4byte	.LASF3230
-	.byte	0xbe
-	.byte	0xcc
-	.uleb128 0x84
-	.4byte	.LASF3231
-	.4byte	.LASF3231
-	.byte	0xbe
-	.byte	0xca
-	.uleb128 0x85
-	.4byte	.LASF3232
-	.4byte	.LASF3232
-	.byte	0x2
-	.2byte	0x5d1
-	.uleb128 0x84
-	.4byte	.LASF3233
-	.4byte	.LASF3233
-	.byte	0xac
-	.byte	0x4f
 	.uleb128 0x85
 	.4byte	.LASF3234
 	.4byte	.LASF3234
-	.byte	0x2
-	.2byte	0x2bf
+	.byte	0xbe
+	.byte	0xcc
 	.uleb128 0x85
 	.4byte	.LASF3235
 	.4byte	.LASF3235
-	.byte	0xe
-	.2byte	0x149
-	.uleb128 0x85
+	.byte	0xbe
+	.byte	0xca
+	.uleb128 0x86
 	.4byte	.LASF3236
 	.4byte	.LASF3236
-	.byte	0xe
-	.2byte	0x172
-	.uleb128 0x84
+	.byte	0x2
+	.2byte	0x5d1
+	.uleb128 0x85
 	.4byte	.LASF3237
 	.4byte	.LASF3237
-	.byte	0xd4
-	.byte	0x78
-	.uleb128 0x84
+	.byte	0xac
+	.byte	0x4f
+	.uleb128 0x86
 	.4byte	.LASF3238
 	.4byte	.LASF3238
-	.byte	0xaa
-	.byte	0x59
-	.uleb128 0x84
+	.byte	0x2
+	.2byte	0x2bf
+	.uleb128 0x86
 	.4byte	.LASF3239
 	.4byte	.LASF3239
-	.byte	0xc3
-	.byte	0x30
+	.byte	0xe
+	.2byte	0x149
 	.uleb128 0x86
 	.4byte	.LASF3240
 	.4byte	.LASF3240
-	.uleb128 0x84
-	.4byte	.LASF3240
-	.4byte	.LASF3240
-	.byte	0xd5
-	.byte	0x36
+	.byte	0xe
+	.2byte	0x172
 	.uleb128 0x85
 	.4byte	.LASF3241
 	.4byte	.LASF3241
-	.byte	0x2
-	.2byte	0x5cb
-	.uleb128 0x84
+	.byte	0xd4
+	.byte	0x78
+	.uleb128 0x85
 	.4byte	.LASF3242
 	.4byte	.LASF3242
-	.byte	0xc2
-	.byte	0x30
-	.uleb128 0x84
+	.byte	0xaa
+	.byte	0x59
+	.uleb128 0x85
 	.4byte	.LASF3243
 	.4byte	.LASF3243
-	.byte	0xc2
-	.byte	0x31
-	.uleb128 0x84
+	.byte	0xc3
+	.byte	0x30
+	.uleb128 0x87
 	.4byte	.LASF3244
 	.4byte	.LASF3244
-	.byte	0xab
-	.byte	0x9
 	.uleb128 0x85
+	.4byte	.LASF3244
+	.4byte	.LASF3244
+	.byte	0xd5
+	.byte	0x36
+	.uleb128 0x86
 	.4byte	.LASF3245
 	.4byte	.LASF3245
-	.byte	0x48
-	.2byte	0x6b8
+	.byte	0x2
+	.2byte	0x5cb
 	.uleb128 0x85
 	.4byte	.LASF3246
 	.4byte	.LASF3246
-	.byte	0x48
-	.2byte	0x676
-	.uleb128 0x84
+	.byte	0xc2
+	.byte	0x30
+	.uleb128 0x85
 	.4byte	.LASF3247
 	.4byte	.LASF3247
-	.byte	0x9c
-	.byte	0x67
-	.uleb128 0x84
+	.byte	0xc2
+	.byte	0x31
+	.uleb128 0x85
 	.4byte	.LASF3248
 	.4byte	.LASF3248
-	.byte	0x54
-	.byte	0x53
-	.uleb128 0x84
+	.byte	0xab
+	.byte	0x9
+	.uleb128 0x86
 	.4byte	.LASF3249
 	.4byte	.LASF3249
-	.byte	0x54
-	.byte	0xa5
-	.uleb128 0x84
+	.byte	0x48
+	.2byte	0x6b8
+	.uleb128 0x86
 	.4byte	.LASF3250
 	.4byte	.LASF3250
-	.byte	0xc3
-	.byte	0x2b
-	.uleb128 0x84
+	.byte	0x48
+	.2byte	0x676
+	.uleb128 0x85
 	.4byte	.LASF3251
 	.4byte	.LASF3251
-	.byte	0xc3
-	.byte	0x27
+	.byte	0x9c
+	.byte	0x67
 	.uleb128 0x85
 	.4byte	.LASF3252
 	.4byte	.LASF3252
-	.byte	0x12
-	.2byte	0x184
-	.uleb128 0x84
+	.byte	0x54
+	.byte	0x53
+	.uleb128 0x85
 	.4byte	.LASF3253
 	.4byte	.LASF3253
-	.byte	0xd6
-	.byte	0x51
+	.byte	0x54
+	.byte	0xa5
 	.uleb128 0x85
 	.4byte	.LASF3254
 	.4byte	.LASF3254
-	.byte	0x20
-	.2byte	0x1d9
-	.uleb128 0x84
+	.byte	0xc3
+	.byte	0x2b
+	.uleb128 0x85
 	.4byte	.LASF3255
 	.4byte	.LASF3255
-	.byte	0x3
-	.byte	0x3b
-	.uleb128 0x84
+	.byte	0xc3
+	.byte	0x27
+	.uleb128 0x86
 	.4byte	.LASF3256
 	.4byte	.LASF3256
 	.byte	0x12
-	.byte	0xb9
-	.uleb128 0x84
+	.2byte	0x184
+	.uleb128 0x85
 	.4byte	.LASF3257
 	.4byte	.LASF3257
-	.byte	0x3a
-	.byte	0xc2
+	.byte	0xd6
+	.byte	0x51
 	.uleb128 0x86
 	.4byte	.LASF3258
 	.4byte	.LASF3258
-	.uleb128 0x84
+	.byte	0x20
+	.2byte	0x1d9
+	.uleb128 0x85
 	.4byte	.LASF3259
 	.4byte	.LASF3259
-	.byte	0xac
-	.byte	0x4e
+	.byte	0x3
+	.byte	0x3b
 	.uleb128 0x85
 	.4byte	.LASF3260
 	.4byte	.LASF3260
-	.byte	0x2
-	.2byte	0x287
-	.uleb128 0x84
+	.byte	0x12
+	.byte	0xb9
+	.uleb128 0x85
 	.4byte	.LASF3261
 	.4byte	.LASF3261
-	.byte	0xbf
-	.byte	0x38
-	.uleb128 0x85
+	.byte	0x3a
+	.byte	0xc2
+	.uleb128 0x87
 	.4byte	.LASF3262
 	.4byte	.LASF3262
-	.byte	0xe
-	.2byte	0x165
 	.uleb128 0x85
 	.4byte	.LASF3263
 	.4byte	.LASF3263
-	.byte	0xa3
-	.2byte	0x37b
-	.uleb128 0x85
+	.byte	0xac
+	.byte	0x4e
+	.uleb128 0x86
 	.4byte	.LASF3264
 	.4byte	.LASF3264
-	.byte	0xe
-	.2byte	0x125
-	.uleb128 0x86
+	.byte	0x2
+	.2byte	0x287
+	.uleb128 0x85
 	.4byte	.LASF3265
 	.4byte	.LASF3265
-	.uleb128 0x84
+	.byte	0xbf
+	.byte	0x38
+	.uleb128 0x86
 	.4byte	.LASF3266
 	.4byte	.LASF3266
-	.byte	0xc3
-	.byte	0x2e
-	.uleb128 0x85
+	.byte	0xe
+	.2byte	0x165
+	.uleb128 0x86
 	.4byte	.LASF3267
 	.4byte	.LASF3267
-	.byte	0x20
-	.2byte	0x1c7
-	.uleb128 0x85
+	.byte	0xa3
+	.2byte	0x37b
+	.uleb128 0x86
 	.4byte	.LASF3268
 	.4byte	.LASF3268
-	.byte	0x20
-	.2byte	0x17e
-	.uleb128 0x84
+	.byte	0xe
+	.2byte	0x125
+	.uleb128 0x87
 	.4byte	.LASF3269
 	.4byte	.LASF3269
-	.byte	0x3
-	.byte	0x3a
-	.uleb128 0x84
+	.uleb128 0x85
 	.4byte	.LASF3270
 	.4byte	.LASF3270
-	.byte	0xc2
-	.byte	0x32
-	.uleb128 0x84
+	.byte	0xc3
+	.byte	0x2e
+	.uleb128 0x86
 	.4byte	.LASF3271
 	.4byte	.LASF3271
-	.byte	0xc3
-	.byte	0x2c
-	.uleb128 0x85
+	.byte	0x20
+	.2byte	0x1c7
+	.uleb128 0x86
 	.4byte	.LASF3272
 	.4byte	.LASF3272
-	.byte	0x76
-	.2byte	0xa07
-	.uleb128 0x84
+	.byte	0x20
+	.2byte	0x17e
+	.uleb128 0x85
 	.4byte	.LASF3273
 	.4byte	.LASF3273
-	.byte	0x48
-	.byte	0xdc
+	.byte	0x3
+	.byte	0x3a
 	.uleb128 0x85
 	.4byte	.LASF3274
 	.4byte	.LASF3274
-	.byte	0x3a
-	.2byte	0x459
-	.uleb128 0x84
+	.byte	0xc2
+	.byte	0x32
+	.uleb128 0x86
 	.4byte	.LASF3275
 	.4byte	.LASF3275
-	.byte	0x3a
-	.byte	0xe9
+	.byte	0x76
+	.2byte	0xa07
 	.uleb128 0x85
 	.4byte	.LASF3276
 	.4byte	.LASF3276
-	.byte	0x3a
-	.2byte	0x45a
+	.byte	0xc3
+	.byte	0x2c
 	.uleb128 0x85
 	.4byte	.LASF3277
 	.4byte	.LASF3277
-	.byte	0x6
-	.2byte	0x19f
-	.uleb128 0x85
+	.byte	0x48
+	.byte	0xdc
+	.uleb128 0x86
 	.4byte	.LASF3278
 	.4byte	.LASF3278
-	.byte	0x6
-	.2byte	0x199
-	.uleb128 0x84
+	.byte	0x3a
+	.2byte	0x459
+	.uleb128 0x85
 	.4byte	.LASF3279
 	.4byte	.LASF3279
-	.byte	0xc3
-	.byte	0x25
-	.uleb128 0x84
+	.byte	0x3a
+	.byte	0xe9
+	.uleb128 0x86
 	.4byte	.LASF3280
 	.4byte	.LASF3280
-	.byte	0xc3
-	.byte	0x2a
-	.uleb128 0x84
+	.byte	0x3a
+	.2byte	0x45a
+	.uleb128 0x86
 	.4byte	.LASF3281
 	.4byte	.LASF3281
-	.byte	0xc3
-	.byte	0x24
-	.uleb128 0x84
+	.byte	0x6
+	.2byte	0x19f
+	.uleb128 0x86
 	.4byte	.LASF3282
 	.4byte	.LASF3282
-	.byte	0xc3
-	.byte	0x23
-	.uleb128 0x84
+	.byte	0x6
+	.2byte	0x199
+	.uleb128 0x85
 	.4byte	.LASF3283
 	.4byte	.LASF3283
-	.byte	0x9c
-	.byte	0x73
-	.uleb128 0x84
+	.byte	0xc3
+	.byte	0x25
+	.uleb128 0x85
 	.4byte	.LASF3284
 	.4byte	.LASF3284
 	.byte	0xc3
-	.byte	0x29
-	.uleb128 0x84
+	.byte	0x2a
+	.uleb128 0x85
 	.4byte	.LASF3285
 	.4byte	.LASF3285
-	.byte	0x72
-	.byte	0x88
-	.uleb128 0x84
+	.byte	0xc3
+	.byte	0x24
+	.uleb128 0x85
 	.4byte	.LASF3286
 	.4byte	.LASF3286
-	.byte	0x72
-	.byte	0x98
-	.uleb128 0x84
+	.byte	0xc3
+	.byte	0x23
+	.uleb128 0x85
 	.4byte	.LASF3287
 	.4byte	.LASF3287
-	.byte	0xc3
-	.byte	0x26
-	.uleb128 0x84
+	.byte	0x9c
+	.byte	0x73
+	.uleb128 0x85
 	.4byte	.LASF3288
 	.4byte	.LASF3288
-	.byte	0xc4
-	.byte	0x68
-	.uleb128 0x84
+	.byte	0xc3
+	.byte	0x29
+	.uleb128 0x85
 	.4byte	.LASF3289
 	.4byte	.LASF3289
-	.byte	0xc2
-	.byte	0x33
+	.byte	0x72
+	.byte	0x88
 	.uleb128 0x85
 	.4byte	.LASF3290
 	.4byte	.LASF3290
+	.byte	0x72
+	.byte	0x98
+	.uleb128 0x85
+	.4byte	.LASF3291
+	.4byte	.LASF3291
+	.byte	0xc3
+	.byte	0x26
+	.uleb128 0x85
+	.4byte	.LASF3292
+	.4byte	.LASF3292
+	.byte	0xc4
+	.byte	0x68
+	.uleb128 0x85
+	.4byte	.LASF3293
+	.4byte	.LASF3293
+	.byte	0xc2
+	.byte	0x33
+	.uleb128 0x86
+	.4byte	.LASF3294
+	.4byte	.LASF3294
 	.byte	0xd
 	.2byte	0x1d6
-	.uleb128 0x87
+	.uleb128 0x88
 	.string	"up"
 	.string	"up"
 	.byte	0x78
 	.byte	0x2c
-	.uleb128 0x84
-	.4byte	.LASF3291
-	.4byte	.LASF3291
+	.uleb128 0x85
+	.4byte	.LASF3295
+	.4byte	.LASF3295
 	.byte	0x78
 	.byte	0x27
-	.uleb128 0x84
-	.4byte	.LASF3292
-	.4byte	.LASF3292
+	.uleb128 0x85
+	.4byte	.LASF3296
+	.4byte	.LASF3296
 	.byte	0x9c
 	.byte	0x71
 	.byte	0
@@ -48191,18 +48385,20 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x6a
-	.uleb128 0x5
-	.byte	0
+	.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 0x2
-	.uleb128 0x18
+	.uleb128 0x1
+	.uleb128 0x13
 	.byte	0
 	.byte	0
 	.uleb128 0x6b
@@ -48315,6 +48511,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x74
+	.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 0x75
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3f
@@ -48339,7 +48550,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x75
+	.uleb128 0x76
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3f
@@ -48364,7 +48575,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x76
+	.uleb128 0x77
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -48379,7 +48590,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x18
 	.byte	0
 	.byte	0
-	.uleb128 0x77
+	.uleb128 0x78
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -48394,7 +48605,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x78
+	.uleb128 0x79
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -48407,7 +48618,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x79
+	.uleb128 0x7a
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -48422,7 +48633,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x7a
+	.uleb128 0x7b
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -48437,7 +48648,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x18
 	.byte	0
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -48450,7 +48661,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x7c
+	.uleb128 0x7d
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -48469,7 +48680,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -48482,7 +48693,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -48495,7 +48706,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x7f
+	.uleb128 0x80
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -48512,7 +48723,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x80
+	.uleb128 0x81
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3
@@ -48527,12 +48738,12 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x81
+	.uleb128 0x82
 	.uleb128 0x35
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x82
+	.uleb128 0x83
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x31
@@ -48549,7 +48760,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x83
+	.uleb128 0x84
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x31
@@ -48566,7 +48777,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x84
+	.uleb128 0x85
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -48583,7 +48794,7 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x85
+	.uleb128 0x86
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -48600,7 +48811,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x5
 	.byte	0
 	.byte	0
-	.uleb128 0x86
+	.uleb128 0x87
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -48613,7 +48824,7 @@ __exitcall_ebc_exit:
 	.uleb128 0xe
 	.byte	0
 	.byte	0
-	.uleb128 0x87
+	.uleb128 0x88
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -48640,9 +48851,9 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST146:
-	.8byte	.LVL512
-	.8byte	.LVL513
+.LLST148:
+	.8byte	.LVL516
+	.8byte	.LVL517
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -48654,793 +48865,800 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST147:
-	.8byte	.LVL518
-	.8byte	.LVL519
+.LLST149:
+	.8byte	.LVL522
+	.8byte	.LVL523
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST148:
-	.8byte	.LVL522
-	.8byte	.LVL523
+.LLST150:
+	.8byte	.LVL526
+	.8byte	.LVL527
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL534
-	.8byte	.LVL535
+	.8byte	.LVL538
+	.8byte	.LVL539
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL667
-	.8byte	.LVL668
+	.8byte	.LVL672
+	.8byte	.LVL673
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST149:
-	.8byte	.LVL530
-	.8byte	.LVL531
+.LLST151:
+	.8byte	.LVL534
+	.8byte	.LVL535
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL582
-	.8byte	.LVL583
+	.8byte	.LVL586
+	.8byte	.LVL587
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST150:
-	.8byte	.LVL534
-	.8byte	.LVL536
+.LLST152:
+	.8byte	.LVL538
+	.8byte	.LVL540
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL543
-	.8byte	.LVL582
+	.8byte	.LVL547
+	.8byte	.LVL586
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL587
-	.8byte	.LVL667
+	.8byte	.LVL591
+	.8byte	.LVL672
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL668
-	.8byte	.LVL674
+	.8byte	.LVL673
+	.8byte	.LVL679
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL677
-	.8byte	.LVL686
+	.8byte	.LVL682
+	.8byte	.LVL691
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL688
-	.8byte	.LFE2848
+	.8byte	.LVL693
+	.8byte	.LFE2850
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST151:
-	.8byte	.LVL525
-	.8byte	.LVL537
+.LLST153:
+	.8byte	.LVL529
+	.8byte	.LVL541
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL541
-	.8byte	.LVL544
+	.8byte	.LVL545
+	.8byte	.LVL548
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL582
-	.8byte	.LVL587
+	.8byte	.LVL586
+	.8byte	.LVL591
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL675
-	.8byte	.LVL677
+	.8byte	.LVL680
+	.8byte	.LVL682
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL695
-	.8byte	.LVL696
+	.8byte	.LVL700
+	.8byte	.LVL701
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST152:
-	.8byte	.LVL525
-	.8byte	.LVL526
+.LLST154:
+	.8byte	.LVL529
+	.8byte	.LVL530
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL526
-	.8byte	.LVL527
+	.8byte	.LVL530
+	.8byte	.LVL531
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL528
 	.8byte	.LVL532
+	.8byte	.LVL536
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL532
-	.8byte	.LVL585
+	.8byte	.LVL536
+	.8byte	.LVL589
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL585
-	.8byte	.LVL667
+	.8byte	.LVL589
+	.8byte	.LVL672
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL668
-	.8byte	.LVL674
+	.8byte	.LVL673
+	.8byte	.LVL679
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL675
-	.8byte	.LVL686
+	.8byte	.LVL680
+	.8byte	.LVL691
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
-	.8byte	.LVL688
-	.8byte	.LFE2848
+	.8byte	.LVL693
+	.8byte	.LFE2850
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -32
 	.8byte	0
 	.8byte	0
-.LLST153:
-	.8byte	.LVL529
-	.8byte	.LVL536
+.LLST155:
+	.8byte	.LVL533
+	.8byte	.LVL540
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL541
-	.8byte	.LVL543
+	.8byte	.LVL545
+	.8byte	.LVL547
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL582
-	.8byte	.LVL587
+	.8byte	.LVL586
+	.8byte	.LVL591
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL695
-	.8byte	.LVL696
+	.8byte	.LVL700
+	.8byte	.LVL701
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST154:
-	.8byte	.LVL534
-	.8byte	.LVL539
+.LLST156:
+	.8byte	.LVL538
+	.8byte	.LVL543
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL565
-	.8byte	.LVL576
+	.8byte	.LVL569
+	.8byte	.LVL580
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL587
-	.8byte	.LVL590
+	.8byte	.LVL591
+	.8byte	.LVL594
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL668
-	.8byte	.LVL669
+	.8byte	.LVL673
+	.8byte	.LVL674
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL688
-	.8byte	.LVL689
+	.8byte	.LVL693
+	.8byte	.LVL694
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL695
-	.8byte	.LVL696
+	.8byte	.LVL700
+	.8byte	.LVL701
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST155:
-	.8byte	.LVL534
-	.8byte	.LVL539
+.LLST157:
+	.8byte	.LVL538
+	.8byte	.LVL543
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL576
 	.8byte	.LVL580
+	.8byte	.LVL584
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL590
-	.8byte	.LVL591
+	.8byte	.LVL594
+	.8byte	.LVL595
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL689
-	.8byte	.LVL690
+	.8byte	.LVL694
+	.8byte	.LVL695
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL695
-	.8byte	.LVL696
+	.8byte	.LVL700
+	.8byte	.LVL701
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST156:
-	.8byte	.LVL591
-	.8byte	.LVL592-1
+.LLST158:
+	.8byte	.LVL595
+	.8byte	.LVL596-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST157:
-	.8byte	.LVL596
-	.8byte	.LVL599
+.LLST159:
+	.8byte	.LVL600
+	.8byte	.LVL603
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST158:
-	.8byte	.LVL597
-	.8byte	.LVL598
+.LLST160:
+	.8byte	.LVL601
+	.8byte	.LVL602
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST159:
-	.8byte	.LVL534
+.LLST161:
 	.8byte	.LVL538
+	.8byte	.LVL542
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL601
-	.8byte	.LVL609
+	.8byte	.LVL605
+	.8byte	.LVL613
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL681
-	.8byte	.LVL683
+	.8byte	.LVL686
+	.8byte	.LVL688
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL683
-	.8byte	.LVL684
+	.8byte	.LVL688
+	.8byte	.LVL689
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL684
-	.8byte	.LVL686
+	.8byte	.LVL689
+	.8byte	.LVL691
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL695
-	.8byte	.LVL696
+	.8byte	.LVL700
+	.8byte	.LVL701
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST160:
-	.8byte	.LVL604
-	.8byte	.LVL607
+.LLST162:
+	.8byte	.LVL608
+	.8byte	.LVL611
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST161:
-	.8byte	.LVL605
-	.8byte	.LVL606
+.LLST163:
+	.8byte	.LVL609
+	.8byte	.LVL610
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST162:
-	.8byte	.LVL608
-	.8byte	.LVL610-1
+.LLST164:
+	.8byte	.LVL612
+	.8byte	.LVL614-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST163:
-	.8byte	.LVL534
-	.8byte	.LVL541
+.LLST165:
+	.8byte	.LVL538
+	.8byte	.LVL545
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL615
-	.8byte	.LVL652
+	.8byte	.LVL619
+	.8byte	.LVL657
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL652
-	.8byte	.LVL653
+	.8byte	.LVL657
+	.8byte	.LVL658
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL656
-	.8byte	.LVL667
+	.8byte	.LVL661
+	.8byte	.LVL672
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL669
 	.8byte	.LVL674
+	.8byte	.LVL679
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL690
-	.8byte	.LVL693
+	.8byte	.LVL695
+	.8byte	.LVL698
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL695
-	.8byte	.LVL696
+	.8byte	.LVL700
+	.8byte	.LVL701
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL698
-	.8byte	.LFE2848
+	.8byte	.LVL703
+	.8byte	.LFE2850
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
 	.8byte	0
 	.8byte	0
-.LLST164:
-	.8byte	.LVL534
-	.8byte	.LVL541
+.LLST166:
+	.8byte	.LVL538
+	.8byte	.LVL545
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL615
-	.8byte	.LVL664
+	.8byte	.LVL619
+	.8byte	.LVL669
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL664
-	.8byte	.LVL665
+	.8byte	.LVL669
+	.8byte	.LVL670
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL669
 	.8byte	.LVL674
+	.8byte	.LVL679
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL690
-	.8byte	.LVL693
+	.8byte	.LVL695
+	.8byte	.LVL698
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL695
-	.8byte	.LFE2848
+	.8byte	.LVL700
+	.8byte	.LFE2850
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
 	.8byte	0
 	.8byte	0
-.LLST165:
-	.8byte	.LVL534
+.LLST167:
 	.8byte	.LVL538
+	.8byte	.LVL542
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL621
-	.8byte	.LVL632
-	.2byte	0x1
-	.byte	0x68
+	.8byte	.LVL625
 	.8byte	.LVL636
-	.8byte	.LVL646
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL656
-	.8byte	.LVL658
+	.8byte	.LVL640
+	.8byte	.LVL651
 	.2byte	0x1
 	.byte	0x68
 	.8byte	.LVL661
-	.8byte	.LVL667
+	.8byte	.LVL663
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL690
-	.8byte	.LVL693
+	.8byte	.LVL666
+	.8byte	.LVL672
 	.2byte	0x1
 	.byte	0x68
 	.8byte	.LVL695
-	.8byte	.LVL696
+	.8byte	.LVL698
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL697
-	.8byte	.LVL698
+	.8byte	.LVL700
+	.8byte	.LVL701
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL702
+	.8byte	.LVL703
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST166:
-	.8byte	.LVL534
-	.8byte	.LVL540
+.LLST168:
+	.8byte	.LVL538
+	.8byte	.LVL544
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL626
-	.8byte	.LVL648
+	.8byte	.LVL630
+	.8byte	.LVL653
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL655
-	.8byte	.LVL667
+	.8byte	.LVL660
+	.8byte	.LVL672
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL669
 	.8byte	.LVL674
+	.8byte	.LVL679
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL690
-	.8byte	.LVL693
+	.8byte	.LVL695
+	.8byte	.LVL698
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL695
-	.8byte	.LVL696
+	.8byte	.LVL700
+	.8byte	.LVL701
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST167:
-	.8byte	.LVL534
-	.8byte	.LVL539
+.LLST169:
+	.8byte	.LVL538
+	.8byte	.LVL543
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL617
-	.8byte	.LVL623
+	.8byte	.LVL621
+	.8byte	.LVL627
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL624
-	.8byte	.LVL627
+	.8byte	.LVL628
+	.8byte	.LVL631
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL636
-	.8byte	.LVL646
+	.8byte	.LVL640
+	.8byte	.LVL651
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL648
-	.8byte	.LVL656
+	.8byte	.LVL653
+	.8byte	.LVL661
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL695
-	.8byte	.LFE2848
+	.8byte	.LVL700
+	.8byte	.LFE2850
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST168:
-	.8byte	.LVL534
-	.8byte	.LVL540
+.LLST170:
+	.8byte	.LVL538
+	.8byte	.LVL544
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL619
-	.8byte	.LVL626
+	.8byte	.LVL623
+	.8byte	.LVL630
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL628
-	.8byte	.LVL655
+	.8byte	.LVL632
+	.8byte	.LVL660
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL669
 	.8byte	.LVL674
+	.8byte	.LVL679
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL695
-	.8byte	.LFE2848
+	.8byte	.LVL700
+	.8byte	.LFE2850
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST169:
-	.8byte	.LVL534
-	.8byte	.LVL540
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL622
-	.8byte	.LVL648
+.LLST171:
+	.8byte	.LVL538
+	.8byte	.LVL544
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL651
-	.8byte	.LVL667
+	.8byte	.LVL626
+	.8byte	.LVL653
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL669
-	.8byte	.LVL674
+	.8byte	.LVL656
+	.8byte	.LVL672
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL690
-	.8byte	.LVL693
+	.8byte	.LVL674
+	.8byte	.LVL679
 	.2byte	0x1
 	.byte	0x6b
 	.8byte	.LVL695
 	.8byte	.LVL698
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL698
-	.8byte	.LVL699
+	.8byte	.LVL700
+	.8byte	.LVL703
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL703
+	.8byte	.LVL704
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL699
-	.8byte	.LFE2848
+	.8byte	.LVL704
+	.8byte	.LFE2850
 	.2byte	0x1
 	.byte	0x6b
 	.8byte	0
 	.8byte	0
-.LLST170:
-	.8byte	.LVL534
-	.8byte	.LVL539
+.LLST172:
+	.8byte	.LVL538
+	.8byte	.LVL543
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL623
-	.8byte	.LVL648
+	.8byte	.LVL627
+	.8byte	.LVL653
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL656
-	.8byte	.LVL667
+	.8byte	.LVL661
+	.8byte	.LVL672
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL669
 	.8byte	.LVL674
+	.8byte	.LVL679
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL690
-	.8byte	.LVL691
+	.8byte	.LVL695
+	.8byte	.LVL696
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL691
-	.8byte	.LVL693
+	.8byte	.LVL696
+	.8byte	.LVL698
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL695
-	.8byte	.LVL696
+	.8byte	.LVL700
+	.8byte	.LVL701
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST171:
-	.8byte	.LVL534
+.LLST173:
 	.8byte	.LVL538
+	.8byte	.LVL542
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL632
-	.8byte	.LVL648
+	.8byte	.LVL636
+	.8byte	.LVL653
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL669
-	.8byte	.LVL671
+	.8byte	.LVL674
+	.8byte	.LVL676
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL695
-	.8byte	.LVL696
+	.8byte	.LVL700
+	.8byte	.LVL701
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST75:
-	.8byte	.LVL298
-	.8byte	.LVL299
+.LLST77:
+	.8byte	.LVL302
+	.8byte	.LVL303
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST76:
-	.8byte	.LVL298
-	.8byte	.LVL300-1
+.LLST78:
+	.8byte	.LVL302
+	.8byte	.LVL304-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST77:
-	.8byte	.LVL298
-	.8byte	.LVL300-1
+.LLST79:
+	.8byte	.LVL302
+	.8byte	.LVL304-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST78:
-	.8byte	.LVL301
-	.8byte	.LVL302
+.LLST80:
+	.8byte	.LVL305
+	.8byte	.LVL306
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST79:
-	.8byte	.LVL301
-	.8byte	.LVL303
+.LLST81:
+	.8byte	.LVL305
+	.8byte	.LVL307
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST80:
-	.8byte	.LVL301
-	.8byte	.LVL304
+.LLST82:
+	.8byte	.LVL305
+	.8byte	.LVL308
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL304
-	.8byte	.LVL305-1
+	.8byte	.LVL308
+	.8byte	.LVL309-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST81:
-	.8byte	.LVL306
-	.8byte	.LVL307
+.LLST83:
+	.8byte	.LVL310
+	.8byte	.LVL311
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST82:
-	.8byte	.LVL306
-	.8byte	.LVL308
+.LLST84:
+	.8byte	.LVL310
+	.8byte	.LVL312
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST83:
-	.8byte	.LVL306
-	.8byte	.LVL309
+.LLST85:
+	.8byte	.LVL310
+	.8byte	.LVL313
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL309
-	.8byte	.LVL310-1
+	.8byte	.LVL313
+	.8byte	.LVL314-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST93:
-	.8byte	.LVL331
-	.8byte	.LVL332
+.LLST95:
+	.8byte	.LVL335
+	.8byte	.LVL336
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST94:
-	.8byte	.LVL331
-	.8byte	.LVL333
+.LLST96:
+	.8byte	.LVL335
+	.8byte	.LVL337
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST95:
-	.8byte	.LVL331
+.LLST97:
 	.8byte	.LVL335
+	.8byte	.LVL339
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL335
-	.8byte	.LVL340
+	.8byte	.LVL339
+	.8byte	.LVL344
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL341
-	.8byte	.LFE2838
+	.8byte	.LVL345
+	.8byte	.LFE2840
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST96:
-	.8byte	.LVL331
-	.8byte	.LVL336-1
+.LLST98:
+	.8byte	.LVL335
+	.8byte	.LVL340-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL336-1
-	.8byte	.LVL339
+	.8byte	.LVL340-1
+	.8byte	.LVL343
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL341
-	.8byte	.LVL342
+	.8byte	.LVL345
+	.8byte	.LVL346
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL344
-	.8byte	.LVL345
+	.8byte	.LVL348
+	.8byte	.LVL349
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST97:
-	.8byte	.LVL334
-	.8byte	.LVL340
+.LLST99:
+	.8byte	.LVL338
+	.8byte	.LVL344
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL341
-	.8byte	.LFE2838
+	.8byte	.LVL345
+	.8byte	.LFE2840
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST98:
-	.8byte	.LVL337
+.LLST100:
 	.8byte	.LVL341
+	.8byte	.LVL345
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
-	.8byte	.LVL344
-	.8byte	.LFE2838
+	.8byte	.LVL348
+	.8byte	.LFE2840
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
 	.8byte	0
 	.8byte	0
-.LLST84:
-	.8byte	.LVL311
-	.8byte	.LVL312
+.LLST86:
+	.8byte	.LVL315
+	.8byte	.LVL316
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST85:
-	.8byte	.LVL311
-	.8byte	.LVL313
+.LLST87:
+	.8byte	.LVL315
+	.8byte	.LVL317
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST86:
-	.8byte	.LVL311
-	.8byte	.LVL314-1
+.LLST88:
+	.8byte	.LVL315
+	.8byte	.LVL318-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL314-1
-	.8byte	.LVL316
+	.8byte	.LVL318-1
+	.8byte	.LVL320
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST87:
-	.8byte	.LVL317
-	.8byte	.LVL318
+.LLST89:
+	.8byte	.LVL321
+	.8byte	.LVL322
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST88:
-	.8byte	.LVL317
-	.8byte	.LVL319
+.LLST90:
+	.8byte	.LVL321
+	.8byte	.LVL323
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST89:
-	.8byte	.LVL317
-	.8byte	.LVL320
+.LLST91:
+	.8byte	.LVL321
+	.8byte	.LVL324
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL320
-	.8byte	.LVL323
+	.8byte	.LVL324
+	.8byte	.LVL327
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL324
-	.8byte	.LFE2836
+	.8byte	.LVL328
+	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST90:
-	.8byte	.LVL326
-	.8byte	.LVL327
+.LLST92:
+	.8byte	.LVL330
+	.8byte	.LVL331
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST91:
-	.8byte	.LVL326
-	.8byte	.LVL328
+.LLST93:
+	.8byte	.LVL330
+	.8byte	.LVL332
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST92:
-	.8byte	.LVL326
-	.8byte	.LVL329
+.LLST94:
+	.8byte	.LVL330
+	.8byte	.LVL333
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL329
-	.8byte	.LVL330-1
+	.8byte	.LVL333
+	.8byte	.LVL334-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST99:
-	.8byte	.LVL348
-	.8byte	.LVL349-1
+.LLST101:
+	.8byte	.LVL352
+	.8byte	.LVL353-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST100:
-	.8byte	.LVL348
-	.8byte	.LVL349-1
+.LLST102:
+	.8byte	.LVL352
+	.8byte	.LVL353-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST101:
-	.8byte	.LVL348
-	.8byte	.LVL349-1
+.LLST103:
+	.8byte	.LVL352
+	.8byte	.LVL353-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL349-1
-	.8byte	.LVL351
+	.8byte	.LVL353-1
+	.8byte	.LVL355
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST10:
-	.8byte	.LVL62
-	.8byte	.LVL63
+.LLST16:
+	.8byte	.LVL79
+	.8byte	.LVL80
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
+.LLST17:
+	.8byte	.LVL79
+	.8byte	.LVL81
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
 .LLST14:
 	.8byte	.LVL75
 	.8byte	.LVL76-1
@@ -49459,701 +49677,701 @@ __exitcall_ebc_exit:
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST16:
-	.8byte	.LVL79
-	.8byte	.LVL80
+.LLST18:
+	.8byte	.LVL83
+	.8byte	.LVL84
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST17:
-	.8byte	.LVL79
-	.8byte	.LVL81-1
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL95
-	.8byte	.LVL96
+.LLST19:
+	.8byte	.LVL83
+	.8byte	.LVL85-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL98
 	.8byte	.LVL99
+	.8byte	.LVL100
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL104
-	.8byte	.LVL106
+	.8byte	.LVL102
+	.8byte	.LVL103
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL126
-	.8byte	.LVL127-1
+	.8byte	.LVL108
+	.8byte	.LVL110
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL128
 	.8byte	.LVL130
+	.8byte	.LVL131-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL152
-	.8byte	.LVL153-1
+	.8byte	.LVL132
+	.8byte	.LVL134
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL168
-	.8byte	.LVL170
+	.8byte	.LVL156
+	.8byte	.LVL157-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL182
-	.8byte	.LVL183
+	.8byte	.LVL172
+	.8byte	.LVL174
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL185
-	.8byte	.LVL186-1
+	.8byte	.LVL186
+	.8byte	.LVL187
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL187
-	.8byte	.LVL188-1
+	.8byte	.LVL189
+	.8byte	.LVL190-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL193
-	.8byte	.LVL195
+	.8byte	.LVL191
+	.8byte	.LVL192-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL204
-	.8byte	.LVL205
+	.8byte	.LVL197
+	.8byte	.LVL199
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL207
-	.8byte	.LVL208-1
+	.8byte	.LVL208
+	.8byte	.LVL209
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL211
+	.8byte	.LVL212-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST18:
-	.8byte	.LVL79
-	.8byte	.LVL95
+.LLST20:
+	.8byte	.LVL83
+	.8byte	.LVL99
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL95
-	.8byte	.LVL103
+	.8byte	.LVL99
+	.8byte	.LVL107
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL104
-	.8byte	.LVL119
+	.8byte	.LVL108
+	.8byte	.LVL123
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL125
-	.8byte	.LVL250
+	.8byte	.LVL129
+	.8byte	.LVL254
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL252
+	.8byte	.LVL256
 	.8byte	.LFE2831
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST33:
-	.8byte	.LVL100
-	.8byte	.LVL101
+.LLST35:
+	.8byte	.LVL104
+	.8byte	.LVL105
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL122
-	.8byte	.LVL123-1
+	.8byte	.LVL126
+	.8byte	.LVL127-1
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL125
-	.8byte	.LVL126
+	.8byte	.LVL129
+	.8byte	.LVL130
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST19:
-	.8byte	.LVL88
-	.8byte	.LVL90
+.LLST21:
+	.8byte	.LVL92
+	.8byte	.LVL94
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL91
-	.8byte	.LVL92
+	.8byte	.LVL95
+	.8byte	.LVL96
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST20:
-	.8byte	.LVL91
-	.8byte	.LVL93
+.LLST22:
+	.8byte	.LVL95
+	.8byte	.LVL97
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL144
-	.8byte	.LVL146
+	.8byte	.LVL148
+	.8byte	.LVL150
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST21:
-	.8byte	.LVL85
-	.8byte	.LVL94-1
+.LLST23:
+	.8byte	.LVL89
+	.8byte	.LVL98-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL144
-	.8byte	.LVL145
+	.8byte	.LVL148
+	.8byte	.LVL149
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST22:
-	.8byte	.LVL84
-	.8byte	.LVL87
+.LLST24:
+	.8byte	.LVL88
+	.8byte	.LVL91
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL89
-	.8byte	.LVL94-1
+	.8byte	.LVL93
+	.8byte	.LVL98-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL144
 	.8byte	.LVL148
+	.8byte	.LVL152
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST23:
-	.8byte	.LVL149
-	.8byte	.LVL151-1
+.LLST25:
+	.8byte	.LVL153
+	.8byte	.LVL155-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST24:
-	.8byte	.LVL147
-	.8byte	.LVL150
+.LLST26:
+	.8byte	.LVL151
+	.8byte	.LVL154
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST25:
-	.8byte	.LVL146
-	.8byte	.LVL149
+.LLST27:
+	.8byte	.LVL150
+	.8byte	.LVL153
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST26:
-	.8byte	.LVL107
-	.8byte	.LVL108
+.LLST28:
+	.8byte	.LVL111
+	.8byte	.LVL112
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL109
-	.8byte	.LVL110
+	.8byte	.LVL113
+	.8byte	.LVL114
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL221
-	.8byte	.LVL222
+	.8byte	.LVL225
+	.8byte	.LVL226
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST27:
-	.8byte	.LVL100
-	.8byte	.LVL101
+.LLST29:
+	.8byte	.LVL104
+	.8byte	.LVL105
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL109
-	.8byte	.LVL111
+	.8byte	.LVL113
+	.8byte	.LVL115
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL249
-	.8byte	.LVL250
+	.8byte	.LVL253
+	.8byte	.LVL254
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST28:
-	.8byte	.LVL100
-	.8byte	.LVL102
+.LLST30:
+	.8byte	.LVL104
+	.8byte	.LVL106
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL106
-	.8byte	.LVL112
+	.8byte	.LVL110
+	.8byte	.LVL116
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL220
-	.8byte	.LVL222
+	.8byte	.LVL224
+	.8byte	.LVL226
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL249
-	.8byte	.LVL250
+	.8byte	.LVL253
+	.8byte	.LVL254
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST29:
-	.8byte	.LVL105
-	.8byte	.LVL108
+.LLST31:
+	.8byte	.LVL109
+	.8byte	.LVL112
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL220
-	.8byte	.LVL221
+	.8byte	.LVL224
+	.8byte	.LVL225
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST30:
-	.8byte	.LVL114
-	.8byte	.LVL116-1
+.LLST32:
+	.8byte	.LVL118
+	.8byte	.LVL120-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST31:
-	.8byte	.LVL113
-	.8byte	.LVL115
+.LLST33:
+	.8byte	.LVL117
+	.8byte	.LVL119
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST32:
-	.8byte	.LVL112
-	.8byte	.LVL114
+.LLST34:
+	.8byte	.LVL116
+	.8byte	.LVL118
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST34:
-	.8byte	.LVL131
-	.8byte	.LVL132
+.LLST36:
+	.8byte	.LVL135
+	.8byte	.LVL136
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL133
-	.8byte	.LVL134
+	.8byte	.LVL137
+	.8byte	.LVL138
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL219
-	.8byte	.LVL220
+	.8byte	.LVL223
+	.8byte	.LVL224
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST35:
-	.8byte	.LVL100
-	.8byte	.LVL101
+.LLST37:
+	.8byte	.LVL104
+	.8byte	.LVL105
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL133
-	.8byte	.LVL135
+	.8byte	.LVL137
+	.8byte	.LVL139
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL249
-	.8byte	.LVL250
+	.8byte	.LVL253
+	.8byte	.LVL254
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST36:
-	.8byte	.LVL100
-	.8byte	.LVL102
+.LLST38:
+	.8byte	.LVL104
+	.8byte	.LVL106
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL130
-	.8byte	.LVL136
+	.8byte	.LVL134
+	.8byte	.LVL140
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL218
-	.8byte	.LVL220
+	.8byte	.LVL222
+	.8byte	.LVL224
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL249
-	.8byte	.LVL250
+	.8byte	.LVL253
+	.8byte	.LVL254
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST37:
-	.8byte	.LVL129
-	.8byte	.LVL132
+.LLST39:
+	.8byte	.LVL133
+	.8byte	.LVL136
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL218
-	.8byte	.LVL219
+	.8byte	.LVL222
+	.8byte	.LVL223
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST38:
-	.8byte	.LVL138
-	.8byte	.LVL140-1
+.LLST40:
+	.8byte	.LVL142
+	.8byte	.LVL144-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST39:
-	.8byte	.LVL137
-	.8byte	.LVL139
+.LLST41:
+	.8byte	.LVL141
+	.8byte	.LVL143
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST40:
-	.8byte	.LVL136
-	.8byte	.LVL138
+.LLST42:
+	.8byte	.LVL140
+	.8byte	.LVL142
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST41:
-	.8byte	.LVL157
-	.8byte	.LVL158
+.LLST43:
+	.8byte	.LVL161
+	.8byte	.LVL162
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL159
-	.8byte	.LVL160
+	.8byte	.LVL163
+	.8byte	.LVL164
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL232
-	.8byte	.LVL233
+	.8byte	.LVL236
+	.8byte	.LVL237
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST42:
-	.8byte	.LVL100
-	.8byte	.LVL101
+.LLST44:
+	.8byte	.LVL104
+	.8byte	.LVL105
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL159
-	.8byte	.LVL162
+	.8byte	.LVL163
+	.8byte	.LVL166
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST43:
-	.8byte	.LVL100
-	.8byte	.LVL102
+.LLST45:
+	.8byte	.LVL104
+	.8byte	.LVL106
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL156
-	.8byte	.LVL161
+	.8byte	.LVL160
+	.8byte	.LVL165
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL230
-	.8byte	.LVL233
+	.8byte	.LVL234
+	.8byte	.LVL237
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST44:
-	.8byte	.LVL100
-	.8byte	.LVL102
+.LLST46:
+	.8byte	.LVL104
+	.8byte	.LVL106
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL155
-	.8byte	.LVL164
+	.8byte	.LVL159
+	.8byte	.LVL168
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL230
-	.8byte	.LVL231
+	.8byte	.LVL234
+	.8byte	.LVL235
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST45:
-	.8byte	.LVL165
-	.8byte	.LVL167-1
+.LLST47:
+	.8byte	.LVL169
+	.8byte	.LVL171-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST46:
-	.8byte	.LVL163
-	.8byte	.LVL166
+.LLST48:
+	.8byte	.LVL167
+	.8byte	.LVL170
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST47:
-	.8byte	.LVL162
-	.8byte	.LVL165
+.LLST49:
+	.8byte	.LVL166
+	.8byte	.LVL169
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST48:
-	.8byte	.LVL179
-	.8byte	.LVL180
+.LLST50:
+	.8byte	.LVL183
+	.8byte	.LVL184
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL254
-	.8byte	.LVL256
+	.8byte	.LVL258
+	.8byte	.LVL260
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL259
+	.8byte	.LVL263
 	.8byte	.LFE2831
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST49:
-	.8byte	.LVL171
-	.8byte	.LVL172
+.LLST51:
+	.8byte	.LVL175
+	.8byte	.LVL176
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL173
-	.8byte	.LVL174
+	.8byte	.LVL177
+	.8byte	.LVL178
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL226
-	.8byte	.LVL227
+	.8byte	.LVL230
+	.8byte	.LVL231
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST50:
-	.8byte	.LVL173
-	.8byte	.LVL179-1
+.LLST52:
+	.8byte	.LVL177
+	.8byte	.LVL183-1
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL253
-	.8byte	.LVL254
+	.8byte	.LVL257
+	.8byte	.LVL258
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL254
-	.8byte	.LVL257-1
+	.8byte	.LVL258
+	.8byte	.LVL261-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL260
+	.8byte	.LVL264
 	.8byte	.LFE2831
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST51:
-	.8byte	.LVL170
-	.8byte	.LVL175
+.LLST53:
+	.8byte	.LVL174
+	.8byte	.LVL179
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL225
-	.8byte	.LVL227
+	.8byte	.LVL229
+	.8byte	.LVL231
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL253
-	.8byte	.LVL255
+	.8byte	.LVL257
+	.8byte	.LVL259
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST52:
-	.8byte	.LVL169
-	.8byte	.LVL172
+.LLST54:
+	.8byte	.LVL173
+	.8byte	.LVL176
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL225
-	.8byte	.LVL226
+	.8byte	.LVL229
+	.8byte	.LVL230
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST53:
-	.8byte	.LVL177
-	.8byte	.LVL179-1
+.LLST55:
+	.8byte	.LVL181
+	.8byte	.LVL183-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST54:
-	.8byte	.LVL176
-	.8byte	.LVL178
+.LLST56:
+	.8byte	.LVL180
+	.8byte	.LVL182
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST55:
-	.8byte	.LVL175
-	.8byte	.LVL177
+.LLST57:
+	.8byte	.LVL179
+	.8byte	.LVL181
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST56:
-	.8byte	.LVL86
-	.8byte	.LVL92
+.LLST58:
+	.8byte	.LVL90
+	.8byte	.LVL96
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL192
-	.8byte	.LVL193
+	.8byte	.LVL196
+	.8byte	.LVL197
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST57:
-	.8byte	.LVL86
-	.8byte	.LVL87
+.LLST59:
+	.8byte	.LVL90
+	.8byte	.LVL91
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL89
-	.8byte	.LVL94-1
+	.8byte	.LVL93
+	.8byte	.LVL98-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL144
 	.8byte	.LVL148
+	.8byte	.LVL152
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL191
-	.8byte	.LVL193
+	.8byte	.LVL195
+	.8byte	.LVL197
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST58:
-	.8byte	.LVL197
-	.8byte	.LVL198
+.LLST60:
+	.8byte	.LVL201
+	.8byte	.LVL202
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL199
-	.8byte	.LVL200
+	.8byte	.LVL203
+	.8byte	.LVL204
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL224
-	.8byte	.LVL225
+	.8byte	.LVL228
+	.8byte	.LVL229
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST59:
-	.8byte	.LVL199
-	.8byte	.LVL201
+.LLST61:
+	.8byte	.LVL203
+	.8byte	.LVL205
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL233
-	.8byte	.LVL235
+	.8byte	.LVL237
+	.8byte	.LVL239
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST60:
-	.8byte	.LVL196
-	.8byte	.LVL202
+.LLST62:
+	.8byte	.LVL200
+	.8byte	.LVL206
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL222
-	.8byte	.LVL225
+	.8byte	.LVL226
+	.8byte	.LVL229
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL233
-	.8byte	.LVL234
+	.8byte	.LVL237
+	.8byte	.LVL238
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST61:
-	.8byte	.LVL194
-	.8byte	.LVL203-1
+.LLST63:
+	.8byte	.LVL198
+	.8byte	.LVL207-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL222
-	.8byte	.LVL223
+	.8byte	.LVL226
+	.8byte	.LVL227
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL233
 	.8byte	.LVL237
+	.8byte	.LVL241
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST62:
-	.8byte	.LVL238
-	.8byte	.LVL240-1
+.LLST64:
+	.8byte	.LVL242
+	.8byte	.LVL244-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST63:
-	.8byte	.LVL236
-	.8byte	.LVL239
+.LLST65:
+	.8byte	.LVL240
+	.8byte	.LVL243
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST64:
-	.8byte	.LVL235
-	.8byte	.LVL238
+.LLST66:
+	.8byte	.LVL239
+	.8byte	.LVL242
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST65:
-	.8byte	.LVL212
-	.8byte	.LVL213
+.LLST67:
+	.8byte	.LVL216
+	.8byte	.LVL217
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL214
-	.8byte	.LVL215
+	.8byte	.LVL218
+	.8byte	.LVL219
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL229
-	.8byte	.LVL230
+	.8byte	.LVL233
+	.8byte	.LVL234
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST66:
-	.8byte	.LVL214
-	.8byte	.LVL216
+.LLST68:
+	.8byte	.LVL218
+	.8byte	.LVL220
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL241
-	.8byte	.LVL243
+	.8byte	.LVL245
+	.8byte	.LVL247
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST67:
-	.8byte	.LVL211
-	.8byte	.LVL217-1
+.LLST69:
+	.8byte	.LVL215
+	.8byte	.LVL221-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL227
-	.8byte	.LVL230
+	.8byte	.LVL231
+	.8byte	.LVL234
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL241
-	.8byte	.LVL242
+	.8byte	.LVL245
+	.8byte	.LVL246
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST68:
-	.8byte	.LVL210
-	.8byte	.LVL217-1
+.LLST70:
+	.8byte	.LVL214
+	.8byte	.LVL221-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL227
-	.8byte	.LVL228
+	.8byte	.LVL231
+	.8byte	.LVL232
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL241
 	.8byte	.LVL245
+	.8byte	.LVL249
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST69:
-	.8byte	.LVL246
-	.8byte	.LVL248-1
+.LLST71:
+	.8byte	.LVL250
+	.8byte	.LVL252-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST70:
-	.8byte	.LVL244
-	.8byte	.LVL247
+.LLST72:
+	.8byte	.LVL248
+	.8byte	.LVL251
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST71:
-	.8byte	.LVL243
-	.8byte	.LVL246
+.LLST73:
+	.8byte	.LVL247
+	.8byte	.LVL250
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST72:
-	.8byte	.LVL271
-	.8byte	.LVL272-1
+.LLST74:
+	.8byte	.LVL275
+	.8byte	.LVL276-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -50165,470 +50383,470 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST186:
-	.8byte	.LVL754
-	.8byte	.LVL756
+.LLST188:
+	.8byte	.LVL759
+	.8byte	.LVL761
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST187:
-	.8byte	.LVL755
-	.8byte	.LVL771
+.LLST189:
+	.8byte	.LVL760
+	.8byte	.LVL776
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL775
+	.8byte	.LVL780
 	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST188:
-	.8byte	.LVL758
-	.8byte	.LVL774
+.LLST190:
+	.8byte	.LVL763
+	.8byte	.LVL779
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL775
-	.8byte	.LVL776
+	.8byte	.LVL780
+	.8byte	.LVL781
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL776
-	.8byte	.LVL787
+	.8byte	.LVL781
+	.8byte	.LVL792
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL787
-	.8byte	.LVL788
+	.8byte	.LVL792
+	.8byte	.LVL793
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL788
 	.8byte	.LVL793
+	.8byte	.LVL798
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL793
-	.8byte	.LVL794
+	.8byte	.LVL798
+	.8byte	.LVL799
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL794
-	.8byte	.LVL815
+	.8byte	.LVL799
+	.8byte	.LVL820
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL815
-	.8byte	.LVL816
+	.8byte	.LVL820
+	.8byte	.LVL821
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL816
-	.8byte	.LVL873
+	.8byte	.LVL821
+	.8byte	.LVL878
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL873
-	.8byte	.LVL874
+	.8byte	.LVL878
+	.8byte	.LVL879
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL874
+	.8byte	.LVL879
 	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST189:
-	.8byte	.LVL795
-	.8byte	.LVL796-1
+.LLST191:
+	.8byte	.LVL800
+	.8byte	.LVL801-1
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL805
-	.8byte	.LVL806-1
+	.8byte	.LVL810
+	.8byte	.LVL811-1
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL854
-	.8byte	.LVL855-1
+	.8byte	.LVL859
+	.8byte	.LVL860-1
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST190:
-	.8byte	.LVL757
-	.8byte	.LVL772
+.LLST192:
+	.8byte	.LVL762
+	.8byte	.LVL777
 	.2byte	0x1
 	.byte	0x67
-	.8byte	.LVL775
+	.8byte	.LVL780
 	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x67
 	.8byte	0
 	.8byte	0
-.LLST191:
-	.8byte	.LVL758
-	.8byte	.LVL773
+.LLST193:
+	.8byte	.LVL763
+	.8byte	.LVL778
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL775
-	.8byte	.LVL835
+	.8byte	.LVL780
+	.8byte	.LVL840
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL839
-	.8byte	.LVL842
+	.8byte	.LVL844
+	.8byte	.LVL847
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL847
-	.8byte	.LVL884
+	.8byte	.LVL852
+	.8byte	.LVL889
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL895
-	.8byte	.LVL898
+	.8byte	.LVL900
+	.8byte	.LVL903
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL899
+	.8byte	.LVL904
 	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST205:
-	.8byte	.LVL865
-	.8byte	.LVL866
+.LLST207:
+	.8byte	.LVL870
+	.8byte	.LVL871
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL886
-	.8byte	.LVL887-1
+	.8byte	.LVL891
+	.8byte	.LVL892-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST204:
-	.8byte	.LVL851
-	.8byte	.LVL852
+.LLST206:
+	.8byte	.LVL856
+	.8byte	.LVL857
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL879
-	.8byte	.LVL880-1
+	.8byte	.LVL884
+	.8byte	.LVL885-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST193:
-	.8byte	.LVL777
-	.8byte	.LVL778
+.LLST195:
+	.8byte	.LVL782
+	.8byte	.LVL783
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL810
-	.8byte	.LVL811-1
+	.8byte	.LVL815
+	.8byte	.LVL816-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST192:
-	.8byte	.LVL758
-	.8byte	.LVL759
+.LLST194:
+	.8byte	.LVL763
+	.8byte	.LVL764
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL779
-	.8byte	.LVL780
+	.8byte	.LVL784
+	.8byte	.LVL785
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL782
-	.8byte	.LVL783-1
+	.8byte	.LVL787
+	.8byte	.LVL788-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST194:
-	.8byte	.LVL830
-	.8byte	.LVL847
+.LLST196:
+	.8byte	.LVL835
+	.8byte	.LVL852
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL890
-	.8byte	.LVL896-1
+	.8byte	.LVL895
+	.8byte	.LVL901-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL898
-	.8byte	.LVL899
+	.8byte	.LVL903
+	.8byte	.LVL904
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST195:
-	.8byte	.LVL835
-	.8byte	.LVL838
+.LLST197:
+	.8byte	.LVL840
+	.8byte	.LVL843
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL844
-	.8byte	.LVL847
+	.8byte	.LVL849
+	.8byte	.LVL852
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL890
-	.8byte	.LVL893
+	.8byte	.LVL895
+	.8byte	.LVL898
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL898
-	.8byte	.LVL899
+	.8byte	.LVL903
+	.8byte	.LVL904
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST196:
-	.8byte	.LVL758
-	.8byte	.LVL762
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL769
-	.8byte	.LVL773
+.LLST198:
+	.8byte	.LVL763
+	.8byte	.LVL767
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL775
-	.8byte	.LVL786
+	.8byte	.LVL774
+	.8byte	.LVL778
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL787
-	.8byte	.LVL788
+	.8byte	.LVL780
+	.8byte	.LVL791
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL790
-	.8byte	.LVL794
+	.8byte	.LVL792
+	.8byte	.LVL793
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL797
-	.8byte	.LVL798
+	.8byte	.LVL795
+	.8byte	.LVL799
 	.2byte	0x1
 	.byte	0x69
 	.8byte	.LVL802
-	.8byte	.LVL804
+	.8byte	.LVL803
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL808
-	.8byte	.LVL817
+	.8byte	.LVL807
+	.8byte	.LVL809
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL834
-	.8byte	.LVL835
+	.8byte	.LVL813
+	.8byte	.LVL822
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL837
-	.8byte	.LVL843
+	.8byte	.LVL839
+	.8byte	.LVL840
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL860
-	.8byte	.LVL863
+	.8byte	.LVL842
+	.8byte	.LVL848
 	.2byte	0x1
 	.byte	0x69
+	.8byte	.LVL865
 	.8byte	.LVL868
-	.8byte	.LVL869
 	.2byte	0x1
 	.byte	0x69
 	.8byte	.LVL873
-	.8byte	.LVL877
+	.8byte	.LVL874
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL892
-	.8byte	.LVL898
+	.8byte	.LVL878
+	.8byte	.LVL882
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL901
+	.8byte	.LVL897
 	.8byte	.LVL903
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL907
-	.8byte	.LVL909
+	.8byte	.LVL906
+	.8byte	.LVL908
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL911
+	.8byte	.LVL912
+	.8byte	.LVL914
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL916
 	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST197:
-	.8byte	.LVL834
-	.8byte	.LVL836
+.LLST199:
+	.8byte	.LVL839
+	.8byte	.LVL841
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL837
-	.8byte	.LVL847
+	.8byte	.LVL842
+	.8byte	.LVL852
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL890
-	.8byte	.LVL891
+	.8byte	.LVL895
+	.8byte	.LVL896
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL895
-	.8byte	.LVL896-1
+	.8byte	.LVL900
+	.8byte	.LVL901-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL898
-	.8byte	.LVL899
+	.8byte	.LVL903
+	.8byte	.LVL904
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST198:
-	.8byte	.LVL834
-	.8byte	.LVL845
+.LLST200:
+	.8byte	.LVL839
+	.8byte	.LVL850
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL846
-	.8byte	.LVL847
+	.8byte	.LVL851
+	.8byte	.LVL852
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL890
-	.8byte	.LVL896-1
+	.8byte	.LVL895
+	.8byte	.LVL901-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL898
-	.8byte	.LVL899
+	.8byte	.LVL903
+	.8byte	.LVL904
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST199:
-	.8byte	.LVL834
-	.8byte	.LVL835
+.LLST201:
+	.8byte	.LVL839
+	.8byte	.LVL840
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL838
-	.8byte	.LVL840
+	.8byte	.LVL843
+	.8byte	.LVL845
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL840
-	.8byte	.LVL841
+	.8byte	.LVL845
+	.8byte	.LVL846
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL894
-	.8byte	.LVL896-1
+	.8byte	.LVL899
+	.8byte	.LVL901-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST200:
-	.8byte	.LVL833
-	.8byte	.LVL847
+.LLST202:
+	.8byte	.LVL838
+	.8byte	.LVL852
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL890
-	.8byte	.LVL896-1
+	.8byte	.LVL895
+	.8byte	.LVL901-1
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL898
-	.8byte	.LVL899
+	.8byte	.LVL903
+	.8byte	.LVL904
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST201:
-	.8byte	.LVL831
-	.8byte	.LVL847
+.LLST203:
+	.8byte	.LVL836
+	.8byte	.LVL852
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL890
-	.8byte	.LVL896-1
+	.8byte	.LVL895
+	.8byte	.LVL901-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL898
-	.8byte	.LVL899
+	.8byte	.LVL903
+	.8byte	.LVL904
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST202:
-	.8byte	.LVL833
-	.8byte	.LVL847
+.LLST204:
+	.8byte	.LVL838
+	.8byte	.LVL852
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL890
-	.8byte	.LVL896-1
+	.8byte	.LVL895
+	.8byte	.LVL901-1
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL898
-	.8byte	.LVL899
+	.8byte	.LVL903
+	.8byte	.LVL904
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST203:
-	.8byte	.LVL832
-	.8byte	.LVL847
+.LLST205:
+	.8byte	.LVL837
+	.8byte	.LVL852
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL890
-	.8byte	.LVL896-1
+	.8byte	.LVL895
+	.8byte	.LVL901-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL898
-	.8byte	.LVL899
+	.8byte	.LVL903
+	.8byte	.LVL904
 	.2byte	0x1
 	.byte	0x61
 	.8byte	0
 	.8byte	0
-.LLST73:
-	.8byte	.LVL273
-	.8byte	.LVL274
+.LLST75:
+	.8byte	.LVL277
+	.8byte	.LVL278
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL274
-	.8byte	.LVL280
+	.8byte	.LVL278
+	.8byte	.LVL284
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL281
+	.8byte	.LVL285
 	.8byte	.LFE2824
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST74:
-	.8byte	.LVL275
-	.8byte	.LVL277
+.LLST76:
+	.8byte	.LVL279
+	.8byte	.LVL281
 	.2byte	0x2
 	.byte	0x71
 	.sleb128 -12
-	.8byte	.LVL277
-	.8byte	.LVL282
+	.8byte	.LVL281
+	.8byte	.LVL286
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
-	.8byte	.LVL282
-	.8byte	.LVL285
+	.8byte	.LVL286
+	.8byte	.LVL289
 	.2byte	0x2
 	.byte	0x71
 	.sleb128 -12
-	.8byte	.LVL285
+	.8byte	.LVL289
 	.8byte	.LFE2824
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
 	.8byte	0
 	.8byte	0
-.LLST143:
-	.8byte	.LVL484
-	.8byte	.LVL485
+.LLST145:
+	.8byte	.LVL488
+	.8byte	.LVL489
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST142:
-	.8byte	.LVL457
-	.8byte	.LVL458
+.LLST144:
+	.8byte	.LVL461
+	.8byte	.LVL462
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL458
 	.8byte	.LVL462
+	.8byte	.LVL466
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL463
 	.8byte	.LVL467
+	.8byte	.LVL471
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL468
 	.8byte	.LVL472
+	.8byte	.LVL476
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL473
 	.8byte	.LVL477
+	.8byte	.LVL481
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL478
-	.8byte	.LVL480
+	.8byte	.LVL482
+	.8byte	.LVL484
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL481
-	.8byte	.LVL483
+	.8byte	.LVL485
+	.8byte	.LVL487
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
@@ -50811,559 +51029,558 @@ __exitcall_ebc_exit:
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST183:
-	.8byte	.LVL742
-	.8byte	.LVL744
+.LLST185:
+	.8byte	.LVL747
+	.8byte	.LVL749
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST184:
-	.8byte	.LVL743
-	.8byte	.LVL746
+.LLST186:
+	.8byte	.LVL748
+	.8byte	.LVL751
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST185:
-	.8byte	.LVL746
-	.8byte	.LVL749
+.LLST187:
+	.8byte	.LVL751
+	.8byte	.LVL754
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL750
-	.8byte	.LVL753
+	.8byte	.LVL755
+	.8byte	.LVL758
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST179:
-	.8byte	.LVL731
+.LLST181:
 	.8byte	.LVL736
+	.8byte	.LVL741
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL741
+	.8byte	.LVL746
 	.8byte	.LFE2808
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST180:
-	.8byte	.LVL737
-	.8byte	.LVL738
+.LLST182:
+	.8byte	.LVL742
+	.8byte	.LVL743
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST181:
-	.8byte	.LVL735
-	.8byte	.LVL739
+.LLST183:
+	.8byte	.LVL740
+	.8byte	.LVL744
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST182:
-	.8byte	.LVL738
-	.8byte	.LVL740
+.LLST184:
+	.8byte	.LVL743
+	.8byte	.LVL745
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST173:
-	.8byte	.LVL709
-	.8byte	.LVL715
+.LLST175:
+	.8byte	.LVL714
+	.8byte	.LVL720
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL719
-	.8byte	.LVL720
+	.8byte	.LVL724
+	.8byte	.LVL725
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL729
-	.8byte	.LVL730
+	.8byte	.LVL734
+	.8byte	.LVL735
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST174:
-	.8byte	.LVL709
-	.8byte	.LVL710
+.LLST176:
+	.8byte	.LVL714
+	.8byte	.LVL715
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST175:
-	.8byte	.LVL715
-	.8byte	.LVL718
+.LLST177:
+	.8byte	.LVL720
+	.8byte	.LVL723
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL722
 	.8byte	.LVL727
+	.8byte	.LVL732
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL730
+	.8byte	.LVL735
 	.8byte	.LFE2807
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST176:
-	.8byte	.LVL714
-	.8byte	.LVL715
+.LLST178:
+	.8byte	.LVL719
+	.8byte	.LVL720
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL717
-	.8byte	.LVL721
+	.8byte	.LVL722
+	.8byte	.LVL726
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL726
-	.8byte	.LVL730
+	.8byte	.LVL731
+	.8byte	.LVL735
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST177:
-	.8byte	.LVL714
-	.8byte	.LVL716
+.LLST179:
+	.8byte	.LVL719
+	.8byte	.LVL721
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL717
-	.8byte	.LVL725
+	.8byte	.LVL722
+	.8byte	.LVL730
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL728
+	.8byte	.LVL733
 	.8byte	.LFE2807
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST178:
-	.8byte	.LVL714
-	.8byte	.LVL723
+.LLST180:
+	.8byte	.LVL719
+	.8byte	.LVL728
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL724
+	.8byte	.LVL729
 	.8byte	.LFE2807
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST102:
-	.8byte	.LVL353
-	.8byte	.LVL382
+.LLST10:
+	.8byte	.LVL62
+	.8byte	.LVL63
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST104:
+	.8byte	.LVL357
+	.8byte	.LVL386
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL387
-	.8byte	.LVL390
+	.8byte	.LVL391
+	.8byte	.LVL394
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL393
+	.8byte	.LVL397
 	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST103:
-	.8byte	.LVL353
-	.8byte	.LVL381
+.LLST105:
+	.8byte	.LVL357
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL387
-	.8byte	.LVL390
+	.8byte	.LVL391
+	.8byte	.LVL394
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL393
+	.8byte	.LVL397
 	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST104:
-	.8byte	.LVL353
-	.8byte	.LVL355
+.LLST106:
+	.8byte	.LVL357
+	.8byte	.LVL359
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL369
-	.8byte	.LVL371
+	.8byte	.LVL373
+	.8byte	.LVL375
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST105:
-	.8byte	.LVL354
-	.8byte	.LVL370
+.LLST107:
+	.8byte	.LVL358
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL394
+	.8byte	.LVL398
 	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
-.LLST106:
-	.8byte	.LVL359
-	.8byte	.LVL369
+.LLST108:
+	.8byte	.LVL363
+	.8byte	.LVL373
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL394
+	.8byte	.LVL398
 	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST107:
-	.8byte	.LVL360
-	.8byte	.LVL369
+.LLST109:
+	.8byte	.LVL364
+	.8byte	.LVL373
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL394
+	.8byte	.LVL398
 	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST108:
-	.8byte	.LVL364
-	.8byte	.LVL366
+.LLST110:
+	.8byte	.LVL368
+	.8byte	.LVL370
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST109:
-	.8byte	.LVL361
-	.8byte	.LVL362
+.LLST111:
+	.8byte	.LVL365
+	.8byte	.LVL366
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL363
 	.8byte	.LVL367
+	.8byte	.LVL371
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL368
-	.8byte	.LVL369
+	.8byte	.LVL372
+	.8byte	.LVL373
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL394
+	.8byte	.LVL398
 	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST110:
-	.8byte	.LVL356
-	.8byte	.LVL357
+.LLST112:
+	.8byte	.LVL360
+	.8byte	.LVL361
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST111:
-	.8byte	.LVL358
-	.8byte	.LVL369
+.LLST113:
+	.8byte	.LVL362
+	.8byte	.LVL373
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL394
+	.8byte	.LVL398
 	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST112:
-	.8byte	.LVL381
-	.8byte	.LVL383
+.LLST114:
+	.8byte	.LVL385
+	.8byte	.LVL387
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST113:
-	.8byte	.LVL382
-	.8byte	.LVL384
+.LLST115:
+	.8byte	.LVL386
+	.8byte	.LVL388
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST114:
-	.8byte	.LVL378
-	.8byte	.LVL379
+.LLST116:
+	.8byte	.LVL382
+	.8byte	.LVL383
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL380
-	.8byte	.LVL385
+	.8byte	.LVL384
+	.8byte	.LVL389
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL386
-	.8byte	.LVL388
+	.8byte	.LVL390
+	.8byte	.LVL392
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL389
-	.8byte	.LVL391
+	.8byte	.LVL393
+	.8byte	.LVL395
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL392
+	.8byte	.LVL396
 	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST115:
-	.8byte	.LVL371
-	.8byte	.LVL372
+.LLST117:
+	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST116:
-	.8byte	.LVL395
-	.8byte	.LVL427
+.LLST118:
+	.8byte	.LVL399
+	.8byte	.LVL431
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL428
-	.8byte	.LVL430
+	.8byte	.LVL432
+	.8byte	.LVL434
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL445
-	.8byte	.LVL448
+	.8byte	.LVL449
+	.8byte	.LVL452
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST117:
-	.8byte	.LVL395
-	.8byte	.LVL431
+.LLST119:
+	.8byte	.LVL399
+	.8byte	.LVL435
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL445
-	.8byte	.LVL448
+	.8byte	.LVL449
+	.8byte	.LVL452
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST118:
-	.8byte	.LVL395
-	.8byte	.LVL397
+.LLST120:
+	.8byte	.LVL399
+	.8byte	.LVL401
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL415
-	.8byte	.LVL416
+	.8byte	.LVL419
+	.8byte	.LVL420
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST119:
-	.8byte	.LVL411
+.LLST121:
 	.8byte	.LVL415
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL426
-	.8byte	.LVL439
+	.8byte	.LVL430
+	.8byte	.LVL443
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL444
+	.8byte	.LVL448
 	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST120:
-	.8byte	.LVL411
+.LLST122:
 	.8byte	.LVL415
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL426
-	.8byte	.LVL427
+	.8byte	.LVL430
+	.8byte	.LVL431
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL428
-	.8byte	.LVL440
+	.8byte	.LVL432
+	.8byte	.LVL444
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL444
+	.8byte	.LVL448
 	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST121:
-	.8byte	.LVL411
+.LLST123:
 	.8byte	.LVL415
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL424
+	.8byte	.LVL428
 	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST122:
-	.8byte	.LVL411
+.LLST124:
 	.8byte	.LVL415
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL423
+	.8byte	.LVL427
 	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST123:
-	.8byte	.LVL411
+.LLST125:
 	.8byte	.LVL415
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL428
-	.8byte	.LVL429
+	.8byte	.LVL432
+	.8byte	.LVL433
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL445
-	.8byte	.LVL446
+	.8byte	.LVL449
+	.8byte	.LVL450
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL447
-	.8byte	.LVL448
+	.8byte	.LVL451
+	.8byte	.LVL452
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST124:
-	.8byte	.LVL411
+.LLST126:
 	.8byte	.LVL415
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL421
+	.8byte	.LVL425
 	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST125:
-	.8byte	.LVL411
+.LLST127:
 	.8byte	.LVL415
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL422
+	.8byte	.LVL426
 	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST126:
-	.8byte	.LVL411
+.LLST128:
 	.8byte	.LVL415
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL425
+	.8byte	.LVL429
 	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST127:
-	.8byte	.LVL417
-	.8byte	.LVL418
+.LLST129:
+	.8byte	.LVL421
+	.8byte	.LVL422
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST128:
-	.8byte	.LVL411
+.LLST130:
 	.8byte	.LVL415
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL420
+	.8byte	.LVL424
 	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST129:
-	.8byte	.LVL411
+.LLST131:
 	.8byte	.LVL415
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL426
-	.8byte	.LVL432
+	.8byte	.LVL430
+	.8byte	.LVL436
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL441
+	.8byte	.LVL445
 	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST130:
-	.8byte	.LVL411
+.LLST132:
 	.8byte	.LVL415
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL426
-	.8byte	.LVL435
+	.8byte	.LVL430
+	.8byte	.LVL439
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL436
-	.8byte	.LVL437
+	.8byte	.LVL440
+	.8byte	.LVL441
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL438
 	.8byte	.LVL442
+	.8byte	.LVL446
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL443
+	.8byte	.LVL447
 	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST131:
-	.8byte	.LVL411
+.LLST133:
 	.8byte	.LVL415
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL426
-	.8byte	.LVL433
-	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL434
+	.8byte	.LVL430
 	.8byte	.LVL437
 	.2byte	0x1
 	.byte	0x62
 	.8byte	.LVL438
+	.8byte	.LVL441
+	.2byte	0x1
+	.byte	0x62
 	.8byte	.LVL442
+	.8byte	.LVL446
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL443
+	.8byte	.LVL447
 	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST132:
-	.8byte	.LVL411
+.LLST134:
 	.8byte	.LVL415
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL426
-	.8byte	.LVL433
+	.8byte	.LVL430
+	.8byte	.LVL437
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL434
-	.8byte	.LVL435
+	.8byte	.LVL438
+	.8byte	.LVL439
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL436
-	.8byte	.LVL442
+	.8byte	.LVL440
+	.8byte	.LVL446
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL443
+	.8byte	.LVL447
 	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST133:
-	.8byte	.LVL403
-	.8byte	.LVL404
-	.2byte	0x1
-	.byte	0x5d
-	.8byte	.LVL405
-	.8byte	.LVL406
-	.2byte	0x1
-	.byte	0x5d
+.LLST135:
 	.8byte	.LVL407
 	.8byte	.LVL408
 	.2byte	0x1
@@ -51373,108 +51590,116 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	.LVL411
+	.8byte	.LVL412
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	.LVL413
+	.8byte	.LVL414
+	.2byte	0x1
+	.byte	0x5d
 	.8byte	.LVL415
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
-.LLST134:
-	.8byte	.LVL401
-	.8byte	.LVL414
+.LLST136:
+	.8byte	.LVL405
+	.8byte	.LVL418
 	.2byte	0x1
 	.byte	0x6e
 	.8byte	0
 	.8byte	0
-.LLST135:
-	.8byte	.LVL402
-	.8byte	.LVL415
+.LLST137:
+	.8byte	.LVL406
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST136:
-	.8byte	.LVL396
-	.8byte	.LVL419
+.LLST138:
+	.8byte	.LVL400
+	.8byte	.LVL423
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST137:
-	.8byte	.LVL398
-	.8byte	.LVL399
+.LLST139:
+	.8byte	.LVL402
+	.8byte	.LVL403
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST138:
-	.8byte	.LVL400
-	.8byte	.LVL415
+.LLST140:
+	.8byte	.LVL404
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST139:
-	.8byte	.LVL403
-	.8byte	.LVL412
+.LLST141:
+	.8byte	.LVL407
+	.8byte	.LVL416
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST140:
-	.8byte	.LVL403
-	.8byte	.LVL413
+.LLST142:
+	.8byte	.LVL407
+	.8byte	.LVL417
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST141:
-	.8byte	.LVL449
-	.8byte	.LVL450
+.LLST143:
+	.8byte	.LVL453
+	.8byte	.LVL454
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL450
-	.8byte	.LVL455
+	.8byte	.LVL454
+	.8byte	.LVL459
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL456
-	.8byte	.LFE2861
+	.8byte	.LVL460
+	.8byte	.LFE2863
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST144:
-	.8byte	.LVL501
-	.8byte	.LVL503
+.LLST146:
+	.8byte	.LVL505
+	.8byte	.LVL507
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL503
 	.8byte	.LVL507
+	.8byte	.LVL511
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL508
-	.8byte	.LVL511
+	.8byte	.LVL512
+	.8byte	.LVL515
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST145:
-	.8byte	.LVL501
-	.8byte	.LVL502
+.LLST147:
+	.8byte	.LVL505
+	.8byte	.LVL506
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST172:
-	.8byte	.LVL701
-	.8byte	.LVL702
+.LLST174:
+	.8byte	.LVL706
+	.8byte	.LVL707
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL702
-	.8byte	.LVL706
+	.8byte	.LVL707
+	.8byte	.LVL711
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL707
-	.8byte	.LFE2866
+	.8byte	.LVL712
+	.8byte	.LFE2869
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -51489,324 +51714,326 @@ __exitcall_ebc_exit:
 	.2byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0-.Ltext0
-	.8byte	.LFB2853
-	.8byte	.LFE2853-.LFB2853
-	.8byte	.LFB2852
-	.8byte	.LFE2852-.LFB2852
+	.8byte	.LFB2855
+	.8byte	.LFE2855-.LFB2855
+	.8byte	.LFB2854
+	.8byte	.LFE2854-.LFB2854
 	.8byte	0
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
 .Ldebug_ranges0:
-	.8byte	.LBB944
-	.8byte	.LBE944
-	.8byte	.LBB947
-	.8byte	.LBE947
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB948
-	.8byte	.LBE948
-	.8byte	.LBB979
-	.8byte	.LBE979
-	.8byte	.LBB980
-	.8byte	.LBE980
-	.8byte	.LBB1045
-	.8byte	.LBE1045
+	.8byte	.LBB942
+	.8byte	.LBE942
+	.8byte	.LBB945
+	.8byte	.LBE945
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB951
-	.8byte	.LBE951
-	.8byte	.LBB963
-	.8byte	.LBE963
-	.8byte	.LBB964
-	.8byte	.LBE964
+	.8byte	.LBB946
+	.8byte	.LBE946
+	.8byte	.LBB977
+	.8byte	.LBE977
+	.8byte	.LBB978
+	.8byte	.LBE978
+	.8byte	.LBB1043
+	.8byte	.LBE1043
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB967
-	.8byte	.LBE967
-	.8byte	.LBB972
-	.8byte	.LBE972
+	.8byte	.LBB949
+	.8byte	.LBE949
+	.8byte	.LBB961
+	.8byte	.LBE961
+	.8byte	.LBB962
+	.8byte	.LBE962
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB981
-	.8byte	.LBE981
-	.8byte	.LBB1202
-	.8byte	.LBE1202
-	.8byte	.LBB1203
-	.8byte	.LBE1203
+	.8byte	.LBB965
+	.8byte	.LBE965
+	.8byte	.LBB970
+	.8byte	.LBE970
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB984
-	.8byte	.LBE984
-	.8byte	.LBB1004
-	.8byte	.LBE1004
-	.8byte	.LBB1005
-	.8byte	.LBE1005
+	.8byte	.LBB979
+	.8byte	.LBE979
+	.8byte	.LBB1200
+	.8byte	.LBE1200
+	.8byte	.LBB1201
+	.8byte	.LBE1201
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB998
-	.8byte	.LBE998
+	.8byte	.LBB982
+	.8byte	.LBE982
+	.8byte	.LBB1002
+	.8byte	.LBE1002
 	.8byte	.LBB1003
 	.8byte	.LBE1003
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1010
-	.8byte	.LBE1010
-	.8byte	.LBB1213
-	.8byte	.LBE1213
-	.8byte	.LBB1215
-	.8byte	.LBE1215
-	.8byte	.LBB1216
-	.8byte	.LBE1216
+	.8byte	.LBB996
+	.8byte	.LBE996
+	.8byte	.LBB1001
+	.8byte	.LBE1001
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1016
-	.8byte	.LBE1016
-	.8byte	.LBB1200
-	.8byte	.LBE1200
-	.8byte	.LBB1201
-	.8byte	.LBE1201
+	.8byte	.LBB1008
+	.8byte	.LBE1008
+	.8byte	.LBB1211
+	.8byte	.LBE1211
+	.8byte	.LBB1213
+	.8byte	.LBE1213
+	.8byte	.LBB1214
+	.8byte	.LBE1214
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1019
-	.8byte	.LBE1019
-	.8byte	.LBB1039
-	.8byte	.LBE1039
-	.8byte	.LBB1040
-	.8byte	.LBE1040
+	.8byte	.LBB1014
+	.8byte	.LBE1014
+	.8byte	.LBB1198
+	.8byte	.LBE1198
+	.8byte	.LBB1199
+	.8byte	.LBE1199
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1033
-	.8byte	.LBE1033
+	.8byte	.LBB1017
+	.8byte	.LBE1017
+	.8byte	.LBB1037
+	.8byte	.LBE1037
 	.8byte	.LBB1038
 	.8byte	.LBE1038
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1046
-	.8byte	.LBE1046
-	.8byte	.LBB1079
-	.8byte	.LBE1079
-	.8byte	.LBB1210
-	.8byte	.LBE1210
-	.8byte	.LBB1211
-	.8byte	.LBE1211
+	.8byte	.LBB1031
+	.8byte	.LBE1031
+	.8byte	.LBB1036
+	.8byte	.LBE1036
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1049
-	.8byte	.LBE1049
-	.8byte	.LBB1062
-	.8byte	.LBE1062
-	.8byte	.LBB1071
-	.8byte	.LBE1071
-	.8byte	.LBB1072
-	.8byte	.LBE1072
+	.8byte	.LBB1044
+	.8byte	.LBE1044
+	.8byte	.LBB1077
+	.8byte	.LBE1077
+	.8byte	.LBB1208
+	.8byte	.LBE1208
+	.8byte	.LBB1209
+	.8byte	.LBE1209
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1065
-	.8byte	.LBE1065
+	.8byte	.LBB1047
+	.8byte	.LBE1047
+	.8byte	.LBB1060
+	.8byte	.LBE1060
+	.8byte	.LBB1069
+	.8byte	.LBE1069
 	.8byte	.LBB1070
 	.8byte	.LBE1070
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1080
-	.8byte	.LBE1080
-	.8byte	.LBB1115
-	.8byte	.LBE1115
-	.8byte	.LBB1206
-	.8byte	.LBE1206
-	.8byte	.LBB1207
-	.8byte	.LBE1207
-	.8byte	.LBB1217
-	.8byte	.LBE1217
+	.8byte	.LBB1063
+	.8byte	.LBE1063
+	.8byte	.LBB1068
+	.8byte	.LBE1068
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1083
-	.8byte	.LBE1083
-	.8byte	.LBB1096
-	.8byte	.LBE1096
-	.8byte	.LBB1105
-	.8byte	.LBE1105
-	.8byte	.LBB1106
-	.8byte	.LBE1106
+	.8byte	.LBB1078
+	.8byte	.LBE1078
+	.8byte	.LBB1113
+	.8byte	.LBE1113
+	.8byte	.LBB1204
+	.8byte	.LBE1204
+	.8byte	.LBB1205
+	.8byte	.LBE1205
+	.8byte	.LBB1215
+	.8byte	.LBE1215
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1099
-	.8byte	.LBE1099
+	.8byte	.LBB1081
+	.8byte	.LBE1081
+	.8byte	.LBB1094
+	.8byte	.LBE1094
+	.8byte	.LBB1103
+	.8byte	.LBE1103
 	.8byte	.LBB1104
 	.8byte	.LBE1104
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1116
-	.8byte	.LBE1116
-	.8byte	.LBB1127
-	.8byte	.LBE1127
+	.8byte	.LBB1097
+	.8byte	.LBE1097
+	.8byte	.LBB1102
+	.8byte	.LBE1102
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1119
-	.8byte	.LBE1119
-	.8byte	.LBB1124
-	.8byte	.LBE1124
+	.8byte	.LBB1114
+	.8byte	.LBE1114
+	.8byte	.LBB1125
+	.8byte	.LBE1125
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1120
-	.8byte	.LBE1120
-	.8byte	.LBB1123
-	.8byte	.LBE1123
+	.8byte	.LBB1117
+	.8byte	.LBE1117
+	.8byte	.LBB1122
+	.8byte	.LBE1122
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1128
-	.8byte	.LBE1128
-	.8byte	.LBB1163
-	.8byte	.LBE1163
-	.8byte	.LBB1204
-	.8byte	.LBE1204
-	.8byte	.LBB1205
-	.8byte	.LBE1205
-	.8byte	.LBB1212
-	.8byte	.LBE1212
+	.8byte	.LBB1118
+	.8byte	.LBE1118
+	.8byte	.LBB1121
+	.8byte	.LBE1121
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1131
-	.8byte	.LBE1131
+	.8byte	.LBB1126
+	.8byte	.LBE1126
+	.8byte	.LBB1161
+	.8byte	.LBE1161
+	.8byte	.LBB1202
+	.8byte	.LBE1202
+	.8byte	.LBB1203
+	.8byte	.LBE1203
+	.8byte	.LBB1210
+	.8byte	.LBE1210
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1129
+	.8byte	.LBE1129
+	.8byte	.LBB1142
+	.8byte	.LBE1142
+	.8byte	.LBB1143
+	.8byte	.LBE1143
 	.8byte	.LBB1144
 	.8byte	.LBE1144
-	.8byte	.LBB1145
-	.8byte	.LBE1145
-	.8byte	.LBB1146
-	.8byte	.LBE1146
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1149
-	.8byte	.LBE1149
-	.8byte	.LBB1154
-	.8byte	.LBE1154
+	.8byte	.LBB1147
+	.8byte	.LBE1147
+	.8byte	.LBB1152
+	.8byte	.LBE1152
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1164
-	.8byte	.LBE1164
-	.8byte	.LBB1199
-	.8byte	.LBE1199
-	.8byte	.LBB1208
-	.8byte	.LBE1208
-	.8byte	.LBB1209
-	.8byte	.LBE1209
-	.8byte	.LBB1214
-	.8byte	.LBE1214
+	.8byte	.LBB1162
+	.8byte	.LBE1162
+	.8byte	.LBB1197
+	.8byte	.LBE1197
+	.8byte	.LBB1206
+	.8byte	.LBE1206
+	.8byte	.LBB1207
+	.8byte	.LBE1207
+	.8byte	.LBB1212
+	.8byte	.LBE1212
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1167
-	.8byte	.LBE1167
+	.8byte	.LBB1165
+	.8byte	.LBE1165
+	.8byte	.LBB1178
+	.8byte	.LBE1178
+	.8byte	.LBB1179
+	.8byte	.LBE1179
 	.8byte	.LBB1180
 	.8byte	.LBE1180
-	.8byte	.LBB1181
-	.8byte	.LBE1181
-	.8byte	.LBB1182
-	.8byte	.LBE1182
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1185
-	.8byte	.LBE1185
-	.8byte	.LBB1190
-	.8byte	.LBE1190
+	.8byte	.LBB1183
+	.8byte	.LBE1183
+	.8byte	.LBB1188
+	.8byte	.LBE1188
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1222
-	.8byte	.LBE1222
-	.8byte	.LBB1225
-	.8byte	.LBE1225
+	.8byte	.LBB1220
+	.8byte	.LBE1220
+	.8byte	.LBB1223
+	.8byte	.LBE1223
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1246
-	.8byte	.LBE1246
-	.8byte	.LBB1252
-	.8byte	.LBE1252
+	.8byte	.LBB1244
+	.8byte	.LBE1244
+	.8byte	.LBB1250
+	.8byte	.LBE1250
+	.8byte	.LBB1256
+	.8byte	.LBE1256
 	.8byte	.LBB1258
 	.8byte	.LBE1258
 	.8byte	.LBB1260
 	.8byte	.LBE1260
-	.8byte	.LBB1262
-	.8byte	.LBE1262
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1253
-	.8byte	.LBE1253
+	.8byte	.LBB1251
+	.8byte	.LBE1251
+	.8byte	.LBB1257
+	.8byte	.LBE1257
 	.8byte	.LBB1259
 	.8byte	.LBE1259
 	.8byte	.LBB1261
 	.8byte	.LBE1261
-	.8byte	.LBB1263
-	.8byte	.LBE1263
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1264
-	.8byte	.LBE1264
-	.8byte	.LBB1311
-	.8byte	.LBE1311
-	.8byte	.LBB1312
-	.8byte	.LBE1312
+	.8byte	.LBB1262
+	.8byte	.LBE1262
+	.8byte	.LBB1309
+	.8byte	.LBE1309
+	.8byte	.LBB1310
+	.8byte	.LBE1310
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1267
-	.8byte	.LBE1267
+	.8byte	.LBB1265
+	.8byte	.LBE1265
+	.8byte	.LBB1277
+	.8byte	.LBE1277
 	.8byte	.LBB1279
 	.8byte	.LBE1279
 	.8byte	.LBB1281
 	.8byte	.LBE1281
-	.8byte	.LBB1283
-	.8byte	.LBE1283
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1272
-	.8byte	.LBE1272
+	.8byte	.LBB1270
+	.8byte	.LBE1270
+	.8byte	.LBB1278
+	.8byte	.LBE1278
 	.8byte	.LBB1280
 	.8byte	.LBE1280
-	.8byte	.LBB1282
-	.8byte	.LBE1282
+	.8byte	.LBB1289
+	.8byte	.LBE1289
 	.8byte	.LBB1291
 	.8byte	.LBE1291
 	.8byte	.LBB1293
 	.8byte	.LBE1293
-	.8byte	.LBB1295
-	.8byte	.LBE1295
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1284
-	.8byte	.LBE1284
+	.8byte	.LBB1282
+	.8byte	.LBE1282
+	.8byte	.LBB1290
+	.8byte	.LBE1290
 	.8byte	.LBB1292
 	.8byte	.LBE1292
-	.8byte	.LBB1294
-	.8byte	.LBE1294
+	.8byte	.LBB1299
+	.8byte	.LBE1299
 	.8byte	.LBB1301
 	.8byte	.LBE1301
 	.8byte	.LBB1303
 	.8byte	.LBE1303
-	.8byte	.LBB1305
-	.8byte	.LBE1305
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1296
-	.8byte	.LBE1296
+	.8byte	.LBB1294
+	.8byte	.LBE1294
+	.8byte	.LBB1300
+	.8byte	.LBE1300
 	.8byte	.LBB1302
 	.8byte	.LBE1302
 	.8byte	.LBB1304
 	.8byte	.LBE1304
-	.8byte	.LBB1306
-	.8byte	.LBE1306
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1331
-	.8byte	.LBE1331
-	.8byte	.LBB1370
-	.8byte	.LBE1370
+	.8byte	.LBB1329
+	.8byte	.LBE1329
+	.8byte	.LBB1368
+	.8byte	.LBE1368
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1334
-	.8byte	.LBE1334
-	.8byte	.LBB1343
-	.8byte	.LBE1343
+	.8byte	.LBB1332
+	.8byte	.LBE1332
+	.8byte	.LBB1341
+	.8byte	.LBE1341
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1348
-	.8byte	.LBE1348
+	.8byte	.LBB1346
+	.8byte	.LBE1346
+	.8byte	.LBB1359
+	.8byte	.LBE1359
 	.8byte	.LBB1361
 	.8byte	.LBE1361
 	.8byte	.LBB1363
@@ -51815,104 +52042,102 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1365
 	.8byte	.LBB1367
 	.8byte	.LBE1367
-	.8byte	.LBB1369
-	.8byte	.LBE1369
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1355
-	.8byte	.LBE1355
+	.8byte	.LBB1353
+	.8byte	.LBE1353
+	.8byte	.LBB1360
+	.8byte	.LBE1360
 	.8byte	.LBB1362
 	.8byte	.LBE1362
 	.8byte	.LBB1364
 	.8byte	.LBE1364
 	.8byte	.LBB1366
 	.8byte	.LBE1366
-	.8byte	.LBB1368
-	.8byte	.LBE1368
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1369
+	.8byte	.LBE1369
+	.8byte	.LBB1378
+	.8byte	.LBE1378
+	.8byte	.LBB1379
+	.8byte	.LBE1379
+	.8byte	.LBB1390
+	.8byte	.LBE1390
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1371
 	.8byte	.LBE1371
+	.8byte	.LBB1374
+	.8byte	.LBE1374
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB1380
 	.8byte	.LBE1380
-	.8byte	.LBB1381
-	.8byte	.LBE1381
-	.8byte	.LBB1392
-	.8byte	.LBE1392
+	.8byte	.LBB1384
+	.8byte	.LBE1384
+	.8byte	.LBB1385
+	.8byte	.LBE1385
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1373
-	.8byte	.LBE1373
-	.8byte	.LBB1376
-	.8byte	.LBE1376
+	.8byte	.LBB1399
+	.8byte	.LBE1399
+	.8byte	.LBB1406
+	.8byte	.LBE1406
+	.8byte	.LBB1407
+	.8byte	.LBE1407
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1382
-	.8byte	.LBE1382
-	.8byte	.LBB1386
-	.8byte	.LBE1386
-	.8byte	.LBB1387
-	.8byte	.LBE1387
+	.8byte	.LBB1400
+	.8byte	.LBE1400
+	.8byte	.LBB1405
+	.8byte	.LBE1405
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1401
-	.8byte	.LBE1401
 	.8byte	.LBB1408
 	.8byte	.LBE1408
-	.8byte	.LBB1409
-	.8byte	.LBE1409
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1402
-	.8byte	.LBE1402
-	.8byte	.LBB1407
-	.8byte	.LBE1407
+	.8byte	.LBB1415
+	.8byte	.LBE1415
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1410
 	.8byte	.LBE1410
-	.8byte	.LBB1417
-	.8byte	.LBE1417
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1412
-	.8byte	.LBE1412
-	.8byte	.LBB1415
-	.8byte	.LBE1415
+	.8byte	.LBB1413
+	.8byte	.LBE1413
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1580
-	.8byte	.LBE1580
-	.8byte	.LBB1583
-	.8byte	.LBE1583
+	.8byte	.LBB1578
+	.8byte	.LBE1578
+	.8byte	.LBB1581
+	.8byte	.LBE1581
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1590
-	.8byte	.LBE1590
+	.8byte	.LBB1588
+	.8byte	.LBE1588
+	.8byte	.LBB1662
+	.8byte	.LBE1662
+	.8byte	.LBB1663
+	.8byte	.LBE1663
 	.8byte	.LBB1664
 	.8byte	.LBE1664
-	.8byte	.LBB1665
-	.8byte	.LBE1665
-	.8byte	.LBB1666
-	.8byte	.LBE1666
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1592
-	.8byte	.LBE1592
+	.8byte	.LBB1590
+	.8byte	.LBE1590
+	.8byte	.LBB1599
+	.8byte	.LBE1599
+	.8byte	.LBB1600
+	.8byte	.LBE1600
 	.8byte	.LBB1601
 	.8byte	.LBE1601
-	.8byte	.LBB1602
-	.8byte	.LBE1602
-	.8byte	.LBB1603
-	.8byte	.LBE1603
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1667
-	.8byte	.LBE1667
-	.8byte	.LBB1692
-	.8byte	.LBE1692
-	.8byte	.LBB1693
-	.8byte	.LBE1693
+	.8byte	.LBB1665
+	.8byte	.LBE1665
+	.8byte	.LBB1690
+	.8byte	.LBE1690
+	.8byte	.LBB1691
+	.8byte	.LBE1691
 	.8byte	.LBB1702
 	.8byte	.LBE1702
 	.8byte	.LBB1753
@@ -51921,24 +52146,24 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1758
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1669
-	.8byte	.LBE1669
-	.8byte	.LBB1672
-	.8byte	.LBE1672
+	.8byte	.LBB1667
+	.8byte	.LBE1667
+	.8byte	.LBB1670
+	.8byte	.LBE1670
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1673
-	.8byte	.LBE1673
+	.8byte	.LBB1671
+	.8byte	.LBE1671
+	.8byte	.LBB1676
+	.8byte	.LBE1676
+	.8byte	.LBB1677
+	.8byte	.LBE1677
 	.8byte	.LBB1678
 	.8byte	.LBE1678
-	.8byte	.LBB1679
-	.8byte	.LBE1679
-	.8byte	.LBB1680
-	.8byte	.LBE1680
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1694
-	.8byte	.LBE1694
+	.8byte	.LBB1692
+	.8byte	.LBE1692
 	.8byte	.LBB1703
 	.8byte	.LBE1703
 	.8byte	.LBB1755
@@ -51949,6 +52174,12 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1761
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1694
+	.8byte	.LBE1694
+	.8byte	.LBB1697
+	.8byte	.LBE1697
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB1704
 	.8byte	.LBE1704
 	.8byte	.LBB1756
@@ -52055,10 +52286,10 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0
-	.8byte	.LFB2853
-	.8byte	.LFE2853
-	.8byte	.LFB2852
-	.8byte	.LFE2852
+	.8byte	.LFB2855
+	.8byte	.LFE2855
+	.8byte	.LFB2854
+	.8byte	.LFE2854
 	.8byte	0
 	.8byte	0
 	.section	.debug_line,"",@progbits
@@ -52082,7 +52313,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_REQ_IDLE"
 .LASF2381:
 	.string	"suppliers"
-.LASF3044:
+.LASF3048:
 	.string	"ebc_buffer_manage_init"
 .LASF2880:
 	.string	"EPD_FULL_GCC16"
@@ -52094,7 +52325,7 @@ __exitcall_ebc_exit:
 	.string	"PE_SIZE_PUD"
 .LASF2591:
 	.string	"__tracepoint_page_ref_mod"
-.LASF2971:
+.LASF2973:
 	.string	"full_mode_num"
 .LASF1043:
 	.string	"nr_wakeups"
@@ -52140,7 +52371,7 @@ __exitcall_ebc_exit:
 	.string	"dev_kobj"
 .LASF475:
 	.string	"d_release"
-.LASF3156:
+.LASF3160:
 	.string	"get_arch_dma_ops"
 .LASF305:
 	.string	"__ctors_start"
@@ -52174,7 +52405,7 @@ __exitcall_ebc_exit:
 	.string	"si_code"
 .LASF649:
 	.string	"thread_node"
-.LASF3092:
+.LASF3097:
 	.string	"temperature"
 .LASF1302:
 	.string	"map_pages"
@@ -52208,15 +52439,15 @@ __exitcall_ebc_exit:
 	.string	"system_wq"
 .LASF604:
 	.string	"rcu_read_lock_nesting"
-.LASF2989:
+.LASF2991:
 	.string	"suspend_lock"
 .LASF2530:
 	.string	"gpio_desc"
 .LASF962:
 	.string	"list"
-.LASF3173:
+.LASF3177:
 	.string	"_copy_from_user"
-.LASF3199:
+.LASF3203:
 	.string	"get_order"
 .LASF945:
 	.string	"si_errno"
@@ -52250,7 +52481,7 @@ __exitcall_ebc_exit:
 	.string	"mm_rb"
 .LASF2187:
 	.string	"freeze_late"
-.LASF3064:
+.LASF3069:
 	.string	"buf_info"
 .LASF409:
 	.string	"d_inode"
@@ -52274,7 +52505,7 @@ __exitcall_ebc_exit:
 	.string	"n_node"
 .LASF1624:
 	.string	"qsize_t"
-.LASF3196:
+.LASF3200:
 	.string	"devm_kzalloc"
 .LASF380:
 	.string	"sequence"
@@ -52290,7 +52521,7 @@ __exitcall_ebc_exit:
 	.string	"s_state"
 .LASF1066:
 	.string	"run_list"
-.LASF3113:
+.LASF3117:
 	.string	"clac_full_data_align8"
 .LASF2553:
 	.string	"SCHED_SOFTIRQ"
@@ -52312,7 +52543,7 @@ __exitcall_ebc_exit:
 	.string	"param_ops_uint"
 .LASF891:
 	.string	"softirq_activated"
-.LASF3028:
+.LASF3032:
 	.string	"pdev"
 .LASF827:
 	.string	"system_long_wq"
@@ -52336,7 +52567,7 @@ __exitcall_ebc_exit:
 	.string	"c_true"
 .LASF1578:
 	.string	"notifier_call"
-.LASF3071:
+.LASF3076:
 	.string	"ebc_exit"
 .LASF1833:
 	.string	"gendisk"
@@ -52362,7 +52593,7 @@ __exitcall_ebc_exit:
 	.string	"size_t"
 .LASF209:
 	.string	"compat_elf_hwcap"
-.LASF3274:
+.LASF3278:
 	.string	"prepare_to_wait_event"
 .LASF1110:
 	.string	"cap_permitted"
@@ -52404,7 +52635,7 @@ __exitcall_ebc_exit:
 	.string	"__reserved"
 .LASF940:
 	.string	"_sigfault"
-.LASF3127:
+.LASF3131:
 	.string	"image_bg"
 .LASF2858:
 	.string	"ebc_buf_status"
@@ -52456,7 +52687,7 @@ __exitcall_ebc_exit:
 	.string	"bin_attribute"
 .LASF1603:
 	.string	"percpu_counter"
-.LASF2991:
+.LASF2993:
 	.string	"first_in"
 .LASF2329:
 	.string	"dev_groups"
@@ -52494,9 +52725,9 @@ __exitcall_ebc_exit:
 	.string	"irqchip_fwnode_ops"
 .LASF1614:
 	.string	"dq_id"
-.LASF3118:
+.LASF3122:
 	.string	"frame_count_tmp"
-.LASF3126:
+.LASF3130:
 	.string	"image_fb"
 .LASF1789:
 	.string	"write_end"
@@ -52504,7 +52735,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ION_HEAP_POOL"
 .LASF1424:
 	.string	"sysctl_protected_hardlinks"
-.LASF3278:
+.LASF3282:
 	.string	"__arch_copy_from_user"
 .LASF1177:
 	.string	"scan_objects"
@@ -52512,7 +52743,7 @@ __exitcall_ebc_exit:
 	.string	"pageset"
 .LASF1238:
 	.string	"wb_err"
-.LASF3170:
+.LASF3174:
 	.string	"copy_to_user"
 .LASF735:
 	.string	"trace_recursion"
@@ -52526,7 +52757,7 @@ __exitcall_ebc_exit:
 	.string	"jit_keyring"
 .LASF169:
 	.string	"file_disp"
-.LASF2968:
+.LASF2970:
 	.string	"auto_need_refresh"
 .LASF2846:
 	.string	"WF_TYPE_GRAY2"
@@ -52608,7 +52839,7 @@ __exitcall_ebc_exit:
 	.string	"lgonl"
 .LASF535:
 	.string	"destroy_work"
-.LASF3080:
+.LASF3085:
 	.string	"one_buffer_end"
 .LASF254:
 	.string	"FTR_LOWER_SAFE"
@@ -52624,7 +52855,7 @@ __exitcall_ebc_exit:
 	.string	"pcpu_chosen_fc"
 .LASF391:
 	.string	"dentry_stat_t"
-.LASF3224:
+.LASF3228:
 	.string	"atomic_add"
 .LASF1643:
 	.string	"dqi_bgrace"
@@ -52642,7 +52873,7 @@ __exitcall_ebc_exit:
 	.string	"ctl_table"
 .LASF44:
 	.string	"uid_t"
-.LASF3253:
+.LASF3257:
 	.string	"strstr"
 .LASF2848:
 	.string	"WF_TYPE_A2"
@@ -52704,7 +52935,7 @@ __exitcall_ebc_exit:
 	.string	"pteval_t"
 .LASF430:
 	.string	"i_ino"
-.LASF3296:
+.LASF3300:
 	.string	"might_fault"
 .LASF1562:
 	.string	"compact_cached_free_pfn"
@@ -52822,7 +53053,7 @@ __exitcall_ebc_exit:
 	.string	"pidfd_fops"
 .LASF1917:
 	.string	"lm_put_owner"
-.LASF3255:
+.LASF3259:
 	.string	"ebc_pmic_verity_vcom"
 .LASF2524:
 	.string	"set_sda"
@@ -52888,7 +53119,7 @@ __exitcall_ebc_exit:
 	.string	"func"
 .LASF1141:
 	.string	"perf_event_context"
-.LASF3002:
+.LASF3004:
 	.string	"ebc_auto_task"
 .LASF94:
 	.string	"printk_delay_msec"
@@ -52918,9 +53149,11 @@ __exitcall_ebc_exit:
 	.string	"wake_q_node"
 .LASF1117:
 	.string	"request_key_auth"
+.LASF3013:
+	.string	"waveform_misc"
 .LASF1954:
 	.string	"destroy_inode"
-.LASF2965:
+.LASF2967:
 	.string	"is_busy_now"
 .LASF58:
 	.string	"irq_hw_number_t"
@@ -52928,11 +53161,11 @@ __exitcall_ebc_exit:
 	.string	"sysfs_dev_block_kobj"
 .LASF555:
 	.string	"upid"
-.LASF3285:
+.LASF3289:
 	.string	"down_write"
 .LASF1099:
 	.string	"completion"
-.LASF3078:
+.LASF3083:
 	.string	"old_prev_buf"
 .LASF1500:
 	.string	"NR_GPU_HEAP"
@@ -52946,13 +53179,13 @@ __exitcall_ebc_exit:
 	.string	"__con_initcall_end"
 .LASF1146:
 	.string	"active_uprobe"
-.LASF3006:
+.LASF3008:
 	.string	"ebc_poweroff_wq"
 .LASF1972:
 	.string	"show_options"
 .LASF2143:
 	.string	"uevent_helper"
-.LASF3048:
+.LASF2965:
 	.string	"lut_buffer_phy"
 .LASF110:
 	.string	"mmap_supported_flags"
@@ -52982,7 +53215,7 @@ __exitcall_ebc_exit:
 	.string	"taint_flag"
 .LASF1979:
 	.string	"get_dquots"
-.LASF3264:
+.LASF3268:
 	.string	"of_find_node_by_phandle"
 .LASF2403:
 	.string	"unmap_page"
@@ -53006,7 +53239,7 @@ __exitcall_ebc_exit:
 	.string	"vm_operations_struct"
 .LASF2391:
 	.string	"hwirq_max"
-.LASF3222:
+.LASF3226:
 	.string	"__fswab32"
 .LASF2199:
 	.string	"runtime_idle"
@@ -53036,13 +53269,13 @@ __exitcall_ebc_exit:
 	.string	"RPM_SUSPENDED"
 .LASF698:
 	.string	"reclaim_state"
-.LASF3295:
+.LASF3299:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF138:
 	.string	"vendor_panic_cb"
-.LASF3073:
+.LASF3078:
 	.string	"ebc_vdd_power_timeout"
-.LASF3142:
+.LASF3146:
 	.string	"ebc_get_4pix_wf"
 .LASF2799:
 	.string	"num_symtab"
@@ -53064,19 +53297,21 @@ __exitcall_ebc_exit:
 	.string	"_refcount"
 .LASF466:
 	.string	"i_crypt_info"
+.LASF3063:
+	.string	"waveform_mmap"
 .LASF1872:
 	.string	"flc_flock"
 .LASF2777:
 	.string	"module_alloc_base"
 .LASF1752:
 	.string	"core_kallsyms"
-.LASF3258:
+.LASF3262:
 	.string	"memcpy"
 .LASF2895:
 	.string	"EPD_FORCE_FULL"
 .LASF2401:
 	.string	"get_sgtable"
-.LASF3122:
+.LASF3126:
 	.string	"xor_val"
 .LASF2156:
 	.string	"envp_idx"
@@ -53088,11 +53323,11 @@ __exitcall_ebc_exit:
 	.string	"OOM_KILL"
 .LASF445:
 	.string	"i_hash"
-.LASF3105:
+.LASF3109:
 	.string	"gray_old"
 .LASF68:
 	.string	"hlist_node"
-.LASF3267:
+.LASF3271:
 	.string	"sprintf"
 .LASF1909:
 	.string	"fl_ops"
@@ -53102,7 +53337,7 @@ __exitcall_ebc_exit:
 	.string	"debug_guardpage_ops"
 .LASF2674:
 	.string	"COMPACTISOLATED"
-.LASF3235:
+.LASF3239:
 	.string	"of_property_read_variable_u32_array"
 .LASF328:
 	.string	"__inittext_begin"
@@ -53138,7 +53373,7 @@ __exitcall_ebc_exit:
 	.string	"DOMAIN_BUS_WAKEUP"
 .LASF1223:
 	.string	"arm64_el2_vector_last_slot"
-.LASF3290:
+.LASF3294:
 	.string	"queue_work_on"
 .LASF2336:
 	.string	"online"
@@ -53146,17 +53381,17 @@ __exitcall_ebc_exit:
 	.string	"runtime_resume"
 .LASF1208:
 	.string	"dup_xol_work"
-.LASF3163:
+.LASF3167:
 	.string	"ebc_pmic_read_temp"
 .LASF2876:
 	.string	"EPD_FULL_GC16"
-.LASF3015:
+.LASF3019:
 	.string	"dev_attr_ebc_state"
 .LASF2162:
 	.string	"kernel_kobj"
 .LASF2588:
 	.string	"funcs"
-.LASF2998:
+.LASF3000:
 	.string	"overlay_enable"
 .LASF1108:
 	.string	"securebits"
@@ -53176,7 +53411,7 @@ __exitcall_ebc_exit:
 	.string	"DOMAIN_BUS_NEXUS"
 .LASF2039:
 	.string	"sysctl_mount_point"
-.LASF2994:
+.LASF2996:
 	.string	"auto_buffer_work"
 .LASF267:
 	.string	"user_mask"
@@ -53240,7 +53475,7 @@ __exitcall_ebc_exit:
 	.string	"f_mode"
 .LASF1430:
 	.string	"ki_complete"
-.LASF3031:
+.LASF3035:
 	.string	"ebc_tcon_pdev"
 .LASF1756:
 	.string	"percpu"
@@ -53260,13 +53495,13 @@ __exitcall_ebc_exit:
 	.string	"driver"
 .LASF1545:
 	.string	"ZONE_NORMAL"
-.LASF3128:
+.LASF3132:
 	.string	"image_new_data"
 .LASF426:
 	.string	"i_op"
 .LASF1687:
 	.string	"d_rt_spc_hardlimit"
-.LASF2977:
+.LASF2979:
 	.string	"ebc_task"
 .LASF2127:
 	.string	"kobj_ns_type_operations"
@@ -53314,7 +53549,7 @@ __exitcall_ebc_exit:
 	.string	"huge_fault"
 .LASF2009:
 	.string	"kstatfs"
-.LASF3166:
+.LASF3170:
 	.string	"ebc_pmic_power_off"
 .LASF2635:
 	.string	"PGPGOUTCLEAN"
@@ -53332,7 +53567,7 @@ __exitcall_ebc_exit:
 	.string	"i_dentry"
 .LASF2129:
 	.string	"grab_current_ns"
-.LASF3046:
+.LASF3050:
 	.string	"fb_size"
 .LASF884:
 	.string	"offset"
@@ -53342,7 +53577,7 @@ __exitcall_ebc_exit:
 	.string	"fsnotify_mark_connector"
 .LASF942:
 	.string	"_sigsys"
-.LASF3091:
+.LASF3096:
 	.string	"ebc_lut_update"
 .LASF1922:
 	.string	"lm_setup"
@@ -53376,7 +53611,7 @@ __exitcall_ebc_exit:
 	.string	"idmap_pg_dir"
 .LASF2519:
 	.string	"i2c_bus_recovery_info"
-.LASF3049:
+.LASF2966:
 	.string	"lut_buffer_size"
 .LASF484:
 	.string	"s_dev"
@@ -53386,7 +53621,7 @@ __exitcall_ebc_exit:
 	.string	"get_next_id"
 .LASF238:
 	.string	"rwlock_t"
-.LASF3294:
+.LASF3298:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
 .LASF841:
 	.string	"pgprot"
@@ -53414,7 +53649,7 @@ __exitcall_ebc_exit:
 	.string	"__icache_flags"
 .LASF148:
 	.string	"crash_kexec_post_notifiers"
-.LASF3151:
+.LASF3155:
 	.string	"eink_mode"
 .LASF1698:
 	.string	"rt_spc_warnlimit"
@@ -53436,7 +53671,7 @@ __exitcall_ebc_exit:
 	.string	"_pid"
 .LASF1157:
 	.string	"init_stack"
-.LASF3134:
+.LASF3138:
 	.string	"dmask"
 .LASF1226:
 	.string	"address_space"
@@ -53448,13 +53683,13 @@ __exitcall_ebc_exit:
 	.string	"sysctl_nr_open"
 .LASF82:
 	.string	"reset_devices"
-.LASF2980:
+.LASF2982:
 	.string	"auto_image_bg"
 .LASF447:
 	.string	"i_wb"
 .LASF2087:
 	.string	"idr_next"
-.LASF3119:
+.LASF3123:
 	.string	"frame_count_data"
 .LASF2956:
 	.string	"frame_start"
@@ -53504,7 +53739,7 @@ __exitcall_ebc_exit:
 	.string	"normal_prio"
 .LASF1289:
 	.string	"f_ep_links"
-.LASF3132:
+.LASF3136:
 	.string	"image_fb_tmp"
 .LASF2295:
 	.string	"last_busy"
@@ -53516,7 +53751,7 @@ __exitcall_ebc_exit:
 	.string	"host"
 .LASF185:
 	.string	"uaddr"
-.LASF3287:
+.LASF3291:
 	.string	"ebc_remove_from_dsp_buf_list"
 .LASF662:
 	.string	"real_start_time"
@@ -53552,11 +53787,11 @@ __exitcall_ebc_exit:
 	.string	"devres_head"
 .LASF428:
 	.string	"i_mapping"
-.LASF3259:
+.LASF3263:
 	.string	"misc_register"
 .LASF723:
 	.string	"rseq_sig"
-.LASF3185:
+.LASF3189:
 	.string	"platform_set_drvdata"
 .LASF343:
 	.string	"cpu_context"
@@ -53564,7 +53799,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pm_domain"
 .LASF1514:
 	.string	"nr_zones"
-.LASF3208:
+.LASF3212:
 	.string	"is_source"
 .LASF1376:
 	.string	"migrate_mode"
@@ -53586,11 +53821,11 @@ __exitcall_ebc_exit:
 	.string	"d_hash"
 .LASF1076:
 	.string	"dl_bw"
-.LASF3178:
+.LASF3182:
 	.string	"limit"
 .LASF2146:
 	.string	"kobj"
-.LASF3268:
+.LASF3272:
 	.string	"kstrtouint"
 .LASF114:
 	.string	"fsync"
@@ -53600,13 +53835,13 @@ __exitcall_ebc_exit:
 	.string	"i_flags"
 .LASF2893:
 	.string	"EPD_RESUME"
-.LASF3254:
+.LASF3258:
 	.string	"sscanf"
-.LASF3250:
+.LASF3254:
 	.string	"ebc_empty_buf_get"
 .LASF1475:
 	.string	"NR_ISOLATED_ANON"
-.LASF3047:
+.LASF3051:
 	.string	"ebc_lut_table_init"
 .LASF1214:
 	.string	"uprobes_state"
@@ -53616,7 +53851,7 @@ __exitcall_ebc_exit:
 	.string	"rb_node"
 .LASF614:
 	.string	"pushable_tasks"
-.LASF3133:
+.LASF3137:
 	.string	"image_bg_tmp"
 .LASF2203:
 	.string	"platform_data"
@@ -53646,7 +53881,7 @@ __exitcall_ebc_exit:
 	.string	"last_update_time"
 .LASF1138:
 	.string	"robust_list_head"
-.LASF3248:
+.LASF3252:
 	.string	"init_timer_key"
 .LASF1481:
 	.string	"NR_ANON_MAPPED"
@@ -53660,7 +53895,7 @@ __exitcall_ebc_exit:
 	.string	"srcversion"
 .LASF859:
 	.string	"pcpu_unit_offsets"
-.LASF3154:
+.LASF3158:
 	.string	"dma_sync_single_for_device"
 .LASF2957:
 	.string	"dsp_end_callback"
@@ -53686,7 +53921,7 @@ __exitcall_ebc_exit:
 	.string	"usage_count"
 .LASF2078:
 	.string	"show"
-.LASF3012:
+.LASF3016:
 	.string	"dev_attr_pmic_temp"
 .LASF7:
 	.string	"unsigned char"
@@ -53702,7 +53937,7 @@ __exitcall_ebc_exit:
 	.string	"task_rss_stat"
 .LASF1142:
 	.string	"pipe_inode_info"
-.LASF2984:
+.LASF2986:
 	.string	"ebc_power_status"
 .LASF961:
 	.string	"ratelimit"
@@ -53718,7 +53953,7 @@ __exitcall_ebc_exit:
 	.string	"uevent_ops"
 .LASF546:
 	.string	"rename_lock"
-.LASF3079:
+.LASF3084:
 	.string	"__out"
 .LASF681:
 	.string	"sas_ss_sp"
@@ -53726,7 +53961,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_INACTIVE_ANON"
 .LASF729:
 	.string	"nr_dirtied"
-.LASF3195:
+.LASF3199:
 	.string	"dev_get_drvdata"
 .LASF2396:
 	.string	"linear_revmap"
@@ -53770,11 +54005,11 @@ __exitcall_ebc_exit:
 	.string	"sysctl_memory_failure_early_kill"
 .LASF2761:
 	.string	"param_ops_bool_enable_only"
-.LASF3139:
+.LASF3143:
 	.string	"power_status"
 .LASF307:
 	.string	"__start_opd"
-.LASF3263:
+.LASF3267:
 	.string	"of_find_i2c_device_by_node"
 .LASF154:
 	.string	"SYSTEM_RUNNING"
@@ -53810,11 +54045,11 @@ __exitcall_ebc_exit:
 	.string	"sigval_t"
 .LASF1934:
 	.string	"fa_file"
-.LASF3000:
+.LASF3002:
 	.string	"panel"
 .LASF2433:
 	.string	"irq_data"
-.LASF3086:
+.LASF3091:
 	.string	"old_buffer_temp"
 .LASF2706:
 	.string	"sysctl_memory_failure_recovery"
@@ -53832,7 +54067,7 @@ __exitcall_ebc_exit:
 	.string	"st_shndx"
 .LASF2400:
 	.string	"free"
-.LASF3054:
+.LASF3056:
 	.string	"pmic_vcom_write"
 .LASF2134:
 	.string	"attribute"
@@ -53848,7 +54083,7 @@ __exitcall_ebc_exit:
 	.string	"taint_flags"
 .LASF1348:
 	.string	"membarrier_state"
-.LASF3145:
+.LASF3149:
 	.string	"pre_image_addr"
 .LASF2179:
 	.string	"suspend"
@@ -53902,7 +54137,7 @@ __exitcall_ebc_exit:
 	.string	"path"
 .LASF2728:
 	.string	"st_size"
-.LASF3016:
+.LASF3020:
 	.string	"dev_attr_ebc_buf_state"
 .LASF189:
 	.string	"rmtp"
@@ -53940,7 +54175,7 @@ __exitcall_ebc_exit:
 	.string	"unlink"
 .LASF2718:
 	.string	"d_ptr"
-.LASF3056:
+.LASF3058:
 	.string	"pmic_temp_read"
 .LASF1653:
 	.string	"dqstats"
@@ -53962,7 +54197,7 @@ __exitcall_ebc_exit:
 	.string	"mmap_rnd_bits"
 .LASF2462:
 	.string	"of_stdout"
-.LASF3077:
+.LASF3082:
 	.string	"new_prev_buf"
 .LASF977:
 	.string	"vm_ops"
@@ -53978,9 +54213,9 @@ __exitcall_ebc_exit:
 	.string	"timer"
 .LASF2463:
 	.string	"devtree_lock"
-.LASF3136:
+.LASF3140:
 	.string	"refresh_new_image_auto"
-.LASF3067:
+.LASF3072:
 	.string	"__ret"
 .LASF1865:
 	.string	"update_time"
@@ -54004,11 +54239,11 @@ __exitcall_ebc_exit:
 	.string	"optimistic_spin_queue"
 .LASF2962:
 	.string	"ebc_buffer_size"
-.LASF3269:
+.LASF3273:
 	.string	"ebc_pmic_set_vcom"
 .LASF2642:
 	.string	"ALLOCSTALL_NORMAL"
-.LASF3109:
+.LASF3113:
 	.string	"data_buf_tmp"
 .LASF326:
 	.string	"__initdata_begin"
@@ -54086,7 +54321,7 @@ __exitcall_ebc_exit:
 	.string	"algo_data"
 .LASF1512:
 	.string	"node_zones"
-.LASF3013:
+.LASF3017:
 	.string	"dev_attr_pmic_vcom"
 .LASF1560:
 	.string	"initialized"
@@ -54176,7 +54411,7 @@ __exitcall_ebc_exit:
 	.string	"seq_show"
 .LASF767:
 	.string	"ate_match_dt"
-.LASF3193:
+.LASF3197:
 	.string	"of_node_put"
 .LASF1361:
 	.string	"cow_page"
@@ -54198,11 +54433,11 @@ __exitcall_ebc_exit:
 	.string	"param_ops_ushort"
 .LASF526:
 	.string	"s_shrink"
-.LASF3117:
+.LASF3121:
 	.string	"gray_new_temp"
 .LASF1526:
 	.string	"kcompactd_classzone_idx"
-.LASF3183:
+.LASF3187:
 	.string	"kmalloc_index"
 .LASF870:
 	.string	"hrtimer_restart"
@@ -54210,7 +54445,7 @@ __exitcall_ebc_exit:
 	.string	"totalram_pages"
 .LASF2487:
 	.string	"i2c_smbus_data"
-.LASF2988:
+.LASF2990:
 	.string	"curr_dsp_buf"
 .LASF1069:
 	.string	"time_slice"
@@ -54250,7 +54485,7 @@ __exitcall_ebc_exit:
 	.string	"wake_lock"
 .LASF2271:
 	.string	"may_skip_resume"
-.LASF2996:
+.LASF2998:
 	.string	"is_deep_sleep"
 .LASF1175:
 	.string	"shrinker"
@@ -54282,7 +54517,7 @@ __exitcall_ebc_exit:
 	.string	"ate_match_local_cap_id"
 .LASF2454:
 	.string	"property"
-.LASF3050:
+.LASF3052:
 	.string	"ebc_sysfs_init"
 .LASF992:
 	.string	"wchar"
@@ -54312,7 +54547,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_DELAYED_BIT"
 .LASF1039:
 	.string	"nr_failed_migrations_affine"
-.LASF3198:
+.LASF3202:
 	.string	"IS_ERR"
 .LASF862:
 	.string	"PCPU_FC_EMBED"
@@ -54326,7 +54561,7 @@ __exitcall_ebc_exit:
 	.string	"pi_top_task"
 .LASF806:
 	.string	"WORK_NR_COLORS"
-.LASF3137:
+.LASF3141:
 	.string	"refresh_new_image2"
 .LASF528:
 	.string	"s_fsnotify_inode_refs"
@@ -54338,7 +54573,7 @@ __exitcall_ebc_exit:
 	.string	"uprobe"
 .LASF529:
 	.string	"s_readonly_remount"
-.LASF3227:
+.LASF3231:
 	.string	"kasan_check_write"
 .LASF378:
 	.string	"hlist_bl_node"
@@ -54364,7 +54599,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_FLAG_MASK"
 .LASF1272:
 	.string	"units"
-.LASF3242:
+.LASF3246:
 	.string	"epd_lut_from_mem_init"
 .LASF312:
 	.string	"__nosave_begin"
@@ -54384,7 +54619,7 @@ __exitcall_ebc_exit:
 	.string	"user_namespace"
 .LASF2757:
 	.string	"param_ops_ulong"
-.LASF3215:
+.LASF3219:
 	.string	"get_current"
 .LASF232:
 	.string	"raw_spinlock"
@@ -54408,7 +54643,7 @@ __exitcall_ebc_exit:
 	.string	"fault_address"
 .LASF1607:
 	.string	"dq_inuse"
-.LASF3100:
+.LASF3104:
 	.string	"direct_mode_data_change_part"
 .LASF1642:
 	.string	"dqi_flags"
@@ -54416,9 +54651,9 @@ __exitcall_ebc_exit:
 	.string	"PGREFILL"
 .LASF2763:
 	.string	"param_ops_bint"
-.LASF3251:
+.LASF3255:
 	.string	"ebc_add_to_dsp_buf_list"
-.LASF3256:
+.LASF3260:
 	.string	"kfree"
 .LASF1803:
 	.string	"swap_deactivate"
@@ -54430,7 +54665,7 @@ __exitcall_ebc_exit:
 	.string	"WORKINGSET_REFAULT"
 .LASF1641:
 	.string	"dqi_dirty_list"
-.LASF3051:
+.LASF3053:
 	.string	"ebc_buf_state_read"
 .LASF230:
 	.string	"prove_locking"
@@ -54444,7 +54679,7 @@ __exitcall_ebc_exit:
 	.string	"gtime"
 .LASF573:
 	.string	"debug_locks"
-.LASF3003:
+.LASF3005:
 	.string	"auto_buf_sema"
 .LASF1784:
 	.string	"readpage"
@@ -54488,7 +54723,7 @@ __exitcall_ebc_exit:
 	.string	"boost_expires"
 .LASF2912:
 	.string	"DMA_BIDIRECTIONAL"
-.LASF3277:
+.LASF3281:
 	.string	"__arch_copy_to_user"
 .LASF236:
 	.string	"spinlock"
@@ -54506,13 +54741,13 @@ __exitcall_ebc_exit:
 	.string	"d_compare"
 .LASF972:
 	.string	"vm_mm"
-.LASF3087:
+.LASF3092:
 	.string	"need_refresh"
 .LASF2821:
 	.string	"platform_bus_type"
-.LASF3101:
+.LASF3105:
 	.string	"data_buf"
-.LASF3040:
+.LASF3044:
 	.string	"ulogo_buf"
 .LASF1638:
 	.string	"mem_dqinfo"
@@ -54530,7 +54765,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_OFFQ_POOL_BITS"
 .LASF1906:
 	.string	"fl_fasync"
-.LASF3148:
+.LASF3152:
 	.string	"update_mode"
 .LASF2939:
 	.string	"direct_mode"
@@ -54538,7 +54773,7 @@ __exitcall_ebc_exit:
 	.string	"cache_sync"
 .LASF436:
 	.string	"i_lock"
-.LASF2975:
+.LASF2977:
 	.string	"ebc_dsp_buf_status"
 .LASF408:
 	.string	"d_name"
@@ -54602,15 +54837,15 @@ __exitcall_ebc_exit:
 	.string	"page_ext_operations"
 .LASF2664:
 	.string	"KSWAPD_HIGH_WMARK_HIT_QUICKLY"
-.LASF3052:
+.LASF3054:
 	.string	"ebc_state_read"
-.LASF3265:
+.LASF3269:
 	.string	"__stack_chk_fail"
 .LASF2910:
 	.string	"pmic_set_vcom"
 .LASF2700:
 	.string	"stack_guard_gap"
-.LASF3207:
+.LASF3211:
 	.string	"bytes"
 .LASF1739:
 	.string	"gpl_future_crcs"
@@ -54642,7 +54877,7 @@ __exitcall_ebc_exit:
 	.string	"thaw_noirq"
 .LASF970:
 	.string	"vm_rb"
-.LASF3024:
+.LASF3028:
 	.string	"kernel_read_file_str"
 .LASF569:
 	.string	"init_user_ns"
@@ -54686,7 +54921,7 @@ __exitcall_ebc_exit:
 	.string	"cb_state"
 .LASF2922:
 	.string	"orig_nents"
-.LASF3066:
+.LASF3071:
 	.string	"buf_addr"
 .LASF413:
 	.string	"d_sb"
@@ -54714,7 +54949,7 @@ __exitcall_ebc_exit:
 	.string	"i_mtime"
 .LASF2605:
 	.string	"dev_page_fault_t"
-.LASF3094:
+.LASF3099:
 	.string	"ebc_auto_tast_function"
 .LASF24:
 	.string	"__kernel_gid32_t"
@@ -54726,7 +54961,7 @@ __exitcall_ebc_exit:
 	.string	"MODULE_STATE_COMING"
 .LASF2232:
 	.string	"offline_disabled"
-.LASF3191:
+.LASF3195:
 	.string	"of_property_read_u32_array"
 .LASF2477:
 	.string	"select"
@@ -54750,7 +54985,7 @@ __exitcall_ebc_exit:
 	.string	"async_put_work"
 .LASF2117:
 	.string	"kernfs_syscall_ops"
-.LASF2985:
+.LASF2987:
 	.string	"ebc_last_display"
 .LASF1858:
 	.string	"mknod"
@@ -54772,7 +55007,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pagemap"
 .LASF2649:
 	.string	"PGDEACTIVATE"
-.LASF3108:
+.LASF3112:
 	.string	"buffer_old_tmp"
 .LASF1785:
 	.string	"writepages"
@@ -54792,7 +55027,7 @@ __exitcall_ebc_exit:
 	.string	"writeback_control"
 .LASF1905:
 	.string	"fl_end"
-.LASF3280:
+.LASF3284:
 	.string	"ebc_find_buf_by_phy_addr"
 .LASF1952:
 	.string	"super_operations"
@@ -54832,13 +55067,13 @@ __exitcall_ebc_exit:
 	.string	"core"
 .LASF1816:
 	.string	"bd_holders"
-.LASF3098:
+.LASF3102:
 	.string	"reset_and_flip"
 .LASF2950:
 	.string	"enable"
 .LASF956:
 	.string	"pipe_bufs"
-.LASF3212:
+.LASF3216:
 	.string	"to_user"
 .LASF2125:
 	.string	"KOBJ_NS_TYPE_NET"
@@ -54858,7 +55093,7 @@ __exitcall_ebc_exit:
 	.string	"__rb_parent_color"
 .LASF2225:
 	.string	"devres_lock"
-.LASF3135:
+.LASF3139:
 	.string	"new_buffer_refresh"
 .LASF366:
 	.string	"bits"
@@ -54874,9 +55109,9 @@ __exitcall_ebc_exit:
 	.string	"lookup"
 .LASF1591:
 	.string	"cpu_topology"
-.LASF3216:
+.LASF3220:
 	.string	"sp_el0"
-.LASF3284:
+.LASF3288:
 	.string	"ebc_dsp_buf_get"
 .LASF2899:
 	.string	"panel_color"
@@ -54884,7 +55119,7 @@ __exitcall_ebc_exit:
 	.string	"fl_owner"
 .LASF2852:
 	.string	"WF_TYPE_GLD16"
-.LASF2997:
+.LASF2999:
 	.string	"is_power_off"
 .LASF980:
 	.string	"vm_private_data"
@@ -54898,7 +55133,7 @@ __exitcall_ebc_exit:
 	.string	"kobj_type"
 .LASF2623:
 	.string	"sysctl_overcommit_kbytes"
-.LASF2969:
+.LASF2971:
 	.string	"frame_left"
 .LASF2480:
 	.string	"deactivate"
@@ -54906,7 +55141,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_AUTO"
 .LASF1228:
 	.string	"i_pages"
-.LASF3175:
+.LASF3179:
 	.string	"safe_ptr"
 .LASF377:
 	.string	"hlist_bl_head"
@@ -54936,9 +55171,9 @@ __exitcall_ebc_exit:
 	.string	"unix_inflight"
 .LASF1727:
 	.string	"holders_dir"
-.LASF3068:
+.LASF3073:
 	.string	"__wq_entry"
-.LASF3082:
+.LASF3087:
 	.string	"new_buffer"
 .LASF464:
 	.string	"i_fsnotify_mask"
@@ -54946,7 +55181,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_LOW_WMARK_HIT_QUICKLY"
 .LASF995:
 	.string	"syscfs"
-.LASF3168:
+.LASF3172:
 	.string	"wake_unlock"
 .LASF2446:
 	.string	"graph_get_port_parent"
@@ -54954,7 +55189,7 @@ __exitcall_ebc_exit:
 	.string	"UNEVICTABLE_PGRESCUED"
 .LASF2210:
 	.string	"msi_list"
-.LASF3218:
+.LASF3222:
 	.string	"__ilog2_u64"
 .LASF548:
 	.string	"compat_time_t"
@@ -54978,7 +55213,7 @@ __exitcall_ebc_exit:
 	.string	"cap_effective"
 .LASF1747:
 	.string	"taints"
-.LASF3237:
+.LASF3241:
 	.string	"of_address_to_resource"
 .LASF1013:
 	.string	"enqueued"
@@ -55006,7 +55241,7 @@ __exitcall_ebc_exit:
 	.string	"bd_private"
 .LASF1904:
 	.string	"fl_start"
-.LASF3190:
+.LASF3194:
 	.string	"out_value"
 .LASF1962:
 	.string	"freeze_fs"
@@ -55014,7 +55249,7 @@ __exitcall_ebc_exit:
 	.string	"sigset_t"
 .LASF1918:
 	.string	"lm_notify"
-.LASF3147:
+.LASF3151:
 	.string	"ebc_tcon_dsp_mode_set"
 .LASF881:
 	.string	"running"
@@ -55040,7 +55275,7 @@ __exitcall_ebc_exit:
 	.string	"d_automount"
 .LASF1266:
 	.string	"page_free"
-.LASF3095:
+.LASF3100:
 	.string	"__val"
 .LASF1482:
 	.string	"NR_FILE_MAPPED"
@@ -55052,13 +55287,13 @@ __exitcall_ebc_exit:
 	.string	"copy_file_range"
 .LASF2686:
 	.string	"UNEVICTABLE_PGCLEARED"
-.LASF3270:
+.LASF3274:
 	.string	"epd_lut_get_wf_version"
 .LASF2048:
 	.string	"key_type"
 .LASF798:
 	.string	"WORK_STRUCT_LINKED_BIT"
-.LASF3209:
+.LASF3213:
 	.string	"copy_overflow"
 .LASF2442:
 	.string	"get_named_child_node"
@@ -55072,15 +55307,15 @@ __exitcall_ebc_exit:
 	.string	"clone_mnt_data"
 .LASF2778:
 	.string	"module_kobject"
-.LASF3045:
+.LASF3049:
 	.string	"memory"
-.LASF3182:
+.LASF3186:
 	.string	"order"
 .LASF740:
 	.string	"active_memcg"
 .LASF1333:
 	.string	"def_flags"
-.LASF3001:
+.LASF3003:
 	.string	"global_ebc"
 .LASF1474:
 	.string	"NR_SLAB_UNRECLAIMABLE"
@@ -55088,7 +55323,7 @@ __exitcall_ebc_exit:
 	.string	"refcount"
 .LASF1791:
 	.string	"invalidatepage"
-.LASF3072:
+.LASF3077:
 	.string	"ebc_frame_timeout"
 .LASF364:
 	.string	"wait_queue_head_t"
@@ -55110,7 +55345,7 @@ __exitcall_ebc_exit:
 	.string	"EPD_A2"
 .LASF2103:
 	.string	"kernfs_elem_attr"
-.LASF3085:
+.LASF3090:
 	.string	"new_buffer_temp"
 .LASF2300:
 	.string	"set_latency_tolerance"
@@ -55124,7 +55359,7 @@ __exitcall_ebc_exit:
 	.string	"arm64_ftr_reg_ctrel0"
 .LASF1245:
 	.string	"counters"
-.LASF3228:
+.LASF3232:
 	.string	"kasan_check_read"
 .LASF2060:
 	.string	"name_link"
@@ -55144,7 +55379,7 @@ __exitcall_ebc_exit:
 	.string	"policy"
 .LASF1294:
 	.string	"shared"
-.LASF3018:
+.LASF3022:
 	.string	"ebc_match"
 .LASF2948:
 	.string	"dclk"
@@ -55166,7 +55401,7 @@ __exitcall_ebc_exit:
 	.string	"module_sysfs_initialized"
 .LASF1003:
 	.string	"task_cputime"
-.LASF2972:
+.LASF2974:
 	.string	"lut_addr"
 .LASF1197:
 	.string	"rnode"
@@ -55176,7 +55411,7 @@ __exitcall_ebc_exit:
 	.string	"__con_initcall_start"
 .LASF1718:
 	.string	"get_dqblk"
-.LASF3030:
+.LASF3034:
 	.string	"ebc_tcon_node"
 .LASF2818:
 	.string	"id_entry"
@@ -55186,7 +55421,7 @@ __exitcall_ebc_exit:
 	.string	"nr_irqs"
 .LASF895:
 	.string	"max_hang_time"
-.LASF3171:
+.LASF3175:
 	.string	"copy_from_user"
 .LASF2468:
 	.string	"DOMAIN_BUS_ANY"
@@ -55200,9 +55435,9 @@ __exitcall_ebc_exit:
 	.string	"mmap_miss"
 .LASF1655:
 	.string	"quota_format_ops"
-.LASF3282:
+.LASF3286:
 	.string	"ebc_osd_buf_get"
-.LASF3063:
+.LASF3068:
 	.string	"argp"
 .LASF1755:
 	.string	"args"
@@ -55220,7 +55455,7 @@ __exitcall_ebc_exit:
 	.string	"static_key_initialized"
 .LASF2785:
 	.string	"module_uevent"
-.LASF3076:
+.LASF3081:
 	.string	"is_full_mode"
 .LASF2598:
 	.string	"base_pfn"
@@ -55228,7 +55463,7 @@ __exitcall_ebc_exit:
 	.string	"width"
 .LASF930:
 	.string	"_addr_pkey"
-.LASF3059:
+.LASF3061:
 	.string	"waveform_buffer"
 .LASF297:
 	.string	"__start_rodata"
@@ -55240,17 +55475,17 @@ __exitcall_ebc_exit:
 	.string	"thread_keyring"
 .LASF2746:
 	.string	"kparam_array"
-.LASF3230:
+.LASF3234:
 	.string	"platform_driver_unregister"
 .LASF653:
 	.string	"utime"
 .LASF1335:
 	.string	"start_code"
-.LASF3019:
+.LASF3023:
 	.string	"ebc_driver"
 .LASF2606:
 	.string	"dev_page_free_t"
-.LASF3188:
+.LASF3192:
 	.string	"of_property_read_u32"
 .LASF1399:
 	.string	"guid_t"
@@ -55270,7 +55505,7 @@ __exitcall_ebc_exit:
 	.string	"tz_minuteswest"
 .LASF2460:
 	.string	"of_chosen"
-.LASF3096:
+.LASF3101:
 	.string	"ebc_frame_start"
 .LASF349:
 	.string	"sve_state"
@@ -55280,7 +55515,7 @@ __exitcall_ebc_exit:
 	.string	"cpumask_t"
 .LASF134:
 	.string	"kmsg_fops"
-.LASF3279:
+.LASF3283:
 	.string	"ebc_buf_release"
 .LASF820:
 	.string	"WORK_STRUCT_NO_POOL"
@@ -55302,7 +55537,7 @@ __exitcall_ebc_exit:
 	.string	"sched_rt_entity"
 .LASF117:
 	.string	"sendpage"
-.LASF3141:
+.LASF3145:
 	.string	"ret_val"
 .LASF867:
 	.string	"timerqueue_node"
@@ -55312,7 +55547,7 @@ __exitcall_ebc_exit:
 	.string	"mem_dqblk"
 .LASF2773:
 	.string	"plt_entry"
-.LASF3149:
+.LASF3153:
 	.string	"display_mode"
 .LASF1981:
 	.string	"nr_cached_objects"
@@ -55344,11 +55579,11 @@ __exitcall_ebc_exit:
 	.string	"fops"
 .LASF1274:
 	.string	"f_path"
-.LASF3244:
+.LASF3248:
 	.string	"kthread_create_on_node"
 .LASF712:
 	.string	"cgroups"
-.LASF3174:
+.LASF3178:
 	.string	"__uaccess_mask_ptr"
 .LASF2345:
 	.string	"probe_type"
@@ -55368,9 +55603,9 @@ __exitcall_ebc_exit:
 	.string	"userspace_clients"
 .LASF2144:
 	.string	"uevent_seqnum"
-.LASF3240:
+.LASF3244:
 	.string	"memset"
-.LASF3146:
+.LASF3150:
 	.string	"cur_image_addr"
 .LASF2145:
 	.string	"list_lock"
@@ -55404,7 +55639,7 @@ __exitcall_ebc_exit:
 	.string	"file_lock_operations"
 .LASF344:
 	.string	"tp_value"
-.LASF3027:
+.LASF3031:
 	.string	"ebc_remove"
 .LASF1894:
 	.string	"fl_list"
@@ -55418,7 +55653,7 @@ __exitcall_ebc_exit:
 	.string	"qf_fmt_id"
 .LASF1051:
 	.string	"nr_wakeups_idle"
-.LASF3286:
+.LASF3290:
 	.string	"up_write"
 .LASF1459:
 	.string	"NR_MLOCK"
@@ -55438,7 +55673,7 @@ __exitcall_ebc_exit:
 	.string	"panel_16bit"
 .LASF1323:
 	.string	"page_table_lock"
-.LASF3017:
+.LASF3021:
 	.string	"ebc_pm"
 .LASF2841:
 	.string	"sched_priority"
@@ -55454,7 +55689,7 @@ __exitcall_ebc_exit:
 	.string	"console_printk"
 .LASF703:
 	.string	"ioac"
-.LASF3202:
+.LASF3206:
 	.string	"__init_work"
 .LASF1172:
 	.string	"nr_to_scan"
@@ -55466,7 +55701,7 @@ __exitcall_ebc_exit:
 	.string	"exec_max"
 .LASF1404:
 	.string	"uuid_index"
-.LASF3203:
+.LASF3207:
 	.string	"onstack"
 .LASF190:
 	.string	"compat_rmtp"
@@ -55478,7 +55713,7 @@ __exitcall_ebc_exit:
 	.string	"nfs_fl"
 .LASF403:
 	.string	"dentry"
-.LASF3220:
+.LASF3224:
 	.string	"__be32_to_cpup"
 .LASF2167:
 	.string	"klist_node"
@@ -55496,7 +55731,7 @@ __exitcall_ebc_exit:
 	.string	"__i_nlink"
 .LASF145:
 	.string	"panic_on_warn"
-.LASF3070:
+.LASF3075:
 	.string	"ebc_panel_probe"
 .LASF80:
 	.string	"boot_command_line"
@@ -55520,7 +55755,7 @@ __exitcall_ebc_exit:
 	.string	"css_set"
 .LASF1403:
 	.string	"guid_index"
-.LASF2974:
+.LASF2976:
 	.string	"ebc_irq_status"
 .LASF2545:
 	.string	"force_irqthreads"
@@ -55562,13 +55797,13 @@ __exitcall_ebc_exit:
 	.string	"d_rt_space"
 .LASF265:
 	.string	"name"
-.LASF3249:
+.LASF3253:
 	.string	"mod_timer"
 .LASF151:
 	.string	"early_boot_irqs_disabled"
 .LASF659:
 	.string	"nvcsw"
-.LASF3043:
+.LASF3047:
 	.string	"ebc_task_init"
 .LASF2833:
 	.string	"KMALLOC_NORMAL"
@@ -55588,7 +55823,7 @@ __exitcall_ebc_exit:
 	.string	"i_gid"
 .LASF1620:
 	.string	"quota_type"
-.LASF3103:
+.LASF3107:
 	.string	"buffer_old"
 .LASF1537:
 	.string	"high"
@@ -55604,11 +55839,11 @@ __exitcall_ebc_exit:
 	.string	"self_exec_id"
 .LASF1908:
 	.string	"fl_downgrade_time"
-.LASF2981:
+.LASF2983:
 	.string	"auto_frame_count"
 .LASF2105:
 	.string	"kernfs_ops"
-.LASF2978:
+.LASF2980:
 	.string	"auto_image_new"
 .LASF808:
 	.string	"WORK_CPU_UNBOUND"
@@ -55632,25 +55867,25 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_WRITE_PENDING"
 .LASF1297:
 	.string	"close"
-.LASF3129:
+.LASF3133:
 	.string	"image_fb_data"
-.LASF3041:
+.LASF3045:
 	.string	"klogo_buf"
 .LASF2894:
 	.string	"EPD_POWER_OFF"
 .LASF1502:
 	.string	"zone_reclaim_stat"
-.LASF3004:
+.LASF3006:
 	.string	"ebc_wq"
 .LASF737:
 	.string	"memcg_oom_gfp_mask"
-.LASF3205:
+.LASF3209:
 	.string	"_msecs_to_jiffies"
 .LASF1684:
 	.string	"d_spc_timer"
 .LASF1760:
 	.string	"jump_entries"
-.LASF3213:
+.LASF3217:
 	.string	"test_ti_thread_flag"
 .LASF2256:
 	.string	"async_suspend"
@@ -55660,7 +55895,7 @@ __exitcall_ebc_exit:
 	.string	"read_pos"
 .LASF482:
 	.string	"super_block"
-.LASF3176:
+.LASF3180:
 	.string	"__addr"
 .LASF2323:
 	.string	"dma_coherent"
@@ -55698,7 +55933,7 @@ __exitcall_ebc_exit:
 	.string	"map_sg"
 .LASF1160:
 	.string	"nlink"
-.LASF3036:
+.LASF3040:
 	.string	"ulogo_addr_valid"
 .LASF2578:
 	.string	"percpu_ref"
@@ -55706,11 +55941,11 @@ __exitcall_ebc_exit:
 	.string	"devkmsg_log_str"
 .LASF255:
 	.string	"FTR_HIGHER_SAFE"
-.LASF3187:
+.LASF3191:
 	.string	"i2c_get_clientdata"
-.LASF3172:
+.LASF3176:
 	.string	"_copy_to_user"
-.LASF3223:
+.LASF3227:
 	.string	"test_bit"
 .LASF249:
 	.string	"__start___jump_table"
@@ -55726,7 +55961,7 @@ __exitcall_ebc_exit:
 	.string	"mems_allowed_seq"
 .LASF1771:
 	.string	"refcnt"
-.LASF3088:
+.LASF3093:
 	.string	"pbuf_new"
 .LASF2182:
 	.string	"thaw"
@@ -55742,9 +55977,9 @@ __exitcall_ebc_exit:
 	.string	"futex"
 .LASF1026:
 	.string	"wait_max"
-.LASF3247:
+.LASF3251:
 	.string	"wakeup_source_add"
-.LASF3165:
+.LASF3169:
 	.string	"ebc_pmic_suspend"
 .LASF1159:
 	.string	"result_mask"
@@ -55756,15 +55991,15 @@ __exitcall_ebc_exit:
 	.string	"dquot_operations"
 .LASF1225:
 	.string	"mapping"
-.LASF3197:
+.LASF3201:
 	.string	"resource_size"
-.LASF3245:
+.LASF3249:
 	.string	"wake_up_process"
 .LASF1355:
 	.string	"kioctx_table"
 .LASF853:
 	.string	"rb_right"
-.LASF3107:
+.LASF3111:
 	.string	"buffer_new_tmp"
 .LASF979:
 	.string	"vm_file"
@@ -55790,11 +56025,11 @@ __exitcall_ebc_exit:
 	.string	"__initdata_end"
 .LASF2502:
 	.string	"bus_lock"
-.LASF3184:
+.LASF3188:
 	.string	"kmalloc_type"
 .LASF388:
 	.string	"qstr"
-.LASF3106:
+.LASF3110:
 	.string	"gray_new"
 .LASF1093:
 	.string	"futex_state"
@@ -55802,7 +56037,7 @@ __exitcall_ebc_exit:
 	.string	"WORKINGSET_RESTORE"
 .LASF629:
 	.string	"sched_psi_wake_requeue"
-.LASF3206:
+.LASF3210:
 	.string	"check_copy_size"
 .LASF738:
 	.string	"memcg_oom_order"
@@ -55858,17 +56093,17 @@ __exitcall_ebc_exit:
 	.string	"core_state"
 .LASF869:
 	.string	"timerqueue_head"
-.LASF3246:
+.LASF3250:
 	.string	"sched_setscheduler_nocheck"
 .LASF1292:
 	.string	"f_wb_err"
-.LASF3200:
+.LASF3204:
 	.string	"schedule_work"
 .LASF2431:
 	.string	"rt_mutex"
 .LASF991:
 	.string	"rchar"
-.LASF3157:
+.LASF3161:
 	.string	"valid_dma_direction"
 .LASF1819:
 	.string	"bd_contains"
@@ -55890,7 +56125,7 @@ __exitcall_ebc_exit:
 	.string	"_pt_pad_1"
 .LASF1260:
 	.string	"_pt_pad_2"
-.LASF2973:
+.LASF2975:
 	.string	"buf_align16"
 .LASF2813:
 	.string	"cpuhp_tasks_frozen"
@@ -55904,13 +56139,13 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_FLAG_BITS"
 .LASF2449:
 	.string	"fwnode_endpoint"
-.LASF3069:
+.LASF3074:
 	.string	"__int"
 .LASF953:
 	.string	"epoll_watches"
 .LASF2678:
 	.string	"KCOMPACTD_WAKE"
-.LASF3124:
+.LASF3128:
 	.string	"refresh_new_image"
 .LASF2075:
 	.string	"non_rcu"
@@ -55944,7 +56179,7 @@ __exitcall_ebc_exit:
 	.string	"_uid"
 .LASF340:
 	.string	"hbp_break"
-.LASF3032:
+.LASF3036:
 	.string	"pmic_node"
 .LASF139:
 	.string	"panic_blink"
@@ -55984,13 +56219,13 @@ __exitcall_ebc_exit:
 	.string	"need"
 .LASF505:
 	.string	"s_encoding"
-.LASF3201:
+.LASF3205:
 	.string	"queue_work"
 .LASF1735:
 	.string	"gpl_crcs"
 .LASF1721:
 	.string	"get_state"
-.LASF3160:
+.LASF3164:
 	.string	"dma_handle"
 .LASF1360:
 	.string	"orig_pte"
@@ -56008,7 +56243,7 @@ __exitcall_ebc_exit:
 	.string	"__s8"
 .LASF353:
 	.string	"fault_code"
-.LASF3010:
+.LASF3014:
 	.string	"dev_attr_waveform_version"
 .LASF2212:
 	.string	"dma_mask"
@@ -56058,13 +56293,13 @@ __exitcall_ebc_exit:
 	.string	"NR_WRITEBACK_TEMP"
 .LASF2514:
 	.string	"functionality"
-.LASF3111:
+.LASF3115:
 	.string	"clac_part_data_align8"
 .LASF306:
 	.string	"__ctors_end"
 .LASF2267:
 	.string	"wakeup_path"
-.LASF3266:
+.LASF3270:
 	.string	"ebc_buf_state_show"
 .LASF969:
 	.string	"vm_prev"
@@ -56080,7 +56315,7 @@ __exitcall_ebc_exit:
 	.string	"__u8"
 .LASF116:
 	.string	"lock"
-.LASF3164:
+.LASF3168:
 	.string	"ebc_pmic_resume"
 .LASF1563:
 	.string	"compact_cached_migrate_pfn"
@@ -56088,7 +56323,7 @@ __exitcall_ebc_exit:
 	.string	"PGALLOC_DMA32"
 .LASF2756:
 	.string	"param_ops_long"
-.LASF2999:
+.LASF3001:
 	.string	"overlay_start"
 .LASF2954:
 	.string	"frame_addr_set"
@@ -56122,7 +56357,7 @@ __exitcall_ebc_exit:
 	.string	"compact_order_failed"
 .LASF1106:
 	.string	"fsuid"
-.LASF3214:
+.LASF3218:
 	.string	"flag"
 .LASF1476:
 	.string	"NR_ISOLATED_FILE"
@@ -56134,9 +56369,9 @@ __exitcall_ebc_exit:
 	.string	"managed_pages"
 .LASF2590:
 	.string	"__tracepoint_page_ref_set"
-.LASF3153:
+.LASF3157:
 	.string	"ebc_tcon_enable"
-.LASF3293:
+.LASF3297:
 	.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"
@@ -56184,13 +56419,13 @@ __exitcall_ebc_exit:
 	.string	"s_vop"
 .LASF1651:
 	.string	"qf_owner"
-.LASF3229:
+.LASF3233:
 	.string	"__write_once_size"
 .LASF2832:
 	.string	"kmalloc_cache_type"
 .LASF575:
 	.string	"mutex"
-.LASF3192:
+.LASF3196:
 	.string	"out_values"
 .LASF840:
 	.string	"pgd_t"
@@ -56204,7 +56439,7 @@ __exitcall_ebc_exit:
 	.string	"raw_spinlock_t"
 .LASF2937:
 	.string	"vir_width"
-.LASF3217:
+.LASF3221:
 	.string	"INIT_LIST_HEAD"
 .LASF1939:
 	.string	"fs_flags"
@@ -56220,11 +56455,11 @@ __exitcall_ebc_exit:
 	.string	"dma_pfn_offset"
 .LASF1190:
 	.string	"radix_tree_node"
-.LASF3219:
+.LASF3223:
 	.string	"sign_extend64"
 .LASF2314:
 	.string	"wake_irq"
-.LASF3034:
+.LASF3038:
 	.string	"ulogo_addr"
 .LASF860:
 	.string	"pcpu_fc"
@@ -56242,7 +56477,7 @@ __exitcall_ebc_exit:
 	.string	"ptraced"
 .LASF2752:
 	.string	"param_ops_short"
-.LASF3261:
+.LASF3265:
 	.string	"of_find_device_by_node"
 .LASF2554:
 	.string	"HRTIMER_SOFTIRQ"
@@ -56262,13 +56497,13 @@ __exitcall_ebc_exit:
 	.string	"d_lockref"
 .LASF2243:
 	.string	"rpm_request"
-.LASF3062:
+.LASF3067:
 	.string	"ebc_io_ctl"
 .LASF1150:
 	.string	"addr"
 .LASF2386:
 	.string	"device_private"
-.LASF3155:
+.LASF3159:
 	.string	"get_dma_ops"
 .LASF2698:
 	.string	"watermark_scale_factor"
@@ -56284,7 +56519,7 @@ __exitcall_ebc_exit:
 	.string	"mkobj"
 .LASF2964:
 	.string	"direct_buf_real_size"
-.LASF3283:
+.LASF3287:
 	.string	"__pm_relax"
 .LASF473:
 	.string	"d_delete"
@@ -56294,7 +56529,7 @@ __exitcall_ebc_exit:
 	.string	"begin"
 .LASF2737:
 	.string	"sh_link"
-.LASF3025:
+.LASF3029:
 	.string	"ebc_suspend"
 .LASF2358:
 	.string	"cls_msk"
@@ -56316,19 +56551,19 @@ __exitcall_ebc_exit:
 	.string	"num_resources"
 .LASF1576:
 	.string	"notifier_fn_t"
-.LASF3033:
+.LASF3037:
 	.string	"pmic_client"
 .LASF2572:
 	.string	"miscdevice"
 .LASF656:
 	.string	"time_in_state"
-.LASF3042:
+.LASF3046:
 	.string	"ebc_logo_init"
 .LASF1269:
 	.string	"kill"
 .LASF1030:
 	.string	"iowait_sum"
-.LASF3125:
+.LASF3129:
 	.string	"image_new"
 .LASF15:
 	.string	"__u64"
@@ -56354,13 +56589,13 @@ __exitcall_ebc_exit:
 	.string	"i_blkbits"
 .LASF2456:
 	.string	"value"
-.LASF2993:
+.LASF2995:
 	.string	"frame_timer"
 .LASF1033:
 	.string	"sum_sleep_runtime"
-.LASF3038:
+.LASF3042:
 	.string	"ulogo_addr_str"
-.LASF3099:
+.LASF3103:
 	.string	"flip"
 .LASF1079:
 	.string	"deadline"
@@ -56402,11 +56637,11 @@ __exitcall_ebc_exit:
 	.string	"read_dqblk"
 .LASF1616:
 	.string	"dq_flags"
-.LASF3102:
+.LASF3106:
 	.string	"buffer_new"
 .LASF213:
 	.string	"user_fpsimd_state"
-.LASF3260:
+.LASF3264:
 	.string	"device_create_file"
 .LASF521:
 	.string	"s_time_gran"
@@ -56430,15 +56665,15 @@ __exitcall_ebc_exit:
 	.string	"s_bdi"
 .LASF2857:
 	.string	"wf_table"
-.LASF3131:
+.LASF3135:
 	.string	"image_new_tmp"
 .LASF1732:
 	.string	"num_kp"
-.LASF3292:
+.LASF3296:
 	.string	"__pm_stay_awake"
 .LASF2565:
 	.string	"vmap_area_list"
-.LASF3007:
+.LASF3009:
 	.string	"ebc_auto_thread_sem"
 .LASF630:
 	.string	"in_execve"
@@ -56488,7 +56723,7 @@ __exitcall_ebc_exit:
 	.string	"names_cachep"
 .LASF785:
 	.string	"preset_lpj"
-.LASF2992:
+.LASF2994:
 	.string	"vdd_timer"
 .LASF2221:
 	.string	"archdata"
@@ -56578,7 +56813,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_RESUMING"
 .LASF471:
 	.string	"d_weak_revalidate"
-.LASF2987:
+.LASF2989:
 	.string	"prev_dsp_buf"
 .LASF1493:
 	.string	"NR_VMSCAN_IMMEDIATE"
@@ -56602,11 +56837,11 @@ __exitcall_ebc_exit:
 	.string	"groups"
 .LASF694:
 	.string	"pi_blocked_on"
-.LASF3029:
+.LASF3033:
 	.string	"ebc_probe"
 .LASF501:
 	.string	"s_xattr"
-.LASF3039:
+.LASF3043:
 	.string	"klogo_addr_str"
 .LASF993:
 	.string	"syscr"
@@ -56640,7 +56875,7 @@ __exitcall_ebc_exit:
 	.string	"s_inode_list_lock"
 .LASF2600:
 	.string	"align"
-.LASF3110:
+.LASF3114:
 	.string	"frame_idx"
 .LASF204:
 	.string	"mm_segment_t"
@@ -56662,7 +56897,7 @@ __exitcall_ebc_exit:
 	.string	"maj_flt"
 .LASF229:
 	.string	"arch_rwlock_t"
-.LASF3281:
+.LASF3285:
 	.string	"ebc_osd_buf_clone"
 .LASF162:
 	.string	"c_false"
@@ -56688,7 +56923,7 @@ __exitcall_ebc_exit:
 	.string	"minor"
 .LASF1699:
 	.string	"nextents"
-.LASF3158:
+.LASF3162:
 	.string	"dma_direction"
 .LASF1:
 	.string	"sizetype"
@@ -56698,13 +56933,13 @@ __exitcall_ebc_exit:
 	.string	"arg_lock"
 .LASF1741:
 	.string	"num_exentries"
-.LASF3090:
+.LASF3095:
 	.string	"check_out"
 .LASF2609:
 	.string	"high_memory"
 .LASF49:
 	.string	"int32_t"
-.LASF3021:
+.LASF3025:
 	.string	"__exitcall_ebc_exit"
 .LASF1040:
 	.string	"nr_failed_migrations_running"
@@ -56712,7 +56947,7 @@ __exitcall_ebc_exit:
 	.string	"next_timer"
 .LASF741:
 	.string	"throttle_queue"
-.LASF3276:
+.LASF3280:
 	.string	"finish_wait"
 .LASF1480:
 	.string	"WORKINGSET_NODERECLAIM"
@@ -56722,7 +56957,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_REQ_RESUME"
 .LASF2045:
 	.string	"keyring_index_key"
-.LASF3152:
+.LASF3156:
 	.string	"ebc_tcon_disable"
 .LASF1421:
 	.string	"leases_enable"
@@ -56746,7 +56981,7 @@ __exitcall_ebc_exit:
 	.string	"lock_key"
 .LASF2563:
 	.string	"tramp_pg_dir"
-.LASF3014:
+.LASF3018:
 	.string	"dev_attr_ebc_version"
 .LASF864:
 	.string	"PCPU_FC_NR"
@@ -56764,7 +56999,7 @@ __exitcall_ebc_exit:
 	.string	"num_vf"
 .LASF1535:
 	.string	"isolate_mode_t"
-.LASF3159:
+.LASF3163:
 	.string	"debug_dma_sync_single_for_device"
 .LASF99:
 	.string	"llseek"
@@ -56798,7 +57033,7 @@ __exitcall_ebc_exit:
 	.string	"file_lock"
 .LASF325:
 	.string	"__idmap_text_end"
-.LASF2966:
+.LASF2968:
 	.string	"frame_total"
 .LASF776:
 	.string	"read_cntvct_el0"
@@ -56806,9 +57041,9 @@ __exitcall_ebc_exit:
 	.string	"target"
 .LASF2546:
 	.string	"HI_SOFTIRQ"
-.LASF3161:
+.LASF3165:
 	.string	"direction"
-.LASF3130:
+.LASF3134:
 	.string	"image_bg_data"
 .LASF958:
 	.string	"session_keyring"
@@ -56818,7 +57053,7 @@ __exitcall_ebc_exit:
 	.string	"key_restrict_link_func_t"
 .LASF1485:
 	.string	"NR_WRITEBACK"
-.LASF3116:
+.LASF3120:
 	.string	"frame_count"
 .LASF487:
 	.string	"s_maxbytes"
@@ -56832,7 +57067,7 @@ __exitcall_ebc_exit:
 	.string	"i2c_bus_type"
 .LASF885:
 	.string	"hrtimer_cpu_base"
-.LASF3288:
+.LASF3292:
 	.string	"ebc_notify"
 .LASF1391:
 	.string	"cb_head"
@@ -56860,7 +57095,7 @@ __exitcall_ebc_exit:
 	.string	"cpus_requested"
 .LASF2594:
 	.string	"__tracepoint_page_ref_mod_unless"
-.LASF3169:
+.LASF3173:
 	.string	"wake_lock_init"
 .LASF1186:
 	.string	"list_lru"
@@ -56876,6 +57111,8 @@ __exitcall_ebc_exit:
 	.string	"robust_list"
 .LASF1715:
 	.string	"quota_disable"
+.LASF3062:
+	.string	"waveform_open"
 .LASF2056:
 	.string	"serial_node"
 .LASF1701:
@@ -56884,7 +57121,7 @@ __exitcall_ebc_exit:
 	.string	"d_iput"
 .LASF108:
 	.string	"compat_ioctl"
-.LASF3177:
+.LASF3181:
 	.string	"__range_ok"
 .LASF287:
 	.string	"__start_ro_after_init"
@@ -56892,7 +57129,7 @@ __exitcall_ebc_exit:
 	.string	"num_poisoned_pages"
 .LASF905:
 	.string	"filter"
-.LASF3162:
+.LASF3166:
 	.string	"ebc_pmic_get_vcom"
 .LASF2945:
 	.string	"ebc_tcon"
@@ -56992,6 +57229,8 @@ __exitcall_ebc_exit:
 	.string	"__MAX_NR_ZONES"
 .LASF2464:
 	.string	"irq_fwspec"
+.LASF3012:
+	.string	"waveform_ops"
 .LASF1805:
 	.string	"iov_iter"
 .LASF511:
@@ -57002,11 +57241,11 @@ __exitcall_ebc_exit:
 	.string	"power"
 .LASF266:
 	.string	"strict_mask"
-.LASF3275:
+.LASF3279:
 	.string	"init_wait_entry"
 .LASF2787:
 	.string	"module_state"
-.LASF3232:
+.LASF3236:
 	.string	"_dev_info"
 .LASF417:
 	.string	"d_subdirs"
@@ -57052,15 +57291,15 @@ __exitcall_ebc_exit:
 	.string	"removed_mem"
 .LASF248:
 	.string	"jump_label_t"
-.LASF3262:
+.LASF3266:
 	.string	"of_get_property"
-.LASF3143:
+.LASF3147:
 	.string	"ebc_tcon_frame_start"
 .LASF2712:
 	.string	"Elf64_Half"
 .LASF2287:
 	.string	"use_autosuspend"
-.LASF3022:
+.LASF3026:
 	.string	"ebc_init"
 .LASF675:
 	.string	"nsproxy"
@@ -57068,7 +57307,7 @@ __exitcall_ebc_exit:
 	.string	"can_wakeup"
 .LASF2547:
 	.string	"TIMER_SOFTIRQ"
-.LASF3121:
+.LASF3125:
 	.string	"temp_data"
 .LASF1215:
 	.string	"xol_area"
@@ -57094,15 +57333,15 @@ __exitcall_ebc_exit:
 	.string	"init_on_free"
 .LASF1152:
 	.string	"nr_pages"
-.LASF3138:
+.LASF3142:
 	.string	"ebc_power_set"
 .LASF1762:
 	.string	"num_trace_bprintk_fmt"
-.LASF3226:
+.LASF3230:
 	.string	"__fls"
 .LASF1130:
 	.string	"ioprio"
-.LASF2995:
+.LASF2997:
 	.string	"is_early_suspend"
 .LASF1164:
 	.string	"rdev"
@@ -57124,9 +57363,9 @@ __exitcall_ebc_exit:
 	.string	"persistent_clock_is_local"
 .LASF2414:
 	.string	"dma_supported"
-.LASF3194:
+.LASF3198:
 	.string	"dev_set_drvdata"
-.LASF3289:
+.LASF3293:
 	.string	"epd_lut_get"
 .LASF1536:
 	.string	"per_cpu_pages"
@@ -57162,7 +57401,7 @@ __exitcall_ebc_exit:
 	.string	"BLOCK_SOFTIRQ"
 .LASF1412:
 	.string	"files_stat_struct"
-.LASF3238:
+.LASF3242:
 	.string	"devm_memremap"
 .LASF844:
 	.string	"pgtable_t"
@@ -57174,7 +57413,7 @@ __exitcall_ebc_exit:
 	.string	"symlink"
 .LASF1575:
 	.string	"mem_map"
-.LASF3083:
+.LASF3088:
 	.string	"old_buffer"
 .LASF2955:
 	.string	"lut_data_set"
@@ -57190,7 +57429,7 @@ __exitcall_ebc_exit:
 	.string	"WAKE_LOCK_SUSPEND"
 .LASF1778:
 	.string	"WRITE_LIFE_SHORT"
-.LASF3221:
+.LASF3225:
 	.string	"__swab32p"
 .LASF286:
 	.string	"_einittext"
@@ -57232,7 +57471,7 @@ __exitcall_ebc_exit:
 	.string	"rm_xquota"
 .LASF1085:
 	.string	"dl_timer"
-.LASF3272:
+.LASF3275:
 	.string	"remap_pfn_range"
 .LASF2376:
 	.string	"DL_DEV_NO_DRIVER"
@@ -57246,7 +57485,7 @@ __exitcall_ebc_exit:
 	.string	"watermark"
 .LASF2424:
 	.string	"deadprops"
-.LASF3234:
+.LASF3238:
 	.string	"devm_kmalloc"
 .LASF16:
 	.string	"long long unsigned int"
@@ -57276,7 +57515,7 @@ __exitcall_ebc_exit:
 	.string	"flc_lease"
 .LASF2407:
 	.string	"unmap_resource"
-.LASF2990:
+.LASF2992:
 	.string	"wake_lock_is_set"
 .LASF2359:
 	.string	"driver_private"
@@ -57322,7 +57561,7 @@ __exitcall_ebc_exit:
 	.string	"pstate_check_t"
 .LASF831:
 	.string	"system_freezable_power_efficient_wq"
-.LASF3026:
+.LASF3030:
 	.string	"__func__"
 .LASF57:
 	.string	"resource_size_t"
@@ -57372,15 +57611,15 @@ __exitcall_ebc_exit:
 	.string	"vregs"
 .LASF2625:
 	.string	"page_entry_size"
-.LASF2976:
+.LASF2978:
 	.string	"lut_data"
-.LASF3097:
+.LASF3064:
 	.string	"ebc_other_init"
 .LASF1447:
 	.string	"free_list"
 .LASF590:
 	.string	"prio"
-.LASF3186:
+.LASF3190:
 	.string	"platform_get_drvdata"
 .LASF2556:
 	.string	"NR_SOFTIRQS"
@@ -57402,7 +57641,7 @@ __exitcall_ebc_exit:
 	.string	"atomic_t"
 .LASF813:
 	.string	"WORK_OFFQ_FLAG_BITS"
-.LASF3144:
+.LASF3148:
 	.string	"ebc_tcon_image_addr_set"
 .LASF2532:
 	.string	"max_num_msgs"
@@ -57422,7 +57661,7 @@ __exitcall_ebc_exit:
 	.string	"scatterlist"
 .LASF1268:
 	.string	"altmap_valid"
-.LASF3291:
+.LASF3295:
 	.string	"down"
 .LASF102:
 	.string	"read_iter"
@@ -57460,7 +57699,7 @@ __exitcall_ebc_exit:
 	.string	"pm_domain_data"
 .LASF2488:
 	.string	"byte"
-.LASF3257:
+.LASF3261:
 	.string	"__wake_up_sync"
 .LASF2003:
 	.string	"poll_table_struct"
@@ -57486,7 +57725,7 @@ __exitcall_ebc_exit:
 	.string	"page_fault"
 .LASF1470:
 	.string	"NR_INACTIVE_FILE"
-.LASF3210:
+.LASF3214:
 	.string	"__ret_warn_on"
 .LASF1626:
 	.string	"kqid"
@@ -57566,7 +57805,7 @@ __exitcall_ebc_exit:
 	.string	"__irqentry_text_end"
 .LASF1347:
 	.string	"context"
-.LASF3115:
+.LASF3119:
 	.string	"get_overlay_image"
 .LASF1541:
 	.string	"per_cpu_nodestat"
@@ -57578,7 +57817,7 @@ __exitcall_ebc_exit:
 	.string	"thread_id"
 .LASF733:
 	.string	"default_timer_slack_ns"
-.LASF3058:
+.LASF3060:
 	.string	"waveform_version_read"
 .LASF1768:
 	.string	"source_list"
@@ -57608,7 +57847,7 @@ __exitcall_ebc_exit:
 	.string	"of_match_table"
 .LASF2579:
 	.string	"percpu_count_ptr"
-.LASF3271:
+.LASF3276:
 	.string	"ebc_phy_buf_base_get"
 .LASF2080:
 	.string	"loops_per_jiffy"
@@ -57620,7 +57859,7 @@ __exitcall_ebc_exit:
 	.string	"uuid_t"
 .LASF2438:
 	.string	"property_read_int_array"
-.LASF2979:
+.LASF2981:
 	.string	"auto_image_old"
 .LASF1861:
 	.string	"setattr2"
@@ -57630,7 +57869,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_INODESTEAL"
 .LASF1176:
 	.string	"count_objects"
-.LASF3225:
+.LASF3229:
 	.string	"fls64"
 .LASF922:
 	.string	"_stime"
@@ -57650,7 +57889,7 @@ __exitcall_ebc_exit:
 	.string	"statistics"
 .LASF2936:
 	.string	"current_buffer"
-.LASF3112:
+.LASF3116:
 	.string	"direct_mode_data_change"
 .LASF1619:
 	.string	"kprojid_t"
@@ -57666,15 +57905,15 @@ __exitcall_ebc_exit:
 	.string	"sync_sg_for_device"
 .LASF1965:
 	.string	"statfs"
-.LASF3252:
+.LASF3256:
 	.string	"__kmalloc"
-.LASF3241:
+.LASF3245:
 	.string	"_dev_err"
-.LASF3231:
+.LASF3235:
 	.string	"__platform_driver_register"
 .LASF2963:
 	.string	"ebc_buf_real_size"
-.LASF3005:
+.LASF3007:
 	.string	"ebc_thread_wq"
 .LASF1795:
 	.string	"migratepage"
@@ -57724,7 +57963,7 @@ __exitcall_ebc_exit:
 	.string	"max_comb_1st_msg_len"
 .LASF1546:
 	.string	"ZONE_MOVABLE"
-.LASF3009:
+.LASF3011:
 	.string	"ebc_misc"
 .LASF2393:
 	.string	"revmap_size"
@@ -57742,8 +57981,6 @@ __exitcall_ebc_exit:
 	.string	"phy_addr"
 .LASF2166:
 	.string	"firmware_kobj"
-.LASF3020:
-	.string	"__addressable_ebc_init2529"
 .LASF292:
 	.string	"__per_cpu_end"
 .LASF2641:
@@ -57758,7 +57995,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_PENDING_BIT"
 .LASF721:
 	.string	"rseq"
-.LASF3123:
+.LASF3127:
 	.string	"get_auto_image"
 .LASF196:
 	.string	"nfds"
@@ -57772,17 +58009,17 @@ __exitcall_ebc_exit:
 	.string	"i_acl"
 .LASF1790:
 	.string	"bmap"
-.LASF3239:
+.LASF3243:
 	.string	"ebc_buf_init"
 .LASF2049:
 	.string	"key_payload"
-.LASF2982:
+.LASF2984:
 	.string	"auto_image_osd"
 .LASF481:
 	.string	"d_real"
 .LASF2561:
 	.string	"swapper_pg_end"
-.LASF3011:
+.LASF3015:
 	.string	"dev_attr_pmic_name"
 .LASF632:
 	.string	"in_user_fault"
@@ -57812,7 +58049,7 @@ __exitcall_ebc_exit:
 	.string	"fallocate"
 .LASF1708:
 	.string	"i_spc_warnlimit"
-.LASF3211:
+.LASF3215:
 	.string	"check_object_size"
 .LASF1516:
 	.string	"node_present_pages"
@@ -57862,21 +58099,23 @@ __exitcall_ebc_exit:
 	.string	"__idmap_text_start"
 .LASF1717:
 	.string	"set_info"
-.LASF3061:
+.LASF3066:
 	.string	"ebc_mmap"
 .LASF2620:
 	.string	"sysctl_admin_reserve_kbytes"
 .LASF789:
 	.string	"timer_list"
+.LASF3024:
+	.string	"__addressable_ebc_init2570"
 .LASF1685:
 	.string	"d_ino_warns"
 .LASF2501:
 	.string	"lock_ops"
 .LASF1327:
 	.string	"hiwater_vm"
-.LASF3055:
+.LASF3057:
 	.string	"pmic_vcom_read"
-.LASF3233:
+.LASF3237:
 	.string	"misc_deregister"
 .LASF1249:
 	.string	"compound_head"
@@ -57896,7 +58135,7 @@ __exitcall_ebc_exit:
 	.string	"bd_write_holder"
 .LASF2195:
 	.string	"poweroff_noirq"
-.LASF3236:
+.LASF3240:
 	.string	"of_parse_phandle"
 .LASF1859:
 	.string	"rename"
@@ -57916,9 +58155,9 @@ __exitcall_ebc_exit:
 	.string	"i_rt_spc_timelimit"
 .LASF140:
 	.string	"oops_in_progress"
-.LASF3008:
+.LASF3010:
 	.string	"ebc_ops"
-.LASF3035:
+.LASF3039:
 	.string	"klogo_addr"
 .LASF1652:
 	.string	"qf_next"
@@ -57926,9 +58165,9 @@ __exitcall_ebc_exit:
 	.string	"sync_single_for_cpu"
 .LASF794:
 	.string	"data"
-.LASF3179:
+.LASF3183:
 	.string	"kzalloc"
-.LASF3204:
+.LASF3208:
 	.string	"msecs_to_jiffies"
 .LASF1920:
 	.string	"lm_break"
@@ -57942,7 +58181,7 @@ __exitcall_ebc_exit:
 	.string	"personality"
 .LASF1826:
 	.string	"bd_queue"
-.LASF3023:
+.LASF3027:
 	.string	"ebc_resume"
 .LASF2830:
 	.string	"init_task"
@@ -57964,7 +58203,7 @@ __exitcall_ebc_exit:
 	.string	"signed char"
 .LASF376:
 	.string	"rcu_scheduler_active"
-.LASF3189:
+.LASF3193:
 	.string	"propname"
 .LASF2102:
 	.string	"priv"
@@ -58044,7 +58283,7 @@ __exitcall_ebc_exit:
 	.string	"sve_vl"
 .LASF2655:
 	.string	"PGSTEAL_KSWAPD"
-.LASF3037:
+.LASF3041:
 	.string	"klogo_addr_valid"
 .LASF2603:
 	.string	"MEMORY_DEVICE_PUBLIC"
@@ -58090,7 +58329,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_GCC16"
 .LASF2515:
 	.string	"i2c_lock_operations"
-.LASF3140:
+.LASF3144:
 	.string	"ebc_get_4pix_wf_part"
 .LASF1621:
 	.string	"USRQUOTA"
@@ -58136,9 +58375,9 @@ __exitcall_ebc_exit:
 	.string	"f_inode"
 .LASF2032:
 	.string	"procname"
-.LASF3120:
+.LASF3124:
 	.string	"point_data"
-.LASF3243:
+.LASF3247:
 	.string	"epd_lut_from_file_init"
 .LASF1670:
 	.string	"mark_dirty"
@@ -58162,15 +58401,15 @@ __exitcall_ebc_exit:
 	.string	"__kernel_clockid_t"
 .LASF686:
 	.string	"seccomp"
-.LASF3074:
+.LASF3079:
 	.string	"ebc_rst_panel"
 .LASF1792:
 	.string	"releasepage"
 .LASF1703:
 	.string	"qc_info"
-.LASF3075:
+.LASF3080:
 	.string	"ebc_thread"
-.LASF3089:
+.LASF3094:
 	.string	"pbuf_old"
 .LASF2890:
 	.string	"EPD_A2_ENTER"
@@ -58188,7 +58427,7 @@ __exitcall_ebc_exit:
 	.string	"win_y1"
 .LASF2872:
 	.string	"win_y2"
-.LASF3084:
+.LASF3089:
 	.string	"buf_size"
 .LASF2089:
 	.string	"bitmap"
@@ -58228,7 +58467,7 @@ __exitcall_ebc_exit:
 	.string	"MIGRATE_SYNC_LIGHT"
 .LASF1038:
 	.string	"nr_migrations_cold"
-.LASF3053:
+.LASF3055:
 	.string	"ebc_version_read"
 .LASF304:
 	.string	"__end_once"
@@ -58248,7 +58487,7 @@ __exitcall_ebc_exit:
 	.string	"inactive_age"
 .LASF2604:
 	.string	"MEMORY_DEVICE_FS_DAX"
-.LASF2967:
+.LASF2969:
 	.string	"frame_bw_total"
 .LASF2796:
 	.string	"ro_after_init_size"
@@ -58292,7 +58531,7 @@ __exitcall_ebc_exit:
 	.string	"percpu_size"
 .LASF1324:
 	.string	"mmap_sem"
-.LASF3273:
+.LASF3277:
 	.string	"schedule"
 .LASF2443:
 	.string	"get_reference_args"
@@ -58352,7 +58591,7 @@ __exitcall_ebc_exit:
 	.string	"ki_flags"
 .LASF1392:
 	.string	"gp_type"
-.LASF2970:
+.LASF2972:
 	.string	"part_mode_count"
 .LASF401:
 	.string	"d_in_lookup_hash"
@@ -58378,7 +58617,7 @@ __exitcall_ebc_exit:
 	.string	"lock_stat"
 .LASF2395:
 	.string	"revmap_tree_mutex"
-.LASF3057:
+.LASF3059:
 	.string	"pmic_name_read"
 .LASF1080:
 	.string	"dl_throttled"
@@ -58398,7 +58637,7 @@ __exitcall_ebc_exit:
 	.string	"restore_noirq"
 .LASF1428:
 	.string	"ki_filp"
-.LASF3114:
+.LASF3118:
 	.string	"clac_full_data_align16"
 .LASF1113:
 	.string	"cap_ambient"
@@ -58406,7 +58645,7 @@ __exitcall_ebc_exit:
 	.string	"dma_configure"
 .LASF2293:
 	.string	"runtime_error"
-.LASF3065:
+.LASF3070:
 	.string	"temp_offset"
 .LASF950:
 	.string	"__count"
@@ -58420,7 +58659,7 @@ __exitcall_ebc_exit:
 	.string	"PROBE_DEFAULT_STRATEGY"
 .LASF2747:
 	.string	"elemsize"
-.LASF3104:
+.LASF3108:
 	.string	"clac_part_data_align16"
 .LASF892:
 	.string	"nr_events"
@@ -58434,7 +58673,7 @@ __exitcall_ebc_exit:
 	.string	"text_size"
 .LASF1654:
 	.string	"stat"
-.LASF2986:
+.LASF2988:
 	.string	"lut_ddr_vir"
 .LASF1322:
 	.string	"map_count"
@@ -58448,7 +58687,7 @@ __exitcall_ebc_exit:
 	.string	"uid_keyring"
 .LASF726:
 	.string	"splice_pipe"
-.LASF3093:
+.LASF3098:
 	.string	"frame_done_callback"
 .LASF1801:
 	.string	"error_remove_page"
@@ -58494,7 +58733,7 @@ __exitcall_ebc_exit:
 	.string	"compound_mapcount"
 .LASF1450:
 	.string	"zone_stat_item"
-.LASF3181:
+.LASF3185:
 	.string	"kmalloc_large"
 .LASF2627:
 	.string	"PE_SIZE_PMD"
@@ -58532,7 +58771,7 @@ __exitcall_ebc_exit:
 	.string	"gp_count"
 .LASF2052:
 	.string	"key_restriction"
-.LASF3081:
+.LASF3086:
 	.string	"check_part_mode"
 .LASF619:
 	.string	"exit_state"
@@ -58564,9 +58803,9 @@ __exitcall_ebc_exit:
 	.string	"fs_supers"
 .LASF1132:
 	.string	"last_waited"
-.LASF3060:
+.LASF3065:
 	.string	"ebc_open"
-.LASF3150:
+.LASF3154:
 	.string	"three_win_mode"
 .LASF2875:
 	.string	"EPD_OVERLAY"
@@ -58574,7 +58813,7 @@ __exitcall_ebc_exit:
 	.string	"dqb_bsoftlimit"
 .LASF219:
 	.string	"pending"
-.LASF2983:
+.LASF2985:
 	.string	"direct_buffer"
 .LASF2493:
 	.string	"i2c_client_type"
@@ -58618,7 +58857,7 @@ __exitcall_ebc_exit:
 	.string	"timer_expires"
 .LASF2828:
 	.string	"mmlist_lock"
-.LASF3167:
+.LASF3171:
 	.string	"ebc_pmic_power_on"
 .LASF1766:
 	.string	"trace_evals"
@@ -58660,7 +58899,7 @@ __exitcall_ebc_exit:
 	.string	"relax_count"
 .LASF1414:
 	.string	"nr_free_files"
-.LASF3180:
+.LASF3184:
 	.string	"kmalloc"
 	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
 	.section	.note.GNU-stack,"",@progbits

commit 74414eb68e5230dc46f0f6240f2c86f0a8c35afa
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Tue Aug 31 15:06:39 2021 +0800

    drm/rockchip: ebc_dev: release version v2.10
    
    protect auto buf by rw lock
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: I27b09e1c2e72f6d86e17b2b42365b37fccc4be56

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index 66959f00f029..b539d76951f9 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -8789,6 +8789,7 @@ ebc_thread:
 	str	wzr, [x24, 608]
 	b	.L771
 .LVL788:
+	.p2align 3
 .L792:
 	.loc 1 1401 0
 	cmp	w2, 21
@@ -9159,19 +9160,40 @@ ebc_thread:
 	.loc 1 1403 0
 	ldr	w0, [x24, 604]
 	cbz	w0, .L793
-	.loc 1 1416 0
-	ldr	x0, [x24, 200]
-	.loc 1 1414 0
-	str	x28, [x24, 208]
 	.loc 1 1404 0
 	str	w2, [x24, 608]
+	.loc 1 1413 0
+	add	x0, x21, 624
+	bl	down_write
+.LVL826:
+	.loc 1 1414 0
+	str	x28, [x24, 208]
 	.loc 1 1416 0
+	ldr	x0, [x24, 200]
 	ldr	w1, [x0, 40]
 	cmp	w1, 1
-	bhi	.L794
-	mov	x0, x28
-	.loc 1 1421 0
-	cbz	w1, .L914
+	bls	.L914
+	.loc 1 1418 0
+	ldr	x1, [x0, 16]
+	ldrsw	x2, [x24, 20]
+	ldr	x0, [x24, 128]
+	bl	memcpy
+.LVL827:
+	.loc 1 1419 0
+	ldr	x0, [x24, 200]
+	ldrsw	x2, [x24, 20]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x24, 136]
+	bl	memcpy
+.LVL828:
+	.loc 1 1420 0
+	ldr	x0, [x24, 200]
+	ldrsw	x2, [x24, 20]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x24, 144]
+	bl	memcpy
+.LVL829:
+	ldr	x0, [x24, 208]
 .L796:
 .LBB1811:
 .LBB1812:
@@ -9202,10 +9224,10 @@ ebc_thread:
 	asr	w8, w8, 3
 	.loc 1 377 0
 	asr	w16, w16, 3
-.LVL826:
+.LVL830:
 	.loc 1 373 0
 	add	w8, w8, 1
-.LVL827:
+.LVL831:
 	ldr	w1, [x20, 236]
 	.loc 1 380 0
 	cmp	w8, w16
@@ -9218,7 +9240,7 @@ ebc_thread:
 	.loc 1 380 0
 	sub	w0, w16, #1
 	csel	w8, w0, w8, ge
-.LVL828:
+.LVL832:
 	.loc 1 382 0
 	cmp	w1, w17
 	sub	w1, w1, #1
@@ -9228,7 +9250,7 @@ ebc_thread:
 	csel	w17, w1, w17, le
 	.loc 1 372 0
 	asr	w15, w15, 3
-.LVL829:
+.LVL833:
 	mul	w5, w14, w16
 	.loc 1 384 0
 	cmp	w14, w17
@@ -9242,7 +9264,7 @@ ebc_thread:
 .LBB1814:
 	.loc 1 384 0
 	bgt	.L804
-.LVL830:
+.LVL834:
 	.p2align 2
 .L874:
 	.loc 1 389 0
@@ -9250,7 +9272,7 @@ ebc_thread:
 	cmp	w15, w8
 	ble	.L875
 	b	.L821
-.LVL831:
+.LVL835:
 	.p2align 3
 .L805:
 	.loc 1 402 0
@@ -9318,16 +9340,16 @@ ebc_thread:
 	bne	.L818
 	.loc 1 439 0
 	and	w2, w1, -268435456
-.LVL832:
+.LVL836:
 	cmp	w2, w12
 	beq	.L921
 	.loc 1 442 0
 	orr	w18, w18, -268435456
-.LVL833:
+.LVL837:
 .L818:
 	.loc 1 445 0
 	and	w1, w1, w25
-.LVL834:
+.LVL838:
 	.loc 1 389 0
 	add	w4, w4, 1
 	eor	w1, w1, w3
@@ -9339,18 +9361,18 @@ ebc_thread:
 	str	w1, [x7, x0]
 	.loc 1 389 0
 	bgt	.L821
-.LVL835:
+.LVL839:
 .L875:
 	.loc 1 390 0
 	sxtw	x0, w4
-.LVL836:
+.LVL840:
 	.loc 1 394 0
 	mov	w18, 0
 	.loc 1 393 0
 	lsl	x1, x0, 3
 	.loc 1 390 0
 	lsl	x0, x0, 2
-.LVL837:
+.LVL841:
 	.loc 1 393 0
 	add	x1, x1, x5, sxtw 3
 	add	x0, x0, x5, sxtw 2
@@ -9361,13 +9383,13 @@ ebc_thread:
 	ldr	w1, [x11, x0]
 	.loc 1 396 0
 	and	x26, x2, 255
-.LVL838:
+.LVL842:
 	.loc 1 392 0
 	ldr	w25, [x10, x0]
-.LVL839:
+.LVL843:
 	.loc 1 396 0
 	cbnz	x26, .L805
-.LVL840:
+.LVL844:
 	.loc 1 397 0
 	and	w26, w1, 15
 	.loc 1 400 0
@@ -9377,12 +9399,12 @@ ebc_thread:
 	bne	.L805
 	.loc 1 398 0
 	orr	w3, w3, w18
-.LVL841:
+.LVL845:
 	.loc 1 394 0
 	mov	w18, 0
-.LVL842:
+.LVL846:
 	b	.L805
-.LVL843:
+.LVL847:
 	.p2align 3
 .L835:
 .LBE1814:
@@ -9401,44 +9423,44 @@ ebc_thread:
 	ldr	w2, [x0, 40]
 	ldr	x0, [x24, 88]
 	bl	_dev_info
-.LVL844:
+.LVL848:
 	.loc 1 1558 0
 	mov	w0, 1
 	str	w0, [x24, 28]
 	.loc 1 1559 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL845:
+.LVL849:
 	.loc 1 1561 0
 	ldr	x1, [x25, #:lo12:jiffies]
 	add	x0, x20, 672
 	str	x0, [x29, 104]
 	add	x1, x1, 900
 	bl	mod_timer
-.LVL846:
+.LVL850:
 .LBB1819:
 	.loc 1 1562 0
 	ldr	w0, [x24, 76]
 	cbz	w0, .L922
 .L838:
-.LVL847:
+.LVL851:
 .L836:
 .LBE1819:
 	.loc 1 1564 0 discriminator 11
 	ldr	x2, [x25, #:lo12:jiffies]
 	mov	x1, 402653184
 	ldr	x0, [x29, 104]
-.LVL848:
+.LVL852:
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL849:
+.LVL853:
 	.loc 1 1565 0 discriminator 11
 	str	wzr, [x24, 76]
 	.loc 1 1567 0 discriminator 11
 	str	x26, [x24, 200]
 	.loc 1 1569 0 discriminator 11
 	b	.L801
-.LVL850:
+.LVL854:
 	.p2align 3
 .L863:
 	.loc 1 1542 0
@@ -9451,8 +9473,25 @@ ebc_thread:
 	.loc 1 1543 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.12
-.LVL851:
+.LVL855:
 	b	.L834
+.L793:
+	.loc 1 1407 0
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC85
+	add	x1, x1, :lo12:.LC85
+	bl	_dev_info
+.LVL856:
+	.loc 1 1408 0
+	mov	x0, x28
+	bl	ebc_remove_from_dsp_buf_list
+.LVL857:
+	.loc 1 1409 0
+	mov	x0, x28
+	bl	ebc_buf_release
+.LVL858:
+	.loc 1 1411 0
+	b	.L766
 .L899:
 	.loc 1 1464 0
 	mov	w0, 1
@@ -9466,7 +9505,7 @@ ebc_thread:
 	.loc 1 1468 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL852:
+.LVL859:
 	cmn	w0, #1
 	beq	.L924
 .L826:
@@ -9479,7 +9518,7 @@ ebc_thread:
 	add	x1, x1, :lo12:.LC88
 	.loc 1 1473 0
 	strb	w3, [x24, 32]
-.LVL853:
+.LVL860:
 .L890:
 	.loc 1 1476 0
 	and	w2, w3, 255
@@ -9488,159 +9527,43 @@ ebc_thread:
 	strb	w3, [x24, 33]
 	.loc 1 1476 0
 	bl	_dev_info
-.LVL854:
+.LVL861:
 	.loc 1 1477 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL855:
+.LVL862:
 	b	.L801
-.LVL856:
+.LVL863:
 .L898:
 	.loc 1 1395 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC83
 	add	x1, x1, :lo12:.LC83
 	bl	_dev_info
-.LVL857:
+.LVL864:
 .LBB1823:
 	.loc 1 1396 0
 	ldr	w0, [x24, 76]
 	cbz	w0, .L925
 .L784:
-.LVL858:
+.LVL865:
 .L782:
 .LBE1823:
 	.loc 1 1397 0 discriminator 11
 	ldr	x0, [x24, 88]
-.LVL859:
+.LVL866:
 	adrp	x1, .LC84
 	add	x1, x1, :lo12:.LC84
 	bl	_dev_info
-.LVL860:
-	b	.L889
-.L793:
-	.loc 1 1407 0
-	ldr	x0, [x24, 88]
-	adrp	x1, .LC85
-	add	x1, x1, :lo12:.LC85
-	bl	_dev_info
-.LVL861:
-	.loc 1 1408 0
-	mov	x0, x28
-	bl	ebc_remove_from_dsp_buf_list
-.LVL862:
-	.loc 1 1409 0
-	mov	x0, x28
-	bl	ebc_buf_release
-.LVL863:
-	.loc 1 1411 0
-	b	.L766
-.LVL864:
-	.p2align 3
-.L917:
-.LBB1827:
-.LBB1815:
-	.loc 1 416 0
-	orr	w3, w3, 61440
-	b	.L810
-	.p2align 3
-.L918:
-	.loc 1 422 0
-	orr	w3, w3, 983040
-	b	.L812
-	.p2align 3
-.L919:
-	.loc 1 428 0
-	orr	w3, w3, 15728640
-	b	.L814
-	.p2align 3
-.L920:
-	.loc 1 434 0
-	orr	w3, w3, 251658240
-	b	.L816
-.LVL865:
-	.p2align 3
-.L921:
-	.loc 1 440 0
-	orr	w3, w3, -268435456
-.LVL866:
-	.loc 1 445 0
-	and	w1, w1, w25
 .LVL867:
-	eor	w1, w1, w3
+	b	.L889
 .LVL868:
-	.loc 1 389 0
-	add	w4, w4, 1
-	and	w1, w1, w18
-	cmp	w4, w8
-	.loc 1 445 0
-	eor	w1, w3, w1
-	.loc 1 446 0
-	str	w1, [x7, x0]
-	.loc 1 389 0
-	ble	.L875
-.LVL869:
-	.p2align 2
-.L821:
-	.loc 1 384 0
-	add	w14, w14, 1
-	add	w5, w5, w16
-	cmp	w14, w17
-	ble	.L874
-.L804:
-.LBE1815:
-.LBE1827:
-	.loc 1 1429 0
-	ldr	w0, [x24, 28]
-	cbnz	w0, .L801
-	.loc 1 1430 0
-	mov	w0, 1
-	str	w0, [x24, 28]
-	.loc 1 1432 0
-	ldr	w0, [x24, 184]
-	.loc 1 1431 0
-	str	wzr, [x24, 76]
-	.loc 1 1432 0
-	cbz	w0, .L926
-.L822:
-	.loc 1 1434 0
-	mov	x0, x20
-	bl	ebc_lut_update
-.LVL870:
-	cmn	w0, #1
-	beq	.L801
-	.loc 1 1438 0
-	ldr	w3, [x24, 96]
-	.loc 1 1441 0
-	adrp	x1, .LC86
-	.loc 1 1438 0
-	strb	w3, [x24, 32]
-	.loc 1 1441 0
-	add	x1, x1, :lo12:.LC86
-	ldr	x0, [x24, 88]
-	b	.L890
-.LVL871:
-	.p2align 3
-.L915:
-.LBB1828:
-.LBB1816:
-	.loc 1 404 0
-	orr	w3, w3, 240
-	b	.L806
-	.p2align 3
-.L916:
-	.loc 1 410 0
-	orr	w3, w3, 3840
-	b	.L808
-.LVL872:
 .L901:
-.LBE1816:
-.LBE1828:
 	.loc 1 1593 0
 	ldr	x0, [x24, 88]
 	.loc 1 1591 0
 	mov	w25, 1
-.LVL873:
+.LVL869:
 	.loc 1 1590 0
 	str	wzr, [x24, 188]
 	.loc 1 1593 0
@@ -9653,60 +9576,37 @@ ebc_thread:
 	str	wzr, [x24, 608]
 	.loc 1 1593 0
 	bl	_dev_info
-.LVL874:
+.LVL870:
 	.loc 1 1594 0
 	mov	x0, 2
 	bl	ebc_notify
-.LVL875:
+.LVL871:
 	.loc 1 1595 0
 	mov	w2, w25
 	mov	w1, w25
 	add	x0, x21, 328
 	bl	__wake_up_sync
-.LVL876:
+.LVL872:
 	b	.L841
-.L794:
-	.loc 1 1418 0
-	ldr	x1, [x0, 16]
-	ldrsw	x2, [x24, 20]
-	ldr	x0, [x24, 128]
-	bl	memcpy
-.LVL877:
-	.loc 1 1419 0
-	ldr	x0, [x24, 200]
-	ldrsw	x2, [x24, 20]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x24, 136]
-	bl	memcpy
-.LVL878:
-	.loc 1 1420 0
-	ldr	x0, [x24, 200]
-	ldrsw	x2, [x24, 20]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x24, 144]
-	bl	memcpy
-.LVL879:
-	ldr	x0, [x24, 208]
-	b	.L796
-.LVL880:
+.LVL873:
 .L897:
 	.loc 1 1349 0
 	str	wzr, [x24, 592]
 	.loc 1 1350 0
 	mov	x0, 3
-.LVL881:
+.LVL874:
 	bl	ebc_notify
-.LVL882:
+.LVL875:
 	.loc 1 1351 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC79
 	add	x1, x1, :lo12:.LC79
 	bl	_dev_info
-.LVL883:
+.LVL876:
 	b	.L771
-.LVL884:
+.LVL877:
 .L922:
-.LBB1829:
+.LBB1827:
 .LBB1820:
 .LBB1821:
 	.loc 1 1562 0 discriminator 1
@@ -9715,122 +9615,220 @@ ebc_thread:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL885:
+.LVL878:
 	b	.L839
 	.p2align 3
-.L927:
-.LVL886:
+.L926:
+.LVL879:
 .LBB1822:
 	.loc 1 1562 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L836
 	.loc 1 1562 0 discriminator 7
 	bl	schedule
-.LVL887:
+.LVL880:
 .L839:
 	.loc 1 1562 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x27
 	bl	prepare_to_wait_event
-.LVL888:
+.LVL881:
 	ldr	w1, [x24, 76]
-	cbz	w1, .L927
+	cbz	w1, .L926
 .LBE1822:
 	.loc 1 1562 0 discriminator 4
 	mov	x0, x27
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL889:
+.LVL882:
 	b	.L836
-.LVL890:
-.L926:
+.L914:
 .LBE1820:
-.LBE1829:
-	.loc 1 1433 0 is_stmt 1
-	mov	x0, x20
-	bl	ebc_power_set.constprop.12
-.LVL891:
-	b	.L822
-.LVL892:
+.LBE1827:
+	mov	x0, x28
+	.loc 1 1421 0 is_stmt 1
+	cbnz	w1, .L796
+	.loc 1 1422 0
+	ldrsw	x2, [x24, 20]
+	ldp	x1, x0, [x24, 136]
+	bl	memcpy
+.LVL883:
+	ldr	x0, [x24, 208]
+	b	.L796
 .L925:
-.LBB1830:
+.LBB1828:
 .LBB1824:
 .LBB1825:
 	.loc 1 1396 0 discriminator 1
 	add	x26, x21, 352
-.LVL893:
+.LVL884:
 .LBE1825:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL894:
+.LVL885:
 	b	.L785
 	.p2align 3
-.L928:
-.LVL895:
+.L927:
+.LVL886:
 .LBB1826:
 	.loc 1 1396 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L782
 	.loc 1 1396 0 discriminator 7
 	bl	schedule
-.LVL896:
+.LVL887:
 .L785:
 	.loc 1 1396 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x26
 	bl	prepare_to_wait_event
-.LVL897:
+.LVL888:
 	ldr	w1, [x24, 76]
-	cbz	w1, .L928
+	cbz	w1, .L927
 .LBE1826:
 	.loc 1 1396 0 discriminator 4
 	mov	x0, x26
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL898:
+.LVL889:
 	b	.L782
-.LVL899:
-.L914:
+.LVL890:
+	.p2align 3
+.L915:
 .LBE1824:
-.LBE1830:
-	.loc 1 1422 0 is_stmt 1
-	ldrsw	x2, [x24, 20]
-	ldp	x1, x0, [x24, 136]
-	bl	memcpy
-.LVL900:
-	ldr	x0, [x24, 208]
-	b	.L796
+.LBE1828:
+.LBB1829:
+.LBB1815:
+	.loc 1 404 0 is_stmt 1
+	orr	w3, w3, 240
+	b	.L806
+	.p2align 3
+.L916:
+	.loc 1 410 0
+	orr	w3, w3, 3840
+	b	.L808
+	.p2align 3
+.L917:
+	.loc 1 416 0
+	orr	w3, w3, 61440
+	b	.L810
+	.p2align 3
+.L918:
+	.loc 1 422 0
+	orr	w3, w3, 983040
+	b	.L812
+.LVL891:
+	.p2align 3
+.L921:
+	.loc 1 440 0
+	orr	w3, w3, -268435456
+.LVL892:
+	.loc 1 445 0
+	and	w1, w1, w25
+.LVL893:
+	eor	w1, w1, w3
+.LVL894:
+	.loc 1 389 0
+	add	w4, w4, 1
+	and	w1, w1, w18
+	cmp	w4, w8
+	.loc 1 445 0
+	eor	w1, w3, w1
+	.loc 1 446 0
+	str	w1, [x7, x0]
+	.loc 1 389 0
+	ble	.L875
+.LVL895:
+	.p2align 2
+.L821:
+	.loc 1 384 0
+	add	w14, w14, 1
+	add	w5, w5, w16
+	cmp	w14, w17
+	ble	.L874
+.L804:
+.LBE1815:
+.LBE1829:
+	.loc 1 1428 0
+	add	x0, x21, 624
+	bl	up_write
+.LVL896:
+	.loc 1 1429 0
+	ldr	w0, [x24, 28]
+	cbnz	w0, .L801
+	.loc 1 1430 0
+	mov	w0, 1
+	str	w0, [x24, 28]
+	.loc 1 1432 0
+	ldr	w0, [x24, 184]
+	.loc 1 1431 0
+	str	wzr, [x24, 76]
+	.loc 1 1432 0
+	cbz	w0, .L928
+.L822:
+	.loc 1 1434 0
+	mov	x0, x20
+	bl	ebc_lut_update
+.LVL897:
+	cmn	w0, #1
+	beq	.L801
+	.loc 1 1438 0
+	ldr	w3, [x24, 96]
+	.loc 1 1441 0
+	adrp	x1, .LC86
+	.loc 1 1438 0
+	strb	w3, [x24, 32]
+	.loc 1 1441 0
+	add	x1, x1, :lo12:.LC86
+	ldr	x0, [x24, 88]
+	b	.L890
+.LVL898:
+	.p2align 3
+.L919:
+.LBB1830:
+.LBB1816:
+	.loc 1 428 0
+	orr	w3, w3, 15728640
+	b	.L814
+	.p2align 3
+.L920:
+	.loc 1 434 0
+	orr	w3, w3, 251658240
+	b	.L816
+.LVL899:
 .L823:
+.LBE1816:
+.LBE1830:
 	.loc 1 1458 0
 	ldr	x0, [x24, 128]
 	mov	x3, x24
 	ldr	x2, [x24, 152]
 	ldr	x1, [x28, 16]
 	bl	refresh_new_image_auto
-.LVL901:
+.LVL900:
 	b	.L824
-.LVL902:
+.LVL901:
 .L903:
 .LBB1831:
 .LBB1832:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
-.LVL903:
+.LVL902:
 	b	.L768
-.LVL904:
+.LVL903:
 .L923:
 .LBE1832:
 .LBE1831:
 	.loc 1 1467 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.12
-.LVL905:
+.LVL904:
 	.loc 1 1468 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL906:
+.LVL905:
 	cmn	w0, #1
 	bne	.L826
 .L924:
@@ -9839,20 +9837,28 @@ ebc_thread:
 	adrp	x1, .LC87
 	add	x1, x1, :lo12:.LC87
 	bl	_dev_err
-.LVL907:
+.LVL906:
 	.loc 1 1470 0
 	b	.L801
+.LVL907:
+.L928:
+	.loc 1 1433 0
+	mov	x0, x20
+	bl	ebc_power_set.constprop.12
+.LVL908:
+	b	.L822
+.LVL909:
 .L913:
 	.loc 1 1380 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.12
-.LVL908:
+.LVL910:
 	b	.L777
-.LVL909:
+.LVL911:
 .L904:
 	.loc 1 1628 0
 	bl	__stack_chk_fail
-.LVL910:
+.LVL912:
 	.cfi_endproc
 .LFE2826:
 	.size	ebc_thread, .-ebc_thread
@@ -10096,7 +10102,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC16:
-	.string	"2.09"
+	.string	"2.10"
 	.zero	3
 .LC17:
 	.string	"%s\n"
@@ -10544,7 +10550,7 @@ __exitcall_ebc_exit:
 	.file 214 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x14612
+	.4byte	0x1462c
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
@@ -38307,7 +38313,7 @@ __exitcall_ebc_exit:
 	.4byte	0xe697
 	.uleb128 0x4e
 	.8byte	.LVL64
-	.4byte	0x142fc
+	.4byte	0x14316
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3022
@@ -38321,7 +38327,7 @@ __exitcall_ebc_exit:
 	.4byte	0xe6c7
 	.uleb128 0x4e
 	.8byte	.LVL352
-	.4byte	0x14308
+	.4byte	0x14322
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3023
@@ -38350,28 +38356,28 @@ __exitcall_ebc_exit:
 	.2byte	0x9b9
 	.4byte	0xe763
 	.uleb128 0x53
-	.4byte	0x13697
+	.4byte	0x136b1
 	.8byte	.LBB940
 	.8byte	.LBE940-.LBB940
 	.byte	0x1
 	.2byte	0x9b8
 	.4byte	0xe733
 	.uleb128 0x54
-	.4byte	0x136a8
+	.4byte	0x136c2
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13288
+	.4byte	0x132a2
 	.8byte	.LBB942
 	.8byte	.LBE942-.LBB942
 	.byte	0x1
 	.2byte	0x9bb
 	.4byte	0xe755
 	.uleb128 0x54
-	.4byte	0x13294
+	.4byte	0x132ae
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL68
-	.4byte	0x14314
+	.4byte	0x1432e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -38409,52 +38415,52 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	__func__.35274
 	.uleb128 0x53
-	.4byte	0x13697
+	.4byte	0x136b1
 	.8byte	.LBB1424
 	.8byte	.LBE1424-.LBB1424
 	.byte	0x1
 	.2byte	0x9a7
 	.4byte	0xe7e8
 	.uleb128 0x54
-	.4byte	0x136a8
+	.4byte	0x136c2
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132a0
+	.4byte	0x132ba
 	.8byte	.LBB1426
 	.8byte	.LBE1426-.LBB1426
 	.byte	0x1
 	.2byte	0x9b0
 	.4byte	0xe80a
 	.uleb128 0x54
-	.4byte	0x132ac
+	.4byte	0x132c6
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12fee
+	.4byte	0x13008
 	.8byte	.LBB1428
 	.8byte	.LBE1428-.LBB1428
 	.byte	0x1
 	.2byte	0x9ac
 	.4byte	0xe855
 	.uleb128 0x54
-	.4byte	0x13009
+	.4byte	0x13023
 	.uleb128 0x54
-	.4byte	0x12ffe
+	.4byte	0x13018
 	.uleb128 0x56
 	.8byte	.LBB1429
 	.8byte	.LBE1429-.LBB1429
 	.uleb128 0x57
-	.4byte	0x13014
+	.4byte	0x1302e
 	.uleb128 0x4e
 	.8byte	.LVL517
-	.4byte	0x1418c
+	.4byte	0x141a6
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL515
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL516
-	.4byte	0x14314
+	.4byte	0x1432e
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
@@ -38483,7 +38489,7 @@ __exitcall_ebc_exit:
 	.4byte	.LLST13
 	.uleb128 0x4e
 	.8byte	.LVL74
-	.4byte	0x14321
+	.4byte	0x1433b
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3029
@@ -38573,58 +38579,58 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.4byte	.LLST153
 	.uleb128 0x5b
-	.4byte	0x136b5
+	.4byte	0x136cf
 	.8byte	.LBB1580
 	.4byte	.Ldebug_ranges0+0xc00
 	.byte	0x1
 	.2byte	0x92d
 	.4byte	0xe9de
 	.uleb128 0x54
-	.4byte	0x136de
+	.4byte	0x136f8
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136ec
 	.uleb128 0x54
-	.4byte	0x136c6
+	.4byte	0x136e0
 	.uleb128 0x4e
 	.8byte	.LVL520
-	.4byte	0x1432d
+	.4byte	0x14347
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13592
+	.4byte	0x135ac
 	.8byte	.LBB1584
 	.8byte	.LBE1584-.LBB1584
 	.byte	0x1
 	.2byte	0x93f
 	.4byte	0xea1d
 	.uleb128 0x54
-	.4byte	0x135a2
+	.4byte	0x135bc
 	.uleb128 0x5c
-	.4byte	0x13697
+	.4byte	0x136b1
 	.8byte	.LBB1585
 	.8byte	.LBE1585-.LBB1585
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x54
-	.4byte	0x136a8
+	.4byte	0x136c2
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135b4
+	.4byte	0x135ce
 	.8byte	.LBB1587
 	.8byte	.LBE1587-.LBB1587
 	.byte	0x1
 	.2byte	0x95a
 	.4byte	0xea5d
 	.uleb128 0x54
-	.4byte	0x135c5
+	.4byte	0x135df
 	.uleb128 0x5d
-	.4byte	0x13697
+	.4byte	0x136b1
 	.8byte	.LBB1588
 	.8byte	.LBE1588-.LBB1588
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x54
-	.4byte	0x136a8
+	.4byte	0x136c2
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
@@ -38641,760 +38647,760 @@ __exitcall_ebc_exit:
 	.uleb128 0x57
 	.4byte	0x116ea
 	.uleb128 0x5b
-	.4byte	0x135d8
+	.4byte	0x135f2
 	.8byte	.LBB1592
 	.4byte	.Ldebug_ranges0+0xc80
 	.byte	0x1
 	.2byte	0x684
 	.4byte	0xeaed
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x1361a
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x1360e
 	.uleb128 0x54
-	.4byte	0x135e9
+	.4byte	0x13603
 	.uleb128 0x5f
-	.4byte	0x1360d
+	.4byte	0x13627
 	.8byte	.LBB1593
 	.4byte	.Ldebug_ranges0+0xc80
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13641
+	.4byte	0x1365b
 	.uleb128 0x54
-	.4byte	0x13635
+	.4byte	0x1364f
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x13643
 	.uleb128 0x54
-	.4byte	0x1361e
+	.4byte	0x13638
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xc80
 	.uleb128 0x57
-	.4byte	0x1364c
+	.4byte	0x13666
 	.uleb128 0x4e
 	.8byte	.LVL545
-	.4byte	0x1433a
+	.4byte	0x14354
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135d8
+	.4byte	0x135f2
 	.8byte	.LBB1604
 	.8byte	.LBE1604-.LBB1604
 	.byte	0x1
 	.2byte	0x687
 	.4byte	0xeb6a
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x1361a
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x1360e
 	.uleb128 0x54
-	.4byte	0x135e9
+	.4byte	0x13603
 	.uleb128 0x5d
-	.4byte	0x1360d
+	.4byte	0x13627
 	.8byte	.LBB1605
 	.8byte	.LBE1605-.LBB1605
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13641
+	.4byte	0x1365b
 	.uleb128 0x54
-	.4byte	0x13635
+	.4byte	0x1364f
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x13643
 	.uleb128 0x54
-	.4byte	0x1361e
+	.4byte	0x13638
 	.uleb128 0x56
 	.8byte	.LBB1606
 	.8byte	.LBE1606-.LBB1606
 	.uleb128 0x57
-	.4byte	0x1364c
+	.4byte	0x13666
 	.uleb128 0x4e
 	.8byte	.LVL546
-	.4byte	0x1433a
+	.4byte	0x14354
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135d8
+	.4byte	0x135f2
 	.8byte	.LBB1607
 	.8byte	.LBE1607-.LBB1607
 	.byte	0x1
 	.2byte	0x68a
 	.4byte	0xebe7
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x1361a
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x1360e
 	.uleb128 0x54
-	.4byte	0x135e9
+	.4byte	0x13603
 	.uleb128 0x5d
-	.4byte	0x1360d
+	.4byte	0x13627
 	.8byte	.LBB1608
 	.8byte	.LBE1608-.LBB1608
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13641
+	.4byte	0x1365b
 	.uleb128 0x54
-	.4byte	0x13635
+	.4byte	0x1364f
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x13643
 	.uleb128 0x54
-	.4byte	0x1361e
+	.4byte	0x13638
 	.uleb128 0x56
 	.8byte	.LBB1609
 	.8byte	.LBE1609-.LBB1609
 	.uleb128 0x57
-	.4byte	0x1364c
+	.4byte	0x13666
 	.uleb128 0x4e
 	.8byte	.LVL547
-	.4byte	0x1433a
+	.4byte	0x14354
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135d8
+	.4byte	0x135f2
 	.8byte	.LBB1610
 	.8byte	.LBE1610-.LBB1610
 	.byte	0x1
 	.2byte	0x68d
 	.4byte	0xec64
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x1361a
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x1360e
 	.uleb128 0x54
-	.4byte	0x135e9
+	.4byte	0x13603
 	.uleb128 0x5d
-	.4byte	0x1360d
+	.4byte	0x13627
 	.8byte	.LBB1611
 	.8byte	.LBE1611-.LBB1611
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13641
+	.4byte	0x1365b
 	.uleb128 0x54
-	.4byte	0x13635
+	.4byte	0x1364f
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x13643
 	.uleb128 0x54
-	.4byte	0x1361e
+	.4byte	0x13638
 	.uleb128 0x56
 	.8byte	.LBB1612
 	.8byte	.LBE1612-.LBB1612
 	.uleb128 0x57
-	.4byte	0x1364c
+	.4byte	0x13666
 	.uleb128 0x4e
 	.8byte	.LVL548
-	.4byte	0x1433a
+	.4byte	0x14354
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135d8
+	.4byte	0x135f2
 	.8byte	.LBB1613
 	.8byte	.LBE1613-.LBB1613
 	.byte	0x1
 	.2byte	0x690
 	.4byte	0xece1
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x1361a
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x1360e
 	.uleb128 0x54
-	.4byte	0x135e9
+	.4byte	0x13603
 	.uleb128 0x5d
-	.4byte	0x1360d
+	.4byte	0x13627
 	.8byte	.LBB1614
 	.8byte	.LBE1614-.LBB1614
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13641
+	.4byte	0x1365b
 	.uleb128 0x54
-	.4byte	0x13635
+	.4byte	0x1364f
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x13643
 	.uleb128 0x54
-	.4byte	0x1361e
+	.4byte	0x13638
 	.uleb128 0x56
 	.8byte	.LBB1615
 	.8byte	.LBE1615-.LBB1615
 	.uleb128 0x57
-	.4byte	0x1364c
+	.4byte	0x13666
 	.uleb128 0x4e
 	.8byte	.LVL549
-	.4byte	0x1433a
+	.4byte	0x14354
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135d8
+	.4byte	0x135f2
 	.8byte	.LBB1616
 	.8byte	.LBE1616-.LBB1616
 	.byte	0x1
 	.2byte	0x693
 	.4byte	0xed5e
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x1361a
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x1360e
 	.uleb128 0x54
-	.4byte	0x135e9
+	.4byte	0x13603
 	.uleb128 0x5d
-	.4byte	0x1360d
+	.4byte	0x13627
 	.8byte	.LBB1617
 	.8byte	.LBE1617-.LBB1617
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13641
+	.4byte	0x1365b
 	.uleb128 0x54
-	.4byte	0x13635
+	.4byte	0x1364f
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x13643
 	.uleb128 0x54
-	.4byte	0x1361e
+	.4byte	0x13638
 	.uleb128 0x56
 	.8byte	.LBB1618
 	.8byte	.LBE1618-.LBB1618
 	.uleb128 0x57
-	.4byte	0x1364c
+	.4byte	0x13666
 	.uleb128 0x4e
 	.8byte	.LVL550
-	.4byte	0x1433a
+	.4byte	0x14354
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135d8
+	.4byte	0x135f2
 	.8byte	.LBB1619
 	.8byte	.LBE1619-.LBB1619
 	.byte	0x1
 	.2byte	0x696
 	.4byte	0xeddb
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x1361a
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x1360e
 	.uleb128 0x54
-	.4byte	0x135e9
+	.4byte	0x13603
 	.uleb128 0x5d
-	.4byte	0x1360d
+	.4byte	0x13627
 	.8byte	.LBB1620
 	.8byte	.LBE1620-.LBB1620
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13641
+	.4byte	0x1365b
 	.uleb128 0x54
-	.4byte	0x13635
+	.4byte	0x1364f
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x13643
 	.uleb128 0x54
-	.4byte	0x1361e
+	.4byte	0x13638
 	.uleb128 0x56
 	.8byte	.LBB1621
 	.8byte	.LBE1621-.LBB1621
 	.uleb128 0x57
-	.4byte	0x1364c
+	.4byte	0x13666
 	.uleb128 0x4e
 	.8byte	.LVL551
-	.4byte	0x1433a
+	.4byte	0x14354
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135d8
+	.4byte	0x135f2
 	.8byte	.LBB1622
 	.8byte	.LBE1622-.LBB1622
 	.byte	0x1
 	.2byte	0x699
 	.4byte	0xee58
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x1361a
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x1360e
 	.uleb128 0x54
-	.4byte	0x135e9
+	.4byte	0x13603
 	.uleb128 0x5d
-	.4byte	0x1360d
+	.4byte	0x13627
 	.8byte	.LBB1623
 	.8byte	.LBE1623-.LBB1623
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13641
+	.4byte	0x1365b
 	.uleb128 0x54
-	.4byte	0x13635
+	.4byte	0x1364f
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x13643
 	.uleb128 0x54
-	.4byte	0x1361e
+	.4byte	0x13638
 	.uleb128 0x56
 	.8byte	.LBB1624
 	.8byte	.LBE1624-.LBB1624
 	.uleb128 0x57
-	.4byte	0x1364c
+	.4byte	0x13666
 	.uleb128 0x4e
 	.8byte	.LVL552
-	.4byte	0x1433a
+	.4byte	0x14354
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135d8
+	.4byte	0x135f2
 	.8byte	.LBB1625
 	.8byte	.LBE1625-.LBB1625
 	.byte	0x1
 	.2byte	0x69c
 	.4byte	0xeed5
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x1361a
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x1360e
 	.uleb128 0x54
-	.4byte	0x135e9
+	.4byte	0x13603
 	.uleb128 0x5d
-	.4byte	0x1360d
+	.4byte	0x13627
 	.8byte	.LBB1626
 	.8byte	.LBE1626-.LBB1626
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13641
+	.4byte	0x1365b
 	.uleb128 0x54
-	.4byte	0x13635
+	.4byte	0x1364f
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x13643
 	.uleb128 0x54
-	.4byte	0x1361e
+	.4byte	0x13638
 	.uleb128 0x56
 	.8byte	.LBB1627
 	.8byte	.LBE1627-.LBB1627
 	.uleb128 0x57
-	.4byte	0x1364c
+	.4byte	0x13666
 	.uleb128 0x4e
 	.8byte	.LVL553
-	.4byte	0x1433a
+	.4byte	0x14354
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135d8
+	.4byte	0x135f2
 	.8byte	.LBB1628
 	.8byte	.LBE1628-.LBB1628
 	.byte	0x1
 	.2byte	0x69f
 	.4byte	0xef52
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x1361a
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x1360e
 	.uleb128 0x54
-	.4byte	0x135e9
+	.4byte	0x13603
 	.uleb128 0x5d
-	.4byte	0x1360d
+	.4byte	0x13627
 	.8byte	.LBB1629
 	.8byte	.LBE1629-.LBB1629
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13641
+	.4byte	0x1365b
 	.uleb128 0x54
-	.4byte	0x13635
+	.4byte	0x1364f
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x13643
 	.uleb128 0x54
-	.4byte	0x1361e
+	.4byte	0x13638
 	.uleb128 0x56
 	.8byte	.LBB1630
 	.8byte	.LBE1630-.LBB1630
 	.uleb128 0x57
-	.4byte	0x1364c
+	.4byte	0x13666
 	.uleb128 0x4e
 	.8byte	.LVL554
-	.4byte	0x1433a
+	.4byte	0x14354
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135d8
+	.4byte	0x135f2
 	.8byte	.LBB1631
 	.8byte	.LBE1631-.LBB1631
 	.byte	0x1
 	.2byte	0x6a2
 	.4byte	0xefcf
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x1361a
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x1360e
 	.uleb128 0x54
-	.4byte	0x135e9
+	.4byte	0x13603
 	.uleb128 0x5d
-	.4byte	0x1360d
+	.4byte	0x13627
 	.8byte	.LBB1632
 	.8byte	.LBE1632-.LBB1632
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13641
+	.4byte	0x1365b
 	.uleb128 0x54
-	.4byte	0x13635
+	.4byte	0x1364f
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x13643
 	.uleb128 0x54
-	.4byte	0x1361e
+	.4byte	0x13638
 	.uleb128 0x56
 	.8byte	.LBB1633
 	.8byte	.LBE1633-.LBB1633
 	.uleb128 0x57
-	.4byte	0x1364c
+	.4byte	0x13666
 	.uleb128 0x4e
 	.8byte	.LVL555
-	.4byte	0x1433a
+	.4byte	0x14354
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135d8
+	.4byte	0x135f2
 	.8byte	.LBB1634
 	.8byte	.LBE1634-.LBB1634
 	.byte	0x1
 	.2byte	0x6a5
 	.4byte	0xf04c
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x1361a
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x1360e
 	.uleb128 0x54
-	.4byte	0x135e9
+	.4byte	0x13603
 	.uleb128 0x5d
-	.4byte	0x1360d
+	.4byte	0x13627
 	.8byte	.LBB1635
 	.8byte	.LBE1635-.LBB1635
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13641
+	.4byte	0x1365b
 	.uleb128 0x54
-	.4byte	0x13635
+	.4byte	0x1364f
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x13643
 	.uleb128 0x54
-	.4byte	0x1361e
+	.4byte	0x13638
 	.uleb128 0x56
 	.8byte	.LBB1636
 	.8byte	.LBE1636-.LBB1636
 	.uleb128 0x57
-	.4byte	0x1364c
+	.4byte	0x13666
 	.uleb128 0x4e
 	.8byte	.LVL556
-	.4byte	0x1433a
+	.4byte	0x14354
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135d8
+	.4byte	0x135f2
 	.8byte	.LBB1637
 	.8byte	.LBE1637-.LBB1637
 	.byte	0x1
 	.2byte	0x6a8
 	.4byte	0xf0c9
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x1361a
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x1360e
 	.uleb128 0x54
-	.4byte	0x135e9
+	.4byte	0x13603
 	.uleb128 0x5d
-	.4byte	0x1360d
+	.4byte	0x13627
 	.8byte	.LBB1638
 	.8byte	.LBE1638-.LBB1638
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13641
+	.4byte	0x1365b
 	.uleb128 0x54
-	.4byte	0x13635
+	.4byte	0x1364f
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x13643
 	.uleb128 0x54
-	.4byte	0x1361e
+	.4byte	0x13638
 	.uleb128 0x56
 	.8byte	.LBB1639
 	.8byte	.LBE1639-.LBB1639
 	.uleb128 0x57
-	.4byte	0x1364c
+	.4byte	0x13666
 	.uleb128 0x4e
 	.8byte	.LVL557
-	.4byte	0x1433a
+	.4byte	0x14354
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135d8
+	.4byte	0x135f2
 	.8byte	.LBB1640
 	.8byte	.LBE1640-.LBB1640
 	.byte	0x1
 	.2byte	0x6ab
 	.4byte	0xf146
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x1361a
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x1360e
 	.uleb128 0x54
-	.4byte	0x135e9
+	.4byte	0x13603
 	.uleb128 0x5d
-	.4byte	0x1360d
+	.4byte	0x13627
 	.8byte	.LBB1641
 	.8byte	.LBE1641-.LBB1641
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13641
+	.4byte	0x1365b
 	.uleb128 0x54
-	.4byte	0x13635
+	.4byte	0x1364f
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x13643
 	.uleb128 0x54
-	.4byte	0x1361e
+	.4byte	0x13638
 	.uleb128 0x56
 	.8byte	.LBB1642
 	.8byte	.LBE1642-.LBB1642
 	.uleb128 0x57
-	.4byte	0x1364c
+	.4byte	0x13666
 	.uleb128 0x4e
 	.8byte	.LVL558
-	.4byte	0x1433a
+	.4byte	0x14354
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135d8
+	.4byte	0x135f2
 	.8byte	.LBB1643
 	.8byte	.LBE1643-.LBB1643
 	.byte	0x1
 	.2byte	0x6ae
 	.4byte	0xf1c3
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x1361a
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x1360e
 	.uleb128 0x54
-	.4byte	0x135e9
+	.4byte	0x13603
 	.uleb128 0x5d
-	.4byte	0x1360d
+	.4byte	0x13627
 	.8byte	.LBB1644
 	.8byte	.LBE1644-.LBB1644
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13641
+	.4byte	0x1365b
 	.uleb128 0x54
-	.4byte	0x13635
+	.4byte	0x1364f
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x13643
 	.uleb128 0x54
-	.4byte	0x1361e
+	.4byte	0x13638
 	.uleb128 0x56
 	.8byte	.LBB1645
 	.8byte	.LBE1645-.LBB1645
 	.uleb128 0x57
-	.4byte	0x1364c
+	.4byte	0x13666
 	.uleb128 0x4e
 	.8byte	.LVL559
-	.4byte	0x1433a
+	.4byte	0x14354
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135d8
+	.4byte	0x135f2
 	.8byte	.LBB1646
 	.8byte	.LBE1646-.LBB1646
 	.byte	0x1
 	.2byte	0x6b1
 	.4byte	0xf240
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x1361a
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x1360e
 	.uleb128 0x54
-	.4byte	0x135e9
+	.4byte	0x13603
 	.uleb128 0x5d
-	.4byte	0x1360d
+	.4byte	0x13627
 	.8byte	.LBB1647
 	.8byte	.LBE1647-.LBB1647
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13641
+	.4byte	0x1365b
 	.uleb128 0x54
-	.4byte	0x13635
+	.4byte	0x1364f
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x13643
 	.uleb128 0x54
-	.4byte	0x1361e
+	.4byte	0x13638
 	.uleb128 0x56
 	.8byte	.LBB1648
 	.8byte	.LBE1648-.LBB1648
 	.uleb128 0x57
-	.4byte	0x1364c
+	.4byte	0x13666
 	.uleb128 0x4e
 	.8byte	.LVL560
-	.4byte	0x1433a
+	.4byte	0x14354
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135d8
+	.4byte	0x135f2
 	.8byte	.LBB1649
 	.8byte	.LBE1649-.LBB1649
 	.byte	0x1
 	.2byte	0x6b4
 	.4byte	0xf2bd
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x1361a
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x1360e
 	.uleb128 0x54
-	.4byte	0x135e9
+	.4byte	0x13603
 	.uleb128 0x5d
-	.4byte	0x1360d
+	.4byte	0x13627
 	.8byte	.LBB1650
 	.8byte	.LBE1650-.LBB1650
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13641
+	.4byte	0x1365b
 	.uleb128 0x54
-	.4byte	0x13635
+	.4byte	0x1364f
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x13643
 	.uleb128 0x54
-	.4byte	0x1361e
+	.4byte	0x13638
 	.uleb128 0x56
 	.8byte	.LBB1651
 	.8byte	.LBE1651-.LBB1651
 	.uleb128 0x57
-	.4byte	0x1364c
+	.4byte	0x13666
 	.uleb128 0x4e
 	.8byte	.LVL561
-	.4byte	0x1433a
+	.4byte	0x14354
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135d8
+	.4byte	0x135f2
 	.8byte	.LBB1652
 	.8byte	.LBE1652-.LBB1652
 	.byte	0x1
 	.2byte	0x6b7
 	.4byte	0xf33a
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x1361a
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x1360e
 	.uleb128 0x54
-	.4byte	0x135e9
+	.4byte	0x13603
 	.uleb128 0x5d
-	.4byte	0x1360d
+	.4byte	0x13627
 	.8byte	.LBB1653
 	.8byte	.LBE1653-.LBB1653
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13641
+	.4byte	0x1365b
 	.uleb128 0x54
-	.4byte	0x13635
+	.4byte	0x1364f
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x13643
 	.uleb128 0x54
-	.4byte	0x1361e
+	.4byte	0x13638
 	.uleb128 0x56
 	.8byte	.LBB1654
 	.8byte	.LBE1654-.LBB1654
 	.uleb128 0x57
-	.4byte	0x1364c
+	.4byte	0x13666
 	.uleb128 0x4e
 	.8byte	.LVL562
-	.4byte	0x1433a
+	.4byte	0x14354
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135d8
+	.4byte	0x135f2
 	.8byte	.LBB1655
 	.8byte	.LBE1655-.LBB1655
 	.byte	0x1
 	.2byte	0x6ba
 	.4byte	0xf3b7
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x1361a
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x1360e
 	.uleb128 0x54
-	.4byte	0x135e9
+	.4byte	0x13603
 	.uleb128 0x5d
-	.4byte	0x1360d
+	.4byte	0x13627
 	.8byte	.LBB1656
 	.8byte	.LBE1656-.LBB1656
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13641
+	.4byte	0x1365b
 	.uleb128 0x54
-	.4byte	0x13635
+	.4byte	0x1364f
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x13643
 	.uleb128 0x54
-	.4byte	0x1361e
+	.4byte	0x13638
 	.uleb128 0x56
 	.8byte	.LBB1657
 	.8byte	.LBE1657-.LBB1657
 	.uleb128 0x57
-	.4byte	0x1364c
+	.4byte	0x13666
 	.uleb128 0x4e
 	.8byte	.LVL563
-	.4byte	0x1433a
+	.4byte	0x14354
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x135d8
+	.4byte	0x135f2
 	.8byte	.LBB1658
 	.8byte	.LBE1658-.LBB1658
 	.byte	0x1
 	.2byte	0x6bd
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x1361a
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x1360e
 	.uleb128 0x54
-	.4byte	0x135e9
+	.4byte	0x13603
 	.uleb128 0x5d
-	.4byte	0x1360d
+	.4byte	0x13627
 	.8byte	.LBB1659
 	.8byte	.LBE1659-.LBB1659
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13641
+	.4byte	0x1365b
 	.uleb128 0x54
-	.4byte	0x13635
+	.4byte	0x1364f
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x13643
 	.uleb128 0x54
-	.4byte	0x1361e
+	.4byte	0x13638
 	.uleb128 0x56
 	.8byte	.LBB1660
 	.8byte	.LBE1660-.LBB1660
 	.uleb128 0x57
-	.4byte	0x1364c
+	.4byte	0x13666
 	.uleb128 0x4e
 	.8byte	.LVL564
-	.4byte	0x1433a
+	.4byte	0x14354
 	.byte	0
 	.byte	0
 	.byte	0
@@ -39432,104 +39438,104 @@ __exitcall_ebc_exit:
 	.uleb128 0x57
 	.4byte	0xfe9f
 	.uleb128 0x5b
-	.4byte	0x136eb
+	.4byte	0x13705
 	.8byte	.LBB1669
 	.4byte	.Ldebug_ranges0+0xd40
 	.byte	0x1
 	.2byte	0x864
 	.4byte	0xf4a2
 	.uleb128 0x54
-	.4byte	0x136fb
+	.4byte	0x13715
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x136b5
+	.4byte	0x136cf
 	.8byte	.LBB1673
 	.4byte	.Ldebug_ranges0+0xd70
 	.byte	0x1
 	.2byte	0x87f
 	.4byte	0xf4d7
 	.uleb128 0x54
-	.4byte	0x136de
+	.4byte	0x136f8
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136ec
 	.uleb128 0x54
-	.4byte	0x136c6
+	.4byte	0x136e0
 	.uleb128 0x4e
 	.8byte	.LVL570
-	.4byte	0x1432d
+	.4byte	0x14347
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136b5
+	.4byte	0x136cf
 	.8byte	.LBB1681
 	.8byte	.LBE1681-.LBB1681
 	.byte	0x1
 	.2byte	0x882
 	.4byte	0xf510
 	.uleb128 0x54
-	.4byte	0x136de
+	.4byte	0x136f8
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136ec
 	.uleb128 0x54
-	.4byte	0x136c6
+	.4byte	0x136e0
 	.uleb128 0x4e
 	.8byte	.LVL571
-	.4byte	0x1432d
+	.4byte	0x14347
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136b5
+	.4byte	0x136cf
 	.8byte	.LBB1683
 	.8byte	.LBE1683-.LBB1683
 	.byte	0x1
 	.2byte	0x885
 	.4byte	0xf549
 	.uleb128 0x54
-	.4byte	0x136de
+	.4byte	0x136f8
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136ec
 	.uleb128 0x54
-	.4byte	0x136c6
+	.4byte	0x136e0
 	.uleb128 0x4e
 	.8byte	.LVL572
-	.4byte	0x1432d
+	.4byte	0x14347
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136b5
+	.4byte	0x136cf
 	.8byte	.LBB1685
 	.8byte	.LBE1685-.LBB1685
 	.byte	0x1
 	.2byte	0x88d
 	.4byte	0xf582
 	.uleb128 0x54
-	.4byte	0x136de
+	.4byte	0x136f8
 	.uleb128 0x54
-	.4byte	0x136d2
+	.4byte	0x136ec
 	.uleb128 0x54
-	.4byte	0x136c6
+	.4byte	0x136e0
 	.uleb128 0x4e
 	.8byte	.LVL573
-	.4byte	0x1432d
+	.4byte	0x14347
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL566
-	.4byte	0x14347
+	.4byte	0x14361
 	.uleb128 0x4e
 	.8byte	.LVL567
-	.4byte	0x14354
+	.4byte	0x1436e
 	.uleb128 0x4e
 	.8byte	.LVL568
-	.4byte	0x14360
+	.4byte	0x1437a
 	.uleb128 0x4e
 	.8byte	.LVL569
-	.4byte	0x1436c
+	.4byte	0x14386
 	.uleb128 0x4e
 	.8byte	.LVL574
-	.4byte	0x14378
+	.4byte	0x14392
 	.uleb128 0x4e
 	.8byte	.LVL575
-	.4byte	0x14382
+	.4byte	0x1439c
 	.uleb128 0x4e
 	.8byte	.LVL588
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
@@ -39565,39 +39571,39 @@ __exitcall_ebc_exit:
 	.uleb128 0x57
 	.4byte	0xff0d
 	.uleb128 0x53
-	.4byte	0x136eb
+	.4byte	0x13705
 	.8byte	.LBB1696
 	.8byte	.LBE1696-.LBB1696
 	.byte	0x1
 	.2byte	0x837
 	.4byte	0xf657
 	.uleb128 0x54
-	.4byte	0x136fb
+	.4byte	0x13715
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL577
-	.4byte	0x14347
+	.4byte	0x14361
 	.uleb128 0x4e
 	.8byte	.LVL578
-	.4byte	0x14354
+	.4byte	0x1436e
 	.uleb128 0x4e
 	.8byte	.LVL592
-	.4byte	0x14360
+	.4byte	0x1437a
 	.uleb128 0x4e
 	.8byte	.LVL593
-	.4byte	0x1439b
+	.4byte	0x143b5
 	.uleb128 0x4e
 	.8byte	.LVL678
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL679
-	.4byte	0x143a7
+	.4byte	0x143c1
 	.uleb128 0x4e
 	.8byte	.LVL680
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL694
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
@@ -39617,53 +39623,53 @@ __exitcall_ebc_exit:
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5b
-	.4byte	0x138c1
+	.4byte	0x138db
 	.8byte	.LBB1706
 	.4byte	.Ldebug_ranges0+0xe60
 	.byte	0x1
 	.2byte	0x89a
 	.4byte	0xf748
 	.uleb128 0x54
-	.4byte	0x138cd
+	.4byte	0x138e7
 	.uleb128 0x56
 	.8byte	.LBB1708
 	.8byte	.LBE1708-.LBB1708
 	.uleb128 0x57
-	.4byte	0x138f8
+	.4byte	0x13912
 	.uleb128 0x5c
-	.4byte	0x13a9b
+	.4byte	0x13ab5
 	.8byte	.LBB1709
 	.8byte	.LBE1709-.LBB1709
 	.byte	0x10
 	.byte	0x1c
 	.uleb128 0x54
-	.4byte	0x13abe
+	.4byte	0x13ad8
 	.uleb128 0x54
-	.4byte	0x13ab2
+	.4byte	0x13acc
 	.uleb128 0x54
-	.4byte	0x13aa8
+	.4byte	0x13ac2
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x139dd
+	.4byte	0x139f7
 	.8byte	.LBB1713
 	.8byte	.LBE1713-.LBB1713
 	.byte	0x1
 	.2byte	0x8a2
 	.4byte	0xf793
 	.uleb128 0x54
-	.4byte	0x139f2
+	.4byte	0x13a0c
 	.uleb128 0x54
-	.4byte	0x139e9
+	.4byte	0x13a03
 	.uleb128 0x56
 	.8byte	.LBB1714
 	.8byte	.LBE1714-.LBB1714
 	.uleb128 0x60
-	.4byte	0x139fb
+	.4byte	0x13a15
 	.4byte	.LLST157
 	.uleb128 0x60
-	.4byte	0x13a05
+	.4byte	0x13a1f
 	.4byte	.LLST158
 	.byte	0
 	.byte	0
@@ -39675,48 +39681,48 @@ __exitcall_ebc_exit:
 	.4byte	.LLST159
 	.uleb128 0x4e
 	.8byte	.LVL600
-	.4byte	0x143b3
+	.4byte	0x143cd
 	.uleb128 0x4e
 	.8byte	.LVL602
-	.4byte	0x143bf
+	.4byte	0x143d9
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x139dd
+	.4byte	0x139f7
 	.8byte	.LBB1717
 	.8byte	.LBE1717-.LBB1717
 	.byte	0x1
 	.2byte	0x8ab
 	.4byte	0xf80b
 	.uleb128 0x54
-	.4byte	0x139f2
+	.4byte	0x13a0c
 	.uleb128 0x54
-	.4byte	0x139e9
+	.4byte	0x13a03
 	.uleb128 0x56
 	.8byte	.LBB1718
 	.8byte	.LBE1718-.LBB1718
 	.uleb128 0x60
-	.4byte	0x139fb
+	.4byte	0x13a15
 	.4byte	.LLST160
 	.uleb128 0x60
-	.4byte	0x13a05
+	.4byte	0x13a1f
 	.4byte	.LLST161
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL594
-	.4byte	0x143b3
+	.4byte	0x143cd
 	.uleb128 0x4e
 	.8byte	.LVL595
-	.4byte	0x143cc
+	.4byte	0x143e6
 	.uleb128 0x4e
 	.8byte	.LVL603
-	.4byte	0x143cc
+	.4byte	0x143e6
 	.uleb128 0x4e
 	.8byte	.LVL681
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL685
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.byte	0
 	.byte	0
 	.uleb128 0x53
@@ -39729,40 +39735,40 @@ __exitcall_ebc_exit:
 	.uleb128 0x54
 	.4byte	0xfdeb
 	.uleb128 0x5b
-	.4byte	0x1331e
+	.4byte	0x13338
 	.8byte	.LBB1723
 	.4byte	.Ldebug_ranges0+0xec0
 	.byte	0x1
 	.2byte	0x8bb
 	.4byte	0xf8b3
 	.uleb128 0x54
-	.4byte	0x13340
+	.4byte	0x1335a
 	.uleb128 0x54
-	.4byte	0x13335
+	.4byte	0x1334f
 	.uleb128 0x54
-	.4byte	0x1332a
+	.4byte	0x13344
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xec0
 	.uleb128 0x60
-	.4byte	0x1334b
+	.4byte	0x13365
 	.4byte	.LLST162
 	.uleb128 0x4e
 	.8byte	.LVL610
-	.4byte	0x143d9
+	.4byte	0x143f3
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL611
-	.4byte	0x143e5
+	.4byte	0x143ff
 	.uleb128 0x4e
 	.8byte	.LVL612
-	.4byte	0x143f1
+	.4byte	0x1440b
 	.uleb128 0x4e
 	.8byte	.LVL613
-	.4byte	0x143e5
+	.4byte	0x143ff
 	.uleb128 0x4e
 	.8byte	.LVL614
-	.4byte	0x143f1
+	.4byte	0x1440b
 	.byte	0
 	.uleb128 0x5b
 	.4byte	0xfd3c
@@ -39824,153 +39830,153 @@ __exitcall_ebc_exit:
 	.4byte	.LLST171
 	.uleb128 0x4e
 	.8byte	.LVL631
-	.4byte	0x143fd
+	.4byte	0x14417
 	.uleb128 0x4e
 	.8byte	.LVL633
-	.4byte	0x14382
+	.4byte	0x1439c
 	.uleb128 0x4e
 	.8byte	.LVL634
-	.4byte	0x14409
+	.4byte	0x14423
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1349b
+	.4byte	0x134b5
 	.8byte	.LBB1737
 	.8byte	.LBE1737-.LBB1737
 	.byte	0x1
 	.2byte	0x8d9
 	.4byte	0xfa21
 	.uleb128 0x54
-	.4byte	0x134b8
+	.4byte	0x134d2
 	.uleb128 0x54
-	.4byte	0x134ac
+	.4byte	0x134c6
 	.uleb128 0x5d
-	.4byte	0x134c5
+	.4byte	0x134df
 	.8byte	.LBB1738
 	.8byte	.LBE1738-.LBB1738
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x134e2
+	.4byte	0x134fc
 	.uleb128 0x54
-	.4byte	0x134d6
+	.4byte	0x134f0
 	.uleb128 0x4e
 	.8byte	.LVL650
-	.4byte	0x14415
+	.4byte	0x1442f
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1349b
+	.4byte	0x134b5
 	.8byte	.LBB1740
 	.8byte	.LBE1740-.LBB1740
 	.byte	0x1
 	.2byte	0x8e7
 	.4byte	0xfa78
 	.uleb128 0x54
-	.4byte	0x134b8
+	.4byte	0x134d2
 	.uleb128 0x54
-	.4byte	0x134ac
+	.4byte	0x134c6
 	.uleb128 0x5d
-	.4byte	0x134c5
+	.4byte	0x134df
 	.8byte	.LBB1741
 	.8byte	.LBE1741-.LBB1741
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x134e2
+	.4byte	0x134fc
 	.uleb128 0x54
-	.4byte	0x134d6
+	.4byte	0x134f0
 	.uleb128 0x4e
 	.8byte	.LVL663
-	.4byte	0x14415
+	.4byte	0x1442f
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL616
-	.4byte	0x14422
+	.4byte	0x1443c
 	.uleb128 0x4e
 	.8byte	.LVL618
-	.4byte	0x14422
+	.4byte	0x1443c
 	.uleb128 0x4e
 	.8byte	.LVL620
-	.4byte	0x1442e
+	.4byte	0x14448
 	.uleb128 0x4e
 	.8byte	.LVL625
-	.4byte	0x1442e
+	.4byte	0x14448
 	.uleb128 0x4e
 	.8byte	.LVL629
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL630
-	.4byte	0x1443b
+	.4byte	0x14455
 	.uleb128 0x4e
 	.8byte	.LVL635
-	.4byte	0x14447
+	.4byte	0x14461
 	.uleb128 0x4e
 	.8byte	.LVL636
-	.4byte	0x14447
+	.4byte	0x14461
 	.uleb128 0x4e
 	.8byte	.LVL647
-	.4byte	0x14453
+	.4byte	0x1446d
 	.uleb128 0x4e
 	.8byte	.LVL649
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL654
-	.4byte	0x1445f
+	.4byte	0x14479
 	.uleb128 0x4e
 	.8byte	.LVL657
-	.4byte	0x143fd
+	.4byte	0x14417
 	.uleb128 0x4e
 	.8byte	.LVL659
-	.4byte	0x1445f
+	.4byte	0x14479
 	.uleb128 0x4e
 	.8byte	.LVL660
-	.4byte	0x14409
+	.4byte	0x14423
 	.uleb128 0x4e
 	.8byte	.LVL662
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL666
-	.4byte	0x1445f
+	.4byte	0x14479
 	.uleb128 0x4e
 	.8byte	.LVL670
-	.4byte	0x143fd
+	.4byte	0x14417
 	.uleb128 0x4e
 	.8byte	.LVL672
-	.4byte	0x1445f
+	.4byte	0x14479
 	.uleb128 0x4e
 	.8byte	.LVL673
-	.4byte	0x14409
+	.4byte	0x14423
 	.uleb128 0x4e
 	.8byte	.LVL692
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL700
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1356f
+	.4byte	0x13589
 	.8byte	.LBB1747
 	.8byte	.LBE1747-.LBB1747
 	.byte	0x1
 	.2byte	0x994
 	.4byte	0xfbd4
 	.uleb128 0x54
-	.4byte	0x13586
+	.4byte	0x135a0
 	.uleb128 0x54
-	.4byte	0x1357b
+	.4byte	0x13595
 	.uleb128 0x5c
-	.4byte	0x13671
+	.4byte	0x1368b
 	.8byte	.LBB1748
 	.8byte	.LBE1748-.LBB1748
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x54
-	.4byte	0x1368a
+	.4byte	0x136a4
 	.uleb128 0x54
-	.4byte	0x1367e
+	.4byte	0x13698
 	.byte	0
 	.byte	0
 	.uleb128 0x53
@@ -39984,80 +39990,80 @@ __exitcall_ebc_exit:
 	.4byte	0xff41
 	.uleb128 0x4e
 	.8byte	.LVL637
-	.4byte	0x14469
+	.4byte	0x14483
 	.uleb128 0x4e
 	.8byte	.LVL638
-	.4byte	0x14475
+	.4byte	0x1448f
 	.uleb128 0x4e
 	.8byte	.LVL639
-	.4byte	0x14475
+	.4byte	0x1448f
 	.uleb128 0x4e
 	.8byte	.LVL640
-	.4byte	0x14475
+	.4byte	0x1448f
 	.uleb128 0x4e
 	.8byte	.LVL641
-	.4byte	0x14475
+	.4byte	0x1448f
 	.uleb128 0x4e
 	.8byte	.LVL642
-	.4byte	0x14475
+	.4byte	0x1448f
 	.uleb128 0x4e
 	.8byte	.LVL643
-	.4byte	0x14475
+	.4byte	0x1448f
 	.uleb128 0x4e
 	.8byte	.LVL644
-	.4byte	0x14475
+	.4byte	0x1448f
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL521
-	.4byte	0x14347
+	.4byte	0x14361
 	.uleb128 0x4e
 	.8byte	.LVL522
-	.4byte	0x14482
+	.4byte	0x1449c
 	.uleb128 0x4e
 	.8byte	.LVL524
-	.4byte	0x1448e
+	.4byte	0x144a8
 	.uleb128 0x4e
 	.8byte	.LVL530
-	.4byte	0x1449b
+	.4byte	0x144b5
 	.uleb128 0x4e
 	.8byte	.LVL533
-	.4byte	0x144a8
+	.4byte	0x144c2
 	.uleb128 0x4e
 	.8byte	.LVL534
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL542
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL579
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL581
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL584
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL586
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL589
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL645
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL676
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL682
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL687
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL696
-	.4byte	0x144b5
+	.4byte	0x144cf
 	.byte	0
 	.uleb128 0x63
 	.4byte	.LASF3042
@@ -40316,7 +40322,7 @@ __exitcall_ebc_exit:
 	.4byte	.LLST77
 	.uleb128 0x4e
 	.8byte	.LVL300
-	.4byte	0x144bf
+	.4byte	0x144d9
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3052
@@ -40348,7 +40354,7 @@ __exitcall_ebc_exit:
 	.4byte	.LLST80
 	.uleb128 0x4e
 	.8byte	.LVL305
-	.4byte	0x144cb
+	.4byte	0x144e5
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3053
@@ -40380,7 +40386,7 @@ __exitcall_ebc_exit:
 	.4byte	.LLST83
 	.uleb128 0x4e
 	.8byte	.LVL310
-	.4byte	0x144cb
+	.4byte	0x144e5
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3054
@@ -40435,19 +40441,19 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.uleb128 0x4e
 	.8byte	.LVL336
-	.4byte	0x144d8
+	.4byte	0x144f2
 	.uleb128 0x4e
 	.8byte	.LVL338
-	.4byte	0x144e5
+	.4byte	0x144ff
 	.uleb128 0x4e
 	.8byte	.LVL343
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL346
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL347
-	.4byte	0x144b5
+	.4byte	0x144cf
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3055
@@ -40488,18 +40494,18 @@ __exitcall_ebc_exit:
 	.2byte	0x7db
 	.4byte	0xc6
 	.uleb128 0x53
-	.4byte	0x13247
+	.4byte	0x13261
 	.8byte	.LBB1220
 	.8byte	.LBE1220-.LBB1220
 	.byte	0x1
 	.2byte	0x7dd
 	.4byte	0x101ca
 	.uleb128 0x54
-	.4byte	0x13257
+	.4byte	0x13271
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL315
-	.4byte	0x144cb
+	.4byte	0x144e5
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3056
@@ -40543,23 +40549,23 @@ __exitcall_ebc_exit:
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x5b
-	.4byte	0x13263
+	.4byte	0x1327d
 	.8byte	.LBB1222
 	.4byte	.Ldebug_ranges0+0x6a0
 	.byte	0x1
 	.2byte	0x7cf
 	.4byte	0x10266
 	.uleb128 0x54
-	.4byte	0x1327e
+	.4byte	0x13298
 	.uleb128 0x54
-	.4byte	0x13273
+	.4byte	0x1328d
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL322
-	.4byte	0x144cb
+	.4byte	0x144e5
 	.uleb128 0x4e
 	.8byte	.LVL325
-	.4byte	0x144b5
+	.4byte	0x144cf
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3057
@@ -40596,7 +40602,7 @@ __exitcall_ebc_exit:
 	.4byte	0xe49e
 	.uleb128 0x4e
 	.8byte	.LVL330
-	.4byte	0x144cb
+	.4byte	0x144e5
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3058
@@ -40633,10 +40639,10 @@ __exitcall_ebc_exit:
 	.4byte	0x56
 	.uleb128 0x4e
 	.8byte	.LVL349
-	.4byte	0x144f1
+	.4byte	0x1450b
 	.uleb128 0x4e
 	.8byte	.LVL350
-	.4byte	0x144cb
+	.4byte	0x144e5
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3060
@@ -40691,10 +40697,10 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.uleb128 0x4e
 	.8byte	.LVL76
-	.4byte	0x144fd
+	.4byte	0x14517
 	.uleb128 0x4e
 	.8byte	.LVL77
-	.4byte	0x14509
+	.4byte	0x14523
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3062
@@ -40813,66 +40819,66 @@ __exitcall_ebc_exit:
 	.4byte	.LLST33
 	.uleb128 0x4e
 	.8byte	.LVL123
-	.4byte	0x14516
+	.4byte	0x14530
 	.uleb128 0x4e
 	.8byte	.LVL124
-	.4byte	0x14522
+	.4byte	0x1453c
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL121
-	.4byte	0x1452f
+	.4byte	0x14549
 	.uleb128 0x4e
 	.8byte	.LVL125
-	.4byte	0x1453b
+	.4byte	0x14555
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13356
+	.4byte	0x13370
 	.8byte	.LBB948
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
 	.2byte	0x77e
 	.4byte	0x1079a
 	.uleb128 0x54
-	.4byte	0x1337b
+	.4byte	0x13395
 	.uleb128 0x54
-	.4byte	0x13370
+	.4byte	0x1338a
 	.uleb128 0x54
-	.4byte	0x13366
+	.4byte	0x13380
 	.uleb128 0x6d
-	.4byte	0x133b4
+	.4byte	0x133ce
 	.8byte	.LBB949
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x133d9
+	.4byte	0x133f3
 	.uleb128 0x54
-	.4byte	0x133ce
+	.4byte	0x133e8
 	.uleb128 0x54
-	.4byte	0x133c4
+	.4byte	0x133de
 	.uleb128 0x6e
-	.4byte	0x13451
+	.4byte	0x1346b
 	.8byte	.LBB951
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x106d0
 	.uleb128 0x54
-	.4byte	0x1346c
+	.4byte	0x13486
 	.uleb128 0x6f
-	.4byte	0x13461
+	.4byte	0x1347b
 	.4byte	.LLST19
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x80
 	.uleb128 0x60
-	.4byte	0x13477
+	.4byte	0x13491
 	.4byte	.LLST20
 	.uleb128 0x60
-	.4byte	0x13482
+	.4byte	0x1349c
 	.4byte	.LLST21
 	.uleb128 0x70
-	.4byte	0x138a5
+	.4byte	0x138bf
 	.8byte	.LBB953
 	.8byte	.LBE953-.LBB953
 	.byte	0x6
@@ -40882,99 +40888,99 @@ __exitcall_ebc_exit:
 	.8byte	.LBB954
 	.8byte	.LBE954-.LBB954
 	.uleb128 0x60
-	.4byte	0x138b5
+	.4byte	0x138cf
 	.4byte	.LLST22
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13879
+	.4byte	0x13893
 	.8byte	.LBB955
 	.8byte	.LBE955-.LBB955
 	.byte	0x6
 	.byte	0x55
 	.4byte	0x1067e
 	.uleb128 0x54
-	.4byte	0x13893
+	.4byte	0x138ad
 	.uleb128 0x54
-	.4byte	0x13889
+	.4byte	0x138a3
 	.uleb128 0x5c
-	.4byte	0x139b1
+	.4byte	0x139cb
 	.8byte	.LBB956
 	.8byte	.LBE956-.LBB956
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x139cb
+	.4byte	0x139e5
 	.uleb128 0x54
-	.4byte	0x139c1
+	.4byte	0x139db
 	.byte	0
 	.byte	0
 	.uleb128 0x56
 	.8byte	.LBB958
 	.8byte	.LBE958-.LBB958
 	.uleb128 0x57
-	.4byte	0x1348e
+	.4byte	0x134a8
 	.uleb128 0x5c
-	.4byte	0x13929
+	.4byte	0x13943
 	.8byte	.LBB959
 	.8byte	.LBE959-.LBB959
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13944
+	.4byte	0x1395e
 	.uleb128 0x54
-	.4byte	0x13939
+	.4byte	0x13953
 	.uleb128 0x56
 	.8byte	.LBB960
 	.8byte	.LBE960-.LBB960
 	.uleb128 0x57
-	.4byte	0x1394f
+	.4byte	0x13969
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x1341d
+	.4byte	0x13437
 	.8byte	.LBB965
 	.8byte	.LBE965-.LBB965
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x1078b
 	.uleb128 0x54
-	.4byte	0x1342d
+	.4byte	0x13447
 	.uleb128 0x56
 	.8byte	.LBB966
 	.8byte	.LBE966-.LBB966
 	.uleb128 0x60
-	.4byte	0x13438
+	.4byte	0x13452
 	.4byte	.LLST23
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0xc0
 	.4byte	0x10756
 	.uleb128 0x60
-	.4byte	0x13444
+	.4byte	0x1345e
 	.4byte	.LLST24
 	.uleb128 0x5c
-	.4byte	0x13929
+	.4byte	0x13943
 	.8byte	.LBB968
 	.8byte	.LBE968-.LBB968
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13944
+	.4byte	0x1395e
 	.uleb128 0x54
-	.4byte	0x13939
+	.4byte	0x13953
 	.uleb128 0x56
 	.8byte	.LBB969
 	.8byte	.LBE969-.LBB969
 	.uleb128 0x57
-	.4byte	0x1394f
+	.4byte	0x13969
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x138a5
+	.4byte	0x138bf
 	.8byte	.LBB970
 	.8byte	.LBE970-.LBB970
 	.byte	0x6
@@ -40983,7 +40989,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB971
 	.8byte	.LBE971-.LBB971
 	.uleb128 0x60
-	.4byte	0x138b5
+	.4byte	0x138cf
 	.4byte	.LLST25
 	.byte	0
 	.byte	0
@@ -40991,60 +40997,60 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL151
-	.4byte	0x14548
+	.4byte	0x14562
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13385
+	.4byte	0x1339f
 	.8byte	.LBB981
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
 	.2byte	0x701
 	.4byte	0x109c5
 	.uleb128 0x54
-	.4byte	0x133aa
+	.4byte	0x133c4
 	.uleb128 0x54
-	.4byte	0x1339f
+	.4byte	0x133b9
 	.uleb128 0x54
-	.4byte	0x13395
+	.4byte	0x133af
 	.uleb128 0x6d
-	.4byte	0x133e3
+	.4byte	0x133fd
 	.8byte	.LBB982
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x13408
+	.4byte	0x13422
 	.uleb128 0x54
-	.4byte	0x133fd
+	.4byte	0x13417
 	.uleb128 0x54
-	.4byte	0x133f3
+	.4byte	0x1340d
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x57
-	.4byte	0x13411
+	.4byte	0x1342b
 	.uleb128 0x6e
-	.4byte	0x13451
+	.4byte	0x1346b
 	.8byte	.LBB984
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x108fa
 	.uleb128 0x54
-	.4byte	0x1346c
+	.4byte	0x13486
 	.uleb128 0x6f
-	.4byte	0x13461
+	.4byte	0x1347b
 	.4byte	.LLST26
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x130
 	.uleb128 0x60
-	.4byte	0x13477
+	.4byte	0x13491
 	.4byte	.LLST27
 	.uleb128 0x60
-	.4byte	0x13482
+	.4byte	0x1349c
 	.4byte	.LLST28
 	.uleb128 0x70
-	.4byte	0x138a5
+	.4byte	0x138bf
 	.8byte	.LBB986
 	.8byte	.LBE986-.LBB986
 	.byte	0x6
@@ -41054,7 +41060,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB987
 	.8byte	.LBE987-.LBB987
 	.uleb128 0x60
-	.4byte	0x138b5
+	.4byte	0x138cf
 	.4byte	.LLST29
 	.byte	0
 	.byte	0
@@ -41063,90 +41069,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE988-.LBB988
 	.4byte	0x108b4
 	.uleb128 0x57
-	.4byte	0x1348e
+	.4byte	0x134a8
 	.uleb128 0x5c
-	.4byte	0x13929
+	.4byte	0x13943
 	.8byte	.LBB989
 	.8byte	.LBE989-.LBB989
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13944
+	.4byte	0x1395e
 	.uleb128 0x54
-	.4byte	0x13939
+	.4byte	0x13953
 	.uleb128 0x56
 	.8byte	.LBB990
 	.8byte	.LBE990-.LBB990
 	.uleb128 0x57
-	.4byte	0x1394f
+	.4byte	0x13969
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13879
+	.4byte	0x13893
 	.8byte	.LBB991
 	.8byte	.LBE991-.LBB991
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13893
+	.4byte	0x138ad
 	.uleb128 0x54
-	.4byte	0x13889
+	.4byte	0x138a3
 	.uleb128 0x5c
-	.4byte	0x139b1
+	.4byte	0x139cb
 	.8byte	.LBB992
 	.8byte	.LBE992-.LBB992
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x139cb
+	.4byte	0x139e5
 	.uleb128 0x54
-	.4byte	0x139c1
+	.4byte	0x139db
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x1341d
+	.4byte	0x13437
 	.8byte	.LBB996
 	.8byte	.LBE996-.LBB996
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x109b5
 	.uleb128 0x54
-	.4byte	0x1342d
+	.4byte	0x13447
 	.uleb128 0x56
 	.8byte	.LBB997
 	.8byte	.LBE997-.LBB997
 	.uleb128 0x60
-	.4byte	0x13438
+	.4byte	0x13452
 	.4byte	.LLST30
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x170
 	.4byte	0x10980
 	.uleb128 0x60
-	.4byte	0x13444
+	.4byte	0x1345e
 	.4byte	.LLST31
 	.uleb128 0x5c
-	.4byte	0x13929
+	.4byte	0x13943
 	.8byte	.LBB999
 	.8byte	.LBE999-.LBB999
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13944
+	.4byte	0x1395e
 	.uleb128 0x54
-	.4byte	0x13939
+	.4byte	0x13953
 	.uleb128 0x56
 	.8byte	.LBB1000
 	.8byte	.LBE1000-.LBB1000
 	.uleb128 0x57
-	.4byte	0x1394f
+	.4byte	0x13969
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x138a5
+	.4byte	0x138bf
 	.8byte	.LBB1001
 	.8byte	.LBE1001-.LBB1001
 	.byte	0x6
@@ -41155,7 +41161,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1002
 	.8byte	.LBE1002-.LBB1002
 	.uleb128 0x60
-	.4byte	0x138b5
+	.4byte	0x138cf
 	.4byte	.LLST32
 	.byte	0
 	.byte	0
@@ -41163,61 +41169,61 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL116
-	.4byte	0x14555
+	.4byte	0x1456f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13385
+	.4byte	0x1339f
 	.8byte	.LBB1016
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
 	.2byte	0x71d
 	.4byte	0x10bf0
 	.uleb128 0x54
-	.4byte	0x133aa
+	.4byte	0x133c4
 	.uleb128 0x54
-	.4byte	0x1339f
+	.4byte	0x133b9
 	.uleb128 0x54
-	.4byte	0x13395
+	.4byte	0x133af
 	.uleb128 0x6d
-	.4byte	0x133e3
+	.4byte	0x133fd
 	.8byte	.LBB1017
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x13408
+	.4byte	0x13422
 	.uleb128 0x54
-	.4byte	0x133fd
+	.4byte	0x13417
 	.uleb128 0x54
-	.4byte	0x133f3
+	.4byte	0x1340d
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x1f0
 	.uleb128 0x57
-	.4byte	0x13411
+	.4byte	0x1342b
 	.uleb128 0x6e
-	.4byte	0x13451
+	.4byte	0x1346b
 	.8byte	.LBB1019
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x10b25
 	.uleb128 0x54
-	.4byte	0x1346c
+	.4byte	0x13486
 	.uleb128 0x6f
-	.4byte	0x13461
+	.4byte	0x1347b
 	.4byte	.LLST34
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x230
 	.uleb128 0x60
-	.4byte	0x13477
+	.4byte	0x13491
 	.4byte	.LLST35
 	.uleb128 0x60
-	.4byte	0x13482
+	.4byte	0x1349c
 	.4byte	.LLST36
 	.uleb128 0x70
-	.4byte	0x138a5
+	.4byte	0x138bf
 	.8byte	.LBB1021
 	.8byte	.LBE1021-.LBB1021
 	.byte	0x6
@@ -41227,7 +41233,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1022
 	.8byte	.LBE1022-.LBB1022
 	.uleb128 0x60
-	.4byte	0x138b5
+	.4byte	0x138cf
 	.4byte	.LLST37
 	.byte	0
 	.byte	0
@@ -41236,90 +41242,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1023-.LBB1023
 	.4byte	0x10adf
 	.uleb128 0x57
-	.4byte	0x1348e
+	.4byte	0x134a8
 	.uleb128 0x5c
-	.4byte	0x13929
+	.4byte	0x13943
 	.8byte	.LBB1024
 	.8byte	.LBE1024-.LBB1024
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13944
+	.4byte	0x1395e
 	.uleb128 0x54
-	.4byte	0x13939
+	.4byte	0x13953
 	.uleb128 0x56
 	.8byte	.LBB1025
 	.8byte	.LBE1025-.LBB1025
 	.uleb128 0x57
-	.4byte	0x1394f
+	.4byte	0x13969
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13879
+	.4byte	0x13893
 	.8byte	.LBB1026
 	.8byte	.LBE1026-.LBB1026
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13893
+	.4byte	0x138ad
 	.uleb128 0x54
-	.4byte	0x13889
+	.4byte	0x138a3
 	.uleb128 0x5c
-	.4byte	0x139b1
+	.4byte	0x139cb
 	.8byte	.LBB1027
 	.8byte	.LBE1027-.LBB1027
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x139cb
+	.4byte	0x139e5
 	.uleb128 0x54
-	.4byte	0x139c1
+	.4byte	0x139db
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x1341d
+	.4byte	0x13437
 	.8byte	.LBB1031
 	.8byte	.LBE1031-.LBB1031
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x10be0
 	.uleb128 0x54
-	.4byte	0x1342d
+	.4byte	0x13447
 	.uleb128 0x56
 	.8byte	.LBB1032
 	.8byte	.LBE1032-.LBB1032
 	.uleb128 0x60
-	.4byte	0x13438
+	.4byte	0x13452
 	.4byte	.LLST38
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x270
 	.4byte	0x10bab
 	.uleb128 0x60
-	.4byte	0x13444
+	.4byte	0x1345e
 	.4byte	.LLST39
 	.uleb128 0x5c
-	.4byte	0x13929
+	.4byte	0x13943
 	.8byte	.LBB1034
 	.8byte	.LBE1034-.LBB1034
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13944
+	.4byte	0x1395e
 	.uleb128 0x54
-	.4byte	0x13939
+	.4byte	0x13953
 	.uleb128 0x56
 	.8byte	.LBB1035
 	.8byte	.LBE1035-.LBB1035
 	.uleb128 0x57
-	.4byte	0x1394f
+	.4byte	0x13969
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x138a5
+	.4byte	0x138bf
 	.8byte	.LBB1036
 	.8byte	.LBE1036-.LBB1036
 	.byte	0x6
@@ -41328,7 +41334,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1037
 	.8byte	.LBE1037-.LBB1037
 	.uleb128 0x60
-	.4byte	0x138b5
+	.4byte	0x138cf
 	.4byte	.LLST40
 	.byte	0
 	.byte	0
@@ -41336,57 +41342,57 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL140
-	.4byte	0x14555
+	.4byte	0x1456f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13356
+	.4byte	0x13370
 	.8byte	.LBB1046
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
 	.2byte	0x6eb
 	.4byte	0x10e10
 	.uleb128 0x54
-	.4byte	0x1337b
+	.4byte	0x13395
 	.uleb128 0x54
-	.4byte	0x13370
+	.4byte	0x1338a
 	.uleb128 0x54
-	.4byte	0x13366
+	.4byte	0x13380
 	.uleb128 0x6d
-	.4byte	0x133b4
+	.4byte	0x133ce
 	.8byte	.LBB1047
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x133d9
+	.4byte	0x133f3
 	.uleb128 0x54
-	.4byte	0x133ce
+	.4byte	0x133e8
 	.uleb128 0x54
-	.4byte	0x133c4
+	.4byte	0x133de
 	.uleb128 0x6e
-	.4byte	0x13451
+	.4byte	0x1346b
 	.8byte	.LBB1049
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x10d46
 	.uleb128 0x54
-	.4byte	0x1346c
+	.4byte	0x13486
 	.uleb128 0x6f
-	.4byte	0x13461
+	.4byte	0x1347b
 	.4byte	.LLST41
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x2f0
 	.uleb128 0x60
-	.4byte	0x13477
+	.4byte	0x13491
 	.4byte	.LLST42
 	.uleb128 0x60
-	.4byte	0x13482
+	.4byte	0x1349c
 	.4byte	.LLST43
 	.uleb128 0x70
-	.4byte	0x138a5
+	.4byte	0x138bf
 	.8byte	.LBB1051
 	.8byte	.LBE1051-.LBB1051
 	.byte	0x6
@@ -41396,7 +41402,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1052
 	.8byte	.LBE1052-.LBB1052
 	.uleb128 0x60
-	.4byte	0x138b5
+	.4byte	0x138cf
 	.4byte	.LLST44
 	.byte	0
 	.byte	0
@@ -41405,90 +41411,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1053-.LBB1053
 	.4byte	0x10d00
 	.uleb128 0x57
-	.4byte	0x1348e
+	.4byte	0x134a8
 	.uleb128 0x5c
-	.4byte	0x13929
+	.4byte	0x13943
 	.8byte	.LBB1054
 	.8byte	.LBE1054-.LBB1054
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13944
+	.4byte	0x1395e
 	.uleb128 0x54
-	.4byte	0x13939
+	.4byte	0x13953
 	.uleb128 0x56
 	.8byte	.LBB1055
 	.8byte	.LBE1055-.LBB1055
 	.uleb128 0x57
-	.4byte	0x1394f
+	.4byte	0x13969
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13879
+	.4byte	0x13893
 	.8byte	.LBB1056
 	.8byte	.LBE1056-.LBB1056
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13893
+	.4byte	0x138ad
 	.uleb128 0x54
-	.4byte	0x13889
+	.4byte	0x138a3
 	.uleb128 0x5c
-	.4byte	0x139b1
+	.4byte	0x139cb
 	.8byte	.LBB1057
 	.8byte	.LBE1057-.LBB1057
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x139cb
+	.4byte	0x139e5
 	.uleb128 0x54
-	.4byte	0x139c1
+	.4byte	0x139db
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x1341d
+	.4byte	0x13437
 	.8byte	.LBB1063
 	.8byte	.LBE1063-.LBB1063
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x10e01
 	.uleb128 0x54
-	.4byte	0x1342d
+	.4byte	0x13447
 	.uleb128 0x56
 	.8byte	.LBB1064
 	.8byte	.LBE1064-.LBB1064
 	.uleb128 0x60
-	.4byte	0x13438
+	.4byte	0x13452
 	.4byte	.LLST45
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x340
 	.4byte	0x10dcc
 	.uleb128 0x60
-	.4byte	0x13444
+	.4byte	0x1345e
 	.4byte	.LLST46
 	.uleb128 0x5c
-	.4byte	0x13929
+	.4byte	0x13943
 	.8byte	.LBB1066
 	.8byte	.LBE1066-.LBB1066
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13944
+	.4byte	0x1395e
 	.uleb128 0x54
-	.4byte	0x13939
+	.4byte	0x13953
 	.uleb128 0x56
 	.8byte	.LBB1067
 	.8byte	.LBE1067-.LBB1067
 	.uleb128 0x57
-	.4byte	0x1394f
+	.4byte	0x13969
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x138a5
+	.4byte	0x138bf
 	.8byte	.LBB1068
 	.8byte	.LBE1068-.LBB1068
 	.byte	0x6
@@ -41497,7 +41503,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1069
 	.8byte	.LBE1069-.LBB1069
 	.uleb128 0x60
-	.4byte	0x138b5
+	.4byte	0x138cf
 	.4byte	.LLST47
 	.byte	0
 	.byte	0
@@ -41505,61 +41511,61 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL167
-	.4byte	0x14548
+	.4byte	0x14562
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13385
+	.4byte	0x1339f
 	.8byte	.LBB1080
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
 	.2byte	0x73a
 	.4byte	0x1104c
 	.uleb128 0x54
-	.4byte	0x133aa
+	.4byte	0x133c4
 	.uleb128 0x54
-	.4byte	0x1339f
+	.4byte	0x133b9
 	.uleb128 0x54
-	.4byte	0x13395
+	.4byte	0x133af
 	.uleb128 0x6d
-	.4byte	0x133e3
+	.4byte	0x133fd
 	.8byte	.LBB1081
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x13408
+	.4byte	0x13422
 	.uleb128 0x54
-	.4byte	0x133fd
+	.4byte	0x13417
 	.uleb128 0x54
-	.4byte	0x133f3
+	.4byte	0x1340d
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x370
 	.uleb128 0x60
-	.4byte	0x13411
+	.4byte	0x1342b
 	.4byte	.LLST48
 	.uleb128 0x6e
-	.4byte	0x13451
+	.4byte	0x1346b
 	.8byte	.LBB1083
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x10f74
 	.uleb128 0x54
-	.4byte	0x1346c
+	.4byte	0x13486
 	.uleb128 0x6f
-	.4byte	0x13461
+	.4byte	0x1347b
 	.4byte	.LLST49
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x60
-	.4byte	0x13477
+	.4byte	0x13491
 	.4byte	.LLST50
 	.uleb128 0x60
-	.4byte	0x13482
+	.4byte	0x1349c
 	.4byte	.LLST51
 	.uleb128 0x70
-	.4byte	0x138a5
+	.4byte	0x138bf
 	.8byte	.LBB1085
 	.8byte	.LBE1085-.LBB1085
 	.byte	0x6
@@ -41569,7 +41575,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1086
 	.8byte	.LBE1086-.LBB1086
 	.uleb128 0x60
-	.4byte	0x138b5
+	.4byte	0x138cf
 	.4byte	.LLST52
 	.byte	0
 	.byte	0
@@ -41578,90 +41584,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1087-.LBB1087
 	.4byte	0x10f2e
 	.uleb128 0x57
-	.4byte	0x1348e
+	.4byte	0x134a8
 	.uleb128 0x5c
-	.4byte	0x13929
+	.4byte	0x13943
 	.8byte	.LBB1088
 	.8byte	.LBE1088-.LBB1088
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13944
+	.4byte	0x1395e
 	.uleb128 0x54
-	.4byte	0x13939
+	.4byte	0x13953
 	.uleb128 0x56
 	.8byte	.LBB1089
 	.8byte	.LBE1089-.LBB1089
 	.uleb128 0x57
-	.4byte	0x1394f
+	.4byte	0x13969
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13879
+	.4byte	0x13893
 	.8byte	.LBB1090
 	.8byte	.LBE1090-.LBB1090
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13893
+	.4byte	0x138ad
 	.uleb128 0x54
-	.4byte	0x13889
+	.4byte	0x138a3
 	.uleb128 0x5c
-	.4byte	0x139b1
+	.4byte	0x139cb
 	.8byte	.LBB1091
 	.8byte	.LBE1091-.LBB1091
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x139cb
+	.4byte	0x139e5
 	.uleb128 0x54
-	.4byte	0x139c1
+	.4byte	0x139db
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x1341d
+	.4byte	0x13437
 	.8byte	.LBB1097
 	.8byte	.LBE1097-.LBB1097
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x1102f
 	.uleb128 0x54
-	.4byte	0x1342d
+	.4byte	0x13447
 	.uleb128 0x56
 	.8byte	.LBB1098
 	.8byte	.LBE1098-.LBB1098
 	.uleb128 0x60
-	.4byte	0x13438
+	.4byte	0x13452
 	.4byte	.LLST53
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x420
 	.4byte	0x10ffa
 	.uleb128 0x60
-	.4byte	0x13444
+	.4byte	0x1345e
 	.4byte	.LLST54
 	.uleb128 0x5c
-	.4byte	0x13929
+	.4byte	0x13943
 	.8byte	.LBB1100
 	.8byte	.LBE1100-.LBB1100
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13944
+	.4byte	0x1395e
 	.uleb128 0x54
-	.4byte	0x13939
+	.4byte	0x13953
 	.uleb128 0x56
 	.8byte	.LBB1101
 	.8byte	.LBE1101-.LBB1101
 	.uleb128 0x57
-	.4byte	0x1394f
+	.4byte	0x13969
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x138a5
+	.4byte	0x138bf
 	.8byte	.LBB1102
 	.8byte	.LBE1102-.LBB1102
 	.byte	0x6
@@ -41670,7 +41676,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1103
 	.8byte	.LBE1103-.LBB1103
 	.uleb128 0x60
-	.4byte	0x138b5
+	.4byte	0x138cf
 	.4byte	.LLST55
 	.byte	0
 	.byte	0
@@ -41678,59 +41684,59 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL179
-	.4byte	0x14555
+	.4byte	0x1456f
 	.uleb128 0x4e
 	.8byte	.LVL257
-	.4byte	0x14378
+	.4byte	0x14392
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13356
+	.4byte	0x13370
 	.8byte	.LBB1116
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
 	.2byte	0x757
 	.4byte	0x110fe
 	.uleb128 0x54
-	.4byte	0x1337b
+	.4byte	0x13395
 	.uleb128 0x54
-	.4byte	0x13370
+	.4byte	0x1338a
 	.uleb128 0x54
-	.4byte	0x13366
+	.4byte	0x13380
 	.uleb128 0x6d
-	.4byte	0x133b4
+	.4byte	0x133ce
 	.8byte	.LBB1117
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x133d9
+	.4byte	0x133f3
 	.uleb128 0x54
-	.4byte	0x133ce
+	.4byte	0x133e8
 	.uleb128 0x54
-	.4byte	0x133c4
+	.4byte	0x133de
 	.uleb128 0x6d
-	.4byte	0x13451
+	.4byte	0x1346b
 	.8byte	.LBB1119
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x54
-	.4byte	0x1346c
+	.4byte	0x13486
 	.uleb128 0x71
-	.4byte	0x13461
+	.4byte	0x1347b
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x4b0
 	.uleb128 0x57
-	.4byte	0x13477
+	.4byte	0x13491
 	.uleb128 0x60
-	.4byte	0x13482
+	.4byte	0x1349c
 	.4byte	.LLST56
 	.uleb128 0x5c
-	.4byte	0x138a5
+	.4byte	0x138bf
 	.8byte	.LBB1121
 	.8byte	.LBE1121-.LBB1121
 	.byte	0x6
@@ -41739,7 +41745,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1122
 	.8byte	.LBE1122-.LBB1122
 	.uleb128 0x60
-	.4byte	0x138b5
+	.4byte	0x138cf
 	.4byte	.LLST57
 	.byte	0
 	.byte	0
@@ -41748,52 +41754,52 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13356
+	.4byte	0x13370
 	.8byte	.LBB1128
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
 	.2byte	0x747
 	.4byte	0x1131e
 	.uleb128 0x54
-	.4byte	0x1337b
+	.4byte	0x13395
 	.uleb128 0x54
-	.4byte	0x13370
+	.4byte	0x1338a
 	.uleb128 0x54
-	.4byte	0x13366
+	.4byte	0x13380
 	.uleb128 0x6d
-	.4byte	0x133b4
+	.4byte	0x133ce
 	.8byte	.LBB1129
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x133d9
+	.4byte	0x133f3
 	.uleb128 0x54
-	.4byte	0x133ce
+	.4byte	0x133e8
 	.uleb128 0x54
-	.4byte	0x133c4
+	.4byte	0x133de
 	.uleb128 0x6e
-	.4byte	0x13451
+	.4byte	0x1346b
 	.8byte	.LBB1131
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x11254
 	.uleb128 0x54
-	.4byte	0x1346c
+	.4byte	0x13486
 	.uleb128 0x6f
-	.4byte	0x13461
+	.4byte	0x1347b
 	.4byte	.LLST58
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x540
 	.uleb128 0x60
-	.4byte	0x13477
+	.4byte	0x13491
 	.4byte	.LLST59
 	.uleb128 0x60
-	.4byte	0x13482
+	.4byte	0x1349c
 	.4byte	.LLST60
 	.uleb128 0x70
-	.4byte	0x138a5
+	.4byte	0x138bf
 	.8byte	.LBB1133
 	.8byte	.LBE1133-.LBB1133
 	.byte	0x6
@@ -41803,7 +41809,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1134
 	.8byte	.LBE1134-.LBB1134
 	.uleb128 0x60
-	.4byte	0x138b5
+	.4byte	0x138cf
 	.4byte	.LLST61
 	.byte	0
 	.byte	0
@@ -41812,90 +41818,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1135-.LBB1135
 	.4byte	0x1120e
 	.uleb128 0x57
-	.4byte	0x1348e
+	.4byte	0x134a8
 	.uleb128 0x5c
-	.4byte	0x13929
+	.4byte	0x13943
 	.8byte	.LBB1136
 	.8byte	.LBE1136-.LBB1136
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13944
+	.4byte	0x1395e
 	.uleb128 0x54
-	.4byte	0x13939
+	.4byte	0x13953
 	.uleb128 0x56
 	.8byte	.LBB1137
 	.8byte	.LBE1137-.LBB1137
 	.uleb128 0x57
-	.4byte	0x1394f
+	.4byte	0x13969
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13879
+	.4byte	0x13893
 	.8byte	.LBB1138
 	.8byte	.LBE1138-.LBB1138
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13893
+	.4byte	0x138ad
 	.uleb128 0x54
-	.4byte	0x13889
+	.4byte	0x138a3
 	.uleb128 0x5c
-	.4byte	0x139b1
+	.4byte	0x139cb
 	.8byte	.LBB1139
 	.8byte	.LBE1139-.LBB1139
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x139cb
+	.4byte	0x139e5
 	.uleb128 0x54
-	.4byte	0x139c1
+	.4byte	0x139db
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x1341d
+	.4byte	0x13437
 	.8byte	.LBB1147
 	.8byte	.LBE1147-.LBB1147
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x1130f
 	.uleb128 0x54
-	.4byte	0x1342d
+	.4byte	0x13447
 	.uleb128 0x56
 	.8byte	.LBB1148
 	.8byte	.LBE1148-.LBB1148
 	.uleb128 0x60
-	.4byte	0x13438
+	.4byte	0x13452
 	.4byte	.LLST62
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x590
 	.4byte	0x112da
 	.uleb128 0x60
-	.4byte	0x13444
+	.4byte	0x1345e
 	.4byte	.LLST63
 	.uleb128 0x5c
-	.4byte	0x13929
+	.4byte	0x13943
 	.8byte	.LBB1150
 	.8byte	.LBE1150-.LBB1150
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13944
+	.4byte	0x1395e
 	.uleb128 0x54
-	.4byte	0x13939
+	.4byte	0x13953
 	.uleb128 0x56
 	.8byte	.LBB1151
 	.8byte	.LBE1151-.LBB1151
 	.uleb128 0x57
-	.4byte	0x1394f
+	.4byte	0x13969
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x138a5
+	.4byte	0x138bf
 	.8byte	.LBB1152
 	.8byte	.LBE1152-.LBB1152
 	.byte	0x6
@@ -41904,7 +41910,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1153
 	.8byte	.LBE1153-.LBB1153
 	.uleb128 0x60
-	.4byte	0x138b5
+	.4byte	0x138cf
 	.4byte	.LLST64
 	.byte	0
 	.byte	0
@@ -41912,56 +41918,56 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL240
-	.4byte	0x14548
+	.4byte	0x14562
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13356
+	.4byte	0x13370
 	.8byte	.LBB1164
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
 	.2byte	0x6f9
 	.4byte	0x1153e
 	.uleb128 0x54
-	.4byte	0x1337b
+	.4byte	0x13395
 	.uleb128 0x54
-	.4byte	0x13370
+	.4byte	0x1338a
 	.uleb128 0x54
-	.4byte	0x13366
+	.4byte	0x13380
 	.uleb128 0x6d
-	.4byte	0x133b4
+	.4byte	0x133ce
 	.8byte	.LBB1165
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x133d9
+	.4byte	0x133f3
 	.uleb128 0x54
-	.4byte	0x133ce
+	.4byte	0x133e8
 	.uleb128 0x54
-	.4byte	0x133c4
+	.4byte	0x133de
 	.uleb128 0x6e
-	.4byte	0x13451
+	.4byte	0x1346b
 	.8byte	.LBB1167
 	.4byte	.Ldebug_ranges0+0x620
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x11474
 	.uleb128 0x54
-	.4byte	0x1346c
+	.4byte	0x13486
 	.uleb128 0x6f
-	.4byte	0x13461
+	.4byte	0x1347b
 	.4byte	.LLST65
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x620
 	.uleb128 0x60
-	.4byte	0x13477
+	.4byte	0x13491
 	.4byte	.LLST66
 	.uleb128 0x60
-	.4byte	0x13482
+	.4byte	0x1349c
 	.4byte	.LLST67
 	.uleb128 0x70
-	.4byte	0x138a5
+	.4byte	0x138bf
 	.8byte	.LBB1169
 	.8byte	.LBE1169-.LBB1169
 	.byte	0x6
@@ -41971,7 +41977,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1170
 	.8byte	.LBE1170-.LBB1170
 	.uleb128 0x60
-	.4byte	0x138b5
+	.4byte	0x138cf
 	.4byte	.LLST68
 	.byte	0
 	.byte	0
@@ -41980,90 +41986,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1171-.LBB1171
 	.4byte	0x1142e
 	.uleb128 0x57
-	.4byte	0x1348e
+	.4byte	0x134a8
 	.uleb128 0x5c
-	.4byte	0x13929
+	.4byte	0x13943
 	.8byte	.LBB1172
 	.8byte	.LBE1172-.LBB1172
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13944
+	.4byte	0x1395e
 	.uleb128 0x54
-	.4byte	0x13939
+	.4byte	0x13953
 	.uleb128 0x56
 	.8byte	.LBB1173
 	.8byte	.LBE1173-.LBB1173
 	.uleb128 0x57
-	.4byte	0x1394f
+	.4byte	0x13969
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13879
+	.4byte	0x13893
 	.8byte	.LBB1174
 	.8byte	.LBE1174-.LBB1174
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13893
+	.4byte	0x138ad
 	.uleb128 0x54
-	.4byte	0x13889
+	.4byte	0x138a3
 	.uleb128 0x5c
-	.4byte	0x139b1
+	.4byte	0x139cb
 	.8byte	.LBB1175
 	.8byte	.LBE1175-.LBB1175
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x139cb
+	.4byte	0x139e5
 	.uleb128 0x54
-	.4byte	0x139c1
+	.4byte	0x139db
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x1341d
+	.4byte	0x13437
 	.8byte	.LBB1183
 	.8byte	.LBE1183-.LBB1183
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x1152f
 	.uleb128 0x54
-	.4byte	0x1342d
+	.4byte	0x13447
 	.uleb128 0x56
 	.8byte	.LBB1184
 	.8byte	.LBE1184-.LBB1184
 	.uleb128 0x60
-	.4byte	0x13438
+	.4byte	0x13452
 	.4byte	.LLST69
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x670
 	.4byte	0x114fa
 	.uleb128 0x60
-	.4byte	0x13444
+	.4byte	0x1345e
 	.4byte	.LLST70
 	.uleb128 0x5c
-	.4byte	0x13929
+	.4byte	0x13943
 	.8byte	.LBB1186
 	.8byte	.LBE1186-.LBB1186
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13944
+	.4byte	0x1395e
 	.uleb128 0x54
-	.4byte	0x13939
+	.4byte	0x13953
 	.uleb128 0x56
 	.8byte	.LBB1187
 	.8byte	.LBE1187-.LBB1187
 	.uleb128 0x57
-	.4byte	0x1394f
+	.4byte	0x13969
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x138a5
+	.4byte	0x138bf
 	.8byte	.LBB1188
 	.8byte	.LBE1188-.LBB1188
 	.byte	0x6
@@ -42072,7 +42078,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1189
 	.8byte	.LBE1189-.LBB1189
 	.uleb128 0x60
-	.4byte	0x138b5
+	.4byte	0x138cf
 	.4byte	.LLST71
 	.byte	0
 	.byte	0
@@ -42080,96 +42086,96 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL248
-	.4byte	0x14548
+	.4byte	0x14562
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL81
-	.4byte	0x143fd
+	.4byte	0x14417
 	.uleb128 0x4e
 	.8byte	.LVL82
-	.4byte	0x1445f
+	.4byte	0x14479
 	.uleb128 0x4e
 	.8byte	.LVL83
-	.4byte	0x144fd
+	.4byte	0x14517
 	.uleb128 0x4e
 	.8byte	.LVL94
-	.4byte	0x14562
+	.4byte	0x1457c
 	.uleb128 0x4e
 	.8byte	.LVL97
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL100
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL117
-	.4byte	0x144fd
+	.4byte	0x14517
 	.uleb128 0x4e
 	.8byte	.LVL118
-	.4byte	0x1456e
+	.4byte	0x14588
 	.uleb128 0x4e
 	.8byte	.LVL120
-	.4byte	0x14409
+	.4byte	0x14423
 	.uleb128 0x4e
 	.8byte	.LVL127
-	.4byte	0x143fd
+	.4byte	0x14417
 	.uleb128 0x4e
 	.8byte	.LVL141
-	.4byte	0x1457a
+	.4byte	0x14594
 	.uleb128 0x4e
 	.8byte	.LVL142
-	.4byte	0x14409
+	.4byte	0x14423
 	.uleb128 0x4e
 	.8byte	.LVL143
-	.4byte	0x14453
+	.4byte	0x1446d
 	.uleb128 0x4e
 	.8byte	.LVL153
-	.4byte	0x14586
+	.4byte	0x145a0
 	.uleb128 0x4e
 	.8byte	.LVL154
-	.4byte	0x144fd
+	.4byte	0x14517
 	.uleb128 0x4e
 	.8byte	.LVL181
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL184
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL186
-	.4byte	0x143fd
+	.4byte	0x14417
 	.uleb128 0x4e
 	.8byte	.LVL188
-	.4byte	0x143fd
+	.4byte	0x14417
 	.uleb128 0x4e
 	.8byte	.LVL189
-	.4byte	0x1445f
+	.4byte	0x14479
 	.uleb128 0x4e
 	.8byte	.LVL190
-	.4byte	0x144fd
+	.4byte	0x14517
 	.uleb128 0x4e
 	.8byte	.LVL203
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL206
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL208
-	.4byte	0x143fd
+	.4byte	0x14417
 	.uleb128 0x4e
 	.8byte	.LVL209
-	.4byte	0x144fd
+	.4byte	0x14517
 	.uleb128 0x4e
 	.8byte	.LVL217
-	.4byte	0x14562
+	.4byte	0x1457c
 	.uleb128 0x4e
 	.8byte	.LVL251
-	.4byte	0x14453
+	.4byte	0x1446d
 	.uleb128 0x4e
 	.8byte	.LVL258
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL259
-	.4byte	0x144b5
+	.4byte	0x144cf
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
@@ -42215,7 +42221,7 @@ __exitcall_ebc_exit:
 	.4byte	.LLST72
 	.uleb128 0x4e
 	.8byte	.LVL272
-	.4byte	0x12160
+	.4byte	0x1217a
 	.byte	0
 	.uleb128 0x4d
 	.4byte	.LASF3073
@@ -42238,16 +42244,16 @@ __exitcall_ebc_exit:
 	.2byte	0x670
 	.4byte	0xe763
 	.uleb128 0x5f
-	.4byte	0x132e8
+	.4byte	0x13302
 	.8byte	.LBB944
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
 	.2byte	0x674
 	.uleb128 0x54
-	.4byte	0x132f4
+	.4byte	0x1330e
 	.uleb128 0x4e
 	.8byte	.LVL71
-	.4byte	0x14592
+	.4byte	0x145ac
 	.byte	0
 	.byte	0
 	.uleb128 0x63
@@ -42277,7 +42283,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2826-.LFB2826
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11f88
+	.4byte	0x11fa2
 	.uleb128 0x51
 	.string	"ptr"
 	.byte	0x1
@@ -42371,18 +42377,18 @@ __exitcall_ebc_exit:
 	.4byte	0x199
 	.4byte	.LLST205
 	.uleb128 0x4e
-	.8byte	.LVL896
-	.4byte	0x14516
+	.8byte	.LVL887
+	.4byte	0x14530
 	.uleb128 0x4e
-	.8byte	.LVL897
-	.4byte	0x14522
+	.8byte	.LVL888
+	.4byte	0x1453c
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL894
-	.4byte	0x1452f
+	.8byte	.LVL885
+	.4byte	0x14549
 	.uleb128 0x4e
-	.8byte	.LVL898
-	.4byte	0x1453b
+	.8byte	.LVL889
+	.4byte	0x14555
 	.byte	0
 	.byte	0
 	.uleb128 0x62
@@ -42424,18 +42430,18 @@ __exitcall_ebc_exit:
 	.4byte	0x199
 	.4byte	.LLST204
 	.uleb128 0x4e
-	.8byte	.LVL887
-	.4byte	0x14516
+	.8byte	.LVL880
+	.4byte	0x14530
 	.uleb128 0x4e
-	.8byte	.LVL888
-	.4byte	0x14522
+	.8byte	.LVL881
+	.4byte	0x1453c
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL885
-	.4byte	0x1452f
+	.8byte	.LVL878
+	.4byte	0x14549
 	.uleb128 0x4e
-	.8byte	.LVL889
-	.4byte	0x1453b
+	.8byte	.LVL882
+	.4byte	0x14555
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
@@ -42479,17 +42485,17 @@ __exitcall_ebc_exit:
 	.4byte	.LLST193
 	.uleb128 0x4e
 	.8byte	.LVL811
-	.4byte	0x14516
+	.4byte	0x14530
 	.uleb128 0x4e
 	.8byte	.LVL812
-	.4byte	0x14522
+	.4byte	0x1453c
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL809
-	.4byte	0x1452f
+	.4byte	0x14549
 	.uleb128 0x4e
 	.8byte	.LVL813
-	.4byte	0x1453b
+	.4byte	0x14555
 	.byte	0
 	.byte	0
 	.uleb128 0x62
@@ -42531,336 +42537,342 @@ __exitcall_ebc_exit:
 	.4byte	.LLST192
 	.uleb128 0x4e
 	.8byte	.LVL783
-	.4byte	0x14516
+	.4byte	0x14530
 	.uleb128 0x4e
 	.8byte	.LVL784
-	.4byte	0x14522
+	.4byte	0x1453c
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL781
-	.4byte	0x1452f
+	.4byte	0x14549
 	.uleb128 0x4e
 	.8byte	.LVL785
-	.4byte	0x1453b
+	.4byte	0x14555
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x11f88
+	.4byte	0x11fa2
 	.8byte	.LBB1800
 	.4byte	.Ldebug_ranges0+0x1000
 	.byte	0x1
 	.2byte	0x5ef
 	.4byte	0x11b46
 	.uleb128 0x54
-	.4byte	0x11fb1
+	.4byte	0x11fcb
 	.uleb128 0x54
-	.4byte	0x11fa5
+	.4byte	0x11fbf
 	.uleb128 0x54
-	.4byte	0x11f99
+	.4byte	0x11fb3
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x1000
 	.uleb128 0x57
-	.4byte	0x11fbd
+	.4byte	0x11fd7
 	.uleb128 0x57
-	.4byte	0x11fc7
+	.4byte	0x11fe1
 	.uleb128 0x57
-	.4byte	0x11fd3
+	.4byte	0x11fed
 	.uleb128 0x57
-	.4byte	0x11fdf
+	.4byte	0x11ff9
 	.uleb128 0x57
-	.4byte	0x11feb
+	.4byte	0x12005
 	.uleb128 0x57
-	.4byte	0x11ff7
+	.4byte	0x12011
 	.uleb128 0x73
-	.4byte	0x12003
+	.4byte	0x1201d
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12fee
+	.4byte	0x13008
 	.8byte	.LBB1809
 	.8byte	.LBE1809-.LBB1809
 	.byte	0x1
 	.2byte	0x653
 	.4byte	0x11b91
 	.uleb128 0x54
-	.4byte	0x13009
+	.4byte	0x13023
 	.uleb128 0x54
-	.4byte	0x12ffe
+	.4byte	0x13018
 	.uleb128 0x56
 	.8byte	.LBB1810
 	.8byte	.LBE1810-.LBB1810
 	.uleb128 0x57
-	.4byte	0x13014
+	.4byte	0x1302e
 	.uleb128 0x4e
 	.8byte	.LVL814
-	.4byte	0x1418c
+	.4byte	0x141a6
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x12c94
+	.4byte	0x12cae
 	.8byte	.LBB1811
 	.4byte	.Ldebug_ranges0+0x1040
 	.byte	0x1
 	.2byte	0x591
 	.4byte	0x11c57
 	.uleb128 0x54
-	.4byte	0x12cd1
+	.4byte	0x12ceb
 	.uleb128 0x54
-	.4byte	0x12cd1
+	.4byte	0x12ceb
 	.uleb128 0x54
-	.4byte	0x12cd1
+	.4byte	0x12ceb
 	.uleb128 0x54
-	.4byte	0x12cdd
+	.4byte	0x12cf7
 	.uleb128 0x54
-	.4byte	0x12cc5
+	.4byte	0x12cdf
 	.uleb128 0x54
-	.4byte	0x12cb9
+	.4byte	0x12cd3
 	.uleb128 0x54
-	.4byte	0x12cad
+	.4byte	0x12cc7
 	.uleb128 0x54
-	.4byte	0x12ca1
+	.4byte	0x12cbb
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x1040
 	.uleb128 0x57
-	.4byte	0x12ce9
+	.4byte	0x12d03
 	.uleb128 0x60
-	.4byte	0x12cf5
+	.4byte	0x12d0f
 	.4byte	.LLST194
 	.uleb128 0x57
-	.4byte	0x12d01
+	.4byte	0x12d1b
 	.uleb128 0x60
-	.4byte	0x12d0d
+	.4byte	0x12d27
 	.4byte	.LLST195
 	.uleb128 0x60
-	.4byte	0x12d19
+	.4byte	0x12d33
 	.4byte	.LLST196
 	.uleb128 0x57
-	.4byte	0x12d25
+	.4byte	0x12d3f
 	.uleb128 0x57
-	.4byte	0x12d31
+	.4byte	0x12d4b
 	.uleb128 0x57
-	.4byte	0x12d3d
+	.4byte	0x12d57
 	.uleb128 0x60
-	.4byte	0x12d49
+	.4byte	0x12d63
 	.4byte	.LLST197
 	.uleb128 0x57
-	.4byte	0x12d55
+	.4byte	0x12d6f
 	.uleb128 0x60
-	.4byte	0x12d61
+	.4byte	0x12d7b
 	.4byte	.LLST198
 	.uleb128 0x61
-	.4byte	0x12d6d
+	.4byte	0x12d87
 	.uleb128 0x1
 	.byte	0x5e
 	.uleb128 0x60
-	.4byte	0x12d77
+	.4byte	0x12d91
 	.4byte	.LLST199
 	.uleb128 0x60
-	.4byte	0x12d81
+	.4byte	0x12d9b
 	.4byte	.LLST200
 	.uleb128 0x60
-	.4byte	0x12d8d
+	.4byte	0x12da7
 	.4byte	.LLST201
 	.uleb128 0x60
-	.4byte	0x12d99
+	.4byte	0x12db3
 	.4byte	.LLST202
 	.uleb128 0x60
-	.4byte	0x12da5
+	.4byte	0x12dbf
 	.4byte	.LLST203
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12fee
+	.4byte	0x13008
 	.8byte	.LBB1831
 	.8byte	.LBE1831-.LBB1831
 	.byte	0x1
 	.2byte	0x538
 	.4byte	0x11ca2
 	.uleb128 0x54
-	.4byte	0x13009
+	.4byte	0x13023
 	.uleb128 0x54
-	.4byte	0x12ffe
+	.4byte	0x13018
 	.uleb128 0x56
 	.8byte	.LBB1832
 	.8byte	.LBE1832-.LBB1832
 	.uleb128 0x57
-	.4byte	0x13014
+	.4byte	0x1302e
 	.uleb128 0x4e
-	.8byte	.LVL903
-	.4byte	0x1418c
+	.8byte	.LVL902
+	.4byte	0x141a6
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL760
-	.4byte	0x1459e
+	.4byte	0x145b8
 	.uleb128 0x4e
 	.8byte	.LVL761
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL763
-	.4byte	0x143f1
+	.4byte	0x1440b
 	.uleb128 0x4e
 	.8byte	.LVL764
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL765
-	.4byte	0x145aa
+	.4byte	0x145c4
 	.uleb128 0x4e
 	.8byte	.LVL766
-	.4byte	0x1445f
+	.4byte	0x14479
 	.uleb128 0x4e
 	.8byte	.LVL767
-	.4byte	0x1445f
+	.4byte	0x14479
 	.uleb128 0x4e
 	.8byte	.LVL768
-	.4byte	0x145b6
+	.4byte	0x145d0
 	.uleb128 0x4e
 	.8byte	.LVL770
-	.4byte	0x145c2
+	.4byte	0x145dc
 	.uleb128 0x4e
 	.8byte	.LVL789
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL791
-	.4byte	0x145c2
+	.4byte	0x145dc
 	.uleb128 0x4e
 	.8byte	.LVL792
-	.4byte	0x14562
+	.4byte	0x1457c
 	.uleb128 0x4e
 	.8byte	.LVL796
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL799
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL800
-	.4byte	0x14453
+	.4byte	0x1446d
 	.uleb128 0x4e
 	.8byte	.LVL801
-	.4byte	0x145c2
+	.4byte	0x145dc
 	.uleb128 0x4e
 	.8byte	.LVL803
-	.4byte	0x14562
+	.4byte	0x1457c
 	.uleb128 0x4e
 	.8byte	.LVL806
-	.4byte	0x1200c
+	.4byte	0x12026
 	.uleb128 0x4e
 	.8byte	.LVL807
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL818
-	.4byte	0x145aa
+	.4byte	0x145c4
 	.uleb128 0x4e
 	.8byte	.LVL819
-	.4byte	0x1445f
+	.4byte	0x14479
 	.uleb128 0x4e
 	.8byte	.LVL820
-	.4byte	0x145c2
+	.4byte	0x145dc
 	.uleb128 0x4e
 	.8byte	.LVL821
-	.4byte	0x14562
+	.4byte	0x1457c
 	.uleb128 0x4e
 	.8byte	.LVL822
-	.4byte	0x12f09
+	.4byte	0x12f23
 	.uleb128 0x4e
 	.8byte	.LVL823
-	.4byte	0x145b6
+	.4byte	0x145d0
 	.uleb128 0x4e
 	.8byte	.LVL824
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL825
-	.4byte	0x123fa
+	.4byte	0x12414
 	.uleb128 0x4e
-	.8byte	.LVL844
-	.4byte	0x14314
+	.8byte	.LVL826
+	.4byte	0x145c4
 	.uleb128 0x4e
-	.8byte	.LVL845
-	.4byte	0x123fa
+	.8byte	.LVL827
+	.4byte	0x14479
 	.uleb128 0x4e
-	.8byte	.LVL846
-	.4byte	0x143f1
+	.8byte	.LVL828
+	.4byte	0x14479
 	.uleb128 0x4e
-	.8byte	.LVL849
-	.4byte	0x143f1
+	.8byte	.LVL829
+	.4byte	0x14479
 	.uleb128 0x4e
-	.8byte	.LVL851
-	.4byte	0x1424a
+	.8byte	.LVL848
+	.4byte	0x1432e
 	.uleb128 0x4e
-	.8byte	.LVL852
-	.4byte	0x1200c
+	.8byte	.LVL849
+	.4byte	0x12414
 	.uleb128 0x4e
-	.8byte	.LVL854
-	.4byte	0x14314
+	.8byte	.LVL850
+	.4byte	0x1440b
+	.uleb128 0x4e
+	.8byte	.LVL853
+	.4byte	0x1440b
 	.uleb128 0x4e
 	.8byte	.LVL855
-	.4byte	0x123fa
+	.4byte	0x14264
+	.uleb128 0x4e
+	.8byte	.LVL856
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL857
-	.4byte	0x14314
+	.4byte	0x145dc
 	.uleb128 0x4e
-	.8byte	.LVL860
-	.4byte	0x14314
+	.8byte	.LVL858
+	.4byte	0x1457c
+	.uleb128 0x4e
+	.8byte	.LVL859
+	.4byte	0x12026
 	.uleb128 0x4e
 	.8byte	.LVL861
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL862
-	.4byte	0x145c2
+	.4byte	0x12414
 	.uleb128 0x4e
-	.8byte	.LVL863
-	.4byte	0x14562
+	.8byte	.LVL864
+	.4byte	0x1432e
+	.uleb128 0x4e
+	.8byte	.LVL867
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL870
-	.4byte	0x1200c
+	.4byte	0x1432e
 	.uleb128 0x4e
-	.8byte	.LVL874
-	.4byte	0x14314
+	.8byte	.LVL871
+	.4byte	0x145e8
+	.uleb128 0x4e
+	.8byte	.LVL872
+	.4byte	0x1446d
 	.uleb128 0x4e
 	.8byte	.LVL875
-	.4byte	0x145ce
+	.4byte	0x145e8
 	.uleb128 0x4e
 	.8byte	.LVL876
-	.4byte	0x14453
-	.uleb128 0x4e
-	.8byte	.LVL877
-	.4byte	0x1445f
-	.uleb128 0x4e
-	.8byte	.LVL878
-	.4byte	0x1445f
-	.uleb128 0x4e
-	.8byte	.LVL879
-	.4byte	0x1445f
-	.uleb128 0x4e
-	.8byte	.LVL882
-	.4byte	0x145ce
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL883
-	.4byte	0x14314
+	.4byte	0x14479
 	.uleb128 0x4e
-	.8byte	.LVL891
-	.4byte	0x1424a
+	.8byte	.LVL896
+	.4byte	0x145d0
+	.uleb128 0x4e
+	.8byte	.LVL897
+	.4byte	0x12026
 	.uleb128 0x4e
 	.8byte	.LVL900
-	.4byte	0x1445f
+	.4byte	0x12e5c
 	.uleb128 0x4e
-	.8byte	.LVL901
-	.4byte	0x12e42
+	.8byte	.LVL904
+	.4byte	0x14264
 	.uleb128 0x4e
 	.8byte	.LVL905
-	.4byte	0x1424a
+	.4byte	0x12026
 	.uleb128 0x4e
 	.8byte	.LVL906
-	.4byte	0x1200c
-	.uleb128 0x4e
-	.8byte	.LVL907
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL908
-	.4byte	0x1424a
+	.4byte	0x14264
 	.uleb128 0x4e
 	.8byte	.LVL910
-	.4byte	0x144b5
+	.4byte	0x14264
+	.uleb128 0x4e
+	.8byte	.LVL912
+	.4byte	0x144cf
 	.byte	0
 	.uleb128 0x63
 	.4byte	.LASF3081
@@ -42868,7 +42880,7 @@ __exitcall_ebc_exit:
 	.2byte	0x514
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1200c
+	.4byte	0x12026
 	.uleb128 0x65
 	.4byte	.LASF3082
 	.byte	0x1
@@ -42928,7 +42940,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2824-.LFB2824
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12160
+	.4byte	0x1217a
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
@@ -42954,65 +42966,65 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x64
 	.uleb128 0x53
-	.4byte	0x13263
+	.4byte	0x1327d
 	.8byte	.LBB1218
 	.8byte	.LBE1218-.LBB1218
 	.byte	0x1
 	.2byte	0x4c0
-	.4byte	0x1208f
+	.4byte	0x120a9
 	.uleb128 0x54
-	.4byte	0x1327e
+	.4byte	0x13298
 	.uleb128 0x54
-	.4byte	0x13273
+	.4byte	0x1328d
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL278
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL279
-	.4byte	0x145da
+	.4byte	0x145f4
 	.uleb128 0x4e
 	.8byte	.LVL283
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL284
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL286
-	.4byte	0x145da
+	.4byte	0x145f4
 	.uleb128 0x4e
 	.8byte	.LVL287
-	.4byte	0x1438e
+	.4byte	0x143a8
 	.uleb128 0x4e
 	.8byte	.LVL288
-	.4byte	0x145da
+	.4byte	0x145f4
 	.uleb128 0x4e
 	.8byte	.LVL289
-	.4byte	0x145da
+	.4byte	0x145f4
 	.uleb128 0x4e
 	.8byte	.LVL290
-	.4byte	0x145da
+	.4byte	0x145f4
 	.uleb128 0x4e
 	.8byte	.LVL291
-	.4byte	0x145da
+	.4byte	0x145f4
 	.uleb128 0x4e
 	.8byte	.LVL292
-	.4byte	0x145da
+	.4byte	0x145f4
 	.uleb128 0x4e
 	.8byte	.LVL293
-	.4byte	0x145da
+	.4byte	0x145f4
 	.uleb128 0x4e
 	.8byte	.LVL294
-	.4byte	0x145da
+	.4byte	0x145f4
 	.uleb128 0x4e
 	.8byte	.LVL295
-	.4byte	0x145da
+	.4byte	0x145f4
 	.uleb128 0x4e
 	.8byte	.LVL296
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL297
-	.4byte	0x144b5
+	.4byte	0x144cf
 	.byte	0
 	.uleb128 0x4d
 	.4byte	.LASF3093
@@ -43022,7 +43034,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2823-.LFB2823
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12219
+	.4byte	0x12233
 	.uleb128 0x46
 	.4byte	.LASF2959
 	.byte	0x1
@@ -43035,34 +43047,34 @@ __exitcall_ebc_exit:
 	.4byte	0xe160
 	.uleb128 0x4e
 	.8byte	.LVL261
-	.4byte	0x143bf
+	.4byte	0x143d9
 	.uleb128 0x4e
 	.8byte	.LVL262
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL263
-	.4byte	0x14453
+	.4byte	0x1446d
 	.uleb128 0x4e
 	.8byte	.LVL264
-	.4byte	0x14453
+	.4byte	0x1446d
 	.uleb128 0x4e
 	.8byte	.LVL265
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL266
-	.4byte	0x14378
+	.4byte	0x14392
 	.uleb128 0x4e
 	.8byte	.LVL267
-	.4byte	0x143f1
+	.4byte	0x1440b
 	.uleb128 0x4e
 	.8byte	.LVL268
-	.4byte	0x14453
+	.4byte	0x1446d
 	.uleb128 0x4e
 	.8byte	.LVL269
-	.4byte	0x14453
+	.4byte	0x1446d
 	.uleb128 0x4e
 	.8byte	.LVL270
-	.4byte	0x143bf
+	.4byte	0x143d9
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3094
@@ -43073,7 +43085,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x123ea
+	.4byte	0x12404
 	.uleb128 0x58
 	.4byte	.LASF794
 	.byte	0x1
@@ -43099,12 +43111,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe763
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0xb30
-	.4byte	0x12303
+	.4byte	0x1231d
 	.uleb128 0x3f
 	.byte	0x8
 	.byte	0x1
 	.2byte	0x457
-	.4byte	0x1229c
+	.4byte	0x122b6
 	.uleb128 0x41
 	.4byte	.LASF3095
 	.byte	0x1
@@ -43114,29 +43126,29 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x1
 	.2byte	0x457
-	.4byte	0x123ea
+	.4byte	0x12404
 	.byte	0
 	.uleb128 0x52
 	.string	"__u"
 	.byte	0x1
 	.2byte	0x457
-	.4byte	0x1227a
+	.4byte	0x12294
 	.uleb128 0x5b
-	.4byte	0x13a9b
+	.4byte	0x13ab5
 	.8byte	.LBB1402
 	.4byte	.Ldebug_ranges0+0xb70
 	.byte	0x1
 	.2byte	0x457
-	.4byte	0x122d0
+	.4byte	0x122ea
 	.uleb128 0x54
-	.4byte	0x13abe
+	.4byte	0x13ad8
 	.uleb128 0x54
-	.4byte	0x13ab2
+	.4byte	0x13acc
 	.uleb128 0x54
-	.4byte	0x13aa8
+	.4byte	0x13ac2
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x138a5
+	.4byte	0x138bf
 	.8byte	.LBB1405
 	.8byte	.LBE1405-.LBB1405
 	.byte	0x1
@@ -43145,76 +43157,76 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1406
 	.8byte	.LBE1406-.LBB1406
 	.uleb128 0x61
-	.4byte	0x138b5
+	.4byte	0x138cf
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x1373f
+	.4byte	0x13759
 	.8byte	.LBB1410
 	.4byte	.Ldebug_ranges0+0xba0
 	.byte	0x1
 	.2byte	0x48b
-	.4byte	0x1235a
+	.4byte	0x12374
 	.uleb128 0x54
-	.4byte	0x13750
+	.4byte	0x1376a
 	.uleb128 0x5f
-	.4byte	0x1375d
+	.4byte	0x13777
 	.8byte	.LBB1412
 	.4byte	.Ldebug_ranges0+0xbd0
 	.byte	0xd
 	.2byte	0x240
 	.uleb128 0x54
-	.4byte	0x13779
+	.4byte	0x13793
 	.uleb128 0x54
-	.4byte	0x1376e
+	.4byte	0x13788
 	.uleb128 0x4e
 	.8byte	.LVL495
-	.4byte	0x145e6
+	.4byte	0x14600
 	.uleb128 0x4e
 	.8byte	.LVL500
-	.4byte	0x145e6
+	.4byte	0x14600
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL488
-	.4byte	0x14089
+	.4byte	0x140a3
 	.uleb128 0x4e
 	.8byte	.LVL489
-	.4byte	0x12b39
+	.4byte	0x12b53
 	.uleb128 0x4e
 	.8byte	.LVL490
-	.4byte	0x145f3
+	.4byte	0x1460d
 	.uleb128 0x4e
 	.8byte	.LVL491
-	.4byte	0x14516
+	.4byte	0x14530
 	.uleb128 0x4e
 	.8byte	.LVL492
-	.4byte	0x145fd
+	.4byte	0x14617
 	.uleb128 0x4e
 	.8byte	.LVL493
-	.4byte	0x14089
+	.4byte	0x140a3
 	.uleb128 0x4e
 	.8byte	.LVL494
-	.4byte	0x12604
+	.4byte	0x1261e
 	.uleb128 0x4e
 	.8byte	.LVL496
-	.4byte	0x14089
+	.4byte	0x140a3
 	.uleb128 0x4e
 	.8byte	.LVL497
-	.4byte	0x127ee
+	.4byte	0x12808
 	.uleb128 0x4e
 	.8byte	.LVL498
-	.4byte	0x14089
+	.4byte	0x140a3
 	.uleb128 0x4e
 	.8byte	.LVL499
-	.4byte	0x129d8
+	.4byte	0x129f2
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x123fa
+	.4byte	0x12414
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
@@ -43227,7 +43239,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2821-.LFB2821
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x125a6
+	.4byte	0x125c0
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
@@ -43251,102 +43263,102 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	__func__.34774
 	.uleb128 0x53
-	.4byte	0x125a6
+	.4byte	0x125c0
 	.8byte	.LBB1393
 	.8byte	.LBE1393-.LBB1393
 	.byte	0x1
 	.2byte	0x433
-	.4byte	0x12487
+	.4byte	0x124a1
 	.uleb128 0x54
-	.4byte	0x125bf
+	.4byte	0x125d9
 	.uleb128 0x54
-	.4byte	0x125b3
+	.4byte	0x125cd
 	.uleb128 0x4e
 	.8byte	.LVL460
-	.4byte	0x14089
+	.4byte	0x140a3
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x125a6
+	.4byte	0x125c0
 	.8byte	.LBB1395
 	.8byte	.LBE1395-.LBB1395
 	.byte	0x1
 	.2byte	0x419
-	.4byte	0x124bb
+	.4byte	0x124d5
 	.uleb128 0x54
-	.4byte	0x125bf
+	.4byte	0x125d9
 	.uleb128 0x54
-	.4byte	0x125b3
+	.4byte	0x125cd
 	.uleb128 0x4e
 	.8byte	.LVL465
-	.4byte	0x14089
+	.4byte	0x140a3
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x125a6
+	.4byte	0x125c0
 	.8byte	.LBB1397
 	.8byte	.LBE1397-.LBB1397
 	.byte	0x1
 	.2byte	0x407
-	.4byte	0x124ef
+	.4byte	0x12509
 	.uleb128 0x54
-	.4byte	0x125bf
+	.4byte	0x125d9
 	.uleb128 0x54
-	.4byte	0x125b3
+	.4byte	0x125cd
 	.uleb128 0x4e
 	.8byte	.LVL470
-	.4byte	0x14089
+	.4byte	0x140a3
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x125a6
+	.4byte	0x125c0
 	.8byte	.LBB1399
 	.8byte	.LBE1399-.LBB1399
 	.byte	0x1
 	.2byte	0x440
-	.4byte	0x12523
+	.4byte	0x1253d
 	.uleb128 0x54
-	.4byte	0x125bf
+	.4byte	0x125d9
 	.uleb128 0x54
-	.4byte	0x125b3
+	.4byte	0x125cd
 	.uleb128 0x4e
 	.8byte	.LVL475
-	.4byte	0x14089
+	.4byte	0x140a3
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL459
-	.4byte	0x12604
+	.4byte	0x1261e
 	.uleb128 0x4e
 	.8byte	.LVL461
-	.4byte	0x12604
+	.4byte	0x1261e
 	.uleb128 0x4e
 	.8byte	.LVL464
-	.4byte	0x12b39
+	.4byte	0x12b53
 	.uleb128 0x4e
 	.8byte	.LVL466
-	.4byte	0x12b39
+	.4byte	0x12b53
 	.uleb128 0x4e
 	.8byte	.LVL469
-	.4byte	0x129d8
+	.4byte	0x129f2
 	.uleb128 0x4e
 	.8byte	.LVL471
-	.4byte	0x129d8
+	.4byte	0x129f2
 	.uleb128 0x4e
 	.8byte	.LVL474
-	.4byte	0x127ee
+	.4byte	0x12808
 	.uleb128 0x4e
 	.8byte	.LVL476
-	.4byte	0x127ee
+	.4byte	0x12808
 	.uleb128 0x4e
 	.8byte	.LVL479
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL482
-	.4byte	0x14314
+	.4byte	0x1432e
 	.byte	0
 	.uleb128 0x66
 	.4byte	.LASF3098
 	.byte	0x1
 	.2byte	0x3f4
 	.byte	0x1
-	.4byte	0x125cc
+	.4byte	0x125e6
 	.uleb128 0x65
 	.4byte	.LASF3000
 	.byte	0x1
@@ -43363,7 +43375,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x3e9
 	.byte	0x1
-	.4byte	0x125fe
+	.4byte	0x12618
 	.uleb128 0x65
 	.4byte	.LASF3000
 	.byte	0x1
@@ -43378,7 +43390,7 @@ __exitcall_ebc_exit:
 	.string	"buf"
 	.byte	0x1
 	.2byte	0x3eb
-	.4byte	0x125fe
+	.4byte	0x12618
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -43388,7 +43400,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x3df
 	.byte	0x1
-	.4byte	0x12642
+	.4byte	0x1265c
 	.uleb128 0x65
 	.4byte	.LASF3101
 	.byte	0x1
@@ -43415,7 +43427,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x3b5
 	.byte	0x1
-	.4byte	0x12718
+	.4byte	0x12732
 	.uleb128 0x65
 	.4byte	.LASF3101
 	.byte	0x1
@@ -43507,7 +43519,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x38c
 	.byte	0x1
-	.4byte	0x127ee
+	.4byte	0x12808
 	.uleb128 0x65
 	.4byte	.LASF3101
 	.byte	0x1
@@ -43599,7 +43611,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x381
 	.byte	0x1
-	.4byte	0x1282c
+	.4byte	0x12846
 	.uleb128 0x65
 	.4byte	.LASF3101
 	.byte	0x1
@@ -43626,7 +43638,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x35d
 	.byte	0x1
-	.4byte	0x12902
+	.4byte	0x1291c
 	.uleb128 0x65
 	.4byte	.LASF3101
 	.byte	0x1
@@ -43718,7 +43730,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x336
 	.byte	0x1
-	.4byte	0x129d8
+	.4byte	0x129f2
 	.uleb128 0x65
 	.4byte	.LASF3101
 	.byte	0x1
@@ -43813,7 +43825,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2812-.LFB2812
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12b39
+	.4byte	0x12b53
 	.uleb128 0x6a
 	.4byte	.LASF3101
 	.byte	0x1
@@ -43969,7 +43981,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2811-.LFB2811
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12c94
+	.4byte	0x12cae
 	.uleb128 0x6a
 	.4byte	.LASF3101
 	.byte	0x1
@@ -44117,7 +44129,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x164
 	.byte	0x1
-	.4byte	0x12db2
+	.4byte	0x12dcc
 	.uleb128 0x65
 	.4byte	.LASF3125
 	.byte	0x1
@@ -44242,7 +44254,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2809-.LFB2809
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12e42
+	.4byte	0x12e5c
 	.uleb128 0x58
 	.4byte	.LASF2274
 	.byte	0x1
@@ -44263,19 +44275,19 @@ __exitcall_ebc_exit:
 	.4byte	.LLST185
 	.uleb128 0x4e
 	.8byte	.LVL745
-	.4byte	0x145aa
+	.4byte	0x145c4
 	.uleb128 0x4e
 	.8byte	.LVL747
-	.4byte	0x12f09
+	.4byte	0x12f23
 	.uleb128 0x4e
 	.8byte	.LVL748
-	.4byte	0x145b6
+	.4byte	0x145d0
 	.uleb128 0x4e
 	.8byte	.LVL751
-	.4byte	0x12e42
+	.4byte	0x12e5c
 	.uleb128 0x4e
 	.8byte	.LVL752
-	.4byte	0x145b6
+	.4byte	0x145d0
 	.byte	0
 	.uleb128 0x74
 	.4byte	.LASF3136
@@ -44285,7 +44297,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2808-.LFB2808
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12f09
+	.4byte	0x12f23
 	.uleb128 0x6a
 	.4byte	.LASF3125
 	.byte	0x1
@@ -44371,7 +44383,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2807-.LFB2807
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12fee
+	.4byte	0x13008
 	.uleb128 0x76
 	.4byte	.LASF3125
 	.byte	0x1
@@ -44474,7 +44486,7 @@ __exitcall_ebc_exit:
 	.byte	0xb4
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x13020
+	.4byte	0x1303a
 	.uleb128 0x7d
 	.string	"ebc"
 	.byte	0x1
@@ -44497,7 +44509,7 @@ __exitcall_ebc_exit:
 	.byte	0x86
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x13068
+	.4byte	0x13082
 	.uleb128 0x7e
 	.4byte	.LASF2857
 	.byte	0x1
@@ -44530,7 +44542,7 @@ __exitcall_ebc_exit:
 	.byte	0x80
 	.4byte	0x110
 	.byte	0x3
-	.4byte	0x1309a
+	.4byte	0x130b4
 	.uleb128 0x7e
 	.4byte	.LASF2857
 	.byte	0x1
@@ -44552,7 +44564,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x130bd
+	.4byte	0x130d7
 	.uleb128 0x7e
 	.4byte	.LASF2934
 	.byte	0xb
@@ -44569,7 +44581,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x130eb
+	.4byte	0x13105
 	.uleb128 0x7e
 	.4byte	.LASF2934
 	.byte	0xb
@@ -44591,7 +44603,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x1312f
+	.4byte	0x13149
 	.uleb128 0x7e
 	.4byte	.LASF2934
 	.byte	0xb
@@ -44623,7 +44635,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x13147
+	.4byte	0x13161
 	.uleb128 0x7e
 	.4byte	.LASF2934
 	.byte	0xb
@@ -44636,7 +44648,7 @@ __exitcall_ebc_exit:
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1316e
+	.4byte	0x13188
 	.uleb128 0x7e
 	.4byte	.LASF2934
 	.byte	0xb
@@ -44653,7 +44665,7 @@ __exitcall_ebc_exit:
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x131b8
+	.4byte	0x131d2
 	.uleb128 0x64
 	.string	"dev"
 	.byte	0xa
@@ -44686,7 +44698,7 @@ __exitcall_ebc_exit:
 	.2byte	0x108
 	.4byte	0xb7b9
 	.byte	0x3
-	.4byte	0x131d6
+	.4byte	0x131f0
 	.uleb128 0x64
 	.string	"dev"
 	.byte	0xa
@@ -44699,7 +44711,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.4byte	0xb7b9
 	.byte	0x3
-	.4byte	0x131f2
+	.4byte	0x1320c
 	.uleb128 0x7d
 	.string	"bus"
 	.byte	0xc8
@@ -44712,7 +44724,7 @@ __exitcall_ebc_exit:
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1320e
+	.4byte	0x13228
 	.uleb128 0x7e
 	.4byte	.LASF3158
 	.byte	0xa
@@ -44724,7 +44736,7 @@ __exitcall_ebc_exit:
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x13247
+	.4byte	0x13261
 	.uleb128 0x7d
 	.string	"dev"
 	.byte	0xcb
@@ -44752,7 +44764,7 @@ __exitcall_ebc_exit:
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13263
+	.4byte	0x1327d
 	.uleb128 0x7e
 	.4byte	.LASF2935
 	.byte	0x3
@@ -44765,7 +44777,7 @@ __exitcall_ebc_exit:
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13288
+	.4byte	0x132a2
 	.uleb128 0x7e
 	.4byte	.LASF2935
 	.byte	0x3
@@ -44782,7 +44794,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x132a0
+	.4byte	0x132ba
 	.uleb128 0x7e
 	.4byte	.LASF2935
 	.byte	0x3
@@ -44794,7 +44806,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x132b8
+	.4byte	0x132d2
 	.uleb128 0x7e
 	.4byte	.LASF2935
 	.byte	0x3
@@ -44806,7 +44818,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x132d0
+	.4byte	0x132ea
 	.uleb128 0x7e
 	.4byte	.LASF2935
 	.byte	0x3
@@ -44818,7 +44830,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x132e8
+	.4byte	0x13302
 	.uleb128 0x7e
 	.4byte	.LASF2935
 	.byte	0x3
@@ -44830,12 +44842,12 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x13300
+	.4byte	0x1331a
 	.uleb128 0x7e
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x13300
+	.4byte	0x1331a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -44845,24 +44857,24 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x1331e
+	.4byte	0x13338
 	.uleb128 0x7e
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x13300
+	.4byte	0x1331a
 	.byte	0
 	.uleb128 0x7f
 	.4byte	.LASF3169
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x13356
+	.4byte	0x13370
 	.uleb128 0x7e
 	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x13300
+	.4byte	0x1331a
 	.uleb128 0x7e
 	.4byte	.LASF193
 	.byte	0x4
@@ -44885,7 +44897,7 @@ __exitcall_ebc_exit:
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13385
+	.4byte	0x1339f
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -44908,7 +44920,7 @@ __exitcall_ebc_exit:
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x133b4
+	.4byte	0x133ce
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -44931,7 +44943,7 @@ __exitcall_ebc_exit:
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x133e3
+	.4byte	0x133fd
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -44954,7 +44966,7 @@ __exitcall_ebc_exit:
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1341d
+	.4byte	0x13437
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -44982,7 +44994,7 @@ __exitcall_ebc_exit:
 	.byte	0xf5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x13451
+	.4byte	0x1346b
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0x6
@@ -45007,7 +45019,7 @@ __exitcall_ebc_exit:
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1349b
+	.4byte	0x134b5
 	.uleb128 0x7e
 	.4byte	.LASF1150
 	.byte	0x6
@@ -45042,7 +45054,7 @@ __exitcall_ebc_exit:
 	.2byte	0x2e5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x134c5
+	.4byte	0x134df
 	.uleb128 0x65
 	.4byte	.LASF987
 	.byte	0x12
@@ -45060,7 +45072,7 @@ __exitcall_ebc_exit:
 	.2byte	0x216
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x134fd
+	.4byte	0x13517
 	.uleb128 0x65
 	.4byte	.LASF987
 	.byte	0x12
@@ -45085,7 +45097,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1dd
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x13533
+	.4byte	0x1354d
 	.uleb128 0x65
 	.4byte	.LASF987
 	.byte	0x12
@@ -45108,7 +45120,7 @@ __exitcall_ebc_exit:
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x13551
+	.4byte	0x1356b
 	.uleb128 0x65
 	.4byte	.LASF987
 	.byte	0x12
@@ -45121,7 +45133,7 @@ __exitcall_ebc_exit:
 	.2byte	0x13d
 	.4byte	0xd7a3
 	.byte	0x3
-	.4byte	0x1356f
+	.4byte	0x13589
 	.uleb128 0x65
 	.4byte	.LASF171
 	.byte	0x12
@@ -45133,7 +45145,7 @@ __exitcall_ebc_exit:
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x13592
+	.4byte	0x135ac
 	.uleb128 0x7e
 	.4byte	.LASF3028
 	.byte	0xbe
@@ -45151,12 +45163,12 @@ __exitcall_ebc_exit:
 	.byte	0xd6
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x135ae
+	.4byte	0x135c8
 	.uleb128 0x7e
 	.4byte	.LASF3028
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x135ae
+	.4byte	0x135c8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -45167,12 +45179,12 @@ __exitcall_ebc_exit:
 	.2byte	0x164
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x135d2
+	.4byte	0x135ec
 	.uleb128 0x64
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x135d2
+	.4byte	0x135ec
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -45183,7 +45195,7 @@ __exitcall_ebc_exit:
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1360d
+	.4byte	0x13627
 	.uleb128 0x64
 	.string	"np"
 	.byte	0xe
@@ -45206,7 +45218,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13659
+	.4byte	0x13673
 	.uleb128 0x64
 	.string	"np"
 	.byte	0xe
@@ -45238,7 +45250,7 @@ __exitcall_ebc_exit:
 	.byte	0xe
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x13671
+	.4byte	0x1368b
 	.uleb128 0x7e
 	.4byte	.LASF868
 	.byte	0xe
@@ -45250,7 +45262,7 @@ __exitcall_ebc_exit:
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x13697
+	.4byte	0x136b1
 	.uleb128 0x64
 	.string	"dev"
 	.byte	0x2
@@ -45268,7 +45280,7 @@ __exitcall_ebc_exit:
 	.2byte	0x49b
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x136b5
+	.4byte	0x136cf
 	.uleb128 0x64
 	.string	"dev"
 	.byte	0x2
@@ -45281,7 +45293,7 @@ __exitcall_ebc_exit:
 	.2byte	0x2c5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x136eb
+	.4byte	0x13705
 	.uleb128 0x64
 	.string	"dev"
 	.byte	0x2
@@ -45304,7 +45316,7 @@ __exitcall_ebc_exit:
 	.byte	0xca
 	.4byte	0x351
 	.byte	0x3
-	.4byte	0x13707
+	.4byte	0x13721
 	.uleb128 0x7d
 	.string	"res"
 	.byte	0xf
@@ -45317,7 +45329,7 @@ __exitcall_ebc_exit:
 	.byte	0x22
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x13723
+	.4byte	0x1373d
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xcc
@@ -45330,7 +45342,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1373f
+	.4byte	0x13759
 	.uleb128 0x7e
 	.4byte	.LASF987
 	.byte	0xcd
@@ -45343,7 +45355,7 @@ __exitcall_ebc_exit:
 	.2byte	0x23e
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x1375d
+	.4byte	0x13777
 	.uleb128 0x65
 	.4byte	.LASF2274
 	.byte	0xd
@@ -45356,7 +45368,7 @@ __exitcall_ebc_exit:
 	.2byte	0x203
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x13786
+	.4byte	0x137a0
 	.uleb128 0x64
 	.string	"wq"
 	.byte	0xd
@@ -45373,7 +45385,7 @@ __exitcall_ebc_exit:
 	.byte	0xd
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x137a9
+	.4byte	0x137c3
 	.uleb128 0x7e
 	.4byte	.LASF2274
 	.byte	0xd
@@ -45391,7 +45403,7 @@ __exitcall_ebc_exit:
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x137c5
+	.4byte	0x137df
 	.uleb128 0x64
 	.string	"m"
 	.byte	0x51
@@ -45404,7 +45416,7 @@ __exitcall_ebc_exit:
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x137e1
+	.4byte	0x137fb
 	.uleb128 0x64
 	.string	"m"
 	.byte	0x51
@@ -45417,7 +45429,7 @@ __exitcall_ebc_exit:
 	.byte	0x97
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x1381d
+	.4byte	0x13837
 	.uleb128 0x7e
 	.4byte	.LASF1150
 	.byte	0xca
@@ -45444,7 +45456,7 @@ __exitcall_ebc_exit:
 	.byte	0xca
 	.byte	0x91
 	.byte	0x3
-	.4byte	0x1384d
+	.4byte	0x13867
 	.uleb128 0x7e
 	.4byte	.LASF987
 	.byte	0xca
@@ -45468,7 +45480,7 @@ __exitcall_ebc_exit:
 	.byte	0xca
 	.byte	0x80
 	.byte	0x3
-	.4byte	0x13879
+	.4byte	0x13893
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xca
@@ -45491,12 +45503,12 @@ __exitcall_ebc_exit:
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1389f
+	.4byte	0x138b9
 	.uleb128 0x7d
 	.string	"ti"
 	.byte	0xca
 	.byte	0x5f
-	.4byte	0x1389f
+	.4byte	0x138b9
 	.uleb128 0x7e
 	.4byte	.LASF3214
 	.byte	0xca
@@ -45512,7 +45524,7 @@ __exitcall_ebc_exit:
 	.byte	0xf
 	.4byte	0x2f05
 	.byte	0x3
-	.4byte	0x138c1
+	.4byte	0x138db
 	.uleb128 0x78
 	.4byte	.LASF3216
 	.byte	0x5
@@ -45524,7 +45536,7 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x13905
+	.4byte	0x1391f
 	.uleb128 0x7e
 	.4byte	.LASF962
 	.byte	0x10
@@ -45535,7 +45547,7 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x138f8
+	.4byte	0x13912
 	.uleb128 0x22
 	.4byte	.LASF3095
 	.byte	0x10
@@ -45545,13 +45557,13 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x123ea
+	.4byte	0x12404
 	.byte	0
 	.uleb128 0x7b
 	.string	"__u"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x138d9
+	.4byte	0x138f3
 	.byte	0
 	.byte	0
 	.uleb128 0x80
@@ -45565,7 +45577,7 @@ __exitcall_ebc_exit:
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13929
+	.4byte	0x13943
 	.uleb128 0x7d
 	.string	"n"
 	.byte	0xce
@@ -45578,7 +45590,7 @@ __exitcall_ebc_exit:
 	.byte	0x9a
 	.4byte	0xe2
 	.byte	0x3
-	.4byte	0x1395b
+	.4byte	0x13975
 	.uleb128 0x7e
 	.4byte	.LASF2456
 	.byte	0x8
@@ -45601,7 +45613,7 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x13975
+	.4byte	0x1398f
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xcf
@@ -45614,12 +45626,12 @@ __exitcall_ebc_exit:
 	.byte	0xb8
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x1398f
+	.4byte	0x139a9
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd0
 	.byte	0xb8
-	.4byte	0x1398f
+	.4byte	0x139a9
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -45630,7 +45642,7 @@ __exitcall_ebc_exit:
 	.byte	0x39
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x139b1
+	.4byte	0x139cb
 	.uleb128 0x7d
 	.string	"val"
 	.byte	0xd0
@@ -45643,7 +45655,7 @@ __exitcall_ebc_exit:
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x139d7
+	.4byte	0x139f1
 	.uleb128 0x7d
 	.string	"nr"
 	.byte	0x7
@@ -45653,7 +45665,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF1150
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x139d7
+	.4byte	0x139f1
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -45663,7 +45675,7 @@ __exitcall_ebc_exit:
 	.byte	0x11
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x13a10
+	.4byte	0x13a2a
 	.uleb128 0x7d
 	.string	"i"
 	.byte	0x11
@@ -45673,7 +45685,7 @@ __exitcall_ebc_exit:
 	.string	"v"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13a10
+	.4byte	0x13a2a
 	.uleb128 0x7b
 	.string	"w0"
 	.byte	0x11
@@ -45683,7 +45695,7 @@ __exitcall_ebc_exit:
 	.string	"x1"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13a10
+	.4byte	0x13a2a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -45694,7 +45706,7 @@ __exitcall_ebc_exit:
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13a30
+	.4byte	0x13a4a
 	.uleb128 0x7d
 	.string	"x"
 	.byte	0xd1
@@ -45707,7 +45719,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13a4c
+	.4byte	0x13a66
 	.uleb128 0x7e
 	.4byte	.LASF2489
 	.byte	0xd2
@@ -45719,12 +45731,12 @@ __exitcall_ebc_exit:
 	.byte	0xd3
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x13a6d
+	.4byte	0x13a87
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd3
 	.byte	0xb
-	.4byte	0x13a6d
+	.4byte	0x13a87
 	.uleb128 0x7e
 	.4byte	.LASF987
 	.byte	0xd3
@@ -45733,21 +45745,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x13a75
+	.4byte	0x13a8f
 	.uleb128 0x81
 	.uleb128 0x3
-	.4byte	0x13a73
+	.4byte	0x13a8d
 	.uleb128 0x7f
 	.4byte	.LASF3228
 	.byte	0xd3
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x13a9b
+	.4byte	0x13ab5
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd3
 	.byte	0x9
-	.4byte	0x13a6d
+	.4byte	0x13a87
 	.uleb128 0x7e
 	.4byte	.LASF987
 	.byte	0xd3
@@ -45759,12 +45771,12 @@ __exitcall_ebc_exit:
 	.byte	0xc
 	.2byte	0x11a
 	.byte	0x3
-	.4byte	0x13acb
+	.4byte	0x13ae5
 	.uleb128 0x64
 	.string	"p"
 	.byte	0xc
 	.2byte	0x11a
-	.4byte	0x13acb
+	.4byte	0x13ae5
 	.uleb128 0x64
 	.string	"res"
 	.byte	0xc
@@ -45778,418 +45790,418 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x13a73
+	.4byte	0x13a8d
 	.uleb128 0x82
-	.4byte	0x127ee
+	.4byte	0x12808
 	.8byte	.LFB2815
 	.8byte	.LFE2815-.LFB2815
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13d54
+	.4byte	0x13d6e
 	.uleb128 0x71
-	.4byte	0x127fb
+	.4byte	0x12815
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x12807
+	.4byte	0x12821
 	.4byte	.LLST102
 	.uleb128 0x6f
-	.4byte	0x12813
+	.4byte	0x1282d
 	.4byte	.LLST103
 	.uleb128 0x6f
-	.4byte	0x1281f
+	.4byte	0x12839
 	.4byte	.LLST104
 	.uleb128 0x53
-	.4byte	0x1282c
+	.4byte	0x12846
 	.8byte	.LBB1244
 	.8byte	.LBE1244-.LBB1244
 	.byte	0x1
 	.2byte	0x388
-	.4byte	0x13c09
+	.4byte	0x13c23
 	.uleb128 0x54
-	.4byte	0x1285d
+	.4byte	0x12877
 	.uleb128 0x54
-	.4byte	0x1285d
+	.4byte	0x12877
 	.uleb128 0x54
-	.4byte	0x1285d
+	.4byte	0x12877
 	.uleb128 0x54
-	.4byte	0x12851
+	.4byte	0x1286b
 	.uleb128 0x54
-	.4byte	0x12845
+	.4byte	0x1285f
 	.uleb128 0x54
-	.4byte	0x12839
+	.4byte	0x12853
 	.uleb128 0x56
 	.8byte	.LBB1245
 	.8byte	.LBE1245-.LBB1245
 	.uleb128 0x57
-	.4byte	0x12869
+	.4byte	0x12883
 	.uleb128 0x60
-	.4byte	0x12875
+	.4byte	0x1288f
 	.4byte	.LLST105
 	.uleb128 0x57
-	.4byte	0x1287f
+	.4byte	0x12899
 	.uleb128 0x60
-	.4byte	0x12889
+	.4byte	0x128a3
 	.4byte	.LLST106
 	.uleb128 0x60
-	.4byte	0x12895
+	.4byte	0x128af
 	.4byte	.LLST107
 	.uleb128 0x60
-	.4byte	0x128a1
+	.4byte	0x128bb
 	.4byte	.LLST108
 	.uleb128 0x57
-	.4byte	0x128ad
+	.4byte	0x128c7
 	.uleb128 0x61
-	.4byte	0x128b9
+	.4byte	0x128d3
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x61
-	.4byte	0x128c5
+	.4byte	0x128df
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x60
-	.4byte	0x128d1
+	.4byte	0x128eb
 	.4byte	.LLST109
 	.uleb128 0x60
-	.4byte	0x128dd
+	.4byte	0x128f7
 	.4byte	.LLST110
 	.uleb128 0x60
-	.4byte	0x128e9
+	.4byte	0x12903
 	.4byte	.LLST111
 	.uleb128 0x57
-	.4byte	0x128f5
+	.4byte	0x1290f
 	.uleb128 0x5b
-	.4byte	0x13068
+	.4byte	0x13082
 	.8byte	.LBB1246
 	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
 	.2byte	0x37b
-	.4byte	0x13be3
+	.4byte	0x13bfd
 	.uleb128 0x54
-	.4byte	0x1308e
+	.4byte	0x130a8
 	.uleb128 0x54
-	.4byte	0x13083
+	.4byte	0x1309d
 	.uleb128 0x54
-	.4byte	0x13078
+	.4byte	0x13092
 	.byte	0
 	.uleb128 0x5f
-	.4byte	0x13068
+	.4byte	0x13082
 	.8byte	.LBB1253
 	.4byte	.Ldebug_ranges0+0x730
 	.byte	0x1
 	.2byte	0x37c
 	.uleb128 0x54
-	.4byte	0x1308e
+	.4byte	0x130a8
 	.uleb128 0x54
-	.4byte	0x13083
+	.4byte	0x1309d
 	.uleb128 0x54
-	.4byte	0x13078
+	.4byte	0x13092
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x780
 	.uleb128 0x54
-	.4byte	0x1281f
+	.4byte	0x12839
 	.uleb128 0x54
-	.4byte	0x12813
+	.4byte	0x1282d
 	.uleb128 0x54
-	.4byte	0x12807
+	.4byte	0x12821
 	.uleb128 0x54
-	.4byte	0x127fb
+	.4byte	0x12815
 	.uleb128 0x5f
-	.4byte	0x12902
+	.4byte	0x1291c
 	.8byte	.LBB1265
 	.4byte	.Ldebug_ranges0+0x780
 	.byte	0x1
 	.2byte	0x386
 	.uleb128 0x54
-	.4byte	0x12933
+	.4byte	0x1294d
 	.uleb128 0x54
-	.4byte	0x12933
+	.4byte	0x1294d
 	.uleb128 0x54
-	.4byte	0x12933
+	.4byte	0x1294d
 	.uleb128 0x54
-	.4byte	0x12927
+	.4byte	0x12941
 	.uleb128 0x54
-	.4byte	0x1291b
+	.4byte	0x12935
 	.uleb128 0x54
-	.4byte	0x1290f
+	.4byte	0x12929
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x780
 	.uleb128 0x57
-	.4byte	0x1293f
+	.4byte	0x12959
 	.uleb128 0x61
-	.4byte	0x1294b
+	.4byte	0x12965
 	.uleb128 0x1
 	.byte	0x5c
 	.uleb128 0x57
-	.4byte	0x12955
+	.4byte	0x1296f
 	.uleb128 0x61
-	.4byte	0x1295f
+	.4byte	0x12979
 	.uleb128 0x1
 	.byte	0x5f
 	.uleb128 0x57
-	.4byte	0x1296b
+	.4byte	0x12985
 	.uleb128 0x60
-	.4byte	0x12977
+	.4byte	0x12991
 	.4byte	.LLST112
 	.uleb128 0x60
-	.4byte	0x12983
+	.4byte	0x1299d
 	.4byte	.LLST113
 	.uleb128 0x61
-	.4byte	0x1298f
+	.4byte	0x129a9
 	.uleb128 0x1
 	.byte	0x59
 	.uleb128 0x61
-	.4byte	0x1299b
+	.4byte	0x129b5
 	.uleb128 0x1
 	.byte	0x5a
 	.uleb128 0x60
-	.4byte	0x129a7
+	.4byte	0x129c1
 	.4byte	.LLST114
 	.uleb128 0x60
-	.4byte	0x129b3
+	.4byte	0x129cd
 	.4byte	.LLST115
 	.uleb128 0x61
-	.4byte	0x129bf
+	.4byte	0x129d9
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x57
-	.4byte	0x129cb
+	.4byte	0x129e5
 	.uleb128 0x5b
-	.4byte	0x13068
+	.4byte	0x13082
 	.8byte	.LBB1267
 	.4byte	.Ldebug_ranges0+0x7c0
 	.byte	0x1
 	.2byte	0x354
-	.4byte	0x13cdc
+	.4byte	0x13cf6
 	.uleb128 0x54
-	.4byte	0x1308e
+	.4byte	0x130a8
 	.uleb128 0x54
-	.4byte	0x13083
+	.4byte	0x1309d
 	.uleb128 0x54
-	.4byte	0x13078
+	.4byte	0x13092
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13068
+	.4byte	0x13082
 	.8byte	.LBB1272
 	.4byte	.Ldebug_ranges0+0x810
 	.byte	0x1
 	.2byte	0x355
-	.4byte	0x13d04
+	.4byte	0x13d1e
 	.uleb128 0x54
-	.4byte	0x1308e
+	.4byte	0x130a8
 	.uleb128 0x54
-	.4byte	0x13083
+	.4byte	0x1309d
 	.uleb128 0x54
-	.4byte	0x13078
+	.4byte	0x13092
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13068
+	.4byte	0x13082
 	.8byte	.LBB1284
 	.4byte	.Ldebug_ranges0+0x880
 	.byte	0x1
 	.2byte	0x356
-	.4byte	0x13d2c
+	.4byte	0x13d46
 	.uleb128 0x54
-	.4byte	0x1308e
+	.4byte	0x130a8
 	.uleb128 0x54
-	.4byte	0x13083
+	.4byte	0x1309d
 	.uleb128 0x54
-	.4byte	0x13078
+	.4byte	0x13092
 	.byte	0
 	.uleb128 0x5f
-	.4byte	0x13068
+	.4byte	0x13082
 	.8byte	.LBB1296
 	.4byte	.Ldebug_ranges0+0x8f0
 	.byte	0x1
 	.2byte	0x357
 	.uleb128 0x54
-	.4byte	0x1308e
+	.4byte	0x130a8
 	.uleb128 0x54
-	.4byte	0x13083
+	.4byte	0x1309d
 	.uleb128 0x54
-	.4byte	0x13078
+	.4byte	0x13092
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x82
-	.4byte	0x12604
+	.4byte	0x1261e
 	.8byte	.LFB2818
 	.8byte	.LFE2818-.LFB2818
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14089
+	.4byte	0x140a3
 	.uleb128 0x71
-	.4byte	0x12611
+	.4byte	0x1262b
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x1261d
+	.4byte	0x12637
 	.4byte	.LLST116
 	.uleb128 0x6f
-	.4byte	0x12629
+	.4byte	0x12643
 	.4byte	.LLST117
 	.uleb128 0x6f
-	.4byte	0x12635
+	.4byte	0x1264f
 	.4byte	.LLST118
 	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x940
-	.4byte	0x13f6e
+	.4byte	0x13f88
 	.uleb128 0x54
-	.4byte	0x12635
+	.4byte	0x1264f
 	.uleb128 0x54
-	.4byte	0x12629
+	.4byte	0x12643
 	.uleb128 0x54
-	.4byte	0x1261d
+	.4byte	0x12637
 	.uleb128 0x54
-	.4byte	0x12611
+	.4byte	0x1262b
 	.uleb128 0x5f
-	.4byte	0x12642
+	.4byte	0x1265c
 	.8byte	.LBB1332
 	.4byte	.Ldebug_ranges0+0x940
 	.byte	0x1
 	.2byte	0x3e4
 	.uleb128 0x54
-	.4byte	0x12673
+	.4byte	0x1268d
 	.uleb128 0x54
-	.4byte	0x12673
+	.4byte	0x1268d
 	.uleb128 0x54
-	.4byte	0x12673
+	.4byte	0x1268d
 	.uleb128 0x54
-	.4byte	0x12667
+	.4byte	0x12681
 	.uleb128 0x54
-	.4byte	0x1265b
+	.4byte	0x12675
 	.uleb128 0x54
-	.4byte	0x1264f
+	.4byte	0x12669
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x940
 	.uleb128 0x57
-	.4byte	0x1267f
+	.4byte	0x12699
 	.uleb128 0x60
-	.4byte	0x1268b
+	.4byte	0x126a5
 	.4byte	.LLST119
 	.uleb128 0x60
-	.4byte	0x12697
+	.4byte	0x126b1
 	.4byte	.LLST120
 	.uleb128 0x60
-	.4byte	0x126a3
+	.4byte	0x126bd
 	.4byte	.LLST121
 	.uleb128 0x60
-	.4byte	0x126af
+	.4byte	0x126c9
 	.4byte	.LLST122
 	.uleb128 0x60
-	.4byte	0x126bb
+	.4byte	0x126d5
 	.4byte	.LLST123
 	.uleb128 0x60
-	.4byte	0x126c7
+	.4byte	0x126e1
 	.4byte	.LLST124
 	.uleb128 0x60
-	.4byte	0x126d3
+	.4byte	0x126ed
 	.4byte	.LLST125
 	.uleb128 0x60
-	.4byte	0x126df
+	.4byte	0x126f9
 	.4byte	.LLST126
 	.uleb128 0x57
-	.4byte	0x126e9
+	.4byte	0x12703
 	.uleb128 0x60
-	.4byte	0x126f3
+	.4byte	0x1270d
 	.4byte	.LLST127
 	.uleb128 0x60
-	.4byte	0x126ff
+	.4byte	0x12719
 	.4byte	.LLST128
 	.uleb128 0x57
-	.4byte	0x1270b
+	.4byte	0x12725
 	.uleb128 0x5b
-	.4byte	0x13020
+	.4byte	0x1303a
 	.8byte	.LBB1334
 	.4byte	.Ldebug_ranges0+0x970
 	.byte	0x1
 	.2byte	0x3d5
-	.4byte	0x13e8b
+	.4byte	0x13ea5
 	.uleb128 0x54
-	.4byte	0x13046
+	.4byte	0x13060
 	.uleb128 0x54
-	.4byte	0x1303b
+	.4byte	0x13055
 	.uleb128 0x54
-	.4byte	0x13030
+	.4byte	0x1304a
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x970
 	.uleb128 0x57
-	.4byte	0x13051
+	.4byte	0x1306b
 	.uleb128 0x60
-	.4byte	0x1305c
+	.4byte	0x13076
 	.4byte	.LLST129
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13020
+	.4byte	0x1303a
 	.8byte	.LBB1337
 	.8byte	.LBE1337-.LBB1337
 	.byte	0x1
 	.2byte	0x3d2
-	.4byte	0x13ed7
+	.4byte	0x13ef1
 	.uleb128 0x54
-	.4byte	0x13046
+	.4byte	0x13060
 	.uleb128 0x54
-	.4byte	0x1303b
+	.4byte	0x13055
 	.uleb128 0x54
-	.4byte	0x13030
+	.4byte	0x1304a
 	.uleb128 0x56
 	.8byte	.LBB1338
 	.8byte	.LBE1338-.LBB1338
 	.uleb128 0x57
-	.4byte	0x13051
+	.4byte	0x1306b
 	.uleb128 0x60
-	.4byte	0x1305c
+	.4byte	0x13076
 	.4byte	.LLST130
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13020
+	.4byte	0x1303a
 	.8byte	.LBB1339
 	.8byte	.LBE1339-.LBB1339
 	.byte	0x1
 	.2byte	0x3d3
-	.4byte	0x13f23
+	.4byte	0x13f3d
 	.uleb128 0x54
-	.4byte	0x13046
+	.4byte	0x13060
 	.uleb128 0x54
-	.4byte	0x1303b
+	.4byte	0x13055
 	.uleb128 0x54
-	.4byte	0x13030
+	.4byte	0x1304a
 	.uleb128 0x56
 	.8byte	.LBB1340
 	.8byte	.LBE1340-.LBB1340
 	.uleb128 0x57
-	.4byte	0x13051
+	.4byte	0x1306b
 	.uleb128 0x60
-	.4byte	0x1305c
+	.4byte	0x13076
 	.4byte	.LLST131
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13020
+	.4byte	0x1303a
 	.8byte	.LBB1341
 	.8byte	.LBE1341-.LBB1341
 	.byte	0x1
 	.2byte	0x3d4
 	.uleb128 0x54
-	.4byte	0x13046
+	.4byte	0x13060
 	.uleb128 0x54
-	.4byte	0x1303b
+	.4byte	0x13055
 	.uleb128 0x54
-	.4byte	0x13030
+	.4byte	0x1304a
 	.uleb128 0x56
 	.8byte	.LBB1342
 	.8byte	.LBE1342-.LBB1342
 	.uleb128 0x57
-	.4byte	0x13051
+	.4byte	0x1306b
 	.uleb128 0x60
-	.4byte	0x1305c
+	.4byte	0x13076
 	.4byte	.LLST132
 	.byte	0
 	.byte	0
@@ -46197,102 +46209,102 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x12718
+	.4byte	0x12732
 	.8byte	.LBB1346
 	.8byte	.LBE1346-.LBB1346
 	.byte	0x1
 	.2byte	0x3e6
 	.uleb128 0x54
-	.4byte	0x12749
+	.4byte	0x12763
 	.uleb128 0x54
-	.4byte	0x12749
+	.4byte	0x12763
 	.uleb128 0x54
-	.4byte	0x12749
+	.4byte	0x12763
 	.uleb128 0x54
-	.4byte	0x1273d
+	.4byte	0x12757
 	.uleb128 0x54
-	.4byte	0x12731
+	.4byte	0x1274b
 	.uleb128 0x54
-	.4byte	0x12725
+	.4byte	0x1273f
 	.uleb128 0x56
 	.8byte	.LBB1347
 	.8byte	.LBE1347-.LBB1347
 	.uleb128 0x57
-	.4byte	0x12755
+	.4byte	0x1276f
 	.uleb128 0x57
-	.4byte	0x12761
+	.4byte	0x1277b
 	.uleb128 0x57
-	.4byte	0x1276d
+	.4byte	0x12787
 	.uleb128 0x61
-	.4byte	0x12779
+	.4byte	0x12793
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x61
-	.4byte	0x12785
+	.4byte	0x1279f
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x60
-	.4byte	0x12791
+	.4byte	0x127ab
 	.4byte	.LLST133
 	.uleb128 0x60
-	.4byte	0x1279d
+	.4byte	0x127b7
 	.4byte	.LLST134
 	.uleb128 0x60
-	.4byte	0x127a9
+	.4byte	0x127c3
 	.4byte	.LLST135
 	.uleb128 0x60
-	.4byte	0x127b5
+	.4byte	0x127cf
 	.4byte	.LLST136
 	.uleb128 0x57
-	.4byte	0x127bf
+	.4byte	0x127d9
 	.uleb128 0x60
-	.4byte	0x127c9
+	.4byte	0x127e3
 	.4byte	.LLST137
 	.uleb128 0x60
-	.4byte	0x127d5
+	.4byte	0x127ef
 	.4byte	.LLST138
 	.uleb128 0x57
-	.4byte	0x127e1
+	.4byte	0x127fb
 	.uleb128 0x5b
-	.4byte	0x13020
+	.4byte	0x1303a
 	.8byte	.LBB1348
 	.4byte	.Ldebug_ranges0+0x9a0
 	.byte	0x1
 	.2byte	0x3aa
-	.4byte	0x1404e
+	.4byte	0x14068
 	.uleb128 0x54
-	.4byte	0x13046
+	.4byte	0x13060
 	.uleb128 0x54
-	.4byte	0x1303b
+	.4byte	0x13055
 	.uleb128 0x54
-	.4byte	0x13030
+	.4byte	0x1304a
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x9a0
 	.uleb128 0x57
-	.4byte	0x13051
+	.4byte	0x1306b
 	.uleb128 0x60
-	.4byte	0x1305c
+	.4byte	0x13076
 	.4byte	.LLST139
 	.byte	0
 	.byte	0
 	.uleb128 0x5f
-	.4byte	0x13020
+	.4byte	0x1303a
 	.8byte	.LBB1355
 	.4byte	.Ldebug_ranges0+0xa10
 	.byte	0x1
 	.2byte	0x3a9
 	.uleb128 0x54
-	.4byte	0x13046
+	.4byte	0x13060
 	.uleb128 0x54
-	.4byte	0x1303b
+	.4byte	0x13055
 	.uleb128 0x54
-	.4byte	0x13030
+	.4byte	0x1304a
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xa10
 	.uleb128 0x57
-	.4byte	0x13051
+	.4byte	0x1306b
 	.uleb128 0x60
-	.4byte	0x1305c
+	.4byte	0x13076
 	.4byte	.LLST140
 	.byte	0
 	.byte	0
@@ -46300,200 +46312,200 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x125cc
+	.4byte	0x125e6
 	.8byte	.LFB2861
 	.8byte	.LFE2861-.LFB2861
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1418c
+	.4byte	0x141a6
 	.uleb128 0x6f
-	.4byte	0x125d9
+	.4byte	0x125f3
 	.4byte	.LLST141
 	.uleb128 0x54
-	.4byte	0x125e5
+	.4byte	0x125ff
 	.uleb128 0x57
-	.4byte	0x125f1
+	.4byte	0x1260b
 	.uleb128 0x5b
-	.4byte	0x1316e
+	.4byte	0x13188
 	.8byte	.LBB1371
 	.4byte	.Ldebug_ranges0+0xa70
 	.byte	0x1
 	.2byte	0x3ed
-	.4byte	0x1410a
+	.4byte	0x14124
 	.uleb128 0x54
-	.4byte	0x1319f
+	.4byte	0x131b9
 	.uleb128 0x54
-	.4byte	0x13193
+	.4byte	0x131ad
 	.uleb128 0x54
-	.4byte	0x13187
+	.4byte	0x131a1
 	.uleb128 0x54
-	.4byte	0x1317b
+	.4byte	0x13195
 	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xa70
 	.uleb128 0x57
-	.4byte	0x131ab
+	.4byte	0x131c5
 	.uleb128 0x5f
-	.4byte	0x131b8
+	.4byte	0x131d2
 	.8byte	.LBB1373
 	.4byte	.Ldebug_ranges0+0xac0
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x54
-	.4byte	0x131c9
+	.4byte	0x131e3
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x130eb
+	.4byte	0x13105
 	.8byte	.LBB1382
 	.4byte	.Ldebug_ranges0+0xaf0
 	.byte	0x1
 	.2byte	0x3ee
-	.4byte	0x1413c
+	.4byte	0x14156
 	.uleb128 0x54
-	.4byte	0x13123
+	.4byte	0x1313d
 	.uleb128 0x54
-	.4byte	0x13118
+	.4byte	0x13132
 	.uleb128 0x54
-	.4byte	0x1310d
+	.4byte	0x13127
 	.uleb128 0x54
-	.4byte	0x13102
+	.4byte	0x1311c
 	.uleb128 0x54
-	.4byte	0x130f7
+	.4byte	0x13111
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x130bd
+	.4byte	0x130d7
 	.8byte	.LBB1388
 	.8byte	.LBE1388-.LBB1388
 	.byte	0x1
 	.2byte	0x3ef
-	.4byte	0x14168
+	.4byte	0x14182
 	.uleb128 0x54
-	.4byte	0x130df
+	.4byte	0x130f9
 	.uleb128 0x54
-	.4byte	0x130d4
+	.4byte	0x130ee
 	.uleb128 0x54
-	.4byte	0x130c9
+	.4byte	0x130e3
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x1309a
+	.4byte	0x130b4
 	.8byte	.LBB1390
 	.8byte	.LBE1390-.LBB1390
 	.byte	0x1
 	.2byte	0x3f0
 	.uleb128 0x54
-	.4byte	0x130b1
+	.4byte	0x130cb
 	.uleb128 0x54
-	.4byte	0x130a6
+	.4byte	0x130c0
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12fee
+	.4byte	0x13008
 	.8byte	.LFB2862
 	.8byte	.LFE2862-.LFB2862
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1424a
+	.4byte	0x14264
 	.uleb128 0x6f
-	.4byte	0x12ffe
+	.4byte	0x13018
 	.4byte	.LLST144
 	.uleb128 0x6f
-	.4byte	0x13009
+	.4byte	0x13023
 	.4byte	.LLST145
 	.uleb128 0x57
-	.4byte	0x13014
+	.4byte	0x1302e
 	.uleb128 0x70
-	.4byte	0x1312f
+	.4byte	0x13149
 	.8byte	.LBB1418
 	.8byte	.LBE1418-.LBB1418
 	.byte	0x1
 	.byte	0xc6
-	.4byte	0x141e0
+	.4byte	0x141fa
 	.uleb128 0x54
-	.4byte	0x1313b
+	.4byte	0x13155
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x132b8
+	.4byte	0x132d2
 	.8byte	.LBB1420
 	.8byte	.LBE1420-.LBB1420
 	.byte	0x1
 	.byte	0xc7
-	.4byte	0x14201
+	.4byte	0x1421b
 	.uleb128 0x54
-	.4byte	0x132c4
+	.4byte	0x132de
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x132e8
+	.4byte	0x13302
 	.8byte	.LBB1422
 	.8byte	.LBE1422-.LBB1422
 	.byte	0x1
 	.byte	0xca
-	.4byte	0x1422f
+	.4byte	0x14249
 	.uleb128 0x54
-	.4byte	0x132f4
+	.4byte	0x1330e
 	.uleb128 0x4e
 	.8byte	.LVL509
-	.4byte	0x14592
+	.4byte	0x145ac
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL506
-	.4byte	0x14314
+	.4byte	0x1432e
 	.uleb128 0x4e
 	.8byte	.LVL510
-	.4byte	0x14314
+	.4byte	0x1432e
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12fee
+	.4byte	0x13008
 	.8byte	.LFB2866
 	.8byte	.LFE2866-.LFB2866
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x142fc
+	.4byte	0x14316
 	.uleb128 0x6f
-	.4byte	0x12ffe
+	.4byte	0x13018
 	.4byte	.LLST172
 	.uleb128 0x57
-	.4byte	0x13014
+	.4byte	0x1302e
 	.uleb128 0x54
-	.4byte	0x13009
+	.4byte	0x13023
 	.uleb128 0x70
-	.4byte	0x132d0
+	.4byte	0x132ea
 	.8byte	.LBB1763
 	.8byte	.LBE1763-.LBB1763
 	.byte	0x1
 	.byte	0xbf
-	.4byte	0x1429a
+	.4byte	0x142b4
 	.uleb128 0x54
-	.4byte	0x132dc
+	.4byte	0x132f6
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13147
+	.4byte	0x13161
 	.8byte	.LBB1765
 	.8byte	.LBE1765-.LBB1765
 	.byte	0x1
 	.byte	0xc0
-	.4byte	0x142c0
+	.4byte	0x142da
 	.uleb128 0x54
-	.4byte	0x13162
+	.4byte	0x1317c
 	.uleb128 0x54
-	.4byte	0x13157
+	.4byte	0x13171
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13306
+	.4byte	0x13320
 	.8byte	.LBB1767
 	.8byte	.LBE1767-.LBB1767
 	.byte	0x1
 	.byte	0xbc
-	.4byte	0x142ee
+	.4byte	0x14308
 	.uleb128 0x54
-	.4byte	0x13312
+	.4byte	0x1332c
 	.uleb128 0x4e
 	.8byte	.LVL708
-	.4byte	0x14609
+	.4byte	0x14623
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL705
-	.4byte	0x14314
+	.4byte	0x1432e
 	.byte	0
 	.uleb128 0x84
 	.4byte	.LASF3230
@@ -50205,14 +50217,14 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL816
-	.8byte	.LVL880
+	.8byte	.LVL873
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL880
-	.8byte	.LVL881
+	.8byte	.LVL873
+	.8byte	.LVL874
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL881
+	.8byte	.LVL874
 	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x6c
@@ -50227,8 +50239,8 @@ __exitcall_ebc_exit:
 	.8byte	.LVL806-1
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL850
-	.8byte	.LVL851-1
+	.8byte	.LVL854
+	.8byte	.LVL855-1
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
@@ -50250,23 +50262,19 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	.LVL775
-	.8byte	.LVL831
-	.2byte	0x1
-	.byte	0x6a
 	.8byte	.LVL835
-	.8byte	.LVL838
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL843
-	.8byte	.LVL864
+	.8byte	.LVL839
+	.8byte	.LVL842
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL869
-	.8byte	.LVL871
+	.8byte	.LVL847
+	.8byte	.LVL884
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL872
-	.8byte	.LVL893
+	.8byte	.LVL895
+	.8byte	.LVL898
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	.LVL899
@@ -50276,23 +50284,23 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	0
 .LLST205:
-	.8byte	.LVL858
-	.8byte	.LVL859
+	.8byte	.LVL865
+	.8byte	.LVL866
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL895
-	.8byte	.LVL896-1
+	.8byte	.LVL886
+	.8byte	.LVL887-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST204:
-	.8byte	.LVL847
-	.8byte	.LVL848
+	.8byte	.LVL851
+	.8byte	.LVL852
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL886
-	.8byte	.LVL887-1
+	.8byte	.LVL879
+	.8byte	.LVL880-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -50324,47 +50332,35 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	0
 .LLST194:
-	.8byte	.LVL769
-	.8byte	.LVL770-1
-	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL797
-	.8byte	.LVL799-1
-	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL826
-	.8byte	.LVL843
-	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL864
-	.8byte	.LVL870-1
+	.8byte	.LVL830
+	.8byte	.LVL847
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL871
-	.8byte	.LVL874-1
+	.8byte	.LVL890
+	.8byte	.LVL896-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL890
-	.8byte	.LVL891-1
+	.8byte	.LVL898
+	.8byte	.LVL899
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST195:
-	.8byte	.LVL831
-	.8byte	.LVL834
+	.8byte	.LVL835
+	.8byte	.LVL838
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL840
-	.8byte	.LVL843
+	.8byte	.LVL844
+	.8byte	.LVL847
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL864
-	.8byte	.LVL867
+	.8byte	.LVL890
+	.8byte	.LVL893
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL871
-	.8byte	.LVL872
+	.8byte	.LVL898
+	.8byte	.LVL899
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
@@ -50402,249 +50398,161 @@ __exitcall_ebc_exit:
 	.8byte	.LVL817
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL830
-	.8byte	.LVL831
+	.8byte	.LVL834
+	.8byte	.LVL835
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL833
-	.8byte	.LVL839
+	.8byte	.LVL837
+	.8byte	.LVL843
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL853
-	.8byte	.LVL856
+	.8byte	.LVL860
+	.8byte	.LVL863
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL866
-	.8byte	.LVL871
+	.8byte	.LVL868
+	.8byte	.LVL869
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL872
 	.8byte	.LVL873
+	.8byte	.LVL877
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL880
-	.8byte	.LVL884
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL890
 	.8byte	.LVL892
+	.8byte	.LVL898
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL902
-	.8byte	.LVL904
+	.8byte	.LVL901
+	.8byte	.LVL903
 	.2byte	0x1
 	.byte	0x69
+	.8byte	.LVL907
 	.8byte	.LVL909
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL911
 	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
 .LLST197:
-	.8byte	.LVL769
-	.8byte	.LVL770-1
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL797
-	.8byte	.LVL799-1
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL830
-	.8byte	.LVL832
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL833
-	.8byte	.LVL843
+	.8byte	.LVL834
+	.8byte	.LVL836
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL864
-	.8byte	.LVL865
+	.8byte	.LVL837
+	.8byte	.LVL847
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL869
-	.8byte	.LVL870-1
+	.8byte	.LVL890
+	.8byte	.LVL891
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL871
-	.8byte	.LVL874-1
+	.8byte	.LVL895
+	.8byte	.LVL896-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL890
-	.8byte	.LVL891-1
+	.8byte	.LVL898
+	.8byte	.LVL899
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST198:
-	.8byte	.LVL769
-	.8byte	.LVL770-1
-	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL797
-	.8byte	.LVL799-1
-	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL830
-	.8byte	.LVL841
-	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL842
-	.8byte	.LVL843
+	.8byte	.LVL834
+	.8byte	.LVL845
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL864
-	.8byte	.LVL870-1
+	.8byte	.LVL846
+	.8byte	.LVL847
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL871
-	.8byte	.LVL874-1
+	.8byte	.LVL890
+	.8byte	.LVL896-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL890
-	.8byte	.LVL891-1
+	.8byte	.LVL898
+	.8byte	.LVL899
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
 .LLST199:
-	.8byte	.LVL769
-	.8byte	.LVL770-1
-	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL797
-	.8byte	.LVL799-1
-	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL830
-	.8byte	.LVL831
-	.2byte	0x1
-	.byte	0x54
 	.8byte	.LVL834
-	.8byte	.LVL836
+	.8byte	.LVL835
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL836
-	.8byte	.LVL837
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL868
-	.8byte	.LVL870-1
+	.8byte	.LVL838
+	.8byte	.LVL840
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL872
-	.8byte	.LVL874-1
+	.8byte	.LVL840
+	.8byte	.LVL841
 	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL890
-	.8byte	.LVL891-1
+	.byte	0x50
+	.8byte	.LVL894
+	.8byte	.LVL896-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST200:
-	.8byte	.LVL769
-	.8byte	.LVL770-1
-	.2byte	0x1
-	.byte	0x5f
-	.8byte	.LVL797
-	.8byte	.LVL799-1
-	.2byte	0x1
-	.byte	0x5f
-	.8byte	.LVL829
-	.8byte	.LVL843
-	.2byte	0x1
-	.byte	0x5f
-	.8byte	.LVL864
-	.8byte	.LVL870-1
+	.8byte	.LVL833
+	.8byte	.LVL847
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL871
-	.8byte	.LVL874-1
+	.8byte	.LVL890
+	.8byte	.LVL896-1
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL890
-	.8byte	.LVL891-1
+	.8byte	.LVL898
+	.8byte	.LVL899
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
 .LLST201:
-	.8byte	.LVL769
-	.8byte	.LVL770-1
-	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL797
-	.8byte	.LVL799-1
-	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL827
-	.8byte	.LVL843
-	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL864
-	.8byte	.LVL870-1
+	.8byte	.LVL831
+	.8byte	.LVL847
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL871
-	.8byte	.LVL874-1
+	.8byte	.LVL890
+	.8byte	.LVL896-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL890
-	.8byte	.LVL891-1
+	.8byte	.LVL898
+	.8byte	.LVL899
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
 .LLST202:
-	.8byte	.LVL769
-	.8byte	.LVL770-1
-	.2byte	0x1
-	.byte	0x5e
-	.8byte	.LVL797
-	.8byte	.LVL799-1
-	.2byte	0x1
-	.byte	0x5e
-	.8byte	.LVL829
-	.8byte	.LVL843
-	.2byte	0x1
-	.byte	0x5e
-	.8byte	.LVL864
-	.8byte	.LVL870-1
+	.8byte	.LVL833
+	.8byte	.LVL847
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL871
-	.8byte	.LVL874-1
+	.8byte	.LVL890
+	.8byte	.LVL896-1
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL890
-	.8byte	.LVL891-1
+	.8byte	.LVL898
+	.8byte	.LVL899
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
 .LLST203:
-	.8byte	.LVL769
-	.8byte	.LVL770-1
-	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL797
-	.8byte	.LVL799-1
-	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL828
-	.8byte	.LVL843
-	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL864
-	.8byte	.LVL870-1
+	.8byte	.LVL832
+	.8byte	.LVL847
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL871
-	.8byte	.LVL874-1
+	.8byte	.LVL890
+	.8byte	.LVL896-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL890
-	.8byte	.LVL891-1
+	.8byte	.LVL898
+	.8byte	.LVL899
 	.2byte	0x1
 	.byte	0x61
 	.8byte	0
@@ -52115,16 +52023,16 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1817
 	.8byte	.LBB1818
 	.8byte	.LBE1818
-	.8byte	.LBB1827
-	.8byte	.LBE1827
-	.8byte	.LBB1828
-	.8byte	.LBE1828
+	.8byte	.LBB1829
+	.8byte	.LBE1829
+	.8byte	.LBB1830
+	.8byte	.LBE1830
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1819
 	.8byte	.LBE1819
-	.8byte	.LBB1829
-	.8byte	.LBE1829
+	.8byte	.LBB1827
+	.8byte	.LBE1827
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1821
@@ -52135,8 +52043,8 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	.LBB1823
 	.8byte	.LBE1823
-	.8byte	.LBB1830
-	.8byte	.LBE1830
+	.8byte	.LBB1828
+	.8byte	.LBE1828
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1825

commit 57c7a7ae08e3eb3a7f9a4eb1dd3e01a47b571f5d
Author: Weixin Zhou <zwx@rock-chips.com>
Date:   Mon Sep 13 11:43:56 2021 +0800

    regulator: xz3216: add mode setting support
    
    Signed-off-by: Weixin Zhou <zwx@rock-chips.com>
    Change-Id: I523b87bbf33a63d794cec7b99d443388f3a36f96

diff --git a/drivers/regulator/xz3216.c b/drivers/regulator/xz3216.c
index 309ef56acfd9..eff6ad48caa0 100644
--- a/drivers/regulator/xz3216.c
+++ b/drivers/regulator/xz3216.c
@@ -93,6 +93,12 @@ struct xz3216_board {
 	unsigned int sleep_vsel_id;
 };
 
+static unsigned int xz3216_map_mode(unsigned int mode)
+{
+	return mode == REGULATOR_MODE_FAST ?
+		REGULATOR_MODE_FAST : REGULATOR_MODE_NORMAL;
+}
+
 static unsigned int xz3216_dcdc_get_mode(struct regulator_dev *dev)
 {
 	struct xz3216 *xz3216 = rdev_get_drvdata(dev);
@@ -353,6 +359,8 @@ static struct xz3216_board *xz3216_parse_dt(struct xz3216 *xz3216)
 	regs = of_find_node_by_name(xz3216_np, "regulators");
 	if (!regs)
 		return NULL;
+
+	xz3216_reg_matches[0].desc = &xz3216->desc;
 	count = of_regulator_match(xz3216->dev, regs, xz3216_reg_matches,
 				   XZ3216_NUM_REGULATORS);
 	of_node_put(regs);
@@ -394,6 +402,7 @@ static int xz3216_i2c_probe(struct i2c_client *i2c,
 		}
 	}
 
+	xz3216->desc.of_map_mode = xz3216_map_mode;
 	xz3216->regmap = devm_regmap_init_i2c(i2c, &xz3216_regmap_config);
 	if (IS_ERR(xz3216->regmap)) {
 		dev_err(&i2c->dev, "Failed to allocate regmap!\n");

commit cc34f814c9b05405581383b0d3cc02315bfa8702
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Fri Sep 10 17:14:08 2021 +0800

    clk: rockchip: rk3308: Call rockchip_soc_id_init() on init
    
    clk init on time_init() which is before pure_initcall.
    So call rockchip_soc_id_init() before call soc_is_rk3308b().
    
    Change-Id: Iece3673bc7309ef9193df99f2a95e4b930613a3e
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>

diff --git a/drivers/clk/rockchip/clk-rk3308.c b/drivers/clk/rockchip/clk-rk3308.c
index 30687d412a29..d36dfcf2e6cd 100644
--- a/drivers/clk/rockchip/clk-rk3308.c
+++ b/drivers/clk/rockchip/clk-rk3308.c
@@ -1011,6 +1011,7 @@ static void __init rk3308_clk_init(struct device_node *np)
 				   RK3308_GRF_SOC_STATUS0);
 	rockchip_clk_register_branches(ctx, rk3308_clk_branches,
 				       ARRAY_SIZE(rk3308_clk_branches));
+	rockchip_soc_id_init();
 	if (soc_is_rk3308b())
 		rockchip_clk_register_branches(ctx, rk3308b_dclk_vop_frac,
 					       ARRAY_SIZE(rk3308b_dclk_vop_frac));

commit f5542b312ada4ade984a8cbca292c4e16622ba23
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Fri Sep 10 17:09:31 2021 +0800

    soc: rockchip: cpuinfo: Export rockchip_soc_id_init() function
    
    Allow rockchip_soc_id_init() called before pure_initcall.
    
    Change-Id: Ie0d3a18e96df02c2d6ab4aa3e17ea102685cd0c4
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>

diff --git a/drivers/soc/rockchip/rockchip-cpuinfo.c b/drivers/soc/rockchip/rockchip-cpuinfo.c
index 33a80295971b..d34bf5153131 100644
--- a/drivers/soc/rockchip/rockchip-cpuinfo.c
+++ b/drivers/soc/rockchip/rockchip-cpuinfo.c
@@ -192,8 +192,11 @@ static void rk3568_init(void)
 	rk356x_set_cpu_version();
 }
 
-static int __init rockchip_soc_id_init(void)
+int __init rockchip_soc_id_init(void)
 {
+	if (rockchip_soc_id)
+		return 0;
+
 	if (cpu_is_rk3288()) {
 		rk3288_init();
 	} else if (cpu_is_rk312x()) {
diff --git a/include/linux/rockchip/cpu.h b/include/linux/rockchip/cpu.h
index 727a2d621745..33a1db1f8e5f 100644
--- a/include/linux/rockchip/cpu.h
+++ b/include/linux/rockchip/cpu.h
@@ -54,6 +54,9 @@ static inline void rockchip_set_cpu(unsigned long code)
 	rockchip_soc_id &= ~ROCKCHIP_CPU_MASK;
 	rockchip_soc_id |= (code << ROCKCHIP_CPU_SHIFT) & ROCKCHIP_CPU_MASK;
 }
+
+int rockchip_soc_id_init(void);
+
 #else
 
 #define rockchip_soc_id 0
@@ -70,6 +73,12 @@ static inline void rockchip_set_cpu_version(unsigned long ver)
 static inline void rockchip_set_cpu(unsigned long code)
 {
 }
+
+static inline int rockchip_soc_id_init(void)
+{
+	return 0;
+}
+
 #endif
 
 #if defined(CONFIG_CPU_RV1126) || defined(CONFIG_CPU_RV1109)

commit d3f9f648470ba83e0dac36327cae3a533f79a961
Author: Wang Panzhenzhuan <randy.wang@rock-chips.com>
Date:   Mon Sep 6 11:36:02 2021 +0800

    media: i2c: add camera driver hm5040
    
    Signed-off-by: Wang Panzhenzhuan <randy.wang@rock-chips.com>
    Change-Id: Icaaf459fe4ee87c88405be079b15d203ec7bb4f1

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index 26464579c6e4..f8c0921f10dd 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -1925,6 +1925,18 @@ config VIDEO_HYNIX_HI846
 	  To compile this driver as a module, choose M here: the
 	  module will be called hynix_hi846.
 
+config VIDEO_HM5040
+	tristate "Himax HM5040 sensor support"
+	depends on VIDEO_V4L2 && I2C && MEDIA_CONTROLLER
+	depends on MEDIA_CAMERA_SUPPORT
+	select V4L2_FWNODE
+	help
+	  This is a Video4Linux2 sensor driver for the Hynix
+	  HM5040 camera.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called hm5040.
+
 comment "Flash devices"
 
 config VIDEO_ADP1653
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index dd1f8121460f..3e40b2f3bd89 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -205,6 +205,7 @@ obj-$(CONFIG_VIDEO_SC8220)	+= sc8220.o
 obj-$(CONFIG_VIDEO_SP250A)	+= sp250a.o
 obj-$(CONFIG_VIDEO_HYNIX_HI556)	+= hynix_hi556.o
 obj-$(CONFIG_VIDEO_HYNIX_HI846)	+= hynix_hi846.o
+obj-$(CONFIG_VIDEO_HM5040)	+= hm5040.o
 
 obj-$(CONFIG_VIDEO_PREISP_DUMMY_SENSOR)	+= preisp-dummy.o
 
diff --git a/drivers/media/i2c/hm5040.c b/drivers/media/i2c/hm5040.c
new file mode 100644
index 000000000000..8e85d4dc3f39
--- /dev/null
+++ b/drivers/media/i2c/hm5040.c
@@ -0,0 +1,2279 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * hm5040 driver
+ *
+ * Copyright (C) 2021 Rockchip Electronics Co., Ltd.
+ *
+ * V0.0X01.0X01 init version.
+ */
+
+#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/of.h>
+#include <linux/of_graph.h>
+#include <linux/regulator/consumer.h>
+#include <linux/sysfs.h>
+#include <linux/pinctrl/consumer.h>
+#include <linux/version.h>
+#include <media/v4l2-async.h>
+#include <media/media-entity.h>
+#include <media/v4l2-common.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-event.h>
+#include <media/v4l2-fwnode.h>
+#include <media/v4l2-image-sizes.h>
+#include <media/v4l2-mediabus.h>
+#include <media/v4l2-subdev.h>
+
+#include <linux/rk-camera-module.h>
+
+/* verify default register values */
+#define CHECK_REG_VALUE
+
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x01)
+
+#ifndef V4L2_CID_DIGITAL_GAIN
+#define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
+#endif
+
+/* pixel rate = link frequency * 2 * lanes / BITS_PER_SAMPLE */
+#define MIPI_FREQ	210000000U
+#define HM5040_PIXEL_RATE		(420000000LL * 2LL * 2LL / 10)
+#define HM5040_XVCLK_FREQ		24000000
+
+#define CHIP_ID				0x03bb
+#define HM5040_REG_CHIP_ID		0x2016
+
+#define HM5040_REG_CTRL_MODE		0x0100
+#define HM5040_MODE_SW_STANDBY		0x00
+#define HM5040_MODE_STREAMING		0x01
+
+#define HM5040_REG_EXPOSURE		0x0202
+#define HM5040_REG_EXPOSURE_L		0x0203
+#define	HM5040_EXPOSURE_MIN		4
+#define	HM5040_EXPOSURE_STEP		1
+#define HM5040_VTS_MAX			0x7fff
+
+#define HM5040_A_GAIN_H			0x0204
+#define HM5040_A_GAIN_L			0x0205
+#define HM5040_D_GAIN_GREENR_H		0x020E
+#define HM5040_D_GAIN_GREENR_L		0x020F
+#define HM5040_D_GAIN_RED_H		0x0210
+#define HM5040_D_GAIN_RED_L		0x0211
+#define HM5040_D_GAIN_BLUE_H		0x0212
+#define HM5040_D_GAIN_BLUE_L		0x0213
+#define HM5040_D_GAIN_GREENB_H		0x0214
+#define HM5040_D_GAIN_GREENB_L		0x0215
+
+#define HM5040_GAIN_L_MASK		0xff
+#define HM5040_GAIN_H_MASK		0x1f
+#define HM5040_GAIN_H_SHIFT	8
+#define	ANALOG_GAIN_MIN			0x64 /* 1x */
+#define	ANALOG_GAIN_MAX			0x63F /* 15.9x */
+#define	ANALOG_GAIN_STEP		8
+#define	ANALOG_GAIN_DEFAULT		0xC8 /* 2x */
+
+#define HM5040_REG_GROUP	0x0104
+
+#define HM5040_REG_TEST_PATTERN		0x0601
+#define	HM5040_TEST_PATTERN_ENABLE	0x08
+#define	HM5040_TEST_PATTERN_DISABLE	0x0
+
+#define HM5040_REG_VTS			0x0340
+
+#define REG_NULL			0xFFFF
+#define DELAY_MS			0xEEEE	/* Array delay token */
+
+#define HM5040_REG_VALUE_08BIT		1
+#define HM5040_REG_VALUE_16BIT		2
+#define HM5040_REG_VALUE_24BIT		3
+
+#define HM5040_LANES			2
+#define HM5040_BITS_PER_SAMPLE		10
+
+#define OF_CAMERA_PINCTRL_STATE_DEFAULT	"rockchip,camera_default"
+#define OF_CAMERA_PINCTRL_STATE_SLEEP	"rockchip,camera_sleep"
+
+#define HM5040_NAME			"hm5040"
+
+static const char * const hm5040_supply_names[] = {
+	"avdd",		/* Analog power */
+	"dovdd",	/* Digital I/O power */
+	"dvdd",		/* Digital core power */
+};
+
+#define HM5040_NUM_SUPPLIES ARRAY_SIZE(hm5040_supply_names)
+
+struct regval {
+	u16 addr;
+	u8 val;
+};
+
+struct hm5040_mode {
+	u32 width;
+	u32 height;
+	struct v4l2_fract max_fps;
+	u32 hts_def;
+	u32 vts_def;
+	u32 exp_def;
+	const struct regval *reg_list;
+};
+
+struct hm5040 {
+	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[HM5040_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	*test_pattern;
+	struct mutex		mutex;
+	bool			streaming;
+	bool			power_on;
+	const struct hm5040_mode *cur_mode;
+	unsigned int lane_num;
+	unsigned int cfg_num;
+	unsigned int pixel_rate;
+	u32			module_index;
+	const char		*module_facing;
+	const char		*module_name;
+	const char		*len_name;
+	struct rkmodule_awb_cfg	awb_cfg;
+};
+
+#define to_hm5040(sd) container_of(sd, struct hm5040, subdev)
+
+struct gain_table_t {
+	u16 reg_gain;
+	u16 gain_value;
+};
+
+/*
+ * Xclk 24Mhz
+ * Pclk 168Mhz
+ * linelength 2600(0xa28)
+ * framelength 1952(0x7a0)
+ * grabwindow_width 2592
+ * grabwindow_height 1944
+ * max_framerate 30fps
+ * mipi_datarate per lane 840Mbps
+ */
+static const struct regval hm5040_global_regs[] = {
+	{0x0103, 0x01},
+	{DELAY_MS, 5},
+	{0x0100, 0x00},
+	{0x3002, 0x32},
+	{0x3016, 0x46},
+	{0x3017, 0x29},
+	{0x3003, 0x03},
+	{0x3045, 0x03},
+	{0xFBD7, 0x47},
+	{0xFBD8, 0x89},
+	{0xFBD9, 0x44},
+	{0xFBDA, 0xed},
+	{0xFBDB, 0x4c},
+	{0xFBDC, 0x6c},
+	{0xFBDD, 0x44},
+	{0xFBDE, 0xda},
+	{0xFBDF, 0x4c},
+	{0xFBE0, 0x5f},
+	{0xFBE1, 0x44},
+	{0xFBE2, 0xe0},
+	{0xFBE3, 0x4c},
+	{0xFBE4, 0x59},
+	{0xFBE5, 0x44},
+	{0xFBE6, 0xe1},
+	{0xFBE7, 0x4c},
+	{0xFBE8, 0x4f},
+	{0xFBE9, 0x44},
+	{0xFBEA, 0xe6},
+	{0xFBEB, 0x4E},
+	{0xFBEC, 0xC5},
+	{0xFBED, 0x43},
+	{0xFBEE, 0xDA},
+	{0xFBEF, 0x4E},
+	{0xFBF0, 0xB0},
+	{0xFBF1, 0x43},
+	{0xFBF2, 0x8E},
+	{0xFBF3, 0x4E},
+	{0xFBF4, 0xAF},
+	{0xFBF5, 0x43},
+	{0xFBF6, 0x76},
+	{0xFBF7, 0x4E},
+	{0xFBF8, 0xB7},
+	{0xFBF9, 0x43},
+	{0xFBFA, 0x80},
+	{0xFBFB, 0x4E},
+	{0xFBFC, 0xC4},
+	{0xFBFD, 0x43},
+	{0xFBFE, 0x87},
+	{0xFB00, 0x51},
+	{0xF800, 0xc0},
+	{0xF801, 0x24},
+	{0xF802, 0x7c},
+	{0xF803, 0xfb},
+	{0xF804, 0x7d},
+	{0xF805, 0xc7},
+	{0xF806, 0x7b},
+	{0xF807, 0x10},
+	{0xF808, 0x7f},
+	{0xF809, 0x72},
+	{0xF80A, 0x7e},
+	{0xF80B, 0x30},
+	{0xF80C, 0x12},
+	{0xF80D, 0x09},
+	{0xF80E, 0x47},
+	{0xF80F, 0xd0},
+	{0xF810, 0x24},
+	{0xF811, 0x90},
+	{0xF812, 0x02},
+	{0xF813, 0x05},
+	{0xF814, 0xe0},
+	{0xF815, 0xf5},
+	{0xF816, 0x77},
+	{0xF817, 0xe5},
+	{0xF818, 0x77},
+	{0xF819, 0xc3},
+	{0xF81A, 0x94},
+	{0xF81B, 0x80},
+	{0xF81C, 0x50},
+	{0xF81D, 0x08},
+	{0xF81E, 0x75},
+	{0xF81F, 0x7a},
+	{0xF820, 0xfb},
+	{0xF821, 0x75},
+	{0xF822, 0x7b},
+	{0xF823, 0xd7},
+	{0xF824, 0x80},
+	{0xF825, 0x33},
+	{0xF826, 0xe5},
+	{0xF827, 0x77},
+	{0xF828, 0xc3},
+	{0xF829, 0x94},
+	{0xF82A, 0xc0},
+	{0xF82B, 0x50},
+	{0xF82C, 0x08},
+	{0xF82D, 0x75},
+	{0xF82E, 0x7a},
+	{0xF82F, 0xfb},
+	{0xF830, 0x75},
+	{0xF831, 0x7b},
+	{0xF832, 0xdb},
+	{0xF833, 0x80},
+	{0xF834, 0x24},
+	{0xF835, 0xe5},
+	{0xF836, 0x77},
+	{0xF837, 0xc3},
+	{0xF838, 0x94},
+	{0xF839, 0xe0},
+	{0xF83A, 0x50},
+	{0xF83B, 0x08},
+	{0xF83C, 0x75},
+	{0xF83D, 0x7a},
+	{0xF83E, 0xfb},
+	{0xF83F, 0x75},
+	{0xF840, 0x7b},
+	{0xF841, 0xdf},
+	{0xF842, 0x80},
+	{0xF843, 0x15},
+	{0xF844, 0xe5},
+	{0xF845, 0x77},
+	{0xF846, 0xc3},
+	{0xF847, 0x94},
+	{0xF848, 0xf0},
+	{0xF849, 0x50},
+	{0xF84A, 0x08},
+	{0xF84B, 0x75},
+	{0xF84C, 0x7a},
+	{0xF84D, 0xfb},
+	{0xF84E, 0x75},
+	{0xF84F, 0x7b},
+	{0xF850, 0xe3},
+	{0xF851, 0x80},
+	{0xF852, 0x06},
+	{0xF853, 0x75},
+	{0xF854, 0x7a},
+	{0xF855, 0xfb},
+	{0xF856, 0x75},
+	{0xF857, 0x7b},
+	{0xF858, 0xe7},
+	{0xF859, 0xe5},
+	{0xF85A, 0x55},
+	{0xF85B, 0x7f},
+	{0xF85C, 0x00},
+	{0xF85D, 0xb4},
+	{0xF85E, 0x22},
+	{0xF85F, 0x02},
+	{0xF860, 0x7f},
+	{0xF861, 0x01},
+	{0xF862, 0xe5},
+	{0xF863, 0x53},
+	{0xF864, 0x5f},
+	{0xF865, 0x60},
+	{0xF866, 0x05},
+	{0xF867, 0x74},
+	{0xF868, 0x14},
+	{0xF869, 0x12},
+	{0xF86A, 0xfa},
+	{0xF86B, 0x4c},
+	{0xF86C, 0x75},
+	{0xF86D, 0x7c},
+	{0xF86E, 0xfb},
+	{0xF86F, 0x75},
+	{0xF870, 0x7d},
+	{0xF871, 0xc7},
+	{0xF872, 0x75},
+	{0xF873, 0x7e},
+	{0xF874, 0x30},
+	{0xF875, 0x75},
+	{0xF876, 0x7f},
+	{0xF877, 0x62},
+	{0xF878, 0xe4},
+	{0xF879, 0xf5},
+	{0xF87A, 0x77},
+	{0xF87B, 0xe5},
+	{0xF87C, 0x77},
+	{0xF87D, 0xc3},
+	{0xF87E, 0x94},
+	{0xF87F, 0x08},
+	{0xF880, 0x40},
+	{0xF881, 0x03},
+	{0xF882, 0x02},
+	{0xF883, 0xf9},
+	{0xF884, 0x0e},
+	{0xF885, 0x85},
+	{0xF886, 0x7d},
+	{0xF887, 0x82},
+	{0xF888, 0x85},
+	{0xF889, 0x7c},
+	{0xF88A, 0x83},
+	{0xF88B, 0xe0},
+	{0xF88C, 0xfe},
+	{0xF88D, 0xa3},
+	{0xF88E, 0xe0},
+	{0xF88F, 0xff},
+	{0xF890, 0x12},
+	{0xF891, 0x21},
+	{0xF892, 0x22},
+	{0xF893, 0x8e},
+	{0xF894, 0x78},
+	{0xF895, 0x8f},
+	{0xF896, 0x79},
+	{0xF897, 0x12},
+	{0xF898, 0xfa},
+	{0xF899, 0x40},
+	{0xF89A, 0x12},
+	{0xF89B, 0x22},
+	{0xF89C, 0x93},
+	{0xF89D, 0x50},
+	{0xF89E, 0x07},
+	{0xF89F, 0xe4},
+	{0xF8A0, 0xf5},
+	{0xF8A1, 0x78},
+	{0xF8A2, 0xf5},
+	{0xF8A3, 0x79},
+	{0xF8A4, 0x80},
+	{0xF8A5, 0x33},
+	{0xF8A6, 0x12},
+	{0xF8A7, 0xfa},
+	{0xF8A8, 0x40},
+	{0xF8A9, 0x7b},
+	{0xF8AA, 0x01},
+	{0xF8AB, 0xaf},
+	{0xF8AC, 0x79},
+	{0xF8AD, 0xae},
+	{0xF8AE, 0x78},
+	{0xF8AF, 0x12},
+	{0xF8B0, 0x22},
+	{0xF8B1, 0x4f},
+	{0xF8B2, 0x74},
+	{0xF8B3, 0x02},
+	{0xF8B4, 0x12},
+	{0xF8B5, 0xfa},
+	{0xF8B6, 0x4c},
+	{0xF8B7, 0x85},
+	{0xF8B8, 0x7b},
+	{0xF8B9, 0x82},
+	{0xF8BA, 0xf5},
+	{0xF8BB, 0x83},
+	{0xF8BC, 0xe0},
+	{0xF8BD, 0xfe},
+	{0xF8BE, 0xa3},
+	{0xF8BF, 0xe0},
+	{0xF8C0, 0xff},
+	{0xF8C1, 0x7d},
+	{0xF8C2, 0x03},
+	{0xF8C3, 0x12},
+	{0xF8C4, 0x17},
+	{0xF8C5, 0xd8},
+	{0xF8C6, 0x12},
+	{0xF8C7, 0x1b},
+	{0xF8C8, 0x9b},
+	{0xF8C9, 0x8e},
+	{0xF8CA, 0x78},
+	{0xF8CB, 0x8f},
+	{0xF8CC, 0x79},
+	{0xF8CD, 0x74},
+	{0xF8CE, 0xfe},
+	{0xF8CF, 0x25},
+	{0xF8D0, 0x7b},
+	{0xF8D1, 0xf5},
+	{0xF8D2, 0x7b},
+	{0xF8D3, 0x74},
+	{0xF8D4, 0xff},
+	{0xF8D5, 0x35},
+	{0xF8D6, 0x7a},
+	{0xF8D7, 0xf5},
+	{0xF8D8, 0x7a},
+	{0xF8D9, 0x78},
+	{0xF8DA, 0x24},
+	{0xF8DB, 0xe6},
+	{0xF8DC, 0xff},
+	{0xF8DD, 0xc3},
+	{0xF8DE, 0x74},
+	{0xF8DF, 0x20},
+	{0xF8E0, 0x9f},
+	{0xF8E1, 0x7e},
+	{0xF8E2, 0x00},
+	{0xF8E3, 0x25},
+	{0xF8E4, 0x79},
+	{0xF8E5, 0xff},
+	{0xF8E6, 0xee},
+	{0xF8E7, 0x35},
+	{0xF8E8, 0x78},
+	{0xF8E9, 0x85},
+	{0xF8EA, 0x7f},
+	{0xF8EB, 0x82},
+	{0xF8EC, 0x85},
+	{0xF8ED, 0x7e},
+	{0xF8EE, 0x83},
+	{0xF8EF, 0xf0},
+	{0xF8F0, 0xa3},
+	{0xF8F1, 0xef},
+	{0xF8F2, 0xf0},
+	{0xF8F3, 0x05},
+	{0xF8F4, 0x77},
+	{0xF8F5, 0x74},
+	{0xF8F6, 0x02},
+	{0xF8F7, 0x25},
+	{0xF8F8, 0x7d},
+	{0xF8F9, 0xf5},
+	{0xF8FA, 0x7d},
+	{0xF8FB, 0xe4},
+	{0xF8FC, 0x35},
+	{0xF8FD, 0x7c},
+	{0xF8FE, 0xf5},
+	{0xF8FF, 0x7c},
+	{0xF900, 0x74},
+	{0xF901, 0x02},
+	{0xF902, 0x25},
+	{0xF903, 0x7f},
+	{0xF904, 0xf5},
+	{0xF905, 0x7f},
+	{0xF906, 0xe4},
+	{0xF907, 0x35},
+	{0xF908, 0x7e},
+	{0xF909, 0xf5},
+	{0xF90A, 0x7e},
+	{0xF90B, 0x02},
+	{0xF90C, 0xf8},
+	{0xF90D, 0x7b},
+	{0xF90E, 0x22},
+	{0xF90F, 0x90},
+	{0xF910, 0x30},
+	{0xF911, 0x47},
+	{0xF912, 0x74},
+	{0xF913, 0x98},
+	{0xF914, 0xf0},
+	{0xF915, 0x90},
+	{0xF916, 0x30},
+	{0xF917, 0x36},
+	{0xF918, 0x74},
+	{0xF919, 0x1e},
+	{0xF91A, 0xf0},
+	{0xF91B, 0x90},
+	{0xF91C, 0x30},
+	{0xF91D, 0x42},
+	{0xF91E, 0x74},
+	{0xF91F, 0x24},
+	{0xF920, 0xf0},
+	{0xF921, 0xe5},
+	{0xF922, 0x53},
+	{0xF923, 0x60},
+	{0xF924, 0x42},
+	{0xF925, 0x78},
+	{0xF926, 0x2b},
+	{0xF927, 0x76},
+	{0xF928, 0x01},
+	{0xF929, 0xe5},
+	{0xF92A, 0x55},
+	{0xF92B, 0xb4},
+	{0xF92C, 0x22},
+	{0xF92D, 0x17},
+	{0xF92E, 0x90},
+	{0xF92F, 0x30},
+	{0xF930, 0x36},
+	{0xF931, 0x74},
+	{0xF932, 0x46},
+	{0xF933, 0xf0},
+	{0xF934, 0x78},
+	{0xF935, 0x28},
+	{0xF936, 0x76},
+	{0xF937, 0x31},
+	{0xF938, 0x90},
+	{0xF939, 0x30},
+	{0xF93A, 0x0e},
+	{0xF93B, 0xe0},
+	{0xF93C, 0xc3},
+	{0xF93D, 0x13},
+	{0xF93E, 0x30},
+	{0xF93F, 0xe0},
+	{0xF940, 0x04},
+	{0xF941, 0x78},
+	{0xF942, 0x26},
+	{0xF943, 0x76},
+	{0xF944, 0x40},
+	{0xF945, 0xe5},
+	{0xF946, 0x55},
+	{0xF947, 0xb4},
+	{0xF948, 0x44},
+	{0xF949, 0x21},
+	{0xF94A, 0x90},
+	{0xF94B, 0x30},
+	{0xF94C, 0x47},
+	{0xF94D, 0x74},
+	{0xF94E, 0x9a},
+	{0xF94F, 0xf0},
+	{0xF950, 0x90},
+	{0xF951, 0x30},
+	{0xF952, 0x42},
+	{0xF953, 0x74},
+	{0xF954, 0x64},
+	{0xF955, 0xf0},
+	{0xF956, 0x90},
+	{0xF957, 0x30},
+	{0xF958, 0x0e},
+	{0xF959, 0xe0},
+	{0xF95A, 0x13},
+	{0xF95B, 0x13},
+	{0xF95C, 0x54},
+	{0xF95D, 0x3f},
+	{0xF95E, 0x30},
+	{0xF95F, 0xe0},
+	{0xF960, 0x0a},
+	{0xF961, 0x78},
+	{0xF962, 0x24},
+	{0xF963, 0xe4},
+	{0xF964, 0xf6},
+	{0xF965, 0x80},
+	{0xF966, 0x04},
+	{0xF967, 0x78},
+	{0xF968, 0x2b},
+	{0xF969, 0xe4},
+	{0xF96A, 0xf6},
+	{0xF96B, 0x90},
+	{0xF96C, 0x30},
+	{0xF96D, 0x88},
+	{0xF96E, 0x02},
+	{0xF96F, 0x1d},
+	{0xF970, 0x4f},
+	{0xF971, 0x22},
+	{0xF972, 0x90},
+	{0xF973, 0x0c},
+	{0xF974, 0x1a},
+	{0xF975, 0xe0},
+	{0xF976, 0x30},
+	{0xF977, 0xe2},
+	{0xF978, 0x18},
+	{0xF979, 0x90},
+	{0xF97A, 0x33},
+	{0xF97B, 0x68},
+	{0xF97C, 0xe0},
+	{0xF97D, 0x64},
+	{0xF97E, 0x05},
+	{0xF97F, 0x70},
+	{0xF980, 0x2f},
+	{0xF981, 0x90},
+	{0xF982, 0x30},
+	{0xF983, 0x38},
+	{0xF984, 0xe0},
+	{0xF985, 0x70},
+	{0xF986, 0x02},
+	{0xF987, 0xa3},
+	{0xF988, 0xe0},
+	{0xF989, 0xc3},
+	{0xF98A, 0x70},
+	{0xF98B, 0x01},
+	{0xF98C, 0xd3},
+	{0xF98D, 0x40},
+	{0xF98E, 0x21},
+	{0xF98F, 0x80},
+	{0xF990, 0x1b},
+	{0xF991, 0x90},
+	{0xF992, 0x33},
+	{0xF993, 0x68},
+	{0xF994, 0xe0},
+	{0xF995, 0xb4},
+	{0xF996, 0x05},
+	{0xF997, 0x18},
+	{0xF998, 0xc3},
+	{0xF999, 0x90},
+	{0xF99A, 0x30},
+	{0xF99B, 0x3b},
+	{0xF99C, 0xe0},
+	{0xF99D, 0x94},
+	{0xF99E, 0x0d},
+	{0xF99F, 0x90},
+	{0xF9A0, 0x30},
+	{0xF9A1, 0x3a},
+	{0xF9A2, 0xe0},
+	{0xF9A3, 0x94},
+	{0xF9A4, 0x00},
+	{0xF9A5, 0x50},
+	{0xF9A6, 0x02},
+	{0xF9A7, 0x80},
+	{0xF9A8, 0x01},
+	{0xF9A9, 0xc3},
+	{0xF9AA, 0x40},
+	{0xF9AB, 0x04},
+	{0xF9AC, 0x75},
+	{0xF9AD, 0x10},
+	{0xF9AE, 0x01},
+	{0xF9AF, 0x22},
+	{0xF9B0, 0x02},
+	{0xF9B1, 0x16},
+	{0xF9B2, 0xe1},
+	{0xF9B3, 0x22},
+	{0xF9B4, 0x90},
+	{0xF9B5, 0xff},
+	{0xF9B6, 0x33},
+	{0xF9B7, 0xe0},
+	{0xF9B8, 0x90},
+	{0xF9B9, 0xff},
+	{0xF9BA, 0x34},
+	{0xF9BB, 0xe0},
+	{0xF9BC, 0x60},
+	{0xF9BD, 0x0d},
+	{0xF9BE, 0x7c},
+	{0xF9BF, 0xfb},
+	{0xF9C0, 0x7d},
+	{0xF9C1, 0xd7},
+	{0xF9C2, 0x7b},
+	{0xF9C3, 0x28},
+	{0xF9C4, 0x7f},
+	{0xF9C5, 0x34},
+	{0xF9C6, 0x7e},
+	{0xF9C7, 0xff},
+	{0xF9C8, 0x12},
+	{0xF9C9, 0x09},
+	{0xF9CA, 0x47},
+	{0xF9CB, 0x7f},
+	{0xF9CC, 0x20},
+	{0xF9CD, 0x7e},
+	{0xF9CE, 0x01},
+	{0xF9CF, 0x7d},
+	{0xF9D0, 0x00},
+	{0xF9D1, 0x7c},
+	{0xF9D2, 0x00},
+	{0xF9D3, 0x12},
+	{0xF9D4, 0x12},
+	{0xF9D5, 0xa4},
+	{0xF9D6, 0xe4},
+	{0xF9D7, 0x90},
+	{0xF9D8, 0x3e},
+	{0xF9D9, 0x44},
+	{0xF9DA, 0xf0},
+	{0xF9DB, 0x02},
+	{0xF9DC, 0x16},
+	{0xF9DD, 0x7e},
+	{0xF9DE, 0x22},
+	{0xF9DF, 0xe5},
+	{0xF9E0, 0x44},
+	{0xF9E1, 0x60},
+	{0xF9E2, 0x10},
+	{0xF9E3, 0x90},
+	{0xF9E4, 0xf6},
+	{0xF9E5, 0x2c},
+	{0xF9E6, 0x74},
+	{0xF9E7, 0x04},
+	{0xF9E8, 0xf0},
+	{0xF9E9, 0x90},
+	{0xF9EA, 0xf6},
+	{0xF9EB, 0x34},
+	{0xF9EC, 0xf0},
+	{0xF9ED, 0x90},
+	{0xF9EE, 0xf6},
+	{0xF9EF, 0x3c},
+	{0xF9F0, 0xf0},
+	{0xF9F1, 0x80},
+	{0xF9F2, 0x0e},
+	{0xF9F3, 0x90},
+	{0xF9F4, 0xf5},
+	{0xF9F5, 0xc0},
+	{0xF9F6, 0x74},
+	{0xF9F7, 0x04},
+	{0xF9F8, 0xf0},
+	{0xF9F9, 0x90},
+	{0xF9FA, 0xf5},
+	{0xF9FB, 0xc8},
+	{0xF9FC, 0xf0},
+	{0xF9FD, 0x90},
+	{0xF9FE, 0xf5},
+	{0xF9FF, 0xd0},
+	{0xFA00, 0xf0},
+	{0xFA01, 0x90},
+	{0xFA02, 0xfb},
+	{0xFA03, 0x7f},
+	{0xFA04, 0x02},
+	{0xFA05, 0x19},
+	{0xFA06, 0x0b},
+	{0xFA07, 0x22},
+	{0xFA08, 0x90},
+	{0xFA09, 0x0c},
+	{0xFA0A, 0x1a},
+	{0xFA0B, 0xe0},
+	{0xFA0C, 0x20},
+	{0xFA0D, 0xe2},
+	{0xFA0E, 0x15},
+	{0xFA0F, 0xe4},
+	{0xFA10, 0x90},
+	{0xFA11, 0x30},
+	{0xFA12, 0xf8},
+	{0xFA13, 0xf0},
+	{0xFA14, 0xa3},
+	{0xFA15, 0xf0},
+	{0xFA16, 0x90},
+	{0xFA17, 0x30},
+	{0xFA18, 0xf1},
+	{0xFA19, 0xe0},
+	{0xFA1A, 0x44},
+	{0xFA1B, 0x08},
+	{0xFA1C, 0xf0},
+	{0xFA1D, 0x90},
+	{0xFA1E, 0x30},
+	{0xFA1F, 0xf0},
+	{0xFA20, 0xe0},
+	{0xFA21, 0x44},
+	{0xFA22, 0x08},
+	{0xFA23, 0xf0},
+	{0xFA24, 0x02},
+	{0xFA25, 0x03},
+	{0xFA26, 0xde},
+	{0xFA27, 0x22},
+	{0xFA28, 0x90},
+	{0xFA29, 0x0c},
+	{0xFA2A, 0x1a},
+	{0xFA2B, 0xe0},
+	{0xFA2C, 0x30},
+	{0xFA2D, 0xe2},
+	{0xFA2E, 0x0d},
+	{0xFA2F, 0xe0},
+	{0xFA30, 0x20},
+	{0xFA31, 0xe0},
+	{0xFA32, 0x06},
+	{0xFA33, 0x90},
+	{0xFA34, 0xfb},
+	{0xFA35, 0x85},
+	{0xFA36, 0x74},
+	{0xFA37, 0x00},
+	{0xFA38, 0xa5},
+	{0xFA39, 0x12},
+	{0xFA3A, 0x16},
+	{0xFA3B, 0xa0},
+	{0xFA3C, 0x02},
+	{0xFA3D, 0x18},
+	{0xFA3E, 0xac},
+	{0xFA3F, 0x22},
+	{0xFA40, 0x85},
+	{0xFA41, 0x7b},
+	{0xFA42, 0x82},
+	{0xFA43, 0x85},
+	{0xFA44, 0x7a},
+	{0xFA45, 0x83},
+	{0xFA46, 0xe0},
+	{0xFA47, 0xfc},
+	{0xFA48, 0xa3},
+	{0xFA49, 0xe0},
+	{0xFA4A, 0xfd},
+	{0xFA4B, 0x22},
+	{0xFA4C, 0x25},
+	{0xFA4D, 0x7b},
+	{0xFA4E, 0xf5},
+	{0xFA4F, 0x7b},
+	{0xFA50, 0xe4},
+	{0xFA51, 0x35},
+	{0xFA52, 0x7a},
+	{0xFA53, 0xf5},
+	{0xFA54, 0x7a},
+	{0xFA55, 0x22},
+	{0xFA56, 0xc0},
+	{0xFA57, 0xd0},
+	{0xFA58, 0x90},
+	{0xFA59, 0x35},
+	{0xFA5A, 0xb5},
+	{0xFA5B, 0xe0},
+	{0xFA5C, 0x54},
+	{0xFA5D, 0xfc},
+	{0xFA5E, 0x44},
+	{0xFA5F, 0x01},
+	{0xFA60, 0xf0},
+	{0xFA61, 0x12},
+	{0xFA62, 0x1f},
+	{0xFA63, 0x5f},
+	{0xFA64, 0xd0},
+	{0xFA65, 0xd0},
+	{0xFA66, 0x02},
+	{0xFA67, 0x0a},
+	{0xFA68, 0x16},
+	{0xFA69, 0x22},
+	{0xFA6A, 0x90},
+	{0xFA6B, 0x0c},
+	{0xFA6C, 0x1a},
+	{0xFA6D, 0xe0},
+	{0xFA6E, 0x20},
+	{0xFA6F, 0xe0},
+	{0xFA70, 0x06},
+	{0xFA71, 0x90},
+	{0xFA72, 0xfb},
+	{0xFA73, 0x85},
+	{0xFA74, 0x74},
+	{0xFA75, 0x00},
+	{0xFA76, 0xa5},
+	{0xFA77, 0xe5},
+	{0xFA78, 0x10},
+	{0xFA79, 0x02},
+	{0xFA7A, 0x1e},
+	{0xFA7B, 0x8f},
+	{0xFA7C, 0x22},
+	{0xFA7D, 0x90},
+	{0xFA7E, 0xfb},
+	{0xFA7F, 0x85},
+	{0xFA80, 0x74},
+	{0xFA81, 0x00},
+	{0xFA82, 0xa5},
+	{0xFA83, 0xe5},
+	{0xFA84, 0x1a},
+	{0xFA85, 0x60},
+	{0xFA86, 0x03},
+	{0xFA87, 0x02},
+	{0xFA88, 0x17},
+	{0xFA89, 0x47},
+	{0xFA8A, 0x22},
+	{0xFA8B, 0x90},
+	{0xFA8C, 0xfb},
+	{0xFA8D, 0x84},
+	{0xFA8E, 0x02},
+	{0xFA8F, 0x18},
+	{0xFA90, 0xd9},
+	{0xFA91, 0x22},
+	{0xFA92, 0x02},
+	{0xFA93, 0x1f},
+	{0xFA94, 0xb1},
+	{0xFA95, 0x22},
+	{0x35D8, 0x01},
+	{0x35D9, 0x0F},
+	{0x35DA, 0x01},
+	{0x35DB, 0x72},
+	{0x35DC, 0x01},
+	{0x35DD, 0xB4},
+	{0x35DE, 0x01},
+	{0x35DF, 0xDF},
+	{0x35E0, 0x02},
+	{0x35E1, 0x08},
+	{0x35E2, 0x02},
+	{0x35E3, 0x28},
+	{0x35E4, 0x02},
+	{0x35E5, 0x56},
+	{0x35E6, 0x02},
+	{0x35E7, 0x6A},
+	{0x35E8, 0x02},
+	{0x35E9, 0x7D},
+	{0x35EA, 0x02},
+	{0x35EB, 0x8B},
+	{0x35EC, 0x02},
+	{0x35ED, 0x92},
+	{0x35EF, 0x22},
+	{0x35F1, 0x23},
+	{0x35F3, 0x22},
+	{0x35F6, 0x19},
+	{0x35F7, 0x55},
+	{0x35F8, 0x1D},
+	{0x35F9, 0x4C},
+	{0x35FA, 0x16},
+	{0x35FB, 0xC7},
+	{0x35FC, 0x1A},
+	{0x35FD, 0xA0},
+	{0x35FE, 0x18},
+	{0x35FF, 0xD6},
+	{0x3600, 0x03},
+	{0x3601, 0xD4},
+	{0x3602, 0x18},
+	{0x3603, 0x8A},
+	{0x3604, 0x0A},
+	{0x3605, 0x0D},
+	{0x3606, 0x1E},
+	{0x3607, 0x8D},
+	{0x3608, 0x17},
+	{0x3609, 0x43},
+	{0x360A, 0x19},
+	{0x360B, 0x16},
+	{0x360C, 0x1F},
+	{0x360D, 0xAD},
+	{0x360E, 0x19},
+	{0x360F, 0x08},
+	{0x3610, 0x14},
+	{0x3611, 0x26},
+	{0x3612, 0x1A},
+	{0x3613, 0xB3},
+	{0x35D2, 0x7F},
+	{0x35D3, 0xFF},
+	{0x35D4, 0x70},
+	{0x35D0, 0x01},
+	{0x3E44, 0x01},
+	{0x0111, 0x02},
+	{0x0114, 0x01},
+	{0x2136, 0x0C},
+	{0x2137, 0x00},
+	{0x0112, 0x0A},
+	{0x0113, 0x0A},
+	{0x3016, 0x46},
+	{0x3017, 0x29},
+	{0x3003, 0x03},
+	{0x3045, 0x03},
+	{0x3047, 0x98},
+	{0x0305, 0x04},
+	{0x0306, 0x00},
+	{0x0307, 0x64},
+	{0x0301, 0x0A},
+	{0x0309, 0x0A},
+	{0x0340, 0x08},
+	{0x0341, 0x24},
+	{0x0344, 0x00},
+	{0x0345, 0x00},
+	{0x0346, 0x00},
+	{0x0347, 0x00},
+	{0x0348, 0x0A},
+	{0x0349, 0x27},
+	{0x034A, 0x07},
+	{0x034B, 0x9F},
+	{0x034C, 0x0A},
+	{0x034D, 0x28},
+	{0x034E, 0x07},
+	{0x034F, 0xA0},
+	{0x0383, 0x01},
+	{0x0387, 0x01},
+	{0x0202, 0x07},
+	{0x0203, 0xad},
+	{0x0205, 0xC0},
+	{0x0900, 0x00},
+	{0x0901, 0x00},
+	{0x0902, 0x00},
+	{0x040C, 0x0A},
+	{0x040D, 0x28},
+	{0x040E, 0x07},
+	{0x040F, 0xA0},
+	{0x0101, 0x00},
+	//{0x0100, 0x01},
+
+	{REG_NULL, 0x00},
+};
+
+/*
+ * Xclk 24Mhz
+ * Pclk 168Mhz
+ * linelength 2600(0xa28)
+ * framelength 1952(0x7a0)
+ * grabwindow_width 2592
+ * grabwindow_height 1944
+ * max_framerate 30fps
+ * mipi_datarate per lane 840Mbps
+ */
+static const struct regval hm5040_2592x1944_regs_2lane[] = {
+	// 2592x1944 30fps 2 lane MIPI 840Mbps/lane
+	{0x0100, 0x00},
+	{0x0900, 0x00},
+	{0x0901, 0x00},
+	{0x0300, 0x00},
+	{0x0302, 0x00},
+	{0x0303, 0x01},
+	{0x0304, 0x00},
+	{0x0308, 0x00},
+	{0x030a, 0x00},
+	{0x030b, 0x01},
+	{0x0340, 0x07},
+	{0x0341, 0xc4},
+	{0x034C, 0x0A},
+	{0x034D, 0x28},
+	{0x034E, 0x07},
+	{0x034F, 0xA0},
+	{0x040C, 0x0A},
+	{0x040D, 0x28},
+	{0x040E, 0x07},
+	{0x040F, 0xA0},
+	{0x0202, 0x0e},
+	{0x0203, 0x50},
+	{0x0205, 0xC0},
+	//{0x0100, 0x01},
+	{REG_NULL, 0x00},
+};
+
+static const struct hm5040_mode supported_modes_2lane[] = {
+	{
+		.width = 2592,
+		.height = 1944,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x07a0,
+		.hts_def = 0x0abe,
+		.vts_def = 0x07c4,
+		.reg_list = hm5040_2592x1944_regs_2lane,
+	},
+};
+
+static const struct hm5040_mode *supported_modes;
+
+static const s64 link_freq_menu_items[] = {
+	MIPI_FREQ
+};
+
+static const char * const hm5040_test_pattern_menu[] = {
+	"Disabled",
+	"Solid color",
+	"100% color bars",
+	"Fade to gray color bars",
+	"PN9",
+};
+
+/* Write registers up to 4 at a time */
+static int hm5040_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, "%s(%d) enter!\n", __func__, __LINE__);
+	dev_info(&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) {
+		dev_err(&client->dev,
+			   "write reg(0x%x val:0x%x)failed !\n", reg, val);
+		return -EIO;
+	}
+	return 0;
+}
+
+static int hm5040_write_array(struct i2c_client *client,
+			      const struct regval *regs)
+{
+	int i, delay_ms, ret = 0;
+
+	for (i = 0; ret == 0 && regs[i].addr != REG_NULL; i++) {
+		if (regs[i].addr == DELAY_MS) {
+			delay_ms = regs[i].val;
+			dev_info(&client->dev, "delay(%d) ms !\n", delay_ms);
+			usleep_range(1000 * delay_ms, 1000 * delay_ms + 100);
+			continue;
+		}
+		ret = hm5040_write_reg(client, regs[i].addr,
+				       HM5040_REG_VALUE_08BIT, regs[i].val);
+		if (ret)
+			dev_err(&client->dev, "%s failed !\n", __func__);
+	}
+	return ret;
+}
+
+/* Read registers up to 4 at a time */
+static int hm5040_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 *)&reg_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;
+}
+
+/* Check Register value */
+#ifdef CHECK_REG_VALUE
+static int hm5040_reg_verify(struct i2c_client *client,
+				const struct regval *regs)
+{
+	u32 i;
+	int ret = 0;
+	u32 value;
+
+	for (i = 0; ret == 0 && regs[i].addr != REG_NULL; i++) {
+		ret = hm5040_read_reg(client, regs[i].addr,
+			  HM5040_REG_VALUE_08BIT, &value);
+		if (value != regs[i].val) {
+			dev_info(&client->dev, "%s: 0x%04x is 0x%x instead of 0x%x\n",
+				  __func__, regs[i].addr, value, regs[i].val);
+		}
+	}
+	return ret;
+}
+#endif
+
+static int hm5040_get_reso_dist(const struct hm5040_mode *mode,
+				struct v4l2_mbus_framefmt *framefmt)
+{
+	return abs(mode->width - framefmt->width) +
+	       abs(mode->height - framefmt->height);
+}
+
+static const struct hm5040_mode *
+hm5040_find_best_fit(struct hm5040 *hm5040,
+			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 < hm5040->cfg_num; i++) {
+		dist = hm5040_get_reso_dist(&supported_modes[i], framefmt);
+		if (cur_best_fit_dist == -1 || dist < cur_best_fit_dist) {
+			cur_best_fit_dist = dist;
+			cur_best_fit = i;
+		}
+	}
+
+	return &supported_modes[cur_best_fit];
+}
+
+static int hm5040_set_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct hm5040 *hm5040 = to_hm5040(sd);
+	const struct hm5040_mode *mode;
+	s64 h_blank, vblank_def;
+
+	mutex_lock(&hm5040->mutex);
+
+	mode = hm5040_find_best_fit(hm5040, fmt);
+	fmt->format.code = MEDIA_BUS_FMT_SBGGR10_1X10;
+	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(&hm5040->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		hm5040->cur_mode = mode;
+		h_blank = mode->hts_def - mode->width;
+		__v4l2_ctrl_modify_range(hm5040->hblank, h_blank,
+					 h_blank, 1, h_blank);
+		vblank_def = mode->vts_def - mode->height;
+		__v4l2_ctrl_modify_range(hm5040->vblank, vblank_def,
+					 HM5040_VTS_MAX - mode->height,
+					 1, vblank_def);
+	}
+
+	mutex_unlock(&hm5040->mutex);
+
+	return 0;
+}
+
+static int hm5040_get_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct hm5040 *hm5040 = to_hm5040(sd);
+	const struct hm5040_mode *mode = hm5040->cur_mode;
+
+	mutex_lock(&hm5040->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(&hm5040->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		fmt->format.width = mode->width;
+		fmt->format.height = mode->height;
+		fmt->format.code = MEDIA_BUS_FMT_SBGGR10_1X10;
+		fmt->format.field = V4L2_FIELD_NONE;
+	}
+	mutex_unlock(&hm5040->mutex);
+
+	return 0;
+}
+
+static int hm5040_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 = MEDIA_BUS_FMT_SBGGR10_1X10;
+
+	return 0;
+}
+
+static int hm5040_enum_frame_sizes(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_pad_config *cfg,
+				   struct v4l2_subdev_frame_size_enum *fse)
+{
+	struct hm5040 *hm5040 = to_hm5040(sd);
+
+	if (fse->index >= hm5040->cfg_num)
+		return -EINVAL;
+
+	if (fse->code != MEDIA_BUS_FMT_SBGGR10_1X10)
+		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;
+
+	return 0;
+}
+
+static int hm5040_enable_test_pattern(struct hm5040 *hm5040, u32 pattern)
+{
+	u32 val;
+
+	if (pattern)
+		val = (pattern - 1) | HM5040_TEST_PATTERN_ENABLE;
+	else
+		val = HM5040_TEST_PATTERN_DISABLE;
+
+	return hm5040_write_reg(hm5040->client, HM5040_REG_TEST_PATTERN,
+				HM5040_REG_VALUE_08BIT, val);
+}
+
+static int hm5040_g_frame_interval(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_frame_interval *fi)
+{
+	struct hm5040 *hm5040 = to_hm5040(sd);
+	const struct hm5040_mode *mode = hm5040->cur_mode;
+
+	mutex_lock(&hm5040->mutex);
+	fi->interval = mode->max_fps;
+	mutex_unlock(&hm5040->mutex);
+
+	return 0;
+}
+
+static void hm5040_get_module_inf(struct hm5040 *hm5040,
+				  struct rkmodule_inf *inf)
+{
+	memset(inf, 0, sizeof(*inf));
+	strscpy(inf->base.sensor, HM5040_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, hm5040->module_name,
+		sizeof(inf->base.module));
+	strscpy(inf->base.lens, hm5040->len_name, sizeof(inf->base.lens));
+}
+
+static void hm5040_set_awb_cfg(struct hm5040 *hm5040,
+				 struct rkmodule_awb_cfg *cfg)
+{
+	mutex_lock(&hm5040->mutex);
+	memcpy(&hm5040->awb_cfg, cfg, sizeof(*cfg));
+	mutex_unlock(&hm5040->mutex);
+}
+
+static long hm5040_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	struct hm5040 *hm5040 = to_hm5040(sd);
+	long ret = 0;
+	u32 stream = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		hm5040_get_module_inf(hm5040, (struct rkmodule_inf *)arg);
+		break;
+	case RKMODULE_AWB_CFG:
+		hm5040_set_awb_cfg(hm5040, (struct rkmodule_awb_cfg *)arg);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+
+		stream = *((u32 *)arg);
+
+		if (stream)
+			ret = hm5040_write_reg(hm5040->client, HM5040_REG_CTRL_MODE,
+				HM5040_REG_VALUE_08BIT, HM5040_MODE_STREAMING);
+		else
+			ret = hm5040_write_reg(hm5040->client, HM5040_REG_CTRL_MODE,
+				HM5040_REG_VALUE_08BIT, HM5040_MODE_SW_STANDBY);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+
+#ifdef CONFIG_COMPAT
+static long hm5040_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 *awb_cfg;
+	long ret;
+	u32 stream = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		inf = kzalloc(sizeof(*inf), GFP_KERNEL);
+		if (!inf) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = hm5040_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:
+		awb_cfg = kzalloc(sizeof(*awb_cfg), GFP_KERNEL);
+		if (!awb_cfg) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = copy_from_user(awb_cfg, up, sizeof(*awb_cfg));
+		if (!ret)
+			ret = hm5040_ioctl(sd, cmd, awb_cfg);
+		else
+			ret = -EFAULT;
+		kfree(awb_cfg);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		ret = copy_from_user(&stream, up, sizeof(u32));
+		if (!ret)
+			ret = hm5040_ioctl(sd, cmd, &stream);
+		else
+			ret = -EFAULT;
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+#endif
+
+static int __hm5040_start_stream(struct hm5040 *hm5040)
+{
+	int ret;
+
+	ret = hm5040_write_array(hm5040->client, hm5040->cur_mode->reg_list);
+	if (ret)
+		return ret;
+
+#ifdef CHECK_REG_VALUE
+	usleep_range(10000, 20000);
+	/*  verify default values to make sure everything has */
+	/*  been written correctly as expected */
+	dev_info(&hm5040->client->dev, "%s:Check register value!\n",
+				__func__);
+	ret = hm5040_reg_verify(hm5040->client, hm5040_global_regs);
+	if (ret)
+		return ret;
+
+	ret = hm5040_reg_verify(hm5040->client, hm5040->cur_mode->reg_list);
+	if (ret)
+		return ret;
+#endif
+
+	/* In case these controls are set before streaming */
+	mutex_unlock(&hm5040->mutex);
+	ret = v4l2_ctrl_handler_setup(&hm5040->ctrl_handler);
+	mutex_lock(&hm5040->mutex);
+	if (ret)
+		return ret;
+
+	ret = hm5040_write_reg(hm5040->client, HM5040_REG_CTRL_MODE,
+				HM5040_REG_VALUE_08BIT, HM5040_MODE_STREAMING);
+	return ret;
+}
+
+static int __hm5040_stop_stream(struct hm5040 *hm5040)
+{
+	return hm5040_write_reg(hm5040->client, HM5040_REG_CTRL_MODE,
+				HM5040_REG_VALUE_08BIT, HM5040_MODE_SW_STANDBY);
+}
+
+static int hm5040_s_stream(struct v4l2_subdev *sd, int on)
+{
+	struct hm5040 *hm5040 = to_hm5040(sd);
+	struct i2c_client *client = hm5040->client;
+	int ret = 0;
+
+	dev_info(&client->dev, "%s: on: %d, %dx%d@%d\n", __func__, on,
+				hm5040->cur_mode->width,
+				hm5040->cur_mode->height,
+		DIV_ROUND_CLOSEST(hm5040->cur_mode->max_fps.denominator,
+		hm5040->cur_mode->max_fps.numerator));
+
+	mutex_lock(&hm5040->mutex);
+	on = !!on;
+	if (on == hm5040->streaming)
+		goto unlock_and_return;
+
+	if (on) {
+		dev_info(&client->dev, "stream on!!!\n");
+		ret = pm_runtime_get_sync(&client->dev);
+		if (ret < 0) {
+			pm_runtime_put_noidle(&client->dev);
+			goto unlock_and_return;
+		}
+
+		ret = __hm5040_start_stream(hm5040);
+		if (ret) {
+			v4l2_err(sd, "start stream failed while write regs\n");
+			pm_runtime_put(&client->dev);
+			goto unlock_and_return;
+		}
+	} else {
+		dev_info(&client->dev, "stream off!!!\n");
+		__hm5040_stop_stream(hm5040);
+		pm_runtime_put(&client->dev);
+	}
+
+	hm5040->streaming = on;
+
+unlock_and_return:
+	mutex_unlock(&hm5040->mutex);
+
+	return ret;
+}
+
+static int hm5040_s_power(struct v4l2_subdev *sd, int on)
+{
+	struct hm5040 *hm5040 = to_hm5040(sd);
+	struct i2c_client *client = hm5040->client;
+	int ret = 0;
+
+	dev_info(&client->dev, "%s(%d) on(%d)\n", __func__, __LINE__, on);
+	mutex_lock(&hm5040->mutex);
+
+	/* If the power state is not modified - no work to do. */
+	if (hm5040->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;
+		}
+
+		ret = hm5040_write_array(hm5040->client, hm5040_global_regs);
+		if (ret) {
+			v4l2_err(sd, "could not set init registers\n");
+			pm_runtime_put_noidle(&client->dev);
+			goto unlock_and_return;
+		}
+
+		hm5040->power_on = true;
+		/* export gpio */
+		if (!IS_ERR(hm5040->reset_gpio))
+			gpiod_export(hm5040->reset_gpio, false);
+		if (!IS_ERR(hm5040->pwdn_gpio))
+			gpiod_export(hm5040->pwdn_gpio, false);
+	} else {
+		pm_runtime_put(&client->dev);
+		hm5040->power_on = false;
+	}
+
+unlock_and_return:
+	mutex_unlock(&hm5040->mutex);
+
+	return ret;
+}
+
+/* Calculate the delay in us by clock rate and clock cycles */
+static inline u32 hm5040_cal_delay(u32 cycles)
+{
+	return DIV_ROUND_UP(cycles, HM5040_XVCLK_FREQ / 1000 / 1000);
+}
+
+static int __hm5040_power_on(struct hm5040 *hm5040)
+{
+	int ret;
+	u32 delay_us;
+	struct device *dev = &hm5040->client->dev;
+
+	if (!IS_ERR(hm5040->power_gpio))
+		gpiod_set_value_cansleep(hm5040->power_gpio, 1);
+
+	usleep_range(1000, 2000);
+
+	if (!IS_ERR_OR_NULL(hm5040->pins_default)) {
+		ret = pinctrl_select_state(hm5040->pinctrl,
+					   hm5040->pins_default);
+		if (ret < 0)
+			dev_err(dev, "could not set pins\n");
+	}
+	ret = clk_set_rate(hm5040->xvclk, HM5040_XVCLK_FREQ);
+	if (ret < 0)
+		dev_warn(dev, "Failed to set xvclk rate (24MHz)\n");
+	if (clk_get_rate(hm5040->xvclk) != HM5040_XVCLK_FREQ)
+		dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n");
+	ret = clk_prepare_enable(hm5040->xvclk);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable xvclk\n");
+		return ret;
+	}
+
+	ret = regulator_bulk_enable(HM5040_NUM_SUPPLIES, hm5040->supplies);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable regulators\n");
+		goto disable_clk;
+	}
+
+	if (!IS_ERR(hm5040->reset_gpio))
+		gpiod_set_value_cansleep(hm5040->reset_gpio, 1);
+
+	usleep_range(1000, 2000);
+	if (!IS_ERR(hm5040->pwdn_gpio))
+		gpiod_set_value_cansleep(hm5040->pwdn_gpio, 1);
+
+	/* export gpio */
+	if (!IS_ERR(hm5040->reset_gpio))
+		gpiod_export(hm5040->reset_gpio, false);
+	if (!IS_ERR(hm5040->pwdn_gpio))
+		gpiod_export(hm5040->pwdn_gpio, false);
+
+	/* 8192 cycles prior to first SCCB transaction */
+	delay_us = hm5040_cal_delay(8192);
+	usleep_range(delay_us, delay_us * 2);
+	usleep_range(10000, 20000);
+	return 0;
+
+disable_clk:
+	clk_disable_unprepare(hm5040->xvclk);
+
+	return ret;
+}
+
+static void __hm5040_power_off(struct hm5040 *hm5040)
+{
+	int ret;
+	struct device *dev = &hm5040->client->dev;
+
+	if (!IS_ERR(hm5040->pwdn_gpio))
+		gpiod_set_value_cansleep(hm5040->pwdn_gpio, 0);
+	clk_disable_unprepare(hm5040->xvclk);
+	if (!IS_ERR(hm5040->reset_gpio))
+		gpiod_set_value_cansleep(hm5040->reset_gpio, 0);
+	if (!IS_ERR_OR_NULL(hm5040->pins_sleep)) {
+		ret = pinctrl_select_state(hm5040->pinctrl,
+					   hm5040->pins_sleep);
+		if (ret < 0)
+			dev_dbg(dev, "could not set pins\n");
+	}
+	if (!IS_ERR(hm5040->power_gpio))
+		gpiod_set_value_cansleep(hm5040->power_gpio, 0);
+
+	regulator_bulk_disable(HM5040_NUM_SUPPLIES, hm5040->supplies);
+}
+
+static int hm5040_runtime_resume(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct hm5040 *hm5040 = to_hm5040(sd);
+
+	return __hm5040_power_on(hm5040);
+}
+
+static int hm5040_runtime_suspend(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct hm5040 *hm5040 = to_hm5040(sd);
+
+	__hm5040_power_off(hm5040);
+
+	return 0;
+}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static int hm5040_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
+{
+	struct hm5040 *hm5040 = to_hm5040(sd);
+	struct v4l2_mbus_framefmt *try_fmt =
+				v4l2_subdev_get_try_format(sd, fh->pad, 0);
+	const struct hm5040_mode *def_mode = &supported_modes[0];
+
+	mutex_lock(&hm5040->mutex);
+	/* Initialize try_fmt */
+	try_fmt->width = def_mode->width;
+	try_fmt->height = def_mode->height;
+	try_fmt->code = MEDIA_BUS_FMT_SBGGR10_1X10;
+	try_fmt->field = V4L2_FIELD_NONE;
+
+	mutex_unlock(&hm5040->mutex);
+	/* No crop or compose */
+
+	return 0;
+}
+#endif
+
+static int hm5040_enum_frame_interval(struct v4l2_subdev *sd,
+				       struct v4l2_subdev_pad_config *cfg,
+				       struct v4l2_subdev_frame_interval_enum *fie)
+{
+	struct hm5040 *hm5040 = to_hm5040(sd);
+
+	if (fie->index >= hm5040->cfg_num)
+		return -EINVAL;
+
+	if (fie->code != MEDIA_BUS_FMT_SBGGR10_1X10)
+		return -EINVAL;
+
+	fie->width = supported_modes[fie->index].width;
+	fie->height = supported_modes[fie->index].height;
+	fie->interval = supported_modes[fie->index].max_fps;
+	return 0;
+}
+
+static int hm5040_g_mbus_config(struct v4l2_subdev *sd,
+				struct v4l2_mbus_config *config)
+{
+	u32 val = 0;
+
+	val = 1 << (HM5040_LANES - 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 hm5040_pm_ops = {
+	SET_RUNTIME_PM_OPS(hm5040_runtime_suspend,
+			   hm5040_runtime_resume, NULL)
+};
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static const struct v4l2_subdev_internal_ops hm5040_internal_ops = {
+	.open = hm5040_open,
+};
+#endif
+
+static const struct v4l2_subdev_core_ops hm5040_core_ops = {
+	.s_power = hm5040_s_power,
+	.ioctl = hm5040_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = hm5040_compat_ioctl32,
+#endif
+};
+
+static const struct v4l2_subdev_video_ops hm5040_video_ops = {
+	.s_stream = hm5040_s_stream,
+	.g_frame_interval = hm5040_g_frame_interval,
+	.g_mbus_config = hm5040_g_mbus_config,
+};
+
+static const struct v4l2_subdev_pad_ops hm5040_pad_ops = {
+	.enum_mbus_code = hm5040_enum_mbus_code,
+	.enum_frame_size = hm5040_enum_frame_sizes,
+	.enum_frame_interval = hm5040_enum_frame_interval,
+	.get_fmt = hm5040_get_fmt,
+	.set_fmt = hm5040_set_fmt,
+};
+
+static const struct v4l2_subdev_ops hm5040_subdev_ops = {
+	.core	= &hm5040_core_ops,
+	.video	= &hm5040_video_ops,
+	.pad	= &hm5040_pad_ops,
+};
+
+/* real analog gain * 100 values*/
+const struct gain_table_t hm5040_again_table[] = {
+//0x0204/0x0205
+	{0x00, 100},
+	{0x10, 107},
+	{0x20, 110},
+	{0x30, 120},
+	{0x40, 130},
+	{0x50, 150},
+	{0x60, 160},
+	{0x70, 180},
+	{0x80, 200},
+	{0x90, 230},
+	{0xA0, 270},
+	{0xB0, 320},
+	{0xC0, 400},
+	{0xD0, 533},
+	{0xE0, 800},
+	{0xE4, 910},
+	{0xE8, 1070},
+	{0xEC, 1280},
+	{0xF0, 1600},
+};
+
+const struct gain_table_t hm5040_dgain_table[] = {
+	{0x00, 100},
+	{0x08, 103},
+	{0x10, 106},
+	{0x18, 109},
+	{0x20, 113},
+	{0x28, 116},
+	{0x30, 119},
+	{0x38, 122},
+	{0x40, 125},
+	{0x48, 128},
+	{0x50, 131},
+	{0x58, 134},
+	{0x60, 138},
+	{0x68, 141},
+	{0x70, 144},
+	{0x78, 147},
+	{0x80, 150},
+	{0x88, 153},
+	{0x90, 156},
+	{0x98, 159},
+	{0xA0, 163},
+	{0xA8, 166},
+	{0xB0, 169},
+	{0xB8, 172},
+	{0xC0, 175},
+	{0xC8, 178},
+	{0xD0, 181},
+	{0xD8, 184},
+	{0xE0, 188},
+	{0xE8, 191},
+	{0xF0, 194},
+	{0xF8, 197},
+};
+
+static int hm5040_set_gain_reg(struct hm5040 *hm5040, u32 a_gain)
+{
+	struct i2c_client *client = hm5040->client;
+	int ret = 0, i = 0;
+	u32 temp_gain = 0, reg_again = 0, reg_dgain = 0;
+
+	//To find the approximate coarse gain
+	for (i = ARRAY_SIZE(hm5040_again_table) - 1; i > 0 ; i--) {
+		if (a_gain >= hm5040_again_table[i].gain_value)
+			break;
+	}
+
+	reg_again = hm5040_again_table[i].reg_gain;
+
+	temp_gain = (a_gain * 100) / reg_again;
+	dev_dbg(&client->dev, "temp_d_gain 0x%x\n", temp_gain);
+
+	//use the fine gain to fix
+	for (i = ARRAY_SIZE(hm5040_dgain_table) - 1; i > 0; i--) {
+		if (temp_gain >= hm5040_dgain_table[i].gain_value)
+			break;
+	}
+
+	reg_dgain = hm5040_dgain_table[i].reg_gain;
+
+	ret = hm5040_write_reg(hm5040->client, HM5040_A_GAIN_L,
+			       HM5040_REG_VALUE_08BIT, reg_again);
+	ret |= hm5040_write_reg(hm5040->client, HM5040_D_GAIN_GREENR_L,
+				HM5040_REG_VALUE_08BIT, reg_dgain);
+	ret |= hm5040_write_reg(hm5040->client, HM5040_D_GAIN_RED_L,
+				HM5040_REG_VALUE_08BIT, reg_dgain);
+	ret |= hm5040_write_reg(hm5040->client, HM5040_D_GAIN_BLUE_L,
+				HM5040_REG_VALUE_08BIT, reg_dgain);
+	ret |= hm5040_write_reg(hm5040->client, HM5040_D_GAIN_GREENB_L,
+				HM5040_REG_VALUE_08BIT, reg_dgain);
+
+	dev_dbg(&client->dev, "reg_again:0x%x, reg_dgain:0x%x\n",
+		 reg_again, reg_dgain);
+
+	return ret;
+}
+
+static int hm5040_set_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct hm5040 *hm5040 = container_of(ctrl->handler,
+					     struct hm5040, ctrl_handler);
+	struct i2c_client *client = hm5040->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 = hm5040->cur_mode->height + ctrl->val - 4;
+		__v4l2_ctrl_modify_range(hm5040->exposure,
+					 hm5040->exposure->minimum, max,
+					 hm5040->exposure->step,
+					 hm5040->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 */
+		/*group */
+		dev_dbg(&client->dev, "set exposure value 0x%x\n", ctrl->val);
+		ret = hm5040_write_reg(hm5040->client, HM5040_REG_GROUP,
+				       HM5040_REG_VALUE_08BIT, 0x01);
+		ret |= hm5040_write_reg(hm5040->client, HM5040_REG_EXPOSURE,
+					HM5040_REG_VALUE_16BIT, ctrl->val);
+		ret |= hm5040_write_reg(hm5040->client, HM5040_REG_GROUP,
+					HM5040_REG_VALUE_08BIT, 0x00);
+		break;
+
+	case V4L2_CID_ANALOGUE_GAIN:
+		/*group */
+		dev_dbg(&client->dev, "set analog gain value 0x%x\n", ctrl->val);
+		ret = hm5040_write_reg(hm5040->client, HM5040_REG_GROUP,
+				       HM5040_REG_VALUE_08BIT, 0x01);
+		ret |= hm5040_set_gain_reg(hm5040, ctrl->val);
+		ret |= hm5040_write_reg(hm5040->client, HM5040_REG_GROUP,
+					HM5040_REG_VALUE_08BIT, 0x00);
+		break;
+
+	case V4L2_CID_VBLANK:
+		dev_dbg(&client->dev, "set vb value 0x%x\n", ctrl->val);
+		ret = hm5040_write_reg(hm5040->client, HM5040_REG_VTS,
+				       HM5040_REG_VALUE_16BIT,
+				       ctrl->val + hm5040->cur_mode->height);
+		break;
+	case V4L2_CID_TEST_PATTERN:
+		ret = hm5040_enable_test_pattern(hm5040, 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 hm5040_ctrl_ops = {
+	.s_ctrl = hm5040_set_ctrl,
+};
+
+static int hm5040_initialize_controls(struct hm5040 *hm5040)
+{
+	const struct hm5040_mode *mode;
+	struct v4l2_ctrl_handler *handler;
+	struct v4l2_ctrl *ctrl;
+	s64 exposure_max, vblank_def;
+	u32 h_blank;
+	int ret;
+
+	handler = &hm5040->ctrl_handler;
+	mode = hm5040->cur_mode;
+	ret = v4l2_ctrl_handler_init(handler, 8);
+	if (ret)
+		return ret;
+	handler->lock = &hm5040->mutex;
+
+	ctrl = v4l2_ctrl_new_int_menu(handler, NULL, V4L2_CID_LINK_FREQ,
+				      0, 0, link_freq_menu_items);
+	if (ctrl)
+		ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+
+	v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE,
+			  0, hm5040->pixel_rate, 1, hm5040->pixel_rate);
+
+	h_blank = mode->hts_def - mode->width;
+	hm5040->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
+				h_blank, h_blank, 1, h_blank);
+	if (hm5040->hblank)
+		hm5040->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+
+	vblank_def = mode->vts_def - mode->height;
+	hm5040->vblank = v4l2_ctrl_new_std(handler, &hm5040_ctrl_ops,
+				V4L2_CID_VBLANK, vblank_def,
+				HM5040_VTS_MAX - mode->height,
+				1, vblank_def);
+
+	exposure_max = mode->vts_def - 4;
+	hm5040->exposure = v4l2_ctrl_new_std(handler, &hm5040_ctrl_ops,
+				V4L2_CID_EXPOSURE, HM5040_EXPOSURE_MIN,
+				exposure_max, HM5040_EXPOSURE_STEP,
+				mode->exp_def);
+
+	hm5040->anal_gain = v4l2_ctrl_new_std(handler, &hm5040_ctrl_ops,
+				V4L2_CID_ANALOGUE_GAIN, ANALOG_GAIN_MIN,
+				ANALOG_GAIN_MAX, ANALOG_GAIN_STEP,
+				ANALOG_GAIN_DEFAULT);
+
+	hm5040->test_pattern = v4l2_ctrl_new_std_menu_items(handler,
+				&hm5040_ctrl_ops, V4L2_CID_TEST_PATTERN,
+				ARRAY_SIZE(hm5040_test_pattern_menu) - 1,
+				0, 0, hm5040_test_pattern_menu);
+
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(&hm5040->client->dev,
+			"Failed to init controls(%d)\n", ret);
+		goto err_free_handler;
+	}
+
+	hm5040->subdev.ctrl_handler = handler;
+
+	return 0;
+
+err_free_handler:
+	v4l2_ctrl_handler_free(handler);
+
+	return ret;
+}
+
+static int hm5040_check_sensor_id(struct hm5040 *hm5040,
+				  struct i2c_client *client)
+{
+	struct device *dev = &hm5040->client->dev;
+	u32 id = 0;
+	int ret;
+
+	ret = hm5040_read_reg(client, HM5040_REG_CHIP_ID,
+			      HM5040_REG_VALUE_16BIT, &id);
+	if (id != CHIP_ID) {
+		dev_err(dev, "Unexpected sensor id(%06x), ret(%d)\n", id, ret);
+		return -ENODEV;
+	}
+
+	dev_info(dev, "Detected OV%06x sensor\n", CHIP_ID);
+
+	return 0;
+}
+
+static int hm5040_configure_regulators(struct hm5040 *hm5040)
+{
+	unsigned int i;
+
+	for (i = 0; i < HM5040_NUM_SUPPLIES; i++)
+		hm5040->supplies[i].supply = hm5040_supply_names[i];
+
+	return devm_regulator_bulk_get(&hm5040->client->dev,
+				       HM5040_NUM_SUPPLIES,
+				       hm5040->supplies);
+}
+
+static int hm5040_parse_of(struct hm5040 *hm5040)
+{
+	struct device *dev = &hm5040->client->dev;
+	struct device_node *endpoint;
+	struct fwnode_handle *fwnode;
+	int rval;
+
+	endpoint = of_graph_get_next_endpoint(dev->of_node, NULL);
+	if (!endpoint) {
+		dev_err(dev, "Failed to get endpoint\n");
+		return -EINVAL;
+	}
+	fwnode = of_fwnode_handle(endpoint);
+	rval = fwnode_property_read_u32_array(fwnode, "data-lanes", NULL, 0);
+	if (rval <= 0) {
+		dev_warn(dev, " Get mipi lane num failed!\n");
+		return -1;
+	}
+
+	hm5040->lane_num = rval;
+	if (2 == hm5040->lane_num) {
+		hm5040->cur_mode = &supported_modes_2lane[0];
+		supported_modes = supported_modes_2lane;
+		hm5040->cfg_num = ARRAY_SIZE(supported_modes_2lane);
+
+		/* pixel rate = link frequency * 2 * lanes / BITS_PER_SAMPLE */
+		hm5040->pixel_rate = MIPI_FREQ * 2U * hm5040->lane_num * 2U / 8U;
+		dev_info(dev, "lane_num(%d)  pixel_rate(%u)\n",
+				 hm5040->lane_num, hm5040->pixel_rate);
+	} else {
+		dev_err(dev, "unsupported lane_num(%d)\n", hm5040->lane_num);
+		return -1;
+	}
+
+	return 0;
+}
+
+static int hm5040_probe(struct i2c_client *client,
+			const struct i2c_device_id *id)
+{
+	struct device *dev = &client->dev;
+	struct device_node *node = dev->of_node;
+	struct hm5040 *hm5040;
+	struct v4l2_subdev *sd;
+	char facing[2] = "b";
+	int ret;
+
+	dev_info(dev, "driver version: %02x.%02x.%02x",
+		DRIVER_VERSION >> 16,
+		(DRIVER_VERSION & 0xff00) >> 8,
+		DRIVER_VERSION & 0x00ff);
+
+	hm5040 = devm_kzalloc(dev, sizeof(*hm5040), GFP_KERNEL);
+	if (!hm5040)
+		return -ENOMEM;
+
+	ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
+				   &hm5040->module_index);
+	if (ret) {
+		dev_warn(dev, "could not get module index!\n");
+		hm5040->module_index = 0;
+	}
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
+				       &hm5040->module_facing);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME,
+				       &hm5040->module_name);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME,
+				       &hm5040->len_name);
+	if (ret) {
+		dev_err(dev, "could not get module information!\n");
+		return -EINVAL;
+	}
+
+	hm5040->client = client;
+
+	hm5040->xvclk = devm_clk_get(dev, "xvclk");
+	if (IS_ERR(hm5040->xvclk)) {
+		dev_err(dev, "Failed to get xvclk\n");
+		return -EINVAL;
+	}
+
+	hm5040->power_gpio = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW);
+	if (IS_ERR(hm5040->power_gpio))
+		dev_warn(dev, "Failed to get power-gpios, maybe no use\n");
+
+	hm5040->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+	if (IS_ERR(hm5040->reset_gpio))
+		dev_warn(dev, "Failed to get reset-gpios, maybe no use\n");
+
+	hm5040->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW);
+	if (IS_ERR(hm5040->pwdn_gpio))
+		dev_warn(dev, "Failed to get pwdn-gpios\n");
+
+	ret = hm5040_configure_regulators(hm5040);
+	if (ret) {
+		dev_err(dev, "Failed to get power regulators\n");
+		return ret;
+	}
+	ret = hm5040_parse_of(hm5040);
+	if (ret != 0)
+		return -EINVAL;
+
+	hm5040->pinctrl = devm_pinctrl_get(dev);
+	if (!IS_ERR(hm5040->pinctrl)) {
+		hm5040->pins_default =
+			pinctrl_lookup_state(hm5040->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_DEFAULT);
+		if (IS_ERR(hm5040->pins_default))
+			dev_err(dev, "could not get default pinstate\n");
+
+		hm5040->pins_sleep =
+			pinctrl_lookup_state(hm5040->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_SLEEP);
+		if (IS_ERR(hm5040->pins_sleep))
+			dev_err(dev, "could not get sleep pinstate\n");
+	}
+
+	mutex_init(&hm5040->mutex);
+
+	sd = &hm5040->subdev;
+	v4l2_i2c_subdev_init(sd, client, &hm5040_subdev_ops);
+	ret = hm5040_initialize_controls(hm5040);
+	if (ret)
+		goto err_destroy_mutex;
+
+	ret = __hm5040_power_on(hm5040);
+	if (ret)
+		goto err_free_handler;
+
+	ret = hm5040_check_sensor_id(hm5040, client);
+	if (ret < 0) {
+		dev_info(&client->dev, "%s(%d) Check id  failed\n"
+				  "check following information:\n"
+				  "Power/PowerDown/Reset/Mclk/I2cBus !!\n",
+				  __func__, __LINE__);
+		goto err_power_off;
+	}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+	sd->internal_ops = &hm5040_internal_ops;
+	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
+		     V4L2_SUBDEV_FL_HAS_EVENTS;
+#endif
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	hm5040->pad.flags = MEDIA_PAD_FL_SOURCE;
+	sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
+	ret = media_entity_pads_init(&sd->entity, 1, &hm5040->pad);
+	if (ret < 0)
+		goto err_power_off;
+#endif
+
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(hm5040->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s",
+		 hm5040->module_index, facing,
+		 HM5040_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:
+	__hm5040_power_off(hm5040);
+err_free_handler:
+	v4l2_ctrl_handler_free(&hm5040->ctrl_handler);
+err_destroy_mutex:
+	mutex_destroy(&hm5040->mutex);
+
+	return ret;
+}
+
+static int hm5040_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct hm5040 *hm5040 = to_hm5040(sd);
+
+	v4l2_async_unregister_subdev(sd);
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	media_entity_cleanup(&sd->entity);
+#endif
+	v4l2_ctrl_handler_free(&hm5040->ctrl_handler);
+	mutex_destroy(&hm5040->mutex);
+
+	pm_runtime_disable(&client->dev);
+	if (!pm_runtime_status_suspended(&client->dev))
+		__hm5040_power_off(hm5040);
+	pm_runtime_set_suspended(&client->dev);
+
+	return 0;
+}
+
+#if IS_ENABLED(CONFIG_OF)
+static const struct of_device_id hm5040_of_match[] = {
+	{ .compatible = "himax,hm5040" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, hm5040_of_match);
+#endif
+
+static const struct i2c_device_id hm5040_match_id[] = {
+	{ "himax,hm5040", 0 },
+	{ },
+};
+
+static struct i2c_driver hm5040_i2c_driver = {
+	.driver = {
+		.name = HM5040_NAME,
+		.pm = &hm5040_pm_ops,
+		.of_match_table = of_match_ptr(hm5040_of_match),
+	},
+	.probe		= &hm5040_probe,
+	.remove		= &hm5040_remove,
+	.id_table	= hm5040_match_id,
+};
+
+static int __init sensor_mod_init(void)
+{
+	return i2c_add_driver(&hm5040_i2c_driver);
+}
+
+static void __exit sensor_mod_exit(void)
+{
+	i2c_del_driver(&hm5040_i2c_driver);
+}
+
+device_initcall_sync(sensor_mod_init);
+module_exit(sensor_mod_exit);
+
+MODULE_DESCRIPTION("HiMax hm5040 sensor driver");
+MODULE_LICENSE("GPL v2");

commit 1e1aad4a822c9c6acf6181a6e5bba0ff99577c3e
Author: Kyle Tso <kyletso@google.com>
Date:   Sun Jun 6 16:14:52 2021 +0800

    UPSTREAM: usb: typec: tcpm: Do not finish VDM AMS for retrying Responses
    
    If the VDM responses couldn't be sent successfully, it doesn't need to
    finish the AMS until the retry count reaches the limit.
    
    Fixes: 0908c5aca31e ("usb: typec: tcpm: AMS and Collision Avoidance")
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    Cc: stable <stable@vger.kernel.org>
    Acked-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
    Signed-off-by: Kyle Tso <kyletso@google.com>
    Link: https://lore.kernel.org/r/20210606081452.764032-1-kyletso@google.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Wang Jie <dave.wang@rock-chips.com>
    Change-Id: Ida18c423bcc587bb217a61522ff5a4212f92ce2c
    (cherry picked from commit 5ab14ab1f2db24ffae6c5c39a689660486962e6e)

diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index dab388bd8f5e..3d368437e411 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -1697,6 +1697,9 @@ static void vdm_run_state_machine(struct tcpm_port *port)
 			tcpm_log(port, "VDM Tx error, retry");
 			port->vdm_retries++;
 			port->vdm_state = VDM_STATE_READY;
+			if (PD_VDO_SVDM(vdo_hdr) && PD_VDO_CMDT(vdo_hdr) == CMDT_INIT)
+				tcpm_ams_finish(port);
+		} else {
 			tcpm_ams_finish(port);
 		}
 		break;

commit f8b664eac27d4a56c5ed3a071578fcf7c494c93a
Author: Badhri Jagan Sridharan <badhri@google.com>
Date:   Wed Mar 17 23:48:05 2021 -0700

    UPSTREAM: usb: typec: tcpm: Skip sink_cap query only when VDM sm is busy
    
    When port partner responds "Not supported" to the DiscIdentity command,
    VDM state machine can remain in NVDM_STATE_ERR_TMOUT and this causes
    querying sink cap to be skipped indefinitely. Hence check for
    vdm_sm_running instead of checking for VDM_STATE_DONE.
    
    Change-Id: Ie73eed677050a4ef15f2d36e159bf7e9c3879bfb
    Fixes: 8dc4bd073663f ("usb: typec: tcpm: Add support for Sink Fast Role SWAP(FRS)")
    Acked-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
    Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210318064805.3747831-1-badhri@google.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Wang Jie <dave.wang@rock-chips.com>
    (cherry picked from commit 2b8c956ea6ba896ec18ae36c2684ecfa04c1f479)

diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index 3e0756c7026c..dab388bd8f5e 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -4655,7 +4655,7 @@ static void tcpm_enable_frs_work(struct kthread_work *work)
 		goto unlock;
 
 	/* Send when the state machine is idle */
-	if (port->state != SNK_READY || port->vdm_state != VDM_STATE_DONE || port->send_discover)
+	if (port->state != SNK_READY || port->vdm_sm_running || port->send_discover)
 		goto resched;
 
 	port->upcoming_state = GET_SINK_CAP;

commit 8c71e3ffce9468ba64e0c9eb1cdb59117ba0c676
Author: Kyle Tso <kyletso@google.com>
Date:   Thu Jan 14 22:50:53 2021 +0800

    BACKPORT: usb: typec: tcpm: Respond Wait if VDM state machine is running
    
    Port partner could send PR_SWAP/DR_SWAP/VCONN_SWAP/Request just after it
    enters Ready states. This will cause conficts if the port is going to
    send DISC_IDENT in the Ready states of TCPM. Set a flag indicating that
    the state machine is processing VDM and respond Wait messages until the
    VDM state machine stops.
    
    Tested-by: Hans de Goede <hdegoede@redhat.com>
    Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
    Signed-off-by: Kyle Tso <kyletso@google.com>
    Link: https://lore.kernel.org/r/20210114145053.1952756-4-kyletso@google.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Wang Jie <dave.wang@rock-chips.com>
    Change-Id: I5d0c8106e5ed0c8cfeb65db6771a6a113972475f
    (cherry picked from commit 8d3a0578ad1aaadb1c2a2fcc4c51454cbbce2eca)

diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index 0cae188136f7..3e0756c7026c 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -330,6 +330,7 @@ struct tcpm_port {
 	struct hrtimer enable_frs_timer;
 	struct kthread_work enable_frs;
 	bool state_machine_running;
+	bool vdm_sm_running;
 
 	struct completion tx_complete;
 	enum tcpm_transmit_status tx_status;
@@ -1484,6 +1485,7 @@ static int tcpm_pd_svdm(struct tcpm_port *port, const __le32 *payload, int cnt,
 				rlen = 1;
 			} else {
 				tcpm_register_partner_altmodes(port);
+				port->vdm_sm_running = false;
 			}
 			break;
 		case CMD_ENTER_MODE:
@@ -1525,8 +1527,10 @@ static int tcpm_pd_svdm(struct tcpm_port *port, const __le32 *payload, int cnt,
 		default:
 			break;
 		}
+		port->vdm_sm_running = false;
 		break;
 	default:
+		port->vdm_sm_running = false;
 		break;
 	}
 
@@ -1633,6 +1637,8 @@ static void vdm_run_state_machine(struct tcpm_port *port)
 			switch (PD_VDO_CMD(vdo_hdr)) {
 			case CMD_DISCOVER_IDENT:
 				res = tcpm_ams_start(port, DISCOVER_IDENTITY);
+				if (res == 0)
+					port->send_discover = false;
 				break;
 			case CMD_DISCOVER_SVID:
 				res = tcpm_ams_start(port, DISCOVER_SVIDS);
@@ -1657,8 +1663,10 @@ static void vdm_run_state_machine(struct tcpm_port *port)
 				break;
 			}
 
-			if (res < 0)
+			if (res < 0) {
+				port->vdm_sm_running = false;
 				return;
+			}
 		}
 
 		port->vdm_state = VDM_STATE_SEND_MESSAGE;
@@ -1737,6 +1745,9 @@ static void vdm_state_machine_work(struct kthread_work *work)
 		 port->vdm_state != VDM_STATE_BUSY &&
 		 port->vdm_state != VDM_STATE_SEND_MESSAGE);
 
+	if (port->vdm_state == VDM_STATE_ERR_TMOUT)
+		port->vdm_sm_running = false;
+
 	mutex_unlock(&port->lock);
 }
 
@@ -2023,6 +2034,12 @@ static void tcpm_pd_data_request(struct tcpm_port *port,
 			port->negotiated_rev = rev;
 
 		port->sink_request = le32_to_cpu(msg->payload[0]);
+
+		if (port->vdm_sm_running && port->explicit_contract) {
+			tcpm_queue_message(port, PD_MSG_CTRL_WAIT);
+			break;
+		}
+
 		tcpm_set_state(port, SRC_NEGOTIATE_CAPABILITIES, 0);
 		break;
 	case PD_DATA_SINK_CAP:
@@ -2119,6 +2136,10 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
 						       port->current_limit,
 						       port->supply_voltage);
 				port->explicit_contract = true;
+				/* Set VDM running flag ASAP */
+				if (port->data_role == TYPEC_HOST &&
+				    port->send_discover)
+					port->vdm_sm_running = true;
 				tcpm_set_state(port, SNK_READY, 0);
 			} else {
 				/*
@@ -2151,10 +2172,14 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
 		switch (port->state) {
 		case SNK_NEGOTIATE_CAPABILITIES:
 			/* USB PD specification, Figure 8-43 */
-			if (port->explicit_contract)
+			if (port->explicit_contract) {
 				next_state = SNK_READY;
-			else
+				if (port->data_role == TYPEC_HOST &&
+				    port->send_discover)
+					port->vdm_sm_running = true;
+			} else {
 				next_state = SNK_WAIT_CAPABILITIES;
+			}
 			tcpm_set_state(port, next_state, 0);
 			break;
 		case SNK_NEGOTIATE_PPS_CAPABILITIES:
@@ -2163,6 +2188,11 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
 			port->pps_data.op_curr = port->current_limit;
 			port->pps_status = (type == PD_CTRL_WAIT ?
 					    -EAGAIN : -EOPNOTSUPP);
+
+			if (port->data_role == TYPEC_HOST &&
+			    port->send_discover)
+				port->vdm_sm_running = true;
+
 			tcpm_set_state(port, SNK_READY, 0);
 			break;
 		case DR_SWAP_SEND:
@@ -2216,6 +2246,10 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
 			}
 			break;
 		case DR_SWAP_SEND:
+			if (port->data_role == TYPEC_DEVICE &&
+			    port->send_discover)
+				port->vdm_sm_running = true;
+
 			tcpm_set_state(port, DR_SWAP_CHANGE_DR, 0);
 			break;
 		case PR_SWAP_SEND:
@@ -2247,6 +2281,10 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
 		switch (port->state) {
 		case SRC_READY:
 		case SNK_READY:
+			if (port->vdm_sm_running) {
+				tcpm_queue_message(port, PD_MSG_CTRL_WAIT);
+				break;
+			}
 			tcpm_set_state(port, DR_SWAP_ACCEPT, 0);
 			break;
 		default:
@@ -2262,6 +2300,10 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
 		switch (port->state) {
 		case SRC_READY:
 		case SNK_READY:
+			if (port->vdm_sm_running) {
+				tcpm_queue_message(port, PD_MSG_CTRL_WAIT);
+				break;
+			}
 			tcpm_set_state(port, PR_SWAP_ACCEPT, 0);
 			break;
 		default:
@@ -2273,6 +2315,10 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
 		switch (port->state) {
 		case SRC_READY:
 		case SNK_READY:
+			if (port->vdm_sm_running) {
+				tcpm_queue_message(port, PD_MSG_CTRL_WAIT);
+				break;
+			}
 			tcpm_set_state(port, VCONN_SWAP_ACCEPT, 0);
 			break;
 		default:
@@ -3092,6 +3138,7 @@ static void tcpm_reset_port(struct tcpm_port *port)
 {
 	port->in_ams = false;
 	port->ams = NONE_AMS;
+	port->vdm_sm_running = false;
 	tcpm_unregister_altmodes(port);
 	tcpm_typec_disconnect(port);
 	port->attached = false;
@@ -3849,6 +3896,9 @@ static void run_state_machine(struct tcpm_port *port)
 		break;
 	case DR_SWAP_ACCEPT:
 		tcpm_pd_send_control(port, PD_CTRL_ACCEPT);
+		/* Set VDM state machine running flag ASAP */
+		if (port->data_role == TYPEC_DEVICE && port->send_discover)
+			port->vdm_sm_running = true;
 		tcpm_set_state_cond(port, DR_SWAP_CHANGE_DR, 0);
 		break;
 	case DR_SWAP_SEND_TIMEOUT:
@@ -3989,6 +4039,8 @@ static void run_state_machine(struct tcpm_port *port)
 		break;
 	case VCONN_SWAP_SEND_TIMEOUT:
 		tcpm_swap_complete(port, -ETIMEDOUT);
+		if (port->data_role == TYPEC_HOST && port->send_discover)
+			port->vdm_sm_running = true;
 		tcpm_set_state(port, ready_state(port), 0);
 		break;
 	case VCONN_SWAP_START:
@@ -4004,10 +4056,14 @@ static void run_state_machine(struct tcpm_port *port)
 	case VCONN_SWAP_TURN_ON_VCONN:
 		tcpm_set_vconn(port, true);
 		tcpm_pd_send_control(port, PD_CTRL_PS_RDY);
+		if (port->data_role == TYPEC_HOST && port->send_discover)
+			port->vdm_sm_running = true;
 		tcpm_set_state(port, ready_state(port), 0);
 		break;
 	case VCONN_SWAP_TURN_OFF_VCONN:
 		tcpm_set_vconn(port, false);
+		if (port->data_role == TYPEC_HOST && port->send_discover)
+			port->vdm_sm_running = true;
 		tcpm_set_state(port, ready_state(port), 0);
 		break;
 
@@ -4015,6 +4071,8 @@ static void run_state_machine(struct tcpm_port *port)
 	case PR_SWAP_CANCEL:
 	case VCONN_SWAP_CANCEL:
 		tcpm_swap_complete(port, port->swap_status);
+		if (port->data_role == TYPEC_HOST && port->send_discover)
+			port->vdm_sm_running = true;
 		if (port->pwr_role == TYPEC_SOURCE)
 			tcpm_set_state(port, SRC_READY, 0);
 		else
@@ -4316,6 +4374,9 @@ static void _tcpm_pd_vbus_on(struct tcpm_port *port)
 	switch (port->state) {
 	case SNK_TRANSITION_SINK_VBUS:
 		port->explicit_contract = true;
+		/* Set the VDM flag ASAP */
+		if (port->data_role == TYPEC_HOST && port->send_discover)
+			port->vdm_sm_running = true;
 		tcpm_set_state(port, SNK_READY, 0);
 		break;
 	case SNK_DISCOVERY:

commit b593b3e65ca9e07a58fff6dbd9b9293dfa14ec00
Author: Kyle Tso <kyletso@google.com>
Date:   Thu Jan 14 22:50:51 2021 +0800

    BACKPORT: usb: typec: tcpm: AMS and Collision Avoidance
    
    This patch provides the implementation of Collision Avoidance introduced
    in PD3.0. The start of each Atomic Message Sequence (AMS) initiated by
    the port will be denied if the current AMS is not interruptible. The
    Source port will set the CC to SinkTxNG if it is going to initiate an
    AMS, and SinkTxOk otherwise. Meanwhile, any AMS initiated by a Sink port
    will be denied in TCPM if the port partner (Source) sets SinkTxNG except
    for HARD_RESET and SOFT_RESET.
    
    Tested-by: Hans de Goede <hdegoede@redhat.com>
    Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
    Signed-off-by: Kyle Tso <kyletso@google.com>
    Link: https://lore.kernel.org/r/20210114145053.1952756-2-kyletso@google.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Wang Jie <dave.wang@rock-chips.com>
    Change-Id: Id0531c88ab8612745e042699a60f8a794415db36
    (cherry picked from commit 0908c5aca31eb5e0c72d7a5dba422629b88e877d)

diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index 3ac8d08343e7..0cae188136f7 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -75,6 +75,8 @@
 	S(SNK_HARD_RESET_SINK_ON),		\
 						\
 	S(SOFT_RESET),				\
+	S(SRC_SOFT_RESET_WAIT_SNK_TX),		\
+	S(SNK_SOFT_RESET),			\
 	S(SOFT_RESET_SEND),			\
 						\
 	S(DR_SWAP_ACCEPT),			\
@@ -138,7 +140,45 @@
 						\
 	S(ERROR_RECOVERY),			\
 	S(PORT_RESET),				\
-	S(PORT_RESET_WAIT_OFF)
+	S(PORT_RESET_WAIT_OFF),			\
+						\
+	S(AMS_START)
+
+#define FOREACH_AMS(S)				\
+	S(NONE_AMS),				\
+	S(POWER_NEGOTIATION),			\
+	S(GOTOMIN),				\
+	S(SOFT_RESET_AMS),			\
+	S(HARD_RESET),				\
+	S(CABLE_RESET),				\
+	S(GET_SOURCE_CAPABILITIES),		\
+	S(GET_SINK_CAPABILITIES),		\
+	S(POWER_ROLE_SWAP),			\
+	S(FAST_ROLE_SWAP),			\
+	S(DATA_ROLE_SWAP),			\
+	S(VCONN_SWAP),				\
+	S(SOURCE_ALERT),			\
+	S(GETTING_SOURCE_EXTENDED_CAPABILITIES),\
+	S(GETTING_SOURCE_SINK_STATUS),		\
+	S(GETTING_BATTERY_CAPABILITIES),	\
+	S(GETTING_BATTERY_STATUS),		\
+	S(GETTING_MANUFACTURER_INFORMATION),	\
+	S(SECURITY),				\
+	S(FIRMWARE_UPDATE),			\
+	S(DISCOVER_IDENTITY),			\
+	S(SOURCE_STARTUP_CABLE_PLUG_DISCOVER_IDENTITY),	\
+	S(DISCOVER_SVIDS),			\
+	S(DISCOVER_MODES),			\
+	S(DFP_TO_UFP_ENTER_MODE),		\
+	S(DFP_TO_UFP_EXIT_MODE),		\
+	S(DFP_TO_CABLE_PLUG_ENTER_MODE),	\
+	S(DFP_TO_CABLE_PLUG_EXIT_MODE),		\
+	S(ATTENTION),				\
+	S(BIST),				\
+	S(UNSTRUCTURED_VDMS),			\
+	S(STRUCTURED_VDMS),			\
+	S(COUNTRY_INFO),			\
+	S(COUNTRY_CODES)
 
 #define GENERATE_ENUM(e)	e
 #define GENERATE_STRING(s)	#s
@@ -151,6 +191,14 @@ static const char * const tcpm_states[] = {
 	FOREACH_STATE(GENERATE_STRING)
 };
 
+enum tcpm_ams {
+	FOREACH_AMS(GENERATE_ENUM)
+};
+
+static const char * const tcpm_ams_str[] = {
+	FOREACH_AMS(GENERATE_STRING)
+};
+
 enum vdm_states {
 	VDM_STATE_ERR_BUSY = -3,
 	VDM_STATE_ERR_SEND = -2,
@@ -160,6 +208,7 @@ enum vdm_states {
 	VDM_STATE_READY = 1,
 	VDM_STATE_BUSY = 2,
 	VDM_STATE_WAIT_RSP_BUSY = 3,
+	VDM_STATE_SEND_MESSAGE = 4,
 };
 
 enum pd_msg_request {
@@ -360,6 +409,11 @@ struct tcpm_port {
 	/* Sink caps have been queried */
 	bool sink_cap_done;
 
+	/* Collision Avoidance and Atomic Message Sequence */
+	enum tcpm_state upcoming_state;
+	enum tcpm_ams ams;
+	bool in_ams;
+
 #ifdef CONFIG_DEBUG_FS
 	struct dentry *dentry;
 	struct mutex logbuffer_lock;	/* log buffer access lock */
@@ -375,6 +429,12 @@ struct pd_rx_event {
 	struct pd_message msg;
 };
 
+static const char * const pd_rev[] = {
+	[PD_REV10]		= "rev1",
+	[PD_REV20]		= "rev2",
+	[PD_REV30]		= "rev3",
+};
+
 #define tcpm_cc_is_sink(cc) \
 	((cc) == TYPEC_CC_RP_DEF || (cc) == TYPEC_CC_RP_1_5 || \
 	 (cc) == TYPEC_CC_RP_3_0)
@@ -411,6 +471,10 @@ struct pd_rx_event {
 	((port)->try_src_count == 0 && (port)->try_role == TYPEC_SOURCE && \
 	(port)->port_type == TYPEC_PORT_DRP)
 
+#define tcpm_sink_tx_ok(port) \
+	(tcpm_port_is_sink(port) && \
+	((port)->cc1 == TYPEC_CC_RP_3_0 || (port)->cc2 == TYPEC_CC_RP_3_0))
+
 static enum tcpm_state tcpm_default_state(struct tcpm_port *port)
 {
 	if (port->port_type == TYPEC_PORT_DRP) {
@@ -654,6 +718,67 @@ static void tcpm_debugfs_exit(const struct tcpm_port *port) { }
 
 #endif
 
+static void tcpm_set_cc(struct tcpm_port *port, enum typec_cc_status cc)
+{
+	tcpm_log(port, "cc:=%d", cc);
+	port->cc_req = cc;
+	port->tcpc->set_cc(port->tcpc, cc);
+}
+
+/*
+ * Determine RP value to set based on maximum current supported
+ * by a port if configured as source.
+ * Returns CC value to report to link partner.
+ */
+static enum typec_cc_status tcpm_rp_cc(struct tcpm_port *port)
+{
+	const u32 *src_pdo = port->src_pdo;
+	int nr_pdo = port->nr_src_pdo;
+	int i;
+
+	/*
+	 * Search for first entry with matching voltage.
+	 * It should report the maximum supported current.
+	 */
+	for (i = 0; i < nr_pdo; i++) {
+		const u32 pdo = src_pdo[i];
+
+		if (pdo_type(pdo) == PDO_TYPE_FIXED &&
+		    pdo_fixed_voltage(pdo) == 5000) {
+			unsigned int curr = pdo_max_current(pdo);
+
+			if (curr >= 3000)
+				return TYPEC_CC_RP_3_0;
+			else if (curr >= 1500)
+				return TYPEC_CC_RP_1_5;
+			return TYPEC_CC_RP_DEF;
+		}
+	}
+
+	return TYPEC_CC_RP_DEF;
+}
+
+static int tcpm_ams_finish(struct tcpm_port *port)
+{
+	int ret = 0;
+
+	tcpm_log(port, "AMS %s finished", tcpm_ams_str[port->ams]);
+
+	if (port->pd_capable && port->pwr_role == TYPEC_SOURCE) {
+		if (port->negotiated_rev >= PD_REV30)
+			tcpm_set_cc(port, SINK_TX_OK);
+		else
+			tcpm_set_cc(port, SINK_TX_NG);
+	} else if (port->pwr_role == TYPEC_SOURCE) {
+		tcpm_set_cc(port, tcpm_rp_cc(port));
+	}
+
+	port->in_ams = false;
+	port->ams = NONE_AMS;
+
+	return ret;
+}
+
 static int tcpm_pd_transmit(struct tcpm_port *port,
 			    enum tcpm_transmit_type type,
 			    const struct pd_message *msg)
@@ -681,13 +806,30 @@ static int tcpm_pd_transmit(struct tcpm_port *port,
 	switch (port->tx_status) {
 	case TCPC_TX_SUCCESS:
 		port->message_id = (port->message_id + 1) & PD_HEADER_ID_MASK;
-		return 0;
+		/*
+		 * USB PD rev 2.0, 8.3.2.2.1:
+		 * USB PD rev 3.0, 8.3.2.1.3:
+		 * "... Note that every AMS is Interruptible until the first
+		 * Message in the sequence has been successfully sent (GoodCRC
+		 * Message received)."
+		 */
+		if (port->ams != NONE_AMS)
+			port->in_ams = true;
+		break;
 	case TCPC_TX_DISCARDED:
-		return -EAGAIN;
+		ret = -EAGAIN;
+		break;
 	case TCPC_TX_FAILED:
 	default:
-		return -EIO;
+		ret = -EIO;
+		break;
 	}
+
+	/* Some AMS don't expect responses. Finish them here. */
+	if (port->ams == ATTENTION || port->ams == SOURCE_ALERT)
+		tcpm_ams_finish(port);
+
+	return ret;
 }
 
 void tcpm_pd_transmit_complete(struct tcpm_port *port,
@@ -792,39 +934,6 @@ static int tcpm_set_current_limit(struct tcpm_port *port, u32 max_ma, u32 mv)
 	return ret;
 }
 
-/*
- * Determine RP value to set based on maximum current supported
- * by a port if configured as source.
- * Returns CC value to report to link partner.
- */
-static enum typec_cc_status tcpm_rp_cc(struct tcpm_port *port)
-{
-	const u32 *src_pdo = port->src_pdo;
-	int nr_pdo = port->nr_src_pdo;
-	int i;
-
-	/*
-	 * Search for first entry with matching voltage.
-	 * It should report the maximum supported current.
-	 */
-	for (i = 0; i < nr_pdo; i++) {
-		const u32 pdo = src_pdo[i];
-
-		if (pdo_type(pdo) == PDO_TYPE_FIXED &&
-		    pdo_fixed_voltage(pdo) == 5000) {
-			unsigned int curr = pdo_max_current(pdo);
-
-			if (curr >= 3000)
-				return TYPEC_CC_RP_3_0;
-			else if (curr >= 1500)
-				return TYPEC_CC_RP_1_5;
-			return TYPEC_CC_RP_DEF;
-		}
-	}
-
-	return TYPEC_CC_RP_DEF;
-}
-
 static int tcpm_set_attached_state(struct tcpm_port *port, bool attached)
 {
 	return port->tcpc->set_roles(port->tcpc, attached, port->pwr_role,
@@ -968,16 +1077,17 @@ static void tcpm_set_state(struct tcpm_port *port, enum tcpm_state state,
 			   unsigned int delay_ms)
 {
 	if (delay_ms) {
-		tcpm_log(port, "pending state change %s -> %s @ %u ms",
-			 tcpm_states[port->state], tcpm_states[state],
-			 delay_ms);
+		tcpm_log(port, "pending state change %s -> %s @ %u ms [%s %s]",
+			 tcpm_states[port->state], tcpm_states[state], delay_ms,
+			 pd_rev[port->negotiated_rev], tcpm_ams_str[port->ams]);
 		port->delayed_state = state;
 		mod_tcpm_delayed_work(port, delay_ms);
 		port->delayed_runtime = ktime_add(ktime_get(), ms_to_ktime(delay_ms));
 		port->delay_ms = delay_ms;
 	} else {
-		tcpm_log(port, "state change %s -> %s",
-			 tcpm_states[port->state], tcpm_states[state]);
+		tcpm_log(port, "state change %s -> %s [%s %s]",
+			 tcpm_states[port->state], tcpm_states[state],
+			 pd_rev[port->negotiated_rev], tcpm_ams_str[port->ams]);
 		port->delayed_state = INVALID_STATE;
 		port->prev_state = port->state;
 		port->state = state;
@@ -999,10 +1109,11 @@ static void tcpm_set_state_cond(struct tcpm_port *port, enum tcpm_state state,
 		tcpm_set_state(port, state, delay_ms);
 	else
 		tcpm_log(port,
-			 "skipped %sstate change %s -> %s [%u ms], context state %s",
+			 "skipped %sstate change %s -> %s [%u ms], context state %s [%s %s]",
 			 delay_ms ? "delayed " : "",
 			 tcpm_states[port->state], tcpm_states[state],
-			 delay_ms, tcpm_states[port->enter_state]);
+			 delay_ms, tcpm_states[port->enter_state],
+			 pd_rev[port->negotiated_rev], tcpm_ams_str[port->ams]);
 }
 
 static void tcpm_queue_message(struct tcpm_port *port,
@@ -1012,6 +1123,149 @@ static void tcpm_queue_message(struct tcpm_port *port,
 	mod_tcpm_delayed_work(port, 0);
 }
 
+static bool tcpm_vdm_ams(struct tcpm_port *port)
+{
+	switch (port->ams) {
+	case DISCOVER_IDENTITY:
+	case SOURCE_STARTUP_CABLE_PLUG_DISCOVER_IDENTITY:
+	case DISCOVER_SVIDS:
+	case DISCOVER_MODES:
+	case DFP_TO_UFP_ENTER_MODE:
+	case DFP_TO_UFP_EXIT_MODE:
+	case DFP_TO_CABLE_PLUG_ENTER_MODE:
+	case DFP_TO_CABLE_PLUG_EXIT_MODE:
+	case ATTENTION:
+	case UNSTRUCTURED_VDMS:
+	case STRUCTURED_VDMS:
+		break;
+	default:
+		return false;
+	}
+
+	return true;
+}
+
+static bool tcpm_ams_interruptible(struct tcpm_port *port)
+{
+	switch (port->ams) {
+	/* Interruptible AMS */
+	case NONE_AMS:
+	case SECURITY:
+	case FIRMWARE_UPDATE:
+	case DISCOVER_IDENTITY:
+	case SOURCE_STARTUP_CABLE_PLUG_DISCOVER_IDENTITY:
+	case DISCOVER_SVIDS:
+	case DISCOVER_MODES:
+	case DFP_TO_UFP_ENTER_MODE:
+	case DFP_TO_UFP_EXIT_MODE:
+	case DFP_TO_CABLE_PLUG_ENTER_MODE:
+	case DFP_TO_CABLE_PLUG_EXIT_MODE:
+	case UNSTRUCTURED_VDMS:
+	case STRUCTURED_VDMS:
+	case COUNTRY_INFO:
+	case COUNTRY_CODES:
+		break;
+	/* Non-Interruptible AMS */
+	default:
+		if (port->in_ams)
+			return false;
+		break;
+	}
+
+	return true;
+}
+
+static int tcpm_ams_start(struct tcpm_port *port, enum tcpm_ams ams)
+{
+	int ret = 0;
+
+	tcpm_log(port, "AMS %s start", tcpm_ams_str[ams]);
+
+	if (!tcpm_ams_interruptible(port) && ams != HARD_RESET) {
+		port->upcoming_state = INVALID_STATE;
+		tcpm_log(port, "AMS %s not interruptible, aborting",
+			 tcpm_ams_str[port->ams]);
+		return -EAGAIN;
+	}
+
+	if (port->pwr_role == TYPEC_SOURCE) {
+		enum typec_cc_status cc_req = port->cc_req;
+
+		port->ams = ams;
+
+		if (ams == HARD_RESET) {
+			tcpm_set_cc(port, tcpm_rp_cc(port));
+			tcpm_pd_transmit(port, TCPC_TX_HARD_RESET, NULL);
+			tcpm_set_state(port, HARD_RESET_START, 0);
+			return ret;
+		} else if (ams == SOFT_RESET_AMS) {
+			if (!port->explicit_contract) {
+				port->upcoming_state = INVALID_STATE;
+				tcpm_set_cc(port, tcpm_rp_cc(port));
+				return ret;
+			}
+		} else if (tcpm_vdm_ams(port)) {
+			/* tSinkTx is enforced in vdm_run_state_machine */
+			if (port->negotiated_rev >= PD_REV30)
+				tcpm_set_cc(port, SINK_TX_NG);
+			return ret;
+		}
+
+		if (port->negotiated_rev >= PD_REV30)
+			tcpm_set_cc(port, SINK_TX_NG);
+
+		switch (port->state) {
+		case SRC_READY:
+		case SRC_STARTUP:
+		case SRC_SOFT_RESET_WAIT_SNK_TX:
+		case SOFT_RESET:
+		case SOFT_RESET_SEND:
+			if (port->negotiated_rev >= PD_REV30)
+				tcpm_set_state(port, AMS_START,
+					       cc_req == SINK_TX_OK ?
+					       PD_T_SINK_TX : 0);
+			else
+				tcpm_set_state(port, AMS_START, 0);
+			break;
+		default:
+			if (port->negotiated_rev >= PD_REV30)
+				tcpm_set_state(port, SRC_READY,
+					       cc_req == SINK_TX_OK ?
+					       PD_T_SINK_TX : 0);
+			else
+				tcpm_set_state(port, SRC_READY, 0);
+			break;
+		}
+	} else {
+		if (port->negotiated_rev >= PD_REV30 &&
+		    !tcpm_sink_tx_ok(port) &&
+		    ams != SOFT_RESET_AMS &&
+		    ams != HARD_RESET) {
+			port->upcoming_state = INVALID_STATE;
+			tcpm_log(port, "Sink TX No Go");
+			return -EAGAIN;
+		}
+
+		port->ams = ams;
+
+		if (ams == HARD_RESET) {
+			tcpm_pd_transmit(port, TCPC_TX_HARD_RESET, NULL);
+			tcpm_set_state(port, HARD_RESET_START, 0);
+			return ret;
+		} else if (tcpm_vdm_ams(port)) {
+			return ret;
+		}
+
+		if (port->state == SNK_READY ||
+		    port->state == SNK_SOFT_RESET)
+			tcpm_set_state(port, AMS_START, 0);
+		else
+			tcpm_set_state(port, SNK_READY, 0);
+	}
+
+	return ret;
+}
+
 /*
  * VDM/VDO handling functions
  */
@@ -1199,6 +1453,8 @@ static int tcpm_pd_svdm(struct tcpm_port *port, const __le32 *payload, int cnt,
 		if (IS_ERR_OR_NULL(port->partner))
 			break;
 
+		tcpm_ams_finish(port);
+
 		switch (cmd) {
 		case CMD_DISCOVER_IDENT:
 			/* 6.4.4.3.1 */
@@ -1257,6 +1513,7 @@ static int tcpm_pd_svdm(struct tcpm_port *port, const __le32 *payload, int cnt,
 		}
 		break;
 	case CMDT_RSP_NAK:
+		tcpm_ams_finish(port);
 		switch (cmd) {
 		case CMD_ENTER_MODE:
 			/* Back to USB Operation */
@@ -1353,7 +1610,8 @@ static unsigned int vdm_ready_timeout(u32 vdm_hdr)
 static void vdm_run_state_machine(struct tcpm_port *port)
 {
 	struct pd_message msg;
-	int i, res;
+	int i, res = 0;
+	u32 vdo_hdr = port->vdo_data[0];
 
 	switch (port->vdm_state) {
 	case VDM_STATE_READY:
@@ -1370,26 +1628,45 @@ static void vdm_run_state_machine(struct tcpm_port *port)
 		if (port->state != SRC_READY && port->state != SNK_READY)
 			break;
 
-		/* Prepare and send VDM */
-		memset(&msg, 0, sizeof(msg));
-		msg.header = PD_HEADER_LE(PD_DATA_VENDOR_DEF,
-					  port->pwr_role,
-					  port->data_role,
-					  port->negotiated_rev,
-					  port->message_id, port->vdo_count);
-		for (i = 0; i < port->vdo_count; i++)
-			msg.payload[i] = cpu_to_le32(port->vdo_data[i]);
-		res = tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
-		if (res < 0) {
-			port->vdm_state = VDM_STATE_ERR_SEND;
-		} else {
-			unsigned long timeout;
+		/* TODO: AMS operation for Unstructured VDM */
+		if (PD_VDO_SVDM(vdo_hdr) && PD_VDO_CMDT(vdo_hdr) == CMDT_INIT) {
+			switch (PD_VDO_CMD(vdo_hdr)) {
+			case CMD_DISCOVER_IDENT:
+				res = tcpm_ams_start(port, DISCOVER_IDENTITY);
+				break;
+			case CMD_DISCOVER_SVID:
+				res = tcpm_ams_start(port, DISCOVER_SVIDS);
+				break;
+			case CMD_DISCOVER_MODES:
+				res = tcpm_ams_start(port, DISCOVER_MODES);
+				break;
+			case CMD_ENTER_MODE:
+				res = tcpm_ams_start(port, DFP_TO_UFP_ENTER_MODE);
+				break;
+			case CMD_EXIT_MODE:
+				res = tcpm_ams_start(port, DFP_TO_UFP_EXIT_MODE);
+				break;
+			case CMD_ATTENTION:
+				res = tcpm_ams_start(port, ATTENTION);
+				break;
+			case VDO_CMD_VENDOR(0) ... VDO_CMD_VENDOR(15):
+				res = tcpm_ams_start(port, STRUCTURED_VDMS);
+				break;
+			default:
+				res = -EOPNOTSUPP;
+				break;
+			}
 
-			port->vdm_retries = 0;
-			port->vdm_state = VDM_STATE_BUSY;
-			timeout = vdm_ready_timeout(port->vdo_data[0]);
-			mod_vdm_delayed_work(port, timeout);
+			if (res < 0)
+				return;
 		}
+
+		port->vdm_state = VDM_STATE_SEND_MESSAGE;
+		mod_vdm_delayed_work(port, (port->negotiated_rev >= PD_REV30 &&
+					    port->pwr_role == TYPEC_SOURCE &&
+					    PD_VDO_SVDM(vdo_hdr) &&
+					    PD_VDO_CMDT(vdo_hdr) == CMDT_INIT) ?
+					   PD_T_SINK_TX : 0);
 		break;
 	case VDM_STATE_WAIT_RSP_BUSY:
 		port->vdo_data[0] = port->vdo_retry;
@@ -1398,6 +1675,8 @@ static void vdm_run_state_machine(struct tcpm_port *port)
 		break;
 	case VDM_STATE_BUSY:
 		port->vdm_state = VDM_STATE_ERR_TMOUT;
+		if (port->ams != NONE_AMS)
+			tcpm_ams_finish(port);
 		break;
 	case VDM_STATE_ERR_SEND:
 		/*
@@ -1410,6 +1689,29 @@ static void vdm_run_state_machine(struct tcpm_port *port)
 			tcpm_log(port, "VDM Tx error, retry");
 			port->vdm_retries++;
 			port->vdm_state = VDM_STATE_READY;
+			tcpm_ams_finish(port);
+		}
+		break;
+	case VDM_STATE_SEND_MESSAGE:
+		/* Prepare and send VDM */
+		memset(&msg, 0, sizeof(msg));
+		msg.header = PD_HEADER_LE(PD_DATA_VENDOR_DEF,
+					  port->pwr_role,
+					  port->data_role,
+					  port->negotiated_rev,
+					  port->message_id, port->vdo_count);
+		for (i = 0; i < port->vdo_count; i++)
+			msg.payload[i] = cpu_to_le32(port->vdo_data[i]);
+		res = tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
+		if (res < 0) {
+			port->vdm_state = VDM_STATE_ERR_SEND;
+		} else {
+			unsigned long timeout;
+
+			port->vdm_retries = 0;
+			port->vdm_state = VDM_STATE_BUSY;
+			timeout = vdm_ready_timeout(vdo_hdr);
+			mod_vdm_delayed_work(port, timeout);
 		}
 		break;
 	default:
@@ -1432,7 +1734,8 @@ static void vdm_state_machine_work(struct kthread_work *work)
 		prev_state = port->vdm_state;
 		vdm_run_state_machine(port);
 	} while (port->vdm_state != prev_state &&
-		 port->vdm_state != VDM_STATE_BUSY);
+		 port->vdm_state != VDM_STATE_BUSY &&
+		 port->vdm_state != VDM_STATE_SEND_MESSAGE);
 
 	mutex_unlock(&port->lock);
 }
@@ -1903,11 +2206,14 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
 		case SOFT_RESET_SEND:
 			port->message_id = 0;
 			port->rx_msgid = -1;
-			if (port->pwr_role == TYPEC_SOURCE)
-				next_state = SRC_SEND_CAPABILITIES;
-			else
-				next_state = SNK_WAIT_CAPABILITIES;
-			tcpm_set_state(port, next_state, 0);
+			if (port->ams == SOFT_RESET_AMS)
+				tcpm_ams_finish(port);
+			if (port->pwr_role == TYPEC_SOURCE) {
+				port->upcoming_state = SRC_SEND_CAPABILITIES;
+				tcpm_ams_start(port, POWER_NEGOTIATION);
+			} else {
+				tcpm_set_state(port, SNK_WAIT_CAPABILITIES, 0);
+			}
 			break;
 		case DR_SWAP_SEND:
 			tcpm_set_state(port, DR_SWAP_CHANGE_DR, 0);
@@ -2666,13 +2972,6 @@ static bool tcpm_start_toggling(struct tcpm_port *port, enum typec_cc_status cc)
 	return ret == 0;
 }
 
-static void tcpm_set_cc(struct tcpm_port *port, enum typec_cc_status cc)
-{
-	tcpm_log(port, "cc:=%d", cc);
-	port->cc_req = cc;
-	port->tcpc->set_cc(port->tcpc, cc);
-}
-
 static int tcpm_init_vbus(struct tcpm_port *port)
 {
 	int ret;
@@ -2791,6 +3090,8 @@ static void tcpm_unregister_altmodes(struct tcpm_port *port)
 
 static void tcpm_reset_port(struct tcpm_port *port)
 {
+	port->in_ams = false;
+	port->ams = NONE_AMS;
 	tcpm_unregister_altmodes(port);
 	tcpm_typec_disconnect(port);
 	port->attached = false;
@@ -2958,6 +3259,7 @@ static void run_state_machine(struct tcpm_port *port)
 	int ret;
 	enum typec_pwr_opmode opmode;
 	unsigned int msecs;
+	enum tcpm_state upcoming_state;
 
 	port->enter_state = port->state;
 	switch (port->state) {
@@ -3060,7 +3362,12 @@ static void run_state_machine(struct tcpm_port *port)
 		port->message_id = 0;
 		port->rx_msgid = -1;
 		port->explicit_contract = false;
-		tcpm_set_state(port, SRC_SEND_CAPABILITIES, 0);
+		/* SNK -> SRC POWER/FAST_ROLE_SWAP finished */
+		if (port->ams == POWER_ROLE_SWAP ||
+		    port->ams == FAST_ROLE_SWAP)
+			tcpm_ams_finish(port);
+		port->upcoming_state = SRC_SEND_CAPABILITIES;
+		tcpm_ams_start(port, POWER_NEGOTIATION);
 		break;
 	case SRC_SEND_CAPABILITIES:
 		port->caps_count++;
@@ -3142,6 +3449,19 @@ static void run_state_machine(struct tcpm_port *port)
 		tcpm_swap_complete(port, 0);
 		tcpm_typec_connect(port);
 
+		if (port->ams != NONE_AMS)
+			tcpm_ams_finish(port);
+		/*
+		 * If previous AMS is interrupted, switch to the upcoming
+		 * state.
+		 */
+		if (port->upcoming_state != INVALID_STATE) {
+			upcoming_state = port->upcoming_state;
+			port->upcoming_state = INVALID_STATE;
+			tcpm_set_state(port, upcoming_state, 0);
+			break;
+		}
+
 		tcpm_check_send_discover(port);
 		/*
 		 * 6.3.5
@@ -3259,6 +3579,12 @@ static void run_state_machine(struct tcpm_port *port)
 		port->message_id = 0;
 		port->rx_msgid = -1;
 		port->explicit_contract = false;
+
+		if (port->ams == POWER_ROLE_SWAP ||
+		    port->ams == FAST_ROLE_SWAP)
+			/* SRC -> SNK POWER/FAST_ROLE_SWAP finished */
+			tcpm_ams_finish(port);
+
 		tcpm_set_state(port, SNK_DISCOVERY, 0);
 		break;
 	case SNK_DISCOVERY:
@@ -3307,7 +3633,7 @@ static void run_state_machine(struct tcpm_port *port)
 		 */
 		if (port->vbus_never_low) {
 			port->vbus_never_low = false;
-			tcpm_set_state(port, SOFT_RESET_SEND,
+			tcpm_set_state(port, SNK_SOFT_RESET,
 				       PD_T_SINK_WAIT_CAP);
 		} else {
 			tcpm_set_state(port, hard_reset_state(port),
@@ -3360,9 +3686,23 @@ static void run_state_machine(struct tcpm_port *port)
 
 		tcpm_swap_complete(port, 0);
 		tcpm_typec_connect(port);
-		tcpm_check_send_discover(port);
 		mod_enable_frs_delayed_work(port, 0);
 		tcpm_pps_complete(port, port->pps_status);
+
+		if (port->ams != NONE_AMS)
+			tcpm_ams_finish(port);
+		/*
+		 * If previous AMS is interrupted, switch to the upcoming
+		 * state.
+		 */
+		if (port->upcoming_state != INVALID_STATE) {
+			upcoming_state = port->upcoming_state;
+			port->upcoming_state = INVALID_STATE;
+			tcpm_set_state(port, upcoming_state, 0);
+			break;
+		}
+
+		tcpm_check_send_discover(port);
 		power_supply_changed(port->psy);
 		break;
 
@@ -3383,8 +3723,14 @@ static void run_state_machine(struct tcpm_port *port)
 
 	/* Hard_Reset states */
 	case HARD_RESET_SEND:
-		tcpm_pd_transmit(port, TCPC_TX_HARD_RESET, NULL);
-		tcpm_set_state(port, HARD_RESET_START, 0);
+		if (port->ams != NONE_AMS)
+			tcpm_ams_finish(port);
+		/*
+		 * State machine will be directed to HARD_RESET_START,
+		 * thus set upcoming_state to INVALID_STATE.
+		 */
+		port->upcoming_state = INVALID_STATE;
+		tcpm_ams_start(port, HARD_RESET);
 		break;
 	case HARD_RESET_START:
 		port->sink_cap_done = false;
@@ -3410,6 +3756,8 @@ static void run_state_machine(struct tcpm_port *port)
 		break;
 	case SRC_HARD_RESET_VBUS_ON:
 		tcpm_set_vbus(port, true);
+		if (port->ams == HARD_RESET)
+			tcpm_ams_finish(port);
 		port->tcpc->set_pd_rx(port->tcpc, true);
 		tcpm_set_attached_state(port, true);
 		tcpm_set_state(port, SRC_UNATTACHED, PD_T_PS_SOURCE_ON);
@@ -3429,6 +3777,8 @@ static void run_state_machine(struct tcpm_port *port)
 		tcpm_set_state(port, SNK_HARD_RESET_SINK_ON, PD_T_SAFE_0V);
 		break;
 	case SNK_HARD_RESET_WAIT_VBUS:
+		if (port->ams == HARD_RESET)
+			tcpm_ams_finish(port);
 		/* Assume we're disconnected if VBUS doesn't come back. */
 		tcpm_set_state(port, SNK_UNATTACHED,
 			       PD_T_SRC_RECOVER_MAX + PD_T_SRC_TURN_ON);
@@ -3456,6 +3806,8 @@ static void run_state_machine(struct tcpm_port *port)
 					       5000);
 			tcpm_set_charge(port, true);
 		}
+		if (port->ams == HARD_RESET)
+			tcpm_ams_finish(port);
 		tcpm_set_attached_state(port, true);
 		tcpm_set_state(port, SNK_STARTUP, 0);
 		break;
@@ -3465,10 +3817,19 @@ static void run_state_machine(struct tcpm_port *port)
 		port->message_id = 0;
 		port->rx_msgid = -1;
 		tcpm_pd_send_control(port, PD_CTRL_ACCEPT);
-		if (port->pwr_role == TYPEC_SOURCE)
-			tcpm_set_state(port, SRC_SEND_CAPABILITIES, 0);
-		else
+		if (port->pwr_role == TYPEC_SOURCE) {
+			port->upcoming_state = SRC_SEND_CAPABILITIES;
+			tcpm_ams_start(port, POWER_NEGOTIATION);
+		} else {
 			tcpm_set_state(port, SNK_WAIT_CAPABILITIES, 0);
+		}
+		break;
+	case SRC_SOFT_RESET_WAIT_SNK_TX:
+	case SNK_SOFT_RESET:
+		if (port->ams != NONE_AMS)
+			tcpm_ams_finish(port);
+		port->upcoming_state = SOFT_RESET_SEND;
+		tcpm_ams_start(port, SOFT_RESET_AMS);
 		break;
 	case SOFT_RESET_SEND:
 		port->message_id = 0;
@@ -3717,6 +4078,19 @@ static void run_state_machine(struct tcpm_port *port)
 			       tcpm_default_state(port),
 			       port->vbus_present ? PD_T_PS_SOURCE_OFF : 0);
 		break;
+
+	/* AMS intermediate state */
+	case AMS_START:
+		if (port->upcoming_state == INVALID_STATE) {
+			tcpm_set_state(port, port->pwr_role == TYPEC_SOURCE ?
+				       SRC_READY : SNK_READY, 0);
+			break;
+		}
+
+		upcoming_state = port->upcoming_state;
+		port->upcoming_state = INVALID_STATE;
+		tcpm_set_state(port, upcoming_state, 0);
+		break;
 	default:
 		WARN(1, "Unexpected port state %d\n", port->state);
 		break;
@@ -4086,6 +4460,9 @@ static void _tcpm_pd_vbus_off(struct tcpm_port *port)
 static void _tcpm_pd_hard_reset(struct tcpm_port *port)
 {
 	tcpm_log_force(port, "Received hard reset");
+
+	if (port->ams != NONE_AMS)
+		port->ams = NONE_AMS;
 	/*
 	 * If we keep receiving hard reset requests, executing the hard reset
 	 * must have failed. Revert to error recovery if that happens.
@@ -4127,10 +4504,16 @@ static void tcpm_pd_event_handler(struct kthread_work *work)
 				_tcpm_cc_change(port, cc1, cc2);
 		}
 		if (events & TCPM_FRS_EVENT) {
-			if (port->state == SNK_READY)
-				tcpm_set_state(port, FR_SWAP_SEND, 0);
-			else
+			if (port->state == SNK_READY) {
+				int ret;
+
+				port->upcoming_state = FR_SWAP_SEND;
+				ret = tcpm_ams_start(port, FAST_ROLE_SWAP);
+				if (ret == -EAGAIN)
+					port->upcoming_state = INVALID_STATE;
+			} else {
 				tcpm_log(port, "Discarding FRS_SIGNAL! Not in sink ready");
+			}
 		}
 		if (events & TCPM_SOURCING_VBUS) {
 			tcpm_log(port, "sourcing vbus");
@@ -4199,6 +4582,7 @@ EXPORT_SYMBOL_GPL(tcpm_sourcing_vbus);
 static void tcpm_enable_frs_work(struct kthread_work *work)
 {
 	struct tcpm_port *port = container_of(work, struct tcpm_port, enable_frs);
+	int ret;
 
 	mutex_lock(&port->lock);
 	/* Not FRS capable */
@@ -4213,9 +4597,14 @@ static void tcpm_enable_frs_work(struct kthread_work *work)
 	if (port->state != SNK_READY || port->vdm_state != VDM_STATE_DONE || port->send_discover)
 		goto resched;
 
-	tcpm_set_state(port, GET_SINK_CAP, 0);
-	port->sink_cap_done = true;
-
+	port->upcoming_state = GET_SINK_CAP;
+	ret = tcpm_ams_start(port, GET_SINK_CAPABILITIES);
+	if (ret == -EAGAIN) {
+		port->upcoming_state = INVALID_STATE;
+	} else {
+		port->sink_cap_done = true;
+		goto unlock;
+	}
 resched:
 	mod_enable_frs_delayed_work(port, GET_SINK_CAP_RETRY_MS);
 unlock:
@@ -4266,7 +4655,12 @@ static int tcpm_dr_set(const struct typec_capability *cap,
 		port->non_pd_role_swap = true;
 		tcpm_set_state(port, PORT_RESET, 0);
 	} else {
-		tcpm_set_state(port, DR_SWAP_SEND, 0);
+		port->upcoming_state = DR_SWAP_SEND;
+		ret = tcpm_ams_start(port, DATA_ROLE_SWAP);
+		if (ret == -EAGAIN) {
+			port->upcoming_state = INVALID_STATE;
+			goto port_unlock;
+		}
 	}
 
 	port->swap_status = 0;
@@ -4313,10 +4707,16 @@ static int tcpm_pr_set(const struct typec_capability *cap,
 		goto port_unlock;
 	}
 
+	port->upcoming_state = PR_SWAP_SEND;
+	ret = tcpm_ams_start(port, POWER_ROLE_SWAP);
+	if (ret == -EAGAIN) {
+		port->upcoming_state = INVALID_STATE;
+		goto port_unlock;
+	}
+
 	port->swap_status = 0;
 	port->swap_pending = true;
 	reinit_completion(&port->swap_complete);
-	tcpm_set_state(port, PR_SWAP_SEND, 0);
 	mutex_unlock(&port->lock);
 
 	if (!wait_for_completion_timeout(&port->swap_complete,
@@ -4353,10 +4753,16 @@ static int tcpm_vconn_set(const struct typec_capability *cap,
 		goto port_unlock;
 	}
 
+	port->upcoming_state = VCONN_SWAP_SEND;
+	ret = tcpm_ams_start(port, VCONN_SWAP);
+	if (ret == -EAGAIN) {
+		port->upcoming_state = INVALID_STATE;
+		goto port_unlock;
+	}
+
 	port->swap_status = 0;
 	port->swap_pending = true;
 	reinit_completion(&port->swap_complete);
-	tcpm_set_state(port, VCONN_SWAP_SEND, 0);
 	mutex_unlock(&port->lock);
 
 	if (!wait_for_completion_timeout(&port->swap_complete,
@@ -4421,6 +4827,13 @@ static int tcpm_pps_set_op_curr(struct tcpm_port *port, u16 op_curr)
 		goto port_unlock;
 	}
 
+	port->upcoming_state = SNK_NEGOTIATE_PPS_CAPABILITIES;
+	ret = tcpm_ams_start(port, POWER_NEGOTIATION);
+	if (ret == -EAGAIN) {
+		port->upcoming_state = INVALID_STATE;
+		goto port_unlock;
+	}
+
 	/* Round down operating current to align with PPS valid steps */
 	op_curr = op_curr - (op_curr % RDO_PROG_CURR_MA_STEP);
 
@@ -4428,7 +4841,6 @@ static int tcpm_pps_set_op_curr(struct tcpm_port *port, u16 op_curr)
 	port->pps_data.op_curr = op_curr;
 	port->pps_status = 0;
 	port->pps_pending = true;
-	tcpm_set_state(port, SNK_NEGOTIATE_PPS_CAPABILITIES, 0);
 	mutex_unlock(&port->lock);
 
 	if (!wait_for_completion_timeout(&port->pps_complete,
@@ -4477,6 +4889,13 @@ static int tcpm_pps_set_out_volt(struct tcpm_port *port, u16 out_volt)
 		goto port_unlock;
 	}
 
+	port->upcoming_state = SNK_NEGOTIATE_PPS_CAPABILITIES;
+	ret = tcpm_ams_start(port, POWER_NEGOTIATION);
+	if (ret == -EAGAIN) {
+		port->upcoming_state = INVALID_STATE;
+		goto port_unlock;
+	}
+
 	/* Round down output voltage to align with PPS valid steps */
 	out_volt = out_volt - (out_volt % RDO_PROG_VOLT_MV_STEP);
 
@@ -4484,7 +4903,6 @@ static int tcpm_pps_set_out_volt(struct tcpm_port *port, u16 out_volt)
 	port->pps_data.out_volt = out_volt;
 	port->pps_status = 0;
 	port->pps_pending = true;
-	tcpm_set_state(port, SNK_NEGOTIATE_PPS_CAPABILITIES, 0);
 	mutex_unlock(&port->lock);
 
 	if (!wait_for_completion_timeout(&port->pps_complete,
@@ -4524,6 +4942,16 @@ static int tcpm_pps_activate(struct tcpm_port *port, bool activate)
 		goto port_unlock;
 	}
 
+	if (activate)
+		port->upcoming_state = SNK_NEGOTIATE_PPS_CAPABILITIES;
+	else
+		port->upcoming_state = SNK_NEGOTIATE_CAPABILITIES;
+	ret = tcpm_ams_start(port, POWER_NEGOTIATION);
+	if (ret == -EAGAIN) {
+		port->upcoming_state = INVALID_STATE;
+		goto port_unlock;
+	}
+
 	reinit_completion(&port->pps_complete);
 	port->pps_status = 0;
 	port->pps_pending = true;
@@ -4532,9 +4960,6 @@ static int tcpm_pps_activate(struct tcpm_port *port, bool activate)
 	if (activate) {
 		port->pps_data.out_volt = port->supply_voltage;
 		port->pps_data.op_curr = port->current_limit;
-		tcpm_set_state(port, SNK_NEGOTIATE_PPS_CAPABILITIES, 0);
-	} else {
-		tcpm_set_state(port, SNK_NEGOTIATE_CAPABILITIES, 0);
 	}
 	mutex_unlock(&port->lock);
 
diff --git a/include/linux/usb/pd.h b/include/linux/usb/pd.h
index 4e18b92fecdd..8ea79a40b079 100644
--- a/include/linux/usb/pd.h
+++ b/include/linux/usb/pd.h
@@ -455,6 +455,7 @@ static inline unsigned int rdo_max_power(u32 rdo)
 #define PD_T_SRCSWAPSTDBY      625     /* Maximum of 650ms */
 #define PD_T_NEWSRC            250     /* Maximum of 275ms */
 #define PD_T_SWAP_SRC_START	20	/* Minimum of 20ms */
+#define PD_T_SINK_TX		16	/* 16 - 20 ms */
 
 #define PD_T_DRP_TRY		100	/* 75 - 150 ms */
 #define PD_T_DRP_TRYWAIT	600	/* 400 - 800 ms */
diff --git a/include/linux/usb/tcpm.h b/include/linux/usb/tcpm.h
index c56a5e6ecb68..3e3101e21373 100644
--- a/include/linux/usb/tcpm.h
+++ b/include/linux/usb/tcpm.h
@@ -28,6 +28,10 @@ enum typec_cc_status {
 	TYPEC_CC_RP_3_0,
 };
 
+/* Collision Avoidance */
+#define SINK_TX_NG	TYPEC_CC_RP_1_5
+#define SINK_TX_OK	TYPEC_CC_RP_3_0
+
 enum typec_cc_polarity {
 	TYPEC_POLARITY_CC1,
 	TYPEC_POLARITY_CC2,

commit e877670daa820ff7e96931a87ce1049d9aa0c55a
Author: XiaoTan Luo <lxt@rock-chips.com>
Date:   Mon Aug 16 14:18:16 2021 +0800

    ASoC: rockchip: rk817-codec: enable dac when play
    
    In this case playback_path set to ON, and then play music.
    when playback close, stream mute power off the dac,
    but the playback_path do not be set to OFF, so we must
    power on the dac again.
    
    Signed-off-by: XiaoTan Luo <lxt@rock-chips.com>
    Change-Id: I7baa8518ccbb567cb146c5739f9a125da320e674

diff --git a/sound/soc/codecs/rk817_codec.c b/sound/soc/codecs/rk817_codec.c
index fc55cfe88076..61573266a003 100644
--- a/sound/soc/codecs/rk817_codec.c
+++ b/sound/soc/codecs/rk817_codec.c
@@ -944,6 +944,19 @@ static int rk817_digital_mute(struct snd_soc_dai *dai, int mute)
 		switch (rk817->playback_path) {
 		case SPK_PATH:
 		case RING_SPK:
+			if (rk817->out_l2spk_r2hp) {
+				snd_soc_component_write(component, RK817_CODEC_ADAC_CFG1,
+						PWD_DACBIAS_ON | PWD_DACD_ON |
+						PWD_DACL_ON | PWD_DACR_ON);
+			} else if (!rk817->use_ext_amplifier) {
+				snd_soc_component_write(component, RK817_CODEC_ADAC_CFG1,
+						PWD_DACBIAS_ON | PWD_DACD_ON |
+						PWD_DACL_DOWN | PWD_DACR_DOWN);
+			} else {
+				snd_soc_component_write(component, RK817_CODEC_ADAC_CFG1,
+						PWD_DACBIAS_ON | PWD_DACD_DOWN |
+						PWD_DACL_ON | PWD_DACR_ON);
+			}
 			rk817_codec_ctl_gpio(rk817, CODEC_SET_SPK, 1);
 			rk817_codec_ctl_gpio(rk817, CODEC_SET_HP, 0);
 			break;
@@ -951,11 +964,17 @@ static int rk817_digital_mute(struct snd_soc_dai *dai, int mute)
 		case HP_NO_MIC:
 		case RING_HP:
 		case RING_HP_NO_MIC:
+			snd_soc_component_write(component, RK817_CODEC_ADAC_CFG1,
+					PWD_DACBIAS_ON | PWD_DACD_DOWN |
+					PWD_DACL_ON | PWD_DACR_ON);
 			rk817_codec_ctl_gpio(rk817, CODEC_SET_SPK, 0);
 			rk817_codec_ctl_gpio(rk817, CODEC_SET_HP, 1);
 			break;
 		case SPK_HP:
 		case RING_SPK_HP:
+			snd_soc_component_write(component, RK817_CODEC_ADAC_CFG1,
+					PWD_DACBIAS_ON | PWD_DACD_ON |
+					PWD_DACL_ON | PWD_DACR_ON);
 			rk817_codec_ctl_gpio(rk817, CODEC_SET_SPK, 1);
 			rk817_codec_ctl_gpio(rk817, CODEC_SET_HP, 1);
 			break;

commit 20d8a7925f1507dde173d002eac7060c422c3448
Author: Xing Zheng <zhengxing@rock-chips.com>
Date:   Mon Mar 15 16:52:54 2021 +0800

    ASoC: rockchip: rk817-codec: add support recover playback/capture path after resume
    
    [Fix and using new sound APIs (snd_soc_kcontrol_component()/snd_soc_component_get_drvdata())]
    
    Change-Id: I52487370ce33b057d9cf774b7c0cef06f2c98bca
    Signed-off-by: Xing Zheng <zhengxing@rock-chips.com>

diff --git a/sound/soc/codecs/rk817_codec.c b/sound/soc/codecs/rk817_codec.c
index bf63553ab77a..fc55cfe88076 100644
--- a/sound/soc/codecs/rk817_codec.c
+++ b/sound/soc/codecs/rk817_codec.c
@@ -1043,6 +1043,10 @@ static int rk817_suspend(struct snd_soc_component *component)
 
 static int rk817_resume(struct snd_soc_component *component)
 {
+	struct rk817_codec_priv *rk817 = snd_soc_component_get_drvdata(component);
+
+	rk817_capture_path_config(component, OFF, rk817->capture_path);
+	rk817_playback_path_config(component, OFF, rk817->playback_path);
 	return 0;
 }
 

commit ee10e96cd6caca7de758d66bf92a79a2f17b1b80
Author: Xing Zheng <zhengxing@rock-chips.com>
Date:   Mon Mar 15 16:44:53 2021 +0800

    ASoC: rockchip: rk817-codec: clean up and wrap playback and capture path configurations
    
    [Fix and using new sound APIs (snd_soc_kcontrol_component()/snd_soc_component_get_drvdata())]
    
    Change-Id: I6bc36626a8952ef28789dfacf57c2b27580a3467
    Signed-off-by: Xing Zheng <zhengxing@rock-chips.com>

diff --git a/sound/soc/codecs/rk817_codec.c b/sound/soc/codecs/rk817_codec.c
index 6b809ff0df22..bf63553ab77a 100644
--- a/sound/soc/codecs/rk817_codec.c
+++ b/sound/soc/codecs/rk817_codec.c
@@ -475,34 +475,12 @@ static SOC_ENUM_SINGLE_DECL(rk817_call_path_type,
 static SOC_ENUM_SINGLE_DECL(rk817_modem_input_type,
 	0, 0, rk817_modem_input_mode);
 
-static int rk817_playback_path_get(struct snd_kcontrol *kcontrol,
-				   struct snd_ctl_elem_value *ucontrol)
+static int rk817_playback_path_config(struct snd_soc_component *component,
+				      long pre_path, long target_path)
 {
-	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
 	struct rk817_codec_priv *rk817 = snd_soc_component_get_drvdata(component);
 
-	DBG("%s : playback_path %ld\n", __func__, rk817->playback_path);
-
-	ucontrol->value.integer.value[0] = rk817->playback_path;
-
-	return 0;
-}
-
-static int rk817_playback_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);
-	long int pre_path;
-
-	if (rk817->playback_path == ucontrol->value.integer.value[0]) {
-		DBG("%s : playback_path is not changed!\n",
-		    __func__);
-		return 0;
-	}
-
-	pre_path = rk817->playback_path;
-	rk817->playback_path = ucontrol->value.integer.value[0];
+	rk817->playback_path = target_path;
 
 	DBG("%s : set playback_path %ld, pre_path %ld\n",
 	    __func__, rk817->playback_path, pre_path);
@@ -655,32 +633,41 @@ static int rk817_playback_path_put(struct snd_kcontrol *kcontrol,
 	return 0;
 }
 
-static int rk817_capture_path_get(struct snd_kcontrol *kcontrol,
-				  struct snd_ctl_elem_value *ucontrol)
+static int rk817_playback_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);
 
-	dev_dbg(component->dev, "%s:capture_path %ld\n", __func__, rk817->capture_path);
-	ucontrol->value.integer.value[0] = rk817->capture_path;
+	DBG("%s : playback_path %ld\n", __func__, rk817->playback_path);
+
+	ucontrol->value.integer.value[0] = rk817->playback_path;
+
 	return 0;
 }
 
-static int rk817_capture_path_put(struct snd_kcontrol *kcontrol,
-				  struct snd_ctl_elem_value *ucontrol)
+static int rk817_playback_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);
-	long int pre_path;
 
-	if (rk817->capture_path == ucontrol->value.integer.value[0]) {
-		dev_dbg(component->dev, "%s:capture_path is not changed!\n",
-			__func__);
+	if (rk817->playback_path == ucontrol->value.integer.value[0]) {
+		DBG("%s : playback_path is not changed!\n",
+		    __func__);
 		return 0;
 	}
 
-	pre_path = rk817->capture_path;
-	rk817->capture_path = ucontrol->value.integer.value[0];
+	return rk817_playback_path_config(component, rk817->playback_path,
+					  ucontrol->value.integer.value[0]);
+}
+
+static int rk817_capture_path_config(struct snd_soc_component *component,
+				     long pre_path, long target_path)
+{
+	struct rk817_codec_priv *rk817 = snd_soc_component_get_drvdata(component);
+
+	rk817->capture_path = target_path;
 
 	DBG("%s : set capture_path %ld, pre_path %ld\n", __func__,
 	    rk817->capture_path, pre_path);
@@ -774,6 +761,36 @@ static int rk817_capture_path_put(struct snd_kcontrol *kcontrol,
 	return 0;
 }
 
+static int rk817_capture_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 : capture_path %ld\n", __func__,
+	    rk817->capture_path);
+
+	ucontrol->value.integer.value[0] = rk817->capture_path;
+
+	return 0;
+}
+
+static int rk817_capture_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);
+
+	if (rk817->capture_path == ucontrol->value.integer.value[0]) {
+		DBG("%s : capture_path is not changed!\n",
+		    __func__);
+		return 0;
+	}
+
+	return rk817_capture_path_config(component, rk817->capture_path,
+					 ucontrol->value.integer.value[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),

commit 1d569a020bcb7bfa948336f1b531ecc9521218a3
Author: Simon Xue <xxm@rock-chips.com>
Date:   Tue Sep 7 15:11:15 2021 +0800

    iommu: rockchip: optimise getting clocks
    
    Use devm_clk_bulk_get_all instead of devm_clk_bulk_get. So we don't need
    the complicated operation.
    
    Change-Id: Idbe7668bd26b744f8d8b7d79d5eb99fa891bd0be
    Signed-off-by: Simon Xue <xxm@rock-chips.com>

diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c
index c90a7cebc081..b2715698f5a5 100644
--- a/drivers/iommu/rockchip-iommu.c
+++ b/drivers/iommu/rockchip-iommu.c
@@ -121,11 +121,6 @@ struct rockchip_iommu_data {
 	u32 version;
 };
 
-/* list of clocks required by IOMMU */
-static const char * const rk_iommu_clocks[] = {
-	"aclk", "iface",
-};
-
 struct rk_iommu {
 	struct device *dev;
 	void __iomem **bases;
@@ -1740,45 +1735,18 @@ static int rk_iommu_probe(struct platform_device *pdev)
 					"rockchip,enable-cmd-retry");
 	}
 
-	iommu->num_clocks = ARRAY_SIZE(rk_iommu_clocks);
-
-	/* RK1808 isp iommu has an extra sclk */
-	err = of_property_match_string(dev->of_node, "clock-names", "sclk");
-	if (err >= 0)
-		iommu->num_clocks++;
-
-	iommu->clocks = devm_kcalloc(iommu->dev, iommu->num_clocks,
-				     sizeof(*iommu->clocks), GFP_KERNEL);
-	if (!iommu->clocks)
-		return -ENOMEM;
-
-	for (i = 0; i < iommu->num_clocks; ++i) {
-		if (i == 2) {
-			iommu->clocks[i].id = "sclk";
-		} else {
-			err = of_property_match_string(dev->of_node,
-						       "clock-names",
-						       rk_iommu_clocks[i]);
-			if (err < 0) {
-				if (!strcmp(rk_iommu_clocks[i], "iface")) {
-					iommu->clocks[i].id = "hclk";
-					dev_warn(dev, "iommu hclk need to update to iface\n");
-				}
-			} else {
-				iommu->clocks[i].id = rk_iommu_clocks[i];
-			}
-		}
-	}
 	/*
 	 * iommu clocks should be present for all new devices and devicetrees
 	 * but there are older devicetrees without clocks out in the wild.
 	 * So clocks as optional for the time being.
 	 */
-	err = devm_clk_bulk_get(iommu->dev, iommu->num_clocks, iommu->clocks);
+	err = devm_clk_bulk_get_all(dev, &iommu->clocks);
 	if (err == -ENOENT)
 		iommu->num_clocks = 0;
-	else if (err)
+	else if (err < 0)
 		return err;
+	else
+		iommu->num_clocks = err;
 
 	err = clk_bulk_prepare(iommu->num_clocks, iommu->clocks);
 	if (err)

commit f860d75d3b20c02efbc17b90348951053cc6b1f9
Author: Kyle Tso <kyletso@google.com>
Date:   Tue Aug 3 17:13:14 2021 +0800

    UPSTREAM: usb: typec: tcpm: Keep other events when receiving FRS and Sourcing_vbus events
    
    When receiving FRS and Sourcing_Vbus events from low-level drivers, keep
    other events which come a bit earlier so that they will not be ignored
    in the event handler.
    
    Change-Id: Ibb4a2ccd2bbb34e53d4fbe44803aad521bb7029f
    Fixes: 8dc4bd073663 ("usb: typec: tcpm: Add support for Sink Fast Role SWAP(FRS)")
    Cc: stable <stable@vger.kernel.org>
    Cc: Badhri Jagan Sridharan <badhri@google.com>
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    Reviewed-by: Badhri Jagan Sridharan <badhri@google.com>
    Signed-off-by: Kyle Tso <kyletso@google.com>
    Link: https://lore.kernel.org/r/20210803091314.3051302-1-kyletso@google.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Wang Jie <dave.wang@rock-chips.com>
    (cherry picked from commit 43ad944cd73f2360ec8ff31d29ea44830b3119af)

diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index 595c9e964628..3ac8d08343e7 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -4181,7 +4181,7 @@ EXPORT_SYMBOL_GPL(tcpm_pd_hard_reset);
 void tcpm_sink_frs(struct tcpm_port *port)
 {
 	spin_lock(&port->pd_event_lock);
-	port->pd_events = TCPM_FRS_EVENT;
+	port->pd_events |= TCPM_FRS_EVENT;
 	spin_unlock(&port->pd_event_lock);
 	kthread_queue_work(port->wq, &port->event_work);
 }
@@ -4190,7 +4190,7 @@ EXPORT_SYMBOL_GPL(tcpm_sink_frs);
 void tcpm_sourcing_vbus(struct tcpm_port *port)
 {
 	spin_lock(&port->pd_event_lock);
-	port->pd_events = TCPM_SOURCING_VBUS;
+	port->pd_events |= TCPM_SOURCING_VBUS;
 	spin_unlock(&port->pd_event_lock);
 	kthread_queue_work(port->wq, &port->event_work);
 }

commit 60612bbd90fb45743a8af59df83ddffaaea9432e
Author: Li Jun <jun.li@nxp.com>
Date:   Wed Jun 2 17:57:08 2021 +0800

    UPSTREAM: usb: typec: tcpm: cancel frs hrtimer when unregister tcpm port
    
    Like the state_machine_timer, we should also cancel possible pending
    frs hrtimer when unregister tcpm port.
    
    Change-Id: I9a651304c9a3c0be8475773c119d000b5cddfa0f
    Fixes: 8dc4bd073663 ("usb: typec: tcpm: Add support for Sink Fast Role SWAP(FRS)")
    Cc: stable <stable@vger.kernel.org>
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Li Jun <jun.li@nxp.com>
    Link: https://lore.kernel.org/r/1622627829-11070-2-git-send-email-jun.li@nxp.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Wang Jie <dave.wang@rock-chips.com>
    (cherry picked from commit 7ade4805e296c8d1e40c842395bbe478c7210555)

diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index 123c1a68d66a..595c9e964628 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -5191,6 +5191,7 @@ void tcpm_unregister_port(struct tcpm_port *port)
 {
 	int i;
 
+	hrtimer_cancel(&port->enable_frs_timer);
 	hrtimer_cancel(&port->vdm_state_machine_timer);
 	hrtimer_cancel(&port->state_machine_timer);
 

commit 8dd1e02217af79d3bd8d96c44693a280c024fb8e
Author: Badhri Jagan Sridharan <badhri@google.com>
Date:   Wed Oct 7 23:15:47 2020 -0700

    UPSTREAM: usb: typec: tcpm: Add support for Sink Fast Role SWAP(FRS)
    
    PD 3.0 spec defines a new mechanism for power role swap called
    Fast role swap. This change enables TCPM to support FRS when
    acting as sink.
    
    Once the explicit contract is negotiated, sink port is
    expected to query the source port for sink caps to
    determine whether the source is FRS capable.
    Bits 23 & 24 of fixed pdo of the sink caps from the source, when
    set, indicates the current needed by the source when fast role
    swap is in progress(Implicit contract phasae). 0 indicates that
    the source does not support Fast Role Swap.
    
    Upon receiving the FRS signal from the source,
    TCPC(TCPM_FRS_EVENT) informs TCPM to start the Fast role swap sequence.
    
    1. TCPM sends FRS PD message: FR_SWAP_SEND
    2. If response is not received within the expiry of
       SenderResponseTimer, Error recovery is triggered.:
       FR_SWAP_SEND_TIMEOUT
    3. Upon receipt of the accept message, TCPM waits for
       PSSourceOffTimer for PS_READY message from the partner:
       FR_SWAP_SNK_SRC_NEW_SINK_READY.
    
    TCPC is expected to autonomously turn on vbus once the FRS
    signal is received and vbus voltage falls below vsafe5v within
    tSrcFrSwap. This is different from traditional power role swap
    where the vbus sourcing is turned on by TCPM.
    
    4. By this time, TCPC most likely would have started to
       source vbus, TCPM waits for tSrcFrSwap to see  if the
       lower level TCPC driver signals TCPM_SOURCING_VBUS event:
       FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED.
    5. When TCPC signals sourcing vbus, TCPM sends PS_READY msg and
       changes the CC pin from Rd to Rp. This is the end of fast
       role swap sequence and TCPM initiates the sequnce to negotiate
       explicit contract by transitioning into SRC_STARTUP after
       SwapSrcStart.
    
    The code is written based on the sequence described in "Figure 8-107:
    Dual-role Port in Sink to Source Fast Role Swap State Diagram" of
    USB Power Delivery Specification Revision 3.0, Version 1.2.
    
    Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>
    Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
    Link: https://lore.kernel.org/r/20201008061556.1402293-7-badhri@google.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Wang Jie <dave.wang@rock-chips.com>
    Change-Id: I1316c4498187dc67a5d652341ddb48118a201acf
    (cherry picked from commit 8dc4bd073663fa8aba2fae08b1c23ab41a2e97a2)

diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index f7038f97f662..123c1a68d66a 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -105,6 +105,13 @@
 	S(VCONN_SWAP_TURN_ON_VCONN),		\
 	S(VCONN_SWAP_TURN_OFF_VCONN),		\
 						\
+	S(FR_SWAP_SEND),			\
+	S(FR_SWAP_SEND_TIMEOUT),		\
+	S(FR_SWAP_SNK_SRC_TRANSITION_TO_OFF),			\
+	S(FR_SWAP_SNK_SRC_NEW_SINK_READY),		\
+	S(FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED),	\
+	S(FR_SWAP_CANCEL),			\
+						\
 	S(SNK_TRY),				\
 	S(SNK_TRY_WAIT),			\
 	S(SNK_TRY_WAIT_DEBOUNCE),               \
@@ -126,6 +133,9 @@
 	S(GET_PPS_STATUS_SEND),			\
 	S(GET_PPS_STATUS_SEND_TIMEOUT),		\
 						\
+	S(GET_SINK_CAP),			\
+	S(GET_SINK_CAP_TIMEOUT),		\
+						\
 	S(ERROR_RECOVERY),			\
 	S(PORT_RESET),				\
 	S(PORT_RESET_WAIT_OFF)
@@ -161,11 +171,25 @@ enum pd_msg_request {
 	PD_MSG_DATA_SOURCE_CAP,
 };
 
+/*
+ * Initial current capability of the new source when vSafe5V is applied during PD3.0 Fast Role Swap.
+ * Based on "Table 6-14 Fixed Supply PDO - Sink" of "USB Power Delivery Specification Revision 3.0,
+ * Version 1.2"
+ */
+enum frs_typec_current {
+	FRS_NOT_SUPPORTED,
+	FRS_DEFAULT_POWER,
+	FRS_5V_1P5A,
+	FRS_5V_3A,
+};
+
 /* Events from low level driver */
 
 #define TCPM_CC_EVENT		BIT(0)
 #define TCPM_VBUS_EVENT		BIT(1)
 #define TCPM_RESET_EVENT	BIT(2)
+#define TCPM_FRS_EVENT		BIT(3)
+#define TCPM_SOURCING_VBUS	BIT(4)
 
 #define LOG_BUFFER_ENTRIES	1024
 #define LOG_BUFFER_ENTRY_SIZE	128
@@ -175,6 +199,8 @@ enum pd_msg_request {
 #define SVID_DISCOVERY_MAX	16
 #define ALTMODE_DISCOVERY_MAX	(SVID_DISCOVERY_MAX * MODE_DISCOVERY_MAX)
 
+#define GET_SINK_CAP_RETRY_MS	100
+
 struct pd_mode_data {
 	int svid_index;		/* current SVID index		*/
 	int nsvids;
@@ -252,6 +278,8 @@ struct tcpm_port {
 	struct kthread_work state_machine;
 	struct hrtimer vdm_state_machine_timer;
 	struct kthread_work vdm_state_machine;
+	struct hrtimer enable_frs_timer;
+	struct kthread_work enable_frs;
 	bool state_machine_running;
 
 	struct completion tx_complete;
@@ -326,6 +354,12 @@ struct tcpm_port {
 	/* port belongs to a self powered device */
 	bool self_powered;
 
+	/* FRS */
+	enum frs_typec_current frs_current;
+
+	/* Sink caps have been queried */
+	bool sink_cap_done;
+
 #ifdef CONFIG_DEBUG_FS
 	struct dentry *dentry;
 	struct mutex logbuffer_lock;	/* log buffer access lock */
@@ -920,6 +954,16 @@ static void mod_vdm_delayed_work(struct tcpm_port *port, unsigned int delay_ms)
 	}
 }
 
+static void mod_enable_frs_delayed_work(struct tcpm_port *port, unsigned int delay_ms)
+{
+	if (delay_ms) {
+		hrtimer_start(&port->enable_frs_timer, ms_to_ktime(delay_ms), HRTIMER_MODE_REL);
+	} else {
+		hrtimer_cancel(&port->enable_frs_timer);
+		kthread_queue_work(port->wq, &port->enable_frs);
+	}
+}
+
 static void tcpm_set_state(struct tcpm_port *port, enum tcpm_state state,
 			   unsigned int delay_ms)
 {
@@ -1610,6 +1654,9 @@ static void tcpm_pd_data_request(struct tcpm_port *port,
 	unsigned int cnt = pd_header_cnt_le(msg->header);
 	unsigned int rev = pd_header_rev_le(msg->header);
 	unsigned int i;
+	enum frs_typec_current frs_current;
+	bool frs_enable;
+	int ret;
 
 	switch (type) {
 	case PD_DATA_SOURCE_CAP:
@@ -1679,7 +1726,21 @@ static void tcpm_pd_data_request(struct tcpm_port *port,
 		/* We don't do anything with this at the moment... */
 		for (i = 0; i < cnt; i++)
 			port->sink_caps[i] = le32_to_cpu(msg->payload[i]);
+
+		frs_current = (port->sink_caps[0] & PDO_FIXED_FRS_CURR_MASK) >>
+			PDO_FIXED_FRS_CURR_SHIFT;
+		frs_enable = frs_current && (frs_current <= port->frs_current);
+		tcpm_log(port,
+			 "Port partner FRS capable partner_frs_current:%u port_frs_current:%u enable:%c",
+			 frs_current, port->frs_current, frs_enable ? 'y' : 'n');
+		if (frs_enable) {
+			ret  = port->tcpc->enable_frs(port->tcpc, true);
+			tcpm_log(port, "Enable FRS %s, ret:%d\n", ret ? "fail" : "success", ret);
+		}
+
 		port->nr_sink_caps = cnt;
+		port->sink_cap_done = true;
+		tcpm_set_state(port, SNK_READY, 0);
 		break;
 	case PD_DATA_VENDOR_DEF:
 		tcpm_handle_vdm_request(port, msg->payload, cnt);
@@ -1774,6 +1835,9 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
 		case VCONN_SWAP_WAIT_FOR_VCONN:
 			tcpm_set_state(port, VCONN_SWAP_TURN_OFF_VCONN, 0);
 			break;
+		case FR_SWAP_SNK_SRC_TRANSITION_TO_OFF:
+			tcpm_set_state(port, FR_SWAP_SNK_SRC_NEW_SINK_READY, 0);
+			break;
 		default:
 			break;
 		}
@@ -1813,6 +1877,13 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
 					     -EAGAIN : -EOPNOTSUPP);
 			tcpm_set_state(port, VCONN_SWAP_CANCEL, 0);
 			break;
+		case FR_SWAP_SEND:
+			tcpm_set_state(port, FR_SWAP_CANCEL, 0);
+			break;
+		case GET_SINK_CAP:
+			port->sink_cap_done = true;
+			tcpm_set_state(port, ready_state(port), 0);
+			break;
 		default:
 			break;
 		}
@@ -1847,6 +1918,9 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
 		case VCONN_SWAP_SEND:
 			tcpm_set_state(port, VCONN_SWAP_START, 0);
 			break;
+		case FR_SWAP_SEND:
+			tcpm_set_state(port, FR_SWAP_SNK_SRC_TRANSITION_TO_OFF, 0);
+			break;
 		default:
 			break;
 		}
@@ -2740,6 +2814,10 @@ static void tcpm_reset_port(struct tcpm_port *port)
 	port->try_src_count = 0;
 	port->try_snk_count = 0;
 	port->usb_type = POWER_SUPPLY_USB_TYPE_C;
+	port->nr_sink_caps = 0;
+	port->sink_cap_done = false;
+	if (port->tcpc->enable_frs)
+		port->tcpc->enable_frs(port->tcpc, false);
 
 	power_supply_changed(port->psy);
 }
@@ -3283,10 +3361,9 @@ static void run_state_machine(struct tcpm_port *port)
 		tcpm_swap_complete(port, 0);
 		tcpm_typec_connect(port);
 		tcpm_check_send_discover(port);
+		mod_enable_frs_delayed_work(port, 0);
 		tcpm_pps_complete(port, port->pps_status);
-
 		power_supply_changed(port->psy);
-
 		break;
 
 	/* Accessory states */
@@ -3310,9 +3387,13 @@ static void run_state_machine(struct tcpm_port *port)
 		tcpm_set_state(port, HARD_RESET_START, 0);
 		break;
 	case HARD_RESET_START:
+		port->sink_cap_done = false;
+		if (port->tcpc->enable_frs)
+			port->tcpc->enable_frs(port->tcpc, false);
 		port->hard_reset_count++;
 		port->tcpc->set_pd_rx(port->tcpc, false);
 		tcpm_unregister_altmodes(port);
+		port->nr_sink_caps = 0;
 		port->send_discover = true;
 		if (port->pwr_role == TYPEC_SOURCE)
 			tcpm_set_state(port, SRC_HARD_RESET_VBUS_OFF,
@@ -3426,6 +3507,35 @@ static void run_state_machine(struct tcpm_port *port)
 		tcpm_set_state(port, ready_state(port), 0);
 		break;
 
+	case FR_SWAP_SEND:
+		if (tcpm_pd_send_control(port, PD_CTRL_FR_SWAP)) {
+			tcpm_set_state(port, ERROR_RECOVERY, 0);
+			break;
+		}
+		tcpm_set_state_cond(port, FR_SWAP_SEND_TIMEOUT, PD_T_SENDER_RESPONSE);
+		break;
+	case FR_SWAP_SEND_TIMEOUT:
+		tcpm_set_state(port, ERROR_RECOVERY, 0);
+		break;
+	case FR_SWAP_SNK_SRC_TRANSITION_TO_OFF:
+		tcpm_set_state(port, ERROR_RECOVERY, PD_T_PS_SOURCE_OFF);
+		break;
+	case FR_SWAP_SNK_SRC_NEW_SINK_READY:
+		if (port->vbus_source)
+			tcpm_set_state(port, FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED, 0);
+		else
+			tcpm_set_state(port, ERROR_RECOVERY, PD_T_RECEIVER_RESPONSE);
+		break;
+	case FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED:
+		tcpm_set_pwr_role(port, TYPEC_SOURCE);
+		if (tcpm_pd_send_control(port, PD_CTRL_PS_RDY)) {
+			tcpm_set_state(port, ERROR_RECOVERY, 0);
+			break;
+		}
+		tcpm_set_cc(port, tcpm_rp_cc(port));
+		tcpm_set_state(port, SRC_STARTUP, PD_T_SWAP_SRC_START);
+		break;
+
 	/* PR_Swap states */
 	case PR_SWAP_ACCEPT:
 		tcpm_pd_send_control(port, PD_CTRL_ACCEPT);
@@ -3549,6 +3659,12 @@ static void run_state_machine(struct tcpm_port *port)
 		else
 			tcpm_set_state(port, SNK_READY, 0);
 		break;
+	case FR_SWAP_CANCEL:
+		if (port->pwr_role == TYPEC_SOURCE)
+			tcpm_set_state(port, SRC_READY, 0);
+		else
+			tcpm_set_state(port, SNK_READY, 0);
+		break;
 
 	case BIST_RX:
 		switch (BDO_MODE_MASK(port->bist_request)) {
@@ -3577,6 +3693,14 @@ static void run_state_machine(struct tcpm_port *port)
 	case GET_PPS_STATUS_SEND_TIMEOUT:
 		tcpm_set_state(port, ready_state(port), 0);
 		break;
+	case GET_SINK_CAP:
+		tcpm_pd_send_control(port, PD_CTRL_GET_SINK_CAP);
+		tcpm_set_state(port, GET_SINK_CAP_TIMEOUT, PD_T_SENDER_RESPONSE);
+		break;
+	case GET_SINK_CAP_TIMEOUT:
+		port->sink_cap_done = true;
+		tcpm_set_state(port, ready_state(port), 0);
+		break;
 	case ERROR_RECOVERY:
 		tcpm_swap_complete(port, -EPROTO);
 		tcpm_pps_complete(port, -EPROTO);
@@ -3788,6 +3912,13 @@ static void _tcpm_cc_change(struct tcpm_port *port, enum typec_cc_status cc1,
 		 * Ignore it.
 		 */
 		break;
+	case FR_SWAP_SEND:
+	case FR_SWAP_SEND_TIMEOUT:
+	case FR_SWAP_SNK_SRC_TRANSITION_TO_OFF:
+	case FR_SWAP_SNK_SRC_NEW_SINK_READY:
+	case FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED:
+		/* Do nothing, CC change expected */
+		break;
 
 	case PORT_RESET:
 	case PORT_RESET_WAIT_OFF:
@@ -3858,6 +3989,9 @@ static void _tcpm_pd_vbus_on(struct tcpm_port *port)
 	case SRC_TRY_DEBOUNCE:
 		/* Do nothing, waiting for sink detection */
 		break;
+	case FR_SWAP_SNK_SRC_NEW_SINK_READY:
+		tcpm_set_state(port, FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED, 0);
+		break;
 
 	case PORT_RESET:
 	case PORT_RESET_WAIT_OFF:
@@ -3933,6 +4067,14 @@ static void _tcpm_pd_vbus_off(struct tcpm_port *port)
 		 */
 		break;
 
+	case FR_SWAP_SEND:
+	case FR_SWAP_SEND_TIMEOUT:
+	case FR_SWAP_SNK_SRC_TRANSITION_TO_OFF:
+	case FR_SWAP_SNK_SRC_NEW_SINK_READY:
+	case FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED:
+		/* Do nothing, vbus drop expected */
+		break;
+
 	default:
 		if (port->pwr_role == TYPEC_SINK &&
 		    port->attached)
@@ -3984,6 +4126,25 @@ static void tcpm_pd_event_handler(struct kthread_work *work)
 			if (port->tcpc->get_cc(port->tcpc, &cc1, &cc2) == 0)
 				_tcpm_cc_change(port, cc1, cc2);
 		}
+		if (events & TCPM_FRS_EVENT) {
+			if (port->state == SNK_READY)
+				tcpm_set_state(port, FR_SWAP_SEND, 0);
+			else
+				tcpm_log(port, "Discarding FRS_SIGNAL! Not in sink ready");
+		}
+		if (events & TCPM_SOURCING_VBUS) {
+			tcpm_log(port, "sourcing vbus");
+			/*
+			 * In fast role swap case TCPC autonomously sources vbus. Set vbus_source
+			 * true as TCPM wouldn't have called tcpm_set_vbus.
+			 *
+			 * When vbus is sourced on the command on TCPM i.e. TCPM called
+			 * tcpm_set_vbus to source vbus, vbus_source would already be true.
+			 */
+			port->vbus_source = true;
+			_tcpm_pd_vbus_on(port);
+		}
+
 		spin_lock(&port->pd_event_lock);
 	}
 	spin_unlock(&port->pd_event_lock);
@@ -4017,6 +4178,50 @@ void tcpm_pd_hard_reset(struct tcpm_port *port)
 }
 EXPORT_SYMBOL_GPL(tcpm_pd_hard_reset);
 
+void tcpm_sink_frs(struct tcpm_port *port)
+{
+	spin_lock(&port->pd_event_lock);
+	port->pd_events = TCPM_FRS_EVENT;
+	spin_unlock(&port->pd_event_lock);
+	kthread_queue_work(port->wq, &port->event_work);
+}
+EXPORT_SYMBOL_GPL(tcpm_sink_frs);
+
+void tcpm_sourcing_vbus(struct tcpm_port *port)
+{
+	spin_lock(&port->pd_event_lock);
+	port->pd_events = TCPM_SOURCING_VBUS;
+	spin_unlock(&port->pd_event_lock);
+	kthread_queue_work(port->wq, &port->event_work);
+}
+EXPORT_SYMBOL_GPL(tcpm_sourcing_vbus);
+
+static void tcpm_enable_frs_work(struct kthread_work *work)
+{
+	struct tcpm_port *port = container_of(work, struct tcpm_port, enable_frs);
+
+	mutex_lock(&port->lock);
+	/* Not FRS capable */
+	if (!port->connected || port->port_type != TYPEC_PORT_DRP ||
+	    port->pwr_opmode != TYPEC_PWR_MODE_PD ||
+	    !port->tcpc->enable_frs ||
+	    /* Sink caps queried */
+	    port->sink_cap_done || port->negotiated_rev < PD_REV30)
+		goto unlock;
+
+	/* Send when the state machine is idle */
+	if (port->state != SNK_READY || port->vdm_state != VDM_STATE_DONE || port->send_discover)
+		goto resched;
+
+	tcpm_set_state(port, GET_SINK_CAP, 0);
+	port->sink_cap_done = true;
+
+resched:
+	mod_enable_frs_delayed_work(port, GET_SINK_CAP_RETRY_MS);
+unlock:
+	mutex_unlock(&port->lock);
+}
+
 static int tcpm_dr_set(const struct typec_capability *cap,
 		       enum typec_data_role data)
 {
@@ -4448,7 +4653,7 @@ static int tcpm_fw_get_caps(struct tcpm_port *port,
 {
 	const char *cap_str;
 	int ret;
-	u32 mw;
+	u32 mw, frs_current;
 
 	if (!fwnode)
 		return -EINVAL;
@@ -4517,6 +4722,13 @@ static int tcpm_fw_get_caps(struct tcpm_port *port,
 
 	port->self_powered = fwnode_property_read_bool(fwnode, "self-powered");
 
+	/* FRS can only be supported byb DRP ports */
+	if (port->port_type == TYPEC_PORT_DRP) {
+		ret = fwnode_property_read_u32(fwnode, "frs-typec-current", &frs_current);
+		if (ret >= 0 && frs_current <= FRS_5V_3A)
+			port->frs_current = frs_current;
+	}
+
 	return 0;
 }
 
@@ -4846,6 +5058,14 @@ static enum hrtimer_restart vdm_state_machine_timer_handler(struct hrtimer *time
 	return HRTIMER_NORESTART;
 }
 
+static enum hrtimer_restart enable_frs_timer_handler(struct hrtimer *timer)
+{
+	struct tcpm_port *port = container_of(timer, struct tcpm_port, enable_frs_timer);
+
+	kthread_queue_work(port->wq, &port->enable_frs);
+	return HRTIMER_NORESTART;
+}
+
 struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
 {
 	struct tcpm_port *port;
@@ -4876,10 +5096,13 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
 	kthread_init_work(&port->state_machine, tcpm_state_machine_work);
 	kthread_init_work(&port->vdm_state_machine, vdm_state_machine_work);
 	kthread_init_work(&port->event_work, tcpm_pd_event_handler);
+	kthread_init_work(&port->enable_frs, tcpm_enable_frs_work);
 	hrtimer_init(&port->state_machine_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
 	port->state_machine_timer.function = state_machine_timer_handler;
 	hrtimer_init(&port->vdm_state_machine_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
 	port->vdm_state_machine_timer.function = vdm_state_machine_timer_handler;
+	hrtimer_init(&port->enable_frs_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+	port->enable_frs_timer.function = enable_frs_timer_handler;
 
 	spin_lock_init(&port->pd_event_lock);
 
diff --git a/include/linux/usb/pd.h b/include/linux/usb/pd.h
index bdf4c88d2aa0..4e18b92fecdd 100644
--- a/include/linux/usb/pd.h
+++ b/include/linux/usb/pd.h
@@ -227,14 +227,16 @@ enum pd_pdo_type {
 #define PDO_CURR_MASK		0x3ff
 #define PDO_PWR_MASK		0x3ff
 
-#define PDO_FIXED_DUAL_ROLE	BIT(29)	/* Power role swap supported */
-#define PDO_FIXED_SUSPEND	BIT(28) /* USB Suspend supported (Source) */
-#define PDO_FIXED_HIGHER_CAP	BIT(28) /* Requires more than vSafe5V (Sink) */
-#define PDO_FIXED_EXTPOWER	BIT(27) /* Externally powered */
-#define PDO_FIXED_USB_COMM	BIT(26) /* USB communications capable */
-#define PDO_FIXED_DATA_SWAP	BIT(25) /* Data role swap supported */
-#define PDO_FIXED_VOLT_SHIFT	10	/* 50mV units */
-#define PDO_FIXED_CURR_SHIFT	0	/* 10mA units */
+#define PDO_FIXED_DUAL_ROLE		BIT(29)	/* Power role swap supported */
+#define PDO_FIXED_SUSPEND		BIT(28) /* USB Suspend supported (Source) */
+#define PDO_FIXED_HIGHER_CAP		BIT(28) /* Requires more than vSafe5V (Sink) */
+#define PDO_FIXED_EXTPOWER		BIT(27) /* Externally powered */
+#define PDO_FIXED_USB_COMM		BIT(26) /* USB communications capable */
+#define PDO_FIXED_DATA_SWAP		BIT(25) /* Data role swap supported */
+#define PDO_FIXED_FRS_CURR_MASK		(BIT(24) | BIT(23)) /* FR_Swap Current (Sink) */
+#define PDO_FIXED_FRS_CURR_SHIFT	23
+#define PDO_FIXED_VOLT_SHIFT		10	/* 50mV units */
+#define PDO_FIXED_CURR_SHIFT		0	/* 10mA units */
 
 #define PDO_FIXED_VOLT(mv)	((((mv) / 50) & PDO_VOLT_MASK) << PDO_FIXED_VOLT_SHIFT)
 #define PDO_FIXED_CURR(ma)	((((ma) / 10) & PDO_CURR_MASK) << PDO_FIXED_CURR_SHIFT)
@@ -432,6 +434,7 @@ static inline unsigned int rdo_max_power(u32 rdo)
 #define PD_T_DB_DETECT		10000	/* 10 - 15 seconds */
 #define PD_T_SEND_SOURCE_CAP	150	/* 100 - 200 ms */
 #define PD_T_SENDER_RESPONSE	60	/* 24 - 30 ms, relaxed */
+#define PD_T_RECEIVER_RESPONSE	15	/* 15ms max */
 #define PD_T_SOURCE_ACTIVITY	45
 #define PD_T_SINK_ACTIVITY	135
 #define PD_T_SINK_WAIT_CAP	240
diff --git a/include/linux/usb/tcpm.h b/include/linux/usb/tcpm.h
index 8cb93aff69f1..c56a5e6ecb68 100644
--- a/include/linux/usb/tcpm.h
+++ b/include/linux/usb/tcpm.h
@@ -127,7 +127,10 @@ struct tcpc_config {
  *		automatically if a connection is established.
  * @try_role:	Optional; called to set a preferred role
  * @pd_transmit:Called to transmit PD message
- * @mux:	Pointer to multiplexer data
+ * @enable_frs:
+ *		Optional; Called to enable/disable PD 3.0 fast role swap.
+ *		Enabling frs is accessory dependent as not all PD3.0
+ *		accessories support fast role swap.
  */
 struct tcpc_dev {
 	const struct tcpc_config *config;
@@ -153,6 +156,7 @@ struct tcpc_dev {
 	int (*try_role)(struct tcpc_dev *dev, int role);
 	int (*pd_transmit)(struct tcpc_dev *dev, enum tcpm_transmit_type type,
 			   const struct pd_message *msg);
+	int (*enable_frs)(struct tcpc_dev *dev, bool enable);
 };
 
 struct tcpm_port;
@@ -168,6 +172,8 @@ int tcpm_update_sink_capabilities(struct tcpm_port *port, const u32 *pdo,
 
 void tcpm_vbus_change(struct tcpm_port *port);
 void tcpm_cc_change(struct tcpm_port *port);
+void tcpm_sink_frs(struct tcpm_port *port);
+void tcpm_sourcing_vbus(struct tcpm_port *port);
 void tcpm_pd_receive(struct tcpm_port *port,
 		     const struct pd_message *msg);
 void tcpm_pd_transmit_complete(struct tcpm_port *port,

commit 7dd3d860213ab8c305d0c362f49670e2364ec7d6
Author: Caesar Wang <wxt@rock-chips.com>
Date:   Tue Sep 7 17:02:54 2021 +0800

    scripts/mkimg: fixes the realpath for io-domain.sh
    
    This issue found on yocto builing the kernel.
    
    yocto/build/tmp/work-shared/rockchip-rk3568-evb/kernel-source/scripts/mkimg:
    line 227:./scripts/io-domain.sh: No such file or directory
    arch/arm64/Makefile:203: recipe for target 'rk3568-evb1-ddr4-v10-linux.img' failed
    make[2]: *** [rk3568-evb1-ddr4-v10-linux.img] Error 127
    Makefile:146: recipe for target 'sub-make' failed
    
    Fixes: b25c12a00a9a ("scripts: add io-domain.sh for rk356x io-domain check")
    
    Signed-off-by: Caesar Wang <wxt@rock-chips.com>
    Change-Id: Id6d496fe886ce79c9efee30a5f4d2cd270d34efd

diff --git a/scripts/mkimg b/scripts/mkimg
index 2944a6dc1c51..aba1511a8f93 100755
--- a/scripts/mkimg
+++ b/scripts/mkimg
@@ -224,7 +224,7 @@ fi
 scripts/resource_tool ${DTB_PATH} ${LOGO} ${LOGO_KERNEL} >/dev/null
 
 if [ "${ARCH}" == "arm64" ]; then
-	./scripts/io-domain.sh ${srctree}/arch/arm64/boot/dts/rockchip/.${DTB}
+	${srctree}/scripts/io-domain.sh ${srctree}/arch/arm64/boot/dts/rockchip/.${DTB}
 fi
 
 echo "  Image:  resource.img (with ${DTB} ${LOGO} ${LOGO_KERNEL}) is ready"

commit 0e9176d1fccd96046f3e14c67ae7d431d361a4c0
Author: Wang Jie <dave.wang@rock-chips.com>
Date:   Thu Aug 19 21:21:10 2021 +0800

    usb: dwc3: core: fix pm runtime issue for rockchip platforms
    
    The rockchip platforms, such as RK3399 and RK3568
    otg port enable pm runtime to swith peripheral and
    host mode. During dwc3 core probe, there are two
    place which may call pm_runtime_put_sync_suspend(),
    one is in dwc3_rockchip_async_probe(), the other one
    is in the drd_work called from dwc3_core_init_mode().
    The dwc3_rockchip_async_probe() and drd_work are
    scheduled asynchronously, and the order of their
    execution is randomly.
    
    If the drd_work is handled prior to the async probe,
    there's no problem, but if the async probe is handled
    firstly, the pm_runtime_put_sync_suspend() will be
    duplicated twice. If this issue happens, the value of
    dwc3 power.usage_count is -1, in other words, the
    runtime put/suspend operations is unbalanced, and
    fail to do dwc3_runtime_suspend/resume.
    
    This patch avoids do pm_runtime_put_sync_suspend()
    in the drd_work if no usb connected.
    
    Fixes: bb4c791a42c6 ("usb: dwc3: core: add pm runtime for drd mode")
    Signed-off-by: Wang Jie <dave.wang@rock-chips.com>
    Signed-off-by: William Wu <william.wu@rock-chips.com>
    Change-Id: I088a7ddb60eb817093810fe874d5fdb242c73ca7

diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 3404080bdf5c..af8c15af4740 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -296,8 +296,10 @@ static void __dwc3_set_mode(struct work_struct *work)
 		 * We should set drd_connected to false before
 		 * runtime_suspend to enable reset assert.
 		 */
-		dwc->drd_connected = false;
-		pm_runtime_put_sync_suspend(dwc->dev);
+		if (dwc->drd_connected) {
+			dwc->drd_connected = false;
+			pm_runtime_put_sync_suspend(dwc->dev);
+		}
 	}
 }
 

commit e05d38ded58e1bab909da09fefc7c4268bb9c6d7
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Thu Sep 2 11:31:20 2021 +0800

    drm/rockchip: vop2: Use macro for window phys_id
    
    Change-Id: Icca89acb0397781c64538c68cc40530e1104455e
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
index 2a3a101bec70..6ee2377d84c4 100644
--- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
+++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
@@ -1236,12 +1236,12 @@ static const struct vop2_ctrl rk3568_vop_ctrl = {
 	.edp_dclk_pol = VOP_REG(RK3568_DSP_IF_POL, 0x1, 15),
 	.mipi_pin_pol = VOP_REG(RK3568_DSP_IF_POL, 0x7, 16),
 	.mipi_dclk_pol = VOP_REG(RK3568_DSP_IF_POL, 0x1, 19),
-	.win_vp_id[0] = VOP_REG(RK3568_OVL_PORT_SEL, 0x3, 16),
-	.win_vp_id[1] = VOP_REG(RK3568_OVL_PORT_SEL, 0x3, 18),
-	.win_vp_id[2] = VOP_REG(RK3568_OVL_PORT_SEL, 0x3, 24),
-	.win_vp_id[3] = VOP_REG(RK3568_OVL_PORT_SEL, 0x3, 26),
-	.win_vp_id[4] = VOP_REG(RK3568_OVL_PORT_SEL, 0x3, 28),
-	.win_vp_id[5] = VOP_REG(RK3568_OVL_PORT_SEL, 0x3, 30),
+	.win_vp_id[ROCKCHIP_VOP2_CLUSTER0] = VOP_REG(RK3568_OVL_PORT_SEL, 0x3, 16),
+	.win_vp_id[ROCKCHIP_VOP2_CLUSTER1] = VOP_REG(RK3568_OVL_PORT_SEL, 0x3, 18),
+	.win_vp_id[ROCKCHIP_VOP2_ESMART0] = VOP_REG(RK3568_OVL_PORT_SEL, 0x3, 24),
+	.win_vp_id[ROCKCHIP_VOP2_ESMART1] = VOP_REG(RK3568_OVL_PORT_SEL, 0x3, 26),
+	.win_vp_id[ROCKCHIP_VOP2_SMART0] = VOP_REG(RK3568_OVL_PORT_SEL, 0x3, 28),
+	.win_vp_id[ROCKCHIP_VOP2_SMART1] = VOP_REG(RK3568_OVL_PORT_SEL, 0x3, 30),
 	.win_dly[0] = VOP_REG(RK3568_CLUSTER_DLY_NUM, 0xffff, 0),
 	.win_dly[1] = VOP_REG(RK3568_CLUSTER_DLY_NUM, 0xffff, 16),
 	.win_dly[2] = VOP_REG(RK3568_SMART_DLY_NUM, 0xff, 0),

commit 023dbce94d3db1f19515ce22e9cfe7d6bbc0ac3d
Author: Dingxian Wen <shawn.wen@rock-chips.com>
Date:   Mon Sep 6 21:15:45 2021 +0800

    arm64: configs: rockchip_defconfig: enable LT8619C
    
    Enable lt8619c HDMI to BT656/BT1120 bridge driver for hdmi-in
    application. Which found on rk3568-evb6-ddr3-v10.
    
    Signed-off-by: Dingxian Wen <shawn.wen@rock-chips.com>
    Change-Id: Idd8bdfd2f2d2cc4af9e1d47e3002ebcee1252df5

diff --git a/arch/arm64/configs/rockchip_defconfig b/arch/arm64/configs/rockchip_defconfig
index ff0cf610481d..aac94a447b62 100644
--- a/arch/arm64/configs/rockchip_defconfig
+++ b/arch/arm64/configs/rockchip_defconfig
@@ -572,6 +572,7 @@ CONFIG_VIDEO_VM149C=y
 CONFIG_VIDEO_TC35874X=y
 CONFIG_VIDEO_RK628_CSI=y
 CONFIG_VIDEO_LT6911UXC=y
+CONFIG_VIDEO_LT8619C=y
 CONFIG_VIDEO_OV2680=y
 CONFIG_VIDEO_OV5648=y
 CONFIG_VIDEO_OV5695=y

commit cd0c2a18daa9fb6a1bcd7d8d4f3de94b1978533b
Author: Dingxian Wen <shawn.wen@rock-chips.com>
Date:   Mon Sep 6 21:12:04 2021 +0800

    arm64: dts: rockchip: rk3568-evb6: add lt8619c configuration
    
    Signed-off-by: Dingxian Wen <shawn.wen@rock-chips.com>
    Change-Id: I9bff56d2cddd1d8d16bac0ffd09bd48167dd58ed

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi
index 911c7e2d4568..70483136c897 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi
@@ -41,6 +41,13 @@
 		regulator-always-on;
 		regulator-boot-on;
 	};
+
+	ext_cam_clk: external-camera-clock {
+		compatible = "fixed-clock";
+		clock-frequency = <25000000>;
+		clock-output-names = "CLK_CAMERA_25MHZ";
+		#clock-cells = <0>;
+	};
 };
 
 &combphy0_us {
@@ -122,6 +129,31 @@
 		power-off-in-suspend = <1>;
 		layout = <4>;
 	};
+
+	lt8619c: lt8619c@32 {
+		compatible = "lontium,lt8619c";
+		reg = <0x32>;
+		clocks = <&ext_cam_clk>;
+		clock-names = "xvclk";
+		pinctrl-names = "default";
+		pinctrl-0 = <&cif_dvp_clk &cif_dvp_bus16 &cif_dvp_bus8>;
+		power-gpios = <&gpio0 RK_PD5 GPIO_ACTIVE_HIGH>;
+		reset-gpios = <&gpio4 RK_PD2 GPIO_ACTIVE_LOW>;
+		plugin-det-gpios = <&gpio0 RK_PD6 GPIO_ACTIVE_LOW>;
+		hpd-output-inverted;
+		rockchip,camera-module-index = <0>;
+		rockchip,camera-module-facing = "back";
+		rockchip,camera-module-name = "LT8619C";
+		rockchip,camera-module-lens-name = "NC";
+
+		port {
+			lt8619c_out: endpoint {
+				remote-endpoint = <&cif_para_in>;
+				bus-width = <16>;
+				pclk-sample = <1>;
+			};
+		};
+	};
 };
 
 &i2c4 {
@@ -456,3 +488,26 @@
 		reg = <0x0>;
 	};
 };
+
+&rkcif_dvp {
+	status = "okay";
+
+	port {
+		/* Parallel bus endpoint */
+		cif_para_in: endpoint {
+			remote-endpoint = <&lt8619c_out>;
+		};
+	};
+};
+
+&rkcif {
+	status = "okay";
+};
+
+&rkcif_mmu {
+	status = "okay";
+};
+
+&rkcif_dvp_sditf {
+	status = "okay";
+};

commit 32d6a552bba776f56f385ebbea651f070286aa65
Author: Dingxian Wen <shawn.wen@rock-chips.com>
Date:   Mon Sep 6 20:56:19 2021 +0800

    media: i2c: lt8619c: add lt8619c HDMI to BT656/BT1120 bridge driver
    
    Signed-off-by: Dingxian Wen <shawn.wen@rock-chips.com>
    Change-Id: I894dc4822d4a9efb6cf3b6d5b6c12b4f03c3ae92

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index 353a0e92e091..26464579c6e4 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -465,6 +465,17 @@ config VIDEO_LT6911UXC
 	  To compile this driver as a module, choose M here: the
 	  module will be called lt6911uxc.
 
+config VIDEO_LT8619C
+	tristate "Lontium LT8619C decoder"
+	depends on VIDEO_V4L2 && I2C && VIDEO_V4L2_SUBDEV_API
+	select HDMI
+	select V4L2_FWNODE
+	help
+	  Support for the Lontium LT8619C HDMI to BT656/BT1120 bridge.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called lt8619c.
+
 config VIDEO_TECHPOINT
 	tristate "TechPoint decoder"
 	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index b2328feddcf8..dd1f8121460f 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -146,6 +146,7 @@ obj-$(CONFIG_VIDEO_TC358743)	+= tc358743.o
 obj-$(CONFIG_VIDEO_TC35874X)	+= tc35874x.o
 obj-$(CONFIG_VIDEO_RK628_CSI)	+= rk628_csi.o
 obj-$(CONFIG_VIDEO_LT6911UXC)	+= lt6911uxc.o
+obj-$(CONFIG_VIDEO_LT8619C)	+= lt8619c.o
 obj-$(CONFIG_VIDEO_IMX178)	+= imx178.o
 obj-$(CONFIG_VIDEO_IMX219)	+= imx219.o
 obj-$(CONFIG_VIDEO_IMX258)	+= imx258.o
diff --git a/drivers/media/i2c/lt8619c.c b/drivers/media/i2c/lt8619c.c
new file mode 100644
index 000000000000..f092c054210f
--- /dev/null
+++ b/drivers/media/i2c/lt8619c.c
@@ -0,0 +1,1841 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co. Ltd.
+ *
+ * Author: Dingxian Wen <shawn.wen@rock-chips.com>
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/i2c.h>
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/gpio/consumer.h>
+#include <linux/interrupt.h>
+#include <linux/of_graph.h>
+#include <linux/videodev2.h>
+#include <linux/workqueue.h>
+#include <linux/platform_device.h>
+#include <linux/v4l2-dv-timings.h>
+#include <linux/hdmi.h>
+#include <linux/version.h>
+#include <linux/rk-camera-module.h>
+#include <media/v4l2-dv-timings.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-event.h>
+#include <media/v4l2-fwnode.h>
+#include <linux/regmap.h>
+#include "lt8619c.h"
+
+#define DRIVER_VERSION		KERNEL_VERSION(0, 0x1, 0x0)
+#define LT8619C_NAME		"LT8619C"
+
+static int debug;
+module_param(debug, int, 0644);
+MODULE_PARM_DESC(debug, "debug level (0-2)");
+
+struct lt8619c_mode {
+	u32 width;
+	u32 height;
+	struct v4l2_fract max_fps;
+	u32 hts_def;
+	u32 vts_def;
+	u32 exp_def;
+};
+
+struct lt8619c {
+	struct device *dev;
+	struct v4l2_subdev sd;
+	struct media_pad pad;
+	struct v4l2_ctrl_handler hdl;
+	struct i2c_client *i2c_client;
+	struct mutex confctl_mutex;
+	struct v4l2_ctrl *detect_tx_5v_ctrl;
+	struct delayed_work delayed_work_enable_hotplug;
+	struct delayed_work delayed_work_monitor_resolution;
+	struct v4l2_dv_timings timings;
+	struct regmap *reg_map;
+	struct gpio_desc *reset_gpio;
+	struct gpio_desc *power_gpio;
+	struct gpio_desc *plugin_det_gpio;
+	struct clk *xvclk;
+	const struct lt8619c_mode *cur_mode;
+	const char *module_facing;
+	const char *module_name;
+	const char *len_name;
+	bool nosignal;
+	bool enable_hdcp;
+	bool clk_ddrmode_en;
+	bool BT656_double_clk_en;
+	bool hpd_output_inverted;
+	int plugin_irq;
+	u32 edid_blocks_written;
+	u32 mbus_fmt_code;
+	u32 module_index;
+	u32 yuv_output_mode;
+	u32 cp_convert_mode;
+	u32 yc_swap;
+	u32 yuv_colordepth;
+	u32 bt_tx_sync_pol;
+};
+
+static const struct v4l2_dv_timings_cap lt8619c_timings_cap = {
+	.type = V4L2_DV_BT_656_1120,
+	/* keep this initialization for compatibility with GCC < 4.4.6 */
+	.reserved = { 0 },
+	V4L2_INIT_BT_TIMINGS(1, 10000, 1, 10000, 0, 410000000,
+			V4L2_DV_BT_STD_CEA861 | V4L2_DV_BT_STD_DMT |
+			V4L2_DV_BT_STD_GTF | V4L2_DV_BT_STD_CVT,
+			V4L2_DV_BT_CAP_PROGRESSIVE | V4L2_DV_BT_CAP_INTERLACED |
+			V4L2_DV_BT_CAP_REDUCED_BLANKING |
+			V4L2_DV_BT_CAP_CUSTOM)
+};
+
+static u8 edid_init_data[] = {
+	0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
+	0x49, 0x78, 0x01, 0x88, 0x00, 0x88, 0x88, 0x88,
+	0x1C, 0x1F, 0x01, 0x03, 0x80, 0x00, 0x00, 0x78,
+	0x0A, 0x0D, 0xC9, 0xA0, 0x57, 0x47, 0x98, 0x27,
+	0x12, 0x48, 0x4C, 0x00, 0x00, 0x00, 0x01, 0x01,
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x3A,
+	0x80, 0x18, 0x71, 0x38, 0x2D, 0x40, 0x58, 0x2C,
+	0x45, 0x00, 0xC4, 0x8E, 0x21, 0x00, 0x00, 0x1E,
+	0x01, 0x1D, 0x00, 0x72, 0x51, 0xD0, 0x1E, 0x20,
+	0x6E, 0x28, 0x55, 0x00, 0xC4, 0x8E, 0x21, 0x00,
+	0x00, 0x1E, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x54,
+	0x37, 0x34, 0x39, 0x2D, 0x66, 0x48, 0x44, 0x37,
+	0x32, 0x30, 0x0A, 0x20, 0x00, 0x00, 0x00, 0xFD,
+	0x00, 0x14, 0x78, 0x01, 0xFF, 0x1D, 0x00, 0x0A,
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x64,
+
+	0x02, 0x03, 0x1D, 0x71, 0x4A, 0x90, 0x1F, 0x22,
+	0x04, 0x02, 0x01, 0x11, 0x05, 0x07, 0x16, 0x23,
+	0x09, 0x07, 0x01, 0x83, 0x01, 0x00, 0x00, 0x65,
+	0x03, 0x0C, 0x00, 0x10, 0x00, 0x8C, 0x0A, 0xD0,
+	0x8A, 0x20, 0xE0, 0x2D, 0x10, 0x10, 0x3E, 0x96,
+	0x00, 0x13, 0x8E, 0x21, 0x00, 0x00, 0x1E, 0xD8,
+	0x09, 0x80, 0xA0, 0x20, 0xE0, 0x2D, 0x10, 0x10,
+	0x60, 0xA2, 0x00, 0xC4, 0x8E, 0x21, 0x00, 0x00,
+	0x18, 0x8C, 0x0A, 0xD0, 0x90, 0x20, 0x40, 0x31,
+	0x20, 0x0C, 0x40, 0x55, 0x00, 0x48, 0x39, 0x00,
+	0x00, 0x00, 0x18, 0x01, 0x1D, 0x80, 0x18, 0x71,
+	0x38, 0x2D, 0x40, 0x58, 0x2C, 0x45, 0x00, 0xC0,
+	0x6C, 0x00, 0x00, 0x00, 0x18, 0x01, 0x1D, 0x80,
+	0x18, 0x71, 0x1C, 0x16, 0x20, 0x58, 0x2C, 0x25,
+	0x00, 0xC0, 0x6C, 0x00, 0x00, 0x00, 0x18, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0,
+};
+
+static u8 phase_num[10] = {
+	0x20, 0x28, 0x21, 0x29, 0x22,
+	0x2a, 0x23, 0x2b, 0x24, 0x2c,
+};
+
+static const struct lt8619c_mode supported_modes[] = {
+	{
+		.width = 1920,
+		.height = 1080,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 600000,
+		},
+		.hts_def = 2200,
+		.vts_def = 1125,
+	}, {
+		.width = 1920,
+		.height = 1080,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.hts_def = 2200,
+		.vts_def = 1125,
+	}, {
+		.width = 1920,
+		.height = 540,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 600000,
+		},
+		.hts_def = 2200,
+		.vts_def = 562,
+	}, {
+		.width = 1280,
+		.height = 720,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 600000,
+		},
+		.hts_def = 1650,
+		.vts_def = 750,
+	}, {
+		.width = 720,
+		.height = 576,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 500000,
+		},
+		.hts_def = 864,
+		.vts_def = 625,
+	}, {
+		.width = 720,
+		.height = 480,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 600000,
+		},
+		.hts_def = 858,
+		.vts_def = 525,
+	}, {
+		.width = 1440,
+		.height = 240,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 600000,
+		},
+		.hts_def = 1716,
+		.vts_def = 262,
+	}, {
+		.width = 1440,
+		.height = 288,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 500000,
+		},
+		.hts_def = 1716,
+		.vts_def = 312,
+	},
+};
+
+static void lt8619c_set_hpd(struct v4l2_subdev *sd, int en);
+static void lt8619c_wait_for_signal_stable(struct v4l2_subdev *sd);
+static void lt8619c_yuv_config(struct v4l2_subdev *sd);
+static void lt8619c_format_change(struct v4l2_subdev *sd);
+static void enable_stream(struct v4l2_subdev *sd, bool enable);
+static int lt8619c_s_dv_timings(struct v4l2_subdev *sd,
+			struct v4l2_dv_timings *timings);
+static void LVDSPLL_Lock_Det(struct v4l2_subdev *sd);
+static void LT8619C_phase_config(struct v4l2_subdev *sd);
+static bool lt8619c_rcv_supported_res(struct v4l2_subdev *sd,
+		struct v4l2_dv_timings *timings);
+static bool lt8619c_timing_changed(struct v4l2_subdev *sd,
+		struct v4l2_dv_timings *timings);
+
+static inline struct lt8619c *to_lt8619c(struct v4l2_subdev *sd)
+{
+	return container_of(sd, struct lt8619c, sd);
+}
+
+static inline bool tx_5v_power_present(struct v4l2_subdev *sd)
+{
+	int val;
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+
+	val = gpiod_get_value(lt8619c->plugin_det_gpio);
+	v4l2_dbg(1, debug, sd, "%s 5v_present: %d!\n", __func__, val);
+	return  (val > 0);
+}
+
+static inline bool no_signal(struct v4l2_subdev *sd)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+
+	v4l2_dbg(1, debug, sd, "no signal:%d\n", lt8619c->nosignal);
+	return lt8619c->nosignal;
+}
+
+static bool lt8619c_is_supported_interlaced_res(struct v4l2_subdev *sd,
+		u32 hact, u32 vact)
+{
+	if ((hact == 1920 && vact == 540) ||
+	    (hact == 1440 && vact == 288) ||
+	    (hact == 1440 && vact == 240))
+		return true;
+
+	return false;
+}
+
+static int lt8619c_get_detected_timings(struct v4l2_subdev *sd,
+				     struct v4l2_dv_timings *timings)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+	struct v4l2_bt_timings *bt = &timings->bt;
+	u32 hact, vact, htotal, vtotal, hbp, hfp, hs;
+	u32 fps, hdmi_clk_cnt;
+	u32 val, vbp, vfp, vs;
+	u32 pix_clk;
+
+	memset(timings, 0, sizeof(struct v4l2_dv_timings));
+	timings->type = V4L2_DV_BT_656_1120;
+
+	regmap_write(lt8619c->reg_map, BANK_REG, BANK_60);
+	regmap_read(lt8619c->reg_map, 0x22, &val);
+	hact = val << 8;
+	regmap_read(lt8619c->reg_map, 0x23, &val);
+	hact |= val;
+
+	regmap_read(lt8619c->reg_map, 0x20, &val);
+	vact = (val & 0xf) << 8;
+	regmap_read(lt8619c->reg_map, 0x21, &val);
+	vact |= val;
+
+	regmap_read(lt8619c->reg_map, 0x1e, &val);
+	htotal = val << 8;
+	regmap_read(lt8619c->reg_map, 0x1f, &val);
+	htotal |= val;
+
+	regmap_read(lt8619c->reg_map, 0x1c, &val);
+	vtotal = (val & 0xf) << 8;
+	regmap_read(lt8619c->reg_map, 0x1d, &val);
+	vtotal |= val;
+
+	regmap_read(lt8619c->reg_map, 0x1a, &val);
+	hfp = val << 8;
+	regmap_read(lt8619c->reg_map, 0x1b, &val);
+	hfp |= val;
+
+	regmap_read(lt8619c->reg_map, 0x18, &val);
+	hbp = val << 8;
+	regmap_read(lt8619c->reg_map, 0x19, &val);
+	hbp |= val;
+
+	regmap_read(lt8619c->reg_map, 0x14, &val);
+	hs = val << 8;
+	regmap_read(lt8619c->reg_map, 0x15, &val);
+	hs |= val;
+
+	regmap_read(lt8619c->reg_map, 0x17, &vfp);
+	regmap_read(lt8619c->reg_map, 0x16, &vbp);
+	regmap_read(lt8619c->reg_map, 0x13, &vs);
+
+	regmap_write(lt8619c->reg_map, BANK_REG, BANK_80);
+	regmap_read(lt8619c->reg_map, 0x44, &val);
+	hdmi_clk_cnt = (val & 0x3) << 16;
+	regmap_read(lt8619c->reg_map, 0x45, &val);
+	hdmi_clk_cnt |= val << 8;
+	regmap_read(lt8619c->reg_map, 0x46, &val);
+	hdmi_clk_cnt |= val;
+
+	bt->width = hact;
+	bt->height = vact;
+	bt->hfrontporch = hfp;
+	bt->hsync = hs;
+	bt->hbackporch = hbp;
+	bt->vfrontporch = vfp;
+	bt->vsync = vs;
+	bt->vbackporch = vbp;
+	pix_clk = hdmi_clk_cnt * 1000;
+
+	fps = 0;
+	if (htotal * vtotal)
+		fps = (pix_clk + (htotal * vtotal) / 2) / (htotal * vtotal);
+
+	bt->pixelclock = htotal * vtotal * fps;
+
+	/* for interlaced res 1080i 576i 480i */
+	if (lt8619c_is_supported_interlaced_res(sd, hact, vact)) {
+		bt->interlaced = V4L2_DV_INTERLACED;
+		bt->height *= 2;
+		bt->il_vsync = bt->vsync + 1;
+	} else {
+		bt->interlaced = V4L2_DV_PROGRESSIVE;
+	}
+
+	v4l2_dbg(1, debug, sd,
+		"%s: act:%dx%d, total:%dx%d, fps:%d, pixclk:%llu, frame mode:%s\n",
+		__func__, hact, vact, htotal, vtotal, fps, bt->pixelclock,
+		(bt->interlaced == V4L2_DV_INTERLACED) ? "I" : "P");
+	v4l2_dbg(1, debug, sd,
+		"%s: hfp:%d, hs:%d, hbp:%d, vfp:%d, vs:%d, vbp:%d\n",
+		__func__, bt->hfrontporch, bt->hsync, bt->hbackporch,
+		bt->vfrontporch, bt->vsync, bt->vbackporch);
+
+	return 0;
+}
+
+static void lt8619c_config_all(struct v4l2_subdev *sd)
+{
+	lt8619c_wait_for_signal_stable(sd);
+	LVDSPLL_Lock_Det(sd);
+	lt8619c_yuv_config(sd);
+	LT8619C_phase_config(sd);
+	lt8619c_format_change(sd);
+}
+
+static void lt8619c_delayed_work_enable_hotplug(struct work_struct *work)
+{
+	struct delayed_work *dwork = to_delayed_work(work);
+	struct lt8619c *lt8619c = container_of(dwork, struct lt8619c,
+			delayed_work_enable_hotplug);
+	struct v4l2_subdev *sd = &lt8619c->sd;
+
+	v4l2_dbg(2, debug, sd, "%s: in\n", __func__);
+	mutex_lock(&lt8619c->confctl_mutex);
+	if (tx_5v_power_present(sd)) {
+		lt8619c_set_hpd(sd, 1);
+		lt8619c_config_all(sd);
+		lt8619c->nosignal = false;
+		/* monitor resolution after 100ms */
+		schedule_delayed_work(&lt8619c->delayed_work_monitor_resolution,
+				HZ / 10);
+	} else {
+		cancel_delayed_work(&lt8619c->delayed_work_monitor_resolution);
+		enable_stream(sd, false);
+		lt8619c_set_hpd(sd, 0);
+		lt8619c->nosignal = true;
+	}
+	mutex_unlock(&lt8619c->confctl_mutex);
+}
+
+static void lt8619c_delayed_work_monitor_resolution(struct work_struct *work)
+{
+	struct delayed_work *dwork = to_delayed_work(work);
+	struct lt8619c *lt8619c = container_of(dwork, struct lt8619c,
+			delayed_work_monitor_resolution);
+	struct v4l2_subdev *sd = &lt8619c->sd;
+	struct v4l2_dv_timings timings;
+	bool is_supported_res, is_timing_changed;
+
+	v4l2_dbg(1, debug, sd, "%s: in\n", __func__);
+	if (!tx_5v_power_present(sd)) {
+		v4l2_dbg(2, debug, sd, "%s: HDMI pull out, return!\n", __func__);
+		lt8619c->nosignal = true;
+		return;
+	}
+
+	mutex_lock(&lt8619c->confctl_mutex);
+	lt8619c_get_detected_timings(sd, &timings);
+	is_supported_res = lt8619c_rcv_supported_res(sd, &timings);
+	is_timing_changed = lt8619c_timing_changed(sd, &timings);
+	v4l2_dbg(2, debug, sd,
+		"%s: is_supported_res: %d, is_timing_changed: %d\n",
+		__func__, is_supported_res, is_timing_changed);
+
+	if (!is_supported_res) {
+		lt8619c->nosignal = true;
+		v4l2_dbg(1, debug, sd, "%s: no supported res, cfg as nosignal!\n",
+				__func__);
+	}
+
+	if (is_supported_res && is_timing_changed) {
+		lt8619c_config_all(sd);
+		lt8619c->nosignal = false;
+	}
+	mutex_unlock(&lt8619c->confctl_mutex);
+
+	schedule_delayed_work(&lt8619c->delayed_work_monitor_resolution, HZ);
+}
+
+static void lt8619c_load_hdcpkey(struct v4l2_subdev *sd)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+	int wait_cnt = 5;
+	u32 val;
+
+	regmap_write(lt8619c->reg_map, BANK_REG, BANK_80);
+	regmap_write(lt8619c->reg_map, 0xb2, 0x50);
+	regmap_write(lt8619c->reg_map, 0xa3, 0x77);
+	while (wait_cnt) {
+		usleep_range(50*1000, 50*1000);
+		regmap_read(lt8619c->reg_map, 0xc0, &val);
+		if (val & 0x8)
+			break;
+		wait_cnt--;
+	}
+
+	regmap_write(lt8619c->reg_map, 0xb2, 0xd0);
+	regmap_write(lt8619c->reg_map, 0xa3, 0x57);
+	if (val & 0x8)
+		v4l2_info(sd, "load hdcp key success!\n");
+	else
+		v4l2_err(sd, "load hdcp key failed!\n");
+}
+
+static void lt8619c_set_hdmi_hdcp(struct v4l2_subdev *sd, bool enable)
+{
+	v4l2_dbg(2, debug, sd, "%s: %sable\n", __func__, enable ? "en" : "dis");
+
+	if (enable)
+		lt8619c_load_hdcpkey(sd);
+	else
+		v4l2_info(sd, "disable hdcp function!\n");
+}
+
+static void lt8619c_mode_config(struct v4l2_subdev *sd)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+
+	regmap_write(lt8619c->reg_map, BANK_REG, BANK_80);
+	regmap_update_bits(lt8619c->reg_map, 0x2c, BIT(5) | BIT(4), BIT(5) | BIT(4));
+
+	regmap_write(lt8619c->reg_map, BANK_REG, BANK_60);
+	regmap_write(lt8619c->reg_map, 0x80, CLK_SRC);
+	regmap_write(lt8619c->reg_map, 0x89, REF_RESISTANCE);
+	regmap_write(lt8619c->reg_map, 0x8b, 0x90);
+	/* Turn off BT output */
+	regmap_write(lt8619c->reg_map, 0xa8, 0x07);
+	/* enable PLL detect */
+	regmap_write(lt8619c->reg_map, 0x04, 0xf2);
+
+	if (lt8619c->BT656_double_clk_en) {
+		regmap_write(lt8619c->reg_map, 0x96, 0x71);
+		regmap_write(lt8619c->reg_map, 0xa0, 0x51);
+		regmap_write(lt8619c->reg_map, 0xa3, 0x44);
+		regmap_write(lt8619c->reg_map, 0xa2, 0x20);
+	} else {
+		regmap_write(lt8619c->reg_map, 0x96, 0x71);
+		regmap_write(lt8619c->reg_map, 0xa0, 0x50);
+		regmap_write(lt8619c->reg_map, 0xa3, 0x44);
+		regmap_write(lt8619c->reg_map, 0xa2, 0x20);
+	}
+	regmap_update_bits(lt8619c->reg_map, 0x60, OUTPUT_MODE_MASK,
+			lt8619c->yuv_output_mode);
+
+	if (lt8619c->clk_ddrmode_en)
+		regmap_write(lt8619c->reg_map, 0xa4, 0x14);
+	else
+		regmap_write(lt8619c->reg_map, 0xa4, 0x10);
+
+	/* Vblank change reference EAV flag. */
+	regmap_write(lt8619c->reg_map, 0x6f, 0x04);
+
+	v4l2_dbg(1, debug, sd, "%s: output mode:%s, clk ddrmode en:%d\n",
+		__func__, (lt8619c->yuv_output_mode == BT656_OUTPUT) ? "BT656" :
+		"BT1120", lt8619c->clk_ddrmode_en);
+}
+
+static void lt8619c_set_hpd(struct v4l2_subdev *sd, int en)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+	int level;
+
+	v4l2_dbg(2, debug, sd, "%s: %d\n", __func__, en);
+
+	level = lt8619c->hpd_output_inverted ? !en : en;
+	regmap_write(lt8619c->reg_map, BANK_REG, BANK_80);
+	if (level)
+		regmap_update_bits(lt8619c->reg_map, 0x06, BIT(3), BIT(3));
+	else
+		regmap_update_bits(lt8619c->reg_map, 0x06, BIT(3), 0);
+}
+
+static void lt8619c_write_edid(struct v4l2_subdev *sd,
+				struct v4l2_subdev_edid *edid)
+{
+	int i;
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+	u32 edid_len = edid->blocks * EDID_BLOCK_SIZE;
+
+	regmap_write(lt8619c->reg_map, BANK_REG, BANK_80);
+	/* Enable EDID shadow operation */
+	regmap_write(lt8619c->reg_map, 0x8e, 0x07);
+	/* EDID data write start address */
+	regmap_write(lt8619c->reg_map, 0x8f, 0x00);
+
+	for (i = 0; i < edid_len; i++)
+		regmap_write(lt8619c->reg_map, 0x90, edid->edid[i]);
+
+	regmap_write(lt8619c->reg_map, 0x8e, 0x02);
+}
+
+static void lt8619c_read_edid(struct v4l2_subdev *sd, u8 *edid, u32 len)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+	int i;
+	u32 val;
+
+	regmap_write(lt8619c->reg_map, BANK_REG, BANK_80);
+	/* Enable EDID shadow operation */
+	regmap_write(lt8619c->reg_map, 0x8e, 0x07);
+	/* EDID data write start address */
+	regmap_write(lt8619c->reg_map, 0x8f, 0x00);
+	for (i = 0; i < len; i++) {
+		regmap_read(lt8619c->reg_map, 0x90, &val);
+		edid[i] = val;
+	}
+	regmap_write(lt8619c->reg_map, 0x8e, 0x02);
+}
+
+static int lt8619c_s_ctrl_detect_tx_5v(struct v4l2_subdev *sd)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+
+	return v4l2_ctrl_s_ctrl(lt8619c->detect_tx_5v_ctrl,
+			tx_5v_power_present(sd));
+}
+
+static int lt8619c_update_controls(struct v4l2_subdev *sd)
+{
+	int ret = 0;
+
+	ret = lt8619c_s_ctrl_detect_tx_5v(sd);
+
+	return ret;
+}
+
+static void enable_stream(struct v4l2_subdev *sd, bool enable)
+{
+	if (enable)
+		v4l2_info(sd, "%s: stream on!\n", __func__);
+	else
+		v4l2_info(sd, "%s: stream off!\n", __func__);
+}
+
+static void lt8619c_set_bt_tx_timing(struct v4l2_subdev *sd)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+	struct v4l2_dv_timings timings;
+	struct v4l2_bt_timings *bt = &timings.bt;
+	u32 h_offset, v_offset, v_blank, htotal, vtotal;
+	u32 hact, hfp, hbp, hs, vact, vfp, vbp, vs;
+	u32 double_cnt = 1;
+
+	/* read timing from HDMI RX */
+	lt8619c_get_detected_timings(sd, &timings);
+
+	hact = bt->width;
+	vact = bt->height;
+	hfp = bt->hfrontporch;
+	hs = bt->hsync;
+	hbp = bt->hbackporch;
+	vfp = bt->vfrontporch;
+	vs = bt->vsync;
+	vbp = bt->vbackporch;
+	htotal = hs + hbp + hact + hfp;
+	vtotal = vs + vbp + vact + vfp;
+	h_offset = hbp + hs;
+	v_offset = vbp + vs;
+	v_blank = vtotal - vact;
+
+	if (bt->interlaced == V4L2_DV_INTERLACED) {
+		/* already *2 in lt8619c_get_detected_timings */
+		vact /= 2;
+		double_cnt = 2;
+		regmap_update_bits(lt8619c->reg_map, 0x60, IP_SEL_MASK,
+				INTERLACE_INDICATOR);
+	}
+
+	vact = vact * double_cnt;
+	vtotal = vtotal * double_cnt;
+
+	v4l2_dbg(2, debug, sd,
+		"%s: act:%dx%d, total:%dx%d, h_offset:%d, v_offset:%d, v_blank:%d\n",
+		__func__, hact, vact, htotal, vtotal, h_offset, v_offset, v_blank);
+	v4l2_dbg(2, debug, sd,
+		"%s: hfp:%d, hs:%d, hbp:%d, vfp:%d, vs:%d, vbp:%d\n",
+		__func__, hfp, hs, hbp, vfp, vs, vbp);
+
+	/* write timing to BT TX */
+	regmap_write(lt8619c->reg_map, BANK_REG, BANK_60);
+	regmap_write(lt8619c->reg_map, 0x61, (h_offset >> 8) & 0xff);
+	regmap_write(lt8619c->reg_map, 0x62, h_offset & 0xff);
+	regmap_write(lt8619c->reg_map, 0x63, (hact >> 8) & 0xff);
+	regmap_write(lt8619c->reg_map, 0x64, hact & 0xff);
+	regmap_write(lt8619c->reg_map, 0x65, (htotal >> 8) & 0xff);
+	regmap_write(lt8619c->reg_map, 0x66, htotal & 0xff);
+	regmap_write(lt8619c->reg_map, 0x67, v_offset & 0xff);
+	regmap_write(lt8619c->reg_map, 0x68, v_blank & 0xff);
+	regmap_write(lt8619c->reg_map, 0x69, (vact >> 8) & 0xff);
+	regmap_write(lt8619c->reg_map, 0x6a, vact & 0xff);
+	regmap_write(lt8619c->reg_map, 0x6b, (vtotal >> 8) & 0xff);
+	regmap_write(lt8619c->reg_map, 0x6c, vtotal & 0xff);
+}
+
+static void lt8619c_power_on(struct lt8619c *lt8619c)
+{
+	if (lt8619c->power_gpio) {
+		gpiod_set_value(lt8619c->power_gpio, 1);
+		usleep_range(1000, 1100);
+	}
+
+	if (lt8619c->reset_gpio) {
+		gpiod_set_value(lt8619c->reset_gpio, 1);
+		usleep_range(100*1000, 110*1000);
+		gpiod_set_value(lt8619c->reset_gpio, 0);
+		usleep_range(50*1000, 50*1000);
+	}
+}
+
+static void lt8619c_wait_for_signal_stable(struct v4l2_subdev *sd)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+	int i;
+	u32 val;
+
+	regmap_write(lt8619c->reg_map, BANK_REG, BANK_80);
+	for (i = 0; i < WAIT_MAX_TIMES; i++) {
+		usleep_range(100*1000, 110*1000);
+		regmap_read(lt8619c->reg_map, 0x43, &val);
+		if (val & 0x80)
+			break;
+	}
+
+	if (val & 0x80)
+		v4l2_info(sd, "tmds clk det success, wait cnt:%d!\n", i);
+	else
+		v4l2_err(sd, "tmds clk det failed!\n");
+
+	for (i = 0; i < WAIT_MAX_TIMES; i++) {
+		usleep_range(100*1000, 110*1000);
+		regmap_read(lt8619c->reg_map, 0x13, &val);
+		if (val & 0x01)
+			break;
+	}
+
+	if (val & 0x01)
+		v4l2_info(sd, "Hsync stable, wait cnt:%d!\n", i);
+	else
+		v4l2_err(sd, "Hsync unstable!\n");
+
+	/* reset HDMI RX logic */
+	regmap_write(lt8619c->reg_map, BANK_REG, BANK_60);
+	regmap_write(lt8619c->reg_map, 0x09, 0x7f);
+	usleep_range(10*1000, 11*1000);
+	regmap_write(lt8619c->reg_map, 0x09, 0xff);
+	usleep_range(100*1000, 110*1000);
+
+	/* reset video check logic */
+	regmap_write(lt8619c->reg_map, 0x0c, 0xfb);
+	usleep_range(10*1000, 11*1000);
+	regmap_write(lt8619c->reg_map, 0x0c, 0xff);
+	usleep_range(100*1000, 110*1000);
+}
+
+static void LVDSPLL_Lock_Det(struct v4l2_subdev *sd)
+{
+	int temp = 0;
+	u32 val;
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+
+	regmap_write(lt8619c->reg_map, BANK_REG, BANK_60);
+	regmap_write(lt8619c->reg_map, 0x0e, 0xfd);
+	usleep_range(5*1000, 5*1000);
+	regmap_write(lt8619c->reg_map, 0x0e, 0xff);
+	usleep_range(100*1000, 100*1000);
+
+	regmap_write(lt8619c->reg_map, BANK_REG, BANK_80);
+	regmap_read(lt8619c->reg_map, 0x87, &val);
+	while ((val & 0x20) == 0x00) {
+		regmap_write(lt8619c->reg_map, BANK_REG, BANK_60);
+		regmap_write(lt8619c->reg_map, 0x0e, 0xfd);
+		usleep_range(5*1000, 5*1000);
+		regmap_write(lt8619c->reg_map, 0x0e, 0xff);
+
+		regmap_write(lt8619c->reg_map, BANK_REG, BANK_80);
+		regmap_read(lt8619c->reg_map, 0x87, &val);
+
+		temp++;
+		if (temp > 3) {
+			v4l2_err(sd, "lvds pll lock det failed!\n");
+			break;
+		}
+	}
+}
+
+static void LT8619C_phase_config(struct v4l2_subdev *sd)
+{
+	u32 i, val;
+	int start = -1;
+	int end = -1;
+	u32 bt_clk_lag  = 0;
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+
+	regmap_write(lt8619c->reg_map, BANK_REG, BANK_80);
+	regmap_read(lt8619c->reg_map, 0x87, &val);
+	while ((val & 0x20) == 0x00) {
+		regmap_write(lt8619c->reg_map, BANK_REG, BANK_60);
+		regmap_write(lt8619c->reg_map, 0x0e, 0xfd);
+		usleep_range(5*1000, 5*1000);
+		regmap_write(lt8619c->reg_map, 0x0e, 0xff);
+
+		regmap_write(lt8619c->reg_map, 0x0a, 0x3f);
+		usleep_range(5*1000, 5*1000);
+		regmap_write(lt8619c->reg_map, 0x0a, 0x7f);
+		usleep_range(100*1000, 100*1000);
+
+		regmap_write(lt8619c->reg_map, BANK_REG, BANK_80);
+		regmap_read(lt8619c->reg_map, 0x87, &val);
+	}
+
+	for (i = 0; i < ARRAY_SIZE(phase_num); i++) {
+		regmap_write(lt8619c->reg_map, BANK_REG, BANK_60);
+		regmap_write(lt8619c->reg_map, 0xa2, phase_num[i]);
+		usleep_range(50*1000, 50*1000);
+		regmap_read(lt8619c->reg_map, 0x91, &val);
+
+		if (val == 0x05) {
+			bt_clk_lag = 1;
+			break;
+		} else if (val == 0x01) {
+			if (start == -1)
+				start = i;
+
+			end = i;
+		}
+	}
+
+	v4l2_info(sd, "%s: BT_clk_lag:%d, start:%d, end:%d!\n", __func__,
+			bt_clk_lag, start, end);
+	if (bt_clk_lag) {
+		regmap_write(lt8619c->reg_map, 0xa2, phase_num[i]);
+	} else {
+		if ((start != -1) && (end != -1) && (end >= start))
+			regmap_write(lt8619c->reg_map, 0xa2,
+					phase_num[start + (end - start) / 2]);
+		else
+			regmap_write(lt8619c->reg_map, 0xa2,
+					phase_num[ARRAY_SIZE(phase_num) - 1]);
+	}
+
+	/* Turn on BT output */
+	regmap_write(lt8619c->reg_map, 0xa8, 0x0f);
+}
+
+static void sync_polarity_config(struct v4l2_subdev *sd)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+	u32 val, adj;
+
+	if (lt8619c->bt_tx_sync_pol == BT_TX_SYNC_POSITIVE) {
+		v4l2_info(sd, "%s: cfg h_vsync pol: POSITIVE\n", __func__);
+		regmap_write(lt8619c->reg_map, BANK_REG, BANK_60);
+		regmap_update_bits(lt8619c->reg_map, 0x60, SYNC_POL_MASK,
+				BT_TX_SYNC_POSITIVE);
+		regmap_write(lt8619c->reg_map, BANK_REG, BANK_80);
+		regmap_read(lt8619c->reg_map, 0x17, &val);
+		regmap_read(lt8619c->reg_map, 0x05, &adj);
+		if ((val & RGOD_VID_VSPOL) != RGOD_VID_VSPOL) {
+			adj ^= RGD_VS_POL_ADJ_MASK;
+			regmap_update_bits(lt8619c->reg_map, 0x05,
+					RGD_VS_POL_ADJ_MASK, adj);
+		}
+
+		if ((val & RGOD_VID_HSPOL) != RGOD_VID_HSPOL) {
+			adj ^= RGD_HS_POL_ADJ_MASK;
+			regmap_update_bits(lt8619c->reg_map, 0x05,
+					RGD_HS_POL_ADJ_MASK, adj);
+		}
+	} else {
+		v4l2_info(sd, "%s: cfg h_vsync pol: NEGATIVE\n", __func__);
+		regmap_write(lt8619c->reg_map, BANK_REG, BANK_60);
+		regmap_update_bits(lt8619c->reg_map, 0x60, SYNC_POL_MASK,
+				BT_TX_SYNC_NEGATIVE);
+		regmap_write(lt8619c->reg_map, BANK_REG, BANK_80);
+		regmap_read(lt8619c->reg_map, 0x17, &val);
+		regmap_read(lt8619c->reg_map, 0x05, &adj);
+		if ((val & RGOD_VID_VSPOL) == RGOD_VID_VSPOL) {
+			adj ^= RGD_VS_POL_ADJ_MASK;
+			regmap_update_bits(lt8619c->reg_map, 0x05,
+					RGD_VS_POL_ADJ_MASK, adj);
+		}
+
+		if ((val & RGOD_VID_HSPOL) == RGOD_VID_HSPOL) {
+			adj ^= RGD_HS_POL_ADJ_MASK;
+			regmap_update_bits(lt8619c->reg_map, 0x05,
+					RGD_HS_POL_ADJ_MASK, adj);
+		}
+	}
+}
+
+static void lt8619c_yuv_config(struct v4l2_subdev *sd)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+	u32 val, colorspace;
+
+	sync_polarity_config(sd);
+
+	/* softrest BT TX module */
+	regmap_write(lt8619c->reg_map, BANK_REG, BANK_60);
+	regmap_update_bits(lt8619c->reg_map, 0x0d, BIT(1) | BIT(0), 0);
+	usleep_range(10*1000, 10*1000);
+	regmap_update_bits(lt8619c->reg_map, 0x0d, BIT(1) | BIT(0), BIT(1) | BIT(0));
+
+	/* ColorSpace convert */
+	regmap_write(lt8619c->reg_map, BANK_REG, BANK_80);
+	regmap_read(lt8619c->reg_map, 0x71, &val);
+	colorspace = (val & 0x60) >> 5;
+	if (colorspace == 2) {
+		/* YCbCr444 convert YCbCr422 enable */
+		regmap_write(lt8619c->reg_map, BANK_REG, BANK_60);
+		regmap_write(lt8619c->reg_map, 0x07, 0xf0);
+		regmap_write(lt8619c->reg_map, 0x52, 0x02 +
+				lt8619c->cp_convert_mode);
+		v4l2_info(sd, "%s: colorspace: yuv444\n", __func__);
+	} else if (colorspace == 1) {
+		/* yuv422 */
+		regmap_write(lt8619c->reg_map, BANK_REG, BANK_60);
+		regmap_write(lt8619c->reg_map, 0x07, 0x80);
+		regmap_write(lt8619c->reg_map, 0x52, 0x00);
+		v4l2_info(sd, "%s: colorspace: yuv222\n", __func__);
+	} else {
+		/* RGB convert YCbCr422 enable */
+		regmap_write(lt8619c->reg_map, BANK_REG, BANK_60);
+		regmap_write(lt8619c->reg_map, 0x07, 0xf0);
+		regmap_write(lt8619c->reg_map, 0x52, 0x0a +
+					lt8619c->cp_convert_mode);
+		v4l2_info(sd, "%s: colorspace: RGB\n", __func__);
+	}
+
+	lt8619c_set_bt_tx_timing(sd);
+	regmap_write(lt8619c->reg_map, BANK_REG, BANK_60);
+	regmap_write(lt8619c->reg_map, 0x6d, lt8619c->yc_swap);
+	regmap_write(lt8619c->reg_map, 0x6e, lt8619c->yuv_colordepth);
+
+	/* LVDS PLL soft reset */
+	regmap_update_bits(lt8619c->reg_map, 0x0e, BIT(1), 0);
+	usleep_range(50*1000, 50*1000);
+	regmap_update_bits(lt8619c->reg_map, 0x0e, BIT(1), BIT(1));
+
+	/* BT TX controller and afifo soft reset */
+	regmap_update_bits(lt8619c->reg_map, 0x0d, BIT(1) | BIT(0), 0);
+	usleep_range(50*1000, 50*1000);
+	regmap_update_bits(lt8619c->reg_map, 0x0d, BIT(1) | BIT(0), BIT(1) | BIT(0));
+}
+
+static void lt8619c_initial_setup(struct v4l2_subdev *sd)
+{
+	static struct v4l2_dv_timings default_timing =
+		V4L2_DV_BT_CEA_640X480P59_94;
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+	struct v4l2_subdev_edid def_edid;
+
+	def_edid.pad = 0;
+	def_edid.start_block = 0;
+	def_edid.blocks = 2;
+	def_edid.edid = edid_init_data;
+	lt8619c->enable_hdcp = false;
+	lt8619c->yuv_output_mode = YUV_OUTPUT_MODE;
+	lt8619c->clk_ddrmode_en = false;
+	lt8619c->cp_convert_mode = CP_CONVERT_MODE;
+	lt8619c->yc_swap = YC_SWAP;
+	lt8619c->yuv_colordepth = YUV_COLORDEPTH;
+	lt8619c->bt_tx_sync_pol = BT_TX_SYNC_POL;
+
+	if (lt8619c->yuv_output_mode == BT656_OUTPUT)
+		lt8619c->BT656_double_clk_en = true;
+	else
+		lt8619c->BT656_double_clk_en = false;
+
+	lt8619c_set_hpd(sd, 0);
+	lt8619c_write_edid(sd, &def_edid);
+	lt8619c->edid_blocks_written = def_edid.blocks;
+	lt8619c_set_hdmi_hdcp(sd, lt8619c->enable_hdcp);
+	lt8619c_mode_config(sd);
+
+	if (tx_5v_power_present(sd)) {
+		lt8619c_set_hpd(sd, 1);
+		lt8619c_config_all(sd);
+		/* monitor resolution after 100ms */
+		schedule_delayed_work(&lt8619c->delayed_work_monitor_resolution,
+				HZ / 10);
+	} else {
+		lt8619c_s_dv_timings(sd, &default_timing);
+	}
+
+	v4l2_dbg(1, debug, sd, "%s: init ok\n", __func__);
+}
+
+static void lt8619c_format_change(struct v4l2_subdev *sd)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+	struct v4l2_dv_timings timings;
+	const struct v4l2_event lt8619c_ev_fmt = {
+		.type = V4L2_EVENT_SOURCE_CHANGE,
+		.u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION,
+	};
+
+	lt8619c_get_detected_timings(sd, &timings);
+	if (!v4l2_match_dv_timings(&lt8619c->timings, &timings, 0, false)) {
+		/* automatically set timing rather than set by userspace */
+		lt8619c_s_dv_timings(sd, &timings);
+		v4l2_print_dv_timings(sd->name,
+			"lt8619c_format_change: New format: ", &timings, false);
+
+	}
+
+	if (sd->devnode)
+		v4l2_subdev_notify_event(sd, &lt8619c_ev_fmt);
+}
+
+static bool lt8619c_timing_changed(struct v4l2_subdev *sd,
+		struct v4l2_dv_timings *timings)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+	struct v4l2_bt_timings *new_bt = &timings->bt;
+	struct v4l2_bt_timings *bt = &lt8619c->timings.bt;
+
+	if ((bt->width != new_bt->width) |
+	    (bt->height != new_bt->height) |
+	    (abs(bt->hfrontporch - new_bt->hfrontporch) > 1) |
+	    (abs(bt->hsync - new_bt->hsync) > 1) |
+	    (abs(bt->hbackporch - new_bt->hbackporch) > 1) |
+	    (abs(bt->vfrontporch - new_bt->vfrontporch) > 1) |
+	    (abs(bt->vsync - new_bt->vsync) > 1) |
+	    (abs(bt->vbackporch - new_bt->vbackporch) > 1) |
+	    (abs(bt->pixelclock - new_bt->pixelclock) > 5000)) {
+		v4l2_info(sd, "%s: timing changed!\n", __func__);
+		return true;
+	}
+
+	return false;
+}
+
+static bool lt8619c_rcv_supported_res(struct v4l2_subdev *sd,
+					struct v4l2_dv_timings *timings)
+{
+	u32 i;
+	u32 hact, vact, htotal, vtotal;
+	struct v4l2_bt_timings *bt = &timings->bt;
+
+	hact = bt->width;
+	vact = bt->height;
+	htotal = bt->hsync + bt->hbackporch + hact + bt->hfrontporch;
+	vtotal = bt->vsync + bt->vbackporch + vact + bt->vfrontporch;
+
+	for (i = 0; i < ARRAY_SIZE(supported_modes); i++) {
+		if ((supported_modes[i].width == hact) &&
+		    (supported_modes[i].height == vact) &&
+		    (supported_modes[i].hts_def == htotal) &&
+		    (supported_modes[i].vts_def == vtotal)) {
+			break;
+		}
+	}
+
+	if (i == ARRAY_SIZE(supported_modes)) {
+		v4l2_err(sd, "%s do not support res act: %dx%d, total: %dx%d\n",
+				__func__, hact, vact, htotal, vtotal);
+		return false;
+	}
+
+	if (bt->pixelclock < 25000000) {
+		v4l2_err(sd, "%s pixclk: %llu, err!\n", __func__, bt->pixelclock);
+		return false;
+	}
+
+	return true;
+}
+
+static int lt8619c_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh,
+				    struct v4l2_event_subscription *sub)
+{
+	switch (sub->type) {
+	case V4L2_EVENT_SOURCE_CHANGE:
+		return v4l2_src_change_event_subdev_subscribe(sd, fh, sub);
+	case V4L2_EVENT_CTRL:
+		return v4l2_ctrl_subdev_subscribe_event(sd, fh, sub);
+	default:
+		return -EINVAL;
+	}
+}
+
+static int lt8619c_g_input_status(struct v4l2_subdev *sd, u32 *status)
+{
+	*status = 0;
+	*status |= no_signal(sd) ? V4L2_IN_ST_NO_SIGNAL : 0;
+
+	v4l2_dbg(1, debug, sd, "%s: status = 0x%x\n", __func__, *status);
+
+	return 0;
+}
+
+static int lt8619c_s_dv_timings(struct v4l2_subdev *sd,
+				 struct v4l2_dv_timings *timings)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+
+	if (!timings)
+		return -EINVAL;
+
+	if (debug)
+		v4l2_print_dv_timings(sd->name, "lt8619c_s_dv_timings: ",
+				timings, false);
+
+	if (v4l2_match_dv_timings(&lt8619c->timings, timings, 0, false)) {
+		v4l2_dbg(1, debug, sd, "%s: no change\n", __func__);
+		return 0;
+	}
+
+	if (!v4l2_valid_dv_timings(timings, &lt8619c_timings_cap, NULL, NULL)) {
+		v4l2_dbg(1, debug, sd, "%s: timings out of range\n", __func__);
+		return -ERANGE;
+	}
+
+	lt8619c->timings = *timings;
+	enable_stream(sd, false);
+
+	return 0;
+}
+
+static int lt8619c_g_dv_timings(struct v4l2_subdev *sd,
+				 struct v4l2_dv_timings *timings)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+
+	*timings = lt8619c->timings;
+
+	return 0;
+}
+
+static int lt8619c_enum_dv_timings(struct v4l2_subdev *sd,
+				    struct v4l2_enum_dv_timings *timings)
+{
+	if (timings->pad != 0)
+		return -EINVAL;
+
+	return v4l2_enum_dv_timings_cap(timings, &lt8619c_timings_cap, NULL, NULL);
+}
+
+static int lt8619c_query_dv_timings(struct v4l2_subdev *sd,
+		struct v4l2_dv_timings *timings)
+{
+	int ret;
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+
+	mutex_lock(&lt8619c->confctl_mutex);
+	ret = lt8619c_get_detected_timings(sd, timings);
+	mutex_unlock(&lt8619c->confctl_mutex);
+	if (ret)
+		return ret;
+
+	if (debug)
+		v4l2_print_dv_timings(sd->name, "lt8619c_query_dv_timings: ",
+				timings, false);
+
+	if (!v4l2_valid_dv_timings(timings, &lt8619c_timings_cap, NULL, NULL)) {
+		v4l2_dbg(1, debug, sd, "%s: timings out of range\n", __func__);
+		return -ERANGE;
+	}
+
+	return 0;
+}
+
+static int lt8619c_dv_timings_cap(struct v4l2_subdev *sd,
+		struct v4l2_dv_timings_cap *cap)
+{
+	if (cap->pad != 0)
+		return -EINVAL;
+
+	*cap = lt8619c_timings_cap;
+
+	return 0;
+}
+
+static int lt8619c_g_mbus_config(struct v4l2_subdev *sd,
+			     struct v4l2_mbus_config *cfg)
+{
+	cfg->type = V4L2_MBUS_BT656;
+	cfg->flags = V4L2_MBUS_HSYNC_ACTIVE_HIGH |
+		     V4L2_MBUS_VSYNC_ACTIVE_HIGH |
+		     V4L2_MBUS_PCLK_SAMPLE_RISING;
+
+	return 0;
+}
+
+static int lt8619c_s_stream(struct v4l2_subdev *sd, int enable)
+{
+	enable_stream(sd, enable);
+
+	return 0;
+}
+
+static int lt8619c_enum_mbus_code(struct v4l2_subdev *sd,
+		struct v4l2_subdev_pad_config *cfg,
+		struct v4l2_subdev_mbus_code_enum *code)
+{
+	switch (code->index) {
+	case 0:
+		code->code = MEDIA_BUS_FMT_UYVY8_2X8;
+		break;
+
+	default:
+		return -EINVAL;
+	}
+	return 0;
+}
+
+static int lt8619c_get_ctrl(struct v4l2_ctrl *ctrl)
+{
+	int ret = -1;
+	struct lt8619c *lt8619c = container_of(ctrl->handler, struct lt8619c, hdl);
+	struct v4l2_subdev *sd = &(lt8619c->sd);
+
+	if (ctrl->id == V4L2_CID_DV_RX_POWER_PRESENT) {
+		ret = tx_5v_power_present(sd);
+		*ctrl->p_new.p_s32 = ret;
+	}
+
+	return ret;
+}
+
+static int lt8619c_enum_frame_sizes(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_pad_config *cfg,
+				   struct v4l2_subdev_frame_size_enum *fse)
+{
+	v4l2_dbg(1, debug, sd, "%s:\n", __func__);
+
+	if (fse->index >= ARRAY_SIZE(supported_modes))
+		return -EINVAL;
+
+	if (fse->code != MEDIA_BUS_FMT_UYVY8_2X8)
+		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;
+
+	return 0;
+}
+
+static int lt8619c_enum_frame_interval(struct v4l2_subdev *sd,
+				       struct v4l2_subdev_pad_config *cfg,
+				       struct v4l2_subdev_frame_interval_enum *fie)
+{
+	if (fie->index >= ARRAY_SIZE(supported_modes))
+		return -EINVAL;
+
+	if (fie->code != MEDIA_BUS_FMT_UYVY8_2X8)
+		return -EINVAL;
+
+	fie->width = supported_modes[fie->index].width;
+	fie->height = supported_modes[fie->index].height;
+	fie->interval = supported_modes[fie->index].max_fps;
+	return 0;
+}
+
+static int lt8619c_get_fmt(struct v4l2_subdev *sd,
+		struct v4l2_subdev_pad_config *cfg,
+		struct v4l2_subdev_format *format)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+	struct v4l2_bt_timings *bt = &(lt8619c->timings.bt);
+
+	mutex_lock(&lt8619c->confctl_mutex);
+	format->format.code = lt8619c->mbus_fmt_code;
+	format->format.width = lt8619c->timings.bt.width;
+	format->format.height = lt8619c->timings.bt.height;
+	format->format.colorspace = V4L2_COLORSPACE_SRGB;
+	if (bt->interlaced == V4L2_DV_INTERLACED)
+		format->format.field = V4L2_FIELD_INTERLACED;
+	else
+		format->format.field = V4L2_FIELD_NONE;
+	mutex_unlock(&lt8619c->confctl_mutex);
+
+	v4l2_dbg(2, debug, sd, "fmt code:%d, w:%d, h:%d, field:%s, cosp:%d\n",
+			format->format.code,
+			format->format.width,
+			format->format.height,
+			(format->format.field == V4L2_FIELD_INTERLACED) ?
+				"I" : "P",
+			format->format.colorspace);
+
+	return 0;
+}
+
+static int lt8619c_get_reso_dist(const struct lt8619c_mode *mode,
+				 struct v4l2_mbus_framefmt *framefmt)
+{
+	return abs(mode->width - framefmt->width) +
+	       abs(mode->height - framefmt->height);
+}
+
+static const struct lt8619c_mode *
+lt8619c_find_best_fit(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 < ARRAY_SIZE(supported_modes); i++) {
+		dist = lt8619c_get_reso_dist(&supported_modes[i], framefmt);
+		if (cur_best_fit_dist == -1 || dist < cur_best_fit_dist) {
+			cur_best_fit_dist = dist;
+			cur_best_fit = i;
+		}
+	}
+
+	return &supported_modes[cur_best_fit];
+}
+
+static int lt8619c_set_fmt(struct v4l2_subdev *sd,
+		struct v4l2_subdev_pad_config *cfg,
+		struct v4l2_subdev_format *format)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+	const struct lt8619c_mode *mode;
+
+	/* is overwritten by get_fmt */
+	u32 code = format->format.code;
+	int ret = lt8619c_get_fmt(sd, cfg, format);
+
+	format->format.code = code;
+
+	if (ret)
+		return ret;
+
+	switch (code) {
+	case MEDIA_BUS_FMT_UYVY8_2X8:
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	if (format->which == V4L2_SUBDEV_FORMAT_TRY)
+		return 0;
+
+	lt8619c->mbus_fmt_code = format->format.code;
+	mode = lt8619c_find_best_fit(format);
+	lt8619c->cur_mode = mode;
+
+	enable_stream(sd, false);
+
+	return 0;
+}
+
+static int lt8619c_g_edid(struct v4l2_subdev *sd,
+		struct v4l2_subdev_edid *edid)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+
+	memset(edid->reserved, 0, sizeof(edid->reserved));
+
+	if (edid->pad != 0)
+		return -EINVAL;
+
+	if (edid->start_block == 0 && edid->blocks == 0) {
+		edid->blocks = lt8619c->edid_blocks_written;
+		return 0;
+	}
+
+	if (lt8619c->edid_blocks_written == 0)
+		return -ENODATA;
+
+	if (edid->start_block >= lt8619c->edid_blocks_written ||
+			edid->blocks == 0)
+		return -EINVAL;
+
+	if (edid->start_block + edid->blocks > lt8619c->edid_blocks_written)
+		edid->blocks = lt8619c->edid_blocks_written - edid->start_block;
+
+	lt8619c_read_edid(sd, edid->edid, edid->blocks * EDID_BLOCK_SIZE);
+
+	return 0;
+}
+
+static int lt8619c_s_edid(struct v4l2_subdev *sd,
+				struct v4l2_subdev_edid *edid)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+
+	v4l2_dbg(2, debug, sd, "%s, pad %d, start block %d, blocks %d\n",
+		 __func__, edid->pad, edid->start_block, edid->blocks);
+
+	memset(edid->reserved, 0, sizeof(edid->reserved));
+
+	if (edid->pad != 0)
+		return -EINVAL;
+
+	if (edid->start_block != 0)
+		return -EINVAL;
+
+	if (edid->blocks > EDID_NUM_BLOCKS_MAX) {
+		edid->blocks = EDID_NUM_BLOCKS_MAX;
+		return -E2BIG;
+	}
+
+	lt8619c_set_hpd(sd, 0);
+
+	if (edid->blocks == 0) {
+		lt8619c->edid_blocks_written = 0;
+		return 0;
+	}
+
+	lt8619c_write_edid(sd, edid);
+	lt8619c->edid_blocks_written = edid->blocks;
+
+	if (tx_5v_power_present(sd))
+		lt8619c_set_hpd(sd, 1);
+
+	return 0;
+}
+
+static int lt8619c_g_frame_interval(struct v4l2_subdev *sd,
+				    struct v4l2_subdev_frame_interval *fi)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+	const struct lt8619c_mode *mode = lt8619c->cur_mode;
+
+	mutex_lock(&lt8619c->confctl_mutex);
+	fi->interval = mode->max_fps;
+	mutex_unlock(&lt8619c->confctl_mutex);
+
+	return 0;
+}
+
+static int lt8619c_querystd(struct v4l2_subdev *sd, v4l2_std_id *std)
+{
+	*std = V4L2_STD_ATSC;
+	return 0;
+}
+
+static void lt8619c_get_module_inf(struct lt8619c *lt8619c,
+				  struct rkmodule_inf *inf)
+{
+	memset(inf, 0, sizeof(*inf));
+	strscpy(inf->base.sensor, LT8619C_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, lt8619c->module_name,
+		sizeof(inf->base.module));
+	strscpy(inf->base.lens, lt8619c->len_name, sizeof(inf->base.lens));
+}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static int lt8619c_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+	struct v4l2_bt_timings *bt = &(lt8619c->timings.bt);
+	struct v4l2_mbus_framefmt *try_fmt =
+				v4l2_subdev_get_try_format(sd, fh->pad, 0);
+	const struct lt8619c_mode *def_mode = &supported_modes[0];
+
+	mutex_lock(&lt8619c->confctl_mutex);
+	try_fmt->width = def_mode->width;
+	try_fmt->height = def_mode->height;
+	try_fmt->code = MEDIA_BUS_FMT_UYVY8_2X8;
+	if (bt->interlaced == V4L2_DV_INTERLACED)
+		try_fmt->field = V4L2_FIELD_INTERLACED;
+	else
+		try_fmt->field = V4L2_FIELD_NONE;
+	mutex_unlock(&lt8619c->confctl_mutex);
+
+	return 0;
+}
+#endif
+
+static long lt8619c_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+	long ret = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		lt8619c_get_module_inf(lt8619c, (struct rkmodule_inf *)arg);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+
+#ifdef CONFIG_COMPAT
+static long lt8619c_compat_ioctl32(struct v4l2_subdev *sd,
+				  unsigned int cmd, unsigned long arg)
+{
+	void __user *up = compat_ptr(arg);
+	struct rkmodule_inf *inf;
+	long ret;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		inf = kzalloc(sizeof(*inf), GFP_KERNEL);
+		if (!inf) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = lt8619c_ioctl(sd, cmd, inf);
+		if (!ret) {
+			ret = copy_to_user(up, inf, sizeof(*inf));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(inf);
+		break;
+
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+#endif
+
+static const struct v4l2_ctrl_ops lt8619c_ctrl_ops = {
+	.g_volatile_ctrl = lt8619c_get_ctrl,
+};
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static const struct v4l2_subdev_internal_ops lt8619c_subdev_internal_ops = {
+	.open = lt8619c_open,
+};
+#endif
+
+static const struct v4l2_subdev_core_ops lt8619c_core_ops = {
+	.subscribe_event = lt8619c_subscribe_event,
+	.unsubscribe_event = v4l2_event_subdev_unsubscribe,
+	.ioctl = lt8619c_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = lt8619c_compat_ioctl32,
+#endif
+};
+
+static const struct v4l2_subdev_video_ops lt8619c_video_ops = {
+	.g_input_status = lt8619c_g_input_status,
+	.s_dv_timings = lt8619c_s_dv_timings,
+	.g_dv_timings = lt8619c_g_dv_timings,
+	.query_dv_timings = lt8619c_query_dv_timings,
+	.g_mbus_config = lt8619c_g_mbus_config,
+	.s_stream = lt8619c_s_stream,
+	.g_frame_interval = lt8619c_g_frame_interval,
+	.querystd = lt8619c_querystd,
+};
+
+static const struct v4l2_subdev_pad_ops lt8619c_pad_ops = {
+	.enum_mbus_code = lt8619c_enum_mbus_code,
+	.enum_frame_size = lt8619c_enum_frame_sizes,
+	.enum_frame_interval = lt8619c_enum_frame_interval,
+	.set_fmt = lt8619c_set_fmt,
+	.get_fmt = lt8619c_get_fmt,
+	.get_edid = lt8619c_g_edid,
+	.set_edid = lt8619c_s_edid,
+	.enum_dv_timings = lt8619c_enum_dv_timings,
+	.dv_timings_cap = lt8619c_dv_timings_cap,
+};
+
+static const struct v4l2_subdev_ops lt8619c_ops = {
+	.core = &lt8619c_core_ops,
+	.video = &lt8619c_video_ops,
+	.pad = &lt8619c_pad_ops,
+};
+
+static irqreturn_t plugin_detect_irq(int irq, void *dev_id)
+{
+	struct lt8619c *lt8619c = dev_id;
+	struct v4l2_subdev *sd = &lt8619c->sd;
+
+	/* enable hpd after 100ms */
+	schedule_delayed_work(&lt8619c->delayed_work_enable_hotplug, HZ / 10);
+	v4l2_dbg(2, debug, sd, "%s: plug change!\n", __func__);
+	tx_5v_power_present(sd);
+
+	return IRQ_HANDLED;
+}
+
+static int lt8619c_parse_of(struct lt8619c *lt8619c)
+{
+	struct device *dev = &lt8619c->i2c_client->dev;
+	struct device_node *node = dev->of_node;
+	int err;
+
+	lt8619c->hpd_output_inverted = of_property_read_bool(node,
+				"hpd-output-inverted");
+	err = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
+				   &lt8619c->module_index);
+	err |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
+				       &lt8619c->module_facing);
+	err |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME,
+				       &lt8619c->module_name);
+	err |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME,
+				       &lt8619c->len_name);
+	if (err) {
+		dev_err(dev, "could not get module information!\n");
+		return -EINVAL;
+	}
+
+	lt8619c->xvclk = devm_clk_get(dev, "xvclk");
+	if (IS_ERR(lt8619c->xvclk)) {
+		dev_err(dev, "Failed to get xvclk\n");
+		return -EINVAL;
+	}
+
+	err = clk_prepare_enable(lt8619c->xvclk);
+	if (err) {
+		dev_err(dev, "Failed! to enable xvclk\n");
+		return err;
+	}
+
+	lt8619c->power_gpio = devm_gpiod_get_optional(dev, "power", GPIOD_OUT_LOW);
+	if (IS_ERR(lt8619c->power_gpio)) {
+		dev_err(dev, "failed to get power gpio\n");
+		err = PTR_ERR(lt8619c->power_gpio);
+		goto disable_clk;
+	}
+	lt8619c->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
+	if (IS_ERR(lt8619c->reset_gpio)) {
+		dev_err(dev, "failed to get reset gpio\n");
+		err = PTR_ERR(lt8619c->reset_gpio);
+		goto disable_clk;
+	}
+
+	lt8619c->plugin_det_gpio = devm_gpiod_get_optional(dev, "plugin-det",
+			GPIOD_IN);
+	if (IS_ERR(lt8619c->plugin_det_gpio)) {
+		dev_err(dev, "failed to get plugin_det gpio\n");
+		err = PTR_ERR(lt8619c->plugin_det_gpio);
+		goto disable_clk;
+	}
+
+	return 0;
+
+disable_clk:
+	clk_disable_unprepare(lt8619c->xvclk);
+	return err;
+}
+
+static int lt8619c_init_v4l2_ctrls(struct lt8619c *lt8619c)
+{
+	struct v4l2_subdev *sd;
+	int ret;
+
+	sd = &lt8619c->sd;
+	ret = v4l2_ctrl_handler_init(&lt8619c->hdl, 2);
+	if (ret)
+		return ret;
+
+	v4l2_ctrl_new_std(&lt8619c->hdl, NULL, V4L2_CID_PIXEL_RATE,
+			  0, lt8619c_PIXEL_RATE, 1, lt8619c_PIXEL_RATE);
+	lt8619c->detect_tx_5v_ctrl = v4l2_ctrl_new_std(&lt8619c->hdl,
+			&lt8619c_ctrl_ops, V4L2_CID_DV_RX_POWER_PRESENT,
+			0, 1, 0, 0);
+	if (lt8619c->detect_tx_5v_ctrl)
+		lt8619c->detect_tx_5v_ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
+
+	if (lt8619c->hdl.error) {
+		ret = lt8619c->hdl.error;
+		v4l2_err(sd, "cfg v4l2 ctrls failed! ret:%d\n", ret);
+		return ret;
+	}
+	sd->ctrl_handler = &lt8619c->hdl;
+
+	if (lt8619c_update_controls(sd)) {
+		ret = -ENODEV;
+		v4l2_err(sd, "update v4l2 ctrls failed! ret:%d\n", ret);
+		return ret;
+	}
+
+	return 0;
+}
+
+static int lt8619c_check_chip_id(struct lt8619c *lt8619c)
+{
+	struct device *dev = &lt8619c->i2c_client->dev;
+	u32 id_h, id_m, id_l;
+	int ret;
+	u32 chipid;
+
+	regmap_write(lt8619c->reg_map, BANK_REG, BANK_60);
+	ret  = regmap_read(lt8619c->reg_map, CHIPID_REG_H, &id_h);
+	ret |= regmap_read(lt8619c->reg_map, CHIPID_REG_M, &id_m);
+	ret |= regmap_read(lt8619c->reg_map, CHIPID_REG_L, &id_l);
+
+	if (!ret) {
+		chipid = (id_h << 16) | (id_m << 8) | id_l;
+		if (chipid != LT8619C_CHIPID) {
+			dev_err(dev,
+				"check chipid failed, read id:%#x, we expect:%#x\n",
+				chipid, LT8619C_CHIPID);
+			ret = -1;
+		}
+	} else {
+		dev_err(dev, "%s i2c trans failed!\n", __func__);
+		ret = -1;
+	}
+
+	return ret;
+}
+
+static const struct regmap_range lt8619c_readable_ranges[] = {
+	regmap_reg_range(0x00, 0xff),
+};
+
+static const struct regmap_access_table lt8619c_readable_table = {
+	.yes_ranges     = lt8619c_readable_ranges,
+	.n_yes_ranges   = ARRAY_SIZE(lt8619c_readable_ranges),
+};
+
+static const struct regmap_config lt8619c_hdmirx_regmap_cfg = {
+	.name = "lt8619c",
+	.reg_bits = 8,
+	.val_bits = 8,
+	.reg_stride = 1,
+	.max_register = LT8619C_MAX_REGISTER,
+	.reg_format_endian = REGMAP_ENDIAN_LITTLE,
+	.val_format_endian = REGMAP_ENDIAN_LITTLE,
+	.rd_table = &lt8619c_readable_table,
+};
+
+static int lt8619c_probe(struct i2c_client *client,
+			const struct i2c_device_id *id)
+{
+	struct device *dev = &client->dev;
+	struct lt8619c *lt8619c;
+	struct v4l2_subdev *sd;
+	char facing[2];
+	int err;
+
+	dev_info(dev, "driver version: %02x.%02x.%02x",
+		DRIVER_VERSION >> 16,
+		(DRIVER_VERSION & 0xff00) >> 8,
+		DRIVER_VERSION & 0x00ff);
+
+	lt8619c = devm_kzalloc(dev, sizeof(*lt8619c), GFP_KERNEL);
+	if (!lt8619c)
+		return -ENOMEM;
+
+	sd = &lt8619c->sd;
+	lt8619c->i2c_client = client;
+	lt8619c->cur_mode = &supported_modes[0];
+	lt8619c->mbus_fmt_code = MEDIA_BUS_FMT_UYVY8_2X8;
+
+	err = lt8619c_parse_of(lt8619c);
+	if (err)
+		return err;
+
+	mutex_init(&lt8619c->confctl_mutex);
+	err = lt8619c_init_v4l2_ctrls(lt8619c);
+	if (err)
+		goto err_hdl;
+
+	client->flags |= I2C_CLIENT_SCCB;
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+	v4l2_i2c_subdev_init(sd, client, &lt8619c_ops);
+	sd->internal_ops = &lt8619c_subdev_internal_ops;
+	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
+#endif
+
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	lt8619c->pad.flags = MEDIA_PAD_FL_SOURCE;
+	sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
+	err = media_entity_pads_init(&sd->entity, 1, &lt8619c->pad);
+	if (err < 0) {
+		v4l2_err(sd, "media entity init failed! err:%d\n", err);
+		goto err_hdl;
+	}
+#endif
+
+	lt8619c->reg_map = devm_regmap_init_i2c(client, &lt8619c_hdmirx_regmap_cfg);
+	lt8619c_power_on(lt8619c);
+	err = lt8619c_check_chip_id(lt8619c);
+	if (err < 0)
+		goto err_hdl;
+
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(lt8619c->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s",
+		 lt8619c->module_index, facing,
+		 LT8619C_NAME, dev_name(sd->dev));
+	err = v4l2_async_register_subdev_sensor_common(sd);
+	if (err < 0) {
+		v4l2_err(sd, "v4l2 register subdev failed! err:%d\n", err);
+		goto err_subdev;
+	}
+
+	INIT_DELAYED_WORK(&lt8619c->delayed_work_enable_hotplug,
+			lt8619c_delayed_work_enable_hotplug);
+	INIT_DELAYED_WORK(&lt8619c->delayed_work_monitor_resolution,
+			lt8619c_delayed_work_monitor_resolution);
+	lt8619c_initial_setup(sd);
+
+	lt8619c->plugin_irq = gpiod_to_irq(lt8619c->plugin_det_gpio);
+	if (lt8619c->plugin_irq < 0) {
+		dev_err(dev, "failed to get plugin det irq\n");
+		err = lt8619c->plugin_irq;
+		goto err_work_queues;
+	}
+
+	err = devm_request_threaded_irq(dev, lt8619c->plugin_irq, NULL,
+			plugin_detect_irq, IRQF_TRIGGER_FALLING |
+			IRQF_TRIGGER_RISING | IRQF_ONESHOT, "lt8619c", lt8619c);
+	if (err) {
+		dev_err(dev, "failed to register plugin det irq (%d)\n", err);
+		goto err_work_queues;
+	}
+
+	err = v4l2_ctrl_handler_setup(sd->ctrl_handler);
+	if (err) {
+		v4l2_err(sd, "v4l2 ctrl handler setup failed! err:%d\n", err);
+		goto err_work_queues;
+	}
+
+	v4l2_info(sd, "%s found @ 0x%x (%s)\n", client->name,
+		  client->addr << 1, client->adapter->name);
+
+	return 0;
+
+err_work_queues:
+	cancel_delayed_work(&lt8619c->delayed_work_enable_hotplug);
+	cancel_delayed_work(&lt8619c->delayed_work_monitor_resolution);
+err_subdev:
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	media_entity_cleanup(&sd->entity);
+#endif
+err_hdl:
+	v4l2_ctrl_handler_free(&lt8619c->hdl);
+	mutex_destroy(&lt8619c->confctl_mutex);
+	clk_disable_unprepare(lt8619c->xvclk);
+	return err;
+}
+
+static int lt8619c_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct lt8619c *lt8619c = to_lt8619c(sd);
+
+	cancel_delayed_work(&lt8619c->delayed_work_enable_hotplug);
+	cancel_delayed_work(&lt8619c->delayed_work_monitor_resolution);
+	v4l2_async_unregister_subdev(sd);
+	v4l2_device_unregister_subdev(sd);
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	media_entity_cleanup(&sd->entity);
+#endif
+	v4l2_ctrl_handler_free(&lt8619c->hdl);
+	mutex_destroy(&lt8619c->confctl_mutex);
+	clk_disable_unprepare(lt8619c->xvclk);
+
+	return 0;
+}
+
+#if IS_ENABLED(CONFIG_OF)
+static const struct of_device_id lt8619c_of_match[] = {
+	{ .compatible = "lontium,lt8619c" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, lt8619c_of_match);
+#endif
+
+static struct i2c_driver lt8619c_i2c_driver = {
+	.driver = {
+		.name = LT8619C_NAME,
+		.of_match_table = of_match_ptr(lt8619c_of_match),
+	},
+	.probe		= &lt8619c_probe,
+	.remove		= &lt8619c_remove,
+};
+
+static int __init lt8619c_driver_init(void)
+{
+	return i2c_add_driver(&lt8619c_i2c_driver);
+}
+
+static void __exit lt8619c_driver_exit(void)
+{
+	i2c_del_driver(&lt8619c_i2c_driver);
+}
+
+device_initcall_sync(lt8619c_driver_init);
+module_exit(lt8619c_driver_exit);
+
+MODULE_DESCRIPTION("Lontium LT8619C HDMI to BT656/BT1120 bridge driver");
+MODULE_AUTHOR("Dingxian Wen <shawn.wen@rock-chips.com>");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/media/i2c/lt8619c.h b/drivers/media/i2c/lt8619c.h
new file mode 100644
index 000000000000..4c5f2ae47691
--- /dev/null
+++ b/drivers/media/i2c/lt8619c.h
@@ -0,0 +1,144 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co. Ltd.
+ *
+ * Author: Dingxian Wen <shawn.wen@rock-chips.com>
+ */
+
+#ifndef _LT8619C_H
+#define _LT8619C_H
+
+/* --------------- configuration -------------------- */
+#define YUV_OUTPUT_MODE		BT1120_OUTPUT
+#define CLK_SRC			XTAL_CLK
+#define REF_RESISTANCE		EXT_RESISTANCE
+#define CP_CONVERT_MODE		HDPC
+#define YC_SWAP			YC_SWAP_EN
+#define YUV_COLORDEPTH		OUTPUT_16BIT_LOW
+#define BT_TX_SYNC_POL		BT_TX_SYNC_POSITIVE
+
+/* -------------------------------------------------- */
+#define LT8619C_CHIPID		0x1604B0
+
+#define EDID_NUM_BLOCKS_MAX	2
+#define EDID_BLOCK_SIZE		128
+#define POLL_INTERVAL_MS	1000
+#define lt8619c_PIXEL_RATE	400000000
+
+#define BANK_REG		0xff
+#define BANK_60			0x60
+#define BANK_80			0x80
+#define CHIPID_REG_H		0x00
+#define CHIPID_REG_M		0x01
+#define CHIPID_REG_L		0x02
+#define LT8619C_MAX_REGISTER	0xff
+
+#define WAIT_MAX_TIMES		10
+
+#define BT656_OUTPUT		0x04
+#define BT1120_OUTPUT		0x03
+#define BT1120_8BIT_OUTPUT	0x05
+
+#define BT_TX_SYNC_POSITIVE	0x30
+#define BT_TX_SYNC_NEGATIVE	0x00
+
+#define PROGRESSIVE_INDICATOR	0x00
+#define INTERLACE_INDICATOR	0x08
+
+/* 0x08: Use xtal clk; 0x18: Use internal clk */
+#define XTAL_CLK		0x08
+#define INT_CLK			0x18
+
+ /* internal resistance */
+#define INT_RESISTANCE		0x88
+/* external resistance(Pin 16 - REXT, 2K resistance) */
+#define EXT_RESISTANCE		0x80
+
+#define CLK_SDRMODE		0
+ /* CLK divided by 2 */
+#define CLK_DDRMODE		1
+
+#define SDTV			0x00
+#define SDPC			0x10
+#define HDTV			0x20
+#define HDPC			0x30
+
+/*
+ * enable
+ * D0 ~ D7  Y ; D8 ~ D15  C
+ * D8 ~ D15 Y ; D16 ~ D23 C
+ */
+#define YC_SWAP_EN		0x08
+/*
+ * disable
+ * D0 ~ D7  C ; D8 ~ D15  Y
+ * D8 ~ D15 C ; D16 ~ D23 Y
+ */
+#define YC_SWAP_DIS		0x00
+
+/*
+ * BT1120 24bit / BT656 12bit
+ * when YC_SWAP_EN:
+ * BT656 12bit D0 ~ D11
+ * BT1120 24bit : D0 ~ D11 Y ; D12 ~ D23 C
+ * when YC_SWAP_DIS:
+ * BT656 12bit D12 ~ D23
+ * BT1120 24bit : D0 ~ D11 C ; D12 ~ D23 Y
+ */
+#define OUTPUT_24BIT		0x00
+
+/*
+ * BT1120 20bit / BT656 10bit
+ * when YC_SWAP_EN:
+ * BT656 10bit D4 ~ D13
+ * BT1120 20bit : D4 ~ D13 Y ; D14 ~ D23 C
+ * when YC_SWAP_DIS:
+ * BT656 10bit D14 ~ D23
+ * BT1120 20bit : D4 ~ D13 C ; D14 ~ D23 Y
+ */
+#define OUTPUT_20BIT_HIGH	0x04
+/*
+ * when YC_SWAP_EN:
+ * BT656 10bit D0 ~ D9
+ * BT1120 20bit : D0 ~ D9 Y ; D10 ~ D19 C
+ * when YC_SWAP_DIS:
+ * BT656 10bit D10 ~ D19
+ * BT1120 20bit : D0 ~ D9 C ; D10 ~ D19 Y
+ */
+#define OUTPUT_20BIT_LOW	0x05
+
+/*
+ * BT1120 16bit / BT656 8bit
+ * when YC_SWAP_EN:
+ * BT656 8bit D8 ~ D15
+ * BT1120 16bit : D8 ~ D15 Y ; D16 ~ D23 C
+ * when YC_SWAP_DIS:
+ * BT656 8bit D16 ~ D23
+ * BT1120 16bit : D8 ~ D15 C ; D16 ~ D23 Y
+ */
+#define OUTPUT_16BIT_HIGH	0x06
+/*
+ * when YC_SWAP_EN:
+ * BT656 8bit D0 ~ D7
+ * BT1120 16bit : D0 ~ D7 Y ; D8 ~ D15 C
+ * when YC_SWAP_DIS:
+ * BT656 8bit D8 ~ D15
+ * BT1120 16bit : D0 ~ D7 C ; D8 ~ D15 Y
+ */
+#define OUTPUT_16BIT_LOW	0x07
+
+/* ---------------- regs ----------------- */
+ /* reg: 0x60_60 */
+#define SYNC_POL_MASK		GENMASK(5, 4)
+#define IP_SEL_MASK		GENMASK(3, 3)
+#define OUTPUT_MODE_MASK	GENMASK(2, 0)
+
+ /* reg: 0x80_05 */
+#define RGD_HS_POL_ADJ_MASK	GENMASK(5, 5)
+#define RGD_VS_POL_ADJ_MASK	GENMASK(4, 4)
+
+ /* reg: 0x80_17 */
+#define RGOD_VID_HSPOL		BIT(7)
+#define RGOD_VID_VSPOL		BIT(6)
+
+#endif

commit c0b26710c9907546a7da377153f4b82df71e73fd
Author: Yu Qiaowei <cerf.yu@rock-chips.com>
Date:   Mon Aug 30 20:31:37 2021 +0800

    video/rockchip: rga2: Add RGA debugger.
    
    1. Support procfs, both debugfs and procfs.
    2. Modify the debug node name:
       /sys/kernel/debug/rga2_debug/rga2
       -> /sys/kernel/debug/rkrga/debug
       -> /proc/rkrga/debug (add)
    3. Add a node to view the driver version number: driver_version.
    4. Add CONFIG_ROCKCHIP_RGA2_PROC_FS/ROCKCHIP_RGA2_DEBUG_FS/
       ROCKCHIP_RGA2_DEBUGGER, Where CONFIG_ROCKCHIP_RGA2_PROC_FS
       defaults to n, CONFIG_ROCKCHIP_RGA2_DEBUGGER defaults to y.
    
    Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
    Change-Id: I89a971f18301ffa9cc7ac1962ebeee5e97d209aa

diff --git a/drivers/video/rockchip/rga2/Kconfig b/drivers/video/rockchip/rga2/Kconfig
index efc1ef6dfa85..4e547c310b31 100644
--- a/drivers/video/rockchip/rga2/Kconfig
+++ b/drivers/video/rockchip/rga2/Kconfig
@@ -1,10 +1,30 @@
 # SPDX-License-Identifier: GPL-2.0
-menu "RGA2"
+menuconfig ROCKCHIP_RGA2
+	tristate "RGA2"
 	depends on ARCH_ROCKCHIP
-
-config ROCKCHIP_RGA2
-	tristate "ROCKCHIP_RGA2"
 	help
 	  rk32 rga2 module.
 
-endmenu
+if ROCKCHIP_RGA2
+
+config ROCKCHIP_RGA2_PROC_FS
+	bool "Enable RGA2 procfs"
+	select ROCKCHIP_RGA2_DEBUGGER
+	depends on PROC_FS
+	help
+	  Enable procfs to debug RGA driver.
+
+config ROCKCHIP_RGA2_DEBUG_FS
+	bool "Enable RGA2 debugfs"
+	select ROCKCHIP_RGA2_DEBUGGER
+	depends on DEBUG_FS
+	default y
+	help
+	  Enable debugfs to debug RGA driver.
+
+config ROCKCHIP_RGA2_DEBUGGER
+	bool
+	help
+	  Enabling the debugger of RGA2, you can use procfs and debugfs for debugging.
+
+endif
diff --git a/drivers/video/rockchip/rga2/Makefile b/drivers/video/rockchip/rga2/Makefile
index 210981d11f82..60181fffa4c8 100644
--- a/drivers/video/rockchip/rga2/Makefile
+++ b/drivers/video/rockchip/rga2/Makefile
@@ -1,4 +1,5 @@
 # SPDX-License-Identifier: GPL-2.0
 rga2-y	:= rga2_drv.o rga2_mmu_info.o rga2_reg_info.o RGA2_API.o
+rga2-$(CONFIG_ROCKCHIP_RGA2_DEBUGGER) += rga2_debugger.o
 
 obj-$(CONFIG_ROCKCHIP_RGA2)	+= rga2.o
diff --git a/drivers/video/rockchip/rga2/RGA2_API.h b/drivers/video/rockchip/rga2/RGA2_API.h
index e6c4e6247fed..1fa38ed6cffe 100644
--- a/drivers/video/rockchip/rga2/RGA2_API.h
+++ b/drivers/video/rockchip/rga2/RGA2_API.h
@@ -6,8 +6,28 @@
 #include <linux/wakelock.h>
 
 #include "rga2_reg_info.h"
+#include "rga2_debugger.h"
 #include "rga2.h"
 
+/* Driver information */
+#define DRIVER_DESC			"RGA2 Device Driver"
+#define DRIVER_NAME			"rga2"
+#define DRIVER_VERSION		"2.1.0"
+
+/* Logging */
+#define RGA_DEBUG 1
+#if RGA_DEBUG
+#define DBG(format, args...) printk(KERN_DEBUG "%s: " format, DRIVER_NAME, ## args)
+#define ERR(format, args...) printk(KERN_ERR "%s: " format, DRIVER_NAME, ## args)
+#define WARNING(format, args...) printk(KERN_WARN "%s: " format, DRIVER_NAME, ## args)
+#define INFO(format, args...) printk(KERN_INFO "%s: " format, DRIVER_NAME, ## args)
+#else
+#define DBG(format, args...)
+#define ERR(format, args...)
+#define WARNING(format, args...)
+#define INFO(format, args...)
+#endif
+
 struct rga2_drvdata_t {
 	struct miscdevice miscdev;
 	struct device *dev;
@@ -25,6 +45,10 @@ struct rga2_drvdata_t {
 
 	struct ion_client *ion_client;
 	char version[16];
+
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
+	struct rga_debugger *debugger;
+#endif
 };
 
 #define ENABLE      1
diff --git a/drivers/video/rockchip/rga2/rga2.h b/drivers/video/rockchip/rga2/rga2.h
index 81ba59a3ba64..80af65400edd 100644
--- a/drivers/video/rockchip/rga2/rga2.h
+++ b/drivers/video/rockchip/rga2/rga2.h
@@ -764,7 +764,6 @@ struct rga2_service_info {
 };
 
 #define RGA2_TEST_CASE 0
-#define RGA2_DEBUGFS 1
 
 //General Registers
 #define RGA2_SYS_CTRL             0x000
diff --git a/drivers/video/rockchip/rga2/rga2_debugger.c b/drivers/video/rockchip/rga2/rga2_debugger.c
new file mode 100644
index 000000000000..589241322cf4
--- /dev/null
+++ b/drivers/video/rockchip/rga2/rga2_debugger.c
@@ -0,0 +1,396 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2020 Rockchip Electronics Co., Ltd.
+ * Author: Cerf Yu <cerf.yu@rock-chips.com>
+ */
+
+#include <linux/slab.h>
+#include <linux/delay.h>
+#include <linux/syscalls.h>
+#include <linux/debugfs.h>
+#include <linux/proc_fs.h>
+#include <linux/seq_file.h>
+
+#include "rga2.h"
+#include "RGA2_API.h"
+#include "rga2_mmu_info.h"
+#include "rga2_debugger.h"
+
+#define RGA_DEBUGGER_ROOT_NAME  "rkrga"
+
+#define STR_ENABLE(en) (en ? "EN" : "DIS")
+
+extern struct rga2_drvdata_t *rga2_drvdata;
+
+void rga2_slt(void);
+
+int RGA2_TEST_REG;
+int RGA2_TEST_MSG;
+int RGA2_TEST_TIME;
+int RGA2_CHECK_MODE;
+int RGA2_NONUSE;
+int RGA2_INT_FLAG;
+
+static int rga_debug_show(struct seq_file *m, void *data)
+{
+	seq_printf(m, "REG   [%s]\n"
+		      "MSG   [%s]\n"
+		      "TIME  [%s]\n"
+		      "INT   [%s]\n"
+		      "CHECK [%s]\n"
+		      "STOP  [%s]\n",
+		   STR_ENABLE(RGA2_TEST_REG), STR_ENABLE(RGA2_TEST_MSG),
+		   STR_ENABLE(RGA2_TEST_TIME), STR_ENABLE(RGA2_CHECK_MODE),
+		   STR_ENABLE(RGA2_NONUSE), STR_ENABLE(RGA2_INT_FLAG));
+
+	seq_puts(m, "\nhelp:\n");
+	seq_puts(m, "  'echo reg   > debug' to enable/disable register log printing.\n");
+	seq_puts(m, "  'echo msg   > debug' to enable/disable message log printing.\n");
+	seq_puts(m, "  'echo time  > debug' to enable/disable time log printing.\n");
+	seq_puts(m, "  'echo int   > debug' to enable/disable interruppt log printing.\n");
+	seq_puts(m, "  'echo check > debug' to enable/disable check mode.\n");
+	seq_puts(m, "  'echo stop  > debug' to enable/disable stop using hardware\n");
+
+	return 0;
+}
+
+static ssize_t rga_debug_write(struct file *file, const char __user *ubuf,
+			      size_t len, loff_t *offp)
+{
+	char buf[14];
+
+	if (len > sizeof(buf) - 1)
+		return -EINVAL;
+	if (copy_from_user(buf, ubuf, len))
+		return -EFAULT;
+	buf[len - 1] = '\0';
+
+	if (strncmp(buf, "reg", 4) == 0) {
+		if (RGA2_TEST_REG) {
+			RGA2_TEST_REG = 0;
+			INFO("close rga2 reg!\n");
+		} else {
+			RGA2_TEST_REG = 1;
+			INFO("open rga2 reg!\n");
+		}
+	} else if (strncmp(buf, "msg", 3) == 0) {
+		if (RGA2_TEST_MSG) {
+			RGA2_TEST_MSG = 0;
+			INFO("close rga2 test MSG!\n");
+		} else {
+			RGA2_TEST_MSG = 1;
+			INFO("open rga2 test MSG!\n");
+		}
+	} else if (strncmp(buf, "time", 4) == 0) {
+		if (RGA2_TEST_TIME) {
+			RGA2_TEST_TIME = 0;
+			INFO("close rga2 test time!\n");
+		} else {
+			RGA2_TEST_TIME = 1;
+			INFO("open rga2 test time!\n");
+		}
+	} else if (strncmp(buf, "check", 5) == 0) {
+		if (RGA2_CHECK_MODE) {
+			RGA2_CHECK_MODE = 0;
+			INFO("close rga2 check flag!\n");
+		} else {
+			RGA2_CHECK_MODE = 1;
+			INFO("open rga2 check flag!\n");
+		}
+	} else if (strncmp(buf, "stop", 4) == 0) {
+		if (RGA2_NONUSE) {
+			RGA2_NONUSE = 0;
+			INFO("stop using rga hardware!\n");
+		} else {
+			RGA2_NONUSE = 1;
+			INFO("use rga hardware!\n");
+		}
+	} else if (strncmp(buf, "int", 3) == 0) {
+		if (RGA2_INT_FLAG) {
+			RGA2_INT_FLAG = 0;
+			INFO("close inturrupt MSG!\n");
+		} else {
+			RGA2_INT_FLAG = 1;
+			INFO("open inturrupt MSG!\n");
+		}
+	} else if (strncmp(buf, "slt", 3) == 0) {
+		rga2_slt();
+	}
+
+	return len;
+}
+
+static int rga_version_show(struct seq_file *m, void *data)
+{
+	seq_printf(m, "%s: v%s\n", DRIVER_DESC, DRIVER_VERSION);
+
+	return 0;
+}
+
+struct rga_debugger_list rga_root_list[] = {
+	{ "debug", rga_debug_show, rga_debug_write, NULL },
+	{ "driver_version", rga_version_show, NULL, NULL },
+};
+
+static ssize_t rga_debugger_write(struct file *file, const char __user *ubuf,
+				  size_t len, loff_t *offp)
+{
+	struct seq_file *priv = file->private_data;
+	struct rga_debugger_node *node = priv->private;
+
+	if (node->info_ent->write)
+		return node->info_ent->write(file, ubuf, len, offp);
+	else
+		return len;
+}
+
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUG_FS
+static int rga_debugfs_open(struct inode *inode, struct file *file)
+{
+	struct rga_debugger_node *node = inode->i_private;
+
+	return single_open(file, node->info_ent->show, node);
+}
+
+static const struct file_operations rga_debugfs_fops = {
+	.owner	 = THIS_MODULE,
+	.open	 = rga_debugfs_open,
+	.read	 = seq_read,
+	.llseek  = seq_lseek,
+	.release = single_release,
+	.write	 = rga_debugger_write,
+};
+
+static int rga_debugfs_remove_files(struct rga_debugger *debugger)
+{
+	struct rga_debugger_node *pos, *q;
+	struct list_head *entry_list;
+
+	mutex_lock(&debugger->debugfs_lock);
+
+	/* Delete debugfs entry list */
+	entry_list = &debugger->debugfs_entry_list;
+	list_for_each_entry_safe(pos, q, entry_list, list) {
+		if (pos->dent == NULL)
+			continue;
+		list_del(&pos->list);
+		kfree(pos);
+		pos = NULL;
+	}
+
+	/* Delete all debugfs node in this directory */
+	debugfs_remove_recursive(debugger->debugfs_dir);
+	debugger->debugfs_dir = NULL;
+
+	mutex_unlock(&debugger->debugfs_lock);
+
+	return 0;
+}
+
+static int rga_debugfs_create_files(const struct rga_debugger_list *files, int count,
+			     struct dentry *root, struct rga_debugger *debugger)
+{
+	int i;
+	struct dentry *ent;
+	struct rga_debugger_node *tmp;
+
+	for (i = 0; i < count; i++) {
+		tmp = kmalloc(sizeof(struct rga_debugger_node), GFP_KERNEL);
+		if (tmp == NULL) {
+			ERR("Cannot alloc rga_debugger_node for /sys/kernel/debug/%pd/%s\n",
+			    root, files[i].name);
+			goto MALLOC_FAIL;
+		}
+
+		tmp->info_ent = &files[i];
+		tmp->debugger = debugger;
+
+		ent = debugfs_create_file(files[i].name, S_IFREG | S_IRUGO,
+					  root, tmp, &rga_debugfs_fops);
+		if (!ent) {
+			ERR("Cannot create /sys/kernel/debug/%pd/%s\n", root, files[i].name);
+			goto CREATE_FAIL;
+		}
+
+		tmp->dent = ent;
+
+		mutex_lock(&debugger->debugfs_lock);
+		list_add_tail(&tmp->list, &debugger->debugfs_entry_list);
+		mutex_unlock(&debugger->debugfs_lock);
+	}
+
+	return 0;
+
+CREATE_FAIL:
+	kfree(tmp);
+MALLOC_FAIL:
+	rga_debugfs_remove_files(debugger);
+
+	return -1;
+}
+
+int rga2_debugfs_remove(void)
+{
+	struct rga_debugger *debugger;
+
+	debugger = rga2_drvdata->debugger;
+
+	rga_debugfs_remove_files(debugger);
+
+	return 0;
+}
+
+int rga2_debugfs_init(void)
+{
+	int ret;
+	struct rga_debugger *debugger;
+
+	debugger = rga2_drvdata->debugger;
+
+	debugger->debugfs_dir = debugfs_create_dir(RGA_DEBUGGER_ROOT_NAME, NULL);
+	if (IS_ERR_OR_NULL(debugger->debugfs_dir)) {
+		ERR("failed on mkdir /sys/kernel/debug/%s\n", RGA_DEBUGGER_ROOT_NAME);
+		debugger->debugfs_dir = NULL;
+		return -EIO;
+	}
+
+	ret = rga_debugfs_create_files(rga_root_list, ARRAY_SIZE(rga_root_list),
+				       debugger->debugfs_dir, debugger);
+	if (ret) {
+		ERR("Could not install rga_root_list debugfs\n");
+		goto CREATE_FAIL;
+	}
+
+	return 0;
+
+CREATE_FAIL:
+	rga2_debugfs_remove();
+
+	return ret;
+}
+#endif /* #ifdef CONFIG_ROCKCHIP_RGA2_DEBUG_FS */
+
+#ifdef CONFIG_ROCKCHIP_RGA2_PROC_FS
+static int rga_procfs_open(struct inode *inode, struct file *file)
+{
+	struct rga_debugger_node *node = PDE_DATA(inode);
+
+	return single_open(file, node->info_ent->show, node);
+}
+
+static const struct file_operations rga_procfs_fops = {
+	.owner   = THIS_MODULE,
+	.open    = rga_procfs_open,
+	.read    = seq_read,
+	.llseek  = seq_lseek,
+	.release = single_release,
+	.write   = rga_debugger_write,
+};
+
+static int rga_procfs_remove_files(struct rga_debugger *debugger)
+{
+	struct rga_debugger_node *pos, *q;
+	struct list_head *entry_list;
+
+	mutex_lock(&debugger->procfs_lock);
+
+	/* Delete procfs entry list */
+	entry_list = &debugger->procfs_entry_list;
+	list_for_each_entry_safe(pos, q, entry_list, list) {
+		if (pos->pent == NULL)
+			continue;
+		list_del(&pos->list);
+		kfree(pos);
+		pos = NULL;
+	}
+
+	/* Delete all procfs node in this directory */
+	proc_remove(debugger->procfs_dir);
+	debugger->procfs_dir = NULL;
+
+	mutex_unlock(&debugger->procfs_lock);
+
+	return 0;
+}
+
+static int rga_procfs_create_files(const struct rga_debugger_list *files, int count,
+			    struct proc_dir_entry *root, struct rga_debugger *debugger)
+{
+	int i;
+	struct proc_dir_entry *ent;
+	struct rga_debugger_node *tmp;
+
+	for (i = 0; i < count; i++) {
+		tmp = kmalloc(sizeof(struct rga_debugger_node), GFP_KERNEL);
+		if (tmp == NULL) {
+			ERR("Cannot alloc rga_debugger_node for /proc/%s/%s\n",
+			    RGA_DEBUGGER_ROOT_NAME, files[i].name);
+			goto MALLOC_FAIL;
+		}
+
+		tmp->info_ent = &files[i];
+		tmp->debugger = debugger;
+
+		ent = proc_create_data(files[i].name, S_IFREG | S_IRUGO,
+				       root, &rga_procfs_fops, tmp);
+		if (!ent) {
+			ERR("Cannot create /proc/%s/%s\n", RGA_DEBUGGER_ROOT_NAME, files[i].name);
+			goto CREATE_FAIL;
+		}
+
+		tmp->pent = ent;
+
+		mutex_lock(&debugger->procfs_lock);
+		list_add_tail(&tmp->list, &debugger->procfs_entry_list);
+		mutex_unlock(&debugger->procfs_lock);
+	}
+
+	return 0;
+
+CREATE_FAIL:
+	kfree(tmp);
+MALLOC_FAIL:
+	rga_procfs_remove_files(debugger);
+	return -1;
+}
+
+int rga2_procfs_remove(void)
+{
+	struct rga_debugger *debugger;
+
+	debugger = rga2_drvdata->debugger;
+
+	rga_procfs_remove_files(debugger);
+
+	return 0;
+}
+
+int rga2_procfs_init(void)
+{
+	int ret;
+	struct rga_debugger *debugger;
+
+	debugger = rga2_drvdata->debugger;
+
+	debugger->procfs_dir = proc_mkdir(RGA_DEBUGGER_ROOT_NAME, NULL);
+	if (IS_ERR_OR_NULL(debugger->procfs_dir)) {
+		ERR("failed on mkdir /proc/%s\n", RGA_DEBUGGER_ROOT_NAME);
+		debugger->procfs_dir = NULL;
+		return -EIO;
+	}
+
+	ret = rga_procfs_create_files(rga_root_list, ARRAY_SIZE(rga_root_list),
+				      debugger->procfs_dir, debugger);
+	if (ret) {
+		ERR("Could not install rga_root_list procfs\n");
+		goto CREATE_FAIL;
+	}
+
+	return 0;
+
+CREATE_FAIL:
+	rga2_procfs_remove();
+
+	return ret;
+}
+#endif /* #ifdef CONFIG_ROCKCHIP_RGA2_PROC_FS */
diff --git a/drivers/video/rockchip/rga2/rga2_debugger.h b/drivers/video/rockchip/rga2/rga2_debugger.h
new file mode 100644
index 000000000000..33b2f43e9f8a
--- /dev/null
+++ b/drivers/video/rockchip/rga2/rga2_debugger.h
@@ -0,0 +1,120 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2020 Rockchip Electronics Co., Ltd.
+ * Author: Cerf Yu <cerf.yu@rock-chips.com>
+ */
+
+#ifndef _RGA_DEBUGGER_H_
+#define _RGA_DEBUGGER_H_
+
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
+extern int RGA2_TEST_REG;
+extern int RGA2_TEST_MSG;
+extern int RGA2_TEST_TIME;
+extern int RGA2_CHECK_MODE;
+extern int RGA2_NONUSE;
+extern int RGA2_INT_FLAG;
+
+/*
+ * struct rga_debugger - RGA debugger information
+ *
+ * This structure represents a debugger  to be created by the rga driver
+ * or core.
+ */
+struct rga_debugger {
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUG_FS
+	/* Directory of debugfs file */
+	struct dentry *debugfs_dir;
+	struct list_head debugfs_entry_list;
+	struct mutex debugfs_lock;
+#endif
+
+#ifdef CONFIG_ROCKCHIP_RGA2_PROC_FS
+	/* Directory of procfs file */
+	struct proc_dir_entry *procfs_dir;
+	struct list_head procfs_entry_list;
+	struct mutex procfs_lock;
+#endif
+};
+
+/*
+ * struct rga_debugger_list - debugfs/procfs info list entry
+ *
+ * This structure represents a debugfs/procfs file to be created by the rga
+ * driver or core.
+ */
+struct rga_debugger_list {
+	/* File name */
+	const char *name;
+	/*
+	 * Show callback. &seq_file->private will be set to the &struct
+	 * rga_debugger_node corresponding to the instance of this info on a given
+	 * &struct rga_debugger.
+	 */
+	int (*show)(struct seq_file *seq, void *data);
+	/*
+	 * Write callback. &seq_file->private will be set to the &struct
+	 * rga_debugger_node corresponding to the instance of this info on a given
+	 * &struct rga_debugger.
+	 */
+	ssize_t (*write)(struct file *file, const char __user *ubuf, size_t len, loff_t *offp);
+	/* Procfs/Debugfs private data. */
+	void *data;
+};
+
+/*
+ * struct rga_debugger_node - Nodes for debugfs/procfs
+ *
+ * This structure represents each instance of procfs/debugfs created from the
+ * template.
+ */
+struct rga_debugger_node {
+	struct rga_debugger *debugger;
+
+	/* template for this node. */
+	const struct rga_debugger_list *info_ent;
+
+	/* Each Procfs/Debugfs file. */
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUG_FS
+	struct dentry *dent;
+#endif
+
+#ifdef CONFIG_ROCKCHIP_RGA2_PROC_FS
+	struct proc_dir_entry *pent;
+#endif
+
+	struct list_head list;
+};
+
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUG_FS
+int rga2_debugfs_init(void);
+int rga2_debugfs_remove(void);
+#else
+static inline int rga2_debugfs_remove(void)
+{
+	return 0;
+}
+static inline int rga2_debugfs_init(void)
+{
+	return 0;
+}
+#endif /* #ifdef CONFIG_ROCKCHIP_RGA2_DEBUG_FS */
+
+#ifdef CONFIG_ROCKCHIP_RGA2_PROC_FS
+int rga2_procfs_remove(void);
+int rga2_procfs_init(void);
+#else
+static inline int rga2_procfs_remove(void)
+{
+	return 0;
+}
+static inline int rga2_procfs_init(void)
+{
+	return 0;
+}
+#endif /* #ifdef CONFIG_ROCKCHIP_RGA2_PROC_FS */
+
+#endif /* #ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER */
+
+#endif /* #ifndef _RGA_DEBUGGER_H_ */
+
diff --git a/drivers/video/rockchip/rga2/rga2_drv.c b/drivers/video/rockchip/rga2/rga2_drv.c
index 593415965d62..b203587a89fb 100644
--- a/drivers/video/rockchip/rga2/rga2_drv.c
+++ b/drivers/video/rockchip/rga2/rga2_drv.c
@@ -42,7 +42,6 @@
 #include <linux/wakelock.h>
 #include <linux/scatterlist.h>
 #include <linux/version.h>
-#include <linux/debugfs.h>
 
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
 #include <linux/pm_runtime.h>
@@ -53,6 +52,7 @@
 #include "rga2_reg_info.h"
 #include "rga2_mmu_info.h"
 #include "RGA2_API.h"
+#include "rga2_debugger.h"
 
 #if IS_ENABLED(CONFIG_ION_ROCKCHIP) && (LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 0))
 #include <linux/rockchip_ion.h>
@@ -75,25 +75,11 @@
  */
 #define RGA2_PHY_PAGE_SIZE	(((8192 * 8192 * 4) / 4096) + 1)
 
-
-/* Driver information */
-#define DRIVER_DESC		"RGA2 Device Driver"
-#define DRIVER_NAME		"rga2"
-#define RGA2_VERSION   "2.000"
-
 ktime_t rga2_start;
 ktime_t rga2_end;
 int rga2_flag;
 int first_RGA2_proc;
 static int rk3368;
-#if RGA2_DEBUGFS
-int RGA2_TEST_REG;
-int RGA2_TEST_MSG;
-int RGA2_TEST_TIME;
-int RGA2_CHECK_MODE;
-int RGA2_NONUSE;
-int RGA2_INT_FLAG;
-#endif
 
 rga2_session rga2_session_global;
 long (*rga2_ioctl_kernel_p)(struct rga_req *);
@@ -111,22 +97,7 @@ static void rga2_del_running_list(void);
 static void rga2_del_running_list_timeout(void);
 static void rga2_try_set_reg(void);
 
-
-/* Logging */
-#define RGA_DEBUG 1
-#if RGA_DEBUG
-#define DBG(format, args...) printk(KERN_DEBUG "%s: " format, DRIVER_NAME, ## args)
-#define ERR(format, args...) printk(KERN_ERR "%s: " format, DRIVER_NAME, ## args)
-#define WARNING(format, args...) printk(KERN_WARN "%s: " format, DRIVER_NAME, ## args)
-#define INFO(format, args...) printk(KERN_INFO "%s: " format, DRIVER_NAME, ## args)
-#else
-#define DBG(format, args...)
-#define ERR(format, args...)
-#define WARNING(format, args...)
-#define INFO(format, args...)
-#endif
-
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 static const char *rga2_get_cmd_mode_str(u32 cmd)
 {
 	switch (cmd) {
@@ -711,7 +682,7 @@ static int rga2_flush(rga2_session *session, unsigned long arg)
 	int ret = 0;
 	int ret_timeout;
 
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 	ktime_t start = ktime_set(0, 0);
 	ktime_t end = ktime_set(0, 0);
 
@@ -760,7 +731,7 @@ static int rga2_flush(rga2_session *session, unsigned long arg)
 		ret = -ETIMEDOUT;
 	}
 
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 	if (RGA2_TEST_TIME) {
 		end = ktime_get();
 		end = ktime_sub(end, start);
@@ -977,7 +948,7 @@ static void rga2_try_set_reg(void)
 				rga2_write(reg->csc_reg[i], RGA2_CSC_COE_BASE + i * 4);
 			}
 
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 			if (RGA2_TEST_REG) {
 				if (rga2_flag) {
 					int32_t *p;
@@ -1005,7 +976,7 @@ static void rga2_try_set_reg(void)
 			/* All CMD finish int */
 			rga2_write(rga2_read(RGA2_INT)|(0x1<<10)|(0x1<<9)|(0x1<<8), RGA2_INT);
 
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 			if (RGA2_TEST_TIME)
 				rga2_start = ktime_get();
 #endif
@@ -1013,7 +984,7 @@ static void rga2_try_set_reg(void)
 			/* Start proc */
 			atomic_set(&reg->session->done, 0);
 			rga2_write(0x1, RGA2_CMD_CTRL);
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 			if (RGA2_TEST_REG) {
 				if (rga2_flag) {
 					INFO("CMD_READ_BACK_REG\n");
@@ -1187,7 +1158,7 @@ static int rga2_get_img_info(rga_img_info_t *img,
 			pr_err("Failed to attach dma_buf\n");
 			return ret;
 		}
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 	if (RGA2_CHECK_MODE) {
 		void *vaddr = dma_buf_vmap(dma_buf);
 		if (vaddr)
@@ -1344,7 +1315,7 @@ static int rga2_convert_dma_buf(struct rga2_req *req)
 			pr_err("RGA2 SRC ERROR ion buf handle\n");
 			return ret;
 		}
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 	if (RGA2_CHECK_MODE) {
 		vaddr = ion_map_kernel(rga2_drvdata->ion_client, hdl);
 		if (vaddr)
@@ -1386,7 +1357,7 @@ static int rga2_convert_dma_buf(struct rga2_req *req)
 			pr_err("RGA2 DST ERROR ion buf handle\n");
 			return ret;
 		}
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 	if (RGA2_CHECK_MODE) {
 		vaddr = ion_map_kernel(rga2_drvdata->ion_client, hdl);
 		if (vaddr)
@@ -1569,7 +1540,7 @@ static int rga2_blit(rga2_session *session, struct rga2_req *req)
 static int rga2_blit_async(rga2_session *session, struct rga2_req *req)
 {
 	int ret = -1;
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 	if (RGA2_TEST_MSG) {
 		if (1) {
 			print_debug_info(req);
@@ -1597,7 +1568,7 @@ static int rga2_blit_sync(rga2_session *session, struct rga2_req *req)
 	memcpy(&req_bak, req, sizeof(req_bak));
 retry:
 
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 	if (RGA2_TEST_MSG) {
 		if (1) {
 			print_debug_info(req);
@@ -1669,7 +1640,7 @@ static int rga2_blit_sync(rga2_session *session, struct rga2_req *req)
 		ret = -ETIMEDOUT;
 	}
 
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 	if (RGA2_TEST_TIME) {
 		rga2_end = ktime_get();
 		rga2_end = ktime_sub(rga2_end, rga2_start);
@@ -1731,7 +1702,7 @@ static long rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)
 	}
 
 	memset(&req, 0x0, sizeof(req));
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 	if (RGA2_TEST_MSG)
 		INFO("cmd is %s\n", rga2_get_cmd_mode_str(cmd));
 	if (RGA2_NONUSE) {
@@ -1913,7 +1884,7 @@ static long compat_rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)
 
 	session = (rga2_session *)file->private_data;
 
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 	if (RGA2_TEST_MSG)
 		INFO("using %s\n", __func__);
 #endif
@@ -2145,7 +2116,7 @@ static void RGA2_flush_page(void)
 
 static irqreturn_t rga2_irq_thread(int irq, void *dev_id)
 {
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 	if (RGA2_INT_FLAG)
 		INFO("irqthread INT[%x],STATS[%x]\n", rga2_read(RGA2_INT),
 		     rga2_read(RGA2_STATUS));
@@ -2163,7 +2134,7 @@ static irqreturn_t rga2_irq_thread(int irq, void *dev_id)
 
 static irqreturn_t rga2_irq(int irq,  void *dev_id)
 {
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 	if (RGA2_INT_FLAG)
 		INFO("irq INT[%x], STATS[%x]\n", rga2_read(RGA2_INT),
 		     rga2_read(RGA2_STATUS));
@@ -2201,6 +2172,47 @@ static const struct of_device_id rockchip_rga_dt_ids[] = {
 	{},
 };
 
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
+static int rga2_debugger_init(struct rga_debugger **debugger_p)
+{
+	struct rga_debugger *debugger;
+
+	*debugger_p = kzalloc(sizeof(struct rga_debugger), GFP_KERNEL);
+	if (*debugger_p == NULL) {
+		ERR("can not alloc for rga2 debugger\n");
+		return -ENOMEM;
+	}
+
+	debugger = *debugger_p;
+
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUG_FS
+	mutex_init(&debugger->debugfs_lock);
+	INIT_LIST_HEAD(&debugger->debugfs_entry_list);
+#endif
+
+#ifdef CONFIG_ROCKCHIP_RGA2_PROC_FS
+	mutex_init(&debugger->procfs_lock);
+	INIT_LIST_HEAD(&debugger->procfs_entry_list);
+#endif
+
+	rga2_debugfs_init();
+	rga2_procfs_init();
+
+	return 0;
+}
+
+static int rga2_debugger_remove(struct rga_debugger **debugger_p)
+{
+	rga2_debugfs_remove();
+	rga2_procfs_remove();
+
+	kfree(*debugger_p);
+	*debugger_p = NULL;
+
+	return 0;
+}
+#endif
+
 static int rga2_drv_probe(struct platform_device *pdev)
 {
 	struct rga2_drvdata_t *data;
@@ -2284,6 +2296,11 @@ static int rga2_drv_probe(struct platform_device *pdev)
 		ERR("cannot register miscdev (%d)\n", ret);
 		goto err_misc_register;
 	}
+
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
+	rga2_debugger_init(&rga2_drvdata->debugger);
+#endif
+
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0))
 	rga2_init_version();
 	INFO("Driver loaded successfully ver:%s\n", rga2_drvdata->version);
@@ -2308,6 +2325,10 @@ static int rga2_drv_remove(struct platform_device *pdev)
 	struct rga2_drvdata_t *data = platform_get_drvdata(pdev);
 	DBG("%s [%d]\n",__FUNCTION__,__LINE__);
 
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
+	rga2_debugger_remove(&data->debugger);
+#endif
+
 	wake_lock_destroy(&data->wake_lock);
 	misc_deregister(&(data->miscdev));
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
@@ -2336,116 +2357,7 @@ static struct platform_driver rga2_driver = {
 	},
 };
 
-#if RGA2_DEBUGFS
-void rga2_slt(void);
-
-static int rga2_debug_show(struct seq_file *m, void *data)
-{
-	seq_puts(m, "echo reg > rga2 to open rga reg MSG\n");
-	seq_puts(m, "echo msg  > rga2 to open rga msg MSG\n");
-	seq_puts(m, "echo time > rga2 to open rga time MSG\n");
-	seq_puts(m, "echo check > rga2 to open rga check flag\n");
-	seq_puts(m, "echo stop > rga2 to stop using hardware\n");
-	seq_puts(m, "echo int > rga2 to open interruppt MSG\n");
-	return 0;
-}
-
-static ssize_t rga2_debug_write(struct file *file, const char __user *ubuf,
-			      size_t len, loff_t *offp)
-{
-	char buf[14];
-
-	if (len > sizeof(buf) - 1)
-		return -EINVAL;
-	if (copy_from_user(buf, ubuf, len))
-		return -EFAULT;
-	buf[len - 1] = '\0';
-
-	if (strncmp(buf, "reg", 4) == 0) {
-		if (RGA2_TEST_REG) {
-			RGA2_TEST_REG = 0;
-			INFO("close rga2 reg!\n");
-		} else {
-			RGA2_TEST_REG = 1;
-			INFO("open rga2 reg!\n");
-		}
-	} else if (strncmp(buf, "msg", 3) == 0) {
-		if (RGA2_TEST_MSG) {
-			RGA2_TEST_MSG = 0;
-			INFO("close rga2 test MSG!\n");
-		} else {
-			RGA2_TEST_MSG = 1;
-			INFO("open rga2 test MSG!\n");
-		}
-	} else if (strncmp(buf, "time", 4) == 0) {
-		if (RGA2_TEST_TIME) {
-			RGA2_TEST_TIME = 0;
-			INFO("close rga2 test time!\n");
-		} else {
-			RGA2_TEST_TIME = 1;
-			INFO("open rga2 test time!\n");
-		}
-	} else if (strncmp(buf, "check", 5) == 0) {
-		if (RGA2_CHECK_MODE) {
-			RGA2_CHECK_MODE = 0;
-			INFO("close rga2 check flag!\n");
-		} else {
-			RGA2_CHECK_MODE = 1;
-			INFO("open rga2 check flag!\n");
-		}
-	} else if (strncmp(buf, "stop", 4) == 0) {
-		if (RGA2_NONUSE) {
-			RGA2_NONUSE = 0;
-			INFO("stop using rga hardware!\n");
-		} else {
-			RGA2_NONUSE = 1;
-			INFO("use rga hardware!\n");
-		}
-	} else if (strncmp(buf, "int", 3) == 0) {
-		if (RGA2_INT_FLAG) {
-			RGA2_INT_FLAG = 0;
-			INFO("close inturrupt MSG!\n");
-		} else {
-			RGA2_INT_FLAG = 1;
-			INFO("open inturrupt MSG!\n");
-		}
-	} else if (strncmp(buf, "slt", 3) == 0) {
-		rga2_slt();
-	}
-
-	return len;
-}
-
-static int rga2_debug_open(struct inode *inode, struct file *file)
-
-{
-	return single_open(file, rga2_debug_show, NULL);
-}
-
-static const struct file_operations rga2_debug_fops = {
-	.owner = THIS_MODULE,
-	.open = rga2_debug_open,
-	.read = seq_read,
-	.llseek = seq_lseek,
-	.release = single_release,
-	.write = rga2_debug_write,
-};
-
-static void rga2_debugfs_add(void)
-{
-	struct dentry *rga2_debug_root;
-	struct dentry *ent;
-
-	rga2_debug_root = debugfs_create_dir("rga2_debug", NULL);
-
-	ent = debugfs_create_file("rga2", 0644, rga2_debug_root,
-				  NULL, &rga2_debug_fops);
-	if (!ent) {
-		pr_err("create rga2_debugfs err\n");
-		debugfs_remove_recursive(rga2_debug_root);
-	}
-}
-
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 void rga2_slt(void)
 {
 	int i;
@@ -2641,9 +2553,6 @@ static int __init rga2_init(void)
 
 #if RGA2_TEST_CASE
 	rga2_test_0();
-#endif
-#if RGA2_DEBUGFS
-	rga2_debugfs_add();
 #endif
 	INFO("Module initialized.\n");
 
diff --git a/drivers/video/rockchip/rga2/rga2_mmu_info.c b/drivers/video/rockchip/rga2/rga2_mmu_info.c
index 753e2afdd6c1..51d20a77848e 100644
--- a/drivers/video/rockchip/rga2/rga2_mmu_info.c
+++ b/drivers/video/rockchip/rga2/rga2_mmu_info.c
@@ -20,9 +20,8 @@
 #include <asm/atomic.h>
 #include <asm/cacheflush.h>
 #include "rga2_mmu_info.h"
-#if RGA2_DEBUGFS
-extern int RGA2_CHECK_MODE;
-#endif
+#include "rga2_debugger.h"
+
 extern struct rga2_service_info rga2_service;
 extern struct rga2_mmu_buf_t rga2_mmu_buf;
 
@@ -345,7 +344,7 @@ static int rga2_buf_size_cal(unsigned long yrgb_addr, unsigned long uv_addr, uns
     return pageCount;
 }
 
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 static int rga2_UserMemory_cheeck(struct page **pages, u32 w, u32 h, u32 format, int flag)
 {
 	int bits;
@@ -646,7 +645,7 @@ static int rga2_mmu_flush_cache(struct rga2_reg *reg, struct rga2_req *req)
 						 MMU_Base,
 						 DstStart, DstPageCount, 1,
 						 MMU_MAP_CLEAN | MMU_MAP_INVALID);
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 			if (RGA2_CHECK_MODE)
 				rga2_UserMemory_cheeck(&pages[0],
 						       req->dst.vir_w,
@@ -757,7 +756,7 @@ static int rga2_mmu_info_BitBlt_mode(struct rga2_reg *reg, struct rga2_req *req)
 			ret = rga2_MapUserMemory(&pages[0], &MMU_Base[0],
 						 Src0Start, Src0PageCount,
 						 0, MMU_MAP_CLEAN);
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 			if (RGA2_CHECK_MODE)
 				rga2_UserMemory_cheeck(&pages[0],
 						       req->src.vir_w,
@@ -823,7 +822,7 @@ static int rga2_mmu_info_BitBlt_mode(struct rga2_reg *reg, struct rga2_req *req)
 						 + Src0MemSize + Src1MemSize,
 						 DstStart, DstPageCount, 1,
 						 MMU_MAP_CLEAN | MMU_MAP_INVALID);
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 			if (RGA2_CHECK_MODE)
 				rga2_UserMemory_cheeck(&pages[0],
 						       req->dst.vir_w,
@@ -840,7 +839,7 @@ static int rga2_mmu_info_BitBlt_mode(struct rga2_reg *reg, struct rga2_req *req)
 						 + Src0MemSize + Src1MemSize,
 						 DstStart, DstPageCount,
 						 1, MMU_MAP_INVALID);
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
 			if (RGA2_CHECK_MODE)
 				rga2_UserMemory_cheeck(&pages[0],
 						       req->dst.vir_w,
@@ -968,7 +967,7 @@ static int rga2_mmu_info_color_palette_mode(struct rga2_reg *reg, struct rga2_re
             } else {
                 ret = rga2_MapUserMemory(&pages[0], &MMU_Base[0],
                 SrcStart, SrcPageCount, 0, MMU_MAP_CLEAN);
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
                 if (RGA2_CHECK_MODE)
                 rga2_UserMemory_cheeck(&pages[0], req->src.vir_w,
                 req->src.vir_h, req->src.format,
@@ -997,7 +996,7 @@ static int rga2_mmu_info_color_palette_mode(struct rga2_reg *reg, struct rga2_re
             } else {
                 ret = rga2_MapUserMemory(&pages[0], MMU_Base + SrcMemSize,
                 DstStart, DstPageCount, 1, MMU_MAP_INVALID);
-#if RGA2_DEBUGFS
+#ifdef CONFIG_ROCKCHIP_RGA2_DEBUGGER
                 if (RGA2_CHECK_MODE)
                 rga2_UserMemory_cheeck(&pages[0], req->dst.vir_w,
                 req->dst.vir_h, req->dst.format,

commit 14fd077fcad94f220136085ee5eefb6255e369cb
Author: Badhri Jagan Sridharan <badhri@google.com>
Date:   Mon Aug 31 19:59:16 2020 -0700

    UPSTREAM: usb: typec: tcpci: update ROLE_CONTROL for DRP
    
    ROLE_CONTROL register would not have the actual CC terminations
    unless the port does not set ROLE_CONTROL.DRP. For DRP ports,
    CC_STATUS.cc1/cc2 indicates the final terminations applied
    when TCPC enters potential_connect_as_source/_sink.
    For DRP ports, infer port role from CC_STATUS and set corresponding
    CC terminations before setting the orientation.
    
    Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
    Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>
    Link: https://lore.kernel.org/r/20200901025927.3596190-4-badhri@google.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Wang Jie <dave.wang@rock-chips.com>
    Change-Id: I108119eb0d9accf5697b9d69f1188766c2bdb0b9
    (cherry picked from commit 57ce64668f5d6f30bdf4344f3c94e79b7de8eb58)

diff --git a/drivers/usb/typec/tcpm/tcpci.c b/drivers/usb/typec/tcpm/tcpci.c
index 2c34add37708..d30cd7329cbf 100644
--- a/drivers/usb/typec/tcpm/tcpci.c
+++ b/drivers/usb/typec/tcpm/tcpci.c
@@ -206,12 +206,47 @@ static int tcpci_set_polarity(struct tcpc_dev *tcpc,
 	struct tcpci *tcpci = tcpc_to_tcpci(tcpc);
 	unsigned int reg;
 	int ret;
+	enum typec_cc_status cc1, cc2;
 
-	/* Keep the disconnect cc line open */
+	/* Obtain Rp setting from role control */
 	ret = regmap_read(tcpci->regmap, TCPC_ROLE_CTRL, &reg);
 	if (ret < 0)
 		return ret;
 
+	ret = tcpci_get_cc(tcpc, &cc1, &cc2);
+	if (ret < 0)
+		return ret;
+
+	/*
+	 * When port has drp toggling enabled, ROLE_CONTROL would only have the initial
+	 * terminations for the toggling and does not indicate the final cc
+	 * terminations when ConnectionResult is 0 i.e. drp toggling stops and
+	 * the connection is resolbed. Infer port role from TCPC_CC_STATUS based on the
+	 * terminations seen. The port role is then used to set the cc terminations.
+	 */
+	if (reg & TCPC_ROLE_CTRL_DRP) {
+		/* Disable DRP for the OPEN setting to take effect */
+		reg = reg & ~TCPC_ROLE_CTRL_DRP;
+
+		if (polarity == TYPEC_POLARITY_CC2) {
+			reg &= ~(TCPC_ROLE_CTRL_CC2_MASK << TCPC_ROLE_CTRL_CC2_SHIFT);
+			/* Local port is source */
+			if (cc2 == TYPEC_CC_RD)
+				/* Role control would have the Rp setting when DRP was enabled */
+				reg |= TCPC_ROLE_CTRL_CC_RP << TCPC_ROLE_CTRL_CC2_SHIFT;
+			else
+				reg |= TCPC_ROLE_CTRL_CC_RD << TCPC_ROLE_CTRL_CC2_SHIFT;
+		} else {
+			reg &= ~(TCPC_ROLE_CTRL_CC1_MASK << TCPC_ROLE_CTRL_CC1_SHIFT);
+			/* Local port is source */
+			if (cc1 == TYPEC_CC_RD)
+				/* Role control would have the Rp setting when DRP was enabled */
+				reg |= TCPC_ROLE_CTRL_CC_RP << TCPC_ROLE_CTRL_CC1_SHIFT;
+			else
+				reg |= TCPC_ROLE_CTRL_CC_RD << TCPC_ROLE_CTRL_CC1_SHIFT;
+		}
+	}
+
 	if (polarity == TYPEC_POLARITY_CC2)
 		reg |= TCPC_ROLE_CTRL_CC_OPEN << TCPC_ROLE_CTRL_CC1_SHIFT;
 	else

commit ef9dc469db93120531b14f34c0037235a401f0a1
Author: Li Jun <jun.li@nxp.com>
Date:   Wed Jun 2 17:57:07 2021 +0800

    UPSTREAM: usb: typec: tcpm: cancel vdm and state machine hrtimer when unregister tcpm port
    
    A pending hrtimer may expire after the kthread_worker of tcpm port
    is destroyed, see below kernel dump when do module unload, fix it
    by cancel the 2 hrtimers.
    
    [  111.517018] Unable to handle kernel paging request at virtual address ffff8000118cb880
    [  111.518786] blk_update_request: I/O error, dev sda, sector 60061185 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
    [  111.526594] Mem abort info:
    [  111.526597]   ESR = 0x96000047
    [  111.526600]   EC = 0x25: DABT (current EL), IL = 32 bits
    [  111.526604]   SET = 0, FnV = 0
    [  111.526607]   EA = 0, S1PTW = 0
    [  111.526610] Data abort info:
    [  111.526612]   ISV = 0, ISS = 0x00000047
    [  111.526615]   CM = 0, WnR = 1
    [  111.526619] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000041d75000
    [  111.526623] [ffff8000118cb880] pgd=10000001bffff003, p4d=10000001bffff003, pud=10000001bfffe003, pmd=10000001bfffa003, pte=0000000000000000
    [  111.526642] Internal error: Oops: 96000047 [#1] PREEMPT SMP
    [  111.526647] Modules linked in: dwc3_imx8mp dwc3 phy_fsl_imx8mq_usb [last unloaded: tcpci]
    [  111.526663] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.13.0-rc4-00927-gebbe9dbd802c-dirty #36
    [  111.526670] Hardware name: NXP i.MX8MPlus EVK board (DT)
    [  111.526674] pstate: 800000c5 (Nzcv daIF -PAN -UAO -TCO BTYPE=--)
    [  111.526681] pc : queued_spin_lock_slowpath+0x1a0/0x390
    [  111.526695] lr : _raw_spin_lock_irqsave+0x88/0xb4
    [  111.526703] sp : ffff800010003e20
    [  111.526706] x29: ffff800010003e20 x28: ffff00017f380180
    [  111.537156] buffer_io_error: 6 callbacks suppressed
    [  111.537162] Buffer I/O error on dev sda1, logical block 60040704, async page read
    [  111.539932]  x27: ffff00017f3801c0
    [  111.539938] x26: ffff800010ba2490 x25: 0000000000000000 x24: 0000000000000001
    [  111.543025] blk_update_request: I/O error, dev sda, sector 60061186 op 0x0:(READ) flags 0x0 phys_seg 7 prio class 0
    [  111.548304]
    [  111.548306] x23: 00000000000000c0 x22: ffff0000c2a9f184 x21: ffff00017f380180
    [  111.551374] Buffer I/O error on dev sda1, logical block 60040705, async page read
    [  111.554499]
    [  111.554503] x20: ffff0000c5f14210 x19: 00000000000000c0 x18: 0000000000000000
    [  111.557391] Buffer I/O error on dev sda1, logical block 60040706, async page read
    [  111.561218]
    [  111.561222] x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000000
    [  111.564205] Buffer I/O error on dev sda1, logical block 60040707, async page read
    [  111.570887] x14: 00000000000000f5 x13: 0000000000000001 x12: 0000000000000040
    [  111.570902] x11: ffff0000c05ac6d8
    [  111.583420] Buffer I/O error on dev sda1, logical block 60040708, async page read
    [  111.588978]  x10: 0000000000000000 x9 : 0000000000040000
    [  111.588988] x8 : 0000000000000000
    [  111.597173] Buffer I/O error on dev sda1, logical block 60040709, async page read
    [  111.605766]  x7 : ffff00017f384880 x6 : ffff8000118cb880
    [  111.605777] x5 : ffff00017f384880
    [  111.611094] Buffer I/O error on dev sda1, logical block 60040710, async page read
    [  111.617086]  x4 : 0000000000000000 x3 : ffff0000c2a9f184
    [  111.617096] x2 : ffff8000118cb880
    [  111.622242] Buffer I/O error on dev sda1, logical block 60040711, async page read
    [  111.626927]  x1 : ffff8000118cb880 x0 : ffff00017f384888
    [  111.626938] Call trace:
    [  111.626942]  queued_spin_lock_slowpath+0x1a0/0x390
    [  111.795809]  kthread_queue_work+0x30/0xc0
    [  111.799828]  state_machine_timer_handler+0x20/0x30
    [  111.804624]  __hrtimer_run_queues+0x140/0x1e0
    [  111.808990]  hrtimer_interrupt+0xec/0x2c0
    [  111.813004]  arch_timer_handler_phys+0x38/0x50
    [  111.817456]  handle_percpu_devid_irq+0x88/0x150
    [  111.821991]  __handle_domain_irq+0x80/0xe0
    [  111.826093]  gic_handle_irq+0xc0/0x140
    [  111.829848]  el1_irq+0xbc/0x154
    [  111.832991]  arch_cpu_idle+0x1c/0x2c
    [  111.836572]  default_idle_call+0x24/0x6c
    [  111.840497]  do_idle+0x238/0x2ac
    [  111.843729]  cpu_startup_entry+0x2c/0x70
    [  111.847657]  rest_init+0xdc/0xec
    [  111.850890]  arch_call_rest_init+0x14/0x20
    [  111.854988]  start_kernel+0x508/0x540
    [  111.858659] Code: 910020e0 8b0200c2 f861d884 aa0203e1 (f8246827)
    [  111.864760] ---[ end trace 308b9a4a3dcb73ac ]---
    [  111.869381] Kernel panic - not syncing: Oops: Fatal exception in interrupt
    [  111.876258] SMP: stopping secondary CPUs
    [  111.880185] Kernel Offset: disabled
    [  111.883673] CPU features: 0x00001001,20000846
    [  111.888031] Memory Limit: none
    [  111.891090] ---[ end Kernel panic - not syncing: Oops: Fatal exception in interrupt ]---
    
    Change-Id: I4fae27939edca3a9c09020e6252c96ae373eaaf2
    Fixes: 3ed8e1c2ac99 ("usb: typec: tcpm: Migrate workqueue to RT priority for processing events")
    Cc: stable <stable@vger.kernel.org>
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Li Jun <jun.li@nxp.com>
    Link: https://lore.kernel.org/r/1622627829-11070-1-git-send-email-jun.li@nxp.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Wang Jie <dave.wang@rock-chips.com>
    (cherry picked from commit 3a13ff7ef4349d70d1d18378d661117dd5af8efe)

diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index 7e8093a182fa..f7038f97f662 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -4968,6 +4968,9 @@ void tcpm_unregister_port(struct tcpm_port *port)
 {
 	int i;
 
+	hrtimer_cancel(&port->vdm_state_machine_timer);
+	hrtimer_cancel(&port->state_machine_timer);
+
 	tcpm_reset_port(port);
 	for (i = 0; i < ARRAY_SIZE(port->port_altmode); i++)
 		typec_unregister_altmode(port->port_altmode[i]);

commit 14d6da04a66ae69d6d6753010e9ec4f379f8a543
Author: Badhri Jagan Sridharan <badhri@google.com>
Date:   Tue Aug 18 12:27:58 2020 -0700

    UPSTREAM: usb: typec: tcpm: Migrate workqueue to RT priority for processing events
    
    "tReceiverResponse 15 ms Section 6.6.2
    The receiver of a Message requiring a response Shall respond
    within tReceiverResponse in order to ensure that the
    sender?s SenderResponseTimer does not expire."
    
    When the cpu complex is busy running other lower priority
    work items, TCPM's work queue sometimes does not get scheduled
    on time to meet the above requirement from the spec.
    Moving to kthread_work apis to run with real time priority.
    
    Further, as observed in 1ff688209e2e, moving to hrtimers to
    overcome scheduling latency while scheduling the delayed work.
    
    TCPM has three work streams:
    1. tcpm_state_machine
    2. vdm_state_machine
    3. event_work
    
    tcpm_state_machine and vdm_state_machine both schedule work in
    future i.e. delayed. Hence each of them have a corresponding
    hrtimer, tcpm_state_machine_timer & vdm_state_machine_timer.
    
    When work is queued right away kthread_queue_work is used.
    Else, the relevant timer is programmed and made to queue
    the kthread_work upon timer expiry.
    
    kthread_create_worker only creates one kthread worker thread,
    hence single threadedness of workqueue is retained.
    
    Change-Id: Iafd9ca68a00b61e39cc9de2609eaef2c277eabb0
    Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
    Link: https://lore.kernel.org/r/20200818192758.2562908-1-badhri@google.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Wang Jie <dave.wang@rock-chips.com>
    (cherry picked from commit 3ed8e1c2ac9914a2fcb08ec13476b85319536cea)

diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index 5a2ecf8b914f..7e8093a182fa 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -8,8 +8,10 @@
 #include <linux/completion.h>
 #include <linux/debugfs.h>
 #include <linux/device.h>
+#include <linux/hrtimer.h>
 #include <linux/jiffies.h>
 #include <linux/kernel.h>
+#include <linux/kthread.h>
 #include <linux/module.h>
 #include <linux/mutex.h>
 #include <linux/power_supply.h>
@@ -27,7 +29,8 @@
 #include <linux/usb/role.h>
 #include <linux/usb/tcpm.h>
 #include <linux/usb/typec_altmode.h>
-#include <linux/workqueue.h>
+
+#include <uapi/linux/sched/types.h>
 
 #define FOREACH_STATE(S)			\
 	S(INVALID_STATE),			\
@@ -194,7 +197,7 @@ struct tcpm_port {
 	struct device *dev;
 
 	struct mutex lock;		/* tcpm state machine lock */
-	struct workqueue_struct *wq;
+	struct kthread_worker *wq;
 
 	struct typec_capability typec_caps;
 	struct typec_port *typec_port;
@@ -238,15 +241,17 @@ struct tcpm_port {
 	enum tcpm_state prev_state;
 	enum tcpm_state state;
 	enum tcpm_state delayed_state;
-	unsigned long delayed_runtime;
+	ktime_t delayed_runtime;
 	unsigned long delay_ms;
 
 	spinlock_t pd_event_lock;
 	u32 pd_events;
 
-	struct work_struct event_work;
-	struct delayed_work state_machine;
-	struct delayed_work vdm_state_machine;
+	struct kthread_work event_work;
+	struct hrtimer state_machine_timer;
+	struct kthread_work state_machine;
+	struct hrtimer vdm_state_machine_timer;
+	struct kthread_work vdm_state_machine;
 	bool state_machine_running;
 
 	struct completion tx_complete;
@@ -331,7 +336,7 @@ struct tcpm_port {
 };
 
 struct pd_rx_event {
-	struct work_struct work;
+	struct kthread_work work;
 	struct tcpm_port *port;
 	struct pd_message msg;
 };
@@ -894,6 +899,27 @@ static int tcpm_pd_send_sink_caps(struct tcpm_port *port)
 	return tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
 }
 
+static void mod_tcpm_delayed_work(struct tcpm_port *port, unsigned int delay_ms)
+{
+	if (delay_ms) {
+		hrtimer_start(&port->state_machine_timer, ms_to_ktime(delay_ms), HRTIMER_MODE_REL);
+	} else {
+		hrtimer_cancel(&port->state_machine_timer);
+		kthread_queue_work(port->wq, &port->state_machine);
+	}
+}
+
+static void mod_vdm_delayed_work(struct tcpm_port *port, unsigned int delay_ms)
+{
+	if (delay_ms) {
+		hrtimer_start(&port->vdm_state_machine_timer, ms_to_ktime(delay_ms),
+			      HRTIMER_MODE_REL);
+	} else {
+		hrtimer_cancel(&port->vdm_state_machine_timer);
+		kthread_queue_work(port->wq, &port->vdm_state_machine);
+	}
+}
+
 static void tcpm_set_state(struct tcpm_port *port, enum tcpm_state state,
 			   unsigned int delay_ms)
 {
@@ -902,9 +928,8 @@ static void tcpm_set_state(struct tcpm_port *port, enum tcpm_state state,
 			 tcpm_states[port->state], tcpm_states[state],
 			 delay_ms);
 		port->delayed_state = state;
-		mod_delayed_work(port->wq, &port->state_machine,
-				 msecs_to_jiffies(delay_ms));
-		port->delayed_runtime = jiffies + msecs_to_jiffies(delay_ms);
+		mod_tcpm_delayed_work(port, delay_ms);
+		port->delayed_runtime = ktime_add(ktime_get(), ms_to_ktime(delay_ms));
 		port->delay_ms = delay_ms;
 	} else {
 		tcpm_log(port, "state change %s -> %s",
@@ -919,7 +944,7 @@ static void tcpm_set_state(struct tcpm_port *port, enum tcpm_state state,
 		 * machine.
 		 */
 		if (!port->state_machine_running)
-			mod_delayed_work(port->wq, &port->state_machine, 0);
+			mod_tcpm_delayed_work(port, 0);
 	}
 }
 
@@ -940,7 +965,7 @@ static void tcpm_queue_message(struct tcpm_port *port,
 			       enum pd_msg_request message)
 {
 	port->queued_message = message;
-	mod_delayed_work(port->wq, &port->state_machine, 0);
+	mod_tcpm_delayed_work(port, 0);
 }
 
 /*
@@ -1224,8 +1249,7 @@ static void tcpm_handle_vdm_request(struct tcpm_port *port,
 			port->vdm_state = VDM_STATE_WAIT_RSP_BUSY;
 			port->vdo_retry = (p0 & ~VDO_CMDT_MASK) |
 				CMDT_INIT;
-			mod_delayed_work(port->wq, &port->vdm_state_machine,
-					 msecs_to_jiffies(PD_T_VDM_BUSY));
+			mod_vdm_delayed_work(port, PD_T_VDM_BUSY);
 			return;
 		}
 		port->vdm_state = VDM_STATE_DONE;
@@ -1236,7 +1260,7 @@ static void tcpm_handle_vdm_request(struct tcpm_port *port,
 
 	if (rlen > 0) {
 		tcpm_queue_vdm(port, response[0], &response[1], rlen - 1);
-		mod_delayed_work(port->wq, &port->vdm_state_machine, 0);
+		mod_vdm_delayed_work(port, 0);
 	}
 }
 
@@ -1253,7 +1277,7 @@ static void tcpm_send_vdm(struct tcpm_port *port, u32 vid, int cmd,
 			1 : (PD_VDO_CMD(cmd) <= CMD_ATTENTION), cmd);
 	tcpm_queue_vdm(port, header, data, count);
 
-	mod_delayed_work(port->wq, &port->vdm_state_machine, 0);
+	mod_vdm_delayed_work(port, 0);
 }
 
 static unsigned int vdm_ready_timeout(u32 vdm_hdr)
@@ -1320,8 +1344,7 @@ static void vdm_run_state_machine(struct tcpm_port *port)
 			port->vdm_retries = 0;
 			port->vdm_state = VDM_STATE_BUSY;
 			timeout = vdm_ready_timeout(port->vdo_data[0]);
-			mod_delayed_work(port->wq, &port->vdm_state_machine,
-					 timeout);
+			mod_vdm_delayed_work(port, timeout);
 		}
 		break;
 	case VDM_STATE_WAIT_RSP_BUSY:
@@ -1350,10 +1373,9 @@ static void vdm_run_state_machine(struct tcpm_port *port)
 	}
 }
 
-static void vdm_state_machine_work(struct work_struct *work)
+static void vdm_state_machine_work(struct kthread_work *work)
 {
-	struct tcpm_port *port = container_of(work, struct tcpm_port,
-					      vdm_state_machine.work);
+	struct tcpm_port *port = container_of(work, struct tcpm_port, vdm_state_machine);
 	enum vdm_states prev_state;
 
 	mutex_lock(&port->lock);
@@ -1501,7 +1523,7 @@ static int tcpm_altmode_enter(struct typec_altmode *altmode)
 	header |= VDO_OPOS(altmode->mode);
 
 	tcpm_queue_vdm(port, header, NULL, 0);
-	mod_delayed_work(port->wq, &port->vdm_state_machine, 0);
+	mod_vdm_delayed_work(port, 0);
 	mutex_unlock(&port->lock);
 
 	return 0;
@@ -1517,7 +1539,7 @@ static int tcpm_altmode_exit(struct typec_altmode *altmode)
 	header |= VDO_OPOS(altmode->mode);
 
 	tcpm_queue_vdm(port, header, NULL, 0);
-	mod_delayed_work(port->wq, &port->vdm_state_machine, 0);
+	mod_vdm_delayed_work(port, 0);
 	mutex_unlock(&port->lock);
 
 	return 0;
@@ -1530,7 +1552,7 @@ static int tcpm_altmode_vdm(struct typec_altmode *altmode,
 
 	mutex_lock(&port->lock);
 	tcpm_queue_vdm(port, header, data, count - 1);
-	mod_delayed_work(port->wq, &port->vdm_state_machine, 0);
+	mod_vdm_delayed_work(port, 0);
 	mutex_unlock(&port->lock);
 
 	return 0;
@@ -1947,7 +1969,7 @@ static void tcpm_pd_ext_msg_request(struct tcpm_port *port,
 	}
 }
 
-static void tcpm_pd_rx_handler(struct work_struct *work)
+static void tcpm_pd_rx_handler(struct kthread_work *work)
 {
 	struct pd_rx_event *event = container_of(work,
 						 struct pd_rx_event, work);
@@ -2009,10 +2031,10 @@ void tcpm_pd_receive(struct tcpm_port *port, const struct pd_message *msg)
 	if (!event)
 		return;
 
-	INIT_WORK(&event->work, tcpm_pd_rx_handler);
+	kthread_init_work(&event->work, tcpm_pd_rx_handler);
 	event->port = port;
 	memcpy(&event->msg, msg, sizeof(*msg));
-	queue_work(port->wq, &event->work);
+	kthread_queue_work(port->wq, &event->work);
 }
 EXPORT_SYMBOL_GPL(tcpm_pd_receive);
 
@@ -2065,9 +2087,9 @@ static bool tcpm_send_queued_message(struct tcpm_port *port)
 	} while (port->queued_message != PD_MSG_NONE);
 
 	if (port->delayed_state != INVALID_STATE) {
-		if (time_is_after_jiffies(port->delayed_runtime)) {
-			mod_delayed_work(port->wq, &port->state_machine,
-					 port->delayed_runtime - jiffies);
+		if (ktime_after(port->delayed_runtime, ktime_get())) {
+			mod_tcpm_delayed_work(port, ktime_to_ms(ktime_sub(port->delayed_runtime,
+									  ktime_get())));
 			return true;
 		}
 		port->delayed_state = INVALID_STATE;
@@ -3186,10 +3208,9 @@ static void run_state_machine(struct tcpm_port *port)
 	case SNK_DISCOVERY_DEBOUNCE_DONE:
 		if (!tcpm_port_is_disconnected(port) &&
 		    tcpm_port_is_sink(port) &&
-		    time_is_after_jiffies(port->delayed_runtime)) {
+		    ktime_after(port->delayed_runtime, ktime_get())) {
 			tcpm_set_state(port, SNK_DISCOVERY,
-				       jiffies_to_msecs(port->delayed_runtime -
-							jiffies));
+				       ktime_to_ms(ktime_sub(port->delayed_runtime, ktime_get())));
 			break;
 		}
 		tcpm_set_state(port, unattached_state(port), 0);
@@ -3578,10 +3599,9 @@ static void run_state_machine(struct tcpm_port *port)
 	}
 }
 
-static void tcpm_state_machine_work(struct work_struct *work)
+static void tcpm_state_machine_work(struct kthread_work *work)
 {
-	struct tcpm_port *port = container_of(work, struct tcpm_port,
-					      state_machine.work);
+	struct tcpm_port *port = container_of(work, struct tcpm_port, state_machine);
 	enum tcpm_state prev_state;
 
 	mutex_lock(&port->lock);
@@ -3934,7 +3954,7 @@ static void _tcpm_pd_hard_reset(struct tcpm_port *port)
 		       0);
 }
 
-static void tcpm_pd_event_handler(struct work_struct *work)
+static void tcpm_pd_event_handler(struct kthread_work *work)
 {
 	struct tcpm_port *port = container_of(work, struct tcpm_port,
 					      event_work);
@@ -3975,7 +3995,7 @@ void tcpm_cc_change(struct tcpm_port *port)
 	spin_lock(&port->pd_event_lock);
 	port->pd_events |= TCPM_CC_EVENT;
 	spin_unlock(&port->pd_event_lock);
-	queue_work(port->wq, &port->event_work);
+	kthread_queue_work(port->wq, &port->event_work);
 }
 EXPORT_SYMBOL_GPL(tcpm_cc_change);
 
@@ -3984,7 +4004,7 @@ void tcpm_vbus_change(struct tcpm_port *port)
 	spin_lock(&port->pd_event_lock);
 	port->pd_events |= TCPM_VBUS_EVENT;
 	spin_unlock(&port->pd_event_lock);
-	queue_work(port->wq, &port->event_work);
+	kthread_queue_work(port->wq, &port->event_work);
 }
 EXPORT_SYMBOL_GPL(tcpm_vbus_change);
 
@@ -3993,7 +4013,7 @@ void tcpm_pd_hard_reset(struct tcpm_port *port)
 	spin_lock(&port->pd_event_lock);
 	port->pd_events = TCPM_RESET_EVENT;
 	spin_unlock(&port->pd_event_lock);
-	queue_work(port->wq, &port->event_work);
+	kthread_queue_work(port->wq, &port->event_work);
 }
 EXPORT_SYMBOL_GPL(tcpm_pd_hard_reset);
 
@@ -4810,10 +4830,27 @@ static int tcpm_copy_caps(struct tcpm_port *port,
 	return 0;
 }
 
+static enum hrtimer_restart state_machine_timer_handler(struct hrtimer *timer)
+{
+	struct tcpm_port *port = container_of(timer, struct tcpm_port, state_machine_timer);
+
+	kthread_queue_work(port->wq, &port->state_machine);
+	return HRTIMER_NORESTART;
+}
+
+static enum hrtimer_restart vdm_state_machine_timer_handler(struct hrtimer *timer)
+{
+	struct tcpm_port *port = container_of(timer, struct tcpm_port, vdm_state_machine_timer);
+
+	kthread_queue_work(port->wq, &port->vdm_state_machine);
+	return HRTIMER_NORESTART;
+}
+
 struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
 {
 	struct tcpm_port *port;
 	int i, err;
+	struct sched_param param = { .sched_priority = MAX_RT_PRIO - 1 };
 
 	if (!dev || !tcpc ||
 	    !tcpc->get_vbus || !tcpc->set_cc || !tcpc->get_cc ||
@@ -4831,12 +4868,18 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
 	mutex_init(&port->lock);
 	mutex_init(&port->swap_lock);
 
-	port->wq = create_singlethread_workqueue(dev_name(dev));
-	if (!port->wq)
-		return ERR_PTR(-ENOMEM);
-	INIT_DELAYED_WORK(&port->state_machine, tcpm_state_machine_work);
-	INIT_DELAYED_WORK(&port->vdm_state_machine, vdm_state_machine_work);
-	INIT_WORK(&port->event_work, tcpm_pd_event_handler);
+	port->wq = kthread_create_worker(0, dev_name(dev));
+	if (IS_ERR(port->wq))
+		return ERR_CAST(port->wq);
+	sched_setscheduler_nocheck(port->wq->task, SCHED_FIFO, &param);
+
+	kthread_init_work(&port->state_machine, tcpm_state_machine_work);
+	kthread_init_work(&port->vdm_state_machine, vdm_state_machine_work);
+	kthread_init_work(&port->event_work, tcpm_pd_event_handler);
+	hrtimer_init(&port->state_machine_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+	port->state_machine_timer.function = state_machine_timer_handler;
+	hrtimer_init(&port->vdm_state_machine_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+	port->vdm_state_machine_timer.function = vdm_state_machine_timer_handler;
 
 	spin_lock_init(&port->pd_event_lock);
 
@@ -4916,7 +4959,7 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
 
 out_destroy_wq:
 	usb_role_switch_put(port->role_sw);
-	destroy_workqueue(port->wq);
+	kthread_destroy_worker(port->wq);
 	return ERR_PTR(err);
 }
 EXPORT_SYMBOL_GPL(tcpm_register_port);
@@ -4931,7 +4974,7 @@ void tcpm_unregister_port(struct tcpm_port *port)
 	typec_unregister_port(port->typec_port);
 	usb_role_switch_put(port->role_sw);
 	tcpm_debugfs_exit(port);
-	destroy_workqueue(port->wq);
+	kthread_destroy_worker(port->wq);
 }
 EXPORT_SYMBOL_GPL(tcpm_unregister_port);
 

commit 79ba1940b3ce94423f559de2243bab4b80301ace
Author: Badhri Jagan Sridharan <badhri@google.com>
Date:   Thu Apr 2 14:59:47 2020 -0700

    UPSTREAM: usb: typec: tcpm: Ignore CC and vbus changes in PORT_RESET change
    
    After PORT_RESET, the port is set to the appropriate
    default_state. Ignore processing CC changes here as this
    could cause the port to be switched into sink states
    by default.
    
    echo source > /sys/class/typec/port0/port_type
    
    Before:
    [  154.528547] pending state change PORT_RESET -> PORT_RESET_WAIT_OFF @ 100 ms
    [  154.528560] CC1: 0 -> 0, CC2: 3 -> 0 [state PORT_RESET, polarity 0, disconnected]
    [  154.528564] state change PORT_RESET -> SNK_UNATTACHED
    
    After:
    [  151.068814] pending state change PORT_RESET -> PORT_RESET_WAIT_OFF @ 100 ms [rev3 NONE_AMS]
    [  151.072440] CC1: 3 -> 0, CC2: 0 -> 0 [state PORT_RESET, polarity 0, disconnected]
    [  151.172117] state change PORT_RESET -> PORT_RESET_WAIT_OFF [delayed 100 ms]
    [  151.172136] pending state change PORT_RESET_WAIT_OFF -> SRC_UNATTACHED @ 870 ms [rev3 NONE_AMS]
    [  152.060106] state change PORT_RESET_WAIT_OFF -> SRC_UNATTACHED [delayed 870 ms]
    [  152.060118] Start toggling
    
    Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>
    Cc: stable <stable@vger.kernel.org>
    Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    Link: https://lore.kernel.org/r/20200402215947.176577-1-badhri@google.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Wang Jie <dave.wang@rock-chips.com>
    Change-Id: Ic8a06dafdd4583cba12c7b66b1c9faf8ca830200
    (cherry picked from commit 901789745a053286e0ced37960d44fa60267b940)

diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index 015623a9b485..5a2ecf8b914f 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -3769,6 +3769,14 @@ static void _tcpm_cc_change(struct tcpm_port *port, enum typec_cc_status cc1,
 		 */
 		break;
 
+	case PORT_RESET:
+	case PORT_RESET_WAIT_OFF:
+		/*
+		 * State set back to default mode once the timer completes.
+		 * Ignore CC changes here.
+		 */
+		break;
+
 	default:
 		if (tcpm_port_is_disconnected(port))
 			tcpm_set_state(port, unattached_state(port), 0);
@@ -3830,6 +3838,15 @@ static void _tcpm_pd_vbus_on(struct tcpm_port *port)
 	case SRC_TRY_DEBOUNCE:
 		/* Do nothing, waiting for sink detection */
 		break;
+
+	case PORT_RESET:
+	case PORT_RESET_WAIT_OFF:
+		/*
+		 * State set back to default mode once the timer completes.
+		 * Ignore vbus changes here.
+		 */
+		break;
+
 	default:
 		break;
 	}
@@ -3883,10 +3900,19 @@ static void _tcpm_pd_vbus_off(struct tcpm_port *port)
 	case PORT_RESET_WAIT_OFF:
 		tcpm_set_state(port, tcpm_default_state(port), 0);
 		break;
+
 	case SRC_TRY_WAIT:
 	case SRC_TRY_DEBOUNCE:
 		/* Do nothing, waiting for sink detection */
 		break;
+
+	case PORT_RESET:
+		/*
+		 * State set back to default mode once the timer completes.
+		 * Ignore vbus changes here.
+		 */
+		break;
+
 	default:
 		if (port->pwr_role == TYPEC_SINK &&
 		    port->attached)

commit 4a7a52e98cec4fa4fba9acc5dc024bfa73ecc0f4
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Mon Aug 16 11:35:42 2021 +0800

    media: rockchip: isp: compiled with differe hardware version
    
    Change-Id: Ic18a8ba5005e14f9676716fc9b089ed81bdd38b0
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/Kconfig b/drivers/media/platform/rockchip/isp/Kconfig
index 9ad50f1032a0..95dc9db94788 100644
--- a/drivers/media/platform/rockchip/isp/Kconfig
+++ b/drivers/media/platform/rockchip/isp/Kconfig
@@ -12,8 +12,24 @@ config VIDEO_ROCKCHIP_ISP
 	help
 	  Support for ISP on the rockchip SoC.
 
+if VIDEO_ROCKCHIP_ISP
+
+config VIDEO_ROCKCHIP_ISP_VERSION_V1X
+	bool "isp1 for rk1808 rk3288 rk3326 rk3368 rk3399"
+	default y if CPU_RK1808 || CPU_RK3288 || CPU_PX30 || CPU_RK3368 || CPU_RK3399
+
+config VIDEO_ROCKCHIP_ISP_VERSION_V20
+	bool "isp20 for rv1126 and rv1109"
+	default y if CPU_RV1126
+
+config VIDEO_ROCKCHIP_ISP_VERSION_V21
+	bool "isp21 for rk3566 and rk3568"
+	default y if CPU_RK3568
+
 config VIDEO_ROCKCHIP_THUNDER_BOOT_ISP
 	bool "Rockchip Image Signal Processing Thunderboot helper"
 	depends on ROCKCHIP_THUNDER_BOOT
 	help
 	  Say y if enable thunderboot helper for isp.
+
+endif
diff --git a/drivers/media/platform/rockchip/isp/Makefile b/drivers/media/platform/rockchip/isp/Makefile
index 9b2926485371..1e948c8c101c 100644
--- a/drivers/media/platform/rockchip/isp/Makefile
+++ b/drivers/media/platform/rockchip/isp/Makefile
@@ -7,24 +7,28 @@ video_rkisp-objs += hw.o \
 		regs.o \
 		common.o \
 		isp_stats.o \
-		isp_stats_v1x.o \
-		isp_stats_v2x.o \
-		isp_stats_v21.o \
 		isp_params.o \
-		isp_params_v1x.o \
-		isp_params_v2x.o \
-		isp_params_v21.o \
 		capture.o \
-		capture_v1x.o \
-		capture_v20.o \
-		capture_v21.o \
 		dmarx.o \
 		csi.o \
-		bridge.o \
-		isp_mipi_luma.o \
 		procfs.o \
 		videobuf2-rdma-sg.o
 
-ifdef CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP
-video_rkisp-objs += rkisp_tb_helper.o
-endif
+video_rkisp-$(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V1X) += \
+		isp_stats_v1x.o \
+		isp_params_v1x.o \
+		capture_v1x.o
+
+video_rkisp-$(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V20) += \
+		isp_stats_v2x.o \
+		isp_params_v2x.o \
+		capture_v20.o \
+		bridge.o \
+		isp_mipi_luma.o
+
+video_rkisp-$(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V21) += \
+		isp_stats_v21.o \
+		isp_params_v21.o \
+		capture_v21.o
+
+video_rkisp-$(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP) += rkisp_tb_helper.o
diff --git a/drivers/media/platform/rockchip/isp/bridge.h b/drivers/media/platform/rockchip/isp/bridge.h
index 1a3fb69bfb2a..872d9d5753ba 100644
--- a/drivers/media/platform/rockchip/isp/bridge.h
+++ b/drivers/media/platform/rockchip/isp/bridge.h
@@ -67,6 +67,7 @@ struct rkisp_bridge_device {
 	bool en;
 };
 
+#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V20)
 int rkisp_register_bridge_subdev(struct rkisp_device *dev,
 				 struct v4l2_device *v4l2_dev);
 void rkisp_unregister_bridge_subdev(struct rkisp_device *dev);
@@ -76,6 +77,12 @@ void rkisp_bridge_sendtopp_buffer(struct rkisp_device *dev, u32 dev_id, u32 buf_
 void rkisp_bridge_save_spbuf(struct rkisp_device *dev, struct rkisp_buffer *sp_buf);
 void rkisp_bridge_stop_spstream(struct rkisp_device *dev);
 void rkisp_bridge_update_mi(struct rkisp_device *dev);
-void rkisp_get_bridge_sd(struct platform_device *dev,
-			 struct v4l2_subdev **sd);
+void rkisp_get_bridge_sd(struct platform_device *dev, struct v4l2_subdev **sd);
+#else
+static inline int rkisp_register_bridge_subdev(struct rkisp_device *dev, struct v4l2_device *v4l2_dev) { return 0; }
+static inline void rkisp_unregister_bridge_subdev(struct rkisp_device *dev) {}
+static inline int rkisp_bridge_get_fbcbuf_fd(struct rkisp_device *dev, struct isp2x_buf_idxfd *idxfd) { return 0; }
+static inline void rkisp_bridge_update_mi(struct rkisp_device *dev) {}
+#endif
+
 #endif
diff --git a/drivers/media/platform/rockchip/isp/capture.c b/drivers/media/platform/rockchip/isp/capture.c
index 760552ed69d7..34d8b5073646 100644
--- a/drivers/media/platform/rockchip/isp/capture.c
+++ b/drivers/media/platform/rockchip/isp/capture.c
@@ -23,6 +23,342 @@
 #define STREAM_MIN_MP_SP_INPUT_WIDTH		32
 #define STREAM_MIN_MP_SP_INPUT_HEIGHT		32
 
+static int hdr_dma_frame(struct rkisp_device *dev)
+{
+	int max_dma;
+
+	switch (dev->hdr.op_mode) {
+	case HDR_FRAMEX2_DDR:
+	case HDR_LINEX2_DDR:
+	case HDR_RDBK_FRAME1:
+		max_dma = 1;
+		break;
+	case HDR_FRAMEX3_DDR:
+	case HDR_LINEX3_DDR:
+	case HDR_RDBK_FRAME2:
+		max_dma = 2;
+		break;
+	case HDR_RDBK_FRAME3:
+		max_dma = HDR_DMA_MAX;
+		break;
+	case HDR_LINEX2_NO_DDR:
+	case HDR_NORMAL:
+	default:
+		max_dma = 0;
+	}
+	return max_dma;
+}
+
+static int rkisp_create_hdr_buf(struct rkisp_device *dev)
+{
+	int i, j, max_dma, max_buf = 1;
+	struct rkisp_dummy_buffer *buf;
+	struct rkisp_stream *stream;
+	u32 size;
+
+	stream = &dev->cap_dev.stream[RKISP_STREAM_DMATX0];
+	size = stream->out_fmt.plane_fmt[0].sizeimage;
+	max_dma = hdr_dma_frame(dev);
+	/* hdr read back mode using base and shd address
+	 * this support multi-buffer
+	 */
+	if (IS_HDR_RDBK(dev->hdr.op_mode)) {
+		if (!dev->dmarx_dev.trigger)
+			max_buf = HDR_MAX_DUMMY_BUF;
+		else
+			max_buf = 0;
+	}
+	for (i = 0; i < max_dma; i++) {
+		for (j = 0; j < max_buf; j++) {
+			buf = &dev->hdr.dummy_buf[i][j];
+			buf->size = size;
+			if (rkisp_alloc_buffer(dev, buf) < 0) {
+				v4l2_err(&dev->v4l2_dev,
+					"Failed to allocate the memory for hdr buffer\n");
+				return -ENOMEM;
+			}
+			hdr_qbuf(&dev->hdr.q_tx[i], buf);
+			v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
+				 "hdr buf[%d][%d]:0x%x\n",
+				 i, j, (u32)buf->dma_addr);
+		}
+		dev->hdr.index[i] = i;
+	}
+	/*
+	 * normal: q_tx[0] to dma0
+	 *	   q_tx[1] to dma1
+	 * rdbk1: using dma2
+		   q_tx[0] to dma2
+	 * rdbk2: using dma0 (as M), dma2 (as S)
+	 *	   q_tx[0] to dma0
+	 *	   q_tx[1] to dma2
+	 * rdbk3: using dma0 (as M), dam1 (as L), dma2 (as S)
+	 *	   q_tx[0] to dma0
+	 *	   q_tx[1] to dma1
+	 *	   q_tx[2] to dma2
+	 */
+	if (dev->hdr.op_mode == HDR_RDBK_FRAME1) {
+		dev->hdr.index[HDR_DMA2] = 0;
+		dev->hdr.index[HDR_DMA0] = 1;
+		dev->hdr.index[HDR_DMA1] = 2;
+	} else if (dev->hdr.op_mode == HDR_RDBK_FRAME2) {
+		dev->hdr.index[HDR_DMA0] = 0;
+		dev->hdr.index[HDR_DMA2] = 1;
+		dev->hdr.index[HDR_DMA1] = 2;
+	}
+
+	v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
+		 "hdr:%d buf index dma0:%d dma1:%d dma2:%d\n",
+		 max_dma,
+		 dev->hdr.index[HDR_DMA0],
+		 dev->hdr.index[HDR_DMA1],
+		 dev->hdr.index[HDR_DMA2]);
+	return 0;
+}
+
+void hdr_destroy_buf(struct rkisp_device *dev)
+{
+	int i, j;
+	struct rkisp_dummy_buffer *buf;
+
+	if (atomic_read(&dev->cap_dev.refcnt) > 1 ||
+	    !dev->active_sensor ||
+	    (dev->active_sensor &&
+	     dev->active_sensor->mbus.type != V4L2_MBUS_CSI2))
+		return;
+
+	atomic_set(&dev->hdr.refcnt, 0);
+	for (i = 0; i < HDR_DMA_MAX; i++) {
+		buf = dev->hdr.rx_cur_buf[i];
+		if (buf) {
+			rkisp_free_buffer(dev, buf);
+			dev->hdr.rx_cur_buf[i] = NULL;
+		}
+
+		for (j = 0; j < HDR_MAX_DUMMY_BUF; j++) {
+			buf = hdr_dqbuf(&dev->hdr.q_tx[i]);
+			if (buf)
+				rkisp_free_buffer(dev, buf);
+			buf = hdr_dqbuf(&dev->hdr.q_rx[i]);
+			if (buf)
+				rkisp_free_buffer(dev, buf);
+		}
+	}
+}
+
+int hdr_update_dmatx_buf(struct rkisp_device *dev)
+{
+	void __iomem *base = dev->base_addr;
+	struct rkisp_stream *dmatx;
+	struct rkisp_dummy_buffer *buf;
+	u8 i, index;
+
+	if (!dev->active_sensor ||
+	    (dev->active_sensor &&
+	     dev->active_sensor->mbus.type != V4L2_MBUS_CSI2) ||
+	    (dev->isp_inp & INP_CIF))
+		return 0;
+
+	for (i = RKISP_STREAM_DMATX0; i <= RKISP_STREAM_DMATX2; i++) {
+		dmatx = &dev->cap_dev.stream[i];
+		if (dmatx->ops && dmatx->ops->frame_end)
+			dmatx->ops->frame_end(dmatx);
+	}
+
+	if (dev->dmarx_dev.trigger)
+		goto end;
+
+	/* for rawrd auto trigger mode, config first buf */
+	index = dev->hdr.index[HDR_DMA0];
+	buf = hdr_dqbuf(&dev->hdr.q_rx[index]);
+	if (buf) {
+		mi_raw0_rd_set_addr(base, buf->dma_addr);
+		dev->hdr.rx_cur_buf[index] = buf;
+	} else {
+		mi_raw0_rd_set_addr(base,
+			readl(base + MI_RAW0_WR_BASE_SHD));
+	}
+
+	index = dev->hdr.index[HDR_DMA1];
+	buf = hdr_dqbuf(&dev->hdr.q_rx[index]);
+	if (buf) {
+		mi_raw1_rd_set_addr(base, buf->dma_addr);
+		dev->hdr.rx_cur_buf[index] = buf;
+	} else {
+		mi_raw1_rd_set_addr(base,
+			readl(base + MI_RAW1_WR_BASE_SHD));
+	}
+
+	index = dev->hdr.index[HDR_DMA2];
+	buf = hdr_dqbuf(&dev->hdr.q_rx[index]);
+	if (buf) {
+		mi_raw2_rd_set_addr(base, buf->dma_addr);
+		dev->hdr.rx_cur_buf[index] = buf;
+	} else {
+		mi_raw2_rd_set_addr(base,
+			readl(base + MI_RAW2_WR_BASE_SHD));
+	}
+
+end:
+	v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
+		 "CSI2RX CTRL0:0x%x CTRL1:0x%x\n"
+		 "WR CTRL RAW0:0x%x RAW1:0x%x RAW2:0x%x\n"
+		 "RD CTRL:0x%x\n",
+		 readl(base + CSI2RX_CTRL0),
+		 readl(base + CSI2RX_CTRL1),
+		 readl(base + CSI2RX_RAW0_WR_CTRL),
+		 readl(base + CSI2RX_RAW1_WR_CTRL),
+		 readl(base + CSI2RX_RAW2_WR_CTRL),
+		 readl(base + CSI2RX_RAW_RD_CTRL));
+	return 0;
+}
+
+int hdr_config_dmatx(struct rkisp_device *dev)
+{
+	struct rkisp_stream *stream;
+	struct v4l2_pix_format_mplane pixm;
+
+	if (atomic_inc_return(&dev->hdr.refcnt) > 1 ||
+	    !dev->active_sensor ||
+	    (dev->active_sensor &&
+	     dev->active_sensor->mbus.type != V4L2_MBUS_CSI2) ||
+	    (dev->isp_inp & INP_CIF))
+		return 0;
+
+	rkisp_create_hdr_buf(dev);
+	memset(&pixm, 0, sizeof(pixm));
+	if (dev->hdr.op_mode == HDR_FRAMEX2_DDR ||
+	    dev->hdr.op_mode == HDR_LINEX2_DDR ||
+	    dev->hdr.op_mode == HDR_FRAMEX3_DDR ||
+	    dev->hdr.op_mode == HDR_LINEX3_DDR ||
+	    dev->hdr.op_mode == HDR_RDBK_FRAME2 ||
+	    dev->hdr.op_mode == HDR_RDBK_FRAME3) {
+		stream = &dev->cap_dev.stream[RKISP_STREAM_DMATX0];
+		if (stream->ops && stream->ops->config_mi)
+			stream->ops->config_mi(stream);
+
+		if (!dev->dmarx_dev.trigger) {
+			pixm = stream->out_fmt;
+			stream = &dev->dmarx_dev.stream[RKISP_STREAM_RAWRD0];
+			rkisp_dmarx_set_fmt(stream, pixm);
+			mi_raw_length(stream);
+		}
+	}
+	if (dev->hdr.op_mode == HDR_FRAMEX3_DDR ||
+	    dev->hdr.op_mode == HDR_LINEX3_DDR ||
+	    dev->hdr.op_mode == HDR_RDBK_FRAME3) {
+		stream = &dev->cap_dev.stream[RKISP_STREAM_DMATX1];
+		if (stream->ops && stream->ops->config_mi)
+			stream->ops->config_mi(stream);
+
+		if (!dev->dmarx_dev.trigger) {
+			pixm = stream->out_fmt;
+			stream = &dev->dmarx_dev.stream[RKISP_STREAM_RAWRD1];
+			rkisp_dmarx_set_fmt(stream, pixm);
+			mi_raw_length(stream);
+		}
+	}
+	if (dev->hdr.op_mode == HDR_RDBK_FRAME1 ||
+	    dev->hdr.op_mode == HDR_RDBK_FRAME2 ||
+	    dev->hdr.op_mode == HDR_RDBK_FRAME3) {
+		stream = &dev->cap_dev.stream[RKISP_STREAM_DMATX2];
+		if (stream->ops && stream->ops->config_mi)
+			stream->ops->config_mi(stream);
+
+		if (!dev->dmarx_dev.trigger) {
+			pixm = stream->out_fmt;
+			stream = &dev->dmarx_dev.stream[RKISP_STREAM_RAWRD2];
+			rkisp_dmarx_set_fmt(stream, pixm);
+			stream->ops->config_mi(stream);
+		}
+	}
+
+	if (dev->hdr.op_mode != HDR_NORMAL && !dev->dmarx_dev.trigger) {
+		raw_rd_ctrl(dev->base_addr, dev->csi_dev.memory << 2);
+		if (pixm.width && pixm.height)
+			rkisp_rawrd_set_pic_size(dev, pixm.width, pixm.height);
+	}
+	return 0;
+}
+
+void hdr_stop_dmatx(struct rkisp_device *dev)
+{
+	struct rkisp_stream *stream;
+
+	if (atomic_dec_return(&dev->hdr.refcnt) ||
+	    !dev->active_sensor ||
+	    (dev->active_sensor &&
+	     dev->active_sensor->mbus.type != V4L2_MBUS_CSI2) ||
+	    (dev->isp_inp & INP_CIF))
+		return;
+
+	if (dev->hdr.op_mode == HDR_FRAMEX2_DDR ||
+	    dev->hdr.op_mode == HDR_LINEX2_DDR ||
+	    dev->hdr.op_mode == HDR_FRAMEX3_DDR ||
+	    dev->hdr.op_mode == HDR_LINEX3_DDR ||
+	    dev->hdr.op_mode == HDR_RDBK_FRAME2 ||
+	    dev->hdr.op_mode == HDR_RDBK_FRAME3) {
+		stream = &dev->cap_dev.stream[RKISP_STREAM_DMATX0];
+		stream->ops->stop_mi(stream);
+	}
+	if (dev->hdr.op_mode == HDR_FRAMEX3_DDR ||
+	    dev->hdr.op_mode == HDR_LINEX3_DDR ||
+	    dev->hdr.op_mode == HDR_RDBK_FRAME3) {
+		stream = &dev->cap_dev.stream[RKISP_STREAM_DMATX1];
+		stream->ops->stop_mi(stream);
+	}
+	if (dev->hdr.op_mode == HDR_RDBK_FRAME1 ||
+	    dev->hdr.op_mode == HDR_RDBK_FRAME2 ||
+	    dev->hdr.op_mode == HDR_RDBK_FRAME3) {
+		stream = &dev->cap_dev.stream[RKISP_STREAM_DMATX2];
+		stream->ops->stop_mi(stream);
+	}
+}
+
+struct rkisp_dummy_buffer *hdr_dqbuf(struct list_head *q)
+{
+	struct rkisp_dummy_buffer *buf = NULL;
+
+	if (!list_empty(q)) {
+		buf = list_first_entry(q,
+			struct rkisp_dummy_buffer, queue);
+		list_del(&buf->queue);
+	}
+	return buf;
+}
+
+void hdr_qbuf(struct list_head *q,
+	      struct rkisp_dummy_buffer *buf)
+{
+	if (buf)
+		list_add_tail(&buf->queue, q);
+}
+
+void rkisp_config_dmatx_valid_buf(struct rkisp_device *dev)
+{
+	struct rkisp_hw_dev *hw = dev->hw_dev;
+	struct rkisp_stream *stream;
+	struct rkisp_device *isp;
+	u32 i, j;
+
+	if (!hw->dummy_buf.mem_priv)
+		return;
+	/* dmatx buf update by mi force or oneself frame end,
+	 * for async dmatx enable need to update to valid buf first.
+	 */
+	for (i = 0; i < hw->dev_num; i++) {
+		isp = hw->isp[i];
+		if (!(isp->isp_inp & INP_CSI))
+			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)
+				continue;
+			mi_set_y_addr(stream, hw->dummy_buf.dma_addr);
+		}
+	}
+}
+
 /* Get xsubs and ysubs for fourcc formats
  *
  * @xsubs: horizontal color samples in a 4*4 matrix, for yuv
diff --git a/drivers/media/platform/rockchip/isp/capture_v1x.h b/drivers/media/platform/rockchip/isp/capture_v1x.h
index 1fb7303b5ab6..a001e69c5a43 100644
--- a/drivers/media/platform/rockchip/isp/capture_v1x.h
+++ b/drivers/media/platform/rockchip/isp/capture_v1x.h
@@ -4,7 +4,14 @@
 #ifndef _RKISP_CAPTURE_V1X_H
 #define _RKISP_CAPTURE_V1X_H
 
+#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V1X)
 int rkisp_register_stream_v1x(struct rkisp_device *dev);
 void rkisp_unregister_stream_v1x(struct rkisp_device *dev);
 void rkisp_mi_v1x_isr(u32 mis_val, struct rkisp_device *dev);
+#else
+static inline int rkisp_register_stream_v1x(struct rkisp_device *dev) { return 0; }
+static inline void rkisp_unregister_stream_v1x(struct rkisp_device *dev) {}
+static inline void rkisp_mi_v1x_isr(u32 mis_val, struct rkisp_device *dev) {}
+#endif
+
 #endif
diff --git a/drivers/media/platform/rockchip/isp/capture_v20.c b/drivers/media/platform/rockchip/isp/capture_v20.c
index a1a6fb1539d2..2480591d9edb 100644
--- a/drivers/media/platform/rockchip/isp/capture_v20.c
+++ b/drivers/media/platform/rockchip/isp/capture_v20.c
@@ -129,7 +129,7 @@ static const struct capture_fmt dmatx_fmts[] = {
 	}
 };
 
-struct stream_config rkisp2_dmatx0_stream_config = {
+static struct stream_config rkisp2_dmatx0_stream_config = {
 	.fmts = dmatx_fmts,
 	.fmt_size = ARRAY_SIZE(dmatx_fmts),
 	.frame_end_id = MI_RAW0_WR_FRAME,
@@ -146,7 +146,7 @@ struct stream_config rkisp2_dmatx0_stream_config = {
 	},
 };
 
-struct stream_config rkisp2_dmatx1_stream_config = {
+static struct stream_config rkisp2_dmatx1_stream_config = {
 	.fmts = dmatx_fmts,
 	.fmt_size = ARRAY_SIZE(dmatx_fmts),
 	.frame_end_id = MI_RAW1_WR_FRAME,
@@ -163,7 +163,7 @@ struct stream_config rkisp2_dmatx1_stream_config = {
 	},
 };
 
-struct stream_config rkisp2_dmatx2_stream_config = {
+static struct stream_config rkisp2_dmatx2_stream_config = {
 	.fmts = dmatx_fmts,
 	.fmt_size = ARRAY_SIZE(dmatx_fmts),
 	.frame_end_id = MI_RAW2_WR_FRAME,
@@ -180,7 +180,7 @@ struct stream_config rkisp2_dmatx2_stream_config = {
 	},
 };
 
-struct stream_config rkisp2_dmatx3_stream_config = {
+static struct stream_config rkisp2_dmatx3_stream_config = {
 	.fmts = dmatx_fmts,
 	.fmt_size = ARRAY_SIZE(dmatx_fmts),
 	.frame_end_id = MI_RAW3_WR_FRAME,
@@ -215,342 +215,6 @@ static bool is_rdbk_stream(struct rkisp_stream *stream)
 	return en;
 }
 
-static int hdr_dma_frame(struct rkisp_device *dev)
-{
-	int max_dma;
-
-	switch (dev->hdr.op_mode) {
-	case HDR_FRAMEX2_DDR:
-	case HDR_LINEX2_DDR:
-	case HDR_RDBK_FRAME1:
-		max_dma = 1;
-		break;
-	case HDR_FRAMEX3_DDR:
-	case HDR_LINEX3_DDR:
-	case HDR_RDBK_FRAME2:
-		max_dma = 2;
-		break;
-	case HDR_RDBK_FRAME3:
-		max_dma = HDR_DMA_MAX;
-		break;
-	case HDR_LINEX2_NO_DDR:
-	case HDR_NORMAL:
-	default:
-		max_dma = 0;
-	}
-	return max_dma;
-}
-
-static int rkisp_create_hdr_buf(struct rkisp_device *dev)
-{
-	int i, j, max_dma, max_buf = 1;
-	struct rkisp_dummy_buffer *buf;
-	struct rkisp_stream *stream;
-	u32 size;
-
-	stream = &dev->cap_dev.stream[RKISP_STREAM_DMATX0];
-	size = stream->out_fmt.plane_fmt[0].sizeimage;
-	max_dma = hdr_dma_frame(dev);
-	/* hdr read back mode using base and shd address
-	 * this support multi-buffer
-	 */
-	if (IS_HDR_RDBK(dev->hdr.op_mode)) {
-		if (!dev->dmarx_dev.trigger)
-			max_buf = HDR_MAX_DUMMY_BUF;
-		else
-			max_buf = 0;
-	}
-	for (i = 0; i < max_dma; i++) {
-		for (j = 0; j < max_buf; j++) {
-			buf = &dev->hdr.dummy_buf[i][j];
-			buf->size = size;
-			if (rkisp_alloc_buffer(dev, buf) < 0) {
-				v4l2_err(&dev->v4l2_dev,
-					"Failed to allocate the memory for hdr buffer\n");
-				return -ENOMEM;
-			}
-			hdr_qbuf(&dev->hdr.q_tx[i], buf);
-			v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
-				 "hdr buf[%d][%d]:0x%x\n",
-				 i, j, (u32)buf->dma_addr);
-		}
-		dev->hdr.index[i] = i;
-	}
-	/*
-	 * normal: q_tx[0] to dma0
-	 *	   q_tx[1] to dma1
-	 * rdbk1: using dma2
-		   q_tx[0] to dma2
-	 * rdbk2: using dma0 (as M), dma2 (as S)
-	 *	   q_tx[0] to dma0
-	 *	   q_tx[1] to dma2
-	 * rdbk3: using dma0 (as M), dam1 (as L), dma2 (as S)
-	 *	   q_tx[0] to dma0
-	 *	   q_tx[1] to dma1
-	 *	   q_tx[2] to dma2
-	 */
-	if (dev->hdr.op_mode == HDR_RDBK_FRAME1) {
-		dev->hdr.index[HDR_DMA2] = 0;
-		dev->hdr.index[HDR_DMA0] = 1;
-		dev->hdr.index[HDR_DMA1] = 2;
-	} else if (dev->hdr.op_mode == HDR_RDBK_FRAME2) {
-		dev->hdr.index[HDR_DMA0] = 0;
-		dev->hdr.index[HDR_DMA2] = 1;
-		dev->hdr.index[HDR_DMA1] = 2;
-	}
-
-	v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
-		 "hdr:%d buf index dma0:%d dma1:%d dma2:%d\n",
-		 max_dma,
-		 dev->hdr.index[HDR_DMA0],
-		 dev->hdr.index[HDR_DMA1],
-		 dev->hdr.index[HDR_DMA2]);
-	return 0;
-}
-
-void hdr_destroy_buf(struct rkisp_device *dev)
-{
-	int i, j;
-	struct rkisp_dummy_buffer *buf;
-
-	if (atomic_read(&dev->cap_dev.refcnt) > 1 ||
-	    !dev->active_sensor ||
-	    (dev->active_sensor &&
-	     dev->active_sensor->mbus.type != V4L2_MBUS_CSI2))
-		return;
-
-	atomic_set(&dev->hdr.refcnt, 0);
-	for (i = 0; i < HDR_DMA_MAX; i++) {
-		buf = dev->hdr.rx_cur_buf[i];
-		if (buf) {
-			rkisp_free_buffer(dev, buf);
-			dev->hdr.rx_cur_buf[i] = NULL;
-		}
-
-		for (j = 0; j < HDR_MAX_DUMMY_BUF; j++) {
-			buf = hdr_dqbuf(&dev->hdr.q_tx[i]);
-			if (buf)
-				rkisp_free_buffer(dev, buf);
-			buf = hdr_dqbuf(&dev->hdr.q_rx[i]);
-			if (buf)
-				rkisp_free_buffer(dev, buf);
-		}
-	}
-}
-
-int hdr_update_dmatx_buf(struct rkisp_device *dev)
-{
-	void __iomem *base = dev->base_addr;
-	struct rkisp_stream *dmatx;
-	struct rkisp_dummy_buffer *buf;
-	u8 i, index;
-
-	if (!dev->active_sensor ||
-	    (dev->active_sensor &&
-	     dev->active_sensor->mbus.type != V4L2_MBUS_CSI2) ||
-	    (dev->isp_inp & INP_CIF))
-		return 0;
-
-	for (i = RKISP_STREAM_DMATX0; i <= RKISP_STREAM_DMATX2; i++) {
-		dmatx = &dev->cap_dev.stream[i];
-		if (dmatx->ops && dmatx->ops->frame_end)
-			dmatx->ops->frame_end(dmatx);
-	}
-
-	if (dev->dmarx_dev.trigger)
-		goto end;
-
-	/* for rawrd auto trigger mode, config first buf */
-	index = dev->hdr.index[HDR_DMA0];
-	buf = hdr_dqbuf(&dev->hdr.q_rx[index]);
-	if (buf) {
-		mi_raw0_rd_set_addr(base, buf->dma_addr);
-		dev->hdr.rx_cur_buf[index] = buf;
-	} else {
-		mi_raw0_rd_set_addr(base,
-			readl(base + MI_RAW0_WR_BASE_SHD));
-	}
-
-	index = dev->hdr.index[HDR_DMA1];
-	buf = hdr_dqbuf(&dev->hdr.q_rx[index]);
-	if (buf) {
-		mi_raw1_rd_set_addr(base, buf->dma_addr);
-		dev->hdr.rx_cur_buf[index] = buf;
-	} else {
-		mi_raw1_rd_set_addr(base,
-			readl(base + MI_RAW1_WR_BASE_SHD));
-	}
-
-	index = dev->hdr.index[HDR_DMA2];
-	buf = hdr_dqbuf(&dev->hdr.q_rx[index]);
-	if (buf) {
-		mi_raw2_rd_set_addr(base, buf->dma_addr);
-		dev->hdr.rx_cur_buf[index] = buf;
-	} else {
-		mi_raw2_rd_set_addr(base,
-			readl(base + MI_RAW2_WR_BASE_SHD));
-	}
-
-end:
-	v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
-		 "CSI2RX CTRL0:0x%x CTRL1:0x%x\n"
-		 "WR CTRL RAW0:0x%x RAW1:0x%x RAW2:0x%x\n"
-		 "RD CTRL:0x%x\n",
-		 readl(base + CSI2RX_CTRL0),
-		 readl(base + CSI2RX_CTRL1),
-		 readl(base + CSI2RX_RAW0_WR_CTRL),
-		 readl(base + CSI2RX_RAW1_WR_CTRL),
-		 readl(base + CSI2RX_RAW2_WR_CTRL),
-		 readl(base + CSI2RX_RAW_RD_CTRL));
-	return 0;
-}
-
-int hdr_config_dmatx(struct rkisp_device *dev)
-{
-	struct rkisp_stream *stream;
-	struct v4l2_pix_format_mplane pixm;
-
-	if (atomic_inc_return(&dev->hdr.refcnt) > 1 ||
-	    !dev->active_sensor ||
-	    (dev->active_sensor &&
-	     dev->active_sensor->mbus.type != V4L2_MBUS_CSI2) ||
-	    (dev->isp_inp & INP_CIF))
-		return 0;
-
-	rkisp_create_hdr_buf(dev);
-	memset(&pixm, 0, sizeof(pixm));
-	if (dev->hdr.op_mode == HDR_FRAMEX2_DDR ||
-	    dev->hdr.op_mode == HDR_LINEX2_DDR ||
-	    dev->hdr.op_mode == HDR_FRAMEX3_DDR ||
-	    dev->hdr.op_mode == HDR_LINEX3_DDR ||
-	    dev->hdr.op_mode == HDR_RDBK_FRAME2 ||
-	    dev->hdr.op_mode == HDR_RDBK_FRAME3) {
-		stream = &dev->cap_dev.stream[RKISP_STREAM_DMATX0];
-		if (stream->ops && stream->ops->config_mi)
-			stream->ops->config_mi(stream);
-
-		if (!dev->dmarx_dev.trigger) {
-			pixm = stream->out_fmt;
-			stream = &dev->dmarx_dev.stream[RKISP_STREAM_RAWRD0];
-			rkisp_dmarx_set_fmt(stream, pixm);
-			mi_raw_length(stream);
-		}
-	}
-	if (dev->hdr.op_mode == HDR_FRAMEX3_DDR ||
-	    dev->hdr.op_mode == HDR_LINEX3_DDR ||
-	    dev->hdr.op_mode == HDR_RDBK_FRAME3) {
-		stream = &dev->cap_dev.stream[RKISP_STREAM_DMATX1];
-		if (stream->ops && stream->ops->config_mi)
-			stream->ops->config_mi(stream);
-
-		if (!dev->dmarx_dev.trigger) {
-			pixm = stream->out_fmt;
-			stream = &dev->dmarx_dev.stream[RKISP_STREAM_RAWRD1];
-			rkisp_dmarx_set_fmt(stream, pixm);
-			mi_raw_length(stream);
-		}
-	}
-	if (dev->hdr.op_mode == HDR_RDBK_FRAME1 ||
-	    dev->hdr.op_mode == HDR_RDBK_FRAME2 ||
-	    dev->hdr.op_mode == HDR_RDBK_FRAME3) {
-		stream = &dev->cap_dev.stream[RKISP_STREAM_DMATX2];
-		if (stream->ops && stream->ops->config_mi)
-			stream->ops->config_mi(stream);
-
-		if (!dev->dmarx_dev.trigger) {
-			pixm = stream->out_fmt;
-			stream = &dev->dmarx_dev.stream[RKISP_STREAM_RAWRD2];
-			rkisp_dmarx_set_fmt(stream, pixm);
-			stream->ops->config_mi(stream);
-		}
-	}
-
-	if (dev->hdr.op_mode != HDR_NORMAL && !dev->dmarx_dev.trigger) {
-		raw_rd_ctrl(dev->base_addr, dev->csi_dev.memory << 2);
-		if (pixm.width && pixm.height)
-			rkisp_rawrd_set_pic_size(dev, pixm.width, pixm.height);
-	}
-	return 0;
-}
-
-void hdr_stop_dmatx(struct rkisp_device *dev)
-{
-	struct rkisp_stream *stream;
-
-	if (atomic_dec_return(&dev->hdr.refcnt) ||
-	    !dev->active_sensor ||
-	    (dev->active_sensor &&
-	     dev->active_sensor->mbus.type != V4L2_MBUS_CSI2) ||
-	    (dev->isp_inp & INP_CIF))
-		return;
-
-	if (dev->hdr.op_mode == HDR_FRAMEX2_DDR ||
-	    dev->hdr.op_mode == HDR_LINEX2_DDR ||
-	    dev->hdr.op_mode == HDR_FRAMEX3_DDR ||
-	    dev->hdr.op_mode == HDR_LINEX3_DDR ||
-	    dev->hdr.op_mode == HDR_RDBK_FRAME2 ||
-	    dev->hdr.op_mode == HDR_RDBK_FRAME3) {
-		stream = &dev->cap_dev.stream[RKISP_STREAM_DMATX0];
-		stream->ops->stop_mi(stream);
-	}
-	if (dev->hdr.op_mode == HDR_FRAMEX3_DDR ||
-	    dev->hdr.op_mode == HDR_LINEX3_DDR ||
-	    dev->hdr.op_mode == HDR_RDBK_FRAME3) {
-		stream = &dev->cap_dev.stream[RKISP_STREAM_DMATX1];
-		stream->ops->stop_mi(stream);
-	}
-	if (dev->hdr.op_mode == HDR_RDBK_FRAME1 ||
-	    dev->hdr.op_mode == HDR_RDBK_FRAME2 ||
-	    dev->hdr.op_mode == HDR_RDBK_FRAME3) {
-		stream = &dev->cap_dev.stream[RKISP_STREAM_DMATX2];
-		stream->ops->stop_mi(stream);
-	}
-}
-
-struct rkisp_dummy_buffer *hdr_dqbuf(struct list_head *q)
-{
-	struct rkisp_dummy_buffer *buf = NULL;
-
-	if (!list_empty(q)) {
-		buf = list_first_entry(q,
-			struct rkisp_dummy_buffer, queue);
-		list_del(&buf->queue);
-	}
-	return buf;
-}
-
-void hdr_qbuf(struct list_head *q,
-	      struct rkisp_dummy_buffer *buf)
-{
-	if (buf)
-		list_add_tail(&buf->queue, q);
-}
-
-void rkisp_config_dmatx_valid_buf(struct rkisp_device *dev)
-{
-	struct rkisp_hw_dev *hw = dev->hw_dev;
-	struct rkisp_stream *stream;
-	struct rkisp_device *isp;
-	u32 i, j;
-
-	if (!hw->dummy_buf.mem_priv)
-		return;
-	/* dmatx buf update by mi force or oneself frame end,
-	 * for async dmatx enable need to update to valid buf first.
-	 */
-	for (i = 0; i < hw->dev_num; i++) {
-		isp = hw->isp[i];
-		if (!(isp->isp_inp & INP_CSI))
-			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)
-				continue;
-			mi_set_y_addr(stream, hw->dummy_buf.dma_addr);
-		}
-	}
-}
-
 /* configure dual-crop unit */
 static int rkisp_stream_config_dcrop(struct rkisp_stream *stream, bool async)
 {
@@ -1235,7 +899,7 @@ static void rdbk_frame_end(struct rkisp_stream *stream)
 	u32 denominator = sensor->fi.interval.denominator;
 	u32 numerator = sensor->fi.interval.numerator;
 	u64 l_ts, m_ts, s_ts;
-	int ret, max_dma, fps = -1, time = 30000000;
+	int ret, fps = -1, time = 30000000;
 
 	if (stream->id != RKISP_STREAM_DMATX2)
 		return;
@@ -1243,8 +907,7 @@ static void rdbk_frame_end(struct rkisp_stream *stream)
 	if (denominator && numerator)
 		time = numerator * 1000 / denominator * 1000 * 1000;
 
-	max_dma = hdr_dma_frame(isp_dev);
-	if (max_dma == 3) {
+	if (isp_dev->hdr.op_mode == HDR_RDBK_FRAME3) {
 		if (cap->rdbk_buf[RDBK_L] && cap->rdbk_buf[RDBK_M] &&
 		    cap->rdbk_buf[RDBK_S]) {
 			l_ts = cap->rdbk_buf[RDBK_L]->vb.vb2_buf.timestamp;
@@ -1290,7 +953,7 @@ static void rdbk_frame_end(struct rkisp_stream *stream)
 			v4l2_err(&isp_dev->v4l2_dev, "lost long or middle frames\n");
 			goto RDBK_FRM_UNMATCH;
 		}
-	} else if (max_dma == 2) {
+	} else if (isp_dev->hdr.op_mode == HDR_RDBK_FRAME2) {
 		if (cap->rdbk_buf[RDBK_L] && cap->rdbk_buf[RDBK_S]) {
 			l_ts = cap->rdbk_buf[RDBK_L]->vb.vb2_buf.timestamp;
 			s_ts = cap->rdbk_buf[RDBK_S]->vb.vb2_buf.timestamp;
diff --git a/drivers/media/platform/rockchip/isp/capture_v21.c b/drivers/media/platform/rockchip/isp/capture_v21.c
index 06260f1641e3..6aa3de1332e2 100644
--- a/drivers/media/platform/rockchip/isp/capture_v21.c
+++ b/drivers/media/platform/rockchip/isp/capture_v21.c
@@ -19,6 +19,167 @@ static int mi_frame_end(struct rkisp_stream *stream);
 static void rkisp_buf_queue(struct vb2_buffer *vb);
 static int rkisp_create_dummy_buf(struct rkisp_stream *stream);
 
+static const struct capture_fmt dmatx_fmts[] = {
+	/* raw */
+	{
+		.fourcc = V4L2_PIX_FMT_SRGGB8,
+		.fmt_type = FMT_BAYER,
+		.bpp = { 8 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_SGRBG8,
+		.fmt_type = FMT_BAYER,
+		.bpp = { 8 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_SGBRG8,
+		.fmt_type = FMT_BAYER,
+		.bpp = { 8 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_SBGGR8,
+		.fmt_type = FMT_BAYER,
+		.bpp = { 8 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_GREY,
+		.fmt_type = FMT_BAYER,
+		.bpp = { 8 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_SRGGB10,
+		.fmt_type = FMT_BAYER,
+		.bpp = { 10 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_SGRBG10,
+		.fmt_type = FMT_BAYER,
+		.bpp = { 10 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_SGBRG10,
+		.fmt_type = FMT_BAYER,
+		.bpp = { 10 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_SBGGR10,
+		.fmt_type = FMT_BAYER,
+		.bpp = { 10 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_Y10,
+		.fmt_type = FMT_BAYER,
+		.bpp = { 10 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_SRGGB12,
+		.fmt_type = FMT_BAYER,
+		.bpp = { 12 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_SGRBG12,
+		.fmt_type = FMT_BAYER,
+		.bpp = { 12 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_SGBRG12,
+		.fmt_type = FMT_BAYER,
+		.bpp = { 12 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_SBGGR12,
+		.fmt_type = FMT_BAYER,
+		.bpp = { 12 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_Y12,
+		.fmt_type = FMT_BAYER,
+		.bpp = { 12 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_YUYV,
+		.fmt_type = FMT_YUV,
+		.bpp = { 16 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_YVYU,
+		.fmt_type = FMT_YUV,
+		.bpp = { 16 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_UYVY,
+		.fmt_type = FMT_YUV,
+		.bpp = { 16 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_VYUY,
+		.fmt_type = FMT_YUV,
+		.bpp = { 16 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4l2_PIX_FMT_EBD8,
+		.fmt_type = FMT_EBD,
+		.bpp = { 8 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4l2_PIX_FMT_SPD16,
+		.fmt_type = FMT_SPD,
+		.bpp = { 16 },
+		.mplanes = 1,
+	}
+};
+
+static struct stream_config rkisp2_dmatx0_stream_config = {
+	.fmts = dmatx_fmts,
+	.fmt_size = ARRAY_SIZE(dmatx_fmts),
+	.frame_end_id = MI_RAW0_WR_FRAME,
+	.mi = {
+		.y_size_init = MI_RAW0_WR_SIZE,
+		.y_base_ad_init = MI_RAW0_WR_BASE,
+		.y_base_ad_shd = MI_RAW0_WR_BASE_SHD,
+		.length = MI_RAW0_WR_LENGTH,
+	},
+	.dma = {
+		.ctrl = CSI2RX_RAW0_WR_CTRL,
+		.pic_size = CSI2RX_RAW0_WR_PIC_SIZE,
+		.pic_offs = CSI2RX_RAW0_WR_PIC_OFF,
+	},
+};
+
+static struct stream_config rkisp2_dmatx1_stream_config = {
+	.fmts = dmatx_fmts,
+	.fmt_size = ARRAY_SIZE(dmatx_fmts),
+	.frame_end_id = MI_RAW1_WR_FRAME,
+	.mi = {
+		.y_size_init = MI_RAW1_WR_SIZE,
+		.y_base_ad_init = MI_RAW1_WR_BASE,
+		.y_base_ad_shd = MI_RAW1_WR_BASE_SHD,
+		.length = MI_RAW1_WR_LENGTH,
+	},
+	.dma = {
+		.ctrl = CSI2RX_RAW1_WR_CTRL,
+		.pic_size = CSI2RX_RAW1_WR_PIC_SIZE,
+		.pic_offs = CSI2RX_RAW1_WR_PIC_OFF,
+	},
+};
+
+static struct stream_config rkisp2_dmatx3_stream_config = {
+	.fmts = dmatx_fmts,
+	.fmt_size = ARRAY_SIZE(dmatx_fmts),
+	.frame_end_id = MI_RAW3_WR_FRAME,
+	.mi = {
+		.y_size_init = MI_RAW3_WR_SIZE,
+		.y_base_ad_init = MI_RAW3_WR_BASE,
+		.y_base_ad_shd = MI_RAW3_WR_BASE_SHD,
+		.length = MI_RAW3_WR_LENGTH,
+	},
+	.dma = {
+		.ctrl = CSI2RX_RAW3_WR_CTRL,
+		.pic_size = CSI2RX_RAW3_WR_PIC_SIZE,
+		.pic_offs = CSI2RX_RAW3_WR_PIC_OFF,
+	},
+};
+
 static bool is_rdbk_stream(struct rkisp_stream *stream)
 {
 	struct rkisp_device *dev = stream->ispdev;
diff --git a/drivers/media/platform/rockchip/isp/capture_v2x.h b/drivers/media/platform/rockchip/isp/capture_v2x.h
index 8a2365809012..3dd401b66a4a 100644
--- a/drivers/media/platform/rockchip/isp/capture_v2x.h
+++ b/drivers/media/platform/rockchip/isp/capture_v2x.h
@@ -4,11 +4,6 @@
 #ifndef _RKISP_CAPTURE_V2X_H
 #define _RKISP_CAPTURE_V2X_H
 
-extern struct stream_config rkisp2_dmatx0_stream_config;
-extern struct stream_config rkisp2_dmatx1_stream_config;
-extern struct stream_config rkisp2_dmatx2_stream_config;
-extern struct stream_config rkisp2_dmatx3_stream_config;
-
 struct rkisp_stream;
 
 struct rkisp_dummy_buffer *hdr_dqbuf(struct list_head *q);
@@ -19,19 +14,33 @@ void hdr_stop_dmatx(struct rkisp_device *dev);
 void hdr_destroy_buf(struct rkisp_device *dev);
 void rkisp_config_dmatx_valid_buf(struct rkisp_device *dev);
 
+#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V20)
 int rkisp_register_stream_v20(struct rkisp_device *dev);
 void rkisp_unregister_stream_v20(struct rkisp_device *dev);
 void rkisp_mi_v20_isr(u32 mis_val, struct rkisp_device *dev);
 void rkisp_mipi_v20_isr(u32 phy, u32 packet, u32 overflow, u32 state, struct rkisp_device *dev);
 
-int rkisp_register_stream_v21(struct rkisp_device *dev);
-void rkisp_unregister_stream_v21(struct rkisp_device *dev);
-void rkisp_mi_v21_isr(u32 mis_val, struct rkisp_device *dev);
-void rkisp_mipi_v21_isr(u32 phy, u32 packet, u32 overflow, u32 state, struct rkisp_device *dev);
-
 void rkisp_spbuf_queue(struct rkisp_stream *stream, struct rkisp_buffer *sp_buf);
 int rkisp_start_spstream(struct rkisp_stream *stream);
 void rkisp_stop_spstream(struct rkisp_stream *stream);
 void rkisp_update_spstream_buf(struct rkisp_stream *stream);
+#else
+static inline int rkisp_register_stream_v20(struct rkisp_device *dev) { return 0; }
+static inline void rkisp_unregister_stream_v20(struct rkisp_device *dev) {}
+static inline void rkisp_mi_v20_isr(u32 mis_val, struct rkisp_device *dev) {}
+static inline void rkisp_mipi_v20_isr(u32 phy, u32 packet, u32 overflow, u32 state, struct rkisp_device *dev) {}
+#endif
+
+#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V21)
+int rkisp_register_stream_v21(struct rkisp_device *dev);
+void rkisp_unregister_stream_v21(struct rkisp_device *dev);
+void rkisp_mi_v21_isr(u32 mis_val, struct rkisp_device *dev);
+void rkisp_mipi_v21_isr(u32 phy, u32 packet, u32 overflow, u32 state, struct rkisp_device *dev);
+#else
+static inline int rkisp_register_stream_v21(struct rkisp_device *dev) { return 0; }
+static inline void rkisp_unregister_stream_v21(struct rkisp_device *dev) {}
+static inline void rkisp_mi_v21_isr(u32 mis_val, struct rkisp_device *dev) {}
+static inline void rkisp_mipi_v21_isr(u32 phy, u32 packet, u32 overflow, u32 state, struct rkisp_device *dev) {}
+#endif
 
 #endif
diff --git a/drivers/media/platform/rockchip/isp/isp_ispp.h b/drivers/media/platform/rockchip/isp/isp_ispp.h
index a8804a8c4f4c..120fda108b1a 100644
--- a/drivers/media/platform/rockchip/isp/isp_ispp.h
+++ b/drivers/media/platform/rockchip/isp/isp_ispp.h
@@ -121,7 +121,7 @@ struct rkisp_ispp_buf {
 
 int __init rkispp_hw_drv_init(void);
 
-#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP)
+#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V20)
 void rkisp_get_bridge_sd(struct platform_device *dev,
 			 struct v4l2_subdev **sd);
 #else
diff --git a/drivers/media/platform/rockchip/isp/isp_mipi_luma.h b/drivers/media/platform/rockchip/isp/isp_mipi_luma.h
index 811299953ac8..537a9d6a0796 100644
--- a/drivers/media/platform/rockchip/isp/isp_mipi_luma.h
+++ b/drivers/media/platform/rockchip/isp/isp_mipi_luma.h
@@ -58,6 +58,7 @@ struct rkisp_luma_vdev {
 	struct rkisp_luma_readout_work work;
 };
 
+#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V20)
 void rkisp_luma_isr(struct rkisp_luma_vdev *luma_vdev, u32 isp_stat);
 
 int rkisp_register_luma_vdev(struct rkisp_luma_vdev *luma_vdev,
@@ -65,5 +66,14 @@ int rkisp_register_luma_vdev(struct rkisp_luma_vdev *luma_vdev,
 			     struct rkisp_device *dev);
 
 void rkisp_unregister_luma_vdev(struct rkisp_luma_vdev *luma_vdev);
+#else
+static inline void rkisp_unregister_luma_vdev(struct rkisp_luma_vdev *luma_vdev) {}
+static inline int rkisp_register_luma_vdev(struct rkisp_luma_vdev *luma_vdev,
+					   struct v4l2_device *v4l2_dev,
+					   struct rkisp_device *dev)
+{
+	return 0;
+}
+#endif
 
 #endif /* _RKISP_ISP_LUMA_H */
diff --git a/drivers/media/platform/rockchip/isp/isp_params_v1x.h b/drivers/media/platform/rockchip/isp/isp_params_v1x.h
index 8e4073b16ba3..571d8ee399b6 100644
--- a/drivers/media/platform/rockchip/isp/isp_params_v1x.h
+++ b/drivers/media/platform/rockchip/isp/isp_params_v1x.h
@@ -76,7 +76,12 @@ struct rkisp_isp_params_v1x_config {
 	const int hst_weight_grids_size;
 };
 
+#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V1X)
 int rkisp_init_params_vdev_v1x(struct rkisp_isp_params_vdev *params_vdev);
 void rkisp_uninit_params_vdev_v1x(struct rkisp_isp_params_vdev *params_vdev);
+#else
+static inline int rkisp_init_params_vdev_v1x(struct rkisp_isp_params_vdev *params_vdev) { return 0; }
+static inline void rkisp_uninit_params_vdev_v1x(struct rkisp_isp_params_vdev *params_vdev) {}
+#endif
 
 #endif /* _RKISP_ISP_PARAM_V1X_H */
diff --git a/drivers/media/platform/rockchip/isp/isp_params_v21.h b/drivers/media/platform/rockchip/isp/isp_params_v21.h
index b1be3bb06207..35c214c6740e 100644
--- a/drivers/media/platform/rockchip/isp/isp_params_v21.h
+++ b/drivers/media/platform/rockchip/isp/isp_params_v21.h
@@ -326,7 +326,12 @@ struct rkisp_isp_params_val_v21 {
 	u8 mge_en;
 };
 
+#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V21)
 int rkisp_init_params_vdev_v21(struct rkisp_isp_params_vdev *params_vdev);
 void rkisp_uninit_params_vdev_v21(struct rkisp_isp_params_vdev *params_vdev);
+#else
+static inline int rkisp_init_params_vdev_v21(struct rkisp_isp_params_vdev *params_vdev) { return 0; }
+static inline void rkisp_uninit_params_vdev_v21(struct rkisp_isp_params_vdev *params_vdev) {}
+#endif
 
 #endif /* _RKISP_ISP_PARAM_V21_H */
diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.h b/drivers/media/platform/rockchip/isp/isp_params_v2x.h
index d34aceee3f83..a7416f991fad 100644
--- a/drivers/media/platform/rockchip/isp/isp_params_v2x.h
+++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.h
@@ -343,7 +343,12 @@ struct rkisp_isp_params_val_v2x {
 	bool delay_en_ldch;
 };
 
+#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V20)
 int rkisp_init_params_vdev_v2x(struct rkisp_isp_params_vdev *params_vdev);
 void rkisp_uninit_params_vdev_v2x(struct rkisp_isp_params_vdev *params_vdev);
+#else
+static inline int rkisp_init_params_vdev_v2x(struct rkisp_isp_params_vdev *params_vdev) { return 0; }
+static inline void rkisp_uninit_params_vdev_v2x(struct rkisp_isp_params_vdev *params_vdev) {}
+#endif
 
 #endif /* _RKISP_ISP_PARAM_V2X_H */
diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v1x.h b/drivers/media/platform/rockchip/isp/isp_stats_v1x.h
index 6bdb9db97689..8f1853d4b01d 100644
--- a/drivers/media/platform/rockchip/isp/isp_stats_v1x.h
+++ b/drivers/media/platform/rockchip/isp/isp_stats_v1x.h
@@ -31,7 +31,12 @@ struct rkisp_stats_v1x_config {
 	const int hist_bin_n_max;
 };
 
+#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V1X)
 void rkisp_init_stats_vdev_v1x(struct rkisp_isp_stats_vdev *stats_vdev);
 void rkisp_uninit_stats_vdev_v1x(struct rkisp_isp_stats_vdev *stats_vdev);
+#else
+static inline void rkisp_init_stats_vdev_v1x(struct rkisp_isp_stats_vdev *stats_vdev) {}
+static inline void rkisp_uninit_stats_vdev_v1x(struct rkisp_isp_stats_vdev *stats_vdev) {}
+#endif
 
 #endif /* _RKISP_ISP_STATS_V1X_H */
diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v21.h b/drivers/media/platform/rockchip/isp/isp_stats_v21.h
index da9acd99234a..c1dba6c65933 100644
--- a/drivers/media/platform/rockchip/isp/isp_stats_v21.h
+++ b/drivers/media/platform/rockchip/isp/isp_stats_v21.h
@@ -39,8 +39,14 @@ struct rkisp_stats_v21_ops {
 			      struct rkisp_isp21_stat_buffer *pbuf);
 };
 
+#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V21)
 void rkisp_stats_first_ddr_config_v21(struct rkisp_isp_stats_vdev *stats_vdev);
 void rkisp_init_stats_vdev_v21(struct rkisp_isp_stats_vdev *stats_vdev);
 void rkisp_uninit_stats_vdev_v21(struct rkisp_isp_stats_vdev *stats_vdev);
+#else
+static inline void rkisp_stats_first_ddr_config_v21(struct rkisp_isp_stats_vdev *stats_vdev) {}
+static inline void rkisp_init_stats_vdev_v21(struct rkisp_isp_stats_vdev *stats_vdev) {}
+static inline void rkisp_uninit_stats_vdev_v21(struct rkisp_isp_stats_vdev *stats_vdev) {}
+#endif
 
 #endif /* _RKISP_ISP_STATS_V21_H */
diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v2x.h b/drivers/media/platform/rockchip/isp/isp_stats_v2x.h
index 9d04fbcb823a..5c943d87ca2a 100644
--- a/drivers/media/platform/rockchip/isp/isp_stats_v2x.h
+++ b/drivers/media/platform/rockchip/isp/isp_stats_v2x.h
@@ -57,8 +57,14 @@ struct rkisp_stats_v2x_ops {
 			       struct rkisp_isp2x_stat_buffer *pbuf);
 };
 
+#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V20)
 void rkisp_stats_first_ddr_config_v2x(struct rkisp_isp_stats_vdev *stats_vdev);
 void rkisp_init_stats_vdev_v2x(struct rkisp_isp_stats_vdev *stats_vdev);
 void rkisp_uninit_stats_vdev_v2x(struct rkisp_isp_stats_vdev *stats_vdev);
+#else
+static inline void rkisp_stats_first_ddr_config_v2x(struct rkisp_isp_stats_vdev *stats_vdev) {}
+static inline void rkisp_init_stats_vdev_v2x(struct rkisp_isp_stats_vdev *stats_vdev) {}
+static inline void rkisp_uninit_stats_vdev_v2x(struct rkisp_isp_stats_vdev *stats_vdev) {}
+#endif
 
 #endif /* _RKISP_ISP_STATS_V2X_H */

commit acfebbb68f6934c7fe4694f2d2fdf057393921ce
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Sat Sep 4 14:37:31 2021 +0800

    media: rockchip: isp: selfpath bytesperline 16 align
    
    Change-Id: I39b36e7e3a8c483f5c77ddbea0f6bebb4e1a0b0a
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/capture.c b/drivers/media/platform/rockchip/isp/capture.c
index 8ace78bb0bbc..760552ed69d7 100644
--- a/drivers/media/platform/rockchip/isp/capture.c
+++ b/drivers/media/platform/rockchip/isp/capture.c
@@ -629,6 +629,9 @@ static int rkisp_set_fmt(struct rkisp_stream *stream,
 			bytesperline = ALIGN(width * fmt->bpp[i] / 8, 256);
 		else
 			bytesperline = width * DIV_ROUND_UP(fmt->bpp[i], 8);
+		/* 128bit AXI, 16byte align for bytesperline */
+		if (dev->isp_ver >= ISP_V20 && stream->id == RKISP_STREAM_SP)
+			bytesperline = ALIGN(bytesperline, 16);
 		/* stride is only available for sp stream and y plane */
 		if (stream->id != RKISP_STREAM_SP || i != 0 ||
 		    plane_fmt->bytesperline < bytesperline)

commit 39f12dae1f6f7ee7a552b2746e95072f30d8152a
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Wed Aug 18 19:27:06 2021 +0800

    drm/rockchip: vop2: Remove prepare_fb/cleanup_fb callback
    
    According to commit 9bde4e671f2b1 ("drm/rockchip: vop: fix iommu crash
    with async atomic")
    These two callback were added to avoid iommu crash on async
    commit caused by drm_atomic_clean_old_fb after drm_atomic_async_commit.
    
    drm_atomic_clean_old_fb was removed after commit
    e00fb8564ee9 ("drm: Stop updating plane->crtc/fb/old_fb on atomic drivers")
    
    So we can remove them to make life  simpler.
    
    Change-Id: Iea1f2dbadd9bcfad5b8447831c0d31068d4fa97b
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index e62d21e2c4ca..df7a037b21de 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -2731,22 +2731,6 @@ static void vop2_crtc_atomic_disable(struct drm_crtc *crtc,
 	}
 }
 
-static int vop2_plane_prepare_fb(struct drm_plane *plane,
-				 struct drm_plane_state *new_state)
-{
-	if (plane->state->fb)
-		drm_framebuffer_get(plane->state->fb);
-
-	return 0;
-}
-
-static void vop2_plane_cleanup_fb(struct drm_plane *plane,
-				  struct drm_plane_state *old_state)
-{
-	if (old_state->fb)
-		drm_framebuffer_put(old_state->fb);
-}
-
 static int vop2_plane_atomic_check(struct drm_plane *plane, struct drm_plane_state *state)
 {
 	struct vop2_plane_state *vpstate = to_vop2_plane_state(state);
@@ -3246,8 +3230,6 @@ static void vop2_plane_atomic_update(struct drm_plane *plane, struct drm_plane_s
 }
 
 static const struct drm_plane_helper_funcs vop2_plane_helper_funcs = {
-	.prepare_fb = vop2_plane_prepare_fb,
-	.cleanup_fb = vop2_plane_cleanup_fb,
 	.atomic_check = vop2_plane_atomic_check,
 	.atomic_update = vop2_plane_atomic_update,
 	.atomic_disable = vop2_plane_atomic_disable,

commit bcd4aed392af63aefb8a8005810e0dc54e7fd1c2
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Thu Sep 2 11:31:20 2021 +0800

    drm/rockchip: vop2: Use macro for window phys_id
    
    Change-Id: I91ff9d169f5713e38c994f56980dfcf0cba0fe40
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
index 20d58d386504..2a3a101bec70 100644
--- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
+++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
@@ -7,6 +7,7 @@
 #include <drm/drmP.h>
 #include <linux/kernel.h>
 #include <linux/component.h>
+#include <dt-bindings/display/rockchip_vop.h>
 
 #include "rockchip_drm_vop.h"
 #include "rockchip_vop_reg.h"
@@ -1006,7 +1007,7 @@ static const struct vop2_win_regs rk3568_esmart_win_data = {
 static const struct vop2_win_data rk3568_vop_win_data[] = {
 	{
 	  .name = "Smart0-win0",
-	  .phys_id = 4,
+	  .phys_id = ROCKCHIP_VOP2_SMART0,
 	  .base = 0x400,
 	  .formats = formats_win_lite,
 	  .nformats = ARRAY_SIZE(formats_win_lite),
@@ -1029,7 +1030,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
 
 	{
 	  .name = "Smart1-win0",
-	  .phys_id = 5,
+	  .phys_id = ROCKCHIP_VOP2_SMART1,
 	  .formats = formats_win_lite,
 	  .nformats = ARRAY_SIZE(formats_win_lite),
 	  .format_modifiers = format_modifiers,
@@ -1052,7 +1053,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
 
 	{
 	  .name = "Esmart1-win0",
-	  .phys_id = 3,
+	  .phys_id = ROCKCHIP_VOP2_ESMART1,
 	  .formats = formats_win_full_10bit_yuyv,
 	  .nformats = ARRAY_SIZE(formats_win_full_10bit_yuyv),
 	  .format_modifiers = format_modifiers,
@@ -1075,7 +1076,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
 
 	{
 	  .name = "Esmart0-win0",
-	  .phys_id = 2,
+	  .phys_id = ROCKCHIP_VOP2_ESMART0,
 	  .formats = formats_win_full_10bit_yuyv,
 	  .nformats = ARRAY_SIZE(formats_win_full_10bit_yuyv),
 	  .format_modifiers = format_modifiers,
@@ -1098,7 +1099,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
 
 	{
 	  .name = "Cluster0-win0",
-	  .phys_id = 0,
+	  .phys_id = ROCKCHIP_VOP2_CLUSTER0,
 	  .base = 0x00,
 	  .formats = formats_win_full_10bit,
 	  .nformats = ARRAY_SIZE(formats_win_full_10bit),
@@ -1120,7 +1121,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
 
 	{
 	  .name = "Cluster0-win1",
-	  .phys_id = 0,
+	  .phys_id = ROCKCHIP_VOP2_CLUSTER0,
 	  .base = 0x80,
 	  .layer_sel_id = -1,
 	  .formats = formats_win_full_10bit,
@@ -1140,7 +1141,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
 
 	{
 	  .name = "Cluster1-win0",
-	  .phys_id = 1,
+	  .phys_id = ROCKCHIP_VOP2_CLUSTER1,
 	  .base = 0x00,
 	  .formats = formats_win_full_10bit,
 	  .nformats = ARRAY_SIZE(formats_win_full_10bit),
@@ -1162,7 +1163,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
 
 	{
 	  .name = "Cluster1-win1",
-	  .phys_id = 1,
+	  .phys_id = ROCKCHIP_VOP2_CLUSTER1,
 	  .layer_sel_id = -1,
 	  .formats = formats_win_full_10bit,
 	  .nformats = ARRAY_SIZE(formats_win_full_10bit),

commit 55462060b2328c359ebaa86e1420f450634ef6f6
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Thu Sep 2 09:33:15 2021 +0800

    drm/rockchip: vop2: No need to check active vp in layer_map_initial
    
    We assign window between vp by plane_mask now, no
    need to check which vp is activated from register.
    
    Change-Id: I89d22f253dcd26898dc79304d51b8a8d9e802bb2
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index bcb5354a11d4..e62d21e2c4ca 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -2527,28 +2527,12 @@ static void vop2_layer_map_initial(struct vop2 *vop2, uint32_t current_vp_id)
 	uint32_t win_map, vp_id;
 	uint16_t port_mux_cfg = 0;
 	uint16_t port_mux;
-	uint32_t active_vp_mask = 0;
-	uint32_t standby;
 	uint32_t shift;
 	int i, j;
 
 	layer_map = vop2_readl(vop2, layer->regs->layer_sel.offset);
 	win_map = vop2_readl(vop2, vp->regs->port_mux.offset);
 
-	active_vp_mask |= BIT(current_vp_id);
-	/*
-	 * lookup if there are some vps activated
-	 * by bootloader(et: show boot logo)
-	 */
-	for (i = 0; i < vop2->data->nr_vps; i++) {
-		vp = &vop2->vps[i];
-		standby = vop2_readl(vop2, vp->regs->standby.offset);
-		shift = vp->regs->standby.shift;
-		standby = (standby >> shift) & 0x1;
-		if (!standby)
-			active_vp_mask |= BIT(i);
-	}
-
 	for (i = 0; i < vop2->data->nr_vps; i++) {
 		vp = &vop2->vps[i];
 		vp->win_mask = 0;

commit 9d60286b725b24fb5a55560710e8804a1f2883df
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Fri Sep 3 10:05:05 2021 +0800

    mmc: sdhci-of-dwcmshc: Remove HS200 and HS400 at low speed for rockchip
    
    Rockchip platforms don't support HS200 or HS400 at low speed, so
    we must limit it.
    
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: I40eb9f117fd83789b6ab7a16d44049e16786698b

diff --git a/drivers/mmc/host/sdhci-of-dwcmshc.c b/drivers/mmc/host/sdhci-of-dwcmshc.c
index aa18b6605ba2..184e6e005c8e 100644
--- a/drivers/mmc/host/sdhci-of-dwcmshc.c
+++ b/drivers/mmc/host/sdhci-of-dwcmshc.c
@@ -298,6 +298,16 @@ static int rockchip_pltf_init(struct sdhci_host *host, struct dwcmshc_priv *priv
 	/* Reset previous settings */
 	sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_TXCLK);
 	sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_STRBIN);
+
+	/*
+	 * Don't support highspeed bus mode with low clk speed as we
+	 * cannot use DLL for this condition.
+	 */
+	if (host->mmc->f_max <= 52000000) {
+		host->mmc->caps2 &= ~(MMC_CAP2_HS200 | MMC_CAP2_HS400);
+		host->mmc->caps &= ~(MMC_CAP_3_3V_DDR | MMC_CAP_1_8V_DDR);
+	}
+
 	return 0;
 }
 
@@ -367,18 +377,18 @@ static int dwcmshc_probe(struct platform_device *pdev)
 	host->mmc_host_ops.hs400_enhanced_strobe =
 		dwcmshc_hs400_enhanced_strobe;
 
-	if (pltfm_data == &sdhci_dwcmshc_rk_pdata) {
-		err = rockchip_pltf_init(host, priv);
-		if (err)
-			goto err_clk;
-	}
-
 	host->mmc_host_ops.request = dwcmshc_request;
 
 	err = sdhci_add_host(host);
 	if (err)
 		goto err_clk;
 
+	if (pltfm_data == &sdhci_dwcmshc_rk_pdata) {
+		err = rockchip_pltf_init(host, priv);
+		if (err)
+			goto err_clk;
+	}
+
 	pm_runtime_get_noresume(&pdev->dev);
 	pm_runtime_set_active(&pdev->dev);
 	pm_runtime_enable(&pdev->dev);

commit a6850bb536d105de60f844ef72079b44bca37b51
Merge: b0c5b896a63e b172b44fcb17
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Fri Sep 3 10:07:26 2021 +0200

    Merge 4.19.206 into android-4.19-stable
    
    Changes in 4.19.206
            net: qrtr: fix another OOB Read in qrtr_endpoint_post
            bpf: Do not use ax register in interpreter on div/mod
            bpf: Fix 32 bit src register truncation on div/mod
            bpf: Fix truncation handling for mod32 dst reg wrt zero
            ARC: Fix CONFIG_STACKDEPOT
            netfilter: conntrack: collect all entries in one cycle
            once: Fix panic when module unload
            can: usb: esd_usb2: esd_usb2_rx_event(): fix the interchange of the CAN RX and TX error counters
            Revert "USB: serial: ch341: fix character loss at high transfer rates"
            USB: serial: option: add new VID/PID to support Fibocom FG150
            usb: dwc3: gadget: Fix dwc3_calc_trbs_left()
            usb: dwc3: gadget: Stop EP0 transfers during pullup disable
            IB/hfi1: Fix possible null-pointer dereference in _extend_sdma_tx_descs()
            e1000e: Fix the max snoop/no-snoop latency for 10M
            ip_gre: add validation for csum_start
            xgene-v2: Fix a resource leak in the error handling path of 'xge_probe()'
            net: marvell: fix MVNETA_TX_IN_PRGRS bit number
            net: hns3: fix get wrong pfc_en when query PFC configuration
            usb: gadget: u_audio: fix race condition on endpoint stop
            opp: remove WARN when no valid OPPs remain
            virtio: Improve vq->broken access to avoid any compiler optimization
            virtio_pci: Support surprise removal of virtio pci device
            vringh: Use wiov->used to check for read/write desc order
            qed: qed ll2 race condition fixes
            qed: Fix null-pointer dereference in qed_rdma_create_qp()
            drm: Copy drm_wait_vblank to user before returning
            drm/nouveau/disp: power down unused DP links during init
            net/rds: dma_map_sg is entitled to merge entries
            vt_kdsetmode: extend console locking
            fbmem: add margin check to fb_check_caps()
            KVM: x86/mmu: Treat NX as used (not reserved) for all !TDP shadow MMUs
            Revert "floppy: reintroduce O_NDELAY fix"
            net: don't unconditionally copy_from_user a struct ifreq for socket ioctls
            Linux 4.19.206
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I04e05680c5e311bc4cd79daae49d654b66f774a0

commit b172b44fcb1771e083aad806fa96f3f60e2ddfac
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Fri Sep 3 09:58:03 2021 +0200

    Linux 4.19.206
    
    Link: https://lore.kernel.org/r/20210901122250.752620302@linuxfoundation.org
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Hulk Robot <hulkrobot@huawei.com>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index abc35829f47b..3a3eea3ab10a 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 205
+SUBLEVEL = 206
 EXTRAVERSION =
 NAME = "People's Front"
 

commit e9544276b3e60800a150f27fe5d031d133c77eea
Author: Peter Collingbourne <pcc@google.com>
Date:   Thu Aug 26 12:46:01 2021 -0700

    net: don't unconditionally copy_from_user a struct ifreq for socket ioctls
    
    commit d0efb16294d145d157432feda83877ae9d7cdf37 upstream.
    
    A common implementation of isatty(3) involves calling a ioctl passing
    a dummy struct argument and checking whether the syscall failed --
    bionic and glibc use TCGETS (passing a struct termios), and musl uses
    TIOCGWINSZ (passing a struct winsize). If the FD is a socket, we will
    copy sizeof(struct ifreq) bytes of data from the argument and return
    -EFAULT if that fails. The result is that the isatty implementations
    may return a non-POSIX-compliant value in errno in the case where part
    of the dummy struct argument is inaccessible, as both struct termios
    and struct winsize are smaller than struct ifreq (at least on arm64).
    
    Although there is usually enough stack space following the argument
    on the stack that this did not present a practical problem up to now,
    with MTE stack instrumentation it's more likely for the copy to fail,
    as the memory following the struct may have a different tag.
    
    Fix the problem by adding an early check for whether the ioctl is a
    valid socket ioctl, and return -ENOTTY if it isn't.
    
    Fixes: 44c02a2c3dc5 ("dev_ioctl(): move copyin/copyout to callers")
    Link: https://linux-review.googlesource.com/id/I869da6cf6daabc3e4b7b82ac979683ba05e27d4d
    Signed-off-by: Peter Collingbourne <pcc@google.com>
    Cc: <stable@vger.kernel.org> # 4.19
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index ca5f053c6b66..fbd689c15974 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -3594,6 +3594,10 @@ int netdev_rx_handler_register(struct net_device *dev,
 void netdev_rx_handler_unregister(struct net_device *dev);
 
 bool dev_valid_name(const char *name);
+static inline bool is_socket_ioctl_cmd(unsigned int cmd)
+{
+	return _IOC_TYPE(cmd) == SOCK_IOC_TYPE;
+}
 int dev_ioctl(struct net *net, unsigned int cmd, struct ifreq *ifr,
 		bool *need_copyout);
 int dev_ifconf(struct net *net, struct ifconf *, int);
diff --git a/net/socket.c b/net/socket.c
index f14bca00ff01..e5cc9f2b981e 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1030,7 +1030,7 @@ static long sock_do_ioctl(struct net *net, struct socket *sock,
 		rtnl_unlock();
 		if (!err && copy_to_user(argp, &ifc, sizeof(struct ifconf)))
 			err = -EFAULT;
-	} else {
+	} else if (is_socket_ioctl_cmd(cmd)) {
 		struct ifreq ifr;
 		bool need_copyout;
 		if (copy_from_user(&ifr, argp, sizeof(struct ifreq)))
@@ -1039,6 +1039,8 @@ static long sock_do_ioctl(struct net *net, struct socket *sock,
 		if (!err && need_copyout)
 			if (copy_to_user(argp, &ifr, sizeof(struct ifreq)))
 				return -EFAULT;
+	} else {
+		err = -ENOTTY;
 	}
 	return err;
 }
@@ -3064,6 +3066,8 @@ static int compat_ifr_data_ioctl(struct net *net, unsigned int cmd,
 	struct ifreq ifreq;
 	u32 data32;
 
+	if (!is_socket_ioctl_cmd(cmd))
+		return -ENOTTY;
 	if (copy_from_user(ifreq.ifr_name, u_ifreq32->ifr_name, IFNAMSIZ))
 		return -EFAULT;
 	if (get_user(data32, &u_ifreq32->ifr_data))

commit 61b224e29ec37cbf39111270f2c7143bfe222b20
Author: Denis Efremov <efremov@linux.com>
Date:   Sat Aug 7 10:37:02 2021 +0300

    Revert "floppy: reintroduce O_NDELAY fix"
    
    commit c7e9d0020361f4308a70cdfd6d5335e273eb8717 upstream.
    
    The patch breaks userspace implementations (e.g. fdutils) and introduces
    regressions in behaviour. Previously, it was possible to O_NDELAY open a
    floppy device with no media inserted or with write protected media without
    an error. Some userspace tools use this particular behavior for probing.
    
    It's not the first time when we revert this patch. Previous revert is in
    commit f2791e7eadf4 (Revert "floppy: refactor open() flags handling").
    
    This reverts commit 8a0c014cd20516ade9654fc13b51345ec58e7be8.
    
    Link: https://lore.kernel.org/linux-block/de10cb47-34d1-5a88-7751-225ca380f735@compro.net/
    Reported-by: Mark Hounschell <markh@compro.net>
    Cc: Jiri Kosina <jkosina@suse.cz>
    Cc: Wim Osterholt <wim@djo.tudelft.nl>
    Cc: Kurt Garloff <kurt@garloff.de>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Denis Efremov <efremov@linux.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
index 04383f14c74a..8f444b375761 100644
--- a/drivers/block/floppy.c
+++ b/drivers/block/floppy.c
@@ -4074,22 +4074,21 @@ static int floppy_open(struct block_device *bdev, fmode_t mode)
 	if (UFDCS->rawcmd == 1)
 		UFDCS->rawcmd = 2;
 
-	if (mode & (FMODE_READ|FMODE_WRITE)) {
-		UDRS->last_checked = 0;
-		clear_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags);
-		check_disk_change(bdev);
-		if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags))
-			goto out;
-		if (test_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags))
+	if (!(mode & FMODE_NDELAY)) {
+		if (mode & (FMODE_READ|FMODE_WRITE)) {
+			UDRS->last_checked = 0;
+			clear_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags);
+			check_disk_change(bdev);
+			if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags))
+				goto out;
+			if (test_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags))
+				goto out;
+		}
+		res = -EROFS;
+		if ((mode & FMODE_WRITE) &&
+		    !test_bit(FD_DISK_WRITABLE_BIT, &UDRS->flags))
 			goto out;
 	}
-
-	res = -EROFS;
-
-	if ((mode & FMODE_WRITE) &&
-			!test_bit(FD_DISK_WRITABLE_BIT, &UDRS->flags))
-		goto out;
-
 	mutex_unlock(&open_lock);
 	mutex_unlock(&floppy_mutex);
 	return 0;

commit 3db3ec8f3b414fa76d3a9ae864781ebbb1709a36
Author: Sean Christopherson <seanjc@google.com>
Date:   Tue Jun 22 10:56:47 2021 -0700

    KVM: x86/mmu: Treat NX as used (not reserved) for all !TDP shadow MMUs
    
    commit 112022bdb5bc372e00e6e43cb88ee38ea67b97bd upstream
    
    Mark NX as being used for all non-nested shadow MMUs, as KVM will set the
    NX bit for huge SPTEs if the iTLB mutli-hit mitigation is enabled.
    Checking the mitigation itself is not sufficient as it can be toggled on
    at any time and KVM doesn't reset MMU contexts when that happens.  KVM
    could reset the contexts, but that would require purging all SPTEs in all
    MMUs, for no real benefit.  And, KVM already forces EFER.NX=1 when TDP is
    disabled (for WP=0, SMEP=1, NX=0), so technically NX is never reserved
    for shadow MMUs.
    
    Fixes: b8e8c8303ff2 ("kvm: mmu: ITLB_MULTIHIT mitigation")
    Cc: stable@vger.kernel.org
    Signed-off-by: Sean Christopherson <seanjc@google.com>
    Message-Id: <20210622175739.3610207-3-seanjc@google.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    [sudip: use old path and adjust context]
    Signed-off-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index 762baba4ecd5..0cb82172c06c 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -4557,7 +4557,16 @@ static void reset_rsvds_bits_mask_ept(struct kvm_vcpu *vcpu,
 void
 reset_shadow_zero_bits_mask(struct kvm_vcpu *vcpu, struct kvm_mmu *context)
 {
-	bool uses_nx = context->nx || context->base_role.smep_andnot_wp;
+	/*
+	 * KVM uses NX when TDP is disabled to handle a variety of scenarios,
+	 * notably for huge SPTEs if iTLB multi-hit mitigation is enabled and
+	 * to generate correct permissions for CR0.WP=0/CR4.SMEP=1/EFER.NX=0.
+	 * The iTLB multi-hit workaround can be toggled at any time, so assume
+	 * NX can be used by any non-nested shadow MMU to avoid having to reset
+	 * MMU contexts.  Note, KVM forces EFER.NX=1 when TDP is disabled.
+	 */
+	bool uses_nx = context->nx || !tdp_enabled ||
+		context->base_role.smep_andnot_wp;
 	struct rsvd_bits_validate *shadow_zero_check;
 	int i;
 

commit 6be10fb6c143608a7c7ab3901a096e272233bf64
Author: George Kennedy <george.kennedy@oracle.com>
Date:   Tue Jul 7 15:26:03 2020 -0400

    fbmem: add margin check to fb_check_caps()
    
    commit a49145acfb975d921464b84fe00279f99827d816 upstream.
    
    A fb_ioctl() FBIOPUT_VSCREENINFO call with invalid xres setting
    or yres setting in struct fb_var_screeninfo will result in a
    KASAN: vmalloc-out-of-bounds failure in bitfill_aligned() as
    the margins are being cleared. The margins are cleared in
    chunks and if the xres setting or yres setting is a value of
    zero upto the chunk size, the failure will occur.
    
    Add a margin check to validate xres and yres settings.
    
    Signed-off-by: George Kennedy <george.kennedy@oracle.com>
    Reported-by: syzbot+e5fd3e65515b48c02a30@syzkaller.appspotmail.com
    Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com>
    Cc: Dhaval Giani <dhaval.giani@oracle.com>
    Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/1594149963-13801-1-git-send-email-george.kennedy@oracle.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c
index 84845275dbef..de04c097d67c 100644
--- a/drivers/video/fbdev/core/fbmem.c
+++ b/drivers/video/fbdev/core/fbmem.c
@@ -991,6 +991,10 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
 			goto done;
 		}
 
+		/* bitfill_aligned() assumes that it's at least 8x8 */
+		if (var->xres < 8 || var->yres < 8)
+			return -EINVAL;
+
 		ret = info->fbops->fb_check_var(var, info);
 
 		if (ret)

commit 0776c1a20babb4ad0b7ce7f2f4e0806a97663187
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date:   Mon Aug 30 08:55:18 2021 -0700

    vt_kdsetmode: extend console locking
    
    commit 2287a51ba822384834dafc1c798453375d1107c7 upstream.
    
    As per the long-suffering comment.
    
    Reported-by: Minh Yuan <yuanmingbuaa@gmail.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Jiri Slaby <jirislaby@kernel.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/tty/vt/vt_ioctl.c b/drivers/tty/vt/vt_ioctl.c
index ce6c7dd7bc12..076b8a3f8e7a 100644
--- a/drivers/tty/vt/vt_ioctl.c
+++ b/drivers/tty/vt/vt_ioctl.c
@@ -484,16 +484,19 @@ int vt_ioctl(struct tty_struct *tty,
 			ret = -EINVAL;
 			goto out;
 		}
-		/* FIXME: this needs the console lock extending */
-		if (vc->vc_mode == (unsigned char) arg)
+		console_lock();
+		if (vc->vc_mode == (unsigned char) arg) {
+			console_unlock();
 			break;
+		}
 		vc->vc_mode = (unsigned char) arg;
-		if (console != fg_console)
+		if (console != fg_console) {
+			console_unlock();
 			break;
+		}
 		/*
 		 * explicitly blank/unblank the screen if switching modes
 		 */
-		console_lock();
 		if (arg == KD_TEXT)
 			do_unblank_screen(1);
 		else

commit b36556947ad5a184e8567fec6b7df3a6ae4206fc
Author: Gerd Rausch <gerd.rausch@oracle.com>
Date:   Tue Aug 17 10:04:37 2021 -0700

    net/rds: dma_map_sg is entitled to merge entries
    
    [ Upstream commit fb4b1373dcab086d0619c29310f0466a0b2ceb8a ]
    
    Function "dma_map_sg" is entitled to merge adjacent entries
    and return a value smaller than what was passed as "nents".
    
    Subsequently "ib_map_mr_sg" needs to work with this value ("sg_dma_len")
    rather than the original "nents" parameter ("sg_len").
    
    This old RDS bug was exposed and reliably causes kernel panics
    (using RDMA operations "rds-stress -D") on x86_64 starting with:
    commit c588072bba6b ("iommu/vt-d: Convert intel iommu driver to the iommu ops")
    
    Simply put: Linux 5.11 and later.
    
    Signed-off-by: Gerd Rausch <gerd.rausch@oracle.com>
    Acked-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
    Link: https://lore.kernel.org/r/60efc69f-1f35-529d-a7ef-da0549cad143@oracle.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/rds/ib_frmr.c b/net/rds/ib_frmr.c
index 6431a023ac89..46988c009a3e 100644
--- a/net/rds/ib_frmr.c
+++ b/net/rds/ib_frmr.c
@@ -111,9 +111,9 @@ static int rds_ib_post_reg_frmr(struct rds_ib_mr *ibmr)
 		cpu_relax();
 	}
 
-	ret = ib_map_mr_sg_zbva(frmr->mr, ibmr->sg, ibmr->sg_len,
+	ret = ib_map_mr_sg_zbva(frmr->mr, ibmr->sg, ibmr->sg_dma_len,
 				&off, PAGE_SIZE);
-	if (unlikely(ret != ibmr->sg_len))
+	if (unlikely(ret != ibmr->sg_dma_len))
 		return ret < 0 ? ret : -EINVAL;
 
 	/* Perform a WR for the fast_reg_mr. Each individual page

commit d386a4b54607cf6f76e23815c2c9a3abc1d66882
Author: Ben Skeggs <bskeggs@redhat.com>
Date:   Mon Aug 9 16:40:48 2021 +1000

    drm/nouveau/disp: power down unused DP links during init
    
    [ Upstream commit 6eaa1f3c59a707332e921e32782ffcad49915c5e ]
    
    When booted with multiple displays attached, the EFI GOP driver on (at
    least) Ampere, can leave DP links powered up that aren't being used to
    display anything.  This confuses our tracking of SOR routing, with the
    likely result being a failed modeset and display engine hang.
    
    Fix this by (ab?)using the DisableLT IED script to power-down the link,
    restoring HW to a state the driver expects.
    
    Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
    Reviewed-by: Lyude Paul <lyude@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c
index 818d21bd28d3..1d2837c5a8f2 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c
@@ -419,7 +419,7 @@ nvkm_dp_train(struct nvkm_dp *dp, u32 dataKBps)
 	return ret;
 }
 
-static void
+void
 nvkm_dp_disable(struct nvkm_outp *outp, struct nvkm_ior *ior)
 {
 	struct nvkm_dp *dp = nvkm_dp(outp);
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.h b/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.h
index 495f665a0ee6..12d6ff4cfa95 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.h
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.h
@@ -32,6 +32,7 @@ struct nvkm_dp {
 
 int nvkm_dp_new(struct nvkm_disp *, int index, struct dcb_output *,
 		struct nvkm_outp **);
+void nvkm_dp_disable(struct nvkm_outp *, struct nvkm_ior *);
 
 /* DPCD Receiver Capabilities */
 #define DPCD_RC00_DPCD_REV                                              0x00000
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/outp.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/outp.c
index c62030c96fba..4b1c72fd8f03 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/outp.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/outp.c
@@ -22,6 +22,7 @@
  * Authors: Ben Skeggs
  */
 #include "outp.h"
+#include "dp.h"
 #include "ior.h"
 
 #include <subdev/bios.h>
@@ -216,6 +217,14 @@ nvkm_outp_init_route(struct nvkm_outp *outp)
 	if (!ior->arm.head || ior->arm.proto != proto) {
 		OUTP_DBG(outp, "no heads (%x %d %d)", ior->arm.head,
 			 ior->arm.proto, proto);
+
+		/* The EFI GOP driver on Ampere can leave unused DP links routed,
+		 * which we don't expect.  The DisableLT IED script *should* get
+		 * us back to where we need to be.
+		 */
+		if (ior->func->route.get && !ior->arm.head && outp->info.type == DCB_OUTPUT_DP)
+			nvkm_dp_disable(outp, ior);
+
 		return;
 	}
 

commit a78f93b9bba115e9c2a33529e28d4e12251e01e8
Author: Mark Yacoub <markyacoub@google.com>
Date:   Thu Aug 12 15:49:17 2021 -0400

    drm: Copy drm_wait_vblank to user before returning
    
    [ Upstream commit fa0b1ef5f7a694f48e00804a391245f3471aa155 ]
    
    [Why]
    Userspace should get back a copy of drm_wait_vblank that's been modified
    even when drm_wait_vblank_ioctl returns a failure.
    
    Rationale:
    drm_wait_vblank_ioctl modifies the request and expects the user to read
    it back. When the type is RELATIVE, it modifies it to ABSOLUTE and updates
    the sequence to become current_vblank_count + sequence (which was
    RELATIVE), but now it became ABSOLUTE.
    drmWaitVBlank (in libdrm) expects this to be the case as it modifies
    the request to be Absolute so it expects the sequence to would have been
    updated.
    
    The change is in compat_drm_wait_vblank, which is called by
    drm_compat_ioctl. This change of copying the data back regardless of the
    return number makes it en par with drm_ioctl, which always copies the
    data before returning.
    
    [How]
    Return from the function after everything has been copied to user.
    
    Fixes IGT:kms_flip::modeset-vs-vblank-race-interruptible
    Tested on ChromeOS Trogdor(msm)
    
    Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
    Signed-off-by: Mark Yacoub <markyacoub@chromium.org>
    Signed-off-by: Sean Paul <seanpaul@chromium.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20210812194917.1703356-1-markyacoub@chromium.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/drm_ioc32.c b/drivers/gpu/drm/drm_ioc32.c
index ab8847c7dd96..87e13bcd7a67 100644
--- a/drivers/gpu/drm/drm_ioc32.c
+++ b/drivers/gpu/drm/drm_ioc32.c
@@ -855,8 +855,6 @@ static int compat_drm_wait_vblank(struct file *file, unsigned int cmd,
 	req.request.sequence = req32.request.sequence;
 	req.request.signal = req32.request.signal;
 	err = drm_ioctl_kernel(file, drm_wait_vblank_ioctl, &req, DRM_UNLOCKED);
-	if (err)
-		return err;
 
 	req32.reply.type = req.reply.type;
 	req32.reply.sequence = req.reply.sequence;
@@ -865,7 +863,7 @@ static int compat_drm_wait_vblank(struct file *file, unsigned int cmd,
 	if (copy_to_user(argp, &req32, sizeof(req32)))
 		return -EFAULT;
 
-	return 0;
+	return err;
 }
 
 #if defined(CONFIG_X86)

commit e7f5aefd15d9d020065f6f076e2b6e054198317a
Author: Shai Malin <smalin@marvell.com>
Date:   Sun Aug 15 14:06:39 2021 +0300

    qed: Fix null-pointer dereference in qed_rdma_create_qp()
    
    [ Upstream commit d33d19d313d3466abdf8b0428be7837aff767802 ]
    
    Fix a possible null-pointer dereference in qed_rdma_create_qp().
    
    Changes from V2:
    - Revert checkpatch fixes.
    
    Reported-by: TOTE Robot <oslab@tsinghua.edu.cn>
    Signed-off-by: Ariel Elior <aelior@marvell.com>
    Signed-off-by: Shai Malin <smalin@marvell.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/qlogic/qed/qed_rdma.c b/drivers/net/ethernet/qlogic/qed/qed_rdma.c
index 909422d93903..3392982ff374 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_rdma.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_rdma.c
@@ -1244,8 +1244,7 @@ qed_rdma_create_qp(void *rdma_cxt,
 
 	if (!rdma_cxt || !in_params || !out_params ||
 	    !p_hwfn->p_rdma_info->active) {
-		DP_ERR(p_hwfn->cdev,
-		       "qed roce create qp failed due to NULL entry (rdma_cxt=%p, in=%p, out=%p, roce_info=?\n",
+		pr_err("qed roce create qp failed due to NULL entry (rdma_cxt=%p, in=%p, out=%p, roce_info=?\n",
 		       rdma_cxt, in_params, out_params);
 		return NULL;
 	}

commit 49d8b24e84a9b72c9a989c6d335f1bc1721b76c7
Author: Shai Malin <smalin@marvell.com>
Date:   Sun Aug 15 14:05:08 2021 +0300

    qed: qed ll2 race condition fixes
    
    [ Upstream commit 37110237f31105d679fc0aa7b11cdec867750ea7 ]
    
    Avoiding qed ll2 race condition and NULL pointer dereference as part
    of the remove and recovery flows.
    
    Changes form V1:
    - Change (!p_rx->set_prod_addr).
    - qed_ll2.c checkpatch fixes.
    
    Change from V2:
    - Revert "qed_ll2.c checkpatch fixes".
    
    Signed-off-by: Ariel Elior <aelior@marvell.com>
    Signed-off-by: Shai Malin <smalin@marvell.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/qlogic/qed/qed_ll2.c b/drivers/net/ethernet/qlogic/qed/qed_ll2.c
index 2847509a183d..cb3569ac85f7 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_ll2.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_ll2.c
@@ -354,6 +354,9 @@ static int qed_ll2_txq_completion(struct qed_hwfn *p_hwfn, void *p_cookie)
 	unsigned long flags;
 	int rc = -EINVAL;
 
+	if (!p_ll2_conn)
+		return rc;
+
 	spin_lock_irqsave(&p_tx->lock, flags);
 	if (p_tx->b_completing_packet) {
 		rc = -EBUSY;
@@ -527,7 +530,16 @@ static int qed_ll2_rxq_completion(struct qed_hwfn *p_hwfn, void *cookie)
 	unsigned long flags = 0;
 	int rc = 0;
 
+	if (!p_ll2_conn)
+		return rc;
+
 	spin_lock_irqsave(&p_rx->lock, flags);
+
+	if (!QED_LL2_RX_REGISTERED(p_ll2_conn)) {
+		spin_unlock_irqrestore(&p_rx->lock, flags);
+		return 0;
+	}
+
 	cq_new_idx = le16_to_cpu(*p_rx->p_fw_cons);
 	cq_old_idx = qed_chain_get_cons_idx(&p_rx->rcq_chain);
 
@@ -848,6 +860,9 @@ static int qed_ll2_lb_rxq_completion(struct qed_hwfn *p_hwfn, void *p_cookie)
 	struct qed_ll2_info *p_ll2_conn = (struct qed_ll2_info *)p_cookie;
 	int rc;
 
+	if (!p_ll2_conn)
+		return 0;
+
 	if (!QED_LL2_RX_REGISTERED(p_ll2_conn))
 		return 0;
 
@@ -871,6 +886,9 @@ static int qed_ll2_lb_txq_completion(struct qed_hwfn *p_hwfn, void *p_cookie)
 	u16 new_idx = 0, num_bds = 0;
 	int rc;
 
+	if (!p_ll2_conn)
+		return 0;
+
 	if (!QED_LL2_TX_REGISTERED(p_ll2_conn))
 		return 0;
 
@@ -1628,6 +1646,8 @@ int qed_ll2_post_rx_buffer(void *cxt,
 	if (!p_ll2_conn)
 		return -EINVAL;
 	p_rx = &p_ll2_conn->rx_queue;
+	if (!p_rx->set_prod_addr)
+		return -EIO;
 
 	spin_lock_irqsave(&p_rx->lock, flags);
 	if (!list_empty(&p_rx->free_descq))

commit 691add905f329ffdf5940d7e1b9e00c8bc89a8b8
Author: Neeraj Upadhyay <neeraju@codeaurora.org>
Date:   Fri Jun 25 08:55:02 2021 +0530

    vringh: Use wiov->used to check for read/write desc order
    
    [ Upstream commit e74cfa91f42c50f7f649b0eca46aa049754ccdbd ]
    
    As __vringh_iov() traverses a descriptor chain, it populates
    each descriptor entry into either read or write vring iov
    and increments that iov's ->used member. So, as we iterate
    over a descriptor chain, at any point, (riov/wriov)->used
    value gives the number of descriptor enteries available,
    which are to be read or written by the device. As all read
    iovs must precede the write iovs, wiov->used should be zero
    when we are traversing a read descriptor. Current code checks
    for wiov->i, to figure out whether any previous entry in the
    current descriptor chain was a write descriptor. However,
    iov->i is only incremented, when these vring iovs are consumed,
    at a later point, and remain 0 in __vringh_iov(). So, correct
    the check for read and write descriptor order, to use
    wiov->used.
    
    Acked-by: Jason Wang <jasowang@redhat.com>
    Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
    Signed-off-by: Neeraj Upadhyay <neeraju@codeaurora.org>
    Link: https://lore.kernel.org/r/1624591502-4827-1-git-send-email-neeraju@codeaurora.org
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/vhost/vringh.c b/drivers/vhost/vringh.c
index 59c61744dcc1..97aa9b87e572 100644
--- a/drivers/vhost/vringh.c
+++ b/drivers/vhost/vringh.c
@@ -330,7 +330,7 @@ __vringh_iov(struct vringh *vrh, u16 i,
 			iov = wiov;
 		else {
 			iov = riov;
-			if (unlikely(wiov && wiov->i)) {
+			if (unlikely(wiov && wiov->used)) {
 				vringh_bad("Readable desc %p after writable",
 					   &descs[i]);
 				err = -EINVAL;

commit 68208dc42dd906fe626224000d85e9513dbe5199
Author: Parav Pandit <parav@nvidia.com>
Date:   Wed Jul 21 17:26:48 2021 +0300

    virtio_pci: Support surprise removal of virtio pci device
    
    [ Upstream commit 43bb40c5b92659966bdf4bfe584fde0a3575a049 ]
    
    When a virtio pci device undergo surprise removal (aka async removal in
    PCIe spec), mark the device as broken so that any upper layer drivers can
    abort any outstanding operation.
    
    When a virtio net pci device undergo surprise removal which is used by a
    NetworkManager, a below call trace was observed.
    
    kernel:watchdog: BUG: soft lockup - CPU#1 stuck for 26s! [kworker/1:1:27059]
    watchdog: BUG: soft lockup - CPU#1 stuck for 52s! [kworker/1:1:27059]
    CPU: 1 PID: 27059 Comm: kworker/1:1 Tainted: G S      W I  L    5.13.0-hotplug+ #8
    Hardware name: Dell Inc. PowerEdge R640/0H28RR, BIOS 2.9.4 11/06/2020
    Workqueue: events linkwatch_event
    RIP: 0010:virtnet_send_command+0xfc/0x150 [virtio_net]
    Call Trace:
     virtnet_set_rx_mode+0xcf/0x2a7 [virtio_net]
     ? __hw_addr_create_ex+0x85/0xc0
     __dev_mc_add+0x72/0x80
     igmp6_group_added+0xa7/0xd0
     ipv6_mc_up+0x3c/0x60
     ipv6_find_idev+0x36/0x80
     addrconf_add_dev+0x1e/0xa0
     addrconf_dev_config+0x71/0x130
     addrconf_notify+0x1f5/0xb40
     ? rtnl_is_locked+0x11/0x20
     ? __switch_to_asm+0x42/0x70
     ? finish_task_switch+0xaf/0x2c0
     ? raw_notifier_call_chain+0x3e/0x50
     raw_notifier_call_chain+0x3e/0x50
     netdev_state_change+0x67/0x90
     linkwatch_do_dev+0x3c/0x50
     __linkwatch_run_queue+0xd2/0x220
     linkwatch_event+0x21/0x30
     process_one_work+0x1c8/0x370
     worker_thread+0x30/0x380
     ? process_one_work+0x370/0x370
     kthread+0x118/0x140
     ? set_kthread_struct+0x40/0x40
     ret_from_fork+0x1f/0x30
    
    Hence, add the ability to abort the command on surprise removal
    which prevents infinite loop and system lockup.
    
    Signed-off-by: Parav Pandit <parav@nvidia.com>
    Link: https://lore.kernel.org/r/20210721142648.1525924-5-parav@nvidia.com
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c
index 45b04bc91f24..b7cc63f556ee 100644
--- a/drivers/virtio/virtio_pci_common.c
+++ b/drivers/virtio/virtio_pci_common.c
@@ -579,6 +579,13 @@ static void virtio_pci_remove(struct pci_dev *pci_dev)
 	struct virtio_pci_device *vp_dev = pci_get_drvdata(pci_dev);
 	struct device *dev = get_device(&vp_dev->vdev.dev);
 
+	/*
+	 * Device is marked broken on surprise removal so that virtio upper
+	 * layers can abort any ongoing operation.
+	 */
+	if (!pci_device_is_present(pci_dev))
+		virtio_break_device(&vp_dev->vdev);
+
 	pci_disable_sriov(pci_dev);
 
 	unregister_virtio_device(&vp_dev->vdev);

commit ae5e7146b541116efe5a2afd079f9df529a95cd2
Author: Parav Pandit <parav@nvidia.com>
Date:   Wed Jul 21 17:26:45 2021 +0300

    virtio: Improve vq->broken access to avoid any compiler optimization
    
    [ Upstream commit 60f0779862e4ab943810187752c462e85f5fa371 ]
    
    Currently vq->broken field is read by virtqueue_is_broken() in busy
    loop in one context by virtnet_send_command().
    
    vq->broken is set to true in other process context by
    virtio_break_device(). Reader and writer are accessing it without any
    synchronization. This may lead to a compiler optimization which may
    result to optimize reading vq->broken only once.
    
    Hence, force reading vq->broken on each invocation of
    virtqueue_is_broken() and also force writing it so that such
    update is visible to the readers.
    
    It is a theoretical fix that isn't yet encountered in the field.
    
    Signed-off-by: Parav Pandit <parav@nvidia.com>
    Link: https://lore.kernel.org/r/20210721142648.1525924-2-parav@nvidia.com
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index df7980aef927..0cc0cfd3a3cb 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -1197,7 +1197,7 @@ bool virtqueue_is_broken(struct virtqueue *_vq)
 {
 	struct vring_virtqueue *vq = to_vvq(_vq);
 
-	return vq->broken;
+	return READ_ONCE(vq->broken);
 }
 EXPORT_SYMBOL_GPL(virtqueue_is_broken);
 
@@ -1211,7 +1211,9 @@ void virtio_break_device(struct virtio_device *dev)
 
 	list_for_each_entry(_vq, &dev->vqs, list) {
 		struct vring_virtqueue *vq = to_vvq(_vq);
-		vq->broken = true;
+
+		/* Pairs with READ_ONCE() in virtqueue_is_broken(). */
+		WRITE_ONCE(vq->broken, true);
 	}
 }
 EXPORT_SYMBOL_GPL(virtio_break_device);

commit 5da47bf1612fbf2ce350b38fdf13ce49e8805ecc
Author: Micha? Miros?aw <mirq-linux@rere.qmqm.pl>
Date:   Mon Jul 26 10:30:56 2021 +0200

    opp: remove WARN when no valid OPPs remain
    
    [ Upstream commit 335ffab3ef864539e814b9a2903b0ae420c1c067 ]
    
    This WARN can be triggered per-core and the stack trace is not useful.
    Replace it with plain dev_err(). Fix a comment while at it.
    
    Signed-off-by: Micha? Miros?aw <mirq-linux@rere.qmqm.pl>
    Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/opp/of.c b/drivers/opp/of.c
index d64a13d7881b..a53123356697 100644
--- a/drivers/opp/of.c
+++ b/drivers/opp/of.c
@@ -423,8 +423,9 @@ static int _of_add_opp_table_v2(struct device *dev, struct device_node *opp_np)
 		}
 	}
 
-	/* There should be one of more OPP defined */
-	if (WARN_ON(!count)) {
+	/* There should be one or more OPPs defined */
+	if (!count) {
+		dev_err(dev, "%s: no supported OPPs", __func__);
 		ret = -ENOENT;
 		goto put_opp_table;
 	}

commit 6a600523e323e58dadc6322e21270d4ba8757685
Author: Jerome Brunet <jbrunet@baylibre.com>
Date:   Fri Aug 27 11:29:27 2021 +0200

    usb: gadget: u_audio: fix race condition on endpoint stop
    
    [ Upstream commit 068fdad20454f815e61e6f6eb9f051a8b3120e88 ]
    
    If the endpoint completion callback is call right after the ep_enabled flag
    is cleared and before usb_ep_dequeue() is call, we could do a double free
    on the request and the associated buffer.
    
    Fix this by clearing ep_enabled after all the endpoint requests have been
    dequeued.
    
    Fixes: 7de8681be2cd ("usb: gadget: u_audio: Free requests only after callback")
    Cc: stable <stable@vger.kernel.org>
    Reported-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
    Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
    Link: https://lore.kernel.org/r/20210827092927.366482-1-jbrunet@baylibre.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/function/u_audio.c b/drivers/usb/gadget/function/u_audio.c
index 0cb0c638fd13..168303f21bf4 100644
--- a/drivers/usb/gadget/function/u_audio.c
+++ b/drivers/usb/gadget/function/u_audio.c
@@ -349,8 +349,6 @@ static inline void free_ep(struct uac_rtd_params *prm, struct usb_ep *ep)
 	if (!prm->ep_enabled)
 		return;
 
-	prm->ep_enabled = false;
-
 	audio_dev = uac->audio_dev;
 	params = &audio_dev->params;
 
@@ -368,11 +366,12 @@ static inline void free_ep(struct uac_rtd_params *prm, struct usb_ep *ep)
 		}
 	}
 
+	prm->ep_enabled = false;
+
 	if (usb_ep_disable(ep))
 		dev_err(uac->card->dev, "%s:%d Error!\n", __func__, __LINE__);
 }
 
-
 int u_audio_start_capture(struct g_audio *audio_dev)
 {
 	struct snd_uac_chip *uac = audio_dev->uac;

commit 3c2795525eb2540f10c0425329ef54b8c746170c
Author: Guangbin Huang <huangguangbin2@huawei.com>
Date:   Thu Aug 26 19:22:01 2021 +0800

    net: hns3: fix get wrong pfc_en when query PFC configuration
    
    [ Upstream commit 8c1671e0d13d4a0ba4fb3a0da932bf3736d7ff73 ]
    
    Currently, when query PFC configuration by dcbtool, driver will return
    PFC enable status based on TC. As all priorities are mapped to TC0 by
    default, if TC0 is enabled, then all priorities mapped to TC0 will be
    shown as enabled status when query PFC setting, even though some
    priorities have never been set.
    
    for example:
    $ dcb pfc show dev eth0
    pfc-cap 4 macsec-bypass off delay 0
    prio-pfc 0:off 1:off 2:off 3:off 4:off 5:off 6:off 7:off
    $ dcb pfc set dev eth0 prio-pfc 0:on 1:on 2:on 3:on
    $ dcb pfc show dev eth0
    pfc-cap 4 macsec-bypass off delay 0
    prio-pfc 0:on 1:on 2:on 3:on 4:on 5:on 6:on 7:on
    
    To fix this problem, just returns user's PFC config parameter saved in
    driver.
    
    Fixes: cacde272dd00 ("net: hns3: Add hclge_dcb module for the support of DCB feature")
    Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c
index a75d7c826fc2..dd935cd1fb44 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c
@@ -204,21 +204,12 @@ static int hclge_ieee_getpfc(struct hnae3_handle *h, struct ieee_pfc *pfc)
 	u64 requests[HNAE3_MAX_TC], indications[HNAE3_MAX_TC];
 	struct hclge_vport *vport = hclge_get_vport(h);
 	struct hclge_dev *hdev = vport->back;
-	u8 i, j, pfc_map, *prio_tc;
 	int ret;
+	u8 i;
 
 	memset(pfc, 0, sizeof(*pfc));
 	pfc->pfc_cap = hdev->pfc_max;
-	prio_tc = hdev->tm_info.prio_tc;
-	pfc_map = hdev->tm_info.hw_pfc_map;
-
-	/* Pfc setting is based on TC */
-	for (i = 0; i < hdev->tm_info.num_tc; i++) {
-		for (j = 0; j < HNAE3_MAX_USER_PRIO; j++) {
-			if ((prio_tc[j] == i) && (pfc_map & BIT(i)))
-				pfc->pfc_en |= BIT(j);
-		}
-	}
+	pfc->pfc_en = hdev->tm_info.pfc_en;
 
 	ret = hclge_pfc_tx_stats_get(hdev, requests);
 	if (ret)

commit 3acf84b8daaf1a1225b8fd43687ca1e6675c647d
Author: Maxim Kiselev <bigunclemax@gmail.com>
Date:   Fri Aug 20 18:39:51 2021 +0300

    net: marvell: fix MVNETA_TX_IN_PRGRS bit number
    
    [ Upstream commit 359f4cdd7d78fdf8c098713b05fee950a730f131 ]
    
    According to Armada XP datasheet bit at 0 position is corresponding for
    TxInProg indication.
    
    Fixes: c5aff18204da ("net: mvneta: driver for Marvell Armada 370/XP network unit")
    Signed-off-by: Maxim Kiselev <bigunclemax@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
index fda5dd8c71eb..382d010e1294 100644
--- a/drivers/net/ethernet/marvell/mvneta.c
+++ b/drivers/net/ethernet/marvell/mvneta.c
@@ -100,7 +100,7 @@
 #define      MVNETA_DESC_SWAP                    BIT(6)
 #define      MVNETA_TX_BRST_SZ_MASK(burst)       ((burst) << 22)
 #define MVNETA_PORT_STATUS                       0x2444
-#define      MVNETA_TX_IN_PRGRS                  BIT(1)
+#define      MVNETA_TX_IN_PRGRS                  BIT(0)
 #define      MVNETA_TX_FIFO_EMPTY                BIT(8)
 #define MVNETA_RX_MIN_FRAME_SIZE                 0x247c
 #define MVNETA_SERDES_CFG			 0x24A0

commit 24d34768233fba8613064c93234774c5c97e0f50
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Sat Aug 21 09:35:23 2021 +0200

    xgene-v2: Fix a resource leak in the error handling path of 'xge_probe()'
    
    [ Upstream commit 5ed74b03eb4d08f5dd281dcb5f1c9bb92b363a8d ]
    
    A successful 'xge_mdio_config()' call should be balanced by a corresponding
    'xge_mdio_remove()' call in the error handling path of the probe, as
    already done in the remove function.
    
    Update the error handling path accordingly.
    
    Fixes: ea8ab16ab225 ("drivers: net: xgene-v2: Add MDIO support")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/apm/xgene-v2/main.c b/drivers/net/ethernet/apm/xgene-v2/main.c
index 0f2ad50f3bd7..7f37e7cb687e 100644
--- a/drivers/net/ethernet/apm/xgene-v2/main.c
+++ b/drivers/net/ethernet/apm/xgene-v2/main.c
@@ -691,11 +691,13 @@ static int xge_probe(struct platform_device *pdev)
 	ret = register_netdev(ndev);
 	if (ret) {
 		netdev_err(ndev, "Failed to register netdev\n");
-		goto err;
+		goto err_mdio_remove;
 	}
 
 	return 0;
 
+err_mdio_remove:
+	xge_mdio_remove(ndev);
 err:
 	free_netdev(ndev);
 

commit c33471daf2763c5aee2b7926202c74b75c365119
Author: Shreyansh Chouhan <chouhan.shreyansh630@gmail.com>
Date:   Sat Aug 21 12:44:24 2021 +0530

    ip_gre: add validation for csum_start
    
    [ Upstream commit 1d011c4803c72f3907eccfc1ec63caefb852fcbf ]
    
    Validate csum_start in gre_handle_offloads before we call _gre_xmit so
    that we do not crash later when the csum_start value is used in the
    lco_csum function call.
    
    This patch deals with ipv4 code.
    
    Fixes: c54419321455 ("GRE: Refactor GRE tunneling code.")
    Reported-by: syzbot+ff8e1b9f2f36481e2efc@syzkaller.appspotmail.com
    Signed-off-by: Shreyansh Chouhan <chouhan.shreyansh630@gmail.com>
    Reviewed-by: Willem de Bruijn <willemb@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
index de6f89511a21..a8a37d112820 100644
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -449,6 +449,8 @@ static void __gre_xmit(struct sk_buff *skb, struct net_device *dev,
 
 static int gre_handle_offloads(struct sk_buff *skb, bool csum)
 {
+	if (csum && skb_checksum_start(skb) < skb->data)
+		return -EINVAL;
 	return iptunnel_handle_offloads(skb, csum ? SKB_GSO_GRE_CSUM : SKB_GSO_GRE);
 }
 

commit aa3cb20d13acc8c314249199bb69ce6c69d8c9d0
Author: Sasha Neftin <sasha.neftin@intel.com>
Date:   Sun Jul 4 10:11:41 2021 +0300

    e1000e: Fix the max snoop/no-snoop latency for 10M
    
    [ Upstream commit 44a13a5d99c71bf9e1676d9e51679daf4d7b3d73 ]
    
    We should decode the latency and the max_latency before directly compare.
    The latency should be presented as lat_enc = scale x value:
    lat_enc_d = (lat_enc & 0x0x3ff) x (1U << (5*((max_ltr_enc & 0x1c00)
    >> 10)))
    
    Fixes: cf8fb73c23aa ("e1000e: add support for LTR on I217/I218")
    Suggested-by: Yee Li <seven.yi.lee@gmail.com>
    Signed-off-by: Sasha Neftin <sasha.neftin@intel.com>
    Tested-by: Dvora Fuxbrumer <dvorax.fuxbrumer@linux.intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.c b/drivers/net/ethernet/intel/e1000e/ich8lan.c
index 7998a73b6a0f..fbad77450725 100644
--- a/drivers/net/ethernet/intel/e1000e/ich8lan.c
+++ b/drivers/net/ethernet/intel/e1000e/ich8lan.c
@@ -995,6 +995,8 @@ static s32 e1000_platform_pm_pch_lpt(struct e1000_hw *hw, bool link)
 {
 	u32 reg = link << (E1000_LTRV_REQ_SHIFT + E1000_LTRV_NOSNOOP_SHIFT) |
 	    link << E1000_LTRV_REQ_SHIFT | E1000_LTRV_SEND;
+	u16 max_ltr_enc_d = 0;	/* maximum LTR decoded by platform */
+	u16 lat_enc_d = 0;	/* latency decoded */
 	u16 lat_enc = 0;	/* latency encoded */
 
 	if (link) {
@@ -1048,7 +1050,17 @@ static s32 e1000_platform_pm_pch_lpt(struct e1000_hw *hw, bool link)
 				     E1000_PCI_LTR_CAP_LPT + 2, &max_nosnoop);
 		max_ltr_enc = max_t(u16, max_snoop, max_nosnoop);
 
-		if (lat_enc > max_ltr_enc)
+		lat_enc_d = (lat_enc & E1000_LTRV_VALUE_MASK) *
+			     (1U << (E1000_LTRV_SCALE_FACTOR *
+			     ((lat_enc & E1000_LTRV_SCALE_MASK)
+			     >> E1000_LTRV_SCALE_SHIFT)));
+
+		max_ltr_enc_d = (max_ltr_enc & E1000_LTRV_VALUE_MASK) *
+				 (1U << (E1000_LTRV_SCALE_FACTOR *
+				 ((max_ltr_enc & E1000_LTRV_SCALE_MASK)
+				 >> E1000_LTRV_SCALE_SHIFT)));
+
+		if (lat_enc_d > max_ltr_enc_d)
 			lat_enc = max_ltr_enc;
 	}
 
diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.h b/drivers/net/ethernet/intel/e1000e/ich8lan.h
index 1502895eb45d..e757896287eb 100644
--- a/drivers/net/ethernet/intel/e1000e/ich8lan.h
+++ b/drivers/net/ethernet/intel/e1000e/ich8lan.h
@@ -274,8 +274,11 @@
 
 /* Latency Tolerance Reporting */
 #define E1000_LTRV			0x000F8
+#define E1000_LTRV_VALUE_MASK		0x000003FF
 #define E1000_LTRV_SCALE_MAX		5
 #define E1000_LTRV_SCALE_FACTOR		5
+#define E1000_LTRV_SCALE_SHIFT		10
+#define E1000_LTRV_SCALE_MASK		0x00001C00
 #define E1000_LTRV_REQ_SHIFT		15
 #define E1000_LTRV_NOSNOOP_SHIFT	16
 #define E1000_LTRV_SEND			(1 << 30)

commit c1cec00baa5cd00203094635fdb874426a46b952
Author: Tuo Li <islituo@gmail.com>
Date:   Fri Aug 6 06:30:29 2021 -0700

    IB/hfi1: Fix possible null-pointer dereference in _extend_sdma_tx_descs()
    
    [ Upstream commit cbe71c61992c38f72c2b625b2ef25916b9f0d060 ]
    
    kmalloc_array() is called to allocate memory for tx->descp. If it fails,
    the function __sdma_txclean() is called:
      __sdma_txclean(dd, tx);
    
    However, in the function __sdma_txclean(), tx-descp is dereferenced if
    tx->num_desc is not zero:
      sdma_unmap_desc(dd, &tx->descp[0]);
    
    To fix this possible null-pointer dereference, assign the return value of
    kmalloc_array() to a local variable descp, and then assign it to tx->descp
    if it is not NULL. Otherwise, go to enomem.
    
    Fixes: 7724105686e7 ("IB/hfi1: add driver files")
    Link: https://lore.kernel.org/r/20210806133029.194964-1-islituo@gmail.com
    Reported-by: TOTE Robot <oslab@tsinghua.edu.cn>
    Signed-off-by: Tuo Li <islituo@gmail.com>
    Tested-by: Mike Marciniszyn <mike.marciniszyn@cornelisnetworks.com>
    Acked-by: Mike Marciniszyn <mike.marciniszyn@cornelisnetworks.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/infiniband/hw/hfi1/sdma.c b/drivers/infiniband/hw/hfi1/sdma.c
index 291c12f588b5..38258de75a94 100644
--- a/drivers/infiniband/hw/hfi1/sdma.c
+++ b/drivers/infiniband/hw/hfi1/sdma.c
@@ -3055,6 +3055,7 @@ static void __sdma_process_event(struct sdma_engine *sde,
 static int _extend_sdma_tx_descs(struct hfi1_devdata *dd, struct sdma_txreq *tx)
 {
 	int i;
+	struct sdma_desc *descp;
 
 	/* Handle last descriptor */
 	if (unlikely((tx->num_desc == (MAX_DESC - 1)))) {
@@ -3075,12 +3076,10 @@ static int _extend_sdma_tx_descs(struct hfi1_devdata *dd, struct sdma_txreq *tx)
 	if (unlikely(tx->num_desc == MAX_DESC))
 		goto enomem;
 
-	tx->descp = kmalloc_array(
-			MAX_DESC,
-			sizeof(struct sdma_desc),
-			GFP_ATOMIC);
-	if (!tx->descp)
+	descp = kmalloc_array(MAX_DESC, sizeof(struct sdma_desc), GFP_ATOMIC);
+	if (!descp)
 		goto enomem;
+	tx->descp = descp;
 
 	/* reserve last descriptor for coalescing */
 	tx->desc_limit = MAX_DESC - 1;

commit c9d60dd3c147c49b3d8eba9aa53ac3b6c24bc161
Author: Wesley Cheng <wcheng@codeaurora.org>
Date:   Tue Aug 24 21:28:55 2021 -0700

    usb: dwc3: gadget: Stop EP0 transfers during pullup disable
    
    commit 4a1e25c0a029b97ea4a3d423a6392bfacc3b2e39 upstream.
    
    During a USB cable disconnect, or soft disconnect scenario, a pending
    SETUP transaction may not be completed, leading to the following
    error:
    
        dwc3 a600000.dwc3: timed out waiting for SETUP phase
    
    If this occurs, then the entire pullup disable routine is skipped and
    proper cleanup and halting of the controller does not complete.
    
    Instead of returning an error (which is ignored from the UDC
    perspective), allow the pullup disable routine to continue, which
    will also handle disabling of EP0/1.  This will end any active
    transfers as well.  Ensure to clear any delayed_status also, as the
    timeout could happen within the STATUS stage.
    
    Fixes: bb0147364850 ("usb: dwc3: gadget: don't clear RUN/STOP when it's invalid to do so")
    Cc: <stable@vger.kernel.org>
    Reviewed-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
    Acked-by: Felipe Balbi <balbi@kernel.org>
    Signed-off-by: Wesley Cheng <wcheng@codeaurora.org>
    Link: https://lore.kernel.org/r/20210825042855.7977-1-wcheng@codeaurora.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index e63bff91aba8..d61b7aa5d8e5 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -1805,10 +1805,8 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
 
 		ret = wait_for_completion_timeout(&dwc->ep0_in_setup,
 				msecs_to_jiffies(DWC3_PULL_UP_TIMEOUT));
-		if (ret == 0) {
-			dev_err(dwc->dev, "timed out waiting for SETUP phase\n");
-			return -ETIMEDOUT;
-		}
+		if (ret == 0)
+			dev_warn(dwc->dev, "timed out waiting for SETUP phase\n");
 	}
 
 	spin_lock_irqsave(&dwc->lock, flags);
@@ -1946,6 +1944,7 @@ static int __dwc3_gadget_start(struct dwc3 *dwc)
 	/* begin to receive SETUP packets */
 	dwc->ep0state = EP0_SETUP_PHASE;
 	dwc->link_state = DWC3_LINK_STATE_SS_DIS;
+	dwc->delayed_status = false;
 	dwc3_ep0_out_start(dwc);
 
 	dwc3_gadget_enable_irq(dwc);

commit 8fc75a3c1de74e892526a38477ae1bfd277d4b3d
Author: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Date:   Thu Aug 19 03:17:03 2021 +0200

    usb: dwc3: gadget: Fix dwc3_calc_trbs_left()
    
    commit 51f1954ad853d01ba4dc2b35dee14d8490ee05a1 upstream.
    
    We can't depend on the TRB's HWO bit to determine if the TRB ring is
    "full". A TRB is only available when the driver had processed it, not
    when the controller consumed and relinquished the TRB's ownership to the
    driver. Otherwise, the driver may overwrite unprocessed TRBs. This can
    happen when many transfer events accumulate and the system is slow to
    process them and/or when there are too many small requests.
    
    If a request is in the started_list, that means there is one or more
    unprocessed TRBs remained. Check this instead of the TRB's HWO bit
    whether the TRB ring is full.
    
    Fixes: c4233573f6ee ("usb: dwc3: gadget: prepare TRBs on update transfers too")
    Cc: <stable@vger.kernel.org>
    Acked-by: Felipe Balbi <balbi@kernel.org>
    Signed-off-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
    Link: https://lore.kernel.org/r/e91e975affb0d0d02770686afc3a5b9eb84409f6.1629335416.git.Thinh.Nguyen@synopsys.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index c93bed41d988..e63bff91aba8 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -894,19 +894,19 @@ static struct dwc3_trb *dwc3_ep_prev_trb(struct dwc3_ep *dep, u8 index)
 
 static u32 dwc3_calc_trbs_left(struct dwc3_ep *dep)
 {
-	struct dwc3_trb		*tmp;
 	u8			trbs_left;
 
 	/*
-	 * If enqueue & dequeue are equal than it is either full or empty.
-	 *
-	 * One way to know for sure is if the TRB right before us has HWO bit
-	 * set or not. If it has, then we're definitely full and can't fit any
-	 * more transfers in our ring.
+	 * If the enqueue & dequeue are equal then the TRB ring is either full
+	 * or empty. It's considered full when there are DWC3_TRB_NUM-1 of TRBs
+	 * pending to be processed by the driver.
 	 */
 	if (dep->trb_enqueue == dep->trb_dequeue) {
-		tmp = dwc3_ep_prev_trb(dep, dep->trb_enqueue);
-		if (tmp->ctrl & DWC3_TRB_CTRL_HWO)
+		/*
+		 * If there is any request remained in the started_list at
+		 * this point, that means there is no TRB available.
+		 */
+		if (!list_empty(&dep->started_list))
 			return 0;
 
 		return DWC3_TRB_NUM - 1;

commit af1305414b85b432096c3b6559200c45749cb8fd
Author: Zhengjun Zhang <zhangzhengjun@aicrobo.com>
Date:   Mon Aug 9 21:35:53 2021 +0800

    USB: serial: option: add new VID/PID to support Fibocom FG150
    
    commit 2829a4e3cf3a6ac2fa3cdb681b37574630fb9c1a upstream.
    
    Fibocom FG150 is a 5G module based on Qualcomm SDX55 platform,
    support Sub-6G band.
    
    Here are the outputs of lsusb -v and usb-devices:
    
    > T:  Bus=02 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#=  2 Spd=5000 MxCh= 0
    > D:  Ver= 3.20 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs=  1
    > P:  Vendor=2cb7 ProdID=010b Rev=04.14
    > S:  Manufacturer=Fibocom
    > S:  Product=Fibocom Modem_SN:XXXXXXXX
    > S:  SerialNumber=XXXXXXXX
    > C:  #Ifs= 5 Cfg#= 1 Atr=a0 MxPwr=896mA
    > I:  If#=0x0 Alt= 0 #EPs= 1 Cls=ef(misc ) Sub=04 Prot=01 Driver=rndis_host
    > I:  If#=0x1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=rndis_host
    > I:  If#=0x2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none)
    > I:  If#=0x3 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=(none)
    > I:  If#=0x4 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=42 Prot=01 Driver=(none)
    
    > Bus 002 Device 002: ID 2cb7:010b Fibocom Fibocom Modem_SN:XXXXXXXX
    > Device Descriptor:
    >   bLength                18
    >   bDescriptorType         1
    >   bcdUSB               3.20
    >   bDeviceClass            0
    >   bDeviceSubClass         0
    >   bDeviceProtocol         0
    >   bMaxPacketSize0         9
    >   idVendor           0x2cb7 Fibocom
    >   idProduct          0x010b
    >   bcdDevice            4.14
    >   iManufacturer           1 Fibocom
    >   iProduct                2 Fibocom Modem_SN:XXXXXXXX
    >   iSerial                 3 XXXXXXXX
    >   bNumConfigurations      1
    >   Configuration Descriptor:
    >     bLength                 9
    >     bDescriptorType         2
    >     wTotalLength       0x00e6
    >     bNumInterfaces          5
    >     bConfigurationValue     1
    >     iConfiguration          4 RNDIS_DUN_DIAG_ADB
    >     bmAttributes         0xa0
    >       (Bus Powered)
    >       Remote Wakeup
    >     MaxPower              896mA
    >     Interface Association:
    >       bLength                 8
    >       bDescriptorType        11
    >       bFirstInterface         0
    >       bInterfaceCount         2
    >       bFunctionClass        239 Miscellaneous Device
    >       bFunctionSubClass       4
    >       bFunctionProtocol       1
    >       iFunction               7 RNDIS
    >     Interface Descriptor:
    >       bLength                 9
    >       bDescriptorType         4
    >       bInterfaceNumber        0
    >       bAlternateSetting       0
    >       bNumEndpoints           1
    >       bInterfaceClass       239 Miscellaneous Device
    >       bInterfaceSubClass      4
    >       bInterfaceProtocol      1
    >       iInterface              0
    >       ** UNRECOGNIZED:  05 24 00 10 01
    >       ** UNRECOGNIZED:  05 24 01 00 01
    >       ** UNRECOGNIZED:  04 24 02 00
    >       ** UNRECOGNIZED:  05 24 06 00 01
    >       Endpoint Descriptor:
    >         bLength                 7
    >         bDescriptorType         5
    >         bEndpointAddress     0x81  EP 1 IN
    >         bmAttributes            3
    >           Transfer Type            Interrupt
    >           Synch Type               None
    >           Usage Type               Data
    >         wMaxPacketSize     0x0008  1x 8 bytes
    >         bInterval               9
    >         bMaxBurst               0
    >     Interface Descriptor:
    >       bLength                 9
    >       bDescriptorType         4
    >       bInterfaceNumber        1
    >       bAlternateSetting       0
    >       bNumEndpoints           2
    >       bInterfaceClass        10 CDC Data
    >       bInterfaceSubClass      0
    >       bInterfaceProtocol      0
    >       iInterface              0
    >       Endpoint Descriptor:
    >         bLength                 7
    >         bDescriptorType         5
    >         bEndpointAddress     0x8e  EP 14 IN
    >         bmAttributes            2
    >           Transfer Type            Bulk
    >           Synch Type               None
    >           Usage Type               Data
    >         wMaxPacketSize     0x0400  1x 1024 bytes
    >         bInterval               0
    >         bMaxBurst               6
    >       Endpoint Descriptor:
    >         bLength                 7
    >         bDescriptorType         5
    >         bEndpointAddress     0x0f  EP 15 OUT
    >         bmAttributes            2
    >           Transfer Type            Bulk
    >           Synch Type               None
    >           Usage Type               Data
    >         wMaxPacketSize     0x0400  1x 1024 bytes
    >         bInterval               0
    >         bMaxBurst               6
    >     Interface Descriptor:
    >       bLength                 9
    >       bDescriptorType         4
    >       bInterfaceNumber        2
    >       bAlternateSetting       0
    >       bNumEndpoints           3
    >       bInterfaceClass       255 Vendor Specific Class
    >       bInterfaceSubClass      0
    >       bInterfaceProtocol      0
    >       iInterface              0
    >       ** UNRECOGNIZED:  05 24 00 10 01
    >       ** UNRECOGNIZED:  05 24 01 00 00
    >       ** UNRECOGNIZED:  04 24 02 02
    >       ** UNRECOGNIZED:  05 24 06 00 00
    >       Endpoint Descriptor:
    >         bLength                 7
    >         bDescriptorType         5
    >         bEndpointAddress     0x83  EP 3 IN
    >         bmAttributes            3
    >           Transfer Type            Interrupt
    >           Synch Type               None
    >           Usage Type               Data
    >         wMaxPacketSize     0x000a  1x 10 bytes
    >         bInterval               9
    >         bMaxBurst               0
    >       Endpoint Descriptor:
    >         bLength                 7
    >         bDescriptorType         5
    >         bEndpointAddress     0x82  EP 2 IN
    >         bmAttributes            2
    >           Transfer Type            Bulk
    >           Synch Type               None
    >           Usage Type               Data
    >         wMaxPacketSize     0x0400  1x 1024 bytes
    >         bInterval               0
    >         bMaxBurst               0
    >       Endpoint Descriptor:
    >         bLength                 7
    >         bDescriptorType         5
    >         bEndpointAddress     0x01  EP 1 OUT
    >         bmAttributes            2
    >           Transfer Type            Bulk
    >           Synch Type               None
    >           Usage Type               Data
    >         wMaxPacketSize     0x0400  1x 1024 bytes
    >         bInterval               0
    >         bMaxBurst               0
    >     Interface Descriptor:
    >       bLength                 9
    >       bDescriptorType         4
    >       bInterfaceNumber        3
    >       bAlternateSetting       0
    >       bNumEndpoints           2
    >       bInterfaceClass       255 Vendor Specific Class
    >       bInterfaceSubClass    255 Vendor Specific Subclass
    >       bInterfaceProtocol     48
    >       iInterface              0
    >       Endpoint Descriptor:
    >         bLength                 7
    >         bDescriptorType         5
    >         bEndpointAddress     0x84  EP 4 IN
    >         bmAttributes            2
    >           Transfer Type            Bulk
    >           Synch Type               None
    >           Usage Type               Data
    >         wMaxPacketSize     0x0400  1x 1024 bytes
    >         bInterval               0
    >         bMaxBurst               0
    >       Endpoint Descriptor:
    >         bLength                 7
    >         bDescriptorType         5
    >         bEndpointAddress     0x02  EP 2 OUT
    >         bmAttributes            2
    >           Transfer Type            Bulk
    >           Synch Type               None
    >           Usage Type               Data
    >         wMaxPacketSize     0x0400  1x 1024 bytes
    >         bInterval               0
    >         bMaxBurst               0
    >     Interface Descriptor:
    >       bLength                 9
    >       bDescriptorType         4
    >       bInterfaceNumber        4
    >       bAlternateSetting       0
    >       bNumEndpoints           2
    >       bInterfaceClass       255 Vendor Specific Class
    >       bInterfaceSubClass     66
    >       bInterfaceProtocol      1
    >       iInterface              0
    >       Endpoint Descriptor:
    >         bLength                 7
    >         bDescriptorType         5
    >         bEndpointAddress     0x03  EP 3 OUT
    >         bmAttributes            2
    >           Transfer Type            Bulk
    >           Synch Type               None
    >           Usage Type               Data
    >         wMaxPacketSize     0x0400  1x 1024 bytes
    >         bInterval               0
    >         bMaxBurst               0
    >       Endpoint Descriptor:
    >         bLength                 7
    >         bDescriptorType         5
    >         bEndpointAddress     0x85  EP 5 IN
    >         bmAttributes            2
    >           Transfer Type            Bulk
    >           Synch Type               None
    >           Usage Type               Data
    >         wMaxPacketSize     0x0400  1x 1024 bytes
    >         bInterval               0
    >         bMaxBurst               0
    > Binary Object Store Descriptor:
    >   bLength                 5
    >   bDescriptorType        15
    >   wTotalLength       0x0016
    >   bNumDeviceCaps          2
    >   USB 2.0 Extension Device Capability:
    >     bLength                 7
    >     bDescriptorType        16
    >     bDevCapabilityType      2
    >     bmAttributes   0x00000006
    >       BESL Link Power Management (LPM) Supported
    >   SuperSpeed USB Device Capability:
    >     bLength                10
    >     bDescriptorType        16
    >     bDevCapabilityType      3
    >     bmAttributes         0x00
    >     wSpeedsSupported   0x000f
    >       Device can operate at Low Speed (1Mbps)
    >       Device can operate at Full Speed (12Mbps)
    >       Device can operate at High Speed (480Mbps)
    >       Device can operate at SuperSpeed (5Gbps)
    >     bFunctionalitySupport   1
    >       Lowest fully-functional device speed is Full Speed (12Mbps)
    >     bU1DevExitLat           1 micro seconds
    >     bU2DevExitLat         500 micro seconds
    > Device Status:     0x0000
    >   (Bus Powered)
    
    Signed-off-by: Zhengjun Zhang <zhangzhengjun@aicrobo.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index e6103a27e440..d08b799c91fc 100644
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -2074,6 +2074,8 @@ static const struct usb_device_id option_ids[] = {
 	  .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(0x2df3, 0x9d03, 0xff) },			/* LongSung M5710 */
 	{ USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1404, 0xff) },			/* GosunCn GM500 RNDIS */

commit 56c653382239adab6a1b7d4a23ad2e3d5fe2885b
Author: Johan Hovold <johan@kernel.org>
Date:   Tue Aug 24 14:19:26 2021 +0200

    Revert "USB: serial: ch341: fix character loss at high transfer rates"
    
    commit df7b16d1c00ecb3da3a30c999cdb39f273c99a2f upstream.
    
    This reverts commit 3c18e9baee0ef97510dcda78c82285f52626764b.
    
    These devices do not appear to send a zero-length packet when the
    transfer size is a multiple of the bulk-endpoint max-packet size. This
    means that incoming data may not be processed by the driver until a
    short packet is received or the receive buffer is full.
    
    Revert back to using endpoint-sized receive buffers to avoid stalled
    reads.
    
    Reported-by: Paul Grö?el <pb.g@gmx.de>
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=214131
    Fixes: 3c18e9baee0e ("USB: serial: ch341: fix character loss at high transfer rates")
    Cc: stable@vger.kernel.org
    Cc: Willy Tarreau <w@1wt.eu>
    Link: https://lore.kernel.org/r/20210824121926.19311-1-johan@kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c
index e6dce35ca1aa..c87cb25e70ec 100644
--- a/drivers/usb/serial/ch341.c
+++ b/drivers/usb/serial/ch341.c
@@ -625,7 +625,6 @@ static struct usb_serial_driver ch341_device = {
 		.owner	= THIS_MODULE,
 		.name	= "ch341-uart",
 	},
-	.bulk_in_size      = 512,
 	.id_table          = id_table,
 	.num_ports         = 1,
 	.open              = ch341_open,

commit e5cc2285c6e7969d62e2bf1173ee8e1d4854a41b
Author: Stefan Mätje <stefan.maetje@esd.eu>
Date:   Wed Aug 25 23:52:27 2021 +0200

    can: usb: esd_usb2: esd_usb2_rx_event(): fix the interchange of the CAN RX and TX error counters
    
    commit 044012b52029204900af9e4230263418427f4ba4 upstream.
    
    This patch fixes the interchanged fetch of the CAN RX and TX error
    counters from the ESD_EV_CAN_ERROR_EXT message. The RX error counter
    is really in struct rx_msg::data[2] and the TX error counter is in
    struct rx_msg::data[3].
    
    Fixes: 96d8e90382dc ("can: Add driver for esd CAN-USB/2 device")
    Link: https://lore.kernel.org/r/20210825215227.4947-2-stefan.maetje@esd.eu
    Cc: stable@vger.kernel.org
    Signed-off-by: Stefan Mätje <stefan.maetje@esd.eu>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/can/usb/esd_usb2.c b/drivers/net/can/usb/esd_usb2.c
index e95358269525..d4e6b40f0ed4 100644
--- a/drivers/net/can/usb/esd_usb2.c
+++ b/drivers/net/can/usb/esd_usb2.c
@@ -236,8 +236,8 @@ static void esd_usb2_rx_event(struct esd_usb2_net_priv *priv,
 	if (id == ESD_EV_CAN_ERROR_EXT) {
 		u8 state = msg->msg.rx.data[0];
 		u8 ecc = msg->msg.rx.data[1];
-		u8 txerr = msg->msg.rx.data[2];
-		u8 rxerr = msg->msg.rx.data[3];
+		u8 rxerr = msg->msg.rx.data[2];
+		u8 txerr = msg->msg.rx.data[3];
 
 		skb = alloc_can_err_skb(priv->netdev, &cf);
 		if (skb == NULL) {

commit 7014a0479d4213b8e6466c4a54c04fddd79155a0
Author: Kefeng Wang <wangkefeng.wang@huawei.com>
Date:   Fri Aug 6 16:21:24 2021 +0800

    once: Fix panic when module unload
    
    [ Upstream commit 1027b96ec9d34f9abab69bc1a4dc5b1ad8ab1349 ]
    
    DO_ONCE
    DEFINE_STATIC_KEY_TRUE(___once_key);
    __do_once_done
      once_disable_jump(once_key);
        INIT_WORK(&w->work, once_deferred);
        struct once_work *w;
        w->key = key;
        schedule_work(&w->work);                     module unload
                                                       //*the key is
    destroy*
    process_one_work
      once_deferred
        BUG_ON(!static_key_enabled(work->key));
           static_key_count((struct static_key *)x)    //*access key, crash*
    
    When module uses DO_ONCE mechanism, it could crash due to the above
    concurrency problem, we could reproduce it with link[1].
    
    Fix it by add/put module refcount in the once work process.
    
    [1] https://lore.kernel.org/netdev/eaa6c371-465e-57eb-6be9-f4b16b9d7cbf@huawei.com/
    
    Cc: Hannes Frederic Sowa <hannes@stressinduktion.org>
    Cc: Daniel Borkmann <daniel@iogearbox.net>
    Cc: David S. Miller <davem@davemloft.net>
    Cc: Eric Dumazet <edumazet@google.com>
    Reported-by: Minmin chen <chenmingmin@huawei.com>
    Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
    Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/once.h b/include/linux/once.h
index 9225ee6d96c7..ae6f4eb41cbe 100644
--- a/include/linux/once.h
+++ b/include/linux/once.h
@@ -7,7 +7,7 @@
 
 bool __do_once_start(bool *done, unsigned long *flags);
 void __do_once_done(bool *done, struct static_key_true *once_key,
-		    unsigned long *flags);
+		    unsigned long *flags, struct module *mod);
 
 /* Call a function exactly once. The idea of DO_ONCE() is to perform
  * a function call such as initialization of random seeds, etc, only
@@ -46,7 +46,7 @@ void __do_once_done(bool *done, struct static_key_true *once_key,
 			if (unlikely(___ret)) {				     \
 				func(__VA_ARGS__);			     \
 				__do_once_done(&___done, &___once_key,	     \
-					       &___flags);		     \
+					       &___flags, THIS_MODULE);	     \
 			}						     \
 		}							     \
 		___ret;							     \
diff --git a/lib/once.c b/lib/once.c
index 8b7d6235217e..59149bf3bfb4 100644
--- a/lib/once.c
+++ b/lib/once.c
@@ -3,10 +3,12 @@
 #include <linux/spinlock.h>
 #include <linux/once.h>
 #include <linux/random.h>
+#include <linux/module.h>
 
 struct once_work {
 	struct work_struct work;
 	struct static_key_true *key;
+	struct module *module;
 };
 
 static void once_deferred(struct work_struct *w)
@@ -16,10 +18,11 @@ static void once_deferred(struct work_struct *w)
 	work = container_of(w, struct once_work, work);
 	BUG_ON(!static_key_enabled(work->key));
 	static_branch_disable(work->key);
+	module_put(work->module);
 	kfree(work);
 }
 
-static void once_disable_jump(struct static_key_true *key)
+static void once_disable_jump(struct static_key_true *key, struct module *mod)
 {
 	struct once_work *w;
 
@@ -29,6 +32,8 @@ static void once_disable_jump(struct static_key_true *key)
 
 	INIT_WORK(&w->work, once_deferred);
 	w->key = key;
+	w->module = mod;
+	__module_get(mod);
 	schedule_work(&w->work);
 }
 
@@ -53,11 +58,11 @@ bool __do_once_start(bool *done, unsigned long *flags)
 EXPORT_SYMBOL(__do_once_start);
 
 void __do_once_done(bool *done, struct static_key_true *once_key,
-		    unsigned long *flags)
+		    unsigned long *flags, struct module *mod)
 	__releases(once_lock)
 {
 	*done = true;
 	spin_unlock_irqrestore(&once_lock, *flags);
-	once_disable_jump(once_key);
+	once_disable_jump(once_key, mod);
 }
 EXPORT_SYMBOL(__do_once_done);

commit dafc95a1e473a0b857af34ecbb17b8b1c90edd75
Author: Florian Westphal <fw@strlen.de>
Date:   Tue Jul 27 00:29:19 2021 +0200

    netfilter: conntrack: collect all entries in one cycle
    
    [ Upstream commit 4608fdfc07e116f9fc0895beb40abad7cdb5ee3d ]
    
    Michal Kubecek reports that conntrack gc is responsible for frequent
    wakeups (every 125ms) on idle systems.
    
    On busy systems, timed out entries are evicted during lookup.
    The gc worker is only needed to remove entries after system becomes idle
    after a busy period.
    
    To resolve this, always scan the entire table.
    If the scan is taking too long, reschedule so other work_structs can run
    and resume from next bucket.
    
    After a completed scan, wait for 2 minutes before the next cycle.
    Heuristics for faster re-schedule are removed.
    
    GC_SCAN_INTERVAL could be exposed as a sysctl in the future to allow
    tuning this as-needed or even turn the gc worker off.
    
    Reported-by: Michal Kubecek <mkubecek@suse.cz>
    Signed-off-by: Florian Westphal <fw@strlen.de>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
index c5590d36b775..a38caf317dbb 100644
--- a/net/netfilter/nf_conntrack_core.c
+++ b/net/netfilter/nf_conntrack_core.c
@@ -70,10 +70,9 @@ EXPORT_SYMBOL_GPL(nf_conntrack_hash);
 
 struct conntrack_gc_work {
 	struct delayed_work	dwork;
-	u32			last_bucket;
+	u32			next_bucket;
 	bool			exiting;
 	bool			early_drop;
-	long			next_gc_run;
 };
 
 static __read_mostly struct kmem_cache *nf_conntrack_cachep;
@@ -81,12 +80,8 @@ static __read_mostly spinlock_t nf_conntrack_locks_all_lock;
 static __read_mostly DEFINE_SPINLOCK(nf_conntrack_locks_all_lock);
 static __read_mostly bool nf_conntrack_locks_all;
 
-/* every gc cycle scans at most 1/GC_MAX_BUCKETS_DIV part of table */
-#define GC_MAX_BUCKETS_DIV	128u
-/* upper bound of full table scan */
-#define GC_MAX_SCAN_JIFFIES	(16u * HZ)
-/* desired ratio of entries found to be expired */
-#define GC_EVICT_RATIO	50u
+#define GC_SCAN_INTERVAL	(120u * HZ)
+#define GC_SCAN_MAX_DURATION	msecs_to_jiffies(10)
 
 static struct conntrack_gc_work conntrack_gc_work;
 
@@ -1198,17 +1193,13 @@ static void nf_ct_offload_timeout(struct nf_conn *ct)
 
 static void gc_worker(struct work_struct *work)
 {
-	unsigned int min_interval = max(HZ / GC_MAX_BUCKETS_DIV, 1u);
-	unsigned int i, goal, buckets = 0, expired_count = 0;
-	unsigned int nf_conntrack_max95 = 0;
+	unsigned long end_time = jiffies + GC_SCAN_MAX_DURATION;
+	unsigned int i, hashsz, nf_conntrack_max95 = 0;
+	unsigned long next_run = GC_SCAN_INTERVAL;
 	struct conntrack_gc_work *gc_work;
-	unsigned int ratio, scanned = 0;
-	unsigned long next_run;
-
 	gc_work = container_of(work, struct conntrack_gc_work, dwork.work);
 
-	goal = nf_conntrack_htable_size / GC_MAX_BUCKETS_DIV;
-	i = gc_work->last_bucket;
+	i = gc_work->next_bucket;
 	if (gc_work->early_drop)
 		nf_conntrack_max95 = nf_conntrack_max / 100u * 95u;
 
@@ -1216,22 +1207,21 @@ static void gc_worker(struct work_struct *work)
 		struct nf_conntrack_tuple_hash *h;
 		struct hlist_nulls_head *ct_hash;
 		struct hlist_nulls_node *n;
-		unsigned int hashsz;
 		struct nf_conn *tmp;
 
-		i++;
 		rcu_read_lock();
 
 		nf_conntrack_get_ht(&ct_hash, &hashsz);
-		if (i >= hashsz)
-			i = 0;
+		if (i >= hashsz) {
+			rcu_read_unlock();
+			break;
+		}
 
 		hlist_nulls_for_each_entry_rcu(h, n, &ct_hash[i], hnnode) {
 			struct net *net;
 
 			tmp = nf_ct_tuplehash_to_ctrack(h);
 
-			scanned++;
 			if (test_bit(IPS_OFFLOAD_BIT, &tmp->status)) {
 				nf_ct_offload_timeout(tmp);
 				continue;
@@ -1239,7 +1229,6 @@ static void gc_worker(struct work_struct *work)
 
 			if (nf_ct_is_expired(tmp)) {
 				nf_ct_gc_expired(tmp);
-				expired_count++;
 				continue;
 			}
 
@@ -1271,7 +1260,14 @@ static void gc_worker(struct work_struct *work)
 		 */
 		rcu_read_unlock();
 		cond_resched();
-	} while (++buckets < goal);
+		i++;
+
+		if (time_after(jiffies, end_time) && i < hashsz) {
+			gc_work->next_bucket = i;
+			next_run = 0;
+			break;
+		}
+	} while (i < hashsz);
 
 	if (gc_work->exiting)
 		return;
@@ -1282,40 +1278,17 @@ static void gc_worker(struct work_struct *work)
 	 *
 	 * This worker is only here to reap expired entries when system went
 	 * idle after a busy period.
-	 *
-	 * The heuristics below are supposed to balance conflicting goals:
-	 *
-	 * 1. Minimize time until we notice a stale entry
-	 * 2. Maximize scan intervals to not waste cycles
-	 *
-	 * Normally, expire ratio will be close to 0.
-	 *
-	 * As soon as a sizeable fraction of the entries have expired
-	 * increase scan frequency.
 	 */
-	ratio = scanned ? expired_count * 100 / scanned : 0;
-	if (ratio > GC_EVICT_RATIO) {
-		gc_work->next_gc_run = min_interval;
-	} else {
-		unsigned int max = GC_MAX_SCAN_JIFFIES / GC_MAX_BUCKETS_DIV;
-
-		BUILD_BUG_ON((GC_MAX_SCAN_JIFFIES / GC_MAX_BUCKETS_DIV) == 0);
-
-		gc_work->next_gc_run += min_interval;
-		if (gc_work->next_gc_run > max)
-			gc_work->next_gc_run = max;
+	if (next_run) {
+		gc_work->early_drop = false;
+		gc_work->next_bucket = 0;
 	}
-
-	next_run = gc_work->next_gc_run;
-	gc_work->last_bucket = i;
-	gc_work->early_drop = false;
 	queue_delayed_work(system_power_efficient_wq, &gc_work->dwork, next_run);
 }
 
 static void conntrack_gc_work_init(struct conntrack_gc_work *gc_work)
 {
 	INIT_DEFERRABLE_WORK(&gc_work->dwork, gc_worker);
-	gc_work->next_gc_run = HZ;
 	gc_work->exiting = false;
 }
 

commit 7027119349fe919c39a3f75de1f8d77fe6cb1a98
Author: Guenter Roeck <linux@roeck-us.net>
Date:   Sat Jul 10 07:50:33 2021 -0700

    ARC: Fix CONFIG_STACKDEPOT
    
    [ Upstream commit bf79167fd86f3b97390fe2e70231d383526bd9cc ]
    
    Enabling CONFIG_STACKDEPOT results in the following build error.
    
    arc-elf-ld: lib/stackdepot.o: in function `filter_irq_stacks':
    stackdepot.c:(.text+0x456): undefined reference to `__irqentry_text_start'
    arc-elf-ld: stackdepot.c:(.text+0x456): undefined reference to `__irqentry_text_start'
    arc-elf-ld: stackdepot.c:(.text+0x476): undefined reference to `__irqentry_text_end'
    arc-elf-ld: stackdepot.c:(.text+0x476): undefined reference to `__irqentry_text_end'
    arc-elf-ld: stackdepot.c:(.text+0x484): undefined reference to `__softirqentry_text_start'
    arc-elf-ld: stackdepot.c:(.text+0x484): undefined reference to `__softirqentry_text_start'
    arc-elf-ld: stackdepot.c:(.text+0x48c): undefined reference to `__softirqentry_text_end'
    arc-elf-ld: stackdepot.c:(.text+0x48c): undefined reference to `__softirqentry_text_end'
    
    Other architectures address this problem by adding IRQENTRY_TEXT and
    SOFTIRQENTRY_TEXT to the text segment, so do the same here.
    
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arc/kernel/vmlinux.lds.S b/arch/arc/kernel/vmlinux.lds.S
index f35ed578e007..4d823d3f65bb 100644
--- a/arch/arc/kernel/vmlinux.lds.S
+++ b/arch/arc/kernel/vmlinux.lds.S
@@ -92,6 +92,8 @@ SECTIONS
 		CPUIDLE_TEXT
 		LOCK_TEXT
 		KPROBES_TEXT
+		IRQENTRY_TEXT
+		SOFTIRQENTRY_TEXT
 		*(.fixup)
 		*(.gnu.warning)
 	}

commit 39f74b7c81cca139c05757d9c8f9d1e35fbbf56b
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Fri Aug 27 10:55:33 2021 -0300

    bpf: Fix truncation handling for mod32 dst reg wrt zero
    
    Commit 9b00f1b78809309163dda2d044d9e94a3c0248a3 upstream.
    
    Recently noticed that when mod32 with a known src reg of 0 is performed,
    then the dst register is 32-bit truncated in verifier:
    
      0: R1=ctx(id=0,off=0,imm=0) R10=fp0
      0: (b7) r0 = 0
      1: R0_w=inv0 R1=ctx(id=0,off=0,imm=0) R10=fp0
      1: (b7) r1 = -1
      2: R0_w=inv0 R1_w=inv-1 R10=fp0
      2: (b4) w2 = -1
      3: R0_w=inv0 R1_w=inv-1 R2_w=inv4294967295 R10=fp0
      3: (9c) w1 %= w0
      4: R0_w=inv0 R1_w=inv(id=0,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R2_w=inv4294967295 R10=fp0
      4: (b7) r0 = 1
      5: R0_w=inv1 R1_w=inv(id=0,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R2_w=inv4294967295 R10=fp0
      5: (1d) if r1 == r2 goto pc+1
       R0_w=inv1 R1_w=inv(id=0,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R2_w=inv4294967295 R10=fp0
      6: R0_w=inv1 R1_w=inv(id=0,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R2_w=inv4294967295 R10=fp0
      6: (b7) r0 = 2
      7: R0_w=inv2 R1_w=inv(id=0,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R2_w=inv4294967295 R10=fp0
      7: (95) exit
      7: R0=inv1 R1=inv(id=0,umin_value=4294967295,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R2=inv4294967295 R10=fp0
      7: (95) exit
    
    However, as a runtime result, we get 2 instead of 1, meaning the dst
    register does not contain (u32)-1 in this case. The reason is fairly
    straight forward given the 0 test leaves the dst register as-is:
    
      # ./bpftool p d x i 23
       0: (b7) r0 = 0
       1: (b7) r1 = -1
       2: (b4) w2 = -1
       3: (16) if w0 == 0x0 goto pc+1
       4: (9c) w1 %= w0
       5: (b7) r0 = 1
       6: (1d) if r1 == r2 goto pc+1
       7: (b7) r0 = 2
       8: (95) exit
    
    This was originally not an issue given the dst register was marked as
    completely unknown (aka 64 bit unknown). However, after 468f6eafa6c4
    ("bpf: fix 32-bit ALU op verification") the verifier casts the register
    output to 32 bit, and hence it becomes 32 bit unknown. Note that for
    the case where the src register is unknown, the dst register is marked
    64 bit unknown. After the fix, the register is truncated by the runtime
    and the test passes:
    
      # ./bpftool p d x i 23
       0: (b7) r0 = 0
       1: (b7) r1 = -1
       2: (b4) w2 = -1
       3: (16) if w0 == 0x0 goto pc+2
       4: (9c) w1 %= w0
       5: (05) goto pc+1
       6: (bc) w1 = w1
       7: (b7) r0 = 1
       8: (1d) if r1 == r2 goto pc+1
       9: (b7) r0 = 2
      10: (95) exit
    
    Semantics also match with {R,W}x mod{64,32} 0 -> {R,W}x. Invalid div
    has always been {R,W}x div{64,32} 0 -> 0. Rewrites are as follows:
    
      mod32:                            mod64:
    
      (16) if w0 == 0x0 goto pc+2       (15) if r0 == 0x0 goto pc+1
      (9c) w1 %= w0                     (9f) r1 %= r0
      (05) goto pc+1
      (bc) w1 = w1
    
    Fixes: 468f6eafa6c4 ("bpf: fix 32-bit ALU op verification")
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: John Fastabend <john.fastabend@gmail.com>
    [Salvatore Bonaccorso: This is an earlier version based on work by
    Daniel and John which does not rely on availability of the BPF_JMP32
    instruction class. This means it is not even strictly a backport of the
    upstream commit mentioned but based on Daniel's and John's work to
    address the issue and was finalized by Thadeu Lima de Souza Cascardo.]
    Tested-by: Salvatore Bonaccorso <carnil@debian.org>
    Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index a346ecfe6241..abdc9eca463c 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -6178,7 +6178,7 @@ static int fixup_bpf_calls(struct bpf_verifier_env *env)
 			bool is64 = BPF_CLASS(insn->code) == BPF_ALU64;
 			struct bpf_insn mask_and_div[] = {
 				BPF_MOV_REG(BPF_CLASS(insn->code), BPF_REG_AX, insn->src_reg),
-				/* Rx div 0 -> 0 */
+				/* [R,W]x div 0 -> 0 */
 				BPF_JMP_IMM(BPF_JEQ, BPF_REG_AX, 0, 2),
 				BPF_RAW_REG(*insn, insn->dst_reg, BPF_REG_AX),
 				BPF_JMP_IMM(BPF_JA, 0, 0, 1),
@@ -6186,9 +6186,10 @@ static int fixup_bpf_calls(struct bpf_verifier_env *env)
 			};
 			struct bpf_insn mask_and_mod[] = {
 				BPF_MOV_REG(BPF_CLASS(insn->code), BPF_REG_AX, insn->src_reg),
-				/* Rx mod 0 -> Rx */
-				BPF_JMP_IMM(BPF_JEQ, BPF_REG_AX, 0, 1),
+				BPF_JMP_IMM(BPF_JEQ, BPF_REG_AX, 0, 1 + (is64 ? 0 : 1)),
 				BPF_RAW_REG(*insn, insn->dst_reg, BPF_REG_AX),
+				BPF_JMP_IMM(BPF_JA, 0, 0, 1),
+				BPF_MOV32_REG(insn->dst_reg, insn->dst_reg),
 			};
 			struct bpf_insn *patchlet;
 
@@ -6198,7 +6199,7 @@ static int fixup_bpf_calls(struct bpf_verifier_env *env)
 				cnt = ARRAY_SIZE(mask_and_div);
 			} else {
 				patchlet = mask_and_mod;
-				cnt = ARRAY_SIZE(mask_and_mod);
+				cnt = ARRAY_SIZE(mask_and_mod) - (is64 ? 2 : 0);
 			}
 
 			new_prog = bpf_patch_insn_data(env, i + delta, patchlet, cnt);

commit 8313432df224d926590731ec3ace3e1bd7bc4a1a
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Fri Aug 27 10:55:32 2021 -0300

    bpf: Fix 32 bit src register truncation on div/mod
    
    Commit e88b2c6e5a4d9ce30d75391e4d950da74bb2bd90 upstream.
    
    While reviewing a different fix, John and I noticed an oddity in one of the
    BPF program dumps that stood out, for example:
    
      # bpftool p d x i 13
       0: (b7) r0 = 808464450
       1: (b4) w4 = 808464432
       2: (bc) w0 = w0
       3: (15) if r0 == 0x0 goto pc+1
       4: (9c) w4 %= w0
      [...]
    
    In line 2 we noticed that the mov32 would 32 bit truncate the original src
    register for the div/mod operation. While for the two operations the dst
    register is typically marked unknown e.g. from adjust_scalar_min_max_vals()
    the src register is not, and thus verifier keeps tracking original bounds,
    simplified:
    
      0: R1=ctx(id=0,off=0,imm=0) R10=fp0
      0: (b7) r0 = -1
      1: R0_w=invP-1 R1=ctx(id=0,off=0,imm=0) R10=fp0
      1: (b7) r1 = -1
      2: R0_w=invP-1 R1_w=invP-1 R10=fp0
      2: (3c) w0 /= w1
      3: R0_w=invP(id=0,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R1_w=invP-1 R10=fp0
      3: (77) r1 >>= 32
      4: R0_w=invP(id=0,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R1_w=invP4294967295 R10=fp0
      4: (bf) r0 = r1
      5: R0_w=invP4294967295 R1_w=invP4294967295 R10=fp0
      5: (95) exit
      processed 6 insns (limit 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0
    
    Runtime result of r0 at exit is 0 instead of expected -1. Remove the
    verifier mov32 src rewrite in div/mod and replace it with a jmp32 test
    instead. After the fix, we result in the following code generation when
    having dividend r1 and divisor r6:
    
      div, 64 bit:                             div, 32 bit:
    
       0: (b7) r6 = 8                           0: (b7) r6 = 8
       1: (b7) r1 = 8                           1: (b7) r1 = 8
       2: (55) if r6 != 0x0 goto pc+2           2: (56) if w6 != 0x0 goto pc+2
       3: (ac) w1 ^= w1                         3: (ac) w1 ^= w1
       4: (05) goto pc+1                        4: (05) goto pc+1
       5: (3f) r1 /= r6                         5: (3c) w1 /= w6
       6: (b7) r0 = 0                           6: (b7) r0 = 0
       7: (95) exit                             7: (95) exit
    
      mod, 64 bit:                             mod, 32 bit:
    
       0: (b7) r6 = 8                           0: (b7) r6 = 8
       1: (b7) r1 = 8                           1: (b7) r1 = 8
       2: (15) if r6 == 0x0 goto pc+1           2: (16) if w6 == 0x0 goto pc+1
       3: (9f) r1 %= r6                         3: (9c) w1 %= w6
       4: (b7) r0 = 0                           4: (b7) r0 = 0
       5: (95) exit                             5: (95) exit
    
    x86 in particular can throw a 'divide error' exception for div
    instruction not only for divisor being zero, but also for the case
    when the quotient is too large for the designated register. For the
    edx:eax and rdx:rax dividend pair it is not an issue in x86 BPF JIT
    since we always zero edx (rdx). Hence really the only protection
    needed is against divisor being zero.
    
    Fixes: 68fda450a7df ("bpf: fix 32-bit divide by zero")
    Co-developed-by: John Fastabend <john.fastabend@gmail.com>
    Signed-off-by: John Fastabend <john.fastabend@gmail.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    [Salvatore Bonaccorso: This is an earlier version of the patch provided
    by Daniel Borkmann which does not rely on availability of the BPF_JMP32
    instruction class. This means it is not even strictly a backport of the
    upstream commit mentioned but based on Daniel's and John's work to
    address the issue.]
    Tested-by: Salvatore Bonaccorso <carnil@debian.org>
    Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/filter.h b/include/linux/filter.h
index 117f9380069a..7c84762cb59e 100644
--- a/include/linux/filter.h
+++ b/include/linux/filter.h
@@ -77,6 +77,14 @@ struct sock_reuseport;
 
 /* ALU ops on registers, bpf_add|sub|...: dst_reg += src_reg */
 
+#define BPF_ALU_REG(CLASS, OP, DST, SRC)			\
+	((struct bpf_insn) {					\
+		.code  = CLASS | BPF_OP(OP) | BPF_X,		\
+		.dst_reg = DST,					\
+		.src_reg = SRC,					\
+		.off   = 0,					\
+		.imm   = 0 })
+
 #define BPF_ALU64_REG(OP, DST, SRC)				\
 	((struct bpf_insn) {					\
 		.code  = BPF_ALU64 | BPF_OP(OP) | BPF_X,	\
@@ -123,6 +131,14 @@ struct sock_reuseport;
 
 /* Short form of mov, dst_reg = src_reg */
 
+#define BPF_MOV_REG(CLASS, DST, SRC)				\
+	((struct bpf_insn) {					\
+		.code  = CLASS | BPF_MOV | BPF_X,		\
+		.dst_reg = DST,					\
+		.src_reg = SRC,					\
+		.off   = 0,					\
+		.imm   = 0 })
+
 #define BPF_MOV64_REG(DST, SRC)					\
 	((struct bpf_insn) {					\
 		.code  = BPF_ALU64 | BPF_MOV | BPF_X,		\
@@ -157,6 +173,14 @@ struct sock_reuseport;
 		.off   = 0,					\
 		.imm   = IMM })
 
+#define BPF_RAW_REG(insn, DST, SRC)				\
+	((struct bpf_insn) {					\
+		.code  = (insn).code,				\
+		.dst_reg = DST,					\
+		.src_reg = SRC,					\
+		.off   = (insn).off,				\
+		.imm   = (insn).imm })
+
 /* BPF_LD_IMM64 macro encodes single 'load 64-bit immediate' insn */
 #define BPF_LD_IMM64(DST, IMM)					\
 	BPF_LD_IMM64_RAW(DST, 0, IMM)
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 2bf83305e5ab..a346ecfe6241 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -6177,28 +6177,28 @@ static int fixup_bpf_calls(struct bpf_verifier_env *env)
 		    insn->code == (BPF_ALU | BPF_DIV | BPF_X)) {
 			bool is64 = BPF_CLASS(insn->code) == BPF_ALU64;
 			struct bpf_insn mask_and_div[] = {
-				BPF_MOV32_REG(insn->src_reg, insn->src_reg),
+				BPF_MOV_REG(BPF_CLASS(insn->code), BPF_REG_AX, insn->src_reg),
 				/* Rx div 0 -> 0 */
-				BPF_JMP_IMM(BPF_JNE, insn->src_reg, 0, 2),
-				BPF_ALU32_REG(BPF_XOR, insn->dst_reg, insn->dst_reg),
+				BPF_JMP_IMM(BPF_JEQ, BPF_REG_AX, 0, 2),
+				BPF_RAW_REG(*insn, insn->dst_reg, BPF_REG_AX),
 				BPF_JMP_IMM(BPF_JA, 0, 0, 1),
-				*insn,
+				BPF_ALU_REG(BPF_CLASS(insn->code), BPF_XOR, insn->dst_reg, insn->dst_reg),
 			};
 			struct bpf_insn mask_and_mod[] = {
-				BPF_MOV32_REG(insn->src_reg, insn->src_reg),
+				BPF_MOV_REG(BPF_CLASS(insn->code), BPF_REG_AX, insn->src_reg),
 				/* Rx mod 0 -> Rx */
-				BPF_JMP_IMM(BPF_JEQ, insn->src_reg, 0, 1),
-				*insn,
+				BPF_JMP_IMM(BPF_JEQ, BPF_REG_AX, 0, 1),
+				BPF_RAW_REG(*insn, insn->dst_reg, BPF_REG_AX),
 			};
 			struct bpf_insn *patchlet;
 
 			if (insn->code == (BPF_ALU64 | BPF_DIV | BPF_X) ||
 			    insn->code == (BPF_ALU | BPF_DIV | BPF_X)) {
-				patchlet = mask_and_div + (is64 ? 1 : 0);
-				cnt = ARRAY_SIZE(mask_and_div) - (is64 ? 1 : 0);
+				patchlet = mask_and_div;
+				cnt = ARRAY_SIZE(mask_and_div);
 			} else {
-				patchlet = mask_and_mod + (is64 ? 1 : 0);
-				cnt = ARRAY_SIZE(mask_and_mod) - (is64 ? 1 : 0);
+				patchlet = mask_and_mod;
+				cnt = ARRAY_SIZE(mask_and_mod);
 			}
 
 			new_prog = bpf_patch_insn_data(env, i + delta, patchlet, cnt);

commit c348d806ed1d3075af52345344243824d72c4945
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Fri Aug 27 10:55:31 2021 -0300

    bpf: Do not use ax register in interpreter on div/mod
    
    Partially undo old commit 144cd91c4c2b ("bpf: move tmp variable into ax
    register in interpreter"). The reason we need this here is because ax
    register will be used for holding temporary state for div/mod instruction
    which otherwise interpreter would corrupt. This will cause a small +8 byte
    stack increase for interpreter, but with the gain that we can use it from
    verifier rewrites as scratch register.
    
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: John Fastabend <john.fastabend@gmail.com>
    [cascardo: This partial revert is needed in order to support using AX for
    the following two commits, as there is no JMP32 on 4.19.y]
    Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
index 36be400c3e65..d2b6d2459aad 100644
--- a/kernel/bpf/core.c
+++ b/kernel/bpf/core.c
@@ -705,9 +705,6 @@ static int bpf_jit_blind_insn(const struct bpf_insn *from,
 	 * below.
 	 *
 	 * Constant blinding is only used by JITs, not in the interpreter.
-	 * The interpreter uses AX in some occasions as a local temporary
-	 * register e.g. in DIV or MOD instructions.
-	 *
 	 * In restricted circumstances, the verifier can also use the AX
 	 * register for rewrites as long as they do not interfere with
 	 * the above cases!
@@ -1057,6 +1054,7 @@ static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack)
 #undef BPF_INSN_3_LBL
 #undef BPF_INSN_2_LBL
 	u32 tail_call_cnt = 0;
+	u64 tmp;
 
 #define CONT	 ({ insn++; goto select_insn; })
 #define CONT_JMP ({ insn++; goto select_insn; })
@@ -1117,36 +1115,36 @@ static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack)
 		(*(s64 *) &DST) >>= IMM;
 		CONT;
 	ALU64_MOD_X:
-		div64_u64_rem(DST, SRC, &AX);
-		DST = AX;
+		div64_u64_rem(DST, SRC, &tmp);
+		DST = tmp;
 		CONT;
 	ALU_MOD_X:
-		AX = (u32) DST;
-		DST = do_div(AX, (u32) SRC);
+		tmp = (u32) DST;
+		DST = do_div(tmp, (u32) SRC);
 		CONT;
 	ALU64_MOD_K:
-		div64_u64_rem(DST, IMM, &AX);
-		DST = AX;
+		div64_u64_rem(DST, IMM, &tmp);
+		DST = tmp;
 		CONT;
 	ALU_MOD_K:
-		AX = (u32) DST;
-		DST = do_div(AX, (u32) IMM);
+		tmp = (u32) DST;
+		DST = do_div(tmp, (u32) IMM);
 		CONT;
 	ALU64_DIV_X:
 		DST = div64_u64(DST, SRC);
 		CONT;
 	ALU_DIV_X:
-		AX = (u32) DST;
-		do_div(AX, (u32) SRC);
-		DST = (u32) AX;
+		tmp = (u32) DST;
+		do_div(tmp, (u32) SRC);
+		DST = (u32) tmp;
 		CONT;
 	ALU64_DIV_K:
 		DST = div64_u64(DST, IMM);
 		CONT;
 	ALU_DIV_K:
-		AX = (u32) DST;
-		do_div(AX, (u32) IMM);
-		DST = (u32) AX;
+		tmp = (u32) DST;
+		do_div(tmp, (u32) IMM);
+		DST = (u32) tmp;
 		CONT;
 	ALU_END_TO_BE:
 		switch (IMM) {

commit ce7d8be2eaa4cab3032e256d154d1c33843d2367
Author: Xiaolong Huang <butterflyhuangxx@gmail.com>
Date:   Fri Aug 20 03:50:34 2021 +0800

    net: qrtr: fix another OOB Read in qrtr_endpoint_post
    
    commit 7e78c597c3ebfd0cb329aa09a838734147e4f117 upstream.
    
    This check was incomplete, did not consider size is 0:
    
            if (len != ALIGN(size, 4) + hdrlen)
                        goto err;
    
    if size from qrtr_hdr is 0, the result of ALIGN(size, 4)
    will be 0, In case of len == hdrlen and size == 0
    in header this check won't fail and
    
            if (cb->type == QRTR_TYPE_NEW_SERVER) {
                    /* Remote node endpoint can bridge other distant nodes */
                    const struct qrtr_ctrl_pkt *pkt = data + hdrlen;
    
                    qrtr_node_assign(node, le32_to_cpu(pkt->server.node));
            }
    
    will also read out of bound from data, which is hdrlen allocated block.
    
    Fixes: 194ccc88297a ("net: qrtr: Support decoding incoming v2 packets")
    Fixes: ad9d24c9429e ("net: qrtr: fix OOB Read in qrtr_endpoint_post")
    Signed-off-by: Xiaolong Huang <butterflyhuangxx@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c
index 1e2772913957..128d0a48478d 100644
--- a/net/qrtr/qrtr.c
+++ b/net/qrtr/qrtr.c
@@ -321,7 +321,7 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len)
 		goto err;
 	}
 
-	if (len != ALIGN(size, 4) + hdrlen)
+	if (!size || len != ALIGN(size, 4) + hdrlen)
 		goto err;
 
 	if (cb->dst_port != QRTR_PORT_CTRL && cb->type != QRTR_TYPE_DATA)

commit 80fe73c7410dedee43f7dc9733402d5c2c352238
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Thu Sep 2 12:00:57 2021 +0800

    media: rockchip: cif: add module exit to fix the failure of rmmod video_rkcif
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I97fc14eb411339796dfc58b28460ed00cd898814

diff --git a/drivers/media/platform/rockchip/cif/hw.c b/drivers/media/platform/rockchip/cif/hw.c
index 54a943dd98ad..4181e0d135d6 100644
--- a/drivers/media/platform/rockchip/cif/hw.c
+++ b/drivers/media/platform/rockchip/cif/hw.c
@@ -1009,7 +1009,6 @@ static struct platform_driver rkcif_hw_plat_drv = {
 	.remove = rkcif_plat_remove,
 };
 
-#ifdef MODULE
 static int __init rk_cif_plat_drv_init(void)
 {
 	int ret;
@@ -1020,10 +1019,14 @@ static int __init rk_cif_plat_drv_init(void)
 	return rkcif_csi2_plat_drv_init();
 }
 
+static void __exit rk_cif_plat_drv_exit(void)
+{
+	platform_driver_unregister(&rkcif_hw_plat_drv);
+	rkcif_csi2_plat_drv_exit();
+}
+
 module_init(rk_cif_plat_drv_init);
-#else
-module_platform_driver(rkcif_hw_plat_drv);
-#endif
+module_exit(rk_cif_plat_drv_exit);
 
 MODULE_AUTHOR("Rockchip Camera/ISP team");
 MODULE_DESCRIPTION("Rockchip CIF platform driver");
diff --git a/drivers/media/platform/rockchip/cif/mipi-csi2.c b/drivers/media/platform/rockchip/cif/mipi-csi2.c
index ebc7d97b3287..37bcddfe47ea 100644
--- a/drivers/media/platform/rockchip/cif/mipi-csi2.c
+++ b/drivers/media/platform/rockchip/cif/mipi-csi2.c
@@ -1039,14 +1039,15 @@ static struct platform_driver csi2_driver = {
 	.remove = csi2_remove,
 };
 
-#ifdef MODULE
 int __init rkcif_csi2_plat_drv_init(void)
 {
 	return platform_driver_register(&csi2_driver);
 }
-#else
-module_platform_driver(csi2_driver);
-#endif
+
+void __exit rkcif_csi2_plat_drv_exit(void)
+{
+	platform_driver_unregister(&csi2_driver);
+}
 
 MODULE_DESCRIPTION("Rockchip MIPI CSI2 driver");
 MODULE_AUTHOR("Macrofly.xu <xuhf@rock-chips.com>");
diff --git a/drivers/media/platform/rockchip/cif/mipi-csi2.h b/drivers/media/platform/rockchip/cif/mipi-csi2.h
index cfa52e29dbe2..d7b08f22144c 100644
--- a/drivers/media/platform/rockchip/cif/mipi-csi2.h
+++ b/drivers/media/platform/rockchip/cif/mipi-csi2.h
@@ -12,6 +12,7 @@ u32 rkcif_csi2_get_sof(void);
 void rkcif_csi2_set_sof(u32 seq);
 void rkcif_csi2_event_inc_sof(void);
 int __init rkcif_csi2_plat_drv_init(void);
+void __exit rkcif_csi2_plat_drv_exit(void);
 int rkcif_csi2_register_notifier(struct notifier_block *nb);
 int rkcif_csi2_unregister_notifier(struct notifier_block *nb);
 

commit c18fd2aea2efff6cabf9b8524d693d9832f6b441
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Fri Sep 3 08:27:21 2021 +0800

    arm64: dts: rockchip: rk3568: Set SDHCI core clk to 200MHz
    
    As we mask our SDHCI controller as SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
    host->max_clk is derived from core clock in the first place. Then
    f_max works together with it.
    
    If we adjust loader's core clk setting, such as 50MHz, we will get
    50MHz for host->max_clk, because .get_max_clock() reads core clk
    when probing driver. That will lead f_max be set to 50MHz as well,
    no matter if max-frequency is set higher than 50MHz.
    
    We can simple solve this problem by assigning core clk as 200MHz
    in the first place and then let max-frequency property takes over
    it.
    
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: Idb2fdb8f68881d0286d977dc3718b74c30d3bc67

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index 9d76ec4ada65..beaa9c82e286 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -2462,8 +2462,9 @@
 		compatible = "rockchip,dwcmshc-sdhci", "snps,dwcmshc-sdhci";
 		reg = <0x0 0xfe310000 0x0 0x10000>;
 		interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>;
-		assigned-clocks = <&cru BCLK_EMMC>, <&cru TCLK_EMMC>;
-		assigned-clock-rates = <200000000>, <24000000>;
+		assigned-clocks = <&cru BCLK_EMMC>, <&cru TCLK_EMMC>,
+				  <&cru CCLK_EMMC>;
+		assigned-clock-rates = <200000000>, <24000000>, <200000000>;
 		clocks = <&cru CCLK_EMMC>, <&cru HCLK_EMMC>,
 			 <&cru ACLK_EMMC>, <&cru BCLK_EMMC>,
 			 <&cru TCLK_EMMC>;

commit 2ecea59132eace0320f67de224bbb9c3fae6f953
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Thu Sep 2 15:42:15 2021 +0800

    drivers: rkflash: Support new SPI Nand devices
    
    GD5F1GQ4UExxH, W25N512GVEIG, SGM7000I-S24W1GH
    
    Change-Id: Ib9e5422c3f57ef80e60fc6847d0ba9e1dd55dc3b
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/rkflash/sfc_nand.c b/drivers/rkflash/sfc_nand.c
index e5acf35fdaaf..d01309566e7b 100644
--- a/drivers/rkflash/sfc_nand.c
+++ b/drivers/rkflash/sfc_nand.c
@@ -64,6 +64,8 @@ static struct nand_info spi_nand_tbl[] = {
 	{ 0xC8, 0x45, 0x00, 4, 0x40, 2, 2048, 0x4C, 20, 0x4, 1, { 0x04, 0x08, 0X14, 0x18 }, &sfc_nand_get_ecc_status2 },
 	/* GD5F4GQ6UExxG 1*4096 */
 	{ 0xC8, 0x55, 0x00, 4, 0x40, 2, 2048, 0x4C, 20, 0x4, 1, { 0x04, 0x08, 0X14, 0x18 }, &sfc_nand_get_ecc_status2 },
+	/* GD5F1GQ4UExxH */
+	{ 0xC8, 0xD9, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x8, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status3 },
 
 	/* W25N01GV */
 	{ 0xEF, 0xAA, 0x21, 4, 0x40, 1, 1024, 0x4C, 18, 0x1, 0, { 0x04, 0x14, 0x24, 0xFF }, &sfc_nand_get_ecc_status1 },
@@ -73,6 +75,8 @@ static struct nand_info spi_nand_tbl[] = {
 	{ 0xEF, 0xAA, 0x23, 4, 0x40, 1, 4096, 0x4C, 20, 0x8, 0, { 0x04, 0x14, 0x24, 0x34 }, &sfc_nand_get_ecc_status0 },
 	/* W25N01GW */
 	{ 0xEF, 0xBA, 0x00, 4, 0x40, 1, 1024, 0x4C, 18, 0x1, 0, { 0x04, 0x14, 0x24, 0xFF }, &sfc_nand_get_ecc_status1 },
+	/* W25N512GVEIG */
+	{ 0xEF, 0xAA, 0x20, 4, 0x40, 1, 512, 0x4C, 17, 0x1, 0, { 0x04, 0x14, 0x24, 0xFF }, &sfc_nand_get_ecc_status1 },
 
 	/* HYF2GQ4UAACAE */
 	{ 0xC9, 0x52, 0x00, 4, 0x40, 1, 2048, 0x4C, 19, 0xE, 1, { 0x04, 0x24, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
@@ -159,6 +163,8 @@ static struct nand_info spi_nand_tbl[] = {
 	{ 0xBC, 0xB3, 0x00, 4, 0x40, 1, 2048, 0x4C, 19, 0x8, 1, { 0x04, 0x10, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
 	/* JS28U1GQSCAHG-83 */
 	{ 0xBF, 0x21, 0x00, 4, 0x40, 1, 1024, 0x40, 18, 0x4, 1, { 0x08, 0x0C, 0xFF, 0xFF }, &sfc_nand_get_ecc_status8 },
+	/* SGM7000I-S24W1GH */
+	{ 0xEA, 0xC1, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
 };
 
 static struct nand_info *p_nand_info;

commit abce936f233669cad0a459bbdff10cdaf519183a
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Thu Sep 2 11:11:45 2021 +0800

    drivers: rkflash: Add mutex for deinit ops.
    
    Change-Id: I477c161cb22f58263963a4d8e0d08eaeda676f69
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/rkflash/rkflash_blk.c b/drivers/rkflash/rkflash_blk.c
index cfb3a3ba5f76..3f4d9871c649 100644
--- a/drivers/rkflash/rkflash_blk.c
+++ b/drivers/rkflash/rkflash_blk.c
@@ -776,6 +776,8 @@ void rkflash_dev_shutdown(void)
 		wake_up(&mytr.thread_wq);
 		wait_for_completion(&mytr.thread_exit);
 	}
+	mutex_lock(&g_flash_ops_mutex);
 	g_boot_ops->deinit();
+	mutex_unlock(&g_flash_ops_mutex);
 	pr_info("rkflash_shutdown:OK\n");
 }

commit 32210c5c1ecc57bf385c6f65e7dfb603c06d37ad
Author: Dingxian Wen <shawn.wen@rock-chips.com>
Date:   Tue Aug 31 19:51:58 2021 +0800

    arm64: configs: rockchip_defconfig: enable LT6911UXC
    
    Enable lt6911uxc HDMI to MIPI CSI-2 bridge driver for hdmi-in
    application. Which found on rk3568-evb2-lp4x-v10.
    
    Signed-off-by: Dingxian Wen <shawn.wen@rock-chips.com>
    Change-Id: I4ce22f3040dbe55c3236ac3d0ac62f7821011c8d

diff --git a/arch/arm64/configs/rockchip_defconfig b/arch/arm64/configs/rockchip_defconfig
index 56a8ddd93265..ff0cf610481d 100644
--- a/arch/arm64/configs/rockchip_defconfig
+++ b/arch/arm64/configs/rockchip_defconfig
@@ -571,6 +571,7 @@ CONFIG_VIDEO_DW9714=y
 CONFIG_VIDEO_VM149C=y
 CONFIG_VIDEO_TC35874X=y
 CONFIG_VIDEO_RK628_CSI=y
+CONFIG_VIDEO_LT6911UXC=y
 CONFIG_VIDEO_OV2680=y
 CONFIG_VIDEO_OV5648=y
 CONFIG_VIDEO_OV5695=y

commit 5b721d45c8e66eb97bf3cf8bf97842ded3542ceb
Author: Dingxian Wen <shawn.wen@rock-chips.com>
Date:   Tue Aug 31 19:50:56 2021 +0800

    arm64: dts: rockchip: rk3568-evb2: add lt6911uxc configuration
    
    Signed-off-by: Dingxian Wen <shawn.wen@rock-chips.com>
    Change-Id: I27e7cd02314fb288a4f553105de1027975b8e9d6

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi
index 36aa16874ed5..55caf8990c58 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi
@@ -63,6 +63,13 @@
 		regulator-max-microvolt = <3300000>;
 		vin-supply = <&vcc5v0_sys>;
 	};
+
+	ext_cam_clk: external-camera-clock {
+		compatible = "fixed-clock";
+		clock-frequency = <24000000>;
+		clock-output-names = "CLK_CAMERA_24MHZ";
+		#clock-cells = <0>;
+	};
 };
 
 &combphy0_us {
@@ -161,6 +168,35 @@
 	power-supply = <&vcc3v3_lcd0_n>;
 };
 
+&i2c3 {
+	status = "okay";
+
+	lt6911uxc: lt6911uxc@2b {
+		status = "okay";
+		reg = <0x2b>;
+		compatible = "lontium,lt6911uxc";
+		clocks = <&ext_cam_clk>;
+		clock-names = "xvclk";
+		interrupt-parent = <&gpio4>;
+		interrupts = <16 IRQ_TYPE_LEVEL_LOW>;
+		power-gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>;
+		reset-gpios = <&gpio4 26 GPIO_ACTIVE_LOW>;
+		plugin-det-gpios = <&gpio0 30 GPIO_ACTIVE_LOW>;
+		hpd-ctl-gpios = <&gpio3 27 GPIO_ACTIVE_LOW>;
+		rockchip,camera-module-index = <0>;
+		rockchip,camera-module-facing = "back";
+		rockchip,camera-module-name = "LT6911UXC";
+		rockchip,camera-module-lens-name = "NC";
+
+		port {
+			lt6911uxc_out: endpoint {
+				remote-endpoint = <&hdmi_to_mipi_in>;
+				data-lanes = <1 2 3 4>;
+			};
+		};
+	};
+};
+
 &i2c4 {
 	status = "okay";
 
@@ -459,3 +495,91 @@
 &xpcs {
 	status = "okay";
 };
+
+&csi2_dphy_hw {
+	status = "okay";
+};
+
+&csi2_dphy0 {
+	status = "okay";
+
+	ports {
+		#address-cells = <1>;
+		#size-cells = <0>;
+		port@0 {
+			reg = <0>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			hdmi_to_mipi_in: endpoint@1 {
+				reg = <1>;
+				remote-endpoint = <&lt6911uxc_out>;
+				data-lanes = <1 2 3 4>;
+			};
+		};
+
+		port@1 {
+			reg = <1>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			csidphy_out: endpoint@1 {
+				reg = <1>;
+				remote-endpoint = <&mipi_csi2_input>;
+				data-lanes = <1 2 3 4>;
+			};
+		};
+	};
+};
+
+&mipi_csi2 {
+	status = "okay";
+
+	ports {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		port@0 {
+			reg = <0>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			mipi_csi2_input: endpoint@1 {
+				reg = <1>;
+				remote-endpoint = <&csidphy_out>;
+				data-lanes = <1 2 3 4>;
+			};
+		};
+
+		port@1 {
+			reg = <1>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			mipi_csi2_output: endpoint@0 {
+				reg = <0>;
+				remote-endpoint = <&cif_mipi_in>;
+				data-lanes = <1 2 3 4>;
+			};
+		};
+	};
+};
+
+&rkcif {
+	status = "okay";
+};
+
+&rkcif_mipi_lvds {
+	status = "okay";
+
+	port {
+		cif_mipi_in: endpoint {
+			remote-endpoint = <&mipi_csi2_output>;
+			data-lanes = <1 2 3 4>;
+		};
+	};
+};
+
+&rkcif_mmu {
+	status = "okay";
+};

commit f7e55b01439c05b9819d38322d67a72030717ac0
Author: Dingxian Wen <shawn.wen@rock-chips.com>
Date:   Tue Aug 31 19:49:25 2021 +0800

    media: i2c: lt6911uxc: add lt6911uxc HDMI to MIPI CSI-2 bridge driver
    
    Signed-off-by: Dingxian Wen <shawn.wen@rock-chips.com>
    Change-Id: I5dc11d3c8a2559303d96b3206fafadb46f95ed0f

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index dcd9c46e1159..353a0e92e091 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -454,6 +454,17 @@ config VIDEO_RK628_CSI
 	  To compile this driver as a module, choose M here: the
 	  module will be called rk628-csi.
 
+config VIDEO_LT6911UXC
+	tristate "Lontium LT6911UXC decoder"
+	depends on VIDEO_V4L2 && I2C && VIDEO_V4L2_SUBDEV_API
+	select HDMI
+	select V4L2_FWNODE
+	help
+	  Support for the Lontium LT6911UXC series HDMI to MIPI CSI-2 bridge.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called lt6911uxc.
+
 config VIDEO_TECHPOINT
 	tristate "TechPoint decoder"
 	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index 2f88762febaa..b2328feddcf8 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -145,6 +145,7 @@ obj-$(CONFIG_VIDEO_OV2659)	+= ov2659.o
 obj-$(CONFIG_VIDEO_TC358743)	+= tc358743.o
 obj-$(CONFIG_VIDEO_TC35874X)	+= tc35874x.o
 obj-$(CONFIG_VIDEO_RK628_CSI)	+= rk628_csi.o
+obj-$(CONFIG_VIDEO_LT6911UXC)	+= lt6911uxc.o
 obj-$(CONFIG_VIDEO_IMX178)	+= imx178.o
 obj-$(CONFIG_VIDEO_IMX219)	+= imx219.o
 obj-$(CONFIG_VIDEO_IMX258)	+= imx258.o
diff --git a/drivers/media/i2c/lt6911uxc.c b/drivers/media/i2c/lt6911uxc.c
new file mode 100644
index 000000000000..88ce0ca1d2c4
--- /dev/null
+++ b/drivers/media/i2c/lt6911uxc.c
@@ -0,0 +1,1447 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co. Ltd.
+ *
+ * Author: Dingxian Wen <shawn.wen@rock-chips.com>
+ */
+
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/gpio/consumer.h>
+#include <linux/hdmi.h>
+#include <linux/i2c.h>
+#include <linux/interrupt.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of_graph.h>
+#include <linux/rk-camera-module.h>
+#include <linux/slab.h>
+#include <linux/timer.h>
+#include <linux/v4l2-dv-timings.h>
+#include <linux/version.h>
+#include <linux/videodev2.h>
+#include <linux/workqueue.h>
+#include <media/v4l2-controls_rockchip.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-dv-timings.h>
+#include <media/v4l2-event.h>
+#include <media/v4l2-fwnode.h>
+#include "lt6911uxc.h"
+
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x0)
+#define LT6911UXC_NAME			"LT6911UXC"
+
+#define LT6911UXC_LINK_FREQ_HIGH	400000000
+#define LT6911UXC_LINK_FREQ_LOW		200000000
+#define LT6911UXC_PIXEL_RATE		400000000
+
+#define I2C_MAX_XFER_SIZE		128
+
+static int debug;
+module_param(debug, int, 0644);
+MODULE_PARM_DESC(debug, "debug level (0-2)");
+
+static const s64 link_freq_menu_items[] = {
+	LT6911UXC_LINK_FREQ_HIGH,
+	LT6911UXC_LINK_FREQ_LOW,
+};
+
+struct lt6911uxc {
+	struct clk *xvclk;
+	struct delayed_work delayed_work_enable_hotplug;
+	struct delayed_work delayed_work_res_change;
+	struct gpio_desc *hpd_ctl_gpio;
+	struct gpio_desc *plugin_det_gpio;
+	struct gpio_desc *power_gpio;
+	struct gpio_desc *reset_gpio;
+	struct i2c_client *i2c_client;
+	struct media_pad pad;
+	struct mutex confctl_mutex;
+	struct v4l2_ctrl *audio_present_ctrl;
+	struct v4l2_ctrl *audio_sampling_rate_ctrl;
+	struct v4l2_ctrl *detect_tx_5v_ctrl;
+	struct v4l2_ctrl *link_freq;
+	struct v4l2_ctrl *pixel_rate;
+	struct v4l2_ctrl_handler hdl;
+	struct v4l2_dv_timings timings;
+	struct v4l2_fwnode_bus_mipi_csi2 bus;
+	struct v4l2_subdev sd;
+	const char *len_name;
+	const char *module_facing;
+	const char *module_name;
+	const struct lt6911uxc_mode *cur_mode;
+	bool enable_hdcp;
+	bool nosignal;
+	bool is_audio_present;
+	int plugin_irq;
+	u32 mbus_fmt_code;
+	u32 module_index;
+	u32 csi_lanes_in_use;
+	u32 audio_sampling_rate;
+};
+
+struct lt6911uxc_mode {
+	u32 width;
+	u32 height;
+	struct v4l2_fract max_fps;
+	u32 hts_def;
+	u32 vts_def;
+	u32 exp_def;
+};
+
+static const struct v4l2_dv_timings_cap lt6911uxc_timings_cap = {
+	.type = V4L2_DV_BT_656_1120,
+	/* keep this initialization for compatibility with GCC < 4.4.6 */
+	.reserved = { 0 },
+	V4L2_INIT_BT_TIMINGS(1, 10000, 1, 10000, 0, 400000000,
+			V4L2_DV_BT_STD_CEA861 | V4L2_DV_BT_STD_DMT |
+			V4L2_DV_BT_STD_GTF | V4L2_DV_BT_STD_CVT,
+			V4L2_DV_BT_CAP_PROGRESSIVE |
+			V4L2_DV_BT_CAP_INTERLACED |
+			V4L2_DV_BT_CAP_REDUCED_BLANKING |
+			V4L2_DV_BT_CAP_CUSTOM)
+};
+
+static const struct lt6911uxc_mode supported_modes[] = {
+	{
+		.width = 3840,
+		.height = 2160,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.hts_def = 4400,
+		.vts_def = 2250,
+	}, {
+		.width = 1920,
+		.height = 1080,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 600000,
+		},
+		.hts_def = 2200,
+		.vts_def = 1125,
+	}, {
+		.width = 1920,
+		.height = 540,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 600000,
+		},
+	}, {
+		.width = 1440,
+		.height = 240,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 600000,
+		},
+	}, {
+		.width = 1440,
+		.height = 288,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 500000,
+		},
+	}, {
+		.width = 1280,
+		.height = 720,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 600000,
+		},
+		.hts_def = 1650,
+		.vts_def = 750,
+	}, {
+		.width = 720,
+		.height = 576,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 500000,
+		},
+		.hts_def = 864,
+		.vts_def = 625,
+	}, {
+		.width = 720,
+		.height = 480,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 600000,
+		},
+		.hts_def = 858,
+		.vts_def = 525,
+	},
+};
+
+static void lt6911uxc_format_change(struct v4l2_subdev *sd);
+static int lt6911uxc_s_ctrl_detect_tx_5v(struct v4l2_subdev *sd);
+static int lt6911uxc_s_dv_timings(struct v4l2_subdev *sd,
+				 struct v4l2_dv_timings *timings);
+
+static inline struct lt6911uxc *to_state(struct v4l2_subdev *sd)
+{
+	return container_of(sd, struct lt6911uxc, sd);
+}
+
+static int i2c_rd(struct v4l2_subdev *sd, u16 reg, u8 *values, u32 n)
+{
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+	struct i2c_client *client = lt6911uxc->i2c_client;
+	struct i2c_msg msgs[3];
+	int err;
+	u8 bank = reg >> 8;
+	u8 reg_addr = reg & 0xFF;
+	u8 buf[2] = {0xFF, bank};
+
+	/* write bank */
+	msgs[0].addr = client->addr;
+	msgs[0].flags = 0;
+	msgs[0].len = 2;
+	msgs[0].buf = buf;
+
+	/* write reg addr */
+	msgs[1].addr = client->addr;
+	msgs[1].flags = 0;
+	msgs[1].len = 1;
+	msgs[1].buf = &reg_addr;
+
+	/* read data */
+	msgs[2].addr = client->addr;
+	msgs[2].flags = I2C_M_RD;
+	msgs[2].len = n;
+	msgs[2].buf = values;
+
+	err = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
+	if (err != ARRAY_SIZE(msgs)) {
+		v4l2_err(sd, "%s: reading register 0x%x from 0x%x failed\n",
+				__func__, reg, client->addr);
+		return -EIO;
+	}
+
+	return 0;
+}
+
+static int i2c_wr(struct v4l2_subdev *sd, u16 reg, u8 *values, u32 n)
+{
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+	struct i2c_client *client = lt6911uxc->i2c_client;
+	struct i2c_msg msgs[2];
+	int err, i;
+	u8 data[I2C_MAX_XFER_SIZE];
+	u8 bank = reg >> 8;
+	u8 reg_addr = reg & 0xFF;
+	u8 buf[2] = {0xFF, bank};
+
+	if ((1 + n) > I2C_MAX_XFER_SIZE) {
+		n = I2C_MAX_XFER_SIZE - 1;
+		v4l2_warn(sd, "i2c wr reg=%04x: len=%d is too big!\n", reg,
+				1 + n);
+	}
+
+	data[0] = reg_addr;
+	for (i = 0; i < n; i++)
+		data[i + 1] = values[i];
+
+	/* write bank */
+	msgs[0].addr = client->addr;
+	msgs[0].flags = 0;
+	msgs[0].len = 2;
+	msgs[0].buf = buf;
+
+	/* write reg data */
+	msgs[1].addr = client->addr;
+	msgs[1].flags = 0;
+	msgs[1].len = 1 + n;
+	msgs[1].buf = data;
+
+	err = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
+	if (err < 0) {
+		v4l2_err(sd, "%s: writing register 0x%x from 0x%x failed\n",
+				__func__, reg, client->addr);
+		return -EIO;
+	}
+
+	return 0;
+}
+
+static int i2c_rd8(struct v4l2_subdev *sd, u16 reg, u8 *val_p)
+{
+	return i2c_rd(sd, reg, val_p, 1);
+}
+
+static int i2c_wr8(struct v4l2_subdev *sd, u16 reg, u8 val)
+{
+	return i2c_wr(sd, reg, &val, 1);
+}
+
+static void lt6911uxc_i2c_enable(struct v4l2_subdev *sd)
+{
+	i2c_wr8(sd, I2C_EN_REG, I2C_ENABLE);
+}
+
+static void lt6911uxc_i2c_disable(struct v4l2_subdev *sd)
+{
+	i2c_wr8(sd, I2C_EN_REG, I2C_DISABLE);
+}
+
+static inline bool tx_5v_power_present(struct v4l2_subdev *sd)
+{
+	int val;
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+
+	val = gpiod_get_value(lt6911uxc->plugin_det_gpio);
+	v4l2_dbg(1, debug, sd, "%s plug det: %s!\n", __func__,
+			(val > 0) ? "int" : "out");
+
+	return  (val > 0);
+}
+
+static inline bool no_signal(struct v4l2_subdev *sd)
+{
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+
+	v4l2_dbg(1, debug, sd, "%s no signal:%d\n", __func__,
+			lt6911uxc->nosignal);
+
+	return lt6911uxc->nosignal;
+}
+
+static inline bool audio_present(struct v4l2_subdev *sd)
+{
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+
+	return lt6911uxc->is_audio_present;
+}
+
+static int get_audio_sampling_rate(struct v4l2_subdev *sd)
+{
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+
+	if (no_signal(sd))
+		return 0;
+
+	return lt6911uxc->audio_sampling_rate;
+}
+
+static inline unsigned int fps_calc(const struct v4l2_bt_timings *t)
+{
+	if (!V4L2_DV_BT_FRAME_HEIGHT(t) || !V4L2_DV_BT_FRAME_WIDTH(t))
+		return 0;
+
+	return DIV_ROUND_CLOSEST((unsigned int)t->pixelclock,
+			V4L2_DV_BT_FRAME_HEIGHT(t) * V4L2_DV_BT_FRAME_WIDTH(t));
+}
+
+static bool lt6911uxc_rcv_supported_res(struct v4l2_subdev *sd, u32 width,
+		u32 height)
+{
+	u32 i;
+
+	for (i = 0; i < ARRAY_SIZE(supported_modes); i++) {
+		if ((supported_modes[i].width == width) &&
+		    (supported_modes[i].height == height)) {
+			break;
+		}
+	}
+
+	if (i == ARRAY_SIZE(supported_modes)) {
+		v4l2_err(sd, "%s do not support res wxh: %dx%d\n", __func__,
+				width, height);
+		return false;
+	} else {
+		return true;
+	}
+}
+
+static int lt6911uxc_get_detected_timings(struct v4l2_subdev *sd,
+		struct v4l2_dv_timings *timings)
+{
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+	struct v4l2_bt_timings *bt = &timings->bt;
+	u32 hact, vact, htotal, vtotal;
+	u32 hbp, hs, hfp, vbp, vs, vfp;
+	u32 pixel_clock, fps;
+	u8 clk_h, clk_m, clk_l;
+	u8 value, val_h, val_l;
+	u32 fw_ver, mipi_byte_clk, mipi_bitrate;
+	u8 fw_a, fw_b, fw_c, fw_d, lanes;
+	int ret;
+
+	memset(timings, 0, sizeof(struct v4l2_dv_timings));
+	lt6911uxc_i2c_enable(sd);
+
+	ret  = i2c_rd8(sd, FW_VER_A, &fw_a);
+	ret |= i2c_rd8(sd, FW_VER_B, &fw_b);
+	ret |= i2c_rd8(sd, FW_VER_C, &fw_c);
+	ret |= i2c_rd8(sd, FW_VER_D, &fw_d);
+	if (ret) {
+		v4l2_err(sd, "%s: I2C transform err!\n", __func__);
+		return -ENOLINK;
+	}
+	fw_ver = (fw_a << 24) | (fw_b << 16) | (fw_c <<  8) | fw_d;
+	v4l2_info(sd, "read fw_version:%#x", fw_ver);
+	i2c_wr8(sd, INT_COMPARE_REG, RECEIVED_INT);
+
+	i2c_rd8(sd, INT_STATUS_86A3, &val_h);
+	i2c_rd8(sd, INT_STATUS_86A5, &val_l);
+	v4l2_info(sd, "int status REG_86A3:%#x, REG_86A5:%#x\n", val_h, val_l);
+
+	i2c_rd8(sd, HDMI_VERSION, &value);
+	i2c_rd8(sd, TMDS_CLK_H, &clk_h);
+	i2c_rd8(sd, TMDS_CLK_M, &clk_m);
+	i2c_rd8(sd, TMDS_CLK_L, &clk_l);
+	pixel_clock = (((clk_h & 0xf) << 16) | (clk_m << 8) | clk_l) * 1000;
+	if (value & BIT(0)) /* HDMI 2.0 */
+		pixel_clock *= 4;
+
+	i2c_rd8(sd, MIPI_LANES, &lanes);
+	lt6911uxc->csi_lanes_in_use = lanes;
+	i2c_wr8(sd, FM1_DET_CLK_SRC_SEL, AD_LMTX_WRITE_CLK);
+	i2c_rd8(sd, FREQ_METER_H, &clk_h);
+	i2c_rd8(sd, FREQ_METER_M, &clk_m);
+	i2c_rd8(sd, FREQ_METER_L, &clk_l);
+	mipi_byte_clk = (((clk_h & 0xf) << 16) | (clk_m << 8) | clk_l);
+	mipi_bitrate = mipi_byte_clk * 8 / 1000;
+	v4l2_info(sd, "MIPI Byte clk: %dKHz, MIPI bitrate: %dMbps, lanes:%d\n",
+			mipi_byte_clk, mipi_bitrate, lanes);
+
+	i2c_rd8(sd, HTOTAL_H, &val_h);
+	i2c_rd8(sd, HTOTAL_L, &val_l);
+	htotal = ((val_h << 8) | val_l) * 2;
+	i2c_rd8(sd, VTOTAL_H, &val_h);
+	i2c_rd8(sd, VTOTAL_L, &val_l);
+	vtotal = (val_h << 8) | val_l;
+	i2c_rd8(sd, HACT_H, &val_h);
+	i2c_rd8(sd, HACT_L, &val_l);
+	hact = ((val_h << 8) | val_l) * 2;
+	i2c_rd8(sd, VACT_H, &val_h);
+	i2c_rd8(sd, VACT_L, &val_l);
+	vact = (val_h << 8) | val_l;
+	i2c_rd8(sd, HS_H, &val_h);
+	i2c_rd8(sd, HS_L, &val_l);
+	hs = ((val_h << 8) | val_l) * 2;
+	i2c_rd8(sd, VS, &value);
+	vs = value;
+	i2c_rd8(sd, HFP_H, &val_h);
+	i2c_rd8(sd, HFP_L, &val_l);
+	hfp = ((val_h << 8) | val_l) * 2;
+	i2c_rd8(sd, VFP, &value);
+	vfp = value;
+	i2c_rd8(sd, HBP_H, &val_h);
+	i2c_rd8(sd, HBP_L, &val_l);
+	hbp = ((val_h << 8) | val_l) * 2;
+	i2c_rd8(sd, VBP, &value);
+	vbp = value;
+	lt6911uxc_i2c_disable(sd);
+
+	if (!lt6911uxc_rcv_supported_res(sd, hact, vact)) {
+		lt6911uxc->nosignal = true;
+		v4l2_err(sd, "%s: rcv err res, return no signal!\n", __func__);
+		return -EINVAL;
+	}
+
+	lt6911uxc->nosignal = false;
+	i2c_rd8(sd, AUDIO_IN_STATUS, &value);
+	lt6911uxc->is_audio_present = (value & BIT(5)) ? true : false;
+	i2c_rd8(sd, AUDIO_SAMPLE_RATAE_H, &val_h);
+	i2c_rd8(sd, AUDIO_SAMPLE_RATAE_L, &val_l);
+	lt6911uxc->audio_sampling_rate = ((val_h << 8) | val_l) + 2;
+	v4l2_info(sd, "is_audio_present: %d, audio_sampling_rate: %dKhz\n",
+			lt6911uxc->is_audio_present,
+			lt6911uxc->audio_sampling_rate);
+
+	timings->type = V4L2_DV_BT_656_1120;
+	bt->width = hact;
+	bt->height = vact;
+	bt->vsync = vs;
+	bt->hsync = hs;
+	bt->pixelclock = pixel_clock;
+	bt->hfrontporch = hfp;
+	bt->vfrontporch = vfp;
+	bt->hbackporch = hbp;
+	bt->vbackporch = vbp;
+	fps = fps_calc(bt);
+
+	/* for interlaced res 1080i 576i 480i*/
+	if ((hact == 1920 && vact == 540) || (hact == 1440 && vact == 288)
+			|| (hact == 1440 && vact == 240)) {
+		bt->interlaced = V4L2_DV_INTERLACED;
+		bt->height *= 2;
+		bt->il_vsync = bt->vsync + 1;
+	} else {
+		bt->interlaced = V4L2_DV_PROGRESSIVE;
+	}
+
+	v4l2_info(sd, "act:%dx%d, total:%dx%d, pixclk:%d, fps:%d\n",
+			hact, vact, htotal, vtotal, pixel_clock, fps);
+	v4l2_info(sd, "hfp:%d, hs:%d, hbp:%d, vfp:%d, vs:%d, vbp:%d, inerlaced:%d\n",
+			bt->hfrontporch, bt->hsync, bt->hbackporch, bt->vfrontporch,
+			bt->vsync, bt->vbackporch, bt->interlaced);
+
+	return 0;
+}
+
+static void lt6911uxc_config_hpd(struct v4l2_subdev *sd)
+{
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+	bool plugin;
+
+	plugin = tx_5v_power_present(sd);
+	v4l2_dbg(2, debug, sd, "%s: plugin: %d\n", __func__, plugin);
+
+	if (plugin) {
+		gpiod_set_value(lt6911uxc->hpd_ctl_gpio, 1);
+	} else {
+		lt6911uxc->nosignal = true;
+		gpiod_set_value(lt6911uxc->hpd_ctl_gpio, 0);
+	}
+}
+
+static void lt6911uxc_delayed_work_enable_hotplug(struct work_struct *work)
+{
+	struct delayed_work *dwork = to_delayed_work(work);
+	struct lt6911uxc *lt6911uxc = container_of(dwork,
+			struct lt6911uxc, delayed_work_enable_hotplug);
+	struct v4l2_subdev *sd = &lt6911uxc->sd;
+
+	v4l2_dbg(2, debug, sd, "%s:\n", __func__);
+	lt6911uxc_config_hpd(sd);
+}
+
+static void lt6911uxc_delayed_work_res_change(struct work_struct *work)
+{
+	struct delayed_work *dwork = to_delayed_work(work);
+	struct lt6911uxc *lt6911uxc = container_of(dwork,
+			struct lt6911uxc, delayed_work_res_change);
+	struct v4l2_subdev *sd = &lt6911uxc->sd;
+
+	v4l2_dbg(2, debug, sd, "%s:\n", __func__);
+	lt6911uxc_format_change(sd);
+}
+
+static int lt6911uxc_s_ctrl_detect_tx_5v(struct v4l2_subdev *sd)
+{
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+
+	return v4l2_ctrl_s_ctrl(lt6911uxc->detect_tx_5v_ctrl,
+			tx_5v_power_present(sd));
+}
+
+static int lt6911uxc_s_ctrl_audio_sampling_rate(struct v4l2_subdev *sd)
+{
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+
+	return v4l2_ctrl_s_ctrl(lt6911uxc->audio_sampling_rate_ctrl,
+			get_audio_sampling_rate(sd));
+}
+
+static int lt6911uxc_s_ctrl_audio_present(struct v4l2_subdev *sd)
+{
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+
+	return v4l2_ctrl_s_ctrl(lt6911uxc->audio_present_ctrl,
+			audio_present(sd));
+}
+
+static int lt6911uxc_update_controls(struct v4l2_subdev *sd)
+{
+	int ret = 0;
+
+	ret |= lt6911uxc_s_ctrl_detect_tx_5v(sd);
+	ret |= lt6911uxc_s_ctrl_audio_sampling_rate(sd);
+	ret |= lt6911uxc_s_ctrl_audio_present(sd);
+
+	return ret;
+}
+
+static inline void enable_stream(struct v4l2_subdev *sd, bool enable)
+{
+	v4l2_dbg(2, debug, sd, "%s: %sable\n",
+			__func__, enable ? "en" : "dis");
+}
+
+static void lt6911uxc_format_change(struct v4l2_subdev *sd)
+{
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+	struct v4l2_dv_timings timings;
+	const struct v4l2_event lt6911uxc_ev_fmt = {
+		.type = V4L2_EVENT_SOURCE_CHANGE,
+		.u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION,
+	};
+
+	if (lt6911uxc_get_detected_timings(sd, &timings)) {
+		enable_stream(sd, false);
+
+		v4l2_dbg(1, debug, sd, "%s: No signal\n", __func__);
+	} else {
+		if (!v4l2_match_dv_timings(&lt6911uxc->timings, &timings, 0,
+					false)) {
+			enable_stream(sd, false);
+			/* automatically set timing rather than set by user */
+			lt6911uxc_s_dv_timings(sd, &timings);
+			v4l2_print_dv_timings(sd->name,
+					"Format_change: New format: ",
+					&timings, false);
+		}
+	}
+
+	if (sd->devnode)
+		v4l2_subdev_notify_event(sd, &lt6911uxc_ev_fmt);
+}
+
+static int lt6911uxc_get_ctrl(struct v4l2_ctrl *ctrl)
+{
+	int ret = -1;
+	struct lt6911uxc *lt6911uxc = container_of(ctrl->handler,
+			struct lt6911uxc, hdl);
+	struct v4l2_subdev *sd = &(lt6911uxc->sd);
+
+	if (ctrl->id == V4L2_CID_DV_RX_POWER_PRESENT) {
+		ret = tx_5v_power_present(sd);
+		*ctrl->p_new.p_s32 = ret;
+	}
+
+	return ret;
+}
+
+static int lt6911uxc_isr(struct v4l2_subdev *sd, u32 status, bool *handled)
+{
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+
+	schedule_delayed_work(&lt6911uxc->delayed_work_res_change, HZ / 20);
+	*handled = true;
+
+	return 0;
+}
+
+static irqreturn_t lt6911uxc_res_change_irq_handler(int irq, void *dev_id)
+{
+	struct lt6911uxc *lt6911uxc = dev_id;
+	bool handled;
+
+	lt6911uxc_isr(&lt6911uxc->sd, 0, &handled);
+
+	return handled ? IRQ_HANDLED : IRQ_NONE;
+}
+
+static irqreturn_t plugin_detect_irq_handler(int irq, void *dev_id)
+{
+	struct lt6911uxc *lt6911uxc = dev_id;
+	struct v4l2_subdev *sd = &lt6911uxc->sd;
+
+	/* control hpd output level after 25ms */
+	schedule_delayed_work(&lt6911uxc->delayed_work_enable_hotplug,
+			HZ / 40);
+	tx_5v_power_present(sd);
+
+	return IRQ_HANDLED;
+}
+
+static int lt6911uxc_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh,
+				    struct v4l2_event_subscription *sub)
+{
+	switch (sub->type) {
+	case V4L2_EVENT_SOURCE_CHANGE:
+		return v4l2_src_change_event_subdev_subscribe(sd, fh, sub);
+	case V4L2_EVENT_CTRL:
+		return v4l2_ctrl_subdev_subscribe_event(sd, fh, sub);
+	default:
+		return -EINVAL;
+	}
+}
+
+static int lt6911uxc_g_input_status(struct v4l2_subdev *sd, u32 *status)
+{
+	*status = 0;
+	*status |= no_signal(sd) ? V4L2_IN_ST_NO_SIGNAL : 0;
+	v4l2_dbg(1, debug, sd, "%s: status = 0x%x\n", __func__, *status);
+
+	return 0;
+}
+
+static int lt6911uxc_s_dv_timings(struct v4l2_subdev *sd,
+				 struct v4l2_dv_timings *timings)
+{
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+
+	if (!timings)
+		return -EINVAL;
+
+	if (debug)
+		v4l2_print_dv_timings(sd->name, "s_dv_timings: ", timings, false);
+
+	if (v4l2_match_dv_timings(&lt6911uxc->timings, timings, 0, false)) {
+		v4l2_dbg(1, debug, sd, "%s: no change\n", __func__);
+		return 0;
+	}
+
+	if (!v4l2_valid_dv_timings(timings,
+				&lt6911uxc_timings_cap, NULL, NULL)) {
+		v4l2_dbg(1, debug, sd, "%s: timings out of range\n", __func__);
+		return -ERANGE;
+	}
+
+	lt6911uxc->timings = *timings;
+
+	enable_stream(sd, false);
+
+	return 0;
+}
+
+static int lt6911uxc_g_dv_timings(struct v4l2_subdev *sd,
+				 struct v4l2_dv_timings *timings)
+{
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+
+	*timings = lt6911uxc->timings;
+
+	return 0;
+}
+
+static int lt6911uxc_enum_dv_timings(struct v4l2_subdev *sd,
+				    struct v4l2_enum_dv_timings *timings)
+{
+	if (timings->pad != 0)
+		return -EINVAL;
+
+	return v4l2_enum_dv_timings_cap(timings,
+			&lt6911uxc_timings_cap, NULL, NULL);
+}
+
+static int lt6911uxc_query_dv_timings(struct v4l2_subdev *sd,
+		struct v4l2_dv_timings *timings)
+{
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+
+	*timings = lt6911uxc->timings;
+	if (debug)
+		v4l2_print_dv_timings(sd->name, "query_dv_timings: ", timings, false);
+
+	if (!v4l2_valid_dv_timings(timings, &lt6911uxc_timings_cap, NULL,
+				NULL)) {
+		v4l2_dbg(1, debug, sd, "%s: timings out of range\n", __func__);
+
+		return -ERANGE;
+	}
+
+	return 0;
+}
+
+static int lt6911uxc_dv_timings_cap(struct v4l2_subdev *sd,
+		struct v4l2_dv_timings_cap *cap)
+{
+	if (cap->pad != 0)
+		return -EINVAL;
+
+	*cap = lt6911uxc_timings_cap;
+
+	return 0;
+}
+
+static int lt6911uxc_g_mbus_config(struct v4l2_subdev *sd,
+			     struct v4l2_mbus_config *cfg)
+{
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+
+	cfg->type = V4L2_MBUS_CSI2;
+	cfg->flags = V4L2_MBUS_CSI2_CONTINUOUS_CLOCK | V4L2_MBUS_CSI2_CHANNEL_0;
+
+	switch (lt6911uxc->csi_lanes_in_use) {
+	case 1:
+		cfg->flags |= V4L2_MBUS_CSI2_1_LANE;
+		break;
+	case 2:
+		cfg->flags |= V4L2_MBUS_CSI2_2_LANE;
+		break;
+	case 3:
+		cfg->flags |= V4L2_MBUS_CSI2_3_LANE;
+		break;
+	case 4:
+		cfg->flags |= V4L2_MBUS_CSI2_4_LANE;
+		break;
+
+	default:
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+static int lt6911uxc_s_stream(struct v4l2_subdev *sd, int enable)
+{
+	enable_stream(sd, enable);
+
+	return 0;
+}
+
+static int lt6911uxc_enum_mbus_code(struct v4l2_subdev *sd,
+		struct v4l2_subdev_pad_config *cfg,
+		struct v4l2_subdev_mbus_code_enum *code)
+{
+	switch (code->index) {
+	case 0:
+		code->code = MEDIA_BUS_FMT_UYVY8_2X8;
+		break;
+
+	default:
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+static int lt6911uxc_enum_frame_sizes(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_pad_config *cfg,
+				   struct v4l2_subdev_frame_size_enum *fse)
+{
+	if (fse->index >= ARRAY_SIZE(supported_modes))
+		return -EINVAL;
+
+	if (fse->code != MEDIA_BUS_FMT_UYVY8_2X8)
+		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;
+
+	return 0;
+}
+
+static int lt6911uxc_enum_frame_interval(struct v4l2_subdev *sd,
+		struct v4l2_subdev_pad_config *cfg,
+		struct v4l2_subdev_frame_interval_enum *fie)
+{
+	if (fie->index >= ARRAY_SIZE(supported_modes))
+		return -EINVAL;
+
+	if (fie->code != MEDIA_BUS_FMT_UYVY8_2X8)
+		return -EINVAL;
+
+	fie->width = supported_modes[fie->index].width;
+	fie->height = supported_modes[fie->index].height;
+	fie->interval = supported_modes[fie->index].max_fps;
+
+	return 0;
+}
+
+static int lt6911uxc_get_fmt(struct v4l2_subdev *sd,
+		struct v4l2_subdev_pad_config *cfg,
+		struct v4l2_subdev_format *format)
+{
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+
+	mutex_lock(&lt6911uxc->confctl_mutex);
+	format->format.code = lt6911uxc->mbus_fmt_code;
+	format->format.width = lt6911uxc->timings.bt.width;
+	format->format.height = lt6911uxc->timings.bt.height;
+	format->format.field =
+		lt6911uxc->timings.bt.interlaced ?
+		V4L2_FIELD_INTERLACED : V4L2_FIELD_NONE;
+	format->format.colorspace = V4L2_COLORSPACE_SRGB;
+	mutex_unlock(&lt6911uxc->confctl_mutex);
+
+	v4l2_dbg(1, debug, sd, "%s: fmt code:%d, w:%d, h:%d, field mode:%s\n",
+		__func__, format->format.code, format->format.width, format->format.height,
+		(format->format.field == V4L2_FIELD_INTERLACED) ? "I" : "P");
+
+	return 0;
+}
+
+static int lt6911uxc_get_reso_dist(const struct lt6911uxc_mode *mode,
+		struct v4l2_mbus_framefmt *framefmt)
+{
+	return abs(mode->width - framefmt->width) +
+	       abs(mode->height - framefmt->height);
+}
+
+static const struct lt6911uxc_mode *
+lt6911uxc_find_best_fit(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 < ARRAY_SIZE(supported_modes); i++) {
+		dist = lt6911uxc_get_reso_dist(&supported_modes[i], framefmt);
+		if (cur_best_fit_dist == -1 || dist < cur_best_fit_dist) {
+			cur_best_fit_dist = dist;
+			cur_best_fit = i;
+		}
+	}
+
+	return &supported_modes[cur_best_fit];
+}
+
+static int lt6911uxc_set_fmt(struct v4l2_subdev *sd,
+		struct v4l2_subdev_pad_config *cfg,
+		struct v4l2_subdev_format *format)
+{
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+	const struct lt6911uxc_mode *mode;
+	int index;
+
+	/* is overwritten by get_fmt */
+	u32 code = format->format.code;
+	int ret = lt6911uxc_get_fmt(sd, cfg, format);
+
+	format->format.code = code;
+
+	if (ret)
+		return ret;
+
+	switch (code) {
+	case MEDIA_BUS_FMT_UYVY8_2X8:
+		break;
+
+	default:
+		return -EINVAL;
+	}
+
+	if (format->which == V4L2_SUBDEV_FORMAT_TRY)
+		return 0;
+
+	lt6911uxc->mbus_fmt_code = format->format.code;
+	mode = lt6911uxc_find_best_fit(format);
+	lt6911uxc->cur_mode = mode;
+	enable_stream(sd, false);
+
+	if (((mode->width == 720) && (mode->height == 576)) ||
+	    ((mode->width == 720) && (mode->height == 480)))
+		index = 1;
+	else
+		index = 0;
+
+	__v4l2_ctrl_s_ctrl(lt6911uxc->link_freq, index);
+	v4l2_dbg(1, debug, sd, "%s res wxh:%dx%d, link freq:%llu", __func__,
+			mode->width, mode->height, link_freq_menu_items[index]);
+
+	return 0;
+}
+
+static int lt6911uxc_g_frame_interval(struct v4l2_subdev *sd,
+				    struct v4l2_subdev_frame_interval *fi)
+{
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+	const struct lt6911uxc_mode *mode = lt6911uxc->cur_mode;
+
+	mutex_lock(&lt6911uxc->confctl_mutex);
+	fi->interval = mode->max_fps;
+	mutex_unlock(&lt6911uxc->confctl_mutex);
+
+	return 0;
+}
+
+static void lt6911uxc_get_module_inf(struct lt6911uxc *lt6911uxc,
+				  struct rkmodule_inf *inf)
+{
+	memset(inf, 0, sizeof(*inf));
+	strscpy(inf->base.sensor, LT6911UXC_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, lt6911uxc->module_name, sizeof(inf->base.module));
+	strscpy(inf->base.lens, lt6911uxc->len_name, sizeof(inf->base.lens));
+}
+
+static long lt6911uxc_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+	long ret = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		lt6911uxc_get_module_inf(lt6911uxc, (struct rkmodule_inf *)arg);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+
+#ifdef CONFIG_COMPAT
+static long lt6911uxc_compat_ioctl32(struct v4l2_subdev *sd,
+				  unsigned int cmd, unsigned long arg)
+{
+	void __user *up = compat_ptr(arg);
+	struct rkmodule_inf *inf;
+	long ret;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		inf = kzalloc(sizeof(*inf), GFP_KERNEL);
+		if (!inf) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = lt6911uxc_ioctl(sd, cmd, inf);
+		if (!ret) {
+			ret = copy_to_user(up, inf, sizeof(*inf));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(inf);
+		break;
+
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+#endif
+
+static const struct v4l2_ctrl_ops lt6911uxc_ctrl_ops = {
+	.g_volatile_ctrl = lt6911uxc_get_ctrl,
+};
+
+static const struct v4l2_subdev_core_ops lt6911uxc_core_ops = {
+	.interrupt_service_routine = lt6911uxc_isr,
+	.subscribe_event = lt6911uxc_subscribe_event,
+	.unsubscribe_event = v4l2_event_subdev_unsubscribe,
+	.ioctl = lt6911uxc_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = lt6911uxc_compat_ioctl32,
+#endif
+};
+
+static const struct v4l2_subdev_video_ops lt6911uxc_video_ops = {
+	.g_input_status = lt6911uxc_g_input_status,
+	.s_dv_timings = lt6911uxc_s_dv_timings,
+	.g_dv_timings = lt6911uxc_g_dv_timings,
+	.query_dv_timings = lt6911uxc_query_dv_timings,
+	.g_mbus_config = lt6911uxc_g_mbus_config,
+	.s_stream = lt6911uxc_s_stream,
+	.g_frame_interval = lt6911uxc_g_frame_interval,
+};
+
+static const struct v4l2_subdev_pad_ops lt6911uxc_pad_ops = {
+	.enum_mbus_code = lt6911uxc_enum_mbus_code,
+	.enum_frame_size = lt6911uxc_enum_frame_sizes,
+	.enum_frame_interval = lt6911uxc_enum_frame_interval,
+	.set_fmt = lt6911uxc_set_fmt,
+	.get_fmt = lt6911uxc_get_fmt,
+	.enum_dv_timings = lt6911uxc_enum_dv_timings,
+	.dv_timings_cap = lt6911uxc_dv_timings_cap,
+};
+
+static const struct v4l2_subdev_ops lt6911uxc_ops = {
+	.core = &lt6911uxc_core_ops,
+	.video = &lt6911uxc_video_ops,
+	.pad = &lt6911uxc_pad_ops,
+};
+
+static const struct v4l2_ctrl_config lt6911uxc_ctrl_audio_sampling_rate = {
+	.id = RK_V4L2_CID_AUDIO_SAMPLING_RATE,
+	.name = "Audio sampling rate",
+	.type = V4L2_CTRL_TYPE_INTEGER,
+	.min = 0,
+	.max = 768000,
+	.step = 1,
+	.def = 0,
+	.flags = V4L2_CTRL_FLAG_READ_ONLY,
+};
+
+static const struct v4l2_ctrl_config lt6911uxc_ctrl_audio_present = {
+	.id = RK_V4L2_CID_AUDIO_PRESENT,
+	.name = "Audio present",
+	.type = V4L2_CTRL_TYPE_BOOLEAN,
+	.min = 0,
+	.max = 1,
+	.step = 1,
+	.def = 0,
+	.flags = V4L2_CTRL_FLAG_READ_ONLY,
+};
+
+static void lt6911uxc_reset(struct lt6911uxc *lt6911uxc)
+{
+	gpiod_set_value(lt6911uxc->reset_gpio, 0);
+	usleep_range(2000, 2100);
+	gpiod_set_value(lt6911uxc->reset_gpio, 1);
+	usleep_range(120*1000, 121*1000);
+	gpiod_set_value(lt6911uxc->reset_gpio, 0);
+	usleep_range(300*1000, 310*1000);
+}
+
+static int lt6911uxc_init_v4l2_ctrls(struct lt6911uxc *lt6911uxc)
+{
+	struct v4l2_subdev *sd;
+	int ret;
+
+	sd = &lt6911uxc->sd;
+	ret = v4l2_ctrl_handler_init(&lt6911uxc->hdl, 5);
+	if (ret)
+		return ret;
+
+	lt6911uxc->link_freq = v4l2_ctrl_new_int_menu(&lt6911uxc->hdl, NULL,
+			V4L2_CID_LINK_FREQ,
+			ARRAY_SIZE(link_freq_menu_items) - 1, 0,
+			link_freq_menu_items);
+	v4l2_ctrl_new_std(&lt6911uxc->hdl, NULL, V4L2_CID_PIXEL_RATE,
+			  0, LT6911UXC_PIXEL_RATE, 1, LT6911UXC_PIXEL_RATE);
+
+	lt6911uxc->detect_tx_5v_ctrl = v4l2_ctrl_new_std(&lt6911uxc->hdl,
+			&lt6911uxc_ctrl_ops, V4L2_CID_DV_RX_POWER_PRESENT,
+			0, 1, 0, 0);
+	if (lt6911uxc->detect_tx_5v_ctrl)
+		lt6911uxc->detect_tx_5v_ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
+
+	lt6911uxc->audio_sampling_rate_ctrl =
+		v4l2_ctrl_new_custom(&lt6911uxc->hdl,
+				&lt6911uxc_ctrl_audio_sampling_rate, NULL);
+	lt6911uxc->audio_present_ctrl = v4l2_ctrl_new_custom(&lt6911uxc->hdl,
+			&lt6911uxc_ctrl_audio_present, NULL);
+
+	sd->ctrl_handler = &lt6911uxc->hdl;
+	if (lt6911uxc->hdl.error) {
+		ret = lt6911uxc->hdl.error;
+		v4l2_err(sd, "cfg v4l2 ctrls failed! ret:%d\n", ret);
+		return ret;
+	}
+
+	if (lt6911uxc_update_controls(sd)) {
+		ret = -ENODEV;
+		v4l2_err(sd, "update v4l2 ctrls failed! ret:%d\n", ret);
+		return ret;
+	}
+
+	return 0;
+}
+
+static int lt6911uxc_check_chip_id(struct lt6911uxc *lt6911uxc)
+{
+	struct device *dev = &lt6911uxc->i2c_client->dev;
+	struct v4l2_subdev *sd = &lt6911uxc->sd;
+	u8 fw_a, fw_b, fw_c, fw_d;
+	u8 id_h, id_l;
+	u32 chipid, fw_ver;
+	int ret;
+
+	lt6911uxc_i2c_enable(sd);
+	ret  = i2c_rd8(sd, CHIPID_L, &id_l);
+	ret |= i2c_rd8(sd, CHIPID_H, &id_h);
+
+	ret |= i2c_rd8(sd, FW_VER_A, &fw_a);
+	ret |= i2c_rd8(sd, FW_VER_B, &fw_b);
+	ret |= i2c_rd8(sd, FW_VER_C, &fw_c);
+	ret |= i2c_rd8(sd, FW_VER_D, &fw_d);
+	lt6911uxc_i2c_disable(sd);
+
+	if (!ret) {
+		chipid = (id_h << 8) | id_l;
+		if (chipid != LT6911UXC_CHIPID) {
+			dev_err(dev, "chipid err, read:%#x, expect:%#x\n",
+					chipid, LT6911UXC_CHIPID);
+			return -EINVAL;
+		}
+
+		fw_ver = (fw_a << 24) | (fw_b << 16) | (fw_c <<  8) | fw_d;
+		dev_info(dev, "chipid ok, id:%#x, fw_ver:%#x", chipid, fw_ver);
+		ret = 0;
+	} else {
+		dev_err(dev, "%s i2c trans failed!\n", __func__);
+	}
+
+	return ret;
+}
+
+#ifdef CONFIG_OF
+static int lt6911uxc_parse_of(struct lt6911uxc *lt6911uxc)
+{
+	struct device *dev = &lt6911uxc->i2c_client->dev;
+	struct device_node *node = dev->of_node;
+	struct v4l2_fwnode_endpoint *endpoint;
+	struct device_node *ep;
+	int ret;
+
+	ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
+			&lt6911uxc->module_index);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
+			&lt6911uxc->module_facing);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME,
+			&lt6911uxc->module_name);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME,
+			&lt6911uxc->len_name);
+	if (ret) {
+		dev_err(dev, "could not get module information!\n");
+		return -EINVAL;
+	}
+
+	lt6911uxc->power_gpio = devm_gpiod_get_optional(dev, "power",
+			GPIOD_OUT_LOW);
+	if (IS_ERR(lt6911uxc->power_gpio)) {
+		dev_err(dev, "failed to get power gpio\n");
+		ret = PTR_ERR(lt6911uxc->power_gpio);
+		return ret;
+	}
+
+	lt6911uxc->reset_gpio = devm_gpiod_get_optional(dev, "reset",
+			GPIOD_OUT_LOW);
+	if (IS_ERR(lt6911uxc->reset_gpio)) {
+		dev_err(dev, "failed to get reset gpio\n");
+		ret = PTR_ERR(lt6911uxc->reset_gpio);
+		return ret;
+	}
+
+	lt6911uxc->plugin_det_gpio = devm_gpiod_get_optional(dev, "plugin-det",
+			GPIOD_IN);
+	if (IS_ERR(lt6911uxc->plugin_det_gpio)) {
+		dev_err(dev, "failed to get plugin det gpio\n");
+		ret = PTR_ERR(lt6911uxc->plugin_det_gpio);
+		return ret;
+	}
+
+	lt6911uxc->hpd_ctl_gpio = devm_gpiod_get_optional(dev, "hpd-ctl",
+			GPIOD_OUT_HIGH);
+	if (IS_ERR(lt6911uxc->hpd_ctl_gpio)) {
+		dev_err(dev, "failed to get hpd ctl gpio\n");
+		ret = PTR_ERR(lt6911uxc->hpd_ctl_gpio);
+		return ret;
+	}
+
+	ep = of_graph_get_next_endpoint(dev->of_node, NULL);
+	if (!ep) {
+		dev_err(dev, "missing endpoint node\n");
+		ret = -EINVAL;
+		return ret;
+	}
+
+	endpoint = v4l2_fwnode_endpoint_alloc_parse(of_fwnode_handle(ep));
+	if (IS_ERR(endpoint)) {
+		dev_err(dev, "failed to parse endpoint\n");
+		ret = PTR_ERR(endpoint);
+		return ret;
+	}
+
+	if (endpoint->bus_type != V4L2_MBUS_CSI2 ||
+			endpoint->bus.mipi_csi2.num_data_lanes == 0) {
+		dev_err(dev, "missing CSI-2 properties in endpoint\n");
+		ret = -EINVAL;
+		goto free_endpoint;
+	}
+
+	lt6911uxc->xvclk = devm_clk_get(dev, "xvclk");
+	if (IS_ERR(lt6911uxc->xvclk)) {
+		dev_err(dev, "failed to get xvclk\n");
+		ret = -EINVAL;
+		goto free_endpoint;
+	}
+
+	ret = clk_prepare_enable(lt6911uxc->xvclk);
+	if (ret) {
+		dev_err(dev, "Failed! to enable xvclk\n");
+		goto free_endpoint;
+	}
+
+	lt6911uxc->csi_lanes_in_use = endpoint->bus.mipi_csi2.num_data_lanes;
+	lt6911uxc->bus = endpoint->bus.mipi_csi2;
+	lt6911uxc->enable_hdcp = false;
+
+	gpiod_set_value(lt6911uxc->hpd_ctl_gpio, 0);
+	gpiod_set_value(lt6911uxc->power_gpio, 1);
+	lt6911uxc_reset(lt6911uxc);
+
+	ret = 0;
+
+free_endpoint:
+	v4l2_fwnode_endpoint_free(endpoint);
+	return ret;
+}
+#else
+static inline int lt6911uxc_parse_of(struct lt6911uxc *lt6911uxc)
+{
+	return -ENODEV;
+}
+#endif
+
+static int lt6911uxc_probe(struct i2c_client *client,
+		const struct i2c_device_id *id)
+{
+	struct lt6911uxc *lt6911uxc;
+	struct v4l2_subdev *sd;
+	struct device *dev = &client->dev;
+	char facing[2];
+	int err;
+
+	dev_info(dev, "driver version: %02x.%02x.%02x",
+		DRIVER_VERSION >> 16,
+		(DRIVER_VERSION & 0xff00) >> 8,
+		DRIVER_VERSION & 0x00ff);
+
+	lt6911uxc = devm_kzalloc(dev, sizeof(struct lt6911uxc), GFP_KERNEL);
+	if (!lt6911uxc)
+		return -ENOMEM;
+
+	sd = &lt6911uxc->sd;
+	lt6911uxc->i2c_client = client;
+	lt6911uxc->cur_mode = &supported_modes[0];
+	lt6911uxc->mbus_fmt_code = MEDIA_BUS_FMT_UYVY8_2X8;
+
+	err = lt6911uxc_parse_of(lt6911uxc);
+	if (err) {
+		v4l2_err(sd, "lt6911uxc_parse_of failed! err:%d\n", err);
+		return err;
+	}
+
+	err = lt6911uxc_check_chip_id(lt6911uxc);
+	if (err < 0)
+		return err;
+
+	/* after the CPU actively accesses the lt6911uxc through I2C,
+	 * a reset operation is required.
+	 */
+	lt6911uxc_reset(lt6911uxc);
+
+	mutex_init(&lt6911uxc->confctl_mutex);
+	err = lt6911uxc_init_v4l2_ctrls(lt6911uxc);
+	if (err)
+		goto err_free_hdl;
+
+	client->flags |= I2C_CLIENT_SCCB;
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+	v4l2_i2c_subdev_init(sd, client, &lt6911uxc_ops);
+	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
+#endif
+
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	lt6911uxc->pad.flags = MEDIA_PAD_FL_SOURCE;
+	sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
+	err = media_entity_pads_init(&sd->entity, 1, &lt6911uxc->pad);
+	if (err < 0) {
+		v4l2_err(sd, "media entity init failed! err: %d\n", err);
+		goto err_free_hdl;
+	}
+#endif
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(lt6911uxc->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s",
+		 lt6911uxc->module_index, facing,
+		 LT6911UXC_NAME, dev_name(sd->dev));
+	err = v4l2_async_register_subdev_sensor_common(sd);
+	if (err < 0) {
+		v4l2_err(sd, "v4l2 register subdev failed! err:%d\n", err);
+		goto err_clean_entity;
+	}
+
+	INIT_DELAYED_WORK(&lt6911uxc->delayed_work_enable_hotplug,
+			lt6911uxc_delayed_work_enable_hotplug);
+	INIT_DELAYED_WORK(&lt6911uxc->delayed_work_res_change,
+			lt6911uxc_delayed_work_res_change);
+
+	if (lt6911uxc->i2c_client->irq) {
+		v4l2_dbg(1, debug, sd, "cfg lt6911uxc irq!\n");
+		err = devm_request_threaded_irq(dev,
+				lt6911uxc->i2c_client->irq,
+				NULL, lt6911uxc_res_change_irq_handler,
+				IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
+				"lt6911uxc", lt6911uxc);
+		if (err) {
+			v4l2_err(sd, "request irq failed! err:%d\n", err);
+			goto err_work_queues;
+		}
+	} else {
+		err = -EINVAL;
+		v4l2_err(sd, "no irq cfg failed!\n");
+		goto err_work_queues;
+	}
+
+	lt6911uxc->plugin_irq = gpiod_to_irq(lt6911uxc->plugin_det_gpio);
+	if (lt6911uxc->plugin_irq < 0) {
+		dev_err(dev, "failed to get plugin det irq\n");
+		err = lt6911uxc->plugin_irq;
+		goto err_work_queues;
+	}
+
+	err = devm_request_threaded_irq(dev, lt6911uxc->plugin_irq, NULL,
+			plugin_detect_irq_handler, IRQF_TRIGGER_FALLING |
+			IRQF_TRIGGER_RISING | IRQF_ONESHOT, "lt6911uxc",
+			lt6911uxc);
+	if (err) {
+		dev_err(dev, "failed to register plugin det irq (%d)\n", err);
+		goto err_work_queues;
+	}
+
+	err = v4l2_ctrl_handler_setup(sd->ctrl_handler);
+	if (err) {
+		v4l2_err(sd, "v4l2 ctrl handler setup failed! err:%d\n", err);
+		goto err_work_queues;
+	}
+
+	lt6911uxc_config_hpd(sd);
+	v4l2_info(sd, "%s found @ 0x%x (%s)\n", client->name,
+			client->addr << 1, client->adapter->name);
+
+	return 0;
+
+err_work_queues:
+	cancel_delayed_work(&lt6911uxc->delayed_work_enable_hotplug);
+	cancel_delayed_work(&lt6911uxc->delayed_work_res_change);
+err_clean_entity:
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	media_entity_cleanup(&sd->entity);
+#endif
+err_free_hdl:
+	v4l2_ctrl_handler_free(&lt6911uxc->hdl);
+	mutex_destroy(&lt6911uxc->confctl_mutex);
+	return err;
+}
+
+static int lt6911uxc_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct lt6911uxc *lt6911uxc = to_state(sd);
+
+	cancel_delayed_work_sync(&lt6911uxc->delayed_work_enable_hotplug);
+	cancel_delayed_work_sync(&lt6911uxc->delayed_work_res_change);
+	v4l2_async_unregister_subdev(sd);
+	v4l2_device_unregister_subdev(sd);
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	media_entity_cleanup(&sd->entity);
+#endif
+	v4l2_ctrl_handler_free(&lt6911uxc->hdl);
+	mutex_destroy(&lt6911uxc->confctl_mutex);
+	clk_disable_unprepare(lt6911uxc->xvclk);
+
+	return 0;
+}
+
+#if IS_ENABLED(CONFIG_OF)
+static const struct of_device_id lt6911uxc_of_match[] = {
+	{ .compatible = "lontium,lt6911uxc" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, lt6911uxc_of_match);
+#endif
+
+static struct i2c_driver lt6911uxc_driver = {
+	.driver = {
+		.name = LT6911UXC_NAME,
+		.of_match_table = of_match_ptr(lt6911uxc_of_match),
+	},
+	.probe = lt6911uxc_probe,
+	.remove = lt6911uxc_remove,
+};
+
+static int __init lt6911uxc_driver_init(void)
+{
+	return i2c_add_driver(&lt6911uxc_driver);
+}
+
+static void __exit lt6911uxc_driver_exit(void)
+{
+	i2c_del_driver(&lt6911uxc_driver);
+}
+
+device_initcall_sync(lt6911uxc_driver_init);
+module_exit(lt6911uxc_driver_exit);
+
+MODULE_DESCRIPTION("Lontium LT6911UXC HDMI to MIPI CSI-2 bridge driver");
+MODULE_AUTHOR("Dingxian Wen <shawn.wen@rock-chips.com>");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/media/i2c/lt6911uxc.h b/drivers/media/i2c/lt6911uxc.h
new file mode 100644
index 000000000000..45cb29764879
--- /dev/null
+++ b/drivers/media/i2c/lt6911uxc.h
@@ -0,0 +1,68 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co. Ltd.
+ *
+ * Author: Dingxian Wen <shawn.wen@rock-chips.com>
+ */
+
+#ifndef _LT6911UXC_H_
+#define _LT6911UXC_H_
+
+#define LT6911UXC_FW_VERSION	0x2005
+#define LT6911UXC_CHIPID	0x0417
+
+#define I2C_ENABLE		0x1
+#define I2C_DISABLE		0x0
+
+#define AD_LMTX_WRITE_CLK	0x1b
+#define RECEIVED_INT		1
+
+// -------------- regs ---------------
+#define I2C_EN_REG		0x80EE
+
+#define CHIPID_H		0x8101
+#define CHIPID_L		0x8100
+#define FW_VER_A		0x86a7
+#define FW_VER_B		0x86a8
+#define FW_VER_C		0x86a9
+#define FW_VER_D		0x86aa
+
+#define HTOTAL_H		0x867c
+#define HTOTAL_L		0x867d
+#define HACT_H			0x8680
+#define HACT_L			0x8681
+#define VTOTAL_H		0x867a
+#define VTOTAL_L		0x867b
+#define VACT_H			0x867e
+#define VACT_L			0x867f
+
+#define HFP_H			0x8678
+#define HFP_L			0x8679
+#define HS_H			0x8672
+#define HS_L			0x8673
+#define HBP_H			0x8676
+#define HBP_L			0x8677
+#define VBP			0x8674
+#define VFP			0x8675
+#define VS			0x8671
+
+#define HDMI_VERSION		0xb0a2
+#define TMDS_CLK_H		0x8750
+#define TMDS_CLK_M		0x8751
+#define TMDS_CLK_L		0x8752
+
+#define MIPI_LANES		0x86a2
+
+#define FM1_DET_CLK_SRC_SEL	0x8540
+#define FREQ_METER_H		0x8548
+#define FREQ_METER_M		0x8549
+#define FREQ_METER_L		0x854a
+
+#define INT_COMPARE_REG		0x86a6
+#define INT_STATUS_86A3		0x86a3
+#define INT_STATUS_86A5		0x86a5
+#define AUDIO_IN_STATUS		0xb081
+#define AUDIO_SAMPLE_RATAE_H	0xb0aa
+#define AUDIO_SAMPLE_RATAE_L	0xb0ab
+
+#endif

commit 5efc9197d844d6f7814ce0d6c05f8e825f3e8489
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Wed Sep 1 11:50:07 2021 +0800

    pinctrl: rockchip: fix pinconf_get for PIN_CONFIG_OUTPUT
    
    Do not print error information when pin is not mux to gpio,
    since it will break debug print.
    
    Also check the gpio direction before check gpio value.
    
    Change-Id: Id3afb0af12cd1e33677f5a929a879f7d00f63318
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
index 64c7e7b3cca3..871c49ef0c2a 100644
--- a/drivers/pinctrl/pinctrl-rockchip.c
+++ b/drivers/pinctrl/pinctrl-rockchip.c
@@ -2867,10 +2867,13 @@ static int rockchip_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
 		break;
 	case PIN_CONFIG_OUTPUT:
 		rc = rockchip_get_mux(bank, pin - bank->pin_base);
-		if (rc != 0) {
-			dev_err(info->dev, "pin-%d has been mux to func%d\n", pin, rc);
+		if (rc != 0)
+			return -EINVAL;
+
+		/* 0 for output, 1 for input */
+		rc = gpio->get_direction(gpio, pin - bank->pin_base);
+		if (rc)
 			return -EINVAL;
-		}
 
 		rc = gpio->get(gpio, pin - bank->pin_base);
 		if (rc < 0)

commit 031871baccfe1c0c4f5b525c83a1c5f927426ef1
Author: Algea Cao <algea.cao@rock-chips.com>
Date:   Tue Aug 31 11:13:12 2021 +0800

    drm/edid: add config option of edid function
    
    rv1126 does not support display interface which need to
    read and parse edid, such as hdmi and dp, so add config
    option to reduce memory usage.
    
    ./ksize.sh  drivers/gpu/drm/
    
    before ksize: 482336 Bytes
    after  kszie: 396762 Bytes
    save   about: 85574  Bytes
    
    Signed-off-by: Algea Cao <algea.cao@rock-chips.com>
    Change-Id: I0c3813711cfdb4a38ec66136569ca826c94c6c58

diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index f0fd26d8815a..2777e439db15 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -30,6 +30,13 @@ config DRM_DP
 	help
 	  Choose this option to support DP interface.
 
+config DRM_EDID
+	bool "EDID function for DRM"
+	depends on DRM
+	default y if !CPU_RV1126
+	help
+	  DRM EDID read and parse function.
+
 config DRM_IGNORE_IOTCL_PERMIT
 	bool "Ignore drm ioctl permission"
 	depends on DRM && ANDROID
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 0463e30f56e8..a7791ff1f82b 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -9,7 +9,7 @@ drm-y       :=	drm_auth.o drm_bufs.o drm_cache.o \
 		drm_lock.o drm_memory.o drm_drv.o \
 		drm_scatter.o drm_pci.o \
 		drm_sysfs.o drm_hashtab.o drm_mm.o \
-		drm_crtc.o drm_fourcc.o drm_modes.o drm_edid.o \
+		drm_crtc.o drm_fourcc.o drm_modes.o \
 		drm_info.o drm_encoder_slave.o \
 		drm_trace_points.o drm_global.o drm_prime.o \
 		drm_rect.o drm_vma_manager.o drm_flip_work.o \
@@ -20,6 +20,7 @@ drm-y       :=	drm_auth.o drm_bufs.o drm_cache.o \
 		drm_dumb_buffers.o drm_mode_config.o drm_vblank.o \
 		drm_syncobj.o drm_lease.o drm_writeback.o drm_client.o
 
+drm-$(CONFIG_DRM_EDID) += drm_edid.o
 drm-$(CONFIG_DRM_LIB_RANDOM) += lib/drm_random.o
 drm-$(CONFIG_DRM_VM) += drm_vm.o
 drm-$(CONFIG_COMPAT) += drm_ioc32.o
diff --git a/drivers/gpu/drm/drm_crtc_internal.h b/drivers/gpu/drm/drm_crtc_internal.h
index b61322763394..ed61ec9700cd 100644
--- a/drivers/gpu/drm/drm_crtc_internal.h
+++ b/drivers/gpu/drm/drm_crtc_internal.h
@@ -31,6 +31,8 @@
  * and are not exported to drivers.
  */
 
+#ifndef _DRM_CRTC_INTERNAL_H_
+#define _DRM_CRTC_INTERNAL_H_
 
 /* drm_crtc.c */
 int drm_mode_crtc_set_obj_prop(struct drm_mode_object *obj,
@@ -233,6 +235,24 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev,
 			     void *data, struct drm_file *file_priv);
 
 /* drm_edid.c */
+#ifdef CONFIG_DRM_EDID
 void drm_mode_fixup_1366x768(struct drm_display_mode *mode);
 void drm_reset_display_info(struct drm_connector *connector);
 u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edid);
+#else
+static inline void drm_mode_fixup_1366x768(struct drm_display_mode *mode)
+{
+}
+
+static inline void drm_reset_display_info(struct drm_connector *connector)
+{
+}
+
+static inline u32 drm_add_display_info(struct drm_connector *connector,
+				       const struct edid *edid)
+{
+	return 0;
+}
+#endif
+
+#endif /* _DRM_CRTC_INTERNAL_H_ */
diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
index 71d4e76583a5..201522db5aa6 100644
--- a/include/drm/drm_edid.h
+++ b/include/drm/drm_edid.h
@@ -511,23 +511,14 @@ struct edid *drm_do_get_edid(struct drm_connector *connector,
 	int (*get_edid_block)(void *data, u8 *buf, unsigned int block,
 			      size_t len),
 	void *data);
-struct edid *drm_get_edid(struct drm_connector *connector,
-			  struct i2c_adapter *adapter);
 struct edid *drm_get_edid_switcheroo(struct drm_connector *connector,
 				     struct i2c_adapter *adapter);
-struct edid *drm_edid_duplicate(const struct edid *edid);
-int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid);
-int drm_add_override_edid_modes(struct drm_connector *connector);
 
-u8 drm_match_cea_mode(const struct drm_display_mode *to_match);
 enum hdmi_picture_aspect drm_get_cea_aspect_ratio(const u8 video_code);
 bool drm_detect_hdmi_monitor(struct edid *edid);
-bool drm_detect_monitor_audio(struct edid *edid);
 bool drm_rgb_quant_range_selectable(struct edid *edid);
 enum hdmi_quantization_range
 drm_default_rgb_quant_range(const struct drm_display_mode *mode);
-int drm_add_modes_noedid(struct drm_connector *connector,
-			 int hdisplay, int vdisplay);
 void drm_set_preferred_mode(struct drm_connector *connector,
 			    int hpref, int vpref);
 
@@ -535,9 +526,64 @@ int drm_edid_header_is_valid(const u8 *raw_edid);
 bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid,
 			  bool *edid_corrupt);
 bool drm_edid_is_valid(struct edid *edid);
-void drm_edid_get_monitor_name(struct edid *edid, char *name,
-			       int buflen);
 struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev,
 					   int hsize, int vsize, int fresh,
 					   bool rb);
+#ifdef CONFIG_DRM_EDID
+struct edid *drm_get_edid(struct drm_connector *connector,
+			  struct i2c_adapter *adapter);
+struct edid *drm_edid_duplicate(const struct edid *edid);
+int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid);
+int drm_add_override_edid_modes(struct drm_connector *connector);
+u8 drm_match_cea_mode(const struct drm_display_mode *to_match);
+int drm_add_modes_noedid(struct drm_connector *connector,
+			 int hdisplay, int vdisplay);
+bool drm_detect_monitor_audio(struct edid *edid);
+void drm_edid_get_monitor_name(struct edid *edid, char *name,
+			       int buflen);
+#else
+static inline struct edid *drm_get_edid(struct drm_connector *connector,
+					struct i2c_adapter *adapter)
+{
+	return NULL;
+}
+
+static inline struct edid *drm_edid_duplicate(const struct edid *edid)
+{
+	return NULL;
+}
+
+static inline int drm_add_edid_modes(struct drm_connector *connector,
+				     struct edid *edid)
+{
+	return 0;
+}
+
+static inline int drm_add_override_edid_modes(struct drm_connector *connector)
+{
+	return 0;
+}
+
+static inline u8 drm_match_cea_mode(const struct drm_display_mode *to_match)
+{
+	return 0;
+}
+
+static inline int drm_add_modes_noedid(struct drm_connector *connector,
+				       int hdisplay, int vdisplay)
+{
+	return 0;
+}
+
+static inline bool drm_detect_monitor_audio(struct edid *edid)
+{
+	return false;
+}
+
+static inline void drm_edid_get_monitor_name(struct edid *edid, char *name,
+					     int buflen)
+{
+}
+#endif
+
 #endif /* __DRM_EDID_H__ */

commit 4d13755e45c5bf94b2883d0bc9dd0bb2ca03f679
Author: Damon Ding <damon.ding@rock-chips.com>
Date:   Mon Aug 30 20:30:27 2021 +0800

    drm/rockchip: add config option of DRM DP support
    
    Add config option to modularize the DP interface support of DRM.
    
    make ARCH=arm rv1126_defconfig
    make ARCH=arm rv1126-evb-ddr3-v13.img -j32
    
    ./ksize.sh  drivers/gpu/drm/
    
    before ksize: 517946 Bytes
    after  kszie: 482336 Bytes
    save   about: 35610  Bytes
    
    Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
    Change-Id: Ie2157fad13a71a3099b79085e0de40efe4b4ab34

diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index e98100a8600f..f0fd26d8815a 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -23,6 +23,13 @@ menuconfig DRM
 	  details.  You should also select and configure AGP
 	  (/dev/agpgart) support if it is available for your platform.
 
+config DRM_DP
+	bool "DRM DisplayPort support"
+	depends on DRM_KMS_HELPER
+	default y if !ARCH_ROCKCHIP || DRM_ANALOGIX_DP
+	help
+	  Choose this option to support DP interface.
+
 config DRM_IGNORE_IOTCL_PERMIT
 	bool "Ignore drm ioctl permission"
 	depends on DRM && ANDROID
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 961e51134077..0463e30f56e8 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -31,12 +31,14 @@ drm-$(CONFIG_AGP) += drm_agpsupport.o
 drm-$(CONFIG_DEBUG_FS) += drm_debugfs.o drm_debugfs_crc.o
 drm-$(CONFIG_DRM_LOAD_EDID_FIRMWARE) += drm_edid_load.o
 
-drm_kms_helper-y := drm_crtc_helper.o drm_dp_helper.o drm_dsc.o drm_probe_helper.o \
-		drm_plane_helper.o drm_dp_mst_topology.o drm_atomic_helper.o \
-		drm_kms_helper_common.o drm_dp_dual_mode_helper.o \
+drm_kms_helper-y := drm_crtc_helper.o drm_dsc.o drm_probe_helper.o \
+		drm_plane_helper.o drm_atomic_helper.o \
+		drm_kms_helper_common.o \
 		drm_simple_kms_helper.o drm_modeset_helper.o \
 		drm_scdc_helper.o drm_gem_framebuffer_helper.o
 
+drm_kms_helper-$(CONFIG_DRM_DP) += drm_dp_helper.o drm_dp_mst_topology.o \
+				drm_dp_dual_mode_helper.o
 drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) += bridge/panel.o
 drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fb_helper.o
 drm_kms_helper-$(CONFIG_DRM_KMS_CMA_HELPER) += drm_fb_cma_helper.o

commit 6e759276d2861a109af1336fff02a55f53b24c0d
Author: Damon Ding <damon.ding@rock-chips.com>
Date:   Fri Aug 27 16:36:14 2021 +0800

    drm/rockchip: add config option of PSR function
    
    rv1126 does not support PSR function, so add config option to
    reduce memory usage.
    
    make ARCH=arm rv1126_defconfig
    
    ./ksize.sh  drivers/gpu/drm/
    
    before ksize: 581268 Bytes
    after  kszie: 579486 Bytes
    save   about: 1782   Bytes
    
    Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
    Change-Id: I578bb6f4768ae807b6fc20987d421afefd421fcc

diff --git a/drivers/gpu/drm/rockchip/Kconfig b/drivers/gpu/drm/rockchip/Kconfig
index 505c59e5c862..9823788f6534 100644
--- a/drivers/gpu/drm/rockchip/Kconfig
+++ b/drivers/gpu/drm/rockchip/Kconfig
@@ -41,12 +41,19 @@ config ROCKCHIP_VOP2
 	  enable VOP2 on RK3566 and RK3568 based SoC, you should
 	  selet this option.
 
+config ROCKCHIP_PSR
+	bool
+	help
+	  If you want to enable PSR function on Rockchip SoC, you
+	  should select this option.
+
 config ROCKCHIP_ANALOGIX_DP
 	bool "Rockchip specific extensions for Analogix DP driver"
+	select ROCKCHIP_PSR
 	help
 	  This selects support for Rockchip SoC specific extensions
 	  for the Analogix Core DP driver. If you want to enable DP
-	  on RK3288 based SoC, you should selet this option.
+	  on RK3288 based SoC, you should select this option.
 
 config ROCKCHIP_CDN_DP
 	bool "Rockchip cdn DP"
diff --git a/drivers/gpu/drm/rockchip/Makefile b/drivers/gpu/drm/rockchip/Makefile
index 9e2c68dbd3d9..a5384c9e2637 100644
--- a/drivers/gpu/drm/rockchip/Makefile
+++ b/drivers/gpu/drm/rockchip/Makefile
@@ -4,7 +4,9 @@
 # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
 
 rockchipdrm-y := rockchip_drm_drv.o rockchip_drm_fb.o \
-		rockchip_drm_gem.o rockchip_drm_psr.o
+		rockchip_drm_gem.o
+
+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
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_psr.c b/drivers/gpu/drm/rockchip/rockchip_drm_psr.c
index 01ff3c858875..984e52557e6e 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_psr.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_psr.c
@@ -159,7 +159,7 @@ static void rockchip_drm_do_flush(struct psr_drv *psr)
  * timeout.
  *
  * Returns:
- * Zero on success, negative errno on failure.
+ * void.
  */
 void rockchip_drm_psr_flush_all(struct drm_device *dev)
 {
@@ -228,7 +228,7 @@ EXPORT_SYMBOL(rockchip_drm_psr_register);
  * rockchip_drm_psr_inhibit_get() to stop the PSR logic.
  *
  * Returns:
- * Zero on success, negative errno on failure.
+ * void.
  */
 void rockchip_drm_psr_unregister(struct drm_encoder *encoder)
 {
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_psr.h b/drivers/gpu/drm/rockchip/rockchip_drm_psr.h
index 860c62494496..17d62fcedb37 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_psr.h
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_psr.h
@@ -15,6 +15,7 @@
 #ifndef __ROCKCHIP_DRM_PSR___
 #define __ROCKCHIP_DRM_PSR___
 
+#ifdef CONFIG_ROCKCHIP_PSR
 void rockchip_drm_psr_flush_all(struct drm_device *dev);
 
 int rockchip_drm_psr_inhibit_put(struct drm_encoder *encoder);
@@ -23,5 +24,30 @@ int rockchip_drm_psr_inhibit_get(struct drm_encoder *encoder);
 int rockchip_drm_psr_register(struct drm_encoder *encoder,
 			int (*psr_set)(struct drm_encoder *, bool enable));
 void rockchip_drm_psr_unregister(struct drm_encoder *encoder);
+#else
+static inline void rockchip_drm_psr_flush_all(struct drm_device *dev)
+{
+}
+
+static inline int rockchip_drm_psr_inhibit_put(struct drm_encoder *encoder)
+{
+	return 0;
+}
+
+static inline int rockchip_drm_psr_inhibit_get(struct drm_encoder *encoder)
+{
+	return 0;
+}
+
+static inline int rockchip_drm_psr_register(struct drm_encoder *encoder,
+			int (*psr_set)(struct drm_encoder *, bool enable))
+{
+	return 0;
+}
+
+static inline void rockchip_drm_psr_unregister(struct drm_encoder *encoder)
+{
+}
+#endif
 
 #endif /* __ROCKCHIP_DRM_PSR__ */

commit 97902663a9f78ec993e70d4e2d48adec8e75973f
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Sat Aug 28 18:25:34 2021 +0800

    arm64: dts: rockchip: rk3568: Add sfc a spi4 alias
    
    Kernel's SFC is used for a private flash drivers not like
    the standard one, but u-boot SFC is register as standard
    spi, and the alias UCLASS_SPI id is required for part of
    spi initialization progress. So kernel's alias is also
    required when u-boot enable using kernel dtb case.
    
    Change-Id: Ic763eefb35ef5a93f6121055a5e04a2d72636430
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index 1f1080f8b3b7..9d76ec4ada65 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -59,6 +59,7 @@
 		spi1 = &spi1;
 		spi2 = &spi2;
 		spi3 = &spi3;
+		spi4 = &sfc; // for U-Boot
 	};
 
 	cpus {

commit 1d9acc4e67e54f38d68bcbe102b8ecaa05bc50ca
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Wed Aug 25 09:55:32 2021 +0800

    drm/rockchip: vop2: Use clipped src/dst coordinates
    
    Some linux app(cusor) may set negative coordinates(crtc_x/y)
    
    And some linux app(mpv) may set coordinates outside the screen.
    
    These are both unsupported on rockchip vop.
    
    so we use clipped coordinates here.
    
    Change-Id: I63288cf9120cea75e784d49bc88b591f243e7d8d
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 657e5e84f5bd..bcb5354a11d4 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -2804,15 +2804,6 @@ static int vop2_plane_atomic_check(struct drm_plane *plane, struct drm_plane_sta
 		return -EINVAL;
 	}
 
-	src->x1 = state->src_x;
-	src->y1 = state->src_y;
-	src->x2 = state->src_x + state->src_w;
-	src->y2 = state->src_y + state->src_h;
-	dest->x1 = state->crtc_x;
-	dest->y1 = state->crtc_y;
-
-	dest->x2 = state->crtc_x + state->crtc_w;
-	dest->y2 = state->crtc_y + state->crtc_h;
 
 	ret = drm_atomic_helper_check_plane_state(state, cstate,
 						  min_scale, max_scale,
@@ -2820,8 +2811,22 @@ static int vop2_plane_atomic_check(struct drm_plane *plane, struct drm_plane_sta
 	if (ret)
 		return ret;
 
-	if (!state->visible)
+	if (!state->visible) {
+		DRM_ERROR("%s is invisible(src: pos[%d, %d] rect[%d x %d] dst: pos[%d, %d] rect[%d x %d]\n",
+			  plane->name, state->src_x >> 16, state->src_y >> 16, state->src_w >> 16,
+			  state->src_h >> 16, state->crtc_x, state->crtc_y, state->crtc_w,
+			  state->crtc_h);
 		return 0;
+	}
+
+	src->x1 = state->src.x1;
+	src->y1 = state->src.y1;
+	src->x2 = state->src.x2;
+	src->y2 = state->src.y2;
+	dest->x1 = state->dst.x1;
+	dest->y1 = state->dst.y1;
+	dest->x2 = state->dst.x2;
+	dest->y2 = state->dst.y2;
 
 	vpstate->zpos = state->zpos;
 	vpstate->global_alpha = state->alpha >> 8;
@@ -2830,12 +2835,13 @@ static int vop2_plane_atomic_check(struct drm_plane *plane, struct drm_plane_sta
 	if (vpstate->format < 0)
 		return vpstate->format;
 
-	if (state->src_w >> 16 < 4 || state->src_h >> 16 < 4 ||
-	    state->crtc_w < 4 || state->crtc_h < 4) {
+	if (drm_rect_width(src) >> 16 < 4 || drm_rect_height(src) >> 16 < 4 ||
+	    drm_rect_width(dest) < 4 || drm_rect_width(dest) < 4) {
 		DRM_ERROR("Invalid size: %dx%d->%dx%d, min size is 4x4\n",
-			  state->src_w >> 16, state->src_h >> 16,
-			  state->crtc_w, state->crtc_h);
-		return -EINVAL;
+			  drm_rect_width(src) >> 16, drm_rect_height(src) >> 16,
+			  drm_rect_width(dest), drm_rect_height(dest));
+		state->visible = false;
+		return 0;
 	}
 
 	if (drm_rect_width(src) >> 16 > vop2_data->max_input.width ||

commit e0354482bd4be71209998097b89257ac172b9380
Author: Wyon Bi <bivvy.bi@rock-chips.com>
Date:   Tue Aug 31 17:17:04 2021 +0800

    arm64: dts: rockchip: Add rk3566-evb2-lp4x-v10-edp.dts
    
    Change-Id: Id56ca263872b42643a66dd063d541968436c4ca6
    Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/Makefile b/arch/arm64/boot/dts/rockchip/Makefile
index d5f17f05e87d..bbba4717608e 100644
--- a/arch/arm64/boot/dts/rockchip/Makefile
+++ b/arch/arm64/boot/dts/rockchip/Makefile
@@ -75,6 +75,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-evb1-ddr4-v10.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-evb1-ddr4-v10-linux.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-evb1-ddr4-v10-lvds.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-evb2-lp4x-v10.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-evb2-lp4x-v10-edp.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-evb2-lp4x-v10-eink.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-evb2-lp4x-v10-i2s-mic-array.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-evb2-lp4x-v10-linux.dtb
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10-edp.dts b/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10-edp.dts
new file mode 100644
index 000000000000..ff46637f7d6e
--- /dev/null
+++ b/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10-edp.dts
@@ -0,0 +1,81 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
+ */
+
+#include "rk3566-evb2-lp4x-v10.dtsi"
+#include "rk3568-android.dtsi"
+
+/ {
+	edp-panel {
+		compatible = "simple-panel";
+		backlight = <&backlight>;
+		power-supply = <&vcc3v3_lcd0_n>;
+		prepare-delay-ms = <120>;
+		enable-delay-ms = <120>;
+		unprepare-delay-ms = <120>;
+		disable-delay-ms = <120>;
+
+		display-timings {
+			native-mode = <&edp_timing>;
+
+			edp_timing: timing0 {
+				clock-frequency = <200000000>;
+				hactive = <1536>;
+				vactive = <2048>;
+				hfront-porch = <12>;
+				hsync-len = <16>;
+				hback-porch = <48>;
+				vfront-porch = <8>;
+				vsync-len = <4>;
+				vback-porch = <8>;
+				hsync-active = <0>;
+				vsync-active = <0>;
+				de-active = <0>;
+				pixelclk-active = <0>;
+			};
+		};
+
+		port {
+			panel_in_edp: endpoint {
+				remote-endpoint = <&edp_out_panel>;
+			};
+		};
+	};
+};
+
+&dsi0 {
+	status = "disabled";
+};
+
+&edp {
+	force-hpd;
+	status = "okay";
+
+	ports {
+		port@1 {
+			reg = <1>;
+
+			edp_out_panel: endpoint {
+				remote-endpoint = <&panel_in_edp>;
+			};
+		};
+	};
+};
+
+&edp_phy {
+	status = "okay";
+};
+
+&edp_in_vp0 {
+	status = "disabled";
+};
+
+&edp_in_vp1 {
+	status = "okay";
+};
+
+&route_edp {
+	connect = <&vp1_out_edp>;
+	status = "okay";
+};

commit c30b539aa22236e441e9462f823b2886bea52aae
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Tue Aug 31 13:50:04 2021 +0800

    media: rockchip: cif: reinit buffer status when cif reset in mipi interlace mode
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I5f691cd65badda8cedf120a155de7096de8714b5

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index 87475ebd99f4..6c0aa7d8b32d 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -1422,8 +1422,12 @@ static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
 			}
 		} else if (stream->frame_phase == CIF_CSI_FRAME1_READY) {
 			if (stream->cif_fmt_in->field == V4L2_FIELD_INTERLACED) {
-				stream->next_buf = stream->curr_buf;
-				buffer = stream->next_buf;
+				if (stream->next_buf != stream->curr_buf) {
+					stream->next_buf = stream->curr_buf;
+					buffer = stream->next_buf;
+				} else {
+					buffer = NULL;
+				}
 
 			} else {
 				stream->next_buf = list_first_entry(&stream->buf_head,
@@ -1437,10 +1441,16 @@ static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
 	} else {
 		buffer = NULL;
 		if (dummy_buf->vaddr) {
-			if (stream->frame_phase == CIF_CSI_FRAME0_READY)
+			if (stream->frame_phase == CIF_CSI_FRAME0_READY) {
 				stream->curr_buf = NULL;
-			else if (stream->frame_phase == CIF_CSI_FRAME1_READY)
-				stream->next_buf = NULL;
+			} else if (stream->frame_phase == CIF_CSI_FRAME1_READY) {
+				if (stream->cif_fmt_in->field == V4L2_FIELD_INTERLACED) {
+					stream->next_buf = stream->curr_buf;
+					buffer = stream->next_buf;
+				} else {
+					stream->next_buf = NULL;
+				}
+			}
 		} else if (stream->curr_buf != stream->next_buf) {
 			if (stream->frame_phase == CIF_CSI_FRAME0_READY) {
 				stream->curr_buf = stream->next_buf;
@@ -5304,8 +5314,22 @@ static int rkcif_do_reset_work(struct rkcif_device *cif_dev,
 	}
 
 	for (i = 0; i < j; i++) {
-		resume_stream[i]->fs_cnt_in_single_frame = 0;
-		ret = rkcif_csi_stream_start(resume_stream[i]);
+		stream = resume_stream[i];
+		stream->fs_cnt_in_single_frame = 0;
+		if (stream->cif_fmt_in->field == V4L2_FIELD_INTERLACED) {
+			if (stream->curr_buf == stream->next_buf) {
+				if (stream->curr_buf)
+					list_add_tail(&stream->curr_buf->queue, &stream->buf_head);
+			} else {
+				if (stream->curr_buf)
+					list_add_tail(&stream->curr_buf->queue, &stream->buf_head);
+				if (stream->next_buf)
+					list_add_tail(&stream->next_buf->queue, &stream->buf_head);
+			}
+			stream->curr_buf = NULL;
+			stream->next_buf = NULL;
+		}
+		ret = rkcif_csi_stream_start(stream);
 		if (ret) {
 			v4l2_err(&cif_dev->v4l2_dev, "%s:resume stream[%d] failed\n",
 				 __func__, stream->id);
@@ -5314,7 +5338,7 @@ static int rkcif_do_reset_work(struct rkcif_device *cif_dev,
 
 		v4l2_dbg(1, rkcif_debug, &cif_dev->v4l2_dev,
 			 "resume stream[%d], frm_idx:%d, csi_sof:%d\n",
-			 resume_stream[i]->id, resume_stream[i]->frame_idx,
+			 stream->id, stream->frame_idx,
 			 rkcif_csi2_get_sof());
 	}
 

commit 9df5bfa9fcb33a7ee6e3fb9eadc47c8f23a9ddc2
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Fri Aug 27 16:53:30 2021 +0800

    pinctrl: rockchip: treat pcfg_xxx nodes as invalid function nodes
    
    Look at the pinmux-functions debug node, there are several pcfg_xxx
    nodes which actually are not pinctrl functions:
    
    Under RV1126 EVB:
      function: pcfg-pull-up, groups = [ ]
      function: pcfg-pull-down, groups = [ ]
      function: pcfg-pull-none, groups = [ ]
      function: pcfg-pull-none-drv-level-1, groups = [ ]
      function: pcfg-pull-none-drv-level-2, groups = [ ]
      function: pcfg-pull-none-drv-level-3, groups = [ ]
      function: pcfg-pull-up-drv-level-1, groups = [ ]
      function: pcfg-pull-up-drv-level-2, groups = [ ]
      function: pcfg-pull-none-smt, groups = [ ]
      function: pcfg-output-low-pull-down, groups = [ ]
      function: acodec, groups = [ acodec-pins ]
    
    This patch fixs the function node valid check to ignore them.
    
    Change-Id: I432783de72e137e2fb406ce400a69cd56cb1a8de
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
index 641858b6f736..64c7e7b3cca3 100644
--- a/drivers/pinctrl/pinctrl-rockchip.c
+++ b/drivers/pinctrl/pinctrl-rockchip.c
@@ -2935,6 +2935,9 @@ static bool is_function_node(const struct device_node *np)
 	if (of_match_node(rockchip_bank_match, np))
 		return false;
 
+	if (!strncmp(np->name, "pcfg", 4))
+		return false;
+
 	return true;
 }
 

commit 295855202fc71cf908ad9c01c08b3ca1c689cfe5
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Fri Aug 27 16:50:00 2021 +0800

    pinctrl: rockchip: add function node valid check
    
    There are many kinds of nodes under pinctrl node, such as function
    nodes, gpio nodes, and pcfg nodes.
    
    The driver do a match check for the nodes, to ignore the gpio nodes.
    This patch try to put the valid check as a function, it's better to
    avoid error fix.
    
    Change-Id: Ib9295fa77240f741a0a124d3235f5e2a6e51b499
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
index f32e40496b56..641858b6f736 100644
--- a/drivers/pinctrl/pinctrl-rockchip.c
+++ b/drivers/pinctrl/pinctrl-rockchip.c
@@ -2930,13 +2930,21 @@ static const struct of_device_id rockchip_bank_match[] = {
 	{},
 };
 
+static bool is_function_node(const struct device_node *np)
+{
+	if (of_match_node(rockchip_bank_match, np))
+		return false;
+
+	return true;
+}
+
 static void rockchip_pinctrl_child_count(struct rockchip_pinctrl *info,
 						struct device_node *np)
 {
 	struct device_node *child;
 
 	for_each_child_of_node(np, child) {
-		if (of_match_node(rockchip_bank_match, child))
+		if (!is_function_node(child))
 			continue;
 
 		info->nfunctions++;
@@ -3080,7 +3088,7 @@ static int rockchip_pinctrl_parse_dt(struct platform_device *pdev,
 	i = 0;
 
 	for_each_child_of_node(np, child) {
-		if (of_match_node(rockchip_bank_match, child))
+		if (!is_function_node(child))
 			continue;
 
 		ret = rockchip_pinctrl_parse_functions(child, info, i++);

commit cb8e6654bbee55924701f28788f30654903cc171
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Wed Aug 18 15:25:05 2021 +0800

    ASoC: rk817: Move dbg message into CONFIG_SND_DEBUG
    
    $ ./scripts/bloat-o-meter rk817_codec.o.old rk817_codec.o
    add/remove: 0/3 grow/shrink: 0/15 up/down: 0/-1680 (-1680)
    Function                                     old     new   delta
    dbg_enable                                     4       -      -4
    __param_dbg_level                             20       -     -20
    __param_str_dbg_level                         24       -     -24
    rk817_probe                                  328     284     -44
    rk817_remove                                 156     108     -48
    rk817_set_dai_sysclk                          76      24     -52
    rk817_platform_shutdown                       84      32     -52
    rk817_playback_path_get                       84      28     -56
    rk817_capture_path_put                       504     444     -60
    rk817_hw_params                              464     396     -68
    rk817_digital_mute                           384     308     -76
    rk817_playback_path_put                      880     788     -92
    rk817_codec_ctl_gpio                         188      96     -92
    rk817_set_dai_fmt                            196      92    -104
    rk817_codec_power_up                         416     292    -124
    rk817_codec_power_down                       460     336    -124
    __func__                                     310      94    -216
    rk817_platform_probe                        1304     880    -424
    Total: Before=8618, After=6938, chg -19.49%
    
    Change-Id: I98471c52ea342672e10deb02c4fb38d9fb82f906
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/sound/soc/codecs/rk817_codec.c b/sound/soc/codecs/rk817_codec.c
index bc0032ece2ce..6b809ff0df22 100644
--- a/sound/soc/codecs/rk817_codec.c
+++ b/sound/soc/codecs/rk817_codec.c
@@ -26,15 +26,11 @@
 #include <sound/soc.h>
 #include "rk817_codec.h"
 
-static int dbg_enable;
-module_param_named(dbg_level, dbg_enable, int, 0644);
-
-#define DBG(args...) \
-	do { \
-		if (dbg_enable) { \
-			pr_info(args); \
-		} \
-	} while (0)
+#ifdef CONFIG_SND_DEBUG
+#define DBG(args...) pr_info(args)
+#else
+#define DBG(args...)
+#endif
 
 /* For route */
 #define RK817_CODEC_PLAYBACK	1
@@ -830,14 +826,12 @@ static int rk817_hw_params(struct snd_pcm_substream *substream,
 {
 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
 	struct snd_soc_component *component = rtd->codec_dai->component;
-	struct rk817_codec_priv *rk817 = snd_soc_component_get_drvdata(component);
 	unsigned int rate = params_rate(params);
 	unsigned char apll_cfg3_val;
 	unsigned char dtop_digen_sr_lmt0;
 	unsigned char dtop_digen_clke;
 
-	DBG("%s : MCLK = %dHz, sample rate = %dHz\n",
-	    __func__, rk817->stereo_sysclk, rate);
+	DBG("%s : sample rate = %dHz\n", __func__, rate);
 
 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
 		dtop_digen_clke = DAC_DIG_CLK_EN;

commit 2a4f54dcf330b5f09aab1b341a44c27035e3658c
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Fri Aug 27 16:24:50 2021 +0800

    media: rockchip: ispp: fix monitor switch if don't power off
    
    Change-Id: Iefe1f7df7417c84a09437d663cca3c342bf3888a
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c
index 78b2e247b5c0..e5894339da2a 100644
--- a/drivers/media/platform/rockchip/ispp/stream.c
+++ b/drivers/media/platform/rockchip/ispp/stream.c
@@ -2363,7 +2363,6 @@ static void restart_module(struct rkispp_device *dev)
 	v4l2_dbg(1, rkispp_debug, &dev->v4l2_dev,
 		 "%s enter\n", __func__);
 	if (dev->ispp_sdev.state == ISPP_STOP || monitor->retry > 3) {
-		monitor->is_en = false;
 		monitor->is_restart = false;
 		goto end;
 	}
@@ -2371,7 +2370,6 @@ static void restart_module(struct rkispp_device *dev)
 		wait_for_completion_timeout(&monitor->cmpl,
 					    msecs_to_jiffies(500));
 	if (dev->ispp_sdev.state == ISPP_STOP) {
-		monitor->is_en = false;
 		monitor->is_restart = false;
 		goto end;
 	}
@@ -2456,7 +2454,7 @@ static void restart_monitor(struct work_struct *work)
 
 	v4l2_dbg(1, rkispp_debug, &dev->v4l2_dev,
 		 "%s module:0x%x enter\n", __func__, m_monitor->module);
-	while (monitor->is_en) {
+	while (monitor->is_en && dev->ispp_sdev.state != ISPP_STOP) {
 		/* max timeout for module idle */
 		time = MAX_SCHEDULE_TIMEOUT;
 		if (monitor->monitoring_module & m_monitor->module)
@@ -2466,7 +2464,7 @@ static void restart_monitor(struct work_struct *work)
 		if (!(monitor->monitoring_module & m_monitor->module) ||
 		    ret || !monitor->is_en)
 			continue;
-		if (dev->hw_dev->is_shutdown)
+		if (dev->hw_dev->is_shutdown || dev->ispp_sdev.state == ISPP_STOP)
 			break;
 		v4l2_dbg(1, rkispp_debug, &dev->v4l2_dev,
 			 "module:0x%x wait %ldms timeout ret:%d, monitoring:0x%x\n",

commit 81abdf229b7e658684dab77895f8b9059e042922
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Fri Aug 27 15:58:53 2021 +0800

    media: rockchip: isp: check the output status of statistics v2x
    
    Change-Id: If6076b93b37112ab28c58b6ffabe5770fc847cb8
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v2x.c b/drivers/media/platform/rockchip/isp/isp_stats_v2x.c
index 6e458a571b18..06ae8859af55 100644
--- a/drivers/media/platform/rockchip/isp/isp_stats_v2x.c
+++ b/drivers/media/platform/rockchip/isp/isp_stats_v2x.c
@@ -55,14 +55,18 @@ rkisp_stats_get_siawb_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 		ISP2X_SIAWB_GET_MEAN_Y_G(reg_val);
 }
 
-static void
+static int
 rkisp_stats_get_rawawb_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 				struct rkisp_isp2x_stat_buffer *pbuf)
 {
 	u64 msb, lsb;
-	u32 value;
+	u32 ctrl;
 	int i;
 
+	ctrl = rkisp_read(stats_vdev->dev, ISP_RAWAWB_CTRL, true);
+	if (!(ctrl & ISP2X_3A_MEAS_DONE))
+		return -ENODATA;
+
 	if (!pbuf)
 		goto out;
 
@@ -155,9 +159,8 @@ rkisp_stats_get_rawawb_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 	}
 
 out:
-	value = rkisp_read(stats_vdev->dev, ISP_RAWAWB_CTRL, true);
-	value |= ISP2X_3A_MEAS_DONE;
-	rkisp_write(stats_vdev->dev, ISP_RAWAWB_CTRL, value, true);
+	rkisp_write(stats_vdev->dev, ISP_RAWAWB_CTRL, ctrl, true);
+	return 0;
 }
 
 static void
@@ -180,15 +183,19 @@ rkisp_stats_get_siaf_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 	af->win[2].lum = rkisp_read(stats_vdev->dev, ISP_AFM_LUM_C, true);
 }
 
-static void
+static int
 rkisp_stats_get_rawaf_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 			       struct rkisp_isp2x_stat_buffer *pbuf)
 {
 	struct isp2x_rawaf_stat *af;
-	u32 value, read_line;
+	u32 value, read_line, ctrl;
 	u32 line_num[ISP2X_RAWAF_LINE_NUM + 1];
 	int i;
 
+	ctrl = rkisp_read(stats_vdev->dev, ISP_RAWAF_CTRL, true);
+	if (!(ctrl & ISP2X_3A_MEAS_DONE))
+		return -ENODATA;
+
 	if (!pbuf)
 		goto out;
 
@@ -224,19 +231,22 @@ rkisp_stats_get_rawaf_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 		af->ramdata[i] = rkisp_read(stats_vdev->dev, ISP_RAWAF_RAM_DATA, true);
 
 out:
-	value = rkisp_read(stats_vdev->dev, ISP_RAWAF_CTRL, true);
-	value |= ISP2X_3A_MEAS_DONE;
-	rkisp_write(stats_vdev->dev, ISP_RAWAF_CTRL, value, true);
+	rkisp_write(stats_vdev->dev, ISP_RAWAF_CTRL, ctrl, true);
 	rkisp_write(stats_vdev->dev, ISP_RAWAF_INT_STATE, 0, true);
+	return 0;
 }
 
-static void
+static int
 rkisp_stats_get_yuvae_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 			       struct rkisp_isp2x_stat_buffer *pbuf)
 {
-	u32 value;
+	u32 value, ctrl;
 	int i;
 
+	ctrl = rkisp_read(stats_vdev->dev, ISP_YUVAE_CTRL, true);
+	if (!(ctrl & ISP2X_3A_MEAS_DONE))
+		return -ENODATA;
+
 	if (!pbuf)
 		goto out;
 
@@ -256,9 +266,8 @@ rkisp_stats_get_yuvae_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 			rkisp_read(stats_vdev->dev, ISP_YUVAE_WND1_SUMY + 4 * i, true);
 
 out:
-	value = rkisp_read(stats_vdev->dev, ISP_YUVAE_CTRL, true);
-	value |= ISP2X_3A_MEAS_DONE;
-	rkisp_write(stats_vdev->dev, ISP_YUVAE_CTRL, value, true);
+	rkisp_write(stats_vdev->dev, ISP_YUVAE_CTRL, ctrl, true);
+	return 0;
 }
 
 static void
@@ -284,11 +293,11 @@ rkisp_stats_get_sihst_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 	}
 }
 
-static void
+static int
 rkisp_stats_get_rawaebig_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 				  struct isp2x_rawaebig_stat *ae, u32 blk_no)
 {
-	u32 addr, value;
+	u32 addr, value, ctrl;
 	int i;
 
 	switch (blk_no) {
@@ -306,6 +315,10 @@ rkisp_stats_get_rawaebig_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 		break;
 	}
 
+	ctrl = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_CTRL, true);
+	if (!(ctrl & ISP2X_3A_MEAS_DONE))
+		return -ENODATA;
+
 	if (!ae)
 		goto out;
 
@@ -326,16 +339,15 @@ rkisp_stats_get_rawaebig_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 	}
 
 out:
-	value = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_CTRL, true);
-	value |= ISP2X_3A_MEAS_DONE;
-	rkisp_write(stats_vdev->dev, addr + RAWAE_BIG_CTRL, value, true);
+	rkisp_write(stats_vdev->dev, addr + RAWAE_BIG_CTRL, ctrl, true);
+	return 0;
 }
 
-static void
+static int
 rkisp_stats_get_rawhstbig_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 				   struct isp2x_rawhistbig_stat *hst, u32 blk_no)
 {
-	u32 addr, value;
+	u32 addr, ctrl;
 	int i;
 
 	switch (blk_no) {
@@ -353,6 +365,10 @@ rkisp_stats_get_rawhstbig_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 		break;
 	}
 
+	ctrl = rkisp_read(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, true);
+	if (!(ctrl & ISP2X_3A_MEAS_DONE))
+		return -ENODATA;
+
 	if (!hst)
 		goto out;
 
@@ -361,87 +377,129 @@ rkisp_stats_get_rawhstbig_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 					      addr + ISP_RAWHIST_BIG_RO_BASE_BIN, true);
 
 out:
-	value = rkisp_read(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, true);
-	value |= ISP2X_3A_MEAS_DONE;
-	rkisp_write(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, value, true);
+	rkisp_write(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, ctrl, true);
+	return 0;
 }
 
-static void
+static int
 rkisp_stats_get_rawae1_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 				struct rkisp_isp2x_stat_buffer *pbuf)
 {
-	if (!pbuf)
+	int ret = 0;
+
+	if (!pbuf) {
 		rkisp_stats_get_rawaebig_meas_reg(stats_vdev, NULL, 1);
-	else
-		rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae1, 1);
+	} else {
+		ret = rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae1, 1);
+		if (!ret)
+			pbuf->meas_type |= ISP2X_STAT_RAWAE1;
+	}
+
+	return ret;
 }
 
-static void
+static int
 rkisp_stats_get_rawhst1_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 				 struct rkisp_isp2x_stat_buffer *pbuf)
 {
-	if (!pbuf)
+	int ret = 0;
+
+	if (!pbuf) {
 		rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, NULL, 1);
-	else
-		rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist1, 1);
+	} else {
+		ret = rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist1, 1);
+		if (!ret)
+			pbuf->meas_type |= ISP2X_STAT_RAWHST1;
+	}
+
+	return ret;
 }
 
-static void
+static int
 rkisp_stats_get_rawae2_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 				struct rkisp_isp2x_stat_buffer *pbuf)
 {
-	if (!pbuf)
+	int ret = 0;
+
+	if (!pbuf) {
 		rkisp_stats_get_rawaebig_meas_reg(stats_vdev, NULL, 2);
-	else
+	} else {
 		rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae2, 2);
+		if (!ret)
+			pbuf->meas_type |= ISP2X_STAT_RAWAE2;
+	}
+
+	return ret;
 }
 
-static void
+static int
 rkisp_stats_get_rawhst2_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 				 struct rkisp_isp2x_stat_buffer *pbuf)
 {
-	if (!pbuf)
+	int ret = 0;
+
+	if (!pbuf) {
 		rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, NULL, 2);
-	else
-		rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist2, 2);
+	} else {
+		ret = rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist2, 2);
+		if (!ret)
+			pbuf->meas_type |= ISP2X_STAT_RAWHST2;
+	}
+
+	return ret;
 }
 
-static void
+static int
 rkisp_stats_get_rawae3_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 				struct rkisp_isp2x_stat_buffer *pbuf)
 {
-	if (!pbuf)
+	int ret = 0;
+
+	if (!pbuf) {
 		rkisp_stats_get_rawaebig_meas_reg(stats_vdev, NULL, 0);
-	else
-		rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae3, 0);
+	} else {
+		ret = rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae3, 0);
+		if (!ret)
+			pbuf->meas_type |= ISP2X_STAT_RAWAE3;
+	}
+
+	return ret;
 }
 
-static void
+static int
 rkisp_stats_get_rawhst3_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 				 struct rkisp_isp2x_stat_buffer *pbuf)
 {
-	if (!pbuf)
+	int ret = 0;
+
+	if (!pbuf) {
 		rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, NULL, 0);
-	else
-		rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist3, 0);
+	} else {
+		ret = rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist3, 0);
+		if (!ret)
+			pbuf->meas_type |= ISP2X_STAT_RAWHST3;
+	}
+
+	return ret;
 }
 
-static void
+static int
 rkisp_stats_get_rawaelite_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 				   struct rkisp_isp2x_stat_buffer *pbuf)
 {
 	struct isp2x_rawaelite_stat *ae;
-	u32 value;
+	u32 value, ctrl;
 	int i;
 
+	ctrl = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true);
+	if (!(ctrl & ISP2X_3A_MEAS_DONE))
+		return -ENODATA;
+
 	if (!pbuf)
 		goto out;
 
+	pbuf->meas_type |= ISP2X_STAT_RAWAE0;
 	ae = &pbuf->params.rawae0;
-	value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true);
-
-	if ((value & ISP2X_3A_MEAS_DONE) == 0)
-		return;
 
 	for (i = 0; i < ISP2X_RAWAELITE_MEAN_NUM; i++) {
 		value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_RO_MEAN + 4 * i, true);
@@ -451,30 +509,33 @@ rkisp_stats_get_rawaelite_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 	}
 
 out:
-	value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true);
-	value |= ISP2X_3A_MEAS_DONE;
-	rkisp_write(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, value, true);
+	rkisp_write(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, ctrl, true);
+	return 0;
 }
 
-static void
+static int
 rkisp_stats_get_rawhstlite_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
 				    struct rkisp_isp2x_stat_buffer *pbuf)
 {
 	struct isp2x_rawhistlite_stat *hst;
-	u32 value;
+	u32 ctrl;
 	int i;
 
+	ctrl = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, true);
+	if (!(ctrl & ISP2X_3A_MEAS_DONE))
+		return -ENODATA;
+
 	if (!pbuf)
 		goto out;
 
+	pbuf->meas_type |= ISP2X_STAT_RAWHST0;
 	hst = &pbuf->params.rawhist0;
 	for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++)
 		hst->hist_bin[i] = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_RO_BASE_BIN, true);
 
 out:
-	value = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, true);
-	value |= ISP2X_3A_MEAS_DONE;
-	rkisp_write(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, value, true);
+	rkisp_write(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, ctrl, true);
+	return 0;
 }
 
 static void
@@ -662,7 +723,7 @@ rkisp_stats_get_siawb_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 		ISP2X_SIAWB_GET_MEAN_Y_G(reg_val);
 }
 
-static void
+static int
 rkisp_stats_get_rawawb_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 				struct rkisp_isp2x_stat_buffer *pbuf)
 {
@@ -672,7 +733,7 @@ rkisp_stats_get_rawawb_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 	u32 i;
 
 	if (!pbuf)
-		goto OUT;
+		goto out;
 
 	pbuf->meas_type |= ISP2X_STAT_RAWAWB;
 
@@ -769,10 +830,11 @@ rkisp_stats_get_rawawb_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 	pbuf->params.rawawb.ramdata[2 * i].r = (msb & 0x3FFFF0) >> 4;
 	pbuf->params.rawawb.ramdata[2 * i].wp = (msb & 0x01C00000) >> 22;
 
-OUT:
+out:
 	value = rkisp_read(stats_vdev->dev, ISP_RAWAWB_CTRL, true);
 	value |= ISP2X_3A_MEAS_DONE;
 	rkisp_write(stats_vdev->dev, ISP_RAWAWB_CTRL, value, true);
+	return 0;
 }
 
 static void
@@ -799,7 +861,7 @@ rkisp_stats_get_siaf_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 	af->win[2].lum = ddr_addr[6];
 }
 
-static void
+static int
 rkisp_stats_get_rawaf_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 			       struct rkisp_isp2x_stat_buffer *pbuf)
 {
@@ -809,7 +871,7 @@ rkisp_stats_get_rawaf_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 	int i;
 
 	if (!pbuf)
-		goto OUT;
+		goto out;
 
 	af = &pbuf->params.rawaf;
 	pbuf->meas_type |= ISP2X_STAT_RAWAF;
@@ -826,14 +888,15 @@ rkisp_stats_get_rawaf_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 	for (i = 0; i < ISP2X_RAWAF_SUMDATA_ROW * ISP2X_RAWAF_SUMDATA_COLUMN; i++)
 		af->ramdata[i] = ddr_addr[i];
 
-OUT:
+out:
 	value = rkisp_read(stats_vdev->dev, ISP_RAWAF_CTRL, true);
 	value |= ISP2X_3A_MEAS_DONE;
 	rkisp_write(stats_vdev->dev, ISP_RAWAF_CTRL, value, true);
 	rkisp_write(stats_vdev->dev, ISP_RAWAF_INT_STATE, 0, true);
+	return 0;
 }
 
-static void
+static int
 rkisp_stats_get_yuvae_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 			       struct rkisp_isp2x_stat_buffer *pbuf)
 {
@@ -842,7 +905,7 @@ rkisp_stats_get_yuvae_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 	int i;
 
 	if (!pbuf)
-		goto OUT;
+		goto out;
 
 	pbuf->meas_type |= ISP2X_STAT_YUVAE;
 
@@ -862,10 +925,11 @@ rkisp_stats_get_yuvae_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 		pbuf->params.yuvae.ro_yuvae_sumy[i] =
 			rkisp_read(stats_vdev->dev, ISP_YUVAE_WND1_SUMY + 4 * i, true);
 
-OUT:
+out:
 	value = rkisp_read(stats_vdev->dev, ISP_YUVAE_CTRL, true);
 	value |= ISP2X_3A_MEAS_DONE;
 	rkisp_write(stats_vdev->dev, ISP_YUVAE_CTRL, value, true);
+	return 0;
 }
 
 static void
@@ -896,7 +960,7 @@ rkisp_stats_get_sihst_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 	}
 }
 
-static void
+static int
 rkisp_stats_get_rawaebig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 				  struct isp2x_rawaebig_stat *ae, u32 blk_no)
 {
@@ -923,7 +987,7 @@ rkisp_stats_get_rawaebig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 	}
 
 	if (!ae)
-		goto OUT;
+		goto out;
 
 	for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
 		ae->sumr[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMR + i * 4, true);
@@ -941,13 +1005,14 @@ rkisp_stats_get_rawaebig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 		ae->data[i].channelr_xy = ISP2X_RAWAEBIG_GET_MEAN_R(value);
 	}
 
-OUT:
+out:
 	value = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_CTRL, true);
 	value |= ISP2X_3A_MEAS_DONE;
 	rkisp_write(stats_vdev->dev, addr + RAWAE_BIG_CTRL, value, true);
+	return 0;
 }
 
-static void
+static int
 rkisp_stats_get_rawhstbig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 				   struct isp2x_rawhistbig_stat *hst, u32 blk_no)
 {
@@ -974,78 +1039,121 @@ rkisp_stats_get_rawhstbig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 	}
 
 	if (!hst)
-		goto OUT;
+		goto out;
 
 	for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++)
 		hst->hist_bin[i] = ddr_addr[i];
 
-OUT:
+out:
 	value = rkisp_read(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, true);
 	value |= ISP2X_3A_MEAS_DONE;
 	rkisp_write(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, value, true);
+	return 0;
 }
 
-static void
+static int
 rkisp_stats_get_rawae1_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 				struct rkisp_isp2x_stat_buffer *pbuf)
 {
-	if (!pbuf)
+	int ret = 0;
+
+	if (!pbuf) {
 		rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 1);
-	else
-		rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae1, 1);
+	} else {
+		ret = rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae1, 1);
+		if (!ret)
+			pbuf->meas_type |= ISP2X_STAT_RAWAE1;
+	}
+
+	return ret;
 }
 
-static void
+static int
 rkisp_stats_get_rawhst1_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 				 struct rkisp_isp2x_stat_buffer *pbuf)
 {
-	if (!pbuf)
+	int ret = 0;
+
+	if (!pbuf) {
 		rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 1);
-	else
-		rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist1, 1);
+	} else {
+		ret = rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist1, 1);
+		if (!ret)
+			pbuf->meas_type |= ISP2X_STAT_RAWHST1;
+	}
+
+	return ret;
 }
 
-static void
+static int
 rkisp_stats_get_rawae2_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 				struct rkisp_isp2x_stat_buffer *pbuf)
 {
-	if (!pbuf)
+	int ret = 0;
+
+	if (!pbuf) {
 		rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 2);
-	else
-		rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae2, 2);
+	} else {
+		ret = rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae2, 2);
+		if (!ret)
+			pbuf->meas_type |= ISP2X_STAT_RAWAE2;
+	}
+
+	return ret;
 }
 
-static void
+static int
 rkisp_stats_get_rawhst2_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 				 struct rkisp_isp2x_stat_buffer *pbuf)
 {
-	if (!pbuf)
+	int ret = 0;
+
+	if (!pbuf) {
 		rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 2);
-	else
-		rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist2, 2);
+	} else {
+		ret = rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist2, 2);
+		if (!ret)
+			pbuf->meas_type |= ISP2X_STAT_RAWHST2;
+	}
+
+	return ret;
 }
 
-static void
+static int
 rkisp_stats_get_rawae3_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 				struct rkisp_isp2x_stat_buffer *pbuf)
 {
-	if (!pbuf)
+	int ret = 0;
+
+	if (!pbuf) {
 		rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 0);
-	else
+	} else {
 		rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae3, 0);
+		if (!ret)
+			pbuf->meas_type |= ISP2X_STAT_RAWAE3;
+	}
+
+	return ret;
 }
 
-static void
+static int
 rkisp_stats_get_rawhst3_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 				 struct rkisp_isp2x_stat_buffer *pbuf)
 {
-	if (!pbuf)
+	int ret = 0;
+
+	if (!pbuf) {
 		rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 0);
-	else
-		rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist3, 0);
+	} else {
+		ret = rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist3, 0);
+		if (!ret)
+			pbuf->meas_type |= ISP2X_STAT_RAWHST3;
+	}
+
+	return ret;
 }
 
-static void
+static int
 rkisp_stats_get_rawaelite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 				   struct rkisp_isp2x_stat_buffer *pbuf)
 {
@@ -1055,13 +1163,10 @@ rkisp_stats_get_rawaelite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 	int i;
 
 	if (!pbuf)
-		goto OUT;
+		goto out;
 
+	pbuf->meas_type |= ISP2X_STAT_RAWAE0;
 	ae = &pbuf->params.rawae0;
-	value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true);
-	if ((value & ISP2X_3A_MEAS_DONE) == 0)
-		return;
-
 	rd_buf_idx = stats_vdev->rd_buf_idx;
 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x0AB0;
 	for (i = 0; i < ISP2X_RAWAELITE_MEAN_NUM; i++) {
@@ -1071,13 +1176,14 @@ rkisp_stats_get_rawaelite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 		ae->data[i].channelr_xy = ISP2X_RAWAEBIG_GET_MEAN_R(value);
 	}
 
-OUT:
+out:
 	value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true);
 	value |= ISP2X_3A_MEAS_DONE;
 	rkisp_write(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, value, true);
+	return 0;
 }
 
-static void
+static int
 rkisp_stats_get_rawhstlite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 				    struct rkisp_isp2x_stat_buffer *pbuf)
 {
@@ -1087,8 +1193,9 @@ rkisp_stats_get_rawhstlite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 	int i;
 
 	if (!pbuf)
-		goto OUT;
+		goto out;
 
+	pbuf->meas_type |= ISP2X_STAT_RAWHST0;
 	hst = &pbuf->params.rawhist0;
 
 	rd_buf_idx = stats_vdev->rd_buf_idx;
@@ -1097,10 +1204,11 @@ rkisp_stats_get_rawhstlite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 	for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++)
 		hst->hist_bin[i] = ddr_addr[i];
 
-OUT:
+out:
 	value = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, true);
 	value |= ISP2X_3A_MEAS_DONE;
 	rkisp_write(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, value, true);
+	return 0;
 }
 
 static struct rkisp_stats_v2x_ops __maybe_unused rkisp_stats_ddr_ops_v2x = {
@@ -1129,14 +1237,15 @@ rkisp_stats_send_meas_v2x(struct rkisp_isp_stats_vdev *stats_vdev,
 {
 	unsigned int cur_frame_id = -1;
 	struct rkisp_isp2x_stat_buffer *cur_stat_buf = NULL;
-	struct rkisp_buffer *cur_buf = NULL;
+	struct rkisp_buffer *cur_buf = stats_vdev->cur_buf;
 	struct rkisp_stats_v2x_ops *ops =
 		(struct rkisp_stats_v2x_ops *)stats_vdev->priv_ops;
+	int ret = 0;
 
 	cur_frame_id = meas_work->frame_id;
 	spin_lock(&stats_vdev->rd_lock);
 	/* get one empty buffer */
-	if (!list_empty(&stats_vdev->stat)) {
+	if (!cur_buf && !list_empty(&stats_vdev->stat)) {
 		cur_buf = list_first_entry(&stats_vdev->stat,
 					   struct rkisp_buffer, queue);
 		list_del(&cur_buf->queue);
@@ -1149,18 +1258,11 @@ rkisp_stats_send_meas_v2x(struct rkisp_isp_stats_vdev *stats_vdev,
 		cur_stat_buf->frame_id = cur_frame_id;
 	}
 
-	if (meas_work->isp_ris & ISP2X_SIAWB_DONE) {
+	if (meas_work->isp_ris & ISP2X_SIAWB_DONE)
 		ops->get_siawb_meas(stats_vdev, cur_stat_buf);
 
-		if (cur_stat_buf)
-			cur_stat_buf->meas_type |= ISP2X_STAT_SIAWB;
-	}
-
-	if (meas_work->isp_ris & ISP2X_SIAF_FIN) {
+	if (meas_work->isp_ris & ISP2X_SIAF_FIN)
 		ops->get_siaf_meas(stats_vdev, cur_stat_buf);
-		if (cur_stat_buf)
-			cur_stat_buf->meas_type |= ISP2X_STAT_SIAF;
-	}
 
 	if (meas_work->isp_ris & ISP2X_AFM_SUM_OF)
 		v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
@@ -1170,29 +1272,17 @@ rkisp_stats_send_meas_v2x(struct rkisp_isp_stats_vdev *stats_vdev,
 		v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
 			  "ISP2X_AFM_LUM_OF\n");
 
-	if (meas_work->isp_ris & ISP2X_YUVAE_END) {
-		ops->get_yuvae_meas(stats_vdev, cur_stat_buf);
-		if (cur_stat_buf)
-			cur_stat_buf->meas_type |= ISP2X_STAT_YUVAE;
-	}
+	if (meas_work->isp_ris & ISP2X_YUVAE_END)
+		ret |= ops->get_yuvae_meas(stats_vdev, cur_stat_buf);
 
-	if (meas_work->isp_ris & ISP2X_SIHST_RDY) {
+	if (meas_work->isp_ris & ISP2X_SIHST_RDY)
 		ops->get_sihst_meas(stats_vdev, cur_stat_buf);
-		if (cur_stat_buf)
-			cur_stat_buf->meas_type |= ISP2X_STAT_SIHST;
-	}
 
-	if (meas_work->isp3a_ris & ISP2X_3A_RAWAWB) {
-		ops->get_rawawb_meas(stats_vdev, cur_stat_buf);
-		if (cur_stat_buf)
-			cur_stat_buf->meas_type |= ISP2X_STAT_RAWAWB;
-	}
+	if (meas_work->isp3a_ris & ISP2X_3A_RAWAWB)
+		ret |= ops->get_rawawb_meas(stats_vdev, cur_stat_buf);
 
-	if (meas_work->isp3a_ris & ISP2X_3A_RAWAF) {
-		ops->get_rawaf_meas(stats_vdev, cur_stat_buf);
-		if (cur_stat_buf)
-			cur_stat_buf->meas_type |= ISP2X_STAT_RAWAF;
-	}
+	if (meas_work->isp3a_ris & ISP2X_3A_RAWAF)
+		ret |= ops->get_rawaf_meas(stats_vdev, cur_stat_buf);
 
 	if (meas_work->isp3a_ris & ISP2X_3A_RAWAF_SUM)
 		v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
@@ -1202,53 +1292,29 @@ rkisp_stats_send_meas_v2x(struct rkisp_isp_stats_vdev *stats_vdev,
 		v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
 			  "ISP2X_3A_RAWAF_LUM\n");
 
-	if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_BIG) {
-		ops->get_rawae3_meas(stats_vdev, cur_stat_buf);
-		if (cur_stat_buf)
-			cur_stat_buf->meas_type |= ISP2X_STAT_RAWAE3;
-	}
+	if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_BIG)
+		ret |= ops->get_rawae3_meas(stats_vdev, cur_stat_buf);
 
-	if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_BIG) {
-		ops->get_rawhst3_meas(stats_vdev, cur_stat_buf);
-		if (cur_stat_buf)
-			cur_stat_buf->meas_type |= ISP2X_STAT_RAWHST3;
-	}
+	if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_BIG)
+		ret |= ops->get_rawhst3_meas(stats_vdev, cur_stat_buf);
 
-	if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH0) {
-		ops->get_rawae0_meas(stats_vdev, cur_stat_buf);
-		if (cur_stat_buf)
-			cur_stat_buf->meas_type |= ISP2X_STAT_RAWAE0;
-	}
+	if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH0)
+		ret |= ops->get_rawae0_meas(stats_vdev, cur_stat_buf);
 
-	if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH1) {
-		ops->get_rawae1_meas(stats_vdev, cur_stat_buf);
-		if (cur_stat_buf)
-			cur_stat_buf->meas_type |= ISP2X_STAT_RAWAE1;
-	}
+	if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH1)
+		ret |= ops->get_rawae1_meas(stats_vdev, cur_stat_buf);
 
-	if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH2) {
-		ops->get_rawae2_meas(stats_vdev, cur_stat_buf);
-		if (cur_stat_buf)
-			cur_stat_buf->meas_type |= ISP2X_STAT_RAWAE2;
-	}
+	if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH2)
+		ret |= ops->get_rawae2_meas(stats_vdev, cur_stat_buf);
 
-	if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH0) {
-		ops->get_rawhst0_meas(stats_vdev, cur_stat_buf);
-		if (cur_stat_buf)
-			cur_stat_buf->meas_type |= ISP2X_STAT_RAWHST0;
-	}
+	if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH0)
+		ret |= ops->get_rawhst0_meas(stats_vdev, cur_stat_buf);
 
-	if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH1) {
-		ops->get_rawhst1_meas(stats_vdev, cur_stat_buf);
-		if (cur_stat_buf)
-			cur_stat_buf->meas_type |= ISP2X_STAT_RAWHST1;
-	}
+	if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH1)
+		ret |= ops->get_rawhst1_meas(stats_vdev, cur_stat_buf);
 
-	if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH2) {
-		ops->get_rawhst2_meas(stats_vdev, cur_stat_buf);
-		if (cur_stat_buf)
-			cur_stat_buf->meas_type |= ISP2X_STAT_RAWHST2;
-	}
+	if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH2)
+		ret |= ops->get_rawhst2_meas(stats_vdev, cur_stat_buf);
 
 	if (meas_work->isp_ris & ISP2X_FRAME) {
 		ops->get_bls_stats(stats_vdev, cur_stat_buf);
@@ -1256,7 +1322,7 @@ rkisp_stats_send_meas_v2x(struct rkisp_isp_stats_vdev *stats_vdev,
 		ops->get_dhaz_stats(stats_vdev, cur_stat_buf);
 	}
 
-	if (cur_buf) {
+	if (cur_buf && !ret) {
 		bool reg_withstream = false;
 		struct v4l2_subdev *sd = v4l2_get_subdev_hostdata(&stats_vdev->dev->br_dev.sd);
 
@@ -1273,7 +1339,9 @@ rkisp_stats_send_meas_v2x(struct rkisp_isp_stats_vdev *stats_vdev,
 				memcpy(tmp_statsbuf, cur_stat_buf, sizeof(*cur_stat_buf));
 		}
 		vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
+		cur_buf = NULL;
 	}
+	stats_vdev->cur_buf = cur_buf;
 }
 
 static void
@@ -1379,7 +1447,7 @@ rkisp_stats_isr_v2x(struct rkisp_isp_stats_vdev *stats_vdev,
 	if ((isp_ris & ISP2X_FRAME) && stats_vdev->rd_stats_from_ddr) {
 		wr_buf_idx = stats_vdev->wr_buf_idx;
 		stats_vdev->rd_buf_idx = wr_buf_idx;
-
+		rkisp_finish_buffer(dev, &stats_vdev->stats_buf[wr_buf_idx]);
 		wr_buf_idx = (wr_buf_idx + 1) % RKISP_STATS_DDR_BUF_NUM;
 		stats_vdev->wr_buf_idx = wr_buf_idx;
 		rkisp_write(stats_vdev->dev, MI_DBR_WR_SIZE,
@@ -1408,18 +1476,7 @@ rkisp_stats_isr_v2x(struct rkisp_isp_stats_vdev *stats_vdev,
 		work.isp3a_ris = temp_isp3a_ris | iq_3a_mask;
 		work.timestamp = ktime_get_ns();
 
-		if (!IS_HDR_RDBK(dev->hdr.op_mode)) {
-			if (!kfifo_is_full(&stats_vdev->rd_kfifo))
-				kfifo_in(&stats_vdev->rd_kfifo,
-					 &work, sizeof(work));
-			else
-				v4l2_err(stats_vdev->vnode.vdev.v4l2_dev,
-					 "stats kfifo is full\n");
-
-			tasklet_schedule(&stats_vdev->rd_tasklet);
-		} else {
-			rkisp_stats_send_meas_v2x(stats_vdev, &work);
-		}
+		rkisp_stats_send_meas_v2x(stats_vdev, &work);
 	}
 
 	/*
diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v2x.h b/drivers/media/platform/rockchip/isp/isp_stats_v2x.h
index 40850f1c14bb..9d04fbcb823a 100644
--- a/drivers/media/platform/rockchip/isp/isp_stats_v2x.h
+++ b/drivers/media/platform/rockchip/isp/isp_stats_v2x.h
@@ -16,38 +16,38 @@ struct rkisp_isp_stats_vdev;
 struct rkisp_stats_v2x_ops {
 	void (*get_siawb_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
 			       struct rkisp_isp2x_stat_buffer *pbuf);
-	void (*get_rawawb_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
-				struct rkisp_isp2x_stat_buffer *pbuf);
+	int (*get_rawawb_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
+			       struct rkisp_isp2x_stat_buffer *pbuf);
 
 	void (*get_siaf_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
 			      struct rkisp_isp2x_stat_buffer *pbuf);
-	void (*get_rawaf_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
-			       struct rkisp_isp2x_stat_buffer *pbuf);
+	int (*get_rawaf_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
+			      struct rkisp_isp2x_stat_buffer *pbuf);
 
-	void (*get_yuvae_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
-			       struct rkisp_isp2x_stat_buffer *pbuf);
+	int (*get_yuvae_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
+			      struct rkisp_isp2x_stat_buffer *pbuf);
 	void (*get_sihst_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
 			       struct rkisp_isp2x_stat_buffer *pbuf);
 
-	void (*get_rawae0_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
+	int (*get_rawae0_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
+			       struct rkisp_isp2x_stat_buffer *pbuf);
+	int (*get_rawhst0_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
 				struct rkisp_isp2x_stat_buffer *pbuf);
-	void (*get_rawhst0_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
-				 struct rkisp_isp2x_stat_buffer *pbuf);
 
-	void (*get_rawae1_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
+	int (*get_rawae1_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
+			       struct rkisp_isp2x_stat_buffer *pbuf);
+	int (*get_rawhst1_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
 				struct rkisp_isp2x_stat_buffer *pbuf);
-	void (*get_rawhst1_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
-				 struct rkisp_isp2x_stat_buffer *pbuf);
 
-	void (*get_rawae2_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
+	int (*get_rawae2_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
+			       struct rkisp_isp2x_stat_buffer *pbuf);
+	int (*get_rawhst2_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
 				struct rkisp_isp2x_stat_buffer *pbuf);
-	void (*get_rawhst2_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
-				 struct rkisp_isp2x_stat_buffer *pbuf);
 
-	void (*get_rawae3_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
+	int (*get_rawae3_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
+			       struct rkisp_isp2x_stat_buffer *pbuf);
+	int (*get_rawhst3_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
 				struct rkisp_isp2x_stat_buffer *pbuf);
-	void (*get_rawhst3_meas)(struct rkisp_isp_stats_vdev *stats_vdev,
-				 struct rkisp_isp2x_stat_buffer *pbuf);
 
 	void (*get_bls_stats)(struct rkisp_isp_stats_vdev *stats_vdev,
 			      struct rkisp_isp2x_stat_buffer *pbuf);

commit 834f43e2bae41f205a7be69b067d6016b00eaeb7
Author: Damon Ding <damon.ding@rock-chips.com>
Date:   Mon Aug 30 15:33:10 2021 +0800

    ARM: rv1126_defconfig: Enable CONFIG_DRM_PANEL_SIMPLE_OF_ONLY
    
    Select DRM_PANEL_SIMPLE_OF_ONLY as default on RV1126 SoC, so as to
    reduce memory usage.
    
    make ARCH=arm rv1126_defconfig
    make ARCH=arm rv1126-evb-ddr3-v13.img -j32
    
    ./ksize.sh  drivers/gpu/drm/
    
    before ksize: 556038 Bytes
    after  kszie: 517946 Bytes
    save   about: 38092  Bytes
    
    Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
    Change-Id: I9584bd8de16ed0ef1c4a862e71a1eb725c0d2833

diff --git a/arch/arm/configs/rv1126_defconfig b/arch/arm/configs/rv1126_defconfig
index 176351715cc6..fca1551ad5af 100644
--- a/arch/arm/configs/rv1126_defconfig
+++ b/arch/arm/configs/rv1126_defconfig
@@ -226,6 +226,7 @@ CONFIG_DRM_ROCKCHIP=y
 CONFIG_ROCKCHIP_DW_MIPI_DSI=y
 CONFIG_ROCKCHIP_RGB=y
 CONFIG_DRM_PANEL_SIMPLE=y
+CONFIG_DRM_PANEL_SIMPLE_OF_ONLY=y
 CONFIG_BACKLIGHT_LCD_SUPPORT=y
 # CONFIG_LCD_CLASS_DEVICE is not set
 CONFIG_BACKLIGHT_CLASS_DEVICE=y

commit 04a1a8eff9a416e8357d5669c90f96b20bbedadb
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Tue Aug 31 11:12:57 2021 +0800

    ARM: rv1126-emmc-drivers-modules.config: Fix CONFIG_ROCKCHIP_MPP_XXX
    
    mpp build only one ko and all option config is bool.
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: Id940f29a351d81c301a1ca100b8ebee828b8cc81

diff --git a/arch/arm/configs/rv1126-emmc-drivers-modules.config b/arch/arm/configs/rv1126-emmc-drivers-modules.config
index 9ec1929eb4d7..3440f6ae93f0 100644
--- a/arch/arm/configs/rv1126-emmc-drivers-modules.config
+++ b/arch/arm/configs/rv1126-emmc-drivers-modules.config
@@ -36,12 +36,7 @@ CONFIG_RFKILL=m
 CONFIG_RFKILL_RK=m
 # CONFIG_RK_SFC_NAND is not set
 # CONFIG_ROCKCHIP_DW_MIPI_DSI is not set
-CONFIG_ROCKCHIP_MPP_IEP2=m
-CONFIG_ROCKCHIP_MPP_RKVDEC=m
-CONFIG_ROCKCHIP_MPP_RKVENC=m
 CONFIG_ROCKCHIP_MPP_SERVICE=m
-CONFIG_ROCKCHIP_MPP_VDPU2=m
-CONFIG_ROCKCHIP_MPP_VEPU2=m
 CONFIG_ROCKCHIP_RGA2=m
 # CONFIG_ROCKCHIP_RGB is not set
 CONFIG_RTC_DRV_PCF8563=m

commit cd5de37f97c9d274c9588a71b819c8b3535ecc7e
Author: Ding Wei <leo.ding@rock-chips.com>
Date:   Tue Aug 31 09:20:30 2021 +0800

    video: rockchip: mpp: Use CONFIG_CPU_XX to match build target
    
    Using CONFIG_CPU_XX only compiles the code of matching CPU,
    then it can reduce the object file.
    
    Change-Id: Ic19345464c802939d08786ae29b34111c3c5a855
    Signed-off-by: Ding Wei <leo.ding@rock-chips.com>

diff --git a/drivers/video/rockchip/mpp/mpp_iep2.c b/drivers/video/rockchip/mpp/mpp_iep2.c
index 31bb794ae094..0aaf187f0da6 100644
--- a/drivers/video/rockchip/mpp/mpp_iep2.c
+++ b/drivers/video/rockchip/mpp/mpp_iep2.c
@@ -918,10 +918,12 @@ static const struct of_device_id mpp_iep2_match[] = {
 		.compatible = "rockchip,iep-v2",
 		.data = &iep2_v2_data,
 	},
+#ifdef CONFIG_CPU_RV1126
 	{
 		.compatible = "rockchip,rv1126-iep",
 		.data = &iep2_v2_data,
 	},
+#endif
 	{},
 };
 
diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec.c b/drivers/video/rockchip/mpp/mpp_rkvdec.c
index 61b7276f2757..0b26ac288ff6 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvdec.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec.c
@@ -1821,30 +1821,40 @@ static const struct of_device_id mpp_rkvdec_dt_match[] = {
 		.compatible = "rockchip,hevc-decoder",
 		.data = &rk_hevcdec_data,
 	},
+#ifdef CONFIG_CPU_PX30
 	{
 		.compatible = "rockchip,hevc-decoder-px30",
 		.data = &rk_hevcdec_px30_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3368
 	{
 		.compatible = "rockchip,hevc-decoder-rk3368",
 		.data = &rk_hevcdec_3368_data,
 	},
+#endif
 	{
 		.compatible = "rockchip,rkv-decoder-v1",
 		.data = &rkvdec_v1_data,
 	},
+#ifdef CONFIG_CPU_RK3399
 	{
 		.compatible = "rockchip,rkv-decoder-rk3399",
 		.data = &rkvdec_3399_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3328
 	{
 		.compatible = "rockchip,rkv-decoder-rk3328",
 		.data = &rkvdec_3328_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RV1126
 	{
 		.compatible = "rockchip,rkv-decoder-rv1126",
 		.data = &rkvdec_1126_data,
 	},
+#endif
 	{},
 };
 
diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2.c b/drivers/video/rockchip/mpp/mpp_rkvdec2.c
index 302ef66da2e3..a75867671ffc 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvdec2.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec2.c
@@ -874,10 +874,12 @@ static const struct of_device_id mpp_rkvdec2_dt_match[] = {
 		.compatible = "rockchip,rkv-decoder-v2",
 		.data = &rkvdec_v2_data,
 	},
+#ifdef CONFIG_CPU_RK3568
 	{
 		.compatible = "rockchip,rkv-decoder-rk3568",
 		.data = &rkvdec_rk3568_data,
 	},
+#endif
 	{},
 };
 
diff --git a/drivers/video/rockchip/mpp/mpp_rkvenc.c b/drivers/video/rockchip/mpp/mpp_rkvenc.c
index 398cb0aa29b7..8881f9f04036 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvenc.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvenc.c
@@ -961,8 +961,9 @@ static struct monitor_dev_profile enc_mdevp = {
 	.high_temp_adjust = rockchip_monitor_dev_high_temp_adjust,
 };
 
-static int rv1126_get_soc_info(struct device *dev, struct device_node *np,
-			       int *bin, int *process)
+static int __maybe_unused rv1126_get_soc_info(struct device *dev,
+					      struct device_node *np,
+					      int *bin, int *process)
 {
 	int ret = 0;
 	u8 value = 0;
@@ -985,6 +986,7 @@ static int rv1126_get_soc_info(struct device *dev, struct device_node *np,
 }
 
 static const struct of_device_id rockchip_rkvenc_of_match[] = {
+#ifdef CONFIG_CPU_RV1126
 	{
 		.compatible = "rockchip,rv1109",
 		.data = (void *)&rv1126_get_soc_info,
@@ -993,6 +995,7 @@ static const struct of_device_id rockchip_rkvenc_of_match[] = {
 		.compatible = "rockchip,rv1126",
 		.data = (void *)&rv1126_get_soc_info,
 	},
+#endif
 	{},
 };
 
diff --git a/drivers/video/rockchip/mpp/mpp_vdpu1.c b/drivers/video/rockchip/mpp/mpp_vdpu1.c
index f3b0c1dbe516..f6c16295c542 100644
--- a/drivers/video/rockchip/mpp/mpp_vdpu1.c
+++ b/drivers/video/rockchip/mpp/mpp_vdpu1.c
@@ -762,18 +762,24 @@ static const struct of_device_id mpp_vdpu1_dt_match[] = {
 		.compatible = "rockchip,vpu-decoder-v1",
 		.data = &vdpu_v1_data,
 	},
+#ifdef CONFIG_CPU_RK3288
 	{
 		.compatible = "rockchip,vpu-decoder-rk3288",
 		.data = &vdpu_3288_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3368
 	{
 		.compatible = "rockchip,vpu-decoder-rk3368",
 		.data = &vdpu_3368_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3328
 	{
 		.compatible = "rockchip,avs-plus-decoder",
 		.data = &avsd_plus_data,
 	},
+#endif
 	{},
 };
 
diff --git a/drivers/video/rockchip/mpp/mpp_vdpu2.c b/drivers/video/rockchip/mpp/mpp_vdpu2.c
index c1972624ed70..49cf098c037b 100644
--- a/drivers/video/rockchip/mpp/mpp_vdpu2.c
+++ b/drivers/video/rockchip/mpp/mpp_vdpu2.c
@@ -666,10 +666,12 @@ static const struct of_device_id mpp_vdpu2_dt_match[] = {
 		.compatible = "rockchip,vpu-decoder-v2",
 		.data = &vdpu_v2_data,
 	},
+#ifdef CONFIG_CPU_PX30
 	{
 		.compatible = "rockchip,vpu-decoder-px30",
 		.data = &vdpu_px30_data,
 	},
+#endif
 	{},
 };
 
diff --git a/drivers/video/rockchip/mpp/mpp_vepu2.c b/drivers/video/rockchip/mpp/mpp_vepu2.c
index a90b5ad6abb2..3cc3823e24f1 100644
--- a/drivers/video/rockchip/mpp/mpp_vepu2.c
+++ b/drivers/video/rockchip/mpp/mpp_vepu2.c
@@ -792,10 +792,12 @@ static const struct of_device_id mpp_vepu2_dt_match[] = {
 		.compatible = "rockchip,vpu-encoder-v2",
 		.data = &vepu_v2_data,
 	},
+#ifdef CONFIG_CPU_PX30
 	{
 		.compatible = "rockchip,vpu-encoder-px30",
 		.data = &vepu_px30_data,
 	},
+#endif
 	{},
 };
 

commit cae7fb13d69e09c79017b8770608ab0e3eb8c487
Author: Ding Wei <leo.ding@rock-chips.com>
Date:   Mon Aug 30 15:24:01 2021 +0800

    video: rockchip: mpp: px30: Use hack_xx.c instead workround funcs
    
    move the workaround functions for px30 to the mpp_hack_px30.c.
    
    Change-Id: I9f9880c28fe1d797b0551d116a66294223a5e251
    Signed-off-by: Ding Wei <leo.ding@rock-chips.com>

diff --git a/drivers/video/rockchip/mpp/Makefile b/drivers/video/rockchip/mpp/Makefile
index 4e5d59e88766..67d7039ae4a8 100644
--- a/drivers/video/rockchip/mpp/Makefile
+++ b/drivers/video/rockchip/mpp/Makefile
@@ -21,4 +21,7 @@ rk_vcodec-$(CONFIG_ROCKCHIP_MPP_VEPU2)  += mpp_vepu2.o
 rk_vcodec-$(CONFIG_ROCKCHIP_MPP_IEP2)   += mpp_iep2.o
 rk_vcodec-$(CONFIG_ROCKCHIP_MPP_JPGDEC) += mpp_jpgdec.o
 
+# hack for workaround
+rk_vcodec-$(CONFIG_CPU_PX30) += hack/mpp_hack_px30.o
+
 obj-$(CONFIG_ROCKCHIP_MPP_SERVICE) += rk_vcodec.o
diff --git a/drivers/video/rockchip/mpp/hack/mpp_hack_px30.c b/drivers/video/rockchip/mpp/hack/mpp_hack_px30.c
new file mode 100644
index 000000000000..379049eaf8fc
--- /dev/null
+++ b/drivers/video/rockchip/mpp/hack/mpp_hack_px30.c
@@ -0,0 +1,230 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
+ *
+ * author:
+ *	Ding Wei, leo.ding@rock-chips.com
+ *
+ */
+
+#include <linux/delay.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_platform.h>
+#include <linux/regmap.h>
+
+#include <soc/rockchip/pm_domains.h>
+
+#include "../mpp_debug.h"
+#include "../mpp_common.h"
+#include "../mpp_iommu.h"
+#include "mpp_hack_px30.h"
+
+#define RK_MMU_DTE_ADDR			0x00 /* Directory table address */
+#define RK_MMU_STATUS			0x04
+#define RK_MMU_COMMAND			0x08
+#define RK_MMU_INT_MASK			0x1C /* IRQ enable */
+
+/* RK_MMU_COMMAND command values */
+#define RK_MMU_CMD_ENABLE_PAGING	0 /* Enable memory translation */
+#define RK_MMU_CMD_DISABLE_PAGING	1 /* Disable memory translation */
+#define RK_MMU_CMD_ENABLE_STALL		2 /* Stall paging to allow other cmds */
+#define RK_MMU_CMD_DISABLE_STALL	3 /* Stop stall re-enables paging */
+#define RK_MMU_CMD_ZAP_CACHE		4 /* Shoot down entire IOTLB */
+#define RK_MMU_CMD_PAGE_FAULT_DONE	5 /* Clear page fault */
+#define RK_MMU_CMD_FORCE_RESET		6 /* Reset all registers */
+
+/* RK_MMU_INT_* register fields */
+#define RK_MMU_IRQ_MASK			0x03
+/* RK_MMU_STATUS fields */
+#define RK_MMU_STATUS_PAGING_ENABLED	BIT(0)
+#define RK_MMU_STATUS_STALL_ACTIVE	BIT(2)
+
+static bool mpp_iommu_is_paged(struct mpp_rk_iommu *iommu)
+{
+	int i;
+	u32 status;
+	bool active = true;
+
+	for (i = 0; i < iommu->mmu_num; i++) {
+		status = readl(iommu->bases[i] + RK_MMU_STATUS);
+		active &= !!(status & RK_MMU_STATUS_PAGING_ENABLED);
+	}
+
+	return active;
+}
+
+static u32 mpp_iommu_get_dte_addr(struct mpp_rk_iommu *iommu)
+{
+	return readl(iommu->bases[0] + RK_MMU_DTE_ADDR);
+}
+
+static int mpp_iommu_enable(struct mpp_rk_iommu *iommu)
+{
+	int i;
+
+	/* check iommu whether is paged */
+	iommu->is_paged = mpp_iommu_is_paged(iommu);
+	if (iommu->is_paged)
+		return 0;
+
+	/* enable stall */
+	for (i = 0; i < iommu->mmu_num; i++)
+		writel(RK_MMU_CMD_ENABLE_STALL,
+		       iommu->bases[i] + RK_MMU_COMMAND);
+	udelay(2);
+	/* force reset */
+	for (i = 0; i < iommu->mmu_num; i++)
+		writel(RK_MMU_CMD_FORCE_RESET,
+		       iommu->bases[i] + RK_MMU_COMMAND);
+	udelay(2);
+
+	for (i = 0; i < iommu->mmu_num; i++) {
+		/* restore dte and status */
+		writel(iommu->dte_addr,
+		       iommu->bases[i] + RK_MMU_DTE_ADDR);
+		/* zap cache */
+		writel(RK_MMU_CMD_ZAP_CACHE,
+		       iommu->bases[i] + RK_MMU_COMMAND);
+		/* irq mask */
+		writel(RK_MMU_IRQ_MASK,
+		       iommu->bases[i] + RK_MMU_INT_MASK);
+	}
+	udelay(2);
+	/* enable paging */
+	for (i = 0; i < iommu->mmu_num; i++)
+		writel(RK_MMU_CMD_ENABLE_PAGING,
+		       iommu->bases[i] + RK_MMU_COMMAND);
+	udelay(2);
+	/* disable stall */
+	for (i = 0; i < iommu->mmu_num; i++)
+		writel(RK_MMU_CMD_DISABLE_STALL,
+		       iommu->bases[i] + RK_MMU_COMMAND);
+	udelay(2);
+
+	/* iommu should be paging enable */
+	iommu->is_paged = mpp_iommu_is_paged(iommu);
+	if (!iommu->is_paged) {
+		mpp_err("iommu->base_addr=%08x enable failed\n",
+			iommu->base_addr[0]);
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+static int mpp_iommu_disable(struct mpp_rk_iommu *iommu)
+{
+	int i;
+	u32 dte;
+
+	if (iommu->is_paged) {
+		dte = readl(iommu->bases[0] + RK_MMU_DTE_ADDR);
+		if (!dte)
+			return -EINVAL;
+		udelay(2);
+		/* enable stall */
+		for (i = 0; i < iommu->mmu_num; i++)
+			writel(RK_MMU_CMD_ENABLE_STALL,
+			       iommu->bases[i] + RK_MMU_COMMAND);
+		udelay(2);
+		/* disable paging */
+		for (i = 0; i < iommu->mmu_num; i++)
+			writel(RK_MMU_CMD_DISABLE_PAGING,
+			       iommu->bases[i] + RK_MMU_COMMAND);
+		udelay(2);
+		/* disable stall */
+		for (i = 0; i < iommu->mmu_num; i++)
+			writel(RK_MMU_CMD_DISABLE_STALL,
+			       iommu->bases[i] + RK_MMU_COMMAND);
+		udelay(2);
+	}
+
+	return 0;
+}
+
+int px30_workaround_combo_init(struct mpp_dev *mpp)
+{
+	struct mpp_rk_iommu *iommu = NULL, *loop = NULL, *n;
+	struct platform_device *pdev = mpp->iommu_info->pdev;
+
+	/* find whether exist in iommu link */
+	list_for_each_entry_safe(loop, n, &mpp->queue->mmu_list, link) {
+		if (loop->base_addr[0] == pdev->resource[0].start) {
+			iommu = loop;
+			break;
+		}
+	}
+	/* if not exist, add it */
+	if (!iommu) {
+		int i;
+		struct resource *res;
+		void __iomem *base;
+
+		iommu = devm_kzalloc(mpp->srv->dev, sizeof(*iommu), GFP_KERNEL);
+		for (i = 0; i < pdev->num_resources; i++) {
+			res = platform_get_resource(pdev, IORESOURCE_MEM, i);
+			if (!res)
+				continue;
+			base = devm_ioremap(&pdev->dev,
+					    res->start, resource_size(res));
+			if (IS_ERR(base))
+				continue;
+			iommu->base_addr[i] = res->start;
+			iommu->bases[i] = base;
+			iommu->mmu_num++;
+		}
+		iommu->grf_val = mpp->grf_info->val & MPP_GRF_VAL_MASK;
+		if (mpp->hw_ops->clk_on)
+			mpp->hw_ops->clk_on(mpp);
+		iommu->dte_addr =  mpp_iommu_get_dte_addr(iommu);
+		if (mpp->hw_ops->clk_off)
+			mpp->hw_ops->clk_off(mpp);
+		INIT_LIST_HEAD(&iommu->link);
+		mutex_lock(&mpp->queue->mmu_lock);
+		list_add_tail(&iommu->link, &mpp->queue->mmu_list);
+		mutex_unlock(&mpp->queue->mmu_lock);
+	}
+	mpp->iommu_info->iommu = iommu;
+
+	return 0;
+}
+
+int px30_workaround_combo_switch_grf(struct mpp_dev *mpp)
+{
+	int ret = 0;
+	u32 curr_val;
+	u32 next_val;
+	bool pd_is_on;
+	struct mpp_rk_iommu *loop = NULL, *n;
+
+	if (!mpp->grf_info->grf || !mpp->grf_info->val)
+		return 0;
+
+	curr_val = mpp_get_grf(mpp->grf_info);
+	next_val = mpp->grf_info->val & MPP_GRF_VAL_MASK;
+	if (curr_val == next_val)
+		return 0;
+
+	pd_is_on = rockchip_pmu_pd_is_on(mpp->dev);
+	if (!pd_is_on)
+		rockchip_pmu_pd_on(mpp->dev);
+	mpp->hw_ops->clk_on(mpp);
+
+	list_for_each_entry_safe(loop, n, &mpp->queue->mmu_list, link) {
+		/* update iommu parameters */
+		if (loop->grf_val == curr_val)
+			loop->is_paged = mpp_iommu_is_paged(loop);
+		/* disable all iommu */
+		mpp_iommu_disable(loop);
+	}
+	mpp_set_grf(mpp->grf_info);
+	/* enable current iommu */
+	ret = mpp_iommu_enable(mpp->iommu_info->iommu);
+
+	mpp->hw_ops->clk_off(mpp);
+	if (!pd_is_on)
+		rockchip_pmu_pd_off(mpp->dev);
+
+	return ret;
+}
diff --git a/drivers/video/rockchip/mpp/hack/mpp_hack_px30.h b/drivers/video/rockchip/mpp/hack/mpp_hack_px30.h
new file mode 100644
index 000000000000..c8402e30d810
--- /dev/null
+++ b/drivers/video/rockchip/mpp/hack/mpp_hack_px30.h
@@ -0,0 +1,27 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
+/*
+ * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
+ *
+ * author:
+ *	Ding Wei, leo.ding@rock-chips.com
+ *
+ */
+#ifndef __ROCKCHIP_MPP_HACK_PX30_H__
+#define __ROCKCHIP_MPP_HACK_PX30_H__
+
+#ifdef CONFIG_CPU_PX30
+int px30_workaround_combo_init(struct mpp_dev *mpp);
+int px30_workaround_combo_switch_grf(struct mpp_dev *mpp);
+#else
+static inline int px30_workaround_combo_init(struct mpp_dev *mpp)
+{
+	return 0;
+}
+
+static inline int px30_workaround_combo_switch_grf(struct mpp_dev *mpp)
+{
+	return 0;
+}
+#endif
+
+#endif
diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c
index e5123037f797..2ed00ed52c95 100644
--- a/drivers/video/rockchip/mpp/mpp_common.c
+++ b/drivers/video/rockchip/mpp/mpp_common.c
@@ -1991,8 +1991,6 @@ irqreturn_t mpp_dev_isr_sched(int irq, void *param)
 	return ret;
 }
 
-#define MPP_GRF_VAL_MASK	0xFFFF
-
 u32 mpp_get_grf(struct mpp_grf_info *grf_info)
 {
 	u32 val = 0;
@@ -2228,89 +2226,3 @@ mpp_procfs_create_u32(const char *name, umode_t mode,
 	return proc_create_data(name, mode, parent, &procfs_fops_u32, data);
 }
 #endif
-
-int px30_workaround_combo_init(struct mpp_dev *mpp)
-{
-	struct mpp_rk_iommu *iommu = NULL, *loop = NULL, *n;
-	struct platform_device *pdev = mpp->iommu_info->pdev;
-
-	/* find whether exist in iommu link */
-	list_for_each_entry_safe(loop, n, &mpp->queue->mmu_list, link) {
-		if (loop->base_addr[0] == pdev->resource[0].start) {
-			iommu = loop;
-			break;
-		}
-	}
-	/* if not exist, add it */
-	if (!iommu) {
-		int i;
-		struct resource *res;
-		void __iomem *base;
-
-		iommu = devm_kzalloc(mpp->srv->dev, sizeof(*iommu), GFP_KERNEL);
-		for (i = 0; i < pdev->num_resources; i++) {
-			res = platform_get_resource(pdev, IORESOURCE_MEM, i);
-			if (!res)
-				continue;
-			base = devm_ioremap(&pdev->dev,
-					    res->start, resource_size(res));
-			if (IS_ERR(base))
-				continue;
-			iommu->base_addr[i] = res->start;
-			iommu->bases[i] = base;
-			iommu->mmu_num++;
-		}
-		iommu->grf_val = mpp->grf_info->val & MPP_GRF_VAL_MASK;
-		if (mpp->hw_ops->clk_on)
-			mpp->hw_ops->clk_on(mpp);
-		iommu->dte_addr =  mpp_iommu_get_dte_addr(iommu);
-		if (mpp->hw_ops->clk_off)
-			mpp->hw_ops->clk_off(mpp);
-		INIT_LIST_HEAD(&iommu->link);
-		mutex_lock(&mpp->queue->mmu_lock);
-		list_add_tail(&iommu->link, &mpp->queue->mmu_list);
-		mutex_unlock(&mpp->queue->mmu_lock);
-	}
-	mpp->iommu_info->iommu = iommu;
-
-	return 0;
-}
-
-int px30_workaround_combo_switch_grf(struct mpp_dev *mpp)
-{
-	int ret = 0;
-	u32 curr_val;
-	u32 next_val;
-	bool pd_is_on;
-	struct mpp_rk_iommu *loop = NULL, *n;
-
-	if (!mpp->grf_info->grf || !mpp->grf_info->val)
-		return 0;
-
-	curr_val = mpp_get_grf(mpp->grf_info);
-	next_val = mpp->grf_info->val & MPP_GRF_VAL_MASK;
-	if (curr_val == next_val)
-		return 0;
-
-	pd_is_on = rockchip_pmu_pd_is_on(mpp->dev);
-	if (!pd_is_on)
-		rockchip_pmu_pd_on(mpp->dev);
-	mpp->hw_ops->clk_on(mpp);
-
-	list_for_each_entry_safe(loop, n, &mpp->queue->mmu_list, link) {
-		/* update iommu parameters */
-		if (loop->grf_val == curr_val)
-			loop->is_paged = mpp_iommu_is_paged(loop);
-		/* disable all iommu */
-		mpp_iommu_disable(loop);
-	}
-	mpp_set_grf(mpp->grf_info);
-	/* enable current iommu */
-	ret = mpp_iommu_enable(mpp->iommu_info->iommu);
-
-	mpp->hw_ops->clk_off(mpp);
-	if (!pd_is_on)
-		rockchip_pmu_pd_off(mpp->dev);
-
-	return ret;
-}
diff --git a/drivers/video/rockchip/mpp/mpp_common.h b/drivers/video/rockchip/mpp/mpp_common.h
index 306d489db8de..00c6404c5d35 100644
--- a/drivers/video/rockchip/mpp/mpp_common.h
+++ b/drivers/video/rockchip/mpp/mpp_common.h
@@ -36,6 +36,9 @@
 #define MPP_FLAGS_REG_NO_OFFSET		(0x00000010)
 #define MPP_FLAGS_SECURE_MODE		(0x00010000)
 
+/* grf mask for get value */
+#define MPP_GRF_VAL_MASK		(0xFFFF)
+
 /**
  * Device type: classified by hardware feature
  */
@@ -749,10 +752,6 @@ extern const char *mpp_device_name[MPP_DEVICE_BUTT];
 extern const char *enc_info_item_name[ENC_INFO_BUTT];
 #endif
 
-/* workaround according hardware */
-int px30_workaround_combo_init(struct mpp_dev *mpp);
-int px30_workaround_combo_switch_grf(struct mpp_dev *mpp);
-
 extern const struct file_operations rockchip_mpp_fops;
 
 extern struct platform_driver rockchip_rkvdec_driver;
diff --git a/drivers/video/rockchip/mpp/mpp_iommu.c b/drivers/video/rockchip/mpp/mpp_iommu.c
index 525aa110de75..21128cd2a822 100644
--- a/drivers/video/rockchip/mpp/mpp_iommu.c
+++ b/drivers/video/rockchip/mpp/mpp_iommu.c
@@ -457,129 +457,6 @@ int mpp_iommu_remove(struct mpp_iommu_info *info)
 	return 0;
 }
 
-#define RK_MMU_DTE_ADDR			0x00 /* Directory table address */
-#define RK_MMU_STATUS			0x04
-#define RK_MMU_COMMAND			0x08
-#define RK_MMU_INT_MASK			0x1C /* IRQ enable */
-
-/* RK_MMU_COMMAND command values */
-#define RK_MMU_CMD_ENABLE_PAGING	0 /* Enable memory translation */
-#define RK_MMU_CMD_DISABLE_PAGING	1 /* Disable memory translation */
-#define RK_MMU_CMD_ENABLE_STALL		2 /* Stall paging to allow other cmds */
-#define RK_MMU_CMD_DISABLE_STALL	3 /* Stop stall re-enables paging */
-#define RK_MMU_CMD_ZAP_CACHE		4 /* Shoot down entire IOTLB */
-#define RK_MMU_CMD_PAGE_FAULT_DONE	5 /* Clear page fault */
-#define RK_MMU_CMD_FORCE_RESET		6 /* Reset all registers */
-
-/* RK_MMU_INT_* register fields */
-#define RK_MMU_IRQ_MASK			0x03
-/* RK_MMU_STATUS fields */
-#define RK_MMU_STATUS_PAGING_ENABLED	BIT(0)
-#define RK_MMU_STATUS_STALL_ACTIVE	BIT(2)
-
-bool mpp_iommu_is_paged(struct mpp_rk_iommu *iommu)
-{
-	int i;
-	u32 status;
-	bool active = true;
-
-	for (i = 0; i < iommu->mmu_num; i++) {
-		status = readl(iommu->bases[i] + RK_MMU_STATUS);
-		active &= !!(status & RK_MMU_STATUS_PAGING_ENABLED);
-	}
-
-	return active;
-}
-
-u32 mpp_iommu_get_dte_addr(struct mpp_rk_iommu *iommu)
-{
-	return readl(iommu->bases[0] + RK_MMU_DTE_ADDR);
-}
-
-int mpp_iommu_enable(struct mpp_rk_iommu *iommu)
-{
-	int i;
-
-	/* check iommu whether is paged */
-	iommu->is_paged = mpp_iommu_is_paged(iommu);
-	if (iommu->is_paged)
-		return 0;
-
-	/* enable stall */
-	for (i = 0; i < iommu->mmu_num; i++)
-		writel(RK_MMU_CMD_ENABLE_STALL,
-		       iommu->bases[i] + RK_MMU_COMMAND);
-	udelay(2);
-	/* force reset */
-	for (i = 0; i < iommu->mmu_num; i++)
-		writel(RK_MMU_CMD_FORCE_RESET,
-		       iommu->bases[i] + RK_MMU_COMMAND);
-	udelay(2);
-
-	for (i = 0; i < iommu->mmu_num; i++) {
-		/* restore dte and status */
-		writel(iommu->dte_addr,
-		       iommu->bases[i] + RK_MMU_DTE_ADDR);
-		/* zap cache */
-		writel(RK_MMU_CMD_ZAP_CACHE,
-		       iommu->bases[i] + RK_MMU_COMMAND);
-		/* irq mask */
-		writel(RK_MMU_IRQ_MASK,
-		       iommu->bases[i] + RK_MMU_INT_MASK);
-	}
-	udelay(2);
-	/* enable paging */
-	for (i = 0; i < iommu->mmu_num; i++)
-		writel(RK_MMU_CMD_ENABLE_PAGING,
-		       iommu->bases[i] + RK_MMU_COMMAND);
-	udelay(2);
-	/* disable stall */
-	for (i = 0; i < iommu->mmu_num; i++)
-		writel(RK_MMU_CMD_DISABLE_STALL,
-		       iommu->bases[i] + RK_MMU_COMMAND);
-	udelay(2);
-
-	/* iommu should be paging enable */
-	iommu->is_paged = mpp_iommu_is_paged(iommu);
-	if (!iommu->is_paged) {
-		mpp_err("iommu->base_addr=%08x enable failed\n",
-			iommu->base_addr[0]);
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-int mpp_iommu_disable(struct mpp_rk_iommu *iommu)
-{
-	int i;
-	u32 dte;
-
-	if (iommu->is_paged) {
-		dte = readl(iommu->bases[0] + RK_MMU_DTE_ADDR);
-		if (!dte)
-			return -EINVAL;
-		udelay(2);
-		/* enable stall */
-		for (i = 0; i < iommu->mmu_num; i++)
-			writel(RK_MMU_CMD_ENABLE_STALL,
-			       iommu->bases[i] + RK_MMU_COMMAND);
-		udelay(2);
-		/* disable paging */
-		for (i = 0; i < iommu->mmu_num; i++)
-			writel(RK_MMU_CMD_DISABLE_PAGING,
-			       iommu->bases[i] + RK_MMU_COMMAND);
-		udelay(2);
-		/* disable stall */
-		for (i = 0; i < iommu->mmu_num; i++)
-			writel(RK_MMU_CMD_DISABLE_STALL,
-			       iommu->bases[i] + RK_MMU_COMMAND);
-		udelay(2);
-	}
-
-	return 0;
-}
-
 int mpp_iommu_refresh(struct mpp_iommu_info *info, struct device *dev)
 {
 	int i;
diff --git a/drivers/video/rockchip/mpp/mpp_iommu.h b/drivers/video/rockchip/mpp/mpp_iommu.h
index a2de8abb0a4b..9ae1b6ba3567 100644
--- a/drivers/video/rockchip/mpp/mpp_iommu.h
+++ b/drivers/video/rockchip/mpp/mpp_iommu.h
@@ -102,10 +102,6 @@ int mpp_iommu_remove(struct mpp_iommu_info *info);
 int mpp_iommu_attach(struct mpp_iommu_info *info);
 int mpp_iommu_detach(struct mpp_iommu_info *info);
 
-bool mpp_iommu_is_paged(struct mpp_rk_iommu *iommu);
-u32 mpp_iommu_get_dte_addr(struct mpp_rk_iommu *iommu);
-int mpp_iommu_enable(struct mpp_rk_iommu *iommu);
-int mpp_iommu_disable(struct mpp_rk_iommu *iommu);
 int mpp_iommu_refresh(struct mpp_iommu_info *info, struct device *dev);
 int mpp_iommu_flush_tlb(struct mpp_iommu_info *info);
 
diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec.c b/drivers/video/rockchip/mpp/mpp_rkvdec.c
index 39b44759ebae..61b7276f2757 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvdec.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec.c
@@ -37,6 +37,8 @@
 #include "mpp_common.h"
 #include "mpp_iommu.h"
 
+#include "hack/mpp_hack_px30.h"
+
 #define RKVDEC_DRIVER_NAME		"mpp_rkvdec"
 
 #define IOMMU_GET_BUS_ID(x)		(((x) >> 6) & 0x1f)
diff --git a/drivers/video/rockchip/mpp/mpp_vdpu2.c b/drivers/video/rockchip/mpp/mpp_vdpu2.c
index 98751eb3eab7..c1972624ed70 100644
--- a/drivers/video/rockchip/mpp/mpp_vdpu2.c
+++ b/drivers/video/rockchip/mpp/mpp_vdpu2.c
@@ -25,6 +25,7 @@
 #include "mpp_debug.h"
 #include "mpp_common.h"
 #include "mpp_iommu.h"
+#include "hack/mpp_hack_px30.h"
 
 #define VDPU2_DRIVER_NAME		"mpp_vdpu2"
 
diff --git a/drivers/video/rockchip/mpp/mpp_vepu2.c b/drivers/video/rockchip/mpp/mpp_vepu2.c
index 67f424af6a21..a90b5ad6abb2 100644
--- a/drivers/video/rockchip/mpp/mpp_vepu2.c
+++ b/drivers/video/rockchip/mpp/mpp_vepu2.c
@@ -26,6 +26,7 @@
 #include "mpp_debug.h"
 #include "mpp_common.h"
 #include "mpp_iommu.h"
+#include "hack/mpp_hack_px30.h"
 
 #define VEPU2_DRIVER_NAME		"mpp_vepu2"
 

commit e32bfc1ed78a584fa8ccc2c5ef873d8c5fef68e9
Author: Ding Wei <leo.ding@rock-chips.com>
Date:   Fri Aug 27 16:49:31 2021 +0800

    video: rockchip: mpp: Use ROCKCHIP_MPP_PROC_FS instead of PROC_FS
    
    For kernel-tiny, remove debug relative code, and reduce the size of module.
    
    Change-Id: Ic78a0839a75c9cebb56fa32e87235bd97be0370a
    Signed-off-by: Ding Wei <leo.ding@rock-chips.com>

diff --git a/drivers/video/rockchip/mpp/Kconfig b/drivers/video/rockchip/mpp/Kconfig
index 28d23fc7193f..1a15dc9d5daf 100644
--- a/drivers/video/rockchip/mpp/Kconfig
+++ b/drivers/video/rockchip/mpp/Kconfig
@@ -3,69 +3,61 @@
 menuconfig ROCKCHIP_MPP_SERVICE
 	tristate "mpp service framework"
 	depends on ARCH_ROCKCHIP
-	default n
 	help
 	  rockchip mpp service framework.
 
+if ROCKCHIP_MPP_SERVICE
+
+config ROCKCHIP_MPP_PROC_FS
+	bool "mpp service procfs"
+	depends on PROC_FS
+	default y
+	help
+	  rockchip mpp service procfs.
+
 config ROCKCHIP_MPP_RKVDEC
-	tristate "RKV decoder device driver"
-	depends on ROCKCHIP_MPP_SERVICE
-	default n
+	bool "RKV decoder device driver"
 	help
 	  rockchip mpp rkv combo decoder and hevc decoder.
 
 config ROCKCHIP_MPP_RKVDEC2
-	tristate "RKV decoder v2 device driver"
-	depends on ROCKCHIP_MPP_SERVICE
-	default n
+	bool "RKV decoder v2 device driver"
 	help
 	  rockchip mpp rkv combo decoder v2.
 
 config ROCKCHIP_MPP_RKVENC
-	tristate "RKV encoder device driver"
-	depends on ROCKCHIP_MPP_SERVICE
-	default n
+	bool "RKV encoder device driver"
 	help
 	  rockchip mpp rkv combo encoder.
 
 config ROCKCHIP_MPP_VDPU1
-	tristate "VPU decoder v1 device driver"
-	depends on ROCKCHIP_MPP_SERVICE
-	default n
+	bool "VPU decoder v1 device driver"
 	help
 	  rockchip mpp vpu decoder v1.
 
 config ROCKCHIP_MPP_VEPU1
-	tristate "VPU encoder v1 device driver"
-	depends on ROCKCHIP_MPP_SERVICE
-	default n
+	bool "VPU encoder v1 device driver"
 	help
 	  rockchip mpp vpu encoder v1.
 
 config ROCKCHIP_MPP_VDPU2
-	tristate "VPU decoder v2 device driver"
-	depends on ROCKCHIP_MPP_SERVICE
-	default n
+	bool "VPU decoder v2 device driver"
 	help
 	  rockchip mpp vpu decoder v2.
 
 config ROCKCHIP_MPP_VEPU2
-	tristate "VPU encoder v2 device driver"
-	depends on ROCKCHIP_MPP_SERVICE
-	default n
+	bool "VPU encoder v2 device driver"
 	help
 	  rockchip mpp vpu encoder v2.
 
 config ROCKCHIP_MPP_IEP2
-	tristate "IEP v2 device driver"
-	depends on ROCKCHIP_MPP_SERVICE
-	default n
+	bool "IEP v2 device driver"
 	help
 	  rockchip iep v2.
 
 config ROCKCHIP_MPP_JPGDEC
-	tristate "RKV jpeg decoder v1 device driver"
-	depends on ROCKCHIP_MPP_SERVICE
-	default n
+	bool "RKV jpeg decoder v1 device driver"
 	help
 	  rockchip mpp rkv jpeg decoder.
+
+endif
diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c
index 101497223bd0..e5123037f797 100644
--- a/drivers/video/rockchip/mpp/mpp_common.c
+++ b/drivers/video/rockchip/mpp/mpp_common.c
@@ -54,7 +54,7 @@ struct mpp_msg_v1 {
 	__u64 data_ptr;
 };
 
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 const char *mpp_device_name[MPP_DEVICE_BUTT] = {
 	[MPP_DEVICE_VDPU1]		= "VDPU1",
 	[MPP_DEVICE_VDPU2]		= "VDPU2",
@@ -2186,7 +2186,7 @@ int mpp_clk_set_rate(struct mpp_clk_info *clk_info,
 	return 0;
 }
 
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 static int fops_show_u32(struct seq_file *file, void *v)
 {
 	u32 *val = file->private;
diff --git a/drivers/video/rockchip/mpp/mpp_common.h b/drivers/video/rockchip/mpp/mpp_common.h
index 317aefa363d6..306d489db8de 100644
--- a/drivers/video/rockchip/mpp/mpp_common.h
+++ b/drivers/video/rockchip/mpp/mpp_common.h
@@ -463,7 +463,7 @@ struct mpp_service {
 	dev_t dev_id;
 	struct cdev mpp_cdev;
 	struct device *child_dev;
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 	struct proc_dir_entry *procfs;
 #endif
 	unsigned long hw_support;
@@ -731,7 +731,7 @@ static inline int mpp_reset_up_write(struct mpp_reset_group *group)
 	return 0;
 }
 
-#ifdef CONFIG_PROC_FS
+#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);
@@ -744,7 +744,7 @@ mpp_procfs_create_u32(const char *name, umode_t mode,
 }
 #endif
 
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 extern const char *mpp_device_name[MPP_DEVICE_BUTT];
 extern const char *enc_info_item_name[ENC_INFO_BUTT];
 #endif
diff --git a/drivers/video/rockchip/mpp/mpp_iep2.c b/drivers/video/rockchip/mpp/mpp_iep2.c
index 6c193b97aa0f..31bb794ae094 100644
--- a/drivers/video/rockchip/mpp/mpp_iep2.c
+++ b/drivers/video/rockchip/mpp/mpp_iep2.c
@@ -216,7 +216,7 @@ struct iep2_dev {
 	struct mpp_clk_info aclk_info;
 	struct mpp_clk_info hclk_info;
 	struct mpp_clk_info sclk_info;
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 	struct proc_dir_entry *procfs;
 #endif
 	struct reset_control *rst_a;
@@ -744,7 +744,7 @@ static int iep2_free_task(struct mpp_session *session,
 	return 0;
 }
 
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 static int iep2_procfs_remove(struct mpp_dev *mpp)
 {
 	struct iep2_dev *iep = to_iep2_dev(mpp);
diff --git a/drivers/video/rockchip/mpp/mpp_jpgdec.c b/drivers/video/rockchip/mpp/mpp_jpgdec.c
index 495624138491..5f1def03ee00 100644
--- a/drivers/video/rockchip/mpp/mpp_jpgdec.c
+++ b/drivers/video/rockchip/mpp/mpp_jpgdec.c
@@ -94,7 +94,7 @@ struct jpgdec_dev {
 
 	struct mpp_clk_info aclk_info;
 	struct mpp_clk_info hclk_info;
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 	struct proc_dir_entry *procfs;
 #endif
 	struct reset_control *rst_a;
@@ -351,7 +351,7 @@ static int jpgdec_free_task(struct mpp_session *session,
 	return 0;
 }
 
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 static int jpgdec_procfs_remove(struct mpp_dev *mpp)
 {
 	struct jpgdec_dev *dec = to_jpgdec_dev(mpp);
diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec.c b/drivers/video/rockchip/mpp/mpp_rkvdec.c
index ebfb70054ebb..39b44759ebae 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvdec.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec.c
@@ -161,7 +161,7 @@ struct rkvdec_dev {
 	struct mpp_clk_info cabac_clk_info;
 	struct mpp_clk_info hevc_cabac_clk_info;
 	u32 default_max_load;
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 	struct proc_dir_entry *procfs;
 #endif
 	struct reset_control *rst_a;
@@ -1145,7 +1145,7 @@ static int rkvdec_free_task(struct mpp_session *session,
 	return 0;
 }
 
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 static int rkvdec_procfs_remove(struct mpp_dev *mpp)
 {
 	struct rkvdec_dev *dec = to_rkvdec_dev(mpp);
diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2.c b/drivers/video/rockchip/mpp/mpp_rkvdec2.c
index 882b2dad8e32..302ef66da2e3 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvdec2.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec2.c
@@ -557,7 +557,7 @@ static int rkvdec2_init_session(struct mpp_session *session)
 	return 0;
 }
 
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 static int rkvdec2_procfs_remove(struct mpp_dev *mpp)
 {
 	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2.h b/drivers/video/rockchip/mpp/mpp_rkvdec2.h
index f9302cd8412e..864590036651 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvdec2.h
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec2.h
@@ -170,7 +170,7 @@ struct rkvdec2_dev {
 	struct mpp_clk_info cabac_clk_info;
 	struct mpp_clk_info hevc_cabac_clk_info;
 	u32 default_max_load;
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 	struct proc_dir_entry *procfs;
 #endif
 	struct reset_control *rst_a;
diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c
index a12deb17997c..589781bc53f3 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c
@@ -865,7 +865,7 @@ static int rkvdec2_link_alloc_table(struct mpp_dev *mpp,
 	return ret;
 }
 
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 int rkvdec2_link_procfs_init(struct mpp_dev *mpp)
 {
 	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
diff --git a/drivers/video/rockchip/mpp/mpp_rkvenc.c b/drivers/video/rockchip/mpp/mpp_rkvenc.c
index 1e8517852596..398cb0aa29b7 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvenc.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvenc.c
@@ -184,7 +184,7 @@ struct rkvenc_dev {
 	struct mpp_clk_info hclk_info;
 	struct mpp_clk_info core_clk_info;
 	u32 default_max_load;
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 	struct proc_dir_entry *procfs;
 #endif
 	struct reset_control *rst_a;
@@ -714,7 +714,7 @@ static int rkvenc_init_session(struct mpp_session *session)
 	return 0;
 }
 
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 static int rkvenc_procfs_remove(struct mpp_dev *mpp)
 {
 	struct rkvenc_dev *enc = to_rkvenc_dev(mpp);
diff --git a/drivers/video/rockchip/mpp/mpp_service.c b/drivers/video/rockchip/mpp/mpp_service.c
index b404c726d624..e87284be25d1 100644
--- a/drivers/video/rockchip/mpp/mpp_service.c
+++ b/drivers/video/rockchip/mpp/mpp_service.c
@@ -144,7 +144,7 @@ static int mpp_remove_service(struct mpp_service *srv)
 	return 0;
 }
 
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 static int mpp_procfs_remove(struct mpp_service *srv)
 {
 	if (srv->procfs) {
diff --git a/drivers/video/rockchip/mpp/mpp_vdpu1.c b/drivers/video/rockchip/mpp/mpp_vdpu1.c
index 64de10990d51..f3b0c1dbe516 100644
--- a/drivers/video/rockchip/mpp/mpp_vdpu1.c
+++ b/drivers/video/rockchip/mpp/mpp_vdpu1.c
@@ -118,7 +118,7 @@ struct vdpu_dev {
 
 	struct mpp_clk_info aclk_info;
 	struct mpp_clk_info hclk_info;
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 	struct proc_dir_entry *procfs;
 #endif
 	struct reset_control *rst_a;
@@ -480,7 +480,7 @@ static int vdpu_free_task(struct mpp_session *session,
 	return 0;
 }
 
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 static int vdpu_procfs_remove(struct mpp_dev *mpp)
 {
 	struct vdpu_dev *dec = to_vdpu_dev(mpp);
diff --git a/drivers/video/rockchip/mpp/mpp_vdpu2.c b/drivers/video/rockchip/mpp/mpp_vdpu2.c
index fb0eca81e6f5..98751eb3eab7 100644
--- a/drivers/video/rockchip/mpp/mpp_vdpu2.c
+++ b/drivers/video/rockchip/mpp/mpp_vdpu2.c
@@ -102,7 +102,7 @@ struct vdpu_dev {
 
 	struct mpp_clk_info aclk_info;
 	struct mpp_clk_info hclk_info;
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 	struct proc_dir_entry *procfs;
 #endif
 	struct reset_control *rst_a;
@@ -432,7 +432,7 @@ static int vdpu_free_task(struct mpp_session *session,
 	return 0;
 }
 
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 static int vdpu_procfs_remove(struct mpp_dev *mpp)
 {
 	struct vdpu_dev *dec = to_vdpu_dev(mpp);
diff --git a/drivers/video/rockchip/mpp/mpp_vepu1.c b/drivers/video/rockchip/mpp/mpp_vepu1.c
index f140a0f828b9..1600a7735ffc 100644
--- a/drivers/video/rockchip/mpp/mpp_vepu1.c
+++ b/drivers/video/rockchip/mpp/mpp_vepu1.c
@@ -99,7 +99,7 @@ struct vepu_dev {
 
 	struct mpp_clk_info aclk_info;
 	struct mpp_clk_info hclk_info;
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 	struct proc_dir_entry *procfs;
 #endif
 	struct reset_control *rst_a;
@@ -467,7 +467,7 @@ static int vepu_init_session(struct mpp_session *session)
 	return 0;
 }
 
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 static int vepu_procfs_remove(struct mpp_dev *mpp)
 {
 	struct vepu_dev *enc = to_vepu_dev(mpp);
diff --git a/drivers/video/rockchip/mpp/mpp_vepu2.c b/drivers/video/rockchip/mpp/mpp_vepu2.c
index 541366a4ae51..67f424af6a21 100644
--- a/drivers/video/rockchip/mpp/mpp_vepu2.c
+++ b/drivers/video/rockchip/mpp/mpp_vepu2.c
@@ -115,7 +115,7 @@ struct vepu_dev {
 	struct mpp_clk_info aclk_info;
 	struct mpp_clk_info hclk_info;
 	u32 default_max_load;
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 	struct proc_dir_entry *procfs;
 #endif
 	struct reset_control *rst_a;
@@ -489,7 +489,7 @@ static int vepu_init_session(struct mpp_session *session)
 	return 0;
 }
 
-#ifdef CONFIG_PROC_FS
+#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 static int vepu_procfs_remove(struct mpp_dev *mpp)
 {
 	struct vepu_dev *enc = to_vepu_dev(mpp);

commit 201fbf5da34c52d1c11d2b968a8d7c2ffae36648
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Tue Aug 31 09:39:01 2021 +0800

    drivers: rkflash: support new spiflash
    
    Add F35SQA001G, W25Q128JWSQ, XT25F64F, P25Q32SL, GM25Q128A
    Change XT25F256BSFIGU, MX25U51245G
    
    Change-Id: Ib9f60efbd3aad72044b7f3b0ee5a1a93333f0005
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/rkflash/sfc_nand.c b/drivers/rkflash/sfc_nand.c
index 653799e1cf01..e5acf35fdaaf 100644
--- a/drivers/rkflash/sfc_nand.c
+++ b/drivers/rkflash/sfc_nand.c
@@ -97,6 +97,8 @@ static struct nand_info spi_nand_tbl[] = {
 	{ 0xCD, 0xEB, 0x00, 4, 0x40, 1, 2048, 0x4C, 19, 0x4, 0, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
 	/* FS35ND04G-S2Y2 1*4096 */
 	{ 0xCD, 0xEC, 0x00, 4, 0x40, 2, 2048, 0x4C, 20, 0x4, 0, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
+	/* F35SQA001G */
+	{ 0xCD, 0x71, 0x00, 4, 0x40, 1, 1024, 0x4C, 18, 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 },
diff --git a/drivers/rkflash/sfc_nor.c b/drivers/rkflash/sfc_nor.c
index 11cb4f31cbac..b6bfe353c9df 100644
--- a/drivers/rkflash/sfc_nor.c
+++ b/drivers/rkflash/sfc_nor.c
@@ -40,10 +40,12 @@ static struct flash_info spi_flash_tbl[] = {
 	{ 0xef4019, 128, 8, 0x13, 0x02, 0x6C, 0x32, 0x20, 0xD8, 0x3C, 16, 9, 0 },
 	/* W25Q32JW */
 	{ 0xef6016, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 13, 9, 0 },
-	/* W25Q256JWEQ*/
-	{ 0xef6019, 128, 8, 0x13, 0x02, 0x6C, 0x32, 0x20, 0xD8, 0x3C, 16, 9, 0 },
 	/* W25Q64FWSSIG */
 	{ 0xef6017, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 14, 9, 0 },
+	/* W25Q128JWSQ */
+	{ 0xef6018, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 15, 9, 0 },
+	/* W25Q256JWEQ*/
+	{ 0xef6019, 128, 8, 0x13, 0x02, 0x6C, 0x32, 0x20, 0xD8, 0x3C, 16, 9, 0 },
 	/* W25Q128JVSIM */
 	{ 0xef7018, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 15, 9, 0 },
 	/* W25Q256JVEM */
@@ -60,7 +62,7 @@ static struct flash_info spi_flash_tbl[] = {
 	/* MX25L51245GMI */
 	{ 0xc2201a, 128, 8, 0x13, 0x12, 0x6C, 0x3E, 0x21, 0xDC, 0x1E, 17, 6, 0 },
 	/* MX25U51245G */
-	{ 0xc2253a, 128, 8, 0x13, 0x12, 0x6C, 0x3E, 0x21, 0xDC, 0x1E, 17, 6, 0 },
+	{ 0xc2253a, 128, 8, 0x0C, 0x12, 0x6C, 0x3E, 0x21, 0xDC, 0x1E, 17, 6, 0 },
 	/* MX25U3232F */
 	{ 0xc22536, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0E, 13, 6, 0 },
 	/* MX25U6432F */
@@ -83,12 +85,12 @@ static struct flash_info spi_flash_tbl[] = {
 
 	/* XT25F128A XM25QH128A */
 	{ 0x207018, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 15, 0, 0 },
-	/* XT25F64BSSIGU-5 */
+	/* XT25F64BSSIGU-5 XT25F64F */
 	{ 0x0b4017, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 14, 9, 0 },
 	/* XT25F128BSSIGU */
 	{ 0x0b4018, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 15, 9, 0 },
 	/* XT25F256BSFIGU */
-	{ 0x0b4019, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 16, 9, 0 },
+	{ 0x0b4019, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 16, 9, 0 },
 	/* XT25F32BS */
 	{ 0x0b4016, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 13, 9, 0 },
 	/* XT25F16BS */
@@ -117,6 +119,8 @@ static struct flash_info spi_flash_tbl[] = {
 	{ 0xf83217, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 14, 9, 0 },
 	/* FM25M64C */
 	{ 0xf84317, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 14, 9, 0 },
+	/* P25Q32SL */
+	{ 0x856016, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 13, 9, 0 },
 
 	/* ZB25VQ64 */
 	{ 0x5e4017, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 14, 9, 0 },
@@ -146,6 +150,9 @@ static struct flash_info spi_flash_tbl[] = {
 	{ 0xf84218, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 15, 9, 0 },
 	/* DS25M4AB-1AIB4 */
 	{ 0xe54218, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 15, 9, 0 },
+
+	/* GM25Q128A */
+	{ 0x1c4018, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 15, 9, 0 },
 };
 
 static int snor_write_en(void)
@@ -476,6 +483,7 @@ int snor_read_data(struct SFNOR_DEV *p_dev,
 		op.sfctrl.b.enbledma = 1;
 
 	if (p_dev->read_cmd == CMD_FAST_READ_X1 ||
+	    p_dev->read_cmd == CMD_PAGE_FASTREAD4B ||
 	    p_dev->read_cmd == CMD_FAST_READ_X4 ||
 	    p_dev->read_cmd == CMD_FAST_READ_X2 ||
 	    p_dev->read_cmd == CMD_FAST_4READ_X4) {
diff --git a/drivers/rkflash/sfc_nor.h b/drivers/rkflash/sfc_nor.h
index 950af6a5e686..998121c1bd7a 100644
--- a/drivers/rkflash/sfc_nor.h
+++ b/drivers/rkflash/sfc_nor.h
@@ -33,6 +33,7 @@
 #define CMD_WRITE_EN            (0x06)
 #define CMD_WRITE_DIS           (0x04)
 #define CMD_PAGE_READ           (0x13)
+#define CMD_PAGE_FASTREAD4B     (0x0C)
 #define CMD_GET_FEATURE         (0x0F)
 #define CMD_SET_FEATURE         (0x1F)
 #define CMD_PROG_LOAD           (0x02)

commit 30fc471b5bc1fcf2cfcf54ed3d069f2cd847cb51
Author: Zhihuan He <huan.he@rock-chips.com>
Date:   Thu Aug 26 14:24:06 2021 +0800

    arm64: dts: rockchip: rk3568: add dmcdbg node
    
    Signed-off-by: Zhihuan He <huan.he@rock-chips.com>
    Change-Id: Iab620f4d82f2b55c0a141138d59c80e102e2b829

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index 11738279c642..1f1080f8b3b7 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -2205,6 +2205,11 @@
 		};
 	};
 
+	dmcdbg: dmcdbg {
+		compatible = "rockchip,rk3568-dmcdbg";
+		status = "disabled";
+	};
+
 	pcie2x1: pcie@fe260000 {
 		compatible = "rockchip,rk3568-pcie", "snps,dw-pcie";
 		#address-cells = <3>;

commit 6f922f704174de667c11797aae98256a37270339
Author: Zhihuan He <huan.he@rock-chips.com>
Date:   Thu Aug 26 14:23:23 2021 +0800

    PM / devfreq: rockchip_dmcdbg: add rk3568 support
    
    Signed-off-by: Zhihuan He <huan.he@rock-chips.com>
    Change-Id: I9bf3a5dc18c8f0659bbd9053f6937bfe0f04ef51

diff --git a/drivers/devfreq/rockchip_dmc_dbg.c b/drivers/devfreq/rockchip_dmc_dbg.c
index 180efb0fd16f..c0b9baef7649 100644
--- a/drivers/devfreq/rockchip_dmc_dbg.c
+++ b/drivers/devfreq/rockchip_dmc_dbg.c
@@ -254,6 +254,11 @@ static int dmcinfo_proc_show(struct seq_file *m, void *v)
 			   res.a0);
 		return -ENOMEM;
 	}
+	if (res.a1) {
+		seq_printf(m, "ddrdbg function get dram info error:%lx\n",
+			   res.a1);
+		return -EPERM;
+	}
 
 	if (!dmcdbg_data.inited_flag) {
 		seq_puts(m, "dmcdbg_data no int\n");
@@ -283,7 +288,8 @@ static int dmcinfo_proc_show(struct seq_file *m, void *v)
 					   p_dram_info->dramid[0],
 					   p_dram_info->dramid[1],
 					   p_dram_info->dramid[2]);
-		} else if (strcmp(p_dram_info->dramtype, "LPDDR4") == 0) {
+		} 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,
@@ -1096,12 +1102,34 @@ static __maybe_unused int px30_dmcdbg_init(struct platform_device *pdev,
 	return 0;
 }
 
+static __maybe_unused int rk3568_dmcdbg_init(struct platform_device *pdev,
+					     struct rockchip_dmcdbg *dmcdbg)
+{
+	u32 version = 0x101;
+	int ret;
+
+	ret = rk_dmcdbg_sip_smc_match_ver(pdev, version);
+	if (ret)
+		return ret;
+
+	ret = proc_dmcdbg_init(pdev);
+	if (ret)
+		return ret;
+
+	proc_dmcinfo_init();
+
+	return 0;
+}
+
 static const struct of_device_id rockchip_dmcdbg_of_match[] = {
 #ifdef CONFIG_CPU_PX30
 	{ .compatible = "rockchip,px30-dmcdbg", .data = px30_dmcdbg_init },
 #endif
 #ifdef CONFIG_CPU_RV1126
 	{ .compatible = "rockchip,rv1126-dmcdbg", .data = rv1126_dmcdbg_init },
+#endif
+#ifdef CONFIG_CPU_RK3568
+	{ .compatible = "rockchip,rk3568-dmcdbg", .data = rk3568_dmcdbg_init },
 #endif
 	{ },
 };

commit db30f559af0de1816e7981ee6cef66287563bafb
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Wed Aug 18 18:22:01 2021 +0800

    ASoC: rockchip: pdm: Build depends on CPU config
    
    $ ./scripts/bloat-o-meter rockchip_pdm.o.old rockchip_pdm.o
    add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-980 (-980)
    Function                                     old     new   delta
    rockchip_pdm_match                          1372     392    -980
    Total: Before=7288, After=6308, chg -13.45%
    
    Change-Id: I9450d3a7e3f85482473e2086a0fcb8313d6db30d
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/sound/soc/rockchip/rockchip_pdm.c b/sound/soc/rockchip/rockchip_pdm.c
index 4b69ee9ac0bc..ced2aa6f0287 100644
--- a/sound/soc/rockchip/rockchip_pdm.c
+++ b/sound/soc/rockchip/rockchip_pdm.c
@@ -668,18 +668,30 @@ static const struct regmap_config rockchip_pdm_regmap_config = {
 };
 
 static const struct of_device_id rockchip_pdm_match[] = {
+#ifdef CONFIG_CPU_PX30
 	{ .compatible = "rockchip,px30-pdm",
 	  .data = (void *)RK_PDM_RK3308 },
+#endif
+#ifdef CONFIG_CPU_RK1808
 	{ .compatible = "rockchip,rk1808-pdm",
 	  .data = (void *)RK_PDM_RK3308 },
+#endif
+#ifdef CONFIG_CPU_RK3308
 	{ .compatible = "rockchip,rk3308-pdm",
 	  .data = (void *)RK_PDM_RK3308 },
+#endif
+#ifdef CONFIG_CPU_RK3328
 	{ .compatible = "rockchip,rk3328-pdm",
 	  .data = (void *)RK_PDM_RK3328 },
+#endif
+#ifdef CONFIG_CPU_RK3568
 	{ .compatible = "rockchip,rk3568-pdm",
 	  .data = (void *)RK_PDM_RV1126 },
+#endif
+#ifdef CONFIG_CPU_RV1126
 	{ .compatible = "rockchip,rv1126-pdm",
 	  .data = (void *)RK_PDM_RV1126 },
+#endif
 	{},
 };
 MODULE_DEVICE_TABLE(of, rockchip_pdm_match);

commit a6f29f4e17f9d3af6243401b245150e476451dfc
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Thu Aug 26 16:54:08 2021 +0800

    ARM: dts: rockchip: Drop wrong compatible string for pdm
    
    Change-Id: I93cc4b8e512a02c89b69a18f2d4445ed58a85bff
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/arch/arm/boot/dts/rv1126.dtsi b/arch/arm/boot/dts/rv1126.dtsi
index ebf06e4177c8..5182b613db17 100644
--- a/arch/arm/boot/dts/rv1126.dtsi
+++ b/arch/arm/boot/dts/rv1126.dtsi
@@ -1625,7 +1625,7 @@
 	};
 
 	pdm: pdm@ff830000 {
-		compatible = "rockchip,rv1126-pdm", "rockchip,pdm";
+		compatible = "rockchip,rv1126-pdm";
 		reg = <0xff830000 0x1000>;
 		clocks = <&cru MCLK_PDM>, <&cru HCLK_PDM>;
 		clock-names = "pdm_clk", "pdm_hclk";

commit 2ca5c7450492b4be56bde19e4990b5970234f3f6
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Thu Aug 26 16:53:30 2021 +0800

    arm64: dts: rockchip: Drop wrong compatible string for pdm
    
    Change-Id: I469ef093926b89df5f50c72a9283a2391f729f4f
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/px30.dtsi b/arch/arm64/boot/dts/rockchip/px30.dtsi
index af7edeb0e351..8db7265f86d9 100644
--- a/arch/arm64/boot/dts/rockchip/px30.dtsi
+++ b/arch/arm64/boot/dts/rockchip/px30.dtsi
@@ -540,7 +540,7 @@
 	};
 
 	pdm: pdm@ff0a0000 {
-		compatible = "rockchip,px30-pdm", "rockchip,pdm";
+		compatible = "rockchip,px30-pdm";
 		reg = <0x0 0xff0a0000 0x0 0x1000>;
 		clocks = <&cru SCLK_PDM>, <&cru HCLK_PDM>;
 		clock-names = "pdm_clk", "pdm_hclk";
diff --git a/arch/arm64/boot/dts/rockchip/rk1808.dtsi b/arch/arm64/boot/dts/rockchip/rk1808.dtsi
index 19fa2fdea5fc..5e1f88db1e39 100644
--- a/arch/arm64/boot/dts/rockchip/rk1808.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk1808.dtsi
@@ -1335,7 +1335,7 @@
 	};
 
 	pdm: pdm@ff800000 {
-		compatible = "rockchip,rk1808-pdm", "rockchip,pdm";
+		compatible = "rockchip,rk1808-pdm";
 		reg = <0x0 0xff800000 0x0 0x1000>;
 		clocks = <&cru SCLK_PDM>, <&cru HCLK_PDM>;
 		clock-names = "pdm_clk", "pdm_hclk";
diff --git a/arch/arm64/boot/dts/rockchip/rk3308.dtsi b/arch/arm64/boot/dts/rockchip/rk3308.dtsi
index cb3403c50de5..dd50c25b5827 100644
--- a/arch/arm64/boot/dts/rockchip/rk3308.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3308.dtsi
@@ -1096,7 +1096,7 @@
 	};
 
 	pdm_8ch: pdm@ff380000 {
-		compatible = "rockchip,rk3308-pdm", "rockchip,pdm";
+		compatible = "rockchip,rk3308-pdm";
 		reg = <0x0 0xff380000 0x0 0x1000>;
 		clocks = <&cru SCLK_PDM>, <&cru HCLK_PDM>;
 		clock-names = "pdm_clk", "pdm_hclk";
diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index a18054fb66c3..11738279c642 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -2631,7 +2631,7 @@
 	};
 
 	pdm: pdm@fe440000 {
-		compatible = "rockchip,rk3568-pdm", "rockchip,pdm";
+		compatible = "rockchip,rk3568-pdm";
 		reg = <0x0 0xfe440000 0x0 0x1000>;
 		clocks = <&cru MCLK_PDM>, <&cru HCLK_PDM>;
 		clock-names = "pdm_clk", "pdm_hclk";

commit 08bdd7eeb8d0360d377f7e611684d2da95735ea7
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Thu Aug 26 16:47:09 2021 +0800

    ASoC: rockchip: pdm: Rename compatible string for rk3328
    
    - correct the wrong type 'RK3229', should be type 'RK3328'
    - rename compatible 'rockchip,pdm' to 'rockchip,rk3328-pdm'
      for better match.
    
    Change-Id: I0156bd114a3a89ddcda077587366351521dfb701
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/Documentation/devicetree/bindings/sound/rockchip,pdm.txt b/Documentation/devicetree/bindings/sound/rockchip,pdm.txt
index 688b6c7c5453..4f6da7edf3b2 100644
--- a/Documentation/devicetree/bindings/sound/rockchip,pdm.txt
+++ b/Documentation/devicetree/bindings/sound/rockchip,pdm.txt
@@ -2,10 +2,11 @@
 
 Required properties:
 
-- compatible: "rockchip,pdm"
+- compatible:
   - "rockchip,px30-pdm"
   - "rockchip,rk1808-pdm"
   - "rockchip,rk3308-pdm"
+  - "rockchip,rk3328-pdm"
   - "rockchip,rk3568-pdm"
   - "rockchip,rv1126-pdm"
 - reg: physical base address of the controller and length of memory mapped
diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
index d059409263f8..35eacbec074d 100644
--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
@@ -286,7 +286,7 @@
 	};
 
 	pdm: pdm@ff040000 {
-		compatible = "rockchip,pdm";
+		compatible = "rockchip,rk3328-pdm";
 		reg = <0x0 0xff040000 0x0 0x1000>;
 		clocks = <&cru SCLK_PDM>, <&cru HCLK_PDM>;
 		clock-names = "pdm_clk", "pdm_hclk";
diff --git a/sound/soc/rockchip/rockchip_pdm.c b/sound/soc/rockchip/rockchip_pdm.c
index a54c8caca291..4b69ee9ac0bc 100644
--- a/sound/soc/rockchip/rockchip_pdm.c
+++ b/sound/soc/rockchip/rockchip_pdm.c
@@ -36,8 +36,8 @@
 #define CLK_PPM_MAX		(1000)
 
 enum rk_pdm_version {
-	RK_PDM_RK3229,
 	RK_PDM_RK3308,
+	RK_PDM_RK3328,
 	RK_PDM_RV1126,
 };
 
@@ -359,7 +359,7 @@ static int rockchip_pdm_hw_params(struct snd_pcm_substream *substream,
 	regmap_update_bits(pdm->regmap, PDM_HPF_CTRL,
 			   PDM_HPF_LE | PDM_HPF_RE, PDM_HPF_LE | PDM_HPF_RE);
 	regmap_update_bits(pdm->regmap, PDM_CLK_CTRL, PDM_CLK_EN, PDM_CLK_EN);
-	if (pdm->version != RK_PDM_RK3229)
+	if (pdm->version != RK_PDM_RK3328)
 		regmap_update_bits(pdm->regmap, PDM_CTRL0,
 				   PDM_MODE_MSK, PDM_MODE_LJ);
 
@@ -668,14 +668,14 @@ static const struct regmap_config rockchip_pdm_regmap_config = {
 };
 
 static const struct of_device_id rockchip_pdm_match[] = {
-	{ .compatible = "rockchip,pdm",
-	  .data = (void *)RK_PDM_RK3229 },
 	{ .compatible = "rockchip,px30-pdm",
 	  .data = (void *)RK_PDM_RK3308 },
 	{ .compatible = "rockchip,rk1808-pdm",
 	  .data = (void *)RK_PDM_RK3308 },
 	{ .compatible = "rockchip,rk3308-pdm",
 	  .data = (void *)RK_PDM_RK3308 },
+	{ .compatible = "rockchip,rk3328-pdm",
+	  .data = (void *)RK_PDM_RK3328 },
 	{ .compatible = "rockchip,rk3568-pdm",
 	  .data = (void *)RK_PDM_RV1126 },
 	{ .compatible = "rockchip,rv1126-pdm",

commit 17a85268b779ee985c38c096d69c9493571f1cda
Author: Damon Ding <damon.ding@rock-chips.com>
Date:   Fri Aug 27 19:05:38 2021 +0800

    drm/rockchip: vop: separate the of_device_id array by different SoC
    
    Separate the process of device matching by the different SoC macro
    definitions, which can reduce memory usage.
    
    make ARCH=arm rv1126_defconfig
    
    ./ksize.sh  drivers/gpu/drm/
    
    before ksize: 579486 Bytes
    after  kszie: 556038 Bytes
    save   about: 23448  Bytes
    
    Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
    Change-Id: I6b3689b11598120aad16956235d1ee2bbdbe80e0

diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
index 89adf53816e4..7c02fa511b43 100644
--- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
+++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c
@@ -1766,36 +1766,58 @@ static const struct vop_data rv1126_vop = {
 };
 
 static const struct of_device_id vop_driver_dt_match[] = {
+#if IS_ENABLED(CONFIG_CPU_RK3036)
 	{ .compatible = "rockchip,rk3036-vop",
 	  .data = &rk3036_vop },
+#endif
+#if IS_ENABLED(CONFIG_CPU_RK30XX)
 	{ .compatible = "rockchip,rk3066-vop",
 	  .data = &rk3066_vop },
+#endif
+#if IS_ENABLED(CONFIG_CPU_RK312X)
 	{ .compatible = "rockchip,rk3126-vop",
 	  .data = &rk3126_vop },
+#endif
+#if IS_ENABLED(CONFIG_CPU_PX30)
 	{ .compatible = "rockchip,px30-vop-lit",
 	  .data = &px30_vop_lit },
 	{ .compatible = "rockchip,px30-vop-big",
 	  .data = &px30_vop_big },
+#endif
+#if IS_ENABLED(CONFIG_CPU_RK3308)
 	{ .compatible = "rockchip,rk3308-vop",
 	  .data = &rk3308_vop },
+#endif
+#if IS_ENABLED(CONFIG_CPU_RV1126)
 	{ .compatible = "rockchip,rv1126-vop",
 	  .data = &rv1126_vop },
+#endif
+#if IS_ENABLED(CONFIG_CPU_RK3288)
 	{ .compatible = "rockchip,rk3288-vop-big",
 	  .data = &rk3288_vop_big },
 	{ .compatible = "rockchip,rk3288-vop-lit",
 	  .data = &rk3288_vop_lit },
+#endif
+#if IS_ENABLED(CONFIG_CPU_RK3368)
 	{ .compatible = "rockchip,rk3368-vop",
 	  .data = &rk3368_vop },
 	{ .compatible = "rockchip,rk3366-vop",
 	  .data = &rk3366_vop },
+#endif
+#if IS_ENABLED(CONFIG_CPU_RK3399)
 	{ .compatible = "rockchip,rk3399-vop-big",
 	  .data = &rk3399_vop_big },
 	{ .compatible = "rockchip,rk3399-vop-lit",
 	  .data = &rk3399_vop_lit },
+#endif
+#if IS_ENABLED(CONFIG_CPU_RK322X)
 	{ .compatible = "rockchip,rk3228-vop",
 	  .data = &rk3228_vop },
+#endif
+#if IS_ENABLED(CONFIG_CPU_RK3328)
 	{ .compatible = "rockchip,rk3328-vop",
 	  .data = &rk3328_vop },
+#endif
 	{},
 };
 MODULE_DEVICE_TABLE(of, vop_driver_dt_match);

commit 1e9ad2a9baaf570df2a091dadac030df33ae869f
Author: Damon Ding <damon.ding@rock-chips.com>
Date:   Thu Aug 26 10:26:29 2021 +0800

    drm/rockchip: add config options of VOP and VOP2 driver
    
    rv1126 does not support VOP2, so add config options to
    reduce memory usage.
    
    make ARCH=arm rv1126_defconfig
    
    ./ksize.sh  drivers/gpu/drm/
    
    before ksize: 675434 Bytes
    after  kszie: 581268 Bytes
    save   about: 94166  Bytes
    
    In addition, improve the format of space and tab, and remove
    extra "depends on DRM_ROCKCHIP".
    
    Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
    Change-Id: I2b29a543a7e52e4e4b72112980e2c6dc6c6cce92

diff --git a/drivers/gpu/drm/rockchip/Kconfig b/drivers/gpu/drm/rockchip/Kconfig
index ad6f6f19bbf8..505c59e5c862 100644
--- a/drivers/gpu/drm/rockchip/Kconfig
+++ b/drivers/gpu/drm/rockchip/Kconfig
@@ -20,13 +20,27 @@ if DRM_ROCKCHIP
 
 config ROCKCHIP_DRM_DEBUG
 	tristate "Rockchip DRM debug"
-	depends on DRM_ROCKCHIP
 	help
 	  This option add a debug node to dump buf from application.
 	  dump buffer store at: /data/vop_buf
 	  debug node: /d/dri/0/ff900000.vop/vop_dump/dump
 	  cat /d/dri/0/ff900000.vop/vop_dump/dump get more help.
 
+config ROCKCHIP_VOP
+	bool "Rockchip VOP driver"
+	default y
+	help
+	  This selects support for the VOP driver.If you want to
+	  enable VOP on Rockchip SoC, you should selet this option.
+
+config ROCKCHIP_VOP2
+	bool "Rockchip VOP2 driver"
+	default y if !CPU_RV1126
+	help
+	  This selects support for the VOP2 driver. If you want to
+	  enable VOP2 on RK3566 and RK3568 based SoC, you should
+	  selet this option.
+
 config ROCKCHIP_ANALOGIX_DP
 	bool "Rockchip specific extensions for Analogix DP driver"
 	help
@@ -35,17 +49,17 @@ config ROCKCHIP_ANALOGIX_DP
 	  on RK3288 based SoC, you should selet this option.
 
 config ROCKCHIP_CDN_DP
-        bool "Rockchip cdn DP"
+	bool "Rockchip cdn DP"
 	depends on EXTCON=y || (EXTCON=m && DRM_ROCKCHIP=m)
-        help
+	help
 	  This selects support for Rockchip SoC specific extensions
 	  for the cdn DP driver. If you want to enable Dp on
 	  RK3399 based SoC, you should select this
 	  option.
 
 config ROCKCHIP_DW_HDMI
-        bool "Rockchip specific extensions for Synopsys DW HDMI"
-        help
+	bool "Rockchip specific extensions for Synopsys DW HDMI"
+	help
 	  This selects support for Rockchip SoC specific extensions
 	  for the Synopsys DesignWare HDMI driver. If you want to
 	  enable HDMI on RK3288 based SoC, you should selet this
@@ -54,10 +68,10 @@ config ROCKCHIP_DW_HDMI
 config ROCKCHIP_DW_MIPI_DSI
 	bool "Rockchip specific extensions for Synopsys DW MIPI DSI"
 	help
-	 This selects support for Rockchip SoC specific extensions
-	 for the Synopsys DesignWare HDMI driver. If you want to
-	 enable MIPI DSI on RK3288 based SoC, you should selet this
-	 option.
+	  This selects support for Rockchip SoC specific extensions
+	  for the Synopsys DesignWare HDMI driver. If you want to
+	  enable MIPI DSI on RK3288 based SoC, you should selet this
+	  option.
 
 config ROCKCHIP_INNO_HDMI
 	bool "Rockchip specific extensions for Innosilicon HDMI"
@@ -68,7 +82,6 @@ config ROCKCHIP_INNO_HDMI
 
 config ROCKCHIP_LVDS
 	bool "Rockchip LVDS support"
-	depends on DRM_ROCKCHIP
 	depends on PINCTRL && OF
 	help
 	  Choose this option to enable support for Rockchip LVDS controllers.
@@ -78,14 +91,12 @@ config ROCKCHIP_LVDS
 
 config ROCKCHIP_DRM_TVE
 	bool "Rockchip TVE support"
-	depends on DRM_ROCKCHIP
 	help
 	  Choose this option to enable support for Rockchip TVE controllers.
 	  say Y to enable its driver.
 
 config ROCKCHIP_RGB
 	bool "Rockchip RGB support"
-	depends on DRM_ROCKCHIP
 	depends on PINCTRL
 	help
 	  Choose this option to enable support for Rockchip RGB output.
@@ -95,11 +106,10 @@ config ROCKCHIP_RGB
 
 config DRM_ROCKCHIP_VVOP
 	tristate "Rockchip virtual VOP drm driver"
-	depends on DRM_ROCKCHIP
 	help
-	   Say y here if you want use some module of rockchip drm, but
-	   don't need a real vop driver(et: you just want rockchip drm
-	   gem driver to allocate memory).
+	  Say y here if you want use some module of rockchip drm, but
+	  don't need a real vop driver(et: you just want rockchip drm
+	  gem driver to allocate memory).
 
 source "drivers/gpu/drm/rockchip/ebc-dev/Kconfig"
 source "drivers/gpu/drm/rockchip/rk618/Kconfig"
diff --git a/drivers/gpu/drm/rockchip/Makefile b/drivers/gpu/drm/rockchip/Makefile
index 83c7360fc058..9e2c68dbd3d9 100644
--- a/drivers/gpu/drm/rockchip/Makefile
+++ b/drivers/gpu/drm/rockchip/Makefile
@@ -4,9 +4,11 @@
 # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
 
 rockchipdrm-y := rockchip_drm_drv.o rockchip_drm_fb.o \
-		rockchip_drm_gem.o rockchip_drm_psr.o \
-		rockchip_drm_vop.o rockchip_vop_reg.o \
-		rockchip_drm_vop2.o rockchip_vop2_reg.o
+		rockchip_drm_gem.o 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_DRM_FBDEV_EMULATION) += rockchip_drm_fbdev.o
 
 rockchipdrm-$(CONFIG_ROCKCHIP_ANALOGIX_DP) += analogix_dp-rockchip.o
diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c
index 77aac02da7c1..c2d7db8fda87 100644
--- a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c
+++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c
@@ -1095,7 +1095,7 @@ static void dw_mipi_dsi_encoder_disable(struct drm_encoder *encoder)
 	if (dsi->panel)
 		drm_panel_disable(dsi->panel);
 
-	if (dsi->pdata->soc_type == RK3568)
+	if (IS_ENABLED(CONFIG_CPU_RK3568) && dsi->pdata->soc_type == RK3568)
 		vop2_standby(encoder->crtc, 1);
 
 	dw_mipi_dsi_disable(dsi);
@@ -1103,7 +1103,7 @@ static void dw_mipi_dsi_encoder_disable(struct drm_encoder *encoder)
 		drm_panel_unprepare(dsi->panel);
 	dw_mipi_dsi_post_disable(dsi);
 
-	if (dsi->pdata->soc_type == RK3568)
+	if (IS_ENABLED(CONFIG_CPU_RK3568) && dsi->pdata->soc_type == RK3568)
 		vop2_standby(encoder->crtc, 0);
 }
 
@@ -1339,7 +1339,7 @@ static void dw_mipi_dsi_encoder_enable(struct drm_encoder *encoder)
 
 	dw_mipi_dsi_vop_routing(dsi);
 
-	if (dsi->pdata->soc_type == RK3568)
+	if (IS_ENABLED(CONFIG_CPU_RK3568) && dsi->pdata->soc_type == RK3568)
 		vop2_standby(encoder->crtc, 1);
 
 	dw_mipi_dsi_pre_enable(dsi);
@@ -1347,7 +1347,7 @@ static void dw_mipi_dsi_encoder_enable(struct drm_encoder *encoder)
 		drm_panel_prepare(dsi->panel);
 	dw_mipi_dsi_enable(dsi);
 
-	if (dsi->pdata->soc_type == RK3568)
+	if (IS_ENABLED(CONFIG_CPU_RK3568) && dsi->pdata->soc_type == RK3568)
 		vop2_standby(encoder->crtc, 0);
 
 	if (dsi->panel)
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index 95751a3e7fb6..fc268eefd211 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -2345,8 +2345,8 @@ static int __init rockchip_drm_init(void)
 #if IS_ENABLED(CONFIG_DRM_ROCKCHIP_VVOP)
 	ADD_ROCKCHIP_SUB_DRIVER(vvop_platform_driver, CONFIG_DRM_ROCKCHIP_VVOP);
 #else
-	ADD_ROCKCHIP_SUB_DRIVER(vop_platform_driver, CONFIG_DRM_ROCKCHIP);
-	ADD_ROCKCHIP_SUB_DRIVER(vop2_platform_driver, CONFIG_DRM_ROCKCHIP);
+	ADD_ROCKCHIP_SUB_DRIVER(vop_platform_driver, CONFIG_ROCKCHIP_VOP);
+	ADD_ROCKCHIP_SUB_DRIVER(vop2_platform_driver, CONFIG_ROCKCHIP_VOP2);
 	ADD_ROCKCHIP_SUB_DRIVER(rockchip_lvds_driver,
 				CONFIG_ROCKCHIP_LVDS);
 	ADD_ROCKCHIP_SUB_DRIVER(rockchip_dp_driver,

commit 05163ed0483345ec34ced88b64931e283dbcab6f
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Mon Aug 30 16:58:52 2021 +0800

    ASoC: rockchip: i2s-tdm: Add HAVE_SYNC_RESET config
    
    $ ./scripts/bloat-o-meter rockchip_i2s_tdm.o.old rockchip_i2s_tdm.o
    add/remove: 0/2 grow/shrink: 0/3 up/down: 0/-948 (-948)
    Function                                     old     new   delta
    rockchip_i2s_tdm_hw_params                  2768    2760      -8
    rockchip_i2s_tdm_trigger                    1232    1216     -16
    of_i2s_resetid_get                           124       -    -124
    rockchip_i2s_tdm_probe                      1676    1496    -180
    rockchip_snd_xfer_sync_reset                 620       -    -620
    Total: Before=12012, After=11064, chg -7.89%
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: I3cffc57ca5fe4271d4a2c9584383777871123f14

diff --git a/sound/soc/rockchip/rockchip_i2s_tdm.c b/sound/soc/rockchip/rockchip_i2s_tdm.c
index 442e6c86d204..c76e3f4592e5 100644
--- a/sound/soc/rockchip/rockchip_i2s_tdm.c
+++ b/sound/soc/rockchip/rockchip_i2s_tdm.c
@@ -31,6 +31,10 @@
 
 #define DRV_NAME "rockchip-i2s-tdm"
 
+#if IS_ENABLED(CONFIG_CPU_PX30) || IS_ENABLED(CONFIG_CPU_RK1808) || IS_ENABLED(CONFIG_CPU_RK3308)
+#define HAVE_SYNC_RESET
+#endif
+
 #define DEFAULT_MCLK_FS				256
 #define CH_GRP_MAX				4  /* The max channel 8 / 2 */
 #define MULTIPLEX_CH_MAX			10
@@ -79,7 +83,11 @@ struct rk_i2s_tdm_dev {
 	struct reset_control *tx_reset;
 	struct reset_control *rx_reset;
 	const struct rk_i2s_soc_data *soc_data;
+#ifdef HAVE_SYNC_RESET
 	void __iomem *cru_base;
+	int tx_reset_id;
+	int rx_reset_id;
+#endif
 	bool is_master_mode;
 	bool io_multiplex;
 	bool mclk_calibrate;
@@ -96,8 +104,6 @@ struct rk_i2s_tdm_dev {
 	unsigned int i2s_sdis[CH_GRP_MAX];
 	unsigned int i2s_sdos[CH_GRP_MAX];
 	int clk_ppm;
-	int tx_reset_id;
-	int rx_reset_id;
 	atomic_t refcount;
 	spinlock_t lock; /* xfer lock */
 };
@@ -166,6 +172,7 @@ static inline struct rk_i2s_tdm_dev *to_info(struct snd_soc_dai *dai)
 	return snd_soc_dai_get_drvdata(dai);
 }
 
+#ifdef HAVE_SYNC_RESET
 #if defined(CONFIG_ARM) && !defined(writeq)
 static inline void __raw_writeq(u64 val, volatile void __iomem *addr)
 {
@@ -297,6 +304,11 @@ static void rockchip_snd_xfer_sync_reset(struct rk_i2s_tdm_dev *i2s_tdm)
 	rockchip_snd_xfer_reset_deassert(i2s_tdm, tx_bank, tx_offset,
 					 rx_bank, rx_offset);
 }
+#else
+static inline void rockchip_snd_xfer_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,
@@ -1481,6 +1493,7 @@ static const struct of_device_id rockchip_i2s_tdm_match[] = {
 	{},
 };
 
+#ifdef HAVE_SYNC_RESET
 static int of_i2s_resetid_get(struct device_node *node,
 			      const char *id)
 {
@@ -1498,6 +1511,7 @@ static int of_i2s_resetid_get(struct device_node *node,
 
 	return args.args[0];
 }
+#endif
 
 static int rockchip_i2s_tdm_dai_prepare(struct platform_device *pdev,
 					struct snd_soc_dai_driver **soc_dai)
@@ -1683,13 +1697,14 @@ static int rockchip_i2s_tdm_rx_path_prepare(struct rk_i2s_tdm_dev *i2s_tdm,
 static int rockchip_i2s_tdm_probe(struct platform_device *pdev)
 {
 	struct device_node *node = pdev->dev.of_node;
-	struct device_node *cru_node;
 	const struct of_device_id *of_id;
 	struct rk_i2s_tdm_dev *i2s_tdm;
 	struct snd_soc_dai_driver *soc_dai;
 	struct resource *res;
 	void __iomem *regs;
+#ifdef HAVE_SYNC_RESET
 	bool sync;
+#endif
 	int ret;
 	int val;
 
@@ -1737,11 +1752,14 @@ static int rockchip_i2s_tdm_probe(struct platform_device *pdev)
 	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") ||
 	       of_device_is_compatible(node, "rockchip,rk1808-i2s-tdm") ||
 	       of_device_is_compatible(node, "rockchip,rk3308-i2s-tdm");
 
 	if (i2s_tdm->clk_trcm && sync) {
+		struct device_node *cru_node;
+
 		cru_node = of_parse_phandle(node, "rockchip,cru", 0);
 		i2s_tdm->cru_base = of_iomap(cru_node, 0);
 		if (!i2s_tdm->cru_base)
@@ -1750,6 +1768,7 @@ static int rockchip_i2s_tdm_probe(struct platform_device *pdev)
 		i2s_tdm->tx_reset_id = of_i2s_resetid_get(node, "tx-m");
 		i2s_tdm->rx_reset_id = of_i2s_resetid_get(node, "rx-m");
 	}
+#endif
 
 	i2s_tdm->tx_reset = devm_reset_control_get(&pdev->dev, "tx-m");
 	if (IS_ERR(i2s_tdm->tx_reset)) {

commit c63e6495a8738735a233559bce2272ca3df12d30
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Wed Aug 18 18:12:33 2021 +0800

    ASoC: rockchip: i2s-tdm: Build depends on CPU config
    
    $ ./scripts/bloat-o-meter rockchip_i2s_tdm.o.old rockchip_i2s_tdm.o
    add/remove: 0/8 grow/shrink: 0/1 up/down: 0/-992 (-992)
    Function                                     old     new   delta
    rk1808_txrx_config                            16       -     -16
    px30_txrx_config                              16       -     -16
    rk3568_i2s_soc_data                           24       -     -24
    rk3308_i2s_soc_data                           24       -     -24
    rk1808_i2s_soc_data                           24       -     -24
    px30_i2s_soc_data                             24       -     -24
    rk3308_txrx_config                            32       -     -32
    rk3568_txrx_config                            48       -     -48
    rockchip_i2s_tdm_match                      1176     392    -784
    Total: Before=13004, After=12012, chg -7.63%
    
    Change-Id: Iaedb9e9b11b38255a7a5b57a9a77c1523fc9d515
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/sound/soc/rockchip/rockchip_i2s_tdm.c b/sound/soc/rockchip/rockchip_i2s_tdm.c
index f920c9bf7123..442e6c86d204 100644
--- a/sound/soc/rockchip/rockchip_i2s_tdm.c
+++ b/sound/soc/rockchip/rockchip_i2s_tdm.c
@@ -1463,11 +1463,21 @@ static const struct rk_i2s_soc_data rv1126_i2s_soc_data = {
 };
 
 static const struct of_device_id rockchip_i2s_tdm_match[] = {
+#ifdef CONFIG_CPU_PX30
 	{ .compatible = "rockchip,px30-i2s-tdm", .data = &px30_i2s_soc_data },
+#endif
+#ifdef CONFIG_CPU_RK1808
 	{ .compatible = "rockchip,rk1808-i2s-tdm", .data = &rk1808_i2s_soc_data },
+#endif
+#ifdef CONFIG_CPU_RK3308
 	{ .compatible = "rockchip,rk3308-i2s-tdm", .data = &rk3308_i2s_soc_data },
+#endif
+#ifdef CONFIG_CPU_RK3568
 	{ .compatible = "rockchip,rk3568-i2s-tdm", .data = &rk3568_i2s_soc_data },
+#endif
+#ifdef CONFIG_CPU_RV1126
 	{ .compatible = "rockchip,rv1126-i2s-tdm", .data = &rv1126_i2s_soc_data },
+#endif
 	{},
 };
 

commit 67edaaefd3d0b5d278c80809b03c22370508e2a1
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Wed Aug 18 20:16:17 2021 +0800

    ASoC: rockchip: i2s: Build depends on CPU config
    
    $ ./scripts/bloat-o-meter rockchip_i2s.o.old rockchip_i2s.o
    add/remove: 0/1 grow/shrink: 0/1 up/down: 0/-1968 (-1968)
    Function                                     old     new   delta
    rk3399_i2s_pins                                8       -      -8
    rockchip_i2s_match                          2548     588   -1960
    Total: Before=8656, After=6688, chg -22.74%
    
    Change-Id: Iabb0a00ab27ce5623164d40de6b379272a81e4e5
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c
index b8592c7631f2..c497e2018436 100644
--- a/sound/soc/rockchip/rockchip_i2s.c
+++ b/sound/soc/rockchip/rockchip_i2s.c
@@ -728,18 +728,40 @@ static const struct rk_i2s_pins rk3399_i2s_pins = {
 };
 
 static const struct of_device_id rockchip_i2s_match[] = {
+#ifdef CONFIG_CPU_PX30
 	{ .compatible = "rockchip,px30-i2s", },
+#endif
+#ifdef CONFIG_CPU_RK1808
 	{ .compatible = "rockchip,rk1808-i2s", },
+#endif
+#ifdef CONFIG_CPU_RK3036
 	{ .compatible = "rockchip,rk3036-i2s", },
+#endif
 	{ .compatible = "rockchip,rk3066-i2s", },
+#ifdef CONFIG_CPU_RK312X
 	{ .compatible = "rockchip,rk3128-i2s", },
+#endif
+#ifdef CONFIG_CPU_RK3188
 	{ .compatible = "rockchip,rk3188-i2s", },
+#endif
+#ifdef CONFIG_CPU_RK3288
 	{ .compatible = "rockchip,rk3288-i2s", },
+#endif
+#ifdef CONFIG_CPU_RK3308
 	{ .compatible = "rockchip,rk3308-i2s", },
+#endif
+#ifdef CONFIG_CPU_RK3328
 	{ .compatible = "rockchip,rk3328-i2s", },
+#endif
+#ifdef CONFIG_CPU_RK3368
 	{ .compatible = "rockchip,rk3368-i2s", },
+#endif
+#ifdef CONFIG_CPU_RK3399
 	{ .compatible = "rockchip,rk3399-i2s", .data = &rk3399_i2s_pins },
+#endif
+#ifdef CONFIG_CPU_RV1126
 	{ .compatible = "rockchip,rv1126-i2s", },
+#endif
 	{},
 };
 

commit 57bb0f725d456fca8763a08f2c71f2e92c8d011f
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Wed Aug 25 20:16:29 2021 +0800

    ASoC: rockchip: i2s-tdm: Delay for reset successfully
    
    This patch adds delay for rockchip_snd_reset().
    
    Fixes: 03eca205254a ("ASoC: rockchip: i2s-tdm: Delay for reset successfully")
    
    Change-Id: I59c507dd8d4cc8fe756230e1eaab2ab35b33331a
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/sound/soc/rockchip/rockchip_i2s_tdm.c b/sound/soc/rockchip/rockchip_i2s_tdm.c
index bfd24cb3f416..f920c9bf7123 100644
--- a/sound/soc/rockchip/rockchip_i2s_tdm.c
+++ b/sound/soc/rockchip/rockchip_i2s_tdm.c
@@ -371,8 +371,11 @@ static void rockchip_snd_reset(struct reset_control *rc)
 		return;
 
 	reset_control_assert(rc);
-	udelay(1);
+	/* delay for reset assert done */
+	udelay(10);
 	reset_control_deassert(rc);
+	/* delay for reset deassert done */
+	udelay(10);
 }
 
 static void rockchip_snd_txctrl(struct rk_i2s_tdm_dev *i2s_tdm, int on)

commit f5d0e3dded62f401c0dfd82019050090ac2d0faf
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Mon Aug 30 11:27:27 2021 +0800

    ARM: dts: rv1126-dictionary-pen-v11: disable usb host0
    
    Change-Id: Ib7208c5b075cd6fa699fdce344771c663c02f3d6
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/arch/arm/boot/dts/rv1126-dictionary-pen-v11.dts b/arch/arm/boot/dts/rv1126-dictionary-pen-v11.dts
index c19514712c8f..4688583a9139 100644
--- a/arch/arm/boot/dts/rv1126-dictionary-pen-v11.dts
+++ b/arch/arm/boot/dts/rv1126-dictionary-pen-v11.dts
@@ -1134,24 +1134,12 @@
 	};
 };
 
-&u2phy1 {
-	status = "disabled";
-};
-
 &uart0 {
 	pinctrl-names = "default";
 	pinctrl-0 = <&uart0_xfer &uart0_ctsn>;
 	status = "okay";
 };
 
-&usb_host0_ehci {
-	status = "okay";
-};
-
-&usb_host0_ohci {
-	status = "okay";
-};
-
 &usbdrd {
 	status = "okay";
 };

commit b0c5b896a63e4de316db9765eca5e2e48a9899df
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Fri Aug 27 18:38:12 2021 +0200

    Revert "net: igmp: fix data-race in igmp_ifc_timer_expire()"
    
    This reverts commit fb5db3106036f4e21a63c0c6b08db4b4f18f157c which is
    commit 4a2b285e7e103d4d6c6ed3e5052a0ff74a5d7f15 upstream.
    
    It breaks the kernel abi (well the fix for this fix does), and is not
    needed for Android devices.
    
    Cc: Eric Dumazet <edumazet@google.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I1c59c60493d216f1671b110a948f38293a0925ee

diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c
index 95ec3923083f..ffa847fc9619 100644
--- a/net/ipv4/igmp.c
+++ b/net/ipv4/igmp.c
@@ -807,17 +807,10 @@ static void igmp_gq_timer_expire(struct timer_list *t)
 static void igmp_ifc_timer_expire(struct timer_list *t)
 {
 	struct in_device *in_dev = from_timer(in_dev, t, mr_ifc_timer);
-	u8 mr_ifc_count;
 
 	igmpv3_send_cr(in_dev);
-restart:
-	mr_ifc_count = READ_ONCE(in_dev->mr_ifc_count);
-
-	if (mr_ifc_count) {
-		if (cmpxchg(&in_dev->mr_ifc_count,
-			    mr_ifc_count,
-			    mr_ifc_count - 1) != mr_ifc_count)
-			goto restart;
+	if (in_dev->mr_ifc_count) {
+		in_dev->mr_ifc_count--;
 		igmp_ifc_start_timer(in_dev,
 				     unsolicited_report_interval(in_dev));
 	}
@@ -829,7 +822,7 @@ static void igmp_ifc_event(struct in_device *in_dev)
 	struct net *net = dev_net(in_dev->dev);
 	if (IGMP_V1_SEEN(in_dev) || IGMP_V2_SEEN(in_dev))
 		return;
-	WRITE_ONCE(in_dev->mr_ifc_count, in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv);
+	in_dev->mr_ifc_count = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv;
 	igmp_ifc_start_timer(in_dev, 1);
 }
 
@@ -968,7 +961,7 @@ static bool igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,
 				in_dev->mr_qri;
 		}
 		/* cancel the interface change timer */
-		WRITE_ONCE(in_dev->mr_ifc_count, 0);
+		in_dev->mr_ifc_count = 0;
 		if (del_timer(&in_dev->mr_ifc_timer))
 			__in_dev_put(in_dev);
 		/* clear deleted report items */
@@ -1746,7 +1739,7 @@ void ip_mc_down(struct in_device *in_dev)
 		igmp_group_dropped(pmc);
 
 #ifdef CONFIG_IP_MULTICAST
-	WRITE_ONCE(in_dev->mr_ifc_count, 0);
+	in_dev->mr_ifc_count = 0;
 	if (del_timer(&in_dev->mr_ifc_timer))
 		__in_dev_put(in_dev);
 	in_dev->mr_gq_running = 0;
@@ -1963,7 +1956,7 @@ static int ip_mc_del_src(struct in_device *in_dev, __be32 *pmca, int sfmode,
 		pmc->sfmode = MCAST_INCLUDE;
 #ifdef CONFIG_IP_MULTICAST
 		pmc->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv;
-		WRITE_ONCE(in_dev->mr_ifc_count, pmc->crcount);
+		in_dev->mr_ifc_count = pmc->crcount;
 		for (psf = pmc->sources; psf; psf = psf->sf_next)
 			psf->sf_crcount = 0;
 		igmp_ifc_event(pmc->interface);
@@ -2142,7 +2135,7 @@ static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode,
 		/* else no filters; keep old mode for reports */
 
 		pmc->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv;
-		WRITE_ONCE(in_dev->mr_ifc_count, pmc->crcount);
+		in_dev->mr_ifc_count = pmc->crcount;
 		for (psf = pmc->sources; psf; psf = psf->sf_next)
 			psf->sf_crcount = 0;
 		igmp_ifc_event(in_dev);

commit a8cceb852a25c860c8c37e8d5f2d20d4a02c0fbe
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Fri Aug 27 17:58:18 2021 +0200

    Revert "net: igmp: increase size of mr_ifc_count"
    
    This reverts commit ec75ebd1645e3ca57c0d6bf8482c0ad775491703 which is
    commit b69dd5b3780a7298bd893816a09da751bc0636f7 upstream.
    
    This breaks the kernel abi and is not an issue for Android systems.
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I1006e8d8ca58cf07ea23404e386ba58651424eb2
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>

diff --git a/include/linux/inetdevice.h b/include/linux/inetdevice.h
index 131f93f8d587..a64f21a97369 100644
--- a/include/linux/inetdevice.h
+++ b/include/linux/inetdevice.h
@@ -41,7 +41,7 @@ struct in_device {
 	unsigned long		mr_qri;		/* Query Response Interval */
 	unsigned char		mr_qrv;		/* Query Robustness Variable */
 	unsigned char		mr_gq_running;
-	u32			mr_ifc_count;
+	unsigned char		mr_ifc_count;
 	struct timer_list	mr_gq_timer;	/* general query timer */
 	struct timer_list	mr_ifc_timer;	/* interface change timer */
 
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c
index dca7fe0ae24a..95ec3923083f 100644
--- a/net/ipv4/igmp.c
+++ b/net/ipv4/igmp.c
@@ -807,7 +807,7 @@ static void igmp_gq_timer_expire(struct timer_list *t)
 static void igmp_ifc_timer_expire(struct timer_list *t)
 {
 	struct in_device *in_dev = from_timer(in_dev, t, mr_ifc_timer);
-	u32 mr_ifc_count;
+	u8 mr_ifc_count;
 
 	igmpv3_send_cr(in_dev);
 restart:

commit 2c08860d44926a33fe86ecafca9c4eeec1fabbc1
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Fri Aug 27 16:28:41 2021 +0200

    Revert "PCI/MSI: Protect msi_desc::masked for multi-MSI"
    
    This reverts commit 3c9534778d4cc2bd01e20d4dcffc55df0962aa12 which is
    commit 77e89afc25f30abd56e76a809ee2884d7c1b63ce upstream.
    
    It breaks the Android KABI and is not needed for any current Android
    hardware devices, so can be safely reverted.
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: If4d9769c8cbfca6872c9a745fec8ab28bc39199e

diff --git a/drivers/base/core.c b/drivers/base/core.c
index 82aefb4e6aed..0795cd3b6215 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -2101,7 +2101,6 @@ void device_initialize(struct device *dev)
 	device_pm_init(dev);
 	set_dev_node(dev, -1);
 #ifdef CONFIG_GENERIC_MSI_IRQ
-	raw_spin_lock_init(&dev->msi_lock);
 	INIT_LIST_HEAD(&dev->msi_list);
 #endif
 	INIT_LIST_HEAD(&dev->links.consumers);
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index bc80b0f0ea1b..5630a6d517c2 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -170,25 +170,24 @@ static inline __attribute_const__ u32 msi_mask(unsigned x)
  * reliably as devices without an INTx disable bit will then generate a
  * level IRQ which will never be cleared.
  */
-void __pci_msi_desc_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
+u32 __pci_msi_desc_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
 {
-	raw_spinlock_t *lock = &desc->dev->msi_lock;
-	unsigned long flags;
+	u32 mask_bits = desc->masked;
 
 	if (pci_msi_ignore_mask || !desc->msi_attrib.maskbit)
-		return;
+		return 0;
 
-	raw_spin_lock_irqsave(lock, flags);
-	desc->masked &= ~mask;
-	desc->masked |= flag;
+	mask_bits &= ~mask;
+	mask_bits |= flag;
 	pci_write_config_dword(msi_desc_to_pci_dev(desc), desc->mask_pos,
-			       desc->masked);
-	raw_spin_unlock_irqrestore(lock, flags);
+			       mask_bits);
+
+	return mask_bits;
 }
 
 static void msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
 {
-	__pci_msi_desc_mask_irq(desc, mask, flag);
+	desc->masked = __pci_msi_desc_mask_irq(desc, mask, flag);
 }
 
 static void __iomem *pci_msix_desc_addr(struct msi_desc *desc)
diff --git a/include/linux/device.h b/include/linux/device.h
index 845ba80f9778..6b0e3448e115 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -1058,7 +1058,6 @@ struct device {
 	struct dev_pin_info	*pins;
 #endif
 #ifdef CONFIG_GENERIC_MSI_IRQ
-	raw_spinlock_t		msi_lock;
 	struct list_head	msi_list;
 #endif
 
diff --git a/include/linux/msi.h b/include/linux/msi.h
index 62982e6afddf..5dd171849a27 100644
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -150,7 +150,7 @@ void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
 void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
 
 u32 __pci_msix_desc_mask_irq(struct msi_desc *desc, u32 flag);
-void __pci_msi_desc_mask_irq(struct msi_desc *desc, u32 mask, u32 flag);
+u32 __pci_msi_desc_mask_irq(struct msi_desc *desc, u32 mask, u32 flag);
 void pci_msi_mask_irq(struct irq_data *data);
 void pci_msi_unmask_irq(struct irq_data *data);
 

commit bc6ea49ddc4ea48b72c592508925c71d0d68acae
Merge: 17a6c31153f9 e23d55af0e1f
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Fri Aug 27 14:42:50 2021 +0200

    Merge 4.19.205 into android-4.19-stable
    
    Changes in 4.19.205
            iio: humidity: hdc100x: Add margin to the conversion time
            iio: adc: Fix incorrect exit of for-loop
            ASoC: intel: atom: Fix reference to PCM buffer address
            i2c: dev: zero out array used for i2c reads from userspace
            ACPI: NFIT: Fix support for virtual SPA ranges
            ieee802154: hwsim: fix GPF in hwsim_set_edge_lqi
            ieee802154: hwsim: fix GPF in hwsim_new_edge_nl
            ASoC: cs42l42: Correct definition of ADC Volume control
            ASoC: cs42l42: Don't allow SND_SOC_DAIFMT_LEFT_J
            ASoC: cs42l42: Fix inversion of ADC Notch Switch control
            ASoC: cs42l42: Remove duplicate control for WNF filter frequency
            ASoC: cs42l42: Fix LRCLK frame start edge
            net: dsa: mt7530: add the missing RxUnicast MIB counter
            ppp: Fix generating ifname when empty IFLA_IFNAME is specified
            psample: Add a fwd declaration for skbuff
            net: Fix memory leak in ieee802154_raw_deliver
            net: igmp: fix data-race in igmp_ifc_timer_expire()
            net: dsa: lan9303: fix broken backpressure in .port_fdb_dump
            net: bridge: fix memleak in br_add_if()
            tcp_bbr: fix u32 wrap bug in round logic if bbr_init() called after 2B packets
            net: igmp: increase size of mr_ifc_count
            xen/events: Fix race in set_evtchn_to_irq
            vsock/virtio: avoid potential deadlock when vsock device remove
            powerpc/kprobes: Fix kprobe Oops happens in booke
            x86/tools: Fix objdump version check again
            genirq: Provide IRQCHIP_AFFINITY_PRE_STARTUP
            x86/msi: Force affinity setup before startup
            x86/ioapic: Force affinity setup before startup
            x86/resctrl: Fix default monitoring groups reporting
            genirq/msi: Ensure deactivation on teardown
            PCI/MSI: Enable and mask MSI-X early
            PCI/MSI: Do not set invalid bits in MSI mask
            PCI/MSI: Correct misleading comments
            PCI/MSI: Use msi_mask_irq() in pci_msi_shutdown()
            PCI/MSI: Protect msi_desc::masked for multi-MSI
            PCI/MSI: Mask all unused MSI-X entries
            PCI/MSI: Enforce that MSI-X table entry is masked for update
            PCI/MSI: Enforce MSI[X] entry updates to be visible
            vmlinux.lds.h: Handle clang's module.{c,d}tor sections
            iommu/vt-d: Fix agaw for a supported 48 bit guest address width
            mac80211: drop data frames without key on encrypted links
            KVM: nSVM: always intercept VMLOAD/VMSAVE when nested (CVE-2021-3656)
            KVM: nSVM: avoid picking up unsupported bits from L2 in int_ctl (CVE-2021-3653)
            x86/fpu: Make init_fpstate correct with optimized XSAVE
            ath: Use safer key clearing with key cache entries
            ath9k: Clear key cache explicitly on disabling hardware
            ath: Export ath_hw_keysetmac()
            ath: Modify ath_key_delete() to not need full key entry
            ath9k: Postpone key cache entry deletion for TXQ frames reference it
            dmaengine: xilinx_dma: Fix read-after-free bug when terminating transfers
            dmaengine: usb-dmac: Fix PM reference leak in usb_dmac_probe()
            ARM: dts: am43x-epos-evm: Reduce i2c0 bus speed for tps65218
            dmaengine: of-dma: router_xlate to return -EPROBE_DEFER if controller is not yet available
            scsi: megaraid_mm: Fix end of loop tests for list_for_each_entry()
            scsi: scsi_dh_rdac: Avoid crash during rdac_bus_attach()
            scsi: core: Avoid printing an error if target_alloc() returns -ENXIO
            ARM: dts: nomadik: Fix up interrupt controller node names
            net: usb: lan78xx: don't modify phy_device state concurrently
            Bluetooth: hidp: use correct wait queue when removing ctrl_wait
            cpufreq: armada-37xx: forbid cpufreq for 1.2 GHz variant
            dccp: add do-while-0 stubs for dccp_pr_debug macros
            vhost: Fix the calculation in vhost_overflow()
            bnxt: don't lock the tx queue from napi poll
            bnxt: disable napi before canceling DIM
            net: 6pack: fix slab-out-of-bounds in decode_data
            ptp_pch: Restore dependency on PCI
            net: qlcnic: add missed unlock in qlcnic_83xx_flash_read32
            net: mdio-mux: Don't ignore memory allocation errors
            net: mdio-mux: Handle -EPROBE_DEFER correctly
            mmc: dw_mmc: Fix hang on data CRC error
            ALSA: hda - fix the 'Capture Switch' value change notifications
            tracing / histogram: Fix NULL pointer dereference on strcmp() on NULL event name
            slimbus: messaging: start transaction ids from 1 instead of zero
            slimbus: messaging: check for valid transaction id
            slimbus: ngd: reset dma setup during runtime pm
            ipack: tpci200: fix many double free issues in tpci200_pci_probe
            ipack: tpci200: fix memory leak in the tpci200_register
            btrfs: prevent rename2 from exchanging a subvol with a directory from different parents
            PCI: Increase D3 delay for AMD Renoir/Cezanne XHCI
            ASoC: intel: atom: Fix breakage for PCM buffer address setup
            locks: print a warning when mount fails due to lack of "mand" support
            fs: warn about impending deprecation of mandatory locks
            netfilter: nft_exthdr: fix endianness of tcp option cast
            Linux 4.19.205
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I710e9719923984fdc85b2979aa916f78f57dc387

commit 17a6c31153f9a81c884588ed550dbccf502b8a45
Author: Ricky Niu <rickyniu@google.com>
Date:   Fri Aug 27 15:44:50 2021 +0800

    ANDROID: update ABI representation
    
    Leaf changes summary: 2 artifacts changed
    Changed leaf types summary: 0 leaf type changed
    Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 2 Added functions
    Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
    
    2 Added functions:
    
      [A] 'function int cdev_device_add(cdev*, device*)'
      [A] 'function void cdev_device_del(cdev*, device*)'
    
    Bug: 178720043
    Signed-off-by: Ricky Niu <rickyniu@google.com>
    Change-Id: I6a986df123c0ef0205bbed63aa965128e25f027c

diff --git a/android/abi_gki_aarch64 b/android/abi_gki_aarch64
index d7d0576299d0..01ce91f1b45e 100644
--- a/android/abi_gki_aarch64
+++ b/android/abi_gki_aarch64
@@ -221,3 +221,7 @@
   of_property_read_string_helper
   pm_runtime_enable
   __pm_runtime_set_status
+
+# required by usb_f_cdev.ko
+  cdev_device_add
+  cdev_device_del
diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml
index 4553bb7e0250..ddff5e434364 100644
--- a/android/abi_gki_aarch64.xml
+++ b/android/abi_gki_aarch64.xml
@@ -3260,69 +3260,69 @@
           <var-decl name='tfmsize' type-id='f0981eeb' visibility='default' filepath='include/crypto/algapi.h' line='46' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='css_set' size-in-bits='3264' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='184' column='1' id='afbeac63'>
+      <class-decl name='css_set' size-in-bits='3264' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='185' column='1' id='afbeac63'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='subsys' type-id='75781a60' visibility='default' filepath='include/linux/cgroup-defs.h' line='190' column='1'/>
+          <var-decl name='subsys' type-id='75781a60' visibility='default' filepath='include/linux/cgroup-defs.h' line='191' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='refcount' type-id='64615833' visibility='default' filepath='include/linux/cgroup-defs.h' line='193' column='1'/>
+          <var-decl name='refcount' type-id='64615833' visibility='default' filepath='include/linux/cgroup-defs.h' line='194' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='dom_cset' type-id='85d57723' visibility='default' filepath='include/linux/cgroup-defs.h' line='201' column='1'/>
+          <var-decl name='dom_cset' type-id='85d57723' visibility='default' filepath='include/linux/cgroup-defs.h' line='202' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='dfl_cgrp' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='204' column='1'/>
+          <var-decl name='dfl_cgrp' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='205' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='640'>
-          <var-decl name='nr_tasks' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='207' column='1'/>
+          <var-decl name='nr_tasks' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='208' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='tasks' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='216' column='1'/>
+          <var-decl name='tasks' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='217' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='mg_tasks' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='217' column='1'/>
+          <var-decl name='mg_tasks' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='218' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='960'>
-          <var-decl name='dying_tasks' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='218' column='1'/>
+          <var-decl name='dying_tasks' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='219' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1088'>
-          <var-decl name='task_iters' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='221' column='1'/>
+          <var-decl name='task_iters' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='222' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1216'>
-          <var-decl name='e_cset_node' type-id='a8e439b9' visibility='default' filepath='include/linux/cgroup-defs.h' line='230' column='1'/>
+          <var-decl name='e_cset_node' type-id='a8e439b9' visibility='default' filepath='include/linux/cgroup-defs.h' line='231' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2112'>
-          <var-decl name='threaded_csets' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='233' column='1'/>
+          <var-decl name='threaded_csets' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='234' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2240'>
-          <var-decl name='threaded_csets_node' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='234' column='1'/>
+          <var-decl name='threaded_csets_node' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='235' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2368'>
-          <var-decl name='hlist' type-id='03a4a074' visibility='default' filepath='include/linux/cgroup-defs.h' line='240' column='1'/>
+          <var-decl name='hlist' type-id='03a4a074' visibility='default' filepath='include/linux/cgroup-defs.h' line='241' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2496'>
-          <var-decl name='cgrp_links' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='246' column='1'/>
+          <var-decl name='cgrp_links' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='247' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2624'>
-          <var-decl name='mg_preload_node' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='252' column='1'/>
+          <var-decl name='mg_preload_node' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='253' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2752'>
-          <var-decl name='mg_node' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='253' column='1'/>
+          <var-decl name='mg_node' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='254' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2880'>
-          <var-decl name='mg_src_cgrp' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='262' column='1'/>
+          <var-decl name='mg_src_cgrp' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='263' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2944'>
-          <var-decl name='mg_dst_cgrp' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='263' column='1'/>
+          <var-decl name='mg_dst_cgrp' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='264' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3008'>
-          <var-decl name='mg_dst_cset' type-id='85d57723' visibility='default' filepath='include/linux/cgroup-defs.h' line='264' column='1'/>
+          <var-decl name='mg_dst_cset' type-id='85d57723' visibility='default' filepath='include/linux/cgroup-defs.h' line='265' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3072'>
-          <var-decl name='dead' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='267' column='1'/>
+          <var-decl name='dead' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='268' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3136'>
-          <var-decl name='callback_head' type-id='e3d8ce29' visibility='default' filepath='include/linux/cgroup-defs.h' line='270' column='1'/>
+          <var-decl name='callback_head' type-id='e3d8ce29' visibility='default' filepath='include/linux/cgroup-defs.h' line='271' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='dev_pagemap' size-in-bits='1600' is-struct='yes' visibility='default' filepath='include/linux/memremap.h' line='114' column='1' id='8e586c5c'>
@@ -3692,27 +3692,27 @@
           <var-decl name='nodeinfo' type-id='687d975e' visibility='default' filepath='include/linux/memcontrol.h' line='314' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='module_notes_attrs' size-in-bits='128' is-struct='yes' visibility='default' filepath='kernel/module.c' line='1573' column='1' id='96b6b914'>
+      <class-decl name='module_notes_attrs' size-in-bits='128' is-struct='yes' visibility='default' filepath='kernel/module.c' line='1582' column='1' id='96b6b914'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='dir' type-id='d30bdc51' visibility='default' filepath='kernel/module.c' line='1574' column='1'/>
+          <var-decl name='dir' type-id='d30bdc51' visibility='default' filepath='kernel/module.c' line='1583' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='notes' type-id='f0981eeb' visibility='default' filepath='kernel/module.c' line='1575' column='1'/>
+          <var-decl name='notes' type-id='f0981eeb' visibility='default' filepath='kernel/module.c' line='1584' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='attrs' type-id='7cfae8e1' visibility='default' filepath='kernel/module.c' line='1576' column='1'/>
+          <var-decl name='attrs' type-id='7cfae8e1' visibility='default' filepath='kernel/module.c' line='1585' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='module_param_attrs' is-struct='yes' visibility='default' is-declaration-only='yes' id='9e045430'/>
-      <class-decl name='module_sect_attrs' size-in-bits='384' is-struct='yes' visibility='default' filepath='kernel/module.c' line='1460' column='1' id='b43b0dce'>
+      <class-decl name='module_sect_attrs' size-in-bits='384' is-struct='yes' visibility='default' filepath='kernel/module.c' line='1469' column='1' id='b43b0dce'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='grp' type-id='e4af473b' visibility='default' filepath='kernel/module.c' line='1461' column='1'/>
+          <var-decl name='grp' type-id='e4af473b' visibility='default' filepath='kernel/module.c' line='1470' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='nsections' type-id='f0981eeb' visibility='default' filepath='kernel/module.c' line='1462' column='1'/>
+          <var-decl name='nsections' type-id='f0981eeb' visibility='default' filepath='kernel/module.c' line='1471' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='attrs' type-id='ae08da59' visibility='default' filepath='kernel/module.c' line='1463' column='1'/>
+          <var-decl name='attrs' type-id='ae08da59' visibility='default' filepath='kernel/module.c' line='1472' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='nameidata' is-struct='yes' visibility='default' is-declaration-only='yes' id='0319fc05'/>
@@ -5669,6 +5669,14 @@
           <var-decl name='coa_decompress' type-id='8801b8af' visibility='default' filepath='include/linux/crypto.h' line='368' column='1'/>
         </data-member>
       </class-decl>
+      <union-decl name='rcu_special' size-in-bits='32' visibility='default' filepath='include/linux/sched.h' line='624' column='1' id='a324790e'>
+        <data-member access='public'>
+          <var-decl name='b' type-id='6a7976cc' visibility='default' filepath='include/linux/sched.h' line='632' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='s' type-id='19c2251e' visibility='default' filepath='include/linux/sched.h' line='633' column='1'/>
+        </data-member>
+      </union-decl>
       <class-decl name='module' size-in-bits='7168' is-struct='yes' visibility='default' filepath='include/linux/module.h' line='332' column='1' id='29476915'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='state' type-id='327e04c6' visibility='default' filepath='include/linux/module.h' line='333' column='1'/>
@@ -5845,14 +5853,6 @@
           <var-decl name='android_kabi_reserved4' type-id='91ce1af9' visibility='default' filepath='include/linux/module.h' line='496' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='rcu_special' size-in-bits='32' visibility='default' filepath='include/linux/sched.h' line='624' column='1' id='a324790e'>
-        <data-member access='public'>
-          <var-decl name='b' type-id='6a7976cc' visibility='default' filepath='include/linux/sched.h' line='632' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='s' type-id='19c2251e' visibility='default' filepath='include/linux/sched.h' line='633' column='1'/>
-        </data-member>
-      </union-decl>
       <enum-decl name='module_state' filepath='include/linux/module.h' line='281' column='1' id='327e04c6'>
         <underlying-type type-id='9cac1fee'/>
         <enumerator name='MODULE_STATE_LIVE' value='0'/>
@@ -9451,56 +9451,56 @@
         </data-member>
       </class-decl>
       <class-decl name='cfs_bandwidth' is-struct='yes' visibility='default' filepath='kernel/sched/sched.h' line='335' column='1' id='68e4a3af'/>
-      <class-decl name='cgroup_file' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='113' column='1' id='37a4ee40'>
+      <class-decl name='cgroup_file' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='114' column='1' id='37a4ee40'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='kn' type-id='150efd3f' visibility='default' filepath='include/linux/cgroup-defs.h' line='115' column='1'/>
+          <var-decl name='kn' type-id='150efd3f' visibility='default' filepath='include/linux/cgroup-defs.h' line='116' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='notified_at' type-id='7359adad' visibility='default' filepath='include/linux/cgroup-defs.h' line='116' column='1'/>
+          <var-decl name='notified_at' type-id='7359adad' visibility='default' filepath='include/linux/cgroup-defs.h' line='117' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='notify_timer' type-id='abe41e67' visibility='default' filepath='include/linux/cgroup-defs.h' line='117' column='1'/>
+          <var-decl name='notify_timer' type-id='abe41e67' visibility='default' filepath='include/linux/cgroup-defs.h' line='118' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cgroup_subsys_state' size-in-bits='2176' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='127' column='1' id='7f3df443'>
+      <class-decl name='cgroup_subsys_state' size-in-bits='2176' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='128' column='1' id='7f3df443'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='cgroup' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='129' column='1'/>
+          <var-decl name='cgroup' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='130' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='ss' type-id='dc91d125' visibility='default' filepath='include/linux/cgroup-defs.h' line='132' column='1'/>
+          <var-decl name='ss' type-id='dc91d125' visibility='default' filepath='include/linux/cgroup-defs.h' line='133' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='refcnt' type-id='818799b4' visibility='default' filepath='include/linux/cgroup-defs.h' line='135' column='1'/>
+          <var-decl name='refcnt' type-id='818799b4' visibility='default' filepath='include/linux/cgroup-defs.h' line='136' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='sibling' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='138' column='1'/>
+          <var-decl name='sibling' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='139' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='children' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='139' column='1'/>
+          <var-decl name='children' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='140' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='rstat_css_node' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='142' column='1'/>
+          <var-decl name='rstat_css_node' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='143' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='960'>
-          <var-decl name='id' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='148' column='1'/>
+          <var-decl name='id' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='149' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='992'>
-          <var-decl name='flags' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='150' column='1'/>
+          <var-decl name='flags' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='151' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='serial_nr' type-id='91ce1af9' visibility='default' filepath='include/linux/cgroup-defs.h' line='158' column='1'/>
+          <var-decl name='serial_nr' type-id='91ce1af9' visibility='default' filepath='include/linux/cgroup-defs.h' line='159' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1088'>
-          <var-decl name='online_cnt' type-id='49178f86' visibility='default' filepath='include/linux/cgroup-defs.h' line='164' column='1'/>
+          <var-decl name='online_cnt' type-id='49178f86' visibility='default' filepath='include/linux/cgroup-defs.h' line='165' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1152'>
-          <var-decl name='destroy_work' type-id='ef9025d0' visibility='default' filepath='include/linux/cgroup-defs.h' line='167' column='1'/>
+          <var-decl name='destroy_work' type-id='ef9025d0' visibility='default' filepath='include/linux/cgroup-defs.h' line='168' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1536'>
-          <var-decl name='destroy_rwork' type-id='7c0b9fdb' visibility='default' filepath='include/linux/cgroup-defs.h' line='168' column='1'/>
+          <var-decl name='destroy_rwork' type-id='7c0b9fdb' visibility='default' filepath='include/linux/cgroup-defs.h' line='169' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2112'>
-          <var-decl name='parent' type-id='cfff5953' visibility='default' filepath='include/linux/cgroup-defs.h' line='174' column='1'/>
+          <var-decl name='parent' type-id='cfff5953' visibility='default' filepath='include/linux/cgroup-defs.h' line='175' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='compat_robust_list' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/linux/compat.h' line='409' column='1' id='bd51dd4a'>
@@ -10111,9 +10111,9 @@
           <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='include/linux/skbuff.h' line='288' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='sock_cgroup_data' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='794' column='1' id='8544f103'>
+      <class-decl name='sock_cgroup_data' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='795' column='1' id='8544f103'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='' type-id='de05b94c' visibility='default' filepath='include/linux/cgroup-defs.h' line='795' column='1'/>
+          <var-decl name='' type-id='de05b94c' visibility='default' filepath='include/linux/cgroup-defs.h' line='796' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='sock_common' size-in-bits='1088' is-struct='yes' visibility='default' filepath='include/net/sock.h' line='153' column='1' id='5999c5f7'>
@@ -11380,149 +11380,149 @@
           <var-decl name='items' type-id='3f814540' visibility='default' filepath='include/linux/bpf.h' line='366' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cgroup' size-in-bits='17856' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='345' column='1' id='ab9643dd'>
+      <class-decl name='cgroup' size-in-bits='17856' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='346' column='1' id='ab9643dd'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='self' type-id='7f3df443' visibility='default' filepath='include/linux/cgroup-defs.h' line='347' column='1'/>
+          <var-decl name='self' type-id='7f3df443' visibility='default' filepath='include/linux/cgroup-defs.h' line='348' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2176'>
-          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='include/linux/cgroup-defs.h' line='349' column='1'/>
+          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='include/linux/cgroup-defs.h' line='350' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2240'>
-          <var-decl name='id' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='359' column='1'/>
+          <var-decl name='id' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='360' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2272'>
-          <var-decl name='level' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='367' column='1'/>
+          <var-decl name='level' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='368' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2304'>
-          <var-decl name='max_depth' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='370' column='1'/>
+          <var-decl name='max_depth' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='371' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2336'>
-          <var-decl name='nr_descendants' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='383' column='1'/>
+          <var-decl name='nr_descendants' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='384' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2368'>
-          <var-decl name='nr_dying_descendants' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='384' column='1'/>
+          <var-decl name='nr_dying_descendants' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='385' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2400'>
-          <var-decl name='max_descendants' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='385' column='1'/>
+          <var-decl name='max_descendants' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='386' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2432'>
-          <var-decl name='nr_populated_csets' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='398' column='1'/>
+          <var-decl name='nr_populated_csets' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='399' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2464'>
-          <var-decl name='nr_populated_domain_children' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='399' column='1'/>
+          <var-decl name='nr_populated_domain_children' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='400' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2496'>
-          <var-decl name='nr_populated_threaded_children' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='400' column='1'/>
+          <var-decl name='nr_populated_threaded_children' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='401' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2528'>
-          <var-decl name='nr_threaded_children' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='402' column='1'/>
+          <var-decl name='nr_threaded_children' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='403' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2560'>
-          <var-decl name='kn' type-id='150efd3f' visibility='default' filepath='include/linux/cgroup-defs.h' line='404' column='1'/>
+          <var-decl name='kn' type-id='150efd3f' visibility='default' filepath='include/linux/cgroup-defs.h' line='405' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2624'>
-          <var-decl name='procs_file' type-id='37a4ee40' visibility='default' filepath='include/linux/cgroup-defs.h' line='405' column='1'/>
+          <var-decl name='procs_file' type-id='37a4ee40' visibility='default' filepath='include/linux/cgroup-defs.h' line='406' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3200'>
-          <var-decl name='events_file' type-id='37a4ee40' visibility='default' filepath='include/linux/cgroup-defs.h' line='406' column='1'/>
+          <var-decl name='events_file' type-id='37a4ee40' visibility='default' filepath='include/linux/cgroup-defs.h' line='407' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3776'>
-          <var-decl name='subtree_control' type-id='1dc6a898' visibility='default' filepath='include/linux/cgroup-defs.h' line='415' column='1'/>
+          <var-decl name='subtree_control' type-id='1dc6a898' visibility='default' filepath='include/linux/cgroup-defs.h' line='416' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3792'>
-          <var-decl name='subtree_ss_mask' type-id='1dc6a898' visibility='default' filepath='include/linux/cgroup-defs.h' line='416' column='1'/>
+          <var-decl name='subtree_ss_mask' type-id='1dc6a898' visibility='default' filepath='include/linux/cgroup-defs.h' line='417' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3808'>
-          <var-decl name='old_subtree_control' type-id='1dc6a898' visibility='default' filepath='include/linux/cgroup-defs.h' line='417' column='1'/>
+          <var-decl name='old_subtree_control' type-id='1dc6a898' visibility='default' filepath='include/linux/cgroup-defs.h' line='418' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3824'>
-          <var-decl name='old_subtree_ss_mask' type-id='1dc6a898' visibility='default' filepath='include/linux/cgroup-defs.h' line='418' column='1'/>
+          <var-decl name='old_subtree_ss_mask' type-id='1dc6a898' visibility='default' filepath='include/linux/cgroup-defs.h' line='419' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3840'>
-          <var-decl name='subsys' type-id='75781a60' visibility='default' filepath='include/linux/cgroup-defs.h' line='421' column='1'/>
+          <var-decl name='subsys' type-id='75781a60' visibility='default' filepath='include/linux/cgroup-defs.h' line='422' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='4288'>
-          <var-decl name='root' type-id='aede2cf0' visibility='default' filepath='include/linux/cgroup-defs.h' line='423' column='1'/>
+          <var-decl name='root' type-id='aede2cf0' visibility='default' filepath='include/linux/cgroup-defs.h' line='424' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='4352'>
-          <var-decl name='cset_links' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='429' column='1'/>
+          <var-decl name='cset_links' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='430' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='4480'>
-          <var-decl name='e_csets' type-id='a8e439b9' visibility='default' filepath='include/linux/cgroup-defs.h' line='438' column='1'/>
+          <var-decl name='e_csets' type-id='a8e439b9' visibility='default' filepath='include/linux/cgroup-defs.h' line='439' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5376'>
-          <var-decl name='dom_cgrp' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='447' column='1'/>
+          <var-decl name='dom_cgrp' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='448' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5440'>
-          <var-decl name='old_dom_cgrp' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='448' column='1'/>
+          <var-decl name='old_dom_cgrp' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='449' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5504'>
-          <var-decl name='rstat_cpu' type-id='d8e759a7' visibility='default' filepath='include/linux/cgroup-defs.h' line='451' column='1'/>
+          <var-decl name='rstat_cpu' type-id='d8e759a7' visibility='default' filepath='include/linux/cgroup-defs.h' line='452' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5568'>
-          <var-decl name='rstat_css_list' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='452' column='1'/>
+          <var-decl name='rstat_css_list' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='453' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5696'>
-          <var-decl name='pending_bstat' type-id='cfd8587e' visibility='default' filepath='include/linux/cgroup-defs.h' line='455' column='1'/>
+          <var-decl name='pending_bstat' type-id='cfd8587e' visibility='default' filepath='include/linux/cgroup-defs.h' line='456' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5888'>
-          <var-decl name='bstat' type-id='cfd8587e' visibility='default' filepath='include/linux/cgroup-defs.h' line='456' column='1'/>
+          <var-decl name='bstat' type-id='cfd8587e' visibility='default' filepath='include/linux/cgroup-defs.h' line='457' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6080'>
-          <var-decl name='prev_cputime' type-id='9c7bf560' visibility='default' filepath='include/linux/cgroup-defs.h' line='457' column='1'/>
+          <var-decl name='prev_cputime' type-id='9c7bf560' visibility='default' filepath='include/linux/cgroup-defs.h' line='458' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6272'>
-          <var-decl name='pidlists' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='463' column='1'/>
+          <var-decl name='pidlists' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='464' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6400'>
-          <var-decl name='pidlist_mutex' type-id='925167dc' visibility='default' filepath='include/linux/cgroup-defs.h' line='464' column='1'/>
+          <var-decl name='pidlist_mutex' type-id='925167dc' visibility='default' filepath='include/linux/cgroup-defs.h' line='465' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6656'>
-          <var-decl name='offline_waitq' type-id='b5ab048f' visibility='default' filepath='include/linux/cgroup-defs.h' line='467' column='1'/>
+          <var-decl name='offline_waitq' type-id='b5ab048f' visibility='default' filepath='include/linux/cgroup-defs.h' line='468' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6848'>
-          <var-decl name='release_agent_work' type-id='ef9025d0' visibility='default' filepath='include/linux/cgroup-defs.h' line='470' column='1'/>
+          <var-decl name='release_agent_work' type-id='ef9025d0' visibility='default' filepath='include/linux/cgroup-defs.h' line='471' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='7232'>
-          <var-decl name='psi' type-id='12878ab3' visibility='default' filepath='include/linux/cgroup-defs.h' line='473' column='1'/>
+          <var-decl name='psi' type-id='12878ab3' visibility='default' filepath='include/linux/cgroup-defs.h' line='474' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='12672'>
-          <var-decl name='bpf' type-id='b80e3996' visibility='default' filepath='include/linux/cgroup-defs.h' line='476' column='1'/>
+          <var-decl name='bpf' type-id='b80e3996' visibility='default' filepath='include/linux/cgroup-defs.h' line='477' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17472'>
-          <var-decl name='congestion_count' type-id='49178f86' visibility='default' filepath='include/linux/cgroup-defs.h' line='479' column='1'/>
+          <var-decl name='congestion_count' type-id='49178f86' visibility='default' filepath='include/linux/cgroup-defs.h' line='480' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17504'>
-          <var-decl name='freezer' type-id='ad50988b' visibility='default' filepath='include/linux/cgroup-defs.h' line='482' column='1'/>
+          <var-decl name='freezer' type-id='ad50988b' visibility='default' filepath='include/linux/cgroup-defs.h' line='483' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17664'>
-          <var-decl name='android_kabi_reserved1' type-id='91ce1af9' visibility='default' filepath='include/linux/cgroup-defs.h' line='484' column='1'/>
+          <var-decl name='android_kabi_reserved1' type-id='91ce1af9' visibility='default' filepath='include/linux/cgroup-defs.h' line='485' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17728'>
-          <var-decl name='android_kabi_reserved2' type-id='91ce1af9' visibility='default' filepath='include/linux/cgroup-defs.h' line='485' column='1'/>
+          <var-decl name='android_kabi_reserved2' type-id='91ce1af9' visibility='default' filepath='include/linux/cgroup-defs.h' line='486' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17792'>
-          <var-decl name='android_kabi_reserved3' type-id='91ce1af9' visibility='default' filepath='include/linux/cgroup-defs.h' line='486' column='1'/>
+          <var-decl name='android_kabi_reserved3' type-id='91ce1af9' visibility='default' filepath='include/linux/cgroup-defs.h' line='487' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17856'>
-          <var-decl name='ancestor_ids' type-id='1fdc7fa6' visibility='default' filepath='include/linux/cgroup-defs.h' line='489' column='1'/>
+          <var-decl name='ancestor_ids' type-id='1fdc7fa6' visibility='default' filepath='include/linux/cgroup-defs.h' line='490' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cgroup_namespace' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/cgroup.h' line='852' column='1' id='e54806c5'>
+      <class-decl name='cgroup_namespace' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/cgroup.h' line='859' column='1' id='e54806c5'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='count' type-id='64615833' visibility='default' filepath='include/linux/cgroup.h' line='853' column='1'/>
+          <var-decl name='count' type-id='64615833' visibility='default' filepath='include/linux/cgroup.h' line='860' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='ns' type-id='99f367f2' visibility='default' filepath='include/linux/cgroup.h' line='854' column='1'/>
+          <var-decl name='ns' type-id='99f367f2' visibility='default' filepath='include/linux/cgroup.h' line='861' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='user_ns' type-id='c0ced320' visibility='default' filepath='include/linux/cgroup.h' line='855' column='1'/>
+          <var-decl name='user_ns' type-id='c0ced320' visibility='default' filepath='include/linux/cgroup.h' line='862' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='ucounts' type-id='b1d4934a' visibility='default' filepath='include/linux/cgroup.h' line='856' column='1'/>
+          <var-decl name='ucounts' type-id='b1d4934a' visibility='default' filepath='include/linux/cgroup.h' line='863' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='root_cset' type-id='85d57723' visibility='default' filepath='include/linux/cgroup.h' line='857' column='1'/>
+          <var-decl name='root_cset' type-id='85d57723' visibility='default' filepath='include/linux/cgroup.h' line='864' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='cpu_itimer' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/sched/signal.h' line='35' column='1' id='47841236'>
@@ -12322,12 +12322,12 @@
         </data-member>
       </class-decl>
       <class-decl name='mnt_namespace' is-struct='yes' visibility='default' is-declaration-only='yes' id='de031042'/>
-      <class-decl name='module_sect_attr' size-in-bits='512' is-struct='yes' visibility='default' filepath='kernel/module.c' line='1455' column='1' id='def413c9'>
+      <class-decl name='module_sect_attr' size-in-bits='512' is-struct='yes' visibility='default' filepath='kernel/module.c' line='1464' column='1' id='def413c9'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='battr' type-id='d83a2db1' visibility='default' filepath='kernel/module.c' line='1456' column='1'/>
+          <var-decl name='battr' type-id='d83a2db1' visibility='default' filepath='kernel/module.c' line='1465' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='address' type-id='7359adad' visibility='default' filepath='kernel/module.c' line='1457' column='1'/>
+          <var-decl name='address' type-id='7359adad' visibility='default' filepath='kernel/module.c' line='1466' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='net' size-in-bits='44544' is-struct='yes' visibility='default' filepath='include/net/net_namespace.h' line='51' column='1' id='bd965180'>
@@ -13050,27 +13050,27 @@
           <var-decl name='socks' type-id='5be9db8d' visibility='default' filepath='include/net/sock_reuseport.h' line='27' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='socket' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/net.h' line='111' column='1' id='ee14fd94'>
+      <class-decl name='socket' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/net.h' line='117' column='1' id='ee14fd94'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='state' type-id='ee2ecafb' visibility='default' filepath='include/linux/net.h' line='112' column='1'/>
+          <var-decl name='state' type-id='ee2ecafb' visibility='default' filepath='include/linux/net.h' line='118' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='type' type-id='a2185560' visibility='default' filepath='include/linux/net.h' line='114' column='1'/>
+          <var-decl name='type' type-id='a2185560' visibility='default' filepath='include/linux/net.h' line='120' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='include/linux/net.h' line='116' column='1'/>
+          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='include/linux/net.h' line='122' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='wq' type-id='99f34ac1' visibility='default' filepath='include/linux/net.h' line='118' column='1'/>
+          <var-decl name='wq' type-id='99f34ac1' visibility='default' filepath='include/linux/net.h' line='124' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='file' type-id='77e79a4b' visibility='default' filepath='include/linux/net.h' line='120' column='1'/>
+          <var-decl name='file' type-id='77e79a4b' visibility='default' filepath='include/linux/net.h' line='126' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='sk' type-id='f772df6d' visibility='default' filepath='include/linux/net.h' line='121' column='1'/>
+          <var-decl name='sk' type-id='f772df6d' visibility='default' filepath='include/linux/net.h' line='127' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='ops' type-id='38a81521' visibility='default' filepath='include/linux/net.h' line='122' column='1'/>
+          <var-decl name='ops' type-id='38a81521' visibility='default' filepath='include/linux/net.h' line='128' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='task_cputime_atomic' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/sched/signal.h' line='44' column='1' id='4b60fba4'>
@@ -13706,7 +13706,7 @@
       <typedef-decl name='make_request_fn' type-id='f8561c55' filepath='include/linux/blkdev.h' line='316' column='1' id='99cd4891'/>
       <typedef-decl name='mempool_t' type-id='5932767e' filepath='include/linux/mempool.h' line='26' column='1' id='2745fad8'/>
       <typedef-decl name='poll_q_fn' type-id='3e0de906' filepath='include/linux/blkdev.h' line='317' column='1' id='db8c71fe'/>
-      <typedef-decl name='possible_net_t' type-id='0a0aec0a' filepath='include/net/net_namespace.h' line='286' column='1' id='c9df1e6c'/>
+      <typedef-decl name='possible_net_t' type-id='0a0aec0a' filepath='include/net/net_namespace.h' line='293' column='1' id='c9df1e6c'/>
       <typedef-decl name='prep_rq_fn' type-id='0022f749' filepath='include/linux/blkdev.h' line='318' column='1' id='f77d29c2'/>
       <typedef-decl name='request_fn_proc' type-id='a69d8a71' filepath='include/linux/blkdev.h' line='315' column='1' id='9f3af257'/>
       <typedef-decl name='resource_size_t' type-id='2522883d' filepath='include/linux/types.h' line='168' column='1' id='acc63fdf'/>
@@ -13797,12 +13797,12 @@
           <var-decl name='' type-id='7a56104f' visibility='default' filepath='include/linux/perf_event.h' line='159' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__30' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='795' column='1' id='de05b94c'>
+      <union-decl name='__anonymous_union__30' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='796' column='1' id='de05b94c'>
         <data-member access='public'>
-          <var-decl name='' type-id='16b0d6e5' visibility='default' filepath='include/linux/cgroup-defs.h' line='797' column='1'/>
+          <var-decl name='' type-id='16b0d6e5' visibility='default' filepath='include/linux/cgroup-defs.h' line='798' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='val' type-id='91ce1af9' visibility='default' filepath='include/linux/cgroup-defs.h' line='819' column='1'/>
+          <var-decl name='val' type-id='91ce1af9' visibility='default' filepath='include/linux/cgroup-defs.h' line='820' column='1'/>
         </data-member>
       </union-decl>
       <union-decl name='__anonymous_union__3' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='184' column='1' id='9e20c58f'>
@@ -14211,9 +14211,9 @@
           <var-decl name='bi_bvec_done' type-id='f0981eeb' visibility='default' filepath='include/linux/bvec.h' line='45' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cgroup_base_stat' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='273' column='1' id='cfd8587e'>
+      <class-decl name='cgroup_base_stat' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='274' column='1' id='cfd8587e'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='cputime' type-id='ad6873f4' visibility='default' filepath='include/linux/cgroup-defs.h' line='274' column='1'/>
+          <var-decl name='cputime' type-id='ad6873f4' visibility='default' filepath='include/linux/cgroup-defs.h' line='275' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='cgroup_bpf' size-in-bits='4800' is-struct='yes' visibility='default' filepath='include/linux/bpf-cgroup.h' line='51' column='1' id='b80e3996'>
@@ -14230,116 +14230,116 @@
           <var-decl name='inactive' type-id='380c7edc' visibility='default' filepath='include/linux/bpf-cgroup.h' line='64' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cgroup_freezer_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='326' column='1' id='ad50988b'>
+      <class-decl name='cgroup_freezer_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='327' column='1' id='ad50988b'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='freeze' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='328' column='1'/>
+          <var-decl name='freeze' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='329' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='e_freeze' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='331' column='1'/>
+          <var-decl name='e_freeze' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='332' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='nr_frozen_descendants' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='336' column='1'/>
+          <var-decl name='nr_frozen_descendants' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='337' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='nr_frozen_tasks' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='342' column='1'/>
+          <var-decl name='nr_frozen_tasks' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='343' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cgroup_subsys' size-in-bits='1920' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='627' column='1' id='1d115fd5'>
+      <class-decl name='cgroup_subsys' size-in-bits='1920' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='628' column='1' id='1d115fd5'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='css_alloc' type-id='a87691ee' visibility='default' filepath='include/linux/cgroup-defs.h' line='628' column='1'/>
+          <var-decl name='css_alloc' type-id='a87691ee' visibility='default' filepath='include/linux/cgroup-defs.h' line='629' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='css_online' type-id='8bdbbb63' visibility='default' filepath='include/linux/cgroup-defs.h' line='629' column='1'/>
+          <var-decl name='css_online' type-id='8bdbbb63' visibility='default' filepath='include/linux/cgroup-defs.h' line='630' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='css_offline' type-id='f65daff2' visibility='default' filepath='include/linux/cgroup-defs.h' line='630' column='1'/>
+          <var-decl name='css_offline' type-id='f65daff2' visibility='default' filepath='include/linux/cgroup-defs.h' line='631' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='css_released' type-id='f65daff2' visibility='default' filepath='include/linux/cgroup-defs.h' line='631' column='1'/>
+          <var-decl name='css_released' type-id='f65daff2' visibility='default' filepath='include/linux/cgroup-defs.h' line='632' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='css_free' type-id='f65daff2' visibility='default' filepath='include/linux/cgroup-defs.h' line='632' column='1'/>
+          <var-decl name='css_free' type-id='f65daff2' visibility='default' filepath='include/linux/cgroup-defs.h' line='633' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='css_reset' type-id='f65daff2' visibility='default' filepath='include/linux/cgroup-defs.h' line='633' column='1'/>
+          <var-decl name='css_reset' type-id='f65daff2' visibility='default' filepath='include/linux/cgroup-defs.h' line='634' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='css_rstat_flush' type-id='fe17c379' visibility='default' filepath='include/linux/cgroup-defs.h' line='634' column='1'/>
+          <var-decl name='css_rstat_flush' type-id='fe17c379' visibility='default' filepath='include/linux/cgroup-defs.h' line='635' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='css_extra_stat_show' type-id='f22a42d7' visibility='default' filepath='include/linux/cgroup-defs.h' line='635' column='1'/>
+          <var-decl name='css_extra_stat_show' type-id='f22a42d7' visibility='default' filepath='include/linux/cgroup-defs.h' line='636' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='can_attach' type-id='354bcec3' visibility='default' filepath='include/linux/cgroup-defs.h' line='638' column='1'/>
+          <var-decl name='can_attach' type-id='354bcec3' visibility='default' filepath='include/linux/cgroup-defs.h' line='639' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='cancel_attach' type-id='6484073c' visibility='default' filepath='include/linux/cgroup-defs.h' line='639' column='1'/>
+          <var-decl name='cancel_attach' type-id='6484073c' visibility='default' filepath='include/linux/cgroup-defs.h' line='640' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='640'>
-          <var-decl name='attach' type-id='6484073c' visibility='default' filepath='include/linux/cgroup-defs.h' line='640' column='1'/>
+          <var-decl name='attach' type-id='6484073c' visibility='default' filepath='include/linux/cgroup-defs.h' line='641' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='post_attach' type-id='953b12f8' visibility='default' filepath='include/linux/cgroup-defs.h' line='641' column='1'/>
+          <var-decl name='post_attach' type-id='953b12f8' visibility='default' filepath='include/linux/cgroup-defs.h' line='642' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='768'>
-          <var-decl name='can_fork' type-id='2c2624ea' visibility='default' filepath='include/linux/cgroup-defs.h' line='642' column='1'/>
+          <var-decl name='can_fork' type-id='2c2624ea' visibility='default' filepath='include/linux/cgroup-defs.h' line='643' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='cancel_fork' type-id='1c9e19fb' visibility='default' filepath='include/linux/cgroup-defs.h' line='643' column='1'/>
+          <var-decl name='cancel_fork' type-id='1c9e19fb' visibility='default' filepath='include/linux/cgroup-defs.h' line='644' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='896'>
-          <var-decl name='fork' type-id='1c9e19fb' visibility='default' filepath='include/linux/cgroup-defs.h' line='644' column='1'/>
+          <var-decl name='fork' type-id='1c9e19fb' visibility='default' filepath='include/linux/cgroup-defs.h' line='645' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='960'>
-          <var-decl name='exit' type-id='1c9e19fb' visibility='default' filepath='include/linux/cgroup-defs.h' line='645' column='1'/>
+          <var-decl name='exit' type-id='1c9e19fb' visibility='default' filepath='include/linux/cgroup-defs.h' line='646' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='release' type-id='1c9e19fb' visibility='default' filepath='include/linux/cgroup-defs.h' line='646' column='1'/>
+          <var-decl name='release' type-id='1c9e19fb' visibility='default' filepath='include/linux/cgroup-defs.h' line='647' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1088'>
-          <var-decl name='bind' type-id='f65daff2' visibility='default' filepath='include/linux/cgroup-defs.h' line='647' column='1'/>
+          <var-decl name='bind' type-id='f65daff2' visibility='default' filepath='include/linux/cgroup-defs.h' line='648' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='early_init' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='649' column='1'/>
+          <var-decl name='early_init' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='650' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1'>
-          <var-decl name='implicit_on_dfl' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='662' column='1'/>
+          <var-decl name='implicit_on_dfl' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='663' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2'>
-          <var-decl name='threaded' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='674' column='1'/>
+          <var-decl name='threaded' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='675' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3'>
-          <var-decl name='broken_hierarchy' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='688' column='1'/>
+          <var-decl name='broken_hierarchy' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='689' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='4'>
-          <var-decl name='warned_broken_hierarchy' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='689' column='1'/>
+          <var-decl name='warned_broken_hierarchy' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='690' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1184'>
-          <var-decl name='id' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='692' column='1'/>
+          <var-decl name='id' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='693' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1216'>
-          <var-decl name='name' type-id='80f4b756' visibility='default' filepath='include/linux/cgroup-defs.h' line='693' column='1'/>
+          <var-decl name='name' type-id='80f4b756' visibility='default' filepath='include/linux/cgroup-defs.h' line='694' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1280'>
-          <var-decl name='legacy_name' type-id='80f4b756' visibility='default' filepath='include/linux/cgroup-defs.h' line='696' column='1'/>
+          <var-decl name='legacy_name' type-id='80f4b756' visibility='default' filepath='include/linux/cgroup-defs.h' line='697' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1344'>
-          <var-decl name='root' type-id='aede2cf0' visibility='default' filepath='include/linux/cgroup-defs.h' line='699' column='1'/>
+          <var-decl name='root' type-id='aede2cf0' visibility='default' filepath='include/linux/cgroup-defs.h' line='700' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1408'>
-          <var-decl name='css_idr' type-id='37ce495e' visibility='default' filepath='include/linux/cgroup-defs.h' line='702' column='1'/>
+          <var-decl name='css_idr' type-id='37ce495e' visibility='default' filepath='include/linux/cgroup-defs.h' line='703' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1600'>
-          <var-decl name='cfts' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='708' column='1'/>
+          <var-decl name='cfts' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='709' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1728'>
-          <var-decl name='dfl_cftypes' type-id='03054cfa' visibility='default' filepath='include/linux/cgroup-defs.h' line='714' column='1'/>
+          <var-decl name='dfl_cftypes' type-id='03054cfa' visibility='default' filepath='include/linux/cgroup-defs.h' line='715' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1792'>
-          <var-decl name='legacy_cftypes' type-id='03054cfa' visibility='default' filepath='include/linux/cgroup-defs.h' line='715' column='1'/>
+          <var-decl name='legacy_cftypes' type-id='03054cfa' visibility='default' filepath='include/linux/cgroup-defs.h' line='716' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1856'>
-          <var-decl name='depends_on' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='724' column='1'/>
+          <var-decl name='depends_on' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='725' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='dev_archdata' size-in-bits='192' is-struct='yes' visibility='default' filepath='arch/arm64/include/asm/device.h' line='19' column='1' id='d3e142f5'>
@@ -16111,18 +16111,18 @@
           <var-decl name='users' type-id='64615833' visibility='default' filepath='include/linux/skbuff.h' line='858' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='socket_wq' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/net.h' line='93' column='1' id='8bd06fd9'>
+      <class-decl name='socket_wq' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/net.h' line='99' column='1' id='8bd06fd9'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='wait' type-id='b5ab048f' visibility='default' filepath='include/linux/net.h' line='95' column='1'/>
+          <var-decl name='wait' type-id='b5ab048f' visibility='default' filepath='include/linux/net.h' line='101' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='fasync_list' type-id='5bb9c75d' visibility='default' filepath='include/linux/net.h' line='96' column='1'/>
+          <var-decl name='fasync_list' type-id='5bb9c75d' visibility='default' filepath='include/linux/net.h' line='102' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='include/linux/net.h' line='97' column='1'/>
+          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='include/linux/net.h' line='103' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/linux/net.h' line='98' column='1'/>
+          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/linux/net.h' line='104' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='trace_event_functions' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/trace_events.h' line='117' column='1' id='195ea87f'>
@@ -16326,9 +16326,9 @@
           <var-decl name='tp_list' type-id='72f469ec' visibility='default' filepath='include/linux/perf_event.h' line='142' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' naming-typedef-id='c9df1e6c' visibility='default' filepath='include/net/net_namespace.h' line='282' column='1' id='0a0aec0a'>
+      <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' naming-typedef-id='c9df1e6c' visibility='default' filepath='include/net/net_namespace.h' line='289' column='1' id='0a0aec0a'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='net' type-id='a2bff676' visibility='default' filepath='include/net/net_namespace.h' line='284' column='1'/>
+          <var-decl name='net' type-id='a2bff676' visibility='default' filepath='include/net/net_namespace.h' line='291' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='__anonymous_struct__' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='block/blk-mq.h' line='14' column='1' id='fa9adea3'>
@@ -16396,24 +16396,24 @@
           <var-decl name='conf1' type-id='91ce1af9' visibility='default' filepath='include/linux/perf_event.h' line='164' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__26' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='797' column='1' id='16b0d6e5'>
+      <class-decl name='__anonymous_struct__26' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='798' column='1' id='16b0d6e5'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='is_data' type-id='f9b06939' visibility='default' filepath='include/linux/cgroup-defs.h' line='801' column='1'/>
+          <var-decl name='is_data' type-id='f9b06939' visibility='default' filepath='include/linux/cgroup-defs.h' line='802' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1'>
-          <var-decl name='no_refcnt' type-id='f9b06939' visibility='default' filepath='include/linux/cgroup-defs.h' line='802' column='1'/>
+          <var-decl name='no_refcnt' type-id='f9b06939' visibility='default' filepath='include/linux/cgroup-defs.h' line='803' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2'>
-          <var-decl name='unused' type-id='f9b06939' visibility='default' filepath='include/linux/cgroup-defs.h' line='803' column='1'/>
+          <var-decl name='unused' type-id='f9b06939' visibility='default' filepath='include/linux/cgroup-defs.h' line='804' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='8'>
-          <var-decl name='padding' type-id='f9b06939' visibility='default' filepath='include/linux/cgroup-defs.h' line='805' column='1'/>
+          <var-decl name='padding' type-id='f9b06939' visibility='default' filepath='include/linux/cgroup-defs.h' line='806' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='16'>
-          <var-decl name='prioidx' type-id='1dc6a898' visibility='default' filepath='include/linux/cgroup-defs.h' line='806' column='1'/>
+          <var-decl name='prioidx' type-id='1dc6a898' visibility='default' filepath='include/linux/cgroup-defs.h' line='807' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='classid' type-id='19c2251e' visibility='default' filepath='include/linux/cgroup-defs.h' line='807' column='1'/>
+          <var-decl name='classid' type-id='19c2251e' visibility='default' filepath='include/linux/cgroup-defs.h' line='808' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='__anonymous_struct__4' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/user_namespace.h' line='28' column='1' id='e873af3e'>
@@ -17127,56 +17127,56 @@
           <var-decl name='android_kabi_reserved4' type-id='91ce1af9' visibility='default' filepath='include/linux/device.h' line='159' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cgroup_root' size-in-bits='51712' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='497' column='1' id='66f1e832'>
+      <class-decl name='cgroup_root' size-in-bits='51712' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='498' column='1' id='66f1e832'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='kf_root' type-id='e18defdb' visibility='default' filepath='include/linux/cgroup-defs.h' line='498' column='1'/>
+          <var-decl name='kf_root' type-id='e18defdb' visibility='default' filepath='include/linux/cgroup-defs.h' line='499' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='subsys_mask' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='501' column='1'/>
+          <var-decl name='subsys_mask' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='502' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='hierarchy_id' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='504' column='1'/>
+          <var-decl name='hierarchy_id' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='505' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='cgrp' type-id='ab9643dd' visibility='default' filepath='include/linux/cgroup-defs.h' line='507' column='1'/>
+          <var-decl name='cgrp' type-id='ab9643dd' visibility='default' filepath='include/linux/cgroup-defs.h' line='508' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17984'>
-          <var-decl name='cgrp_ancestor_id_storage' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='510' column='1'/>
+          <var-decl name='cgrp_ancestor_id_storage' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='511' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='18016'>
-          <var-decl name='nr_cgrps' type-id='49178f86' visibility='default' filepath='include/linux/cgroup-defs.h' line='513' column='1'/>
+          <var-decl name='nr_cgrps' type-id='49178f86' visibility='default' filepath='include/linux/cgroup-defs.h' line='514' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='18048'>
-          <var-decl name='root_list' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='516' column='1'/>
+          <var-decl name='root_list' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='517' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='18176'>
-          <var-decl name='flags' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='519' column='1'/>
+          <var-decl name='flags' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='520' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='18240'>
-          <var-decl name='cgroup_idr' type-id='37ce495e' visibility='default' filepath='include/linux/cgroup-defs.h' line='522' column='1'/>
+          <var-decl name='cgroup_idr' type-id='37ce495e' visibility='default' filepath='include/linux/cgroup-defs.h' line='523' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='18432'>
-          <var-decl name='release_agent_path' type-id='d16c6df4' visibility='default' filepath='include/linux/cgroup-defs.h' line='525' column='1'/>
+          <var-decl name='release_agent_path' type-id='d16c6df4' visibility='default' filepath='include/linux/cgroup-defs.h' line='526' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='51200'>
-          <var-decl name='name' type-id='59daf3ef' visibility='default' filepath='include/linux/cgroup-defs.h' line='528' column='1'/>
+          <var-decl name='name' type-id='59daf3ef' visibility='default' filepath='include/linux/cgroup-defs.h' line='529' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cgroup_rstat_cpu' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='297' column='1' id='a73d96cf'>
+      <class-decl name='cgroup_rstat_cpu' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='298' column='1' id='a73d96cf'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='bsync' type-id='e4d85780' visibility='default' filepath='include/linux/cgroup-defs.h' line='302' column='1'/>
+          <var-decl name='bsync' type-id='e4d85780' visibility='default' filepath='include/linux/cgroup-defs.h' line='303' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='bstat' type-id='cfd8587e' visibility='default' filepath='include/linux/cgroup-defs.h' line='303' column='1'/>
+          <var-decl name='bstat' type-id='cfd8587e' visibility='default' filepath='include/linux/cgroup-defs.h' line='304' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='last_bstat' type-id='cfd8587e' visibility='default' filepath='include/linux/cgroup-defs.h' line='309' column='1'/>
+          <var-decl name='last_bstat' type-id='cfd8587e' visibility='default' filepath='include/linux/cgroup-defs.h' line='310' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='updated_children' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='322' column='1'/>
+          <var-decl name='updated_children' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='323' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='updated_next' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='323' column='1'/>
+          <var-decl name='updated_next' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='324' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='class' size-in-bits='1216' is-struct='yes' visibility='default' filepath='include/linux/device.h' line='430' column='1' id='fd48a067'>
@@ -20263,66 +20263,66 @@
           <var-decl name='count' type-id='f0981eeb' visibility='default' filepath='include/linux/cdev.h' line='20' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cftype' size-in-bits='1728' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='538' column='1' id='ea2ebeac'>
+      <class-decl name='cftype' size-in-bits='1728' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='539' column='1' id='ea2ebeac'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='name' type-id='59daf3ef' visibility='default' filepath='include/linux/cgroup-defs.h' line='544' column='1'/>
+          <var-decl name='name' type-id='59daf3ef' visibility='default' filepath='include/linux/cgroup-defs.h' line='545' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='private' type-id='7359adad' visibility='default' filepath='include/linux/cgroup-defs.h' line='545' column='1'/>
+          <var-decl name='private' type-id='7359adad' visibility='default' filepath='include/linux/cgroup-defs.h' line='546' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='max_write_len' type-id='b59d7dce' visibility='default' filepath='include/linux/cgroup-defs.h' line='551' column='1'/>
+          <var-decl name='max_write_len' type-id='b59d7dce' visibility='default' filepath='include/linux/cgroup-defs.h' line='552' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='640'>
-          <var-decl name='flags' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='554' column='1'/>
+          <var-decl name='flags' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='555' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='672'>
-          <var-decl name='file_offset' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='562' column='1'/>
+          <var-decl name='file_offset' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='563' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='ss' type-id='dc91d125' visibility='default' filepath='include/linux/cgroup-defs.h' line='568' column='1'/>
+          <var-decl name='ss' type-id='dc91d125' visibility='default' filepath='include/linux/cgroup-defs.h' line='569' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='768'>
-          <var-decl name='node' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='569' column='1'/>
+          <var-decl name='node' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='570' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='896'>
-          <var-decl name='kf_ops' type-id='1f2a8949' visibility='default' filepath='include/linux/cgroup-defs.h' line='570' column='1'/>
+          <var-decl name='kf_ops' type-id='1f2a8949' visibility='default' filepath='include/linux/cgroup-defs.h' line='571' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='960'>
-          <var-decl name='open' type-id='964d2eb6' visibility='default' filepath='include/linux/cgroup-defs.h' line='572' column='1'/>
+          <var-decl name='open' type-id='964d2eb6' visibility='default' filepath='include/linux/cgroup-defs.h' line='573' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='release' type-id='f1825e09' visibility='default' filepath='include/linux/cgroup-defs.h' line='573' column='1'/>
+          <var-decl name='release' type-id='f1825e09' visibility='default' filepath='include/linux/cgroup-defs.h' line='574' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1088'>
-          <var-decl name='read_u64' type-id='ad13fd93' visibility='default' filepath='include/linux/cgroup-defs.h' line='579' column='1'/>
+          <var-decl name='read_u64' type-id='ad13fd93' visibility='default' filepath='include/linux/cgroup-defs.h' line='580' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1152'>
-          <var-decl name='read_s64' type-id='ae18a37d' visibility='default' filepath='include/linux/cgroup-defs.h' line='583' column='1'/>
+          <var-decl name='read_s64' type-id='ae18a37d' visibility='default' filepath='include/linux/cgroup-defs.h' line='584' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1216'>
-          <var-decl name='seq_show' type-id='0131eb61' visibility='default' filepath='include/linux/cgroup-defs.h' line='586' column='1'/>
+          <var-decl name='seq_show' type-id='0131eb61' visibility='default' filepath='include/linux/cgroup-defs.h' line='587' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1280'>
-          <var-decl name='seq_start' type-id='a46b05a0' visibility='default' filepath='include/linux/cgroup-defs.h' line='589' column='1'/>
+          <var-decl name='seq_start' type-id='a46b05a0' visibility='default' filepath='include/linux/cgroup-defs.h' line='590' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1344'>
-          <var-decl name='seq_next' type-id='b6ba26fa' visibility='default' filepath='include/linux/cgroup-defs.h' line='590' column='1'/>
+          <var-decl name='seq_next' type-id='b6ba26fa' visibility='default' filepath='include/linux/cgroup-defs.h' line='591' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1408'>
-          <var-decl name='seq_stop' type-id='6ba28d1c' visibility='default' filepath='include/linux/cgroup-defs.h' line='591' column='1'/>
+          <var-decl name='seq_stop' type-id='6ba28d1c' visibility='default' filepath='include/linux/cgroup-defs.h' line='592' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1472'>
-          <var-decl name='write_u64' type-id='3e9fac96' visibility='default' filepath='include/linux/cgroup-defs.h' line='598' column='1'/>
+          <var-decl name='write_u64' type-id='3e9fac96' visibility='default' filepath='include/linux/cgroup-defs.h' line='599' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1536'>
-          <var-decl name='write_s64' type-id='2b0348f0' visibility='default' filepath='include/linux/cgroup-defs.h' line='603' column='1'/>
+          <var-decl name='write_s64' type-id='2b0348f0' visibility='default' filepath='include/linux/cgroup-defs.h' line='604' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1600'>
-          <var-decl name='write' type-id='17b1add7' visibility='default' filepath='include/linux/cgroup-defs.h' line='612' column='1'/>
+          <var-decl name='write' type-id='17b1add7' visibility='default' filepath='include/linux/cgroup-defs.h' line='613' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1664'>
-          <var-decl name='poll' type-id='b347e5ac' visibility='default' filepath='include/linux/cgroup-defs.h' line='615' column='1'/>
+          <var-decl name='poll' type-id='b347e5ac' visibility='default' filepath='include/linux/cgroup-defs.h' line='616' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='ct_pcpu' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/net/netns/conntrack.h' line='87' column='1' id='4ec43a31'>
@@ -21001,18 +21001,18 @@
           <var-decl name='search_restart' type-id='f0981eeb' visibility='default' filepath='include/linux/netfilter/nf_conntrack_common.h' line='19' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='ip_ra_chain' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/net/ip.h' line='120' column='1' id='4816a146'>
+      <class-decl name='ip_ra_chain' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/net/ip.h' line='123' column='1' id='4816a146'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='next' type-id='00c4cbac' visibility='default' filepath='include/net/ip.h' line='121' column='1'/>
+          <var-decl name='next' type-id='00c4cbac' visibility='default' filepath='include/net/ip.h' line='124' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='sk' type-id='f772df6d' visibility='default' filepath='include/net/ip.h' line='122' column='1'/>
+          <var-decl name='sk' type-id='f772df6d' visibility='default' filepath='include/net/ip.h' line='125' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='' type-id='4fa91678' visibility='default' filepath='include/net/ip.h' line='123' column='1'/>
+          <var-decl name='' type-id='4fa91678' visibility='default' filepath='include/net/ip.h' line='126' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/net/ip.h' line='127' column='1'/>
+          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/net/ip.h' line='130' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='ipstats_mib' size-in-bits='2368' is-struct='yes' visibility='default' filepath='include/net/snmp.h' line='56' column='1' id='f52a1ce8'>
@@ -21607,102 +21607,102 @@
         </data-member>
       </class-decl>
       <class-decl name='prot_inuse' is-struct='yes' visibility='default' is-declaration-only='yes' id='ac763c5d'/>
-      <class-decl name='proto_ops' size-in-bits='2048' is-struct='yes' visibility='default' filepath='include/linux/net.h' line='134' column='1' id='4e0399c2'>
+      <class-decl name='proto_ops' size-in-bits='2048' is-struct='yes' visibility='default' filepath='include/linux/net.h' line='140' column='1' id='4e0399c2'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='family' type-id='95e97e5e' visibility='default' filepath='include/linux/net.h' line='135' column='1'/>
+          <var-decl name='family' type-id='95e97e5e' visibility='default' filepath='include/linux/net.h' line='141' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='owner' type-id='2730d015' visibility='default' filepath='include/linux/net.h' line='136' column='1'/>
+          <var-decl name='owner' type-id='2730d015' visibility='default' filepath='include/linux/net.h' line='142' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='release' type-id='27936440' visibility='default' filepath='include/linux/net.h' line='137' column='1'/>
+          <var-decl name='release' type-id='27936440' visibility='default' filepath='include/linux/net.h' line='143' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='bind' type-id='c9664af8' visibility='default' filepath='include/linux/net.h' line='138' column='1'/>
+          <var-decl name='bind' type-id='c9664af8' visibility='default' filepath='include/linux/net.h' line='144' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='connect' type-id='be6c7be7' visibility='default' filepath='include/linux/net.h' line='141' column='1'/>
+          <var-decl name='connect' type-id='be6c7be7' visibility='default' filepath='include/linux/net.h' line='147' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='socketpair' type-id='be3a232b' visibility='default' filepath='include/linux/net.h' line='144' column='1'/>
+          <var-decl name='socketpair' type-id='be3a232b' visibility='default' filepath='include/linux/net.h' line='150' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='accept' type-id='2136470b' visibility='default' filepath='include/linux/net.h' line='146' column='1'/>
+          <var-decl name='accept' type-id='2136470b' visibility='default' filepath='include/linux/net.h' line='152' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='getname' type-id='c9664af8' visibility='default' filepath='include/linux/net.h' line='148' column='1'/>
+          <var-decl name='getname' type-id='c9664af8' visibility='default' filepath='include/linux/net.h' line='154' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='poll' type-id='e93ad56e' visibility='default' filepath='include/linux/net.h' line='151' column='1'/>
+          <var-decl name='poll' type-id='e93ad56e' visibility='default' filepath='include/linux/net.h' line='157' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='ioctl' type-id='82a9a11e' visibility='default' filepath='include/linux/net.h' line='153' column='1'/>
+          <var-decl name='ioctl' type-id='82a9a11e' visibility='default' filepath='include/linux/net.h' line='159' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='640'>
-          <var-decl name='compat_ioctl' type-id='82a9a11e' visibility='default' filepath='include/linux/net.h' line='156' column='1'/>
+          <var-decl name='compat_ioctl' type-id='82a9a11e' visibility='default' filepath='include/linux/net.h' line='162' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='listen' type-id='6dfd92af' visibility='default' filepath='include/linux/net.h' line='159' column='1'/>
+          <var-decl name='listen' type-id='6dfd92af' visibility='default' filepath='include/linux/net.h' line='165' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='768'>
-          <var-decl name='shutdown' type-id='6dfd92af' visibility='default' filepath='include/linux/net.h' line='160' column='1'/>
+          <var-decl name='shutdown' type-id='6dfd92af' visibility='default' filepath='include/linux/net.h' line='166' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='setsockopt' type-id='82ffa5a0' visibility='default' filepath='include/linux/net.h' line='161' column='1'/>
+          <var-decl name='setsockopt' type-id='82ffa5a0' visibility='default' filepath='include/linux/net.h' line='167' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='896'>
-          <var-decl name='getsockopt' type-id='a9c0cdab' visibility='default' filepath='include/linux/net.h' line='163' column='1'/>
+          <var-decl name='getsockopt' type-id='a9c0cdab' visibility='default' filepath='include/linux/net.h' line='169' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='960'>
-          <var-decl name='compat_setsockopt' type-id='82ffa5a0' visibility='default' filepath='include/linux/net.h' line='166' column='1'/>
+          <var-decl name='compat_setsockopt' type-id='82ffa5a0' visibility='default' filepath='include/linux/net.h' line='172' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='compat_getsockopt' type-id='a9c0cdab' visibility='default' filepath='include/linux/net.h' line='168' column='1'/>
+          <var-decl name='compat_getsockopt' type-id='a9c0cdab' visibility='default' filepath='include/linux/net.h' line='174' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1088'>
-          <var-decl name='sendmsg' type-id='f38728c0' visibility='default' filepath='include/linux/net.h' line='171' column='1'/>
+          <var-decl name='sendmsg' type-id='f38728c0' visibility='default' filepath='include/linux/net.h' line='177' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1152'>
-          <var-decl name='recvmsg' type-id='93abc02f' visibility='default' filepath='include/linux/net.h' line='181' column='1'/>
+          <var-decl name='recvmsg' type-id='93abc02f' visibility='default' filepath='include/linux/net.h' line='187' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1216'>
-          <var-decl name='mmap' type-id='3eef3bc7' visibility='default' filepath='include/linux/net.h' line='183' column='1'/>
+          <var-decl name='mmap' type-id='3eef3bc7' visibility='default' filepath='include/linux/net.h' line='189' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1280'>
-          <var-decl name='sendpage' type-id='42b02383' visibility='default' filepath='include/linux/net.h' line='185' column='1'/>
+          <var-decl name='sendpage' type-id='42b02383' visibility='default' filepath='include/linux/net.h' line='191' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1344'>
-          <var-decl name='splice_read' type-id='21641a6b' visibility='default' filepath='include/linux/net.h' line='187' column='1'/>
+          <var-decl name='splice_read' type-id='21641a6b' visibility='default' filepath='include/linux/net.h' line='193' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1408'>
-          <var-decl name='set_peek_off' type-id='95208a5e' visibility='default' filepath='include/linux/net.h' line='189' column='1'/>
+          <var-decl name='set_peek_off' type-id='95208a5e' visibility='default' filepath='include/linux/net.h' line='195' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1472'>
-          <var-decl name='peek_len' type-id='27936440' visibility='default' filepath='include/linux/net.h' line='190' column='1'/>
+          <var-decl name='peek_len' type-id='27936440' visibility='default' filepath='include/linux/net.h' line='196' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1536'>
-          <var-decl name='read_sock' type-id='8755cc63' visibility='default' filepath='include/linux/net.h' line='195' column='1'/>
+          <var-decl name='read_sock' type-id='8755cc63' visibility='default' filepath='include/linux/net.h' line='201' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1600'>
-          <var-decl name='sendpage_locked' type-id='65399e23' visibility='default' filepath='include/linux/net.h' line='197' column='1'/>
+          <var-decl name='sendpage_locked' type-id='65399e23' visibility='default' filepath='include/linux/net.h' line='203' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1664'>
-          <var-decl name='sendmsg_locked' type-id='1df08751' visibility='default' filepath='include/linux/net.h' line='199' column='1'/>
+          <var-decl name='sendmsg_locked' type-id='1df08751' visibility='default' filepath='include/linux/net.h' line='205' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1728'>
-          <var-decl name='set_rcvlowat' type-id='95208a5e' visibility='default' filepath='include/linux/net.h' line='201' column='1'/>
+          <var-decl name='set_rcvlowat' type-id='95208a5e' visibility='default' filepath='include/linux/net.h' line='207' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1792'>
-          <var-decl name='android_kabi_reserved1' type-id='91ce1af9' visibility='default' filepath='include/linux/net.h' line='203' column='1'/>
+          <var-decl name='android_kabi_reserved1' type-id='91ce1af9' visibility='default' filepath='include/linux/net.h' line='209' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1856'>
-          <var-decl name='android_kabi_reserved2' type-id='91ce1af9' visibility='default' filepath='include/linux/net.h' line='204' column='1'/>
+          <var-decl name='android_kabi_reserved2' type-id='91ce1af9' visibility='default' filepath='include/linux/net.h' line='210' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1920'>
-          <var-decl name='android_kabi_reserved3' type-id='91ce1af9' visibility='default' filepath='include/linux/net.h' line='205' column='1'/>
+          <var-decl name='android_kabi_reserved3' type-id='91ce1af9' visibility='default' filepath='include/linux/net.h' line='211' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1984'>
-          <var-decl name='android_kabi_reserved4' type-id='91ce1af9' visibility='default' filepath='include/linux/net.h' line='206' column='1'/>
+          <var-decl name='android_kabi_reserved4' type-id='91ce1af9' visibility='default' filepath='include/linux/net.h' line='212' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='psi_group_cpu' size-in-bits='1024' is-struct='yes' visibility='default' filepath='include/linux/psi_types.h' line='56' column='1' id='956e764e'>
@@ -22284,12 +22284,12 @@
           <var-decl name='no_numa' type-id='b50a4934' visibility='default' filepath='include/linux/workqueue.h' line='161' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='wq_device' size-in-bits='7680' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='5192' column='1' id='a88ecfc8'>
+      <class-decl name='wq_device' size-in-bits='7680' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='5198' column='1' id='a88ecfc8'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='wq' type-id='242e3d19' visibility='default' filepath='kernel/workqueue.c' line='5193' column='1'/>
+          <var-decl name='wq' type-id='242e3d19' visibility='default' filepath='kernel/workqueue.c' line='5199' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='dev' type-id='66e487eb' visibility='default' filepath='kernel/workqueue.c' line='5194' column='1'/>
+          <var-decl name='dev' type-id='66e487eb' visibility='default' filepath='kernel/workqueue.c' line='5200' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='wq_flusher' size-in-bits='448' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='226' column='1' id='c8eb0f4f'>
@@ -25022,12 +25022,12 @@
           <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__31' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/ip.h' line='123' column='1' id='4fa91678'>
+      <union-decl name='__anonymous_union__31' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/ip.h' line='126' column='1' id='4fa91678'>
         <data-member access='public'>
-          <var-decl name='destructor' type-id='841969d0' visibility='default' filepath='include/net/ip.h' line='124' column='1'/>
+          <var-decl name='destructor' type-id='841969d0' visibility='default' filepath='include/net/ip.h' line='127' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='saved_sk' type-id='f772df6d' visibility='default' filepath='include/net/ip.h' line='125' column='1'/>
+          <var-decl name='saved_sk' type-id='f772df6d' visibility='default' filepath='include/net/ip.h' line='128' column='1'/>
         </data-member>
       </union-decl>
       <pointer-type-def type-id='02138eb3' size-in-bits='64' id='3a0c781f'/>
@@ -26746,12 +26746,12 @@
           <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='include/net/udp.h' line='64' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='uncached_list' size-in-bits='192' is-struct='yes' visibility='default' filepath='net/ipv4/route.c' line='1496' column='1' id='6b1203e5'>
+      <class-decl name='uncached_list' size-in-bits='192' is-struct='yes' visibility='default' filepath='net/ipv4/route.c' line='1504' column='1' id='6b1203e5'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='net/ipv4/route.c' line='1497' column='1'/>
+          <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='net/ipv4/route.c' line='1505' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='head' type-id='72f469ec' visibility='default' filepath='net/ipv4/route.c' line='1498' column='1'/>
+          <var-decl name='head' type-id='72f469ec' visibility='default' filepath='net/ipv4/route.c' line='1506' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='worker_pool' size-in-bits='7168' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='147' column='1' id='19ea21fe'>
@@ -27170,7 +27170,7 @@
           <var-decl name='e_gid' type-id='094d8048' visibility='default' filepath='include/linux/posix_acl.h' line='23' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/tty.h' line='59' column='1' id='053892cc'>
+      <union-decl name='__anonymous_union__4' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/tty.h' line='59' column='1' id='053892cc'>
         <data-member access='public'>
           <var-decl name='next' type-id='a150e667' visibility='default' filepath='include/linux/tty.h' line='60' column='1'/>
         </data-member>
@@ -30293,7 +30293,7 @@
       <array-type-def dimensions='1' type-id='19c2251e' size-in-bits='64' id='1872161b'>
         <subrange length='2' type-id='7ff19f0f' id='52efc4ef'/>
       </array-type-def>
-      <union-decl name='__anonymous_union__3' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/cfg80211.h' line='2331' column='1' id='0532d6f6'>
+      <union-decl name='__anonymous_union__13' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/cfg80211.h' line='2331' column='1' id='0532d6f6'>
         <data-member access='public'>
           <var-decl name='band_pref' type-id='3eaa0294' visibility='default' filepath='include/net/cfg80211.h' line='2332' column='1'/>
         </data-member>
@@ -31640,7 +31640,7 @@
         <parameter type-id='bd54fe1a'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='find_vma' mangled-name='find_vma' filepath='include/linux/mm.h' line='2485' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='find_vma'>
+      <function-decl name='find_vma' mangled-name='find_vma' filepath='include/linux/mm.h' line='2488' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='find_vma'>
         <parameter type-id='df4b7819'/>
         <parameter type-id='7359adad'/>
         <return type-id='2ae08426'/>
@@ -31655,7 +31655,7 @@
         <parameter type-id='9b58df93'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='get_unmapped_area' mangled-name='get_unmapped_area' filepath='include/linux/mm.h' line='2363' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_unmapped_area'>
+      <function-decl name='get_unmapped_area' mangled-name='get_unmapped_area' filepath='include/linux/mm.h' line='2366' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_unmapped_area'>
         <parameter type-id='77e79a4b'/>
         <parameter type-id='7359adad'/>
         <parameter type-id='7359adad'/>
@@ -32088,7 +32088,7 @@
         <parameter type-id='eaa32e2f'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='remap_pfn_range' mangled-name='remap_pfn_range' filepath='include/linux/mm.h' line='2567' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='remap_pfn_range'>
+      <function-decl name='remap_pfn_range' mangled-name='remap_pfn_range' filepath='include/linux/mm.h' line='2570' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='remap_pfn_range'>
         <parameter type-id='2ae08426'/>
         <parameter type-id='7359adad'/>
         <parameter type-id='7359adad'/>
@@ -34803,18 +34803,18 @@
           <var-decl name='total' type-id='95e97e5e' visibility='default' filepath='include/net/inetpeer.h' line='64' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='ip_ra_chain' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/net/ip.h' line='120' column='1' id='4816a146'>
+      <class-decl name='ip_ra_chain' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/net/ip.h' line='123' column='1' id='4816a146'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='next' type-id='00c4cbac' visibility='default' filepath='include/net/ip.h' line='121' column='1'/>
+          <var-decl name='next' type-id='00c4cbac' visibility='default' filepath='include/net/ip.h' line='124' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='sk' type-id='f772df6d' visibility='default' filepath='include/net/ip.h' line='122' column='1'/>
+          <var-decl name='sk' type-id='f772df6d' visibility='default' filepath='include/net/ip.h' line='125' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='' type-id='4fa91678' visibility='default' filepath='include/net/ip.h' line='123' column='1'/>
+          <var-decl name='' type-id='4fa91678' visibility='default' filepath='include/net/ip.h' line='126' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/net/ip.h' line='127' column='1'/>
+          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/net/ip.h' line='130' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='ipc_namespace' is-struct='yes' visibility='default' is-declaration-only='yes' id='dd74f3ed'/>
@@ -38985,10 +38985,10 @@
         <enumerator name='RTNL_LINK_INITIALIZED' value='0'/>
         <enumerator name='RTNL_LINK_INITIALIZING' value='1'/>
       </enum-decl>
-      <typedef-decl name='possible_net_t' type-id='0a0aec0a' filepath='include/net/net_namespace.h' line='286' column='1' id='c9df1e6c'/>
-      <class-decl name='__anonymous_struct__19' size-in-bits='64' is-struct='yes' is-anonymous='yes' naming-typedef-id='c9df1e6c' visibility='default' filepath='include/net/net_namespace.h' line='282' column='1' id='0a0aec0a'>
+      <typedef-decl name='possible_net_t' type-id='0a0aec0a' filepath='include/net/net_namespace.h' line='293' column='1' id='c9df1e6c'/>
+      <class-decl name='__anonymous_struct__19' size-in-bits='64' is-struct='yes' is-anonymous='yes' naming-typedef-id='c9df1e6c' visibility='default' filepath='include/net/net_namespace.h' line='289' column='1' id='0a0aec0a'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='net' type-id='a2bff676' visibility='default' filepath='include/net/net_namespace.h' line='284' column='1'/>
+          <var-decl name='net' type-id='a2bff676' visibility='default' filepath='include/net/net_namespace.h' line='291' column='1'/>
         </data-member>
       </class-decl>
       <union-decl name='__anonymous_union__16' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/netdevice.h' line='2026' column='1' id='38feef9e'>
@@ -40606,21 +40606,21 @@
           <var-decl name='rbits6' type-id='f9b06939' visibility='default' filepath='include/net/netns/xfrm.h' line='28' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cgroup_namespace' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/cgroup.h' line='852' column='1' id='e54806c5'>
+      <class-decl name='cgroup_namespace' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/cgroup.h' line='859' column='1' id='e54806c5'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='count' type-id='64615833' visibility='default' filepath='include/linux/cgroup.h' line='853' column='1'/>
+          <var-decl name='count' type-id='64615833' visibility='default' filepath='include/linux/cgroup.h' line='860' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='ns' type-id='99f367f2' visibility='default' filepath='include/linux/cgroup.h' line='854' column='1'/>
+          <var-decl name='ns' type-id='99f367f2' visibility='default' filepath='include/linux/cgroup.h' line='861' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='user_ns' type-id='c0ced320' visibility='default' filepath='include/linux/cgroup.h' line='855' column='1'/>
+          <var-decl name='user_ns' type-id='c0ced320' visibility='default' filepath='include/linux/cgroup.h' line='862' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='ucounts' type-id='b1d4934a' visibility='default' filepath='include/linux/cgroup.h' line='856' column='1'/>
+          <var-decl name='ucounts' type-id='b1d4934a' visibility='default' filepath='include/linux/cgroup.h' line='863' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='root_cset' type-id='85d57723' visibility='default' filepath='include/linux/cgroup.h' line='857' column='1'/>
+          <var-decl name='root_cset' type-id='85d57723' visibility='default' filepath='include/linux/cgroup.h' line='864' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='cpu_itimer' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/sched/signal.h' line='35' column='1' id='47841236'>
@@ -42620,38 +42620,38 @@
       <pointer-type-def type-id='732bc085' size-in-bits='64' id='fce0537d'/>
       <pointer-type-def type-id='fce0537d' size-in-bits='64' id='6c2331f5'/>
       <pointer-type-def type-id='b4dce158' size-in-bits='64' id='c8e4e392'/>
-      <function-decl name='request_firmware' mangled-name='request_firmware' filepath='drivers/base/firmware_loader/main.c' line='629' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='request_firmware'>
-        <parameter type-id='6c2331f5' name='firmware_p' filepath='drivers/base/firmware_loader/main.c' line='629' column='1'/>
-        <parameter type-id='80f4b756' name='name' filepath='drivers/base/firmware_loader/main.c' line='629' column='1'/>
-        <parameter type-id='fa0b179b' name='device' filepath='drivers/base/firmware_loader/main.c' line='630' column='1'/>
+      <function-decl name='request_firmware' mangled-name='request_firmware' filepath='drivers/base/firmware_loader/main.c' line='631' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='request_firmware'>
+        <parameter type-id='6c2331f5' name='firmware_p' filepath='drivers/base/firmware_loader/main.c' line='631' column='1'/>
+        <parameter type-id='80f4b756' name='name' filepath='drivers/base/firmware_loader/main.c' line='631' column='1'/>
+        <parameter type-id='fa0b179b' name='device' filepath='drivers/base/firmware_loader/main.c' line='632' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='release_firmware' mangled-name='release_firmware' filepath='drivers/base/firmware_loader/main.c' line='755' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='release_firmware'>
-        <parameter type-id='fce0537d' name='fw' filepath='drivers/base/firmware_loader/main.c' line='755' column='1'/>
+      <function-decl name='release_firmware' mangled-name='release_firmware' filepath='drivers/base/firmware_loader/main.c' line='757' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='release_firmware'>
+        <parameter type-id='fce0537d' name='fw' filepath='drivers/base/firmware_loader/main.c' line='757' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='firmware_request_nowarn' mangled-name='firmware_request_nowarn' filepath='drivers/base/firmware_loader/main.c' line='656' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='firmware_request_nowarn'>
-        <parameter type-id='6c2331f5' name='firmware' filepath='drivers/base/firmware_loader/main.c' line='656' column='1'/>
-        <parameter type-id='80f4b756' name='name' filepath='drivers/base/firmware_loader/main.c' line='656' column='1'/>
-        <parameter type-id='fa0b179b' name='device' filepath='drivers/base/firmware_loader/main.c' line='657' column='1'/>
+      <function-decl name='firmware_request_nowarn' mangled-name='firmware_request_nowarn' filepath='drivers/base/firmware_loader/main.c' line='658' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='firmware_request_nowarn'>
+        <parameter type-id='6c2331f5' name='firmware' filepath='drivers/base/firmware_loader/main.c' line='658' column='1'/>
+        <parameter type-id='80f4b756' name='name' filepath='drivers/base/firmware_loader/main.c' line='658' column='1'/>
+        <parameter type-id='fa0b179b' name='device' filepath='drivers/base/firmware_loader/main.c' line='659' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='request_firmware_into_buf' mangled-name='request_firmware_into_buf' filepath='drivers/base/firmware_loader/main.c' line='735' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='request_firmware_into_buf'>
-        <parameter type-id='6c2331f5' name='firmware_p' filepath='drivers/base/firmware_loader/main.c' line='735' column='1'/>
-        <parameter type-id='80f4b756' name='name' filepath='drivers/base/firmware_loader/main.c' line='735' column='1'/>
-        <parameter type-id='fa0b179b' name='device' filepath='drivers/base/firmware_loader/main.c' line='736' column='1'/>
-        <parameter type-id='eaa32e2f' name='buf' filepath='drivers/base/firmware_loader/main.c' line='736' column='1'/>
-        <parameter type-id='b59d7dce' name='size' filepath='drivers/base/firmware_loader/main.c' line='736' column='1'/>
+      <function-decl name='request_firmware_into_buf' mangled-name='request_firmware_into_buf' filepath='drivers/base/firmware_loader/main.c' line='737' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='request_firmware_into_buf'>
+        <parameter type-id='6c2331f5' name='firmware_p' filepath='drivers/base/firmware_loader/main.c' line='737' column='1'/>
+        <parameter type-id='80f4b756' name='name' filepath='drivers/base/firmware_loader/main.c' line='737' column='1'/>
+        <parameter type-id='fa0b179b' name='device' filepath='drivers/base/firmware_loader/main.c' line='738' column='1'/>
+        <parameter type-id='eaa32e2f' name='buf' filepath='drivers/base/firmware_loader/main.c' line='738' column='1'/>
+        <parameter type-id='b59d7dce' name='size' filepath='drivers/base/firmware_loader/main.c' line='738' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='request_firmware_nowait' mangled-name='request_firmware_nowait' filepath='drivers/base/firmware_loader/main.c' line='817' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='request_firmware_nowait'>
-        <parameter type-id='2730d015' name='module' filepath='drivers/base/firmware_loader/main.c' line='818' column='1'/>
-        <parameter type-id='b50a4934' name='uevent' filepath='drivers/base/firmware_loader/main.c' line='818' column='1'/>
-        <parameter type-id='80f4b756' name='name' filepath='drivers/base/firmware_loader/main.c' line='819' column='1'/>
-        <parameter type-id='fa0b179b' name='device' filepath='drivers/base/firmware_loader/main.c' line='819' column='1'/>
-        <parameter type-id='3eb7c31c' name='gfp' filepath='drivers/base/firmware_loader/main.c' line='819' column='1'/>
-        <parameter type-id='eaa32e2f' name='context' filepath='drivers/base/firmware_loader/main.c' line='819' column='1'/>
-        <parameter type-id='c8e4e392' name='cont' filepath='drivers/base/firmware_loader/main.c' line='820' column='1'/>
+      <function-decl name='request_firmware_nowait' mangled-name='request_firmware_nowait' filepath='drivers/base/firmware_loader/main.c' line='819' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='request_firmware_nowait'>
+        <parameter type-id='2730d015' name='module' filepath='drivers/base/firmware_loader/main.c' line='820' column='1'/>
+        <parameter type-id='b50a4934' name='uevent' filepath='drivers/base/firmware_loader/main.c' line='820' column='1'/>
+        <parameter type-id='80f4b756' name='name' filepath='drivers/base/firmware_loader/main.c' line='821' column='1'/>
+        <parameter type-id='fa0b179b' name='device' filepath='drivers/base/firmware_loader/main.c' line='821' column='1'/>
+        <parameter type-id='3eb7c31c' name='gfp' filepath='drivers/base/firmware_loader/main.c' line='821' column='1'/>
+        <parameter type-id='eaa32e2f' name='context' filepath='drivers/base/firmware_loader/main.c' line='821' column='1'/>
+        <parameter type-id='c8e4e392' name='cont' filepath='drivers/base/firmware_loader/main.c' line='822' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-type size-in-bits='64' id='b4dce158'>
@@ -46754,74 +46754,6 @@
       <pointer-type-def type-id='9cbd1c16' size-in-bits='64' id='f9b37274'/>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/block/zram/zram_drv.c' language='LANG_C89'>
-      <array-type-def dimensions='1' type-id='28ee064c' size-in-bits='320' id='39e531ac'>
-        <subrange length='5' type-id='7ff19f0f' id='53010e10'/>
-      </array-type-def>
-      <array-type-def dimensions='1' type-id='0f8f80b0' size-in-bits='320' id='39e1fe03'>
-        <subrange length='5' type-id='7ff19f0f' id='53010e10'/>
-      </array-type-def>
-      <array-type-def dimensions='1' type-id='3213e875' size-in-bits='320' id='f5665670'>
-        <subrange length='5' type-id='7ff19f0f' id='53010e10'/>
-      </array-type-def>
-      <array-type-def dimensions='1' type-id='b92c8d0d' size-in-bits='1600' id='68a92070'>
-        <subrange length='5' type-id='7ff19f0f' id='53010e10'/>
-      </array-type-def>
-      <class-decl name='blkcg' size-in-bits='3136' is-struct='yes' visibility='default' filepath='include/linux/blk-cgroup.h' line='46' column='1' id='19b26952'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='css' type-id='7f3df443' visibility='default' filepath='include/linux/blk-cgroup.h' line='47' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='2176'>
-          <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='include/linux/blk-cgroup.h' line='48' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='2240'>
-          <var-decl name='blkg_tree' type-id='1c8dedcf' visibility='default' filepath='include/linux/blk-cgroup.h' line='50' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='2368'>
-          <var-decl name='blkg_hint' type-id='1146dea3' visibility='default' filepath='include/linux/blk-cgroup.h' line='51' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='2432'>
-          <var-decl name='blkg_list' type-id='e151255a' visibility='default' filepath='include/linux/blk-cgroup.h' line='52' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='2496'>
-          <var-decl name='cpd' type-id='39e1fe03' visibility='default' filepath='include/linux/blk-cgroup.h' line='54' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='2816'>
-          <var-decl name='all_blkcgs_node' type-id='72f469ec' visibility='default' filepath='include/linux/blk-cgroup.h' line='56' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='2944'>
-          <var-decl name='cgwb_list' type-id='72f469ec' visibility='default' filepath='include/linux/blk-cgroup.h' line='58' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='3072'>
-          <var-decl name='cgwb_refcnt' type-id='64615833' visibility='default' filepath='include/linux/blk-cgroup.h' line='59' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='blkcg_policy_data' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/blk-cgroup.h' line='102' column='1' id='11fd1392'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='blkcg' type-id='11bff950' visibility='default' filepath='include/linux/blk-cgroup.h' line='104' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='plid' type-id='95e97e5e' visibility='default' filepath='include/linux/blk-cgroup.h' line='105' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='blkg_rwstat' size-in-bits='1920' is-struct='yes' visibility='default' filepath='include/linux/blk-cgroup.h' line='73' column='1' id='247d0323'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='cpu_cnt' type-id='68a92070' visibility='default' filepath='include/linux/blk-cgroup.h' line='74' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='1600'>
-          <var-decl name='aux_cnt' type-id='39e531ac' visibility='default' filepath='include/linux/blk-cgroup.h' line='75' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='blkg_policy_data' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/blk-cgroup.h' line='89' column='1' id='55eaf925'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='blkg' type-id='1146dea3' visibility='default' filepath='include/linux/blk-cgroup.h' line='91' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='plid' type-id='95e97e5e' visibility='default' filepath='include/linux/blk-cgroup.h' line='92' column='1'/>
-        </data-member>
-      </class-decl>
-      <pointer-type-def type-id='19b26952' size-in-bits='64' id='11bff950'/>
-      <pointer-type-def type-id='11fd1392' size-in-bits='64' id='0f8f80b0'/>
-      <pointer-type-def type-id='55eaf925' size-in-bits='64' id='3213e875'/>
       <qualified-type-def type-id='37ce495e' const='yes' id='1e6236d9'/>
       <pointer-type-def type-id='1e6236d9' size-in-bits='64' id='c79c8089'/>
       <pointer-type-def type-id='37ce495e' size-in-bits='64' id='301185b4'/>
@@ -54853,18 +54785,18 @@
           <var-decl name='lock_count' type-id='7359adad' visibility='default' filepath='include/drm/drm_file.h' line='337' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='drm_ioctl_desc' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/drm/drm_ioctl.h' line='141' column='1' id='833c0b8c'>
+      <class-decl name='drm_ioctl_desc' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/drm/drm_ioctl.h' line='142' column='1' id='833c0b8c'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='cmd' type-id='f0981eeb' visibility='default' filepath='include/drm/drm_ioctl.h' line='142' column='1'/>
+          <var-decl name='cmd' type-id='f0981eeb' visibility='default' filepath='include/drm/drm_ioctl.h' line='143' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='flags' type-id='ad578603' visibility='default' filepath='include/drm/drm_ioctl.h' line='143' column='1'/>
+          <var-decl name='flags' type-id='ad578603' visibility='default' filepath='include/drm/drm_ioctl.h' line='144' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='func' type-id='e2cefc47' visibility='default' filepath='include/drm/drm_ioctl.h' line='144' column='1'/>
+          <var-decl name='func' type-id='e2cefc47' visibility='default' filepath='include/drm/drm_ioctl.h' line='145' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='name' type-id='80f4b756' visibility='default' filepath='include/drm/drm_ioctl.h' line='145' column='1'/>
+          <var-decl name='name' type-id='80f4b756' visibility='default' filepath='include/drm/drm_ioctl.h' line='146' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='drm_mode_set' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/drm/drm_crtc.h' line='1059' column='1' id='ef266a3b'>
@@ -55610,7 +55542,7 @@
         <enumerator name='DRM_LIST_RECLAIM' value='5'/>
       </enum-decl>
       <pointer-type-def type-id='20638bb4' size-in-bits='64' id='69099556'/>
-      <enum-decl name='drm_ioctl_flags' filepath='include/drm/drm_ioctl.h' line='79' column='1' id='ad578603'>
+      <enum-decl name='drm_ioctl_flags' filepath='include/drm/drm_ioctl.h' line='80' column='1' id='ad578603'>
         <underlying-type type-id='9cac1fee'/>
         <enumerator name='DRM_AUTH' value='1'/>
         <enumerator name='DRM_MASTER' value='2'/>
@@ -57994,21 +57926,21 @@
           <var-decl name='size' type-id='d3130597' visibility='default' filepath='include/uapi/drm/drm_mode.h' line='723' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='drm_ioctl_desc' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/drm/drm_ioctl.h' line='141' column='1' id='833c0b8c'>
+      <class-decl name='drm_ioctl_desc' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/drm/drm_ioctl.h' line='142' column='1' id='833c0b8c'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='cmd' type-id='f0981eeb' visibility='default' filepath='include/drm/drm_ioctl.h' line='142' column='1'/>
+          <var-decl name='cmd' type-id='f0981eeb' visibility='default' filepath='include/drm/drm_ioctl.h' line='143' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='flags' type-id='ad578603' visibility='default' filepath='include/drm/drm_ioctl.h' line='143' column='1'/>
+          <var-decl name='flags' type-id='ad578603' visibility='default' filepath='include/drm/drm_ioctl.h' line='144' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='func' type-id='e2cefc47' visibility='default' filepath='include/drm/drm_ioctl.h' line='144' column='1'/>
+          <var-decl name='func' type-id='e2cefc47' visibility='default' filepath='include/drm/drm_ioctl.h' line='145' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='name' type-id='80f4b756' visibility='default' filepath='include/drm/drm_ioctl.h' line='145' column='1'/>
+          <var-decl name='name' type-id='80f4b756' visibility='default' filepath='include/drm/drm_ioctl.h' line='146' column='1'/>
         </data-member>
       </class-decl>
-      <enum-decl name='drm_ioctl_flags' filepath='include/drm/drm_ioctl.h' line='79' column='1' id='ad578603'>
+      <enum-decl name='drm_ioctl_flags' filepath='include/drm/drm_ioctl.h' line='80' column='1' id='ad578603'>
         <underlying-type type-id='9cac1fee'/>
         <enumerator name='DRM_AUTH' value='1'/>
         <enumerator name='DRM_MASTER' value='2'/>
@@ -66263,6 +66195,17 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/hid/hid-sony.c' language='LANG_C89'>
+      <union-decl name='power_supply_propval' size-in-bits='64' visibility='default' filepath='include/linux/power_supply.h' line='494' column='1' id='08942f16'>
+        <data-member access='public'>
+          <var-decl name='intval' type-id='95e97e5e' visibility='default' filepath='include/linux/power_supply.h' line='495' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='strval' type-id='80f4b756' visibility='default' filepath='include/linux/power_supply.h' line='496' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='int64val' type-id='9da381c4' visibility='default' filepath='include/linux/power_supply.h' line='497' column='1'/>
+        </data-member>
+      </union-decl>
       <class-decl name='power_supply' size-in-bits='10432' is-struct='yes' visibility='default' filepath='include/linux/power_supply.h' line='556' column='1' id='98749268'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='desc' type-id='cb9cd99f' visibility='default' filepath='include/linux/power_supply.h' line='557' column='1'/>
@@ -66657,17 +66600,6 @@
         <enumerator name='POWER_SUPPLY_PROP_SERIAL_NUMBER' value='226'/>
       </enum-decl>
       <typedef-decl name='int64_t' type-id='9b7c55ef' filepath='include/linux/types.h' line='114' column='1' id='9da381c4'/>
-      <union-decl name='power_supply_propval' size-in-bits='64' visibility='default' filepath='include/linux/power_supply.h' line='494' column='1' id='08942f16'>
-        <data-member access='public'>
-          <var-decl name='intval' type-id='95e97e5e' visibility='default' filepath='include/linux/power_supply.h' line='495' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='strval' type-id='80f4b756' visibility='default' filepath='include/linux/power_supply.h' line='496' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='int64val' type-id='9da381c4' visibility='default' filepath='include/linux/power_supply.h' line='497' column='1'/>
-        </data-member>
-      </union-decl>
       <class-decl name='power_supply_config' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/power_supply.h' line='504' column='1' id='098cab97'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='of_node' type-id='9a537bbe' visibility='default' filepath='include/linux/power_supply.h' line='505' column='1'/>
@@ -67225,25 +67157,25 @@
       </function-type>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/i2c/i2c-core-base.c' language='LANG_C89'>
-      <function-decl name='i2c_match_id' mangled-name='i2c_match_id' filepath='drivers/i2c/i2c-core-base.c' line='86' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='i2c_match_id'>
-        <parameter type-id='49e46a4d' name='id' filepath='drivers/i2c/i2c-core-base.c' line='86' column='1'/>
-        <parameter type-id='7ea54338' name='client' filepath='drivers/i2c/i2c-core-base.c' line='87' column='1'/>
+      <function-decl name='i2c_match_id' mangled-name='i2c_match_id' filepath='drivers/i2c/i2c-core-base.c' line='87' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='i2c_match_id'>
+        <parameter type-id='49e46a4d' name='id' filepath='drivers/i2c/i2c-core-base.c' line='87' column='1'/>
+        <parameter type-id='7ea54338' name='client' filepath='drivers/i2c/i2c-core-base.c' line='88' column='1'/>
         <return type-id='49e46a4d'/>
       </function-decl>
-      <function-decl name='i2c_new_dummy' mangled-name='i2c_new_dummy' filepath='drivers/i2c/i2c-core-base.c' line='882' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='i2c_new_dummy'>
-        <parameter type-id='b9af02c3' name='adapter' filepath='drivers/i2c/i2c-core-base.c' line='882' column='1'/>
-        <parameter type-id='1dc6a898' name='address' filepath='drivers/i2c/i2c-core-base.c' line='882' column='1'/>
+      <function-decl name='i2c_new_dummy' mangled-name='i2c_new_dummy' filepath='drivers/i2c/i2c-core-base.c' line='885' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='i2c_new_dummy'>
+        <parameter type-id='b9af02c3' name='adapter' filepath='drivers/i2c/i2c-core-base.c' line='885' column='1'/>
+        <parameter type-id='1dc6a898' name='address' filepath='drivers/i2c/i2c-core-base.c' line='885' column='1'/>
         <return type-id='3e31633b'/>
       </function-decl>
-      <function-decl name='i2c_get_dma_safe_msg_buf' mangled-name='i2c_get_dma_safe_msg_buf' filepath='drivers/i2c/i2c-core-base.c' line='2289' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='i2c_get_dma_safe_msg_buf'>
-        <parameter type-id='cd44bc95' name='msg' filepath='drivers/i2c/i2c-core-base.c' line='2289' column='1'/>
-        <parameter type-id='f0981eeb' name='threshold' filepath='drivers/i2c/i2c-core-base.c' line='2289' column='1'/>
+      <function-decl name='i2c_get_dma_safe_msg_buf' mangled-name='i2c_get_dma_safe_msg_buf' filepath='drivers/i2c/i2c-core-base.c' line='2292' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='i2c_get_dma_safe_msg_buf'>
+        <parameter type-id='cd44bc95' name='msg' filepath='drivers/i2c/i2c-core-base.c' line='2292' column='1'/>
+        <parameter type-id='f0981eeb' name='threshold' filepath='drivers/i2c/i2c-core-base.c' line='2292' column='1'/>
         <return type-id='8bff8096'/>
       </function-decl>
-      <function-decl name='i2c_put_dma_safe_msg_buf' mangled-name='i2c_put_dma_safe_msg_buf' filepath='drivers/i2c/i2c-core-base.c' line='2313' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='i2c_put_dma_safe_msg_buf'>
-        <parameter type-id='8bff8096' name='buf' filepath='drivers/i2c/i2c-core-base.c' line='2313' column='1'/>
-        <parameter type-id='cd44bc95' name='msg' filepath='drivers/i2c/i2c-core-base.c' line='2313' column='1'/>
-        <parameter type-id='b50a4934' name='xferred' filepath='drivers/i2c/i2c-core-base.c' line='2313' column='1'/>
+      <function-decl name='i2c_put_dma_safe_msg_buf' mangled-name='i2c_put_dma_safe_msg_buf' filepath='drivers/i2c/i2c-core-base.c' line='2316' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='i2c_put_dma_safe_msg_buf'>
+        <parameter type-id='8bff8096' name='buf' filepath='drivers/i2c/i2c-core-base.c' line='2316' column='1'/>
+        <parameter type-id='cd44bc95' name='msg' filepath='drivers/i2c/i2c-core-base.c' line='2316' column='1'/>
+        <parameter type-id='b50a4934' name='xferred' filepath='drivers/i2c/i2c-core-base.c' line='2316' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
       <pointer-type-def type-id='2174d0b5' size-in-bits='64' id='49e46a4d'/>
@@ -67911,28 +67843,6 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/input/evdev.c' language='LANG_C89'>
-      <union-decl name='__anonymous_union__6' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/sched.h' line='1296' column='1' id='8b4442cd'>
-        <data-member access='public'>
-          <var-decl name='frozen' type-id='f0981eeb' visibility='default' filepath='include/linux/sched.h' line='1296' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide46' type-id='156952c4' visibility='default' filepath='include/linux/sched.h' line='1296' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/sched.h' line='1296' column='1'/>
-        </data-member>
-      </union-decl>
-      <union-decl name='__anonymous_union__8' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/sched.h' line='1299' column='1' id='121e4767'>
-        <data-member access='public'>
-          <var-decl name='futex_state' type-id='f0981eeb' visibility='default' filepath='include/linux/sched.h' line='1299' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide47' type-id='6040de71' visibility='default' filepath='include/linux/sched.h' line='1299' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/sched.h' line='1299' column='1'/>
-        </data-member>
-      </union-decl>
       <pointer-type-def type-id='5bb9c75d' size-in-bits='64' id='dc750055'/>
       <function-decl name='cdev_init' mangled-name='cdev_init' filepath='include/linux/cdev.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cdev_init'>
         <parameter type-id='3e6eb939'/>
@@ -72874,18 +72784,18 @@
       <array-type-def dimensions='1' type-id='14582e4a' size-in-bits='12288' id='729537cc'>
         <subrange length='64' type-id='7ff19f0f' id='b10be967'/>
       </array-type-def>
-      <class-decl name='vb2_fileio_buf' size-in-bits='192' is-struct='yes' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2171' column='1' id='14582e4a'>
+      <class-decl name='vb2_fileio_buf' size-in-bits='192' is-struct='yes' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2182' column='1' id='14582e4a'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='vaddr' type-id='eaa32e2f' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2172' column='1'/>
+          <var-decl name='vaddr' type-id='eaa32e2f' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2183' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='size' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2173' column='1'/>
+          <var-decl name='size' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2184' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='pos' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2174' column='1'/>
+          <var-decl name='pos' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2185' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='queued' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2175' column='1'/>
+          <var-decl name='queued' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2186' column='1'/>
         </data-member>
       </class-decl>
       <typedef-decl name='vb2_thread_fnc' type-id='c4cd4be2' filepath='include/media/videobuf2-core.h' line='987' column='1' id='86e6f91d'/>
@@ -73124,50 +73034,50 @@
       </array-type-def>
       <pointer-type-def type-id='c1670ffd' size-in-bits='64' id='372af73d'/>
       <pointer-type-def type-id='cca707fb' size-in-bits='64' id='dc2d641b'/>
-      <class-decl name='vb2_fileio_data' size-in-bits='12608' is-struct='yes' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2202' column='1' id='c1670ffd'>
+      <class-decl name='vb2_fileio_data' size-in-bits='12608' is-struct='yes' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2213' column='1' id='c1670ffd'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='count' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2203' column='1'/>
+          <var-decl name='count' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2214' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='type' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2204' column='1'/>
+          <var-decl name='type' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2215' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='memory' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2205' column='1'/>
+          <var-decl name='memory' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2216' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='bufs' type-id='729537cc' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2206' column='1'/>
+          <var-decl name='bufs' type-id='729537cc' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2217' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='12416'>
-          <var-decl name='cur_index' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2207' column='1'/>
+          <var-decl name='cur_index' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2218' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='12448'>
-          <var-decl name='initial_index' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2208' column='1'/>
+          <var-decl name='initial_index' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2219' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='12480'>
-          <var-decl name='q_count' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2209' column='1'/>
+          <var-decl name='q_count' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2220' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='12512'>
-          <var-decl name='dq_count' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2210' column='1'/>
+          <var-decl name='dq_count' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2221' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='read_once' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2211' column='1'/>
+          <var-decl name='read_once' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2222' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1'>
-          <var-decl name='write_immediately' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2212' column='1'/>
+          <var-decl name='write_immediately' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2223' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='vb2_threadio_data' size-in-bits='256' is-struct='yes' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2538' column='1' id='cca707fb'>
+      <class-decl name='vb2_threadio_data' size-in-bits='256' is-struct='yes' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2549' column='1' id='cca707fb'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='thread' type-id='f23e2572' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2539' column='1'/>
+          <var-decl name='thread' type-id='f23e2572' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2550' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='fnc' type-id='86e6f91d' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2540' column='1'/>
+          <var-decl name='fnc' type-id='86e6f91d' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2551' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='priv' type-id='eaa32e2f' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2541' column='1'/>
+          <var-decl name='priv' type-id='eaa32e2f' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2552' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='stop' type-id='b50a4934' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2542' column='1'/>
+          <var-decl name='stop' type-id='b50a4934' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2553' column='1'/>
         </data-member>
       </class-decl>
       <qualified-type-def type-id='71d68b50' const='yes' id='4925ee5b'/>
@@ -78802,50 +78712,50 @@
       </array-type-def>
       <class-decl name='v4l2_ctrl_helper' is-struct='yes' visibility='default' is-declaration-only='yes' id='8a6e72bc'/>
       <class-decl name='v4l2_m2m_dev' is-struct='yes' visibility='default' is-declaration-only='yes' id='ba69e54c'/>
-      <class-decl name='vb2_fileio_data' size-in-bits='12608' is-struct='yes' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2202' column='1' id='c1670ffd'>
+      <class-decl name='vb2_fileio_data' size-in-bits='12608' is-struct='yes' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2213' column='1' id='c1670ffd'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='count' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2203' column='1'/>
+          <var-decl name='count' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2214' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='type' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2204' column='1'/>
+          <var-decl name='type' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2215' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='memory' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2205' column='1'/>
+          <var-decl name='memory' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2216' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='bufs' type-id='729537cc' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2206' column='1'/>
+          <var-decl name='bufs' type-id='729537cc' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2217' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='12416'>
-          <var-decl name='cur_index' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2207' column='1'/>
+          <var-decl name='cur_index' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2218' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='12448'>
-          <var-decl name='initial_index' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2208' column='1'/>
+          <var-decl name='initial_index' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2219' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='12480'>
-          <var-decl name='q_count' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2209' column='1'/>
+          <var-decl name='q_count' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2220' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='12512'>
-          <var-decl name='dq_count' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2210' column='1'/>
+          <var-decl name='dq_count' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2221' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='read_once' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2211' column='1'/>
+          <var-decl name='read_once' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2222' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1'>
-          <var-decl name='write_immediately' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2212' column='1'/>
+          <var-decl name='write_immediately' type-id='f0981eeb' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2223' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='vb2_threadio_data' size-in-bits='256' is-struct='yes' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2538' column='1' id='cca707fb'>
+      <class-decl name='vb2_threadio_data' size-in-bits='256' is-struct='yes' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2549' column='1' id='cca707fb'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='thread' type-id='f23e2572' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2539' column='1'/>
+          <var-decl name='thread' type-id='f23e2572' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2550' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='fnc' type-id='86e6f91d' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2540' column='1'/>
+          <var-decl name='fnc' type-id='86e6f91d' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2551' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='priv' type-id='eaa32e2f' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2541' column='1'/>
+          <var-decl name='priv' type-id='eaa32e2f' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2552' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='stop' type-id='b50a4934' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2542' column='1'/>
+          <var-decl name='stop' type-id='b50a4934' visibility='default' filepath='drivers/media/common/videobuf2/videobuf2-core.c' line='2553' column='1'/>
         </data-member>
       </class-decl>
       <array-type-def dimensions='1' type-id='fa0b179b' size-in-bits='512' id='f6e5abef'>
@@ -80038,7 +79948,7 @@
         <parameter type-id='68a2d05b'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='skb_tstamp_tx' mangled-name='skb_tstamp_tx' filepath='include/linux/skbuff.h' line='3627' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_tstamp_tx'>
+      <function-decl name='skb_tstamp_tx' mangled-name='skb_tstamp_tx' filepath='include/linux/skbuff.h' line='3636' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_tstamp_tx'>
         <parameter type-id='0fbf3cfd'/>
         <parameter type-id='68197365'/>
         <return type-id='48b5725f'/>
@@ -80290,7 +80200,7 @@
         <parameter type-id='141b6427'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='nf_conntrack_destroy' mangled-name='nf_conntrack_destroy' filepath='include/linux/skbuff.h' line='3885' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nf_conntrack_destroy'>
+      <function-decl name='nf_conntrack_destroy' mangled-name='nf_conntrack_destroy' filepath='include/linux/skbuff.h' line='3894' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='nf_conntrack_destroy'>
         <parameter type-id='96b07343'/>
         <return type-id='48b5725f'/>
       </function-decl>
@@ -80312,7 +80222,7 @@
         <parameter type-id='f772df6d'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='sock_queue_rcv_skb' mangled-name='sock_queue_rcv_skb' filepath='include/net/sock.h' line='2151' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_queue_rcv_skb'>
+      <function-decl name='sock_queue_rcv_skb' mangled-name='sock_queue_rcv_skb' filepath='include/net/sock.h' line='2155' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_queue_rcv_skb'>
         <parameter type-id='f772df6d'/>
         <parameter type-id='0fbf3cfd'/>
         <return type-id='95e97e5e'/>
@@ -80362,12 +80272,12 @@
         <parameter type-id='78e7cf52'/>
         <return type-id='c8f5869f'/>
       </function-decl>
-      <function-decl name='sk_setup_caps' mangled-name='sk_setup_caps' filepath='include/net/sock.h' line='1958' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sk_setup_caps'>
+      <function-decl name='sk_setup_caps' mangled-name='sk_setup_caps' filepath='include/net/sock.h' line='1959' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sk_setup_caps'>
         <parameter type-id='f772df6d'/>
         <parameter type-id='141b6427'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='skb_set_owner_w' mangled-name='skb_set_owner_w' filepath='include/net/sock.h' line='2122' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_set_owner_w'>
+      <function-decl name='skb_set_owner_w' mangled-name='skb_set_owner_w' filepath='include/net/sock.h' line='2126' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_set_owner_w'>
         <parameter type-id='0fbf3cfd'/>
         <parameter type-id='f772df6d'/>
         <return type-id='48b5725f'/>
@@ -80484,13 +80394,13 @@
     </abi-instr>
     <abi-instr address-size='64' path='drivers/net/tun.c' language='LANG_C89'>
       <pointer-type-def type-id='06c0432f' size-in-bits='64' id='a8d434b7'/>
-      <function-decl name='skb_page_frag_refill' mangled-name='skb_page_frag_refill' filepath='include/linux/skbuff.h' line='2902' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_page_frag_refill'>
+      <function-decl name='skb_page_frag_refill' mangled-name='skb_page_frag_refill' filepath='include/linux/skbuff.h' line='2911' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_page_frag_refill'>
         <parameter type-id='f0981eeb'/>
         <parameter type-id='a8d434b7'/>
         <parameter type-id='f0981eeb'/>
         <return type-id='c894953d'/>
       </function-decl>
-      <function-decl name='skb_partial_csum_set' mangled-name='skb_partial_csum_set' filepath='include/linux/skbuff.h' line='4195' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_partial_csum_set'>
+      <function-decl name='skb_partial_csum_set' mangled-name='skb_partial_csum_set' filepath='include/linux/skbuff.h' line='4204' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_partial_csum_set'>
         <parameter type-id='0fbf3cfd'/>
         <parameter type-id='8efea9e5'/>
         <parameter type-id='8efea9e5'/>
@@ -80578,7 +80488,7 @@
         <parameter type-id='35b28c4f'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='net_ratelimit' mangled-name='net_ratelimit' filepath='include/linux/net.h' line='246' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='net_ratelimit'>
+      <function-decl name='net_ratelimit' mangled-name='net_ratelimit' filepath='include/linux/net.h' line='252' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='net_ratelimit'>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-decl name='netdev_warn' mangled-name='netdev_warn' filepath='include/linux/netdevice.h' line='4695' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_warn'>
@@ -80646,32 +80556,6 @@
       <class-decl name='bpf_verifier_env' is-struct='yes' visibility='default' is-declaration-only='yes' id='ab1b35ba'/>
       <class-decl name='btf' is-struct='yes' visibility='default' is-declaration-only='yes' id='dccc7677'/>
       <class-decl name='btf_type' is-struct='yes' visibility='default' is-declaration-only='yes' id='5f6b1830'/>
-      <class-decl name='lwtunnel_state' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/net/lwtunnel.h' line='25' column='1' id='44644afc'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='type' type-id='d315442e' visibility='default' filepath='include/net/lwtunnel.h' line='26' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='16'>
-          <var-decl name='flags' type-id='d315442e' visibility='default' filepath='include/net/lwtunnel.h' line='27' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='headroom' type-id='d315442e' visibility='default' filepath='include/net/lwtunnel.h' line='28' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='refcnt' type-id='49178f86' visibility='default' filepath='include/net/lwtunnel.h' line='29' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='orig_output' type-id='0023218e' visibility='default' filepath='include/net/lwtunnel.h' line='30' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='orig_input' type-id='d2e00785' visibility='default' filepath='include/net/lwtunnel.h' line='31' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/net/lwtunnel.h' line='32' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='data' type-id='167619f6' visibility='default' filepath='include/net/lwtunnel.h' line='33' column='1'/>
-        </data-member>
-      </class-decl>
       <class-decl name='net_rate_estimator' is-struct='yes' visibility='default' is-declaration-only='yes' id='51dbeb7e'/>
       <class-decl name='prefix_info' is-struct='yes' visibility='default' is-declaration-only='yes' id='a7502152'/>
       <class-decl name='qdisc_walker' is-struct='yes' visibility='default' is-declaration-only='yes' id='7f36a7f0'/>
@@ -80720,12 +80604,12 @@
           <var-decl name='log' type-id='f0981eeb' visibility='default' filepath='include/net/udp.h' line='79' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='uncached_list' size-in-bits='192' is-struct='yes' visibility='default' filepath='net/ipv4/route.c' line='1496' column='1' id='6b1203e5'>
+      <class-decl name='uncached_list' size-in-bits='192' is-struct='yes' visibility='default' filepath='net/ipv4/route.c' line='1504' column='1' id='6b1203e5'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='net/ipv4/route.c' line='1497' column='1'/>
+          <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='net/ipv4/route.c' line='1505' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='head' type-id='72f469ec' visibility='default' filepath='net/ipv4/route.c' line='1498' column='1'/>
+          <var-decl name='head' type-id='72f469ec' visibility='default' filepath='net/ipv4/route.c' line='1506' column='1'/>
         </data-member>
       </class-decl>
       <array-type-def dimensions='1' type-id='4e812b7a' size-in-bits='16384' id='bb890663'>
@@ -82901,18 +82785,18 @@
           <var-decl name='sk_wq_raw' type-id='99f34ac1' visibility='default' filepath='include/net/sock.h' line='400' column='1'/>
         </data-member>
       </union-decl>
-      <class-decl name='socket_wq' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/net.h' line='93' column='1' id='8bd06fd9'>
+      <class-decl name='socket_wq' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/net.h' line='99' column='1' id='8bd06fd9'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='wait' type-id='b5ab048f' visibility='default' filepath='include/linux/net.h' line='95' column='1'/>
+          <var-decl name='wait' type-id='b5ab048f' visibility='default' filepath='include/linux/net.h' line='101' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='fasync_list' type-id='5bb9c75d' visibility='default' filepath='include/linux/net.h' line='96' column='1'/>
+          <var-decl name='fasync_list' type-id='5bb9c75d' visibility='default' filepath='include/linux/net.h' line='102' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='include/linux/net.h' line='97' column='1'/>
+          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='include/linux/net.h' line='103' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/linux/net.h' line='98' column='1'/>
+          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/linux/net.h' line='104' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='xfrm_policy' size-in-bits='6528' is-struct='yes' visibility='default' filepath='include/net/xfrm.h' line='573' column='1' id='ccf6c819'>
@@ -83008,6 +82892,32 @@
           <var-decl name='timeout' type-id='7359adad' visibility='default' filepath='include/net/xfrm.h' line='570' column='1'/>
         </data-member>
       </class-decl>
+      <class-decl name='lwtunnel_state' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/net/lwtunnel.h' line='25' column='1' id='44644afc'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='d315442e' visibility='default' filepath='include/net/lwtunnel.h' line='26' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='flags' type-id='d315442e' visibility='default' filepath='include/net/lwtunnel.h' line='27' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='headroom' type-id='d315442e' visibility='default' filepath='include/net/lwtunnel.h' line='28' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='refcnt' type-id='49178f86' visibility='default' filepath='include/net/lwtunnel.h' line='29' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='orig_output' type-id='0023218e' visibility='default' filepath='include/net/lwtunnel.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='orig_input' type-id='d2e00785' visibility='default' filepath='include/net/lwtunnel.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/net/lwtunnel.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='data' type-id='167619f6' visibility='default' filepath='include/net/lwtunnel.h' line='33' column='1'/>
+        </data-member>
+      </class-decl>
       <union-decl name='__anonymous_union__27' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='414' column='1' id='fc714247'>
         <data-member access='public'>
           <var-decl name='sk_send_head' type-id='0fbf3cfd' visibility='default' filepath='include/net/sock.h' line='415' column='1'/>
@@ -83016,27 +82926,27 @@
           <var-decl name='tcp_rtx_queue' type-id='dec44472' visibility='default' filepath='include/net/sock.h' line='416' column='1'/>
         </data-member>
       </union-decl>
-      <class-decl name='socket' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/net.h' line='111' column='1' id='ee14fd94'>
+      <class-decl name='socket' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/net.h' line='117' column='1' id='ee14fd94'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='state' type-id='ee2ecafb' visibility='default' filepath='include/linux/net.h' line='112' column='1'/>
+          <var-decl name='state' type-id='ee2ecafb' visibility='default' filepath='include/linux/net.h' line='118' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='type' type-id='a2185560' visibility='default' filepath='include/linux/net.h' line='114' column='1'/>
+          <var-decl name='type' type-id='a2185560' visibility='default' filepath='include/linux/net.h' line='120' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='include/linux/net.h' line='116' column='1'/>
+          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='include/linux/net.h' line='122' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='wq' type-id='99f34ac1' visibility='default' filepath='include/linux/net.h' line='118' column='1'/>
+          <var-decl name='wq' type-id='99f34ac1' visibility='default' filepath='include/linux/net.h' line='124' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='file' type-id='77e79a4b' visibility='default' filepath='include/linux/net.h' line='120' column='1'/>
+          <var-decl name='file' type-id='77e79a4b' visibility='default' filepath='include/linux/net.h' line='126' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='sk' type-id='f772df6d' visibility='default' filepath='include/linux/net.h' line='121' column='1'/>
+          <var-decl name='sk' type-id='f772df6d' visibility='default' filepath='include/linux/net.h' line='127' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='ops' type-id='38a81521' visibility='default' filepath='include/linux/net.h' line='122' column='1'/>
+          <var-decl name='ops' type-id='38a81521' visibility='default' filepath='include/linux/net.h' line='128' column='1'/>
         </data-member>
       </class-decl>
       <typedef-decl name='socket_state' type-id='08f5ca17' filepath='include/uapi/linux/net.h' line='54' column='1' id='ee2ecafb'/>
@@ -83048,102 +82958,102 @@
         <enumerator name='SS_CONNECTED' value='3'/>
         <enumerator name='SS_DISCONNECTING' value='4'/>
       </enum-decl>
-      <class-decl name='proto_ops' size-in-bits='2048' is-struct='yes' visibility='default' filepath='include/linux/net.h' line='134' column='1' id='4e0399c2'>
+      <class-decl name='proto_ops' size-in-bits='2048' is-struct='yes' visibility='default' filepath='include/linux/net.h' line='140' column='1' id='4e0399c2'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='family' type-id='95e97e5e' visibility='default' filepath='include/linux/net.h' line='135' column='1'/>
+          <var-decl name='family' type-id='95e97e5e' visibility='default' filepath='include/linux/net.h' line='141' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='owner' type-id='2730d015' visibility='default' filepath='include/linux/net.h' line='136' column='1'/>
+          <var-decl name='owner' type-id='2730d015' visibility='default' filepath='include/linux/net.h' line='142' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='release' type-id='27936440' visibility='default' filepath='include/linux/net.h' line='137' column='1'/>
+          <var-decl name='release' type-id='27936440' visibility='default' filepath='include/linux/net.h' line='143' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='bind' type-id='c9664af8' visibility='default' filepath='include/linux/net.h' line='138' column='1'/>
+          <var-decl name='bind' type-id='c9664af8' visibility='default' filepath='include/linux/net.h' line='144' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='connect' type-id='be6c7be7' visibility='default' filepath='include/linux/net.h' line='141' column='1'/>
+          <var-decl name='connect' type-id='be6c7be7' visibility='default' filepath='include/linux/net.h' line='147' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='socketpair' type-id='be3a232b' visibility='default' filepath='include/linux/net.h' line='144' column='1'/>
+          <var-decl name='socketpair' type-id='be3a232b' visibility='default' filepath='include/linux/net.h' line='150' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='accept' type-id='2136470b' visibility='default' filepath='include/linux/net.h' line='146' column='1'/>
+          <var-decl name='accept' type-id='2136470b' visibility='default' filepath='include/linux/net.h' line='152' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='getname' type-id='c9664af8' visibility='default' filepath='include/linux/net.h' line='148' column='1'/>
+          <var-decl name='getname' type-id='c9664af8' visibility='default' filepath='include/linux/net.h' line='154' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='poll' type-id='e93ad56e' visibility='default' filepath='include/linux/net.h' line='151' column='1'/>
+          <var-decl name='poll' type-id='e93ad56e' visibility='default' filepath='include/linux/net.h' line='157' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='ioctl' type-id='82a9a11e' visibility='default' filepath='include/linux/net.h' line='153' column='1'/>
+          <var-decl name='ioctl' type-id='82a9a11e' visibility='default' filepath='include/linux/net.h' line='159' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='640'>
-          <var-decl name='compat_ioctl' type-id='82a9a11e' visibility='default' filepath='include/linux/net.h' line='156' column='1'/>
+          <var-decl name='compat_ioctl' type-id='82a9a11e' visibility='default' filepath='include/linux/net.h' line='162' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='listen' type-id='6dfd92af' visibility='default' filepath='include/linux/net.h' line='159' column='1'/>
+          <var-decl name='listen' type-id='6dfd92af' visibility='default' filepath='include/linux/net.h' line='165' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='768'>
-          <var-decl name='shutdown' type-id='6dfd92af' visibility='default' filepath='include/linux/net.h' line='160' column='1'/>
+          <var-decl name='shutdown' type-id='6dfd92af' visibility='default' filepath='include/linux/net.h' line='166' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='setsockopt' type-id='82ffa5a0' visibility='default' filepath='include/linux/net.h' line='161' column='1'/>
+          <var-decl name='setsockopt' type-id='82ffa5a0' visibility='default' filepath='include/linux/net.h' line='167' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='896'>
-          <var-decl name='getsockopt' type-id='a9c0cdab' visibility='default' filepath='include/linux/net.h' line='163' column='1'/>
+          <var-decl name='getsockopt' type-id='a9c0cdab' visibility='default' filepath='include/linux/net.h' line='169' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='960'>
-          <var-decl name='compat_setsockopt' type-id='82ffa5a0' visibility='default' filepath='include/linux/net.h' line='166' column='1'/>
+          <var-decl name='compat_setsockopt' type-id='82ffa5a0' visibility='default' filepath='include/linux/net.h' line='172' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='compat_getsockopt' type-id='a9c0cdab' visibility='default' filepath='include/linux/net.h' line='168' column='1'/>
+          <var-decl name='compat_getsockopt' type-id='a9c0cdab' visibility='default' filepath='include/linux/net.h' line='174' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1088'>
-          <var-decl name='sendmsg' type-id='f38728c0' visibility='default' filepath='include/linux/net.h' line='171' column='1'/>
+          <var-decl name='sendmsg' type-id='f38728c0' visibility='default' filepath='include/linux/net.h' line='177' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1152'>
-          <var-decl name='recvmsg' type-id='93abc02f' visibility='default' filepath='include/linux/net.h' line='181' column='1'/>
+          <var-decl name='recvmsg' type-id='93abc02f' visibility='default' filepath='include/linux/net.h' line='187' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1216'>
-          <var-decl name='mmap' type-id='3eef3bc7' visibility='default' filepath='include/linux/net.h' line='183' column='1'/>
+          <var-decl name='mmap' type-id='3eef3bc7' visibility='default' filepath='include/linux/net.h' line='189' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1280'>
-          <var-decl name='sendpage' type-id='42b02383' visibility='default' filepath='include/linux/net.h' line='185' column='1'/>
+          <var-decl name='sendpage' type-id='42b02383' visibility='default' filepath='include/linux/net.h' line='191' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1344'>
-          <var-decl name='splice_read' type-id='21641a6b' visibility='default' filepath='include/linux/net.h' line='187' column='1'/>
+          <var-decl name='splice_read' type-id='21641a6b' visibility='default' filepath='include/linux/net.h' line='193' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1408'>
-          <var-decl name='set_peek_off' type-id='95208a5e' visibility='default' filepath='include/linux/net.h' line='189' column='1'/>
+          <var-decl name='set_peek_off' type-id='95208a5e' visibility='default' filepath='include/linux/net.h' line='195' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1472'>
-          <var-decl name='peek_len' type-id='27936440' visibility='default' filepath='include/linux/net.h' line='190' column='1'/>
+          <var-decl name='peek_len' type-id='27936440' visibility='default' filepath='include/linux/net.h' line='196' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1536'>
-          <var-decl name='read_sock' type-id='8755cc63' visibility='default' filepath='include/linux/net.h' line='195' column='1'/>
+          <var-decl name='read_sock' type-id='8755cc63' visibility='default' filepath='include/linux/net.h' line='201' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1600'>
-          <var-decl name='sendpage_locked' type-id='65399e23' visibility='default' filepath='include/linux/net.h' line='197' column='1'/>
+          <var-decl name='sendpage_locked' type-id='65399e23' visibility='default' filepath='include/linux/net.h' line='203' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1664'>
-          <var-decl name='sendmsg_locked' type-id='1df08751' visibility='default' filepath='include/linux/net.h' line='199' column='1'/>
+          <var-decl name='sendmsg_locked' type-id='1df08751' visibility='default' filepath='include/linux/net.h' line='205' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1728'>
-          <var-decl name='set_rcvlowat' type-id='95208a5e' visibility='default' filepath='include/linux/net.h' line='201' column='1'/>
+          <var-decl name='set_rcvlowat' type-id='95208a5e' visibility='default' filepath='include/linux/net.h' line='207' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1792'>
-          <var-decl name='android_kabi_reserved1' type-id='91ce1af9' visibility='default' filepath='include/linux/net.h' line='203' column='1'/>
+          <var-decl name='android_kabi_reserved1' type-id='91ce1af9' visibility='default' filepath='include/linux/net.h' line='209' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1856'>
-          <var-decl name='android_kabi_reserved2' type-id='91ce1af9' visibility='default' filepath='include/linux/net.h' line='204' column='1'/>
+          <var-decl name='android_kabi_reserved2' type-id='91ce1af9' visibility='default' filepath='include/linux/net.h' line='210' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1920'>
-          <var-decl name='android_kabi_reserved3' type-id='91ce1af9' visibility='default' filepath='include/linux/net.h' line='205' column='1'/>
+          <var-decl name='android_kabi_reserved3' type-id='91ce1af9' visibility='default' filepath='include/linux/net.h' line='211' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1984'>
-          <var-decl name='android_kabi_reserved4' type-id='91ce1af9' visibility='default' filepath='include/linux/net.h' line='206' column='1'/>
+          <var-decl name='android_kabi_reserved4' type-id='91ce1af9' visibility='default' filepath='include/linux/net.h' line='212' column='1'/>
         </data-member>
       </class-decl>
       <typedef-decl name='read_descriptor_t' type-id='bad61846' filepath='include/linux/fs.h' line='349' column='1' id='2d58d013'/>
@@ -83169,46 +83079,46 @@
           <var-decl name='data' type-id='eaa32e2f' visibility='default' filepath='include/linux/fs.h' line='346' column='1'/>
         </data-member>
       </union-decl>
-      <typedef-decl name='sk_read_actor_t' type-id='0c197ddf' filepath='include/linux/net.h' line='131' column='1' id='514d4e0e'/>
-      <class-decl name='sock_cgroup_data' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='794' column='1' id='8544f103'>
+      <typedef-decl name='sk_read_actor_t' type-id='0c197ddf' filepath='include/linux/net.h' line='137' column='1' id='514d4e0e'/>
+      <class-decl name='sock_cgroup_data' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='795' column='1' id='8544f103'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='' type-id='de05b94c' visibility='default' filepath='include/linux/cgroup-defs.h' line='795' column='1'/>
+          <var-decl name='' type-id='de05b94c' visibility='default' filepath='include/linux/cgroup-defs.h' line='796' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__30' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='795' column='1' id='de05b94c'>
+      <union-decl name='__anonymous_union__30' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='796' column='1' id='de05b94c'>
         <data-member access='public'>
-          <var-decl name='' type-id='16b0d6e5' visibility='default' filepath='include/linux/cgroup-defs.h' line='797' column='1'/>
+          <var-decl name='' type-id='16b0d6e5' visibility='default' filepath='include/linux/cgroup-defs.h' line='798' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='val' type-id='91ce1af9' visibility='default' filepath='include/linux/cgroup-defs.h' line='819' column='1'/>
+          <var-decl name='val' type-id='91ce1af9' visibility='default' filepath='include/linux/cgroup-defs.h' line='820' column='1'/>
         </data-member>
       </union-decl>
-      <class-decl name='__anonymous_struct__26' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='797' column='1' id='16b0d6e5'>
+      <class-decl name='__anonymous_struct__26' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='798' column='1' id='16b0d6e5'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='is_data' type-id='f9b06939' visibility='default' filepath='include/linux/cgroup-defs.h' line='801' column='1'/>
+          <var-decl name='is_data' type-id='f9b06939' visibility='default' filepath='include/linux/cgroup-defs.h' line='802' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1'>
-          <var-decl name='no_refcnt' type-id='f9b06939' visibility='default' filepath='include/linux/cgroup-defs.h' line='802' column='1'/>
+          <var-decl name='no_refcnt' type-id='f9b06939' visibility='default' filepath='include/linux/cgroup-defs.h' line='803' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2'>
-          <var-decl name='unused' type-id='f9b06939' visibility='default' filepath='include/linux/cgroup-defs.h' line='803' column='1'/>
+          <var-decl name='unused' type-id='f9b06939' visibility='default' filepath='include/linux/cgroup-defs.h' line='804' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='8'>
-          <var-decl name='padding' type-id='f9b06939' visibility='default' filepath='include/linux/cgroup-defs.h' line='805' column='1'/>
+          <var-decl name='padding' type-id='f9b06939' visibility='default' filepath='include/linux/cgroup-defs.h' line='806' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='16'>
-          <var-decl name='prioidx' type-id='1dc6a898' visibility='default' filepath='include/linux/cgroup-defs.h' line='806' column='1'/>
+          <var-decl name='prioidx' type-id='1dc6a898' visibility='default' filepath='include/linux/cgroup-defs.h' line='807' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='classid' type-id='19c2251e' visibility='default' filepath='include/linux/cgroup-defs.h' line='807' column='1'/>
+          <var-decl name='classid' type-id='19c2251e' visibility='default' filepath='include/linux/cgroup-defs.h' line='808' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__31' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/ip.h' line='123' column='1' id='4fa91678'>
+      <union-decl name='__anonymous_union__31' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/ip.h' line='126' column='1' id='4fa91678'>
         <data-member access='public'>
-          <var-decl name='destructor' type-id='841969d0' visibility='default' filepath='include/net/ip.h' line='124' column='1'/>
+          <var-decl name='destructor' type-id='841969d0' visibility='default' filepath='include/net/ip.h' line='127' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='saved_sk' type-id='f772df6d' visibility='default' filepath='include/net/ip.h' line='125' column='1'/>
+          <var-decl name='saved_sk' type-id='f772df6d' visibility='default' filepath='include/net/ip.h' line='128' column='1'/>
         </data-member>
       </union-decl>
       <class-decl name='fib_rule' size-in-bits='1216' is-struct='yes' visibility='default' filepath='include/net/fib_rules.h' line='19' column='1' id='94b5478d'>
@@ -84567,7 +84477,7 @@
         <parameter type-id='f0981eeb'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='skb_copy_bits' mangled-name='skb_copy_bits' filepath='include/linux/skbuff.h' line='3353' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_copy_bits'>
+      <function-decl name='skb_copy_bits' mangled-name='skb_copy_bits' filepath='include/linux/skbuff.h' line='3362' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_copy_bits'>
         <parameter type-id='11f4a000'/>
         <parameter type-id='95e97e5e'/>
         <parameter type-id='eaa32e2f'/>
@@ -85649,6 +85559,15 @@
       </function-type>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/nvdimm/pmem.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='28ee064c' size-in-bits='320' id='39e531ac'>
+        <subrange length='5' type-id='7ff19f0f' id='53010e10'/>
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='0f8f80b0' size-in-bits='320' id='39e1fe03'>
+        <subrange length='5' type-id='7ff19f0f' id='53010e10'/>
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='3213e875' size-in-bits='320' id='f5665670'>
+        <subrange length='5' type-id='7ff19f0f' id='53010e10'/>
+      </array-type-def>
       <array-type-def dimensions='1' type-id='162c1c01' size-in-bits='256' id='68694f49'>
         <subrange length='4' type-id='7ff19f0f' id='16fe7105'/>
       </array-type-def>
@@ -85678,6 +85597,9 @@
           <var-decl name='page_list' type-id='72f469ec' visibility='default' filepath='block/blk-mq-tag.h' line='21' column='1'/>
         </data-member>
       </class-decl>
+      <array-type-def dimensions='1' type-id='b92c8d0d' size-in-bits='1600' id='68a92070'>
+        <subrange length='5' type-id='7ff19f0f' id='53010e10'/>
+      </array-type-def>
       <array-type-def dimensions='1' type-id='8dee6d89' size-in-bits='192' id='2f7565c6'>
         <subrange length='3' type-id='7ff19f0f' id='56f209d2'/>
       </array-type-def>
@@ -85693,6 +85615,59 @@
       <array-type-def dimensions='1' type-id='7359adad' size-in-bits='448' id='346bc576'>
         <subrange length='7' type-id='7ff19f0f' id='16fc326e'/>
       </array-type-def>
+      <class-decl name='blkcg' size-in-bits='3136' is-struct='yes' visibility='default' filepath='include/linux/blk-cgroup.h' line='46' column='1' id='19b26952'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='css' type-id='7f3df443' visibility='default' filepath='include/linux/blk-cgroup.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2176'>
+          <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='include/linux/blk-cgroup.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2240'>
+          <var-decl name='blkg_tree' type-id='1c8dedcf' visibility='default' filepath='include/linux/blk-cgroup.h' line='50' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2368'>
+          <var-decl name='blkg_hint' type-id='1146dea3' visibility='default' filepath='include/linux/blk-cgroup.h' line='51' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2432'>
+          <var-decl name='blkg_list' type-id='e151255a' visibility='default' filepath='include/linux/blk-cgroup.h' line='52' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2496'>
+          <var-decl name='cpd' type-id='39e1fe03' visibility='default' filepath='include/linux/blk-cgroup.h' line='54' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2816'>
+          <var-decl name='all_blkcgs_node' type-id='72f469ec' visibility='default' filepath='include/linux/blk-cgroup.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2944'>
+          <var-decl name='cgwb_list' type-id='72f469ec' visibility='default' filepath='include/linux/blk-cgroup.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='cgwb_refcnt' type-id='64615833' visibility='default' filepath='include/linux/blk-cgroup.h' line='59' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='blkcg_policy_data' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/blk-cgroup.h' line='102' column='1' id='11fd1392'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='blkcg' type-id='11bff950' visibility='default' filepath='include/linux/blk-cgroup.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='plid' type-id='95e97e5e' visibility='default' filepath='include/linux/blk-cgroup.h' line='105' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='blkg_rwstat' size-in-bits='1920' is-struct='yes' visibility='default' filepath='include/linux/blk-cgroup.h' line='73' column='1' id='247d0323'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cpu_cnt' type-id='68a92070' visibility='default' filepath='include/linux/blk-cgroup.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1600'>
+          <var-decl name='aux_cnt' type-id='39e531ac' visibility='default' filepath='include/linux/blk-cgroup.h' line='75' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='blkg_policy_data' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/blk-cgroup.h' line='89' column='1' id='55eaf925'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='blkg' type-id='1146dea3' visibility='default' filepath='include/linux/blk-cgroup.h' line='91' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='plid' type-id='95e97e5e' visibility='default' filepath='include/linux/blk-cgroup.h' line='92' column='1'/>
+        </data-member>
+      </class-decl>
       <typedef-decl name='queue_rq_fn' type-id='32672900' filepath='include/linux/blk-mq.h' line='100' column='1' id='aa8737f6'/>
       <class-decl name='__anonymous_struct__' size-in-bits='512' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/blk-mq.h' line='16' column='1' id='87322991'>
         <data-member access='public' layout-offset-in-bits='0'>
@@ -85880,6 +85855,9 @@
       <pointer-type-def type-id='9a335021' size-in-bits='64' id='c9c70151'/>
       <pointer-type-def type-id='8efd3865' size-in-bits='64' id='0461ecf5'/>
       <pointer-type-def type-id='0461ecf5' size-in-bits='64' id='c527e30d'/>
+      <pointer-type-def type-id='19b26952' size-in-bits='64' id='11bff950'/>
+      <pointer-type-def type-id='11fd1392' size-in-bits='64' id='0f8f80b0'/>
+      <pointer-type-def type-id='55eaf925' size-in-bits='64' id='3213e875'/>
       <pointer-type-def type-id='69c138b1' size-in-bits='64' id='162c1c01'/>
       <pointer-type-def type-id='3577ed21' size-in-bits='64' id='ac8cd584'/>
       <qualified-type-def type-id='03a1b8ac' const='yes' id='a2b0f227'/>
@@ -86898,8 +86876,8 @@
       </function-type>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/pci/pci.c' language='LANG_C89'>
-      <function-decl name='pci_disable_device' mangled-name='pci_disable_device' filepath='drivers/pci/pci.c' line='1842' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_disable_device'>
-        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='1842' column='1'/>
+      <function-decl name='pci_disable_device' mangled-name='pci_disable_device' filepath='drivers/pci/pci.c' line='1852' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_disable_device'>
+        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='1852' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
       <function-decl name='pci_find_next_capability' mangled-name='pci_find_next_capability' filepath='drivers/pci/pci.c' line='393' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_find_next_capability'>
@@ -86908,12 +86886,12 @@
         <parameter type-id='95e97e5e' name='cap' filepath='drivers/pci/pci.c' line='393' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='pci_enable_device' mangled-name='pci_enable_device' filepath='drivers/pci/pci.c' line='1650' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_enable_device'>
-        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='1650' column='1'/>
+      <function-decl name='pci_enable_device' mangled-name='pci_enable_device' filepath='drivers/pci/pci.c' line='1660' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_enable_device'>
+        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='1660' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='pcim_enable_device' mangled-name='pcim_enable_device' filepath='drivers/pci/pci.c' line='1723' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pcim_enable_device'>
-        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='1723' column='1'/>
+      <function-decl name='pcim_enable_device' mangled-name='pcim_enable_device' filepath='drivers/pci/pci.c' line='1733' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pcim_enable_device'>
+        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='1733' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-decl name='pm_runtime_barrier' mangled-name='pm_runtime_barrier' filepath='include/linux/pm_runtime.h' line='45' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_runtime_barrier'>
@@ -86925,36 +86903,36 @@
         <parameter type-id='c894953d'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='pci_request_acs' mangled-name='pci_request_acs' filepath='drivers/pci/pci.c' line='3050' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_acs'>
+      <function-decl name='pci_request_acs' mangled-name='pci_request_acs' filepath='drivers/pci/pci.c' line='3060' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_acs'>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='pci_request_region' mangled-name='pci_request_region' filepath='drivers/pci/pci.c' line='3638' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_region'>
-        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3638' column='1'/>
-        <parameter type-id='95e97e5e' name='bar' filepath='drivers/pci/pci.c' line='3638' column='1'/>
-        <parameter type-id='80f4b756' name='res_name' filepath='drivers/pci/pci.c' line='3638' column='1'/>
+      <function-decl name='pci_request_region' mangled-name='pci_request_region' filepath='drivers/pci/pci.c' line='3648' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_region'>
+        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3648' column='1'/>
+        <parameter type-id='95e97e5e' name='bar' filepath='drivers/pci/pci.c' line='3648' column='1'/>
+        <parameter type-id='80f4b756' name='res_name' filepath='drivers/pci/pci.c' line='3648' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='pci_request_selected_regions' mangled-name='pci_request_selected_regions' filepath='drivers/pci/pci.c' line='3713' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_selected_regions'>
-        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3713' column='1'/>
-        <parameter type-id='95e97e5e' name='bars' filepath='drivers/pci/pci.c' line='3713' column='1'/>
-        <parameter type-id='80f4b756' name='res_name' filepath='drivers/pci/pci.c' line='3714' column='1'/>
+      <function-decl name='pci_request_selected_regions' mangled-name='pci_request_selected_regions' filepath='drivers/pci/pci.c' line='3723' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_selected_regions'>
+        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3723' column='1'/>
+        <parameter type-id='95e97e5e' name='bars' filepath='drivers/pci/pci.c' line='3723' column='1'/>
+        <parameter type-id='80f4b756' name='res_name' filepath='drivers/pci/pci.c' line='3724' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='pci_release_regions' mangled-name='pci_release_regions' filepath='drivers/pci/pci.c' line='3737' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_release_regions'>
-        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3737' column='1'/>
+      <function-decl name='pci_release_regions' mangled-name='pci_release_regions' filepath='drivers/pci/pci.c' line='3747' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_release_regions'>
+        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3747' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='pci_request_regions' mangled-name='pci_request_regions' filepath='drivers/pci/pci.c' line='3756' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_regions'>
-        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3756' column='1'/>
-        <parameter type-id='80f4b756' name='res_name' filepath='drivers/pci/pci.c' line='3756' column='1'/>
+      <function-decl name='pci_request_regions' mangled-name='pci_request_regions' filepath='drivers/pci/pci.c' line='3766' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_regions'>
+        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3766' column='1'/>
+        <parameter type-id='80f4b756' name='res_name' filepath='drivers/pci/pci.c' line='3766' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='pci_set_master' mangled-name='pci_set_master' filepath='drivers/pci/pci.c' line='4079' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_set_master'>
-        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='4079' column='1'/>
+      <function-decl name='pci_set_master' mangled-name='pci_set_master' filepath='drivers/pci/pci.c' line='4089' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_set_master'>
+        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='4089' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='pci_clear_master' mangled-name='pci_clear_master' filepath='drivers/pci/pci.c' line='4090' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_clear_master'>
-        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='4090' column='1'/>
+      <function-decl name='pci_clear_master' mangled-name='pci_clear_master' filepath='drivers/pci/pci.c' line='4100' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_clear_master'>
+        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='4100' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
     </abi-instr>
@@ -87572,7 +87550,7 @@
         <enumerator name='PIN_MAP_TYPE_CONFIGS_PIN' value='3'/>
         <enumerator name='PIN_MAP_TYPE_CONFIGS_GROUP' value='4'/>
       </enum-decl>
-      <union-decl name='__anonymous_union__1' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/pinctrl/machine.h' line='73' column='1' id='2789d524'>
+      <union-decl name='__anonymous_union__' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/pinctrl/machine.h' line='73' column='1' id='2789d524'>
         <data-member access='public'>
           <var-decl name='mux' type-id='ad4dd73d' visibility='default' filepath='include/linux/pinctrl/machine.h' line='74' column='1'/>
         </data-member>
@@ -89421,28 +89399,28 @@
         <parameter type-id='9f9b8114' name='rstc' filepath='drivers/reset/core.c' line='253' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='reset_control_put' mangled-name='reset_control_put' filepath='drivers/reset/core.c' line='617' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='reset_control_put'>
-        <parameter type-id='9f9b8114' name='rstc' filepath='drivers/reset/core.c' line='617' column='1'/>
+      <function-decl name='reset_control_put' mangled-name='reset_control_put' filepath='drivers/reset/core.c' line='620' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='reset_control_put'>
+        <parameter type-id='9f9b8114' name='rstc' filepath='drivers/reset/core.c' line='620' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='__devm_reset_control_get' mangled-name='__devm_reset_control_get' filepath='drivers/reset/core.c' line='638' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__devm_reset_control_get'>
-        <parameter type-id='fa0b179b' name='dev' filepath='drivers/reset/core.c' line='638' column='1'/>
-        <parameter type-id='80f4b756' name='id' filepath='drivers/reset/core.c' line='639' column='1'/>
-        <parameter type-id='95e97e5e' name='index' filepath='drivers/reset/core.c' line='639' column='1'/>
-        <parameter type-id='b50a4934' name='shared' filepath='drivers/reset/core.c' line='639' column='1'/>
-        <parameter type-id='b50a4934' name='optional' filepath='drivers/reset/core.c' line='640' column='1'/>
+      <function-decl name='__devm_reset_control_get' mangled-name='__devm_reset_control_get' filepath='drivers/reset/core.c' line='641' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__devm_reset_control_get'>
+        <parameter type-id='fa0b179b' name='dev' filepath='drivers/reset/core.c' line='641' column='1'/>
+        <parameter type-id='80f4b756' name='id' filepath='drivers/reset/core.c' line='642' column='1'/>
+        <parameter type-id='95e97e5e' name='index' filepath='drivers/reset/core.c' line='642' column='1'/>
+        <parameter type-id='b50a4934' name='shared' filepath='drivers/reset/core.c' line='642' column='1'/>
+        <parameter type-id='b50a4934' name='optional' filepath='drivers/reset/core.c' line='643' column='1'/>
         <return type-id='9f9b8114'/>
       </function-decl>
-      <function-decl name='of_reset_control_array_get' mangled-name='of_reset_control_array_get' filepath='drivers/reset/core.c' line='725' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_reset_control_array_get'>
-        <parameter type-id='9a537bbe' name='np' filepath='drivers/reset/core.c' line='725' column='1'/>
-        <parameter type-id='b50a4934' name='shared' filepath='drivers/reset/core.c' line='725' column='1'/>
-        <parameter type-id='b50a4934' name='optional' filepath='drivers/reset/core.c' line='725' column='1'/>
+      <function-decl name='of_reset_control_array_get' mangled-name='of_reset_control_array_get' filepath='drivers/reset/core.c' line='728' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='of_reset_control_array_get'>
+        <parameter type-id='9a537bbe' name='np' filepath='drivers/reset/core.c' line='728' column='1'/>
+        <parameter type-id='b50a4934' name='shared' filepath='drivers/reset/core.c' line='728' column='1'/>
+        <parameter type-id='b50a4934' name='optional' filepath='drivers/reset/core.c' line='728' column='1'/>
         <return type-id='9f9b8114'/>
       </function-decl>
-      <function-decl name='devm_reset_control_array_get' mangled-name='devm_reset_control_array_get' filepath='drivers/reset/core.c' line='777' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='devm_reset_control_array_get'>
-        <parameter type-id='fa0b179b' name='dev' filepath='drivers/reset/core.c' line='777' column='1'/>
-        <parameter type-id='b50a4934' name='shared' filepath='drivers/reset/core.c' line='777' column='1'/>
-        <parameter type-id='b50a4934' name='optional' filepath='drivers/reset/core.c' line='777' column='1'/>
+      <function-decl name='devm_reset_control_array_get' mangled-name='devm_reset_control_array_get' filepath='drivers/reset/core.c' line='780' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='devm_reset_control_array_get'>
+        <parameter type-id='fa0b179b' name='dev' filepath='drivers/reset/core.c' line='780' column='1'/>
+        <parameter type-id='b50a4934' name='shared' filepath='drivers/reset/core.c' line='780' column='1'/>
+        <parameter type-id='b50a4934' name='optional' filepath='drivers/reset/core.c' line='780' column='1'/>
         <return type-id='9f9b8114'/>
       </function-decl>
       <function-type size-in-bits='64' id='137e352e'>
@@ -90154,9 +90132,9 @@
       <pointer-type-def type-id='52bea74f' size-in-bits='64' id='3257bfe7'/>
       <pointer-type-def type-id='6831a786' size-in-bits='64' id='3b3fe200'/>
       <pointer-type-def type-id='1120d7bb' size-in-bits='64' id='341171ef'/>
-      <function-decl name='scsi_host_alloc' mangled-name='scsi_host_alloc' filepath='drivers/scsi/hosts.c' line='386' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='scsi_host_alloc'>
-        <parameter type-id='36265581' name='sht' filepath='drivers/scsi/hosts.c' line='386' column='1'/>
-        <parameter type-id='95e97e5e' name='privsize' filepath='drivers/scsi/hosts.c' line='386' column='1'/>
+      <function-decl name='scsi_host_alloc' mangled-name='scsi_host_alloc' filepath='drivers/scsi/hosts.c' line='389' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='scsi_host_alloc'>
+        <parameter type-id='36265581' name='sht' filepath='drivers/scsi/hosts.c' line='389' column='1'/>
+        <parameter type-id='95e97e5e' name='privsize' filepath='drivers/scsi/hosts.c' line='389' column='1'/>
         <return type-id='a970a64c'/>
       </function-decl>
       <function-decl name='scsi_remove_host' mangled-name='scsi_remove_host' filepath='drivers/scsi/hosts.c' line='162' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='scsi_remove_host'>
@@ -90169,8 +90147,8 @@
         <parameter type-id='fa0b179b' name='dma_dev' filepath='drivers/scsi/hosts.c' line='207' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='scsi_host_put' mangled-name='scsi_host_put' filepath='drivers/scsi/hosts.c' line='587' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='scsi_host_put'>
-        <parameter type-id='a970a64c' name='shost' filepath='drivers/scsi/hosts.c' line='587' column='1'/>
+      <function-decl name='scsi_host_put' mangled-name='scsi_host_put' filepath='drivers/scsi/hosts.c' line='591' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='scsi_host_put'>
+        <parameter type-id='a970a64c' name='shost' filepath='drivers/scsi/hosts.c' line='591' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
       <pointer-type-def type-id='83cec606' size-in-bits='64' id='a970a64c'/>
@@ -91138,17 +91116,17 @@
         <parameter type-id='0b8718c0'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='scsi_block_requests' mangled-name='scsi_block_requests' filepath='drivers/scsi/scsi_lib.c' line='2442' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='scsi_block_requests'>
-        <parameter type-id='a970a64c' name='shost' filepath='drivers/scsi/scsi_lib.c' line='2442' column='1'/>
+      <function-decl name='scsi_block_requests' mangled-name='scsi_block_requests' filepath='drivers/scsi/scsi_lib.c' line='2443' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='scsi_block_requests'>
+        <parameter type-id='a970a64c' name='shost' filepath='drivers/scsi/scsi_lib.c' line='2443' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='scsi_unblock_requests' mangled-name='scsi_unblock_requests' filepath='drivers/scsi/scsi_lib.c' line='2468' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='scsi_unblock_requests'>
-        <parameter type-id='a970a64c' name='shost' filepath='drivers/scsi/scsi_lib.c' line='2468' column='1'/>
+      <function-decl name='scsi_unblock_requests' mangled-name='scsi_unblock_requests' filepath='drivers/scsi/scsi_lib.c' line='2469' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='scsi_unblock_requests'>
+        <parameter type-id='a970a64c' name='shost' filepath='drivers/scsi/scsi_lib.c' line='2469' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='scsi_set_cmd_timeout_override' mangled-name='scsi_set_cmd_timeout_override' filepath='drivers/scsi/scsi_lib.c' line='2495' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='scsi_set_cmd_timeout_override'>
-        <parameter type-id='eb572b74' name='sdev' filepath='drivers/scsi/scsi_lib.c' line='2495' column='1'/>
-        <parameter type-id='f0981eeb' name='timeout' filepath='drivers/scsi/scsi_lib.c' line='2496' column='1'/>
+      <function-decl name='scsi_set_cmd_timeout_override' mangled-name='scsi_set_cmd_timeout_override' filepath='drivers/scsi/scsi_lib.c' line='2496' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='scsi_set_cmd_timeout_override'>
+        <parameter type-id='eb572b74' name='sdev' filepath='drivers/scsi/scsi_lib.c' line='2496' column='1'/>
+        <parameter type-id='f0981eeb' name='timeout' filepath='drivers/scsi/scsi_lib.c' line='2497' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
       <class-decl name='scsi_sense_hdr' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/scsi/scsi_common.h' line='50' column='1' id='d6746ce3'>
@@ -92906,8 +92884,8 @@
       <pointer-type-def type-id='f8eaf96b' size-in-bits='64' id='33dc3b1b'/>
       <pointer-type-def type-id='8f68aa3b' size-in-bits='64' id='1cf47bfb'/>
       <pointer-type-def type-id='7983eff8' size-in-bits='64' id='3d444e9a'/>
-      <function-decl name='spi_register_controller' mangled-name='spi_register_controller' filepath='drivers/spi/spi.c' line='2180' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='spi_register_controller'>
-        <parameter type-id='f22e4524' name='ctlr' filepath='drivers/spi/spi.c' line='2180' column='1'/>
+      <function-decl name='spi_register_controller' mangled-name='spi_register_controller' filepath='drivers/spi/spi.c' line='2181' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='spi_register_controller'>
+        <parameter type-id='f22e4524' name='ctlr' filepath='drivers/spi/spi.c' line='2181' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-decl name='__spi_register_driver' mangled-name='__spi_register_driver' filepath='drivers/spi/spi.c' line='401' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__spi_register_driver'>
@@ -92915,31 +92893,31 @@
         <parameter type-id='d9c194a6' name='sdrv' filepath='drivers/spi/spi.c' line='401' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='spi_setup' mangled-name='spi_setup' filepath='drivers/spi/spi.c' line='2849' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='spi_setup'>
-        <parameter type-id='e90f4666' name='spi' filepath='drivers/spi/spi.c' line='2849' column='1'/>
+      <function-decl name='spi_setup' mangled-name='spi_setup' filepath='drivers/spi/spi.c' line='2850' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='spi_setup'>
+        <parameter type-id='e90f4666' name='spi' filepath='drivers/spi/spi.c' line='2850' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='__spi_alloc_controller' mangled-name='__spi_alloc_controller' filepath='drivers/spi/spi.c' line='2026' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__spi_alloc_controller'>
-        <parameter type-id='fa0b179b' name='dev' filepath='drivers/spi/spi.c' line='2026' column='1'/>
-        <parameter type-id='f0981eeb' name='size' filepath='drivers/spi/spi.c' line='2027' column='1'/>
-        <parameter type-id='b50a4934' name='slave' filepath='drivers/spi/spi.c' line='2027' column='1'/>
+      <function-decl name='__spi_alloc_controller' mangled-name='__spi_alloc_controller' filepath='drivers/spi/spi.c' line='2027' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__spi_alloc_controller'>
+        <parameter type-id='fa0b179b' name='dev' filepath='drivers/spi/spi.c' line='2027' column='1'/>
+        <parameter type-id='f0981eeb' name='size' filepath='drivers/spi/spi.c' line='2028' column='1'/>
+        <parameter type-id='b50a4934' name='slave' filepath='drivers/spi/spi.c' line='2028' column='1'/>
         <return type-id='f22e4524'/>
       </function-decl>
-      <function-decl name='spi_unregister_controller' mangled-name='spi_unregister_controller' filepath='drivers/spi/spi.c' line='2370' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='spi_unregister_controller'>
-        <parameter type-id='f22e4524' name='ctlr' filepath='drivers/spi/spi.c' line='2370' column='1'/>
+      <function-decl name='spi_unregister_controller' mangled-name='spi_unregister_controller' filepath='drivers/spi/spi.c' line='2371' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='spi_unregister_controller'>
+        <parameter type-id='f22e4524' name='ctlr' filepath='drivers/spi/spi.c' line='2371' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='spi_sync_locked' mangled-name='spi_sync_locked' filepath='drivers/spi/spi.c' line='3267' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='spi_sync_locked'>
-        <parameter type-id='e90f4666' name='spi' filepath='drivers/spi/spi.c' line='3267' column='1'/>
-        <parameter type-id='bb7889ed' name='message' filepath='drivers/spi/spi.c' line='3267' column='1'/>
+      <function-decl name='spi_sync_locked' mangled-name='spi_sync_locked' filepath='drivers/spi/spi.c' line='3268' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='spi_sync_locked'>
+        <parameter type-id='e90f4666' name='spi' filepath='drivers/spi/spi.c' line='3268' column='1'/>
+        <parameter type-id='bb7889ed' name='message' filepath='drivers/spi/spi.c' line='3268' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='spi_bus_lock' mangled-name='spi_bus_lock' filepath='drivers/spi/spi.c' line='3288' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='spi_bus_lock'>
-        <parameter type-id='f22e4524' name='ctlr' filepath='drivers/spi/spi.c' line='3288' column='1'/>
+      <function-decl name='spi_bus_lock' mangled-name='spi_bus_lock' filepath='drivers/spi/spi.c' line='3289' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='spi_bus_lock'>
+        <parameter type-id='f22e4524' name='ctlr' filepath='drivers/spi/spi.c' line='3289' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='spi_bus_unlock' mangled-name='spi_bus_unlock' filepath='drivers/spi/spi.c' line='3317' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='spi_bus_unlock'>
-        <parameter type-id='f22e4524' name='ctlr' filepath='drivers/spi/spi.c' line='3317' column='1'/>
+      <function-decl name='spi_bus_unlock' mangled-name='spi_bus_unlock' filepath='drivers/spi/spi.c' line='3318' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='spi_bus_unlock'>
+        <parameter type-id='f22e4524' name='ctlr' filepath='drivers/spi/spi.c' line='3318' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-type size-in-bits='64' id='1c210187'>
@@ -94784,7 +94762,7 @@
           <var-decl name='data' type-id='c99b5ecd' visibility='default' filepath='include/linux/tty.h' line='69' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/tty.h' line='59' column='1' id='053892cc'>
+      <union-decl name='__anonymous_union__4' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/tty.h' line='59' column='1' id='053892cc'>
         <data-member access='public'>
           <var-decl name='next' type-id='a150e667' visibility='default' filepath='include/linux/tty.h' line='60' column='1'/>
         </data-member>
@@ -103085,242 +103063,242 @@
           <var-decl name='completing_ep' type-id='15adb516' visibility='default' filepath='include/linux/usb/hcd.h' line='73' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='xhci_driver_overrides' size-in-bits='192' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1922' column='1' id='8264b0e6'>
+      <class-decl name='xhci_driver_overrides' size-in-bits='192' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1923' column='1' id='8264b0e6'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='extra_priv_size' type-id='b59d7dce' visibility='default' filepath='drivers/usb/host/xhci.h' line='1923' column='1'/>
+          <var-decl name='extra_priv_size' type-id='b59d7dce' visibility='default' filepath='drivers/usb/host/xhci.h' line='1924' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='reset' type-id='3d4f6569' visibility='default' filepath='drivers/usb/host/xhci.h' line='1924' column='1'/>
+          <var-decl name='reset' type-id='3d4f6569' visibility='default' filepath='drivers/usb/host/xhci.h' line='1925' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='start' type-id='3d4f6569' visibility='default' filepath='drivers/usb/host/xhci.h' line='1925' column='1'/>
+          <var-decl name='start' type-id='3d4f6569' visibility='default' filepath='drivers/usb/host/xhci.h' line='1926' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='xhci_hcd' size-in-bits='43456' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1734' column='1' id='b8f49971'>
+      <class-decl name='xhci_hcd' size-in-bits='43456' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1735' column='1' id='b8f49971'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='main_hcd' type-id='fc4f83c1' visibility='default' filepath='drivers/usb/host/xhci.h' line='1735' column='1'/>
+          <var-decl name='main_hcd' type-id='fc4f83c1' visibility='default' filepath='drivers/usb/host/xhci.h' line='1736' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='shared_hcd' type-id='fc4f83c1' visibility='default' filepath='drivers/usb/host/xhci.h' line='1736' column='1'/>
+          <var-decl name='shared_hcd' type-id='fc4f83c1' visibility='default' filepath='drivers/usb/host/xhci.h' line='1737' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='cap_regs' type-id='8ed5fea6' visibility='default' filepath='drivers/usb/host/xhci.h' line='1738' column='1'/>
+          <var-decl name='cap_regs' type-id='8ed5fea6' visibility='default' filepath='drivers/usb/host/xhci.h' line='1739' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='op_regs' type-id='aba583a5' visibility='default' filepath='drivers/usb/host/xhci.h' line='1739' column='1'/>
+          <var-decl name='op_regs' type-id='aba583a5' visibility='default' filepath='drivers/usb/host/xhci.h' line='1740' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='run_regs' type-id='aaa546af' visibility='default' filepath='drivers/usb/host/xhci.h' line='1740' column='1'/>
+          <var-decl name='run_regs' type-id='aaa546af' visibility='default' filepath='drivers/usb/host/xhci.h' line='1741' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='dba' type-id='2966de59' visibility='default' filepath='drivers/usb/host/xhci.h' line='1741' column='1'/>
+          <var-decl name='dba' type-id='2966de59' visibility='default' filepath='drivers/usb/host/xhci.h' line='1742' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='ir_set' type-id='098bff2c' visibility='default' filepath='drivers/usb/host/xhci.h' line='1743' column='1'/>
+          <var-decl name='ir_set' type-id='098bff2c' visibility='default' filepath='drivers/usb/host/xhci.h' line='1744' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='sec_ir_set' type-id='0d627672' visibility='default' filepath='drivers/usb/host/xhci.h' line='1745' column='1'/>
+          <var-decl name='sec_ir_set' type-id='0d627672' visibility='default' filepath='drivers/usb/host/xhci.h' line='1746' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='core_id' type-id='95e97e5e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1747' column='1'/>
+          <var-decl name='core_id' type-id='95e97e5e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1748' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='544'>
-          <var-decl name='hcs_params1' type-id='3f1a6b60' visibility='default' filepath='drivers/usb/host/xhci.h' line='1750' column='1'/>
+          <var-decl name='hcs_params1' type-id='3f1a6b60' visibility='default' filepath='drivers/usb/host/xhci.h' line='1751' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='hcs_params2' type-id='3f1a6b60' visibility='default' filepath='drivers/usb/host/xhci.h' line='1751' column='1'/>
+          <var-decl name='hcs_params2' type-id='3f1a6b60' visibility='default' filepath='drivers/usb/host/xhci.h' line='1752' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='608'>
-          <var-decl name='hcs_params3' type-id='3f1a6b60' visibility='default' filepath='drivers/usb/host/xhci.h' line='1752' column='1'/>
+          <var-decl name='hcs_params3' type-id='3f1a6b60' visibility='default' filepath='drivers/usb/host/xhci.h' line='1753' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='640'>
-          <var-decl name='hcc_params' type-id='3f1a6b60' visibility='default' filepath='drivers/usb/host/xhci.h' line='1753' column='1'/>
+          <var-decl name='hcc_params' type-id='3f1a6b60' visibility='default' filepath='drivers/usb/host/xhci.h' line='1754' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='672'>
-          <var-decl name='hcc_params2' type-id='3f1a6b60' visibility='default' filepath='drivers/usb/host/xhci.h' line='1754' column='1'/>
+          <var-decl name='hcc_params2' type-id='3f1a6b60' visibility='default' filepath='drivers/usb/host/xhci.h' line='1755' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='drivers/usb/host/xhci.h' line='1756' column='1'/>
+          <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='drivers/usb/host/xhci.h' line='1757' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='736'>
-          <var-decl name='sbrn' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1759' column='1'/>
+          <var-decl name='sbrn' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1760' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='752'>
-          <var-decl name='hci_version' type-id='1dc6a898' visibility='default' filepath='drivers/usb/host/xhci.h' line='1760' column='1'/>
+          <var-decl name='hci_version' type-id='1dc6a898' visibility='default' filepath='drivers/usb/host/xhci.h' line='1761' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='768'>
-          <var-decl name='max_slots' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1761' column='1'/>
+          <var-decl name='max_slots' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1762' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='776'>
-          <var-decl name='max_interrupters' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1762' column='1'/>
+          <var-decl name='max_interrupters' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1763' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='784'>
-          <var-decl name='max_ports' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1763' column='1'/>
+          <var-decl name='max_ports' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1764' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='792'>
-          <var-decl name='isoc_threshold' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1764' column='1'/>
+          <var-decl name='isoc_threshold' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1765' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='800'>
-          <var-decl name='imod_interval' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1766' column='1'/>
+          <var-decl name='imod_interval' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1767' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='event_ring_max' type-id='95e97e5e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1767' column='1'/>
+          <var-decl name='event_ring_max' type-id='95e97e5e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1768' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='864'>
-          <var-decl name='page_size' type-id='95e97e5e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1769' column='1'/>
+          <var-decl name='page_size' type-id='95e97e5e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1770' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='896'>
-          <var-decl name='page_shift' type-id='95e97e5e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1771' column='1'/>
+          <var-decl name='page_shift' type-id='95e97e5e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1772' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='928'>
-          <var-decl name='msix_count' type-id='95e97e5e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1773' column='1'/>
+          <var-decl name='msix_count' type-id='95e97e5e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1774' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='960'>
-          <var-decl name='clk' type-id='7d0bc0eb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1775' column='1'/>
+          <var-decl name='clk' type-id='7d0bc0eb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1776' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='reg_clk' type-id='7d0bc0eb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1776' column='1'/>
+          <var-decl name='reg_clk' type-id='7d0bc0eb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1777' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1088'>
-          <var-decl name='dcbaa' type-id='8fea74f4' visibility='default' filepath='drivers/usb/host/xhci.h' line='1778' column='1'/>
+          <var-decl name='dcbaa' type-id='8fea74f4' visibility='default' filepath='drivers/usb/host/xhci.h' line='1779' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1152'>
-          <var-decl name='cmd_ring' type-id='52a50596' visibility='default' filepath='drivers/usb/host/xhci.h' line='1779' column='1'/>
+          <var-decl name='cmd_ring' type-id='52a50596' visibility='default' filepath='drivers/usb/host/xhci.h' line='1780' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1216'>
-          <var-decl name='cmd_ring_state' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1780' column='1'/>
+          <var-decl name='cmd_ring_state' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1781' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1280'>
-          <var-decl name='cmd_list' type-id='72f469ec' visibility='default' filepath='drivers/usb/host/xhci.h' line='1784' column='1'/>
+          <var-decl name='cmd_list' type-id='72f469ec' visibility='default' filepath='drivers/usb/host/xhci.h' line='1785' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1408'>
-          <var-decl name='cmd_ring_reserved_trbs' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1785' column='1'/>
+          <var-decl name='cmd_ring_reserved_trbs' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1786' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1472'>
-          <var-decl name='cmd_timer' type-id='5ad6e0ef' visibility='default' filepath='drivers/usb/host/xhci.h' line='1786' column='1'/>
+          <var-decl name='cmd_timer' type-id='5ad6e0ef' visibility='default' filepath='drivers/usb/host/xhci.h' line='1787' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2560'>
-          <var-decl name='cmd_ring_stop_completion' type-id='f9fef04f' visibility='default' filepath='drivers/usb/host/xhci.h' line='1787' column='1'/>
+          <var-decl name='cmd_ring_stop_completion' type-id='f9fef04f' visibility='default' filepath='drivers/usb/host/xhci.h' line='1788' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2816'>
-          <var-decl name='current_cmd' type-id='5a32bd4b' visibility='default' filepath='drivers/usb/host/xhci.h' line='1788' column='1'/>
+          <var-decl name='current_cmd' type-id='5a32bd4b' visibility='default' filepath='drivers/usb/host/xhci.h' line='1789' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2880'>
-          <var-decl name='event_ring' type-id='52a50596' visibility='default' filepath='drivers/usb/host/xhci.h' line='1789' column='1'/>
+          <var-decl name='event_ring' type-id='52a50596' visibility='default' filepath='drivers/usb/host/xhci.h' line='1790' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2944'>
-          <var-decl name='erst' type-id='c86369aa' visibility='default' filepath='drivers/usb/host/xhci.h' line='1790' column='1'/>
+          <var-decl name='erst' type-id='c86369aa' visibility='default' filepath='drivers/usb/host/xhci.h' line='1791' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3200'>
-          <var-decl name='sec_event_ring' type-id='d5c806f4' visibility='default' filepath='drivers/usb/host/xhci.h' line='1793' column='1'/>
+          <var-decl name='sec_event_ring' type-id='d5c806f4' visibility='default' filepath='drivers/usb/host/xhci.h' line='1794' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3264'>
-          <var-decl name='sec_erst' type-id='d7409d08' visibility='default' filepath='drivers/usb/host/xhci.h' line='1794' column='1'/>
+          <var-decl name='sec_erst' type-id='d7409d08' visibility='default' filepath='drivers/usb/host/xhci.h' line='1795' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3328'>
-          <var-decl name='scratchpad' type-id='33e2a135' visibility='default' filepath='drivers/usb/host/xhci.h' line='1797' column='1'/>
+          <var-decl name='scratchpad' type-id='33e2a135' visibility='default' filepath='drivers/usb/host/xhci.h' line='1798' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3392'>
-          <var-decl name='lpm_failed_devs' type-id='72f469ec' visibility='default' filepath='drivers/usb/host/xhci.h' line='1799' column='1'/>
+          <var-decl name='lpm_failed_devs' type-id='72f469ec' visibility='default' filepath='drivers/usb/host/xhci.h' line='1800' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3520'>
-          <var-decl name='mutex' type-id='925167dc' visibility='default' filepath='drivers/usb/host/xhci.h' line='1803' column='1'/>
+          <var-decl name='mutex' type-id='925167dc' visibility='default' filepath='drivers/usb/host/xhci.h' line='1804' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3776'>
-          <var-decl name='lpm_command' type-id='5a32bd4b' visibility='default' filepath='drivers/usb/host/xhci.h' line='1805' column='1'/>
+          <var-decl name='lpm_command' type-id='5a32bd4b' visibility='default' filepath='drivers/usb/host/xhci.h' line='1806' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3840'>
-          <var-decl name='devs' type-id='5b466593' visibility='default' filepath='drivers/usb/host/xhci.h' line='1807' column='1'/>
+          <var-decl name='devs' type-id='5b466593' visibility='default' filepath='drivers/usb/host/xhci.h' line='1808' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='20224'>
-          <var-decl name='rh_bw' type-id='69f4bad3' visibility='default' filepath='drivers/usb/host/xhci.h' line='1809' column='1'/>
+          <var-decl name='rh_bw' type-id='69f4bad3' visibility='default' filepath='drivers/usb/host/xhci.h' line='1810' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='20288'>
-          <var-decl name='device_pool' type-id='ab33c616' visibility='default' filepath='drivers/usb/host/xhci.h' line='1812' column='1'/>
+          <var-decl name='device_pool' type-id='ab33c616' visibility='default' filepath='drivers/usb/host/xhci.h' line='1813' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='20352'>
-          <var-decl name='segment_pool' type-id='ab33c616' visibility='default' filepath='drivers/usb/host/xhci.h' line='1813' column='1'/>
+          <var-decl name='segment_pool' type-id='ab33c616' visibility='default' filepath='drivers/usb/host/xhci.h' line='1814' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='20416'>
-          <var-decl name='small_streams_pool' type-id='ab33c616' visibility='default' filepath='drivers/usb/host/xhci.h' line='1814' column='1'/>
+          <var-decl name='small_streams_pool' type-id='ab33c616' visibility='default' filepath='drivers/usb/host/xhci.h' line='1815' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='20480'>
-          <var-decl name='medium_streams_pool' type-id='ab33c616' visibility='default' filepath='drivers/usb/host/xhci.h' line='1815' column='1'/>
+          <var-decl name='medium_streams_pool' type-id='ab33c616' visibility='default' filepath='drivers/usb/host/xhci.h' line='1816' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='20544'>
-          <var-decl name='xhc_state' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1818' column='1'/>
+          <var-decl name='xhc_state' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1819' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='20576'>
-          <var-decl name='command' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1820' column='1'/>
+          <var-decl name='command' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1821' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='20608'>
-          <var-decl name='s3' type-id='369534b9' visibility='default' filepath='drivers/usb/host/xhci.h' line='1821' column='1'/>
+          <var-decl name='s3' type-id='369534b9' visibility='default' filepath='drivers/usb/host/xhci.h' line='1822' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='20992'>
-          <var-decl name='quirks' type-id='3a47d82b' visibility='default' filepath='drivers/usb/host/xhci.h' line='1837' column='1'/>
+          <var-decl name='quirks' type-id='3a47d82b' visibility='default' filepath='drivers/usb/host/xhci.h' line='1838' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='21056'>
-          <var-decl name='num_active_eps' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1886' column='1'/>
+          <var-decl name='num_active_eps' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1887' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='21088'>
-          <var-decl name='limit_active_eps' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1887' column='1'/>
+          <var-decl name='limit_active_eps' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1888' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='21120'>
-          <var-decl name='bus_state' type-id='019ea9c2' visibility='default' filepath='drivers/usb/host/xhci.h' line='1889' column='1'/>
+          <var-decl name='bus_state' type-id='019ea9c2' visibility='default' filepath='drivers/usb/host/xhci.h' line='1890' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='41728'>
-          <var-decl name='hw_ports' type-id='4add39c5' visibility='default' filepath='drivers/usb/host/xhci.h' line='1890' column='1'/>
+          <var-decl name='hw_ports' type-id='4add39c5' visibility='default' filepath='drivers/usb/host/xhci.h' line='1891' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='41792'>
-          <var-decl name='usb2_rhub' type-id='d2c7a2c1' visibility='default' filepath='drivers/usb/host/xhci.h' line='1891' column='1'/>
+          <var-decl name='usb2_rhub' type-id='d2c7a2c1' visibility='default' filepath='drivers/usb/host/xhci.h' line='1892' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='42048'>
-          <var-decl name='usb3_rhub' type-id='d2c7a2c1' visibility='default' filepath='drivers/usb/host/xhci.h' line='1892' column='1'/>
+          <var-decl name='usb3_rhub' type-id='d2c7a2c1' visibility='default' filepath='drivers/usb/host/xhci.h' line='1893' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='sw_lpm_support' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1894' column='1'/>
+          <var-decl name='sw_lpm_support' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1895' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1'>
-          <var-decl name='hw_lpm_support' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1896' column='1'/>
+          <var-decl name='hw_lpm_support' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1897' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2'>
-          <var-decl name='broken_suspend' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1898' column='1'/>
+          <var-decl name='broken_suspend' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1899' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='42368'>
-          <var-decl name='ext_caps' type-id='f9409001' visibility='default' filepath='drivers/usb/host/xhci.h' line='1900' column='1'/>
+          <var-decl name='ext_caps' type-id='f9409001' visibility='default' filepath='drivers/usb/host/xhci.h' line='1901' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='42432'>
-          <var-decl name='num_ext_caps' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1901' column='1'/>
+          <var-decl name='num_ext_caps' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1902' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='42496'>
-          <var-decl name='port_caps' type-id='aae3718c' visibility='default' filepath='drivers/usb/host/xhci.h' line='1903' column='1'/>
+          <var-decl name='port_caps' type-id='aae3718c' visibility='default' filepath='drivers/usb/host/xhci.h' line='1904' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='42560'>
-          <var-decl name='num_port_caps' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1904' column='1'/>
+          <var-decl name='num_port_caps' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1905' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='42624'>
-          <var-decl name='comp_mode_recovery_timer' type-id='abe41e67' visibility='default' filepath='drivers/usb/host/xhci.h' line='1906' column='1'/>
+          <var-decl name='comp_mode_recovery_timer' type-id='abe41e67' visibility='default' filepath='drivers/usb/host/xhci.h' line='1907' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='43072'>
-          <var-decl name='port_status_u0' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1907' column='1'/>
+          <var-decl name='port_status_u0' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1908' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='43104'>
-          <var-decl name='test_mode' type-id='1dc6a898' visibility='default' filepath='drivers/usb/host/xhci.h' line='1908' column='1'/>
+          <var-decl name='test_mode' type-id='1dc6a898' visibility='default' filepath='drivers/usb/host/xhci.h' line='1909' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='43136'>
-          <var-decl name='debugfs_root' type-id='27675065' visibility='default' filepath='drivers/usb/host/xhci.h' line='1912' column='1'/>
+          <var-decl name='debugfs_root' type-id='27675065' visibility='default' filepath='drivers/usb/host/xhci.h' line='1913' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='43200'>
-          <var-decl name='debugfs_slots' type-id='27675065' visibility='default' filepath='drivers/usb/host/xhci.h' line='1913' column='1'/>
+          <var-decl name='debugfs_slots' type-id='27675065' visibility='default' filepath='drivers/usb/host/xhci.h' line='1914' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='43264'>
-          <var-decl name='regset_list' type-id='72f469ec' visibility='default' filepath='drivers/usb/host/xhci.h' line='1914' column='1'/>
+          <var-decl name='regset_list' type-id='72f469ec' visibility='default' filepath='drivers/usb/host/xhci.h' line='1915' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='43392'>
-          <var-decl name='dbc' type-id='eaa32e2f' visibility='default' filepath='drivers/usb/host/xhci.h' line='1916' column='1'/>
+          <var-decl name='dbc' type-id='eaa32e2f' visibility='default' filepath='drivers/usb/host/xhci.h' line='1917' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='43456'>
-          <var-decl name='priv' type-id='c99b5ecd' visibility='default' filepath='drivers/usb/host/xhci.h' line='1918' column='1'/>
+          <var-decl name='priv' type-id='c99b5ecd' visibility='default' filepath='drivers/usb/host/xhci.h' line='1919' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='xhci_cap_regs' size-in-bits='256' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='50' column='1' id='c38207f0'>
@@ -103436,140 +103414,140 @@
           <var-decl name='doorbell' type-id='8e6dd4be' visibility='default' filepath='drivers/usb/host/xhci.h' line='546' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='xhci_device_context_array' size-in-bits='16448' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1055' column='1' id='7848dffe'>
+      <class-decl name='xhci_device_context_array' size-in-bits='16448' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1056' column='1' id='7848dffe'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='dev_context_ptrs' type-id='fad2e2f3' visibility='default' filepath='drivers/usb/host/xhci.h' line='1057' column='1'/>
+          <var-decl name='dev_context_ptrs' type-id='fad2e2f3' visibility='default' filepath='drivers/usb/host/xhci.h' line='1058' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='16384'>
-          <var-decl name='dma' type-id='cf29c9b3' visibility='default' filepath='drivers/usb/host/xhci.h' line='1059' column='1'/>
+          <var-decl name='dma' type-id='cf29c9b3' visibility='default' filepath='drivers/usb/host/xhci.h' line='1060' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='xhci_ring' size-in-bits='832' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1589' column='1' id='df67c5d0'>
+      <class-decl name='xhci_ring' size-in-bits='832' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1590' column='1' id='df67c5d0'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='first_seg' type-id='9689f21b' visibility='default' filepath='drivers/usb/host/xhci.h' line='1590' column='1'/>
+          <var-decl name='first_seg' type-id='9689f21b' visibility='default' filepath='drivers/usb/host/xhci.h' line='1591' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='last_seg' type-id='9689f21b' visibility='default' filepath='drivers/usb/host/xhci.h' line='1591' column='1'/>
+          <var-decl name='last_seg' type-id='9689f21b' visibility='default' filepath='drivers/usb/host/xhci.h' line='1592' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='enqueue' type-id='2e0bb6d4' visibility='default' filepath='drivers/usb/host/xhci.h' line='1592' column='1'/>
+          <var-decl name='enqueue' type-id='2e0bb6d4' visibility='default' filepath='drivers/usb/host/xhci.h' line='1593' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='enq_seg' type-id='9689f21b' visibility='default' filepath='drivers/usb/host/xhci.h' line='1593' column='1'/>
+          <var-decl name='enq_seg' type-id='9689f21b' visibility='default' filepath='drivers/usb/host/xhci.h' line='1594' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='dequeue' type-id='2e0bb6d4' visibility='default' filepath='drivers/usb/host/xhci.h' line='1594' column='1'/>
+          <var-decl name='dequeue' type-id='2e0bb6d4' visibility='default' filepath='drivers/usb/host/xhci.h' line='1595' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='deq_seg' type-id='9689f21b' visibility='default' filepath='drivers/usb/host/xhci.h' line='1595' column='1'/>
+          <var-decl name='deq_seg' type-id='9689f21b' visibility='default' filepath='drivers/usb/host/xhci.h' line='1596' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='td_list' type-id='72f469ec' visibility='default' filepath='drivers/usb/host/xhci.h' line='1596' column='1'/>
+          <var-decl name='td_list' type-id='72f469ec' visibility='default' filepath='drivers/usb/host/xhci.h' line='1597' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='cycle_state' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1602' column='1'/>
+          <var-decl name='cycle_state' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1603' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='544'>
-          <var-decl name='stream_id' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1603' column='1'/>
+          <var-decl name='stream_id' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1604' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='num_segs' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1604' column='1'/>
+          <var-decl name='num_segs' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1605' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='608'>
-          <var-decl name='num_trbs_free' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1605' column='1'/>
+          <var-decl name='num_trbs_free' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1606' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='640'>
-          <var-decl name='num_trbs_free_temp' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1606' column='1'/>
+          <var-decl name='num_trbs_free_temp' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1607' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='672'>
-          <var-decl name='bounce_buf_len' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1607' column='1'/>
+          <var-decl name='bounce_buf_len' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1608' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='type' type-id='b61681fc' visibility='default' filepath='drivers/usb/host/xhci.h' line='1608' column='1'/>
+          <var-decl name='type' type-id='b61681fc' visibility='default' filepath='drivers/usb/host/xhci.h' line='1609' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='736'>
-          <var-decl name='last_td_was_short' type-id='b50a4934' visibility='default' filepath='drivers/usb/host/xhci.h' line='1609' column='1'/>
+          <var-decl name='last_td_was_short' type-id='b50a4934' visibility='default' filepath='drivers/usb/host/xhci.h' line='1610' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='768'>
-          <var-decl name='trb_address_map' type-id='3cc57427' visibility='default' filepath='drivers/usb/host/xhci.h' line='1610' column='1'/>
+          <var-decl name='trb_address_map' type-id='3cc57427' visibility='default' filepath='drivers/usb/host/xhci.h' line='1611' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='xhci_segment' size-in-bits='384' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1517' column='1' id='56e9279b'>
+      <class-decl name='xhci_segment' size-in-bits='384' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1518' column='1' id='56e9279b'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='trbs' type-id='2e0bb6d4' visibility='default' filepath='drivers/usb/host/xhci.h' line='1518' column='1'/>
+          <var-decl name='trbs' type-id='2e0bb6d4' visibility='default' filepath='drivers/usb/host/xhci.h' line='1519' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='next' type-id='9689f21b' visibility='default' filepath='drivers/usb/host/xhci.h' line='1520' column='1'/>
+          <var-decl name='next' type-id='9689f21b' visibility='default' filepath='drivers/usb/host/xhci.h' line='1521' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='dma' type-id='cf29c9b3' visibility='default' filepath='drivers/usb/host/xhci.h' line='1521' column='1'/>
+          <var-decl name='dma' type-id='cf29c9b3' visibility='default' filepath='drivers/usb/host/xhci.h' line='1522' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='bounce_dma' type-id='cf29c9b3' visibility='default' filepath='drivers/usb/host/xhci.h' line='1523' column='1'/>
+          <var-decl name='bounce_dma' type-id='cf29c9b3' visibility='default' filepath='drivers/usb/host/xhci.h' line='1524' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='bounce_buf' type-id='eaa32e2f' visibility='default' filepath='drivers/usb/host/xhci.h' line='1524' column='1'/>
+          <var-decl name='bounce_buf' type-id='eaa32e2f' visibility='default' filepath='drivers/usb/host/xhci.h' line='1525' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='bounce_offs' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1525' column='1'/>
+          <var-decl name='bounce_offs' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1526' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='352'>
-          <var-decl name='bounce_len' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1526' column='1'/>
+          <var-decl name='bounce_len' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1527' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='xhci_trb' size-in-bits='128' visibility='default' filepath='drivers/usb/host/xhci.h' line='1333' column='1' id='73956807'>
+      <union-decl name='xhci_trb' size-in-bits='128' visibility='default' filepath='drivers/usb/host/xhci.h' line='1334' column='1' id='73956807'>
         <data-member access='public'>
-          <var-decl name='link' type-id='80702149' visibility='default' filepath='drivers/usb/host/xhci.h' line='1334' column='1'/>
+          <var-decl name='link' type-id='80702149' visibility='default' filepath='drivers/usb/host/xhci.h' line='1335' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='trans_event' type-id='b913a5e6' visibility='default' filepath='drivers/usb/host/xhci.h' line='1335' column='1'/>
+          <var-decl name='trans_event' type-id='b913a5e6' visibility='default' filepath='drivers/usb/host/xhci.h' line='1336' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='event_cmd' type-id='e5ddb711' visibility='default' filepath='drivers/usb/host/xhci.h' line='1336' column='1'/>
+          <var-decl name='event_cmd' type-id='e5ddb711' visibility='default' filepath='drivers/usb/host/xhci.h' line='1337' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='generic' type-id='c74233fc' visibility='default' filepath='drivers/usb/host/xhci.h' line='1337' column='1'/>
+          <var-decl name='generic' type-id='c74233fc' visibility='default' filepath='drivers/usb/host/xhci.h' line='1338' column='1'/>
         </data-member>
       </union-decl>
-      <class-decl name='xhci_link_trb' size-in-bits='128' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1203' column='1' id='80702149'>
+      <class-decl name='xhci_link_trb' size-in-bits='128' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1204' column='1' id='80702149'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='segment_ptr' type-id='a30e8d1f' visibility='default' filepath='drivers/usb/host/xhci.h' line='1205' column='1'/>
+          <var-decl name='segment_ptr' type-id='a30e8d1f' visibility='default' filepath='drivers/usb/host/xhci.h' line='1206' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='intr_target' type-id='2f162548' visibility='default' filepath='drivers/usb/host/xhci.h' line='1206' column='1'/>
+          <var-decl name='intr_target' type-id='2f162548' visibility='default' filepath='drivers/usb/host/xhci.h' line='1207' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='control' type-id='2f162548' visibility='default' filepath='drivers/usb/host/xhci.h' line='1207' column='1'/>
+          <var-decl name='control' type-id='2f162548' visibility='default' filepath='drivers/usb/host/xhci.h' line='1208' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='xhci_transfer_event' size-in-bits='128' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1068' column='1' id='b913a5e6'>
+      <class-decl name='xhci_transfer_event' size-in-bits='128' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1069' column='1' id='b913a5e6'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='buffer' type-id='a30e8d1f' visibility='default' filepath='drivers/usb/host/xhci.h' line='1070' column='1'/>
+          <var-decl name='buffer' type-id='a30e8d1f' visibility='default' filepath='drivers/usb/host/xhci.h' line='1071' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='transfer_len' type-id='2f162548' visibility='default' filepath='drivers/usb/host/xhci.h' line='1071' column='1'/>
+          <var-decl name='transfer_len' type-id='2f162548' visibility='default' filepath='drivers/usb/host/xhci.h' line='1072' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='flags' type-id='2f162548' visibility='default' filepath='drivers/usb/host/xhci.h' line='1073' column='1'/>
+          <var-decl name='flags' type-id='2f162548' visibility='default' filepath='drivers/usb/host/xhci.h' line='1074' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='xhci_event_cmd' size-in-bits='128' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1214' column='1' id='e5ddb711'>
+      <class-decl name='xhci_event_cmd' size-in-bits='128' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1215' column='1' id='e5ddb711'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='cmd_trb' type-id='a30e8d1f' visibility='default' filepath='drivers/usb/host/xhci.h' line='1216' column='1'/>
+          <var-decl name='cmd_trb' type-id='a30e8d1f' visibility='default' filepath='drivers/usb/host/xhci.h' line='1217' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='status' type-id='2f162548' visibility='default' filepath='drivers/usb/host/xhci.h' line='1217' column='1'/>
+          <var-decl name='status' type-id='2f162548' visibility='default' filepath='drivers/usb/host/xhci.h' line='1218' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='flags' type-id='2f162548' visibility='default' filepath='drivers/usb/host/xhci.h' line='1218' column='1'/>
+          <var-decl name='flags' type-id='2f162548' visibility='default' filepath='drivers/usb/host/xhci.h' line='1219' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='xhci_generic_trb' size-in-bits='128' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1329' column='1' id='c74233fc'>
+      <class-decl name='xhci_generic_trb' size-in-bits='128' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1330' column='1' id='c74233fc'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='field' type-id='a36b3301' visibility='default' filepath='drivers/usb/host/xhci.h' line='1330' column='1'/>
+          <var-decl name='field' type-id='a36b3301' visibility='default' filepath='drivers/usb/host/xhci.h' line='1331' column='1'/>
         </data-member>
       </class-decl>
-      <enum-decl name='xhci_ring_type' filepath='drivers/usb/host/xhci.h' line='1557' column='1' id='b61681fc'>
+      <enum-decl name='xhci_ring_type' filepath='drivers/usb/host/xhci.h' line='1558' column='1' id='b61681fc'>
         <underlying-type type-id='9cac1fee'/>
         <enumerator name='TYPE_CTRL' value='0'/>
         <enumerator name='TYPE_ISOC' value='1'/>
@@ -103613,75 +103591,75 @@
           <var-decl name='dma' type-id='cf29c9b3' visibility='default' filepath='drivers/usb/host/xhci.h' line='602' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='xhci_erst' size-in-bits='256' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1621' column='1' id='c86369aa'>
+      <class-decl name='xhci_erst' size-in-bits='256' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1622' column='1' id='c86369aa'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='entries' type-id='78faece1' visibility='default' filepath='drivers/usb/host/xhci.h' line='1622' column='1'/>
+          <var-decl name='entries' type-id='78faece1' visibility='default' filepath='drivers/usb/host/xhci.h' line='1623' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='num_entries' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1623' column='1'/>
+          <var-decl name='num_entries' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1624' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='erst_dma_addr' type-id='cf29c9b3' visibility='default' filepath='drivers/usb/host/xhci.h' line='1625' column='1'/>
+          <var-decl name='erst_dma_addr' type-id='cf29c9b3' visibility='default' filepath='drivers/usb/host/xhci.h' line='1626' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='erst_size' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1627' column='1'/>
+          <var-decl name='erst_size' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1628' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='xhci_erst_entry' size-in-bits='128' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1613' column='1' id='cf081899'>
+      <class-decl name='xhci_erst_entry' size-in-bits='128' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1614' column='1' id='cf081899'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='seg_addr' type-id='a30e8d1f' visibility='default' filepath='drivers/usb/host/xhci.h' line='1615' column='1'/>
+          <var-decl name='seg_addr' type-id='a30e8d1f' visibility='default' filepath='drivers/usb/host/xhci.h' line='1616' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='seg_size' type-id='2f162548' visibility='default' filepath='drivers/usb/host/xhci.h' line='1616' column='1'/>
+          <var-decl name='seg_size' type-id='2f162548' visibility='default' filepath='drivers/usb/host/xhci.h' line='1617' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='rsvd' type-id='2f162548' visibility='default' filepath='drivers/usb/host/xhci.h' line='1618' column='1'/>
+          <var-decl name='rsvd' type-id='2f162548' visibility='default' filepath='drivers/usb/host/xhci.h' line='1619' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='xhci_scratchpad' size-in-bits='192' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1630' column='1' id='656561a5'>
+      <class-decl name='xhci_scratchpad' size-in-bits='192' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1631' column='1' id='656561a5'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='sp_array' type-id='3df9fd28' visibility='default' filepath='drivers/usb/host/xhci.h' line='1631' column='1'/>
+          <var-decl name='sp_array' type-id='3df9fd28' visibility='default' filepath='drivers/usb/host/xhci.h' line='1632' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='sp_dma' type-id='cf29c9b3' visibility='default' filepath='drivers/usb/host/xhci.h' line='1632' column='1'/>
+          <var-decl name='sp_dma' type-id='cf29c9b3' visibility='default' filepath='drivers/usb/host/xhci.h' line='1633' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='sp_buffers' type-id='63e171df' visibility='default' filepath='drivers/usb/host/xhci.h' line='1633' column='1'/>
+          <var-decl name='sp_buffers' type-id='63e171df' visibility='default' filepath='drivers/usb/host/xhci.h' line='1634' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='xhci_virt_device' size-in-bits='46208' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='995' column='1' id='7607667c'>
+      <class-decl name='xhci_virt_device' size-in-bits='46208' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='996' column='1' id='7607667c'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='udev' type-id='25e60cb2' visibility='default' filepath='drivers/usb/host/xhci.h' line='996' column='1'/>
+          <var-decl name='udev' type-id='25e60cb2' visibility='default' filepath='drivers/usb/host/xhci.h' line='997' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='out_ctx' type-id='971e404f' visibility='default' filepath='drivers/usb/host/xhci.h' line='1005' column='1'/>
+          <var-decl name='out_ctx' type-id='971e404f' visibility='default' filepath='drivers/usb/host/xhci.h' line='1006' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='in_ctx' type-id='971e404f' visibility='default' filepath='drivers/usb/host/xhci.h' line='1007' column='1'/>
+          <var-decl name='in_ctx' type-id='971e404f' visibility='default' filepath='drivers/usb/host/xhci.h' line='1008' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='eps' type-id='cec4db9b' visibility='default' filepath='drivers/usb/host/xhci.h' line='1008' column='1'/>
+          <var-decl name='eps' type-id='cec4db9b' visibility='default' filepath='drivers/usb/host/xhci.h' line='1009' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='45824'>
-          <var-decl name='fake_port' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1009' column='1'/>
+          <var-decl name='fake_port' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1010' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='45832'>
-          <var-decl name='real_port' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1010' column='1'/>
+          <var-decl name='real_port' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1011' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='45888'>
-          <var-decl name='bw_table' type-id='86f7f60e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1011' column='1'/>
+          <var-decl name='bw_table' type-id='86f7f60e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1012' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='45952'>
-          <var-decl name='tt_info' type-id='997bd29d' visibility='default' filepath='drivers/usb/host/xhci.h' line='1012' column='1'/>
+          <var-decl name='tt_info' type-id='997bd29d' visibility='default' filepath='drivers/usb/host/xhci.h' line='1013' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='46016'>
-          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='drivers/usb/host/xhci.h' line='1019' column='1'/>
+          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='drivers/usb/host/xhci.h' line='1020' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='46080'>
-          <var-decl name='current_mel' type-id='1dc6a898' visibility='default' filepath='drivers/usb/host/xhci.h' line='1023' column='1'/>
+          <var-decl name='current_mel' type-id='1dc6a898' visibility='default' filepath='drivers/usb/host/xhci.h' line='1024' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='46144'>
-          <var-decl name='debugfs_private' type-id='eaa32e2f' visibility='default' filepath='drivers/usb/host/xhci.h' line='1025' column='1'/>
+          <var-decl name='debugfs_private' type-id='eaa32e2f' visibility='default' filepath='drivers/usb/host/xhci.h' line='1026' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='xhci_virt_ep' size-in-bits='1472' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='920' column='1' id='72a973b7'>
@@ -103807,141 +103785,141 @@
           <var-decl name='overhead' type-id='0955670c' visibility='default' filepath='drivers/usb/host/xhci.h' line='980' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='xhci_tt_bw_info' size-in-bits='5568' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1042' column='1' id='3e02e52d'>
+      <class-decl name='xhci_tt_bw_info' size-in-bits='5568' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1043' column='1' id='3e02e52d'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='tt_list' type-id='72f469ec' visibility='default' filepath='drivers/usb/host/xhci.h' line='1043' column='1'/>
+          <var-decl name='tt_list' type-id='72f469ec' visibility='default' filepath='drivers/usb/host/xhci.h' line='1044' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='slot_id' type-id='95e97e5e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1044' column='1'/>
+          <var-decl name='slot_id' type-id='95e97e5e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1045' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='160'>
-          <var-decl name='ttport' type-id='95e97e5e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1045' column='1'/>
+          <var-decl name='ttport' type-id='95e97e5e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1046' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='bw_table' type-id='2acb65d8' visibility='default' filepath='drivers/usb/host/xhci.h' line='1046' column='1'/>
+          <var-decl name='bw_table' type-id='2acb65d8' visibility='default' filepath='drivers/usb/host/xhci.h' line='1047' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5504'>
-          <var-decl name='active_eps' type-id='95e97e5e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1047' column='1'/>
+          <var-decl name='active_eps' type-id='95e97e5e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1048' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='xhci_root_port_bw_info' size-in-bits='5504' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1036' column='1' id='9b863e03'>
+      <class-decl name='xhci_root_port_bw_info' size-in-bits='5504' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1037' column='1' id='9b863e03'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='tts' type-id='72f469ec' visibility='default' filepath='drivers/usb/host/xhci.h' line='1037' column='1'/>
+          <var-decl name='tts' type-id='72f469ec' visibility='default' filepath='drivers/usb/host/xhci.h' line='1038' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='num_active_tts' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1038' column='1'/>
+          <var-decl name='num_active_tts' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1039' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='bw_table' type-id='2acb65d8' visibility='default' filepath='drivers/usb/host/xhci.h' line='1039' column='1'/>
+          <var-decl name='bw_table' type-id='2acb65d8' visibility='default' filepath='drivers/usb/host/xhci.h' line='1040' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='s3_save' size-in-bits='384' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1658' column='1' id='369534b9'>
+      <class-decl name='s3_save' size-in-bits='384' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1659' column='1' id='369534b9'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='command' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1659' column='1'/>
+          <var-decl name='command' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1660' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='dev_nt' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1660' column='1'/>
+          <var-decl name='dev_nt' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1661' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='dcbaa_ptr' type-id='91ce1af9' visibility='default' filepath='drivers/usb/host/xhci.h' line='1661' column='1'/>
+          <var-decl name='dcbaa_ptr' type-id='91ce1af9' visibility='default' filepath='drivers/usb/host/xhci.h' line='1662' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='config_reg' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1662' column='1'/>
+          <var-decl name='config_reg' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1663' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='160'>
-          <var-decl name='irq_pending' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1663' column='1'/>
+          <var-decl name='irq_pending' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1664' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='irq_control' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1664' column='1'/>
+          <var-decl name='irq_control' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1665' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='224'>
-          <var-decl name='erst_size' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1665' column='1'/>
+          <var-decl name='erst_size' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1666' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='erst_base' type-id='91ce1af9' visibility='default' filepath='drivers/usb/host/xhci.h' line='1666' column='1'/>
+          <var-decl name='erst_base' type-id='91ce1af9' visibility='default' filepath='drivers/usb/host/xhci.h' line='1667' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='erst_dequeue' type-id='91ce1af9' visibility='default' filepath='drivers/usb/host/xhci.h' line='1667' column='1'/>
+          <var-decl name='erst_dequeue' type-id='91ce1af9' visibility='default' filepath='drivers/usb/host/xhci.h' line='1668' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='xhci_bus_state' size-in-bits='10304' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1676' column='1' id='d9e4295a'>
+      <class-decl name='xhci_bus_state' size-in-bits='10304' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1677' column='1' id='d9e4295a'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='bus_suspended' type-id='7359adad' visibility='default' filepath='drivers/usb/host/xhci.h' line='1677' column='1'/>
+          <var-decl name='bus_suspended' type-id='7359adad' visibility='default' filepath='drivers/usb/host/xhci.h' line='1678' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='next_statechange' type-id='7359adad' visibility='default' filepath='drivers/usb/host/xhci.h' line='1678' column='1'/>
+          <var-decl name='next_statechange' type-id='7359adad' visibility='default' filepath='drivers/usb/host/xhci.h' line='1679' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='port_c_suspend' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1682' column='1'/>
+          <var-decl name='port_c_suspend' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1683' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='160'>
-          <var-decl name='suspended_ports' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1683' column='1'/>
+          <var-decl name='suspended_ports' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1684' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='port_remote_wakeup' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1684' column='1'/>
+          <var-decl name='port_remote_wakeup' type-id='19c2251e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1685' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='resume_done' type-id='bc3d3491' visibility='default' filepath='drivers/usb/host/xhci.h' line='1685' column='1'/>
+          <var-decl name='resume_done' type-id='bc3d3491' visibility='default' filepath='drivers/usb/host/xhci.h' line='1686' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2240'>
-          <var-decl name='resuming_ports' type-id='7359adad' visibility='default' filepath='drivers/usb/host/xhci.h' line='1687' column='1'/>
+          <var-decl name='resuming_ports' type-id='7359adad' visibility='default' filepath='drivers/usb/host/xhci.h' line='1688' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2304'>
-          <var-decl name='rexit_ports' type-id='7359adad' visibility='default' filepath='drivers/usb/host/xhci.h' line='1689' column='1'/>
+          <var-decl name='rexit_ports' type-id='7359adad' visibility='default' filepath='drivers/usb/host/xhci.h' line='1690' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2368'>
-          <var-decl name='rexit_done' type-id='fb518993' visibility='default' filepath='drivers/usb/host/xhci.h' line='1690' column='1'/>
+          <var-decl name='rexit_done' type-id='fb518993' visibility='default' filepath='drivers/usb/host/xhci.h' line='1691' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='xhci_port' size-in-bits='256' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1716' column='1' id='7f16b755'>
+      <class-decl name='xhci_port' size-in-bits='256' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1717' column='1' id='7f16b755'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='addr' type-id='3e77f659' visibility='default' filepath='drivers/usb/host/xhci.h' line='1717' column='1'/>
+          <var-decl name='addr' type-id='3e77f659' visibility='default' filepath='drivers/usb/host/xhci.h' line='1718' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='hw_portnum' type-id='95e97e5e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1718' column='1'/>
+          <var-decl name='hw_portnum' type-id='95e97e5e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1719' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='hcd_portnum' type-id='95e97e5e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1719' column='1'/>
+          <var-decl name='hcd_portnum' type-id='95e97e5e' visibility='default' filepath='drivers/usb/host/xhci.h' line='1720' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='rhub' type-id='c39cf839' visibility='default' filepath='drivers/usb/host/xhci.h' line='1720' column='1'/>
+          <var-decl name='rhub' type-id='c39cf839' visibility='default' filepath='drivers/usb/host/xhci.h' line='1721' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='port_cap' type-id='aae3718c' visibility='default' filepath='drivers/usb/host/xhci.h' line='1721' column='1'/>
+          <var-decl name='port_cap' type-id='aae3718c' visibility='default' filepath='drivers/usb/host/xhci.h' line='1722' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='xhci_hub' size-in-bits='256' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1724' column='1' id='d2c7a2c1'>
+      <class-decl name='xhci_hub' size-in-bits='256' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1725' column='1' id='d2c7a2c1'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='ports' type-id='c942333d' visibility='default' filepath='drivers/usb/host/xhci.h' line='1725' column='1'/>
+          <var-decl name='ports' type-id='c942333d' visibility='default' filepath='drivers/usb/host/xhci.h' line='1726' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='num_ports' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1726' column='1'/>
+          <var-decl name='num_ports' type-id='f0981eeb' visibility='default' filepath='drivers/usb/host/xhci.h' line='1727' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='hcd' type-id='fc4f83c1' visibility='default' filepath='drivers/usb/host/xhci.h' line='1727' column='1'/>
+          <var-decl name='hcd' type-id='fc4f83c1' visibility='default' filepath='drivers/usb/host/xhci.h' line='1728' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='maj_rev' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1729' column='1'/>
+          <var-decl name='maj_rev' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1730' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='200'>
-          <var-decl name='min_rev' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1730' column='1'/>
+          <var-decl name='min_rev' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1731' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='xhci_port_cap' size-in-bits='128' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1708' column='1' id='644441a6'>
+      <class-decl name='xhci_port_cap' size-in-bits='128' is-struct='yes' visibility='default' filepath='drivers/usb/host/xhci.h' line='1709' column='1' id='644441a6'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='psi' type-id='f9409001' visibility='default' filepath='drivers/usb/host/xhci.h' line='1709' column='1'/>
+          <var-decl name='psi' type-id='f9409001' visibility='default' filepath='drivers/usb/host/xhci.h' line='1710' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='psi_count' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1710' column='1'/>
+          <var-decl name='psi_count' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1711' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='72'>
-          <var-decl name='psi_uid_count' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1711' column='1'/>
+          <var-decl name='psi_uid_count' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1712' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='80'>
-          <var-decl name='maj_rev' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1712' column='1'/>
+          <var-decl name='maj_rev' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1713' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='88'>
-          <var-decl name='min_rev' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1713' column='1'/>
+          <var-decl name='min_rev' type-id='f9b06939' visibility='default' filepath='drivers/usb/host/xhci.h' line='1714' column='1'/>
         </data-member>
       </class-decl>
       <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='61ea481a'>
@@ -104072,17 +104050,17 @@
         <parameter type-id='fc4f83c1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='xhci_init_driver' mangled-name='xhci_init_driver' filepath='drivers/usb/host/xhci.h' line='2078' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xhci_init_driver'>
+      <function-decl name='xhci_init_driver' mangled-name='xhci_init_driver' filepath='drivers/usb/host/xhci.h' line='2079' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xhci_init_driver'>
         <parameter type-id='c07d5ba3'/>
         <parameter type-id='9a55ba3d'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='xhci_suspend' mangled-name='xhci_suspend' filepath='drivers/usb/host/xhci.h' line='2083' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xhci_suspend'>
+      <function-decl name='xhci_suspend' mangled-name='xhci_suspend' filepath='drivers/usb/host/xhci.h' line='2084' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xhci_suspend'>
         <parameter type-id='0c65b409'/>
         <parameter type-id='c894953d'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='xhci_resume' mangled-name='xhci_resume' filepath='drivers/usb/host/xhci.h' line='2084' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xhci_resume'>
+      <function-decl name='xhci_resume' mangled-name='xhci_resume' filepath='drivers/usb/host/xhci.h' line='2085' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xhci_resume'>
         <parameter type-id='0c65b409'/>
         <parameter type-id='c894953d'/>
         <return type-id='95e97e5e'/>
@@ -104093,7 +104071,7 @@
         <parameter type-id='cf536864'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='xhci_gen_setup' mangled-name='xhci_gen_setup' filepath='drivers/usb/host/xhci.h' line='2076' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xhci_gen_setup'>
+      <function-decl name='xhci_gen_setup' mangled-name='xhci_gen_setup' filepath='drivers/usb/host/xhci.h' line='2077' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xhci_gen_setup'>
         <parameter type-id='fc4f83c1'/>
         <parameter type-id='da11b16a'/>
         <return type-id='95e97e5e'/>
@@ -104681,9 +104659,9 @@
       <pointer-type-def type-id='eca93177' size-in-bits='64' id='5d33005f'/>
       <pointer-type-def type-id='57bfbe05' size-in-bits='64' id='09dbca85'/>
       <pointer-type-def type-id='345f1a5f' size-in-bits='64' id='2227a3ab'/>
-      <function-decl name='typec_register_port' mangled-name='typec_register_port' filepath='drivers/usb/typec/class.c' line='1541' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_register_port'>
-        <parameter type-id='fa0b179b' name='parent' filepath='drivers/usb/typec/class.c' line='1541' column='1'/>
-        <parameter type-id='287e28ea' name='cap' filepath='drivers/usb/typec/class.c' line='1542' column='1'/>
+      <function-decl name='typec_register_port' mangled-name='typec_register_port' filepath='drivers/usb/typec/class.c' line='1543' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_register_port'>
+        <parameter type-id='fa0b179b' name='parent' filepath='drivers/usb/typec/class.c' line='1543' column='1'/>
+        <parameter type-id='287e28ea' name='cap' filepath='drivers/usb/typec/class.c' line='1544' column='1'/>
         <return type-id='b977ca56'/>
       </function-decl>
       <function-decl name='typec_altmode_update_active' mangled-name='typec_altmode_update_active' filepath='drivers/usb/typec/class.c' line='291' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_altmode_update_active'>
@@ -104691,77 +104669,77 @@
         <parameter type-id='b50a4934' name='active' filepath='drivers/usb/typec/class.c' line='291' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='typec_unregister_altmode' mangled-name='typec_unregister_altmode' filepath='drivers/usb/typec/class.c' line='558' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_unregister_altmode'>
-        <parameter type-id='02913b69' name='adev' filepath='drivers/usb/typec/class.c' line='558' column='1'/>
+      <function-decl name='typec_unregister_altmode' mangled-name='typec_unregister_altmode' filepath='drivers/usb/typec/class.c' line='560' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_unregister_altmode'>
+        <parameter type-id='02913b69' name='adev' filepath='drivers/usb/typec/class.c' line='560' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='typec_partner_set_identity' mangled-name='typec_partner_set_identity' filepath='drivers/usb/typec/class.c' line='618' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_partner_set_identity'>
-        <parameter type-id='33ca4bbb' name='partner' filepath='drivers/usb/typec/class.c' line='618' column='1'/>
+      <function-decl name='typec_partner_set_identity' mangled-name='typec_partner_set_identity' filepath='drivers/usb/typec/class.c' line='620' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_partner_set_identity'>
+        <parameter type-id='33ca4bbb' name='partner' filepath='drivers/usb/typec/class.c' line='620' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='typec_partner_register_altmode' mangled-name='typec_partner_register_altmode' filepath='drivers/usb/typec/class.c' line='641' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_partner_register_altmode'>
-        <parameter type-id='33ca4bbb' name='partner' filepath='drivers/usb/typec/class.c' line='641' column='1'/>
-        <parameter type-id='064c3738' name='desc' filepath='drivers/usb/typec/class.c' line='642' column='1'/>
+      <function-decl name='typec_partner_register_altmode' mangled-name='typec_partner_register_altmode' filepath='drivers/usb/typec/class.c' line='643' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_partner_register_altmode'>
+        <parameter type-id='33ca4bbb' name='partner' filepath='drivers/usb/typec/class.c' line='643' column='1'/>
+        <parameter type-id='064c3738' name='desc' filepath='drivers/usb/typec/class.c' line='644' column='1'/>
         <return type-id='02913b69'/>
       </function-decl>
-      <function-decl name='typec_register_partner' mangled-name='typec_register_partner' filepath='drivers/usb/typec/class.c' line='657' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_register_partner'>
-        <parameter type-id='b977ca56' name='port' filepath='drivers/usb/typec/class.c' line='657' column='1'/>
-        <parameter type-id='a5263fbd' name='desc' filepath='drivers/usb/typec/class.c' line='658' column='1'/>
+      <function-decl name='typec_register_partner' mangled-name='typec_register_partner' filepath='drivers/usb/typec/class.c' line='659' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_register_partner'>
+        <parameter type-id='b977ca56' name='port' filepath='drivers/usb/typec/class.c' line='659' column='1'/>
+        <parameter type-id='a5263fbd' name='desc' filepath='drivers/usb/typec/class.c' line='660' column='1'/>
         <return type-id='33ca4bbb'/>
       </function-decl>
-      <function-decl name='typec_unregister_partner' mangled-name='typec_unregister_partner' filepath='drivers/usb/typec/class.c' line='702' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_unregister_partner'>
-        <parameter type-id='33ca4bbb' name='partner' filepath='drivers/usb/typec/class.c' line='702' column='1'/>
+      <function-decl name='typec_unregister_partner' mangled-name='typec_unregister_partner' filepath='drivers/usb/typec/class.c' line='704' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_unregister_partner'>
+        <parameter type-id='33ca4bbb' name='partner' filepath='drivers/usb/typec/class.c' line='704' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='typec_set_data_role' mangled-name='typec_set_data_role' filepath='drivers/usb/typec/class.c' line='1313' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_set_data_role'>
-        <parameter type-id='b977ca56' name='port' filepath='drivers/usb/typec/class.c' line='1313' column='1'/>
-        <parameter type-id='e453a0cb' name='role' filepath='drivers/usb/typec/class.c' line='1313' column='1'/>
+      <function-decl name='typec_set_data_role' mangled-name='typec_set_data_role' filepath='drivers/usb/typec/class.c' line='1315' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_set_data_role'>
+        <parameter type-id='b977ca56' name='port' filepath='drivers/usb/typec/class.c' line='1315' column='1'/>
+        <parameter type-id='e453a0cb' name='role' filepath='drivers/usb/typec/class.c' line='1315' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='typec_set_pwr_role' mangled-name='typec_set_pwr_role' filepath='drivers/usb/typec/class.c' line='1331' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_set_pwr_role'>
-        <parameter type-id='b977ca56' name='port' filepath='drivers/usb/typec/class.c' line='1331' column='1'/>
-        <parameter type-id='ad61830a' name='role' filepath='drivers/usb/typec/class.c' line='1331' column='1'/>
+      <function-decl name='typec_set_pwr_role' mangled-name='typec_set_pwr_role' filepath='drivers/usb/typec/class.c' line='1333' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_set_pwr_role'>
+        <parameter type-id='b977ca56' name='port' filepath='drivers/usb/typec/class.c' line='1333' column='1'/>
+        <parameter type-id='ad61830a' name='role' filepath='drivers/usb/typec/class.c' line='1333' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='typec_set_vconn_role' mangled-name='typec_set_vconn_role' filepath='drivers/usb/typec/class.c' line='1350' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_set_vconn_role'>
-        <parameter type-id='b977ca56' name='port' filepath='drivers/usb/typec/class.c' line='1350' column='1'/>
-        <parameter type-id='ad61830a' name='role' filepath='drivers/usb/typec/class.c' line='1350' column='1'/>
+      <function-decl name='typec_set_vconn_role' mangled-name='typec_set_vconn_role' filepath='drivers/usb/typec/class.c' line='1352' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_set_vconn_role'>
+        <parameter type-id='b977ca56' name='port' filepath='drivers/usb/typec/class.c' line='1352' column='1'/>
+        <parameter type-id='ad61830a' name='role' filepath='drivers/usb/typec/class.c' line='1352' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='typec_set_pwr_opmode' mangled-name='typec_set_pwr_opmode' filepath='drivers/usb/typec/class.c' line='1376' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_set_pwr_opmode'>
-        <parameter type-id='b977ca56' name='port' filepath='drivers/usb/typec/class.c' line='1376' column='1'/>
-        <parameter type-id='44ea1984' name='opmode' filepath='drivers/usb/typec/class.c' line='1377' column='1'/>
+      <function-decl name='typec_set_pwr_opmode' mangled-name='typec_set_pwr_opmode' filepath='drivers/usb/typec/class.c' line='1378' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_set_pwr_opmode'>
+        <parameter type-id='b977ca56' name='port' filepath='drivers/usb/typec/class.c' line='1378' column='1'/>
+        <parameter type-id='44ea1984' name='opmode' filepath='drivers/usb/typec/class.c' line='1379' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='typec_find_port_power_role' mangled-name='typec_find_port_power_role' filepath='drivers/usb/typec/class.c' line='1410' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_find_port_power_role'>
-        <parameter type-id='80f4b756' name='name' filepath='drivers/usb/typec/class.c' line='1410' column='1'/>
+      <function-decl name='typec_find_port_power_role' mangled-name='typec_find_port_power_role' filepath='drivers/usb/typec/class.c' line='1412' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_find_port_power_role'>
+        <parameter type-id='80f4b756' name='name' filepath='drivers/usb/typec/class.c' line='1412' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='typec_find_power_role' mangled-name='typec_find_power_role' filepath='drivers/usb/typec/class.c' line='1425' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_find_power_role'>
-        <parameter type-id='80f4b756' name='name' filepath='drivers/usb/typec/class.c' line='1425' column='1'/>
+      <function-decl name='typec_find_power_role' mangled-name='typec_find_power_role' filepath='drivers/usb/typec/class.c' line='1427' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_find_power_role'>
+        <parameter type-id='80f4b756' name='name' filepath='drivers/usb/typec/class.c' line='1427' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='typec_find_port_data_role' mangled-name='typec_find_port_data_role' filepath='drivers/usb/typec/class.c' line='1439' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_find_port_data_role'>
-        <parameter type-id='80f4b756' name='name' filepath='drivers/usb/typec/class.c' line='1439' column='1'/>
+      <function-decl name='typec_find_port_data_role' mangled-name='typec_find_port_data_role' filepath='drivers/usb/typec/class.c' line='1441' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_find_port_data_role'>
+        <parameter type-id='80f4b756' name='name' filepath='drivers/usb/typec/class.c' line='1441' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='typec_set_orientation' mangled-name='typec_set_orientation' filepath='drivers/usb/typec/class.c' line='1456' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_set_orientation'>
-        <parameter type-id='b977ca56' name='port' filepath='drivers/usb/typec/class.c' line='1456' column='1'/>
-        <parameter type-id='131b0a9c' name='orientation' filepath='drivers/usb/typec/class.c' line='1457' column='1'/>
+      <function-decl name='typec_set_orientation' mangled-name='typec_set_orientation' filepath='drivers/usb/typec/class.c' line='1458' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_set_orientation'>
+        <parameter type-id='b977ca56' name='port' filepath='drivers/usb/typec/class.c' line='1458' column='1'/>
+        <parameter type-id='131b0a9c' name='orientation' filepath='drivers/usb/typec/class.c' line='1459' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='typec_set_mode' mangled-name='typec_set_mode' filepath='drivers/usb/typec/class.c' line='1493' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_set_mode'>
-        <parameter type-id='b977ca56' name='port' filepath='drivers/usb/typec/class.c' line='1493' column='1'/>
-        <parameter type-id='95e97e5e' name='mode' filepath='drivers/usb/typec/class.c' line='1493' column='1'/>
+      <function-decl name='typec_set_mode' mangled-name='typec_set_mode' filepath='drivers/usb/typec/class.c' line='1495' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_set_mode'>
+        <parameter type-id='b977ca56' name='port' filepath='drivers/usb/typec/class.c' line='1495' column='1'/>
+        <parameter type-id='95e97e5e' name='mode' filepath='drivers/usb/typec/class.c' line='1495' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='typec_port_register_altmode' mangled-name='typec_port_register_altmode' filepath='drivers/usb/typec/class.c' line='1512' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_port_register_altmode'>
-        <parameter type-id='b977ca56' name='port' filepath='drivers/usb/typec/class.c' line='1512' column='1'/>
-        <parameter type-id='064c3738' name='desc' filepath='drivers/usb/typec/class.c' line='1513' column='1'/>
+      <function-decl name='typec_port_register_altmode' mangled-name='typec_port_register_altmode' filepath='drivers/usb/typec/class.c' line='1514' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_port_register_altmode'>
+        <parameter type-id='b977ca56' name='port' filepath='drivers/usb/typec/class.c' line='1514' column='1'/>
+        <parameter type-id='064c3738' name='desc' filepath='drivers/usb/typec/class.c' line='1515' column='1'/>
         <return type-id='02913b69'/>
       </function-decl>
-      <function-decl name='typec_unregister_port' mangled-name='typec_unregister_port' filepath='drivers/usb/typec/class.c' line='1636' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_unregister_port'>
-        <parameter type-id='b977ca56' name='port' filepath='drivers/usb/typec/class.c' line='1636' column='1'/>
+      <function-decl name='typec_unregister_port' mangled-name='typec_unregister_port' filepath='drivers/usb/typec/class.c' line='1638' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='typec_unregister_port'>
+        <parameter type-id='b977ca56' name='port' filepath='drivers/usb/typec/class.c' line='1638' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
       <function-type size-in-bits='64' id='307c65d0'>
@@ -106816,12 +106794,12 @@
       </function-type>
     </abi-instr>
     <abi-instr address-size='64' path='fs/pipe.c' language='LANG_C89'>
-      <function-decl name='pipe_lock' mangled-name='pipe_lock' filepath='fs/pipe.c' line='65' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pipe_lock'>
-        <parameter type-id='15d29710' name='pipe' filepath='fs/pipe.c' line='65' column='1'/>
+      <function-decl name='pipe_lock' mangled-name='pipe_lock' filepath='fs/pipe.c' line='80' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pipe_lock'>
+        <parameter type-id='15d29710' name='pipe' filepath='fs/pipe.c' line='80' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='pipe_unlock' mangled-name='pipe_unlock' filepath='fs/pipe.c' line='74' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pipe_unlock'>
-        <parameter type-id='15d29710' name='pipe' filepath='fs/pipe.c' line='74' column='1'/>
+      <function-decl name='pipe_unlock' mangled-name='pipe_unlock' filepath='fs/pipe.c' line='89' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pipe_unlock'>
+        <parameter type-id='15d29710' name='pipe' filepath='fs/pipe.c' line='89' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
     </abi-instr>
@@ -106981,6 +106959,17 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='fs/proc/proc_net.c' language='LANG_C89'>
+      <union-decl name='__anonymous_union__2' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='2b7f7bf0'>
+        <data-member access='public'>
+          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='__UNIQUE_ID_android_kabi_hide59' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
+        </data-member>
+      </union-decl>
       <function-decl name='proc_create_net_single' mangled-name='proc_create_net_single' filepath='fs/proc/proc_net.c' line='177' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='proc_create_net_single'>
         <parameter type-id='80f4b756' name='name' filepath='fs/proc/proc_net.c' line='177' column='1'/>
         <parameter type-id='2594b00f' name='mode' filepath='fs/proc/proc_net.c' line='177' column='1'/>
@@ -107347,11 +107336,11 @@
       <pointer-type-def type-id='70084cf7' size-in-bits='64' id='78efe913'/>
     </abi-instr>
     <abi-instr address-size='64' path='fs/seq_file.c' language='LANG_C89'>
-      <function-decl name='seq_read' mangled-name='seq_read' filepath='fs/seq_file.c' line='153' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='seq_read'>
-        <parameter type-id='77e79a4b' name='file' filepath='fs/seq_file.c' line='153' column='1'/>
-        <parameter type-id='26a90f95' name='buf' filepath='fs/seq_file.c' line='153' column='1'/>
-        <parameter type-id='b59d7dce' name='size' filepath='fs/seq_file.c' line='153' column='1'/>
-        <parameter type-id='b53e8dbb' name='ppos' filepath='fs/seq_file.c' line='153' column='1'/>
+      <function-decl name='seq_read' mangled-name='seq_read' filepath='fs/seq_file.c' line='156' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='seq_read'>
+        <parameter type-id='77e79a4b' name='file' filepath='fs/seq_file.c' line='156' column='1'/>
+        <parameter type-id='26a90f95' name='buf' filepath='fs/seq_file.c' line='156' column='1'/>
+        <parameter type-id='b59d7dce' name='size' filepath='fs/seq_file.c' line='156' column='1'/>
+        <parameter type-id='b53e8dbb' name='ppos' filepath='fs/seq_file.c' line='156' column='1'/>
         <return type-id='79a0948f'/>
       </function-decl>
       <function-decl name='hex_dump_to_buffer' mangled-name='hex_dump_to_buffer' filepath='include/linux/printk.h' line='484' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hex_dump_to_buffer'>
@@ -109330,11 +109319,11 @@
       </enum-decl>
       <pointer-type-def type-id='708c2394' size-in-bits='64' id='282b7312'/>
       <pointer-type-def type-id='db7d07ef' size-in-bits='64' id='f02a5e83'/>
-      <var-decl name='cpu_bit_bitmap' type-id='f959706c' mangled-name='cpu_bit_bitmap' visibility='default' filepath='kernel/cpu.c' line='2240' column='1' elf-symbol-id='cpu_bit_bitmap'/>
-      <var-decl name='__cpu_possible_mask' type-id='1354385d' mangled-name='__cpu_possible_mask' visibility='default' filepath='kernel/cpu.c' line='2258' column='1' elf-symbol-id='__cpu_possible_mask'/>
-      <var-decl name='__cpu_online_mask' type-id='1354385d' mangled-name='__cpu_online_mask' visibility='default' filepath='kernel/cpu.c' line='2262' column='1' elf-symbol-id='__cpu_online_mask'/>
-      <var-decl name='__cpu_present_mask' type-id='1354385d' mangled-name='__cpu_present_mask' visibility='default' filepath='kernel/cpu.c' line='2265' column='1' elf-symbol-id='__cpu_present_mask'/>
-      <var-decl name='__cpu_isolated_mask' type-id='1354385d' mangled-name='__cpu_isolated_mask' visibility='default' filepath='kernel/cpu.c' line='2271' column='1' elf-symbol-id='__cpu_isolated_mask'/>
+      <var-decl name='cpu_bit_bitmap' type-id='f959706c' mangled-name='cpu_bit_bitmap' visibility='default' filepath='kernel/cpu.c' line='2289' column='1' elf-symbol-id='cpu_bit_bitmap'/>
+      <var-decl name='__cpu_possible_mask' type-id='1354385d' mangled-name='__cpu_possible_mask' visibility='default' filepath='kernel/cpu.c' line='2307' column='1' elf-symbol-id='__cpu_possible_mask'/>
+      <var-decl name='__cpu_online_mask' type-id='1354385d' mangled-name='__cpu_online_mask' visibility='default' filepath='kernel/cpu.c' line='2311' column='1' elf-symbol-id='__cpu_online_mask'/>
+      <var-decl name='__cpu_present_mask' type-id='1354385d' mangled-name='__cpu_present_mask' visibility='default' filepath='kernel/cpu.c' line='2314' column='1' elf-symbol-id='__cpu_present_mask'/>
+      <var-decl name='__cpu_isolated_mask' type-id='1354385d' mangled-name='__cpu_isolated_mask' visibility='default' filepath='kernel/cpu.c' line='2320' column='1' elf-symbol-id='__cpu_isolated_mask'/>
       <function-decl name='bpf_trace_run4' mangled-name='bpf_trace_run4' filepath='include/linux/trace_events.h' line='596' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bpf_trace_run4'>
         <parameter type-id='bdcee7ae'/>
         <parameter type-id='3a47d82b'/>
@@ -109361,30 +109350,30 @@
         <parameter type-id='d504f73d'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='__cpuhp_state_add_instance' mangled-name='__cpuhp_state_add_instance' filepath='kernel/cpu.c' line='1691' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cpuhp_state_add_instance'>
-        <parameter type-id='245a0e38' name='state' filepath='kernel/cpu.c' line='1691' column='1'/>
-        <parameter type-id='08cbad52' name='node' filepath='kernel/cpu.c' line='1691' column='1'/>
-        <parameter type-id='b50a4934' name='invoke' filepath='kernel/cpu.c' line='1692' column='1'/>
+      <function-decl name='__cpuhp_state_add_instance' mangled-name='__cpuhp_state_add_instance' filepath='kernel/cpu.c' line='1740' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cpuhp_state_add_instance'>
+        <parameter type-id='245a0e38' name='state' filepath='kernel/cpu.c' line='1740' column='1'/>
+        <parameter type-id='08cbad52' name='node' filepath='kernel/cpu.c' line='1740' column='1'/>
+        <parameter type-id='b50a4934' name='invoke' filepath='kernel/cpu.c' line='1741' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='__cpuhp_setup_state' mangled-name='__cpuhp_setup_state' filepath='kernel/cpu.c' line='1779' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cpuhp_setup_state'>
-        <parameter type-id='245a0e38' name='state' filepath='kernel/cpu.c' line='1779' column='1'/>
-        <parameter type-id='80f4b756' name='name' filepath='kernel/cpu.c' line='1780' column='1'/>
-        <parameter type-id='b50a4934' name='invoke' filepath='kernel/cpu.c' line='1780' column='1'/>
-        <parameter type-id='f02a5e83' name='startup' filepath='kernel/cpu.c' line='1781' column='1'/>
-        <parameter type-id='f02a5e83' name='teardown' filepath='kernel/cpu.c' line='1782' column='1'/>
-        <parameter type-id='b50a4934' name='multi_instance' filepath='kernel/cpu.c' line='1783' column='1'/>
+      <function-decl name='__cpuhp_setup_state' mangled-name='__cpuhp_setup_state' filepath='kernel/cpu.c' line='1828' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cpuhp_setup_state'>
+        <parameter type-id='245a0e38' name='state' filepath='kernel/cpu.c' line='1828' column='1'/>
+        <parameter type-id='80f4b756' name='name' filepath='kernel/cpu.c' line='1829' column='1'/>
+        <parameter type-id='b50a4934' name='invoke' filepath='kernel/cpu.c' line='1829' column='1'/>
+        <parameter type-id='f02a5e83' name='startup' filepath='kernel/cpu.c' line='1830' column='1'/>
+        <parameter type-id='f02a5e83' name='teardown' filepath='kernel/cpu.c' line='1831' column='1'/>
+        <parameter type-id='b50a4934' name='multi_instance' filepath='kernel/cpu.c' line='1832' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='__cpuhp_state_remove_instance' mangled-name='__cpuhp_state_remove_instance' filepath='kernel/cpu.c' line='1795' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cpuhp_state_remove_instance'>
-        <parameter type-id='245a0e38' name='state' filepath='kernel/cpu.c' line='1795' column='1'/>
-        <parameter type-id='08cbad52' name='node' filepath='kernel/cpu.c' line='1796' column='1'/>
-        <parameter type-id='b50a4934' name='invoke' filepath='kernel/cpu.c' line='1796' column='1'/>
+      <function-decl name='__cpuhp_state_remove_instance' mangled-name='__cpuhp_state_remove_instance' filepath='kernel/cpu.c' line='1844' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cpuhp_state_remove_instance'>
+        <parameter type-id='245a0e38' name='state' filepath='kernel/cpu.c' line='1844' column='1'/>
+        <parameter type-id='08cbad52' name='node' filepath='kernel/cpu.c' line='1845' column='1'/>
+        <parameter type-id='b50a4934' name='invoke' filepath='kernel/cpu.c' line='1845' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='__cpuhp_remove_state' mangled-name='__cpuhp_remove_state' filepath='kernel/cpu.c' line='1881' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cpuhp_remove_state'>
-        <parameter type-id='245a0e38' name='state' filepath='kernel/cpu.c' line='1881' column='1'/>
-        <parameter type-id='b50a4934' name='invoke' filepath='kernel/cpu.c' line='1881' column='1'/>
+      <function-decl name='__cpuhp_remove_state' mangled-name='__cpuhp_remove_state' filepath='kernel/cpu.c' line='1930' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cpuhp_remove_state'>
+        <parameter type-id='245a0e38' name='state' filepath='kernel/cpu.c' line='1930' column='1'/>
+        <parameter type-id='b50a4934' name='invoke' filepath='kernel/cpu.c' line='1930' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
       <function-decl name='kthread_park' mangled-name='kthread_park' filepath='include/linux/kthread.h' line='64' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kthread_park'>
@@ -109489,6 +109478,10 @@
       <array-type-def dimensions='1' type-id='8f048e17' size-in-bits='7584' id='e1f95b49'>
         <subrange length='948' type-id='7ff19f0f' id='9d8fc450'/>
       </array-type-def>
+      <array-type-def dimensions='1' type-id='f67e137c' size-in-bits='infinite' id='3f814540'>
+        <subrange length='infinite' type-id='7ff19f0f' id='031f2035'/>
+      </array-type-def>
+      <class-decl name='bpf_cgroup_storage_map' is-struct='yes' visibility='default' is-declaration-only='yes' id='0ad68707'/>
       <class-decl name='perf_event_mmap_page' size-in-bits='8704' is-struct='yes' visibility='default' filepath='include/uapi/linux/perf_event.h' line='473' column='1' id='a752caf1'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='version' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/perf_event.h' line='474' column='1'/>
@@ -109588,6 +109581,53 @@
           <var-decl name='cap_____res' type-id='d3130597' visibility='default' filepath='include/uapi/linux/perf_event.h' line='526' column='1'/>
         </data-member>
       </class-decl>
+      <class-decl name='bpf_prog_array_item' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/bpf.h' line='359' column='1' id='f67e137c'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='prog' type-id='bdcee7ae' visibility='default' filepath='include/linux/bpf.h' line='360' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='cgroup_storage' type-id='531c24d0' visibility='default' filepath='include/linux/bpf.h' line='361' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bpf_cgroup_storage' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/bpf-cgroup.h' line='34' column='1' id='15881542'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='buf' type-id='b1253746' visibility='default' filepath='include/linux/bpf-cgroup.h' line='35' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='map' type-id='b6a33eaf' visibility='default' filepath='include/linux/bpf-cgroup.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='key' type-id='d8d7111e' visibility='default' filepath='include/linux/bpf-cgroup.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='include/linux/bpf-cgroup.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='node' type-id='2a8a6332' visibility='default' filepath='include/linux/bpf-cgroup.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/linux/bpf-cgroup.h' line='40' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bpf_storage_buffer' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/bpf-cgroup.h' line='29' column='1' id='0ef5c7e0'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/linux/bpf-cgroup.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='data' type-id='e84913bd' visibility='default' filepath='include/linux/bpf-cgroup.h' line='31' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='bpf_cgroup_storage_key' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='78' column='1' id='d8d7111e'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cgroup_inode_id' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='attach_type' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='80' column='1'/>
+        </data-member>
+      </class-decl>
+      <pointer-type-def type-id='15881542' size-in-bits='64' id='531c24d0'/>
+      <pointer-type-def type-id='0ad68707' size-in-bits='64' id='b6a33eaf'/>
+      <pointer-type-def type-id='0ef5c7e0' size-in-bits='64' id='b1253746'/>
       <pointer-type-def type-id='a752caf1' size-in-bits='64' id='4b860c99'/>
       <function-decl name='perf_pmu_register' mangled-name='perf_pmu_register' filepath='kernel/events/core.c' line='9708' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='perf_pmu_register'>
         <parameter type-id='0906f5b9' name='pmu' filepath='kernel/events/core.c' line='9708' column='1'/>
@@ -109650,7 +109690,7 @@
       <pointer-type-def type-id='3aa8a3a4' size-in-bits='64' id='e579788a'/>
       <pointer-type-def type-id='faa28adf' size-in-bits='64' id='46d78c8b'/>
       <pointer-type-def type-id='17483488' size-in-bits='64' id='24e78d82'/>
-      <function-decl name='mm_trace_rss_stat' mangled-name='mm_trace_rss_stat' filepath='include/linux/mm.h' line='1667' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mm_trace_rss_stat'>
+      <function-decl name='mm_trace_rss_stat' mangled-name='mm_trace_rss_stat' filepath='include/linux/mm.h' line='1670' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mm_trace_rss_stat'>
         <parameter type-id='df4b7819'/>
         <parameter type-id='95e97e5e'/>
         <parameter type-id='bd54fe1a'/>
@@ -109854,7 +109894,7 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='kernel/futex.c' language='LANG_C89'>
-      <function-decl name='unlock_page' mangled-name='unlock_page' filepath='include/linux/pagemap.h' line='468' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='unlock_page'>
+      <function-decl name='unlock_page' mangled-name='unlock_page' filepath='include/linux/pagemap.h' line='469' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='unlock_page'>
         <parameter type-id='02f11ed4'/>
         <return type-id='48b5725f'/>
       </function-decl>
@@ -110167,22 +110207,22 @@
         <parameter type-id='401eb95c' name='work' filepath='kernel/kthread.c' line='981' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='kthread_mod_delayed_work' mangled-name='kthread_mod_delayed_work' filepath='kernel/kthread.c' line='1080' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kthread_mod_delayed_work'>
-        <parameter type-id='c41f4539' name='worker' filepath='kernel/kthread.c' line='1080' column='1'/>
-        <parameter type-id='d56697f1' name='dwork' filepath='kernel/kthread.c' line='1081' column='1'/>
-        <parameter type-id='7359adad' name='delay' filepath='kernel/kthread.c' line='1082' column='1'/>
+      <function-decl name='kthread_mod_delayed_work' mangled-name='kthread_mod_delayed_work' filepath='kernel/kthread.c' line='1090' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kthread_mod_delayed_work'>
+        <parameter type-id='c41f4539' name='worker' filepath='kernel/kthread.c' line='1090' column='1'/>
+        <parameter type-id='d56697f1' name='dwork' filepath='kernel/kthread.c' line='1091' column='1'/>
+        <parameter type-id='7359adad' name='delay' filepath='kernel/kthread.c' line='1092' column='1'/>
         <return type-id='b50a4934'/>
       </function-decl>
-      <function-decl name='kthread_cancel_work_sync' mangled-name='kthread_cancel_work_sync' filepath='kernel/kthread.c' line='1160' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kthread_cancel_work_sync'>
-        <parameter type-id='401eb95c' name='work' filepath='kernel/kthread.c' line='1160' column='1'/>
+      <function-decl name='kthread_cancel_work_sync' mangled-name='kthread_cancel_work_sync' filepath='kernel/kthread.c' line='1185' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kthread_cancel_work_sync'>
+        <parameter type-id='401eb95c' name='work' filepath='kernel/kthread.c' line='1185' column='1'/>
         <return type-id='b50a4934'/>
       </function-decl>
-      <function-decl name='kthread_cancel_delayed_work_sync' mangled-name='kthread_cancel_delayed_work_sync' filepath='kernel/kthread.c' line='1175' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kthread_cancel_delayed_work_sync'>
-        <parameter type-id='d56697f1' name='dwork' filepath='kernel/kthread.c' line='1175' column='1'/>
+      <function-decl name='kthread_cancel_delayed_work_sync' mangled-name='kthread_cancel_delayed_work_sync' filepath='kernel/kthread.c' line='1200' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kthread_cancel_delayed_work_sync'>
+        <parameter type-id='d56697f1' name='dwork' filepath='kernel/kthread.c' line='1200' column='1'/>
         <return type-id='b50a4934'/>
       </function-decl>
-      <function-decl name='kthread_flush_worker' mangled-name='kthread_flush_worker' filepath='kernel/kthread.c' line='1188' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kthread_flush_worker'>
-        <parameter type-id='c41f4539' name='worker' filepath='kernel/kthread.c' line='1188' column='1'/>
+      <function-decl name='kthread_flush_worker' mangled-name='kthread_flush_worker' filepath='kernel/kthread.c' line='1213' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kthread_flush_worker'>
+        <parameter type-id='c41f4539' name='worker' filepath='kernel/kthread.c' line='1213' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
     </abi-instr>
@@ -110306,12 +110346,12 @@
       <array-type-def dimensions='1' type-id='def413c9' size-in-bits='infinite' id='ae08da59'>
         <subrange length='infinite' type-id='7ff19f0f' id='031f2035'/>
       </array-type-def>
-      <class-decl name='module_sect_attr' size-in-bits='512' is-struct='yes' visibility='default' filepath='kernel/module.c' line='1455' column='1' id='def413c9'>
+      <class-decl name='module_sect_attr' size-in-bits='512' is-struct='yes' visibility='default' filepath='kernel/module.c' line='1464' column='1' id='def413c9'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='battr' type-id='d83a2db1' visibility='default' filepath='kernel/module.c' line='1456' column='1'/>
+          <var-decl name='battr' type-id='d83a2db1' visibility='default' filepath='kernel/module.c' line='1465' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='address' type-id='7359adad' visibility='default' filepath='kernel/module.c' line='1457' column='1'/>
+          <var-decl name='address' type-id='7359adad' visibility='default' filepath='kernel/module.c' line='1466' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='modversion_info' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/module.h' line='38' column='1' id='68a2869e'>
@@ -110325,16 +110365,16 @@
       <pointer-type-def type-id='9493d3c9' size-in-bits='64' id='eefd7061'/>
       <pointer-type-def type-id='68a2869e' size-in-bits='64' id='3a498c74'/>
       <pointer-type-def type-id='d2d812d1' size-in-bits='64' id='e525e121'/>
-      <function-decl name='__module_get' mangled-name='__module_get' filepath='kernel/module.c' line='1101' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__module_get'>
-        <parameter type-id='2730d015' name='module' filepath='kernel/module.c' line='1101' column='1'/>
+      <function-decl name='__module_get' mangled-name='__module_get' filepath='kernel/module.c' line='1110' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__module_get'>
+        <parameter type-id='2730d015' name='module' filepath='kernel/module.c' line='1110' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='module_layout' mangled-name='module_layout' filepath='kernel/module.c' line='4481' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='module_layout'>
-        <parameter type-id='2730d015' name='mod' filepath='kernel/module.c' line='4481' column='1'/>
-        <parameter type-id='3a498c74' name='ver' filepath='kernel/module.c' line='4482' column='1'/>
-        <parameter type-id='a7c6e908' name='kp' filepath='kernel/module.c' line='4483' column='1'/>
-        <parameter type-id='eefd7061' name='ks' filepath='kernel/module.c' line='4484' column='1'/>
-        <parameter type-id='e525e121' name='tp' filepath='kernel/module.c' line='4485' column='1'/>
+      <function-decl name='module_layout' mangled-name='module_layout' filepath='kernel/module.c' line='4490' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='module_layout'>
+        <parameter type-id='2730d015' name='mod' filepath='kernel/module.c' line='4490' column='1'/>
+        <parameter type-id='3a498c74' name='ver' filepath='kernel/module.c' line='4491' column='1'/>
+        <parameter type-id='a7c6e908' name='kp' filepath='kernel/module.c' line='4492' column='1'/>
+        <parameter type-id='eefd7061' name='ks' filepath='kernel/module.c' line='4493' column='1'/>
+        <parameter type-id='e525e121' name='tp' filepath='kernel/module.c' line='4494' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
       <function-decl name='sysfs_remove_link' mangled-name='sysfs_remove_link' filepath='include/linux/sysfs.h' line='258' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sysfs_remove_link'>
@@ -115030,6 +115070,14 @@
       </class-decl>
       <typedef-decl name='key_serial_t' type-id='3ff5601b' filepath='include/linux/key.h' line='33' column='1' id='c84025ab'/>
       <typedef-decl name='int32_t' type-id='a7832498' filepath='include/linux/types.h' line='103' column='1' id='3ff5601b'/>
+      <union-decl name='key_payload' size-in-bits='256' visibility='default' filepath='include/linux/key.h' line='94' column='1' id='2888d74a'>
+        <data-member access='public'>
+          <var-decl name='rcu_data0' type-id='eaa32e2f' visibility='default' filepath='include/linux/key.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='data' type-id='209ef23f' visibility='default' filepath='include/linux/key.h' line='96' column='1'/>
+        </data-member>
+      </union-decl>
       <union-decl name='__anonymous_union__3' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='158' column='1' id='1a65b0a7'>
         <data-member access='public'>
           <var-decl name='graveyard_link' type-id='72f469ec' visibility='default' filepath='include/linux/key.h' line='159' column='1'/>
@@ -115098,14 +115146,6 @@
           <var-decl name='nr_leaves_on_tree' type-id='7359adad' visibility='default' filepath='include/linux/assoc_array.h' line='28' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='key_payload' size-in-bits='256' visibility='default' filepath='include/linux/key.h' line='94' column='1' id='2888d74a'>
-        <data-member access='public'>
-          <var-decl name='rcu_data0' type-id='eaa32e2f' visibility='default' filepath='include/linux/key.h' line='95' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='data' type-id='209ef23f' visibility='default' filepath='include/linux/key.h' line='96' column='1'/>
-        </data-member>
-      </union-decl>
       <class-decl name='key_restriction' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/key.h' line='136' column='1' id='fe81ecb9'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='check' type-id='f87a5fab' visibility='default' filepath='include/linux/key.h' line='137' column='1'/>
@@ -115903,242 +115943,242 @@
         </data-member>
       </class-decl>
       <typedef-decl name='percpu_ref_func_t' type-id='96650caf' filepath='include/linux/percpu-refcount.h' line='60' column='1' id='ed7b7f6b'/>
-      <class-decl name='cgroup_subsys_state' size-in-bits='2176' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='127' column='1' id='7f3df443'>
+      <class-decl name='cgroup_subsys_state' size-in-bits='2176' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='128' column='1' id='7f3df443'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='cgroup' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='129' column='1'/>
+          <var-decl name='cgroup' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='130' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='ss' type-id='dc91d125' visibility='default' filepath='include/linux/cgroup-defs.h' line='132' column='1'/>
+          <var-decl name='ss' type-id='dc91d125' visibility='default' filepath='include/linux/cgroup-defs.h' line='133' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='refcnt' type-id='818799b4' visibility='default' filepath='include/linux/cgroup-defs.h' line='135' column='1'/>
+          <var-decl name='refcnt' type-id='818799b4' visibility='default' filepath='include/linux/cgroup-defs.h' line='136' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='sibling' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='138' column='1'/>
+          <var-decl name='sibling' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='139' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='children' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='139' column='1'/>
+          <var-decl name='children' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='140' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='rstat_css_node' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='142' column='1'/>
+          <var-decl name='rstat_css_node' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='143' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='960'>
-          <var-decl name='id' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='148' column='1'/>
+          <var-decl name='id' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='149' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='992'>
-          <var-decl name='flags' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='150' column='1'/>
+          <var-decl name='flags' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='151' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='serial_nr' type-id='91ce1af9' visibility='default' filepath='include/linux/cgroup-defs.h' line='158' column='1'/>
+          <var-decl name='serial_nr' type-id='91ce1af9' visibility='default' filepath='include/linux/cgroup-defs.h' line='159' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1088'>
-          <var-decl name='online_cnt' type-id='49178f86' visibility='default' filepath='include/linux/cgroup-defs.h' line='164' column='1'/>
+          <var-decl name='online_cnt' type-id='49178f86' visibility='default' filepath='include/linux/cgroup-defs.h' line='165' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1152'>
-          <var-decl name='destroy_work' type-id='ef9025d0' visibility='default' filepath='include/linux/cgroup-defs.h' line='167' column='1'/>
+          <var-decl name='destroy_work' type-id='ef9025d0' visibility='default' filepath='include/linux/cgroup-defs.h' line='168' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1536'>
-          <var-decl name='destroy_rwork' type-id='7c0b9fdb' visibility='default' filepath='include/linux/cgroup-defs.h' line='168' column='1'/>
+          <var-decl name='destroy_rwork' type-id='7c0b9fdb' visibility='default' filepath='include/linux/cgroup-defs.h' line='169' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2112'>
-          <var-decl name='parent' type-id='cfff5953' visibility='default' filepath='include/linux/cgroup-defs.h' line='174' column='1'/>
+          <var-decl name='parent' type-id='cfff5953' visibility='default' filepath='include/linux/cgroup-defs.h' line='175' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cgroup' size-in-bits='17856' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='345' column='1' id='ab9643dd'>
+      <class-decl name='cgroup' size-in-bits='17856' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='346' column='1' id='ab9643dd'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='self' type-id='7f3df443' visibility='default' filepath='include/linux/cgroup-defs.h' line='347' column='1'/>
+          <var-decl name='self' type-id='7f3df443' visibility='default' filepath='include/linux/cgroup-defs.h' line='348' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2176'>
-          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='include/linux/cgroup-defs.h' line='349' column='1'/>
+          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='include/linux/cgroup-defs.h' line='350' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2240'>
-          <var-decl name='id' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='359' column='1'/>
+          <var-decl name='id' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='360' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2272'>
-          <var-decl name='level' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='367' column='1'/>
+          <var-decl name='level' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='368' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2304'>
-          <var-decl name='max_depth' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='370' column='1'/>
+          <var-decl name='max_depth' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='371' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2336'>
-          <var-decl name='nr_descendants' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='383' column='1'/>
+          <var-decl name='nr_descendants' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='384' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2368'>
-          <var-decl name='nr_dying_descendants' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='384' column='1'/>
+          <var-decl name='nr_dying_descendants' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='385' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2400'>
-          <var-decl name='max_descendants' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='385' column='1'/>
+          <var-decl name='max_descendants' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='386' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2432'>
-          <var-decl name='nr_populated_csets' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='398' column='1'/>
+          <var-decl name='nr_populated_csets' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='399' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2464'>
-          <var-decl name='nr_populated_domain_children' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='399' column='1'/>
+          <var-decl name='nr_populated_domain_children' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='400' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2496'>
-          <var-decl name='nr_populated_threaded_children' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='400' column='1'/>
+          <var-decl name='nr_populated_threaded_children' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='401' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2528'>
-          <var-decl name='nr_threaded_children' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='402' column='1'/>
+          <var-decl name='nr_threaded_children' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='403' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2560'>
-          <var-decl name='kn' type-id='150efd3f' visibility='default' filepath='include/linux/cgroup-defs.h' line='404' column='1'/>
+          <var-decl name='kn' type-id='150efd3f' visibility='default' filepath='include/linux/cgroup-defs.h' line='405' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2624'>
-          <var-decl name='procs_file' type-id='37a4ee40' visibility='default' filepath='include/linux/cgroup-defs.h' line='405' column='1'/>
+          <var-decl name='procs_file' type-id='37a4ee40' visibility='default' filepath='include/linux/cgroup-defs.h' line='406' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3200'>
-          <var-decl name='events_file' type-id='37a4ee40' visibility='default' filepath='include/linux/cgroup-defs.h' line='406' column='1'/>
+          <var-decl name='events_file' type-id='37a4ee40' visibility='default' filepath='include/linux/cgroup-defs.h' line='407' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3776'>
-          <var-decl name='subtree_control' type-id='1dc6a898' visibility='default' filepath='include/linux/cgroup-defs.h' line='415' column='1'/>
+          <var-decl name='subtree_control' type-id='1dc6a898' visibility='default' filepath='include/linux/cgroup-defs.h' line='416' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3792'>
-          <var-decl name='subtree_ss_mask' type-id='1dc6a898' visibility='default' filepath='include/linux/cgroup-defs.h' line='416' column='1'/>
+          <var-decl name='subtree_ss_mask' type-id='1dc6a898' visibility='default' filepath='include/linux/cgroup-defs.h' line='417' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3808'>
-          <var-decl name='old_subtree_control' type-id='1dc6a898' visibility='default' filepath='include/linux/cgroup-defs.h' line='417' column='1'/>
+          <var-decl name='old_subtree_control' type-id='1dc6a898' visibility='default' filepath='include/linux/cgroup-defs.h' line='418' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3824'>
-          <var-decl name='old_subtree_ss_mask' type-id='1dc6a898' visibility='default' filepath='include/linux/cgroup-defs.h' line='418' column='1'/>
+          <var-decl name='old_subtree_ss_mask' type-id='1dc6a898' visibility='default' filepath='include/linux/cgroup-defs.h' line='419' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3840'>
-          <var-decl name='subsys' type-id='75781a60' visibility='default' filepath='include/linux/cgroup-defs.h' line='421' column='1'/>
+          <var-decl name='subsys' type-id='75781a60' visibility='default' filepath='include/linux/cgroup-defs.h' line='422' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='4288'>
-          <var-decl name='root' type-id='aede2cf0' visibility='default' filepath='include/linux/cgroup-defs.h' line='423' column='1'/>
+          <var-decl name='root' type-id='aede2cf0' visibility='default' filepath='include/linux/cgroup-defs.h' line='424' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='4352'>
-          <var-decl name='cset_links' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='429' column='1'/>
+          <var-decl name='cset_links' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='430' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='4480'>
-          <var-decl name='e_csets' type-id='a8e439b9' visibility='default' filepath='include/linux/cgroup-defs.h' line='438' column='1'/>
+          <var-decl name='e_csets' type-id='a8e439b9' visibility='default' filepath='include/linux/cgroup-defs.h' line='439' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5376'>
-          <var-decl name='dom_cgrp' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='447' column='1'/>
+          <var-decl name='dom_cgrp' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='448' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5440'>
-          <var-decl name='old_dom_cgrp' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='448' column='1'/>
+          <var-decl name='old_dom_cgrp' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='449' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5504'>
-          <var-decl name='rstat_cpu' type-id='d8e759a7' visibility='default' filepath='include/linux/cgroup-defs.h' line='451' column='1'/>
+          <var-decl name='rstat_cpu' type-id='d8e759a7' visibility='default' filepath='include/linux/cgroup-defs.h' line='452' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5568'>
-          <var-decl name='rstat_css_list' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='452' column='1'/>
+          <var-decl name='rstat_css_list' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='453' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5696'>
-          <var-decl name='pending_bstat' type-id='cfd8587e' visibility='default' filepath='include/linux/cgroup-defs.h' line='455' column='1'/>
+          <var-decl name='pending_bstat' type-id='cfd8587e' visibility='default' filepath='include/linux/cgroup-defs.h' line='456' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5888'>
-          <var-decl name='bstat' type-id='cfd8587e' visibility='default' filepath='include/linux/cgroup-defs.h' line='456' column='1'/>
+          <var-decl name='bstat' type-id='cfd8587e' visibility='default' filepath='include/linux/cgroup-defs.h' line='457' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6080'>
-          <var-decl name='prev_cputime' type-id='9c7bf560' visibility='default' filepath='include/linux/cgroup-defs.h' line='457' column='1'/>
+          <var-decl name='prev_cputime' type-id='9c7bf560' visibility='default' filepath='include/linux/cgroup-defs.h' line='458' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6272'>
-          <var-decl name='pidlists' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='463' column='1'/>
+          <var-decl name='pidlists' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='464' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6400'>
-          <var-decl name='pidlist_mutex' type-id='925167dc' visibility='default' filepath='include/linux/cgroup-defs.h' line='464' column='1'/>
+          <var-decl name='pidlist_mutex' type-id='925167dc' visibility='default' filepath='include/linux/cgroup-defs.h' line='465' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6656'>
-          <var-decl name='offline_waitq' type-id='b5ab048f' visibility='default' filepath='include/linux/cgroup-defs.h' line='467' column='1'/>
+          <var-decl name='offline_waitq' type-id='b5ab048f' visibility='default' filepath='include/linux/cgroup-defs.h' line='468' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6848'>
-          <var-decl name='release_agent_work' type-id='ef9025d0' visibility='default' filepath='include/linux/cgroup-defs.h' line='470' column='1'/>
+          <var-decl name='release_agent_work' type-id='ef9025d0' visibility='default' filepath='include/linux/cgroup-defs.h' line='471' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='7232'>
-          <var-decl name='psi' type-id='12878ab3' visibility='default' filepath='include/linux/cgroup-defs.h' line='473' column='1'/>
+          <var-decl name='psi' type-id='12878ab3' visibility='default' filepath='include/linux/cgroup-defs.h' line='474' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='12672'>
-          <var-decl name='bpf' type-id='b80e3996' visibility='default' filepath='include/linux/cgroup-defs.h' line='476' column='1'/>
+          <var-decl name='bpf' type-id='b80e3996' visibility='default' filepath='include/linux/cgroup-defs.h' line='477' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17472'>
-          <var-decl name='congestion_count' type-id='49178f86' visibility='default' filepath='include/linux/cgroup-defs.h' line='479' column='1'/>
+          <var-decl name='congestion_count' type-id='49178f86' visibility='default' filepath='include/linux/cgroup-defs.h' line='480' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17504'>
-          <var-decl name='freezer' type-id='ad50988b' visibility='default' filepath='include/linux/cgroup-defs.h' line='482' column='1'/>
+          <var-decl name='freezer' type-id='ad50988b' visibility='default' filepath='include/linux/cgroup-defs.h' line='483' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17664'>
-          <var-decl name='android_kabi_reserved1' type-id='91ce1af9' visibility='default' filepath='include/linux/cgroup-defs.h' line='484' column='1'/>
+          <var-decl name='android_kabi_reserved1' type-id='91ce1af9' visibility='default' filepath='include/linux/cgroup-defs.h' line='485' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17728'>
-          <var-decl name='android_kabi_reserved2' type-id='91ce1af9' visibility='default' filepath='include/linux/cgroup-defs.h' line='485' column='1'/>
+          <var-decl name='android_kabi_reserved2' type-id='91ce1af9' visibility='default' filepath='include/linux/cgroup-defs.h' line='486' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17792'>
-          <var-decl name='android_kabi_reserved3' type-id='91ce1af9' visibility='default' filepath='include/linux/cgroup-defs.h' line='486' column='1'/>
+          <var-decl name='android_kabi_reserved3' type-id='91ce1af9' visibility='default' filepath='include/linux/cgroup-defs.h' line='487' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17856'>
-          <var-decl name='ancestor_ids' type-id='1fdc7fa6' visibility='default' filepath='include/linux/cgroup-defs.h' line='489' column='1'/>
+          <var-decl name='ancestor_ids' type-id='1fdc7fa6' visibility='default' filepath='include/linux/cgroup-defs.h' line='490' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cgroup_file' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='113' column='1' id='37a4ee40'>
+      <class-decl name='cgroup_file' size-in-bits='576' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='114' column='1' id='37a4ee40'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='kn' type-id='150efd3f' visibility='default' filepath='include/linux/cgroup-defs.h' line='115' column='1'/>
+          <var-decl name='kn' type-id='150efd3f' visibility='default' filepath='include/linux/cgroup-defs.h' line='116' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='notified_at' type-id='7359adad' visibility='default' filepath='include/linux/cgroup-defs.h' line='116' column='1'/>
+          <var-decl name='notified_at' type-id='7359adad' visibility='default' filepath='include/linux/cgroup-defs.h' line='117' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='notify_timer' type-id='abe41e67' visibility='default' filepath='include/linux/cgroup-defs.h' line='117' column='1'/>
+          <var-decl name='notify_timer' type-id='abe41e67' visibility='default' filepath='include/linux/cgroup-defs.h' line='118' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cgroup_root' size-in-bits='51712' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='497' column='1' id='66f1e832'>
+      <class-decl name='cgroup_root' size-in-bits='51712' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='498' column='1' id='66f1e832'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='kf_root' type-id='e18defdb' visibility='default' filepath='include/linux/cgroup-defs.h' line='498' column='1'/>
+          <var-decl name='kf_root' type-id='e18defdb' visibility='default' filepath='include/linux/cgroup-defs.h' line='499' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='subsys_mask' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='501' column='1'/>
+          <var-decl name='subsys_mask' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='502' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='hierarchy_id' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='504' column='1'/>
+          <var-decl name='hierarchy_id' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='505' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='cgrp' type-id='ab9643dd' visibility='default' filepath='include/linux/cgroup-defs.h' line='507' column='1'/>
+          <var-decl name='cgrp' type-id='ab9643dd' visibility='default' filepath='include/linux/cgroup-defs.h' line='508' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='17984'>
-          <var-decl name='cgrp_ancestor_id_storage' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='510' column='1'/>
+          <var-decl name='cgrp_ancestor_id_storage' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='511' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='18016'>
-          <var-decl name='nr_cgrps' type-id='49178f86' visibility='default' filepath='include/linux/cgroup-defs.h' line='513' column='1'/>
+          <var-decl name='nr_cgrps' type-id='49178f86' visibility='default' filepath='include/linux/cgroup-defs.h' line='514' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='18048'>
-          <var-decl name='root_list' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='516' column='1'/>
+          <var-decl name='root_list' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='517' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='18176'>
-          <var-decl name='flags' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='519' column='1'/>
+          <var-decl name='flags' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='520' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='18240'>
-          <var-decl name='cgroup_idr' type-id='37ce495e' visibility='default' filepath='include/linux/cgroup-defs.h' line='522' column='1'/>
+          <var-decl name='cgroup_idr' type-id='37ce495e' visibility='default' filepath='include/linux/cgroup-defs.h' line='523' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='18432'>
-          <var-decl name='release_agent_path' type-id='d16c6df4' visibility='default' filepath='include/linux/cgroup-defs.h' line='525' column='1'/>
+          <var-decl name='release_agent_path' type-id='d16c6df4' visibility='default' filepath='include/linux/cgroup-defs.h' line='526' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='51200'>
-          <var-decl name='name' type-id='59daf3ef' visibility='default' filepath='include/linux/cgroup-defs.h' line='528' column='1'/>
+          <var-decl name='name' type-id='59daf3ef' visibility='default' filepath='include/linux/cgroup-defs.h' line='529' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cgroup_rstat_cpu' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='297' column='1' id='a73d96cf'>
+      <class-decl name='cgroup_rstat_cpu' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='298' column='1' id='a73d96cf'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='bsync' type-id='e4d85780' visibility='default' filepath='include/linux/cgroup-defs.h' line='302' column='1'/>
+          <var-decl name='bsync' type-id='e4d85780' visibility='default' filepath='include/linux/cgroup-defs.h' line='303' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='bstat' type-id='cfd8587e' visibility='default' filepath='include/linux/cgroup-defs.h' line='303' column='1'/>
+          <var-decl name='bstat' type-id='cfd8587e' visibility='default' filepath='include/linux/cgroup-defs.h' line='304' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='last_bstat' type-id='cfd8587e' visibility='default' filepath='include/linux/cgroup-defs.h' line='309' column='1'/>
+          <var-decl name='last_bstat' type-id='cfd8587e' visibility='default' filepath='include/linux/cgroup-defs.h' line='310' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='updated_children' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='322' column='1'/>
+          <var-decl name='updated_children' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='323' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='updated_next' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='323' column='1'/>
+          <var-decl name='updated_next' type-id='46ff135d' visibility='default' filepath='include/linux/cgroup-defs.h' line='324' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='u64_stats_sync' is-struct='yes' visibility='default' filepath='include/linux/u64_stats_sync.h' line='65' column='1' id='e4d85780'/>
-      <class-decl name='cgroup_base_stat' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='273' column='1' id='cfd8587e'>
+      <class-decl name='cgroup_base_stat' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='274' column='1' id='cfd8587e'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='cputime' type-id='ad6873f4' visibility='default' filepath='include/linux/cgroup-defs.h' line='274' column='1'/>
+          <var-decl name='cputime' type-id='ad6873f4' visibility='default' filepath='include/linux/cgroup-defs.h' line='275' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='psi_group' size-in-bits='5440' is-struct='yes' visibility='default' filepath='include/linux/psi_types.h' line='128' column='1' id='12878ab3'>
@@ -116277,178 +116317,178 @@
           <var-decl name='inactive' type-id='380c7edc' visibility='default' filepath='include/linux/bpf-cgroup.h' line='64' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cgroup_freezer_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='326' column='1' id='ad50988b'>
+      <class-decl name='cgroup_freezer_state' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='327' column='1' id='ad50988b'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='freeze' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='328' column='1'/>
+          <var-decl name='freeze' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='329' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='e_freeze' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='331' column='1'/>
+          <var-decl name='e_freeze' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='332' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='nr_frozen_descendants' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='336' column='1'/>
+          <var-decl name='nr_frozen_descendants' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='337' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='nr_frozen_tasks' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='342' column='1'/>
+          <var-decl name='nr_frozen_tasks' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='343' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cgroup_subsys' size-in-bits='1920' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='627' column='1' id='1d115fd5'>
+      <class-decl name='cgroup_subsys' size-in-bits='1920' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='628' column='1' id='1d115fd5'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='css_alloc' type-id='a87691ee' visibility='default' filepath='include/linux/cgroup-defs.h' line='628' column='1'/>
+          <var-decl name='css_alloc' type-id='a87691ee' visibility='default' filepath='include/linux/cgroup-defs.h' line='629' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='css_online' type-id='8bdbbb63' visibility='default' filepath='include/linux/cgroup-defs.h' line='629' column='1'/>
+          <var-decl name='css_online' type-id='8bdbbb63' visibility='default' filepath='include/linux/cgroup-defs.h' line='630' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='css_offline' type-id='f65daff2' visibility='default' filepath='include/linux/cgroup-defs.h' line='630' column='1'/>
+          <var-decl name='css_offline' type-id='f65daff2' visibility='default' filepath='include/linux/cgroup-defs.h' line='631' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='css_released' type-id='f65daff2' visibility='default' filepath='include/linux/cgroup-defs.h' line='631' column='1'/>
+          <var-decl name='css_released' type-id='f65daff2' visibility='default' filepath='include/linux/cgroup-defs.h' line='632' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='css_free' type-id='f65daff2' visibility='default' filepath='include/linux/cgroup-defs.h' line='632' column='1'/>
+          <var-decl name='css_free' type-id='f65daff2' visibility='default' filepath='include/linux/cgroup-defs.h' line='633' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='css_reset' type-id='f65daff2' visibility='default' filepath='include/linux/cgroup-defs.h' line='633' column='1'/>
+          <var-decl name='css_reset' type-id='f65daff2' visibility='default' filepath='include/linux/cgroup-defs.h' line='634' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='css_rstat_flush' type-id='fe17c379' visibility='default' filepath='include/linux/cgroup-defs.h' line='634' column='1'/>
+          <var-decl name='css_rstat_flush' type-id='fe17c379' visibility='default' filepath='include/linux/cgroup-defs.h' line='635' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='css_extra_stat_show' type-id='f22a42d7' visibility='default' filepath='include/linux/cgroup-defs.h' line='635' column='1'/>
+          <var-decl name='css_extra_stat_show' type-id='f22a42d7' visibility='default' filepath='include/linux/cgroup-defs.h' line='636' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='can_attach' type-id='354bcec3' visibility='default' filepath='include/linux/cgroup-defs.h' line='638' column='1'/>
+          <var-decl name='can_attach' type-id='354bcec3' visibility='default' filepath='include/linux/cgroup-defs.h' line='639' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='cancel_attach' type-id='6484073c' visibility='default' filepath='include/linux/cgroup-defs.h' line='639' column='1'/>
+          <var-decl name='cancel_attach' type-id='6484073c' visibility='default' filepath='include/linux/cgroup-defs.h' line='640' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='640'>
-          <var-decl name='attach' type-id='6484073c' visibility='default' filepath='include/linux/cgroup-defs.h' line='640' column='1'/>
+          <var-decl name='attach' type-id='6484073c' visibility='default' filepath='include/linux/cgroup-defs.h' line='641' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='post_attach' type-id='953b12f8' visibility='default' filepath='include/linux/cgroup-defs.h' line='641' column='1'/>
+          <var-decl name='post_attach' type-id='953b12f8' visibility='default' filepath='include/linux/cgroup-defs.h' line='642' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='768'>
-          <var-decl name='can_fork' type-id='2c2624ea' visibility='default' filepath='include/linux/cgroup-defs.h' line='642' column='1'/>
+          <var-decl name='can_fork' type-id='2c2624ea' visibility='default' filepath='include/linux/cgroup-defs.h' line='643' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='cancel_fork' type-id='1c9e19fb' visibility='default' filepath='include/linux/cgroup-defs.h' line='643' column='1'/>
+          <var-decl name='cancel_fork' type-id='1c9e19fb' visibility='default' filepath='include/linux/cgroup-defs.h' line='644' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='896'>
-          <var-decl name='fork' type-id='1c9e19fb' visibility='default' filepath='include/linux/cgroup-defs.h' line='644' column='1'/>
+          <var-decl name='fork' type-id='1c9e19fb' visibility='default' filepath='include/linux/cgroup-defs.h' line='645' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='960'>
-          <var-decl name='exit' type-id='1c9e19fb' visibility='default' filepath='include/linux/cgroup-defs.h' line='645' column='1'/>
+          <var-decl name='exit' type-id='1c9e19fb' visibility='default' filepath='include/linux/cgroup-defs.h' line='646' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='release' type-id='1c9e19fb' visibility='default' filepath='include/linux/cgroup-defs.h' line='646' column='1'/>
+          <var-decl name='release' type-id='1c9e19fb' visibility='default' filepath='include/linux/cgroup-defs.h' line='647' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1088'>
-          <var-decl name='bind' type-id='f65daff2' visibility='default' filepath='include/linux/cgroup-defs.h' line='647' column='1'/>
+          <var-decl name='bind' type-id='f65daff2' visibility='default' filepath='include/linux/cgroup-defs.h' line='648' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='early_init' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='649' column='1'/>
+          <var-decl name='early_init' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='650' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1'>
-          <var-decl name='implicit_on_dfl' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='662' column='1'/>
+          <var-decl name='implicit_on_dfl' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='663' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2'>
-          <var-decl name='threaded' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='674' column='1'/>
+          <var-decl name='threaded' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='675' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='3'>
-          <var-decl name='broken_hierarchy' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='688' column='1'/>
+          <var-decl name='broken_hierarchy' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='689' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='4'>
-          <var-decl name='warned_broken_hierarchy' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='689' column='1'/>
+          <var-decl name='warned_broken_hierarchy' type-id='b50a4934' visibility='default' filepath='include/linux/cgroup-defs.h' line='690' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1184'>
-          <var-decl name='id' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='692' column='1'/>
+          <var-decl name='id' type-id='95e97e5e' visibility='default' filepath='include/linux/cgroup-defs.h' line='693' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1216'>
-          <var-decl name='name' type-id='80f4b756' visibility='default' filepath='include/linux/cgroup-defs.h' line='693' column='1'/>
+          <var-decl name='name' type-id='80f4b756' visibility='default' filepath='include/linux/cgroup-defs.h' line='694' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1280'>
-          <var-decl name='legacy_name' type-id='80f4b756' visibility='default' filepath='include/linux/cgroup-defs.h' line='696' column='1'/>
+          <var-decl name='legacy_name' type-id='80f4b756' visibility='default' filepath='include/linux/cgroup-defs.h' line='697' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1344'>
-          <var-decl name='root' type-id='aede2cf0' visibility='default' filepath='include/linux/cgroup-defs.h' line='699' column='1'/>
+          <var-decl name='root' type-id='aede2cf0' visibility='default' filepath='include/linux/cgroup-defs.h' line='700' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1408'>
-          <var-decl name='css_idr' type-id='37ce495e' visibility='default' filepath='include/linux/cgroup-defs.h' line='702' column='1'/>
+          <var-decl name='css_idr' type-id='37ce495e' visibility='default' filepath='include/linux/cgroup-defs.h' line='703' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1600'>
-          <var-decl name='cfts' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='708' column='1'/>
+          <var-decl name='cfts' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='709' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1728'>
-          <var-decl name='dfl_cftypes' type-id='03054cfa' visibility='default' filepath='include/linux/cgroup-defs.h' line='714' column='1'/>
+          <var-decl name='dfl_cftypes' type-id='03054cfa' visibility='default' filepath='include/linux/cgroup-defs.h' line='715' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1792'>
-          <var-decl name='legacy_cftypes' type-id='03054cfa' visibility='default' filepath='include/linux/cgroup-defs.h' line='715' column='1'/>
+          <var-decl name='legacy_cftypes' type-id='03054cfa' visibility='default' filepath='include/linux/cgroup-defs.h' line='716' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1856'>
-          <var-decl name='depends_on' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='724' column='1'/>
+          <var-decl name='depends_on' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='725' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cftype' size-in-bits='1728' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='538' column='1' id='ea2ebeac'>
+      <class-decl name='cftype' size-in-bits='1728' is-struct='yes' visibility='default' filepath='include/linux/cgroup-defs.h' line='539' column='1' id='ea2ebeac'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='name' type-id='59daf3ef' visibility='default' filepath='include/linux/cgroup-defs.h' line='544' column='1'/>
+          <var-decl name='name' type-id='59daf3ef' visibility='default' filepath='include/linux/cgroup-defs.h' line='545' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='private' type-id='7359adad' visibility='default' filepath='include/linux/cgroup-defs.h' line='545' column='1'/>
+          <var-decl name='private' type-id='7359adad' visibility='default' filepath='include/linux/cgroup-defs.h' line='546' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='max_write_len' type-id='b59d7dce' visibility='default' filepath='include/linux/cgroup-defs.h' line='551' column='1'/>
+          <var-decl name='max_write_len' type-id='b59d7dce' visibility='default' filepath='include/linux/cgroup-defs.h' line='552' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='640'>
-          <var-decl name='flags' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='554' column='1'/>
+          <var-decl name='flags' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='555' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='672'>
-          <var-decl name='file_offset' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='562' column='1'/>
+          <var-decl name='file_offset' type-id='f0981eeb' visibility='default' filepath='include/linux/cgroup-defs.h' line='563' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='ss' type-id='dc91d125' visibility='default' filepath='include/linux/cgroup-defs.h' line='568' column='1'/>
+          <var-decl name='ss' type-id='dc91d125' visibility='default' filepath='include/linux/cgroup-defs.h' line='569' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='768'>
-          <var-decl name='node' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='569' column='1'/>
+          <var-decl name='node' type-id='72f469ec' visibility='default' filepath='include/linux/cgroup-defs.h' line='570' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='896'>
-          <var-decl name='kf_ops' type-id='1f2a8949' visibility='default' filepath='include/linux/cgroup-defs.h' line='570' column='1'/>
+          <var-decl name='kf_ops' type-id='1f2a8949' visibility='default' filepath='include/linux/cgroup-defs.h' line='571' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='960'>
-          <var-decl name='open' type-id='964d2eb6' visibility='default' filepath='include/linux/cgroup-defs.h' line='572' column='1'/>
+          <var-decl name='open' type-id='964d2eb6' visibility='default' filepath='include/linux/cgroup-defs.h' line='573' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='release' type-id='f1825e09' visibility='default' filepath='include/linux/cgroup-defs.h' line='573' column='1'/>
+          <var-decl name='release' type-id='f1825e09' visibility='default' filepath='include/linux/cgroup-defs.h' line='574' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1088'>
-          <var-decl name='read_u64' type-id='ad13fd93' visibility='default' filepath='include/linux/cgroup-defs.h' line='579' column='1'/>
+          <var-decl name='read_u64' type-id='ad13fd93' visibility='default' filepath='include/linux/cgroup-defs.h' line='580' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1152'>
-          <var-decl name='read_s64' type-id='ae18a37d' visibility='default' filepath='include/linux/cgroup-defs.h' line='583' column='1'/>
+          <var-decl name='read_s64' type-id='ae18a37d' visibility='default' filepath='include/linux/cgroup-defs.h' line='584' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1216'>
-          <var-decl name='seq_show' type-id='0131eb61' visibility='default' filepath='include/linux/cgroup-defs.h' line='586' column='1'/>
+          <var-decl name='seq_show' type-id='0131eb61' visibility='default' filepath='include/linux/cgroup-defs.h' line='587' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1280'>
-          <var-decl name='seq_start' type-id='a46b05a0' visibility='default' filepath='include/linux/cgroup-defs.h' line='589' column='1'/>
+          <var-decl name='seq_start' type-id='a46b05a0' visibility='default' filepath='include/linux/cgroup-defs.h' line='590' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1344'>
-          <var-decl name='seq_next' type-id='b6ba26fa' visibility='default' filepath='include/linux/cgroup-defs.h' line='590' column='1'/>
+          <var-decl name='seq_next' type-id='b6ba26fa' visibility='default' filepath='include/linux/cgroup-defs.h' line='591' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1408'>
-          <var-decl name='seq_stop' type-id='6ba28d1c' visibility='default' filepath='include/linux/cgroup-defs.h' line='591' column='1'/>
+          <var-decl name='seq_stop' type-id='6ba28d1c' visibility='default' filepath='include/linux/cgroup-defs.h' line='592' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1472'>
-          <var-decl name='write_u64' type-id='3e9fac96' visibility='default' filepath='include/linux/cgroup-defs.h' line='598' column='1'/>
+          <var-decl name='write_u64' type-id='3e9fac96' visibility='default' filepath='include/linux/cgroup-defs.h' line='599' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1536'>
-          <var-decl name='write_s64' type-id='2b0348f0' visibility='default' filepath='include/linux/cgroup-defs.h' line='603' column='1'/>
+          <var-decl name='write_s64' type-id='2b0348f0' visibility='default' filepath='include/linux/cgroup-defs.h' line='604' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1600'>
-          <var-decl name='write' type-id='17b1add7' visibility='default' filepath='include/linux/cgroup-defs.h' line='612' column='1'/>
+          <var-decl name='write' type-id='17b1add7' visibility='default' filepath='include/linux/cgroup-defs.h' line='613' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1664'>
-          <var-decl name='poll' type-id='b347e5ac' visibility='default' filepath='include/linux/cgroup-defs.h' line='615' column='1'/>
+          <var-decl name='poll' type-id='b347e5ac' visibility='default' filepath='include/linux/cgroup-defs.h' line='616' column='1'/>
         </data-member>
       </class-decl>
       <typedef-decl name='poll_queue_proc' type-id='4aecccbd' filepath='include/linux/poll.h' line='37' column='1' id='650104ba'/>
@@ -124084,57 +124124,6 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='kernel/trace/bpf_trace.c' language='LANG_C89'>
-      <array-type-def dimensions='1' type-id='f67e137c' size-in-bits='infinite' id='3f814540'>
-        <subrange length='infinite' type-id='7ff19f0f' id='031f2035'/>
-      </array-type-def>
-      <class-decl name='bpf_cgroup_storage_map' is-struct='yes' visibility='default' is-declaration-only='yes' id='0ad68707'/>
-      <class-decl name='bpf_prog_array_item' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/bpf.h' line='359' column='1' id='f67e137c'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='prog' type-id='bdcee7ae' visibility='default' filepath='include/linux/bpf.h' line='360' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='cgroup_storage' type-id='531c24d0' visibility='default' filepath='include/linux/bpf.h' line='361' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='bpf_cgroup_storage' size-in-bits='704' is-struct='yes' visibility='default' filepath='include/linux/bpf-cgroup.h' line='34' column='1' id='15881542'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='buf' type-id='b1253746' visibility='default' filepath='include/linux/bpf-cgroup.h' line='35' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='map' type-id='b6a33eaf' visibility='default' filepath='include/linux/bpf-cgroup.h' line='36' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='key' type-id='d8d7111e' visibility='default' filepath='include/linux/bpf-cgroup.h' line='37' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='include/linux/bpf-cgroup.h' line='38' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='node' type-id='2a8a6332' visibility='default' filepath='include/linux/bpf-cgroup.h' line='39' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/linux/bpf-cgroup.h' line='40' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='bpf_storage_buffer' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/bpf-cgroup.h' line='29' column='1' id='0ef5c7e0'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/linux/bpf-cgroup.h' line='30' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='data' type-id='e84913bd' visibility='default' filepath='include/linux/bpf-cgroup.h' line='31' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='bpf_cgroup_storage_key' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='78' column='1' id='d8d7111e'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='cgroup_inode_id' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='79' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='attach_type' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='80' column='1'/>
-        </data-member>
-      </class-decl>
-      <pointer-type-def type-id='15881542' size-in-bits='64' id='531c24d0'/>
-      <pointer-type-def type-id='0ad68707' size-in-bits='64' id='b6a33eaf'/>
-      <pointer-type-def type-id='0ef5c7e0' size-in-bits='64' id='b1253746'/>
       <function-decl name='bpf_trace_run6' mangled-name='bpf_trace_run6' filepath='kernel/trace/bpf_trace.c' line='1207' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bpf_trace_run6'>
         <parameter type-id='bdcee7ae' name='prog' filepath='kernel/trace/bpf_trace.c' line='1207' column='1'/>
         <parameter type-id='91ce1af9' name='arg0' filepath='kernel/trace/bpf_trace.c' line='1207' column='1'/>
@@ -124744,12 +124733,12 @@
           <var-decl name='no_numa' type-id='b50a4934' visibility='default' filepath='include/linux/workqueue.h' line='161' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='wq_device' size-in-bits='7680' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='5192' column='1' id='a88ecfc8'>
+      <class-decl name='wq_device' size-in-bits='7680' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='5198' column='1' id='a88ecfc8'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='wq' type-id='242e3d19' visibility='default' filepath='kernel/workqueue.c' line='5193' column='1'/>
+          <var-decl name='wq' type-id='242e3d19' visibility='default' filepath='kernel/workqueue.c' line='5199' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='dev' type-id='66e487eb' visibility='default' filepath='kernel/workqueue.c' line='5194' column='1'/>
+          <var-decl name='dev' type-id='66e487eb' visibility='default' filepath='kernel/workqueue.c' line='5200' column='1'/>
         </data-member>
       </class-decl>
       <pointer-type-def type-id='b0355154' size-in-bits='64' id='a7a31b92'/>
@@ -124758,12 +124747,12 @@
       <pointer-type-def type-id='2fe6f208' size-in-bits='64' id='cfd15e7e'/>
       <pointer-type-def type-id='a88ecfc8' size-in-bits='64' id='5cebc26e'/>
       <pointer-type-def type-id='c8eb0f4f' size-in-bits='64' id='ec037527'/>
-      <function-decl name='__alloc_workqueue_key' mangled-name='__alloc_workqueue_key' filepath='kernel/workqueue.c' line='4088' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__alloc_workqueue_key'>
-        <parameter type-id='80f4b756' name='fmt' filepath='kernel/workqueue.c' line='4088' column='1'/>
-        <parameter type-id='f0981eeb' name='flags' filepath='kernel/workqueue.c' line='4089' column='1'/>
-        <parameter type-id='95e97e5e' name='max_active' filepath='kernel/workqueue.c' line='4090' column='1'/>
-        <parameter type-id='a57283f9' name='key' filepath='kernel/workqueue.c' line='4091' column='1'/>
-        <parameter type-id='80f4b756' name='lock_name' filepath='kernel/workqueue.c' line='4092' column='1'/>
+      <function-decl name='__alloc_workqueue_key' mangled-name='__alloc_workqueue_key' filepath='kernel/workqueue.c' line='4094' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__alloc_workqueue_key'>
+        <parameter type-id='80f4b756' name='fmt' filepath='kernel/workqueue.c' line='4094' column='1'/>
+        <parameter type-id='f0981eeb' name='flags' filepath='kernel/workqueue.c' line='4095' column='1'/>
+        <parameter type-id='95e97e5e' name='max_active' filepath='kernel/workqueue.c' line='4096' column='1'/>
+        <parameter type-id='a57283f9' name='key' filepath='kernel/workqueue.c' line='4097' column='1'/>
+        <parameter type-id='80f4b756' name='lock_name' filepath='kernel/workqueue.c' line='4098' column='1'/>
         <parameter is-variadic='yes'/>
         <return type-id='242e3d19'/>
       </function-decl>
@@ -125068,17 +125057,17 @@
     </abi-instr>
     <abi-instr address-size='64' path='lib/kstrtox.c' language='LANG_C89'>
       <pointer-type-def type-id='fdbf7a0f' size-in-bits='64' id='01b75fec'/>
-      <function-decl name='kstrtos8' mangled-name='kstrtos8' filepath='lib/kstrtox.c' line='308' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kstrtos8'>
-        <parameter type-id='80f4b756' name='s' filepath='lib/kstrtox.c' line='308' column='1'/>
-        <parameter type-id='f0981eeb' name='base' filepath='lib/kstrtox.c' line='308' column='1'/>
-        <parameter type-id='01b75fec' name='res' filepath='lib/kstrtox.c' line='308' column='1'/>
+      <function-decl name='kstrtos8' mangled-name='kstrtos8' filepath='lib/kstrtox.c' line='315' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kstrtos8'>
+        <parameter type-id='80f4b756' name='s' filepath='lib/kstrtox.c' line='315' column='1'/>
+        <parameter type-id='f0981eeb' name='base' filepath='lib/kstrtox.c' line='315' column='1'/>
+        <parameter type-id='01b75fec' name='res' filepath='lib/kstrtox.c' line='315' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='kstrtos8_from_user' mangled-name='kstrtos8_from_user' filepath='lib/kstrtox.c' line='410' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kstrtos8_from_user'>
-        <parameter type-id='80f4b756' name='s' filepath='lib/kstrtox.c' line='410' column='1'/>
-        <parameter type-id='b59d7dce' name='count' filepath='lib/kstrtox.c' line='410' column='1'/>
-        <parameter type-id='f0981eeb' name='base' filepath='lib/kstrtox.c' line='410' column='1'/>
-        <parameter type-id='01b75fec' name='res' filepath='lib/kstrtox.c' line='410' column='1'/>
+      <function-decl name='kstrtos8_from_user' mangled-name='kstrtos8_from_user' filepath='lib/kstrtox.c' line='417' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kstrtos8_from_user'>
+        <parameter type-id='80f4b756' name='s' filepath='lib/kstrtox.c' line='417' column='1'/>
+        <parameter type-id='b59d7dce' name='count' filepath='lib/kstrtox.c' line='417' column='1'/>
+        <parameter type-id='f0981eeb' name='base' filepath='lib/kstrtox.c' line='417' column='1'/>
+        <parameter type-id='01b75fec' name='res' filepath='lib/kstrtox.c' line='417' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
     </abi-instr>
@@ -125370,29 +125359,29 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='lib/vsprintf.c' language='LANG_C89'>
-      <function-decl name='vsnprintf' mangled-name='vsnprintf' filepath='lib/vsprintf.c' line='2242' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vsnprintf'>
-        <parameter type-id='26a90f95' name='buf' filepath='lib/vsprintf.c' line='2242' column='1'/>
-        <parameter type-id='b59d7dce' name='size' filepath='lib/vsprintf.c' line='2242' column='1'/>
-        <parameter type-id='80f4b756' name='fmt' filepath='lib/vsprintf.c' line='2242' column='1'/>
-        <parameter type-id='2aee9912' name='args' filepath='lib/vsprintf.c' line='2242' column='1'/>
+      <function-decl name='vsnprintf' mangled-name='vsnprintf' filepath='lib/vsprintf.c' line='2268' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vsnprintf'>
+        <parameter type-id='26a90f95' name='buf' filepath='lib/vsprintf.c' line='2268' column='1'/>
+        <parameter type-id='b59d7dce' name='size' filepath='lib/vsprintf.c' line='2268' column='1'/>
+        <parameter type-id='80f4b756' name='fmt' filepath='lib/vsprintf.c' line='2268' column='1'/>
+        <parameter type-id='2aee9912' name='args' filepath='lib/vsprintf.c' line='2268' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='snprintf' mangled-name='snprintf' filepath='lib/vsprintf.c' line='2439' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='snprintf'>
-        <parameter type-id='26a90f95' name='buf' filepath='lib/vsprintf.c' line='2439' column='1'/>
-        <parameter type-id='b59d7dce' name='size' filepath='lib/vsprintf.c' line='2439' column='1'/>
-        <parameter type-id='80f4b756' name='fmt' filepath='lib/vsprintf.c' line='2439' column='1'/>
+      <function-decl name='snprintf' mangled-name='snprintf' filepath='lib/vsprintf.c' line='2465' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='snprintf'>
+        <parameter type-id='26a90f95' name='buf' filepath='lib/vsprintf.c' line='2465' column='1'/>
+        <parameter type-id='b59d7dce' name='size' filepath='lib/vsprintf.c' line='2465' column='1'/>
+        <parameter type-id='80f4b756' name='fmt' filepath='lib/vsprintf.c' line='2465' column='1'/>
         <parameter is-variadic='yes'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sprintf' mangled-name='sprintf' filepath='lib/vsprintf.c' line='2508' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sprintf'>
-        <parameter type-id='26a90f95' name='buf' filepath='lib/vsprintf.c' line='2508' column='1'/>
-        <parameter type-id='80f4b756' name='fmt' filepath='lib/vsprintf.c' line='2508' column='1'/>
+      <function-decl name='sprintf' mangled-name='sprintf' filepath='lib/vsprintf.c' line='2534' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sprintf'>
+        <parameter type-id='26a90f95' name='buf' filepath='lib/vsprintf.c' line='2534' column='1'/>
+        <parameter type-id='80f4b756' name='fmt' filepath='lib/vsprintf.c' line='2534' column='1'/>
         <parameter is-variadic='yes'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sscanf' mangled-name='sscanf' filepath='lib/vsprintf.c' line='3211' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sscanf'>
-        <parameter type-id='80f4b756' name='buf' filepath='lib/vsprintf.c' line='3211' column='1'/>
-        <parameter type-id='80f4b756' name='fmt' filepath='lib/vsprintf.c' line='3211' column='1'/>
+      <function-decl name='sscanf' mangled-name='sscanf' filepath='lib/vsprintf.c' line='3225' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sscanf'>
+        <parameter type-id='80f4b756' name='buf' filepath='lib/vsprintf.c' line='3225' column='1'/>
+        <parameter type-id='80f4b756' name='fmt' filepath='lib/vsprintf.c' line='3225' column='1'/>
         <parameter is-variadic='yes'/>
         <return type-id='95e97e5e'/>
       </function-decl>
@@ -125856,28 +125845,28 @@
       <var-decl name='memcg_sockets_enabled_key' type-id='237c0d27' mangled-name='memcg_sockets_enabled_key' visibility='default' filepath='mm/memcontrol.c' line='6309' column='1' elf-symbol-id='memcg_sockets_enabled_key'/>
     </abi-instr>
     <abi-instr address-size='64' path='mm/memory.c' language='LANG_C89'>
-      <function-decl name='vm_insert_page' mangled-name='vm_insert_page' filepath='mm/memory.c' line='1785' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vm_insert_page'>
-        <parameter type-id='2ae08426' name='vma' filepath='mm/memory.c' line='1785' column='1'/>
-        <parameter type-id='7359adad' name='addr' filepath='mm/memory.c' line='1785' column='1'/>
-        <parameter type-id='02f11ed4' name='page' filepath='mm/memory.c' line='1786' column='1'/>
+      <function-decl name='vm_insert_page' mangled-name='vm_insert_page' filepath='mm/memory.c' line='1796' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vm_insert_page'>
+        <parameter type-id='2ae08426' name='vma' filepath='mm/memory.c' line='1796' column='1'/>
+        <parameter type-id='7359adad' name='addr' filepath='mm/memory.c' line='1796' column='1'/>
+        <parameter type-id='02f11ed4' name='page' filepath='mm/memory.c' line='1797' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='vm_insert_pfn' mangled-name='vm_insert_pfn' filepath='mm/memory.c' line='1876' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vm_insert_pfn'>
-        <parameter type-id='2ae08426' name='vma' filepath='mm/memory.c' line='1876' column='1'/>
-        <parameter type-id='7359adad' name='addr' filepath='mm/memory.c' line='1876' column='1'/>
-        <parameter type-id='7359adad' name='pfn' filepath='mm/memory.c' line='1877' column='1'/>
+      <function-decl name='vm_insert_pfn' mangled-name='vm_insert_pfn' filepath='mm/memory.c' line='1887' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vm_insert_pfn'>
+        <parameter type-id='2ae08426' name='vma' filepath='mm/memory.c' line='1887' column='1'/>
+        <parameter type-id='7359adad' name='addr' filepath='mm/memory.c' line='1887' column='1'/>
+        <parameter type-id='7359adad' name='pfn' filepath='mm/memory.c' line='1888' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='vm_insert_mixed' mangled-name='vm_insert_mixed' filepath='mm/memory.c' line='1980' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vm_insert_mixed'>
-        <parameter type-id='2ae08426' name='vma' filepath='mm/memory.c' line='1980' column='1'/>
-        <parameter type-id='7359adad' name='addr' filepath='mm/memory.c' line='1980' column='1'/>
-        <parameter type-id='abe59ef3' name='pfn' filepath='mm/memory.c' line='1981' column='1'/>
+      <function-decl name='vm_insert_mixed' mangled-name='vm_insert_mixed' filepath='mm/memory.c' line='1991' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vm_insert_mixed'>
+        <parameter type-id='2ae08426' name='vma' filepath='mm/memory.c' line='1991' column='1'/>
+        <parameter type-id='7359adad' name='addr' filepath='mm/memory.c' line='1991' column='1'/>
+        <parameter type-id='abe59ef3' name='pfn' filepath='mm/memory.c' line='1992' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='vm_iomap_memory' mangled-name='vm_iomap_memory' filepath='mm/memory.c' line='2188' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vm_iomap_memory'>
-        <parameter type-id='2ae08426' name='vma' filepath='mm/memory.c' line='2188' column='1'/>
-        <parameter type-id='2522883d' name='start' filepath='mm/memory.c' line='2188' column='1'/>
-        <parameter type-id='7359adad' name='len' filepath='mm/memory.c' line='2188' column='1'/>
+      <function-decl name='vm_iomap_memory' mangled-name='vm_iomap_memory' filepath='mm/memory.c' line='2199' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='vm_iomap_memory'>
+        <parameter type-id='2ae08426' name='vma' filepath='mm/memory.c' line='2199' column='1'/>
+        <parameter type-id='2522883d' name='start' filepath='mm/memory.c' line='2199' column='1'/>
+        <parameter type-id='7359adad' name='len' filepath='mm/memory.c' line='2199' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
     </abi-instr>
@@ -125922,24 +125911,24 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='mm/mmap.c' language='LANG_C89'>
-      <class-decl name='vm_unmapped_area_info' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/mm.h' line='2404' column='1' id='867dcb9c'>
+      <class-decl name='vm_unmapped_area_info' size-in-bits='384' is-struct='yes' visibility='default' filepath='include/linux/mm.h' line='2407' column='1' id='867dcb9c'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='include/linux/mm.h' line='2406' column='1'/>
+          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='include/linux/mm.h' line='2409' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='length' type-id='7359adad' visibility='default' filepath='include/linux/mm.h' line='2407' column='1'/>
+          <var-decl name='length' type-id='7359adad' visibility='default' filepath='include/linux/mm.h' line='2410' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='low_limit' type-id='7359adad' visibility='default' filepath='include/linux/mm.h' line='2408' column='1'/>
+          <var-decl name='low_limit' type-id='7359adad' visibility='default' filepath='include/linux/mm.h' line='2411' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='high_limit' type-id='7359adad' visibility='default' filepath='include/linux/mm.h' line='2409' column='1'/>
+          <var-decl name='high_limit' type-id='7359adad' visibility='default' filepath='include/linux/mm.h' line='2412' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='align_mask' type-id='7359adad' visibility='default' filepath='include/linux/mm.h' line='2410' column='1'/>
+          <var-decl name='align_mask' type-id='7359adad' visibility='default' filepath='include/linux/mm.h' line='2413' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='align_offset' type-id='7359adad' visibility='default' filepath='include/linux/mm.h' line='2411' column='1'/>
+          <var-decl name='align_offset' type-id='7359adad' visibility='default' filepath='include/linux/mm.h' line='2414' column='1'/>
         </data-member>
       </class-decl>
       <pointer-type-def type-id='867dcb9c' size-in-bits='64' id='452b82fa'/>
@@ -126175,7 +126164,7 @@
       <pointer-type-def type-id='edac1e8f' size-in-bits='64' id='42c7aae7'/>
       <pointer-type-def type-id='dbef6377' size-in-bits='64' id='2c8ce02f'/>
       <pointer-type-def type-id='ad0ff4ed' size-in-bits='64' id='8a4f2b79'/>
-      <var-decl name='kmalloc_caches' type-id='5a527497' mangled-name='kmalloc_caches' visibility='default' filepath='mm/slab_common.c' line='1008' column='1' elf-symbol-id='kmalloc_caches'/>
+      <var-decl name='kmalloc_caches' type-id='5a527497' mangled-name='kmalloc_caches' visibility='default' filepath='mm/slab_common.c' line='1010' column='1' elf-symbol-id='kmalloc_caches'/>
       <function-decl name='ptr_to_hashval' mangled-name='ptr_to_hashval' filepath='include/linux/string.h' line='212' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ptr_to_hashval'>
         <parameter type-id='eaa32e2f'/>
         <parameter type-id='1d2c2b85'/>
@@ -126191,22 +126180,22 @@
       </function-type>
     </abi-instr>
     <abi-instr address-size='64' path='mm/slub.c' language='LANG_C89'>
-      <function-decl name='kmem_cache_free_bulk' mangled-name='kmem_cache_free_bulk' filepath='mm/slub.c' line='3145' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmem_cache_free_bulk'>
-        <parameter type-id='f3b4aca8' name='s' filepath='mm/slub.c' line='3145' column='1'/>
-        <parameter type-id='b59d7dce' name='size' filepath='mm/slub.c' line='3145' column='1'/>
-        <parameter type-id='63e171df' name='p' filepath='mm/slub.c' line='3145' column='1'/>
+      <function-decl name='kmem_cache_free_bulk' mangled-name='kmem_cache_free_bulk' filepath='mm/slub.c' line='3146' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmem_cache_free_bulk'>
+        <parameter type-id='f3b4aca8' name='s' filepath='mm/slub.c' line='3146' column='1'/>
+        <parameter type-id='b59d7dce' name='size' filepath='mm/slub.c' line='3146' column='1'/>
+        <parameter type-id='63e171df' name='p' filepath='mm/slub.c' line='3146' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='kmem_cache_alloc_bulk' mangled-name='kmem_cache_alloc_bulk' filepath='mm/slub.c' line='3163' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmem_cache_alloc_bulk'>
-        <parameter type-id='f3b4aca8' name='s' filepath='mm/slub.c' line='3163' column='1'/>
-        <parameter type-id='3eb7c31c' name='flags' filepath='mm/slub.c' line='3163' column='1'/>
-        <parameter type-id='b59d7dce' name='size' filepath='mm/slub.c' line='3163' column='1'/>
-        <parameter type-id='63e171df' name='p' filepath='mm/slub.c' line='3164' column='1'/>
+      <function-decl name='kmem_cache_alloc_bulk' mangled-name='kmem_cache_alloc_bulk' filepath='mm/slub.c' line='3164' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kmem_cache_alloc_bulk'>
+        <parameter type-id='f3b4aca8' name='s' filepath='mm/slub.c' line='3164' column='1'/>
+        <parameter type-id='3eb7c31c' name='flags' filepath='mm/slub.c' line='3164' column='1'/>
+        <parameter type-id='b59d7dce' name='size' filepath='mm/slub.c' line='3164' column='1'/>
+        <parameter type-id='63e171df' name='p' filepath='mm/slub.c' line='3165' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='__kmalloc' mangled-name='__kmalloc' filepath='mm/slub.c' line='3828' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__kmalloc'>
-        <parameter type-id='b59d7dce' name='size' filepath='mm/slub.c' line='3828' column='1'/>
-        <parameter type-id='3eb7c31c' name='flags' filepath='mm/slub.c' line='3828' column='1'/>
+      <function-decl name='__kmalloc' mangled-name='__kmalloc' filepath='mm/slub.c' line='3829' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__kmalloc'>
+        <parameter type-id='b59d7dce' name='size' filepath='mm/slub.c' line='3829' column='1'/>
+        <parameter type-id='3eb7c31c' name='flags' filepath='mm/slub.c' line='3829' column='1'/>
         <return type-id='eaa32e2f'/>
       </function-decl>
       <function-decl name='kset_unregister' mangled-name='kset_unregister' filepath='include/linux/kobject.h' line='217' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kset_unregister'>
@@ -126221,12 +126210,12 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='mm/truncate.c' language='LANG_C89'>
-      <function-decl name='truncate_inode_pages' mangled-name='truncate_inode_pages' filepath='mm/truncate.c' line='476' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='truncate_inode_pages'>
-        <parameter type-id='f57039f0' name='mapping' filepath='mm/truncate.c' line='476' column='1'/>
-        <parameter type-id='69bf7bee' name='lstart' filepath='mm/truncate.c' line='476' column='1'/>
+      <function-decl name='truncate_inode_pages' mangled-name='truncate_inode_pages' filepath='mm/truncate.c' line='473' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='truncate_inode_pages'>
+        <parameter type-id='f57039f0' name='mapping' filepath='mm/truncate.c' line='473' column='1'/>
+        <parameter type-id='69bf7bee' name='lstart' filepath='mm/truncate.c' line='473' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='unmap_mapping_range' mangled-name='unmap_mapping_range' filepath='include/linux/mm.h' line='1479' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='unmap_mapping_range'>
+      <function-decl name='unmap_mapping_range' mangled-name='unmap_mapping_range' filepath='include/linux/mm.h' line='1481' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='unmap_mapping_range'>
         <parameter type-id='f57039f0'/>
         <parameter type-id='1eb56b1e'/>
         <parameter type-id='1eb56b1e'/>
@@ -127293,14 +127282,14 @@
         <parameter type-id='68a2d05b' name='dev' filepath='net/core/dev.c' line='4722' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='netdev_upper_dev_unlink' mangled-name='netdev_upper_dev_unlink' filepath='net/core/dev.c' line='7262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_upper_dev_unlink'>
-        <parameter type-id='68a2d05b' name='dev' filepath='net/core/dev.c' line='7262' column='1'/>
-        <parameter type-id='68a2d05b' name='upper_dev' filepath='net/core/dev.c' line='7263' column='1'/>
+      <function-decl name='netdev_upper_dev_unlink' mangled-name='netdev_upper_dev_unlink' filepath='net/core/dev.c' line='7270' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_upper_dev_unlink'>
+        <parameter type-id='68a2d05b' name='dev' filepath='net/core/dev.c' line='7270' column='1'/>
+        <parameter type-id='68a2d05b' name='upper_dev' filepath='net/core/dev.c' line='7271' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='netdev_lower_state_changed' mangled-name='netdev_lower_state_changed' filepath='net/core/dev.c' line='7433' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_lower_state_changed'>
-        <parameter type-id='68a2d05b' name='lower_dev' filepath='net/core/dev.c' line='7433' column='1'/>
-        <parameter type-id='eaa32e2f' name='lower_state_info' filepath='net/core/dev.c' line='7434' column='1'/>
+      <function-decl name='netdev_lower_state_changed' mangled-name='netdev_lower_state_changed' filepath='net/core/dev.c' line='7441' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_lower_state_changed'>
+        <parameter type-id='68a2d05b' name='lower_dev' filepath='net/core/dev.c' line='7441' column='1'/>
+        <parameter type-id='eaa32e2f' name='lower_state_info' filepath='net/core/dev.c' line='7442' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
       <var-decl name='rps_sock_flow_table' type-id='2293f1dd' mangled-name='rps_sock_flow_table' visibility='default' filepath='net/core/dev.c' line='3950' column='1' elf-symbol-id='rps_sock_flow_table'/>
@@ -127370,54 +127359,54 @@
         <parameter type-id='b50a4934' name='flush_old' filepath='net/core/dev.c' line='5345' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='__napi_schedule' mangled-name='__napi_schedule' filepath='net/core/dev.c' line='5890' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__napi_schedule'>
-        <parameter type-id='c50361c5' name='n' filepath='net/core/dev.c' line='5890' column='1'/>
+      <function-decl name='__napi_schedule' mangled-name='__napi_schedule' filepath='net/core/dev.c' line='5891' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__napi_schedule'>
+        <parameter type-id='c50361c5' name='n' filepath='net/core/dev.c' line='5891' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='get_current_napi_context' mangled-name='get_current_napi_context' filepath='net/core/dev.c' line='6259' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_current_napi_context'>
+      <function-decl name='get_current_napi_context' mangled-name='get_current_napi_context' filepath='net/core/dev.c' line='6267' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_current_napi_context'>
         <return type-id='c50361c5'/>
       </function-decl>
-      <function-decl name='netdev_upper_dev_link' mangled-name='netdev_upper_dev_link' filepath='net/core/dev.c' line='7221' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_upper_dev_link'>
-        <parameter type-id='68a2d05b' name='dev' filepath='net/core/dev.c' line='7221' column='1'/>
-        <parameter type-id='68a2d05b' name='upper_dev' filepath='net/core/dev.c' line='7222' column='1'/>
-        <parameter type-id='5799dc94' name='extack' filepath='net/core/dev.c' line='7223' column='1'/>
+      <function-decl name='netdev_upper_dev_link' mangled-name='netdev_upper_dev_link' filepath='net/core/dev.c' line='7229' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_upper_dev_link'>
+        <parameter type-id='68a2d05b' name='dev' filepath='net/core/dev.c' line='7229' column='1'/>
+        <parameter type-id='68a2d05b' name='upper_dev' filepath='net/core/dev.c' line='7230' column='1'/>
+        <parameter type-id='5799dc94' name='extack' filepath='net/core/dev.c' line='7231' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='netdev_master_upper_dev_link' mangled-name='netdev_master_upper_dev_link' filepath='net/core/dev.c' line='7244' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_master_upper_dev_link'>
-        <parameter type-id='68a2d05b' name='dev' filepath='net/core/dev.c' line='7244' column='1'/>
-        <parameter type-id='68a2d05b' name='upper_dev' filepath='net/core/dev.c' line='7245' column='1'/>
-        <parameter type-id='eaa32e2f' name='upper_priv' filepath='net/core/dev.c' line='7246' column='1'/>
-        <parameter type-id='eaa32e2f' name='upper_info' filepath='net/core/dev.c' line='7246' column='1'/>
-        <parameter type-id='5799dc94' name='extack' filepath='net/core/dev.c' line='7247' column='1'/>
+      <function-decl name='netdev_master_upper_dev_link' mangled-name='netdev_master_upper_dev_link' filepath='net/core/dev.c' line='7252' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_master_upper_dev_link'>
+        <parameter type-id='68a2d05b' name='dev' filepath='net/core/dev.c' line='7252' column='1'/>
+        <parameter type-id='68a2d05b' name='upper_dev' filepath='net/core/dev.c' line='7253' column='1'/>
+        <parameter type-id='eaa32e2f' name='upper_priv' filepath='net/core/dev.c' line='7254' column='1'/>
+        <parameter type-id='eaa32e2f' name='upper_info' filepath='net/core/dev.c' line='7254' column='1'/>
+        <parameter type-id='5799dc94' name='extack' filepath='net/core/dev.c' line='7255' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='dev_set_mtu' mangled-name='dev_set_mtu' filepath='net/core/dev.c' line='7843' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_set_mtu'>
-        <parameter type-id='68a2d05b' name='dev' filepath='net/core/dev.c' line='7843' column='1'/>
-        <parameter type-id='95e97e5e' name='new_mtu' filepath='net/core/dev.c' line='7843' column='1'/>
+      <function-decl name='dev_set_mtu' mangled-name='dev_set_mtu' filepath='net/core/dev.c' line='7851' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_set_mtu'>
+        <parameter type-id='68a2d05b' name='dev' filepath='net/core/dev.c' line='7851' column='1'/>
+        <parameter type-id='95e97e5e' name='new_mtu' filepath='net/core/dev.c' line='7851' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='netdev_change_features' mangled-name='netdev_change_features' filepath='net/core/dev.c' line='8496' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_change_features'>
-        <parameter type-id='68a2d05b' name='dev' filepath='net/core/dev.c' line='8496' column='1'/>
+      <function-decl name='netdev_change_features' mangled-name='netdev_change_features' filepath='net/core/dev.c' line='8504' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_change_features'>
+        <parameter type-id='68a2d05b' name='dev' filepath='net/core/dev.c' line='8504' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='netif_stacked_transfer_operstate' mangled-name='netif_stacked_transfer_operstate' filepath='net/core/dev.c' line='8512' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_stacked_transfer_operstate'>
-        <parameter type-id='2ce52478' name='rootdev' filepath='net/core/dev.c' line='8512' column='1'/>
-        <parameter type-id='68a2d05b' name='dev' filepath='net/core/dev.c' line='8513' column='1'/>
+      <function-decl name='netif_stacked_transfer_operstate' mangled-name='netif_stacked_transfer_operstate' filepath='net/core/dev.c' line='8520' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netif_stacked_transfer_operstate'>
+        <parameter type-id='2ce52478' name='rootdev' filepath='net/core/dev.c' line='8520' column='1'/>
+        <parameter type-id='68a2d05b' name='dev' filepath='net/core/dev.c' line='8521' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='init_dummy_netdev' mangled-name='init_dummy_netdev' filepath='net/core/dev.c' line='8815' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='init_dummy_netdev'>
-        <parameter type-id='68a2d05b' name='dev' filepath='net/core/dev.c' line='8815' column='1'/>
+      <function-decl name='init_dummy_netdev' mangled-name='init_dummy_netdev' filepath='net/core/dev.c' line='8823' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='init_dummy_netdev'>
+        <parameter type-id='68a2d05b' name='dev' filepath='net/core/dev.c' line='8823' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='dev_get_stats' mangled-name='dev_get_stats' filepath='net/core/dev.c' line='9063' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_get_stats'>
-        <parameter type-id='68a2d05b' name='dev' filepath='net/core/dev.c' line='9063' column='1'/>
-        <parameter type-id='bd3860fe' name='storage' filepath='net/core/dev.c' line='9064' column='1'/>
+      <function-decl name='dev_get_stats' mangled-name='dev_get_stats' filepath='net/core/dev.c' line='9071' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_get_stats'>
+        <parameter type-id='68a2d05b' name='dev' filepath='net/core/dev.c' line='9071' column='1'/>
+        <parameter type-id='bd3860fe' name='storage' filepath='net/core/dev.c' line='9072' column='1'/>
         <return type-id='bd3860fe'/>
       </function-decl>
-      <function-decl name='netdev_increment_features' mangled-name='netdev_increment_features' filepath='net/core/dev.c' line='9559' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_increment_features'>
-        <parameter type-id='f9f4b16f' name='all' filepath='net/core/dev.c' line='9559' column='1'/>
-        <parameter type-id='f9f4b16f' name='one' filepath='net/core/dev.c' line='9560' column='1'/>
-        <parameter type-id='f9f4b16f' name='mask' filepath='net/core/dev.c' line='9560' column='1'/>
+      <function-decl name='netdev_increment_features' mangled-name='netdev_increment_features' filepath='net/core/dev.c' line='9567' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_increment_features'>
+        <parameter type-id='f9f4b16f' name='all' filepath='net/core/dev.c' line='9567' column='1'/>
+        <parameter type-id='f9f4b16f' name='one' filepath='net/core/dev.c' line='9568' column='1'/>
+        <parameter type-id='f9f4b16f' name='mask' filepath='net/core/dev.c' line='9568' column='1'/>
         <return type-id='f9f4b16f'/>
       </function-decl>
     </abi-instr>
@@ -127991,12 +127980,12 @@
       </function-type>
     </abi-instr>
     <abi-instr address-size='64' path='net/core/skbuff.c' language='LANG_C89'>
-      <class-decl name='skb_checksum_ops' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/skbuff.h' line='3391' column='1' id='fa4c4f4c'>
+      <class-decl name='skb_checksum_ops' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/skbuff.h' line='3400' column='1' id='fa4c4f4c'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='update' type-id='6441162f' visibility='default' filepath='include/linux/skbuff.h' line='3392' column='1'/>
+          <var-decl name='update' type-id='6441162f' visibility='default' filepath='include/linux/skbuff.h' line='3401' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='combine' type-id='1b0b8c1b' visibility='default' filepath='include/linux/skbuff.h' line='3393' column='1'/>
+          <var-decl name='combine' type-id='1b0b8c1b' visibility='default' filepath='include/linux/skbuff.h' line='3402' column='1'/>
         </data-member>
       </class-decl>
       <qualified-type-def type-id='fa4c4f4c' const='yes' id='e2915579'/>
@@ -128060,8 +128049,8 @@
         <parameter type-id='b50a4934' name='free_on_error' filepath='net/core/skbuff.c' line='1637' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='skb_condense' mangled-name='skb_condense' filepath='net/core/skbuff.c' line='5623' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_condense'>
-        <parameter type-id='0fbf3cfd' name='skb' filepath='net/core/skbuff.c' line='5623' column='1'/>
+      <function-decl name='skb_condense' mangled-name='skb_condense' filepath='net/core/skbuff.c' line='5626' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_condense'>
+        <parameter type-id='0fbf3cfd' name='skb' filepath='net/core/skbuff.c' line='5626' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
       <function-decl name='__skb_checksum' mangled-name='__skb_checksum' filepath='net/core/skbuff.c' line='2492' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__skb_checksum'>
@@ -128079,16 +128068,16 @@
         <parameter type-id='95e97e5e' name='len' filepath='net/core/skbuff.c' line='2414' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='skb_append_pagefrags' mangled-name='skb_append_pagefrags' filepath='net/core/skbuff.c' line='3475' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_append_pagefrags'>
-        <parameter type-id='0fbf3cfd' name='skb' filepath='net/core/skbuff.c' line='3475' column='1'/>
-        <parameter type-id='02f11ed4' name='page' filepath='net/core/skbuff.c' line='3475' column='1'/>
-        <parameter type-id='95e97e5e' name='offset' filepath='net/core/skbuff.c' line='3476' column='1'/>
-        <parameter type-id='b59d7dce' name='size' filepath='net/core/skbuff.c' line='3476' column='1'/>
+      <function-decl name='skb_append_pagefrags' mangled-name='skb_append_pagefrags' filepath='net/core/skbuff.c' line='3478' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_append_pagefrags'>
+        <parameter type-id='0fbf3cfd' name='skb' filepath='net/core/skbuff.c' line='3478' column='1'/>
+        <parameter type-id='02f11ed4' name='page' filepath='net/core/skbuff.c' line='3478' column='1'/>
+        <parameter type-id='95e97e5e' name='offset' filepath='net/core/skbuff.c' line='3479' column='1'/>
+        <parameter type-id='b59d7dce' name='size' filepath='net/core/skbuff.c' line='3479' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='skb_segment' mangled-name='skb_segment' filepath='net/core/skbuff.c' line='3537' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_segment'>
-        <parameter type-id='0fbf3cfd' name='head_skb' filepath='net/core/skbuff.c' line='3537' column='1'/>
-        <parameter type-id='f9f4b16f' name='features' filepath='net/core/skbuff.c' line='3538' column='1'/>
+      <function-decl name='skb_segment' mangled-name='skb_segment' filepath='net/core/skbuff.c' line='3540' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_segment'>
+        <parameter type-id='0fbf3cfd' name='head_skb' filepath='net/core/skbuff.c' line='3540' column='1'/>
+        <parameter type-id='f9f4b16f' name='features' filepath='net/core/skbuff.c' line='3541' column='1'/>
         <return type-id='0fbf3cfd'/>
       </function-decl>
       <function-type size-in-bits='64' id='dcab33c7'>
@@ -128405,7 +128394,7 @@
         <parameter type-id='f0981eeb'/>
         <return type-id='f0981eeb'/>
       </function-decl>
-      <function-decl name='skb_checksum' mangled-name='skb_checksum' filepath='include/linux/skbuff.h' line='3400' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_checksum'>
+      <function-decl name='skb_checksum' mangled-name='skb_checksum' filepath='include/linux/skbuff.h' line='3409' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_checksum'>
         <parameter type-id='11f4a000'/>
         <parameter type-id='95e97e5e'/>
         <parameter type-id='95e97e5e'/>
@@ -128871,13 +128860,13 @@
       <pointer-type-def type-id='fa7c8a73' size-in-bits='64' id='815f64bf'/>
       <pointer-type-def type-id='77618c14' size-in-bits='64' id='ece3af1e'/>
       <pointer-type-def type-id='7e2beda2' size-in-bits='64' id='f5feb7a4'/>
-      <function-decl name='register_net_sysctl' mangled-name='register_net_sysctl' filepath='include/net/net_namespace.h' line='384' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='register_net_sysctl'>
+      <function-decl name='register_net_sysctl' mangled-name='register_net_sysctl' filepath='include/net/net_namespace.h' line='391' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='register_net_sysctl'>
         <parameter type-id='a2bff676'/>
         <parameter type-id='80f4b756'/>
         <parameter type-id='631dc3c1'/>
         <return type-id='11b101bb'/>
       </function-decl>
-      <function-decl name='unregister_net_sysctl_table' mangled-name='unregister_net_sysctl_table' filepath='include/net/net_namespace.h' line='386' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='unregister_net_sysctl_table'>
+      <function-decl name='unregister_net_sysctl_table' mangled-name='unregister_net_sysctl_table' filepath='include/net/net_namespace.h' line='393' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='unregister_net_sysctl_table'>
         <parameter type-id='11b101bb'/>
         <return type-id='48b5725f'/>
       </function-decl>
@@ -128897,7 +128886,7 @@
         <parameter type-id='8b97c2dc'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='inet_get_local_port_range' mangled-name='inet_get_local_port_range' filepath='include/net/ip.h' line='299' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='inet_get_local_port_range'>
+      <function-decl name='inet_get_local_port_range' mangled-name='inet_get_local_port_range' filepath='include/net/ip.h' line='302' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='inet_get_local_port_range'>
         <parameter type-id='a2bff676'/>
         <parameter type-id='7292109c'/>
         <parameter type-id='7292109c'/>
@@ -129510,21 +129499,21 @@
       </function-type>
     </abi-instr>
     <abi-instr address-size='64' path='net/key/af_key.c' language='LANG_C89'>
-      <class-decl name='net_proto_family' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/net.h' line='212' column='1' id='89303496'>
+      <class-decl name='net_proto_family' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/net.h' line='218' column='1' id='89303496'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='family' type-id='95e97e5e' visibility='default' filepath='include/linux/net.h' line='213' column='1'/>
+          <var-decl name='family' type-id='95e97e5e' visibility='default' filepath='include/linux/net.h' line='219' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='create' type-id='d128cc8f' visibility='default' filepath='include/linux/net.h' line='214' column='1'/>
+          <var-decl name='create' type-id='d128cc8f' visibility='default' filepath='include/linux/net.h' line='220' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='owner' type-id='2730d015' visibility='default' filepath='include/linux/net.h' line='216' column='1'/>
+          <var-decl name='owner' type-id='2730d015' visibility='default' filepath='include/linux/net.h' line='222' column='1'/>
         </data-member>
       </class-decl>
       <qualified-type-def type-id='89303496' const='yes' id='7f9fdab3'/>
       <pointer-type-def type-id='7f9fdab3' size-in-bits='64' id='81a51edb'/>
       <pointer-type-def type-id='c7873973' size-in-bits='64' id='d128cc8f'/>
-      <function-decl name='sock_unregister' mangled-name='sock_unregister' filepath='include/linux/net.h' line='231' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_unregister'>
+      <function-decl name='sock_unregister' mangled-name='sock_unregister' filepath='include/linux/net.h' line='237' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_unregister'>
         <parameter type-id='95e97e5e'/>
         <return type-id='48b5725f'/>
       </function-decl>
@@ -129537,7 +129526,7 @@
         <parameter type-id='f0981eeb'/>
         <return type-id='0fbf3cfd'/>
       </function-decl>
-      <function-decl name='sock_register' mangled-name='sock_register' filepath='include/linux/net.h' line='230' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_register'>
+      <function-decl name='sock_register' mangled-name='sock_register' filepath='include/linux/net.h' line='236' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_register'>
         <parameter type-id='81a51edb'/>
         <return type-id='95e97e5e'/>
       </function-decl>
@@ -129551,21 +129540,21 @@
         <parameter type-id='4fa10f9e'/>
         <return type-id='c894953d'/>
       </function-decl>
-      <function-decl name='skb_recv_datagram' mangled-name='skb_recv_datagram' filepath='include/linux/skbuff.h' line='3329' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_recv_datagram'>
+      <function-decl name='skb_recv_datagram' mangled-name='skb_recv_datagram' filepath='include/linux/skbuff.h' line='3338' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_recv_datagram'>
         <parameter type-id='f772df6d'/>
         <parameter type-id='f0981eeb'/>
         <parameter type-id='95e97e5e'/>
         <parameter type-id='7292109c'/>
         <return type-id='0fbf3cfd'/>
       </function-decl>
-      <function-decl name='skb_copy_datagram_iter' mangled-name='skb_copy_datagram_iter' filepath='include/linux/skbuff.h' line='3333' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_copy_datagram_iter'>
+      <function-decl name='skb_copy_datagram_iter' mangled-name='skb_copy_datagram_iter' filepath='include/linux/skbuff.h' line='3342' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_copy_datagram_iter'>
         <parameter type-id='11f4a000'/>
         <parameter type-id='95e97e5e'/>
         <parameter type-id='4fa10f9e'/>
         <parameter type-id='95e97e5e'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='skb_free_datagram' mangled-name='skb_free_datagram' filepath='include/linux/skbuff.h' line='3345' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_free_datagram'>
+      <function-decl name='skb_free_datagram' mangled-name='skb_free_datagram' filepath='include/linux/skbuff.h' line='3354' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='skb_free_datagram'>
         <parameter type-id='f772df6d'/>
         <parameter type-id='0fbf3cfd'/>
         <return type-id='48b5725f'/>
@@ -129670,24 +129659,24 @@
       <array-type-def dimensions='1' type-id='f0981eeb' size-in-bits='160' id='4d5a4f46'>
         <subrange length='5' type-id='7ff19f0f' id='53010e10'/>
       </array-type-def>
-      <class-decl name='pernet_operations' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/net/net_namespace.h' line='328' column='1' id='68f5a646'>
+      <class-decl name='pernet_operations' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/net/net_namespace.h' line='335' column='1' id='68f5a646'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='include/net/net_namespace.h' line='329' column='1'/>
+          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='include/net/net_namespace.h' line='336' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='init' type-id='e83d6bbe' visibility='default' filepath='include/net/net_namespace.h' line='348' column='1'/>
+          <var-decl name='init' type-id='e83d6bbe' visibility='default' filepath='include/net/net_namespace.h' line='355' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='exit' type-id='9b92b29b' visibility='default' filepath='include/net/net_namespace.h' line='349' column='1'/>
+          <var-decl name='exit' type-id='9b92b29b' visibility='default' filepath='include/net/net_namespace.h' line='356' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='exit_batch' type-id='29f83363' visibility='default' filepath='include/net/net_namespace.h' line='350' column='1'/>
+          <var-decl name='exit_batch' type-id='29f83363' visibility='default' filepath='include/net/net_namespace.h' line='357' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='id' type-id='807869d3' visibility='default' filepath='include/net/net_namespace.h' line='351' column='1'/>
+          <var-decl name='id' type-id='807869d3' visibility='default' filepath='include/net/net_namespace.h' line='358' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='size' type-id='b59d7dce' visibility='default' filepath='include/net/net_namespace.h' line='352' column='1'/>
+          <var-decl name='size' type-id='b59d7dce' visibility='default' filepath='include/net/net_namespace.h' line='359' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='nf_hook_entry' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/netfilter.h' line='75' column='1' id='7a1bc3c2'>
@@ -129784,7 +129773,7 @@
         <parameter type-id='d504f73d'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='unregister_pernet_subsys' mangled-name='unregister_pernet_subsys' filepath='include/net/net_namespace.h' line='375' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='unregister_pernet_subsys'>
+      <function-decl name='unregister_pernet_subsys' mangled-name='unregister_pernet_subsys' filepath='include/net/net_namespace.h' line='382' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='unregister_pernet_subsys'>
         <parameter type-id='d6907f4c'/>
         <return type-id='48b5725f'/>
       </function-decl>
@@ -129812,7 +129801,7 @@
         <parameter type-id='f0981eeb'/>
         <return type-id='0fbf3cfd'/>
       </function-decl>
-      <function-decl name='register_pernet_subsys' mangled-name='register_pernet_subsys' filepath='include/net/net_namespace.h' line='374' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='register_pernet_subsys'>
+      <function-decl name='register_pernet_subsys' mangled-name='register_pernet_subsys' filepath='include/net/net_namespace.h' line='381' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='register_pernet_subsys'>
         <parameter type-id='d6907f4c'/>
         <return type-id='95e97e5e'/>
       </function-decl>
@@ -130643,22 +130632,22 @@
     <abi-instr address-size='64' path='net/socket.c' language='LANG_C89'>
       <pointer-type-def type-id='cd5915d8' size-in-bits='64' id='9c68341e'/>
       <pointer-type-def type-id='13103032' size-in-bits='64' id='1a7bb5c8'/>
-      <function-decl name='sock_alloc_file' mangled-name='sock_alloc_file' filepath='net/socket.c' line='387' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_alloc_file'>
-        <parameter type-id='13103032' name='sock' filepath='net/socket.c' line='387' column='1'/>
-        <parameter type-id='95e97e5e' name='flags' filepath='net/socket.c' line='387' column='1'/>
-        <parameter type-id='80f4b756' name='dname' filepath='net/socket.c' line='387' column='1'/>
+      <function-decl name='sock_alloc_file' mangled-name='sock_alloc_file' filepath='net/socket.c' line='399' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_alloc_file'>
+        <parameter type-id='13103032' name='sock' filepath='net/socket.c' line='399' column='1'/>
+        <parameter type-id='95e97e5e' name='flags' filepath='net/socket.c' line='399' column='1'/>
+        <parameter type-id='80f4b756' name='dname' filepath='net/socket.c' line='399' column='1'/>
         <return type-id='77e79a4b'/>
       </function-decl>
-      <function-decl name='sock_release' mangled-name='sock_release' filepath='net/socket.c' line='597' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_release'>
-        <parameter type-id='13103032' name='sock' filepath='net/socket.c' line='597' column='1'/>
+      <function-decl name='sock_release' mangled-name='sock_release' filepath='net/socket.c' line='617' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_release'>
+        <parameter type-id='13103032' name='sock' filepath='net/socket.c' line='617' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='kernel_sendmsg' mangled-name='kernel_sendmsg' filepath='net/socket.c' line='636' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kernel_sendmsg'>
-        <parameter type-id='13103032' name='sock' filepath='net/socket.c' line='636' column='1'/>
-        <parameter type-id='6b9b777a' name='msg' filepath='net/socket.c' line='636' column='1'/>
-        <parameter type-id='9c68341e' name='vec' filepath='net/socket.c' line='637' column='1'/>
-        <parameter type-id='b59d7dce' name='num' filepath='net/socket.c' line='637' column='1'/>
-        <parameter type-id='b59d7dce' name='size' filepath='net/socket.c' line='637' column='1'/>
+      <function-decl name='kernel_sendmsg' mangled-name='kernel_sendmsg' filepath='net/socket.c' line='677' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kernel_sendmsg'>
+        <parameter type-id='13103032' name='sock' filepath='net/socket.c' line='677' column='1'/>
+        <parameter type-id='6b9b777a' name='msg' filepath='net/socket.c' line='677' column='1'/>
+        <parameter type-id='9c68341e' name='vec' filepath='net/socket.c' line='678' column='1'/>
+        <parameter type-id='b59d7dce' name='num' filepath='net/socket.c' line='678' column='1'/>
+        <parameter type-id='b59d7dce' name='size' filepath='net/socket.c' line='678' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-decl name='put_cmsg' mangled-name='put_cmsg' filepath='include/linux/socket.h' line='349' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='put_cmsg'>
@@ -130669,40 +130658,40 @@
         <parameter type-id='eaa32e2f'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='__sock_recv_ts_and_drops' mangled-name='__sock_recv_ts_and_drops' filepath='net/socket.c' line='784' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__sock_recv_ts_and_drops'>
-        <parameter type-id='6b9b777a' name='msg' filepath='net/socket.c' line='784' column='1'/>
-        <parameter type-id='f772df6d' name='sk' filepath='net/socket.c' line='784' column='1'/>
-        <parameter type-id='0fbf3cfd' name='skb' filepath='net/socket.c' line='785' column='1'/>
+      <function-decl name='__sock_recv_ts_and_drops' mangled-name='__sock_recv_ts_and_drops' filepath='net/socket.c' line='838' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__sock_recv_ts_and_drops'>
+        <parameter type-id='6b9b777a' name='msg' filepath='net/socket.c' line='838' column='1'/>
+        <parameter type-id='f772df6d' name='sk' filepath='net/socket.c' line='838' column='1'/>
+        <parameter type-id='0fbf3cfd' name='skb' filepath='net/socket.c' line='839' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='kernel_recvmsg' mangled-name='kernel_recvmsg' filepath='net/socket.c' line='821' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kernel_recvmsg'>
-        <parameter type-id='13103032' name='sock' filepath='net/socket.c' line='821' column='1'/>
-        <parameter type-id='6b9b777a' name='msg' filepath='net/socket.c' line='821' column='1'/>
-        <parameter type-id='9c68341e' name='vec' filepath='net/socket.c' line='822' column='1'/>
-        <parameter type-id='b59d7dce' name='num' filepath='net/socket.c' line='822' column='1'/>
-        <parameter type-id='b59d7dce' name='size' filepath='net/socket.c' line='822' column='1'/>
-        <parameter type-id='95e97e5e' name='flags' filepath='net/socket.c' line='822' column='1'/>
+      <function-decl name='kernel_recvmsg' mangled-name='kernel_recvmsg' filepath='net/socket.c' line='886' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kernel_recvmsg'>
+        <parameter type-id='13103032' name='sock' filepath='net/socket.c' line='886' column='1'/>
+        <parameter type-id='6b9b777a' name='msg' filepath='net/socket.c' line='886' column='1'/>
+        <parameter type-id='9c68341e' name='vec' filepath='net/socket.c' line='887' column='1'/>
+        <parameter type-id='b59d7dce' name='num' filepath='net/socket.c' line='887' column='1'/>
+        <parameter type-id='b59d7dce' name='size' filepath='net/socket.c' line='887' column='1'/>
+        <parameter type-id='95e97e5e' name='flags' filepath='net/socket.c' line='887' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sock_wake_async' mangled-name='sock_wake_async' filepath='net/socket.c' line='1179' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_wake_async'>
-        <parameter type-id='99f34ac1' name='wq' filepath='net/socket.c' line='1179' column='1'/>
-        <parameter type-id='95e97e5e' name='how' filepath='net/socket.c' line='1179' column='1'/>
-        <parameter type-id='95e97e5e' name='band' filepath='net/socket.c' line='1179' column='1'/>
+      <function-decl name='sock_wake_async' mangled-name='sock_wake_async' filepath='net/socket.c' line='1251' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_wake_async'>
+        <parameter type-id='99f34ac1' name='wq' filepath='net/socket.c' line='1251' column='1'/>
+        <parameter type-id='95e97e5e' name='how' filepath='net/socket.c' line='1251' column='1'/>
+        <parameter type-id='95e97e5e' name='band' filepath='net/socket.c' line='1251' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sock_create' mangled-name='sock_create' filepath='net/socket.c' line='1314' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_create'>
-        <parameter type-id='95e97e5e' name='family' filepath='net/socket.c' line='1314' column='1'/>
-        <parameter type-id='95e97e5e' name='type' filepath='net/socket.c' line='1314' column='1'/>
-        <parameter type-id='95e97e5e' name='protocol' filepath='net/socket.c' line='1314' column='1'/>
-        <parameter type-id='1a7bb5c8' name='res' filepath='net/socket.c' line='1314' column='1'/>
+      <function-decl name='sock_create' mangled-name='sock_create' filepath='net/socket.c' line='1412' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_create'>
+        <parameter type-id='95e97e5e' name='family' filepath='net/socket.c' line='1412' column='1'/>
+        <parameter type-id='95e97e5e' name='type' filepath='net/socket.c' line='1412' column='1'/>
+        <parameter type-id='95e97e5e' name='protocol' filepath='net/socket.c' line='1412' column='1'/>
+        <parameter type-id='1a7bb5c8' name='res' filepath='net/socket.c' line='1412' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='sock_create_kern' mangled-name='sock_create_kern' filepath='net/socket.c' line='1320' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_create_kern'>
-        <parameter type-id='a2bff676' name='net' filepath='net/socket.c' line='1320' column='1'/>
-        <parameter type-id='95e97e5e' name='family' filepath='net/socket.c' line='1320' column='1'/>
-        <parameter type-id='95e97e5e' name='type' filepath='net/socket.c' line='1320' column='1'/>
-        <parameter type-id='95e97e5e' name='protocol' filepath='net/socket.c' line='1320' column='1'/>
-        <parameter type-id='1a7bb5c8' name='res' filepath='net/socket.c' line='1320' column='1'/>
+      <function-decl name='sock_create_kern' mangled-name='sock_create_kern' filepath='net/socket.c' line='1430' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_create_kern'>
+        <parameter type-id='a2bff676' name='net' filepath='net/socket.c' line='1430' column='1'/>
+        <parameter type-id='95e97e5e' name='family' filepath='net/socket.c' line='1430' column='1'/>
+        <parameter type-id='95e97e5e' name='type' filepath='net/socket.c' line='1430' column='1'/>
+        <parameter type-id='95e97e5e' name='protocol' filepath='net/socket.c' line='1430' column='1'/>
+        <parameter type-id='1a7bb5c8' name='res' filepath='net/socket.c' line='1430' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-decl name='sock_kmalloc' mangled-name='sock_kmalloc' filepath='include/net/sock.h' line='1622' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_kmalloc'>
@@ -130711,24 +130700,24 @@
         <parameter type-id='f0981eeb'/>
         <return type-id='eaa32e2f'/>
       </function-decl>
-      <function-decl name='kernel_connect' mangled-name='kernel_connect' filepath='net/socket.c' line='3313' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kernel_connect'>
-        <parameter type-id='13103032' name='sock' filepath='net/socket.c' line='3313' column='1'/>
-        <parameter type-id='5c0abad8' name='addr' filepath='net/socket.c' line='3313' column='1'/>
-        <parameter type-id='95e97e5e' name='addrlen' filepath='net/socket.c' line='3313' column='1'/>
-        <parameter type-id='95e97e5e' name='flags' filepath='net/socket.c' line='3314' column='1'/>
+      <function-decl name='kernel_connect' mangled-name='kernel_connect' filepath='net/socket.c' line='3464' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kernel_connect'>
+        <parameter type-id='13103032' name='sock' filepath='net/socket.c' line='3464' column='1'/>
+        <parameter type-id='5c0abad8' name='addr' filepath='net/socket.c' line='3464' column='1'/>
+        <parameter type-id='95e97e5e' name='addrlen' filepath='net/socket.c' line='3464' column='1'/>
+        <parameter type-id='95e97e5e' name='flags' filepath='net/socket.c' line='3465' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='kernel_getsockname' mangled-name='kernel_getsockname' filepath='net/socket.c' line='3320' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kernel_getsockname'>
-        <parameter type-id='13103032' name='sock' filepath='net/socket.c' line='3320' column='1'/>
-        <parameter type-id='5c0abad8' name='addr' filepath='net/socket.c' line='3320' column='1'/>
+      <function-decl name='kernel_getsockname' mangled-name='kernel_getsockname' filepath='net/socket.c' line='3480' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kernel_getsockname'>
+        <parameter type-id='13103032' name='sock' filepath='net/socket.c' line='3480' column='1'/>
+        <parameter type-id='5c0abad8' name='addr' filepath='net/socket.c' line='3480' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='kernel_setsockopt' mangled-name='kernel_setsockopt' filepath='net/socket.c' line='3354' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kernel_setsockopt'>
-        <parameter type-id='13103032' name='sock' filepath='net/socket.c' line='3354' column='1'/>
-        <parameter type-id='95e97e5e' name='level' filepath='net/socket.c' line='3354' column='1'/>
-        <parameter type-id='95e97e5e' name='optname' filepath='net/socket.c' line='3354' column='1'/>
-        <parameter type-id='26a90f95' name='optval' filepath='net/socket.c' line='3355' column='1'/>
-        <parameter type-id='f0981eeb' name='optlen' filepath='net/socket.c' line='3355' column='1'/>
+      <function-decl name='kernel_setsockopt' mangled-name='kernel_setsockopt' filepath='net/socket.c' line='3546' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kernel_setsockopt'>
+        <parameter type-id='13103032' name='sock' filepath='net/socket.c' line='3546' column='1'/>
+        <parameter type-id='95e97e5e' name='level' filepath='net/socket.c' line='3546' column='1'/>
+        <parameter type-id='95e97e5e' name='optname' filepath='net/socket.c' line='3546' column='1'/>
+        <parameter type-id='26a90f95' name='optval' filepath='net/socket.c' line='3547' column='1'/>
+        <parameter type-id='f0981eeb' name='optlen' filepath='net/socket.c' line='3547' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-decl name='sock_no_sendpage' mangled-name='sock_no_sendpage' filepath='include/net/sock.h' line='1663' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sock_no_sendpage'>
@@ -131485,6 +131474,15 @@
         <enumerator name='NL80211_BAND_60GHZ' value='2'/>
         <enumerator name='NUM_NL80211_BANDS' value='3'/>
       </enum-decl>
+      <typedef-decl name='iw_handler' type-id='2c8ff697' filepath='include/net/iw_handler.h' line='315' column='1' id='bcc5cab3'/>
+      <class-decl name='iw_request_info' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/net/iw_handler.h' line='304' column='1' id='e90b3b44'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='d315442e' visibility='default' filepath='include/net/iw_handler.h' line='305' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='flags' type-id='d315442e' visibility='default' filepath='include/net/iw_handler.h' line='306' column='1'/>
+        </data-member>
+      </class-decl>
       <union-decl name='iwreq_data' size-in-bits='128' visibility='default' filepath='include/uapi/linux/wireless.h' line='902' column='1' id='ed626d0d'>
         <data-member access='public'>
           <var-decl name='name' type-id='ac1fa8c0' visibility='default' filepath='include/uapi/linux/wireless.h' line='904' column='1'/>
@@ -131541,15 +131539,6 @@
           <var-decl name='data' type-id='db4e746c' visibility='default' filepath='include/uapi/linux/wireless.h' line='930' column='1'/>
         </data-member>
       </union-decl>
-      <typedef-decl name='iw_handler' type-id='2c8ff697' filepath='include/net/iw_handler.h' line='315' column='1' id='bcc5cab3'/>
-      <class-decl name='iw_request_info' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/net/iw_handler.h' line='304' column='1' id='e90b3b44'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='cmd' type-id='d315442e' visibility='default' filepath='include/net/iw_handler.h' line='305' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='16'>
-          <var-decl name='flags' type-id='d315442e' visibility='default' filepath='include/net/iw_handler.h' line='306' column='1'/>
-        </data-member>
-      </class-decl>
       <class-decl name='iw_point' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='691' column='1' id='db4e746c'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='pointer' type-id='eaa32e2f' visibility='default' filepath='include/uapi/linux/wireless.h' line='692' column='1'/>
@@ -133744,7 +133733,7 @@
         <enumerator name='__NL80211_BSS_SELECT_ATTR_AFTER_LAST' value='4'/>
         <enumerator name='NL80211_BSS_SELECT_ATTR_MAX' value='3'/>
       </enum-decl>
-      <union-decl name='__anonymous_union__3' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/cfg80211.h' line='2331' column='1' id='0532d6f6'>
+      <union-decl name='__anonymous_union__13' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/cfg80211.h' line='2331' column='1' id='0532d6f6'>
         <data-member access='public'>
           <var-decl name='band_pref' type-id='3eaa0294' visibility='default' filepath='include/net/cfg80211.h' line='2332' column='1'/>
         </data-member>
@@ -136145,30 +136134,30 @@
         <parameter type-id='d2b455cb' name='privacy' filepath='net/wireless/scan.c' line='860' column='1'/>
         <return type-id='bda81d86'/>
       </function-decl>
-      <function-decl name='cfg80211_inform_bss_data' mangled-name='cfg80211_inform_bss_data' filepath='net/wireless/scan.c' line='1495' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_inform_bss_data'>
-        <parameter type-id='666fb412' name='wiphy' filepath='net/wireless/scan.c' line='1495' column='1'/>
-        <parameter type-id='6ff43814' name='data' filepath='net/wireless/scan.c' line='1496' column='1'/>
-        <parameter type-id='b556f108' name='ftype' filepath='net/wireless/scan.c' line='1497' column='1'/>
-        <parameter type-id='bbaf3419' name='bssid' filepath='net/wireless/scan.c' line='1498' column='1'/>
-        <parameter type-id='91ce1af9' name='tsf' filepath='net/wireless/scan.c' line='1498' column='1'/>
-        <parameter type-id='1dc6a898' name='capability' filepath='net/wireless/scan.c' line='1498' column='1'/>
-        <parameter type-id='1dc6a898' name='beacon_interval' filepath='net/wireless/scan.c' line='1499' column='1'/>
-        <parameter type-id='bbaf3419' name='ie' filepath='net/wireless/scan.c' line='1499' column='1'/>
-        <parameter type-id='b59d7dce' name='ielen' filepath='net/wireless/scan.c' line='1499' column='1'/>
-        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/scan.c' line='1500' column='1'/>
+      <function-decl name='cfg80211_inform_bss_data' mangled-name='cfg80211_inform_bss_data' filepath='net/wireless/scan.c' line='1493' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_inform_bss_data'>
+        <parameter type-id='666fb412' name='wiphy' filepath='net/wireless/scan.c' line='1493' column='1'/>
+        <parameter type-id='6ff43814' name='data' filepath='net/wireless/scan.c' line='1494' column='1'/>
+        <parameter type-id='b556f108' name='ftype' filepath='net/wireless/scan.c' line='1495' column='1'/>
+        <parameter type-id='bbaf3419' name='bssid' filepath='net/wireless/scan.c' line='1496' column='1'/>
+        <parameter type-id='91ce1af9' name='tsf' filepath='net/wireless/scan.c' line='1496' column='1'/>
+        <parameter type-id='1dc6a898' name='capability' filepath='net/wireless/scan.c' line='1496' column='1'/>
+        <parameter type-id='1dc6a898' name='beacon_interval' filepath='net/wireless/scan.c' line='1497' column='1'/>
+        <parameter type-id='bbaf3419' name='ie' filepath='net/wireless/scan.c' line='1497' column='1'/>
+        <parameter type-id='b59d7dce' name='ielen' filepath='net/wireless/scan.c' line='1497' column='1'/>
+        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/scan.c' line='1498' column='1'/>
         <return type-id='bda81d86'/>
       </function-decl>
-      <function-decl name='cfg80211_inform_bss_frame_data' mangled-name='cfg80211_inform_bss_frame_data' filepath='net/wireless/scan.c' line='1716' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_inform_bss_frame_data'>
-        <parameter type-id='666fb412' name='wiphy' filepath='net/wireless/scan.c' line='1716' column='1'/>
-        <parameter type-id='6ff43814' name='data' filepath='net/wireless/scan.c' line='1717' column='1'/>
-        <parameter type-id='57a568d1' name='mgmt' filepath='net/wireless/scan.c' line='1718' column='1'/>
-        <parameter type-id='b59d7dce' name='len' filepath='net/wireless/scan.c' line='1718' column='1'/>
-        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/scan.c' line='1719' column='1'/>
+      <function-decl name='cfg80211_inform_bss_frame_data' mangled-name='cfg80211_inform_bss_frame_data' filepath='net/wireless/scan.c' line='1714' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_inform_bss_frame_data'>
+        <parameter type-id='666fb412' name='wiphy' filepath='net/wireless/scan.c' line='1714' column='1'/>
+        <parameter type-id='6ff43814' name='data' filepath='net/wireless/scan.c' line='1715' column='1'/>
+        <parameter type-id='57a568d1' name='mgmt' filepath='net/wireless/scan.c' line='1716' column='1'/>
+        <parameter type-id='b59d7dce' name='len' filepath='net/wireless/scan.c' line='1716' column='1'/>
+        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/scan.c' line='1717' column='1'/>
         <return type-id='bda81d86'/>
       </function-decl>
-      <function-decl name='cfg80211_unlink_bss' mangled-name='cfg80211_unlink_bss' filepath='net/wireless/scan.c' line='1795' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_unlink_bss'>
-        <parameter type-id='666fb412' name='wiphy' filepath='net/wireless/scan.c' line='1795' column='1'/>
-        <parameter type-id='bda81d86' name='pub' filepath='net/wireless/scan.c' line='1795' column='1'/>
+      <function-decl name='cfg80211_unlink_bss' mangled-name='cfg80211_unlink_bss' filepath='net/wireless/scan.c' line='1793' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_unlink_bss'>
+        <parameter type-id='666fb412' name='wiphy' filepath='net/wireless/scan.c' line='1793' column='1'/>
+        <parameter type-id='bda81d86' name='pub' filepath='net/wireless/scan.c' line='1793' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
     </abi-instr>
@@ -136298,17 +136287,6 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='net/wireless/util.c' language='LANG_C89'>
-      <union-decl name='__anonymous_union__1' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='854e942c'>
-        <data-member access='public'>
-          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide33' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-      </union-decl>
       <pointer-type-def type-id='5ece574c' size-in-bits='64' id='185e765a'/>
       <function-decl name='ieee80211_channel_to_frequency' mangled-name='ieee80211_channel_to_frequency' filepath='net/wireless/util.c' line='71' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ieee80211_channel_to_frequency'>
         <parameter type-id='95e97e5e' name='chan' filepath='net/wireless/util.c' line='71' column='1'/>
@@ -136328,8 +136306,8 @@
         <parameter type-id='23119536' name='fc' filepath='net/wireless/util.c' line='386' column='1'/>
         <return type-id='f0981eeb'/>
       </function-decl>
-      <function-decl name='cfg80211_calculate_bitrate' mangled-name='cfg80211_calculate_bitrate' filepath='net/wireless/util.c' line='1303' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_calculate_bitrate'>
-        <parameter type-id='185e765a' name='rate' filepath='net/wireless/util.c' line='1303' column='1'/>
+      <function-decl name='cfg80211_calculate_bitrate' mangled-name='cfg80211_calculate_bitrate' filepath='net/wireless/util.c' line='1306' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_calculate_bitrate'>
+        <parameter type-id='185e765a' name='rate' filepath='net/wireless/util.c' line='1306' column='1'/>
         <return type-id='19c2251e'/>
       </function-decl>
     </abi-instr>

commit 2ed15814a0c5436245199957f043e0b5a185482b
Author: Yu Qiaowei <cerf.yu@rock-chips.com>
Date:   Thu Aug 26 15:48:18 2021 +0800

    video/rockchip: rga2: Fix the misconfiguration of srcover's globalalpha
    
    Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
    Change-Id: I547ce7a8938a37ac96223f7435b94ec839b3ceba

diff --git a/drivers/video/rockchip/rga2/rga2_reg_info.c b/drivers/video/rockchip/rga2/rga2_reg_info.c
index 29e0dee977ad..544e968a3d92 100644
--- a/drivers/video/rockchip/rga2/rga2_reg_info.c
+++ b/drivers/video/rockchip/rga2/rga2_reg_info.c
@@ -1278,9 +1278,9 @@ void RGA_MSG_2_RGA2_MSG(struct rga_req *req_rga, struct rga2_req *req)
                         alpha_mode_1 = 0x3010;
                     }
                     else if ((req_rga->alpha_rop_mode & 3) == 1) {
-                        /* dst use globalAlpha, and dst does not have pixelAlpha. */
-                        alpha_mode_0 = 0x3012;
-                        alpha_mode_1 = 0x3012;
+                        /* Do not use globalAlpha. */
+                        alpha_mode_0 = 0x3212;
+                        alpha_mode_1 = 0x3212;
                     }
                     else if ((req_rga->alpha_rop_mode & 3) == 2) {
                         /* dst use globalAlpha, and dst has pixelAlpha. */
@@ -1288,9 +1288,9 @@ void RGA_MSG_2_RGA2_MSG(struct rga_req *req_rga, struct rga2_req *req)
                         alpha_mode_1 = 0x3014;
                     }
                     else {
-                        /* Do not use globalAlpha. */
-                        alpha_mode_0 = 0x3212;
-                        alpha_mode_1 = 0x3212;
+                        /* dst use globalAlpha, and dst does not have pixelAlpha. */
+                        alpha_mode_0 = 0x3012;
+                        alpha_mode_1 = 0x3012;
                     }
                     req->alpha_mode_0 = alpha_mode_0;
                     req->alpha_mode_1 = alpha_mode_1;

commit 0691bb0b691ba54f30e982bac0eaac430f215eca
Author: Herman Chen <herman.chen@rock-chips.com>
Date:   Thu Aug 26 09:48:22 2021 +0800

    video: rockchip: mpp: rkvdec2: Add task timing
    
    NOTE: On link mode the timing is start from driver push task to hardware
    linked queue. So the timing is not actual the hardware timing on multi
    decoder case.
    
    echo 0x100 > /sys/module/rk_vcodec/parameters/mpp_dev_debug
    
    This command for hardware performance test is still valid. But the
    hardware timing output is accurate only on single decoder case.
    
    Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
    Change-Id: I4db4a35955cb1e42e3f250583e83d88c2fde5872

diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2.c b/drivers/video/rockchip/mpp/mpp_rkvdec2.c
index a3857847e698..882b2dad8e32 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvdec2.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec2.c
@@ -304,6 +304,7 @@ static int rkvdec2_run(struct mpp_dev *mpp, struct mpp_task *mpp_task)
 	}
 	/* init current task */
 	mpp->cur_task = mpp_task;
+	mpp_time_record(mpp_task);
 	/* Flush the register before the start the device */
 	wmb();
 	mpp_write(mpp, RKVDEC_REG_START_EN_BASE, task->reg[reg_en] | RKVDEC_START_EN);
diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c
index 2fab9449a601..a12deb17997c 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c
@@ -447,6 +447,7 @@ static int rkvdec_link_send_task_to_hw(struct rkvdec_link_dev *dev,
 			set_bit(TASK_STATE_START, &task_ddr->state);
 			schedule_delayed_work(&task_ddr->timeout_work,
 					      msecs_to_jiffies(200));
+			mpp_time_record(task_ddr);
 		}
 	} else {
 		if (task_total)
@@ -566,6 +567,7 @@ static int rkvdec_link_isr_recv_task(struct mpp_dev *mpp,
 			continue;
 		}
 
+		mpp_time_diff(mpp_task);
 		task = to_rkvdec2_task(mpp_task);
 		regs = table_base + idx * link_dec->link_reg_count;
 		irq_status = regs[info->tb_reg_int];
@@ -1173,7 +1175,6 @@ static int mpp_task_queue(struct mpp_dev *mpp, struct mpp_task *task)
 	}
 
 	rkvdec2_link_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));
 

commit e23d55af0e1fca9be5c99f0c37d48b289f4d6489
Author: Sasha Levin <sashal@kernel.org>
Date:   Thu Aug 26 08:56:20 2021 -0400

    Linux 4.19.205
    
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Hulk Robot <hulkrobot@huawei.com>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/Makefile b/Makefile
index d4ffcafb8efa..abc35829f47b 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 204
+SUBLEVEL = 205
 EXTRAVERSION =
 NAME = "People's Front"
 

commit 991158d680774ca5010fe6e15aa3a61aebfdf688
Author: Sergey Marinkevich <sergey.marinkevich@eltex-co.ru>
Date:   Sun Mar 29 19:19:14 2020 +0700

    netfilter: nft_exthdr: fix endianness of tcp option cast
    
    [ Upstream commit 2e34328b396a69b73661ba38d47d92b7cf21c2c4 ]
    
    I got a problem on MIPS with Big-Endian is turned on: every time when
    NF trying to change TCP MSS it returns because of new.v16 was greater
    than old.v16. But real MSS was 1460 and my rule was like this:
    
            add rule table chain tcp option maxseg size set 1400
    
    And 1400 is lesser that 1460, not greater.
    
    Later I founded that main causer is cast from u32 to __be16.
    
    Debugging:
    
    In example MSS = 1400(HEX: 0x578). Here is representation of each byte
    like it is in memory by addresses from left to right(e.g. [0x0 0x1 0x2
    0x3]). LE ??Little-Endian system, BE ??Big-Endian, left column is type.
    
                 LE               BE
            u32: [78 05 00 00]    [00 00 05 78]
    
    As you can see, u32 representation will be casted to u16 from different
    half of 4-byte address range. But actually nf_tables uses registers and
    store data of various size. Actually TCP MSS stored in 2 bytes. But
    registers are still u32 in definition:
    
            struct nft_regs {
                    union {
                            u32                     data[20];
                            struct nft_verdict      verdict;
                    };
            };
    
    So, access like regs->data[priv->sreg] exactly u32. So, according to
    table presents above, per-byte representation of stored TCP MSS in
    register will be:
    
                                 LE               BE
            (u32)regs->data[]:   [78 05 00 00]    [05 78 00 00]
                                                   ^^ ^^
    
    We see that register uses just half of u32 and other 2 bytes may be
    used for some another data. But in nft_exthdr_tcp_set_eval() it casted
    just like u32 -> __be16:
    
            new.v16 = src
    
    But u32 overfill __be16, so it get 2 low bytes. For clarity draw
    one more table(<xx xx> means that bytes will be used for cast).
    
                                 LE                 BE
            u32:                 [<78 05> 00 00]    [00 00 <05 78>]
            (u32)regs->data[]:   [<78 05> 00 00]    [05 78 <00 00>]
    
    As you can see, for Little-Endian nothing changes, but for Big-endian we
    take the wrong half. In my case there is some other data instead of
    zeros, so new MSS was wrongly greater.
    
    For shooting this bug I used solution for ports ranges. Applying of this
    patch does not affect Little-Endian systems.
    
    Signed-off-by: Sergey Marinkevich <sergey.marinkevich@eltex-co.ru>
    Acked-by: Florian Westphal <fw@strlen.de>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netfilter/nft_exthdr.c b/net/netfilter/nft_exthdr.c
index 64e69d6683ca..93fee4106019 100644
--- a/net/netfilter/nft_exthdr.c
+++ b/net/netfilter/nft_exthdr.c
@@ -137,7 +137,6 @@ static void nft_exthdr_tcp_set_eval(const struct nft_expr *expr,
 	unsigned int i, optl, tcphdr_len, offset;
 	struct tcphdr *tcph;
 	u8 *opt;
-	u32 src;
 
 	tcph = nft_tcp_header_pointer(pkt, sizeof(buff), buff, &tcphdr_len);
 	if (!tcph)
@@ -146,7 +145,6 @@ static void nft_exthdr_tcp_set_eval(const struct nft_expr *expr,
 	opt = (u8 *)tcph;
 	for (i = sizeof(*tcph); i < tcphdr_len - 1; i += optl) {
 		union {
-			u8 octet;
 			__be16 v16;
 			__be32 v32;
 		} old, new;
@@ -167,13 +165,13 @@ static void nft_exthdr_tcp_set_eval(const struct nft_expr *expr,
 		if (!tcph)
 			return;
 
-		src = regs->data[priv->sreg];
 		offset = i + priv->offset;
 
 		switch (priv->len) {
 		case 2:
 			old.v16 = get_unaligned((u16 *)(opt + offset));
-			new.v16 = src;
+			new.v16 = (__force __be16)nft_reg_load16(
+				&regs->data[priv->sreg]);
 
 			switch (priv->type) {
 			case TCPOPT_MSS:
@@ -191,7 +189,7 @@ static void nft_exthdr_tcp_set_eval(const struct nft_expr *expr,
 						 old.v16, new.v16, false);
 			break;
 		case 4:
-			new.v32 = src;
+			new.v32 = regs->data[priv->sreg];
 			old.v32 = get_unaligned((u32 *)(opt + offset));
 
 			if (old.v32 == new.v32)

commit 6ce8ad137e3ad0ea20a55fdb8d9cfe01bd79a109
Author: Jeff Layton <jlayton@kernel.org>
Date:   Fri Aug 20 09:29:50 2021 -0400

    fs: warn about impending deprecation of mandatory locks
    
    [ Upstream commit fdd92b64d15bc4aec973caa25899afd782402e68 ]
    
    We've had CONFIG_MANDATORY_FILE_LOCKING since 2015 and a lot of distros
    have disabled it. Warn the stragglers that still use "-o mand" that
    we'll be dropping support for that mount option.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/namespace.c b/fs/namespace.c
index 8d2bf350e7c6..2f3c6a0350a8 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -1611,8 +1611,12 @@ static inline bool may_mount(void)
 }
 
 #ifdef	CONFIG_MANDATORY_FILE_LOCKING
-static inline bool may_mandlock(void)
+static bool may_mandlock(void)
 {
+	pr_warn_once("======================================================\n"
+		     "WARNING: the mand mount option is being deprecated and\n"
+		     "         will be removed in v5.15!\n"
+		     "======================================================\n");
 	return capable(CAP_SYS_ADMIN);
 }
 #else

commit 3cab951cf059bd6854c3b796f6df928f0c78224c
Author: Jeff Layton <jlayton@kernel.org>
Date:   Thu Aug 15 15:21:17 2019 -0400

    locks: print a warning when mount fails due to lack of "mand" support
    
    [ Upstream commit df2474a22c42ce419b67067c52d71da06c385501 ]
    
    Since 9e8925b67a ("locks: Allow disabling mandatory locking at compile
    time"), attempts to mount filesystems with "-o mand" will fail.
    Unfortunately, there is no other indiciation of the reason for the
    failure.
    
    Change how the function is defined for better readability. When
    CONFIG_MANDATORY_FILE_LOCKING is disabled, printk a warning when
    someone attempts to mount with -o mand.
    
    Also, add a blurb to the mandatory-locking.txt file to explain about
    the "mand" option, and the behavior one should expect when it is
    disabled.
    
    Reported-by: Jan Kara <jack@suse.cz>
    Reviewed-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/Documentation/filesystems/mandatory-locking.txt b/Documentation/filesystems/mandatory-locking.txt
index 0979d1d2ca8b..a251ca33164a 100644
--- a/Documentation/filesystems/mandatory-locking.txt
+++ b/Documentation/filesystems/mandatory-locking.txt
@@ -169,3 +169,13 @@ havoc if they lock crucial files. The way around it is to change the file
 permissions (remove the setgid bit) before trying to read or write to it.
 Of course, that might be a bit tricky if the system is hung :-(
 
+7. The "mand" mount option
+--------------------------
+Mandatory locking is disabled on all filesystems by default, and must be
+administratively enabled by mounting with "-o mand". That mount option
+is only allowed if the mounting task has the CAP_SYS_ADMIN capability.
+
+Since kernel v4.5, it is possible to disable mandatory locking
+altogether by setting CONFIG_MANDATORY_FILE_LOCKING to "n". A kernel
+with this disabled will reject attempts to mount filesystems with the
+"mand" mount option with the error status EPERM.
diff --git a/fs/namespace.c b/fs/namespace.c
index edd397fa2991..8d2bf350e7c6 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -1610,13 +1610,18 @@ static inline bool may_mount(void)
 	return ns_capable(current->nsproxy->mnt_ns->user_ns, CAP_SYS_ADMIN);
 }
 
+#ifdef	CONFIG_MANDATORY_FILE_LOCKING
 static inline bool may_mandlock(void)
 {
-#ifndef	CONFIG_MANDATORY_FILE_LOCKING
-	return false;
-#endif
 	return capable(CAP_SYS_ADMIN);
 }
+#else
+static inline bool may_mandlock(void)
+{
+	pr_warn("VFS: \"mand\" mount option not supported");
+	return false;
+}
+#endif
 
 /*
  * Now umount can handle mount points as well as block devices.

commit c764cf4c8f93485e38048c91d5c935a3f817f6e2
Author: Takashi Iwai <tiwai@suse.de>
Date:   Thu Aug 19 17:29:45 2021 +0200

    ASoC: intel: atom: Fix breakage for PCM buffer address setup
    
    [ Upstream commit 65ca89c2b12cca0d473f3dd54267568ad3af55cc ]
    
    The commit 2e6b836312a4 ("ASoC: intel: atom: Fix reference to PCM
    buffer address") changed the reference of PCM buffer address to
    substream->runtime->dma_addr as the buffer address may change
    dynamically.  However, I forgot that the dma_addr field is still not
    set up for the CONTINUOUS buffer type (that this driver uses) yet in
    5.14 and earlier kernels, and it resulted in garbage I/O.  The problem
    will be fixed in 5.15, but we need to address it quickly for now.
    
    The fix is to deduce the address again from the DMA pointer with
    virt_to_phys(), but from the right one, substream->runtime->dma_area.
    
    Fixes: 2e6b836312a4 ("ASoC: intel: atom: Fix reference to PCM buffer address")
    Reported-and-tested-by: Hans de Goede <hdegoede@redhat.com>
    Cc: <stable@vger.kernel.org>
    Acked-by: Mark Brown <broonie@kernel.org>
    Link: https://lore.kernel.org/r/2048c6aa-2187-46bd-6772-36a4fb3c5aeb@redhat.com
    Link: https://lore.kernel.org/r/20210819152945.8510-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/intel/atom/sst-mfld-platform-pcm.c b/sound/soc/intel/atom/sst-mfld-platform-pcm.c
index 501ac836777a..682ee41ec75c 100644
--- a/sound/soc/intel/atom/sst-mfld-platform-pcm.c
+++ b/sound/soc/intel/atom/sst-mfld-platform-pcm.c
@@ -135,7 +135,7 @@ static void sst_fill_alloc_params(struct snd_pcm_substream *substream,
 	snd_pcm_uframes_t period_size;
 	ssize_t periodbytes;
 	ssize_t buffer_bytes = snd_pcm_lib_buffer_bytes(substream);
-	u32 buffer_addr = substream->runtime->dma_addr;
+	u32 buffer_addr = virt_to_phys(substream->runtime->dma_area);
 
 	channels = substream->runtime->channels;
 	period_size = substream->runtime->period_size;

commit aad377827b65f466f0416172e2bddc9959e181c9
Author: Marcin Bachry <hegel666@gmail.com>
Date:   Wed Jul 21 22:58:58 2021 -0400

    PCI: Increase D3 delay for AMD Renoir/Cezanne XHCI
    
    [ Upstream commit e0bff43220925b7e527f9d3bc9f5c624177c959e ]
    
    The Renoir XHCI controller apparently doesn't resume reliably with the
    standard D3hot-to-D0 delay.  Increase it to 20ms.
    
    [Alex: I talked to the AMD USB hardware team and the AMD Windows team and
    they are not aware of any HW errata or specific issues.  The HW works fine
    in Windows.  I was told Windows uses a rather generous default delay of
    100ms for PCI state transitions.]
    
    Link: https://lore.kernel.org/r/20210722025858.220064-1-alexander.deucher@amd.com
    Signed-off-by: Marcin Bachry <hegel666@gmail.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Cc: stable@vger.kernel.org
    Cc: Mario Limonciello <mario.limonciello@amd.com>
    Cc: Prike Liang <prike.liang@amd.com>
    Cc: Shyam Sundar S K <shyam-sundar.s-k@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index f287a9f919da..7e873b6b7d55 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -1882,6 +1882,7 @@ static void quirk_ryzen_xhci_d3hot(struct pci_dev *dev)
 }
 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x15e0, quirk_ryzen_xhci_d3hot);
 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x15e1, quirk_ryzen_xhci_d3hot);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x1639, quirk_ryzen_xhci_d3hot);
 
 #ifdef CONFIG_X86_IO_APIC
 static int dmi_disable_ioapicreroute(const struct dmi_system_id *d)

commit 9732f81ed648a6afe76e1f605a8c8048a0cbc28a
Author: NeilBrown <neilb@suse.de>
Date:   Fri Aug 6 14:26:24 2021 +1000

    btrfs: prevent rename2 from exchanging a subvol with a directory from different parents
    
    [ Upstream commit 3f79f6f6247c83f448c8026c3ee16d4636ef8d4f ]
    
    Cross-rename lacks a check when that would prevent exchanging a
    directory and subvolume from different parent subvolume. This causes
    data inconsistencies and is caught before commit by tree-checker,
    turning the filesystem to read-only.
    
    Calling the renameat2 with RENAME_EXCHANGE flags like
    
      renameat2(AT_FDCWD, namesrc, AT_FDCWD, namedest, (1 << 1))
    
    on two paths:
    
      namesrc = dir1/subvol1/dir2
     namedest = subvol2/subvol3
    
    will cause key order problem with following write time tree-checker
    report:
    
      [1194842.307890] BTRFS critical (device loop1): corrupt leaf: root=5 block=27574272 slot=10 ino=258, invalid previous key objectid, have 257 expect 258
      [1194842.322221] BTRFS info (device loop1): leaf 27574272 gen 8 total ptrs 11 free space 15444 owner 5
      [1194842.331562] BTRFS info (device loop1): refs 2 lock_owner 0 current 26561
      [1194842.338772]        item 0 key (256 1 0) itemoff 16123 itemsize 160
      [1194842.338793]                inode generation 3 size 16 mode 40755
      [1194842.338801]        item 1 key (256 12 256) itemoff 16111 itemsize 12
      [1194842.338809]        item 2 key (256 84 2248503653) itemoff 16077 itemsize 34
      [1194842.338817]                dir oid 258 type 2
      [1194842.338823]        item 3 key (256 84 2363071922) itemoff 16043 itemsize 34
      [1194842.338830]                dir oid 257 type 2
      [1194842.338836]        item 4 key (256 96 2) itemoff 16009 itemsize 34
      [1194842.338843]        item 5 key (256 96 3) itemoff 15975 itemsize 34
      [1194842.338852]        item 6 key (257 1 0) itemoff 15815 itemsize 160
      [1194842.338863]                inode generation 6 size 8 mode 40755
      [1194842.338869]        item 7 key (257 12 256) itemoff 15801 itemsize 14
      [1194842.338876]        item 8 key (257 84 2505409169) itemoff 15767 itemsize 34
      [1194842.338883]                dir oid 256 type 2
      [1194842.338888]        item 9 key (257 96 2) itemoff 15733 itemsize 34
      [1194842.338895]        item 10 key (258 12 256) itemoff 15719 itemsize 14
      [1194842.339163] BTRFS error (device loop1): block=27574272 write time tree block corruption detected
      [1194842.339245] ------------[ cut here ]------------
      [1194842.443422] WARNING: CPU: 6 PID: 26561 at fs/btrfs/disk-io.c:449 csum_one_extent_buffer+0xed/0x100 [btrfs]
      [1194842.511863] CPU: 6 PID: 26561 Comm: kworker/u17:2 Not tainted 5.14.0-rc3-git+ #793
      [1194842.511870] Hardware name: empty empty/S3993, BIOS PAQEX0-3 02/24/2008
      [1194842.511876] Workqueue: btrfs-worker-high btrfs_work_helper [btrfs]
      [1194842.511976] RIP: 0010:csum_one_extent_buffer+0xed/0x100 [btrfs]
      [1194842.512068] RSP: 0018:ffffa2c284d77da0 EFLAGS: 00010282
      [1194842.512074] RAX: 0000000000000000 RBX: 0000000000001000 RCX: ffff928867bd9978
      [1194842.512078] RDX: 0000000000000000 RSI: 0000000000000027 RDI: ffff928867bd9970
      [1194842.512081] RBP: ffff92876b958000 R08: 0000000000000001 R09: 00000000000c0003
      [1194842.512085] R10: 0000000000000000 R11: 0000000000000001 R12: 0000000000000000
      [1194842.512088] R13: ffff92875f989f98 R14: 0000000000000000 R15: 0000000000000000
      [1194842.512092] FS:  0000000000000000(0000) GS:ffff928867a00000(0000) knlGS:0000000000000000
      [1194842.512095] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [1194842.512099] CR2: 000055f5384da1f0 CR3: 0000000102fe4000 CR4: 00000000000006e0
      [1194842.512103] Call Trace:
      [1194842.512128]  ? run_one_async_free+0x10/0x10 [btrfs]
      [1194842.631729]  btree_csum_one_bio+0x1ac/0x1d0 [btrfs]
      [1194842.631837]  run_one_async_start+0x18/0x30 [btrfs]
      [1194842.631938]  btrfs_work_helper+0xd5/0x1d0 [btrfs]
      [1194842.647482]  process_one_work+0x262/0x5e0
      [1194842.647520]  worker_thread+0x4c/0x320
      [1194842.655935]  ? process_one_work+0x5e0/0x5e0
      [1194842.655946]  kthread+0x135/0x160
      [1194842.655953]  ? set_kthread_struct+0x40/0x40
      [1194842.655965]  ret_from_fork+0x1f/0x30
      [1194842.672465] irq event stamp: 1729
      [1194842.672469] hardirqs last  enabled at (1735): [<ffffffffbd1104f5>] console_trylock_spinning+0x185/0x1a0
      [1194842.672477] hardirqs last disabled at (1740): [<ffffffffbd1104cc>] console_trylock_spinning+0x15c/0x1a0
      [1194842.672482] softirqs last  enabled at (1666): [<ffffffffbdc002e1>] __do_softirq+0x2e1/0x50a
      [1194842.672491] softirqs last disabled at (1651): [<ffffffffbd08aab7>] __irq_exit_rcu+0xa7/0xd0
    
    The corrupted data will not be written, and filesystem can be unmounted
    and mounted again (all changes since the last commit will be lost).
    
    Add the missing check for new_ino so that all non-subvolumes must reside
    under the same parent subvolume. There's an exception allowing to
    exchange two subvolumes from any parents as the directory representing a
    subvolume is only a logical link and does not have any other structures
    related to the parent subvolume, unlike files, directories etc, that
    are always in the inode namespace of the parent subvolume.
    
    Fixes: cdd1fedf8261 ("btrfs: add support for RENAME_EXCHANGE and RENAME_WHITEOUT")
    CC: stable@vger.kernel.org # 4.7+
    Reviewed-by: Nikolay Borisov <nborisov@suse.com>
    Signed-off-by: NeilBrown <neilb@suse.de>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index d29f4cf125d2..6f02a3f77fa8 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -9556,8 +9556,14 @@ static int btrfs_rename_exchange(struct inode *old_dir,
 	bool sync_log_dest = false;
 	bool commit_transaction = false;
 
-	/* we only allow rename subvolume link between subvolumes */
-	if (old_ino != BTRFS_FIRST_FREE_OBJECTID && root != dest)
+	/*
+	 * For non-subvolumes allow exchange only within one subvolume, in the
+	 * same inode namespace. Two subvolumes (represented as directory) can
+	 * be exchanged as they're a logical link and have a fixed inode number.
+	 */
+	if (root != dest &&
+	    (old_ino != BTRFS_FIRST_FREE_OBJECTID ||
+	     new_ino != BTRFS_FIRST_FREE_OBJECTID))
 		return -EXDEV;
 
 	btrfs_init_log_ctx(&ctx_root, old_inode);

commit f4f2872d6641d7744081711034ee96c4b5ca206c
Author: Dongliang Mu <mudongliangabcd@gmail.com>
Date:   Tue Aug 10 18:03:19 2021 +0800

    ipack: tpci200: fix memory leak in the tpci200_register
    
    [ Upstream commit 50f05bd114a46a74726e432bf81079d3f13a55b7 ]
    
    The error handling code in tpci200_register does not free interface_regs
    allocated by ioremap and the current version of error handling code is
    problematic.
    
    Fix this by refactoring the error handling code and free interface_regs
    when necessary.
    
    Fixes: 43986798fd50 ("ipack: add error handling for ioremap_nocache")
    Cc: stable@vger.kernel.org
    Reported-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Link: https://lore.kernel.org/r/20210810100323.3938492-2-mudongliangabcd@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/ipack/carriers/tpci200.c b/drivers/ipack/carriers/tpci200.c
index 2172d1efa71e..4c8da6af2516 100644
--- a/drivers/ipack/carriers/tpci200.c
+++ b/drivers/ipack/carriers/tpci200.c
@@ -259,7 +259,7 @@ static int tpci200_register(struct tpci200_board *tpci200)
 			"(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 2 !",
 			tpci200->info->pdev->bus->number,
 			tpci200->info->pdev->devfn);
-		goto out_disable_pci;
+		goto err_disable_device;
 	}
 
 	/* Request IO ID INT space (Bar 3) */
@@ -271,7 +271,7 @@ static int tpci200_register(struct tpci200_board *tpci200)
 			"(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 3 !",
 			tpci200->info->pdev->bus->number,
 			tpci200->info->pdev->devfn);
-		goto out_release_ip_space;
+		goto err_ip_interface_bar;
 	}
 
 	/* Request MEM8 space (Bar 5) */
@@ -282,7 +282,7 @@ static int tpci200_register(struct tpci200_board *tpci200)
 			"(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 5!",
 			tpci200->info->pdev->bus->number,
 			tpci200->info->pdev->devfn);
-		goto out_release_ioid_int_space;
+		goto err_io_id_int_spaces_bar;
 	}
 
 	/* Request MEM16 space (Bar 4) */
@@ -293,7 +293,7 @@ static int tpci200_register(struct tpci200_board *tpci200)
 			"(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 4!",
 			tpci200->info->pdev->bus->number,
 			tpci200->info->pdev->devfn);
-		goto out_release_mem8_space;
+		goto err_mem8_space_bar;
 	}
 
 	/* Map internal tpci200 driver user space */
@@ -307,7 +307,7 @@ static int tpci200_register(struct tpci200_board *tpci200)
 			tpci200->info->pdev->bus->number,
 			tpci200->info->pdev->devfn);
 		res = -ENOMEM;
-		goto out_release_mem8_space;
+		goto err_mem16_space_bar;
 	}
 
 	/* Initialize lock that protects interface_regs */
@@ -346,18 +346,22 @@ static int tpci200_register(struct tpci200_board *tpci200)
 			"(bn 0x%X, sn 0x%X) unable to register IRQ !",
 			tpci200->info->pdev->bus->number,
 			tpci200->info->pdev->devfn);
-		goto out_release_ioid_int_space;
+		goto err_interface_regs;
 	}
 
 	return 0;
 
-out_release_mem8_space:
+err_interface_regs:
+	pci_iounmap(tpci200->info->pdev, tpci200->info->interface_regs);
+err_mem16_space_bar:
+	pci_release_region(tpci200->info->pdev, TPCI200_MEM16_SPACE_BAR);
+err_mem8_space_bar:
 	pci_release_region(tpci200->info->pdev, TPCI200_MEM8_SPACE_BAR);
-out_release_ioid_int_space:
+err_io_id_int_spaces_bar:
 	pci_release_region(tpci200->info->pdev, TPCI200_IO_ID_INT_SPACES_BAR);
-out_release_ip_space:
+err_ip_interface_bar:
 	pci_release_region(tpci200->info->pdev, TPCI200_IP_INTERFACE_BAR);
-out_disable_pci:
+err_disable_device:
 	pci_disable_device(tpci200->info->pdev);
 	return res;
 }

commit 19c09f4cc96790f365f2384e12e04c81d1c00be0
Author: Dongliang Mu <mudongliangabcd@gmail.com>
Date:   Tue Aug 10 18:03:18 2021 +0800

    ipack: tpci200: fix many double free issues in tpci200_pci_probe
    
    [ Upstream commit 57a1681095f912239c7fb4d66683ab0425973838 ]
    
    The function tpci200_register called by tpci200_install and
    tpci200_unregister called by tpci200_uninstall are in pair. However,
    tpci200_unregister has some cleanup operations not in the
    tpci200_register. So the error handling code of tpci200_pci_probe has
    many different double free issues.
    
    Fix this problem by moving those cleanup operations out of
    tpci200_unregister, into tpci200_pci_remove and reverting
    the previous commit 9272e5d0028d ("ipack/carriers/tpci200:
    Fix a double free in tpci200_pci_probe").
    
    Fixes: 9272e5d0028d ("ipack/carriers/tpci200: Fix a double free in tpci200_pci_probe")
    Cc: stable@vger.kernel.org
    Reported-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Link: https://lore.kernel.org/r/20210810100323.3938492-1-mudongliangabcd@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/ipack/carriers/tpci200.c b/drivers/ipack/carriers/tpci200.c
index 7895320e50c1..2172d1efa71e 100644
--- a/drivers/ipack/carriers/tpci200.c
+++ b/drivers/ipack/carriers/tpci200.c
@@ -94,16 +94,13 @@ static void tpci200_unregister(struct tpci200_board *tpci200)
 	free_irq(tpci200->info->pdev->irq, (void *) tpci200);
 
 	pci_iounmap(tpci200->info->pdev, tpci200->info->interface_regs);
-	pci_iounmap(tpci200->info->pdev, tpci200->info->cfg_regs);
 
 	pci_release_region(tpci200->info->pdev, TPCI200_IP_INTERFACE_BAR);
 	pci_release_region(tpci200->info->pdev, TPCI200_IO_ID_INT_SPACES_BAR);
 	pci_release_region(tpci200->info->pdev, TPCI200_MEM16_SPACE_BAR);
 	pci_release_region(tpci200->info->pdev, TPCI200_MEM8_SPACE_BAR);
-	pci_release_region(tpci200->info->pdev, TPCI200_CFG_MEM_BAR);
 
 	pci_disable_device(tpci200->info->pdev);
-	pci_dev_put(tpci200->info->pdev);
 }
 
 static void tpci200_enable_irq(struct tpci200_board *tpci200,
@@ -532,7 +529,7 @@ static int tpci200_pci_probe(struct pci_dev *pdev,
 	tpci200->info = kzalloc(sizeof(struct tpci200_infos), GFP_KERNEL);
 	if (!tpci200->info) {
 		ret = -ENOMEM;
-		goto out_err_info;
+		goto err_tpci200;
 	}
 
 	pci_dev_get(pdev);
@@ -543,7 +540,7 @@ static int tpci200_pci_probe(struct pci_dev *pdev,
 	if (ret) {
 		dev_err(&pdev->dev, "Failed to allocate PCI Configuration Memory");
 		ret = -EBUSY;
-		goto out_err_pci_request;
+		goto err_tpci200_info;
 	}
 	tpci200->info->cfg_regs = ioremap_nocache(
 			pci_resource_start(pdev, TPCI200_CFG_MEM_BAR),
@@ -551,7 +548,7 @@ static int tpci200_pci_probe(struct pci_dev *pdev,
 	if (!tpci200->info->cfg_regs) {
 		dev_err(&pdev->dev, "Failed to map PCI Configuration Memory");
 		ret = -EFAULT;
-		goto out_err_ioremap;
+		goto err_request_region;
 	}
 
 	/* Disable byte swapping for 16 bit IP module access. This will ensure
@@ -574,7 +571,7 @@ static int tpci200_pci_probe(struct pci_dev *pdev,
 	if (ret) {
 		dev_err(&pdev->dev, "error during tpci200 install\n");
 		ret = -ENODEV;
-		goto out_err_install;
+		goto err_cfg_regs;
 	}
 
 	/* Register the carrier in the industry pack bus driver */
@@ -586,7 +583,7 @@ static int tpci200_pci_probe(struct pci_dev *pdev,
 		dev_err(&pdev->dev,
 			"error registering the carrier on ipack driver\n");
 		ret = -EFAULT;
-		goto out_err_bus_register;
+		goto err_tpci200_install;
 	}
 
 	/* save the bus number given by ipack to logging purpose */
@@ -597,19 +594,16 @@ static int tpci200_pci_probe(struct pci_dev *pdev,
 		tpci200_create_device(tpci200, i);
 	return 0;
 
-out_err_bus_register:
+err_tpci200_install:
 	tpci200_uninstall(tpci200);
-	/* tpci200->info->cfg_regs is unmapped in tpci200_uninstall */
-	tpci200->info->cfg_regs = NULL;
-out_err_install:
-	if (tpci200->info->cfg_regs)
-		iounmap(tpci200->info->cfg_regs);
-out_err_ioremap:
+err_cfg_regs:
+	pci_iounmap(tpci200->info->pdev, tpci200->info->cfg_regs);
+err_request_region:
 	pci_release_region(pdev, TPCI200_CFG_MEM_BAR);
-out_err_pci_request:
-	pci_dev_put(pdev);
+err_tpci200_info:
 	kfree(tpci200->info);
-out_err_info:
+	pci_dev_put(pdev);
+err_tpci200:
 	kfree(tpci200);
 	return ret;
 }
@@ -619,6 +613,12 @@ static void __tpci200_pci_remove(struct tpci200_board *tpci200)
 	ipack_bus_unregister(tpci200->info->ipack_bus);
 	tpci200_uninstall(tpci200);
 
+	pci_iounmap(tpci200->info->pdev, tpci200->info->cfg_regs);
+
+	pci_release_region(tpci200->info->pdev, TPCI200_CFG_MEM_BAR);
+
+	pci_dev_put(tpci200->info->pdev);
+
 	kfree(tpci200->info);
 	kfree(tpci200);
 }

commit 299400448c7889dd4293f2e2d34e8276ceae40da
Author: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Date:   Mon Aug 9 09:24:28 2021 +0100

    slimbus: ngd: reset dma setup during runtime pm
    
    [ Upstream commit d77772538f00b7265deace6e77e555ee18365ad0 ]
    
    During suspend/resume NGD remote instance is power cycled along
    with remotely controlled bam dma engine.
    So Reset the dma configuration during this suspend resume path
    so that we are not dealing with any stale dma setup.
    
    Without this transactions timeout after first suspend resume path.
    
    Fixes: 917809e2280b ("slimbus: ngd: Add qcom SLIMBus NGD driver")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
    Link: https://lore.kernel.org/r/20210809082428.11236-5-srinivas.kandagatla@linaro.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c
index 44021620d101..1a5311fb45a5 100644
--- a/drivers/slimbus/qcom-ngd-ctrl.c
+++ b/drivers/slimbus/qcom-ngd-ctrl.c
@@ -1060,7 +1060,8 @@ static void qcom_slim_ngd_setup(struct qcom_slim_ngd_ctrl *ctrl)
 {
 	u32 cfg = readl_relaxed(ctrl->ngd->base);
 
-	if (ctrl->state == QCOM_SLIM_NGD_CTRL_DOWN)
+	if (ctrl->state == QCOM_SLIM_NGD_CTRL_DOWN ||
+		ctrl->state == QCOM_SLIM_NGD_CTRL_ASLEEP)
 		qcom_slim_ngd_init_dma(ctrl);
 
 	/* By default enable message queues */
@@ -1111,6 +1112,7 @@ static int qcom_slim_ngd_power_up(struct qcom_slim_ngd_ctrl *ctrl)
 			dev_info(ctrl->dev, "Subsys restart: ADSP active framer\n");
 			return 0;
 		}
+		qcom_slim_ngd_setup(ctrl);
 		return 0;
 	}
 
@@ -1496,6 +1498,7 @@ static int __maybe_unused qcom_slim_ngd_runtime_suspend(struct device *dev)
 	struct qcom_slim_ngd_ctrl *ctrl = dev_get_drvdata(dev);
 	int ret = 0;
 
+	qcom_slim_ngd_exit_dma(ctrl);
 	if (!ctrl->qmi.handle)
 		return 0;
 

commit ac8d2c61359c3aca1f3f1c46f2fd3aca4fd4497e
Author: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Date:   Mon Aug 9 09:24:26 2021 +0100

    slimbus: messaging: check for valid transaction id
    
    [ Upstream commit a263c1ff6abe0e66712f40d595bbddc7a35907f8 ]
    
    In some usecases transaction ids are dynamically allocated inside
    the controller driver after sending the messages which have generic
    acknowledge responses. So check for this before refcounting pm_runtime.
    
    Without this we would end up imbalancing runtime pm count by
    doing pm_runtime_put() in both slim_do_transfer() and slim_msg_response()
    for a single  pm_runtime_get() in slim_do_transfer()
    
    Fixes: d3062a210930 ("slimbus: messaging: add slim_alloc/free_txn_tid()")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
    Link: https://lore.kernel.org/r/20210809082428.11236-3-srinivas.kandagatla@linaro.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/slimbus/messaging.c b/drivers/slimbus/messaging.c
index 3b77713f1e3f..ddf0371ad52b 100644
--- a/drivers/slimbus/messaging.c
+++ b/drivers/slimbus/messaging.c
@@ -131,7 +131,8 @@ int slim_do_transfer(struct slim_controller *ctrl, struct slim_msg_txn *txn)
 			goto slim_xfer_err;
 		}
 	}
-
+	/* Initialize tid to invalid value */
+	txn->tid = 0;
 	need_tid = slim_tid_txn(txn->mt, txn->mc);
 
 	if (need_tid) {
@@ -163,7 +164,7 @@ int slim_do_transfer(struct slim_controller *ctrl, struct slim_msg_txn *txn)
 			txn->mt, txn->mc, txn->la, ret);
 
 slim_xfer_err:
-	if (!clk_pause_msg && (!need_tid  || ret == -ETIMEDOUT)) {
+	if (!clk_pause_msg && (txn->tid == 0  || ret == -ETIMEDOUT)) {
 		/*
 		 * remove runtime-pm vote if this was TX only, or
 		 * if there was error during this transaction

commit ea99a7fae21b554d50880d3392122ffce14615ef
Author: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Date:   Mon Aug 9 09:24:25 2021 +0100

    slimbus: messaging: start transaction ids from 1 instead of zero
    
    [ Upstream commit 9659281ce78de0f15a4aa124da8f7450b1399c09 ]
    
    As tid is unsigned its hard to figure out if the tid is valid or
    invalid. So Start the transaction ids from 1 instead of zero
    so that we could differentiate between a valid tid and invalid tids
    
    This is useful in cases where controller would add a tid for controller
    specific transfers.
    
    Fixes: d3062a210930 ("slimbus: messaging: add slim_alloc/free_txn_tid()")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
    Link: https://lore.kernel.org/r/20210809082428.11236-2-srinivas.kandagatla@linaro.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/slimbus/messaging.c b/drivers/slimbus/messaging.c
index d5879142dbef..3b77713f1e3f 100644
--- a/drivers/slimbus/messaging.c
+++ b/drivers/slimbus/messaging.c
@@ -66,7 +66,7 @@ int slim_alloc_txn_tid(struct slim_controller *ctrl, struct slim_msg_txn *txn)
 	int ret = 0;
 
 	spin_lock_irqsave(&ctrl->txn_lock, flags);
-	ret = idr_alloc_cyclic(&ctrl->tid_idr, txn, 0,
+	ret = idr_alloc_cyclic(&ctrl->tid_idr, txn, 1,
 				SLIM_MAX_TIDS, GFP_ATOMIC);
 	if (ret < 0) {
 		spin_unlock_irqrestore(&ctrl->txn_lock, flags);

commit 2d349b0a69edc4f7f09c543abd098ab3c7fe31c3
Author: Steven Rostedt (VMware) <rostedt@goodmis.org>
Date:   Sun Aug 8 00:30:11 2021 -0400

    tracing / histogram: Fix NULL pointer dereference on strcmp() on NULL event name
    
    [ Upstream commit 5acce0bff2a0420ce87d4591daeb867f47d552c2 ]
    
    The following commands:
    
     # echo 'read_max u64 size;' > synthetic_events
     # echo 'hist:keys=common_pid:count=count:onmax($count).trace(read_max,count)' > events/syscalls/sys_enter_read/trigger
    
    Causes:
    
     BUG: kernel NULL pointer dereference, address: 0000000000000000
     #PF: supervisor read access in kernel mode
     #PF: error_code(0x0000) - not-present page
     PGD 0 P4D 0
     Oops: 0000 [#1] PREEMPT SMP
     CPU: 4 PID: 1763 Comm: bash Not tainted 5.14.0-rc2-test+ #155
     Hardware name: Hewlett-Packard HP Compaq Pro 6300 SFF/339A, BIOS K01
    v03.03 07/14/2016
     RIP: 0010:strcmp+0xc/0x20
     Code: 75 f7 31 c0 0f b6 0c 06 88 0c 02 48 83 c0 01 84 c9 75 f1 4c 89 c0
    c3 0f 1f 80 00 00 00 00 31 c0 eb 08 48 83 c0 01 84 d2 74 0f <0f> b6 14 07
    3a 14 06 74 ef 19 c0 83 c8 01 c3 31 c0 c3 66 90 48 89
     RSP: 0018:ffffb5fdc0963ca8 EFLAGS: 00010246
     RAX: 0000000000000000 RBX: ffffffffb3a4e040 RCX: 0000000000000000
     RDX: 0000000000000000 RSI: ffff9714c0d0b640 RDI: 0000000000000000
     RBP: 0000000000000000 R08: 00000022986b7cde R09: ffffffffb3a4dff8
     R10: 0000000000000000 R11: 0000000000000000 R12: ffff9714c50603c8
     R13: 0000000000000000 R14: ffff97143fdf9e48 R15: ffff9714c01a2210
     FS:  00007f1fa6785740(0000) GS:ffff9714da400000(0000)
    knlGS:0000000000000000
     CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
     CR2: 0000000000000000 CR3: 000000002d863004 CR4: 00000000001706e0
     Call Trace:
      __find_event_file+0x4e/0x80
      action_create+0x6b7/0xeb0
      ? kstrdup+0x44/0x60
      event_hist_trigger_func+0x1a07/0x2130
      trigger_process_regex+0xbd/0x110
      event_trigger_write+0x71/0xd0
      vfs_write+0xe9/0x310
      ksys_write+0x68/0xe0
      do_syscall_64+0x3b/0x90
      entry_SYSCALL_64_after_hwframe+0x44/0xae
     RIP: 0033:0x7f1fa6879e87
    
    The problem was the "trace(read_max,count)" where the "count" should be
    "$count" as "onmax()" only handles variables (although it really should be
    able to figure out that "count" is a field of sys_enter_read). But there's
    a path that does not find the variable and ends up passing a NULL for the
    event, which ends up getting passed to "strcmp()".
    
    Add a check for NULL to return and error on the command with:
    
     # cat error_log
      hist:syscalls:sys_enter_read: error: Couldn't create or find variable
      Command: hist:keys=common_pid:count=count:onmax($count).trace(read_max,count)
                                    ^
    Link: https://lkml.kernel.org/r/20210808003011.4037f8d0@oasis.local.home
    
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: stable@vger.kernel.org
    Fixes: 50450603ec9cb tracing: Add 'onmax' hist trigger action support
    Reviewed-by: Tom Zanussi <zanussi@kernel.org>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
index bbde8d3d6c8a..44d1340634f6 100644
--- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c
@@ -3786,6 +3786,8 @@ onmatch_create_field_var(struct hist_trigger_data *hist_data,
 			event = data->onmatch.match_event;
 		}
 
+		if (!event)
+			goto free;
 		/*
 		 * At this point, we're looking at a field on another
 		 * event.  Because we can't modify a hist trigger on

commit 6675b20518adcb71361585c041a641b5ad6e86d7
Author: Jaroslav Kysela <perex@perex.cz>
Date:   Wed Aug 11 18:14:41 2021 +0200

    ALSA: hda - fix the 'Capture Switch' value change notifications
    
    [ Upstream commit a2befe9380dd04ee76c871568deca00eedf89134 ]
    
    The original code in the cap_put_caller() function does not
    handle correctly the positive values returned from the passed
    function for multiple iterations. It means that the change
    notifications may be lost.
    
    Fixes: 352f7f914ebb ("ALSA: hda - Merge Realtek parser code to generic parser")
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=213851
    Cc: <stable@kernel.org>
    Signed-off-by: Jaroslav Kysela <perex@perex.cz>
    Link: https://lore.kernel.org/r/20210811161441.1325250-1-perex@perex.cz
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c
index 6099a9f1cb3d..ff263ad19230 100644
--- a/sound/pci/hda/hda_generic.c
+++ b/sound/pci/hda/hda_generic.c
@@ -3470,7 +3470,7 @@ static int cap_put_caller(struct snd_kcontrol *kcontrol,
 	struct hda_gen_spec *spec = codec->spec;
 	const struct hda_input_mux *imux;
 	struct nid_path *path;
-	int i, adc_idx, err = 0;
+	int i, adc_idx, ret, err = 0;
 
 	imux = &spec->input_mux;
 	adc_idx = kcontrol->id.index;
@@ -3480,9 +3480,13 @@ static int cap_put_caller(struct snd_kcontrol *kcontrol,
 		if (!path || !path->ctls[type])
 			continue;
 		kcontrol->private_value = path->ctls[type];
-		err = func(kcontrol, ucontrol);
-		if (err < 0)
+		ret = func(kcontrol, ucontrol);
+		if (ret < 0) {
+			err = ret;
 			break;
+		}
+		if (ret > 0)
+			err = 1;
 	}
 	mutex_unlock(&codec->control_mutex);
 	if (err >= 0 && spec->cap_sync_hook)

commit e0eb0f65e681cad35644c7e8dd7ee526c075b9c7
Author: Vincent Whitchurch <vincent.whitchurch@axis.com>
Date:   Wed Jun 30 12:22:32 2021 +0200

    mmc: dw_mmc: Fix hang on data CRC error
    
    [ Upstream commit 25f8203b4be1937c4939bb98623e67dcfd7da4d1 ]
    
    When a Data CRC interrupt is received, the driver disables the DMA, then
    sends the stop/abort command and then waits for Data Transfer Over.
    
    However, sometimes, when a data CRC error is received in the middle of a
    multi-block write transfer, the Data Transfer Over interrupt is never
    received, and the driver hangs and never completes the request.
    
    The driver sets the BMOD.SWR bit (SDMMC_IDMAC_SWRESET) when stopping the
    DMA, but according to the manual CMD.STOP_ABORT_CMD should be programmed
    "before assertion of SWR".  Do these operations in the recommended
    order.  With this change the Data Transfer Over is always received
    correctly in my tests.
    
    Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
    Reviewed-by: Jaehoon Chung <jh80.chung@samsung.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210630102232.16011-1-vincent.whitchurch@axis.com
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
index 22c454c7aaca..8e09586f880f 100644
--- a/drivers/mmc/host/dw_mmc.c
+++ b/drivers/mmc/host/dw_mmc.c
@@ -2043,8 +2043,8 @@ static void dw_mci_tasklet_func(unsigned long priv)
 					continue;
 				}
 
-				dw_mci_stop_dma(host);
 				send_stop_abort(host, data);
+				dw_mci_stop_dma(host);
 				state = STATE_SENDING_STOP;
 				break;
 			}
@@ -2068,10 +2068,10 @@ static void dw_mci_tasklet_func(unsigned long priv)
 			 */
 			if (test_and_clear_bit(EVENT_DATA_ERROR,
 					       &host->pending_events)) {
-				dw_mci_stop_dma(host);
 				if (!(host->data_status & (SDMMC_INT_DRTO |
 							   SDMMC_INT_EBE)))
 					send_stop_abort(host, data);
+				dw_mci_stop_dma(host);
 				state = STATE_DATA_ERROR;
 				break;
 			}
@@ -2104,10 +2104,10 @@ static void dw_mci_tasklet_func(unsigned long priv)
 			 */
 			if (test_and_clear_bit(EVENT_DATA_ERROR,
 					       &host->pending_events)) {
-				dw_mci_stop_dma(host);
 				if (!(host->data_status & (SDMMC_INT_DRTO |
 							   SDMMC_INT_EBE)))
 					send_stop_abort(host, data);
+				dw_mci_stop_dma(host);
 				state = STATE_DATA_ERROR;
 				break;
 			}

commit fed44f82ffa8443f4ddc5c269f1ab8f388fe9382
Author: Saravana Kannan <saravanak@google.com>
Date:   Tue Aug 17 20:38:03 2021 -0700

    net: mdio-mux: Handle -EPROBE_DEFER correctly
    
    [ Upstream commit 7bd0cef5dac685f09ef8b0b2a7748ff42d284dc7 ]
    
    When registering mdiobus children, if we get an -EPROBE_DEFER, we shouldn't
    ignore it and continue registering the rest of the mdiobus children. This
    would permanently prevent the deferring child mdiobus from working instead
    of reattempting it in the future. So, if a child mdiobus needs to be
    reattempted in the future, defer the entire mdio-mux initialization.
    
    This fixes the issue where PHYs sitting under the mdio-mux aren't
    initialized correctly if the PHY's interrupt controller is not yet ready
    when the mdio-mux is being probed. Additional context in the link below.
    
    Fixes: 0ca2997d1452 ("netdev/of/phy: Add MDIO bus multiplexer support.")
    Link: https://lore.kernel.org/lkml/CAGETcx95kHrv8wA-O+-JtfH7H9biJEGJtijuPVN0V5dUKUAB3A@mail.gmail.com/#t
    Signed-off-by: Saravana Kannan <saravanak@google.com>
    Reviewed-by: Andrew Lunn <andrew@lunn.ch>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Tested-by: Marc Zyngier <maz@kernel.org>
    Acked-by: Kevin Hilman <khilman@baylibre.com>
    Tested-by: Kevin Hilman <khilman@baylibre.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/phy/mdio-mux.c b/drivers/net/phy/mdio-mux.c
index bb7e3f12a003..c16f875ed9ea 100644
--- a/drivers/net/phy/mdio-mux.c
+++ b/drivers/net/phy/mdio-mux.c
@@ -178,11 +178,15 @@ int mdio_mux_init(struct device *dev,
 		cb->mii_bus->write = mdio_mux_write;
 		r = of_mdiobus_register(cb->mii_bus, child_bus_node);
 		if (r) {
+			mdiobus_free(cb->mii_bus);
+			if (r == -EPROBE_DEFER) {
+				ret_val = r;
+				goto err_loop;
+			}
+			devm_kfree(dev, cb);
 			dev_err(dev,
 				"Error: Failed to register MDIO bus for child %pOF\n",
 				child_bus_node);
-			mdiobus_free(cb->mii_bus);
-			devm_kfree(dev, cb);
 		} else {
 			cb->next = pb->children;
 			pb->children = cb;

commit 2f87a13eb37f813aa1bfeb047052204e8ec2a325
Author: Saravana Kannan <saravanak@google.com>
Date:   Tue Aug 17 20:38:02 2021 -0700

    net: mdio-mux: Don't ignore memory allocation errors
    
    [ Upstream commit 99d81e942474cc7677d12f673f42a7ea699e2589 ]
    
    If we are seeing memory allocation errors, don't try to continue
    registering child mdiobus devices. It's unlikely they'll succeed.
    
    Fixes: 342fa1964439 ("mdio: mux: make child bus walking more permissive and errors more verbose")
    Signed-off-by: Saravana Kannan <saravanak@google.com>
    Reviewed-by: Andrew Lunn <andrew@lunn.ch>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Tested-by: Marc Zyngier <maz@kernel.org>
    Acked-by: Kevin Hilman <khilman@baylibre.com>
    Tested-by: Kevin Hilman <khilman@baylibre.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/phy/mdio-mux.c b/drivers/net/phy/mdio-mux.c
index 0a86f1e4c02f..bb7e3f12a003 100644
--- a/drivers/net/phy/mdio-mux.c
+++ b/drivers/net/phy/mdio-mux.c
@@ -85,6 +85,17 @@ static int mdio_mux_write(struct mii_bus *bus, int phy_id,
 
 static int parent_count;
 
+static void mdio_mux_uninit_children(struct mdio_mux_parent_bus *pb)
+{
+	struct mdio_mux_child_bus *cb = pb->children;
+
+	while (cb) {
+		mdiobus_unregister(cb->mii_bus);
+		mdiobus_free(cb->mii_bus);
+		cb = cb->next;
+	}
+}
+
 int mdio_mux_init(struct device *dev,
 		  struct device_node *mux_node,
 		  int (*switch_fn)(int cur, int desired, void *data),
@@ -147,7 +158,7 @@ int mdio_mux_init(struct device *dev,
 		cb = devm_kzalloc(dev, sizeof(*cb), GFP_KERNEL);
 		if (!cb) {
 			ret_val = -ENOMEM;
-			continue;
+			goto err_loop;
 		}
 		cb->bus_number = v;
 		cb->parent = pb;
@@ -155,8 +166,7 @@ int mdio_mux_init(struct device *dev,
 		cb->mii_bus = mdiobus_alloc();
 		if (!cb->mii_bus) {
 			ret_val = -ENOMEM;
-			devm_kfree(dev, cb);
-			continue;
+			goto err_loop;
 		}
 		cb->mii_bus->priv = cb;
 
@@ -185,6 +195,10 @@ int mdio_mux_init(struct device *dev,
 
 	dev_err(dev, "Error: No acceptable child buses found\n");
 	devm_kfree(dev, pb);
+
+err_loop:
+	mdio_mux_uninit_children(pb);
+	of_node_put(child_bus_node);
 err_pb_kz:
 	put_device(&parent_bus->dev);
 err_parent_bus:
@@ -196,14 +210,8 @@ EXPORT_SYMBOL_GPL(mdio_mux_init);
 void mdio_mux_uninit(void *mux_handle)
 {
 	struct mdio_mux_parent_bus *pb = mux_handle;
-	struct mdio_mux_child_bus *cb = pb->children;
-
-	while (cb) {
-		mdiobus_unregister(cb->mii_bus);
-		mdiobus_free(cb->mii_bus);
-		cb = cb->next;
-	}
 
+	mdio_mux_uninit_children(pb);
 	put_device(&pb->mii_bus->dev);
 }
 EXPORT_SYMBOL_GPL(mdio_mux_uninit);

commit 260ad8a2daea03e79ced317e670eb907260e2b08
Author: Dinghao Liu <dinghao.liu@zju.edu.cn>
Date:   Mon Aug 16 21:14:04 2021 +0800

    net: qlcnic: add missed unlock in qlcnic_83xx_flash_read32
    
    [ Upstream commit 0a298d133893c72c96e2156ed7cb0f0c4a306a3e ]
    
    qlcnic_83xx_unlock_flash() is called on all paths after we call
    qlcnic_83xx_lock_flash(), except for one error path on failure
    of QLCRD32(), which may cause a deadlock. This bug is suggested
    by a static analysis tool, please advise.
    
    Fixes: 81d0aeb0a4fff ("qlcnic: flash template based firmware reset recovery")
    Signed-off-by: Dinghao Liu <dinghao.liu@zju.edu.cn>
    Link: https://lore.kernel.org/r/20210816131405.24024-1-dinghao.liu@zju.edu.cn
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
index 6ed8294f7df8..a15845e511b2 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
@@ -3158,8 +3158,10 @@ int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr,
 
 		indirect_addr = QLC_83XX_FLASH_DIRECT_DATA(addr);
 		ret = QLCRD32(adapter, indirect_addr, &err);
-		if (err == -EIO)
+		if (err == -EIO) {
+			qlcnic_83xx_unlock_flash(adapter);
 			return err;
+		}
 
 		word = ret;
 		*(u32 *)p_data  = word;

commit 1458ae977ae03d3fdf8573fe4dad034c5afb6d53
Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date:   Fri Aug 13 20:33:27 2021 +0300

    ptp_pch: Restore dependency on PCI
    
    [ Upstream commit 55c8fca1dae1fb0d11deaa21b65a647dedb1bc50 ]
    
    During the swap dependency on PCH_GBE to selection PTP_1588_CLOCK_PCH
    incidentally dropped the implicit dependency on the PCI. Restore it.
    
    Fixes: 18d359ceb044 ("pch_gbe, ptp_pch: Fix the dependency direction between these drivers")
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/ptp/Kconfig b/drivers/ptp/Kconfig
index d137c480db46..dd04aedd76e0 100644
--- a/drivers/ptp/Kconfig
+++ b/drivers/ptp/Kconfig
@@ -91,7 +91,8 @@ config DP83640_PHY
 config PTP_1588_CLOCK_PCH
 	tristate "Intel PCH EG20T as PTP clock"
 	depends on X86_32 || COMPILE_TEST
-	depends on HAS_IOMEM && NET
+	depends on HAS_IOMEM && PCI
+	depends on NET
 	imply PTP_1588_CLOCK
 	help
 	  This driver adds support for using the PCH EG20T as a PTP

commit 4e370cc081a78ee23528311ca58fd98a06768ec7
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Fri Aug 13 18:14:33 2021 +0300

    net: 6pack: fix slab-out-of-bounds in decode_data
    
    [ Upstream commit 19d1532a187669ce86d5a2696eb7275310070793 ]
    
    Syzbot reported slab-out-of bounds write in decode_data().
    The problem was in missing validation checks.
    
    Syzbot's reproducer generated malicious input, which caused
    decode_data() to be called a lot in sixpack_decode(). Since
    rx_count_cooked is only 400 bytes and noone reported before,
    that 400 bytes is not enough, let's just check if input is malicious
    and complain about buffer overrun.
    
    Fail log:
    ==================================================================
    BUG: KASAN: slab-out-of-bounds in drivers/net/hamradio/6pack.c:843
    Write of size 1 at addr ffff888087c5544e by task kworker/u4:0/7
    
    CPU: 0 PID: 7 Comm: kworker/u4:0 Not tainted 5.6.0-rc3-syzkaller #0
    ...
    Workqueue: events_unbound flush_to_ldisc
    Call Trace:
     __dump_stack lib/dump_stack.c:77 [inline]
     dump_stack+0x197/0x210 lib/dump_stack.c:118
     print_address_description.constprop.0.cold+0xd4/0x30b mm/kasan/report.c:374
     __kasan_report.cold+0x1b/0x32 mm/kasan/report.c:506
     kasan_report+0x12/0x20 mm/kasan/common.c:641
     __asan_report_store1_noabort+0x17/0x20 mm/kasan/generic_report.c:137
     decode_data.part.0+0x23b/0x270 drivers/net/hamradio/6pack.c:843
     decode_data drivers/net/hamradio/6pack.c:965 [inline]
     sixpack_decode drivers/net/hamradio/6pack.c:968 [inline]
    
    Reported-and-tested-by: syzbot+fc8cd9a673d4577fb2e4@syzkaller.appspotmail.com
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c
index 8c636c493227..1001e9a2edd4 100644
--- a/drivers/net/hamradio/6pack.c
+++ b/drivers/net/hamradio/6pack.c
@@ -859,6 +859,12 @@ static void decode_data(struct sixpack *sp, unsigned char inbyte)
 		return;
 	}
 
+	if (sp->rx_count_cooked + 2 >= sizeof(sp->cooked_buf)) {
+		pr_err("6pack: cooked buffer overrun, data loss\n");
+		sp->rx_count = 0;
+		return;
+	}
+
 	buf = sp->raw_buf;
 	sp->cooked_buf[sp->rx_count_cooked++] =
 		buf[0] | ((buf[1] << 2) & 0xc0);

commit b80bc6fba1cb9bc036a633a05994ff87fa9c868e
Author: Jakub Kicinski <kuba@kernel.org>
Date:   Thu Aug 12 14:42:40 2021 -0700

    bnxt: disable napi before canceling DIM
    
    [ Upstream commit 01cca6b9330ac7460de44eeeb3a0607f8aae69ff ]
    
    napi schedules DIM, napi has to be disabled first,
    then DIM canceled.
    
    Noticed while reading the code.
    
    Fixes: 0bc0b97fca73 ("bnxt_en: cleanup DIM work on device shutdown")
    Fixes: 6a8788f25625 ("bnxt_en: add support for software dynamic interrupt moderation")
    Reviewed-by: Michael Chan <michael.chan@broadcom.com>
    Reviewed-by: Edwin Peer <edwin.peer@broadcom.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index c4ddd8f71b93..55827ac65a15 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -6269,10 +6269,9 @@ static void bnxt_disable_napi(struct bnxt *bp)
 	for (i = 0; i < bp->cp_nr_rings; i++) {
 		struct bnxt_cp_ring_info *cpr = &bp->bnapi[i]->cp_ring;
 
+		napi_disable(&bp->bnapi[i]->napi);
 		if (bp->bnapi[i]->rx_ring)
 			cancel_work_sync(&cpr->dim.work);
-
-		napi_disable(&bp->bnapi[i]->napi);
 	}
 }
 

commit fa0a75c4f0a577b13589d0a8f799c547082c827d
Author: Jakub Kicinski <kuba@kernel.org>
Date:   Thu Aug 12 14:42:39 2021 -0700

    bnxt: don't lock the tx queue from napi poll
    
    [ Upstream commit 3c603136c9f82833813af77185618de5af67676c ]
    
    We can't take the tx lock from the napi poll routine, because
    netpoll can poll napi at any moment, including with the tx lock
    already held.
    
    The tx lock is protecting against two paths - the disable
    path, and (as Michael points out) the NETDEV_TX_BUSY case
    which may occur if NAPI completions race with start_xmit
    and both decide to re-enable the queue.
    
    For the disable/ifdown path use synchronize_net() to make sure
    closing the device does not race we restarting the queues.
    Annotate accesses to dev_state against data races.
    
    For the NAPI cleanup vs start_xmit path - appropriate barriers
    are already in place in the main spot where Tx queue is stopped
    but we need to do the same careful dance in the TX_BUSY case.
    
    Fixes: c0c050c58d84 ("bnxt_en: New Broadcom ethernet driver.")
    Reviewed-by: Michael Chan <michael.chan@broadcom.com>
    Reviewed-by: Edwin Peer <edwin.peer@broadcom.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index ebcf4ea66385..c4ddd8f71b93 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -282,6 +282,26 @@ static u16 bnxt_xmit_get_cfa_action(struct sk_buff *skb)
 	return md_dst->u.port_info.port_id;
 }
 
+static bool bnxt_txr_netif_try_stop_queue(struct bnxt *bp,
+					  struct bnxt_tx_ring_info *txr,
+					  struct netdev_queue *txq)
+{
+	netif_tx_stop_queue(txq);
+
+	/* netif_tx_stop_queue() must be done before checking
+	 * tx index in bnxt_tx_avail() below, because in
+	 * bnxt_tx_int(), we update tx index before checking for
+	 * netif_tx_queue_stopped().
+	 */
+	smp_mb();
+	if (bnxt_tx_avail(bp, txr) > bp->tx_wake_thresh) {
+		netif_tx_wake_queue(txq);
+		return false;
+	}
+
+	return true;
+}
+
 static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	struct bnxt *bp = netdev_priv(dev);
@@ -309,8 +329,8 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
 	free_size = bnxt_tx_avail(bp, txr);
 	if (unlikely(free_size < skb_shinfo(skb)->nr_frags + 2)) {
-		netif_tx_stop_queue(txq);
-		return NETDEV_TX_BUSY;
+		if (bnxt_txr_netif_try_stop_queue(bp, txr, txq))
+			return NETDEV_TX_BUSY;
 	}
 
 	length = skb->len;
@@ -521,16 +541,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
 		if (skb->xmit_more && !tx_buf->is_push)
 			bnxt_db_write(bp, txr->tx_doorbell, DB_KEY_TX | prod);
 
-		netif_tx_stop_queue(txq);
-
-		/* netif_tx_stop_queue() must be done before checking
-		 * tx index in bnxt_tx_avail() below, because in
-		 * bnxt_tx_int(), we update tx index before checking for
-		 * netif_tx_queue_stopped().
-		 */
-		smp_mb();
-		if (bnxt_tx_avail(bp, txr) > bp->tx_wake_thresh)
-			netif_tx_wake_queue(txq);
+		bnxt_txr_netif_try_stop_queue(bp, txr, txq);
 	}
 	return NETDEV_TX_OK;
 
@@ -614,14 +625,9 @@ static void bnxt_tx_int(struct bnxt *bp, struct bnxt_napi *bnapi, int nr_pkts)
 	smp_mb();
 
 	if (unlikely(netif_tx_queue_stopped(txq)) &&
-	    (bnxt_tx_avail(bp, txr) > bp->tx_wake_thresh)) {
-		__netif_tx_lock(txq, smp_processor_id());
-		if (netif_tx_queue_stopped(txq) &&
-		    bnxt_tx_avail(bp, txr) > bp->tx_wake_thresh &&
-		    txr->dev_state != BNXT_DEV_STATE_CLOSING)
-			netif_tx_wake_queue(txq);
-		__netif_tx_unlock(txq);
-	}
+	    bnxt_tx_avail(bp, txr) > bp->tx_wake_thresh &&
+	    READ_ONCE(txr->dev_state) != BNXT_DEV_STATE_CLOSING)
+		netif_tx_wake_queue(txq);
 }
 
 static struct page *__bnxt_alloc_rx_page(struct bnxt *bp, dma_addr_t *mapping,
@@ -6294,9 +6300,11 @@ void bnxt_tx_disable(struct bnxt *bp)
 	if (bp->tx_ring) {
 		for (i = 0; i < bp->tx_nr_rings; i++) {
 			txr = &bp->tx_ring[i];
-			txr->dev_state = BNXT_DEV_STATE_CLOSING;
+			WRITE_ONCE(txr->dev_state, BNXT_DEV_STATE_CLOSING);
 		}
 	}
+	/* Make sure napi polls see @dev_state change */
+	synchronize_net();
 	/* Drop carrier first to prevent TX timeout */
 	netif_carrier_off(bp->dev);
 	/* Stop all TX queues */
@@ -6310,8 +6318,10 @@ void bnxt_tx_enable(struct bnxt *bp)
 
 	for (i = 0; i < bp->tx_nr_rings; i++) {
 		txr = &bp->tx_ring[i];
-		txr->dev_state = 0;
+		WRITE_ONCE(txr->dev_state, 0);
 	}
+	/* Make sure napi polls see @dev_state change */
+	synchronize_net();
 	netif_tx_wake_all_queues(bp->dev);
 	if (bp->link_info.link_up)
 		netif_carrier_on(bp->dev);

commit 7cfaec657d4124e4a3d8372849de416da784515d
Author: Xie Yongji <xieyongji@bytedance.com>
Date:   Wed Jul 28 21:07:56 2021 +0800

    vhost: Fix the calculation in vhost_overflow()
    
    [ Upstream commit f7ad318ea0ad58ebe0e595e59aed270bb643b29b ]
    
    This fixes the incorrect calculation for integer overflow
    when the last address of iova range is 0xffffffff.
    
    Fixes: ec33d031a14b ("vhost: detect 32 bit integer wrap around")
    Reported-by: Jason Wang <jasowang@redhat.com>
    Signed-off-by: Xie Yongji <xieyongji@bytedance.com>
    Acked-by: Jason Wang <jasowang@redhat.com>
    Link: https://lore.kernel.org/r/20210728130756.97-2-xieyongji@bytedance.com
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index 732327756ee1..7a58f629155d 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -678,10 +678,16 @@ static bool log_access_ok(void __user *log_base, u64 addr, unsigned long sz)
 			 (sz + VHOST_PAGE_SIZE * 8 - 1) / VHOST_PAGE_SIZE / 8);
 }
 
+/* Make sure 64 bit math will not overflow. */
 static bool vhost_overflow(u64 uaddr, u64 size)
 {
-	/* Make sure 64 bit math will not overflow. */
-	return uaddr > ULONG_MAX || size > ULONG_MAX || uaddr > ULONG_MAX - size;
+	if (uaddr > ULONG_MAX || size > ULONG_MAX)
+		return true;
+
+	if (!size)
+		return false;
+
+	return uaddr > ULONG_MAX - size + 1;
 }
 
 /* Caller should have vq mutex and device mutex. */

commit 53764b451221a7e0445be69de02b84a0ba2d1a42
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Sun Aug 8 16:04:40 2021 -0700

    dccp: add do-while-0 stubs for dccp_pr_debug macros
    
    [ Upstream commit 86aab09a4870bb8346c9579864588c3d7f555299 ]
    
    GCC complains about empty macros in an 'if' statement, so convert
    them to 'do {} while (0)' macros.
    
    Fixes these build warnings:
    
    net/dccp/output.c: In function 'dccp_xmit_packet':
    ../net/dccp/output.c:283:71: warning: suggest braces around empty body in an 'if' statement [-Wempty-body]
      283 |                 dccp_pr_debug("transmit_skb() returned err=%d\n", err);
    net/dccp/ackvec.c: In function 'dccp_ackvec_update_old':
    ../net/dccp/ackvec.c:163:80: warning: suggest braces around empty body in an 'else' statement [-Wempty-body]
      163 |                                               (unsigned long long)seqno, state);
    
    Fixes: dc841e30eaea ("dccp: Extend CCID packet dequeueing interface")
    Fixes: 380240864451 ("dccp ccid-2: Update code for the Ack Vector input/registration routine")
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Cc: dccp@vger.kernel.org
    Cc: "David S. Miller" <davem@davemloft.net>
    Cc: Jakub Kicinski <kuba@kernel.org>
    Cc: Gerrit Renker <gerrit@erg.abdn.ac.uk>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h
index f91e3816806b..aec3c724665f 100644
--- a/net/dccp/dccp.h
+++ b/net/dccp/dccp.h
@@ -44,9 +44,9 @@ extern bool dccp_debug;
 #define dccp_pr_debug_cat(format, a...)   DCCP_PRINTK(dccp_debug, format, ##a)
 #define dccp_debug(fmt, a...)		  dccp_pr_debug_cat(KERN_DEBUG fmt, ##a)
 #else
-#define dccp_pr_debug(format, a...)
-#define dccp_pr_debug_cat(format, a...)
-#define dccp_debug(format, a...)
+#define dccp_pr_debug(format, a...)	  do {} while (0)
+#define dccp_pr_debug_cat(format, a...)	  do {} while (0)
+#define dccp_debug(format, a...)	  do {} while (0)
 #endif
 
 extern struct inet_hashinfo dccp_hashinfo;

commit 16a4777a05bc8fbcc90f4a10e3f79723bfe81579
Author: Marek Behún <kabel@kernel.org>
Date:   Thu Jul 1 00:56:01 2021 +0200

    cpufreq: armada-37xx: forbid cpufreq for 1.2 GHz variant
    
    [ Upstream commit 484f2b7c61b9ae58cc00c5127bcbcd9177af8dfe ]
    
    The 1.2 GHz variant of the Armada 3720 SOC is unstable with DVFS: when
    the SOC boots, the WTMI firmware sets clocks and AVS values that work
    correctly with 1.2 GHz CPU frequency, but random crashes occur once
    cpufreq driver starts scaling.
    
    We do not know currently what is the reason:
    - it may be that the voltage value for L0 for 1.2 GHz variant provided
      by the vendor in the OTP is simply incorrect when scaling is used,
    - it may be that some delay is needed somewhere,
    - it may be something else.
    
    The most sane solution now seems to be to simply forbid the cpufreq
    driver on 1.2 GHz variant.
    
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Fixes: 92ce45fb875d ("cpufreq: Add DVFS support for Armada 37xx")
    Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/cpufreq/armada-37xx-cpufreq.c b/drivers/cpufreq/armada-37xx-cpufreq.c
index a36452bd9612..31b5655419b4 100644
--- a/drivers/cpufreq/armada-37xx-cpufreq.c
+++ b/drivers/cpufreq/armada-37xx-cpufreq.c
@@ -102,7 +102,11 @@ struct armada_37xx_dvfs {
 };
 
 static struct armada_37xx_dvfs armada_37xx_dvfs[] = {
-	{.cpu_freq_max = 1200*1000*1000, .divider = {1, 2, 4, 6} },
+	/*
+	 * The cpufreq scaling for 1.2 GHz variant of the SOC is currently
+	 * unstable because we do not know how to configure it properly.
+	 */
+	/* {.cpu_freq_max = 1200*1000*1000, .divider = {1, 2, 4, 6} }, */
 	{.cpu_freq_max = 1000*1000*1000, .divider = {1, 2, 4, 5} },
 	{.cpu_freq_max = 800*1000*1000,  .divider = {1, 2, 3, 4} },
 	{.cpu_freq_max = 600*1000*1000,  .divider = {2, 4, 5, 6} },

commit 5e2d55bcebe068b29392650643054b6267352d6c
Author: Ole Bjørn Midtbø <omidtbo@cisco.com>
Date:   Sat Oct 17 13:15:44 2020 +0200

    Bluetooth: hidp: use correct wait queue when removing ctrl_wait
    
    [ Upstream commit cca342d98bef68151a80b024f7bf5f388d1fbdea ]
    
    A different wait queue was used when removing ctrl_wait than when adding
    it. This effectively made the remove operation without locking compared
    to other operations on the wait queue ctrl_wait was part of. This caused
    issues like below where dead000000000100 is LIST_POISON1 and
    dead000000000200 is LIST_POISON2.
    
     list_add corruption. next->prev should be prev (ffffffc1b0a33a08), \
            but was dead000000000200. (next=ffffffc03ac77de0).
     ------------[ cut here ]------------
     CPU: 3 PID: 2138 Comm: bluetoothd Tainted: G           O    4.4.238+ #9
     ...
     ---[ end trace 0adc2158f0646eac ]---
     Call trace:
     [<ffffffc000443f78>] __list_add+0x38/0xb0
     [<ffffffc0000f0d04>] add_wait_queue+0x4c/0x68
     [<ffffffc00020eecc>] __pollwait+0xec/0x100
     [<ffffffc000d1556c>] bt_sock_poll+0x74/0x200
     [<ffffffc000bdb8a8>] sock_poll+0x110/0x128
     [<ffffffc000210378>] do_sys_poll+0x220/0x480
     [<ffffffc0002106f0>] SyS_poll+0x80/0x138
     [<ffffffc00008510c>] __sys_trace_return+0x0/0x4
    
     Unable to handle kernel paging request at virtual address dead000000000100
     ...
     CPU: 4 PID: 5387 Comm: kworker/u15:3 Tainted: G        W  O    4.4.238+ #9
     ...
     Call trace:
      [<ffffffc0000f079c>] __wake_up_common+0x7c/0xa8
      [<ffffffc0000f0818>] __wake_up+0x50/0x70
      [<ffffffc000be11b0>] sock_def_wakeup+0x58/0x60
      [<ffffffc000de5e10>] l2cap_sock_teardown_cb+0x200/0x224
      [<ffffffc000d3f2ac>] l2cap_chan_del+0xa4/0x298
      [<ffffffc000d45ea0>] l2cap_conn_del+0x118/0x198
      [<ffffffc000d45f8c>] l2cap_disconn_cfm+0x6c/0x78
      [<ffffffc000d29934>] hci_event_packet+0x564/0x2e30
      [<ffffffc000d19b0c>] hci_rx_work+0x10c/0x360
      [<ffffffc0000c2218>] process_one_work+0x268/0x460
      [<ffffffc0000c2678>] worker_thread+0x268/0x480
      [<ffffffc0000c94e0>] kthread+0x118/0x128
      [<ffffffc000085070>] ret_from_fork+0x10/0x20
      ---[ end trace 0adc2158f0646ead ]---
    
    Signed-off-by: Ole Bjørn Midtbø <omidtbo@cisco.com>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c
index 253975cce943..0cbd0bca971f 100644
--- a/net/bluetooth/hidp/core.c
+++ b/net/bluetooth/hidp/core.c
@@ -1282,7 +1282,7 @@ static int hidp_session_thread(void *arg)
 
 	/* cleanup runtime environment */
 	remove_wait_queue(sk_sleep(session->intr_sock->sk), &intr_wait);
-	remove_wait_queue(sk_sleep(session->intr_sock->sk), &ctrl_wait);
+	remove_wait_queue(sk_sleep(session->ctrl_sock->sk), &ctrl_wait);
 	wake_up_interruptible(&session->report_queue);
 	hidp_del_timer(session);
 

commit edf5cef7be1aeae349a16b09857674f71759ce59
Author: Ivan T. Ivanov <iivanov@suse.de>
Date:   Wed Aug 4 11:13:39 2021 +0300

    net: usb: lan78xx: don't modify phy_device state concurrently
    
    [ Upstream commit 6b67d4d63edece1033972214704c04f36c5be89a ]
    
    Currently phy_device state could be left in inconsistent state shown
    by following alert message[1]. This is because phy_read_status could
    be called concurrently from lan78xx_delayedwork, phy_state_machine and
    __ethtool_get_link. Fix this by making sure that phy_device state is
    updated atomically.
    
    [1] lan78xx 1-1.1.1:1.0 eth0: No phy led trigger registered for speed(-1)
    
    Signed-off-by: Ivan T. Ivanov <iivanov@suse.de>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
index 5bd07cdb3e6e..ac5f72077b26 100644
--- a/drivers/net/usb/lan78xx.c
+++ b/drivers/net/usb/lan78xx.c
@@ -1172,7 +1172,7 @@ static int lan78xx_link_reset(struct lan78xx_net *dev)
 {
 	struct phy_device *phydev = dev->net->phydev;
 	struct ethtool_link_ksettings ecmd;
-	int ladv, radv, ret;
+	int ladv, radv, ret, link;
 	u32 buf;
 
 	/* clear LAN78xx interrupt status */
@@ -1180,9 +1180,12 @@ static int lan78xx_link_reset(struct lan78xx_net *dev)
 	if (unlikely(ret < 0))
 		return -EIO;
 
+	mutex_lock(&phydev->lock);
 	phy_read_status(phydev);
+	link = phydev->link;
+	mutex_unlock(&phydev->lock);
 
-	if (!phydev->link && dev->link_on) {
+	if (!link && dev->link_on) {
 		dev->link_on = false;
 
 		/* reset MAC */
@@ -1195,7 +1198,7 @@ static int lan78xx_link_reset(struct lan78xx_net *dev)
 			return -EIO;
 
 		del_timer(&dev->stat_monitor);
-	} else if (phydev->link && !dev->link_on) {
+	} else if (link && !dev->link_on) {
 		dev->link_on = true;
 
 		phy_ethtool_ksettings_get(phydev, &ecmd);
@@ -1485,9 +1488,14 @@ static int lan78xx_set_eee(struct net_device *net, struct ethtool_eee *edata)
 
 static u32 lan78xx_get_link(struct net_device *net)
 {
+	u32 link;
+
+	mutex_lock(&net->phydev->lock);
 	phy_read_status(net->phydev);
+	link = net->phydev->link;
+	mutex_unlock(&net->phydev->lock);
 
-	return net->phydev->link;
+	return link;
 }
 
 static void lan78xx_get_drvinfo(struct net_device *net,

commit 2e9659ee1e3378ce25b223ccb20ce981e9945035
Author: Sudeep Holla <sudeep.holla@arm.com>
Date:   Sat Jun 26 02:01:03 2021 +0200

    ARM: dts: nomadik: Fix up interrupt controller node names
    
    [ Upstream commit 47091f473b364c98207c4def197a0ae386fc9af1 ]
    
    Once the new schema interrupt-controller/arm,vic.yaml is added, we get
    the below warnings:
    
            arch/arm/boot/dts/ste-nomadik-nhk15.dt.yaml:
            intc@10140000: $nodename:0: 'intc@10140000' does not match
            '^interrupt-controller(@[0-9a-f,]+)*$'
    
    Fix the node names for the interrupt controller to conform
    to the standard node name interrupt-controller@..
    
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Cc: Linus Walleij <linus.walleij@linaro.org>
    Link: https://lore.kernel.org/r/20210617210825.3064367-2-sudeep.holla@arm.com
    Link: https://lore.kernel.org/r/20210626000103.830184-1-linus.walleij@linaro.org'
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/ste-nomadik-stn8815.dtsi b/arch/arm/boot/dts/ste-nomadik-stn8815.dtsi
index fca76a696d9d..9ba4d1630ca3 100644
--- a/arch/arm/boot/dts/ste-nomadik-stn8815.dtsi
+++ b/arch/arm/boot/dts/ste-nomadik-stn8815.dtsi
@@ -755,14 +755,14 @@
 			status = "disabled";
 		};
 
-		vica: intc@10140000 {
+		vica: interrupt-controller@10140000 {
 			compatible = "arm,versatile-vic";
 			interrupt-controller;
 			#interrupt-cells = <1>;
 			reg = <0x10140000 0x20>;
 		};
 
-		vicb: intc@10140020 {
+		vicb: interrupt-controller@10140020 {
 			compatible = "arm,versatile-vic";
 			interrupt-controller;
 			#interrupt-cells = <1>;

commit 460add3104945704bfd2b92441b48a30b2ee9f1e
Author: Sreekanth Reddy <sreekanth.reddy@broadcom.com>
Date:   Mon Jul 26 17:24:02 2021 +0530

    scsi: core: Avoid printing an error if target_alloc() returns -ENXIO
    
    [ Upstream commit 70edd2e6f652f67d854981fd67f9ad0f1deaea92 ]
    
    Avoid printing a 'target allocation failed' error if the driver
    target_alloc() callback function returns -ENXIO. This return value
    indicates that the corresponding H:C:T:L entry is empty.
    
    Removing this error reduces the scan time if the user issues SCAN_WILD_CARD
    scan operation through sysfs parameter on a host with a lot of empty
    H:C:T:L entries.
    
    Avoiding the printk on -ENXIO matches the behavior of the other callback
    functions during scanning.
    
    Link: https://lore.kernel.org/r/20210726115402.1936-1-sreekanth.reddy@broadcom.com
    Signed-off-by: Sreekanth Reddy <sreekanth.reddy@broadcom.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
index 009a5b2aa3d0..149465de35b2 100644
--- a/drivers/scsi/scsi_scan.c
+++ b/drivers/scsi/scsi_scan.c
@@ -462,7 +462,8 @@ static struct scsi_target *scsi_alloc_target(struct device *parent,
 		error = shost->hostt->target_alloc(starget);
 
 		if(error) {
-			dev_printk(KERN_ERR, dev, "target allocation failed, error %d\n", error);
+			if (error != -ENXIO)
+				dev_err(dev, "target allocation failed, error %d\n", error);
 			/* don't want scsi_target_reap to do the final
 			 * put because it will be under the host lock */
 			scsi_target_destroy(starget);

commit e25e7495d72649cb50b42865356bfe272b3a2a6d
Author: Ye Bin <yebin10@huawei.com>
Date:   Wed Jan 13 14:31:03 2021 +0800

    scsi: scsi_dh_rdac: Avoid crash during rdac_bus_attach()
    
    [ Upstream commit bc546c0c9abb3bb2fb46866b3d1e6ade9695a5f6 ]
    
    The following BUG_ON() was observed during RDAC scan:
    
    [595952.944297] kernel BUG at drivers/scsi/device_handler/scsi_dh_rdac.c:427!
    [595952.951143] Internal error: Oops - BUG: 0 [#1] SMP
    ......
    [595953.251065] Call trace:
    [595953.259054]  check_ownership+0xb0/0x118
    [595953.269794]  rdac_bus_attach+0x1f0/0x4b0
    [595953.273787]  scsi_dh_handler_attach+0x3c/0xe8
    [595953.278211]  scsi_dh_add_device+0xc4/0xe8
    [595953.282291]  scsi_sysfs_add_sdev+0x8c/0x2a8
    [595953.286544]  scsi_probe_and_add_lun+0x9fc/0xd00
    [595953.291142]  __scsi_scan_target+0x598/0x630
    [595953.295395]  scsi_scan_target+0x120/0x130
    [595953.299481]  fc_user_scan+0x1a0/0x1c0 [scsi_transport_fc]
    [595953.304944]  store_scan+0xb0/0x108
    [595953.308420]  dev_attr_store+0x44/0x60
    [595953.312160]  sysfs_kf_write+0x58/0x80
    [595953.315893]  kernfs_fop_write+0xe8/0x1f0
    [595953.319888]  __vfs_write+0x60/0x190
    [595953.323448]  vfs_write+0xac/0x1c0
    [595953.326836]  ksys_write+0x74/0xf0
    [595953.330221]  __arm64_sys_write+0x24/0x30
    
    Code is in check_ownership:
    
            list_for_each_entry_rcu(tmp, &h->ctlr->dh_list, node) {
                    /* h->sdev should always be valid */
                    BUG_ON(!tmp->sdev);
                    tmp->sdev->access_state = access_state;
            }
    
            rdac_bus_attach
                    initialize_controller
                            list_add_rcu(&h->node, &h->ctlr->dh_list);
                            h->sdev = sdev;
    
            rdac_bus_detach
                    list_del_rcu(&h->node);
                    h->sdev = NULL;
    
    Fix the race between rdac_bus_attach() and rdac_bus_detach() where h->sdev
    is NULL when processing the RDAC attach.
    
    Link: https://lore.kernel.org/r/20210113063103.2698953-1-yebin10@huawei.com
    Reviewed-by: Bart Van Assche <bvanassche@acm.org>
    Signed-off-by: Ye Bin <yebin10@huawei.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/device_handler/scsi_dh_rdac.c b/drivers/scsi/device_handler/scsi_dh_rdac.c
index 6c629ef1bc4e..b3c23edd4b6c 100644
--- a/drivers/scsi/device_handler/scsi_dh_rdac.c
+++ b/drivers/scsi/device_handler/scsi_dh_rdac.c
@@ -453,8 +453,8 @@ static int initialize_controller(struct scsi_device *sdev,
 		if (!h->ctlr)
 			err = SCSI_DH_RES_TEMP_UNAVAIL;
 		else {
-			list_add_rcu(&h->node, &h->ctlr->dh_list);
 			h->sdev = sdev;
+			list_add_rcu(&h->node, &h->ctlr->dh_list);
 		}
 		spin_unlock(&list_lock);
 		err = SCSI_DH_OK;
@@ -779,11 +779,11 @@ static void rdac_bus_detach( struct scsi_device *sdev )
 	spin_lock(&list_lock);
 	if (h->ctlr) {
 		list_del_rcu(&h->node);
-		h->sdev = NULL;
 		kref_put(&h->ctlr->kref, release_controller);
 	}
 	spin_unlock(&list_lock);
 	sdev->handler_data = NULL;
+	synchronize_rcu();
 	kfree(h);
 }
 

commit 119f2748df9d956d19cc39d40dc07b1d265474ab
Author: Harshvardhan Jha <harshvardhan.jha@oracle.com>
Date:   Thu Jul 8 13:16:42 2021 +0530

    scsi: megaraid_mm: Fix end of loop tests for list_for_each_entry()
    
    [ Upstream commit 77541f78eadfe9fdb018a7b8b69f0f2af2cf4b82 ]
    
    The list_for_each_entry() iterator, "adapter" in this code, can never be
    NULL.  If we exit the loop without finding the correct adapter then
    "adapter" points invalid memory that is an offset from the list head.  This
    will eventually lead to memory corruption and presumably a kernel crash.
    
    Link: https://lore.kernel.org/r/20210708074642.23599-1-harshvardhan.jha@oracle.com
    Acked-by: Sumit Saxena <sumit.saxena@broadcom.com>
    Signed-off-by: Harshvardhan Jha <harshvardhan.jha@oracle.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/megaraid/megaraid_mm.c b/drivers/scsi/megaraid/megaraid_mm.c
index 8428247015db..81df2c94b747 100644
--- a/drivers/scsi/megaraid/megaraid_mm.c
+++ b/drivers/scsi/megaraid/megaraid_mm.c
@@ -250,7 +250,7 @@ mraid_mm_get_adapter(mimd_t __user *umimd, int *rval)
 	mimd_t		mimd;
 	uint32_t	adapno;
 	int		iterator;
-
+	bool		is_found;
 
 	if (copy_from_user(&mimd, umimd, sizeof(mimd_t))) {
 		*rval = -EFAULT;
@@ -266,12 +266,16 @@ mraid_mm_get_adapter(mimd_t __user *umimd, int *rval)
 
 	adapter = NULL;
 	iterator = 0;
+	is_found = false;
 
 	list_for_each_entry(adapter, &adapters_list_g, list) {
-		if (iterator++ == adapno) break;
+		if (iterator++ == adapno) {
+			is_found = true;
+			break;
+		}
 	}
 
-	if (!adapter) {
+	if (!is_found) {
 		*rval = -ENODEV;
 		return NULL;
 	}
@@ -737,6 +741,7 @@ ioctl_done(uioc_t *kioc)
 	uint32_t	adapno;
 	int		iterator;
 	mraid_mmadp_t*	adapter;
+	bool		is_found;
 
 	/*
 	 * When the kioc returns from driver, make sure it still doesn't
@@ -759,19 +764,23 @@ ioctl_done(uioc_t *kioc)
 		iterator	= 0;
 		adapter		= NULL;
 		adapno		= kioc->adapno;
+		is_found	= false;
 
 		con_log(CL_ANN, ( KERN_WARNING "megaraid cmm: completed "
 					"ioctl that was timedout before\n"));
 
 		list_for_each_entry(adapter, &adapters_list_g, list) {
-			if (iterator++ == adapno) break;
+			if (iterator++ == adapno) {
+				is_found = true;
+				break;
+			}
 		}
 
 		kioc->timedout = 0;
 
-		if (adapter) {
+		if (is_found)
 			mraid_mm_dealloc_kioc( adapter, kioc );
-		}
+
 	}
 	else {
 		wake_up(&wait_q);

commit c863d9535d0b444467c74aa7f52ca16ab91ee5ca
Author: Peter Ujfalusi <peter.ujfalusi@gmail.com>
Date:   Sat Jul 17 22:00:21 2021 +0300

    dmaengine: of-dma: router_xlate to return -EPROBE_DEFER if controller is not yet available
    
    [ Upstream commit eda97cb095f2958bbad55684a6ca3e7d7af0176a ]
    
    If the router_xlate can not find the controller in the available DMA
    devices then it should return with -EPORBE_DEFER in a same way as the
    of_dma_request_slave_channel() does.
    
    The issue can be reproduced if the event router is registered before the
    DMA controller itself and a driver would request for a channel before the
    controller is registered.
    In of_dma_request_slave_channel():
    1. of_dma_find_controller() would find the dma_router
    2. ofdma->of_dma_xlate() would fail and returned NULL
    3. -ENODEV is returned as error code
    
    with this patch we would return in this case the correct -EPROBE_DEFER and
    the client can try to request the channel later.
    
    Signed-off-by: Peter Ujfalusi <peter.ujfalusi@gmail.com>
    Link: https://lore.kernel.org/r/20210717190021.21897-1-peter.ujfalusi@gmail.com
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/dma/of-dma.c b/drivers/dma/of-dma.c
index 8344a60c2131..a9d3ab94749b 100644
--- a/drivers/dma/of-dma.c
+++ b/drivers/dma/of-dma.c
@@ -68,8 +68,12 @@ static struct dma_chan *of_dma_router_xlate(struct of_phandle_args *dma_spec,
 		return NULL;
 
 	ofdma_target = of_dma_find_controller(&dma_spec_target);
-	if (!ofdma_target)
-		return NULL;
+	if (!ofdma_target) {
+		ofdma->dma_router->route_free(ofdma->dma_router->dev,
+					      route_data);
+		chan = ERR_PTR(-EPROBE_DEFER);
+		goto err;
+	}
 
 	chan = ofdma_target->of_dma_xlate(&dma_spec_target, ofdma_target);
 	if (IS_ERR_OR_NULL(chan)) {
@@ -80,6 +84,7 @@ static struct dma_chan *of_dma_router_xlate(struct of_phandle_args *dma_spec,
 		chan->route_data = route_data;
 	}
 
+err:
 	/*
 	 * Need to put the node back since the ofdma->of_dma_route_allocate
 	 * has taken it for generating the new, translated dma_spec

commit 32e6ea21d636c0ca1604635b832148d20da79a66
Author: Dave Gerlach <d-gerlach@ti.com>
Date:   Fri Jul 16 09:07:30 2021 -0700

    ARM: dts: am43x-epos-evm: Reduce i2c0 bus speed for tps65218
    
    [ Upstream commit 20a6b3fd8e2e2c063b25fbf2ee74d86b898e5087 ]
    
    Based on the latest timing specifications for the TPS65218 from the data
    sheet, http://www.ti.com/lit/ds/symlink/tps65218.pdf, document SLDS206
    from November 2014, we must change the i2c bus speed to better fit within
    the minimum high SCL time required for proper i2c transfer.
    
    When running at 400khz, measurements show that SCL spends
    0.8125 uS/1.666 uS high/low which violates the requirement for minimum
    high period of SCL provided in datasheet Table 7.6 which is 1 uS.
    Switching to 100khz gives us 5 uS/5 uS high/low which both fall above
    the minimum given values for 100 khz, 4.0 uS/4.7 uS high/low.
    
    Without this patch occasionally a voltage set operation from the kernel
    will appear to have worked but the actual voltage reflected on the PMIC
    will not have updated, causing problems especially with cpufreq that may
    update to a higher OPP without actually raising the voltage on DCDC2,
    leading to a hang.
    
    Signed-off-by: Dave Gerlach <d-gerlach@ti.com>
    Signed-off-by: Kevin Hilman <khilman@baylibre.com>
    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/am43x-epos-evm.dts b/arch/arm/boot/dts/am43x-epos-evm.dts
index 02bbdfb3f258..0cc3ac6566c6 100644
--- a/arch/arm/boot/dts/am43x-epos-evm.dts
+++ b/arch/arm/boot/dts/am43x-epos-evm.dts
@@ -590,7 +590,7 @@
 	status = "okay";
 	pinctrl-names = "default";
 	pinctrl-0 = <&i2c0_pins>;
-	clock-frequency = <400000>;
+	clock-frequency = <100000>;
 
 	tps65218: tps65218@24 {
 		reg = <0x24>;

commit 2a29364ca2742201d60ae5affea066f73ef9b14d
Author: Yu Kuai <yukuai3@huawei.com>
Date:   Tue Jul 6 20:45:21 2021 +0800

    dmaengine: usb-dmac: Fix PM reference leak in usb_dmac_probe()
    
    [ Upstream commit 1da569fa7ec8cb0591c74aa3050d4ea1397778b4 ]
    
    pm_runtime_get_sync will increment pm usage counter even it failed.
    Forgetting to putting operation will result in reference leak here.
    Fix it by moving the error_pm label above the pm_runtime_put() in
    the error path.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yu Kuai <yukuai3@huawei.com>
    Link: https://lore.kernel.org/r/20210706124521.1371901-1-yukuai3@huawei.com
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/dma/sh/usb-dmac.c b/drivers/dma/sh/usb-dmac.c
index 6c94ed750049..d77bf325f038 100644
--- a/drivers/dma/sh/usb-dmac.c
+++ b/drivers/dma/sh/usb-dmac.c
@@ -860,8 +860,8 @@ static int usb_dmac_probe(struct platform_device *pdev)
 
 error:
 	of_dma_controller_free(pdev->dev.of_node);
-	pm_runtime_put(&pdev->dev);
 error_pm:
+	pm_runtime_put(&pdev->dev);
 	pm_runtime_disable(&pdev->dev);
 	return ret;
 }

commit 8b1868d2cc4b5da584c7143c93a32b437d5cb08d
Author: Adrian Larumbe <adrian.martinezlarumbe@imgtec.com>
Date:   Wed Jul 7 00:43:38 2021 +0100

    dmaengine: xilinx_dma: Fix read-after-free bug when terminating transfers
    
    [ Upstream commit 7dd2dd4ff9f3abda601f22b9d01441a0869d20d7 ]
    
    When user calls dmaengine_terminate_sync, the driver will clean up any
    remaining descriptors for all the pending or active transfers that had
    previously been submitted. However, this might happen whilst the tasklet is
    invoking the DMA callback for the last finished transfer, so by the time it
    returns and takes over the channel's spinlock, the list of completed
    descriptors it was traversing is no longer valid. This leads to a
    read-after-free situation.
    
    Fix it by signalling whether a user-triggered termination has happened by
    means of a boolean variable.
    
    Signed-off-by: Adrian Larumbe <adrian.martinezlarumbe@imgtec.com>
    Link: https://lore.kernel.org/r/20210706234338.7696-3-adrian.martinezlarumbe@imgtec.com
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/dma/xilinx/xilinx_dma.c b/drivers/dma/xilinx/xilinx_dma.c
index 0c5668e897fe..d891ec05bc48 100644
--- a/drivers/dma/xilinx/xilinx_dma.c
+++ b/drivers/dma/xilinx/xilinx_dma.c
@@ -332,6 +332,7 @@ struct xilinx_dma_tx_descriptor {
  * @genlock: Support genlock mode
  * @err: Channel has errors
  * @idle: Check for channel idle
+ * @terminating: Check for channel being synchronized by user
  * @tasklet: Cleanup work after irq
  * @config: Device configuration info
  * @flush_on_fsync: Flush on Frame sync
@@ -369,6 +370,7 @@ struct xilinx_dma_chan {
 	bool genlock;
 	bool err;
 	bool idle;
+	bool terminating;
 	struct tasklet_struct tasklet;
 	struct xilinx_vdma_config config;
 	bool flush_on_fsync;
@@ -843,6 +845,13 @@ static void xilinx_dma_chan_desc_cleanup(struct xilinx_dma_chan *chan)
 		/* Run any dependencies, then free the descriptor */
 		dma_run_dependencies(&desc->async_tx);
 		xilinx_dma_free_tx_descriptor(chan, desc);
+
+		/*
+		 * While we ran a callback the user called a terminate function,
+		 * which takes care of cleaning up any remaining descriptors
+		 */
+		if (chan->terminating)
+			break;
 	}
 
 	spin_unlock_irqrestore(&chan->lock, flags);
@@ -1612,6 +1621,8 @@ static dma_cookie_t xilinx_dma_tx_submit(struct dma_async_tx_descriptor *tx)
 	if (desc->cyclic)
 		chan->cyclic = true;
 
+	chan->terminating = false;
+
 	spin_unlock_irqrestore(&chan->lock, flags);
 
 	return cookie;
@@ -2068,6 +2079,7 @@ static int xilinx_dma_terminate_all(struct dma_chan *dchan)
 	}
 
 	/* Remove and free all of the descriptors in the lists */
+	chan->terminating = true;
 	xilinx_dma_free_descriptors(chan);
 	chan->idle = true;
 

commit 08c613a2cb06c68ef4e7733e052af067b21e5dbb
Author: Jouni Malinen <jouni@codeaurora.org>
Date:   Mon Dec 14 19:21:18 2020 +0200

    ath9k: Postpone key cache entry deletion for TXQ frames reference it
    
    commit ca2848022c12789685d3fab3227df02b863f9696 upstream.
    
    Do not delete a key cache entry that is still being referenced by
    pending frames in TXQs. This avoids reuse of the key cache entry while a
    frame might still be transmitted using it.
    
    To avoid having to do any additional operations during the main TX path
    operations, track pending key cache entries in a new bitmap and check
    whether any pending entries can be deleted before every new key
    add/remove operation. Also clear any remaining entries when stopping the
    interface.
    
    Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20201214172118.18100-6-jouni@codeaurora.org
    Cc: Pali Rohár <pali@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
index 68956cdc8c9a..4b5687b6c0c9 100644
--- a/drivers/net/wireless/ath/ath9k/hw.h
+++ b/drivers/net/wireless/ath/ath9k/hw.h
@@ -818,6 +818,7 @@ struct ath_hw {
 	struct ath9k_pacal_info pacal_info;
 	struct ar5416Stats stats;
 	struct ath9k_tx_queue_info txq[ATH9K_NUM_TX_QUEUES];
+	DECLARE_BITMAP(pending_del_keymap, ATH_KEYMAX);
 
 	enum ath9k_int imask;
 	u32 imrs2_reg;
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 95cc581e3761..a0097bebcba3 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -823,12 +823,80 @@ static void ath9k_tx(struct ieee80211_hw *hw,
 	ieee80211_free_txskb(hw, skb);
 }
 
+static bool ath9k_txq_list_has_key(struct list_head *txq_list, u32 keyix)
+{
+	struct ath_buf *bf;
+	struct ieee80211_tx_info *txinfo;
+	struct ath_frame_info *fi;
+
+	list_for_each_entry(bf, txq_list, list) {
+		if (bf->bf_state.stale || !bf->bf_mpdu)
+			continue;
+
+		txinfo = IEEE80211_SKB_CB(bf->bf_mpdu);
+		fi = (struct ath_frame_info *)&txinfo->rate_driver_data[0];
+		if (fi->keyix == keyix)
+			return true;
+	}
+
+	return false;
+}
+
+static bool ath9k_txq_has_key(struct ath_softc *sc, u32 keyix)
+{
+	struct ath_hw *ah = sc->sc_ah;
+	int i;
+	struct ath_txq *txq;
+	bool key_in_use = false;
+
+	for (i = 0; !key_in_use && i < ATH9K_NUM_TX_QUEUES; i++) {
+		if (!ATH_TXQ_SETUP(sc, i))
+			continue;
+		txq = &sc->tx.txq[i];
+		if (!txq->axq_depth)
+			continue;
+		if (!ath9k_hw_numtxpending(ah, txq->axq_qnum))
+			continue;
+
+		ath_txq_lock(sc, txq);
+		key_in_use = ath9k_txq_list_has_key(&txq->axq_q, keyix);
+		if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) {
+			int idx = txq->txq_tailidx;
+
+			while (!key_in_use &&
+			       !list_empty(&txq->txq_fifo[idx])) {
+				key_in_use = ath9k_txq_list_has_key(
+					&txq->txq_fifo[idx], keyix);
+				INCR(idx, ATH_TXFIFO_DEPTH);
+			}
+		}
+		ath_txq_unlock(sc, txq);
+	}
+
+	return key_in_use;
+}
+
+static void ath9k_pending_key_del(struct ath_softc *sc, u8 keyix)
+{
+	struct ath_hw *ah = sc->sc_ah;
+	struct ath_common *common = ath9k_hw_common(ah);
+
+	if (!test_bit(keyix, ah->pending_del_keymap) ||
+	    ath9k_txq_has_key(sc, keyix))
+		return;
+
+	/* No more TXQ frames point to this key cache entry, so delete it. */
+	clear_bit(keyix, ah->pending_del_keymap);
+	ath_key_delete(common, keyix);
+}
+
 static void ath9k_stop(struct ieee80211_hw *hw)
 {
 	struct ath_softc *sc = hw->priv;
 	struct ath_hw *ah = sc->sc_ah;
 	struct ath_common *common = ath9k_hw_common(ah);
 	bool prev_idle;
+	int i;
 
 	ath9k_deinit_channel_context(sc);
 
@@ -896,6 +964,9 @@ static void ath9k_stop(struct ieee80211_hw *hw)
 
 	spin_unlock_bh(&sc->sc_pcu_lock);
 
+	for (i = 0; i < ATH_KEYMAX; i++)
+		ath9k_pending_key_del(sc, i);
+
 	/* Clear key cache entries explicitly to get rid of any potentially
 	 * remaining keys.
 	 */
@@ -1712,6 +1783,12 @@ static int ath9k_set_key(struct ieee80211_hw *hw,
 	if (sta)
 		an = (struct ath_node *)sta->drv_priv;
 
+	/* Delete pending key cache entries if no more frames are pointing to
+	 * them in TXQs.
+	 */
+	for (i = 0; i < ATH_KEYMAX; i++)
+		ath9k_pending_key_del(sc, i);
+
 	switch (cmd) {
 	case SET_KEY:
 		if (sta)
@@ -1741,7 +1818,15 @@ static int ath9k_set_key(struct ieee80211_hw *hw,
 		}
 		break;
 	case DISABLE_KEY:
-		ath_key_delete(common, key->hw_key_idx);
+		if (ath9k_txq_has_key(sc, key->hw_key_idx)) {
+			/* Delay key cache entry deletion until there are no
+			 * remaining TXQ frames pointing to this entry.
+			 */
+			set_bit(key->hw_key_idx, sc->sc_ah->pending_del_keymap);
+			ath_hw_keysetmac(common, key->hw_key_idx, NULL);
+		} else {
+			ath_key_delete(common, key->hw_key_idx);
+		}
 		if (an) {
 			for (i = 0; i < ARRAY_SIZE(an->key_idx); i++) {
 				if (an->key_idx[i] != key->hw_key_idx)

commit 7c5a966edd3c6eec4a9bdf698c1f27712d1781f0
Author: Jouni Malinen <jouni@codeaurora.org>
Date:   Mon Dec 14 19:21:17 2020 +0200

    ath: Modify ath_key_delete() to not need full key entry
    
    commit 144cd24dbc36650a51f7fe3bf1424a1432f1f480 upstream.
    
    tkip_keymap can be used internally to avoid the reference to key->cipher
    and with this, only the key index value itself is needed. This allows
    ath_key_delete() call to be postponed to be handled after the upper
    layer STA and key entry have already been removed. This is needed to
    make ath9k key cache management safer.
    
    Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20201214172118.18100-5-jouni@codeaurora.org
    Cc: Pali Rohár <pali@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/ath/ath.h b/drivers/net/wireless/ath/ath.h
index 9d18105c449f..f083fb9038c3 100644
--- a/drivers/net/wireless/ath/ath.h
+++ b/drivers/net/wireless/ath/ath.h
@@ -197,7 +197,7 @@ struct sk_buff *ath_rxbuf_alloc(struct ath_common *common,
 bool ath_is_mybeacon(struct ath_common *common, struct ieee80211_hdr *hdr);
 
 void ath_hw_setbssidmask(struct ath_common *common);
-void ath_key_delete(struct ath_common *common, struct ieee80211_key_conf *key);
+void ath_key_delete(struct ath_common *common, u8 hw_key_idx);
 int ath_key_config(struct ath_common *common,
 			  struct ieee80211_vif *vif,
 			  struct ieee80211_sta *sta,
diff --git a/drivers/net/wireless/ath/ath5k/mac80211-ops.c b/drivers/net/wireless/ath/ath5k/mac80211-ops.c
index 16e052d02c94..0f4836fc3b7c 100644
--- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c
+++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c
@@ -522,7 +522,7 @@ ath5k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
 		}
 		break;
 	case DISABLE_KEY:
-		ath_key_delete(common, key);
+		ath_key_delete(common, key->hw_key_idx);
 		break;
 	default:
 		ret = -EINVAL;
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
index a82ad739ab80..16a7bae62b7d 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
@@ -1460,7 +1460,7 @@ static int ath9k_htc_set_key(struct ieee80211_hw *hw,
 		}
 		break;
 	case DISABLE_KEY:
-		ath_key_delete(common, key);
+		ath_key_delete(common, key->hw_key_idx);
 		break;
 	default:
 		ret = -EINVAL;
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 4b0a3f042ca3..95cc581e3761 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -1546,12 +1546,11 @@ static void ath9k_del_ps_key(struct ath_softc *sc,
 {
 	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
 	struct ath_node *an = (struct ath_node *) sta->drv_priv;
-	struct ieee80211_key_conf ps_key = { .hw_key_idx = an->ps_key };
 
 	if (!an->ps_key)
 	    return;
 
-	ath_key_delete(common, &ps_key);
+	ath_key_delete(common, an->ps_key);
 	an->ps_key = 0;
 	an->key_idx[0] = 0;
 }
@@ -1742,7 +1741,7 @@ static int ath9k_set_key(struct ieee80211_hw *hw,
 		}
 		break;
 	case DISABLE_KEY:
-		ath_key_delete(common, key);
+		ath_key_delete(common, key->hw_key_idx);
 		if (an) {
 			for (i = 0; i < ARRAY_SIZE(an->key_idx); i++) {
 				if (an->key_idx[i] != key->hw_key_idx)
diff --git a/drivers/net/wireless/ath/key.c b/drivers/net/wireless/ath/key.c
index cb266cf3c77c..61b59a804e30 100644
--- a/drivers/net/wireless/ath/key.c
+++ b/drivers/net/wireless/ath/key.c
@@ -581,38 +581,38 @@ EXPORT_SYMBOL(ath_key_config);
 /*
  * Delete Key.
  */
-void ath_key_delete(struct ath_common *common, struct ieee80211_key_conf *key)
+void ath_key_delete(struct ath_common *common, u8 hw_key_idx)
 {
 	/* Leave CCMP and TKIP (main key) configured to avoid disabling
 	 * encryption for potentially pending frames already in a TXQ with the
 	 * keyix pointing to this key entry. Instead, only clear the MAC address
 	 * to prevent RX processing from using this key cache entry.
 	 */
-	if (test_bit(key->hw_key_idx, common->ccmp_keymap) ||
-	    test_bit(key->hw_key_idx, common->tkip_keymap))
-		ath_hw_keysetmac(common, key->hw_key_idx, NULL);
+	if (test_bit(hw_key_idx, common->ccmp_keymap) ||
+	    test_bit(hw_key_idx, common->tkip_keymap))
+		ath_hw_keysetmac(common, hw_key_idx, NULL);
 	else
-		ath_hw_keyreset(common, key->hw_key_idx);
-	if (key->hw_key_idx < IEEE80211_WEP_NKID)
+		ath_hw_keyreset(common, hw_key_idx);
+	if (hw_key_idx < IEEE80211_WEP_NKID)
 		return;
 
-	clear_bit(key->hw_key_idx, common->keymap);
-	clear_bit(key->hw_key_idx, common->ccmp_keymap);
-	if (key->cipher != WLAN_CIPHER_SUITE_TKIP)
+	clear_bit(hw_key_idx, common->keymap);
+	clear_bit(hw_key_idx, common->ccmp_keymap);
+	if (!test_bit(hw_key_idx, common->tkip_keymap))
 		return;
 
-	clear_bit(key->hw_key_idx + 64, common->keymap);
+	clear_bit(hw_key_idx + 64, common->keymap);
 
-	clear_bit(key->hw_key_idx, common->tkip_keymap);
-	clear_bit(key->hw_key_idx + 64, common->tkip_keymap);
+	clear_bit(hw_key_idx, common->tkip_keymap);
+	clear_bit(hw_key_idx + 64, common->tkip_keymap);
 
 	if (!(common->crypt_caps & ATH_CRYPT_CAP_MIC_COMBINED)) {
-		ath_hw_keyreset(common, key->hw_key_idx + 32);
-		clear_bit(key->hw_key_idx + 32, common->keymap);
-		clear_bit(key->hw_key_idx + 64 + 32, common->keymap);
+		ath_hw_keyreset(common, hw_key_idx + 32);
+		clear_bit(hw_key_idx + 32, common->keymap);
+		clear_bit(hw_key_idx + 64 + 32, common->keymap);
 
-		clear_bit(key->hw_key_idx + 32, common->tkip_keymap);
-		clear_bit(key->hw_key_idx + 64 + 32, common->tkip_keymap);
+		clear_bit(hw_key_idx + 32, common->tkip_keymap);
+		clear_bit(hw_key_idx + 64 + 32, common->tkip_keymap);
 	}
 }
 EXPORT_SYMBOL(ath_key_delete);

commit fb924bfcecc90ca63ca76b5a10f192bd0e1bb35d
Author: Jouni Malinen <jouni@codeaurora.org>
Date:   Mon Dec 14 19:21:16 2020 +0200

    ath: Export ath_hw_keysetmac()
    
    commit d2d3e36498dd8e0c83ea99861fac5cf9e8671226 upstream.
    
    ath9k is going to use this for safer management of key cache entries.
    
    Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20201214172118.18100-4-jouni@codeaurora.org
    Cc: Pali Rohár <pali@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/ath/ath.h b/drivers/net/wireless/ath/ath.h
index 7a364eca46d6..9d18105c449f 100644
--- a/drivers/net/wireless/ath/ath.h
+++ b/drivers/net/wireless/ath/ath.h
@@ -203,6 +203,7 @@ int ath_key_config(struct ath_common *common,
 			  struct ieee80211_sta *sta,
 			  struct ieee80211_key_conf *key);
 bool ath_hw_keyreset(struct ath_common *common, u16 entry);
+bool ath_hw_keysetmac(struct ath_common *common, u16 entry, const u8 *mac);
 void ath_hw_cycle_counters_update(struct ath_common *common);
 int32_t ath_hw_get_listen_time(struct ath_common *common);
 
diff --git a/drivers/net/wireless/ath/key.c b/drivers/net/wireless/ath/key.c
index 59618bb41f6c..cb266cf3c77c 100644
--- a/drivers/net/wireless/ath/key.c
+++ b/drivers/net/wireless/ath/key.c
@@ -84,8 +84,7 @@ bool ath_hw_keyreset(struct ath_common *common, u16 entry)
 }
 EXPORT_SYMBOL(ath_hw_keyreset);
 
-static bool ath_hw_keysetmac(struct ath_common *common,
-			     u16 entry, const u8 *mac)
+bool ath_hw_keysetmac(struct ath_common *common, u16 entry, const u8 *mac)
 {
 	u32 macHi, macLo;
 	u32 unicast_flag = AR_KEYTABLE_VALID;
@@ -125,6 +124,7 @@ static bool ath_hw_keysetmac(struct ath_common *common,
 
 	return true;
 }
+EXPORT_SYMBOL(ath_hw_keysetmac);
 
 static bool ath_hw_set_keycache_entry(struct ath_common *common, u16 entry,
 				      const struct ath_keyval *k,

commit d2fd9d34210f34cd0ff5b33fa94e9fcc2a513cea
Author: Jouni Malinen <jouni@codeaurora.org>
Date:   Mon Dec 14 19:21:15 2020 +0200

    ath9k: Clear key cache explicitly on disabling hardware
    
    commit 73488cb2fa3bb1ef9f6cf0d757f76958bd4deaca upstream.
    
    Now that ath/key.c may not be explicitly clearing keys from the key
    cache, clear all key cache entries when disabling hardware to make sure
    no keys are left behind beyond this point.
    
    Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20201214172118.18100-3-jouni@codeaurora.org
    Cc: Pali Rohár <pali@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index e929020d7c9c..4b0a3f042ca3 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -896,6 +896,11 @@ static void ath9k_stop(struct ieee80211_hw *hw)
 
 	spin_unlock_bh(&sc->sc_pcu_lock);
 
+	/* Clear key cache entries explicitly to get rid of any potentially
+	 * remaining keys.
+	 */
+	ath9k_cmn_init_crypto(sc->sc_ah);
+
 	ath9k_ps_restore(sc);
 
 	sc->ps_idle = prev_idle;

commit dd5815f023b89c9a28325d8a2a5f0779b57b7190
Author: Jouni Malinen <jouni@codeaurora.org>
Date:   Mon Dec 14 19:21:14 2020 +0200

    ath: Use safer key clearing with key cache entries
    
    commit 56c5485c9e444c2e85e11694b6c44f1338fc20fd upstream.
    
    It is possible for there to be pending frames in TXQs with a reference
    to the key cache entry that is being deleted. If such a key cache entry
    is cleared, those pending frame in TXQ might get transmitted without
    proper encryption. It is safer to leave the previously used key into the
    key cache in such cases. Instead, only clear the MAC address to prevent
    RX processing from using this key cache entry.
    
    This is needed in particularly in AP mode where the TXQs cannot be
    flushed on station disconnection. This change alone may not be able to
    address all cases where the key cache entry might get reused for other
    purposes immediately (the key cache entry should be released for reuse
    only once the TXQs do not have any remaining references to them), but
    this makes it less likely to get unprotected frames and the more
    complete changes may end up being significantly more complex.
    
    Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20201214172118.18100-2-jouni@codeaurora.org
    Cc: Pali Rohár <pali@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/ath/key.c b/drivers/net/wireless/ath/key.c
index 1816b4e7dc26..59618bb41f6c 100644
--- a/drivers/net/wireless/ath/key.c
+++ b/drivers/net/wireless/ath/key.c
@@ -583,7 +583,16 @@ EXPORT_SYMBOL(ath_key_config);
  */
 void ath_key_delete(struct ath_common *common, struct ieee80211_key_conf *key)
 {
-	ath_hw_keyreset(common, key->hw_key_idx);
+	/* Leave CCMP and TKIP (main key) configured to avoid disabling
+	 * encryption for potentially pending frames already in a TXQ with the
+	 * keyix pointing to this key entry. Instead, only clear the MAC address
+	 * to prevent RX processing from using this key cache entry.
+	 */
+	if (test_bit(key->hw_key_idx, common->ccmp_keymap) ||
+	    test_bit(key->hw_key_idx, common->tkip_keymap))
+		ath_hw_keysetmac(common, key->hw_key_idx, NULL);
+	else
+		ath_hw_keyreset(common, key->hw_key_idx);
 	if (key->hw_key_idx < IEEE80211_WEP_NKID)
 		return;
 

commit e829367f47218de04587c2df3c4cb5ef87e35648
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Fri Jun 18 16:18:25 2021 +0200

    x86/fpu: Make init_fpstate correct with optimized XSAVE
    
    commit f9dfb5e390fab2df9f7944bb91e7705aba14cd26 upstream.
    
    The XSAVE init code initializes all enabled and supported components with
    XRSTOR(S) to init state. Then it XSAVEs the state of the components back
    into init_fpstate which is used in several places to fill in the init state
    of components.
    
    This works correctly with XSAVE, but not with XSAVEOPT and XSAVES because
    those use the init optimization and skip writing state of components which
    are in init state. So init_fpstate.xsave still contains all zeroes after
    this operation.
    
    There are two ways to solve that:
    
       1) Use XSAVE unconditionally, but that requires to reshuffle the buffer when
          XSAVES is enabled because XSAVES uses compacted format.
    
       2) Save the components which are known to have a non-zero init state by other
          means.
    
    Looking deeper, #2 is the right thing to do because all components the
    kernel supports have all-zeroes init state except the legacy features (FP,
    SSE). Those cannot be hard coded because the states are not identical on all
    CPUs, but they can be saved with FXSAVE which avoids all conditionals.
    
    Use FXSAVE to save the legacy FP/SSE components in init_fpstate along with
    a BUILD_BUG_ON() which reminds developers to validate that a newly added
    component has all zeroes init state. As a bonus remove the now unused
    copy_xregs_to_kernel_booting() crutch.
    
    The XSAVE and reshuffle method can still be implemented in the unlikely
    case that components are added which have a non-zero init state and no
    other means to save them. For now, FXSAVE is just simple and good enough.
    
      [ bp: Fix a typo or two in the text. ]
    
    Fixes: 6bad06b76892 ("x86, xsave: Use xsaveopt in context-switch path when supported")
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Reviewed-by: Borislav Petkov <bp@suse.de>
    Cc: stable@vger.kernel.org
    Link: https://lkml.kernel.org/r/20210618143444.587311343@linutronix.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/include/asm/fpu/internal.h b/arch/x86/include/asm/fpu/internal.h
index b8c935033d21..4f274d851986 100644
--- a/arch/x86/include/asm/fpu/internal.h
+++ b/arch/x86/include/asm/fpu/internal.h
@@ -215,6 +215,14 @@ static inline void copy_fxregs_to_kernel(struct fpu *fpu)
 	}
 }
 
+static inline void fxsave(struct fxregs_state *fx)
+{
+	if (IS_ENABLED(CONFIG_X86_32))
+		asm volatile( "fxsave %[fx]" : [fx] "=m" (*fx));
+	else
+		asm volatile("fxsaveq %[fx]" : [fx] "=m" (*fx));
+}
+
 /* These macros all use (%edi)/(%rdi) as the single memory argument. */
 #define XSAVE		".byte " REX_PREFIX "0x0f,0xae,0x27"
 #define XSAVEOPT	".byte " REX_PREFIX "0x0f,0xae,0x37"
@@ -283,28 +291,6 @@ static inline void copy_fxregs_to_kernel(struct fpu *fpu)
 		     : "D" (st), "m" (*st), "a" (lmask), "d" (hmask)	\
 		     : "memory")
 
-/*
- * This function is called only during boot time when x86 caps are not set
- * up and alternative can not be used yet.
- */
-static inline void copy_xregs_to_kernel_booting(struct xregs_state *xstate)
-{
-	u64 mask = -1;
-	u32 lmask = mask;
-	u32 hmask = mask >> 32;
-	int err;
-
-	WARN_ON(system_state != SYSTEM_BOOTING);
-
-	if (static_cpu_has(X86_FEATURE_XSAVES))
-		XSTATE_OP(XSAVES, xstate, lmask, hmask, err);
-	else
-		XSTATE_OP(XSAVE, xstate, lmask, hmask, err);
-
-	/* We should never fault when copying to a kernel buffer: */
-	WARN_ON_FPU(err);
-}
-
 /*
  * This function is called only during boot time when x86 caps are not set
  * up and alternative can not be used yet.
diff --git a/arch/x86/kernel/fpu/xstate.c b/arch/x86/kernel/fpu/xstate.c
index 601a5da1d196..7d372db8bee1 100644
--- a/arch/x86/kernel/fpu/xstate.c
+++ b/arch/x86/kernel/fpu/xstate.c
@@ -404,6 +404,24 @@ static void __init print_xstate_offset_size(void)
 	}
 }
 
+/*
+ * All supported features have either init state all zeros or are
+ * handled in setup_init_fpu() individually. This is an explicit
+ * feature list and does not use XFEATURE_MASK*SUPPORTED to catch
+ * newly added supported features at build time and make people
+ * actually look at the init state for the new feature.
+ */
+#define XFEATURES_INIT_FPSTATE_HANDLED		\
+	(XFEATURE_MASK_FP |			\
+	 XFEATURE_MASK_SSE |			\
+	 XFEATURE_MASK_YMM |			\
+	 XFEATURE_MASK_OPMASK |			\
+	 XFEATURE_MASK_ZMM_Hi256 |		\
+	 XFEATURE_MASK_Hi16_ZMM	 |		\
+	 XFEATURE_MASK_PKRU |			\
+	 XFEATURE_MASK_BNDREGS |		\
+	 XFEATURE_MASK_BNDCSR)
+
 /*
  * setup the xstate image representing the init state
  */
@@ -411,6 +429,8 @@ static void __init setup_init_fpu_buf(void)
 {
 	static int on_boot_cpu __initdata = 1;
 
+	BUILD_BUG_ON(XCNTXT_MASK != XFEATURES_INIT_FPSTATE_HANDLED);
+
 	WARN_ON_FPU(!on_boot_cpu);
 	on_boot_cpu = 0;
 
@@ -429,10 +449,22 @@ static void __init setup_init_fpu_buf(void)
 	copy_kernel_to_xregs_booting(&init_fpstate.xsave);
 
 	/*
-	 * Dump the init state again. This is to identify the init state
-	 * of any feature which is not represented by all zero's.
+	 * All components are now in init state. Read the state back so
+	 * that init_fpstate contains all non-zero init state. This only
+	 * works with XSAVE, but not with XSAVEOPT and XSAVES because
+	 * those use the init optimization which skips writing data for
+	 * components in init state.
+	 *
+	 * XSAVE could be used, but that would require to reshuffle the
+	 * data when XSAVES is available because XSAVES uses xstate
+	 * compaction. But doing so is a pointless exercise because most
+	 * components have an all zeros init state except for the legacy
+	 * ones (FP and SSE). Those can be saved with FXSAVE into the
+	 * legacy area. Adding new features requires to ensure that init
+	 * state is all zeroes or if not to add the necessary handling
+	 * here.
 	 */
-	copy_xregs_to_kernel_booting(&init_fpstate.xsave);
+	fxsave(&init_fpstate.fxsave);
 }
 
 static int xfeature_uncompacted_offset(int xfeature_nr)

commit 42f4312c0e8a225b5f1e3ed029509ef514f2157a
Author: Maxim Levitsky <mlevitsk@redhat.com>
Date:   Mon Aug 16 16:02:30 2021 +0200

    KVM: nSVM: avoid picking up unsupported bits from L2 in int_ctl (CVE-2021-3653)
    
    [ upstream commit 0f923e07124df069ba68d8bb12324398f4b6b709 ]
    
    * Invert the mask of bits that we pick from L2 in
      nested_vmcb02_prepare_control
    
    * Invert and explicitly use VIRQ related bits bitmask in svm_clear_vintr
    
    This fixes a security issue that allowed a malicious L1 to run L2 with
    AVIC enabled, which allowed the L2 to exploit the uninitialized and enabled
    AVIC to read/write the host physical memory at some offsets.
    
    Fixes: 3d6368ef580a ("KVM: SVM: Add VMRUN handler")
    Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/include/asm/svm.h b/arch/x86/include/asm/svm.h
index 93b462e48067..b6dedf6c835c 100644
--- a/arch/x86/include/asm/svm.h
+++ b/arch/x86/include/asm/svm.h
@@ -118,6 +118,8 @@ struct __attribute__ ((__packed__)) vmcb_control_area {
 #define V_IGN_TPR_SHIFT 20
 #define V_IGN_TPR_MASK (1 << V_IGN_TPR_SHIFT)
 
+#define V_IRQ_INJECTION_BITS_MASK (V_IRQ_MASK | V_INTR_PRIO_MASK | V_IGN_TPR_MASK)
+
 #define V_INTR_MASKING_SHIFT 24
 #define V_INTR_MASKING_MASK (1 << V_INTR_MASKING_SHIFT)
 
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 9673ddb3d7a0..85181457413e 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -1444,12 +1444,7 @@ static __init int svm_hardware_setup(void)
 		}
 	}
 
-	if (vgif) {
-		if (!boot_cpu_has(X86_FEATURE_VGIF))
-			vgif = false;
-		else
-			pr_info("Virtual GIF supported\n");
-	}
+	vgif = false; /* Disabled for CVE-2021-3653 */
 
 	return 0;
 
@@ -3593,7 +3588,13 @@ static void enter_svm_guest_mode(struct vcpu_svm *svm, u64 vmcb_gpa,
 	svm->nested.intercept            = nested_vmcb->control.intercept;
 
 	svm_flush_tlb(&svm->vcpu, true);
-	svm->vmcb->control.int_ctl = nested_vmcb->control.int_ctl | V_INTR_MASKING_MASK;
+
+	svm->vmcb->control.int_ctl &=
+			V_INTR_MASKING_MASK | V_GIF_ENABLE_MASK | V_GIF_MASK;
+
+	svm->vmcb->control.int_ctl |= nested_vmcb->control.int_ctl &
+			(V_TPR_MASK | V_IRQ_INJECTION_BITS_MASK);
+
 	if (nested_vmcb->control.int_ctl & V_INTR_MASKING_MASK)
 		svm->vcpu.arch.hflags |= HF_VINTR_MASK;
 	else

commit 119d547cbf7c055ba8100309ad71910478092f24
Author: Maxim Levitsky <mlevitsk@redhat.com>
Date:   Mon Aug 16 16:02:37 2021 +0200

    KVM: nSVM: always intercept VMLOAD/VMSAVE when nested (CVE-2021-3656)
    
    [ upstream commit c7dfa4009965a9b2d7b329ee970eb8da0d32f0bc ]
    
    If L1 disables VMLOAD/VMSAVE intercepts, and doesn't enable
    Virtual VMLOAD/VMSAVE (currently not supported for the nested hypervisor),
    then VMLOAD/VMSAVE must operate on the L1 physical memory, which is only
    possible by making L0 intercept these instructions.
    
    Failure to do so allowed the nested guest to run VMLOAD/VMSAVE unintercepted,
    and thus read/write portions of the host physical memory.
    
    Fixes: 89c8a4984fc9 ("KVM: SVM: Enable Virtual VMLOAD VMSAVE feature")
    
    Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 72d729f34437..9673ddb3d7a0 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -513,6 +513,9 @@ static void recalc_intercepts(struct vcpu_svm *svm)
 	c->intercept_dr = h->intercept_dr | g->intercept_dr;
 	c->intercept_exceptions = h->intercept_exceptions | g->intercept_exceptions;
 	c->intercept = h->intercept | g->intercept;
+
+	c->intercept |= (1ULL << INTERCEPT_VMLOAD);
+	c->intercept |= (1ULL << INTERCEPT_VMSAVE);
 }
 
 static inline struct vmcb *get_host_vmcb(struct vcpu_svm *svm)

commit 11cad2a46103388a46f31ab69b3e0e152a08df9c
Author: Johannes Berg <johannes.berg@intel.com>
Date:   Thu Mar 26 15:09:42 2020 +0200

    mac80211: drop data frames without key on encrypted links
    
    commit a0761a301746ec2d92d7fcb82af69c0a6a4339aa upstream.
    
    If we know that we have an encrypted link (based on having had
    a key configured for TX in the past) then drop all data frames
    in the key selection handler if there's no key anymore.
    
    This fixes an issue with mac80211 internal TXQs - there we can
    buffer frames for an encrypted link, but then if the key is no
    longer there when they're dequeued, the frames are sent without
    encryption. This happens if a station is disconnected while the
    frames are still on the TXQ.
    
    Detecting that a link should be encrypted based on a first key
    having been configured for TX is fine as there are no use cases
    for a connection going from with encryption to no encryption.
    With extended key IDs, however, there is a case of having a key
    configured for only decryption, so we can't just trigger this
    behaviour on a key being configured.
    
    Cc: stable@vger.kernel.org
    Reported-by: Jouni Malinen <j@w1.fi>
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
    Link: https://lore.kernel.org/r/iwlwifi.20200326150855.6865c7f28a14.I9fb1d911b064262d33e33dfba730cdeef83926ca@changeid
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    [pali: Backported to 4.19 and older versions]
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/mac80211/debugfs_sta.c b/net/mac80211/debugfs_sta.c
index 4105081dc1df..6f390c2e4c8e 100644
--- a/net/mac80211/debugfs_sta.c
+++ b/net/mac80211/debugfs_sta.c
@@ -80,6 +80,7 @@ static const char * const sta_flag_names[] = {
 	FLAG(MPSP_OWNER),
 	FLAG(MPSP_RECIPIENT),
 	FLAG(PS_DELIVER),
+	FLAG(USES_ENCRYPTION),
 #undef FLAG
 };
 
diff --git a/net/mac80211/key.c b/net/mac80211/key.c
index 6775d6cb7d3d..7fc55177db84 100644
--- a/net/mac80211/key.c
+++ b/net/mac80211/key.c
@@ -341,6 +341,7 @@ static void ieee80211_key_replace(struct ieee80211_sub_if_data *sdata,
 	if (sta) {
 		if (pairwise) {
 			rcu_assign_pointer(sta->ptk[idx], new);
+			set_sta_flag(sta, WLAN_STA_USES_ENCRYPTION);
 			sta->ptk_idx = idx;
 			ieee80211_check_fast_xmit(sta);
 		} else {
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
index c33bc5fc0f2d..75d982ff7f3d 100644
--- a/net/mac80211/sta_info.h
+++ b/net/mac80211/sta_info.h
@@ -102,6 +102,7 @@ enum ieee80211_sta_info_flags {
 	WLAN_STA_MPSP_OWNER,
 	WLAN_STA_MPSP_RECIPIENT,
 	WLAN_STA_PS_DELIVER,
+	WLAN_STA_USES_ENCRYPTION,
 
 	NUM_WLAN_STA_FLAGS,
 };
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 98d048630ad2..3530d1a5fc98 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -593,10 +593,13 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx)
 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
 
-	if (unlikely(info->flags & IEEE80211_TX_INTFL_DONT_ENCRYPT))
+	if (unlikely(info->flags & IEEE80211_TX_INTFL_DONT_ENCRYPT)) {
 		tx->key = NULL;
-	else if (tx->sta &&
-		 (key = rcu_dereference(tx->sta->ptk[tx->sta->ptk_idx])))
+		return TX_CONTINUE;
+	}
+
+	if (tx->sta &&
+	    (key = rcu_dereference(tx->sta->ptk[tx->sta->ptk_idx])))
 		tx->key = key;
 	else if (ieee80211_is_group_privacy_action(tx->skb) &&
 		(key = rcu_dereference(tx->sdata->default_multicast_key)))
@@ -657,6 +660,9 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx)
 		if (!skip_hw && tx->key &&
 		    tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)
 			info->control.hw_key = &tx->key->conf;
+	} else if (!ieee80211_is_mgmt(hdr->frame_control) && tx->sta &&
+		   test_sta_flag(tx->sta, WLAN_STA_USES_ENCRYPTION)) {
+		return TX_DROP;
 	}
 
 	return TX_CONTINUE;

commit 6a9449e9568808930e7d4d83c33e320329113a67
Author: Saeed Mirzamohammadi <saeed.mirzamohammadi@oracle.com>
Date:   Mon Aug 16 19:39:32 2021 +0800

    iommu/vt-d: Fix agaw for a supported 48 bit guest address width
    
    [ Upstream commit 327d5b2fee91c404a3956c324193892cf2cc9528 ]
    
    The IOMMU driver calculates the guest addressability for a DMA request
    based on the value of the mgaw reported from the IOMMU. However, this
    is a fused value and as mentioned in the spec, the guest width
    should be calculated based on the minimum of supported adjusted guest
    address width (SAGAW) and MGAW.
    
    This is from specification:
    "Guest addressability for a given DMA request is limited to the
    minimum of the value reported through this field and the adjusted
    guest address width of the corresponding page-table structure.
    (Adjusted guest address widths supported by hardware are reported
    through the SAGAW field)."
    
    This causes domain initialization to fail and following
    errors appear for EHCI PCI driver:
    
    [    2.486393] ehci-pci 0000:01:00.4: EHCI Host Controller
    [    2.486624] ehci-pci 0000:01:00.4: new USB bus registered, assigned bus
    number 1
    [    2.489127] ehci-pci 0000:01:00.4: DMAR: Allocating domain failed
    [    2.489350] ehci-pci 0000:01:00.4: DMAR: 32bit DMA uses non-identity
    mapping
    [    2.489359] ehci-pci 0000:01:00.4: can't setup: -12
    [    2.489531] ehci-pci 0000:01:00.4: USB bus 1 deregistered
    [    2.490023] ehci-pci 0000:01:00.4: init 0000:01:00.4 fail, -12
    [    2.490358] ehci-pci: probe of 0000:01:00.4 failed with error -12
    
    This issue happens when the value of the sagaw corresponds to a
    48-bit agaw. This fix updates the calculation of the agaw based on
    the minimum of IOMMU's sagaw value and MGAW.
    
    This issue happens on the code path of getting a private domain for a
    device. A private domain was needed when the domain of an iommu group
    couldn't meet the requirement of a device. The IOMMU core has been
    evolved to eliminate the need for private domain, hence this code path
    has alreay been removed from the upstream since commit 327d5b2fee91c
    ("iommu/vt-d: Allow 32bit devices to uses DMA domain"). Instead of back
    porting all patches that are required for removing the private domain,
    this simply fixes it in the affected stable kernel between v4.16 and v5.7.
    
    [baolu: The orignal patch could be found here
     https://lore.kernel.org/linux-iommu/20210412202736.70765-1-saeed.mirzamohammadi@oracle.com/.
     I added commit message according to Greg's comments at
     https://lore.kernel.org/linux-iommu/YHZ%2FT9x7Xjf1r6fI@kroah.com/.]
    
    Cc: Joerg Roedel <joro@8bytes.org>
    Cc: Ashok Raj <ashok.raj@intel.com>
    Cc: stable@vger.kernel.org #v4.16+
    Signed-off-by: Saeed Mirzamohammadi <saeed.mirzamohammadi@oracle.com>
    Tested-by: Camille Lu <camille.lu@hpe.com>
    Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index d2166dfc8b3f..dcb865d19309 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -1928,7 +1928,7 @@ static inline int guestwidth_to_adjustwidth(int gaw)
 static int domain_init(struct dmar_domain *domain, struct intel_iommu *iommu,
 		       int guest_width)
 {
-	int adjust_width, agaw;
+	int adjust_width, agaw, cap_width;
 	unsigned long sagaw;
 	int err;
 
@@ -1942,8 +1942,9 @@ static int domain_init(struct dmar_domain *domain, struct intel_iommu *iommu,
 	domain_reserve_special_ranges(domain);
 
 	/* calculate AGAW */
-	if (guest_width > cap_mgaw(iommu->cap))
-		guest_width = cap_mgaw(iommu->cap);
+	cap_width = min_t(int, cap_mgaw(iommu->cap), agaw_to_width(iommu->agaw));
+	if (guest_width > cap_width)
+		guest_width = cap_width;
 	domain->gaw = guest_width;
 	adjust_width = guestwidth_to_adjustwidth(guest_width);
 	agaw = width_to_agaw(adjust_width);

commit c47f8a185747dbf90728174b1a375c0542ca2bae
Author: Nathan Chancellor <nathan@kernel.org>
Date:   Fri Jul 30 19:31:08 2021 -0700

    vmlinux.lds.h: Handle clang's module.{c,d}tor sections
    
    commit 848378812e40152abe9b9baf58ce2004f76fb988 upstream.
    
    A recent change in LLVM causes module_{c,d}tor sections to appear when
    CONFIG_K{A,C}SAN are enabled, which results in orphan section warnings
    because these are not handled anywhere:
    
    ld.lld: warning: arch/x86/pci/built-in.a(legacy.o):(.text.asan.module_ctor) is being placed in '.text.asan.module_ctor'
    ld.lld: warning: arch/x86/pci/built-in.a(legacy.o):(.text.asan.module_dtor) is being placed in '.text.asan.module_dtor'
    ld.lld: warning: arch/x86/pci/built-in.a(legacy.o):(.text.tsan.module_ctor) is being placed in '.text.tsan.module_ctor'
    
    Fangrui explains: "the function asan.module_ctor has the SHF_GNU_RETAIN
    flag, so it is in a separate section even with -fno-function-sections
    (default)".
    
    Place them in the TEXT_TEXT section so that these technologies continue
    to work with the newer compiler versions. All of the KASAN and KCSAN
    KUnit tests continue to pass after this change.
    
    Cc: stable@vger.kernel.org
    Link: https://github.com/ClangBuiltLinux/linux/issues/1432
    Link: https://github.com/llvm/llvm-project/commit/7b789562244ee941b7bf2cefeb3fc08a59a01865
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
    Reviewed-by: Fangrui Song <maskray@google.com>
    Acked-by: Marco Elver <elver@google.com>
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Link: https://lore.kernel.org/r/20210731023107.1932981-1-nathan@kernel.org
    [nc: Resolve conflict due to lack of cf68fffb66d60]
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index ad8766e1635e..a26e6f5034a6 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -508,6 +508,7 @@
 		NOINSTR_TEXT						\
 		*(.text..refcount)					\
 		*(.ref.text)						\
+		*(.text.asan.* .text.tsan.*)				\
 	MEM_KEEP(init.text*)						\
 	MEM_KEEP(exit.text*)						\
 

commit 153cc7c9dfefe646c8b2a74eb925b6620b915154
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Thu Jul 29 23:51:43 2021 +0200

    PCI/MSI: Enforce MSI[X] entry updates to be visible
    
    commit b9255a7cb51754e8d2645b65dd31805e282b4f3e upstream.
    
    Nothing enforces the posted writes to be visible when the function
    returns. Flush them even if the flush might be redundant when the entry is
    masked already as the unmask will flush as well. This is either setup or a
    rare affinity change event so the extra flush is not the end of the world.
    
    While this is more a theoretical issue especially the logic in the X86
    specific msi_set_affinity() function relies on the assumption that the
    update has reached the hardware when the function returns.
    
    Again, as this never has been enforced the Fixes tag refers to a commit in:
       git://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git
    
    Fixes: f036d4ea5fa7 ("[PATCH] ia32 Message Signalled Interrupt support")
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Marc Zyngier <maz@kernel.org>
    Reviewed-by: Marc Zyngier <maz@kernel.org>
    Acked-by: Bjorn Helgaas <bhelgaas@google.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210729222542.515188147@linutronix.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index 5a28f7e81f0c..bc80b0f0ea1b 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -322,6 +322,9 @@ void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
 
 		if (unmasked)
 			__pci_msix_desc_mask_irq(entry, 0);
+
+		/* Ensure that the writes are visible in the device */
+		readl(base + PCI_MSIX_ENTRY_DATA);
 	} else {
 		int pos = dev->msi_cap;
 		u16 msgctl;
@@ -342,6 +345,8 @@ void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
 			pci_write_config_word(dev, pos + PCI_MSI_DATA_32,
 					      msg->data);
 		}
+		/* Ensure that the writes are visible in the device */
+		pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &msgctl);
 	}
 	entry->msg = *msg;
 }

commit b590b85fc91979a97cbb4ab1bcf888aa245cd5e3
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Thu Jul 29 23:51:42 2021 +0200

    PCI/MSI: Enforce that MSI-X table entry is masked for update
    
    commit da181dc974ad667579baece33c2c8d2d1e4558d5 upstream.
    
    The specification (PCIe r5.0, sec 6.1.4.5) states:
    
        For MSI-X, a function is permitted to cache Address and Data values
        from unmasked MSI-X Table entries. However, anytime software unmasks a
        currently masked MSI-X Table entry either by clearing its Mask bit or
        by clearing the Function Mask bit, the function must update any Address
        or Data values that it cached from that entry. If software changes the
        Address or Data value of an entry while the entry is unmasked, the
        result is undefined.
    
    The Linux kernel's MSI-X support never enforced that the entry is masked
    before the entry is modified hence the Fixes tag refers to a commit in:
          git://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git
    
    Enforce the entry to be masked across the update.
    
    There is no point in enforcing this to be handled at all possible call
    sites as this is just pointless code duplication and the common update
    function is the obvious place to enforce this.
    
    Fixes: f036d4ea5fa7 ("[PATCH] ia32 Message Signalled Interrupt support")
    Reported-by: Kevin Tian <kevin.tian@intel.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Marc Zyngier <maz@kernel.org>
    Reviewed-by: Marc Zyngier <maz@kernel.org>
    Acked-by: Bjorn Helgaas <bhelgaas@google.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210729222542.462096385@linutronix.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index d13b8b608891..5a28f7e81f0c 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -303,10 +303,25 @@ void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
 		/* Don't touch the hardware now */
 	} else if (entry->msi_attrib.is_msix) {
 		void __iomem *base = pci_msix_desc_addr(entry);
+		bool unmasked = !(entry->masked & PCI_MSIX_ENTRY_CTRL_MASKBIT);
+
+		/*
+		 * The specification mandates that the entry is masked
+		 * when the message is modified:
+		 *
+		 * "If software changes the Address or Data value of an
+		 * entry while the entry is unmasked, the result is
+		 * undefined."
+		 */
+		if (unmasked)
+			__pci_msix_desc_mask_irq(entry, PCI_MSIX_ENTRY_CTRL_MASKBIT);
 
 		writel(msg->address_lo, base + PCI_MSIX_ENTRY_LOWER_ADDR);
 		writel(msg->address_hi, base + PCI_MSIX_ENTRY_UPPER_ADDR);
 		writel(msg->data, base + PCI_MSIX_ENTRY_DATA);
+
+		if (unmasked)
+			__pci_msix_desc_mask_irq(entry, 0);
 	} else {
 		int pos = dev->msi_cap;
 		u16 msgctl;

commit 3b570884c868c12e3184627ce4b4a167e9d6f018
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Thu Jul 29 23:51:41 2021 +0200

    PCI/MSI: Mask all unused MSI-X entries
    
    commit 7d5ec3d3612396dc6d4b76366d20ab9fc06f399f upstream.
    
    When MSI-X is enabled the ordering of calls is:
    
      msix_map_region();
      msix_setup_entries();
      pci_msi_setup_msi_irqs();
      msix_program_entries();
    
    This has a few interesting issues:
    
     1) msix_setup_entries() allocates the MSI descriptors and initializes them
        except for the msi_desc:masked member which is left zero initialized.
    
     2) pci_msi_setup_msi_irqs() allocates the interrupt descriptors and sets
        up the MSI interrupts which ends up in pci_write_msi_msg() unless the
        interrupt chip provides its own irq_write_msi_msg() function.
    
     3) msix_program_entries() does not do what the name suggests. It solely
        updates the entries array (if not NULL) and initializes the masked
        member for each MSI descriptor by reading the hardware state and then
        masks the entry.
    
    Obviously this has some issues:
    
     1) The uninitialized masked member of msi_desc prevents the enforcement
        of masking the entry in pci_write_msi_msg() depending on the cached
        masked bit. Aside of that half initialized data is a NONO in general
    
     2) msix_program_entries() only ensures that the actually allocated entries
        are masked. This is wrong as experimentation with crash testing and
        crash kernel kexec has shown.
    
        This limited testing unearthed that when the production kernel had more
        entries in use and unmasked when it crashed and the crash kernel
        allocated a smaller amount of entries, then a full scan of all entries
        found unmasked entries which were in use in the production kernel.
    
        This is obviously a device or emulation issue as the device reset
        should mask all MSI-X table entries, but obviously that's just part
        of the paper specification.
    
    Cure this by:
    
     1) Masking all table entries in hardware
     2) Initializing msi_desc::masked in msix_setup_entries()
     3) Removing the mask dance in msix_program_entries()
     4) Renaming msix_program_entries() to msix_update_entries() to
        reflect the purpose of that function.
    
    As the masking of unused entries has never been done the Fixes tag refers
    to a commit in:
       git://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git
    
    Fixes: f036d4ea5fa7 ("[PATCH] ia32 Message Signalled Interrupt support")
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Marc Zyngier <maz@kernel.org>
    Reviewed-by: Marc Zyngier <maz@kernel.org>
    Acked-by: Bjorn Helgaas <bhelgaas@google.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210729222542.403833459@linutronix.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index a9cbc301a8a6..d13b8b608891 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -675,6 +675,7 @@ static int msix_setup_entries(struct pci_dev *dev, void __iomem *base,
 {
 	struct cpumask *curmsk, *masks = NULL;
 	struct msi_desc *entry;
+	void __iomem *addr;
 	int ret, i;
 
 	if (affd)
@@ -694,6 +695,7 @@ static int msix_setup_entries(struct pci_dev *dev, void __iomem *base,
 
 		entry->msi_attrib.is_msix	= 1;
 		entry->msi_attrib.is_64		= 1;
+
 		if (entries)
 			entry->msi_attrib.entry_nr = entries[i].entry;
 		else
@@ -701,6 +703,10 @@ static int msix_setup_entries(struct pci_dev *dev, void __iomem *base,
 		entry->msi_attrib.default_irq	= dev->irq;
 		entry->mask_base		= base;
 
+		addr = pci_msix_desc_addr(entry);
+		if (addr)
+			entry->masked = readl(addr + PCI_MSIX_ENTRY_VECTOR_CTRL);
+
 		list_add_tail(&entry->list, dev_to_msi_list(&dev->dev));
 		if (masks)
 			curmsk++;
@@ -711,21 +717,27 @@ static int msix_setup_entries(struct pci_dev *dev, void __iomem *base,
 	return ret;
 }
 
-static void msix_program_entries(struct pci_dev *dev,
-				 struct msix_entry *entries)
+static void msix_update_entries(struct pci_dev *dev, struct msix_entry *entries)
 {
 	struct msi_desc *entry;
-	int i = 0;
 
 	for_each_pci_msi_entry(entry, dev) {
-		if (entries)
-			entries[i++].vector = entry->irq;
-		entry->masked = readl(pci_msix_desc_addr(entry) +
-				PCI_MSIX_ENTRY_VECTOR_CTRL);
-		msix_mask_irq(entry, 1);
+		if (entries) {
+			entries->vector = entry->irq;
+			entries++;
+		}
 	}
 }
 
+static void msix_mask_all(void __iomem *base, int tsize)
+{
+	u32 ctrl = PCI_MSIX_ENTRY_CTRL_MASKBIT;
+	int i;
+
+	for (i = 0; i < tsize; i++, base += PCI_MSIX_ENTRY_SIZE)
+		writel(ctrl, base + PCI_MSIX_ENTRY_VECTOR_CTRL);
+}
+
 /**
  * msix_capability_init - configure device's MSI-X capability
  * @dev: pointer to the pci_dev data structure of MSI-X device function
@@ -740,9 +752,9 @@ static void msix_program_entries(struct pci_dev *dev,
 static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries,
 				int nvec, const struct irq_affinity *affd)
 {
-	int ret;
-	u16 control;
 	void __iomem *base;
+	int ret, tsize;
+	u16 control;
 
 	/*
 	 * Some devices require MSI-X to be enabled before the MSI-X
@@ -754,12 +766,16 @@ static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries,
 
 	pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &control);
 	/* Request & Map MSI-X table region */
-	base = msix_map_region(dev, msix_table_size(control));
+	tsize = msix_table_size(control);
+	base = msix_map_region(dev, tsize);
 	if (!base) {
 		ret = -ENOMEM;
 		goto out_disable;
 	}
 
+	/* Ensure that all table entries are masked. */
+	msix_mask_all(base, tsize);
+
 	ret = msix_setup_entries(dev, base, entries, nvec, affd);
 	if (ret)
 		goto out_disable;
@@ -773,7 +789,7 @@ static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries,
 	if (ret)
 		goto out_free;
 
-	msix_program_entries(dev, entries);
+	msix_update_entries(dev, entries);
 
 	ret = populate_msi_sysfs(dev);
 	if (ret)

commit 3c9534778d4cc2bd01e20d4dcffc55df0962aa12
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Thu Jul 29 23:51:47 2021 +0200

    PCI/MSI: Protect msi_desc::masked for multi-MSI
    
    commit 77e89afc25f30abd56e76a809ee2884d7c1b63ce upstream.
    
    Multi-MSI uses a single MSI descriptor and there is a single mask register
    when the device supports per vector masking. To avoid reading back the mask
    register the value is cached in the MSI descriptor and updates are done by
    clearing and setting bits in the cache and writing it to the device.
    
    But nothing protects msi_desc::masked and the mask register from being
    modified concurrently on two different CPUs for two different Linux
    interrupts which belong to the same multi-MSI descriptor.
    
    Add a lock to struct device and protect any operation on the mask and the
    mask register with it.
    
    This makes the update of msi_desc::masked unconditional, but there is no
    place which requires a modification of the hardware register without
    updating the masked cache.
    
    msi_mask_irq() is now an empty wrapper which will be cleaned up in follow
    up changes.
    
    The problem goes way back to the initial support of multi-MSI, but picking
    the commit which introduced the mask cache is a valid cut off point
    (2.6.30).
    
    Fixes: f2440d9acbe8 ("PCI MSI: Refactor interrupt masking code")
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Marc Zyngier <maz@kernel.org>
    Reviewed-by: Marc Zyngier <maz@kernel.org>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210729222542.726833414@linutronix.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/base/core.c b/drivers/base/core.c
index f7f601858f10..6e380ad9d08a 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -1682,6 +1682,7 @@ void device_initialize(struct device *dev)
 	device_pm_init(dev);
 	set_dev_node(dev, -1);
 #ifdef CONFIG_GENERIC_MSI_IRQ
+	raw_spin_lock_init(&dev->msi_lock);
 	INIT_LIST_HEAD(&dev->msi_list);
 #endif
 	INIT_LIST_HEAD(&dev->links.consumers);
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index 677b58670011..a9cbc301a8a6 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -170,24 +170,25 @@ static inline __attribute_const__ u32 msi_mask(unsigned x)
  * reliably as devices without an INTx disable bit will then generate a
  * level IRQ which will never be cleared.
  */
-u32 __pci_msi_desc_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
+void __pci_msi_desc_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
 {
-	u32 mask_bits = desc->masked;
+	raw_spinlock_t *lock = &desc->dev->msi_lock;
+	unsigned long flags;
 
 	if (pci_msi_ignore_mask || !desc->msi_attrib.maskbit)
-		return 0;
+		return;
 
-	mask_bits &= ~mask;
-	mask_bits |= flag;
+	raw_spin_lock_irqsave(lock, flags);
+	desc->masked &= ~mask;
+	desc->masked |= flag;
 	pci_write_config_dword(msi_desc_to_pci_dev(desc), desc->mask_pos,
-			       mask_bits);
-
-	return mask_bits;
+			       desc->masked);
+	raw_spin_unlock_irqrestore(lock, flags);
 }
 
 static void msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
 {
-	desc->masked = __pci_msi_desc_mask_irq(desc, mask, flag);
+	__pci_msi_desc_mask_irq(desc, mask, flag);
 }
 
 static void __iomem *pci_msix_desc_addr(struct msi_desc *desc)
diff --git a/include/linux/device.h b/include/linux/device.h
index b1c8150e9ea5..37e359d81a86 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -998,6 +998,7 @@ struct device {
 	struct dev_pin_info	*pins;
 #endif
 #ifdef CONFIG_GENERIC_MSI_IRQ
+	raw_spinlock_t		msi_lock;
 	struct list_head	msi_list;
 #endif
 
diff --git a/include/linux/msi.h b/include/linux/msi.h
index 5dd171849a27..62982e6afddf 100644
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -150,7 +150,7 @@ void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
 void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
 
 u32 __pci_msix_desc_mask_irq(struct msi_desc *desc, u32 flag);
-u32 __pci_msi_desc_mask_irq(struct msi_desc *desc, u32 mask, u32 flag);
+void __pci_msi_desc_mask_irq(struct msi_desc *desc, u32 mask, u32 flag);
 void pci_msi_mask_irq(struct irq_data *data);
 void pci_msi_unmask_irq(struct irq_data *data);
 

commit 1b36c30a9335db941423c05b49a8266a84a82f95
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Thu Jul 29 23:51:46 2021 +0200

    PCI/MSI: Use msi_mask_irq() in pci_msi_shutdown()
    
    commit d28d4ad2a1aef27458b3383725bb179beb8d015c upstream.
    
    No point in using the raw write function from shutdown. Preparatory change
    to introduce proper serialization for the msi_desc::masked cache.
    
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Marc Zyngier <maz@kernel.org>
    Reviewed-by: Marc Zyngier <maz@kernel.org>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210729222542.674391354@linutronix.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index 758223252cd4..677b58670011 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -896,7 +896,7 @@ static void pci_msi_shutdown(struct pci_dev *dev)
 
 	/* Return the device with MSI unmasked as initial states */
 	mask = msi_mask(desc->msi_attrib.multi_cap);
-	__pci_msi_desc_mask_irq(desc, mask, 0);
+	msi_mask_irq(desc, mask, 0);
 
 	/* Restore dev->irq to its default pin-assertion irq */
 	dev->irq = desc->msi_attrib.default_irq;

commit c5b223cd04706589e5e6840e2ab7c4f879323ed9
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Thu Jul 29 23:51:45 2021 +0200

    PCI/MSI: Correct misleading comments
    
    commit 689e6b5351573c38ccf92a0dd8b3e2c2241e4aff upstream.
    
    The comments about preserving the cached state in pci_msi[x]_shutdown() are
    misleading as the MSI descriptors are freed right after those functions
    return. So there is nothing to restore. Preparatory change.
    
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Marc Zyngier <maz@kernel.org>
    Reviewed-by: Marc Zyngier <maz@kernel.org>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210729222542.621609423@linutronix.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index 77e096c942ec..758223252cd4 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -896,7 +896,6 @@ static void pci_msi_shutdown(struct pci_dev *dev)
 
 	/* Return the device with MSI unmasked as initial states */
 	mask = msi_mask(desc->msi_attrib.multi_cap);
-	/* Keep cached state to be restored */
 	__pci_msi_desc_mask_irq(desc, mask, 0);
 
 	/* Restore dev->irq to its default pin-assertion irq */
@@ -982,10 +981,8 @@ static void pci_msix_shutdown(struct pci_dev *dev)
 	}
 
 	/* Return the device with MSI-X masked as initial states */
-	for_each_pci_msi_entry(entry, dev) {
-		/* Keep cached states to be restored */
+	for_each_pci_msi_entry(entry, dev)
 		__pci_msix_desc_mask_irq(entry, 1);
-	}
 
 	pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
 	pci_intx_for_msi(dev, 1);

commit 22f4a36d086d74f7abe9c4eaf65204048cd84f9c
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Thu Jul 29 23:51:44 2021 +0200

    PCI/MSI: Do not set invalid bits in MSI mask
    
    commit 361fd37397f77578735907341579397d5bed0a2d upstream.
    
    msi_mask_irq() takes a mask and a flags argument. The mask argument is used
    to mask out bits from the cached mask and the flags argument to set bits.
    
    Some places invoke it with a flags argument which sets bits which are not
    used by the device, i.e. when the device supports up to 8 vectors a full
    unmask in some places sets the mask to 0xFFFFFF00. While devices probably
    do not care, it's still bad practice.
    
    Fixes: 7ba1930db02f ("PCI MSI: Unmask MSI if setup failed")
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Marc Zyngier <maz@kernel.org>
    Reviewed-by: Marc Zyngier <maz@kernel.org>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210729222542.568173099@linutronix.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index 949dc342c16a..77e096c942ec 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -619,21 +619,21 @@ static int msi_capability_init(struct pci_dev *dev, int nvec,
 	/* Configure MSI capability structure */
 	ret = pci_msi_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSI);
 	if (ret) {
-		msi_mask_irq(entry, mask, ~mask);
+		msi_mask_irq(entry, mask, 0);
 		free_msi_irqs(dev);
 		return ret;
 	}
 
 	ret = msi_verify_entries(dev);
 	if (ret) {
-		msi_mask_irq(entry, mask, ~mask);
+		msi_mask_irq(entry, mask, 0);
 		free_msi_irqs(dev);
 		return ret;
 	}
 
 	ret = populate_msi_sysfs(dev);
 	if (ret) {
-		msi_mask_irq(entry, mask, ~mask);
+		msi_mask_irq(entry, mask, 0);
 		free_msi_irqs(dev);
 		return ret;
 	}
@@ -897,7 +897,7 @@ static void pci_msi_shutdown(struct pci_dev *dev)
 	/* Return the device with MSI unmasked as initial states */
 	mask = msi_mask(desc->msi_attrib.multi_cap);
 	/* Keep cached state to be restored */
-	__pci_msi_desc_mask_irq(desc, mask, ~mask);
+	__pci_msi_desc_mask_irq(desc, mask, 0);
 
 	/* Restore dev->irq to its default pin-assertion irq */
 	dev->irq = desc->msi_attrib.default_irq;

commit 6aea847496c8c9a37a5df795c4fe42a0e5fcccc5
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Thu Jul 29 23:51:40 2021 +0200

    PCI/MSI: Enable and mask MSI-X early
    
    commit 438553958ba19296663c6d6583d208dfb6792830 upstream.
    
    The ordering of MSI-X enable in hardware is dysfunctional:
    
     1) MSI-X is disabled in the control register
     2) Various setup functions
     3) pci_msi_setup_msi_irqs() is invoked which ends up accessing
        the MSI-X table entries
     4) MSI-X is enabled and masked in the control register with the
        comment that enabling is required for some hardware to access
        the MSI-X table
    
    Step #4 obviously contradicts #3. The history of this is an issue with the
    NIU hardware. When #4 was introduced the table access actually happened in
    msix_program_entries() which was invoked after enabling and masking MSI-X.
    
    This was changed in commit d71d6432e105 ("PCI/MSI: Kill redundant call of
    irq_set_msi_desc() for MSI-X interrupts") which removed the table write
    from msix_program_entries().
    
    Interestingly enough nobody noticed and either NIU still works or it did
    not get any testing with a kernel 3.19 or later.
    
    Nevertheless this is inconsistent and there is no reason why MSI-X can't be
    enabled and masked in the control register early on, i.e. move step #4
    above to step #1. This preserves the NIU workaround and has no side effects
    on other hardware.
    
    Fixes: d71d6432e105 ("PCI/MSI: Kill redundant call of irq_set_msi_desc() for MSI-X interrupts")
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Marc Zyngier <maz@kernel.org>
    Reviewed-by: Ashok Raj <ashok.raj@intel.com>
    Reviewed-by: Marc Zyngier <maz@kernel.org>
    Acked-by: Bjorn Helgaas <bhelgaas@google.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210729222542.344136412@linutronix.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index 23a363fd4c59..949dc342c16a 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -743,18 +743,25 @@ static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries,
 	u16 control;
 	void __iomem *base;
 
-	/* Ensure MSI-X is disabled while it is set up */
-	pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
+	/*
+	 * Some devices require MSI-X to be enabled before the MSI-X
+	 * registers can be accessed.  Mask all the vectors to prevent
+	 * interrupts coming in before they're fully set up.
+	 */
+	pci_msix_clear_and_set_ctrl(dev, 0, PCI_MSIX_FLAGS_MASKALL |
+				    PCI_MSIX_FLAGS_ENABLE);
 
 	pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &control);
 	/* Request & Map MSI-X table region */
 	base = msix_map_region(dev, msix_table_size(control));
-	if (!base)
-		return -ENOMEM;
+	if (!base) {
+		ret = -ENOMEM;
+		goto out_disable;
+	}
 
 	ret = msix_setup_entries(dev, base, entries, nvec, affd);
 	if (ret)
-		return ret;
+		goto out_disable;
 
 	ret = pci_msi_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSIX);
 	if (ret)
@@ -765,14 +772,6 @@ static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries,
 	if (ret)
 		goto out_free;
 
-	/*
-	 * Some devices require MSI-X to be enabled before we can touch the
-	 * MSI-X registers.  We need to mask all the vectors to prevent
-	 * interrupts coming in before they're fully set up.
-	 */
-	pci_msix_clear_and_set_ctrl(dev, 0,
-				PCI_MSIX_FLAGS_MASKALL | PCI_MSIX_FLAGS_ENABLE);
-
 	msix_program_entries(dev, entries);
 
 	ret = populate_msi_sysfs(dev);
@@ -807,6 +806,9 @@ static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries,
 out_free:
 	free_msi_irqs(dev);
 
+out_disable:
+	pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
+
 	return ret;
 }
 

commit 504a4c1057151a1f1332fb3ce940134db8d6b885
Author: Bixuan Cui <cuibixuan@huawei.com>
Date:   Tue May 18 11:31:17 2021 +0800

    genirq/msi: Ensure deactivation on teardown
    
    commit dbbc93576e03fbe24b365fab0e901eb442237a8a upstream.
    
    msi_domain_alloc_irqs() invokes irq_domain_activate_irq(), but
    msi_domain_free_irqs() does not enforce deactivation before tearing down
    the interrupts.
    
    This happens when PCI/MSI interrupts are set up and never used before being
    torn down again, e.g. in error handling pathes. The only place which cleans
    that up is the error handling path in msi_domain_alloc_irqs().
    
    Move the cleanup from msi_domain_alloc_irqs() into msi_domain_free_irqs()
    to cure that.
    
    Fixes: f3b0946d629c ("genirq/msi: Make sure PCI MSIs are activated early")
    Signed-off-by: Bixuan Cui <cuibixuan@huawei.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210518033117.78104-1-cuibixuan@huawei.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c
index 604974f2afb1..88269dd5a8ca 100644
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -477,11 +477,6 @@ int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
 	return 0;
 
 cleanup:
-	for_each_msi_vector(desc, i, dev) {
-		irq_data = irq_domain_get_irq_data(domain, i);
-		if (irqd_is_activated(irq_data))
-			irq_domain_deactivate_irq(irq_data);
-	}
 	msi_domain_free_irqs(domain, dev);
 	return ret;
 }
@@ -494,7 +489,15 @@ int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
  */
 void msi_domain_free_irqs(struct irq_domain *domain, struct device *dev)
 {
+	struct irq_data *irq_data;
 	struct msi_desc *desc;
+	int i;
+
+	for_each_msi_vector(desc, i, dev) {
+		irq_data = irq_domain_get_irq_data(domain, i);
+		if (irqd_is_activated(irq_data))
+			irq_domain_deactivate_irq(irq_data);
+	}
 
 	for_each_msi_entry(desc, dev) {
 		/*

commit cc656023d1691167b347804f06fc09e168aa9b99
Author: Babu Moger <Babu.Moger@amd.com>
Date:   Mon Aug 2 14:38:58 2021 -0500

    x86/resctrl: Fix default monitoring groups reporting
    
    commit 064855a69003c24bd6b473b367d364e418c57625 upstream.
    
    Creating a new sub monitoring group in the root /sys/fs/resctrl leads to
    getting the "Unavailable" value for mbm_total_bytes and mbm_local_bytes
    on the entire filesystem.
    
    Steps to reproduce:
    
      1. mount -t resctrl resctrl /sys/fs/resctrl/
    
      2. cd /sys/fs/resctrl/
    
      3. cat mon_data/mon_L3_00/mbm_total_bytes
         23189832
    
      4. Create sub monitor group:
      mkdir mon_groups/test1
    
      5. cat mon_data/mon_L3_00/mbm_total_bytes
         Unavailable
    
    When a new monitoring group is created, a new RMID is assigned to the
    new group. But the RMID is not active yet. When the events are read on
    the new RMID, it is expected to report the status as "Unavailable".
    
    When the user reads the events on the default monitoring group with
    multiple subgroups, the events on all subgroups are consolidated
    together. Currently, if any of the RMID reads report as "Unavailable",
    then everything will be reported as "Unavailable".
    
    Fix the issue by discarding the "Unavailable" reads and reporting all
    the successful RMID reads. This is not a problem on Intel systems as
    Intel reports 0 on Inactive RMIDs.
    
    Fixes: d89b7379015f ("x86/intel_rdt/cqm: Add mon_data")
    Reported-by: Pawe? Szulik <pawel.szulik@intel.com>
    Signed-off-by: Babu Moger <Babu.Moger@amd.com>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Acked-by: Reinette Chatre <reinette.chatre@intel.com>
    Cc: stable@vger.kernel.org
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=213311
    Link: https://lkml.kernel.org/r/162793309296.9224.15871659871696482080.stgit@bmoger-ubuntu
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kernel/cpu/intel_rdt_monitor.c b/arch/x86/kernel/cpu/intel_rdt_monitor.c
index 5dfa5ab9a5ae..6eeb17dfde48 100644
--- a/arch/x86/kernel/cpu/intel_rdt_monitor.c
+++ b/arch/x86/kernel/cpu/intel_rdt_monitor.c
@@ -233,15 +233,14 @@ static u64 mbm_overflow_count(u64 prev_msr, u64 cur_msr)
 	return chunks >>= shift;
 }
 
-static int __mon_event_count(u32 rmid, struct rmid_read *rr)
+static u64 __mon_event_count(u32 rmid, struct rmid_read *rr)
 {
 	struct mbm_state *m;
 	u64 chunks, tval;
 
 	tval = __rmid_read(rmid, rr->evtid);
 	if (tval & (RMID_VAL_ERROR | RMID_VAL_UNAVAIL)) {
-		rr->val = tval;
-		return -EINVAL;
+		return tval;
 	}
 	switch (rr->evtid) {
 	case QOS_L3_OCCUP_EVENT_ID:
@@ -253,12 +252,6 @@ static int __mon_event_count(u32 rmid, struct rmid_read *rr)
 	case QOS_L3_MBM_LOCAL_EVENT_ID:
 		m = &rr->d->mbm_local[rmid];
 		break;
-	default:
-		/*
-		 * Code would never reach here because
-		 * an invalid event id would fail the __rmid_read.
-		 */
-		return -EINVAL;
 	}
 
 	if (rr->first) {
@@ -308,23 +301,29 @@ void mon_event_count(void *info)
 	struct rdtgroup *rdtgrp, *entry;
 	struct rmid_read *rr = info;
 	struct list_head *head;
+	u64 ret_val;
 
 	rdtgrp = rr->rgrp;
 
-	if (__mon_event_count(rdtgrp->mon.rmid, rr))
-		return;
+	ret_val = __mon_event_count(rdtgrp->mon.rmid, rr);
 
 	/*
-	 * For Ctrl groups read data from child monitor groups.
+	 * For Ctrl groups read data from child monitor groups and
+	 * add them together. Count events which are read successfully.
+	 * Discard the rmid_read's reporting errors.
 	 */
 	head = &rdtgrp->mon.crdtgrp_list;
 
 	if (rdtgrp->type == RDTCTRL_GROUP) {
 		list_for_each_entry(entry, head, mon.crdtgrp_list) {
-			if (__mon_event_count(entry->mon.rmid, rr))
-				return;
+			if (__mon_event_count(entry->mon.rmid, rr) == 0)
+				ret_val = 0;
 		}
 	}
+
+	/* Report error if none of rmid_reads are successful */
+	if (ret_val)
+		rr->val = ret_val;
 }
 
 /*

commit 697658a61db4f3aa213d76336ccf30e66e6c44ca
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Thu Jul 29 23:51:49 2021 +0200

    x86/ioapic: Force affinity setup before startup
    
    commit 0c0e37dc11671384e53ba6ede53a4d91162a2cc5 upstream.
    
    The IO/APIC cannot handle interrupt affinity changes safely after startup
    other than from an interrupt handler. The startup sequence in the generic
    interrupt code violates that assumption.
    
    Mark the irq chip with the new IRQCHIP_AFFINITY_PRE_STARTUP flag so that
    the default interrupt setting happens before the interrupt is started up
    for the first time.
    
    Fixes: 18404756765c ("genirq: Expose default irq affinity mask (take 3)")
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Marc Zyngier <maz@kernel.org>
    Reviewed-by: Marc Zyngier <maz@kernel.org>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210729222542.832143400@linutronix.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index a89dac380243..677508baf95a 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -1958,7 +1958,8 @@ static struct irq_chip ioapic_chip __read_mostly = {
 	.irq_set_affinity	= ioapic_set_affinity,
 	.irq_retrigger		= irq_chip_retrigger_hierarchy,
 	.irq_get_irqchip_state	= ioapic_irq_get_chip_state,
-	.flags			= IRQCHIP_SKIP_SET_WAKE,
+	.flags			= IRQCHIP_SKIP_SET_WAKE |
+				  IRQCHIP_AFFINITY_PRE_STARTUP,
 };
 
 static struct irq_chip ioapic_ir_chip __read_mostly = {
@@ -1971,7 +1972,8 @@ static struct irq_chip ioapic_ir_chip __read_mostly = {
 	.irq_set_affinity	= ioapic_set_affinity,
 	.irq_retrigger		= irq_chip_retrigger_hierarchy,
 	.irq_get_irqchip_state	= ioapic_irq_get_chip_state,
-	.flags			= IRQCHIP_SKIP_SET_WAKE,
+	.flags			= IRQCHIP_SKIP_SET_WAKE |
+				  IRQCHIP_AFFINITY_PRE_STARTUP,
 };
 
 static inline void init_IO_APIC_traps(void)

commit 354b210062b1e50ef284f97590011c2231316eaa
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Thu Jul 29 23:51:50 2021 +0200

    x86/msi: Force affinity setup before startup
    
    commit ff363f480e5997051dd1de949121ffda3b753741 upstream.
    
    The X86 MSI mechanism cannot handle interrupt affinity changes safely after
    startup other than from an interrupt handler, unless interrupt remapping is
    enabled. The startup sequence in the generic interrupt code violates that
    assumption.
    
    Mark the irq chips with the new IRQCHIP_AFFINITY_PRE_STARTUP flag so that
    the default interrupt setting happens before the interrupt is started up
    for the first time.
    
    While the interrupt remapping MSI chip does not require this, there is no
    point in treating it differently as this might spare an interrupt to a CPU
    which is not in the default affinity mask.
    
    For the non-remapping case go to the direct write path when the interrupt
    is not yet started similar to the not yet activated case.
    
    Fixes: 18404756765c ("genirq: Expose default irq affinity mask (take 3)")
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Marc Zyngier <maz@kernel.org>
    Reviewed-by: Marc Zyngier <maz@kernel.org>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210729222542.886722080@linutronix.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kernel/apic/msi.c b/arch/x86/kernel/apic/msi.c
index fb26c956c442..ca17a3848834 100644
--- a/arch/x86/kernel/apic/msi.c
+++ b/arch/x86/kernel/apic/msi.c
@@ -89,11 +89,13 @@ msi_set_affinity(struct irq_data *irqd, const struct cpumask *mask, bool force)
 	 *   The quirk bit is not set in this case.
 	 * - The new vector is the same as the old vector
 	 * - The old vector is MANAGED_IRQ_SHUTDOWN_VECTOR (interrupt starts up)
+	 * - The interrupt is not yet started up
 	 * - The new destination CPU is the same as the old destination CPU
 	 */
 	if (!irqd_msi_nomask_quirk(irqd) ||
 	    cfg->vector == old_cfg.vector ||
 	    old_cfg.vector == MANAGED_IRQ_SHUTDOWN_VECTOR ||
+	    !irqd_is_started(irqd) ||
 	    cfg->dest_apicid == old_cfg.dest_apicid) {
 		irq_msi_update_msg(irqd, cfg);
 		return ret;
@@ -181,7 +183,8 @@ static struct irq_chip pci_msi_controller = {
 	.irq_retrigger		= irq_chip_retrigger_hierarchy,
 	.irq_compose_msi_msg	= irq_msi_compose_msg,
 	.irq_set_affinity	= msi_set_affinity,
-	.flags			= IRQCHIP_SKIP_SET_WAKE,
+	.flags			= IRQCHIP_SKIP_SET_WAKE |
+				  IRQCHIP_AFFINITY_PRE_STARTUP,
 };
 
 int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
@@ -282,7 +285,8 @@ static struct irq_chip pci_msi_ir_controller = {
 	.irq_ack		= irq_chip_ack_parent,
 	.irq_retrigger		= irq_chip_retrigger_hierarchy,
 	.irq_set_vcpu_affinity	= irq_chip_set_vcpu_affinity_parent,
-	.flags			= IRQCHIP_SKIP_SET_WAKE,
+	.flags			= IRQCHIP_SKIP_SET_WAKE |
+				  IRQCHIP_AFFINITY_PRE_STARTUP,
 };
 
 static struct msi_domain_info pci_msi_ir_domain_info = {
@@ -325,7 +329,8 @@ static struct irq_chip dmar_msi_controller = {
 	.irq_retrigger		= irq_chip_retrigger_hierarchy,
 	.irq_compose_msi_msg	= irq_msi_compose_msg,
 	.irq_write_msi_msg	= dmar_msi_write_msg,
-	.flags			= IRQCHIP_SKIP_SET_WAKE,
+	.flags			= IRQCHIP_SKIP_SET_WAKE |
+				  IRQCHIP_AFFINITY_PRE_STARTUP,
 };
 
 static irq_hw_number_t dmar_msi_get_hwirq(struct msi_domain_info *info,
@@ -423,7 +428,7 @@ static struct irq_chip hpet_msi_controller __ro_after_init = {
 	.irq_retrigger = irq_chip_retrigger_hierarchy,
 	.irq_compose_msi_msg = irq_msi_compose_msg,
 	.irq_write_msi_msg = hpet_msi_write_msg,
-	.flags = IRQCHIP_SKIP_SET_WAKE,
+	.flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_AFFINITY_PRE_STARTUP,
 };
 
 static irq_hw_number_t hpet_msi_get_hwirq(struct msi_domain_info *info,

commit cab824f67d7e8f68288d615929dec02607e473ad
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Thu Jul 29 23:51:48 2021 +0200

    genirq: Provide IRQCHIP_AFFINITY_PRE_STARTUP
    
    commit 826da771291fc25a428e871f9e7fb465e390f852 upstream.
    
    X86 IO/APIC and MSI interrupts (when used without interrupts remapping)
    require that the affinity setup on startup is done before the interrupt is
    enabled for the first time as the non-remapped operation mode cannot safely
    migrate enabled interrupts from arbitrary contexts. Provide a new irq chip
    flag which allows affected hardware to request this.
    
    This has to be opt-in because there have been reports in the past that some
    interrupt chips cannot handle affinity setting before startup.
    
    Fixes: 18404756765c ("genirq: Expose default irq affinity mask (take 3)")
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Marc Zyngier <maz@kernel.org>
    Reviewed-by: Marc Zyngier <maz@kernel.org>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210729222542.779791738@linutronix.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/irq.h b/include/linux/irq.h
index a042faefb9b7..9504267414a4 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -535,6 +535,7 @@ struct irq_chip {
  * IRQCHIP_ONESHOT_SAFE:	One shot does not require mask/unmask
  * IRQCHIP_EOI_THREADED:	Chip requires eoi() on unmask in threaded mode
  * IRQCHIP_SUPPORTS_LEVEL_MSI	Chip can provide two doorbells for Level MSIs
+ * IRQCHIP_AFFINITY_PRE_STARTUP:      Default affinity update before startup
  */
 enum {
 	IRQCHIP_SET_TYPE_MASKED		= (1 <<  0),
@@ -545,6 +546,7 @@ enum {
 	IRQCHIP_ONESHOT_SAFE		= (1 <<  5),
 	IRQCHIP_EOI_THREADED		= (1 <<  6),
 	IRQCHIP_SUPPORTS_LEVEL_MSI	= (1 <<  7),
+	IRQCHIP_AFFINITY_PRE_STARTUP	= (1 << 10),
 };
 
 #include <linux/irqdesc.h>
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index 09d914e486a2..9afbd89b6096 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -265,8 +265,11 @@ int irq_startup(struct irq_desc *desc, bool resend, bool force)
 	} else {
 		switch (__irq_startup_managed(desc, aff, force)) {
 		case IRQ_STARTUP_NORMAL:
+			if (d->chip->flags & IRQCHIP_AFFINITY_PRE_STARTUP)
+				irq_setup_affinity(desc);
 			ret = __irq_startup(desc);
-			irq_setup_affinity(desc);
+			if (!(d->chip->flags & IRQCHIP_AFFINITY_PRE_STARTUP))
+				irq_setup_affinity(desc);
 			break;
 		case IRQ_STARTUP_MANAGED:
 			irq_do_set_affinity(d, aff, false);

commit 0b926fdfca71898027ee05aeaea9b9209fdc1f9f
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Fri Jul 30 17:01:46 2021 -0700

    x86/tools: Fix objdump version check again
    
    [ Upstream commit 839ad22f755132838f406751439363c07272ad87 ]
    
    Skip (omit) any version string info that is parenthesized.
    
    Warning: objdump version 15) is older than 2.19
    Warning: Skipping posttest.
    
    where 'objdump -v' says:
    GNU objdump (GNU Binutils; SUSE Linux Enterprise 15) 2.35.1.20201123-7.18
    
    Fixes: 8bee738bb1979 ("x86: Fix objdump version check in chkobjdump.awk for different formats.")
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Masami Hiramatsu <mhiramat@kernel.org>
    Link: https://lore.kernel.org/r/20210731000146.2720-1-rdunlap@infradead.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/x86/tools/chkobjdump.awk b/arch/x86/tools/chkobjdump.awk
index fd1ab80be0de..a4cf678cf5c8 100644
--- a/arch/x86/tools/chkobjdump.awk
+++ b/arch/x86/tools/chkobjdump.awk
@@ -10,6 +10,7 @@ BEGIN {
 
 /^GNU objdump/ {
 	verstr = ""
+	gsub(/\(.*\)/, "");
 	for (i = 3; i <= NF; i++)
 		if (match($(i), "^[0-9]")) {
 			verstr = $(i);

commit 04283ebd7622d72ce860d70e2e0ebb5fab0b55de
Author: Pu Lehui <pulehui@huawei.com>
Date:   Mon Aug 9 10:36:58 2021 +0800

    powerpc/kprobes: Fix kprobe Oops happens in booke
    
    [ Upstream commit 43e8f76006592cb1573a959aa287c45421066f9c ]
    
    When using kprobe on powerpc booke series processor, Oops happens
    as show bellow:
    
    / # echo "p:myprobe do_nanosleep" > /sys/kernel/debug/tracing/kprobe_events
    / # echo 1 > /sys/kernel/debug/tracing/events/kprobes/myprobe/enable
    / # sleep 1
    [   50.076730] Oops: Exception in kernel mode, sig: 5 [#1]
    [   50.077017] BE PAGE_SIZE=4K SMP NR_CPUS=24 QEMU e500
    [   50.077221] Modules linked in:
    [   50.077462] CPU: 0 PID: 77 Comm: sleep Not tainted 5.14.0-rc4-00022-g251a1524293d #21
    [   50.077887] NIP:  c0b9c4e0 LR: c00ebecc CTR: 00000000
    [   50.078067] REGS: c3883de0 TRAP: 0700   Not tainted (5.14.0-rc4-00022-g251a1524293d)
    [   50.078349] MSR:  00029000 <CE,EE,ME>  CR: 24000228  XER: 20000000
    [   50.078675]
    [   50.078675] GPR00: c00ebdf0 c3883e90 c313e300 c3883ea0 00000001 00000000 c3883ecc 00000001
    [   50.078675] GPR08: c100598c c00ea250 00000004 00000000 24000222 102490c2 bff4180c 101e60d4
    [   50.078675] GPR16: 00000000 102454ac 00000040 10240000 10241100 102410f8 10240000 00500000
    [   50.078675] GPR24: 00000002 00000000 c3883ea0 00000001 00000000 0000c350 3b9b8d50 00000000
    [   50.080151] NIP [c0b9c4e0] do_nanosleep+0x0/0x190
    [   50.080352] LR [c00ebecc] hrtimer_nanosleep+0x14c/0x1e0
    [   50.080638] Call Trace:
    [   50.080801] [c3883e90] [c00ebdf0] hrtimer_nanosleep+0x70/0x1e0 (unreliable)
    [   50.081110] [c3883f00] [c00ec004] sys_nanosleep_time32+0xa4/0x110
    [   50.081336] [c3883f40] [c001509c] ret_from_syscall+0x0/0x28
    [   50.081541] --- interrupt: c00 at 0x100a4d08
    [   50.081749] NIP:  100a4d08 LR: 101b5234 CTR: 00000003
    [   50.081931] REGS: c3883f50 TRAP: 0c00   Not tainted (5.14.0-rc4-00022-g251a1524293d)
    [   50.082183] MSR:  0002f902 <CE,EE,PR,FP,ME>  CR: 24000222  XER: 00000000
    [   50.082457]
    [   50.082457] GPR00: 000000a2 bf980040 1024b4d0 bf980084 bf980084 64000000 00555345 fefefeff
    [   50.082457] GPR08: 7f7f7f7f 101e0000 00000069 00000003 28000422 102490c2 bff4180c 101e60d4
    [   50.082457] GPR16: 00000000 102454ac 00000040 10240000 10241100 102410f8 10240000 00500000
    [   50.082457] GPR24: 00000002 bf9803f4 10240000 00000000 00000000 100039e0 00000000 102444e8
    [   50.083789] NIP [100a4d08] 0x100a4d08
    [   50.083917] LR [101b5234] 0x101b5234
    [   50.084042] --- interrupt: c00
    [   50.084238] Instruction dump:
    [   50.084483] 4bfffc40 60000000 60000000 60000000 9421fff0 39400402 914200c0 38210010
    [   50.084841] 4bfffc20 00000000 00000000 00000000 <7fe00008> 7c0802a6 7c892378 93c10048
    [   50.085487] ---[ end trace f6fffe98e2fa8f3e ]---
    [   50.085678]
    Trace/breakpoint trap
    
    There is no real mode for booke arch and the MMU translation is
    always on. The corresponding MSR_IS/MSR_DS bit in booke is used
    to switch the address space, but not for real mode judgment.
    
    Fixes: 21f8b2fa3ca5 ("powerpc/kprobes: Ignore traps that happened in real mode")
    Signed-off-by: Pu Lehui <pulehui@huawei.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210809023658.218915-1-pulehui@huawei.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/powerpc/kernel/kprobes.c b/arch/powerpc/kernel/kprobes.c
index 53a39661eb13..ccf16bccc2bc 100644
--- a/arch/powerpc/kernel/kprobes.c
+++ b/arch/powerpc/kernel/kprobes.c
@@ -277,7 +277,8 @@ int kprobe_handler(struct pt_regs *regs)
 	if (user_mode(regs))
 		return 0;
 
-	if (!(regs->msr & MSR_IR) || !(regs->msr & MSR_DR))
+	if (!IS_ENABLED(CONFIG_BOOKE) &&
+	    (!(regs->msr & MSR_IR) || !(regs->msr & MSR_DR)))
 		return 0;
 
 	/*

commit a6013d42d256da2caeaa8fc0f050ac125d63e8d4
Author: Longpeng(Mike) <longpeng2@huawei.com>
Date:   Thu Aug 12 13:30:56 2021 +0800

    vsock/virtio: avoid potential deadlock when vsock device remove
    
    [ Upstream commit 49b0b6ffe20c5344f4173f3436298782a08da4f2 ]
    
    There's a potential deadlock case when remove the vsock device or
    process the RESET event:
    
      vsock_for_each_connected_socket:
          spin_lock_bh(&vsock_table_lock) ----------- (1)
          ...
              virtio_vsock_reset_sock:
                  lock_sock(sk) --------------------- (2)
          ...
          spin_unlock_bh(&vsock_table_lock)
    
    lock_sock() may do initiative schedule when the 'sk' is owned by
    other thread at the same time, we would receivce a warning message
    that "scheduling while atomic".
    
    Even worse, if the next task (selected by the scheduler) try to
    release a 'sk', it need to request vsock_table_lock and the deadlock
    occur, cause the system into softlockup state.
      Call trace:
       queued_spin_lock_slowpath
       vsock_remove_bound
       vsock_remove_sock
       virtio_transport_release
       __vsock_release
       vsock_release
       __sock_release
       sock_close
       __fput
       ____fput
    
    So we should not require sk_lock in this case, just like the behavior
    in vhost_vsock or vmci.
    
    Fixes: 0ea9e1d3a9e3 ("VSOCK: Introduce virtio_transport.ko")
    Cc: Stefan Hajnoczi <stefanha@redhat.com>
    Signed-off-by: Longpeng(Mike) <longpeng2@huawei.com>
    Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
    Link: https://lore.kernel.org/r/20210812053056.1699-1-longpeng2@huawei.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c
index cc70d651d13e..e34979fcefd2 100644
--- a/net/vmw_vsock/virtio_transport.c
+++ b/net/vmw_vsock/virtio_transport.c
@@ -373,11 +373,14 @@ static void virtio_vsock_event_fill(struct virtio_vsock *vsock)
 
 static void virtio_vsock_reset_sock(struct sock *sk)
 {
-	lock_sock(sk);
+	/* vmci_transport.c doesn't take sk_lock here either.  At least we're
+	 * under vsock_table_lock so the sock cannot disappear while we're
+	 * executing.
+	 */
+
 	sk->sk_state = TCP_CLOSE;
 	sk->sk_err = ECONNRESET;
 	sk->sk_error_report(sk);
-	release_sock(sk);
 }
 
 static void virtio_vsock_update_guest_cid(struct virtio_vsock *vsock)

commit 387635925cd0c4549d94815b9873a8b2a0c7e348
Author: Maximilian Heyne <mheyne@amazon.de>
Date:   Thu Aug 12 13:09:27 2021 +0000

    xen/events: Fix race in set_evtchn_to_irq
    
    [ Upstream commit 88ca2521bd5b4e8b83743c01a2d4cb09325b51e9 ]
    
    There is a TOCTOU issue in set_evtchn_to_irq. Rows in the evtchn_to_irq
    mapping are lazily allocated in this function. The check whether the row
    is already present and the row initialization is not synchronized. Two
    threads can at the same time allocate a new row for evtchn_to_irq and
    add the irq mapping to the their newly allocated row. One thread will
    overwrite what the other has set for evtchn_to_irq[row] and therefore
    the irq mapping is lost. This will trigger a BUG_ON later in
    bind_evtchn_to_cpu:
    
      INFO: pci 0000:1a:15.4: [1d0f:8061] type 00 class 0x010802
      INFO: nvme 0000:1a:12.1: enabling device (0000 -> 0002)
      INFO: nvme nvme77: 1/0/0 default/read/poll queues
      CRIT: kernel BUG at drivers/xen/events/events_base.c:427!
      WARN: invalid opcode: 0000 [#1] SMP NOPTI
      WARN: Workqueue: nvme-reset-wq nvme_reset_work [nvme]
      WARN: RIP: e030:bind_evtchn_to_cpu+0xc2/0xd0
      WARN: Call Trace:
      WARN:  set_affinity_irq+0x121/0x150
      WARN:  irq_do_set_affinity+0x37/0xe0
      WARN:  irq_setup_affinity+0xf6/0x170
      WARN:  irq_startup+0x64/0xe0
      WARN:  __setup_irq+0x69e/0x740
      WARN:  ? request_threaded_irq+0xad/0x160
      WARN:  request_threaded_irq+0xf5/0x160
      WARN:  ? nvme_timeout+0x2f0/0x2f0 [nvme]
      WARN:  pci_request_irq+0xa9/0xf0
      WARN:  ? pci_alloc_irq_vectors_affinity+0xbb/0x130
      WARN:  queue_request_irq+0x4c/0x70 [nvme]
      WARN:  nvme_reset_work+0x82d/0x1550 [nvme]
      WARN:  ? check_preempt_wakeup+0x14f/0x230
      WARN:  ? check_preempt_curr+0x29/0x80
      WARN:  ? nvme_irq_check+0x30/0x30 [nvme]
      WARN:  process_one_work+0x18e/0x3c0
      WARN:  worker_thread+0x30/0x3a0
      WARN:  ? process_one_work+0x3c0/0x3c0
      WARN:  kthread+0x113/0x130
      WARN:  ? kthread_park+0x90/0x90
      WARN:  ret_from_fork+0x3a/0x50
    
    This patch sets evtchn_to_irq rows via a cmpxchg operation so that they
    will be set only once. The row is now cleared before writing it to
    evtchn_to_irq in order to not create a race once the row is visible for
    other threads.
    
    While at it, do not require the page to be zeroed, because it will be
    overwritten with -1's in clear_evtchn_to_irq_row anyway.
    
    Signed-off-by: Maximilian Heyne <mheyne@amazon.de>
    Fixes: d0b075ffeede ("xen/events: Refactor evtchn_to_irq array to be dynamically allocated")
    Link: https://lore.kernel.org/r/20210812130930.127134-1-mheyne@amazon.de
    Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c
index a2f8130e18fe..d138027034fd 100644
--- a/drivers/xen/events/events_base.c
+++ b/drivers/xen/events/events_base.c
@@ -133,12 +133,12 @@ static void disable_dynirq(struct irq_data *data);
 
 static DEFINE_PER_CPU(unsigned int, irq_epoch);
 
-static void clear_evtchn_to_irq_row(unsigned row)
+static void clear_evtchn_to_irq_row(int *evtchn_row)
 {
 	unsigned col;
 
 	for (col = 0; col < EVTCHN_PER_ROW; col++)
-		WRITE_ONCE(evtchn_to_irq[row][col], -1);
+		WRITE_ONCE(evtchn_row[col], -1);
 }
 
 static void clear_evtchn_to_irq_all(void)
@@ -148,7 +148,7 @@ static void clear_evtchn_to_irq_all(void)
 	for (row = 0; row < EVTCHN_ROW(xen_evtchn_max_channels()); row++) {
 		if (evtchn_to_irq[row] == NULL)
 			continue;
-		clear_evtchn_to_irq_row(row);
+		clear_evtchn_to_irq_row(evtchn_to_irq[row]);
 	}
 }
 
@@ -156,6 +156,7 @@ static int set_evtchn_to_irq(unsigned evtchn, unsigned irq)
 {
 	unsigned row;
 	unsigned col;
+	int *evtchn_row;
 
 	if (evtchn >= xen_evtchn_max_channels())
 		return -EINVAL;
@@ -168,11 +169,18 @@ static int set_evtchn_to_irq(unsigned evtchn, unsigned irq)
 		if (irq == -1)
 			return 0;
 
-		evtchn_to_irq[row] = (int *)get_zeroed_page(GFP_KERNEL);
-		if (evtchn_to_irq[row] == NULL)
+		evtchn_row = (int *) __get_free_pages(GFP_KERNEL, 0);
+		if (evtchn_row == NULL)
 			return -ENOMEM;
 
-		clear_evtchn_to_irq_row(row);
+		clear_evtchn_to_irq_row(evtchn_row);
+
+		/*
+		 * We've prepared an empty row for the mapping. If a different
+		 * thread was faster inserting it, we can drop ours.
+		 */
+		if (cmpxchg(&evtchn_to_irq[row], NULL, evtchn_row) != NULL)
+			free_page((unsigned long) evtchn_row);
 	}
 
 	WRITE_ONCE(evtchn_to_irq[row][col], irq);

commit ec75ebd1645e3ca57c0d6bf8482c0ad775491703
Author: Eric Dumazet <edumazet@google.com>
Date:   Wed Aug 11 12:57:15 2021 -0700

    net: igmp: increase size of mr_ifc_count
    
    [ Upstream commit b69dd5b3780a7298bd893816a09da751bc0636f7 ]
    
    Some arches support cmpxchg() on 4-byte and 8-byte only.
    Increase mr_ifc_count width to 32bit to fix this problem.
    
    Fixes: 4a2b285e7e10 ("net: igmp: fix data-race in igmp_ifc_timer_expire()")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: Guenter Roeck <linux@roeck-us.net>
    Link: https://lore.kernel.org/r/20210811195715.3684218-1-eric.dumazet@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/inetdevice.h b/include/linux/inetdevice.h
index a64f21a97369..131f93f8d587 100644
--- a/include/linux/inetdevice.h
+++ b/include/linux/inetdevice.h
@@ -41,7 +41,7 @@ struct in_device {
 	unsigned long		mr_qri;		/* Query Response Interval */
 	unsigned char		mr_qrv;		/* Query Robustness Variable */
 	unsigned char		mr_gq_running;
-	unsigned char		mr_ifc_count;
+	u32			mr_ifc_count;
 	struct timer_list	mr_gq_timer;	/* general query timer */
 	struct timer_list	mr_ifc_timer;	/* interface change timer */
 
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c
index 95ec3923083f..dca7fe0ae24a 100644
--- a/net/ipv4/igmp.c
+++ b/net/ipv4/igmp.c
@@ -807,7 +807,7 @@ static void igmp_gq_timer_expire(struct timer_list *t)
 static void igmp_ifc_timer_expire(struct timer_list *t)
 {
 	struct in_device *in_dev = from_timer(in_dev, t, mr_ifc_timer);
-	u8 mr_ifc_count;
+	u32 mr_ifc_count;
 
 	igmpv3_send_cr(in_dev);
 restart:

commit 32b6627fec712fb75fbed272517c74814c00ccfc
Author: Neal Cardwell <ncardwell@google.com>
Date:   Tue Aug 10 22:40:56 2021 -0400

    tcp_bbr: fix u32 wrap bug in round logic if bbr_init() called after 2B packets
    
    [ Upstream commit 6de035fec045f8ae5ee5f3a02373a18b939e91fb ]
    
    Currently if BBR congestion control is initialized after more than 2B
    packets have been delivered, depending on the phase of the
    tp->delivered counter the tracking of BBR round trips can get stuck.
    
    The bug arises because if tp->delivered is between 2^31 and 2^32 at
    the time the BBR congestion control module is initialized, then the
    initialization of bbr->next_rtt_delivered to 0 will cause the logic to
    believe that the end of the round trip is still billions of packets in
    the future. More specifically, the following check will fail
    repeatedly:
    
      !before(rs->prior_delivered, bbr->next_rtt_delivered)
    
    and thus the connection will take up to 2B packets delivered before
    that check will pass and the connection will set:
    
      bbr->round_start = 1;
    
    This could cause many mechanisms in BBR to fail to trigger, for
    example bbr_check_full_bw_reached() would likely never exit STARTUP.
    
    This bug is 5 years old and has not been observed, and as a practical
    matter this would likely rarely trigger, since it would require
    transferring at least 2B packets, or likely more than 3 terabytes of
    data, before switching congestion control algorithms to BBR.
    
    This patch is a stable candidate for kernels as far back as v4.9,
    when tcp_bbr.c was added.
    
    Fixes: 0f8782ea1497 ("tcp_bbr: add BBR congestion control")
    Signed-off-by: Neal Cardwell <ncardwell@google.com>
    Reviewed-by: Yuchung Cheng <ycheng@google.com>
    Reviewed-by: Kevin Yang <yyd@google.com>
    Reviewed-by: Eric Dumazet <edumazet@google.com>
    Link: https://lore.kernel.org/r/20210811024056.235161-1-ncardwell@google.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
index b70c9365e131..1740de053072 100644
--- a/net/ipv4/tcp_bbr.c
+++ b/net/ipv4/tcp_bbr.c
@@ -985,7 +985,7 @@ static void bbr_init(struct sock *sk)
 	bbr->prior_cwnd = 0;
 	tp->snd_ssthresh = TCP_INFINITE_SSTHRESH;
 	bbr->rtt_cnt = 0;
-	bbr->next_rtt_delivered = 0;
+	bbr->next_rtt_delivered = tp->delivered;
 	bbr->prev_ca_state = TCP_CA_Open;
 	bbr->packet_conservation = 0;
 

commit f41237f60cb0202827432706c33faba3adadbfb5
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Mon Aug 9 21:20:23 2021 +0800

    net: bridge: fix memleak in br_add_if()
    
    [ Upstream commit 519133debcc19f5c834e7e28480b60bdc234fe02 ]
    
    I got a memleak report:
    
    BUG: memory leak
    unreferenced object 0x607ee521a658 (size 240):
    comm "syz-executor.0", pid 955, jiffies 4294780569 (age 16.449s)
    hex dump (first 32 bytes, cpu 1):
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
    backtrace:
    [<00000000d830ea5a>] br_multicast_add_port+0x1c2/0x300 net/bridge/br_multicast.c:1693
    [<00000000274d9a71>] new_nbp net/bridge/br_if.c:435 [inline]
    [<00000000274d9a71>] br_add_if+0x670/0x1740 net/bridge/br_if.c:611
    [<0000000012ce888e>] do_set_master net/core/rtnetlink.c:2513 [inline]
    [<0000000012ce888e>] do_set_master+0x1aa/0x210 net/core/rtnetlink.c:2487
    [<0000000099d1cafc>] __rtnl_newlink+0x1095/0x13e0 net/core/rtnetlink.c:3457
    [<00000000a01facc0>] rtnl_newlink+0x64/0xa0 net/core/rtnetlink.c:3488
    [<00000000acc9186c>] rtnetlink_rcv_msg+0x369/0xa10 net/core/rtnetlink.c:5550
    [<00000000d4aabb9c>] netlink_rcv_skb+0x134/0x3d0 net/netlink/af_netlink.c:2504
    [<00000000bc2e12a3>] netlink_unicast_kernel net/netlink/af_netlink.c:1314 [inline]
    [<00000000bc2e12a3>] netlink_unicast+0x4a0/0x6a0 net/netlink/af_netlink.c:1340
    [<00000000e4dc2d0e>] netlink_sendmsg+0x789/0xc70 net/netlink/af_netlink.c:1929
    [<000000000d22c8b3>] sock_sendmsg_nosec net/socket.c:654 [inline]
    [<000000000d22c8b3>] sock_sendmsg+0x139/0x170 net/socket.c:674
    [<00000000e281417a>] ____sys_sendmsg+0x658/0x7d0 net/socket.c:2350
    [<00000000237aa2ab>] ___sys_sendmsg+0xf8/0x170 net/socket.c:2404
    [<000000004f2dc381>] __sys_sendmsg+0xd3/0x190 net/socket.c:2433
    [<0000000005feca6c>] do_syscall_64+0x37/0x90 arch/x86/entry/common.c:47
    [<000000007304477d>] entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    On error path of br_add_if(), p->mcast_stats allocated in
    new_nbp() need be freed, or it will be leaked.
    
    Fixes: 1080ab95e3c7 ("net: bridge: add support for IGMP/MLD stats and export them via netlink")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Acked-by: Nikolay Aleksandrov <nikolay@nvidia.com>
    Link: https://lore.kernel.org/r/20210809132023.978546-1-yangyingliang@huawei.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c
index 5aa508a08a69..b5fb2b682e19 100644
--- a/net/bridge/br_if.c
+++ b/net/bridge/br_if.c
@@ -604,6 +604,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev,
 
 	err = dev_set_allmulti(dev, 1);
 	if (err) {
+		br_multicast_del_port(p);
 		kfree(p);	/* kobject not yet init'd, manually free */
 		goto err1;
 	}
@@ -708,6 +709,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev,
 err3:
 	sysfs_remove_link(br->ifobj, p->dev->name);
 err2:
+	br_multicast_del_port(p);
 	kobject_put(&p->kobj);
 	dev_set_allmulti(dev, -1);
 err1:

commit 782e2706b091d157cde92bb6e97734120036cf32
Author: Vladimir Oltean <vladimir.oltean@nxp.com>
Date:   Tue Aug 10 14:19:54 2021 +0300

    net: dsa: lan9303: fix broken backpressure in .port_fdb_dump
    
    [ Upstream commit ada2fee185d8145afb89056558bb59545b9dbdd0 ]
    
    rtnl_fdb_dump() has logic to split a dump of PF_BRIDGE neighbors into
    multiple netlink skbs if the buffer provided by user space is too small
    (one buffer will typically handle a few hundred FDB entries).
    
    When the current buffer becomes full, nlmsg_put() in
    dsa_slave_port_fdb_do_dump() returns -EMSGSIZE and DSA saves the index
    of the last dumped FDB entry, returns to rtnl_fdb_dump() up to that
    point, and then the dump resumes on the same port with a new skb, and
    FDB entries up to the saved index are simply skipped.
    
    Since dsa_slave_port_fdb_do_dump() is pointed to by the "cb" passed to
    drivers, then drivers must check for the -EMSGSIZE error code returned
    by it. Otherwise, when a netlink skb becomes full, DSA will no longer
    save newly dumped FDB entries to it, but the driver will continue
    dumping. So FDB entries will be missing from the dump.
    
    Fix the broken backpressure by propagating the "cb" return code and
    allow rtnl_fdb_dump() to restart the FDB dump with a new skb.
    
    Fixes: ab335349b852 ("net: dsa: lan9303: Add port_fast_age and port_fdb_dump methods")
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/dsa/lan9303-core.c b/drivers/net/dsa/lan9303-core.c
index b4f6e1a67dd9..b89c474e6b6b 100644
--- a/drivers/net/dsa/lan9303-core.c
+++ b/drivers/net/dsa/lan9303-core.c
@@ -566,12 +566,12 @@ static int lan9303_alr_make_entry_raw(struct lan9303 *chip, u32 dat0, u32 dat1)
 	return 0;
 }
 
-typedef void alr_loop_cb_t(struct lan9303 *chip, u32 dat0, u32 dat1,
-			   int portmap, void *ctx);
+typedef int alr_loop_cb_t(struct lan9303 *chip, u32 dat0, u32 dat1,
+			  int portmap, void *ctx);
 
-static void lan9303_alr_loop(struct lan9303 *chip, alr_loop_cb_t *cb, void *ctx)
+static int lan9303_alr_loop(struct lan9303 *chip, alr_loop_cb_t *cb, void *ctx)
 {
-	int i;
+	int ret = 0, i;
 
 	mutex_lock(&chip->alr_mutex);
 	lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD,
@@ -591,13 +591,17 @@ static void lan9303_alr_loop(struct lan9303 *chip, alr_loop_cb_t *cb, void *ctx)
 						LAN9303_ALR_DAT1_PORT_BITOFFS;
 		portmap = alrport_2_portmap[alrport];
 
-		cb(chip, dat0, dat1, portmap, ctx);
+		ret = cb(chip, dat0, dat1, portmap, ctx);
+		if (ret)
+			break;
 
 		lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD,
 					 LAN9303_ALR_CMD_GET_NEXT);
 		lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD, 0);
 	}
 	mutex_unlock(&chip->alr_mutex);
+
+	return ret;
 }
 
 static void alr_reg_to_mac(u32 dat0, u32 dat1, u8 mac[6])
@@ -615,18 +619,20 @@ struct del_port_learned_ctx {
 };
 
 /* Clear learned (non-static) entry on given port */
-static void alr_loop_cb_del_port_learned(struct lan9303 *chip, u32 dat0,
-					 u32 dat1, int portmap, void *ctx)
+static int alr_loop_cb_del_port_learned(struct lan9303 *chip, u32 dat0,
+					u32 dat1, int portmap, void *ctx)
 {
 	struct del_port_learned_ctx *del_ctx = ctx;
 	int port = del_ctx->port;
 
 	if (((BIT(port) & portmap) == 0) || (dat1 & LAN9303_ALR_DAT1_STATIC))
-		return;
+		return 0;
 
 	/* learned entries has only one port, we can just delete */
 	dat1 &= ~LAN9303_ALR_DAT1_VALID; /* delete entry */
 	lan9303_alr_make_entry_raw(chip, dat0, dat1);
+
+	return 0;
 }
 
 struct port_fdb_dump_ctx {
@@ -635,19 +641,19 @@ struct port_fdb_dump_ctx {
 	dsa_fdb_dump_cb_t *cb;
 };
 
-static void alr_loop_cb_fdb_port_dump(struct lan9303 *chip, u32 dat0,
-				      u32 dat1, int portmap, void *ctx)
+static int alr_loop_cb_fdb_port_dump(struct lan9303 *chip, u32 dat0,
+				     u32 dat1, int portmap, void *ctx)
 {
 	struct port_fdb_dump_ctx *dump_ctx = ctx;
 	u8 mac[ETH_ALEN];
 	bool is_static;
 
 	if ((BIT(dump_ctx->port) & portmap) == 0)
-		return;
+		return 0;
 
 	alr_reg_to_mac(dat0, dat1, mac);
 	is_static = !!(dat1 & LAN9303_ALR_DAT1_STATIC);
-	dump_ctx->cb(mac, 0, is_static, dump_ctx->data);
+	return dump_ctx->cb(mac, 0, is_static, dump_ctx->data);
 }
 
 /* Set a static ALR entry. Delete entry if port_map is zero */
@@ -1214,9 +1220,7 @@ static int lan9303_port_fdb_dump(struct dsa_switch *ds, int port,
 	};
 
 	dev_dbg(chip->dev, "%s(%d)\n", __func__, port);
-	lan9303_alr_loop(chip, alr_loop_cb_fdb_port_dump, &dump_ctx);
-
-	return 0;
+	return lan9303_alr_loop(chip, alr_loop_cb_fdb_port_dump, &dump_ctx);
 }
 
 static int lan9303_port_mdb_prepare(struct dsa_switch *ds, int port,

commit fb5db3106036f4e21a63c0c6b08db4b4f18f157c
Author: Eric Dumazet <edumazet@google.com>
Date:   Tue Aug 10 02:45:47 2021 -0700

    net: igmp: fix data-race in igmp_ifc_timer_expire()
    
    [ Upstream commit 4a2b285e7e103d4d6c6ed3e5052a0ff74a5d7f15 ]
    
    Fix the data-race reported by syzbot [1]
    Issue here is that igmp_ifc_timer_expire() can update in_dev->mr_ifc_count
    while another change just occured from another context.
    
    in_dev->mr_ifc_count is only 8bit wide, so the race had little
    consequences.
    
    [1]
    BUG: KCSAN: data-race in igmp_ifc_event / igmp_ifc_timer_expire
    
    write to 0xffff8881051e3062 of 1 bytes by task 12547 on cpu 0:
     igmp_ifc_event+0x1d5/0x290 net/ipv4/igmp.c:821
     igmp_group_added+0x462/0x490 net/ipv4/igmp.c:1356
     ____ip_mc_inc_group+0x3ff/0x500 net/ipv4/igmp.c:1461
     __ip_mc_join_group+0x24d/0x2c0 net/ipv4/igmp.c:2199
     ip_mc_join_group_ssm+0x20/0x30 net/ipv4/igmp.c:2218
     do_ip_setsockopt net/ipv4/ip_sockglue.c:1285 [inline]
     ip_setsockopt+0x1827/0x2a80 net/ipv4/ip_sockglue.c:1423
     tcp_setsockopt+0x8c/0xa0 net/ipv4/tcp.c:3657
     sock_common_setsockopt+0x5d/0x70 net/core/sock.c:3362
     __sys_setsockopt+0x18f/0x200 net/socket.c:2159
     __do_sys_setsockopt net/socket.c:2170 [inline]
     __se_sys_setsockopt net/socket.c:2167 [inline]
     __x64_sys_setsockopt+0x62/0x70 net/socket.c:2167
     do_syscall_x64 arch/x86/entry/common.c:50 [inline]
     do_syscall_64+0x3d/0x90 arch/x86/entry/common.c:80
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    read to 0xffff8881051e3062 of 1 bytes by interrupt on cpu 1:
     igmp_ifc_timer_expire+0x706/0xa30 net/ipv4/igmp.c:808
     call_timer_fn+0x2e/0x1d0 kernel/time/timer.c:1419
     expire_timers+0x135/0x250 kernel/time/timer.c:1464
     __run_timers+0x358/0x420 kernel/time/timer.c:1732
     run_timer_softirq+0x19/0x30 kernel/time/timer.c:1745
     __do_softirq+0x12c/0x26e kernel/softirq.c:558
     invoke_softirq kernel/softirq.c:432 [inline]
     __irq_exit_rcu+0x9a/0xb0 kernel/softirq.c:636
     sysvec_apic_timer_interrupt+0x69/0x80 arch/x86/kernel/apic/apic.c:1100
     asm_sysvec_apic_timer_interrupt+0x12/0x20 arch/x86/include/asm/idtentry.h:638
     console_unlock+0x8e8/0xb30 kernel/printk/printk.c:2646
     vprintk_emit+0x125/0x3d0 kernel/printk/printk.c:2174
     vprintk_default+0x22/0x30 kernel/printk/printk.c:2185
     vprintk+0x15a/0x170 kernel/printk/printk_safe.c:392
     printk+0x62/0x87 kernel/printk/printk.c:2216
     selinux_netlink_send+0x399/0x400 security/selinux/hooks.c:6041
     security_netlink_send+0x42/0x90 security/security.c:2070
     netlink_sendmsg+0x59e/0x7c0 net/netlink/af_netlink.c:1919
     sock_sendmsg_nosec net/socket.c:703 [inline]
     sock_sendmsg net/socket.c:723 [inline]
     ____sys_sendmsg+0x360/0x4d0 net/socket.c:2392
     ___sys_sendmsg net/socket.c:2446 [inline]
     __sys_sendmsg+0x1ed/0x270 net/socket.c:2475
     __do_sys_sendmsg net/socket.c:2484 [inline]
     __se_sys_sendmsg net/socket.c:2482 [inline]
     __x64_sys_sendmsg+0x42/0x50 net/socket.c:2482
     do_syscall_x64 arch/x86/entry/common.c:50 [inline]
     do_syscall_64+0x3d/0x90 arch/x86/entry/common.c:80
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    value changed: 0x01 -> 0x02
    
    Reported by Kernel Concurrency Sanitizer on:
    CPU: 1 PID: 12539 Comm: syz-executor.1 Not tainted 5.14.0-rc4-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c
index ffa847fc9619..95ec3923083f 100644
--- a/net/ipv4/igmp.c
+++ b/net/ipv4/igmp.c
@@ -807,10 +807,17 @@ static void igmp_gq_timer_expire(struct timer_list *t)
 static void igmp_ifc_timer_expire(struct timer_list *t)
 {
 	struct in_device *in_dev = from_timer(in_dev, t, mr_ifc_timer);
+	u8 mr_ifc_count;
 
 	igmpv3_send_cr(in_dev);
-	if (in_dev->mr_ifc_count) {
-		in_dev->mr_ifc_count--;
+restart:
+	mr_ifc_count = READ_ONCE(in_dev->mr_ifc_count);
+
+	if (mr_ifc_count) {
+		if (cmpxchg(&in_dev->mr_ifc_count,
+			    mr_ifc_count,
+			    mr_ifc_count - 1) != mr_ifc_count)
+			goto restart;
 		igmp_ifc_start_timer(in_dev,
 				     unsolicited_report_interval(in_dev));
 	}
@@ -822,7 +829,7 @@ static void igmp_ifc_event(struct in_device *in_dev)
 	struct net *net = dev_net(in_dev->dev);
 	if (IGMP_V1_SEEN(in_dev) || IGMP_V2_SEEN(in_dev))
 		return;
-	in_dev->mr_ifc_count = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv;
+	WRITE_ONCE(in_dev->mr_ifc_count, in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv);
 	igmp_ifc_start_timer(in_dev, 1);
 }
 
@@ -961,7 +968,7 @@ static bool igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,
 				in_dev->mr_qri;
 		}
 		/* cancel the interface change timer */
-		in_dev->mr_ifc_count = 0;
+		WRITE_ONCE(in_dev->mr_ifc_count, 0);
 		if (del_timer(&in_dev->mr_ifc_timer))
 			__in_dev_put(in_dev);
 		/* clear deleted report items */
@@ -1739,7 +1746,7 @@ void ip_mc_down(struct in_device *in_dev)
 		igmp_group_dropped(pmc);
 
 #ifdef CONFIG_IP_MULTICAST
-	in_dev->mr_ifc_count = 0;
+	WRITE_ONCE(in_dev->mr_ifc_count, 0);
 	if (del_timer(&in_dev->mr_ifc_timer))
 		__in_dev_put(in_dev);
 	in_dev->mr_gq_running = 0;
@@ -1956,7 +1963,7 @@ static int ip_mc_del_src(struct in_device *in_dev, __be32 *pmca, int sfmode,
 		pmc->sfmode = MCAST_INCLUDE;
 #ifdef CONFIG_IP_MULTICAST
 		pmc->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv;
-		in_dev->mr_ifc_count = pmc->crcount;
+		WRITE_ONCE(in_dev->mr_ifc_count, pmc->crcount);
 		for (psf = pmc->sources; psf; psf = psf->sf_next)
 			psf->sf_crcount = 0;
 		igmp_ifc_event(pmc->interface);
@@ -2135,7 +2142,7 @@ static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode,
 		/* else no filters; keep old mode for reports */
 
 		pmc->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv;
-		in_dev->mr_ifc_count = pmc->crcount;
+		WRITE_ONCE(in_dev->mr_ifc_count, pmc->crcount);
 		for (psf = pmc->sources; psf; psf = psf->sf_next)
 			psf->sf_crcount = 0;
 		igmp_ifc_event(in_dev);

commit 7da72e2db1b36c3138aff542622123c030344254
Author: Takeshi Misawa <jeliantsurux@gmail.com>
Date:   Thu Aug 5 16:54:14 2021 +0900

    net: Fix memory leak in ieee802154_raw_deliver
    
    [ Upstream commit 1090340f7ee53e824fd4eef66a4855d548110c5b ]
    
    If IEEE-802.15.4-RAW is closed before receive skb, skb is leaked.
    Fix this, by freeing sk_receive_queue in sk->sk_destruct().
    
    syzbot report:
    BUG: memory leak
    unreferenced object 0xffff88810f644600 (size 232):
      comm "softirq", pid 0, jiffies 4294967032 (age 81.270s)
      hex dump (first 32 bytes):
        10 7d 4b 12 81 88 ff ff 10 7d 4b 12 81 88 ff ff  .}K......}K.....
        00 00 00 00 00 00 00 00 40 7c 4b 12 81 88 ff ff  ........@|K.....
      backtrace:
        [<ffffffff83651d4a>] skb_clone+0xaa/0x2b0 net/core/skbuff.c:1496
        [<ffffffff83fe1b80>] ieee802154_raw_deliver net/ieee802154/socket.c:369 [inline]
        [<ffffffff83fe1b80>] ieee802154_rcv+0x100/0x340 net/ieee802154/socket.c:1070
        [<ffffffff8367cc7a>] __netif_receive_skb_one_core+0x6a/0xa0 net/core/dev.c:5384
        [<ffffffff8367cd07>] __netif_receive_skb+0x27/0xa0 net/core/dev.c:5498
        [<ffffffff8367cdd9>] netif_receive_skb_internal net/core/dev.c:5603 [inline]
        [<ffffffff8367cdd9>] netif_receive_skb+0x59/0x260 net/core/dev.c:5662
        [<ffffffff83fe6302>] ieee802154_deliver_skb net/mac802154/rx.c:29 [inline]
        [<ffffffff83fe6302>] ieee802154_subif_frame net/mac802154/rx.c:102 [inline]
        [<ffffffff83fe6302>] __ieee802154_rx_handle_packet net/mac802154/rx.c:212 [inline]
        [<ffffffff83fe6302>] ieee802154_rx+0x612/0x620 net/mac802154/rx.c:284
        [<ffffffff83fe59a6>] ieee802154_tasklet_handler+0x86/0xa0 net/mac802154/main.c:35
        [<ffffffff81232aab>] tasklet_action_common.constprop.0+0x5b/0x100 kernel/softirq.c:557
        [<ffffffff846000bf>] __do_softirq+0xbf/0x2ab kernel/softirq.c:345
        [<ffffffff81232f4c>] do_softirq kernel/softirq.c:248 [inline]
        [<ffffffff81232f4c>] do_softirq+0x5c/0x80 kernel/softirq.c:235
        [<ffffffff81232fc1>] __local_bh_enable_ip+0x51/0x60 kernel/softirq.c:198
        [<ffffffff8367a9a4>] local_bh_enable include/linux/bottom_half.h:32 [inline]
        [<ffffffff8367a9a4>] rcu_read_unlock_bh include/linux/rcupdate.h:745 [inline]
        [<ffffffff8367a9a4>] __dev_queue_xmit+0x7f4/0xf60 net/core/dev.c:4221
        [<ffffffff83fe2db4>] raw_sendmsg+0x1f4/0x2b0 net/ieee802154/socket.c:295
        [<ffffffff8363af16>] sock_sendmsg_nosec net/socket.c:654 [inline]
        [<ffffffff8363af16>] sock_sendmsg+0x56/0x80 net/socket.c:674
        [<ffffffff8363deec>] __sys_sendto+0x15c/0x200 net/socket.c:1977
        [<ffffffff8363dfb6>] __do_sys_sendto net/socket.c:1989 [inline]
        [<ffffffff8363dfb6>] __se_sys_sendto net/socket.c:1985 [inline]
        [<ffffffff8363dfb6>] __x64_sys_sendto+0x26/0x30 net/socket.c:1985
    
    Fixes: 9ec767160357 ("net: add IEEE 802.15.4 socket family implementation")
    Reported-and-tested-by: syzbot+1f68113fa907bf0695a8@syzkaller.appspotmail.com
    Signed-off-by: Takeshi Misawa <jeliantsurux@gmail.com>
    Acked-by: Alexander Aring <aahringo@redhat.com>
    Link: https://lore.kernel.org/r/20210805075414.GA15796@DESKTOP
    Signed-off-by: Stefan Schmidt <stefan@datenfreihafen.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ieee802154/socket.c b/net/ieee802154/socket.c
index 89819745e482..14c6fac039f9 100644
--- a/net/ieee802154/socket.c
+++ b/net/ieee802154/socket.c
@@ -1002,6 +1002,11 @@ static const struct proto_ops ieee802154_dgram_ops = {
 #endif
 };
 
+static void ieee802154_sock_destruct(struct sock *sk)
+{
+	skb_queue_purge(&sk->sk_receive_queue);
+}
+
 /* Create a socket. Initialise the socket, blank the addresses
  * set the state.
  */
@@ -1042,7 +1047,7 @@ static int ieee802154_create(struct net *net, struct socket *sock,
 	sock->ops = ops;
 
 	sock_init_data(sock, sk);
-	/* FIXME: sk->sk_destruct */
+	sk->sk_destruct = ieee802154_sock_destruct;
 	sk->sk_family = PF_IEEE802154;
 
 	/* Checksums on by default */

commit 5518a26ef281ac4f38736723c26a502335ca6a97
Author: Roi Dayan <roid@nvidia.com>
Date:   Sun Aug 8 09:52:42 2021 +0300

    psample: Add a fwd declaration for skbuff
    
    [ Upstream commit beb7f2de5728b0bd2140a652fa51f6ad85d159f7 ]
    
    Without this there is a warning if source files include psample.h
    before skbuff.h or doesn't include it at all.
    
    Fixes: 6ae0a6286171 ("net: Introduce psample, a new genetlink channel for packet sampling")
    Signed-off-by: Roi Dayan <roid@nvidia.com>
    Link: https://lore.kernel.org/r/20210808065242.1522535-1-roid@nvidia.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/net/psample.h b/include/net/psample.h
index 94cb37a7bf75..796f01e5635d 100644
--- a/include/net/psample.h
+++ b/include/net/psample.h
@@ -18,6 +18,8 @@ struct psample_group {
 struct psample_group *psample_group_get(struct net *net, u32 group_num);
 void psample_group_put(struct psample_group *group);
 
+struct sk_buff;
+
 #if IS_ENABLED(CONFIG_PSAMPLE)
 
 void psample_sample_packet(struct psample_group *group, struct sk_buff *skb,

commit 0bc8d39791e65d2812746b6a07df4e1d482b7e08
Author: Pali Rohár <pali@kernel.org>
Date:   Sat Aug 7 15:27:03 2021 +0200

    ppp: Fix generating ifname when empty IFLA_IFNAME is specified
    
    [ Upstream commit 2459dcb96bcba94c08d6861f8a050185ff301672 ]
    
    IFLA_IFNAME is nul-term string which means that IFLA_IFNAME buffer can be
    larger than length of string which contains.
    
    Function __rtnl_newlink() generates new own ifname if either IFLA_IFNAME
    was not specified at all or userspace passed empty nul-term string.
    
    It is expected that if userspace does not specify ifname for new ppp netdev
    then kernel generates one in format "ppp<id>" where id matches to the ppp
    unit id which can be later obtained by PPPIOCGUNIT ioctl.
    
    And it works in this way if IFLA_IFNAME is not specified at all. But it
    does not work when IFLA_IFNAME is specified with empty string.
    
    So fix this logic also for empty IFLA_IFNAME in ppp_nl_newlink() function
    and correctly generates ifname based on ppp unit identifier if userspace
    did not provided preferred ifname.
    
    Without this patch when IFLA_IFNAME was specified with empty string then
    kernel created a new ppp interface in format "ppp<id>" but id did not
    match ppp unit id returned by PPPIOCGUNIT ioctl. In this case id was some
    number generated by __rtnl_newlink() function.
    
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Fixes: bb8082f69138 ("ppp: build ifname using unit identifier for rtnl based devices")
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c
index 1af47aaa7ba5..dc9de8731c56 100644
--- a/drivers/net/ppp/ppp_generic.c
+++ b/drivers/net/ppp/ppp_generic.c
@@ -1125,7 +1125,7 @@ static int ppp_nl_newlink(struct net *src_net, struct net_device *dev,
 	 * the PPP unit identifer as suffix (i.e. ppp<unit_id>). This allows
 	 * userspace to infer the device name using to the PPPIOCGUNIT ioctl.
 	 */
-	if (!tb[IFLA_IFNAME])
+	if (!tb[IFLA_IFNAME] || !nla_len(tb[IFLA_IFNAME]) || !*(char *)nla_data(tb[IFLA_IFNAME]))
 		conf.ifname_is_set = false;
 
 	err = ppp_dev_configure(src_net, dev, &conf);

commit f08a3b83463c66509b8a1034e5c416cfade1a5cd
Author: DENG Qingfang <dqfext@gmail.com>
Date:   Fri Aug 6 12:05:27 2021 +0800

    net: dsa: mt7530: add the missing RxUnicast MIB counter
    
    [ Upstream commit aff51c5da3208bd164381e1488998667269c6cf4 ]
    
    Add the missing RxUnicast counter.
    
    Fixes: b8f126a8d543 ("net-next: dsa: add dsa support for Mediatek MT7530 switch")
    Signed-off-by: DENG Qingfang <dqfext@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c
index 6335c4ea0957..2ff6a0be97de 100644
--- a/drivers/net/dsa/mt7530.c
+++ b/drivers/net/dsa/mt7530.c
@@ -54,6 +54,7 @@ static const struct mt7530_mib_desc mt7530_mib[] = {
 	MIB_DESC(2, 0x48, "TxBytes"),
 	MIB_DESC(1, 0x60, "RxDrop"),
 	MIB_DESC(1, 0x64, "RxFiltering"),
+	MIB_DESC(1, 0x68, "RxUnicast"),
 	MIB_DESC(1, 0x6c, "RxMulticast"),
 	MIB_DESC(1, 0x70, "RxBroadcast"),
 	MIB_DESC(1, 0x74, "RxAlignErr"),

commit 39edeccf57fef8f2ca62c649ace1fb138a965d98
Author: Richard Fitzgerald <rf@opensource.cirrus.com>
Date:   Thu Aug 5 17:11:05 2021 +0100

    ASoC: cs42l42: Fix LRCLK frame start edge
    
    [ Upstream commit 0c2f2ad4f16a58879463d0979a54293f8f296d6f ]
    
    An I2S frame starts on the falling edge of LRCLK so ASP_STP must
    be 0.
    
    At the same time, move other format settings in the same register
    from cs42l42_pll_config() to cs42l42_set_dai_fmt() where you'd
    expect to find them, and merge into a single write.
    
    Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
    Fixes: 2c394ca79604 ("ASoC: Add support for CS42L42 codec")
    Link: https://lore.kernel.org/r/20210805161111.10410-2-rf@opensource.cirrus.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/codecs/cs42l42.c b/sound/soc/codecs/cs42l42.c
index fb12fcf88878..4cb3e11c66af 100644
--- a/sound/soc/codecs/cs42l42.c
+++ b/sound/soc/codecs/cs42l42.c
@@ -659,15 +659,6 @@ static int cs42l42_pll_config(struct snd_soc_component *component)
 					CS42L42_FSYNC_PULSE_WIDTH_MASK,
 					CS42L42_FRAC1_VAL(fsync - 1) <<
 					CS42L42_FSYNC_PULSE_WIDTH_SHIFT);
-			snd_soc_component_update_bits(component,
-					CS42L42_ASP_FRM_CFG,
-					CS42L42_ASP_5050_MASK,
-					CS42L42_ASP_5050_MASK);
-			/* Set the frame delay to 1.0 SCLK clocks */
-			snd_soc_component_update_bits(component, CS42L42_ASP_FRM_CFG,
-					CS42L42_ASP_FSD_MASK,
-					CS42L42_ASP_FSD_1_0 <<
-					CS42L42_ASP_FSD_SHIFT);
 			/* Set the sample rates (96k or lower) */
 			snd_soc_component_update_bits(component, CS42L42_FS_RATE_EN,
 					CS42L42_FS_EN_MASK,
@@ -763,6 +754,18 @@ static int cs42l42_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
 	/* interface format */
 	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
 	case SND_SOC_DAIFMT_I2S:
+		/*
+		 * 5050 mode, frame starts on falling edge of LRCLK,
+		 * frame delayed by 1.0 SCLKs
+		 */
+		snd_soc_component_update_bits(component,
+					      CS42L42_ASP_FRM_CFG,
+					      CS42L42_ASP_STP_MASK |
+					      CS42L42_ASP_5050_MASK |
+					      CS42L42_ASP_FSD_MASK,
+					      CS42L42_ASP_5050_MASK |
+					      (CS42L42_ASP_FSD_1_0 <<
+						CS42L42_ASP_FSD_SHIFT));
 		break;
 	default:
 		return -EINVAL;

commit 6f0e1374e192da77884c7fb485a52b0dd9985289
Author: Richard Fitzgerald <rf@opensource.cirrus.com>
Date:   Tue Aug 3 17:08:34 2021 +0100

    ASoC: cs42l42: Remove duplicate control for WNF filter frequency
    
    [ Upstream commit 8b353bbeae20e2214c9d9d88bcb2fda4ba145d83 ]
    
    The driver was defining two ALSA controls that both change the same
    register field for the wind noise filter corner frequency. The filter
    response has two corners, at different frequencies, and the duplicate
    controls most likely were an attempt to be able to set the value using
    either of the frequencies.
    
    However, having two controls changing the same field can be problematic
    and it is unnecessary. Both frequencies are related to each other so
    setting one implies exactly what the other would be.
    
    Removing a control affects user-side code, but there is currently no
    known use of the removed control so it would be best to remove it now
    before it becomes a problem.
    
    Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
    Fixes: 2c394ca79604 ("ASoC: Add support for CS42L42 codec")
    Link: https://lore.kernel.org/r/20210803160834.9005-2-rf@opensource.cirrus.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/codecs/cs42l42.c b/sound/soc/codecs/cs42l42.c
index c11e60e9fe4e..fb12fcf88878 100644
--- a/sound/soc/codecs/cs42l42.c
+++ b/sound/soc/codecs/cs42l42.c
@@ -424,15 +424,6 @@ static SOC_ENUM_SINGLE_DECL(cs42l42_wnf3_freq_enum, CS42L42_ADC_WNF_HPF_CTL,
 			    CS42L42_ADC_WNF_CF_SHIFT,
 			    cs42l42_wnf3_freq_text);
 
-static const char * const cs42l42_wnf05_freq_text[] = {
-	"280Hz", "315Hz", "350Hz", "385Hz",
-	"420Hz", "455Hz", "490Hz", "525Hz"
-};
-
-static SOC_ENUM_SINGLE_DECL(cs42l42_wnf05_freq_enum, CS42L42_ADC_WNF_HPF_CTL,
-			    CS42L42_ADC_WNF_CF_SHIFT,
-			    cs42l42_wnf05_freq_text);
-
 static const struct snd_kcontrol_new cs42l42_snd_controls[] = {
 	/* ADC Volume and Filter Controls */
 	SOC_SINGLE("ADC Notch Switch", CS42L42_ADC_CTL,
@@ -450,7 +441,6 @@ static const struct snd_kcontrol_new cs42l42_snd_controls[] = {
 				CS42L42_ADC_HPF_EN_SHIFT, true, false),
 	SOC_ENUM("HPF Corner Freq", cs42l42_hpf_freq_enum),
 	SOC_ENUM("WNF 3dB Freq", cs42l42_wnf3_freq_enum),
-	SOC_ENUM("WNF 05dB Freq", cs42l42_wnf05_freq_enum),
 
 	/* DAC Volume and Filter Controls */
 	SOC_SINGLE("DACA Invert Switch", CS42L42_DAC_CTL1,

commit 8a203103eef3532a72927a3d7931c1de51c246d1
Author: Richard Fitzgerald <rf@opensource.cirrus.com>
Date:   Tue Aug 3 17:08:33 2021 +0100

    ASoC: cs42l42: Fix inversion of ADC Notch Switch control
    
    [ Upstream commit 30615bd21b4cc3c3bb5ae8bd70e2a915cc5f75c7 ]
    
    The underlying register field has inverted sense (0 = enabled) so
    the control definition must be marked as inverted.
    
    Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
    Fixes: 2c394ca79604 ("ASoC: Add support for CS42L42 codec")
    Link: https://lore.kernel.org/r/20210803160834.9005-1-rf@opensource.cirrus.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/codecs/cs42l42.c b/sound/soc/codecs/cs42l42.c
index ca6541ac59e1..c11e60e9fe4e 100644
--- a/sound/soc/codecs/cs42l42.c
+++ b/sound/soc/codecs/cs42l42.c
@@ -436,7 +436,7 @@ static SOC_ENUM_SINGLE_DECL(cs42l42_wnf05_freq_enum, CS42L42_ADC_WNF_HPF_CTL,
 static const struct snd_kcontrol_new cs42l42_snd_controls[] = {
 	/* ADC Volume and Filter Controls */
 	SOC_SINGLE("ADC Notch Switch", CS42L42_ADC_CTL,
-				CS42L42_ADC_NOTCH_DIS_SHIFT, true, false),
+				CS42L42_ADC_NOTCH_DIS_SHIFT, true, true),
 	SOC_SINGLE("ADC Weak Force Switch", CS42L42_ADC_CTL,
 				CS42L42_ADC_FORCE_WEAK_VCM_SHIFT, true, false),
 	SOC_SINGLE("ADC Invert Switch", CS42L42_ADC_CTL,

commit b19d07068b25e1ee38dd6b59004392d85a899074
Author: Richard Fitzgerald <rf@opensource.cirrus.com>
Date:   Thu Jul 29 18:09:28 2021 +0100

    ASoC: cs42l42: Don't allow SND_SOC_DAIFMT_LEFT_J
    
    [ Upstream commit 64324bac750b84ca54711fb7d332132fcdb87293 ]
    
    The driver has no support for left-justified protocol so it should
    not have been allowing this to be passed to cs42l42_set_dai_fmt().
    
    Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
    Fixes: 2c394ca79604 ("ASoC: Add support for CS42L42 codec")
    Link: https://lore.kernel.org/r/20210729170929.6589-2-rf@opensource.cirrus.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/codecs/cs42l42.c b/sound/soc/codecs/cs42l42.c
index 6a58c666776a..ca6541ac59e1 100644
--- a/sound/soc/codecs/cs42l42.c
+++ b/sound/soc/codecs/cs42l42.c
@@ -773,7 +773,6 @@ static int cs42l42_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
 	/* interface format */
 	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
 	case SND_SOC_DAIFMT_I2S:
-	case SND_SOC_DAIFMT_LEFT_J:
 		break;
 	default:
 		return -EINVAL;

commit 49f49cd9a389a7b7637bba26050cf2a1440a0a13
Author: Richard Fitzgerald <rf@opensource.cirrus.com>
Date:   Thu Jul 29 18:09:27 2021 +0100

    ASoC: cs42l42: Correct definition of ADC Volume control
    
    [ Upstream commit ee86f680ff4c9b406d49d4e22ddf10805b8a2137 ]
    
    The ADC volume is a signed 8-bit number with range -97 to +12,
    with -97 being mute. Use a SOC_SINGLE_S8_TLV() to define this
    and fix the DECLARE_TLV_DB_SCALE() to have the correct start and
    mute flag.
    
    Fixes: 2c394ca79604 ("ASoC: Add support for CS42L42 codec")
    Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
    Link: https://lore.kernel.org/r/20210729170929.6589-1-rf@opensource.cirrus.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/codecs/cs42l42.c b/sound/soc/codecs/cs42l42.c
index fddfd227a9c0..6a58c666776a 100644
--- a/sound/soc/codecs/cs42l42.c
+++ b/sound/soc/codecs/cs42l42.c
@@ -404,7 +404,7 @@ static const struct regmap_config cs42l42_regmap = {
 	.cache_type = REGCACHE_RBTREE,
 };
 
-static DECLARE_TLV_DB_SCALE(adc_tlv, -9600, 100, false);
+static DECLARE_TLV_DB_SCALE(adc_tlv, -9700, 100, true);
 static DECLARE_TLV_DB_SCALE(mixer_tlv, -6300, 100, true);
 
 static const char * const cs42l42_hpf_freq_text[] = {
@@ -443,8 +443,7 @@ static const struct snd_kcontrol_new cs42l42_snd_controls[] = {
 				CS42L42_ADC_INV_SHIFT, true, false),
 	SOC_SINGLE("ADC Boost Switch", CS42L42_ADC_CTL,
 				CS42L42_ADC_DIG_BOOST_SHIFT, true, false),
-	SOC_SINGLE_SX_TLV("ADC Volume", CS42L42_ADC_VOLUME,
-				CS42L42_ADC_VOL_SHIFT, 0xA0, 0x6C, adc_tlv),
+	SOC_SINGLE_S8_TLV("ADC Volume", CS42L42_ADC_VOLUME, -97, 12, adc_tlv),
 	SOC_SINGLE("ADC WNF Switch", CS42L42_ADC_WNF_HPF_CTL,
 				CS42L42_ADC_WNF_EN_SHIFT, true, false),
 	SOC_SINGLE("ADC HPF Switch", CS42L42_ADC_WNF_HPF_CTL,

commit 202e294bdf7d01476d18bd95b0019d5b447ec820
Author: Dongliang Mu <mudongliangabcd@gmail.com>
Date:   Wed Jul 7 23:56:32 2021 +0800

    ieee802154: hwsim: fix GPF in hwsim_new_edge_nl
    
    [ Upstream commit 889d0e7dc68314a273627d89cbb60c09e1cc1c25 ]
    
    Both MAC802154_HWSIM_ATTR_RADIO_ID and MAC802154_HWSIM_ATTR_RADIO_EDGE
    must be present to fix GPF.
    
    Fixes: f25da51fdc38 ("ieee802154: hwsim: add replacement for fakelb")
    Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Acked-by: Alexander Aring <aahringo@redhat.com>
    Link: https://lore.kernel.org/r/20210707155633.1486603-1-mudongliangabcd@gmail.com
    Signed-off-by: Stefan Schmidt <stefan@datenfreihafen.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ieee802154/mac802154_hwsim.c b/drivers/net/ieee802154/mac802154_hwsim.c
index 82f3fbda7dfe..ed60e691cc2b 100644
--- a/drivers/net/ieee802154/mac802154_hwsim.c
+++ b/drivers/net/ieee802154/mac802154_hwsim.c
@@ -432,7 +432,7 @@ static int hwsim_new_edge_nl(struct sk_buff *msg, struct genl_info *info)
 	struct hwsim_edge *e;
 	u32 v0, v1;
 
-	if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID] &&
+	if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID] ||
 	    !info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE])
 		return -EINVAL;
 

commit 5442be288efc063f6c21e71c57000e82753a2451
Author: Dongliang Mu <mudongliangabcd@gmail.com>
Date:   Mon Jul 5 21:13:20 2021 +0800

    ieee802154: hwsim: fix GPF in hwsim_set_edge_lqi
    
    [ Upstream commit e9faf53c5a5d01f6f2a09ae28ec63a3bbd6f64fd ]
    
    Both MAC802154_HWSIM_ATTR_RADIO_ID and MAC802154_HWSIM_ATTR_RADIO_EDGE,
    MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID and MAC802154_HWSIM_EDGE_ATTR_LQI
    must be present to fix GPF.
    
    Fixes: f25da51fdc38 ("ieee802154: hwsim: add replacement for fakelb")
    Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Acked-by: Alexander Aring <aahringo@redhat.com>
    Link: https://lore.kernel.org/r/20210705131321.217111-1-mudongliangabcd@gmail.com
    Signed-off-by: Stefan Schmidt <stefan@datenfreihafen.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ieee802154/mac802154_hwsim.c b/drivers/net/ieee802154/mac802154_hwsim.c
index 06aadebc2d5b..82f3fbda7dfe 100644
--- a/drivers/net/ieee802154/mac802154_hwsim.c
+++ b/drivers/net/ieee802154/mac802154_hwsim.c
@@ -546,7 +546,7 @@ static int hwsim_set_edge_lqi(struct sk_buff *msg, struct genl_info *info)
 	u32 v0, v1;
 	u8 lqi;
 
-	if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID] &&
+	if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID] ||
 	    !info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE])
 		return -EINVAL;
 
@@ -555,7 +555,7 @@ static int hwsim_set_edge_lqi(struct sk_buff *msg, struct genl_info *info)
 			     hwsim_edge_policy, NULL))
 		return -EINVAL;
 
-	if (!edge_attrs[MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID] &&
+	if (!edge_attrs[MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID] ||
 	    !edge_attrs[MAC802154_HWSIM_EDGE_ATTR_LQI])
 		return -EINVAL;
 

commit c39e22fd3f7ce3af64140f560ea63b0c986a46db
Author: Dan Williams <dan.j.williams@intel.com>
Date:   Wed Aug 11 11:53:37 2021 -0700

    ACPI: NFIT: Fix support for virtual SPA ranges
    
    commit b93dfa6bda4d4e88e5386490f2b277a26958f9d3 upstream.
    
    Fix the NFIT parsing code to treat a 0 index in a SPA Range Structure as
    a special case and not match Region Mapping Structures that use 0 to
    indicate that they are not mapped. Without this fix some platform BIOS
    descriptions of "virtual disk" ranges do not result in the pmem driver
    attaching to the range.
    
    Details:
    In addition to typical persistent memory ranges, the ACPI NFIT may also
    convey "virtual" ranges. These ranges are indicated by a UUID in the SPA
    Range Structure of UUID_VOLATILE_VIRTUAL_DISK, UUID_VOLATILE_VIRTUAL_CD,
    UUID_PERSISTENT_VIRTUAL_DISK, or UUID_PERSISTENT_VIRTUAL_CD. The
    critical difference between virtual ranges and UUID_PERSISTENT_MEMORY,
    is that virtual do not support associations with Region Mapping
    Structures.  For this reason the "index" value of virtual SPA Range
    Structures is allowed to be 0. If a platform BIOS decides to represent
    NVDIMMs with disconnected "Region Mapping Structures" (range-index ==
    0), the kernel may falsely associate them with standalone ranges where
    the "SPA Range Structure Index" is also zero. When this happens the
    driver may falsely require labels where "virtual disks" are expected to
    be label-less. I.e. "label-less" is where the namespace-range ==
    region-range and the pmem driver attaches with no user action to create
    a namespace.
    
    Cc: Jacek Zloch <jacek.zloch@intel.com>
    Cc: Lukasz Sobieraj <lukasz.sobieraj@intel.com>
    Cc: "Lee, Chun-Yi" <jlee@suse.com>
    Cc: <stable@vger.kernel.org>
    Fixes: c2f32acdf848 ("acpi, nfit: treat virtual ramdisk SPA as pmem region")
    Reported-by: Krzysztof Rusocki <krzysztof.rusocki@intel.com>
    Reported-by: Damian Bassa <damian.bassa@intel.com>
    Reviewed-by: Jeff Moyer <jmoyer@redhat.com>
    Link: https://lore.kernel.org/r/162870796589.2521182.1240403310175570220.stgit@dwillia2-desk3.amr.corp.intel.com
    Signed-off-by: Dan Williams <dan.j.williams@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
index cb88f3b43a94..58a756ca14d8 100644
--- a/drivers/acpi/nfit/core.c
+++ b/drivers/acpi/nfit/core.c
@@ -2834,6 +2834,9 @@ static int acpi_nfit_register_region(struct acpi_nfit_desc *acpi_desc,
 		struct acpi_nfit_memory_map *memdev = nfit_memdev->memdev;
 		struct nd_mapping_desc *mapping;
 
+		/* range index 0 == unmapped in SPA or invalid-SPA */
+		if (memdev->range_index == 0 || spa->range_index == 0)
+			continue;
 		if (memdev->range_index != spa->range_index)
 			continue;
 		if (count >= ND_MAX_MAPPINGS) {

commit 888ae2b85c6d0f03306f6ba82f656bde513b92cf
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Thu Jul 29 16:35:32 2021 +0200

    i2c: dev: zero out array used for i2c reads from userspace
    
    commit 86ff25ed6cd8240d18df58930bd8848b19fce308 upstream.
    
    If an i2c driver happens to not provide the full amount of data that a
    user asks for, it is possible that some uninitialized data could be sent
    to userspace.  While all in-kernel drivers look to be safe, just be sure
    by initializing the buffer to zero before it is passed to the i2c driver
    so that any future drivers will not have this issue.
    
    Also properly copy the amount of data recvieved to the userspace buffer,
    as pointed out by Dan Carpenter.
    
    Reported-by: Eric Dumazet <edumazet@google.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c
index 1d10ee86299d..57aece809841 100644
--- a/drivers/i2c/i2c-dev.c
+++ b/drivers/i2c/i2c-dev.c
@@ -149,7 +149,7 @@ static ssize_t i2cdev_read(struct file *file, char __user *buf, size_t count,
 	if (count > 8192)
 		count = 8192;
 
-	tmp = kmalloc(count, GFP_KERNEL);
+	tmp = kzalloc(count, GFP_KERNEL);
 	if (tmp == NULL)
 		return -ENOMEM;
 
@@ -158,7 +158,8 @@ static ssize_t i2cdev_read(struct file *file, char __user *buf, size_t count,
 
 	ret = i2c_master_recv(client, tmp, count);
 	if (ret >= 0)
-		ret = copy_to_user(buf, tmp, count) ? -EFAULT : ret;
+		if (copy_to_user(buf, tmp, ret))
+			ret = -EFAULT;
 	kfree(tmp);
 	return ret;
 }

commit 9703440e681c6696a7aa07767a565ca6195acc0b
Author: Takashi Iwai <tiwai@suse.de>
Date:   Wed Jul 28 13:23:50 2021 +0200

    ASoC: intel: atom: Fix reference to PCM buffer address
    
    commit 2e6b836312a477d647a7920b56810a5a25f6c856 upstream.
    
    PCM buffers might be allocated dynamically when the buffer
    preallocation failed or a larger buffer is requested, and it's not
    guaranteed that substream->dma_buffer points to the actually used
    buffer.  The address should be retrieved from runtime->dma_addr,
    instead of substream->dma_buffer (and shouldn't use virt_to_phys).
    
    Also, remove the line overriding runtime->dma_area superfluously,
    which was already set up at the PCM buffer allocation.
    
    Cc: Cezary Rojewski <cezary.rojewski@intel.com>
    Cc: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Link: https://lore.kernel.org/r/20210728112353.6675-3-tiwai@suse.de
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/soc/intel/atom/sst-mfld-platform-pcm.c b/sound/soc/intel/atom/sst-mfld-platform-pcm.c
index be773101d876..501ac836777a 100644
--- a/sound/soc/intel/atom/sst-mfld-platform-pcm.c
+++ b/sound/soc/intel/atom/sst-mfld-platform-pcm.c
@@ -135,7 +135,7 @@ static void sst_fill_alloc_params(struct snd_pcm_substream *substream,
 	snd_pcm_uframes_t period_size;
 	ssize_t periodbytes;
 	ssize_t buffer_bytes = snd_pcm_lib_buffer_bytes(substream);
-	u32 buffer_addr = virt_to_phys(substream->dma_buffer.area);
+	u32 buffer_addr = substream->runtime->dma_addr;
 
 	channels = substream->runtime->channels;
 	period_size = substream->runtime->period_size;
@@ -241,7 +241,6 @@ static int sst_platform_alloc_stream(struct snd_pcm_substream *substream,
 	/* set codec params and inform SST driver the same */
 	sst_fill_pcm_params(substream, &param);
 	sst_fill_alloc_params(substream, &alloc_params);
-	substream->runtime->dma_area = substream->dma_buffer.area;
 	str_params.sparams = param;
 	str_params.aparams = alloc_params;
 	str_params.codec = SST_CODEC_TYPE_PCM;

commit 2870da9189ddcdb1fa27c23556d8349f1d39d327
Author: Colin Ian King <colin.king@canonical.com>
Date:   Fri Jul 30 08:16:51 2021 +0100

    iio: adc: Fix incorrect exit of for-loop
    
    commit 5afc1540f13804a31bb704b763308e17688369c5 upstream.
    
    Currently the for-loop that scans for the optimial adc_period iterates
    through all the possible adc_period levels because the exit logic in
    the loop is inverted. I believe the comparison should be swapped and
    the continue replaced with a break to exit the loop at the correct
    point.
    
    Addresses-Coverity: ("Continue has no effect")
    Fixes: e08e19c331fb ("iio:adc: add iio driver for Palmas (twl6035/7) gpadc")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Link: https://lore.kernel.org/r/20210730071651.17394-1-colin.king@canonical.com
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iio/adc/palmas_gpadc.c b/drivers/iio/adc/palmas_gpadc.c
index 69b9affeef1e..7dcd4213d38a 100644
--- a/drivers/iio/adc/palmas_gpadc.c
+++ b/drivers/iio/adc/palmas_gpadc.c
@@ -659,8 +659,8 @@ static int palmas_adc_wakeup_configure(struct palmas_gpadc *adc)
 
 	adc_period = adc->auto_conversion_period;
 	for (i = 0; i < 16; ++i) {
-		if (((1000 * (1 << i)) / 32) < adc_period)
-			continue;
+		if (((1000 * (1 << i)) / 32) >= adc_period)
+			break;
 	}
 	if (i > 0)
 		i--;

commit 13ca1daf27fd7d314114022e78ce2b7f87b84f24
Author: Chris Lesiak <chris.lesiak@licor.com>
Date:   Mon Jun 14 09:18:20 2021 -0500

    iio: humidity: hdc100x: Add margin to the conversion time
    
    commit 84edec86f449adea9ee0b4912a79ab8d9d65abb7 upstream.
    
    The datasheets have the following note for the conversion time
    specification: "This parameter is specified by design and/or
    characterization and it is not tested in production."
    
    Parts have been seen that require more time to do 14-bit conversions for
    the relative humidity channel.  The result is ENXIO due to the address
    phase of a transfer not getting an ACK.
    
    Delay an additional 1 ms per conversion to allow for additional margin.
    
    Fixes: 4839367d99e3 ("iio: humidity: add HDC100x support")
    Signed-off-by: Chris Lesiak <chris.lesiak@licor.com>
    Acked-by: Matt Ranostay <matt.ranostay@konsulko.com>
    Link: https://lore.kernel.org/r/20210614141820.2034827-1-chris.lesiak@licor.com
    Cc: <Stable@vger.kernel.org>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iio/humidity/hdc100x.c b/drivers/iio/humidity/hdc100x.c
index 0fcaa2c0b2f4..51ad5a9ed085 100644
--- a/drivers/iio/humidity/hdc100x.c
+++ b/drivers/iio/humidity/hdc100x.c
@@ -24,6 +24,8 @@
 #include <linux/iio/trigger_consumer.h>
 #include <linux/iio/triggered_buffer.h>
 
+#include <linux/time.h>
+
 #define HDC100X_REG_TEMP			0x00
 #define HDC100X_REG_HUMIDITY			0x01
 
@@ -165,7 +167,7 @@ static int hdc100x_get_measurement(struct hdc100x_data *data,
 				   struct iio_chan_spec const *chan)
 {
 	struct i2c_client *client = data->client;
-	int delay = data->adc_int_us[chan->address];
+	int delay = data->adc_int_us[chan->address] + 1*USEC_PER_MSEC;
 	int ret;
 	__be16 val;
 
@@ -322,7 +324,7 @@ static irqreturn_t hdc100x_trigger_handler(int irq, void *p)
 	struct iio_dev *indio_dev = pf->indio_dev;
 	struct hdc100x_data *data = iio_priv(indio_dev);
 	struct i2c_client *client = data->client;
-	int delay = data->adc_int_us[0] + data->adc_int_us[1];
+	int delay = data->adc_int_us[0] + data->adc_int_us[1] + 2*USEC_PER_MSEC;
 	int ret;
 
 	/* dual read starts at temp register */

commit b98a82f77274b40ca5bb00c66fbedf623140b78a
Author: Huang zhibao <hzb@rock-chips.com>
Date:   Mon Aug 23 15:36:41 2021 +0800

    arm64: configs: add rk3568_nvr_lite.config for nvr lite sdk
    
    Signed-off-by: Huang zhibao <hzb@rock-chips.com>
    Change-Id: If402327e113f1d03aad12801b66af61af3b7d88d

diff --git a/arch/arm64/configs/rk3568_nvr_lite.config b/arch/arm64/configs/rk3568_nvr_lite.config
new file mode 100644
index 000000000000..a7bda8b843e1
--- /dev/null
+++ b/arch/arm64/configs/rk3568_nvr_lite.config
@@ -0,0 +1,69 @@
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+# CONFIG_BATTERY_SBS is not set
+# CONFIG_BT is not set
+# CONFIG_CHARGER_BQ24735 is not set
+# CONFIG_CHARGER_GPIO is not set
+# CONFIG_DRM_FBDEV_EMULATION is not set
+# CONFIG_DRM_SII902X is not set
+# CONFIG_FUSB_30X is not set
+# CONFIG_HIGH_RES_TIMERS is not set
+CONFIG_HZ=100
+CONFIG_HZ_100=y
+# CONFIG_HZ_300 is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_MALI400 is not set
+# CONFIG_MALI_MIDGARD is not set
+# CONFIG_MEDIA_CEC_SUPPORT is not set
+# CONFIG_MEDIA_USB_SUPPORT is not set
+# CONFIG_MFD_CROS_EC is not set
+# CONFIG_MFD_RK628 is not set
+# CONFIG_MFD_RK808 is not set
+# CONFIG_MFD_TPS6586X is not set
+# CONFIG_PHY_ROCKCHIP_CSI2_DPHY is not set
+# CONFIG_PHY_ROCKCHIP_INNO_HDMI_PHY is not set
+# CONFIG_PHY_ROCKCHIP_INNO_USB3 is not set
+# CONFIG_PHY_ROCKCHIP_INNO_VIDEO_COMBO_PHY is not set
+# CONFIG_PHY_ROCKCHIP_MIPI_RX is not set
+# CONFIG_PHY_ROCKCHIP_TYPEC is not set
+# CONFIG_REGULATOR_ACT8865 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_RFKILL is not set
+# CONFIG_ROCKCHIP_CDN_DP is not set
+# CONFIG_ROCKCHIP_DRM_TVE is not set
+# CONFIG_ROCKCHIP_INNO_HDMI is not set
+# CONFIG_ROCKCHIP_LVDS is not set
+# CONFIG_SND_SOC_ES7202 is not set
+# CONFIG_SND_SOC_ES7243E is not set
+# CONFIG_SND_SOC_ES8316 is not set
+# CONFIG_SND_SOC_RK3328 is not set
+# CONFIG_SND_SOC_RK_CODEC_DIGITAL is not set
+# CONFIG_SND_SOC_ROCKCHIP_MAX98090 is not set
+# CONFIG_SND_SOC_ROCKCHIP_PDM is not set
+# CONFIG_SND_SOC_ROCKCHIP_RT5645 is not set
+# CONFIG_SND_SOC_ROCKCHIP_RT5651_RK628 is not set
+# CONFIG_SND_SOC_RT5616 is not set
+# CONFIG_SND_SOC_RT5640 is not set
+# CONFIG_SND_SOC_RT5651 is not set
+# CONFIG_SND_SOC_TS3A227E is not set
+# CONFIG_SND_USB is not set
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_CONFIGFS_ACM is not set
+# CONFIG_USB_CONFIGFS_F_UVC is not set
+# CONFIG_USB_CONFIGFS_MASS_STORAGE is not set
+# CONFIG_USB_NET_DRIVERS is not set
+# CONFIG_USB_SERIAL is not set
+# CONFIG_USB_STORAGE is not set
+# CONFIG_V4L_PLATFORM_DRIVERS is not set
+# CONFIG_VIDEO_GC8034 is not set
+# CONFIG_VIDEO_OS04A10 is not set
+# CONFIG_VIDEO_OV13850 is not set
+# CONFIG_VIDEO_OV4689 is not set
+# CONFIG_VIDEO_OV5695 is not set
+# CONFIG_VIDEO_OV7251 is not set
+# CONFIG_VIDEO_RK628_CSI is not set
+# CONFIG_VIDEO_TC35874X is not set
+# CONFIG_WIRELESS is not set
+# CONFIG_WLAN is not set

commit dc04341b1090bf18bc5e917aca5f5fb66505dce2
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Mon Aug 23 20:02:43 2021 +0800

    drm/rockchip: Use normalized zpos on vop2
    
    Some linux app may be set zpos without any check.
    For example mpv: change the zpos of overlay
    plane from default value 2 to 1, but the primary
    plane zpos is also 1.
    
    Change-Id: I6015c171c6512dc7f10bed7c56933941c9d64a2e
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 7cac259bd675..657e5e84f5bd 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -197,6 +197,7 @@ enum vop2_layer_phy_id {
 };
 
 struct vop2_zpos {
+	struct drm_plane *plane;
 	int win_phys_id;
 	int zpos;
 };
@@ -4509,7 +4510,10 @@ static int vop2_zpos_cmp(const void *a, const void *b)
 	struct vop2_zpos *pa = (struct vop2_zpos *)a;
 	struct vop2_zpos *pb = (struct vop2_zpos *)b;
 
-	return pa->zpos - pb->zpos;
+	if (pa->zpos != pb->zpos)
+		return pa->zpos - pb->zpos;
+	else
+		return pa->plane->base.id - pb->plane->base.id;
 }
 
 static int vop2_crtc_atomic_check(struct drm_crtc *crtc,
@@ -5132,6 +5136,7 @@ static void vop2_crtc_atomic_begin(struct drm_crtc *crtc, struct drm_crtc_state
 		vpstate = to_vop2_plane_state(plane->state);
 		vop2_zpos[nr_layers].win_phys_id = win->phys_id;
 		vop2_zpos[nr_layers].zpos = vpstate->zpos;
+		vop2_zpos[nr_layers].plane = plane;
 		nr_layers++;
 		DRM_DEV_DEBUG(vop2->dev, "%s active zpos:%d for vp%d from vp%d\n",
 			     win->name, vpstate->zpos, vp->id, old_vp->id);

commit e631f93c5326fc2e39571db1525ac646510689c3
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Thu Aug 12 19:51:17 2021 +0800

    media: rockchip: cif supports dummy buffer configurable
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: Icc62c1324affd65934872dfb7c1d29f15e28bb3b

diff --git a/drivers/media/platform/rockchip/cif/Kconfig b/drivers/media/platform/rockchip/cif/Kconfig
index 7ae825d4dcf5..592842bf3386 100644
--- a/drivers/media/platform/rockchip/cif/Kconfig
+++ b/drivers/media/platform/rockchip/cif/Kconfig
@@ -24,3 +24,17 @@ config ROCKCHIP_CIF_WORKMODE_ONEFRAME
 	bool "interface works in oneframe mode"
 
 endchoice
+
+choice
+	prompt "rockchip rkcif device dummy buffer choice"
+	depends on VIDEO_ROCKCHIP_CIF
+	default ROCKCHIP_CIF_USE_DUMMY_BUF
+
+config ROCKCHIP_CIF_USE_DUMMY_BUF
+	bool "rkcif use dummy buffer"
+
+config ROCKCHIP_CIF_USE_NONE_DUMMY_BUF
+	bool "rkcif not use dummy buffer"
+
+endchoice
+
diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index 77eda1fcb7fb..87475ebd99f4 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -1162,6 +1162,7 @@ static int rkcif_assign_new_buffer_oneframe(struct rkcif_stream *stream,
 					     enum rkcif_yuvaddr_state stat)
 {
 	struct rkcif_device *dev = stream->cifdev;
+	struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf;
 	struct rkcif_buffer *buffer = NULL;
 	u32 frm_addr_y = CIF_REG_DVP_FRM0_ADDR_Y;
 	u32 frm_addr_uv = CIF_REG_DVP_FRM0_ADDR_UV;
@@ -1184,6 +1185,13 @@ static int rkcif_assign_new_buffer_oneframe(struct rkcif_stream *stream,
 					     stream->curr_buf->buff_addr[RKCIF_PLANE_Y]);
 			rkcif_write_register(dev, CIF_REG_DVP_FRM0_ADDR_UV,
 					     stream->curr_buf->buff_addr[RKCIF_PLANE_CBCR]);
+		} else {
+			if (dummy_buf->vaddr) {
+				rkcif_write_register(dev, CIF_REG_DVP_FRM0_ADDR_Y,
+						     dummy_buf->dma_addr);
+				rkcif_write_register(dev, CIF_REG_DVP_FRM0_ADDR_UV,
+						     dummy_buf->dma_addr);
+			}
 		}
 
 		if (!stream->next_buf) {
@@ -1199,6 +1207,13 @@ static int rkcif_assign_new_buffer_oneframe(struct rkcif_stream *stream,
 					     stream->next_buf->buff_addr[RKCIF_PLANE_Y]);
 			rkcif_write_register(dev, CIF_REG_DVP_FRM1_ADDR_UV,
 					     stream->next_buf->buff_addr[RKCIF_PLANE_CBCR]);
+		} else {
+			if (dummy_buf->vaddr) {
+				rkcif_write_register(dev, CIF_REG_DVP_FRM1_ADDR_Y,
+						     dummy_buf->dma_addr);
+				rkcif_write_register(dev, CIF_REG_DVP_FRM1_ADDR_UV,
+						     dummy_buf->dma_addr);
+			}
 		}
 	} else if (stat == RKCIF_YUV_ADDR_STATE_UPDATE) {
 		if (!list_empty(&stream->buf_head)) {
@@ -1214,6 +1229,10 @@ static int rkcif_assign_new_buffer_oneframe(struct rkcif_stream *stream,
 				buffer = stream->next_buf;
 			}
 		} else {
+			if (dummy_buf->vaddr && stream->frame_phase == CIF_CSI_FRAME0_READY)
+				stream->curr_buf = NULL;
+			if (dummy_buf->vaddr && stream->frame_phase == CIF_CSI_FRAME1_READY)
+				stream->next_buf = NULL;
 			buffer = NULL;
 		}
 		if (stream->frame_phase == CIF_CSI_FRAME0_READY) {
@@ -1230,7 +1249,14 @@ static int rkcif_assign_new_buffer_oneframe(struct rkcif_stream *stream,
 			rkcif_write_register(dev, frm_addr_uv,
 					     buffer->buff_addr[RKCIF_PLANE_CBCR]);
 		} else {
-			ret = -EINVAL;
+			if (dummy_buf->vaddr) {
+				rkcif_write_register(dev, frm_addr_y,
+					     dummy_buf->dma_addr);
+				rkcif_write_register(dev, frm_addr_uv,
+					     dummy_buf->dma_addr);
+			} else {
+				ret = -EINVAL;
+			}
 			v4l2_dbg(1, rkcif_debug, &dev->v4l2_dev,
 				 "not active buffer, frame Drop\n");
 		}
@@ -1280,6 +1306,12 @@ static void rkcif_assign_new_buffer_init(struct rkcif_stream *stream,
 		if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
 			rkcif_write_register(dev, frm0_addr_uv,
 					     stream->curr_buf->buff_addr[RKCIF_PLANE_CBCR]);
+	} else {
+		if (dummy_buf->vaddr) {
+			rkcif_write_register(dev, frm0_addr_y, dummy_buf->dma_addr);
+			if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
+				rkcif_write_register(dev, frm0_addr_uv, dummy_buf->dma_addr);
+		}
 	}
 
 	if (stream->cif_fmt_in->field == V4L2_FIELD_INTERLACED) {
@@ -1306,6 +1338,12 @@ static void rkcif_assign_new_buffer_init(struct rkcif_stream *stream,
 			if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
 				rkcif_write_register(dev, frm1_addr_uv,
 						     stream->next_buf->buff_addr[RKCIF_PLANE_CBCR]);
+		} else {
+			if (dummy_buf->vaddr) {
+				rkcif_write_register(dev, frm1_addr_y, dummy_buf->dma_addr);
+				if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
+					rkcif_write_register(dev, frm1_addr_uv, dummy_buf->dma_addr);
+			}
 		}
 	}
 	spin_unlock_irqrestore(&stream->vbq_lock, flags);
@@ -1344,6 +1382,7 @@ static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
 					   int channel_id)
 {
 	struct rkcif_device *dev = stream->cifdev;
+	struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf;
 	struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus;
 	struct rkcif_buffer *buffer = NULL;
 	u32 frm_addr_y, frm_addr_uv;
@@ -1370,6 +1409,10 @@ static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
 
 	spin_lock_irqsave(&stream->vbq_lock, flags);
 	if (!list_empty(&stream->buf_head)) {
+		if (!dummy_buf->vaddr &&
+		    stream->curr_buf == stream->next_buf &&
+		    stream->cif_fmt_in->field != V4L2_FIELD_INTERLACED)
+			ret = -EINVAL;
 		if (stream->frame_phase == CIF_CSI_FRAME0_READY) {
 			stream->curr_buf = list_first_entry(&stream->buf_head,
 							    struct rkcif_buffer, queue);
@@ -1393,6 +1436,22 @@ static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
 		}
 	} else {
 		buffer = NULL;
+		if (dummy_buf->vaddr) {
+			if (stream->frame_phase == CIF_CSI_FRAME0_READY)
+				stream->curr_buf = NULL;
+			else if (stream->frame_phase == CIF_CSI_FRAME1_READY)
+				stream->next_buf = NULL;
+		} else if (stream->curr_buf != stream->next_buf) {
+			if (stream->frame_phase == CIF_CSI_FRAME0_READY) {
+				stream->curr_buf = stream->next_buf;
+				buffer = stream->next_buf;
+			} else if (stream->frame_phase == CIF_CSI_FRAME1_READY) {
+				stream->next_buf = stream->curr_buf;
+				buffer = stream->curr_buf;
+			}
+
+		}
+
 	}
 	spin_unlock_irqrestore(&stream->vbq_lock, flags);
 
@@ -1412,7 +1471,13 @@ static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
 						     buffer->buff_addr[RKCIF_PLANE_CBCR]);
 		}
 	} else {
-		ret = -EINVAL;
+		if (dummy_buf->vaddr) {
+			rkcif_write_register(dev, frm_addr_y, dummy_buf->dma_addr);
+			if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
+				rkcif_write_register(dev, frm_addr_uv, dummy_buf->dma_addr);
+		} else {
+			ret = -EINVAL;
+		}
 		v4l2_info(&dev->v4l2_dev,
 			 "not active buffer, skip current frame, %s stream[%d]\n",
 			 (mbus_cfg->type == V4L2_MBUS_CSI2 ||
@@ -1424,11 +1489,16 @@ static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
 
 static int rkcif_get_new_buffer_wake_up_mode(struct rkcif_stream *stream)
 {
+	struct rkcif_device *dev = stream->cifdev;
+	struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf;
 	int ret = 0;
 	unsigned long flags;
 
 	spin_lock_irqsave(&stream->vbq_lock, flags);
 	if (!list_empty(&stream->buf_head)) {
+		if (!dummy_buf->vaddr &&
+		    stream->curr_buf == stream->next_buf)
+			ret = -EINVAL;
 		if (stream->line_int_cnt % 2) {
 			stream->curr_buf = list_first_entry(&stream->buf_head,
 							    struct rkcif_buffer, queue);
@@ -1442,8 +1512,21 @@ static int rkcif_get_new_buffer_wake_up_mode(struct rkcif_stream *stream)
 		}
 		stream->is_buf_active = true;
 	} else {
-		ret = -EINVAL;
 		stream->is_buf_active = false;
+		if (dummy_buf->vaddr) {
+			if (stream->line_int_cnt % 2)
+				stream->curr_buf = NULL;
+			else
+				stream->next_buf = NULL;
+		} else if (stream->curr_buf != stream->next_buf) {
+			if (stream->line_int_cnt % 2)
+				stream->curr_buf = stream->next_buf;
+			else
+				stream->next_buf = stream->curr_buf;
+			stream->is_buf_active = true;
+		} else {
+			ret = -EINVAL;
+		}
 	}
 	spin_unlock_irqrestore(&stream->vbq_lock, flags);
 
@@ -1453,6 +1536,7 @@ static int rkcif_get_new_buffer_wake_up_mode(struct rkcif_stream *stream)
 static int rkcif_update_new_buffer_wake_up_mode(struct rkcif_stream *stream)
 {
 	struct rkcif_device *dev = stream->cifdev;
+	struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf;
 	struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus;
 	struct rkcif_buffer *buffer = NULL;
 	u32 frm_addr_y, frm_addr_uv;
@@ -1490,7 +1574,13 @@ static int rkcif_update_new_buffer_wake_up_mode(struct rkcif_stream *stream)
 			rkcif_write_register(dev, frm_addr_uv,
 					     buffer->buff_addr[RKCIF_PLANE_CBCR]);
 	} else {
-		ret = -EINVAL;
+		if (dummy_buf->vaddr) {
+			rkcif_write_register(dev, frm_addr_y, dummy_buf->dma_addr);
+			if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
+				rkcif_write_register(dev, frm_addr_uv, dummy_buf->dma_addr);
+		} else {
+			ret = -EINVAL;
+		}
 		v4l2_info(&dev->v4l2_dev,
 			 "not active buffer, skip current frame, %s stream[%d]\n",
 			 (mbus_cfg->type == V4L2_MBUS_CSI2 ||
@@ -2894,8 +2984,8 @@ static int rkcif_start_streaming(struct vb2_queue *queue, unsigned int count)
 	if (ret < 0)
 		goto destroy_buf;
 
-	if (dev->active_sensor &&
-	    dev->active_sensor->mbus.type == V4L2_MBUS_BT656 &&
+	if (((dev->active_sensor && dev->active_sensor->mbus.type == V4L2_MBUS_BT656) ||
+	     dev->is_use_dummybuf) &&
 	    (!dev->dummy_buf.vaddr)) {
 		ret = rkcif_create_dummy_buf(stream);
 		if (ret < 0) {
@@ -3034,7 +3124,10 @@ static int rkcif_init_vb2_queue(struct vb2_queue *q,
 	else
 		q->mem_ops = &vb2_dma_contig_memops;
 	q->buf_struct_size = sizeof(struct rkcif_buffer);
-	q->min_buffers_needed = CIF_REQ_BUFS_MIN;
+	if (stream->cifdev->is_use_dummybuf)
+		q->min_buffers_needed = 1;
+	else
+		q->min_buffers_needed = CIF_REQ_BUFS_MIN;
 	q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 	q->lock = &stream->vnode.vlock;
 	q->dev = hw_dev->dev;
@@ -4920,7 +5013,8 @@ static void rkcif_buf_done_prepare(struct rkcif_stream *stream,
 					cif_dev->rdbk_buf[RDBK_L]->vb.vb2_buf.state = VB2_BUF_STATE_ACTIVE;
 					rkcif_buf_queue(&cif_dev->rdbk_buf[RDBK_L]->vb.vb2_buf);
 				}
-				cif_dev->rdbk_buf[RDBK_L] = active_buf;
+				if (active_buf)
+					cif_dev->rdbk_buf[RDBK_L] = active_buf;
 			} else if (mipi_id == RKCIF_STREAM_MIPI_ID1) {
 				if (cif_dev->rdbk_buf[RDBK_M]) {
 					v4l2_err(&cif_dev->v4l2_dev,
@@ -4931,8 +5025,8 @@ static void rkcif_buf_done_prepare(struct rkcif_stream *stream,
 					cif_dev->rdbk_buf[RDBK_M]->vb.vb2_buf.state = VB2_BUF_STATE_ACTIVE;
 					rkcif_buf_queue(&cif_dev->rdbk_buf[RDBK_M]->vb.vb2_buf);
 				}
-
-				cif_dev->rdbk_buf[RDBK_M] = active_buf;
+				if (active_buf)
+					cif_dev->rdbk_buf[RDBK_M] = active_buf;
 				if (cif_dev->hdr.mode == HDR_X2)
 					rkcif_rdbk_frame_end(stream);
 			} else if (mipi_id == RKCIF_STREAM_MIPI_ID2) {
@@ -4945,7 +5039,8 @@ static void rkcif_buf_done_prepare(struct rkcif_stream *stream,
 					cif_dev->rdbk_buf[RDBK_S]->vb.vb2_buf.state = VB2_BUF_STATE_ACTIVE;
 					rkcif_buf_queue(&cif_dev->rdbk_buf[RDBK_S]->vb.vb2_buf);
 				}
-				cif_dev->rdbk_buf[RDBK_S] = active_buf;
+				if (active_buf)
+					cif_dev->rdbk_buf[RDBK_S] = active_buf;
 				if (cif_dev->hdr.mode == HDR_X3)
 					rkcif_rdbk_frame_end(stream);
 			}
@@ -5016,10 +5111,12 @@ static void rkcif_deal_readout_time(struct rkcif_stream *stream)
 
 	} else if ((cif_dev->hdr.mode == HDR_X2) && (stream->id == RKCIF_STREAM_MIPI_ID1)) {
 		detect_stream->readout.early_time = stream->readout.fe_timestamp - stream->readout.wk_timestamp;
-		detect_stream->readout.total_time = stream->readout.fe_timestamp - detect_stream->readout.fs_timestamp;
+		detect_stream->readout.total_time = stream->readout.fe_timestamp - detect_stream->readout.fe_timestamp;
+		detect_stream->readout.total_time += detect_stream->readout.readout_time;
 	} else if ((cif_dev->hdr.mode == HDR_X3) && (stream->id == RKCIF_STREAM_MIPI_ID2)) {
 		detect_stream->readout.early_time = stream->readout.fe_timestamp - stream->readout.wk_timestamp;
-		detect_stream->readout.total_time = stream->readout.fe_timestamp - detect_stream->readout.fs_timestamp;
+		detect_stream->readout.total_time = stream->readout.fe_timestamp - detect_stream->readout.fe_timestamp;
+		detect_stream->readout.total_time += detect_stream->readout.readout_time;
 	}
 	if (!stream->is_line_wake_up)
 		detect_stream->readout.early_time = 0;
@@ -5059,7 +5156,8 @@ static void rkcif_update_stream(struct rkcif_device *cif_dev,
 			cif_dev->buf_wake_up_cnt += 1;
 	}
 
-	rkcif_deal_readout_time(stream);
+	if (cif_dev->inf_id == RKCIF_MIPI_LVDS)
+		rkcif_deal_readout_time(stream);
 
 	if (!stream->is_line_wake_up) {
 		ret = rkcif_assign_new_buffer_pingpong(stream,
diff --git a/drivers/media/platform/rockchip/cif/dev.c b/drivers/media/platform/rockchip/cif/dev.c
index 5fe6aec953af..445a3ca864e7 100644
--- a/drivers/media/platform/rockchip/cif/dev.c
+++ b/drivers/media/platform/rockchip/cif/dev.c
@@ -120,15 +120,52 @@ static ssize_t rkcif_store_line_int_num(struct device *dev,
 	return len;
 }
 
+static ssize_t rkcif_show_dummybuf_mode(struct device *dev,
+					      struct device_attribute *attr,
+					      char *buf)
+{
+	struct rkcif_device *cif_dev = (struct rkcif_device *)dev_get_drvdata(dev);
+	int ret;
+
+	ret = snprintf(buf, PAGE_SIZE, "%d\n",
+		       cif_dev->is_use_dummybuf);
+	return ret;
+}
+
+static ssize_t rkcif_store_dummybuf_mode(struct device *dev,
+					       struct device_attribute *attr,
+					       const char *buf, size_t len)
+{
+	struct rkcif_device *cif_dev = (struct rkcif_device *)dev_get_drvdata(dev);
+	int val = 0;
+	int ret = 0;
+
+	ret = kstrtoint(buf, 0, &val);
+	if (!ret) {
+		if (val)
+			cif_dev->is_use_dummybuf = true;
+		else
+			cif_dev->is_use_dummybuf = false;
+	} else {
+		dev_info(cif_dev->dev, "set dummy buf mode failed\n");
+	}
+	return len;
+}
+
 static DEVICE_ATTR(compact_test, S_IWUSR | S_IRUSR,
 		   rkcif_show_compact_mode, rkcif_store_compact_mode);
 
 static DEVICE_ATTR(wait_line, S_IWUSR | S_IRUSR,
 		   rkcif_show_line_int_num, rkcif_store_line_int_num);
 
+static DEVICE_ATTR(is_use_dummybuf, S_IWUSR | S_IRUSR,
+		   rkcif_show_dummybuf_mode, rkcif_store_dummybuf_mode);
+
+
 static struct attribute *dev_attrs[] = {
 	&dev_attr_compact_test.attr,
 	&dev_attr_wait_line.attr,
+	&dev_attr_is_use_dummybuf.attr,
 	NULL,
 };
 
@@ -1096,6 +1133,12 @@ int rkcif_plat_init(struct rkcif_device *cif_dev, struct device_node *node, int
 	cif_dev->workmode = RKCIF_WORKMODE_PINGPONG;
 #endif
 
+#if defined(CONFIG_ROCKCHIP_CIF_USE_DUMMY_BUF)
+	cif_dev->is_use_dummybuf = true;
+#else
+	cif_dev->is_use_dummybuf = false;
+#endif
+
 	strlcpy(cif_dev->media_dev.model, dev_name(dev),
 		sizeof(cif_dev->media_dev.model));
 	cif_dev->media_dev.dev = dev;
@@ -1226,9 +1269,6 @@ static int rkcif_plat_probe(struct platform_device *pdev)
 	dev_set_drvdata(dev, cif_dev);
 	cif_dev->dev = dev;
 
-	if (sysfs_create_group(&pdev->dev.kobj, &dev_attr_grp))
-		return -ENODEV;
-
 	rkcif_attach_hw(cif_dev);
 
 	rkcif_parse_dts(cif_dev);
@@ -1239,6 +1279,9 @@ static int rkcif_plat_probe(struct platform_device *pdev)
 		return ret;
 	}
 
+	if (sysfs_create_group(&pdev->dev.kobj, &dev_attr_grp))
+		return -ENODEV;
+
 	if (rkcif_proc_init(cif_dev))
 		dev_warn(dev, "dev:%s create proc failed\n", dev_name(dev));
 
@@ -1257,6 +1300,7 @@ static int rkcif_plat_remove(struct platform_device *pdev)
 	rkcif_detach_hw(cif_dev);
 	rkcif_proc_cleanup(cif_dev);
 	rkcif_csi2_unregister_notifier(&cif_dev->reset_notifier);
+	sysfs_remove_group(&pdev->dev.kobj, &dev_attr_grp);
 	del_timer_sync(&cif_dev->reset_watchdog_timer.timer);
 
 	return 0;
diff --git a/drivers/media/platform/rockchip/cif/dev.h b/drivers/media/platform/rockchip/cif/dev.h
index 333852216fdc..812432f1cc2f 100644
--- a/drivers/media/platform/rockchip/cif/dev.h
+++ b/drivers/media/platform/rockchip/cif/dev.h
@@ -551,6 +551,7 @@ struct rkcif_device {
 	bool				is_start_hdr;
 	bool				reset_work_cancel;
 	bool				iommu_en;
+	bool				is_use_dummybuf;
 };
 
 extern struct platform_driver rkcif_plat_drv;
diff --git a/drivers/media/platform/rockchip/cif/procfs.c b/drivers/media/platform/rockchip/cif/procfs.c
index e77b2c8fe6ac..0895f06a71a1 100644
--- a/drivers/media/platform/rockchip/cif/procfs.c
+++ b/drivers/media/platform/rockchip/cif/procfs.c
@@ -315,17 +315,19 @@ static void rkcif_show_format(struct rkcif_device *dev, struct seq_file *f)
 			   dev->channels[0].crop_st_x, dev->channels[0].crop_st_y);
 		seq_printf(f, "\tcompact:%s\n", stream->is_compact ? "enable" : "disabled");
 		seq_printf(f, "\tframe amount:%d\n", stream->frame_idx);
-		time_val = div_u64(stream->readout.early_time, 1000000);
-		seq_printf(f, "\tearly:%u ms\n", time_val);
-		if (dev->hdr.mode == NO_HDR) {
-			time_val = div_u64(stream->readout.readout_time, 1000000);
-			seq_printf(f, "\treadout:%u ms\n", time_val);
-		} else {
-			time_val = div_u64(stream->readout.readout_time, 1000000);
-			seq_printf(f, "\tsingle readout:%u ms\n", time_val);
-			time_val = div_u64(stream->readout.total_time, 1000000);
-			seq_printf(f, "\ttotal readout:%u ms\n", time_val);
+		if (dev->inf_id == RKCIF_MIPI_LVDS) {
+			time_val = div_u64(stream->readout.early_time, 1000000);
+			seq_printf(f, "\tearly:%u ms\n", time_val);
+			if (dev->hdr.mode == NO_HDR) {
+				time_val = div_u64(stream->readout.readout_time, 1000000);
+				seq_printf(f, "\treadout:%u ms\n", time_val);
+			} else {
+				time_val = div_u64(stream->readout.readout_time, 1000000);
+				seq_printf(f, "\tsingle readout:%u ms\n", time_val);
+				time_val = div_u64(stream->readout.total_time, 1000000);
+				seq_printf(f, "\ttotal readout:%u ms\n", time_val);
 
+			}
 		}
 		seq_printf(f, "\trate:%llu ms\n", fps);
 		fps = div_u64(1000, fps);

commit 662b81ed7932a22e7d5156f1601c733d0a404d7f
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Tue Aug 24 18:23:53 2021 +0800

    media: i2c: imx335 increase hdr exposure restrictions
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: Ia097778ddd050a566801cede46f575f6954b01d7

diff --git a/drivers/media/i2c/imx335.c b/drivers/media/i2c/imx335.c
index 772a817b9dd4..91acf1833fba 100644
--- a/drivers/media/i2c/imx335.c
+++ b/drivers/media/i2c/imx335.c
@@ -10,6 +10,7 @@
  * V0.0X01.0X03 add hdr_mode in enum frame interval
  * V0.0X01.0X04 fix hdr ae error
  * V0.0X01.0X05 add quick stream on/off
+ * V0.0X01.0X06 Increase hdr exposure restrictions
  */
 
 #define DEBUG
@@ -32,7 +33,7 @@
 #include <linux/pinctrl/consumer.h>
 #include <linux/rk-preisp.h>
 
-#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x05)
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x06)
 
 #ifndef V4L2_CID_DIGITAL_GAIN
 #define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
@@ -924,7 +925,14 @@ static int imx335_set_hdrae(struct imx335 *imx335,
 
 	rhs1_max = min(RHS1_MAX, shr0 - SHR1_MIN);
 	rhs1_max = (rhs1_max & ~0x7) + 2;
-	rhs1_min = (SHR1_MIN + 4u + 7u) / 8 * 8 + 2;
+	rhs1_min = max(SHR1_MIN + 4u, rhs1_old + 2 * BRL - fsc + 2);
+	rhs1_min = (rhs1_min + 7u) / 8 * 8 + 2;
+	if (rhs1_max < rhs1_min) {
+		dev_err(&client->dev,
+			"The total exposure limit makes rhs1 max is %d,but old rhs1 limit makes rhs1 min is %d\n",
+			rhs1_max, rhs1_min);
+		return -EINVAL;
+	}
 
 	rhs1 = SHR1_MIN + s_exp_time;
 	rhs1 = (rhs1 + 7u) / 8 * 8 + 2; /* shall be 8n + 2 */
@@ -932,7 +940,6 @@ static int imx335_set_hdrae(struct imx335 *imx335,
 		rhs1 = rhs1_max;
 	if (rhs1 < rhs1_min)
 		rhs1 = rhs1_min;
-
 	dev_dbg(&client->dev,
 		"line(%d) rhs1 %d, short time %d rhs1_old %d, rhs1_new %d, rhs1_min %d rhs1_max %d\n",
 		__LINE__, rhs1, s_exp_time, rhs1_old, rhs1, rhs1_min, rhs1_max);
@@ -1106,6 +1113,12 @@ static int imx335_set_hdrae_3frame(struct imx335 *imx335,
 	rhs1_change_limit = rhs1_old + 3 * BRL - fsc + 3;
 	rhs1_change_limit = (rhs1_change_limit < 32) ? 32 : rhs1_change_limit;
 	rhs1_change_limit = (rhs1_change_limit + 11) / 12 * 12 + 2;
+	if (rhs1_max < rhs1_change_limit) {
+		dev_err(&client->dev,
+			"The total exposure limit makes rhs1 max is %d,but old rhs1 limit makes rhs1 min is %d\n",
+			rhs1_max, rhs1_change_limit);
+		return -EINVAL;
+	}
 	if (rhs1 < rhs1_change_limit)
 		rhs1 = rhs1_change_limit;
 
@@ -1137,6 +1150,12 @@ static int imx335_set_hdrae_3frame(struct imx335 *imx335,
 	rhs2_change_limit = rhs2_old + 3 * BRL - fsc + 3;
 	rhs2_change_limit = (rhs2_change_limit < 64) ?  64 : rhs2_change_limit;
 	rhs2_change_limit = (rhs2_change_limit + 11) / 12 * 12 + 4;
+	if ((shr0 - 26) < rhs2_change_limit) {
+		dev_err(&client->dev,
+			"The total exposure limit makes rhs2 max is %d,but old rhs1 limit makes rhs2 min is %d\n",
+			shr0 - 26, rhs2_change_limit);
+		return -EINVAL;
+	}
 	if (rhs2 < rhs2_change_limit)
 		rhs2 = rhs2_change_limit;
 

commit a569e31cd0781063f1f5450a35260dc07b9bbeff
Author: Finley Xiao <finley.xiao@rock-chips.com>
Date:   Mon Aug 16 18:12:19 2021 +0800

    arm64: dts: rockchip: rk3568: Add cpu bandwidth for dmc
    
    Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
    Change-Id: Ia29bfccacb72fa1f9f9fbeb68e23aa2b51b25563

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index 003f33661a12..a18054fb66c3 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -2144,7 +2144,7 @@
 		compatible = "rockchip,rk3568-dmc";
 		interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>;
 		interrupt-names = "complete";
-		devfreq-events = <&dfi>;
+		devfreq-events = <&dfi>, <&nocp_cpu>;
 		clocks = <&scmi_clk 3>;
 		clock-names = "dmc_clk";
 		operating-points-v2 = <&dmc_opp_table>;
@@ -2154,6 +2154,12 @@
 			0	572	324000
 			573	99999	528000
 		>;
+		cpu-bw-dmc-freq = <
+		/* min_bw(MB/s) max_bw(MB/s) freq(KHz) */
+			0	350	324000
+			351	400	528000
+			401	99999	780000
+		>;
 		upthreshold = <40>;
 		downdifferential = <20>;
 		system-status-level = <

commit 05ecfc59fb625964ba535b16a88b6ff7ceb16834
Author: Finley Xiao <finley.xiao@rock-chips.com>
Date:   Mon Aug 16 18:11:31 2021 +0800

    arm64: dts: rockchip: rk3568: Add nocp device node
    
    Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
    Change-Id: I6b429393383588d7fc763bc0947a793c10bbb0ef

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index 10e629747dc5..003f33661a12 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -1958,6 +1958,31 @@
 		};
 	};
 
+	nocp_cpu: nocp-cpu@fe102000 {
+		compatible = "rockchip,rk3568-nocp";
+		reg = <0x0 0xfe102000 0x0 0x100>;
+	};
+
+	nocp_gpu_vpu_rga_venc: nocp-gpu-vpu-rga-venc@fe102400 {
+		compatible = "rockchip,rk3568-nocp";
+		reg = <0x0 0xfe102400 0x0 0x100>;
+	};
+
+	nocp_npu_vdec: nocp-vdec@fe102800 {
+		compatible = "rockchip,rk3568-nocp";
+		reg = <0x0 0xfe102800 0x0 0x100>;
+	};
+
+	nocp_vi_usb_peri_pipe: nocp-vi-usb-peri-pipe@fe102c00 {
+		compatible = "rockchip,rk3568-nocp";
+		reg = <0x0 0xfe102c00 0x0 0x100>;
+	};
+
+	nocp_vo: nocp-vo@fe103000 {
+		compatible = "rockchip,rk3568-nocp";
+		reg = <0x0 0xfe103000 0x0 0x100>;
+	};
+
 	qos_gpu: qos@fe128000 {
 		compatible = "syscon";
 		reg = <0x0 0xfe128000 0x0 0x20>;

commit 53cd8399389516c81c784431bc754821758d2287
Author: Finley Xiao <finley.xiao@rock-chips.com>
Date:   Mon Aug 16 17:15:28 2021 +0800

    PM / devfreq: rockchip_dmc: Change frequency according to cpu bandwidth
    
    Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
    Change-Id: I69376a2e620292642b1118f770c50f9002c450b4

diff --git a/drivers/devfreq/rockchip_dmc.c b/drivers/devfreq/rockchip_dmc.c
index 644da8a32182..e62e56fffed2 100644
--- a/drivers/devfreq/rockchip_dmc.c
+++ b/drivers/devfreq/rockchip_dmc.c
@@ -138,6 +138,7 @@ struct rockchip_dmcfreq {
 	struct notifier_block status_nb;
 	struct list_head video_info_list;
 	struct freq_map_table *vop_bw_tbl;
+	struct freq_map_table *cpu_bw_tbl;
 	struct work_struct boost_work;
 	struct input_handler input_handler;
 	struct monitor_dev_info *mdev_info;
@@ -179,6 +180,7 @@ struct rockchip_dmcfreq {
 	unsigned int read_latency;
 	int edev_count;
 	int dfi_id;
+	int nocp_cpu_id;
 
 	bool is_fixed;
 	bool is_msch_rl_work_started;
@@ -568,32 +570,24 @@ static int rockchip_dmcfreq_get_dev_status(struct device *dev,
 {
 	struct rockchip_dmcfreq *dmcfreq = dev_get_drvdata(dev);
 	struct devfreq_event_data edata;
-	int i, j, ret = 0;
+	int i, ret = 0;
 
 	if (!dmcfreq->auto_freq_en)
 		return -EINVAL;
 
-	if (dmcfreq->dfi_id >= 0) {
-		ret = devfreq_event_get_event(dmcfreq->edev[dmcfreq->dfi_id],
-					      &edata);
-		if (ret < 0) {
-			dev_err(dev, "failed to get dfi event\n");
-			return ret;
-		}
-		stat->busy_time = edata.load_count;
-		stat->total_time = edata.total_count;
-	}
-
-	for (i = 0, j = 0; i < dmcfreq->edev_count; i++) {
-		if (i == dmcfreq->dfi_id)
-			continue;
+	for (i = 0; i < dmcfreq->edev_count; i++) {
 		ret = devfreq_event_get_event(dmcfreq->edev[i], &edata);
 		if (ret < 0) {
 			dev_err(dev, "failed to get event %s\n",
 				dmcfreq->edev[i]->desc->name);
 			return ret;
 		}
-		dmcfreq->nocp_bw[j++] = edata.load_count;
+		if (i == dmcfreq->dfi_id) {
+			stat->busy_time = edata.load_count;
+			stat->total_time = edata.total_count;
+		} else {
+			dmcfreq->nocp_bw[i] = edata.load_count;
+		}
 	}
 
 	return 0;
@@ -2608,6 +2602,25 @@ int rockchip_dmcfreq_vop_bandwidth_request(struct devfreq *devfreq,
 }
 EXPORT_SYMBOL(rockchip_dmcfreq_vop_bandwidth_request);
 
+static unsigned long get_nocp_req_rate(struct rockchip_dmcfreq *dmcfreq)
+{
+	unsigned long target = 0, cpu_bw = 0;
+	int i;
+
+	if (!dmcfreq->cpu_bw_tbl || dmcfreq->nocp_cpu_id < 0)
+		goto out;
+
+	cpu_bw = dmcfreq->nocp_bw[dmcfreq->nocp_cpu_id];
+
+	for (i = 0; dmcfreq->cpu_bw_tbl[i].freq != CPUFREQ_TABLE_END; i++) {
+		if (cpu_bw >= dmcfreq->cpu_bw_tbl[i].min)
+			target = dmcfreq->cpu_bw_tbl[i].freq;
+	}
+
+out:
+	return target;
+}
+
 static int devfreq_dmc_ondemand_func(struct devfreq *df,
 				     unsigned long *freq)
 {
@@ -2618,7 +2631,7 @@ static int devfreq_dmc_ondemand_func(struct devfreq *df,
 	struct rockchip_dmcfreq_ondemand_data *data = &dmcfreq->ondemand_data;
 	unsigned int upthreshold = data->upthreshold;
 	unsigned int downdifferential = data->downdifferential;
-	unsigned long target_freq = 0;
+	unsigned long target_freq = 0, nocp_req_rate = 0;
 	u64 now;
 
 	if (dmcfreq->auto_freq_en && !dmcfreq->is_fixed) {
@@ -2626,12 +2639,12 @@ static int devfreq_dmc_ondemand_func(struct devfreq *df,
 			target_freq = dmcfreq->status_rate;
 		else if (dmcfreq->auto_min_rate)
 			target_freq = dmcfreq->auto_min_rate;
+		nocp_req_rate = get_nocp_req_rate(dmcfreq);
+		target_freq = max3(target_freq, nocp_req_rate,
+				   dmcfreq->vop_req_rate);
 		now = ktime_to_us(ktime_get());
 		if (now < dmcfreq->touchboostpulse_endtime)
-			target_freq = max3(target_freq, dmcfreq->vop_req_rate,
-					   dmcfreq->boost_rate);
-		else
-			target_freq = max(target_freq, dmcfreq->vop_req_rate);
+			target_freq = max(target_freq, dmcfreq->boost_rate);
 	} else {
 		if (dmcfreq->status_rate)
 			target_freq = dmcfreq->status_rate;
@@ -2851,10 +2864,7 @@ static int rockchip_dmcfreq_get_event(struct rockchip_dmcfreq *dmcfreq)
 	}
 	dmcfreq->auto_freq_en = true;
 	dmcfreq->dfi_id = rockchip_get_edev_id(dmcfreq, "dfi");
-	if (dmcfreq->dfi_id >= 0)
-		available_count--;
-	if (available_count <= 0)
-		return 0;
+	dmcfreq->nocp_cpu_id = rockchip_get_edev_id(dmcfreq, "nocp-cpu");
 	dmcfreq->nocp_bw =
 		devm_kzalloc(dev, sizeof(*dmcfreq->nocp_bw) * available_count,
 			     GFP_KERNEL);
@@ -2928,6 +2938,10 @@ static void rockchip_dmcfreq_parse_dt(struct rockchip_dmcfreq *dmcfreq)
 			     (u32 *)&dmcfreq->auto_min_rate);
 	dmcfreq->auto_min_rate *= 1000;
 
+	if (rockchip_get_freq_map_talbe(np, "cpu-bw-dmc-freq",
+					&dmcfreq->cpu_bw_tbl))
+		dev_dbg(dev, "failed to get cpu bandwidth to dmc rate\n");
+
 	if (rockchip_get_freq_map_talbe(np, "vop-bw-dmc-freq",
 					&dmcfreq->vop_bw_tbl))
 		dev_err(dev, "failed to get vop bandwidth to dmc rate\n");

commit d9106d56d5f1994db093e62445f58b82d4dc0804
Author: Finley Xiao <finley.xiao@rock-chips.com>
Date:   Mon Aug 16 18:09:18 2021 +0800

    PM / devfreq: rockchip-nocp: Add support for rk3568
    
    Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
    Change-Id: I2d311d48a54a1f254eda749aa6d9d157d106e02b

diff --git a/Documentation/devicetree/bindings/devfreq/event/rockchip-nocp.txt b/Documentation/devicetree/bindings/devfreq/event/rockchip-nocp.txt
index 7266a9c65ada..77c504ff883d 100644
--- a/Documentation/devicetree/bindings/devfreq/event/rockchip-nocp.txt
+++ b/Documentation/devicetree/bindings/devfreq/event/rockchip-nocp.txt
@@ -13,6 +13,7 @@ Required properties:
   - "rockchip,rk3288-nocp" - for RK3288 SoC.
   - "rockchip,rk3368-nocp" - for RK3368 SoC.
   - "rockchip,rk3399-nocp" - for RK3399 SoC.
+  - "rockchip,rk3568-nocp" - for RK3568 SoC.
 - reg: physical base address of each NoC Probe and length of memory mapped region.
 
 Example : NoC Probe nodes in Device Tree are listed below.
diff --git a/drivers/devfreq/event/rockchip-nocp.c b/drivers/devfreq/event/rockchip-nocp.c
index 957b84ee3290..954a27d3ff75 100644
--- a/drivers/devfreq/event/rockchip-nocp.c
+++ b/drivers/devfreq/event/rockchip-nocp.c
@@ -17,6 +17,7 @@
 #include <linux/mfd/syscon.h>
 #include <linux/module.h>
 #include <linux/of.h>
+#include <linux/of_device.h>
 #include <linux/platform_device.h>
 
 #define EVENT_BYTE		0x08
@@ -30,29 +31,34 @@
 #define PROBE_CFGCTL		0x000c
 #define PROBE_STATPERIOD	0x0024
 #define PROBE_STATGO		0x0028
-#define PROBE_COUNTERS_0_SRC	0x0138
-#define PROBE_COUNTERS_0_VAL	0x013c
-#define PROBE_COUNTERS_1_SRC	0x014c
-#define PROBE_COUNTERS_1_VAL	0x0150
+
+struct nocp_info {
+	u32 counter0_src;
+	u32 counter0_val;
+	u32 counter1_src;
+	u32 counter1_val;
+};
 
 struct rockchip_nocp {
 	void __iomem *reg_base;
 	struct device *dev;
 	struct devfreq_event_dev *edev;
 	struct devfreq_event_desc *desc;
+	const struct nocp_info *info;
 	ktime_t time;
 };
 
 static int rockchip_nocp_enable(struct devfreq_event_dev *edev)
 {
 	struct rockchip_nocp *nocp = devfreq_event_get_drvdata(edev);
+	const struct nocp_info *info = nocp->info;
 	void __iomem *reg_base = nocp->reg_base;
 
 	writel_relaxed(GLOBAL_EN, reg_base + PROBE_CFGCTL);
 	writel_relaxed(START_EN, reg_base + PROBE_MAINCTL);
 	writel_relaxed(0, reg_base + PROBE_STATPERIOD);
-	writel_relaxed(EVENT_BYTE, reg_base + PROBE_COUNTERS_0_SRC);
-	writel_relaxed(EVENT_CHAIN, reg_base + PROBE_COUNTERS_1_SRC);
+	writel_relaxed(EVENT_BYTE, reg_base + info->counter0_src);
+	writel_relaxed(EVENT_CHAIN, reg_base + info->counter1_src);
 	writel_relaxed(START_GO, reg_base + PROBE_STATGO);
 
 	nocp->time = ktime_get();
@@ -63,13 +69,14 @@ static int rockchip_nocp_enable(struct devfreq_event_dev *edev)
 static int rockchip_nocp_disable(struct devfreq_event_dev *edev)
 {
 	struct rockchip_nocp *nocp = devfreq_event_get_drvdata(edev);
+	const struct nocp_info *info = nocp->info;
 	void __iomem *reg_base = nocp->reg_base;
 
 	writel_relaxed(0, reg_base + PROBE_STATGO);
 	writel_relaxed(0, reg_base + PROBE_MAINCTL);
 	writel_relaxed(0, reg_base + PROBE_CFGCTL);
-	writel_relaxed(0, reg_base + PROBE_COUNTERS_0_SRC);
-	writel_relaxed(0, reg_base + PROBE_COUNTERS_1_SRC);
+	writel_relaxed(0, reg_base + info->counter0_src);
+	writel_relaxed(0, reg_base + info->counter1_src);
 
 	return 0;
 }
@@ -78,14 +85,15 @@ static int rockchip_nocp_get_event(struct devfreq_event_dev *edev,
 				   struct devfreq_event_data *edata)
 {
 	struct rockchip_nocp *nocp = devfreq_event_get_drvdata(edev);
+	const struct nocp_info *info = nocp->info;
 	void __iomem *reg_base = nocp->reg_base;
 	u32 counter = 0, counter0 = 0, counter1 = 0;
 	int time_ms = 0;
 
 	time_ms = ktime_to_ms(ktime_sub(ktime_get(), nocp->time));
 
-	counter0 = readl_relaxed(reg_base + PROBE_COUNTERS_0_VAL);
-	counter1 = readl_relaxed(reg_base + PROBE_COUNTERS_1_VAL);
+	counter0 = readl_relaxed(reg_base + info->counter0_val);
+	counter1 = readl_relaxed(reg_base + info->counter1_val);
 	counter = (counter0 & 0xffff) | ((counter1 & 0xffff) << 16);
 	counter = counter / 1000000;
 	if (time_ms > 0)
@@ -109,10 +117,37 @@ static const struct devfreq_event_ops rockchip_nocp_ops = {
 	.set_event = rockchip_nocp_set_event,
 };
 
+static const struct nocp_info rk3288_nocp = {
+	.counter0_src = 0x138,
+	.counter0_val = 0x13c,
+	.counter1_src = 0x14c,
+	.counter1_val = 0x150,
+};
+
+static const struct nocp_info rk3568_nocp = {
+	.counter0_src = 0x204,
+	.counter0_val = 0x20c,
+	.counter1_src = 0x214,
+	.counter1_val = 0x21c,
+};
+
 static const struct of_device_id rockchip_nocp_id_match[] = {
-	{ .compatible = "rockchip,rk3288-nocp" },
-	{ .compatible = "rockchip,rk3368-nocp" },
-	{ .compatible = "rockchip,rk3399-nocp" },
+	{
+		.compatible = "rockchip,rk3288-nocp",
+		.data = (void *)&rk3288_nocp,
+	},
+	{
+		.compatible = "rockchip,rk3368-nocp",
+		.data = (void *)&rk3288_nocp,
+	},
+	{
+		.compatible = "rockchip,rk3399-nocp",
+		.data = (void *)&rk3288_nocp,
+	},
+	{
+		.compatible = "rockchip,rk3568-nocp",
+		.data = (void *)&rk3568_nocp,
+	},
 	{ },
 };
 
@@ -122,11 +157,20 @@ static int rockchip_nocp_probe(struct platform_device *pdev)
 	struct rockchip_nocp *nocp;
 	struct devfreq_event_desc *desc;
 	struct device_node *np = pdev->dev.of_node;
+	const struct of_device_id *match;
+
+	match = of_match_device(rockchip_nocp_id_match, &pdev->dev);
+	if (!match || !match->data) {
+		dev_err(&pdev->dev, "missing nocp data\n");
+		return -ENODEV;
+	}
 
 	nocp = devm_kzalloc(&pdev->dev, sizeof(*nocp), GFP_KERNEL);
 	if (!nocp)
 		return -ENOMEM;
 
+	nocp->info = match->data;
+
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	nocp->reg_base = devm_ioremap_resource(&pdev->dev, res);
 	if (IS_ERR(nocp->reg_base))

commit e1e243372d3b048bd1707b6de27bac35673dd0d9
Author: Finley Xiao <finley.xiao@rock-chips.com>
Date:   Tue Aug 24 16:29:59 2021 +0800

    arm64: dts: rockchip: rk3568: Modify vop-bw-dmc-freq
    
    Add support for display screen whose resolution is 1920x1200.
    
    Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
    Change-Id: I22b9a8d1fbd095f08d4b58c0c41252ebbfb985f0

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index edb3c240fbaa..10e629747dc5 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -2126,8 +2126,8 @@
 		ddr_timing = <&ddr_timing>;
 		vop-bw-dmc-freq = <
 		/* min_bw(MB/s) max_bw(MB/s) freq(KHz) */
-			0	505	324000
-			506	99999	528000
+			0	572	324000
+			573	99999	528000
 		>;
 		upthreshold = <40>;
 		downdifferential = <20>;

commit 30c691f565d3bf4a42f5005a70e1324135dd0336
Author: Finley Xiao <finley.xiao@rock-chips.com>
Date:   Fri Aug 20 17:14:11 2021 +0800

    PM / devfreq: rockchip_dmc: Add sysfs interface for ondemand_data
    
    Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
    Change-Id: I399a78aa2f63b266824a5cd302328a0d3e2aadcd

diff --git a/drivers/devfreq/rockchip_dmc.c b/drivers/devfreq/rockchip_dmc.c
index 4d73996aa38e..644da8a32182 100644
--- a/drivers/devfreq/rockchip_dmc.c
+++ b/drivers/devfreq/rockchip_dmc.c
@@ -2431,6 +2431,64 @@ static ssize_t rockchip_dmcfreq_status_store(struct device *dev,
 static DEVICE_ATTR(system_status, 0644, rockchip_dmcfreq_status_show,
 		   rockchip_dmcfreq_status_store);
 
+static ssize_t upthreshold_show(struct device *dev,
+				struct device_attribute *attr,
+				char *buf)
+{
+	struct rockchip_dmcfreq *dmcfreq = dev_get_drvdata(dev->parent);
+	struct rockchip_dmcfreq_ondemand_data *data = &dmcfreq->ondemand_data;
+
+	return sprintf(buf, "%d\n", data->upthreshold);
+}
+
+static ssize_t upthreshold_store(struct device *dev,
+				 struct device_attribute *attr,
+				 const char *buf,
+				 size_t count)
+{
+	struct rockchip_dmcfreq *dmcfreq = dev_get_drvdata(dev->parent);
+	struct rockchip_dmcfreq_ondemand_data *data = &dmcfreq->ondemand_data;
+	unsigned int value;
+
+	if (kstrtouint(buf, 10, &value))
+		return -EINVAL;
+
+	data->upthreshold = value;
+
+	return count;
+}
+
+static DEVICE_ATTR_RW(upthreshold);
+
+static ssize_t downdifferential_show(struct device *dev,
+				     struct device_attribute *attr,
+				     char *buf)
+{
+	struct rockchip_dmcfreq *dmcfreq = dev_get_drvdata(dev->parent);
+	struct rockchip_dmcfreq_ondemand_data *data = &dmcfreq->ondemand_data;
+
+	return sprintf(buf, "%d\n", data->downdifferential);
+}
+
+static ssize_t downdifferential_store(struct device *dev,
+				      struct device_attribute *attr,
+				      const char *buf,
+				      size_t count)
+{
+	struct rockchip_dmcfreq *dmcfreq = dev_get_drvdata(dev->parent);
+	struct rockchip_dmcfreq_ondemand_data *data = &dmcfreq->ondemand_data;
+	unsigned int value;
+
+	if (kstrtouint(buf, 10, &value))
+		return -EINVAL;
+
+	data->downdifferential = value;
+
+	return count;
+}
+
+static DEVICE_ATTR_RW(downdifferential);
+
 static void rockchip_dmcfreq_set_msch_rl(struct rockchip_dmcfreq *dmcfreq,
 					 unsigned int readlatency)
 
@@ -2971,6 +3029,15 @@ static void rockchip_dmcfreq_register_notifier(struct rockchip_dmcfreq *dmcfreq)
 
 static void rockchip_dmcfreq_add_interface(struct rockchip_dmcfreq *dmcfreq)
 {
+	if (sysfs_create_file(&dmcfreq->devfreq->dev.kobj,
+			      &dev_attr_upthreshold.attr))
+		dev_err(dmcfreq->dev,
+			"failed to register upthreshold sysfs file\n");
+	if (sysfs_create_file(&dmcfreq->devfreq->dev.kobj,
+			      &dev_attr_downdifferential.attr))
+		dev_err(dmcfreq->dev,
+			"failed to register downdifferential sysfs file\n");
+
 	if (!rockchip_add_system_status_interface(&dmcfreq->devfreq->dev))
 		return;
 	if (sysfs_create_file(&dmcfreq->devfreq->dev.kobj,

commit ed3555fd11f7dd60e721f086ff62defdc383d7ad
Author: Elaine Zhang <zhangqing@rock-chips.com>
Date:   Fri Aug 20 10:11:53 2021 +0800

    clk: rockchip: optimize static memory consume
    
    Before:
            text    data    bss    dec    hex    filename
            2384    144     0      2528   9e0    drivers/clk/rockchip/clk-pvtm.o
            684     0       0      684    2ac    drivers/clk/rockchip/clk-inverter.o
            1157    0       0      1157   485    drivers/clk/rockchip/clk-dclk-divider.o
    
    After:
            text    data    bss    dec    hex    filename
            0       0       0      0      0      drivers/clk/rockchip/clk-pvtm.o
            0       0       0      0      0      drivers/clk/rockchip/clk-inverter.o
            0       0       0      0      0      drivers/clk/rockchip/clk-dclk-divider.o
    
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    Change-Id: I157205014ed3240d51e1bf445c6163a5da9a7939

diff --git a/drivers/clk/rockchip/Kconfig b/drivers/clk/rockchip/Kconfig
index 2322c3f04238..ad828efc6e3e 100644
--- a/drivers/clk/rockchip/Kconfig
+++ b/drivers/clk/rockchip/Kconfig
@@ -20,6 +20,24 @@ config ROCKCHIP_CLK_BOOST
 	help
 	  Say y here to enable clk boost.
 
+config ROCKCHIP_CLK_INV
+	bool "Rockchip Clk Inverter"
+	default y if !CPU_RV1126
+	help
+	  Say y here to enable clk Inverter.
+
+config ROCKCHIP_CLK_PVTM
+	bool "Rockchip Clk Pvtm"
+	default y if !CPU_RV1126
+	help
+	  Say y here to enable clk pvtm.
+
+config ROCKCHIP_DCLK_DIV
+	bool "Rockchip Dclk Divider"
+	default y if !CPU_RV1126
+	help
+	  Say y here to enable dclk divider.
+
 config ROCKCHIP_DDRCLK_SCPI
 	bool "Rockchip DDR Clk SCPI"
 	default y if RK3368_SCPI_PROTOCOL
diff --git a/drivers/clk/rockchip/Makefile b/drivers/clk/rockchip/Makefile
index 4e4178af8dba..92a8de59577c 100644
--- a/drivers/clk/rockchip/Makefile
+++ b/drivers/clk/rockchip/Makefile
@@ -7,12 +7,12 @@ obj-y	+= clk.o
 obj-y	+= clk-pll.o
 obj-y	+= clk-cpu.o
 obj-y	+= clk-half-divider.o
-obj-y	+= clk-inverter.o
 obj-y	+= clk-mmc-phase.o
 obj-y	+= clk-muxgrf.o
 obj-y	+= clk-ddr.o
-obj-y	+= clk-pvtm.o
-obj-y	+= clk-dclk-divider.o
+obj-$(CONFIG_ROCKCHIP_CLK_INV)	+= clk-inverter.o
+obj-$(CONFIG_ROCKCHIP_CLK_PVTM)	+= clk-pvtm.o
+obj-$(CONFIG_ROCKCHIP_DCLK_DIV)	+= clk-dclk-divider.o
 obj-$(CONFIG_RESET_CONTROLLER)	+= softrst.o
 
 obj-$(CONFIG_CPU_PX30)		+= clk-px30.o
diff --git a/drivers/clk/rockchip/clk.c b/drivers/clk/rockchip/clk.c
index 260c5bd6ffa3..06769a020bc7 100644
--- a/drivers/clk/rockchip/clk.c
+++ b/drivers/clk/rockchip/clk.c
@@ -660,11 +660,13 @@ void __init rockchip_clk_register_branches(
 			);
 			break;
 		case branch_inverter:
+#ifdef CONFIG_ROCKCHIP_CLK_INV
 			clk = rockchip_clk_register_inverter(
 				list->name, list->parent_names,
 				list->num_parents,
 				ctx->reg_base + list->muxdiv_offset,
 				list->div_shift, list->div_flags, &ctx->lock);
+#endif
 			break;
 		case branch_factor:
 			clk = rockchip_clk_register_factor_branch(
@@ -684,6 +686,7 @@ void __init rockchip_clk_register_branches(
 				ctx->reg_base);
 			break;
 		case branch_dclk_divider:
+#ifdef CONFIG_ROCKCHIP_DCLK_DIV
 			clk = rockchip_clk_register_dclk_branch(list->name,
 				list->parent_names, list->num_parents,
 				ctx->reg_base, list->muxdiv_offset, list->mux_shift,
@@ -692,6 +695,7 @@ void __init rockchip_clk_register_branches(
 				list->div_flags, list->div_table,
 				list->gate_offset, list->gate_shift,
 				list->gate_flags, flags, list->max_prate, &ctx->lock);
+#endif
 			break;
 		}
 

commit a0b3d093d3ca0f0fce0b664df70fdce4508f46af
Author: Elaine Zhang <zhangqing@rock-chips.com>
Date:   Tue Aug 17 17:46:38 2021 +0800

    clk: rockchip: rv1126: optimize static memory consume
    
    ./scripts/bloat-o-meter clk-rv1126_old.o clk-rv1126.o
    add/remove: 0/0 grow/shrink: 0/5 up/down: 0/-6992 (-6992)
    Function                                     old     new   delta
    __compound_literal                          1116     900    -216
    rv1126_clk_pmu_branches                     2880    2432    -448
    rv1126_pll_rates                            1344     504    -840
    rv1126_cpuclk_rates                         3472     992   -2480
    rv1126_clk_branches                        20480   17472   -3008
    Total: Before=32936, After=25944, chg -21.23%
    
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    Change-Id: I2ac55c646b2b02bf3cfcb7102f80209d18a80ac1

diff --git a/drivers/clk/rockchip/clk-rv1126.c b/drivers/clk/rockchip/clk-rv1126.c
index 05dea9fbd1f0..076e055fe41d 100644
--- a/drivers/clk/rockchip/clk-rv1126.c
+++ b/drivers/clk/rockchip/clk-rv1126.c
@@ -30,56 +30,26 @@ enum rv1126_plls {
 static struct rockchip_pll_rate_table rv1126_pll_rates[] = {
 	/* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, _frac */
 	RK3036_PLL_RATE(1608000000, 1, 67, 1, 1, 1, 0),
-	RK3036_PLL_RATE(1600000000, 3, 200, 1, 1, 1, 0),
-	RK3036_PLL_RATE(1584000000, 1, 132, 2, 1, 1, 0),
-	RK3036_PLL_RATE(1560000000, 1, 130, 2, 1, 1, 0),
-	RK3036_PLL_RATE(1536000000, 1, 128, 2, 1, 1, 0),
 	RK3036_PLL_RATE(1512000000, 1, 126, 2, 1, 1, 0),
-	RK3036_PLL_RATE(1488000000, 1, 124, 2, 1, 1, 0),
-	RK3036_PLL_RATE(1464000000, 1, 122, 2, 1, 1, 0),
-	RK3036_PLL_RATE(1440000000, 1, 120, 2, 1, 1, 0),
 	RK3036_PLL_RATE(1416000000, 1, 118, 2, 1, 1, 0),
-	RK3036_PLL_RATE(1400000000, 3, 350, 2, 1, 1, 0),
-	RK3036_PLL_RATE(1392000000, 1, 116, 2, 1, 1, 0),
-	RK3036_PLL_RATE(1368000000, 1, 114, 2, 1, 1, 0),
-	RK3036_PLL_RATE(1344000000, 1, 112, 2, 1, 1, 0),
-	RK3036_PLL_RATE(1320000000, 1, 110, 2, 1, 1, 0),
 	RK3036_PLL_RATE(1296000000, 1, 108, 2, 1, 1, 0),
-	RK3036_PLL_RATE(1272000000, 1, 106, 2, 1, 1, 0),
-	RK3036_PLL_RATE(1248000000, 1, 104, 2, 1, 1, 0),
 	RK3036_PLL_RATE(1200000000, 1, 100, 2, 1, 1, 0),
 	RK3036_PLL_RATE(1188000000, 1, 99, 2, 1, 1, 0),
-	RK3036_PLL_RATE(1104000000, 1, 92, 2, 1, 1, 0),
-	RK3036_PLL_RATE(1100000000, 3, 275, 2, 1, 1, 0),
 	RK3036_PLL_RATE(1008000000, 1, 84, 2, 1, 1, 0),
 	RK3036_PLL_RATE(1000000000, 3, 250, 2, 1, 1, 0),
-	RK3036_PLL_RATE(984000000, 1, 82, 2, 1, 1, 0),
-	RK3036_PLL_RATE(960000000, 1, 80, 2, 1, 1, 0),
-	RK3036_PLL_RATE(936000000, 1, 78, 2, 1, 1, 0),
-	RK3036_PLL_RATE(912000000, 1, 76, 2, 1, 1, 0),
-	RK3036_PLL_RATE(900000000, 1, 75, 2, 1, 1, 0),
-	RK3036_PLL_RATE(888000000, 1, 74, 2, 1, 1, 0),
-	RK3036_PLL_RATE(864000000, 1, 72, 2, 1, 1, 0),
-	RK3036_PLL_RATE(840000000, 1, 70, 2, 1, 1, 0),
 	RK3036_PLL_RATE(816000000, 1, 68, 2, 1, 1, 0),
 	RK3036_PLL_RATE(800000000, 3, 200, 2, 1, 1, 0),
-	RK3036_PLL_RATE(700000000, 3, 350, 4, 1, 1, 0),
 	RK3036_PLL_RATE(696000000, 1, 116, 4, 1, 1, 0),
-	RK3036_PLL_RATE(624000000, 1, 104, 4, 1, 1, 0),
 #ifdef CONFIG_ROCKCHIP_LOW_PERFORMANCE
 	RK3036_PLL_RATE(600000000, 1, 50, 2, 1, 1, 0),
 #else
 	RK3036_PLL_RATE(600000000, 1, 100, 4, 1, 1, 0),
 #endif
 	RK3036_PLL_RATE(594000000, 1, 99, 4, 1, 1, 0),
-	RK3036_PLL_RATE(504000000, 1, 84, 4, 1, 1, 0),
 	RK3036_PLL_RATE(500000000, 1, 125, 6, 1, 1, 0),
 	RK3036_PLL_RATE(496742400, 1, 124, 6, 1, 0, 3113851),
 	RK3036_PLL_RATE(491520000, 1, 40, 2, 1, 0, 16106127),
 	RK3036_PLL_RATE(408000000, 1, 68, 2, 2, 1, 0),
-	RK3036_PLL_RATE(312000000, 1, 78, 6, 1, 1, 0),
-	RK3036_PLL_RATE(216000000, 1, 72, 4, 2, 1, 0),
-	RK3036_PLL_RATE(96000000, 1, 96, 6, 4, 1, 0),
 	{ /* sentinel */ },
 };
 
@@ -107,33 +77,13 @@ static struct rockchip_pll_rate_table rv1126_pll_rates[] = {
 
 static struct rockchip_cpuclk_rate_table rv1126_cpuclk_rates[] __initdata = {
 	RV1126_CPUCLK_RATE(1608000000, 1, 7),
-	RV1126_CPUCLK_RATE(1584000000, 1, 7),
-	RV1126_CPUCLK_RATE(1560000000, 1, 7),
-	RV1126_CPUCLK_RATE(1536000000, 1, 7),
 	RV1126_CPUCLK_RATE(1512000000, 1, 7),
-	RV1126_CPUCLK_RATE(1488000000, 1, 5),
-	RV1126_CPUCLK_RATE(1464000000, 1, 5),
-	RV1126_CPUCLK_RATE(1440000000, 1, 5),
 	RV1126_CPUCLK_RATE(1416000000, 1, 5),
-	RV1126_CPUCLK_RATE(1392000000, 1, 5),
-	RV1126_CPUCLK_RATE(1368000000, 1, 5),
-	RV1126_CPUCLK_RATE(1344000000, 1, 5),
-	RV1126_CPUCLK_RATE(1320000000, 1, 5),
-	RV1126_CPUCLK_RATE(1296000000, 1, 5),
-	RV1126_CPUCLK_RATE(1272000000, 1, 5),
-	RV1126_CPUCLK_RATE(1248000000, 1, 5),
-	RV1126_CPUCLK_RATE(1224000000, 1, 5),
 	RV1126_CPUCLK_RATE(1200000000, 1, 5),
-	RV1126_CPUCLK_RATE(1104000000, 1, 5),
 	RV1126_CPUCLK_RATE(1008000000, 1, 5),
-	RV1126_CPUCLK_RATE(912000000, 1, 5),
 	RV1126_CPUCLK_RATE(816000000, 1, 3),
-	RV1126_CPUCLK_RATE(696000000, 1, 3),
 	RV1126_CPUCLK_RATE(600000000, 1, 3),
 	RV1126_CPUCLK_RATE(408000000, 1, 1),
-	RV1126_CPUCLK_RATE(312000000, 1, 1),
-	RV1126_CPUCLK_RATE(216000000,  1, 1),
-	RV1126_CPUCLK_RATE(96000000, 1, 1),
 };
 
 static const struct rockchip_cpuclk_reg_data rv1126_cpuclk_data = {
@@ -448,24 +398,6 @@ static struct rockchip_clk_branch rv1126_clk_pmu_branches[] __initdata = {
 	MUX(CLK_MIPIDSIPHY_REF, "clk_mipidsiphy_ref", mux_mipidsiphy_ref_p, CLK_SET_RATE_PARENT,
 			RV1126_PMU_CLKSEL_CON(7), 15, 1, MFLAGS),
 
-#ifndef CONFIG_ROCKCHIP_LOW_PERFORMANCE
-	GATE(CLK_PMU, "clk_pmu", "xin24m", CLK_IGNORE_UNUSED,
-			RV1126_PMU_CLKGATE_CON(0), 15, GFLAGS),
-
-	GATE(PCLK_PMUSGRF, "pclk_pmusgrf", "pclk_pdpmu", CLK_IGNORE_UNUSED,
-			RV1126_PMU_CLKGATE_CON(0), 4, GFLAGS),
-	GATE(PCLK_PMUGRF, "pclk_pmugrf", "pclk_pdpmu", CLK_IGNORE_UNUSED,
-			RV1126_PMU_CLKGATE_CON(1), 13, GFLAGS),
-	GATE(PCLK_PMUCRU, "pclk_pmucru", "pclk_pdpmu", CLK_IGNORE_UNUSED,
-			RV1126_PMU_CLKGATE_CON(2), 4, GFLAGS),
-	GATE(PCLK_CHIPVEROTP, "pclk_chipverotp", "pclk_pdpmu", CLK_IGNORE_UNUSED,
-			RV1126_PMU_CLKGATE_CON(2), 0, GFLAGS),
-	GATE(PCLK_PDPMU_NIU, "pclk_pdpmu_niu", "pclk_pdpmu", CLK_IGNORE_UNUSED,
-			RV1126_PMU_CLKGATE_CON(0), 2, GFLAGS),
-
-	GATE(PCLK_SCRKEYGEN, "pclk_scrkeygen", "pclk_pdpmu", 0,
-			RV1126_PMU_CLKGATE_CON(0), 7, GFLAGS),
-#endif
 };
 
 static struct rockchip_clk_branch rv1126_clk_branches[] __initdata = {
@@ -844,20 +776,12 @@ static struct rockchip_clk_branch rv1126_clk_branches[] __initdata = {
 	COMPOSITE_NOMUX(HCLK_PDVDEC, "hclk_pdvdec", "aclk_pdvdec", 0,
 			RV1126_CLKSEL_CON(41), 8, 5, DFLAGS,
 			RV1126_CLKGATE_CON(13), 4, GFLAGS),
-	GATE(0, "aclk_pdvdec_niu", "aclk_pdvdec", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(13), 5, GFLAGS),
-	GATE(0, "hclk_pdvdec_niu", "hclk_pdvdec", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(13), 6, GFLAGS),
 	COMPOSITE(ACLK_PDJPEG, "aclk_pdjpeg", mux_cpll_hpll_gpll_p, 0,
 			RV1126_CLKSEL_CON(44), 6, 2, MFLAGS, 0, 5, DFLAGS,
 			RV1126_CLKGATE_CON(13), 9, GFLAGS),
 	COMPOSITE_NOMUX(HCLK_PDJPEG, "hclk_pdjpeg", "aclk_pdjpeg", 0,
 			RV1126_CLKSEL_CON(44), 8, 5, DFLAGS,
 			RV1126_CLKGATE_CON(13), 10, GFLAGS),
-	GATE(0, "aclk_pdjpeg_niu", "aclk_pdjpeg", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(13), 11, GFLAGS),
-	GATE(0, "hclk_pdjpeg_niu", "hclk_pdjpeg", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(13), 12, GFLAGS),
 	GATE(ACLK_VDEC, "aclk_vdec", "aclk_pdvdec", 0,
 			RV1126_CLKGATE_CON(13), 7, GFLAGS),
 	GATE(HCLK_VDEC, "hclk_vdec", "hclk_pdvdec", 0,
@@ -1186,95 +1110,39 @@ static struct rockchip_clk_branch rv1126_clk_branches[] __initdata = {
 			RV1126_CLKGATE_CON(0), 5, GFLAGS),
 	GATE(0, "clk_a7_jtag", "clk_jtag_ori", CLK_IGNORE_UNUSED,
 			RV1126_CLKGATE_CON(0), 9, GFLAGS),
-	GATE(0, "aclk_core_niu", "aclk_core", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(0), 3, GFLAGS),
-	GATE(0, "pclk_dbg_niu", "pclk_dbg", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(0), 4, GFLAGS),
 	/*
 	 * Clock-Architecture Diagram 4
 	 */
 	/* PD_BUS */
-	GATE(0, "aclk_pdbus_hold_niu1", "aclk_pdbus", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(2), 10, GFLAGS),
-	GATE(0, "aclk_pdbus_niu1", "aclk_pdbus", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(2), 3, GFLAGS),
-	GATE(0, "hclk_pdbus_niu1", "hclk_pdbus", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(2), 4, GFLAGS),
-	GATE(0, "pclk_pdbus_niu1", "pclk_pdbus", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(2), 5, GFLAGS),
-	GATE(0, "aclk_pdbus_niu2", "aclk_pdbus", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(2), 6, GFLAGS),
-	GATE(0, "hclk_pdbus_niu2", "hclk_pdbus", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(2), 7, GFLAGS),
-	GATE(0, "aclk_pdbus_niu3", "aclk_pdbus", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(2), 8, GFLAGS),
-	GATE(0, "hclk_pdbus_niu3", "hclk_pdbus", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(2), 9, GFLAGS),
-	GATE(0, "pclk_grf", "pclk_pdbus", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(6), 15, GFLAGS),
-	GATE(0, "pclk_sgrf", "pclk_pdbus", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(8), 4, GFLAGS),
-	GATE(0, "aclk_sysram", "hclk_pdbus", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(3), 9, GFLAGS),
-	GATE(0, "pclk_intmux", "pclk_pdbus", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(7), 14, GFLAGS),
 
 	/*
 	 * Clock-Architecture Diagram 5
 	 */
 	/* PD_CRYPTO */
-	GATE(0, "aclk_pdcrypto_niu", "aclk_pdcrypto", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(4), 13, GFLAGS),
-	GATE(0, "hclk_pdcrypto_niu", "hclk_pdcrypto", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(4), 14, GFLAGS),
 
 	/*
 	 * Clock-Architecture Diagram 6
 	 */
 	/* PD_AUDIO */
-	GATE(0, "hclk_pdaudio_niu", "hclk_pdaudio", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(9), 2, GFLAGS),
-	GATE(0, "pclk_pdaudio_niu", "hclk_pdaudio", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(9), 3, GFLAGS),
 
 	/*
 	 * Clock-Architecture Diagram 7
 	 */
 	/* PD_VEPU */
-	GATE(0, "aclk_pdvepu_niu", "aclk_pdvepu", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(12), 3, GFLAGS),
-	GATE(0, "hclk_pdvepu_niu", "hclk_pdvepu", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(12), 4, GFLAGS),
 
 	/*
 	 * Clock-Architecture Diagram 9
 	 */
 	/* PD_VO */
-	GATE(0, "aclk_pdvo_niu", "aclk_pdvo", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(14), 3, GFLAGS),
-	GATE(0, "hclk_pdvo_niu", "hclk_pdvo", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(14), 4, GFLAGS),
-	GATE(0, "pclk_pdvo_niu", "pclk_pdvo", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(14), 5, GFLAGS),
 
 	/*
 	 * Clock-Architecture Diagram 10
 	 */
 	/* PD_VI */
-	GATE(0, "aclk_pdvi_niu", "aclk_pdvi", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(15), 3, GFLAGS),
-	GATE(0, "hclk_pdvi_niu", "hclk_pdvi", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(15), 4, GFLAGS),
-	GATE(0, "pclk_pdvi_niu", "pclk_pdvi", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(15), 5, GFLAGS),
 	/*
 	 * Clock-Architecture Diagram 11
 	 */
 	/* PD_ISPP */
-	GATE(0, "aclk_pdispp_niu", "aclk_pdispp", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(16), 2, GFLAGS),
-	GATE(0, "hclk_pdispp_niu", "hclk_pdispp", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(16), 3, GFLAGS),
 
 	/*
 	 * Clock-Architecture Diagram 12
@@ -1284,34 +1152,16 @@ static struct rockchip_clk_branch rv1126_clk_branches[] __initdata = {
 			RV1126_CLKGATE_CON(17), 2, GFLAGS),
 	GATE(0, "hclk_pdphpmid", "hclk_pdphp", CLK_IGNORE_UNUSED,
 			RV1126_CLKGATE_CON(17), 3, GFLAGS),
-	GATE(0, "aclk_pdphpmid_niu", "aclk_pdphpmid", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(17), 4, GFLAGS),
-	GATE(0, "hclk_pdphpmid_niu", "hclk_pdphpmid", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(17), 5, GFLAGS),
 
 	/* PD_SDCARD */
-	GATE(0, "hclk_pdsdmmc_niu", "hclk_pdsdmmc", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(17), 7, GFLAGS),
 
 	/* PD_SDIO */
-	GATE(0, "hclk_pdsdio_niu", "hclk_pdsdio", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(17), 9, GFLAGS),
 
 	/* PD_NVM */
-	GATE(0, "hclk_pdnvm_niu", "hclk_pdnvm", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(18), 3, GFLAGS),
 
 	/* PD_USB */
-	GATE(0, "aclk_pdusb_niu", "aclk_pdusb", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(19), 2, GFLAGS),
-	GATE(0, "hclk_pdusb_niu", "hclk_pdusb", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(19), 3, GFLAGS),
 
 	/* PD_GMAC */
-	GATE(0, "aclk_pdgmac_niu", "aclk_pdgmac", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(20), 2, GFLAGS),
-	GATE(0, "pclk_pdgmac_niu", "pclk_pdgmac", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(20), 3, GFLAGS),
 
 	/*
 	 * Clock-Architecture Diagram 13
@@ -1357,22 +1207,9 @@ static struct rockchip_clk_branch rv1126_clk_branches[] __initdata = {
 	 * Clock-Architecture Diagram 14
 	 */
 	/* PD_NPU */
-	GATE(0, "aclk_pdnpu_niu", "aclk_pdnpu", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(22), 4, GFLAGS),
-	GATE(0, "hclk_pdnpu_niu", "hclk_pdnpu", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(22), 5, GFLAGS),
-	GATE(0, "pclk_pdnpu_niu", "pclk_pdnpu", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(22), 6, GFLAGS),
-
 	/*
 	 * Clock-Architecture Diagram 15
 	 */
-	GATE(0, "pclk_topniu", "pclk_pdtop", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(23), 9, GFLAGS),
-	GATE(PCLK_TOPCRU, "pclk_topcru", "pclk_pdtop", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(23), 10, GFLAGS),
-	GATE(PCLK_TOPGRF, "pclk_topgrf", "pclk_pdtop", CLK_IGNORE_UNUSED,
-			RV1126_CLKGATE_CON(23), 11, GFLAGS),
 	GATE(PCLK_CPUEMADET, "pclk_cpuemadet", "pclk_pdtop", CLK_IGNORE_UNUSED,
 			RV1126_CLKGATE_CON(23), 12, GFLAGS),
 	GATE(PCLK_DDRPHY, "pclk_ddrphy", "pclk_pdtop", CLK_IGNORE_UNUSED,
@@ -1403,10 +1240,10 @@ static const char *const rv1126_cru_critical_clocks[] __initconst = {
 #if IS_ENABLED(CONFIG_ROCKCHIP_MPP_VDPU2) || \
     IS_ENABLED(CONFIG_ROCKCHIP_MPP_RKVDEC) || \
     IS_ENABLED(CONFIG_ROCKCHIP_MPP_VEPU2)
-	"aclk_pdjpeg_niu",
-	"hclk_pdjpeg_niu",
-	"aclk_pdvdec_niu",
-	"hclk_pdvdec_niu",
+	"aclk_pdjpeg",
+	"hclk_pdjpeg",
+	"aclk_pdvdec",
+	"hclk_pdvdec",
 #endif
 };
 

commit afd6fc20343a05bedb1552bb7b59b2a4e9b1ff24
Author: Fenrir Lin <fenrir.lin@rock-chips.com>
Date:   Mon Aug 23 17:44:22 2021 +0800

    ARM: dts: rockchip: fix ircut's gpio for rv1126-bat-evb-v10
    
    fix the reverse problem.
    
    Signed-off-by: Fenrir Lin <fenrir.lin@rock-chips.com>
    Change-Id: I924f5c272a37a7959cc4c44552c5035610b06a58

diff --git a/arch/arm/boot/dts/rv1126-bat-evb-v10.dtsi b/arch/arm/boot/dts/rv1126-bat-evb-v10.dtsi
index 9156332059bc..4fbf6b69abfd 100644
--- a/arch/arm/boot/dts/rv1126-bat-evb-v10.dtsi
+++ b/arch/arm/boot/dts/rv1126-bat-evb-v10.dtsi
@@ -66,8 +66,8 @@
 	cam_ircut0: cam_ircut {
 		status = "okay";
 		compatible = "rockchip,ircut";
-		ircut-open-gpios = <&gpio2 RK_PD4 GPIO_ACTIVE_HIGH>;
-		ircut-close-gpios = <&gpio2 RK_PD5 GPIO_ACTIVE_HIGH>;
+		ircut-open-gpios = <&gpio2 RK_PD5 GPIO_ACTIVE_HIGH>;
+		ircut-close-gpios = <&gpio2 RK_PD4 GPIO_ACTIVE_HIGH>;
 		rockchip,camera-module-index = <1>;
 		rockchip,camera-module-facing = "front";
 	};

commit 34b4a03fee11bbdf62aad66b330525cd914f0878
Author: Zhenke Fan <fanzy.fan@rock-chips.com>
Date:   Sat Jul 10 17:26:24 2021 +0800

    media: i2c: imx415 add 1080p binning mode
    
    Signed-off-by: Zhenke Fan <fanzy.fan@rock-chips.com>
    Change-Id: I5b4a1f2c728d6f45406c2efd5c3cc9c9306ccb3a

diff --git a/drivers/media/i2c/imx415.c b/drivers/media/i2c/imx415.c
index 6d32fb61de5d..5cb5a8831ff5 100644
--- a/drivers/media/i2c/imx415.c
+++ b/drivers/media/i2c/imx415.c
@@ -55,6 +55,7 @@
 #define MIPI_FREQ_891M			891000000
 #define MIPI_FREQ_446M			446000000
 #define MIPI_FREQ_743M			743000000
+#define MIPI_FREQ_297M			297000000
 
 #define IMX415_4LANES			4
 
@@ -145,13 +146,14 @@
 #define IMX415_GROUP_HOLD_END		0x00
 
 /* Basic Readout Lines. Number of necessary readout lines in sensor */
-#define BRL				2228u
+#define BRL_ALL				2228u
+#define BRL_BINNING			1115u
 /* Readout timing setting of SEF1(DOL2): RHS1 < 2 * BRL and should be 4n + 1 */
-#define RHS1_MAX_X2			((BRL * 2 - 1) / 4 * 4 + 1)
+#define RHS1_MAX_X2(VAL)		(((VAL) * 2 - 1) / 4 * 4 + 1)
 #define SHR1_MIN_X2			9u
 
 /* Readout timing setting of SEF1(DOL3): RHS1 < 3 * BRL and should be 6n + 1 */
-#define RHS1_MAX_X3			((BRL * 3 - 1) / 6 * 6 + 1)
+#define RHS1_MAX_X3(VAL)		(((VAL) * 3 - 1) / 6 * 6 + 1)
 #define SHR1_MIN_X3			13u
 
 #define OF_CAMERA_PINCTRL_STATE_DEFAULT	"rockchip,camera_default"
@@ -244,7 +246,11 @@ static __maybe_unused const struct regval imx415_global_12bit_3864x2192_regs[] =
 	{0x3008, 0x7F},
 	{0x300A, 0x5B},
 	{0x30C1, 0x00},
+	{0x3031, 0x01},
+	{0x3032, 0x01},
+	{0x30D9, 0x06},
 	{0x3116, 0x24},
+	{0x3118, 0xC0},
 	{0x311E, 0x24},
 	{0x32D4, 0x21},
 	{0x32EC, 0xA1},
@@ -265,6 +271,7 @@ static __maybe_unused const struct regval imx415_global_12bit_3864x2192_regs[] =
 	{0x36D8, 0x71},
 	{0x36DA, 0x8C},
 	{0x36DB, 0x00},
+	{0x3701, 0x03},
 	{0x3724, 0x02},
 	{0x3726, 0x02},
 	{0x3732, 0x02},
@@ -323,6 +330,9 @@ static __maybe_unused const struct regval imx415_global_12bit_3864x2192_regs[] =
 };
 
 static __maybe_unused const struct regval imx415_linear_12bit_3864x2192_891M_regs[] = {
+	{0x3020, 0x00},
+	{0x3021, 0x00},
+	{0x3022, 0x00},
 	{0x3024, 0xCA},
 	{0x3025, 0x08},
 	{0x3028, 0x4C},
@@ -354,6 +364,9 @@ static __maybe_unused const struct regval imx415_linear_12bit_3864x2192_891M_reg
 };
 
 static __maybe_unused const struct regval imx415_hdr2_12bit_3864x2192_1782M_regs[] = {
+	{0x3020, 0x00},
+	{0x3021, 0x00},
+	{0x3022, 0x00},
 	{0x3024, 0xCA},
 	{0x3025, 0x08},
 	{0x3028, 0x26},
@@ -385,6 +398,9 @@ static __maybe_unused const struct regval imx415_hdr2_12bit_3864x2192_1782M_regs
 };
 
 static __maybe_unused const struct regval imx415_hdr3_12bit_3864x2192_1782M_regs[] = {
+	{0x3020, 0x00},
+	{0x3021, 0x00},
+	{0x3022, 0x00},
 	{0x3024, 0x96},
 	{0x3025, 0x06},
 	{0x3028, 0x26},
@@ -422,6 +438,7 @@ static __maybe_unused const struct regval imx415_global_10bit_3864x2192_regs[] =
 	{0x3031, 0x00},
 	{0x3032, 0x00},
 	{0x30C1, 0x00},
+	{0x30D9, 0x06},
 	{0x3116, 0x24},
 	{0x311E, 0x24},
 	{0x32D4, 0x21},
@@ -502,6 +519,9 @@ static __maybe_unused const struct regval imx415_global_10bit_3864x2192_regs[] =
 };
 
 static __maybe_unused const struct regval imx415_hdr3_10bit_3864x2192_1485M_regs[] = {
+	{0x3020, 0x00},
+	{0x3021, 0x00},
+	{0x3022, 0x00},
 	{0x3024, 0xBD},
 	{0x3025, 0x06},
 	{0x3028, 0x1A},
@@ -534,6 +554,9 @@ static __maybe_unused const struct regval imx415_hdr3_10bit_3864x2192_1485M_regs
 };
 
 static __maybe_unused const struct regval imx415_hdr3_10bit_3864x2192_1782M_regs[] = {
+	{0x3020, 0x00},
+	{0x3021, 0x00},
+	{0x3022, 0x00},
 	{0x3024, 0xEA},
 	{0x3025, 0x07},
 	{0x3028, 0xCA},
@@ -566,6 +589,9 @@ static __maybe_unused const struct regval imx415_hdr3_10bit_3864x2192_1782M_regs
 };
 
 static __maybe_unused const struct regval imx415_hdr2_10bit_3864x2192_1485M_regs[] = {
+	{0x3020, 0x00},
+	{0x3021, 0x00},
+	{0x3022, 0x00},
 	{0x3024, 0xFC},
 	{0x3025, 0x08},
 	{0x3028, 0x1A},
@@ -598,6 +624,9 @@ static __maybe_unused const struct regval imx415_hdr2_10bit_3864x2192_1485M_regs
 };
 
 static __maybe_unused const struct regval imx415_linear_10bit_3864x2192_891M_regs[] = {
+	{0x3020, 0x00},
+	{0x3021, 0x00},
+	{0x3022, 0x00},
 	{0x3024, 0xCA},
 	{0x3025, 0x08},
 	{0x3028, 0x4C},
@@ -629,6 +658,84 @@ static __maybe_unused const struct regval imx415_linear_10bit_3864x2192_891M_reg
 	{REG_NULL, 0x00},
 };
 
+static __maybe_unused const struct regval imx415_linear_12bit_1932x1096_594M_regs[] = {
+	{0x3020, 0x01},
+	{0x3021, 0x01},
+	{0x3022, 0x01},
+	{0x3024, 0x5D},
+	{0x3025, 0x0C},
+	{0x3028, 0x0E},
+	{0x3029, 0x03},
+	{0x302C, 0x00},
+	{0x302D, 0x00},
+	{0x3031, 0x00},
+	{0x3033, 0x07},
+	{0x3050, 0x08},
+	{0x3051, 0x00},
+	{0x3054, 0x19},
+	{0x3058, 0x3E},
+	{0x3060, 0x25},
+	{0x3064, 0x4A},
+	{0x30CF, 0x00},
+	{0x30D9, 0x02},
+	{0x30DA, 0x01},
+	{0x3118, 0x80},
+	{0x3260, 0x01},
+	{0x3701, 0x00},
+	{0x400C, 0x00},
+	{0x4018, 0x67},
+	{0x401A, 0x27},
+	{0x401C, 0x27},
+	{0x401E, 0xB7},
+	{0x401F, 0x00},
+	{0x4020, 0x2F},
+	{0x4022, 0x4F},
+	{0x4024, 0x2F},
+	{0x4026, 0x47},
+	{0x4028, 0x27},
+	{0x4074, 0x01},
+	{REG_NULL, 0x00},
+};
+
+static __maybe_unused const struct regval imx415_hdr2_12bit_1932x1096_891M_regs[] = {
+	{0x3020, 0x01},
+	{0x3021, 0x01},
+	{0x3022, 0x01},
+	{0x3024, 0xFC},
+	{0x3025, 0x08},
+	{0x3028, 0x1A},
+	{0x3029, 0x02},
+	{0x302C, 0x01},
+	{0x302D, 0x01},
+	{0x3031, 0x00},
+	{0x3033, 0x05},
+	{0x3050, 0xB8},
+	{0x3051, 0x00},
+	{0x3054, 0x09},
+	{0x3058, 0x3E},
+	{0x3060, 0x25},
+	{0x3064, 0x4A},
+	{0x30CF, 0x01},
+	{0x30D9, 0x02},
+	{0x30DA, 0x01},
+	{0x3118, 0xC0},
+	{0x3260, 0x00},
+	{0x3701, 0x00},
+	{0x400C, 0x00},
+	{0x4018, 0xA7},
+	{0x401A, 0x57},
+	{0x401C, 0x5F},
+	{0x401E, 0x97},
+	{0x401F, 0x01},
+	{0x4020, 0x5F},
+	{0x4022, 0xAF},
+	{0x4024, 0x5F},
+	{0x4026, 0x9F},
+	{0x4028, 0x4F},
+	{0x4074, 0x01},
+	{REG_NULL, 0x00},
+};
+
 /*
  * The width and height must be configured to be
  * the same as the current output resolution of the sensor.
@@ -660,7 +767,7 @@ static const struct imx415_mode supported_modes[] = {
 		.global_reg_list = imx415_global_10bit_3864x2192_regs,
 		.reg_list = imx415_linear_10bit_3864x2192_891M_regs,
 		.hdr_mode = NO_HDR,
-		.mipi_freq_idx = 0,
+		.mipi_freq_idx = 1,
 		.bpp = 10,
 	},
 	{
@@ -681,7 +788,7 @@ static const struct imx415_mode supported_modes[] = {
 		.global_reg_list = imx415_global_10bit_3864x2192_regs,
 		.reg_list = imx415_hdr2_10bit_3864x2192_1485M_regs,
 		.hdr_mode = HDR_X2,
-		.mipi_freq_idx = 1,
+		.mipi_freq_idx = 2,
 		.bpp = 10,
 		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_1,
 		.vc[PAD1] = V4L2_MBUS_CSI2_CHANNEL_0,//L->csi wr0
@@ -706,7 +813,7 @@ static const struct imx415_mode supported_modes[] = {
 		.global_reg_list = imx415_global_10bit_3864x2192_regs,
 		.reg_list = imx415_hdr3_10bit_3864x2192_1485M_regs,
 		.hdr_mode = HDR_X3,
-		.mipi_freq_idx = 1,
+		.mipi_freq_idx = 2,
 		.bpp = 10,
 		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_2,
 		.vc[PAD1] = V4L2_MBUS_CSI2_CHANNEL_1,//M->csi wr0
@@ -731,7 +838,7 @@ static const struct imx415_mode supported_modes[] = {
 		.global_reg_list = imx415_global_10bit_3864x2192_regs,
 		.reg_list = imx415_hdr3_10bit_3864x2192_1782M_regs,
 		.hdr_mode = HDR_X3,
-		.mipi_freq_idx = 2,
+		.mipi_freq_idx = 3,
 		.bpp = 10,
 		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_2,
 		.vc[PAD1] = V4L2_MBUS_CSI2_CHANNEL_1,//M->csi wr0
@@ -753,7 +860,7 @@ static const struct imx415_mode supported_modes[] = {
 		.global_reg_list = imx415_global_12bit_3864x2192_regs,
 		.reg_list = imx415_linear_12bit_3864x2192_891M_regs,
 		.hdr_mode = NO_HDR,
-		.mipi_freq_idx = 0,
+		.mipi_freq_idx = 1,
 		.bpp = 12,
 	},
 	{
@@ -774,7 +881,7 @@ static const struct imx415_mode supported_modes[] = {
 		.global_reg_list = imx415_global_12bit_3864x2192_regs,
 		.reg_list = imx415_hdr2_12bit_3864x2192_1782M_regs,
 		.hdr_mode = HDR_X2,
-		.mipi_freq_idx = 2,
+		.mipi_freq_idx = 3,
 		.bpp = 12,
 		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_1,
 		.vc[PAD1] = V4L2_MBUS_CSI2_CHANNEL_0,//L->csi wr0
@@ -799,16 +906,59 @@ static const struct imx415_mode supported_modes[] = {
 		.global_reg_list = imx415_global_12bit_3864x2192_regs,
 		.reg_list = imx415_hdr3_12bit_3864x2192_1782M_regs,
 		.hdr_mode = HDR_X3,
-		.mipi_freq_idx = 2,
+		.mipi_freq_idx = 3,
 		.bpp = 12,
 		.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 wr0
 		.vc[PAD3] = V4L2_MBUS_CSI2_CHANNEL_2,//S->csi wr2
 	},
+	{
+		.bus_fmt = MEDIA_BUS_FMT_SGBRG12_1X12,
+		.width = 1944,
+		.height = 1097,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x05dc - 0x08,
+		.hts_def = 0x030e * 3,
+		.vts_def = 0x0c5d,
+		.global_reg_list = imx415_global_12bit_3864x2192_regs,
+		.reg_list = imx415_linear_12bit_1932x1096_594M_regs,
+		.hdr_mode = NO_HDR,
+		.mipi_freq_idx = 0,
+		.bpp = 12,
+	},
+	{
+		.bus_fmt = MEDIA_BUS_FMT_SGBRG12_1X12,
+		.width = 1944,
+		.height = 1097,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x08FC / 4,
+		.hts_def = 0x021A * 4,
+		/*
+		 * IMX415 HDR mode T-line is half of Linear mode,
+		 * make vts double(that is FSC) to workaround.
+		 */
+		.vts_def = 0x08FC * 2,
+		.global_reg_list = imx415_global_12bit_3864x2192_regs,
+		.reg_list = imx415_hdr2_12bit_1932x1096_891M_regs,
+		.hdr_mode = HDR_X2,
+		.mipi_freq_idx = 1,
+		.bpp = 12,
+		.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
+	},
 };
 
 static const s64 link_freq_items[] = {
+	MIPI_FREQ_297M,
 	MIPI_FREQ_446M,
 	MIPI_FREQ_743M,
 	MIPI_FREQ_891M,
@@ -1174,7 +1324,10 @@ static int imx415_set_hdrae_3frame(struct imx415 *imx415,
 		__LINE__, shr0, l_exp_time, fsc);
 
 	rhs1 = (SHR1_MIN_X3 + m_exp_time + 5) / 6 * 6 + 1;
-	rhs1_max = RHS1_MAX_X3;
+	if (imx415->cur_mode->height == 2192)
+		rhs1_max = RHS1_MAX_X3(BRL_ALL);
+	else
+		rhs1_max = RHS1_MAX_X3(BRL_BINNING);
 	if (rhs1 < 25)
 		rhs1 = 25;
 	else if (rhs1 > rhs1_max)
@@ -1184,7 +1337,10 @@ static int imx415_set_hdrae_3frame(struct imx415 *imx415,
 		__LINE__, rhs1, m_exp_time, rhs1_old);
 
 	//Dynamic adjustment rhs2 must meet the following conditions
-	rhs1_change_limit = rhs1_old + 3 * BRL - fsc + 3;
+	if (imx415->cur_mode->height == 2192)
+		rhs1_change_limit = rhs1_old + 3 * BRL_ALL - fsc + 3;
+	else
+		rhs1_change_limit = rhs1_old + 3 * BRL_BINNING - fsc + 3;
 	rhs1_change_limit = (rhs1_change_limit < 25) ? 25 : rhs1_change_limit;
 	rhs1_change_limit = (rhs1_change_limit + 5) / 6 * 6 + 1;
 	if (rhs1_max < rhs1_change_limit) {
@@ -1221,7 +1377,10 @@ static int imx415_set_hdrae_3frame(struct imx415 *imx415,
 		__LINE__, rhs2, s_exp_time, rhs2_old);
 
 	//Dynamic adjustment rhs2 must meet the following conditions
-	rhs2_change_limit = rhs2_old + 3 * BRL - fsc + 3;
+	if (imx415->cur_mode->height == 2192)
+		rhs2_change_limit = rhs2_old + 3 * BRL_ALL - fsc + 3;
+	else
+		rhs2_change_limit = rhs2_old + 3 * BRL_BINNING - fsc + 3;
 	rhs2_change_limit = (rhs2_change_limit < 50) ?  50 : rhs2_change_limit;
 	rhs2_change_limit = (rhs2_change_limit + 5) / 6 * 6 + 2;
 	if ((shr0 - 13) < rhs2_change_limit) {
@@ -1403,8 +1562,13 @@ static int imx415_set_hdrae(struct imx415 *imx415,
 	fsc = imx415->cur_vts;
 	shr0 = fsc - l_exp_time;
 
-	rhs1_max = min(RHS1_MAX_X2, ((shr0 - 9u) / 4 * 4 + 1));
-	rhs1_min = max(SHR1_MIN_X2 + 8u, rhs1_old + 2 * BRL - fsc + 2);
+	if (imx415->cur_mode->height == 2192) {
+		rhs1_max = min(RHS1_MAX_X2(BRL_ALL), ((shr0 - 9u) / 4 * 4 + 1));
+		rhs1_min = max(SHR1_MIN_X2 + 8u, rhs1_old + 2 * BRL_ALL - fsc + 2);
+	} else {
+		rhs1_max = min(RHS1_MAX_X2(BRL_BINNING), ((shr0 - 9u) / 4 * 4 + 1));
+		rhs1_min = max(SHR1_MIN_X2 + 8u, rhs1_old + 2 * BRL_BINNING - fsc + 2);
+	}
 	rhs1_min = (rhs1_min + 3) / 4 * 4 + 1;
 	rhs1 = (SHR1_MIN_X2 + s_exp_time + 3) / 4 * 4 + 1;/* shall be 4n + 1 */
 	dev_dbg(&client->dev,
@@ -1438,7 +1602,7 @@ static int imx415_set_hdrae(struct imx415 *imx415,
 
 	dev_dbg(&client->dev,
 		"fsc=%d,RHS1_MAX=%d,SHR1_MIN=%d,rhs1_max=%d\n",
-		fsc, RHS1_MAX_X2, SHR1_MIN_X2, rhs1_max);
+		fsc, RHS1_MAX_X2(BRL_ALL), SHR1_MIN_X2, rhs1_max);
 	dev_dbg(&client->dev,
 		"l_exp_time=%d,s_exp_time=%d,shr0=%d,shr1=%d,rhs1=%d,l_a_gain=%d,s_a_gain=%d\n",
 		l_exp_time, s_exp_time, shr0, shr1, rhs1, l_a_gain, s_a_gain);
@@ -1565,7 +1729,9 @@ static long imx415_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 		break;
 	case RKMODULE_GET_SONY_BRL:
 		if (imx415->cur_mode->width == 3864 && imx415->cur_mode->height == 2192)
-			*((u32 *)arg) = BRL;
+			*((u32 *)arg) = BRL_ALL;
+		else
+			*((u32 *)arg) = BRL_BINNING;
 		break;
 	default:
 		ret = -ENOIOCTLCMD;
@@ -1945,8 +2111,10 @@ static int imx415_enum_frame_interval(struct v4l2_subdev *sd,
 }
 
 #define CROP_START(SRC, DST) (((SRC) - (DST)) / 2 / 4 * 4)
-#define DST_WIDTH 3840
-#define DST_HEIGHT 2160
+#define DST_WIDTH_3840 3840
+#define DST_HEIGHT_2160 2160
+#define DST_WIDTH_1920 1920
+#define DST_HEIGHT_1080 1080
 
 /*
  * The resolution of the driver configuration needs to be exactly
@@ -1964,10 +2132,22 @@ static int imx415_get_selection(struct v4l2_subdev *sd,
 	struct imx415 *imx415 = to_imx415(sd);
 
 	if (sel->target == V4L2_SEL_TGT_CROP_BOUNDS) {
-		sel->r.left = CROP_START(imx415->cur_mode->width, DST_WIDTH);
-		sel->r.width = DST_WIDTH;
-		sel->r.top = CROP_START(imx415->cur_mode->height, DST_HEIGHT);
-		sel->r.height = DST_HEIGHT;
+		if (imx415->cur_mode->width == 3864) {
+			sel->r.left = CROP_START(imx415->cur_mode->width, DST_WIDTH_3840);
+			sel->r.width = DST_WIDTH_3840;
+			sel->r.top = CROP_START(imx415->cur_mode->height, DST_HEIGHT_2160);
+			sel->r.height = DST_HEIGHT_2160;
+		} else if (imx415->cur_mode->width == 1944) {
+			sel->r.left = CROP_START(imx415->cur_mode->width, DST_WIDTH_1920);
+			sel->r.width = DST_WIDTH_1920;
+			sel->r.top = CROP_START(imx415->cur_mode->height, DST_HEIGHT_1080);
+			sel->r.height = DST_HEIGHT_1080;
+		} else {
+			sel->r.left = CROP_START(imx415->cur_mode->width, imx415->cur_mode->width);
+			sel->r.width = imx415->cur_mode->width;
+			sel->r.top = CROP_START(imx415->cur_mode->height, imx415->cur_mode->height);
+			sel->r.height = imx415->cur_mode->height;
+		}
 		return 0;
 	}
 	return -EINVAL;

commit 6fc680cb0d7a32436a2ed3bd64f82073b5a30f0e
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Wed Aug 18 18:06:41 2021 +0800

    ASoC: rockchip: i2s-tdm: Make soc_data symbol const
    
    Change-Id: Id78f5f2d79f6345c97456e99ae107716e1a5f560
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/sound/soc/rockchip/rockchip_i2s_tdm.c b/sound/soc/rockchip/rockchip_i2s_tdm.c
index 60019a497d24..bfd24cb3f416 100644
--- a/sound/soc/rockchip/rockchip_i2s_tdm.c
+++ b/sound/soc/rockchip/rockchip_i2s_tdm.c
@@ -78,7 +78,7 @@ struct rk_i2s_tdm_dev {
 	struct snd_dmaengine_dai_dma_data playback_dma_data;
 	struct reset_control *tx_reset;
 	struct reset_control *rx_reset;
-	struct rk_i2s_soc_data *soc_data;
+	const struct rk_i2s_soc_data *soc_data;
 	void __iomem *cru_base;
 	bool is_master_mode;
 	bool io_multiplex;
@@ -1422,21 +1422,21 @@ static const struct txrx_config rv1126_txrx_config[] = {
 	{ 0xff800000, 0x10260, RV1126_I2S0_CLK_TXONLY, RV1126_I2S0_CLK_RXONLY },
 };
 
-static struct rk_i2s_soc_data px30_i2s_soc_data = {
+static const struct rk_i2s_soc_data px30_i2s_soc_data = {
 	.softrst_offset = 0x0300,
 	.configs = px30_txrx_config,
 	.config_count = ARRAY_SIZE(px30_txrx_config),
 	.init = common_soc_init,
 };
 
-static struct rk_i2s_soc_data rk1808_i2s_soc_data = {
+static const struct rk_i2s_soc_data rk1808_i2s_soc_data = {
 	.softrst_offset = 0x0300,
 	.configs = rk1808_txrx_config,
 	.config_count = ARRAY_SIZE(rk1808_txrx_config),
 	.init = common_soc_init,
 };
 
-static struct rk_i2s_soc_data rk3308_i2s_soc_data = {
+static const struct rk_i2s_soc_data rk3308_i2s_soc_data = {
 	.softrst_offset = 0x0400,
 	.grf_reg_offset = 0x0308,
 	.grf_shift = 5,
@@ -1445,14 +1445,14 @@ static struct rk_i2s_soc_data rk3308_i2s_soc_data = {
 	.init = common_soc_init,
 };
 
-static struct rk_i2s_soc_data rk3568_i2s_soc_data = {
+static const struct rk_i2s_soc_data rk3568_i2s_soc_data = {
 	.softrst_offset = 0x0400,
 	.configs = rk3568_txrx_config,
 	.config_count = ARRAY_SIZE(rk3568_txrx_config),
 	.init = common_soc_init,
 };
 
-static struct rk_i2s_soc_data rv1126_i2s_soc_data = {
+static const struct rk_i2s_soc_data rv1126_i2s_soc_data = {
 	.softrst_offset = 0x0300,
 	.configs = rv1126_txrx_config,
 	.config_count = ARRAY_SIZE(rv1126_txrx_config),
@@ -1695,7 +1695,7 @@ static int rockchip_i2s_tdm_probe(struct platform_device *pdev)
 		return -EINVAL;
 
 	spin_lock_init(&i2s_tdm->lock);
-	i2s_tdm->soc_data = (struct rk_i2s_soc_data *)of_id->data;
+	i2s_tdm->soc_data = (const struct rk_i2s_soc_data *)of_id->data;
 
 	i2s_tdm->bclk_fs = 64;
 	if (!of_property_read_u32(node, "rockchip,bclk-fs", &val)) {

commit 4fcf674a20345f229264f5984e295939e37c5be2
Author: Yiqing Zeng <zack.zeng@rock-chips.com>
Date:   Tue Aug 24 16:53:01 2021 +0800

    media: i2c: gc4663 change mclk from 27Mhz to 24Mhz
    
    Signed-off-by: Yiqing Zeng <zack.zeng@rock-chips.com>
    Change-Id: I9721b400111954589a8dc4c24fcda25cb7eb77f1

diff --git a/drivers/media/i2c/gc4663.c b/drivers/media/i2c/gc4663.c
index aee73dc0b8ae..c9102c8a7932 100644
--- a/drivers/media/i2c/gc4663.c
+++ b/drivers/media/i2c/gc4663.c
@@ -278,10 +278,10 @@ static const struct regval gc4663_linear10bit_2560x1440_regs[] = {
 	{0x0320, 0x77},
 	{0x0324, 0xc8},
 	{0x0325, 0x06},
-	{0x0326, 0x60},
+	{0x0326, 0x6c},
 	{0x0327, 0x03},
 	{0x0334, 0x40},
-	{0x0336, 0x60},
+	{0x0336, 0x6c},
 	{0x0337, 0x82},
 	{0x0315, 0x25},
 	{0x031c, 0xc6},

commit b1782ee4d7e5a8a9439dc764bd79111e7b980a83
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Tue Aug 24 14:43:39 2021 +0800

    pinctrl: rockchip: sync with upstream only codingstyle
    
    Do coding style for mux route struct.
    
    The mux route tables take many lines for each SoC, and it will be more
    instances for newly SoC, that makes the file size increase larger.
    
    This patch only do coding style for mux route struct, by adding a new
    definition and replace the structs by script which supplied by
    huangtao@rock-chips.com
    
    sed -i -e "
    /static struct rockchip_mux_route_data /bcheck
    b
    :append-next-line
    N
    :check
    /^[^;]*$/bappend-next-line
    s/[[:blank:]]*.bank_num = \([[:digit:]]*,\)\n/\tRK_MUXROUTE_SAME(\1/g
    s/[[:blank:]]*.pin =[[:blank:]]*0,\n/ RK_PA0,/g
    s/[[:blank:]]*.pin =[[:blank:]]*1,\n/ RK_PA1,/g
    s/[[:blank:]]*.pin =[[:blank:]]*2,\n/ RK_PA2,/g
    s/[[:blank:]]*.pin =[[:blank:]]*3,\n/ RK_PA3,/g
    s/[[:blank:]]*.pin =[[:blank:]]*4,\n/ RK_PA4,/g
    s/[[:blank:]]*.pin =[[:blank:]]*5,\n/ RK_PA5,/g
    s/[[:blank:]]*.pin =[[:blank:]]*6,\n/ RK_PA6,/g
    s/[[:blank:]]*.pin =[[:blank:]]*7,\n/ RK_PA7,/g
    s/[[:blank:]]*.pin =[[:blank:]]*8,\n/ RK_PB0,/g
    s/[[:blank:]]*.pin =[[:blank:]]*9,\n/ RK_PB1,/g
    s/[[:blank:]]*.pin =[[:blank:]]*10,\n/ RK_PB2,/g
    s/[[:blank:]]*.pin =[[:blank:]]*11,\n/ RK_PB3,/g
    s/[[:blank:]]*.pin =[[:blank:]]*12,\n/ RK_PB4,/g
    s/[[:blank:]]*.pin =[[:blank:]]*13,\n/ RK_PB5,/g
    s/[[:blank:]]*.pin =[[:blank:]]*14,\n/ RK_PB6,/g
    s/[[:blank:]]*.pin =[[:blank:]]*15,\n/ RK_PB7,/g
    s/[[:blank:]]*.pin =[[:blank:]]*16,\n/ RK_PC0,/g
    s/[[:blank:]]*.pin =[[:blank:]]*17,\n/ RK_PC1,/g
    s/[[:blank:]]*.pin =[[:blank:]]*18,\n/ RK_PC2,/g
    s/[[:blank:]]*.pin =[[:blank:]]*19,\n/ RK_PC3,/g
    s/[[:blank:]]*.pin =[[:blank:]]*20,\n/ RK_PC4,/g
    s/[[:blank:]]*.pin =[[:blank:]]*21,\n/ RK_PC5,/g
    s/[[:blank:]]*.pin =[[:blank:]]*22,\n/ RK_PC6,/g
    s/[[:blank:]]*.pin =[[:blank:]]*23,\n/ RK_PC7,/g
    s/[[:blank:]]*.pin =[[:blank:]]*24,\n/ RK_PD0,/g
    s/[[:blank:]]*.pin =[[:blank:]]*25,\n/ RK_PD1,/g
    s/[[:blank:]]*.pin =[[:blank:]]*4,\n/ RK_PA4,/g
    s/[[:blank:]]*.pin =[[:blank:]]*5,\n/ RK_PA5,/g
    s/[[:blank:]]*.pin =[[:blank:]]*6,\n/ RK_PA6,/g
    s/[[:blank:]]*.pin =[[:blank:]]*7,\n/ RK_PA7,/g
    s/[[:blank:]]*.pin =[[:blank:]]*8,\n/ RK_PB0,/g
    s/[[:blank:]]*.pin =[[:blank:]]*9,\n/ RK_PB1,/g
    s/[[:blank:]]*.pin =[[:blank:]]*10,\n/ RK_PB2,/g
    s/[[:blank:]]*.pin =[[:blank:]]*11,\n/ RK_PB3,/g
    s/[[:blank:]]*.pin =[[:blank:]]*12,\n/ RK_PB4,/g
    s/[[:blank:]]*.pin =[[:blank:]]*13,\n/ RK_PB5,/g
    s/[[:blank:]]*.pin =[[:blank:]]*14,\n/ RK_PB6,/g
    s/[[:blank:]]*.pin =[[:blank:]]*15,\n/ RK_PB7,/g
    s/[[:blank:]]*.pin =[[:blank:]]*16,\n/ RK_PC0,/g
    s/[[:blank:]]*.pin =[[:blank:]]*17,\n/ RK_PC1,/g
    s/[[:blank:]]*.pin =[[:blank:]]*18,\n/ RK_PC2,/g
    s/[[:blank:]]*.pin =[[:blank:]]*19,\n/ RK_PC3,/g
    s/[[:blank:]]*.pin =[[:blank:]]*20,\n/ RK_PC4,/g
    s/[[:blank:]]*.pin =[[:blank:]]*21,\n/ RK_PC5,/g
    s/[[:blank:]]*.pin =[[:blank:]]*22,\n/ RK_PC6,/g
    s/[[:blank:]]*.pin =[[:blank:]]*23,\n/ RK_PC7,/g
    s/[[:blank:]]*.pin =[[:blank:]]*24,\n/ RK_PD0,/g
    s/[[:blank:]]*.pin =[[:blank:]]*25,\n/ RK_PD1,/g
    s/[[:blank:]]*.pin =[[:blank:]]*26,\n/ RK_PD2,/g
    s/[[:blank:]]*.pin =[[:blank:]]*27,\n/ RK_PD3,/g
    s/[[:blank:]]*.pin =[[:blank:]]*28,\n/ RK_PD4,/g
    s/[[:blank:]]*.pin =[[:blank:]]*29,\n/ RK_PD5,/g
    s/[[:blank:]]*.pin =[[:blank:]]*30,\n/ RK_PD6,/g
    s/[[:blank:]]*.pin =[[:blank:]]*31,\n/ RK_PD7,/g
    s/[[:blank:]]*.func = \([[:digit:]]*,\)\n/ \1/g
    s/[[:blank:]]*.route_location =[[:blank:]]*\([[:print:]]*,\)\n//g
    s/[[:blank:]]*.route_offset = \(0x[[:xdigit:]]*,\)\n/ \1/g
    s/[[:blank:]]*.route_val =[[:blank:]]*\([[:print:]]*\),\n/ \1),/g
    s/\t{\n//g
    s/\t}, {\n//g
    s/\t},//g
    s/[[:blank:]]*\(\/\*[[:print:]]*\*\/\)\n[[:blank:]]*RK_MUXROUTE_SAME(\([[:print:]]*\)),\n/\tRK_MUXROUTE_SAME(\2), \1\n/g
    s/[[:blank:]]*\(\/\*[[:print:]]*\*\/\)\n[[:blank:]]*RK_MUXROUTE_SAME(\([[:print:]]*\)),/\tRK_MUXROUTE_SAME(\2), \1\n/g
    " drivers/pinctrl/pinctrl-rockchip.c
    
    Reviewed-by: Heiko Stuebner <heiko@sntech.de>
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>
    Link: https://lore.kernel.org/r/20210420091240.1246429-1-jay.xu@rock-chips.com
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    (cherry picked from commit fe202ea8e5b170ef7b3741da885e8cb7bae1106e)
    
    Change-Id: I73d2c2ae52197211e68db8f30082830cff53b91a
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
index 1cfcd25ebb15..f32e40496b56 100644
--- a/drivers/pinctrl/pinctrl-rockchip.c
+++ b/drivers/pinctrl/pinctrl-rockchip.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0-only
 /*
  * Pinctrl driver for Rockchip SoCs
  *
@@ -8,19 +9,10 @@
  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  *		http://www.samsung.com
  * Copyright (c) 2012 Linaro Ltd
- *		http://www.linaro.org
+ *		https://www.linaro.org
  *
  * and pinctrl-at91:
  * Copyright (C) 2011-2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as published
- * by the Free Software Foundation.
- *
- * 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/init.h>
@@ -48,10 +40,14 @@
 #include "pinconf.h"
 #include "pinctrl-rockchip.h"
 
-#define RK_GENMASK_VAL(h, l, v) \
+/**
+ * Generate a bitmask for setting a value (v) with a write mask bit in hiword
+ * register 31:16 area.
+ */
+#define WRITE_MASK_VAL(h, l, v) \
 	(GENMASK(((h) + 16), ((l) + 16)) | (((v) << (l)) & GENMASK((h), (l))))
 
-/**
+/*
  * Encode variants of iomux registers into a type variable
  */
 #define IOMUX_GPIO_ONLY		BIT(0)
@@ -59,7 +55,7 @@
 #define IOMUX_SOURCE_PMU	BIT(2)
 #define IOMUX_UNROUTED		BIT(3)
 #define IOMUX_WIDTH_3BIT	BIT(4)
-#define IOMUX_8WIDTH_2BIT	BIT(5)
+#define IOMUX_WIDTH_2BIT	BIT(5)
 #define IOMUX_WRITABLE_32BIT	BIT(6)
 #define IOMUX_L_SOURCE_PMU	BIT(7)
 
@@ -205,17 +201,17 @@
 		.func		= FUNC,					\
 		.route_offset	= REG,					\
 		.route_val	= VAL,					\
-		.route_type	= FLAG,					\
+		.route_location	= FLAG,					\
 	}
 
-#define MR_DEFAULT(ID, PIN, FUNC, REG, VAL)	\
-	PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_DEFAULT)
+#define RK_MUXROUTE_SAME(ID, PIN, FUNC, REG, VAL)	\
+	PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROCKCHIP_ROUTE_SAME)
 
-#define MR_TOPGRF(ID, PIN, FUNC, REG, VAL)	\
-	PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_TOPGRF)
+#define RK_MUXROUTE_GRF(ID, PIN, FUNC, REG, VAL)	\
+	PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROCKCHIP_ROUTE_GRF)
 
-#define MR_PMUGRF(ID, PIN, FUNC, REG, VAL)	\
-	PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROUTE_TYPE_PMUGRF)
+#define RK_MUXROUTE_PMU(ID, PIN, FUNC, REG, VAL)	\
+	PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROCKCHIP_ROUTE_PMU)
 
 static struct regmap_config rockchip_regmap_config = {
 	.reg_bits = 32,
@@ -318,8 +314,8 @@ static int rockchip_dt_node_to_map(struct pinctrl_dev *pctldev,
 	 */
 	grp = pinctrl_name_to_group(info, np->name);
 	if (!grp) {
-		dev_err(info->dev, "unable to find group for node %s\n",
-			np->name);
+		dev_err(info->dev, "unable to find group for node %pOFn\n",
+			np);
 		return -EINVAL;
 	}
 
@@ -723,100 +719,100 @@ static struct rockchip_mux_recalced_data rk3328_mux_recalced_data[] = {
 };
 
 static struct rockchip_mux_route_data rv1126_mux_route_data[] = {
-	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_1, 0x10260, RK_GENMASK_VAL(0, 0, 0)), /* I2S0_MCLK_M0 */
-	MR_TOPGRF(RK_GPIO3, RK_PB0, RK_FUNC_3, 0x10260, RK_GENMASK_VAL(0, 0, 1)), /* I2S0_MCLK_M1 */
+	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 */
 
-	MR_TOPGRF(RK_GPIO0, RK_PD4, RK_FUNC_4, 0x10260, RK_GENMASK_VAL(3, 2, 0)), /* I2S1_MCLK_M0 */
-	MR_TOPGRF(RK_GPIO1, RK_PD5, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(3, 2, 1)), /* I2S1_MCLK_M1 */
-	MR_TOPGRF(RK_GPIO2, RK_PC7, RK_FUNC_6, 0x10260, RK_GENMASK_VAL(3, 2, 2)), /* I2S1_MCLK_M2 */
+	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 */
 
-	MR_TOPGRF(RK_GPIO1, RK_PD0, RK_FUNC_1, 0x10260, RK_GENMASK_VAL(4, 4, 0)), /* I2S2_MCLK_M0 */
-	MR_TOPGRF(RK_GPIO2, RK_PB3, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(4, 4, 1)), /* I2S2_MCLK_M1 */
+	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 */
 
-	MR_TOPGRF(RK_GPIO3, RK_PD4, RK_FUNC_2, 0x10260, RK_GENMASK_VAL(12, 12, 0)), /* PDM_CLK0_M0 */
-	MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_3, 0x10260, RK_GENMASK_VAL(12, 12, 1)), /* PDM_CLK0_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 */
 
-	MR_TOPGRF(RK_GPIO3, RK_PC6, RK_FUNC_1, 0x10264, RK_GENMASK_VAL(0, 0, 0)), /* CIF_CLKOUT_M0 */
-	MR_TOPGRF(RK_GPIO2, RK_PD1, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(0, 0, 1)), /* CIF_CLKOUT_M1 */
+	RK_MUXROUTE_GRF(3, RK_PC6, 1, 0x10264, WRITE_MASK_VAL(0, 0, 0)), /* CIF_CLKOUT_M0 */
+	RK_MUXROUTE_GRF(2, RK_PD1, 3, 0x10264, WRITE_MASK_VAL(0, 0, 1)), /* CIF_CLKOUT_M1 */
 
-	MR_TOPGRF(RK_GPIO3, RK_PA4, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(5, 4, 0)), /* I2C3_SCL_M0 */
-	MR_TOPGRF(RK_GPIO2, RK_PD4, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(5, 4, 1)), /* I2C3_SCL_M1 */
-	MR_TOPGRF(RK_GPIO1, RK_PD6, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(5, 4, 2)), /* I2C3_SCL_M2 */
+	RK_MUXROUTE_GRF(3, RK_PA4, 5, 0x10264, WRITE_MASK_VAL(5, 4, 0)), /* I2C3_SCL_M0 */
+	RK_MUXROUTE_GRF(2, RK_PD4, 7, 0x10264, WRITE_MASK_VAL(5, 4, 1)), /* I2C3_SCL_M1 */
+	RK_MUXROUTE_GRF(1, RK_PD6, 3, 0x10264, WRITE_MASK_VAL(5, 4, 2)), /* I2C3_SCL_M2 */
 
-	MR_TOPGRF(RK_GPIO3, RK_PA0, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(6, 6, 0)), /* I2C4_SCL_M0 */
-	MR_TOPGRF(RK_GPIO4, RK_PA0, RK_FUNC_4, 0x10264, RK_GENMASK_VAL(6, 6, 1)), /* I2C4_SCL_M1 */
+	RK_MUXROUTE_GRF(3, RK_PA0, 7, 0x10264, WRITE_MASK_VAL(6, 6, 0)), /* I2C4_SCL_M0 */
+	RK_MUXROUTE_GRF(4, RK_PA0, 4, 0x10264, WRITE_MASK_VAL(6, 6, 1)), /* I2C4_SCL_M1 */
 
-	MR_TOPGRF(RK_GPIO2, RK_PA5, RK_FUNC_7, 0x10264, RK_GENMASK_VAL(9, 8, 0)), /* I2C5_SCL_M0 */
-	MR_TOPGRF(RK_GPIO3, RK_PB0, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(9, 8, 1)), /* I2C5_SCL_M1 */
-	MR_TOPGRF(RK_GPIO1, RK_PD0, RK_FUNC_4, 0x10264, RK_GENMASK_VAL(9, 8, 2)), /* I2C5_SCL_M2 */
+	RK_MUXROUTE_GRF(2, RK_PA5, 7, 0x10264, WRITE_MASK_VAL(9, 8, 0)), /* I2C5_SCL_M0 */
+	RK_MUXROUTE_GRF(3, RK_PB0, 5, 0x10264, WRITE_MASK_VAL(9, 8, 1)), /* I2C5_SCL_M1 */
+	RK_MUXROUTE_GRF(1, RK_PD0, 4, 0x10264, WRITE_MASK_VAL(9, 8, 2)), /* I2C5_SCL_M2 */
 
-	MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(11, 10, 0)), /* SPI1_CLK_M0 */
-	MR_TOPGRF(RK_GPIO1, RK_PC6, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(11, 10, 1)), /* SPI1_CLK_M1 */
-	MR_TOPGRF(RK_GPIO2, RK_PD5, RK_FUNC_6, 0x10264, RK_GENMASK_VAL(11, 10, 2)), /* SPI1_CLK_M2 */
+	RK_MUXROUTE_GRF(3, RK_PC0, 5, 0x10264, WRITE_MASK_VAL(11, 10, 0)), /* SPI1_CLK_M0 */
+	RK_MUXROUTE_GRF(1, RK_PC6, 3, 0x10264, WRITE_MASK_VAL(11, 10, 1)), /* SPI1_CLK_M1 */
+	RK_MUXROUTE_GRF(2, RK_PD5, 6, 0x10264, WRITE_MASK_VAL(11, 10, 2)), /* SPI1_CLK_M2 */
 
-	MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_2, 0x10264, RK_GENMASK_VAL(12, 12, 0)), /* RGMII_CLK_M0 */
-	MR_TOPGRF(RK_GPIO2, RK_PB7, RK_FUNC_2, 0x10264, RK_GENMASK_VAL(12, 12, 1)), /* RGMII_CLK_M1 */
+	RK_MUXROUTE_GRF(3, RK_PC0, 2, 0x10264, WRITE_MASK_VAL(12, 12, 0)), /* RGMII_CLK_M0 */
+	RK_MUXROUTE_GRF(2, RK_PB7, 2, 0x10264, WRITE_MASK_VAL(12, 12, 1)), /* RGMII_CLK_M1 */
 
-	MR_TOPGRF(RK_GPIO3, RK_PA1, RK_FUNC_3, 0x10264, RK_GENMASK_VAL(13, 13, 0)), /* CAN_TXD_M0 */
-	MR_TOPGRF(RK_GPIO3, RK_PA7, RK_FUNC_5, 0x10264, RK_GENMASK_VAL(13, 13, 1)), /* CAN_TXD_M1 */
+	RK_MUXROUTE_GRF(3, RK_PA1, 3, 0x10264, WRITE_MASK_VAL(13, 13, 0)), /* CAN_TXD_M0 */
+	RK_MUXROUTE_GRF(3, RK_PA7, 5, 0x10264, WRITE_MASK_VAL(13, 13, 1)), /* CAN_TXD_M1 */
 
-	MR_TOPGRF(RK_GPIO3, RK_PA4, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(0, 0, 0)), /* PWM8_M0 */
-	MR_TOPGRF(RK_GPIO2, RK_PD7, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(0, 0, 1)), /* PWM8_M1 */
+	RK_MUXROUTE_GRF(3, RK_PA4, 6, 0x10268, WRITE_MASK_VAL(0, 0, 0)), /* PWM8_M0 */
+	RK_MUXROUTE_GRF(2, RK_PD7, 5, 0x10268, WRITE_MASK_VAL(0, 0, 1)), /* PWM8_M1 */
 
-	MR_TOPGRF(RK_GPIO3, RK_PA5, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(2, 2, 0)), /* PWM9_M0 */
-	MR_TOPGRF(RK_GPIO2, RK_PD6, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(2, 2, 1)), /* PWM9_M1 */
+	RK_MUXROUTE_GRF(3, RK_PA5, 6, 0x10268, WRITE_MASK_VAL(2, 2, 0)), /* PWM9_M0 */
+	RK_MUXROUTE_GRF(2, RK_PD6, 5, 0x10268, WRITE_MASK_VAL(2, 2, 1)), /* PWM9_M1 */
 
-	MR_TOPGRF(RK_GPIO3, RK_PA6, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(4, 4, 0)), /* PWM10_M0 */
-	MR_TOPGRF(RK_GPIO2, RK_PD5, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(4, 4, 1)), /* PWM10_M1 */
+	RK_MUXROUTE_GRF(3, RK_PA6, 6, 0x10268, WRITE_MASK_VAL(4, 4, 0)), /* PWM10_M0 */
+	RK_MUXROUTE_GRF(2, RK_PD5, 5, 0x10268, WRITE_MASK_VAL(4, 4, 1)), /* PWM10_M1 */
 
-	MR_TOPGRF(RK_GPIO3, RK_PA7, RK_FUNC_6, 0x10268, RK_GENMASK_VAL(6, 6, 0)), /* PWM11_IR_M0 */
-	MR_TOPGRF(RK_GPIO3, RK_PA1, RK_FUNC_5, 0x10268, RK_GENMASK_VAL(6, 6, 1)), /* PWM11_IR_M1 */
+	RK_MUXROUTE_GRF(3, RK_PA7, 6, 0x10268, WRITE_MASK_VAL(6, 6, 0)), /* PWM11_IR_M0 */
+	RK_MUXROUTE_GRF(3, RK_PA1, 5, 0x10268, WRITE_MASK_VAL(6, 6, 1)), /* PWM11_IR_M1 */
 
-	MR_TOPGRF(RK_GPIO1, RK_PA5, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(8, 8, 0)), /* UART2_TX_M0 */
-	MR_TOPGRF(RK_GPIO3, RK_PA2, RK_FUNC_1, 0x10268, RK_GENMASK_VAL(8, 8, 1)), /* UART2_TX_M1 */
+	RK_MUXROUTE_GRF(1, RK_PA5, 3, 0x10268, WRITE_MASK_VAL(8, 8, 0)), /* UART2_TX_M0 */
+	RK_MUXROUTE_GRF(3, RK_PA2, 1, 0x10268, WRITE_MASK_VAL(8, 8, 1)), /* UART2_TX_M1 */
 
-	MR_TOPGRF(RK_GPIO3, RK_PC6, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(11, 10, 0)), /* UART3_TX_M0 */
-	MR_TOPGRF(RK_GPIO1, RK_PA7, RK_FUNC_2, 0x10268, RK_GENMASK_VAL(11, 10, 1)), /* UART3_TX_M1 */
-	MR_TOPGRF(RK_GPIO3, RK_PA0, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(11, 10, 2)), /* UART3_TX_M2 */
+	RK_MUXROUTE_GRF(3, RK_PC6, 3, 0x10268, WRITE_MASK_VAL(11, 10, 0)), /* UART3_TX_M0 */
+	RK_MUXROUTE_GRF(1, RK_PA7, 2, 0x10268, WRITE_MASK_VAL(11, 10, 1)), /* UART3_TX_M1 */
+	RK_MUXROUTE_GRF(3, RK_PA0, 4, 0x10268, WRITE_MASK_VAL(11, 10, 2)), /* UART3_TX_M2 */
 
-	MR_TOPGRF(RK_GPIO3, RK_PA4, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(13, 12, 0)), /* UART4_TX_M0 */
-	MR_TOPGRF(RK_GPIO2, RK_PA6, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(13, 12, 1)), /* UART4_TX_M1 */
-	MR_TOPGRF(RK_GPIO1, RK_PD5, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(13, 12, 2)), /* UART4_TX_M2 */
+	RK_MUXROUTE_GRF(3, RK_PA4, 4, 0x10268, WRITE_MASK_VAL(13, 12, 0)), /* UART4_TX_M0 */
+	RK_MUXROUTE_GRF(2, RK_PA6, 4, 0x10268, WRITE_MASK_VAL(13, 12, 1)), /* UART4_TX_M1 */
+	RK_MUXROUTE_GRF(1, RK_PD5, 3, 0x10268, WRITE_MASK_VAL(13, 12, 2)), /* UART4_TX_M2 */
 
-	MR_TOPGRF(RK_GPIO3, RK_PA6, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(15, 14, 0)), /* UART5_TX_M0 */
-	MR_TOPGRF(RK_GPIO2, RK_PB0, RK_FUNC_4, 0x10268, RK_GENMASK_VAL(15, 14, 1)), /* UART5_TX_M1 */
-	MR_TOPGRF(RK_GPIO2, RK_PA0, RK_FUNC_3, 0x10268, RK_GENMASK_VAL(15, 14, 2)), /* UART5_TX_M2 */
+	RK_MUXROUTE_GRF(3, RK_PA6, 4, 0x10268, WRITE_MASK_VAL(15, 14, 0)), /* UART5_TX_M0 */
+	RK_MUXROUTE_GRF(2, RK_PB0, 4, 0x10268, WRITE_MASK_VAL(15, 14, 1)), /* UART5_TX_M1 */
+	RK_MUXROUTE_GRF(2, RK_PA0, 3, 0x10268, WRITE_MASK_VAL(15, 14, 2)), /* UART5_TX_M2 */
 
-	MR_PMUGRF(RK_GPIO0, RK_PB6, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(0, 0, 0)), /* PWM0_M0 */
-	MR_PMUGRF(RK_GPIO2, RK_PB3, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(0, 0, 1)), /* PWM0_M1 */
+	RK_MUXROUTE_PMU(0, RK_PB6, 3, 0x0114, WRITE_MASK_VAL(0, 0, 0)), /* PWM0_M0 */
+	RK_MUXROUTE_PMU(2, RK_PB3, 5, 0x0114, WRITE_MASK_VAL(0, 0, 1)), /* PWM0_M1 */
 
-	MR_PMUGRF(RK_GPIO0, RK_PB7, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(2, 2, 0)), /* PWM1_M0 */
-	MR_PMUGRF(RK_GPIO2, RK_PB2, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(2, 2, 1)), /* PWM1_M1 */
+	RK_MUXROUTE_PMU(0, RK_PB7, 3, 0x0114, WRITE_MASK_VAL(2, 2, 0)), /* PWM1_M0 */
+	RK_MUXROUTE_PMU(2, RK_PB2, 5, 0x0114, WRITE_MASK_VAL(2, 2, 1)), /* PWM1_M1 */
 
-	MR_PMUGRF(RK_GPIO0, RK_PC0, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(4, 4, 0)), /* PWM2_M0 */
-	MR_PMUGRF(RK_GPIO2, RK_PB1, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(4, 4, 1)), /* PWM2_M1 */
+	RK_MUXROUTE_PMU(0, RK_PC0, 3, 0x0114, WRITE_MASK_VAL(4, 4, 0)), /* PWM2_M0 */
+	RK_MUXROUTE_PMU(2, RK_PB1, 5, 0x0114, WRITE_MASK_VAL(4, 4, 1)), /* PWM2_M1 */
 
-	MR_PMUGRF(RK_GPIO0, RK_PC1, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(6, 6, 0)), /* PWM3_IR_M0 */
-	MR_PMUGRF(RK_GPIO2, RK_PB0, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(6, 6, 1)), /* PWM3_IR_M1 */
+	RK_MUXROUTE_PMU(0, RK_PC1, 3, 0x0114, WRITE_MASK_VAL(6, 6, 0)), /* PWM3_IR_M0 */
+	RK_MUXROUTE_PMU(2, RK_PB0, 5, 0x0114, WRITE_MASK_VAL(6, 6, 1)), /* PWM3_IR_M1 */
 
-	MR_PMUGRF(RK_GPIO0, RK_PC2, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(8, 8, 0)), /* PWM4_M0 */
-	MR_PMUGRF(RK_GPIO2, RK_PA7, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(8, 8, 1)), /* PWM4_M1 */
+	RK_MUXROUTE_PMU(0, RK_PC2, 3, 0x0114, WRITE_MASK_VAL(8, 8, 0)), /* PWM4_M0 */
+	RK_MUXROUTE_PMU(2, RK_PA7, 5, 0x0114, WRITE_MASK_VAL(8, 8, 1)), /* PWM4_M1 */
 
-	MR_PMUGRF(RK_GPIO0, RK_PC3, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(10, 10, 0)), /* PWM5_M0 */
-	MR_PMUGRF(RK_GPIO2, RK_PA6, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(10, 10, 1)), /* PWM5_M1 */
+	RK_MUXROUTE_PMU(0, RK_PC3, 3, 0x0114, WRITE_MASK_VAL(10, 10, 0)), /* PWM5_M0 */
+	RK_MUXROUTE_PMU(2, RK_PA6, 5, 0x0114, WRITE_MASK_VAL(10, 10, 1)), /* PWM5_M1 */
 
-	MR_PMUGRF(RK_GPIO0, RK_PB2, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(12, 12, 0)), /* PWM6_M0 */
-	MR_PMUGRF(RK_GPIO2, RK_PD4, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(12, 12, 1)), /* PWM6_M1 */
+	RK_MUXROUTE_PMU(0, RK_PB2, 3, 0x0114, WRITE_MASK_VAL(12, 12, 0)), /* PWM6_M0 */
+	RK_MUXROUTE_PMU(2, RK_PD4, 5, 0x0114, WRITE_MASK_VAL(12, 12, 1)), /* PWM6_M1 */
 
-	MR_PMUGRF(RK_GPIO0, RK_PB1, RK_FUNC_3, 0x0114, RK_GENMASK_VAL(14, 14, 0)), /* PWM7_IR_M0 */
-	MR_PMUGRF(RK_GPIO3, RK_PA0, RK_FUNC_5, 0x0114, RK_GENMASK_VAL(14, 14, 1)), /* PWM7_IR_M1 */
+	RK_MUXROUTE_PMU(0, RK_PB1, 3, 0x0114, WRITE_MASK_VAL(14, 14, 0)), /* PWM7_IR_M0 */
+	RK_MUXROUTE_PMU(3, RK_PA0, 5, 0x0114, WRITE_MASK_VAL(14, 14, 1)), /* PWM7_IR_M1 */
 
-	MR_PMUGRF(RK_GPIO0, RK_PB0, RK_FUNC_1, 0x0118, RK_GENMASK_VAL(1, 0, 0)), /* SPI0_CLK_M0 */
-	MR_PMUGRF(RK_GPIO2, RK_PA1, RK_FUNC_1, 0x0118, RK_GENMASK_VAL(1, 0, 1)), /* SPI0_CLK_M1 */
-	MR_PMUGRF(RK_GPIO2, RK_PB2, RK_FUNC_6, 0x0118, RK_GENMASK_VAL(1, 0, 2)), /* SPI0_CLK_M2 */
+	RK_MUXROUTE_PMU(0, RK_PB0, 1, 0x0118, WRITE_MASK_VAL(1, 0, 0)), /* SPI0_CLK_M0 */
+	RK_MUXROUTE_PMU(2, RK_PA1, 1, 0x0118, WRITE_MASK_VAL(1, 0, 1)), /* SPI0_CLK_M1 */
+	RK_MUXROUTE_PMU(2, RK_PB2, 6, 0x0118, WRITE_MASK_VAL(1, 0, 2)), /* SPI0_CLK_M2 */
 
-	MR_PMUGRF(RK_GPIO0, RK_PB6, RK_FUNC_2, 0x0118, RK_GENMASK_VAL(2, 2, 0)), /* UART1_TX_M0 */
-	MR_PMUGRF(RK_GPIO1, RK_PD0, RK_FUNC_5, 0x0118, RK_GENMASK_VAL(2, 2, 1)), /* UART1_TX_M1 */
+	RK_MUXROUTE_PMU(0, RK_PB6, 2, 0x0118, WRITE_MASK_VAL(2, 2, 0)), /* UART1_TX_M0 */
+	RK_MUXROUTE_PMU(1, RK_PD0, 5, 0x0118, WRITE_MASK_VAL(2, 2, 1)), /* UART1_TX_M1 */
 };
 
 static void rockchip_get_recalced_mux(struct rockchip_pin_bank *bank, int pin,
@@ -843,855 +839,238 @@ static void rockchip_get_recalced_mux(struct rockchip_pin_bank *bank, int pin,
 }
 
 static struct rockchip_mux_route_data rk1808_mux_route_data[] = {
-	{
-		/* i2c2m0_sda */
-		.bank_num = 3,
-		.pin = 12,
-		.func = 2,
-		.route_offset = 0x190,
-		.route_val = BIT(16 + 3),
-	}, {
-		/* i2c2m1_sda */
-		.bank_num = 1,
-		.pin = 13,
-		.func = 2,
-		.route_offset = 0x190,
-		.route_val = BIT(16 + 3) | BIT(3),
-	}, {
-		/* spi2m0_miso */
-		.bank_num = 1,
-		.pin = 6,
-		.func = 2,
-		.route_offset = 0x190,
-		.route_val = BIT(16 + 4),
-	}, {
-		/* spi2m1_miso */
-		.bank_num = 2,
-		.pin = 4,
-		.func = 3,
-		.route_offset = 0x190,
-		.route_val = BIT(16 + 4) | BIT(4),
-	}, {
-		/* spi1m0_miso */
-		.bank_num = 4,
-		.pin = 15,
-		.func = 2,
-		.route_offset = 0x190,
-		.route_val = BIT(16 + 5),
-	}, {
-		/* spi1m1_miso */
-		.bank_num = 3,
-		.pin = 26,
-		.func = 3,
-		.route_offset = 0x190,
-		.route_val = BIT(16 + 5) | BIT(5),
-	}, {
-		/* uart1_rxm0 */
-		.bank_num = 4,
-		.pin = 8,
-		.func = 2,
-		.route_offset = 0x190,
-		.route_val = BIT(16 + 13),
-	}, {
-		/* uart1_rxm1 */
-		.bank_num = 1,
-		.pin = 12,
-		.func = 3,
-		.route_offset = 0x190,
-		.route_val = BIT(16 + 13) | BIT(13),
-	}, {
-		/* uart2_rxm0 */
-		.bank_num = 4,
-		.pin = 3,
-		.func = 2,
-		.route_offset = 0x190,
-		.route_val = BIT(16 + 14) | BIT(16 + 15),
-	}, {
-		/* uart2_rxm1 */
-		.bank_num = 2,
-		.pin = 25,
-		.func = 2,
-		.route_offset = 0x190,
-		.route_val = BIT(16 + 14) | BIT(16 + 15) | BIT(14),
-	}, {
-		/* uart2_rxm2 */
-		.bank_num = 3,
-		.pin = 4,
-		.func = 2,
-		.route_offset = 0x190,
-		.route_val = BIT(16 + 14) | BIT(16 + 15) | BIT(15),
-	},
+	RK_MUXROUTE_SAME(3, RK_PB4, 2, 0x190, BIT(16 + 3)), /* i2c2m0_sda */
+	RK_MUXROUTE_SAME(1, RK_PB5, 2, 0x190, BIT(16 + 3) | BIT(3)), /* i2c2m1_sda */
+	RK_MUXROUTE_SAME(1, RK_PA6, 2, 0x190, BIT(16 + 4)), /* spi2m0_miso */
+	RK_MUXROUTE_SAME(2, RK_PA4, 3, 0x190, BIT(16 + 4) | BIT(4)), /* spi2m1_miso */
+	RK_MUXROUTE_SAME(4, RK_PB7, 2, 0x190, BIT(16 + 5)), /* spi1m0_miso */
+	RK_MUXROUTE_SAME(3, RK_PD2, 3, 0x190, BIT(16 + 5) | BIT(5)), /* spi1m1_miso */
+	RK_MUXROUTE_SAME(4, RK_PB0, 2, 0x190, BIT(16 + 13)), /* uart1_rxm0 */
+	RK_MUXROUTE_SAME(1, RK_PB4, 3, 0x190, BIT(16 + 13) | BIT(13)), /* uart1_rxm1 */
+	RK_MUXROUTE_SAME(4, RK_PA3, 2, 0x190, BIT(16 + 14) | BIT(16 + 15)), /* uart2_rxm0 */
+	RK_MUXROUTE_SAME(2, RK_PD1, 2, 0x190, BIT(16 + 14) | BIT(16 + 15) | BIT(14)), /* uart2_rxm1 */
+	RK_MUXROUTE_SAME(3, RK_PA4, 2, 0x190, BIT(16 + 14) | BIT(16 + 15) | BIT(15)), /* uart2_rxm2 */
 };
 
 static struct rockchip_mux_route_data px30_mux_route_data[] = {
-	{
-		/* cif-d2m0 */
-		.bank_num = 2,
-		.pin = 0,
-		.func = 1,
-		.route_offset = 0x184,
-		.route_val = BIT(16 + 7),
-	}, {
-		/* cif-d2m1 */
-		.bank_num = 3,
-		.pin = 3,
-		.func = 3,
-		.route_offset = 0x184,
-		.route_val = BIT(16 + 7) | BIT(7),
-	}, {
-		/* pdm-m0 */
-		.bank_num = 3,
-		.pin = 22,
-		.func = 2,
-		.route_offset = 0x184,
-		.route_val = BIT(16 + 8),
-	}, {
-		/* pdm-m1 */
-		.bank_num = 2,
-		.pin = 22,
-		.func = 1,
-		.route_offset = 0x184,
-		.route_val = BIT(16 + 8) | BIT(8),
-	}, {
-		/* uart2-rxm0 */
-		.bank_num = 1,
-		.pin = 27,
-		.func = 2,
-		.route_offset = 0x184,
-		.route_val = BIT(16 + 10),
-	}, {
-		/* uart2-rxm1 */
-		.bank_num = 2,
-		.pin = 14,
-		.func = 2,
-		.route_offset = 0x184,
-		.route_val = BIT(16 + 10) | BIT(10),
-	}, {
-		/* uart3-rxm0 */
-		.bank_num = 0,
-		.pin = 17,
-		.func = 2,
-		.route_offset = 0x184,
-		.route_val = BIT(16 + 9),
-	}, {
-		/* uart3-rxm1 */
-		.bank_num = 1,
-		.pin = 15,
-		.func = 2,
-		.route_offset = 0x184,
-		.route_val = BIT(16 + 9) | BIT(9),
-	},
+	RK_MUXROUTE_SAME(2, RK_PA0, 1, 0x184, BIT(16 + 7)), /* cif-d2m0 */
+	RK_MUXROUTE_SAME(3, RK_PA3, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d2m1 */
+	RK_MUXROUTE_SAME(3, RK_PC6, 2, 0x184, BIT(16 + 8)), /* pdm-m0 */
+	RK_MUXROUTE_SAME(2, RK_PC6, 1, 0x184, BIT(16 + 8) | BIT(8)), /* pdm-m1 */
+	RK_MUXROUTE_SAME(1, RK_PD3, 2, 0x184, BIT(16 + 10)), /* uart2-rxm0 */
+	RK_MUXROUTE_SAME(2, RK_PB6, 2, 0x184, BIT(16 + 10) | BIT(10)), /* uart2-rxm1 */
+	RK_MUXROUTE_SAME(0, RK_PC1, 2, 0x184, BIT(16 + 9)), /* uart3-rxm0 */
+	RK_MUXROUTE_SAME(1, RK_PB7, 2, 0x184, BIT(16 + 9) | BIT(9)), /* uart3-rxm1 */
 };
 
 static struct rockchip_mux_route_data rk3128_mux_route_data[] = {
-	{
-		/* spi-0 */
-		.bank_num = 1,
-		.pin = 10,
-		.func = 1,
-		.route_offset = 0x144,
-		.route_val = BIT(16 + 3) | BIT(16 + 4),
-	}, {
-		/* spi-1 */
-		.bank_num = 1,
-		.pin = 27,
-		.func = 3,
-		.route_offset = 0x144,
-		.route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(3),
-	}, {
-		/* spi-2 */
-		.bank_num = 0,
-		.pin = 13,
-		.func = 2,
-		.route_offset = 0x144,
-		.route_val = BIT(16 + 3) | BIT(16 + 4) | BIT(4),
-	}, {
-		/* i2s-0 */
-		.bank_num = 1,
-		.pin = 5,
-		.func = 1,
-		.route_offset = 0x144,
-		.route_val = BIT(16 + 5),
-	}, {
-		/* i2s-1 */
-		.bank_num = 0,
-		.pin = 14,
-		.func = 1,
-		.route_offset = 0x144,
-		.route_val = BIT(16 + 5) | BIT(5),
-	}, {
-		/* emmc-0 */
-		.bank_num = 1,
-		.pin = 22,
-		.func = 2,
-		.route_offset = 0x144,
-		.route_val = BIT(16 + 6),
-	}, {
-		/* emmc-1 */
-		.bank_num = 2,
-		.pin = 4,
-		.func = 2,
-		.route_offset = 0x144,
-		.route_val = BIT(16 + 6) | BIT(6),
-	},
+	RK_MUXROUTE_SAME(1, RK_PB2, 1, 0x144, BIT(16 + 3) | BIT(16 + 4)), /* spi-0 */
+	RK_MUXROUTE_SAME(1, RK_PD3, 3, 0x144, BIT(16 + 3) | BIT(16 + 4) | BIT(3)), /* spi-1 */
+	RK_MUXROUTE_SAME(0, RK_PB5, 2, 0x144, BIT(16 + 3) | BIT(16 + 4) | BIT(4)), /* spi-2 */
+	RK_MUXROUTE_SAME(1, RK_PA5, 1, 0x144, BIT(16 + 5)), /* i2s-0 */
+	RK_MUXROUTE_SAME(0, RK_PB6, 1, 0x144, BIT(16 + 5) | BIT(5)), /* i2s-1 */
+	RK_MUXROUTE_SAME(1, RK_PC6, 2, 0x144, BIT(16 + 6)), /* emmc-0 */
+	RK_MUXROUTE_SAME(2, RK_PA4, 2, 0x144, BIT(16 + 6) | BIT(6)), /* emmc-1 */
+};
+
+static struct rockchip_mux_route_data rk3188_mux_route_data[] = {
+	RK_MUXROUTE_SAME(0, RK_PD0, 1, 0xa0, BIT(16 + 11)), /* non-iomuxed emmc/flash pins on flash-dqs */
+	RK_MUXROUTE_SAME(0, RK_PD0, 2, 0xa0, BIT(16 + 11) | BIT(11)), /* non-iomuxed emmc/flash pins on emmc-clk */
 };
 
 static struct rockchip_mux_route_data rk3228_mux_route_data[] = {
-	{
-		/* pwm0-0 */
-		.bank_num = 0,
-		.pin = 26,
-		.func = 1,
-		.route_offset = 0x50,
-		.route_val = BIT(16),
-	}, {
-		/* pwm0-1 */
-		.bank_num = 3,
-		.pin = 21,
-		.func = 1,
-		.route_offset = 0x50,
-		.route_val = BIT(16) | BIT(0),
-	}, {
-		/* pwm1-0 */
-		.bank_num = 0,
-		.pin = 27,
-		.func = 1,
-		.route_offset = 0x50,
-		.route_val = BIT(16 + 1),
-	}, {
-		/* pwm1-1 */
-		.bank_num = 0,
-		.pin = 30,
-		.func = 2,
-		.route_offset = 0x50,
-		.route_val = BIT(16 + 1) | BIT(1),
-	}, {
-		/* pwm2-0 */
-		.bank_num = 0,
-		.pin = 28,
-		.func = 1,
-		.route_offset = 0x50,
-		.route_val = BIT(16 + 2),
-	}, {
-		/* pwm2-1 */
-		.bank_num = 1,
-		.pin = 12,
-		.func = 2,
-		.route_offset = 0x50,
-		.route_val = BIT(16 + 2) | BIT(2),
-	}, {
-		/* pwm3-0 */
-		.bank_num = 3,
-		.pin = 26,
-		.func = 1,
-		.route_offset = 0x50,
-		.route_val = BIT(16 + 3),
-	}, {
-		/* pwm3-1 */
-		.bank_num = 1,
-		.pin = 11,
-		.func = 2,
-		.route_offset = 0x50,
-		.route_val = BIT(16 + 3) | BIT(3),
-	}, {
-		/* sdio-0_d0 */
-		.bank_num = 1,
-		.pin = 1,
-		.func = 1,
-		.route_offset = 0x50,
-		.route_val = BIT(16 + 4),
-	}, {
-		/* sdio-1_d0 */
-		.bank_num = 3,
-		.pin = 2,
-		.func = 1,
-		.route_offset = 0x50,
-		.route_val = BIT(16 + 4) | BIT(4),
-	}, {
-		/* spi-0_rx */
-		.bank_num = 0,
-		.pin = 13,
-		.func = 2,
-		.route_offset = 0x50,
-		.route_val = BIT(16 + 5),
-	}, {
-		/* spi-1_rx */
-		.bank_num = 2,
-		.pin = 0,
-		.func = 2,
-		.route_offset = 0x50,
-		.route_val = BIT(16 + 5) | BIT(5),
-	}, {
-		/* emmc-0_cmd */
-		.bank_num = 1,
-		.pin = 22,
-		.func = 2,
-		.route_offset = 0x50,
-		.route_val = BIT(16 + 7),
-	}, {
-		/* emmc-1_cmd */
-		.bank_num = 2,
-		.pin = 4,
-		.func = 2,
-		.route_offset = 0x50,
-		.route_val = BIT(16 + 7) | BIT(7),
-	}, {
-		/* uart2-0_rx */
-		.bank_num = 1,
-		.pin = 19,
-		.func = 2,
-		.route_offset = 0x50,
-		.route_val = BIT(16 + 8),
-	}, {
-		/* uart2-1_rx */
-		.bank_num = 1,
-		.pin = 10,
-		.func = 2,
-		.route_offset = 0x50,
-		.route_val = BIT(16 + 8) | BIT(8),
-	}, {
-		/* uart1-0_rx */
-		.bank_num = 1,
-		.pin = 10,
-		.func = 1,
-		.route_offset = 0x50,
-		.route_val = BIT(16 + 11),
-	}, {
-		/* uart1-1_rx */
-		.bank_num = 3,
-		.pin = 13,
-		.func = 1,
-		.route_offset = 0x50,
-		.route_val = BIT(16 + 11) | BIT(11),
-	},
+	RK_MUXROUTE_SAME(0, RK_PD2, 1, 0x50, BIT(16)), /* pwm0-0 */
+	RK_MUXROUTE_SAME(3, RK_PC5, 1, 0x50, BIT(16) | BIT(0)), /* pwm0-1 */
+	RK_MUXROUTE_SAME(0, RK_PD3, 1, 0x50, BIT(16 + 1)), /* pwm1-0 */
+	RK_MUXROUTE_SAME(0, RK_PD6, 2, 0x50, BIT(16 + 1) | BIT(1)), /* pwm1-1 */
+	RK_MUXROUTE_SAME(0, RK_PD4, 1, 0x50, BIT(16 + 2)), /* pwm2-0 */
+	RK_MUXROUTE_SAME(1, RK_PB4, 2, 0x50, BIT(16 + 2) | BIT(2)), /* pwm2-1 */
+	RK_MUXROUTE_SAME(3, RK_PD2, 1, 0x50, BIT(16 + 3)), /* pwm3-0 */
+	RK_MUXROUTE_SAME(1, RK_PB3, 2, 0x50, BIT(16 + 3) | BIT(3)), /* pwm3-1 */
+	RK_MUXROUTE_SAME(1, RK_PA1, 1, 0x50, BIT(16 + 4)), /* sdio-0_d0 */
+	RK_MUXROUTE_SAME(3, RK_PA2, 1, 0x50, BIT(16 + 4) | BIT(4)), /* sdio-1_d0 */
+	RK_MUXROUTE_SAME(0, RK_PB5, 2, 0x50, BIT(16 + 5)), /* spi-0_rx */
+	RK_MUXROUTE_SAME(2, RK_PA0, 2, 0x50, BIT(16 + 5) | BIT(5)), /* spi-1_rx */
+	RK_MUXROUTE_SAME(1, RK_PC6, 2, 0x50, BIT(16 + 7)), /* emmc-0_cmd */
+	RK_MUXROUTE_SAME(2, RK_PA4, 2, 0x50, BIT(16 + 7) | BIT(7)), /* emmc-1_cmd */
+	RK_MUXROUTE_SAME(1, RK_PC3, 2, 0x50, BIT(16 + 8)), /* uart2-0_rx */
+	RK_MUXROUTE_SAME(1, RK_PB2, 2, 0x50, BIT(16 + 8) | BIT(8)), /* uart2-1_rx */
+	RK_MUXROUTE_SAME(1, RK_PB2, 1, 0x50, BIT(16 + 11)), /* uart1-0_rx */
+	RK_MUXROUTE_SAME(3, RK_PB5, 1, 0x50, BIT(16 + 11) | BIT(11)), /* uart1-1_rx */
 };
 
 static struct rockchip_mux_route_data rk3288_mux_route_data[] = {
-	{
-		/* edphdmi_cecinoutt1 */
-		.bank_num = 7,
-		.pin = 16,
-		.func = 2,
-		.route_offset = 0x264,
-		.route_val = BIT(16 + 12) | BIT(12),
-	}, {
-		/* edphdmi_cecinout */
-		.bank_num = 7,
-		.pin = 23,
-		.func = 4,
-		.route_offset = 0x264,
-		.route_val = BIT(16 + 12),
-	},
+	RK_MUXROUTE_SAME(7, RK_PC0, 2, 0x264, BIT(16 + 12) | BIT(12)), /* edphdmi_cecinoutt1 */
+	RK_MUXROUTE_SAME(7, RK_PC7, 4, 0x264, BIT(16 + 12)), /* edphdmi_cecinout */
 };
 
 static struct rockchip_mux_route_data rk3308_mux_route_data[] = {
-	{
-		/* rtc_clk */
-		.bank_num = 0,
-		.pin = 19,
-		.func = 1,
-		.route_offset = 0x314,
-		.route_val = BIT(16 + 0) | BIT(0),
-	}, {
-		/* uart2_rxm0 */
-		.bank_num = 1,
-		.pin = 22,
-		.func = 2,
-		.route_offset = 0x314,
-		.route_val = BIT(16 + 2) | BIT(16 + 3),
-	}, {
-		/* uart2_rxm1 */
-		.bank_num = 4,
-		.pin = 26,
-		.func = 2,
-		.route_offset = 0x314,
-		.route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2),
-	}, {
-		/* i2c3_sdam0 */
-		.bank_num = 0,
-		.pin = 23,
-		.func = 2,
-		.route_offset = 0x314,
-		.route_val = BIT(16 + 4),
-	}, {
-		/* i2c3_sdam1 */
-		.bank_num = 3,
-		.pin = 12,
-		.func = 2,
-		.route_offset = 0x314,
-		.route_val = BIT(16 + 4) | BIT(4),
-	}, {
-		/* i2s-8ch-1-sclktxm0 */
-		.bank_num = 1,
-		.pin = 3,
-		.func = 2,
-		.route_offset = 0x308,
-		.route_val = BIT(16 + 3),
-	}, {
-		/* i2s-8ch-1-sclkrxm0 */
-		.bank_num = 1,
-		.pin = 4,
-		.func = 2,
-		.route_offset = 0x308,
-		.route_val = BIT(16 + 3),
-	}, {
-		/* i2s-8ch-1-sclktxm1 */
-		.bank_num = 1,
-		.pin = 13,
-		.func = 2,
-		.route_offset = 0x308,
-		.route_val = BIT(16 + 3) | BIT(3),
-	}, {
-		/* i2s-8ch-1-sclkrxm1 */
-		.bank_num = 1,
-		.pin = 14,
-		.func = 2,
-		.route_offset = 0x308,
-		.route_val = BIT(16 + 3) | BIT(3),
-	}, {
-		/* pdm-clkm0 */
-		.bank_num = 1,
-		.pin = 4,
-		.func = 3,
-		.route_offset = 0x308,
-		.route_val = BIT(16 + 12) | BIT(16 + 13),
-	}, {
-		/* pdm-clkm1 */
-		.bank_num = 1,
-		.pin = 14,
-		.func = 4,
-		.route_offset = 0x308,
-		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
-	}, {
-		/* pdm-clkm2 */
-		.bank_num = 2,
-		.pin = 6,
-		.func = 2,
-		.route_offset = 0x308,
-		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
-	}, {
-		/* pdm-clkm-m2 */
-		.bank_num = 2,
-		.pin = 4,
-		.func = 3,
-		.route_offset = 0x600,
-		.route_val = BIT(16 + 2) | BIT(2),
-	},
+	RK_MUXROUTE_SAME(0, RK_PC3, 1, 0x314, BIT(16 + 0) | BIT(0)), /* rtc_clk */
+	RK_MUXROUTE_SAME(1, RK_PC6, 2, 0x314, BIT(16 + 2) | BIT(16 + 3)), /* uart2_rxm0 */
+	RK_MUXROUTE_SAME(4, RK_PD2, 2, 0x314, BIT(16 + 2) | BIT(16 + 3) | BIT(2)), /* uart2_rxm1 */
+	RK_MUXROUTE_SAME(0, RK_PC7, 2, 0x314, BIT(16 + 4)), /* i2c3_sdam0 */
+	RK_MUXROUTE_SAME(3, RK_PB4, 2, 0x314, BIT(16 + 4) | BIT(4)), /* i2c3_sdam1 */
+	RK_MUXROUTE_SAME(1, RK_PA3, 2, 0x308, BIT(16 + 3)), /* i2s-8ch-1-sclktxm0 */
+	RK_MUXROUTE_SAME(1, RK_PA4, 2, 0x308, BIT(16 + 3)), /* i2s-8ch-1-sclkrxm0 */
+	RK_MUXROUTE_SAME(1, RK_PB5, 2, 0x308, BIT(16 + 3) | BIT(3)), /* i2s-8ch-1-sclktxm1 */
+	RK_MUXROUTE_SAME(1, RK_PB6, 2, 0x308, BIT(16 + 3) | BIT(3)), /* i2s-8ch-1-sclkrxm1 */
+	RK_MUXROUTE_SAME(1, RK_PA4, 3, 0x308, BIT(16 + 12) | BIT(16 + 13)), /* pdm-clkm0 */
+	RK_MUXROUTE_SAME(1, RK_PB6, 4, 0x308, BIT(16 + 12) | BIT(16 + 13) | BIT(12)), /* pdm-clkm1 */
+	RK_MUXROUTE_SAME(2, RK_PA6, 2, 0x308, BIT(16 + 12) | BIT(16 + 13) | BIT(13)), /* pdm-clkm2 */
+	RK_MUXROUTE_SAME(2, RK_PA4, 3, 0x600, BIT(16 + 2) | BIT(2)), /* pdm-clkm-m2 */
 };
 
 static struct rockchip_mux_route_data rk3308b_mux_route_data[] = {
-	{
-		/* rtc_clk */
-		.bank_num = 0,
-		.pin = 19,
-		.func = 1,
-		.route_offset = 0x314,
-		.route_val = BIT(16 + 0) | BIT(0),
-	}, {
-		/* uart2_rxm0 */
-		.bank_num = 1,
-		.pin = 22,
-		.func = 2,
-		.route_offset = 0x314,
-		.route_val = BIT(16 + 2) | BIT(16 + 3),
-	}, {
-		/* uart2_rxm1 */
-		.bank_num = 4,
-		.pin = 26,
-		.func = 2,
-		.route_offset = 0x314,
-		.route_val = BIT(16 + 2) | BIT(16 + 3) | BIT(2),
-	}, {
-		/* i2c3_sdam0 */
-		.bank_num = 0,
-		.pin = 15,
-		.func = 2,
-		.route_offset = 0x608,
-		.route_val = BIT(16 + 8) | BIT(16 + 9),
-	}, {
-		/* i2c3_sdam1 */
-		.bank_num = 3,
-		.pin = 12,
-		.func = 2,
-		.route_offset = 0x608,
-		.route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(8),
-	}, {
-		/* i2c3_sdam2 */
-		.bank_num = 2,
-		.pin = 0,
-		.func = 3,
-		.route_offset = 0x608,
-		.route_val = BIT(16 + 8) | BIT(16 + 9) | BIT(9),
-	}, {
-		/* i2s-8ch-1-sclktxm0 */
-		.bank_num = 1,
-		.pin = 3,
-		.func = 2,
-		.route_offset = 0x308,
-		.route_val = BIT(16 + 3),
-	}, {
-		/* i2s-8ch-1-sclkrxm0 */
-		.bank_num = 1,
-		.pin = 4,
-		.func = 2,
-		.route_offset = 0x308,
-		.route_val = BIT(16 + 3),
-	}, {
-		/* i2s-8ch-1-sclktxm1 */
-		.bank_num = 1,
-		.pin = 13,
-		.func = 2,
-		.route_offset = 0x308,
-		.route_val = BIT(16 + 3) | BIT(3),
-	}, {
-		/* i2s-8ch-1-sclkrxm1 */
-		.bank_num = 1,
-		.pin = 14,
-		.func = 2,
-		.route_offset = 0x308,
-		.route_val = BIT(16 + 3) | BIT(3),
-	}, {
-		/* pdm-clkm0 */
-		.bank_num = 1,
-		.pin = 4,
-		.func = 3,
-		.route_offset = 0x308,
-		.route_val =  BIT(16 + 12) | BIT(16 + 13),
-	}, {
-		/* pdm-clkm1 */
-		.bank_num = 1,
-		.pin = 14,
-		.func = 4,
-		.route_offset = 0x308,
-		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
-	}, {
-		/* pdm-clkm2 */
-		.bank_num = 2,
-		.pin = 6,
-		.func = 2,
-		.route_offset = 0x308,
-		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
-	}, {
-		/* pdm-clkm-m2 */
-		.bank_num = 2,
-		.pin = 4,
-		.func = 3,
-		.route_offset = 0x600,
-		.route_val = BIT(16 + 2) | BIT(2),
-	}, {
-		/* spi1_miso */
-		.bank_num = 3,
-		.pin = 10,
-		.func = 3,
-		.route_offset = 0x314,
-		.route_val = BIT(16 + 9),
-	}, {
-		/* spi1_miso_m1 */
-		.bank_num = 2,
-		.pin = 4,
-		.func = 2,
-		.route_offset = 0x314,
-		.route_val = BIT(16 + 9) | BIT(9),
-	}, {
-		/* owire_m0 */
-		.bank_num = 0,
-		.pin = 11,
-		.func = 3,
-		.route_offset = 0x314,
-		.route_val = BIT(16 + 10) | BIT(16 + 11),
-	}, {
-		/* owire_m1 */
-		.bank_num = 1,
-		.pin = 22,
-		.func = 7,
-		.route_offset = 0x314,
-		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10),
-	}, {
-		/* owire_m2 */
-		.bank_num = 2,
-		.pin = 2,
-		.func = 5,
-		.route_offset = 0x314,
-		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11),
-	}, {
-		/* can_rxd_m0 */
-		.bank_num = 0,
-		.pin = 11,
-		.func = 2,
-		.route_offset = 0x314,
-		.route_val = BIT(16 + 12) | BIT(16 + 13),
-	}, {
-		/* can_rxd_m1 */
-		.bank_num = 1,
-		.pin = 22,
-		.func = 5,
-		.route_offset = 0x314,
-		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(12),
-	}, {
-		/* can_rxd_m2 */
-		.bank_num = 2,
-		.pin = 2,
-		.func = 4,
-		.route_offset = 0x314,
-		.route_val = BIT(16 + 12) | BIT(16 + 13) | BIT(13),
-	}, {
-		/* mac_rxd0_m0 */
-		.bank_num = 1,
-		.pin = 20,
-		.func = 3,
-		.route_offset = 0x314,
-		.route_val = BIT(16 + 14),
-	}, {
-		/* mac_rxd0_m1 */
-		.bank_num = 4,
-		.pin = 2,
-		.func = 2,
-		.route_offset = 0x314,
-		.route_val = BIT(16 + 14) | BIT(14),
-	}, {
-		/* uart3_rx */
-		.bank_num = 3,
-		.pin = 12,
-		.func = 4,
-		.route_offset = 0x314,
-		.route_val = BIT(16 + 15),
-	}, {
-		/* uart3_rx_m1 */
-		.bank_num = 0,
-		.pin = 17,
-		.func = 3,
-		.route_offset = 0x314,
-		.route_val = BIT(16 + 15) | BIT(15),
-	},
+	RK_MUXROUTE_SAME(0, RK_PC3, 1, 0x314, BIT(16 + 0) | BIT(0)), /* rtc_clk */
+	RK_MUXROUTE_SAME(1, RK_PC6, 2, 0x314, BIT(16 + 2) | BIT(16 + 3)), /* uart2_rxm0 */
+	RK_MUXROUTE_SAME(4, RK_PD2, 2, 0x314, BIT(16 + 2) | BIT(16 + 3) | BIT(2)), /* uart2_rxm1 */
+	RK_MUXROUTE_SAME(0, RK_PB7, 2, 0x608, BIT(16 + 8) | BIT(16 + 9)), /* i2c3_sdam0 */
+	RK_MUXROUTE_SAME(3, RK_PB4, 2, 0x608, BIT(16 + 8) | BIT(16 + 9) | BIT(8)), /* i2c3_sdam1 */
+	RK_MUXROUTE_SAME(2, RK_PA0, 3, 0x608, BIT(16 + 8) | BIT(16 + 9) | BIT(9)), /* i2c3_sdam2 */
+	RK_MUXROUTE_SAME(1, RK_PA3, 2, 0x308, BIT(16 + 3)), /* i2s-8ch-1-sclktxm0 */
+	RK_MUXROUTE_SAME(1, RK_PA4, 2, 0x308, BIT(16 + 3)), /* i2s-8ch-1-sclkrxm0 */
+	RK_MUXROUTE_SAME(1, RK_PB5, 2, 0x308, BIT(16 + 3) | BIT(3)), /* i2s-8ch-1-sclktxm1 */
+	RK_MUXROUTE_SAME(1, RK_PB6, 2, 0x308, BIT(16 + 3) | BIT(3)), /* i2s-8ch-1-sclkrxm1 */
+	RK_MUXROUTE_SAME(1, RK_PA4, 3, 0x308, BIT(16 + 12) | BIT(16 + 13)), /* pdm-clkm0 */
+	RK_MUXROUTE_SAME(1, RK_PB6, 4, 0x308, BIT(16 + 12) | BIT(16 + 13) | BIT(12)), /* pdm-clkm1 */
+	RK_MUXROUTE_SAME(2, RK_PA6, 2, 0x308, BIT(16 + 12) | BIT(16 + 13) | BIT(13)), /* pdm-clkm2 */
+	RK_MUXROUTE_SAME(2, RK_PA4, 3, 0x600, BIT(16 + 2) | BIT(2)), /* pdm-clkm-m2 */
+	RK_MUXROUTE_SAME(3, RK_PB2, 3, 0x314, BIT(16 + 9)), /* spi1_miso */
+	RK_MUXROUTE_SAME(2, RK_PA4, 2, 0x314, BIT(16 + 9) | BIT(9)), /* spi1_miso_m1 */
+	RK_MUXROUTE_SAME(0, RK_PB3, 3, 0x314, BIT(16 + 10) | BIT(16 + 11)), /* owire_m0 */
+	RK_MUXROUTE_SAME(1, RK_PC6, 7, 0x314, BIT(16 + 10) | BIT(16 + 11) | BIT(10)), /* owire_m1 */
+	RK_MUXROUTE_SAME(2, RK_PA2, 5, 0x314, BIT(16 + 10) | BIT(16 + 11) | BIT(11)), /* owire_m2 */
+	RK_MUXROUTE_SAME(0, RK_PB3, 2, 0x314, BIT(16 + 12) | BIT(16 + 13)), /* can_rxd_m0 */
+	RK_MUXROUTE_SAME(1, RK_PC6, 5, 0x314, BIT(16 + 12) | BIT(16 + 13) | BIT(12)), /* can_rxd_m1 */
+	RK_MUXROUTE_SAME(2, RK_PA2, 4, 0x314, BIT(16 + 12) | BIT(16 + 13) | BIT(13)), /* can_rxd_m2 */
+	RK_MUXROUTE_SAME(1, RK_PC4, 3, 0x314, BIT(16 + 14)), /* mac_rxd0_m0 */
+	RK_MUXROUTE_SAME(4, RK_PA2, 2, 0x314, BIT(16 + 14) | BIT(14)), /* mac_rxd0_m1 */
+	RK_MUXROUTE_SAME(3, RK_PB4, 4, 0x314, BIT(16 + 15)), /* uart3_rx */
+	RK_MUXROUTE_SAME(0, RK_PC1, 3, 0x314, BIT(16 + 15) | BIT(15)), /* uart3_rx_m1 */
 };
 
 static struct rockchip_mux_route_data rk3328_mux_route_data[] = {
-	{
-		/* uart2dbg_rxm0 */
-		.bank_num = 1,
-		.pin = 1,
-		.func = 2,
-		.route_offset = 0x50,
-		.route_val = BIT(16) | BIT(16 + 1),
-	}, {
-		/* uart2dbg_rxm1 */
-		.bank_num = 2,
-		.pin = 1,
-		.func = 1,
-		.route_offset = 0x50,
-		.route_val = BIT(16) | BIT(16 + 1) | BIT(0),
-	}, {
-		/* gmac-m1_rxd0 */
-		.bank_num = 1,
-		.pin = 11,
-		.func = 2,
-		.route_offset = 0x50,
-		.route_val = BIT(16 + 2) | BIT(2),
-	}, {
-		/* gmac-m1-optimized_rxd3 */
-		.bank_num = 1,
-		.pin = 14,
-		.func = 2,
-		.route_offset = 0x50,
-		.route_val = BIT(16 + 10) | BIT(10),
-	}, {
-		/* pdm_sdi0m0 */
-		.bank_num = 2,
-		.pin = 19,
-		.func = 2,
-		.route_offset = 0x50,
-		.route_val = BIT(16 + 3),
-	}, {
-		/* pdm_sdi0m1 */
-		.bank_num = 1,
-		.pin = 23,
-		.func = 3,
-		.route_offset = 0x50,
-		.route_val =  BIT(16 + 3) | BIT(3),
-	}, {
-		/* spi_rxdm2 */
-		.bank_num = 3,
-		.pin = 2,
-		.func = 4,
-		.route_offset = 0x50,
-		.route_val =  BIT(16 + 4) | BIT(16 + 5) | BIT(5),
-	}, {
-		/* i2s2_sdim0 */
-		.bank_num = 1,
-		.pin = 24,
-		.func = 1,
-		.route_offset = 0x50,
-		.route_val = BIT(16 + 6),
-	}, {
-		/* i2s2_sdim1 */
-		.bank_num = 3,
-		.pin = 2,
-		.func = 6,
-		.route_offset = 0x50,
-		.route_val =  BIT(16 + 6) | BIT(6),
-	}, {
-		/* card_iom1 */
-		.bank_num = 2,
-		.pin = 22,
-		.func = 3,
-		.route_offset = 0x50,
-		.route_val =  BIT(16 + 7) | BIT(7),
-	}, {
-		/* tsp_d5m1 */
-		.bank_num = 2,
-		.pin = 16,
-		.func = 3,
-		.route_offset = 0x50,
-		.route_val =  BIT(16 + 8) | BIT(8),
-	}, {
-		/* cif_data5m1 */
-		.bank_num = 2,
-		.pin = 16,
-		.func = 4,
-		.route_offset = 0x50,
-		.route_val =  BIT(16 + 9) | BIT(9),
-	},
+	RK_MUXROUTE_SAME(1, RK_PA1, 2, 0x50, BIT(16) | BIT(16 + 1)), /* uart2dbg_rxm0 */
+	RK_MUXROUTE_SAME(2, RK_PA1, 1, 0x50, BIT(16) | BIT(16 + 1) | BIT(0)), /* uart2dbg_rxm1 */
+	RK_MUXROUTE_SAME(1, RK_PB3, 2, 0x50, BIT(16 + 2) | BIT(2)), /* gmac-m1_rxd0 */
+	RK_MUXROUTE_SAME(1, RK_PB6, 2, 0x50, BIT(16 + 10) | BIT(10)), /* gmac-m1-optimized_rxd3 */
+	RK_MUXROUTE_SAME(2, RK_PC3, 2, 0x50, BIT(16 + 3)), /* pdm_sdi0m0 */
+	RK_MUXROUTE_SAME(1, RK_PC7, 3, 0x50, BIT(16 + 3) | BIT(3)), /* pdm_sdi0m1 */
+	RK_MUXROUTE_SAME(3, RK_PA2, 4, 0x50, BIT(16 + 4) | BIT(16 + 5) | BIT(5)), /* spi_rxdm2 */
+	RK_MUXROUTE_SAME(1, RK_PD0, 1, 0x50, BIT(16 + 6)), /* i2s2_sdim0 */
+	RK_MUXROUTE_SAME(3, RK_PA2, 6, 0x50, BIT(16 + 6) | BIT(6)), /* i2s2_sdim1 */
+	RK_MUXROUTE_SAME(2, RK_PC6, 3, 0x50, BIT(16 + 7) | BIT(7)), /* card_iom1 */
+	RK_MUXROUTE_SAME(2, RK_PC0, 3, 0x50, BIT(16 + 8) | BIT(8)), /* tsp_d5m1 */
+	RK_MUXROUTE_SAME(2, RK_PC0, 4, 0x50, BIT(16 + 9) | BIT(9)), /* cif_data5m1 */
 };
 
 static struct rockchip_mux_route_data rk3399_mux_route_data[] = {
-	{
-		/* uart2dbga_rx */
-		.bank_num = 4,
-		.pin = 8,
-		.func = 2,
-		.route_offset = 0xe21c,
-		.route_val = BIT(16 + 10) | BIT(16 + 11),
-	}, {
-		/* uart2dbgb_rx */
-		.bank_num = 4,
-		.pin = 16,
-		.func = 2,
-		.route_offset = 0xe21c,
-		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(10),
-	}, {
-		/* uart2dbgc_rx */
-		.bank_num = 4,
-		.pin = 19,
-		.func = 1,
-		.route_offset = 0xe21c,
-		.route_val = BIT(16 + 10) | BIT(16 + 11) | BIT(11),
-	}, {
-		/* pcie_clkreqn */
-		.bank_num = 2,
-		.pin = 26,
-		.func = 2,
-		.route_offset = 0xe21c,
-		.route_val = BIT(16 + 14),
-	}, {
-		/* pcie_clkreqnb */
-		.bank_num = 4,
-		.pin = 24,
-		.func = 1,
-		.route_offset = 0xe21c,
-		.route_val = BIT(16 + 14) | BIT(14),
-	},
+	RK_MUXROUTE_SAME(4, RK_PB0, 2, 0xe21c, BIT(16 + 10) | BIT(16 + 11)), /* uart2dbga_rx */
+	RK_MUXROUTE_SAME(4, RK_PC0, 2, 0xe21c, BIT(16 + 10) | BIT(16 + 11) | BIT(10)), /* uart2dbgb_rx */
+	RK_MUXROUTE_SAME(4, RK_PC3, 1, 0xe21c, BIT(16 + 10) | BIT(16 + 11) | BIT(11)), /* uart2dbgc_rx */
+	RK_MUXROUTE_SAME(2, RK_PD2, 2, 0xe21c, BIT(16 + 14)), /* pcie_clkreqn */
+	RK_MUXROUTE_SAME(4, RK_PD0, 1, 0xe21c, BIT(16 + 14) | BIT(14)), /* pcie_clkreqnb */
 };
 
 static struct rockchip_mux_route_data rk3568_mux_route_data[] = {
-	MR_PMUGRF(RK_GPIO0, RK_PB7, RK_FUNC_1, 0x0110, RK_GENMASK_VAL(1, 0, 0)), /* PWM0 IO mux selection M0 */
-	MR_PMUGRF(RK_GPIO0, RK_PC7, RK_FUNC_2, 0x0110, RK_GENMASK_VAL(1, 0, 1)), /* PWM0 IO mux selection M1 */
-	MR_PMUGRF(RK_GPIO0, RK_PC0, RK_FUNC_1, 0x0110, RK_GENMASK_VAL(3, 2, 0)), /* PWM1 IO mux selection M0 */
-	MR_PMUGRF(RK_GPIO0, RK_PB5, RK_FUNC_4, 0x0110, RK_GENMASK_VAL(3, 2, 1)), /* PWM1 IO mux selection M1 */
-	MR_PMUGRF(RK_GPIO0, RK_PC1, RK_FUNC_1, 0x0110, RK_GENMASK_VAL(5, 4, 0)), /* PWM2 IO mux selection M0 */
-	MR_PMUGRF(RK_GPIO0, RK_PB6, RK_FUNC_4, 0x0110, RK_GENMASK_VAL(5, 4, 1)), /* PWM2 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO0, RK_PB3, RK_FUNC_2, 0x0300, RK_GENMASK_VAL(0, 0, 0)), /* CAN0 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO2, RK_PA1, RK_FUNC_4, 0x0300, RK_GENMASK_VAL(0, 0, 1)), /* CAN0 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO1, RK_PA1, RK_FUNC_3, 0x0300, RK_GENMASK_VAL(2, 2, 0)), /* CAN1 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO4, RK_PC3, RK_FUNC_3, 0x0300, RK_GENMASK_VAL(2, 2, 1)), /* CAN1 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO4, RK_PB5, RK_FUNC_3, 0x0300, RK_GENMASK_VAL(4, 4, 0)), /* CAN2 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO2, RK_PB2, RK_FUNC_4, 0x0300, RK_GENMASK_VAL(4, 4, 1)), /* CAN2 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO4, RK_PC4, RK_FUNC_1, 0x0300, RK_GENMASK_VAL(6, 6, 0)), /* EDPDP_HPDIN IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO0, RK_PC2, RK_FUNC_2, 0x0300, RK_GENMASK_VAL(6, 6, 1)), /* EDPDP_HPDIN IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO3, RK_PB1, RK_FUNC_3, 0x0300, RK_GENMASK_VAL(8, 8, 0)), /* GMAC1 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO4, RK_PA7, RK_FUNC_3, 0x0300, RK_GENMASK_VAL(8, 8, 1)), /* GMAC1 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO4, RK_PB7, RK_FUNC_3, 0x0300, RK_GENMASK_VAL(8, 8, 1)), /* GMAC1 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO4, RK_PD1, RK_FUNC_1, 0x0300, RK_GENMASK_VAL(10, 10, 0)), /* HDMITX IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO0, RK_PC7, RK_FUNC_1, 0x0300, RK_GENMASK_VAL(10, 10, 1)), /* HDMITX IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO0, RK_PB6, RK_FUNC_1, 0x0300, RK_GENMASK_VAL(14, 14, 0)), /* I2C2 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO4, RK_PB4, RK_FUNC_1, 0x0300, RK_GENMASK_VAL(14, 14, 1)), /* I2C2 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO1, RK_PA0, RK_FUNC_1, 0x0304, RK_GENMASK_VAL(0, 0, 0)), /* I2C3 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO3, RK_PB6, RK_FUNC_4, 0x0304, RK_GENMASK_VAL(0, 0, 1)), /* I2C3 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO4, RK_PB2, RK_FUNC_1, 0x0304, RK_GENMASK_VAL(2, 2, 0)), /* I2C4 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO2, RK_PB1, RK_FUNC_2, 0x0304, RK_GENMASK_VAL(2, 2, 1)), /* I2C4 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO3, RK_PB4, RK_FUNC_4, 0x0304, RK_GENMASK_VAL(4, 4, 0)), /* I2C5 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO4, RK_PD0, RK_FUNC_2, 0x0304, RK_GENMASK_VAL(4, 4, 1)), /* I2C5 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO3, RK_PB1, RK_FUNC_5, 0x0304, RK_GENMASK_VAL(14, 14, 0)), /* PWM8 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO1, RK_PD5, RK_FUNC_4, 0x0304, RK_GENMASK_VAL(14, 14, 1)), /* PWM8 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO3, RK_PB2, RK_FUNC_5, 0x0308, RK_GENMASK_VAL(0, 0, 0)), /* PWM9 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO1, RK_PD6, RK_FUNC_4, 0x0308, RK_GENMASK_VAL(0, 0, 1)), /* PWM9 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO3, RK_PB5, RK_FUNC_5, 0x0308, RK_GENMASK_VAL(2, 2, 0)), /* PWM10 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO2, RK_PA1, RK_FUNC_2, 0x0308, RK_GENMASK_VAL(2, 2, 1)), /* PWM10 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO3, RK_PB6, RK_FUNC_5, 0x0308, RK_GENMASK_VAL(4, 4, 0)), /* PWM11 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO4, RK_PC0, RK_FUNC_3, 0x0308, RK_GENMASK_VAL(4, 4, 1)), /* PWM11 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO3, RK_PB7, RK_FUNC_2, 0x0308, RK_GENMASK_VAL(6, 6, 0)), /* PWM12 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO4, RK_PC5, RK_FUNC_1, 0x0308, RK_GENMASK_VAL(6, 6, 1)), /* PWM12 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO3, RK_PC0, RK_FUNC_2, 0x0308, RK_GENMASK_VAL(8, 8, 0)), /* PWM13 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO4, RK_PC6, RK_FUNC_1, 0x0308, RK_GENMASK_VAL(8, 8, 1)), /* PWM13 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO3, RK_PC4, RK_FUNC_1, 0x0308, RK_GENMASK_VAL(10, 10, 0)), /* PWM14 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO4, RK_PC2, RK_FUNC_1, 0x0308, RK_GENMASK_VAL(10, 10, 1)), /* PWM14 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO3, RK_PC5, RK_FUNC_1, 0x0308, RK_GENMASK_VAL(12, 12, 0)), /* PWM15 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO4, RK_PC3, RK_FUNC_1, 0x0308, RK_GENMASK_VAL(12, 12, 1)), /* PWM15 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO3, RK_PD2, RK_FUNC_3, 0x0308, RK_GENMASK_VAL(14, 14, 0)), /* SDMMC2 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO3, RK_PA5, RK_FUNC_5, 0x0308, RK_GENMASK_VAL(14, 14, 1)), /* SDMMC2 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO0, RK_PB5, RK_FUNC_2, 0x030c, RK_GENMASK_VAL(0, 0, 0)), /* SPI0 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO2, RK_PD3, RK_FUNC_3, 0x030c, RK_GENMASK_VAL(0, 0, 1)), /* SPI0 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO2, RK_PB5, RK_FUNC_3, 0x030c, RK_GENMASK_VAL(2, 2, 0)), /* SPI1 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO3, RK_PC3, RK_FUNC_3, 0x030c, RK_GENMASK_VAL(2, 2, 1)), /* SPI1 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO2, RK_PC1, RK_FUNC_4, 0x030c, RK_GENMASK_VAL(4, 4, 0)), /* SPI2 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO3, RK_PA0, RK_FUNC_3, 0x030c, RK_GENMASK_VAL(4, 4, 1)), /* SPI2 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO4, RK_PB3, RK_FUNC_4, 0x030c, RK_GENMASK_VAL(6, 6, 0)), /* SPI3 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO4, RK_PC2, RK_FUNC_2, 0x030c, RK_GENMASK_VAL(6, 6, 1)), /* SPI3 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO2, RK_PB4, RK_FUNC_2, 0x030c, RK_GENMASK_VAL(8, 8, 0)), /* UART1 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO3, RK_PD6, RK_FUNC_4, 0x030c, RK_GENMASK_VAL(8, 8, 1)), /* UART1 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO0, RK_PD1, RK_FUNC_1, 0x030c, RK_GENMASK_VAL(10, 10, 0)), /* UART2 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO1, RK_PD5, RK_FUNC_2, 0x030c, RK_GENMASK_VAL(10, 10, 1)), /* UART2 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO1, RK_PA1, RK_FUNC_2, 0x030c, RK_GENMASK_VAL(12, 12, 0)), /* UART3 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO3, RK_PB7, RK_FUNC_4, 0x030c, RK_GENMASK_VAL(12, 12, 1)), /* UART3 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO1, RK_PA6, RK_FUNC_2, 0x030c, RK_GENMASK_VAL(14, 14, 0)), /* UART4 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO3, RK_PB2, RK_FUNC_4, 0x030c, RK_GENMASK_VAL(14, 14, 1)), /* UART4 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO2, RK_PA2, RK_FUNC_3, 0x0310, RK_GENMASK_VAL(0, 0, 0)), /* UART5 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO3, RK_PC2, RK_FUNC_4, 0x0310, RK_GENMASK_VAL(0, 0, 1)), /* UART5 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO2, RK_PA4, RK_FUNC_3, 0x0310, RK_GENMASK_VAL(2, 2, 0)), /* UART6 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO1, RK_PD5, RK_FUNC_3, 0x0310, RK_GENMASK_VAL(2, 2, 1)), /* UART6 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO2, RK_PA6, RK_FUNC_3, 0x0310, RK_GENMASK_VAL(5, 4, 0)), /* UART7 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO3, RK_PC4, RK_FUNC_4, 0x0310, RK_GENMASK_VAL(5, 4, 1)), /* UART7 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO4, RK_PA2, RK_FUNC_4, 0x0310, RK_GENMASK_VAL(5, 4, 2)), /* UART7 IO mux selection M2 */
-	MR_TOPGRF(RK_GPIO2, RK_PC5, RK_FUNC_3, 0x0310, RK_GENMASK_VAL(6, 6, 0)), /* UART8 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO2, RK_PD7, RK_FUNC_4, 0x0310, RK_GENMASK_VAL(6, 6, 1)), /* UART8 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO2, RK_PB0, RK_FUNC_3, 0x0310, RK_GENMASK_VAL(9, 8, 0)), /* UART9 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO4, RK_PC5, RK_FUNC_4, 0x0310, RK_GENMASK_VAL(9, 8, 1)), /* UART9 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO4, RK_PA4, RK_FUNC_4, 0x0310, RK_GENMASK_VAL(9, 8, 2)), /* UART9 IO mux selection M2 */
-	MR_TOPGRF(RK_GPIO1, RK_PA2, RK_FUNC_1, 0x0310, RK_GENMASK_VAL(11, 10, 0)), /* I2S1 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO3, RK_PC6, RK_FUNC_4, 0x0310, RK_GENMASK_VAL(11, 10, 1)), /* I2S1 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO2, RK_PD0, RK_FUNC_5, 0x0310, RK_GENMASK_VAL(11, 10, 2)), /* I2S1 IO mux selection M2 */
-	MR_TOPGRF(RK_GPIO2, RK_PC1, RK_FUNC_1, 0x0310, RK_GENMASK_VAL(12, 12, 0)), /* I2S2 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO4, RK_PB6, RK_FUNC_5, 0x0310, RK_GENMASK_VAL(12, 12, 1)), /* I2S2 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO3, RK_PA2, RK_FUNC_4, 0x0310, RK_GENMASK_VAL(14, 14, 0)), /* I2S3 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO4, RK_PC2, RK_FUNC_5, 0x0310, RK_GENMASK_VAL(14, 14, 1)), /* I2S3 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO1, RK_PA4, RK_FUNC_3, 0x0314, RK_GENMASK_VAL(1, 0, 0)), /* PDM IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO1, RK_PA6, RK_FUNC_3, 0x0314, RK_GENMASK_VAL(1, 0, 0)), /* PDM IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO3, RK_PD6, RK_FUNC_5, 0x0314, RK_GENMASK_VAL(1, 0, 1)), /* PDM IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO4, RK_PA0, RK_FUNC_4, 0x0314, RK_GENMASK_VAL(1, 0, 1)), /* PDM IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO3, RK_PC4, RK_FUNC_5, 0x0314, RK_GENMASK_VAL(1, 0, 2)), /* PDM IO mux selection M2 */
-	MR_TOPGRF(RK_GPIO0, RK_PA5, RK_FUNC_3, 0x0314, RK_GENMASK_VAL(3, 2, 0)), /* PCIE20 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO2, RK_PD0, RK_FUNC_4, 0x0314, RK_GENMASK_VAL(3, 2, 1)), /* PCIE20 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO1, RK_PB0, RK_FUNC_4, 0x0314, RK_GENMASK_VAL(3, 2, 2)), /* PCIE20 IO mux selection M2 */
-	MR_TOPGRF(RK_GPIO0, RK_PA4, RK_FUNC_3, 0x0314, RK_GENMASK_VAL(5, 4, 0)), /* PCIE30X1 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO2, RK_PD2, RK_FUNC_4, 0x0314, RK_GENMASK_VAL(5, 4, 1)), /* PCIE30X1 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO1, RK_PA5, RK_FUNC_4, 0x0314, RK_GENMASK_VAL(5, 4, 2)), /* PCIE30X1 IO mux selection M2 */
-	MR_TOPGRF(RK_GPIO0, RK_PA6, RK_FUNC_2, 0x0314, RK_GENMASK_VAL(7, 6, 0)), /* PCIE30X2 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO2, RK_PD4, RK_FUNC_4, 0x0314, RK_GENMASK_VAL(7, 6, 1)), /* PCIE30X2 IO mux selection M1 */
-	MR_TOPGRF(RK_GPIO4, RK_PC2, RK_FUNC_4, 0x0314, RK_GENMASK_VAL(7, 6, 2)), /* PCIE30X2 IO mux selection M2 */
+	RK_MUXROUTE_PMU(0, RK_PB7, 1, 0x0110, WRITE_MASK_VAL(1, 0, 0)), /* PWM0 IO mux M0 */
+	RK_MUXROUTE_PMU(0, RK_PC7, 2, 0x0110, WRITE_MASK_VAL(1, 0, 1)), /* PWM0 IO mux M1 */
+	RK_MUXROUTE_PMU(0, RK_PC0, 1, 0x0110, WRITE_MASK_VAL(3, 2, 0)), /* PWM1 IO mux M0 */
+	RK_MUXROUTE_PMU(0, RK_PB5, 4, 0x0110, WRITE_MASK_VAL(3, 2, 1)), /* PWM1 IO mux M1 */
+	RK_MUXROUTE_PMU(0, RK_PC1, 1, 0x0110, WRITE_MASK_VAL(5, 4, 0)), /* PWM2 IO mux M0 */
+	RK_MUXROUTE_PMU(0, RK_PB6, 4, 0x0110, WRITE_MASK_VAL(5, 4, 1)), /* PWM2 IO mux M1 */
+	RK_MUXROUTE_GRF(0, RK_PB3, 2, 0x0300, WRITE_MASK_VAL(0, 0, 0)), /* CAN0 IO mux M0 */
+	RK_MUXROUTE_GRF(2, RK_PA1, 4, 0x0300, WRITE_MASK_VAL(0, 0, 1)), /* CAN0 IO mux M1 */
+	RK_MUXROUTE_GRF(1, RK_PA1, 3, 0x0300, WRITE_MASK_VAL(2, 2, 0)), /* CAN1 IO mux M0 */
+	RK_MUXROUTE_GRF(4, RK_PC3, 3, 0x0300, WRITE_MASK_VAL(2, 2, 1)), /* CAN1 IO mux M1 */
+	RK_MUXROUTE_GRF(4, RK_PB5, 3, 0x0300, WRITE_MASK_VAL(4, 4, 0)), /* CAN2 IO mux M0 */
+	RK_MUXROUTE_GRF(2, RK_PB2, 4, 0x0300, WRITE_MASK_VAL(4, 4, 1)), /* CAN2 IO mux M1 */
+	RK_MUXROUTE_GRF(4, RK_PC4, 1, 0x0300, WRITE_MASK_VAL(6, 6, 0)), /* HPDIN IO mux M0 */
+	RK_MUXROUTE_GRF(0, RK_PC2, 2, 0x0300, WRITE_MASK_VAL(6, 6, 1)), /* HPDIN IO mux M1 */
+	RK_MUXROUTE_GRF(3, RK_PB1, 3, 0x0300, WRITE_MASK_VAL(8, 8, 0)), /* GMAC1 IO mux M0 */
+	RK_MUXROUTE_GRF(4, RK_PA7, 3, 0x0300, WRITE_MASK_VAL(8, 8, 1)), /* GMAC1 IO mux M1 */
+	RK_MUXROUTE_GRF(4, RK_PB7, 3, 0x0300, WRITE_MASK_VAL(8, 8, 1)), /* GMAC1 IO mux M1 */
+	RK_MUXROUTE_GRF(4, RK_PD1, 1, 0x0300, WRITE_MASK_VAL(10, 10, 0)), /* HDMITX IO mux M0 */
+	RK_MUXROUTE_GRF(0, RK_PC7, 1, 0x0300, WRITE_MASK_VAL(10, 10, 1)), /* HDMITX IO mux M1 */
+	RK_MUXROUTE_GRF(0, RK_PB6, 1, 0x0300, WRITE_MASK_VAL(14, 14, 0)), /* I2C2 IO mux M0 */
+	RK_MUXROUTE_GRF(4, RK_PB4, 1, 0x0300, WRITE_MASK_VAL(14, 14, 1)), /* I2C2 IO mux M1 */
+	RK_MUXROUTE_GRF(1, RK_PA0, 1, 0x0304, WRITE_MASK_VAL(0, 0, 0)), /* I2C3 IO mux M0 */
+	RK_MUXROUTE_GRF(3, RK_PB6, 4, 0x0304, WRITE_MASK_VAL(0, 0, 1)), /* I2C3 IO mux M1 */
+	RK_MUXROUTE_GRF(4, RK_PB2, 1, 0x0304, WRITE_MASK_VAL(2, 2, 0)), /* I2C4 IO mux M0 */
+	RK_MUXROUTE_GRF(2, RK_PB1, 2, 0x0304, WRITE_MASK_VAL(2, 2, 1)), /* I2C4 IO mux M1 */
+	RK_MUXROUTE_GRF(3, RK_PB4, 4, 0x0304, WRITE_MASK_VAL(4, 4, 0)), /* I2C5 IO mux M0 */
+	RK_MUXROUTE_GRF(4, RK_PD0, 2, 0x0304, WRITE_MASK_VAL(4, 4, 1)), /* I2C5 IO mux M1 */
+	RK_MUXROUTE_GRF(3, RK_PB1, 5, 0x0304, WRITE_MASK_VAL(14, 14, 0)), /* PWM8 IO mux M0 */
+	RK_MUXROUTE_GRF(1, RK_PD5, 4, 0x0304, WRITE_MASK_VAL(14, 14, 1)), /* PWM8 IO mux M1 */
+	RK_MUXROUTE_GRF(3, RK_PB2, 5, 0x0308, WRITE_MASK_VAL(0, 0, 0)), /* PWM9 IO mux M0 */
+	RK_MUXROUTE_GRF(1, RK_PD6, 4, 0x0308, WRITE_MASK_VAL(0, 0, 1)), /* PWM9 IO mux M1 */
+	RK_MUXROUTE_GRF(3, RK_PB5, 5, 0x0308, WRITE_MASK_VAL(2, 2, 0)), /* PWM10 IO mux M0 */
+	RK_MUXROUTE_GRF(2, RK_PA1, 2, 0x0308, WRITE_MASK_VAL(2, 2, 1)), /* PWM10 IO mux M1 */
+	RK_MUXROUTE_GRF(3, RK_PB6, 5, 0x0308, WRITE_MASK_VAL(4, 4, 0)), /* PWM11 IO mux M0 */
+	RK_MUXROUTE_GRF(4, RK_PC0, 3, 0x0308, WRITE_MASK_VAL(4, 4, 1)), /* PWM11 IO mux M1 */
+	RK_MUXROUTE_GRF(3, RK_PB7, 2, 0x0308, WRITE_MASK_VAL(6, 6, 0)), /* PWM12 IO mux M0 */
+	RK_MUXROUTE_GRF(4, RK_PC5, 1, 0x0308, WRITE_MASK_VAL(6, 6, 1)), /* PWM12 IO mux M1 */
+	RK_MUXROUTE_GRF(3, RK_PC0, 2, 0x0308, WRITE_MASK_VAL(8, 8, 0)), /* PWM13 IO mux M0 */
+	RK_MUXROUTE_GRF(4, RK_PC6, 1, 0x0308, WRITE_MASK_VAL(8, 8, 1)), /* PWM13 IO mux M1 */
+	RK_MUXROUTE_GRF(3, RK_PC4, 1, 0x0308, WRITE_MASK_VAL(10, 10, 0)), /* PWM14 IO mux M0 */
+	RK_MUXROUTE_GRF(4, RK_PC2, 1, 0x0308, WRITE_MASK_VAL(10, 10, 1)), /* PWM14 IO mux M1 */
+	RK_MUXROUTE_GRF(3, RK_PC5, 1, 0x0308, WRITE_MASK_VAL(12, 12, 0)), /* PWM15 IO mux M0 */
+	RK_MUXROUTE_GRF(4, RK_PC3, 1, 0x0308, WRITE_MASK_VAL(12, 12, 1)), /* PWM15 IO mux M1 */
+	RK_MUXROUTE_GRF(3, RK_PD2, 3, 0x0308, WRITE_MASK_VAL(14, 14, 0)), /* SDMMC2 IO mux M0 */
+	RK_MUXROUTE_GRF(3, RK_PA5, 5, 0x0308, WRITE_MASK_VAL(14, 14, 1)), /* SDMMC2 IO mux M1 */
+	RK_MUXROUTE_GRF(0, RK_PB5, 2, 0x030c, WRITE_MASK_VAL(0, 0, 0)), /* SPI0 IO mux M0 */
+	RK_MUXROUTE_GRF(2, RK_PD3, 3, 0x030c, WRITE_MASK_VAL(0, 0, 1)), /* SPI0 IO mux M1 */
+	RK_MUXROUTE_GRF(2, RK_PB5, 3, 0x030c, WRITE_MASK_VAL(2, 2, 0)), /* SPI1 IO mux M0 */
+	RK_MUXROUTE_GRF(3, RK_PC3, 3, 0x030c, WRITE_MASK_VAL(2, 2, 1)), /* SPI1 IO mux M1 */
+	RK_MUXROUTE_GRF(2, RK_PC1, 4, 0x030c, WRITE_MASK_VAL(4, 4, 0)), /* SPI2 IO mux M0 */
+	RK_MUXROUTE_GRF(3, RK_PA0, 3, 0x030c, WRITE_MASK_VAL(4, 4, 1)), /* SPI2 IO mux M1 */
+	RK_MUXROUTE_GRF(4, RK_PB3, 4, 0x030c, WRITE_MASK_VAL(6, 6, 0)), /* SPI3 IO mux M0 */
+	RK_MUXROUTE_GRF(4, RK_PC2, 2, 0x030c, WRITE_MASK_VAL(6, 6, 1)), /* SPI3 IO mux M1 */
+	RK_MUXROUTE_GRF(2, RK_PB4, 2, 0x030c, WRITE_MASK_VAL(8, 8, 0)), /* UART1 IO mux M0 */
+	RK_MUXROUTE_GRF(3, RK_PD6, 4, 0x030c, WRITE_MASK_VAL(8, 8, 1)), /* UART1 IO mux M1 */
+	RK_MUXROUTE_GRF(0, RK_PD1, 1, 0x030c, WRITE_MASK_VAL(10, 10, 0)), /* UART2 IO mux M0 */
+	RK_MUXROUTE_GRF(1, RK_PD5, 2, 0x030c, WRITE_MASK_VAL(10, 10, 1)), /* UART2 IO mux M1 */
+	RK_MUXROUTE_GRF(1, RK_PA1, 2, 0x030c, WRITE_MASK_VAL(12, 12, 0)), /* UART3 IO mux M0 */
+	RK_MUXROUTE_GRF(3, RK_PB7, 4, 0x030c, WRITE_MASK_VAL(12, 12, 1)), /* UART3 IO mux M1 */
+	RK_MUXROUTE_GRF(1, RK_PA6, 2, 0x030c, WRITE_MASK_VAL(14, 14, 0)), /* UART4 IO mux M0 */
+	RK_MUXROUTE_GRF(3, RK_PB2, 4, 0x030c, WRITE_MASK_VAL(14, 14, 1)), /* UART4 IO mux M1 */
+	RK_MUXROUTE_GRF(2, RK_PA2, 3, 0x0310, WRITE_MASK_VAL(0, 0, 0)), /* UART5 IO mux M0 */
+	RK_MUXROUTE_GRF(3, RK_PC2, 4, 0x0310, WRITE_MASK_VAL(0, 0, 1)), /* UART5 IO mux M1 */
+	RK_MUXROUTE_GRF(2, RK_PA4, 3, 0x0310, WRITE_MASK_VAL(2, 2, 0)), /* UART6 IO mux M0 */
+	RK_MUXROUTE_GRF(1, RK_PD5, 3, 0x0310, WRITE_MASK_VAL(2, 2, 1)), /* UART6 IO mux M1 */
+	RK_MUXROUTE_GRF(2, RK_PA6, 3, 0x0310, WRITE_MASK_VAL(5, 4, 0)), /* UART7 IO mux M0 */
+	RK_MUXROUTE_GRF(3, RK_PC4, 4, 0x0310, WRITE_MASK_VAL(5, 4, 1)), /* UART7 IO mux M1 */
+	RK_MUXROUTE_GRF(4, RK_PA2, 4, 0x0310, WRITE_MASK_VAL(5, 4, 2)), /* UART7 IO mux M2 */
+	RK_MUXROUTE_GRF(2, RK_PC5, 3, 0x0310, WRITE_MASK_VAL(6, 6, 0)), /* UART8 IO mux M0 */
+	RK_MUXROUTE_GRF(2, RK_PD7, 4, 0x0310, WRITE_MASK_VAL(6, 6, 1)), /* UART8 IO mux M1 */
+	RK_MUXROUTE_GRF(2, RK_PB0, 3, 0x0310, WRITE_MASK_VAL(9, 8, 0)), /* UART9 IO mux M0 */
+	RK_MUXROUTE_GRF(4, RK_PC5, 4, 0x0310, WRITE_MASK_VAL(9, 8, 1)), /* UART9 IO mux M1 */
+	RK_MUXROUTE_GRF(4, RK_PA4, 4, 0x0310, WRITE_MASK_VAL(9, 8, 2)), /* UART9 IO mux M2 */
+	RK_MUXROUTE_GRF(1, RK_PA2, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1 IO mux M0 */
+	RK_MUXROUTE_GRF(3, RK_PC6, 4, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1 IO mux M1 */
+	RK_MUXROUTE_GRF(2, RK_PD0, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1 IO mux M2 */
+	RK_MUXROUTE_GRF(2, RK_PC1, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2 IO mux M0 */
+	RK_MUXROUTE_GRF(4, RK_PB6, 5, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S2 IO mux M1 */
+	RK_MUXROUTE_GRF(3, RK_PA2, 4, 0x0310, WRITE_MASK_VAL(14, 14, 0)), /* I2S3 IO mux M0 */
+	RK_MUXROUTE_GRF(4, RK_PC2, 5, 0x0310, WRITE_MASK_VAL(14, 14, 1)), /* I2S3 IO mux M1 */
+	RK_MUXROUTE_GRF(1, RK_PA4, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO mux M0 */
+	RK_MUXROUTE_GRF(1, RK_PA6, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO mux M0 */
+	RK_MUXROUTE_GRF(3, RK_PD6, 5, 0x0314, WRITE_MASK_VAL(1, 0, 1)), /* PDM IO mux M1 */
+	RK_MUXROUTE_GRF(4, RK_PA0, 4, 0x0314, WRITE_MASK_VAL(1, 0, 1)), /* PDM IO mux M1 */
+	RK_MUXROUTE_GRF(3, RK_PC4, 5, 0x0314, WRITE_MASK_VAL(1, 0, 2)), /* PDM IO mux M2 */
+	RK_MUXROUTE_GRF(0, RK_PA5, 3, 0x0314, WRITE_MASK_VAL(3, 2, 0)), /* PCIE20 IO mux M0 */
+	RK_MUXROUTE_GRF(2, RK_PD0, 4, 0x0314, WRITE_MASK_VAL(3, 2, 1)), /* PCIE20 IO mux M1 */
+	RK_MUXROUTE_GRF(1, RK_PB0, 4, 0x0314, WRITE_MASK_VAL(3, 2, 2)), /* PCIE20 IO mux M2 */
+	RK_MUXROUTE_GRF(0, RK_PA4, 3, 0x0314, WRITE_MASK_VAL(5, 4, 0)), /* PCIE30X1 IO mux M0 */
+	RK_MUXROUTE_GRF(2, RK_PD2, 4, 0x0314, WRITE_MASK_VAL(5, 4, 1)), /* PCIE30X1 IO mux M1 */
+	RK_MUXROUTE_GRF(1, RK_PA5, 4, 0x0314, WRITE_MASK_VAL(5, 4, 2)), /* PCIE30X1 IO mux M2 */
+	RK_MUXROUTE_GRF(0, RK_PA6, 2, 0x0314, WRITE_MASK_VAL(7, 6, 0)), /* PCIE30X2 IO mux M0 */
+	RK_MUXROUTE_GRF(2, RK_PD4, 4, 0x0314, WRITE_MASK_VAL(7, 6, 1)), /* PCIE30X2 IO mux M1 */
+	RK_MUXROUTE_GRF(4, RK_PC2, 4, 0x0314, WRITE_MASK_VAL(7, 6, 2)), /* PCIE30X2 IO mux M2 */
 };
 
-static enum rockchip_pin_route_type
-rockchip_get_mux_route(struct rockchip_pin_bank *bank, int pin,
-		       int mux, u32 *reg, u32 *value)
+static bool rockchip_get_mux_route(struct rockchip_pin_bank *bank, int pin,
+				   int mux, u32 *loc, u32 *reg, u32 *value)
 {
 	struct rockchip_pinctrl *info = bank->drvdata;
 	struct rockchip_pin_ctrl *ctrl = info->ctrl;
@@ -1706,37 +1085,13 @@ rockchip_get_mux_route(struct rockchip_pin_bank *bank, int pin,
 	}
 
 	if (i >= ctrl->niomux_routes)
-		return ROUTE_TYPE_INVALID;
+		return false;
 
+	*loc = data->route_location;
 	*reg = data->route_offset;
 	*value = data->route_val;
 
-	return data->route_type;
-}
-
-static int rockchip_verify_mux(struct rockchip_pin_bank *bank,
-			       int pin, int mux)
-{
-	struct rockchip_pinctrl *info = bank->drvdata;
-	int iomux_num = (pin / 8);
-
-	if (iomux_num > 3)
-		return -EINVAL;
-
-	if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
-		dev_err(info->dev, "pin %d is unrouted\n", pin);
-		return -EINVAL;
-	}
-
-	if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) {
-		if (mux != RK_FUNC_GPIO) {
-			dev_err(info->dev,
-				"pin %d only supports a gpio mux\n", pin);
-			return -ENOTSUPP;
-		}
-	}
-
-	return 0;
+	return true;
 }
 
 static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
@@ -1757,7 +1112,7 @@ static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
 	}
 
 	if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
-		return 0;
+		return RK_FUNC_GPIO;
 
 	if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
 		regmap = info->regmap_pmu;
@@ -1783,12 +1138,40 @@ static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
 		bit = (pin % 8) * 2;
 		mask = 0x3;
 	}
+
 	if (bank->recalced_mask & BIT(pin))
 		rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
 
 	ret = regmap_read(regmap, reg, &val);
+	if (ret)
+		return ret;
+
+	return ((val >> bit) & mask);
+}
+
+static int rockchip_verify_mux(struct rockchip_pin_bank *bank,
+			       int pin, int mux)
+{
+	struct rockchip_pinctrl *info = bank->drvdata;
+	int iomux_num = (pin / 8);
+
+	if (iomux_num > 3)
+		return -EINVAL;
+
+	if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
+		dev_err(info->dev, "pin %d is unrouted\n", pin);
+		return -EINVAL;
+	}
+
+	if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) {
+		if (mux != RK_FUNC_GPIO) {
+			dev_err(info->dev,
+				"pin %d only supports a gpio mux\n", pin);
+			return -ENOTSUPP;
+		}
+	}
 
-	return ret ? ret : ((val >> bit) & mask);
+	return 0;
 }
 
 /*
@@ -1811,7 +1194,7 @@ static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
 	struct regmap *regmap;
 	int reg, ret, mask, mux_type;
 	u8 bit;
-	u32 data, rmask;
+	u32 data, rmask, route_location, route_reg, route_val;
 
 	ret = rockchip_verify_mux(bank, pin, mux);
 	if (ret < 0)
@@ -1855,23 +1238,23 @@ static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
 		return -EINVAL;
 
 	if (bank->route_mask & BIT(pin)) {
-		u32 route_reg = 0, route_val = 0;
+		if (rockchip_get_mux_route(bank, pin, mux, &route_location,
+					   &route_reg, &route_val)) {
+			struct regmap *route_regmap = regmap;
+
+			/* handle special locations */
+			switch (route_location) {
+			case ROCKCHIP_ROUTE_PMU:
+				route_regmap = info->regmap_pmu;
+				break;
+			case ROCKCHIP_ROUTE_GRF:
+				route_regmap = info->regmap_base;
+				break;
+			}
 
-		ret = rockchip_get_mux_route(bank, pin, mux,
-					     &route_reg, &route_val);
-		switch (ret) {
-		case ROUTE_TYPE_DEFAULT:
-			regmap_write(regmap, route_reg, route_val);
-			break;
-		case ROUTE_TYPE_TOPGRF:
-			regmap_write(info->regmap_base, route_reg, route_val);
-			break;
-		case ROUTE_TYPE_PMUGRF:
-			regmap_write(info->regmap_pmu, route_reg, route_val);
-			break;
-		case ROUTE_TYPE_INVALID: /* Fall through */
-		default:
-			break;
+			ret = regmap_write(route_regmap, route_reg, route_val);
+			if (ret)
+				return ret;
 		}
 	}
 
@@ -2461,8 +1844,8 @@ static void rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
 #define RK3308_PULL_OFFSET		0xa0
 
 static void rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
-					 int pin_num, struct regmap **regmap,
-					 int *reg, u8 *bit)
+				    int pin_num, struct regmap **regmap,
+				    int *reg, u8 *bit)
 {
 	struct rockchip_pinctrl *info = bank->drvdata;
 
@@ -2478,8 +1861,8 @@ static void rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
 #define RK3308_DRV_GRF_OFFSET		0x100
 
 static void rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
-				       int pin_num, struct regmap **regmap,
-				       int *reg, u8 *bit)
+				    int pin_num, struct regmap **regmap,
+				    int *reg, u8 *bit)
 {
 	struct rockchip_pinctrl *info = bank->drvdata;
 
@@ -2961,6 +2344,7 @@ static int rockchip_get_pull(struct rockchip_pin_bank *bank, int pin_num)
 				: PIN_CONFIG_BIAS_DISABLE;
 	case PX30:
 	case RV1108:
+	case RV1126:
 	case RK1808:
 	case RK3188:
 	case RK3288:
@@ -3025,7 +2409,10 @@ static int rockchip_set_pull(struct rockchip_pin_bank *bank,
 				break;
 			}
 		}
-
+		/*
+		 * In the TRM, pull-up being 1 for everything except the GPIO0_D0-D6,
+		 * where that pull up value becomes 3.
+		 */
 		if (ctrl->type == RK3568 && bank->bank_num == 0 && pin_num >= 27 && pin_num <= 30) {
 			if (ret == 1)
 				ret = 3;
@@ -3401,6 +2788,17 @@ static int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
 			if (rc)
 				return rc;
 			break;
+		case PIN_CONFIG_OUTPUT:
+			rc = rockchip_get_mux(bank, pin - bank->pin_base);
+			if (rc != 0) {
+				dev_err(info->dev, "pin-%d has been mux to func%d\n", pin, rc);
+				return -EINVAL;
+			}
+
+			rc = gpio->direction_output(gpio, pin - bank->pin_base, arg);
+			if (rc)
+				return rc;
+			break;
 		case PIN_CONFIG_DRIVE_STRENGTH:
 			/* rk3288 is the first with per-pin drive-strength */
 			if (!info->ctrl->drv_calc_reg)
@@ -3429,17 +2827,6 @@ static int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
 			if (rc < 0)
 				return rc;
 			break;
-		case PIN_CONFIG_OUTPUT:
-			rc = rockchip_get_mux(bank, pin - bank->pin_base);
-			if (rc != 0) {
-				dev_err(info->dev, "pin-%d has been mux to func%d\n", pin, rc);
-				return -EINVAL;
-			}
-
-			rc = gpio->direction_output(gpio, pin - bank->pin_base, arg);
-			if (rc)
-				return rc;
-			break;
 		default:
 			return -ENOTSUPP;
 		}
@@ -3478,6 +2865,19 @@ static int rockchip_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
 
 		arg = 1;
 		break;
+	case PIN_CONFIG_OUTPUT:
+		rc = rockchip_get_mux(bank, pin - bank->pin_base);
+		if (rc != 0) {
+			dev_err(info->dev, "pin-%d has been mux to func%d\n", pin, rc);
+			return -EINVAL;
+		}
+
+		rc = gpio->get(gpio, pin - bank->pin_base);
+		if (rc < 0)
+			return rc;
+
+		arg = rc ? 1 : 0;
+		break;
 	case PIN_CONFIG_DRIVE_STRENGTH:
 		/* rk3288 is the first with per-pin drive-strength */
 		if (!info->ctrl->drv_calc_reg)
@@ -3509,19 +2909,6 @@ static int rockchip_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
 
 		arg = rc;
 		break;
-	case PIN_CONFIG_OUTPUT:
-		rc = rockchip_get_mux(bank, pin - bank->pin_base);
-		if (rc != 0) {
-			dev_err(info->dev, "pin-%d has been mux to func%d\n", pin, rc);
-			return -EINVAL;
-		}
-
-		rc = gpio->get(gpio, pin - bank->pin_base);
-		if (rc < 0)
-			return rc;
-
-		arg = rc ? 1 : 0;
-		break;
 	default:
 		return -ENOTSUPP;
 	}
@@ -3569,7 +2956,7 @@ static int rockchip_pinctrl_parse_groups(struct device_node *np,
 	int i, j;
 	int ret;
 
-	dev_dbg(info->dev, "group(%d): %s\n", index, np->name);
+	dev_dbg(info->dev, "group(%d): %pOFn\n", index, np);
 
 	/* Initialise group */
 	grp->name = np->name;
@@ -3634,7 +3021,7 @@ static int rockchip_pinctrl_parse_functions(struct device_node *np,
 	static u32 grp_index;
 	u32 i = 0;
 
-	dev_dbg(info->dev, "parse function(%d): %s\n", index, np->name);
+	dev_dbg(info->dev, "parse function(%d): %pOFn\n", index, np);
 
 	func = &info->functions[index];
 
@@ -3681,14 +3068,14 @@ static int rockchip_pinctrl_parse_dt(struct platform_device *pdev,
 					      sizeof(struct rockchip_pmx_func),
 					      GFP_KERNEL);
 	if (!info->functions)
-		return -EINVAL;
+		return -ENOMEM;
 
 	info->groups = devm_kcalloc(dev,
 					    info->ngroups,
 					    sizeof(struct rockchip_pin_group),
 					    GFP_KERNEL);
 	if (!info->groups)
-		return -EINVAL;
+		return -ENOMEM;
 
 	i = 0;
 
@@ -3849,7 +3236,7 @@ static struct rockchip_pin_ctrl *rockchip_pinctrl_get_soc_data(
 			 */
 			inc = (iom->type & (IOMUX_WIDTH_4BIT |
 					    IOMUX_WIDTH_3BIT |
-					    IOMUX_8WIDTH_2BIT)) ? 8 : 4;
+					    IOMUX_WIDTH_2BIT)) ? 8 : 4;
 			if ((iom->type & IOMUX_SOURCE_PMU) || (iom->type & IOMUX_L_SOURCE_PMU))
 				pmu_offs += inc;
 			else
@@ -4320,6 +3707,8 @@ static struct rockchip_pin_ctrl rk3188_pin_ctrl __maybe_unused = {
 		.label			= "RK3188-GPIO",
 		.type			= RK3188,
 		.grf_mux_offset		= 0x60,
+		.iomux_routes		= rk3188_mux_route_data,
+		.niomux_routes		= ARRAY_SIZE(rk3188_mux_route_data),
 		.pull_calc_reg		= rk3188_calc_pull_reg_and_bit,
 };
 
@@ -4388,26 +3777,26 @@ static struct rockchip_pin_ctrl rk3288_pin_ctrl __maybe_unused = {
 };
 
 static struct rockchip_pin_bank rk3308_pin_banks[] = {
-	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_8WIDTH_2BIT,
-					     IOMUX_8WIDTH_2BIT,
-					     IOMUX_8WIDTH_2BIT,
-					     IOMUX_8WIDTH_2BIT),
-	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_8WIDTH_2BIT,
-					     IOMUX_8WIDTH_2BIT,
-					     IOMUX_8WIDTH_2BIT,
-					     IOMUX_8WIDTH_2BIT),
-	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_8WIDTH_2BIT,
-					     IOMUX_8WIDTH_2BIT,
-					     IOMUX_8WIDTH_2BIT,
-					     IOMUX_8WIDTH_2BIT),
-	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_8WIDTH_2BIT,
-					     IOMUX_8WIDTH_2BIT,
-					     IOMUX_8WIDTH_2BIT,
-					     IOMUX_8WIDTH_2BIT),
-	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_8WIDTH_2BIT,
-					     IOMUX_8WIDTH_2BIT,
-					     IOMUX_8WIDTH_2BIT,
-					     IOMUX_8WIDTH_2BIT),
+	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_WIDTH_2BIT,
+					     IOMUX_WIDTH_2BIT,
+					     IOMUX_WIDTH_2BIT,
+					     IOMUX_WIDTH_2BIT),
+	PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_2BIT,
+					     IOMUX_WIDTH_2BIT,
+					     IOMUX_WIDTH_2BIT,
+					     IOMUX_WIDTH_2BIT),
+	PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_2BIT,
+					     IOMUX_WIDTH_2BIT,
+					     IOMUX_WIDTH_2BIT,
+					     IOMUX_WIDTH_2BIT),
+	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_2BIT,
+					     IOMUX_WIDTH_2BIT,
+					     IOMUX_WIDTH_2BIT,
+					     IOMUX_WIDTH_2BIT),
+	PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_2BIT,
+					     IOMUX_WIDTH_2BIT,
+					     IOMUX_WIDTH_2BIT,
+					     IOMUX_WIDTH_2BIT),
 };
 
 static struct rockchip_pin_ctrl rk3308_pin_ctrl __maybe_unused = {
@@ -4655,7 +4044,6 @@ static const struct of_device_id rockchip_pinctrl_dt_match[] = {
 #endif
 	{},
 };
-MODULE_DEVICE_TABLE(of, rockchip_pinctrl_dt_match);
 
 static struct platform_driver rockchip_pinctrl_driver = {
 	.probe		= rockchip_pinctrl_probe,
@@ -4672,6 +4060,13 @@ static int __init rockchip_pinctrl_drv_register(void)
 }
 postcore_initcall(rockchip_pinctrl_drv_register);
 
+static void __exit rockchip_pinctrl_drv_unregister(void)
+{
+	platform_driver_unregister(&rockchip_pinctrl_driver);
+}
+module_exit(rockchip_pinctrl_drv_unregister);
+
 MODULE_DESCRIPTION("ROCKCHIP Pin Controller Driver");
 MODULE_LICENSE("GPL");
 MODULE_ALIAS("platform:pinctrl-rockchip");
+MODULE_DEVICE_TABLE(of, rockchip_pinctrl_dt_match);
diff --git a/drivers/pinctrl/pinctrl-rockchip.h b/drivers/pinctrl/pinctrl-rockchip.h
index b085aa290fcf..c55a5698319a 100644
--- a/drivers/pinctrl/pinctrl-rockchip.h
+++ b/drivers/pinctrl/pinctrl-rockchip.h
@@ -72,19 +72,10 @@ enum rockchip_pin_pull_type {
 	PULL_TYPE_MAX
 };
 
-/**
- * enum mux route register type, should be invalid/default/topgrf/pmugrf.
- * INVALID: means do not need to set mux route
- * DEFAULT: means same regmap as pin iomux
- * TOPGRF: means mux route setting in topgrf
- * PMUGRF: means mux route setting in pmugrf
- */
-enum rockchip_pin_route_type {
-	ROUTE_TYPE_DEFAULT = 0,
-	ROUTE_TYPE_TOPGRF = 1,
-	ROUTE_TYPE_PMUGRF = 2,
-
-	ROUTE_TYPE_INVALID = -1,
+enum rockchip_mux_route_location {
+	ROCKCHIP_ROUTE_SAME = 0,
+	ROCKCHIP_ROUTE_PMU,
+	ROCKCHIP_ROUTE_GRF,
 };
 
 /**
@@ -173,7 +164,7 @@ struct rockchip_mux_recalced_data {
  * @bank_num: bank number.
  * @pin: index at register or used to calc index.
  * @func: the min pin.
- * @route_type: the register type.
+ * @route_location: the mux route location (same, pmu, grf).
  * @route_offset: the max pin.
  * @route_val: the register offset.
  */
@@ -181,7 +172,7 @@ struct rockchip_mux_route_data {
 	u8 bank_num;
 	u8 pin;
 	u8 func;
-	enum rockchip_pin_route_type route_type : 8;
+	enum rockchip_mux_route_location route_location;
 	u32 route_offset;
 	u32 route_val;
 };

commit 8d3dc35ee7c4babd3d49200b5b4072e7489bc36a
Author: Wang Panzhenzhuan <randy.wang@rock-chips.com>
Date:   Thu Aug 5 15:36:26 2021 +0800

    media: i2c: gc2093: update sensor driver
    
    1. fix linear mode ae flicker issue.
    2. add hdr mode exposure limit issue.
    3. fix hdr mode highlighting pink issue.
    4. add some debug info.
    
    Signed-off-by: Wang Panzhenzhuan <randy.wang@rock-chips.com>
    Change-Id: I270501bfc382f6d811d4267469cc9406cf6e99c7

diff --git a/drivers/media/i2c/gc2093.c b/drivers/media/i2c/gc2093.c
index 4e77d4c74505..8ee869ff73d9 100644
--- a/drivers/media/i2c/gc2093.c
+++ b/drivers/media/i2c/gc2093.c
@@ -6,6 +6,11 @@
  *
  * V0.0X01.0X00 first version.
  * V0.0X01.0X01 Add HDR support.
+ * V0.0X01.0X02 update sensor driver
+ * 1. fix linear mode ae flicker issue.
+ * 2. add hdr mode exposure limit issue.
+ * 3. fix hdr mode highlighting pink issue.
+ * 4. add some debug info.
  */
 
 #include <linux/clk.h>
@@ -28,12 +33,12 @@
 #include <media/v4l2-fwnode.h>
 #include <media/v4l2-subdev.h>
 
-#define DRIVER_VERSION		KERNEL_VERSION(0, 0x01, 0x01)
+#define DRIVER_VERSION		KERNEL_VERSION(0, 0x01, 0x02)
 #define GC2093_NAME		"gc2093"
 #define GC2093_MEDIA_BUS_FMT	MEDIA_BUS_FMT_SRGGB10_1X10
 
-#define MIPI_FREQ_297M		297000000
-#define MIPI_FREQ_396M		396000000
+#define MIPI_FREQ_150M		150000000
+#define MIPI_FREQ_300M		300000000
 
 #define GC2093_XVCLK_FREQ	27000000
 
@@ -45,6 +50,10 @@
 #define GC2093_REG_EXP_LONG_H	0x0003
 #define GC2093_REG_EXP_LONG_L	0x0004
 
+#define GC2093_REG_VB_H		0x0007
+#define GC2093_REG_VB_L		0x0008
+
+
 #define GC2093_MIRROR_FLIP_REG	0x0017
 #define MIRROR_MASK		BIT(0)
 #define FLIP_MASK		BIT(1)
@@ -66,6 +75,7 @@
 #define GC2093_GAIN_MAX		0x2000
 #define GC2093_GAIN_STEP	1
 #define GC2093_GAIN_DEFAULT	64
+#define REG_NULL		0xFFFF
 
 #define GC2093_LANES		2
 
@@ -88,8 +98,8 @@ enum {
 };
 
 enum {
-	LINK_FREQ_297M_INDEX,
-	LINK_FREQ_396M_INDEX,
+	LINK_FREQ_150M_INDEX,
+	LINK_FREQ_300M_INDEX,
 };
 
 struct gain_reg_config {
@@ -144,6 +154,7 @@ struct gc2093 {
 	const char      *module_facing;
 	const char      *module_name;
 	const char      *len_name;
+	u32		cur_vts;
 
 	bool			  has_init_exp;
 	struct preisp_hdrae_exp_s init_hdrae_exp;
@@ -156,8 +167,8 @@ static const struct regmap_config gc2093_regmap_config = {
 };
 
 static const s64 link_freq_menu_items[] = {
-	MIPI_FREQ_297M,
-	MIPI_FREQ_396M,
+	MIPI_FREQ_150M,
+	MIPI_FREQ_300M,
 };
 
 /*
@@ -216,20 +227,20 @@ static const struct reg_sequence gc2093_1080p_liner_settings[] = {
 	{0x00c7, 0xe1},
 	{0x001b, 0x73},
 	{0x0028, 0x0d},
-	{0x0029, 0x40},
+	{0x0029, 0x24},
 	{0x002b, 0x04},
 	{0x002e, 0x23},
 	{0x0037, 0x03},
-	{0x0038, 0x88},
-	{0x0044, 0x20},
-	{0x004b, 0x14},
-	{0x0055, 0x20},
-	{0x0068, 0x20},
-	{0x0069, 0x20},
+	{0x0043, 0x04},
+	{0x0044, 0x38},
+	{0x004a, 0x01},
+	{0x004b, 0x28},
+	{0x0055, 0x38},
+	{0x006b, 0x44},
 	{0x0077, 0x00},
 	{0x0078, 0x20},
 	{0x007c, 0xa1},
-	{0x00d3, 0xdc},
+	{0x00d3, 0xd4},
 	{0x00e6, 0x50},
 	/* Gain */
 	{0x00b6, 0xc0},
@@ -237,18 +248,29 @@ static const struct reg_sequence gc2093_1080p_liner_settings[] = {
 	/* Isp */
 	{0x0102, 0x89},
 	{0x0104, 0x01},
+	{0x010f, 0x00},
 	{0x0158, 0x00},
+	{0x0123, 0x08},
+	{0x0123, 0x00},
+	{0x0120, 0x01},
+	{0x0121, 0x00},
+	{0x0122, 0x10},
+	{0x0124, 0x03},
+	{0x0125, 0xff},
+	{0x0126, 0x3c},
+	{0x001a, 0x8c},
+	{0x00c6, 0xe0},
 	/* Blk */
-	{0x0026, 0x20},
+	{0x0026, 0x30},
 	{0x0142, 0x00},
 	{0x0149, 0x1e},
 	{0x014a, 0x07},
 	{0x014b, 0x80},
-	{0x0155, 0x07},
-	{0x0414, 0x7e},
-	{0x0415, 0x7e},
-	{0x0416, 0x7e},
-	{0x0417, 0x7e},
+	{0x0155, 0x00},
+	{0x0414, 0x78},
+	{0x0415, 0x78},
+	{0x0416, 0x78},
+	{0x0417, 0x78},
 	/* Window */
 	{0x0192, 0x02},
 	{0x0194, 0x03},
@@ -409,7 +431,7 @@ static const struct gc2093_mode supported_modes[] = {
 		.exp_def = 0x460,
 		.hts_def = 0x898,
 		.vts_def = 0x465,
-		.link_freq_index = LINK_FREQ_297M_INDEX,
+		.link_freq_index = LINK_FREQ_150M_INDEX,
 		.reg_list = gc2093_1080p_liner_settings,
 		.reg_num = ARRAY_SIZE(gc2093_1080p_liner_settings),
 		.hdr_mode = NO_HDR,
@@ -425,7 +447,7 @@ static const struct gc2093_mode supported_modes[] = {
 		.exp_def = 0x460,
 		.hts_def = 0xa50,
 		.vts_def = 0x4e2,
-		.link_freq_index = LINK_FREQ_396M_INDEX,
+		.link_freq_index = LINK_FREQ_300M_INDEX,
 		.reg_list = gc2093_1080p_hdr_settings,
 		.reg_num = ARRAY_SIZE(gc2093_1080p_hdr_settings),
 		.hdr_mode = HDR_X2,
@@ -437,9 +459,10 @@ static const struct gc2093_mode supported_modes[] = {
 };
 
 /* pixel rate = link frequency * 2 * lanes / BITS_PER_SAMPLE */
+/* * 2, to match suitable isp freq */
 static u64 to_pixel_rate(u32 index)
 {
-	u64 pixel_rate = link_freq_menu_items[index] * 2 * GC2093_LANES;
+	u64 pixel_rate = link_freq_menu_items[index] * 2 * GC2093_LANES * 2;
 
 	do_div(pixel_rate, 10);
 
@@ -552,16 +575,19 @@ static int gc2093_set_ctrl(struct v4l2_ctrl *ctrl)
 
 	switch (ctrl->id) {
 	case V4L2_CID_EXPOSURE:
+		dev_dbg(gc2093->dev, "set exposure value 0x%x\n", ctrl->val);
 		ret = gc2093_write_reg(gc2093, GC2093_REG_EXP_LONG_H,
 				       (ctrl->val >> 8) & 0x3f);
 		ret |= gc2093_write_reg(gc2093, GC2093_REG_EXP_LONG_L,
 					ctrl->val & 0xff);
 		break;
 	case V4L2_CID_ANALOGUE_GAIN:
+		dev_dbg(gc2093->dev, "set gain value 0x%x\n", ctrl->val);
 		gc2093_set_gain(gc2093, ctrl->val);
 		break;
 	case V4L2_CID_VBLANK:
 		/* The exposure goes up and reduces the frame rate, no need to write vb */
+		dev_dbg(gc2093->dev, " set blank value 0x%x\n", ctrl->val);
 		break;
 	case V4L2_CID_HFLIP:
 			regmap_update_bits(gc2093->regmap, GC2093_MIRROR_FLIP_REG,
@@ -617,8 +643,8 @@ static int gc2093_initialize_controls(struct gc2093 *gc2093)
 						   link_freq_menu_items);
 
 	gc2093->pixel_rate = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE,
-					       0, to_pixel_rate(LINK_FREQ_396M_INDEX),
-					       1, to_pixel_rate(LINK_FREQ_297M_INDEX));
+					       0, to_pixel_rate(LINK_FREQ_300M_INDEX),
+					       1, to_pixel_rate(LINK_FREQ_150M_INDEX));
 
 	h_blank = mode->hts_def - mode->width;
 	gc2093->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
@@ -759,6 +785,8 @@ static long gc2093_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 	long ret = 0;
 	u32 i, h, w;
 	u32 stream = 0;
+	u8 vb_h = 0, vb_l = 0;
+	u16 vb = 0, cur_vts = 0, short_exp = 0, middle_exp = 0;
 
 	switch (cmd) {
 	case PREISP_CMD_SET_HDRAE_EXP:
@@ -769,15 +797,65 @@ static long gc2093_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 			break;
 		}
 
+		dev_dbg(gc2093->dev, "%s short_gain_reg: 0x%x\n",
+			__func__, hdrae_exp->short_gain_reg);
 		ret = gc2093_set_gain(gc2093, hdrae_exp->short_gain_reg);
+		if (ret) {
+			dev_err(gc2093->dev, "Failed to set gain!)\n");
+			return ret;
+		}
+
+		dev_dbg(gc2093->dev, "%s exp_reg middle: 0x%x, short: 0x%x\n",
+			__func__, hdrae_exp->middle_exp_reg,
+			hdrae_exp->short_exp_reg);
+		// Optimize blooming effect
+		if (hdrae_exp->middle_exp_reg < 0x30 || hdrae_exp->short_exp_reg < 4)
+			gc2093_write_reg(gc2093, 0x0032, 0xfd);
+		else
+			gc2093_write_reg(gc2093, 0x0032, 0xf8);
+
+		/* hdr exp limit
+		 * 1. max short_exp_reg  < VB
+		 * 2. short_exp_reg + middle_exp_reg < framelength
+		 */
+		/* 30FPS sample */
+//		if (hdrae_exp->middle_exp_reg > 1100)
+//			hdrae_exp->middle_exp_reg = 1100;
+//
+//		if (hdrae_exp->short_exp_reg > 68)
+//			hdrae_exp->short_exp_reg = 68;
+
+		ret = gc2093_read_reg(gc2093, GC2093_REG_VB_H, &vb_h);
+		ret |= gc2093_read_reg(gc2093, GC2093_REG_VB_L, &vb_l);
+		if (ret) {
+			dev_err(gc2093->dev, "Failed to read vb data)\n");
+			return ret;
+		}
+		vb = vb_h << 8 | vb_l;
+
+		/* max short exposure limit to 3 ms */
+		if (hdrae_exp->short_exp_reg <= (vb - 8))
+			short_exp = hdrae_exp->short_exp_reg;
+		else
+			short_exp = vb - 8;
+		cur_vts = gc2093->cur_vts;
+		dev_info(gc2093->dev, "%s cur_vts: 0x%x\n", __func__, cur_vts);
+
+		if (short_exp + hdrae_exp->middle_exp_reg > cur_vts)
+			middle_exp = cur_vts - short_exp;
+		else
+			middle_exp = hdrae_exp->middle_exp_reg;
+
+		dev_dbg(gc2093->dev, "%s cal exp_reg middle: 0x%x, short: 0x%x\n",
+			__func__, middle_exp, short_exp);
 		ret |= gc2093_write_reg(gc2093, GC2093_REG_EXP_LONG_H,
-					(hdrae_exp->middle_exp_reg >> 8) & 0x3f);
+					(middle_exp >> 8) & 0x3f);
 		ret |= gc2093_write_reg(gc2093, GC2093_REG_EXP_LONG_L,
-					hdrae_exp->middle_exp_reg & 0xff);
+					middle_exp & 0xff);
 		ret |= gc2093_write_reg(gc2093, GC2093_REG_EXP_SHORT_H,
-					(hdrae_exp->short_exp_reg >> 8) & 0x3f);
+					(short_exp >> 8) & 0x3f);
 		ret |= gc2093_write_reg(gc2093, GC2093_REG_EXP_SHORT_L,
-					hdrae_exp->short_exp_reg & 0xff);
+					short_exp & 0xff);
 		break;
 	case RKMODULE_GET_HDR_CFG:
 		hdr_cfg = (struct rkmodule_hdr_cfg *)arg;
@@ -807,6 +885,7 @@ static long gc2093_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 			__v4l2_ctrl_modify_range(gc2093->vblank, h,
 						 GC2093_VTS_MAX - gc2093->cur_mode->height,
 						 1, h);
+			gc2093->cur_vts = gc2093->cur_mode->vts_def;
 			dev_info(gc2093->dev, "sensor mode: %d\n",
 				 gc2093->cur_mode->hdr_mode);
 		}
@@ -887,8 +966,11 @@ static long gc2093_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = gc2093_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_GET_HDR_CFG:
@@ -899,8 +981,11 @@ static long gc2093_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = gc2093_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:
@@ -913,6 +998,8 @@ static long gc2093_compat_ioctl32(struct v4l2_subdev *sd,
 		ret = copy_from_user(hdr, up, sizeof(*hdr));
 		if (!ret)
 			ret = gc2093_ioctl(sd, cmd, hdr);
+		else
+			ret = -EFAULT;
 		kfree(hdr);
 		break;
 	case PREISP_CMD_SET_HDRAE_EXP:
@@ -925,12 +1012,16 @@ static long gc2093_compat_ioctl32(struct v4l2_subdev *sd,
 		ret = copy_from_user(hdrae, up, sizeof(*hdrae));
 		if (!ret)
 			ret = gc2093_ioctl(sd, cmd, hdrae);
+		else
+			ret = -EFAULT;
 		kfree(hdrae);
 		break;
 	case RKMODULE_SET_QUICK_STREAM:
 		ret = copy_from_user(&stream, up, sizeof(u32));
 		if (!ret)
 			ret = gc2093_ioctl(sd, cmd, &stream);
+		else
+			ret = -EFAULT;
 		break;
 	default:
 		ret = -ENOIOCTLCMD;
@@ -944,6 +1035,16 @@ static int gc2093_s_stream(struct v4l2_subdev *sd, int on)
 {
 	struct gc2093 *gc2093 = to_gc2093(sd);
 	int ret = 0;
+	unsigned int fps;
+	unsigned int delay_us;
+
+	fps = DIV_ROUND_CLOSEST(gc2093->cur_mode->max_fps.denominator,
+					gc2093->cur_mode->max_fps.numerator);
+
+	dev_info(gc2093->dev, "%s: on: %d, %dx%d@%d\n", __func__, on,
+				gc2093->cur_mode->width,
+				gc2093->cur_mode->height,
+				fps);
 
 	mutex_lock(&gc2093->lock);
 	on = !!on;
@@ -965,6 +1066,12 @@ static int gc2093_s_stream(struct v4l2_subdev *sd, int on)
 		}
 	} else {
 		__gc2093_stop_stream(gc2093);
+		/* delay to enable oneframe complete */
+		delay_us = 1000 * 1000 / fps;
+		usleep_range(delay_us, delay_us+10);
+		dev_info(gc2093->dev, "%s: on: %d, sleep(%dus)\n",
+				__func__, on, delay_us);
+
 		pm_runtime_put(gc2093->dev);
 	}
 
@@ -1295,6 +1402,7 @@ static int gc2093_probe(struct i2c_client *client,
 	/* set default mode */
 	gc2093->cur_mode = &supported_modes[0];
 	gc2093->cfg_num = ARRAY_SIZE(supported_modes);
+	gc2093->cur_vts = gc2093->cur_mode->vts_def;
 
 	sd = &gc2093->subdev;
 	v4l2_i2c_subdev_init(sd, client, &gc2093_subdev_ops);

commit a60e77777e34c8eb2efa6de8b91230becea1d9ac
Author: Finley Xiao <finley.xiao@rock-chips.com>
Date:   Mon Aug 23 15:43:19 2021 +0800

    PM / devfreq: Remove DEVFREQ_GOV_SIMPLE_ONDEMAND dependency for dmc
    
    Change-Id: Ie08689996ee4f3554c2d0e6bef61d23029bc5d07
    Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>

diff --git a/drivers/devfreq/Kconfig b/drivers/devfreq/Kconfig
index d8f3b4bf5193..2f400d8d724f 100644
--- a/drivers/devfreq/Kconfig
+++ b/drivers/devfreq/Kconfig
@@ -113,7 +113,6 @@ config ARM_ROCKCHIP_DMC_DEVFREQ
 	depends on (ARCH_ROCKCHIP && HAVE_ARM_SMCCC) || \
 		(COMPILE_TEST && HAVE_ARM_SMCCC)
 	select DEVFREQ_EVENT_ROCKCHIP_DFI
-	select DEVFREQ_GOV_SIMPLE_ONDEMAND
 	select PM_DEVFREQ_EVENT
 	select PM_OPP
 	help

commit 232af002ef92c2523c553ff507557932877f287a
Author: Finley Xiao <finley.xiao@rock-chips.com>
Date:   Mon Aug 23 15:12:49 2021 +0800

    PM / devfreq: rockchip_dmc: Add rockchip_simple_ondemand_data
    
    Add a new struct rockchip_simple_ondemand_data so that rockchip_dmc.c
    does not need to depend on CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND.
    
    Change-Id: Iafe7ec8bbc9a36aaf3dffbe669a8ee927f45d3a1
    Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>

diff --git a/drivers/devfreq/rockchip_dmc.c b/drivers/devfreq/rockchip_dmc.c
index 721237664f37..4d73996aa38e 100644
--- a/drivers/devfreq/rockchip_dmc.c
+++ b/drivers/devfreq/rockchip_dmc.c
@@ -121,10 +121,15 @@ struct share_params {
 
 static struct share_params *ddr_psci_param;
 
+struct rockchip_dmcfreq_ondemand_data {
+	unsigned int upthreshold;
+	unsigned int downdifferential;
+};
+
 struct rockchip_dmcfreq {
 	struct device *dev;
 	struct devfreq *devfreq;
-	struct devfreq_simple_ondemand_data ondemand_data;
+	struct rockchip_dmcfreq_ondemand_data ondemand_data;
 	struct clk *dmc_clk;
 	struct devfreq_event_dev **edev;
 	struct mutex lock; /* serializes access to video_info_list */
@@ -2552,7 +2557,7 @@ static int devfreq_dmc_ondemand_func(struct devfreq *df,
 	struct devfreq_dev_status *stat;
 	unsigned long long a, b;
 	struct rockchip_dmcfreq *dmcfreq = dev_get_drvdata(df->dev.parent);
-	struct devfreq_simple_ondemand_data *data = &dmcfreq->ondemand_data;
+	struct rockchip_dmcfreq_ondemand_data *data = &dmcfreq->ondemand_data;
 	unsigned int upthreshold = data->upthreshold;
 	unsigned int downdifferential = data->downdifferential;
 	unsigned long target_freq = 0;

commit e649ca006e7013bccffc64cc11524692038174dd
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Mon Aug 23 14:22:03 2021 +0800

    rknpu: add fake platform device to rknpu device
    
    The device 'fake_dev' under rknpu_dev is registered by rknpu_drv, which
    is a virtual platform device.
    
    The rknpu partial sync should use a platform device without iommu, so to
    use rknpu_dev->fake_dev.
    
    Change-Id: I33f1b05d308063f235d31044f8e562755c1217f4
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>
    Signed-off-by: Felix Zeng <felix.zeng@rock-chips.com>

diff --git a/drivers/rknpu/include/rknpu_drv.h b/drivers/rknpu/include/rknpu_drv.h
index 84623a271a56..9683aa65f868 100644
--- a/drivers/rknpu/include/rknpu_drv.h
+++ b/drivers/rknpu/include/rknpu_drv.h
@@ -40,6 +40,7 @@
 struct rknpu_config {
 	__u32 bw_priority_base;
 	__u32 bw_priority_length;
+	__u64 dma_mask;
 };
 
 /**
@@ -52,6 +53,7 @@ struct rknpu_config {
 struct rknpu_device {
 	void __iomem *base;
 	struct device *dev;
+	struct device *fake_dev;
 	struct drm_device *drm_dev;
 	atomic_t sequence;
 	spinlock_t lock;
diff --git a/drivers/rknpu/rknpu_drv.c b/drivers/rknpu/rknpu_drv.c
index c1e1134422f2..c6d3fb9b3e8f 100644
--- a/drivers/rknpu/rknpu_drv.c
+++ b/drivers/rknpu/rknpu_drv.c
@@ -49,6 +49,7 @@ MODULE_PARM_DESC(bypass_irq_handler,
 static const struct rknpu_config rk356x_rknpu_config = {
 	.bw_priority_base = 0xfe180008,
 	.bw_priority_length = 0x10,
+	.dma_mask = DMA_BIT_MASK(32),
 };
 
 /* driver probe and init */
@@ -247,6 +248,42 @@ static bool rknpu_is_iommu_enable(struct device *dev)
 	return true;
 }
 
+static int drm_fake_dev_register(struct rknpu_device *rknpu_dev)
+{
+	const struct platform_device_info rknpu_dev_info = {
+		.name = "rknpu_dev",
+		.id = PLATFORM_DEVID_AUTO,
+		.dma_mask = rknpu_dev->config->dma_mask,
+	};
+	struct platform_device *pdev = NULL;
+	int ret = -EINVAL;
+
+	pdev = platform_device_register_full(&rknpu_dev_info);
+	if (pdev) {
+		ret = of_dma_configure(&pdev->dev, NULL, true);
+		if (ret) {
+			platform_device_unregister(pdev);
+			pdev = NULL;
+		}
+	}
+
+	rknpu_dev->fake_dev = pdev ? &pdev->dev : NULL;
+
+	return ret;
+}
+
+static void drm_fake_dev_unregister(struct rknpu_device *rknpu_dev)
+{
+	struct platform_device *pdev = NULL;
+
+	if (!rknpu_dev->fake_dev)
+		return;
+
+	pdev = to_platform_device(rknpu_dev->fake_dev);
+
+	platform_device_unregister(pdev);
+}
+
 static int rknpu_drm_probe(struct rknpu_device *rknpu_dev)
 {
 	struct device *dev = rknpu_dev->dev;
@@ -265,6 +302,8 @@ static int rknpu_drm_probe(struct rknpu_device *rknpu_dev)
 	drm_dev->dev_private = rknpu_dev;
 	rknpu_dev->drm_dev = drm_dev;
 
+	drm_fake_dev_register(rknpu_dev);
+
 	return 0;
 
 err_free_drm:
@@ -281,7 +320,10 @@ static void rknpu_drm_remove(struct rknpu_device *rknpu_dev)
 {
 	struct drm_device *drm_dev = rknpu_dev->drm_dev;
 
+	drm_fake_dev_unregister(rknpu_dev);
+
 	drm_dev_unregister(drm_dev);
+
 #if KERNEL_VERSION(4, 15, 0) <= LINUX_VERSION_CODE
 	drm_dev_put(drm_dev);
 #else
diff --git a/drivers/rknpu/rknpu_gem.c b/drivers/rknpu/rknpu_gem.c
index 5f4d6ff99472..45045723eb22 100644
--- a/drivers/rknpu/rknpu_gem.c
+++ b/drivers/rknpu/rknpu_gem.c
@@ -935,6 +935,11 @@ int rknpu_gem_sync_ioctl(struct drm_device *dev, void *data,
 						      DMA_FROM_DEVICE);
 		}
 	} else {
+		struct drm_device *drm = rknpu_obj->base.dev;
+		struct rknpu_device *rknpu_dev = drm->dev_private;
+
+		WARN_ON(!rknpu_dev->fake_dev);
+
 		length = args->size;
 		offset = args->offset;
 
@@ -951,15 +956,14 @@ int rknpu_gem_sync_ioctl(struct drm_device *dev, void *data,
 
 			if (args->flags & RKNPU_MEM_SYNC_TO_DEVICE) {
 				dma_sync_single_range_for_device(
-					dev->dev, sg_dma_addr, sg_offset, size,
-					DMA_TO_DEVICE);
+					rknpu_dev->fake_dev, sg_dma_addr,
+					sg_offset, size, DMA_TO_DEVICE);
 			}
 
 			if (args->flags & RKNPU_MEM_SYNC_FROM_DEVICE) {
-				dma_sync_single_range_for_cpu(dev->dev,
-							      sg_dma_addr,
-							      sg_offset, size,
-							      DMA_FROM_DEVICE);
+				dma_sync_single_range_for_cpu(
+					rknpu_dev->fake_dev, sg_dma_addr,
+					sg_offset, size, DMA_FROM_DEVICE);
 			}
 
 			offset += size;

commit c7641517d10ae9a5c346f4c962ec1f0f1cdf5611
Author: Zhen Chen <chenzhen@rock-chips.com>
Date:   Tue Aug 24 09:39:30 2021 +0800

    MALI: utgard: select DEVFREQ_GOV_SIMPLE_ONDEMAND when MALI_DEVFREQ enabled
    
    MALI_DEVFREQ is enabled by default.
    
    Signed-off-by: Zhen Chen <chenzhen@rock-chips.com>
    Change-Id: I8fdbcc2c45bba35c514ca6ddc58b0e9c6a38cf2c

diff --git a/drivers/gpu/arm/mali400/mali/Kconfig b/drivers/gpu/arm/mali400/mali/Kconfig
index 34c5f72edcda..082919d91825 100644
--- a/drivers/gpu/arm/mali400/mali/Kconfig
+++ b/drivers/gpu/arm/mali400/mali/Kconfig
@@ -100,6 +100,7 @@ config MALI_DT
 config MALI_DEVFREQ
 	bool "Using devfreq to tuning frequency"
 	depends on MALI400 && PM_DEVFREQ
+	select DEVFREQ_GOV_SIMPLE_ONDEMAND
 	default n
 	help
 	Support devfreq for Mali.

commit ccf17141f9e23b7b3e30cb33319927be905c780f
Author: Zhen Chen <chenzhen@rock-chips.com>
Date:   Tue Aug 24 09:38:39 2021 +0800

    MALI: midgard: select DEVFREQ_GOV_SIMPLE_ONDEMAND when MALI_DEVFREQ enabled
    
    MALI_DEVFREQ is enabled by default.
    
    Signed-off-by: Zhen Chen <chenzhen@rock-chips.com>
    Change-Id: I1b86565fc72ab6678c0252ddba0d7098e4997bd3

diff --git a/drivers/gpu/arm/midgard/Kconfig b/drivers/gpu/arm/midgard/Kconfig
index 1b28bb73ad59..043bfc0021cc 100644
--- a/drivers/gpu/arm/midgard/Kconfig
+++ b/drivers/gpu/arm/midgard/Kconfig
@@ -52,6 +52,7 @@ config MALI_MIDGARD_ENABLE_TRACE
 config MALI_DEVFREQ
 	bool "devfreq support for Mali"
 	depends on MALI_MIDGARD && PM_DEVFREQ
+	select DEVFREQ_GOV_SIMPLE_ONDEMAND
 	help
 	  Support devfreq for Mali.
 

commit bd982a6809ea70e00d744a6eca6841e1374d8d05
Author: Zhen Chen <chenzhen@rock-chips.com>
Date:   Tue Aug 24 09:37:40 2021 +0800

    MALI: bifrost: select DEVFREQ_GOV_SIMPLE_ONDEMAND when MALI_BIFROST_DEVFREQ enabled
    
    MALI_BIFROST_DEVFREQ is enabled by default.
    
    Signed-off-by: Zhen Chen <chenzhen@rock-chips.com>
    Change-Id: I25b8af723f33d6d262bbaa30c69c16377eaaa3a4

diff --git a/drivers/gpu/arm/bifrost/Kconfig b/drivers/gpu/arm/bifrost/Kconfig
index ccb16671047a..868b3d319727 100644
--- a/drivers/gpu/arm/bifrost/Kconfig
+++ b/drivers/gpu/arm/bifrost/Kconfig
@@ -58,6 +58,7 @@ config MALI_BIFROST_ENABLE_TRACE
 config MALI_BIFROST_DEVFREQ
 	bool "devfreq support for Mali"
 	depends on MALI_BIFROST && PM_DEVFREQ
+	select DEVFREQ_GOV_SIMPLE_ONDEMAND
 	help
 	  Support devfreq for Mali.
 

commit 585dcf2413f4c50a0554c0bbf4aaaad7f692ef6e
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Thu Aug 19 09:09:15 2021 +0800

    mmc: dw_mmc: Set vqmmc to 3v3 before disabling it
    
    Disabling vqmmc without setting IO domain could
    cause SoC damage found in some Rockchip platforms.
    To cope with the fix from IO domain, add this patch
    
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: I05c53e78c073737cd0f7af9a206b9f588ffa4636

diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
index bbd85c451a6c..8412afeaa0cc 100644
--- a/drivers/mmc/host/dw_mmc.c
+++ b/drivers/mmc/host/dw_mmc.c
@@ -1554,8 +1554,11 @@ static void dw_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 		if (!IS_ERR(mmc->supply.vmmc))
 			mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, 0);
 
-		if (!IS_ERR(mmc->supply.vqmmc) && slot->host->vqmmc_enabled)
+		if (!IS_ERR(mmc->supply.vqmmc) && slot->host->vqmmc_enabled) {
+			ios->signal_voltage = MMC_SIGNAL_VOLTAGE_330;
+			mmc_regulator_set_vqmmc(mmc, ios);
 			regulator_disable(mmc->supply.vqmmc);
+		}
 		slot->host->vqmmc_enabled = false;
 
 		regs = mci_readl(slot->host, PWREN);

commit 7b83efeaa4ebba4db37ce52241dc6ce0ac661838
Author: Finley Xiao <finley.xiao@rock-chips.com>
Date:   Mon Aug 23 14:49:21 2021 +0800

    PM / devfreq: rockchip_dmcdbg: build depends on CPU config
    
    This optimizes the size of rockchip-otp.o, details as follows.
    
    ./scripts/bloat-o-meter rockchip_dmc_dbg-old.o rockchip_dmc_dbg.o
    add/remove: 0/3 grow/shrink: 1/1 up/down: 248/-640 (-392)
    Function                                     old     new   delta
    rv1126_dmcdbg_init                           588     836    +248
    px30_dmcdbg_init                              92       -     -92
    rk_dmcdbg_sip_smc_match_ver                  164       -    -164
    proc_dmcdbg_init                             188       -    -188
    rockchip_dmcdbg_of_match                     588     392    -196
    Total: Before=9476, After=9084, chg -4.14%
    
    Change-Id: Ib8b3ef4ebffe9c73e4a2b4541a696ed4b3524180
    Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>

diff --git a/drivers/devfreq/rockchip_dmc_dbg.c b/drivers/devfreq/rockchip_dmc_dbg.c
index 11553a00883b..180efb0fd16f 100644
--- a/drivers/devfreq/rockchip_dmc_dbg.c
+++ b/drivers/devfreq/rockchip_dmc_dbg.c
@@ -1097,8 +1097,12 @@ static __maybe_unused int px30_dmcdbg_init(struct platform_device *pdev,
 }
 
 static const struct of_device_id rockchip_dmcdbg_of_match[] = {
+#ifdef CONFIG_CPU_PX30
 	{ .compatible = "rockchip,px30-dmcdbg", .data = px30_dmcdbg_init },
+#endif
+#ifdef CONFIG_CPU_RV1126
 	{ .compatible = "rockchip,rv1126-dmcdbg", .data = rv1126_dmcdbg_init },
+#endif
 	{ },
 };
 MODULE_DEVICE_TABLE(of, rockchip_dmcdbg_of_match);

commit 85ab7a4805f2e9beee6fcc066eecc889e2b3826f
Author: Finley Xiao <finley.xiao@rock-chips.com>
Date:   Mon Aug 23 14:28:10 2021 +0800

    PM / devfreq: rockchip-dfi: build depends on CPU config
    
    This optimizes the size of rockchip-otp.o, details as follows.
    
    ./scripts/bloat-o-meter rockchip-dfi-old.o rockchip-dfi.o
    add/remove: 0/20 grow/shrink: 0/1 up/down: 0/-3564 (-3564)
    Function                                     old     new   delta
    rk3368_dfi_set_event                           8       -      -8
    rk3288_dfi_set_event                           8       -      -8
    rk3128_dfi_set_event                           8       -      -8
    rk3368_dfi_ops                                20       -     -20
    rk3288_dfi_ops                                20       -     -20
    rk3128_dfi_ops                                20       -     -20
    rk3368_dfi_disable                            36       -     -36
    rk3288_dfi_disable                            36       -     -36
    rk3128_dfi_disable                            36       -     -36
    rk3368_dfi_enable                             40       -     -40
    rk3288_dfi_enable                             40       -     -40
    rk3128_dfi_enable                             40       -     -40
    rk3368_dfi_init                               76       -     -76
    rk3128_dfi_init                               76       -     -76
    rk3328_dfi_init                              212       -    -212
    rk3128_dfi_get_event                         212       -    -212
    rk3288_dfi_init                              240       -    -240
    rockchip_dfi_init                            256       -    -256
    rk3368_dfi_get_event                         260       -    -260
    rk3288_dfi_get_event                         352       -    -352
    rockchip_dfi_id_match                       1960     392   -1568
    Total: Before=5144, After=1580, chg -69.28%
    
    Change-Id: Ibb2b001fb9afdcb6fec5db9d075c71b3abb6fbf3
    Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>

diff --git a/drivers/devfreq/event/rockchip-dfi.c b/drivers/devfreq/event/rockchip-dfi.c
index 7a4bdd9a8b40..a5ccecb883a9 100644
--- a/drivers/devfreq/event/rockchip-dfi.c
+++ b/drivers/devfreq/event/rockchip-dfi.c
@@ -465,9 +465,9 @@ static const struct devfreq_event_ops rockchip_dfi_ops = {
 	.set_event = rockchip_dfi_set_event,
 };
 
-static __init int px30_dfi_init(struct platform_device *pdev,
-				  struct rockchip_dfi *data,
-				  struct devfreq_event_desc *desc)
+static __maybe_unused __init int px30_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;
@@ -499,9 +499,9 @@ static __init int px30_dfi_init(struct platform_device *pdev,
 	return 0;
 }
 
-static __init int rk3128_dfi_init(struct platform_device *pdev,
-				  struct rockchip_dfi *data,
-				  struct devfreq_event_desc *desc)
+static __maybe_unused __init int rk3128_dfi_init(struct platform_device *pdev,
+						 struct rockchip_dfi *data,
+						 struct devfreq_event_desc *desc)
 {
 	struct device_node *np = pdev->dev.of_node, *node;
 
@@ -517,9 +517,9 @@ static __init int rk3128_dfi_init(struct platform_device *pdev,
 	return 0;
 }
 
-static __init int rk3288_dfi_init(struct platform_device *pdev,
-				  struct rockchip_dfi *data,
-				  struct devfreq_event_desc *desc)
+static __maybe_unused __init int rk3288_dfi_init(struct platform_device *pdev,
+						 struct rockchip_dfi *data,
+						 struct devfreq_event_desc *desc)
 {
 	struct device_node *np = pdev->dev.of_node, *node;
 	u32 val;
@@ -554,9 +554,9 @@ static __init int rk3288_dfi_init(struct platform_device *pdev,
 	return 0;
 }
 
-static __init int rk3368_dfi_init(struct platform_device *pdev,
-				  struct rockchip_dfi *data,
-				  struct devfreq_event_desc *desc)
+static __maybe_unused __init int rk3368_dfi_init(struct platform_device *pdev,
+						 struct rockchip_dfi *data,
+						 struct devfreq_event_desc *desc)
 {
 	struct device *dev = &pdev->dev;
 
@@ -572,9 +572,9 @@ static __init int rk3368_dfi_init(struct platform_device *pdev,
 	return 0;
 }
 
-static __init int rockchip_dfi_init(struct platform_device *pdev,
-				    struct rockchip_dfi *data,
-				    struct devfreq_event_desc *desc)
+static __maybe_unused __init int rockchip_dfi_init(struct platform_device *pdev,
+						   struct rockchip_dfi *data,
+						   struct devfreq_event_desc *desc)
 {
 	struct device *dev = &pdev->dev;
 	struct resource *res;
@@ -609,9 +609,9 @@ static __init int rockchip_dfi_init(struct platform_device *pdev,
 	return 0;
 }
 
-static __init int rk3328_dfi_init(struct platform_device *pdev,
-				  struct rockchip_dfi *data,
-				  struct devfreq_event_desc *desc)
+static __maybe_unused __init int rk3328_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;
@@ -640,15 +640,33 @@ static __init int rk3328_dfi_init(struct platform_device *pdev,
 }
 
 static const struct of_device_id rockchip_dfi_id_match[] = {
+#ifdef CONFIG_CPU_PX30
 	{ .compatible = "rockchip,px30-dfi", .data = px30_dfi_init },
+#endif
+#ifdef CONFIG_CPU_RK1808
 	{ .compatible = "rockchip,rk1808-dfi", .data = px30_dfi_init },
+#endif
+#ifdef CONFIG_CPU_RK312X
 	{ .compatible = "rockchip,rk3128-dfi", .data = rk3128_dfi_init },
+#endif
+#ifdef CONFIG_CPU_RK3288
 	{ .compatible = "rockchip,rk3288-dfi", .data = rk3288_dfi_init },
+#endif
+#ifdef CONFIG_CPU_RK3328
 	{ .compatible = "rockchip,rk3328-dfi", .data = rk3328_dfi_init },
+#endif
+#ifdef CONFIG_CPU_RK3368
 	{ .compatible = "rockchip,rk3368-dfi", .data = rk3368_dfi_init },
+#endif
+#ifdef CONFIG_CPU_RK3399
 	{ .compatible = "rockchip,rk3399-dfi", .data = rockchip_dfi_init },
+#endif
+#ifdef CONFIG_CPU_RK3568
 	{ .compatible = "rockchip,rk3568-dfi", .data = px30_dfi_init },
+#endif
+#ifdef CONFIG_CPU_RV1126
 	{ .compatible = "rockchip,rv1126-dfi", .data = px30_dfi_init },
+#endif
 	{ },
 };
 

commit e3f1c67586ab2b35c74d10d9f83e980bf38ed69f
Author: Finley Xiao <finley.xiao@rock-chips.com>
Date:   Thu Aug 19 16:24:22 2021 +0800

    nvmem: rockchip-otp: build depends on CPU config
    
    This optimizes the size of rockchip-otp.o, details as follows.
    
    ./scripts/bloat-o-meter rockchip-otp-old.o rockchip-otp.o
    add/remove: 0/9 grow/shrink: 0/1 up/down: 0/-2224 (-2224)
    Function                                     old     new   delta
    px30_otp_clocks                               12       -     -12
    rk3568_otp_clocks                             16       -     -16
    rk3568_data                                   24       -     -24
    px30_data                                     24       -     -24
    rockchip_otp_reset                           128       -    -128
    px30_otp_ecc_enable                          164       -    -164
    px30_otp_wait_status                         176       -    -176
    px30_otp_read                                416       -    -416
    rockchip_otp_match                           980     392    -588
    rk3568_otp_read                              676       -    -676
    Total: Before=4721, After=2497, chg -47.11%
    
    Change-Id: I960a51e826a17112d822daa2b77470e482e729d7
    Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>

diff --git a/drivers/nvmem/rockchip-otp.c b/drivers/nvmem/rockchip-otp.c
index ec00fa5f80cc..bfdab0af82cf 100644
--- a/drivers/nvmem/rockchip-otp.c
+++ b/drivers/nvmem/rockchip-otp.c
@@ -529,22 +529,30 @@ static const struct rockchip_data rv1126_data = {
 };
 
 static const struct of_device_id rockchip_otp_match[] = {
+#ifdef CONFIG_CPU_PX30
 	{
 		.compatible = "rockchip,px30-otp",
 		.data = (void *)&px30_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3308
 	{
 		.compatible = "rockchip,rk3308-otp",
 		.data = (void *)&px30_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3568
 	{
 		.compatible = "rockchip,rk3568-otp",
 		.data = (void *)&rk3568_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RV1126
 	{
 		.compatible = "rockchip,rv1126-otp",
 		.data = (void *)&rv1126_data,
 	},
+#endif
 	{ /* sentinel */ },
 };
 MODULE_DEVICE_TABLE(of, rockchip_otp_match);

commit 7072fb7bc5db2c9e8dac2700cad94e3429c08e65
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Fri Aug 20 11:14:42 2021 +0800

    drivers: rkflash: Add RK_SFTL configuration
    
    Avoid adding redundant FTL code to SPI Nand MTD case.
    
    make ARCH=arm rv1126_defconfig test, size -t drivers/rkflash/built-in.a
    the former size:
    CONFIG_RK_SFC_NAND=y
    CONFIG_RK_SFC_NAND_MTD=y
    CONFIG_RK_SFC_NOR=y
    CONFIG_RK_SFC_NOR_MTD=y
    text    data     bss     dec     hex filename
    83237    2757   23716  109710   1ac8e (TOTALS)
    
    after adjust:
    31677    2705    3624   38006    9476 (TOTALS)
    
    For Nor only:
    CONFIG_RK_SFC_NOR=y
    CONFIG_RK_SFC_NOR_MTD=y
    19350    1237    2568   23155    5a73 (TOTALS)
    
    Change-Id: I46186393de26512566cc62ceb1490ef35a70be1d
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/rkflash/Kconfig b/drivers/rkflash/Kconfig
index 27600b3cdfa9..86bcfedc5e29 100644
--- a/drivers/rkflash/Kconfig
+++ b/drivers/rkflash/Kconfig
@@ -17,6 +17,15 @@ if RK_FLASH
 
 comment "Rockchip Flash Devices"
 
+config RK_SFTL
+	tristate "Rockchip Slc Nand FTL support"
+	default y
+	depends on (RK_NAND || (RK_SFC_NAND && RK_SFC_NAND_MTD !=y))
+	help
+	  This enables support for Slc Nand FTL.
+
+	  Say Y when you have a board with Slc Nand Flash register as block device.
+
 config RK_NANDC_NAND
 	tristate "Rockchip NANDC Slc Nand Devices support"
 	default n
diff --git a/drivers/rkflash/Makefile b/drivers/rkflash/Makefile
index 283a217eb6ca..f59991e5e933 100644
--- a/drivers/rkflash/Makefile
+++ b/drivers/rkflash/Makefile
@@ -1,11 +1,13 @@
 # SPDX-License-Identifier: GPL-2.0
 
-obj-$(CONFIG_RK_NANDC_NAND) += rkflash_blk.o rkflash_debug.o rksftl.o rknandc_base.o nand_boot.o flash.o nandc.o
-obj-$(CONFIG_RK_SFC_NAND) += rkflash_blk.o rkflash_debug.o rksftl.o rksfc_base.o sfc_nand_boot.o sfc_nand.o sfc.o
+obj-$(CONFIG_RK_NANDC_NAND) += rkflash_blk.o rkflash_debug.o rknandc_base.o nand_boot.o flash.o nandc.o
+obj-$(CONFIG_RK_SFC_NAND) += rkflash_blk.o rkflash_debug.o rksfc_base.o sfc_nand_boot.o sfc_nand.o sfc.o
 obj-$(CONFIG_RK_SFC_NAND_MTD) += sfc_nand_mtd.o sfc_nand_mtd_bbt.o
 obj-$(CONFIG_RK_SFC_NOR) += rkflash_blk.o rkflash_debug.o rksfc_base.o sfc_nor_boot.o sfc_nor.o sfc.o
 obj-$(CONFIG_RK_SFC_NOR_MTD) += sfc_nor_mtd.o
 
+obj-$(CONFIG_RK_SFTL) += rksftl.o
+
 ifdef CONFIG_THUMB2_KERNEL
 rksftl-$(CONFIG_THUMB2_KERNEL) += rk_sftl_arm_v7_thumb.o
 else
diff --git a/drivers/rkflash/rkflash_blk.c b/drivers/rkflash/rkflash_blk.c
index 6030ac905301..cfb3a3ba5f76 100644
--- a/drivers/rkflash/rkflash_blk.c
+++ b/drivers/rkflash/rkflash_blk.c
@@ -152,7 +152,7 @@ static int rkflash_blk_proc_show(struct seq_file *m, void *v)
 {
 	char *ftl_buf = kzalloc(4096, GFP_KERNEL);
 
-#if IS_ENABLED(CONFIG_RK_NANDC_NAND) || IS_ENABLED(CONFIG_RK_SFC_NAND)
+#if IS_ENABLED(CONFIG_RK_SFTL)
 	int real_size = 0;
 
 	real_size = rknand_proc_ftlread(4096, ftl_buf);
@@ -694,7 +694,7 @@ int rkflash_dev_init(void __iomem *reg_addr,
 		break;
 #endif
 	case FLASH_TYPE_NANDC_NAND:
-#if defined(CONFIG_RK_SFC_NAND) || defined(CONFIG_RK_NANDC_NAND)
+#if defined(CONFIG_RK_SFTL)
 		rk_sftl_vendor_dev_ops_register(rkflash_dev_vendor_read,
 						rkflash_dev_vendor_write);
 		ret = rk_sftl_vendor_storage_init();
diff --git a/drivers/rkflash/sfc_nand.c b/drivers/rkflash/sfc_nand.c
index 34b967076a68..653799e1cf01 100644
--- a/drivers/rkflash/sfc_nand.c
+++ b/drivers/rkflash/sfc_nand.c
@@ -954,6 +954,7 @@ int sfc_nand_read_id(u8 *data)
 	return ret;
 }
 
+#if defined(CONFIG_RK_SFTL)
 /*
  * Read the 1st page's 1st byte of a phy_blk
  * If not FF, it's bad blk
@@ -1008,6 +1009,7 @@ void sfc_nand_ftl_ops_init(void)
 	g_nand_ops.read_page		= sfc_nand_read_page;
 	g_nand_ops.bch_sel		= NULL;
 }
+#endif
 
 static int sfc_nand_enable_QE(void)
 {
diff --git a/drivers/rkflash/sfc_nand_boot.c b/drivers/rkflash/sfc_nand_boot.c
index 8db7f8df968f..4c0bd84d7236 100644
--- a/drivers/rkflash/sfc_nand_boot.c
+++ b/drivers/rkflash/sfc_nand_boot.c
@@ -17,9 +17,11 @@ static int snand_init(void __iomem *reg_addr)
 	ret = sfc_nand_init();
 	if (ret == 0) {
 		sfnand_dev = sfc_nand_get_private_dev();
-#ifndef CONFIG_RK_SFC_NAND_MTD
+#if defined(CONFIG_RK_SFTL)
 		sfc_nand_ftl_ops_init();
 		ret = sftl_init();
+#elif !defined(CONFIG_RK_SFC_NAND_MTD)
+#error "When CONFIG_RK_SFC_NAND_MTD is not used, CONFIG_RK_SFTL is required!"
 #endif
 	}
 
@@ -28,44 +30,57 @@ static int snand_init(void __iomem *reg_addr)
 
 static unsigned int snand_get_capacity(void)
 {
-	return sftl_get_density();
+	if (IS_ENABLED(CONFIG_RK_SFTL))
+		return sftl_get_density();
+	return 0;
 }
 
 static int snand_write(u32 sec, u32 n_sec, void *p_data)
 {
-	return sftl_write(sec, n_sec, p_data);
+	if (IS_ENABLED(CONFIG_RK_SFTL))
+		return sftl_write(sec, n_sec, p_data);
+	return 0;
 }
 
 static int snand_read(u32 sec, u32 n_sec, void *p_data)
 {
-	return sftl_read(sec, n_sec, p_data);
+	if (IS_ENABLED(CONFIG_RK_SFTL))
+		return sftl_read(sec, n_sec, p_data);
+	return 0;
 }
 
 static int snand_vendor_read(u32 sec, u32 n_sec, void *p_data)
 {
-	return sftl_vendor_read(sec, n_sec, p_data);
+	if (IS_ENABLED(CONFIG_RK_SFTL))
+		return sftl_vendor_read(sec, n_sec, p_data);
+	return 0;
 }
 
 static int snand_vendor_write(u32 sec, u32 n_sec, void *p_data)
 {
-	return sftl_vendor_write(sec, n_sec, p_data);
+	if (IS_ENABLED(CONFIG_RK_SFTL))
+		return sftl_vendor_write(sec, n_sec, p_data);
+	return 0;
 }
 
 static int snand_gc(void)
 {
-	return sftl_gc();
+	if (IS_ENABLED(CONFIG_RK_SFTL))
+		return sftl_gc();
+	return 0;
 }
 
 static int snand_discard(u32 sec, u32 n_sec)
 {
-	return sftl_discard(sec, n_sec);
+	if (IS_ENABLED(CONFIG_RK_SFTL))
+		return sftl_discard(sec, n_sec);
+	return 0;
 }
 
 static void snand_deinit(void)
 {
-#ifndef CONFIG_RK_SFC_NAND_MTD
-	sftl_deinit();
-#endif
+	if (IS_ENABLED(CONFIG_RK_SFTL))
+		sftl_deinit();
 	sfc_nand_deinit();
 }
 

commit 69a034d29725b7805e1bd7ec8b9b124f32bd5bcb
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Mon Aug 16 11:06:15 2021 +0800

    power/avs: rockchip-io-domain: rv1126 use separated notify
    
    RV1126 set 3.3V before regulator disable.
    
    Do a fix to rockchip io-domain, follow this orders:
    
    * system running state
      -> io-domain vsel to 3.3V (actually is done by event-disable)
        -> regulator_enable
          -> vsel change according to regulator voltage
    
    * system running state
      -> regulator_disable
        -> io-domain vsel to 3.3V
    
    The bug only instance on RV1126, and tested on RV1126 EVB DDR3 V10.
    
    Change-Id: Ic9d6b05d07b050c392e415786cf6390cc1c5aa9e
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/power/avs/rockchip-io-domain.c b/drivers/power/avs/rockchip-io-domain.c
index d13514dc4647..9b9bcd5b7208 100644
--- a/drivers/power/avs/rockchip-io-domain.c
+++ b/drivers/power/avs/rockchip-io-domain.c
@@ -743,6 +743,55 @@ static void rockchip_iodomain_dump(const struct platform_device *pdev,
 	}
 }
 
+static int rv1126_iodomain_notify(struct notifier_block *nb,
+				  unsigned long event,
+				  void *data)
+{
+	struct rockchip_iodomain_supply *supply =
+			container_of(nb, struct rockchip_iodomain_supply, nb);
+	int uV;
+	int ret;
+
+	if (event & REGULATOR_EVENT_PRE_VOLTAGE_CHANGE) {
+		struct pre_voltage_change_data *pvc_data = data;
+
+		uV = max_t(unsigned long, pvc_data->old_uV, pvc_data->max_uV);
+	} else if (event & (REGULATOR_EVENT_VOLTAGE_CHANGE |
+			    REGULATOR_EVENT_ABORT_VOLTAGE_CHANGE)) {
+		uV = (unsigned long)data;
+	} else if (event & REGULATOR_EVENT_DISABLE) {
+		uV = MAX_VOLTAGE_3_3;
+	} else if (event & REGULATOR_EVENT_ENABLE) {
+		if (!data)
+			return NOTIFY_BAD;
+
+		uV = (unsigned long)data;
+	} else {
+		return NOTIFY_OK;
+	}
+
+	if (uV <= 0) {
+		dev_err(supply->iod->dev, "Voltage invalid: %d\n", uV);
+		return NOTIFY_BAD;
+	}
+
+	dev_dbg(supply->iod->dev, "Setting to %d\n", uV);
+
+	if (uV > MAX_VOLTAGE_3_3) {
+		dev_err(supply->iod->dev, "Voltage too high: %d\n", uV);
+
+		if (event == REGULATOR_EVENT_PRE_VOLTAGE_CHANGE)
+			return NOTIFY_BAD;
+	}
+
+	ret = supply->iod->write(supply, uV);
+	if (ret && event == REGULATOR_EVENT_PRE_VOLTAGE_CHANGE)
+		return NOTIFY_BAD;
+
+	dev_dbg(supply->iod->dev, "Setting to %d done\n", uV);
+	return NOTIFY_OK;
+}
+
 static int rockchip_iodomain_probe(struct platform_device *pdev)
 {
 	struct device_node *np = pdev->dev.of_node;
@@ -831,6 +880,8 @@ static int rockchip_iodomain_probe(struct platform_device *pdev)
 		supply->iod = iod;
 		supply->reg = reg;
 		supply->nb.notifier_call = rockchip_iodomain_notify;
+		if (IS_ENABLED(CONFIG_CPU_RV1126))
+			supply->nb.notifier_call = rv1126_iodomain_notify;
 
 		ret = iod->write(supply, uV);
 		if (ret) {

commit 15957347d6565a80209e7945001182787e487807
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Mon Aug 16 10:59:24 2021 +0800

    regulator: core: notify regulator enable with the voltage value on rv1126
    
    Get the voltage of regulator and then pass it as the parameter of
    notify, the driver could take it.
    
    The origin parameter for notify is NULL, so this patch do nothing effect
    to other driver who not care about the voltage value.
    
    Change-Id: I22a626132d99501f6f9b25371543ab3c99cb0e02
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index c8a7c985c406..37f29d9c508a 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -2343,8 +2343,14 @@ static int _regulator_enable(struct regulator_dev *rdev)
 			if (ret < 0)
 				return ret;
 
-			_notifier_call_chain(rdev, REGULATOR_EVENT_ENABLE,
-					     NULL);
+			if (IS_ENABLED(CONFIG_CPU_RV1126)) {
+				ret = _regulator_get_voltage(rdev);
+				_notifier_call_chain(rdev, REGULATOR_EVENT_ENABLE,
+						     &ret);
+			} else {
+				_notifier_call_chain(rdev, REGULATOR_EVENT_ENABLE,
+						     NULL);
+			}
 		} else if (ret < 0) {
 			rdev_err(rdev, "is_enabled() failed: %d\n", ret);
 			return ret;

commit 481558c7e6c92f1238add4699e6098e41b8cd38c
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Mon Aug 16 16:42:00 2021 +0800

    power/avs: rockchip-io-domain: build depends on CPU config
    
    Before:
       text    data     bss     dec     hex filename
       9217     240       0    9457    24f1 drivers/power/avs/rockchip-io-domain.o
    
    After:
       text    data     bss     dec     hex filename
       2739     144       0    2883     b43 drivers/power/avs/rockchip-io-domain.o
    
    Change-Id: Ibdaeb4f9e73b4c653fe854c101d181f28d52b481
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/power/avs/rockchip-io-domain.c b/drivers/power/avs/rockchip-io-domain.c
index d723bcfae918..d13514dc4647 100644
--- a/drivers/power/avs/rockchip-io-domain.c
+++ b/drivers/power/avs/rockchip-io-domain.c
@@ -561,6 +561,7 @@ static const struct rockchip_iodomain_soc_data soc_data_rv1126_pmu = {
 };
 
 static const struct of_device_id rockchip_iodomain_match[] = {
+#ifdef CONFIG_CPU_PX30
 	{
 		.compatible = "rockchip,px30-io-voltage-domain",
 		.data = (void *)&soc_data_px30
@@ -569,26 +570,38 @@ static const struct of_device_id rockchip_iodomain_match[] = {
 		.compatible = "rockchip,px30-pmu-io-voltage-domain",
 		.data = (void *)&soc_data_px30_pmu
 	},
+#endif
+#ifdef CONFIG_CPU_RK3188
 	{
 		.compatible = "rockchip,rk3188-io-voltage-domain",
 		.data = &soc_data_rk3188
 	},
+#endif
+#ifdef CONFIG_CPU_RK322X
 	{
 		.compatible = "rockchip,rk3228-io-voltage-domain",
 		.data = &soc_data_rk3228
 	},
+#endif
+#ifdef CONFIG_CPU_RK3288
 	{
 		.compatible = "rockchip,rk3288-io-voltage-domain",
 		.data = &soc_data_rk3288
 	},
+#endif
+#ifdef CONFIG_CPU_RK3308
 	{
 		.compatible = "rockchip,rk3308-io-voltage-domain",
 		.data = &soc_data_rk3308
 	},
+#endif
+#ifdef CONFIG_CPU_RK3328
 	{
 		.compatible = "rockchip,rk3328-io-voltage-domain",
 		.data = &soc_data_rk3328
 	},
+#endif
+#ifdef CONFIG_CPU_RK3368
 	{
 		.compatible = "rockchip,rk3368-io-voltage-domain",
 		.data = &soc_data_rk3368
@@ -597,6 +610,8 @@ static const struct of_device_id rockchip_iodomain_match[] = {
 		.compatible = "rockchip,rk3368-pmu-io-voltage-domain",
 		.data = &soc_data_rk3368_pmu
 	},
+#endif
+#ifdef CONFIG_CPU_RK3399
 	{
 		.compatible = "rockchip,rk3399-io-voltage-domain",
 		.data = &soc_data_rk3399
@@ -605,10 +620,14 @@ static const struct of_device_id rockchip_iodomain_match[] = {
 		.compatible = "rockchip,rk3399-pmu-io-voltage-domain",
 		.data = &soc_data_rk3399_pmu
 	},
+#endif
+#ifdef CONFIG_CPU_RK3568
 	{
 		.compatible = "rockchip,rk3568-pmu-io-voltage-domain",
 		.data = &soc_data_rk3568_pmu
 	},
+#endif
+#ifdef CONFIG_CPU_RV110X
 	{
 		.compatible = "rockchip,rv1108-io-voltage-domain",
 		.data = &soc_data_rv1108
@@ -617,10 +636,13 @@ static const struct of_device_id rockchip_iodomain_match[] = {
 		.compatible = "rockchip,rv1108-pmu-io-voltage-domain",
 		.data = &soc_data_rv1108_pmu
 	},
+#endif
+#ifdef CONFIG_CPU_RV1126
 	{
 		.compatible = "rockchip,rv1126-pmu-io-voltage-domain",
 		.data = &soc_data_rv1126_pmu
 	},
+#endif
 	{ /* sentinel */ },
 };
 MODULE_DEVICE_TABLE(of, rockchip_iodomain_match);
@@ -743,7 +765,7 @@ static int rockchip_iodomain_probe(struct platform_device *pdev)
 	match = of_match_node(rockchip_iodomain_match, np);
 	iod->soc_data = match->data;
 
-	if (match->data == &soc_data_rk3568_pmu)
+	if (IS_ENABLED(CONFIG_CPU_RK3568) && match->data == &soc_data_rk3568_pmu)
 		iod->write = rk3568_pmu_iodomain_write;
 	else
 		iod->write = rockchip_iodomain_write;

commit 649b7048be16e582c8f56c0c08326e4df2d9f842
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Mon Aug 16 19:17:10 2021 +0800

    drm/rockchip: abort commit when drm_atomic_helper_swap_state failed
    
    cleanup_planes and return when swap_state failed.
    
    Change-Id: Icbdceb83a16747d42826bd443a6c43fcf3675592
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
index 9b696023ef99..a400c1782aec 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
@@ -480,7 +480,12 @@ static int rockchip_drm_atomic_commit(struct drm_device *dev,
 		DRM_ERROR("vop bandwidth too large %zd\n", bandwidth);
 	}
 
-	WARN_ON(drm_atomic_helper_swap_state(state, true) < 0);
+	ret = drm_atomic_helper_swap_state(state, true);
+	if (ret < 0) {
+		DRM_ERROR("swap atomic state for %s failed: %d\n", current->comm, ret);
+		drm_atomic_helper_cleanup_planes(dev, state);
+		return ret;
+	}
 
 	drm_atomic_state_get(state);
 	commit = kmalloc(sizeof(*commit), GFP_KERNEL);

commit 8bdbe991e326f2e05d15e395c16381756daad7c4
Author: Todd Kjos <tkjos@google.com>
Date:   Tue Aug 17 14:23:28 2021 -0700

    ANDROID: xt_quota2: set usersize in xt_match registration object
    
    Explicitly set what is visible to userspace
    
    Bug: 196046570
    Test: passed netd test suites
    Signed-off-by: Todd Kjos <tkjos@google.com>
    Change-Id: Iacec0ef8ae290e01f1b60508d8abcd40a3653c83

diff --git a/net/netfilter/xt_quota2.c b/net/netfilter/xt_quota2.c
index 4623e3b286d3..95ebfcbb500a 100644
--- a/net/netfilter/xt_quota2.c
+++ b/net/netfilter/xt_quota2.c
@@ -343,6 +343,7 @@ static struct xt_match quota_mt2_reg[] __read_mostly = {
 		.match      = quota_mt2,
 		.destroy    = quota_mt2_destroy,
 		.matchsize  = sizeof(struct xt_quota_mtinfo2),
+		.usersize   = offsetof(struct xt_quota_mtinfo2, master),
 		.me         = THIS_MODULE,
 	},
 	{
@@ -353,6 +354,7 @@ static struct xt_match quota_mt2_reg[] __read_mostly = {
 		.match      = quota_mt2,
 		.destroy    = quota_mt2_destroy,
 		.matchsize  = sizeof(struct xt_quota_mtinfo2),
+		.usersize   = offsetof(struct xt_quota_mtinfo2, master),
 		.me         = THIS_MODULE,
 	},
 };

commit 071eac12cef233b0ada41c6c687c9833f9f72cd6
Author: Todd Kjos <tkjos@google.com>
Date:   Tue Aug 17 13:29:23 2021 -0700

    ANDROID: xt_quota2: clear quota2_log message before sending
    
    Initialize message buffer for quota2_log to avoid sending
    random data.
    
    Bug: 196046570
    Test: passed netd test suites
    Fixes: 10cda83af99d ("ANDROID: netfilter: xt_quota2: adding the
    original quota2 from xtables-addons")
    Signed-off-by: Todd Kjos <tkjos@google.com>
    Change-Id: Ic9f34aaa2593809b375fc649b74567190c99dc62

diff --git a/net/netfilter/xt_quota2.c b/net/netfilter/xt_quota2.c
index 373c2ec64ec6..4623e3b286d3 100644
--- a/net/netfilter/xt_quota2.c
+++ b/net/netfilter/xt_quota2.c
@@ -106,23 +106,16 @@ static void quota2_log(unsigned int hooknum,
 		return;
 	}
 	pm = nlmsg_data(nlh);
+	memset(pm, 0, sizeof(*pm));
 	if (skb->tstamp == 0)
 		__net_timestamp((struct sk_buff *)skb);
-	pm->data_len = 0;
 	pm->hook = hooknum;
 	if (prefix != NULL)
 		strlcpy(pm->prefix, prefix, sizeof(pm->prefix));
-	else
-		*(pm->prefix) = '\0';
 	if (in)
 		strlcpy(pm->indev_name, in->name, sizeof(pm->indev_name));
-	else
-		pm->indev_name[0] = '\0';
-
 	if (out)
 		strlcpy(pm->outdev_name, out->name, sizeof(pm->outdev_name));
-	else
-		pm->outdev_name[0] = '\0';
 
 	NETLINK_CB(log_skb).dst_group = 1;
 	pr_debug("throwing 1 packets to netlink group 1\n");

commit 32b743af5b88b53931334198c761aa4033d02ed9
Author: Sam Liddicott <sam@liddicott.com>
Date:   Tue Jan 7 09:21:53 2014 -0800

    ANDROID: xt_quota2: remove trailing junk which might have a digit in it
    
    Make sure string only contains the characters specified by userspace.
    
    Fix cherry-picked from xtables-extensions project
    
    Signed-off-by: Sam Liddicott <sam@liddicott.com>
    Bug: 196046570
    Test: passed netd test suites
    Fixes: 10cda83af99d ("ANDROID: netfilter: xt_quota2: adding the
    original quota2 from xtables-addons")
    Signed-off-by: Todd Kjos <tkjos@google.com>
    (cherry picked from https://git.code.sf.net/p/xtables-addons/xtables-addons
    bc2bcc383c70b293bd816c29523a952ca8736fb5)
    Change-Id: I965448564906e5fbf0fe6d6414f44d9e257ea195

diff --git a/net/netfilter/xt_quota2.c b/net/netfilter/xt_quota2.c
index c9a06d0652fe..373c2ec64ec6 100644
--- a/net/netfilter/xt_quota2.c
+++ b/net/netfilter/xt_quota2.c
@@ -162,6 +162,8 @@ static ssize_t quota_proc_write(struct file *file, const char __user *input,
 	if (copy_from_user(buf, input, size) != 0)
 		return -EFAULT;
 	buf[sizeof(buf)-1] = '\0';
+	if (size < sizeof(buf))
+		buf[size] = '\0';
 
 	spin_lock_bh(&e->lock);
 	e->quota = simple_strtoull(buf, NULL, 0);

commit 6b6c46105150385b4b631a79675b186a0547e00f
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Thu Aug 19 15:20:26 2021 +0800

    arm64: dts: rockchip: rk356x-evb: fix pcie supply to regulator-fixed
    
    Commit 6de4caa7df8c ("arm64: dts: rockchip: rk356x-evb: fix pcie supply
    to regulator-fixed") cleanup these stuff but we still have some left.
    
    Then commit e81fbbdddee5 ("arm64: dts: rockchip: rk356x-evb: fix pcie
    supply to regulator-fixed") cleanup it but introduce a new bug in dts
    property name. Fix the name didn't make it work stabe since we found
    some boards need a delay before enabling trainning for power to be
    stable from the measurement.
    
    By measurement, 5ms is enough for power and refclk to be stable.
    
    Fixes: 6de4caa7df8c ("arm64: dts: rockchip: rk356x-evb: fix pcie supply to regulator-fixed")
    Fixes: e81fbbdddee5 ("arm64: dts: rockchip: rk356x-evb: fix pcie supply to regulator-fixed")
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: Ibebca2464f3b432114111a774ace14ed1e249ddb

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-evb-mipitest-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-evb-mipitest-v10.dtsi
index 77ecad88f4ec..48cae85dff9e 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-evb-mipitest-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-evb-mipitest-v10.dtsi
@@ -21,6 +21,7 @@
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
 		gpio = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>;
+		startup-delay-us = <5000>;
 		vin-supply = <&dc_12v>;
 	};
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi
index c43a63708ac4..d508e8322282 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi
@@ -21,6 +21,7 @@
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
 		gpio = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>;
+		startup-delay-us = <5000>;
 		vin-supply = <&dc_12v>;
 	};
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi
index e4805605ebf0..fe1c8a19d261 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi
@@ -41,6 +41,7 @@
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
 		gpio = <&gpio0 RK_PC2 GPIO_ACTIVE_HIGH>;
+		startup-delay-us = <5000>;
 		vin-supply = <&dc_12v>;
 	};
 };
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi
index 8e0d808e6a89..3368e59a0349 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi
@@ -21,6 +21,7 @@
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
 		gpio = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>;
+		startup-delay-us = <5000>;
 		vin-supply = <&dc_12v>;
 	};
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi
index ead78e0077a2..d4035a36065c 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi
@@ -68,7 +68,8 @@
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
-		gpios = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;
+		gpio = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;
+		startup-delay-us = <5000>;
 		vin-supply = <&dc_12v>;
 	};
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi
index b3fbc7d80b43..36aa16874ed5 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi
@@ -39,6 +39,7 @@
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
 		gpio = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;
+		startup-delay-us = <5000>;
 		vin-supply = <&dc_12v>;
 	};
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi
index 1df326259635..3a162414c0aa 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi
@@ -57,7 +57,8 @@
 		regulator-name = "vcc3v3_pcie";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpios = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;
+		gpio = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;
+		startup-delay-us = <5000>;
 		vin-supply = <&dc_12v>;
 	};
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi
index 83c67ddc85ee..911c7e2d4568 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi
@@ -27,6 +27,7 @@
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
 		gpio = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;
+		startup-delay-us = <5000>;
 		vin-supply = <&dc_12v>;
 	};
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10.dtsi
index e711e0fd960a..d3f073886121 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10.dtsi
@@ -59,7 +59,8 @@
 		regulator-name = "vcc3v3_pcie";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpios = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;
+		gpio = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;
+		startup-delay-us = <5000>;
 		vin-supply = <&dc_12v>;
 	};
 

commit 360cca1de4a4b6f52a6cdc6806db4bdcd1e465b5
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Thu Aug 19 15:52:07 2021 +0800

    media: rockchip: isp: fix sp no output when hdr dynamic switch
    
    Change-Id: Idbb35a9c40e62fbc876345aaa516a842416c1bb3
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/capture_v20.c b/drivers/media/platform/rockchip/isp/capture_v20.c
index 868a02901dcd..a1a6fb1539d2 100644
--- a/drivers/media/platform/rockchip/isp/capture_v20.c
+++ b/drivers/media/platform/rockchip/isp/capture_v20.c
@@ -576,6 +576,10 @@ static int rkisp_stream_config_dcrop(struct rkisp_stream *stream, bool async)
 		rkisp_disable_dcrop(stream, async);
 		v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
 			 "stream %d crop disabled\n", stream->id);
+		if (RKMODULE_EXTEND_LINE != 0) {
+			rkisp_write(dev, stream->config->dual_crop.h_size, src_w, false);
+			rkisp_write(dev, stream->config->dual_crop.v_size, src_h, false);
+		}
 		return 0;
 	}
 
diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c
index c4f1385cd21e..82198a861951 100644
--- a/drivers/media/platform/rockchip/isp/rkisp.c
+++ b/drivers/media/platform/rockchip/isp/rkisp.c
@@ -515,15 +515,16 @@ void rkisp_trigger_read_back(struct rkisp_device *dev, u8 dma2frm, u32 mode, boo
 	}
 
 	if (dev->isp_ver == ISP_V20 && dev->dmarx_dev.trigger == T_MANUAL && !is_try) {
-		if (dev->rd_mode != rd_mode && dev->br_dev.en) {
+		if (dev->rd_mode != rd_mode && RKMODULE_EXTEND_LINE != 0) {
 			tmp = dev->isp_sdev.in_crop.height;
 			val = rkisp_read(dev, CIF_DUAL_CROP_CTRL, false);
 			if (rd_mode == HDR_RDBK_FRAME1) {
-				val |= CIF_DUAL_CROP_MP_MODE_YUV;
+				val |= CIF_DUAL_CROP_MP_MODE_YUV | CIF_DUAL_CROP_SP_MODE_YUV;
 				tmp += RKMODULE_EXTEND_LINE;
 			} else {
-				val &= ~CIF_DUAL_CROP_MP_MODE_YUV;
+				val &= ~(CIF_DUAL_CROP_MP_MODE_YUV | CIF_DUAL_CROP_SP_MODE_YUV);
 			}
+			val |= CIF_DUAL_CROP_CFG_UPD;
 			rkisp_write(dev, CIF_DUAL_CROP_CTRL, val, false);
 			rkisp_write(dev, CIF_ISP_ACQ_V_SIZE, tmp, false);
 			rkisp_write(dev, CIF_ISP_OUT_V_SIZE, tmp, false);

commit d0eadda7668b9797042a2d61063a232406236bb4
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Wed Aug 18 18:28:41 2021 +0800

    media: rockchip: isp: off unused interrupt of csi
    
    Change-Id: Iecbd33f2f48dc73fc34af8ee90738db031ee2ffe
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/csi.c b/drivers/media/platform/rockchip/isp/csi.c
index 3b21c63d3b16..102086663edc 100644
--- a/drivers/media/platform/rockchip/isp/csi.c
+++ b/drivers/media/platform/rockchip/isp/csi.c
@@ -338,8 +338,7 @@ static int csi_config(struct rkisp_csi_device *csi)
 		rkisp_write(dev, CSI2RX_MASK_OVERFLOW, val, true);
 		val = RAW0_WR_FRAME | RAW1_WR_FRAME | RAW2_WR_FRAME |
 			MIPI_DROP_FRM | RAW_WR_SIZE_ERR | MIPI_LINECNT |
-			RAW_RD_SIZE_ERR | MIPI_FRAME_ST_VC(0xf) |
-			MIPI_FRAME_END_VC(0xf) | RAW0_Y_STATE |
+			RAW_RD_SIZE_ERR | RAW0_Y_STATE |
 			RAW1_Y_STATE | RAW2_Y_STATE;
 		rkisp_write(dev, CSI2RX_MASK_STAT, val, true);
 

commit a577b34708736dda0790caf92cad1793ccab81f7
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Wed Aug 18 18:41:17 2021 +0800

    media: rockchip: ispp: off unused interrupt
    
    Change-Id: I72a7d6b494a5bfc9a7b265d6b8a31beb233addac
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/ispp/hw.c b/drivers/media/platform/rockchip/ispp/hw.c
index 06262702b205..9d755cc88c38 100644
--- a/drivers/media/platform/rockchip/ispp/hw.c
+++ b/drivers/media/platform/rockchip/ispp/hw.c
@@ -61,7 +61,11 @@ void rkispp_soft_reset(struct rkispp_hw_dev *hw)
 	writel(OTHER_FORCE_UPD, hw->base_addr + RKISPP_CTRL_UPDATE);
 	writel(GATE_DIS_ALL, hw->base_addr + RKISPP_CTRL_CLKGATE);
 	writel(SW_FEC2DDR_DIS, hw->base_addr + RKISPP_FEC_CORE_CTRL);
-	writel(0x6ffffff, hw->base_addr + RKISPP_CTRL_INT_MSK);
+	writel(NR_LOST_ERR | TNR_LOST_ERR | FBCH_EMPTY_NR |
+		FBCH_EMPTY_TNR | FBCD_DEC_ERR_NR | FBCD_DEC_ERR_TNR |
+		BUS_ERR_NR | BUS_ERR_TNR | SCL2_INT | SCL1_INT |
+		SCL0_INT | FEC_INT | ORB_INT | SHP_INT | NR_INT | TNR_INT,
+		hw->base_addr + RKISPP_CTRL_INT_MSK);
 	writel(GATE_DIS_NR, hw->base_addr + RKISPP_CTRL_CLKGATE);
 }
 

commit 9436928e3f2af3534398968e066655766999fc35
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Thu Aug 19 15:40:57 2021 +0800

    Revert "ANDROID: GKI: add ARCH_NR_GPIO for ABI match"
    
    This reverts commit f7853bfd2257b144bdea937cc2b540f0f3a7b97d.
    
    Get codes from include/asm-generic/gpio.h
    * #ifndef ARCH_NR_GPIOS
    * #if defined(CONFIG_ARCH_NR_GPIO) && CONFIG_ARCH_NR_GPIO > 0
    * #define ARCH_NR_GPIOS CONFIG_ARCH_NR_GPIO
    * #else
    * #define ARCH_NR_GPIOS         512
    * #endif
    * #endif
    
    So the default value is 512 after this revert.
    
    Change-Id: I93e89f5b3ddb6bfdd1f2ec285e053234124b44f9
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index 2d4df07fbfe5..2be75002f0db 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -772,18 +772,6 @@ config HOTPLUG_CPU
 	  Say Y here to experiment with turning CPUs off and on.  CPUs
 	  can be controlled through /sys/devices/system/cpu.
 
-# The GPIO number here must be sorted by descending number. In case of
-# a multiplatform kernel, we just want the highest value required by the
-# selected platforms.
-config ARCH_NR_GPIO
-	int "Number of GPIOs in the system"
-	default 1280 if ARCH_QCOM
-	default 256
-	help
-	  Maximum number of GPIOs in the system.
-
-	  If unsure, leave the default value.
-
 # Common NUMA Features
 config NUMA
 	bool "Numa Memory Allocation and Scheduler Support"

commit a11227325372000eec0b89bd415ad5febf2cc8ce
Author: Yandong Lin <yandong.lin@rock-chips.com>
Date:   Fri Aug 6 15:43:29 2021 +0800

    video: rockchip: mpp: fix hw hang issue
    
    When the CPU is busy, there may be a situation:
    1. After the software timeout task of the current task is mounted
    2. Than the thread is cut away for too long, and the hardware is
       not configured at this time,
    3. The software timeout is triggered to go to reset and poweroff.
    4. The thread switches back to configure the hardware
    5. The hardware is stuck.
    
    Solution:
    In the software timeout processing function, judge whether the hardware
    at this time has been configured to start.
    
    Signed-off-by: Yandong Lin <yandong.lin@rock-chips.com>
    Change-Id: I00c0794bb2f27690ab8a2341b3bee2d3f942adf8

diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c
index 1e78ce91fd2d..101497223bd0 100644
--- a/drivers/video/rockchip/mpp/mpp_common.c
+++ b/drivers/video/rockchip/mpp/mpp_common.c
@@ -452,8 +452,10 @@ static void mpp_task_timeout_work(struct work_struct *work_s)
 					     struct mpp_task,
 					     timeout_work);
 
-	if (test_and_set_bit(TASK_STATE_HANDLE, &task->state)) {
-		mpp_err("task has been handled\n");
+	if (!test_bit(TASK_STATE_START, &task->state)) {
+		mpp_err("task has not start\n");
+		schedule_delayed_work(&task->timeout_work,
+					msecs_to_jiffies(MPP_WORK_TIMEOUT_DELAY));
 		return;
 	}
 
@@ -470,6 +472,13 @@ static void mpp_task_timeout_work(struct work_struct *work_s)
 	}
 	mpp = session->mpp;
 
+	synchronize_hardirq(mpp->irq);
+
+	if (test_and_set_bit(TASK_STATE_HANDLE, &task->state)) {
+		mpp_err("task has been handled\n");
+		return;
+	}
+
 	/* hardware maybe dead, reset it */
 	mpp_reset_up_read(mpp->reset_group);
 	mpp_dev_reset(mpp);
@@ -674,11 +683,11 @@ static int mpp_task_run(struct mpp_dev *mpp,
 	 */
 	mpp_reset_down_read(mpp->reset_group);
 
-	set_bit(TASK_STATE_START, &task->state);
 	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);
 
 	mpp_debug_leave();
 

commit 6ecd6c18bc9a8c2f9443290e6dd56fa49baea31a
Author: Yu Qiaowei <cerf.yu@rock-chips.com>
Date:   Wed Aug 18 16:34:13 2021 +0800

    video/rockchip: rga2: Change the way to alloc memory in rga slt mode.
    
    1. Fix compile error when debugfs is disable.
    2. Using get_page to alloc memory can save 1250KB(64-bit)/625KB(32-bit)
       of memory in the data segment.
    
    ./scripts/bloat-o-meter -c drivers/video/rockchip/rga2/rga2_drv.o.old
    drivers/video/rockchip/rga2/rga2_drv.o
    add/remove: 1/0 grow/shrink: 1/1 up/down: 396/-104 (292)
    Function                                     old     new   delta
    rga2_slt                                     864    1124    +260
    rga2_service_session_clear.constprop           -     136    +136
    rga2_release                                 292     188    -104
    Total: Before=18736, After=19028, chg +1.56%
    add/remove: 1/3 grow/shrink: 0/0 up/down: 8/-1280008 (-1280000)
    Data                                         old     new   delta
    __addressable_rga2_init2808                    -       8      +8
    __addressable_rga2_init2895                    8       -      -8
    src_buf                                   640000       - -640000
    dst_buf                                   640000       - -640000
    Total: Before=1282092, After=2092, chg -99.84%
    add/remove: 0/0 grow/shrink: 1/0 up/down: 9/0 (9)
    RO Data                                      old     new   delta
    __func__                                      57      66      +9
    Total: Before=1537, After=1546, chg +0.59%
    
    Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
    Change-Id: I21c36a268c86b75da7b9e8da5eaf4f1f698c9737

diff --git a/drivers/video/rockchip/rga2/rga2_drv.c b/drivers/video/rockchip/rga2/rga2_drv.c
index 394c495c93ff..593415965d62 100644
--- a/drivers/video/rockchip/rga2/rga2_drv.c
+++ b/drivers/video/rockchip/rga2/rga2_drv.c
@@ -485,6 +485,7 @@ int rga2_scale_check(struct rga2_req *req)
 	INFO("rga2 scale check over.\n");
 	return 0;
 }
+#endif
 
 static void rga2_printf_cmd_buf(u32 *cmd_buf)
 {
@@ -514,8 +515,6 @@ static void rga2_printf_cmd_buf(u32 *cmd_buf)
 	     dst_aw, dst_ah, dst_stride, dst_format);
 }
 
-#endif
-
 static bool is_yuv422p_format(u32 format)
 {
 	bool ret = false;
@@ -711,10 +710,11 @@ static int rga2_flush(rga2_session *session, unsigned long arg)
 {
 	int ret = 0;
 	int ret_timeout;
+
+#if RGA2_DEBUGFS
 	ktime_t start = ktime_set(0, 0);
 	ktime_t end = ktime_set(0, 0);
 
-#if RGA2_DEBUGFS
 	if (RGA2_TEST_TIME)
 		start = ktime_get();
 #endif
@@ -1166,7 +1166,6 @@ static int rga2_get_img_info(rga_img_info_t *img,
 	u32 vir_w, vir_h;
 	int yrgb_addr = -1;
 	int ret = 0;
-	void *vaddr;
 
 	rga_dev = rga2_drvdata->dev;
 	yrgb_addr = (int)img->yrgb_addr;
@@ -1190,7 +1189,7 @@ static int rga2_get_img_info(rga_img_info_t *img,
 		}
 #if RGA2_DEBUGFS
 	if (RGA2_CHECK_MODE) {
-		vaddr = dma_buf_vmap(dma_buf);
+		void *vaddr = dma_buf_vmap(dma_buf);
 		if (vaddr)
 			rga2_memory_check(vaddr, img->vir_w, img->vir_h,
 					  img->format, img->yrgb_addr);
@@ -2446,200 +2445,99 @@ static void rga2_debugfs_add(void)
 		debugfs_remove_recursive(rga2_debug_root);
 	}
 }
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 0))
+
 void rga2_slt(void)
 {
-	struct rga2_req req;
-	rga2_session session;
-	void *src_vir, *dst_vir;
-	unsigned int *src, *dst;
-	ion_phys_addr_t src_phy, dst_phy;
 	int i;
+	int src_size, dst_size, src_order, dst_order;
+	int err_count = 0, right_count = 0;
+	int task_running;
 	unsigned int srcW, srcH, dstW, dstH;
-	struct ion_handle *src_handle;
-	struct ion_handle *dst_handle;
-	struct rga2_drvdata_t *data;
-	unsigned int srclen, dstlen;
-	int err_count = 0;
-	int right_count = 0;
-	int size;
-	unsigned int *pstd;
-	unsigned int *pnow;
-
-	data = rga2_drvdata;
-	srcW = 1280;
-	srcH = 720;
-	dstW = 1280;
-	dstH = 720;
-	src_handle = ion_alloc(data->ion_client, (size_t)srcW * srcH * 4, 0,
-		   ION_HEAP(ION_CMA_HEAP_ID), 0);
-
-	dst_handle = ion_alloc(data->ion_client, (size_t)dstW * dstH * 4, 0,
-		   ION_HEAP(ION_CMA_HEAP_ID), 0);
-
-	session.pid	= current->pid;
-	INIT_LIST_HEAD(&session.waiting);
-	INIT_LIST_HEAD(&session.running);
-	INIT_LIST_HEAD(&session.list_session);
-	init_waitqueue_head(&session.wait);
-	/* no need to protect */
-	list_add_tail(&session.list_session, &rga2_service.session);
-	atomic_set(&session.task_running, 0);
-	atomic_set(&session.num_done, 0);
-
-	src_vir = ion_map_kernel(data->ion_client, src_handle);
-	dst_vir = ion_map_kernel(data->ion_client, dst_handle);
-
-	ion_phys(rga2_drvdata->ion_client, src_handle, &src_phy, &srclen);
-	ion_phys(rga2_drvdata->ion_client, dst_handle, &dst_phy, &dstlen);
-
-	memset(&req, 0, sizeof(struct rga2_req));
-	src = (unsigned int *)src_vir;
-	dst = (unsigned int *)dst_vir;
-
-	memset(src_vir, 0x80, srcW * srcH * 4);
-
-	INFO("\n********************************\n");
-	INFO("************ RGA_TEST ************\n");
-	INFO("********************************\n\n");
-
-	req.src.act_w = srcW;
-	req.src.act_h = srcH;
-
-	req.src.vir_w = srcW;
-	req.src.vir_h = srcW;
-	req.src.yrgb_addr = 0;
-	req.src.uv_addr = src_phy;
-	req.src.v_addr = src_phy + srcH * srcW;
-	req.src.format = RGA2_FORMAT_RGBA_8888;
-
-	req.dst.act_w = dstW;
-	req.dst.act_h = dstH;
-
-	req.dst.vir_w = dstW;
-	req.dst.vir_h = dstH;
-	req.dst.x_offset = 0;
-	req.dst.y_offset = 0;
-
-	req.dst.yrgb_addr = 0;
-	req.dst.uv_addr = dst_phy;
-	req.dst.v_addr = dst_phy + dstH * dstW;
-
-	req.dst.format = RGA2_FORMAT_RGBA_8888;
-
-	rga2_blit_sync(&session, &req);
-
-	size = dstW * dstH * 4;
-	pstd = (unsigned int *)src_vir;
-	pnow = (unsigned int *)dst_vir;
-
-	INFO("[  num   : srcInfo    dstInfo ]\n");
-	for (i = 0; i < size / 4; i++) {
-		if (*pstd != *pnow) {
-			INFO("[X%.8d : 0x%x 0x%x]", i, *pstd, *pnow);
-			if (i % 4 == 0)
-				INFO("\n");
-			err_count++;
-		} else {
-			if (i % (640 * 1024) == 0)
-				INFO("[Y%.8d : 0x%.8x 0x%.8x]\n",
-				     i, *pstd, *pnow);
-			right_count++;
-		}
-		pstd++;
-		pnow++;
-		if (err_count > 64)
-			break;
-	}
-
-	INFO("err_count=%d, right_count=%d\n", err_count, right_count);
-	if (err_count != 0)
-		INFO("rga slt err !!\n");
-	else
-		INFO("rga slt success !!\n");
-
-	ion_unmap_kernel(data->ion_client, src_handle);
-	ion_unmap_kernel(data->ion_client, dst_handle);
-
-	ion_free(data->ion_client, src_handle);
-	ion_free(data->ion_client, dst_handle);
-}
-#else
-unsigned long src_buf[400 * 200];
-unsigned long dst_buf[400 * 200];
-void rga2_slt(void)
-{
+	unsigned int *pstd, *pnow;
+	unsigned long *src_vir, *dst_vir;
 	struct rga2_req req;
 	rga2_session session;
-	unsigned long *src_vir, *dst_vir;
-	int i;
-	unsigned int srcW, srcH, dstW, dstH;
-	int err_count = 0;
-	int right_count = 0;
-	int size;
-	unsigned int *pstd;
-	unsigned int *pnow;
 
 	srcW = 400;
 	srcH = 200;
 	dstW = 400;
 	dstH = 200;
 
-	session.pid	= current->pid;
+	src_size = srcW * srcH * 4;
+	dst_size = dstW * dstH * 4;
+
+	src_order = get_order(src_size);
+	src_vir = (unsigned long *)__get_free_pages(GFP_KERNEL | GFP_DMA32, src_order);
+	if (src_vir == NULL) {
+		ERR("%s[%d], can not alloc pages for src, order = %d\n",
+		    __func__, __LINE__, src_order);
+		return;
+	}
+
+	dst_order = get_order(dst_size);
+	dst_vir = (unsigned long *)__get_free_pages(GFP_KERNEL | GFP_DMA32, dst_order);
+	if (dst_vir == NULL) {
+		ERR("%s[%d], can not alloc pages for dst, order = %d\n",
+		    __func__, __LINE__, dst_order);
+		return;
+	}
+
+	/* Init session */
+	session.pid = current->pid;
+
 	INIT_LIST_HEAD(&session.waiting);
 	INIT_LIST_HEAD(&session.running);
 	INIT_LIST_HEAD(&session.list_session);
 	init_waitqueue_head(&session.wait);
-	/* no need to protect */
+	mutex_lock(&rga2_service.lock);
 	list_add_tail(&session.list_session, &rga2_service.session);
+	mutex_unlock(&rga2_service.lock);
 	atomic_set(&session.task_running, 0);
 	atomic_set(&session.num_done, 0);
 
-	memset(&req, 0, sizeof(struct rga2_req));
-	src_vir = src_buf;
-	dst_vir = dst_buf;
-
-	memset(src_buf, 0x50, 400 * 200 * 4);
-	memset(dst_buf, 0x00, 400 * 200 * 4);
+	INFO("**********************************\n");
+	INFO("************ RGA_TEST ************\n");
+	INFO("**********************************\n");
 
-	rga2_dma_flush_range(&src_buf[0], &src_buf[400 * 200]);
-	rga2_dma_flush_range(&dst_buf[0], &dst_buf[400 * 200]);
+	memset(src_vir, 0x50, src_size);
+	memset(dst_vir, 0x50, dst_size);
 
-	INFO("\n********************************\n");
-	INFO("************ RGA_TEST ************\n");
-	INFO("********************************\n\n");
+	rga2_dma_flush_range(src_vir, src_vir + src_size);
+	rga2_dma_flush_range(dst_vir, dst_vir + dst_size);
 
+	memset(&req, 0, sizeof(struct rga2_req));
+	req.src.x_offset = 0;
+	req.src.y_offset = 0;
 	req.src.act_w = srcW;
 	req.src.act_h = srcH;
-
 	req.src.vir_w = srcW;
 	req.src.vir_h = srcW;
+	req.src.format = RGA2_FORMAT_RGBA_8888;
+
 	req.src.yrgb_addr = 0;
 	req.src.uv_addr = (unsigned long)virt_to_phys(src_vir);
 	req.src.v_addr = req.src.uv_addr + srcH * srcW;
-	req.src.format = RGA2_FORMAT_RGBA_8888;
 
+	req.dst.x_offset = 0;
+	req.dst.y_offset = 0;
 	req.dst.act_w = dstW;
 	req.dst.act_h = dstH;
-
 	req.dst.vir_w = dstW;
 	req.dst.vir_h = dstH;
-	req.dst.x_offset = 0;
-	req.dst.y_offset = 0;
+	req.dst.format = RGA2_FORMAT_RGBA_8888;
 
 	req.dst.yrgb_addr = 0;
 	req.dst.uv_addr = (unsigned long)virt_to_phys(dst_vir);
 	req.dst.v_addr = req.dst.uv_addr + dstH * dstW;
 
-	req.dst.format = RGA2_FORMAT_RGBA_8888;
 	rga2_blit_sync(&session, &req);
 
-	size = dstW * dstH * 4;
+	/* Check buffer */
 	pstd = (unsigned int *)src_vir;
 	pnow = (unsigned int *)dst_vir;
 
 	INFO("[  num   : srcInfo    dstInfo ]\n");
-	for (i = 0; i < size / 4; i++) {
+	for (i = 0; i < dst_size / 4; i++) {
 		if (*pstd != *pnow) {
 			INFO("[X%.8d : 0x%x 0x%x]", i, *pstd, *pnow);
 			if (i % 4 == 0)
@@ -2662,9 +2560,24 @@ void rga2_slt(void)
 		INFO("rga slt err !!\n");
 	else
 		INFO("rga slt success !!\n");
+
+	/* Deinit session */
+	task_running = atomic_read(&session.task_running);
+	if (task_running) {
+		pr_err("%s[%d], session %d still has %d task running when closing\n",
+		       __func__, __LINE__, session.pid, task_running);
+		msleep(100);
+	}
+	wake_up(&session.wait);
+	mutex_lock(&rga2_service.lock);
+	list_del(&session.list_session);
+	rga2_service_session_clear(&session);
+	mutex_unlock(&rga2_service.lock);
+
+	free_pages((unsigned long)src_vir, src_order);
+	free_pages((unsigned long)dst_vir, dst_order);
 }
 #endif
-#endif
 
 void rga2_test_0(void);
 

commit dd0cb993becca72c8bcb71764b7aba167e971488
Author: Elaine Zhang <zhangqing@rock-chips.com>
Date:   Tue Aug 17 17:36:31 2021 +0800

    clk: rockchip: optimize static memory consume
    
    ./scripts/bloat-o-meter clk-pll_old.o clk-pll.o
    add/remove: 3/36 grow/shrink: 3/3 up/down: 1832/-7395 (-5563)
    Function                                     old     new   delta
    rockchip_pll_clk_set_by_auto.constprop         -     908    +908
    rockchip_rk3066_pll_clk_set_by_auto.constprop       -     508    +508
    rockchip_rk3036_pll_init                     236     416    +180
    rockchip_rk3036_pll_set_rate                  80     228    +148
    rockchip_rk3036_pll_get_params                 -      72     +72
    rockchip_rk3036_pll_recalc_rate              336     352     +16
    clk_boost_list                                 4       -      -4
    __initcall_boost_debug_init7                   4       -      -4
    clk_boost_lock                                20       -     -20
    boost_summary_open                            20       -     -20
    boost_config_open                             20       -     -20
    rockchip_rk3399_pll_is_enabled                24       -     -24
    rockchip_rk3399_pll_disable                   24       -     -24
    rockchip_rk3066_pll_is_enabled                24       -     -24
    rockchip_rk3066_pll_disable                   24       -     -24
    rockchip_rk3399_pll_enable                    32       -     -32
    rockchip_rk3066_pll_enable                    32       -     -32
    rockchip_rk3036_pll_set_params               376     344     -32
    rockchip_boost_disable_recovery_sw            64       -     -64
    boost_config_show                             76       -     -76
    rockchip_rk3399_pll_clk_ops                  104       -    -104
    rockchip_rk3399_pll_clk_norate_ops           104       -    -104
    rockchip_rk3066_pll_clk_ops                  104       -    -104
    rockchip_rk3066_pll_clk_norate_ops           104       -    -104
    rockchip_rk3399_pll_set_rate                 108       -    -108
    rockchip_rk3399_pll_wait_lock                116       -    -116
    rockchip_rk3066_pll_set_rate                 120       -    -120
    rockchip_boost_add_core_div                  120       -    -120
    rockchip_clk_register_pll                   1124    1000    -124
    rockchip_boost_enable_recovery_sw_low        144       -    -144
    rockchip_rk3066_pll_init                     156       -    -156
    boost_summary_fops                           160       -    -160
    boost_config_fops                            160       -    -160
    rockchip_rk3066_pll_recalc_rate              172       -    -172
    rockchip_pll_wait_lock                       236       -    -236
    rockchip_rk3399_pll_init                     240       -    -240
    rockchip_pll_con_to_rate                     252       -    -252
    __func__                                     404     141    -263
    rockchip_rk3399_pll_recalc_rate              288       -    -288
    boost_debug_init                             316       -    -316
    rockchip_rk3399_pll_set_params               392       -    -392
    boost_summary_show                           404       -    -404
    rockchip_rk3066_pll_set_params               436       -    -436
    rockchip_boost_init                          864       -    -864
    rockchip_get_pll_settings                   1508       -   -1508
    Total: Before=10678, After=5115, chg -52.10%
    
    ./scripts/bloat-o-meter clk-cpu_old.o clk-cpu.o
    add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-72 (-72)
    Function                                     old     new   delta
    rockchip_cpuclk_notifier_cb                 1716    1700     -16
    rockchip_clk_register_cpuclk                 728     672     -56
    Total: Before=2694, After=2622, chg -2.67%
    
    ./scripts/bloat-o-meter clk-ddr_old.o clk-ddr.o
    add/remove: 0/9 grow/shrink: 0/1 up/down: 0/-780 (-780)
    Function                                     old     new   delta
    ddr_clk_cached                                 4       -      -4
    rockchip_clk_register_ddrclk                 352     312     -40
    rockchip_ddrclk_scpi_recalc_rate              44       -     -44
    rockchip_ddrclk_scpi_round_rate               48       -     -48
    rockchip_ddrclk_scpi_set_rate                 96       -     -96
    rockchip_ddrclk_sip_ops                      104       -    -104
    rockchip_ddrclk_scpi_ops                     104       -    -104
    rockchip_ddrclk_sip_round_rate               108       -    -108
    rockchip_ddrclk_sip_recalc_rate              112       -    -112
    rockchip_ddrclk_sip_set_rate                 120       -    -120
    Total: Before=1761, After=981, chg -44.29%
    
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    Change-Id: I469229b9566af1cab6cc3a6bb9f4f8e308e0eded

diff --git a/drivers/clk/rockchip/Kconfig b/drivers/clk/rockchip/Kconfig
index 4f6663c05066..2322c3f04238 100644
--- a/drivers/clk/rockchip/Kconfig
+++ b/drivers/clk/rockchip/Kconfig
@@ -1,8 +1,49 @@
 # SPDX-License-Identifier: GPL-2.0
+# common clock support for ROCKCHIP SoC family.
 
+config COMMON_CLK_ROCKCHIP
+	tristate "Rockchip clock controller common support"
+	depends on ARCH_ROCKCHIP
+	default ARCH_ROCKCHIP
+	help
+	  Say y here to enable common clock controller for Rockchip platforms.
+
+if COMMON_CLK_ROCKCHIP
 config ROCKCHIP_CLK_COMPENSATION
 	bool "Rockchip Clk Compensation"
 	help
 	  Say y here to enable clk compensation(+/- 1000 ppm).
 
+config ROCKCHIP_CLK_BOOST
+	bool "Rockchip Clk Boost"
+	default y if CPU_PX30
+	help
+	  Say y here to enable clk boost.
+
+config ROCKCHIP_DDRCLK_SCPI
+	bool "Rockchip DDR Clk SCPI"
+	default y if RK3368_SCPI_PROTOCOL
+	help
+	  Say y here to enable ddr clk scpi.
+
+config ROCKCHIP_DDRCLK_SIP
+	bool "Rockchip DDR Clk SIP"
+	default y if CPU_RK3399
+	help
+	  Say y here to enable ddr clk sip.
+
+config ROCKCHIP_PLL_RK3066
+	bool "Rockchip PLL Type RK3066"
+	default y if CPU_RK30XX || CPU_RK3188 || \
+		CPU_RK3288 || CPU_RK3368
+	help
+	  Say y here to enable pll type is rk3066.
+
+config ROCKCHIP_PLL_RK3399
+	bool "Rockchip PLL Type RK3399"
+	default y if CPU_RK3399 || CPU_RV110X
+	help
+	  Say y here to enable pll type is rk3399.
+endif
+
 source "drivers/clk/rockchip/regmap/Kconfig"
diff --git a/drivers/clk/rockchip/clk-cpu.c b/drivers/clk/rockchip/clk-cpu.c
index 12ff25a6db27..81f35c0d624d 100644
--- a/drivers/clk/rockchip/clk-cpu.c
+++ b/drivers/clk/rockchip/clk-cpu.c
@@ -174,7 +174,8 @@ static int rockchip_cpuclk_pre_rate_change(struct rockchip_cpuclk *cpuclk,
 		return -EINVAL;
 	}
 
-	rockchip_boost_enable_recovery_sw_low(cpuclk->pll_hw);
+	if (IS_ENABLED(CONFIG_ROCKCHIP_CLK_BOOST))
+		rockchip_boost_enable_recovery_sw_low(cpuclk->pll_hw);
 
 	alt_prate = clk_get_rate(cpuclk->alt_parent);
 
@@ -205,7 +206,8 @@ static int rockchip_cpuclk_pre_rate_change(struct rockchip_cpuclk *cpuclk,
 		}
 	}
 
-	rockchip_boost_add_core_div(cpuclk->pll_hw, alt_prate);
+	if (IS_ENABLED(CONFIG_ROCKCHIP_CLK_BOOST))
+		rockchip_boost_add_core_div(cpuclk->pll_hw, alt_prate);
 
 	/* select alternate parent */
 	writel(HIWORD_UPDATE(reg_data->mux_core_alt,
@@ -257,7 +259,8 @@ static int rockchip_cpuclk_post_rate_change(struct rockchip_cpuclk *cpuclk,
 	if (ndata->old_rate > ndata->new_rate)
 		rockchip_cpuclk_set_dividers(cpuclk, rate);
 
-	rockchip_boost_disable_recovery_sw(cpuclk->pll_hw);
+	if (IS_ENABLED(CONFIG_ROCKCHIP_CLK_BOOST))
+		rockchip_boost_disable_recovery_sw(cpuclk->pll_hw);
 
 	spin_unlock_irqrestore(cpuclk->lock, flags);
 	return 0;
@@ -324,7 +327,7 @@ struct clk *rockchip_clk_register_cpuclk(const char *name,
 	cpuclk->reg_data = reg_data;
 	cpuclk->clk_nb.notifier_call = rockchip_cpuclk_notifier_cb;
 	cpuclk->hw.init = &init;
-	if (reg_data->pll_name) {
+	if (IS_ENABLED(CONFIG_ROCKCHIP_CLK_BOOST) && reg_data->pll_name) {
 		pll_clk = __clk_lookup(reg_data->pll_name);
 		if (!pll_clk) {
 			pr_err("%s: could not lookup pll clock: (%s)\n",
diff --git a/drivers/clk/rockchip/clk-ddr.c b/drivers/clk/rockchip/clk-ddr.c
index 99deefa488a0..33d22e3fa124 100644
--- a/drivers/clk/rockchip/clk-ddr.c
+++ b/drivers/clk/rockchip/clk-ddr.c
@@ -338,12 +338,16 @@ rockchip_clk_register_ddrclk(const char *name, int flags,
 	init.flags |= CLK_SET_RATE_NO_REPARENT;
 
 	switch (ddr_flag) {
+#ifdef CONFIG_ROCKCHIP_DDRCLK_SIP
 	case ROCKCHIP_DDRCLK_SIP:
 		init.ops = &rockchip_ddrclk_sip_ops;
 		break;
+#endif
+#ifdef CONFIG_ROCKCHIP_DDRCLK_SCPI
 	case ROCKCHIP_DDRCLK_SCPI:
 		init.ops = &rockchip_ddrclk_scpi_ops;
 		break;
+#endif
 	case ROCKCHIP_DDRCLK_SIP_V2:
 		init.ops = &rockchip_ddrclk_sip_ops_v2;
 		break;
diff --git a/drivers/clk/rockchip/clk-pll.c b/drivers/clk/rockchip/clk-pll.c
index 96c3a4811ed9..19b0b7c6ff0d 100644
--- a/drivers/clk/rockchip/clk-pll.c
+++ b/drivers/clk/rockchip/clk-pll.c
@@ -56,12 +56,14 @@ struct rockchip_clk_pll {
 
 	struct rockchip_clk_provider *ctx;
 
+#ifdef CONFIG_ROCKCHIP_CLK_BOOST
 	bool			boost_enabled;
 	u32			boost_backup_pll_usage;
 	unsigned long		boost_backup_pll_rate;
 	unsigned long		boost_low_rate;
 	unsigned long		boost_high_rate;
 	struct regmap		*boost;
+#endif
 #ifdef CONFIG_DEBUG_FS
 	struct hlist_node	debug_node;
 #endif
@@ -71,7 +73,15 @@ struct rockchip_clk_pll {
 #define to_rockchip_clk_pll_nb(nb) \
 			container_of(nb, struct rockchip_clk_pll, clk_nb)
 
+#ifdef CONFIG_ROCKCHIP_CLK_BOOST
 static void rockchip_boost_disable_low(struct rockchip_clk_pll *pll);
+#ifdef CONFIG_DEBUG_FS
+static HLIST_HEAD(clk_boost_list);
+static DEFINE_MUTEX(clk_boost_lock);
+#endif
+#else
+static inline void rockchip_boost_disable_low(struct rockchip_clk_pll *pll) {}
+#endif
 
 #define MHZ			(1000UL * 1000UL)
 #define KHZ			(1000UL)
@@ -95,10 +105,6 @@ static void rockchip_boost_disable_low(struct rockchip_clk_pll *pll);
 #define MAX_FOUTVCO_FREQ	(2000 * MHZ)
 
 static struct rockchip_pll_rate_table auto_table;
-#ifdef CONFIG_DEBUG_FS
-static HLIST_HEAD(clk_boost_list);
-static DEFINE_MUTEX(clk_boost_lock);
-#endif
 
 int rockchip_pll_clk_adaptive_scaling(struct clk *clk, int sel)
 {
@@ -420,7 +426,7 @@ static int rockchip_rk3036_pll_wait_lock(struct rockchip_clk_pll *pll)
 	return ret;
 }
 
-static unsigned long
+static unsigned long __maybe_unused
 rockchip_rk3036_pll_con_to_rate(struct rockchip_clk_pll *pll,
 				u32 con0, u32 con1)
 {
@@ -542,7 +548,8 @@ static int rockchip_rk3036_pll_set_params(struct rockchip_clk_pll *pll,
 	pllcon |= rate->frac << RK3036_PLLCON2_FRAC_SHIFT;
 	writel_relaxed(pllcon, pll->reg_base + RK3036_PLLCON(2));
 
-	rockchip_boost_disable_low(pll);
+	if (IS_ENABLED(CONFIG_ROCKCHIP_CLK_BOOST))
+		rockchip_boost_disable_low(pll);
 
 	/* wait for the pll to lock */
 	ret = rockchip_rk3036_pll_wait_lock(pll);
@@ -1365,18 +1372,22 @@ struct clk *rockchip_clk_register_pll(struct rockchip_clk_provider *ctx,
 		else
 			init.ops = &rockchip_rk3036_pll_clk_ops;
 		break;
+#ifdef CONFIG_ROCKCHIP_PLL_RK3066
 	case pll_rk3066:
 		if (!pll->rate_table || IS_ERR(ctx->grf))
 			init.ops = &rockchip_rk3066_pll_clk_norate_ops;
 		else
 			init.ops = &rockchip_rk3066_pll_clk_ops;
 		break;
+#endif
+#ifdef CONFIG_ROCKCHIP_PLL_RK3399
 	case pll_rk3399:
 		if (!pll->rate_table)
 			init.ops = &rockchip_rk3399_pll_clk_norate_ops;
 		else
 			init.ops = &rockchip_rk3399_pll_clk_ops;
 		break;
+#endif
 	default:
 		pr_warn("%s: Unknown pll type for pll clk %s\n",
 			__func__, name);
@@ -1408,6 +1419,7 @@ struct clk *rockchip_clk_register_pll(struct rockchip_clk_provider *ctx,
 	return mux_clk;
 }
 
+#ifdef CONFIG_ROCKCHIP_CLK_BOOST
 static unsigned long rockchip_pll_con_to_rate(struct rockchip_clk_pll *pll,
 					      u32 con0, u32 con1)
 {
@@ -1717,4 +1729,5 @@ static int __init boost_debug_init(void)
 	return 0;
 }
 late_initcall(boost_debug_init);
-#endif
+#endif /* CONFIG_DEBUG_FS */
+#endif /* CONFIG_ROCKCHIP_CLK_BOOST */

commit b914f22e177942109d3fcc30cf053db5dfaccf99
Author: Xiao Ya peng <yp.xiao@rock-chips.com>
Date:   Mon Aug 16 10:43:19 2021 +0800

    arm64: configs: rk3568_nvr.config: enabled CONFIG_HZ_100.
    
    disabled CONFIG_HIGH_RES_TIMERS
    
    Signed-off-by: Xiao Ya peng <yp.xiao@rock-chips.com>
    Change-Id: I8fcfa9880d1988536888081b2fccc2e3c58431ed

diff --git a/arch/arm64/configs/rk3568_nvr.config b/arch/arm64/configs/rk3568_nvr.config
index d9edbc265233..a8bcaca9f3c5 100644
--- a/arch/arm64/configs/rk3568_nvr.config
+++ b/arch/arm64/configs/rk3568_nvr.config
@@ -1,13 +1,6 @@
 # CONFIG_DRM_FBDEV_EMULATION is not set
-CONFIG_MALI_BIFROST=y
+# CONFIG_HIGH_RES_TIMERS is not set
+CONFIG_HZ=100
+CONFIG_HZ_100=y
+# CONFIG_HZ_300 is not set
 # CONFIG_MALI_MIDGARD is not set
-# CONFIG_MALI_ARBITER_SUPPORT is not set
-CONFIG_MALI_BIFROST_DEVFREQ=y
-# CONFIG_MALI_BIFROST_DMA_FENCE is not set
-# CONFIG_MALI_BIFROST_ENABLE_TRACE is not set
-# CONFIG_MALI_BIFROST_EXPERT is not set
-# CONFIG_MALI_BIFROST_GATOR_SUPPORT is not set
-# CONFIG_MALI_DMA_BUF_LEGACY_COMPAT is not set
-# CONFIG_MALI_DMA_BUF_MAP_ON_DEMAND is not set
-# CONFIG_MALI_GEM5_BUILD is not set
-CONFIG_MALI_PLATFORM_NAME="rk"

commit 8d535fdb818b783fc30f58226b24ecd1a913b4a2
Author: Elaine Zhang <zhangqing@rock-chips.com>
Date:   Tue Aug 17 17:11:20 2021 +0800

    thermal: rockchip: optimize static memory consume
    
    $ ./scripts/bloat-o-meter rockchip_thermal_olg.o rockchip_thermal.o
    add/remove: 0/32 grow/shrink: 1/1 up/down: 500/-6844 (-6344)
    Function                                     old     new   delta
    rk_tsadcv2_get_temp                           20     520    +500
    temp_last                                      4       -      -4
    prob_last                                      4       -      -4
    bounding_cnt                                   4       -      -4
    rk_tsadcv2_irq_ack                            16       -     -16
    rk_tsadcv3_control                            24       -     -24
    rk_tsadcv2_tshut_mode                         44       -     -44
    rk_tsadcv2_initialize                         48       -     -48
    rk_tsadcv5_initialize                         68       -     -68
    rk_tsadcv4_initialize                         68       -     -68
    rv1108_tsadc_data                             84       -     -84
    rk3568_tsadc_data                             84       -     -84
    rk3399_tsadc_data                             84       -     -84
    rk3368_tsadc_data                             84       -     -84
    rk3366_tsadc_data                             84       -     -84
    rk3328_tsadc_data                             84       -     -84
    rk3308_tsadc_data                             84       -     -84
    rk3288_tsadc_data                             84       -     -84
    rk3228_tsadc_data                             84       -     -84
    rk1808_tsadc_data                             84       -     -84
    px30_tsadc_data                               84       -     -84
    rk_tsadcv7_initialize                        180       -    -180
    rk_tsadcv3_initialize                        208       -    -208
    rk_tsadcv3_get_temp                          244       -    -244
    rk3328_code_table                            280       -    -280
    rv1108_table                                 288       -    -288
    rk3568_code_table                            288       -    -288
    rk3399_code_table                            288       -    -288
    rk3368_code_table                            288       -    -288
    rk3288_code_table                            288       -    -288
    rk3228_code_table                            288       -    -288
    rk1808_code_table                            288       -    -288
    rk_tsadcv2_code_to_temp                      556       -    -556
    of_rockchip_thermal_match                   2548     392   -2156
    Total: Before=12093, After=5749, chg -52.46%
    
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    Change-Id: I506a6135907942abcb60684f9f0888a238950421

diff --git a/drivers/thermal/rockchip_thermal.c b/drivers/thermal/rockchip_thermal.c
index c4ade4b381b2..782261ce0098 100644
--- a/drivers/thermal/rockchip_thermal.c
+++ b/drivers/thermal/rockchip_thermal.c
@@ -1454,53 +1454,77 @@ static const struct rockchip_tsadc_chip rk3568_tsadc_data = {
 };
 
 static const struct of_device_id of_rockchip_thermal_match[] = {
+#ifdef CONFIG_CPU_RV110X
 	{
 		.compatible = "rockchip,rv1108-tsadc",
 		.data = (void *)&rv1108_tsadc_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RV1126
 	{
 		.compatible = "rockchip,rv1126-tsadc",
 		.data = (void *)&rv1126_tsadc_data,
 	},
+#endif
+#ifdef CONFIG_CPU_PX30
 	{	.compatible = "rockchip,px30-tsadc",
 		.data = (void *)&px30_tsadc_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RK1808
 	{
 		.compatible = "rockchip,rk1808-tsadc",
 		.data = (void *)&rk1808_tsadc_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RK322X
 	{
 		.compatible = "rockchip,rk3228-tsadc",
 		.data = (void *)&rk3228_tsadc_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3288
 	{
 		.compatible = "rockchip,rk3288-tsadc",
 		.data = (void *)&rk3288_tsadc_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3308
 	{
 		.compatible = "rockchip,rk3308-tsadc",
 		.data = (void *)&rk3308_tsadc_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3328
 	{
 		.compatible = "rockchip,rk3328-tsadc",
 		.data = (void *)&rk3328_tsadc_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3366
 	{
 		.compatible = "rockchip,rk3366-tsadc",
 		.data = (void *)&rk3366_tsadc_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3368
 	{
 		.compatible = "rockchip,rk3368-tsadc",
 		.data = (void *)&rk3368_tsadc_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3399
 	{
 		.compatible = "rockchip,rk3399-tsadc",
 		.data = (void *)&rk3399_tsadc_data,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3568
 	{
 		.compatible = "rockchip,rk3568-tsadc",
 		.data = (void *)&rk3568_tsadc_data,
 	},
+#endif
 	{ /* end */ },
 };
 MODULE_DEVICE_TABLE(of, of_rockchip_thermal_match);

commit 289a92b87e48c07a4f112095177a00a7951bb91c
Author: Liang Chen <cl@rock-chips.com>
Date:   Tue Aug 17 20:38:51 2021 +0800

    cpufreq: rockchip: do not select CONFIG_CPUFREQ_DT_PLATDEV for cpufreq-dt
    
    cpufreq-dt-platdev.c is useless on rockchip platform, remove it and save
    memory.
    
    $ ./scripts/bloat-o-meter vmlinux_before vmlinux
    add/remove: 0/4 grow/shrink: 0/0 up/down: 0/-18284 (-18284)
    Function                                     old     new   delta
    __initcall_cpufreq_dt_platdev_init6            4       -      -4
    cpufreq_dt_platdev_init                      248       -    -248
    blacklist                                   8232       -   -8232
    whitelist                                   9800       -   -9800
    Total: Before=10211366, After=10193082, chg -0.18%
    
    Change-Id: Ibcc15aa3a8b13afa208c77979b75c617aeaef5fb
    Signed-off-by: Liang Chen <cl@rock-chips.com>

diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
index bf8690dd0b0a..e9f486b3f1a3 100644
--- a/drivers/cpufreq/Kconfig
+++ b/drivers/cpufreq/Kconfig
@@ -246,7 +246,7 @@ config CPUFREQ_DT
 	depends on HAVE_CLK && OF
 	# if CPU_THERMAL is on and THERMAL=m, CPUFREQ_DT cannot be =y:
 	depends on !CPU_THERMAL || THERMAL
-	select CPUFREQ_DT_PLATDEV
+	select CPUFREQ_DT_PLATDEV if !ARM_ROCKCHIP_CPUFREQ
 	select PM_OPP
 	help
 	  This adds a generic DT based cpufreq driver for frequency management.

commit 745d67d98ac6d4c109c700ef2f7bd149254e3481
Author: Liang Chen <cl@rock-chips.com>
Date:   Tue Aug 17 14:17:36 2021 +0800

    cpufreq: rockchip: optimize static memory consume
    
    $ ./scripts/bloat-o-meter drivers/cpufreq/rockchip-cpufreq.o.before drivers/cpufreq/rockchip-cpufreq.o
    add/remove: 0/3 grow/shrink: 0/1 up/down: 0/-2196 (-2196)
    Function                                     old     new   delta
    px30_get_soc_info                            208       -    -208
    rk3399_get_soc_info                          360       -    -360
    rk3288_get_soc_info                          648       -    -648
    rockchip_cpufreq_of_match                   1568     588    -980
    Total: Before=5053, After=2857, chg -43.46%
    
    Change-Id: I7db697bf92ee552b6e3b28211ee64e509e99b0d3
    Signed-off-by: Liang Chen <cl@rock-chips.com>

diff --git a/drivers/cpufreq/rockchip-cpufreq.c b/drivers/cpufreq/rockchip-cpufreq.c
index 173da325ce6d..0a0a44941d29 100644
--- a/drivers/cpufreq/rockchip-cpufreq.c
+++ b/drivers/cpufreq/rockchip-cpufreq.c
@@ -55,8 +55,9 @@ struct cluster_info {
 };
 static LIST_HEAD(cluster_info_list);
 
-static int px30_get_soc_info(struct device *dev, struct device_node *np,
-			     int *bin, int *process)
+static __maybe_unused int px30_get_soc_info(struct device *dev,
+					    struct device_node *np,
+					    int *bin, int *process)
 {
 	int ret = 0;
 	u8 value = 0;
@@ -79,8 +80,9 @@ static int px30_get_soc_info(struct device *dev, struct device_node *np,
 	return ret;
 }
 
-static int rk3288_get_soc_info(struct device *dev, struct device_node *np,
-			       int *bin, int *process)
+static __maybe_unused int rk3288_get_soc_info(struct device *dev,
+					      struct device_node *np,
+					      int *bin, int *process)
 {
 	int ret = 0;
 	u8 value = 0;
@@ -139,8 +141,9 @@ static int rk3288_get_soc_info(struct device *dev, struct device_node *np,
 	return ret;
 }
 
-static int rk3399_get_soc_info(struct device *dev, struct device_node *np,
-			       int *bin, int *process)
+static __maybe_unused int rk3399_get_soc_info(struct device *dev,
+					      struct device_node *np,
+					      int *bin, int *process)
 {
 	int ret = 0;
 	u8 value = 0;
@@ -188,8 +191,9 @@ static int rk3399_get_soc_info(struct device *dev, struct device_node *np,
 	return ret;
 }
 
-static int rv1126_get_soc_info(struct device *dev, struct device_node *np,
-			       int *bin, int *process)
+static __maybe_unused int rv1126_get_soc_info(struct device *dev,
+					      struct device_node *np,
+					      int *bin, int *process)
 {
 	int ret = 0;
 	u8 value = 0;
@@ -212,10 +216,13 @@ static int rv1126_get_soc_info(struct device *dev, struct device_node *np,
 }
 
 static const struct of_device_id rockchip_cpufreq_of_match[] = {
+#ifdef CONFIG_CPU_PX30
 	{
 		.compatible = "rockchip,px30",
 		.data = (void *)&px30_get_soc_info,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3288
 	{
 		.compatible = "rockchip,rk3288",
 		.data = (void *)&rk3288_get_soc_info,
@@ -224,14 +231,20 @@ static const struct of_device_id rockchip_cpufreq_of_match[] = {
 		.compatible = "rockchip,rk3288w",
 		.data = (void *)&rk3288_get_soc_info,
 	},
+#endif
+#ifdef CONFIG_CPU_PX30
 	{
 		.compatible = "rockchip,rk3326",
 		.data = (void *)&px30_get_soc_info,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3399
 	{
 		.compatible = "rockchip,rk3399",
 		.data = (void *)&rk3399_get_soc_info,
 	},
+#endif
+#ifdef CONFIG_CPU_RV1126
 	{
 		.compatible = "rockchip,rv1109",
 		.data = (void *)&rv1126_get_soc_info,
@@ -240,6 +253,7 @@ static const struct of_device_id rockchip_cpufreq_of_match[] = {
 		.compatible = "rockchip,rv1126",
 		.data = (void *)&rv1126_get_soc_info,
 	},
+#endif
 	{},
 };
 

commit 1cbabbe2f12dc3de743de0b4c3ef871e3beaade4
Author: Herman Chen <herman.chen@rock-chips.com>
Date:   Thu Aug 5 08:51:46 2021 +0800

    arm64: dts: rockchip: rk3568: rkvdec enable link mode
    
    Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
    Change-Id: Iecec544986ef0a5bccddef58a2d1e1cedfff69fd

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index 1f26350482de..edb3c240fbaa 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -1479,7 +1479,8 @@
 
 	rkvdec: rkvdec@fdf80200 {
 		compatible = "rockchip,rkv-decoder-rk3568", "rockchip,rkv-decoder-v2";
-		reg = <0x0 0xfdf80200 0x0 0x400>;
+		reg = <0x0 0xfdf80200 0x0 0x400>, <0x0 0xfdf80100 0x0 0x100>;
+		reg-names = "regs", "link";
 		interrupts = <GIC_SPI 91 IRQ_TYPE_LEVEL_HIGH>;
 		interrupt-names = "irq_dec";
 		clocks = <&cru ACLK_RKVDEC>, <&cru HCLK_RKVDEC>,
@@ -1509,6 +1510,7 @@
 		/* rcb_iova: start and size */
 		rockchip,rcb-iova = <0x10000000 65536>;
 		rockchip,rcb-min-width = <512>;
+		rockchip,task-capacity = <16>;
 		status = "disabled";
 	};
 

commit de603806f0d468fdc1970a1171b5d9ea4f3fb912
Author: Herman Chen <herman.chen@rock-chips.com>
Date:   Thu Aug 5 19:00:36 2021 +0800

    video: rockchip: mpp: rkvdec2: Add link mode flow
    
    rkvdec2 link mode use a new serialized work flow.
    
    This process is for link mode decoder in RK356x.
    The new flow run async with hardware and use multiple trigger event to
    run the work thread. All task operation, power operation and reset
    operation are serialzed in one thread with certain order.
    This is mainly for runtime debug and it will simplify the system design.
    
    rkvdec2 link mode use two sets of counters to control the hardware io:
    1. write / read task for preparing link mode task to ddr.
    2. send / recv task for sending / receiving task from hardware.
    
    All the operations are serialized in single work thread. So only a few
    of lock and atomic is required.
    
    The decoded counter and total counter are the synchronization method
    between driver and hardware.
    
    NOTE:
    1. link mode reset should use sip_reset.
    2. link mode should not change hardware frequency or power off when
    there is still task running.
    3. link mode should not access hardware when there is an error happen.
    4. link mode should reserve a stuff task for H.264 decode task.
    
    Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
    Change-Id: I7736d54a64225089cd6d1b6522f660ce4481d437

diff --git a/drivers/video/rockchip/mpp/Makefile b/drivers/video/rockchip/mpp/Makefile
index 6766da8eed94..4e5d59e88766 100644
--- a/drivers/video/rockchip/mpp/Makefile
+++ b/drivers/video/rockchip/mpp/Makefile
@@ -12,7 +12,7 @@ rk_vcodec-objs := mpp_service.o mpp_common.o mpp_iommu.o
 CFLAGS_mpp_service.o += -DMPP_VERSION="\"$(MPP_REVISION)\""
 
 rk_vcodec-$(CONFIG_ROCKCHIP_MPP_RKVDEC) += mpp_rkvdec.o
-rk_vcodec-$(CONFIG_ROCKCHIP_MPP_RKVDEC2) += mpp_rkvdec2.o
+rk_vcodec-$(CONFIG_ROCKCHIP_MPP_RKVDEC2) += mpp_rkvdec2.o mpp_rkvdec2_link.o
 rk_vcodec-$(CONFIG_ROCKCHIP_MPP_RKVENC) += mpp_rkvenc.o
 rk_vcodec-$(CONFIG_ROCKCHIP_MPP_VDPU1)  += mpp_vdpu1.o
 rk_vcodec-$(CONFIG_ROCKCHIP_MPP_VEPU1)  += mpp_vepu1.o
diff --git a/drivers/video/rockchip/mpp/hack/mpp_rkvdec2_link_hack_rk3568.c b/drivers/video/rockchip/mpp/hack/mpp_rkvdec2_link_hack_rk3568.c
new file mode 100644
index 000000000000..900b63a57673
--- /dev/null
+++ b/drivers/video/rockchip/mpp/hack/mpp_rkvdec2_link_hack_rk3568.c
@@ -0,0 +1,213 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co., Ltd
+ *
+ * author:
+ *	Herman Chen <herman.chen@rock-chips.com>
+ */
+
+#define FIX_RK3568_BUF_SIZE		(2 * PAGE_SIZE)
+#define RKDEC_HACK_DATA_RPS_OFFSET	(128 * 1)
+#define RKDEC_HACK_DATA_PPS_OFFSET	(128 * 2)
+#define RKDEC_HACK_DATA_RLC_OFFSET	(128 * 3)
+#define RKDEC_HACK_DATA_OUT_OFFSET	(128 * 4)
+#define RKDEC_HACK_DATA_COLMV_OFFSET	(128 * 5)
+
+static u32 rkvdec2_3568_hack_link[] = {
+	0x00000000, /* 0x0020 */
+	0x00000001, /* 0x0024 */
+	0x00000001, /* 0x0028 */
+	0x00000072, /* 0x002c */
+	0x00000182, /* 0x0030 */
+	0x01040201, /* 0x0034 */
+	0x00000000, /* 0x0038 */
+	0x00000001, /* 0x003c */
+	0x00000030, /* 0x0040 */
+	0x00003fff, /* 0x0044 */
+	0x00000001, /* 0x0048 */
+	0x00000001, /* 0x004c */
+	0x00000010, /* 0x0050 */
+	0x00000006, /* 0x0054 */
+	0x00000000, /* 0x0058 */
+	0x00000000, /* 0x005c */
+	0xffffdfff, /* 0x0060 */
+	0x3ffbfbff, /* 0x0064 */
+	0x800fffff, /* 0x0068 */
+	0x00000000, /* 0x006C */
+
+	0x00000000, /* 0x0100 */
+	0x00000000, /* 0x0104 */
+	0x00000000, /* 0x0108 */
+	0x00000000, /* 0x010c */
+	0x00000000, /* 0x0110 */
+	0x00000000, /* 0x0114 */
+	0x00000000, /* 0x0118 */
+	0x00000000, /* 0x011c */
+	0x00000000, /* 0x0120 */
+	0x00000000, /* 0x0124 */
+	0x00000000, /* 0x0128 */
+	0x00000000, /* 0x012c */
+	0x00000000, /* 0x0130 */
+	0x00000000, /* 0x0134 */
+	0x00000000, /* 0x0138 */
+	0x00000000, /* 0x013c */
+	0x00000000, /* 0x0140 */
+	0x00000000, /* 0x0144 */
+	0x00000000, /* 0x0148 */
+	0x00000000, /* 0x014c */
+	0x00000000, /* 0x0150 */
+	0x00000000, /* 0x0154 */
+	0x00000000, /* 0x0158 */
+	0x00000000, /* 0x015c */
+	0x00000000, /* 0x0160 */
+	0x00000000, /* 0x0164 */
+	0x00000000, /* 0x0168 */
+	0x00000000, /* 0x016c */
+	0x00000000, /* 0x0170 */
+	0x00000000, /* 0x0174 */
+	0x00000000, /* 0x0178 */
+	0x00000000, /* 0x017c */
+	0x00000000, /* 0x0180 */
+	0x00000000, /* 0x0184 */
+	0x00000000, /* 0x0188 */
+	0x00000000, /* 0x018c */
+	0x00000000, /* 0x0190 */
+	0x00000000, /* 0x0194 */
+	0x00000000, /* 0x0198 */
+	0x00000000, /* 0x019c */
+	0x00000000, /* 0x01a0 */
+	0x00000000, /* 0x01a4 */
+	0x00000000, /* 0x01a8 */
+	0x00000000, /* 0x01ac */
+	0x00000000, /* 0x01b0 */
+	0x00000000, /* 0x01b4 */
+	0x00000000, /* 0x01b8 */
+	0x00000000, /* 0x01bc */
+	0x00000000, /* 0x01c0 */
+	0x00000000, /* 0x01c4 */
+	0x00000000, /* 0x01c8 */
+	0x00000000, /* 0x01cc */
+
+	0x00000000, /* 0x0200 */
+	0x00000000, /* 0x0204 */
+	0x00000000, /* 0x0208 */
+	0x00000000, /* 0x020c */
+	0x00000000, /* 0x0210 */
+	0x100001c0, /* 0x0214 */
+	0x100001c0, /* 0x0218 */
+	0x100001c0, /* 0x021c */
+	0x100001c0, /* 0x0220 */
+	0x10000340, /* 0x0224 */
+	0x10000340, /* 0x0228 */
+	0x10000000, /* 0x022c */
+	0x10000000, /* 0x0230 */
+	0x10000000, /* 0x0234 */
+	0x10000000, /* 0x0238 */
+	0x10000000, /* 0x023c */
+
+	0x00000000, /* 0x0280 */
+	0x00000000, /* 0x0284 */
+	0x00000000, /* 0x0288 */
+	0x00000000, /* 0x028c */
+	0x00000000, /* 0x0290 */
+	0x00000000, /* 0x0294 */
+	0x00000000, /* 0x0298 */
+	0x00000000, /* 0x029c */
+	0x00000000, /* 0x02a0 */
+	0x00000000, /* 0x02a4 */
+	0x00000000, /* 0x02a8 */
+	0x00000000, /* 0x02ac */
+	0x00000000, /* 0x02b0 */
+	0x00000000, /* 0x02b4 */
+	0x00000000, /* 0x02b8 */
+	0x00000000, /* 0x02bc */
+	0x00000000, /* 0x02c0 */
+	0x00000000, /* 0x02c4 */
+	0x00000000, /* 0x02c8 */
+	0x00000000, /* 0x02cc */
+	0x00000000, /* 0x02d0 */
+	0x00000000, /* 0x02d4 */
+	0x00000000, /* 0x02d8 */
+	0x00000000, /* 0x02dc */
+	0x00000000, /* 0x02e0 */
+	0x00000000, /* 0x02e4 */
+	0x00000000, /* 0x02e8 */
+	0x00000000, /* 0x02ec */
+	0x00000000, /* 0x02f0 */
+	0x00000000, /* 0x02f4 */
+	0x00000000, /* 0x02f8 */
+	0x00000000, /* 0x02fc */
+	0x00000000, /* 0x0300 */
+	0x00000000, /* 0x0304 */
+	0x00000000, /* 0x0308 */
+	0x00000000, /* 0x030c */
+	0x00000000, /* 0x0310 */
+	0x00000000, /* 0x0314 */
+	0x00000000, /* 0x0318 */
+	0x00000000, /* 0x031c */
+
+	0x00000000, /* 0x0380 */
+	0x00000000, /* 0x0384 */
+	0x00000000, /* 0x0388 */
+	0x00000000, /* 0x038c */
+	0x00000000, /* 0x0390 */
+	0x00000000, /* 0x0394 */
+	0x00000000, /* 0x0398 */
+	0x00000000, /* 0x039c */
+	0x00000000, /* 0x03a0 */
+	0x00000000, /* 0x03a4 */
+	0x00000000, /* 0x03a8 */
+	0x00000000, /* 0x03ac */
+	0x00000000, /* 0x03b0 */
+	0x00000000, /* 0x03b4 */
+	0x00000000, /* 0x03b8 */
+	0x00000000, /* 0x03bc */
+
+	0x00000000, /* 0x0400 */
+	0x00000000, /* 0x0404 */
+	0x00000000, /* 0x0408 */
+	0x00000000, /* 0x040c */
+	0x00000000, /* 0x0410 */
+	0x00000000, /* 0x0414 */
+	0x00000000, /* 0x0418 */
+	0x00000000, /* 0x041c */
+	0x00000000, /* 0x0420 */
+	0x00000000, /* 0x0424 */
+	0x00000000, /* 0x0428 */
+	0x00000000, /* 0x042c */
+	0x00000000, /* 0x0430 */
+	0x00000000, /* 0x0434 */
+	0x00000000, /* 0x0438 */
+	0x00000000, /* 0x043c */
+};
+
+void rkvdec2_3568_hack_fix_link(void *buf)
+{
+	memcpy(buf, rkvdec2_3568_hack_link, sizeof(rkvdec2_3568_hack_link));
+}
+
+void rkvdec2_link_hack_data_setup(struct mpp_dma_buffer *fix)
+{
+	u32 iova = fix->iova;
+	u32 i;
+
+	/* input stream */
+	rkvdec2_3568_hack_link[72] = iova;
+	/* error info */
+	rkvdec2_3568_hack_link[73] = iova + RKDEC_HACK_DATA_RLC_OFFSET;
+	/* output frame */
+	rkvdec2_3568_hack_link[74] = iova + RKDEC_HACK_DATA_OUT_OFFSET;
+	/* colmv out */
+	rkvdec2_3568_hack_link[75] = iova + 128 * 6;
+	/* error ref */
+	rkvdec2_3568_hack_link[76] = iova + 128 * 4;
+
+	/* rps in */
+	rkvdec2_3568_hack_link[89] = iova + RKDEC_HACK_DATA_PPS_OFFSET;
+	/* pps in */
+	rkvdec2_3568_hack_link[91] = iova + RKDEC_HACK_DATA_RPS_OFFSET;
+	for (i = 0; i < 33; i++)
+		rkvdec2_3568_hack_link[92 + i] = iova + RKDEC_HACK_DATA_COLMV_OFFSET;
+
+	rkvdec2_3568_hack_link[125] = iova + PAGE_SIZE;
+}
diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c
index 343e71a0442e..1e78ce91fd2d 100644
--- a/drivers/video/rockchip/mpp/mpp_common.c
+++ b/drivers/video/rockchip/mpp/mpp_common.c
@@ -348,7 +348,7 @@ static void mpp_session_detach_workqueue(struct mpp_session *session)
 	mutex_lock(&queue->session_lock);
 	list_del_init(&session->session_link);
 	list_add_tail(&session->session_link, &queue->session_detach);
-	atomic_inc(&queue->detach_count);
+	queue->detach_count++;
 	mutex_unlock(&queue->session_lock);
 
 	mpp_taskqueue_trigger_work(session->mpp);
@@ -732,21 +732,20 @@ static void mpp_task_try_run(struct kthread_work *work_s)
 	}
 
 done:
-	if (atomic_read(&queue->detach_count)) {
+	mutex_lock(&queue->session_lock);
+	if (queue->detach_count) {
 		struct mpp_session *session = NULL, *n;
 
 		mpp_dbg_session("%s detach count %d\n", dev_name(mpp->dev),
-				atomic_read(&queue->detach_count));
+				queue->detach_count);
 
-		mutex_lock(&queue->session_lock);
 		list_for_each_entry_safe(session, n, &queue->session_detach,
 					 session_link) {
 			if (!mpp_session_deinit(session))
-				atomic_dec(&queue->detach_count);
+				queue->detach_count--;
 		}
-
-		mutex_unlock(&queue->session_lock);
 	}
+	mutex_unlock(&queue->session_lock);
 }
 
 static int mpp_wait_result_default(struct mpp_session *session,
@@ -935,7 +934,6 @@ struct mpp_taskqueue *mpp_taskqueue_init(struct device *dev)
 	INIT_LIST_HEAD(&queue->mmu_list);
 	INIT_LIST_HEAD(&queue->dev_list);
 
-	atomic_set(&queue->detach_count, 0);
 	/* default taskqueue has max 16 task capacity */
 	queue->task_capacity = MPP_MAX_TASK_CAPACITY;
 
@@ -1640,6 +1638,7 @@ int mpp_task_init(struct mpp_session *session,
 	INIT_LIST_HEAD(&task->pending_link);
 	INIT_LIST_HEAD(&task->queue_link);
 	INIT_LIST_HEAD(&task->mem_region_list);
+	task->state = 0;
 	task->mem_count = 0;
 	task->session = session;
 
@@ -1814,11 +1813,17 @@ int mpp_dev_probe(struct mpp_dev *mpp,
 	/* read link table capacity */
 	ret = of_property_read_u32(np, "rockchip,task-capacity",
 				   &mpp->task_capacity);
-	if (ret)
+	if (ret) {
 		mpp->task_capacity = 1;
-	else
+
+		/* power domain autosuspend delay 2s */
+		pm_runtime_set_autosuspend_delay(dev, 2000);
+		pm_runtime_use_autosuspend(dev);
+	} else {
 		dev_info(dev, "%d task capacity link mode detected\n",
 			 mpp->task_capacity);
+		/* do not setup autosuspend on multi task device */
+	}
 
 	kthread_init_work(&mpp->work, mpp->dev_ops->task_worker ?
 			  mpp->dev_ops->task_worker : mpp_task_try_run);
@@ -1829,9 +1834,6 @@ int mpp_dev_probe(struct mpp_dev *mpp,
 	atomic_set(&mpp->task_index, 0);
 
 	device_init_wakeup(dev, true);
-	/* power domain autosuspend delay 2s */
-	pm_runtime_set_autosuspend_delay(dev, 2000);
-	pm_runtime_use_autosuspend(dev);
 	pm_runtime_enable(dev);
 
 	mpp->irq = platform_get_irq(pdev, 0);
diff --git a/drivers/video/rockchip/mpp/mpp_common.h b/drivers/video/rockchip/mpp/mpp_common.h
index 75c78c9e340e..317aefa363d6 100644
--- a/drivers/video/rockchip/mpp/mpp_common.h
+++ b/drivers/video/rockchip/mpp/mpp_common.h
@@ -424,7 +424,7 @@ struct mpp_taskqueue {
 	struct list_head session_attach;
 	/* link to session session_link for detached sessions */
 	struct list_head session_detach;
-	atomic_t detach_count;
+	u32 detach_count;
 
 	/* lock for pending list */
 	struct mutex pending_lock;
diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2.c b/drivers/video/rockchip/mpp/mpp_rkvdec2.c
index da37976fa9db..a3857847e698 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvdec2.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec2.c
@@ -7,191 +7,13 @@
  *	Ding Wei, leo.ding@rock-chips.com
  *
  */
-#include <asm/cacheflush.h>
-#include <linux/clk.h>
-#include <linux/delay.h>
-#include <linux/devfreq.h>
-#include <linux/devfreq_cooling.h>
-#include <linux/dma-iommu.h>
-#include <linux/gfp.h>
-#include <linux/interrupt.h>
-#include <linux/iopoll.h>
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/of_platform.h>
-#include <linux/of_address.h>
-#include <linux/slab.h>
-#include <linux/uaccess.h>
-#include <linux/regmap.h>
-#include <linux/kernel.h>
-#include <linux/thermal.h>
-#include <linux/notifier.h>
-#include <linux/proc_fs.h>
-#include <linux/nospec.h>
-#include <linux/rockchip/rockchip_sip.h>
-#include <linux/regulator/consumer.h>
-
-#include <soc/rockchip/pm_domains.h>
-#include <soc/rockchip/rockchip_sip.h>
-
 #include "mpp_debug.h"
 #include "mpp_common.h"
 #include "mpp_iommu.h"
-#include "hack/mpp_rkvdec2_hack_rk3568.c"
-
-#define RKVDEC_DRIVER_NAME		"mpp_rkvdec2"
-
-#define	RKVDEC_SESSION_MAX_BUFFERS	40
-/* The maximum registers number of all the version */
-#define RKVDEC_REG_NUM			278
-#define RKVDEC_REG_HW_ID_INDEX		0
-#define RKVDEC_REG_START_INDEX		0
-#define RKVDEC_REG_END_INDEX		277
-
-#define REVDEC_GET_PROD_NUM(x)		(((x) >> 16) & 0xffff)
-#define RKVDEC_REG_FORMAT_INDEX		9
-#define RKVDEC_GET_FORMAT(x)		((x) & 0x3ff)
-
-#define RKVDEC_REG_START_EN_BASE       0x28
-
-#define RKVDEC_REG_START_EN_INDEX      10
-
-#define RKVDEC_START_EN			BIT(0)
-
-#define RKVDEC_REG_YSTRIDE_INDEX	20
-
-#define RKVDEC_REG_RLC_BASE		0x200
-#define RKVDEC_REG_RLC_BASE_INDEX	(128)
-
-#define RKVDEC_REG_INT_EN		0x380
-#define RKVDEC_REG_INT_EN_INDEX		(224)
-#define RKVDEC_SOFT_RESET_READY		BIT(9)
-#define RKVDEC_CABAC_END_STA		BIT(8)
-#define RKVDEC_COLMV_REF_ERR_STA	BIT(7)
-#define RKVDEC_BUF_EMPTY_STA		BIT(6)
-#define RKVDEC_TIMEOUT_STA		BIT(5)
-#define RKVDEC_ERROR_STA		BIT(4)
-#define RKVDEC_BUS_STA			BIT(3)
-#define RKVDEC_READY_STA		BIT(2)
-#define RKVDEC_IRQ_RAW			BIT(1)
-#define RKVDEC_IRQ			BIT(0)
-#define RKVDEC_INT_ERROR_MASK		(RKVDEC_COLMV_REF_ERR_STA |\
-					RKVDEC_BUF_EMPTY_STA |\
-					RKVDEC_TIMEOUT_STA |\
-					RKVDEC_ERROR_STA)
-
-/* perf sel reference register */
-#define RKVDEC_PERF_SEL_OFFSET		0x20000
-#define RKVDEC_PERF_SEL_NUM		64
-#define RKVDEC_PERF_SEL_BASE		0x424
-#define RKVDEC_SEL_VAL0_BASE		0x428
-#define RKVDEC_SEL_VAL1_BASE		0x42c
-#define RKVDEC_SEL_VAL2_BASE		0x430
-#define RKVDEC_SET_PERF_SEL(a, b, c)	((a) | ((b) << 8) | ((c) << 16))
-
-/* cache reference register */
-#define RKVDEC_REG_CACHE0_SIZE_BASE	0x51c
-#define RKVDEC_REG_CACHE1_SIZE_BASE	0x55c
-#define RKVDEC_REG_CACHE2_SIZE_BASE	0x59c
-#define RKVDEC_REG_CLR_CACHE0_BASE	0x510
-#define RKVDEC_REG_CLR_CACHE1_BASE	0x550
-#define RKVDEC_REG_CLR_CACHE2_BASE	0x590
-
-#define RKVDEC_CACHE_PERMIT_CACHEABLE_ACCESS	BIT(0)
-#define RKVDEC_CACHE_PERMIT_READ_ALLOCATE	BIT(1)
-#define RKVDEC_CACHE_LINE_SIZE_64_BYTES		BIT(4)
-
-#define RKVDEC_FORMAT_H264 0X1
-
-#define to_rkvdec2_task(task)		\
-		container_of(task, struct rkvdec2_task, mpp_task)
-#define to_rkvdec2_dev(dev)		\
-		container_of(dev, struct rkvdec2_dev, mpp)
-
-enum RKVDEC_FMT {
-	RKVDEC_FMT_H265D	= 0,
-	RKVDEC_FMT_H264D	= 1,
-	RKVDEC_FMT_VP9D		= 2,
-	RKVDEC_FMT_AVS2		= 3,
-};
-
-#define RKVDEC_MAX_RCB_NUM		(16)
-struct rcb_info_elem {
-	u32 index;
-	u32 size;
-};
 
-struct rkvdec2_rcb_info {
-	u32 cnt;
-	struct rcb_info_elem elem[RKVDEC_MAX_RCB_NUM];
-};
+#include "mpp_rkvdec2_link.h"
 
-struct rkvdec2_task {
-	struct mpp_task mpp_task;
-
-	enum MPP_CLOCK_MODE clk_mode;
-	u32 reg[RKVDEC_REG_NUM];
-	struct reg_offset_info off_inf;
-
-	/* perf sel data back */
-	u32 reg_sel[RKVDEC_PERF_SEL_NUM];
-
-	u32 strm_addr;
-	u32 irq_status;
-	/* req for current task */
-	u32 w_req_cnt;
-	struct mpp_request w_reqs[MPP_MAX_MSG_NUM];
-	u32 r_req_cnt;
-	struct mpp_request r_reqs[MPP_MAX_MSG_NUM];
-	/* image info */
-	u32 width;
-	u32 height;
-	u32 pixels;
-	u32 need_hack;
-};
-
-struct rkvdec2_session_priv {
-	/* codec info from user */
-	struct {
-		/* show mode */
-		u32 flag;
-		/* item data */
-		u64 val;
-	} codec_info[DEC_INFO_BUTT];
-	/* rcb_info for sram */
-	struct rkvdec2_rcb_info rcb_inf;
-};
-
-struct rkvdec2_dev {
-	struct mpp_dev mpp;
-	/* sip smc reset lock */
-	struct mutex sip_reset_lock;
-
-	struct mpp_clk_info aclk_info;
-	struct mpp_clk_info hclk_info;
-	struct mpp_clk_info core_clk_info;
-	struct mpp_clk_info cabac_clk_info;
-	struct mpp_clk_info hevc_cabac_clk_info;
-	u32 default_max_load;
-#ifdef CONFIG_PROC_FS
-	struct proc_dir_entry *procfs;
-#endif
-	struct reset_control *rst_a;
-	struct reset_control *rst_h;
-	struct reset_control *rst_niu_a;
-	struct reset_control *rst_niu_h;
-	struct reset_control *rst_core;
-	struct reset_control *rst_cabac;
-	struct reset_control *rst_hevc_cabac;
-
-	/* internal rcb-memory */
-	u32 sram_size;
-	u32 rcb_size;
-	dma_addr_t rcb_iova;
-	struct page *rcb_page;
-	u32 rcb_min_width;
-	struct mpp_dma_buffer *fix;
-};
+#include "hack/mpp_rkvdec2_hack_rk3568.c"
 
 /*
  * hardware information
@@ -366,8 +188,8 @@ static int mpp_set_rcbbuf(struct mpp_dev *mpp,
 	return 0;
 }
 
-static void *rkvdec2_alloc_task(struct mpp_session *session,
-				struct mpp_task_msgs *msgs)
+void *rkvdec2_alloc_task(struct mpp_session *session,
+			 struct mpp_task_msgs *msgs)
 {
 	int ret;
 	struct mpp_task *mpp_task = NULL;
@@ -403,6 +225,8 @@ static void *rkvdec2_alloc_task(struct mpp_session *session,
 	mpp_set_rcbbuf(mpp, session, task);
 	task->strm_addr = task->reg[RKVDEC_REG_RLC_BASE_INDEX];
 	task->clk_mode = CLK_MODE_NORMAL;
+	task->slot_idx = -1;
+	init_waitqueue_head(&task->wait);
 	/* get resolution info */
 	if (session->priv) {
 		struct rkvdec2_session_priv *priv = session->priv;
@@ -442,7 +266,7 @@ static void *rkvdec2_rk3568_alloc_task(struct mpp_session *session,
 	task = to_rkvdec2_task(mpp_task);
 	fmt = RKVDEC_GET_FORMAT(task->reg[RKVDEC_REG_FORMAT_INDEX]);
 	/* workaround for rk356x, fix the hw bug of cabac/cavlc switch only in h264d */
-	task->need_hack = (fmt == RKVDEC_FORMAT_H264);
+	task->need_hack = (fmt == RKVDEC_FMT_H264D);
 
 	return mpp_task;
 }
@@ -621,9 +445,8 @@ static int rkvdec2_finish(struct mpp_dev *mpp, struct mpp_task *mpp_task)
 	return 0;
 }
 
-static int rkvdec2_result(struct mpp_dev *mpp,
-			  struct mpp_task *mpp_task,
-			  struct mpp_task_msgs *msgs)
+int rkvdec2_result(struct mpp_dev *mpp, struct mpp_task *mpp_task,
+		   struct mpp_task_msgs *msgs)
 {
 	u32 i;
 	struct mpp_request *req;
@@ -654,8 +477,7 @@ static int rkvdec2_result(struct mpp_dev *mpp,
 	return 0;
 }
 
-static int rkvdec2_free_task(struct mpp_session *session,
-			     struct mpp_task *mpp_task)
+int rkvdec2_free_task(struct mpp_session *session, struct mpp_task *mpp_task)
 {
 	struct rkvdec2_task *task = to_rkvdec2_task(mpp_task);
 
@@ -707,7 +529,7 @@ static int rkvdec2_control(struct mpp_session *session, struct mpp_request *req)
 	return 0;
 }
 
-static int rkvdec2_free_session(struct mpp_session *session)
+int rkvdec2_free_session(struct mpp_session *session)
 {
 	if (session && session->priv) {
 		kfree(session->priv);
@@ -1027,6 +849,7 @@ static struct mpp_dev_ops rkvdec_rk3568_dev_ops = {
 	.ioctl = rkvdec2_control,
 	.init_session = rkvdec2_init_session,
 	.free_session = rkvdec2_free_session,
+	.dump_dev = rkvdec_link_dump,
 };
 
 static const struct mpp_dev_var rkvdec_v2_data = {
@@ -1186,17 +1009,31 @@ static int rkvdec2_probe(struct platform_device *pdev)
 		return ret;
 	}
 
-	ret = devm_request_threaded_irq(dev, mpp->irq,
-					mpp_dev_irq, mpp_dev_isr_sched,
-					IRQF_SHARED, dev_name(dev), mpp);
+	rkvdec2_alloc_rcbbuf(pdev, dec);
+	rkvdec2_link_init(pdev, dec);
+
+	if (dec->link_dec) {
+		ret = devm_request_threaded_irq(dev, mpp->irq,
+						rkvdec2_link_irq_proc, NULL,
+						IRQF_SHARED, dev_name(dev), mpp);
+		mpp->dev_ops->process_task = rkvdec2_link_process_task;
+		mpp->dev_ops->wait_result = rkvdec2_link_wait_result;
+		mpp->dev_ops->task_worker = rkvdec2_link_worker;
+		mpp->dev_ops->deinit = rkvdec2_link_session_deinit;
+		kthread_init_work(&mpp->work, rkvdec2_link_worker);
+	} else {
+		ret = devm_request_threaded_irq(dev, mpp->irq,
+						mpp_dev_irq, mpp_dev_isr_sched,
+						IRQF_SHARED, dev_name(dev), mpp);
+	}
 	if (ret) {
 		dev_err(dev, "register interrupter runtime failed\n");
 		return -EINVAL;
 	}
 
-	rkvdec2_alloc_rcbbuf(pdev, dec);
 	mpp->session_max_buffers = RKVDEC_SESSION_MAX_BUFFERS;
 	rkvdec2_procfs_init(mpp);
+	rkvdec2_link_procfs_init(mpp);
 	dev_info(dev, "probing finish\n");
 
 	return 0;
@@ -1228,6 +1065,7 @@ static int rkvdec2_remove(struct platform_device *pdev)
 	rkvdec2_free_rcbbuf(pdev, dec);
 	mpp_dev_remove(&dec->mpp);
 	rkvdec2_procfs_remove(&dec->mpp);
+	rkvdec2_link_remove(&dec->mpp, dec->link_dec);
 
 	return 0;
 }
diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2.h b/drivers/video/rockchip/mpp/mpp_rkvdec2.h
new file mode 100644
index 000000000000..f9302cd8412e
--- /dev/null
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec2.h
@@ -0,0 +1,205 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co., Ltd
+ *
+ * author:
+ *	Herman Chen <herman.chen@rock-chips.com>
+ *
+ */
+#ifndef __ROCKCHIP_MPP_RKVDEC2_H__
+#define __ROCKCHIP_MPP_RKVDEC2_H__
+
+#include <linux/dma-iommu.h>
+#include <linux/iopoll.h>
+#include <linux/of_platform.h>
+#include <linux/of_address.h>
+#include <linux/slab.h>
+#include <linux/uaccess.h>
+#include <linux/regmap.h>
+#include <linux/kernel.h>
+#include <linux/thermal.h>
+#include <linux/notifier.h>
+#include <linux/proc_fs.h>
+#include <linux/nospec.h>
+#include <linux/rockchip/rockchip_sip.h>
+#include <linux/regulator/consumer.h>
+
+#include <soc/rockchip/pm_domains.h>
+#include <soc/rockchip/rockchip_sip.h>
+
+#include "mpp_debug.h"
+#include "mpp_common.h"
+#include "mpp_iommu.h"
+
+#define RKVDEC_DRIVER_NAME		"mpp_rkvdec2"
+
+#define	RKVDEC_SESSION_MAX_BUFFERS	40
+/* The maximum registers number of all the version */
+#define RKVDEC_REG_NUM			278
+#define RKVDEC_REG_HW_ID_INDEX		0
+#define RKVDEC_REG_START_INDEX		0
+#define RKVDEC_REG_END_INDEX		277
+
+#define REVDEC_GET_PROD_NUM(x)		(((x) >> 16) & 0xffff)
+#define RKVDEC_REG_FORMAT_INDEX		9
+#define RKVDEC_GET_FORMAT(x)		((x) & 0x3ff)
+
+#define RKVDEC_REG_START_EN_BASE       0x28
+
+#define RKVDEC_REG_START_EN_INDEX      10
+
+#define RKVDEC_START_EN			BIT(0)
+
+#define RKVDEC_REG_YSTRIDE_INDEX	20
+
+#define RKVDEC_REG_RLC_BASE		0x200
+#define RKVDEC_REG_RLC_BASE_INDEX	(128)
+
+#define RKVDEC_REG_INT_EN		0x380
+#define RKVDEC_REG_INT_EN_INDEX		(224)
+#define RKVDEC_SOFT_RESET_READY		BIT(9)
+#define RKVDEC_CABAC_END_STA		BIT(8)
+#define RKVDEC_COLMV_REF_ERR_STA	BIT(7)
+#define RKVDEC_BUF_EMPTY_STA		BIT(6)
+#define RKVDEC_TIMEOUT_STA		BIT(5)
+#define RKVDEC_ERROR_STA		BIT(4)
+#define RKVDEC_BUS_STA			BIT(3)
+#define RKVDEC_READY_STA		BIT(2)
+#define RKVDEC_IRQ_RAW			BIT(1)
+#define RKVDEC_IRQ			BIT(0)
+#define RKVDEC_INT_ERROR_MASK		(RKVDEC_COLMV_REF_ERR_STA |\
+					RKVDEC_BUF_EMPTY_STA |\
+					RKVDEC_TIMEOUT_STA |\
+					RKVDEC_ERROR_STA)
+
+/* perf sel reference register */
+#define RKVDEC_PERF_SEL_OFFSET		0x20000
+#define RKVDEC_PERF_SEL_NUM		64
+#define RKVDEC_PERF_SEL_BASE		0x424
+#define RKVDEC_SEL_VAL0_BASE		0x428
+#define RKVDEC_SEL_VAL1_BASE		0x42c
+#define RKVDEC_SEL_VAL2_BASE		0x430
+#define RKVDEC_SET_PERF_SEL(a, b, c)	((a) | ((b) << 8) | ((c) << 16))
+
+/* cache reference register */
+#define RKVDEC_REG_CACHE0_SIZE_BASE	0x51c
+#define RKVDEC_REG_CACHE1_SIZE_BASE	0x55c
+#define RKVDEC_REG_CACHE2_SIZE_BASE	0x59c
+#define RKVDEC_REG_CLR_CACHE0_BASE	0x510
+#define RKVDEC_REG_CLR_CACHE1_BASE	0x550
+#define RKVDEC_REG_CLR_CACHE2_BASE	0x590
+
+#define RKVDEC_CACHE_PERMIT_CACHEABLE_ACCESS	BIT(0)
+#define RKVDEC_CACHE_PERMIT_READ_ALLOCATE	BIT(1)
+#define RKVDEC_CACHE_LINE_SIZE_64_BYTES		BIT(4)
+
+#define to_rkvdec2_task(task)		\
+		container_of(task, struct rkvdec2_task, mpp_task)
+#define to_rkvdec2_dev(dev)		\
+		container_of(dev, struct rkvdec2_dev, mpp)
+
+enum RKVDEC_FMT {
+	RKVDEC_FMT_H265D	= 0,
+	RKVDEC_FMT_H264D	= 1,
+	RKVDEC_FMT_VP9D		= 2,
+	RKVDEC_FMT_AVS2		= 3,
+};
+
+#define RKVDEC_MAX_RCB_NUM		(16)
+
+struct rcb_info_elem {
+	u32 index;
+	u32 size;
+};
+
+struct rkvdec2_rcb_info {
+	u32 cnt;
+	struct rcb_info_elem elem[RKVDEC_MAX_RCB_NUM];
+};
+
+struct rkvdec2_task {
+	struct mpp_task mpp_task;
+
+	enum MPP_CLOCK_MODE clk_mode;
+	u32 reg[RKVDEC_REG_NUM];
+	struct reg_offset_info off_inf;
+
+	/* perf sel data back */
+	u32 reg_sel[RKVDEC_PERF_SEL_NUM];
+
+	u32 strm_addr;
+	u32 irq_status;
+	/* req for current task */
+	u32 w_req_cnt;
+	struct mpp_request w_reqs[MPP_MAX_MSG_NUM];
+	u32 r_req_cnt;
+	struct mpp_request r_reqs[MPP_MAX_MSG_NUM];
+	/* image info */
+	u32 width;
+	u32 height;
+	u32 pixels;
+
+	/* task index for link table rnunning list */
+	int slot_idx;
+	u32 need_hack;
+
+	/* event for task wait timeout or session timeout */
+	wait_queue_head_t wait;
+};
+
+struct rkvdec2_session_priv {
+	/* codec info from user */
+	struct {
+		/* show mode */
+		u32 flag;
+		/* item data */
+		u64 val;
+	} codec_info[DEC_INFO_BUTT];
+	/* rcb_info for sram */
+	struct rkvdec2_rcb_info rcb_inf;
+};
+
+struct rkvdec2_dev {
+	struct mpp_dev mpp;
+	/* sip smc reset lock */
+	struct mutex sip_reset_lock;
+
+	struct mpp_clk_info aclk_info;
+	struct mpp_clk_info hclk_info;
+	struct mpp_clk_info core_clk_info;
+	struct mpp_clk_info cabac_clk_info;
+	struct mpp_clk_info hevc_cabac_clk_info;
+	u32 default_max_load;
+#ifdef CONFIG_PROC_FS
+	struct proc_dir_entry *procfs;
+#endif
+	struct reset_control *rst_a;
+	struct reset_control *rst_h;
+	struct reset_control *rst_niu_a;
+	struct reset_control *rst_niu_h;
+	struct reset_control *rst_core;
+	struct reset_control *rst_cabac;
+	struct reset_control *rst_hevc_cabac;
+
+	/* internal rcb-memory */
+	u32 sram_size;
+	u32 rcb_size;
+	dma_addr_t rcb_iova;
+	struct page *rcb_page;
+	u32 rcb_min_width;
+
+	/* for link mode */
+	struct rkvdec_link_dev *link_dec;
+	struct mpp_dma_buffer *fix;
+};
+
+void *rkvdec2_alloc_task(struct mpp_session *session,
+			 struct mpp_task_msgs *msgs);
+int rkvdec2_free_task(struct mpp_session *session, struct mpp_task *mpp_task);
+
+int rkvdec2_free_session(struct mpp_session *session);
+
+int rkvdec2_result(struct mpp_dev *mpp, struct mpp_task *mpp_task,
+		   struct mpp_task_msgs *msgs);
+
+#endif
diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c
new file mode 100644
index 000000000000..2fab9449a601
--- /dev/null
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c
@@ -0,0 +1,1471 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co., Ltd
+ *
+ * author:
+ *	Herman Chen <herman.chen@rock-chips.com>
+ */
+
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/pm_runtime.h>
+#include <linux/slab.h>
+#include <soc/rockchip/pm_domains.h>
+#include <soc/rockchip/rockchip_dmc.h>
+
+#include "mpp_rkvdec2_link.h"
+
+#include "hack/mpp_rkvdec2_link_hack_rk3568.c"
+
+#define WAIT_TIMEOUT_MS		(500)
+
+#define RKVDEC_MAX_WRITE_PART	6
+#define RKVDEC_MAX_READ_PART	2
+
+struct rkvdec_link_part {
+	/* register offset of table buffer */
+	u32 tb_reg_off;
+	/* start idx of task register */
+	u32 reg_start;
+	/* number of task register */
+	u32 reg_num;
+};
+
+struct rkvdec_link_info {
+	dma_addr_t iova;
+	/* total register for link table buffer */
+	u32 tb_reg_num;
+	/* next link table addr in table buffer */
+	u32 tb_reg_next;
+	/* current read back addr in table buffer */
+	u32 tb_reg_r;
+	/* secondary enable in table buffer */
+	u32 tb_reg_second_en;
+	u32 part_w_num;
+	u32 part_r_num;
+
+	struct rkvdec_link_part part_w[RKVDEC_MAX_WRITE_PART];
+	struct rkvdec_link_part part_r[RKVDEC_MAX_READ_PART];
+
+	/* interrupt read back in table buffer */
+	u32 tb_reg_int;
+};
+
+static struct rkvdec_link_info rkvdec_link_v2_hw_info = {
+	.tb_reg_num = 202,
+	.tb_reg_next = 0,
+	.tb_reg_r = 1,
+	.tb_reg_second_en = 8,
+
+	.part_w_num = 6,
+	.part_r_num = 2,
+	.part_w[0] = {
+		.tb_reg_off = 4,
+		.reg_start = 8,
+		.reg_num = 20,
+	},
+	.part_w[1] = {
+		.tb_reg_off = 24,
+		.reg_start = 64,
+		.reg_num = 52,
+	},
+	.part_w[2] = {
+		.tb_reg_off = 76,
+		.reg_start = 128,
+		.reg_num = 16,
+	},
+	.part_w[3] = {
+		.tb_reg_off = 92,
+		.reg_start = 160,
+		.reg_num = 40,
+	},
+	.part_w[4] = {
+		.tb_reg_off = 132,
+		.reg_start = 224,
+		.reg_num = 16,
+	},
+	.part_w[5] = {
+		.tb_reg_off = 148,
+		.reg_start = 256,
+		.reg_num = 16,
+	},
+	.part_r[0] = {
+		.tb_reg_off = 164,
+		.reg_start = 224,
+		.reg_num = 10,
+	},
+	.part_r[1] = {
+		.tb_reg_off = 174,
+		.reg_start = 258,
+		.reg_num = 28,
+	},
+	.tb_reg_int = 164,
+};
+
+static void rkvdec_link_status_update(struct rkvdec_link_dev *dev)
+{
+	void __iomem *reg_base = dev->reg_base;
+	u32 error_ff0, error_ff1;
+	u32 enable_ff0, enable_ff1;
+	u32 loop_count = 10;
+	u32 val;
+
+	error_ff1 = (readl(reg_base + RKVDEC_LINK_DEC_NUM_BASE) &
+		    RKVDEC_LINK_BIT_DEC_ERROR) ? 1 : 0;
+	enable_ff1 = readl(reg_base + RKVDEC_LINK_EN_BASE);
+
+	dev->irq_status = readl(reg_base + RKVDEC_LINK_IRQ_BASE);
+	dev->iova_curr = readl(reg_base + RKVDEC_LINK_CFG_ADDR_BASE);
+	dev->link_mode = readl(reg_base + RKVDEC_LINK_MODE_BASE);
+	dev->total = readl(reg_base + RKVDEC_LINK_TOTAL_NUM_BASE);
+	dev->iova_next = readl(reg_base + RKVDEC_LINK_NEXT_ADDR_BASE);
+
+	do {
+		val = readl(reg_base + RKVDEC_LINK_DEC_NUM_BASE);
+		error_ff0 = (val & RKVDEC_LINK_BIT_DEC_ERROR) ? 1 : 0;
+		enable_ff0 = readl(reg_base + RKVDEC_LINK_EN_BASE);
+
+		if (error_ff0 == error_ff1 && enable_ff0 == enable_ff1)
+			break;
+
+		error_ff1 = error_ff0;
+		enable_ff1 = enable_ff0;
+	} while (--loop_count);
+
+	dev->error = error_ff0;
+	dev->decoded_status = val;
+	dev->decoded = RKVDEC_LINK_GET_DEC_NUM(val);
+	dev->enabled = enable_ff0;
+
+	if (!loop_count)
+		dev_info(dev->dev, "reach last 10 count\n");
+}
+
+static void rkvdec_link_node_dump(const char *func, struct rkvdec_link_dev *dev)
+{
+	u32 *table_base = (u32 *)dev->table->vaddr;
+	u32 reg_count = dev->link_reg_count;
+	u32 iova = (u32)dev->table->iova;
+	u32 *reg = NULL;
+	u32 i, j;
+
+	for (i = 0; i < dev->task_size; i++) {
+		reg = table_base + i * reg_count;
+
+		mpp_err("slot %d link config iova %08x:\n", i,
+			iova + i * dev->link_node_size);
+
+		for (j = 0; j < reg_count; j++) {
+			mpp_err("reg%03d 0x%08x\n", j, reg[j]);
+			udelay(100);
+		}
+	}
+}
+
+static void rkvdec_core_reg_dump(const char *func, struct rkvdec_link_dev *dev)
+{
+	struct mpp_dev *mpp = dev->mpp;
+	u32 s = mpp->var->hw_info->reg_start;
+	u32 e = mpp->var->hw_info->reg_end;
+	u32 i;
+
+	mpp_err("--- dump hardware register ---\n");
+
+	for (i = s; i <= e; i++) {
+		u32 reg = i * sizeof(u32);
+
+		mpp_err("reg[%03d]: %04x: 0x%08x\n",
+			i, reg, readl_relaxed(mpp->reg_base + reg));
+		udelay(100);
+	}
+}
+
+static void rkvdec_link_reg_dump(const char *func, struct rkvdec_link_dev *dev)
+{
+	mpp_err("dump link config status from %s\n", func);
+	mpp_err("reg 0 %08x - irq status\n", dev->irq_status);
+	mpp_err("reg 1 %08x - cfg addr\n", dev->iova_curr);
+	mpp_err("reg 2 %08x - link mode\n", dev->link_mode);
+	mpp_err("reg 4 %08x - decoded num\n", dev->decoded_status);
+	mpp_err("reg 5 %08x - total num\n", dev->total);
+	mpp_err("reg 6 %08x - link mode en\n", dev->enabled);
+	mpp_err("reg 6 %08x - next ltb addr\n", dev->iova_next);
+}
+
+static void rkvdec_link_counter(const char *func, struct rkvdec_link_dev *dev)
+{
+	mpp_err("dump link counter from %s\n", func);
+
+	mpp_err("task write %d read %d send %d recv %d run %d decoded %d total %d\n",
+		dev->task_write, dev->task_read, dev->task_send, dev->task_recv,
+		dev->task_to_run, dev->task_decoded, dev->task_total);
+}
+
+int rkvdec_link_dump(struct mpp_dev *mpp)
+{
+	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
+	struct rkvdec_link_dev *dev = dec->link_dec;
+
+	rkvdec_link_status_update(dev);
+	rkvdec_link_reg_dump(__func__, dev);
+	rkvdec_link_counter(__func__, dev);
+	rkvdec_core_reg_dump(__func__, dev);
+	rkvdec_link_node_dump(__func__, dev);
+
+	return 0;
+}
+
+static int rkvdec_link_get_task_write(struct rkvdec_link_dev *dev)
+{
+	int idx = dev->task_write < dev->task_size ? dev->task_write :
+		  dev->task_write - dev->task_size;
+
+	return idx;
+}
+static int rkvdec_link_inc_task_write(struct rkvdec_link_dev *dev)
+{
+	int task_write = rkvdec_link_get_task_write(dev);
+
+	dev->task_write++;
+	if (dev->task_write >= dev->task_size * 2)
+		dev->task_write = 0;
+
+	return task_write;
+}
+static int rkvdec_link_get_task_read(struct rkvdec_link_dev *dev)
+{
+	int idx = dev->task_read < dev->task_size ? dev->task_read :
+		  dev->task_read - dev->task_size;
+
+	return idx;
+}
+static int rkvdec_link_inc_task_read(struct rkvdec_link_dev *dev)
+{
+	int task_read = rkvdec_link_get_task_read(dev);
+
+	dev->task_read++;
+	if (dev->task_read >= dev->task_size * 2)
+		dev->task_read = 0;
+
+	return task_read;
+}
+static int rkvdec_link_get_task_hw_queue_length(struct rkvdec_link_dev *dev)
+{
+	int len;
+
+	if (dev->task_send <= dev->task_recv)
+		len = dev->task_send + dev->task_size - dev->task_recv;
+	else
+		len = dev->task_send - dev->task_recv - dev->task_size;
+
+	return len;
+}
+static int rkvdec_link_get_task_send(struct rkvdec_link_dev *dev)
+{
+	int idx = dev->task_send < dev->task_size ? dev->task_send :
+		  dev->task_send - dev->task_size;
+
+	return idx;
+}
+static int rkvdec_link_inc_task_send(struct rkvdec_link_dev *dev)
+{
+	int task_send = rkvdec_link_get_task_send(dev);
+
+	dev->task_send++;
+	if (dev->task_send >= dev->task_size * 2)
+		dev->task_send = 0;
+
+	return task_send;
+}
+static int rkvdec_link_inc_task_recv(struct rkvdec_link_dev *dev)
+{
+	int task_recv = dev->task_recv;
+
+	dev->task_recv++;
+	if (dev->task_recv >= dev->task_size * 2)
+		dev->task_recv = 0;
+
+	return task_recv;
+}
+
+static int rkvdec_link_get_next_slot(struct rkvdec_link_dev *dev)
+{
+	int next = -1;
+
+	if (dev->task_write == dev->task_read)
+		return next;
+
+	next = rkvdec_link_get_task_write(dev);
+
+	return next;
+}
+
+static int rkvdec_link_write_task_to_slot(struct rkvdec_link_dev *dev, int idx,
+					  struct mpp_task *mpp_task)
+{
+	u32 i, off, s, n;
+	struct rkvdec_link_part *part;
+	struct rkvdec_link_info *info;
+	struct mpp_dma_buffer *table;
+	struct rkvdec2_task *task;
+	int slot_idx;
+	u32 *tb_reg;
+
+	if (idx < 0 || idx >= dev->task_size) {
+		mpp_err("send invalid task index %d\n", idx);
+		return -1;
+	}
+
+	info = dev->info;
+	part = info->part_w;
+	table = dev->table;
+	task = to_rkvdec2_task(mpp_task);
+
+	slot_idx = rkvdec_link_inc_task_write(dev);
+	if (idx != slot_idx)
+		dev_info(dev->dev, "slot index mismatch %d vs %d\n",
+			 idx, slot_idx);
+
+	if (task->need_hack) {
+		tb_reg = (u32 *)table->vaddr + slot_idx * dev->link_reg_count;
+
+		rkvdec2_3568_hack_fix_link(tb_reg + 4);
+
+		/* setup error mode flag */
+		dev->tasks_hw[slot_idx] = NULL;
+		dev->task_to_run++;
+		dev->task_prepared++;
+		slot_idx = rkvdec_link_inc_task_write(dev);
+	}
+
+	tb_reg = (u32 *)table->vaddr + slot_idx * dev->link_reg_count;
+
+	for (i = 0; i < info->part_w_num; i++) {
+		off = part[i].tb_reg_off;
+		s = part[i].reg_start;
+		n = part[i].reg_num;
+		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 */
+	part = info->part_r;
+	for (i = 0; i < info->part_r_num; i++) {
+		off = part[i].tb_reg_off;
+		n = part[i].reg_num;
+		memset(&tb_reg[off], 0, n * sizeof(u32));
+	}
+
+	dev->tasks_hw[slot_idx] = mpp_task;
+	task->slot_idx = slot_idx;
+	dev->task_to_run++;
+	dev->task_prepared++;
+	mpp_dbg_link_flow("slot %d write task %d\n", slot_idx,
+			  mpp_task->task_index);
+
+	return 0;
+}
+
+static void rkvdec2_clear_cache(struct mpp_dev *mpp)
+{
+	/* set cache size */
+	u32 reg = RKVDEC_CACHE_PERMIT_CACHEABLE_ACCESS |
+		  RKVDEC_CACHE_PERMIT_READ_ALLOCATE;
+
+	if (!mpp_debug_unlikely(DEBUG_CACHE_32B))
+		reg |= RKVDEC_CACHE_LINE_SIZE_64_BYTES;
+
+	mpp_write_relaxed(mpp, RKVDEC_REG_CACHE0_SIZE_BASE, reg);
+	mpp_write_relaxed(mpp, RKVDEC_REG_CACHE1_SIZE_BASE, reg);
+	mpp_write_relaxed(mpp, RKVDEC_REG_CACHE2_SIZE_BASE, reg);
+
+	/* clear cache */
+	mpp_write_relaxed(mpp, RKVDEC_REG_CLR_CACHE0_BASE, 1);
+	mpp_write_relaxed(mpp, RKVDEC_REG_CLR_CACHE1_BASE, 1);
+	mpp_write_relaxed(mpp, RKVDEC_REG_CLR_CACHE2_BASE, 1);
+}
+
+static int rkvdec_link_send_task_to_hw(struct rkvdec_link_dev *dev,
+				       struct mpp_task *mpp_task,
+				       int slot_idx, u32 task_to_run,
+				       int resend)
+{
+	void __iomem *reg_base = dev->reg_base;
+	struct mpp_dma_buffer *table = dev->table;
+	u32 task_total = dev->task_total;
+	u32 mode_start = 0;
+	u32 val;
+
+	/* write address */
+	if (!task_to_run || task_to_run > dev->task_size ||
+	    slot_idx < 0 || slot_idx >= dev->task_size) {
+		mpp_err("invalid task send cfg at %d count %d\n",
+			slot_idx, task_to_run);
+		rkvdec_link_counter("error on send", dev);
+		return 0;
+	}
+
+	val = task_to_run;
+	if (!task_total || resend)
+		mode_start = 1;
+
+	if (mode_start) {
+		u32 iova = table->iova + slot_idx * dev->link_node_size;
+
+		rkvdec2_clear_cache(dev->mpp);
+		/* cleanup counter in hardware */
+		writel(0, reg_base + RKVDEC_LINK_MODE_BASE);
+		/* start config before all registers are set */
+		wmb();
+		writel(RKVDEC_LINK_BIT_CFG_DONE, reg_base + RKVDEC_LINK_CFG_CTRL_BASE);
+		/* write zero count config */
+		wmb();
+		/* clear counter and enable link mode hardware */
+		writel(RKVDEC_LINK_BIT_EN, reg_base + RKVDEC_LINK_EN_BASE);
+
+		dev->task_total = 0;
+		dev->task_decoded = 0;
+
+		writel_relaxed(iova, reg_base + RKVDEC_LINK_CFG_ADDR_BASE);
+	} else {
+		val |= RKVDEC_LINK_BIT_ADD_MODE;
+	}
+
+	if (!resend) {
+		u32 i;
+
+		for (i = 0; i < task_to_run; i++) {
+			int next_idx = rkvdec_link_inc_task_send(dev);
+			struct mpp_task *task_ddr = dev->tasks_hw[next_idx];
+
+			if (!task_ddr)
+				continue;
+
+			set_bit(TASK_STATE_START, &task_ddr->state);
+			schedule_delayed_work(&task_ddr->timeout_work,
+					      msecs_to_jiffies(200));
+		}
+	} else {
+		if (task_total)
+			dev_info(dev->dev, "resend with total %d\n", task_total);
+	}
+
+	/* set link mode */
+	writel_relaxed(val, reg_base + RKVDEC_LINK_MODE_BASE);
+
+	/* start config before all registers are set */
+	wmb();
+
+	/* configure done */
+	writel(RKVDEC_LINK_BIT_CFG_DONE, reg_base + RKVDEC_LINK_CFG_CTRL_BASE);
+
+	mpp_dbg_link_flow("slot %d enable task %d mode %s\n", slot_idx,
+			  task_to_run, mode_start ? "start" : "add");
+	if (mode_start) {
+		/* start hardware before all registers are set */
+		wmb();
+		/* clear counter and enable link mode hardware */
+		writel(RKVDEC_LINK_BIT_EN, reg_base + RKVDEC_LINK_EN_BASE);
+	}
+
+	dev->task_total += task_to_run;
+	return 0;
+}
+
+static int rkvdec2_link_finish(struct mpp_dev *mpp, struct mpp_task *mpp_task)
+{
+	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
+	struct rkvdec2_task *task = to_rkvdec2_task(mpp_task);
+	struct rkvdec_link_dev *link_dec = dec->link_dec;
+	struct mpp_dma_buffer *table = link_dec->table;
+	struct rkvdec_link_info *info = link_dec->info;
+	struct rkvdec_link_part *part = info->part_r;
+	int slot_idx = task->slot_idx;
+	u32 *tb_reg = (u32 *)(table->vaddr + slot_idx * link_dec->link_node_size);
+	u32 off, s, n;
+	u32 i;
+
+	mpp_debug_enter();
+
+	for (i = 0; i < info->part_r_num; i++) {
+		off = part[i].tb_reg_off;
+		s = part[i].reg_start;
+		n = part[i].reg_num;
+		memcpy(&task->reg[s], &tb_reg[off], n * sizeof(u32));
+	}
+
+	mpp_debug_leave();
+
+	return 0;
+}
+
+static int rkvdec_link_isr_recv_task(struct mpp_dev *mpp,
+				     struct rkvdec_link_dev *link_dec,
+				     int count)
+{
+	struct rkvdec_link_info *info = link_dec->info;
+	u32 *table_base = (u32 *)link_dec->table->vaddr;
+	int i;
+
+	for (i = 0; i < count; i++) {
+		int idx = rkvdec_link_get_task_read(link_dec);
+		struct mpp_task *mpp_task = link_dec->tasks_hw[idx];
+		struct rkvdec2_task *task = NULL;
+		u32 *regs = NULL;
+		u32 irq_status = 0;
+
+		if (!mpp_task) {
+			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]) {
+				link_dec->stuff_cycle_sum +=
+					regs[RKVDEC_LINK_REG_CYCLE_CNT];
+				link_dec->stuff_cnt++;
+				if (link_dec->stuff_cnt >=
+				    link_dec->statistic_count) {
+					dev_info(
+						link_dec->dev, "hw cycle %u\n",
+						(u32)(link_dec->stuff_cycle_sum /
+						      link_dec->statistic_count));
+					link_dec->stuff_cycle_sum = 0;
+					link_dec->stuff_cnt = 0;
+				}
+			}
+
+			if (link_dec->error && (i == (count - 1))) {
+				link_dec->stuff_err++;
+
+				irq_status = mpp_read_relaxed(mpp, RKVDEC_REG_INT_EN);
+				dev_info(link_dec->dev, "found stuff task error irq %08x %u/%u\n",
+					 irq_status, link_dec->stuff_err,
+					 link_dec->stuff_total);
+
+				if (link_dec->stuff_on_error) {
+					dev_info(link_dec->dev, "stuff task error again %u/%u\n",
+						 link_dec->stuff_err,
+						 link_dec->stuff_total);
+				}
+
+				link_dec->stuff_on_error = 1;
+				/* resend task */
+				link_dec->decoded--;
+			} else {
+				link_dec->stuff_on_error = 0;
+				rkvdec_link_inc_task_recv(link_dec);
+				rkvdec_link_inc_task_read(link_dec);
+				link_dec->task_running--;
+				link_dec->task_prepared--;
+			}
+
+			continue;
+		}
+
+		task = to_rkvdec2_task(mpp_task);
+		regs = table_base + idx * link_dec->link_reg_count;
+		irq_status = regs[info->tb_reg_int];
+		mpp_dbg_link_flow("slot %d rd task %d\n", idx,
+				  mpp_task->task_index);
+
+		task->irq_status = 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]) {
+			link_dec->task_cycle_sum +=
+				regs[RKVDEC_LINK_REG_CYCLE_CNT];
+			link_dec->task_cnt++;
+			if (link_dec->task_cnt >= link_dec->statistic_count) {
+				dev_info(link_dec->dev, "hw cycle %u\n",
+					 (u32)(link_dec->task_cycle_sum /
+					       link_dec->statistic_count));
+				link_dec->task_cycle_sum = 0;
+				link_dec->task_cnt = 0;
+			}
+		}
+
+		rkvdec2_link_finish(mpp, mpp_task);
+
+		set_bit(TASK_STATE_FINISH, &mpp_task->state);
+
+		list_del_init(&mpp_task->queue_link);
+		link_dec->task_running--;
+		link_dec->task_prepared--;
+
+		rkvdec_link_inc_task_recv(link_dec);
+		rkvdec_link_inc_task_read(link_dec);
+
+		if (test_bit(TASK_STATE_ABORT, &mpp_task->state))
+			set_bit(TASK_STATE_ABORT_READY, &mpp_task->state);
+
+		set_bit(TASK_STATE_PROC_DONE, &mpp_task->state);
+		/* Wake up the GET thread */
+		wake_up(&task->wait);
+	}
+
+	return 0;
+}
+
+static void *rkvdec2_link_prepare(struct mpp_dev *mpp,
+				  struct mpp_task *mpp_task)
+{
+	struct mpp_task *out_task = NULL;
+	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
+	struct rkvdec_link_dev *link_dec = dec->link_dec;
+	int ret = 0;
+	int slot_idx;
+
+	mpp_debug_enter();
+
+	slot_idx = rkvdec_link_get_next_slot(link_dec);
+	if (slot_idx < 0) {
+		mpp_err("capacity %d running %d\n",
+			mpp->task_capacity, link_dec->task_running);
+		dev_err(link_dec->dev, "no slot to write on get next slot\n");
+		goto done;
+	}
+
+	ret = rkvdec_link_write_task_to_slot(link_dec, slot_idx, mpp_task);
+	if (ret >= 0)
+		out_task = mpp_task;
+	else
+		dev_err(mpp->dev, "no slot to write\n");
+
+done:
+	mpp_debug_leave();
+
+	return out_task;
+}
+
+static int rkvdec2_link_reset(struct mpp_dev *mpp)
+{
+	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
+
+	dev_info(mpp->dev, "resetting...\n");
+
+	/* FIXME lock resource lock of the other devices in combo */
+	mpp_iommu_down_write(mpp->iommu_info);
+	mpp_reset_down_write(mpp->reset_group);
+	atomic_set(&mpp->reset_request, 0);
+
+	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);
+
+	mpp_iommu_detach(mpp->iommu_info);
+	rockchip_restore_qos(mpp->dev);
+
+	/* Note: if the domain does not change, iommu attach will be return
+	 * as an empty operation. Therefore, force to close and then open,
+	 * will be update the domain. In this way, domain can really attach.
+	 */
+	mpp_iommu_refresh(mpp->iommu_info, mpp->dev);
+
+	mpp_iommu_attach(mpp->iommu_info);
+	mpp_reset_up_write(mpp->reset_group);
+	mpp_iommu_up_write(mpp->iommu_info);
+
+	dev_info(mpp->dev, "reset done\n");
+
+	return 0;
+}
+
+static int rkvdec2_link_irq(struct mpp_dev *mpp)
+{
+	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
+	struct rkvdec_link_dev *link_dec = dec->link_dec;
+	u32 irq_status = 0;
+
+	if (!atomic_read(&link_dec->power_enabled)) {
+		dev_info(link_dec->dev, "irq on power off\n");
+		return -1;
+	}
+
+	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);
+
+		if (!enabled) {
+			u32 bus = mpp_read_relaxed(mpp, 273 * 4);
+
+			if (bus & 0x7ffff)
+				dev_info(link_dec->dev,
+					 "invalid bus status %08x\n", bus);
+		}
+
+		link_dec->irq_status = irq_status;
+		mpp->irq_status = mpp_read_relaxed(mpp, RKVDEC_REG_INT_EN);
+		mpp_dbg_link_flow("core irq %08x\n", mpp->irq_status);
+
+		writel_relaxed(0, link_dec->reg_base + RKVDEC_LINK_IRQ_BASE);
+	}
+
+	return 0;
+}
+
+static int rkvdec2_link_isr(struct mpp_dev *mpp)
+{
+	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
+	struct rkvdec_link_dev *link_dec = dec->link_dec;
+	/* keep irq_status */
+	u32 irq_status = link_dec->irq_status;
+	u32 prev_dec_num;
+	int count = 0;
+	u32 len = 0;
+	u32 need_reset = atomic_read(&mpp->reset_request);
+	u32 task_timeout = link_dec->task_on_timeout;
+
+	mpp_debug_enter();
+
+	disable_irq(mpp->irq);
+	rkvdec_link_status_update(link_dec);
+	link_dec->irq_status = irq_status;
+	prev_dec_num = link_dec->task_decoded;
+
+	if (!link_dec->enabled || task_timeout) {
+		u32 val;
+
+		if (task_timeout)
+			rkvdec_link_reg_dump("timeout", link_dec);
+
+		val = mpp_read(mpp, 224 * 4);
+		if (!(val & BIT(2))) {
+			dev_info(mpp->dev, "frame not complete\n");
+			link_dec->decoded++;
+		}
+	}
+	count = (int)link_dec->decoded - (int)prev_dec_num;
+
+	/* handle counter wrap */
+	if (link_dec->enabled && !count && !need_reset) {
+		/* process extra isr when task is processed */
+		enable_irq(mpp->irq);
+		goto done;
+	}
+
+	/* get previous ready task */
+	if (count) {
+		rkvdec_link_isr_recv_task(mpp, link_dec, count);
+		link_dec->task_decoded = link_dec->decoded;
+	}
+
+	if (!link_dec->enabled || need_reset)
+		goto do_reset;
+
+	enable_irq(mpp->irq);
+	goto done;
+
+do_reset:
+	/* 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);
+
+	if (link_dec->total == link_dec->decoded)
+		goto done;
+
+	len = rkvdec_link_get_task_hw_queue_length(link_dec);
+	if (len > link_dec->task_size)
+		rkvdec_link_counter("invalid len", link_dec);
+
+	if (len) {
+		int slot_idx = rkvdec_link_get_task_read(link_dec);
+		struct mpp_task *mpp_task = NULL;
+
+		mpp_task = link_dec->tasks_hw[slot_idx];
+		rkvdec_link_send_task_to_hw(link_dec, mpp_task,
+					    slot_idx, len, 1);
+	}
+
+done:
+	mpp_debug_leave();
+
+	return IRQ_HANDLED;
+}
+
+int rkvdec2_link_remove(struct mpp_dev *mpp, struct rkvdec_link_dev *link_dec)
+{
+	mpp_debug_enter();
+
+	if (link_dec && link_dec->table) {
+		mpp_dma_free(link_dec->table);
+		link_dec->table = NULL;
+	}
+
+	mpp_debug_leave();
+
+	return 0;
+}
+
+static int rkvdec2_link_alloc_table(struct mpp_dev *mpp,
+				    struct rkvdec_link_dev *link_dec)
+{
+	int ret;
+	struct mpp_dma_buffer *table;
+	struct rkvdec_link_info *info = link_dec->info;
+	/* NOTE: link table address requires 64 align */
+	u32 task_capacity = link_dec->task_capacity;
+	u32 link_node_size = ALIGN(info->tb_reg_num * sizeof(u32), 256);
+	u32 link_info_size = task_capacity * link_node_size;
+	u32 *v_curr;
+	u32 io_curr, io_next, io_start;
+	u32 offset_r = info->part_r[0].tb_reg_off * sizeof(u32);
+	u32 i;
+
+	table = mpp_dma_alloc(mpp->dev, link_info_size);
+	if (!table) {
+		ret = -ENOMEM;
+		goto err_free_node;
+	}
+
+	link_dec->link_node_size = link_node_size;
+	link_dec->link_reg_count = link_node_size >> 2;
+	io_start = table->iova;
+
+	for (i = 0; i < task_capacity; i++) {
+		v_curr  = (u32 *)(table->vaddr + i * link_node_size);
+		io_curr = io_start + i * link_node_size;
+		io_next = (i == task_capacity - 1) ?
+			  io_start : io_start + (i + 1) * link_node_size;
+
+		v_curr[info->tb_reg_next] = io_next;
+		v_curr[info->tb_reg_r] = io_curr + offset_r;
+	}
+
+	link_dec->table	     = table;
+	link_dec->task_size  = task_capacity;
+	link_dec->task_count = 0;
+	link_dec->task_write = 0;
+	link_dec->task_read  = link_dec->task_size;
+	link_dec->task_send  = 0;
+	link_dec->task_recv  = link_dec->task_size;
+
+	return 0;
+err_free_node:
+	rkvdec2_link_remove(mpp, link_dec);
+	return ret;
+}
+
+#ifdef CONFIG_PROC_FS
+int rkvdec2_link_procfs_init(struct mpp_dev *mpp)
+{
+	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
+	struct rkvdec_link_dev *link_dec = dec->link_dec;
+
+	if (!link_dec)
+		return 0;
+
+	link_dec->statistic_count = 0;
+
+	if (dec->procfs)
+		mpp_procfs_create_u32("statistic_count", 0644,
+				      dec->procfs, &link_dec->statistic_count);
+
+	return 0;
+}
+#else
+int rkvdec2_link_procfs_init(struct mpp_dev *mpp)
+{
+	return 0;
+}
+#endif
+
+int rkvdec2_link_init(struct platform_device *pdev, struct rkvdec2_dev *dec)
+{
+	int ret;
+	struct resource *res = NULL;
+	struct rkvdec_link_dev *link_dec = NULL;
+	struct device *dev = &pdev->dev;
+	struct mpp_dev *mpp = &dec->mpp;
+
+	mpp_debug_enter();
+
+	link_dec = devm_kzalloc(dev, sizeof(*link_dec), GFP_KERNEL);
+	if (!link_dec) {
+		ret = -ENOMEM;
+		goto done;
+	}
+
+	link_dec->tasks_hw = devm_kzalloc(dev, sizeof(*link_dec->tasks_hw) *
+					  mpp->task_capacity, GFP_KERNEL);
+	if (!link_dec->tasks_hw) {
+		ret = -ENOMEM;
+		goto done;
+	}
+
+	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "link");
+	if (res)
+		link_dec->info = &rkvdec_link_v2_hw_info;
+	else {
+		dev_err(dev, "link mode resource not found\n");
+		ret = -ENOMEM;
+		goto done;
+	}
+
+	link_dec->reg_base = devm_ioremap(dev, res->start, resource_size(res));
+	if (!link_dec->reg_base) {
+		dev_err(dev, "ioremap failed for resource %pR\n", res);
+		ret = -ENOMEM;
+		goto done;
+	}
+
+	link_dec->task_capacity = mpp->task_capacity;
+	ret = rkvdec2_link_alloc_table(&dec->mpp, link_dec);
+	if (ret)
+		goto done;
+
+	rkvdec2_link_hack_data_setup(dec->fix);
+
+	link_dec->mpp = mpp;
+	link_dec->dev = dev;
+	atomic_set(&link_dec->task_timeout, 0);
+	atomic_set(&link_dec->power_enabled, 0);
+	link_dec->irq_enabled = 1;
+
+	dec->link_dec = link_dec;
+	dev_info(dev, "link mode probe finish\n");
+
+done:
+	if (ret) {
+		if (link_dec) {
+			if (link_dec->reg_base) {
+				devm_iounmap(dev, link_dec->reg_base);
+				link_dec->reg_base = NULL;
+			}
+			if (link_dec->tasks_hw) {
+				devm_kfree(dev, link_dec->tasks_hw);
+				link_dec->tasks_hw = NULL;
+			}
+
+			devm_kfree(dev, link_dec);
+			link_dec = NULL;
+		}
+		dec->link_dec = NULL;
+	}
+	mpp_debug_leave();
+
+	return ret;
+}
+
+static void rkvdec2_link_free_task(struct kref *ref)
+{
+	struct mpp_dev *mpp;
+	struct mpp_session *session;
+	struct mpp_task *task = container_of(ref, struct mpp_task, ref);
+
+	if (!task->session) {
+		mpp_err("task %d task->session is null.\n", task->task_index);
+		return;
+	}
+	session = task->session;
+
+	mpp_debug_func(DEBUG_TASK_INFO, "task %d:%d state 0x%lx\n",
+		       session->index, task->task_index, task->state);
+	if (!session->mpp) {
+		mpp_err("session %d session->mpp is null.\n", session->index);
+		return;
+	}
+	mpp = session->mpp;
+	list_del_init(&task->queue_link);
+
+	rkvdec2_free_task(session, task);
+	/* Decrease reference count */
+	atomic_dec(&session->task_count);
+	atomic_dec(&mpp->task_count);
+}
+
+static void rkvdec2_link_trigger_work(struct mpp_dev *mpp)
+{
+	kthread_queue_work(&mpp->worker, &mpp->work);
+}
+
+static void rkvdec2_link_trigger_timeout(struct mpp_dev *mpp)
+{
+	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
+	struct rkvdec_link_dev *link_dec = dec->link_dec;
+
+	atomic_inc(&link_dec->task_timeout);
+	rkvdec2_link_trigger_work(mpp);
+}
+
+static void rkvdec2_link_trigger_irq(struct mpp_dev *mpp)
+{
+	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
+	struct rkvdec_link_dev *link_dec = dec->link_dec;
+
+	link_dec->task_irq++;
+	rkvdec2_link_trigger_work(mpp);
+}
+
+static void rkvdec2_link_power_on(struct mpp_dev *mpp)
+{
+	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
+	struct rkvdec_link_dev *link_dec = dec->link_dec;
+
+	if (!atomic_xchg(&link_dec->power_enabled, 1)) {
+		pm_runtime_get_sync(mpp->dev);
+		pm_stay_awake(mpp->dev);
+
+		if (mpp->hw_ops->clk_on)
+			mpp->hw_ops->clk_on(mpp);
+
+		if (!link_dec->irq_enabled) {
+			enable_irq(mpp->irq);
+			link_dec->irq_enabled = 1;
+		}
+	}
+}
+
+static void rkvdec2_link_power_off(struct mpp_dev *mpp)
+{
+	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
+	struct rkvdec_link_dev *link_dec = dec->link_dec;
+
+	if (atomic_xchg(&link_dec->power_enabled, 0)) {
+		disable_irq(mpp->irq);
+		link_dec->irq_enabled = 0;
+
+		if (mpp->hw_ops->clk_off)
+			mpp->hw_ops->clk_off(mpp);
+
+		pm_relax(mpp->dev);
+		pm_runtime_put_sync_suspend(mpp->dev);
+
+		link_dec->task_decoded = 0;
+		link_dec->task_total = 0;
+	}
+}
+
+static void rkvdec2_link_timeout_proc(struct work_struct *work_s)
+{
+	struct mpp_dev *mpp;
+	struct mpp_session *session;
+	struct mpp_task *task = container_of(to_delayed_work(work_s),
+					     struct mpp_task, timeout_work);
+
+	if (test_and_set_bit(TASK_STATE_HANDLE, &task->state)) {
+		mpp_err("task %d state %lx has been handled\n",
+			task->task_index, task->state);
+		return;
+	}
+
+	if (!task->session) {
+		mpp_err("task %d session is null.\n", task->task_index);
+		return;
+	}
+	session = task->session;
+
+	if (!session->mpp) {
+		mpp_err("task %d:%d mpp is null.\n", session->index,
+			task->task_index);
+		return;
+	}
+	mpp = session->mpp;
+	rkvdec2_link_trigger_timeout(mpp);
+}
+
+static void mpp_taskqueue_scan_pending_abort_task(struct mpp_taskqueue *queue)
+{
+	struct mpp_task *task, *n;
+
+	mutex_lock(&queue->pending_lock);
+	/* Check and pop all timeout task */
+	list_for_each_entry_safe(task, n, &queue->pending_list, queue_link) {
+		struct mpp_session *session = task->session;
+
+		if (test_bit(TASK_STATE_ABORT, &task->state)) {
+			mutex_lock(&session->pending_lock);
+			/* wait and signal */
+			list_del_init(&task->queue_link);
+			mutex_unlock(&session->pending_lock);
+			kref_put(&task->ref, rkvdec2_link_free_task);
+		}
+	}
+	mutex_unlock(&queue->pending_lock);
+}
+
+static void rkvdec2_link_try_dequeue(struct mpp_dev *mpp)
+{
+	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
+	struct rkvdec_link_dev *link_dec = dec->link_dec;
+	struct mpp_task *task;
+	struct mpp_taskqueue *queue = mpp->queue;
+	int task_irq = link_dec->task_irq;
+	int task_irq_prev = link_dec->task_irq_prev;
+	int task_timeout = atomic_read(&link_dec->task_timeout);
+
+	if (!link_dec->task_running)
+		goto done;
+
+	if (task_timeout != link_dec->task_timeout_prev) {
+		dev_info(link_dec->dev, "process task timeout\n");
+		atomic_inc(&mpp->reset_request);
+		link_dec->task_on_timeout =
+			task_timeout - link_dec->task_timeout_prev;
+		goto proc;
+	}
+
+	if (task_irq == task_irq_prev)
+		goto done;
+
+	if (!atomic_read(&link_dec->power_enabled)) {
+		dev_info(link_dec->dev, "dequeue on power off\n");
+		goto done;
+	}
+
+proc:
+	task = list_first_entry_or_null(&queue->running_list, struct mpp_task,
+					queue_link);
+	if (!task) {
+		mpp_err("can found task on trydequeue with %d running task\n",
+			link_dec->task_running);
+		goto done;
+	}
+
+	/* Check and process all finished task */
+	rkvdec2_link_isr(mpp);
+
+done:
+	link_dec->task_irq_prev = task_irq;
+	link_dec->task_timeout_prev = task_timeout;
+	link_dec->task_on_timeout = 0;
+
+	mpp_taskqueue_scan_pending_abort_task(queue);
+
+	/* TODO: if reset is needed do reset here */
+}
+
+static int mpp_task_queue(struct mpp_dev *mpp, struct mpp_task *task)
+{
+	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
+	struct rkvdec_link_dev *link_dec = dec->link_dec;
+	u32 task_to_run = 0;
+	int slot_idx = 0;
+	int ret;
+
+	mpp_debug_enter();
+
+	/*
+	 * for iommu share hardware, should attach to ensure
+	 * working in current device
+	 */
+	ret = mpp_iommu_attach(mpp->iommu_info);
+	if (ret) {
+		dev_err(mpp->dev, "mpp_iommu_attach failed\n");
+		return -ENODATA;
+	}
+
+	rkvdec2_link_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));
+
+	/* prepare the task for running */
+	if (test_and_set_bit(TASK_STATE_PREPARE, &task->state))
+		mpp_err("task %d has been prepare twice\n", task->task_index);
+
+	rkvdec2_link_prepare(mpp, task);
+
+	task_to_run = link_dec->task_to_run;
+	if (!task_to_run) {
+		dev_err(link_dec->dev, "nothing to run\n");
+		goto done;
+	}
+
+	mpp_reset_down_read(mpp->reset_group);
+	link_dec->task_to_run = 0;
+	slot_idx = rkvdec_link_get_task_send(link_dec);
+	link_dec->task_running += task_to_run;
+	rkvdec_link_send_task_to_hw(link_dec, task, slot_idx, task_to_run, 0);
+
+done:
+	mpp_debug_leave();
+
+	return 0;
+}
+
+irqreturn_t rkvdec2_link_irq_proc(int irq, void *param)
+{
+	struct mpp_dev *mpp = param;
+	int ret = rkvdec2_link_irq(mpp);
+
+	if (!ret)
+		rkvdec2_link_trigger_irq(mpp);
+
+	return IRQ_HANDLED;
+}
+
+static struct mpp_task *
+mpp_session_get_pending_task(struct mpp_session *session)
+{
+	struct mpp_task *task = NULL;
+
+	mutex_lock(&session->pending_lock);
+	task = list_first_entry_or_null(&session->pending_list, struct mpp_task,
+					pending_link);
+	mutex_unlock(&session->pending_lock);
+
+	return task;
+}
+
+static int task_is_done(struct mpp_task *task)
+{
+	return test_bit(TASK_STATE_PROC_DONE, &task->state);
+}
+
+static int mpp_session_pop_pending(struct mpp_session *session,
+				   struct mpp_task *task)
+{
+	mutex_lock(&session->pending_lock);
+	list_del_init(&task->pending_link);
+	mutex_unlock(&session->pending_lock);
+	kref_put(&task->ref, rkvdec2_link_free_task);
+
+	return 0;
+}
+
+static int mpp_session_pop_done(struct mpp_session *session,
+				struct mpp_task *task)
+{
+	set_bit(TASK_STATE_DONE, &task->state);
+	kref_put(&task->ref, rkvdec2_link_free_task);
+
+	return 0;
+}
+
+int rkvdec2_link_process_task(struct mpp_session *session,
+			      struct mpp_task_msgs *msgs)
+{
+	struct mpp_task *task = NULL;
+	struct rkvdec2_task *dec_task = NULL;
+	struct mpp_dev *mpp = session->mpp;
+	u32 fmt;
+
+	task = rkvdec2_alloc_task(session, msgs);
+	if (!task) {
+		mpp_err("alloc_task failed.\n");
+		return -ENOMEM;
+	}
+
+	dec_task = to_rkvdec2_task(task);
+	fmt = RKVDEC_GET_FORMAT(dec_task->reg[RKVDEC_REG_FORMAT_INDEX]);
+	dec_task->need_hack = (fmt == RKVDEC_FMT_H264D);
+
+	kref_init(&task->ref);
+	atomic_set(&task->abort_request, 0);
+	task->task_index = atomic_fetch_inc(&mpp->task_index);
+	INIT_DELAYED_WORK(&task->timeout_work, rkvdec2_link_timeout_proc);
+
+	/*
+	 * Push task to session should be in front of push task to queue.
+	 * Otherwise, when mpp_task_finish finish and worker_thread call
+	 * mpp_task_try_run, it may be get a task who has push in queue but
+	 * not in session, cause some errors.
+	 */
+	atomic_inc(&session->task_count);
+
+	kref_get(&task->ref);
+	mutex_lock(&session->pending_lock);
+	list_add_tail(&task->pending_link, &session->pending_list);
+	mutex_unlock(&session->pending_lock);
+
+	kref_get(&task->ref);
+	mutex_lock(&mpp->queue->pending_lock);
+	list_add_tail(&task->queue_link, &mpp->queue->pending_list);
+	mutex_unlock(&mpp->queue->pending_lock);
+
+	/* push current task to queue */
+	atomic_inc(&mpp->task_count);
+	set_bit(TASK_STATE_PENDING, &task->state);
+	/* trigger current queue to run task */
+	rkvdec2_link_trigger_work(mpp);
+	kref_put(&task->ref, rkvdec2_link_free_task);
+
+	return 0;
+}
+
+int rkvdec2_link_wait_result(struct mpp_session *session,
+			     struct mpp_task_msgs *msgs)
+{
+	struct mpp_dev *mpp = session->mpp;
+	struct mpp_task *mpp_task;
+	struct rkvdec2_task *task;
+	int ret;
+
+	mpp_task = mpp_session_get_pending_task(session);
+	if (!mpp_task) {
+		mpp_err("session %p pending list is empty!\n", session);
+		return -EIO;
+	}
+
+	task = to_rkvdec2_task(mpp_task);
+	ret = wait_event_timeout(task->wait, task_is_done(mpp_task),
+				 msecs_to_jiffies(WAIT_TIMEOUT_MS));
+	if (ret) {
+		ret = rkvdec2_result(mpp, mpp_task, msgs);
+
+		mpp_session_pop_done(session, mpp_task);
+	} else {
+		mpp_err("task %d:%d statue %lx timeout -> abort\n",
+			session->index, mpp_task->task_index, mpp_task->state);
+
+		atomic_inc(&mpp_task->abort_request);
+		set_bit(TASK_STATE_ABORT, &mpp_task->state);
+	}
+
+	mpp_session_pop_pending(session, mpp_task);
+	return ret;
+}
+
+void rkvdec2_link_worker(struct kthread_work *work_s)
+{
+	struct mpp_dev *mpp = container_of(work_s, struct mpp_dev, work);
+	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
+	struct rkvdec_link_dev *link_dec = dec->link_dec;
+	struct mpp_task *task;
+	struct mpp_taskqueue *queue = mpp->queue;
+
+	mpp_debug_enter();
+
+	/*
+	 * process timeout and finished task.
+	 */
+	rkvdec2_link_try_dequeue(mpp);
+
+again:
+	if (atomic_read(&mpp->reset_request)) {
+		if (link_dec->task_running || link_dec->task_prepared)
+			goto done;
+
+		disable_irq(mpp->irq);
+		rkvdec2_link_reset(mpp);
+		link_dec->task_decoded = 0;
+		link_dec->task_total = 0;
+		enable_irq(mpp->irq);
+	}
+	/*
+	 * process pending queue to find the task to accept.
+	 */
+	mutex_lock(&queue->pending_lock);
+	task = list_first_entry_or_null(&queue->pending_list, struct mpp_task,
+					queue_link);
+	mutex_unlock(&queue->pending_lock);
+	if (!task)
+		goto done;
+
+	if (test_bit(TASK_STATE_ABORT, &task->state)) {
+		struct rkvdec2_task *dec_task = to_rkvdec2_task(task);
+
+		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);
+
+		mutex_unlock(&queue->pending_lock);
+		wake_up(&dec_task->wait);
+		kref_put(&task->ref, rkvdec2_link_free_task);
+		goto again;
+	}
+
+	/*
+	 * if target device can accept more task send the task to run.
+	 */
+	if (link_dec->task_running >= link_dec->task_capacity - 2)
+		goto done;
+
+	if (mpp_task_queue(mpp, task)) {
+		/* failed to run */
+		mpp_err("%p failed to process task %p:%d\n",
+			mpp, task, task->task_index);
+	} else {
+		mutex_lock(&queue->pending_lock);
+		set_bit(TASK_STATE_RUNNING, &task->state);
+		list_move_tail(&task->queue_link, &queue->running_list);
+		mutex_unlock(&queue->pending_lock);
+		goto again;
+	}
+done:
+	mpp_debug_leave();
+
+	if (link_dec->task_irq != link_dec->task_irq_prev ||
+	    atomic_read(&link_dec->task_timeout) != link_dec->task_timeout_prev)
+		rkvdec2_link_trigger_work(mpp);
+
+	/* if no task for running power off device */
+	{
+		u32 all_done = 0;
+
+		mutex_lock(&queue->pending_lock);
+		all_done = list_empty(&queue->pending_list);
+		mutex_unlock(&queue->pending_lock);
+
+		if (all_done && !link_dec->task_running && !link_dec->task_prepared)
+			rkvdec2_link_power_off(mpp);
+	}
+
+	mutex_lock(&queue->session_lock);
+	if (queue->detach_count) {
+		struct mpp_session *session = NULL, *n;
+
+		mpp_dbg_session("%s detach count %d start\n",
+				dev_name(mpp->dev), queue->detach_count);
+
+		list_for_each_entry_safe(session, n, &queue->session_detach,
+					 session_link) {
+			if (!mpp_session_deinit(session))
+				queue->detach_count--;
+		}
+
+		mpp_dbg_session("%s detach count %d done\n", dev_name(mpp->dev),
+				queue->detach_count);
+	}
+	mutex_unlock(&queue->session_lock);
+}
+
+void rkvdec2_link_session_deinit(struct mpp_session *session)
+{
+	struct mpp_dev *mpp = session->mpp;
+
+	mpp_debug_enter();
+
+	rkvdec2_free_session(session);
+
+	if (session->dma) {
+		mpp_dbg_session("session %d destroy dma\n", session->index);
+		mpp_iommu_down_read(mpp->iommu_info);
+		mpp_dma_session_destroy(session->dma);
+		mpp_iommu_up_read(mpp->iommu_info);
+		session->dma = NULL;
+	}
+	if (session->srv) {
+		struct mpp_service *srv = session->srv;
+
+		mutex_lock(&srv->session_lock);
+		list_del_init(&session->service_link);
+		mutex_unlock(&srv->session_lock);
+	}
+	list_del_init(&session->session_link);
+
+	mpp_dbg_session("session %d release\n", session->index);
+
+	mpp_debug_leave();
+}
diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h
new file mode 100644
index 000000000000..13fc8c6beb93
--- /dev/null
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h
@@ -0,0 +1,118 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co., Ltd
+ *
+ * author:
+ *	Herman Chen <herman.chen@rock-chips.com>
+ */
+#ifndef __ROCKCHIP_MPP_RKVDEC2_LINK_H__
+#define __ROCKCHIP_MPP_RKVDEC2_LINK_H__
+
+#include "mpp_rkvdec2.h"
+
+#define RKVDEC_REG_SECOND_EN_BASE	0x30
+#define RKVDEC_REG_SECOND_EN_INDEX	12
+#define RKVDEC_WAIT_RESET_EN		BIT(7)
+
+/* define for link hardware */
+#define RKVDEC_LINK_ADD_CFG_NUM		1
+
+#define RKVDEC_LINK_IRQ_BASE		0x000
+#define RKVDEC_LINK_BIT_IRQ_DIS		BIT(2)
+#define RKVDEC_LINK_BIT_IRQ		BIT(8)
+#define RKVDEC_LINK_BIT_IRQ_RAW		BIT(9)
+
+#define RKVDEC_LINK_CFG_ADDR_BASE	0x004
+
+#define RKVDEC_LINK_MODE_BASE		0x008
+#define RKVDEC_LINK_BIT_ADD_MODE	BIT(31)
+
+#define RKVDEC_LINK_CFG_CTRL_BASE	0x00c
+#define RKVDEC_LINK_BIT_CFG_DONE	BIT(0)
+
+#define RKVDEC_LINK_DEC_NUM_BASE	0x010
+#define RKVDEC_LINK_BIT_DEC_ERROR	BIT(31)
+#define	RKVDEC_LINK_GET_DEC_NUM(x)	((x) & 0x3fffffff)
+
+#define RKVDEC_LINK_TOTAL_NUM_BASE	0x014
+
+#define RKVDEC_LINK_EN_BASE		0x018
+#define RKVDEC_LINK_BIT_EN		BIT(0)
+
+#define RKVDEC_LINK_NEXT_ADDR_BASE	0x01c
+
+#define RKVDEC_LINK_REG_CYCLE_CNT	179
+
+struct rkvdec_link_dev {
+	struct device *dev;
+	struct mpp_dev *mpp;
+	void __iomem *reg_base;
+	u32 enabled;
+	u32 link_mode;
+	u32 decoded_status;
+	u32 irq_status;
+	u32 iova_curr;
+	u32 iova_next;
+	u32 decoded;
+	u32 total;
+	u32 error;
+	u32 stuff_err;
+	u32 stuff_total;
+	u32 stuff_on_error;
+
+	struct rkvdec_link_info *info;
+	struct mpp_dma_buffer *table;
+	u32 link_node_size;
+	u32 link_reg_count;
+
+	struct mpp_task **tasks_hw;
+	u32 task_capacity;
+	s32 task_total;
+	s32 task_decoded;
+	s32 task_size;
+	s32 task_count;
+	s32 task_write;
+	s32 task_read;
+	s32 task_send;
+	s32 task_recv;
+
+	/* taskqueue variables */
+	u32 task_running;
+	u32 task_prepared;
+	s32 task_to_run;
+	u32 task_on_timeout;
+
+	/* taskqueue trigger variables */
+	u32 task_irq;
+	u32 task_irq_prev;
+	/* timeout can be trigger in different thread so atomic is needed */
+	atomic_t task_timeout;
+	u32 task_timeout_prev;
+
+	/* link mode hardware status */
+	atomic_t power_enabled;
+	u32 irq_enabled;
+
+	/* debug variable */
+	u32 statistic_count;
+	u64 task_cycle_sum;
+	u32 task_cnt;
+	u64 stuff_cycle_sum;
+	u32 stuff_cnt;
+};
+
+int rkvdec_link_dump(struct mpp_dev *mpp);
+
+int rkvdec2_link_init(struct platform_device *pdev, struct rkvdec2_dev *dec);
+int rkvdec2_link_procfs_init(struct mpp_dev *mpp);
+int rkvdec2_link_remove(struct mpp_dev *mpp, struct rkvdec_link_dev *link_dec);
+
+irqreturn_t rkvdec2_link_irq_proc(int irq, void *param);
+int rkvdec2_link_process_task(struct mpp_session *session,
+			      struct mpp_task_msgs *msgs);
+int rkvdec2_link_wait_result(struct mpp_session *session,
+			     struct mpp_task_msgs *msgs);
+void rkvdec2_link_worker(struct kthread_work *work_s);
+void rkvdec2_link_session_deinit(struct mpp_session *session);
+
+#endif

commit eb2460ac41bf6f0855b4f24601ba8b3301becdc9
Author: Elaine Zhang <zhangqing@rock-chips.com>
Date:   Tue Aug 17 15:55:24 2021 +0800

    soc: rockchip: pm-domain: optimize static memory consume
    
    $ ./scripts/bloat-o-meter pm_domains_old.o pm_domains.o
    dd/remove: 0/22 grow/shrink: 0/1 up/down: 0/-9328 (-9328)
    Function                                     old     new   delta
    rk3568_pmu                                    44       -     -44
    rk3399_pmu                                    44       -     -44
    rk3368_pmu                                    44       -     -44
    rk3366_pmu                                    44       -     -44
    rk3328_pmu                                    44       -     -44
    rk3288_pmu                                    44       -     -44
    rk3228_pmu                                    44       -     -44
    rk3128_pmu                                    44       -     -44
    rk3036_pmu                                    44       -     -44
    rk1808_pmu                                    44       -     -44
    px30_pmu                                      44       -     -44
    rk3128_pm_domains                            220       -    -220
    rk3036_pm_domains                            308       -    -308
    rk1808_pm_domains                            396       -    -396
    rk3328_pm_domains                            440       -    -440
    rk3228_pm_domains                            484       -    -484
    rk3366_pm_domains                            528       -    -528
    rk3288_pm_domains                            616       -    -616
    px30_pm_domains                              660       -    -660
    rk3568_pm_domains                            704       -    -704
    rk3368_pm_domains                            748       -    -748
    rk3399_pm_domains                           1584       -   -1584
    rockchip_pm_domain_dt_match                 2548     392   -2156
    Total: Before=17357, After=8029, chg -53.74%
    
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    Change-Id: I1b8b307736edc9c02720c11460041e54fc6b98dd

diff --git a/drivers/soc/rockchip/pm_domains.c b/drivers/soc/rockchip/pm_domains.c
index 5af64919736f..862bc3ee0331 100644
--- a/drivers/soc/rockchip/pm_domains.c
+++ b/drivers/soc/rockchip/pm_domains.c
@@ -1487,54 +1487,78 @@ static const struct rockchip_pmu_info rk3568_pmu = {
 };
 
 static const struct of_device_id rockchip_pm_domain_dt_match[] = {
+#ifdef CONFIG_CPU_PX30
 	{
 		.compatible = "rockchip,px30-power-controller",
 		.data = (void *)&px30_pmu,
 	},
+#endif
+#ifdef CONFIG_CPU_RV1126
 	{
 		.compatible = "rockchip,rv1126-power-controller",
 		.data = (void *)&rv1126_pmu,
 	},
+#endif
+#ifdef CONFIG_CPU_RK1808
 	{
 		.compatible = "rockchip,rk1808-power-controller",
 		.data = (void *)&rk1808_pmu,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3036
 	{
 		.compatible = "rockchip,rk3036-power-controller",
 		.data = (void *)&rk3036_pmu,
 	},
+#endif
+#ifdef CONFIG_CPU_RK312X
 	{
 		.compatible = "rockchip,rk3128-power-controller",
 		.data = (void *)&rk3128_pmu,
 	},
+#endif
+#ifdef CONFIG_CPU_RK322X
 	{
 		.compatible = "rockchip,rk3228-power-controller",
 		.data = (void *)&rk3228_pmu,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3288
 	{
 		.compatible = "rockchip,rk3288-power-controller",
 		.data = (void *)&rk3288_pmu,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3328
 	{
 		.compatible = "rockchip,rk3328-power-controller",
 		.data = (void *)&rk3328_pmu,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3366
 	{
 		.compatible = "rockchip,rk3366-power-controller",
 		.data = (void *)&rk3366_pmu,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3368
 	{
 		.compatible = "rockchip,rk3368-power-controller",
 		.data = (void *)&rk3368_pmu,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3399
 	{
 		.compatible = "rockchip,rk3399-power-controller",
 		.data = (void *)&rk3399_pmu,
 	},
+#endif
+#ifdef CONFIG_CPU_RK3568
 	{
 		.compatible = "rockchip,rk3568-power-controller",
 		.data = (void *)&rk3568_pmu,
 	},
+#endif
 	{ /* sentinel */ },
 };
 MODULE_DEVICE_TABLE(of, rockchip_pm_domain_dt_match);

commit 7dd8c3a4ce4501fcfb8c6ad2970f9552e1f2a32c
Author: Algea Cao <algea.cao@rock-chips.com>
Date:   Fri Aug 13 09:05:12 2021 +0800

    drm/rockchip: dw_hdmi: Support skip check yuv420 mode valid
    
    Do this check in userspace.
    
    Signed-off-by: Algea Cao <algea.cao@rock-chips.com>
    Change-Id: I1a3b8510a58cdc0f1459c71ad6983a9ebf7240ce

diff --git a/Documentation/devicetree/bindings/display/rockchip/dw_hdmi-rockchip.txt b/Documentation/devicetree/bindings/display/rockchip/dw_hdmi-rockchip.txt
index a125564580fa..2727c6aced71 100644
--- a/Documentation/devicetree/bindings/display/rockchip/dw_hdmi-rockchip.txt
+++ b/Documentation/devicetree/bindings/display/rockchip/dw_hdmi-rockchip.txt
@@ -43,6 +43,7 @@ Optional properties
 - max-tmdsclk: hdmi max tmdsclk, if this property is not set, set max tmdsclk to 594M.
 - unsupported-yuv-input: If yuv input is not supported, set this property.
 - unsupported-deep-color: If deep color mode is not supported, set this property.
+- skip-check-420-mode: If need skip check yuv420 mode valid, set this property.
 - hdcp1x-enable: enable hdcp1.x, enable if defined, disable if not defined
 - scramble-low-rates: if defined enable scarmble when tmdsclk less than 340Mhz
 
diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
index 47f913ab5972..cac7d614e756 100644
--- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
+++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
@@ -115,6 +115,7 @@ struct rockchip_hdmi {
 	int max_tmdsclk;
 	bool unsupported_yuv_input;
 	bool unsupported_deep_color;
+	bool skip_check_420_mode;
 	bool mode_changed;
 	u8 force_output;
 	u8 id;
@@ -451,6 +452,8 @@ static int rockchip_hdmi_parse_dt(struct rockchip_hdmi *hdmi)
 		of_property_read_bool(np, "unsupported-yuv-input");
 	hdmi->unsupported_deep_color =
 		of_property_read_bool(np, "unsupported-deep-color");
+	hdmi->skip_check_420_mode =
+		of_property_read_bool(np, "skip-check-420-mode");
 
 	if (of_get_property(np, "rockchip,phy-table", &val)) {
 		phy_config = kmalloc(val, GFP_KERNEL);
@@ -495,16 +498,6 @@ dw_hdmi_rockchip_mode_valid(struct drm_connector *connector,
 	 */
 	if (mode->clock > INT_MAX / 1000)
 		return MODE_BAD;
-	/*
-	 * If sink max TMDS clock < 340MHz, we should check the mode pixel
-	 * clock > 340MHz is YCbCr420 or not and whether the platform supports
-	 * YCbCr420.
-	 */
-	if (mode->clock > 340000 &&
-	    connector->display_info.max_tmds_clock < 340000 &&
-	    (!drm_mode_is_420(&connector->display_info, mode) ||
-	     !connector->ycbcr_420_allowed))
-		return MODE_BAD;
 
 	if (!encoder) {
 		const struct drm_connector_helper_funcs *funcs;
@@ -521,9 +514,23 @@ dw_hdmi_rockchip_mode_valid(struct drm_connector *connector,
 		return MODE_BAD;
 
 	hdmi = to_rockchip_hdmi(encoder);
-	if (hdmi->max_tmdsclk <= 340000 && mode->clock > 340000 &&
-	    !drm_mode_is_420(&connector->display_info, mode))
-		return MODE_BAD;
+
+	/*
+	 * If sink max TMDS clock < 340MHz, we should check the mode pixel
+	 * clock > 340MHz is YCbCr420 or not and whether the platform supports
+	 * YCbCr420.
+	 */
+	if (!hdmi->skip_check_420_mode) {
+		if (mode->clock > 340000 &&
+		    connector->display_info.max_tmds_clock < 340000 &&
+		    (!drm_mode_is_420(&connector->display_info, mode) ||
+		     !connector->ycbcr_420_allowed))
+			return MODE_BAD;
+
+		if (hdmi->max_tmdsclk <= 340000 && mode->clock > 340000 &&
+		    !drm_mode_is_420(&connector->display_info, mode))
+			return MODE_BAD;
+	};
 
 	if (hdmi->phy)
 		phy_set_bus_width(hdmi->phy, 8);

commit 33955b1ed63685b9d6a5ab89d73ab1600c27e041
Author: Algea Cao <algea.cao@rock-chips.com>
Date:   Fri Aug 13 09:16:57 2021 +0800

    arm64: dts: rockchip: rk3568-nvr: Add hdmi property skip-check-420-mode
    
    NVR product isn't need to check yuv420 mode valid in hdmi driver.
    
    Signed-off-by: Algea Cao <algea.cao@rock-chips.com>
    Change-Id: I56264bd3e4a9a3e9d5ddbec48e36fb816dd1de65

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi
index 45b2fdac490a..94b0e272aa69 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi
@@ -228,6 +228,7 @@
 };
 
 &hdmi {
+	skip-check-420-mode;
 	status = "okay";
 };
 

commit 35e377f26272194073a682592fe0c5fc66835370
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Sat Aug 14 19:05:41 2021 +0800

    drm/rockchip: Use a standalone mutex_lock protect planes configuration
    
    Fix a deadlock on commit_lock when flush commit_work on async
    commit mode:
    mutex_lock(&private->commit_lock);
            flush_work(&private->commit_work);
                    rockchip_atomic_commit_complete
                            mutex_lock(&prv->commit_lock);
                                    drm_atomic_helper_commit_planes(dev, state, true);
    
    [root@RK356X:/]# echo w  > /proc/sysrq-trigger
    [73134.630331] sysrq: Show Blocked State
    [73134.630406]   task                        PC stack   pid father
    [73134.630544] weston          D    0   585      1 0x00000000
    [73134.630584] Call trace:
    [73134.630648]  __switch_to+0xc0/0x124
    [73134.630698]  __schedule+0x6f0/0x778
    [73134.630739]  schedule+0x70/0x84
    [73134.630779] [root@RK356X:/]#  schedule_timeout+0x4c/0x3d0
    [73134.630817]  wait_for_common+0xe0/0x17c
    [73134.630844]  wait_for_completion+0x28/0x34
    [73134.630878]  __flush_work+0x118/0x1ac
    [73134.630918]  flush_work+0x24/0x30
    [73134.630961]  rockchip_drm_atomic_commit+0x154/0x220
    [73134.631005]  drm_atomic_nonblocking_commit+0x54/0x60
    [73134.631047]  drm_atomic_helper_page_flip+0x6c/0xa8
    [73134.631089]  drm_mode_page_flip_ioctl+0x368/0x420
    [73134.631119]  drm_ioctl_kernel+0x8c/0xfc
    [73134.631166]  drm_ioctl+0x328/0x3bc
    [73134.631207]  vfs_ioctl+0x58/0x68
    [73134.631245]  do_vfs_ioctl+0xb4/0x9d4
    [73134.631280]  ksys_ioctl+0x50/0x80
    [73134.631317]  __arm64_sys_ioctl+0x28/0x38
    [73134.631360]  el0_svc_common.constprop.0+0xe8/0x168
    [73134.631389]  el0_svc_handler+0x70/0x8c
    [73134.631435]  el0_svc+0x8/0xc
    [73134.631497] kworker/3:1     D    0   823      2 0x00000028
    [73134.631557] Workqueue: events rockchip_drm_atomic_work
    [73134.631597] Call trace:
    [73134.631643]  __switch_to+0xc0/0x124
    [73134.631670]  __schedule+0x6f0/0x778
    [73134.631711]  schedule+0x70/0x84
    [73134.631749]  schedule_preempt_disabled+0x14/0x1c
    [73134.631786]  __mutex_lock.isra.1+0x2c4/0x430
    [73134.631824]  __mutex_lock_slowpath+0x24/0x30
    [73134.631862]  mutex_lock+0x40/0x4c
    [73134.631902]  rockchip_atomic_commit_complete+0xa0/0x124
    [73134.631930]  rockchip_drm_atomic_work+0x20/0x30
    [73134.631958]  process_one_work+0x200/0x330
    [73134.631997]  process_scheduled_works+0x44/0x48
    [73134.632037]  worker_thread+0x26c/0x2fc
    [73134.632075]  kthread+0x120/0x130
    [73134.632113]  ret_from_fork+0x10/0x18
    
    Change-Id: Ia571c077f2d88854f9f568bb1693365e154d1e6c
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index 14b3d89a2be0..95751a3e7fb6 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -1621,6 +1621,7 @@ static int rockchip_drm_bind(struct device *dev)
 	}
 
 	mutex_init(&private->commit_lock);
+	mutex_init(&private->ovl_lock);
 	INIT_WORK(&private->commit_work, rockchip_drm_atomic_work);
 	drm_dev->dev_private = private;
 
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h
index 9cdba584fedd..1f57aadcd0ab 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h
@@ -197,6 +197,11 @@ struct rockchip_drm_private {
 	struct rockchip_atomic_commit *commit;
 	/* protect async commit */
 	struct mutex commit_lock;
+	/*
+	 * protect some shared overlay resource
+	 * OVL_LAYER_SEL/OVL_PORT_SEL
+	 */
+	struct mutex ovl_lock;
 	struct work_struct commit_work;
 	struct iommu_domain *domain;
 	struct gen_pool *secure_buffer_pool;
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
index c00245d9f523..9b696023ef99 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
@@ -424,9 +424,9 @@ rockchip_atomic_commit_complete(struct rockchip_atomic_commit *commit)
 		rockchip_dmcfreq_vop_bandwidth_update(prv->devfreq, bandwidth,
 						      plane_num);
 
-	mutex_lock(&prv->commit_lock);
+	mutex_lock(&prv->ovl_lock);
 	drm_atomic_helper_commit_planes(dev, state, true);
-	mutex_unlock(&prv->commit_lock);
+	mutex_unlock(&prv->ovl_lock);
 
 	rockchip_drm_psr_inhibit_put_state(state);
 

commit 1da3365c11dec1d54fef8451146cb01f32bf9838
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Fri Aug 13 21:18:13 2021 +0800

    soc: rockchip: mtd_vendor_storage: Register vendor_storage later
    
    Since storage drivers register in module_init, So the vendor_storage
    should be initiated after it.
    
    Change-Id: Icefce56c54713dd56ef992ec527e65fce4f0c977
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/soc/rockchip/mtd_vendor_storage.c b/drivers/soc/rockchip/mtd_vendor_storage.c
index b37a8c8e2201..c840ead59eac 100644
--- a/drivers/soc/rockchip/mtd_vendor_storage.c
+++ b/drivers/soc/rockchip/mtd_vendor_storage.c
@@ -447,4 +447,4 @@ static int __init vendor_storage_init(void)
 	return ret;
 }
 
-module_init(vendor_storage_init);
+device_initcall_sync(vendor_storage_init);

commit e0123a61bde957422466944ae5460f23b89c4497
Author: Shunqing Chen <csq@rock-chips.com>
Date:   Sat Jul 31 11:52:01 2021 +0800

    media: i2c: rk628csi: fix division by zero
    
    [<c010f0c4>] (unwind_backtrace) from [<c010b3dc>] (show_stack+0x10/0x14)
    [<c010b3dc>] (show_stack) from [<c03fcff8>] (dump_stack+0x7c/0x98)
    [<c03fcff8>] (dump_stack) from [<c03fb0c4>] (Ldiv0_64+0x8/0x18)
    [<c03fb0c4>] (Ldiv0_64) from [<c06bb3e8>] (enable_stream+0x290/0x940)
    [<c06bb3e8>] (enable_stream) from [<c06bc784>]
    (rk628_csi_s_stream+0x10/0x18)
    [<c06bc784>] (rk628_csi_s_stream) from [<c06f7538>]
    (rkisp1_pipeline_set_stream+0x7c/0x224)
    [<c06f7538>] (rkisp1_pipeline_set_stream) from [<c06ff754>]
    (rkisp1_start_streaming+0x364/0x69c)
    [<c06ff754>] (rkisp1_start_streaming) from [<c06dc918>]
    (vb2_start_streaming+0x64/0x128)
    [<c06dc918>] (vb2_start_streaming) from [<c06dd4a8>]
    (vb2_core_streamon+0xd0/0x12c)
    [<c06dd4a8>] (vb2_core_streamon) from [<c06ccc4c>]
    (__video_do_ioctl+0x224/0x2bc)
    [<c06ccc4c>] (__video_do_ioctl) from [<c06cc668>]
    (video_usercopy+0x294/0x648)
    [<c06cc668>] (video_usercopy) from [<c06c65c8>] (v4l2_ioctl+0x5c/0x98)
    [<c06c65c8>] (v4l2_ioctl) from [<c024f21c>] (do_vfs_ioctl+0x94/0x6a0)
    [<c024f21c>] (do_vfs_ioctl) from [<c024f874>] (SyS_ioctl+0x4c/0x70)
    [<c024f874>] (SyS_ioctl) from [<c0107240>] (ret_fast_syscall+0x0/0x54)
    Division by zero in kernel.
    
    Signed-off-by: Shunqing Chen <csq@rock-chips.com>
    Change-Id: Icb94f2ef1dc5575a162faae38e32352c5133ca27

diff --git a/drivers/media/i2c/rk628_csi.c b/drivers/media/i2c/rk628_csi.c
index a0873b27debf..1a42f5fc93bd 100644
--- a/drivers/media/i2c/rk628_csi.c
+++ b/drivers/media/i2c/rk628_csi.c
@@ -39,7 +39,7 @@ static int debug;
 module_param(debug, int, 0644);
 MODULE_PARM_DESC(debug, "debug level (0-3)");
 
-#define DRIVER_VERSION			KERNEL_VERSION(0, 0x0, 0x8)
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x0, 0x9)
 #define RK628_CSI_NAME			"rk628-csi"
 
 #define EDID_NUM_BLOCKS_MAX 		2
@@ -988,6 +988,13 @@ static void rk628_post_process_setup(struct v4l2_subdev *sd)
 	src.vsync_len = bt->vsync;
 	src.vback_porch = bt->vbackporch;
 	src.pixelclock = bt->pixelclock;
+	if (!src.pixelclock) {
+		enable_stream(sd, false);
+		csi->nosignal = true;
+		schedule_delayed_work(&csi->delayed_work_enable_hotplug, HZ / 20);
+		return;
+	}
+
 	src.flags = 0;
 	if (bt->interlaced == V4L2_DV_INTERLACED)
 		src.flags |= DISPLAY_FLAGS_INTERLACED;

commit b9c8169b6a990ac5ba3d25a7f26cbd476f7180f8
Author: Shunhua Lan <lsh@rock-chips.com>
Date:   Tue Jul 20 10:27:49 2021 +0800

    media: i2c: rk628csi: fix audio issues
    
    1. reset hdmirx in cru when hotplug or res change to avoid audio L/R channel swap
    2. disable hdmirx and audio unit when PHY setup
    3. enable audio unit and audio fifo interrupts after N CTS updating
    4. double initial audio fifo when fifo overflow after underflow
    5. initial audio fifo when fifo overflow after underflow
    6. fix i2c access timeout when hdmirx resetting
    7. add 60ms delay after phy locked
    
    Change-Id: I0bc2afe33a52a65c8a028695785fa273339b317b
    Signed-off-by: Shunhua Lan <lsh@rock-chips.com>

diff --git a/drivers/media/i2c/rk628_csi.c b/drivers/media/i2c/rk628_csi.c
index 7180bb9224a4..a0873b27debf 100644
--- a/drivers/media/i2c/rk628_csi.c
+++ b/drivers/media/i2c/rk628_csi.c
@@ -39,7 +39,7 @@ static int debug;
 module_param(debug, int, 0644);
 MODULE_PARM_DESC(debug, "debug level (0-3)");
 
-#define DRIVER_VERSION			KERNEL_VERSION(0, 0x0, 0x7)
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x0, 0x8)
 #define RK628_CSI_NAME			"rk628-csi"
 
 #define EDID_NUM_BLOCKS_MAX 		2
@@ -70,6 +70,7 @@ MODULE_PARM_DESC(debug, "debug level (0-3)");
 #define YUV422_8BIT			0x1e
 /* Test Code: 0x44 (HS RX Control of Lane 0) */
 #define HSFREQRANGE(x)			UPDATE(x, 6, 1)
+#define INIT_FIFO_STATE			64
 
 struct hdcp_keys {
 	u8 KSV[HDCP_KEY_KSV_SIZE];
@@ -82,6 +83,25 @@ struct rk628_hdcp {
 	struct hdcp_keys *keys;
 };
 
+struct rk628_audiostate {
+	u32 hdmirx_aud_clkrate;
+	u32 fs_audio;
+	u32 ctsn_flag;
+	u32 fifo_flag;
+	int init_state;
+	int pre_state;
+	bool fifo_int;
+};
+
+#define is_validfs(x) (x == 32000 || \
+			x == 44100 || \
+			x == 48000 || \
+			x == 88200 || \
+			x == 96000 || \
+			x == 176400 || \
+			x == 192000 || \
+			x == 768000)
+
 struct rk628_csi {
 	struct device *dev;
 	struct rk628 *parent;
@@ -120,6 +140,7 @@ struct rk628_csi {
 	struct regmap *csi_regmap;
 	struct delayed_work delayed_work_enable_hotplug;
 	struct delayed_work delayed_work_res_change;
+	struct delayed_work delayed_work_audio_rate_change;
 	struct delayed_work delayed_work_audio;
 	struct timer_list timer;
 	struct work_struct work_i2c_poll;
@@ -135,7 +156,6 @@ struct rk628_csi {
 	u64 lane_mbps;
 	u8 csi_lanes_in_use;
 	u32 mbus_fmt_code;
-	u64 fs_audio;
 	int hdmirx_irq;
 	int plugin_irq;
 	bool nosignal;
@@ -145,7 +165,11 @@ struct rk628_csi {
 	bool audio_present;
 	bool hpd_output_inverted;
 	bool avi_rcv_rdy;
+	bool ctsn_ints_en;
+	bool vid_ints_en;
+	bool fifo_ints_en;
 	struct rk628_hdcp hdcp;
+	struct rk628_audiostate audio_state;
 };
 
 struct rk628_csi_mode {
@@ -271,6 +295,7 @@ static int mipi_dphy_reset(struct rk628_csi *csi);
 static void mipi_dphy_power_off(struct rk628_csi *csi);
 static void mipi_dphy_init_hsfreqrange(struct rk628_csi *csi);
 static int rk628_hdmirx_phy_power_on(struct v4l2_subdev *sd);
+static int rk628_hdmirx_phy_power_off(struct v4l2_subdev *sd);
 static int rk628_hdmirx_phy_setup(struct v4l2_subdev *sd);
 static void rk628_hdmirx_controller_setup(struct v4l2_subdev *sd);
 static void rk628_csi_format_change(struct v4l2_subdev *sd);
@@ -296,14 +321,14 @@ static bool tx_5v_power_present(struct v4l2_subdev *sd)
 	struct rk628_csi *csi = to_csi(sd);
 
 	cnt = 0;
-	for (i = 0; i < 10; i++) {
+	for (i = 0; i < 5; i++) {
 		val = gpiod_get_value(csi->plugin_det_gpio);
 		if (val > 0)
 			cnt++;
-		usleep_range(2000, 2100);
+		usleep_range(500, 600);
 	}
 
-	ret = (cnt >= 7) ? true : false;
+	ret = (cnt >= 3) ? true : false;
 	v4l2_dbg(1, debug, sd, "%s: %d\n", __func__, ret);
 
 	return ret;
@@ -331,7 +356,26 @@ static int get_audio_sampling_rate(struct v4l2_subdev *sd)
 	if (no_signal(sd))
 		return 0;
 
-	return csi->fs_audio;
+	return csi->audio_state.fs_audio;
+}
+
+static void rk628_hdmirx_ctrl_enable(struct v4l2_subdev *sd, int en)
+{
+	u32 mask;
+	struct rk628_csi *csi = to_csi(sd);
+
+	if (en) {
+		/* don't enable audio until N CTS updated */
+		mask = HDMI_ENABLE_MASK;
+		v4l2_dbg(1, debug, sd, "%s: %#x %d\n", __func__, mask, en);
+		regmap_update_bits(csi->hdmirx_regmap, HDMI_RX_DMI_DISABLE_IF,
+				   mask, HDMI_ENABLE(1) | AUD_ENABLE(1));
+	} else {
+		mask = AUD_ENABLE_MASK | HDMI_ENABLE_MASK;
+		v4l2_dbg(1, debug, sd, "%s: %#x %d\n", __func__, mask, en);
+		regmap_update_bits(csi->hdmirx_regmap, HDMI_RX_DMI_DISABLE_IF,
+				   mask, HDMI_ENABLE(0) | AUD_ENABLE(0));
+	}
 }
 
 static int rk628_csi_get_detected_timings(struct v4l2_subdev *sd,
@@ -463,22 +507,22 @@ static void rk628_csi_delayed_work_enable_hotplug(struct work_struct *work)
 	v4l2_dbg(1, debug, sd, "%s: 5v_det:%d\n", __func__, plugin);
 	if (plugin) {
 		rk628_csi_enable_interrupts(sd, false);
+		rk628_hdmirx_audio_setup(sd);
 		rk628_csi_set_hdmi_hdcp(sd, csi->enable_hdcp);
 		rk628_hdmirx_hpd_ctrl(sd, true);
 		rk628_hdmirx_config_all(sd);
 		rk628_csi_enable_interrupts(sd, true);
 		regmap_update_bits(csi->grf, GRF_SYSTEM_CON0,
 				SW_I2S_DATA_OEN_MASK, SW_I2S_DATA_OEN(0));
-		schedule_delayed_work(&csi->delayed_work_audio, 0);
 	} else {
 		rk628_csi_enable_interrupts(sd, false);
 		enable_stream(sd, false);
 		cancel_delayed_work(&csi->delayed_work_res_change);
+		cancel_delayed_work(&csi->delayed_work_audio);
 		rk628_hdmirx_hpd_ctrl(sd, false);
+		rk628_hdmirx_phy_power_off(sd);
+		rk628_hdmirx_controller_reset(sd);
 		csi->nosignal = true;
-		regmap_update_bits(csi->grf, GRF_SYSTEM_CON0,
-				SW_I2S_DATA_OEN_MASK, SW_I2S_DATA_OEN(1));
-		cancel_delayed_work(&csi->delayed_work_audio);
 	}
 	mutex_unlock(&csi->confctl_mutex);
 }
@@ -523,13 +567,16 @@ static void rk628_delayed_work_res_change(struct work_struct *work)
 	if (plugin) {
 		if (rk628_check_resulotion_change(sd)) {
 			v4l2_dbg(1, debug, sd, "res change, recfg ctrler and phy!\n");
+			cancel_delayed_work_sync(&csi->delayed_work_audio);
+			rk628_hdmirx_phy_power_off(sd);
+			rk628_hdmirx_controller_reset(sd);
+			rk628_hdmirx_audio_setup(sd);
+			rk628_csi_set_hdmi_hdcp(sd, csi->enable_hdcp);
+			rk628_hdmirx_hpd_ctrl(sd, true);
 			rk628_hdmirx_config_all(sd);
 			rk628_csi_enable_interrupts(sd, true);
 			regmap_update_bits(csi->grf, GRF_SYSTEM_CON0,
-					   SW_I2S_DATA_OEN_MASK,
-					   SW_I2S_DATA_OEN(0));
-			schedule_delayed_work(&csi->delayed_work_audio,
-					      msecs_to_jiffies(0));
+					   SW_I2S_DATA_OEN_MASK, SW_I2S_DATA_OEN(0));
 		} else {
 			rk628_csi_format_change(sd);
 			csi->nosignal = false;
@@ -641,14 +688,11 @@ static int rk628_hdmi_hdcp_load_key(struct rk628_csi *csi)
 static void rk628_csi_set_hdmi_hdcp(struct v4l2_subdev *sd, bool en)
 {
 	struct rk628_csi *csi = to_csi(sd);
-	u32 val;
 
 	v4l2_dbg(1, debug, sd, "%s: %sable\n", __func__, en ? "en" : "dis");
 
 	if (en) {
-		regmap_read(csi->hdmirx_regmap, HDMI_RX_HDCP_CTRL, &val);
-		if (!(val & HDCP_ENABLE_MASK))
-			rk628_hdmi_hdcp_load_key(csi);
+		rk628_hdmi_hdcp_load_key(csi);
 	} else {
 		regmap_update_bits(csi->hdmirx_regmap, HDMI_RX_HDCP_CTRL,
 				HDCP_ENABLE_MASK |
@@ -1115,10 +1159,11 @@ static int rk628_hdmirx_phy_power_on(struct v4l2_subdev *sd)
 			v4l2_err(sd, "hdmi rxphy power off failed!\n");
 		else
 			csi->rxphy_pwron = false;
+		usleep_range(100, 100);
 	}
 
-	usleep_range(100, 100);
 	if (csi->rxphy_pwron == false) {
+		rk628_hdmirx_ctrl_enable(sd, 0);
 		ret = phy_power_on(csi->rxphy);
 		if (ret) {
 			csi->rxphy_pwron = false;
@@ -1126,11 +1171,30 @@ static int rk628_hdmirx_phy_power_on(struct v4l2_subdev *sd)
 		} else {
 			csi->rxphy_pwron = true;
 		}
+		rk628_hdmirx_ctrl_enable(sd, 1);
+		msleep(60);
 	}
 
 	return ret;
 }
 
+static int rk628_hdmirx_phy_power_off(struct v4l2_subdev *sd)
+{
+	struct rk628_csi *csi = to_csi(sd);
+	int ret = 0;
+
+	if (csi->rxphy_pwron) {
+		v4l2_dbg(1, debug, sd, "rxphy power off!\n");
+		ret = phy_power_off(csi->rxphy);
+		if (ret)
+			v4l2_err(sd, "hdmi rxphy power off failed!\n");
+		else
+			csi->rxphy_pwron = false;
+	}
+	usleep_range(100, 100);
+	return ret;
+}
+
 static void rk628_hdmirx_vid_enable(struct v4l2_subdev *sd, bool en)
 {
 	struct rk628_csi *csi = to_csi(sd);
@@ -1149,12 +1213,106 @@ static void rk628_hdmirx_controller_reset(struct v4l2_subdev *sd)
 {
 	struct rk628_csi *csi = to_csi(sd);
 
+	v4l2_dbg(1, debug, sd, "%s reset hdmirx_controller\n", __func__);
+	reset_control_assert(csi->rst_hdmirx_pon);
+	reset_control_deassert(csi->rst_hdmirx_pon);
 	regmap_write(csi->hdmirx_regmap, HDMI_RX_DMI_SW_RST, 0x000101ff);
 	regmap_write(csi->hdmirx_regmap, HDMI_RX_DMI_DISABLE_IF, 0x00000000);
 	regmap_write(csi->hdmirx_regmap, HDMI_RX_DMI_DISABLE_IF, 0x0000017f);
 	regmap_write(csi->hdmirx_regmap, HDMI_RX_DMI_DISABLE_IF, 0x0001017f);
 }
 
+static void rk628_hdmirx_audio_fifo_init(struct v4l2_subdev *sd)
+{
+	struct rk628_csi *csi = to_csi(sd);
+
+	v4l2_dbg(1, debug, sd, "%s initial fifo\n", __func__);
+	regmap_write(csi->hdmirx_regmap, HDMI_RX_AUD_FIFO_ICLR, 0x1f);
+	regmap_write(csi->hdmirx_regmap, HDMI_RX_AUD_FIFO_CTRL, 0x10001);
+	regmap_write(csi->hdmirx_regmap, HDMI_RX_AUD_FIFO_CTRL, 0x10000);
+	csi->audio_state.pre_state = csi->audio_state.init_state = INIT_FIFO_STATE*4;
+}
+
+static void rk628_hdmirx_audio_fifo_initd(struct v4l2_subdev *sd)
+{
+	struct rk628_csi *csi = to_csi(sd);
+
+	v4l2_dbg(1, debug, sd, "%s double initial fifo\n", __func__);
+	regmap_write(csi->hdmirx_regmap, HDMI_RX_AUD_FIFO_ICLR, 0x1f);
+	regmap_update_bits(csi->hdmirx_regmap, HDMI_RX_AUD_FIFO_TH,
+			   AFIF_TH_START_MASK,
+			   AFIF_TH_START(192));
+	regmap_write(csi->hdmirx_regmap, HDMI_RX_AUD_FIFO_CTRL, 0x10001);
+	regmap_write(csi->hdmirx_regmap, HDMI_RX_AUD_FIFO_CTRL, 0x10000);
+	regmap_write(csi->hdmirx_regmap, HDMI_RX_AUD_FIFO_CTRL, 0x10001);
+	regmap_write(csi->hdmirx_regmap, HDMI_RX_AUD_FIFO_CTRL, 0x10000);
+	regmap_update_bits(csi->hdmirx_regmap, HDMI_RX_AUD_FIFO_TH,
+			   AFIF_TH_START_MASK,
+			   AFIF_TH_START(INIT_FIFO_STATE));
+	csi->audio_state.pre_state = csi->audio_state.init_state = INIT_FIFO_STATE*4;
+}
+
+static uint32_t rk628_hdmirx_audio_fs(struct v4l2_subdev *sd)
+{
+	struct rk628_csi *csi = to_csi(sd);
+	u64 tmdsclk = 0;
+	u32 clkrate = 0, cts_decoded = 0, n_decoded = 0, fs_audio = 0;
+
+	/* fout=128*fs=ftmds*N/CTS */
+	regmap_read(csi->hdmirx_regmap, HDMI_RX_HDMI_CKM_RESULT, &clkrate);
+	clkrate = clkrate & 0xffff;
+	/* tmdsclk = (clkrate/1000) * 49500000 */
+	tmdsclk = clkrate * (49500000 / 1000);
+	regmap_read(csi->hdmirx_regmap, HDMI_RX_PDEC_ACR_CTS, &cts_decoded);
+	regmap_read(csi->hdmirx_regmap, HDMI_RX_PDEC_ACR_N, &n_decoded);
+	if (cts_decoded != 0) {
+		fs_audio = div_u64((tmdsclk * n_decoded), cts_decoded);
+		fs_audio /= 128;
+		fs_audio = div_u64(fs_audio + 50, 100);
+		fs_audio *= 100;
+	}
+	v4l2_dbg(1, debug, sd,
+		 "%s: clkrate:%u tmdsclk:%llu, n_decoded:%u, cts_decoded:%u, fs_audio:%u\n",
+		 __func__, clkrate, tmdsclk, n_decoded, cts_decoded, fs_audio);
+	if (!is_validfs(fs_audio))
+		fs_audio = 0;
+	return fs_audio;
+}
+
+static void rk628_hdmirx_audio_clk_set_rate(struct v4l2_subdev *sd, u32 rate)
+{
+	struct rk628_csi *csi = to_csi(sd);
+
+	v4l2_dbg(2, debug, sd, "%s: %u to %u\n",
+		 __func__, csi->audio_state.hdmirx_aud_clkrate, rate);
+	clk_set_rate(csi->clk_hdmirx_aud, rate);
+	csi->audio_state.hdmirx_aud_clkrate = rate;
+}
+
+static void rk628_hdmirx_audio_clk_inc_rate(struct v4l2_subdev *sd, int dis)
+{
+	struct rk628_csi *csi = to_csi(sd);
+	u32 hdmirx_aud_clkrate = csi->audio_state.hdmirx_aud_clkrate + dis;
+
+	v4l2_dbg(2, debug, sd, "%s: %u to %u\n",
+		 __func__, csi->audio_state.hdmirx_aud_clkrate, hdmirx_aud_clkrate);
+	clk_set_rate(csi->clk_hdmirx_aud, hdmirx_aud_clkrate);
+	csi->audio_state.hdmirx_aud_clkrate = hdmirx_aud_clkrate;
+}
+
+static void rk628_hdmirx_audio_set_fs(struct v4l2_subdev *sd, u32 fs_audio)
+{
+	struct rk628_csi *csi = to_csi(sd);
+	u32 hdmirx_aud_clkrate_t = fs_audio*128;
+
+	v4l2_dbg(2, debug, sd, "%s: %u to %u with fs %u\n", __func__,
+		 csi->audio_state.hdmirx_aud_clkrate, hdmirx_aud_clkrate_t,
+		 fs_audio);
+	clk_set_rate(csi->clk_hdmirx_aud, hdmirx_aud_clkrate_t);
+	csi->audio_state.hdmirx_aud_clkrate = hdmirx_aud_clkrate_t;
+	csi->audio_state.fs_audio = fs_audio;
+}
+
 static void rk628_hdmirx_audio_setup(struct v4l2_subdev *sd)
 {
 	struct rk628_csi *csi = to_csi(sd);
@@ -1162,9 +1320,15 @@ static void rk628_hdmirx_audio_setup(struct v4l2_subdev *sd)
 
 	audio_pll_n = 5644;
 	audio_pll_cts = 148500;
-
-	clk_set_rate(csi->clk_hdmirx_aud, 5644800);
-
+	csi->audio_state.ctsn_flag = 0;
+	csi->audio_state.fs_audio = 0;
+	csi->audio_state.pre_state = 0;
+	csi->audio_state.init_state = INIT_FIFO_STATE*4;
+	csi->audio_state.fifo_int = false;
+	csi->fifo_ints_en = false;
+	csi->ctsn_ints_en = false;
+
+	rk628_hdmirx_audio_clk_set_rate(sd, 5644800);
 	/* manual aud CTS */
 	regmap_write(csi->hdmirx_regmap, HDMI_RX_AUDPLL_GEN_CTS, audio_pll_cts);
 	/* manual aud N */
@@ -1199,14 +1363,15 @@ static void rk628_hdmirx_audio_setup(struct v4l2_subdev *sd)
 			AUTO_ACLK_MUTE(2)	|
 			AUD_MUTE_SPEED(1)	|
 			AUD_AVMUTE_EN(1)	|
-			AUD_MUTE_SEL(1)		|
+			AUD_MUTE_SEL(0)		|
 			AUD_MUTE_MODE(1));
 
 	regmap_write(csi->hdmirx_regmap, HDMI_RX_AUD_PAO_CTRL,
 			PAO_RATE(0));
 	regmap_write(csi->hdmirx_regmap, HDMI_RX_AUD_CHEXTR_CTRL,
 			AUD_LAYOUT_CTRL(1));
-
+	csi->ctsn_ints_en = true;
+	regmap_write(csi->hdmirx_regmap, HDMI_RX_PDEC_IEN_SET, ACR_N_CHG_ICLR | ACR_CTS_CHG_ICLR);
 	/* audio detect */
 	regmap_write(csi->hdmirx_regmap, HDMI_RX_PDEC_AUDIODET_CTRL,
 			AUDIODET_THRESHOLD(0));
@@ -1218,104 +1383,85 @@ static void rk628_csi_delayed_work_audio(struct work_struct *work)
 	struct rk628_csi *csi = container_of(dwork, struct rk628_csi,
 			delayed_work_audio);
 	struct v4l2_subdev *sd = &csi->sd;
-	u32 val;
-	static int hdmirx_aud_clkrate = 5644800,
-		   init_state = 256, pre_state, cur_state;
-	u32 clkrate = 0, cts_decoded = 0, n_decoded = 0;
-	u64 tmdsclk = 0, fs_audio = 0;
-	static u64 pre_fs_audio;
-
-	/* fout=128*fs=ftmds*N/CTS */
-	regmap_read(csi->hdmirx_regmap, HDMI_RX_HDMI_CKM_RESULT, &clkrate);
-	clkrate = clkrate & 0xffff;
-	/* tmdsclk = (clkrate/1000) * 49500000 */
-	tmdsclk = clkrate * (49500000 / 1000);
-	regmap_read(csi->hdmirx_regmap, HDMI_RX_PDEC_ACR_CTS, &cts_decoded);
-	regmap_read(csi->hdmirx_regmap, HDMI_RX_PDEC_ACR_N, &n_decoded);
-	/* fs_audio = ((tmdsclk * n_decoded) / cts_decoded ) / 128 */
-	if (cts_decoded != 0) {
-		fs_audio = div_u64((tmdsclk * n_decoded), cts_decoded);
-		fs_audio = div_u64(fs_audio, 128);
-		fs_audio = div_u64(fs_audio + 50, 100);
-		fs_audio *= 100;
-	}
-	v4l2_dbg(2, debug, sd,
-		"%s: clkrate:%d tmdsclk:%llu, n_decoded:%d, cts_decoded:%d, fs_audio:%llu\n",
-		__func__, clkrate, tmdsclk, n_decoded, cts_decoded, fs_audio);
-	if ((fs_audio != 0) && (abs(fs_audio - pre_fs_audio) > 1000)) {
-		hdmirx_aud_clkrate = 128 * fs_audio;
-		switch (fs_audio) {
-		case 88200:
-			hdmirx_aud_clkrate = 11111000;
-			break;
-		case 96000:
-			hdmirx_aud_clkrate = 12121000;
-			break;
-		case 176400:
-			hdmirx_aud_clkrate = 22222000;
-			break;
-		case 192000:
-			hdmirx_aud_clkrate = 23529000;
-			break;
-		default:
-			break;
-		}
-		clk_set_rate(csi->clk_hdmirx_aud, hdmirx_aud_clkrate);
-		v4l2_dbg(2, debug, sd,
-			"%s: audo switch clk_hdmirx_aud to %d  fs_audio:%llu pre_fs_audio:%llu\n",
-			__func__, hdmirx_aud_clkrate, fs_audio, pre_fs_audio);
-		if (pre_fs_audio != 0) {
-			regmap_write(csi->hdmirx_regmap,
-					HDMI_RX_AUD_FIFO_ICLR, 0x1f);
-			regmap_write(csi->hdmirx_regmap,
-					HDMI_RX_AUD_FIFO_CTRL, 0x10001);
-			regmap_write(csi->hdmirx_regmap,
-					HDMI_RX_AUD_FIFO_CTRL, 0x10000);
-		}
-		pre_fs_audio = fs_audio;
-		csi->fs_audio = fs_audio;
-	}
-
+	struct rk628_audiostate *audio_state = &csi->audio_state;
+	u32 fs_audio;
+	int cur_state, init_state, pre_state;
+
+	init_state = audio_state->init_state;
+	pre_state = audio_state->pre_state;
+	fs_audio = rk628_hdmirx_audio_fs(sd);
+	if (!is_validfs(fs_audio)) {
+		v4l2_dbg(2, debug, sd, "%s: no supported fs(%u)\n", __func__, fs_audio);
+		goto exit;
+	}
+	if (abs(fs_audio - audio_state->fs_audio) > 1000)
+		rk628_hdmirx_audio_set_fs(sd, fs_audio);
 	regmap_read(csi->hdmirx_regmap, HDMI_RX_AUD_FIFO_FILLSTS1, &cur_state);
-	v4l2_dbg(2, debug, sd,
-		"%s: HDMI_RX_AUD_FIFO_FILLSTS1:%#x, single offset:%d, total offset:%d\n",
-		__func__, cur_state, cur_state-pre_state, cur_state-init_state);
+	v4l2_dbg(2, debug, sd, "%s: HDMI_RX_AUD_FIFO_FILLSTS1:%#x, single offset:%d, total offset:%d\n",
+		 __func__, cur_state, cur_state - pre_state, cur_state - init_state);
 	if (cur_state != 0)
 		csi->audio_present = true;
 	else
 		csi->audio_present = false;
-	if ((cur_state-init_state) > 16 && (cur_state-pre_state) > 0) {
-		hdmirx_aud_clkrate += 10;
-		clk_set_rate(csi->clk_hdmirx_aud, hdmirx_aud_clkrate);
-		v4l2_dbg(2, debug, sd, "%s: (cur_state-init_state) > 16 hdmirx_aud_clkrate:%d\n",
-				__func__, hdmirx_aud_clkrate);
-	} else if ((cur_state != 0) && (cur_state-init_state) < -16 && (cur_state-pre_state) < 0) {
-		hdmirx_aud_clkrate -= 10;
-		clk_set_rate(csi->clk_hdmirx_aud, hdmirx_aud_clkrate);
-		v4l2_dbg(2, debug, sd, "%s: (cur_state-init_state) < -16 hdmirx_aud_clkrate:%d\n",
-				__func__, hdmirx_aud_clkrate);
-	}
-	pre_state = cur_state;
-
-	regmap_read(csi->hdmirx_regmap, HDMI_RX_AUD_FIFO_ISTS, &val);
-	v4l2_dbg(2, debug, sd, "%s: HDMI_RX_AUD_FIFO_ISTS:%#x\n", __func__, val);
-	if ((val != 0x9) && ((val & 0x10) || (val & 0x8))) {
-		regmap_write(csi->hdmirx_regmap,
-				HDMI_RX_AUD_FIFO_ICLR, 0x1f);
-		regmap_write(csi->hdmirx_regmap,
-				HDMI_RX_AUD_FIFO_CTRL, 0x10001);
-		/*msleep(1);*/
-		regmap_write(csi->hdmirx_regmap,
-				HDMI_RX_AUD_FIFO_CTRL, 0x10000);
-		pre_state = cur_state = 0;
-
-		v4l2_err(sd, "%s: HDMI_RX_AUD_FIFO_ISTS:%#x, underflow or overflow\n",
-				__func__, val);
-	}
 
+	if ((cur_state - init_state) > 16 && (cur_state - pre_state) > 0)
+		rk628_hdmirx_audio_clk_inc_rate(sd, 10);
+	else if ((cur_state != 0) && (cur_state - init_state) < -16 && (cur_state - pre_state) < 0)
+		rk628_hdmirx_audio_clk_inc_rate(sd, -10);
+	audio_state->pre_state = cur_state;
+exit:
 	schedule_delayed_work(&csi->delayed_work_audio, msecs_to_jiffies(1000));
 }
 
+static void rk628_csi_delayed_work_audio_rate_change(struct work_struct *work)
+{
+	u32 fifo_ints, fifo_fillsts;
+	u32 fs_audio;
+	struct delayed_work *dwork = to_delayed_work(work);
+	struct rk628_csi *csi = container_of(dwork, struct rk628_csi,
+					     delayed_work_audio_rate_change);
+	struct v4l2_subdev *sd = &csi->sd;
+
+	mutex_lock(&csi->confctl_mutex);
+	fs_audio = rk628_hdmirx_audio_fs(sd);
+	v4l2_dbg(1, debug, sd, "%s get audio fs %u\n", __func__, fs_audio);
+	if (csi->audio_state.ctsn_flag == (ACR_N_CHG_ICLR | ACR_CTS_CHG_ICLR)) {
+		csi->audio_state.ctsn_flag = 0;
+		if (is_validfs(fs_audio)) {
+			rk628_hdmirx_audio_set_fs(sd, fs_audio);
+			regmap_read(csi->hdmirx_regmap, HDMI_RX_AUD_FIFO_ISTS, &fifo_ints);
+			v4l2_dbg(1, debug, sd, "%s fifo ints %#x\n", __func__, fifo_ints);
+			if ((fifo_ints & 0x18) == 0x18)
+				rk628_hdmirx_audio_fifo_initd(sd);
+			else if (fifo_ints & 0x18)
+				rk628_hdmirx_audio_fifo_init(sd);
+			regmap_update_bits(csi->hdmirx_regmap, HDMI_RX_DMI_DISABLE_IF,
+					   AUD_ENABLE_MASK, AUD_ENABLE(1));
+			/* We start audio work after recieveing cts n interrupt */
+			csi->fifo_ints_en = true;
+			regmap_write(csi->hdmirx_regmap, HDMI_RX_AUD_FIFO_IEN_SET,
+				     AFIF_OVERFL_ISTS | AFIF_UNDERFL_ISTS);
+			schedule_delayed_work(&csi->delayed_work_audio, msecs_to_jiffies(1000));
+		} else {
+			v4l2_warn(sd, "%s invalid fs when ctsn updating\n", __func__);
+		}
+	}
+	if (csi->audio_state.fifo_int) {
+		csi->audio_state.fifo_int = false;
+		if (is_validfs(fs_audio))
+			rk628_hdmirx_audio_set_fs(sd, fs_audio);
+		regmap_read(csi->hdmirx_regmap, HDMI_RX_AUD_FIFO_FILLSTS1, &fifo_fillsts);
+		if (fifo_fillsts) {
+			v4l2_dbg(1, debug, sd, "%s overflow after underflow\n", __func__);
+			rk628_hdmirx_audio_fifo_initd(sd);
+		} else {
+			v4l2_dbg(1, debug, sd, "%s underflow after overflow\n", __func__);
+			rk628_hdmirx_audio_fifo_init(sd);
+		}
+	}
+	mutex_unlock(&csi->confctl_mutex);
+}
+
 static void rk628_hdmirx_controller_setup(struct v4l2_subdev *sd)
 {
 	struct rk628_csi *csi = to_csi(sd);
@@ -1427,7 +1573,6 @@ static int rk628_hdmirx_phy_setup(struct v4l2_subdev *sd)
 	if (i == RXPHY_CFG_MAX_TIMES) {
 		return -1;
 	}
-
 	return 0;
 }
 
@@ -1472,7 +1617,6 @@ static void rk628_csi_initial_setup(struct v4l2_subdev *sd)
 	def_edid.edid = edid_init_data;
 	rk628_csi_s_edid(sd, &def_edid);
 	rk628_csi_set_hdmi_hdcp(sd, false);
-	rk628_hdmirx_audio_setup(sd);
 
 	mipi_dphy_reset(csi);
 	mipi_dphy_power_on(csi);
@@ -1505,41 +1649,79 @@ static void rk628_csi_format_change(struct v4l2_subdev *sd)
 
 static void rk628_csi_enable_interrupts(struct v4l2_subdev *sd, bool en)
 {
-	u32 val_a, val_b;
+	u32 pdec_ien, md_ien;
+	u32 pdec_mask = 0, md_mask = 0;
 	struct rk628_csi *csi = to_csi(sd);
 
+	pdec_mask |= AVI_RCV_ENSET;
+	md_mask = VACT_LIN_ENSET | HACT_PIX_ENSET | HS_CLK_ENSET |
+		  DE_ACTIVITY_ENSET | VS_ACT_ENSET | HS_ACT_ENSET;
 	v4l2_dbg(1, debug, sd, "%s: %sable\n", __func__, en ? "en" : "dis");
 	/* clr irq */
-	regmap_write(csi->hdmirx_regmap, HDMI_RX_MD_ICLR, 0xffffffff);
-	regmap_write(csi->hdmirx_regmap, HDMI_RX_PDEC_ICLR, 0xffffffff);
-
+	regmap_write(csi->hdmirx_regmap, HDMI_RX_MD_ICLR, md_mask);
+	regmap_write(csi->hdmirx_regmap, HDMI_RX_PDEC_ICLR, pdec_mask);
 	if (en) {
-		regmap_write(csi->hdmirx_regmap, HDMI_RX_MD_IEN_SET,
-				VACT_LIN_ENSET |
-				HACT_PIX_ENSET |
-				HS_CLK_ENSET |
-				DE_ACTIVITY_ENSET |
-				VS_ACT_ENSET |
-				HS_ACT_ENSET);
-		regmap_write(csi->hdmirx_regmap, HDMI_RX_PDEC_IEN_SET,
-				AVI_RCV_ENSET);
+		regmap_write(csi->hdmirx_regmap, HDMI_RX_MD_IEN_SET, md_mask);
+		regmap_write(csi->hdmirx_regmap, HDMI_RX_PDEC_IEN_SET, pdec_mask);
+		csi->vid_ints_en = true;
 	} else {
-		regmap_write(csi->hdmirx_regmap, HDMI_RX_MD_IEN_CLR,
-				0xffffffff);
-		regmap_write(csi->hdmirx_regmap, HDMI_RX_PDEC_IEN_CLR,
-				0xffffffff);
+		regmap_write(csi->hdmirx_regmap, HDMI_RX_MD_IEN_CLR, md_mask);
+		regmap_write(csi->hdmirx_regmap, HDMI_RX_PDEC_IEN_CLR, pdec_mask);
+		regmap_write(csi->hdmirx_regmap, HDMI_RX_AUD_FIFO_IEN_CLR, 0x1f);
+		csi->vid_ints_en = false;
 	}
 	usleep_range(5000, 5000);
+	regmap_read(csi->hdmirx_regmap, HDMI_RX_MD_IEN, &md_ien);
+	regmap_read(csi->hdmirx_regmap, HDMI_RX_PDEC_IEN, &pdec_ien);
+	v4l2_dbg(1, debug, sd, "%s MD_IEN:%#x, PDEC_IEN:%#x\n", __func__, md_ien, pdec_ien);
+}
+
+static void rk628_csi_isr_ctsn(struct v4l2_subdev *sd, u32 pdec_ints)
+{
+	struct rk628_csi *csi = to_csi(sd);
+	u32 ctsn_mask = ACR_N_CHG_ICLR | ACR_CTS_CHG_ICLR;
 
-	regmap_read(csi->hdmirx_regmap, HDMI_RX_MD_IEN, &val_a);
-	regmap_read(csi->hdmirx_regmap, HDMI_RX_PDEC_IEN, &val_b);
-	v4l2_dbg(1, debug, sd, "%s MD_IEN:%#x, PDEC_IEN:%#x\n",
-			__func__, val_a, val_b);
+	v4l2_dbg(1, debug, sd, "%s: pdec_ints:%#x\n", __func__, pdec_ints);
+	/* cts & n both need update but maybe come diff int */
+	if (pdec_ints & ACR_N_CHG_ICLR)
+		csi->audio_state.ctsn_flag |= ACR_N_CHG_ICLR;
+	if (pdec_ints & ACR_CTS_CHG_ICLR)
+		csi->audio_state.ctsn_flag |= ACR_CTS_CHG_ICLR;
+	if (csi->audio_state.ctsn_flag == ctsn_mask) {
+		v4l2_dbg(1, debug, sd, "%s: ctsn updated, disable ctsn int\n", __func__);
+		regmap_write(csi->hdmirx_regmap, HDMI_RX_PDEC_IEN_CLR, ctsn_mask);
+		csi->ctsn_ints_en = false;
+		schedule_delayed_work(&csi->delayed_work_audio_rate_change, 0);
+	}
+	regmap_write(csi->hdmirx_regmap, HDMI_RX_PDEC_ICLR, pdec_ints & ctsn_mask);
+}
+
+static void rk628_csi_isr_fifoints(struct v4l2_subdev *sd, u32 fifo_ints)
+{
+	struct rk628_csi *csi = to_csi(sd);
+	u32 fifo_mask = AFIF_OVERFL_ISTS | AFIF_UNDERFL_ISTS;
+
+	v4l2_dbg(1, debug, sd, "%s: fifo_ints:%#x\n", __func__, fifo_ints);
+	/* cts & n both need update but maybe come diff int */
+	if (fifo_ints & AFIF_OVERFL_ISTS) {
+		v4l2_dbg(1, debug, sd, "%s: Audio FIFO overflow\n", __func__);
+		csi->audio_state.fifo_flag |= AFIF_OVERFL_ISTS;
+	}
+	if (fifo_ints & AFIF_UNDERFL_ISTS) {
+		v4l2_dbg(1, debug, sd, "%s: Audio FIFO underflow\n", __func__);
+		csi->audio_state.fifo_flag |= AFIF_UNDERFL_ISTS;
+	}
+	if (csi->audio_state.fifo_flag == fifo_mask) {
+		csi->audio_state.fifo_int = true;
+		csi->audio_state.fifo_flag = 0;
+		schedule_delayed_work(&csi->delayed_work_audio_rate_change, 0);
+	}
+	regmap_write(csi->hdmirx_regmap, HDMI_RX_AUD_FIFO_ICLR, fifo_ints & fifo_mask);
 }
 
 static int rk628_csi_isr(struct v4l2_subdev *sd, u32 status, bool *handled)
 {
-	u32 md_ints, pdec_ints, hact, vact;
+	u32 md_ints, pdec_ints, fifo_ints, hact, vact;
 	bool plugin;
 	struct rk628_csi *csi = to_csi(sd);
 
@@ -1547,44 +1729,56 @@ static int rk628_csi_isr(struct v4l2_subdev *sd, u32 status, bool *handled)
 		v4l2_err(sd, "handled NULL, err return!\n");
 		return -EINVAL;
 	}
-
-	regmap_read(csi->hdmirx_regmap, HDMI_RX_MD_ISTS, &md_ints);
 	regmap_read(csi->hdmirx_regmap, HDMI_RX_PDEC_ISTS, &pdec_ints);
-	plugin = tx_5v_power_present(sd);
-	v4l2_dbg(1, debug, sd, "%s: md_ints: %#x, pdec_ints:%#x, plugin: %d\n",
-		__func__, md_ints, pdec_ints, plugin);
-
-	if ((md_ints & (VACT_LIN_ISTS | HACT_PIX_ISTS |
-			HS_CLK_ISTS | DE_ACTIVITY_ISTS |
-			VS_ACT_ISTS | HS_ACT_ISTS))
-			&& plugin) {
-
-		regmap_read(csi->hdmirx_regmap, HDMI_RX_MD_HACT_PX, &hact);
-		regmap_read(csi->hdmirx_regmap, HDMI_RX_MD_VAL, &vact);
-		v4l2_dbg(1, debug, sd, "%s: HACT:%#x, VACT:%#x\n",
-				__func__, hact, vact);
-
-		rk628_csi_enable_interrupts(sd, false);
-		enable_stream(sd, false);
-		csi->nosignal = true;
-		schedule_delayed_work(&csi->delayed_work_res_change, HZ / 2);
-
-		v4l2_dbg(1, debug, sd, "%s: hact/vact change, md_ints: %#x\n",
-				__func__, (u32)(md_ints & (VACT_LIN_ISTS |
-					HACT_PIX_ISTS)));
-		*handled = true;
+	if (csi->ctsn_ints_en) {
+		if (pdec_ints & (ACR_N_CHG_ICLR | ACR_CTS_CHG_ICLR)) {
+			rk628_csi_isr_ctsn(sd, pdec_ints);
+			pdec_ints &= ~(ACR_CTS_CHG_ICLR | ACR_CTS_CHG_ICLR);
+			*handled = true;
+		}
+	}
+	if (csi->fifo_ints_en) {
+		regmap_read(csi->hdmirx_regmap, HDMI_RX_AUD_FIFO_ISTS, &fifo_ints);
+		if (fifo_ints & 0x18) {
+			rk628_csi_isr_fifoints(sd, fifo_ints);
+			*handled = true;
+		}
 	}
+	if (csi->vid_ints_en) {
+		regmap_read(csi->hdmirx_regmap, HDMI_RX_MD_ISTS, &md_ints);
+		plugin = tx_5v_power_present(sd);
+		v4l2_dbg(1, debug, sd, "%s: md_ints: %#x, pdec_ints:%#x, plugin: %d\n",
+			 __func__, md_ints, pdec_ints, plugin);
+
+		if ((md_ints & (VACT_LIN_ISTS | HACT_PIX_ISTS |
+				HS_CLK_ISTS | DE_ACTIVITY_ISTS |
+				VS_ACT_ISTS | HS_ACT_ISTS))
+				&& plugin) {
+
+			regmap_read(csi->hdmirx_regmap, HDMI_RX_MD_HACT_PX, &hact);
+			regmap_read(csi->hdmirx_regmap, HDMI_RX_MD_VAL, &vact);
+			v4l2_dbg(1, debug, sd, "%s: HACT:%#x, VACT:%#x\n",
+				 __func__, hact, vact);
+
+			rk628_csi_enable_interrupts(sd, false);
+			enable_stream(sd, false);
+			csi->nosignal = true;
+			schedule_delayed_work(&csi->delayed_work_res_change, HZ / 2);
+
+			v4l2_dbg(1, debug, sd, "%s: hact/vact change, md_ints: %#x\n",
+				 __func__, (u32)(md_ints & (VACT_LIN_ISTS | HACT_PIX_ISTS)));
+			*handled = true;
+		}
 
-	if ((pdec_ints & AVI_RCV_ISTS) && plugin) {
-		v4l2_dbg(1, debug, sd, "%s: AVI RCV INT!\n", __func__);
-		csi->avi_rcv_rdy = true;
-		/* After get the AVI_RCV interrupt state, disable interrupt. */
-		regmap_write(csi->hdmirx_regmap, HDMI_RX_PDEC_IEN_CLR,
-				0xffffffff);
+		if ((pdec_ints & AVI_RCV_ISTS) && plugin) {
+			v4l2_dbg(1, debug, sd, "%s: AVI RCV INT!\n", __func__);
+			csi->avi_rcv_rdy = true;
+			/* After get the AVI_RCV interrupt state, disable interrupt. */
+			regmap_write(csi->hdmirx_regmap, HDMI_RX_PDEC_IEN_CLR, AVI_RCV_ISTS);
 
-		*handled = true;
+			*handled = true;
+		}
 	}
-
 	if (*handled != true)
 		v4l2_dbg(1, debug, sd, "%s: unhandled interrupt!\n", __func__);
 
@@ -1712,8 +1906,11 @@ static int rk628_csi_query_dv_timings(struct v4l2_subdev *sd,
 		struct v4l2_dv_timings *timings)
 {
 	int ret;
+	struct rk628_csi *csi = to_csi(sd);
 
+	mutex_lock(&csi->confctl_mutex);
 	ret = rk628_csi_get_detected_timings(sd, timings);
+	mutex_unlock(&csi->confctl_mutex);
 	if (ret)
 		return ret;
 
@@ -2900,6 +3097,8 @@ static int rk628_csi_probe(struct platform_device *pdev)
 			rk628_csi_delayed_work_enable_hotplug);
 	INIT_DELAYED_WORK(&csi->delayed_work_res_change,
 			rk628_delayed_work_res_change);
+	INIT_DELAYED_WORK(&csi->delayed_work_audio_rate_change,
+			rk628_csi_delayed_work_audio_rate_change);
 	INIT_DELAYED_WORK(&csi->delayed_work_audio,
 			rk628_csi_delayed_work_audio);
 	rk628_csi_initial_setup(sd);
@@ -2939,7 +3138,6 @@ static int rk628_csi_probe(struct platform_device *pdev)
 		goto err_work_queues;
 	}
 
-	rk628_csi_enable_interrupts(sd, tx_5v_power_present(sd));
 	err = v4l2_ctrl_handler_setup(sd->ctrl_handler);
 	if (err) {
 		v4l2_err(sd, "v4l2 ctrl handler setup failed! err:%d\n", err);
@@ -2957,6 +3155,7 @@ static int rk628_csi_probe(struct platform_device *pdev)
 	cancel_delayed_work(&csi->delayed_work_enable_hotplug);
 	cancel_delayed_work(&csi->delayed_work_res_change);
 	cancel_delayed_work(&csi->delayed_work_audio);
+	cancel_delayed_work(&csi->delayed_work_audio_rate_change);
 err_hdl:
 	mutex_destroy(&csi->confctl_mutex);
 	media_entity_cleanup(&sd->entity);
@@ -2976,6 +3175,7 @@ static int rk628_csi_remove(struct platform_device *pdev)
 	cancel_delayed_work_sync(&csi->delayed_work_enable_hotplug);
 	cancel_delayed_work_sync(&csi->delayed_work_res_change);
 	cancel_delayed_work_sync(&csi->delayed_work_audio);
+	cancel_delayed_work_sync(&csi->delayed_work_audio_rate_change);
 
 	if (csi->rxphy_pwron)
 		phy_power_off(csi->rxphy);
diff --git a/drivers/media/i2c/rk628_csi.h b/drivers/media/i2c/rk628_csi.h
index 06283befec6f..502af82d8696 100644
--- a/drivers/media/i2c/rk628_csi.h
+++ b/drivers/media/i2c/rk628_csi.h
@@ -173,6 +173,8 @@
 #define HDMI_RX_AUD_SAO_CTRL		(HDMI_RX_BASE + 0x0260)
 #define I2S_LPCM_BPCUV_MASK		BIT(11)
 #define I2S_LPCM_BPCUV(x)		UPDATE(x, 11, 11)
+#define I2S_ENABLE_BITS_MASK		GENMASK(10, 5)
+#define I2S_ENABLE_BITS(x)		UPDATE(x, 10, 5)
 #define I2S_32_16_MASK			BIT(0)
 #define I2S_32_16(x)			UPDATE(x, 0, 0)
 #define HDMI_RX_AUD_PAO_CTRL        	(HDMI_RX_BASE + 0x0264)
@@ -260,17 +262,26 @@
 #define HDMI_RX_HDMI2_IEN_CLR		(HDMI_RX_BASE + 0x0f60)
 #define HDMI_RX_HDMI2_ISTS		(HDMI_RX_BASE + 0x0f68)
 #define HDMI_RX_PDEC_IEN_CLR		(HDMI_RX_BASE + 0x0f78)
+#define ACR_N_CHG_ICLR			BIT(23)
+#define ACR_CTS_CHG_ICLR		BIT(22)
 #define GCP_AV_MUTE_CHG_ENCLR		BIT(21)
+#define AIF_RCV_ENCLR			BIT(19)
 #define AVI_RCV_ENCLR			BIT(18)
 #define GCP_RCV_ENCLR			BIT(16)
 #define HDMI_RX_PDEC_IEN_SET		(HDMI_RX_BASE + 0x0f7c)
+#define ACR_N_CHG_IEN			BIT(23)
+#define ACR_CTS_CHG_IEN			BIT(22)
 #define GCP_AV_MUTE_CHG_ENSET		BIT(21)
+#define AIF_RCV_ENSET			BIT(19)
 #define AVI_RCV_ENSET			BIT(18)
 #define GCP_RCV_ENSET			BIT(16)
+#define AMP_RCV_ENSET			BIT(14)
 #define HDMI_RX_PDEC_ISTS		(HDMI_RX_BASE + 0x0f80)
 #define GCP_AV_MUTE_CHG_ISTS		BIT(21)
+#define AIF_RCV_ISTS			BIT(19)
 #define AVI_RCV_ISTS			BIT(18)
 #define GCP_RCV_ISTS			BIT(16)
+#define AMP_RCV_ISTS			BIT(14)
 #define HDMI_RX_PDEC_IEN		(HDMI_RX_BASE + 0x0f84)
 #define HDMI_RX_PDEC_ICLR		(HDMI_RX_BASE + 0x0f88)
 #define HDMI_RX_PDEC_ISET		(HDMI_RX_BASE + 0x0f8c)
@@ -278,7 +289,17 @@
 #define HDMI_RX_AUD_CEC_IEN		(HDMI_RX_BASE + 0x0f9c)
 #define HDMI_RX_AUD_FIFO_IEN_CLR	(HDMI_RX_BASE + 0x0fa8)
 #define HDMI_RX_AUD_FIFO_IEN_SET	(HDMI_RX_BASE + 0x0fac)
+#define AFIF_OVERFL_ENSET		BIT(4)
+#define AFIF_UNDERFL_ENSET		BIT(3)
+#define AFIF_THS_PASS_ENSET		BIT(2)
+#define AFIF_TH_MAX_ENSET		BIT(1)
+#define AFIF_TH_MIN_ENSET		BIT(0)
 #define HDMI_RX_AUD_FIFO_ISTS		(HDMI_RX_BASE + 0x0fb0)
+#define AFIF_OVERFL_ISTS		BIT(4)
+#define AFIF_UNDERFL_ISTS		BIT(3)
+#define AFIF_THS_PASS_ISTS		BIT(2)
+#define AFIF_TH_MAX_ISTS		BIT(1)
+#define AFIF_TH_MIN_ISTS		BIT(0)
 #define HDMI_RX_AUD_FIFO_IEN		(HDMI_RX_BASE + 0x0fb4)
 #define HDMI_RX_AUD_FIFO_ICLR		(HDMI_RX_BASE + 0x0fb8)
 #define HDMI_RX_MD_IEN_CLR		(HDMI_RX_BASE + 0x0fc0)
@@ -300,17 +321,24 @@
 #define HDMI_RX_MD_ICLR			(HDMI_RX_BASE + 0x0fd0)
 #define HDMI_RX_MD_ISET			(HDMI_RX_BASE + 0x0fd4)
 #define HDMI_RX_HDMI_IEN_CLR        	(HDMI_RX_BASE + 0x0fd8)
+#define CLK_CHANGE_ENCLR		BIT(6)
 #define HDMI_RX_HDMI_IEN_SET		(HDMI_RX_BASE + 0x0fdc)
 #define CLK_CHANGE_ENSET		BIT(6)
 #define HDMI_RX_HDMI_ISTS		(HDMI_RX_BASE + 0x0fe0)
 #define CLK_CHANGE_ISTS			BIT(6)
 #define HDMI_RX_HDMI_IEN		(HDMI_RX_BASE + 0x0fe4)
 #define HDMI_RX_HDMI_ICLR		(HDMI_RX_BASE + 0x0fe8)
+#define HDMI_RX_HDMI_ISET		(HDMI_RX_BASE + 0x0fec)
+#define CLK_CHANGE_CLR			BIT(6)
 #define HDCP_DKSET_DONE_ISTS_MASK	BIT(31)
 #define HDMI_RX_DMI_SW_RST		(HDMI_RX_BASE + 0x0ff0)
 #define HDMI_RX_DMI_DISABLE_IF		(HDMI_RX_BASE + 0x0ff4)
 #define VID_ENABLE(x)			UPDATE(x, 7, 7)
 #define VID_ENABLE_MASK			BIT(7)
+#define AUD_ENABLE(x)			UPDATE(x, 4, 4)
+#define AUD_ENABLE_MASK			BIT(4)
+#define HDMI_ENABLE(x)			UPDATE(x, 2, 2)
+#define HDMI_ENABLE_MASK		BIT(2)
 
 #define HDMI_RX_IVECTOR_INDEX_CB	(HDMI_RX_BASE + 0x32e4)
 #define HDMIRX_MAX_REGISTER		HDMI_RX_IVECTOR_INDEX_CB

commit 298933a15179417cf82969a0391552e1510f131d
Author: Shunqing Chen <csq@rock-chips.com>
Date:   Tue Jul 20 10:27:49 2021 +0800

    media: i2c: rk628csi: fix den error when hdcp enable
    
    When HDCP is enabled, there is a probability of data error for
    a period of time, so we use the above method to workround it:
    1. If read the same value six times, we think the data is stable.
    2. If thd data is no stable after 1s, force hdcp avmute.
    3. If avi packet is no ready, reset hdmi ctrl.
    
    Signed-off-by: Shunqing Chen <csq@rock-chips.com>
    Change-Id: Ia4d2fe5fc74188e593ea149404ad2504a0d8a482

diff --git a/drivers/media/i2c/rk628_csi.c b/drivers/media/i2c/rk628_csi.c
index b48fbe42588b..7180bb9224a4 100644
--- a/drivers/media/i2c/rk628_csi.c
+++ b/drivers/media/i2c/rk628_csi.c
@@ -39,7 +39,7 @@ static int debug;
 module_param(debug, int, 0644);
 MODULE_PARM_DESC(debug, "debug level (0-3)");
 
-#define DRIVER_VERSION			KERNEL_VERSION(0, 0x0, 0x6)
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x0, 0x7)
 #define RK628_CSI_NAME			"rk628-csi"
 
 #define EDID_NUM_BLOCKS_MAX 		2
@@ -280,6 +280,9 @@ static void rk628_hdmirx_vid_enable(struct v4l2_subdev *sd, bool en);
 static void rk628_csi_set_csi(struct v4l2_subdev *sd);
 static void rk628_hdmirx_hpd_ctrl(struct v4l2_subdev *sd, bool en);
 static void rk628_csi_set_hdmi_hdcp(struct v4l2_subdev *sd, bool en);
+static void rk628_hdmirx_controller_reset(struct v4l2_subdev *sd);
+static bool rk628_rcv_supported_res(struct v4l2_subdev *sd, u32 width,
+				    u32 height);
 
 static inline struct rk628_csi *to_csi(struct v4l2_subdev *sd)
 {
@@ -480,6 +483,31 @@ static void rk628_csi_delayed_work_enable_hotplug(struct work_struct *work)
 	mutex_unlock(&csi->confctl_mutex);
 }
 
+static int rk628_check_resulotion_change(struct v4l2_subdev *sd)
+{
+	u32 val;
+	struct rk628_csi *csi = to_csi(sd);
+	u32 htotal, vtotal;
+	u32 old_htotal, old_vtotal;
+	struct v4l2_bt_timings *bt = &csi->timings.bt;
+
+	regmap_read(csi->hdmirx_regmap, HDMI_RX_MD_HT1, &val);
+	htotal = (val >> 16) & 0xffff;
+	regmap_read(csi->hdmirx_regmap, HDMI_RX_MD_VTL, &val);
+	vtotal = val & 0xffff;
+
+	old_htotal = bt->hfrontporch + bt->hsync + bt->width + bt->hbackporch;
+	old_vtotal = bt->vfrontporch + bt->vsync + bt->height + bt->vbackporch;
+
+	v4l2_dbg(1, debug, sd, "new mode: %d x %d\n", htotal, vtotal);
+	v4l2_dbg(1, debug, sd, "old mode: %d x %d\n", old_htotal, old_vtotal);
+
+	if (htotal != old_htotal || vtotal != old_vtotal)
+		return 1;
+
+	return 0;
+}
+
 static void rk628_delayed_work_res_change(struct work_struct *work)
 {
 	struct delayed_work *dwork = to_delayed_work(work);
@@ -493,9 +521,20 @@ static void rk628_delayed_work_res_change(struct work_struct *work)
 	plugin = tx_5v_power_present(sd);
 	v4l2_dbg(1, debug, sd, "%s: 5v_det:%d\n", __func__, plugin);
 	if (plugin) {
-		v4l2_dbg(1, debug, sd, "res change, recfg ctrler and phy!\n");
-		rk628_hdmirx_config_all(sd);
-		rk628_csi_enable_interrupts(sd, true);
+		if (rk628_check_resulotion_change(sd)) {
+			v4l2_dbg(1, debug, sd, "res change, recfg ctrler and phy!\n");
+			rk628_hdmirx_config_all(sd);
+			rk628_csi_enable_interrupts(sd, true);
+			regmap_update_bits(csi->grf, GRF_SYSTEM_CON0,
+					   SW_I2S_DATA_OEN_MASK,
+					   SW_I2S_DATA_OEN(0));
+			schedule_delayed_work(&csi->delayed_work_audio,
+					      msecs_to_jiffies(0));
+		} else {
+			rk628_csi_format_change(sd);
+			csi->nosignal = false;
+			rk628_csi_enable_interrupts(sd, true);
+		}
 	}
 	mutex_unlock(&csi->confctl_mutex);
 }
@@ -942,7 +981,8 @@ static void rk628_csi_set_csi(struct v4l2_subdev *sd)
 	u8 lane_num;
 	u8 dphy_lane_en;
 	u32 wc_usrdef, val, avi_pb = 0;
-	u8 cnt = 0;
+	u8 cnt = 0, max_cnt = 2;
+	u32 hdcp_ctrl_val = 0;
 
 	lane_num = lanes - 1;
 	dphy_lane_en = (1 << (lanes + 1)) - 1;
@@ -1003,12 +1043,27 @@ static void rk628_csi_set_csi(struct v4l2_subdev *sd)
 	regmap_write(csi->csi_regmap, CSITX_CONFIG_DONE, CONFIG_DONE_IMD);
 	v4l2_dbg(1, debug, sd, "%s csi cofig done\n", __func__);
 
+	mutex_lock(&csi->confctl_mutex);
+	regmap_read(csi->hdmirx_regmap, HDMI_RX_HDCP_CTRL, &val);
+	if ((val & HDCP_ENABLE_MASK))
+		max_cnt = 5;
+
 	for (i = 0; i < 100; i++) {
 		regmap_read(csi->hdmirx_regmap, HDMI_RX_PDEC_AVI_PB, &val);
+
 		v4l2_dbg(2, debug, sd, "%s PDEC_AVI_PB:%#x, avi_rcv_rdy:%d\n",
 			 __func__, val, csi->avi_rcv_rdy);
-		if (val == avi_pb && csi->avi_rcv_rdy) {
-			if (++cnt >= 2)
+		if (i > 30 && !(hdcp_ctrl_val & 0x400)) {
+			regmap_read(csi->hdmirx_regmap, HDMI_RX_HDCP_CTRL,
+				    &hdcp_ctrl_val);
+			/* force hdcp avmute */
+			hdcp_ctrl_val |= 0x400;
+			regmap_write(csi->csi_regmap, HDMI_RX_HDCP_CTRL,
+				     hdcp_ctrl_val);
+		}
+
+		if (val && val == avi_pb && csi->avi_rcv_rdy) {
+			if (++cnt >= max_cnt)
 				break;
 		} else {
 			cnt = 0;
@@ -1016,6 +1071,8 @@ static void rk628_csi_set_csi(struct v4l2_subdev *sd)
 		}
 		msleep(30);
 	}
+	mutex_unlock(&csi->confctl_mutex);
+
 	video_fmt = (val & VIDEO_FORMAT_MASK) >> 5;
 	v4l2_dbg(1, debug, sd, "%s PDEC_AVI_PB:%#x, video format:%d\n",
 			__func__, val, video_fmt);
@@ -1030,6 +1087,10 @@ static void rk628_csi_set_csi(struct v4l2_subdev *sd)
 				SW_YUV2VYU_SWP(0) |
 				SW_R2Y_EN(1));
 	}
+
+	/* if avi packet is not stable, reset ctrl*/
+	if (cnt < max_cnt)
+		schedule_delayed_work(&csi->delayed_work_enable_hotplug, HZ / 20);
 }
 
 static int rk628_hdmirx_phy_power_on(struct v4l2_subdev *sd)

commit 4b32bc65cf6bdae6d28f916b6178f0e23091a79c
Author: Dingxian Wen <shawn.wen@rock-chips.com>
Date:   Tue Jul 6 11:44:57 2021 +0800

    media: i2c: rk628csi: detect resolution changes as quickly as possible
    
    Change-Id: I432c4178961641e541c75b62a21598d87ae142d8
    Signed-off-by: Dingxian Wen <shawn.wen@rock-chips.com>

diff --git a/drivers/media/i2c/rk628_csi.c b/drivers/media/i2c/rk628_csi.c
index 38d0251c9e1f..b48fbe42588b 100644
--- a/drivers/media/i2c/rk628_csi.c
+++ b/drivers/media/i2c/rk628_csi.c
@@ -39,7 +39,7 @@ static int debug;
 module_param(debug, int, 0644);
 MODULE_PARM_DESC(debug, "debug level (0-3)");
 
-#define DRIVER_VERSION			KERNEL_VERSION(0, 0x0, 0x5)
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x0, 0x6)
 #define RK628_CSI_NAME			"rk628-csi"
 
 #define EDID_NUM_BLOCKS_MAX 		2
@@ -360,12 +360,12 @@ static int rk628_csi_get_detected_timings(struct v4l2_subdev *sd,
 	htotal = (val >> 16) & 0xffff;
 	regmap_read(csi->hdmirx_regmap, HDMI_RX_MD_VTL, &val);
 	vtotal = val & 0xffff;
-	regmap_read(csi->hdmirx_regmap, 0x3014c, &val);
+	regmap_read(csi->hdmirx_regmap, HDMI_RX_MD_HT1, &val);
 	hofs_pix = val & 0xffff;
-	regmap_read(csi->hdmirx_regmap, 0x30164, &val);
+	regmap_read(csi->hdmirx_regmap, HDMI_RX_MD_VOL, &val);
 	vbp = (val & 0xffff) + 1;
 
-	regmap_read(csi->hdmirx_regmap, 0x3009c, &val);
+	regmap_read(csi->hdmirx_regmap, HDMI_RX_HDMI_CKM_RESULT, &val);
 	tmdsclk_cnt = val & 0xffff;
 	tmp_data = tmdsclk_cnt;
 	tmp_data = ((tmp_data * MODETCLK_HZ) + MODETCLK_CNT_NUM / 2);
@@ -378,12 +378,12 @@ static int rk628_csi_get_detected_timings(struct v4l2_subdev *sd,
 	}
 	fps = (tmds_clk + (htotal * vtotal) / 2) / (htotal * vtotal);
 
-	regmap_read(csi->hdmirx_regmap, 0x30148, &val);
+	regmap_read(csi->hdmirx_regmap, HDMI_RX_MD_HT0, &val);
 	modetclk_cnt_hs = val & 0xffff;
 	hs = (tmdsclk_cnt * modetclk_cnt_hs + MODETCLK_CNT_NUM / 2) /
 		MODETCLK_CNT_NUM;
 
-	regmap_read(csi->hdmirx_regmap, 0x3015c, &val);
+	regmap_read(csi->hdmirx_regmap, HDMI_RX_MD_VSC, &val);
 	modetclk_cnt_vs = val & 0xffff;
 	vs = (tmdsclk_cnt * modetclk_cnt_vs + MODETCLK_CNT_NUM / 2) /
 		MODETCLK_CNT_NUM;
@@ -1454,7 +1454,12 @@ static void rk628_csi_enable_interrupts(struct v4l2_subdev *sd, bool en)
 
 	if (en) {
 		regmap_write(csi->hdmirx_regmap, HDMI_RX_MD_IEN_SET,
-			VACT_LIN_ENSET | HACT_PIX_ENSET);
+				VACT_LIN_ENSET |
+				HACT_PIX_ENSET |
+				HS_CLK_ENSET |
+				DE_ACTIVITY_ENSET |
+				VS_ACT_ENSET |
+				HS_ACT_ENSET);
 		regmap_write(csi->hdmirx_regmap, HDMI_RX_PDEC_IEN_SET,
 				AVI_RCV_ENSET);
 	} else {
@@ -1488,7 +1493,11 @@ static int rk628_csi_isr(struct v4l2_subdev *sd, u32 status, bool *handled)
 	v4l2_dbg(1, debug, sd, "%s: md_ints: %#x, pdec_ints:%#x, plugin: %d\n",
 		__func__, md_ints, pdec_ints, plugin);
 
-	if ((md_ints & (VACT_LIN_ISTS | HACT_PIX_ISTS)) && plugin) {
+	if ((md_ints & (VACT_LIN_ISTS | HACT_PIX_ISTS |
+			HS_CLK_ISTS | DE_ACTIVITY_ISTS |
+			VS_ACT_ISTS | HS_ACT_ISTS))
+			&& plugin) {
+
 		regmap_read(csi->hdmirx_regmap, HDMI_RX_MD_HACT_PX, &hact);
 		regmap_read(csi->hdmirx_regmap, HDMI_RX_MD_VAL, &vact);
 		v4l2_dbg(1, debug, sd, "%s: HACT:%#x, VACT:%#x\n",
@@ -2611,6 +2620,7 @@ static const struct regmap_range rk628_hdmirx_readable_ranges[] = {
 	regmap_reg_range(HDMI_RX_HDMI_MODE_RECOVER, HDMI_RX_HDMI_ERROR_PROTECT),
 	regmap_reg_range(HDMI_RX_HDMI_SYNC_CTRL, HDMI_RX_HDMI_CKM_RESULT),
 	regmap_reg_range(HDMI_RX_HDMI_RESMPL_CTRL, HDMI_RX_HDMI_RESMPL_CTRL),
+	regmap_reg_range(HDMI_VM_CFG_CH2, HDMI_VM_CFG_CH2),
 	regmap_reg_range(HDMI_RX_HDCP_CTRL, HDMI_RX_HDCP_SETTINGS),
 	regmap_reg_range(HDMI_RX_HDCP_KIDX, HDMI_RX_HDCP_KIDX),
 	regmap_reg_range(HDMI_RX_HDCP_DBG, HDMI_RX_HDCP_AN0),
@@ -2626,8 +2636,10 @@ static const struct regmap_range rk628_hdmirx_readable_ranges[] = {
 	regmap_reg_range(HDMI_RX_AUD_CHEXTR_CTRL, HDMI_RX_AUD_PAO_CTRL),
 	regmap_reg_range(HDMI_RX_AUD_FIFO_STS, HDMI_RX_AUD_FIFO_STS),
 	regmap_reg_range(HDMI_RX_AUDPLL_GEN_CTS, HDMI_RX_AUDPLL_GEN_N),
+	regmap_reg_range(HDMI_RX_PDEC_CTRL, HDMI_RX_PDEC_CTRL),
 	regmap_reg_range(HDMI_RX_PDEC_AUDIODET_CTRL, HDMI_RX_PDEC_AUDIODET_CTRL),
 	regmap_reg_range(HDMI_RX_PDEC_ERR_FILTER, HDMI_RX_PDEC_ASP_CTRL),
+	regmap_reg_range(HDMI_RX_PDEC_GCP_AVMUTE, HDMI_RX_PDEC_GCP_AVMUTE),
 	regmap_reg_range(HDMI_RX_PDEC_ACR_CTS, HDMI_RX_PDEC_ACR_N),
 	regmap_reg_range(HDMI_RX_PDEC_AIF_CTRL, HDMI_RX_PDEC_AIF_PB0),
 	regmap_reg_range(HDMI_RX_PDEC_AVI_PB, HDMI_RX_PDEC_AVI_PB),
diff --git a/drivers/media/i2c/rk628_csi.h b/drivers/media/i2c/rk628_csi.h
index ec3f31737b0c..06283befec6f 100644
--- a/drivers/media/i2c/rk628_csi.h
+++ b/drivers/media/i2c/rk628_csi.h
@@ -76,6 +76,7 @@
 #define DCM_COLOUR_DEPTH_SEL(x)		UPDATE(x, 12, 12)
 #define DCM_COLOUR_DEPTH(x)		UPDATE(x, 11, 8)
 #define DCM_GCP_ZERO_FIELDS(x)		UPDATE(x, 5, 2)
+#define HDMI_VM_CFG_CH2			(HDMI_RX_BASE + 0x00b4)
 #define HDMI_RX_HDCP_CTRL		(HDMI_RX_BASE + 0x00c0)
 #define HDCP_ENABLE_MASK     		BIT(24)
 #define HDCP_ENABLE(x)			UPDATE(x, 24, 24)
@@ -117,6 +118,7 @@
 #define VS_ACT_TIME(x)			UPDATE(x, 5, 5)
 #define HS_ACT_TIME(x)			UPDATE(x, 4, 3)
 #define H_START_POS(x)			UPDATE(x, 1, 0)
+#define HDMI_RX_MD_HT0			(HDMI_RX_BASE + 0x0148)
 #define HDMI_RX_MD_HT1			(HDMI_RX_BASE + 0x014c)
 #define HDMI_RX_MD_HACT_PX		(HDMI_RX_BASE + 0x0150)
 #define HDMI_RX_MD_VCTRL            	(HDMI_RX_BASE + 0x0158)
@@ -211,6 +213,8 @@
 #define PFIFO_STORE_GCP(x)       	UPDATE(x, 17, 17)
 #define PFIFO_STORE_ACR_MASK       	BIT(16)
 #define PFIFO_STORE_ACR(x)		UPDATE(x, 16, 16)
+#define GCPFORCE_SETAVMUTE_MASK		BIT(13)
+#define GCPFORCE_SETAVMUTE(x)		UPDATE(x, 13, 13)
 #define PDEC_BCH_EN_MASK		BIT(0)
 #define PDEC_BCH_EN(x)			UPDATE(x, 0, 0)
 #define HDMI_RX_PDEC_FIFO_CFG       	(HDMI_RX_BASE + 0x0304)
@@ -256,11 +260,17 @@
 #define HDMI_RX_HDMI2_IEN_CLR		(HDMI_RX_BASE + 0x0f60)
 #define HDMI_RX_HDMI2_ISTS		(HDMI_RX_BASE + 0x0f68)
 #define HDMI_RX_PDEC_IEN_CLR		(HDMI_RX_BASE + 0x0f78)
+#define GCP_AV_MUTE_CHG_ENCLR		BIT(21)
 #define AVI_RCV_ENCLR			BIT(18)
+#define GCP_RCV_ENCLR			BIT(16)
 #define HDMI_RX_PDEC_IEN_SET		(HDMI_RX_BASE + 0x0f7c)
+#define GCP_AV_MUTE_CHG_ENSET		BIT(21)
 #define AVI_RCV_ENSET			BIT(18)
+#define GCP_RCV_ENSET			BIT(16)
 #define HDMI_RX_PDEC_ISTS		(HDMI_RX_BASE + 0x0f80)
+#define GCP_AV_MUTE_CHG_ISTS		BIT(21)
 #define AVI_RCV_ISTS			BIT(18)
+#define GCP_RCV_ISTS			BIT(16)
 #define HDMI_RX_PDEC_IEN		(HDMI_RX_BASE + 0x0f84)
 #define HDMI_RX_PDEC_ICLR		(HDMI_RX_BASE + 0x0f88)
 #define HDMI_RX_PDEC_ISET		(HDMI_RX_BASE + 0x0f8c)
@@ -275,9 +285,14 @@
 #define HDMI_RX_MD_IEN_SET		(HDMI_RX_BASE + 0x0fc4)
 #define VACT_LIN_ENSET			BIT(9)
 #define HACT_PIX_ENSET			BIT(6)
+#define HS_CLK_ENSET			BIT(5)
+#define DE_ACTIVITY_ENSET		BIT(2)
+#define VS_ACT_ENSET			BIT(1)
+#define HS_ACT_ENSET			BIT(0)
 #define HDMI_RX_MD_ISTS			(HDMI_RX_BASE + 0x0fc8)
 #define VACT_LIN_ISTS			BIT(9)
 #define HACT_PIX_ISTS			BIT(6)
+#define HS_CLK_ISTS			BIT(5)
 #define DE_ACTIVITY_ISTS		BIT(2)
 #define VS_ACT_ISTS			BIT(1)
 #define HS_ACT_ISTS			BIT(0)
@@ -286,7 +301,9 @@
 #define HDMI_RX_MD_ISET			(HDMI_RX_BASE + 0x0fd4)
 #define HDMI_RX_HDMI_IEN_CLR        	(HDMI_RX_BASE + 0x0fd8)
 #define HDMI_RX_HDMI_IEN_SET		(HDMI_RX_BASE + 0x0fdc)
+#define CLK_CHANGE_ENSET		BIT(6)
 #define HDMI_RX_HDMI_ISTS		(HDMI_RX_BASE + 0x0fe0)
+#define CLK_CHANGE_ISTS			BIT(6)
 #define HDMI_RX_HDMI_IEN		(HDMI_RX_BASE + 0x0fe4)
 #define HDMI_RX_HDMI_ICLR		(HDMI_RX_BASE + 0x0fe8)
 #define HDCP_DKSET_DONE_ISTS_MASK	BIT(31)

commit 5d9831178683674e0fc1a7cb46b0b73b5d57b8dc
Author: Shunqing Chen <csq@rock-chips.com>
Date:   Tue Jun 8 11:33:34 2021 +0800

    media: i2c: rk628csi: add hdcp support
    
    Signed-off-by: Shunqing Chen <csq@rock-chips.com>
    Change-Id: Id33a54d16fec2ddee6ae467b24dff69b637f529b

diff --git a/drivers/media/i2c/rk628_csi.c b/drivers/media/i2c/rk628_csi.c
index 23ff034bbfb5..38d0251c9e1f 100644
--- a/drivers/media/i2c/rk628_csi.c
+++ b/drivers/media/i2c/rk628_csi.c
@@ -19,6 +19,7 @@
 #include <linux/platform_device.h>
 #include <linux/reset.h>
 #include <linux/rk-camera-module.h>
+#include <linux/soc/rockchip/rk_vendor_storage.h>
 #include <linux/slab.h>
 #include <linux/timer.h>
 #include <linux/v4l2-dv-timings.h>
@@ -38,7 +39,7 @@ static int debug;
 module_param(debug, int, 0644);
 MODULE_PARM_DESC(debug, "debug level (0-3)");
 
-#define DRIVER_VERSION			KERNEL_VERSION(0, 0x0, 0x4)
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x0, 0x5)
 #define RK628_CSI_NAME			"rk628-csi"
 
 #define EDID_NUM_BLOCKS_MAX 		2
@@ -57,10 +58,30 @@ MODULE_PARM_DESC(debug, "debug level (0-3)");
 #define RXPHY_CFG_MAX_TIMES		3
 #define CSITX_ERR_RETRY_TIMES		3
 
+#define HDCP_KEY_KSV_SIZE		8
+#define HDCP_PRIVATE_KEY_SIZE		280
+#define HDCP_KEY_SHA_SIZE		20
+#define HDCP_KEY_SIZE			308
+#define HDCP_KEY_SEED_SIZE		2
+#define KSV_LEN				5
+
+#define HDMIRX_HDCP1X_ID		13
+
 #define YUV422_8BIT			0x1e
 /* Test Code: 0x44 (HS RX Control of Lane 0) */
 #define HSFREQRANGE(x)			UPDATE(x, 6, 1)
 
+struct hdcp_keys {
+	u8 KSV[HDCP_KEY_KSV_SIZE];
+	u8 devicekey[HDCP_PRIVATE_KEY_SIZE];
+	u8 sha[HDCP_KEY_SHA_SIZE];
+};
+
+struct rk628_hdcp {
+	char *seeds;
+	struct hdcp_keys *keys;
+};
+
 struct rk628_csi {
 	struct device *dev;
 	struct rk628 *parent;
@@ -124,6 +145,7 @@ struct rk628_csi {
 	bool audio_present;
 	bool hpd_output_inverted;
 	bool avi_rcv_rdy;
+	struct rk628_hdcp hdcp;
 };
 
 struct rk628_csi_mode {
@@ -188,10 +210,6 @@ static u8 edid_init_data[] = {
 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8,
 };
 
-static u8 hdcp_key_data[] = {
-	0x00,
-};
-
 static const struct rk628_csi_mode supported_modes[] = {
 	{
 		.width = 3840,
@@ -261,6 +279,7 @@ static void rk628_hdmirx_audio_setup(struct v4l2_subdev *sd);
 static void rk628_hdmirx_vid_enable(struct v4l2_subdev *sd, bool en);
 static void rk628_csi_set_csi(struct v4l2_subdev *sd);
 static void rk628_hdmirx_hpd_ctrl(struct v4l2_subdev *sd, bool en);
+static void rk628_csi_set_hdmi_hdcp(struct v4l2_subdev *sd, bool en);
 
 static inline struct rk628_csi *to_csi(struct v4l2_subdev *sd)
 {
@@ -441,6 +460,7 @@ static void rk628_csi_delayed_work_enable_hotplug(struct work_struct *work)
 	v4l2_dbg(1, debug, sd, "%s: 5v_det:%d\n", __func__, plugin);
 	if (plugin) {
 		rk628_csi_enable_interrupts(sd, false);
+		rk628_csi_set_hdmi_hdcp(sd, csi->enable_hdcp);
 		rk628_hdmirx_hpd_ctrl(sd, true);
 		rk628_hdmirx_config_all(sd);
 		rk628_csi_enable_interrupts(sd, true);
@@ -480,39 +500,116 @@ static void rk628_delayed_work_res_change(struct work_struct *work)
 	mutex_unlock(&csi->confctl_mutex);
 }
 
+static int hdcp_load_keys_cb(struct rk628_csi *csi)
+{
+	struct rk628_hdcp *hdcp = &csi->hdcp;
+	int size;
+	u8 hdcp_vendor_data[320];
+
+	hdcp->keys = kmalloc(HDCP_KEY_SIZE, GFP_KERNEL);
+	if (!hdcp->keys)
+		return -ENOMEM;
+
+	hdcp->seeds = kmalloc(HDCP_KEY_SEED_SIZE, GFP_KERNEL);
+	if (!hdcp->seeds) {
+		kfree(hdcp->keys);
+		hdcp->keys = NULL;
+		return -ENOMEM;
+	}
+
+	size = rk_vendor_read(HDMIRX_HDCP1X_ID, hdcp_vendor_data, 314);
+	if (size < (HDCP_KEY_SIZE + HDCP_KEY_SEED_SIZE)) {
+		dev_dbg(csi->dev, "HDCP: read size %d\n", size);
+		kfree(hdcp->keys);
+		hdcp->keys = NULL;
+		kfree(hdcp->seeds);
+		hdcp->seeds = NULL;
+		return -EINVAL;
+	}
+	memcpy(hdcp->keys, hdcp_vendor_data, HDCP_KEY_SIZE);
+	memcpy(hdcp->seeds, hdcp_vendor_data + HDCP_KEY_SIZE,
+	       HDCP_KEY_SEED_SIZE);
+
+	return 0;
+}
+
+static int rk628_hdmi_hdcp_load_key(struct rk628_csi *csi)
+{
+	int i;
+	int ret;
+	struct hdcp_keys *hdcp_keys;
+	struct rk628_hdcp *hdcp = &csi->hdcp;
+	u32 seeds = 0;
+
+	if (!hdcp->keys) {
+		ret = hdcp_load_keys_cb(csi);
+		if (ret) {
+			dev_err(csi->dev, "HDCP: load key failed\n");
+			return ret;
+		}
+	}
+	hdcp_keys = hdcp->keys;
+
+	regmap_update_bits(csi->hdmirx_regmap, HDMI_RX_HDCP_CTRL,
+			HDCP_ENABLE_MASK |
+			HDCP_ENC_EN_MASK,
+			HDCP_ENABLE(0) |
+			HDCP_ENC_EN(0));
+	regmap_update_bits(csi->grf, GRF_SYSTEM_CON0,
+			SW_ADAPTER_I2CSLADR_MASK |
+			SW_EFUSE_HDCP_EN_MASK,
+			SW_ADAPTER_I2CSLADR(0) |
+			SW_EFUSE_HDCP_EN(1));
+	/* The useful data in ksv should be 5 byte */
+	for (i = 0; i < KSV_LEN; i++)
+		regmap_write(csi->key_regmap, HDCP_KEY_KSV0 + i * 4,
+			     hdcp_keys->KSV[i]);
+
+	for (i = 0; i < HDCP_PRIVATE_KEY_SIZE; i++)
+		regmap_write(csi->key_regmap, HDCP_KEY_DPK0 + i * 4,
+			     hdcp_keys->devicekey[i]);
+
+	regmap_update_bits(csi->grf, GRF_SYSTEM_CON0,
+			SW_ADAPTER_I2CSLADR_MASK |
+			SW_EFUSE_HDCP_EN_MASK,
+			SW_ADAPTER_I2CSLADR(0) |
+			SW_EFUSE_HDCP_EN(0));
+	regmap_update_bits(csi->hdmirx_regmap, HDMI_RX_HDCP_CTRL,
+			HDCP_ENABLE_MASK |
+			HDCP_ENC_EN_MASK,
+			HDCP_ENABLE(1) |
+			HDCP_ENC_EN(1));
+
+	/* Enable decryption logic */
+	if (hdcp->seeds) {
+		seeds = (hdcp->seeds[0] & 0xff) << 8;
+		seeds |= (hdcp->seeds[1] & 0xff);
+	}
+	if (seeds) {
+		regmap_update_bits(csi->hdmirx_regmap, HDMI_RX_HDCP_CTRL,
+				   KEY_DECRIPT_ENABLE_MASK,
+				   KEY_DECRIPT_ENABLE(1));
+		regmap_write(csi->hdmirx_regmap, HDMI_RX_HDCP_SEED, seeds);
+	} else {
+		regmap_update_bits(csi->hdmirx_regmap, HDMI_RX_HDCP_CTRL,
+				   KEY_DECRIPT_ENABLE_MASK,
+				   KEY_DECRIPT_ENABLE(0));
+	}
+
+	return 0;
+}
+
 static void rk628_csi_set_hdmi_hdcp(struct v4l2_subdev *sd, bool en)
 {
 	struct rk628_csi *csi = to_csi(sd);
-	u16 i;
+	u32 val;
 
 	v4l2_dbg(1, debug, sd, "%s: %sable\n", __func__, en ? "en" : "dis");
 
 	if (en) {
-		regmap_update_bits(csi->hdmirx_regmap, HDMI_RX_HDCP_CTRL,
-				HDCP_ENABLE_MASK |
-				HDCP_ENC_EN_MASK,
-				HDCP_ENABLE(1) |
-				HDCP_ENC_EN(1));
-		regmap_update_bits(csi->grf, GRF_SYSTEM_CON0,
-				SW_ADAPTER_I2CSLADR_MASK |
-				SW_EFUSE_HDCP_EN_MASK,
-				SW_ADAPTER_I2CSLADR(0) |
-				SW_EFUSE_HDCP_EN(1));
-		for ( i = 0; i < ARRAY_SIZE(hdcp_key_data); i++) {
-			regmap_write(csi->key_regmap, HDCP_KEY_BASE + i * 4,
-					hdcp_key_data[i]);
-		}
-
-		regmap_update_bits(csi->grf, GRF_SYSTEM_CON0,
-				SW_ADAPTER_I2CSLADR_MASK |
-				SW_EFUSE_HDCP_EN_MASK,
-				SW_ADAPTER_I2CSLADR(0) |
-				SW_EFUSE_HDCP_EN(0));
-		regmap_update_bits(csi->hdmirx_regmap, HDMI_RX_HDCP_CTRL,
-				HDCP_ENABLE_MASK |
-				HDCP_ENC_EN_MASK,
-				HDCP_ENABLE(1) |
-				HDCP_ENC_EN(1));
+		regmap_read(csi->hdmirx_regmap, HDMI_RX_HDCP_CTRL, &val);
+		if (!(val & HDCP_ENABLE_MASK))
+			rk628_hdmi_hdcp_load_key(csi);
 	} else {
 		regmap_update_bits(csi->hdmirx_regmap, HDMI_RX_HDCP_CTRL,
 				HDCP_ENABLE_MASK |
@@ -1185,6 +1282,16 @@ static void rk628_hdmirx_controller_setup(struct v4l2_subdev *sd)
 	regmap_write(csi->hdmirx_regmap, HDMI_RX_HDMI_CKM_EVLTM, 0x00103e70);
 	regmap_write(csi->hdmirx_regmap, HDMI_RX_HDMI_CKM_F, 0x0c1c0b54);
 	regmap_write(csi->hdmirx_regmap, HDMI_RX_HDMI_RESMPL_CTRL, 0x00000001);
+
+	regmap_update_bits(csi->hdmirx_regmap, HDMI_RX_HDCP_SETTINGS,
+			   HDMI_RESERVED_MASK |
+			   FAST_I2C_MASK |
+			   ONE_DOT_ONE_MASK |
+			   FAST_REAUTH_MASK,
+			   HDMI_RESERVED(1) |
+			   FAST_I2C(0) |
+			   ONE_DOT_ONE(0) |
+			   FAST_REAUTH(0));
 }
 
 static bool rk628_rcv_supported_res(struct v4l2_subdev *sd, u32 width,
@@ -1303,18 +1410,14 @@ static void rk628_csi_initial_setup(struct v4l2_subdev *sd)
 	def_edid.blocks = 2;
 	def_edid.edid = edid_init_data;
 	rk628_csi_s_edid(sd, &def_edid);
-	rk628_csi_set_hdmi_hdcp(sd, csi->enable_hdcp);
+	rk628_csi_set_hdmi_hdcp(sd, false);
 	rk628_hdmirx_audio_setup(sd);
 
 	mipi_dphy_reset(csi);
 	mipi_dphy_power_on(csi);
 	csi->txphy_pwron = true;
-	if (tx_5v_power_present(sd)) {
-		rk628_hdmirx_config_all(sd);
-		regmap_update_bits(csi->grf, GRF_SYSTEM_CON0,
-				SW_I2S_DATA_OEN_MASK, SW_I2S_DATA_OEN(0));
-		schedule_delayed_work(&csi->delayed_work_audio, msecs_to_jiffies(1000));
-	}
+	if (tx_5v_power_present(sd))
+		schedule_delayed_work(&csi->delayed_work_enable_hotplug, msecs_to_jiffies(1000));
 }
 
 static void rk628_csi_format_change(struct v4l2_subdev *sd)
@@ -2306,6 +2409,7 @@ static int rk628_csi_probe_of(struct rk628_csi *csi)
 	struct v4l2_fwnode_endpoint *endpoint;
 	struct device_node *ep;
 	int ret = -EINVAL;
+	bool hdcp1x_enable = false;
 
 	csi->clk_hdmirx = devm_clk_get(dev, "hdmirx");
 	if (IS_ERR(csi->clk_hdmirx)) {
@@ -2441,6 +2545,9 @@ static int rk628_csi_probe_of(struct rk628_csi *csi)
 		return ret;
 	}
 
+	if (of_property_read_bool(dev->of_node, "hdcp-enable"))
+		hdcp1x_enable = true;
+
 	ep = of_graph_get_next_endpoint(dev->of_node, NULL);
 	if (!ep) {
 		dev_err(dev, "missing endpoint node\n");
@@ -2460,7 +2567,7 @@ static int rk628_csi_probe_of(struct rk628_csi *csi)
 	}
 
 	csi->csi_lanes_in_use = endpoint->bus.mipi_csi2.num_data_lanes;
-	csi->enable_hdcp = false;
+	csi->enable_hdcp = hdcp1x_enable;
 	csi->rxphy_pwron = false;
 	csi->txphy_pwron = false;
 	csi->nosignal = true;
diff --git a/drivers/media/i2c/rk628_csi.h b/drivers/media/i2c/rk628_csi.h
index 4a3b88b7777b..ec3f31737b0c 100644
--- a/drivers/media/i2c/rk628_csi.h
+++ b/drivers/media/i2c/rk628_csi.h
@@ -11,6 +11,9 @@
 /* --------- EDID and HDCP KEY ------- */
 #define EDID_BASE			0x000a0000
 #define HDCP_KEY_BASE			0x000a8000
+#define HDCP_KEY_KSV0			(HDCP_KEY_BASE + 4)
+#define HDCP_KEY_DPK0			(HDCP_KEY_BASE + 36)
+
 #define KEY_MAX_REGISTER		0x000a8490
 
 /* --------- GPIO0 REG --------------- */
@@ -91,6 +94,15 @@
 #define HDCP_ENC_EN_MASK		BIT(0)
 #define HDCP_ENC_EN(x)			UPDATE(x, 0, 0)
 #define HDMI_RX_HDCP_SETTINGS		(HDMI_RX_BASE + 0x00c4)
+#define HDMI_RESERVED(x)		UPDATE(x, 13, 13)
+#define HDMI_RESERVED_MASK		BIT(13)
+#define FAST_I2C(x)			UPDATE(x, 12, 12)
+#define FAST_I2C_MASK			BIT(12)
+#define ONE_DOT_ONE(x)			UPDATE(x, 9, 9)
+#define ONE_DOT_ONE_MASK		BIT(9)
+#define FAST_REAUTH(x)			UPDATE(x, 8, 8)
+#define FAST_REAUTH_MASK		BIT(8)
+#define HDMI_RX_HDCP_SEED		(HDMI_RX_BASE + 0x00c8)
 #define HDMI_RX_HDCP_KIDX		(HDMI_RX_BASE + 0x00d4)
 #define HDMI_RX_HDCP_DBG		(HDMI_RX_BASE + 0x00e0)
 #define HDMI_RX_HDCP_AN0		(HDMI_RX_BASE + 0x00f0)

commit a95f1858e86ae12dbc39a2164b73979077450440
Author: Chris Zhong <zyw@rock-chips.com>
Date:   Fri Aug 13 15:42:49 2021 +0800

    ARM: configs: enable rk817 battery and charge for rv1126-dictionary-pen
    
    How to use this configuration:
    make ARCH=arm rv1126_defconfig rv1126-dictionary-pen.config
    
    Signed-off-by: Chris Zhong <zyw@rock-chips.com>
    Change-Id: I85bc9744b61cd17f0b8f20aabf3184a4a931fd99

diff --git a/arch/arm/configs/rv1126-dictionary-pen.config b/arch/arm/configs/rv1126-dictionary-pen.config
new file mode 100644
index 000000000000..fe2ad43bcd48
--- /dev/null
+++ b/arch/arm/configs/rv1126-dictionary-pen.config
@@ -0,0 +1,4 @@
+CONFIG_BATTERY_RK817=y
+CONFIG_CHARGER_RK817=y
+# CONFIG_DWMAC_ROCKCHIP is not set
+CONFIG_VIDEO_OV7251=y

commit 9417c333ab14dd9c0b80d86058dc0f87debdb5c4
Author: Chris Zhong <zyw@rock-chips.com>
Date:   Fri Jun 4 17:40:11 2021 +0800

    ARM: dts: rv1126: support dictionary pen
    
    Change-Id: I4762988cb3c6ab350391fd3a0d8b9f4670b33eac
    Signed-off-by: Chris Zhong <zyw@rock-chips.com>

diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
index c0e8d0b58efb..6a757bdb9c2d 100644
--- a/arch/arm/boot/dts/Makefile
+++ b/arch/arm/boot/dts/Makefile
@@ -857,6 +857,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += \
 	rv1126-bat-evb-v10.dtb \
 	rv1126-bat-ipc-v10.dtb \
 	rv1126-bat-ipc-4k-v10.dtb \
+	rv1126-dictionary-pen-v11.dtb \
 	rv1126-evb-ddr3-v10.dtb \
 	rv1126-evb-ddr3-v10-robot.dtb \
 	rv1126-evb-ddr3-v12.dtb \
diff --git a/arch/arm/boot/dts/rv1126-dictionary-pen-v11.dts b/arch/arm/boot/dts/rv1126-dictionary-pen-v11.dts
new file mode 100644
index 000000000000..c19514712c8f
--- /dev/null
+++ b/arch/arm/boot/dts/rv1126-dictionary-pen-v11.dts
@@ -0,0 +1,1182 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
+ */
+
+/dts-v1/;
+#include <dt-bindings/display/drm_mipi_dsi.h>
+#include <dt-bindings/input/input.h>
+#include "rv1126.dtsi"
+
+/ {
+	model = "Rockchip RV1126 Scan Pen DDR3 Board";
+	compatible = "rockchip,rv1126-dictionary-pen-v11", "rockchip,rv1126";
+
+	chosen {
+		bootargs = "earlycon=uart8250,mmio32,0xff570000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rootfstype=ext4 rootwait snd_aloop.index=7";
+	};
+
+	adc-keys {
+		compatible = "adc-keys";
+		io-channels = <&saradc 0>;
+		io-channel-names = "buttons";
+		poll-interval = <100>;
+		keyup-threshold-microvolt = <1800000>;
+
+		volup-key {
+			label = "esc";
+			linux,code = <KEY_VOLUMEUP>;
+			press-threshold-microvolt = <17000>;
+		};
+
+		voldown-key {
+			label = "menu";
+			linux,code = <KEY_VOLUMEDOWN>;
+			press-threshold-microvolt = <300000>;
+		};
+	};
+
+	keys: gpio-keys {
+		compatible = "gpio-keys";
+
+		pinctrl-names = "default";
+		pinctrl-0 = <&camera_key>;
+
+		camera-key {
+			gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_CAMERA>;
+			label = "GPIO KEY_CAMERA";
+			wakeup-source;
+			debounce-interval = <20>;
+		};
+	};
+
+	backlight: backlight {
+		compatible = "pwm-backlight";
+		pwms = <&pwm2 0 25000 0>;
+		brightness-levels = <
+			  0   1   2   3   4   5   6   7
+			  8   9  10  11  12  13  14  15
+			 16  17  18  19  20  21  22  23
+			 24  25  26  27  28  29  30  31
+			 32  33  34  35  36  37  38  39
+			 40  41  42  43  44  45  46  47
+			 48  49  50  51  52  53  54  55
+			 56  57  58  59  60  61  62  63
+			 64  65  66  67  68  69  70  71
+			 72  73  74  75  76  77  78  79
+			 80  81  82  83  84  85  86  87
+			 88  89  90  91  92  93  94  95
+			 96  97  98  99 100 101 102 103
+			104 105 106 107 108 109 110 111
+			112 113 114 115 116 117 118 119
+			120 121 122 123 124 125 126 127
+			128 129 130 131 132 133 134 135
+			136 137 138 139 140 141 142 143
+			144 145 146 147 148 149 150 151
+			152 153 154 155 156 157 158 159
+			160 161 162 163 164 165 166 167
+			168 169 170 171 172 173 174 175
+			176 177 178 179 180 181 182 183
+			184 185 186 187 188 189 190 191
+			192 193 194 195 196 197 198 199
+			200 201 202 203 204 205 206 207
+			208 209 210 211 212 213 214 215
+			216 217 218 219 220 221 222 223
+			224 225 226 227 228 229 230 231
+			232 233 234 235 236 237 238 239
+			240 241 242 243 244 245 246 247
+			248 249 250 251 252 253 254 255>;
+		default-brightness-level = <200>;
+	};
+
+	charge-animation {
+		compatible = "rockchip,uboot-charge";
+		rockchip,uboot-charge-on = <1>;
+		rockchip,android-charge-on = <0>;
+		rockchip,uboot-low-power-voltage = <3518>;
+		rockchip,system-suspend = <0>;
+		rockchip,auto-wakeup-interval = <5>;
+		status = "okay";
+	};
+
+	leds {
+		compatible = "gpio-leds";
+		status = "okay";
+
+		camera-led {
+			gpios = <&gpio0 RK_PA7 GPIO_ACTIVE_LOW>;
+			label = "camera-led";
+			default-state = "off";
+		};
+	};
+
+	rk817_sound: rk817-sound {
+		compatible = "simple-audio-card";
+		simple-audio-card,name = "rockchip,rk817-codec";
+		simple-audio-card,mclk-fs = <256>;
+		simple-audio-card,dai-link@0 {
+			format = "i2s";
+			cpu {
+				sound-dai = <&i2s0_8ch>;
+			};
+			codec {
+				sound-dai = <&rk817_codec 0>;
+			};
+		};
+		simple-audio-card,dai-link@1 {
+			format = "pdm";
+			cpu {
+				sound-dai = <&pdm>;
+			};
+			codec {
+				sound-dai = <&rk817_codec 1>;
+			};
+		};
+	};
+
+	sdio_pwrseq: sdio-pwrseq {
+		compatible = "mmc-pwrseq-simple";
+		pinctrl-names = "default";
+		pinctrl-0 = <&wifi_enable_h>;
+
+		/*
+		 * On the module itself this is one of these (depending
+		 * on the actual card populated):
+		 * - SDIO_RESET_L_WL_REG_ON
+		 * - PDN (power down when low)
+		 */
+		reset-gpios = <&gpio1 RK_PD0 GPIO_ACTIVE_LOW>;
+	};
+
+	vcc18_lcd_n: vcc18-lcd-n {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc18_lcd_n";
+		gpio = <&gpio4 RK_PA1 GPIO_ACTIVE_LOW>;
+		enable-active-low;
+		regulator-boot-on;
+	};
+
+	vcc2v2_sys: vcc22sys {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc2v2_sys";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <2200000>;
+		regulator-max-microvolt = <2200000>;
+	};
+
+	vcc33_sd: vcc33-sd {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc33_sd";
+		pinctrl-names = "default";
+		pinctrl-0 = <&sdmmc_pwr>;
+		gpio = <&gpio2 RK_PD3 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+	};
+
+	vcc5v0_sys: vccsys {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc5v0_sys";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+	};
+
+	wireless-bluetooth {
+		compatible = "bluetooth-platdata";
+		uart_rts_gpios = <&gpio1 RK_PC0 GPIO_ACTIVE_LOW>;
+		pinctrl-names = "default", "rts_gpio";
+		pinctrl-0 = <&uart0_rtsn>;
+		pinctrl-1 = <&uart0_rtsn_gpio>;
+		BT,power_gpio    = <&gpio1 RK_PC6 GPIO_ACTIVE_HIGH>;
+		BT,wake_host_irq = <&gpio1 RK_PC4 GPIO_ACTIVE_HIGH>;
+		status = "okay";
+	};
+
+	wireless_wlan: wireless-wlan {
+		compatible = "wlan-platdata";
+		rockchip,grf = <&grf>;
+		wifi_chip_type = "rtl8723ds";
+		pinctrl-names = "default";
+		pinctrl-0 = <&wifi_wake_host>;
+		/* WIFI,poweren_gpio = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>; */
+		WIFI,host_wake_irq = <&gpio1 RK_PD1 GPIO_ACTIVE_HIGH>;
+		status = "okay";
+	};
+};
+
+&csi_dphy0 {
+	status = "okay";
+
+	ports {
+		#address-cells = <1>;
+		#size-cells = <0>;
+		port@0 {
+			reg = <0>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			mipi_in_ucam0: endpoint@1 {
+				reg = <1>;
+				remote-endpoint = <&ucam_out0>;
+				data-lanes = <1>;
+			};
+		};
+		port@1 {
+			reg = <1>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			csidphy0_out: endpoint@0 {
+				reg = <0>;
+				remote-endpoint = <&isp_in>;
+			};
+		};
+	};
+};
+
+&cpu0 {
+	cpu-supply = <&vdd_arm>;
+};
+
+&display_subsystem {
+	status = "okay";
+};
+
+&display_subsystem {
+	status = "okay";
+};
+
+&dsi {
+	status = "okay";
+
+	rockchip,lane-rate = <480>;
+	panel@0 {
+		compatible = "ilitek,ili9881d", "simple-panel-dsi";
+		reg = <0>;
+		backlight = <&backlight>;
+		power-supply = <&vcc18_lcd_n>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&lcd_rst>;
+		reset-gpios = <&gpio2 RK_PA2 GPIO_ACTIVE_LOW>;
+		prepare-delay-ms = <5>;
+		reset-delay-ms = <1>;
+		init-delay-ms = <80>;
+		disable-delay-ms = <10>;
+		unprepare-delay-ms = <5>;
+
+		width-mm = <68>;
+		height-mm = <121>;
+
+		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 = [
+			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 53
+			15 00 02 05 13
+			15 00 02 06 04
+			15 00 02 07 02
+			15 00 02 08 02
+			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 00
+			15 00 02 10 00
+			15 00 02 11 00
+			15 00 02 12 00
+			15 00 02 13 00
+			15 00 02 14 00
+			15 00 02 15 08
+			15 00 02 16 10
+			15 00 02 17 00
+			15 00 02 18 08
+			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 c0
+			15 00 02 1f 80
+			15 00 02 20 02
+			15 00 02 21 09
+			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 55
+			15 00 02 29 03
+			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 04
+			15 00 02 35 05
+			15 00 02 36 05
+			15 00 02 37 00
+			15 00 02 38 3c
+			15 00 02 39 35
+			15 00 02 3a 00
+			15 00 02 3b 40
+			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 88
+			15 00 02 42 00
+			15 00 02 43 00
+			15 00 02 44 1f
+			15 00 02 50 01
+			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 03
+			15 00 02 5f 14
+			15 00 02 60 15
+			15 00 02 61 0c
+			15 00 02 62 0d
+			15 00 02 63 0e
+			15 00 02 64 0f
+			15 00 02 65 10
+			15 00 02 66 11
+			15 00 02 67 08
+			15 00 02 68 02
+			15 00 02 69 0a
+			15 00 02 6a 02
+			15 00 02 6b 02
+			15 00 02 6c 02
+			15 00 02 6d 02
+			15 00 02 6e 02
+			15 00 02 6f 02
+			15 00 02 70 02
+			15 00 02 71 02
+			15 00 02 72 06
+			15 00 02 73 02
+			15 00 02 74 02
+			15 00 02 75 14
+			15 00 02 76 15
+			15 00 02 77 0f
+			15 00 02 78 0e
+			15 00 02 79 0d
+			15 00 02 7a 0c
+			15 00 02 7b 11
+			15 00 02 7c 10
+			15 00 02 7d 06
+			15 00 02 7e 02
+			15 00 02 7f 0a
+			15 00 02 80 02
+			15 00 02 81 02
+			15 00 02 82 02
+			15 00 02 83 02
+			15 00 02 84 02
+			15 00 02 85 02
+			15 00 02 86 02
+			15 00 02 87 02
+			15 00 02 88 08
+			15 00 02 89 02
+			15 00 02 8a 02
+			39 00 04 ff 98 81 04
+			15 00 02 00 80
+			15 00 02 70 00
+			15 00 02 71 00
+			15 00 02 66 fe
+			15 00 02 82 15
+			15 00 02 84 15
+			15 00 02 85 15
+			15 00 02 3a 24
+			15 00 02 32 ac
+			15 00 02 8c 80
+			15 00 02 3c f5
+			15 00 02 88 33
+			39 00 04 ff 98 81 01
+			15 00 02 22 0a
+			15 00 02 31 00
+			15 00 02 53 78
+			15 00 02 55 7b
+			15 00 02 60 20
+			15 00 02 61 00
+			15 00 02 62 0d
+			15 00 02 63 00
+			15 00 02 a0 00
+			15 00 02 a1 10
+			15 00 02 a2 1c
+			15 00 02 a3 13
+			15 00 02 a4 15
+			15 00 02 a5 26
+			15 00 02 a6 1a
+			15 00 02 a7 1d
+			15 00 02 a8 67
+			15 00 02 a9 1c
+			15 00 02 aa 29
+			15 00 02 ab 5b
+			15 00 02 ac 26
+			15 00 02 ad 28
+			15 00 02 ae 5c
+			15 00 02 af 30
+			15 00 02 b0 31
+			15 00 02 b1 32
+			15 00 02 b2 00
+			15 00 02 b1 2e
+			15 00 02 b2 32
+			15 00 02 b3 00
+			15 00 02 c0 00
+			15 00 02 c1 10
+			15 00 02 c2 1c
+			15 00 02 c3 13
+			15 00 02 c4 15
+			15 00 02 c5 26
+			15 00 02 c6 1a
+			15 00 02 c7 1d
+			15 00 02 c8 67
+			15 00 02 c9 1c
+			15 00 02 ca 29
+			15 00 02 cb 5b
+			15 00 02 cc 26
+			15 00 02 cd 28
+			15 00 02 ce 5c
+			15 00 02 cf 30
+			15 00 02 d0 31
+			15 00 02 d1 2e
+			15 00 02 d2 32
+			15 00 02 d3 00
+			39 00 04 ff 98 81 00
+			05 00 01 11
+			05 01 01 29
+		];
+
+		display-timings {
+			native-mode = <&timing0>;
+
+			timing0: timing0 {
+				clock-frequency = <65000000>;
+				hactive = <720>;
+				vactive = <1280>;
+				hfront-porch = <48>;
+				hsync-len = <8>;
+				hback-porch = <52>;
+				vfront-porch = <16>;
+				vsync-len = <6>;
+				vback-porch = <15>;
+				hsync-active = <0>;
+				vsync-active = <0>;
+				de-active = <0>;
+				pixelclk-active = <0>;
+			};
+		};
+
+		ports {
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			port@0 {
+				reg = <0>;
+				panel_in_dsi: endpoint {
+					remote-endpoint = <&dsi_out_panel>;
+				};
+			};
+		};
+	};
+
+	ports {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		port@1 {
+			reg = <1>;
+			dsi_out_panel: endpoint {
+				remote-endpoint = <&panel_in_dsi>;
+			};
+		};
+	};
+};
+
+&emmc {
+	bus-width = <8>;
+	cap-mmc-highspeed;
+	non-removable;
+	mmc-hs200-1_8v;
+	rockchip,default-sample-phase = <90>;
+	supports-emmc;
+	/delete-property/ pinctrl-names;
+	/delete-property/ pinctrl-0;
+	status = "okay";
+};
+
+&fiq_debugger {
+	status = "okay";
+};
+
+&i2c0 {
+	status = "okay";
+	clock-frequency = <400000>;
+
+	rk817: pmic@20 {
+		status = "okay";
+		compatible = "rockchip,rk817";
+		reg = <0x20>;
+		interrupt-parent = <&gpio0>;
+		interrupts = <9 IRQ_TYPE_LEVEL_LOW>;
+		pinctrl-names = "default", "pmic-sleep",
+						"pmic-power-off", "pmic-reset";
+		pinctrl-0 = <&pmic_int>;
+		pinctrl-1 = <&soc_slppin_gpio>, <&rk817_slppin_slp>;
+		pinctrl-2 = <&soc_slppin_gpio>, <&rk817_slppin_pwrdn>;
+		pinctrl-3 = <&soc_slppin_gpio>, <&rk817_slppin_slp>;
+		rockchip,system-power-controller;
+		wakeup-source;
+		#clock-cells = <1>;
+		clock-output-names = "rk808-clkout1", "rk808-clkout2";
+		/* 0: rst the pmic, 1: rst regs (default in codes) */
+		pmic-reset-func = <0>;
+
+		vcc1-supply = <&vcc5v0_sys>;
+		vcc2-supply = <&vcc5v0_sys>;
+		vcc3-supply = <&vcc5v0_sys>;
+		vcc4-supply = <&vcc5v0_sys>;
+		vcc5-supply = <&vcc2v2_sys>;
+		vcc6-supply = <&vcc2v2_sys>;
+		vcc7-supply = <&vcc5v0_sys>;
+		vcc8-supply = <&vcc5v0_sys>;
+		vcc9-supply = <&dcdc_boost>;
+
+		pwrkey {
+			status = "okay";
+		};
+
+		pinctrl_rk8xx: pinctrl_rk8xx {
+			gpio-controller;
+			#gpio-cells = <2>;
+
+			/omit-if-no-ref/
+			rk817_slppin_null: rk817_slppin_null {
+				pins = "gpio_slp";
+				function = "pin_fun0";
+			};
+
+			/omit-if-no-ref/
+			rk817_slppin_slp: rk817_slppin_slp {
+				pins = "gpio_slp";
+				function = "pin_fun1";
+			};
+
+			/omit-if-no-ref/
+			rk817_slppin_pwrdn: rk817_slppin_pwrdn {
+				pins = "gpio_slp";
+				function = "pin_fun2";
+			};
+
+			/omit-if-no-ref/
+			rk817_slppin_rst: rk817_slppin_rst {
+				pins = "gpio_slp";
+				function = "pin_fun3";
+			};
+		};
+
+		regulators {
+			vdd_npu_vepu: DCDC_REG1 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <650000>;
+				regulator-max-microvolt = <950000>;
+				regulator-ramp-delay = <6001>;
+				regulator-initial-mode = <0x2>;
+				regulator-name = "vdd_npu_vepu";
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <800000>;
+				};
+			};
+
+			vdd_arm: DCDC_REG2 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <725000>;
+				regulator-max-microvolt = <1350000>;
+				regulator-ramp-delay = <6001>;
+				regulator-initial-mode = <0x2>;
+				regulator-name = "vdd_arm";
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vcc_ddr: DCDC_REG3 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-initial-mode = <0x2>;
+				regulator-name = "vcc_ddr";
+				regulator-state-mem {
+					regulator-on-in-suspend;
+				};
+			};
+
+			vcc3v3_sys: DCDC_REG4 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <3300000>;
+				regulator-max-microvolt = <3300000>;
+				regulator-initial-mode = <0x2>;
+				regulator-name = "vcc3v3_sys";
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <3300000>;
+				};
+			};
+
+			vcc_0v8: LDO_REG1 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <800000>;
+				regulator-max-microvolt = <800000>;
+				regulator-name = "vcc_0v8";
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vcc1v8_pmu: LDO_REG2 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <1800000>;
+				regulator-name = "vcc1v8_pmu";
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <1800000>;
+				};
+			};
+
+			vdd0v8_pmu: LDO_REG3 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <800000>;
+				regulator-max-microvolt = <800000>;
+				regulator-name = "vcc0v8_pmu";
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <800000>;
+				};
+			};
+
+			vcc_1v8: LDO_REG4 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <1800000>;
+				regulator-name = "vcc_1v8";
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vcc_dovdd: LDO_REG5 {
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <1800000>;
+				regulator-name = "vcc_dovdd";
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vcc_dvdd: LDO_REG6 {
+				regulator-min-microvolt = <1500000>;
+				regulator-max-microvolt = <1500000>;
+				regulator-name = "vcc_dvdd";
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vcc_avdd: LDO_REG7 {
+				regulator-min-microvolt = <2800000>;
+				regulator-max-microvolt = <2800000>;
+				regulator-name = "vcc_avdd";
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vccio_sd: LDO_REG8 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <3300000>;
+				regulator-name = "vccio_sd";
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vcc3v3_lcd: LDO_REG9 {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <3300000>;
+				regulator-max-microvolt = <3300000>;
+				regulator-name = "vcc3v3_lcd";
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			dcdc_boost: BOOST {
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <4700000>;
+				regulator-max-microvolt = <5400000>;
+				regulator-name = "boost";
+			};
+
+			otg_switch: OTG_SWITCH {
+				regulator-name = "otg_switch";
+			};
+		};
+
+		battery {
+			compatible = "rk817,battery";
+			ocv_table = <3500 3625 3685 3697 3718 3735 3748
+			3760 3774 3788 3802 3816 3834 3853
+			3877 3908 3946 3975 4018 4071 4106>;
+			design_capacity = <950>;
+			design_qmax = <975>;
+			bat_res = <100>;
+			sleep_enter_current = <30>;
+			sleep_exit_current = <30>;
+			sleep_filter_current = <10>;
+			power_off_thresd = <3500>;
+			zero_algorithm_vol = <3850>;
+			max_soc_offset = <60>;
+			monitor_sec = <5>;
+			sample_res = <10>;
+			virtual_power = <0>;
+		};
+
+		charger {
+			compatible = "rk817,charger";
+			min_input_voltage = <4500>;
+			max_input_current = <1500>;
+			max_chrg_current = <500>;
+			max_chrg_voltage = <4350>;
+			chrg_term_mode = <0>;
+			chrg_finish_cur = <20>;
+			virtual_power = <0>;
+			dc_det_adc = <0>;
+			extcon = <&u2phy0>;
+		};
+
+		rk817_codec: codec {
+			#sound-dai-cells = <1>;
+			compatible = "rockchip,rk817-codec";
+			clocks = <&cru MCLK_I2S0_TX_OUT2IO>;
+			clock-names = "mclk";
+			assigned-clocks = <&cru MCLK_I2S0_TX_OUT2IO>;
+			assigned-clock-parents = <&cru MCLK_I2S0_TX>;
+			pinctrl-names = "default";
+			pinctrl-0 = <&i2s0m0_mclk>;
+			hp-volume = <20>;
+			spk-volume = <3>;
+			status = "okay";
+		};
+	};
+};
+
+&i2c1 {
+	status = "okay";
+	clock-frequency = <400000>;
+
+	ov7251: ov7251@60 {
+		compatible = "ovti,ov7251";
+		reg = <0x60>;
+
+		clocks = <&cru CLK_MIPICSI_OUT>;
+		clock-names = "xvclk";
+
+		power-domains = <&power RV1126_PD_VI>;
+		pinctrl-names = "rockchip,camera_default";
+		pinctrl-0 = <&mipicsi_clk0>;
+
+		avdd-supply = <&vcc_avdd>;
+		dovdd-supply = <&vcc_dovdd>;
+		dvdd-supply = <&vcc_dvdd>;
+
+		reset-gpios = <&gpio1 RK_PD5 GPIO_ACTIVE_LOW>;
+		pwdn-gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_HIGH>;
+
+		rockchip,camera-module-index = <0>;
+		rockchip,camera-module-facing = "back";
+		rockchip,camera-module-name = "default";
+		rockchip,camera-module-lens-name = "default";
+
+		port {
+			ucam_out0: endpoint {
+				remote-endpoint = <&mipi_in_ucam0>;
+				data-lanes = <1>;
+			};
+		};
+	};
+};
+
+&i2c3 {
+	status = "okay";
+	clock-frequency = <400000>;
+
+	gt1x: gt1x@14 {
+		compatible = "goodix,gt1x";
+		reg = <0x14>;
+		goodix,rst-gpio = <&gpio2 RK_PA1 GPIO_ACTIVE_HIGH>;
+		goodix,irq-gpio = <&gpio2 RK_PA0 IRQ_TYPE_LEVEL_LOW>;
+	};
+};
+
+&i2s0_8ch {
+	status = "okay";
+	#sound-dai-cells = <0>;
+	rockchip,clk-trcm = <1>;
+	rockchip,i2s-rx-route = <0 1 2 3>;
+	pinctrl-names = "default";
+	pinctrl-0 = <&i2s0m0_sclk_tx
+		&i2s0m0_lrck_tx
+		&i2s0m0_sdi0
+		&i2s0m0_sdo0>;
+};
+
+&isp_reserved {
+	size = <0x2000000>;
+};
+
+&mipi_dphy {
+	status = "okay";
+};
+
+&mpp_srv {
+	status = "okay";
+};
+
+&npu {
+	npu-supply = <&vdd_npu_vepu>;
+	status = "okay";
+};
+
+&npu_tsadc {
+	status = "okay";
+};
+
+&optee {
+	status = "disabled";
+};
+
+&otp {
+	status = "okay";
+};
+
+&pdm {
+	status = "okay";
+	#sound-dai-cells = <0>;
+	pinctrl-names = "default";
+	pinctrl-0 = <&pdmm0_clk &pdmm0_sdi3>;
+	rockchip,path-map = <3 0 1 2>;
+};
+
+&pinctrl {
+	keys {
+		camera_key: camera-key {
+			rockchip,pins = <0 RK_PA4 RK_FUNC_GPIO &pcfg_pull_up>;
+		};
+	};
+
+	lcd {
+		/omit-if-no-ref/
+		lcd_rst: lcd-rst {
+			rockchip,pins =	<2 RK_PA2 0 &pcfg_pull_none>;
+		};
+	};
+
+	pmic {
+		/omit-if-no-ref/
+		pmic_int: pmic_int {
+			rockchip,pins =
+				<0 RK_PB1 RK_FUNC_GPIO &pcfg_pull_up>;
+		};
+
+		/omit-if-no-ref/
+		soc_slppin_gpio: soc_slppin_gpio {
+			rockchip,pins =
+				<0 RK_PB2 RK_FUNC_GPIO &pcfg_output_low>;
+		};
+
+		/omit-if-no-ref/
+		soc_slppin_slp: soc_slppin_slp {
+			rockchip,pins =
+				<0 RK_PB2 RK_FUNC_1 &pcfg_pull_down>;
+		};
+
+		/omit-if-no-ref/
+		soc_slppin_rst: soc_slppin_rst {
+			rockchip,pins =
+				<0 RK_PB2 RK_FUNC_2 &pcfg_pull_none>;
+		};
+	};
+
+	sdio-pwrseq {
+		/omit-if-no-ref/
+		wifi_enable_h: wifi-enable-h {
+			rockchip,pins = <1 RK_PD0 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+
+	sdcard {
+		/omit-if-no-ref/
+		sdmmc_pwr: sdmmc-pwr {
+			rockchip,pins = <2 RK_PD3 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+
+	wireless-wlan {
+		/omit-if-no-ref/
+		wifi_wake_host: wifi-wake-host {
+			rockchip,pins = <1 RK_PD1 0 &pcfg_pull_up>;
+		};
+	};
+};
+
+&pmu_io_domains {
+	status = "okay";
+
+	pmuio0-supply = <&vcc3v3_sys>;
+	pmuio1-supply = <&vcc3v3_sys>;
+	vccio2-supply = <&vccio_sd>;
+	vccio3-supply = <&vcc3v3_sys>;
+	vccio4-supply = <&vcc_1v8>;
+	vccio5-supply = <&vcc3v3_sys>;
+	vccio6-supply = <&vcc3v3_sys>;
+	vccio7-supply = <&vcc_1v8>;
+};
+
+&rockchip_suspend {
+	status = "okay";
+	rockchip,sleep-debug-en = <1>;
+	rockchip,sleep-mode-config = <
+		(0
+		| RKPM_SLP_ARMOFF
+		| RKPM_SLP_PMU_PMUALIVE_32K
+		| RKPM_SLP_PMU_DIS_OSC
+		| RKPM_SLP_PMIC_LP
+		)
+	>;
+	rockchip,wakeup-config = <
+		(0
+		| RKPM_GPIO_WKUP_EN
+		)
+	>;
+};
+
+&pwm2 {
+	status = "okay";
+};
+
+&ramoops {
+	status = "okay";
+};
+
+&route_dsi {
+	status = "okay";
+};
+
+&rk_rga {
+	status = "okay";
+};
+
+&rkcif_mmu {
+	status = "disabled";
+};
+
+&rkisp {
+	status = "okay";
+};
+
+&rkisp_vir0 {
+	status = "okay";
+
+	ports {
+		port@0 {
+			reg = <0>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			isp_in: endpoint@0 {
+				reg = <0>;
+				remote-endpoint = <&csidphy0_out>;
+			};
+		};
+	};
+};
+
+&rkisp_mmu {
+	status = "disabled";
+};
+
+&rkispp {
+	status = "okay";
+	/* the max input w h and fps of mulit sensor */
+	//max-input = <2688 1520 30>;
+};
+
+&rkispp_vir0 {
+	status = "okay";
+};
+
+&rkispp_mmu {
+	status = "okay";
+};
+
+&rkvdec {
+	status = "okay";
+};
+
+&rkvdec_mmu {
+	status = "okay";
+};
+
+&rkvenc {
+	venc-supply = <&vdd_npu_vepu>;
+	status = "okay";
+};
+
+&rkvenc_mmu {
+	status = "okay";
+};
+
+&rkvenc_opp_table {
+	/*
+	 * max IR-drop values on different freq condition for this board!
+	 */
+	rockchip,board-irdrop = <
+	     /* MHz	MHz	uV */
+		500	594	50000
+	>;
+};
+
+&rng {
+	status = "okay";
+};
+
+&saradc {
+	status = "okay";
+	vref-supply = <&vcc_1v8>;
+};
+
+&sdmmc {
+	bus-width = <4>;
+	cap-mmc-highspeed;
+	cap-sd-highspeed;
+	card-detect-delay = <200>;
+	rockchip,default-sample-phase = <90>;
+	supports-sd;
+	sd-uhs-sdr12;
+	sd-uhs-sdr25;
+	sd-uhs-sdr104;
+	vqmmc-supply = <&vccio_sd>;
+	vmmc-supply = <&vcc33_sd>;
+	status = "disabled";
+};
+
+&sdio {
+	max-frequency = <200000000>;
+	bus-width = <4>;
+	cap-sd-highspeed;
+	cap-sdio-irq;
+	keep-power-in-suspend;
+	non-removable;
+	rockchip,default-sample-phase = <90>;
+	sd-uhs-sdr104;
+	supports-sdio;
+	mmc-pwrseq = <&sdio_pwrseq>;
+	status = "okay";
+};
+
+&sfc {
+	status = "disabled";
+};
+
+&u2phy0 {
+	status = "okay";
+	vup-gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_LOW>;
+	u2phy_otg: otg-port {
+		status = "okay";
+	};
+};
+
+&u2phy1 {
+	status = "disabled";
+};
+
+&uart0 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&uart0_xfer &uart0_ctsn>;
+	status = "okay";
+};
+
+&usb_host0_ehci {
+	status = "okay";
+};
+
+&usb_host0_ohci {
+	status = "okay";
+};
+
+&usbdrd {
+	status = "okay";
+};
+
+&usbdrd_dwc3 {
+	status = "okay";
+	extcon = <&u2phy0>;
+};
+
+&vdpu {
+	status = "okay";
+};
+
+&vepu {
+	status = "okay";
+};
+
+&vpu_mmu {
+	status = "okay";
+};
+
+&vop {
+	status = "okay";
+};
+
+&vop_mmu {
+	status = "okay";
+};

commit 5f6d039e73b45d4827923d895998d64c99bba3e5
Author: Algea Cao <algea.cao@rock-chips.com>
Date:   Tue Aug 10 19:46:22 2021 +0800

    drm/bridge: synopsys: dw-hdmi: Support force logo display
    
    Signed-off-by: Algea Cao <algea.cao@rock-chips.com>
    Change-Id: Ib885ab7064a874a898b1ae005f2a4d8e4e9a1b01

diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index d02c1bf563cf..d68476f6c121 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -325,6 +325,7 @@ struct dw_hdmi {
 	bool sink_has_audio;
 	bool hpd_state;
 	bool support_hdmi;
+	bool force_logo;
 	int force_output;
 
 	struct delayed_work work;
@@ -2688,11 +2689,13 @@ dw_hdmi_connector_detect(struct drm_connector *connector, bool force)
 					     connector);
 	int connect_status;
 
-	mutex_lock(&hdmi->mutex);
-	hdmi->force = DRM_FORCE_UNSPECIFIED;
-	dw_hdmi_update_power(hdmi);
-	dw_hdmi_update_phy_mask(hdmi);
-	mutex_unlock(&hdmi->mutex);
+	if (!hdmi->force_logo) {
+		mutex_lock(&hdmi->mutex);
+		hdmi->force = DRM_FORCE_UNSPECIFIED;
+		dw_hdmi_update_power(hdmi);
+		dw_hdmi_update_phy_mask(hdmi);
+		mutex_unlock(&hdmi->mutex);
+	}
 
 	connect_status = hdmi->phy.ops->read_hpd(hdmi, hdmi->phy.data);
 	if (connect_status == connector_status_connected)
@@ -3216,7 +3219,7 @@ void dw_hdmi_setup_rx_sense(struct dw_hdmi *hdmi, bool hpd, bool rx_sense)
 {
 	mutex_lock(&hdmi->mutex);
 
-	if (!hdmi->force) {
+	if (!hdmi->force && !hdmi->force_logo) {
 		/*
 		 * If the RX sense status indicates we're disconnected,
 		 * clear the software rxsense status.
@@ -3735,6 +3738,42 @@ static void dw_hdmi_register_hdcp(struct device *dev, struct dw_hdmi *hdmi,
 		hdmi->hdcp = hdmi->hdcp_dev->dev.platform_data;
 }
 
+static int get_force_logo_property(struct dw_hdmi *hdmi)
+{
+	struct device_node *dss;
+	struct device_node *route;
+	struct device_node *route_hdmi;
+
+	dss = of_find_node_by_name(NULL, "display-subsystem");
+	if (!dss) {
+		dev_err(hdmi->dev, "can't find display-subsystem\n");
+		return -ENODEV;
+	}
+
+	route = of_find_node_by_name(dss, "route");
+	if (!route) {
+		dev_err(hdmi->dev, "can't find route\n");
+		of_node_put(dss);
+		return -ENODEV;
+	}
+	of_node_put(dss);
+
+	route_hdmi = of_find_node_by_name(route, "route-hdmi");
+	if (!route_hdmi) {
+		dev_err(hdmi->dev, "can't find route-hdmi\n");
+		of_node_put(route);
+		return -ENODEV;
+	}
+	of_node_put(route);
+
+	hdmi->force_logo =
+		of_property_read_bool(route_hdmi, "force-output");
+
+	of_node_put(route_hdmi);
+
+	return 0;
+}
+
 static struct dw_hdmi *
 __dw_hdmi_probe(struct platform_device *pdev,
 		const struct dw_hdmi_plat_data *plat_data)
@@ -3889,10 +3928,14 @@ __dw_hdmi_probe(struct platform_device *pdev,
 		 prod_id1 & HDMI_PRODUCT_ID1_HDCP ? "with" : "without",
 		 hdmi->phy.name);
 
+	ret = get_force_logo_property(hdmi);
+	if (ret)
+		goto err_iahb;
+
 	hdmi->initialized = false;
 	ret = hdmi_readb(hdmi, HDMI_PHY_STAT0);
-	if ((ret & HDMI_PHY_TX_PHY_LOCK) && (ret & HDMI_PHY_HPD) &&
-	    hdmi_readb(hdmi, HDMI_FC_EXCTRLDUR)) {
+	if (((ret & HDMI_PHY_TX_PHY_LOCK) && (ret & HDMI_PHY_HPD) &&
+	     hdmi_readb(hdmi, HDMI_FC_EXCTRLDUR)) || hdmi->force_logo) {
 		hdmi->mc_clkdis = hdmi_readb(hdmi, HDMI_MC_CLKDIS);
 		hdmi->disabled = false;
 		hdmi->bridge_is_on = true;

commit 62e744244ff39bccadb1b97efb49b7782dfcd881
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Tue Jul 6 15:08:43 2021 +0800

    drm/rockchip: drv: add rockchip default mode when enable force output
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: Iebc75e54f4bef12baac694fc54a45af33540c783

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index 80ab47b65555..14b3d89a2be0 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -91,6 +91,7 @@ struct rockchip_drm_mode_set {
 	unsigned int hue;
 
 	bool mode_changed;
+	bool force_output;
 	int ratio;
 };
 
@@ -562,6 +563,8 @@ of_parse_display_resource(struct drm_device *drm_dev, struct device_node *route)
 	else
 		set->hue = 50;
 
+	set->force_output = of_property_read_bool(route, "force-output");
+
 	if (!of_property_read_u32(route, "cubic_lut,offset", &val)) {
 		private->cubic_lut[crtc->index].enable = true;
 		private->cubic_lut[crtc->index].offset = val;
@@ -580,7 +583,8 @@ of_parse_display_resource(struct drm_device *drm_dev, struct device_node *route)
 }
 
 static int rockchip_drm_fill_connector_modes(struct drm_connector *connector,
-					     uint32_t maxX, uint32_t maxY)
+					     uint32_t maxX, uint32_t maxY,
+					     bool force_output)
 {
 	struct drm_device *dev = connector->dev;
 	struct drm_display_mode *mode;
@@ -598,6 +602,8 @@ static int rockchip_drm_fill_connector_modes(struct drm_connector *connector,
 	list_for_each_entry(mode, &connector->modes, head)
 		mode->status = MODE_STALE;
 
+	if (force_output)
+		connector->force = DRM_FORCE_ON;
 	if (connector->force) {
 		if (connector->force == DRM_FORCE_ON ||
 		    connector->force == DRM_FORCE_ON_DIGITAL)
@@ -656,6 +662,8 @@ static int rockchip_drm_fill_connector_modes(struct drm_connector *connector,
 
 	if (count == 0 && connector->status == connector_status_connected)
 		count = drm_add_modes_noedid(connector, 1024, 768);
+	if (force_output)
+		count += rockchip_drm_add_modes_noedid(connector);
 	if (count == 0)
 		goto prune;
 
@@ -744,7 +752,7 @@ static int setup_initial_state(struct drm_device *drm_dev,
 	if (encoder_funcs->loader_protect)
 		encoder_funcs->loader_protect(conn_state->best_encoder, true);
 	conn_state->best_encoder->loader_protect = true;
-	num_modes = rockchip_drm_fill_connector_modes(connector, 4096, 4096);
+	num_modes = rockchip_drm_fill_connector_modes(connector, 4096, 4096, set->force_output);
 	if (!num_modes) {
 		dev_err(drm_dev->dev, "connector[%s] can't found any modes\n",
 			connector->name);
@@ -1086,6 +1094,8 @@ static void show_loader_logo(struct drm_device *drm_dev)
 	 */
 
 	list_for_each_entry_safe(set, tmp, &mode_set_list, head) {
+		if (set->force_output)
+			set->connector->force = DRM_FORCE_UNSPECIFIED;
 		list_del(&set->head);
 		kfree(set);
 	}

commit e5b7307b0fbd944e4885eba366774ba7b16625b1
Merge: 78a4d032ec09 59456c9cc40c
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Sun Aug 15 14:05:09 2021 +0200

    Merge 4.19.204 into android-4.19-stable
    
    Changes in 4.19.204
            KVM: SVM: Fix off-by-one indexing when nullifying last used SEV VMCB
            tracing: Reject string operand in the histogram expression
            bpf: Inherit expanded/patched seen count from old aux data
            bpf: Do not mark insn as seen under speculative path verification
            bpf: Fix leakage under speculation on mispredicted branches
            bpf, selftests: Adjust few selftest outcomes wrt unreachable code
            KVM: X86: MMU: Use the correct inherited permissions to get shadow page
            USB:ehci:fix Kunpeng920 ehci hardware problem
            ppp: Fix generating ppp unit id when ifname is not specified
            ovl: prevent private clone if bind mount is not allowed
            net: xilinx_emaclite: Do not print real IOMEM pointer
            Linux 4.19.204
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I976cb68d2906fa68add207bca749a1964378c916

commit 59456c9cc40c8f75b5a7efa0fe1f211d9c6fcaf1
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Sun Aug 15 13:05:05 2021 +0200

    Linux 4.19.204
    
    Link: https://lore.kernel.org/r/20210813150520.072304554@linuxfoundation.org
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index 6d2670300d47..d4ffcafb8efa 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 203
+SUBLEVEL = 204
 EXTRAVERSION =
 NAME = "People's Front"
 

commit 9322401477a6d1f9de8f18e5d6eb43a68e0b113a
Author: YueHaibing <yuehaibing@huawei.com>
Date:   Wed May 19 10:47:04 2021 +0800

    net: xilinx_emaclite: Do not print real IOMEM pointer
    
    commit d0d62baa7f505bd4c59cd169692ff07ec49dde37 upstream.
    
    Printing kernel pointers is discouraged because they might leak kernel
    memory layout.  This fixes smatch warning:
    
    drivers/net/ethernet/xilinx/xilinx_emaclite.c:1191 xemaclite_of_probe() warn:
     argument 4 to %08lX specifier is cast from pointer
    
    Signed-off-by: YueHaibing <yuehaibing@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Pavel Machek (CIP) <pavel@denx.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/xilinx/xilinx_emaclite.c b/drivers/net/ethernet/xilinx/xilinx_emaclite.c
index c77c81eb7ab3..edb2215f9993 100644
--- a/drivers/net/ethernet/xilinx/xilinx_emaclite.c
+++ b/drivers/net/ethernet/xilinx/xilinx_emaclite.c
@@ -1177,9 +1177,8 @@ static int xemaclite_of_probe(struct platform_device *ofdev)
 	}
 
 	dev_info(dev,
-		 "Xilinx EmacLite at 0x%08X mapped to 0x%08X, irq=%d\n",
-		 (unsigned int __force)ndev->mem_start,
-		 (unsigned int __force)lp->base_addr, ndev->irq);
+		 "Xilinx EmacLite at 0x%08X mapped to 0x%p, irq=%d\n",
+		 (unsigned int __force)ndev->mem_start, lp->base_addr, ndev->irq);
 	return 0;
 
 error:

commit 963d85d630dabe75a3cfde44a006fec3304d07b8
Author: Miklos Szeredi <mszeredi@redhat.com>
Date:   Mon Aug 9 10:19:47 2021 +0200

    ovl: prevent private clone if bind mount is not allowed
    
    commit 427215d85e8d1476da1a86b8d67aceb485eb3631 upstream.
    
    Add the following checks from __do_loopback() to clone_private_mount() as
    well:
    
     - verify that the mount is in the current namespace
    
     - verify that there are no locked children
    
    Reported-by: Alois Wohlschlager <alois1@gmx-topmail.de>
    Fixes: c771d683a62e ("vfs: introduce clone_private_mount()")
    Cc: <stable@vger.kernel.org> # v3.18
    Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/namespace.c b/fs/namespace.c
index 741f40cd955e..edd397fa2991 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -1799,6 +1799,20 @@ void drop_collected_mounts(struct vfsmount *mnt)
 	namespace_unlock();
 }
 
+static bool has_locked_children(struct mount *mnt, struct dentry *dentry)
+{
+	struct mount *child;
+
+	list_for_each_entry(child, &mnt->mnt_mounts, mnt_child) {
+		if (!is_subdir(child->mnt_mountpoint, dentry))
+			continue;
+
+		if (child->mnt.mnt_flags & MNT_LOCKED)
+			return true;
+	}
+	return false;
+}
+
 /**
  * clone_private_mount - create a private clone of a path
  *
@@ -1813,14 +1827,27 @@ struct vfsmount *clone_private_mount(const struct path *path)
 	struct mount *old_mnt = real_mount(path->mnt);
 	struct mount *new_mnt;
 
+	down_read(&namespace_sem);
 	if (IS_MNT_UNBINDABLE(old_mnt))
-		return ERR_PTR(-EINVAL);
+		goto invalid;
+
+	if (!check_mnt(old_mnt))
+		goto invalid;
+
+	if (has_locked_children(old_mnt, path->dentry))
+		goto invalid;
 
 	new_mnt = clone_mnt(old_mnt, path->dentry, CL_PRIVATE);
+	up_read(&namespace_sem);
+
 	if (IS_ERR(new_mnt))
 		return ERR_CAST(new_mnt);
 
 	return &new_mnt->mnt;
+
+invalid:
+	up_read(&namespace_sem);
+	return ERR_PTR(-EINVAL);
 }
 EXPORT_SYMBOL_GPL(clone_private_mount);
 
@@ -2136,19 +2163,6 @@ static int do_change_type(struct path *path, int ms_flags)
 	return err;
 }
 
-static bool has_locked_children(struct mount *mnt, struct dentry *dentry)
-{
-	struct mount *child;
-	list_for_each_entry(child, &mnt->mnt_mounts, mnt_child) {
-		if (!is_subdir(child->mnt_mountpoint, dentry))
-			continue;
-
-		if (child->mnt.mnt_flags & MNT_LOCKED)
-			return true;
-	}
-	return false;
-}
-
 /*
  * do loopback mount.
  */

commit ef8e4a33c0b89677cb8f158413bff2fa594696f2
Author: Pali Rohár <pali@kernel.org>
Date:   Sat Aug 7 18:00:50 2021 +0200

    ppp: Fix generating ppp unit id when ifname is not specified
    
    commit 3125f26c514826077f2a4490b75e9b1c7a644c42 upstream.
    
    When registering new ppp interface via PPPIOCNEWUNIT ioctl then kernel has
    to choose interface name as this ioctl API does not support specifying it.
    
    Kernel in this case register new interface with name "ppp<id>" where <id>
    is the ppp unit id, which can be obtained via PPPIOCGUNIT ioctl. This
    applies also in the case when registering new ppp interface via rtnl
    without supplying IFLA_IFNAME.
    
    PPPIOCNEWUNIT ioctl allows to specify own ppp unit id which will kernel
    assign to ppp interface, in case this ppp id is not already used by other
    ppp interface.
    
    In case user does not specify ppp unit id then kernel choose the first free
    ppp unit id. This applies also for case when creating ppp interface via
    rtnl method as it does not provide a way for specifying own ppp unit id.
    
    If some network interface (does not have to be ppp) has name "ppp<id>"
    with this first free ppp id then PPPIOCNEWUNIT ioctl or rtnl call fails.
    
    And registering new ppp interface is not possible anymore, until interface
    which holds conflicting name is renamed. Or when using rtnl method with
    custom interface name in IFLA_IFNAME.
    
    As list of allocated / used ppp unit ids is not possible to retrieve from
    kernel to userspace, userspace has no idea what happens nor which interface
    is doing this conflict.
    
    So change the algorithm how ppp unit id is generated. And choose the first
    number which is not neither used as ppp unit id nor in some network
    interface with pattern "ppp<id>".
    
    This issue can be simply reproduced by following pppd call when there is no
    ppp interface registered and also no interface with name pattern "ppp<id>":
    
        pppd ifname ppp1 +ipv6 noip noauth nolock local nodetach pty "pppd +ipv6 noip noauth nolock local nodetach notty"
    
    Or by creating the one ppp interface (which gets assigned ppp unit id 0),
    renaming it to "ppp1" and then trying to create a new ppp interface (which
    will always fails as next free ppp unit id is 1, but network interface with
    name "ppp1" exists).
    
    This patch fixes above described issue by generating new and new ppp unit
    id until some non-conflicting id with network interfaces is generated.
    
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c
index 3e014ecffef8..1af47aaa7ba5 100644
--- a/drivers/net/ppp/ppp_generic.c
+++ b/drivers/net/ppp/ppp_generic.c
@@ -287,7 +287,7 @@ static struct channel *ppp_find_channel(struct ppp_net *pn, int unit);
 static int ppp_connect_channel(struct channel *pch, int unit);
 static int ppp_disconnect_channel(struct channel *pch);
 static void ppp_destroy_channel(struct channel *pch);
-static int unit_get(struct idr *p, void *ptr);
+static int unit_get(struct idr *p, void *ptr, int min);
 static int unit_set(struct idr *p, void *ptr, int n);
 static void unit_put(struct idr *p, int n);
 static void *unit_find(struct idr *p, int n);
@@ -963,9 +963,20 @@ static int ppp_unit_register(struct ppp *ppp, int unit, bool ifname_is_set)
 	mutex_lock(&pn->all_ppp_mutex);
 
 	if (unit < 0) {
-		ret = unit_get(&pn->units_idr, ppp);
+		ret = unit_get(&pn->units_idr, ppp, 0);
 		if (ret < 0)
 			goto err;
+		if (!ifname_is_set) {
+			while (1) {
+				snprintf(ppp->dev->name, IFNAMSIZ, "ppp%i", ret);
+				if (!__dev_get_by_name(ppp->ppp_net, ppp->dev->name))
+					break;
+				unit_put(&pn->units_idr, ret);
+				ret = unit_get(&pn->units_idr, ppp, ret + 1);
+				if (ret < 0)
+					goto err;
+			}
+		}
 	} else {
 		/* Caller asked for a specific unit number. Fail with -EEXIST
 		 * if unavailable. For backward compatibility, return -EEXIST
@@ -3252,9 +3263,9 @@ static int unit_set(struct idr *p, void *ptr, int n)
 }
 
 /* get new free unit number and associate pointer with it */
-static int unit_get(struct idr *p, void *ptr)
+static int unit_get(struct idr *p, void *ptr, int min)
 {
-	return idr_alloc(p, ptr, 0, 0, GFP_KERNEL);
+	return idr_alloc(p, ptr, min, 0, GFP_KERNEL);
 }
 
 /* put unit number back to a pool */

commit 6b862aa345f04b33e44c606abc9698eef42f62e5
Author: Longfang Liu <liulongfang@huawei.com>
Date:   Fri Apr 9 16:48:01 2021 +0800

    USB:ehci:fix Kunpeng920 ehci hardware problem
    
    commit 26b75952ca0b8b4b3050adb9582c8e2f44d49687 upstream.
    
    Kunpeng920's EHCI controller does not have SBRN register.
    Reading the SBRN register when the controller driver is
    initialized will get 0.
    
    When rebooting the EHCI driver, ehci_shutdown() will be called.
    if the sbrn flag is 0, ehci_shutdown() will return directly.
    The sbrn flag being 0 will cause the EHCI interrupt signal to
    not be turned off after reboot. this interrupt that is not closed
    will cause an exception to the device sharing the interrupt.
    
    Therefore, the EHCI controller of Kunpeng920 needs to skip
    the read operation of the SBRN register.
    
    Acked-by: Alan Stern <stern@rowland.harvard.edu>
    Signed-off-by: Longfang Liu <liulongfang@huawei.com>
    Link: https://lore.kernel.org/r/1617958081-17999-1-git-send-email-liulongfang@huawei.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c
index fcfad5c298a9..56e6fd0f0482 100644
--- a/drivers/usb/host/ehci-pci.c
+++ b/drivers/usb/host/ehci-pci.c
@@ -298,6 +298,9 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
 	if (pdev->vendor == PCI_VENDOR_ID_STMICRO
 	    && pdev->device == PCI_DEVICE_ID_STMICRO_USB_HOST)
 		;	/* ConneXT has no sbrn register */
+	else if (pdev->vendor == PCI_VENDOR_ID_HUAWEI
+			 && pdev->device == 0xa239)
+		;	/* HUAWEI Kunpeng920 USB EHCI has no sbrn register */
 	else
 		pci_read_config_byte(pdev, 0x60, &ehci->sbrn);
 

commit 4c07e70141eebd3db64297515a427deea4822957
Author: Lai Jiangshan <laijs@linux.alibaba.com>
Date:   Thu Jun 3 13:24:55 2021 +0800

    KVM: X86: MMU: Use the correct inherited permissions to get shadow page
    
    commit b1bd5cba3306691c771d558e94baa73e8b0b96b7 upstream.
    
    When computing the access permissions of a shadow page, use the effective
    permissions of the walk up to that point, i.e. the logic AND of its parents'
    permissions.  Two guest PxE entries that point at the same table gfn need to
    be shadowed with different shadow pages if their parents' permissions are
    different.  KVM currently uses the effective permissions of the last
    non-leaf entry for all non-leaf entries.  Because all non-leaf SPTEs have
    full ("uwx") permissions, and the effective permissions are recorded only
    in role.access and merged into the leaves, this can lead to incorrect
    reuse of a shadow page and eventually to a missing guest protection page
    fault.
    
    For example, here is a shared pagetable:
    
       pgd[]   pud[]        pmd[]            virtual address pointers
                         /->pmd1(u--)->pte1(uw-)->page1 <- ptr1 (u--)
            /->pud1(uw-)--->pmd2(uw-)->pte2(uw-)->page2 <- ptr2 (uw-)
       pgd-|           (shared pmd[] as above)
            \->pud2(u--)--->pmd1(u--)->pte1(uw-)->page1 <- ptr3 (u--)
                         \->pmd2(uw-)->pte2(uw-)->page2 <- ptr4 (u--)
    
      pud1 and pud2 point to the same pmd table, so:
      - ptr1 and ptr3 points to the same page.
      - ptr2 and ptr4 points to the same page.
    
    (pud1 and pud2 here are pud entries, while pmd1 and pmd2 here are pmd entries)
    
    - First, the guest reads from ptr1 first and KVM prepares a shadow
      page table with role.access=u--, from ptr1's pud1 and ptr1's pmd1.
      "u--" comes from the effective permissions of pgd, pud1 and
      pmd1, which are stored in pt->access.  "u--" is used also to get
      the pagetable for pud1, instead of "uw-".
    
    - Then the guest writes to ptr2 and KVM reuses pud1 which is present.
      The hypervisor set up a shadow page for ptr2 with pt->access is "uw-"
      even though the pud1 pmd (because of the incorrect argument to
      kvm_mmu_get_page in the previous step) has role.access="u--".
    
    - Then the guest reads from ptr3.  The hypervisor reuses pud1's
      shadow pmd for pud2, because both use "u--" for their permissions.
      Thus, the shadow pmd already includes entries for both pmd1 and pmd2.
    
    - At last, the guest writes to ptr4.  This causes no vmexit or pagefault,
      because pud1's shadow page structures included an "uw-" page even though
      its role.access was "u--".
    
    Any kind of shared pagetable might have the similar problem when in
    virtual machine without TDP enabled if the permissions are different
    from different ancestors.
    
    In order to fix the problem, we change pt->access to be an array, and
    any access in it will not include permissions ANDed from child ptes.
    
    The test code is: https://lore.kernel.org/kvm/20210603050537.19605-1-jiangshanlai@gmail.com/
    Remember to test it with TDP disabled.
    
    The problem had existed long before the commit 41074d07c78b ("KVM: MMU:
    Fix inherited permissions for emulated guest pte updates"), and it
    is hard to find which is the culprit.  So there is no fixes tag here.
    
    Signed-off-by: Lai Jiangshan <laijs@linux.alibaba.com>
    Message-Id: <20210603052455.21023-1-jiangshanlai@gmail.com>
    Cc: stable@vger.kernel.org
    Fixes: cea0f0e7ea54 ("[PATCH] KVM: MMU: Shadow page table caching")
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    [OP: - apply arch/x86/kvm/mmu/* changes to arch/x86/kvm
         - apply documentation changes to Documentation/virtual/kvm/mmu.txt
         - adjusted context in arch/x86/kvm/paging_tmpl.h]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Documentation/virtual/kvm/mmu.txt b/Documentation/virtual/kvm/mmu.txt
index e507a9e0421e..851a8abcadce 100644
--- a/Documentation/virtual/kvm/mmu.txt
+++ b/Documentation/virtual/kvm/mmu.txt
@@ -152,8 +152,8 @@ Shadow pages contain the following information:
     shadow pages) so role.quadrant takes values in the range 0..3.  Each
     quadrant maps 1GB virtual address space.
   role.access:
-    Inherited guest access permissions in the form uwx.  Note execute
-    permission is positive, not negative.
+    Inherited guest access permissions from the parent ptes in the form uwx.
+    Note execute permission is positive, not negative.
   role.invalid:
     The page is invalid and should not be used.  It is a root page that is
     currently pinned (by a cpu hardware register pointing to it); once it is
diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h
index 8220190b0605..9e15818de973 100644
--- a/arch/x86/kvm/paging_tmpl.h
+++ b/arch/x86/kvm/paging_tmpl.h
@@ -93,8 +93,8 @@ struct guest_walker {
 	gpa_t pte_gpa[PT_MAX_FULL_LEVELS];
 	pt_element_t __user *ptep_user[PT_MAX_FULL_LEVELS];
 	bool pte_writable[PT_MAX_FULL_LEVELS];
-	unsigned pt_access;
-	unsigned pte_access;
+	unsigned int pt_access[PT_MAX_FULL_LEVELS];
+	unsigned int pte_access;
 	gfn_t gfn;
 	struct x86_exception fault;
 };
@@ -388,13 +388,15 @@ static int FNAME(walk_addr_generic)(struct guest_walker *walker,
 		}
 
 		walker->ptes[walker->level - 1] = pte;
+
+		/* Convert to ACC_*_MASK flags for struct guest_walker.  */
+		walker->pt_access[walker->level - 1] = FNAME(gpte_access)(pt_access ^ walk_nx_mask);
 	} while (!is_last_gpte(mmu, walker->level, pte));
 
 	pte_pkey = FNAME(gpte_pkeys)(vcpu, pte);
 	accessed_dirty = have_ad ? pte_access & PT_GUEST_ACCESSED_MASK : 0;
 
 	/* Convert to ACC_*_MASK flags for struct guest_walker.  */
-	walker->pt_access = FNAME(gpte_access)(pt_access ^ walk_nx_mask);
 	walker->pte_access = FNAME(gpte_access)(pte_access ^ walk_nx_mask);
 	errcode = permission_fault(vcpu, mmu, walker->pte_access, pte_pkey, access);
 	if (unlikely(errcode))
@@ -433,7 +435,8 @@ static int FNAME(walk_addr_generic)(struct guest_walker *walker,
 	}
 
 	pgprintk("%s: pte %llx pte_access %x pt_access %x\n",
-		 __func__, (u64)pte, walker->pte_access, walker->pt_access);
+		 __func__, (u64)pte, walker->pte_access,
+		 walker->pt_access[walker->level - 1]);
 	return 1;
 
 error:
@@ -602,7 +605,7 @@ static int FNAME(fetch)(struct kvm_vcpu *vcpu, gpa_t addr,
 {
 	struct kvm_mmu_page *sp = NULL;
 	struct kvm_shadow_walk_iterator it;
-	unsigned direct_access, access = gw->pt_access;
+	unsigned int direct_access, access;
 	int top_level, ret;
 	gfn_t gfn, base_gfn;
 
@@ -634,6 +637,7 @@ static int FNAME(fetch)(struct kvm_vcpu *vcpu, gpa_t addr,
 		sp = NULL;
 		if (!is_shadow_present_pte(*it.sptep)) {
 			table_gfn = gw->table_gfn[it.level - 2];
+			access = gw->pt_access[it.level - 2];
 			sp = kvm_mmu_get_page(vcpu, table_gfn, addr, it.level-1,
 					      false, access);
 		}

commit c15b387769446c37a892f958b169744dabf7ff23
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Thu Aug 12 20:00:37 2021 +0300

    bpf, selftests: Adjust few selftest outcomes wrt unreachable code
    
    commit 973377ffe8148180b2651825b92ae91988141b05 upstream.
    
    In almost all cases from test_verifier that have been changed in here, we've
    had an unreachable path with a load from a register which has an invalid
    address on purpose. This was basically to make sure that we never walk this
    path and to have the verifier complain if it would otherwise. Change it to
    match on the right error for unprivileged given we now test these paths
    under speculative execution.
    
    There's one case where we match on exact # of insns_processed. Due to the
    extra path, this will of course mismatch on unprivileged. Thus, restrict the
    test->insn_processed check to privileged-only.
    
    In one other case, we result in a 'pointer comparison prohibited' error. This
    is similarly due to verifying an 'invalid' branch where we end up with a value
    pointer on one side of the comparison.
    
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: John Fastabend <john.fastabend@gmail.com>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    [OP: ignore changes to tests that do not exist in 4.19]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index b44324530948..c7d17781dbfe 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -2792,6 +2792,8 @@ static struct bpf_test tests[] = {
 			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0),
 			BPF_EXIT_INSN(),
 		},
+		.errstr_unpriv = "R7 invalid mem access 'inv'",
+		.result_unpriv = REJECT,
 		.result = ACCEPT,
 		.retval = 0,
 	},

commit 9df311b2e743642c5427ecf563c5050ceb355d1d
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Thu Aug 12 20:00:36 2021 +0300

    bpf: Fix leakage under speculation on mispredicted branches
    
    commit 9183671af6dbf60a1219371d4ed73e23f43b49db upstream.
    
    The verifier only enumerates valid control-flow paths and skips paths that
    are unreachable in the non-speculative domain. And so it can miss issues
    under speculative execution on mispredicted branches.
    
    For example, a type confusion has been demonstrated with the following
    crafted program:
    
      // r0 = pointer to a map array entry
      // r6 = pointer to readable stack slot
      // r9 = scalar controlled by attacker
      1: r0 = *(u64 *)(r0) // cache miss
      2: if r0 != 0x0 goto line 4
      3: r6 = r9
      4: if r0 != 0x1 goto line 6
      5: r9 = *(u8 *)(r6)
      6: // leak r9
    
    Since line 3 runs iff r0 == 0 and line 5 runs iff r0 == 1, the verifier
    concludes that the pointer dereference on line 5 is safe. But: if the
    attacker trains both the branches to fall-through, such that the following
    is speculatively executed ...
    
      r6 = r9
      r9 = *(u8 *)(r6)
      // leak r9
    
    ... then the program will dereference an attacker-controlled value and could
    leak its content under speculative execution via side-channel. This requires
    to mistrain the branch predictor, which can be rather tricky, because the
    branches are mutually exclusive. However such training can be done at
    congruent addresses in user space using different branches that are not
    mutually exclusive. That is, by training branches in user space ...
    
      A:  if r0 != 0x0 goto line C
      B:  ...
      C:  if r0 != 0x0 goto line D
      D:  ...
    
    ... such that addresses A and C collide to the same CPU branch prediction
    entries in the PHT (pattern history table) as those of the BPF program's
    lines 2 and 4, respectively. A non-privileged attacker could simply brute
    force such collisions in the PHT until observing the attack succeeding.
    
    Alternative methods to mistrain the branch predictor are also possible that
    avoid brute forcing the collisions in the PHT. A reliable attack has been
    demonstrated, for example, using the following crafted program:
    
      // r0 = pointer to a [control] map array entry
      // r7 = *(u64 *)(r0 + 0), training/attack phase
      // r8 = *(u64 *)(r0 + 8), oob address
      // [...]
      // r0 = pointer to a [data] map array entry
      1: if r7 == 0x3 goto line 3
      2: r8 = r0
      // crafted sequence of conditional jumps to separate the conditional
      // branch in line 193 from the current execution flow
      3: if r0 != 0x0 goto line 5
      4: if r0 == 0x0 goto exit
      5: if r0 != 0x0 goto line 7
      6: if r0 == 0x0 goto exit
      [...]
      187: if r0 != 0x0 goto line 189
      188: if r0 == 0x0 goto exit
      // load any slowly-loaded value (due to cache miss in phase 3) ...
      189: r3 = *(u64 *)(r0 + 0x1200)
      // ... and turn it into known zero for verifier, while preserving slowly-
      // loaded dependency when executing:
      190: r3 &= 1
      191: r3 &= 2
      // speculatively bypassed phase dependency
      192: r7 += r3
      193: if r7 == 0x3 goto exit
      194: r4 = *(u8 *)(r8 + 0)
      // leak r4
    
    As can be seen, in training phase (phase != 0x3), the condition in line 1
    turns into false and therefore r8 with the oob address is overridden with
    the valid map value address, which in line 194 we can read out without
    issues. However, in attack phase, line 2 is skipped, and due to the cache
    miss in line 189 where the map value is (zeroed and later) added to the
    phase register, the condition in line 193 takes the fall-through path due
    to prior branch predictor training, where under speculation, it'll load the
    byte at oob address r8 (unknown scalar type at that point) which could then
    be leaked via side-channel.
    
    One way to mitigate these is to 'branch off' an unreachable path, meaning,
    the current verification path keeps following the is_branch_taken() path
    and we push the other branch to the verification stack. Given this is
    unreachable from the non-speculative domain, this branch's vstate is
    explicitly marked as speculative. This is needed for two reasons: i) if
    this path is solely seen from speculative execution, then we later on still
    want the dead code elimination to kick in in order to sanitize these
    instructions with jmp-1s, and ii) to ensure that paths walked in the
    non-speculative domain are not pruned from earlier walks of paths walked in
    the speculative domain. Additionally, for robustness, we mark the registers
    which have been part of the conditional as unknown in the speculative path
    given there should be no assumptions made on their content.
    
    The fix in here mitigates type confusion attacks described earlier due to
    i) all code paths in the BPF program being explored and ii) existing
    verifier logic already ensuring that given memory access instruction
    references one specific data structure.
    
    An alternative to this fix that has also been looked at in this scope was to
    mark aux->alu_state at the jump instruction with a BPF_JMP_TAKEN state as
    well as direction encoding (always-goto, always-fallthrough, unknown), such
    that mixing of different always-* directions themselves as well as mixing of
    always-* with unknown directions would cause a program rejection by the
    verifier, e.g. programs with constructs like 'if ([...]) { x = 0; } else
    { x = 1; }' with subsequent 'if (x == 1) { [...] }'. For unprivileged, this
    would result in only single direction always-* taken paths, and unknown taken
    paths being allowed, such that the former could be patched from a conditional
    jump to an unconditional jump (ja). Compared to this approach here, it would
    have two downsides: i) valid programs that otherwise are not performing any
    pointer arithmetic, etc, would potentially be rejected/broken, and ii) we are
    required to turn off path pruning for unprivileged, where both can be avoided
    in this work through pushing the invalid branch to the verification stack.
    
    The issue was originally discovered by Adam and Ofek, and later independently
    discovered and reported as a result of Benedict and Piotr's research work.
    
    Fixes: b2157399cc98 ("bpf: prevent out-of-bounds speculation")
    Reported-by: Adam Morrison <mad@cs.tau.ac.il>
    Reported-by: Ofek Kirzner <ofekkir@gmail.com>
    Reported-by: Benedict Schlueter <benedict.schlueter@rub.de>
    Reported-by: Piotr Krysiuk <piotras@gmail.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: John Fastabend <john.fastabend@gmail.com>
    Reviewed-by: Benedict Schlueter <benedict.schlueter@rub.de>
    Reviewed-by: Piotr Krysiuk <piotras@gmail.com>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    [OP: use allow_ptr_leaks instead of bypass_spec_v1]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 566eeee5e334..2bf83305e5ab 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -2812,6 +2812,27 @@ struct bpf_sanitize_info {
 	bool mask_to_left;
 };
 
+static struct bpf_verifier_state *
+sanitize_speculative_path(struct bpf_verifier_env *env,
+			  const struct bpf_insn *insn,
+			  u32 next_idx, u32 curr_idx)
+{
+	struct bpf_verifier_state *branch;
+	struct bpf_reg_state *regs;
+
+	branch = push_stack(env, next_idx, curr_idx, true);
+	if (branch && insn) {
+		regs = branch->frame[branch->curframe]->regs;
+		if (BPF_SRC(insn->code) == BPF_K) {
+			mark_reg_unknown(env, regs, insn->dst_reg);
+		} else if (BPF_SRC(insn->code) == BPF_X) {
+			mark_reg_unknown(env, regs, insn->dst_reg);
+			mark_reg_unknown(env, regs, insn->src_reg);
+		}
+	}
+	return branch;
+}
+
 static int sanitize_ptr_alu(struct bpf_verifier_env *env,
 			    struct bpf_insn *insn,
 			    const struct bpf_reg_state *ptr_reg,
@@ -2895,7 +2916,8 @@ static int sanitize_ptr_alu(struct bpf_verifier_env *env,
 		tmp = *dst_reg;
 		*dst_reg = *ptr_reg;
 	}
-	ret = push_stack(env, env->insn_idx + 1, env->insn_idx, true);
+	ret = sanitize_speculative_path(env, NULL, env->insn_idx + 1,
+					env->insn_idx);
 	if (!ptr_is_dst_reg && ret)
 		*dst_reg = tmp;
 	return !ret ? REASON_STACK : 0;
@@ -4288,14 +4310,28 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env,
 		 tnum_is_const(src_reg->var_off))
 		pred = is_branch_taken(dst_reg, src_reg->var_off.value,
 				       opcode);
+
 	if (pred == 1) {
-		/* only follow the goto, ignore fall-through */
+		/* Only follow the goto, ignore fall-through. If needed, push
+		 * the fall-through branch for simulation under speculative
+		 * execution.
+		 */
+		if (!env->allow_ptr_leaks &&
+		    !sanitize_speculative_path(env, insn, *insn_idx + 1,
+					       *insn_idx))
+			return -EFAULT;
 		*insn_idx += insn->off;
 		return 0;
 	} else if (pred == 0) {
-		/* only follow fall-through branch, since
-		 * that's where the program will go
+		/* Only follow the fall-through branch, since that's where the
+		 * program will go. If needed, push the goto branch for
+		 * simulation under speculative execution.
 		 */
+		if (!env->allow_ptr_leaks &&
+		    !sanitize_speculative_path(env, insn,
+					       *insn_idx + insn->off + 1,
+					       *insn_idx))
+			return -EFAULT;
 		return 0;
 	}
 

commit c510c1845f7b54214b4117272e0d87dff8732af6
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Thu Aug 12 20:00:35 2021 +0300

    bpf: Do not mark insn as seen under speculative path verification
    
    commit fe9a5ca7e370e613a9a75a13008a3845ea759d6e upstream.
    
    ... in such circumstances, we do not want to mark the instruction as seen given
    the goal is still to jmp-1 rewrite/sanitize dead code, if it is not reachable
    from the non-speculative path verification. We do however want to verify it for
    safety regardless.
    
    With the patch as-is all the insns that have been marked as seen before the
    patch will also be marked as seen after the patch (just with a potentially
    different non-zero count). An upcoming patch will also verify paths that are
    unreachable in the non-speculative domain, hence this extension is needed.
    
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: John Fastabend <john.fastabend@gmail.com>
    Reviewed-by: Benedict Schlueter <benedict.schlueter@rub.de>
    Reviewed-by: Piotr Krysiuk <piotras@gmail.com>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    [OP: - env->pass_cnt is not used in 4.19, so adjust sanitize_mark_insn_seen()
           to assign "true" instead
         - drop sanitize_insn_aux_data() comment changes, as the function is not
           present in 4.19]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 70cadee591f3..566eeee5e334 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -2901,6 +2901,19 @@ static int sanitize_ptr_alu(struct bpf_verifier_env *env,
 	return !ret ? REASON_STACK : 0;
 }
 
+static void sanitize_mark_insn_seen(struct bpf_verifier_env *env)
+{
+	struct bpf_verifier_state *vstate = env->cur_state;
+
+	/* If we simulate paths under speculation, we don't update the
+	 * insn as 'seen' such that when we verify unreachable paths in
+	 * the non-speculative domain, sanitize_dead_code() can still
+	 * rewrite/sanitize them.
+	 */
+	if (!vstate->speculative)
+		env->insn_aux_data[env->insn_idx].seen = true;
+}
+
 static int sanitize_err(struct bpf_verifier_env *env,
 			const struct bpf_insn *insn, int reason,
 			const struct bpf_reg_state *off_reg,
@@ -5254,7 +5267,7 @@ static int do_check(struct bpf_verifier_env *env)
 		}
 
 		regs = cur_regs(env);
-		env->insn_aux_data[env->insn_idx].seen = true;
+		sanitize_mark_insn_seen(env);
 
 		if (class == BPF_ALU || class == BPF_ALU64) {
 			err = check_alu_op(env, insn);
@@ -5472,7 +5485,7 @@ static int do_check(struct bpf_verifier_env *env)
 					return err;
 
 				env->insn_idx++;
-				env->insn_aux_data[env->insn_idx].seen = true;
+				sanitize_mark_insn_seen(env);
 			} else {
 				verbose(env, "invalid BPF_LD mode\n");
 				return -EINVAL;

commit 0abc8c9754c953f5cd0ac7488c668ca8d53ffc90
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Thu Aug 12 20:00:34 2021 +0300

    bpf: Inherit expanded/patched seen count from old aux data
    
    commit d203b0fd863a2261e5d00b97f3d060c4c2a6db71 upstream.
    
    Instead of relying on current env->pass_cnt, use the seen count from the
    old aux data in adjust_insn_aux_data(), and expand it to the new range of
    patched instructions. This change is valid given we always expand 1:n
    with n>=1, so what applies to the old/original instruction needs to apply
    for the replacement as well.
    
    Not relying on env->pass_cnt is a prerequisite for a later change where we
    want to avoid marking an instruction seen when verified under speculative
    execution path.
    
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: John Fastabend <john.fastabend@gmail.com>
    Reviewed-by: Benedict Schlueter <benedict.schlueter@rub.de>
    Reviewed-by: Piotr Krysiuk <piotras@gmail.com>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    [OP: - declare old_data as bool instead of u32 (struct bpf_insn_aux_data.seen
         is bool in 5.4)
         - adjusted context for 4.19]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 4ce032c4acd0..70cadee591f3 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -5690,6 +5690,7 @@ static int adjust_insn_aux_data(struct bpf_verifier_env *env, u32 prog_len,
 				u32 off, u32 cnt)
 {
 	struct bpf_insn_aux_data *new_data, *old_data = env->insn_aux_data;
+	bool old_seen = old_data[off].seen;
 	int i;
 
 	if (cnt == 1)
@@ -5701,8 +5702,10 @@ static int adjust_insn_aux_data(struct bpf_verifier_env *env, u32 prog_len,
 	memcpy(new_data, old_data, sizeof(struct bpf_insn_aux_data) * off);
 	memcpy(new_data + off + cnt - 1, old_data + off,
 	       sizeof(struct bpf_insn_aux_data) * (prog_len - off - cnt + 1));
-	for (i = off; i < off + cnt - 1; i++)
-		new_data[i].seen = true;
+	for (i = off; i < off + cnt - 1; i++) {
+		/* Expand insni[off]'s seen count to the patched range. */
+		new_data[i].seen = old_seen;
+	}
 	env->insn_aux_data = new_data;
 	vfree(old_data);
 	return 0;

commit 7c165d58effc19fdf68196d4ceebf940d5da777d
Author: Masami Hiramatsu <mhiramat@kernel.org>
Date:   Wed Jul 28 07:55:43 2021 +0900

    tracing: Reject string operand in the histogram expression
    
    commit a9d10ca4986571bffc19778742d508cc8dd13e02 upstream.
    
    Since the string type can not be the target of the addition / subtraction
    operation, it must be rejected. Without this fix, the string type silently
    converted to digits.
    
    Link: https://lkml.kernel.org/r/162742654278.290973.1523000673366456634.stgit@devnote2
    
    Cc: stable@vger.kernel.org
    Fixes: 100719dcef447 ("tracing: Add simple expression support to hist triggers")
    Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
index 6d2a69652c39..bbde8d3d6c8a 100644
--- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c
@@ -2790,6 +2790,12 @@ static struct hist_field *parse_unary(struct hist_trigger_data *hist_data,
 		ret = PTR_ERR(operand1);
 		goto free;
 	}
+	if (operand1->flags & HIST_FIELD_FL_STRING) {
+		/* String type can not be the operand of unary operator. */
+		destroy_hist_field(operand1, 0);
+		ret = -EINVAL;
+		goto free;
+	}
 
 	expr->flags |= operand1->flags &
 		(HIST_FIELD_FL_TIMESTAMP | HIST_FIELD_FL_TIMESTAMP_USECS);
@@ -2890,6 +2896,10 @@ static struct hist_field *parse_expr(struct hist_trigger_data *hist_data,
 		operand1 = NULL;
 		goto free;
 	}
+	if (operand1->flags & HIST_FIELD_FL_STRING) {
+		ret = -EINVAL;
+		goto free;
+	}
 
 	/* rest of string could be another expression e.g. b+c in a+b+c */
 	operand_flags = 0;
@@ -2899,6 +2909,10 @@ static struct hist_field *parse_expr(struct hist_trigger_data *hist_data,
 		operand2 = NULL;
 		goto free;
 	}
+	if (operand2->flags & HIST_FIELD_FL_STRING) {
+		ret = -EINVAL;
+		goto free;
+	}
 
 	ret = check_expr_operands(operand1, operand2);
 	if (ret)

commit 17b9e2da62d7400763262b164bab3efe31ef08e7
Author: Sean Christopherson <seanjc@google.com>
Date:   Tue Aug 3 09:27:46 2021 -0700

    KVM: SVM: Fix off-by-one indexing when nullifying last used SEV VMCB
    
    [ Upstream commit 179c6c27bf487273652efc99acd3ba512a23c137 ]
    
    Use the raw ASID, not ASID-1, when nullifying the last used VMCB when
    freeing an SEV ASID.  The consumer, pre_sev_run(), indexes the array by
    the raw ASID, thus KVM could get a false negative when checking for a
    different VMCB if KVM manages to reallocate the same ASID+VMCB combo for
    a new VM.
    
    Note, this cannot cause a functional issue _in the current code_, as
    pre_sev_run() also checks which pCPU last did VMRUN for the vCPU, and
    last_vmentry_cpu is initialized to -1 during vCPU creation, i.e. is
    guaranteed to mismatch on the first VMRUN.  However, prior to commit
    8a14fe4f0c54 ("kvm: x86: Move last_cpu into kvm_vcpu_arch as
    last_vmentry_cpu"), SVM tracked pCPU on its own and zero-initialized the
    last_cpu variable.  Thus it's theoretically possible that older versions
    of KVM could miss a TLB flush if the first VMRUN is on pCPU0 and the ASID
    and VMCB exactly match those of a prior VM.
    
    Fixes: 70cd94e60c73 ("KVM: SVM: VMRUN should use associated ASID when SEV is enabled")
    Cc: Tom Lendacky <thomas.lendacky@amd.com>
    Cc: Brijesh Singh <brijesh.singh@amd.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Sean Christopherson <seanjc@google.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index bd463d684237..72d729f34437 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -1780,7 +1780,7 @@ static void __sev_asid_free(int asid)
 
 	for_each_possible_cpu(cpu) {
 		sd = per_cpu(svm_data, cpu);
-		sd->sev_vmcbs[pos] = NULL;
+		sd->sev_vmcbs[asid] = NULL;
 	}
 }
 

commit 2d3d1c71573f75a30fbd3bb0277446a0e54d6e40
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Fri Aug 13 16:03:22 2021 +0800

    pinctrl: rockchip: build depends on CPU config
    
    When build with rv1126_defconfig:
    
    before:
       text    data     bss     dec     hex filename
      18918   34120       8   53046    cf36 drivers/pinctrl/pinctrl-rockchip.o
    
    after:
       text    data     bss     dec     hex filename
      11726    3028       8   14762    39aa drivers/pinctrl/pinctrl-rockchip.o
    
    Change-Id: I09e85d6a05f9bdee1033584bd1573d41d69633bc
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>

diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
index 95365e481a0c..1cfcd25ebb15 100644
--- a/drivers/pinctrl/pinctrl-rockchip.c
+++ b/drivers/pinctrl/pinctrl-rockchip.c
@@ -4104,7 +4104,7 @@ static struct rockchip_pin_bank px30_pin_banks[] = {
 			    ),
 };
 
-static struct rockchip_pin_ctrl px30_pin_ctrl = {
+static struct rockchip_pin_ctrl px30_pin_ctrl __maybe_unused = {
 		.pin_banks		= px30_pin_banks,
 		.nr_banks		= ARRAY_SIZE(px30_pin_banks),
 		.label			= "PX30-GPIO",
@@ -4129,7 +4129,7 @@ static struct rockchip_pin_bank rv1108_pin_banks[] = {
 	PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, 0),
 };
 
-static struct rockchip_pin_ctrl rv1108_pin_ctrl = {
+static struct rockchip_pin_ctrl rv1108_pin_ctrl __maybe_unused = {
 	.pin_banks		= rv1108_pin_banks,
 	.nr_banks		= ARRAY_SIZE(rv1108_pin_banks),
 	.label			= "RV1108-GPIO",
@@ -4169,7 +4169,7 @@ static struct rockchip_pin_bank rv1126_pin_banks[] = {
 			     IOMUX_WIDTH_4BIT, 0, 0, 0),
 };
 
-static struct rockchip_pin_ctrl rv1126_pin_ctrl = {
+static struct rockchip_pin_ctrl rv1126_pin_ctrl __maybe_unused = {
 	.pin_banks		= rv1126_pin_banks,
 	.nr_banks		= ARRAY_SIZE(rv1126_pin_banks),
 	.label			= "RV1126-GPIO",
@@ -4208,7 +4208,7 @@ static struct rockchip_pin_bank rk1808_pin_banks[] = {
 					     IOMUX_WIDTH_4BIT),
 };
 
-static struct rockchip_pin_ctrl rk1808_pin_ctrl = {
+static struct rockchip_pin_ctrl rk1808_pin_ctrl __maybe_unused = {
 	.pin_banks		= rk1808_pin_banks,
 	.nr_banks		= ARRAY_SIZE(rk1808_pin_banks),
 	.label			= "RK1808-GPIO",
@@ -4230,7 +4230,7 @@ static struct rockchip_pin_bank rk2928_pin_banks[] = {
 	PIN_BANK(3, 32, "gpio3"),
 };
 
-static struct rockchip_pin_ctrl rk2928_pin_ctrl = {
+static struct rockchip_pin_ctrl rk2928_pin_ctrl __maybe_unused = {
 		.pin_banks		= rk2928_pin_banks,
 		.nr_banks		= ARRAY_SIZE(rk2928_pin_banks),
 		.label			= "RK2928-GPIO",
@@ -4245,7 +4245,7 @@ static struct rockchip_pin_bank rk3036_pin_banks[] = {
 	PIN_BANK(2, 32, "gpio2"),
 };
 
-static struct rockchip_pin_ctrl rk3036_pin_ctrl = {
+static struct rockchip_pin_ctrl rk3036_pin_ctrl __maybe_unused = {
 		.pin_banks		= rk3036_pin_banks,
 		.nr_banks		= ARRAY_SIZE(rk3036_pin_banks),
 		.label			= "RK3036-GPIO",
@@ -4263,7 +4263,7 @@ static struct rockchip_pin_bank rk3066a_pin_banks[] = {
 	PIN_BANK(6, 16, "gpio6"),
 };
 
-static struct rockchip_pin_ctrl rk3066a_pin_ctrl = {
+static struct rockchip_pin_ctrl rk3066a_pin_ctrl __maybe_unused = {
 		.pin_banks		= rk3066a_pin_banks,
 		.nr_banks		= ARRAY_SIZE(rk3066a_pin_banks),
 		.label			= "RK3066a-GPIO",
@@ -4279,7 +4279,7 @@ static struct rockchip_pin_bank rk3066b_pin_banks[] = {
 	PIN_BANK(3, 32, "gpio3"),
 };
 
-static struct rockchip_pin_ctrl rk3066b_pin_ctrl = {
+static struct rockchip_pin_ctrl rk3066b_pin_ctrl __maybe_unused = {
 		.pin_banks	= rk3066b_pin_banks,
 		.nr_banks	= ARRAY_SIZE(rk3066b_pin_banks),
 		.label		= "RK3066b-GPIO",
@@ -4294,7 +4294,7 @@ static struct rockchip_pin_bank rk3128_pin_banks[] = {
 	PIN_BANK(3, 32, "gpio3"),
 };
 
-static struct rockchip_pin_ctrl rk3128_pin_ctrl = {
+static struct rockchip_pin_ctrl rk3128_pin_ctrl __maybe_unused = {
 		.pin_banks		= rk3128_pin_banks,
 		.nr_banks		= ARRAY_SIZE(rk3128_pin_banks),
 		.label			= "RK3128-GPIO",
@@ -4314,7 +4314,7 @@ static struct rockchip_pin_bank rk3188_pin_banks[] = {
 	PIN_BANK(3, 32, "gpio3"),
 };
 
-static struct rockchip_pin_ctrl rk3188_pin_ctrl = {
+static struct rockchip_pin_ctrl rk3188_pin_ctrl __maybe_unused = {
 		.pin_banks		= rk3188_pin_banks,
 		.nr_banks		= ARRAY_SIZE(rk3188_pin_banks),
 		.label			= "RK3188-GPIO",
@@ -4330,7 +4330,7 @@ static struct rockchip_pin_bank rk3228_pin_banks[] = {
 	PIN_BANK(3, 32, "gpio3"),
 };
 
-static struct rockchip_pin_ctrl rk3228_pin_ctrl = {
+static struct rockchip_pin_ctrl rk3228_pin_ctrl __maybe_unused = {
 		.pin_banks		= rk3228_pin_banks,
 		.nr_banks		= ARRAY_SIZE(rk3228_pin_banks),
 		.label			= "RK3228-GPIO",
@@ -4374,7 +4374,7 @@ static struct rockchip_pin_bank rk3288_pin_banks[] = {
 	PIN_BANK(8, 16, "gpio8"),
 };
 
-static struct rockchip_pin_ctrl rk3288_pin_ctrl = {
+static struct rockchip_pin_ctrl rk3288_pin_ctrl __maybe_unused = {
 		.pin_banks		= rk3288_pin_banks,
 		.nr_banks		= ARRAY_SIZE(rk3288_pin_banks),
 		.label			= "RK3288-GPIO",
@@ -4410,7 +4410,7 @@ static struct rockchip_pin_bank rk3308_pin_banks[] = {
 					     IOMUX_8WIDTH_2BIT),
 };
 
-static struct rockchip_pin_ctrl rk3308_pin_ctrl = {
+static struct rockchip_pin_ctrl rk3308_pin_ctrl __maybe_unused = {
 		.pin_banks		= rk3308_pin_banks,
 		.nr_banks		= ARRAY_SIZE(rk3308_pin_banks),
 		.label			= "RK3308-GPIO",
@@ -4441,7 +4441,7 @@ static struct rockchip_pin_bank rk3328_pin_banks[] = {
 			     0),
 };
 
-static struct rockchip_pin_ctrl rk3328_pin_ctrl = {
+static struct rockchip_pin_ctrl rk3328_pin_ctrl __maybe_unused = {
 		.pin_banks		= rk3328_pin_banks,
 		.nr_banks		= ARRAY_SIZE(rk3328_pin_banks),
 		.label			= "RK3328-GPIO",
@@ -4467,7 +4467,7 @@ static struct rockchip_pin_bank rk3368_pin_banks[] = {
 	PIN_BANK(3, 32, "gpio3"),
 };
 
-static struct rockchip_pin_ctrl rk3368_pin_ctrl = {
+static struct rockchip_pin_ctrl rk3368_pin_ctrl __maybe_unused = {
 		.pin_banks		= rk3368_pin_banks,
 		.nr_banks		= ARRAY_SIZE(rk3368_pin_banks),
 		.label			= "RK3368-GPIO",
@@ -4531,7 +4531,7 @@ static struct rockchip_pin_bank rk3399_pin_banks[] = {
 			   ),
 };
 
-static struct rockchip_pin_ctrl rk3399_pin_ctrl = {
+static struct rockchip_pin_ctrl rk3399_pin_ctrl __maybe_unused = {
 		.pin_banks		= rk3399_pin_banks,
 		.nr_banks		= ARRAY_SIZE(rk3399_pin_banks),
 		.label			= "RK3399-GPIO",
@@ -4569,7 +4569,7 @@ static struct rockchip_pin_bank rk3568_pin_banks[] = {
 					     IOMUX_WIDTH_4BIT),
 };
 
-static struct rockchip_pin_ctrl rk3568_pin_ctrl = {
+static struct rockchip_pin_ctrl rk3568_pin_ctrl __maybe_unused = {
 	.pin_banks		= rk3568_pin_banks,
 	.nr_banks		= ARRAY_SIZE(rk3568_pin_banks),
 	.label			= "RK3568-GPIO",
@@ -4587,40 +4587,72 @@ static struct rockchip_pin_ctrl rk3568_pin_ctrl = {
 };
 
 static const struct of_device_id rockchip_pinctrl_dt_match[] = {
+#ifdef CONFIG_CPU_PX30
 	{ .compatible = "rockchip,px30-pinctrl",
 		.data = &px30_pin_ctrl },
+#endif
+#ifdef CONFIG_CPU_RV110X
 	{ .compatible = "rockchip,rv1108-pinctrl",
 		.data = &rv1108_pin_ctrl },
+#endif
+#ifdef CONFIG_CPU_RV1126
 	{ .compatible = "rockchip,rv1126-pinctrl",
 		.data = &rv1126_pin_ctrl },
+#endif
+#ifdef CONFIG_CPU_RK1808
 	{ .compatible = "rockchip,rk1808-pinctrl",
 		.data = &rk1808_pin_ctrl },
+#endif
+#ifdef CONFIG_CPU_RK2928
 	{ .compatible = "rockchip,rk2928-pinctrl",
 		.data = &rk2928_pin_ctrl },
+#endif
+#ifdef CONFIG_CPU_RK3036
 	{ .compatible = "rockchip,rk3036-pinctrl",
 		.data = &rk3036_pin_ctrl },
+#endif
+#ifdef CONFIG_CPU_RK30XX
 	{ .compatible = "rockchip,rk3066a-pinctrl",
 		.data = &rk3066a_pin_ctrl },
 	{ .compatible = "rockchip,rk3066b-pinctrl",
 		.data = &rk3066b_pin_ctrl },
+#endif
+#ifdef CONFIG_CPU_RK312X
 	{ .compatible = "rockchip,rk3128-pinctrl",
 		.data = (void *)&rk3128_pin_ctrl },
+#endif
+#ifdef CONFIG_CPU_RK3188
 	{ .compatible = "rockchip,rk3188-pinctrl",
 		.data = &rk3188_pin_ctrl },
+#endif
+#ifdef CONFIG_CPU_RK322X
 	{ .compatible = "rockchip,rk3228-pinctrl",
 		.data = &rk3228_pin_ctrl },
+#endif
+#ifdef CONFIG_CPU_RK3288
 	{ .compatible = "rockchip,rk3288-pinctrl",
 		.data = &rk3288_pin_ctrl },
+#endif
+#ifdef CONFIG_CPU_RK3308
 	{ .compatible = "rockchip,rk3308-pinctrl",
 		.data = &rk3308_pin_ctrl },
+#endif
+#ifdef CONFIG_CPU_RK3328
 	{ .compatible = "rockchip,rk3328-pinctrl",
 		.data = &rk3328_pin_ctrl },
+#endif
+#ifdef CONFIG_CPU_RK3368
 	{ .compatible = "rockchip,rk3368-pinctrl",
 		.data = &rk3368_pin_ctrl },
+#endif
+#ifdef CONFIG_CPU_RK3399
 	{ .compatible = "rockchip,rk3399-pinctrl",
 		.data = &rk3399_pin_ctrl },
+#endif
+#ifdef CONFIG_CPU_RK3568
 	{ .compatible = "rockchip,rk3568-pinctrl",
 		.data = &rk3568_pin_ctrl },
+#endif
 	{},
 };
 MODULE_DEVICE_TABLE(of, rockchip_pinctrl_dt_match);

commit e90ec534940f141a27e85f4d01fcc230f77f7352
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Wed Aug 4 11:28:55 2021 +0800

    drm/rockchip: ebc_dev: release version v2.09
    
    1.support suspend logo refresh
    2.support multi panel pmics define as:
    &ebc_dev {
        pmic = <&tps65185 &sy7673a &xxxx>;
    }
    3.do err when bufmode not support
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: I9686a7d2eae8051c04c53970acdc7793870dd553

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/Kconfig b/drivers/gpu/drm/rockchip/ebc-dev/Kconfig
index 949c8e4b7b57..663d4a3befe7 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/Kconfig
+++ b/drivers/gpu/drm/rockchip/ebc-dev/Kconfig
@@ -5,10 +5,7 @@ menuconfig ROCKCHIP_EBC_DEV
 	help
 	Rockchip eBook Device Dirver could help to driver the electronic ink screen.
 
-choice
-	prompt "eink pmic sensor"
-	depends on ROCKCHIP_EBC_DEV
-	default EPD_TPS65185_SENSOR
 config EPD_TPS65185_SENSOR
-	bool "Tps65185"
-endchoice
+    bool "eink pmic Tps65185"
+    depends on ROCKCHIP_EBC_DEV
+    default y
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index bdc4e186657a..66959f00f029 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -1119,15 +1119,15 @@ get_overlay_image:
 	.type	ebc_open, %function
 ebc_open:
 .LFB2833:
-	.loc 1 1942 0
+	.loc 1 1948 0
 	.cfi_startproc
 .LVL62:
-	.loc 1 1946 0
+	.loc 1 1952 0
 	mov	w0, 0
 .LVL63:
-	.loc 1 1943 0
+	.loc 1 1949 0
 	str	xzr, [x1, 104]
-	.loc 1 1946 0
+	.loc 1 1952 0
 	ret
 	.cfi_endproc
 .LFE2833:
@@ -1137,22 +1137,22 @@ ebc_open:
 	.type	ebc_exit, %function
 ebc_exit:
 .LFB2853:
-	.loc 1 2499 0
+	.loc 1 2525 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2500 0
+	.loc 1 2526 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2499 0
+	.loc 1 2525 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2500 0
+	.loc 1 2526 0
 	bl	platform_driver_unregister
 .LVL64:
-	.loc 1 2501 0
+	.loc 1 2527 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1167,7 +1167,7 @@ ebc_exit:
 	.type	ebc_resume, %function
 ebc_resume:
 .LFB2851:
-	.loc 1 2461 0
+	.loc 1 2487 0
 	.cfi_startproc
 .LVL65:
 	stp	x29, x30, [sp, -32]!
@@ -1178,17 +1178,17 @@ ebc_resume:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-.LBB928:
-.LBB929:
+.LBB940:
+.LBB941:
 	.file 2 "./include/linux/device.h"
 	.loc 2 1181 0
 	ldr	x19, [x0, 184]
-.LBE929:
-.LBE928:
-	.loc 1 2465 0
+.LBE941:
+.LBE940:
+	.loc 1 2491 0
 	ldr	x1, [x19, 16]
-.LBB930:
-.LBB931:
+.LBB942:
+.LBB943:
 	.file 3 "drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic.h"
 	.loc 3 45 0
 	mov	x0, x1
@@ -1196,17 +1196,17 @@ ebc_resume:
 	ldr	x1, [x1, 48]
 	blr	x1
 .LVL67:
-.LBE931:
-.LBE930:
-	.loc 1 2466 0
+.LBE943:
+.LBE942:
+	.loc 1 2492 0
 	str	wzr, [x19, 780]
-	.loc 1 2467 0
+	.loc 1 2493 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
 .LVL68:
-	.loc 1 2470 0
+	.loc 1 2496 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -1223,44 +1223,44 @@ ebc_resume:
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
 .LFB2828:
-	.loc 1 1641 0
+	.loc 1 1647 0
 	.cfi_startproc
 .LVL69:
-	.loc 1 1642 0
+	.loc 1 1648 0
 	adrp	x0, .LANCHOR0
 .LVL70:
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1644 0
+	.loc 1 1650 0
 	ldr	w2, [x0, 608]
 	cbnz	w2, .L165
 	ret
 	.p2align 3
 .L165:
-	.loc 1 1641 0
+	.loc 1 1647 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-.LBB932:
-.LBB933:
+.LBB944:
+.LBB945:
 	.file 4 "./include/linux/wakelock.h"
 	.loc 4 68 0
 	add	x0, x0, 400
-.LBE933:
-.LBE932:
-	.loc 1 1641 0
+.LBE945:
+.LBE944:
+	.loc 1 1647 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1645 0
+	.loc 1 1651 0
 	str	wzr, [x0, 208]
-.LBB935:
-.LBB934:
+.LBB947:
+.LBB946:
 	.loc 4 68 0
 	bl	__pm_relax
 .LVL71:
-.LBE934:
-.LBE935:
-	.loc 1 1650 0
+.LBE946:
+.LBE947:
+	.loc 1 1656 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1274,27 +1274,27 @@ ebc_vdd_power_timeout:
 	.type	ebc_remove, %function
 ebc_remove:
 .LFB2849:
-	.loc 1 2437 0
+	.loc 1 2463 0
 	.cfi_startproc
 .LVL72:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2438 0
+	.loc 1 2464 0
 	adrp	x0, .LANCHOR1
 .LVL73:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2437 0
+	.loc 1 2463 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2438 0
+	.loc 1 2464 0
 	add	x0, x0, 224
-	.loc 1 2437 0
-	.loc 1 2438 0
+	.loc 1 2463 0
+	.loc 1 2464 0
 	bl	misc_deregister
 .LVL74:
-	.loc 1 2441 0
+	.loc 1 2467 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -1309,7 +1309,7 @@ ebc_remove:
 	.type	ebc_mmap, %function
 ebc_mmap:
 .LFB2832:
-	.loc 1 1927 0
+	.loc 1 1933 0
 	.cfi_startproc
 .LVL75:
 	stp	x29, x30, [sp, -32]!
@@ -1320,33 +1320,33 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1927 0
+	.loc 1 1933 0
 	mov	x19, x1
-	.loc 1 1930 0
+	.loc 1 1936 0
 	bl	ebc_phy_buf_base_get
 .LVL76:
-	.loc 1 1933 0
+	.loc 1 1939 0
 	lsr	x2, x0, 12
-	.loc 1 1931 0
+	.loc 1 1937 0
 	mov	x6, 16384
-	.loc 1 1933 0
+	.loc 1 1939 0
 	mov	x0, x19
-	.loc 1 1931 0
+	.loc 1 1937 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 1933 0
+	.loc 1 1939 0
 	ldp	x1, x3, [x19]
-	.loc 1 1931 0
+	.loc 1 1937 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 1933 0
+	.loc 1 1939 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
 .LVL77:
-	.loc 1 1936 0
+	.loc 1 1942 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 1939 0
+	.loc 1 1945 0
 	ldr	x19, [sp, 16]
 .LVL78:
 	csel	w0, w0, w1, eq
@@ -1364,16 +1364,16 @@ ebc_mmap:
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
 .LFB2831:
-	.loc 1 1726 0
+	.loc 1 1732 0
 	.cfi_startproc
 .LVL79:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 1736 0
+	.loc 1 1742 0
 	cmp	w1, 28672
-	.loc 1 1726 0
+	.loc 1 1732 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -1387,15 +1387,15 @@ ebc_io_ctl:
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
 	.cfi_offset 23, -112
-	.loc 1 1726 0
+	.loc 1 1732 0
 	mov	x21, x2
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 1728 0
+	.loc 1 1734 0
 	adrp	x0, .LANCHOR0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1736 0
+	.loc 1 1742 0
 	bcc	.L173
 	mov	w0, 28675
 	cmp	w1, w0
@@ -1405,7 +1405,7 @@ ebc_io_ctl:
 	cmp	w0, 1
 	bls	.L174
 .L173:
-	.loc 1 1752 0
+	.loc 1 1758 0
 	mov	w0, 28677
 	cmp	w1, w0
 	beq	.L177
@@ -1421,13 +1421,13 @@ ebc_io_ctl:
 	mov	w0, 28683
 	cmp	w1, w0
 	bne	.L176
-	.loc 1 1904 0
+	.loc 1 1910 0
 	bl	ebc_empty_buf_get
 .LVL81:
 	mov	x23, x0
-	.loc 1 1905 0
+	.loc 1 1911 0
 	cbz	x0, .L197
-	.loc 1 1907 0
+	.loc 1 1913 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 392]
@@ -1438,18 +1438,18 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL82:
-	.loc 1 1908 0
+	.loc 1 1914 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL83:
 	sub	w0, w20, w0
-.LBB936:
-.LBB937:
-.LBB938:
-.LBB939:
-.LBB940:
-.LBB941:
-.LBB942:
+.LBB948:
+.LBB949:
+.LBB950:
+.LBB951:
+.LBB952:
+.LBB953:
+.LBB954:
 	.file 5 "./arch/arm64/include/asm/current.h"
 	.loc 5 19 0
 #APP
@@ -1458,27 +1458,27 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL84:
 #NO_APP
-.LBE942:
-.LBE941:
+.LBE954:
+.LBE953:
 	.file 6 "./arch/arm64/include/asm/uaccess.h"
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE940:
-.LBE939:
-.LBE938:
-.LBE937:
-.LBE936:
-	.loc 1 1910 0
+.LBE952:
+.LBE951:
+.LBE950:
+.LBE949:
+.LBE948:
+	.loc 1 1916 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 1909 0
+	.loc 1 1915 0
 	str	w0, [x29, 104]
-	.loc 1 1911 0
+	.loc 1 1917 0
 	stp	w4, w1, [x29, 112]
-.LBB967:
-.LBB964:
+.LBB979:
+.LBB976:
+.LBB973:
+.LBB963:
 .LBB961:
-.LBB951:
-.LBB949:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL85:
@@ -1486,47 +1486,47 @@ ebc_io_ctl:
 	tbnz	x3, 21, .L234
 .LVL86:
 .L300:
-.LBB943:
-.LBB944:
-.LBB945:
+.LBB955:
+.LBB956:
+.LBB957:
 	.file 7 "./include/asm-generic/bitops/non-atomic.h"
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL87:
-.LBE945:
-.LBE944:
-.LBE943:
-.LBE949:
-.LBE951:
+.LBE957:
+.LBE956:
+.LBE955:
 .LBE961:
-.LBE964:
-.LBE967:
-	.loc 1 1727 0
+.LBE963:
+.LBE973:
+.LBE976:
+.LBE979:
+	.loc 1 1733 0
 	mov	x0, x21
 .LVL88:
-.LBB968:
-.LBB965:
+.LBB980:
+.LBB977:
+.LBB974:
+.LBB964:
 .LBB962:
-.LBB952:
-.LBB950:
 	.loc 6 84 0
 	tbz	x2, 26, .L235
 .LVL89:
 .L234:
-.LBB946:
-.LBB947:
-.LBB948:
+.LBB958:
+.LBB959:
+.LBB960:
 	.file 8 "./include/linux/bitops.h"
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL90:
-.LBE948:
-.LBE947:
+.LBE960:
+.LBE959:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL91:
 .L235:
-.LBE946:
+.LBE958:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1539,46 +1539,46 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL92:
 #NO_APP
-.LBE950:
-.LBE952:
+.LBE962:
+.LBE964:
 	.file 9 "./include/linux/uaccess.h"
 	.loc 9 132 0
 	mov	x22, 44
 	cbnz	x0, .L308
 .L236:
-.LBE962:
-.LBE965:
-.LBE968:
-	.loc 1 1913 0
+.LBE974:
+.LBE977:
+.LBE980:
+	.loc 1 1919 0
 	mov	x0, x23
 .LVL93:
 	bl	ebc_buf_release
 .LVL94:
-	.loc 1 1914 0
+	.loc 1 1920 0
 	b	.L172
 .LVL95:
 	.p2align 3
 .L174:
-	.loc 1 1743 0
+	.loc 1 1749 0
 	cbnz	x21, .L173
-	.loc 1 1744 0
+	.loc 1 1750 0
 	ldr	x0, [x20, 272]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
 .LVL96:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC1
-	.loc 1 1745 0
+	.loc 1 1751 0
 	mov	x22, -14
-	.loc 1 1744 0
+	.loc 1 1750 0
 	bl	_dev_err
 .LVL97:
-	.loc 1 1745 0
+	.loc 1 1751 0
 	b	.L172
 .LVL98:
 	.p2align 3
 .L306:
-	.loc 1 1752 0
+	.loc 1 1758 0
 	mov	w0, 28674
 	cmp	w1, w0
 	beq	.L179
@@ -1589,23 +1589,23 @@ ebc_io_ctl:
 	mov	w0, 28676
 	cmp	w1, w0
 	bne	.L176
-	.loc 1 1836 0
+	.loc 1 1842 0
 	ldr	x0, [x20, 272]
-	.loc 1 1835 0
+	.loc 1 1841 0
 	mov	w2, 1
 	str	w2, [x20, 788]
-	.loc 1 1836 0
+	.loc 1 1842 0
 	adrp	x1, .LC2
 .LVL99:
-	.loc 1 1837 0
+	.loc 1 1843 0
 	mov	x22, 0
-	.loc 1 1836 0
+	.loc 1 1842 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
 .LVL100:
 	.p2align 2
 .L172:
-	.loc 1 1924 0
+	.loc 1 1930 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
 .LVL101:
@@ -1633,19 +1633,19 @@ ebc_io_ctl:
 	.p2align 3
 .L309:
 	.cfi_restore_state
-	.loc 1 1752 0
+	.loc 1 1758 0
 	cmp	w1, 28672
 	beq	.L181
 	mov	w0, 28673
 	cmp	w1, w0
 	bne	.L176
-.LBB969:
-.LBB970:
-.LBB971:
-.LBB972:
-.LBB973:
-.LBB974:
-.LBB975:
+.LBB981:
+.LBB982:
+.LBB983:
+.LBB984:
+.LBB985:
+.LBB986:
+.LBB987:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1653,8 +1653,8 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL105:
 #NO_APP
-.LBE975:
-.LBE974:
+.LBE987:
+.LBE986:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
@@ -1664,19 +1664,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L311
 .LVL107:
 .L202:
-.LBB976:
-.LBB977:
-.LBB978:
+.LBB988:
+.LBB989:
+.LBB990:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL108:
-.LBE978:
-.LBE977:
+.LBE990:
+.LBE989:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL109:
 .L203:
-.LBE976:
+.LBE988:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1689,23 +1689,23 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL110:
 #NO_APP
-.LBE973:
-.LBE972:
+.LBE985:
+.LBE984:
 	.loc 9 114 0
 	cbz	x0, .L205
-.LBB984:
-.LBB985:
-.LBB986:
-.LBB987:
-.LBB988:
+.LBB996:
+.LBB997:
+.LBB998:
+.LBB999:
+.LBB1000:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL111:
-.LBE988:
-.LBE987:
-.LBE986:
-.LBB989:
-.LBB990:
+.LBE1000:
+.LBE999:
+.LBE998:
+.LBB1001:
+.LBB1002:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1713,13 +1713,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL112:
 #NO_APP
-.LBE990:
-.LBE989:
-.LBB991:
+.LBE1002:
+.LBE1001:
+.LBB1003:
 	.loc 6 254 0
 	and	x0, x0, x21
 .LVL113:
-.LBE991:
+.LBE1003:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1734,8 +1734,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE985:
-.LBE984:
+.LBE997:
+.LBE996:
 	.loc 9 116 0
 	mov	x2, 44
 	add	x0, x29, 104
@@ -1744,75 +1744,75 @@ ebc_io_ctl:
 .LVL116:
 	.loc 9 118 0
 	cbnz	x0, .L205
-.LBE971:
-.LBE970:
-.LBE969:
-	.loc 1 1790 0
+.LBE983:
+.LBE982:
+.LBE981:
+	.loc 1 1796 0
 	bl	ebc_phy_buf_base_get
 .LVL117:
 	ldrsw	x1, [x29, 104]
-	.loc 1 1791 0
+	.loc 1 1797 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
 .LVL118:
 	mov	x21, x0
 .LVL119:
-	.loc 1 1792 0
+	.loc 1 1798 0
 	cbz	x0, .L212
-	.loc 1 1793 0
+	.loc 1 1799 0
 	ldr	w5, [x29, 108]
-	.loc 1 1802 0
+	.loc 1 1808 0
 	add	x20, x20, 184
-	.loc 1 1797 0
+	.loc 1 1803 0
 	ldp	w4, w2, [x29, 124]
-	.loc 1 1793 0
+	.loc 1 1799 0
 	str	w5, [x21, 40]
-	.loc 1 1798 0
+	.loc 1 1804 0
 	ldp	w3, w1, [x29, 132]
-	.loc 1 1797 0
+	.loc 1 1803 0
 	stp	w4, w2, [x21, 48]
-	.loc 1 1798 0
+	.loc 1 1804 0
 	stp	w3, w1, [x21, 56]
-	.loc 1 1800 0
+	.loc 1 1806 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL120:
-	.loc 1 1802 0
+	.loc 1 1808 0
 	ldr	w0, [x20, 80]
 	cbz	w0, .L312
 .L207:
-	.loc 1 1806 0
+	.loc 1 1812 0
 	ldr	w0, [x21, 40]
 	cmp	w0, 18
 	beq	.L313
-	.loc 1 1806 0 is_stmt 0 discriminator 3
+	.loc 1 1812 0 is_stmt 0 discriminator 3
 	cmp	w0, 20
 	bne	.L212
 .L209:
-	.loc 1 1807 0 is_stmt 1
+	.loc 1 1813 0 is_stmt 1
 	mov	w0, 1
 	str	w0, [x20, 188]
-.LBB998:
-.LBB999:
-	.loc 1 1808 0
+.LBB1010:
+.LBB1011:
+	.loc 1 1814 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
 .LVL121:
 	adrp	x0, .LANCHOR1
-.LBB1000:
+.LBB1012:
 	add	x0, x0, :lo12:.LANCHOR1
 	add	x21, x0, 328
 	b	.L213
 	.p2align 3
 .L314:
 .LVL122:
-	.loc 1 1808 0 is_stmt 0 discriminator 5
+	.loc 1 1814 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L212
-	.loc 1 1808 0 discriminator 7
+	.loc 1 1814 0 discriminator 7
 	bl	schedule
 .LVL123:
 .L213:
-	.loc 1 1808 0 discriminator 9
+	.loc 1 1814 0 discriminator 9
 	add	x1, x29, 64
 	mov	w2, 1
 	mov	x0, x21
@@ -1820,8 +1820,8 @@ ebc_io_ctl:
 .LVL124:
 	ldr	w1, [x20, 188]
 	cbnz	w1, .L314
-.LBE1000:
-	.loc 1 1808 0 discriminator 4
+.LBE1012:
+	.loc 1 1814 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
 	bl	finish_wait
@@ -1833,15 +1833,15 @@ ebc_io_ctl:
 .LVL126:
 	.p2align 3
 .L189:
-.LBE999:
-.LBE998:
-	.loc 1 1891 0 is_stmt 1
+.LBE1011:
+.LBE1010:
+	.loc 1 1897 0 is_stmt 1
 	bl	ebc_empty_buf_get
 .LVL127:
 	mov	x23, x0
-	.loc 1 1892 0
+	.loc 1 1898 0
 	cbz	x0, .L197
-	.loc 1 1894 0
+	.loc 1 1900 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 328]
@@ -1851,20 +1851,20 @@ ebc_io_ctl:
 .LVL128:
 	.p2align 3
 .L307:
-	.loc 1 1752 0
+	.loc 1 1758 0
 	mov	w0, 28678
 	cmp	w1, w0
 	beq	.L187
 	mov	w0, 28679
 	cmp	w1, w0
 	bne	.L176
-.LBB1004:
-.LBB1005:
-.LBB1006:
-.LBB1007:
-.LBB1008:
-.LBB1009:
-.LBB1010:
+.LBB1016:
+.LBB1017:
+.LBB1018:
+.LBB1019:
+.LBB1020:
+.LBB1021:
+.LBB1022:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1872,8 +1872,8 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL129:
 #NO_APP
-.LBE1010:
-.LBE1009:
+.LBE1022:
+.LBE1021:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
@@ -1883,19 +1883,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L315
 .LVL131:
 .L214:
-.LBB1011:
-.LBB1012:
-.LBB1013:
+.LBB1023:
+.LBB1024:
+.LBB1025:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL132:
-.LBE1013:
-.LBE1012:
+.LBE1025:
+.LBE1024:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL133:
 .L215:
-.LBE1011:
+.LBE1023:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1908,23 +1908,23 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL134:
 #NO_APP
-.LBE1008:
-.LBE1007:
+.LBE1020:
+.LBE1019:
 	.loc 9 114 0
 	cbz	x0, .L205
-.LBB1019:
-.LBB1020:
-.LBB1021:
-.LBB1022:
-.LBB1023:
+.LBB1031:
+.LBB1032:
+.LBB1033:
+.LBB1034:
+.LBB1035:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL135:
-.LBE1023:
-.LBE1022:
-.LBE1021:
-.LBB1024:
-.LBB1025:
+.LBE1035:
+.LBE1034:
+.LBE1033:
+.LBB1036:
+.LBB1037:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1932,13 +1932,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL136:
 #NO_APP
-.LBE1025:
-.LBE1024:
-.LBB1026:
+.LBE1037:
+.LBE1036:
+.LBB1038:
 	.loc 6 254 0
 	and	x0, x0, x21
 .LVL137:
-.LBE1026:
+.LBE1038:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1953,8 +1953,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1020:
-.LBE1019:
+.LBE1032:
+.LBE1031:
 	.loc 9 116 0
 	mov	x2, 44
 	add	x0, x29, 104
@@ -1963,39 +1963,39 @@ ebc_io_ctl:
 .LVL140:
 	.loc 9 118 0
 	cbnz	x0, .L205
-.LBE1006:
-.LBE1005:
-.LBE1004:
-	.loc 1 1817 0
+.LBE1018:
+.LBE1017:
+.LBE1016:
+	.loc 1 1823 0
 	bl	ebc_osd_buf_clone
 .LVL141:
 	mov	x1, x0
-	.loc 1 1818 0
+	.loc 1 1824 0
 	cbz	x0, .L212
-	.loc 1 1819 0
+	.loc 1 1825 0
 	ldr	w6, [x29, 108]
-	.loc 1 1828 0
+	.loc 1 1834 0
 	add	x20, x20, 184
-	.loc 1 1823 0
+	.loc 1 1829 0
 	ldp	w5, w3, [x29, 124]
-	.loc 1 1819 0
+	.loc 1 1825 0
 	str	w6, [x1, 40]
-	.loc 1 1824 0
+	.loc 1 1830 0
 	ldp	w4, w2, [x29, 132]
-	.loc 1 1823 0
+	.loc 1 1829 0
 	stp	w5, w3, [x1, 48]
-	.loc 1 1824 0
+	.loc 1 1830 0
 	stp	w4, w2, [x1, 56]
-	.loc 1 1826 0
+	.loc 1 1832 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL142:
-	.loc 1 1828 0
+	.loc 1 1834 0
 	ldr	w0, [x20, 80]
 	cbnz	w0, .L212
-	.loc 1 1829 0
+	.loc 1 1835 0
 	mov	w2, 1
 	str	w2, [x20, 80]
-	.loc 1 1830 0
+	.loc 1 1836 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -2007,22 +2007,22 @@ ebc_io_ctl:
 .LVL144:
 	.p2align 3
 .L308:
-.LBB1033:
+.LBB1045:
+.LBB978:
+.LBB975:
+.LBB965:
 .LBB966:
-.LBB963:
-.LBB953:
-.LBB954:
-.LBB955:
-.LBB956:
-.LBB957:
+.LBB967:
+.LBB968:
+.LBB969:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL145:
-.LBE957:
-.LBE956:
-.LBE955:
-.LBB958:
-.LBB959:
+.LBE969:
+.LBE968:
+.LBE967:
+.LBB970:
+.LBB971:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2030,13 +2030,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL146:
 #NO_APP
-.LBE959:
-.LBE958:
-.LBB960:
+.LBE971:
+.LBE970:
+.LBB972:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL147:
-.LBE960:
+.LBE972:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL148:
@@ -2052,8 +2052,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE954:
-.LBE953:
+.LBE966:
+.LBE965:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
@@ -2065,25 +2065,25 @@ ebc_io_ctl:
 .LVL152:
 	.p2align 3
 .L187:
-.LBE963:
-.LBE966:
-.LBE1033:
-	.loc 1 1754 0
+.LBE975:
+.LBE978:
+.LBE1045:
+	.loc 1 1760 0
 	bl	ebc_osd_buf_get
 .LVL153:
-	.loc 1 1755 0
+	.loc 1 1761 0
 	cbz	x0, .L197
-	.loc 1 1758 0
+	.loc 1 1764 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL154:
-.LBB1034:
-.LBB1035:
-.LBB1036:
-.LBB1037:
-.LBB1038:
-.LBB1039:
-.LBB1040:
+.LBB1046:
+.LBB1047:
+.LBB1048:
+.LBB1049:
+.LBB1050:
+.LBB1051:
+.LBB1052:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2091,32 +2091,32 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL155:
 #NO_APP
-.LBE1040:
-.LBE1039:
+.LBE1052:
+.LBE1051:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1038:
-.LBE1037:
-.LBE1036:
-.LBE1035:
-.LBE1034:
-	.loc 1 1758 0
+.LBE1050:
+.LBE1049:
+.LBE1048:
+.LBE1047:
+.LBE1046:
+	.loc 1 1764 0
 	sub	w0, w22, w0
-	.loc 1 1763 0
+	.loc 1 1769 0
 	ldr	w1, [x20, 176]
-	.loc 1 1762 0
+	.loc 1 1768 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1761 0
+	.loc 1 1767 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1763 0
+	.loc 1 1769 0
 	str	w1, [x29, 120]
-	.loc 1 1760 0
+	.loc 1 1766 0
 	str	w0, [x29, 104]
-.LBB1067:
-.LBB1064:
-.LBB1061:
-.LBB1050:
-.LBB1047:
+.LBB1079:
+.LBB1076:
+.LBB1073:
+.LBB1062:
+.LBB1059:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL156:
@@ -2124,19 +2124,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L316
 .LVL157:
 .L193:
-.LBB1041:
-.LBB1042:
-.LBB1043:
+.LBB1053:
+.LBB1054:
+.LBB1055:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL158:
-.LBE1043:
-.LBE1042:
+.LBE1055:
+.LBE1054:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL159:
 .L194:
-.LBE1041:
+.LBE1053:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2149,24 +2149,24 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL160:
 #NO_APP
-.LBE1047:
-.LBE1050:
+.LBE1059:
+.LBE1062:
 	.loc 9 132 0
 	mov	x22, 44
 	cbz	x0, .L172
-.LBB1051:
-.LBB1052:
-.LBB1053:
-.LBB1054:
-.LBB1055:
+.LBB1063:
+.LBB1064:
+.LBB1065:
+.LBB1066:
+.LBB1067:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL161:
-.LBE1055:
-.LBE1054:
-.LBE1053:
-.LBB1056:
-.LBB1057:
+.LBE1067:
+.LBE1066:
+.LBE1065:
+.LBB1068:
+.LBB1069:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2174,13 +2174,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL162:
 #NO_APP
-.LBE1057:
-.LBE1056:
-.LBB1058:
+.LBE1069:
+.LBE1068:
+.LBB1070:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL163:
-.LBE1058:
+.LBE1070:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL164:
@@ -2196,8 +2196,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1052:
-.LBE1051:
+.LBE1064:
+.LBE1063:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
@@ -2209,16 +2209,16 @@ ebc_io_ctl:
 .LVL168:
 	.p2align 3
 .L183:
-.LBE1061:
-.LBE1064:
-.LBE1067:
-.LBB1068:
-.LBB1069:
-.LBB1070:
-.LBB1071:
-.LBB1072:
-.LBB1073:
-.LBB1074:
+.LBE1073:
+.LBE1076:
+.LBE1079:
+.LBB1080:
+.LBB1081:
+.LBB1082:
+.LBB1083:
+.LBB1084:
+.LBB1085:
+.LBB1086:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2226,42 +2226,42 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL169:
 #NO_APP
-.LBE1074:
-.LBE1073:
+.LBE1086:
+.LBE1085:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
-.LBE1072:
-.LBE1071:
-.LBE1070:
-.LBE1069:
-.LBE1068:
-	.loc 1 1844 0
+.LBE1084:
+.LBE1083:
+.LBE1082:
+.LBE1081:
+.LBE1080:
+	.loc 1 1850 0
 	add	x22, x20, 232
-.LBB1103:
-.LBB1099:
-.LBB1095:
-.LBB1084:
-.LBB1081:
-	.loc 6 77 0
-	ldr	x1, [x0, 8]
-.LVL170:
-	.loc 6 84 0
+.LBB1115:
+.LBB1111:
+.LBB1107:
+.LBB1096:
+.LBB1093:
+	.loc 6 77 0
+	ldr	x1, [x0, 8]
+.LVL170:
+	.loc 6 84 0
 	tbz	x2, 21, .L317
 .LVL171:
 .L217:
-.LBB1075:
-.LBB1076:
-.LBB1077:
+.LBB1087:
+.LBB1088:
+.LBB1089:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL172:
-.LBE1077:
-.LBE1076:
+.LBE1089:
+.LBE1088:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL173:
 .L218:
-.LBE1075:
+.LBE1087:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2275,22 +2275,22 @@ ebc_io_ctl:
 .LVL174:
 #NO_APP
 	mov	x3, x0
-.LBE1081:
-.LBE1084:
+.LBE1093:
+.LBE1096:
 	.loc 9 114 0
 	cbz	x0, .L246
-.LBB1085:
-.LBB1086:
-.LBB1087:
-.LBB1088:
-.LBB1089:
+.LBB1097:
+.LBB1098:
+.LBB1099:
+.LBB1100:
+.LBB1101:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LBE1089:
-.LBE1088:
-.LBE1087:
-.LBB1090:
-.LBB1091:
+.LBE1101:
+.LBE1100:
+.LBE1099:
+.LBB1102:
+.LBB1103:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2298,13 +2298,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL175:
 #NO_APP
-.LBE1091:
-.LBE1090:
-.LBB1092:
+.LBE1103:
+.LBE1102:
+.LBB1104:
 	.loc 6 254 0
 	and	x0, x0, x21
 .LVL176:
-.LBE1092:
+.LBE1104:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -2319,8 +2319,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1086:
-.LBE1085:
+.LBE1098:
+.LBE1097:
 	.loc 9 116 0
 	mov	x2, 4
 	mov	x0, x22
@@ -2329,52 +2329,52 @@ ebc_io_ctl:
 .LVL179:
 	.loc 9 118 0
 	cbnz	x0, .L318
-.LBE1095:
-.LBE1099:
-.LBE1103:
-	.loc 1 1848 0
+.LBE1107:
+.LBE1111:
+.LBE1115:
+	.loc 1 1854 0
 	add	x20, x20, 184
 	ldr	w2, [x20, 48]
 	ldr	x0, [x20, 88]
 .LVL180:
-	.loc 1 1849 0
+	.loc 1 1855 0
 	mov	x22, 0
-	.loc 1 1848 0
+	.loc 1 1854 0
 	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	_dev_info
 .LVL181:
-	.loc 1 1849 0
+	.loc 1 1855 0
 	b	.L172
 .LVL182:
 	.p2align 3
 .L177:
-	.loc 1 1841 0
+	.loc 1 1847 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC3
 .LVL183:
-	.loc 1 1839 0
+	.loc 1 1845 0
 	str	wzr, [x20, 788]
-	.loc 1 1842 0
+	.loc 1 1848 0
 	mov	x22, 0
-	.loc 1 1840 0
+	.loc 1 1846 0
 	str	wzr, [x20, 792]
-	.loc 1 1841 0
+	.loc 1 1847 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
 .LVL184:
-	.loc 1 1842 0
+	.loc 1 1848 0
 	b	.L172
 .LVL185:
 	.p2align 3
 .L185:
-	.loc 1 1878 0
+	.loc 1 1884 0
 	bl	ebc_empty_buf_get
 .LVL186:
 	mov	x23, x0
-	.loc 1 1879 0
+	.loc 1 1885 0
 	cbz	x0, .L197
-	.loc 1 1881 0
+	.loc 1 1887 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 320]
@@ -2384,13 +2384,13 @@ ebc_io_ctl:
 .LVL187:
 	.p2align 3
 .L190:
-	.loc 1 1865 0
+	.loc 1 1871 0
 	bl	ebc_empty_buf_get
 .LVL188:
 	mov	x23, x0
-	.loc 1 1866 0
+	.loc 1 1872 0
 	cbz	x0, .L197
-	.loc 1 1868 0
+	.loc 1 1874 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 312]
@@ -2399,18 +2399,18 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL189:
-	.loc 1 1869 0
+	.loc 1 1875 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL190:
 	sub	w0, w20, w0
-.LBB1104:
-.LBB1105:
-.LBB1106:
-.LBB1107:
-.LBB1108:
-.LBB1109:
-.LBB1110:
+.LBB1116:
+.LBB1117:
+.LBB1118:
+.LBB1119:
+.LBB1120:
+.LBB1121:
+.LBB1122:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2418,26 +2418,26 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL191:
 #NO_APP
-.LBE1110:
-.LBE1109:
+.LBE1122:
+.LBE1121:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1108:
-.LBE1107:
-.LBE1106:
-.LBE1105:
-.LBE1104:
-	.loc 1 1872 0
+.LBE1120:
+.LBE1119:
+.LBE1118:
+.LBE1117:
+.LBE1116:
+	.loc 1 1878 0
 	ldp	w4, w1, [x22, 84]
-	.loc 1 1870 0
+	.loc 1 1876 0
 	str	w0, [x29, 104]
-	.loc 1 1871 0
+	.loc 1 1877 0
 	stp	w1, w4, [x29, 112]
-.LBB1115:
-.LBB1114:
-.LBB1113:
-.LBB1112:
-.LBB1111:
+.LBB1127:
+.LBB1126:
+.LBB1125:
+.LBB1124:
+.LBB1123:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL192:
@@ -2447,18 +2447,18 @@ ebc_io_ctl:
 .LVL193:
 	.p2align 3
 .L179:
-.LBE1111:
-.LBE1112:
-.LBE1113:
-.LBE1114:
-.LBE1115:
-.LBB1116:
-.LBB1117:
-.LBB1118:
-.LBB1119:
-.LBB1120:
-.LBB1121:
-.LBB1122:
+.LBE1123:
+.LBE1124:
+.LBE1125:
+.LBE1126:
+.LBE1127:
+.LBB1128:
+.LBB1129:
+.LBB1130:
+.LBB1131:
+.LBB1132:
+.LBB1133:
+.LBB1134:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2466,31 +2466,31 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL194:
 #NO_APP
-.LBE1122:
-.LBE1121:
+.LBE1134:
+.LBE1133:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1120:
-.LBE1119:
-.LBE1118:
-.LBE1117:
-.LBE1116:
-	.loc 1 1855 0
+.LBE1132:
+.LBE1131:
+.LBE1130:
+.LBE1129:
+.LBE1128:
+	.loc 1 1861 0
 	ldp	w1, w0, [x20, 116]
 .LVL195:
 	stp	w1, w0, [x29, 140]
-	.loc 1 1852 0
+	.loc 1 1858 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 1851 0
+	.loc 1 1857 0
 	stp	w5, w6, [x29, 112]
-	.loc 1 1853 0
+	.loc 1 1859 0
 	ldr	w4, [x20, 176]
 	str	w4, [x29, 120]
-.LBB1151:
-.LBB1147:
-.LBB1143:
-.LBB1132:
-.LBB1129:
+.LBB1163:
+.LBB1159:
+.LBB1155:
+.LBB1144:
+.LBB1141:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL196:
@@ -2498,19 +2498,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L319
 .LVL197:
 .L221:
-.LBB1123:
-.LBB1124:
-.LBB1125:
+.LBB1135:
+.LBB1136:
+.LBB1137:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL198:
-.LBE1125:
-.LBE1124:
+.LBE1137:
+.LBE1136:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL199:
 .L222:
-.LBE1123:
+.LBE1135:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2523,64 +2523,64 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL200:
 #NO_APP
-.LBE1129:
-.LBE1132:
+.LBE1141:
+.LBE1144:
 	.loc 9 132 0
 	cbnz	x0, .L223
 .L224:
-.LBE1143:
-.LBE1147:
-.LBE1151:
-	.loc 1 1858 0
+.LBE1155:
+.LBE1159:
+.LBE1163:
+	.loc 1 1864 0
 	ldr	x0, [x20, 272]
 .LVL201:
 	adrp	x1, .LC5
 .LVL202:
-	.loc 1 1859 0
+	.loc 1 1865 0
 	mov	x22, -14
-	.loc 1 1858 0
+	.loc 1 1864 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
 .LVL203:
-	.loc 1 1859 0
+	.loc 1 1865 0
 	b	.L172
 .LVL204:
 	.p2align 3
 .L176:
-	.loc 1 1919 0
+	.loc 1 1925 0
 	ldr	x0, [x20, 272]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
 .LVL205:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
-	.loc 1 1920 0
+	.loc 1 1926 0
 	mov	x22, 0
-	.loc 1 1919 0
+	.loc 1 1925 0
 	bl	_dev_err
 .LVL206:
-	.loc 1 1923 0
+	.loc 1 1929 0
 	b	.L172
 .LVL207:
 	.p2align 3
 .L181:
-	.loc 1 1768 0
+	.loc 1 1774 0
 	bl	ebc_empty_buf_get
 .LVL208:
 	mov	x23, x0
-	.loc 1 1769 0
+	.loc 1 1775 0
 	cbz	x0, .L197
-	.loc 1 1772 0
+	.loc 1 1778 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL209:
-.LBB1152:
-.LBB1153:
-.LBB1154:
-.LBB1155:
-.LBB1156:
-.LBB1157:
-.LBB1158:
+.LBB1164:
+.LBB1165:
+.LBB1166:
+.LBB1167:
+.LBB1168:
+.LBB1169:
+.LBB1170:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2588,32 +2588,32 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL210:
 #NO_APP
-.LBE1158:
-.LBE1157:
+.LBE1170:
+.LBE1169:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1156:
-.LBE1155:
-.LBE1154:
-.LBE1153:
-.LBE1152:
-	.loc 1 1772 0
+.LBE1168:
+.LBE1167:
+.LBE1166:
+.LBE1165:
+.LBE1164:
+	.loc 1 1778 0
 	sub	w0, w22, w0
-	.loc 1 1777 0
+	.loc 1 1783 0
 	ldr	w1, [x20, 176]
-	.loc 1 1776 0
+	.loc 1 1782 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1775 0
+	.loc 1 1781 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1777 0
+	.loc 1 1783 0
 	str	w1, [x29, 120]
-	.loc 1 1774 0
+	.loc 1 1780 0
 	str	w0, [x29, 104]
-.LBB1187:
-.LBB1183:
-.LBB1179:
-.LBB1168:
-.LBB1165:
+.LBB1199:
+.LBB1195:
+.LBB1191:
+.LBB1180:
+.LBB1177:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL211:
@@ -2621,19 +2621,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L320
 .LVL212:
 .L198:
-.LBB1159:
-.LBB1160:
-.LBB1161:
+.LBB1171:
+.LBB1172:
+.LBB1173:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL213:
-.LBE1161:
-.LBE1160:
+.LBE1173:
+.LBE1172:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL214:
 .L199:
-.LBE1159:
+.LBE1171:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2646,268 +2646,268 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL215:
 #NO_APP
-.LBE1165:
-.LBE1168:
+.LBE1177:
+.LBE1180:
 	.loc 9 132 0
 	cbnz	x0, .L200
 .L201:
-.LBE1179:
-.LBE1183:
-.LBE1187:
-	.loc 1 1781 0
+.LBE1191:
+.LBE1195:
+.LBE1199:
+	.loc 1 1787 0
 	mov	x0, x23
 .LVL216:
-	.loc 1 1782 0
+	.loc 1 1788 0
 	mov	x22, -14
-	.loc 1 1781 0
+	.loc 1 1787 0
 	bl	ebc_buf_release
 .LVL217:
-	.loc 1 1782 0
+	.loc 1 1788 0
 	b	.L172
 .LVL218:
 	.p2align 3
 .L315:
-.LBB1188:
-.LBB1031:
+.LBB1200:
+.LBB1043:
+.LBB1041:
+.LBB1039:
 .LBB1029:
+.LBB1026:
 .LBB1027:
-.LBB1017:
-.LBB1014:
-.LBB1015:
-.LBB1016:
+.LBB1028:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1016:
-.LBE1015:
-.LBE1014:
-.LBE1017:
+.LBE1028:
 .LBE1027:
+.LBE1026:
 .LBE1029:
-.LBE1031:
-.LBE1188:
-	.loc 1 1727 0
+.LBE1039:
+.LBE1041:
+.LBE1043:
+.LBE1200:
+	.loc 1 1733 0
 	mov	x0, x21
 .LVL219:
-.LBB1189:
-.LBB1032:
+.LBB1201:
+.LBB1044:
+.LBB1042:
+.LBB1040:
 .LBB1030:
-.LBB1028:
-.LBB1018:
 	.loc 6 84 0
 	tbz	x2, 26, .L215
 	b	.L214
 .LVL220:
 	.p2align 3
 .L311:
-.LBE1018:
-.LBE1028:
 .LBE1030:
-.LBE1032:
-.LBE1189:
-.LBB1190:
-.LBB996:
+.LBE1040:
+.LBE1042:
+.LBE1044:
+.LBE1201:
+.LBB1202:
+.LBB1008:
+.LBB1006:
+.LBB1004:
 .LBB994:
+.LBB991:
 .LBB992:
-.LBB982:
-.LBB979:
-.LBB980:
-.LBB981:
+.LBB993:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE981:
-.LBE980:
-.LBE979:
-.LBE982:
+.LBE993:
 .LBE992:
+.LBE991:
 .LBE994:
-.LBE996:
-.LBE1190:
-	.loc 1 1727 0
+.LBE1004:
+.LBE1006:
+.LBE1008:
+.LBE1202:
+	.loc 1 1733 0
 	mov	x0, x21
 .LVL221:
-.LBB1191:
-.LBB997:
+.LBB1203:
+.LBB1009:
+.LBB1007:
+.LBB1005:
 .LBB995:
-.LBB993:
-.LBB983:
 	.loc 6 84 0
 	tbz	x2, 26, .L203
 	b	.L202
 .LVL222:
 	.p2align 3
 .L319:
-.LBE983:
-.LBE993:
 .LBE995:
-.LBE997:
-.LBE1191:
-.LBB1192:
-.LBB1148:
-.LBB1144:
-.LBB1133:
-.LBB1130:
-.LBB1126:
-.LBB1127:
-.LBB1128:
+.LBE1005:
+.LBE1007:
+.LBE1009:
+.LBE1203:
+.LBB1204:
+.LBB1160:
+.LBB1156:
+.LBB1145:
+.LBB1142:
+.LBB1138:
+.LBB1139:
+.LBB1140:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL223:
-.LBE1128:
-.LBE1127:
-.LBE1126:
-.LBE1130:
-.LBE1133:
-.LBE1144:
-.LBE1148:
-.LBE1192:
-	.loc 1 1727 0
+.LBE1140:
+.LBE1139:
+.LBE1138:
+.LBE1142:
+.LBE1145:
+.LBE1156:
+.LBE1160:
+.LBE1204:
+	.loc 1 1733 0
 	mov	x0, x21
 .LVL224:
-.LBB1193:
-.LBB1149:
-.LBB1145:
-.LBB1134:
-.LBB1131:
+.LBB1205:
+.LBB1161:
+.LBB1157:
+.LBB1146:
+.LBB1143:
 	.loc 6 84 0
 	tbz	x2, 26, .L222
 	b	.L221
 .LVL225:
 	.p2align 3
 .L317:
-.LBE1131:
-.LBE1134:
-.LBE1145:
-.LBE1149:
-.LBE1193:
-.LBB1194:
-.LBB1100:
-.LBB1096:
-.LBB1093:
-.LBB1082:
-.LBB1078:
-.LBB1079:
-.LBB1080:
+.LBE1143:
+.LBE1146:
+.LBE1157:
+.LBE1161:
+.LBE1205:
+.LBB1206:
+.LBB1112:
+.LBB1108:
+.LBB1105:
+.LBB1094:
+.LBB1090:
+.LBB1091:
+.LBB1092:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1080:
-.LBE1079:
-.LBE1078:
-.LBE1082:
-.LBE1093:
-.LBE1096:
-.LBE1100:
-.LBE1194:
-	.loc 1 1727 0
+.LBE1092:
+.LBE1091:
+.LBE1090:
+.LBE1094:
+.LBE1105:
+.LBE1108:
+.LBE1112:
+.LBE1206:
+	.loc 1 1733 0
 	mov	x0, x21
 .LVL226:
-.LBB1195:
-.LBB1101:
-.LBB1097:
-.LBB1094:
-.LBB1083:
+.LBB1207:
+.LBB1113:
+.LBB1109:
+.LBB1106:
+.LBB1095:
 	.loc 6 84 0
 	tbz	x2, 26, .L218
 	b	.L217
 .LVL227:
 	.p2align 3
 .L320:
-.LBE1083:
-.LBE1094:
-.LBE1097:
-.LBE1101:
-.LBE1195:
+.LBE1095:
+.LBE1106:
+.LBE1109:
+.LBE1113:
+.LBE1207:
+.LBB1208:
 .LBB1196:
-.LBB1184:
-.LBB1180:
-.LBB1169:
-.LBB1166:
-.LBB1162:
-.LBB1163:
-.LBB1164:
+.LBB1192:
+.LBB1181:
+.LBB1178:
+.LBB1174:
+.LBB1175:
+.LBB1176:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL228:
-.LBE1164:
-.LBE1163:
-.LBE1162:
-.LBE1166:
-.LBE1169:
-.LBE1180:
-.LBE1184:
+.LBE1176:
+.LBE1175:
+.LBE1174:
+.LBE1178:
+.LBE1181:
+.LBE1192:
 .LBE1196:
-	.loc 1 1727 0
+.LBE1208:
+	.loc 1 1733 0
 	mov	x0, x21
 .LVL229:
+.LBB1209:
 .LBB1197:
-.LBB1185:
-.LBB1181:
-.LBB1170:
-.LBB1167:
+.LBB1193:
+.LBB1182:
+.LBB1179:
 	.loc 6 84 0
 	tbz	x2, 26, .L199
 	b	.L198
 .LVL230:
 	.p2align 3
 .L316:
-.LBE1167:
-.LBE1170:
-.LBE1181:
-.LBE1185:
+.LBE1179:
+.LBE1182:
+.LBE1193:
 .LBE1197:
-.LBB1198:
-.LBB1065:
-.LBB1062:
-.LBB1059:
-.LBB1048:
-.LBB1044:
-.LBB1045:
-.LBB1046:
+.LBE1209:
+.LBB1210:
+.LBB1077:
+.LBB1074:
+.LBB1071:
+.LBB1060:
+.LBB1056:
+.LBB1057:
+.LBB1058:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL231:
-.LBE1046:
-.LBE1045:
-.LBE1044:
-.LBE1048:
-.LBE1059:
-.LBE1062:
-.LBE1065:
-.LBE1198:
-	.loc 1 1727 0
+.LBE1058:
+.LBE1057:
+.LBE1056:
+.LBE1060:
+.LBE1071:
+.LBE1074:
+.LBE1077:
+.LBE1210:
+	.loc 1 1733 0
 	mov	x0, x21
 .LVL232:
-.LBB1199:
-.LBB1066:
-.LBB1063:
-.LBB1060:
-.LBB1049:
+.LBB1211:
+.LBB1078:
+.LBB1075:
+.LBB1072:
+.LBB1061:
 	.loc 6 84 0
 	tbz	x2, 26, .L194
 	b	.L193
 .LVL233:
 	.p2align 3
 .L223:
-.LBE1049:
-.LBE1060:
-.LBE1063:
-.LBE1066:
-.LBE1199:
-.LBB1200:
+.LBE1061:
+.LBE1072:
+.LBE1075:
+.LBE1078:
+.LBE1211:
+.LBB1212:
+.LBB1162:
+.LBB1158:
+.LBB1147:
+.LBB1148:
+.LBB1149:
 .LBB1150:
-.LBB1146:
-.LBB1135:
-.LBB1136:
-.LBB1137:
-.LBB1138:
-.LBB1139:
+.LBB1151:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL234:
-.LBE1139:
-.LBE1138:
-.LBE1137:
-.LBB1140:
-.LBB1141:
+.LBE1151:
+.LBE1150:
+.LBE1149:
+.LBB1152:
+.LBB1153:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2915,13 +2915,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL235:
 #NO_APP
-.LBE1141:
-.LBE1140:
-.LBB1142:
+.LBE1153:
+.LBE1152:
+.LBB1154:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL236:
-.LBE1142:
+.LBE1154:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL237:
@@ -2937,44 +2937,44 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1136:
-.LBE1135:
+.LBE1148:
+.LBE1147:
 	.loc 9 134 0
 	mov	x2, 44
 	add	x1, x29, 104
 .LVL239:
 	bl	__arch_copy_to_user
 .LVL240:
-.LBE1146:
-.LBE1150:
-.LBE1200:
-	.loc 1 1857 0
+.LBE1158:
+.LBE1162:
+.LBE1212:
+	.loc 1 1863 0
 	cbnz	x0, .L224
-.LBB1201:
-.LBB1001:
+.LBB1213:
+.LBB1013:
 	mov	x22, 0
 	b	.L172
 .LVL241:
 	.p2align 3
 .L200:
-.LBE1001:
-.LBE1201:
-.LBB1202:
+.LBE1013:
+.LBE1213:
+.LBB1214:
+.LBB1198:
+.LBB1194:
+.LBB1183:
+.LBB1184:
+.LBB1185:
 .LBB1186:
-.LBB1182:
-.LBB1171:
-.LBB1172:
-.LBB1173:
-.LBB1174:
-.LBB1175:
+.LBB1187:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL242:
-.LBE1175:
-.LBE1174:
-.LBE1173:
-.LBB1176:
-.LBB1177:
+.LBE1187:
+.LBE1186:
+.LBE1185:
+.LBB1188:
+.LBB1189:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2982,13 +2982,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL243:
 #NO_APP
-.LBE1177:
-.LBE1176:
-.LBB1178:
+.LBE1189:
+.LBE1188:
+.LBB1190:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL244:
-.LBE1178:
+.LBE1190:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL245:
@@ -3004,38 +3004,38 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1172:
-.LBE1171:
+.LBE1184:
+.LBE1183:
 	.loc 9 134 0
 	mov	x2, 44
 	add	x1, x29, 104
 .LVL247:
 	bl	__arch_copy_to_user
 .LVL248:
-.LBE1182:
-.LBE1186:
-.LBE1202:
-	.loc 1 1780 0
+.LBE1194:
+.LBE1198:
+.LBE1214:
+	.loc 1 1786 0
 	cbnz	w0, .L201
-.LBB1203:
-.LBB1002:
+.LBB1215:
+.LBB1014:
 	mov	x22, 0
 	b	.L172
 .LVL249:
 	.p2align 3
 .L205:
-.LBE1002:
-.LBE1203:
-	.loc 1 1788 0
+.LBE1014:
+.LBE1215:
+	.loc 1 1794 0
 	mov	x22, -14
 	b	.L172
 .LVL250:
 	.p2align 3
 .L312:
-	.loc 1 1803 0
+	.loc 1 1809 0
 	mov	w2, 1
 	str	w2, [x20, 80]
-	.loc 1 1804 0
+	.loc 1 1810 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -3045,25 +3045,25 @@ ebc_io_ctl:
 	b	.L207
 	.p2align 3
 .L313:
-	.loc 1 1806 0 discriminator 1
+	.loc 1 1812 0 discriminator 1
 	ldr	w0, [x20, 592]
 	cbz	w0, .L209
-.LBB1204:
-.LBB1003:
+.LBB1216:
+.LBB1015:
 	mov	x22, 0
 	b	.L172
 .LVL252:
 .L197:
-.LBE1003:
-.LBE1204:
-	.loc 1 1756 0
+.LBE1015:
+.LBE1216:
+	.loc 1 1762 0
 	mov	x22, -1
 	b	.L172
 .LVL253:
 .L246:
-.LBB1205:
-.LBB1102:
-.LBB1098:
+.LBB1217:
+.LBB1114:
+.LBB1110:
 	.loc 9 112 0
 	mov	x0, 4
 .LVL254:
@@ -3076,22 +3076,22 @@ ebc_io_ctl:
 .LVL256:
 	bl	memset
 .LVL257:
-.LBE1098:
-.LBE1102:
-.LBE1205:
-	.loc 1 1845 0
+.LBE1110:
+.LBE1114:
+.LBE1217:
+	.loc 1 1851 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC4
-	.loc 1 1846 0
+	.loc 1 1852 0
 	mov	x22, -14
-	.loc 1 1845 0
+	.loc 1 1851 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
 .LVL258:
-	.loc 1 1846 0
+	.loc 1 1852 0
 	b	.L172
 .L310:
-	.loc 1 1924 0
+	.loc 1 1930 0
 	bl	__stack_chk_fail
 .LVL259:
 .L318:
@@ -3287,7 +3287,7 @@ frame_done_callback:
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
 .LFB2829:
-	.loc 1 1653 0
+	.loc 1 1659 0
 	.cfi_startproc
 .LVL271:
 	stp	x29, x30, [sp, -16]!
@@ -3296,10 +3296,10 @@ ebc_frame_timeout:
 	.cfi_offset 30, -8
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1654 0
+	.loc 1 1660 0
 	bl	frame_done_callback
 .LVL272:
-	.loc 1 1656 0
+	.loc 1 1662 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3347,16 +3347,16 @@ ebc_lut_update:
 	ldr	x3, [x0]
 	str	x3, [x29, 56]
 	mov	x3,0
-.LBB1206:
-.LBB1207:
+.LBB1218:
+.LBB1219:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
 .LVL276:
 	mov	w20, w0
-.LBE1207:
-.LBE1206:
+.LBE1219:
+.LBE1218:
 	.loc 1 1217 0
 	cbnz	w0, .L332
 .LVL277:
@@ -3599,23 +3599,23 @@ ebc_lut_update:
 	.type	ebc_buf_state_read, %function
 ebc_buf_state_read:
 .LFB2841:
-	.loc 1 2057 0
+	.loc 1 2063 0
 	.cfi_startproc
 .LVL298:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2058 0
+	.loc 1 2064 0
 	mov	x0, x2
 .LVL299:
-	.loc 1 2057 0
+	.loc 1 2063 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2058 0
+	.loc 1 2064 0
 	bl	ebc_buf_state_show
 .LVL300:
-	.loc 1 2059 0
+	.loc 1 2065 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3630,32 +3630,32 @@ ebc_buf_state_read:
 	.type	ebc_state_read, %function
 ebc_state_read:
 .LFB2840:
-	.loc 1 2048 0
+	.loc 1 2054 0
 	.cfi_startproc
 .LVL301:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2049 0
+	.loc 1 2055 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2048 0
+	.loc 1 2054 0
 	mov	x0, x2
 .LVL302:
-	.loc 1 2049 0
+	.loc 1 2055 0
 	adrp	x1, .LC15
 .LVL303:
-	.loc 1 2048 0
+	.loc 1 2054 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2049 0
+	.loc 1 2055 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL304:
 	add	x1, x1, :lo12:.LC15
 	ldr	w2, [x2, 608]
 	bl	sprintf
 .LVL305:
-	.loc 1 2050 0
+	.loc 1 2056 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3670,7 +3670,7 @@ ebc_state_read:
 	.type	ebc_version_read, %function
 ebc_version_read:
 .LFB2839:
-	.loc 1 2039 0
+	.loc 1 2045 0
 	.cfi_startproc
 .LVL306:
 	stp	x29, x30, [sp, -16]!
@@ -3679,22 +3679,22 @@ ebc_version_read:
 	.cfi_offset 30, -8
 	mov	x0, x2
 .LVL307:
-	.loc 1 2040 0
+	.loc 1 2046 0
 	adrp	x1, .LC17
 .LVL308:
 	adrp	x2, .LC16
 .LVL309:
-	.loc 1 2039 0
+	.loc 1 2045 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2040 0
+	.loc 1 2046 0
 	add	x2, x2, :lo12:.LC16
-	.loc 1 2039 0
-	.loc 1 2040 0
+	.loc 1 2045 0
+	.loc 1 2046 0
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
 .LVL310:
-	.loc 1 2041 0
+	.loc 1 2047 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3709,46 +3709,46 @@ ebc_version_read:
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
 .LFB2837:
-	.loc 1 2003 0
+	.loc 1 2009 0
 	.cfi_startproc
 .LVL311:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 2004 0
+	.loc 1 2010 0
 	adrp	x0, .LANCHOR0
 .LVL312:
-	.loc 1 2003 0
+	.loc 1 2009 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2007 0
+	.loc 1 2013 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2003 0
+	.loc 1 2009 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 2003 0
+	.loc 1 2009 0
 	mov	x19, x2
-	.loc 1 2007 0
+	.loc 1 2013 0
 	ldr	x1, [x0, 16]
 .LVL313:
-.LBB1208:
-.LBB1209:
+.LBB1220:
+.LBB1221:
 	.loc 3 55 0
 	mov	x0, x1
 	ldr	x1, [x1, 64]
 	blr	x1
 .LVL314:
-.LBE1209:
-.LBE1208:
-	.loc 1 2009 0
+.LBE1221:
+.LBE1220:
+	.loc 1 2015 0
 	mov	w2, w0
 	adrp	x1, .LC15
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
 .LVL315:
-	.loc 1 2010 0
+	.loc 1 2016 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL316:
@@ -3766,33 +3766,33 @@ pmic_vcom_read:
 	.type	pmic_temp_read, %function
 pmic_temp_read:
 .LFB2836:
-	.loc 1 1989 0
+	.loc 1 1995 0
 	.cfi_startproc
 .LVL317:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 1990 0
+	.loc 1 1996 0
 	adrp	x0, .LANCHOR0
 .LVL318:
-	.loc 1 1989 0
+	.loc 1 1995 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1993 0
+	.loc 1 1999 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-.LBB1210:
-.LBB1211:
+.LBB1222:
+.LBB1223:
 	.loc 3 50 0
 	add	x1, x29, 36
 .LVL319:
-.LBE1211:
-.LBE1210:
-	.loc 1 1989 0
+.LBE1223:
+.LBE1222:
+	.loc 1 1995 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 1989 0
+	.loc 1 1995 0
 	adrp	x19, __stack_chk_guard
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x20, x2
@@ -3800,25 +3800,25 @@ pmic_temp_read:
 	str	x2, [x29, 40]
 	mov	x2,0
 .LVL320:
-	.loc 1 1993 0
+	.loc 1 1999 0
 	ldr	x2, [x0, 16]
-.LBB1213:
-.LBB1212:
+.LBB1225:
+.LBB1224:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
 .LVL321:
-.LBE1212:
-.LBE1213:
-	.loc 1 1995 0
+.LBE1224:
+.LBE1225:
+	.loc 1 2001 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC15
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
 .LVL322:
-	.loc 1 1996 0
+	.loc 1 2002 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
@@ -3847,25 +3847,25 @@ pmic_temp_read:
 	.type	pmic_name_read, %function
 pmic_name_read:
 .LFB2835:
-	.loc 1 1978 0
+	.loc 1 1984 0
 	.cfi_startproc
 .LVL326:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1979 0
+	.loc 1 1985 0
 	adrp	x3, .LANCHOR0
-	.loc 1 1978 0
+	.loc 1 1984 0
 	mov	x0, x2
 .LVL327:
-	.loc 1 1981 0
+	.loc 1 1987 0
 	adrp	x1, .LC17
 .LVL328:
-	.loc 1 1978 0
+	.loc 1 1984 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1981 0
+	.loc 1 1987 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL329:
 	add	x1, x1, :lo12:.LC17
@@ -3873,7 +3873,7 @@ pmic_name_read:
 	add	x2, x2, 8
 	bl	sprintf
 .LVL330:
-	.loc 1 1982 0
+	.loc 1 1988 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3888,17 +3888,17 @@ pmic_name_read:
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
 .LFB2838:
-	.loc 1 2015 0
+	.loc 1 2021 0
 	.cfi_startproc
 .LVL331:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 2016 0
+	.loc 1 2022 0
 	adrp	x0, .LANCHOR0
 .LVL332:
-	.loc 1 2015 0
+	.loc 1 2021 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -3908,37 +3908,37 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 2015 0
+	.loc 1 2021 0
 	add	x1, x19, :lo12:__stack_chk_guard
 .LVL333:
 	mov	x21, x2
-	.loc 1 2016 0
+	.loc 1 2022 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
 .LVL334:
-	.loc 1 2015 0
+	.loc 1 2021 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
 .LVL335:
 	mov	x20, x3
-	.loc 1 2019 0
+	.loc 1 2025 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
 .LVL336:
-	.loc 1 2020 0
+	.loc 1 2026 0
 	cbnz	w0, .L381
 .LVL337:
-	.loc 1 2024 0
+	.loc 1 2030 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
 .LVL338:
-	.loc 1 2025 0
+	.loc 1 2031 0
 	cbnz	w0, .L382
 .L374:
-	.loc 1 2031 0
+	.loc 1 2037 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
 .LVL339:
@@ -3963,36 +3963,36 @@ pmic_vcom_write:
 	.p2align 3
 .L381:
 	.cfi_restore_state
-	.loc 1 2021 0
+	.loc 1 2027 0
 	ldr	x0, [x22]
 	adrp	x1, .LC18
 	mov	x2, x21
 	add	x1, x1, :lo12:.LC18
-	.loc 1 2022 0
+	.loc 1 2028 0
 	mov	x20, -1
 .LVL342:
-	.loc 1 2021 0
+	.loc 1 2027 0
 	bl	_dev_err
 .LVL343:
-	.loc 1 2022 0
+	.loc 1 2028 0
 	b	.L374
 .LVL344:
 	.p2align 3
 .L382:
-	.loc 1 2026 0
+	.loc 1 2032 0
 	ldr	x0, [x22]
 	adrp	x1, .LC19
-	.loc 1 2027 0
+	.loc 1 2033 0
 	mov	x20, -1
 .LVL345:
-	.loc 1 2026 0
+	.loc 1 2032 0
 	add	x1, x1, :lo12:.LC19
 	bl	_dev_err
 .LVL346:
-	.loc 1 2027 0
+	.loc 1 2033 0
 	b	.L374
 .L383:
-	.loc 1 2031 0
+	.loc 1 2037 0
 	bl	__stack_chk_fail
 .LVL347:
 	.cfi_endproc
@@ -4003,7 +4003,7 @@ pmic_vcom_write:
 	.type	waveform_version_read, %function
 waveform_version_read:
 .LFB2834:
-	.loc 1 1967 0
+	.loc 1 1973 0
 	.cfi_startproc
 .LVL348:
 	stp	x29, x30, [sp, -32]!
@@ -4014,19 +4014,19 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1967 0
+	.loc 1 1973 0
 	mov	x19, x2
-	.loc 1 1968 0
+	.loc 1 1974 0
 	bl	epd_lut_get_wf_version
 .LVL349:
-	.loc 1 1970 0
+	.loc 1 1976 0
 	mov	x2, x0
 	adrp	x1, .LC17
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
 .LVL350:
-	.loc 1 1971 0
+	.loc 1 1977 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL351:
@@ -4044,23 +4044,23 @@ waveform_version_read:
 	.type	ebc_init, %function
 ebc_init:
 .LFB2852:
-	.loc 1 2494 0
+	.loc 1 2520 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2495 0
+	.loc 1 2521 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2494 0
+	.loc 1 2520 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2495 0
+	.loc 1 2521 0
 	bl	__platform_driver_register
 .LVL352:
-	.loc 1 2496 0
+	.loc 1 2522 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -4082,8 +4082,8 @@ direct_mode_data_change:
 	ldr	w13, [x3, 72]
 .LVL354:
 	cbnz	w13, .L422
-.LBB1232:
-.LBB1233:
+.LBB1244:
+.LBB1245:
 	.loc 1 865 0
 	adrp	x5, .LANCHOR0
 	.loc 1 871 0
@@ -4147,78 +4147,78 @@ direct_mode_data_change:
 	ldr	w4, [x1, x5, lsl 2]
 	add	x5, x5, 1
 .LVL364:
-.LBB1234:
-.LBB1235:
+.LBB1246:
+.LBB1247:
 	.loc 1 131 0
 	and	w9, w3, 65280
-.LBE1235:
-.LBE1234:
+.LBE1247:
+.LBE1246:
 	.loc 1 887 0
 	cmp	w12, w5
 .LVL365:
 	.loc 1 891 0
 	and	w6, w4, 65535
-.LBB1240:
-.LBB1236:
+.LBB1252:
+.LBB1248:
 	.loc 1 130 0
 	ubfiz	w8, w3, 8, 8
 	.loc 1 131 0
 	add	w9, w9, w6, lsr 8
 	.loc 1 130 0
 	add	w6, w8, w6, uxtb
-.LBE1236:
-.LBE1240:
+.LBE1248:
+.LBE1252:
 	.loc 1 892 0
 	lsr	w3, w3, 16
 .LVL366:
 	lsr	w4, w4, 16
-.LBB1241:
-.LBB1242:
+.LBB1253:
+.LBB1254:
 	.loc 1 130 0
 	ubfiz	w8, w3, 8, 8
 	.loc 1 131 0
 	and	w3, w3, 65280
-.LBE1242:
-.LBE1241:
-.LBB1246:
-.LBB1237:
+.LBE1254:
+.LBE1253:
+.LBB1258:
+.LBB1249:
 	.loc 1 130 0
 	ldrb	w11, [x7, w6, sxtw]
-.LBE1237:
-.LBE1246:
-.LBB1247:
-.LBB1243:
+.LBE1249:
+.LBE1258:
+.LBB1259:
+.LBB1255:
 	.loc 1 131 0
 	add	w3, w3, w4, lsr 8
-.LBE1243:
-.LBE1247:
-.LBB1248:
-.LBB1238:
+.LBE1255:
+.LBE1259:
+.LBB1260:
+.LBB1250:
 	ldrb	w9, [x7, w9, sxtw]
-.LBE1238:
-.LBE1248:
-.LBB1249:
-.LBB1244:
+.LBE1250:
+.LBE1260:
+.LBB1261:
+.LBB1256:
 	.loc 1 130 0
 	add	w6, w8, w4, uxtb
-.LBE1244:
-.LBE1249:
-.LBB1250:
-.LBB1239:
+.LBE1256:
+.LBE1261:
+.LBB1262:
+.LBB1251:
 	orr	w4, w11, w9, lsl 4
-.LBE1239:
-.LBE1250:
+.LBE1251:
+.LBE1262:
 	.loc 1 891 0
 	strb	w4, [x10], 2
-.LBB1251:
-.LBB1245:
+.LBB1263:
+.LBB1257:
 	.loc 1 131 0
 	ldrb	w3, [x7, w3, sxtw]
 	.loc 1 130 0
 	ldrb	w4, [x7, w6, sxtw]
 	orr	w3, w4, w3, lsl 4
-.LBE1245:
-.LBE1251:
+.LBE1257:
+.LBE1263:
 	.loc 1 892 0
 	strb	w3, [x10, -1]
 	.loc 1 887 0
@@ -4243,11 +4243,11 @@ direct_mode_data_change:
 	b	.L397
 .LVL369:
 .L422:
-.LBE1233:
-.LBE1232:
-.LBB1252:
-.LBB1253:
-.LBB1254:
+.LBE1245:
+.LBE1244:
+.LBB1264:
+.LBB1265:
+.LBB1266:
 	.loc 1 826 0
 	adrp	x7, .LANCHOR0
 	.loc 1 832 0
@@ -4306,9 +4306,9 @@ direct_mode_data_change:
 .L414:
 	.loc 1 848 0
 	cbz	w14, .L424
-.LBE1254:
-.LBE1253:
-.LBE1252:
+.LBE1266:
+.LBE1265:
+.LBE1264:
 	.loc 1 900 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
@@ -4318,9 +4318,9 @@ direct_mode_data_change:
 	.cfi_def_cfa_register 29
 	.p2align 2
 .L415:
-.LBB1299:
-.LBB1297:
-.LBB1295:
+.LBB1311:
+.LBB1309:
+.LBB1307:
 	.loc 1 848 0
 	mov	x5, 0
 	.p2align 2
@@ -4339,8 +4339,8 @@ direct_mode_data_change:
 	cmp	x11, x5
 	.loc 1 852 0
 	and	w6, w1, 65535
-.LBB1255:
-.LBB1256:
+.LBB1267:
+.LBB1268:
 	.loc 1 130 0
 	ubfiz	w30, w7, 8, 8
 	.loc 1 131 0
@@ -4349,143 +4349,143 @@ direct_mode_data_change:
 	add	w30, w30, w6, uxtb
 	.loc 1 131 0
 	add	w7, w7, w6, lsr 8
-.LBE1256:
-.LBE1255:
+.LBE1268:
+.LBE1267:
 	.loc 1 853 0
 	lsr	w8, w2, 16
 	lsr	w6, w1, 16
-.LBB1260:
-.LBB1261:
+.LBB1272:
+.LBB1273:
 	.loc 1 130 0
 	ubfiz	w18, w8, 8, 8
-.LBE1261:
-.LBE1260:
-.LBB1267:
-.LBB1257:
+.LBE1273:
+.LBE1272:
+.LBB1279:
+.LBB1269:
 	ldrb	w30, [x3, w30, sxtw]
-.LBE1257:
-.LBE1267:
-.LBB1268:
-.LBB1262:
+.LBE1269:
+.LBE1279:
+.LBB1280:
+.LBB1274:
 	.loc 1 131 0
 	and	w8, w8, 65280
-.LBE1262:
-.LBE1268:
-.LBB1269:
-.LBB1258:
-	ldrb	w17, [x3, w7, sxtw]
-.LBE1258:
-.LBE1269:
+.LBE1274:
+.LBE1280:
+.LBB1281:
 .LBB1270:
-.LBB1263:
+	ldrb	w17, [x3, w7, sxtw]
+.LBE1270:
+.LBE1281:
+.LBB1282:
+.LBB1275:
 	.loc 1 130 0
 	add	w18, w18, w6, uxtb
 	.loc 1 131 0
 	add	w8, w8, w6, lsr 8
-.LBE1263:
-.LBE1270:
+.LBE1275:
+.LBE1282:
 	.loc 1 854 0
 	ubfx	x7, x2, 32, 16
 	ubfx	x6, x1, 32, 16
 	.loc 1 855 0
 	lsr	x2, x2, 48
 .LVL383:
+.LBB1283:
 .LBB1271:
-.LBB1259:
 	.loc 1 130 0
 	orr	w17, w30, w17, lsl 4
-.LBE1259:
 .LBE1271:
+.LBE1283:
 	.loc 1 852 0
 	strb	w17, [x4, -4]
-.LBB1272:
-.LBB1273:
+.LBB1284:
+.LBB1285:
 	.loc 1 130 0
 	ubfiz	w17, w7, 8, 8
 	.loc 1 131 0
 	and	w7, w7, 65280
-.LBE1273:
-.LBE1272:
-.LBB1279:
-.LBB1264:
+.LBE1285:
+.LBE1284:
+.LBB1291:
+.LBB1276:
 	ldrb	w8, [x3, w8, sxtw]
-.LBE1264:
-.LBE1279:
-.LBB1280:
-.LBB1274:
+.LBE1276:
+.LBE1291:
+.LBB1292:
+.LBB1286:
 	.loc 1 130 0
 	add	w17, w17, w6, uxtb
-.LBE1274:
-.LBE1280:
-.LBB1281:
-.LBB1265:
+.LBE1286:
+.LBE1292:
+.LBB1293:
+.LBB1277:
 	ldrb	w18, [x3, w18, sxtw]
-.LBE1265:
-.LBE1281:
-.LBB1282:
-.LBB1275:
+.LBE1277:
+.LBE1293:
+.LBB1294:
+.LBB1287:
 	.loc 1 131 0
 	add	w6, w7, w6, lsr 8
-.LBE1275:
-.LBE1282:
+.LBE1287:
+.LBE1294:
 	.loc 1 855 0
 	lsr	x1, x1, 48
 .LVL384:
-.LBB1283:
-.LBB1266:
+.LBB1295:
+.LBB1278:
 	.loc 1 130 0
 	orr	w7, w18, w8, lsl 4
-.LBE1266:
-.LBE1283:
+.LBE1278:
+.LBE1295:
 	.loc 1 853 0
 	strb	w7, [x4, -3]
-.LBB1284:
-.LBB1285:
+.LBB1296:
+.LBB1297:
 	.loc 1 130 0
 	ubfiz	w7, w2, 8, 8
 	.loc 1 131 0
 	and	w2, w2, 65280
-.LBE1285:
-.LBE1284:
-.LBB1289:
-.LBB1276:
+.LBE1297:
+.LBE1296:
+.LBB1301:
+.LBB1288:
 	ldrb	w8, [x3, w6, sxtw]
-.LBE1276:
-.LBE1289:
-.LBB1290:
-.LBB1286:
+.LBE1288:
+.LBE1301:
+.LBB1302:
+.LBB1298:
 	.loc 1 130 0
 	add	w6, w7, w1, uxtb
-.LBE1286:
-.LBE1290:
-.LBB1291:
-.LBB1277:
+.LBE1298:
+.LBE1302:
+.LBB1303:
+.LBB1289:
 	ldrb	w17, [x3, w17, sxtw]
-.LBE1277:
-.LBE1291:
-.LBB1292:
-.LBB1287:
+.LBE1289:
+.LBE1303:
+.LBB1304:
+.LBB1299:
 	.loc 1 131 0
 	add	w1, w2, w1, lsr 8
-.LBE1287:
-.LBE1292:
-.LBB1293:
-.LBB1278:
+.LBE1299:
+.LBE1304:
+.LBB1305:
+.LBB1290:
 	.loc 1 130 0
 	orr	w2, w17, w8, lsl 4
-.LBE1278:
-.LBE1293:
+.LBE1290:
+.LBE1305:
 	.loc 1 854 0
 	strb	w2, [x4, -2]
-.LBB1294:
-.LBB1288:
+.LBB1306:
+.LBB1300:
 	.loc 1 131 0
 	ldrb	w1, [x3, w1, sxtw]
 	.loc 1 130 0
 	ldrb	w2, [x3, w6, sxtw]
 	orr	w1, w2, w1, lsl 4
-.LBE1288:
-.LBE1294:
+.LBE1300:
+.LBE1306:
 	.loc 1 855 0
 	strb	w1, [x4, -1]
 	.loc 1 848 0
@@ -4517,9 +4517,9 @@ direct_mode_data_change:
 	cmp	w15, w12
 	bne	.L425
 .L388:
-.LBE1295:
-.LBE1297:
-.LBE1299:
+.LBE1307:
+.LBE1309:
+.LBE1311:
 	.loc 1 905 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -4528,9 +4528,9 @@ direct_mode_data_change:
 	ret
 .LVL387:
 .L413:
-.LBB1300:
-.LBB1298:
-.LBB1296:
+.LBB1312:
+.LBB1310:
+.LBB1308:
 	.loc 1 846 0
 	mul	w4, w12, w5
 .LVL388:
@@ -4569,9 +4569,9 @@ direct_mode_data_change:
 	.p2align 3
 .L410:
 	ret
-.LBE1296:
-.LBE1298:
-.LBE1300:
+.LBE1308:
+.LBE1310:
+.LBE1312:
 	.cfi_endproc
 .LFE2815:
 	.size	direct_mode_data_change, .-direct_mode_data_change
@@ -4587,14 +4587,14 @@ direct_mode_data_change_part:
 	.cfi_def_cfa_offset 80
 	.cfi_offset 29, -80
 	.cfi_offset 30, -72
-.LBB1319:
-.LBB1320:
-.LBB1321:
+.LBB1331:
+.LBB1332:
+.LBB1333:
 	.loc 1 953 0
 	adrp	x5, .LANCHOR0
-.LBE1321:
-.LBE1320:
-.LBE1319:
+.LBE1333:
+.LBE1332:
+.LBE1331:
 	.loc 1 994 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -4613,8 +4613,8 @@ direct_mode_data_change_part:
 	ldr	w16, [x3, 72]
 .LVL396:
 	cbnz	w16, .L531
-.LBB1334:
-.LBB1335:
+.LBB1346:
+.LBB1347:
 	.loc 1 912 0
 	ldr	x18, [x5, #:lo12:.LANCHOR0]
 	.loc 1 917 0
@@ -4649,14 +4649,14 @@ direct_mode_data_change_part:
 	.loc 1 927 0
 	ble	.L427
 	sub	w17, w9, #1
-.LBB1336:
-.LBB1337:
+.LBB1348:
+.LBB1349:
 	.loc 1 136 0
 	mov	w15, 3
 	add	x17, x17, 1
 	lsl	x17, x17, 2
-.LBE1337:
-.LBE1336:
+.LBE1349:
+.LBE1348:
 	.loc 1 928 0
 	cbz	w19, .L457
 .LVL403:
@@ -4681,75 +4681,75 @@ direct_mode_data_change_part:
 .L472:
 	.loc 1 935 0
 	ldr	w6, [x2, x10, lsl 2]
-.LBB1343:
-.LBB1344:
+.LBB1355:
+.LBB1356:
 	.loc 1 140 0
 	mov	w4, 0
-.LBE1344:
-.LBE1343:
+.LBE1356:
+.LBE1355:
 	.loc 1 934 0
 	ldr	w7, [x1, x10, lsl 2]
-.LBB1349:
-.LBB1338:
+.LBB1361:
+.LBB1350:
 	.loc 1 140 0
 	mov	w5, 0
-.LBE1338:
-.LBE1349:
+.LBE1350:
+.LBE1361:
 	.loc 1 937 0
 	and	w20, w6, 65535
 	and	w12, w7, 65535
-.LBB1350:
-.LBB1345:
+.LBB1362:
+.LBB1357:
 	.loc 1 151 0
 	and	w3, w20, 65280
 	add	w8, w3, w12, lsr 8
-.LBE1345:
-.LBE1350:
+.LBE1357:
+.LBE1362:
 	.loc 1 938 0
 	lsr	w3, w6, 16
+.LBB1363:
 .LBB1351:
-.LBB1339:
 	.loc 1 150 0
 	ubfiz	w23, w3, 8, 8
-.LBE1339:
 .LBE1351:
+.LBE1363:
 	.loc 1 938 0
 	and	w3, w3, 65535
 	lsr	w11, w7, 16
-.LBB1352:
-.LBB1346:
+.LBB1364:
+.LBB1358:
 	.loc 1 150 0
 	ubfiz	w24, w6, 8, 8
-.LBE1346:
-.LBE1352:
-.LBB1353:
-.LBB1340:
+.LBE1358:
+.LBE1364:
+.LBB1365:
+.LBB1352:
 	.loc 1 151 0
 	and	w21, w3, 65280
-.LBE1340:
-.LBE1353:
-.LBB1354:
-.LBB1347:
+.LBE1352:
+.LBE1365:
+.LBB1366:
+.LBB1359:
 	.loc 1 137 0
 	eor	w25, w20, w12
 	.loc 1 150 0
 	add	w24, w24, w12, uxtb
-.LBE1347:
-.LBE1354:
-.LBB1355:
-.LBB1341:
+.LBE1359:
+.LBE1366:
+.LBB1367:
+.LBB1353:
 	add	w23, w23, w11, uxtb
 	.loc 1 137 0
 	eor	w22, w3, w11
 	.loc 1 151 0
 	add	w21, w21, w11, lsr 8
-.LBE1341:
-.LBE1355:
+.LBE1353:
+.LBE1367:
 	.loc 1 936 0
 	cmp	w7, w6
 	beq	.L460
-.LBB1356:
-.LBB1348:
+.LBB1368:
+.LBB1360:
 	.loc 1 139 0
 	cmp	w20, w12
 	beq	.L461
@@ -4782,12 +4782,12 @@ direct_mode_data_change_part:
 	and	w4, w6, w4
 	and	w4, w4, 255
 .L461:
-.LBE1348:
-.LBE1356:
+.LBE1360:
+.LBE1368:
 	.loc 1 937 0
 	strb	w4, [x13, -2]
-.LBB1357:
-.LBB1342:
+.LBB1369:
+.LBB1354:
 	.loc 1 139 0
 	cmp	w3, w11
 	beq	.L466
@@ -4820,8 +4820,8 @@ direct_mode_data_change_part:
 	and	w3, w5, w3
 	and	w5, w3, 255
 .L466:
-.LBE1342:
-.LBE1357:
+.LBE1354:
+.LBE1369:
 	.loc 1 938 0
 	strb	w5, [x13, -1]
 .L471:
@@ -4858,8 +4858,8 @@ direct_mode_data_change_part:
 .LVL411:
 	.p2align 3
 .L427:
-.LBE1335:
-.LBE1334:
+.LBE1347:
+.LBE1346:
 	.loc 1 999 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
@@ -4884,9 +4884,9 @@ direct_mode_data_change_part:
 .LVL415:
 .L531:
 	.cfi_restore_state
-.LBB1358:
-.LBB1333:
-.LBB1332:
+.LBB1370:
+.LBB1345:
+.LBB1344:
 	.loc 1 953 0
 	ldr	x14, [x5, #:lo12:.LANCHOR0]
 	.loc 1 958 0
@@ -4930,12 +4930,12 @@ direct_mode_data_change_part:
 	lsl	x13, x13, 3
 	mov	w12, 0
 .LVL425:
-.LBB1322:
-.LBB1323:
+.LBB1334:
+.LBB1335:
 	.loc 1 136 0
 	mov	w10, 3
-.LBE1323:
-.LBE1322:
+.LBE1335:
+.LBE1334:
 	.loc 1 969 0
 	cbz	w16, .L431
 .LVL426:
@@ -4971,8 +4971,8 @@ direct_mode_data_change_part:
 	and	w17, w2, 65535
 	and	w6, w1, 65535
 .LVL432:
-.LBB1325:
-.LBB1326:
+.LBB1337:
+.LBB1338:
 	.loc 1 140 0
 	mov	w4, 0
 	.loc 1 139 0
@@ -5020,15 +5020,15 @@ direct_mode_data_change_part:
 	and	w4, w4, 255
 .LVL434:
 .L435:
-.LBE1326:
-.LBE1325:
+.LBE1338:
+.LBE1337:
 	.loc 1 978 0
 	strb	w4, [x3, -4]
 	.loc 1 979 0
 	lsr	w17, w2, 16
 	lsr	w6, w1, 16
-.LBB1327:
-.LBB1328:
+.LBB1339:
+.LBB1340:
 	.loc 1 140 0
 	mov	w4, 0
 	.loc 1 139 0
@@ -5076,15 +5076,15 @@ direct_mode_data_change_part:
 	and	w4, w4, 255
 .LVL436:
 .L440:
-.LBE1328:
-.LBE1327:
+.LBE1340:
+.LBE1339:
 	.loc 1 979 0
 	strb	w4, [x3, -3]
 	.loc 1 980 0
 	ubfx	x17, x2, 32, 16
 	ubfx	x6, x1, 32, 16
-.LBB1329:
-.LBB1330:
+.LBB1341:
+.LBB1342:
 	.loc 1 140 0
 	mov	w4, 0
 	.loc 1 139 0
@@ -5132,8 +5132,8 @@ direct_mode_data_change_part:
 	and	w4, w4, 255
 .LVL438:
 .L445:
-.LBE1330:
-.LBE1329:
+.LBE1342:
+.LBE1341:
 	.loc 1 980 0
 	strb	w4, [x3, -2]
 	.loc 1 981 0
@@ -5141,8 +5141,8 @@ direct_mode_data_change_part:
 .LVL439:
 	lsr	x1, x1, 48
 .LVL440:
-.LBB1331:
-.LBB1324:
+.LBB1343:
+.LBB1336:
 	.loc 1 140 0
 	mov	w4, 0
 	.loc 1 139 0
@@ -5191,8 +5191,8 @@ direct_mode_data_change_part:
 	and	w4, w2, 255
 .LVL443:
 .L450:
-.LBE1324:
-.LBE1331:
+.LBE1336:
+.LBE1343:
 	.loc 1 981 0
 	strb	w4, [x3, -1]
 .LVL444:
@@ -5227,9 +5227,9 @@ direct_mode_data_change_part:
 	.loc 1 984 0
 	str	wzr, [x3, -4]
 	b	.L455
-.LBE1332:
-.LBE1333:
-.LBE1358:
+.LBE1344:
+.LBE1345:
+.LBE1370:
 	.cfi_endproc
 .LFE2818:
 	.size	direct_mode_data_change_part, .-direct_mode_data_change_part
@@ -5260,10 +5260,10 @@ flip.isra.7:
 	.loc 1 1005 0
 	ldr	x0, [x0]
 .LVL450:
-.LBB1359:
-.LBB1360:
-.LBB1361:
-.LBB1362:
+.LBB1371:
+.LBB1372:
+.LBB1373:
+.LBB1374:
 	.file 10 "./include/linux/dma-mapping.h"
 	.loc 10 266 0
 	cbz	x0, .L537
@@ -5274,37 +5274,37 @@ flip.isra.7:
 	cmp	x3, 0
 	csel	x3, x4, x3, eq
 .L535:
-.LBE1362:
-.LBE1361:
+.LBE1374:
+.LBE1373:
 	.loc 10 434 0
 	ldr	x5, [x3, 88]
 	sxtw	x19, w19
 	cbz	x5, .L536
-.LBE1360:
-.LBE1359:
+.LBE1372:
+.LBE1371:
 	.loc 1 1005 0
 	add	x4, x19, x19, lsl 1
-.LBB1368:
-.LBB1365:
+.LBB1380:
+.LBB1377:
 	.loc 10 435 0
 	mov	w3, 1
-.LBE1365:
-.LBE1368:
+.LBE1377:
+.LBE1380:
 	.loc 1 1005 0
 	add	x4, x20, x4, lsl 3
-.LBB1369:
-.LBB1366:
+.LBB1381:
+.LBB1378:
 	.loc 10 435 0
 	ldr	x1, [x4, 32]
 	blr	x5
 .LVL451:
 .L536:
-.LBE1366:
-.LBE1369:
+.LBE1378:
+.LBE1381:
 	.loc 1 1006 0
 	ldr	x5, [x20, 8]
-.LBB1370:
-.LBB1371:
+.LBB1382:
+.LBB1383:
 	.file 11 "drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.h"
 	.loc 11 57 0
 	mov	w4, 0
@@ -5312,29 +5312,29 @@ flip.isra.7:
 	mov	w2, 0
 	mov	x0, x5
 	mov	w1, 0
-.LBE1371:
-.LBE1370:
+.LBE1383:
+.LBE1382:
 	.loc 1 1007 0
 	add	x19, x19, x19, lsl 1
-.LBB1374:
-.LBB1372:
+.LBB1386:
+.LBB1384:
 	.loc 11 57 0
 	ldr	x5, [x5, 64]
-.LBE1372:
-.LBE1374:
+.LBE1384:
+.LBE1386:
 	.loc 1 1007 0
 	add	x19, x20, x19, lsl 3
-.LBB1375:
-.LBB1373:
+.LBB1387:
+.LBB1385:
 	.loc 11 57 0
 	blr	x5
 .LVL452:
-.LBE1373:
-.LBE1375:
+.LBE1385:
+.LBE1387:
 	.loc 1 1007 0
 	ldr	x1, [x20, 8]
-.LBB1376:
-.LBB1377:
+.LBB1388:
+.LBB1389:
 	.loc 11 62 0
 	mov	w2, 0
 	mov	x0, x1
@@ -5342,20 +5342,20 @@ flip.isra.7:
 	ldr	w1, [x19, 32]
 	blr	x3
 .LVL453:
-.LBE1377:
-.LBE1376:
+.LBE1389:
+.LBE1388:
 	.loc 1 1008 0
 	ldr	x2, [x20, 8]
-.LBB1378:
-.LBB1379:
+.LBB1390:
+.LBB1391:
 	.loc 11 77 0
 	mov	w1, 1
 	mov	x0, x2
 	ldr	x2, [x2, 96]
 	blr	x2
 .LVL454:
-.LBE1379:
-.LBE1378:
+.LBE1391:
+.LBE1390:
 	.loc 1 1009 0
 	ldr	w1, [x20, 72]
 	mov	w0, 1
@@ -5376,18 +5376,18 @@ flip.isra.7:
 	.p2align 3
 .L537:
 	.cfi_restore_state
-.LBB1380:
-.LBB1367:
-.LBB1364:
-.LBB1363:
+.LBB1392:
+.LBB1379:
+.LBB1376:
+.LBB1375:
 	.loc 10 268 0
 	adrp	x3, dummy_dma_ops
 	add	x3, x3, :lo12:dummy_dma_ops
 	b	.L535
-.LBE1363:
-.LBE1364:
-.LBE1367:
-.LBE1380:
+.LBE1375:
+.LBE1376:
+.LBE1379:
+.LBE1392:
 	.cfi_endproc
 .LFE2861:
 	.size	flip.isra.7, .-flip.isra.7
@@ -5440,8 +5440,8 @@ ebc_frame_start:
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change_part
 .LVL459:
-.LBB1381:
-.LBB1382:
+.LBB1393:
+.LBB1394:
 	.loc 1 1014 0
 	str	wzr, [x21, 72]
 	.loc 1 1015 0
@@ -5449,8 +5449,8 @@ ebc_frame_start:
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
 .LVL460:
-.LBE1382:
-.LBE1381:
+.LBE1394:
+.LBE1393:
 	.loc 1 1076 0
 	ldr	w0, [x19, 40]
 	.loc 1 1077 0
@@ -5495,8 +5495,8 @@ ebc_frame_start:
 	.loc 1 1048 0
 	ldr	w0, [x19, 36]
 	cbz	w0, .L550
-.LBB1383:
-.LBB1384:
+.LBB1395:
+.LBB1396:
 	.loc 1 1014 0
 	str	wzr, [x21, 72]
 	.loc 1 1015 0
@@ -5504,8 +5504,8 @@ ebc_frame_start:
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
 .LVL465:
-.LBE1384:
-.LBE1383:
+.LBE1396:
+.LBE1395:
 	.loc 1 1050 0
 	ldp	x1, x2, [x19, 128]
 	mov	x4, x19
@@ -5540,8 +5540,8 @@ ebc_frame_start:
 	.loc 1 1030 0
 	ldr	w0, [x19, 36]
 	cbz	w0, .L548
-.LBB1385:
-.LBB1386:
+.LBB1397:
+.LBB1398:
 	.loc 1 1014 0
 	str	wzr, [x21, 72]
 	.loc 1 1015 0
@@ -5549,8 +5549,8 @@ ebc_frame_start:
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
 .LVL470:
-.LBE1386:
-.LBE1385:
+.LBE1398:
+.LBE1397:
 	.loc 1 1032 0
 	ldp	x1, x2, [x19, 128]
 	mov	x4, x19
@@ -5588,8 +5588,8 @@ ebc_frame_start:
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change
 .LVL474:
-.LBB1387:
-.LBB1388:
+.LBB1399:
+.LBB1400:
 	.loc 1 1014 0
 	str	wzr, [x21, 72]
 	.loc 1 1015 0
@@ -5597,8 +5597,8 @@ ebc_frame_start:
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
 .LVL475:
-.LBE1388:
-.LBE1387:
+.LBE1400:
+.LBE1399:
 	.loc 1 1089 0
 	ldr	w0, [x19, 40]
 	.loc 1 1090 0
@@ -5721,15 +5721,15 @@ ebc_auto_tast_function:
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
-.LBB1389:
-.LBB1390:
-.LBB1391:
+.LBB1401:
+.LBB1402:
+.LBB1403:
 	.file 12 "./include/linux/compiler.h"
 	.loc 12 288 0
 	mov	x24, 2
-.LBE1391:
-.LBE1390:
-.LBE1389:
+.LBE1403:
+.LBE1402:
+.LBE1401:
 	.loc 1 1101 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -32
@@ -5744,9 +5744,9 @@ ebc_auto_tast_function:
 	str	x1, [x29, 88]
 	mov	x1,0
 	adrp	x25, system_wq
-.LBB1396:
-.LBB1393:
-.LBB1394:
+.LBB1408:
+.LBB1405:
+.LBB1406:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -5757,9 +5757,9 @@ ebc_auto_tast_function:
 	b	.L565
 	.p2align 3
 .L582:
-.LBE1394:
-.LBE1393:
-.LBE1396:
+.LBE1406:
+.LBE1405:
+.LBE1408:
 	.loc 1 1112 0
 	cbnz	w0, .L555
 	.loc 1 1122 0
@@ -5798,14 +5798,14 @@ ebc_auto_tast_function:
 	mov	x0, x20
 	bl	down
 .LVL492:
-.LBB1397:
-.LBB1395:
-.LBB1392:
+.LBB1409:
+.LBB1407:
+.LBB1404:
 	.loc 12 288 0
 	str	x24, [x23, 32]
-.LBE1392:
-.LBE1395:
-.LBE1397:
+.LBE1404:
+.LBE1407:
+.LBE1409:
 	.loc 1 1111 0
 #APP
 // 1111 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
@@ -5853,10 +5853,10 @@ ebc_auto_tast_function:
 	cbnz	w0, .L583
 	.p2align 2
 .L563:
-.LBB1398:
-.LBB1399:
-.LBB1400:
-.LBB1401:
+.LBB1410:
+.LBB1411:
+.LBB1412:
+.LBB1413:
 	.file 13 "./include/linux/workqueue.h"
 	.loc 13 518 0
 	ldr	x1, [x25, #:lo12:system_wq]
@@ -5867,10 +5867,10 @@ ebc_auto_tast_function:
 	b	.L564
 	.p2align 3
 .L555:
-.LBE1401:
-.LBE1400:
-.LBE1399:
-.LBE1398:
+.LBE1413:
+.LBE1412:
+.LBE1411:
+.LBE1410:
 	.loc 1 1149 0
 	ldr	w1, [x19, 40]
 	.loc 1 1150 0
@@ -5925,10 +5925,10 @@ ebc_auto_tast_function:
 	.loc 1 1162 0 is_stmt 0 discriminator 2
 	ldr	w0, [x19, 608]
 	cbz	w0, .L564
-.LBB1405:
-.LBB1404:
-.LBB1403:
-.LBB1402:
+.LBB1417:
+.LBB1416:
+.LBB1415:
+.LBB1414:
 	.loc 13 518 0 is_stmt 1
 	ldr	x1, [x25, #:lo12:system_wq]
 	mov	x2, x26
@@ -5936,10 +5936,10 @@ ebc_auto_tast_function:
 	bl	queue_work_on
 .LVL500:
 	b	.L564
-.LBE1402:
-.LBE1403:
-.LBE1404:
-.LBE1405:
+.LBE1414:
+.LBE1415:
+.LBE1416:
+.LBE1417:
 	.cfi_endproc
 .LFE2822:
 	.size	ebc_auto_tast_function, .-ebc_auto_tast_function
@@ -5967,28 +5967,28 @@ ebc_power_set.part.8:
 	.loc 1 198 0
 	ldr	x1, [x0, 8]
 .LVL502:
-.LBB1406:
-.LBB1407:
+.LBB1418:
+.LBB1419:
 	.loc 11 51 0
 	mov	x0, x1
 .LVL503:
 	ldr	x1, [x1, 56]
 	blr	x1
 .LVL504:
-.LBE1407:
-.LBE1406:
+.LBE1419:
+.LBE1418:
 	.loc 1 199 0
 	ldr	x2, [x19, 16]
-.LBB1408:
-.LBB1409:
+.LBB1420:
+.LBB1421:
 	.loc 3 35 0
 	mov	w1, 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
 .LVL505:
-.LBE1409:
-.LBE1408:
+.LBE1421:
+.LBE1420:
 	.loc 1 200 0
 	ldr	w0, [x19, 608]
 	cbnz	w0, .L590
@@ -6015,14 +6015,14 @@ ebc_power_set.part.8:
 	.cfi_restore_state
 	.loc 1 201 0
 	str	wzr, [x19, 608]
-.LBB1410:
-.LBB1411:
+.LBB1422:
+.LBB1423:
 	.loc 4 68 0
 	add	x0, x19, 400
 	bl	__pm_relax
 .LVL509:
-.LBE1411:
-.LBE1410:
+.LBE1423:
+.LBE1422:
 	.loc 1 204 0
 	ldr	x0, [x19]
 	adrp	x1, .LC22
@@ -6047,7 +6047,7 @@ ebc_power_set.part.8:
 	.type	ebc_suspend, %function
 ebc_suspend:
 .LFB2850:
-	.loc 1 2444 0
+	.loc 1 2470 0
 	.cfi_startproc
 .LVL512:
 	stp	x29, x30, [sp, -32]!
@@ -6059,40 +6059,40 @@ ebc_suspend:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-.LBB1412:
-.LBB1413:
+.LBB1424:
+.LBB1425:
 	.loc 2 1181 0
 	ldr	x20, [x0, 184]
-.LBE1413:
-.LBE1412:
-	.loc 1 2448 0
+.LBE1425:
+.LBE1424:
+	.loc 1 2474 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 184]
 .LVL513:
 	cmp	w0, 1
 	beq	.L594
 .L592:
-	.loc 1 2452 0
+	.loc 1 2478 0
 	mov	w0, 1
 	str	w0, [x19, 596]
-	.loc 1 2454 0
+	.loc 1 2480 0
 	ldr	x1, [x20, 16]
-.LBB1414:
-.LBB1415:
+.LBB1426:
+.LBB1427:
 	.loc 3 40 0
 	mov	x0, x1
 	ldr	x1, [x1, 40]
 	blr	x1
 .LVL514:
-.LBE1415:
-.LBE1414:
-	.loc 1 2455 0
+.LBE1427:
+.LBE1426:
+	.loc 1 2481 0
 	ldr	x0, [x19, 88]
 	adrp	x1, .LC24
 	add	x1, x1, :lo12:.LC24
 	bl	_dev_info
 .LVL515:
-	.loc 1 2458 0
+	.loc 1 2484 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -6106,7 +6106,7 @@ ebc_suspend:
 	.p2align 3
 .L594:
 	.cfi_restore_state
-	.loc 1 2449 0
+	.loc 1 2475 0
 	ldr	x0, [x19, 88]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
@@ -6115,15 +6115,15 @@ ebc_suspend:
 	add	x1, x1, :lo12:.LC23
 	bl	_dev_info
 .LVL516:
-.LBB1416:
-.LBB1417:
+.LBB1428:
+.LBB1429:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
 .LVL517:
 	b	.L592
-.LBE1417:
-.LBE1416:
+.LBE1429:
+.LBE1428:
 	.cfi_endproc
 .LFE2850:
 	.size	ebc_suspend, .-ebc_suspend
@@ -6132,1052 +6132,1025 @@ ebc_suspend:
 	.type	ebc_probe, %function
 ebc_probe:
 .LFB2848:
-	.loc 1 2328 0
+	.loc 1 2334 0
 	.cfi_startproc
 .LVL518:
 	stp	x29, x30, [sp, -208]!
 	.cfi_def_cfa_offset 208
 	.cfi_offset 29, -208
 	.cfi_offset 30, -200
-.LBB1563:
-.LBB1564:
+.LBB1580:
+.LBB1581:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
-.LBE1564:
-.LBE1563:
-	.loc 1 2328 0
+.LBE1581:
+.LBE1580:
+	.loc 1 2334 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	stp	x19, x20, [sp, 16]
-	.cfi_offset 19, -192
-	.cfi_offset 20, -184
-	.loc 1 2329 0
-	add	x20, x0, 16
-	.loc 1 2328 0
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 21, -176
+	.cfi_offset 22, -168
+	.loc 1 2335 0
+	add	x22, x0, 16
+	.loc 1 2334 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -160
 	.cfi_offset 24, -152
 	adrp	x23, __stack_chk_guard
-	stp	x21, x22, [sp, 32]
+	stp	x19, x20, [sp, 16]
 	add	x0, x23, :lo12:__stack_chk_guard
 .LVL519:
 	stp	x25, x26, [sp, 64]
 	stp	x27, x28, [sp, 80]
-	.cfi_offset 21, -176
-	.cfi_offset 22, -168
+	.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 2328 0
+	.loc 1 2334 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
-.LBB1566:
-.LBB1565:
+.LBB1583:
+.LBB1582:
 	.loc 2 711 0
-	mov	x0, x20
+	mov	x0, x22
 	mov	x1, 800
 	bl	devm_kmalloc
 .LVL520:
-.LBE1565:
-.LBE1566:
-	.loc 1 2340 0
-	cbz	x0, .L640
-	.loc 1 2344 0
-	adrp	x25, .LANCHOR0
-	mov	x19, x0
-	.loc 1 2346 0
+.LBE1582:
+.LBE1583:
+	.loc 1 2350 0
+	cbz	x0, .L645
+	.loc 1 2354 0
+	adrp	x24, .LANCHOR0
+	mov	x20, x0
+	.loc 1 2356 0
 	adrp	x1, .LC25
 	mov	w2, 0
-	.loc 1 2344 0
-	str	x0, [x25, #:lo12:.LANCHOR0]
-	.loc 1 2346 0
+	.loc 1 2354 0
+	str	x0, [x24, #:lo12:.LANCHOR0]
+	.loc 1 2356 0
 	add	x1, x1, :lo12:.LC25
-	ldr	x0, [x20, 752]
-	.loc 1 2343 0
-	str	x20, [x19]
-	.loc 1 2346 0
+	ldr	x0, [x22, 752]
+	.loc 1 2353 0
+	str	x22, [x20]
+	.loc 1 2356 0
 	bl	of_parse_phandle
 .LVL521:
-	.loc 1 2347 0
-	cbz	x0, .L680
-	.loc 1 2352 0
+	.loc 1 2357 0
+	cbz	x0, .L690
+	.loc 1 2362 0
 	bl	of_find_device_by_node
 .LVL522:
-	.loc 1 2354 0
+	.loc 1 2364 0
 	cbz	x0, .L599
-.LBB1567:
-.LBB1568:
-.LBB1569:
+.LBB1584:
+.LBB1585:
+.LBB1586:
 	.loc 2 1181 0
 	ldr	x0, [x0, 200]
 .LVL523:
-.LBE1569:
-.LBE1568:
-.LBE1567:
-	.loc 1 2357 0
-	str	x0, [x19, 8]
-	.loc 1 2358 0
+.LBE1586:
+.LBE1585:
+.LBE1584:
+	.loc 1 2367 0
+	str	x0, [x20, 8]
+	.loc 1 2368 0
 	cbz	x0, .L599
-	.loc 1 2360 0
+	.loc 1 2370 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 2362 0
-	mov	w2, 0
+	.loc 1 2372 0
+	add	x2, x29, 96
 	adrp	x1, .LC27
 	add	x1, x1, :lo12:.LC27
-	ldr	x0, [x20, 752]
-	bl	of_parse_phandle
+	ldr	x0, [x22, 752]
+	bl	of_get_property
 .LVL524:
-	.loc 1 2363 0
-	cbz	x0, .L681
-	.loc 1 2368 0
-	bl	of_find_i2c_device_by_node
+	mov	x21, x0
 .LVL525:
-	.loc 1 2370 0
-	cbz	x0, .L682
-.LBB1570:
-.LBB1571:
-.LBB1572:
-	.loc 2 1181 0
-	ldr	x0, [x0, 216]
+	.loc 1 2373 0
+	ldrsw	x0, [x29, 96]
 .LVL526:
-.LBE1572:
-.LBE1571:
-.LBE1570:
-	.loc 1 2374 0
-	str	x0, [x19, 16]
-	.loc 1 2375 0
-	cbz	x0, .L683
-	.loc 1 2381 0
-	add	x21, x19, 184
+	lsr	x0, x0, 2
 .LVL527:
-	.loc 1 2383 0
-	add	x22, x19, 24
-	.loc 1 2381 0
-	str	x20, [x21, 88]
-.LBB1573:
-.LBB1574:
-.LBB1575:
-.LBB1576:
-.LBB1577:
-	.file 14 "./include/linux/of.h"
-	.loc 14 499 0
-	adrp	x1, .LC31
-.LBE1577:
-.LBE1576:
-.LBE1575:
-.LBE1574:
-.LBE1573:
-	.loc 1 2383 0
-	str	x20, [x19, 24]
-.LBB1672:
-.LBB1668:
-.LBB1584:
-.LBB1581:
-.LBB1578:
-	.loc 14 499 0
-	mov	x4, 0
-.LBE1578:
-.LBE1581:
-.LBE1584:
-.LBE1668:
-.LBE1672:
-	.loc 1 2384 0
-	ldr	x2, [x19, 8]
-.LBB1673:
-.LBB1669:
-.LBB1585:
-.LBB1582:
-.LBB1579:
-	.loc 14 499 0
-	add	x1, x1, :lo12:.LC31
-.LBE1579:
-.LBE1582:
-.LBE1585:
-.LBE1669:
-.LBE1673:
-	.loc 1 2385 0
-	stp	x2, x0, [x22, 8]
-.LBB1674:
-.LBB1670:
-.LBB1586:
-.LBB1583:
-.LBB1580:
-	.loc 14 499 0
-	mov	x3, 1
-	ldr	x0, [x20, 752]
-	add	x2, x19, 100
-	bl	of_property_read_variable_u32_array
+	str	w0, [x29, 96]
 .LVL528:
-	.loc 14 501 0
-	tbnz	w0, #31, .L604
-.LBE1580:
-.LBE1583:
-.LBE1586:
+	.loc 1 2374 0
+	cmp	w0, 0
+	beq	.L600
+	.loc 1 2379 0 discriminator 1
+	mov	w19, 0
+.LVL529:
+	bgt	.L674
+	b	.L602
+	.p2align 3
+.L603:
+	.loc 1 2387 0
+	bl	of_find_i2c_device_by_node
+.LVL530:
+	.loc 1 2389 0
+	cbz	x0, .L691
 .LBB1587:
 .LBB1588:
 .LBB1589:
-	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC55
-	mov	x4, 0
-	mov	x3, 1
-	add	x2, x19, 104
-	add	x1, x1, :lo12:.LC55
-	bl	of_property_read_variable_u32_array
-.LVL529:
-	.loc 14 501 0
-	tbnz	w0, #31, .L604
+	.loc 2 1181 0
+	ldr	x0, [x0, 216]
+.LVL531:
 .LBE1589:
 .LBE1588:
 .LBE1587:
+	.loc 1 2394 0
+	str	x0, [x20, 16]
+	.loc 1 2395 0
+	cbnz	x0, .L692
+	.loc 1 2379 0 discriminator 2
+	ldr	w0, [x29, 96]
+	add	w19, w19, 1
+.LVL532:
+	cmp	w0, w19
+	ble	.L607
+.L674:
+	ldr	w0, [x21], 4
+	.loc 1 2381 0
+	rev	w0, w0
+	bl	of_find_node_by_phandle
+.LVL533:
+	.loc 1 2382 0
+	cbnz	x0, .L603
+	.loc 1 2383 0
+	adrp	x1, .LC29
+	mov	x0, x22
+	add	x1, x1, :lo12:.LC29
+	.loc 1 2384 0
+	mov	w25, -19
+	.loc 1 2383 0
+	bl	_dev_err
+.LVL534:
+	.p2align 2
+.L595:
+	.loc 1 2460 0
+	add	x23, x23, :lo12:__stack_chk_guard
+	mov	w0, w25
+.LVL535:
+	ldr	x2, [x29, 200]
+	ldr	x1, [x23]
+	eor	x1, x2, x1
+	cbnz	x1, .L693
+	ldp	x19, x20, [sp, 16]
+.LVL536:
+	ldp	x21, x22, [sp, 32]
+.LVL537:
+	ldp	x23, x24, [sp, 48]
+.LVL538:
+	ldp	x25, x26, [sp, 64]
+.LVL539:
+	ldp	x27, x28, [sp, 80]
+.LVL540:
+	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
+.LVL541:
+	.p2align 3
+.L692:
+	.cfi_restore_state
+	.loc 1 2396 0
+	adrp	x1, .LC31
+	mov	w2, w19
+	add	x1, x1, :lo12:.LC31
+	mov	x0, x22
+	bl	_dev_info
+.LVL542:
+.L602:
+	.loc 1 2401 0
+	ldr	x0, [x20, 16]
+	cbz	x0, .L607
+	.loc 1 2407 0
+	add	x19, x20, 184
+.LVL543:
+	.loc 1 2409 0
+	add	x21, x20, 24
+.LVL544:
+	.loc 1 2407 0
+	str	x22, [x19, 88]
 .LBB1590:
 .LBB1591:
 .LBB1592:
+.LBB1593:
+.LBB1594:
+	.file 14 "./include/linux/of.h"
 	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC56
-	mov	x4, 0
-	mov	x3, 1
-	add	x2, x19, 108
-	add	x1, x1, :lo12:.LC56
-	bl	of_property_read_variable_u32_array
-.LVL530:
-	.loc 14 501 0
-	tbnz	w0, #31, .L604
+	adrp	x1, .LC33
+.LBE1594:
+.LBE1593:
 .LBE1592:
 .LBE1591:
 .LBE1590:
-.LBB1593:
-.LBB1594:
+	.loc 1 2409 0
+	str	x22, [x20, 24]
+.LBB1664:
+.LBB1661:
+.LBB1601:
+.LBB1598:
 .LBB1595:
 	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC57
 	mov	x4, 0
-	mov	x3, 1
-	add	x2, x19, 112
-	add	x1, x1, :lo12:.LC57
-	bl	of_property_read_variable_u32_array
-.LVL531:
-	.loc 14 501 0
-	tbnz	w0, #31, .L604
 .LBE1595:
-.LBE1594:
-.LBE1593:
+.LBE1598:
+.LBE1601:
+.LBE1661:
+.LBE1664:
+	.loc 1 2410 0
+	ldr	x2, [x20, 8]
+.LBB1665:
+.LBB1662:
+.LBB1602:
+.LBB1599:
 .LBB1596:
-.LBB1597:
-.LBB1598:
 	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC58
-	mov	x4, 0
-	mov	x3, 1
-	add	x2, x19, 128
-	add	x1, x1, :lo12:.LC58
-	bl	of_property_read_variable_u32_array
-.LVL532:
-	.loc 14 501 0
-	tbnz	w0, #31, .L604
-.LBE1598:
-.LBE1597:
+	add	x1, x1, :lo12:.LC33
 .LBE1596:
-.LBB1599:
+.LBE1599:
+.LBE1602:
+.LBE1662:
+.LBE1665:
+	.loc 1 2411 0
+	stp	x2, x0, [x21, 8]
+.LBB1666:
+.LBB1663:
+.LBB1603:
 .LBB1600:
-.LBB1601:
+.LBB1597:
 	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC59
-	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 132
-	add	x1, x1, :lo12:.LC59
+	ldr	x0, [x22, 752]
+	add	x2, x20, 100
 	bl	of_property_read_variable_u32_array
-.LVL533:
+.LVL545:
 	.loc 14 501 0
-	tbnz	w0, #31, .L604
-.LBE1601:
+	tbnz	w0, #31, .L609
+.LBE1597:
 .LBE1600:
-.LBE1599:
-.LBB1602:
-.LBB1603:
+.LBE1603:
 .LBB1604:
+.LBB1605:
+.LBB1606:
 	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC60
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC57
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 136
-	add	x1, x1, :lo12:.LC60
+	add	x2, x20, 104
+	add	x1, x1, :lo12:.LC57
 	bl	of_property_read_variable_u32_array
-.LVL534:
+.LVL546:
 	.loc 14 501 0
-	tbnz	w0, #31, .L604
+	tbnz	w0, #31, .L609
+.LBE1606:
+.LBE1605:
 .LBE1604:
-.LBE1603:
-.LBE1602:
-.LBB1605:
-.LBB1606:
 .LBB1607:
-	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC61
-	mov	x4, 0
-	mov	x3, 1
-	add	x2, x19, 140
-	add	x1, x1, :lo12:.LC61
-	bl	of_property_read_variable_u32_array
-.LVL535:
-	.loc 14 501 0
-	tbnz	w0, #31, .L604
-.LBE1607:
-.LBE1606:
-.LBE1605:
 .LBB1608:
 .LBB1609:
-.LBB1610:
 	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC62
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC58
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 144
-	add	x1, x1, :lo12:.LC62
+	add	x2, x20, 108
+	add	x1, x1, :lo12:.LC58
 	bl	of_property_read_variable_u32_array
-.LVL536:
+.LVL547:
 	.loc 14 501 0
-	tbnz	w0, #31, .L604
-.LBE1610:
+	tbnz	w0, #31, .L609
 .LBE1609:
 .LBE1608:
+.LBE1607:
+.LBB1610:
 .LBB1611:
 .LBB1612:
-.LBB1613:
 	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC63
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC59
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 148
-	add	x1, x1, :lo12:.LC63
+	add	x2, x20, 112
+	add	x1, x1, :lo12:.LC59
 	bl	of_property_read_variable_u32_array
-.LVL537:
+.LVL548:
 	.loc 14 501 0
-	tbnz	w0, #31, .L604
-.LBE1613:
+	tbnz	w0, #31, .L609
 .LBE1612:
 .LBE1611:
+.LBE1610:
+.LBB1613:
 .LBB1614:
 .LBB1615:
-.LBB1616:
 	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC64
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC60
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 152
-	add	x1, x1, :lo12:.LC64
+	add	x2, x20, 128
+	add	x1, x1, :lo12:.LC60
 	bl	of_property_read_variable_u32_array
-.LVL538:
+.LVL549:
 	.loc 14 501 0
-	tbnz	w0, #31, .L604
-.LBE1616:
+	tbnz	w0, #31, .L609
 .LBE1615:
 .LBE1614:
+.LBE1613:
+.LBB1616:
 .LBB1617:
 .LBB1618:
-.LBB1619:
 	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC65
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC61
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 156
-	add	x1, x1, :lo12:.LC65
+	add	x2, x20, 132
+	add	x1, x1, :lo12:.LC61
 	bl	of_property_read_variable_u32_array
-.LVL539:
+.LVL550:
 	.loc 14 501 0
-	tbnz	w0, #31, .L604
-.LBE1619:
+	tbnz	w0, #31, .L609
 .LBE1618:
 .LBE1617:
+.LBE1616:
+.LBB1619:
 .LBB1620:
 .LBB1621:
-.LBB1622:
 	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC66
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC62
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 160
-	add	x1, x1, :lo12:.LC66
+	add	x2, x20, 136
+	add	x1, x1, :lo12:.LC62
 	bl	of_property_read_variable_u32_array
-.LVL540:
+.LVL551:
 	.loc 14 501 0
-	tbnz	w0, #31, .L604
-.LBE1622:
+	tbnz	w0, #31, .L609
 .LBE1621:
 .LBE1620:
+.LBE1619:
+.LBB1622:
 .LBB1623:
 .LBB1624:
-.LBB1625:
 	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC67
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC63
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 164
-	add	x1, x1, :lo12:.LC67
+	add	x2, x20, 140
+	add	x1, x1, :lo12:.LC63
 	bl	of_property_read_variable_u32_array
-.LVL541:
+.LVL552:
 	.loc 14 501 0
-	tbnz	w0, #31, .L604
-.LBE1625:
+	tbnz	w0, #31, .L609
 .LBE1624:
 .LBE1623:
+.LBE1622:
+.LBB1625:
 .LBB1626:
 .LBB1627:
-.LBB1628:
 	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC68
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC64
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 168
-	add	x1, x1, :lo12:.LC68
+	add	x2, x20, 144
+	add	x1, x1, :lo12:.LC64
 	bl	of_property_read_variable_u32_array
-.LVL542:
+.LVL553:
 	.loc 14 501 0
-	tbnz	w0, #31, .L604
-.LBE1628:
+	tbnz	w0, #31, .L609
 .LBE1627:
 .LBE1626:
+.LBE1625:
+.LBB1628:
 .LBB1629:
 .LBB1630:
-.LBB1631:
 	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC69
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC65
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 172
-	add	x1, x1, :lo12:.LC69
+	add	x2, x20, 148
+	add	x1, x1, :lo12:.LC65
 	bl	of_property_read_variable_u32_array
-.LVL543:
+.LVL554:
 	.loc 14 501 0
-	tbnz	w0, #31, .L684
-.LBE1631:
+	tbnz	w0, #31, .L609
 .LBE1630:
 .LBE1629:
+.LBE1628:
+.LBB1631:
 .LBB1632:
 .LBB1633:
-.LBB1634:
 	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC32
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC66
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 176
-	add	x1, x1, :lo12:.LC32
+	add	x2, x20, 152
+	add	x1, x1, :lo12:.LC66
 	bl	of_property_read_variable_u32_array
-.LVL544:
+.LVL555:
 	.loc 14 501 0
-	tbnz	w0, #31, .L605
-.L631:
-.LBE1634:
+	tbnz	w0, #31, .L609
 .LBE1633:
 .LBE1632:
+.LBE1631:
+.LBB1634:
+.LBB1635:
+.LBB1636:
+	.loc 14 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC67
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 156
+	add	x1, x1, :lo12:.LC67
+	bl	of_property_read_variable_u32_array
+.LVL556:
+	.loc 14 501 0
+	tbnz	w0, #31, .L609
+.LBE1636:
+.LBE1635:
+.LBE1634:
+.LBB1637:
+.LBB1638:
 .LBB1639:
+	.loc 14 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC68
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 160
+	add	x1, x1, :lo12:.LC68
+	bl	of_property_read_variable_u32_array
+.LVL557:
+	.loc 14 501 0
+	tbnz	w0, #31, .L609
+.LBE1639:
+.LBE1638:
+.LBE1637:
 .LBB1640:
 .LBB1641:
+.LBB1642:
 	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC33
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC69
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 180
-	add	x1, x1, :lo12:.LC33
+	add	x2, x20, 164
+	add	x1, x1, :lo12:.LC69
 	bl	of_property_read_variable_u32_array
-.LVL545:
+.LVL558:
 	.loc 14 501 0
-	tbnz	w0, #31, .L606
-.L632:
+	tbnz	w0, #31, .L609
+.LBE1642:
 .LBE1641:
 .LBE1640:
-.LBE1639:
+.LBB1643:
+.LBB1644:
+.LBB1645:
+	.loc 14 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC70
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 168
+	add	x1, x1, :lo12:.LC70
+	bl	of_property_read_variable_u32_array
+.LVL559:
+	.loc 14 501 0
+	tbnz	w0, #31, .L609
+.LBE1645:
+.LBE1644:
+.LBE1643:
 .LBB1646:
 .LBB1647:
 .LBB1648:
 	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC34
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC71
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 116
-	add	x1, x1, :lo12:.LC34
+	add	x2, x20, 172
+	add	x1, x1, :lo12:.LC71
 	bl	of_property_read_variable_u32_array
-.LVL546:
+.LVL560:
 	.loc 14 501 0
-	tbnz	w0, #31, .L607
-.L633:
+	tbz	w0, #31, .L635
 .LBE1648:
 .LBE1647:
 .LBE1646:
+	.loc 1 1714 0
+	str	wzr, [x21, 148]
+.L635:
+.LBB1649:
+.LBB1650:
+.LBB1651:
+	.loc 14 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC34
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 176
+	add	x1, x1, :lo12:.LC34
+	bl	of_property_read_variable_u32_array
+.LVL561:
+	.loc 14 501 0
+	tbz	w0, #31, .L636
+.LBE1651:
+.LBE1650:
+.LBE1649:
+	.loc 1 1717 0
+	str	wzr, [x21, 152]
+.L636:
+.LBB1652:
 .LBB1653:
 .LBB1654:
-.LBB1655:
 	.loc 14 499 0
-	ldr	x0, [x20, 752]
+	ldr	x0, [x22, 752]
 	adrp	x1, .LC35
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 120
+	add	x2, x20, 180
 	add	x1, x1, :lo12:.LC35
 	bl	of_property_read_variable_u32_array
-.LVL547:
+.LVL562:
 	.loc 14 501 0
-	tbnz	w0, #31, .L608
-.L634:
-.LBE1655:
+	tbz	w0, #31, .L637
 .LBE1654:
 .LBE1653:
-.LBE1670:
-.LBE1674:
-	.loc 1 2393 0
-	ldr	w0, [x22, 88]
-.LBB1675:
-.LBB1676:
-	.loc 1 2130 0
+.LBE1652:
+	.loc 1 1720 0
+	str	wzr, [x21, 156]
+.L637:
+.LBB1655:
+.LBB1656:
+.LBB1657:
+	.loc 14 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC36
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 116
+	add	x1, x1, :lo12:.LC36
+	bl	of_property_read_variable_u32_array
+.LVL563:
+	.loc 14 501 0
+	tbz	w0, #31, .L638
+.LBE1657:
+.LBE1656:
+.LBE1655:
+	.loc 1 1723 0
+	str	wzr, [x21, 92]
+.L638:
+.LBB1658:
+.LBB1659:
+.LBB1660:
+	.loc 14 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC37
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 120
+	add	x1, x1, :lo12:.LC37
+	bl	of_property_read_variable_u32_array
+.LVL564:
+	.loc 14 501 0
+	tbz	w0, #31, .L639
+.LBE1660:
+.LBE1659:
+.LBE1658:
+	.loc 1 1726 0
+	str	wzr, [x21, 96]
+.L639:
+.LBE1663:
+.LBE1666:
+	.loc 1 2419 0
+	ldr	w0, [x21, 88]
+.LBB1667:
+.LBB1668:
+	.loc 1 2136 0
 	mov	w2, 0
-.LBE1676:
-.LBE1675:
-	.loc 1 2393 0
-	str	w0, [x21, 52]
-	.loc 1 2394 0
-	ldr	w1, [x22, 84]
-	str	w1, [x21, 56]
-	.loc 1 2397 0
+.LBE1668:
+.LBE1667:
+	.loc 1 2419 0
+	str	w0, [x19, 52]
+	.loc 1 2420 0
+	ldr	w1, [x21, 84]
+	str	w1, [x19, 56]
+	.loc 1 2423 0
 	tst	x1, 15
-	.loc 1 2395 0
+	.loc 1 2421 0
 	mul	w0, w0, w1
-	.loc 1 2397 0
+	.loc 1 2423 0
 	cset	w1, eq
-	str	w1, [x21, 72]
-.LBB1700:
-.LBB1695:
-	.loc 1 2130 0
-	adrp	x1, .LC36
-	add	x1, x1, :lo12:.LC36
-.LBE1695:
-.LBE1700:
-	.loc 1 2395 0
+	str	w1, [x19, 72]
+.LBB1692:
+.LBB1687:
+	.loc 1 2136 0
+	adrp	x1, .LC38
+	add	x1, x1, :lo12:.LC38
+.LBE1687:
+.LBE1692:
+	.loc 1 2421 0
 	lsr	w3, w0, 1
-	.loc 1 2396 0
+	.loc 1 2422 0
 	lsr	w0, w0, 2
-	stp	w3, w0, [x21, 20]
-.LBB1701:
-.LBB1696:
-	.loc 1 2121 0
-	ldr	x26, [x19]
-.LVL548:
-	.loc 1 2130 0
+	stp	w3, w0, [x19, 20]
+.LBB1693:
+.LBB1688:
+	.loc 1 2127 0
+	ldr	x26, [x20]
+.LVL565:
+	.loc 1 2136 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL549:
-	.loc 1 2131 0
-	cbz	x0, .L641
-	.loc 1 2134 0
+.LVL566:
+	.loc 1 2137 0
+	cbz	x0, .L646
+	.loc 1 2140 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL550:
-	mov	w24, w0
-	.loc 1 2136 0
-	cbnz	w0, .L685
-.LBB1677:
-.LBB1678:
+.LVL567:
+	mov	w25, w0
+	.loc 1 2142 0
+	cbnz	w0, .L694
+.LBB1669:
+.LBB1670:
 	.file 15 "./include/linux/ioport.h"
 	.loc 15 204 0
 	ldp	x1, x2, [x29, 104]
-.LBE1678:
-.LBE1677:
-	.loc 1 2141 0
-	str	x1, [x19, 184]
-	.loc 1 2144 0
+.LBE1670:
+.LBE1669:
+	.loc 1 2147 0
+	str	x1, [x20, 184]
+	.loc 1 2150 0
 	mov	x3, 1
 	mov	x0, x26
-.LBB1680:
-.LBB1679:
+.LBB1672:
+.LBB1671:
 	.loc 15 204 0
 	add	x2, x2, 1
 	sub	x2, x2, x1
-.LBE1679:
-.LBE1680:
-	.loc 1 2142 0
-	str	w2, [x21, 16]
-	.loc 1 2144 0
+.LBE1671:
+.LBE1672:
+	.loc 1 2148 0
+	str	w2, [x19, 16]
+	.loc 1 2150 0
 	sxtw	x2, w2
 	bl	devm_memremap
-.LVL551:
-	str	x0, [x21, 8]
-	.loc 1 2146 0
-	cbz	x0, .L612
-	.loc 1 2154 0
+.LVL568:
+	str	x0, [x19, 8]
+	.loc 1 2152 0
+	cbz	x0, .L617
+	.loc 1 2160 0
 	mov	x1, x0
-	ldr	w2, [x21, 16]
-	ldr	x0, [x19, 184]
+	ldr	w2, [x19, 16]
+	ldr	x0, [x20, 184]
 	mov	w4, 4
 	mov	w3, 2097152
 	bl	ebc_buf_init
-.LVL552:
-	.loc 1 2155 0
-	cbnz	w0, .L612
-	.loc 1 2160 0
-	ldr	x0, [x21, 8]
+.LVL569:
 	.loc 1 2161 0
+	cbnz	w0, .L617
+	.loc 1 2166 0
+	ldr	x0, [x19, 8]
+	.loc 1 2167 0
 	mov	x5, 1048576
-	str	x5, [x22, 40]
-.LBB1681:
-.LBB1682:
+	str	x5, [x21, 40]
+.LBB1673:
+.LBB1674:
 	.loc 2 711 0
 	mov	w2, 32960
-.LBE1682:
-.LBE1681:
-	.loc 1 2160 0
+.LBE1674:
+.LBE1673:
+	.loc 1 2166 0
 	add	x6, x0, 10485760
-	str	x6, [x22, 24]
+	str	x6, [x21, 24]
 	add	x4, x0, 11534336
-	.loc 1 2166 0
+	.loc 1 2172 0
 	add	x1, x0, 12582912
-	.loc 1 2162 0
-	ldr	x3, [x19, 184]
-.LBB1686:
-.LBB1683:
+	.loc 1 2168 0
+	ldr	x3, [x20, 184]
+.LBB1678:
+.LBB1675:
 	.loc 2 711 0
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
-.LBE1683:
-.LBE1686:
-	.loc 1 2162 0
+.LBE1675:
+.LBE1678:
+	.loc 1 2168 0
 	add	x7, x3, 10485760
-	str	x7, [x22, 32]
-	.loc 1 2163 0
-	str	x6, [x21, 168]
-	.loc 1 2162 0
+	str	x7, [x21, 32]
+	.loc 1 2169 0
+	str	x6, [x19, 168]
+	.loc 1 2168 0
 	add	x3, x3, 11534336
-	.loc 1 2161 0
-	str	x5, [x22, 64]
-	.loc 1 2162 0
-	stp	x4, x3, [x22, 48]
-	.loc 1 2166 0
-	str	x1, [x21, 112]
-.LBB1687:
-.LBB1684:
+	.loc 1 2167 0
+	str	x5, [x21, 64]
+	.loc 1 2168 0
+	stp	x4, x3, [x21, 48]
+	.loc 1 2172 0
+	str	x1, [x19, 112]
+.LBB1679:
+.LBB1676:
 	.loc 2 711 0
-	ldrsw	x1, [x21, 20]
-.LBE1684:
-.LBE1687:
-	.loc 1 2163 0
-	str	x4, [x21, 176]
-.LBB1688:
-.LBB1685:
+	ldrsw	x1, [x19, 20]
+.LBE1676:
+.LBE1679:
+	.loc 1 2169 0
+	str	x4, [x19, 176]
+.LBB1680:
+.LBB1677:
 	.loc 2 711 0
 	bl	devm_kmalloc
-.LVL553:
-.LBE1685:
-.LBE1688:
-	.loc 1 2169 0
-	str	x0, [x21, 128]
-	.loc 1 2170 0
-	cbz	x0, .L612
-.LBB1689:
-.LBB1690:
+.LVL570:
+.LBE1677:
+.LBE1680:
+	.loc 1 2175 0
+	str	x0, [x19, 128]
+	.loc 1 2176 0
+	cbz	x0, .L617
+.LBB1681:
+.LBB1682:
 	.loc 2 711 0
-	ldrsw	x1, [x21, 20]
+	ldrsw	x1, [x19, 20]
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL554:
-.LBE1690:
-.LBE1689:
-	.loc 1 2172 0
-	str	x0, [x21, 136]
-	.loc 1 2173 0
-	cbz	x0, .L612
-.LBB1691:
-.LBB1692:
+.LVL571:
+.LBE1682:
+.LBE1681:
+	.loc 1 2178 0
+	str	x0, [x19, 136]
+	.loc 1 2179 0
+	cbz	x0, .L617
+.LBB1683:
+.LBB1684:
 	.loc 2 711 0
-	ldrsw	x1, [x21, 20]
+	ldrsw	x1, [x19, 20]
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL555:
-.LBE1692:
-.LBE1691:
-	.loc 1 2175 0
-	str	x0, [x21, 144]
-	.loc 1 2176 0
-	cbz	x0, .L612
-	.loc 1 2183 0
-	ldp	w1, w0, [x22, 84]
-.LBB1693:
-.LBB1694:
+.LVL572:
+.LBE1684:
+.LBE1683:
+	.loc 1 2181 0
+	str	x0, [x19, 144]
+	.loc 1 2182 0
+	cbz	x0, .L617
+	.loc 1 2189 0
+	ldp	w1, w0, [x21, 84]
+.LBB1685:
+.LBB1686:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	mul	w1, w1, w0
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL556:
-.LBE1694:
-.LBE1693:
-	.loc 1 2183 0
-	str	x0, [x21, 152]
-	.loc 1 2184 0
-	cbz	x0, .L612
-	.loc 1 2186 0
-	ldp	w2, w1, [x22, 84]
+.LVL573:
+.LBE1686:
+.LBE1685:
+	.loc 1 2189 0
+	str	x0, [x19, 152]
+	.loc 1 2190 0
+	cbz	x0, .L617
+	.loc 1 2192 0
+	ldp	w2, w1, [x21, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
-.LVL557:
-	.loc 1 2187 0
-	ldrsw	x2, [x21, 20]
+.LVL574:
+	.loc 1 2193 0
+	ldrsw	x2, [x19, 20]
 	mov	w1, 255
-	ldr	x0, [x21, 144]
+	ldr	x0, [x19, 144]
 	bl	memset
-.LVL558:
-.LBE1696:
-.LBE1701:
-.LBB1702:
-.LBB1703:
-	.loc 1 2081 0
-	ldr	x26, [x19, 272]
-.LVL559:
+.LVL575:
+.LBE1688:
+.LBE1693:
+.LBB1694:
+.LBB1695:
 	.loc 1 2087 0
-	adrp	x1, .LC38
+	ldr	x26, [x20, 272]
+.LVL576:
+	.loc 1 2093 0
+	adrp	x1, .LC40
 	mov	w2, 0
-	add	x1, x1, :lo12:.LC38
+	add	x1, x1, :lo12:.LC40
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL560:
-	.loc 1 2088 0
-	cbz	x0, .L642
-	.loc 1 2091 0
+.LVL577:
+	.loc 1 2094 0
+	cbz	x0, .L647
+	.loc 1 2097 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL561:
-	mov	w24, w0
-	.loc 1 2093 0
-	cbz	w0, .L686
-.L613:
-.LBE1703:
-.LBE1702:
-	.loc 1 2409 0
-	adrp	x1, .LC71
-	mov	x0, x20
-	add	x1, x1, :lo12:.LC71
+.LVL578:
+	mov	w25, w0
+	.loc 1 2099 0
+	cbz	w0, .L695
+.L618:
+.LBE1695:
+.LBE1694:
+	.loc 1 2435 0
+	adrp	x1, .LC73
+	mov	x0, x22
+	add	x1, x1, :lo12:.LC73
 	bl	_dev_err
-.LVL562:
-	.loc 1 2410 0
+.LVL579:
+	.loc 1 2436 0
 	b	.L595
-.LVL563:
+.LVL580:
+	.p2align 3
+.L609:
+	.loc 1 2417 0
+	mov	w25, -22
+	.loc 1 2416 0
+	adrp	x1, .LC77
+	mov	w2, w25
+	add	x1, x1, :lo12:.LC77
+	mov	x0, x22
+	bl	_dev_err
+.LVL581:
+	.loc 1 2417 0
+	b	.L595
+.LVL582:
 	.p2align 3
-.L604:
+.L691:
+	.loc 1 2390 0
+	adrp	x1, .LC30
+	mov	x0, x22
+.LVL583:
+	add	x1, x1, :lo12:.LC30
 	.loc 1 2391 0
-	mov	w24, -22
+	mov	w25, -19
 	.loc 1 2390 0
-	adrp	x1, .LC75
-	mov	w2, w24
-	add	x1, x1, :lo12:.LC75
-	mov	x0, x20
 	bl	_dev_err
-.LVL564:
-.L595:
-	.loc 1 2434 0
-	add	x23, x23, :lo12:__stack_chk_guard
-	mov	w0, w24
-.LVL565:
-	ldr	x2, [x29, 200]
-	ldr	x1, [x23]
-	eor	x1, x2, x1
-	cbnz	x1, .L687
-	ldp	x19, x20, [sp, 16]
-	ldp	x21, x22, [sp, 32]
-.LVL566:
-	ldp	x23, x24, [sp, 48]
-	ldp	x25, x26, [sp, 64]
-.LVL567:
-	ldp	x27, x28, [sp, 80]
-.LVL568:
-	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
-.LVL569:
+.LVL584:
+	.loc 1 2391 0
+	b	.L595
+.LVL585:
 	.p2align 3
-.L685:
-	.cfi_restore_state
-.LBB1710:
-.LBB1697:
-	.loc 1 2137 0
-	adrp	x1, .LC37
-	mov	x0, x26
-	add	x1, x1, :lo12:.LC37
-	bl	_dev_err
-.LVL570:
-.L609:
-.LBE1697:
-.LBE1710:
+.L607:
+	.loc 1 2402 0
+	adrp	x1, .LC32
+	mov	x0, x22
+	add	x1, x1, :lo12:.LC32
+	.loc 1 2403 0
+	mov	w25, -517
 	.loc 1 2402 0
-	adrp	x1, .LC70
-	mov	x0, x20
-	add	x1, x1, :lo12:.LC70
 	bl	_dev_err
-.LVL571:
+.LVL586:
 	.loc 1 2403 0
 	b	.L595
-.LVL572:
-	.p2align 3
-.L608:
-.LBB1711:
-.LBB1671:
-	.loc 1 1720 0
-	str	wzr, [x22, 96]
-	b	.L634
+.LVL587:
 	.p2align 3
-.L607:
-.LBB1660:
-.LBB1658:
-.LBB1656:
-	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC35
-.LBE1656:
-.LBE1658:
-.LBE1660:
-	.loc 1 1717 0
-	str	wzr, [x22, 92]
-.LBB1661:
-.LBB1659:
-.LBB1657:
-	.loc 14 499 0
-	mov	x4, 0
-	mov	x3, 1
-	add	x2, x19, 120
-	add	x1, x1, :lo12:.LC35
-	bl	of_property_read_variable_u32_array
-.LVL573:
-	.loc 14 501 0
-	tbz	w0, #31, .L634
-	b	.L608
-	.p2align 3
-.L606:
-.LBE1657:
-.LBE1659:
-.LBE1661:
-.LBB1662:
-.LBB1651:
-.LBB1649:
-	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC34
-.LBE1649:
-.LBE1651:
-.LBE1662:
-	.loc 1 1714 0
-	str	wzr, [x22, 156]
-.LBB1663:
-.LBB1652:
-.LBB1650:
-	.loc 14 499 0
-	mov	x4, 0
-	mov	x3, 1
-	add	x2, x19, 116
-	add	x1, x1, :lo12:.LC34
-	bl	of_property_read_variable_u32_array
-.LVL574:
-	.loc 14 501 0
-	tbz	w0, #31, .L633
-	b	.L607
-	.p2align 3
-.L605:
-.LBE1650:
-.LBE1652:
-.LBE1663:
-.LBB1664:
-.LBB1644:
-.LBB1642:
-	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC33
-.LBE1642:
-.LBE1644:
-.LBE1664:
-	.loc 1 1711 0
-	str	wzr, [x22, 152]
-.LBB1665:
-.LBB1645:
-.LBB1643:
-	.loc 14 499 0
-	mov	x4, 0
-	mov	x3, 1
-	add	x2, x19, 180
-	add	x1, x1, :lo12:.LC33
-	bl	of_property_read_variable_u32_array
-.LVL575:
-	.loc 14 501 0
-	tbz	w0, #31, .L632
-	b	.L606
-	.p2align 3
-.L684:
-.LBE1643:
-.LBE1645:
-.LBE1665:
-.LBB1666:
-.LBB1637:
-.LBB1635:
-	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC32
-.LBE1635:
-.LBE1637:
-.LBE1666:
-	.loc 1 1708 0
-	str	wzr, [x22, 148]
-.LBB1667:
-.LBB1638:
-.LBB1636:
-	.loc 14 499 0
-	mov	x4, 0
-	mov	x3, 1
-	add	x2, x19, 176
-	add	x1, x1, :lo12:.LC32
-	bl	of_property_read_variable_u32_array
-.LVL576:
-	.loc 14 501 0
-	tbz	w0, #31, .L631
-	b	.L605
-.LVL577:
-	.p2align 3
-.L686:
-.LBE1636:
-.LBE1638:
-.LBE1667:
-.LBE1671:
-.LBE1711:
-.LBB1712:
-.LBB1706:
-	.loc 1 2099 0
+.L694:
+.LBB1702:
+.LBB1689:
+	.loc 1 2143 0
+	adrp	x1, .LC39
+	mov	x0, x26
+	add	x1, x1, :lo12:.LC39
+	bl	_dev_err
+.LVL588:
+.L614:
+.LBE1689:
+.LBE1702:
+	.loc 1 2428 0
+	adrp	x1, .LC72
+	mov	x0, x22
+	add	x1, x1, :lo12:.LC72
+	bl	_dev_err
+.LVL589:
+	.loc 1 2429 0
+	b	.L595
+.LVL590:
+.L695:
+.LBB1703:
+.LBB1698:
+	.loc 1 2105 0
 	mov	x0, x26
 	mov	x3, 1
-.LBB1704:
-.LBB1705:
+.LBB1696:
+.LBB1697:
 	.loc 15 204 0
 	ldp	x1, x26, [x29, 104]
-.LVL578:
+.LVL591:
 	add	x26, x26, 1
 	sub	x26, x26, x1
-.LBE1705:
-.LBE1704:
-	.loc 1 2099 0
+.LBE1697:
+.LBE1696:
+	.loc 1 2105 0
 	sxtw	x2, w26
 	bl	devm_memremap
-.LVL579:
-	str	x0, [x19, 376]
-	.loc 1 2101 0
-	cbz	x0, .L688
-	.loc 1 2106 0
-	bl	epd_lut_from_mem_init
-.LVL580:
+.LVL592:
+	str	x0, [x20, 376]
 	.loc 1 2107 0
-	tbnz	w0, #31, .L689
-.L615:
-.LBE1706:
-.LBE1712:
-.LBB1713:
-.LBB1714:
-	.loc 1 2196 0
-	add	x0, x19, 736
+	cbz	x0, .L696
+	.loc 1 2112 0
+	bl	epd_lut_from_mem_init
+.LVL593:
+	.loc 1 2113 0
+	tbnz	w0, #31, .L697
+.L620:
+.LBE1698:
+.LBE1703:
+.LBB1704:
+.LBB1705:
+	.loc 1 2202 0
+	add	x0, x20, 736
 	mov	x1, 68719476704
-	str	x1, [x21, 544]
-	.loc 1 2198 0
-	add	x25, x25, :lo12:.LANCHOR0
-.LBB1715:
-.LBB1716:
-.LBB1717:
-.LBB1718:
-.LBB1719:
+	str	x1, [x19, 544]
+	.loc 1 2204 0
+	add	x24, x24, :lo12:.LANCHOR0
+.LBB1706:
+.LBB1707:
+.LBB1708:
+.LBB1709:
+.LBB1710:
 	.loc 12 288 0
-	str	x0, [x19, 736]
-.LBE1719:
-.LBE1718:
-.LBE1717:
-.LBE1716:
-.LBE1715:
-	.loc 1 2194 0
+	str	x0, [x20, 736]
+.LBE1710:
+.LBE1709:
+.LBE1708:
+.LBE1707:
+.LBE1706:
+	.loc 1 2200 0
 	mov	w26, 99
-.LBB1721:
-.LBB1720:
+.LBB1712:
+.LBB1711:
 	.file 16 "./include/linux/list.h"
 	.loc 16 29 0
 	str	x0, [x0, 8]
-.LBE1720:
-.LBE1721:
-	.loc 1 2196 0
+.LBE1711:
+.LBE1712:
+	.loc 1 2202 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
-	str	x0, [x21, 568]
-	.loc 1 2198 0
-	adrp	x3, .LC72
+	str	x0, [x19, 568]
+	.loc 1 2204 0
+	adrp	x3, .LC74
 	mov	w2, -1
-	add	x3, x3, :lo12:.LC72
-	mov	x1, x21
+	add	x3, x3, :lo12:.LC74
+	mov	x1, x19
 	adrp	x0, ebc_auto_tast_function
-	.loc 1 2194 0
+	.loc 1 2200 0
 	str	w26, [x29, 104]
-	.loc 1 2198 0
+	.loc 1 2204 0
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
-.LVL581:
-	str	x0, [x25, 8]
-	.loc 1 2199 0
+.LVL594:
+	str	x0, [x24, 8]
+	.loc 1 2205 0
 	cmn	x0, #4096
-	bhi	.L690
-	.loc 1 2203 0
+	bhi	.L698
+	.loc 1 2209 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
-.LVL582:
-	.loc 1 2204 0
-	ldr	x2, [x25, 8]
-.LBB1722:
-.LBB1723:
+.LVL595:
+	.loc 1 2210 0
+	ldr	x2, [x24, 8]
+.LBB1713:
+.LBB1714:
 	.file 17 "./arch/arm64/include/asm/atomic_lse.h"
 	.loc 17 47 0
 	mov	w0, 1
-.LVL583:
+.LVL596:
 	add	x1, x2, 48
-.LVL584:
+.LVL597:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -7205,49 +7178,49 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL585:
+.LVL598:
 #NO_APP
-.LBE1723:
-.LBE1722:
-.LBB1724:
-	.loc 1 2207 0
-	adrp	x3, .LC43
+.LBE1714:
+.LBE1713:
+.LBB1715:
+	.loc 1 2213 0
+	adrp	x3, .LC45
 	adrp	x0, ebc_thread
-.LVL586:
-	add	x3, x3, :lo12:.LC43
+.LVL599:
+	add	x3, x3, :lo12:.LC45
 	mov	w2, -1
 	add	x0, x0, :lo12:ebc_thread
-	mov	x1, x21
-.LBE1724:
-	.loc 1 2206 0
+	mov	x1, x19
+.LBE1715:
+	.loc 1 2212 0
 	str	w26, [x29, 104]
-.LBB1725:
-	.loc 1 2207 0
+.LBB1716:
+	.loc 1 2213 0
 	bl	kthread_create_on_node
-.LVL587:
-	mov	x25, x0
-.LVL588:
+.LVL600:
+	mov	x24, x0
+.LVL601:
 	cmn	x0, #4096
-	bhi	.L617
+	bhi	.L622
 	bl	wake_up_process
-.LVL589:
-.LBE1725:
-	str	x25, [x21, 120]
-	.loc 1 2212 0
+.LVL602:
+.LBE1716:
+	str	x24, [x19, 120]
+	.loc 1 2218 0
 	add	x2, x29, 104
 	mov	w1, 1
-	mov	x0, x25
+	mov	x0, x24
 	bl	sched_setscheduler_nocheck
-.LVL590:
-	.loc 1 2213 0
-	ldr	x2, [x21, 120]
-.LBB1726:
-.LBB1727:
+.LVL603:
+	.loc 1 2219 0
+	ldr	x2, [x19, 120]
+.LBB1717:
+.LBB1718:
 	.loc 17 47 0
 	mov	w0, 1
-.LVL591:
+.LVL604:
 	add	x1, x2, 48
-.LVL592:
+.LVL605:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -7275,62 +7248,62 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL593:
+.LVL606:
 #NO_APP
-.LBE1727:
-.LBE1726:
-.LBE1714:
-.LBE1713:
-.LBB1730:
-.LBB1731:
-	.loc 1 2222 0
+.LBE1718:
+.LBE1717:
+.LBE1705:
+.LBE1704:
+.LBB1721:
+.LBB1722:
+	.loc 1 2228 0
 	mov	w0, -1
-.LVL594:
-	str	w0, [x21, 48]
-.LBB1732:
-.LBB1733:
+.LVL607:
+	str	w0, [x19, 48]
+.LBB1723:
+.LBB1724:
 	.loc 4 39 0
-	add	x0, x19, 400
-.LVL595:
-.LBE1733:
-.LBE1732:
-	.loc 1 2226 0
-	str	wzr, [x21, 28]
-	.loc 1 2225 0
-	str	wzr, [x21, 80]
-.LBB1738:
-.LBB1734:
+	add	x0, x20, 400
+.LVL608:
+.LBE1724:
+.LBE1723:
+	.loc 1 2232 0
+	str	wzr, [x19, 28]
+	.loc 1 2231 0
+	str	wzr, [x19, 80]
+.LBB1729:
+.LBB1725:
 	.loc 4 43 0
-	adrp	x1, .LC44
-.LBE1734:
-.LBE1738:
-	.loc 1 2221 0
-	str	wzr, [x21, 184]
-.LBB1739:
-.LBB1735:
+	adrp	x1, .LC46
+.LBE1725:
+.LBE1729:
+	.loc 1 2227 0
+	str	wzr, [x19, 184]
+.LBB1730:
+.LBB1726:
 	.loc 4 43 0
-	add	x1, x1, :lo12:.LC44
-.LBE1735:
-.LBE1739:
-	.loc 1 2223 0
-	str	wzr, [x21, 592]
-	.loc 1 2233 0
-	add	x25, x19, 616
-.LVL596:
-	.loc 1 2224 0
-	str	wzr, [x21, 596]
-	.loc 1 2234 0
+	add	x1, x1, :lo12:.LC46
+.LBE1726:
+.LBE1730:
+	.loc 1 2229 0
+	str	wzr, [x19, 592]
+	.loc 1 2239 0
+	add	x24, x20, 616
+.LVL609:
+	.loc 1 2230 0
+	str	wzr, [x19, 596]
+	.loc 1 2240 0
 	adrp	x26, jiffies
-.LBB1740:
-.LBB1736:
+.LBB1731:
+.LBB1727:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0]
-.LBE1736:
-.LBE1740:
-	.loc 1 2234 0
+.LBE1727:
+.LBE1731:
+	.loc 1 2240 0
 	mov	x27, 268435455
-.LBB1741:
-.LBB1737:
+.LBB1732:
+.LBB1728:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0, 16]
 	stp	xzr, xzr, [x0, 32]
@@ -7345,661 +7318,629 @@ ebc_probe:
 	stp	xzr, xzr, [x0, 176]
 	stp	xzr, xzr, [x0, 192]
 	.loc 4 43 0
-	str	x1, [x19, 400]
+	str	x1, [x20, 400]
 	.loc 4 45 0
 	bl	wakeup_source_add
-.LVL597:
-.LBE1737:
-.LBE1741:
-	.loc 1 2230 0
-	str	wzr, [x21, 424]
-	.loc 1 2233 0
+.LVL610:
+.LBE1728:
+.LBE1732:
+	.loc 1 2236 0
+	str	wzr, [x19, 424]
+	.loc 1 2239 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
-	mov	x0, x25
+	mov	x0, x24
 	adrp	x1, ebc_vdd_power_timeout
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
-.LVL598:
-	.loc 1 2234 0
+.LVL611:
+	.loc 1 2240 0
 	ldr	x1, [x26, #:lo12:jiffies]
-	mov	x0, x25
-	.loc 1 2237 0
-	add	x25, x19, 672
-	.loc 1 2234 0
+	mov	x0, x24
+	.loc 1 2243 0
+	add	x24, x20, 672
+	.loc 1 2240 0
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL599:
-	.loc 1 2237 0
+.LVL612:
+	.loc 1 2243 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
-	mov	x0, x25
+	mov	x0, x24
 	adrp	x1, ebc_frame_timeout
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
-.LVL600:
-	.loc 1 2238 0
+.LVL613:
+	.loc 1 2244 0
 	ldr	x1, [x26, #:lo12:jiffies]
-	mov	x0, x25
+	mov	x0, x24
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL601:
-.LBE1731:
-.LBE1730:
-.LBB1742:
-.LBB1743:
-	.loc 1 2248 0
+.LVL614:
+.LBE1722:
+.LBE1721:
+.LBB1733:
+.LBB1734:
+	.loc 1 2254 0
 	adrp	x0, saved_command_line
-	adrp	x1, .LC45
-	.loc 1 2245 0
+	adrp	x1, .LC47
+	.loc 1 2251 0
 	stp	wzr, wzr, [x29, 100]
-.LVL602:
-	.loc 1 2248 0
-	add	x1, x1, :lo12:.LC45
-	ldr	x25, [x0, #:lo12:saved_command_line]
-	mov	x0, x25
+.LVL615:
+	.loc 1 2254 0
+	add	x1, x1, :lo12:.LC47
+	ldr	x24, [x0, #:lo12:saved_command_line]
+	mov	x0, x24
 	bl	strstr
-.LVL603:
-	.loc 1 2249 0
-	adrp	x1, .LC46
-	.loc 1 2248 0
+.LVL616:
+	.loc 1 2255 0
+	adrp	x1, .LC48
+	.loc 1 2254 0
 	mov	x26, x0
-.LVL604:
-	.loc 1 2249 0
-	add	x1, x1, :lo12:.LC46
-	mov	x0, x25
+.LVL617:
+	.loc 1 2255 0
+	add	x1, x1, :lo12:.LC48
+	mov	x0, x24
 	bl	strstr
-.LVL605:
+.LVL618:
 	mov	x28, x0
-.LVL606:
-	.loc 1 2254 0
-	cbz	x26, .L618
-	.loc 1 2255 0
+.LVL619:
+	.loc 1 2260 0
+	cbz	x26, .L623
+	.loc 1 2261 0
 	add	x2, x29, 100
-	adrp	x1, .LC47
+	adrp	x1, .LC49
 	mov	x0, x26
-	add	x1, x1, :lo12:.LC47
+	add	x1, x1, :lo12:.LC49
 	bl	sscanf
-.LVL607:
-	.loc 1 2256 0
+.LVL620:
+	.loc 1 2262 0
 	ldr	w2, [x29, 100]
-	ldr	x0, [x19, 184]
+	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
-	bls	.L691
-.L618:
-	.loc 1 2268 0
-	mov	w25, 0
-.LVL608:
+	bls	.L699
+.L623:
+	.loc 1 2274 0
+	mov	w24, 0
+.LVL621:
 	mov	x27, 0
-.LVL609:
-	.loc 1 2252 0
+.LVL622:
+	.loc 1 2258 0
 	mov	x26, 0
-.LVL610:
-	.loc 1 2268 0
-	cbz	x28, .L638
-.LVL611:
-.L637:
-	.loc 1 2269 0
+.LVL623:
+	.loc 1 2274 0
+	cbz	x28, .L643
+.LVL624:
+.L642:
+	.loc 1 2275 0
 	add	x2, x29, 104
 	mov	x0, x28
-	adrp	x1, .LC50
-	add	x1, x1, :lo12:.LC50
+	adrp	x1, .LC52
+	add	x1, x1, :lo12:.LC52
 	bl	sscanf
-.LVL612:
-	.loc 1 2247 0
+.LVL625:
+	.loc 1 2253 0
 	mov	w28, 0
-.LVL613:
-	.loc 1 2270 0
+.LVL626:
+	.loc 1 2276 0
 	ldr	w2, [x29, 104]
-	.loc 1 2252 0
+	.loc 1 2258 0
 	mov	x26, 0
-.LVL614:
-	.loc 1 2270 0
-	ldr	x0, [x19, 184]
+.LVL627:
+	.loc 1 2276 0
+	ldr	x0, [x20, 184]
 	cmp	x0, x2, uxtw
-	bls	.L692
-.L622:
-	.loc 1 2282 0
-	cbnz	w25, .L621
-.LVL615:
-.L638:
-	.loc 1 2283 0
-	ldr	x0, [x21, 88]
-	adrp	x1, .LC53
-	add	x1, x1, :lo12:.LC53
+	bls	.L700
+.L627:
+	.loc 1 2288 0
+	cbnz	w24, .L626
+.LVL628:
+.L643:
+	.loc 1 2289 0
+	ldr	x0, [x19, 88]
+	adrp	x1, .LC55
+	add	x1, x1, :lo12:.LC55
 	bl	_dev_info
-.LVL616:
-	.loc 1 2284 0
-	ldr	x0, [x19, 16]
+.LVL629:
+	.loc 1 2290 0
+	ldr	x0, [x20, 16]
 	bl	ebc_pmic_verity_vcom
-.LVL617:
-.LBB1744:
-.LBB1745:
-	.loc 1 1628 0
+.LVL630:
+.LBB1735:
+.LBB1736:
+	.loc 1 1634 0
 	bl	ebc_empty_buf_get
-.LVL618:
-	mov	x25, x0
-.LVL619:
-	.loc 1 1629 0
-	ldp	w2, w0, [x19, 108]
+.LVL631:
+	mov	x24, x0
+.LVL632:
+	.loc 1 1635 0
+	ldp	w2, w0, [x20, 108]
 	mov	w1, 255
 	mul	w2, w2, w0
-	ldr	x0, [x25, 16]
+	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memset
-.LVL620:
-	.loc 1 1632 0
-	stp	wzr, wzr, [x25, 48]
-	.loc 1 1630 0
+.LVL633:
+	.loc 1 1638 0
+	stp	wzr, wzr, [x24, 48]
+	.loc 1 1636 0
 	mov	w0, 17
-	str	w0, [x25, 40]
-	.loc 1 1635 0
-	mov	x0, x25
-	.loc 1 1633 0
-	ldr	w1, [x19, 108]
-	str	w1, [x25, 56]
-	.loc 1 1634 0
-	ldr	w1, [x19, 112]
-	str	w1, [x25, 60]
-	.loc 1 1635 0
+	str	w0, [x24, 40]
+	.loc 1 1641 0
+	mov	x0, x24
+	.loc 1 1639 0
+	ldr	w1, [x20, 108]
+	str	w1, [x24, 56]
+	.loc 1 1640 0
+	ldr	w1, [x20, 112]
+	str	w1, [x24, 60]
+	.loc 1 1641 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL621:
-.L624:
-.LBE1745:
-.LBE1744:
-	.loc 1 2301 0
-	cbnz	w28, .L693
-.L626:
-	.loc 1 2314 0
-	ldr	w0, [x21, 80]
-	adrp	x22, .LANCHOR1
-	cbz	w0, .L694
-.L628:
-	.loc 1 2319 0
-	cbz	x27, .L629
+.LVL634:
+.L629:
+.LBE1736:
+.LBE1735:
+	.loc 1 2307 0
+	cbnz	w28, .L701
+.L631:
 	.loc 1 2320 0
+	ldr	w0, [x19, 80]
+	adrp	x21, .LANCHOR1
+	cbz	w0, .L702
+.L633:
+	.loc 1 2325 0
+	cbz	x27, .L634
+	.loc 1 2326 0
 	mov	x0, x27
 	bl	kfree
-.LVL622:
-.L629:
-	.loc 1 2321 0
-	cbz	x26, .L620
-	.loc 1 2322 0
+.LVL635:
+.L634:
+	.loc 1 2327 0
+	cbz	x26, .L625
+	.loc 1 2328 0
 	mov	x0, x26
 	bl	kfree
-.LVL623:
-.L620:
-.LBE1743:
-.LBE1742:
-.LBB1755:
-.LBB1756:
-.LBB1757:
-	.loc 2 1186 0
-	str	x19, [x20, 184]
-.LBE1757:
-.LBE1756:
-.LBE1755:
-.LBB1758:
-.LBB1759:
-	.loc 1 2065 0
-	add	x22, x22, :lo12:.LANCHOR1
-	add	x0, x22, 224
-	bl	misc_register
-.LVL624:
-	.loc 1 2067 0
-	ldr	x0, [x19, 272]
-	add	x1, x22, 400
-	bl	device_create_file
-.LVL625:
-	.loc 1 2068 0
-	ldr	x0, [x19, 272]
-	add	x1, x22, 432
-	bl	device_create_file
-.LVL626:
-	.loc 1 2069 0
-	ldr	x0, [x19, 272]
-	add	x1, x22, 464
-	bl	device_create_file
-.LVL627:
-	.loc 1 2070 0
-	ldr	x0, [x19, 272]
-	add	x1, x22, 496
-	bl	device_create_file
-.LVL628:
-	.loc 1 2071 0
-	ldr	x0, [x19, 272]
-	add	x1, x22, 528
-	bl	device_create_file
-.LVL629:
-	.loc 1 2072 0
-	ldr	x0, [x19, 272]
-	add	x1, x22, 560
-	bl	device_create_file
-.LVL630:
-	.loc 1 2073 0
-	ldr	x0, [x19, 272]
-	add	x1, x22, 592
-	bl	device_create_file
-.LVL631:
-.LBE1759:
-.LBE1758:
-	.loc 1 2431 0
-	ldr	x0, [x21, 88]
-	adrp	x2, .LC16
-	adrp	x1, .LC54
-	add	x2, x2, :lo12:.LC16
-	add	x1, x1, :lo12:.LC54
-	bl	_dev_info
-.LVL632:
-	.loc 1 2433 0
-	b	.L595
-.LVL633:
-	.p2align 3
-.L691:
-.LBB1760:
-.LBB1752:
-	.loc 1 2258 0
-	ldr	x0, [x21, 88]
-	adrp	x1, .LC48
-	add	x1, x1, :lo12:.LC48
-	bl	_dev_info
-.LVL634:
-	.loc 1 2259 0
-	ldp	w0, w1, [x22, 84]
-	mul	w0, w0, w1
-.LBB1746:
+.LVL636:
+.L625:
+.LBE1734:
+.LBE1733:
 .LBB1747:
 .LBB1748:
-	.file 18 "./include/linux/slab.h"
-	.loc 18 553 0
-	mov	w1, 32960
-	movk	w1, 0x60, lsl 16
-	lsr	w0, w0, 1
-	bl	__kmalloc
-.LVL635:
-	mov	x27, x0
-.LVL636:
+.LBB1749:
+	.loc 2 1186 0
+	str	x20, [x22, 184]
+.LBE1749:
 .LBE1748:
 .LBE1747:
-.LBE1746:
-	.loc 1 2260 0
-	cbz	x0, .L695
-	.loc 1 2264 0
-	ldp	w2, w1, [x22, 84]
-	ldr	x3, [x19, 184]
-	mul	w2, w2, w1
-	ldr	w1, [x29, 100]
+.LBB1750:
+.LBB1751:
+	.loc 1 2071 0
+	add	x21, x21, :lo12:.LANCHOR1
+	add	x0, x21, 224
+	bl	misc_register
 .LVL637:
-	sub	x1, x1, x3
+	.loc 1 2073 0
+	ldr	x0, [x20, 272]
+	add	x1, x21, 400
+	bl	device_create_file
 .LVL638:
-	ldr	x3, [x21, 8]
-	lsr	w2, w2, 1
-	add	x1, x3, x1
-	bl	memcpy
+	.loc 1 2074 0
+	ldr	x0, [x20, 272]
+	add	x1, x21, 432
+	bl	device_create_file
 .LVL639:
-	.loc 1 2268 0
-	cbnz	x28, .L696
-	.loc 1 2247 0
-	mov	w28, 0
+	.loc 1 2075 0
+	ldr	x0, [x20, 272]
+	add	x1, x21, 464
+	bl	device_create_file
 .LVL640:
-	.loc 1 2252 0
-	mov	x26, 0
+	.loc 1 2076 0
+	ldr	x0, [x20, 272]
+	add	x1, x21, 496
+	bl	device_create_file
 .LVL641:
-.L621:
-	.loc 1 2289 0
-	bl	ebc_empty_buf_get
+	.loc 1 2077 0
+	ldr	x0, [x20, 272]
+	add	x1, x21, 528
+	bl	device_create_file
 .LVL642:
-	mov	x25, x0
+	.loc 1 2078 0
+	ldr	x0, [x20, 272]
+	add	x1, x21, 560
+	bl	device_create_file
 .LVL643:
-	.loc 1 2290 0
-	cbz	x0, .L624
-	.loc 1 2291 0
-	ldp	w2, w0, [x22, 84]
-	mov	x1, x27
-	mul	w2, w2, w0
-	ldr	x0, [x25, 16]
-	lsr	w2, w2, 1
-	bl	memcpy
+	.loc 1 2079 0
+	ldr	x0, [x20, 272]
+	add	x1, x21, 592
+	bl	device_create_file
 .LVL644:
-	.loc 1 2294 0
-	stp	wzr, wzr, [x25, 48]
-	.loc 1 2292 0
-	mov	w0, 7
-	str	w0, [x25, 40]
-	.loc 1 2297 0
-	mov	x0, x25
-	.loc 1 2295 0
-	ldr	w1, [x22, 84]
-	str	w1, [x25, 56]
-	.loc 1 2296 0
-	ldr	w1, [x22, 88]
-	str	w1, [x25, 60]
-	.loc 1 2297 0
-	bl	ebc_add_to_dsp_buf_list
+.LBE1751:
+.LBE1750:
+	.loc 1 2457 0
+	ldr	x0, [x19, 88]
+	adrp	x2, .LC16
+	adrp	x1, .LC56
+	add	x2, x2, :lo12:.LC16
+	add	x1, x1, :lo12:.LC56
+	bl	_dev_info
 .LVL645:
-	b	.L624
+	.loc 1 2459 0
+	b	.L595
 .LVL646:
-	.p2align 3
-.L694:
-	.loc 1 2315 0
+.L702:
+.LBB1752:
+.LBB1743:
+	.loc 1 2321 0
 	mov	w2, 1
-	str	w2, [x21, 80]
-	.loc 1 2316 0
-	add	x0, x22, :lo12:.LANCHOR1
+	str	w2, [x19, 80]
+	.loc 1 2322 0
+	add	x0, x21, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
 .LVL647:
-	b	.L628
+	b	.L633
 .LVL648:
-	.p2align 3
-.L692:
-	.loc 1 2272 0
-	ldr	x0, [x21, 88]
-	adrp	x1, .LC51
-	add	x1, x1, :lo12:.LC51
+.L699:
+	.loc 1 2264 0
+	ldr	x0, [x19, 88]
+	adrp	x1, .LC50
+	add	x1, x1, :lo12:.LC50
 	bl	_dev_info
 .LVL649:
-	.loc 1 2273 0
-	ldp	w0, w1, [x22, 84]
+	.loc 1 2265 0
+	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
-.LBB1749:
-.LBB1750:
-.LBB1751:
+.LBB1737:
+.LBB1738:
+.LBB1739:
+	.file 18 "./include/linux/slab.h"
 	.loc 18 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
 .LVL650:
-	mov	x26, x0
-.LBE1751:
-.LBE1750:
-.LBE1749:
-	.loc 1 2274 0
-	cbz	x0, .L697
-	.loc 1 2278 0
-	ldp	w2, w1, [x22, 84]
-	.loc 1 2271 0
-	mov	w28, 1
-	.loc 1 2278 0
-	ldr	x3, [x19, 184]
-	mul	w2, w2, w1
-	ldr	w1, [x29, 104]
+	mov	x27, x0
 .LVL651:
-	sub	x1, x1, x3
+.LBE1739:
+.LBE1738:
+.LBE1737:
+	.loc 1 2266 0
+	cbz	x0, .L703
+	.loc 1 2270 0
+	ldp	w2, w1, [x21, 84]
+	ldr	x3, [x20, 184]
+	mul	w2, w2, w1
+	ldr	w1, [x29, 100]
 .LVL652:
-	ldr	x3, [x21, 8]
+	sub	x1, x1, x3
+.LVL653:
+	ldr	x3, [x19, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL653:
-	b	.L622
 .LVL654:
-	.p2align 3
-.L612:
-.LBE1752:
-.LBE1760:
-.LBB1761:
-.LBB1698:
-	.loc 1 2147 0
-	mov	w24, -12
-	b	.L609
+	.loc 1 2274 0
+	cbnz	x28, .L704
+	.loc 1 2253 0
+	mov	w28, 0
 .LVL655:
-	.p2align 3
-.L693:
-.LBE1698:
-.LBE1761:
-.LBB1762:
-.LBB1753:
-	.loc 1 2302 0
-	bl	ebc_empty_buf_get
+	.loc 1 2258 0
+	mov	x26, 0
 .LVL656:
-	mov	x25, x0
+.L626:
+	.loc 1 2295 0
+	bl	ebc_empty_buf_get
 .LVL657:
-	.loc 1 2303 0
-	cbz	x0, .L626
-	.loc 1 2304 0
-	ldp	w2, w0, [x22, 84]
-	mov	x1, x26
+	mov	x24, x0
+.LVL658:
+	.loc 1 2296 0
+	cbz	x0, .L629
+	.loc 1 2297 0
+	ldp	w2, w0, [x21, 84]
+	mov	x1, x27
 	mul	w2, w2, w0
-	ldr	x0, [x25, 16]
+	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL658:
-	.loc 1 2307 0
-	stp	wzr, wzr, [x25, 48]
-	.loc 1 2305 0
+.LVL659:
+	.loc 1 2300 0
+	stp	wzr, wzr, [x24, 48]
+	.loc 1 2298 0
 	mov	w0, 7
-	str	w0, [x25, 40]
-	.loc 1 2308 0
-	ldr	w0, [x22, 84]
-	str	w0, [x25, 56]
-	.loc 1 2310 0
-	mov	x0, x25
-	.loc 1 2309 0
-	ldr	w1, [x22, 88]
-	str	w1, [x25, 60]
-	.loc 1 2310 0
+	str	w0, [x24, 40]
+	.loc 1 2303 0
+	mov	x0, x24
+	.loc 1 2301 0
+	ldr	w1, [x21, 84]
+	str	w1, [x24, 56]
+	.loc 1 2302 0
+	ldr	w1, [x21, 88]
+	str	w1, [x24, 60]
+	.loc 1 2303 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL659:
-	b	.L626
 .LVL660:
-	.p2align 3
-.L689:
-.LBE1753:
-.LBE1762:
-.LBB1763:
-.LBB1707:
-	.loc 1 2108 0
-	ldr	x0, [x19, 272]
-	adrp	x1, .LC40
-	add	x1, x1, :lo12:.LC40
-	bl	_dev_err
+	b	.L629
 .LVL661:
-	.loc 1 2109 0
-	ldr	x0, [x19, 272]
-	mov	w2, w26
-	ldr	x1, [x19, 376]
-	bl	epd_lut_from_file_init
+.L700:
+	.loc 1 2278 0
+	ldr	x0, [x19, 88]
+	adrp	x1, .LC53
+	add	x1, x1, :lo12:.LC53
+	bl	_dev_info
 .LVL662:
-	.loc 1 2110 0
-	tbz	w0, #31, .L615
-	.loc 1 2111 0
-	ldr	x0, [x19, 272]
-	adrp	x1, .LC41
-	.loc 1 2112 0
-	mov	w24, -1
-	.loc 1 2111 0
-	add	x1, x1, :lo12:.LC41
-	bl	_dev_err
+	.loc 1 2279 0
+	ldp	w0, w1, [x21, 84]
+	mul	w0, w0, w1
+.LBB1740:
+.LBB1741:
+.LBB1742:
+	.loc 18 553 0
+	mov	w1, 32960
+	movk	w1, 0x60, lsl 16
+	lsr	w0, w0, 1
+	bl	__kmalloc
 .LVL663:
-	b	.L613
+	mov	x26, x0
+.LBE1742:
+.LBE1741:
+.LBE1740:
+	.loc 1 2280 0
+	cbz	x0, .L705
+	.loc 1 2284 0
+	ldp	w2, w1, [x21, 84]
+	.loc 1 2277 0
+	mov	w28, 1
+	.loc 1 2284 0
+	ldr	x3, [x20, 184]
+	mul	w2, w2, w1
+	ldr	w1, [x29, 104]
 .LVL664:
-	.p2align 3
-.L599:
-.LBE1707:
-.LBE1763:
-	.loc 1 2355 0
-	mov	w24, -517
-	b	.L595
+	sub	x1, x1, x3
 .LVL665:
-	.p2align 3
-.L690:
-.LBB1764:
-.LBB1728:
-	.loc 1 2200 0
-	ldr	x0, [x21, 88]
-	adrp	x1, .LC42
-	add	x1, x1, :lo12:.LC42
-	bl	_dev_err
+	ldr	x3, [x19, 8]
+	lsr	w2, w2, 1
+	add	x1, x3, x1
+	bl	memcpy
 .LVL666:
-.L616:
-.LBE1728:
-.LBE1764:
-	.loc 1 2416 0
-	adrp	x1, .LC74
-	mov	x0, x20
-	add	x1, x1, :lo12:.LC74
-	.loc 1 2417 0
-	mov	w24, -1
-	.loc 1 2416 0
-	bl	_dev_err
+	b	.L627
 .LVL667:
-	.loc 1 2417 0
+.L599:
+.LBE1743:
+.LBE1752:
+	.loc 1 2365 0
+	mov	w25, -517
 	b	.L595
 .LVL668:
-	.p2align 3
 .L617:
-.LBB1765:
-.LBB1729:
-	.loc 1 2209 0
-	ldr	x0, [x21, 88]
+.LBB1753:
+.LBB1690:
+	.loc 1 2153 0
+	mov	w25, -12
+	b	.L614
 .LVL669:
-	adrp	x1, .LC73
-	.loc 1 2207 0
-	str	x25, [x21, 120]
-	.loc 1 2209 0
-	add	x1, x1, :lo12:.LC73
-	bl	_dev_err
+.L701:
+.LBE1690:
+.LBE1753:
+.LBB1754:
+.LBB1744:
+	.loc 1 2308 0
+	bl	ebc_empty_buf_get
 .LVL670:
-	b	.L616
+	mov	x24, x0
 .LVL671:
-	.p2align 3
-.L640:
-.LBE1729:
-.LBE1765:
-	.loc 1 2341 0
-	mov	w24, -12
-	b	.L595
+	.loc 1 2309 0
+	cbz	x0, .L631
+	.loc 1 2310 0
+	ldp	w2, w0, [x21, 84]
+	mov	x1, x26
+	mul	w2, w2, w0
+	ldr	x0, [x24, 16]
+	lsr	w2, w2, 1
+	bl	memcpy
 .LVL672:
-	.p2align 3
-.L641:
-.LBB1766:
-.LBB1699:
-	.loc 1 2132 0
-	mov	w24, -19
-	b	.L609
+	.loc 1 2313 0
+	stp	wzr, wzr, [x24, 48]
+	.loc 1 2311 0
+	mov	w0, 7
+	str	w0, [x24, 40]
+	.loc 1 2314 0
+	ldr	w0, [x21, 84]
+	str	w0, [x24, 56]
+	.loc 1 2316 0
+	mov	x0, x24
+	.loc 1 2315 0
+	ldr	w1, [x21, 88]
+	str	w1, [x24, 60]
+	.loc 1 2316 0
+	bl	ebc_add_to_dsp_buf_list
 .LVL673:
-.L680:
-.LBE1699:
-.LBE1766:
-	.loc 1 2348 0
-	adrp	x1, .LC26
-	mov	x0, x20
-	add	x1, x1, :lo12:.LC26
-	.loc 1 2349 0
-	mov	w24, -19
-	.loc 1 2348 0
-	bl	_dev_err
+	b	.L631
 .LVL674:
-	.loc 1 2349 0
+.L645:
+.LBE1744:
+.LBE1754:
+	.loc 1 2351 0
+	mov	w25, -12
 	b	.L595
-.L683:
-	.loc 1 2376 0
-	adrp	x1, .LC30
-	mov	x0, x20
-	add	x1, x1, :lo12:.LC30
-	.loc 1 2377 0
-	mov	w24, -517
-	.loc 1 2376 0
-	bl	_dev_err
 .LVL675:
-	.loc 1 2377 0
-	b	.L595
-.L681:
-	.loc 1 2364 0
+.L600:
+	.loc 1 2375 0
 	adrp	x1, .LC28
-	mov	x0, x20
+	mov	x0, x22
 	add	x1, x1, :lo12:.LC28
-	.loc 1 2365 0
-	mov	w24, -19
-	.loc 1 2364 0
+	.loc 1 2376 0
+	mov	w25, -22
+	.loc 1 2375 0
 	bl	_dev_err
 .LVL676:
-	.loc 1 2365 0
+	.loc 1 2376 0
 	b	.L595
 .LVL677:
-.L642:
-.LBB1767:
-.LBB1708:
-	.loc 1 2089 0
-	mov	w24, -19
-	b	.L613
+.L697:
+.LBB1755:
+.LBB1699:
+	.loc 1 2114 0
+	ldr	x0, [x20, 272]
+	adrp	x1, .LC42
+	add	x1, x1, :lo12:.LC42
+	bl	_dev_err
 .LVL678:
-.L682:
-.LBE1708:
-.LBE1767:
-	.loc 1 2371 0
-	adrp	x1, .LC29
-	mov	x0, x20
+	.loc 1 2115 0
+	ldr	x0, [x20, 272]
+	mov	w2, w26
+	ldr	x1, [x20, 376]
+	bl	epd_lut_from_file_init
 .LVL679:
-	add	x1, x1, :lo12:.LC29
-	.loc 1 2372 0
-	mov	w24, -517
-	.loc 1 2371 0
+	.loc 1 2116 0
+	tbz	w0, #31, .L620
+	.loc 1 2117 0
+	ldr	x0, [x20, 272]
+	adrp	x1, .LC43
+	.loc 1 2118 0
+	mov	w25, -1
+	.loc 1 2117 0
+	add	x1, x1, :lo12:.LC43
 	bl	_dev_err
 .LVL680:
-	.loc 1 2372 0
-	b	.L595
+	b	.L618
+	.p2align 3
+.L698:
+.LBE1699:
+.LBE1755:
+.LBB1756:
+.LBB1719:
+	.loc 1 2206 0
+	ldr	x0, [x19, 88]
+	adrp	x1, .LC44
+	add	x1, x1, :lo12:.LC44
+	bl	_dev_err
 .LVL681:
-.L688:
-.LBB1768:
-.LBB1709:
-	.loc 1 2102 0
-	ldr	x0, [x19, 272]
-	adrp	x2, .LANCHOR3
-	add	x2, x2, :lo12:.LANCHOR3
-	adrp	x1, .LC39
-	mov	w3, 2102
-	add	x2, x2, 32
-	add	x1, x1, :lo12:.LC39
-	.loc 1 2103 0
-	mov	w24, -12
-	.loc 1 2102 0
+.L621:
+.LBE1719:
+.LBE1756:
+	.loc 1 2442 0
+	adrp	x1, .LC76
+	mov	x0, x22
+	add	x1, x1, :lo12:.LC76
+	.loc 1 2443 0
+	mov	w25, -1
+	.loc 1 2442 0
 	bl	_dev_err
 .LVL682:
-	b	.L613
+	.loc 1 2443 0
+	b	.L595
 .LVL683:
-.L687:
-.LBE1709:
-.LBE1768:
-	.loc 1 2434 0
-	bl	__stack_chk_fail
+.L622:
+.LBB1757:
+.LBB1720:
+	.loc 1 2215 0
+	ldr	x0, [x19, 88]
 .LVL684:
-.L697:
-.LBB1769:
-.LBB1754:
-	.loc 1 2275 0
-	ldr	x0, [x21, 88]
-.LVL685:
-	adrp	x1, .LC52
-	adrp	x22, .LANCHOR1
-	add	x1, x1, :lo12:.LC52
+	adrp	x1, .LC75
+	.loc 1 2213 0
+	str	x24, [x19, 120]
+	.loc 1 2215 0
+	add	x1, x1, :lo12:.LC75
 	bl	_dev_err
+.LVL685:
+	b	.L621
 .LVL686:
-	b	.L620
+.L690:
+.LBE1720:
+.LBE1757:
+	.loc 1 2358 0
+	adrp	x1, .LC26
+	mov	x0, x22
+	add	x1, x1, :lo12:.LC26
+	.loc 1 2359 0
+	mov	w25, -19
+	.loc 1 2358 0
+	bl	_dev_err
 .LVL687:
-.L695:
-	.loc 1 2261 0
-	ldr	x0, [x21, 88]
+	.loc 1 2359 0
+	b	.L595
 .LVL688:
-	adrp	x1, .LC49
-	adrp	x22, .LANCHOR1
-	add	x1, x1, :lo12:.LC49
-	bl	_dev_err
+.L646:
+.LBB1758:
+.LBB1691:
+	.loc 1 2138 0
+	mov	w25, -19
+	b	.L614
 .LVL689:
-	b	.L620
+.L647:
+.LBE1691:
+.LBE1758:
+.LBB1759:
+.LBB1700:
+	.loc 1 2095 0
+	mov	w25, -19
+	b	.L618
 .LVL690:
-.L696:
-	.loc 1 2257 0
-	mov	w25, 1
+.L705:
+.LBE1700:
+.LBE1759:
+.LBB1760:
+.LBB1745:
+	.loc 1 2281 0
+	ldr	x0, [x19, 88]
 .LVL691:
-	b	.L637
-.LBE1754:
-.LBE1769:
+	adrp	x1, .LC54
+	adrp	x21, .LANCHOR1
+	add	x1, x1, :lo12:.LC54
+	bl	_dev_err
+.LVL692:
+	b	.L625
+.LVL693:
+.L696:
+.LBE1745:
+.LBE1760:
+.LBB1761:
+.LBB1701:
+	.loc 1 2108 0
+	ldr	x0, [x20, 272]
+	adrp	x2, .LANCHOR3
+	add	x2, x2, :lo12:.LANCHOR3
+	adrp	x1, .LC41
+	mov	w3, 2108
+	add	x2, x2, 32
+	add	x1, x1, :lo12:.LC41
+	.loc 1 2109 0
+	mov	w25, -12
+	.loc 1 2108 0
+	bl	_dev_err
+.LVL694:
+	b	.L618
+.LVL695:
+.L693:
+.LBE1701:
+.LBE1761:
+	.loc 1 2460 0
+	bl	__stack_chk_fail
+.LVL696:
+.L704:
+.LBB1762:
+.LBB1746:
+	.loc 1 2263 0
+	mov	w24, 1
+.LVL697:
+	b	.L642
+.LVL698:
+.L703:
+	.loc 1 2267 0
+	ldr	x0, [x19, 88]
+.LVL699:
+	adrp	x1, .LC51
+	adrp	x21, .LANCHOR1
+	add	x1, x1, :lo12:.LC51
+	bl	_dev_err
+.LVL700:
+	b	.L625
+.LBE1746:
+.LBE1762:
 	.cfi_endproc
 .LFE2848:
 	.size	ebc_probe, .-ebc_probe
@@ -8010,7 +7951,7 @@ ebc_power_set.constprop.12:
 .LFB2866:
 	.loc 1 180 0
 	.cfi_startproc
-.LVL692:
+.LVL701:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -8026,45 +7967,45 @@ ebc_power_set.constprop.12:
 	mov	x19, x0
 	.loc 1 186 0
 	ldr	w0, [x20, 424]
-.LVL693:
-	cbz	w0, .L701
-.L699:
+.LVL702:
+	cbz	w0, .L709
+.L707:
 	.loc 1 190 0
 	mov	w1, 1
 	str	w1, [x20, 184]
 	.loc 1 191 0
 	ldr	x2, [x19, 16]
-.LBB1770:
-.LBB1771:
+.LBB1763:
+.LBB1764:
 	.loc 3 30 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL694:
-.LBE1771:
-.LBE1770:
+.LVL703:
+.LBE1764:
+.LBE1763:
 	.loc 1 192 0
 	ldr	x2, [x19, 8]
-.LBB1772:
-.LBB1773:
+.LBB1765:
+.LBB1766:
 	.loc 11 46 0
 	add	x1, x19, 24
 	mov	x0, x2
 	ldr	x2, [x2, 48]
 	blr	x2
-.LVL695:
-.LBE1773:
-.LBE1772:
+.LVL704:
+.LBE1766:
+.LBE1765:
 	.loc 1 193 0
 	ldr	x0, [x19]
-	adrp	x1, .LC76
-	add	x1, x1, :lo12:.LC76
+	adrp	x1, .LC78
+	add	x1, x1, :lo12:.LC78
 	bl	_dev_info
-.LVL696:
+.LVL705:
 	.loc 1 208 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
-.LVL697:
+.LVL706:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -8073,22 +8014,22 @@ ebc_power_set.constprop.12:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL698:
+.LVL707:
 	.p2align 3
-.L701:
+.L709:
 	.cfi_restore_state
 	.loc 1 187 0
 	mov	w0, 1
 	str	w0, [x20, 424]
-.LBB1774:
-.LBB1775:
+.LBB1767:
+.LBB1768:
 	.loc 4 58 0
 	add	x0, x19, 400
 	bl	__pm_stay_awake
-.LVL699:
-	b	.L699
-.LBE1775:
-.LBE1774:
+.LVL708:
+	b	.L707
+.LBE1768:
+.LBE1767:
 	.cfi_endproc
 .LFE2866:
 	.size	ebc_power_set.constprop.12, .-ebc_power_set.constprop.12
@@ -8100,24 +8041,24 @@ refresh_new_image2:
 .LFB2807:
 	.loc 1 213 0
 	.cfi_startproc
-.LVL700:
+.LVL709:
 	.loc 1 220 0
 	ldp	w16, w5, [x4, 52]
-.LVL701:
+.LVL710:
 	cmp	w5, 0
 	add	w11, w5, 7
 	csel	w11, w11, w5, lt
-.LVL702:
+.LVL711:
 	.loc 1 222 0
 	cmp	w16, 0
 	.loc 1 220 0
 	asr	w11, w11, 3
-.LVL703:
+.LVL712:
 	.loc 1 222 0
-	ble	.L702
+	ble	.L710
 	sub	w14, w11, #1
 	mov	w15, 0
-.LVL704:
+.LVL713:
 	add	x14, x14, 1
 	.loc 1 267 0
 	mov	w13, 234881024
@@ -8125,92 +8066,92 @@ refresh_new_image2:
 	lsl	x14, x14, 2
 	.loc 1 273 0
 	mov	w12, -536870912
-.LVL705:
+.LVL714:
 	.p2align 2
-.L704:
+.L712:
 	.loc 1 223 0 discriminator 1
 	mov	x6, 0
 	cmp	w11, 0
-	bgt	.L725
-	b	.L722
-.LVL706:
+	bgt	.L733
+	b	.L730
+.LVL715:
 	.p2align 3
-.L705:
+.L713:
 	.loc 1 236 0
 	tst	x5, 65280
-	bne	.L706
+	bne	.L714
 	.loc 1 237 0
 	and	w10, w4, 240
 	cmp	w10, 224
-	beq	.L727
+	beq	.L735
 	.loc 1 240 0
 	orr	w7, w7, 240
-.L706:
+.L714:
 	.loc 1 242 0
 	tst	x5, 16711680
-	bne	.L708
+	bne	.L716
 	.loc 1 243 0
 	and	w10, w4, 3840
 	cmp	w10, 3584
-	beq	.L728
+	beq	.L736
 	.loc 1 246 0
 	orr	w7, w7, 3840
-.L708:
+.L716:
 	.loc 1 248 0
 	tst	x5, 4278190080
-	bne	.L710
+	bne	.L718
 	.loc 1 249 0
 	and	w10, w4, 61440
 	cmp	w10, 57344
-	beq	.L729
+	beq	.L737
 	.loc 1 252 0
 	orr	w7, w7, 61440
-.L710:
+.L718:
 	.loc 1 254 0
 	tst	x5, 1095216660480
-	bne	.L712
+	bne	.L720
 	.loc 1 255 0
 	and	w10, w4, 983040
 	cmp	w10, 917504
-	beq	.L730
+	beq	.L738
 	.loc 1 258 0
 	orr	w7, w7, 983040
-.L712:
+.L720:
 	.loc 1 260 0
 	tst	x5, 280375465082880
-	bne	.L714
+	bne	.L722
 	.loc 1 261 0
 	and	w10, w4, 15728640
 	cmp	w10, 14680064
-	beq	.L731
+	beq	.L739
 	.loc 1 264 0
 	orr	w7, w7, 15728640
-.L714:
+.L722:
 	.loc 1 266 0
 	tst	x5, 71776119061217280
-	bne	.L716
+	bne	.L724
 	.loc 1 267 0
 	and	w10, w4, 251658240
 	cmp	w10, w13
-	beq	.L732
+	beq	.L740
 	.loc 1 270 0
 	orr	w7, w7, 251658240
-.L716:
+.L724:
 	.loc 1 272 0
 	tst	x5, -72057594037927936
-	bne	.L718
+	bne	.L726
 	.loc 1 273 0
 	and	w5, w4, -268435456
-.LVL707:
+.LVL716:
 	cmp	w5, w12
-	beq	.L733
+	beq	.L741
 	.loc 1 276 0
 	orr	w7, w7, -268435456
-.LVL708:
-.L718:
+.LVL717:
+.L726:
 	.loc 1 280 0 discriminator 2
 	and	w4, w4, w9
-.LVL709:
+.LVL718:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
@@ -8219,54 +8160,54 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 223 0 discriminator 2
 	cmp	w11, w6
-	ble	.L734
-.LVL710:
-.L725:
+	ble	.L742
+.LVL719:
+.L733:
 	.loc 1 224 0
 	ldr	x5, [x3, x6, lsl 3]
 	.loc 1 228 0
 	mov	w7, 0
 	.loc 1 225 0
 	ldr	w4, [x1, x6, lsl 2]
-.LVL711:
+.LVL720:
 	.loc 1 226 0
 	ldr	w8, [x0, x6, lsl 2]
 	.loc 1 230 0
 	and	x10, x5, 255
 	.loc 1 227 0
 	ldr	w9, [x2, x6, lsl 2]
-.LVL712:
+.LVL721:
 	.loc 1 230 0
-	cbnz	x10, .L705
-.LVL713:
+	cbnz	x10, .L713
+.LVL722:
 	.loc 1 231 0
 	and	w10, w4, 15
 	.loc 1 234 0
 	mov	w7, 15
 	.loc 1 231 0
 	cmp	w10, 14
-	bne	.L705
+	bne	.L713
 	.loc 1 232 0
 	orr	w8, w8, w7
-.LVL714:
+.LVL723:
 	.loc 1 228 0
 	mov	w7, 0
-.LVL715:
-	b	.L705
+.LVL724:
+	b	.L713
 	.p2align 3
-.L732:
+.L740:
 	.loc 1 268 0
 	orr	w8, w8, 251658240
-	b	.L716
-.LVL716:
+	b	.L724
+.LVL725:
 	.p2align 3
-.L733:
+.L741:
 	.loc 1 274 0
 	orr	w8, w8, -268435456
-.LVL717:
+.LVL726:
 	.loc 1 280 0
 	and	w4, w4, w9
-.LVL718:
+.LVL727:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
@@ -8275,48 +8216,48 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 223 0
 	cmp	w11, w6
-	bgt	.L725
-.LVL719:
+	bgt	.L733
+.LVL728:
 	.p2align 2
-.L734:
+.L742:
 	add	x3, x3, x17
 	add	x1, x1, x14
 	add	x2, x2, x14
 	add	x0, x0, x14
-.LVL720:
-.L722:
+.LVL729:
+.L730:
 	.loc 1 222 0 discriminator 2
 	add	w15, w15, 1
 	cmp	w16, w15
-	bne	.L704
-.L702:
+	bne	.L712
+.L710:
 	ret
-.LVL721:
+.LVL730:
 	.p2align 3
-.L728:
+.L736:
 	.loc 1 244 0
 	orr	w8, w8, 3840
-	b	.L708
+	b	.L716
 	.p2align 3
-.L729:
+.L737:
 	.loc 1 250 0
 	orr	w8, w8, 61440
-	b	.L710
+	b	.L718
 	.p2align 3
-.L730:
+.L738:
 	.loc 1 256 0
 	orr	w8, w8, 983040
-	b	.L712
+	b	.L720
 	.p2align 3
-.L731:
+.L739:
 	.loc 1 262 0
 	orr	w8, w8, 15728640
-	b	.L714
+	b	.L722
 	.p2align 3
-.L727:
+.L735:
 	.loc 1 238 0
 	orr	w8, w8, 240
-	b	.L706
+	b	.L714
 	.cfi_endproc
 .LFE2807:
 	.size	refresh_new_image2, .-refresh_new_image2
@@ -8328,52 +8269,52 @@ refresh_new_image_auto:
 .LFB2808:
 	.loc 1 288 0
 	.cfi_startproc
-.LVL722:
+.LVL731:
 	.loc 1 295 0
 	ldp	w13, w4, [x3, 52]
 	cmp	w4, 0
 	add	w9, w4, 7
 	csel	w9, w9, w4, lt
-.LVL723:
+.LVL732:
 	.loc 1 297 0
 	cmp	w13, 0
 	.loc 1 295 0
 	asr	w9, w9, 3
-.LVL724:
+.LVL733:
 	.loc 1 297 0
-	ble	.L735
+	ble	.L743
 	sub	w12, w9, #1
 	mov	w11, 0
-.LVL725:
+.LVL734:
 	add	x12, x12, 1
 	.loc 1 305 0
 	mov	w10, 15
 	lsl	x14, x12, 3
 	lsl	x12, x12, 2
 	.p2align 2
-.L737:
+.L745:
 	.loc 1 298 0 discriminator 1
 	mov	x6, 0
 	cmp	w9, 0
-	ble	.L748
+	ble	.L756
 	.p2align 2
-.L750:
+.L758:
 	.loc 1 299 0
 	ldr	x4, [x2, x6, lsl 3]
-.LVL726:
+.LVL735:
 	.loc 1 301 0
 	ldr	w7, [x0, x6, lsl 2]
 	.loc 1 300 0
 	ldr	w3, [x1, x6, lsl 2]
-.LVL727:
+.LVL736:
 	.loc 1 304 0
 	and	x5, x4, 255
 	.loc 1 305 0
 	cmp	x5, 0
-.LVL728:
+.LVL737:
 	eor	w5, w3, w7
 	csel	w3, wzr, w10, ne
-.LVL729:
+.LVL738:
 	.loc 1 308 0
 	orr	w8, w3, 240
 	tst	x4, 65280
@@ -8401,10 +8342,10 @@ refresh_new_image_auto:
 	.loc 1 326 0
 	tst	x4, -72057594037927936
 	orr	w4, w3, -268435456
-.LVL730:
+.LVL739:
 	csel	w3, w4, w3, eq
 	and	w3, w5, w3
-.LVL731:
+.LVL740:
 	.loc 1 329 0
 	eor	w3, w3, w7
 	.loc 1 330 0
@@ -8412,17 +8353,17 @@ refresh_new_image_auto:
 	add	x6, x6, 1
 	.loc 1 298 0
 	cmp	w9, w6
-	bgt	.L750
+	bgt	.L758
 	add	x2, x2, x14
 	add	x1, x1, x12
 	add	x0, x0, x12
-.LVL732:
-.L748:
+.LVL741:
+.L756:
 	.loc 1 297 0 discriminator 2
 	add	w11, w11, 1
 	cmp	w13, w11
-	bne	.L737
-.L735:
+	bne	.L745
+.L743:
 	ret
 	.cfi_endproc
 .LFE2808:
@@ -8435,7 +8376,7 @@ new_buffer_refresh:
 .LFB2809:
 	.loc 1 336 0
 	.cfi_startproc
-.LVL733:
+.LVL742:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -8452,35 +8393,35 @@ new_buffer_refresh:
 	adrp	x20, .LANCHOR1
 	.loc 1 337 0
 	ldr	x19, [x1, #:lo12:.LANCHOR0]
-.LVL734:
+.LVL743:
 	.loc 1 340 0
 	add	x0, x20, :lo12:.LANCHOR1
-.LVL735:
+.LVL744:
 	add	x0, x0, 624
 	bl	down_write
-.LVL736:
+.LVL745:
 	.loc 1 338 0
 	add	x19, x19, 184
-.LVL737:
+.LVL746:
 	.loc 1 341 0
 	ldr	x0, [x19, 208]
 	ldr	w5, [x0, 40]
-	cbz	w5, .L756
+	cbz	w5, .L764
 	.loc 1 347 0
 	ldr	x1, [x0, 16]
 	mov	x4, x19
 	ldp	x2, x3, [x19, 144]
 	ldr	x0, [x19, 128]
 	bl	refresh_new_image2
-.LVL738:
+.LVL747:
 	.loc 1 352 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 624
 	bl	up_write
-.LVL739:
+.LVL748:
 	.loc 1 353 0
 	ldp	x19, x20, [sp, 16]
-.LVL740:
+.LVL749:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -8489,9 +8430,9 @@ new_buffer_refresh:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL741:
+.LVL750:
 	.p2align 3
-.L756:
+.L764:
 	.cfi_restore_state
 	.loc 1 342 0
 	ldr	x1, [x0, 16]
@@ -8499,15 +8440,15 @@ new_buffer_refresh:
 	ldr	x2, [x19, 152]
 	ldr	x0, [x19, 128]
 	bl	refresh_new_image_auto
-.LVL742:
+.LVL751:
 	.loc 1 352 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 624
 	bl	up_write
-.LVL743:
+.LVL752:
 	.loc 1 353 0
 	ldp	x19, x20, [sp, 16]
-.LVL744:
+.LVL753:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -8525,7 +8466,7 @@ ebc_thread:
 .LFB2826:
 	.loc 1 1324 0
 	.cfi_startproc
-.LVL745:
+.LVL754:
 	stp	x29, x30, [sp, -224]!
 	.cfi_def_cfa_offset 224
 	.cfi_offset 29, -224
@@ -8546,19 +8487,19 @@ ebc_thread:
 	adrp	x21, .LANCHOR1
 	.loc 1 1325 0
 	ldr	x20, [x1, #:lo12:.LANCHOR0]
-.LVL746:
+.LVL755:
 	.loc 1 1324 0
 	add	x0, x22, :lo12:__stack_chk_guard
-.LVL747:
+.LVL756:
 	stp	x25, x26, [sp, 64]
-.LBB1798:
-.LBB1799:
-.LBB1800:
-	.loc 1 1616 0
+.LBB1791:
+.LBB1792:
+.LBB1793:
+	.loc 1 1622 0
 	add	x21, x21, :lo12:.LANCHOR1
-.LBE1800:
-.LBE1799:
-.LBE1798:
+.LBE1793:
+.LBE1792:
+.LBE1791:
 	.loc 1 1324 0
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 23, -176
@@ -8569,82 +8510,186 @@ ebc_thread:
 	.cfi_offset 28, -136
 	.loc 1 1326 0
 	add	x24, x20, 184
-.LBB1805:
-.LBB1803:
-.LBB1801:
-	.loc 1 1616 0
+.LBB1798:
+.LBB1796:
+.LBB1794:
+	.loc 1 1622 0
 	add	x19, x21, 304
-.LBE1801:
-.LBE1803:
-.LBE1805:
+.LBE1794:
+.LBE1796:
+.LBE1798:
 	.loc 1 1329 0
 	mov	w23, 0
-.LVL748:
+.LVL757:
 	.loc 1 1324 0
 	ldr	x1, [x0]
 	str	x1, [x29, 216]
 	mov	x1,0
-.LVL749:
+.LVL758:
 	.p2align 2
-.L758:
+.L766:
 	.loc 1 1334 0
 	ldr	w0, [x24, 600]
-.LVL750:
-	cbnz	w0, .L886
-.L759:
+.LVL759:
+	cbnz	w0, .L895
+.L767:
 	.loc 1 1340 0
 	bl	ebc_dsp_buf_get
-.LVL751:
+.LVL760:
 	mov	x28, x0
 	.loc 1 1342 0
-	cbz	x0, .L761
+	cbz	x0, .L769
 	.loc 1 1342 0 is_stmt 0 discriminator 1
 	ldr	x1, [x0, 8]
-	cbz	x1, .L761
+	cbz	x1, .L769
 	.loc 1 1343 0 is_stmt 1
 	ldr	w1, [x0, 40]
 	cmp	w1, 20
-	beq	.L887
+	beq	.L896
 	.loc 1 1347 0
 	ldr	x2, [x24, 592]
-	cbz	x2, .L764
+	cbz	x2, .L772
 	.loc 1 1348 0
 	cmp	w1, 19
+	beq	.L897
+	.loc 1 1353 0
+	mov	w2, 18
+	tst	w1, w2
 	beq	.L888
-.L879:
-	.loc 1 1405 0
-	bl	ebc_remove_from_dsp_buf_list
-.LVL752:
-	.loc 1 1406 0
+	.loc 1 1354 0
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC80
+	add	x1, x1, :lo12:.LC80
+	bl	_dev_info
+.LVL761:
+.L771:
+	.loc 1 1387 0
+	adrp	x25, jiffies
+.LVL762:
+	mov	x1, 402653184
+	add	x0, x20, 616
+	ldr	x2, [x25, #:lo12:jiffies]
+	add	x1, x2, x1
+	bl	mod_timer
+.LVL763:
+	.loc 1 1389 0
+	ldr	w0, [x24, 428]
+	cbz	w0, .L778
+	ldr	x0, [x24, 200]
+.L779:
+	.loc 1 1392 0
+	ldr	w2, [x0, 40]
+	ldr	w3, [x28, 40]
+	cmp	w3, w2
+	beq	.L780
+	.loc 1 1393 0
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC82
+	add	x1, x1, :lo12:.LC82
+	bl	_dev_info
+.LVL764:
+	.loc 1 1394 0
+	ldr	w0, [x24, 28]
+	cmp	w0, 1
+	beq	.L898
+.L889:
+	ldr	w2, [x28, 40]
+.L780:
+	.loc 1 1401 0
+	cmp	w2, 11
+	bgt	.L787
+	cmp	w2, 7
+	bge	.L788
+	cmp	w2, 1
+	beq	.L789
+	bgt	.L859
+	cbnz	w2, .L786
+	.loc 1 1446 0
+	add	x0, x21, 624
+	bl	down_write
+.LVL765:
+	.loc 1 1452 0
+	ldr	x0, [x24, 200]
+	.loc 1 1447 0
+	str	x28, [x24, 208]
+	.loc 1 1452 0
+	ldr	w0, [x0, 40]
+	cmp	w0, 1
+	bls	.L823
+	.loc 1 1454 0
+	ldrsw	x2, [x24, 20]
+	ldr	x1, [x28, 16]
+	ldr	x0, [x24, 128]
+	bl	memcpy
+.LVL766:
+	.loc 1 1455 0
+	ldr	x0, [x24, 200]
+	ldrsw	x2, [x24, 20]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x24, 136]
+	bl	memcpy
+.LVL767:
+.L824:
+	.loc 1 1461 0
+	add	x0, x21, 624
+	bl	up_write
+.LVL768:
+	.loc 1 1463 0
+	ldr	w0, [x24, 28]
+	cbz	w0, .L899
+.LVL769:
+	.p2align 2
+.L801:
+	.loc 1 1583 0
+	ldr	x0, [x24, 208]
+	ldr	w0, [x0, 40]
+	cmp	w0, 20
+	beq	.L900
+.L840:
+	.loc 1 1589 0
+	cmp	w0, 18
+	beq	.L901
+.L841:
+	.loc 1 1598 0
 	mov	x0, x28
-	bl	ebc_buf_release
-.LVL753:
+	bl	ebc_remove_from_dsp_buf_list
+.LVL770:
+	.loc 1 1600 0
+	ldr	w0, [x24, 428]
+	cbnz	w0, .L902
+.L842:
+	.loc 1 1603 0
+	mov	w0, 1
+	str	w0, [x24, 428]
+.L843:
+	.loc 1 1605 0
+	ldr	x0, [x24, 208]
+	str	x0, [x24, 200]
 	.loc 1 1334 0
 	ldr	w0, [x24, 600]
-	cbz	w0, .L759
-	.p2align 2
-.L886:
+	cbz	w0, .L767
+.L895:
 	.loc 1 1335 0
 	ldr	w0, [x24, 184]
 	cmp	w0, 1
-	beq	.L889
-.L760:
-	.loc 1 1622 0
+	beq	.L903
+.L768:
+	.loc 1 1628 0
 	add	x22, x22, :lo12:__stack_chk_guard
 	mov	w0, 0
 	ldr	x2, [x29, 216]
 	ldr	x1, [x22]
 	eor	x1, x2, x1
-	cbnz	x1, .L890
+	cbnz	x1, .L904
 	ldp	x19, x20, [sp, 16]
-.LVL754:
+.LVL771:
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
-.LVL755:
+.LVL772:
 	ldp	x25, x26, [sp, 64]
-.LVL756:
+.LVL773:
 	ldp	x27, x28, [sp, 80]
-.LVL757:
+.LVL774:
 	ldp	x29, x30, [sp], 224
 	.cfi_remember_state
 	.cfi_restore 30
@@ -8661,320 +8706,188 @@ ebc_thread:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL758:
+.LVL775:
 	.p2align 3
-.L761:
+.L769:
 	.cfi_restore_state
-	.loc 1 1603 0
+	.loc 1 1609 0
 	ldr	w0, [x24, 28]
-.LVL759:
+.LVL776:
 	cmp	w0, 1
-	beq	.L891
-	.loc 1 1612 0
+	beq	.L905
+	.loc 1 1618 0
 	ldr	w0, [x24, 184]
 	cmp	w0, 1
-	beq	.L892
-.LVL760:
-.L882:
+	beq	.L906
+.LVL777:
+.L891:
 	ldr	w0, [x24, 80]
-.LVL761:
-	.loc 1 1615 0
-	cbz	w0, .L893
-.L845:
-.LVL762:
-.L835:
-	.loc 1 1617 0
+.LVL778:
+	.loc 1 1621 0
+	cbz	w0, .L907
+.L854:
+.LVL779:
+.L844:
+	.loc 1 1623 0
 	str	wzr, [x24, 80]
-	b	.L758
-.LVL763:
+	b	.L766
+.LVL780:
 	.p2align 3
-.L893:
-.LBB1806:
-.LBB1804:
-	.loc 1 1616 0 discriminator 1
+.L907:
+.LBB1799:
+.LBB1797:
+	.loc 1 1622 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL764:
-	b	.L846
+.LVL781:
+	b	.L855
 	.p2align 3
-.L894:
-.LVL765:
-.LBB1802:
-	.loc 1 1616 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L835
-	.loc 1 1616 0 discriminator 7
+.L908:
+.LVL782:
+.LBB1795:
+	.loc 1 1622 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L844
+	.loc 1 1622 0 discriminator 7
 	bl	schedule
-.LVL766:
-.L846:
-	.loc 1 1616 0 discriminator 9
+.LVL783:
+.L855:
+	.loc 1 1622 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL767:
+.LVL784:
 	ldr	w1, [x24, 80]
-	cbz	w1, .L894
-.LBE1802:
-	.loc 1 1616 0 discriminator 4
+	cbz	w1, .L908
+.LBE1795:
+	.loc 1 1622 0 discriminator 4
 	add	x1, x29, 112
 	mov	x0, x19
 	bl	finish_wait
-.LVL768:
-.LBE1804:
-.LBE1806:
-	.loc 1 1617 0 is_stmt 1 discriminator 4
+.LVL785:
+.LBE1797:
+.LBE1799:
+	.loc 1 1623 0 is_stmt 1 discriminator 4
 	str	wzr, [x24, 80]
-	b	.L758
-.LVL769:
+	b	.L766
+.LVL786:
 	.p2align 3
-.L764:
-	.loc 1 1360 0
+.L778:
+	.loc 1 1390 0
+	mov	x0, x28
+	str	x28, [x24, 200]
+	b	.L779
+.LVL787:
+	.p2align 3
+.L772:
+	.loc 1 1363 0
 	cmp	w1, 18
 	ccmp	w1, 21, 4, ne
-	bne	.L767
-	.loc 1 1361 0
+	bne	.L776
+	.loc 1 1364 0
 	str	wzr, [x24, 608]
-.L763:
-	.loc 1 1384 0
-	adrp	x25, jiffies
-.LVL770:
-	mov	x1, 402653184
-	add	x0, x20, 616
-	ldr	x2, [x25, #:lo12:jiffies]
-	add	x1, x2, x1
-	bl	mod_timer
-.LVL771:
-	.loc 1 1386 0
-	ldr	w0, [x24, 428]
-	cbz	w0, .L769
-	ldr	x0, [x24, 200]
-.L770:
-	.loc 1 1389 0
-	ldr	w2, [x0, 40]
-	ldr	w3, [x28, 40]
-	cmp	w3, w2
-	beq	.L771
-	.loc 1 1390 0
-	ldr	x0, [x24, 88]
-	adrp	x1, .LC79
-	add	x1, x1, :lo12:.LC79
-	bl	_dev_info
-.LVL772:
-	.loc 1 1391 0
-	ldr	w0, [x24, 28]
-	cmp	w0, 1
-	beq	.L895
-.L880:
-	ldr	w2, [x28, 40]
-.L771:
-	.loc 1 1398 0
-	cmp	w2, 11
-	bgt	.L778
-	cmp	w2, 7
-	bge	.L779
-	cmp	w2, 1
-	beq	.L780
-	bgt	.L850
-	cbnz	w2, .L777
-	.loc 1 1443 0
-	add	x0, x21, 624
-	bl	down_write
-.LVL773:
-	.loc 1 1449 0
-	ldr	x0, [x24, 200]
-	.loc 1 1444 0
-	str	x28, [x24, 208]
-	.loc 1 1449 0
-	ldr	w0, [x0, 40]
-	cmp	w0, 1
-	bls	.L814
-	.loc 1 1451 0
-	ldrsw	x2, [x24, 20]
-	ldr	x1, [x28, 16]
-	ldr	x0, [x24, 128]
-	bl	memcpy
-.LVL774:
-	.loc 1 1452 0
-	ldr	x0, [x24, 200]
-	ldrsw	x2, [x24, 20]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x24, 136]
-	bl	memcpy
-.LVL775:
-.L815:
-	.loc 1 1458 0
-	add	x0, x21, 624
-	bl	up_write
-.LVL776:
-	.loc 1 1460 0
-	ldr	w0, [x24, 28]
-	cbnz	w0, .L792
-	.loc 1 1461 0
-	mov	w0, 1
-	str	w0, [x24, 28]
-	.loc 1 1463 0
-	ldr	w0, [x24, 184]
-	.loc 1 1462 0
-	str	wzr, [x24, 76]
-	.loc 1 1463 0
-	cbz	w0, .L896
-.L816:
-	.loc 1 1465 0
-	mov	x0, x20
-	bl	ebc_lut_update
-.LVL777:
-	cmn	w0, #1
-	beq	.L897
-	.loc 1 1473 0
-	ldr	x0, [x24, 88]
-	adrp	x1, .LC85
-	.loc 1 1470 0
-	ldr	w3, [x24, 96]
-	.loc 1 1473 0
-	add	x1, x1, :lo12:.LC85
-	.loc 1 1470 0
-	strb	w3, [x24, 32]
-.LVL778:
-.L881:
-	.loc 1 1473 0
-	and	w2, w3, 255
-	.loc 1 1471 0
-	lsr	w3, w3, 8
-	strb	w3, [x24, 33]
-	.loc 1 1473 0
-	bl	_dev_info
-.LVL779:
-	.loc 1 1474 0
-	mov	x0, x20
-	bl	ebc_frame_start
-.LVL780:
-	.loc 1 1577 0
-	ldr	x0, [x24, 208]
-	ldr	w0, [x0, 40]
-	cmp	w0, 20
-	bne	.L831
-.LVL781:
-.L902:
-	.loc 1 1580 0
+	b	.L771
+.LVL788:
+.L792:
+	.loc 1 1401 0
+	cmp	w2, 21
+	ble	.L859
+.L786:
+	.loc 1 1572 0
 	ldr	x0, [x24, 88]
-	.loc 1 1578 0
-	mov	w25, 1
-.LVL782:
-	.loc 1 1579 0
-	str	wzr, [x24, 188]
-	.loc 1 1580 0
-	adrp	x1, .LC88
-	.loc 1 1578 0
-	str	w25, [x24, 600]
-	.loc 1 1580 0
-	add	x1, x1, :lo12:.LC88
-	bl	_dev_info
-.LVL783:
-	.loc 1 1581 0
-	mov	w2, w25
-	mov	w1, w25
-	add	x0, x21, 328
-	bl	__wake_up_sync
-.LVL784:
-	.loc 1 1592 0
+	adrp	x1, .LC90
+	add	x1, x1, :lo12:.LC90
+	bl	_dev_err
+.LVL789:
+	.loc 1 1573 0
 	mov	x0, x28
+.LVL790:
+.L888:
 	bl	ebc_remove_from_dsp_buf_list
-.LVL785:
-	.loc 1 1594 0
-	ldr	w0, [x24, 428]
-	cbz	w0, .L833
-.LVL786:
-	.p2align 2
-.L904:
-	.loc 1 1595 0
-	ldr	x0, [x24, 200]
-	bl	ebc_buf_release
-.LVL787:
-	b	.L834
-.LVL788:
-	.p2align 3
-.L769:
-	.loc 1 1387 0
+.LVL791:
+	.loc 1 1574 0
 	mov	x0, x28
-	str	x28, [x24, 200]
-	b	.L770
-.LVL789:
+	bl	ebc_buf_release
+.LVL792:
+	.loc 1 1576 0
+	b	.L766
+.LVL793:
 	.p2align 3
-.L887:
+.L896:
 	.loc 1 1345 0
 	str	wzr, [x24, 604]
 	.loc 1 1344 0
 	str	wzr, [x24, 608]
-	b	.L763
-.LVL790:
+	b	.L771
+.LVL794:
 	.p2align 3
-.L778:
-	.loc 1 1398 0
+.L787:
+	.loc 1 1401 0
 	cmp	w2, 15
-	bgt	.L783
+	bgt	.L792
 	cmp	w2, 14
-	bge	.L779
-.L850:
-	.loc 1 1499 0
+	bge	.L788
+.L859:
+	.loc 1 1502 0
 	ldr	x26, [x24, 200]
-	.loc 1 1490 0
+	.loc 1 1493 0
 	mov	w7, 1
-.LVL791:
-	.loc 1 1500 0
+.LVL795:
+	.loc 1 1503 0
 	ldr	w0, [x26, 40]
 	cmp	w0, 1
-	bls	.L898
-.L818:
-	.loc 1 1511 0
+	bls	.L909
+.L827:
+	.loc 1 1514 0
 	str	wzr, [x24, 76]
-	.loc 1 1512 0
-	str	x28, [x24, 208]
 	.loc 1 1515 0
+	str	x28, [x24, 208]
+	.loc 1 1518 0
 	ldr	w0, [x28, 40]
 	sub	w0, w0, #2
-	.loc 1 1514 0
-	cmp	w0, 14
-	bhi	.L819
-.L899:
 	.loc 1 1517 0
+	cmp	w0, 14
+	bhi	.L828
+.L910:
+	.loc 1 1520 0
 	ldr	x0, [x24, 200]
-.LBB1807:
-.LBB1808:
+.LBB1800:
+.LBB1801:
 	.loc 1 1309 0
 	ldr	w1, [x24, 20]
-.LBE1808:
-.LBE1807:
-	.loc 1 1516 0
+.LBE1801:
+.LBE1800:
+	.loc 1 1519 0
 	ldr	x4, [x28, 16]
-.LBB1811:
-.LBB1809:
+.LBB1804:
+.LBB1802:
 	.loc 1 1309 0
 	cmp	w1, 0
-.LBE1809:
-.LBE1811:
-	.loc 1 1517 0
+.LBE1802:
+.LBE1804:
+	.loc 1 1520 0
 	ldr	x5, [x0, 16]
-.LBB1812:
-.LBB1810:
+.LBB1805:
+.LBB1803:
 	.loc 1 1309 0
 	add	w0, w1, 7
 	csel	w0, w0, w1, lt
 	asr	w0, w0, 3
 	cmp	w0, 0
-	ble	.L820
+	ble	.L829
 	.loc 1 1313 0
 	ldr	x1, [x4]
 	ldr	x2, [x5]
 	cmp	x2, x1
-	bne	.L819
+	bne	.L828
 	sub	w1, w0, #1
 	mov	x0, 8
 	add	x1, x1, 1
 	lsl	x1, x1, 3
-	b	.L822
+	b	.L831
 	.p2align 3
-.L823:
+.L832:
 	.loc 1 1310 0
 	ldr	x3, [x4, x0]
 	add	x0, x0, 8
@@ -8983,205 +8896,226 @@ ebc_thread:
 	.loc 1 1313 0
 	ldr	x2, [x2, -8]
 	cmp	x3, x2
-	bne	.L819
-.L822:
+	bne	.L828
+.L831:
 	.loc 1 1309 0
 	cmp	x1, x0
-	bne	.L823
-.L820:
-.LBE1810:
-.LBE1812:
-	.loc 1 1519 0
+	bne	.L832
+.L829:
+.LBE1803:
+.LBE1805:
+	.loc 1 1522 0
 	ldr	x0, [x24, 88]
-	adrp	x1, .LC90
-	add	x1, x1, :lo12:.LC90
+	adrp	x1, .LC93
+	add	x1, x1, :lo12:.LC93
 	bl	_dev_info
-.LVL792:
-	.loc 1 1521 0
+.LVL796:
+	.loc 1 1524 0
 	str	x26, [x24, 200]
-	.loc 1 1523 0
-	b	.L792
+	.loc 1 1583 0
+	ldr	x0, [x24, 208]
+	ldr	w0, [x0, 40]
+	cmp	w0, 20
+	bne	.L840
+.LVL797:
+.L900:
+	.loc 1 1586 0
+	ldr	x0, [x24, 88]
+	.loc 1 1584 0
+	mov	w25, 1
+.LVL798:
+	.loc 1 1585 0
+	str	wzr, [x24, 188]
+	.loc 1 1586 0
+	adrp	x1, .LC91
+	.loc 1 1584 0
+	str	w25, [x24, 600]
+	.loc 1 1586 0
+	add	x1, x1, :lo12:.LC91
+	bl	_dev_info
+.LVL799:
+	.loc 1 1587 0
+	mov	w2, w25
+	mov	w1, w25
+	add	x0, x21, 328
+	bl	__wake_up_sync
+.LVL800:
+	.loc 1 1598 0
+	mov	x0, x28
+	bl	ebc_remove_from_dsp_buf_list
+.LVL801:
+	.loc 1 1600 0
+	ldr	w0, [x24, 428]
+	cbz	w0, .L842
+.LVL802:
+	.p2align 2
+.L902:
+	.loc 1 1601 0
+	ldr	x0, [x24, 200]
+	bl	ebc_buf_release
+.LVL803:
+	b	.L843
+.LVL804:
 	.p2align 3
-.L779:
-	.loc 1 1499 0
+.L788:
+	.loc 1 1502 0
 	ldr	x26, [x24, 200]
-	.loc 1 1398 0
+	.loc 1 1401 0
 	mov	w7, 0
-.LVL793:
-	.loc 1 1500 0
+.LVL805:
+	.loc 1 1503 0
 	ldr	w0, [x26, 40]
 	cmp	w0, 1
-	bhi	.L818
-.L898:
-	.loc 1 1505 0
+	bhi	.L827
+.L909:
+	.loc 1 1508 0
 	add	x0, x29, 152
-	.loc 1 1511 0
+	.loc 1 1514 0
 	str	wzr, [x24, 76]
-	.loc 1 1505 0
+	.loc 1 1508 0
 	str	x0, [x24, 200]
-	.loc 1 1512 0
+	.loc 1 1515 0
 	str	x28, [x24, 208]
-	.loc 1 1506 0
+	.loc 1 1509 0
 	ldr	x0, [x24, 136]
 	str	x0, [x29, 168]
-	.loc 1 1515 0
+	.loc 1 1518 0
 	ldr	w0, [x28, 40]
 	sub	w0, w0, #2
-	.loc 1 1514 0
+	.loc 1 1517 0
 	cmp	w0, 14
-	bls	.L899
+	bls	.L910
 	.p2align 2
-.L819:
-	.loc 1 1527 0
-	cbnz	w7, .L854
-	.loc 1 1531 0
+.L828:
+	.loc 1 1530 0
+	cbnz	w7, .L863
+	.loc 1 1534 0
 	ldr	w0, [x24, 48]
 	cmp	w0, 0
-	ble	.L824
-	.loc 1 1532 0
+	ble	.L833
+	.loc 1 1535 0
 	add	w23, w23, 1
-	.loc 1 1533 0
+	.loc 1 1536 0
 	cmp	w0, w23
-	ble	.L900
-.L824:
-	.loc 1 1539 0
-	ldr	w0, [x24, 184]
-	cbz	w0, .L901
-.L825:
+	bgt	.L833
+	.loc 1 1537 0
+	mov	w0, 2
+	.loc 1 1538 0
+	mov	w23, 0
+	.loc 1 1537 0
+	str	w0, [x28, 40]
+.L833:
 	.loc 1 1542 0
+	ldr	w0, [x24, 184]
+	cbz	w0, .L911
+.L834:
+	.loc 1 1545 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL794:
-	cbz	w0, .L826
-	.loc 1 1543 0
+.LVL806:
+	cbz	w0, .L835
+	.loc 1 1546 0
 	ldr	x0, [x24, 88]
-	adrp	x1, .LC84
-	add	x1, x1, :lo12:.LC84
+	adrp	x1, .LC87
+	add	x1, x1, :lo12:.LC87
 	bl	_dev_err
-.LVL795:
-	.loc 1 1545 0
+.LVL807:
+	.loc 1 1548 0
 	str	x26, [x24, 200]
-.LVL796:
-	.p2align 2
-.L792:
-	.loc 1 1577 0
-	ldr	x0, [x24, 208]
-	ldr	w0, [x0, 40]
-	cmp	w0, 20
-	beq	.L902
-.L831:
-	.loc 1 1583 0
-	cmp	w0, 18
-	beq	.L903
-.L832:
-	.loc 1 1592 0
-	mov	x0, x28
-	bl	ebc_remove_from_dsp_buf_list
-.LVL797:
-	.loc 1 1594 0
-	ldr	w0, [x24, 428]
-	cbnz	w0, .L904
-.L833:
-	.loc 1 1597 0
-	mov	w0, 1
-	str	w0, [x24, 428]
-.L834:
-	.loc 1 1599 0
-	ldr	x0, [x24, 208]
-	str	x0, [x24, 200]
-	.loc 1 1600 0
-	b	.L758
+	.loc 1 1549 0
+	b	.L801
+.LVL808:
 	.p2align 3
-.L891:
-.LBB1813:
-	.loc 1 1604 0 discriminator 1
+.L905:
+.LBB1806:
+	.loc 1 1610 0 discriminator 1
 	ldr	w0, [x24, 80]
-	cbnz	w0, .L835
-.LBB1814:
-	.loc 1 1604 0 is_stmt 0 discriminator 3
+	cbnz	w0, .L844
+.LBB1807:
+	.loc 1 1610 0 is_stmt 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL798:
-	b	.L839
+.LVL809:
+	b	.L848
 	.p2align 3
-.L905:
-.LBB1815:
-	.loc 1 1604 0 discriminator 7
+.L912:
+.LBB1808:
+	.loc 1 1610 0 discriminator 7
 	ldr	w1, [x24, 80]
-	cbnz	w1, .L836
-.LVL799:
-	.loc 1 1604 0 discriminator 9
-	cbnz	x0, .L882
-	.loc 1 1604 0 discriminator 11
+	cbnz	w1, .L845
+.LVL810:
+	.loc 1 1610 0 discriminator 9
+	cbnz	x0, .L891
+	.loc 1 1610 0 discriminator 11
 	bl	schedule
-.LVL800:
-.L839:
-	.loc 1 1604 0 discriminator 13
+.LVL811:
+.L848:
+	.loc 1 1610 0 discriminator 13
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL801:
+.LVL812:
 	ldr	w1, [x24, 28]
-	cbnz	w1, .L905
-.L836:
-.LBE1815:
-	.loc 1 1604 0 discriminator 8
+	cbnz	w1, .L912
+.L845:
+.LBE1808:
+	.loc 1 1610 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL802:
+.LVL813:
 	ldr	w0, [x24, 28]
-.LBE1814:
-.LBE1813:
-	.loc 1 1607 0 is_stmt 1 discriminator 8
-	cbnz	w0, .L882
-	.loc 1 1612 0
+.LBE1807:
+.LBE1806:
+	.loc 1 1613 0 is_stmt 1 discriminator 8
+	cbnz	w0, .L891
+	.loc 1 1618 0
 	ldr	w0, [x24, 184]
 	cmp	w0, 1
-	bne	.L882
+	bne	.L891
 	.p2align 2
-.L892:
-.LBB1816:
-.LBB1817:
+.L906:
+.LBB1809:
+.LBB1810:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
-.LVL803:
-	b	.L882
-.LVL804:
+.LVL814:
+	b	.L891
+.LVL815:
 	.p2align 3
-.L767:
-.LBE1817:
-.LBE1816:
-	.loc 1 1363 0
+.L776:
+.LBE1810:
+.LBE1809:
+	.loc 1 1366 0
 	ldr	w0, [x24, 608]
-.LVL805:
+.LVL816:
 	cmp	w0, 0
 	ccmp	w1, 1, 4, ne
-	beq	.L763
-	.loc 1 1364 0
+	beq	.L771
+	.loc 1 1367 0
 	add	x25, x21, 624
-.LVL806:
+.LVL817:
 	mov	x0, x25
 	bl	down_write
-.LVL807:
-	.loc 1 1365 0
+.LVL818:
+	.loc 1 1368 0
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x28, 16]
 	ldr	x0, [x24, 144]
 	bl	memcpy
-.LVL808:
-	.loc 1 1366 0
+.LVL819:
+	.loc 1 1369 0
 	mov	x0, x28
 	bl	ebc_remove_from_dsp_buf_list
-.LVL809:
-	.loc 1 1367 0
+.LVL820:
+	.loc 1 1370 0
 	mov	x0, x28
 	bl	ebc_buf_release
-.LVL810:
-	.loc 1 1369 0
+.LVL821:
+	.loc 1 1372 0
 	ldr	x1, [x24, 208]
 	mov	x4, x24
 	ldr	x0, [x24, 128]
@@ -9189,71 +9123,58 @@ ebc_thread:
 	ldr	w5, [x1, 40]
 	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
-.LVL811:
-	.loc 1 1372 0
+.LVL822:
+	.loc 1 1375 0
 	mov	x0, x25
 	bl	up_write
-.LVL812:
-	.loc 1 1373 0
-	ldr	w0, [x24, 28]
-	cbnz	w0, .L758
+.LVL823:
 	.loc 1 1376 0
+	ldr	w0, [x24, 28]
+	cbnz	w0, .L766
+	.loc 1 1379 0
 	ldr	w0, [x24, 184]
-	.loc 1 1374 0
+	.loc 1 1377 0
 	mov	w1, 1
-	.loc 1 1375 0
+	.loc 1 1378 0
 	str	wzr, [x24, 76]
-	.loc 1 1374 0
+	.loc 1 1377 0
 	str	w1, [x24, 28]
-	.loc 1 1376 0
-	cbz	w0, .L906
-.L768:
-	.loc 1 1378 0
+	.loc 1 1379 0
+	cbz	w0, .L913
+.L777:
+	.loc 1 1381 0
 	ldr	x0, [x24, 88]
-	adrp	x1, .LC78
+	adrp	x1, .LC81
 	ldrb	w2, [x24, 32]
-	add	x1, x1, :lo12:.LC78
+	add	x1, x1, :lo12:.LC81
 	bl	_dev_info
-.LVL813:
-	.loc 1 1379 0
+.LVL824:
+	.loc 1 1382 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL814:
-	b	.L758
-.L783:
-	.loc 1 1398 0
-	cmp	w2, 21
-	ble	.L850
-.L777:
-	.loc 1 1569 0
-	ldr	x0, [x24, 88]
-	adrp	x1, .LC87
-	add	x1, x1, :lo12:.LC87
-	bl	_dev_err
-.LVL815:
-	.loc 1 1570 0
-	b	.L792
+.LVL825:
+	b	.L766
 	.p2align 3
-.L780:
-	.loc 1 1400 0
+.L789:
+	.loc 1 1403 0
 	ldr	w0, [x24, 604]
-	cbz	w0, .L784
-	.loc 1 1413 0
+	cbz	w0, .L793
+	.loc 1 1416 0
 	ldr	x0, [x24, 200]
-	.loc 1 1411 0
+	.loc 1 1414 0
 	str	x28, [x24, 208]
-	.loc 1 1401 0
+	.loc 1 1404 0
 	str	w2, [x24, 608]
-	.loc 1 1413 0
+	.loc 1 1416 0
 	ldr	w1, [x0, 40]
 	cmp	w1, 1
-	bhi	.L785
+	bhi	.L794
 	mov	x0, x28
-	.loc 1 1418 0
-	cbz	w1, .L907
-.L787:
-.LBB1818:
-.LBB1819:
+	.loc 1 1421 0
+	cbz	w1, .L914
+.L796:
+.LBB1811:
+.LBB1812:
 	.loc 1 374 0
 	ldp	w3, w14, [x0, 48]
 	.loc 1 433 0
@@ -9281,23 +9202,23 @@ ebc_thread:
 	asr	w8, w8, 3
 	.loc 1 377 0
 	asr	w16, w16, 3
-.LVL816:
+.LVL826:
 	.loc 1 373 0
 	add	w8, w8, 1
-.LVL817:
+.LVL827:
 	ldr	w1, [x20, 236]
 	.loc 1 380 0
 	cmp	w8, w16
-.LBE1819:
-.LBE1818:
-	.loc 1 1422 0
+.LBE1812:
+.LBE1811:
+	.loc 1 1425 0
 	ldr	x11, [x0, 16]
-.LBB1824:
-.LBB1820:
+.LBB1817:
+.LBB1813:
 	.loc 1 380 0
 	sub	w0, w16, #1
 	csel	w8, w0, w8, ge
-.LVL818:
+.LVL828:
 	.loc 1 382 0
 	cmp	w1, w17
 	sub	w1, w1, #1
@@ -9307,106 +9228,106 @@ ebc_thread:
 	csel	w17, w1, w17, le
 	.loc 1 372 0
 	asr	w15, w15, 3
-.LVL819:
+.LVL829:
 	mul	w5, w14, w16
 	.loc 1 384 0
 	cmp	w14, w17
-.LBE1820:
-.LBE1824:
-	.loc 1 1422 0
+.LBE1813:
+.LBE1817:
+	.loc 1 1425 0
 	ldr	x7, [x24, 128]
-	.loc 1 1423 0
+	.loc 1 1426 0
 	ldp	x10, x9, [x24, 144]
-.LBB1825:
-.LBB1821:
+.LBB1818:
+.LBB1814:
 	.loc 1 384 0
-	bgt	.L795
-.LVL820:
+	bgt	.L804
+.LVL830:
 	.p2align 2
-.L865:
+.L874:
 	.loc 1 389 0
 	mov	w4, w15
 	cmp	w15, w8
-	ble	.L866
-	b	.L812
-.LVL821:
+	ble	.L875
+	b	.L821
+.LVL831:
 	.p2align 3
-.L796:
+.L805:
 	.loc 1 402 0
 	tst	x2, 65280
-	bne	.L797
+	bne	.L806
 	.loc 1 403 0
 	and	w26, w1, 240
 	cmp	w26, 224
-	beq	.L908
+	beq	.L915
 	.loc 1 406 0
 	orr	w18, w18, 240
-.L797:
+.L806:
 	.loc 1 408 0
 	tst	x2, 16711680
-	bne	.L799
+	bne	.L808
 	.loc 1 409 0
 	and	w26, w1, 3840
 	cmp	w26, 3584
-	beq	.L909
+	beq	.L916
 	.loc 1 412 0
 	orr	w18, w18, 3840
-.L799:
+.L808:
 	.loc 1 414 0
 	tst	x2, 4278190080
-	bne	.L801
+	bne	.L810
 	.loc 1 415 0
 	and	w26, w1, 61440
 	cmp	w26, 57344
-	beq	.L910
+	beq	.L917
 	.loc 1 418 0
 	orr	w18, w18, 61440
-.L801:
+.L810:
 	.loc 1 420 0
 	tst	x2, 1095216660480
-	bne	.L803
+	bne	.L812
 	.loc 1 421 0
 	and	w26, w1, 983040
 	cmp	w26, 917504
-	beq	.L911
+	beq	.L918
 	.loc 1 424 0
 	orr	w18, w18, 983040
-.L803:
+.L812:
 	.loc 1 426 0
 	tst	x2, 280375465082880
-	bne	.L805
+	bne	.L814
 	.loc 1 427 0
 	and	w26, w1, 15728640
 	cmp	w26, 14680064
-	beq	.L912
+	beq	.L919
 	.loc 1 430 0
 	orr	w18, w18, 15728640
-.L805:
+.L814:
 	.loc 1 432 0
 	tst	x2, 71776119061217280
-	bne	.L807
+	bne	.L816
 	.loc 1 433 0
 	and	w26, w1, 251658240
 	cmp	w26, w13
-	beq	.L913
+	beq	.L920
 	.loc 1 436 0
 	orr	w18, w18, 251658240
-.L807:
+.L816:
 	.loc 1 438 0
 	tst	x2, -72057594037927936
-	bne	.L809
+	bne	.L818
 	.loc 1 439 0
 	and	w2, w1, -268435456
-.LVL822:
+.LVL832:
 	cmp	w2, w12
-	beq	.L914
+	beq	.L921
 	.loc 1 442 0
 	orr	w18, w18, -268435456
-.LVL823:
-.L809:
+.LVL833:
+.L818:
 	.loc 1 445 0
 	and	w1, w1, w25
-.LVL824:
+.LVL834:
 	.loc 1 389 0
 	add	w4, w4, 1
 	eor	w1, w1, w3
@@ -9417,19 +9338,19 @@ ebc_thread:
 	.loc 1 446 0
 	str	w1, [x7, x0]
 	.loc 1 389 0
-	bgt	.L812
-.LVL825:
-.L866:
+	bgt	.L821
+.LVL835:
+.L875:
 	.loc 1 390 0
 	sxtw	x0, w4
-.LVL826:
+.LVL836:
 	.loc 1 394 0
 	mov	w18, 0
 	.loc 1 393 0
 	lsl	x1, x0, 3
 	.loc 1 390 0
 	lsl	x0, x0, 2
-.LVL827:
+.LVL837:
 	.loc 1 393 0
 	add	x1, x1, x5, sxtw 3
 	add	x0, x0, x5, sxtw 2
@@ -9440,150 +9361,214 @@ ebc_thread:
 	ldr	w1, [x11, x0]
 	.loc 1 396 0
 	and	x26, x2, 255
-.LVL828:
+.LVL838:
 	.loc 1 392 0
 	ldr	w25, [x10, x0]
-.LVL829:
+.LVL839:
 	.loc 1 396 0
-	cbnz	x26, .L796
-.LVL830:
+	cbnz	x26, .L805
+.LVL840:
 	.loc 1 397 0
 	and	w26, w1, 15
 	.loc 1 400 0
 	mov	w18, 15
 	.loc 1 397 0
 	cmp	w26, 14
-	bne	.L796
+	bne	.L805
 	.loc 1 398 0
 	orr	w3, w3, w18
-.LVL831:
+.LVL841:
 	.loc 1 394 0
 	mov	w18, 0
-.LVL832:
-	b	.L796
-.LVL833:
+.LVL842:
+	b	.L805
+.LVL843:
 	.p2align 3
-.L826:
-.LBE1821:
-.LBE1825:
-	.loc 1 1554 0
+.L835:
+.LBE1814:
+.LBE1818:
+	.loc 1 1557 0
 	ldr	x0, [x24, 208]
-	adrp	x1, .LC86
-	.loc 1 1551 0
+	adrp	x1, .LC89
+	.loc 1 1554 0
 	ldr	w3, [x24, 96]
+	.loc 1 1557 0
+	add	x1, x1, :lo12:.LC89
 	.loc 1 1554 0
-	add	x1, x1, :lo12:.LC86
-	.loc 1 1551 0
 	strb	w3, [x24, 32]
-	.loc 1 1554 0
+	.loc 1 1557 0
 	and	w3, w3, 255
 	ldr	w2, [x0, 40]
 	ldr	x0, [x24, 88]
 	bl	_dev_info
-.LVL834:
-	.loc 1 1555 0
+.LVL844:
+	.loc 1 1558 0
 	mov	w0, 1
 	str	w0, [x24, 28]
-	.loc 1 1556 0
+	.loc 1 1559 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL835:
-	.loc 1 1558 0
+.LVL845:
+	.loc 1 1561 0
 	ldr	x1, [x25, #:lo12:jiffies]
 	add	x0, x20, 672
 	str	x0, [x29, 104]
 	add	x1, x1, 900
 	bl	mod_timer
-.LVL836:
-.LBB1826:
-	.loc 1 1559 0
+.LVL846:
+.LBB1819:
+	.loc 1 1562 0
 	ldr	w0, [x24, 76]
-	cbz	w0, .L915
-.L829:
-.LVL837:
-.L827:
-.LBE1826:
-	.loc 1 1561 0 discriminator 11
+	cbz	w0, .L922
+.L838:
+.LVL847:
+.L836:
+.LBE1819:
+	.loc 1 1564 0 discriminator 11
 	ldr	x2, [x25, #:lo12:jiffies]
 	mov	x1, 402653184
 	ldr	x0, [x29, 104]
-.LVL838:
+.LVL848:
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL839:
-	.loc 1 1562 0 discriminator 11
+.LVL849:
+	.loc 1 1565 0 discriminator 11
 	str	wzr, [x24, 76]
-	.loc 1 1564 0 discriminator 11
+	.loc 1 1567 0 discriminator 11
 	str	x26, [x24, 200]
-	.loc 1 1566 0 discriminator 11
-	b	.L792
-.LVL840:
+	.loc 1 1569 0 discriminator 11
+	b	.L801
+.LVL850:
 	.p2align 3
-.L854:
-	.loc 1 1539 0
+.L863:
+	.loc 1 1542 0
 	ldr	w0, [x24, 184]
-	.loc 1 1528 0
+	.loc 1 1531 0
 	mov	w23, 0
-	.loc 1 1539 0
-	cbnz	w0, .L825
-.L901:
-	.loc 1 1540 0
+	.loc 1 1542 0
+	cbnz	w0, .L834
+.L911:
+	.loc 1 1543 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.12
-.LVL841:
-	b	.L825
-.L895:
-	.loc 1 1392 0
+.LVL851:
+	b	.L834
+.L899:
+	.loc 1 1464 0
+	mov	w0, 1
+	str	w0, [x24, 28]
+	.loc 1 1466 0
+	ldr	w0, [x24, 184]
+	.loc 1 1465 0
+	str	wzr, [x24, 76]
+	.loc 1 1466 0
+	cbz	w0, .L923
+	.loc 1 1468 0
+	mov	x0, x20
+	bl	ebc_lut_update
+.LVL852:
+	cmn	w0, #1
+	beq	.L924
+.L826:
+	.loc 1 1476 0
 	ldr	x0, [x24, 88]
-	adrp	x1, .LC80
-	add	x1, x1, :lo12:.LC80
+	adrp	x1, .LC88
+	.loc 1 1473 0
+	ldr	w3, [x24, 96]
+	.loc 1 1476 0
+	add	x1, x1, :lo12:.LC88
+	.loc 1 1473 0
+	strb	w3, [x24, 32]
+.LVL853:
+.L890:
+	.loc 1 1476 0
+	and	w2, w3, 255
+	.loc 1 1474 0
+	lsr	w3, w3, 8
+	strb	w3, [x24, 33]
+	.loc 1 1476 0
 	bl	_dev_info
-.LVL842:
-.LBB1830:
-	.loc 1 1393 0
+.LVL854:
+	.loc 1 1477 0
+	mov	x0, x20
+	bl	ebc_frame_start
+.LVL855:
+	b	.L801
+.LVL856:
+.L898:
+	.loc 1 1395 0
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC83
+	add	x1, x1, :lo12:.LC83
+	bl	_dev_info
+.LVL857:
+.LBB1823:
+	.loc 1 1396 0
 	ldr	w0, [x24, 76]
-	cbz	w0, .L916
-.L775:
-.LVL843:
-.L773:
-.LBE1830:
-	.loc 1 1394 0 discriminator 11
+	cbz	w0, .L925
+.L784:
+.LVL858:
+.L782:
+.LBE1823:
+	.loc 1 1397 0 discriminator 11
 	ldr	x0, [x24, 88]
-.LVL844:
-	adrp	x1, .LC81
-	add	x1, x1, :lo12:.LC81
+.LVL859:
+	adrp	x1, .LC84
+	add	x1, x1, :lo12:.LC84
 	bl	_dev_info
-.LVL845:
-	b	.L880
-.LVL846:
+.LVL860:
+	b	.L889
+.L793:
+	.loc 1 1407 0
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC85
+	add	x1, x1, :lo12:.LC85
+	bl	_dev_info
+.LVL861:
+	.loc 1 1408 0
+	mov	x0, x28
+	bl	ebc_remove_from_dsp_buf_list
+.LVL862:
+	.loc 1 1409 0
+	mov	x0, x28
+	bl	ebc_buf_release
+.LVL863:
+	.loc 1 1411 0
+	b	.L766
+.LVL864:
 	.p2align 3
-.L911:
-.LBB1834:
-.LBB1822:
+.L917:
+.LBB1827:
+.LBB1815:
+	.loc 1 416 0
+	orr	w3, w3, 61440
+	b	.L810
+	.p2align 3
+.L918:
 	.loc 1 422 0
 	orr	w3, w3, 983040
-	b	.L803
+	b	.L812
 	.p2align 3
-.L912:
+.L919:
 	.loc 1 428 0
 	orr	w3, w3, 15728640
-	b	.L805
+	b	.L814
 	.p2align 3
-.L913:
+.L920:
 	.loc 1 434 0
 	orr	w3, w3, 251658240
-	b	.L807
-.LVL847:
+	b	.L816
+.LVL865:
 	.p2align 3
-.L914:
+.L921:
 	.loc 1 440 0
 	orr	w3, w3, -268435456
-.LVL848:
+.LVL866:
 	.loc 1 445 0
 	and	w1, w1, w25
-.LVL849:
+.LVL867:
 	eor	w1, w1, w3
-.LVL850:
+.LVL868:
 	.loc 1 389 0
 	add	w4, w4, 1
 	and	w1, w1, w18
@@ -9593,300 +9578,281 @@ ebc_thread:
 	.loc 1 446 0
 	str	w1, [x7, x0]
 	.loc 1 389 0
-	ble	.L866
-.LVL851:
+	ble	.L875
+.LVL869:
 	.p2align 2
-.L812:
+.L821:
 	.loc 1 384 0
 	add	w14, w14, 1
 	add	w5, w5, w16
 	cmp	w14, w17
-	ble	.L865
-.L795:
-.LBE1822:
-.LBE1834:
-	.loc 1 1426 0
+	ble	.L874
+.L804:
+.LBE1815:
+.LBE1827:
+	.loc 1 1429 0
 	ldr	w0, [x24, 28]
-	cbnz	w0, .L792
-	.loc 1 1427 0
+	cbnz	w0, .L801
+	.loc 1 1430 0
 	mov	w0, 1
 	str	w0, [x24, 28]
-	.loc 1 1429 0
+	.loc 1 1432 0
 	ldr	w0, [x24, 184]
-	.loc 1 1428 0
-	str	wzr, [x24, 76]
-	.loc 1 1429 0
-	cbz	w0, .L917
-.L813:
 	.loc 1 1431 0
+	str	wzr, [x24, 76]
+	.loc 1 1432 0
+	cbz	w0, .L926
+.L822:
+	.loc 1 1434 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL852:
+.LVL870:
 	cmn	w0, #1
-	beq	.L792
-	.loc 1 1435 0
+	beq	.L801
+	.loc 1 1438 0
 	ldr	w3, [x24, 96]
+	.loc 1 1441 0
+	adrp	x1, .LC86
 	.loc 1 1438 0
-	adrp	x1, .LC83
-	.loc 1 1435 0
 	strb	w3, [x24, 32]
-	.loc 1 1438 0
-	add	x1, x1, :lo12:.LC83
+	.loc 1 1441 0
+	add	x1, x1, :lo12:.LC86
 	ldr	x0, [x24, 88]
-	b	.L881
-.LVL853:
+	b	.L890
+.LVL871:
 	.p2align 3
-.L908:
-.LBB1835:
-.LBB1823:
+.L915:
+.LBB1828:
+.LBB1816:
 	.loc 1 404 0
 	orr	w3, w3, 240
-	b	.L797
+	b	.L806
 	.p2align 3
-.L909:
+.L916:
 	.loc 1 410 0
 	orr	w3, w3, 3840
-	b	.L799
-	.p2align 3
-.L910:
-	.loc 1 416 0
-	orr	w3, w3, 61440
-	b	.L801
-.LVL854:
-.L888:
-.LBE1823:
-.LBE1835:
-	.loc 1 1349 0
-	str	wzr, [x24, 592]
-	.loc 1 1350 0
-	mov	x0, 3
-.LVL855:
-	bl	ebc_notify
-.LVL856:
-	.loc 1 1351 0
-	ldr	x0, [x24, 88]
-	adrp	x1, .LC77
-	add	x1, x1, :lo12:.LC77
-	bl	_dev_info
-.LVL857:
-	b	.L763
-.LVL858:
-.L903:
-	.loc 1 1587 0
+	b	.L808
+.LVL872:
+.L901:
+.LBE1816:
+.LBE1828:
+	.loc 1 1593 0
 	ldr	x0, [x24, 88]
-	.loc 1 1585 0
+	.loc 1 1591 0
 	mov	w25, 1
-.LVL859:
-	.loc 1 1584 0
+.LVL873:
+	.loc 1 1590 0
 	str	wzr, [x24, 188]
-	.loc 1 1587 0
-	adrp	x1, .LC89
-	.loc 1 1585 0
+	.loc 1 1593 0
+	adrp	x1, .LC92
+	.loc 1 1591 0
 	str	w25, [x24, 592]
-	.loc 1 1587 0
-	add	x1, x1, :lo12:.LC89
-	.loc 1 1586 0
+	.loc 1 1593 0
+	add	x1, x1, :lo12:.LC92
+	.loc 1 1592 0
 	str	wzr, [x24, 608]
-	.loc 1 1587 0
+	.loc 1 1593 0
 	bl	_dev_info
-.LVL860:
-	.loc 1 1588 0
+.LVL874:
+	.loc 1 1594 0
 	mov	x0, 2
 	bl	ebc_notify
-.LVL861:
-	.loc 1 1589 0
+.LVL875:
+	.loc 1 1595 0
 	mov	w2, w25
 	mov	w1, w25
 	add	x0, x21, 328
 	bl	__wake_up_sync
-.LVL862:
-	b	.L832
-.L785:
-	.loc 1 1415 0
+.LVL876:
+	b	.L841
+.L794:
+	.loc 1 1418 0
 	ldr	x1, [x0, 16]
 	ldrsw	x2, [x24, 20]
 	ldr	x0, [x24, 128]
 	bl	memcpy
-.LVL863:
-	.loc 1 1416 0
+.LVL877:
+	.loc 1 1419 0
 	ldr	x0, [x24, 200]
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x24, 136]
 	bl	memcpy
-.LVL864:
-	.loc 1 1417 0
+.LVL878:
+	.loc 1 1420 0
 	ldr	x0, [x24, 200]
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x24, 144]
 	bl	memcpy
-.LVL865:
+.LVL879:
 	ldr	x0, [x24, 208]
-	b	.L787
-.LVL866:
-.L900:
-	.loc 1 1534 0
-	mov	w0, 2
-	.loc 1 1535 0
-	mov	w23, 0
-	.loc 1 1534 0
-	str	w0, [x28, 40]
-	b	.L824
-.LVL867:
-.L784:
-	.loc 1 1404 0
+	b	.L796
+.LVL880:
+.L897:
+	.loc 1 1349 0
+	str	wzr, [x24, 592]
+	.loc 1 1350 0
+	mov	x0, 3
+.LVL881:
+	bl	ebc_notify
+.LVL882:
+	.loc 1 1351 0
 	ldr	x0, [x24, 88]
-	adrp	x1, .LC82
-	add	x1, x1, :lo12:.LC82
+	adrp	x1, .LC79
+	add	x1, x1, :lo12:.LC79
 	bl	_dev_info
-.LVL868:
-	.loc 1 1405 0
-	mov	x0, x28
-	b	.L879
-.L814:
-	.loc 1 1455 0
-	ldr	x0, [x24, 128]
-	mov	x3, x24
-	ldr	x2, [x24, 152]
-	ldr	x1, [x28, 16]
-	bl	refresh_new_image_auto
-.LVL869:
-	b	.L815
-.L915:
-.LBB1836:
-.LBB1827:
-.LBB1828:
-	.loc 1 1559 0 discriminator 1
+.LVL883:
+	b	.L771
+.LVL884:
+.L922:
+.LBB1829:
+.LBB1820:
+.LBB1821:
+	.loc 1 1562 0 discriminator 1
 	add	x27, x21, 352
-.LBE1828:
+.LBE1821:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL870:
-	b	.L830
+.LVL885:
+	b	.L839
 	.p2align 3
-.L918:
-.LVL871:
-.LBB1829:
-	.loc 1 1559 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L827
-	.loc 1 1559 0 discriminator 7
+.L927:
+.LVL886:
+.LBB1822:
+	.loc 1 1562 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L836
+	.loc 1 1562 0 discriminator 7
 	bl	schedule
-.LVL872:
-.L830:
-	.loc 1 1559 0 discriminator 9
+.LVL887:
+.L839:
+	.loc 1 1562 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x27
 	bl	prepare_to_wait_event
-.LVL873:
+.LVL888:
 	ldr	w1, [x24, 76]
-	cbz	w1, .L918
-.LBE1829:
-	.loc 1 1559 0 discriminator 4
+	cbz	w1, .L927
+.LBE1822:
+	.loc 1 1562 0 discriminator 4
 	mov	x0, x27
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL874:
-	b	.L827
-.LVL875:
-.L917:
-.LBE1827:
-.LBE1836:
-	.loc 1 1430 0 is_stmt 1
+.LVL889:
+	b	.L836
+.LVL890:
+.L926:
+.LBE1820:
+.LBE1829:
+	.loc 1 1433 0 is_stmt 1
 	mov	x0, x20
 	bl	ebc_power_set.constprop.12
-.LVL876:
-	b	.L813
-.LVL877:
-.L916:
-.LBB1837:
-.LBB1831:
-.LBB1832:
-	.loc 1 1393 0 discriminator 1
+.LVL891:
+	b	.L822
+.LVL892:
+.L925:
+.LBB1830:
+.LBB1824:
+.LBB1825:
+	.loc 1 1396 0 discriminator 1
 	add	x26, x21, 352
-.LVL878:
-.LBE1832:
+.LVL893:
+.LBE1825:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL879:
-	b	.L776
+.LVL894:
+	b	.L785
 	.p2align 3
-.L919:
-.LVL880:
-.LBB1833:
-	.loc 1 1393 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L773
-	.loc 1 1393 0 discriminator 7
+.L928:
+.LVL895:
+.LBB1826:
+	.loc 1 1396 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L782
+	.loc 1 1396 0 discriminator 7
 	bl	schedule
-.LVL881:
-.L776:
-	.loc 1 1393 0 discriminator 9
+.LVL896:
+.L785:
+	.loc 1 1396 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x26
 	bl	prepare_to_wait_event
-.LVL882:
+.LVL897:
 	ldr	w1, [x24, 76]
-	cbz	w1, .L919
-.LBE1833:
-	.loc 1 1393 0 discriminator 4
+	cbz	w1, .L928
+.LBE1826:
+	.loc 1 1396 0 discriminator 4
 	mov	x0, x26
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL883:
-	b	.L773
-.LVL884:
-.L907:
-.LBE1831:
-.LBE1837:
-	.loc 1 1419 0 is_stmt 1
+.LVL898:
+	b	.L782
+.LVL899:
+.L914:
+.LBE1824:
+.LBE1830:
+	.loc 1 1422 0 is_stmt 1
 	ldrsw	x2, [x24, 20]
 	ldp	x1, x0, [x24, 136]
 	bl	memcpy
-.LVL885:
+.LVL900:
 	ldr	x0, [x24, 208]
-	b	.L787
-.LVL886:
-.L889:
-.LBB1838:
-.LBB1839:
+	b	.L796
+.L823:
+	.loc 1 1458 0
+	ldr	x0, [x24, 128]
+	mov	x3, x24
+	ldr	x2, [x24, 152]
+	ldr	x1, [x28, 16]
+	bl	refresh_new_image_auto
+.LVL901:
+	b	.L824
+.LVL902:
+.L903:
+.LBB1831:
+.LBB1832:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
-.LVL887:
-	b	.L760
-.LVL888:
-.L897:
-.LBE1839:
-.LBE1838:
-	.loc 1 1466 0
-	ldr	x0, [x24, 88]
-	adrp	x1, .LC84
-	add	x1, x1, :lo12:.LC84
-	bl	_dev_err
-.LVL889:
+.LVL903:
+	b	.L768
+.LVL904:
+.L923:
+.LBE1832:
+.LBE1831:
 	.loc 1 1467 0
-	b	.L792
-.L896:
-	.loc 1 1464 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.12
-.LVL890:
-	b	.L816
-.L906:
-	.loc 1 1377 0
+.LVL905:
+	.loc 1 1468 0
+	mov	x0, x20
+	bl	ebc_lut_update
+.LVL906:
+	cmn	w0, #1
+	bne	.L826
+.L924:
+	.loc 1 1469 0
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC87
+	add	x1, x1, :lo12:.LC87
+	bl	_dev_err
+.LVL907:
+	.loc 1 1470 0
+	b	.L801
+.L913:
+	.loc 1 1380 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.12
-.LVL891:
-	b	.L768
-.LVL892:
-.L890:
-	.loc 1 1622 0
+.LVL908:
+	b	.L777
+.LVL909:
+.L904:
+	.loc 1 1628 0
 	bl	__stack_chk_fail
-.LVL893:
+.LVL910:
 	.cfi_endproc
 .LFE2826:
 	.size	ebc_thread, .-ebc_thread
@@ -9899,7 +9865,7 @@ ebc_driver:
 	.xword	ebc_probe
 	.xword	ebc_remove
 	.zero	24
-	.xword	.LC91
+	.xword	.LC94
 	.zero	32
 	.xword	ebc_match
 	.zero	64
@@ -9911,7 +9877,7 @@ ebc_driver:
 ebc_misc:
 	.word	243
 	.zero	4
-	.xword	.LC44
+	.xword	.LC46
 	.xword	ebc_ops
 	.zero	56
 	.type	ebc_thread_wq, %object
@@ -9945,7 +9911,7 @@ ebc_auto_thread_sem:
 	.type	dev_attr_waveform_version, %object
 	.size	dev_attr_waveform_version, 32
 dev_attr_waveform_version:
-	.xword	.LC98
+	.xword	.LC101
 	.hword	292
 	.zero	6
 	.xword	waveform_version_read
@@ -9953,7 +9919,7 @@ dev_attr_waveform_version:
 	.type	dev_attr_pmic_name, %object
 	.size	dev_attr_pmic_name, 32
 dev_attr_pmic_name:
-	.xword	.LC97
+	.xword	.LC100
 	.hword	292
 	.zero	6
 	.xword	pmic_name_read
@@ -9961,7 +9927,7 @@ dev_attr_pmic_name:
 	.type	dev_attr_pmic_temp, %object
 	.size	dev_attr_pmic_temp, 32
 dev_attr_pmic_temp:
-	.xword	.LC96
+	.xword	.LC99
 	.hword	292
 	.zero	6
 	.xword	pmic_temp_read
@@ -9969,7 +9935,7 @@ dev_attr_pmic_temp:
 	.type	dev_attr_pmic_vcom, %object
 	.size	dev_attr_pmic_vcom, 32
 dev_attr_pmic_vcom:
-	.xword	.LC95
+	.xword	.LC98
 	.hword	420
 	.zero	6
 	.xword	pmic_vcom_read
@@ -9977,7 +9943,7 @@ dev_attr_pmic_vcom:
 	.type	dev_attr_ebc_version, %object
 	.size	dev_attr_ebc_version, 32
 dev_attr_ebc_version:
-	.xword	.LC94
+	.xword	.LC97
 	.hword	292
 	.zero	6
 	.xword	ebc_version_read
@@ -9985,7 +9951,7 @@ dev_attr_ebc_version:
 	.type	dev_attr_ebc_state, %object
 	.size	dev_attr_ebc_state, 32
 dev_attr_ebc_state:
-	.xword	.LC93
+	.xword	.LC96
 	.hword	292
 	.zero	6
 	.xword	ebc_state_read
@@ -9993,7 +9959,7 @@ dev_attr_ebc_state:
 	.type	dev_attr_ebc_buf_state, %object
 	.size	dev_attr_ebc_buf_state, 32
 dev_attr_ebc_buf_state:
-	.xword	.LC92
+	.xword	.LC95
 	.hword	292
 	.zero	6
 	.xword	ebc_buf_state_read
@@ -10032,9 +9998,9 @@ __func__.34976:
 	.size	__func__.34774, 16
 __func__.34774:
 	.string	"ebc_frame_start"
-	.type	__func__.35267, %object
-	.size	__func__.35267, 12
-__func__.35267:
+	.type	__func__.35274, %object
+	.size	__func__.35274, 12
+__func__.35274:
 	.string	"ebc_suspend"
 	.zero	4
 	.type	__func__.35208, %object
@@ -10070,9 +10036,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init2503, %object
-	.size	__addressable_ebc_init2503, 8
-__addressable_ebc_init2503:
+	.type	__addressable_ebc_init2529, %object
+	.size	__addressable_ebc_init2529, 8
+__addressable_ebc_init2529:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -10130,7 +10096,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC16:
-	.string	"2.08"
+	.string	"2.09"
 	.zero	3
 .LC17:
 	.string	"%s\n"
@@ -10165,208 +10131,218 @@ __exitcall_ebc_exit:
 	.string	"pmic"
 	.zero	3
 .LC28:
-	.string	"not find pmic node\n"
+	.string	"wrong pmics number\n"
 	.zero	4
 .LC29:
+	.string	"not find pmic node\n"
+	.zero	4
+.LC30:
 	.string	"not find pmic i2c client\n"
 	.zero	6
-.LC30:
+.LC31:
+	.string	"use pmic%d\n"
+	.zero	4
+.LC32:
 	.string	"get drvdata from pmic client failed\n"
 	.zero	3
-.LC31:
+.LC33:
 	.string	"panel,width"
 	.zero	4
-.LC32:
+.LC34:
 	.string	"panel,panel_color"
 	.zero	6
-.LC33:
+.LC35:
 	.string	"panel,mirror"
 	.zero	3
-.LC34:
+.LC36:
 	.string	"panel,width-mm"
 	.zero	1
-.LC35:
+.LC37:
 	.string	"panel,height-mm"
-.LC36:
+.LC38:
 	.string	"memory-region"
 	.zero	2
-.LC37:
+.LC39:
 	.string	"Couldn't address to resource for reserved memory\n"
 	.zero	6
-.LC38:
+.LC40:
 	.string	"waveform-region"
-.LC39:
+.LC41:
 	.string	"%s:%d: failed to get mem from reserved\n"
-.LC40:
+.LC42:
 	.string	"Failed to read waveform from mem, we use waveform file from kernel file instead\n"
 	.zero	7
-.LC41:
+.LC43:
 	.string	"Failed to read waveform file from kernel, no waveform!!!\n"
 	.zero	6
-.LC42:
+.LC44:
 	.string	"failed to create ebc_task thread\n"
 	.zero	6
-.LC43:
+.LC45:
 	.string	"ebc_thread"
 	.zero	5
-.LC44:
+.LC46:
 	.string	"ebc"
 	.zero	4
-.LC45:
+.LC47:
 	.string	"ulogo_addr="
 	.zero	4
-.LC46:
+.LC48:
 	.string	"klogo_addr="
 	.zero	4
-.LC47:
+.LC49:
 	.string	"ulogo_addr=0x%x"
-.LC48:
+.LC50:
 	.string	"have ulogo display, ulogo addr = 0x%x\n"
 	.zero	1
-.LC49:
+.LC51:
 	.string	"malloc ulogo buffer failed\n"
 	.zero	4
-.LC50:
+.LC52:
 	.string	"klogo_addr=0x%x"
-.LC51:
+.LC53:
 	.string	"need show klogo, klogo addr = 0x%x\n"
 	.zero	4
-.LC52:
+.LC54:
 	.string	"malloc klogo buffer failed\n"
 	.zero	4
-.LC53:
+.LC55:
 	.string	"no uboot logo, panel init\n"
 	.zero	5
-.LC54:
+.LC56:
 	.string	"rockchip ebc driver %s probe success\n"
 	.zero	2
-.LC55:
+.LC57:
 	.string	"panel,height"
 	.zero	3
-.LC56:
+.LC58:
 	.string	"panel,vir_width"
-.LC57:
+.LC59:
 	.string	"panel,vir_height"
 	.zero	7
-.LC58:
+.LC60:
 	.string	"panel,sdck"
 	.zero	5
-.LC59:
+.LC61:
 	.string	"panel,lsl"
 	.zero	6
-.LC60:
+.LC62:
 	.string	"panel,lbl"
 	.zero	6
-.LC61:
+.LC63:
 	.string	"panel,ldl"
 	.zero	6
-.LC62:
+.LC64:
 	.string	"panel,lel"
 	.zero	6
-.LC63:
+.LC65:
 	.string	"panel,gdck-sta"
 	.zero	1
-.LC64:
+.LC66:
 	.string	"panel,lgonl"
 	.zero	4
-.LC65:
+.LC67:
 	.string	"panel,fsl"
 	.zero	6
-.LC66:
+.LC68:
 	.string	"panel,fbl"
 	.zero	6
-.LC67:
+.LC69:
 	.string	"panel,fdl"
 	.zero	6
-.LC68:
+.LC70:
 	.string	"panel,fel"
 	.zero	6
-.LC69:
+.LC71:
 	.string	"panel,panel_16bit"
 	.zero	6
-.LC70:
+.LC72:
 	.string	"buffer manage init failed\n"
 	.zero	5
-.LC71:
+.LC73:
 	.string	"lut table init failed\n"
 	.zero	1
-.LC72:
+.LC74:
 	.string	"ebc_task"
 	.zero	7
-.LC73:
+.LC75:
 	.string	"failed to run ebc thread\n"
 	.zero	6
-.LC74:
+.LC76:
 	.string	"task init failed\n"
 	.zero	6
-.LC75:
+.LC77:
 	.string	"failed to probe panel: %d\n"
 	.zero	5
-.LC76:
+.LC78:
 	.string	"ebc hw power on\n"
 	.zero	7
-.LC77:
+.LC79:
 	.string	"early resume\n"
 	.zero	2
-.LC78:
+.LC80:
+	.string	"refresh suspend logo\n"
+	.zero	2
+.LC81:
 	.string	"overlay mode start, update background, frame_total=%d\n"
 	.zero	1
-.LC79:
+.LC82:
 	.string	"change display mode from %d to %d\n"
 	.zero	5
-.LC80:
+.LC83:
 	.string	"ebc is busy now, waiting prev refresh mode end...\n"
 	.zero	5
-.LC81:
+.LC84:
 	.string	"prev refresh mode end\n"
 	.zero	1
-.LC82:
+.LC85:
 	.string	"overlay disabled, drop EPD_OVERLAY frame\n"
 	.zero	6
-.LC83:
+.LC86:
 	.string	"overlay mode start, frame_total=%d\n"
 	.zero	4
-.LC84:
+.LC87:
 	.string	"ebc_lut_update err\n"
 	.zero	4
-.LC85:
+.LC88:
 	.string	"auto mode start, frame_total=%d\n"
 	.zero	7
-.LC86:
+.LC89:
 	.string	"frame start, mode = %d, framecount = %d\n"
 	.zero	7
-.LC87:
-	.string	"ebc buffer mode error!\n"
-.LC88:
+.LC90:
+	.string	"ebc buffer mode %d error!!!\n"
+	.zero	3
+.LC91:
 	.string	"power off\n"
 	.zero	5
-.LC89:
+.LC92:
 	.string	"early suspend\n"
 	.zero	1
-.LC90:
+.LC93:
 	.string	"check_part_mode==0, no need refresh\n"
 	.zero	3
-.LC91:
+.LC94:
 	.string	"ebc-dev"
-.LC92:
+.LC95:
 	.string	"ebc_buf_state"
 	.zero	2
-.LC93:
+.LC96:
 	.string	"ebc_state"
 	.zero	6
-.LC94:
+.LC97:
 	.string	"ebc_version"
 	.zero	4
-.LC95:
+.LC98:
 	.string	"pmic_vcom"
 	.zero	6
-.LC96:
+.LC99:
 	.string	"pmic_temp"
 	.zero	6
-.LC97:
+.LC100:
 	.string	"pmic_name"
 	.zero	6
-.LC98:
+.LC101:
 	.string	"waveform_version"
 	.text
 .Letext0:
@@ -10558,24 +10534,26 @@ __exitcall_ebc_exit:
 	.file 204 "./include/linux/err.h"
 	.file 205 "./include/asm-generic/getorder.h"
 	.file 206 "./include/linux/log2.h"
-	.file 207 "./include/asm-generic/bitops/fls64.h"
-	.file 208 "./include/asm-generic/bitops/builtin-__fls.h"
-	.file 209 "./include/linux/kasan-checks.h"
-	.file 210 "./include/linux/of_address.h"
-	.file 211 "./arch/arm64/include/asm/string.h"
-	.file 212 "./include/linux/string.h"
+	.file 207 "./include/uapi/linux/byteorder/little_endian.h"
+	.file 208 "./include/uapi/linux/swab.h"
+	.file 209 "./include/asm-generic/bitops/fls64.h"
+	.file 210 "./include/asm-generic/bitops/builtin-__fls.h"
+	.file 211 "./include/linux/kasan-checks.h"
+	.file 212 "./include/linux/of_address.h"
+	.file 213 "./arch/arm64/include/asm/string.h"
+	.file 214 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x144d6
+	.4byte	0x14612
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF3287
+	.4byte	.LASF3293
 	.byte	0x1
-	.4byte	.LASF3288
-	.4byte	.LASF3289
-	.4byte	.Ldebug_ranges0+0x1260
+	.4byte	.LASF3294
+	.4byte	.LASF3295
+	.4byte	.Ldebug_ranges0+0x1160
 	.8byte	0
 	.4byte	.Ldebug_line0
 	.uleb128 0x2
@@ -10665,11 +10643,13 @@ __exitcall_ebc_exit:
 	.byte	0x13
 	.byte	0x1b
 	.4byte	0x6d
+	.uleb128 0x3
+	.4byte	0xd2
 	.uleb128 0x8
 	.4byte	.LASF13
 	.byte	0x13
 	.byte	0x1e
-	.4byte	0xe8
+	.4byte	0xed
 	.uleb128 0x2
 	.byte	0x8
 	.byte	0x5
@@ -10678,7 +10658,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF15
 	.byte	0x13
 	.byte	0x1f
-	.4byte	0xfa
+	.4byte	0xff
 	.uleb128 0x2
 	.byte	0x8
 	.byte	0x7
@@ -10694,44 +10674,44 @@ __exitcall_ebc_exit:
 	.byte	0x11
 	.4byte	0x8b
 	.uleb128 0x3
-	.4byte	0x10b
+	.4byte	0x110
 	.uleb128 0xa
 	.string	"u16"
 	.byte	0x14
 	.byte	0x13
 	.4byte	0xa9
 	.uleb128 0x3
-	.4byte	0x11a
+	.4byte	0x11f
 	.uleb128 0xa
 	.string	"s32"
 	.byte	0x14
 	.byte	0x14
 	.4byte	0xbb
 	.uleb128 0x3
-	.4byte	0x12a
+	.4byte	0x12f
 	.uleb128 0xa
 	.string	"u32"
 	.byte	0x14
 	.byte	0x15
 	.4byte	0xd2
 	.uleb128 0x3
-	.4byte	0x13a
+	.4byte	0x13f
 	.uleb128 0xa
 	.string	"s64"
 	.byte	0x14
 	.byte	0x16
-	.4byte	0xdd
+	.4byte	0xe2
 	.uleb128 0xa
 	.string	"u64"
 	.byte	0x14
 	.byte	0x17
-	.4byte	0xef
+	.4byte	0xf4
 	.uleb128 0xb
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x55
 	.byte	0xa
-	.4byte	0x179
+	.4byte	0x17e
 	.uleb128 0xc
 	.4byte	.LASF17
 	.byte	0
@@ -10741,7 +10721,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0x189
+	.4byte	0x18e
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
@@ -10750,13 +10730,13 @@ __exitcall_ebc_exit:
 	.4byte	.LASF19
 	.byte	0x15
 	.byte	0xf
-	.4byte	0x194
+	.4byte	0x199
 	.uleb128 0x2
 	.byte	0x8
 	.byte	0x5
 	.4byte	.LASF20
 	.uleb128 0x4
-	.4byte	0x194
+	.4byte	0x199
 	.uleb128 0x8
 	.4byte	.LASF21
 	.byte	0x15
@@ -10781,27 +10761,27 @@ __exitcall_ebc_exit:
 	.4byte	.LASF25
 	.byte	0x15
 	.byte	0x48
-	.4byte	0x1a0
+	.4byte	0x1a5
 	.uleb128 0x8
 	.4byte	.LASF26
 	.byte	0x15
 	.byte	0x49
-	.4byte	0x189
+	.4byte	0x18e
 	.uleb128 0x8
 	.4byte	.LASF27
 	.byte	0x15
 	.byte	0x58
-	.4byte	0xe8
+	.4byte	0xed
 	.uleb128 0x8
 	.4byte	.LASF28
 	.byte	0x15
 	.byte	0x59
-	.4byte	0x189
+	.4byte	0x18e
 	.uleb128 0x8
 	.4byte	.LASF29
 	.byte	0x15
 	.byte	0x5b
-	.4byte	0x189
+	.4byte	0x18e
 	.uleb128 0x8
 	.4byte	.LASF30
 	.byte	0x15
@@ -10816,7 +10796,7 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.4byte	0x61
 	.uleb128 0x3
-	.4byte	0x219
+	.4byte	0x21e
 	.uleb128 0x8
 	.4byte	.LASF32
 	.byte	0x16
@@ -10825,135 +10805,142 @@ __exitcall_ebc_exit:
 	.uleb128 0x8
 	.4byte	.LASF33
 	.byte	0x16
+	.byte	0x20
+	.4byte	0xd2
+	.uleb128 0x3
+	.4byte	0x234
+	.uleb128 0x8
+	.4byte	.LASF34
+	.byte	0x16
 	.byte	0x34
 	.4byte	0x6d
 	.uleb128 0xd
-	.4byte	.LASF61
+	.4byte	.LASF62
 	.byte	0x8
 	.byte	0x17
 	.byte	0x3d
-	.4byte	0x25f
+	.4byte	0x274
 	.uleb128 0xe
-	.4byte	.LASF34
+	.4byte	.LASF35
 	.byte	0x17
 	.byte	0x3e
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF35
+	.4byte	.LASF36
 	.byte	0x17
 	.byte	0x3f
 	.4byte	0xc6
 	.byte	0x4
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x23a
+	.4byte	0x24f
 	.uleb128 0x8
-	.4byte	.LASF36
+	.4byte	.LASF37
 	.byte	0x18
 	.byte	0xd
-	.4byte	0x13a
+	.4byte	0x13f
 	.uleb128 0x8
-	.4byte	.LASF37
+	.4byte	.LASF38
 	.byte	0x18
 	.byte	0x10
-	.4byte	0x264
+	.4byte	0x279
 	.uleb128 0x8
-	.4byte	.LASF38
+	.4byte	.LASF39
 	.byte	0x18
 	.byte	0x13
 	.4byte	0xb4
 	.uleb128 0x8
-	.4byte	.LASF39
+	.4byte	.LASF40
 	.byte	0x18
 	.byte	0x16
-	.4byte	0x1ab
+	.4byte	0x1b0
 	.uleb128 0x8
-	.4byte	.LASF40
+	.4byte	.LASF41
 	.byte	0x18
 	.byte	0x1b
-	.4byte	0x20e
+	.4byte	0x213
 	.uleb128 0x8
-	.4byte	.LASF41
+	.4byte	.LASF42
 	.byte	0x18
 	.byte	0x1e
-	.4byte	0x2a6
+	.4byte	0x2bb
 	.uleb128 0x2
 	.byte	0x1
 	.byte	0x2
-	.4byte	.LASF42
-	.uleb128 0x8
 	.4byte	.LASF43
+	.uleb128 0x8
+	.4byte	.LASF44
 	.byte	0x18
 	.byte	0x20
-	.4byte	0x1b6
+	.4byte	0x1bb
 	.uleb128 0x8
-	.4byte	.LASF44
+	.4byte	.LASF45
 	.byte	0x18
 	.byte	0x21
-	.4byte	0x1c1
+	.4byte	0x1c6
 	.uleb128 0x8
-	.4byte	.LASF45
+	.4byte	.LASF46
 	.byte	0x18
 	.byte	0x2e
-	.4byte	0x1e2
+	.4byte	0x1e7
 	.uleb128 0x8
-	.4byte	.LASF46
+	.4byte	.LASF47
 	.byte	0x18
 	.byte	0x37
-	.4byte	0x1cc
+	.4byte	0x1d1
 	.uleb128 0x8
-	.4byte	.LASF47
+	.4byte	.LASF48
 	.byte	0x18
 	.byte	0x3c
-	.4byte	0x1d7
+	.4byte	0x1dc
 	.uleb128 0x8
-	.4byte	.LASF48
+	.4byte	.LASF49
 	.byte	0x18
 	.byte	0x67
-	.4byte	0x12a
+	.4byte	0x12f
 	.uleb128 0x8
-	.4byte	.LASF49
+	.4byte	.LASF50
 	.byte	0x18
 	.byte	0x6d
-	.4byte	0x13a
+	.4byte	0x13f
 	.uleb128 0x8
-	.4byte	.LASF50
+	.4byte	.LASF51
 	.byte	0x18
 	.byte	0x86
 	.4byte	0x29
 	.uleb128 0x8
-	.4byte	.LASF51
+	.4byte	.LASF52
 	.byte	0x18
 	.byte	0x87
 	.4byte	0x29
 	.uleb128 0x8
-	.4byte	.LASF52
+	.4byte	.LASF53
 	.byte	0x18
 	.byte	0x99
-	.4byte	0x155
+	.4byte	0x15a
 	.uleb128 0x8
-	.4byte	.LASF53
+	.4byte	.LASF54
 	.byte	0x18
 	.byte	0x9e
 	.4byte	0x6d
 	.uleb128 0x8
-	.4byte	.LASF54
+	.4byte	.LASF55
 	.byte	0x18
 	.byte	0xa0
 	.4byte	0x6d
 	.uleb128 0x8
-	.4byte	.LASF55
+	.4byte	.LASF56
 	.byte	0x18
 	.byte	0xa3
-	.4byte	0x155
+	.4byte	0x15a
 	.uleb128 0x8
-	.4byte	.LASF56
+	.4byte	.LASF57
 	.byte	0x18
 	.byte	0xa8
-	.4byte	0x331
+	.4byte	0x346
 	.uleb128 0x8
-	.4byte	.LASF57
+	.4byte	.LASF58
 	.byte	0x18
 	.byte	0xae
 	.4byte	0x29
@@ -10961,1117 +10948,1117 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x18
 	.byte	0xb0
-	.4byte	0x367
+	.4byte	0x37c
 	.uleb128 0xe
-	.4byte	.LASF58
+	.4byte	.LASF59
 	.byte	0x18
 	.byte	0xb1
 	.4byte	0xc6
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF59
+	.4byte	.LASF60
 	.byte	0x18
 	.byte	0xb2
-	.4byte	0x352
+	.4byte	0x367
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x18
 	.byte	0xb5
-	.4byte	0x387
+	.4byte	0x39c
 	.uleb128 0xe
-	.4byte	.LASF58
+	.4byte	.LASF59
 	.byte	0x18
 	.byte	0xb6
-	.4byte	0x194
+	.4byte	0x199
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF60
+	.4byte	.LASF61
 	.byte	0x18
 	.byte	0xb7
-	.4byte	0x372
+	.4byte	0x387
 	.uleb128 0xd
-	.4byte	.LASF62
+	.4byte	.LASF63
 	.byte	0x10
 	.byte	0x18
 	.byte	0xba
-	.4byte	0x3b7
+	.4byte	0x3cc
 	.uleb128 0xe
-	.4byte	.LASF63
+	.4byte	.LASF64
 	.byte	0x18
 	.byte	0xbb
-	.4byte	0x3b7
+	.4byte	0x3cc
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF64
+	.4byte	.LASF65
 	.byte	0x18
 	.byte	0xbb
-	.4byte	0x3b7
+	.4byte	0x3cc
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x392
+	.4byte	0x3a7
 	.uleb128 0xd
-	.4byte	.LASF65
+	.4byte	.LASF66
 	.byte	0x8
 	.byte	0x18
 	.byte	0xbe
-	.4byte	0x3d6
+	.4byte	0x3eb
 	.uleb128 0xe
-	.4byte	.LASF66
+	.4byte	.LASF67
 	.byte	0x18
 	.byte	0xbf
-	.4byte	0x3fb
+	.4byte	0x410
 	.byte	0
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF67
+	.4byte	.LASF68
 	.byte	0x10
 	.byte	0x18
 	.byte	0xc2
-	.4byte	0x3fb
+	.4byte	0x410
 	.uleb128 0xe
-	.4byte	.LASF63
+	.4byte	.LASF64
 	.byte	0x18
 	.byte	0xc3
-	.4byte	0x3fb
+	.4byte	0x410
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF68
+	.4byte	.LASF69
 	.byte	0x18
 	.byte	0xc3
-	.4byte	0x401
+	.4byte	0x416
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3d6
+	.4byte	0x3eb
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3fb
+	.4byte	0x410
 	.uleb128 0xd
-	.4byte	.LASF69
+	.4byte	.LASF70
 	.byte	0x10
 	.byte	0x18
 	.byte	0xe0
-	.4byte	0x42c
+	.4byte	0x441
 	.uleb128 0xe
-	.4byte	.LASF63
+	.4byte	.LASF64
 	.byte	0x18
 	.byte	0xe1
-	.4byte	0x42c
+	.4byte	0x441
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF70
+	.4byte	.LASF71
 	.byte	0x18
 	.byte	0xe2
-	.4byte	0x43d
+	.4byte	0x452
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x407
+	.4byte	0x41c
 	.uleb128 0x10
-	.4byte	0x43d
+	.4byte	0x452
 	.uleb128 0x11
-	.4byte	0x42c
+	.4byte	0x441
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x432
+	.4byte	0x447
 	.uleb128 0x12
 	.byte	0x8
 	.uleb128 0x13
-	.4byte	.LASF71
+	.4byte	.LASF72
 	.byte	0x19
 	.2byte	0x1da
-	.4byte	0x451
+	.4byte	0x466
 	.uleb128 0x14
-	.4byte	0x29b
-	.4byte	0x460
+	.4byte	0x2b0
+	.4byte	0x475
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x47b
-	.4byte	0x470
+	.4byte	0x490
+	.4byte	0x485
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x460
+	.4byte	0x475
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x445
+	.4byte	0x45a
 	.uleb128 0x3
-	.4byte	0x475
+	.4byte	0x48a
 	.uleb128 0x15
-	.4byte	.LASF74
+	.4byte	.LASF75
 	.byte	0x19
 	.2byte	0x1db
-	.4byte	0x470
+	.4byte	0x485
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x492
+	.4byte	0x4a7
 	.uleb128 0x16
 	.4byte	0xc6
 	.uleb128 0x8
-	.4byte	.LASF72
+	.4byte	.LASF73
 	.byte	0x1a
 	.byte	0x75
-	.4byte	0x4a2
+	.4byte	0x4b7
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4a8
+	.4byte	0x4bd
 	.uleb128 0x17
 	.uleb128 0x8
-	.4byte	.LASF73
+	.4byte	.LASF74
 	.byte	0x1a
 	.byte	0x78
 	.4byte	0xc6
 	.uleb128 0x5
-	.4byte	0x4a9
-	.4byte	0x4bf
+	.4byte	0x4be
+	.4byte	0x4d4
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF75
+	.4byte	.LASF76
 	.byte	0x1a
 	.byte	0x87
-	.4byte	0x4b4
+	.4byte	0x4c9
 	.uleb128 0x19
-	.4byte	.LASF76
+	.4byte	.LASF77
 	.byte	0x1a
 	.byte	0x87
-	.4byte	0x4b4
+	.4byte	0x4c9
 	.uleb128 0x19
-	.4byte	.LASF77
+	.4byte	.LASF78
 	.byte	0x1a
 	.byte	0x88
-	.4byte	0x4b4
+	.4byte	0x4c9
 	.uleb128 0x19
-	.4byte	.LASF78
+	.4byte	.LASF79
 	.byte	0x1a
 	.byte	0x88
-	.4byte	0x4b4
+	.4byte	0x4c9
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x4f6
+	.4byte	0x50b
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF79
+	.4byte	.LASF80
 	.byte	0x1a
 	.byte	0x8f
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
-	.4byte	.LASF80
+	.4byte	.LASF81
 	.byte	0x1a
 	.byte	0x90
-	.4byte	0x219
+	.4byte	0x21e
 	.uleb128 0x19
-	.4byte	.LASF81
+	.4byte	.LASF82
 	.byte	0x1a
 	.byte	0x91
 	.4byte	0x6d
 	.uleb128 0x19
-	.4byte	.LASF82
+	.4byte	.LASF83
 	.byte	0x1a
 	.byte	0x9a
-	.4byte	0x29b
+	.4byte	0x2b0
 	.uleb128 0x19
-	.4byte	.LASF83
+	.4byte	.LASF84
 	.byte	0x1a
 	.byte	0xa0
-	.4byte	0x4a2
+	.4byte	0x4b7
 	.uleb128 0x19
-	.4byte	.LASF84
+	.4byte	.LASF85
 	.byte	0x1a
 	.byte	0xa2
-	.4byte	0x29b
+	.4byte	0x2b0
 	.uleb128 0x19
-	.4byte	.LASF85
+	.4byte	.LASF86
 	.byte	0x1b
 	.byte	0x11
 	.4byte	0xc6
 	.uleb128 0x8
-	.4byte	.LASF86
+	.4byte	.LASF87
 	.byte	0x1c
 	.byte	0x18
-	.4byte	0x387
+	.4byte	0x39c
 	.uleb128 0x19
-	.4byte	.LASF87
+	.4byte	.LASF88
 	.byte	0x1d
 	.byte	0x3f
 	.4byte	0x29
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0x564
+	.4byte	0x579
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x559
+	.4byte	0x56e
 	.uleb128 0x19
-	.4byte	.LASF88
+	.4byte	.LASF89
 	.byte	0x1e
 	.byte	0xb
-	.4byte	0x564
+	.4byte	0x579
 	.uleb128 0x19
-	.4byte	.LASF89
+	.4byte	.LASF90
 	.byte	0x1e
 	.byte	0xc
 	.4byte	0x56
 	.uleb128 0x19
-	.4byte	.LASF90
+	.4byte	.LASF91
 	.byte	0x1e
 	.byte	0xd
-	.4byte	0x564
+	.4byte	0x579
 	.uleb128 0x5
 	.4byte	0xc6
-	.4byte	0x595
+	.4byte	0x5aa
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF91
+	.4byte	.LASF92
 	.byte	0x1e
 	.byte	0x40
-	.4byte	0x58a
+	.4byte	0x59f
 	.uleb128 0x19
-	.4byte	.LASF92
+	.4byte	.LASF93
 	.byte	0x1e
 	.byte	0x54
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
-	.4byte	.LASF93
+	.4byte	.LASF94
 	.byte	0x1e
 	.byte	0xc1
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF94
+	.4byte	.LASF95
 	.byte	0x1e
 	.byte	0xc2
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF95
+	.4byte	.LASF96
 	.byte	0x1e
 	.2byte	0x11d
 	.4byte	0xc6
 	.uleb128 0x1a
-	.4byte	.LASF96
+	.4byte	.LASF97
 	.2byte	0x120
 	.byte	0x1e
 	.2byte	0x1dd
-	.4byte	0x7b4
+	.4byte	0x7c9
 	.uleb128 0x1b
-	.4byte	.LASF97
+	.4byte	.LASF98
 	.byte	0x1f
 	.2byte	0x70e
-	.4byte	0x7566
+	.4byte	0x757b
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF98
+	.4byte	.LASF99
 	.byte	0x1f
 	.2byte	0x70f
-	.4byte	0x8869
+	.4byte	0x887e
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF99
+	.4byte	.LASF100
 	.byte	0x1f
 	.2byte	0x710
-	.4byte	0x8893
+	.4byte	0x88a8
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF100
+	.4byte	.LASF101
 	.byte	0x1f
 	.2byte	0x711
-	.4byte	0x88b7
+	.4byte	0x88cc
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF101
+	.4byte	.LASF102
 	.byte	0x1f
 	.2byte	0x712
-	.4byte	0x7913
+	.4byte	0x7928
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF102
+	.4byte	.LASF103
 	.byte	0x1f
 	.2byte	0x713
-	.4byte	0x7913
+	.4byte	0x7928
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF103
+	.4byte	.LASF104
 	.byte	0x1f
 	.2byte	0x714
-	.4byte	0x88d1
+	.4byte	0x88e6
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF104
+	.4byte	.LASF105
 	.byte	0x1f
 	.2byte	0x715
-	.4byte	0x88d1
+	.4byte	0x88e6
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF105
+	.4byte	.LASF106
 	.byte	0x1f
 	.2byte	0x716
-	.4byte	0x88f6
+	.4byte	0x890b
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF106
+	.4byte	.LASF107
 	.byte	0x1f
 	.2byte	0x717
-	.4byte	0x8915
+	.4byte	0x892a
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF107
+	.4byte	.LASF108
 	.byte	0x1f
 	.2byte	0x718
-	.4byte	0x8915
+	.4byte	0x892a
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF108
+	.4byte	.LASF109
 	.byte	0x1f
 	.2byte	0x719
-	.4byte	0x892f
+	.4byte	0x8944
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF109
+	.4byte	.LASF110
 	.byte	0x1f
 	.2byte	0x71a
 	.4byte	0x29
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF110
+	.4byte	.LASF111
 	.byte	0x1f
 	.2byte	0x71b
-	.4byte	0x8949
+	.4byte	0x895e
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF111
+	.4byte	.LASF112
 	.byte	0x1f
 	.2byte	0x71c
-	.4byte	0x8963
+	.4byte	0x8978
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF112
+	.4byte	.LASF113
 	.byte	0x1f
 	.2byte	0x71d
-	.4byte	0x8949
+	.4byte	0x895e
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF113
+	.4byte	.LASF114
 	.byte	0x1f
 	.2byte	0x71e
-	.4byte	0x8987
+	.4byte	0x899c
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF114
+	.4byte	.LASF115
 	.byte	0x1f
 	.2byte	0x71f
-	.4byte	0x89a6
+	.4byte	0x89bb
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF115
+	.4byte	.LASF116
 	.byte	0x1f
 	.2byte	0x720
-	.4byte	0x89c5
+	.4byte	0x89da
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF116
+	.4byte	.LASF117
 	.byte	0x1f
 	.2byte	0x721
-	.4byte	0x89f3
+	.4byte	0x8a08
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF117
+	.4byte	.LASF118
 	.byte	0x1f
 	.2byte	0x722
-	.4byte	0x59e9
+	.4byte	0x59fe
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF118
+	.4byte	.LASF119
 	.byte	0x1f
 	.2byte	0x723
-	.4byte	0x8a08
+	.4byte	0x8a1d
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF119
+	.4byte	.LASF120
 	.byte	0x1f
 	.2byte	0x724
-	.4byte	0x89c5
+	.4byte	0x89da
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF120
+	.4byte	.LASF121
 	.byte	0x1f
 	.2byte	0x725
-	.4byte	0x8a31
+	.4byte	0x8a46
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF121
+	.4byte	.LASF122
 	.byte	0x1f
 	.2byte	0x726
-	.4byte	0x8a5a
+	.4byte	0x8a6f
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF122
+	.4byte	.LASF123
 	.byte	0x1f
 	.2byte	0x727
-	.4byte	0x8a84
+	.4byte	0x8a99
 	.byte	0xc8
 	.uleb128 0x1b
-	.4byte	.LASF123
+	.4byte	.LASF124
 	.byte	0x1f
 	.2byte	0x728
-	.4byte	0x8aa8
+	.4byte	0x8abd
 	.byte	0xd0
 	.uleb128 0x1b
-	.4byte	.LASF124
+	.4byte	.LASF125
 	.byte	0x1f
 	.2byte	0x72a
-	.4byte	0x8b6c
+	.4byte	0x8b81
 	.byte	0xd8
 	.uleb128 0x1b
-	.4byte	.LASF125
+	.4byte	.LASF126
 	.byte	0x1f
 	.2byte	0x72e
-	.4byte	0x8b9a
+	.4byte	0x8baf
 	.byte	0xe0
 	.uleb128 0x1b
-	.4byte	.LASF126
+	.4byte	.LASF127
 	.byte	0x1f
 	.2byte	0x730
-	.4byte	0x8bc3
+	.4byte	0x8bd8
 	.byte	0xe8
 	.uleb128 0x1b
-	.4byte	.LASF127
+	.4byte	.LASF128
 	.byte	0x1f
 	.2byte	0x732
-	.4byte	0x8bc3
+	.4byte	0x8bd8
 	.byte	0xf0
 	.uleb128 0x1b
-	.4byte	.LASF128
+	.4byte	.LASF129
 	.byte	0x1f
 	.2byte	0x734
-	.4byte	0x8987
+	.4byte	0x899c
 	.byte	0xf8
 	.uleb128 0x1c
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x1f
 	.2byte	0x736
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x100
 	.uleb128 0x1c
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x1f
 	.2byte	0x737
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x108
 	.uleb128 0x1c
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x1f
 	.2byte	0x738
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x110
 	.uleb128 0x1c
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x1f
 	.2byte	0x739
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x118
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x5cd
+	.4byte	0x5e2
 	.uleb128 0x15
-	.4byte	.LASF133
+	.4byte	.LASF134
 	.byte	0x1e
 	.2byte	0x1dd
-	.4byte	0x7b4
+	.4byte	0x7c9
 	.uleb128 0x1d
-	.4byte	.LASF134
+	.4byte	.LASF135
 	.byte	0x10
 	.byte	0x20
 	.2byte	0x129
-	.4byte	0x7eb
+	.4byte	0x800
 	.uleb128 0xe
-	.4byte	.LASF115
+	.4byte	.LASF116
 	.byte	0x21
 	.byte	0x3d
-	.4byte	0xe50
+	.4byte	0xe65
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF135
+	.4byte	.LASF136
 	.byte	0x21
 	.byte	0x3e
-	.4byte	0x67b3
+	.4byte	0x67c8
 	.byte	0x8
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF136
+	.4byte	.LASF137
 	.byte	0x20
 	.2byte	0x129
-	.4byte	0x7c5
+	.4byte	0x7da
 	.uleb128 0x10
-	.4byte	0x802
+	.4byte	0x817
 	.uleb128 0x11
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF137
+	.4byte	.LASF138
 	.byte	0x20
 	.2byte	0x12a
-	.4byte	0x80e
+	.4byte	0x823
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7f7
+	.4byte	0x80c
 	.uleb128 0x14
-	.4byte	0x194
-	.4byte	0x823
+	.4byte	0x199
+	.4byte	0x838
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF138
+	.4byte	.LASF139
 	.byte	0x20
 	.2byte	0x12b
-	.4byte	0x82f
+	.4byte	0x844
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x814
+	.4byte	0x829
 	.uleb128 0x15
-	.4byte	.LASF139
+	.4byte	.LASF140
 	.byte	0x20
 	.2byte	0x1f6
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF140
+	.4byte	.LASF141
 	.byte	0x20
 	.2byte	0x1f7
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF141
+	.4byte	.LASF142
 	.byte	0x20
 	.2byte	0x1f8
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF142
+	.4byte	.LASF143
 	.byte	0x20
 	.2byte	0x1f9
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF143
+	.4byte	.LASF144
 	.byte	0x20
 	.2byte	0x1fa
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF144
+	.4byte	.LASF145
 	.byte	0x20
 	.2byte	0x1fb
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF145
+	.4byte	.LASF146
 	.byte	0x20
 	.2byte	0x1fc
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF146
+	.4byte	.LASF147
 	.byte	0x20
 	.2byte	0x1fd
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF147
+	.4byte	.LASF148
 	.byte	0x20
 	.2byte	0x1ff
-	.4byte	0x29b
+	.4byte	0x2b0
 	.uleb128 0x15
-	.4byte	.LASF148
+	.4byte	.LASF149
 	.byte	0x20
 	.2byte	0x206
-	.4byte	0x367
+	.4byte	0x37c
 	.uleb128 0x15
-	.4byte	.LASF149
+	.4byte	.LASF150
 	.byte	0x20
 	.2byte	0x21a
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF150
+	.4byte	.LASF151
 	.byte	0x20
 	.2byte	0x21c
-	.4byte	0x29b
+	.4byte	0x2b0
 	.uleb128 0x1e
-	.4byte	.LASF179
+	.4byte	.LASF180
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x20
 	.2byte	0x222
-	.4byte	0x901
+	.4byte	0x916
 	.uleb128 0xc
-	.4byte	.LASF151
+	.4byte	.LASF152
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF152
+	.4byte	.LASF153
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF153
+	.4byte	.LASF154
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF154
+	.4byte	.LASF155
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF155
+	.4byte	.LASF156
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF156
+	.4byte	.LASF157
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF157
+	.4byte	.LASF158
 	.byte	0x6
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF158
+	.4byte	.LASF159
 	.byte	0x20
 	.2byte	0x22a
-	.4byte	0x8c5
+	.4byte	0x8da
 	.uleb128 0x1d
-	.4byte	.LASF159
+	.4byte	.LASF160
 	.byte	0x3
 	.byte	0x20
 	.2byte	0x241
-	.4byte	0x942
+	.4byte	0x957
 	.uleb128 0x1b
-	.4byte	.LASF160
+	.4byte	.LASF161
 	.byte	0x20
 	.2byte	0x242
 	.4byte	0x61
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF161
+	.4byte	.LASF162
 	.byte	0x20
 	.2byte	0x243
 	.4byte	0x61
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF162
+	.4byte	.LASF163
 	.byte	0x20
 	.2byte	0x244
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x2
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x90d
+	.4byte	0x922
 	.uleb128 0x5
-	.4byte	0x942
 	.4byte	0x957
+	.4byte	0x96c
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x11
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x947
+	.4byte	0x95c
 	.uleb128 0x15
-	.4byte	.LASF163
+	.4byte	.LASF164
 	.byte	0x20
 	.2byte	0x247
-	.4byte	0x957
+	.4byte	0x96c
 	.uleb128 0x15
-	.4byte	.LASF164
+	.4byte	.LASF165
 	.byte	0x20
 	.2byte	0x249
-	.4byte	0x564
+	.4byte	0x579
 	.uleb128 0x15
-	.4byte	.LASF165
+	.4byte	.LASF166
 	.byte	0x20
 	.2byte	0x254
-	.4byte	0x564
+	.4byte	0x579
 	.uleb128 0xd
-	.4byte	.LASF166
+	.4byte	.LASF167
 	.byte	0xc
 	.byte	0x22
 	.byte	0x17
-	.4byte	0x9bd
+	.4byte	0x9d2
 	.uleb128 0xe
-	.4byte	.LASF167
+	.4byte	.LASF168
 	.byte	0x22
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF168
+	.4byte	.LASF169
 	.byte	0x22
 	.byte	0x21
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF169
+	.4byte	.LASF170
 	.byte	0x22
 	.byte	0x23
 	.4byte	0xb4
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x22
 	.byte	0x25
 	.4byte	0xb4
 	.byte	0xa
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF171
+	.4byte	.LASF172
 	.byte	0x23
 	.byte	0x8
-	.4byte	0xdd
+	.4byte	0xe2
 	.uleb128 0xd
-	.4byte	.LASF172
+	.4byte	.LASF173
 	.byte	0x10
 	.byte	0x24
 	.byte	0xa
-	.4byte	0x9ed
+	.4byte	0xa02
 	.uleb128 0xe
-	.4byte	.LASF173
+	.4byte	.LASF174
 	.byte	0x24
 	.byte	0xb
-	.4byte	0x1ed
+	.4byte	0x1f2
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF174
+	.4byte	.LASF175
 	.byte	0x24
 	.byte	0xc
-	.4byte	0x194
+	.4byte	0x199
 	.byte	0x8
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF175
+	.4byte	.LASF176
 	.byte	0x8
 	.byte	0x24
 	.byte	0x15
-	.4byte	0xa12
+	.4byte	0xa27
 	.uleb128 0xe
-	.4byte	.LASF176
+	.4byte	.LASF177
 	.byte	0x24
 	.byte	0x16
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF177
+	.4byte	.LASF178
 	.byte	0x24
 	.byte	0x17
 	.4byte	0xc6
 	.byte	0x4
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF178
+	.4byte	.LASF179
 	.byte	0x10
 	.byte	0x23
 	.byte	0x15
-	.4byte	0xa37
+	.4byte	0xa4c
 	.uleb128 0xe
-	.4byte	.LASF173
+	.4byte	.LASF174
 	.byte	0x23
 	.byte	0x16
-	.4byte	0x9bd
+	.4byte	0x9d2
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF174
+	.4byte	.LASF175
 	.byte	0x23
 	.byte	0x17
-	.4byte	0x194
+	.4byte	0x199
 	.byte	0x8
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF180
+	.4byte	.LASF181
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x25
 	.byte	0x10
-	.4byte	0xa5a
+	.4byte	0xa6f
 	.uleb128 0xc
-	.4byte	.LASF181
+	.4byte	.LASF182
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF182
+	.4byte	.LASF183
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF183
+	.4byte	.LASF184
 	.byte	0x2
 	.byte	0
 	.uleb128 0xf
 	.byte	0x28
 	.byte	0x25
 	.byte	0x1d
-	.4byte	0xaab
+	.4byte	0xac0
 	.uleb128 0xe
-	.4byte	.LASF184
+	.4byte	.LASF185
 	.byte	0x25
 	.byte	0x1e
-	.4byte	0xaab
+	.4byte	0xac0
 	.byte	0
 	.uleb128 0x20
 	.string	"val"
 	.byte	0x25
 	.byte	0x1f
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x25
 	.byte	0x20
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF185
+	.4byte	.LASF186
 	.byte	0x25
 	.byte	0x21
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF186
+	.4byte	.LASF187
 	.byte	0x25
 	.byte	0x22
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF187
+	.4byte	.LASF188
 	.byte	0x25
 	.byte	0x23
-	.4byte	0xaab
+	.4byte	0xac0
 	.byte	0x20
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x13a
+	.4byte	0x13f
 	.uleb128 0x21
 	.byte	0x8
 	.byte	0x25
 	.byte	0x29
-	.4byte	0xad0
+	.4byte	0xae5
 	.uleb128 0x22
-	.4byte	.LASF188
+	.4byte	.LASF189
 	.byte	0x25
 	.byte	0x2a
-	.4byte	0xad0
+	.4byte	0xae5
 	.uleb128 0x22
-	.4byte	.LASF189
+	.4byte	.LASF190
 	.byte	0x25
 	.byte	0x2b
-	.4byte	0xafb
+	.4byte	0xb10
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9c8
+	.4byte	0x9dd
 	.uleb128 0xd
-	.4byte	.LASF190
+	.4byte	.LASF191
 	.byte	0x8
 	.byte	0x26
 	.byte	0xa
-	.4byte	0xafb
+	.4byte	0xb10
 	.uleb128 0xe
-	.4byte	.LASF173
+	.4byte	.LASF174
 	.byte	0x26
 	.byte	0xb
-	.4byte	0x22ac
+	.4byte	0x22c1
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF174
+	.4byte	.LASF175
 	.byte	0x26
 	.byte	0xc
-	.4byte	0x12a
+	.4byte	0x12f
 	.byte	0x4
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xad6
+	.4byte	0xaeb
 	.uleb128 0xf
 	.byte	0x18
 	.byte	0x25
 	.byte	0x26
-	.4byte	0xb34
+	.4byte	0xb49
 	.uleb128 0xe
-	.4byte	.LASF191
+	.4byte	.LASF192
 	.byte	0x25
 	.byte	0x27
-	.4byte	0x290
+	.4byte	0x2a5
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF192
+	.4byte	.LASF193
 	.byte	0x25
 	.byte	0x28
-	.4byte	0xa37
+	.4byte	0xa4c
 	.byte	0x4
 	.uleb128 0x23
-	.4byte	0xab1
+	.4byte	0xac6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF193
+	.4byte	.LASF194
 	.byte	0x25
 	.byte	0x2d
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x10
 	.byte	0
 	.uleb128 0xf
 	.byte	0x20
 	.byte	0x25
 	.byte	0x30
-	.4byte	0xb79
+	.4byte	0xb8e
 	.uleb128 0xe
-	.4byte	.LASF194
+	.4byte	.LASF195
 	.byte	0x25
 	.byte	0x31
-	.4byte	0xb7e
+	.4byte	0xb93
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF195
+	.4byte	.LASF196
 	.byte	0x25
 	.byte	0x32
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF196
+	.4byte	.LASF197
 	.byte	0x25
 	.byte	0x33
 	.4byte	0xc6
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF173
+	.4byte	.LASF174
 	.byte	0x25
 	.byte	0x34
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF174
+	.4byte	.LASF175
 	.byte	0x25
 	.byte	0x35
 	.4byte	0x29
 	.byte	0x18
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF243
+	.4byte	.LASF244
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb79
+	.4byte	0xb8e
 	.uleb128 0x21
 	.byte	0x28
 	.byte	0x25
 	.byte	0x1b
-	.4byte	0xbae
+	.4byte	0xbc3
 	.uleb128 0x22
-	.4byte	.LASF197
+	.4byte	.LASF198
 	.byte	0x25
 	.byte	0x24
-	.4byte	0xa5a
+	.4byte	0xa6f
 	.uleb128 0x22
-	.4byte	.LASF198
+	.4byte	.LASF199
 	.byte	0x25
 	.byte	0x2e
-	.4byte	0xb01
+	.4byte	0xb16
 	.uleb128 0x22
-	.4byte	.LASF105
+	.4byte	.LASF106
 	.byte	0x25
 	.byte	0x36
-	.4byte	0xb34
+	.4byte	0xb49
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF199
+	.4byte	.LASF200
 	.byte	0x30
 	.byte	0x25
 	.byte	0x19
-	.4byte	0xbcc
+	.4byte	0xbe1
 	.uleb128 0x20
 	.string	"fn"
 	.byte	0x25
 	.byte	0x1a
-	.4byte	0xbe1
+	.4byte	0xbf6
 	.byte	0
 	.uleb128 0x23
-	.4byte	0xb84
+	.4byte	0xb99
 	.byte	0x8
 	.byte	0
 	.uleb128 0x14
-	.4byte	0x194
-	.4byte	0xbdb
+	.4byte	0x199
+	.4byte	0xbf0
 	.uleb128 0x11
-	.4byte	0xbdb
+	.4byte	0xbf0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbae
+	.4byte	0xbc3
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbcc
+	.4byte	0xbe1
 	.uleb128 0x19
-	.4byte	.LASF200
+	.4byte	.LASF201
 	.byte	0x27
 	.byte	0xb7
-	.4byte	0x14a
+	.4byte	0x14f
 	.uleb128 0x19
-	.4byte	.LASF201
+	.4byte	.LASF202
 	.byte	0x27
 	.byte	0xbc
-	.4byte	0x155
+	.4byte	0x15a
 	.uleb128 0x19
-	.4byte	.LASF202
+	.4byte	.LASF203
 	.byte	0x27
 	.byte	0xbf
-	.4byte	0x155
+	.4byte	0x15a
 	.uleb128 0x25
-	.4byte	.LASF310
+	.4byte	.LASF311
 	.byte	0x34
 	.byte	0x8
 	.4byte	0x29
 	.uleb128 0x8
-	.4byte	.LASF203
+	.4byte	.LASF204
 	.byte	0x28
 	.byte	0x22
 	.4byte	0x29
 	.uleb128 0xd
-	.4byte	.LASF204
+	.4byte	.LASF205
 	.byte	0x20
 	.byte	0x28
 	.byte	0x27
-	.4byte	0xc5b
+	.4byte	0xc70
 	.uleb128 0xe
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x28
 	.byte	0x28
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF205
+	.4byte	.LASF206
 	.byte	0x28
 	.byte	0x29
-	.4byte	0xc13
+	.4byte	0xc28
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF206
+	.4byte	.LASF207
 	.byte	0x28
 	.byte	0x2b
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF207
+	.4byte	.LASF208
 	.byte	0x28
 	.byte	0x2d
 	.4byte	0xc6
 	.byte	0x18
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF208
+	.4byte	.LASF209
 	.byte	0x29
 	.byte	0x34
 	.4byte	0x6d
 	.uleb128 0x19
-	.4byte	.LASF209
+	.4byte	.LASF210
 	.byte	0x29
 	.byte	0x34
 	.4byte	0x6d
 	.uleb128 0x19
-	.4byte	.LASF210
+	.4byte	.LASF211
 	.byte	0x29
 	.byte	0x3f
 	.4byte	0x29
 	.uleb128 0x5
-	.4byte	0xc8c
-	.4byte	0xc8c
+	.4byte	0xca1
+	.4byte	0xca1
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1f
@@ -12079,48 +12066,48 @@ __exitcall_ebc_exit:
 	.uleb128 0x2
 	.byte	0x10
 	.byte	0x7
-	.4byte	.LASF211
+	.4byte	.LASF212
 	.uleb128 0x5
 	.4byte	0xd2
-	.4byte	0xca3
+	.4byte	0xcb8
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x26
-	.4byte	.LASF212
+	.4byte	.LASF213
 	.2byte	0x210
 	.byte	0x2a
 	.byte	0x4f
-	.4byte	0xce4
+	.4byte	0xcf9
 	.uleb128 0xe
-	.4byte	.LASF213
+	.4byte	.LASF214
 	.byte	0x2a
 	.byte	0x50
-	.4byte	0xc7c
+	.4byte	0xc91
 	.byte	0
 	.uleb128 0x27
-	.4byte	.LASF214
+	.4byte	.LASF215
 	.byte	0x2a
 	.byte	0x51
 	.4byte	0xd2
 	.2byte	0x200
 	.uleb128 0x27
-	.4byte	.LASF215
+	.4byte	.LASF216
 	.byte	0x2a
 	.byte	0x52
 	.4byte	0xd2
 	.2byte	0x204
 	.uleb128 0x27
-	.4byte	.LASF216
+	.4byte	.LASF217
 	.byte	0x2a
 	.byte	0x53
-	.4byte	0xce4
+	.4byte	0xcf9
 	.2byte	0x208
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xd2
-	.4byte	0xcf4
+	.4byte	0xd09
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
@@ -12129,89 +12116,89 @@ __exitcall_ebc_exit:
 	.byte	0x2
 	.byte	0x2b
 	.byte	0x29
-	.4byte	0xd15
+	.4byte	0xd2a
 	.uleb128 0xe
-	.4byte	.LASF217
+	.4byte	.LASF218
 	.byte	0x2b
 	.byte	0x2a
-	.4byte	0x10b
+	.4byte	0x110
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF218
+	.4byte	.LASF219
 	.byte	0x2b
 	.byte	0x2b
-	.4byte	0x10b
+	.4byte	0x110
 	.byte	0x1
 	.byte	0
 	.uleb128 0xf
 	.byte	0x4
 	.byte	0x2b
 	.byte	0x2d
-	.4byte	0xd36
+	.4byte	0xd4b
 	.uleb128 0xe
-	.4byte	.LASF219
+	.4byte	.LASF220
 	.byte	0x2b
 	.byte	0x2e
-	.4byte	0x11a
+	.4byte	0x11f
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF220
+	.4byte	.LASF221
 	.byte	0x2b
 	.byte	0x2f
-	.4byte	0x11a
+	.4byte	0x11f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x21
 	.byte	0x4
 	.byte	0x2b
 	.byte	0x20
-	.4byte	0xd54
+	.4byte	0xd69
 	.uleb128 0x28
 	.string	"val"
 	.byte	0x2b
 	.byte	0x21
-	.4byte	0x367
+	.4byte	0x37c
 	.uleb128 0x29
-	.4byte	0xcf4
+	.4byte	0xd09
 	.uleb128 0x29
-	.4byte	0xd15
+	.4byte	0xd2a
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF221
+	.4byte	.LASF222
 	.byte	0x4
 	.byte	0x2b
 	.byte	0x1f
-	.4byte	0xd67
+	.4byte	0xd7c
 	.uleb128 0x23
-	.4byte	0xd36
+	.4byte	0xd4b
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF222
+	.4byte	.LASF223
 	.byte	0x2b
 	.byte	0x3d
-	.4byte	0xd54
+	.4byte	0xd69
 	.uleb128 0xf
 	.byte	0x4
 	.byte	0x2c
 	.byte	0x10
-	.4byte	0xd93
+	.4byte	0xda8
 	.uleb128 0xe
-	.4byte	.LASF223
+	.4byte	.LASF224
 	.byte	0x2c
 	.byte	0x12
-	.4byte	0x10b
+	.4byte	0x110
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF224
+	.4byte	.LASF225
 	.byte	0x2c
 	.byte	0x13
-	.4byte	0xd93
+	.4byte	0xda8
 	.byte	0x1
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x10b
-	.4byte	0xda3
+	.4byte	0x110
+	.4byte	0xdb8
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
@@ -12220,731 +12207,731 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x2c
 	.byte	0xe
-	.4byte	0xdbc
+	.4byte	0xdd1
 	.uleb128 0x22
-	.4byte	.LASF225
+	.4byte	.LASF226
 	.byte	0x2c
 	.byte	0xf
-	.4byte	0x367
+	.4byte	0x37c
 	.uleb128 0x29
-	.4byte	0xd72
+	.4byte	0xd87
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF226
+	.4byte	.LASF227
 	.byte	0x8
 	.byte	0x2c
 	.byte	0xd
-	.4byte	0xddb
+	.4byte	0xdf0
 	.uleb128 0x23
-	.4byte	0xda3
+	.4byte	0xdb8
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF227
+	.4byte	.LASF228
 	.byte	0x2c
 	.byte	0x1a
-	.4byte	0xd67
+	.4byte	0xd7c
 	.byte	0x4
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF228
+	.4byte	.LASF229
 	.byte	0x2c
 	.byte	0x1b
-	.4byte	0xdbc
+	.4byte	0xdd1
 	.uleb128 0x19
-	.4byte	.LASF229
+	.4byte	.LASF230
 	.byte	0x2d
 	.byte	0x11
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF230
+	.4byte	.LASF231
 	.byte	0x2d
 	.byte	0x12
 	.4byte	0xc6
 	.uleb128 0x2a
-	.4byte	.LASF987
+	.4byte	.LASF988
 	.byte	0
 	.byte	0x2d
 	.2byte	0x1b1
 	.uleb128 0xd
-	.4byte	.LASF231
+	.4byte	.LASF232
 	.byte	0x4
 	.byte	0x2e
 	.byte	0x14
-	.4byte	0xe1e
+	.4byte	0xe33
 	.uleb128 0xe
-	.4byte	.LASF232
+	.4byte	.LASF233
 	.byte	0x2e
 	.byte	0x15
-	.4byte	0xd67
+	.4byte	0xd7c
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF233
+	.4byte	.LASF234
 	.byte	0x2e
 	.byte	0x1d
-	.4byte	0xe05
+	.4byte	0xe1a
 	.uleb128 0x21
 	.byte	0x4
 	.byte	0x2e
 	.byte	0x3e
-	.4byte	0xe3d
+	.4byte	0xe52
 	.uleb128 0x22
-	.4byte	.LASF234
+	.4byte	.LASF235
 	.byte	0x2e
 	.byte	0x3f
-	.4byte	0xe05
+	.4byte	0xe1a
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF235
+	.4byte	.LASF236
 	.byte	0x4
 	.byte	0x2e
 	.byte	0x3d
-	.4byte	0xe50
+	.4byte	0xe65
 	.uleb128 0x23
-	.4byte	0xe29
+	.4byte	0xe3e
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF236
+	.4byte	.LASF237
 	.byte	0x2e
 	.byte	0x49
-	.4byte	0xe3d
+	.4byte	0xe52
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x2f
 	.byte	0xb
-	.4byte	0xe70
+	.4byte	0xe85
 	.uleb128 0xe
-	.4byte	.LASF232
+	.4byte	.LASF233
 	.byte	0x2f
 	.byte	0xc
-	.4byte	0xddb
+	.4byte	0xdf0
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF237
+	.4byte	.LASF238
 	.byte	0x2f
 	.byte	0x14
-	.4byte	0xe5b
+	.4byte	0xe70
 	.uleb128 0x19
-	.4byte	.LASF238
+	.4byte	.LASF239
 	.byte	0x30
 	.byte	0x4f
-	.4byte	0x29b
+	.4byte	0x2b0
 	.uleb128 0x21
 	.byte	0x8
 	.byte	0x30
 	.byte	0x66
-	.4byte	0xeb0
+	.4byte	0xec5
 	.uleb128 0x22
-	.4byte	.LASF192
+	.4byte	.LASF193
 	.byte	0x30
 	.byte	0x67
 	.4byte	0x29
 	.uleb128 0x22
-	.4byte	.LASF239
+	.4byte	.LASF240
 	.byte	0x30
 	.byte	0x68
-	.4byte	0xee1
+	.4byte	0xef6
 	.uleb128 0x22
-	.4byte	.LASF63
+	.4byte	.LASF64
 	.byte	0x30
 	.byte	0x69
-	.4byte	0xeec
+	.4byte	0xf01
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF240
+	.4byte	.LASF241
 	.byte	0x18
 	.byte	0x31
 	.byte	0x3b
-	.4byte	0xee1
+	.4byte	0xef6
 	.uleb128 0xe
-	.4byte	.LASF241
+	.4byte	.LASF242
 	.byte	0x31
 	.byte	0x3c
-	.4byte	0xf11
+	.4byte	0xf26
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF242
+	.4byte	.LASF243
 	.byte	0x31
 	.byte	0x3d
-	.4byte	0xf11
+	.4byte	0xf26
 	.byte	0x8
 	.uleb128 0x20
 	.string	"key"
 	.byte	0x31
 	.byte	0x3e
-	.4byte	0xf11
+	.4byte	0xf26
 	.byte	0x10
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xeb0
+	.4byte	0xec5
 	.uleb128 0x24
-	.4byte	.LASF244
+	.4byte	.LASF245
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xee7
+	.4byte	0xefc
 	.uleb128 0xd
-	.4byte	.LASF245
+	.4byte	.LASF246
 	.byte	0x10
 	.byte	0x30
 	.byte	0x57
-	.4byte	0xf11
+	.4byte	0xf26
 	.uleb128 0xe
-	.4byte	.LASF246
+	.4byte	.LASF247
 	.byte	0x30
 	.byte	0x58
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0
 	.uleb128 0x23
-	.4byte	0xe86
+	.4byte	0xe9b
 	.byte	0x8
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF247
+	.4byte	.LASF248
 	.byte	0x31
 	.byte	0x39
-	.4byte	0x155
+	.4byte	0x15a
 	.uleb128 0x5
-	.4byte	0xeb0
-	.4byte	0xf27
+	.4byte	0xec5
+	.4byte	0xf3c
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF248
+	.4byte	.LASF249
 	.byte	0x30
 	.byte	0x92
-	.4byte	0xf1c
+	.4byte	0xf31
 	.uleb128 0x19
-	.4byte	.LASF249
+	.4byte	.LASF250
 	.byte	0x30
 	.byte	0x93
-	.4byte	0xf1c
+	.4byte	0xf31
 	.uleb128 0x1d
-	.4byte	.LASF250
+	.4byte	.LASF251
 	.byte	0x10
 	.byte	0x30
 	.2byte	0x120
-	.4byte	0xf58
+	.4byte	0xf6d
 	.uleb128 0x2b
 	.string	"key"
 	.byte	0x30
 	.2byte	0x121
-	.4byte	0xef2
+	.4byte	0xf07
 	.byte	0
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF251
+	.4byte	.LASF252
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x32
 	.byte	0x2f
-	.4byte	0xf81
+	.4byte	0xf96
 	.uleb128 0xc
-	.4byte	.LASF252
+	.4byte	.LASF253
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF253
+	.4byte	.LASF254
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF254
+	.4byte	.LASF255
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF255
+	.4byte	.LASF256
 	.byte	0x3
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF256
+	.4byte	.LASF257
 	.byte	0x18
 	.byte	0x32
 	.byte	0x42
-	.4byte	0xfe2
+	.4byte	0xff7
 	.uleb128 0xe
-	.4byte	.LASF257
+	.4byte	.LASF258
 	.byte	0x32
 	.byte	0x43
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF258
+	.4byte	.LASF259
 	.byte	0x32
 	.byte	0x44
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.uleb128 0xe
-	.4byte	.LASF259
+	.4byte	.LASF260
 	.byte	0x32
 	.byte	0x45
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x2
 	.uleb128 0xe
-	.4byte	.LASF192
+	.4byte	.LASF193
 	.byte	0x32
 	.byte	0x46
-	.4byte	0xf58
+	.4byte	0xf6d
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF260
+	.4byte	.LASF261
 	.byte	0x32
 	.byte	0x47
-	.4byte	0x10b
+	.4byte	0x110
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF261
+	.4byte	.LASF262
 	.byte	0x32
 	.byte	0x48
-	.4byte	0x10b
+	.4byte	0x110
 	.byte	0x9
 	.uleb128 0xe
-	.4byte	.LASF262
+	.4byte	.LASF263
 	.byte	0x32
 	.byte	0x49
-	.4byte	0x14a
+	.4byte	0x14f
 	.byte	0x10
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xf81
+	.4byte	0xf96
 	.uleb128 0xd
-	.4byte	.LASF263
+	.4byte	.LASF264
 	.byte	0x30
 	.byte	0x32
 	.byte	0x51
-	.4byte	0x103c
+	.4byte	0x1051
 	.uleb128 0xe
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0x32
 	.byte	0x52
 	.4byte	0x56
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF265
+	.4byte	.LASF266
 	.byte	0x32
 	.byte	0x53
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF266
+	.4byte	.LASF267
 	.byte	0x32
 	.byte	0x54
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF267
+	.4byte	.LASF268
 	.byte	0x32
 	.byte	0x55
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF268
+	.4byte	.LASF269
 	.byte	0x32
 	.byte	0x56
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF269
+	.4byte	.LASF270
 	.byte	0x32
 	.byte	0x57
-	.4byte	0x103c
+	.4byte	0x1051
 	.byte	0x28
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xfe2
+	.4byte	0xff7
 	.uleb128 0x19
-	.4byte	.LASF270
+	.4byte	.LASF271
 	.byte	0x32
 	.byte	0x5a
-	.4byte	0xfe7
+	.4byte	0xffc
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0x105d
+	.4byte	0x1072
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF271
+	.4byte	.LASF272
 	.byte	0x32
 	.2byte	0x165
-	.4byte	0x104d
+	.4byte	0x1062
 	.uleb128 0x5
-	.4byte	0xf3d
-	.4byte	0x1079
+	.4byte	0xf52
+	.4byte	0x108e
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3d
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF272
+	.4byte	.LASF273
 	.byte	0x32
 	.2byte	0x166
-	.4byte	0x1069
+	.4byte	0x107e
 	.uleb128 0x15
-	.4byte	.LASF273
+	.4byte	.LASF274
 	.byte	0x32
 	.2byte	0x167
-	.4byte	0xf3d
-	.uleb128 0x19
-	.4byte	.LASF274
-	.byte	0x33
-	.byte	0x23
-	.4byte	0x4eb
+	.4byte	0xf52
 	.uleb128 0x19
 	.4byte	.LASF275
 	.byte	0x33
 	.byte	0x23
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF276
 	.byte	0x33
 	.byte	0x23
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF277
 	.byte	0x33
-	.byte	0x24
-	.4byte	0x4eb
+	.byte	0x23
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF278
 	.byte	0x33
 	.byte	0x24
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF279
 	.byte	0x33
 	.byte	0x24
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF280
 	.byte	0x33
-	.byte	0x25
-	.4byte	0x4eb
+	.byte	0x24
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF281
 	.byte	0x33
 	.byte	0x25
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF282
 	.byte	0x33
-	.byte	0x26
-	.4byte	0x4eb
+	.byte	0x25
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF283
 	.byte	0x33
 	.byte	0x26
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF284
 	.byte	0x33
-	.byte	0x27
-	.4byte	0x4eb
+	.byte	0x26
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF285
 	.byte	0x33
 	.byte	0x27
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF286
 	.byte	0x33
-	.byte	0x28
-	.4byte	0x4eb
+	.byte	0x27
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF287
 	.byte	0x33
 	.byte	0x28
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF288
 	.byte	0x33
-	.byte	0x29
-	.4byte	0x4eb
+	.byte	0x28
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF289
 	.byte	0x33
-	.byte	0x2a
-	.4byte	0x4eb
+	.byte	0x29
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF290
 	.byte	0x33
 	.byte	0x2a
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF291
 	.byte	0x33
 	.byte	0x2a
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF292
 	.byte	0x33
-	.byte	0x2b
-	.4byte	0x4eb
+	.byte	0x2a
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF293
 	.byte	0x33
 	.byte	0x2b
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF294
 	.byte	0x33
-	.byte	0x2c
-	.4byte	0x4eb
+	.byte	0x2b
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF295
 	.byte	0x33
 	.byte	0x2c
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF296
 	.byte	0x33
-	.byte	0x2d
-	.4byte	0x4eb
+	.byte	0x2c
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF297
 	.byte	0x33
 	.byte	0x2d
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF298
 	.byte	0x33
-	.byte	0x2e
-	.4byte	0x4eb
+	.byte	0x2d
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF299
 	.byte	0x33
 	.byte	0x2e
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF300
 	.byte	0x33
-	.byte	0x2f
-	.4byte	0x4eb
+	.byte	0x2e
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF301
 	.byte	0x33
 	.byte	0x2f
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF302
 	.byte	0x33
-	.byte	0x30
-	.4byte	0x4eb
+	.byte	0x2f
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF303
 	.byte	0x33
 	.byte	0x30
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF304
 	.byte	0x33
-	.byte	0x33
-	.4byte	0x4eb
+	.byte	0x30
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF305
 	.byte	0x33
 	.byte	0x33
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF306
 	.byte	0x33
-	.byte	0x36
-	.4byte	0x4eb
+	.byte	0x33
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF307
 	.byte	0x33
 	.byte	0x36
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF308
 	.byte	0x33
-	.byte	0x39
-	.4byte	0x4eb
+	.byte	0x36
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF309
 	.byte	0x33
 	.byte	0x39
-	.4byte	0x4eb
-	.uleb128 0x2c
-	.4byte	.LASF311
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF310
 	.byte	0x33
-	.byte	0x3b
+	.byte	0x39
+	.4byte	0x500
 	.uleb128 0x2c
 	.4byte	.LASF312
 	.byte	0x33
 	.byte	0x3b
-	.uleb128 0x19
+	.uleb128 0x2c
 	.4byte	.LASF313
-	.byte	0x35
-	.byte	0x15
-	.4byte	0x4eb
+	.byte	0x33
+	.byte	0x3b
 	.uleb128 0x19
 	.4byte	.LASF314
 	.byte	0x35
 	.byte	0x15
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF315
 	.byte	0x35
-	.byte	0x16
-	.4byte	0x4eb
+	.byte	0x15
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF316
 	.byte	0x35
 	.byte	0x16
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF317
 	.byte	0x35
-	.byte	0x17
-	.4byte	0x4eb
+	.byte	0x16
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF318
 	.byte	0x35
 	.byte	0x17
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF319
 	.byte	0x35
-	.byte	0x18
-	.4byte	0x4eb
+	.byte	0x17
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF320
 	.byte	0x35
 	.byte	0x18
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF321
 	.byte	0x35
-	.byte	0x19
-	.4byte	0x4eb
+	.byte	0x18
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF322
 	.byte	0x35
 	.byte	0x19
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF323
 	.byte	0x35
-	.byte	0x1a
-	.4byte	0x4eb
+	.byte	0x19
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF324
 	.byte	0x35
 	.byte	0x1a
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF325
 	.byte	0x35
-	.byte	0x1b
-	.4byte	0x4eb
+	.byte	0x1a
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF326
 	.byte	0x35
 	.byte	0x1b
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF327
 	.byte	0x35
-	.byte	0x1c
-	.4byte	0x4eb
+	.byte	0x1b
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF328
 	.byte	0x35
 	.byte	0x1c
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF329
 	.byte	0x35
-	.byte	0x1e
-	.4byte	0x4eb
+	.byte	0x1c
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF330
 	.byte	0x35
 	.byte	0x1e
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF331
 	.byte	0x35
-	.byte	0x1f
-	.4byte	0x4eb
+	.byte	0x1e
+	.4byte	0x500
 	.uleb128 0x19
 	.4byte	.LASF332
 	.byte	0x35
 	.byte	0x1f
-	.4byte	0x4eb
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF333
+	.byte	0x35
+	.byte	0x1f
+	.4byte	0x500
 	.uleb128 0x5
-	.4byte	0x13a
-	.4byte	0x1317
+	.4byte	0x13f
+	.4byte	0x132c
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF333
+	.4byte	.LASF334
 	.byte	0x36
 	.byte	0x4a
-	.4byte	0x1307
+	.4byte	0x131c
 	.uleb128 0x19
-	.4byte	.LASF334
+	.4byte	.LASF335
 	.byte	0x37
 	.byte	0x56
-	.4byte	0x331
+	.4byte	0x346
 	.uleb128 0x26
-	.4byte	.LASF335
+	.4byte	.LASF336
 	.2byte	0x110
 	.byte	0x37
 	.byte	0x59
-	.4byte	0x1377
+	.4byte	0x138c
 	.uleb128 0xe
-	.4byte	.LASF336
+	.4byte	.LASF337
 	.byte	0x37
 	.byte	0x5c
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF337
+	.4byte	.LASF338
 	.byte	0x37
 	.byte	0x5e
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF338
+	.4byte	.LASF339
 	.byte	0x37
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF339
+	.4byte	.LASF340
 	.byte	0x37
 	.byte	0x61
-	.4byte	0x1377
+	.4byte	0x138c
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF340
+	.4byte	.LASF341
 	.byte	0x37
 	.byte	0x62
-	.4byte	0x1377
+	.4byte	0x138c
 	.byte	0x90
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x1387
-	.4byte	0x1387
+	.4byte	0x139c
+	.4byte	0x139c
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x138d
+	.4byte	0x13a2
 	.uleb128 0x24
-	.4byte	.LASF341
-	.uleb128 0xd
 	.4byte	.LASF342
+	.uleb128 0xd
+	.4byte	.LASF343
 	.byte	0x68
 	.byte	0x37
 	.byte	0x66
-	.4byte	0x1438
+	.4byte	0x144d
 	.uleb128 0x20
 	.string	"x19"
 	.byte	0x37
@@ -13028,259 +13015,259 @@ __exitcall_ebc_exit:
 	.2byte	0x220
 	.byte	0x37
 	.byte	0x7e
-	.4byte	0x1466
+	.4byte	0x147b
 	.uleb128 0xe
-	.4byte	.LASF343
+	.4byte	.LASF344
 	.byte	0x37
 	.byte	0x7f
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF344
+	.4byte	.LASF345
 	.byte	0x37
 	.byte	0x80
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF345
+	.4byte	.LASF346
 	.byte	0x37
 	.byte	0x81
-	.4byte	0xca3
+	.4byte	0xcb8
 	.byte	0x10
 	.byte	0
 	.uleb128 0x26
-	.4byte	.LASF346
+	.4byte	.LASF347
 	.2byte	0x3d0
 	.byte	0x37
 	.byte	0x76
-	.4byte	0x14e6
+	.4byte	0x14fb
 	.uleb128 0xe
-	.4byte	.LASF342
+	.4byte	.LASF343
 	.byte	0x37
 	.byte	0x77
-	.4byte	0x1392
+	.4byte	0x13a7
 	.byte	0
 	.uleb128 0x20
 	.string	"uw"
 	.byte	0x37
 	.byte	0x82
-	.4byte	0x1438
+	.4byte	0x144d
 	.byte	0x70
 	.uleb128 0x27
-	.4byte	.LASF347
+	.4byte	.LASF348
 	.byte	0x37
 	.byte	0x84
 	.4byte	0x6d
 	.2byte	0x290
 	.uleb128 0x27
-	.4byte	.LASF348
+	.4byte	.LASF349
 	.byte	0x37
 	.byte	0x85
-	.4byte	0x443
+	.4byte	0x458
 	.2byte	0x298
 	.uleb128 0x27
-	.4byte	.LASF349
+	.4byte	.LASF350
 	.byte	0x37
 	.byte	0x86
 	.4byte	0x6d
 	.2byte	0x2a0
 	.uleb128 0x27
-	.4byte	.LASF350
+	.4byte	.LASF351
 	.byte	0x37
 	.byte	0x87
 	.4byte	0x6d
 	.2byte	0x2a4
 	.uleb128 0x27
-	.4byte	.LASF351
+	.4byte	.LASF352
 	.byte	0x37
 	.byte	0x88
 	.4byte	0x29
 	.2byte	0x2a8
 	.uleb128 0x27
-	.4byte	.LASF352
+	.4byte	.LASF353
 	.byte	0x37
 	.byte	0x89
 	.4byte	0x29
 	.2byte	0x2b0
 	.uleb128 0x27
-	.4byte	.LASF353
+	.4byte	.LASF354
 	.byte	0x37
 	.byte	0x8a
-	.4byte	0x132d
+	.4byte	0x1342
 	.2byte	0x2b8
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF354
+	.4byte	.LASF355
 	.byte	0x37
 	.2byte	0x111
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF355
+	.4byte	.LASF356
 	.byte	0x38
 	.byte	0x59
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF356
+	.4byte	.LASF357
 	.byte	0x39
 	.byte	0x30
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
-	.4byte	.LASF357
+	.4byte	.LASF358
 	.byte	0x39
 	.byte	0x30
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0xd
-	.4byte	.LASF358
+	.4byte	.LASF359
 	.byte	0x28
 	.byte	0x3a
 	.byte	0x1c
-	.4byte	0x1550
+	.4byte	0x1565
 	.uleb128 0xe
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x3a
 	.byte	0x1d
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF359
+	.4byte	.LASF360
 	.byte	0x3a
 	.byte	0x1e
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF70
+	.4byte	.LASF71
 	.byte	0x3a
 	.byte	0x1f
-	.4byte	0x1550
+	.4byte	0x1565
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF360
+	.4byte	.LASF361
 	.byte	0x3a
 	.byte	0x20
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x18
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF361
+	.4byte	.LASF362
 	.byte	0x3a
 	.byte	0x11
-	.4byte	0x155b
+	.4byte	0x1570
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1561
+	.4byte	0x1576
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x157f
+	.4byte	0x1594
 	.uleb128 0x11
-	.4byte	0x157f
+	.4byte	0x1594
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1513
+	.4byte	0x1528
 	.uleb128 0xd
-	.4byte	.LASF362
+	.4byte	.LASF363
 	.byte	0x18
 	.byte	0x3a
 	.byte	0x23
-	.4byte	0x15aa
+	.4byte	0x15bf
 	.uleb128 0xe
-	.4byte	.LASF115
+	.4byte	.LASF116
 	.byte	0x3a
 	.byte	0x24
-	.4byte	0xe50
+	.4byte	0xe65
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF135
+	.4byte	.LASF136
 	.byte	0x3a
 	.byte	0x25
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x8
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF363
+	.4byte	.LASF364
 	.byte	0x3a
 	.byte	0x27
-	.4byte	0x1585
+	.4byte	0x159a
 	.uleb128 0xd
-	.4byte	.LASF364
+	.4byte	.LASF365
 	.byte	0x8
 	.byte	0x3b
 	.byte	0x10
-	.4byte	0x15ce
+	.4byte	0x15e3
 	.uleb128 0xe
-	.4byte	.LASF365
+	.4byte	.LASF366
 	.byte	0x3b
 	.byte	0x10
-	.4byte	0x104d
+	.4byte	0x1062
 	.byte	0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x15b5
+	.4byte	0x15ca
 	.uleb128 0x8
-	.4byte	.LASF366
+	.4byte	.LASF367
 	.byte	0x3b
 	.byte	0x10
-	.4byte	0x15b5
+	.4byte	0x15ca
 	.uleb128 0x19
-	.4byte	.LASF367
+	.4byte	.LASF368
 	.byte	0x3b
 	.byte	0x26
 	.4byte	0x6d
 	.uleb128 0x19
-	.4byte	.LASF368
+	.4byte	.LASF369
 	.byte	0x3b
 	.byte	0x59
-	.4byte	0x15b5
+	.4byte	0x15ca
 	.uleb128 0x19
-	.4byte	.LASF369
+	.4byte	.LASF370
 	.byte	0x3b
 	.byte	0x5a
-	.4byte	0x15b5
+	.4byte	0x15ca
 	.uleb128 0x19
-	.4byte	.LASF370
+	.4byte	.LASF371
 	.byte	0x3b
 	.byte	0x5b
-	.4byte	0x15b5
+	.4byte	0x15ca
 	.uleb128 0x19
-	.4byte	.LASF371
+	.4byte	.LASF372
 	.byte	0x3b
 	.byte	0x5c
-	.4byte	0x15b5
+	.4byte	0x15ca
 	.uleb128 0x13
-	.4byte	.LASF372
+	.4byte	.LASF373
 	.byte	0x3b
 	.2byte	0x2d2
-	.4byte	0x1621
+	.4byte	0x1636
 	.uleb128 0x5
-	.4byte	0x15b5
-	.4byte	0x1631
+	.4byte	0x15ca
+	.4byte	0x1646
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x30
-	.4byte	0x1641
+	.4byte	0x1656
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x1631
+	.4byte	0x1646
 	.uleb128 0x15
-	.4byte	.LASF373
+	.4byte	.LASF374
 	.byte	0x3b
 	.2byte	0x303
-	.4byte	0x1641
+	.4byte	0x1656
 	.uleb128 0x5
 	.4byte	0x30
-	.4byte	0x1668
+	.4byte	0x167d
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x40
@@ -13289,109 +13276,109 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x1652
+	.4byte	0x1667
 	.uleb128 0x15
-	.4byte	.LASF374
+	.4byte	.LASF375
 	.byte	0x3b
 	.2byte	0x357
-	.4byte	0x1668
+	.4byte	0x167d
 	.uleb128 0x19
-	.4byte	.LASF375
+	.4byte	.LASF376
 	.byte	0x3c
 	.byte	0x67
 	.4byte	0xc6
 	.uleb128 0xd
-	.4byte	.LASF376
+	.4byte	.LASF377
 	.byte	0x8
 	.byte	0x3d
 	.byte	0x22
-	.4byte	0x169d
+	.4byte	0x16b2
 	.uleb128 0xe
-	.4byte	.LASF66
+	.4byte	.LASF67
 	.byte	0x3d
 	.byte	0x23
-	.4byte	0x16c2
+	.4byte	0x16d7
 	.byte	0
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF377
+	.4byte	.LASF378
 	.byte	0x10
 	.byte	0x3d
 	.byte	0x26
-	.4byte	0x16c2
+	.4byte	0x16d7
 	.uleb128 0xe
-	.4byte	.LASF63
+	.4byte	.LASF64
 	.byte	0x3d
 	.byte	0x27
-	.4byte	0x16c2
+	.4byte	0x16d7
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF68
+	.4byte	.LASF69
 	.byte	0x3d
 	.byte	0x27
-	.4byte	0x16c8
+	.4byte	0x16dd
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x169d
+	.4byte	0x16b2
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x16c2
+	.4byte	0x16d7
 	.uleb128 0xd
-	.4byte	.LASF378
+	.4byte	.LASF379
 	.byte	0x4
 	.byte	0x3e
 	.byte	0x30
-	.4byte	0x16e7
+	.4byte	0x16fc
 	.uleb128 0xe
-	.4byte	.LASF379
+	.4byte	.LASF380
 	.byte	0x3e
 	.byte	0x31
 	.4byte	0x6d
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF380
+	.4byte	.LASF381
 	.byte	0x3e
 	.byte	0x35
-	.4byte	0x16ce
+	.4byte	0x16e3
 	.uleb128 0x2e
 	.byte	0x8
 	.byte	0x3e
 	.2byte	0x19b
-	.4byte	0x1716
+	.4byte	0x172b
 	.uleb128 0x1b
-	.4byte	.LASF378
+	.4byte	.LASF379
 	.byte	0x3e
 	.2byte	0x19c
-	.4byte	0x16ce
+	.4byte	0x16e3
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF115
+	.4byte	.LASF116
 	.byte	0x3e
 	.2byte	0x19d
-	.4byte	0xe50
+	.4byte	0xe65
 	.byte	0x4
 	.byte	0
 	.uleb128 0x13
-	.4byte	.LASF381
+	.4byte	.LASF382
 	.byte	0x3e
 	.2byte	0x19e
-	.4byte	0x16f2
+	.4byte	0x1707
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x3f
 	.byte	0x1e
-	.4byte	0x1743
+	.4byte	0x1758
 	.uleb128 0xe
-	.4byte	.LASF115
+	.4byte	.LASF116
 	.byte	0x3f
 	.byte	0x1f
-	.4byte	0xe50
+	.4byte	0xe65
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF382
+	.4byte	.LASF383
 	.byte	0x3f
 	.byte	0x20
 	.4byte	0xc6
@@ -13401,1187 +13388,1187 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x3f
 	.byte	0x1a
-	.4byte	0x175c
+	.4byte	0x1771
 	.uleb128 0x22
-	.4byte	.LASF383
+	.4byte	.LASF384
 	.byte	0x3f
 	.byte	0x1c
-	.4byte	0xef
+	.4byte	0xf4
 	.uleb128 0x29
-	.4byte	0x1722
+	.4byte	0x1737
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF384
+	.4byte	.LASF385
 	.byte	0x8
 	.byte	0x3f
 	.byte	0x19
-	.4byte	0x176f
+	.4byte	0x1784
 	.uleb128 0x23
-	.4byte	0x1743
+	.4byte	0x1758
 	.byte	0
 	.byte	0
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x40
 	.byte	0x32
-	.4byte	0x1790
+	.4byte	0x17a5
 	.uleb128 0xe
-	.4byte	.LASF385
+	.4byte	.LASF386
 	.byte	0x40
 	.byte	0x33
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0
 	.uleb128 0x20
 	.string	"len"
 	.byte	0x40
 	.byte	0x33
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x4
 	.byte	0
 	.uleb128 0x21
 	.byte	0x8
 	.byte	0x40
 	.byte	0x31
-	.4byte	0x17a9
+	.4byte	0x17be
 	.uleb128 0x29
-	.4byte	0x176f
+	.4byte	0x1784
 	.uleb128 0x22
-	.4byte	.LASF386
+	.4byte	.LASF387
 	.byte	0x40
 	.byte	0x35
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF387
+	.4byte	.LASF388
 	.byte	0x10
 	.byte	0x40
 	.byte	0x30
-	.4byte	0x17c8
+	.4byte	0x17dd
 	.uleb128 0x23
-	.4byte	0x1790
+	.4byte	0x17a5
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0x40
 	.byte	0x37
-	.4byte	0x17cd
+	.4byte	0x17e2
 	.byte	0x8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x17a9
+	.4byte	0x17be
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x9d
 	.uleb128 0x19
-	.4byte	.LASF388
+	.4byte	.LASF389
 	.byte	0x40
 	.byte	0x3c
-	.4byte	0x17c8
+	.4byte	0x17dd
 	.uleb128 0x19
-	.4byte	.LASF389
+	.4byte	.LASF390
 	.byte	0x40
 	.byte	0x3d
-	.4byte	0x17c8
+	.4byte	0x17dd
 	.uleb128 0xd
-	.4byte	.LASF390
+	.4byte	.LASF391
 	.byte	0x30
 	.byte	0x40
 	.byte	0x3f
-	.4byte	0x1832
+	.4byte	0x1847
 	.uleb128 0xe
-	.4byte	.LASF391
+	.4byte	.LASF392
 	.byte	0x40
 	.byte	0x40
-	.4byte	0x194
+	.4byte	0x199
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF392
+	.4byte	.LASF393
 	.byte	0x40
 	.byte	0x41
-	.4byte	0x194
+	.4byte	0x199
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF393
+	.4byte	.LASF394
 	.byte	0x40
 	.byte	0x42
-	.4byte	0x194
+	.4byte	0x199
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF394
+	.4byte	.LASF395
 	.byte	0x40
 	.byte	0x43
-	.4byte	0x194
+	.4byte	0x199
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF395
+	.4byte	.LASF396
 	.byte	0x40
 	.byte	0x44
-	.4byte	0x1832
+	.4byte	0x1847
 	.byte	0x20
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x194
-	.4byte	0x1842
+	.4byte	0x199
+	.4byte	0x1857
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF396
+	.4byte	.LASF397
 	.byte	0x40
 	.byte	0x46
-	.4byte	0x17e9
+	.4byte	0x17fe
 	.uleb128 0x21
 	.byte	0x10
 	.byte	0x40
 	.byte	0x6b
-	.4byte	0x186c
+	.4byte	0x1881
 	.uleb128 0x22
-	.4byte	.LASF397
+	.4byte	.LASF398
 	.byte	0x40
 	.byte	0x6c
-	.4byte	0x392
+	.4byte	0x3a7
 	.uleb128 0x22
-	.4byte	.LASF398
+	.4byte	.LASF399
 	.byte	0x40
 	.byte	0x6d
-	.4byte	0x186c
+	.4byte	0x1881
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x15aa
+	.4byte	0x15bf
 	.uleb128 0x21
 	.byte	0x10
 	.byte	0x40
 	.byte	0x74
-	.4byte	0x189c
+	.4byte	0x18b1
 	.uleb128 0x22
-	.4byte	.LASF399
+	.4byte	.LASF400
 	.byte	0x40
 	.byte	0x75
-	.4byte	0x3d6
+	.4byte	0x3eb
 	.uleb128 0x22
-	.4byte	.LASF400
+	.4byte	.LASF401
 	.byte	0x40
 	.byte	0x76
-	.4byte	0x169d
+	.4byte	0x16b2
 	.uleb128 0x22
-	.4byte	.LASF401
+	.4byte	.LASF402
 	.byte	0x40
 	.byte	0x77
-	.4byte	0x407
+	.4byte	0x41c
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF402
+	.4byte	.LASF403
 	.byte	0xd0
 	.byte	0x40
 	.byte	0x59
-	.4byte	0x197b
+	.4byte	0x1990
 	.uleb128 0xe
-	.4byte	.LASF403
+	.4byte	.LASF404
 	.byte	0x40
 	.byte	0x5b
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF404
+	.4byte	.LASF405
 	.byte	0x40
 	.byte	0x5c
-	.4byte	0x16e7
+	.4byte	0x16fc
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF405
+	.4byte	.LASF406
 	.byte	0x40
 	.byte	0x5d
-	.4byte	0x169d
+	.4byte	0x16b2
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF406
+	.4byte	.LASF407
 	.byte	0x40
 	.byte	0x5e
-	.4byte	0x1980
+	.4byte	0x1995
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF407
+	.4byte	.LASF408
 	.byte	0x40
 	.byte	0x5f
-	.4byte	0x17a9
+	.4byte	0x17be
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF408
+	.4byte	.LASF409
 	.byte	0x40
 	.byte	0x60
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF409
+	.4byte	.LASF410
 	.byte	0x40
 	.byte	0x62
-	.4byte	0x1c70
+	.4byte	0x1c85
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF410
+	.4byte	.LASF411
 	.byte	0x40
 	.byte	0x65
-	.4byte	0x175c
+	.4byte	0x1771
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF411
+	.4byte	.LASF412
 	.byte	0x40
 	.byte	0x66
-	.4byte	0x1d58
+	.4byte	0x1d6d
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF412
+	.4byte	.LASF413
 	.byte	0x40
 	.byte	0x67
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF413
+	.4byte	.LASF414
 	.byte	0x40
 	.byte	0x68
 	.4byte	0x29
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF414
+	.4byte	.LASF415
 	.byte	0x40
 	.byte	0x69
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x78
 	.uleb128 0x23
-	.4byte	0x184d
+	.4byte	0x1862
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF415
+	.4byte	.LASF416
 	.byte	0x40
 	.byte	0x6f
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF416
+	.4byte	.LASF417
 	.byte	0x40
 	.byte	0x70
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0xa0
 	.uleb128 0x20
 	.string	"d_u"
 	.byte	0x40
 	.byte	0x78
-	.4byte	0x1872
+	.4byte	0x1887
 	.byte	0xb0
 	.uleb128 0xe
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x40
 	.byte	0x7a
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xc0
 	.uleb128 0xe
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x40
 	.byte	0x7b
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xc8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x189c
+	.4byte	0x18b1
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x189c
+	.4byte	0x18b1
 	.uleb128 0x1a
-	.4byte	.LASF417
+	.4byte	.LASF418
 	.2byte	0x2a0
 	.byte	0x1f
 	.2byte	0x263
-	.4byte	0x1c65
+	.4byte	0x1c7a
 	.uleb128 0x1b
-	.4byte	.LASF418
+	.4byte	.LASF419
 	.byte	0x1f
 	.2byte	0x264
-	.4byte	0x27a
+	.4byte	0x28f
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF419
+	.4byte	.LASF420
 	.byte	0x1f
 	.2byte	0x265
 	.4byte	0xb4
 	.byte	0x2
 	.uleb128 0x1b
-	.4byte	.LASF420
+	.4byte	.LASF421
 	.byte	0x1f
 	.2byte	0x266
-	.4byte	0x23fb
+	.4byte	0x2410
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF421
+	.4byte	.LASF422
 	.byte	0x1f
 	.2byte	0x267
-	.4byte	0x241b
+	.4byte	0x2430
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF422
+	.4byte	.LASF423
 	.byte	0x1f
 	.2byte	0x268
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF423
+	.4byte	.LASF424
 	.byte	0x1f
 	.2byte	0x26b
-	.4byte	0x7c27
+	.4byte	0x7c3c
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF424
+	.4byte	.LASF425
 	.byte	0x1f
 	.2byte	0x26c
-	.4byte	0x7c27
+	.4byte	0x7c3c
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF425
+	.4byte	.LASF426
 	.byte	0x1f
 	.2byte	0x26f
-	.4byte	0x7da0
+	.4byte	0x7db5
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF426
+	.4byte	.LASF427
 	.byte	0x1f
 	.2byte	0x270
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF427
+	.4byte	.LASF428
 	.byte	0x1f
 	.2byte	0x271
-	.4byte	0x5161
+	.4byte	0x5176
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF428
+	.4byte	.LASF429
 	.byte	0x1f
 	.2byte	0x274
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF429
+	.4byte	.LASF430
 	.byte	0x1f
 	.2byte	0x278
 	.4byte	0x29
 	.byte	0x40
 	.uleb128 0x23
-	.4byte	0x7b8d
+	.4byte	0x7ba2
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF430
+	.4byte	.LASF431
 	.byte	0x1f
 	.2byte	0x284
-	.4byte	0x26f
+	.4byte	0x284
 	.byte	0x4c
 	.uleb128 0x1b
-	.4byte	.LASF431
+	.4byte	.LASF432
 	.byte	0x1f
 	.2byte	0x285
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF432
+	.4byte	.LASF433
 	.byte	0x1f
 	.2byte	0x286
-	.4byte	0xa12
+	.4byte	0xa27
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF433
+	.4byte	.LASF434
 	.byte	0x1f
 	.2byte	0x287
-	.4byte	0xa12
+	.4byte	0xa27
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF434
+	.4byte	.LASF435
 	.byte	0x1f
 	.2byte	0x288
-	.4byte	0xa12
+	.4byte	0xa27
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF435
+	.4byte	.LASF436
 	.byte	0x1f
 	.2byte	0x289
-	.4byte	0xe50
+	.4byte	0xe65
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF436
+	.4byte	.LASF437
 	.byte	0x1f
 	.2byte	0x28a
 	.4byte	0xb4
 	.byte	0x8c
 	.uleb128 0x1b
-	.4byte	.LASF437
+	.4byte	.LASF438
 	.byte	0x1f
 	.2byte	0x28b
-	.4byte	0x10b
+	.4byte	0x110
 	.byte	0x8e
 	.uleb128 0x1b
-	.4byte	.LASF438
+	.4byte	.LASF439
 	.byte	0x1f
 	.2byte	0x28c
-	.4byte	0x10b
+	.4byte	0x110
 	.byte	0x8f
 	.uleb128 0x1b
-	.4byte	.LASF439
+	.4byte	.LASF440
 	.byte	0x1f
 	.2byte	0x28d
-	.4byte	0x305
+	.4byte	0x31a
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF440
+	.4byte	.LASF441
 	.byte	0x1f
 	.2byte	0x294
 	.4byte	0x29
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF441
+	.4byte	.LASF442
 	.byte	0x1f
 	.2byte	0x295
-	.4byte	0x4e21
+	.4byte	0x4e36
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF442
+	.4byte	.LASF443
 	.byte	0x1f
 	.2byte	0x297
 	.4byte	0x29
 	.byte	0xd0
 	.uleb128 0x1b
-	.4byte	.LASF443
+	.4byte	.LASF444
 	.byte	0x1f
 	.2byte	0x298
 	.4byte	0x29
 	.byte	0xd8
 	.uleb128 0x1b
-	.4byte	.LASF444
+	.4byte	.LASF445
 	.byte	0x1f
 	.2byte	0x29a
-	.4byte	0x3d6
+	.4byte	0x3eb
 	.byte	0xe0
 	.uleb128 0x1b
-	.4byte	.LASF445
+	.4byte	.LASF446
 	.byte	0x1f
 	.2byte	0x29b
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0xf0
 	.uleb128 0x1c
-	.4byte	.LASF446
+	.4byte	.LASF447
 	.byte	0x1f
 	.2byte	0x29d
-	.4byte	0x7dab
+	.4byte	0x7dc0
 	.2byte	0x100
 	.uleb128 0x1c
-	.4byte	.LASF447
+	.4byte	.LASF448
 	.byte	0x1f
 	.2byte	0x2a0
 	.4byte	0xc6
 	.2byte	0x108
 	.uleb128 0x1c
-	.4byte	.LASF448
+	.4byte	.LASF449
 	.byte	0x1f
 	.2byte	0x2a1
-	.4byte	0x11a
+	.4byte	0x11f
 	.2byte	0x10c
 	.uleb128 0x1c
-	.4byte	.LASF449
+	.4byte	.LASF450
 	.byte	0x1f
 	.2byte	0x2a2
-	.4byte	0x11a
+	.4byte	0x11f
 	.2byte	0x10e
 	.uleb128 0x1c
-	.4byte	.LASF450
+	.4byte	.LASF451
 	.byte	0x1f
 	.2byte	0x2a4
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x110
 	.uleb128 0x1c
-	.4byte	.LASF451
+	.4byte	.LASF452
 	.byte	0x1f
 	.2byte	0x2a5
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x120
 	.uleb128 0x1c
-	.4byte	.LASF452
+	.4byte	.LASF453
 	.byte	0x1f
 	.2byte	0x2a6
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x130
 	.uleb128 0x2f
-	.4byte	0x7baf
+	.4byte	0x7bc4
 	.2byte	0x140
 	.uleb128 0x1c
-	.4byte	.LASF453
+	.4byte	.LASF454
 	.byte	0x1f
 	.2byte	0x2ab
-	.4byte	0x387
+	.4byte	0x39c
 	.2byte	0x150
 	.uleb128 0x1c
-	.4byte	.LASF454
+	.4byte	.LASF455
 	.byte	0x1f
 	.2byte	0x2ac
-	.4byte	0x387
+	.4byte	0x39c
 	.2byte	0x158
 	.uleb128 0x1c
-	.4byte	.LASF455
+	.4byte	.LASF456
 	.byte	0x1f
 	.2byte	0x2ad
-	.4byte	0x367
+	.4byte	0x37c
 	.2byte	0x160
 	.uleb128 0x1c
-	.4byte	.LASF456
+	.4byte	.LASF457
 	.byte	0x1f
 	.2byte	0x2ae
-	.4byte	0x367
+	.4byte	0x37c
 	.2byte	0x164
 	.uleb128 0x1c
-	.4byte	.LASF457
+	.4byte	.LASF458
 	.byte	0x1f
 	.2byte	0x2af
-	.4byte	0x367
+	.4byte	0x37c
 	.2byte	0x168
 	.uleb128 0x1c
-	.4byte	.LASF458
+	.4byte	.LASF459
 	.byte	0x1f
 	.2byte	0x2b3
-	.4byte	0x7db1
+	.4byte	0x7dc6
 	.2byte	0x170
 	.uleb128 0x1c
-	.4byte	.LASF459
+	.4byte	.LASF460
 	.byte	0x1f
 	.2byte	0x2b4
-	.4byte	0x7df9
+	.4byte	0x7e0e
 	.2byte	0x178
 	.uleb128 0x1c
-	.4byte	.LASF460
+	.4byte	.LASF461
 	.byte	0x1f
 	.2byte	0x2b5
-	.4byte	0x505c
+	.4byte	0x5071
 	.2byte	0x180
 	.uleb128 0x1c
-	.4byte	.LASF461
+	.4byte	.LASF462
 	.byte	0x1f
 	.2byte	0x2b6
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x250
 	.uleb128 0x2f
-	.4byte	0x7bd1
+	.4byte	0x7be6
 	.2byte	0x260
 	.uleb128 0x1c
-	.4byte	.LASF462
+	.4byte	.LASF463
 	.byte	0x1f
 	.2byte	0x2bf
 	.4byte	0xd2
 	.2byte	0x268
 	.uleb128 0x1c
-	.4byte	.LASF463
+	.4byte	.LASF464
 	.byte	0x1f
 	.2byte	0x2c2
 	.4byte	0xd2
 	.2byte	0x26c
 	.uleb128 0x1c
-	.4byte	.LASF464
+	.4byte	.LASF465
 	.byte	0x1f
 	.2byte	0x2c3
-	.4byte	0x7e04
+	.4byte	0x7e19
 	.2byte	0x270
 	.uleb128 0x1c
-	.4byte	.LASF465
+	.4byte	.LASF466
 	.byte	0x1f
 	.2byte	0x2c7
-	.4byte	0x7e0f
+	.4byte	0x7e24
 	.2byte	0x278
 	.uleb128 0x1c
-	.4byte	.LASF466
+	.4byte	.LASF467
 	.byte	0x1f
 	.2byte	0x2cb
-	.4byte	0x7e1a
+	.4byte	0x7e2f
 	.2byte	0x280
 	.uleb128 0x1c
-	.4byte	.LASF467
+	.4byte	.LASF468
 	.byte	0x1f
 	.2byte	0x2ce
-	.4byte	0x443
+	.4byte	0x458
 	.2byte	0x288
 	.uleb128 0x1c
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x1f
 	.2byte	0x2d0
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x290
 	.uleb128 0x1c
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x1f
 	.2byte	0x2d1
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x298
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x1986
+	.4byte	0x199b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1986
+	.4byte	0x199b
 	.uleb128 0x5
 	.4byte	0x96
-	.4byte	0x1c80
+	.4byte	0x1c95
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1f
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF468
+	.4byte	.LASF469
 	.byte	0xc0
 	.byte	0x40
 	.byte	0x8a
-	.4byte	0x1d53
+	.4byte	0x1d68
 	.uleb128 0xe
-	.4byte	.LASF469
+	.4byte	.LASF470
 	.byte	0x40
 	.byte	0x8b
-	.4byte	0x2175
+	.4byte	0x218a
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF470
+	.4byte	.LASF471
 	.byte	0x40
 	.byte	0x8c
-	.4byte	0x2175
+	.4byte	0x218a
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF405
+	.4byte	.LASF406
 	.byte	0x40
 	.byte	0x8d
-	.4byte	0x219b
+	.4byte	0x21b0
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF471
+	.4byte	.LASF472
 	.byte	0x40
 	.byte	0x8e
-	.4byte	0x21c5
+	.4byte	0x21da
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF472
+	.4byte	.LASF473
 	.byte	0x40
 	.byte	0x90
-	.4byte	0x21da
+	.4byte	0x21ef
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF473
+	.4byte	.LASF474
 	.byte	0x40
 	.byte	0x91
-	.4byte	0x21ef
+	.4byte	0x2204
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF474
+	.4byte	.LASF475
 	.byte	0x40
 	.byte	0x92
-	.4byte	0x2200
+	.4byte	0x2215
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF475
+	.4byte	.LASF476
 	.byte	0x40
 	.byte	0x93
-	.4byte	0x2200
+	.4byte	0x2215
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF476
+	.4byte	.LASF477
 	.byte	0x40
 	.byte	0x94
-	.4byte	0x2216
+	.4byte	0x222b
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF477
+	.4byte	.LASF478
 	.byte	0x40
 	.byte	0x95
-	.4byte	0x2235
+	.4byte	0x224a
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF478
+	.4byte	.LASF479
 	.byte	0x40
 	.byte	0x96
-	.4byte	0x2255
+	.4byte	0x226a
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF479
+	.4byte	.LASF480
 	.byte	0x40
 	.byte	0x97
-	.4byte	0x226f
+	.4byte	0x2284
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF480
+	.4byte	.LASF481
 	.byte	0x40
 	.byte	0x98
-	.4byte	0x228f
+	.4byte	0x22a4
 	.byte	0x60
 	.uleb128 0x23
-	.4byte	0x213d
+	.4byte	0x2152
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x40
 	.byte	0x9c
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x40
 	.byte	0x9d
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x40
 	.byte	0x9e
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x80
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x1c80
+	.4byte	0x1c95
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1d53
+	.4byte	0x1d68
 	.uleb128 0x1a
-	.4byte	.LASF481
+	.4byte	.LASF482
 	.2byte	0x6c0
 	.byte	0x1f
 	.2byte	0x583
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.uleb128 0x1b
-	.4byte	.LASF482
+	.4byte	.LASF483
 	.byte	0x1f
 	.2byte	0x584
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF483
+	.4byte	.LASF484
 	.byte	0x1f
 	.2byte	0x585
-	.4byte	0x26f
+	.4byte	0x284
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF484
+	.4byte	.LASF485
 	.byte	0x1f
 	.2byte	0x586
 	.4byte	0x96
 	.byte	0x14
 	.uleb128 0x1b
-	.4byte	.LASF485
+	.4byte	.LASF486
 	.byte	0x1f
 	.2byte	0x587
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF486
+	.4byte	.LASF487
 	.byte	0x1f
 	.2byte	0x588
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF487
+	.4byte	.LASF488
 	.byte	0x1f
 	.2byte	0x589
-	.4byte	0x8479
+	.4byte	0x848e
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF488
+	.4byte	.LASF489
 	.byte	0x1f
 	.2byte	0x58a
-	.4byte	0x864f
+	.4byte	0x8664
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF489
+	.4byte	.LASF490
 	.byte	0x1f
 	.2byte	0x58b
-	.4byte	0x8655
+	.4byte	0x866a
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF490
+	.4byte	.LASF491
 	.byte	0x1f
 	.2byte	0x58c
-	.4byte	0x865b
+	.4byte	0x8670
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF491
+	.4byte	.LASF492
 	.byte	0x1f
 	.2byte	0x58d
-	.4byte	0x866b
+	.4byte	0x8680
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF492
+	.4byte	.LASF493
 	.byte	0x1f
 	.2byte	0x58e
 	.4byte	0x29
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF493
+	.4byte	.LASF494
 	.byte	0x1f
 	.2byte	0x58f
 	.4byte	0x29
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF494
+	.4byte	.LASF495
 	.byte	0x1f
 	.2byte	0x590
 	.4byte	0x29
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF495
+	.4byte	.LASF496
 	.byte	0x1f
 	.2byte	0x591
-	.4byte	0x1980
+	.4byte	0x1995
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF496
+	.4byte	.LASF497
 	.byte	0x1f
 	.2byte	0x592
-	.4byte	0x4e21
+	.4byte	0x4e36
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF497
+	.4byte	.LASF498
 	.byte	0x1f
 	.2byte	0x593
 	.4byte	0xc6
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF498
+	.4byte	.LASF499
 	.byte	0x1f
 	.2byte	0x594
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0xa4
 	.uleb128 0x1b
-	.4byte	.LASF499
+	.4byte	.LASF500
 	.byte	0x1f
 	.2byte	0x596
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF500
+	.4byte	.LASF501
 	.byte	0x1f
 	.2byte	0x598
-	.4byte	0x867b
+	.4byte	0x8690
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF501
+	.4byte	.LASF502
 	.byte	0x1f
 	.2byte	0x59a
-	.4byte	0x8691
+	.4byte	0x86a6
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF502
+	.4byte	.LASF503
 	.byte	0x1f
 	.2byte	0x59b
-	.4byte	0x8764
+	.4byte	0x8779
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF503
+	.4byte	.LASF504
 	.byte	0x1f
 	.2byte	0x59e
-	.4byte	0x8774
+	.4byte	0x8789
 	.byte	0xc8
 	.uleb128 0x1b
-	.4byte	.LASF504
+	.4byte	.LASF505
 	.byte	0x1f
 	.2byte	0x5a1
-	.4byte	0x877f
+	.4byte	0x8794
 	.byte	0xd0
 	.uleb128 0x1b
-	.4byte	.LASF505
+	.4byte	.LASF506
 	.byte	0x1f
 	.2byte	0x5a2
 	.4byte	0xa9
 	.byte	0xd8
 	.uleb128 0x1b
-	.4byte	.LASF506
+	.4byte	.LASF507
 	.byte	0x1f
 	.2byte	0x5a4
-	.4byte	0x1684
+	.4byte	0x1699
 	.byte	0xe0
 	.uleb128 0x1b
-	.4byte	.LASF507
+	.4byte	.LASF508
 	.byte	0x1f
 	.2byte	0x5a5
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0xe8
 	.uleb128 0x1b
-	.4byte	.LASF508
+	.4byte	.LASF509
 	.byte	0x1f
 	.2byte	0x5a6
-	.4byte	0x7b71
+	.4byte	0x7b86
 	.byte	0xf8
 	.uleb128 0x1c
-	.4byte	.LASF509
+	.4byte	.LASF510
 	.byte	0x1f
 	.2byte	0x5a7
-	.4byte	0x4851
+	.4byte	0x4866
 	.2byte	0x100
 	.uleb128 0x1c
-	.4byte	.LASF510
+	.4byte	.LASF511
 	.byte	0x1f
 	.2byte	0x5a8
-	.4byte	0x878a
+	.4byte	0x879f
 	.2byte	0x108
 	.uleb128 0x1c
-	.4byte	.LASF511
+	.4byte	.LASF512
 	.byte	0x1f
 	.2byte	0x5a9
-	.4byte	0x3d6
+	.4byte	0x3eb
 	.2byte	0x110
 	.uleb128 0x1c
-	.4byte	.LASF512
+	.4byte	.LASF513
 	.byte	0x1f
 	.2byte	0x5aa
 	.4byte	0x6d
 	.2byte	0x120
 	.uleb128 0x1c
-	.4byte	.LASF513
+	.4byte	.LASF514
 	.byte	0x1f
 	.2byte	0x5ab
-	.4byte	0x756c
+	.4byte	0x7581
 	.2byte	0x128
 	.uleb128 0x1c
-	.4byte	.LASF514
+	.4byte	.LASF515
 	.byte	0x1f
 	.2byte	0x5ad
-	.4byte	0x8321
+	.4byte	0x8336
 	.2byte	0x268
 	.uleb128 0x1c
-	.4byte	.LASF515
+	.4byte	.LASF516
 	.byte	0x1f
 	.2byte	0x5af
-	.4byte	0x8790
+	.4byte	0x87a5
 	.2byte	0x420
 	.uleb128 0x1c
-	.4byte	.LASF516
+	.4byte	.LASF517
 	.byte	0x1f
 	.2byte	0x5b0
-	.4byte	0x5d5f
+	.4byte	0x5d74
 	.2byte	0x440
 	.uleb128 0x1c
-	.4byte	.LASF517
+	.4byte	.LASF518
 	.byte	0x1f
 	.2byte	0x5b2
-	.4byte	0x443
+	.4byte	0x458
 	.2byte	0x450
 	.uleb128 0x1c
-	.4byte	.LASF518
+	.4byte	.LASF519
 	.byte	0x1f
 	.2byte	0x5b3
 	.4byte	0x6d
 	.2byte	0x458
 	.uleb128 0x1c
-	.4byte	.LASF519
+	.4byte	.LASF520
 	.byte	0x1f
 	.2byte	0x5b4
-	.4byte	0x326
+	.4byte	0x33b
 	.2byte	0x45c
 	.uleb128 0x1c
-	.4byte	.LASF520
+	.4byte	.LASF521
 	.byte	0x1f
 	.2byte	0x5b8
-	.4byte	0x13a
+	.4byte	0x13f
 	.2byte	0x460
 	.uleb128 0x1c
-	.4byte	.LASF521
+	.4byte	.LASF522
 	.byte	0x1f
 	.2byte	0x5be
-	.4byte	0x2455
+	.4byte	0x246a
 	.2byte	0x468
 	.uleb128 0x1c
-	.4byte	.LASF522
+	.4byte	.LASF523
 	.byte	0x1f
 	.2byte	0x5c4
-	.4byte	0x219
+	.4byte	0x21e
 	.2byte	0x488
 	.uleb128 0x1c
-	.4byte	.LASF523
+	.4byte	.LASF524
 	.byte	0x1f
 	.2byte	0x5c6
-	.4byte	0x1d58
+	.4byte	0x1d6d
 	.2byte	0x490
 	.uleb128 0x1c
-	.4byte	.LASF524
+	.4byte	.LASF525
 	.byte	0x1f
 	.2byte	0x5cb
 	.4byte	0xc6
 	.2byte	0x498
 	.uleb128 0x1c
-	.4byte	.LASF525
+	.4byte	.LASF526
 	.byte	0x1f
 	.2byte	0x5cd
-	.4byte	0x4ba7
+	.4byte	0x4bbc
 	.2byte	0x4a0
 	.uleb128 0x1c
-	.4byte	.LASF526
+	.4byte	.LASF527
 	.byte	0x1f
 	.2byte	0x5d0
-	.4byte	0x543
+	.4byte	0x558
 	.2byte	0x4e0
 	.uleb128 0x1c
-	.4byte	.LASF527
+	.4byte	.LASF528
 	.byte	0x1f
 	.2byte	0x5d3
-	.4byte	0x543
+	.4byte	0x558
 	.2byte	0x4e8
 	.uleb128 0x1c
-	.4byte	.LASF528
+	.4byte	.LASF529
 	.byte	0x1f
 	.2byte	0x5d6
 	.4byte	0xc6
 	.2byte	0x4f0
 	.uleb128 0x1c
-	.4byte	.LASF529
+	.4byte	.LASF530
 	.byte	0x1f
 	.2byte	0x5d9
-	.4byte	0x330a
+	.4byte	0x331f
 	.2byte	0x4f8
 	.uleb128 0x1c
-	.4byte	.LASF530
+	.4byte	.LASF531
 	.byte	0x1f
 	.2byte	0x5da
-	.4byte	0x3bd
+	.4byte	0x3d2
 	.2byte	0x500
 	.uleb128 0x1c
-	.4byte	.LASF531
+	.4byte	.LASF532
 	.byte	0x1f
 	.2byte	0x5e1
-	.4byte	0x5a21
+	.4byte	0x5a36
 	.2byte	0x508
 	.uleb128 0x1c
-	.4byte	.LASF532
+	.4byte	.LASF533
 	.byte	0x1f
 	.2byte	0x5e7
-	.4byte	0x4ce1
+	.4byte	0x4cf6
 	.2byte	0x540
 	.uleb128 0x1c
-	.4byte	.LASF533
+	.4byte	.LASF534
 	.byte	0x1f
 	.2byte	0x5e8
-	.4byte	0x4ce1
+	.4byte	0x4cf6
 	.2byte	0x580
 	.uleb128 0x30
 	.string	"rcu"
 	.byte	0x1f
 	.2byte	0x5e9
-	.4byte	0x407
+	.4byte	0x41c
 	.2byte	0x5a0
 	.uleb128 0x1c
-	.4byte	.LASF534
+	.4byte	.LASF535
 	.byte	0x1f
 	.2byte	0x5ea
-	.4byte	0x31f6
+	.4byte	0x320b
 	.2byte	0x5b0
 	.uleb128 0x1c
-	.4byte	.LASF535
+	.4byte	.LASF536
 	.byte	0x1f
 	.2byte	0x5ec
-	.4byte	0x2455
+	.4byte	0x246a
 	.2byte	0x5e0
 	.uleb128 0x1c
-	.4byte	.LASF536
+	.4byte	.LASF537
 	.byte	0x1f
 	.2byte	0x5f1
 	.4byte	0xc6
 	.2byte	0x600
 	.uleb128 0x1c
-	.4byte	.LASF537
+	.4byte	.LASF538
 	.byte	0x1f
 	.2byte	0x5f4
-	.4byte	0xe50
+	.4byte	0xe65
 	.2byte	0x640
 	.uleb128 0x1c
-	.4byte	.LASF538
+	.4byte	.LASF539
 	.byte	0x1f
 	.2byte	0x5f5
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x648
 	.uleb128 0x1c
-	.4byte	.LASF539
+	.4byte	.LASF540
 	.byte	0x1f
 	.2byte	0x5f7
-	.4byte	0xe50
+	.4byte	0xe65
 	.2byte	0x658
 	.uleb128 0x1c
-	.4byte	.LASF540
+	.4byte	.LASF541
 	.byte	0x1f
 	.2byte	0x5f8
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x660
 	.uleb128 0x1c
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x1f
 	.2byte	0x5fa
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x670
 	.uleb128 0x1c
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x1f
 	.2byte	0x5fb
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x678
 	.uleb128 0x1c
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x1f
 	.2byte	0x5fc
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x680
 	.uleb128 0x1c
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x1f
 	.2byte	0x5fd
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x688
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1d5e
+	.4byte	0x1d73
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x40
 	.byte	0x9a
-	.4byte	0x20ed
+	.4byte	0x2102
 	.uleb128 0xe
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x40
 	.byte	0x9a
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0
 	.byte	0
 	.uleb128 0x10
-	.4byte	0x20fd
+	.4byte	0x2112
 	.uleb128 0x11
-	.4byte	0x20fd
+	.4byte	0x2112
 	.uleb128 0x11
-	.4byte	0x212d
+	.4byte	0x2142
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2128
+	.4byte	0x213d
 	.uleb128 0xd
-	.4byte	.LASF541
+	.4byte	.LASF542
 	.byte	0x10
 	.byte	0x41
 	.byte	0x8
-	.4byte	0x2128
+	.4byte	0x213d
 	.uleb128 0x20
 	.string	"mnt"
 	.byte	0x41
 	.byte	0x9
-	.4byte	0x224f
+	.4byte	0x2264
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF402
+	.4byte	.LASF403
 	.byte	0x41
 	.byte	0xa
-	.4byte	0x1980
+	.4byte	0x1995
 	.byte	0x8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x2103
+	.4byte	0x2118
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2103
+	.4byte	0x2118
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x20ed
+	.4byte	0x2102
 	.uleb128 0x31
 	.byte	0
 	.byte	0x40
@@ -14590,198 +14577,198 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x40
 	.byte	0x9a
-	.4byte	0x2161
+	.4byte	0x2176
 	.uleb128 0x22
-	.4byte	.LASF542
+	.4byte	.LASF543
 	.byte	0x40
 	.byte	0x9a
-	.4byte	0x2133
+	.4byte	0x2148
 	.uleb128 0x22
-	.4byte	.LASF543
+	.4byte	.LASF544
 	.byte	0x40
 	.byte	0x9a
-	.4byte	0x20d8
+	.4byte	0x20ed
 	.uleb128 0x29
-	.4byte	0x2139
+	.4byte	0x214e
 	.byte	0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x2175
+	.4byte	0x218a
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2161
+	.4byte	0x2176
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x218f
+	.4byte	0x21a4
 	.uleb128 0x11
-	.4byte	0x218f
+	.4byte	0x21a4
 	.uleb128 0x11
-	.4byte	0x2195
+	.4byte	0x21aa
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x197b
+	.4byte	0x1990
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x17a9
+	.4byte	0x17be
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x217b
+	.4byte	0x2190
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x21bf
+	.4byte	0x21d4
 	.uleb128 0x11
-	.4byte	0x218f
+	.4byte	0x21a4
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
-	.4byte	0x21bf
+	.4byte	0x21d4
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x17c8
+	.4byte	0x17dd
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x21a1
+	.4byte	0x21b6
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x21da
+	.4byte	0x21ef
 	.uleb128 0x11
-	.4byte	0x218f
+	.4byte	0x21a4
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x21cb
+	.4byte	0x21e0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x21ef
+	.4byte	0x2204
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x21e0
+	.4byte	0x21f5
 	.uleb128 0x10
-	.4byte	0x2200
+	.4byte	0x2215
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x21f5
+	.4byte	0x220a
 	.uleb128 0x10
-	.4byte	0x2216
+	.4byte	0x222b
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2206
+	.4byte	0x221b
 	.uleb128 0x14
-	.4byte	0x219
-	.4byte	0x2235
+	.4byte	0x21e
+	.4byte	0x224a
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.uleb128 0x11
-	.4byte	0x219
+	.4byte	0x21e
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x221c
+	.4byte	0x2231
 	.uleb128 0x24
-	.4byte	.LASF544
+	.4byte	.LASF545
 	.uleb128 0x14
-	.4byte	0x224f
-	.4byte	0x224f
+	.4byte	0x2264
+	.4byte	0x2264
 	.uleb128 0x11
-	.4byte	0x212d
+	.4byte	0x2142
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x223b
+	.4byte	0x2250
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2240
+	.4byte	0x2255
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x226f
+	.4byte	0x2284
 	.uleb128 0x11
-	.4byte	0x20fd
+	.4byte	0x2112
 	.uleb128 0x11
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x225b
+	.4byte	0x2270
 	.uleb128 0x14
-	.4byte	0x1980
-	.4byte	0x2289
+	.4byte	0x1995
+	.4byte	0x229e
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.uleb128 0x11
-	.4byte	0x2289
+	.4byte	0x229e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1c65
+	.4byte	0x1c7a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2275
+	.4byte	0x228a
 	.uleb128 0x19
-	.4byte	.LASF545
+	.4byte	.LASF546
 	.byte	0x40
 	.byte	0xe6
-	.4byte	0x1716
+	.4byte	0x172b
 	.uleb128 0x15
-	.4byte	.LASF546
+	.4byte	.LASF547
 	.byte	0x40
 	.2byte	0x1fe
 	.4byte	0xc6
 	.uleb128 0x8
-	.4byte	.LASF547
+	.4byte	.LASF548
 	.byte	0x26
 	.byte	0x8
-	.4byte	0x12a
+	.4byte	0x12f
 	.uleb128 0x1f
-	.4byte	.LASF548
+	.4byte	.LASF549
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x42
 	.byte	0x8
-	.4byte	0x22e6
+	.4byte	0x22fb
 	.uleb128 0xc
-	.4byte	.LASF549
+	.4byte	.LASF550
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF550
+	.4byte	.LASF551
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF551
+	.4byte	.LASF552
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF552
+	.4byte	.LASF553
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF553
+	.4byte	.LASF554
 	.byte	0x4
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF554
+	.4byte	.LASF555
 	.byte	0x10
 	.byte	0x42
 	.byte	0x35
-	.4byte	0x2309
+	.4byte	0x231e
 	.uleb128 0x20
 	.string	"nr"
 	.byte	0x42
@@ -14792,251 +14779,251 @@ __exitcall_ebc_exit:
 	.string	"ns"
 	.byte	0x42
 	.byte	0x37
-	.4byte	0x230e
+	.4byte	0x2323
 	.byte	0x8
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF555
+	.4byte	.LASF556
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2309
+	.4byte	0x231e
 	.uleb128 0x32
 	.string	"pid"
 	.byte	0x60
 	.byte	0x42
 	.byte	0x3a
-	.4byte	0x2369
+	.4byte	0x237e
 	.uleb128 0xe
-	.4byte	.LASF382
+	.4byte	.LASF383
 	.byte	0x42
 	.byte	0x3c
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF556
+	.4byte	.LASF557
 	.byte	0x42
 	.byte	0x3d
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF557
+	.4byte	.LASF558
 	.byte	0x42
 	.byte	0x3f
-	.4byte	0x2369
+	.4byte	0x237e
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF558
+	.4byte	.LASF559
 	.byte	0x42
 	.byte	0x41
-	.4byte	0x15aa
+	.4byte	0x15bf
 	.byte	0x28
 	.uleb128 0x20
 	.string	"rcu"
 	.byte	0x42
 	.byte	0x42
-	.4byte	0x407
+	.4byte	0x41c
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF559
+	.4byte	.LASF560
 	.byte	0x42
 	.byte	0x43
-	.4byte	0x2379
+	.4byte	0x238e
 	.byte	0x50
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x3bd
-	.4byte	0x2379
+	.4byte	0x3d2
+	.4byte	0x238e
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x22e6
-	.4byte	0x2389
+	.4byte	0x22fb
+	.4byte	0x239e
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF560
+	.4byte	.LASF561
 	.byte	0x42
 	.byte	0x46
-	.4byte	0x2314
+	.4byte	0x2329
 	.uleb128 0x19
-	.4byte	.LASF561
+	.4byte	.LASF562
 	.byte	0x42
 	.byte	0x48
-	.4byte	0x7b4
+	.4byte	0x7c9
 	.uleb128 0x19
-	.4byte	.LASF562
+	.4byte	.LASF563
 	.byte	0x42
 	.byte	0x62
-	.4byte	0x2309
+	.4byte	0x231e
 	.uleb128 0x19
-	.4byte	.LASF563
+	.4byte	.LASF564
 	.byte	0x43
 	.byte	0x23
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF564
+	.4byte	.LASF565
 	.byte	0x43
 	.byte	0x24
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF565
+	.4byte	.LASF566
 	.byte	0x43
 	.byte	0x52
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF566
+	.4byte	.LASF567
 	.byte	0x43
 	.byte	0x53
 	.4byte	0xc6
 	.uleb128 0x24
-	.4byte	.LASF567
-	.uleb128 0x19
 	.4byte	.LASF568
+	.uleb128 0x19
+	.4byte	.LASF569
 	.byte	0x44
 	.byte	0x13
-	.4byte	0x23d6
+	.4byte	0x23eb
 	.uleb128 0xf
 	.byte	0x4
 	.byte	0x44
 	.byte	0x15
-	.4byte	0x23fb
+	.4byte	0x2410
 	.uleb128 0x20
 	.string	"val"
 	.byte	0x44
 	.byte	0x16
-	.4byte	0x2ad
+	.4byte	0x2c2
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF569
+	.4byte	.LASF570
 	.byte	0x44
 	.byte	0x17
-	.4byte	0x23e6
+	.4byte	0x23fb
 	.uleb128 0xf
 	.byte	0x4
 	.byte	0x44
 	.byte	0x1a
-	.4byte	0x241b
+	.4byte	0x2430
 	.uleb128 0x20
 	.string	"val"
 	.byte	0x44
 	.byte	0x1b
-	.4byte	0x2b8
+	.4byte	0x2cd
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF570
+	.4byte	.LASF571
 	.byte	0x44
 	.byte	0x1c
-	.4byte	0x2406
+	.4byte	0x241b
 	.uleb128 0xd
-	.4byte	.LASF571
+	.4byte	.LASF572
 	.byte	0x4
 	.byte	0x45
 	.byte	0xf
-	.4byte	0x243f
+	.4byte	0x2454
 	.uleb128 0xe
-	.4byte	.LASF220
+	.4byte	.LASF221
 	.byte	0x45
 	.byte	0x14
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF572
+	.4byte	.LASF573
 	.byte	0x46
 	.byte	0xb
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF573
+	.4byte	.LASF574
 	.byte	0x46
 	.byte	0xc
 	.4byte	0xc6
 	.uleb128 0xd
-	.4byte	.LASF574
+	.4byte	.LASF575
 	.byte	0x20
 	.byte	0x47
 	.byte	0x35
-	.4byte	0x2492
+	.4byte	0x24a7
 	.uleb128 0xe
-	.4byte	.LASF97
+	.4byte	.LASF98
 	.byte	0x47
 	.byte	0x36
-	.4byte	0x543
+	.4byte	0x558
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF227
+	.4byte	.LASF228
 	.byte	0x47
 	.byte	0x37
-	.4byte	0xe50
+	.4byte	0xe65
 	.byte	0x8
 	.uleb128 0x20
 	.string	"osq"
 	.byte	0x47
 	.byte	0x39
-	.4byte	0x2426
+	.4byte	0x243b
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF575
+	.4byte	.LASF576
 	.byte	0x47
 	.byte	0x3b
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x10
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF576
+	.4byte	.LASF577
 	.2byte	0xe80
 	.byte	0x48
 	.2byte	0x287
-	.4byte	0x2ef0
+	.4byte	0x2f05
 	.uleb128 0x1b
-	.4byte	.LASF204
+	.4byte	.LASF205
 	.byte	0x48
 	.2byte	0x28d
-	.4byte	0xc1e
+	.4byte	0xc33
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF577
+	.4byte	.LASF578
 	.byte	0x48
 	.2byte	0x290
-	.4byte	0x19b
+	.4byte	0x1a0
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF578
+	.4byte	.LASF579
 	.byte	0x48
 	.2byte	0x298
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF579
+	.4byte	.LASF580
 	.byte	0x48
 	.2byte	0x299
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x48
 	.2byte	0x29b
 	.4byte	0x6d
 	.byte	0x34
 	.uleb128 0x1b
-	.4byte	.LASF580
+	.4byte	.LASF581
 	.byte	0x48
 	.2byte	0x29c
 	.4byte	0x6d
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF581
+	.4byte	.LASF582
 	.byte	0x48
 	.2byte	0x29f
-	.4byte	0x2f01
+	.4byte	0x2f16
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF582
+	.4byte	.LASF583
 	.byte	0x48
 	.2byte	0x2a0
 	.4byte	0xc6
@@ -15048,283 +15035,283 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0x4c
 	.uleb128 0x1b
-	.4byte	.LASF583
+	.4byte	.LASF584
 	.byte	0x48
 	.2byte	0x2a5
 	.4byte	0x6d
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF584
+	.4byte	.LASF585
 	.byte	0x48
 	.2byte	0x2a6
 	.4byte	0x29
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF585
+	.4byte	.LASF586
 	.byte	0x48
 	.2byte	0x2a7
-	.4byte	0x2ef0
+	.4byte	0x2f05
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF586
+	.4byte	.LASF587
 	.byte	0x48
 	.2byte	0x2b0
 	.4byte	0xc6
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF587
+	.4byte	.LASF588
 	.byte	0x48
 	.2byte	0x2b1
 	.4byte	0xc6
 	.byte	0x6c
 	.uleb128 0x1b
-	.4byte	.LASF588
+	.4byte	.LASF589
 	.byte	0x48
 	.2byte	0x2b3
 	.4byte	0xc6
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF589
+	.4byte	.LASF590
 	.byte	0x48
 	.2byte	0x2b5
 	.4byte	0xc6
 	.byte	0x74
 	.uleb128 0x1b
-	.4byte	.LASF590
+	.4byte	.LASF591
 	.byte	0x48
 	.2byte	0x2b6
 	.4byte	0xc6
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF591
+	.4byte	.LASF592
 	.byte	0x48
 	.2byte	0x2b7
 	.4byte	0xc6
 	.byte	0x7c
 	.uleb128 0x1b
-	.4byte	.LASF592
+	.4byte	.LASF593
 	.byte	0x48
 	.2byte	0x2b8
 	.4byte	0x6d
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF593
+	.4byte	.LASF594
 	.byte	0x48
 	.2byte	0x2ba
-	.4byte	0x45e3
+	.4byte	0x45f8
 	.byte	0x88
 	.uleb128 0x2b
 	.string	"se"
 	.byte	0x48
 	.2byte	0x2bb
-	.4byte	0x4212
+	.4byte	0x4227
 	.byte	0xc0
 	.uleb128 0x30
 	.string	"rt"
 	.byte	0x48
 	.2byte	0x2bc
-	.4byte	0x433f
+	.4byte	0x4354
 	.2byte	0x2c0
 	.uleb128 0x1c
-	.4byte	.LASF594
+	.4byte	.LASF595
 	.byte	0x48
 	.2byte	0x2bf
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x310
 	.uleb128 0x1c
-	.4byte	.LASF595
+	.4byte	.LASF596
 	.byte	0x48
 	.2byte	0x2c0
 	.4byte	0xc6
 	.2byte	0x318
 	.uleb128 0x1c
-	.4byte	.LASF596
+	.4byte	.LASF597
 	.byte	0x48
 	.2byte	0x2c1
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x320
 	.uleb128 0x1c
-	.4byte	.LASF597
+	.4byte	.LASF598
 	.byte	0x48
 	.2byte	0x2c2
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x328
 	.uleb128 0x1c
-	.4byte	.LASF598
+	.4byte	.LASF599
 	.byte	0x48
 	.2byte	0x2c5
-	.4byte	0x45ee
+	.4byte	0x4603
 	.2byte	0x330
 	.uleb128 0x30
 	.string	"dl"
 	.byte	0x48
 	.2byte	0x2c7
-	.4byte	0x43e2
+	.4byte	0x43f7
 	.2byte	0x338
 	.uleb128 0x1c
-	.4byte	.LASF599
+	.4byte	.LASF600
 	.byte	0x48
 	.2byte	0x2d9
 	.4byte	0x6d
 	.2byte	0x420
 	.uleb128 0x1c
-	.4byte	.LASF600
+	.4byte	.LASF601
 	.byte	0x48
 	.2byte	0x2da
 	.4byte	0xc6
 	.2byte	0x424
 	.uleb128 0x1c
-	.4byte	.LASF601
+	.4byte	.LASF602
 	.byte	0x48
 	.2byte	0x2db
-	.4byte	0x15d3
+	.4byte	0x15e8
 	.2byte	0x428
 	.uleb128 0x1c
-	.4byte	.LASF602
+	.4byte	.LASF603
 	.byte	0x48
 	.2byte	0x2dc
-	.4byte	0x15d3
+	.4byte	0x15e8
 	.2byte	0x430
 	.uleb128 0x1c
-	.4byte	.LASF603
+	.4byte	.LASF604
 	.byte	0x48
 	.2byte	0x2df
 	.4byte	0xc6
 	.2byte	0x438
 	.uleb128 0x1c
-	.4byte	.LASF604
+	.4byte	.LASF605
 	.byte	0x48
 	.2byte	0x2e0
-	.4byte	0x450d
+	.4byte	0x4522
 	.2byte	0x43c
 	.uleb128 0x1c
-	.4byte	.LASF605
+	.4byte	.LASF606
 	.byte	0x48
 	.2byte	0x2e1
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x440
 	.uleb128 0x1c
-	.4byte	.LASF606
+	.4byte	.LASF607
 	.byte	0x48
 	.2byte	0x2e2
-	.4byte	0x45f9
+	.4byte	0x460e
 	.2byte	0x450
 	.uleb128 0x1c
-	.4byte	.LASF607
+	.4byte	.LASF608
 	.byte	0x48
 	.2byte	0x2e6
 	.4byte	0x29
 	.2byte	0x458
 	.uleb128 0x1c
-	.4byte	.LASF608
+	.4byte	.LASF609
 	.byte	0x48
 	.2byte	0x2e7
-	.4byte	0x10b
+	.4byte	0x110
 	.2byte	0x460
 	.uleb128 0x1c
-	.4byte	.LASF609
+	.4byte	.LASF610
 	.byte	0x48
 	.2byte	0x2e8
-	.4byte	0x10b
+	.4byte	0x110
 	.2byte	0x461
 	.uleb128 0x1c
-	.4byte	.LASF610
+	.4byte	.LASF611
 	.byte	0x48
 	.2byte	0x2e9
 	.4byte	0xc6
 	.2byte	0x464
 	.uleb128 0x1c
-	.4byte	.LASF611
+	.4byte	.LASF612
 	.byte	0x48
 	.2byte	0x2ea
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x468
 	.uleb128 0x1c
-	.4byte	.LASF612
+	.4byte	.LASF613
 	.byte	0x48
 	.2byte	0x2ed
-	.4byte	0x3f90
+	.4byte	0x3fa5
 	.2byte	0x478
 	.uleb128 0x1c
-	.4byte	.LASF557
+	.4byte	.LASF558
 	.byte	0x48
 	.2byte	0x2ef
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x498
 	.uleb128 0x1c
-	.4byte	.LASF613
+	.4byte	.LASF614
 	.byte	0x48
 	.2byte	0x2f1
-	.4byte	0x349c
+	.4byte	0x34b1
 	.2byte	0x4a8
 	.uleb128 0x1c
-	.4byte	.LASF614
+	.4byte	.LASF615
 	.byte	0x48
 	.2byte	0x2f2
-	.4byte	0x34cd
+	.4byte	0x34e2
 	.2byte	0x4d0
 	.uleb128 0x30
 	.string	"mm"
 	.byte	0x48
 	.2byte	0x2f5
-	.4byte	0x4622
+	.4byte	0x4637
 	.2byte	0x4e8
 	.uleb128 0x1c
-	.4byte	.LASF615
+	.4byte	.LASF616
 	.byte	0x48
 	.2byte	0x2f6
-	.4byte	0x4622
+	.4byte	0x4637
 	.2byte	0x4f0
 	.uleb128 0x1c
-	.4byte	.LASF616
+	.4byte	.LASF617
 	.byte	0x48
 	.2byte	0x2f9
-	.4byte	0x3c6b
+	.4byte	0x3c80
 	.2byte	0x4f8
 	.uleb128 0x1c
-	.4byte	.LASF617
+	.4byte	.LASF618
 	.byte	0x48
 	.2byte	0x2fc
-	.4byte	0x3dcb
+	.4byte	0x3de0
 	.2byte	0x520
 	.uleb128 0x1c
-	.4byte	.LASF618
+	.4byte	.LASF619
 	.byte	0x48
 	.2byte	0x2fe
 	.4byte	0xc6
 	.2byte	0x538
 	.uleb128 0x1c
-	.4byte	.LASF619
+	.4byte	.LASF620
 	.byte	0x48
 	.2byte	0x2ff
 	.4byte	0xc6
 	.2byte	0x53c
 	.uleb128 0x1c
-	.4byte	.LASF620
+	.4byte	.LASF621
 	.byte	0x48
 	.2byte	0x300
 	.4byte	0xc6
 	.2byte	0x540
 	.uleb128 0x1c
-	.4byte	.LASF621
+	.4byte	.LASF622
 	.byte	0x48
 	.2byte	0x302
 	.4byte	0xc6
 	.2byte	0x544
 	.uleb128 0x1c
-	.4byte	.LASF622
+	.4byte	.LASF623
 	.byte	0x48
 	.2byte	0x304
 	.4byte	0x29
 	.2byte	0x548
 	.uleb128 0x1c
-	.4byte	.LASF623
+	.4byte	.LASF624
 	.byte	0x48
 	.2byte	0x307
 	.4byte	0x6d
 	.2byte	0x550
 	.uleb128 0x33
-	.4byte	.LASF624
+	.4byte	.LASF625
 	.byte	0x48
 	.2byte	0x30a
 	.4byte	0x6d
@@ -15333,7 +15320,7 @@ __exitcall_ebc_exit:
 	.byte	0x1f
 	.2byte	0x554
 	.uleb128 0x33
-	.4byte	.LASF625
+	.4byte	.LASF626
 	.byte	0x48
 	.2byte	0x30b
 	.4byte	0x6d
@@ -15342,7 +15329,7 @@ __exitcall_ebc_exit:
 	.byte	0x1e
 	.2byte	0x554
 	.uleb128 0x33
-	.4byte	.LASF626
+	.4byte	.LASF627
 	.byte	0x48
 	.2byte	0x30c
 	.4byte	0x6d
@@ -15351,7 +15338,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.2byte	0x554
 	.uleb128 0x33
-	.4byte	.LASF627
+	.4byte	.LASF628
 	.byte	0x48
 	.2byte	0x30d
 	.4byte	0x6d
@@ -15360,7 +15347,7 @@ __exitcall_ebc_exit:
 	.byte	0x1c
 	.2byte	0x554
 	.uleb128 0x33
-	.4byte	.LASF628
+	.4byte	.LASF629
 	.byte	0x48
 	.2byte	0x30f
 	.4byte	0x6d
@@ -15369,7 +15356,7 @@ __exitcall_ebc_exit:
 	.byte	0x1b
 	.2byte	0x554
 	.uleb128 0x33
-	.4byte	.LASF629
+	.4byte	.LASF630
 	.byte	0x48
 	.2byte	0x318
 	.4byte	0x6d
@@ -15378,7 +15365,7 @@ __exitcall_ebc_exit:
 	.byte	0x1f
 	.2byte	0x558
 	.uleb128 0x33
-	.4byte	.LASF630
+	.4byte	.LASF631
 	.byte	0x48
 	.2byte	0x319
 	.4byte	0x6d
@@ -15387,7 +15374,7 @@ __exitcall_ebc_exit:
 	.byte	0x1e
 	.2byte	0x558
 	.uleb128 0x33
-	.4byte	.LASF631
+	.4byte	.LASF632
 	.byte	0x48
 	.2byte	0x31e
 	.4byte	0x6d
@@ -15396,7 +15383,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.2byte	0x558
 	.uleb128 0x33
-	.4byte	.LASF632
+	.4byte	.LASF633
 	.byte	0x48
 	.2byte	0x320
 	.4byte	0x6d
@@ -15405,7 +15392,7 @@ __exitcall_ebc_exit:
 	.byte	0x1c
 	.2byte	0x558
 	.uleb128 0x33
-	.4byte	.LASF633
+	.4byte	.LASF634
 	.byte	0x48
 	.2byte	0x328
 	.4byte	0x6d
@@ -15414,7 +15401,7 @@ __exitcall_ebc_exit:
 	.byte	0x1b
 	.2byte	0x558
 	.uleb128 0x33
-	.4byte	.LASF634
+	.4byte	.LASF635
 	.byte	0x48
 	.2byte	0x32c
 	.4byte	0x6d
@@ -15423,241 +15410,241 @@ __exitcall_ebc_exit:
 	.byte	0x1a
 	.2byte	0x558
 	.uleb128 0x1c
-	.4byte	.LASF635
+	.4byte	.LASF636
 	.byte	0x48
 	.2byte	0x32f
 	.4byte	0x29
 	.2byte	0x560
 	.uleb128 0x1c
-	.4byte	.LASF199
+	.4byte	.LASF200
 	.byte	0x48
 	.2byte	0x331
-	.4byte	0xbae
+	.4byte	0xbc3
 	.2byte	0x568
 	.uleb128 0x30
 	.string	"pid"
 	.byte	0x48
 	.2byte	0x333
-	.4byte	0x285
+	.4byte	0x29a
 	.2byte	0x598
 	.uleb128 0x1c
-	.4byte	.LASF636
+	.4byte	.LASF637
 	.byte	0x48
 	.2byte	0x334
-	.4byte	0x285
+	.4byte	0x29a
 	.2byte	0x59c
 	.uleb128 0x1c
-	.4byte	.LASF637
+	.4byte	.LASF638
 	.byte	0x48
 	.2byte	0x338
 	.4byte	0x29
 	.2byte	0x5a0
 	.uleb128 0x1c
-	.4byte	.LASF638
+	.4byte	.LASF639
 	.byte	0x48
 	.2byte	0x341
-	.4byte	0x2ef0
+	.4byte	0x2f05
 	.2byte	0x5a8
 	.uleb128 0x1c
-	.4byte	.LASF639
+	.4byte	.LASF640
 	.byte	0x48
 	.2byte	0x344
-	.4byte	0x2ef0
+	.4byte	0x2f05
 	.2byte	0x5b0
 	.uleb128 0x1c
-	.4byte	.LASF640
+	.4byte	.LASF641
 	.byte	0x48
 	.2byte	0x349
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x5b8
 	.uleb128 0x1c
-	.4byte	.LASF641
+	.4byte	.LASF642
 	.byte	0x48
 	.2byte	0x34a
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x5c8
 	.uleb128 0x1c
-	.4byte	.LASF642
+	.4byte	.LASF643
 	.byte	0x48
 	.2byte	0x34b
-	.4byte	0x2ef0
+	.4byte	0x2f05
 	.2byte	0x5d8
 	.uleb128 0x1c
-	.4byte	.LASF643
+	.4byte	.LASF644
 	.byte	0x48
 	.2byte	0x353
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x5e0
 	.uleb128 0x1c
-	.4byte	.LASF644
+	.4byte	.LASF645
 	.byte	0x48
 	.2byte	0x354
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x5f0
 	.uleb128 0x1c
-	.4byte	.LASF645
+	.4byte	.LASF646
 	.byte	0x48
 	.2byte	0x357
-	.4byte	0x4628
+	.4byte	0x463d
 	.2byte	0x600
 	.uleb128 0x1c
-	.4byte	.LASF646
+	.4byte	.LASF647
 	.byte	0x48
 	.2byte	0x358
-	.4byte	0x462e
+	.4byte	0x4643
 	.2byte	0x608
 	.uleb128 0x1c
-	.4byte	.LASF647
+	.4byte	.LASF648
 	.byte	0x48
 	.2byte	0x359
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x648
 	.uleb128 0x1c
-	.4byte	.LASF648
+	.4byte	.LASF649
 	.byte	0x48
 	.2byte	0x35a
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x658
 	.uleb128 0x1c
-	.4byte	.LASF649
+	.4byte	.LASF650
 	.byte	0x48
 	.2byte	0x35c
-	.4byte	0x4663
+	.4byte	0x4678
 	.2byte	0x668
 	.uleb128 0x1c
-	.4byte	.LASF650
+	.4byte	.LASF651
 	.byte	0x48
 	.2byte	0x35f
-	.4byte	0x4669
+	.4byte	0x467e
 	.2byte	0x670
 	.uleb128 0x1c
-	.4byte	.LASF651
+	.4byte	.LASF652
 	.byte	0x48
 	.2byte	0x362
-	.4byte	0x4669
+	.4byte	0x467e
 	.2byte	0x678
 	.uleb128 0x1c
-	.4byte	.LASF652
+	.4byte	.LASF653
 	.byte	0x48
 	.2byte	0x364
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x680
 	.uleb128 0x1c
-	.4byte	.LASF653
+	.4byte	.LASF654
 	.byte	0x48
 	.2byte	0x365
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x688
 	.uleb128 0x1c
-	.4byte	.LASF654
+	.4byte	.LASF655
 	.byte	0x48
 	.2byte	0x36a
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x690
 	.uleb128 0x1c
-	.4byte	.LASF655
+	.4byte	.LASF656
 	.byte	0x48
 	.2byte	0x36c
-	.4byte	0x466f
+	.4byte	0x4684
 	.2byte	0x698
 	.uleb128 0x1c
-	.4byte	.LASF656
+	.4byte	.LASF657
 	.byte	0x48
 	.2byte	0x36d
 	.4byte	0x6d
 	.2byte	0x6a0
 	.uleb128 0x1c
-	.4byte	.LASF657
+	.4byte	.LASF658
 	.byte	0x48
 	.2byte	0x36f
-	.4byte	0x3f2b
+	.4byte	0x3f40
 	.2byte	0x6a8
 	.uleb128 0x1c
-	.4byte	.LASF658
+	.4byte	.LASF659
 	.byte	0x48
 	.2byte	0x378
 	.4byte	0x29
 	.2byte	0x6c0
 	.uleb128 0x1c
-	.4byte	.LASF659
+	.4byte	.LASF660
 	.byte	0x48
 	.2byte	0x379
 	.4byte	0x29
 	.2byte	0x6c8
 	.uleb128 0x1c
-	.4byte	.LASF660
+	.4byte	.LASF661
 	.byte	0x48
 	.2byte	0x37c
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x6d0
 	.uleb128 0x1c
-	.4byte	.LASF661
+	.4byte	.LASF662
 	.byte	0x48
 	.2byte	0x37f
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x6d8
 	.uleb128 0x1c
-	.4byte	.LASF662
+	.4byte	.LASF663
 	.byte	0x48
 	.2byte	0x382
 	.4byte	0x29
 	.2byte	0x6e0
 	.uleb128 0x1c
-	.4byte	.LASF663
+	.4byte	.LASF664
 	.byte	0x48
 	.2byte	0x383
 	.4byte	0x29
 	.2byte	0x6e8
 	.uleb128 0x1c
-	.4byte	.LASF664
+	.4byte	.LASF665
 	.byte	0x48
 	.2byte	0x386
-	.4byte	0x3f5c
+	.4byte	0x3f71
 	.2byte	0x6f0
 	.uleb128 0x1c
-	.4byte	.LASF665
+	.4byte	.LASF666
 	.byte	0x48
 	.2byte	0x387
-	.4byte	0x4675
+	.4byte	0x468a
 	.2byte	0x708
 	.uleb128 0x1c
-	.4byte	.LASF666
+	.4byte	.LASF667
 	.byte	0x48
 	.2byte	0x38d
-	.4byte	0x47bd
+	.4byte	0x47d2
 	.2byte	0x738
 	.uleb128 0x1c
-	.4byte	.LASF667
+	.4byte	.LASF668
 	.byte	0x48
 	.2byte	0x390
-	.4byte	0x47bd
+	.4byte	0x47d2
 	.2byte	0x740
 	.uleb128 0x1c
-	.4byte	.LASF668
+	.4byte	.LASF669
 	.byte	0x48
 	.2byte	0x393
-	.4byte	0x47bd
+	.4byte	0x47d2
 	.2byte	0x748
 	.uleb128 0x1c
-	.4byte	.LASF669
+	.4byte	.LASF670
 	.byte	0x48
 	.2byte	0x39c
-	.4byte	0x47c3
+	.4byte	0x47d8
 	.2byte	0x750
 	.uleb128 0x1c
-	.4byte	.LASF670
+	.4byte	.LASF671
 	.byte	0x48
 	.2byte	0x39e
-	.4byte	0x47d8
+	.4byte	0x47ed
 	.2byte	0x760
 	.uleb128 0x1c
-	.4byte	.LASF671
+	.4byte	.LASF672
 	.byte	0x48
 	.2byte	0x3a5
 	.4byte	0x29
 	.2byte	0x768
 	.uleb128 0x1c
-	.4byte	.LASF672
+	.4byte	.LASF673
 	.byte	0x48
 	.2byte	0x3a6
 	.4byte	0x29
@@ -15666,1289 +15653,1289 @@ __exitcall_ebc_exit:
 	.string	"fs"
 	.byte	0x48
 	.2byte	0x3a9
-	.4byte	0x47e3
+	.4byte	0x47f8
 	.2byte	0x778
 	.uleb128 0x1c
-	.4byte	.LASF673
+	.4byte	.LASF674
 	.byte	0x48
 	.2byte	0x3ac
-	.4byte	0x47ee
+	.4byte	0x4803
 	.2byte	0x780
 	.uleb128 0x1c
-	.4byte	.LASF674
+	.4byte	.LASF675
 	.byte	0x48
 	.2byte	0x3af
-	.4byte	0x47f9
+	.4byte	0x480e
 	.2byte	0x788
 	.uleb128 0x1c
-	.4byte	.LASF675
+	.4byte	.LASF676
 	.byte	0x48
 	.2byte	0x3b2
-	.4byte	0x4804
+	.4byte	0x4819
 	.2byte	0x790
 	.uleb128 0x1c
-	.4byte	.LASF676
+	.4byte	.LASF677
 	.byte	0x48
 	.2byte	0x3b3
-	.4byte	0x480f
+	.4byte	0x4824
 	.2byte	0x798
 	.uleb128 0x1c
-	.4byte	.LASF677
+	.4byte	.LASF678
 	.byte	0x48
 	.2byte	0x3b4
-	.4byte	0x38d0
+	.4byte	0x38e5
 	.2byte	0x7a0
 	.uleb128 0x1c
-	.4byte	.LASF678
+	.4byte	.LASF679
 	.byte	0x48
 	.2byte	0x3b5
-	.4byte	0x38d0
+	.4byte	0x38e5
 	.2byte	0x7a8
 	.uleb128 0x1c
-	.4byte	.LASF679
+	.4byte	.LASF680
 	.byte	0x48
 	.2byte	0x3b7
-	.4byte	0x38d0
+	.4byte	0x38e5
 	.2byte	0x7b0
 	.uleb128 0x1c
-	.4byte	.LASF218
+	.4byte	.LASF219
 	.byte	0x48
 	.2byte	0x3b8
-	.4byte	0x3c46
+	.4byte	0x3c5b
 	.2byte	0x7b8
 	.uleb128 0x1c
-	.4byte	.LASF680
+	.4byte	.LASF681
 	.byte	0x48
 	.2byte	0x3b9
 	.4byte	0x29
 	.2byte	0x7d0
 	.uleb128 0x1c
-	.4byte	.LASF681
+	.4byte	.LASF682
 	.byte	0x48
 	.2byte	0x3ba
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.2byte	0x7d8
 	.uleb128 0x1c
-	.4byte	.LASF682
+	.4byte	.LASF683
 	.byte	0x48
 	.2byte	0x3bb
 	.4byte	0x6d
 	.2byte	0x7e0
 	.uleb128 0x1c
-	.4byte	.LASF683
+	.4byte	.LASF684
 	.byte	0x48
 	.2byte	0x3bd
-	.4byte	0x42c
+	.4byte	0x441
 	.2byte	0x7e8
 	.uleb128 0x1c
-	.4byte	.LASF684
+	.4byte	.LASF685
 	.byte	0x48
 	.2byte	0x3bf
-	.4byte	0x481a
+	.4byte	0x482f
 	.2byte	0x7f0
 	.uleb128 0x1c
-	.4byte	.LASF685
+	.4byte	.LASF686
 	.byte	0x48
 	.2byte	0x3c4
-	.4byte	0x3844
+	.4byte	0x3859
 	.2byte	0x7f8
 	.uleb128 0x1c
-	.4byte	.LASF686
+	.4byte	.LASF687
 	.byte	0x48
 	.2byte	0x3c7
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x808
 	.uleb128 0x1c
-	.4byte	.LASF687
+	.4byte	.LASF688
 	.byte	0x48
 	.2byte	0x3c8
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x810
 	.uleb128 0x1c
-	.4byte	.LASF688
+	.4byte	.LASF689
 	.byte	0x48
 	.2byte	0x3cb
-	.4byte	0xe50
+	.4byte	0xe65
 	.2byte	0x818
 	.uleb128 0x1c
-	.4byte	.LASF689
+	.4byte	.LASF690
 	.byte	0x48
 	.2byte	0x3ce
-	.4byte	0xe1e
+	.4byte	0xe33
 	.2byte	0x81c
 	.uleb128 0x1c
-	.4byte	.LASF690
+	.4byte	.LASF691
 	.byte	0x48
 	.2byte	0x3d0
-	.4byte	0x452f
+	.4byte	0x4544
 	.2byte	0x820
 	.uleb128 0x1c
-	.4byte	.LASF691
+	.4byte	.LASF692
 	.byte	0x48
 	.2byte	0x3d4
-	.4byte	0x351d
+	.4byte	0x3532
 	.2byte	0x828
 	.uleb128 0x1c
-	.4byte	.LASF692
+	.4byte	.LASF693
 	.byte	0x48
 	.2byte	0x3d6
-	.4byte	0x2ef0
+	.4byte	0x2f05
 	.2byte	0x838
 	.uleb128 0x1c
-	.4byte	.LASF693
+	.4byte	.LASF694
 	.byte	0x48
 	.2byte	0x3d8
-	.4byte	0x4825
+	.4byte	0x483a
 	.2byte	0x840
 	.uleb128 0x1c
-	.4byte	.LASF694
+	.4byte	.LASF695
 	.byte	0x48
 	.2byte	0x400
-	.4byte	0x443
+	.4byte	0x458
 	.2byte	0x848
 	.uleb128 0x1c
-	.4byte	.LASF695
+	.4byte	.LASF696
 	.byte	0x48
 	.2byte	0x403
-	.4byte	0x4830
+	.4byte	0x4845
 	.2byte	0x850
 	.uleb128 0x1c
-	.4byte	.LASF696
+	.4byte	.LASF697
 	.byte	0x48
 	.2byte	0x407
-	.4byte	0x483b
+	.4byte	0x4850
 	.2byte	0x858
 	.uleb128 0x1c
-	.4byte	.LASF697
+	.4byte	.LASF698
 	.byte	0x48
 	.2byte	0x40b
-	.4byte	0x4846
+	.4byte	0x485b
 	.2byte	0x860
 	.uleb128 0x1c
-	.4byte	.LASF698
+	.4byte	.LASF699
 	.byte	0x48
 	.2byte	0x40d
-	.4byte	0x4851
+	.4byte	0x4866
 	.2byte	0x868
 	.uleb128 0x1c
-	.4byte	.LASF699
+	.4byte	.LASF700
 	.byte	0x48
 	.2byte	0x40f
-	.4byte	0x48e8
+	.4byte	0x48fd
 	.2byte	0x870
 	.uleb128 0x1c
-	.4byte	.LASF700
+	.4byte	.LASF701
 	.byte	0x48
 	.2byte	0x412
 	.4byte	0x29
 	.2byte	0x878
 	.uleb128 0x1c
-	.4byte	.LASF701
+	.4byte	.LASF702
 	.byte	0x48
 	.2byte	0x413
-	.4byte	0x48ee
+	.4byte	0x4903
 	.2byte	0x880
 	.uleb128 0x1c
-	.4byte	.LASF702
+	.4byte	.LASF703
 	.byte	0x48
 	.2byte	0x415
-	.4byte	0x3e62
+	.4byte	0x3e77
 	.2byte	0x888
 	.uleb128 0x1c
-	.4byte	.LASF703
+	.4byte	.LASF704
 	.byte	0x48
 	.2byte	0x418
 	.4byte	0x6d
 	.2byte	0x8c8
 	.uleb128 0x1c
-	.4byte	.LASF704
+	.4byte	.LASF705
 	.byte	0x48
 	.2byte	0x41c
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x8d0
 	.uleb128 0x1c
-	.4byte	.LASF705
+	.4byte	.LASF706
 	.byte	0x48
 	.2byte	0x41e
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x8d8
 	.uleb128 0x1c
-	.4byte	.LASF706
+	.4byte	.LASF707
 	.byte	0x48
 	.2byte	0x420
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x8e0
 	.uleb128 0x1c
-	.4byte	.LASF707
+	.4byte	.LASF708
 	.byte	0x48
 	.2byte	0x424
-	.4byte	0x3889
+	.4byte	0x389e
 	.2byte	0x8e8
 	.uleb128 0x1c
-	.4byte	.LASF708
+	.4byte	.LASF709
 	.byte	0x48
 	.2byte	0x426
-	.4byte	0x16e7
+	.4byte	0x16fc
 	.2byte	0x8f0
 	.uleb128 0x1c
-	.4byte	.LASF709
+	.4byte	.LASF710
 	.byte	0x48
 	.2byte	0x427
 	.4byte	0xc6
 	.2byte	0x8f4
 	.uleb128 0x1c
-	.4byte	.LASF710
+	.4byte	.LASF711
 	.byte	0x48
 	.2byte	0x428
 	.4byte	0xc6
 	.2byte	0x8f8
 	.uleb128 0x1c
-	.4byte	.LASF711
+	.4byte	.LASF712
 	.byte	0x48
 	.2byte	0x42c
-	.4byte	0x48f9
+	.4byte	0x490e
 	.2byte	0x900
 	.uleb128 0x1c
-	.4byte	.LASF712
+	.4byte	.LASF713
 	.byte	0x48
 	.2byte	0x42e
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x908
 	.uleb128 0x1c
-	.4byte	.LASF713
+	.4byte	.LASF714
 	.byte	0x48
 	.2byte	0x435
-	.4byte	0x4904
+	.4byte	0x4919
 	.2byte	0x918
 	.uleb128 0x1c
-	.4byte	.LASF714
+	.4byte	.LASF715
 	.byte	0x48
 	.2byte	0x437
-	.4byte	0x490f
+	.4byte	0x4924
 	.2byte	0x920
 	.uleb128 0x1c
-	.4byte	.LASF715
+	.4byte	.LASF716
 	.byte	0x48
 	.2byte	0x439
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x928
 	.uleb128 0x1c
-	.4byte	.LASF716
+	.4byte	.LASF717
 	.byte	0x48
 	.2byte	0x43a
-	.4byte	0x491a
+	.4byte	0x492f
 	.2byte	0x938
 	.uleb128 0x1c
-	.4byte	.LASF717
+	.4byte	.LASF718
 	.byte	0x48
 	.2byte	0x43d
-	.4byte	0x4920
+	.4byte	0x4935
 	.2byte	0x940
 	.uleb128 0x1c
-	.4byte	.LASF718
+	.4byte	.LASF719
 	.byte	0x48
 	.2byte	0x43e
-	.4byte	0x2455
+	.4byte	0x246a
 	.2byte	0x950
 	.uleb128 0x1c
-	.4byte	.LASF719
+	.4byte	.LASF720
 	.byte	0x48
 	.2byte	0x43f
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x970
 	.uleb128 0x1c
-	.4byte	.LASF720
+	.4byte	.LASF721
 	.byte	0x48
 	.2byte	0x47d
-	.4byte	0x493b
+	.4byte	0x4950
 	.2byte	0x980
 	.uleb128 0x1c
-	.4byte	.LASF721
+	.4byte	.LASF722
 	.byte	0x48
 	.2byte	0x47e
-	.4byte	0x13a
+	.4byte	0x13f
 	.2byte	0x988
 	.uleb128 0x1c
-	.4byte	.LASF722
+	.4byte	.LASF723
 	.byte	0x48
 	.2byte	0x47f
-	.4byte	0x13a
+	.4byte	0x13f
 	.2byte	0x98c
 	.uleb128 0x1c
-	.4byte	.LASF723
+	.4byte	.LASF724
 	.byte	0x48
 	.2byte	0x484
 	.4byte	0x29
 	.2byte	0x990
 	.uleb128 0x1c
-	.4byte	.LASF724
+	.4byte	.LASF725
 	.byte	0x48
 	.2byte	0x487
-	.4byte	0x3e5a
+	.4byte	0x3e6f
 	.2byte	0x998
 	.uleb128 0x30
 	.string	"rcu"
 	.byte	0x48
 	.2byte	0x489
-	.4byte	0x407
+	.4byte	0x41c
 	.2byte	0x998
 	.uleb128 0x1c
-	.4byte	.LASF725
+	.4byte	.LASF726
 	.byte	0x48
 	.2byte	0x48c
-	.4byte	0x4946
+	.4byte	0x495b
 	.2byte	0x9a8
 	.uleb128 0x1c
-	.4byte	.LASF726
+	.4byte	.LASF727
 	.byte	0x48
 	.2byte	0x48e
-	.4byte	0x3e29
+	.4byte	0x3e3e
 	.2byte	0x9b0
 	.uleb128 0x1c
-	.4byte	.LASF727
+	.4byte	.LASF728
 	.byte	0x48
 	.2byte	0x491
-	.4byte	0x4951
+	.4byte	0x4966
 	.2byte	0x9c0
 	.uleb128 0x1c
-	.4byte	.LASF728
+	.4byte	.LASF729
 	.byte	0x48
 	.2byte	0x49c
 	.4byte	0xc6
 	.2byte	0x9c8
 	.uleb128 0x1c
-	.4byte	.LASF729
+	.4byte	.LASF730
 	.byte	0x48
 	.2byte	0x49d
 	.4byte	0xc6
 	.2byte	0x9cc
 	.uleb128 0x1c
-	.4byte	.LASF730
+	.4byte	.LASF731
 	.byte	0x48
 	.2byte	0x49f
 	.4byte	0x29
 	.2byte	0x9d0
 	.uleb128 0x1c
-	.4byte	.LASF731
+	.4byte	.LASF732
 	.byte	0x48
 	.2byte	0x4a9
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x9d8
 	.uleb128 0x1c
-	.4byte	.LASF732
+	.4byte	.LASF733
 	.byte	0x48
 	.2byte	0x4aa
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x9e0
 	.uleb128 0x1c
-	.4byte	.LASF733
+	.4byte	.LASF734
 	.byte	0x48
 	.2byte	0x4c7
 	.4byte	0x29
 	.2byte	0x9e8
 	.uleb128 0x1c
-	.4byte	.LASF734
+	.4byte	.LASF735
 	.byte	0x48
 	.2byte	0x4ca
 	.4byte	0x29
 	.2byte	0x9f0
 	.uleb128 0x1c
-	.4byte	.LASF735
+	.4byte	.LASF736
 	.byte	0x48
 	.2byte	0x4e4
-	.4byte	0x495c
+	.4byte	0x4971
 	.2byte	0x9f8
 	.uleb128 0x1c
-	.4byte	.LASF736
+	.4byte	.LASF737
 	.byte	0x48
 	.2byte	0x4e5
-	.4byte	0x31b
+	.4byte	0x330
 	.2byte	0xa00
 	.uleb128 0x1c
-	.4byte	.LASF737
+	.4byte	.LASF738
 	.byte	0x48
 	.2byte	0x4e6
 	.4byte	0xc6
 	.2byte	0xa04
 	.uleb128 0x1c
-	.4byte	.LASF738
+	.4byte	.LASF739
 	.byte	0x48
 	.2byte	0x4e9
 	.4byte	0x6d
 	.2byte	0xa08
 	.uleb128 0x1c
-	.4byte	.LASF739
+	.4byte	.LASF740
 	.byte	0x48
 	.2byte	0x4ec
-	.4byte	0x495c
+	.4byte	0x4971
 	.2byte	0xa10
 	.uleb128 0x1c
-	.4byte	.LASF740
+	.4byte	.LASF741
 	.byte	0x48
 	.2byte	0x4f0
-	.4byte	0x4967
+	.4byte	0x497c
 	.2byte	0xa18
 	.uleb128 0x1c
-	.4byte	.LASF741
+	.4byte	.LASF742
 	.byte	0x48
 	.2byte	0x4f4
-	.4byte	0x49bc
+	.4byte	0x49d1
 	.2byte	0xa20
 	.uleb128 0x1c
-	.4byte	.LASF742
+	.4byte	.LASF743
 	.byte	0x48
 	.2byte	0x4fd
 	.4byte	0xc6
 	.2byte	0xa28
 	.uleb128 0x1c
-	.4byte	.LASF743
+	.4byte	.LASF744
 	.byte	0x48
 	.2byte	0x4ff
-	.4byte	0x2ef0
+	.4byte	0x2f05
 	.2byte	0xa30
 	.uleb128 0x1c
-	.4byte	.LASF744
+	.4byte	.LASF745
 	.byte	0x48
 	.2byte	0x502
-	.4byte	0x4a2f
+	.4byte	0x4a44
 	.2byte	0xa38
 	.uleb128 0x1c
-	.4byte	.LASF745
+	.4byte	.LASF746
 	.byte	0x48
 	.2byte	0x506
-	.4byte	0x367
+	.4byte	0x37c
 	.2byte	0xa40
 	.uleb128 0x1c
-	.4byte	.LASF746
+	.4byte	.LASF747
 	.byte	0x48
 	.2byte	0x50d
-	.4byte	0x443
+	.4byte	0x458
 	.2byte	0xa48
 	.uleb128 0x2f
-	.4byte	0x456c
+	.4byte	0x4581
 	.2byte	0xa50
 	.uleb128 0x2f
-	.4byte	0x45b2
+	.4byte	0x45c7
 	.2byte	0xa58
 	.uleb128 0x1c
-	.4byte	.LASF747
+	.4byte	.LASF748
 	.byte	0x48
 	.2byte	0x521
-	.4byte	0x2455
+	.4byte	0x246a
 	.2byte	0xa60
 	.uleb128 0x1c
-	.4byte	.LASF748
+	.4byte	.LASF749
 	.byte	0x48
 	.2byte	0x524
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0xa80
 	.uleb128 0x1c
-	.4byte	.LASF749
+	.4byte	.LASF750
 	.byte	0x48
 	.2byte	0x525
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0xa88
 	.uleb128 0x1c
-	.4byte	.LASF750
+	.4byte	.LASF751
 	.byte	0x48
 	.2byte	0x52e
-	.4byte	0x1466
+	.4byte	0x147b
 	.2byte	0xa90
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2492
+	.4byte	0x24a7
 	.uleb128 0x19
-	.4byte	.LASF751
+	.4byte	.LASF752
 	.byte	0x49
 	.byte	0xa
-	.4byte	0x9ed
+	.4byte	0xa02
 	.uleb128 0xd
-	.4byte	.LASF752
+	.4byte	.LASF753
 	.byte	0x8
 	.byte	0x4a
 	.byte	0x46
-	.4byte	0x2f1a
+	.4byte	0x2f2f
 	.uleb128 0xe
-	.4byte	.LASF63
+	.4byte	.LASF64
 	.byte	0x4a
 	.byte	0x47
-	.4byte	0x2f1a
+	.4byte	0x2f2f
 	.byte	0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2f01
+	.4byte	0x2f16
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2f26
+	.4byte	0x2f3b
 	.uleb128 0x10
-	.4byte	0x2f31
+	.4byte	0x2f46
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF753
+	.4byte	.LASF754
 	.byte	0x4b
 	.byte	0x1e
 	.4byte	0x6d
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0x2f4c
+	.4byte	0x2f61
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x7
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF754
+	.4byte	.LASF755
 	.byte	0x4c
 	.byte	0x13
-	.4byte	0x2f3c
+	.4byte	0x2f51
 	.uleb128 0x19
-	.4byte	.LASF755
+	.4byte	.LASF756
 	.byte	0x4d
 	.byte	0x26
 	.4byte	0xc6
 	.uleb128 0x10
-	.4byte	0x2f72
+	.4byte	0x2f87
 	.uleb128 0x11
-	.4byte	0x2f72
+	.4byte	0x2f87
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x15ce
+	.4byte	0x15e3
 	.uleb128 0x19
-	.4byte	.LASF756
+	.4byte	.LASF757
 	.byte	0x4d
 	.byte	0x48
-	.4byte	0x2f83
+	.4byte	0x2f98
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2f62
+	.4byte	0x2f77
 	.uleb128 0xd
-	.4byte	.LASF757
+	.4byte	.LASF758
 	.byte	0x18
 	.byte	0x4d
 	.byte	0x5b
-	.4byte	0x2fba
+	.4byte	0x2fcf
 	.uleb128 0xe
-	.4byte	.LASF578
+	.4byte	.LASF579
 	.byte	0x4d
 	.byte	0x5c
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF758
+	.4byte	.LASF759
 	.byte	0x4d
 	.byte	0x5d
-	.4byte	0x2ef0
+	.4byte	0x2f05
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF759
+	.4byte	.LASF760
 	.byte	0x4d
 	.byte	0x5e
-	.4byte	0x194
+	.4byte	0x199
 	.byte	0x10
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF757
+	.4byte	.LASF758
 	.byte	0x4d
 	.byte	0x61
-	.4byte	0x2f89
+	.4byte	0x2f9e
 	.uleb128 0x19
-	.4byte	.LASF760
+	.4byte	.LASF761
 	.byte	0x4d
 	.byte	0x62
-	.4byte	0x194
+	.4byte	0x199
 	.uleb128 0x19
-	.4byte	.LASF761
+	.4byte	.LASF762
 	.byte	0x4b
 	.byte	0x7c
 	.4byte	0x6d
 	.uleb128 0x19
-	.4byte	.LASF762
+	.4byte	.LASF763
 	.byte	0x4b
 	.byte	0x80
 	.4byte	0xc6
 	.uleb128 0x16
-	.4byte	0x155
+	.4byte	0x15a
 	.uleb128 0x19
-	.4byte	.LASF763
+	.4byte	.LASF764
 	.byte	0x4e
 	.byte	0x60
-	.4byte	0x2ff6
+	.4byte	0x300b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2fe6
+	.4byte	0x2ffb
 	.uleb128 0x19
-	.4byte	.LASF764
+	.4byte	.LASF765
 	.byte	0x4f
 	.byte	0x22
-	.4byte	0xf3d
+	.4byte	0xf52
 	.uleb128 0x1f
-	.4byte	.LASF765
+	.4byte	.LASF766
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x4f
 	.byte	0x29
-	.4byte	0x302a
+	.4byte	0x303f
 	.uleb128 0xc
-	.4byte	.LASF766
+	.4byte	.LASF767
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF767
+	.4byte	.LASF768
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF768
+	.4byte	.LASF769
 	.byte	0x2
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF769
+	.4byte	.LASF770
 	.byte	0x48
 	.byte	0x4f
 	.byte	0x31
-	.4byte	0x30a2
+	.4byte	0x30b7
 	.uleb128 0xe
-	.4byte	.LASF770
+	.4byte	.LASF771
 	.byte	0x4f
 	.byte	0x32
-	.4byte	0x3007
+	.4byte	0x301c
 	.byte	0
 	.uleb128 0x20
 	.string	"id"
 	.byte	0x4f
 	.byte	0x33
-	.4byte	0x30a7
+	.4byte	0x30bc
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF771
+	.4byte	.LASF772
 	.byte	0x4f
 	.byte	0x34
 	.4byte	0x56
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF772
+	.4byte	.LASF773
 	.byte	0x4f
 	.byte	0x35
-	.4byte	0x30b3
+	.4byte	0x30c8
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF773
+	.4byte	.LASF774
 	.byte	0x4f
 	.byte	0x36
-	.4byte	0x30b3
+	.4byte	0x30c8
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF774
+	.4byte	.LASF775
 	.byte	0x4f
 	.byte	0x37
-	.4byte	0x2ff6
+	.4byte	0x300b
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF775
+	.4byte	.LASF776
 	.byte	0x4f
 	.byte	0x38
-	.4byte	0x2ff6
+	.4byte	0x300b
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF776
+	.4byte	.LASF777
 	.byte	0x4f
 	.byte	0x39
-	.4byte	0x30d8
+	.4byte	0x30ed
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF777
+	.4byte	.LASF778
 	.byte	0x4f
 	.byte	0x3a
-	.4byte	0x30d8
+	.4byte	0x30ed
 	.byte	0x40
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x302a
+	.4byte	0x303f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x30ad
+	.4byte	0x30c2
 	.uleb128 0x34
 	.uleb128 0x16
-	.4byte	0x13a
+	.4byte	0x13f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x30ae
+	.4byte	0x30c3
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x30cd
+	.4byte	0x30e2
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
-	.4byte	0x30cd
+	.4byte	0x30e2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x30d3
+	.4byte	0x30e8
 	.uleb128 0x24
-	.4byte	.LASF778
+	.4byte	.LASF779
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x30b9
+	.4byte	0x30ce
 	.uleb128 0x19
-	.4byte	.LASF779
+	.4byte	.LASF780
 	.byte	0x4f
 	.byte	0x3d
-	.4byte	0x30e9
+	.4byte	0x30fe
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x30a2
+	.4byte	0x30b7
 	.uleb128 0x19
-	.4byte	.LASF780
+	.4byte	.LASF781
 	.byte	0x50
 	.byte	0x8b
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF781
+	.4byte	.LASF782
 	.byte	0x50
 	.byte	0x8c
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF782
+	.4byte	.LASF783
 	.byte	0x51
 	.byte	0x4e
-	.4byte	0x155
+	.4byte	0x15a
 	.uleb128 0x19
-	.4byte	.LASF783
+	.4byte	.LASF784
 	.byte	0x51
 	.byte	0x4f
 	.4byte	0x35
 	.uleb128 0x19
-	.4byte	.LASF784
+	.4byte	.LASF785
 	.byte	0x51
 	.byte	0xbc
 	.4byte	0x29
 	.uleb128 0x8
-	.4byte	.LASF785
+	.4byte	.LASF786
 	.byte	0x52
 	.byte	0x1c
-	.4byte	0x14a
+	.4byte	0x14f
 	.uleb128 0x19
-	.4byte	.LASF786
+	.4byte	.LASF787
 	.byte	0x53
 	.byte	0xa
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF787
+	.4byte	.LASF788
 	.byte	0x53
 	.2byte	0x11e
 	.4byte	0xc6
 	.uleb128 0x14
-	.4byte	0x443
-	.4byte	0x3157
+	.4byte	0x458
+	.4byte	0x316c
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3148
+	.4byte	0x315d
 	.uleb128 0xd
-	.4byte	.LASF788
+	.4byte	.LASF789
 	.byte	0x38
 	.byte	0x54
 	.byte	0xc
-	.4byte	0x31b2
+	.4byte	0x31c7
 	.uleb128 0xe
-	.4byte	.LASF360
+	.4byte	.LASF361
 	.byte	0x54
 	.byte	0x11
-	.4byte	0x3d6
+	.4byte	0x3eb
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF193
+	.4byte	.LASF194
 	.byte	0x54
 	.byte	0x12
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF789
+	.4byte	.LASF790
 	.byte	0x54
 	.byte	0x13
-	.4byte	0x31c3
+	.4byte	0x31d8
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x54
 	.byte	0x14
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x54
 	.byte	0x1a
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x54
 	.byte	0x1b
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x30
 	.byte	0
 	.uleb128 0x10
-	.4byte	0x31bd
+	.4byte	0x31d2
 	.uleb128 0x11
-	.4byte	0x31bd
+	.4byte	0x31d2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x315d
+	.4byte	0x3172
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x31b2
+	.4byte	0x31c7
 	.uleb128 0x19
-	.4byte	.LASF790
+	.4byte	.LASF791
 	.byte	0x54
 	.byte	0xc3
 	.4byte	0x6d
 	.uleb128 0x8
-	.4byte	.LASF791
+	.4byte	.LASF792
 	.byte	0xd
 	.byte	0x16
-	.4byte	0x31df
+	.4byte	0x31f4
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x31e5
+	.4byte	0x31fa
 	.uleb128 0x10
-	.4byte	0x31f0
+	.4byte	0x3205
 	.uleb128 0x11
-	.4byte	0x31f0
+	.4byte	0x3205
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x31f6
+	.4byte	0x320b
 	.uleb128 0xd
-	.4byte	.LASF792
+	.4byte	.LASF793
 	.byte	0x30
 	.byte	0xd
 	.byte	0x67
-	.4byte	0x323f
+	.4byte	0x3254
 	.uleb128 0xe
-	.4byte	.LASF793
+	.4byte	.LASF794
 	.byte	0xd
 	.byte	0x68
-	.4byte	0x543
+	.4byte	0x558
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF360
+	.4byte	.LASF361
 	.byte	0xd
 	.byte	0x69
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF70
+	.4byte	.LASF71
 	.byte	0xd
 	.byte	0x6a
-	.4byte	0x31d4
+	.4byte	0x31e9
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0xd
 	.byte	0x6e
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0xd
 	.byte	0x6f
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x28
 	.byte	0
 	.uleb128 0xb
 	.byte	0x8
-	.4byte	0x194
+	.4byte	0x199
 	.byte	0xd
 	.byte	0x1f
-	.4byte	0x3305
-	.uleb128 0xc
-	.4byte	.LASF794
-	.byte	0
+	.4byte	0x331a
 	.uleb128 0xc
 	.4byte	.LASF795
-	.byte	0x1
+	.byte	0
 	.uleb128 0xc
 	.4byte	.LASF796
-	.byte	0x2
+	.byte	0x1
 	.uleb128 0xc
 	.4byte	.LASF797
-	.byte	0x3
+	.byte	0x2
 	.uleb128 0xc
 	.4byte	.LASF798
-	.byte	0x4
+	.byte	0x3
 	.uleb128 0xc
 	.4byte	.LASF799
 	.byte	0x4
 	.uleb128 0xc
 	.4byte	.LASF800
-	.byte	0x1
+	.byte	0x4
 	.uleb128 0xc
 	.4byte	.LASF801
-	.byte	0x2
+	.byte	0x1
 	.uleb128 0xc
 	.4byte	.LASF802
-	.byte	0x4
+	.byte	0x2
 	.uleb128 0xc
 	.4byte	.LASF803
-	.byte	0x8
+	.byte	0x4
 	.uleb128 0xc
 	.4byte	.LASF804
-	.byte	0
+	.byte	0x8
 	.uleb128 0xc
 	.4byte	.LASF805
-	.byte	0xf
+	.byte	0
 	.uleb128 0xc
 	.4byte	.LASF806
 	.byte	0xf
 	.uleb128 0xc
 	.4byte	.LASF807
-	.byte	0x8
+	.byte	0xf
 	.uleb128 0xc
 	.4byte	.LASF808
 	.byte	0x8
 	.uleb128 0xc
 	.4byte	.LASF809
-	.byte	0x4
+	.byte	0x8
 	.uleb128 0xc
 	.4byte	.LASF810
 	.byte	0x4
 	.uleb128 0xc
 	.4byte	.LASF811
-	.byte	0x10
+	.byte	0x4
 	.uleb128 0xc
 	.4byte	.LASF812
-	.byte	0x1
+	.byte	0x10
 	.uleb128 0xc
 	.4byte	.LASF813
-	.byte	0x5
+	.byte	0x1
 	.uleb128 0xc
 	.4byte	.LASF814
-	.byte	0x3b
+	.byte	0x5
 	.uleb128 0xc
 	.4byte	.LASF815
+	.byte	0x3b
+	.uleb128 0xc
+	.4byte	.LASF816
 	.byte	0x1f
 	.uleb128 0x35
-	.4byte	.LASF816
+	.4byte	.LASF817
 	.4byte	0x7fffffff
 	.uleb128 0xc
-	.4byte	.LASF817
+	.4byte	.LASF818
 	.byte	0xff
 	.uleb128 0x36
-	.4byte	.LASF818
+	.4byte	.LASF819
 	.sleb128 -256
 	.uleb128 0x37
-	.4byte	.LASF819
+	.4byte	.LASF820
 	.8byte	0xfffffffe0
 	.uleb128 0xc
-	.4byte	.LASF820
+	.4byte	.LASF821
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF821
+	.4byte	.LASF822
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF822
+	.4byte	.LASF823
 	.byte	0x18
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF823
+	.4byte	.LASF824
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3305
+	.4byte	0x331a
 	.uleb128 0x15
-	.4byte	.LASF824
+	.4byte	.LASF825
 	.byte	0xd
 	.2byte	0x187
-	.4byte	0x330a
+	.4byte	0x331f
 	.uleb128 0x15
-	.4byte	.LASF825
+	.4byte	.LASF826
 	.byte	0xd
 	.2byte	0x188
-	.4byte	0x330a
+	.4byte	0x331f
 	.uleb128 0x15
-	.4byte	.LASF826
+	.4byte	.LASF827
 	.byte	0xd
 	.2byte	0x189
-	.4byte	0x330a
+	.4byte	0x331f
 	.uleb128 0x15
-	.4byte	.LASF827
+	.4byte	.LASF828
 	.byte	0xd
 	.2byte	0x18a
-	.4byte	0x330a
+	.4byte	0x331f
 	.uleb128 0x15
-	.4byte	.LASF828
+	.4byte	.LASF829
 	.byte	0xd
 	.2byte	0x18b
-	.4byte	0x330a
+	.4byte	0x331f
 	.uleb128 0x15
-	.4byte	.LASF829
+	.4byte	.LASF830
 	.byte	0xd
 	.2byte	0x18c
-	.4byte	0x330a
+	.4byte	0x331f
 	.uleb128 0x15
-	.4byte	.LASF830
+	.4byte	.LASF831
 	.byte	0xd
 	.2byte	0x18d
-	.4byte	0x330a
+	.4byte	0x331f
 	.uleb128 0xd
-	.4byte	.LASF831
+	.4byte	.LASF832
 	.byte	0x4
 	.byte	0x56
 	.byte	0x13
-	.4byte	0x337d
+	.4byte	0x3392
 	.uleb128 0xe
-	.4byte	.LASF832
+	.4byte	.LASF833
 	.byte	0x56
 	.byte	0x14
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF833
+	.4byte	.LASF834
 	.byte	0x56
 	.byte	0x15
-	.4byte	0x3364
+	.4byte	0x3379
 	.uleb128 0x8
-	.4byte	.LASF834
+	.4byte	.LASF835
 	.byte	0x57
 	.byte	0x19
-	.4byte	0x155
+	.4byte	0x15a
 	.uleb128 0x8
-	.4byte	.LASF835
+	.4byte	.LASF836
 	.byte	0x57
 	.byte	0x1a
-	.4byte	0x155
+	.4byte	0x15a
 	.uleb128 0x8
-	.4byte	.LASF836
+	.4byte	.LASF837
 	.byte	0x57
 	.byte	0x1c
-	.4byte	0x155
+	.4byte	0x15a
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x57
 	.byte	0x21
-	.4byte	0x33be
+	.4byte	0x33d3
 	.uleb128 0x20
 	.string	"pte"
 	.byte	0x57
 	.byte	0x21
-	.4byte	0x3388
+	.4byte	0x339d
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF837
+	.4byte	.LASF838
 	.byte	0x57
 	.byte	0x21
-	.4byte	0x33a9
+	.4byte	0x33be
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x57
 	.byte	0x26
-	.4byte	0x33de
+	.4byte	0x33f3
 	.uleb128 0x20
 	.string	"pmd"
 	.byte	0x57
 	.byte	0x26
-	.4byte	0x3393
+	.4byte	0x33a8
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF838
+	.4byte	.LASF839
 	.byte	0x57
 	.byte	0x26
-	.4byte	0x33c9
+	.4byte	0x33de
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x57
 	.byte	0x31
-	.4byte	0x33fe
+	.4byte	0x3413
 	.uleb128 0x20
 	.string	"pgd"
 	.byte	0x57
 	.byte	0x31
-	.4byte	0x339e
+	.4byte	0x33b3
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF839
+	.4byte	.LASF840
 	.byte	0x57
 	.byte	0x31
-	.4byte	0x33e9
+	.4byte	0x33fe
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x57
 	.byte	0x35
-	.4byte	0x341e
+	.4byte	0x3433
 	.uleb128 0xe
-	.4byte	.LASF840
+	.4byte	.LASF841
 	.byte	0x57
 	.byte	0x35
-	.4byte	0x3388
+	.4byte	0x339d
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF841
+	.4byte	.LASF842
 	.byte	0x57
 	.byte	0x35
-	.4byte	0x3409
+	.4byte	0x341e
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x58
 	.byte	0xf
-	.4byte	0x343e
+	.4byte	0x3453
 	.uleb128 0x20
 	.string	"pgd"
 	.byte	0x58
 	.byte	0xf
-	.4byte	0x33fe
+	.4byte	0x3413
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF842
+	.4byte	.LASF843
 	.byte	0x58
 	.byte	0xf
-	.4byte	0x3429
+	.4byte	0x343e
 	.uleb128 0x8
-	.4byte	.LASF843
+	.4byte	.LASF844
 	.byte	0x59
 	.byte	0x2a
-	.4byte	0x3454
+	.4byte	0x3469
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x345a
+	.4byte	0x346f
 	.uleb128 0xd
-	.4byte	.LASF844
+	.4byte	.LASF845
 	.byte	0x40
 	.byte	0x5a
 	.byte	0x47
-	.4byte	0x3497
+	.4byte	0x34ac
 	.uleb128 0xe
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x5a
 	.byte	0x48
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x23
-	.4byte	0x53bb
+	.4byte	0x53d0
 	.byte	0x8
 	.uleb128 0x23
-	.4byte	0x53ed
+	.4byte	0x5402
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF845
+	.4byte	.LASF846
 	.byte	0x5a
 	.byte	0xb8
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0x34
 	.uleb128 0xe
-	.4byte	.LASF846
+	.4byte	.LASF847
 	.byte	0x5a
 	.byte	0xbb
-	.4byte	0x495c
+	.4byte	0x4971
 	.byte	0x38
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x345a
+	.4byte	0x346f
 	.uleb128 0xd
-	.4byte	.LASF847
+	.4byte	.LASF848
 	.byte	0x28
 	.byte	0x5b
 	.byte	0x55
-	.4byte	0x34cd
+	.4byte	0x34e2
 	.uleb128 0xe
-	.4byte	.LASF589
+	.4byte	.LASF590
 	.byte	0x5b
 	.byte	0x56
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF848
+	.4byte	.LASF849
 	.byte	0x5b
 	.byte	0x57
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF849
+	.4byte	.LASF850
 	.byte	0x5b
 	.byte	0x58
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF850
+	.4byte	.LASF851
 	.byte	0x18
 	.byte	0x5c
 	.byte	0x24
-	.4byte	0x34fe
+	.4byte	0x3513
 	.uleb128 0xe
-	.4byte	.LASF851
+	.4byte	.LASF852
 	.byte	0x5c
 	.byte	0x25
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF852
+	.4byte	.LASF853
 	.byte	0x5c
 	.byte	0x26
-	.4byte	0x34fe
+	.4byte	0x3513
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF853
+	.4byte	.LASF854
 	.byte	0x5c
 	.byte	0x27
-	.4byte	0x34fe
+	.4byte	0x3513
 	.byte	0x10
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x34cd
+	.4byte	0x34e2
 	.uleb128 0xd
-	.4byte	.LASF854
+	.4byte	.LASF855
 	.byte	0x8
 	.byte	0x5c
 	.byte	0x2b
-	.4byte	0x351d
+	.4byte	0x3532
 	.uleb128 0xe
-	.4byte	.LASF850
+	.4byte	.LASF851
 	.byte	0x5c
 	.byte	0x2c
-	.4byte	0x34fe
+	.4byte	0x3513
 	.byte	0
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF855
+	.4byte	.LASF856
 	.byte	0x10
 	.byte	0x5c
 	.byte	0x39
-	.4byte	0x3542
+	.4byte	0x3557
 	.uleb128 0xe
-	.4byte	.LASF854
+	.4byte	.LASF855
 	.byte	0x5c
 	.byte	0x3a
-	.4byte	0x3504
+	.4byte	0x3519
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF856
+	.4byte	.LASF857
 	.byte	0x5c
 	.byte	0x3b
-	.4byte	0x34fe
+	.4byte	0x3513
 	.byte	0x8
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF857
+	.4byte	.LASF858
 	.byte	0x5d
 	.byte	0x47
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x19
-	.4byte	.LASF858
+	.4byte	.LASF859
 	.byte	0x5d
 	.byte	0x48
-	.4byte	0x3558
+	.4byte	0x356d
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x30
@@ -16956,235 +16943,235 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.4byte	0x6d
 	.uleb128 0x1f
-	.4byte	.LASF859
+	.4byte	.LASF860
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x5d
 	.byte	0x5d
-	.4byte	0x358d
+	.4byte	0x35a2
 	.uleb128 0xc
-	.4byte	.LASF860
+	.4byte	.LASF861
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF861
+	.4byte	.LASF862
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF862
+	.4byte	.LASF863
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF863
+	.4byte	.LASF864
 	.byte	0x3
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x5c
-	.4byte	0x359d
+	.4byte	0x35b2
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x358d
+	.4byte	0x35a2
 	.uleb128 0x19
-	.4byte	.LASF864
+	.4byte	.LASF865
 	.byte	0x5d
 	.byte	0x64
-	.4byte	0x359d
+	.4byte	0x35b2
 	.uleb128 0x19
-	.4byte	.LASF865
+	.4byte	.LASF866
 	.byte	0x5d
 	.byte	0x66
-	.4byte	0x3564
+	.4byte	0x3579
 	.uleb128 0xd
-	.4byte	.LASF866
+	.4byte	.LASF867
 	.byte	0x20
 	.byte	0x5e
 	.byte	0x9
-	.4byte	0x35dd
+	.4byte	0x35f2
 	.uleb128 0xe
-	.4byte	.LASF867
+	.4byte	.LASF868
 	.byte	0x5e
 	.byte	0xa
-	.4byte	0x34cd
+	.4byte	0x34e2
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF193
+	.4byte	.LASF194
 	.byte	0x5e
 	.byte	0xb
-	.4byte	0x3126
+	.4byte	0x313b
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF868
+	.4byte	.LASF869
 	.byte	0x10
 	.byte	0x5e
 	.byte	0xe
-	.4byte	0x3602
+	.4byte	0x3617
 	.uleb128 0xe
-	.4byte	.LASF135
+	.4byte	.LASF136
 	.byte	0x5e
 	.byte	0xf
-	.4byte	0x3504
+	.4byte	0x3519
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF63
+	.4byte	.LASF64
 	.byte	0x5e
 	.byte	0x10
-	.4byte	0x3602
+	.4byte	0x3617
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x35b8
+	.4byte	0x35cd
 	.uleb128 0x1f
-	.4byte	.LASF869
+	.4byte	.LASF870
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x54
 	.byte	0xbe
-	.4byte	0x3625
+	.4byte	0x363a
 	.uleb128 0xc
-	.4byte	.LASF870
+	.4byte	.LASF871
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF871
+	.4byte	.LASF872
 	.byte	0x1
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF872
+	.4byte	.LASF873
 	.byte	0x48
 	.byte	0x5f
 	.byte	0x6f
-	.4byte	0x3692
+	.4byte	0x36a7
 	.uleb128 0xe
-	.4byte	.LASF867
+	.4byte	.LASF868
 	.byte	0x5f
 	.byte	0x70
-	.4byte	0x35b8
+	.4byte	0x35cd
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF873
+	.4byte	.LASF874
 	.byte	0x5f
 	.byte	0x71
-	.4byte	0x3126
+	.4byte	0x313b
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF789
+	.4byte	.LASF790
 	.byte	0x5f
 	.byte	0x72
-	.4byte	0x36a7
+	.4byte	0x36bc
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF874
+	.4byte	.LASF875
 	.byte	0x5f
 	.byte	0x73
-	.4byte	0x371a
+	.4byte	0x372f
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF577
+	.4byte	.LASF578
 	.byte	0x5f
 	.byte	0x74
-	.4byte	0x10b
+	.4byte	0x110
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF875
+	.4byte	.LASF876
 	.byte	0x5f
 	.byte	0x75
-	.4byte	0x10b
+	.4byte	0x110
 	.byte	0x39
 	.uleb128 0xe
-	.4byte	.LASF876
+	.4byte	.LASF877
 	.byte	0x5f
 	.byte	0x76
-	.4byte	0x10b
+	.4byte	0x110
 	.byte	0x3a
 	.uleb128 0xe
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x5f
 	.byte	0x78
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x40
 	.byte	0
 	.uleb128 0x14
-	.4byte	0x3608
-	.4byte	0x36a1
+	.4byte	0x361d
+	.4byte	0x36b6
 	.uleb128 0x11
-	.4byte	0x36a1
+	.4byte	0x36b6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3625
+	.4byte	0x363a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3692
+	.4byte	0x36a7
 	.uleb128 0xd
-	.4byte	.LASF877
+	.4byte	.LASF878
 	.byte	0x40
 	.byte	0x5f
 	.byte	0x99
-	.4byte	0x371a
+	.4byte	0x372f
 	.uleb128 0xe
-	.4byte	.LASF878
+	.4byte	.LASF879
 	.byte	0x5f
 	.byte	0x9a
-	.4byte	0x3806
+	.4byte	0x381b
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF879
+	.4byte	.LASF880
 	.byte	0x5f
 	.byte	0x9b
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF191
+	.4byte	.LASF192
 	.byte	0x5f
 	.byte	0x9c
-	.4byte	0x290
+	.4byte	0x2a5
 	.byte	0xc
 	.uleb128 0x20
 	.string	"seq"
 	.byte	0x5f
 	.byte	0x9d
-	.4byte	0x16e7
+	.4byte	0x16fc
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF880
+	.4byte	.LASF881
 	.byte	0x5f
 	.byte	0x9e
-	.4byte	0x36a1
+	.4byte	0x36b6
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF881
+	.4byte	.LASF882
 	.byte	0x5f
 	.byte	0x9f
-	.4byte	0x35dd
+	.4byte	0x35f2
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF882
+	.4byte	.LASF883
 	.byte	0x5f
 	.byte	0xa0
-	.4byte	0x3811
+	.4byte	0x3826
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF883
+	.4byte	.LASF884
 	.byte	0x5f
 	.byte	0xa1
-	.4byte	0x3126
+	.4byte	0x313b
 	.byte	0x38
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x36ad
+	.4byte	0x36c2
 	.uleb128 0x26
-	.4byte	.LASF884
+	.4byte	.LASF885
 	.2byte	0x240
 	.byte	0x5f
 	.byte	0xcc
-	.4byte	0x3806
+	.4byte	0x381b
 	.uleb128 0xe
-	.4byte	.LASF115
+	.4byte	.LASF116
 	.byte	0x5f
 	.byte	0xcd
-	.4byte	0xe1e
+	.4byte	0xe33
 	.byte	0
 	.uleb128 0x20
 	.string	"cpu"
@@ -17193,19 +17180,19 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF885
+	.4byte	.LASF886
 	.byte	0x5f
 	.byte	0xcf
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF886
+	.4byte	.LASF887
 	.byte	0x5f
 	.byte	0xd0
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0x38
-	.4byte	.LASF887
+	.4byte	.LASF888
 	.byte	0x5f
 	.byte	0xd1
 	.4byte	0x6d
@@ -17214,7 +17201,7 @@ __exitcall_ebc_exit:
 	.byte	0x1f
 	.byte	0x10
 	.uleb128 0x38
-	.4byte	.LASF888
+	.4byte	.LASF889
 	.byte	0x5f
 	.byte	0xd2
 	.4byte	0x6d
@@ -17223,7 +17210,7 @@ __exitcall_ebc_exit:
 	.byte	0x1e
 	.byte	0x10
 	.uleb128 0x38
-	.4byte	.LASF889
+	.4byte	.LASF890
 	.byte	0x5f
 	.byte	0xd3
 	.4byte	0x6d
@@ -17232,7 +17219,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.byte	0x10
 	.uleb128 0x38
-	.4byte	.LASF890
+	.4byte	.LASF891
 	.byte	0x5f
 	.byte	0xd4
 	.4byte	0x6d
@@ -17241,227 +17228,227 @@ __exitcall_ebc_exit:
 	.byte	0x1c
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF891
+	.4byte	.LASF892
 	.byte	0x5f
 	.byte	0xd6
 	.4byte	0x6d
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF892
+	.4byte	.LASF893
 	.byte	0x5f
 	.byte	0xd7
 	.4byte	0xb4
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF893
+	.4byte	.LASF894
 	.byte	0x5f
 	.byte	0xd8
 	.4byte	0xb4
 	.byte	0x1a
 	.uleb128 0xe
-	.4byte	.LASF894
+	.4byte	.LASF895
 	.byte	0x5f
 	.byte	0xd9
 	.4byte	0x6d
 	.byte	0x1c
 	.uleb128 0xe
-	.4byte	.LASF895
+	.4byte	.LASF896
 	.byte	0x5f
 	.byte	0xdb
-	.4byte	0x3126
+	.4byte	0x313b
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF896
+	.4byte	.LASF897
 	.byte	0x5f
 	.byte	0xdc
-	.4byte	0x36a1
+	.4byte	0x36b6
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF897
+	.4byte	.LASF898
 	.byte	0x5f
 	.byte	0xdd
-	.4byte	0x3126
+	.4byte	0x313b
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF898
+	.4byte	.LASF899
 	.byte	0x5f
 	.byte	0xde
-	.4byte	0x36a1
+	.4byte	0x36b6
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF899
+	.4byte	.LASF900
 	.byte	0x5f
 	.byte	0xdf
-	.4byte	0x3817
+	.4byte	0x382c
 	.byte	0x40
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3720
+	.4byte	0x3735
 	.uleb128 0x16
-	.4byte	0x3126
+	.4byte	0x313b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x380c
+	.4byte	0x3821
 	.uleb128 0x5
-	.4byte	0x36ad
-	.4byte	0x3827
+	.4byte	0x36c2
+	.4byte	0x383c
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x7
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF900
+	.4byte	.LASF901
 	.byte	0x5f
 	.2byte	0x135
 	.4byte	0x6d
 	.uleb128 0x24
-	.4byte	.LASF901
-	.uleb128 0x15
 	.4byte	.LASF902
+	.uleb128 0x15
+	.4byte	.LASF903
 	.byte	0x5f
 	.2byte	0x15c
-	.4byte	0x3833
+	.4byte	0x3848
 	.uleb128 0xd
-	.4byte	.LASF685
+	.4byte	.LASF686
 	.byte	0x10
 	.byte	0x60
 	.byte	0x1c
-	.4byte	0x3869
+	.4byte	0x387e
 	.uleb128 0xe
-	.4byte	.LASF903
+	.4byte	.LASF904
 	.byte	0x60
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF904
+	.4byte	.LASF905
 	.byte	0x60
 	.byte	0x1e
-	.4byte	0x386e
+	.4byte	0x3883
 	.byte	0x8
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF905
+	.4byte	.LASF906
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3869
+	.4byte	0x387e
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x61
 	.byte	0x62
-	.4byte	0x3889
+	.4byte	0x389e
 	.uleb128 0xe
-	.4byte	.LASF365
+	.4byte	.LASF366
 	.byte	0x61
 	.byte	0x62
-	.4byte	0x104d
+	.4byte	0x1062
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF906
+	.4byte	.LASF907
 	.byte	0x61
 	.byte	0x62
-	.4byte	0x3874
+	.4byte	0x3889
 	.uleb128 0x19
-	.4byte	.LASF907
+	.4byte	.LASF908
 	.byte	0x61
 	.byte	0x63
-	.4byte	0x3889
+	.4byte	0x389e
 	.uleb128 0x5
-	.4byte	0x3889
-	.4byte	0x38af
+	.4byte	0x389e
+	.4byte	0x38c4
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x4
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF908
+	.4byte	.LASF909
 	.byte	0x61
 	.2byte	0x19a
-	.4byte	0x389f
+	.4byte	0x38b4
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x62
 	.byte	0x5a
-	.4byte	0x38d0
+	.4byte	0x38e5
 	.uleb128 0x20
 	.string	"sig"
 	.byte	0x62
 	.byte	0x5b
-	.4byte	0x104d
+	.4byte	0x1062
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF909
+	.4byte	.LASF910
 	.byte	0x62
 	.byte	0x5c
-	.4byte	0x38bb
+	.4byte	0x38d0
 	.uleb128 0x39
-	.4byte	.LASF1088
+	.4byte	.LASF1089
 	.byte	0x8
 	.byte	0x63
 	.byte	0x8
-	.4byte	0x38fe
+	.4byte	0x3913
 	.uleb128 0x22
-	.4byte	.LASF910
+	.4byte	.LASF911
 	.byte	0x63
 	.byte	0x9
 	.4byte	0xc6
 	.uleb128 0x22
-	.4byte	.LASF911
+	.4byte	.LASF912
 	.byte	0x63
 	.byte	0xa
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF912
+	.4byte	.LASF913
 	.byte	0x63
 	.byte	0xb
-	.4byte	0x38db
+	.4byte	0x38f0
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x63
 	.byte	0x39
-	.4byte	0x392a
+	.4byte	0x393f
 	.uleb128 0xe
-	.4byte	.LASF913
+	.4byte	.LASF914
 	.byte	0x63
 	.byte	0x3a
-	.4byte	0x1ab
+	.4byte	0x1b0
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF914
+	.4byte	.LASF915
 	.byte	0x63
 	.byte	0x3b
-	.4byte	0x1b6
+	.4byte	0x1bb
 	.byte	0x4
 	.byte	0
 	.uleb128 0xf
 	.byte	0x18
 	.byte	0x63
 	.byte	0x3f
-	.4byte	0x3963
+	.4byte	0x3978
 	.uleb128 0xe
-	.4byte	.LASF915
+	.4byte	.LASF916
 	.byte	0x63
 	.byte	0x40
-	.4byte	0x203
+	.4byte	0x208
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF916
+	.4byte	.LASF917
 	.byte	0x63
 	.byte	0x41
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF917
+	.4byte	.LASF918
 	.byte	0x63
 	.byte	0x42
-	.4byte	0x38fe
+	.4byte	0x3913
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF918
+	.4byte	.LASF919
 	.byte	0x63
 	.byte	0x43
 	.4byte	0xc6
@@ -17471,89 +17458,89 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x63
 	.byte	0x47
-	.4byte	0x3990
+	.4byte	0x39a5
 	.uleb128 0xe
-	.4byte	.LASF913
+	.4byte	.LASF914
 	.byte	0x63
 	.byte	0x48
-	.4byte	0x1ab
+	.4byte	0x1b0
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF914
+	.4byte	.LASF915
 	.byte	0x63
 	.byte	0x49
-	.4byte	0x1b6
+	.4byte	0x1bb
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF917
+	.4byte	.LASF918
 	.byte	0x63
 	.byte	0x4a
-	.4byte	0x38fe
+	.4byte	0x3913
 	.byte	0x8
 	.byte	0
 	.uleb128 0xf
 	.byte	0x20
 	.byte	0x63
 	.byte	0x4e
-	.4byte	0x39d5
+	.4byte	0x39ea
 	.uleb128 0xe
-	.4byte	.LASF913
+	.4byte	.LASF914
 	.byte	0x63
 	.byte	0x4f
-	.4byte	0x1ab
+	.4byte	0x1b0
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF914
+	.4byte	.LASF915
 	.byte	0x63
 	.byte	0x50
-	.4byte	0x1b6
+	.4byte	0x1bb
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF919
+	.4byte	.LASF920
 	.byte	0x63
 	.byte	0x51
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF920
+	.4byte	.LASF921
 	.byte	0x63
 	.byte	0x52
-	.4byte	0x1f8
+	.4byte	0x1fd
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF921
+	.4byte	.LASF922
 	.byte	0x63
 	.byte	0x53
-	.4byte	0x1f8
+	.4byte	0x1fd
 	.byte	0x18
 	.byte	0
 	.uleb128 0xf
 	.byte	0x18
 	.byte	0x63
 	.byte	0x6b
-	.4byte	0x3a02
+	.4byte	0x3a17
 	.uleb128 0xe
-	.4byte	.LASF922
+	.4byte	.LASF923
 	.byte	0x63
 	.byte	0x6c
-	.4byte	0x3a02
+	.4byte	0x3a17
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF923
+	.4byte	.LASF924
 	.byte	0x63
 	.byte	0x6d
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF924
+	.4byte	.LASF925
 	.byte	0x63
 	.byte	0x6e
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x10
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x3a12
+	.4byte	0x3a27
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x7
@@ -17562,15 +17549,15 @@ __exitcall_ebc_exit:
 	.byte	0xc
 	.byte	0x63
 	.byte	0x71
-	.4byte	0x3a33
+	.4byte	0x3a48
 	.uleb128 0xe
-	.4byte	.LASF925
+	.4byte	.LASF926
 	.byte	0x63
 	.byte	0x72
-	.4byte	0x3a02
+	.4byte	0x3a17
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF926
+	.4byte	.LASF927
 	.byte	0x63
 	.byte	0x73
 	.4byte	0xd2
@@ -17580,48 +17567,48 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0x63
 	.byte	0x64
-	.4byte	0x3a5d
+	.4byte	0x3a72
 	.uleb128 0x22
-	.4byte	.LASF927
+	.4byte	.LASF928
 	.byte	0x63
 	.byte	0x69
 	.4byte	0xa2
 	.uleb128 0x22
-	.4byte	.LASF928
+	.4byte	.LASF929
 	.byte	0x63
 	.byte	0x6f
-	.4byte	0x39d5
+	.4byte	0x39ea
 	.uleb128 0x22
-	.4byte	.LASF929
+	.4byte	.LASF930
 	.byte	0x63
 	.byte	0x74
-	.4byte	0x3a12
+	.4byte	0x3a27
 	.byte	0
 	.uleb128 0xf
 	.byte	0x20
 	.byte	0x63
 	.byte	0x57
-	.4byte	0x3a78
+	.4byte	0x3a8d
 	.uleb128 0xe
-	.4byte	.LASF930
+	.4byte	.LASF931
 	.byte	0x63
 	.byte	0x58
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0x23
-	.4byte	0x3a33
+	.4byte	0x3a48
 	.byte	0x8
 	.byte	0
 	.uleb128 0xf
 	.byte	0x10
 	.byte	0x63
 	.byte	0x79
-	.4byte	0x3a99
+	.4byte	0x3aae
 	.uleb128 0xe
-	.4byte	.LASF931
+	.4byte	.LASF932
 	.byte	0x63
 	.byte	0x7a
-	.4byte	0x194
+	.4byte	0x199
 	.byte	0
 	.uleb128 0x20
 	.string	"_fd"
@@ -17634,21 +17621,21 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x63
 	.byte	0x7f
-	.4byte	0x3ac6
+	.4byte	0x3adb
 	.uleb128 0xe
-	.4byte	.LASF932
+	.4byte	.LASF933
 	.byte	0x63
 	.byte	0x80
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF933
+	.4byte	.LASF934
 	.byte	0x63
 	.byte	0x81
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF934
+	.4byte	.LASF935
 	.byte	0x63
 	.byte	0x82
 	.4byte	0x6d
@@ -17658,1175 +17645,1175 @@ __exitcall_ebc_exit:
 	.byte	0x70
 	.byte	0x63
 	.byte	0x35
-	.4byte	0x3b27
+	.4byte	0x3b3c
 	.uleb128 0x22
-	.4byte	.LASF935
+	.4byte	.LASF936
 	.byte	0x63
 	.byte	0x36
-	.4byte	0x3b27
+	.4byte	0x3b3c
 	.uleb128 0x22
-	.4byte	.LASF936
+	.4byte	.LASF937
 	.byte	0x63
 	.byte	0x3c
-	.4byte	0x3909
+	.4byte	0x391e
 	.uleb128 0x22
-	.4byte	.LASF937
+	.4byte	.LASF938
 	.byte	0x63
 	.byte	0x44
-	.4byte	0x392a
+	.4byte	0x393f
 	.uleb128 0x28
 	.string	"_rt"
 	.byte	0x63
 	.byte	0x4b
-	.4byte	0x3963
+	.4byte	0x3978
 	.uleb128 0x22
-	.4byte	.LASF938
+	.4byte	.LASF939
 	.byte	0x63
 	.byte	0x54
-	.4byte	0x3990
+	.4byte	0x39a5
 	.uleb128 0x22
-	.4byte	.LASF939
+	.4byte	.LASF940
 	.byte	0x63
 	.byte	0x76
-	.4byte	0x3a5d
+	.4byte	0x3a72
 	.uleb128 0x22
-	.4byte	.LASF940
+	.4byte	.LASF941
 	.byte	0x63
 	.byte	0x7c
-	.4byte	0x3a78
+	.4byte	0x3a8d
 	.uleb128 0x22
-	.4byte	.LASF941
+	.4byte	.LASF942
 	.byte	0x63
 	.byte	0x83
-	.4byte	0x3a99
+	.4byte	0x3aae
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xc6
-	.4byte	0x3b37
+	.4byte	0x3b4c
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1b
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF942
+	.4byte	.LASF943
 	.byte	0x80
 	.byte	0x63
 	.byte	0x2b
-	.4byte	0x3b74
+	.4byte	0x3b89
 	.uleb128 0xe
-	.4byte	.LASF943
+	.4byte	.LASF944
 	.byte	0x63
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF944
+	.4byte	.LASF945
 	.byte	0x63
 	.byte	0x2e
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF945
+	.4byte	.LASF946
 	.byte	0x63
 	.byte	0x2f
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF946
+	.4byte	.LASF947
 	.byte	0x63
 	.byte	0x84
-	.4byte	0x3ac6
+	.4byte	0x3adb
 	.byte	0x10
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF947
+	.4byte	.LASF948
 	.byte	0x63
 	.byte	0x85
-	.4byte	0x3b37
+	.4byte	0x3b4c
 	.uleb128 0xd
-	.4byte	.LASF948
+	.4byte	.LASF949
 	.byte	0x98
 	.byte	0x64
 	.byte	0x10
-	.4byte	0x3c40
+	.4byte	0x3c55
 	.uleb128 0xe
-	.4byte	.LASF949
+	.4byte	.LASF950
 	.byte	0x64
 	.byte	0x11
-	.4byte	0x337d
+	.4byte	0x3392
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF950
+	.4byte	.LASF951
 	.byte	0x64
 	.byte	0x12
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF951
+	.4byte	.LASF952
 	.byte	0x64
 	.byte	0x13
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF952
+	.4byte	.LASF953
 	.byte	0x64
 	.byte	0x18
-	.4byte	0x543
+	.4byte	0x558
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF953
+	.4byte	.LASF954
 	.byte	0x64
 	.byte	0x1e
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF954
+	.4byte	.LASF955
 	.byte	0x64
 	.byte	0x1f
 	.4byte	0x29
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF955
+	.4byte	.LASF956
 	.byte	0x64
 	.byte	0x20
-	.4byte	0x543
+	.4byte	0x558
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF956
+	.4byte	.LASF957
 	.byte	0x64
 	.byte	0x23
-	.4byte	0x8764
+	.4byte	0x8779
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF957
+	.4byte	.LASF958
 	.byte	0x64
 	.byte	0x24
-	.4byte	0x8764
+	.4byte	0x8779
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF958
+	.4byte	.LASF959
 	.byte	0x64
 	.byte	0x28
-	.4byte	0x3d6
+	.4byte	0x3eb
 	.byte	0x40
 	.uleb128 0x20
 	.string	"uid"
 	.byte	0x64
 	.byte	0x29
-	.4byte	0x23fb
+	.4byte	0x2410
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF959
+	.4byte	.LASF960
 	.byte	0x64
 	.byte	0x2d
-	.4byte	0x543
+	.4byte	0x558
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF960
+	.4byte	.LASF961
 	.byte	0x64
 	.byte	0x31
-	.4byte	0x9578
+	.4byte	0x958d
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x64
 	.byte	0x33
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x64
 	.byte	0x34
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x90
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3b7f
+	.4byte	0x3b94
 	.uleb128 0xd
-	.4byte	.LASF951
+	.4byte	.LASF952
 	.byte	0x18
 	.byte	0x65
 	.byte	0x1a
-	.4byte	0x3c6b
+	.4byte	0x3c80
 	.uleb128 0xe
-	.4byte	.LASF961
+	.4byte	.LASF962
 	.byte	0x65
 	.byte	0x1b
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF675
+	.4byte	.LASF676
 	.byte	0x65
 	.byte	0x1c
-	.4byte	0x38d0
+	.4byte	0x38e5
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF616
+	.4byte	.LASF617
 	.byte	0x28
 	.byte	0x66
 	.byte	0x22
-	.4byte	0x3c90
+	.4byte	0x3ca5
 	.uleb128 0xe
-	.4byte	.LASF962
+	.4byte	.LASF963
 	.byte	0x66
 	.byte	0x23
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF963
+	.4byte	.LASF964
 	.byte	0x66
 	.byte	0x24
-	.4byte	0x3c90
+	.4byte	0x3ca5
 	.byte	0x8
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x3ca0
-	.4byte	0x3ca0
+	.4byte	0x3cb5
+	.4byte	0x3cb5
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3ca6
+	.4byte	0x3cbb
 	.uleb128 0x1d
-	.4byte	.LASF964
+	.4byte	.LASF965
 	.byte	0xd8
 	.byte	0x5a
 	.2byte	0x10e
-	.4byte	0x3dcb
+	.4byte	0x3de0
 	.uleb128 0x1b
-	.4byte	.LASF965
+	.4byte	.LASF966
 	.byte	0x5a
 	.2byte	0x111
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF966
+	.4byte	.LASF967
 	.byte	0x5a
 	.2byte	0x112
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF967
+	.4byte	.LASF968
 	.byte	0x5a
 	.2byte	0x116
-	.4byte	0x3ca0
+	.4byte	0x3cb5
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF968
+	.4byte	.LASF969
 	.byte	0x5a
 	.2byte	0x116
-	.4byte	0x3ca0
+	.4byte	0x3cb5
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF969
+	.4byte	.LASF970
 	.byte	0x5a
 	.2byte	0x118
-	.4byte	0x34cd
+	.4byte	0x34e2
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF970
+	.4byte	.LASF971
 	.byte	0x5a
 	.2byte	0x120
 	.4byte	0x29
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF971
+	.4byte	.LASF972
 	.byte	0x5a
 	.2byte	0x124
-	.4byte	0x4622
+	.4byte	0x4637
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF972
+	.4byte	.LASF973
 	.byte	0x5a
 	.2byte	0x125
-	.4byte	0x341e
+	.4byte	0x3433
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF973
+	.4byte	.LASF974
 	.byte	0x5a
 	.2byte	0x126
 	.4byte	0x29
 	.byte	0x50
 	.uleb128 0x23
-	.4byte	0x5579
+	.4byte	0x558e
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF974
+	.4byte	.LASF975
 	.byte	0x5a
 	.2byte	0x13e
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF975
+	.4byte	.LASF976
 	.byte	0x5a
 	.2byte	0x140
-	.4byte	0x55a0
+	.4byte	0x55b5
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF976
+	.4byte	.LASF977
 	.byte	0x5a
 	.2byte	0x143
-	.4byte	0x5696
+	.4byte	0x56ab
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF977
+	.4byte	.LASF978
 	.byte	0x5a
 	.2byte	0x146
 	.4byte	0x29
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF978
+	.4byte	.LASF979
 	.byte	0x5a
 	.2byte	0x148
-	.4byte	0x5547
+	.4byte	0x555c
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF979
+	.4byte	.LASF980
 	.byte	0x5a
 	.2byte	0x149
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF980
+	.4byte	.LASF981
 	.byte	0x5a
 	.2byte	0x14b
-	.4byte	0x543
+	.4byte	0x558
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF981
+	.4byte	.LASF982
 	.byte	0x5a
 	.2byte	0x152
-	.4byte	0x554d
+	.4byte	0x5562
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x5a
 	.2byte	0x154
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x5a
 	.2byte	0x155
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x5a
 	.2byte	0x156
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xc8
 	.uleb128 0x1b
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x5a
 	.2byte	0x157
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xd0
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF982
+	.4byte	.LASF983
 	.byte	0x18
 	.byte	0x66
 	.byte	0x33
-	.4byte	0x3df0
+	.4byte	0x3e05
 	.uleb128 0xe
-	.4byte	.LASF983
+	.4byte	.LASF984
 	.byte	0x66
 	.byte	0x34
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF382
+	.4byte	.LASF383
 	.byte	0x66
 	.byte	0x35
-	.4byte	0x3df0
+	.4byte	0x3e05
 	.byte	0x4
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xc6
-	.4byte	0x3e00
+	.4byte	0x3e15
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x4
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF984
+	.4byte	.LASF985
 	.byte	0x28
 	.byte	0x66
 	.byte	0x39
-	.4byte	0x3e19
+	.4byte	0x3e2e
 	.uleb128 0xe
-	.4byte	.LASF382
+	.4byte	.LASF383
 	.byte	0x66
 	.byte	0x3a
-	.4byte	0x3e19
+	.4byte	0x3e2e
 	.byte	0
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x543
-	.4byte	0x3e29
+	.4byte	0x558
+	.4byte	0x3e3e
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x4
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF985
+	.4byte	.LASF986
 	.byte	0x10
 	.byte	0x66
 	.byte	0x3d
-	.4byte	0x3e5a
+	.4byte	0x3e6f
 	.uleb128 0xe
-	.4byte	.LASF844
+	.4byte	.LASF845
 	.byte	0x66
 	.byte	0x3e
-	.4byte	0x3454
+	.4byte	0x3469
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF883
+	.4byte	.LASF884
 	.byte	0x66
 	.byte	0x40
 	.4byte	0xd2
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF986
+	.4byte	.LASF987
 	.byte	0x66
 	.byte	0x41
 	.4byte	0xd2
 	.byte	0xc
 	.byte	0
 	.uleb128 0x3a
-	.4byte	.LASF988
+	.4byte	.LASF989
 	.byte	0
 	.byte	0x66
 	.byte	0x49
 	.uleb128 0xd
-	.4byte	.LASF989
+	.4byte	.LASF990
 	.byte	0x40
 	.byte	0x67
 	.byte	0xc
-	.4byte	0x3ecf
+	.4byte	0x3ee4
 	.uleb128 0xe
-	.4byte	.LASF990
+	.4byte	.LASF991
 	.byte	0x67
 	.byte	0xf
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF991
+	.4byte	.LASF992
 	.byte	0x67
 	.byte	0x11
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF992
+	.4byte	.LASF993
 	.byte	0x67
 	.byte	0x13
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF993
+	.4byte	.LASF994
 	.byte	0x67
 	.byte	0x15
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF994
+	.4byte	.LASF995
 	.byte	0x67
 	.byte	0x17
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF995
+	.4byte	.LASF996
 	.byte	0x67
 	.byte	0x1f
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF996
+	.4byte	.LASF997
 	.byte	0x67
 	.byte	0x25
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF997
+	.4byte	.LASF998
 	.byte	0x67
 	.byte	0x2e
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x38
 	.byte	0
 	.uleb128 0x21
 	.byte	0x8
 	.byte	0x68
 	.byte	0x6d
-	.4byte	0x3eee
+	.4byte	0x3f03
 	.uleb128 0x22
-	.4byte	.LASF998
+	.4byte	.LASF999
 	.byte	0x68
 	.byte	0x6e
-	.4byte	0xef
+	.4byte	0xf4
 	.uleb128 0x28
 	.string	"ptr"
 	.byte	0x68
 	.byte	0x70
-	.4byte	0xef
+	.4byte	0xf4
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF720
+	.4byte	.LASF721
 	.byte	0x20
 	.byte	0x68
 	.byte	0x3e
-	.4byte	0x3f2b
+	.4byte	0x3f40
 	.uleb128 0xe
-	.4byte	.LASF999
+	.4byte	.LASF1000
 	.byte	0x68
 	.byte	0x4b
 	.4byte	0xd2
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1000
+	.4byte	.LASF1001
 	.byte	0x68
 	.byte	0x5a
 	.4byte	0xd2
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1001
+	.4byte	.LASF1002
 	.byte	0x68
 	.byte	0x7c
-	.4byte	0x3ecf
+	.4byte	0x3ee4
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x68
 	.byte	0x90
 	.4byte	0xd2
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF657
+	.4byte	.LASF658
 	.byte	0x18
 	.byte	0x48
 	.byte	0xed
-	.4byte	0x3f5c
+	.4byte	0x3f71
 	.uleb128 0xe
-	.4byte	.LASF652
+	.4byte	.LASF653
 	.byte	0x48
 	.byte	0xef
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF653
+	.4byte	.LASF654
 	.byte	0x48
 	.byte	0xf0
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF115
+	.4byte	.LASF116
 	.byte	0x48
 	.byte	0xf1
-	.4byte	0xe1e
+	.4byte	0xe33
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1002
+	.4byte	.LASF1003
 	.byte	0x18
 	.byte	0x48
 	.byte	0xff
-	.4byte	0x3f90
+	.4byte	0x3fa5
 	.uleb128 0x1b
-	.4byte	.LASF652
+	.4byte	.LASF653
 	.byte	0x48
 	.2byte	0x100
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF653
+	.4byte	.LASF654
 	.byte	0x48
 	.2byte	0x101
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1003
+	.4byte	.LASF1004
 	.byte	0x48
 	.2byte	0x102
-	.4byte	0xfa
+	.4byte	0xff
 	.byte	0x10
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF612
+	.4byte	.LASF613
 	.byte	0x20
 	.byte	0x48
 	.2byte	0x128
-	.4byte	0x3fd2
+	.4byte	0x3fe7
 	.uleb128 0x1b
-	.4byte	.LASF1004
+	.4byte	.LASF1005
 	.byte	0x48
 	.2byte	0x12d
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1005
+	.4byte	.LASF1006
 	.byte	0x48
 	.2byte	0x130
-	.4byte	0xfa
+	.4byte	0xff
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1006
+	.4byte	.LASF1007
 	.byte	0x48
 	.2byte	0x135
-	.4byte	0xfa
+	.4byte	0xff
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1007
+	.4byte	.LASF1008
 	.byte	0x48
 	.2byte	0x138
-	.4byte	0xfa
+	.4byte	0xff
 	.byte	0x18
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1008
+	.4byte	.LASF1009
 	.byte	0x10
 	.byte	0x48
 	.2byte	0x14b
-	.4byte	0x3ffa
+	.4byte	0x400f
 	.uleb128 0x1b
-	.4byte	.LASF1009
+	.4byte	.LASF1010
 	.byte	0x48
 	.2byte	0x14c
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1010
+	.4byte	.LASF1011
 	.byte	0x48
 	.2byte	0x14d
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x8
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1011
+	.4byte	.LASF1012
 	.byte	0x8
 	.byte	0x48
 	.2byte	0x166
-	.4byte	0x4022
+	.4byte	0x4037
 	.uleb128 0x1b
-	.4byte	.LASF1012
+	.4byte	.LASF1013
 	.byte	0x48
 	.2byte	0x167
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1013
+	.4byte	.LASF1014
 	.byte	0x48
 	.2byte	0x168
 	.4byte	0x6d
 	.byte	0x4
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1014
+	.4byte	.LASF1015
 	.byte	0x40
 	.byte	0x48
 	.2byte	0x197
-	.4byte	0x40a5
+	.4byte	0x40ba
 	.uleb128 0x1b
-	.4byte	.LASF1015
+	.4byte	.LASF1016
 	.byte	0x48
 	.2byte	0x198
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1016
+	.4byte	.LASF1017
 	.byte	0x48
 	.2byte	0x199
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1017
+	.4byte	.LASF1018
 	.byte	0x48
 	.2byte	0x19a
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1018
+	.4byte	.LASF1019
 	.byte	0x48
 	.2byte	0x19b
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1019
+	.4byte	.LASF1020
 	.byte	0x48
 	.2byte	0x19c
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x1c
 	.uleb128 0x1b
-	.4byte	.LASF1020
+	.4byte	.LASF1021
 	.byte	0x48
 	.2byte	0x19d
 	.4byte	0x29
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1021
+	.4byte	.LASF1022
 	.byte	0x48
 	.2byte	0x19e
 	.4byte	0x29
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1022
+	.4byte	.LASF1023
 	.byte	0x48
 	.2byte	0x19f
 	.4byte	0x29
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1011
+	.4byte	.LASF1012
 	.byte	0x48
 	.2byte	0x1a0
-	.4byte	0x3ffa
+	.4byte	0x400f
 	.byte	0x38
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1023
+	.4byte	.LASF1024
 	.byte	0xd8
 	.byte	0x48
 	.2byte	0x1a3
-	.4byte	0x4212
+	.4byte	0x4227
 	.uleb128 0x1b
-	.4byte	.LASF1024
+	.4byte	.LASF1025
 	.byte	0x48
 	.2byte	0x1a5
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1025
+	.4byte	.LASF1026
 	.byte	0x48
 	.2byte	0x1a6
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1026
+	.4byte	.LASF1027
 	.byte	0x48
 	.2byte	0x1a7
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1027
+	.4byte	.LASF1028
 	.byte	0x48
 	.2byte	0x1a8
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1028
+	.4byte	.LASF1029
 	.byte	0x48
 	.2byte	0x1a9
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1029
+	.4byte	.LASF1030
 	.byte	0x48
 	.2byte	0x1aa
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1030
+	.4byte	.LASF1031
 	.byte	0x48
 	.2byte	0x1ac
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1031
+	.4byte	.LASF1032
 	.byte	0x48
 	.2byte	0x1ad
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1032
+	.4byte	.LASF1033
 	.byte	0x48
 	.2byte	0x1ae
-	.4byte	0x14a
+	.4byte	0x14f
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1033
+	.4byte	.LASF1034
 	.byte	0x48
 	.2byte	0x1b0
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1034
+	.4byte	.LASF1035
 	.byte	0x48
 	.2byte	0x1b1
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1035
+	.4byte	.LASF1036
 	.byte	0x48
 	.2byte	0x1b2
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1036
+	.4byte	.LASF1037
 	.byte	0x48
 	.2byte	0x1b3
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1037
+	.4byte	.LASF1038
 	.byte	0x48
 	.2byte	0x1b5
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1038
+	.4byte	.LASF1039
 	.byte	0x48
 	.2byte	0x1b6
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1039
+	.4byte	.LASF1040
 	.byte	0x48
 	.2byte	0x1b7
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1040
+	.4byte	.LASF1041
 	.byte	0x48
 	.2byte	0x1b8
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1041
+	.4byte	.LASF1042
 	.byte	0x48
 	.2byte	0x1b9
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF1042
+	.4byte	.LASF1043
 	.byte	0x48
 	.2byte	0x1bb
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1043
+	.4byte	.LASF1044
 	.byte	0x48
 	.2byte	0x1bc
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF1044
+	.4byte	.LASF1045
 	.byte	0x48
 	.2byte	0x1bd
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF1045
+	.4byte	.LASF1046
 	.byte	0x48
 	.2byte	0x1be
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF1046
+	.4byte	.LASF1047
 	.byte	0x48
 	.2byte	0x1bf
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF1047
+	.4byte	.LASF1048
 	.byte	0x48
 	.2byte	0x1c0
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF1048
+	.4byte	.LASF1049
 	.byte	0x48
 	.2byte	0x1c1
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF1049
+	.4byte	.LASF1050
 	.byte	0x48
 	.2byte	0x1c2
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xc8
 	.uleb128 0x1b
-	.4byte	.LASF1050
+	.4byte	.LASF1051
 	.byte	0x48
 	.2byte	0x1c3
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xd0
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF1051
+	.4byte	.LASF1052
 	.2byte	0x200
 	.byte	0x48
 	.2byte	0x1c7
-	.4byte	0x432e
+	.4byte	0x4343
 	.uleb128 0x1b
-	.4byte	.LASF1052
+	.4byte	.LASF1053
 	.byte	0x48
 	.2byte	0x1c9
-	.4byte	0x3fd2
+	.4byte	0x3fe7
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1053
+	.4byte	.LASF1054
 	.byte	0x48
 	.2byte	0x1ca
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1054
+	.4byte	.LASF1055
 	.byte	0x48
 	.2byte	0x1cb
-	.4byte	0x34cd
+	.4byte	0x34e2
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1055
+	.4byte	.LASF1056
 	.byte	0x48
 	.2byte	0x1cc
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF588
+	.4byte	.LASF589
 	.byte	0x48
 	.2byte	0x1cd
 	.4byte	0x6d
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1056
+	.4byte	.LASF1057
 	.byte	0x48
 	.2byte	0x1cf
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1003
+	.4byte	.LASF1004
 	.byte	0x48
 	.2byte	0x1d0
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1057
+	.4byte	.LASF1058
 	.byte	0x48
 	.2byte	0x1d1
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1058
+	.4byte	.LASF1059
 	.byte	0x48
 	.2byte	0x1d2
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1059
+	.4byte	.LASF1060
 	.byte	0x48
 	.2byte	0x1d4
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1060
+	.4byte	.LASF1061
 	.byte	0x48
 	.2byte	0x1d6
-	.4byte	0x40a5
+	.4byte	0x40ba
 	.byte	0x70
 	.uleb128 0x1c
-	.4byte	.LASF1061
+	.4byte	.LASF1062
 	.byte	0x48
 	.2byte	0x1d9
 	.4byte	0xc6
 	.2byte	0x148
 	.uleb128 0x1c
-	.4byte	.LASF639
+	.4byte	.LASF640
 	.byte	0x48
 	.2byte	0x1da
-	.4byte	0x432e
+	.4byte	0x4343
 	.2byte	0x150
 	.uleb128 0x1c
-	.4byte	.LASF1062
+	.4byte	.LASF1063
 	.byte	0x48
 	.2byte	0x1dc
-	.4byte	0x4339
+	.4byte	0x434e
 	.2byte	0x158
 	.uleb128 0x1c
-	.4byte	.LASF1063
+	.4byte	.LASF1064
 	.byte	0x48
 	.2byte	0x1de
-	.4byte	0x4339
+	.4byte	0x434e
 	.2byte	0x160
 	.uleb128 0x30
 	.string	"avg"
 	.byte	0x48
 	.2byte	0x1e8
-	.4byte	0x4022
+	.4byte	0x4037
 	.2byte	0x180
 	.uleb128 0x1c
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x48
 	.2byte	0x1eb
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x1c0
 	.uleb128 0x1c
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x48
 	.2byte	0x1ec
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x1c8
 	.uleb128 0x1c
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x48
 	.2byte	0x1ed
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x1d0
 	.uleb128 0x1c
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x48
 	.2byte	0x1ee
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x1d8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4212
+	.4byte	0x4227
 	.uleb128 0x24
-	.4byte	.LASF1062
+	.4byte	.LASF1063
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4334
+	.4byte	0x4349
 	.uleb128 0x1d
-	.4byte	.LASF1064
+	.4byte	.LASF1065
 	.byte	0x50
 	.byte	0x48
 	.2byte	0x1f1
-	.4byte	0x43dc
+	.4byte	0x43f1
 	.uleb128 0x1b
-	.4byte	.LASF1065
+	.4byte	.LASF1066
 	.byte	0x48
 	.2byte	0x1f2
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1066
+	.4byte	.LASF1067
 	.byte	0x48
 	.2byte	0x1f3
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1067
+	.4byte	.LASF1068
 	.byte	0x48
 	.2byte	0x1f4
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1068
+	.4byte	.LASF1069
 	.byte	0x48
 	.2byte	0x1f5
 	.4byte	0x6d
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF588
+	.4byte	.LASF589
 	.byte	0x48
 	.2byte	0x1f6
 	.4byte	0xb4
 	.byte	0x24
 	.uleb128 0x1b
-	.4byte	.LASF1069
+	.4byte	.LASF1070
 	.byte	0x48
 	.2byte	0x1f7
 	.4byte	0xb4
 	.byte	0x26
 	.uleb128 0x1b
-	.4byte	.LASF1070
+	.4byte	.LASF1071
 	.byte	0x48
 	.2byte	0x1f9
-	.4byte	0x43dc
+	.4byte	0x43f1
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x48
 	.2byte	0x202
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x48
 	.2byte	0x203
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x48
 	.2byte	0x204
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x48
 	.2byte	0x205
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x48
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x433f
+	.4byte	0x4354
 	.uleb128 0x1d
-	.4byte	.LASF1071
+	.4byte	.LASF1072
 	.byte	0xe8
 	.byte	0x48
 	.2byte	0x208
-	.4byte	0x44cf
+	.4byte	0x44e4
 	.uleb128 0x1b
-	.4byte	.LASF850
+	.4byte	.LASF851
 	.byte	0x48
 	.2byte	0x209
-	.4byte	0x34cd
+	.4byte	0x34e2
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1072
+	.4byte	.LASF1073
 	.byte	0x48
 	.2byte	0x210
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1073
+	.4byte	.LASF1074
 	.byte	0x48
 	.2byte	0x211
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1074
+	.4byte	.LASF1075
 	.byte	0x48
 	.2byte	0x212
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1075
+	.4byte	.LASF1076
 	.byte	0x48
 	.2byte	0x213
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1076
+	.4byte	.LASF1077
 	.byte	0x48
 	.2byte	0x214
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1077
+	.4byte	.LASF1078
 	.byte	0x48
 	.2byte	0x21b
-	.4byte	0x14a
+	.4byte	0x14f
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1078
+	.4byte	.LASF1079
 	.byte	0x48
 	.2byte	0x21c
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x48
 	.2byte	0x21d
 	.4byte	0x6d
 	.byte	0x50
 	.uleb128 0x3b
-	.4byte	.LASF1079
+	.4byte	.LASF1080
 	.byte	0x48
 	.2byte	0x237
 	.4byte	0x6d
@@ -18835,7 +18822,7 @@ __exitcall_ebc_exit:
 	.byte	0x1f
 	.byte	0x54
 	.uleb128 0x3b
-	.4byte	.LASF1080
+	.4byte	.LASF1081
 	.byte	0x48
 	.2byte	0x238
 	.4byte	0x6d
@@ -18844,7 +18831,7 @@ __exitcall_ebc_exit:
 	.byte	0x1e
 	.byte	0x54
 	.uleb128 0x3b
-	.4byte	.LASF1081
+	.4byte	.LASF1082
 	.byte	0x48
 	.2byte	0x239
 	.4byte	0x6d
@@ -18853,7 +18840,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.byte	0x54
 	.uleb128 0x3b
-	.4byte	.LASF1082
+	.4byte	.LASF1083
 	.byte	0x48
 	.2byte	0x23a
 	.4byte	0x6d
@@ -18862,7 +18849,7 @@ __exitcall_ebc_exit:
 	.byte	0x1c
 	.byte	0x54
 	.uleb128 0x3b
-	.4byte	.LASF1083
+	.4byte	.LASF1084
 	.byte	0x48
 	.2byte	0x23b
 	.4byte	0x6d
@@ -18871,91 +18858,91 @@ __exitcall_ebc_exit:
 	.byte	0x1b
 	.byte	0x54
 	.uleb128 0x1b
-	.4byte	.LASF1084
+	.4byte	.LASF1085
 	.byte	0x48
 	.2byte	0x241
-	.4byte	0x3625
+	.4byte	0x363a
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1085
+	.4byte	.LASF1086
 	.byte	0x48
 	.2byte	0x24a
-	.4byte	0x3625
+	.4byte	0x363a
 	.byte	0xa0
 	.byte	0
 	.uleb128 0x2e
 	.byte	0x4
 	.byte	0x48
 	.2byte	0x271
-	.4byte	0x450d
+	.4byte	0x4522
 	.uleb128 0x1b
-	.4byte	.LASF677
+	.4byte	.LASF678
 	.byte	0x48
 	.2byte	0x272
-	.4byte	0x10b
+	.4byte	0x110
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1086
+	.4byte	.LASF1087
 	.byte	0x48
 	.2byte	0x273
-	.4byte	0x10b
+	.4byte	0x110
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF1087
+	.4byte	.LASF1088
 	.byte	0x48
 	.2byte	0x274
-	.4byte	0x10b
+	.4byte	0x110
 	.byte	0x2
 	.uleb128 0x2b
 	.string	"pad"
 	.byte	0x48
 	.2byte	0x277
-	.4byte	0x10b
+	.4byte	0x110
 	.byte	0x3
 	.byte	0
 	.uleb128 0x3c
-	.4byte	.LASF1089
+	.4byte	.LASF1090
 	.byte	0x4
 	.byte	0x48
 	.2byte	0x270
-	.4byte	0x452f
+	.4byte	0x4544
 	.uleb128 0x3d
 	.string	"b"
 	.byte	0x48
 	.2byte	0x278
-	.4byte	0x44cf
+	.4byte	0x44e4
 	.uleb128 0x3d
 	.string	"s"
 	.byte	0x48
 	.2byte	0x279
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1090
+	.4byte	.LASF1091
 	.byte	0x8
 	.byte	0x48
 	.2byte	0x283
-	.4byte	0x454a
+	.4byte	0x455f
 	.uleb128 0x1b
-	.4byte	.LASF63
+	.4byte	.LASF64
 	.byte	0x48
 	.2byte	0x284
-	.4byte	0x454a
+	.4byte	0x455f
 	.byte	0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x452f
+	.4byte	0x4544
 	.uleb128 0x2e
 	.byte	0x8
 	.byte	0x48
 	.2byte	0x510
-	.4byte	0x4567
+	.4byte	0x457c
 	.uleb128 0x1b
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x48
 	.2byte	0x510
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0
 	.byte	0
 	.uleb128 0x3e
@@ -18966,9 +18953,9 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x48
 	.2byte	0x510
-	.4byte	0x4596
+	.4byte	0x45ab
 	.uleb128 0x40
-	.4byte	.LASF1242
+	.4byte	.LASF1243
 	.byte	0x48
 	.2byte	0x510
 	.4byte	0x6d
@@ -18976,23 +18963,23 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x1f
 	.uleb128 0x41
-	.4byte	.LASF1091
+	.4byte	.LASF1092
 	.byte	0x48
 	.2byte	0x510
-	.4byte	0x4550
+	.4byte	0x4565
 	.uleb128 0x29
-	.4byte	0x4567
+	.4byte	0x457c
 	.byte	0
 	.uleb128 0x2e
 	.byte	0x8
 	.byte	0x48
 	.2byte	0x513
-	.4byte	0x45ad
+	.4byte	0x45c2
 	.uleb128 0x1b
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x48
 	.2byte	0x513
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0
 	.byte	0
 	.uleb128 0x3e
@@ -19003,496 +18990,496 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x48
 	.2byte	0x513
-	.4byte	0x45d9
+	.4byte	0x45ee
 	.uleb128 0x41
-	.4byte	.LASF1092
+	.4byte	.LASF1093
 	.byte	0x48
 	.2byte	0x513
 	.4byte	0x6d
 	.uleb128 0x41
-	.4byte	.LASF1093
+	.4byte	.LASF1094
 	.byte	0x48
 	.2byte	0x513
-	.4byte	0x4596
+	.4byte	0x45ab
 	.uleb128 0x29
-	.4byte	0x45ad
+	.4byte	0x45c2
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF593
+	.4byte	.LASF594
 	.uleb128 0x3
-	.4byte	0x45d9
+	.4byte	0x45ee
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x45de
+	.4byte	0x45f3
 	.uleb128 0x24
-	.4byte	.LASF1094
+	.4byte	.LASF1095
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x45e9
+	.4byte	0x45fe
 	.uleb128 0x24
-	.4byte	.LASF1095
+	.4byte	.LASF1096
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x45f4
+	.4byte	0x4609
 	.uleb128 0x1a
-	.4byte	.LASF1096
+	.4byte	.LASF1097
 	.2byte	0x378
 	.byte	0x5a
 	.2byte	0x166
-	.4byte	0x4622
+	.4byte	0x4637
 	.uleb128 0x23
-	.4byte	0x56ff
+	.4byte	0x5714
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1097
+	.4byte	.LASF1098
 	.byte	0x5a
 	.2byte	0x206
-	.4byte	0x5a27
+	.4byte	0x5a3c
 	.2byte	0x378
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x45ff
+	.4byte	0x4614
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2314
+	.4byte	0x2329
 	.uleb128 0x5
-	.4byte	0x3d6
-	.4byte	0x463e
+	.4byte	0x3eb
+	.4byte	0x4653
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1098
+	.4byte	.LASF1099
 	.byte	0x20
 	.byte	0x69
 	.byte	0x1a
-	.4byte	0x4663
+	.4byte	0x4678
 	.uleb128 0xe
-	.4byte	.LASF1099
+	.4byte	.LASF1100
 	.byte	0x69
 	.byte	0x1b
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1100
+	.4byte	.LASF1101
 	.byte	0x69
 	.byte	0x1c
-	.4byte	0x15aa
+	.4byte	0x15bf
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x463e
+	.4byte	0x4653
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x155
+	.4byte	0x15a
 	.uleb128 0x5
-	.4byte	0x392
-	.4byte	0x4685
+	.4byte	0x3a7
+	.4byte	0x469a
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF668
+	.4byte	.LASF669
 	.byte	0xa8
 	.byte	0x6a
 	.byte	0x74
-	.4byte	0x47b8
+	.4byte	0x47cd
 	.uleb128 0xe
-	.4byte	.LASF579
+	.4byte	.LASF580
 	.byte	0x6a
 	.byte	0x75
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0
 	.uleb128 0x20
 	.string	"uid"
 	.byte	0x6a
 	.byte	0x7d
-	.4byte	0x23fb
+	.4byte	0x2410
 	.byte	0x4
 	.uleb128 0x20
 	.string	"gid"
 	.byte	0x6a
 	.byte	0x7e
-	.4byte	0x241b
+	.4byte	0x2430
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1101
+	.4byte	.LASF1102
 	.byte	0x6a
 	.byte	0x7f
-	.4byte	0x23fb
+	.4byte	0x2410
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF1102
+	.4byte	.LASF1103
 	.byte	0x6a
 	.byte	0x80
-	.4byte	0x241b
+	.4byte	0x2430
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1103
+	.4byte	.LASF1104
 	.byte	0x6a
 	.byte	0x81
-	.4byte	0x23fb
+	.4byte	0x2410
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF1104
+	.4byte	.LASF1105
 	.byte	0x6a
 	.byte	0x82
-	.4byte	0x241b
+	.4byte	0x2430
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1105
+	.4byte	.LASF1106
 	.byte	0x6a
 	.byte	0x83
-	.4byte	0x23fb
+	.4byte	0x2410
 	.byte	0x1c
 	.uleb128 0xe
-	.4byte	.LASF1106
+	.4byte	.LASF1107
 	.byte	0x6a
 	.byte	0x84
-	.4byte	0x241b
+	.4byte	0x2430
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1107
+	.4byte	.LASF1108
 	.byte	0x6a
 	.byte	0x85
 	.4byte	0x6d
 	.byte	0x24
 	.uleb128 0xe
-	.4byte	.LASF1108
+	.4byte	.LASF1109
 	.byte	0x6a
 	.byte	0x86
-	.4byte	0x5b36
+	.4byte	0x5b4b
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1109
+	.4byte	.LASF1110
 	.byte	0x6a
 	.byte	0x87
-	.4byte	0x5b36
+	.4byte	0x5b4b
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1110
+	.4byte	.LASF1111
 	.byte	0x6a
 	.byte	0x88
-	.4byte	0x5b36
+	.4byte	0x5b4b
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF1111
+	.4byte	.LASF1112
 	.byte	0x6a
 	.byte	0x89
-	.4byte	0x5b36
+	.4byte	0x5b4b
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF1112
+	.4byte	.LASF1113
 	.byte	0x6a
 	.byte	0x8a
-	.4byte	0x5b36
+	.4byte	0x5b4b
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF1113
+	.4byte	.LASF1114
 	.byte	0x6a
 	.byte	0x8c
 	.4byte	0x96
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF957
+	.4byte	.LASF958
 	.byte	0x6a
 	.byte	0x8e
-	.4byte	0x8764
+	.4byte	0x8779
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF1114
+	.4byte	.LASF1115
 	.byte	0x6a
 	.byte	0x8f
-	.4byte	0x8764
+	.4byte	0x8779
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF1115
+	.4byte	.LASF1116
 	.byte	0x6a
 	.byte	0x90
-	.4byte	0x8764
+	.4byte	0x8779
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF1116
+	.4byte	.LASF1117
 	.byte	0x6a
 	.byte	0x91
-	.4byte	0x8764
+	.4byte	0x8779
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF746
+	.4byte	.LASF747
 	.byte	0x6a
 	.byte	0x94
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF1117
+	.4byte	.LASF1118
 	.byte	0x6a
 	.byte	0x96
-	.4byte	0x3c40
+	.4byte	0x3c55
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF1118
+	.4byte	.LASF1119
 	.byte	0x6a
 	.byte	0x97
-	.4byte	0x5a21
+	.4byte	0x5a36
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF1119
+	.4byte	.LASF1120
 	.byte	0x6a
 	.byte	0x98
-	.4byte	0x9659
+	.4byte	0x966e
 	.byte	0x90
 	.uleb128 0x23
-	.4byte	0x963a
+	.4byte	0x964f
 	.byte	0x98
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x4685
+	.4byte	0x469a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x47b8
+	.4byte	0x47cd
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x47d3
+	.4byte	0x47e8
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF670
-	.uleb128 0x7
-	.byte	0x8
-	.4byte	0x47d3
-	.uleb128 0x24
-	.4byte	.LASF1120
+	.4byte	.LASF671
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x47de
+	.4byte	0x47e8
 	.uleb128 0x24
 	.4byte	.LASF1121
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x47e9
+	.4byte	0x47f3
 	.uleb128 0x24
-	.4byte	.LASF674
+	.4byte	.LASF1122
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x47f4
+	.4byte	0x47fe
 	.uleb128 0x24
-	.4byte	.LASF1122
+	.4byte	.LASF675
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x47ff
+	.4byte	0x4809
 	.uleb128 0x24
 	.4byte	.LASF1123
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x480a
+	.4byte	0x4814
 	.uleb128 0x24
-	.4byte	.LASF684
+	.4byte	.LASF1124
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4815
+	.4byte	0x481f
 	.uleb128 0x24
-	.4byte	.LASF1124
+	.4byte	.LASF685
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4820
+	.4byte	0x482a
 	.uleb128 0x24
-	.4byte	.LASF695
+	.4byte	.LASF1125
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x482b
+	.4byte	0x4835
 	.uleb128 0x24
-	.4byte	.LASF1125
+	.4byte	.LASF696
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4836
+	.4byte	0x4840
 	.uleb128 0x24
-	.4byte	.LASF697
+	.4byte	.LASF1126
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4841
+	.4byte	0x484b
 	.uleb128 0x24
 	.4byte	.LASF698
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x484c
-	.uleb128 0xd
+	.4byte	0x4856
+	.uleb128 0x24
 	.4byte	.LASF699
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4861
+	.uleb128 0xd
+	.4byte	.LASF700
 	.byte	0x78
 	.byte	0x6b
 	.byte	0x63
-	.4byte	0x48e8
+	.4byte	0x48fd
 	.uleb128 0xe
-	.4byte	.LASF1126
+	.4byte	.LASF1127
 	.byte	0x6b
 	.byte	0x64
-	.4byte	0x543
+	.4byte	0x558
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1127
+	.4byte	.LASF1128
 	.byte	0x6b
 	.byte	0x65
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1128
+	.4byte	.LASF1129
 	.byte	0x6b
 	.byte	0x66
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF115
+	.4byte	.LASF116
 	.byte	0x6b
 	.byte	0x69
-	.4byte	0xe50
+	.4byte	0xe65
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1129
+	.4byte	.LASF1130
 	.byte	0x6b
 	.byte	0x6b
 	.4byte	0xb4
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF1130
+	.4byte	.LASF1131
 	.byte	0x6b
 	.byte	0x70
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1131
+	.4byte	.LASF1132
 	.byte	0x6b
 	.byte	0x71
 	.4byte	0x29
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1132
+	.4byte	.LASF1133
 	.byte	0x6b
 	.byte	0x73
-	.4byte	0x4dc4
+	.4byte	0x4dd9
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1133
+	.4byte	.LASF1134
 	.byte	0x6b
 	.byte	0x74
-	.4byte	0x5e34
+	.4byte	0x5e49
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF1134
+	.4byte	.LASF1135
 	.byte	0x6b
 	.byte	0x75
-	.4byte	0x3bd
+	.4byte	0x3d2
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF1135
+	.4byte	.LASF1136
 	.byte	0x6b
 	.byte	0x77
-	.4byte	0x31f6
+	.4byte	0x320b
 	.byte	0x48
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4857
-	.uleb128 0x7
-	.byte	0x8
-	.4byte	0x3b74
-	.uleb128 0x24
-	.4byte	.LASF1136
+	.4byte	0x486c
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x48f4
+	.4byte	0x3b89
 	.uleb128 0x24
 	.4byte	.LASF1137
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x48ff
+	.4byte	0x4909
 	.uleb128 0x24
 	.4byte	.LASF1138
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x490a
+	.4byte	0x4914
 	.uleb128 0x24
 	.4byte	.LASF1139
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4915
+	.4byte	0x491f
+	.uleb128 0x24
+	.4byte	.LASF1140
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x492a
 	.uleb128 0x5
-	.4byte	0x4930
-	.4byte	0x4930
+	.4byte	0x4945
+	.4byte	0x4945
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4936
+	.4byte	0x494b
 	.uleb128 0x24
-	.4byte	.LASF1140
+	.4byte	.LASF1141
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3eee
+	.4byte	0x3f03
 	.uleb128 0x24
-	.4byte	.LASF1141
+	.4byte	.LASF1142
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4941
+	.4byte	0x4956
 	.uleb128 0x24
-	.4byte	.LASF1142
+	.4byte	.LASF1143
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x494c
+	.4byte	0x4961
 	.uleb128 0x24
-	.4byte	.LASF846
+	.4byte	.LASF847
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4957
+	.4byte	0x496c
 	.uleb128 0x24
-	.4byte	.LASF1143
+	.4byte	.LASF1144
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4962
+	.4byte	0x4977
 	.uleb128 0xd
-	.4byte	.LASF1144
+	.4byte	.LASF1145
 	.byte	0x40
 	.byte	0x6c
 	.byte	0x4a
-	.4byte	0x49bc
+	.4byte	0x49d1
 	.uleb128 0xe
-	.4byte	.LASF577
+	.4byte	.LASF578
 	.byte	0x6c
 	.byte	0x4b
-	.4byte	0x4e7e
+	.4byte	0x4e93
 	.byte	0
 	.uleb128 0x23
-	.4byte	0x4ee9
+	.4byte	0x4efe
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1145
+	.4byte	.LASF1146
 	.byte	0x6c
 	.byte	0x59
-	.4byte	0x4f01
+	.4byte	0x4f16
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1146
+	.4byte	.LASF1147
 	.byte	0x6c
 	.byte	0x5a
 	.4byte	0x29
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1147
+	.4byte	.LASF1148
 	.byte	0x6c
 	.byte	0x5c
-	.4byte	0x4f5c
+	.4byte	0x4f71
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1061
+	.4byte	.LASF1062
 	.byte	0x6c
 	.byte	0x5d
 	.4byte	0x6d
@@ -19500,219 +19487,219 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x496d
+	.4byte	0x4982
 	.uleb128 0xd
-	.4byte	.LASF1148
+	.4byte	.LASF1149
 	.byte	0x40
 	.byte	0x6d
 	.byte	0x22
-	.4byte	0x4a2f
+	.4byte	0x4a44
 	.uleb128 0xe
-	.4byte	.LASF63
+	.4byte	.LASF64
 	.byte	0x6d
 	.byte	0x23
-	.4byte	0x4a2f
+	.4byte	0x4a44
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1149
+	.4byte	.LASF1150
 	.byte	0x6d
 	.byte	0x24
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF986
+	.4byte	.LASF987
 	.byte	0x6d
 	.byte	0x25
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x6d
 	.byte	0x26
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1150
+	.4byte	.LASF1151
 	.byte	0x6d
 	.byte	0x27
-	.4byte	0x5a42
+	.4byte	0x5a57
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1151
+	.4byte	.LASF1152
 	.byte	0x6d
 	.byte	0x28
 	.4byte	0x6d
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1152
+	.4byte	.LASF1153
 	.byte	0x6d
 	.byte	0x29
-	.4byte	0x331
+	.4byte	0x346
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1153
+	.4byte	.LASF1154
 	.byte	0x6d
 	.byte	0x2a
-	.4byte	0x30a7
+	.4byte	0x30bc
 	.byte	0x38
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x49c2
+	.4byte	0x49d7
 	.uleb128 0x15
-	.4byte	.LASF1154
+	.4byte	.LASF1155
 	.byte	0x48
 	.2byte	0x5d0
-	.4byte	0x4628
+	.4byte	0x463d
 	.uleb128 0x42
-	.4byte	.LASF1155
+	.4byte	.LASF1156
 	.2byte	0x4000
 	.byte	0x48
 	.2byte	0x68b
-	.4byte	0x4a68
+	.4byte	0x4a7d
 	.uleb128 0x41
-	.4byte	.LASF758
+	.4byte	.LASF759
 	.byte	0x48
 	.2byte	0x68d
-	.4byte	0x2492
+	.4byte	0x24a7
 	.uleb128 0x41
-	.4byte	.LASF578
+	.4byte	.LASF579
 	.byte	0x48
 	.2byte	0x692
-	.4byte	0x4a68
+	.4byte	0x4a7d
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0x4a79
+	.4byte	0x4a8e
 	.uleb128 0x43
 	.4byte	0x4f
 	.2byte	0x7ff
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF1156
+	.4byte	.LASF1157
 	.byte	0x48
 	.2byte	0x699
-	.4byte	0x4a68
+	.4byte	0x4a7d
 	.uleb128 0xd
-	.4byte	.LASF1157
+	.4byte	.LASF1158
 	.byte	0x88
 	.byte	0x6e
 	.byte	0x18
-	.4byte	0x4b5e
+	.4byte	0x4b73
 	.uleb128 0xe
-	.4byte	.LASF1158
+	.4byte	.LASF1159
 	.byte	0x6e
 	.byte	0x19
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF903
+	.4byte	.LASF904
 	.byte	0x6e
 	.byte	0x1a
-	.4byte	0x27a
+	.4byte	0x28f
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1159
+	.4byte	.LASF1160
 	.byte	0x6e
 	.byte	0x1b
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1160
+	.4byte	.LASF1161
 	.byte	0x6e
 	.byte	0x1c
-	.4byte	0x2ef
+	.4byte	0x304
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF1161
+	.4byte	.LASF1162
 	.byte	0x6e
 	.byte	0x1d
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1162
+	.4byte	.LASF1163
 	.byte	0x6e
 	.byte	0x1e
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x18
 	.uleb128 0x20
 	.string	"ino"
 	.byte	0x6e
 	.byte	0x27
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x20
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x6e
 	.byte	0x28
-	.4byte	0x26f
+	.4byte	0x284
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1163
+	.4byte	.LASF1164
 	.byte	0x6e
 	.byte	0x29
-	.4byte	0x26f
+	.4byte	0x284
 	.byte	0x2c
 	.uleb128 0x20
 	.string	"uid"
 	.byte	0x6e
 	.byte	0x2a
-	.4byte	0x23fb
+	.4byte	0x2410
 	.byte	0x30
 	.uleb128 0x20
 	.string	"gid"
 	.byte	0x6e
 	.byte	0x2b
-	.4byte	0x241b
+	.4byte	0x2430
 	.byte	0x34
 	.uleb128 0xe
-	.4byte	.LASF986
+	.4byte	.LASF987
 	.byte	0x6e
 	.byte	0x2c
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF1164
+	.4byte	.LASF1165
 	.byte	0x6e
 	.byte	0x2d
-	.4byte	0xa12
+	.4byte	0xa27
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF1165
+	.4byte	.LASF1166
 	.byte	0x6e
 	.byte	0x2e
-	.4byte	0xa12
+	.4byte	0xa27
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF1166
+	.4byte	.LASF1167
 	.byte	0x6e
 	.byte	0x2f
-	.4byte	0xa12
+	.4byte	0xa27
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF1167
+	.4byte	.LASF1168
 	.byte	0x6e
 	.byte	0x30
-	.4byte	0xa12
+	.4byte	0xa27
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF1168
+	.4byte	.LASF1169
 	.byte	0x6e
 	.byte	0x31
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x80
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1169
+	.4byte	.LASF1170
 	.byte	0x20
 	.byte	0x6f
 	.byte	0xc
-	.4byte	0x4ba7
+	.4byte	0x4bbc
 	.uleb128 0xe
-	.4byte	.LASF1170
+	.4byte	.LASF1171
 	.byte	0x6f
 	.byte	0xd
-	.4byte	0x31b
+	.4byte	0x330
 	.byte	0
 	.uleb128 0x20
 	.string	"nid"
@@ -19721,65 +19708,65 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1171
+	.4byte	.LASF1172
 	.byte	0x6f
 	.byte	0x17
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1172
+	.4byte	.LASF1173
 	.byte	0x6f
 	.byte	0x1e
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1173
+	.4byte	.LASF1174
 	.byte	0x6f
 	.byte	0x21
-	.4byte	0x495c
+	.4byte	0x4971
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1174
+	.4byte	.LASF1175
 	.byte	0x40
 	.byte	0x6f
 	.byte	0x3c
-	.4byte	0x4c13
+	.4byte	0x4c28
 	.uleb128 0xe
-	.4byte	.LASF1175
+	.4byte	.LASF1176
 	.byte	0x6f
 	.byte	0x3d
-	.4byte	0x4c33
+	.4byte	0x4c48
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1176
+	.4byte	.LASF1177
 	.byte	0x6f
 	.byte	0x3f
-	.4byte	0x4c33
+	.4byte	0x4c48
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1177
+	.4byte	.LASF1178
 	.byte	0x6f
 	.byte	0x42
-	.4byte	0x194
+	.4byte	0x199
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1178
+	.4byte	.LASF1179
 	.byte	0x6f
 	.byte	0x43
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x6f
 	.byte	0x44
 	.4byte	0x6d
 	.byte	0x1c
 	.uleb128 0xe
-	.4byte	.LASF961
+	.4byte	.LASF962
 	.byte	0x6f
 	.byte	0x47
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x20
 	.uleb128 0x20
 	.string	"id"
@@ -19788,265 +19775,265 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1179
+	.4byte	.LASF1180
 	.byte	0x6f
 	.byte	0x4d
-	.4byte	0x4c39
+	.4byte	0x4c4e
 	.byte	0x38
 	.byte	0
 	.uleb128 0x14
 	.4byte	0x29
-	.4byte	0x4c27
+	.4byte	0x4c3c
 	.uleb128 0x11
-	.4byte	0x4c27
+	.4byte	0x4c3c
 	.uleb128 0x11
-	.4byte	0x4c2d
+	.4byte	0x4c42
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4ba7
+	.4byte	0x4bbc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4b5e
+	.4byte	0x4b73
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4c13
+	.4byte	0x4c28
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x543
+	.4byte	0x558
 	.uleb128 0xd
-	.4byte	.LASF1180
+	.4byte	.LASF1181
 	.byte	0x18
 	.byte	0x70
 	.byte	0x1c
-	.4byte	0x4c64
+	.4byte	0x4c79
 	.uleb128 0xe
-	.4byte	.LASF961
+	.4byte	.LASF962
 	.byte	0x70
 	.byte	0x1d
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1181
+	.4byte	.LASF1182
 	.byte	0x70
 	.byte	0x1f
-	.4byte	0x194
+	.4byte	0x199
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1182
+	.4byte	.LASF1183
 	.byte	0x10
 	.byte	0x70
 	.byte	0x22
-	.4byte	0x4c89
+	.4byte	0x4c9e
 	.uleb128 0x20
 	.string	"rcu"
 	.byte	0x70
 	.byte	0x23
-	.4byte	0x407
+	.4byte	0x41c
 	.byte	0
 	.uleb128 0x20
 	.string	"lru"
 	.byte	0x70
 	.byte	0x25
-	.4byte	0x4c89
+	.4byte	0x4c9e
 	.byte	0x10
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x4c98
-	.4byte	0x4c98
+	.4byte	0x4cad
+	.4byte	0x4cad
 	.uleb128 0x44
 	.4byte	0x4f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4c3f
+	.4byte	0x4c54
 	.uleb128 0xd
-	.4byte	.LASF1183
+	.4byte	.LASF1184
 	.byte	0x40
 	.byte	0x70
 	.byte	0x28
-	.4byte	0x4cdb
+	.4byte	0x4cf0
 	.uleb128 0xe
-	.4byte	.LASF115
+	.4byte	.LASF116
 	.byte	0x70
 	.byte	0x2a
-	.4byte	0xe50
+	.4byte	0xe65
 	.byte	0
 	.uleb128 0x20
 	.string	"lru"
 	.byte	0x70
 	.byte	0x2c
-	.4byte	0x4c3f
+	.4byte	0x4c54
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1184
+	.4byte	.LASF1185
 	.byte	0x70
 	.byte	0x2f
-	.4byte	0x4cdb
+	.4byte	0x4cf0
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1181
+	.4byte	.LASF1182
 	.byte	0x70
 	.byte	0x31
-	.4byte	0x194
+	.4byte	0x199
 	.byte	0x28
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4c64
+	.4byte	0x4c79
 	.uleb128 0xd
-	.4byte	.LASF1185
+	.4byte	.LASF1186
 	.byte	0x20
 	.byte	0x70
 	.byte	0x34
-	.4byte	0x4d1e
+	.4byte	0x4d33
 	.uleb128 0xe
-	.4byte	.LASF867
+	.4byte	.LASF868
 	.byte	0x70
 	.byte	0x35
-	.4byte	0x4d1e
+	.4byte	0x4d33
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF961
+	.4byte	.LASF962
 	.byte	0x70
 	.byte	0x37
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1186
+	.4byte	.LASF1187
 	.byte	0x70
 	.byte	0x38
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1187
+	.4byte	.LASF1188
 	.byte	0x70
 	.byte	0x39
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4c9e
+	.4byte	0x4cb3
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe50
+	.4byte	0xe65
 	.uleb128 0x21
 	.byte	0x10
 	.byte	0x71
 	.byte	0x63
-	.4byte	0x4d49
+	.4byte	0x4d5e
 	.uleb128 0x22
-	.4byte	.LASF1188
+	.4byte	.LASF1189
 	.byte	0x71
 	.byte	0x64
-	.4byte	0x392
+	.4byte	0x3a7
 	.uleb128 0x22
-	.4byte	.LASF69
+	.4byte	.LASF70
 	.byte	0x71
 	.byte	0x65
-	.4byte	0x407
+	.4byte	0x41c
 	.byte	0
 	.uleb128 0x26
-	.4byte	.LASF1189
+	.4byte	.LASF1190
 	.2byte	0x240
 	.byte	0x71
 	.byte	0x5c
-	.4byte	0x4dbe
+	.4byte	0x4dd3
 	.uleb128 0xe
-	.4byte	.LASF260
+	.4byte	.LASF261
 	.byte	0x71
 	.byte	0x5d
 	.4byte	0x96
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF883
+	.4byte	.LASF884
 	.byte	0x71
 	.byte	0x5e
 	.4byte	0x96
 	.byte	0x1
 	.uleb128 0xe
-	.4byte	.LASF382
+	.4byte	.LASF383
 	.byte	0x71
 	.byte	0x5f
 	.4byte	0x96
 	.byte	0x2
 	.uleb128 0xe
-	.4byte	.LASF1190
+	.4byte	.LASF1191
 	.byte	0x71
 	.byte	0x60
 	.4byte	0x96
 	.byte	0x3
 	.uleb128 0xe
-	.4byte	.LASF639
+	.4byte	.LASF640
 	.byte	0x71
 	.byte	0x61
-	.4byte	0x4dbe
+	.4byte	0x4dd3
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1191
+	.4byte	.LASF1192
 	.byte	0x71
 	.byte	0x62
-	.4byte	0x4df5
+	.4byte	0x4e0a
 	.byte	0x10
 	.uleb128 0x23
-	.4byte	0x4d2a
+	.4byte	0x4d3f
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1192
+	.4byte	.LASF1193
 	.byte	0x71
 	.byte	0x67
-	.4byte	0x4dfb
+	.4byte	0x4e10
 	.byte	0x28
 	.uleb128 0x27
-	.4byte	.LASF1193
+	.4byte	.LASF1194
 	.byte	0x71
 	.byte	0x68
-	.4byte	0x4e0b
+	.4byte	0x4e20
 	.2byte	0x228
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4d49
+	.4byte	0x4d5e
 	.uleb128 0xd
-	.4byte	.LASF1194
+	.4byte	.LASF1195
 	.byte	0x10
 	.byte	0x71
 	.byte	0x70
-	.4byte	0x4df5
+	.4byte	0x4e0a
 	.uleb128 0xe
-	.4byte	.LASF1195
+	.4byte	.LASF1196
 	.byte	0x71
 	.byte	0x71
-	.4byte	0xe50
+	.4byte	0xe65
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1170
+	.4byte	.LASF1171
 	.byte	0x71
 	.byte	0x72
-	.4byte	0x31b
+	.4byte	0x330
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1196
+	.4byte	.LASF1197
 	.byte	0x71
 	.byte	0x73
-	.4byte	0x4dbe
+	.4byte	0x4dd3
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4dc4
+	.4byte	0x4dd9
 	.uleb128 0x5
-	.4byte	0x443
-	.4byte	0x4e0b
+	.4byte	0x458
+	.4byte	0x4e20
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3f
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0x4e21
+	.4byte	0x4e36
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
@@ -20055,86 +20042,86 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1197
+	.4byte	.LASF1198
 	.byte	0x30
 	.byte	0x72
 	.byte	0x1e
-	.4byte	0x4e76
+	.4byte	0x4e8b
 	.uleb128 0xe
-	.4byte	.LASF382
+	.4byte	.LASF383
 	.byte	0x72
 	.byte	0x1f
-	.4byte	0x543
+	.4byte	0x558
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF575
+	.4byte	.LASF576
 	.byte	0x72
 	.byte	0x20
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF227
+	.4byte	.LASF228
 	.byte	0x72
 	.byte	0x21
-	.4byte	0xe1e
+	.4byte	0xe33
 	.byte	0x18
 	.uleb128 0x20
 	.string	"osq"
 	.byte	0x72
 	.byte	0x23
-	.4byte	0x2426
+	.4byte	0x243b
 	.byte	0x1c
 	.uleb128 0xe
-	.4byte	.LASF97
+	.4byte	.LASF98
 	.byte	0x72
 	.byte	0x28
-	.4byte	0x2ef0
+	.4byte	0x2f05
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1198
+	.4byte	.LASF1199
 	.byte	0x72
 	.byte	0x31
-	.4byte	0x194
+	.4byte	0x199
 	.byte	0x28
 	.byte	0
 	.uleb128 0x3a
-	.4byte	.LASF1199
+	.4byte	.LASF1200
 	.byte	0
 	.byte	0x73
 	.byte	0x18
 	.uleb128 0x1f
-	.4byte	.LASF1200
+	.4byte	.LASF1201
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x6c
 	.byte	0x40
-	.4byte	0x4ea7
-	.uleb128 0xc
-	.4byte	.LASF1201
-	.byte	0
+	.4byte	0x4ebc
 	.uleb128 0xc
 	.4byte	.LASF1202
-	.byte	0x1
+	.byte	0
 	.uleb128 0xc
 	.4byte	.LASF1203
-	.byte	0x2
+	.byte	0x1
 	.uleb128 0xc
 	.4byte	.LASF1204
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF1205
 	.byte	0x3
 	.byte	0
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x6c
 	.byte	0x4e
-	.4byte	0x4ec8
+	.4byte	0x4edd
 	.uleb128 0xe
-	.4byte	.LASF1205
+	.4byte	.LASF1206
 	.byte	0x6c
 	.byte	0x4f
-	.4byte	0x4e76
+	.4byte	0x4e8b
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1206
+	.4byte	.LASF1207
 	.byte	0x6c
 	.byte	0x50
 	.4byte	0x29
@@ -20144,15 +20131,15 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0x6c
 	.byte	0x53
-	.4byte	0x4ee9
+	.4byte	0x4efe
 	.uleb128 0xe
-	.4byte	.LASF1207
+	.4byte	.LASF1208
 	.byte	0x6c
 	.byte	0x54
-	.4byte	0x407
+	.4byte	0x41c
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1208
+	.4byte	.LASF1209
 	.byte	0x6c
 	.byte	0x55
 	.4byte	0x29
@@ -20162,123 +20149,123 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0x6c
 	.byte	0x4d
-	.4byte	0x4efc
+	.4byte	0x4f11
 	.uleb128 0x29
-	.4byte	0x4ea7
+	.4byte	0x4ebc
 	.uleb128 0x29
-	.4byte	0x4ec8
+	.4byte	0x4edd
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1209
+	.4byte	.LASF1210
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4efc
+	.4byte	0x4f11
 	.uleb128 0xd
-	.4byte	.LASF1210
+	.4byte	.LASF1211
 	.byte	0x30
 	.byte	0x6c
 	.byte	0x60
-	.4byte	0x4f5c
+	.4byte	0x4f71
 	.uleb128 0xe
-	.4byte	.LASF1209
+	.4byte	.LASF1210
 	.byte	0x6c
 	.byte	0x61
-	.4byte	0x4f01
+	.4byte	0x4f16
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF70
+	.4byte	.LASF71
 	.byte	0x6c
 	.byte	0x62
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF578
+	.4byte	.LASF579
 	.byte	0x6c
 	.byte	0x63
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1211
+	.4byte	.LASF1212
 	.byte	0x6c
 	.byte	0x64
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1212
+	.4byte	.LASF1213
 	.byte	0x6c
 	.byte	0x65
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF63
+	.4byte	.LASF64
 	.byte	0x6c
 	.byte	0x67
-	.4byte	0x4f5c
+	.4byte	0x4f71
 	.byte	0x28
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4f07
+	.4byte	0x4f1c
 	.uleb128 0xd
-	.4byte	.LASF1213
+	.4byte	.LASF1214
 	.byte	0x8
 	.byte	0x6c
 	.byte	0x72
-	.4byte	0x4f7b
+	.4byte	0x4f90
 	.uleb128 0xe
-	.4byte	.LASF1214
+	.4byte	.LASF1215
 	.byte	0x6c
 	.byte	0x73
-	.4byte	0x4f80
+	.4byte	0x4f95
 	.byte	0
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1214
+	.4byte	.LASF1215
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4f7b
+	.4byte	0x4f90
 	.uleb128 0xf
 	.byte	0x18
 	.byte	0x74
 	.byte	0x1c
-	.4byte	0x4fb2
+	.4byte	0x4fc7
 	.uleb128 0x20
 	.string	"id"
 	.byte	0x74
 	.byte	0x1d
-	.4byte	0x387
+	.4byte	0x39c
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1215
+	.4byte	.LASF1216
 	.byte	0x74
 	.byte	0x1e
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x74
 	.byte	0x1f
 	.4byte	0x29
 	.byte	0x10
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1216
+	.4byte	.LASF1217
 	.byte	0x74
 	.byte	0x20
-	.4byte	0x4f86
+	.4byte	0x4f9b
 	.uleb128 0x8
-	.4byte	.LASF1217
+	.4byte	.LASF1218
 	.byte	0x74
 	.byte	0x2f
-	.4byte	0x4a2
+	.4byte	0x4b7
 	.uleb128 0xd
-	.4byte	.LASF1218
+	.4byte	.LASF1219
 	.byte	0x10
 	.byte	0x74
 	.byte	0x31
-	.4byte	0x4fec
+	.4byte	0x5001
 	.uleb128 0xe
-	.4byte	.LASF1219
+	.4byte	.LASF1220
 	.byte	0x74
 	.byte	0x32
 	.4byte	0xc6
@@ -20287,31 +20274,31 @@ __exitcall_ebc_exit:
 	.string	"fn"
 	.byte	0x74
 	.byte	0x33
-	.4byte	0x4fbd
+	.4byte	0x4fd2
 	.byte	0x8
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1220
+	.4byte	.LASF1221
 	.byte	0x74
 	.byte	0x38
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
-	.4byte	.LASF1221
+	.4byte	.LASF1222
 	.byte	0x74
 	.byte	0x38
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
-	.4byte	.LASF1222
+	.4byte	.LASF1223
 	.byte	0x74
 	.byte	0x39
-	.4byte	0x367
+	.4byte	0x37c
 	.uleb128 0x19
-	.4byte	.LASF1218
+	.4byte	.LASF1219
 	.byte	0x74
 	.byte	0x3d
-	.4byte	0x4fc8
+	.4byte	0x4fdd
 	.uleb128 0x8
-	.4byte	.LASF1223
+	.4byte	.LASF1224
 	.byte	0x5a
 	.byte	0x1a
 	.4byte	0xc6
@@ -20319,175 +20306,175 @@ __exitcall_ebc_exit:
 	.byte	0x28
 	.byte	0x5a
 	.byte	0x51
-	.4byte	0x505c
+	.4byte	0x5071
 	.uleb128 0x20
 	.string	"lru"
 	.byte	0x5a
 	.byte	0x57
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1224
+	.4byte	.LASF1225
 	.byte	0x5a
 	.byte	0x59
-	.4byte	0x5161
+	.4byte	0x5176
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF879
+	.4byte	.LASF880
 	.byte	0x5a
 	.byte	0x5a
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF359
+	.4byte	.LASF360
 	.byte	0x5a
 	.byte	0x61
 	.4byte	0x29
 	.byte	0x20
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1225
+	.4byte	.LASF1226
 	.byte	0xd0
 	.byte	0x1f
 	.2byte	0x1a7
-	.4byte	0x5161
+	.4byte	0x5176
 	.uleb128 0x1b
-	.4byte	.LASF1226
+	.4byte	.LASF1227
 	.byte	0x1f
 	.2byte	0x1a8
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1227
+	.4byte	.LASF1228
 	.byte	0x1f
 	.2byte	0x1a9
-	.4byte	0x4dc4
+	.4byte	0x4dd9
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1228
+	.4byte	.LASF1229
 	.byte	0x1f
 	.2byte	0x1aa
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1229
+	.4byte	.LASF1230
 	.byte	0x1f
 	.2byte	0x1ab
-	.4byte	0x351d
+	.4byte	0x3532
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1230
+	.4byte	.LASF1231
 	.byte	0x1f
 	.2byte	0x1ac
-	.4byte	0x4e21
+	.4byte	0x4e36
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1231
+	.4byte	.LASF1232
 	.byte	0x1f
 	.2byte	0x1ae
 	.4byte	0x29
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1232
+	.4byte	.LASF1233
 	.byte	0x1f
 	.2byte	0x1b0
 	.4byte	0x29
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1233
+	.4byte	.LASF1234
 	.byte	0x1f
 	.2byte	0x1b1
 	.4byte	0x29
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1234
+	.4byte	.LASF1235
 	.byte	0x1f
 	.2byte	0x1b2
-	.4byte	0x79fe
+	.4byte	0x7a13
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x1f
 	.2byte	0x1b3
 	.4byte	0x29
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1235
+	.4byte	.LASF1236
 	.byte	0x1f
 	.2byte	0x1b4
-	.4byte	0xe50
+	.4byte	0xe65
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF1170
+	.4byte	.LASF1171
 	.byte	0x1f
 	.2byte	0x1b5
-	.4byte	0x31b
+	.4byte	0x330
 	.byte	0x8c
 	.uleb128 0x1b
-	.4byte	.LASF1188
+	.4byte	.LASF1189
 	.byte	0x1f
 	.2byte	0x1b6
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1236
+	.4byte	.LASF1237
 	.byte	0x1f
 	.2byte	0x1b7
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF1237
+	.4byte	.LASF1238
 	.byte	0x1f
 	.2byte	0x1b8
-	.4byte	0x5db0
+	.4byte	0x5dc5
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x1f
 	.2byte	0x1ba
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x1f
 	.2byte	0x1bb
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x1f
 	.2byte	0x1bc
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x1f
 	.2byte	0x1bd
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xc8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x505c
+	.4byte	0x5071
 	.uleb128 0xf
 	.byte	0x10
 	.byte	0x5a
 	.byte	0x66
-	.4byte	0x5194
+	.4byte	0x51a9
 	.uleb128 0xe
-	.4byte	.LASF63
+	.4byte	.LASF64
 	.byte	0x5a
 	.byte	0x67
-	.4byte	0x3454
+	.4byte	0x3469
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1150
+	.4byte	.LASF1151
 	.byte	0x5a
 	.byte	0x69
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1238
+	.4byte	.LASF1239
 	.byte	0x5a
 	.byte	0x6a
 	.4byte	0xc6
@@ -20497,22 +20484,22 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x5a
 	.byte	0x64
-	.4byte	0x51ad
+	.4byte	0x51c2
 	.uleb128 0x22
-	.4byte	.LASF1239
+	.4byte	.LASF1240
 	.byte	0x5a
 	.byte	0x65
-	.4byte	0x392
+	.4byte	0x3a7
 	.uleb128 0x29
-	.4byte	0x5167
+	.4byte	0x517c
 	.byte	0
 	.uleb128 0xf
 	.byte	0x4
 	.byte	0x5a
 	.byte	0x77
-	.4byte	0x51e3
+	.4byte	0x51f8
 	.uleb128 0x38
-	.4byte	.LASF1240
+	.4byte	.LASF1241
 	.byte	0x5a
 	.byte	0x78
 	.4byte	0x6d
@@ -20521,7 +20508,7 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0
 	.uleb128 0x38
-	.4byte	.LASF1241
+	.4byte	.LASF1242
 	.byte	0x5a
 	.byte	0x79
 	.4byte	0x6d
@@ -20530,7 +20517,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0
 	.uleb128 0x38
-	.4byte	.LASF1242
+	.4byte	.LASF1243
 	.byte	0x5a
 	.byte	0x7a
 	.4byte	0x6d
@@ -20543,435 +20530,435 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x5a
 	.byte	0x74
-	.4byte	0x5207
+	.4byte	0x521c
 	.uleb128 0x22
-	.4byte	.LASF1243
+	.4byte	.LASF1244
 	.byte	0x5a
 	.byte	0x75
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x22
-	.4byte	.LASF1244
+	.4byte	.LASF1245
 	.byte	0x5a
 	.byte	0x76
 	.4byte	0x29
 	.uleb128 0x29
-	.4byte	0x51ad
+	.4byte	0x51c2
 	.byte	0
 	.uleb128 0xf
 	.byte	0x28
 	.byte	0x5a
 	.byte	0x63
-	.4byte	0x5234
+	.4byte	0x5249
 	.uleb128 0x23
-	.4byte	0x5194
+	.4byte	0x51a9
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1245
+	.4byte	.LASF1246
 	.byte	0x5a
 	.byte	0x71
-	.4byte	0x5239
+	.4byte	0x524e
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1246
+	.4byte	.LASF1247
 	.byte	0x5a
 	.byte	0x73
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x18
 	.uleb128 0x23
-	.4byte	0x51e3
+	.4byte	0x51f8
 	.byte	0x20
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1247
+	.4byte	.LASF1248
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5234
+	.4byte	0x5249
 	.uleb128 0xf
 	.byte	0x10
 	.byte	0x5a
 	.byte	0x7e
-	.4byte	0x5278
+	.4byte	0x528d
 	.uleb128 0xe
-	.4byte	.LASF1248
+	.4byte	.LASF1249
 	.byte	0x5a
 	.byte	0x7f
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1249
+	.4byte	.LASF1250
 	.byte	0x5a
 	.byte	0x82
 	.4byte	0x96
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1250
+	.4byte	.LASF1251
 	.byte	0x5a
 	.byte	0x83
 	.4byte	0x96
 	.byte	0x9
 	.uleb128 0xe
-	.4byte	.LASF1251
+	.4byte	.LASF1252
 	.byte	0x5a
 	.byte	0x84
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0xc
 	.byte	0
 	.uleb128 0xf
 	.byte	0x20
 	.byte	0x5a
 	.byte	0x86
-	.4byte	0x52a5
+	.4byte	0x52ba
 	.uleb128 0xe
-	.4byte	.LASF1252
+	.4byte	.LASF1253
 	.byte	0x5a
 	.byte	0x87
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1253
+	.4byte	.LASF1254
 	.byte	0x5a
 	.byte	0x88
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1254
+	.4byte	.LASF1255
 	.byte	0x5a
 	.byte	0x89
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x10
 	.byte	0
 	.uleb128 0x21
 	.byte	0x8
 	.byte	0x5a
 	.byte	0x8f
-	.4byte	0x52c4
+	.4byte	0x52d9
 	.uleb128 0x22
-	.4byte	.LASF1255
+	.4byte	.LASF1256
 	.byte	0x5a
 	.byte	0x90
-	.4byte	0x4622
+	.4byte	0x4637
 	.uleb128 0x22
-	.4byte	.LASF1256
+	.4byte	.LASF1257
 	.byte	0x5a
 	.byte	0x91
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0
 	.uleb128 0xf
 	.byte	0x28
 	.byte	0x5a
 	.byte	0x8b
-	.4byte	0x5303
+	.4byte	0x5318
 	.uleb128 0xe
-	.4byte	.LASF1257
+	.4byte	.LASF1258
 	.byte	0x5a
 	.byte	0x8c
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1258
+	.4byte	.LASF1259
 	.byte	0x5a
 	.byte	0x8d
-	.4byte	0x3449
+	.4byte	0x345e
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1259
+	.4byte	.LASF1260
 	.byte	0x5a
 	.byte	0x8e
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0x23
-	.4byte	0x52a5
+	.4byte	0x52ba
 	.byte	0x18
 	.uleb128 0x20
 	.string	"ptl"
 	.byte	0x5a
 	.byte	0x96
-	.4byte	0xe50
+	.4byte	0xe65
 	.byte	0x20
 	.byte	0
 	.uleb128 0xf
 	.byte	0x18
 	.byte	0x5a
 	.byte	0x99
-	.4byte	0x5330
+	.4byte	0x5345
 	.uleb128 0xe
-	.4byte	.LASF1260
+	.4byte	.LASF1261
 	.byte	0x5a
 	.byte	0x9b
-	.4byte	0x53b5
+	.4byte	0x53ca
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1261
+	.4byte	.LASF1262
 	.byte	0x5a
 	.byte	0x9c
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1262
+	.4byte	.LASF1263
 	.byte	0x5a
 	.byte	0x9d
 	.4byte	0x29
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1263
+	.4byte	.LASF1264
 	.byte	0xc8
 	.byte	0x75
 	.byte	0x72
-	.4byte	0x53b5
+	.4byte	0x53ca
 	.uleb128 0xe
-	.4byte	.LASF1264
+	.4byte	.LASF1265
 	.byte	0x75
 	.byte	0x73
-	.4byte	0xc869
+	.4byte	0xc884
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1265
+	.4byte	.LASF1266
 	.byte	0x75
 	.byte	0x74
-	.4byte	0xc8a9
+	.4byte	0xc8c4
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1266
+	.4byte	.LASF1267
 	.byte	0x75
 	.byte	0x75
-	.4byte	0xc7fd
+	.4byte	0xc818
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1267
+	.4byte	.LASF1268
 	.byte	0x75
 	.byte	0x76
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x38
 	.uleb128 0x20
 	.string	"res"
 	.byte	0x75
 	.byte	0x77
-	.4byte	0x9737
+	.4byte	0x974c
 	.byte	0x40
 	.uleb128 0x20
 	.string	"ref"
 	.byte	0x75
 	.byte	0x78
-	.4byte	0xc684
+	.4byte	0xc69f
 	.byte	0xa0
 	.uleb128 0xe
-	.4byte	.LASF1268
+	.4byte	.LASF1269
 	.byte	0x75
 	.byte	0x79
-	.4byte	0xc8ca
+	.4byte	0xc8e5
 	.byte	0xa8
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x75
 	.byte	0x7a
-	.4byte	0xa55b
+	.4byte	0xa570
 	.byte	0xb0
 	.uleb128 0xe
-	.4byte	.LASF793
+	.4byte	.LASF794
 	.byte	0x75
 	.byte	0x7b
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0xb8
 	.uleb128 0xe
-	.4byte	.LASF192
+	.4byte	.LASF193
 	.byte	0x75
 	.byte	0x7c
-	.4byte	0xc846
+	.4byte	0xc861
 	.byte	0xc0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5330
+	.4byte	0x5345
 	.uleb128 0x21
 	.byte	0x28
 	.byte	0x5a
 	.byte	0x50
-	.4byte	0x53ed
+	.4byte	0x5402
 	.uleb128 0x29
-	.4byte	0x5023
+	.4byte	0x5038
 	.uleb128 0x29
-	.4byte	0x5207
+	.4byte	0x521c
 	.uleb128 0x29
-	.4byte	0x523f
+	.4byte	0x5254
 	.uleb128 0x29
-	.4byte	0x5278
+	.4byte	0x528d
 	.uleb128 0x29
-	.4byte	0x52c4
+	.4byte	0x52d9
 	.uleb128 0x29
-	.4byte	0x5303
+	.4byte	0x5318
 	.uleb128 0x22
-	.4byte	.LASF69
+	.4byte	.LASF70
 	.byte	0x5a
 	.byte	0xa1
-	.4byte	0x407
+	.4byte	0x41c
 	.byte	0
 	.uleb128 0x21
 	.byte	0x4
 	.byte	0x5a
 	.byte	0xa4
-	.4byte	0x5422
+	.4byte	0x5437
 	.uleb128 0x22
-	.4byte	.LASF1269
+	.4byte	.LASF1270
 	.byte	0x5a
 	.byte	0xa9
-	.4byte	0x367
+	.4byte	0x37c
 	.uleb128 0x22
-	.4byte	.LASF1270
+	.4byte	.LASF1271
 	.byte	0x5a
 	.byte	0xb1
 	.4byte	0x6d
 	.uleb128 0x22
-	.4byte	.LASF881
+	.4byte	.LASF882
 	.byte	0x5a
 	.byte	0xb3
 	.4byte	0x6d
 	.uleb128 0x22
-	.4byte	.LASF1271
+	.4byte	.LASF1272
 	.byte	0x5a
 	.byte	0xb4
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF1272
+	.4byte	.LASF1273
 	.2byte	0x100
 	.byte	0x1f
 	.2byte	0x395
-	.4byte	0x5542
+	.4byte	0x5557
 	.uleb128 0x2b
 	.string	"f_u"
 	.byte	0x1f
 	.2byte	0x399
-	.4byte	0x7ed8
+	.4byte	0x7eed
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1273
+	.4byte	.LASF1274
 	.byte	0x1f
 	.2byte	0x39a
-	.4byte	0x2103
+	.4byte	0x2118
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1274
+	.4byte	.LASF1275
 	.byte	0x1f
 	.2byte	0x39b
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1275
+	.4byte	.LASF1276
 	.byte	0x1f
 	.2byte	0x39c
-	.4byte	0x7db1
+	.4byte	0x7dc6
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1276
+	.4byte	.LASF1277
 	.byte	0x1f
 	.2byte	0x3a2
-	.4byte	0xe50
+	.4byte	0xe65
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1277
+	.4byte	.LASF1278
 	.byte	0x1f
 	.2byte	0x3a3
-	.4byte	0x75ed
+	.4byte	0x7602
 	.byte	0x34
 	.uleb128 0x1b
-	.4byte	.LASF1278
+	.4byte	.LASF1279
 	.byte	0x1f
 	.2byte	0x3a4
-	.4byte	0x543
+	.4byte	0x558
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1279
+	.4byte	.LASF1280
 	.byte	0x1f
 	.2byte	0x3a5
 	.4byte	0x6d
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1280
+	.4byte	.LASF1281
 	.byte	0x1f
 	.2byte	0x3a6
-	.4byte	0x326
+	.4byte	0x33b
 	.byte	0x44
 	.uleb128 0x1b
-	.4byte	.LASF1281
+	.4byte	.LASF1282
 	.byte	0x1f
 	.2byte	0x3a7
-	.4byte	0x2455
+	.4byte	0x246a
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1282
+	.4byte	.LASF1283
 	.byte	0x1f
 	.2byte	0x3a8
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1283
+	.4byte	.LASF1284
 	.byte	0x1f
 	.2byte	0x3a9
-	.4byte	0x7e20
+	.4byte	0x7e35
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1284
+	.4byte	.LASF1285
 	.byte	0x1f
 	.2byte	0x3aa
-	.4byte	0x47bd
+	.4byte	0x47d2
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1285
+	.4byte	.LASF1286
 	.byte	0x1f
 	.2byte	0x3ab
-	.4byte	0x7e7c
+	.4byte	0x7e91
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF1286
+	.4byte	.LASF1287
 	.byte	0x1f
 	.2byte	0x3ad
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF1287
+	.4byte	.LASF1288
 	.byte	0x1f
 	.2byte	0x3af
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF1236
+	.4byte	.LASF1237
 	.byte	0x1f
 	.2byte	0x3b2
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0xc8
 	.uleb128 0x1b
-	.4byte	.LASF1288
+	.4byte	.LASF1289
 	.byte	0x1f
 	.2byte	0x3b6
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0xd0
 	.uleb128 0x1b
-	.4byte	.LASF1289
+	.4byte	.LASF1290
 	.byte	0x1f
 	.2byte	0x3b7
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0xe0
 	.uleb128 0x1b
-	.4byte	.LASF1290
+	.4byte	.LASF1291
 	.byte	0x1f
 	.2byte	0x3b9
-	.4byte	0x5161
+	.4byte	0x5176
 	.byte	0xf0
 	.uleb128 0x1b
-	.4byte	.LASF1291
+	.4byte	.LASF1292
 	.byte	0x1f
 	.2byte	0x3ba
-	.4byte	0x5db0
+	.4byte	0x5dc5
 	.byte	0xf8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x5422
+	.4byte	0x5437
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5422
+	.4byte	0x5437
 	.uleb128 0x2a
-	.4byte	.LASF981
+	.4byte	.LASF982
 	.byte	0
 	.byte	0x5a
 	.2byte	0x105
@@ -20979,15 +20966,15 @@ __exitcall_ebc_exit:
 	.byte	0x20
 	.byte	0x5a
 	.2byte	0x131
-	.4byte	0x5579
+	.4byte	0x558e
 	.uleb128 0x2b
 	.string	"rb"
 	.byte	0x5a
 	.2byte	0x132
-	.4byte	0x34cd
+	.4byte	0x34e2
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1292
+	.4byte	.LASF1293
 	.byte	0x5a
 	.2byte	0x133
 	.4byte	0x29
@@ -20997,233 +20984,233 @@ __exitcall_ebc_exit:
 	.byte	0x20
 	.byte	0x5a
 	.2byte	0x130
-	.4byte	0x559b
+	.4byte	0x55b0
 	.uleb128 0x41
-	.4byte	.LASF1293
+	.4byte	.LASF1294
 	.byte	0x5a
 	.2byte	0x134
-	.4byte	0x5556
+	.4byte	0x556b
 	.uleb128 0x41
-	.4byte	.LASF1294
+	.4byte	.LASF1295
 	.byte	0x5a
 	.2byte	0x135
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF975
+	.4byte	.LASF976
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x559b
+	.4byte	0x55b0
 	.uleb128 0x1d
-	.4byte	.LASF1295
+	.4byte	.LASF1296
 	.byte	0x88
 	.byte	0x76
 	.2byte	0x195
-	.4byte	0x5691
+	.4byte	0x56a6
 	.uleb128 0x1b
-	.4byte	.LASF110
+	.4byte	.LASF111
 	.byte	0x76
 	.2byte	0x196
-	.4byte	0xc9e2
+	.4byte	0xc9fd
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1296
+	.4byte	.LASF1297
 	.byte	0x76
 	.2byte	0x197
-	.4byte	0xc9e2
+	.4byte	0xc9fd
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1297
+	.4byte	.LASF1298
 	.byte	0x76
 	.2byte	0x198
-	.4byte	0xc9fc
+	.4byte	0xca17
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1298
+	.4byte	.LASF1299
 	.byte	0x76
 	.2byte	0x199
-	.4byte	0xca11
+	.4byte	0xca2c
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1299
+	.4byte	.LASF1300
 	.byte	0x76
 	.2byte	0x19a
-	.4byte	0xca26
+	.4byte	0xca41
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1300
+	.4byte	.LASF1301
 	.byte	0x76
 	.2byte	0x19b
-	.4byte	0xca40
+	.4byte	0xca5b
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1301
+	.4byte	.LASF1302
 	.byte	0x76
 	.2byte	0x19d
-	.4byte	0xca5b
+	.4byte	0xca76
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1302
+	.4byte	.LASF1303
 	.byte	0x76
 	.2byte	0x19f
-	.4byte	0xca70
+	.4byte	0xca8b
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1303
+	.4byte	.LASF1304
 	.byte	0x76
 	.2byte	0x1a3
-	.4byte	0xca26
+	.4byte	0xca41
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1304
+	.4byte	.LASF1305
 	.byte	0x76
 	.2byte	0x1a6
-	.4byte	0xca26
+	.4byte	0xca41
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1305
+	.4byte	.LASF1306
 	.byte	0x76
 	.2byte	0x1ab
-	.4byte	0xca99
+	.4byte	0xcab4
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0x76
 	.2byte	0x1b1
-	.4byte	0xcaae
+	.4byte	0xcac9
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1306
+	.4byte	.LASF1307
 	.byte	0x76
 	.2byte	0x1cf
-	.4byte	0xcac8
+	.4byte	0xcae3
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x76
 	.2byte	0x1d2
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x76
 	.2byte	0x1d3
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x76
 	.2byte	0x1d4
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x76
 	.2byte	0x1d5
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x80
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x55a6
+	.4byte	0x55bb
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5691
+	.4byte	0x56a6
 	.uleb128 0x1d
-	.4byte	.LASF1307
+	.4byte	.LASF1308
 	.byte	0x10
 	.byte	0x5a
 	.2byte	0x15a
-	.4byte	0x56c4
+	.4byte	0x56d9
 	.uleb128 0x1b
-	.4byte	.LASF758
+	.4byte	.LASF759
 	.byte	0x5a
 	.2byte	0x15b
-	.4byte	0x2ef0
+	.4byte	0x2f05
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF63
+	.4byte	.LASF64
 	.byte	0x5a
 	.2byte	0x15c
-	.4byte	0x56c4
+	.4byte	0x56d9
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x569c
+	.4byte	0x56b1
 	.uleb128 0x1d
-	.4byte	.LASF1308
+	.4byte	.LASF1309
 	.byte	0x38
 	.byte	0x5a
 	.2byte	0x15f
-	.4byte	0x56ff
+	.4byte	0x5714
 	.uleb128 0x1b
-	.4byte	.LASF1309
+	.4byte	.LASF1310
 	.byte	0x5a
 	.2byte	0x160
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1310
+	.4byte	.LASF1311
 	.byte	0x5a
 	.2byte	0x161
-	.4byte	0x569c
+	.4byte	0x56b1
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1311
+	.4byte	.LASF1312
 	.byte	0x5a
 	.2byte	0x162
-	.4byte	0x463e
+	.4byte	0x4653
 	.byte	0x18
 	.byte	0
 	.uleb128 0x45
 	.2byte	0x378
 	.byte	0x5a
 	.2byte	0x167
-	.4byte	0x59c6
+	.4byte	0x59db
 	.uleb128 0x1b
-	.4byte	.LASF108
+	.4byte	.LASF109
 	.byte	0x5a
 	.2byte	0x168
-	.4byte	0x3ca0
+	.4byte	0x3cb5
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1312
+	.4byte	.LASF1313
 	.byte	0x5a
 	.2byte	0x169
-	.4byte	0x3504
+	.4byte	0x3519
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1313
+	.4byte	.LASF1314
 	.byte	0x5a
 	.2byte	0x16a
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF117
+	.4byte	.LASF118
 	.byte	0x5a
 	.2byte	0x16c
-	.4byte	0x59e9
+	.4byte	0x59fe
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1314
+	.4byte	.LASF1315
 	.byte	0x5a
 	.2byte	0x170
 	.4byte	0x29
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1315
+	.4byte	.LASF1316
 	.byte	0x5a
 	.2byte	0x171
 	.4byte	0x29
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1316
+	.4byte	.LASF1317
 	.byte	0x5a
 	.2byte	0x177
 	.4byte	0x29
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1317
+	.4byte	.LASF1318
 	.byte	0x5a
 	.2byte	0x178
 	.4byte	0x29
@@ -21232,136 +21219,136 @@ __exitcall_ebc_exit:
 	.string	"pgd"
 	.byte	0x5a
 	.2byte	0x179
-	.4byte	0x59ef
+	.4byte	0x5a04
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1318
+	.4byte	.LASF1319
 	.byte	0x5a
 	.2byte	0x184
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1319
+	.4byte	.LASF1320
 	.byte	0x5a
 	.2byte	0x18d
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0x4c
 	.uleb128 0x1b
-	.4byte	.LASF1320
+	.4byte	.LASF1321
 	.byte	0x5a
 	.2byte	0x190
-	.4byte	0x543
+	.4byte	0x558
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1321
+	.4byte	.LASF1322
 	.byte	0x5a
 	.2byte	0x192
 	.4byte	0xc6
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1322
+	.4byte	.LASF1323
 	.byte	0x5a
 	.2byte	0x194
-	.4byte	0xe50
+	.4byte	0xe65
 	.byte	0x5c
 	.uleb128 0x1b
-	.4byte	.LASF1323
+	.4byte	.LASF1324
 	.byte	0x5a
 	.2byte	0x197
-	.4byte	0x4e21
+	.4byte	0x4e36
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1324
+	.4byte	.LASF1325
 	.byte	0x5a
 	.2byte	0x199
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1325
+	.4byte	.LASF1326
 	.byte	0x5a
 	.2byte	0x1a0
 	.4byte	0x29
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF1326
+	.4byte	.LASF1327
 	.byte	0x5a
 	.2byte	0x1a1
 	.4byte	0x29
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF1327
+	.4byte	.LASF1328
 	.byte	0x5a
 	.2byte	0x1a3
 	.4byte	0x29
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF959
+	.4byte	.LASF960
 	.byte	0x5a
 	.2byte	0x1a4
 	.4byte	0x29
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF1328
+	.4byte	.LASF1329
 	.byte	0x5a
 	.2byte	0x1a5
 	.4byte	0x29
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF1329
+	.4byte	.LASF1330
 	.byte	0x5a
 	.2byte	0x1a6
 	.4byte	0x29
 	.byte	0xc8
 	.uleb128 0x1b
-	.4byte	.LASF1330
+	.4byte	.LASF1331
 	.byte	0x5a
 	.2byte	0x1a7
 	.4byte	0x29
 	.byte	0xd0
 	.uleb128 0x1b
-	.4byte	.LASF1331
+	.4byte	.LASF1332
 	.byte	0x5a
 	.2byte	0x1a8
 	.4byte	0x29
 	.byte	0xd8
 	.uleb128 0x1b
-	.4byte	.LASF1332
+	.4byte	.LASF1333
 	.byte	0x5a
 	.2byte	0x1a9
 	.4byte	0x29
 	.byte	0xe0
 	.uleb128 0x1b
-	.4byte	.LASF1333
+	.4byte	.LASF1334
 	.byte	0x5a
 	.2byte	0x1ab
-	.4byte	0xe50
+	.4byte	0xe65
 	.byte	0xe8
 	.uleb128 0x1b
-	.4byte	.LASF1334
+	.4byte	.LASF1335
 	.byte	0x5a
 	.2byte	0x1ac
 	.4byte	0x29
 	.byte	0xf0
 	.uleb128 0x1b
-	.4byte	.LASF1335
+	.4byte	.LASF1336
 	.byte	0x5a
 	.2byte	0x1ac
 	.4byte	0x29
 	.byte	0xf8
 	.uleb128 0x1c
-	.4byte	.LASF1336
+	.4byte	.LASF1337
 	.byte	0x5a
 	.2byte	0x1ac
 	.4byte	0x29
 	.2byte	0x100
 	.uleb128 0x1c
-	.4byte	.LASF1337
+	.4byte	.LASF1338
 	.byte	0x5a
 	.2byte	0x1ac
 	.4byte	0x29
 	.2byte	0x108
 	.uleb128 0x1c
-	.4byte	.LASF1338
+	.4byte	.LASF1339
 	.byte	0x5a
 	.2byte	0x1ad
 	.4byte	0x29
@@ -21373,131 +21360,131 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.2byte	0x118
 	.uleb128 0x1c
-	.4byte	.LASF1339
+	.4byte	.LASF1340
 	.byte	0x5a
 	.2byte	0x1ad
 	.4byte	0x29
 	.2byte	0x120
 	.uleb128 0x1c
-	.4byte	.LASF1340
+	.4byte	.LASF1341
 	.byte	0x5a
 	.2byte	0x1ae
 	.4byte	0x29
 	.2byte	0x128
 	.uleb128 0x1c
-	.4byte	.LASF1341
+	.4byte	.LASF1342
 	.byte	0x5a
 	.2byte	0x1ae
 	.4byte	0x29
 	.2byte	0x130
 	.uleb128 0x1c
-	.4byte	.LASF1342
+	.4byte	.LASF1343
 	.byte	0x5a
 	.2byte	0x1ae
 	.4byte	0x29
 	.2byte	0x138
 	.uleb128 0x1c
-	.4byte	.LASF1343
+	.4byte	.LASF1344
 	.byte	0x5a
 	.2byte	0x1ae
 	.4byte	0x29
 	.2byte	0x140
 	.uleb128 0x1c
-	.4byte	.LASF1344
+	.4byte	.LASF1345
 	.byte	0x5a
 	.2byte	0x1b0
-	.4byte	0x59f5
+	.4byte	0x5a0a
 	.2byte	0x148
 	.uleb128 0x1c
-	.4byte	.LASF617
+	.4byte	.LASF618
 	.byte	0x5a
 	.2byte	0x1b6
-	.4byte	0x3e00
+	.4byte	0x3e15
 	.2byte	0x2b8
 	.uleb128 0x1c
-	.4byte	.LASF1345
+	.4byte	.LASF1346
 	.byte	0x5a
 	.2byte	0x1b8
-	.4byte	0x5a0a
+	.4byte	0x5a1f
 	.2byte	0x2e0
 	.uleb128 0x1c
-	.4byte	.LASF1346
+	.4byte	.LASF1347
 	.byte	0x5a
 	.2byte	0x1bb
-	.4byte	0x4fb2
+	.4byte	0x4fc7
 	.2byte	0x2e8
 	.uleb128 0x1c
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x5a
 	.2byte	0x1bd
 	.4byte	0x29
 	.2byte	0x300
 	.uleb128 0x1c
-	.4byte	.LASF1308
+	.4byte	.LASF1309
 	.byte	0x5a
 	.2byte	0x1bf
-	.4byte	0x5a10
+	.4byte	0x5a25
 	.2byte	0x308
 	.uleb128 0x1c
-	.4byte	.LASF1347
+	.4byte	.LASF1348
 	.byte	0x5a
 	.2byte	0x1c1
-	.4byte	0x367
+	.4byte	0x37c
 	.2byte	0x310
 	.uleb128 0x1c
-	.4byte	.LASF1348
+	.4byte	.LASF1349
 	.byte	0x5a
 	.2byte	0x1c4
-	.4byte	0xe50
+	.4byte	0xe65
 	.2byte	0x314
 	.uleb128 0x1c
-	.4byte	.LASF1349
+	.4byte	.LASF1350
 	.byte	0x5a
 	.2byte	0x1c5
-	.4byte	0x5a1b
+	.4byte	0x5a30
 	.2byte	0x318
 	.uleb128 0x1c
-	.4byte	.LASF97
+	.4byte	.LASF98
 	.byte	0x5a
 	.2byte	0x1d2
-	.4byte	0x2ef0
+	.4byte	0x2f05
 	.2byte	0x320
 	.uleb128 0x1c
-	.4byte	.LASF1118
+	.4byte	.LASF1119
 	.byte	0x5a
 	.2byte	0x1d4
-	.4byte	0x5a21
+	.4byte	0x5a36
 	.2byte	0x328
 	.uleb128 0x1c
-	.4byte	.LASF1350
+	.4byte	.LASF1351
 	.byte	0x5a
 	.2byte	0x1d7
-	.4byte	0x5547
+	.4byte	0x555c
 	.2byte	0x330
 	.uleb128 0x1c
-	.4byte	.LASF1351
+	.4byte	.LASF1352
 	.byte	0x5a
 	.2byte	0x1f1
-	.4byte	0x367
+	.4byte	0x37c
 	.2byte	0x338
 	.uleb128 0x1c
-	.4byte	.LASF1213
+	.4byte	.LASF1214
 	.byte	0x5a
 	.2byte	0x1f6
-	.4byte	0x4f62
+	.4byte	0x4f77
 	.2byte	0x340
 	.uleb128 0x1c
-	.4byte	.LASF1352
+	.4byte	.LASF1353
 	.byte	0x5a
 	.2byte	0x1fa
-	.4byte	0x31f6
+	.4byte	0x320b
 	.2byte	0x348
 	.byte	0
 	.uleb128 0x14
 	.4byte	0x29
-	.4byte	0x59e9
+	.4byte	0x59fe
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
@@ -21509,82 +21496,82 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x59c6
+	.4byte	0x59db
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x33fe
+	.4byte	0x3413
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0x5a05
+	.4byte	0x5a1a
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2d
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1353
+	.4byte	.LASF1354
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5a05
+	.4byte	0x5a1a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x56ca
+	.4byte	0x56df
 	.uleb128 0x24
-	.4byte	.LASF1354
+	.4byte	.LASF1355
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5a16
+	.4byte	0x5a2b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x23d6
+	.4byte	0x23eb
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0x5a36
+	.4byte	0x5a4b
 	.uleb128 0x44
 	.4byte	0x4f
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF1355
+	.4byte	.LASF1356
 	.byte	0x5a
 	.2byte	0x209
-	.4byte	0x45ff
+	.4byte	0x4614
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3454
+	.4byte	0x3469
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5a4e
+	.4byte	0x5a63
 	.uleb128 0x1d
-	.4byte	.LASF1356
+	.4byte	.LASF1357
 	.byte	0x68
 	.byte	0x76
 	.2byte	0x163
-	.4byte	0x5b12
+	.4byte	0x5b27
 	.uleb128 0x2b
 	.string	"vma"
 	.byte	0x76
 	.2byte	0x164
-	.4byte	0x3ca0
+	.4byte	0x3cb5
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x76
 	.2byte	0x165
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1170
+	.4byte	.LASF1171
 	.byte	0x76
 	.2byte	0x166
-	.4byte	0x31b
+	.4byte	0x330
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF1357
+	.4byte	.LASF1358
 	.byte	0x76
 	.2byte	0x167
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1358
+	.4byte	.LASF1359
 	.byte	0x76
 	.2byte	0x168
 	.4byte	0x29
@@ -21593,453 +21580,453 @@ __exitcall_ebc_exit:
 	.string	"pmd"
 	.byte	0x76
 	.2byte	0x169
-	.4byte	0xc8a3
+	.4byte	0xc8be
 	.byte	0x20
 	.uleb128 0x2b
 	.string	"pud"
 	.byte	0x76
 	.2byte	0x16b
-	.4byte	0xc9a7
+	.4byte	0xc9c2
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1359
+	.4byte	.LASF1360
 	.byte	0x76
 	.2byte	0x16e
-	.4byte	0x33be
+	.4byte	0x33d3
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1360
+	.4byte	.LASF1361
 	.byte	0x76
 	.2byte	0x170
-	.4byte	0x3454
+	.4byte	0x3469
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1173
+	.4byte	.LASF1174
 	.byte	0x76
 	.2byte	0x171
-	.4byte	0x495c
+	.4byte	0x4971
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF844
+	.4byte	.LASF845
 	.byte	0x76
 	.2byte	0x172
-	.4byte	0x3454
+	.4byte	0x3469
 	.byte	0x48
 	.uleb128 0x2b
 	.string	"pte"
 	.byte	0x76
 	.2byte	0x178
-	.4byte	0xc9ad
+	.4byte	0xc9c8
 	.byte	0x50
 	.uleb128 0x2b
 	.string	"ptl"
 	.byte	0x76
 	.2byte	0x17c
-	.4byte	0x4d24
+	.4byte	0x4d39
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1361
+	.4byte	.LASF1362
 	.byte	0x76
 	.2byte	0x180
-	.4byte	0x3449
+	.4byte	0x345e
 	.byte	0x60
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1362
+	.4byte	.LASF1363
 	.byte	0x77
 	.byte	0x16
 	.4byte	0xc6
 	.uleb128 0xd
-	.4byte	.LASF1363
+	.4byte	.LASF1364
 	.byte	0x8
 	.byte	0x77
 	.byte	0x18
-	.4byte	0x5b36
+	.4byte	0x5b4b
 	.uleb128 0x20
 	.string	"cap"
 	.byte	0x77
 	.byte	0x19
-	.4byte	0xce4
+	.4byte	0xcf9
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1364
+	.4byte	.LASF1365
 	.byte	0x77
 	.byte	0x1a
-	.4byte	0x5b1d
+	.4byte	0x5b32
 	.uleb128 0x3
-	.4byte	0x5b36
+	.4byte	0x5b4b
 	.uleb128 0x19
-	.4byte	.LASF1365
+	.4byte	.LASF1366
 	.byte	0x77
 	.byte	0x2d
-	.4byte	0x5b41
+	.4byte	0x5b56
 	.uleb128 0x19
-	.4byte	.LASF1366
+	.4byte	.LASF1367
 	.byte	0x77
 	.byte	0x2e
-	.4byte	0x5b41
+	.4byte	0x5b56
 	.uleb128 0xd
-	.4byte	.LASF1367
+	.4byte	.LASF1368
 	.byte	0x18
 	.byte	0x78
 	.byte	0x10
-	.4byte	0x5b8d
+	.4byte	0x5ba2
 	.uleb128 0xe
-	.4byte	.LASF115
+	.4byte	.LASF116
 	.byte	0x78
 	.byte	0x11
-	.4byte	0xe1e
+	.4byte	0xe33
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF382
+	.4byte	.LASF383
 	.byte	0x78
 	.byte	0x12
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF575
+	.4byte	.LASF576
 	.byte	0x78
 	.byte	0x13
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x8
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1368
+	.4byte	.LASF1369
 	.byte	0x38
 	.byte	0x79
 	.byte	0x11
-	.4byte	0x5be2
+	.4byte	0x5bf7
 	.uleb128 0xe
-	.4byte	.LASF1369
+	.4byte	.LASF1370
 	.byte	0x79
 	.byte	0x12
-	.4byte	0xef
+	.4byte	0xf4
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1370
+	.4byte	.LASF1371
 	.byte	0x79
 	.byte	0x14
-	.4byte	0xef
+	.4byte	0xf4
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1371
+	.4byte	.LASF1372
 	.byte	0x79
 	.byte	0x16
-	.4byte	0xef
+	.4byte	0xf4
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1372
+	.4byte	.LASF1373
 	.byte	0x79
 	.byte	0x17
-	.4byte	0x5be2
+	.4byte	0x5bf7
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1373
+	.4byte	.LASF1374
 	.byte	0x79
 	.byte	0x18
 	.4byte	0xd2
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1374
+	.4byte	.LASF1375
 	.byte	0x79
 	.byte	0x19
-	.4byte	0xc93
+	.4byte	0xca8
 	.byte	0x2c
 	.byte	0
 	.uleb128 0x5
-	.4byte	0xef
-	.4byte	0x5bf2
+	.4byte	0xf4
+	.4byte	0x5c07
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF1375
+	.4byte	.LASF1376
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x7a
 	.byte	0xf
-	.4byte	0x5c1b
+	.4byte	0x5c30
 	.uleb128 0xc
-	.4byte	.LASF1376
+	.4byte	.LASF1377
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1377
+	.4byte	.LASF1378
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1378
+	.4byte	.LASF1379
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF1379
+	.4byte	.LASF1380
 	.byte	0x3
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1380
+	.4byte	.LASF1381
 	.byte	0x8
 	.byte	0x7b
 	.byte	0x14
-	.4byte	0x5c34
+	.4byte	0x5c49
 	.uleb128 0xe
-	.4byte	.LASF758
+	.4byte	.LASF759
 	.byte	0x7b
 	.byte	0x15
-	.4byte	0x2ef0
+	.4byte	0x2f05
 	.byte	0
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF1381
+	.4byte	.LASF1382
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x7c
 	.byte	0x1d
-	.4byte	0x5c57
+	.4byte	0x5c6c
 	.uleb128 0xc
-	.4byte	.LASF1382
+	.4byte	.LASF1383
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1383
+	.4byte	.LASF1384
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1384
+	.4byte	.LASF1385
 	.byte	0x2
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1385
+	.4byte	.LASF1386
 	.byte	0x40
 	.byte	0x7c
 	.byte	0x20
-	.4byte	0x5cac
+	.4byte	0x5cc1
 	.uleb128 0xe
-	.4byte	.LASF1386
+	.4byte	.LASF1387
 	.byte	0x7c
 	.byte	0x21
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1387
+	.4byte	.LASF1388
 	.byte	0x7c
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1388
+	.4byte	.LASF1389
 	.byte	0x7c
 	.byte	0x23
-	.4byte	0x15aa
+	.4byte	0x15bf
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1389
+	.4byte	.LASF1390
 	.byte	0x7c
 	.byte	0x25
 	.4byte	0xc6
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1390
+	.4byte	.LASF1391
 	.byte	0x7c
 	.byte	0x26
-	.4byte	0x407
+	.4byte	0x41c
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1391
+	.4byte	.LASF1392
 	.byte	0x7c
 	.byte	0x28
-	.4byte	0x5c34
+	.4byte	0x5c49
 	.byte	0x38
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1392
+	.4byte	.LASF1393
 	.byte	0x88
 	.byte	0x7d
 	.byte	0xc
-	.4byte	0x5cf5
+	.4byte	0x5d0a
 	.uleb128 0x20
 	.string	"rss"
 	.byte	0x7d
 	.byte	0xd
-	.4byte	0x5c57
+	.4byte	0x5c6c
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1393
+	.4byte	.LASF1394
 	.byte	0x7d
 	.byte	0xe
-	.4byte	0x355e
+	.4byte	0x3573
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF1394
+	.4byte	.LASF1395
 	.byte	0x7d
 	.byte	0xf
-	.4byte	0x4e21
+	.4byte	0x4e36
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF1395
+	.4byte	.LASF1396
 	.byte	0x7d
 	.byte	0x10
-	.4byte	0x5c1b
+	.4byte	0x5c30
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF1396
+	.4byte	.LASF1397
 	.byte	0x7d
 	.byte	0x11
 	.4byte	0xc6
 	.byte	0x80
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1397
+	.4byte	.LASF1398
 	.byte	0x10
 	.byte	0x7e
 	.byte	0xa
-	.4byte	0x5d19
+	.4byte	0x5d2e
 	.uleb128 0x20
 	.string	"fn"
 	.byte	0x7e
 	.byte	0xb
-	.4byte	0x2f20
+	.4byte	0x2f35
 	.byte	0
 	.uleb128 0x20
 	.string	"arg"
 	.byte	0x7e
 	.byte	0xc
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x8
 	.byte	0
 	.uleb128 0xf
 	.byte	0x10
 	.byte	0x7f
 	.byte	0x17
-	.4byte	0x5d2c
+	.4byte	0x5d41
 	.uleb128 0x20
 	.string	"b"
 	.byte	0x7f
 	.byte	0x18
-	.4byte	0x5d2c
+	.4byte	0x5d41
 	.byte	0
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x8b
-	.4byte	0x5d3c
+	.4byte	0x5d51
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1398
+	.4byte	.LASF1399
 	.byte	0x7f
 	.byte	0x19
-	.4byte	0x5d19
+	.4byte	0x5d2e
 	.uleb128 0x3
-	.4byte	0x5d3c
+	.4byte	0x5d51
 	.uleb128 0xf
 	.byte	0x10
 	.byte	0x80
 	.byte	0x18
-	.4byte	0x5d5f
+	.4byte	0x5d74
 	.uleb128 0x20
 	.string	"b"
 	.byte	0x80
 	.byte	0x19
-	.4byte	0x5d2c
+	.4byte	0x5d41
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1399
+	.4byte	.LASF1400
 	.byte	0x80
 	.byte	0x1a
-	.4byte	0x5d4c
+	.4byte	0x5d61
 	.uleb128 0x3
-	.4byte	0x5d5f
+	.4byte	0x5d74
 	.uleb128 0x19
-	.4byte	.LASF1400
+	.4byte	.LASF1401
 	.byte	0x80
 	.byte	0x29
-	.4byte	0x5d47
+	.4byte	0x5d5c
 	.uleb128 0x19
-	.4byte	.LASF1401
+	.4byte	.LASF1402
 	.byte	0x80
 	.byte	0x2a
-	.4byte	0x5d6a
+	.4byte	0x5d7f
 	.uleb128 0x5
-	.4byte	0x115
-	.4byte	0x5d95
+	.4byte	0x11a
+	.4byte	0x5daa
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x5d85
+	.4byte	0x5d9a
 	.uleb128 0x19
-	.4byte	.LASF1402
+	.4byte	.LASF1403
 	.byte	0x80
 	.byte	0x51
-	.4byte	0x5d95
+	.4byte	0x5daa
 	.uleb128 0x19
-	.4byte	.LASF1403
+	.4byte	.LASF1404
 	.byte	0x80
 	.byte	0x52
-	.4byte	0x5d95
+	.4byte	0x5daa
 	.uleb128 0x8
-	.4byte	.LASF1404
+	.4byte	.LASF1405
 	.byte	0x81
 	.byte	0x8
-	.4byte	0x13a
+	.4byte	0x13f
 	.uleb128 0x21
 	.byte	0x10
 	.byte	0x6b
 	.byte	0x53
-	.4byte	0x5dda
+	.4byte	0x5def
 	.uleb128 0x22
-	.4byte	.LASF1405
+	.4byte	.LASF1406
 	.byte	0x6b
 	.byte	0x54
-	.4byte	0x392
+	.4byte	0x3a7
 	.uleb128 0x22
-	.4byte	.LASF1406
+	.4byte	.LASF1407
 	.byte	0x6b
 	.byte	0x55
-	.4byte	0x5239
+	.4byte	0x524e
 	.byte	0
 	.uleb128 0x21
 	.byte	0x10
 	.byte	0x6b
 	.byte	0x57
-	.4byte	0x5df9
+	.4byte	0x5e0e
 	.uleb128 0x22
-	.4byte	.LASF1407
+	.4byte	.LASF1408
 	.byte	0x6b
 	.byte	0x58
-	.4byte	0x3d6
+	.4byte	0x3eb
 	.uleb128 0x22
-	.4byte	.LASF1408
+	.4byte	.LASF1409
 	.byte	0x6b
 	.byte	0x59
-	.4byte	0x407
+	.4byte	0x41c
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1409
+	.4byte	.LASF1410
 	.byte	0x38
 	.byte	0x6b
 	.byte	0x49
-	.4byte	0x5e34
+	.4byte	0x5e49
 	.uleb128 0x20
 	.string	"q"
 	.byte	0x6b
 	.byte	0x4a
-	.4byte	0x4967
+	.4byte	0x497c
 	.byte	0
 	.uleb128 0x20
 	.string	"ioc"
 	.byte	0x6b
 	.byte	0x4b
-	.4byte	0x48e8
+	.4byte	0x48fd
 	.byte	0x8
 	.uleb128 0x23
-	.4byte	0x5dbb
+	.4byte	0x5dd0
 	.byte	0x10
 	.uleb128 0x23
-	.4byte	0x5dda
+	.4byte	0x5def
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x6b
 	.byte	0x5c
 	.4byte	0x6d
@@ -22047,1057 +22034,1057 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5df9
+	.4byte	0x5e0e
 	.uleb128 0x19
-	.4byte	.LASF1410
+	.4byte	.LASF1411
 	.byte	0x82
 	.byte	0xb
 	.4byte	0x6d
 	.uleb128 0xd
-	.4byte	.LASF1411
+	.4byte	.LASF1412
 	.byte	0x18
 	.byte	0x83
 	.byte	0x5c
-	.4byte	0x5e76
+	.4byte	0x5e8b
 	.uleb128 0xe
-	.4byte	.LASF1412
+	.4byte	.LASF1413
 	.byte	0x83
 	.byte	0x5d
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1413
+	.4byte	.LASF1414
 	.byte	0x83
 	.byte	0x5e
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1414
+	.4byte	.LASF1415
 	.byte	0x83
 	.byte	0x5f
 	.4byte	0x29
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1415
+	.4byte	.LASF1416
 	.byte	0x38
 	.byte	0x83
 	.byte	0x62
-	.4byte	0x5ea7
+	.4byte	0x5ebc
 	.uleb128 0xe
-	.4byte	.LASF1416
+	.4byte	.LASF1417
 	.byte	0x83
 	.byte	0x63
-	.4byte	0x194
+	.4byte	0x199
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF392
+	.4byte	.LASF393
 	.byte	0x83
 	.byte	0x64
-	.4byte	0x194
+	.4byte	0x199
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF395
+	.4byte	.LASF396
 	.byte	0x83
 	.byte	0x65
-	.4byte	0x5ea7
+	.4byte	0x5ebc
 	.byte	0x10
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x194
-	.4byte	0x5eb7
+	.4byte	0x199
+	.4byte	0x5ecc
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x4
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1417
+	.4byte	.LASF1418
 	.byte	0x1f
 	.byte	0x49
-	.4byte	0x5e45
+	.4byte	0x5e5a
 	.uleb128 0x19
-	.4byte	.LASF1418
+	.4byte	.LASF1419
 	.byte	0x1f
 	.byte	0x4b
 	.4byte	0x6d
 	.uleb128 0x19
-	.4byte	.LASF1419
+	.4byte	.LASF1420
 	.byte	0x1f
 	.byte	0x4c
-	.4byte	0x5e76
+	.4byte	0x5e8b
 	.uleb128 0x19
-	.4byte	.LASF1420
+	.4byte	.LASF1421
 	.byte	0x1f
 	.byte	0x4d
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF1421
+	.4byte	.LASF1422
 	.byte	0x1f
 	.byte	0x4d
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF1422
+	.4byte	.LASF1423
 	.byte	0x1f
 	.byte	0x4e
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF1423
+	.4byte	.LASF1424
 	.byte	0x1f
 	.byte	0x4f
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF1424
+	.4byte	.LASF1425
 	.byte	0x1f
 	.byte	0x50
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF1425
+	.4byte	.LASF1426
 	.byte	0x1f
 	.byte	0x51
 	.4byte	0xc6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5f20
+	.4byte	0x5f35
 	.uleb128 0x1d
-	.4byte	.LASF1426
+	.4byte	.LASF1427
 	.byte	0x28
 	.byte	0x1f
 	.2byte	0x137
-	.4byte	0x5f89
+	.4byte	0x5f9e
 	.uleb128 0x1b
-	.4byte	.LASF1427
+	.4byte	.LASF1428
 	.byte	0x1f
 	.2byte	0x138
-	.4byte	0x5547
+	.4byte	0x555c
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1428
+	.4byte	.LASF1429
 	.byte	0x1f
 	.2byte	0x13d
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1429
+	.4byte	.LASF1430
 	.byte	0x1f
 	.2byte	0x13e
-	.4byte	0x7638
+	.4byte	0x764d
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF359
+	.4byte	.LASF360
 	.byte	0x1f
 	.2byte	0x13f
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1430
+	.4byte	.LASF1431
 	.byte	0x1f
 	.2byte	0x140
 	.4byte	0xc6
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1431
+	.4byte	.LASF1432
 	.byte	0x1f
 	.2byte	0x141
-	.4byte	0x11a
+	.4byte	0x11f
 	.byte	0x24
 	.uleb128 0x1b
-	.4byte	.LASF1432
+	.4byte	.LASF1433
 	.byte	0x1f
 	.2byte	0x142
-	.4byte	0x11a
+	.4byte	0x11f
 	.byte	0x26
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1433
+	.4byte	.LASF1434
 	.byte	0x50
 	.byte	0x1f
 	.byte	0xd9
-	.4byte	0x6002
+	.4byte	0x6017
 	.uleb128 0xe
-	.4byte	.LASF1434
+	.4byte	.LASF1435
 	.byte	0x1f
 	.byte	0xda
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1435
+	.4byte	.LASF1436
 	.byte	0x1f
 	.byte	0xdb
-	.4byte	0x27a
+	.4byte	0x28f
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1436
+	.4byte	.LASF1437
 	.byte	0x1f
 	.byte	0xdc
-	.4byte	0x23fb
+	.4byte	0x2410
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1437
+	.4byte	.LASF1438
 	.byte	0x1f
 	.byte	0xdd
-	.4byte	0x241b
+	.4byte	0x2430
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF1438
+	.4byte	.LASF1439
 	.byte	0x1f
 	.byte	0xde
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1439
+	.4byte	.LASF1440
 	.byte	0x1f
 	.byte	0xdf
-	.4byte	0xa12
+	.4byte	0xa27
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1440
+	.4byte	.LASF1441
 	.byte	0x1f
 	.byte	0xe0
-	.4byte	0xa12
+	.4byte	0xa27
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1441
+	.4byte	.LASF1442
 	.byte	0x1f
 	.byte	0xe1
-	.4byte	0xa12
+	.4byte	0xa27
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF1442
+	.4byte	.LASF1443
 	.byte	0x1f
 	.byte	0xe8
-	.4byte	0x5547
+	.4byte	0x555c
 	.byte	0x48
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x21f
-	.4byte	0x6012
+	.4byte	0x224
+	.4byte	0x6027
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x5
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x6002
+	.4byte	0x6017
 	.uleb128 0x19
-	.4byte	.LASF1443
+	.4byte	.LASF1444
 	.byte	0x84
 	.byte	0x45
-	.4byte	0x6012
+	.4byte	0x6027
 	.uleb128 0x19
-	.4byte	.LASF1444
+	.4byte	.LASF1445
 	.byte	0x84
 	.byte	0x5a
 	.4byte	0xc6
 	.uleb128 0xd
-	.4byte	.LASF1445
+	.4byte	.LASF1446
 	.byte	0x68
 	.byte	0x84
 	.byte	0x63
-	.4byte	0x6052
+	.4byte	0x6067
 	.uleb128 0xe
-	.4byte	.LASF1446
+	.4byte	.LASF1447
 	.byte	0x84
 	.byte	0x64
-	.4byte	0x6052
+	.4byte	0x6067
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1447
+	.4byte	.LASF1448
 	.byte	0x84
 	.byte	0x65
 	.4byte	0x29
 	.byte	0x60
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x392
-	.4byte	0x6062
+	.4byte	0x3a7
+	.4byte	0x6077
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x5
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1448
+	.4byte	.LASF1449
 	.byte	0
 	.byte	0x84
 	.byte	0x71
-	.4byte	0x6079
+	.4byte	0x608e
 	.uleb128 0x20
 	.string	"x"
 	.byte	0x84
 	.byte	0x72
-	.4byte	0x6079
+	.4byte	0x608e
 	.byte	0
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x6088
+	.4byte	0x609d
 	.uleb128 0x44
 	.4byte	0x4f
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF1449
+	.4byte	.LASF1450
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x84
 	.byte	0x87
-	.4byte	0x60f3
-	.uleb128 0xc
-	.4byte	.LASF1450
-	.byte	0
+	.4byte	0x6108
 	.uleb128 0xc
 	.4byte	.LASF1451
-	.byte	0x1
+	.byte	0
 	.uleb128 0xc
 	.4byte	.LASF1452
 	.byte	0x1
 	.uleb128 0xc
 	.4byte	.LASF1453
-	.byte	0x2
+	.byte	0x1
 	.uleb128 0xc
 	.4byte	.LASF1454
-	.byte	0x3
+	.byte	0x2
 	.uleb128 0xc
 	.4byte	.LASF1455
-	.byte	0x4
+	.byte	0x3
 	.uleb128 0xc
 	.4byte	.LASF1456
-	.byte	0x5
+	.byte	0x4
 	.uleb128 0xc
 	.4byte	.LASF1457
-	.byte	0x6
+	.byte	0x5
 	.uleb128 0xc
 	.4byte	.LASF1458
-	.byte	0x7
+	.byte	0x6
 	.uleb128 0xc
 	.4byte	.LASF1459
-	.byte	0x8
+	.byte	0x7
 	.uleb128 0xc
 	.4byte	.LASF1460
-	.byte	0x9
+	.byte	0x8
 	.uleb128 0xc
 	.4byte	.LASF1461
-	.byte	0xa
+	.byte	0x9
 	.uleb128 0xc
 	.4byte	.LASF1462
-	.byte	0xb
+	.byte	0xa
 	.uleb128 0xc
 	.4byte	.LASF1463
-	.byte	0xc
+	.byte	0xb
 	.uleb128 0xc
 	.4byte	.LASF1464
+	.byte	0xc
+	.uleb128 0xc
+	.4byte	.LASF1465
 	.byte	0xd
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF1465
+	.4byte	.LASF1466
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x84
 	.byte	0x9f
-	.4byte	0x61d6
-	.uleb128 0xc
-	.4byte	.LASF1466
-	.byte	0
+	.4byte	0x61eb
 	.uleb128 0xc
 	.4byte	.LASF1467
 	.byte	0
 	.uleb128 0xc
 	.4byte	.LASF1468
-	.byte	0x1
+	.byte	0
 	.uleb128 0xc
 	.4byte	.LASF1469
-	.byte	0x2
+	.byte	0x1
 	.uleb128 0xc
 	.4byte	.LASF1470
-	.byte	0x3
+	.byte	0x2
 	.uleb128 0xc
 	.4byte	.LASF1471
-	.byte	0x4
+	.byte	0x3
 	.uleb128 0xc
 	.4byte	.LASF1472
-	.byte	0x5
+	.byte	0x4
 	.uleb128 0xc
 	.4byte	.LASF1473
-	.byte	0x6
+	.byte	0x5
 	.uleb128 0xc
 	.4byte	.LASF1474
-	.byte	0x7
+	.byte	0x6
 	.uleb128 0xc
 	.4byte	.LASF1475
-	.byte	0x8
+	.byte	0x7
 	.uleb128 0xc
 	.4byte	.LASF1476
-	.byte	0x9
+	.byte	0x8
 	.uleb128 0xc
 	.4byte	.LASF1477
-	.byte	0xa
+	.byte	0x9
 	.uleb128 0xc
 	.4byte	.LASF1478
-	.byte	0xb
+	.byte	0xa
 	.uleb128 0xc
 	.4byte	.LASF1479
-	.byte	0xc
+	.byte	0xb
 	.uleb128 0xc
 	.4byte	.LASF1480
-	.byte	0xd
+	.byte	0xc
 	.uleb128 0xc
 	.4byte	.LASF1481
-	.byte	0xe
+	.byte	0xd
 	.uleb128 0xc
 	.4byte	.LASF1482
-	.byte	0xf
+	.byte	0xe
 	.uleb128 0xc
 	.4byte	.LASF1483
-	.byte	0x10
+	.byte	0xf
 	.uleb128 0xc
 	.4byte	.LASF1484
-	.byte	0x11
+	.byte	0x10
 	.uleb128 0xc
 	.4byte	.LASF1485
-	.byte	0x12
+	.byte	0x11
 	.uleb128 0xc
 	.4byte	.LASF1486
-	.byte	0x13
+	.byte	0x12
 	.uleb128 0xc
 	.4byte	.LASF1487
-	.byte	0x14
+	.byte	0x13
 	.uleb128 0xc
 	.4byte	.LASF1488
-	.byte	0x15
+	.byte	0x14
 	.uleb128 0xc
 	.4byte	.LASF1489
-	.byte	0x16
+	.byte	0x15
 	.uleb128 0xc
 	.4byte	.LASF1490
-	.byte	0x17
+	.byte	0x16
 	.uleb128 0xc
 	.4byte	.LASF1491
-	.byte	0x18
+	.byte	0x17
 	.uleb128 0xc
 	.4byte	.LASF1492
-	.byte	0x19
+	.byte	0x18
 	.uleb128 0xc
 	.4byte	.LASF1493
-	.byte	0x1a
+	.byte	0x19
 	.uleb128 0xc
 	.4byte	.LASF1494
-	.byte	0x1b
+	.byte	0x1a
 	.uleb128 0xc
 	.4byte	.LASF1495
-	.byte	0x1c
+	.byte	0x1b
 	.uleb128 0xc
 	.4byte	.LASF1496
-	.byte	0x1d
+	.byte	0x1c
 	.uleb128 0xc
 	.4byte	.LASF1497
-	.byte	0x1e
+	.byte	0x1d
 	.uleb128 0xc
 	.4byte	.LASF1498
-	.byte	0x1f
+	.byte	0x1e
 	.uleb128 0xc
 	.4byte	.LASF1499
-	.byte	0x20
+	.byte	0x1f
 	.uleb128 0xc
 	.4byte	.LASF1500
+	.byte	0x20
+	.uleb128 0xc
+	.4byte	.LASF1501
 	.byte	0x21
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1501
+	.4byte	.LASF1502
 	.byte	0x20
 	.byte	0x84
 	.byte	0xea
-	.4byte	0x61fb
+	.4byte	0x6210
 	.uleb128 0xe
-	.4byte	.LASF1502
+	.4byte	.LASF1503
 	.byte	0x84
 	.byte	0xf3
 	.4byte	0x3f
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1503
+	.4byte	.LASF1504
 	.byte	0x84
 	.byte	0xf4
 	.4byte	0x3f
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1504
+	.4byte	.LASF1505
 	.byte	0x88
 	.byte	0x84
 	.byte	0xf7
-	.4byte	0x6244
+	.4byte	0x6259
 	.uleb128 0xe
-	.4byte	.LASF1505
+	.4byte	.LASF1506
 	.byte	0x84
 	.byte	0xf8
-	.4byte	0x6244
+	.4byte	0x6259
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1506
+	.4byte	.LASF1507
 	.byte	0x84
 	.byte	0xf9
-	.4byte	0x61d6
+	.4byte	0x61eb
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF1507
+	.4byte	.LASF1508
 	.byte	0x84
 	.byte	0xfb
-	.4byte	0x543
+	.4byte	0x558
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF1508
+	.4byte	.LASF1509
 	.byte	0x84
 	.byte	0xfd
 	.4byte	0x29
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF1509
+	.4byte	.LASF1510
 	.byte	0x84
 	.byte	0xff
-	.4byte	0x63c0
+	.4byte	0x63d5
 	.byte	0x80
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x392
-	.4byte	0x6254
+	.4byte	0x3a7
+	.4byte	0x6269
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x4
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF1510
+	.4byte	.LASF1511
 	.2byte	0x1680
 	.byte	0x84
 	.2byte	0x284
-	.4byte	0x63c0
+	.4byte	0x63d5
 	.uleb128 0x1b
-	.4byte	.LASF1511
+	.4byte	.LASF1512
 	.byte	0x84
 	.2byte	0x285
-	.4byte	0x6753
+	.4byte	0x6768
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1512
+	.4byte	.LASF1513
 	.byte	0x84
 	.2byte	0x286
-	.4byte	0x6763
+	.4byte	0x6778
 	.2byte	0x1380
 	.uleb128 0x1c
-	.4byte	.LASF1513
+	.4byte	.LASF1514
 	.byte	0x84
 	.2byte	0x287
 	.4byte	0xc6
 	.2byte	0x13c0
 	.uleb128 0x1c
-	.4byte	.LASF1514
+	.4byte	.LASF1515
 	.byte	0x84
 	.2byte	0x2a0
 	.4byte	0x29
 	.2byte	0x13c8
 	.uleb128 0x1c
-	.4byte	.LASF1515
+	.4byte	.LASF1516
 	.byte	0x84
 	.2byte	0x2a1
 	.4byte	0x29
 	.2byte	0x13d0
 	.uleb128 0x1c
-	.4byte	.LASF1516
+	.4byte	.LASF1517
 	.byte	0x84
 	.2byte	0x2a2
 	.4byte	0x29
 	.2byte	0x13d8
 	.uleb128 0x1c
-	.4byte	.LASF1517
+	.4byte	.LASF1518
 	.byte	0x84
 	.2byte	0x2a4
 	.4byte	0xc6
 	.2byte	0x13e0
 	.uleb128 0x1c
-	.4byte	.LASF1518
+	.4byte	.LASF1519
 	.byte	0x84
 	.2byte	0x2a5
-	.4byte	0x15aa
+	.4byte	0x15bf
 	.2byte	0x13e8
 	.uleb128 0x1c
-	.4byte	.LASF1519
+	.4byte	.LASF1520
 	.byte	0x84
 	.2byte	0x2a6
-	.4byte	0x15aa
+	.4byte	0x15bf
 	.2byte	0x1400
 	.uleb128 0x1c
-	.4byte	.LASF1520
+	.4byte	.LASF1521
 	.byte	0x84
 	.2byte	0x2a7
-	.4byte	0x2ef0
+	.4byte	0x2f05
 	.2byte	0x1418
 	.uleb128 0x1c
-	.4byte	.LASF1521
+	.4byte	.LASF1522
 	.byte	0x84
 	.2byte	0x2a9
 	.4byte	0xc6
 	.2byte	0x1420
 	.uleb128 0x1c
-	.4byte	.LASF1522
+	.4byte	.LASF1523
 	.byte	0x84
 	.2byte	0x2aa
-	.4byte	0x64a1
+	.4byte	0x64b6
 	.2byte	0x1424
 	.uleb128 0x1c
-	.4byte	.LASF1523
+	.4byte	.LASF1524
 	.byte	0x84
 	.2byte	0x2ac
 	.4byte	0xc6
 	.2byte	0x1428
 	.uleb128 0x1c
-	.4byte	.LASF1524
+	.4byte	.LASF1525
 	.byte	0x84
 	.2byte	0x2af
 	.4byte	0xc6
 	.2byte	0x142c
 	.uleb128 0x1c
-	.4byte	.LASF1525
+	.4byte	.LASF1526
 	.byte	0x84
 	.2byte	0x2b0
-	.4byte	0x64a1
+	.4byte	0x64b6
 	.2byte	0x1430
 	.uleb128 0x1c
-	.4byte	.LASF1526
+	.4byte	.LASF1527
 	.byte	0x84
 	.2byte	0x2b1
-	.4byte	0x15aa
+	.4byte	0x15bf
 	.2byte	0x1438
 	.uleb128 0x1c
-	.4byte	.LASF1527
+	.4byte	.LASF1528
 	.byte	0x84
 	.2byte	0x2b2
-	.4byte	0x2ef0
+	.4byte	0x2f05
 	.2byte	0x1450
 	.uleb128 0x1c
-	.4byte	.LASF1528
+	.4byte	.LASF1529
 	.byte	0x84
 	.2byte	0x2b8
 	.4byte	0x29
 	.2byte	0x1458
 	.uleb128 0x1c
-	.4byte	.LASF1529
+	.4byte	.LASF1530
 	.byte	0x84
 	.2byte	0x2c3
-	.4byte	0x6062
+	.4byte	0x6077
 	.2byte	0x1480
 	.uleb128 0x1c
-	.4byte	.LASF1530
+	.4byte	.LASF1531
 	.byte	0x84
 	.2byte	0x2c4
-	.4byte	0xe50
+	.4byte	0xe65
 	.2byte	0x1480
 	.uleb128 0x1c
-	.4byte	.LASF1504
+	.4byte	.LASF1505
 	.byte	0x84
 	.2byte	0x2d7
-	.4byte	0x61fb
+	.4byte	0x6210
 	.2byte	0x1488
 	.uleb128 0x1c
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x84
 	.2byte	0x2d9
 	.4byte	0x29
 	.2byte	0x1510
 	.uleb128 0x1c
-	.4byte	.LASF1531
+	.4byte	.LASF1532
 	.byte	0x84
 	.2byte	0x2db
-	.4byte	0x6062
+	.4byte	0x6077
 	.2byte	0x1540
 	.uleb128 0x1c
-	.4byte	.LASF1532
+	.4byte	.LASF1533
 	.byte	0x84
 	.2byte	0x2de
-	.4byte	0x6773
+	.4byte	0x6788
 	.2byte	0x1540
 	.uleb128 0x1c
-	.4byte	.LASF1533
+	.4byte	.LASF1534
 	.byte	0x84
 	.2byte	0x2df
-	.4byte	0x6779
+	.4byte	0x678e
 	.2byte	0x1548
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6254
+	.4byte	0x6269
 	.uleb128 0x13
-	.4byte	.LASF1534
+	.4byte	.LASF1535
 	.byte	0x84
 	.2byte	0x110
 	.4byte	0x6d
 	.uleb128 0x1d
-	.4byte	.LASF1535
+	.4byte	.LASF1536
 	.byte	0x50
 	.byte	0x84
 	.2byte	0x11d
-	.4byte	0x6414
+	.4byte	0x6429
 	.uleb128 0x1b
-	.4byte	.LASF382
+	.4byte	.LASF383
 	.byte	0x84
 	.2byte	0x11e
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1536
+	.4byte	.LASF1537
 	.byte	0x84
 	.2byte	0x11f
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF1177
+	.4byte	.LASF1178
 	.byte	0x84
 	.2byte	0x120
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1505
+	.4byte	.LASF1506
 	.byte	0x84
 	.2byte	0x123
-	.4byte	0x6414
+	.4byte	0x6429
 	.byte	0x10
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x392
-	.4byte	0x6424
+	.4byte	0x3a7
+	.4byte	0x6439
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1537
+	.4byte	.LASF1538
 	.byte	0x60
 	.byte	0x84
 	.2byte	0x126
-	.4byte	0x6459
+	.4byte	0x646e
 	.uleb128 0x2b
 	.string	"pcp"
 	.byte	0x84
 	.2byte	0x127
-	.4byte	0x63d2
+	.4byte	0x63e7
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1538
+	.4byte	.LASF1539
 	.byte	0x84
 	.2byte	0x12d
-	.4byte	0x101
+	.4byte	0x106
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1539
+	.4byte	.LASF1540
 	.byte	0x84
 	.2byte	0x12e
-	.4byte	0x6459
+	.4byte	0x646e
 	.byte	0x51
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x101
-	.4byte	0x6469
+	.4byte	0x106
+	.4byte	0x647e
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xc
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1540
+	.4byte	.LASF1541
 	.byte	0x22
 	.byte	0x84
 	.2byte	0x132
-	.4byte	0x6491
+	.4byte	0x64a6
 	.uleb128 0x1b
-	.4byte	.LASF1538
+	.4byte	.LASF1539
 	.byte	0x84
 	.2byte	0x133
-	.4byte	0x101
+	.4byte	0x106
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1541
+	.4byte	.LASF1542
 	.byte	0x84
 	.2byte	0x134
-	.4byte	0x6491
+	.4byte	0x64a6
 	.byte	0x1
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x101
-	.4byte	0x64a1
+	.4byte	0x106
+	.4byte	0x64b6
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x20
 	.byte	0
 	.uleb128 0x1e
-	.4byte	.LASF1542
+	.4byte	.LASF1543
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x84
 	.2byte	0x139
-	.4byte	0x64cb
+	.4byte	0x64e0
 	.uleb128 0xc
-	.4byte	.LASF1543
+	.4byte	.LASF1544
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1544
+	.4byte	.LASF1545
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1545
+	.4byte	.LASF1546
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF1546
+	.4byte	.LASF1547
 	.byte	0x3
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF1547
+	.4byte	.LASF1548
 	.2byte	0x680
 	.byte	0x84
 	.2byte	0x172
-	.4byte	0x6699
+	.4byte	0x66ae
 	.uleb128 0x1b
-	.4byte	.LASF1548
+	.4byte	.LASF1549
 	.byte	0x84
 	.2byte	0x176
-	.4byte	0x6699
+	.4byte	0x66ae
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1549
+	.4byte	.LASF1550
 	.byte	0x84
 	.2byte	0x178
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1550
+	.4byte	.LASF1551
 	.byte	0x84
 	.2byte	0x183
-	.4byte	0x66a9
+	.4byte	0x66be
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1551
+	.4byte	.LASF1552
 	.byte	0x84
 	.2byte	0x188
-	.4byte	0x63c0
+	.4byte	0x63d5
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1552
+	.4byte	.LASF1553
 	.byte	0x84
 	.2byte	0x189
-	.4byte	0x66b9
+	.4byte	0x66ce
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1553
+	.4byte	.LASF1554
 	.byte	0x84
 	.2byte	0x18c
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1554
+	.4byte	.LASF1555
 	.byte	0x84
 	.2byte	0x198
 	.4byte	0x29
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1555
+	.4byte	.LASF1556
 	.byte	0x84
 	.2byte	0x1c3
 	.4byte	0x29
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1556
+	.4byte	.LASF1557
 	.byte	0x84
 	.2byte	0x1c4
 	.4byte	0x29
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1557
+	.4byte	.LASF1558
 	.byte	0x84
 	.2byte	0x1c5
 	.4byte	0x29
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0x84
 	.2byte	0x1c7
 	.4byte	0x56
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1558
+	.4byte	.LASF1559
 	.byte	0x84
 	.2byte	0x1cf
 	.4byte	0x29
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1559
+	.4byte	.LASF1560
 	.byte	0x84
 	.2byte	0x1d7
 	.4byte	0xc6
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1529
+	.4byte	.LASF1530
 	.byte	0x84
 	.2byte	0x1da
-	.4byte	0x6062
+	.4byte	0x6077
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF1445
+	.4byte	.LASF1446
 	.byte	0x84
 	.2byte	0x1dd
-	.4byte	0x66bf
+	.4byte	0x66d4
 	.byte	0xc0
 	.uleb128 0x1c
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x84
 	.2byte	0x1e0
 	.4byte	0x29
 	.2byte	0x538
 	.uleb128 0x1c
-	.4byte	.LASF115
+	.4byte	.LASF116
 	.byte	0x84
 	.2byte	0x1e3
-	.4byte	0xe50
+	.4byte	0xe65
 	.2byte	0x540
 	.uleb128 0x1c
-	.4byte	.LASF1531
+	.4byte	.LASF1532
 	.byte	0x84
 	.2byte	0x1e6
-	.4byte	0x6062
+	.4byte	0x6077
 	.2byte	0x580
 	.uleb128 0x1c
-	.4byte	.LASF1560
+	.4byte	.LASF1561
 	.byte	0x84
 	.2byte	0x1ed
 	.4byte	0x29
 	.2byte	0x580
 	.uleb128 0x1c
-	.4byte	.LASF1561
+	.4byte	.LASF1562
 	.byte	0x84
 	.2byte	0x1f1
 	.4byte	0x29
 	.2byte	0x588
 	.uleb128 0x1c
-	.4byte	.LASF1562
+	.4byte	.LASF1563
 	.byte	0x84
 	.2byte	0x1f3
 	.4byte	0x3f
 	.2byte	0x590
 	.uleb128 0x1c
-	.4byte	.LASF1563
+	.4byte	.LASF1564
 	.byte	0x84
 	.2byte	0x1fc
 	.4byte	0x6d
 	.2byte	0x5a0
 	.uleb128 0x1c
-	.4byte	.LASF1564
+	.4byte	.LASF1565
 	.byte	0x84
 	.2byte	0x1fd
 	.4byte	0x6d
 	.2byte	0x5a4
 	.uleb128 0x1c
-	.4byte	.LASF1565
+	.4byte	.LASF1566
 	.byte	0x84
 	.2byte	0x1fe
 	.4byte	0xc6
 	.2byte	0x5a8
 	.uleb128 0x1c
-	.4byte	.LASF1566
+	.4byte	.LASF1567
 	.byte	0x84
 	.2byte	0x203
-	.4byte	0x29b
+	.4byte	0x2b0
 	.2byte	0x5ac
 	.uleb128 0x1c
-	.4byte	.LASF1567
+	.4byte	.LASF1568
 	.byte	0x84
 	.2byte	0x206
-	.4byte	0x29b
+	.4byte	0x2b0
 	.2byte	0x5ad
 	.uleb128 0x1c
-	.4byte	.LASF1568
+	.4byte	.LASF1569
 	.byte	0x84
 	.2byte	0x208
-	.4byte	0x6062
+	.4byte	0x6077
 	.2byte	0x5c0
 	.uleb128 0x1c
-	.4byte	.LASF1533
+	.4byte	.LASF1534
 	.byte	0x84
 	.2byte	0x20a
-	.4byte	0x66cf
+	.4byte	0x66e4
 	.2byte	0x5c0
 	.uleb128 0x1c
-	.4byte	.LASF1569
+	.4byte	.LASF1570
 	.byte	0x84
 	.2byte	0x20b
-	.4byte	0x66df
+	.4byte	0x66f4
 	.2byte	0x628
 	.uleb128 0x1c
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x84
 	.2byte	0x20d
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x628
 	.uleb128 0x1c
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x84
 	.2byte	0x20e
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x630
 	.uleb128 0x1c
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x84
 	.2byte	0x20f
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x638
 	.uleb128 0x1c
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x84
 	.2byte	0x210
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x640
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0x66a9
+	.4byte	0x66be
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x194
-	.4byte	0x66b9
+	.4byte	0x199
+	.4byte	0x66ce
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6424
+	.4byte	0x6439
 	.uleb128 0x5
-	.4byte	0x602d
-	.4byte	0x66cf
+	.4byte	0x6042
+	.4byte	0x66e4
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xa
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x543
-	.4byte	0x66df
+	.4byte	0x558
+	.4byte	0x66f4
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xc
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x543
-	.4byte	0x66ee
+	.4byte	0x558
+	.4byte	0x6703
 	.uleb128 0x44
 	.4byte	0x4f
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1570
+	.4byte	.LASF1571
 	.byte	0x10
 	.byte	0x84
 	.2byte	0x25f
-	.4byte	0x6716
+	.4byte	0x672b
 	.uleb128 0x1b
-	.4byte	.LASF1547
+	.4byte	.LASF1548
 	.byte	0x84
 	.2byte	0x260
-	.4byte	0x6716
+	.4byte	0x672b
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1571
+	.4byte	.LASF1572
 	.byte	0x84
 	.2byte	0x261
 	.4byte	0xc6
@@ -23105,1059 +23092,1059 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x64cb
+	.4byte	0x64e0
 	.uleb128 0x1d
-	.4byte	.LASF1572
+	.4byte	.LASF1573
 	.byte	0x40
 	.byte	0x84
 	.2byte	0x272
-	.4byte	0x6737
+	.4byte	0x674c
 	.uleb128 0x1b
-	.4byte	.LASF1573
+	.4byte	.LASF1574
 	.byte	0x84
 	.2byte	0x273
-	.4byte	0x6737
+	.4byte	0x674c
 	.byte	0
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x66ee
-	.4byte	0x6747
+	.4byte	0x6703
+	.4byte	0x675c
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF1574
+	.4byte	.LASF1575
 	.byte	0x84
 	.2byte	0x278
-	.4byte	0x3454
+	.4byte	0x3469
 	.uleb128 0x5
-	.4byte	0x64cb
-	.4byte	0x6763
+	.4byte	0x64e0
+	.4byte	0x6778
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x671c
-	.4byte	0x6773
+	.4byte	0x6731
+	.4byte	0x6788
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6469
+	.4byte	0x647e
 	.uleb128 0x5
-	.4byte	0x543
-	.4byte	0x6789
+	.4byte	0x558
+	.4byte	0x679e
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x20
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1575
+	.4byte	.LASF1576
 	.byte	0x21
 	.byte	0x33
-	.4byte	0x6794
+	.4byte	0x67a9
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x679a
+	.4byte	0x67af
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x67b3
+	.4byte	0x67c8
 	.uleb128 0x11
-	.4byte	0x67b3
+	.4byte	0x67c8
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x67b9
+	.4byte	0x67ce
 	.uleb128 0xd
-	.4byte	.LASF1576
+	.4byte	.LASF1577
 	.byte	0x18
 	.byte	0x21
 	.byte	0x36
-	.4byte	0x67ea
+	.4byte	0x67ff
 	.uleb128 0xe
-	.4byte	.LASF1577
+	.4byte	.LASF1578
 	.byte	0x21
 	.byte	0x37
-	.4byte	0x6789
+	.4byte	0x679e
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF63
+	.4byte	.LASF64
 	.byte	0x21
 	.byte	0x38
-	.4byte	0x67b3
+	.4byte	0x67c8
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1578
+	.4byte	.LASF1579
 	.byte	0x21
 	.byte	0x39
 	.4byte	0xc6
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1579
+	.4byte	.LASF1580
 	.byte	0x38
 	.byte	0x21
 	.byte	0x41
-	.4byte	0x680f
+	.4byte	0x6824
 	.uleb128 0xe
-	.4byte	.LASF1580
+	.4byte	.LASF1581
 	.byte	0x21
 	.byte	0x42
-	.4byte	0x4e21
+	.4byte	0x4e36
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF135
+	.4byte	.LASF136
 	.byte	0x21
 	.byte	0x43
-	.4byte	0x67b3
+	.4byte	0x67c8
 	.byte	0x30
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1581
+	.4byte	.LASF1582
 	.byte	0x21
 	.byte	0xee
-	.4byte	0x67ea
+	.4byte	0x67ff
 	.uleb128 0x15
-	.4byte	.LASF1582
+	.4byte	.LASF1583
 	.byte	0x84
 	.2byte	0x368
 	.4byte	0xc6
 	.uleb128 0x5
 	.4byte	0xc6
-	.4byte	0x6836
+	.4byte	0x684b
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF1583
+	.4byte	.LASF1584
 	.byte	0x84
 	.2byte	0x394
-	.4byte	0x6826
+	.4byte	0x683b
 	.uleb128 0x15
-	.4byte	.LASF1584
+	.4byte	.LASF1585
 	.byte	0x84
 	.2byte	0x3a0
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x15
-	.4byte	.LASF1585
+	.4byte	.LASF1586
 	.byte	0x84
 	.2byte	0x3a5
-	.4byte	0x6254
+	.4byte	0x6269
 	.uleb128 0x1d
-	.4byte	.LASF1586
+	.4byte	.LASF1587
 	.byte	0x10
 	.byte	0x84
 	.2byte	0x469
-	.4byte	0x6882
+	.4byte	0x6897
 	.uleb128 0x1b
-	.4byte	.LASF1587
+	.4byte	.LASF1588
 	.byte	0x84
 	.2byte	0x476
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1588
+	.4byte	.LASF1589
 	.byte	0x84
 	.2byte	0x479
-	.4byte	0x6882
+	.4byte	0x6897
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x29
 	.uleb128 0x15
-	.4byte	.LASF1586
+	.4byte	.LASF1587
 	.byte	0x84
 	.2byte	0x493
-	.4byte	0x6894
+	.4byte	0x68a9
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x689a
+	.4byte	0x68af
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x685a
+	.4byte	0x686f
 	.uleb128 0x15
-	.4byte	.LASF1589
+	.4byte	.LASF1590
 	.byte	0x84
 	.2byte	0x4ea
 	.4byte	0xc6
 	.uleb128 0xd
-	.4byte	.LASF1590
+	.4byte	.LASF1591
 	.byte	0x28
 	.byte	0x85
 	.byte	0x7
-	.4byte	0x690d
+	.4byte	0x6922
 	.uleb128 0xe
-	.4byte	.LASF1591
+	.4byte	.LASF1592
 	.byte	0x85
 	.byte	0x8
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1592
+	.4byte	.LASF1593
 	.byte	0x85
 	.byte	0x9
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1593
+	.4byte	.LASF1594
 	.byte	0x85
 	.byte	0xa
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1594
+	.4byte	.LASF1595
 	.byte	0x85
 	.byte	0xb
 	.4byte	0xc6
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF1595
+	.4byte	.LASF1596
 	.byte	0x85
 	.byte	0xc
-	.4byte	0x15d3
+	.4byte	0x15e8
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1596
+	.4byte	.LASF1597
 	.byte	0x85
 	.byte	0xd
-	.4byte	0x15d3
+	.4byte	0x15e8
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1597
+	.4byte	.LASF1598
 	.byte	0x85
 	.byte	0xe
-	.4byte	0x15d3
+	.4byte	0x15e8
 	.byte	0x20
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x68ac
-	.4byte	0x691d
+	.4byte	0x68c1
+	.4byte	0x6932
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x7
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1590
+	.4byte	.LASF1591
 	.byte	0x85
 	.byte	0x11
-	.4byte	0x690d
+	.4byte	0x6922
 	.uleb128 0x19
-	.4byte	.LASF1598
+	.4byte	.LASF1599
 	.byte	0x86
 	.byte	0x11
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF1599
+	.4byte	.LASF1600
 	.byte	0x86
 	.byte	0x1c
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF1600
+	.4byte	.LASF1601
 	.byte	0x86
 	.byte	0x24
 	.4byte	0x29
 	.uleb128 0x15
-	.4byte	.LASF1601
+	.4byte	.LASF1602
 	.byte	0x87
 	.2byte	0x259
-	.4byte	0x31b
+	.4byte	0x330
 	.uleb128 0xd
-	.4byte	.LASF1602
+	.4byte	.LASF1603
 	.byte	0x28
 	.byte	0x88
 	.byte	0x14
-	.4byte	0x6992
+	.4byte	0x69a7
 	.uleb128 0xe
-	.4byte	.LASF115
+	.4byte	.LASF116
 	.byte	0x88
 	.byte	0x15
-	.4byte	0xe1e
+	.4byte	0xe33
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF382
+	.4byte	.LASF383
 	.byte	0x88
 	.byte	0x16
-	.4byte	0x14a
+	.4byte	0x14f
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF961
+	.4byte	.LASF962
 	.byte	0x88
 	.byte	0x18
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1244
+	.4byte	.LASF1245
 	.byte	0x88
 	.byte	0x1a
-	.4byte	0x6992
+	.4byte	0x69a7
 	.byte	0x20
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x12a
+	.4byte	0x12f
 	.uleb128 0x19
-	.4byte	.LASF1603
+	.4byte	.LASF1604
 	.byte	0x88
 	.byte	0x1d
 	.4byte	0xc6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x69a9
+	.4byte	0x69be
 	.uleb128 0x1d
-	.4byte	.LASF1604
+	.4byte	.LASF1605
 	.byte	0xd0
 	.byte	0x89
 	.2byte	0x126
-	.4byte	0x6a53
+	.4byte	0x6a68
 	.uleb128 0x1b
-	.4byte	.LASF1605
+	.4byte	.LASF1606
 	.byte	0x89
 	.2byte	0x127
-	.4byte	0x3d6
+	.4byte	0x3eb
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1606
+	.4byte	.LASF1607
 	.byte	0x89
 	.2byte	0x128
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1607
+	.4byte	.LASF1608
 	.byte	0x89
 	.2byte	0x129
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1608
+	.4byte	.LASF1609
 	.byte	0x89
 	.2byte	0x12a
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1609
+	.4byte	.LASF1610
 	.byte	0x89
 	.2byte	0x12b
-	.4byte	0x2455
+	.4byte	0x246a
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1610
+	.4byte	.LASF1611
 	.byte	0x89
 	.2byte	0x12c
-	.4byte	0xe50
+	.4byte	0xe65
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1611
+	.4byte	.LASF1612
 	.byte	0x89
 	.2byte	0x12d
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0x64
 	.uleb128 0x1b
-	.4byte	.LASF1612
+	.4byte	.LASF1613
 	.byte	0x89
 	.2byte	0x12e
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1613
+	.4byte	.LASF1614
 	.byte	0x89
 	.2byte	0x12f
-	.4byte	0x6ad6
+	.4byte	0x6aeb
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1614
+	.4byte	.LASF1615
 	.byte	0x89
 	.2byte	0x130
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1615
+	.4byte	.LASF1616
 	.byte	0x89
 	.2byte	0x131
 	.4byte	0x29
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1616
+	.4byte	.LASF1617
 	.byte	0x89
 	.2byte	0x132
-	.4byte	0x6b00
+	.4byte	0x6b15
 	.byte	0x88
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1617
+	.4byte	.LASF1618
 	.byte	0x8a
 	.byte	0x14
-	.4byte	0x1b6
+	.4byte	0x1bb
 	.uleb128 0xf
 	.byte	0x4
 	.byte	0x8a
 	.byte	0x16
-	.4byte	0x6a73
+	.4byte	0x6a88
 	.uleb128 0x20
 	.string	"val"
 	.byte	0x8a
 	.byte	0x17
-	.4byte	0x6a53
+	.4byte	0x6a68
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1618
+	.4byte	.LASF1619
 	.byte	0x8a
 	.byte	0x18
-	.4byte	0x6a5e
+	.4byte	0x6a73
 	.uleb128 0x1f
-	.4byte	.LASF1619
+	.4byte	.LASF1620
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x89
 	.byte	0x36
-	.4byte	0x6aa1
+	.4byte	0x6ab6
 	.uleb128 0xc
-	.4byte	.LASF1620
+	.4byte	.LASF1621
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1621
+	.4byte	.LASF1622
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1622
+	.4byte	.LASF1623
 	.byte	0x2
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1623
+	.4byte	.LASF1624
 	.byte	0x89
 	.byte	0x42
-	.4byte	0xe8
+	.4byte	0xed
 	.uleb128 0x21
 	.byte	0x4
 	.byte	0x89
 	.byte	0x45
-	.4byte	0x6ad6
+	.4byte	0x6aeb
 	.uleb128 0x28
 	.string	"uid"
 	.byte	0x89
 	.byte	0x46
-	.4byte	0x23fb
+	.4byte	0x2410
 	.uleb128 0x28
 	.string	"gid"
 	.byte	0x89
 	.byte	0x47
-	.4byte	0x241b
+	.4byte	0x2430
 	.uleb128 0x22
-	.4byte	.LASF1624
+	.4byte	.LASF1625
 	.byte	0x89
 	.byte	0x48
-	.4byte	0x6a73
+	.4byte	0x6a88
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1625
+	.4byte	.LASF1626
 	.byte	0x8
 	.byte	0x89
 	.byte	0x44
-	.4byte	0x6af5
+	.4byte	0x6b0a
 	.uleb128 0x23
-	.4byte	0x6aac
+	.4byte	0x6ac1
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF192
+	.4byte	.LASF193
 	.byte	0x89
 	.byte	0x4a
-	.4byte	0x6a7e
+	.4byte	0x6a93
 	.byte	0x4
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1626
+	.4byte	.LASF1627
 	.byte	0x89
 	.byte	0xc1
-	.4byte	0xe50
+	.4byte	0xe65
 	.uleb128 0xd
-	.4byte	.LASF1627
+	.4byte	.LASF1628
 	.byte	0x48
 	.byte	0x89
 	.byte	0xcd
-	.4byte	0x6b79
+	.4byte	0x6b8e
 	.uleb128 0xe
-	.4byte	.LASF1628
+	.4byte	.LASF1629
 	.byte	0x89
 	.byte	0xce
-	.4byte	0x6aa1
+	.4byte	0x6ab6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1629
+	.4byte	.LASF1630
 	.byte	0x89
 	.byte	0xcf
-	.4byte	0x6aa1
+	.4byte	0x6ab6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1630
+	.4byte	.LASF1631
 	.byte	0x89
 	.byte	0xd0
-	.4byte	0x6aa1
+	.4byte	0x6ab6
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1631
+	.4byte	.LASF1632
 	.byte	0x89
 	.byte	0xd1
-	.4byte	0x6aa1
+	.4byte	0x6ab6
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1632
+	.4byte	.LASF1633
 	.byte	0x89
 	.byte	0xd2
-	.4byte	0x6aa1
+	.4byte	0x6ab6
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1633
+	.4byte	.LASF1634
 	.byte	0x89
 	.byte	0xd3
-	.4byte	0x6aa1
+	.4byte	0x6ab6
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1634
+	.4byte	.LASF1635
 	.byte	0x89
 	.byte	0xd4
-	.4byte	0x6aa1
+	.4byte	0x6ab6
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1635
+	.4byte	.LASF1636
 	.byte	0x89
 	.byte	0xd5
-	.4byte	0x9bd
+	.4byte	0x9d2
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF1636
+	.4byte	.LASF1637
 	.byte	0x89
 	.byte	0xd6
-	.4byte	0x9bd
+	.4byte	0x9d2
 	.byte	0x40
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1637
+	.4byte	.LASF1638
 	.byte	0x48
 	.byte	0x89
 	.byte	0xde
-	.4byte	0x6bf2
+	.4byte	0x6c07
 	.uleb128 0xe
-	.4byte	.LASF1638
+	.4byte	.LASF1639
 	.byte	0x89
 	.byte	0xdf
-	.4byte	0x6c34
+	.4byte	0x6c49
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1639
+	.4byte	.LASF1640
 	.byte	0x89
 	.byte	0xe0
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1640
+	.4byte	.LASF1641
 	.byte	0x89
 	.byte	0xe2
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1641
+	.4byte	.LASF1642
 	.byte	0x89
 	.byte	0xe3
 	.4byte	0x29
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1642
+	.4byte	.LASF1643
 	.byte	0x89
 	.byte	0xe4
 	.4byte	0x6d
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1643
+	.4byte	.LASF1644
 	.byte	0x89
 	.byte	0xe5
 	.4byte	0x6d
 	.byte	0x2c
 	.uleb128 0xe
-	.4byte	.LASF1644
+	.4byte	.LASF1645
 	.byte	0x89
 	.byte	0xe6
-	.4byte	0x6aa1
+	.4byte	0x6ab6
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1645
+	.4byte	.LASF1646
 	.byte	0x89
 	.byte	0xe7
-	.4byte	0x6aa1
+	.4byte	0x6ab6
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF1646
+	.4byte	.LASF1647
 	.byte	0x89
 	.byte	0xe8
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x40
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1647
+	.4byte	.LASF1648
 	.byte	0x20
 	.byte	0x89
 	.2byte	0x1c4
-	.4byte	0x6c34
+	.4byte	0x6c49
 	.uleb128 0x1b
-	.4byte	.LASF1648
+	.4byte	.LASF1649
 	.byte	0x89
 	.2byte	0x1c5
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1649
+	.4byte	.LASF1650
 	.byte	0x89
 	.2byte	0x1c6
-	.4byte	0x723e
+	.4byte	0x7253
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1650
+	.4byte	.LASF1651
 	.byte	0x89
 	.2byte	0x1c7
-	.4byte	0x7566
+	.4byte	0x757b
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1651
+	.4byte	.LASF1652
 	.byte	0x89
 	.2byte	0x1c8
-	.4byte	0x6c34
+	.4byte	0x6c49
 	.byte	0x18
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6bf2
+	.4byte	0x6c07
 	.uleb128 0x1a
-	.4byte	.LASF1652
+	.4byte	.LASF1653
 	.2byte	0x180
 	.byte	0x89
 	.2byte	0x109
-	.4byte	0x6c63
+	.4byte	0x6c78
 	.uleb128 0x1b
-	.4byte	.LASF1653
+	.4byte	.LASF1654
 	.byte	0x89
 	.2byte	0x10a
-	.4byte	0x2f3c
+	.4byte	0x2f51
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF58
+	.4byte	.LASF59
 	.byte	0x89
 	.2byte	0x10b
-	.4byte	0x6c63
+	.4byte	0x6c78
 	.byte	0x40
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x6955
-	.4byte	0x6c73
+	.4byte	0x696a
+	.4byte	0x6c88
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x7
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF1652
+	.4byte	.LASF1653
 	.byte	0x89
 	.2byte	0x10e
-	.4byte	0x6c3a
+	.4byte	0x6c4f
 	.uleb128 0x1d
-	.4byte	.LASF1654
+	.4byte	.LASF1655
 	.byte	0x50
 	.byte	0x89
 	.2byte	0x136
-	.4byte	0x6d0f
+	.4byte	0x6d24
 	.uleb128 0x1b
-	.4byte	.LASF1655
+	.4byte	.LASF1656
 	.byte	0x89
 	.2byte	0x137
-	.4byte	0x6d28
+	.4byte	0x6d3d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1656
+	.4byte	.LASF1657
 	.byte	0x89
 	.2byte	0x138
-	.4byte	0x6d28
+	.4byte	0x6d3d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1657
+	.4byte	.LASF1658
 	.byte	0x89
 	.2byte	0x139
-	.4byte	0x6d28
+	.4byte	0x6d3d
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1658
+	.4byte	.LASF1659
 	.byte	0x89
 	.2byte	0x13a
-	.4byte	0x6d28
+	.4byte	0x6d3d
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1659
+	.4byte	.LASF1660
 	.byte	0x89
 	.2byte	0x13b
-	.4byte	0x6d3d
+	.4byte	0x6d52
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1660
+	.4byte	.LASF1661
 	.byte	0x89
 	.2byte	0x13c
-	.4byte	0x6d3d
+	.4byte	0x6d52
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1661
+	.4byte	.LASF1662
 	.byte	0x89
 	.2byte	0x13d
-	.4byte	0x6d3d
+	.4byte	0x6d52
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1662
+	.4byte	.LASF1663
 	.byte	0x89
 	.2byte	0x13e
-	.4byte	0x6d5d
+	.4byte	0x6d72
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x89
 	.2byte	0x140
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x89
 	.2byte	0x141
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x48
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x6c7f
+	.4byte	0x6c94
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x6d28
+	.4byte	0x6d3d
 	.uleb128 0x11
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6d14
+	.4byte	0x6d29
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x6d3d
+	.4byte	0x6d52
 	.uleb128 0x11
-	.4byte	0x69a3
+	.4byte	0x69b8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6d2e
+	.4byte	0x6d43
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x6d57
+	.4byte	0x6d6c
 	.uleb128 0x11
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.uleb128 0x11
-	.4byte	0x6d57
+	.4byte	0x6d6c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6ad6
+	.4byte	0x6aeb
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6d43
+	.4byte	0x6d58
 	.uleb128 0x1d
-	.4byte	.LASF1663
+	.4byte	.LASF1664
 	.byte	0x68
 	.byte	0x89
 	.2byte	0x145
-	.4byte	0x6e1a
+	.4byte	0x6e2f
 	.uleb128 0x1b
-	.4byte	.LASF1664
+	.4byte	.LASF1665
 	.byte	0x89
 	.2byte	0x146
-	.4byte	0x6d3d
+	.4byte	0x6d52
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1665
+	.4byte	.LASF1666
 	.byte	0x89
 	.2byte	0x147
-	.4byte	0x6e33
+	.4byte	0x6e48
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1666
+	.4byte	.LASF1667
 	.byte	0x89
 	.2byte	0x148
-	.4byte	0x6e44
+	.4byte	0x6e59
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1667
+	.4byte	.LASF1668
 	.byte	0x89
 	.2byte	0x149
-	.4byte	0x6d3d
+	.4byte	0x6d52
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1668
+	.4byte	.LASF1669
 	.byte	0x89
 	.2byte	0x14a
-	.4byte	0x6d3d
+	.4byte	0x6d52
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1669
+	.4byte	.LASF1670
 	.byte	0x89
 	.2byte	0x14b
-	.4byte	0x6d3d
+	.4byte	0x6d52
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1670
+	.4byte	.LASF1671
 	.byte	0x89
 	.2byte	0x14c
-	.4byte	0x6d28
+	.4byte	0x6d3d
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1671
+	.4byte	.LASF1672
 	.byte	0x89
 	.2byte	0x14f
-	.4byte	0x6e5f
+	.4byte	0x6e74
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1672
+	.4byte	.LASF1673
 	.byte	0x89
 	.2byte	0x150
-	.4byte	0x6e7f
+	.4byte	0x6e94
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1673
+	.4byte	.LASF1674
 	.byte	0x89
 	.2byte	0x152
-	.4byte	0x6e99
+	.4byte	0x6eae
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1662
+	.4byte	.LASF1663
 	.byte	0x89
 	.2byte	0x154
-	.4byte	0x6d5d
+	.4byte	0x6d72
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x89
 	.2byte	0x156
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x89
 	.2byte	0x157
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x60
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x6d63
+	.4byte	0x6d78
 	.uleb128 0x14
-	.4byte	0x69a3
-	.4byte	0x6e33
+	.4byte	0x69b8
+	.4byte	0x6e48
 	.uleb128 0x11
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6e1f
+	.4byte	0x6e34
 	.uleb128 0x10
-	.4byte	0x6e44
+	.4byte	0x6e59
 	.uleb128 0x11
-	.4byte	0x69a3
+	.4byte	0x69b8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6e39
+	.4byte	0x6e4e
 	.uleb128 0x14
-	.4byte	0x6e59
-	.4byte	0x6e59
+	.4byte	0x6e6e
+	.4byte	0x6e6e
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6aa1
+	.4byte	0x6ab6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6e4a
+	.4byte	0x6e5f
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x6e79
+	.4byte	0x6e8e
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x6e79
+	.4byte	0x6e8e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6a73
+	.4byte	0x6a88
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6e65
+	.4byte	0x6e7a
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x6e99
+	.4byte	0x6eae
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x6e59
+	.4byte	0x6e6e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6e85
+	.4byte	0x6e9a
 	.uleb128 0x1d
-	.4byte	.LASF1674
+	.4byte	.LASF1675
 	.byte	0x78
 	.byte	0x89
 	.2byte	0x15d
-	.4byte	0x6f7d
+	.4byte	0x6f92
 	.uleb128 0x1b
-	.4byte	.LASF1675
+	.4byte	.LASF1676
 	.byte	0x89
 	.2byte	0x15e
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1676
+	.4byte	.LASF1677
 	.byte	0x89
 	.2byte	0x15f
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1677
+	.4byte	.LASF1678
 	.byte	0x89
 	.2byte	0x160
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1678
+	.4byte	.LASF1679
 	.byte	0x89
 	.2byte	0x161
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1679
+	.4byte	.LASF1680
 	.byte	0x89
 	.2byte	0x162
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1680
+	.4byte	.LASF1681
 	.byte	0x89
 	.2byte	0x163
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1681
+	.4byte	.LASF1682
 	.byte	0x89
 	.2byte	0x164
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1682
+	.4byte	.LASF1683
 	.byte	0x89
 	.2byte	0x165
-	.4byte	0x14a
+	.4byte	0x14f
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1683
+	.4byte	.LASF1684
 	.byte	0x89
 	.2byte	0x167
-	.4byte	0x14a
+	.4byte	0x14f
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1684
+	.4byte	.LASF1685
 	.byte	0x89
 	.2byte	0x168
 	.4byte	0xc6
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1685
+	.4byte	.LASF1686
 	.byte	0x89
 	.2byte	0x169
 	.4byte	0xc6
 	.byte	0x4c
 	.uleb128 0x1b
-	.4byte	.LASF1686
+	.4byte	.LASF1687
 	.byte	0x89
 	.2byte	0x16a
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1687
+	.4byte	.LASF1688
 	.byte	0x89
 	.2byte	0x16b
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1688
+	.4byte	.LASF1689
 	.byte	0x89
 	.2byte	0x16c
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1689
+	.4byte	.LASF1690
 	.byte	0x89
 	.2byte	0x16d
-	.4byte	0x14a
+	.4byte	0x14f
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1690
+	.4byte	.LASF1691
 	.byte	0x89
 	.2byte	0x16e
 	.4byte	0xc6
 	.byte	0x70
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1691
+	.4byte	.LASF1692
 	.byte	0x38
 	.byte	0x89
 	.2byte	0x191
-	.4byte	0x700d
+	.4byte	0x7022
 	.uleb128 0x1b
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x89
 	.2byte	0x192
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1692
+	.4byte	.LASF1693
 	.byte	0x89
 	.2byte	0x193
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF1693
+	.4byte	.LASF1694
 	.byte	0x89
 	.2byte	0x195
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1694
+	.4byte	.LASF1695
 	.byte	0x89
 	.2byte	0x196
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF1695
+	.4byte	.LASF1696
 	.byte	0x89
 	.2byte	0x197
 	.4byte	0x6d
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1696
+	.4byte	.LASF1697
 	.byte	0x89
 	.2byte	0x198
 	.4byte	0x6d
 	.byte	0x14
 	.uleb128 0x1b
-	.4byte	.LASF1697
+	.4byte	.LASF1698
 	.byte	0x89
 	.2byte	0x199
 	.4byte	0x6d
@@ -24166,1006 +24153,1006 @@ __exitcall_ebc_exit:
 	.string	"ino"
 	.byte	0x89
 	.2byte	0x19a
-	.4byte	0xfa
+	.4byte	0xff
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1168
+	.4byte	.LASF1169
 	.byte	0x89
 	.2byte	0x19b
-	.4byte	0x305
+	.4byte	0x31a
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1698
+	.4byte	.LASF1699
 	.byte	0x89
 	.2byte	0x19c
-	.4byte	0x305
+	.4byte	0x31a
 	.byte	0x30
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1699
+	.4byte	.LASF1700
 	.byte	0xb0
 	.byte	0x89
 	.2byte	0x19f
-	.4byte	0x7035
+	.4byte	0x704a
 	.uleb128 0x1b
-	.4byte	.LASF1700
+	.4byte	.LASF1701
 	.byte	0x89
 	.2byte	0x1a0
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1701
+	.4byte	.LASF1702
 	.byte	0x89
 	.2byte	0x1a1
-	.4byte	0x7035
+	.4byte	0x704a
 	.byte	0x8
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x6f7d
-	.4byte	0x7045
+	.4byte	0x6f92
+	.4byte	0x705a
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1702
+	.4byte	.LASF1703
 	.byte	0x20
 	.byte	0x89
 	.2byte	0x1a5
-	.4byte	0x70bb
+	.4byte	0x70d0
 	.uleb128 0x1b
-	.4byte	.LASF1703
+	.4byte	.LASF1704
 	.byte	0x89
 	.2byte	0x1a6
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF422
+	.4byte	.LASF423
 	.byte	0x89
 	.2byte	0x1a7
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF1704
+	.4byte	.LASF1705
 	.byte	0x89
 	.2byte	0x1a8
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1705
+	.4byte	.LASF1706
 	.byte	0x89
 	.2byte	0x1aa
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF1706
+	.4byte	.LASF1707
 	.byte	0x89
 	.2byte	0x1ab
 	.4byte	0x6d
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1707
+	.4byte	.LASF1708
 	.byte	0x89
 	.2byte	0x1ac
 	.4byte	0x6d
 	.byte	0x14
 	.uleb128 0x1b
-	.4byte	.LASF1708
+	.4byte	.LASF1709
 	.byte	0x89
 	.2byte	0x1ad
 	.4byte	0x6d
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1709
+	.4byte	.LASF1710
 	.byte	0x89
 	.2byte	0x1ae
 	.4byte	0x6d
 	.byte	0x1c
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1710
+	.4byte	.LASF1711
 	.byte	0x68
 	.byte	0x89
 	.2byte	0x1b2
-	.4byte	0x7172
+	.4byte	0x7187
 	.uleb128 0x1b
-	.4byte	.LASF1711
+	.4byte	.LASF1712
 	.byte	0x89
 	.2byte	0x1b3
-	.4byte	0x7195
+	.4byte	0x71aa
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1712
+	.4byte	.LASF1713
 	.byte	0x89
 	.2byte	0x1b4
-	.4byte	0x6d28
+	.4byte	0x6d3d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1713
+	.4byte	.LASF1714
 	.byte	0x89
 	.2byte	0x1b5
-	.4byte	0x71af
+	.4byte	0x71c4
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1714
+	.4byte	.LASF1715
 	.byte	0x89
 	.2byte	0x1b6
-	.4byte	0x71af
+	.4byte	0x71c4
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1715
+	.4byte	.LASF1716
 	.byte	0x89
 	.2byte	0x1b7
-	.4byte	0x6d28
+	.4byte	0x6d3d
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1716
+	.4byte	.LASF1717
 	.byte	0x89
 	.2byte	0x1b8
-	.4byte	0x71d4
+	.4byte	0x71e9
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1717
+	.4byte	.LASF1718
 	.byte	0x89
 	.2byte	0x1b9
-	.4byte	0x71f9
+	.4byte	0x720e
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1718
+	.4byte	.LASF1719
 	.byte	0x89
 	.2byte	0x1ba
-	.4byte	0x7218
+	.4byte	0x722d
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1719
+	.4byte	.LASF1720
 	.byte	0x89
 	.2byte	0x1bc
-	.4byte	0x71f9
+	.4byte	0x720e
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1720
+	.4byte	.LASF1721
 	.byte	0x89
 	.2byte	0x1bd
-	.4byte	0x7238
+	.4byte	0x724d
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1721
+	.4byte	.LASF1722
 	.byte	0x89
 	.2byte	0x1be
-	.4byte	0x71af
+	.4byte	0x71c4
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x89
 	.2byte	0x1c0
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x89
 	.2byte	0x1c1
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x60
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x70bb
+	.4byte	0x70d0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x7195
+	.4byte	0x71aa
 	.uleb128 0x11
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0x20fd
+	.4byte	0x2112
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7177
+	.4byte	0x718c
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x71af
+	.4byte	0x71c4
 	.uleb128 0x11
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x719b
+	.4byte	0x71b0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x71ce
+	.4byte	0x71e3
 	.uleb128 0x11
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0x71ce
+	.4byte	0x71e3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7045
+	.4byte	0x705a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x71b5
+	.4byte	0x71ca
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x71f3
+	.4byte	0x7208
 	.uleb128 0x11
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.uleb128 0x11
-	.4byte	0x6ad6
+	.4byte	0x6aeb
 	.uleb128 0x11
-	.4byte	0x71f3
+	.4byte	0x7208
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6e9f
+	.4byte	0x6eb4
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x71da
+	.4byte	0x71ef
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x7218
+	.4byte	0x722d
 	.uleb128 0x11
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.uleb128 0x11
-	.4byte	0x6d57
+	.4byte	0x6d6c
 	.uleb128 0x11
-	.4byte	0x71f3
+	.4byte	0x7208
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x71ff
+	.4byte	0x7214
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x7232
+	.4byte	0x7247
 	.uleb128 0x11
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.uleb128 0x11
-	.4byte	0x7232
+	.4byte	0x7247
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x700d
+	.4byte	0x7022
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x721e
+	.4byte	0x7233
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6d0f
+	.4byte	0x6d24
 	.uleb128 0x1a
-	.4byte	.LASF162
+	.4byte	.LASF163
 	.2byte	0x380
 	.byte	0x8b
 	.2byte	0x14c
-	.4byte	0x7566
+	.4byte	0x757b
 	.uleb128 0x1b
-	.4byte	.LASF577
+	.4byte	.LASF578
 	.byte	0x8b
 	.2byte	0x14d
-	.4byte	0xd3e0
+	.4byte	0xd3fb
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF961
+	.4byte	.LASF962
 	.byte	0x8b
 	.2byte	0x150
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0x8b
 	.2byte	0x153
-	.4byte	0xd286
+	.4byte	0xd2a1
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1722
+	.4byte	.LASF1723
 	.byte	0x8b
 	.2byte	0x156
-	.4byte	0xd296
+	.4byte	0xd2b1
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1723
+	.4byte	.LASF1724
 	.byte	0x8b
 	.2byte	0x157
-	.4byte	0xd357
+	.4byte	0xd372
 	.byte	0xd0
 	.uleb128 0x1b
-	.4byte	.LASF1724
+	.4byte	.LASF1725
 	.byte	0x8b
 	.2byte	0x158
 	.4byte	0x56
 	.byte	0xd8
 	.uleb128 0x1b
-	.4byte	.LASF1725
+	.4byte	.LASF1726
 	.byte	0x8b
 	.2byte	0x159
 	.4byte	0x56
 	.byte	0xe0
 	.uleb128 0x1b
-	.4byte	.LASF1726
+	.4byte	.LASF1727
 	.byte	0x8b
 	.2byte	0x15a
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.byte	0xe8
 	.uleb128 0x1b
-	.4byte	.LASF1727
+	.4byte	.LASF1728
 	.byte	0x8b
 	.2byte	0x15d
-	.4byte	0xd4c9
+	.4byte	0xd4e4
 	.byte	0xf0
 	.uleb128 0x1b
-	.4byte	.LASF1728
+	.4byte	.LASF1729
 	.byte	0x8b
 	.2byte	0x15e
-	.4byte	0xd4cf
+	.4byte	0xd4ea
 	.byte	0xf8
 	.uleb128 0x1c
-	.4byte	.LASF1729
+	.4byte	.LASF1730
 	.byte	0x8b
 	.2byte	0x15f
 	.4byte	0x6d
 	.2byte	0x100
 	.uleb128 0x1c
-	.4byte	.LASF1730
+	.4byte	.LASF1731
 	.byte	0x8b
 	.2byte	0x167
-	.4byte	0x2455
+	.4byte	0x246a
 	.2byte	0x108
 	.uleb128 0x30
 	.string	"kp"
 	.byte	0x8b
 	.2byte	0x169
-	.4byte	0xd4d5
+	.4byte	0xd4f0
 	.2byte	0x128
 	.uleb128 0x1c
-	.4byte	.LASF1731
+	.4byte	.LASF1732
 	.byte	0x8b
 	.2byte	0x16a
 	.4byte	0x6d
 	.2byte	0x130
 	.uleb128 0x1c
-	.4byte	.LASF1732
+	.4byte	.LASF1733
 	.byte	0x8b
 	.2byte	0x16d
 	.4byte	0x6d
 	.2byte	0x134
 	.uleb128 0x1c
-	.4byte	.LASF1733
+	.4byte	.LASF1734
 	.byte	0x8b
 	.2byte	0x16e
-	.4byte	0xd4c9
+	.4byte	0xd4e4
 	.2byte	0x138
 	.uleb128 0x1c
-	.4byte	.LASF1734
+	.4byte	.LASF1735
 	.byte	0x8b
 	.2byte	0x16f
-	.4byte	0xd4cf
+	.4byte	0xd4ea
 	.2byte	0x140
 	.uleb128 0x1c
-	.4byte	.LASF1735
+	.4byte	.LASF1736
 	.byte	0x8b
 	.2byte	0x182
-	.4byte	0x29b
+	.4byte	0x2b0
 	.2byte	0x148
 	.uleb128 0x1c
-	.4byte	.LASF1736
+	.4byte	.LASF1737
 	.byte	0x8b
 	.2byte	0x184
-	.4byte	0x29b
+	.4byte	0x2b0
 	.2byte	0x149
 	.uleb128 0x1c
-	.4byte	.LASF1737
+	.4byte	.LASF1738
 	.byte	0x8b
 	.2byte	0x187
-	.4byte	0xd4c9
+	.4byte	0xd4e4
 	.2byte	0x150
 	.uleb128 0x1c
-	.4byte	.LASF1738
+	.4byte	.LASF1739
 	.byte	0x8b
 	.2byte	0x188
-	.4byte	0xd4cf
+	.4byte	0xd4ea
 	.2byte	0x158
 	.uleb128 0x1c
-	.4byte	.LASF1739
+	.4byte	.LASF1740
 	.byte	0x8b
 	.2byte	0x189
 	.4byte	0x6d
 	.2byte	0x160
 	.uleb128 0x1c
-	.4byte	.LASF1740
+	.4byte	.LASF1741
 	.byte	0x8b
 	.2byte	0x18c
 	.4byte	0x6d
 	.2byte	0x164
 	.uleb128 0x1c
-	.4byte	.LASF1741
+	.4byte	.LASF1742
 	.byte	0x8b
 	.2byte	0x18d
-	.4byte	0xd500
+	.4byte	0xd51b
 	.2byte	0x168
 	.uleb128 0x1c
-	.4byte	.LASF1742
+	.4byte	.LASF1743
 	.byte	0x8b
 	.2byte	0x190
-	.4byte	0x48c
+	.4byte	0x4a1
 	.2byte	0x170
 	.uleb128 0x1c
-	.4byte	.LASF1743
+	.4byte	.LASF1744
 	.byte	0x8b
 	.2byte	0x193
-	.4byte	0xd432
+	.4byte	0xd44d
 	.2byte	0x180
 	.uleb128 0x1c
-	.4byte	.LASF1744
+	.4byte	.LASF1745
 	.byte	0x8b
 	.2byte	0x194
-	.4byte	0xd432
+	.4byte	0xd44d
 	.2byte	0x1d0
 	.uleb128 0x1c
-	.4byte	.LASF1745
+	.4byte	.LASF1746
 	.byte	0x8b
 	.2byte	0x197
-	.4byte	0xd208
+	.4byte	0xd223
 	.2byte	0x220
 	.uleb128 0x1c
-	.4byte	.LASF1746
+	.4byte	.LASF1747
 	.byte	0x8b
 	.2byte	0x199
 	.4byte	0x29
 	.2byte	0x248
 	.uleb128 0x1c
-	.4byte	.LASF1747
+	.4byte	.LASF1748
 	.byte	0x8b
 	.2byte	0x19d
 	.4byte	0x6d
 	.2byte	0x250
 	.uleb128 0x1c
-	.4byte	.LASF1748
+	.4byte	.LASF1749
 	.byte	0x8b
 	.2byte	0x19e
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x258
 	.uleb128 0x1c
-	.4byte	.LASF1749
+	.4byte	.LASF1750
 	.byte	0x8b
 	.2byte	0x19f
-	.4byte	0xd506
+	.4byte	0xd521
 	.2byte	0x268
 	.uleb128 0x1c
-	.4byte	.LASF1750
+	.4byte	.LASF1751
 	.byte	0x8b
 	.2byte	0x1a4
-	.4byte	0xd50c
+	.4byte	0xd527
 	.2byte	0x270
 	.uleb128 0x1c
-	.4byte	.LASF1751
+	.4byte	.LASF1752
 	.byte	0x8b
 	.2byte	0x1a5
-	.4byte	0xd48e
+	.4byte	0xd4a9
 	.2byte	0x278
 	.uleb128 0x1c
-	.4byte	.LASF1752
+	.4byte	.LASF1753
 	.byte	0x8b
 	.2byte	0x1a8
-	.4byte	0xd517
+	.4byte	0xd532
 	.2byte	0x290
 	.uleb128 0x1c
-	.4byte	.LASF1753
+	.4byte	.LASF1754
 	.byte	0x8b
 	.2byte	0x1ab
-	.4byte	0xd522
+	.4byte	0xd53d
 	.2byte	0x298
 	.uleb128 0x1c
-	.4byte	.LASF1754
+	.4byte	.LASF1755
 	.byte	0x8b
 	.2byte	0x1b0
-	.4byte	0x219
+	.4byte	0x21e
 	.2byte	0x2a0
 	.uleb128 0x1c
-	.4byte	.LASF1755
+	.4byte	.LASF1756
 	.byte	0x8b
 	.2byte	0x1b4
-	.4byte	0x443
+	.4byte	0x458
 	.2byte	0x2a8
 	.uleb128 0x1c
-	.4byte	.LASF1756
+	.4byte	.LASF1757
 	.byte	0x8b
 	.2byte	0x1b5
 	.4byte	0x6d
 	.2byte	0x2b0
 	.uleb128 0x1c
-	.4byte	.LASF1757
+	.4byte	.LASF1758
 	.byte	0x8b
 	.2byte	0x1b9
 	.4byte	0x6d
 	.2byte	0x2b4
 	.uleb128 0x1c
-	.4byte	.LASF1758
+	.4byte	.LASF1759
 	.byte	0x8b
 	.2byte	0x1ba
-	.4byte	0xd528
+	.4byte	0xd543
 	.2byte	0x2b8
 	.uleb128 0x1c
-	.4byte	.LASF1759
+	.4byte	.LASF1760
 	.byte	0x8b
 	.2byte	0x1bd
-	.4byte	0xee1
+	.4byte	0xef6
 	.2byte	0x2c0
 	.uleb128 0x1c
-	.4byte	.LASF1760
+	.4byte	.LASF1761
 	.byte	0x8b
 	.2byte	0x1be
 	.4byte	0x6d
 	.2byte	0x2c8
 	.uleb128 0x1c
-	.4byte	.LASF1761
+	.4byte	.LASF1762
 	.byte	0x8b
 	.2byte	0x1c1
 	.4byte	0x6d
 	.2byte	0x2cc
 	.uleb128 0x1c
-	.4byte	.LASF1762
+	.4byte	.LASF1763
 	.byte	0x8b
 	.2byte	0x1c2
-	.4byte	0xbb82
+	.4byte	0xbb97
 	.2byte	0x2d0
 	.uleb128 0x1c
-	.4byte	.LASF1763
+	.4byte	.LASF1764
 	.byte	0x8b
 	.2byte	0x1c5
-	.4byte	0xd533
+	.4byte	0xd54e
 	.2byte	0x2d8
 	.uleb128 0x1c
-	.4byte	.LASF1764
+	.4byte	.LASF1765
 	.byte	0x8b
 	.2byte	0x1c6
 	.4byte	0x6d
 	.2byte	0x2e0
 	.uleb128 0x1c
-	.4byte	.LASF1765
+	.4byte	.LASF1766
 	.byte	0x8b
 	.2byte	0x1c7
-	.4byte	0xd544
+	.4byte	0xd55f
 	.2byte	0x2e8
 	.uleb128 0x1c
-	.4byte	.LASF1766
+	.4byte	.LASF1767
 	.byte	0x8b
 	.2byte	0x1c8
 	.4byte	0x6d
 	.2byte	0x2f0
 	.uleb128 0x1c
-	.4byte	.LASF1767
+	.4byte	.LASF1768
 	.byte	0x8b
 	.2byte	0x1d9
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x2f8
 	.uleb128 0x1c
-	.4byte	.LASF1768
+	.4byte	.LASF1769
 	.byte	0x8b
 	.2byte	0x1db
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x308
 	.uleb128 0x1c
-	.4byte	.LASF1769
+	.4byte	.LASF1770
 	.byte	0x8b
 	.2byte	0x1de
-	.4byte	0x4a2
+	.4byte	0x4b7
 	.2byte	0x318
 	.uleb128 0x1c
-	.4byte	.LASF1770
+	.4byte	.LASF1771
 	.byte	0x8b
 	.2byte	0x1e0
-	.4byte	0x367
+	.4byte	0x37c
 	.2byte	0x320
 	.uleb128 0x1c
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x8b
 	.2byte	0x1ed
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x328
 	.uleb128 0x1c
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x8b
 	.2byte	0x1ee
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x330
 	.uleb128 0x1c
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x8b
 	.2byte	0x1ef
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x338
 	.uleb128 0x1c
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x8b
 	.2byte	0x1f0
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x340
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7244
+	.4byte	0x7259
 	.uleb128 0x1a
-	.4byte	.LASF1771
+	.4byte	.LASF1772
 	.2byte	0x140
 	.byte	0x89
 	.2byte	0x20f
-	.4byte	0x75bd
+	.4byte	0x75d2
 	.uleb128 0x1b
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x89
 	.2byte	0x210
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1772
+	.4byte	.LASF1773
 	.byte	0x89
 	.2byte	0x211
-	.4byte	0x4e21
+	.4byte	0x4e36
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF673
+	.4byte	.LASF674
 	.byte	0x89
 	.2byte	0x212
-	.4byte	0x75bd
+	.4byte	0x75d2
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1773
+	.4byte	.LASF1774
 	.byte	0x89
 	.2byte	0x213
-	.4byte	0x75cd
+	.4byte	0x75e2
 	.byte	0x50
 	.uleb128 0x30
 	.string	"ops"
 	.byte	0x89
 	.2byte	0x214
-	.4byte	0x75dd
+	.4byte	0x75f2
 	.2byte	0x128
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x1c6a
-	.4byte	0x75cd
+	.4byte	0x1c7f
+	.4byte	0x75e2
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x6b79
-	.4byte	0x75dd
+	.4byte	0x6b8e
+	.4byte	0x75f2
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x723e
-	.4byte	0x75ed
+	.4byte	0x7253
+	.4byte	0x7602
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x1e
-	.4byte	.LASF1774
+	.4byte	.LASF1775
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x1f
 	.2byte	0x125
-	.4byte	0x7623
+	.4byte	0x7638
 	.uleb128 0xc
-	.4byte	.LASF1775
+	.4byte	.LASF1776
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1776
+	.4byte	.LASF1777
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1777
+	.4byte	.LASF1778
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF1778
+	.4byte	.LASF1779
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF1779
+	.4byte	.LASF1780
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF1780
+	.4byte	.LASF1781
 	.byte	0x5
 	.byte	0
 	.uleb128 0x10
-	.4byte	0x7638
+	.4byte	0x764d
 	.uleb128 0x11
-	.4byte	0x5f1a
+	.4byte	0x5f2f
 	.uleb128 0x11
-	.4byte	0x194
+	.4byte	0x199
 	.uleb128 0x11
-	.4byte	0x194
+	.4byte	0x199
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7623
+	.4byte	0x7638
 	.uleb128 0x1d
-	.4byte	.LASF1781
+	.4byte	.LASF1782
 	.byte	0xc8
 	.byte	0x1f
 	.2byte	0x162
-	.4byte	0x7791
+	.4byte	0x77a6
 	.uleb128 0x1b
-	.4byte	.LASF1782
+	.4byte	.LASF1783
 	.byte	0x1f
 	.2byte	0x163
-	.4byte	0x77b5
+	.4byte	0x77ca
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1783
+	.4byte	.LASF1784
 	.byte	0x1f
 	.2byte	0x164
-	.4byte	0x77cf
+	.4byte	0x77e4
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1784
+	.4byte	.LASF1785
 	.byte	0x1f
 	.2byte	0x167
-	.4byte	0x77e9
+	.4byte	0x77fe
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1785
+	.4byte	.LASF1786
 	.byte	0x1f
 	.2byte	0x16a
-	.4byte	0x77fe
+	.4byte	0x7813
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1786
+	.4byte	.LASF1787
 	.byte	0x1f
 	.2byte	0x170
-	.4byte	0x7822
+	.4byte	0x7837
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1787
+	.4byte	.LASF1788
 	.byte	0x1f
 	.2byte	0x173
-	.4byte	0x785b
+	.4byte	0x7870
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1788
+	.4byte	.LASF1789
 	.byte	0x1f
 	.2byte	0x176
-	.4byte	0x788e
+	.4byte	0x78a3
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1789
+	.4byte	.LASF1790
 	.byte	0x1f
 	.2byte	0x17b
-	.4byte	0x78a8
+	.4byte	0x78bd
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1790
+	.4byte	.LASF1791
 	.byte	0x1f
 	.2byte	0x17c
-	.4byte	0x78c3
+	.4byte	0x78d8
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1791
+	.4byte	.LASF1792
 	.byte	0x1f
 	.2byte	0x17d
-	.4byte	0x78dd
+	.4byte	0x78f2
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1792
+	.4byte	.LASF1793
 	.byte	0x1f
 	.2byte	0x17e
-	.4byte	0x78ee
+	.4byte	0x7903
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1793
+	.4byte	.LASF1794
 	.byte	0x1f
 	.2byte	0x17f
-	.4byte	0x7913
+	.4byte	0x7928
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1794
+	.4byte	.LASF1795
 	.byte	0x1f
 	.2byte	0x184
-	.4byte	0x7937
+	.4byte	0x794c
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1795
+	.4byte	.LASF1796
 	.byte	0x1f
 	.2byte	0x186
-	.4byte	0x7951
+	.4byte	0x7966
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1796
+	.4byte	.LASF1797
 	.byte	0x1f
 	.2byte	0x187
-	.4byte	0x78ee
+	.4byte	0x7903
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1797
+	.4byte	.LASF1798
 	.byte	0x1f
 	.2byte	0x188
-	.4byte	0x77fe
+	.4byte	0x7813
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1798
+	.4byte	.LASF1799
 	.byte	0x1f
 	.2byte	0x189
-	.4byte	0x7970
+	.4byte	0x7985
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1799
+	.4byte	.LASF1800
 	.byte	0x1f
 	.2byte	0x18b
-	.4byte	0x7991
+	.4byte	0x79a6
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF1800
+	.4byte	.LASF1801
 	.byte	0x1f
 	.2byte	0x18c
-	.4byte	0x79ab
+	.4byte	0x79c0
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1801
+	.4byte	.LASF1802
 	.byte	0x1f
 	.2byte	0x18f
-	.4byte	0x79db
+	.4byte	0x79f0
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF1802
+	.4byte	.LASF1803
 	.byte	0x1f
 	.2byte	0x191
-	.4byte	0x79ec
+	.4byte	0x7a01
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x1f
 	.2byte	0x193
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x1f
 	.2byte	0x194
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x1f
 	.2byte	0x195
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x1f
 	.2byte	0x196
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xc0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x763e
+	.4byte	0x7653
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x77aa
+	.4byte	0x77bf
 	.uleb128 0x11
-	.4byte	0x3454
+	.4byte	0x3469
 	.uleb128 0x11
-	.4byte	0x77aa
+	.4byte	0x77bf
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x77b0
+	.4byte	0x77c5
 	.uleb128 0x24
-	.4byte	.LASF1803
+	.4byte	.LASF1804
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7796
+	.4byte	0x77ab
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x77cf
+	.4byte	0x77e4
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x3454
+	.4byte	0x3469
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x77bb
+	.4byte	0x77d0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x77e9
+	.4byte	0x77fe
 	.uleb128 0x11
-	.4byte	0x5161
+	.4byte	0x5176
 	.uleb128 0x11
-	.4byte	0x77aa
+	.4byte	0x77bf
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x77d5
+	.4byte	0x77ea
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x77fe
+	.4byte	0x7813
 	.uleb128 0x11
-	.4byte	0x3454
+	.4byte	0x3469
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x77ef
+	.4byte	0x7804
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x7822
+	.4byte	0x7837
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x5161
+	.4byte	0x5176
 	.uleb128 0x11
-	.4byte	0x3b7
+	.4byte	0x3cc
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7804
+	.4byte	0x7819
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x7855
+	.4byte	0x786a
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x5161
+	.4byte	0x5176
 	.uleb128 0x11
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
-	.4byte	0x5a42
+	.4byte	0x5a57
 	.uleb128 0x11
-	.4byte	0x7855
+	.4byte	0x786a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7828
+	.4byte	0x783d
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x788e
+	.4byte	0x78a3
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x5161
+	.4byte	0x5176
 	.uleb128 0x11
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
-	.4byte	0x3454
+	.4byte	0x3469
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7861
+	.4byte	0x7876
 	.uleb128 0x14
-	.4byte	0x2fa
-	.4byte	0x78a8
+	.4byte	0x30f
+	.4byte	0x78bd
 	.uleb128 0x11
-	.4byte	0x5161
+	.4byte	0x5176
 	.uleb128 0x11
-	.4byte	0x2fa
+	.4byte	0x30f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7894
+	.4byte	0x78a9
 	.uleb128 0x10
-	.4byte	0x78c3
+	.4byte	0x78d8
 	.uleb128 0x11
-	.4byte	0x3454
+	.4byte	0x3469
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
@@ -25173,73 +25160,73 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x78ae
+	.4byte	0x78c3
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x78dd
+	.4byte	0x78f2
 	.uleb128 0x11
-	.4byte	0x3454
+	.4byte	0x3469
 	.uleb128 0x11
-	.4byte	0x31b
+	.4byte	0x330
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x78c9
+	.4byte	0x78de
 	.uleb128 0x10
-	.4byte	0x78ee
+	.4byte	0x7903
 	.uleb128 0x11
-	.4byte	0x3454
+	.4byte	0x3469
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x78e3
+	.4byte	0x78f8
 	.uleb128 0x14
-	.4byte	0x2d9
-	.4byte	0x7908
+	.4byte	0x2ee
+	.4byte	0x791d
 	.uleb128 0x11
-	.4byte	0x5f1a
+	.4byte	0x5f2f
 	.uleb128 0x11
-	.4byte	0x7908
+	.4byte	0x791d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x790e
+	.4byte	0x7923
 	.uleb128 0x24
-	.4byte	.LASF1804
+	.4byte	.LASF1805
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x78f4
+	.4byte	0x7909
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x7937
+	.4byte	0x794c
 	.uleb128 0x11
-	.4byte	0x5161
+	.4byte	0x5176
 	.uleb128 0x11
-	.4byte	0x3454
+	.4byte	0x3469
 	.uleb128 0x11
-	.4byte	0x3454
+	.4byte	0x3469
 	.uleb128 0x11
-	.4byte	0x5bf2
+	.4byte	0x5c07
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7919
+	.4byte	0x792e
 	.uleb128 0x14
-	.4byte	0x29b
-	.4byte	0x7951
+	.4byte	0x2b0
+	.4byte	0x7966
 	.uleb128 0x11
-	.4byte	0x3454
+	.4byte	0x3469
 	.uleb128 0x11
-	.4byte	0x63c6
+	.4byte	0x63db
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x793d
+	.4byte	0x7952
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x7970
+	.4byte	0x7985
 	.uleb128 0x11
-	.4byte	0x3454
+	.4byte	0x3469
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
@@ -25247,264 +25234,264 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7957
+	.4byte	0x796c
 	.uleb128 0x10
-	.4byte	0x798b
+	.4byte	0x79a0
 	.uleb128 0x11
-	.4byte	0x3454
+	.4byte	0x3469
 	.uleb128 0x11
-	.4byte	0x798b
+	.4byte	0x79a0
 	.uleb128 0x11
-	.4byte	0x798b
+	.4byte	0x79a0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x29b
+	.4byte	0x2b0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7976
+	.4byte	0x798b
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x79ab
+	.4byte	0x79c0
 	.uleb128 0x11
-	.4byte	0x5161
+	.4byte	0x5176
 	.uleb128 0x11
-	.4byte	0x3454
+	.4byte	0x3469
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7997
+	.4byte	0x79ac
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x79ca
+	.4byte	0x79df
 	.uleb128 0x11
-	.4byte	0x79ca
+	.4byte	0x79df
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x79d5
+	.4byte	0x79ea
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x79d0
+	.4byte	0x79e5
 	.uleb128 0x24
-	.4byte	.LASF1805
+	.4byte	.LASF1806
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2fa
+	.4byte	0x30f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x79b1
+	.4byte	0x79c6
 	.uleb128 0x10
-	.4byte	0x79ec
+	.4byte	0x7a01
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x79e1
+	.4byte	0x79f6
 	.uleb128 0x15
-	.4byte	.LASF1806
+	.4byte	.LASF1807
 	.byte	0x1f
 	.2byte	0x199
-	.4byte	0x7791
+	.4byte	0x77a6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7791
+	.4byte	0x77a6
 	.uleb128 0x1d
-	.4byte	.LASF1807
+	.4byte	.LASF1808
 	.byte	0xf8
 	.byte	0x1f
 	.2byte	0x1c6
-	.4byte	0x7b71
+	.4byte	0x7b86
 	.uleb128 0x1b
-	.4byte	.LASF1808
+	.4byte	.LASF1809
 	.byte	0x1f
 	.2byte	0x1c7
-	.4byte	0x26f
+	.4byte	0x284
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1809
+	.4byte	.LASF1810
 	.byte	0x1f
 	.2byte	0x1c8
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF1810
+	.4byte	.LASF1811
 	.byte	0x1f
 	.2byte	0x1c9
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1811
+	.4byte	.LASF1812
 	.byte	0x1f
 	.2byte	0x1ca
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1812
+	.4byte	.LASF1813
 	.byte	0x1f
 	.2byte	0x1cb
-	.4byte	0x2455
+	.4byte	0x246a
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1813
+	.4byte	.LASF1814
 	.byte	0x1f
 	.2byte	0x1cc
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1814
+	.4byte	.LASF1815
 	.byte	0x1f
 	.2byte	0x1cd
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1815
+	.4byte	.LASF1816
 	.byte	0x1f
 	.2byte	0x1ce
 	.4byte	0xc6
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1816
+	.4byte	.LASF1817
 	.byte	0x1f
 	.2byte	0x1cf
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x4c
 	.uleb128 0x1b
-	.4byte	.LASF1817
+	.4byte	.LASF1818
 	.byte	0x1f
 	.2byte	0x1d1
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1818
+	.4byte	.LASF1819
 	.byte	0x1f
 	.2byte	0x1d3
-	.4byte	0x7b71
+	.4byte	0x7b86
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1819
+	.4byte	.LASF1820
 	.byte	0x1f
 	.2byte	0x1d4
 	.4byte	0x6d
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1820
+	.4byte	.LASF1821
 	.byte	0x1f
 	.2byte	0x1d5
-	.4byte	0x10b
+	.4byte	0x110
 	.byte	0x6c
 	.uleb128 0x1b
-	.4byte	.LASF1821
+	.4byte	.LASF1822
 	.byte	0x1f
 	.2byte	0x1d6
-	.4byte	0x7b7c
+	.4byte	0x7b91
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1822
+	.4byte	.LASF1823
 	.byte	0x1f
 	.2byte	0x1d8
 	.4byte	0x6d
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1823
+	.4byte	.LASF1824
 	.byte	0x1f
 	.2byte	0x1d9
 	.4byte	0xc6
 	.byte	0x7c
 	.uleb128 0x1b
-	.4byte	.LASF1824
+	.4byte	.LASF1825
 	.byte	0x1f
 	.2byte	0x1da
-	.4byte	0x7b87
+	.4byte	0x7b9c
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1825
+	.4byte	.LASF1826
 	.byte	0x1f
 	.2byte	0x1db
-	.4byte	0x4967
+	.4byte	0x497c
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF1826
+	.4byte	.LASF1827
 	.byte	0x1f
 	.2byte	0x1dc
-	.4byte	0x4851
+	.4byte	0x4866
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1827
+	.4byte	.LASF1828
 	.byte	0x1f
 	.2byte	0x1dd
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF1828
+	.4byte	.LASF1829
 	.byte	0x1f
 	.2byte	0x1e4
 	.4byte	0x29
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF1829
+	.4byte	.LASF1830
 	.byte	0x1f
 	.2byte	0x1e7
 	.4byte	0xc6
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF1830
+	.4byte	.LASF1831
 	.byte	0x1f
 	.2byte	0x1e9
-	.4byte	0x2455
+	.4byte	0x246a
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x1f
 	.2byte	0x1eb
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xd8
 	.uleb128 0x1b
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x1f
 	.2byte	0x1ec
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xe0
 	.uleb128 0x1b
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x1f
 	.2byte	0x1ed
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xe8
 	.uleb128 0x1b
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x1f
 	.2byte	0x1ee
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xf0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7a04
+	.4byte	0x7a19
 	.uleb128 0x24
-	.4byte	.LASF1831
+	.4byte	.LASF1832
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7b77
+	.4byte	0x7b8c
 	.uleb128 0x24
-	.4byte	.LASF1832
+	.4byte	.LASF1833
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7b82
+	.4byte	0x7b97
 	.uleb128 0x3f
 	.byte	0x4
 	.byte	0x1f
 	.2byte	0x280
-	.4byte	0x7baf
+	.4byte	0x7bc4
 	.uleb128 0x41
-	.4byte	.LASF1833
+	.4byte	.LASF1834
 	.byte	0x1f
 	.2byte	0x281
 	.4byte	0x74
 	.uleb128 0x41
-	.4byte	.LASF1834
+	.4byte	.LASF1835
 	.byte	0x1f
 	.2byte	0x282
 	.4byte	0x6d
@@ -25513,806 +25500,806 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x1f
 	.2byte	0x2a7
-	.4byte	0x7bd1
+	.4byte	0x7be6
 	.uleb128 0x41
-	.4byte	.LASF1835
+	.4byte	.LASF1836
 	.byte	0x1f
 	.2byte	0x2a8
-	.4byte	0x3bd
+	.4byte	0x3d2
 	.uleb128 0x41
-	.4byte	.LASF1836
+	.4byte	.LASF1837
 	.byte	0x1f
 	.2byte	0x2a9
-	.4byte	0x407
+	.4byte	0x41c
 	.byte	0
 	.uleb128 0x3f
 	.byte	0x8
 	.byte	0x1f
 	.2byte	0x2b7
-	.4byte	0x7c17
+	.4byte	0x7c2c
 	.uleb128 0x41
-	.4byte	.LASF1837
+	.4byte	.LASF1838
 	.byte	0x1f
 	.2byte	0x2b8
-	.4byte	0x4946
+	.4byte	0x495b
 	.uleb128 0x41
-	.4byte	.LASF1838
+	.4byte	.LASF1839
 	.byte	0x1f
 	.2byte	0x2b9
-	.4byte	0x7b71
+	.4byte	0x7b86
 	.uleb128 0x41
-	.4byte	.LASF1839
+	.4byte	.LASF1840
 	.byte	0x1f
 	.2byte	0x2ba
-	.4byte	0x7c1c
+	.4byte	0x7c31
 	.uleb128 0x41
-	.4byte	.LASF1840
+	.4byte	.LASF1841
 	.byte	0x1f
 	.2byte	0x2bb
-	.4byte	0x219
+	.4byte	0x21e
 	.uleb128 0x41
-	.4byte	.LASF1841
+	.4byte	.LASF1842
 	.byte	0x1f
 	.2byte	0x2bc
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1842
+	.4byte	.LASF1843
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7c17
+	.4byte	0x7c2c
 	.uleb128 0x24
-	.4byte	.LASF1843
+	.4byte	.LASF1844
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7c22
+	.4byte	0x7c37
 	.uleb128 0x1a
-	.4byte	.LASF1844
+	.4byte	.LASF1845
 	.2byte	0x100
 	.byte	0x1f
 	.2byte	0x73c
-	.4byte	0x7d9b
+	.4byte	0x7db0
 	.uleb128 0x1b
-	.4byte	.LASF1845
+	.4byte	.LASF1846
 	.byte	0x1f
 	.2byte	0x73d
-	.4byte	0x8be2
+	.4byte	0x8bf7
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1846
+	.4byte	.LASF1847
 	.byte	0x1f
 	.2byte	0x73e
-	.4byte	0x8c07
+	.4byte	0x8c1c
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1847
+	.4byte	.LASF1848
 	.byte	0x1f
 	.2byte	0x73f
-	.4byte	0x8c21
+	.4byte	0x8c36
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1848
+	.4byte	.LASF1849
 	.byte	0x1f
 	.2byte	0x740
-	.4byte	0x8c40
+	.4byte	0x8c55
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1849
+	.4byte	.LASF1850
 	.byte	0x1f
 	.2byte	0x741
-	.4byte	0x8c5a
+	.4byte	0x8c6f
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1850
+	.4byte	.LASF1851
 	.byte	0x1f
 	.2byte	0x743
-	.4byte	0x8c79
+	.4byte	0x8c8e
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1851
+	.4byte	.LASF1852
 	.byte	0x1f
 	.2byte	0x745
-	.4byte	0x8c9d
+	.4byte	0x8cb2
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1852
+	.4byte	.LASF1853
 	.byte	0x1f
 	.2byte	0x746
-	.4byte	0x8cbc
+	.4byte	0x8cd1
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1853
+	.4byte	.LASF1854
 	.byte	0x1f
 	.2byte	0x747
-	.4byte	0x8cd6
+	.4byte	0x8ceb
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1854
+	.4byte	.LASF1855
 	.byte	0x1f
 	.2byte	0x748
-	.4byte	0x8cf5
+	.4byte	0x8d0a
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1855
+	.4byte	.LASF1856
 	.byte	0x1f
 	.2byte	0x749
-	.4byte	0x8d14
+	.4byte	0x8d29
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1856
+	.4byte	.LASF1857
 	.byte	0x1f
 	.2byte	0x74a
-	.4byte	0x8cd6
+	.4byte	0x8ceb
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1857
+	.4byte	.LASF1858
 	.byte	0x1f
 	.2byte	0x74b
-	.4byte	0x8d38
+	.4byte	0x8d4d
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1858
+	.4byte	.LASF1859
 	.byte	0x1f
 	.2byte	0x74c
-	.4byte	0x8d61
+	.4byte	0x8d76
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1859
+	.4byte	.LASF1860
 	.byte	0x1f
 	.2byte	0x74e
-	.4byte	0x8d81
+	.4byte	0x8d96
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1860
+	.4byte	.LASF1861
 	.byte	0x1f
 	.2byte	0x74f
-	.4byte	0x8da0
+	.4byte	0x8db5
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1861
+	.4byte	.LASF1862
 	.byte	0x1f
 	.2byte	0x750
-	.4byte	0x8dca
+	.4byte	0x8ddf
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1862
+	.4byte	.LASF1863
 	.byte	0x1f
 	.2byte	0x751
-	.4byte	0x8de9
+	.4byte	0x8dfe
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF1863
+	.4byte	.LASF1864
 	.byte	0x1f
 	.2byte	0x752
-	.4byte	0x8e13
+	.4byte	0x8e28
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1864
+	.4byte	.LASF1865
 	.byte	0x1f
 	.2byte	0x754
-	.4byte	0x8e38
+	.4byte	0x8e4d
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF1865
+	.4byte	.LASF1866
 	.byte	0x1f
 	.2byte	0x755
-	.4byte	0x8e61
+	.4byte	0x8e76
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF1866
+	.4byte	.LASF1867
 	.byte	0x1f
 	.2byte	0x758
-	.4byte	0x8d14
+	.4byte	0x8d29
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF1867
+	.4byte	.LASF1868
 	.byte	0x1f
 	.2byte	0x759
-	.4byte	0x8e80
+	.4byte	0x8e95
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x1f
 	.2byte	0x75b
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x1f
 	.2byte	0x75c
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x1f
 	.2byte	0x75d
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xc8
 	.uleb128 0x1b
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x1f
 	.2byte	0x75e
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xd0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x7c2d
+	.4byte	0x7c42
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7d9b
+	.4byte	0x7db0
 	.uleb128 0x24
-	.4byte	.LASF1868
+	.4byte	.LASF1869
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7da6
+	.4byte	0x7dbb
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7b4
+	.4byte	0x7c9
 	.uleb128 0x1d
-	.4byte	.LASF1869
+	.4byte	.LASF1870
 	.byte	0x38
 	.byte	0x1f
 	.2byte	0x450
-	.4byte	0x7df9
+	.4byte	0x7e0e
 	.uleb128 0x1b
-	.4byte	.LASF1870
+	.4byte	.LASF1871
 	.byte	0x1f
 	.2byte	0x451
-	.4byte	0xe50
+	.4byte	0xe65
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1871
+	.4byte	.LASF1872
 	.byte	0x1f
 	.2byte	0x452
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1872
+	.4byte	.LASF1873
 	.byte	0x1f
 	.2byte	0x453
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1873
+	.4byte	.LASF1874
 	.byte	0x1f
 	.2byte	0x454
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x28
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7db7
+	.4byte	0x7dcc
 	.uleb128 0x24
-	.4byte	.LASF1874
+	.4byte	.LASF1875
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7dff
+	.4byte	0x7e14
 	.uleb128 0x24
-	.4byte	.LASF1875
+	.4byte	.LASF1876
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7e0a
+	.4byte	0x7e1f
 	.uleb128 0x24
-	.4byte	.LASF1876
+	.4byte	.LASF1877
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7e15
+	.4byte	0x7e2a
 	.uleb128 0x1d
-	.4byte	.LASF1877
+	.4byte	.LASF1878
 	.byte	0x20
 	.byte	0x1f
 	.2byte	0x376
-	.4byte	0x7e7c
+	.4byte	0x7e91
 	.uleb128 0x1b
-	.4byte	.LASF115
+	.4byte	.LASF116
 	.byte	0x1f
 	.2byte	0x377
-	.4byte	0xe70
+	.4byte	0xe85
 	.byte	0
 	.uleb128 0x2b
 	.string	"pid"
 	.byte	0x1f
 	.2byte	0x378
-	.4byte	0x4628
+	.4byte	0x463d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF548
+	.4byte	.LASF549
 	.byte	0x1f
 	.2byte	0x379
-	.4byte	0x22b7
+	.4byte	0x22cc
 	.byte	0x10
 	.uleb128 0x2b
 	.string	"uid"
 	.byte	0x1f
 	.2byte	0x37a
-	.4byte	0x23fb
+	.4byte	0x2410
 	.byte	0x14
 	.uleb128 0x1b
-	.4byte	.LASF1103
+	.4byte	.LASF1104
 	.byte	0x1f
 	.2byte	0x37a
-	.4byte	0x23fb
+	.4byte	0x2410
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1878
+	.4byte	.LASF1879
 	.byte	0x1f
 	.2byte	0x37b
 	.4byte	0xc6
 	.byte	0x1c
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1879
+	.4byte	.LASF1880
 	.byte	0x20
 	.byte	0x1f
 	.2byte	0x381
-	.4byte	0x7ed8
+	.4byte	0x7eed
 	.uleb128 0x1b
-	.4byte	.LASF1880
+	.4byte	.LASF1881
 	.byte	0x1f
 	.2byte	0x382
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF986
+	.4byte	.LASF987
 	.byte	0x1f
 	.2byte	0x383
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1881
+	.4byte	.LASF1882
 	.byte	0x1f
 	.2byte	0x384
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF1882
+	.4byte	.LASF1883
 	.byte	0x1f
 	.2byte	0x387
 	.4byte	0x6d
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1883
+	.4byte	.LASF1884
 	.byte	0x1f
 	.2byte	0x388
 	.4byte	0x6d
 	.byte	0x14
 	.uleb128 0x1b
-	.4byte	.LASF1884
+	.4byte	.LASF1885
 	.byte	0x1f
 	.2byte	0x389
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.byte	0x18
 	.byte	0
 	.uleb128 0x3f
 	.byte	0x10
 	.byte	0x1f
 	.2byte	0x396
-	.4byte	0x7efa
+	.4byte	0x7f0f
 	.uleb128 0x41
-	.4byte	.LASF1885
+	.4byte	.LASF1886
 	.byte	0x1f
 	.2byte	0x397
-	.4byte	0x2f01
+	.4byte	0x2f16
 	.uleb128 0x41
-	.4byte	.LASF1886
+	.4byte	.LASF1887
 	.byte	0x1f
 	.2byte	0x398
-	.4byte	0x407
+	.4byte	0x41c
 	.byte	0
 	.uleb128 0x13
-	.4byte	.LASF1887
+	.4byte	.LASF1888
 	.byte	0x1f
 	.2byte	0x3ee
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x1d
-	.4byte	.LASF1888
+	.4byte	.LASF1889
 	.byte	0x20
 	.byte	0x1f
 	.2byte	0x3f2
-	.4byte	0x7f48
+	.4byte	0x7f5d
 	.uleb128 0x1b
-	.4byte	.LASF1889
+	.4byte	.LASF1890
 	.byte	0x1f
 	.2byte	0x3f3
-	.4byte	0x808f
+	.4byte	0x80a4
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1890
+	.4byte	.LASF1891
 	.byte	0x1f
 	.2byte	0x3f4
-	.4byte	0x80a0
+	.4byte	0x80b5
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x1f
 	.2byte	0x3f6
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x1f
 	.2byte	0x3f7
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x7f06
+	.4byte	0x7f1b
 	.uleb128 0x10
-	.4byte	0x7f5d
+	.4byte	0x7f72
 	.uleb128 0x11
-	.4byte	0x7f5d
+	.4byte	0x7f72
 	.uleb128 0x11
-	.4byte	0x7f5d
+	.4byte	0x7f72
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7f63
+	.4byte	0x7f78
 	.uleb128 0x1d
-	.4byte	.LASF1891
+	.4byte	.LASF1892
 	.byte	0xe8
 	.byte	0x1f
 	.2byte	0x42c
-	.4byte	0x808f
+	.4byte	0x80a4
 	.uleb128 0x1b
-	.4byte	.LASF1892
+	.4byte	.LASF1893
 	.byte	0x1f
 	.2byte	0x42d
-	.4byte	0x7f5d
+	.4byte	0x7f72
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1893
+	.4byte	.LASF1894
 	.byte	0x1f
 	.2byte	0x42e
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1894
+	.4byte	.LASF1895
 	.byte	0x1f
 	.2byte	0x42f
-	.4byte	0x3d6
+	.4byte	0x3eb
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1895
+	.4byte	.LASF1896
 	.byte	0x1f
 	.2byte	0x430
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1896
+	.4byte	.LASF1897
 	.byte	0x1f
 	.2byte	0x431
-	.4byte	0x7efa
+	.4byte	0x7f0f
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1897
+	.4byte	.LASF1898
 	.byte	0x1f
 	.2byte	0x432
 	.4byte	0x6d
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1898
+	.4byte	.LASF1899
 	.byte	0x1f
 	.2byte	0x433
 	.4byte	0x96
 	.byte	0x44
 	.uleb128 0x1b
-	.4byte	.LASF1899
+	.4byte	.LASF1900
 	.byte	0x1f
 	.2byte	0x434
 	.4byte	0x6d
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1900
+	.4byte	.LASF1901
 	.byte	0x1f
 	.2byte	0x435
 	.4byte	0xc6
 	.byte	0x4c
 	.uleb128 0x1b
-	.4byte	.LASF1901
+	.4byte	.LASF1902
 	.byte	0x1f
 	.2byte	0x436
-	.4byte	0x15aa
+	.4byte	0x15bf
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1902
+	.4byte	.LASF1903
 	.byte	0x1f
 	.2byte	0x437
-	.4byte	0x5547
+	.4byte	0x555c
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1903
+	.4byte	.LASF1904
 	.byte	0x1f
 	.2byte	0x438
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1904
+	.4byte	.LASF1905
 	.byte	0x1f
 	.2byte	0x439
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1905
+	.4byte	.LASF1906
 	.byte	0x1f
 	.2byte	0x43b
-	.4byte	0x830f
+	.4byte	0x8324
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1906
+	.4byte	.LASF1907
 	.byte	0x1f
 	.2byte	0x43d
 	.4byte	0x29
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF1907
+	.4byte	.LASF1908
 	.byte	0x1f
 	.2byte	0x43e
 	.4byte	0x29
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1908
+	.4byte	.LASF1909
 	.byte	0x1f
 	.2byte	0x440
-	.4byte	0x8315
+	.4byte	0x832a
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF1909
+	.4byte	.LASF1910
 	.byte	0x1f
 	.2byte	0x441
-	.4byte	0x831b
+	.4byte	0x8330
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF1910
+	.4byte	.LASF1911
 	.byte	0x1f
 	.2byte	0x449
-	.4byte	0x8285
+	.4byte	0x829a
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF1911
+	.4byte	.LASF1912
 	.byte	0x1f
 	.2byte	0x44b
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0xc8
 	.uleb128 0x1b
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x1f
 	.2byte	0x44c
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xd8
 	.uleb128 0x1b
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x1f
 	.2byte	0x44d
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xe0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7f4d
+	.4byte	0x7f62
 	.uleb128 0x10
-	.4byte	0x80a0
+	.4byte	0x80b5
 	.uleb128 0x11
-	.4byte	0x7f5d
+	.4byte	0x7f72
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8095
+	.4byte	0x80aa
 	.uleb128 0x1d
-	.4byte	.LASF1912
+	.4byte	.LASF1913
 	.byte	0x58
 	.byte	0x1f
 	.2byte	0x3fa
-	.4byte	0x8143
+	.4byte	0x8158
 	.uleb128 0x1b
-	.4byte	.LASF1913
+	.4byte	.LASF1914
 	.byte	0x1f
 	.2byte	0x3fb
-	.4byte	0x815c
+	.4byte	0x8171
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1914
+	.4byte	.LASF1915
 	.byte	0x1f
 	.2byte	0x3fc
-	.4byte	0x8171
+	.4byte	0x8186
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1915
+	.4byte	.LASF1916
 	.byte	0x1f
 	.2byte	0x3fd
-	.4byte	0x8186
+	.4byte	0x819b
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1916
+	.4byte	.LASF1917
 	.byte	0x1f
 	.2byte	0x3fe
-	.4byte	0x8197
+	.4byte	0x81ac
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1917
+	.4byte	.LASF1918
 	.byte	0x1f
 	.2byte	0x3ff
-	.4byte	0x80a0
+	.4byte	0x80b5
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1918
+	.4byte	.LASF1919
 	.byte	0x1f
 	.2byte	0x400
-	.4byte	0x81b1
+	.4byte	0x81c6
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1919
+	.4byte	.LASF1920
 	.byte	0x1f
 	.2byte	0x401
-	.4byte	0x81c6
+	.4byte	0x81db
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1920
+	.4byte	.LASF1921
 	.byte	0x1f
 	.2byte	0x402
-	.4byte	0x81e5
+	.4byte	0x81fa
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1921
+	.4byte	.LASF1922
 	.byte	0x1f
 	.2byte	0x403
-	.4byte	0x81fb
+	.4byte	0x8210
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x1f
 	.2byte	0x405
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x1f
 	.2byte	0x406
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x50
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x80a6
+	.4byte	0x80bb
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x815c
+	.4byte	0x8171
 	.uleb128 0x11
-	.4byte	0x7f5d
+	.4byte	0x7f72
 	.uleb128 0x11
-	.4byte	0x7f5d
+	.4byte	0x7f72
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8148
+	.4byte	0x815d
 	.uleb128 0x14
 	.4byte	0x29
-	.4byte	0x8171
+	.4byte	0x8186
 	.uleb128 0x11
-	.4byte	0x7f5d
+	.4byte	0x7f72
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8162
+	.4byte	0x8177
 	.uleb128 0x14
-	.4byte	0x7efa
-	.4byte	0x8186
+	.4byte	0x7f0f
+	.4byte	0x819b
 	.uleb128 0x11
-	.4byte	0x7efa
+	.4byte	0x7f0f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8177
+	.4byte	0x818c
 	.uleb128 0x10
-	.4byte	0x8197
+	.4byte	0x81ac
 	.uleb128 0x11
-	.4byte	0x7efa
+	.4byte	0x7f0f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x818c
+	.4byte	0x81a1
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x81b1
+	.4byte	0x81c6
 	.uleb128 0x11
-	.4byte	0x7f5d
+	.4byte	0x7f72
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x819d
+	.4byte	0x81b2
 	.uleb128 0x14
-	.4byte	0x29b
-	.4byte	0x81c6
+	.4byte	0x2b0
+	.4byte	0x81db
 	.uleb128 0x11
-	.4byte	0x7f5d
+	.4byte	0x7f72
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x81b7
+	.4byte	0x81cc
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x81e5
+	.4byte	0x81fa
 	.uleb128 0x11
-	.4byte	0x7f5d
+	.4byte	0x7f72
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0x3b7
+	.4byte	0x3cc
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x81cc
+	.4byte	0x81e1
 	.uleb128 0x10
-	.4byte	0x81fb
+	.4byte	0x8210
 	.uleb128 0x11
-	.4byte	0x7f5d
+	.4byte	0x7f72
 	.uleb128 0x11
-	.4byte	0x7855
+	.4byte	0x786a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x81eb
+	.4byte	0x8200
 	.uleb128 0xd
-	.4byte	.LASF1922
+	.4byte	.LASF1923
 	.byte	0x20
 	.byte	0x8c
 	.byte	0xa
-	.4byte	0x8232
+	.4byte	0x8247
 	.uleb128 0xe
-	.4byte	.LASF577
+	.4byte	.LASF578
 	.byte	0x8c
 	.byte	0xb
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF97
+	.4byte	.LASF98
 	.byte	0x8c
 	.byte	0xc
-	.4byte	0x8237
+	.4byte	0x824c
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF961
+	.4byte	.LASF962
 	.byte	0x8c
 	.byte	0xd
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x10
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1923
+	.4byte	.LASF1924
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8232
+	.4byte	0x8247
 	.uleb128 0xd
-	.4byte	.LASF1924
+	.4byte	.LASF1925
 	.byte	0x8
 	.byte	0x8c
 	.byte	0x11
-	.4byte	0x8256
+	.4byte	0x826b
 	.uleb128 0xe
-	.4byte	.LASF97
+	.4byte	.LASF98
 	.byte	0x8c
 	.byte	0x12
-	.4byte	0x825b
+	.4byte	0x8270
 	.byte	0
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1925
+	.4byte	.LASF1926
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8256
+	.4byte	0x826b
 	.uleb128 0x2e
 	.byte	0x18
 	.byte	0x1f
 	.2byte	0x445
-	.4byte	0x8285
+	.4byte	0x829a
 	.uleb128 0x1b
-	.4byte	.LASF1852
+	.4byte	.LASF1853
 	.byte	0x1f
 	.2byte	0x446
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF577
+	.4byte	.LASF578
 	.byte	0x1f
 	.2byte	0x447
 	.4byte	0xc6
@@ -26322,771 +26309,771 @@ __exitcall_ebc_exit:
 	.byte	0x20
 	.byte	0x1f
 	.2byte	0x442
-	.4byte	0x82b3
+	.4byte	0x82c8
 	.uleb128 0x41
-	.4byte	.LASF1926
+	.4byte	.LASF1927
 	.byte	0x1f
 	.2byte	0x443
-	.4byte	0x8201
+	.4byte	0x8216
 	.uleb128 0x41
-	.4byte	.LASF1927
+	.4byte	.LASF1928
 	.byte	0x1f
 	.2byte	0x444
-	.4byte	0x823d
+	.4byte	0x8252
 	.uleb128 0x3d
 	.string	"afs"
 	.byte	0x1f
 	.2byte	0x448
-	.4byte	0x8261
+	.4byte	0x8276
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1928
+	.4byte	.LASF1929
 	.byte	0x30
 	.byte	0x1f
 	.2byte	0x521
-	.4byte	0x830f
+	.4byte	0x8324
 	.uleb128 0x1b
-	.4byte	.LASF1929
+	.4byte	.LASF1930
 	.byte	0x1f
 	.2byte	0x522
-	.4byte	0xe70
+	.4byte	0xe85
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1930
+	.4byte	.LASF1931
 	.byte	0x1f
 	.2byte	0x523
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1931
+	.4byte	.LASF1932
 	.byte	0x1f
 	.2byte	0x524
 	.4byte	0xc6
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF1932
+	.4byte	.LASF1933
 	.byte	0x1f
 	.2byte	0x525
-	.4byte	0x830f
+	.4byte	0x8324
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1933
+	.4byte	.LASF1934
 	.byte	0x1f
 	.2byte	0x526
-	.4byte	0x5547
+	.4byte	0x555c
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1934
+	.4byte	.LASF1935
 	.byte	0x1f
 	.2byte	0x527
-	.4byte	0x407
+	.4byte	0x41c
 	.byte	0x20
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x82b3
+	.4byte	0x82c8
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7f48
+	.4byte	0x7f5d
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8143
+	.4byte	0x8158
 	.uleb128 0x1a
-	.4byte	.LASF1935
+	.4byte	.LASF1936
 	.2byte	0x1b8
 	.byte	0x1f
 	.2byte	0x57d
-	.4byte	0x8357
+	.4byte	0x836c
 	.uleb128 0x1b
-	.4byte	.LASF1242
+	.4byte	.LASF1243
 	.byte	0x1f
 	.2byte	0x57e
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1936
+	.4byte	.LASF1937
 	.byte	0x1f
 	.2byte	0x57f
-	.4byte	0x15aa
+	.4byte	0x15bf
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1394
+	.4byte	.LASF1395
 	.byte	0x1f
 	.2byte	0x580
-	.4byte	0x8357
+	.4byte	0x836c
 	.byte	0x20
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x5cac
-	.4byte	0x8367
+	.4byte	0x5cc1
+	.4byte	0x837c
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1937
+	.4byte	.LASF1938
 	.byte	0x68
 	.byte	0x1f
 	.2byte	0x8ac
-	.4byte	0x8479
+	.4byte	0x848e
 	.uleb128 0x1b
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0x1f
 	.2byte	0x8ad
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1938
+	.4byte	.LASF1939
 	.byte	0x1f
 	.2byte	0x8ae
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1939
+	.4byte	.LASF1940
 	.byte	0x1f
 	.2byte	0x8b4
-	.4byte	0x90a8
+	.4byte	0x90bd
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1940
+	.4byte	.LASF1941
 	.byte	0x1f
 	.2byte	0x8b6
-	.4byte	0x90d1
+	.4byte	0x90e6
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1941
+	.4byte	.LASF1942
 	.byte	0x1f
 	.2byte	0x8b8
-	.4byte	0x90dc
+	.4byte	0x90f1
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1942
+	.4byte	.LASF1943
 	.byte	0x1f
 	.2byte	0x8b9
-	.4byte	0x8efc
+	.4byte	0x8f11
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF97
+	.4byte	.LASF98
 	.byte	0x1f
 	.2byte	0x8ba
-	.4byte	0x7566
+	.4byte	0x757b
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF63
+	.4byte	.LASF64
 	.byte	0x1f
 	.2byte	0x8bb
-	.4byte	0x8479
+	.4byte	0x848e
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1943
+	.4byte	.LASF1944
 	.byte	0x1f
 	.2byte	0x8bc
-	.4byte	0x3bd
+	.4byte	0x3d2
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1944
+	.4byte	.LASF1945
 	.byte	0x1f
 	.2byte	0x8be
-	.4byte	0xdfc
+	.4byte	0xe11
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1945
+	.4byte	.LASF1946
 	.byte	0x1f
 	.2byte	0x8bf
-	.4byte	0xdfc
+	.4byte	0xe11
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1946
+	.4byte	.LASF1947
 	.byte	0x1f
 	.2byte	0x8c0
-	.4byte	0xdfc
+	.4byte	0xe11
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1947
+	.4byte	.LASF1948
 	.byte	0x1f
 	.2byte	0x8c1
-	.4byte	0x90e2
+	.4byte	0x90f7
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1948
+	.4byte	.LASF1949
 	.byte	0x1f
 	.2byte	0x8c3
-	.4byte	0xdfc
+	.4byte	0xe11
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1949
+	.4byte	.LASF1950
 	.byte	0x1f
 	.2byte	0x8c4
-	.4byte	0xdfc
+	.4byte	0xe11
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1950
+	.4byte	.LASF1951
 	.byte	0x1f
 	.2byte	0x8c5
-	.4byte	0xdfc
+	.4byte	0xe11
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x1f
 	.2byte	0x8c7
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x1f
 	.2byte	0x8c8
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x1f
 	.2byte	0x8c9
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x1f
 	.2byte	0x8ca
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x60
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8367
+	.4byte	0x837c
 	.uleb128 0x1a
-	.4byte	.LASF1951
+	.4byte	.LASF1952
 	.2byte	0x110
 	.byte	0x1f
 	.2byte	0x78f
-	.4byte	0x864a
+	.4byte	0x865f
 	.uleb128 0x1b
-	.4byte	.LASF1952
+	.4byte	.LASF1953
 	.byte	0x1f
 	.2byte	0x790
-	.4byte	0x8e95
+	.4byte	0x8eaa
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1953
+	.4byte	.LASF1954
 	.byte	0x1f
 	.2byte	0x791
-	.4byte	0x8ea6
+	.4byte	0x8ebb
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1954
+	.4byte	.LASF1955
 	.byte	0x1f
 	.2byte	0x793
-	.4byte	0x8ebc
+	.4byte	0x8ed1
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1955
+	.4byte	.LASF1956
 	.byte	0x1f
 	.2byte	0x794
-	.4byte	0x8ed6
+	.4byte	0x8eeb
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1956
+	.4byte	.LASF1957
 	.byte	0x1f
 	.2byte	0x795
-	.4byte	0x8eeb
+	.4byte	0x8f00
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1957
+	.4byte	.LASF1958
 	.byte	0x1f
 	.2byte	0x796
-	.4byte	0x8ea6
+	.4byte	0x8ebb
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1958
+	.4byte	.LASF1959
 	.byte	0x1f
 	.2byte	0x797
-	.4byte	0x8efc
+	.4byte	0x8f11
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1959
+	.4byte	.LASF1960
 	.byte	0x1f
 	.2byte	0x798
-	.4byte	0x6d28
+	.4byte	0x6d3d
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1960
+	.4byte	.LASF1961
 	.byte	0x1f
 	.2byte	0x799
-	.4byte	0x8f11
+	.4byte	0x8f26
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1961
+	.4byte	.LASF1962
 	.byte	0x1f
 	.2byte	0x79a
-	.4byte	0x8f11
+	.4byte	0x8f26
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1962
+	.4byte	.LASF1963
 	.byte	0x1f
 	.2byte	0x79b
-	.4byte	0x8f11
+	.4byte	0x8f26
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1963
+	.4byte	.LASF1964
 	.byte	0x1f
 	.2byte	0x79c
-	.4byte	0x8f11
+	.4byte	0x8f26
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1964
+	.4byte	.LASF1965
 	.byte	0x1f
 	.2byte	0x79d
-	.4byte	0x8f36
+	.4byte	0x8f4b
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1965
+	.4byte	.LASF1966
 	.byte	0x1f
 	.2byte	0x79e
-	.4byte	0x8f55
+	.4byte	0x8f6a
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1966
+	.4byte	.LASF1967
 	.byte	0x1f
 	.2byte	0x79f
-	.4byte	0x8f79
+	.4byte	0x8f8e
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1967
+	.4byte	.LASF1968
 	.byte	0x1f
 	.2byte	0x7a0
-	.4byte	0x3157
+	.4byte	0x316c
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1968
+	.4byte	.LASF1969
 	.byte	0x1f
 	.2byte	0x7a1
-	.4byte	0x8f8f
+	.4byte	0x8fa4
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1969
+	.4byte	.LASF1970
 	.byte	0x1f
 	.2byte	0x7a2
-	.4byte	0x8efc
+	.4byte	0x8f11
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF1970
+	.4byte	.LASF1971
 	.byte	0x1f
 	.2byte	0x7a3
-	.4byte	0x8fa5
+	.4byte	0x8fba
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1971
+	.4byte	.LASF1972
 	.byte	0x1f
 	.2byte	0x7a5
-	.4byte	0x8fbf
+	.4byte	0x8fd4
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF1972
+	.4byte	.LASF1973
 	.byte	0x1f
 	.2byte	0x7a6
-	.4byte	0x8fde
+	.4byte	0x8ff3
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF1973
+	.4byte	.LASF1974
 	.byte	0x1f
 	.2byte	0x7a7
-	.4byte	0x8fbf
+	.4byte	0x8fd4
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF1974
+	.4byte	.LASF1975
 	.byte	0x1f
 	.2byte	0x7a8
-	.4byte	0x8fbf
+	.4byte	0x8fd4
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF1975
+	.4byte	.LASF1976
 	.byte	0x1f
 	.2byte	0x7a9
-	.4byte	0x8fbf
+	.4byte	0x8fd4
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF1976
+	.4byte	.LASF1977
 	.byte	0x1f
 	.2byte	0x7ab
-	.4byte	0x9007
+	.4byte	0x901c
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF1977
+	.4byte	.LASF1978
 	.byte	0x1f
 	.2byte	0x7ac
-	.4byte	0x9030
+	.4byte	0x9045
 	.byte	0xc8
 	.uleb128 0x1b
-	.4byte	.LASF1978
+	.4byte	.LASF1979
 	.byte	0x1f
 	.2byte	0x7ad
-	.4byte	0x904b
+	.4byte	0x9060
 	.byte	0xd0
 	.uleb128 0x1b
-	.4byte	.LASF1979
+	.4byte	.LASF1980
 	.byte	0x1f
 	.2byte	0x7af
-	.4byte	0x906a
+	.4byte	0x907f
 	.byte	0xd8
 	.uleb128 0x1b
-	.4byte	.LASF1980
+	.4byte	.LASF1981
 	.byte	0x1f
 	.2byte	0x7b0
-	.4byte	0x9084
+	.4byte	0x9099
 	.byte	0xe0
 	.uleb128 0x1b
-	.4byte	.LASF1981
+	.4byte	.LASF1982
 	.byte	0x1f
 	.2byte	0x7b2
-	.4byte	0x9084
+	.4byte	0x9099
 	.byte	0xe8
 	.uleb128 0x1b
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x1f
 	.2byte	0x7b5
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xf0
 	.uleb128 0x1b
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x1f
 	.2byte	0x7b6
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xf8
 	.uleb128 0x1c
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x1f
 	.2byte	0x7b7
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x100
 	.uleb128 0x1c
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x1f
 	.2byte	0x7b8
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x108
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x847f
+	.4byte	0x8494
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x864a
+	.4byte	0x865f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6e1a
+	.4byte	0x6e2f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7172
+	.4byte	0x7187
 	.uleb128 0x24
-	.4byte	.LASF1982
+	.4byte	.LASF1983
 	.uleb128 0x3
-	.4byte	0x8661
+	.4byte	0x8676
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8666
+	.4byte	0x867b
 	.uleb128 0x24
-	.4byte	.LASF1983
+	.4byte	.LASF1984
 	.uleb128 0x3
-	.4byte	0x8671
+	.4byte	0x8686
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8681
+	.4byte	0x8696
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8676
+	.4byte	0x868b
 	.uleb128 0x24
-	.4byte	.LASF1984
+	.4byte	.LASF1985
 	.uleb128 0x3
-	.4byte	0x8687
+	.4byte	0x869c
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x868c
+	.4byte	0x86a1
 	.uleb128 0x32
 	.string	"key"
 	.byte	0xd0
 	.byte	0x8d
 	.byte	0x9b
-	.4byte	0x8764
+	.4byte	0x8779
 	.uleb128 0xe
-	.4byte	.LASF579
+	.4byte	.LASF580
 	.byte	0x8d
 	.byte	0x9c
-	.4byte	0x337d
+	.4byte	0x3392
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1985
+	.4byte	.LASF1986
 	.byte	0x8d
 	.byte	0x9d
-	.4byte	0x93ae
+	.4byte	0x93c3
 	.byte	0x4
 	.uleb128 0x23
-	.4byte	0x94a9
+	.4byte	0x94be
 	.byte	0x8
 	.uleb128 0x20
 	.string	"sem"
 	.byte	0x8d
 	.byte	0xa2
-	.4byte	0x4e21
+	.4byte	0x4e36
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1117
+	.4byte	.LASF1118
 	.byte	0x8d
 	.byte	0xa3
-	.4byte	0x9560
+	.4byte	0x9575
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF746
+	.4byte	.LASF747
 	.byte	0x8d
 	.byte	0xa4
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x58
 	.uleb128 0x23
-	.4byte	0x94c8
+	.4byte	0x94dd
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF1986
+	.4byte	.LASF1987
 	.byte	0x8d
 	.byte	0xa9
-	.4byte	0x9bd
+	.4byte	0x9d2
 	.byte	0x68
 	.uleb128 0x20
 	.string	"uid"
 	.byte	0x8d
 	.byte	0xaa
-	.4byte	0x23fb
+	.4byte	0x2410
 	.byte	0x70
 	.uleb128 0x20
 	.string	"gid"
 	.byte	0x8d
 	.byte	0xab
-	.4byte	0x241b
+	.4byte	0x2430
 	.byte	0x74
 	.uleb128 0xe
-	.4byte	.LASF1987
+	.4byte	.LASF1988
 	.byte	0x8d
 	.byte	0xac
-	.4byte	0x93b9
+	.4byte	0x93ce
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF1988
+	.4byte	.LASF1989
 	.byte	0x8d
 	.byte	0xad
 	.4byte	0xb4
 	.byte	0x7c
 	.uleb128 0xe
-	.4byte	.LASF1989
+	.4byte	.LASF1990
 	.byte	0x8d
 	.byte	0xae
 	.4byte	0xb4
 	.byte	0x7e
 	.uleb128 0xe
-	.4byte	.LASF577
+	.4byte	.LASF578
 	.byte	0x8d
 	.byte	0xb2
 	.4byte	0xa2
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x8d
 	.byte	0xb9
 	.4byte	0x29
 	.byte	0x88
 	.uleb128 0x23
-	.4byte	0x9508
+	.4byte	0x951d
 	.byte	0x90
 	.uleb128 0x23
-	.4byte	0x9542
+	.4byte	0x9557
 	.byte	0xa8
 	.uleb128 0xe
-	.4byte	.LASF1990
+	.4byte	.LASF1991
 	.byte	0x8d
 	.byte	0xea
-	.4byte	0x9566
+	.4byte	0x957b
 	.byte	0xc8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8697
+	.4byte	0x86ac
 	.uleb128 0x24
-	.4byte	.LASF1991
+	.4byte	.LASF1992
 	.uleb128 0x3
-	.4byte	0x876a
+	.4byte	0x877f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x876f
+	.4byte	0x8784
 	.uleb128 0x24
-	.4byte	.LASF1992
+	.4byte	.LASF1993
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x877a
+	.4byte	0x878f
 	.uleb128 0x24
-	.4byte	.LASF1993
+	.4byte	.LASF1994
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8785
+	.4byte	0x879a
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x87a0
+	.4byte	0x87b5
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1f
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1994
+	.4byte	.LASF1995
 	.byte	0x18
 	.byte	0x1f
 	.2byte	0x6c5
-	.4byte	0x87e2
+	.4byte	0x87f7
 	.uleb128 0x1b
-	.4byte	.LASF1995
+	.4byte	.LASF1996
 	.byte	0x1f
 	.2byte	0x6c6
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1996
+	.4byte	.LASF1997
 	.byte	0x1f
 	.2byte	0x6c7
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF1997
+	.4byte	.LASF1998
 	.byte	0x1f
 	.2byte	0x6c8
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1998
+	.4byte	.LASF1999
 	.byte	0x1f
 	.2byte	0x6c9
-	.4byte	0x87e2
+	.4byte	0x87f7
 	.byte	0x10
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5b8d
+	.4byte	0x5ba2
 	.uleb128 0x13
-	.4byte	.LASF1999
+	.4byte	.LASF2000
 	.byte	0x1f
 	.2byte	0x6e7
-	.4byte	0x87f4
+	.4byte	0x8809
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x87fa
+	.4byte	0x880f
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8822
+	.4byte	0x8837
 	.uleb128 0x11
-	.4byte	0x8822
+	.4byte	0x8837
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.uleb128 0x11
-	.4byte	0x155
+	.4byte	0x15a
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8828
+	.4byte	0x883d
 	.uleb128 0x1d
-	.4byte	.LASF2000
+	.4byte	.LASF2001
 	.byte	0x10
 	.byte	0x1f
 	.2byte	0x6ea
-	.4byte	0x8850
+	.4byte	0x8865
 	.uleb128 0x1b
-	.4byte	.LASF2001
+	.4byte	.LASF2002
 	.byte	0x1f
 	.2byte	0x6eb
-	.4byte	0x87e8
+	.4byte	0x87fd
 	.byte	0
 	.uleb128 0x2b
 	.string	"pos"
 	.byte	0x1f
 	.2byte	0x6ec
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.byte	0x8
 	.byte	0
 	.uleb128 0x14
-	.4byte	0x2c3
-	.4byte	0x8869
+	.4byte	0x2d8
+	.4byte	0x887e
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8850
+	.4byte	0x8865
 	.uleb128 0x14
-	.4byte	0x2d9
-	.4byte	0x888d
+	.4byte	0x2ee
+	.4byte	0x88a2
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x219
+	.4byte	0x21e
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0x888d
+	.4byte	0x88a2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x886f
+	.4byte	0x8884
 	.uleb128 0x14
-	.4byte	0x2d9
-	.4byte	0x88b7
+	.4byte	0x2ee
+	.4byte	0x88cc
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0x888d
+	.4byte	0x88a2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8899
+	.4byte	0x88ae
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x88d1
+	.4byte	0x88e6
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x8822
+	.4byte	0x8837
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x88bd
+	.4byte	0x88d2
 	.uleb128 0x14
-	.4byte	0x22f
-	.4byte	0x88eb
+	.4byte	0x244
+	.4byte	0x8900
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x88eb
+	.4byte	0x8900
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x88f1
+	.4byte	0x8906
 	.uleb128 0x24
-	.4byte	.LASF2002
+	.4byte	.LASF2003
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x88d7
+	.4byte	0x88ec
 	.uleb128 0x14
-	.4byte	0x194
-	.4byte	0x8915
+	.4byte	0x199
+	.4byte	0x892a
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
@@ -27094,922 +27081,922 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x88fc
+	.4byte	0x8911
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x892f
+	.4byte	0x8944
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x3ca0
+	.4byte	0x3cb5
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x891b
+	.4byte	0x8930
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8949
+	.4byte	0x895e
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8935
+	.4byte	0x894a
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8963
+	.4byte	0x8978
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x7efa
+	.4byte	0x7f0f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x894f
+	.4byte	0x8964
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8987
+	.4byte	0x899c
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.uleb128 0x11
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8969
+	.4byte	0x897e
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x89a6
+	.4byte	0x89bb
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x898d
+	.4byte	0x89a2
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x89c5
+	.4byte	0x89da
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0x7f5d
+	.4byte	0x7f72
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x89ac
+	.4byte	0x89c1
 	.uleb128 0x14
-	.4byte	0x2d9
-	.4byte	0x89f3
+	.4byte	0x2ee
+	.4byte	0x8a08
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x3454
+	.4byte	0x3469
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0x888d
+	.4byte	0x88a2
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x89cb
+	.4byte	0x89e0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8a08
+	.4byte	0x8a1d
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x89f9
+	.4byte	0x8a0e
 	.uleb128 0x14
-	.4byte	0x2d9
-	.4byte	0x8a31
+	.4byte	0x2ee
+	.4byte	0x8a46
 	.uleb128 0x11
-	.4byte	0x4946
+	.4byte	0x495b
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x888d
+	.4byte	0x88a2
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8a0e
+	.4byte	0x8a23
 	.uleb128 0x14
-	.4byte	0x2d9
-	.4byte	0x8a5a
+	.4byte	0x2ee
+	.4byte	0x8a6f
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x888d
+	.4byte	0x88a2
 	.uleb128 0x11
-	.4byte	0x4946
+	.4byte	0x495b
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8a37
+	.4byte	0x8a4c
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8a7e
+	.4byte	0x8a93
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x194
+	.4byte	0x199
 	.uleb128 0x11
-	.4byte	0x8a7e
+	.4byte	0x8a93
 	.uleb128 0x11
-	.4byte	0x7855
+	.4byte	0x786a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7f5d
+	.4byte	0x7f72
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8a60
+	.4byte	0x8a75
 	.uleb128 0x14
-	.4byte	0x194
-	.4byte	0x8aa8
+	.4byte	0x199
+	.4byte	0x8abd
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.uleb128 0x11
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8a8a
+	.4byte	0x8a9f
 	.uleb128 0x10
-	.4byte	0x8abe
+	.4byte	0x8ad3
 	.uleb128 0x11
-	.4byte	0x8abe
+	.4byte	0x8ad3
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8ac4
+	.4byte	0x8ad9
 	.uleb128 0xd
-	.4byte	.LASF2003
+	.4byte	.LASF2004
 	.byte	0x80
 	.byte	0x8e
 	.byte	0x10
-	.4byte	0x8b6c
+	.4byte	0x8b81
 	.uleb128 0x20
 	.string	"buf"
 	.byte	0x8e
 	.byte	0x11
-	.4byte	0x219
+	.4byte	0x21e
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF986
+	.4byte	.LASF987
 	.byte	0x8e
 	.byte	0x12
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2004
+	.4byte	.LASF2005
 	.byte	0x8e
 	.byte	0x13
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF382
+	.4byte	.LASF383
 	.byte	0x8e
 	.byte	0x14
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2005
+	.4byte	.LASF2006
 	.byte	0x8e
 	.byte	0x15
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF879
+	.4byte	.LASF880
 	.byte	0x8e
 	.byte	0x16
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2006
+	.4byte	.LASF2007
 	.byte	0x8e
 	.byte	0x17
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1724
+	.4byte	.LASF1725
 	.byte	0x8e
 	.byte	0x18
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF115
+	.4byte	.LASF116
 	.byte	0x8e
 	.byte	0x19
-	.4byte	0x2455
+	.4byte	0x246a
 	.byte	0x40
 	.uleb128 0x20
 	.string	"op"
 	.byte	0x8e
 	.byte	0x1a
-	.4byte	0x96a1
+	.4byte	0x96b6
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2007
+	.4byte	.LASF2008
 	.byte	0x8e
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF1272
+	.4byte	.LASF1273
 	.byte	0x8e
 	.byte	0x1c
-	.4byte	0x96a7
+	.4byte	0x96bc
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF359
+	.4byte	.LASF360
 	.byte	0x8e
 	.byte	0x1d
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x78
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8aae
+	.4byte	0x8ac3
 	.uleb128 0x14
-	.4byte	0x2d9
-	.4byte	0x8b9a
+	.4byte	0x2ee
+	.4byte	0x8baf
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8b72
+	.4byte	0x8b87
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8bc3
+	.4byte	0x8bd8
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.uleb128 0x11
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8ba0
+	.4byte	0x8bb5
 	.uleb128 0x14
-	.4byte	0x1980
-	.4byte	0x8be2
+	.4byte	0x1995
+	.4byte	0x8bf7
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8bc9
+	.4byte	0x8bde
 	.uleb128 0x14
 	.4byte	0x56
-	.4byte	0x8c01
+	.4byte	0x8c16
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x8c01
+	.4byte	0x8c16
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5cf5
+	.4byte	0x5d0a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8be8
+	.4byte	0x8bfd
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8c21
+	.4byte	0x8c36
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8c0d
+	.4byte	0x8c22
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8c40
+	.4byte	0x8c55
 	.uleb128 0x11
-	.4byte	0x224f
+	.4byte	0x2264
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8c27
+	.4byte	0x8c3c
 	.uleb128 0x14
-	.4byte	0x7c27
-	.4byte	0x8c5a
+	.4byte	0x7c3c
+	.4byte	0x8c6f
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8c46
+	.4byte	0x8c5b
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8c79
+	.4byte	0x8c8e
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.uleb128 0x11
-	.4byte	0x219
+	.4byte	0x21e
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8c60
+	.4byte	0x8c75
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8c9d
+	.4byte	0x8cb2
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.uleb128 0x11
-	.4byte	0x27a
+	.4byte	0x28f
 	.uleb128 0x11
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8c7f
+	.4byte	0x8c94
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8cbc
+	.4byte	0x8cd1
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8ca3
+	.4byte	0x8cb8
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8cd6
+	.4byte	0x8ceb
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8cc2
+	.4byte	0x8cd7
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8cf5
+	.4byte	0x8d0a
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.uleb128 0x11
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8cdc
+	.4byte	0x8cf1
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8d14
+	.4byte	0x8d29
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.uleb128 0x11
-	.4byte	0x27a
+	.4byte	0x28f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8cfb
+	.4byte	0x8d10
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8d38
+	.4byte	0x8d4d
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.uleb128 0x11
-	.4byte	0x27a
+	.4byte	0x28f
 	.uleb128 0x11
-	.4byte	0x26f
+	.4byte	0x284
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8d1a
+	.4byte	0x8d2f
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8d61
+	.4byte	0x8d76
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8d3e
+	.4byte	0x8d53
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8d7b
+	.4byte	0x8d90
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.uleb128 0x11
-	.4byte	0x8d7b
+	.4byte	0x8d90
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5f89
+	.4byte	0x5f9e
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8d67
+	.4byte	0x8d7c
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8da0
+	.4byte	0x8db5
 	.uleb128 0x11
-	.4byte	0x224f
+	.4byte	0x2264
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.uleb128 0x11
-	.4byte	0x8d7b
+	.4byte	0x8d90
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8d87
+	.4byte	0x8d9c
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8dc4
+	.4byte	0x8dd9
 	.uleb128 0x11
-	.4byte	0x20fd
+	.4byte	0x2112
 	.uleb128 0x11
-	.4byte	0x8dc4
+	.4byte	0x8dd9
 	.uleb128 0x11
-	.4byte	0x13a
+	.4byte	0x13f
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4a85
+	.4byte	0x4a9a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8da6
+	.4byte	0x8dbb
 	.uleb128 0x14
-	.4byte	0x2d9
-	.4byte	0x8de9
+	.4byte	0x2ee
+	.4byte	0x8dfe
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.uleb128 0x11
-	.4byte	0x219
+	.4byte	0x21e
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8dd0
+	.4byte	0x8de5
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8e0d
+	.4byte	0x8e22
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x8e0d
+	.4byte	0x8e22
 	.uleb128 0x11
-	.4byte	0x155
+	.4byte	0x15a
 	.uleb128 0x11
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x87a0
+	.4byte	0x87b5
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8def
+	.4byte	0x8e04
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8e32
+	.4byte	0x8e47
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x8e32
+	.4byte	0x8e47
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa12
+	.4byte	0xa27
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8e19
+	.4byte	0x8e2e
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8e61
+	.4byte	0x8e76
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
-	.4byte	0x27a
+	.4byte	0x28f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8e3e
+	.4byte	0x8e53
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8e80
+	.4byte	0x8e95
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x7c27
+	.4byte	0x7c3c
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8e67
+	.4byte	0x8e7c
 	.uleb128 0x14
-	.4byte	0x1c6a
-	.4byte	0x8e95
+	.4byte	0x1c7f
+	.4byte	0x8eaa
 	.uleb128 0x11
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8e86
+	.4byte	0x8e9b
 	.uleb128 0x10
-	.4byte	0x8ea6
+	.4byte	0x8ebb
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8e9b
+	.4byte	0x8eb0
 	.uleb128 0x10
-	.4byte	0x8ebc
+	.4byte	0x8ed1
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8eac
+	.4byte	0x8ec1
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8ed6
+	.4byte	0x8eeb
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.uleb128 0x11
-	.4byte	0x77aa
+	.4byte	0x77bf
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8ec2
+	.4byte	0x8ed7
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8eeb
+	.4byte	0x8f00
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8edc
+	.4byte	0x8ef1
 	.uleb128 0x10
-	.4byte	0x8efc
+	.4byte	0x8f11
 	.uleb128 0x11
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8ef1
+	.4byte	0x8f06
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8f11
+	.4byte	0x8f26
 	.uleb128 0x11
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8f02
+	.4byte	0x8f17
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8f2b
+	.4byte	0x8f40
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.uleb128 0x11
-	.4byte	0x8f2b
+	.4byte	0x8f40
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8f31
+	.4byte	0x8f46
 	.uleb128 0x24
-	.4byte	.LASF2008
+	.4byte	.LASF2009
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8f17
+	.4byte	0x8f2c
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8f55
+	.4byte	0x8f6a
 	.uleb128 0x11
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.uleb128 0x11
-	.4byte	0x4669
+	.4byte	0x467e
 	.uleb128 0x11
-	.4byte	0x219
+	.4byte	0x21e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8f3c
+	.4byte	0x8f51
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8f79
+	.4byte	0x8f8e
 	.uleb128 0x11
-	.4byte	0x224f
+	.4byte	0x2264
 	.uleb128 0x11
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.uleb128 0x11
-	.4byte	0x4669
+	.4byte	0x467e
 	.uleb128 0x11
-	.4byte	0x219
+	.4byte	0x21e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8f5b
+	.4byte	0x8f70
 	.uleb128 0x10
-	.4byte	0x8f8f
+	.4byte	0x8fa4
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8f7f
+	.4byte	0x8f94
 	.uleb128 0x10
-	.4byte	0x8fa5
+	.4byte	0x8fba
 	.uleb128 0x11
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8f95
+	.4byte	0x8faa
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8fbf
+	.4byte	0x8fd4
 	.uleb128 0x11
-	.4byte	0x8abe
+	.4byte	0x8ad3
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8fab
+	.4byte	0x8fc0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8fde
+	.4byte	0x8ff3
 	.uleb128 0x11
-	.4byte	0x224f
+	.4byte	0x2264
 	.uleb128 0x11
-	.4byte	0x8abe
+	.4byte	0x8ad3
 	.uleb128 0x11
-	.4byte	0x1980
+	.4byte	0x1995
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8fc5
+	.4byte	0x8fda
 	.uleb128 0x14
-	.4byte	0x2d9
-	.4byte	0x9007
+	.4byte	0x2ee
+	.4byte	0x901c
 	.uleb128 0x11
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0x219
+	.4byte	0x21e
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8fe4
+	.4byte	0x8ff9
 	.uleb128 0x14
-	.4byte	0x2d9
-	.4byte	0x9030
+	.4byte	0x2ee
+	.4byte	0x9045
 	.uleb128 0x11
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x900d
+	.4byte	0x9022
 	.uleb128 0x14
-	.4byte	0x9045
-	.4byte	0x9045
+	.4byte	0x905a
+	.4byte	0x905a
 	.uleb128 0x11
-	.4byte	0x1c6a
+	.4byte	0x1c7f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x69a3
+	.4byte	0x69b8
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9036
+	.4byte	0x904b
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x906a
+	.4byte	0x907f
 	.uleb128 0x11
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.uleb128 0x11
-	.4byte	0x3454
+	.4byte	0x3469
 	.uleb128 0x11
-	.4byte	0x31b
+	.4byte	0x330
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9051
+	.4byte	0x9066
 	.uleb128 0x14
-	.4byte	0x194
-	.4byte	0x9084
+	.4byte	0x199
+	.4byte	0x9099
 	.uleb128 0x11
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.uleb128 0x11
-	.4byte	0x4c2d
+	.4byte	0x4c42
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9070
+	.4byte	0x9085
 	.uleb128 0x14
-	.4byte	0x1980
-	.4byte	0x90a8
+	.4byte	0x1995
+	.4byte	0x90bd
 	.uleb128 0x11
-	.4byte	0x8479
+	.4byte	0x848e
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x908a
+	.4byte	0x909f
 	.uleb128 0x14
-	.4byte	0x1980
-	.4byte	0x90d1
+	.4byte	0x1995
+	.4byte	0x90e6
 	.uleb128 0x11
-	.4byte	0x224f
+	.4byte	0x2264
 	.uleb128 0x11
-	.4byte	0x8479
+	.4byte	0x848e
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x90ae
+	.4byte	0x90c3
 	.uleb128 0x16
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x90d7
+	.4byte	0x90ec
 	.uleb128 0x5
-	.4byte	0xdfc
-	.4byte	0x90f2
+	.4byte	0xe11
+	.4byte	0x9107
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2009
+	.4byte	.LASF2010
 	.byte	0x60
 	.byte	0x8f
 	.byte	0x42
-	.4byte	0x91cd
+	.4byte	0x91e2
 	.uleb128 0xe
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0x8f
 	.byte	0x43
 	.4byte	0x56
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF360
+	.4byte	.LASF361
 	.byte	0x8f
 	.byte	0x44
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF639
+	.4byte	.LASF640
 	.byte	0x8f
 	.byte	0x45
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2010
+	.4byte	.LASF2011
 	.byte	0x8f
 	.byte	0x46
-	.4byte	0xa0c7
+	.4byte	0xa0dc
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2011
+	.4byte	.LASF2012
 	.byte	0x8f
 	.byte	0x47
-	.4byte	0xa152
+	.4byte	0xa167
 	.byte	0x28
 	.uleb128 0x20
 	.string	"sd"
 	.byte	0x8f
 	.byte	0x48
-	.4byte	0x99ac
+	.4byte	0x99c1
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2012
+	.4byte	.LASF2013
 	.byte	0x8f
 	.byte	0x49
-	.4byte	0xa02b
+	.4byte	0xa040
 	.byte	0x38
 	.uleb128 0x38
-	.4byte	.LASF2013
+	.4byte	.LASF2014
 	.byte	0x8f
 	.byte	0x4d
 	.4byte	0x6d
@@ -28018,7 +28005,7 @@ __exitcall_ebc_exit:
 	.byte	0x1f
 	.byte	0x3c
 	.uleb128 0x38
-	.4byte	.LASF2014
+	.4byte	.LASF2015
 	.byte	0x8f
 	.byte	0x4e
 	.4byte	0x6d
@@ -28027,7 +28014,7 @@ __exitcall_ebc_exit:
 	.byte	0x1e
 	.byte	0x3c
 	.uleb128 0x38
-	.4byte	.LASF2015
+	.4byte	.LASF2016
 	.byte	0x8f
 	.byte	0x4f
 	.4byte	0x6d
@@ -28036,7 +28023,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.byte	0x3c
 	.uleb128 0x38
-	.4byte	.LASF2016
+	.4byte	.LASF2017
 	.byte	0x8f
 	.byte	0x50
 	.4byte	0x6d
@@ -28045,7 +28032,7 @@ __exitcall_ebc_exit:
 	.byte	0x1c
 	.byte	0x3c
 	.uleb128 0x38
-	.4byte	.LASF2017
+	.4byte	.LASF2018
 	.byte	0x8f
 	.byte	0x51
 	.4byte	0x6d
@@ -28054,552 +28041,552 @@ __exitcall_ebc_exit:
 	.byte	0x1b
 	.byte	0x3c
 	.uleb128 0xe
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x8f
 	.byte	0x53
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x8f
 	.byte	0x54
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x8f
 	.byte	0x55
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x8f
 	.byte	0x56
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x58
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF2018
+	.4byte	.LASF2019
 	.byte	0x1f
 	.2byte	0x93b
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x90f2
+	.4byte	0x9107
 	.uleb128 0x15
-	.4byte	.LASF2019
+	.4byte	.LASF2020
 	.byte	0x1f
 	.2byte	0xa1e
-	.4byte	0x5239
+	.4byte	0x524e
 	.uleb128 0x15
-	.4byte	.LASF2020
+	.4byte	.LASF2021
 	.byte	0x1f
 	.2byte	0xa36
-	.4byte	0x20d2
+	.4byte	0x20e7
 	.uleb128 0x15
-	.4byte	.LASF2021
+	.4byte	.LASF2022
 	.byte	0x1f
 	.2byte	0xa5b
-	.4byte	0x7b4
+	.4byte	0x7c9
 	.uleb128 0x15
-	.4byte	.LASF2022
+	.4byte	.LASF2023
 	.byte	0x1f
 	.2byte	0xa5c
-	.4byte	0x7b4
+	.4byte	0x7c9
 	.uleb128 0x5
 	.4byte	0x5c
-	.4byte	0x921f
+	.4byte	0x9234
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x920f
+	.4byte	0x9224
 	.uleb128 0x46
-	.4byte	.LASF3023
+	.4byte	.LASF3024
 	.byte	0x1f
 	.2byte	0xba2
-	.4byte	0x921f
+	.4byte	0x9234
 	.uleb128 0x15
-	.4byte	.LASF2023
+	.4byte	.LASF2024
 	.byte	0x1f
 	.2byte	0xc7d
-	.4byte	0x7b4
+	.4byte	0x7c9
 	.uleb128 0x15
-	.4byte	.LASF2024
+	.4byte	.LASF2025
 	.byte	0x1f
 	.2byte	0xc89
-	.4byte	0x7d9b
+	.4byte	0x7db0
 	.uleb128 0x15
-	.4byte	.LASF2025
+	.4byte	.LASF2026
 	.byte	0x1f
 	.2byte	0xc9a
-	.4byte	0x7d9b
+	.4byte	0x7db0
 	.uleb128 0x15
-	.4byte	.LASF2026
+	.4byte	.LASF2027
 	.byte	0x1f
 	.2byte	0xcec
-	.4byte	0x1d53
+	.4byte	0x1d68
 	.uleb128 0x15
-	.4byte	.LASF2027
+	.4byte	.LASF2028
 	.byte	0x1f
 	.2byte	0xcf0
-	.4byte	0x7b4
+	.4byte	0x7c9
 	.uleb128 0x15
-	.4byte	.LASF2028
+	.4byte	.LASF2029
 	.byte	0x1f
 	.2byte	0xcf1
-	.4byte	0x7d9b
+	.4byte	0x7db0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x8
-	.4byte	.LASF2029
+	.4byte	.LASF2030
 	.byte	0x90
 	.byte	0x28
-	.4byte	0x9289
+	.4byte	0x929e
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x92ac
+	.4byte	0x92c1
 	.uleb128 0x11
-	.4byte	0x92ac
+	.4byte	0x92c1
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x11
-	.4byte	0x9278
+	.4byte	0x928d
 	.uleb128 0x11
-	.4byte	0x888d
+	.4byte	0x88a2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x92b2
+	.4byte	0x92c7
 	.uleb128 0xd
-	.4byte	.LASF2030
+	.4byte	.LASF2031
 	.byte	0x40
 	.byte	0x90
 	.byte	0x71
-	.4byte	0x932b
+	.4byte	0x9340
 	.uleb128 0xe
-	.4byte	.LASF2031
+	.4byte	.LASF2032
 	.byte	0x90
 	.byte	0x73
 	.4byte	0x56
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF793
+	.4byte	.LASF794
 	.byte	0x90
 	.byte	0x74
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2032
+	.4byte	.LASF2033
 	.byte	0x90
 	.byte	0x75
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF903
+	.4byte	.LASF904
 	.byte	0x90
 	.byte	0x76
-	.4byte	0x27a
+	.4byte	0x28f
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2033
+	.4byte	.LASF2034
 	.byte	0x90
 	.byte	0x77
-	.4byte	0x92ac
+	.4byte	0x92c1
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2029
+	.4byte	.LASF2030
 	.byte	0x90
 	.byte	0x78
-	.4byte	0x9350
+	.4byte	0x9365
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF105
+	.4byte	.LASF106
 	.byte	0x90
 	.byte	0x79
-	.4byte	0x9356
+	.4byte	0x936b
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2034
+	.4byte	.LASF2035
 	.byte	0x90
 	.byte	0x7a
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2035
+	.4byte	.LASF2036
 	.byte	0x90
 	.byte	0x7b
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x38
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2036
+	.4byte	.LASF2037
 	.byte	0x20
 	.byte	0x90
 	.byte	0x5f
-	.4byte	0x9350
+	.4byte	0x9365
 	.uleb128 0xe
-	.4byte	.LASF2037
+	.4byte	.LASF2038
 	.byte	0x90
 	.byte	0x60
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1100
+	.4byte	.LASF1101
 	.byte	0x90
 	.byte	0x61
-	.4byte	0x15aa
+	.4byte	0x15bf
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x927e
+	.4byte	0x9293
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x932b
+	.4byte	0x9340
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x23fb
+	.4byte	0x2410
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x241b
+	.4byte	0x2430
 	.uleb128 0x5
-	.4byte	0x92b2
-	.4byte	0x9373
+	.4byte	0x92c7
+	.4byte	0x9388
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2038
+	.4byte	.LASF2039
 	.byte	0x90
 	.byte	0xca
-	.4byte	0x9368
+	.4byte	0x937d
 	.uleb128 0xd
-	.4byte	.LASF2039
+	.4byte	.LASF2040
 	.byte	0x10
 	.byte	0x91
 	.byte	0x1a
-	.4byte	0x93a3
+	.4byte	0x93b8
 	.uleb128 0xe
-	.4byte	.LASF1191
+	.4byte	.LASF1192
 	.byte	0x91
 	.byte	0x1b
-	.4byte	0x93a8
+	.4byte	0x93bd
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2040
+	.4byte	.LASF2041
 	.byte	0x91
 	.byte	0x1c
 	.4byte	0x29
 	.byte	0x8
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF2041
+	.4byte	.LASF2042
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x93a3
+	.4byte	0x93b8
 	.uleb128 0x8
-	.4byte	.LASF2042
+	.4byte	.LASF2043
 	.byte	0x8d
 	.byte	0x21
-	.4byte	0x2e4
+	.4byte	0x2f9
 	.uleb128 0x8
-	.4byte	.LASF2043
+	.4byte	.LASF2044
 	.byte	0x8d
 	.byte	0x24
-	.4byte	0x2ef
+	.4byte	0x304
 	.uleb128 0xd
-	.4byte	.LASF2044
+	.4byte	.LASF2045
 	.byte	0x18
 	.byte	0x8d
 	.byte	0x58
-	.4byte	0x93f5
+	.4byte	0x940a
 	.uleb128 0xe
-	.4byte	.LASF192
+	.4byte	.LASF193
 	.byte	0x8d
 	.byte	0x59
-	.4byte	0x93ff
+	.4byte	0x9414
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2045
+	.4byte	.LASF2046
 	.byte	0x8d
 	.byte	0x5a
 	.4byte	0x56
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2046
+	.4byte	.LASF2047
 	.byte	0x8d
 	.byte	0x5b
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.byte	0x10
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF2047
+	.4byte	.LASF2048
 	.uleb128 0x3
-	.4byte	0x93f5
+	.4byte	0x940a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x93f5
+	.4byte	0x940a
 	.uleb128 0x39
-	.4byte	.LASF2048
+	.4byte	.LASF2049
 	.byte	0x20
 	.byte	0x8d
 	.byte	0x5e
-	.4byte	0x9428
+	.4byte	0x943d
 	.uleb128 0x22
-	.4byte	.LASF2049
+	.4byte	.LASF2050
 	.byte	0x8d
 	.byte	0x5f
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x22
-	.4byte	.LASF793
+	.4byte	.LASF794
 	.byte	0x8d
 	.byte	0x60
-	.4byte	0x942d
+	.4byte	0x9442
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x9405
+	.4byte	0x941a
 	.uleb128 0x5
-	.4byte	0x443
-	.4byte	0x943d
+	.4byte	0x458
+	.4byte	0x9452
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF2050
+	.4byte	.LASF2051
 	.byte	0x8d
 	.byte	0x83
-	.4byte	0x9448
+	.4byte	0x945d
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x944e
+	.4byte	0x9463
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x946c
+	.4byte	0x9481
 	.uleb128 0x11
-	.4byte	0x8764
+	.4byte	0x8779
 	.uleb128 0x11
-	.4byte	0x946c
+	.4byte	0x9481
 	.uleb128 0x11
-	.4byte	0x9472
+	.4byte	0x9487
 	.uleb128 0x11
-	.4byte	0x8764
+	.4byte	0x8779
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x93fa
+	.4byte	0x940f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9428
+	.4byte	0x943d
 	.uleb128 0xd
-	.4byte	.LASF2051
+	.4byte	.LASF2052
 	.byte	0x18
 	.byte	0x8d
 	.byte	0x88
-	.4byte	0x94a9
+	.4byte	0x94be
 	.uleb128 0xe
-	.4byte	.LASF2052
+	.4byte	.LASF2053
 	.byte	0x8d
 	.byte	0x89
-	.4byte	0x943d
+	.4byte	0x9452
 	.byte	0
 	.uleb128 0x20
 	.string	"key"
 	.byte	0x8d
 	.byte	0x8a
-	.4byte	0x8764
+	.4byte	0x8779
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2053
+	.4byte	.LASF2054
 	.byte	0x8d
 	.byte	0x8b
-	.4byte	0x93ff
+	.4byte	0x9414
 	.byte	0x10
 	.byte	0
 	.uleb128 0x21
 	.byte	0x18
 	.byte	0x8d
 	.byte	0x9e
-	.4byte	0x94c8
+	.4byte	0x94dd
 	.uleb128 0x22
-	.4byte	.LASF2054
+	.4byte	.LASF2055
 	.byte	0x8d
 	.byte	0x9f
-	.4byte	0x392
+	.4byte	0x3a7
 	.uleb128 0x22
-	.4byte	.LASF2055
+	.4byte	.LASF2056
 	.byte	0x8d
 	.byte	0xa0
-	.4byte	0x34cd
+	.4byte	0x34e2
 	.byte	0
 	.uleb128 0x21
 	.byte	0x8
 	.byte	0x8d
 	.byte	0xa5
-	.4byte	0x94e7
+	.4byte	0x94fc
 	.uleb128 0x22
-	.4byte	.LASF2056
+	.4byte	.LASF2057
 	.byte	0x8d
 	.byte	0xa6
-	.4byte	0x9bd
+	.4byte	0x9d2
 	.uleb128 0x22
-	.4byte	.LASF2057
+	.4byte	.LASF2058
 	.byte	0x8d
 	.byte	0xa7
-	.4byte	0x9bd
+	.4byte	0x9d2
 	.byte	0
 	.uleb128 0xf
 	.byte	0x10
 	.byte	0x8d
 	.byte	0xcc
-	.4byte	0x9508
+	.4byte	0x951d
 	.uleb128 0xe
-	.4byte	.LASF192
+	.4byte	.LASF193
 	.byte	0x8d
 	.byte	0xcd
-	.4byte	0x93ff
+	.4byte	0x9414
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2045
+	.4byte	.LASF2046
 	.byte	0x8d
 	.byte	0xce
-	.4byte	0x219
+	.4byte	0x21e
 	.byte	0x8
 	.byte	0
 	.uleb128 0x21
 	.byte	0x18
 	.byte	0x8d
 	.byte	0xca
-	.4byte	0x9521
+	.4byte	0x9536
 	.uleb128 0x22
-	.4byte	.LASF2058
+	.4byte	.LASF2059
 	.byte	0x8d
 	.byte	0xcb
-	.4byte	0x93c4
+	.4byte	0x93d9
 	.uleb128 0x29
-	.4byte	0x94e7
+	.4byte	0x94fc
 	.byte	0
 	.uleb128 0xf
 	.byte	0x20
 	.byte	0x8d
 	.byte	0xd8
-	.4byte	0x9542
+	.4byte	0x9557
 	.uleb128 0xe
-	.4byte	.LASF2059
+	.4byte	.LASF2060
 	.byte	0x8d
 	.byte	0xda
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2060
+	.4byte	.LASF2061
 	.byte	0x8d
 	.byte	0xdb
-	.4byte	0x937e
+	.4byte	0x9393
 	.byte	0x10
 	.byte	0
 	.uleb128 0x21
 	.byte	0x20
 	.byte	0x8d
 	.byte	0xd6
-	.4byte	0x955b
+	.4byte	0x9570
 	.uleb128 0x22
-	.4byte	.LASF2061
+	.4byte	.LASF2062
 	.byte	0x8d
 	.byte	0xd7
-	.4byte	0x9405
+	.4byte	0x941a
 	.uleb128 0x29
-	.4byte	0x9521
+	.4byte	0x9536
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF2062
+	.4byte	.LASF2063
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x955b
+	.4byte	0x9570
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9478
+	.4byte	0x948d
 	.uleb128 0x15
-	.4byte	.LASF2063
+	.4byte	.LASF2064
 	.byte	0x8d
 	.2byte	0x190
-	.4byte	0x9368
+	.4byte	0x937d
 	.uleb128 0xd
-	.4byte	.LASF2064
+	.4byte	.LASF2065
 	.byte	0x28
 	.byte	0x92
 	.byte	0xf
-	.4byte	0x95d9
+	.4byte	0x95ee
 	.uleb128 0xe
-	.4byte	.LASF115
+	.4byte	.LASF116
 	.byte	0x92
 	.byte	0x10
-	.4byte	0xe1e
+	.4byte	0xe33
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2065
+	.4byte	.LASF2066
 	.byte	0x92
 	.byte	0x12
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF2066
+	.4byte	.LASF2067
 	.byte	0x92
 	.byte	0x13
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2067
+	.4byte	.LASF2068
 	.byte	0x92
 	.byte	0x14
 	.4byte	0xc6
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF2068
+	.4byte	.LASF2069
 	.byte	0x92
 	.byte	0x15
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2069
+	.4byte	.LASF2070
 	.byte	0x92
 	.byte	0x16
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x92
 	.byte	0x17
 	.4byte	0x29
 	.byte	0x20
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2070
+	.4byte	.LASF2071
 	.byte	0x92
 	.byte	0x4a
-	.4byte	0x9578
+	.4byte	0x958d
 	.uleb128 0x19
-	.4byte	.LASF2071
+	.4byte	.LASF2072
 	.byte	0x64
 	.byte	0x3b
-	.4byte	0x3b7f
+	.4byte	0x3b94
 	.uleb128 0xd
-	.4byte	.LASF1119
+	.4byte	.LASF1120
 	.byte	0x8
 	.byte	0x6a
 	.byte	0x1e
-	.4byte	0x9620
+	.4byte	0x9635
 	.uleb128 0xe
-	.4byte	.LASF579
+	.4byte	.LASF580
 	.byte	0x6a
 	.byte	0x1f
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2072
+	.4byte	.LASF2073
 	.byte	0x6a
 	.byte	0x20
 	.4byte	0xc6
@@ -28608,27 +28595,27 @@ __exitcall_ebc_exit:
 	.string	"gid"
 	.byte	0x6a
 	.byte	0x21
-	.4byte	0x9620
+	.4byte	0x9635
 	.byte	0x8
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x241b
-	.4byte	0x962f
+	.4byte	0x2430
+	.4byte	0x9644
 	.uleb128 0x44
 	.4byte	0x4f
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2073
+	.4byte	.LASF2074
 	.byte	0x6a
 	.byte	0x3d
-	.4byte	0x95ef
+	.4byte	0x9604
 	.uleb128 0x21
 	.byte	0x10
 	.byte	0x6a
 	.byte	0x9a
-	.4byte	0x9659
+	.4byte	0x966e
 	.uleb128 0x22
-	.4byte	.LASF2074
+	.4byte	.LASF2075
 	.byte	0x6a
 	.byte	0x9b
 	.4byte	0xc6
@@ -28636,372 +28623,372 @@ __exitcall_ebc_exit:
 	.string	"rcu"
 	.byte	0x6a
 	.byte	0x9c
-	.4byte	0x407
+	.4byte	0x41c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x95ef
+	.4byte	0x9604
 	.uleb128 0xd
-	.4byte	.LASF2075
+	.4byte	.LASF2076
 	.byte	0x20
 	.byte	0x8e
 	.byte	0x20
-	.4byte	0x969c
+	.4byte	0x96b1
 	.uleb128 0xe
-	.4byte	.LASF1880
+	.4byte	.LASF1881
 	.byte	0x8e
 	.byte	0x21
-	.4byte	0x96c1
+	.4byte	0x96d6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2076
+	.4byte	.LASF2077
 	.byte	0x8e
 	.byte	0x22
-	.4byte	0x96d7
+	.4byte	0x96ec
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF63
+	.4byte	.LASF64
 	.byte	0x8e
 	.byte	0x23
-	.4byte	0x96f6
+	.4byte	0x970b
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2077
+	.4byte	.LASF2078
 	.byte	0x8e
 	.byte	0x24
-	.4byte	0x9710
+	.4byte	0x9725
 	.byte	0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x965f
+	.4byte	0x9674
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x969c
+	.4byte	0x96b1
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5542
+	.4byte	0x5557
 	.uleb128 0x14
-	.4byte	0x443
-	.4byte	0x96c1
+	.4byte	0x458
+	.4byte	0x96d6
 	.uleb128 0x11
-	.4byte	0x8abe
+	.4byte	0x8ad3
 	.uleb128 0x11
-	.4byte	0x888d
+	.4byte	0x88a2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x96ad
+	.4byte	0x96c2
 	.uleb128 0x10
-	.4byte	0x96d7
+	.4byte	0x96ec
 	.uleb128 0x11
-	.4byte	0x8abe
+	.4byte	0x8ad3
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x96c7
+	.4byte	0x96dc
 	.uleb128 0x14
-	.4byte	0x443
-	.4byte	0x96f6
+	.4byte	0x458
+	.4byte	0x970b
 	.uleb128 0x11
-	.4byte	0x8abe
+	.4byte	0x8ad3
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x11
-	.4byte	0x888d
+	.4byte	0x88a2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x96dd
+	.4byte	0x96f2
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9710
+	.4byte	0x9725
 	.uleb128 0x11
-	.4byte	0x8abe
+	.4byte	0x8ad3
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x96fc
+	.4byte	0x9711
 	.uleb128 0x19
-	.4byte	.LASF2078
+	.4byte	.LASF2079
 	.byte	0x93
 	.byte	0x28
-	.4byte	0x1980
+	.4byte	0x1995
 	.uleb128 0x19
-	.4byte	.LASF2079
+	.4byte	.LASF2080
 	.byte	0x94
 	.byte	0x18
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF2080
+	.4byte	.LASF2081
 	.byte	0x94
 	.byte	0x38
 	.4byte	0x29
 	.uleb128 0xd
-	.4byte	.LASF2081
+	.4byte	.LASF2082
 	.byte	0x60
 	.byte	0xf
 	.byte	0x14
-	.4byte	0x97d4
+	.4byte	0x97e9
 	.uleb128 0xe
-	.4byte	.LASF1880
+	.4byte	.LASF1881
 	.byte	0xf
 	.byte	0x15
-	.4byte	0x33c
+	.4byte	0x351
 	.byte	0
 	.uleb128 0x20
 	.string	"end"
 	.byte	0xf
 	.byte	0x16
-	.4byte	0x33c
+	.4byte	0x351
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0xf
 	.byte	0x17
 	.4byte	0x56
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0xf
 	.byte	0x18
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF771
+	.4byte	.LASF772
 	.byte	0xf
 	.byte	0x19
 	.4byte	0x29
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF639
+	.4byte	.LASF640
 	.byte	0xf
 	.byte	0x1a
-	.4byte	0x97d9
+	.4byte	0x97ee
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF641
+	.4byte	.LASF642
 	.byte	0xf
 	.byte	0x1a
-	.4byte	0x97d9
+	.4byte	0x97ee
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2033
+	.4byte	.LASF2034
 	.byte	0xf
 	.byte	0x1a
-	.4byte	0x97d9
+	.4byte	0x97ee
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0xf
 	.byte	0x1c
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0xf
 	.byte	0x1d
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0xf
 	.byte	0x1e
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0xf
 	.byte	0x1f
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x58
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x9737
+	.4byte	0x974c
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9737
+	.4byte	0x974c
 	.uleb128 0x19
-	.4byte	.LASF2082
+	.4byte	.LASF2083
 	.byte	0xf
 	.byte	0xaf
-	.4byte	0x9737
+	.4byte	0x974c
 	.uleb128 0x19
-	.4byte	.LASF2083
+	.4byte	.LASF2084
 	.byte	0xf
 	.byte	0xb0
-	.4byte	0x9737
+	.4byte	0x974c
 	.uleb128 0x32
 	.string	"idr"
 	.byte	0x18
 	.byte	0x95
 	.byte	0x13
-	.4byte	0x9826
+	.4byte	0x983b
 	.uleb128 0xe
-	.4byte	.LASF2084
+	.4byte	.LASF2085
 	.byte	0x95
 	.byte	0x14
-	.4byte	0x4dc4
+	.4byte	0x4dd9
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2085
+	.4byte	.LASF2086
 	.byte	0x95
 	.byte	0x15
 	.4byte	0x6d
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2086
+	.4byte	.LASF2087
 	.byte	0x95
 	.byte	0x16
 	.4byte	0x6d
 	.byte	0x14
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2087
+	.4byte	.LASF2088
 	.byte	0x80
 	.byte	0x95
 	.byte	0xe0
-	.4byte	0x983f
+	.4byte	0x9854
 	.uleb128 0xe
-	.4byte	.LASF2088
+	.4byte	.LASF2089
 	.byte	0x95
 	.byte	0xe1
-	.4byte	0x179
+	.4byte	0x17e
 	.byte	0
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2087
+	.4byte	.LASF2088
 	.byte	0x95
 	.byte	0xe4
-	.4byte	0x984a
+	.4byte	0x985f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9826
+	.4byte	0x983b
 	.uleb128 0xd
-	.4byte	.LASF2089
+	.4byte	.LASF2090
 	.byte	0x18
 	.byte	0x96
 	.byte	0x54
-	.4byte	0x9881
+	.4byte	0x9896
 	.uleb128 0xe
-	.4byte	.LASF2090
+	.4byte	.LASF2091
 	.byte	0x96
 	.byte	0x55
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF640
+	.4byte	.LASF641
 	.byte	0x96
 	.byte	0x57
-	.4byte	0x3504
+	.4byte	0x3519
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1191
+	.4byte	.LASF1192
 	.byte	0x96
 	.byte	0x5d
-	.4byte	0x98ed
+	.4byte	0x9902
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2091
+	.4byte	.LASF2092
 	.byte	0x60
 	.byte	0x96
 	.byte	0xbd
-	.4byte	0x98ed
+	.4byte	0x9902
 	.uleb128 0x20
 	.string	"kn"
 	.byte	0x96
 	.byte	0xbf
-	.4byte	0x99ac
+	.4byte	0x99c1
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x96
 	.byte	0xc0
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2092
+	.4byte	.LASF2093
 	.byte	0x96
 	.byte	0xc3
-	.4byte	0x97f5
+	.4byte	0x980a
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2093
+	.4byte	.LASF2094
 	.byte	0x96
 	.byte	0xc4
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2094
+	.4byte	.LASF2095
 	.byte	0x96
 	.byte	0xc5
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x2c
 	.uleb128 0xe
-	.4byte	.LASF2095
+	.4byte	.LASF2096
 	.byte	0x96
 	.byte	0xc6
-	.4byte	0x9c63
+	.4byte	0x9c78
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2096
+	.4byte	.LASF2097
 	.byte	0x96
 	.byte	0xc9
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2097
+	.4byte	.LASF2098
 	.byte	0x96
 	.byte	0xcb
-	.4byte	0x15aa
+	.4byte	0x15bf
 	.byte	0x48
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9881
+	.4byte	0x9896
 	.uleb128 0xd
-	.4byte	.LASF2098
+	.4byte	.LASF2099
 	.byte	0x8
 	.byte	0x96
 	.byte	0x60
-	.4byte	0x990c
+	.4byte	0x9921
 	.uleb128 0xe
-	.4byte	.LASF2099
+	.4byte	.LASF2100
 	.byte	0x96
 	.byte	0x61
-	.4byte	0x99ac
+	.4byte	0x99c1
 	.byte	0
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2100
+	.4byte	.LASF2101
 	.byte	0x80
 	.byte	0x96
 	.byte	0x83
-	.4byte	0x99ac
+	.4byte	0x99c1
 	.uleb128 0xe
-	.4byte	.LASF382
+	.4byte	.LASF383
 	.byte	0x96
 	.byte	0x84
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF881
+	.4byte	.LASF882
 	.byte	0x96
 	.byte	0x85
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF639
+	.4byte	.LASF640
 	.byte	0x96
 	.byte	0x8f
-	.4byte	0x99ac
+	.4byte	0x99c1
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0x96
 	.byte	0x90
 	.4byte	0x56
@@ -29010,1060 +28997,1060 @@ __exitcall_ebc_exit:
 	.string	"rb"
 	.byte	0x96
 	.byte	0x92
-	.4byte	0x34cd
+	.4byte	0x34e2
 	.byte	0x18
 	.uleb128 0x20
 	.string	"ns"
 	.byte	0x96
 	.byte	0x94
-	.4byte	0x30a7
+	.4byte	0x30bc
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF385
+	.4byte	.LASF386
 	.byte	0x96
 	.byte	0x95
 	.4byte	0x6d
 	.byte	0x38
 	.uleb128 0x23
-	.4byte	0x9afe
+	.4byte	0x9b13
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2101
+	.4byte	.LASF2102
 	.byte	0x96
 	.byte	0x9c
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x60
 	.uleb128 0x20
 	.string	"id"
 	.byte	0x96
 	.byte	0x9e
-	.4byte	0x9ae2
+	.4byte	0x9af7
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0x96
 	.byte	0x9f
 	.4byte	0xb4
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF903
+	.4byte	.LASF904
 	.byte	0x96
 	.byte	0xa0
-	.4byte	0x27a
+	.4byte	0x28f
 	.byte	0x72
 	.uleb128 0xe
-	.4byte	.LASF1433
+	.4byte	.LASF1434
 	.byte	0x96
 	.byte	0xa1
-	.4byte	0x9b2d
+	.4byte	0x9b42
 	.byte	0x78
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x990c
+	.4byte	0x9921
 	.uleb128 0xd
-	.4byte	.LASF2102
+	.4byte	.LASF2103
 	.byte	0x20
 	.byte	0x96
 	.byte	0x64
-	.4byte	0x99ef
+	.4byte	0x9a04
 	.uleb128 0x20
 	.string	"ops"
 	.byte	0x96
 	.byte	0x65
-	.4byte	0x9ab0
+	.4byte	0x9ac5
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF110
+	.4byte	.LASF111
 	.byte	0x96
 	.byte	0x66
-	.4byte	0x9abb
+	.4byte	0x9ad0
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF986
+	.4byte	.LASF987
 	.byte	0x96
 	.byte	0x67
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2103
+	.4byte	.LASF2104
 	.byte	0x96
 	.byte	0x68
-	.4byte	0x99ac
+	.4byte	0x99c1
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2104
+	.4byte	.LASF2105
 	.byte	0x70
 	.byte	0x96
 	.byte	0xe2
-	.4byte	0x9aab
+	.4byte	0x9ac0
 	.uleb128 0xe
-	.4byte	.LASF110
+	.4byte	.LASF111
 	.byte	0x96
 	.byte	0xe7
-	.4byte	0x9d2c
+	.4byte	0x9d41
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF112
+	.4byte	.LASF113
 	.byte	0x96
 	.byte	0xe8
-	.4byte	0x9d3d
+	.4byte	0x9d52
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2105
+	.4byte	.LASF2106
 	.byte	0x96
 	.byte	0xf5
-	.4byte	0x9710
+	.4byte	0x9725
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2106
+	.4byte	.LASF2107
 	.byte	0x96
 	.byte	0xf7
-	.4byte	0x96c1
+	.4byte	0x96d6
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2107
+	.4byte	.LASF2108
 	.byte	0x96
 	.byte	0xf8
-	.4byte	0x96f6
+	.4byte	0x970b
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2108
+	.4byte	.LASF2109
 	.byte	0x96
 	.byte	0xf9
-	.4byte	0x96d7
+	.4byte	0x96ec
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF99
+	.4byte	.LASF100
 	.byte	0x96
 	.byte	0xfb
-	.4byte	0x9d61
+	.4byte	0x9d76
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF2109
+	.4byte	.LASF2110
 	.byte	0x96
 	.2byte	0x105
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF2110
+	.4byte	.LASF2111
 	.byte	0x96
 	.2byte	0x10c
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF100
+	.4byte	.LASF101
 	.byte	0x96
 	.2byte	0x10d
-	.4byte	0x9d61
+	.4byte	0x9d76
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF105
+	.4byte	.LASF106
 	.byte	0x96
 	.2byte	0x110
-	.4byte	0x9d7b
+	.4byte	0x9d90
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF108
+	.4byte	.LASF109
 	.byte	0x96
 	.2byte	0x113
-	.4byte	0x9d95
+	.4byte	0x9daa
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x96
 	.2byte	0x119
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x96
 	.2byte	0x11a
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x68
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x99ef
+	.4byte	0x9a04
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9aab
+	.4byte	0x9ac0
 	.uleb128 0x24
-	.4byte	.LASF2111
+	.4byte	.LASF2112
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9ab6
+	.4byte	0x9acb
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x96
 	.byte	0x6d
-	.4byte	0x9ae2
+	.4byte	0x9af7
 	.uleb128 0x20
 	.string	"ino"
 	.byte	0x96
 	.byte	0x74
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2112
+	.4byte	.LASF2113
 	.byte	0x96
 	.byte	0x75
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x4
 	.byte	0
 	.uleb128 0x39
-	.4byte	.LASF2113
+	.4byte	.LASF2114
 	.byte	0x8
 	.byte	0x96
 	.byte	0x6c
-	.4byte	0x9afe
+	.4byte	0x9b13
 	.uleb128 0x29
-	.4byte	0x9ac1
+	.4byte	0x9ad6
 	.uleb128 0x28
 	.string	"id"
 	.byte	0x96
 	.byte	0x77
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0
 	.uleb128 0x21
 	.byte	0x20
 	.byte	0x96
 	.byte	0x96
-	.4byte	0x9b28
+	.4byte	0x9b3d
 	.uleb128 0x28
 	.string	"dir"
 	.byte	0x96
 	.byte	0x97
-	.4byte	0x9850
+	.4byte	0x9865
 	.uleb128 0x22
-	.4byte	.LASF1854
+	.4byte	.LASF1855
 	.byte	0x96
 	.byte	0x98
-	.4byte	0x98f3
+	.4byte	0x9908
 	.uleb128 0x22
-	.4byte	.LASF2114
+	.4byte	.LASF2115
 	.byte	0x96
 	.byte	0x99
-	.4byte	0x99b2
+	.4byte	0x99c7
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF2115
+	.4byte	.LASF2116
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9b28
+	.4byte	0x9b3d
 	.uleb128 0xd
-	.4byte	.LASF2116
+	.4byte	.LASF2117
 	.byte	0x50
 	.byte	0x96
 	.byte	0xab
-	.4byte	0x9bb8
+	.4byte	0x9bcd
 	.uleb128 0xe
-	.4byte	.LASF1965
+	.4byte	.LASF1966
 	.byte	0x96
 	.byte	0xac
-	.4byte	0x9bd1
+	.4byte	0x9be6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1971
+	.4byte	.LASF1972
 	.byte	0x96
 	.byte	0xad
-	.4byte	0x9beb
+	.4byte	0x9c00
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1855
+	.4byte	.LASF1856
 	.byte	0x96
 	.byte	0xaf
-	.4byte	0x9c0a
+	.4byte	0x9c1f
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1856
+	.4byte	.LASF1857
 	.byte	0x96
 	.byte	0xb1
-	.4byte	0x9c1f
+	.4byte	0x9c34
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1858
+	.4byte	.LASF1859
 	.byte	0x96
 	.byte	0xb2
-	.4byte	0x9c3e
+	.4byte	0x9c53
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1974
+	.4byte	.LASF1975
 	.byte	0x96
 	.byte	0xb4
-	.4byte	0x9c5d
+	.4byte	0x9c72
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x96
 	.byte	0xb7
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x96
 	.byte	0xb8
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x96
 	.byte	0xb9
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x96
 	.byte	0xba
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x48
 	.byte	0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9bd1
+	.4byte	0x9be6
 	.uleb128 0x11
-	.4byte	0x98ed
+	.4byte	0x9902
 	.uleb128 0x11
-	.4byte	0x4669
+	.4byte	0x467e
 	.uleb128 0x11
-	.4byte	0x219
+	.4byte	0x21e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9bb8
+	.4byte	0x9bcd
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9beb
+	.4byte	0x9c00
 	.uleb128 0x11
-	.4byte	0x8abe
+	.4byte	0x8ad3
 	.uleb128 0x11
-	.4byte	0x98ed
+	.4byte	0x9902
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9bd7
+	.4byte	0x9bec
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9c0a
+	.4byte	0x9c1f
 	.uleb128 0x11
-	.4byte	0x99ac
+	.4byte	0x99c1
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
-	.4byte	0x27a
+	.4byte	0x28f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9bf1
+	.4byte	0x9c06
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9c1f
+	.4byte	0x9c34
 	.uleb128 0x11
-	.4byte	0x99ac
+	.4byte	0x99c1
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9c10
+	.4byte	0x9c25
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9c3e
+	.4byte	0x9c53
 	.uleb128 0x11
-	.4byte	0x99ac
+	.4byte	0x99c1
 	.uleb128 0x11
-	.4byte	0x99ac
+	.4byte	0x99c1
 	.uleb128 0x11
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9c25
+	.4byte	0x9c3a
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9c5d
+	.4byte	0x9c72
 	.uleb128 0x11
-	.4byte	0x8abe
+	.4byte	0x8ad3
 	.uleb128 0x11
-	.4byte	0x99ac
+	.4byte	0x99c1
 	.uleb128 0x11
-	.4byte	0x98ed
+	.4byte	0x9902
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9c44
+	.4byte	0x9c59
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9b33
+	.4byte	0x9b48
 	.uleb128 0xd
-	.4byte	.LASF2117
+	.4byte	.LASF2118
 	.byte	0x98
 	.byte	0x96
 	.byte	0xce
-	.4byte	0x9d17
+	.4byte	0x9d2c
 	.uleb128 0x20
 	.string	"kn"
 	.byte	0x96
 	.byte	0xd0
-	.4byte	0x99ac
+	.4byte	0x99c1
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1272
+	.4byte	.LASF1273
 	.byte	0x96
 	.byte	0xd1
-	.4byte	0x5547
+	.4byte	0x555c
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2003
+	.4byte	.LASF2004
 	.byte	0x96
 	.byte	0xd2
-	.4byte	0x8abe
+	.4byte	0x8ad3
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2101
+	.4byte	.LASF2102
 	.byte	0x96
 	.byte	0xd3
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF574
+	.4byte	.LASF575
 	.byte	0x96
 	.byte	0xd6
-	.4byte	0x2455
+	.4byte	0x246a
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2118
+	.4byte	.LASF2119
 	.byte	0x96
 	.byte	0xd7
-	.4byte	0x2455
+	.4byte	0x246a
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2037
+	.4byte	.LASF2038
 	.byte	0x96
 	.byte	0xd8
 	.4byte	0xc6
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF961
+	.4byte	.LASF962
 	.byte	0x96
 	.byte	0xd9
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2119
+	.4byte	.LASF2120
 	.byte	0x96
 	.byte	0xda
-	.4byte	0x219
+	.4byte	0x21e
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2109
+	.4byte	.LASF2110
 	.byte	0x96
 	.byte	0xdc
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.byte	0x80
 	.uleb128 0x38
-	.4byte	.LASF2120
+	.4byte	.LASF2121
 	.byte	0x96
 	.byte	0xdd
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.byte	0x1
 	.byte	0x7
 	.byte	0x88
 	.uleb128 0x38
-	.4byte	.LASF2121
+	.4byte	.LASF2122
 	.byte	0x96
 	.byte	0xde
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.byte	0x1
 	.byte	0x6
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF976
+	.4byte	.LASF977
 	.byte	0x96
 	.byte	0xdf
-	.4byte	0x5696
+	.4byte	0x56ab
 	.byte	0x90
 	.byte	0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9d26
+	.4byte	0x9d3b
 	.uleb128 0x11
-	.4byte	0x9d26
+	.4byte	0x9d3b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9c69
+	.4byte	0x9c7e
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9d17
+	.4byte	0x9d2c
 	.uleb128 0x10
-	.4byte	0x9d3d
+	.4byte	0x9d52
 	.uleb128 0x11
-	.4byte	0x9d26
+	.4byte	0x9d3b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9d32
+	.4byte	0x9d47
 	.uleb128 0x14
-	.4byte	0x2d9
-	.4byte	0x9d61
+	.4byte	0x2ee
+	.4byte	0x9d76
 	.uleb128 0x11
-	.4byte	0x9d26
+	.4byte	0x9d3b
 	.uleb128 0x11
-	.4byte	0x219
+	.4byte	0x21e
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9d43
+	.4byte	0x9d58
 	.uleb128 0x14
-	.4byte	0x22f
-	.4byte	0x9d7b
+	.4byte	0x244
+	.4byte	0x9d90
 	.uleb128 0x11
-	.4byte	0x9d26
+	.4byte	0x9d3b
 	.uleb128 0x11
-	.4byte	0x88eb
+	.4byte	0x8900
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9d67
+	.4byte	0x9d7c
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9d95
+	.4byte	0x9daa
 	.uleb128 0x11
-	.4byte	0x9d26
+	.4byte	0x9d3b
 	.uleb128 0x11
-	.4byte	0x3ca0
+	.4byte	0x3cb5
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9d81
+	.4byte	0x9d96
 	.uleb128 0x1f
-	.4byte	.LASF2122
+	.4byte	.LASF2123
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x97
 	.byte	0x1a
-	.4byte	0x9dbe
+	.4byte	0x9dd3
 	.uleb128 0xc
-	.4byte	.LASF2123
+	.4byte	.LASF2124
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2124
+	.4byte	.LASF2125
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2125
+	.4byte	.LASF2126
 	.byte	0x2
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2126
+	.4byte	.LASF2127
 	.byte	0x30
 	.byte	0x97
 	.byte	0x27
-	.4byte	0x9e13
+	.4byte	0x9e28
 	.uleb128 0xe
-	.4byte	.LASF192
+	.4byte	.LASF193
 	.byte	0x97
 	.byte	0x28
-	.4byte	0x9d9b
+	.4byte	0x9db0
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2127
+	.4byte	.LASF2128
 	.byte	0x97
 	.byte	0x29
-	.4byte	0x9e1d
+	.4byte	0x9e32
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2128
+	.4byte	.LASF2129
 	.byte	0x97
 	.byte	0x2a
-	.4byte	0x90dc
+	.4byte	0x90f1
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2129
+	.4byte	.LASF2130
 	.byte	0x97
 	.byte	0x2b
-	.4byte	0x9e3d
+	.4byte	0x9e52
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2130
+	.4byte	.LASF2131
 	.byte	0x97
 	.byte	0x2c
-	.4byte	0x9e48
+	.4byte	0x9e5d
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2131
+	.4byte	.LASF2132
 	.byte	0x97
 	.byte	0x2d
-	.4byte	0x2f20
+	.4byte	0x2f35
 	.byte	0x28
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x9dbe
+	.4byte	0x9dd3
 	.uleb128 0x16
-	.4byte	0x29b
+	.4byte	0x2b0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9e18
+	.4byte	0x9e2d
 	.uleb128 0x14
-	.4byte	0x30a7
-	.4byte	0x9e32
+	.4byte	0x30bc
+	.4byte	0x9e47
 	.uleb128 0x11
-	.4byte	0x9e32
+	.4byte	0x9e47
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9e38
+	.4byte	0x9e4d
 	.uleb128 0x24
-	.4byte	.LASF2132
+	.4byte	.LASF2133
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9e23
+	.4byte	0x9e38
 	.uleb128 0x16
-	.4byte	0x30a7
+	.4byte	0x30bc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9e43
+	.4byte	0x9e58
 	.uleb128 0xd
-	.4byte	.LASF2133
+	.4byte	.LASF2134
 	.byte	0x10
 	.byte	0x98
 	.byte	0x1e
-	.4byte	0x9e73
+	.4byte	0x9e88
 	.uleb128 0xe
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0x98
 	.byte	0x1f
 	.4byte	0x56
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF903
+	.4byte	.LASF904
 	.byte	0x98
 	.byte	0x20
-	.4byte	0x27a
+	.4byte	0x28f
 	.byte	0x8
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2134
+	.4byte	.LASF2135
 	.byte	0x28
 	.byte	0x98
 	.byte	0x54
-	.4byte	0x9ebc
+	.4byte	0x9ed1
 	.uleb128 0xe
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0x98
 	.byte	0x55
 	.4byte	0x56
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2135
+	.4byte	.LASF2136
 	.byte	0x98
 	.byte	0x56
-	.4byte	0x9ee0
+	.4byte	0x9ef5
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2136
+	.4byte	.LASF2137
 	.byte	0x98
 	.byte	0x58
-	.4byte	0x9f5a
+	.4byte	0x9f6f
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2137
+	.4byte	.LASF2138
 	.byte	0x98
 	.byte	0x5a
-	.4byte	0x9f60
+	.4byte	0x9f75
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2138
+	.4byte	.LASF2139
 	.byte	0x98
 	.byte	0x5b
-	.4byte	0x9f66
+	.4byte	0x9f7b
 	.byte	0x20
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x9e73
+	.4byte	0x9e88
 	.uleb128 0x14
-	.4byte	0x27a
-	.4byte	0x9eda
+	.4byte	0x28f
+	.4byte	0x9eef
 	.uleb128 0x11
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.uleb128 0x11
-	.4byte	0x9eda
+	.4byte	0x9eef
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9e4e
+	.4byte	0x9e63
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9ec1
+	.4byte	0x9ed6
 	.uleb128 0x14
-	.4byte	0x27a
-	.4byte	0x9eff
+	.4byte	0x28f
+	.4byte	0x9f14
 	.uleb128 0x11
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.uleb128 0x11
-	.4byte	0x9eff
+	.4byte	0x9f14
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9f05
+	.4byte	0x9f1a
 	.uleb128 0xd
-	.4byte	.LASF2139
+	.4byte	.LASF2140
 	.byte	0x38
 	.byte	0x98
 	.byte	0xa1
-	.4byte	0x9f5a
+	.4byte	0x9f6f
 	.uleb128 0xe
-	.4byte	.LASF2114
+	.4byte	.LASF2115
 	.byte	0x98
 	.byte	0xa2
-	.4byte	0x9e4e
+	.4byte	0x9e63
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF986
+	.4byte	.LASF987
 	.byte	0x98
 	.byte	0xa3
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF359
+	.4byte	.LASF360
 	.byte	0x98
 	.byte	0xa4
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF99
+	.4byte	.LASF100
 	.byte	0x98
 	.byte	0xa5
-	.4byte	0x9f94
+	.4byte	0x9fa9
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF100
+	.4byte	.LASF101
 	.byte	0x98
 	.byte	0xa7
-	.4byte	0x9f94
+	.4byte	0x9fa9
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF108
+	.4byte	.LASF109
 	.byte	0x98
 	.byte	0xa9
-	.4byte	0x9fb8
+	.4byte	0x9fcd
 	.byte	0x30
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9ee6
+	.4byte	0x9efb
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9eda
+	.4byte	0x9eef
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9eff
+	.4byte	0x9f14
 	.uleb128 0x14
-	.4byte	0x2d9
-	.4byte	0x9f94
+	.4byte	0x2ee
+	.4byte	0x9fa9
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.uleb128 0x11
-	.4byte	0x9eff
+	.4byte	0x9f14
 	.uleb128 0x11
-	.4byte	0x219
+	.4byte	0x21e
 	.uleb128 0x11
-	.4byte	0x2c3
+	.4byte	0x2d8
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9f6c
+	.4byte	0x9f81
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9fb8
+	.4byte	0x9fcd
 	.uleb128 0x11
-	.4byte	0x5547
+	.4byte	0x555c
 	.uleb128 0x11
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.uleb128 0x11
-	.4byte	0x9eff
+	.4byte	0x9f14
 	.uleb128 0x11
-	.4byte	0x3ca0
+	.4byte	0x3cb5
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9f9a
+	.4byte	0x9faf
 	.uleb128 0xd
-	.4byte	.LASF2140
+	.4byte	.LASF2141
 	.byte	0x10
 	.byte	0x98
 	.byte	0xd6
-	.4byte	0x9fe3
+	.4byte	0x9ff8
 	.uleb128 0xe
-	.4byte	.LASF2077
+	.4byte	.LASF2078
 	.byte	0x98
 	.byte	0xd7
-	.4byte	0xa001
+	.4byte	0xa016
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2141
+	.4byte	.LASF2142
 	.byte	0x98
 	.byte	0xd8
-	.4byte	0xa025
+	.4byte	0xa03a
 	.byte	0x8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x9fbe
+	.4byte	0x9fd3
 	.uleb128 0x14
-	.4byte	0x2d9
-	.4byte	0xa001
+	.4byte	0x2ee
+	.4byte	0xa016
 	.uleb128 0x11
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.uleb128 0x11
-	.4byte	0x9eda
+	.4byte	0x9eef
 	.uleb128 0x11
-	.4byte	0x219
+	.4byte	0x21e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9fe8
+	.4byte	0x9ffd
 	.uleb128 0x14
-	.4byte	0x2d9
-	.4byte	0xa025
+	.4byte	0x2ee
+	.4byte	0xa03a
 	.uleb128 0x11
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.uleb128 0x11
-	.4byte	0x9eda
+	.4byte	0x9eef
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa007
+	.4byte	0xa01c
 	.uleb128 0xd
-	.4byte	.LASF2012
+	.4byte	.LASF2013
 	.byte	0x4
 	.byte	0x99
 	.byte	0x15
-	.4byte	0xa044
+	.4byte	0xa059
 	.uleb128 0xe
-	.4byte	.LASF1126
+	.4byte	.LASF1127
 	.byte	0x99
 	.byte	0x16
-	.4byte	0x337d
+	.4byte	0x3392
 	.byte	0
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2142
+	.4byte	.LASF2143
 	.byte	0x8f
 	.byte	0x26
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x19
-	.4byte	.LASF2143
+	.4byte	.LASF2144
 	.byte	0x8f
 	.byte	0x2a
-	.4byte	0x155
+	.4byte	0x15a
 	.uleb128 0xd
-	.4byte	.LASF2010
+	.4byte	.LASF2011
 	.byte	0xa0
 	.byte	0x8f
 	.byte	0xcb
-	.4byte	0xa0c7
+	.4byte	0xa0dc
 	.uleb128 0xe
-	.4byte	.LASF961
+	.4byte	.LASF962
 	.byte	0x8f
 	.byte	0xcc
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2144
+	.4byte	.LASF2145
 	.byte	0x8f
 	.byte	0xcd
-	.4byte	0xe50
+	.4byte	0xe65
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2145
+	.4byte	.LASF2146
 	.byte	0x8f
 	.byte	0xce
-	.4byte	0x90f2
+	.4byte	0x9107
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2146
+	.4byte	.LASF2147
 	.byte	0x8f
 	.byte	0xcf
-	.4byte	0xa35b
+	.4byte	0xa370
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x8f
 	.byte	0xd1
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x8f
 	.byte	0xd2
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x8f
 	.byte	0xd3
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x8f
 	.byte	0xd4
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x98
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa05a
+	.4byte	0xa06f
 	.uleb128 0xd
-	.4byte	.LASF2147
+	.4byte	.LASF2148
 	.byte	0x50
 	.byte	0x8f
 	.byte	0x91
-	.4byte	0xa152
+	.4byte	0xa167
 	.uleb128 0xe
-	.4byte	.LASF112
+	.4byte	.LASF113
 	.byte	0x8f
 	.byte	0x92
-	.4byte	0xa163
+	.4byte	0xa178
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2140
+	.4byte	.LASF2141
 	.byte	0x8f
 	.byte	0x93
-	.4byte	0xa169
+	.4byte	0xa17e
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2148
+	.4byte	.LASF2149
 	.byte	0x8f
 	.byte	0x94
-	.4byte	0x9f60
+	.4byte	0x9f75
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2149
+	.4byte	.LASF2150
 	.byte	0x8f
 	.byte	0x95
-	.4byte	0xa184
+	.4byte	0xa199
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2150
+	.4byte	.LASF2151
 	.byte	0x8f
 	.byte	0x96
-	.4byte	0xa199
+	.4byte	0xa1ae
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2151
+	.4byte	.LASF2152
 	.byte	0x8f
 	.byte	0x97
-	.4byte	0xa1b4
+	.4byte	0xa1c9
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x8f
 	.byte	0x99
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x8f
 	.byte	0x9a
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x8f
 	.byte	0x9b
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x8f
 	.byte	0x9c
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x48
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa0cd
+	.4byte	0xa0e2
 	.uleb128 0x10
-	.4byte	0xa163
+	.4byte	0xa178
 	.uleb128 0x11
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa158
+	.4byte	0xa16d
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9fe3
+	.4byte	0x9ff8
 	.uleb128 0x14
-	.4byte	0xa17e
-	.4byte	0xa17e
+	.4byte	0xa193
+	.4byte	0xa193
 	.uleb128 0x11
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9e13
+	.4byte	0x9e28
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa16f
+	.4byte	0xa184
 	.uleb128 0x14
-	.4byte	0x30a7
-	.4byte	0xa199
+	.4byte	0x30bc
+	.4byte	0xa1ae
 	.uleb128 0x11
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa18a
+	.4byte	0xa19f
 	.uleb128 0x10
-	.4byte	0xa1b4
+	.4byte	0xa1c9
 	.uleb128 0x11
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.uleb128 0x11
-	.4byte	0x935c
+	.4byte	0x9371
 	.uleb128 0x11
-	.4byte	0x9362
+	.4byte	0x9377
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa19f
+	.4byte	0xa1b4
 	.uleb128 0x26
-	.4byte	.LASF2152
+	.4byte	.LASF2153
 	.2byte	0x1220
 	.byte	0x8f
 	.byte	0x9f
-	.4byte	0xa207
+	.4byte	0xa21c
 	.uleb128 0xe
-	.4byte	.LASF2153
+	.4byte	.LASF2154
 	.byte	0x8f
 	.byte	0xa0
-	.4byte	0xa207
+	.4byte	0xa21c
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2154
+	.4byte	.LASF2155
 	.byte	0x8f
 	.byte	0xa1
-	.4byte	0xa217
+	.4byte	0xa22c
 	.byte	0x18
 	.uleb128 0x27
-	.4byte	.LASF2155
+	.4byte	.LASF2156
 	.byte	0x8f
 	.byte	0xa2
 	.4byte	0xc6
@@ -30072,841 +30059,841 @@ __exitcall_ebc_exit:
 	.string	"buf"
 	.byte	0x8f
 	.byte	0xa3
-	.4byte	0xa227
+	.4byte	0xa23c
 	.2byte	0x21c
 	.uleb128 0x27
-	.4byte	.LASF2156
+	.4byte	.LASF2157
 	.byte	0x8f
 	.byte	0xa4
 	.4byte	0xc6
 	.2byte	0x121c
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x219
-	.4byte	0xa217
+	.4byte	0x21e
+	.4byte	0xa22c
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x219
-	.4byte	0xa227
+	.4byte	0x21e
+	.4byte	0xa23c
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3f
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0xa238
+	.4byte	0xa24d
 	.uleb128 0x43
 	.4byte	0x4f
 	.2byte	0xfff
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2157
+	.4byte	.LASF2158
 	.byte	0x18
 	.byte	0x8f
 	.byte	0xa7
-	.4byte	0xa269
+	.4byte	0xa27e
 	.uleb128 0xe
-	.4byte	.LASF904
+	.4byte	.LASF905
 	.byte	0x8f
 	.byte	0xa8
-	.4byte	0xa288
+	.4byte	0xa29d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0x8f
 	.byte	0xa9
-	.4byte	0xa2a7
+	.4byte	0xa2bc
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2158
+	.4byte	.LASF2159
 	.byte	0x8f
 	.byte	0xaa
-	.4byte	0xa2d1
+	.4byte	0xa2e6
 	.byte	0x10
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xa238
+	.4byte	0xa24d
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xa282
+	.4byte	0xa297
 	.uleb128 0x11
-	.4byte	0xa0c7
+	.4byte	0xa0dc
 	.uleb128 0x11
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa26e
+	.4byte	0xa283
 	.uleb128 0x3
-	.4byte	0xa282
+	.4byte	0xa297
 	.uleb128 0x14
 	.4byte	0x56
-	.4byte	0xa2a1
+	.4byte	0xa2b6
 	.uleb128 0x11
-	.4byte	0xa0c7
+	.4byte	0xa0dc
 	.uleb128 0x11
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa28d
+	.4byte	0xa2a2
 	.uleb128 0x3
-	.4byte	0xa2a1
+	.4byte	0xa2b6
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xa2c5
+	.4byte	0xa2da
 	.uleb128 0x11
-	.4byte	0xa0c7
+	.4byte	0xa0dc
 	.uleb128 0x11
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.uleb128 0x11
-	.4byte	0xa2c5
+	.4byte	0xa2da
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa1ba
+	.4byte	0xa1cf
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa2ac
+	.4byte	0xa2c1
 	.uleb128 0x3
-	.4byte	0xa2cb
+	.4byte	0xa2e0
 	.uleb128 0xd
-	.4byte	.LASF2159
+	.4byte	.LASF2160
 	.byte	0x20
 	.byte	0x8f
 	.byte	0xae
-	.4byte	0xa307
+	.4byte	0xa31c
 	.uleb128 0xe
-	.4byte	.LASF2114
+	.4byte	.LASF2115
 	.byte	0x8f
 	.byte	0xaf
-	.4byte	0x9e4e
+	.4byte	0x9e63
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2077
+	.4byte	.LASF2078
 	.byte	0x8f
 	.byte	0xb0
-	.4byte	0xa326
+	.4byte	0xa33b
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2141
+	.4byte	.LASF2142
 	.byte	0x8f
 	.byte	0xb2
-	.4byte	0xa34a
+	.4byte	0xa35f
 	.byte	0x18
 	.byte	0
 	.uleb128 0x14
-	.4byte	0x2d9
-	.4byte	0xa320
+	.4byte	0x2ee
+	.4byte	0xa335
 	.uleb128 0x11
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.uleb128 0x11
-	.4byte	0xa320
+	.4byte	0xa335
 	.uleb128 0x11
-	.4byte	0x219
+	.4byte	0x21e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa2d6
+	.4byte	0xa2eb
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa307
+	.4byte	0xa31c
 	.uleb128 0x14
-	.4byte	0x2d9
-	.4byte	0xa34a
+	.4byte	0x2ee
+	.4byte	0xa35f
 	.uleb128 0x11
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.uleb128 0x11
-	.4byte	0xa320
+	.4byte	0xa335
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa32c
+	.4byte	0xa341
 	.uleb128 0x19
-	.4byte	.LASF2160
+	.4byte	.LASF2161
 	.byte	0x8f
 	.byte	0xb6
-	.4byte	0x9fe3
+	.4byte	0x9ff8
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa269
+	.4byte	0xa27e
 	.uleb128 0x19
-	.4byte	.LASF2161
+	.4byte	.LASF2162
 	.byte	0x8f
 	.byte	0xf5
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.uleb128 0x19
-	.4byte	.LASF2162
+	.4byte	.LASF2163
 	.byte	0x8f
 	.byte	0xf7
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.uleb128 0x19
-	.4byte	.LASF2163
+	.4byte	.LASF2164
 	.byte	0x8f
 	.byte	0xf9
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.uleb128 0x19
-	.4byte	.LASF2164
+	.4byte	.LASF2165
 	.byte	0x8f
 	.byte	0xfb
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.uleb128 0x19
-	.4byte	.LASF2165
+	.4byte	.LASF2166
 	.byte	0x8f
 	.byte	0xfd
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.uleb128 0xd
-	.4byte	.LASF2166
+	.4byte	.LASF2167
 	.byte	0x20
 	.byte	0x9a
 	.byte	0x27
-	.4byte	0xa3c9
+	.4byte	0xa3de
 	.uleb128 0xe
-	.4byte	.LASF2167
+	.4byte	.LASF2168
 	.byte	0x9a
 	.byte	0x28
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2168
+	.4byte	.LASF2169
 	.byte	0x9a
 	.byte	0x29
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2169
+	.4byte	.LASF2170
 	.byte	0x9a
 	.byte	0x2a
-	.4byte	0xa02b
+	.4byte	0xa040
 	.byte	0x18
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2170
+	.4byte	.LASF2171
 	.byte	0x9b
 	.byte	0x22
-	.4byte	0x4a2
+	.4byte	0x4b7
 	.uleb128 0x19
-	.4byte	.LASF2171
+	.4byte	.LASF2172
 	.byte	0x9b
 	.byte	0x23
-	.4byte	0x4a2
+	.4byte	0x4b7
 	.uleb128 0x19
-	.4byte	.LASF2172
+	.4byte	.LASF2173
 	.byte	0x9b
 	.byte	0x39
-	.4byte	0x564
+	.4byte	0x579
 	.uleb128 0xd
-	.4byte	.LASF2173
+	.4byte	.LASF2174
 	.byte	0x4
 	.byte	0x9b
 	.byte	0x3e
-	.4byte	0xa403
+	.4byte	0xa418
 	.uleb128 0xe
-	.4byte	.LASF2037
+	.4byte	.LASF2038
 	.byte	0x9b
 	.byte	0x3f
 	.4byte	0xc6
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF2174
+	.4byte	.LASF2175
 	.byte	0x9b
 	.byte	0x40
-	.4byte	0xa3ea
+	.4byte	0xa3ff
 	.uleb128 0x1d
-	.4byte	.LASF2175
+	.4byte	.LASF2176
 	.byte	0xb8
 	.byte	0x9b
 	.2byte	0x122
-	.4byte	0xa547
+	.4byte	0xa55c
 	.uleb128 0x1b
-	.4byte	.LASF2176
+	.4byte	.LASF2177
 	.byte	0x9b
 	.2byte	0x123
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2177
+	.4byte	.LASF2178
 	.byte	0x9b
 	.2byte	0x124
-	.4byte	0xa84e
+	.4byte	0xa863
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2178
+	.4byte	.LASF2179
 	.byte	0x9b
 	.2byte	0x125
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2179
+	.4byte	.LASF2180
 	.byte	0x9b
 	.2byte	0x126
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF2180
+	.4byte	.LASF2181
 	.byte	0x9b
 	.2byte	0x127
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2181
+	.4byte	.LASF2182
 	.byte	0x9b
 	.2byte	0x128
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF2182
+	.4byte	.LASF2183
 	.byte	0x9b
 	.2byte	0x129
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF2183
+	.4byte	.LASF2184
 	.byte	0x9b
 	.2byte	0x12a
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF2184
+	.4byte	.LASF2185
 	.byte	0x9b
 	.2byte	0x12b
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF2185
+	.4byte	.LASF2186
 	.byte	0x9b
 	.2byte	0x12c
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF2186
+	.4byte	.LASF2187
 	.byte	0x9b
 	.2byte	0x12d
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF2187
+	.4byte	.LASF2188
 	.byte	0x9b
 	.2byte	0x12e
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF2188
+	.4byte	.LASF2189
 	.byte	0x9b
 	.2byte	0x12f
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF2189
+	.4byte	.LASF2190
 	.byte	0x9b
 	.2byte	0x130
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF2190
+	.4byte	.LASF2191
 	.byte	0x9b
 	.2byte	0x131
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF2191
+	.4byte	.LASF2192
 	.byte	0x9b
 	.2byte	0x132
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF2192
+	.4byte	.LASF2193
 	.byte	0x9b
 	.2byte	0x133
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF2193
+	.4byte	.LASF2194
 	.byte	0x9b
 	.2byte	0x134
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF2194
+	.4byte	.LASF2195
 	.byte	0x9b
 	.2byte	0x135
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF2195
+	.4byte	.LASF2196
 	.byte	0x9b
 	.2byte	0x136
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF2196
+	.4byte	.LASF2197
 	.byte	0x9b
 	.2byte	0x137
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF2197
+	.4byte	.LASF2198
 	.byte	0x9b
 	.2byte	0x138
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF2198
+	.4byte	.LASF2199
 	.byte	0x9b
 	.2byte	0x139
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0xb0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xa40e
+	.4byte	0xa423
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa561
+	.4byte	0xa576
 	.uleb128 0x1a
-	.4byte	.LASF2199
+	.4byte	.LASF2200
 	.2byte	0x3b0
 	.byte	0x2
 	.2byte	0x407
-	.4byte	0xa838
+	.4byte	0xa84d
 	.uleb128 0x1b
-	.4byte	.LASF639
+	.4byte	.LASF640
 	.byte	0x2
 	.2byte	0x408
-	.4byte	0xa55b
+	.4byte	0xa570
 	.byte	0
 	.uleb128 0x2b
 	.string	"p"
 	.byte	0x2
 	.2byte	0x40a
-	.4byte	0xb559
+	.4byte	0xb56e
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2145
+	.4byte	.LASF2146
 	.byte	0x2
 	.2byte	0x40c
-	.4byte	0x90f2
+	.4byte	0x9107
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2200
+	.4byte	.LASF2201
 	.byte	0x2
 	.2byte	0x40d
 	.4byte	0x56
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF192
+	.4byte	.LASF193
 	.byte	0x2
 	.2byte	0x40e
-	.4byte	0xb120
+	.4byte	0xb135
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF574
+	.4byte	.LASF575
 	.byte	0x2
 	.2byte	0x410
-	.4byte	0x2455
+	.4byte	0x246a
 	.byte	0x80
 	.uleb128 0x2b
 	.string	"bus"
 	.byte	0x2
 	.2byte	0x414
-	.4byte	0xadc2
+	.4byte	0xadd7
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF2201
+	.4byte	.LASF2202
 	.byte	0x2
 	.2byte	0x415
-	.4byte	0xaf36
+	.4byte	0xaf4b
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF2202
+	.4byte	.LASF2203
 	.byte	0x2
 	.2byte	0x417
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF2203
+	.4byte	.LASF2204
 	.byte	0x2
 	.2byte	0x419
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF2204
+	.4byte	.LASF2205
 	.byte	0x2
 	.2byte	0x41b
-	.4byte	0xb4c4
+	.4byte	0xb4d9
 	.byte	0xc0
 	.uleb128 0x1c
-	.4byte	.LASF2205
+	.4byte	.LASF2206
 	.byte	0x2
 	.2byte	0x41c
-	.4byte	0xa8fb
+	.4byte	0xa910
 	.2byte	0x128
 	.uleb128 0x1c
-	.4byte	.LASF2206
+	.4byte	.LASF2207
 	.byte	0x2
 	.2byte	0x41d
-	.4byte	0xb55f
+	.4byte	0xb574
 	.2byte	0x260
 	.uleb128 0x1c
-	.4byte	.LASF2207
+	.4byte	.LASF2208
 	.byte	0x2
 	.2byte	0x420
-	.4byte	0xb661
+	.4byte	0xb676
 	.2byte	0x268
 	.uleb128 0x1c
-	.4byte	.LASF2208
+	.4byte	.LASF2209
 	.byte	0x2
 	.2byte	0x423
-	.4byte	0xb66c
+	.4byte	0xb681
 	.2byte	0x270
 	.uleb128 0x1c
-	.4byte	.LASF2209
+	.4byte	.LASF2210
 	.byte	0x2
 	.2byte	0x426
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x278
 	.uleb128 0x1c
-	.4byte	.LASF2210
+	.4byte	.LASF2211
 	.byte	0x2
 	.2byte	0x42c
-	.4byte	0xb7a4
+	.4byte	0xb7b9
 	.2byte	0x288
 	.uleb128 0x1c
-	.4byte	.LASF2211
+	.4byte	.LASF2212
 	.byte	0x2
 	.2byte	0x42d
-	.4byte	0x466f
+	.4byte	0x4684
 	.2byte	0x290
 	.uleb128 0x1c
-	.4byte	.LASF2212
+	.4byte	.LASF2213
 	.byte	0x2
 	.2byte	0x42e
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x298
 	.uleb128 0x1c
-	.4byte	.LASF2213
+	.4byte	.LASF2214
 	.byte	0x2
 	.2byte	0x433
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x2a0
 	.uleb128 0x1c
-	.4byte	.LASF2214
+	.4byte	.LASF2215
 	.byte	0x2
 	.2byte	0x434
 	.4byte	0x29
 	.2byte	0x2a8
 	.uleb128 0x1c
-	.4byte	.LASF2215
+	.4byte	.LASF2216
 	.byte	0x2
 	.2byte	0x436
-	.4byte	0xb7aa
+	.4byte	0xb7bf
 	.2byte	0x2b0
 	.uleb128 0x1c
-	.4byte	.LASF2216
+	.4byte	.LASF2217
 	.byte	0x2
 	.2byte	0x438
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x2b8
 	.uleb128 0x1c
-	.4byte	.LASF2217
+	.4byte	.LASF2218
 	.byte	0x2
 	.2byte	0x43a
-	.4byte	0xb7b5
+	.4byte	0xb7ca
 	.2byte	0x2c8
 	.uleb128 0x1c
-	.4byte	.LASF2218
+	.4byte	.LASF2219
 	.byte	0x2
 	.2byte	0x43d
-	.4byte	0xb7c0
+	.4byte	0xb7d5
 	.2byte	0x2d0
 	.uleb128 0x1c
-	.4byte	.LASF2219
+	.4byte	.LASF2220
 	.byte	0x2
 	.2byte	0x440
-	.4byte	0xb7cb
+	.4byte	0xb7e0
 	.2byte	0x2d8
 	.uleb128 0x1c
-	.4byte	.LASF2220
+	.4byte	.LASF2221
 	.byte	0x2
 	.2byte	0x442
-	.4byte	0xad95
+	.4byte	0xadaa
 	.2byte	0x2e0
 	.uleb128 0x1c
-	.4byte	.LASF2221
+	.4byte	.LASF2222
 	.byte	0x2
 	.2byte	0x444
-	.4byte	0xb87f
+	.4byte	0xb894
 	.2byte	0x2f0
 	.uleb128 0x1c
-	.4byte	.LASF2222
+	.4byte	.LASF2223
 	.byte	0x2
 	.2byte	0x445
-	.4byte	0xb494
+	.4byte	0xb4a9
 	.2byte	0x2f8
 	.uleb128 0x1c
-	.4byte	.LASF2223
+	.4byte	.LASF2224
 	.byte	0x2
 	.2byte	0x447
-	.4byte	0x26f
+	.4byte	0x284
 	.2byte	0x300
 	.uleb128 0x30
 	.string	"id"
 	.byte	0x2
 	.2byte	0x448
-	.4byte	0x13a
+	.4byte	0x13f
 	.2byte	0x304
 	.uleb128 0x1c
-	.4byte	.LASF2224
+	.4byte	.LASF2225
 	.byte	0x2
 	.2byte	0x44a
-	.4byte	0xe50
+	.4byte	0xe65
 	.2byte	0x308
 	.uleb128 0x1c
-	.4byte	.LASF2225
+	.4byte	.LASF2226
 	.byte	0x2
 	.2byte	0x44b
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x310
 	.uleb128 0x1c
-	.4byte	.LASF2226
+	.4byte	.LASF2227
 	.byte	0x2
 	.2byte	0x44d
-	.4byte	0xa398
+	.4byte	0xa3ad
 	.2byte	0x320
 	.uleb128 0x1c
-	.4byte	.LASF2227
+	.4byte	.LASF2228
 	.byte	0x2
 	.2byte	0x44e
-	.4byte	0xb310
+	.4byte	0xb325
 	.2byte	0x340
 	.uleb128 0x1c
-	.4byte	.LASF2228
+	.4byte	.LASF2229
 	.byte	0x2
 	.2byte	0x44f
-	.4byte	0xaf16
+	.4byte	0xaf2b
 	.2byte	0x348
 	.uleb128 0x1c
-	.4byte	.LASF112
+	.4byte	.LASF113
 	.byte	0x2
 	.2byte	0x451
-	.4byte	0xa84e
+	.4byte	0xa863
 	.2byte	0x350
 	.uleb128 0x1c
-	.4byte	.LASF2229
+	.4byte	.LASF2230
 	.byte	0x2
 	.2byte	0x452
-	.4byte	0xb88a
+	.4byte	0xb89f
 	.2byte	0x358
 	.uleb128 0x1c
-	.4byte	.LASF2230
+	.4byte	.LASF2231
 	.byte	0x2
 	.2byte	0x453
-	.4byte	0xb895
+	.4byte	0xb8aa
 	.2byte	0x360
 	.uleb128 0x33
-	.4byte	.LASF2231
+	.4byte	.LASF2232
 	.byte	0x2
 	.2byte	0x455
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.byte	0x1
 	.byte	0x7
 	.2byte	0x368
 	.uleb128 0x33
-	.4byte	.LASF2232
+	.4byte	.LASF2233
 	.byte	0x2
 	.2byte	0x456
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.byte	0x1
 	.byte	0x6
 	.2byte	0x368
 	.uleb128 0x33
-	.4byte	.LASF2233
+	.4byte	.LASF2234
 	.byte	0x2
 	.2byte	0x457
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.byte	0x1
 	.byte	0x5
 	.2byte	0x368
 	.uleb128 0x33
-	.4byte	.LASF2234
+	.4byte	.LASF2235
 	.byte	0x2
 	.2byte	0x458
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.byte	0x1
 	.byte	0x4
 	.2byte	0x368
 	.uleb128 0x1c
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x2
 	.2byte	0x45a
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x370
 	.uleb128 0x1c
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x2
 	.2byte	0x45b
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x378
 	.uleb128 0x1c
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x2
 	.2byte	0x45c
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x380
 	.uleb128 0x1c
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x2
 	.2byte	0x45d
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x388
 	.uleb128 0x1c
-	.4byte	.LASF2235
+	.4byte	.LASF2236
 	.byte	0x2
 	.2byte	0x45e
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x390
 	.uleb128 0x1c
-	.4byte	.LASF2236
+	.4byte	.LASF2237
 	.byte	0x2
 	.2byte	0x45f
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x398
 	.uleb128 0x1c
-	.4byte	.LASF748
+	.4byte	.LASF749
 	.byte	0x2
 	.2byte	0x460
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x3a0
 	.uleb128 0x1c
-	.4byte	.LASF749
+	.4byte	.LASF750
 	.byte	0x2
 	.2byte	0x461
-	.4byte	0x155
+	.4byte	0x15a
 	.2byte	0x3a8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xa561
+	.4byte	0xa576
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa54c
+	.4byte	0xa561
 	.uleb128 0x10
-	.4byte	0xa84e
+	.4byte	0xa863
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa843
+	.4byte	0xa858
 	.uleb128 0x1e
-	.4byte	.LASF2237
+	.4byte	.LASF2238
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x9b
 	.2byte	0x1fc
-	.4byte	0xa87e
+	.4byte	0xa893
 	.uleb128 0xc
-	.4byte	.LASF2238
+	.4byte	.LASF2239
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2239
+	.4byte	.LASF2240
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2240
+	.4byte	.LASF2241
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2241
+	.4byte	.LASF2242
 	.byte	0x3
 	.byte	0
 	.uleb128 0x1e
-	.4byte	.LASF2242
+	.4byte	.LASF2243
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x9b
 	.2byte	0x212
-	.4byte	0xa8ae
+	.4byte	0xa8c3
 	.uleb128 0xc
-	.4byte	.LASF2243
+	.4byte	.LASF2244
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2244
+	.4byte	.LASF2245
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2245
+	.4byte	.LASF2246
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2246
+	.4byte	.LASF2247
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2247
+	.4byte	.LASF2248
 	.byte	0x4
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF2248
+	.4byte	.LASF2249
 	.byte	0x20
 	.byte	0x9b
 	.2byte	0x21e
-	.4byte	0xa8f0
+	.4byte	0xa905
 	.uleb128 0x1b
-	.4byte	.LASF115
+	.4byte	.LASF116
 	.byte	0x9b
 	.2byte	0x21f
-	.4byte	0xe50
+	.4byte	0xe65
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1126
+	.4byte	.LASF1127
 	.byte	0x9b
 	.2byte	0x220
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF2249
+	.4byte	.LASF2250
 	.byte	0x9b
 	.2byte	0x222
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2250
+	.4byte	.LASF2251
 	.byte	0x9b
 	.2byte	0x225
-	.4byte	0xa8f5
+	.4byte	0xa90a
 	.byte	0x18
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF2251
+	.4byte	.LASF2252
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa8f0
+	.4byte	0xa905
 	.uleb128 0x1a
-	.4byte	.LASF2252
+	.4byte	.LASF2253
 	.2byte	0x138
 	.byte	0x9b
 	.2byte	0x249
-	.4byte	0xabf6
+	.4byte	0xac0b
 	.uleb128 0x1b
-	.4byte	.LASF2253
+	.4byte	.LASF2254
 	.byte	0x9b
 	.2byte	0x24a
-	.4byte	0xa403
+	.4byte	0xa418
 	.byte	0
 	.uleb128 0x3b
-	.4byte	.LASF2254
+	.4byte	.LASF2255
 	.byte	0x9b
 	.2byte	0x24b
 	.4byte	0x6d
@@ -30915,7 +30902,7 @@ __exitcall_ebc_exit:
 	.byte	0x1f
 	.byte	0x4
 	.uleb128 0x3b
-	.4byte	.LASF2255
+	.4byte	.LASF2256
 	.byte	0x9b
 	.2byte	0x24c
 	.4byte	0x6d
@@ -30924,136 +30911,136 @@ __exitcall_ebc_exit:
 	.byte	0x1e
 	.byte	0x4
 	.uleb128 0x3b
-	.4byte	.LASF2256
+	.4byte	.LASF2257
 	.byte	0x9b
 	.2byte	0x24d
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.byte	0x1
 	.byte	0x5
 	.byte	0x4
 	.uleb128 0x3b
-	.4byte	.LASF2257
+	.4byte	.LASF2258
 	.byte	0x9b
 	.2byte	0x24e
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.byte	0x1
 	.byte	0x4
 	.byte	0x4
 	.uleb128 0x3b
-	.4byte	.LASF2258
+	.4byte	.LASF2259
 	.byte	0x9b
 	.2byte	0x24f
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.byte	0x1
 	.byte	0x3
 	.byte	0x4
 	.uleb128 0x3b
-	.4byte	.LASF2259
+	.4byte	.LASF2260
 	.byte	0x9b
 	.2byte	0x250
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.byte	0x1
 	.byte	0x2
 	.byte	0x4
 	.uleb128 0x3b
-	.4byte	.LASF2260
+	.4byte	.LASF2261
 	.byte	0x9b
 	.2byte	0x251
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.byte	0x1
 	.byte	0x1
 	.byte	0x4
 	.uleb128 0x3b
-	.4byte	.LASF2261
+	.4byte	.LASF2262
 	.byte	0x9b
 	.2byte	0x252
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.byte	0x1
 	.byte	0
 	.byte	0x4
 	.uleb128 0x3b
-	.4byte	.LASF2262
+	.4byte	.LASF2263
 	.byte	0x9b
 	.2byte	0x253
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.byte	0x1
 	.byte	0x7
 	.byte	0x5
 	.uleb128 0x3b
-	.4byte	.LASF2263
+	.4byte	.LASF2264
 	.byte	0x9b
 	.2byte	0x254
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.byte	0x1
 	.byte	0x6
 	.byte	0x5
 	.uleb128 0x1b
-	.4byte	.LASF2264
+	.4byte	.LASF2265
 	.byte	0x9b
 	.2byte	0x255
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF115
+	.4byte	.LASF116
 	.byte	0x9b
 	.2byte	0x256
-	.4byte	0xe50
+	.4byte	0xe65
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF360
+	.4byte	.LASF361
 	.byte	0x9b
 	.2byte	0x258
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1098
+	.4byte	.LASF1099
 	.byte	0x9b
 	.2byte	0x259
-	.4byte	0x463e
+	.4byte	0x4653
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2265
+	.4byte	.LASF2266
 	.byte	0x9b
 	.2byte	0x25a
-	.4byte	0xacf8
+	.4byte	0xad0d
 	.byte	0x40
 	.uleb128 0x3b
-	.4byte	.LASF2266
+	.4byte	.LASF2267
 	.byte	0x9b
 	.2byte	0x25b
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.byte	0x1
 	.byte	0x7
 	.byte	0x48
 	.uleb128 0x3b
-	.4byte	.LASF2267
+	.4byte	.LASF2268
 	.byte	0x9b
 	.2byte	0x25c
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.byte	0x1
 	.byte	0x6
 	.byte	0x48
 	.uleb128 0x3b
-	.4byte	.LASF2268
+	.4byte	.LASF2269
 	.byte	0x9b
 	.2byte	0x25d
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.byte	0x1
 	.byte	0x5
 	.byte	0x48
 	.uleb128 0x3b
-	.4byte	.LASF2269
+	.4byte	.LASF2270
 	.byte	0x9b
 	.2byte	0x25e
 	.4byte	0x6d
@@ -31062,7 +31049,7 @@ __exitcall_ebc_exit:
 	.byte	0x1c
 	.byte	0x48
 	.uleb128 0x3b
-	.4byte	.LASF2270
+	.4byte	.LASF2271
 	.byte	0x9b
 	.2byte	0x25f
 	.4byte	0x6d
@@ -31071,49 +31058,49 @@ __exitcall_ebc_exit:
 	.byte	0x1b
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF2271
+	.4byte	.LASF2272
 	.byte	0x9b
 	.2byte	0x264
-	.4byte	0x315d
+	.4byte	0x3172
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF2272
+	.4byte	.LASF2273
 	.byte	0x9b
 	.2byte	0x265
 	.4byte	0x29
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF2273
+	.4byte	.LASF2274
 	.byte	0x9b
 	.2byte	0x266
-	.4byte	0x31f6
+	.4byte	0x320b
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF2274
+	.4byte	.LASF2275
 	.byte	0x9b
 	.2byte	0x267
-	.4byte	0x15aa
+	.4byte	0x15bf
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF2275
+	.4byte	.LASF2276
 	.byte	0x9b
 	.2byte	0x268
-	.4byte	0xad03
+	.4byte	0xad18
 	.byte	0xd8
 	.uleb128 0x1b
-	.4byte	.LASF2276
+	.4byte	.LASF2277
 	.byte	0x9b
 	.2byte	0x269
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0xe0
 	.uleb128 0x1b
-	.4byte	.LASF2277
+	.4byte	.LASF2278
 	.byte	0x9b
 	.2byte	0x26a
-	.4byte	0x367
+	.4byte	0x37c
 	.byte	0xe4
 	.uleb128 0x3b
-	.4byte	.LASF2278
+	.4byte	.LASF2279
 	.byte	0x9b
 	.2byte	0x26b
 	.4byte	0x6d
@@ -31122,7 +31109,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.byte	0xe8
 	.uleb128 0x3b
-	.4byte	.LASF2279
+	.4byte	.LASF2280
 	.byte	0x9b
 	.2byte	0x26c
 	.4byte	0x6d
@@ -31131,7 +31118,7 @@ __exitcall_ebc_exit:
 	.byte	0x1c
 	.byte	0xe8
 	.uleb128 0x3b
-	.4byte	.LASF2280
+	.4byte	.LASF2281
 	.byte	0x9b
 	.2byte	0x26d
 	.4byte	0x6d
@@ -31140,7 +31127,7 @@ __exitcall_ebc_exit:
 	.byte	0x1b
 	.byte	0xe8
 	.uleb128 0x3b
-	.4byte	.LASF2281
+	.4byte	.LASF2282
 	.byte	0x9b
 	.2byte	0x26e
 	.4byte	0x6d
@@ -31149,7 +31136,7 @@ __exitcall_ebc_exit:
 	.byte	0x1a
 	.byte	0xe8
 	.uleb128 0x3b
-	.4byte	.LASF2282
+	.4byte	.LASF2283
 	.byte	0x9b
 	.2byte	0x26f
 	.4byte	0x6d
@@ -31158,16 +31145,16 @@ __exitcall_ebc_exit:
 	.byte	0x19
 	.byte	0xe8
 	.uleb128 0x3b
-	.4byte	.LASF2283
+	.4byte	.LASF2284
 	.byte	0x9b
 	.2byte	0x270
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.byte	0x1
 	.byte	0
 	.byte	0xe8
 	.uleb128 0x3b
-	.4byte	.LASF2284
+	.4byte	.LASF2285
 	.byte	0x9b
 	.2byte	0x271
 	.4byte	0x6d
@@ -31176,7 +31163,7 @@ __exitcall_ebc_exit:
 	.byte	0x17
 	.byte	0xe8
 	.uleb128 0x3b
-	.4byte	.LASF2285
+	.4byte	.LASF2286
 	.byte	0x9b
 	.2byte	0x272
 	.4byte	0x6d
@@ -31185,7 +31172,7 @@ __exitcall_ebc_exit:
 	.byte	0x16
 	.byte	0xe8
 	.uleb128 0x3b
-	.4byte	.LASF2286
+	.4byte	.LASF2287
 	.byte	0x9b
 	.2byte	0x273
 	.4byte	0x6d
@@ -31194,7 +31181,7 @@ __exitcall_ebc_exit:
 	.byte	0x15
 	.byte	0xe8
 	.uleb128 0x3b
-	.4byte	.LASF2287
+	.4byte	.LASF2288
 	.byte	0x9b
 	.2byte	0x274
 	.4byte	0x6d
@@ -31203,7 +31190,7 @@ __exitcall_ebc_exit:
 	.byte	0x14
 	.byte	0xe8
 	.uleb128 0x3b
-	.4byte	.LASF2288
+	.4byte	.LASF2289
 	.byte	0x9b
 	.2byte	0x275
 	.4byte	0x6d
@@ -31212,86 +31199,86 @@ __exitcall_ebc_exit:
 	.byte	0x13
 	.byte	0xe8
 	.uleb128 0x1b
-	.4byte	.LASF2289
+	.4byte	.LASF2290
 	.byte	0x9b
 	.2byte	0x276
 	.4byte	0x6d
 	.byte	0xec
 	.uleb128 0x1b
-	.4byte	.LASF2290
+	.4byte	.LASF2291
 	.byte	0x9b
 	.2byte	0x277
-	.4byte	0xa87e
+	.4byte	0xa893
 	.byte	0xf0
 	.uleb128 0x1b
-	.4byte	.LASF2291
+	.4byte	.LASF2292
 	.byte	0x9b
 	.2byte	0x278
-	.4byte	0xa854
+	.4byte	0xa869
 	.byte	0xf4
 	.uleb128 0x1b
-	.4byte	.LASF2292
+	.4byte	.LASF2293
 	.byte	0x9b
 	.2byte	0x279
 	.4byte	0xc6
 	.byte	0xf8
 	.uleb128 0x1b
-	.4byte	.LASF2293
+	.4byte	.LASF2294
 	.byte	0x9b
 	.2byte	0x27a
 	.4byte	0xc6
 	.byte	0xfc
 	.uleb128 0x1c
-	.4byte	.LASF2294
+	.4byte	.LASF2295
 	.byte	0x9b
 	.2byte	0x27b
 	.4byte	0x29
 	.2byte	0x100
 	.uleb128 0x1c
-	.4byte	.LASF2295
+	.4byte	.LASF2296
 	.byte	0x9b
 	.2byte	0x27c
 	.4byte	0x29
 	.2byte	0x108
 	.uleb128 0x1c
-	.4byte	.LASF2296
+	.4byte	.LASF2297
 	.byte	0x9b
 	.2byte	0x27d
 	.4byte	0x29
 	.2byte	0x110
 	.uleb128 0x1c
-	.4byte	.LASF2297
+	.4byte	.LASF2298
 	.byte	0x9b
 	.2byte	0x27e
 	.4byte	0x29
 	.2byte	0x118
 	.uleb128 0x1c
-	.4byte	.LASF2298
+	.4byte	.LASF2299
 	.byte	0x9b
 	.2byte	0x280
-	.4byte	0xad09
+	.4byte	0xad1e
 	.2byte	0x120
 	.uleb128 0x1c
-	.4byte	.LASF2299
+	.4byte	.LASF2300
 	.byte	0x9b
 	.2byte	0x281
-	.4byte	0xad1f
+	.4byte	0xad34
 	.2byte	0x128
 	.uleb128 0x30
 	.string	"qos"
 	.byte	0x9b
 	.2byte	0x282
-	.4byte	0xad2a
+	.4byte	0xad3f
 	.2byte	0x130
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2300
+	.4byte	.LASF2301
 	.byte	0xd0
 	.byte	0x9c
 	.byte	0x38
-	.4byte	0xacf8
+	.4byte	0xad0d
 	.uleb128 0xe
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0x9c
 	.byte	0x39
 	.4byte	0x56
@@ -31303,91 +31290,91 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF360
+	.4byte	.LASF361
 	.byte	0x9c
 	.byte	0x3b
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF115
+	.4byte	.LASF116
 	.byte	0x9c
 	.byte	0x3c
-	.4byte	0xe50
+	.4byte	0xe65
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2275
+	.4byte	.LASF2276
 	.byte	0x9c
 	.byte	0x3d
-	.4byte	0xad03
+	.4byte	0xad18
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2301
+	.4byte	.LASF2302
 	.byte	0x9c
 	.byte	0x3e
-	.4byte	0x315d
+	.4byte	0x3172
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2272
+	.4byte	.LASF2273
 	.byte	0x9c
 	.byte	0x3f
 	.4byte	0x29
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2302
+	.4byte	.LASF2303
 	.byte	0x9c
 	.byte	0x40
-	.4byte	0x3126
+	.4byte	0x313b
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF2303
+	.4byte	.LASF2304
 	.byte	0x9c
 	.byte	0x41
-	.4byte	0x3126
+	.4byte	0x313b
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2304
+	.4byte	.LASF2305
 	.byte	0x9c
 	.byte	0x42
-	.4byte	0x3126
+	.4byte	0x313b
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF2305
+	.4byte	.LASF2306
 	.byte	0x9c
 	.byte	0x43
-	.4byte	0x3126
+	.4byte	0x313b
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF2306
+	.4byte	.LASF2307
 	.byte	0x9c
 	.byte	0x44
-	.4byte	0x3126
+	.4byte	0x313b
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2307
+	.4byte	.LASF2308
 	.byte	0x9c
 	.byte	0x45
 	.4byte	0x29
 	.byte	0x98
 	.uleb128 0xe
-	.4byte	.LASF2308
+	.4byte	.LASF2309
 	.byte	0x9c
 	.byte	0x46
 	.4byte	0x29
 	.byte	0xa0
 	.uleb128 0xe
-	.4byte	.LASF2309
+	.4byte	.LASF2310
 	.byte	0x9c
 	.byte	0x47
 	.4byte	0x29
 	.byte	0xa8
 	.uleb128 0xe
-	.4byte	.LASF2310
+	.4byte	.LASF2311
 	.byte	0x9c
 	.byte	0x48
 	.4byte	0x29
 	.byte	0xb0
 	.uleb128 0xe
-	.4byte	.LASF2311
+	.4byte	.LASF2312
 	.byte	0x9c
 	.byte	0x49
 	.4byte	0x29
@@ -31396,22 +31383,22 @@ __exitcall_ebc_exit:
 	.string	"dev"
 	.byte	0x9c
 	.byte	0x4a
-	.4byte	0xa55b
+	.4byte	0xa570
 	.byte	0xc0
 	.uleb128 0x38
-	.4byte	.LASF881
+	.4byte	.LASF882
 	.byte	0x9c
 	.byte	0x4b
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.byte	0x1
 	.byte	0x7
 	.byte	0xc8
 	.uleb128 0x38
-	.4byte	.LASF2312
+	.4byte	.LASF2313
 	.byte	0x9c
 	.byte	0x4c
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.byte	0x1
 	.byte	0x6
@@ -31419,298 +31406,298 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xabf6
+	.4byte	0xac0b
 	.uleb128 0x24
-	.4byte	.LASF2313
+	.4byte	.LASF2314
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xacfe
+	.4byte	0xad13
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa8ae
+	.4byte	0xa8c3
 	.uleb128 0x10
-	.4byte	0xad1f
+	.4byte	0xad34
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0x12a
+	.4byte	0x12f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xad0f
+	.4byte	0xad24
 	.uleb128 0x24
-	.4byte	.LASF2314
+	.4byte	.LASF2315
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xad25
+	.4byte	0xad3a
 	.uleb128 0x1d
-	.4byte	.LASF2315
+	.4byte	.LASF2316
 	.byte	0xd8
 	.byte	0x9b
 	.2byte	0x296
-	.4byte	0xad7f
+	.4byte	0xad94
 	.uleb128 0x2b
 	.string	"ops"
 	.byte	0x9b
 	.2byte	0x297
-	.4byte	0xa40e
+	.4byte	0xa423
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2316
+	.4byte	.LASF2317
 	.byte	0x9b
 	.2byte	0x298
-	.4byte	0xad8f
+	.4byte	0xada4
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF2317
+	.4byte	.LASF2318
 	.byte	0x9b
 	.2byte	0x299
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF2318
+	.4byte	.LASF2319
 	.byte	0x9b
 	.2byte	0x29a
-	.4byte	0xa84e
+	.4byte	0xa863
 	.byte	0xc8
 	.uleb128 0x1b
-	.4byte	.LASF2319
+	.4byte	.LASF2320
 	.byte	0x9b
 	.2byte	0x29b
-	.4byte	0xa84e
+	.4byte	0xa863
 	.byte	0xd0
 	.byte	0
 	.uleb128 0x10
-	.4byte	0xad8f
+	.4byte	0xada4
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xad7f
+	.4byte	0xad94
 	.uleb128 0xd
-	.4byte	.LASF2320
+	.4byte	.LASF2321
 	.byte	0x10
 	.byte	0x9d
 	.byte	0x13
-	.4byte	0xadba
+	.4byte	0xadcf
 	.uleb128 0xe
-	.4byte	.LASF2321
+	.4byte	.LASF2322
 	.byte	0x9d
 	.byte	0x15
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2322
+	.4byte	.LASF2323
 	.byte	0x9d
 	.byte	0x1a
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x8
 	.byte	0
 	.uleb128 0x3a
-	.4byte	.LASF2323
+	.4byte	.LASF2324
 	.byte	0
 	.byte	0x9d
 	.byte	0x20
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xadc8
+	.4byte	0xaddd
 	.uleb128 0xd
-	.4byte	.LASF2324
+	.4byte	.LASF2325
 	.byte	0xd0
 	.byte	0x2
 	.byte	0x7a
-	.4byte	0xaf16
+	.4byte	0xaf2b
 	.uleb128 0xe
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0x2
 	.byte	0x7b
 	.4byte	0x56
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2325
+	.4byte	.LASF2326
 	.byte	0x2
 	.byte	0x7c
 	.4byte	0x56
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2326
+	.4byte	.LASF2327
 	.byte	0x2
 	.byte	0x7d
-	.4byte	0xa55b
+	.4byte	0xa570
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2327
+	.4byte	.LASF2328
 	.byte	0x2
 	.byte	0x7e
-	.4byte	0xaf16
+	.4byte	0xaf2b
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2328
+	.4byte	.LASF2329
 	.byte	0x2
 	.byte	0x7f
-	.4byte	0xaf16
+	.4byte	0xaf2b
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2329
+	.4byte	.LASF2330
 	.byte	0x2
 	.byte	0x80
-	.4byte	0xaf16
+	.4byte	0xaf2b
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2330
+	.4byte	.LASF2331
 	.byte	0x2
 	.byte	0x82
-	.4byte	0xb065
+	.4byte	0xb07a
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2158
+	.4byte	.LASF2159
 	.byte	0x2
 	.byte	0x83
-	.4byte	0xb07f
+	.4byte	0xb094
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2331
+	.4byte	.LASF2332
 	.byte	0x2
 	.byte	0x84
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2332
+	.4byte	.LASF2333
 	.byte	0x2
 	.byte	0x85
-	.4byte	0xa84e
+	.4byte	0xa863
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2333
+	.4byte	.LASF2334
 	.byte	0x2
 	.byte	0x86
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2334
+	.4byte	.LASF2335
 	.byte	0x2
 	.byte	0x87
-	.4byte	0xa84e
+	.4byte	0xa863
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2335
+	.4byte	.LASF2336
 	.byte	0x2
 	.byte	0x89
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2232
+	.4byte	.LASF2233
 	.byte	0x2
 	.byte	0x8a
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2178
+	.4byte	.LASF2179
 	.byte	0x2
 	.byte	0x8c
-	.4byte	0xb099
+	.4byte	0xb0ae
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF2179
+	.4byte	.LASF2180
 	.byte	0x2
 	.byte	0x8d
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2336
+	.4byte	.LASF2337
 	.byte	0x2
 	.byte	0x8f
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF2337
+	.4byte	.LASF2338
 	.byte	0x2
 	.byte	0x91
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x88
 	.uleb128 0x20
 	.string	"pm"
 	.byte	0x2
 	.byte	0x93
-	.4byte	0xb09f
+	.4byte	0xb0b4
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2338
+	.4byte	.LASF2339
 	.byte	0x2
 	.byte	0x95
-	.4byte	0xb0af
+	.4byte	0xb0c4
 	.byte	0x98
 	.uleb128 0x20
 	.string	"p"
 	.byte	0x2
 	.byte	0x97
-	.4byte	0xb0ba
+	.4byte	0xb0cf
 	.byte	0xa0
 	.uleb128 0xe
-	.4byte	.LASF2339
+	.4byte	.LASF2340
 	.byte	0x2
 	.byte	0x98
-	.4byte	0xdfc
+	.4byte	0xe11
 	.byte	0xa8
 	.uleb128 0xe
-	.4byte	.LASF2340
+	.4byte	.LASF2341
 	.byte	0x2
 	.byte	0x9a
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0xa8
 	.uleb128 0xe
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x2
 	.byte	0x9c
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xb0
 	.uleb128 0xe
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x2
 	.byte	0x9d
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xb8
 	.uleb128 0xe
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x2
 	.byte	0x9e
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xc0
 	.uleb128 0xe
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x2
 	.byte	0x9f
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xc8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xaf1c
+	.4byte	0xaf31
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9ebc
+	.4byte	0x9ed1
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xaf36
+	.4byte	0xaf4b
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0xaf36
+	.4byte	0xaf4b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xaf3c
+	.4byte	0xaf51
 	.uleb128 0x1d
-	.4byte	.LASF2341
+	.4byte	.LASF2342
 	.byte	0xa8
 	.byte	0x2
 	.2byte	0x12a
-	.4byte	0xb065
+	.4byte	0xb07a
 	.uleb128 0x1b
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0x2
 	.2byte	0x12b
 	.4byte	0x56
@@ -31719,287 +31706,287 @@ __exitcall_ebc_exit:
 	.string	"bus"
 	.byte	0x2
 	.2byte	0x12c
-	.4byte	0xadc2
+	.4byte	0xadd7
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF97
+	.4byte	.LASF98
 	.byte	0x2
 	.2byte	0x12e
-	.4byte	0x7566
+	.4byte	0x757b
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2342
+	.4byte	.LASF2343
 	.byte	0x2
 	.2byte	0x12f
 	.4byte	0x56
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF2343
+	.4byte	.LASF2344
 	.byte	0x2
 	.2byte	0x131
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2344
+	.4byte	.LASF2345
 	.byte	0x2
 	.2byte	0x132
-	.4byte	0xb126
+	.4byte	0xb13b
 	.byte	0x24
 	.uleb128 0x1b
-	.4byte	.LASF2345
+	.4byte	.LASF2346
 	.byte	0x2
 	.2byte	0x134
-	.4byte	0xb18b
+	.4byte	0xb1a0
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF2346
+	.4byte	.LASF2347
 	.byte	0x2
 	.2byte	0x135
-	.4byte	0xb1d2
+	.4byte	0xb1e7
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF2331
+	.4byte	.LASF2332
 	.byte	0x2
 	.2byte	0x137
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF2332
+	.4byte	.LASF2333
 	.byte	0x2
 	.2byte	0x138
-	.4byte	0xa84e
+	.4byte	0xa863
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF2333
+	.4byte	.LASF2334
 	.byte	0x2
 	.2byte	0x139
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF2334
+	.4byte	.LASF2335
 	.byte	0x2
 	.2byte	0x13a
-	.4byte	0xa84e
+	.4byte	0xa863
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF2178
+	.4byte	.LASF2179
 	.byte	0x2
 	.2byte	0x13b
-	.4byte	0xb099
+	.4byte	0xb0ae
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF2179
+	.4byte	.LASF2180
 	.byte	0x2
 	.2byte	0x13c
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF2228
+	.4byte	.LASF2229
 	.byte	0x2
 	.2byte	0x13d
-	.4byte	0xaf16
+	.4byte	0xaf2b
 	.byte	0x68
 	.uleb128 0x2b
 	.string	"pm"
 	.byte	0x2
 	.2byte	0x13f
-	.4byte	0xb09f
+	.4byte	0xb0b4
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF2347
+	.4byte	.LASF2348
 	.byte	0x2
 	.2byte	0x140
-	.4byte	0xa84e
+	.4byte	0xa863
 	.byte	0x78
 	.uleb128 0x2b
 	.string	"p"
 	.byte	0x2
 	.2byte	0x142
-	.4byte	0xb1dd
+	.4byte	0xb1f2
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x2
 	.2byte	0x144
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x2
 	.2byte	0x145
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x2
 	.2byte	0x146
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x2
 	.2byte	0x147
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xa0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xaf22
+	.4byte	0xaf37
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xb07f
+	.4byte	0xb094
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0xa2c5
+	.4byte	0xa2da
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb06b
+	.4byte	0xb080
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xb099
+	.4byte	0xb0ae
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0xa403
+	.4byte	0xa418
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb085
+	.4byte	0xb09a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa547
+	.4byte	0xa55c
 	.uleb128 0x24
-	.4byte	.LASF2338
+	.4byte	.LASF2339
 	.uleb128 0x3
-	.4byte	0xb0a5
+	.4byte	0xb0ba
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb0aa
+	.4byte	0xb0bf
 	.uleb128 0x24
-	.4byte	.LASF2348
+	.4byte	.LASF2349
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb0b5
+	.4byte	0xb0ca
 	.uleb128 0x1d
-	.4byte	.LASF2349
+	.4byte	.LASF2350
 	.byte	0x30
 	.byte	0x2
 	.2byte	0x249
-	.4byte	0xb11b
+	.4byte	0xb130
 	.uleb128 0x1b
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0x2
 	.2byte	0x24a
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2228
+	.4byte	.LASF2229
 	.byte	0x2
 	.2byte	0x24b
-	.4byte	0xaf16
+	.4byte	0xaf2b
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2158
+	.4byte	.LASF2159
 	.byte	0x2
 	.2byte	0x24c
-	.4byte	0xb07f
+	.4byte	0xb094
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2350
+	.4byte	.LASF2351
 	.byte	0x2
 	.2byte	0x24d
-	.4byte	0xb382
+	.4byte	0xb397
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF112
+	.4byte	.LASF113
 	.byte	0x2
 	.2byte	0x24f
-	.4byte	0xa84e
+	.4byte	0xa863
 	.byte	0x20
 	.uleb128 0x2b
 	.string	"pm"
 	.byte	0x2
 	.2byte	0x251
-	.4byte	0xb09f
+	.4byte	0xb0b4
 	.byte	0x28
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb0c0
+	.4byte	0xb0d5
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb11b
+	.4byte	0xb130
 	.uleb128 0x1f
-	.4byte	.LASF2344
+	.4byte	.LASF2345
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x2
 	.byte	0xf9
-	.4byte	0xb149
+	.4byte	0xb15e
 	.uleb128 0xc
-	.4byte	.LASF2351
+	.4byte	.LASF2352
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2352
+	.4byte	.LASF2353
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2353
+	.4byte	.LASF2354
 	.byte	0x2
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2354
+	.4byte	.LASF2355
 	.byte	0xc8
 	.byte	0x9e
 	.byte	0xf1
-	.4byte	0xb186
+	.4byte	0xb19b
 	.uleb128 0xe
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0x9e
 	.byte	0xf2
-	.4byte	0x8790
+	.4byte	0x87a5
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF192
+	.4byte	.LASF193
 	.byte	0x9e
 	.byte	0xf3
-	.4byte	0x8790
+	.4byte	0x87a5
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2355
+	.4byte	.LASF2356
 	.byte	0x9e
 	.byte	0xf4
-	.4byte	0xb8ce
+	.4byte	0xb8e3
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF793
+	.4byte	.LASF794
 	.byte	0x9e
 	.byte	0xf5
-	.4byte	0x30a7
+	.4byte	0x30bc
 	.byte	0xc0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb149
+	.4byte	0xb15e
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb186
+	.4byte	0xb19b
 	.uleb128 0xd
-	.4byte	.LASF2356
+	.4byte	.LASF2357
 	.byte	0x20
 	.byte	0x9e
 	.byte	0xbf
-	.4byte	0xb1cd
+	.4byte	0xb1e2
 	.uleb128 0x20
 	.string	"id"
 	.byte	0x9e
 	.byte	0xc0
-	.4byte	0xb8be
+	.4byte	0xb8d3
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2203
+	.4byte	.LASF2204
 	.byte	0x9e
 	.byte	0xc1
-	.4byte	0xb8b3
+	.4byte	0xb8c8
 	.byte	0x10
 	.uleb128 0x20
 	.string	"cls"
@@ -32008,452 +31995,452 @@ __exitcall_ebc_exit:
 	.4byte	0xd2
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2357
+	.4byte	.LASF2358
 	.byte	0x9e
 	.byte	0xc3
 	.4byte	0xd2
 	.byte	0x1c
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb191
+	.4byte	0xb1a6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb1cd
+	.4byte	0xb1e2
 	.uleb128 0x24
-	.4byte	.LASF2358
+	.4byte	.LASF2359
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb1d8
+	.4byte	0xb1ed
 	.uleb128 0x1d
-	.4byte	.LASF2227
+	.4byte	.LASF2228
 	.byte	0x98
 	.byte	0x2
 	.2byte	0x1ae
-	.4byte	0xb2e5
+	.4byte	0xb2fa
 	.uleb128 0x1b
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0x2
 	.2byte	0x1af
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF97
+	.4byte	.LASF98
 	.byte	0x2
 	.2byte	0x1b0
-	.4byte	0x7566
+	.4byte	0x757b
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2359
+	.4byte	.LASF2360
 	.byte	0x2
 	.2byte	0x1b2
-	.4byte	0xaf16
+	.4byte	0xaf2b
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2328
+	.4byte	.LASF2329
 	.byte	0x2
 	.2byte	0x1b3
-	.4byte	0xaf16
+	.4byte	0xaf2b
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF2360
+	.4byte	.LASF2361
 	.byte	0x2
 	.2byte	0x1b4
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2361
+	.4byte	.LASF2362
 	.byte	0x2
 	.2byte	0x1b6
-	.4byte	0xb07f
+	.4byte	0xb094
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF2350
+	.4byte	.LASF2351
 	.byte	0x2
 	.2byte	0x1b7
-	.4byte	0xb2ff
+	.4byte	0xb314
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF2362
+	.4byte	.LASF2363
 	.byte	0x2
 	.2byte	0x1b9
-	.4byte	0xb316
+	.4byte	0xb32b
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF2363
+	.4byte	.LASF2364
 	.byte	0x2
 	.2byte	0x1ba
-	.4byte	0xa84e
+	.4byte	0xa863
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF2364
+	.4byte	.LASF2365
 	.byte	0x2
 	.2byte	0x1bc
-	.4byte	0xa83d
+	.4byte	0xa852
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF2365
+	.4byte	.LASF2366
 	.byte	0x2
 	.2byte	0x1be
-	.4byte	0xa17e
+	.4byte	0xa193
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF2150
+	.4byte	.LASF2151
 	.byte	0x2
 	.2byte	0x1bf
-	.4byte	0xb32b
+	.4byte	0xb340
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF2151
+	.4byte	.LASF2152
 	.byte	0x2
 	.2byte	0x1c1
-	.4byte	0xb346
+	.4byte	0xb35b
 	.byte	0x60
 	.uleb128 0x2b
 	.string	"pm"
 	.byte	0x2
 	.2byte	0x1c3
-	.4byte	0xb09f
+	.4byte	0xb0b4
 	.byte	0x68
 	.uleb128 0x2b
 	.string	"p"
 	.byte	0x2
 	.2byte	0x1c5
-	.4byte	0xb0ba
+	.4byte	0xb0cf
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x2
 	.2byte	0x1c7
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x2
 	.2byte	0x1c8
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x2
 	.2byte	0x1c9
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x2
 	.2byte	0x1ca
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x90
 	.byte	0
 	.uleb128 0x14
-	.4byte	0x219
-	.4byte	0xb2f9
+	.4byte	0x21e
+	.4byte	0xb30e
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0xb2f9
+	.4byte	0xb30e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x27a
+	.4byte	0x28f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb2e5
+	.4byte	0xb2fa
 	.uleb128 0x10
-	.4byte	0xb310
+	.4byte	0xb325
 	.uleb128 0x11
-	.4byte	0xb310
+	.4byte	0xb325
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb1e3
+	.4byte	0xb1f8
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb305
+	.4byte	0xb31a
 	.uleb128 0x14
-	.4byte	0x30a7
-	.4byte	0xb32b
+	.4byte	0x30bc
+	.4byte	0xb340
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb31c
+	.4byte	0xb331
 	.uleb128 0x10
-	.4byte	0xb346
+	.4byte	0xb35b
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0x935c
+	.4byte	0x9371
 	.uleb128 0x11
-	.4byte	0x9362
+	.4byte	0x9377
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb331
+	.4byte	0xb346
 	.uleb128 0x15
-	.4byte	.LASF2366
+	.4byte	.LASF2367
 	.byte	0x2
 	.2byte	0x1d2
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.uleb128 0x15
-	.4byte	.LASF2367
+	.4byte	.LASF2368
 	.byte	0x2
 	.2byte	0x1d3
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.uleb128 0x14
-	.4byte	0x219
-	.4byte	0xb382
+	.4byte	0x21e
+	.4byte	0xb397
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0xb2f9
+	.4byte	0xb30e
 	.uleb128 0x11
-	.4byte	0x935c
+	.4byte	0x9371
 	.uleb128 0x11
-	.4byte	0x9362
+	.4byte	0x9377
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb364
+	.4byte	0xb379
 	.uleb128 0x1d
-	.4byte	.LASF2368
+	.4byte	.LASF2369
 	.byte	0x20
 	.byte	0x2
 	.2byte	0x255
-	.4byte	0xb3bd
+	.4byte	0xb3d2
 	.uleb128 0x1b
-	.4byte	.LASF2114
+	.4byte	.LASF2115
 	.byte	0x2
 	.2byte	0x256
-	.4byte	0x9e4e
+	.4byte	0x9e63
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2077
+	.4byte	.LASF2078
 	.byte	0x2
 	.2byte	0x257
-	.4byte	0xb3dc
+	.4byte	0xb3f1
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2141
+	.4byte	.LASF2142
 	.byte	0x2
 	.2byte	0x259
-	.4byte	0xb400
+	.4byte	0xb415
 	.byte	0x18
 	.byte	0
 	.uleb128 0x14
-	.4byte	0x2d9
-	.4byte	0xb3d6
+	.4byte	0x2ee
+	.4byte	0xb3eb
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0xb3d6
+	.4byte	0xb3eb
 	.uleb128 0x11
-	.4byte	0x219
+	.4byte	0x21e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb388
+	.4byte	0xb39d
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb3bd
+	.4byte	0xb3d2
 	.uleb128 0x14
-	.4byte	0x2d9
-	.4byte	0xb400
+	.4byte	0x2ee
+	.4byte	0xb415
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0xb3d6
+	.4byte	0xb3eb
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb3e2
+	.4byte	0xb3f7
 	.uleb128 0x1d
-	.4byte	.LASF2369
+	.4byte	.LASF2370
 	.byte	0x10
 	.byte	0x2
 	.2byte	0x30b
-	.4byte	0xb42e
+	.4byte	0xb443
 	.uleb128 0x1b
-	.4byte	.LASF2370
+	.4byte	.LASF2371
 	.byte	0x2
 	.2byte	0x310
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2371
+	.4byte	.LASF2372
 	.byte	0x2
 	.2byte	0x311
 	.4byte	0x29
 	.byte	0x8
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2372
+	.4byte	.LASF2373
 	.byte	0x38
 	.byte	0x9f
 	.byte	0x15
-	.4byte	0xb48f
+	.4byte	0xb4a4
 	.uleb128 0xe
-	.4byte	.LASF2373
+	.4byte	.LASF2374
 	.byte	0x9f
 	.byte	0x16
-	.4byte	0xb494
+	.4byte	0xb4a9
 	.byte	0
 	.uleb128 0x20
 	.string	"ops"
 	.byte	0x9f
 	.byte	0x17
-	.4byte	0xba49
+	.4byte	0xba5e
 	.byte	0x8
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x9f
 	.byte	0x18
-	.4byte	0xa55b
+	.4byte	0xa570
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x9f
 	.byte	0x1a
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x9f
 	.byte	0x1b
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x9f
 	.byte	0x1c
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x9f
 	.byte	0x1d
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x30
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb42e
+	.4byte	0xb443
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb42e
+	.4byte	0xb443
 	.uleb128 0x1e
-	.4byte	.LASF2374
+	.4byte	.LASF2375
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x2
 	.2byte	0x396
-	.4byte	0xb4c4
+	.4byte	0xb4d9
 	.uleb128 0xc
-	.4byte	.LASF2375
+	.4byte	.LASF2376
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2376
+	.4byte	.LASF2377
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2377
+	.4byte	.LASF2378
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2378
+	.4byte	.LASF2379
 	.byte	0x3
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF2379
+	.4byte	.LASF2380
 	.byte	0x68
 	.byte	0x2
 	.2byte	0x3a8
-	.4byte	0xb554
+	.4byte	0xb569
 	.uleb128 0x1b
-	.4byte	.LASF2380
+	.4byte	.LASF2381
 	.byte	0x2
 	.2byte	0x3a9
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2381
+	.4byte	.LASF2382
 	.byte	0x2
 	.2byte	0x3aa
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2382
+	.4byte	.LASF2383
 	.byte	0x2
 	.2byte	0x3ab
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2383
+	.4byte	.LASF2384
 	.byte	0x2
 	.2byte	0x3ac
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF2384
+	.4byte	.LASF2385
 	.byte	0x2
 	.2byte	0x3ad
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF759
+	.4byte	.LASF760
 	.byte	0x2
 	.2byte	0x3ae
-	.4byte	0xb49a
+	.4byte	0xb4af
 	.byte	0x44
 	.uleb128 0x1b
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0x2
 	.2byte	0x3b0
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0x2
 	.2byte	0x3b1
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0x2
 	.2byte	0x3b2
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0x2
 	.2byte	0x3b3
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x60
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF2385
+	.4byte	.LASF2386
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb554
+	.4byte	0xb569
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xad30
+	.4byte	0xad45
 	.uleb128 0xd
-	.4byte	.LASF2386
+	.4byte	.LASF2387
 	.byte	0xb0
 	.byte	0xa0
 	.byte	0x9f
-	.4byte	0xb661
+	.4byte	0xb676
 	.uleb128 0xe
-	.4byte	.LASF1852
+	.4byte	.LASF1853
 	.byte	0xa0
 	.byte	0xa0
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0xa0
 	.byte	0xa1
 	.4byte	0x56
@@ -32462,610 +32449,610 @@ __exitcall_ebc_exit:
 	.string	"ops"
 	.byte	0xa0
 	.byte	0xa2
-	.4byte	0xbf4e
+	.4byte	0xbf69
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2387
+	.4byte	.LASF2388
 	.byte	0xa0
 	.byte	0xa3
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0xa0
 	.byte	0xa4
 	.4byte	0x6d
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2388
+	.4byte	.LASF2389
 	.byte	0xa0
 	.byte	0xa5
 	.4byte	0x6d
 	.byte	0x2c
 	.uleb128 0xe
-	.4byte	.LASF2222
+	.4byte	.LASF2223
 	.byte	0xa0
 	.byte	0xa8
-	.4byte	0xb494
+	.4byte	0xb4a9
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2389
+	.4byte	.LASF2390
 	.byte	0xa0
 	.byte	0xa9
-	.4byte	0xbd39
+	.4byte	0xbd54
 	.byte	0x38
 	.uleb128 0x20
 	.string	"gc"
 	.byte	0xa0
 	.byte	0xaa
-	.4byte	0xbf59
+	.4byte	0xbf74
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF639
+	.4byte	.LASF640
 	.byte	0xa0
 	.byte	0xac
-	.4byte	0xb661
+	.4byte	0xb676
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0xa0
 	.byte	0xb2
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0xa0
 	.byte	0xb3
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0xa0
 	.byte	0xb4
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0xa0
 	.byte	0xb5
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2390
+	.4byte	.LASF2391
 	.byte	0xa0
 	.byte	0xb8
-	.4byte	0x347
+	.4byte	0x35c
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF2391
+	.4byte	.LASF2392
 	.byte	0xa0
 	.byte	0xb9
 	.4byte	0x6d
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2392
+	.4byte	.LASF2393
 	.byte	0xa0
 	.byte	0xba
 	.4byte	0x6d
 	.byte	0x7c
 	.uleb128 0xe
-	.4byte	.LASF2393
+	.4byte	.LASF2394
 	.byte	0xa0
 	.byte	0xbb
-	.4byte	0x4dc4
+	.4byte	0x4dd9
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF2394
+	.4byte	.LASF2395
 	.byte	0xa0
 	.byte	0xbc
-	.4byte	0x2455
+	.4byte	0x246a
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2395
+	.4byte	.LASF2396
 	.byte	0xa0
 	.byte	0xbd
-	.4byte	0xbf5f
+	.4byte	0xbf7a
 	.byte	0xb0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb565
+	.4byte	0xb57a
 	.uleb128 0x24
-	.4byte	.LASF2396
+	.4byte	.LASF2397
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb667
+	.4byte	0xb67c
 	.uleb128 0xd
-	.4byte	.LASF2397
+	.4byte	.LASF2398
 	.byte	0xc0
 	.byte	0xa
 	.byte	0x84
-	.4byte	0xb79f
+	.4byte	0xb7b4
 	.uleb128 0xe
-	.4byte	.LASF2398
+	.4byte	.LASF2399
 	.byte	0xa
 	.byte	0x85
-	.4byte	0xdc3d
+	.4byte	0xdc58
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2399
+	.4byte	.LASF2400
 	.byte	0xa
 	.byte	0x88
-	.4byte	0xdc62
+	.4byte	0xdc7d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF108
+	.4byte	.LASF109
 	.byte	0xa
 	.byte	0x8b
-	.4byte	0xdc90
+	.4byte	0xdcab
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2400
+	.4byte	.LASF2401
 	.byte	0xa
 	.byte	0x8f
-	.4byte	0xdcc4
+	.4byte	0xdcdf
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2401
+	.4byte	.LASF2402
 	.byte	0xa
 	.byte	0x92
-	.4byte	0xdcf2
+	.4byte	0xdd0d
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2402
+	.4byte	.LASF2403
 	.byte	0xa
 	.byte	0x96
-	.4byte	0xdd17
+	.4byte	0xdd32
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2403
+	.4byte	.LASF2404
 	.byte	0xa
 	.byte	0x9d
-	.4byte	0xdd40
+	.4byte	0xdd5b
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2404
+	.4byte	.LASF2405
 	.byte	0xa
 	.byte	0xa0
-	.4byte	0xdd65
+	.4byte	0xdd80
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2405
+	.4byte	.LASF2406
 	.byte	0xa
 	.byte	0xa4
-	.4byte	0xdd8e
+	.4byte	0xdda9
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2406
+	.4byte	.LASF2407
 	.byte	0xa
 	.byte	0xa7
-	.4byte	0xdd17
+	.4byte	0xdd32
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2407
+	.4byte	.LASF2408
 	.byte	0xa
 	.byte	0xaa
-	.4byte	0xddae
+	.4byte	0xddc9
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2408
+	.4byte	.LASF2409
 	.byte	0xa
 	.byte	0xad
-	.4byte	0xddae
+	.4byte	0xddc9
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2409
+	.4byte	.LASF2410
 	.byte	0xa
 	.byte	0xb0
-	.4byte	0xddce
+	.4byte	0xdde9
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2410
+	.4byte	.LASF2411
 	.byte	0xa
 	.byte	0xb3
-	.4byte	0xddce
+	.4byte	0xdde9
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2411
+	.4byte	.LASF2412
 	.byte	0xa
 	.byte	0xb6
-	.4byte	0xddee
+	.4byte	0xde09
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF2412
+	.4byte	.LASF2413
 	.byte	0xa
 	.byte	0xb8
-	.4byte	0xde08
+	.4byte	0xde23
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2413
+	.4byte	.LASF2414
 	.byte	0xa
 	.byte	0xb9
-	.4byte	0xde22
+	.4byte	0xde3d
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF2414
+	.4byte	.LASF2415
 	.byte	0xa
 	.byte	0xba
-	.4byte	0xde22
+	.4byte	0xde3d
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF2415
+	.4byte	.LASF2416
 	.byte	0xa
 	.byte	0xbb
-	.4byte	0xde4b
+	.4byte	0xde66
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2416
+	.4byte	.LASF2417
 	.byte	0xa
 	.byte	0xbd
-	.4byte	0xde66
+	.4byte	0xde81
 	.byte	0x98
 	.uleb128 0xe
-	.4byte	.LASF129
+	.4byte	.LASF130
 	.byte	0xa
 	.byte	0xc3
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xa0
 	.uleb128 0xe
-	.4byte	.LASF130
+	.4byte	.LASF131
 	.byte	0xa
 	.byte	0xc4
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xa8
 	.uleb128 0xe
-	.4byte	.LASF131
+	.4byte	.LASF132
 	.byte	0xa
 	.byte	0xc5
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xb0
 	.uleb128 0xe
-	.4byte	.LASF132
+	.4byte	.LASF133
 	.byte	0xa
 	.byte	0xc6
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0xb8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb672
+	.4byte	0xb687
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb79f
+	.4byte	0xb7b4
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb406
+	.4byte	0xb41b
 	.uleb128 0x24
-	.4byte	.LASF2417
+	.4byte	.LASF2418
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb7b0
+	.4byte	0xb7c5
 	.uleb128 0x48
 	.string	"cma"
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb7bb
+	.4byte	0xb7d0
 	.uleb128 0x24
-	.4byte	.LASF2418
+	.4byte	.LASF2419
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb7c6
+	.4byte	0xb7db
 	.uleb128 0xd
-	.4byte	.LASF2419
+	.4byte	.LASF2420
 	.byte	0xf0
 	.byte	0xe
 	.byte	0x33
-	.4byte	0xb87a
+	.4byte	0xb88f
 	.uleb128 0xe
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0xe
 	.byte	0x34
 	.4byte	0x56
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF192
+	.4byte	.LASF193
 	.byte	0xe
 	.byte	0x35
 	.4byte	0x56
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2420
+	.4byte	.LASF2421
 	.byte	0xe
 	.byte	0x36
-	.4byte	0xbc4b
+	.4byte	0xbc60
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2421
+	.4byte	.LASF2422
 	.byte	0xe
 	.byte	0x37
 	.4byte	0x56
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2222
+	.4byte	.LASF2223
 	.byte	0xe
 	.byte	0x38
-	.4byte	0xb42e
+	.4byte	0xb443
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2422
+	.4byte	.LASF2423
 	.byte	0xe
 	.byte	0x3a
-	.4byte	0xbc9f
+	.4byte	0xbcb4
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2423
+	.4byte	.LASF2424
 	.byte	0xe
 	.byte	0x3b
-	.4byte	0xbc9f
+	.4byte	0xbcb4
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF639
+	.4byte	.LASF640
 	.byte	0xe
 	.byte	0x3c
-	.4byte	0xb87f
+	.4byte	0xb894
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2033
+	.4byte	.LASF2034
 	.byte	0xe
 	.byte	0x3d
-	.4byte	0xb87f
+	.4byte	0xb894
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF641
+	.4byte	.LASF642
 	.byte	0xe
 	.byte	0x3e
-	.4byte	0xb87f
+	.4byte	0xb894
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2145
+	.4byte	.LASF2146
 	.byte	0xe
 	.byte	0x40
-	.4byte	0x90f2
+	.4byte	0x9107
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF2424
+	.4byte	.LASF2425
 	.byte	0xe
 	.byte	0x42
 	.4byte	0x29
 	.byte	0xe0
 	.uleb128 0xe
-	.4byte	.LASF793
+	.4byte	.LASF794
 	.byte	0xe
 	.byte	0x43
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0xe8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb7d1
+	.4byte	0xb7e6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb7d1
+	.4byte	0xb7e6
 	.uleb128 0x24
-	.4byte	.LASF2229
+	.4byte	.LASF2230
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb885
+	.4byte	0xb89a
 	.uleb128 0x24
-	.4byte	.LASF2230
+	.4byte	.LASF2231
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb890
+	.4byte	0xb8a5
 	.uleb128 0x15
-	.4byte	.LASF2425
+	.4byte	.LASF2426
 	.byte	0x2
 	.2byte	0x590
-	.4byte	0xa83d
+	.4byte	0xa852
 	.uleb128 0x15
-	.4byte	.LASF2426
+	.4byte	.LASF2427
 	.byte	0x2
 	.2byte	0x592
-	.4byte	0xa83d
+	.4byte	0xa852
 	.uleb128 0x8
-	.4byte	.LASF2427
+	.4byte	.LASF2428
 	.byte	0x9e
 	.byte	0xe
 	.4byte	0x29
 	.uleb128 0x5
 	.4byte	0x8b
-	.4byte	0xb8ce
+	.4byte	0xb8e3
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x8
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0xb8de
+	.4byte	0xb8f3
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x7f
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0xb8ee
+	.4byte	0xb903
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x13
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF2428
+	.4byte	.LASF2429
 	.byte	0x20
 	.byte	0x9e
 	.2byte	0x222
-	.4byte	0xb916
+	.4byte	0xb92b
 	.uleb128 0x1b
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0x9e
 	.2byte	0x223
-	.4byte	0xb8de
+	.4byte	0xb8f3
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2203
+	.4byte	.LASF2204
 	.byte	0x9e
 	.2byte	0x224
-	.4byte	0xb8b3
+	.4byte	0xb8c8
 	.byte	0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb8ee
+	.4byte	0xb903
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xb92b
+	.4byte	0xb940
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb91b
+	.4byte	0xb930
 	.uleb128 0x19
-	.4byte	.LASF2429
+	.4byte	.LASF2430
 	.byte	0xa1
 	.byte	0x14
 	.4byte	0xc6
 	.uleb128 0xd
-	.4byte	.LASF2430
+	.4byte	.LASF2431
 	.byte	0x20
 	.byte	0xa1
 	.byte	0x1e
-	.4byte	0xb96c
+	.4byte	0xb981
 	.uleb128 0xe
-	.4byte	.LASF227
+	.4byte	.LASF228
 	.byte	0xa1
 	.byte	0x1f
-	.4byte	0xe1e
+	.4byte	0xe33
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2431
+	.4byte	.LASF2432
 	.byte	0xa1
 	.byte	0x20
-	.4byte	0x351d
+	.4byte	0x3532
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF97
+	.4byte	.LASF98
 	.byte	0xa1
 	.byte	0x21
-	.4byte	0x2ef0
+	.4byte	0x2f05
 	.byte	0x18
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb972
+	.4byte	0xb987
 	.uleb128 0x24
-	.4byte	.LASF2432
-	.uleb128 0xd
 	.4byte	.LASF2433
+	.uleb128 0xd
+	.4byte	.LASF2434
 	.byte	0x80
 	.byte	0x9f
 	.byte	0x75
-	.4byte	0xba44
+	.4byte	0xba59
 	.uleb128 0x20
 	.string	"get"
 	.byte	0x9f
 	.byte	0x76
-	.4byte	0xbad5
+	.4byte	0xbaea
 	.byte	0
 	.uleb128 0x20
 	.string	"put"
 	.byte	0x9f
 	.byte	0x77
-	.4byte	0xbae6
+	.4byte	0xbafb
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2434
+	.4byte	.LASF2435
 	.byte	0x9f
 	.byte	0x78
-	.4byte	0xbafb
+	.4byte	0xbb10
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2435
+	.4byte	.LASF2436
 	.byte	0x9f
 	.byte	0x79
-	.4byte	0xbb1b
+	.4byte	0xbb30
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2436
+	.4byte	.LASF2437
 	.byte	0x9f
 	.byte	0x7b
-	.4byte	0xbb35
+	.4byte	0xbb4a
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2437
+	.4byte	.LASF2438
 	.byte	0x9f
 	.byte	0x7d
-	.4byte	0xbb5e
+	.4byte	0xbb73
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2438
+	.4byte	.LASF2439
 	.byte	0x9f
 	.byte	0x82
-	.4byte	0xbb88
+	.4byte	0xbb9d
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2439
+	.4byte	.LASF2440
 	.byte	0x9f
 	.byte	0x85
-	.4byte	0xbb9d
+	.4byte	0xbbb2
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2440
+	.4byte	.LASF2441
 	.byte	0x9f
 	.byte	0x87
-	.4byte	0xbbb7
+	.4byte	0xbbcc
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2441
+	.4byte	.LASF2442
 	.byte	0x9f
 	.byte	0x8a
-	.4byte	0xbbd1
+	.4byte	0xbbe6
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2442
+	.4byte	.LASF2443
 	.byte	0x9f
 	.byte	0x8c
-	.4byte	0xbc05
+	.4byte	0xbc1a
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2443
+	.4byte	.LASF2444
 	.byte	0x9f
 	.byte	0x91
-	.4byte	0xbbb7
+	.4byte	0xbbcc
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2444
+	.4byte	.LASF2445
 	.byte	0x9f
 	.byte	0x94
-	.4byte	0xbb9d
+	.4byte	0xbbb2
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2445
+	.4byte	.LASF2446
 	.byte	0x9f
 	.byte	0x96
-	.4byte	0xbad5
+	.4byte	0xbaea
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2446
+	.4byte	.LASF2447
 	.byte	0x9f
 	.byte	0x97
-	.4byte	0xbc25
+	.4byte	0xbc3a
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF2447
+	.4byte	.LASF2448
 	.byte	0x9f
 	.byte	0x99
-	.4byte	0xbc3f
+	.4byte	0xbc54
 	.byte	0x78
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb977
+	.4byte	0xb98c
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xba44
+	.4byte	0xba59
 	.uleb128 0xd
-	.4byte	.LASF2448
+	.4byte	.LASF2449
 	.byte	0x10
 	.byte	0x9f
 	.byte	0x26
-	.4byte	0xba7f
+	.4byte	0xba94
 	.uleb128 0xe
-	.4byte	.LASF2449
+	.4byte	.LASF2450
 	.byte	0x9f
 	.byte	0x27
 	.4byte	0x6d
@@ -33077,169 +33064,169 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF2450
+	.4byte	.LASF2451
 	.byte	0x9f
 	.byte	0x29
-	.4byte	0xba7f
+	.4byte	0xba94
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb48f
+	.4byte	0xb4a4
 	.uleb128 0xd
-	.4byte	.LASF2451
+	.4byte	.LASF2452
 	.byte	0x50
 	.byte	0x9f
 	.byte	0x34
-	.4byte	0xbab6
+	.4byte	0xbacb
 	.uleb128 0xe
-	.4byte	.LASF2222
+	.4byte	.LASF2223
 	.byte	0x9f
 	.byte	0x35
-	.4byte	0xb494
+	.4byte	0xb4a9
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2452
+	.4byte	.LASF2453
 	.byte	0x9f
 	.byte	0x36
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1754
+	.4byte	.LASF1755
 	.byte	0x9f
 	.byte	0x37
-	.4byte	0xbab6
+	.4byte	0xbacb
 	.byte	0x10
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x155
-	.4byte	0xbac6
+	.4byte	0x15a
+	.4byte	0xbadb
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x7
 	.byte	0
 	.uleb128 0x14
-	.4byte	0xb494
-	.4byte	0xbad5
+	.4byte	0xb4a9
+	.4byte	0xbaea
 	.uleb128 0x11
-	.4byte	0xb494
+	.4byte	0xb4a9
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbac6
+	.4byte	0xbadb
 	.uleb128 0x10
-	.4byte	0xbae6
+	.4byte	0xbafb
 	.uleb128 0x11
-	.4byte	0xb494
+	.4byte	0xb4a9
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbadb
+	.4byte	0xbaf0
 	.uleb128 0x14
-	.4byte	0x29b
-	.4byte	0xbafb
+	.4byte	0x2b0
+	.4byte	0xbb10
 	.uleb128 0x11
-	.4byte	0xba7f
+	.4byte	0xba94
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbaec
+	.4byte	0xbb01
 	.uleb128 0x14
-	.4byte	0x30a7
-	.4byte	0xbb15
+	.4byte	0x30bc
+	.4byte	0xbb2a
 	.uleb128 0x11
-	.4byte	0xba7f
+	.4byte	0xba94
 	.uleb128 0x11
-	.4byte	0xbb15
+	.4byte	0xbb2a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa838
+	.4byte	0xa84d
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbb01
+	.4byte	0xbb16
 	.uleb128 0x14
-	.4byte	0x29b
-	.4byte	0xbb35
+	.4byte	0x2b0
+	.4byte	0xbb4a
 	.uleb128 0x11
-	.4byte	0xba7f
+	.4byte	0xba94
 	.uleb128 0x11
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbb21
+	.4byte	0xbb36
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbb5e
+	.4byte	0xbb73
 	.uleb128 0x11
-	.4byte	0xba7f
+	.4byte	0xba94
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbb3b
+	.4byte	0xbb50
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbb82
+	.4byte	0xbb97
 	.uleb128 0x11
-	.4byte	0xba7f
+	.4byte	0xba94
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
-	.4byte	0xbb82
+	.4byte	0xbb97
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x56
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbb64
+	.4byte	0xbb79
 	.uleb128 0x14
-	.4byte	0xb494
-	.4byte	0xbb9d
+	.4byte	0xb4a9
+	.4byte	0xbbb2
 	.uleb128 0x11
-	.4byte	0xba7f
+	.4byte	0xba94
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbb8e
+	.4byte	0xbba3
 	.uleb128 0x14
-	.4byte	0xb494
-	.4byte	0xbbb7
+	.4byte	0xb4a9
+	.4byte	0xbbcc
 	.uleb128 0x11
-	.4byte	0xba7f
+	.4byte	0xba94
 	.uleb128 0x11
-	.4byte	0xb494
+	.4byte	0xb4a9
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbba3
+	.4byte	0xbbb8
 	.uleb128 0x14
-	.4byte	0xb494
-	.4byte	0xbbd1
+	.4byte	0xb4a9
+	.4byte	0xbbe6
 	.uleb128 0x11
-	.4byte	0xba7f
+	.4byte	0xba94
 	.uleb128 0x11
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbbbd
+	.4byte	0xbbd2
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbbff
+	.4byte	0xbc14
 	.uleb128 0x11
-	.4byte	0xba7f
+	.4byte	0xba94
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
@@ -33249,348 +33236,351 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
-	.4byte	0xbbff
+	.4byte	0xbc14
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xba85
+	.4byte	0xba9a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbbd7
+	.4byte	0xbbec
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbc1f
+	.4byte	0xbc34
 	.uleb128 0x11
-	.4byte	0xba7f
+	.4byte	0xba94
 	.uleb128 0x11
-	.4byte	0xbc1f
+	.4byte	0xbc34
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xba4f
+	.4byte	0xba64
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbc0b
+	.4byte	0xbc20
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbc3f
+	.4byte	0xbc54
 	.uleb128 0x11
-	.4byte	0xba7f
+	.4byte	0xba94
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbc2b
+	.4byte	0xbc40
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x145
+	.4byte	0x14a
 	.uleb128 0x8
-	.4byte	.LASF2420
+	.4byte	.LASF2421
 	.byte	0xe
 	.byte	0x1c
-	.4byte	0x13a
+	.4byte	0x13f
 	.uleb128 0xd
-	.4byte	.LASF2453
+	.4byte	.LASF2454
 	.byte	0x58
 	.byte	0xe
 	.byte	0x1f
-	.4byte	0xbc9f
+	.4byte	0xbcb4
 	.uleb128 0xe
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0xe
 	.byte	0x20
-	.4byte	0x219
+	.4byte	0x21e
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2454
+	.4byte	.LASF2455
 	.byte	0xe
 	.byte	0x21
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2455
+	.4byte	.LASF2456
 	.byte	0xe
 	.byte	0x22
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF63
+	.4byte	.LASF64
 	.byte	0xe
 	.byte	0x23
-	.4byte	0xbc9f
+	.4byte	0xbcb4
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2114
+	.4byte	.LASF2115
 	.byte	0xe
 	.byte	0x2b
-	.4byte	0x9f05
+	.4byte	0x9f1a
 	.byte	0x20
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbc56
+	.4byte	0xbc6b
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb88f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb87a
+	.4byte	0x23f
 	.uleb128 0x19
-	.4byte	.LASF2456
+	.4byte	.LASF2457
 	.byte	0xe
 	.byte	0x6a
-	.4byte	0xa0cd
+	.4byte	0xa0e2
 	.uleb128 0x19
-	.4byte	.LASF2457
+	.4byte	.LASF2458
 	.byte	0xe
 	.byte	0x6b
-	.4byte	0xba44
+	.4byte	0xba59
 	.uleb128 0x19
-	.4byte	.LASF2458
+	.4byte	.LASF2459
 	.byte	0xe
 	.byte	0x87
-	.4byte	0xb87f
+	.4byte	0xb894
 	.uleb128 0x19
-	.4byte	.LASF2459
+	.4byte	.LASF2460
 	.byte	0xe
 	.byte	0x88
-	.4byte	0xb87f
+	.4byte	0xb894
 	.uleb128 0x19
-	.4byte	.LASF2460
+	.4byte	.LASF2461
 	.byte	0xe
 	.byte	0x89
-	.4byte	0xb87f
+	.4byte	0xb894
 	.uleb128 0x19
-	.4byte	.LASF2461
+	.4byte	.LASF2462
 	.byte	0xe
 	.byte	0x8a
-	.4byte	0xb87f
+	.4byte	0xb894
 	.uleb128 0x19
-	.4byte	.LASF2462
+	.4byte	.LASF2463
 	.byte	0xe
 	.byte	0x8b
-	.4byte	0xe1e
+	.4byte	0xe33
 	.uleb128 0xd
-	.4byte	.LASF2463
+	.4byte	.LASF2464
 	.byte	0x50
 	.byte	0xa0
 	.byte	0x3f
-	.4byte	0xbd29
+	.4byte	0xbd44
 	.uleb128 0xe
-	.4byte	.LASF2222
+	.4byte	.LASF2223
 	.byte	0xa0
 	.byte	0x40
-	.4byte	0xb494
+	.4byte	0xb4a9
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2464
+	.4byte	.LASF2465
 	.byte	0xa0
 	.byte	0x41
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2465
+	.4byte	.LASF2466
 	.byte	0xa0
 	.byte	0x42
-	.4byte	0xbd29
+	.4byte	0xbd44
 	.byte	0xc
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x13a
-	.4byte	0xbd39
+	.4byte	0x13f
+	.4byte	0xbd54
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF2466
+	.4byte	.LASF2467
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xa0
 	.byte	0x4c
-	.4byte	0xbd7a
+	.4byte	0xbd95
 	.uleb128 0xc
-	.4byte	.LASF2467
+	.4byte	.LASF2468
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2468
+	.4byte	.LASF2469
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2469
+	.4byte	.LASF2470
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2470
+	.4byte	.LASF2471
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2471
+	.4byte	.LASF2472
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF2472
+	.4byte	.LASF2473
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF2473
+	.4byte	.LASF2474
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF2474
+	.4byte	.LASF2475
 	.byte	0x7
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2475
+	.4byte	.LASF2476
 	.byte	0x50
 	.byte	0xa0
 	.byte	0x66
-	.4byte	0xbdff
+	.4byte	0xbe1a
 	.uleb128 0xe
-	.4byte	.LASF2330
+	.4byte	.LASF2331
 	.byte	0xa0
 	.byte	0x67
-	.4byte	0xbe1d
+	.4byte	0xbe38
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2476
+	.4byte	.LASF2477
 	.byte	0xa0
 	.byte	0x69
-	.4byte	0xbe42
+	.4byte	0xbe5d
 	.byte	0x8
 	.uleb128 0x20
 	.string	"map"
 	.byte	0xa0
 	.byte	0x6b
-	.4byte	0xbe61
+	.4byte	0xbe7c
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2477
+	.4byte	.LASF2478
 	.byte	0xa0
 	.byte	0x6c
-	.4byte	0xbe77
+	.4byte	0xbe92
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2478
+	.4byte	.LASF2479
 	.byte	0xa0
 	.byte	0x6d
-	.4byte	0xbea5
+	.4byte	0xbec0
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2398
+	.4byte	.LASF2399
 	.byte	0xa0
 	.byte	0x72
-	.4byte	0xbec9
+	.4byte	0xbee4
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2399
+	.4byte	.LASF2400
 	.byte	0xa0
 	.byte	0x74
-	.4byte	0xbee4
+	.4byte	0xbeff
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2317
+	.4byte	.LASF2318
 	.byte	0xa0
 	.byte	0x76
-	.4byte	0xbf03
+	.4byte	0xbf1e
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2479
+	.4byte	.LASF2480
 	.byte	0xa0
 	.byte	0x77
-	.4byte	0xbf19
+	.4byte	0xbf34
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2480
+	.4byte	.LASF2481
 	.byte	0xa0
 	.byte	0x78
-	.4byte	0xbf3d
+	.4byte	0xbf58
 	.byte	0x48
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xbd7a
+	.4byte	0xbd95
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbe1d
+	.4byte	0xbe38
 	.uleb128 0x11
-	.4byte	0xb661
+	.4byte	0xb676
 	.uleb128 0x11
-	.4byte	0xb87f
+	.4byte	0xb894
 	.uleb128 0x11
-	.4byte	0xbd39
+	.4byte	0xbd54
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbe04
+	.4byte	0xbe1f
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbe3c
+	.4byte	0xbe57
 	.uleb128 0x11
-	.4byte	0xb661
+	.4byte	0xb676
 	.uleb128 0x11
-	.4byte	0xbe3c
+	.4byte	0xbe57
 	.uleb128 0x11
-	.4byte	0xbd39
+	.4byte	0xbd54
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbcf8
+	.4byte	0xbd13
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbe23
+	.4byte	0xbe3e
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbe61
+	.4byte	0xbe7c
 	.uleb128 0x11
-	.4byte	0xb661
+	.4byte	0xb676
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
-	.4byte	0x347
+	.4byte	0x35c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbe48
+	.4byte	0xbe63
 	.uleb128 0x10
-	.4byte	0xbe77
+	.4byte	0xbe92
 	.uleb128 0x11
-	.4byte	0xb661
+	.4byte	0xb676
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbe67
+	.4byte	0xbe82
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbea5
+	.4byte	0xbec0
 	.uleb128 0x11
-	.4byte	0xb661
+	.4byte	0xb676
 	.uleb128 0x11
-	.4byte	0xb87f
+	.4byte	0xb894
 	.uleb128 0x11
-	.4byte	0xbc45
+	.4byte	0xbc5a
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
-	.4byte	0x6882
+	.4byte	0x6897
 	.uleb128 0x11
-	.4byte	0x355e
+	.4byte	0x3573
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbe7d
+	.4byte	0xbe98
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbec9
+	.4byte	0xbee4
 	.uleb128 0x11
-	.4byte	0xb661
+	.4byte	0xb676
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbeab
+	.4byte	0xbec6
 	.uleb128 0x10
-	.4byte	0xbee4
+	.4byte	0xbeff
 	.uleb128 0x11
-	.4byte	0xb661
+	.4byte	0xb676
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
@@ -33598,88 +33588,88 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbecf
+	.4byte	0xbeea
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbf03
+	.4byte	0xbf1e
 	.uleb128 0x11
-	.4byte	0xb661
+	.4byte	0xb676
 	.uleb128 0x11
-	.4byte	0xb96c
+	.4byte	0xb981
 	.uleb128 0x11
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbeea
+	.4byte	0xbf05
 	.uleb128 0x10
-	.4byte	0xbf19
+	.4byte	0xbf34
 	.uleb128 0x11
-	.4byte	0xb661
+	.4byte	0xb676
 	.uleb128 0x11
-	.4byte	0xb96c
+	.4byte	0xb981
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbf09
+	.4byte	0xbf24
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbf3d
+	.4byte	0xbf58
 	.uleb128 0x11
-	.4byte	0xb661
+	.4byte	0xb676
 	.uleb128 0x11
-	.4byte	0xbe3c
+	.4byte	0xbe57
 	.uleb128 0x11
-	.4byte	0x6882
+	.4byte	0x6897
 	.uleb128 0x11
-	.4byte	0x355e
+	.4byte	0x3573
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbf1f
+	.4byte	0xbf3a
 	.uleb128 0x19
-	.4byte	.LASF2481
+	.4byte	.LASF2482
 	.byte	0xa0
 	.byte	0x81
-	.4byte	0xbd7a
+	.4byte	0xbd95
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbdff
+	.4byte	0xbe1a
 	.uleb128 0x24
-	.4byte	.LASF2482
+	.4byte	.LASF2483
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbf54
+	.4byte	0xbf6f
 	.uleb128 0x5
 	.4byte	0x6d
-	.4byte	0xbf6e
+	.4byte	0xbf89
 	.uleb128 0x44
 	.4byte	0x4f
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF2483
+	.4byte	.LASF2484
 	.byte	0xa0
 	.2byte	0x121
-	.4byte	0xba44
+	.4byte	0xba59
 	.uleb128 0x15
-	.4byte	.LASF2484
+	.4byte	.LASF2485
 	.byte	0xa0
 	.2byte	0x1a5
-	.4byte	0xbdff
+	.4byte	0xbe1a
 	.uleb128 0xd
-	.4byte	.LASF2485
+	.4byte	.LASF2486
 	.byte	0x10
 	.byte	0xa2
 	.byte	0x45
-	.4byte	0xbfc3
+	.4byte	0xbfde
 	.uleb128 0xe
-	.4byte	.LASF1149
+	.4byte	.LASF1150
 	.byte	0xa2
 	.byte	0x46
 	.4byte	0xa9
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0xa2
 	.byte	0x47
 	.4byte	0xa9
@@ -33694,97 +33684,97 @@ __exitcall_ebc_exit:
 	.string	"buf"
 	.byte	0xa2
 	.byte	0x55
-	.4byte	0xbfc3
+	.4byte	0xbfde
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x8b
 	.uleb128 0x39
-	.4byte	.LASF2486
+	.4byte	.LASF2487
 	.byte	0x22
 	.byte	0xa2
 	.byte	0x87
-	.4byte	0xbff7
+	.4byte	0xc012
 	.uleb128 0x22
-	.4byte	.LASF2487
+	.4byte	.LASF2488
 	.byte	0xa2
 	.byte	0x88
 	.4byte	0x8b
 	.uleb128 0x22
-	.4byte	.LASF2488
+	.4byte	.LASF2489
 	.byte	0xa2
 	.byte	0x89
 	.4byte	0xa9
 	.uleb128 0x22
-	.4byte	.LASF2489
+	.4byte	.LASF2490
 	.byte	0xa2
 	.byte	0x8a
-	.4byte	0xbff7
+	.4byte	0xc012
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x8b
-	.4byte	0xc007
+	.4byte	0xc022
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x21
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2490
+	.4byte	.LASF2491
 	.byte	0xa3
 	.byte	0x27
-	.4byte	0xadc8
+	.4byte	0xaddd
 	.uleb128 0x19
-	.4byte	.LASF2491
+	.4byte	.LASF2492
 	.byte	0xa3
 	.byte	0x28
-	.4byte	0xb0c0
+	.4byte	0xb0d5
 	.uleb128 0x19
-	.4byte	.LASF2492
+	.4byte	.LASF2493
 	.byte	0xa3
 	.byte	0x29
-	.4byte	0xb0c0
+	.4byte	0xb0d5
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc02e
+	.4byte	0xc049
 	.uleb128 0x1a
-	.4byte	.LASF2493
+	.4byte	.LASF2494
 	.2byte	0x3e8
 	.byte	0xa3
 	.2byte	0x148
-	.4byte	0xc0a8
+	.4byte	0xc0c3
 	.uleb128 0x1b
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0xa3
 	.2byte	0x149
 	.4byte	0xb4
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1149
+	.4byte	.LASF1150
 	.byte	0xa3
 	.2byte	0x14a
 	.4byte	0xb4
 	.byte	0x2
 	.uleb128 0x1b
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0xa3
 	.2byte	0x14d
-	.4byte	0xb8de
+	.4byte	0xb8f3
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF2494
+	.4byte	.LASF2495
 	.byte	0xa3
 	.2byte	0x14e
-	.4byte	0xc1b3
+	.4byte	0xc1ce
 	.byte	0x18
 	.uleb128 0x2b
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x14f
-	.4byte	0xa561
+	.4byte	0xa576
 	.byte	0x20
 	.uleb128 0x1c
-	.4byte	.LASF2495
+	.4byte	.LASF2496
 	.byte	0xa3
 	.2byte	0x150
 	.4byte	0xc6
@@ -33796,73 +33786,73 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.2byte	0x3d4
 	.uleb128 0x1c
-	.4byte	.LASF2496
+	.4byte	.LASF2497
 	.byte	0xa3
 	.2byte	0x152
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x3d8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xc02e
+	.4byte	0xc049
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x10b
+	.4byte	0x110
 	.uleb128 0x1a
-	.4byte	.LASF2497
+	.4byte	.LASF2498
 	.2byte	0x4c0
 	.byte	0xa3
 	.2byte	0x2a0
-	.4byte	0xc1b3
+	.4byte	0xc1ce
 	.uleb128 0x1b
-	.4byte	.LASF97
+	.4byte	.LASF98
 	.byte	0xa3
 	.2byte	0x2a1
-	.4byte	0x7566
+	.4byte	0x757b
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2227
+	.4byte	.LASF2228
 	.byte	0xa3
 	.2byte	0x2a2
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2498
+	.4byte	.LASF2499
 	.byte	0xa3
 	.2byte	0x2a3
-	.4byte	0xc40e
+	.4byte	0xc429
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2499
+	.4byte	.LASF2500
 	.byte	0xa3
 	.2byte	0x2a4
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF2500
+	.4byte	.LASF2501
 	.byte	0xa3
 	.2byte	0x2a7
-	.4byte	0xc414
+	.4byte	0xc42f
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2501
+	.4byte	.LASF2502
 	.byte	0xa3
 	.2byte	0x2a8
-	.4byte	0xb93b
+	.4byte	0xb950
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF2502
+	.4byte	.LASF2503
 	.byte	0xa3
 	.2byte	0x2a9
-	.4byte	0xb93b
+	.4byte	0xb950
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1066
+	.4byte	.LASF1067
 	.byte	0xa3
 	.2byte	0x2ab
 	.4byte	0xc6
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF2503
+	.4byte	.LASF2504
 	.byte	0xa3
 	.2byte	0x2ac
 	.4byte	0xc6
@@ -33871,7 +33861,7 @@ __exitcall_ebc_exit:
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x2ad
-	.4byte	0xa561
+	.4byte	0xa576
 	.byte	0x70
 	.uleb128 0x30
 	.string	"nr"
@@ -33880,343 +33870,343 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.2byte	0x420
 	.uleb128 0x1c
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0xa3
 	.2byte	0x2b0
-	.4byte	0xc41a
+	.4byte	0xc435
 	.2byte	0x424
 	.uleb128 0x1c
-	.4byte	.LASF2504
+	.4byte	.LASF2505
 	.byte	0xa3
 	.2byte	0x2b1
-	.4byte	0x463e
+	.4byte	0x4653
 	.2byte	0x458
 	.uleb128 0x1c
-	.4byte	.LASF2505
+	.4byte	.LASF2506
 	.byte	0xa3
 	.2byte	0x2b3
-	.4byte	0x2455
+	.4byte	0x246a
 	.2byte	0x478
 	.uleb128 0x1c
-	.4byte	.LASF2506
+	.4byte	.LASF2507
 	.byte	0xa3
 	.2byte	0x2b4
-	.4byte	0x392
+	.4byte	0x3a7
 	.2byte	0x498
 	.uleb128 0x1c
-	.4byte	.LASF2507
+	.4byte	.LASF2508
 	.byte	0xa3
 	.2byte	0x2b6
-	.4byte	0xc42a
+	.4byte	0xc445
 	.2byte	0x4a8
 	.uleb128 0x1c
-	.4byte	.LASF2508
+	.4byte	.LASF2509
 	.byte	0xa3
 	.2byte	0x2b7
-	.4byte	0xc430
+	.4byte	0xc44b
 	.2byte	0x4b0
 	.uleb128 0x1c
-	.4byte	.LASF2509
+	.4byte	.LASF2510
 	.byte	0xa3
 	.2byte	0x2b9
-	.4byte	0xb661
+	.4byte	0xb676
 	.2byte	0x4b8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc0b3
+	.4byte	0xc0ce
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x97d4
+	.4byte	0x97e9
 	.uleb128 0x1d
-	.4byte	.LASF2510
+	.4byte	.LASF2511
 	.byte	0x18
 	.byte	0xa3
 	.2byte	0x207
-	.4byte	0xc1f4
+	.4byte	0xc20f
 	.uleb128 0x1b
-	.4byte	.LASF2511
+	.4byte	.LASF2512
 	.byte	0xa3
 	.2byte	0x20e
-	.4byte	0xc218
+	.4byte	0xc233
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2512
+	.4byte	.LASF2513
 	.byte	0xa3
 	.2byte	0x210
-	.4byte	0xc251
+	.4byte	0xc26c
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2513
+	.4byte	.LASF2514
 	.byte	0xa3
 	.2byte	0x215
-	.4byte	0xc266
+	.4byte	0xc281
 	.byte	0x10
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xc1bf
+	.4byte	0xc1da
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xc212
+	.4byte	0xc22d
 	.uleb128 0x11
-	.4byte	0xc1b3
+	.4byte	0xc1ce
 	.uleb128 0x11
-	.4byte	0xc212
+	.4byte	0xc22d
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbf86
+	.4byte	0xbfa1
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc1f9
+	.4byte	0xc214
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xc24b
+	.4byte	0xc266
 	.uleb128 0x11
-	.4byte	0xc1b3
+	.4byte	0xc1ce
 	.uleb128 0x11
-	.4byte	0x11a
+	.4byte	0x11f
 	.uleb128 0x11
 	.4byte	0xb4
 	.uleb128 0x11
 	.4byte	0x61
 	.uleb128 0x11
-	.4byte	0x10b
+	.4byte	0x110
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xc24b
+	.4byte	0xc266
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbfc9
+	.4byte	0xbfe4
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc21e
+	.4byte	0xc239
 	.uleb128 0x14
-	.4byte	0x13a
-	.4byte	0xc266
+	.4byte	0x13f
+	.4byte	0xc281
 	.uleb128 0x11
-	.4byte	0xc1b3
+	.4byte	0xc1ce
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc257
+	.4byte	0xc272
 	.uleb128 0x1d
-	.4byte	.LASF2514
+	.4byte	.LASF2515
 	.byte	0x18
 	.byte	0xa3
 	.2byte	0x225
-	.4byte	0xc2a1
+	.4byte	0xc2bc
 	.uleb128 0x1b
-	.4byte	.LASF2515
+	.4byte	.LASF2516
 	.byte	0xa3
 	.2byte	0x226
-	.4byte	0xc2b6
+	.4byte	0xc2d1
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2516
+	.4byte	.LASF2517
 	.byte	0xa3
 	.2byte	0x227
-	.4byte	0xc2d0
+	.4byte	0xc2eb
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2517
+	.4byte	.LASF2518
 	.byte	0xa3
 	.2byte	0x228
-	.4byte	0xc2b6
+	.4byte	0xc2d1
 	.byte	0x10
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xc26c
+	.4byte	0xc287
 	.uleb128 0x10
-	.4byte	0xc2b6
+	.4byte	0xc2d1
 	.uleb128 0x11
-	.4byte	0xc1b3
+	.4byte	0xc1ce
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc2a6
+	.4byte	0xc2c1
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xc2d0
+	.4byte	0xc2eb
 	.uleb128 0x11
-	.4byte	0xc1b3
+	.4byte	0xc1ce
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc2bc
+	.4byte	0xc2d7
 	.uleb128 0x1d
-	.4byte	.LASF2518
+	.4byte	.LASF2519
 	.byte	0x50
 	.byte	0xa3
 	.2byte	0x254
-	.4byte	0xc366
+	.4byte	0xc381
 	.uleb128 0x1b
-	.4byte	.LASF2519
+	.4byte	.LASF2520
 	.byte	0xa3
 	.2byte	0x255
-	.4byte	0xc375
+	.4byte	0xc390
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2520
+	.4byte	.LASF2521
 	.byte	0xa3
 	.2byte	0x257
-	.4byte	0xc375
+	.4byte	0xc390
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2521
+	.4byte	.LASF2522
 	.byte	0xa3
 	.2byte	0x258
-	.4byte	0xc38b
+	.4byte	0xc3a6
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2522
+	.4byte	.LASF2523
 	.byte	0xa3
 	.2byte	0x259
-	.4byte	0xc375
+	.4byte	0xc390
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF2523
+	.4byte	.LASF2524
 	.byte	0xa3
 	.2byte	0x25a
-	.4byte	0xc38b
+	.4byte	0xc3a6
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2524
+	.4byte	.LASF2525
 	.byte	0xa3
 	.2byte	0x25b
-	.4byte	0xc375
+	.4byte	0xc390
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF2525
+	.4byte	.LASF2526
 	.byte	0xa3
 	.2byte	0x25d
-	.4byte	0xc39c
+	.4byte	0xc3b7
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF2526
+	.4byte	.LASF2527
 	.byte	0xa3
 	.2byte	0x25e
-	.4byte	0xc39c
+	.4byte	0xc3b7
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF2527
+	.4byte	.LASF2528
 	.byte	0xa3
 	.2byte	0x261
-	.4byte	0xc3a7
+	.4byte	0xc3c2
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF2528
+	.4byte	.LASF2529
 	.byte	0xa3
 	.2byte	0x262
-	.4byte	0xc3a7
+	.4byte	0xc3c2
 	.byte	0x48
 	.byte	0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xc375
+	.4byte	0xc390
 	.uleb128 0x11
-	.4byte	0xc1b3
+	.4byte	0xc1ce
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc366
+	.4byte	0xc381
 	.uleb128 0x10
-	.4byte	0xc38b
+	.4byte	0xc3a6
 	.uleb128 0x11
-	.4byte	0xc1b3
+	.4byte	0xc1ce
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc37b
+	.4byte	0xc396
 	.uleb128 0x10
-	.4byte	0xc39c
+	.4byte	0xc3b7
 	.uleb128 0x11
-	.4byte	0xc1b3
+	.4byte	0xc1ce
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc391
+	.4byte	0xc3ac
 	.uleb128 0x24
-	.4byte	.LASF2529
+	.4byte	.LASF2530
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc3a2
+	.4byte	0xc3bd
 	.uleb128 0x1d
-	.4byte	.LASF2530
+	.4byte	.LASF2531
 	.byte	0x18
 	.byte	0xa3
 	.2byte	0x27f
-	.4byte	0xc409
+	.4byte	0xc424
 	.uleb128 0x1b
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0xa3
 	.2byte	0x280
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2531
+	.4byte	.LASF2532
 	.byte	0xa3
 	.2byte	0x281
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2532
+	.4byte	.LASF2533
 	.byte	0xa3
 	.2byte	0x282
-	.4byte	0x11a
+	.4byte	0x11f
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF2533
+	.4byte	.LASF2534
 	.byte	0xa3
 	.2byte	0x283
-	.4byte	0x11a
+	.4byte	0x11f
 	.byte	0xe
 	.uleb128 0x1b
-	.4byte	.LASF2534
+	.4byte	.LASF2535
 	.byte	0xa3
 	.2byte	0x284
-	.4byte	0x11a
+	.4byte	0x11f
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2535
+	.4byte	.LASF2536
 	.byte	0xa3
 	.2byte	0x285
-	.4byte	0x11a
+	.4byte	0x11f
 	.byte	0x12
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xc3ad
+	.4byte	0xc3c8
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc1f4
+	.4byte	0xc20f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc2a1
+	.4byte	0xc2bc
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0xc42a
+	.4byte	0xc445
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc2d6
+	.4byte	0xc2f1
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc409
+	.4byte	0xc424
 	.uleb128 0x19
-	.4byte	.LASF2536
+	.4byte	.LASF2537
 	.byte	0xa4
 	.byte	0x8
 	.4byte	0xc6
@@ -34224,314 +34214,314 @@ __exitcall_ebc_exit:
 	.byte	0x40
 	.byte	0xa5
 	.byte	0x1d
-	.4byte	0xc462
+	.4byte	0xc47d
 	.uleb128 0xe
-	.4byte	.LASF2537
+	.4byte	.LASF2538
 	.byte	0xa5
 	.byte	0x1e
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2538
+	.4byte	.LASF2539
 	.byte	0xa5
 	.byte	0x1f
-	.4byte	0xc462
+	.4byte	0xc47d
 	.byte	0x4
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x6d
-	.4byte	0xc472
+	.4byte	0xc48d
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x6
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF2539
+	.4byte	.LASF2540
 	.byte	0xa5
 	.byte	0x20
-	.4byte	0xc441
+	.4byte	0xc45c
 	.uleb128 0x19
-	.4byte	.LASF2540
+	.4byte	.LASF2541
 	.byte	0xa6
 	.byte	0x15
-	.4byte	0xc472
+	.4byte	0xc48d
 	.uleb128 0xd
-	.4byte	.LASF2541
+	.4byte	.LASF2542
 	.byte	0x8
 	.byte	0xa5
 	.byte	0x2c
-	.4byte	0xc4a1
+	.4byte	0xc4bc
 	.uleb128 0x20
 	.string	"hcr"
 	.byte	0xa5
 	.byte	0x2d
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2542
+	.4byte	.LASF2543
 	.byte	0xa5
 	.byte	0x30
-	.4byte	0xc488
+	.4byte	0xc4a3
 	.uleb128 0x15
-	.4byte	.LASF2543
+	.4byte	.LASF2544
 	.byte	0xa7
 	.2byte	0x102
-	.4byte	0x1615
+	.4byte	0x162a
 	.uleb128 0x15
-	.4byte	.LASF2544
+	.4byte	.LASF2545
 	.byte	0xa7
 	.2byte	0x1ae
-	.4byte	0x29b
+	.4byte	0x2b0
 	.uleb128 0x49
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xa7
 	.2byte	0x1d0
-	.4byte	0xc514
+	.4byte	0xc52f
 	.uleb128 0xc
-	.4byte	.LASF2545
+	.4byte	.LASF2546
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2546
+	.4byte	.LASF2547
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2547
+	.4byte	.LASF2548
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2548
+	.4byte	.LASF2549
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2549
+	.4byte	.LASF2550
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF2550
+	.4byte	.LASF2551
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF2551
+	.4byte	.LASF2552
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF2552
+	.4byte	.LASF2553
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF2553
+	.4byte	.LASF2554
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF2554
+	.4byte	.LASF2555
 	.byte	0x9
 	.uleb128 0xc
-	.4byte	.LASF2555
+	.4byte	.LASF2556
 	.byte	0xa
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x5c
-	.4byte	0xc524
+	.4byte	0xc53f
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x9
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xc514
+	.4byte	0xc52f
 	.uleb128 0x15
-	.4byte	.LASF2556
+	.4byte	.LASF2557
 	.byte	0xa7
 	.2byte	0x1e5
-	.4byte	0xc524
+	.4byte	0xc53f
 	.uleb128 0x15
-	.4byte	.LASF2557
+	.4byte	.LASF2558
 	.byte	0xa7
 	.2byte	0x203
-	.4byte	0x2ef0
+	.4byte	0x2f05
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0xc552
+	.4byte	0xc56d
 	.uleb128 0x43
 	.4byte	0x4f
 	.2byte	0x1ff
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2558
+	.4byte	.LASF2559
 	.byte	0xa8
 	.byte	0x39
-	.4byte	0xc541
+	.4byte	0xc55c
 	.uleb128 0x5
-	.4byte	0x33fe
-	.4byte	0xc56e
+	.4byte	0x3413
+	.4byte	0xc589
 	.uleb128 0x43
 	.4byte	0x4f
 	.2byte	0x1ff
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF2559
+	.4byte	.LASF2560
 	.byte	0xa8
 	.2byte	0x2bd
-	.4byte	0xc55d
+	.4byte	0xc578
 	.uleb128 0x5
-	.4byte	0x33fe
-	.4byte	0xc585
+	.4byte	0x3413
+	.4byte	0xc5a0
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF2560
+	.4byte	.LASF2561
 	.byte	0xa8
 	.2byte	0x2be
-	.4byte	0xc57a
+	.4byte	0xc595
 	.uleb128 0x15
-	.4byte	.LASF2561
+	.4byte	.LASF2562
 	.byte	0xa8
 	.2byte	0x2bf
-	.4byte	0xc55d
+	.4byte	0xc578
 	.uleb128 0x15
-	.4byte	.LASF2562
+	.4byte	.LASF2563
 	.byte	0xa8
 	.2byte	0x2c0
-	.4byte	0xc55d
+	.4byte	0xc578
 	.uleb128 0x19
-	.4byte	.LASF2563
+	.4byte	.LASF2564
 	.byte	0xa9
 	.byte	0x1e
-	.4byte	0x2ef
+	.4byte	0x304
 	.uleb128 0x19
-	.4byte	.LASF2564
+	.4byte	.LASF2565
 	.byte	0x6d
 	.byte	0xb0
-	.4byte	0x392
+	.4byte	0x3a7
 	.uleb128 0xb
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xaa
 	.byte	0x9d
-	.4byte	0xc5ea
+	.4byte	0xc605
 	.uleb128 0xc
-	.4byte	.LASF2565
+	.4byte	.LASF2566
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2566
+	.4byte	.LASF2567
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2567
+	.4byte	.LASF2568
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF2568
+	.4byte	.LASF2569
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF2569
+	.4byte	.LASF2570
 	.byte	0x10
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2570
+	.4byte	.LASF2571
 	.byte	0xab
 	.byte	0x45
-	.4byte	0x2ef0
+	.4byte	0x2f05
 	.uleb128 0xd
-	.4byte	.LASF2571
+	.4byte	.LASF2572
 	.byte	0x50
 	.byte	0xac
 	.byte	0x42
-	.4byte	0xc66e
+	.4byte	0xc689
 	.uleb128 0xe
-	.4byte	.LASF2572
+	.4byte	.LASF2573
 	.byte	0xac
 	.byte	0x43
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0xac
 	.byte	0x44
 	.4byte	0x56
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2573
+	.4byte	.LASF2574
 	.byte	0xac
 	.byte	0x45
-	.4byte	0x7db1
+	.4byte	0x7dc6
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF961
+	.4byte	.LASF962
 	.byte	0xac
 	.byte	0x46
-	.4byte	0x392
+	.4byte	0x3a7
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF639
+	.4byte	.LASF640
 	.byte	0xac
 	.byte	0x47
-	.4byte	0xa55b
+	.4byte	0xa570
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2574
+	.4byte	.LASF2575
 	.byte	0xac
 	.byte	0x48
-	.4byte	0xa55b
+	.4byte	0xa570
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2228
+	.4byte	.LASF2229
 	.byte	0xac
 	.byte	0x49
-	.4byte	0xaf16
+	.4byte	0xaf2b
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2575
+	.4byte	.LASF2576
 	.byte	0xac
 	.byte	0x4a
 	.4byte	0x56
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF903
+	.4byte	.LASF904
 	.byte	0xac
 	.byte	0x4b
-	.4byte	0x27a
+	.4byte	0x28f
 	.byte	0x48
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF2576
+	.4byte	.LASF2577
 	.byte	0xad
 	.byte	0x3c
-	.4byte	0xc679
+	.4byte	0xc694
 	.uleb128 0x10
-	.4byte	0xc684
+	.4byte	0xc69f
 	.uleb128 0x11
-	.4byte	0xc684
+	.4byte	0xc69f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc68a
+	.4byte	0xc6a5
 	.uleb128 0xd
-	.4byte	.LASF2577
+	.4byte	.LASF2578
 	.byte	0x38
 	.byte	0xad
 	.byte	0x58
-	.4byte	0xc6e2
+	.4byte	0xc6fd
 	.uleb128 0xe
-	.4byte	.LASF382
+	.4byte	.LASF383
 	.byte	0xad
 	.byte	0x59
-	.4byte	0x543
+	.4byte	0x558
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2578
+	.4byte	.LASF2579
 	.byte	0xad
 	.byte	0x5e
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF112
+	.4byte	.LASF113
 	.byte	0xad
 	.byte	0x5f
-	.4byte	0xc6e2
+	.4byte	0xc6fd
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2579
+	.4byte	.LASF2580
 	.byte	0xad
 	.byte	0x60
-	.4byte	0xc6e2
+	.4byte	0xc6fd
 	.byte	0x18
 	.uleb128 0x38
-	.4byte	.LASF2580
+	.4byte	.LASF2581
 	.byte	0xad
 	.byte	0x61
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x1
 	.byte	0x1
 	.byte	0x7
@@ -34540,76 +34530,76 @@ __exitcall_ebc_exit:
 	.string	"rcu"
 	.byte	0xad
 	.byte	0x62
-	.4byte	0x407
+	.4byte	0x41c
 	.byte	0x28
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc66e
+	.4byte	0xc689
 	.uleb128 0xd
-	.4byte	.LASF2581
+	.4byte	.LASF2582
 	.byte	0x20
 	.byte	0xae
 	.byte	0xa
-	.4byte	0xc725
+	.4byte	0xc740
 	.uleb128 0xe
-	.4byte	.LASF883
+	.4byte	.LASF884
 	.byte	0xae
 	.byte	0xb
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF986
+	.4byte	.LASF987
 	.byte	0xae
 	.byte	0xc
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2582
+	.4byte	.LASF2583
 	.byte	0xae
 	.byte	0xd
-	.4byte	0x9e1d
+	.4byte	0x9e32
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1742
+	.4byte	.LASF1743
 	.byte	0xae
 	.byte	0xe
-	.4byte	0x4a2
+	.4byte	0x4b7
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2583
+	.4byte	.LASF2584
 	.byte	0x18
 	.byte	0xaf
 	.byte	0x18
-	.4byte	0xc756
+	.4byte	0xc771
 	.uleb128 0xe
-	.4byte	.LASF70
+	.4byte	.LASF71
 	.byte	0xaf
 	.byte	0x19
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF793
+	.4byte	.LASF794
 	.byte	0xaf
 	.byte	0x1a
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF589
+	.4byte	.LASF590
 	.byte	0xaf
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2584
+	.4byte	.LASF2585
 	.byte	0x30
 	.byte	0xaf
 	.byte	0x1e
-	.4byte	0xc79f
+	.4byte	0xc7ba
 	.uleb128 0xe
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0xaf
 	.byte	0x1f
 	.4byte	0x56
@@ -34618,342 +34608,342 @@ __exitcall_ebc_exit:
 	.string	"key"
 	.byte	0xaf
 	.byte	0x20
-	.4byte	0xef2
+	.4byte	0xf07
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2585
+	.4byte	.LASF2586
 	.byte	0xaf
 	.byte	0x21
-	.4byte	0x48c
+	.4byte	0x4a1
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2586
+	.4byte	.LASF2587
 	.byte	0xaf
 	.byte	0x22
-	.4byte	0x4a2
+	.4byte	0x4b7
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2587
+	.4byte	.LASF2588
 	.byte	0xaf
 	.byte	0x23
-	.4byte	0xc79f
+	.4byte	0xc7ba
 	.byte	0x28
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc725
+	.4byte	0xc740
 	.uleb128 0x8
-	.4byte	.LASF2588
+	.4byte	.LASF2589
 	.byte	0xaf
 	.byte	0x27
 	.4byte	0xcd
 	.uleb128 0x19
-	.4byte	.LASF2589
+	.4byte	.LASF2590
 	.byte	0xb0
 	.byte	0xa
-	.4byte	0xc756
+	.4byte	0xc771
 	.uleb128 0x19
-	.4byte	.LASF2590
+	.4byte	.LASF2591
 	.byte	0xb0
 	.byte	0xb
-	.4byte	0xc756
+	.4byte	0xc771
 	.uleb128 0x19
-	.4byte	.LASF2591
+	.4byte	.LASF2592
 	.byte	0xb0
 	.byte	0xc
-	.4byte	0xc756
+	.4byte	0xc771
 	.uleb128 0x19
-	.4byte	.LASF2592
+	.4byte	.LASF2593
 	.byte	0xb0
 	.byte	0xd
-	.4byte	0xc756
+	.4byte	0xc771
 	.uleb128 0x19
-	.4byte	.LASF2593
+	.4byte	.LASF2594
 	.byte	0xb0
 	.byte	0xe
-	.4byte	0xc756
+	.4byte	0xc771
 	.uleb128 0x19
-	.4byte	.LASF2594
+	.4byte	.LASF2595
 	.byte	0xb0
 	.byte	0xf
-	.4byte	0xc756
+	.4byte	0xc771
 	.uleb128 0x19
-	.4byte	.LASF2595
+	.4byte	.LASF2596
 	.byte	0xb0
 	.byte	0x10
-	.4byte	0xc756
+	.4byte	0xc771
 	.uleb128 0xd
-	.4byte	.LASF2596
+	.4byte	.LASF2597
 	.byte	0x28
 	.byte	0x75
 	.byte	0x14
-	.4byte	0xc846
+	.4byte	0xc861
 	.uleb128 0xe
-	.4byte	.LASF2597
+	.4byte	.LASF2598
 	.byte	0x75
 	.byte	0x15
 	.4byte	0x30
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2598
+	.4byte	.LASF2599
 	.byte	0x75
 	.byte	0x16
 	.4byte	0x30
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2399
+	.4byte	.LASF2400
 	.byte	0x75
 	.byte	0x17
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2599
+	.4byte	.LASF2600
 	.byte	0x75
 	.byte	0x18
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2398
+	.4byte	.LASF2399
 	.byte	0x75
 	.byte	0x19
 	.4byte	0x29
 	.byte	0x20
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF2600
+	.4byte	.LASF2601
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x75
 	.byte	0x39
-	.4byte	0xc869
+	.4byte	0xc884
 	.uleb128 0xc
-	.4byte	.LASF2601
+	.4byte	.LASF2602
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2602
+	.4byte	.LASF2603
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2603
+	.4byte	.LASF2604
 	.byte	0x3
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF2604
+	.4byte	.LASF2605
 	.byte	0x75
 	.byte	0x5f
-	.4byte	0xc874
+	.4byte	0xc88f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc87a
+	.4byte	0xc895
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xc89d
+	.4byte	0xc8b8
 	.uleb128 0x11
-	.4byte	0x3ca0
+	.4byte	0x3cb5
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
-	.4byte	0xc89d
+	.4byte	0xc8b8
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
-	.4byte	0xc8a3
+	.4byte	0xc8be
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3497
+	.4byte	0x34ac
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x33de
+	.4byte	0x33f3
 	.uleb128 0x8
-	.4byte	.LASF2605
+	.4byte	.LASF2606
 	.byte	0x75
 	.byte	0x64
-	.4byte	0xc8b4
+	.4byte	0xc8cf
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc8ba
+	.4byte	0xc8d5
 	.uleb128 0x10
-	.4byte	0xc8ca
+	.4byte	0xc8e5
 	.uleb128 0x11
-	.4byte	0x3454
+	.4byte	0x3469
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc679
+	.4byte	0xc694
 	.uleb128 0x19
-	.4byte	.LASF2606
+	.4byte	.LASF2607
 	.byte	0x76
 	.byte	0x2a
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF2607
+	.4byte	.LASF2608
 	.byte	0x76
 	.byte	0x34
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF2608
+	.4byte	.LASF2609
 	.byte	0x76
 	.byte	0x35
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x19
-	.4byte	.LASF2609
+	.4byte	.LASF2610
 	.byte	0x76
 	.byte	0x36
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF2610
+	.4byte	.LASF2611
 	.byte	0x76
 	.byte	0x39
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF2611
+	.4byte	.LASF2612
 	.byte	0x76
 	.byte	0x3f
 	.4byte	0xcd
 	.uleb128 0x19
-	.4byte	.LASF2612
+	.4byte	.LASF2613
 	.byte	0x76
 	.byte	0x40
 	.4byte	0xcd
 	.uleb128 0x19
-	.4byte	.LASF2613
+	.4byte	.LASF2614
 	.byte	0x76
 	.byte	0x41
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF2614
+	.4byte	.LASF2615
 	.byte	0x76
 	.byte	0x44
 	.4byte	0xcd
 	.uleb128 0x19
-	.4byte	.LASF2615
+	.4byte	.LASF2616
 	.byte	0x76
 	.byte	0x45
 	.4byte	0xcd
 	.uleb128 0x19
-	.4byte	.LASF2616
+	.4byte	.LASF2617
 	.byte	0x76
 	.byte	0x46
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF2617
+	.4byte	.LASF2618
 	.byte	0x76
 	.byte	0x8b
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF2618
+	.4byte	.LASF2619
 	.byte	0x76
 	.byte	0x8d
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF2619
+	.4byte	.LASF2620
 	.byte	0x76
 	.byte	0x8e
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF2620
+	.4byte	.LASF2621
 	.byte	0x76
 	.byte	0x90
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF2621
+	.4byte	.LASF2622
 	.byte	0x76
 	.byte	0x91
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF2622
+	.4byte	.LASF2623
 	.byte	0x76
 	.byte	0x92
 	.4byte	0x29
 	.uleb128 0x5
-	.4byte	0x341e
-	.4byte	0xc99b
+	.4byte	0x3433
+	.4byte	0xc9b6
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF2623
+	.4byte	.LASF2624
 	.byte	0x76
 	.2byte	0x142
-	.4byte	0xc98b
+	.4byte	0xc9a6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x343e
+	.4byte	0x3453
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x33be
+	.4byte	0x33d3
 	.uleb128 0x1e
-	.4byte	.LASF2624
+	.4byte	.LASF2625
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x76
 	.2byte	0x18a
-	.4byte	0xc9d7
+	.4byte	0xc9f2
 	.uleb128 0xc
-	.4byte	.LASF2625
+	.4byte	.LASF2626
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2626
+	.4byte	.LASF2627
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2627
+	.4byte	.LASF2628
 	.byte	0x2
 	.byte	0
 	.uleb128 0x10
-	.4byte	0xc9e2
+	.4byte	0xc9fd
 	.uleb128 0x11
-	.4byte	0x3ca0
+	.4byte	0x3cb5
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc9d7
+	.4byte	0xc9f2
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xc9fc
+	.4byte	0xca17
 	.uleb128 0x11
-	.4byte	0x3ca0
+	.4byte	0x3cb5
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc9e8
+	.4byte	0xca03
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xca11
+	.4byte	0xca2c
 	.uleb128 0x11
-	.4byte	0x3ca0
+	.4byte	0x3cb5
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xca02
+	.4byte	0xca1d
 	.uleb128 0x14
-	.4byte	0x5018
-	.4byte	0xca26
+	.4byte	0x502d
+	.4byte	0xca41
 	.uleb128 0x11
-	.4byte	0x5a48
+	.4byte	0x5a5d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xca17
+	.4byte	0xca32
 	.uleb128 0x14
-	.4byte	0x5018
-	.4byte	0xca40
+	.4byte	0x502d
+	.4byte	0xca5b
 	.uleb128 0x11
-	.4byte	0x5a48
+	.4byte	0x5a5d
 	.uleb128 0x11
-	.4byte	0xc9b3
+	.4byte	0xc9ce
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xca2c
+	.4byte	0xca47
 	.uleb128 0x10
-	.4byte	0xca5b
+	.4byte	0xca76
 	.uleb128 0x11
-	.4byte	0x5a48
+	.4byte	0x5a5d
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
@@ -34961,25 +34951,25 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xca46
+	.4byte	0xca61
 	.uleb128 0x14
 	.4byte	0x29
-	.4byte	0xca70
+	.4byte	0xca8b
 	.uleb128 0x11
-	.4byte	0x3ca0
+	.4byte	0x3cb5
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xca61
+	.4byte	0xca7c
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xca99
+	.4byte	0xcab4
 	.uleb128 0x11
-	.4byte	0x3ca0
+	.4byte	0x3cb5
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -34987,571 +34977,571 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xca76
+	.4byte	0xca91
 	.uleb128 0x14
 	.4byte	0x56
-	.4byte	0xcaae
+	.4byte	0xcac9
 	.uleb128 0x11
-	.4byte	0x3ca0
+	.4byte	0x3cb5
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xca9f
+	.4byte	0xcaba
 	.uleb128 0x14
-	.4byte	0x3454
-	.4byte	0xcac8
+	.4byte	0x3469
+	.4byte	0xcae3
 	.uleb128 0x11
-	.4byte	0x3ca0
+	.4byte	0x3cb5
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xcab4
+	.4byte	0xcacf
 	.uleb128 0x19
-	.4byte	.LASF2628
+	.4byte	.LASF2629
 	.byte	0xb1
 	.byte	0x4c
-	.4byte	0xa2d6
+	.4byte	0xa2eb
 	.uleb128 0x13
-	.4byte	.LASF2629
+	.4byte	.LASF2630
 	.byte	0x76
 	.2byte	0x2ba
-	.4byte	0x78e3
+	.4byte	0x78f8
 	.uleb128 0x5
-	.4byte	0xcafb
-	.4byte	0xcaf0
+	.4byte	0xcb16
+	.4byte	0xcb0b
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xcae5
+	.4byte	0xcb00
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xcad9
+	.4byte	0xcaf4
 	.uleb128 0x3
-	.4byte	0xcaf5
+	.4byte	0xcb10
 	.uleb128 0x15
-	.4byte	.LASF2630
+	.4byte	.LASF2631
 	.byte	0x76
 	.2byte	0x2c8
-	.4byte	0xcaf0
+	.4byte	0xcb0b
 	.uleb128 0x1f
-	.4byte	.LASF2631
+	.4byte	.LASF2632
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xb2
 	.byte	0x19
-	.4byte	0xcc79
+	.4byte	0xcc94
 	.uleb128 0xc
-	.4byte	.LASF2632
+	.4byte	.LASF2633
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2633
+	.4byte	.LASF2634
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2634
+	.4byte	.LASF2635
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2635
+	.4byte	.LASF2636
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2636
+	.4byte	.LASF2637
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF2637
+	.4byte	.LASF2638
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF2638
+	.4byte	.LASF2639
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF2639
+	.4byte	.LASF2640
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF2640
+	.4byte	.LASF2641
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF2641
+	.4byte	.LASF2642
 	.byte	0x9
 	.uleb128 0xc
-	.4byte	.LASF2642
+	.4byte	.LASF2643
 	.byte	0xa
 	.uleb128 0xc
-	.4byte	.LASF2643
+	.4byte	.LASF2644
 	.byte	0xb
 	.uleb128 0xc
-	.4byte	.LASF2644
+	.4byte	.LASF2645
 	.byte	0xc
 	.uleb128 0xc
-	.4byte	.LASF2645
+	.4byte	.LASF2646
 	.byte	0xd
 	.uleb128 0xc
-	.4byte	.LASF2646
+	.4byte	.LASF2647
 	.byte	0xe
 	.uleb128 0xc
-	.4byte	.LASF2647
+	.4byte	.LASF2648
 	.byte	0xf
 	.uleb128 0xc
-	.4byte	.LASF2648
+	.4byte	.LASF2649
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF2649
+	.4byte	.LASF2650
 	.byte	0x11
 	.uleb128 0xc
-	.4byte	.LASF2650
+	.4byte	.LASF2651
 	.byte	0x12
 	.uleb128 0xc
-	.4byte	.LASF2651
+	.4byte	.LASF2652
 	.byte	0x13
 	.uleb128 0xc
-	.4byte	.LASF2652
+	.4byte	.LASF2653
 	.byte	0x14
 	.uleb128 0xc
-	.4byte	.LASF2653
+	.4byte	.LASF2654
 	.byte	0x15
 	.uleb128 0xc
-	.4byte	.LASF2654
+	.4byte	.LASF2655
 	.byte	0x16
 	.uleb128 0xc
-	.4byte	.LASF2655
+	.4byte	.LASF2656
 	.byte	0x17
 	.uleb128 0xc
-	.4byte	.LASF2656
+	.4byte	.LASF2657
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF2657
+	.4byte	.LASF2658
 	.byte	0x19
 	.uleb128 0xc
-	.4byte	.LASF2658
+	.4byte	.LASF2659
 	.byte	0x1a
 	.uleb128 0xc
-	.4byte	.LASF2659
+	.4byte	.LASF2660
 	.byte	0x1b
 	.uleb128 0xc
-	.4byte	.LASF2660
+	.4byte	.LASF2661
 	.byte	0x1c
 	.uleb128 0xc
-	.4byte	.LASF2661
+	.4byte	.LASF2662
 	.byte	0x1d
 	.uleb128 0xc
-	.4byte	.LASF2662
+	.4byte	.LASF2663
 	.byte	0x1e
 	.uleb128 0xc
-	.4byte	.LASF2663
+	.4byte	.LASF2664
 	.byte	0x1f
 	.uleb128 0xc
-	.4byte	.LASF2664
+	.4byte	.LASF2665
 	.byte	0x20
 	.uleb128 0xc
-	.4byte	.LASF2665
+	.4byte	.LASF2666
 	.byte	0x21
 	.uleb128 0xc
-	.4byte	.LASF2666
+	.4byte	.LASF2667
 	.byte	0x22
 	.uleb128 0xc
-	.4byte	.LASF2667
+	.4byte	.LASF2668
 	.byte	0x23
 	.uleb128 0xc
-	.4byte	.LASF2668
+	.4byte	.LASF2669
 	.byte	0x24
 	.uleb128 0xc
-	.4byte	.LASF2669
+	.4byte	.LASF2670
 	.byte	0x25
 	.uleb128 0xc
-	.4byte	.LASF2670
+	.4byte	.LASF2671
 	.byte	0x26
 	.uleb128 0xc
-	.4byte	.LASF2671
+	.4byte	.LASF2672
 	.byte	0x27
 	.uleb128 0xc
-	.4byte	.LASF2672
+	.4byte	.LASF2673
 	.byte	0x28
 	.uleb128 0xc
-	.4byte	.LASF2673
+	.4byte	.LASF2674
 	.byte	0x29
 	.uleb128 0xc
-	.4byte	.LASF2674
+	.4byte	.LASF2675
 	.byte	0x2a
 	.uleb128 0xc
-	.4byte	.LASF2675
+	.4byte	.LASF2676
 	.byte	0x2b
 	.uleb128 0xc
-	.4byte	.LASF2676
+	.4byte	.LASF2677
 	.byte	0x2c
 	.uleb128 0xc
-	.4byte	.LASF2677
+	.4byte	.LASF2678
 	.byte	0x2d
 	.uleb128 0xc
-	.4byte	.LASF2678
+	.4byte	.LASF2679
 	.byte	0x2e
 	.uleb128 0xc
-	.4byte	.LASF2679
+	.4byte	.LASF2680
 	.byte	0x2f
 	.uleb128 0xc
-	.4byte	.LASF2680
+	.4byte	.LASF2681
 	.byte	0x30
 	.uleb128 0xc
-	.4byte	.LASF2681
+	.4byte	.LASF2682
 	.byte	0x31
 	.uleb128 0xc
-	.4byte	.LASF2682
+	.4byte	.LASF2683
 	.byte	0x32
 	.uleb128 0xc
-	.4byte	.LASF2683
+	.4byte	.LASF2684
 	.byte	0x33
 	.uleb128 0xc
-	.4byte	.LASF2684
+	.4byte	.LASF2685
 	.byte	0x34
 	.uleb128 0xc
-	.4byte	.LASF2685
+	.4byte	.LASF2686
 	.byte	0x35
 	.uleb128 0xc
-	.4byte	.LASF2686
+	.4byte	.LASF2687
 	.byte	0x36
 	.uleb128 0xc
-	.4byte	.LASF2687
+	.4byte	.LASF2688
 	.byte	0x37
 	.uleb128 0xc
-	.4byte	.LASF2688
+	.4byte	.LASF2689
 	.byte	0x38
 	.uleb128 0xc
-	.4byte	.LASF2689
+	.4byte	.LASF2690
 	.byte	0x39
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2690
+	.4byte	.LASF2691
 	.byte	0xb3
 	.byte	0xc
 	.4byte	0xc6
 	.uleb128 0x26
-	.4byte	.LASF2691
+	.4byte	.LASF2692
 	.2byte	0x1c8
 	.byte	0xb3
 	.byte	0x2d
-	.4byte	0xcc9e
+	.4byte	0xccb9
 	.uleb128 0xe
-	.4byte	.LASF2037
+	.4byte	.LASF2038
 	.byte	0xb3
 	.byte	0x2e
-	.4byte	0xcc9e
+	.4byte	0xccb9
 	.byte	0
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0xccae
+	.4byte	0xccc9
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x38
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2692
+	.4byte	.LASF2693
 	.byte	0xb3
 	.byte	0x31
-	.4byte	0xcc84
+	.4byte	0xcc9f
 	.uleb128 0x19
-	.4byte	.LASF2693
+	.4byte	.LASF2694
 	.byte	0xb3
 	.byte	0x83
-	.4byte	0x66cf
+	.4byte	0x66e4
 	.uleb128 0x5
-	.4byte	0x543
-	.4byte	0xccd3
+	.4byte	0x558
+	.4byte	0xccee
 	.uleb128 0x44
 	.4byte	0x4f
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1569
+	.4byte	.LASF1570
 	.byte	0xb3
 	.byte	0x84
-	.4byte	0xccc4
+	.4byte	0xccdf
 	.uleb128 0x19
-	.4byte	.LASF2694
+	.4byte	.LASF2695
 	.byte	0xb3
 	.byte	0x85
-	.4byte	0x6779
+	.4byte	0x678e
 	.uleb128 0x5
 	.4byte	0x5c
-	.4byte	0xccf4
+	.4byte	0xcd0f
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xcce9
+	.4byte	0xcd04
 	.uleb128 0x15
-	.4byte	.LASF2695
+	.4byte	.LASF2696
 	.byte	0xb3
 	.2byte	0x183
-	.4byte	0xccf4
+	.4byte	0xcd0f
 	.uleb128 0x15
-	.4byte	.LASF2696
+	.4byte	.LASF2697
 	.byte	0x76
 	.2byte	0x8d3
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF2697
+	.4byte	.LASF2698
 	.byte	0x76
 	.2byte	0x8d4
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF2698
+	.4byte	.LASF2699
 	.byte	0x76
 	.2byte	0x8d7
-	.4byte	0x543
+	.4byte	0x558
 	.uleb128 0x15
-	.4byte	.LASF2699
+	.4byte	.LASF2700
 	.byte	0x76
 	.2byte	0x9a7
 	.4byte	0x29
 	.uleb128 0x15
-	.4byte	.LASF2700
+	.4byte	.LASF2701
 	.byte	0x76
 	.2byte	0xa85
-	.4byte	0xf3d
+	.4byte	0xf52
 	.uleb128 0x15
-	.4byte	.LASF2701
+	.4byte	.LASF2702
 	.byte	0x76
 	.2byte	0xa92
-	.4byte	0xf3d
+	.4byte	0xf52
 	.uleb128 0x15
-	.4byte	.LASF2702
+	.4byte	.LASF2703
 	.byte	0x76
 	.2byte	0xacd
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF2703
+	.4byte	.LASF2704
 	.byte	0x76
 	.2byte	0xad8
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF2704
+	.4byte	.LASF2705
 	.byte	0x76
 	.2byte	0xb02
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF2705
+	.4byte	.LASF2706
 	.byte	0x76
 	.2byte	0xb03
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF2706
+	.4byte	.LASF2707
 	.byte	0x76
 	.2byte	0xb05
-	.4byte	0x543
+	.4byte	0x558
 	.uleb128 0x15
-	.4byte	.LASF2707
+	.4byte	.LASF2708
 	.byte	0x76
 	.2byte	0xb3a
-	.4byte	0xc6e8
+	.4byte	0xc703
 	.uleb128 0x19
-	.4byte	.LASF2708
+	.4byte	.LASF2709
 	.byte	0xb4
 	.byte	0x38
-	.4byte	0x9368
+	.4byte	0x937d
 	.uleb128 0x19
-	.4byte	.LASF2709
+	.4byte	.LASF2710
 	.byte	0xb5
 	.byte	0x21
-	.4byte	0x4eb
+	.4byte	0x500
 	.uleb128 0x8
-	.4byte	.LASF2710
+	.4byte	.LASF2711
 	.byte	0xb6
 	.byte	0x10
-	.4byte	0xef
+	.4byte	0xf4
 	.uleb128 0x8
-	.4byte	.LASF2711
+	.4byte	.LASF2712
 	.byte	0xb6
 	.byte	0x11
 	.4byte	0xa9
 	.uleb128 0x8
-	.4byte	.LASF2712
+	.4byte	.LASF2713
 	.byte	0xb6
 	.byte	0x13
-	.4byte	0xef
+	.4byte	0xf4
 	.uleb128 0x8
-	.4byte	.LASF2713
+	.4byte	.LASF2714
 	.byte	0xb6
 	.byte	0x15
 	.4byte	0xd2
 	.uleb128 0x8
-	.4byte	.LASF2714
+	.4byte	.LASF2715
 	.byte	0xb6
 	.byte	0x16
-	.4byte	0xef
+	.4byte	0xf4
 	.uleb128 0x8
-	.4byte	.LASF2715
+	.4byte	.LASF2716
 	.byte	0xb6
 	.byte	0x17
-	.4byte	0xdd
+	.4byte	0xe2
 	.uleb128 0x21
 	.byte	0x8
 	.byte	0xb6
 	.byte	0x94
-	.4byte	0xce0c
+	.4byte	0xce27
 	.uleb128 0x22
-	.4byte	.LASF2716
+	.4byte	.LASF2717
 	.byte	0xb6
 	.byte	0x95
-	.4byte	0xcdd7
+	.4byte	0xcdf2
 	.uleb128 0x22
-	.4byte	.LASF2717
+	.4byte	.LASF2718
 	.byte	0xb6
 	.byte	0x96
-	.4byte	0xcdab
+	.4byte	0xcdc6
 	.byte	0
 	.uleb128 0xf
 	.byte	0x10
 	.byte	0xb6
 	.byte	0x92
-	.4byte	0xce2d
+	.4byte	0xce48
 	.uleb128 0xe
-	.4byte	.LASF2718
+	.4byte	.LASF2719
 	.byte	0xb6
 	.byte	0x93
-	.4byte	0xcde2
+	.4byte	0xcdfd
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2719
+	.4byte	.LASF2720
 	.byte	0xb6
 	.byte	0x97
-	.4byte	0xcded
+	.4byte	0xce08
 	.byte	0x8
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF2720
+	.4byte	.LASF2721
 	.byte	0xb6
 	.byte	0x98
-	.4byte	0xce0c
+	.4byte	0xce27
 	.uleb128 0xd
-	.4byte	.LASF2721
+	.4byte	.LASF2722
 	.byte	0x18
 	.byte	0xb6
 	.byte	0xc0
-	.4byte	0xce8d
+	.4byte	0xcea8
 	.uleb128 0xe
-	.4byte	.LASF2722
+	.4byte	.LASF2723
 	.byte	0xb6
 	.byte	0xc1
-	.4byte	0xcdcc
+	.4byte	0xcde7
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2723
+	.4byte	.LASF2724
 	.byte	0xb6
 	.byte	0xc2
 	.4byte	0x96
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF2724
+	.4byte	.LASF2725
 	.byte	0xb6
 	.byte	0xc3
 	.4byte	0x96
 	.byte	0x5
 	.uleb128 0xe
-	.4byte	.LASF2725
+	.4byte	.LASF2726
 	.byte	0xb6
 	.byte	0xc4
-	.4byte	0xcdb6
+	.4byte	0xcdd1
 	.byte	0x6
 	.uleb128 0xe
-	.4byte	.LASF2726
+	.4byte	.LASF2727
 	.byte	0xb6
 	.byte	0xc5
-	.4byte	0xcdab
+	.4byte	0xcdc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2727
+	.4byte	.LASF2728
 	.byte	0xb6
 	.byte	0xc6
-	.4byte	0xcdd7
+	.4byte	0xcdf2
 	.byte	0x10
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF2728
+	.4byte	.LASF2729
 	.byte	0xb6
 	.byte	0xc7
-	.4byte	0xce38
+	.4byte	0xce53
 	.uleb128 0x1d
-	.4byte	.LASF2729
+	.4byte	.LASF2730
 	.byte	0x40
 	.byte	0xb6
 	.2byte	0x13c
-	.4byte	0xcf28
+	.4byte	0xcf43
 	.uleb128 0x1b
-	.4byte	.LASF2730
+	.4byte	.LASF2731
 	.byte	0xb6
 	.2byte	0x13d
-	.4byte	0xcdcc
+	.4byte	0xcde7
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2731
+	.4byte	.LASF2732
 	.byte	0xb6
 	.2byte	0x13e
-	.4byte	0xcdcc
+	.4byte	0xcde7
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF2732
+	.4byte	.LASF2733
 	.byte	0xb6
 	.2byte	0x13f
-	.4byte	0xcdd7
+	.4byte	0xcdf2
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2733
+	.4byte	.LASF2734
 	.byte	0xb6
 	.2byte	0x140
-	.4byte	0xcdab
+	.4byte	0xcdc6
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2734
+	.4byte	.LASF2735
 	.byte	0xb6
 	.2byte	0x141
-	.4byte	0xcdc1
+	.4byte	0xcddc
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF2735
+	.4byte	.LASF2736
 	.byte	0xb6
 	.2byte	0x142
-	.4byte	0xcdd7
+	.4byte	0xcdf2
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2736
+	.4byte	.LASF2737
 	.byte	0xb6
 	.2byte	0x143
-	.4byte	0xcdcc
+	.4byte	0xcde7
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF2737
+	.4byte	.LASF2738
 	.byte	0xb6
 	.2byte	0x144
-	.4byte	0xcdcc
+	.4byte	0xcde7
 	.byte	0x2c
 	.uleb128 0x1b
-	.4byte	.LASF2738
+	.4byte	.LASF2739
 	.byte	0xb6
 	.2byte	0x145
-	.4byte	0xcdd7
+	.4byte	0xcdf2
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF2739
+	.4byte	.LASF2740
 	.byte	0xb6
 	.2byte	0x146
-	.4byte	0xcdd7
+	.4byte	0xcdf2
 	.byte	0x38
 	.byte	0
 	.uleb128 0x5
-	.4byte	0xce2d
-	.4byte	0xcf33
+	.4byte	0xce48
+	.4byte	0xcf4e
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2740
+	.4byte	.LASF2741
 	.byte	0xb7
 	.byte	0x25
-	.4byte	0xcf28
+	.4byte	0xcf43
 	.uleb128 0xd
-	.4byte	.LASF2741
+	.4byte	.LASF2742
 	.byte	0x20
 	.byte	0xb8
 	.byte	0x31
-	.4byte	0xcf7b
+	.4byte	0xcf96
 	.uleb128 0xe
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0xb8
 	.byte	0x33
 	.4byte	0x6d
@@ -35560,42 +35550,42 @@ __exitcall_ebc_exit:
 	.string	"set"
 	.byte	0xb8
 	.byte	0x35
-	.4byte	0xcffa
+	.4byte	0xd015
 	.byte	0x8
 	.uleb128 0x20
 	.string	"get"
 	.byte	0xb8
 	.byte	0x37
-	.4byte	0xd014
+	.4byte	0xd02f
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2399
+	.4byte	.LASF2400
 	.byte	0xb8
 	.byte	0x39
-	.4byte	0x2f20
+	.4byte	0x2f35
 	.byte	0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xcf3e
+	.4byte	0xcf59
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xcf94
+	.4byte	0xcfaf
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
-	.4byte	0xcf94
+	.4byte	0xcfaf
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xcff5
+	.4byte	0xd010
 	.uleb128 0xd
-	.4byte	.LASF2742
+	.4byte	.LASF2743
 	.byte	0x28
 	.byte	0xb8
 	.byte	0x47
-	.4byte	0xcff5
+	.4byte	0xd010
 	.uleb128 0xe
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0xb8
 	.byte	0x48
 	.4byte	0x56
@@ -35604,103 +35594,103 @@ __exitcall_ebc_exit:
 	.string	"mod"
 	.byte	0xb8
 	.byte	0x49
-	.4byte	0x7566
+	.4byte	0x757b
 	.byte	0x8
 	.uleb128 0x20
 	.string	"ops"
 	.byte	0xb8
 	.byte	0x4a
-	.4byte	0xd0c8
+	.4byte	0xd0e3
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1987
+	.4byte	.LASF1988
 	.byte	0xb8
 	.byte	0x4b
-	.4byte	0x125
+	.4byte	0x12a
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF556
+	.4byte	.LASF557
 	.byte	0xb8
 	.byte	0x4c
-	.4byte	0x101
+	.4byte	0x106
 	.byte	0x1a
 	.uleb128 0xe
-	.4byte	.LASF170
+	.4byte	.LASF171
 	.byte	0xb8
 	.byte	0x4d
-	.4byte	0x10b
+	.4byte	0x110
 	.byte	0x1b
 	.uleb128 0x23
-	.4byte	0xd01a
+	.4byte	0xd035
 	.byte	0x20
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xcf9a
+	.4byte	0xcfb5
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xcf80
+	.4byte	0xcf9b
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xd014
+	.4byte	0xd02f
 	.uleb128 0x11
-	.4byte	0x219
+	.4byte	0x21e
 	.uleb128 0x11
-	.4byte	0xcf94
+	.4byte	0xcfaf
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd000
+	.4byte	0xd01b
 	.uleb128 0x21
 	.byte	0x8
 	.byte	0xb8
 	.byte	0x4e
-	.4byte	0xd044
+	.4byte	0xd05f
 	.uleb128 0x28
 	.string	"arg"
 	.byte	0xb8
 	.byte	0x4f
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x28
 	.string	"str"
 	.byte	0xb8
 	.byte	0x50
-	.4byte	0xd06e
+	.4byte	0xd089
 	.uleb128 0x28
 	.string	"arr"
 	.byte	0xb8
 	.byte	0x51
-	.4byte	0xd0c2
+	.4byte	0xd0dd
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2743
+	.4byte	.LASF2744
 	.byte	0x10
 	.byte	0xb8
 	.byte	0x58
-	.4byte	0xd069
+	.4byte	0xd084
 	.uleb128 0xe
-	.4byte	.LASF2032
+	.4byte	.LASF2033
 	.byte	0xb8
 	.byte	0x59
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2744
+	.4byte	.LASF2745
 	.byte	0xb8
 	.byte	0x5a
-	.4byte	0x219
+	.4byte	0x21e
 	.byte	0x8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xd044
+	.4byte	0xd05f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd069
+	.4byte	0xd084
 	.uleb128 0xd
-	.4byte	.LASF2745
+	.4byte	.LASF2746
 	.byte	0x20
 	.byte	0xb8
 	.byte	0x5e
-	.4byte	0xd0bd
+	.4byte	0xd0d8
 	.uleb128 0x20
 	.string	"max"
 	.byte	0xb8
@@ -35708,7 +35698,7 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2746
+	.4byte	.LASF2747
 	.byte	0xb8
 	.byte	0x61
 	.4byte	0x6d
@@ -35717,161 +35707,161 @@ __exitcall_ebc_exit:
 	.string	"num"
 	.byte	0xb8
 	.byte	0x62
-	.4byte	0x355e
+	.4byte	0x3573
 	.byte	0x8
 	.uleb128 0x20
 	.string	"ops"
 	.byte	0xb8
 	.byte	0x63
-	.4byte	0xd0c8
+	.4byte	0xd0e3
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2747
+	.4byte	.LASF2748
 	.byte	0xb8
 	.byte	0x64
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xd074
+	.4byte	0xd08f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd0bd
+	.4byte	0xd0d8
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xcf7b
+	.4byte	0xcf96
 	.uleb128 0x5
-	.4byte	0xcff5
-	.4byte	0xd0d9
+	.4byte	0xd010
+	.4byte	0xd0f4
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xd0ce
+	.4byte	0xd0e9
 	.uleb128 0x19
-	.4byte	.LASF2748
+	.4byte	.LASF2749
 	.byte	0xb8
 	.byte	0x55
-	.4byte	0xd0d9
+	.4byte	0xd0f4
 	.uleb128 0x19
-	.4byte	.LASF2749
+	.4byte	.LASF2750
 	.byte	0xb8
 	.byte	0x55
-	.4byte	0xd0d9
+	.4byte	0xd0f4
 	.uleb128 0x15
-	.4byte	.LASF2750
+	.4byte	.LASF2751
 	.byte	0xb8
 	.2byte	0x155
-	.4byte	0xcf7b
+	.4byte	0xcf96
 	.uleb128 0x15
-	.4byte	.LASF2751
+	.4byte	.LASF2752
 	.byte	0xb8
 	.2byte	0x15a
-	.4byte	0xcf7b
+	.4byte	0xcf96
 	.uleb128 0x15
-	.4byte	.LASF2752
+	.4byte	.LASF2753
 	.byte	0xb8
 	.2byte	0x15f
-	.4byte	0xcf7b
+	.4byte	0xcf96
 	.uleb128 0x15
-	.4byte	.LASF2753
+	.4byte	.LASF2754
 	.byte	0xb8
 	.2byte	0x164
-	.4byte	0xcf7b
+	.4byte	0xcf96
 	.uleb128 0x15
-	.4byte	.LASF2754
+	.4byte	.LASF2755
 	.byte	0xb8
 	.2byte	0x169
-	.4byte	0xcf7b
+	.4byte	0xcf96
 	.uleb128 0x15
-	.4byte	.LASF2755
+	.4byte	.LASF2756
 	.byte	0xb8
 	.2byte	0x16e
-	.4byte	0xcf7b
+	.4byte	0xcf96
 	.uleb128 0x15
-	.4byte	.LASF2756
+	.4byte	.LASF2757
 	.byte	0xb8
 	.2byte	0x173
-	.4byte	0xcf7b
+	.4byte	0xcf96
 	.uleb128 0x15
-	.4byte	.LASF2757
+	.4byte	.LASF2758
 	.byte	0xb8
 	.2byte	0x178
-	.4byte	0xcf7b
+	.4byte	0xcf96
 	.uleb128 0x15
-	.4byte	.LASF2758
+	.4byte	.LASF2759
 	.byte	0xb8
 	.2byte	0x17d
-	.4byte	0xcf7b
+	.4byte	0xcf96
 	.uleb128 0x15
-	.4byte	.LASF2759
+	.4byte	.LASF2760
 	.byte	0xb8
 	.2byte	0x184
-	.4byte	0xcf7b
+	.4byte	0xcf96
 	.uleb128 0x15
-	.4byte	.LASF2760
+	.4byte	.LASF2761
 	.byte	0xb8
 	.2byte	0x189
-	.4byte	0xcf7b
+	.4byte	0xcf96
 	.uleb128 0x15
-	.4byte	.LASF2761
+	.4byte	.LASF2762
 	.byte	0xb8
 	.2byte	0x18f
-	.4byte	0xcf7b
+	.4byte	0xcf96
 	.uleb128 0x15
-	.4byte	.LASF2762
+	.4byte	.LASF2763
 	.byte	0xb8
 	.2byte	0x195
-	.4byte	0xcf7b
+	.4byte	0xcf96
 	.uleb128 0x15
-	.4byte	.LASF2763
+	.4byte	.LASF2764
 	.byte	0xb8
 	.2byte	0x1fe
-	.4byte	0xcf7b
+	.4byte	0xcf96
 	.uleb128 0x15
-	.4byte	.LASF2764
+	.4byte	.LASF2765
 	.byte	0xb8
 	.2byte	0x200
-	.4byte	0xcf7b
+	.4byte	0xcf96
 	.uleb128 0xd
-	.4byte	.LASF2765
+	.4byte	.LASF2766
 	.byte	0x30
 	.byte	0xb9
 	.byte	0x28
-	.4byte	0xd1c1
+	.4byte	0xd1dc
 	.uleb128 0xe
-	.4byte	.LASF867
+	.4byte	.LASF868
 	.byte	0xb9
 	.byte	0x29
-	.4byte	0xd1c1
+	.4byte	0xd1dc
 	.byte	0
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x34cd
-	.4byte	0xd1d1
+	.4byte	0x34e2
+	.4byte	0xd1ec
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2766
+	.4byte	.LASF2767
 	.byte	0x10
 	.byte	0xba
 	.byte	0x18
-	.4byte	0xd202
+	.4byte	0xd21d
 	.uleb128 0x20
 	.string	"plt"
 	.byte	0xba
 	.byte	0x19
-	.4byte	0xd202
+	.4byte	0xd21d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2767
+	.4byte	.LASF2768
 	.byte	0xba
 	.byte	0x1a
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2768
+	.4byte	.LASF2769
 	.byte	0xba
 	.byte	0x1b
 	.4byte	0xc6
@@ -35879,305 +35869,305 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xce98
+	.4byte	0xceb3
 	.uleb128 0xd
-	.4byte	.LASF2769
+	.4byte	.LASF2770
 	.byte	0x28
 	.byte	0xba
 	.byte	0x1e
-	.4byte	0xd239
+	.4byte	0xd254
 	.uleb128 0xe
-	.4byte	.LASF2770
+	.4byte	.LASF2771
 	.byte	0xba
 	.byte	0x1f
-	.4byte	0xd1d1
+	.4byte	0xd1ec
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1742
+	.4byte	.LASF1743
 	.byte	0xba
 	.byte	0x20
-	.4byte	0xd1d1
+	.4byte	0xd1ec
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2771
+	.4byte	.LASF2772
 	.byte	0xba
 	.byte	0x23
-	.4byte	0xd275
+	.4byte	0xd290
 	.byte	0x20
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2772
+	.4byte	.LASF2773
 	.byte	0x10
 	.byte	0xba
 	.byte	0x32
-	.4byte	0xd275
+	.4byte	0xd290
 	.uleb128 0xe
-	.4byte	.LASF2773
+	.4byte	.LASF2774
 	.byte	0xba
 	.byte	0x3b
-	.4byte	0x224
+	.4byte	0x229
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2774
+	.4byte	.LASF2775
 	.byte	0xba
 	.byte	0x3c
-	.4byte	0x224
+	.4byte	0x229
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF2775
+	.4byte	.LASF2776
 	.byte	0xba
 	.byte	0x3d
-	.4byte	0x224
+	.4byte	0x229
 	.byte	0x8
 	.uleb128 0x20
 	.string	"br"
 	.byte	0xba
 	.byte	0x3e
-	.4byte	0x224
+	.4byte	0x229
 	.byte	0xc
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd239
+	.4byte	0xd254
 	.uleb128 0x19
-	.4byte	.LASF2776
+	.4byte	.LASF2777
 	.byte	0xba
 	.byte	0x2d
-	.4byte	0x155
+	.4byte	0x15a
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0xd296
+	.4byte	0xd2b1
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x37
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2777
+	.4byte	.LASF2778
 	.byte	0x80
 	.byte	0x8b
 	.byte	0x2e
-	.4byte	0xd2de
+	.4byte	0xd2f9
 	.uleb128 0xe
-	.4byte	.LASF2145
+	.4byte	.LASF2146
 	.byte	0x8b
 	.byte	0x2f
-	.4byte	0x90f2
+	.4byte	0x9107
 	.byte	0
 	.uleb128 0x20
 	.string	"mod"
 	.byte	0x8b
 	.byte	0x30
-	.4byte	0x7566
+	.4byte	0x757b
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2778
+	.4byte	.LASF2779
 	.byte	0x8b
 	.byte	0x31
-	.4byte	0x91d9
+	.4byte	0x91ee
 	.byte	0x68
 	.uleb128 0x20
 	.string	"mp"
 	.byte	0x8b
 	.byte	0x32
-	.4byte	0xd2e3
+	.4byte	0xd2fe
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF2779
+	.4byte	.LASF2780
 	.byte	0x8b
 	.byte	0x33
-	.4byte	0x4663
+	.4byte	0x4678
 	.byte	0x78
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF2780
+	.4byte	.LASF2781
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd2de
+	.4byte	0xd2f9
 	.uleb128 0xd
-	.4byte	.LASF2781
+	.4byte	.LASF2782
 	.byte	0x38
 	.byte	0x8b
 	.byte	0x36
-	.4byte	0xd33e
+	.4byte	0xd359
 	.uleb128 0xe
-	.4byte	.LASF2114
+	.4byte	.LASF2115
 	.byte	0x8b
 	.byte	0x37
-	.4byte	0x9e4e
+	.4byte	0x9e63
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2077
+	.4byte	.LASF2078
 	.byte	0x8b
 	.byte	0x38
-	.4byte	0xd363
+	.4byte	0xd37e
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2141
+	.4byte	.LASF2142
 	.byte	0x8b
 	.byte	0x3a
-	.4byte	0xd387
+	.4byte	0xd3a2
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2782
+	.4byte	.LASF2783
 	.byte	0x8b
 	.byte	0x3c
-	.4byte	0xd39d
+	.4byte	0xd3b8
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2783
+	.4byte	.LASF2784
 	.byte	0x8b
 	.byte	0x3d
-	.4byte	0xd3b2
+	.4byte	0xd3cd
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2399
+	.4byte	.LASF2400
 	.byte	0x8b
 	.byte	0x3e
-	.4byte	0xd3c3
+	.4byte	0xd3de
 	.byte	0x30
 	.byte	0
 	.uleb128 0x14
-	.4byte	0x2d9
-	.4byte	0xd357
+	.4byte	0x2ee
+	.4byte	0xd372
 	.uleb128 0x11
-	.4byte	0xd357
+	.4byte	0xd372
 	.uleb128 0x11
-	.4byte	0xd35d
+	.4byte	0xd378
 	.uleb128 0x11
-	.4byte	0x219
+	.4byte	0x21e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd2e9
+	.4byte	0xd304
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd296
+	.4byte	0xd2b1
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd33e
+	.4byte	0xd359
 	.uleb128 0x14
-	.4byte	0x2d9
-	.4byte	0xd387
+	.4byte	0x2ee
+	.4byte	0xd3a2
 	.uleb128 0x11
-	.4byte	0xd357
+	.4byte	0xd372
 	.uleb128 0x11
-	.4byte	0xd35d
+	.4byte	0xd378
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd369
+	.4byte	0xd384
 	.uleb128 0x10
-	.4byte	0xd39d
+	.4byte	0xd3b8
 	.uleb128 0x11
-	.4byte	0x7566
+	.4byte	0x757b
 	.uleb128 0x11
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd38d
+	.4byte	0xd3a8
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xd3b2
+	.4byte	0xd3cd
 	.uleb128 0x11
-	.4byte	0x7566
+	.4byte	0x757b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd3a3
+	.4byte	0xd3be
 	.uleb128 0x10
-	.4byte	0xd3c3
+	.4byte	0xd3de
 	.uleb128 0x11
-	.4byte	0x7566
+	.4byte	0x757b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd3b8
+	.4byte	0xd3d3
 	.uleb128 0x19
-	.4byte	.LASF2784
+	.4byte	.LASF2785
 	.byte	0x8b
 	.byte	0x4a
-	.4byte	0xd2e9
+	.4byte	0xd304
 	.uleb128 0x15
-	.4byte	.LASF2785
+	.4byte	.LASF2786
 	.byte	0x8b
 	.2byte	0x10c
 	.4byte	0xc6
 	.uleb128 0x1e
-	.4byte	.LASF2786
+	.4byte	.LASF2787
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x8b
 	.2byte	0x119
-	.4byte	0xd40a
+	.4byte	0xd425
 	.uleb128 0xc
-	.4byte	.LASF2787
+	.4byte	.LASF2788
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2788
+	.4byte	.LASF2789
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2789
+	.4byte	.LASF2790
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2790
+	.4byte	.LASF2791
 	.byte	0x3
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF2791
+	.4byte	.LASF2792
 	.byte	0x38
 	.byte	0x8b
 	.2byte	0x120
-	.4byte	0xd432
+	.4byte	0xd44d
 	.uleb128 0x2b
 	.string	"mod"
 	.byte	0x8b
 	.2byte	0x121
-	.4byte	0x7566
+	.4byte	0x757b
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF867
+	.4byte	.LASF868
 	.byte	0x8b
 	.2byte	0x122
-	.4byte	0xd1a8
+	.4byte	0xd1c3
 	.byte	0x8
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF2792
+	.4byte	.LASF2793
 	.byte	0x50
 	.byte	0x8b
 	.2byte	0x125
-	.4byte	0xd48e
+	.4byte	0xd4a9
 	.uleb128 0x1b
-	.4byte	.LASF874
+	.4byte	.LASF875
 	.byte	0x8b
 	.2byte	0x127
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF986
+	.4byte	.LASF987
 	.byte	0x8b
 	.2byte	0x129
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2793
+	.4byte	.LASF2794
 	.byte	0x8b
 	.2byte	0x12b
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF2794
+	.4byte	.LASF2795
 	.byte	0x8b
 	.2byte	0x12d
 	.4byte	0x6d
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2795
+	.4byte	.LASF2796
 	.byte	0x8b
 	.2byte	0x12f
 	.4byte	0x6d
@@ -36186,60 +36176,60 @@ __exitcall_ebc_exit:
 	.string	"mtn"
 	.byte	0x8b
 	.2byte	0x132
-	.4byte	0xd40a
+	.4byte	0xd425
 	.byte	0x18
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF2796
+	.4byte	.LASF2797
 	.byte	0x18
 	.byte	0x8b
 	.2byte	0x13d
-	.4byte	0xd4c3
+	.4byte	0xd4de
 	.uleb128 0x1b
-	.4byte	.LASF2797
+	.4byte	.LASF2798
 	.byte	0x8b
 	.2byte	0x13e
-	.4byte	0xd4c3
+	.4byte	0xd4de
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2798
+	.4byte	.LASF2799
 	.byte	0x8b
 	.2byte	0x13f
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2799
+	.4byte	.LASF2800
 	.byte	0x8b
 	.2byte	0x140
-	.4byte	0x219
+	.4byte	0x21e
 	.byte	0x10
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xce8d
+	.4byte	0xcea8
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x25f
+	.4byte	0x274
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x135
+	.4byte	0x13a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xcf9a
+	.4byte	0xcfb5
 	.uleb128 0xd
-	.4byte	.LASF2800
+	.4byte	.LASF2801
 	.byte	0x8
 	.byte	0xbb
 	.byte	0x12
-	.4byte	0xd500
+	.4byte	0xd51b
 	.uleb128 0xe
-	.4byte	.LASF2801
+	.4byte	.LASF2802
 	.byte	0xbb
 	.byte	0x14
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2802
+	.4byte	.LASF2803
 	.byte	0xbb
 	.byte	0x14
 	.4byte	0xc6
@@ -36247,106 +36237,106 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd4db
+	.4byte	0xd4f6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x980
+	.4byte	0x995
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd48e
+	.4byte	0xd4a9
 	.uleb128 0x24
-	.4byte	.LASF2803
+	.4byte	.LASF2804
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd512
+	.4byte	0xd52d
 	.uleb128 0x24
-	.4byte	.LASF2804
+	.4byte	.LASF2805
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd51d
+	.4byte	0xd538
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc7a5
+	.4byte	0xc7c0
 	.uleb128 0x24
-	.4byte	.LASF2805
+	.4byte	.LASF2806
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd539
+	.4byte	0xd554
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd52e
+	.4byte	0xd549
 	.uleb128 0x24
-	.4byte	.LASF2806
+	.4byte	.LASF2807
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd54a
+	.4byte	0xd565
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd53f
+	.4byte	0xd55a
 	.uleb128 0x15
-	.4byte	.LASF2807
+	.4byte	.LASF2808
 	.byte	0x8b
 	.2byte	0x1f6
-	.4byte	0x2455
+	.4byte	0x246a
 	.uleb128 0x15
-	.4byte	.LASF2808
+	.4byte	.LASF2809
 	.byte	0x8b
 	.2byte	0x317
-	.4byte	0xa0c7
+	.4byte	0xa0dc
 	.uleb128 0x15
-	.4byte	.LASF2809
+	.4byte	.LASF2810
 	.byte	0x8b
 	.2byte	0x318
-	.4byte	0xa0cd
+	.4byte	0xa0e2
 	.uleb128 0x15
-	.4byte	.LASF2810
+	.4byte	.LASF2811
 	.byte	0x8b
 	.2byte	0x319
 	.4byte	0xc6
 	.uleb128 0x26
-	.4byte	.LASF867
+	.4byte	.LASF868
 	.2byte	0x3b0
 	.byte	0xbc
 	.byte	0x16
-	.4byte	0xd59a
+	.4byte	0xd5b5
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xbc
 	.byte	0x17
-	.4byte	0xa561
+	.4byte	0xa576
 	.byte	0
 	.byte	0
 	.uleb128 0x5
-	.4byte	0xd5a5
-	.4byte	0xd5a5
+	.4byte	0xd5c0
+	.4byte	0xd5c0
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd580
+	.4byte	0xd59b
 	.uleb128 0x19
-	.4byte	.LASF2811
+	.4byte	.LASF2812
 	.byte	0xbc
 	.byte	0x1f
-	.4byte	0xd59a
+	.4byte	0xd5b5
 	.uleb128 0x19
-	.4byte	.LASF2812
+	.4byte	.LASF2813
 	.byte	0xbd
 	.byte	0x5a
-	.4byte	0x29b
+	.4byte	0x2b0
 	.uleb128 0x19
-	.4byte	.LASF2813
+	.4byte	.LASF2814
 	.byte	0xbd
 	.byte	0x6c
-	.4byte	0xadc8
+	.4byte	0xaddd
 	.uleb128 0x26
-	.4byte	.LASF2814
+	.4byte	.LASF2815
 	.2byte	0x3e8
 	.byte	0xbe
 	.byte	0x17
-	.4byte	0xd657
+	.4byte	0xd672
 	.uleb128 0xe
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0xbe
 	.byte	0x18
 	.4byte	0x56
@@ -36358,217 +36348,217 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2815
+	.4byte	.LASF2816
 	.byte	0xbe
 	.byte	0x1a
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0xc
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xbe
 	.byte	0x1b
-	.4byte	0xa561
+	.4byte	0xa576
 	.byte	0x10
 	.uleb128 0x27
-	.4byte	.LASF2816
+	.4byte	.LASF2817
 	.byte	0xbe
 	.byte	0x1c
-	.4byte	0x13a
+	.4byte	0x13f
 	.2byte	0x3c0
 	.uleb128 0x27
-	.4byte	.LASF2081
+	.4byte	.LASF2082
 	.byte	0xbe
 	.byte	0x1d
-	.4byte	0x97d9
+	.4byte	0x97ee
 	.2byte	0x3c8
 	.uleb128 0x27
-	.4byte	.LASF2817
+	.4byte	.LASF2818
 	.byte	0xbe
 	.byte	0x1f
-	.4byte	0xd65c
+	.4byte	0xd677
 	.2byte	0x3d0
 	.uleb128 0x27
-	.4byte	.LASF2818
+	.4byte	.LASF2819
 	.byte	0xbe
 	.byte	0x20
-	.4byte	0x219
+	.4byte	0x21e
 	.2byte	0x3d8
 	.uleb128 0x27
-	.4byte	.LASF2819
+	.4byte	.LASF2820
 	.byte	0xbe
 	.byte	0x23
-	.4byte	0xd667
+	.4byte	0xd682
 	.2byte	0x3e0
 	.uleb128 0x27
-	.4byte	.LASF2220
+	.4byte	.LASF2221
 	.byte	0xbe
 	.byte	0x26
-	.4byte	0xadba
+	.4byte	0xadcf
 	.2byte	0x3e8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xd5cc
+	.4byte	0xd5e7
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb916
+	.4byte	0xb92b
 	.uleb128 0x24
-	.4byte	.LASF2819
+	.4byte	.LASF2820
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd662
+	.4byte	0xd67d
 	.uleb128 0x19
-	.4byte	.LASF2820
+	.4byte	.LASF2821
 	.byte	0xbe
 	.byte	0x30
-	.4byte	0xadc8
+	.4byte	0xaddd
 	.uleb128 0x19
-	.4byte	.LASF2821
+	.4byte	.LASF2822
 	.byte	0xbe
 	.byte	0x31
-	.4byte	0xa561
+	.4byte	0xa576
 	.uleb128 0xd
-	.4byte	.LASF2822
+	.4byte	.LASF2823
 	.byte	0xe0
 	.byte	0xbe
 	.byte	0xb7
-	.4byte	0xd6f0
+	.4byte	0xd70b
 	.uleb128 0xe
-	.4byte	.LASF2331
+	.4byte	.LASF2332
 	.byte	0xbe
 	.byte	0xb8
-	.4byte	0xd705
+	.4byte	0xd720
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2333
+	.4byte	.LASF2334
 	.byte	0xbe
 	.byte	0xb9
-	.4byte	0xd705
+	.4byte	0xd720
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2334
+	.4byte	.LASF2335
 	.byte	0xbe
 	.byte	0xba
-	.4byte	0xd716
+	.4byte	0xd731
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2178
+	.4byte	.LASF2179
 	.byte	0xbe
 	.byte	0xbb
-	.4byte	0xd730
+	.4byte	0xd74b
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2179
+	.4byte	.LASF2180
 	.byte	0xbe
 	.byte	0xbc
-	.4byte	0xd705
+	.4byte	0xd720
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2201
+	.4byte	.LASF2202
 	.byte	0xbe
 	.byte	0xbd
-	.4byte	0xaf3c
+	.4byte	0xaf51
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2823
+	.4byte	.LASF2824
 	.byte	0xbe
 	.byte	0xbe
-	.4byte	0xd65c
+	.4byte	0xd677
 	.byte	0xd0
 	.uleb128 0xe
-	.4byte	.LASF2824
+	.4byte	.LASF2825
 	.byte	0xbe
 	.byte	0xbf
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0xd8
 	.byte	0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xd6ff
+	.4byte	0xd71a
 	.uleb128 0x11
-	.4byte	0xd6ff
+	.4byte	0xd71a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd5cc
+	.4byte	0xd5e7
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd6f0
+	.4byte	0xd70b
 	.uleb128 0x10
-	.4byte	0xd716
+	.4byte	0xd731
 	.uleb128 0x11
-	.4byte	0xd6ff
+	.4byte	0xd71a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd70b
+	.4byte	0xd726
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xd730
+	.4byte	0xd74b
 	.uleb128 0x11
-	.4byte	0xd6ff
+	.4byte	0xd71a
 	.uleb128 0x11
-	.4byte	0xa403
+	.4byte	0xa418
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd71c
+	.4byte	0xd737
 	.uleb128 0x5
-	.4byte	0xb186
-	.4byte	0xd741
+	.4byte	0xb19b
+	.4byte	0xd75c
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xd736
+	.4byte	0xd751
 	.uleb128 0x19
-	.4byte	.LASF2825
+	.4byte	.LASF2826
 	.byte	0xbf
 	.byte	0x31
-	.4byte	0xd741
+	.4byte	0xd75c
 	.uleb128 0x19
-	.4byte	.LASF2826
+	.4byte	.LASF2827
 	.byte	0xc0
 	.byte	0x16
-	.4byte	0xe70
+	.4byte	0xe85
 	.uleb128 0x19
-	.4byte	.LASF2827
+	.4byte	.LASF2828
 	.byte	0xc0
 	.byte	0x17
-	.4byte	0xe50
+	.4byte	0xe65
 	.uleb128 0x19
-	.4byte	.LASF2828
+	.4byte	.LASF2829
 	.byte	0xc0
 	.byte	0x19
-	.4byte	0x4a41
+	.4byte	0x4a56
 	.uleb128 0x19
-	.4byte	.LASF2829
+	.4byte	.LASF2830
 	.byte	0xc0
 	.byte	0x1a
-	.4byte	0x2492
+	.4byte	0x24a7
 	.uleb128 0x19
-	.4byte	.LASF2830
+	.4byte	.LASF2831
 	.byte	0x12
 	.byte	0x8c
-	.4byte	0x29b
+	.4byte	0x2b0
 	.uleb128 0x1e
-	.4byte	.LASF2831
+	.4byte	.LASF2832
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x12
 	.2byte	0x130
-	.4byte	0xd7ac
+	.4byte	0xd7c7
 	.uleb128 0xc
-	.4byte	.LASF2832
+	.4byte	.LASF2833
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2833
+	.4byte	.LASF2834
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2834
+	.4byte	.LASF2835
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x5239
-	.4byte	0xd7c2
+	.4byte	0x524e
+	.4byte	0xd7dd
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
@@ -36577,173 +36567,173 @@ __exitcall_ebc_exit:
 	.byte	0xd
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF2835
+	.4byte	.LASF2836
 	.byte	0x12
 	.2byte	0x13b
-	.4byte	0xd7ac
+	.4byte	0xd7c7
 	.uleb128 0xb
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x4
 	.byte	0x1b
-	.4byte	0xd7e7
+	.4byte	0xd802
 	.uleb128 0xc
-	.4byte	.LASF2836
+	.4byte	.LASF2837
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2837
+	.4byte	.LASF2838
 	.byte	0x1
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2838
+	.4byte	.LASF2839
 	.byte	0xd0
 	.byte	0x4
 	.byte	0x20
-	.4byte	0xd7ff
+	.4byte	0xd81a
 	.uleb128 0x20
 	.string	"ws"
 	.byte	0x4
 	.byte	0x21
-	.4byte	0xabf6
+	.4byte	0xac0b
 	.byte	0
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2839
+	.4byte	.LASF2840
 	.byte	0x4
 	.byte	0xc1
 	.byte	0x7
-	.4byte	0xd818
+	.4byte	0xd833
 	.uleb128 0xe
-	.4byte	.LASF2840
+	.4byte	.LASF2841
 	.byte	0xc1
 	.byte	0x8
 	.4byte	0xc6
 	.byte	0
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF2841
+	.4byte	.LASF2842
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc2
 	.byte	0xb
-	.4byte	0xd871
+	.4byte	0xd88c
 	.uleb128 0xc
-	.4byte	.LASF2842
+	.4byte	.LASF2843
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2843
+	.4byte	.LASF2844
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2844
+	.4byte	.LASF2845
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2845
+	.4byte	.LASF2846
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF2846
+	.4byte	.LASF2847
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF2847
+	.4byte	.LASF2848
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF2848
+	.4byte	.LASF2849
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF2849
+	.4byte	.LASF2850
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF2850
+	.4byte	.LASF2851
 	.byte	0x9
 	.uleb128 0xc
-	.4byte	.LASF2851
+	.4byte	.LASF2852
 	.byte	0xa
 	.uleb128 0xc
-	.4byte	.LASF2852
+	.4byte	.LASF2853
 	.byte	0xb
 	.uleb128 0xc
-	.4byte	.LASF2853
+	.4byte	.LASF2854
 	.byte	0xc
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2854
+	.4byte	.LASF2855
 	.byte	0x18
 	.byte	0xc2
 	.byte	0x27
-	.4byte	0xd8a2
+	.4byte	0xd8bd
 	.uleb128 0xe
-	.4byte	.LASF2855
+	.4byte	.LASF2856
 	.byte	0xc2
 	.byte	0x28
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF793
+	.4byte	.LASF794
 	.byte	0xc2
 	.byte	0x29
-	.4byte	0x355e
+	.4byte	0x3573
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2856
+	.4byte	.LASF2857
 	.byte	0xc2
 	.byte	0x2a
-	.4byte	0xc0ad
+	.4byte	0xc0c8
 	.byte	0x10
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF2857
+	.4byte	.LASF2858
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc3
 	.byte	0xe
-	.4byte	0xd8d1
+	.4byte	0xd8ec
 	.uleb128 0xc
-	.4byte	.LASF2858
+	.4byte	.LASF2859
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2859
+	.4byte	.LASF2860
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2860
+	.4byte	.LASF2861
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2861
+	.4byte	.LASF2862
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2862
+	.4byte	.LASF2863
 	.byte	0x4
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2863
+	.4byte	.LASF2864
 	.byte	0x40
 	.byte	0xc3
 	.byte	0x16
-	.4byte	0xd956
+	.4byte	0xd971
 	.uleb128 0xe
-	.4byte	.LASF759
+	.4byte	.LASF760
 	.byte	0xc3
 	.byte	0x17
-	.4byte	0xd8a2
+	.4byte	0xd8bd
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2864
+	.4byte	.LASF2865
 	.byte	0xc3
 	.byte	0x18
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2865
+	.4byte	.LASF2866
 	.byte	0xc3
 	.byte	0x19
-	.4byte	0x219
+	.4byte	0x21e
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2866
+	.4byte	.LASF2867
 	.byte	0xc3
 	.byte	0x1a
-	.4byte	0x47c3
+	.4byte	0x47d8
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2867
+	.4byte	.LASF2868
 	.byte	0xc3
 	.byte	0x1b
 	.4byte	0xc6
@@ -36755,367 +36745,367 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x2c
 	.uleb128 0xe
-	.4byte	.LASF2868
+	.4byte	.LASF2869
 	.byte	0xc3
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2869
+	.4byte	.LASF2870
 	.byte	0xc3
 	.byte	0x1e
 	.4byte	0xc6
 	.byte	0x34
 	.uleb128 0xe
-	.4byte	.LASF2870
+	.4byte	.LASF2871
 	.byte	0xc3
 	.byte	0x1f
 	.4byte	0xc6
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2871
+	.4byte	.LASF2872
 	.byte	0xc3
 	.byte	0x20
 	.4byte	0xc6
 	.byte	0x3c
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF2872
+	.4byte	.LASF2873
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc4
 	.byte	0x3b
-	.4byte	0xd9eb
+	.4byte	0xda06
 	.uleb128 0xc
-	.4byte	.LASF2873
+	.4byte	.LASF2874
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2874
+	.4byte	.LASF2875
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2875
+	.4byte	.LASF2876
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2876
+	.4byte	.LASF2877
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2877
+	.4byte	.LASF2878
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF2878
+	.4byte	.LASF2879
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF2879
+	.4byte	.LASF2880
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF2880
+	.4byte	.LASF2881
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF2881
+	.4byte	.LASF2882
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF2882
+	.4byte	.LASF2883
 	.byte	0x9
 	.uleb128 0xc
-	.4byte	.LASF2883
+	.4byte	.LASF2884
 	.byte	0xa
 	.uleb128 0xc
-	.4byte	.LASF2884
+	.4byte	.LASF2885
 	.byte	0xb
 	.uleb128 0xc
-	.4byte	.LASF2885
+	.4byte	.LASF2886
 	.byte	0xc
 	.uleb128 0xc
-	.4byte	.LASF2886
+	.4byte	.LASF2887
 	.byte	0xd
 	.uleb128 0xc
-	.4byte	.LASF2887
+	.4byte	.LASF2888
 	.byte	0xe
 	.uleb128 0xc
-	.4byte	.LASF2888
+	.4byte	.LASF2889
 	.byte	0xf
 	.uleb128 0xc
-	.4byte	.LASF2889
+	.4byte	.LASF2890
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF2890
+	.4byte	.LASF2891
 	.byte	0x11
 	.uleb128 0xc
-	.4byte	.LASF2891
+	.4byte	.LASF2892
 	.byte	0x12
 	.uleb128 0xc
-	.4byte	.LASF2892
+	.4byte	.LASF2893
 	.byte	0x13
 	.uleb128 0xc
-	.4byte	.LASF2893
+	.4byte	.LASF2894
 	.byte	0x14
 	.uleb128 0xc
-	.4byte	.LASF2894
+	.4byte	.LASF2895
 	.byte	0x15
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2895
+	.4byte	.LASF2896
 	.byte	0x2c
 	.byte	0xc4
 	.byte	0x57
-	.4byte	0xda7c
+	.4byte	0xda97
 	.uleb128 0xe
-	.4byte	.LASF883
+	.4byte	.LASF884
 	.byte	0xc4
 	.byte	0x58
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2896
+	.4byte	.LASF2897
 	.byte	0xc4
 	.byte	0x59
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF2897
+	.4byte	.LASF2898
 	.byte	0xc4
 	.byte	0x5a
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF261
+	.4byte	.LASF262
 	.byte	0xc4
 	.byte	0x5b
 	.4byte	0xc6
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF2898
+	.4byte	.LASF2899
 	.byte	0xc4
 	.byte	0x5c
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2868
+	.4byte	.LASF2869
 	.byte	0xc4
 	.byte	0x5d
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2869
+	.4byte	.LASF2870
 	.byte	0xc4
 	.byte	0x5e
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2870
+	.4byte	.LASF2871
 	.byte	0xc4
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x1c
 	.uleb128 0xe
-	.4byte	.LASF2871
+	.4byte	.LASF2872
 	.byte	0xc4
 	.byte	0x60
 	.4byte	0xc6
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2899
+	.4byte	.LASF2900
 	.byte	0xc4
 	.byte	0x61
 	.4byte	0xc6
 	.byte	0x24
 	.uleb128 0xe
-	.4byte	.LASF2900
+	.4byte	.LASF2901
 	.byte	0xc4
 	.byte	0x62
 	.4byte	0xc6
 	.byte	0x28
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2901
+	.4byte	.LASF2902
 	.byte	0x50
 	.byte	0x3
 	.byte	0x10
-	.4byte	0xdaf5
+	.4byte	0xdb10
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x3
 	.byte	0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2902
+	.4byte	.LASF2903
 	.byte	0x3
 	.byte	0x12
-	.4byte	0x47c3
+	.4byte	0x47d8
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2903
+	.4byte	.LASF2904
 	.byte	0x3
 	.byte	0x13
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2904
+	.4byte	.LASF2905
 	.byte	0x3
 	.byte	0x14
-	.4byte	0xdb0b
+	.4byte	0xdb26
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2905
+	.4byte	.LASF2906
 	.byte	0x3
 	.byte	0x15
-	.4byte	0xdb1c
+	.4byte	0xdb37
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2906
+	.4byte	.LASF2907
 	.byte	0x3
 	.byte	0x16
-	.4byte	0xdb1c
+	.4byte	0xdb37
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2907
+	.4byte	.LASF2908
 	.byte	0x3
 	.byte	0x17
-	.4byte	0xdb36
+	.4byte	0xdb51
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2908
+	.4byte	.LASF2909
 	.byte	0x3
 	.byte	0x18
-	.4byte	0xdb4b
+	.4byte	0xdb66
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2909
+	.4byte	.LASF2910
 	.byte	0x3
 	.byte	0x19
-	.4byte	0xdb65
+	.4byte	0xdb80
 	.byte	0x48
 	.byte	0
 	.uleb128 0x10
-	.4byte	0xdb05
+	.4byte	0xdb20
 	.uleb128 0x11
-	.4byte	0xdb05
+	.4byte	0xdb20
 	.uleb128 0x11
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xda7c
+	.4byte	0xda97
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdaf5
+	.4byte	0xdb10
 	.uleb128 0x10
-	.4byte	0xdb1c
+	.4byte	0xdb37
 	.uleb128 0x11
-	.4byte	0xdb05
+	.4byte	0xdb20
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb11
+	.4byte	0xdb2c
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdb36
+	.4byte	0xdb51
 	.uleb128 0x11
-	.4byte	0xdb05
+	.4byte	0xdb20
 	.uleb128 0x11
-	.4byte	0x4669
+	.4byte	0x467e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb22
+	.4byte	0xdb3d
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdb4b
+	.4byte	0xdb66
 	.uleb128 0x11
-	.4byte	0xdb05
+	.4byte	0xdb20
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb3c
+	.4byte	0xdb57
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdb65
+	.4byte	0xdb80
 	.uleb128 0x11
-	.4byte	0xdb05
+	.4byte	0xdb20
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb51
+	.4byte	0xdb6c
 	.uleb128 0x1f
-	.4byte	.LASF2910
+	.4byte	.LASF2911
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc5
 	.byte	0x5
-	.4byte	0xdb94
+	.4byte	0xdbaf
 	.uleb128 0xc
-	.4byte	.LASF2911
+	.4byte	.LASF2912
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2912
+	.4byte	.LASF2913
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2913
+	.4byte	.LASF2914
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2914
+	.4byte	.LASF2915
 	.byte	0x3
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2915
+	.4byte	.LASF2916
 	.byte	0x20
 	.byte	0xc6
 	.byte	0xb
-	.4byte	0xdbdd
+	.4byte	0xdbf8
 	.uleb128 0xe
-	.4byte	.LASF2916
+	.4byte	.LASF2917
 	.byte	0xc6
 	.byte	0xc
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF883
+	.4byte	.LASF884
 	.byte	0xc6
 	.byte	0xd
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2454
+	.4byte	.LASF2455
 	.byte	0xc6
 	.byte	0xe
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF2917
+	.4byte	.LASF2918
 	.byte	0xc6
 	.byte	0xf
-	.4byte	0x310
+	.4byte	0x325
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2918
+	.4byte	.LASF2919
 	.byte	0xc6
 	.byte	0x11
 	.4byte	0x6d
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2919
+	.4byte	.LASF2920
 	.byte	0x10
 	.byte	0xc6
 	.byte	0x2a
-	.4byte	0xdc0e
+	.4byte	0xdc29
 	.uleb128 0x20
 	.string	"sgl"
 	.byte	0xc6
 	.byte	0x2b
-	.4byte	0xdc0e
+	.4byte	0xdc29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2920
+	.4byte	.LASF2921
 	.byte	0xc6
 	.byte	0x2c
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2921
+	.4byte	.LASF2922
 	.byte	0xc6
 	.byte	0x2d
 	.4byte	0x6d
@@ -37123,512 +37113,512 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb94
+	.4byte	0xdbaf
 	.uleb128 0x14
-	.4byte	0x443
-	.4byte	0xdc37
+	.4byte	0x458
+	.4byte	0xdc52
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdc37
+	.4byte	0xdc52
 	.uleb128 0x11
-	.4byte	0x31b
+	.4byte	0x330
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x310
+	.4byte	0x325
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc14
+	.4byte	0xdc2f
 	.uleb128 0x10
-	.4byte	0xdc62
+	.4byte	0xdc7d
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x11
-	.4byte	0x310
+	.4byte	0x325
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc43
+	.4byte	0xdc5e
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdc90
+	.4byte	0xdcab
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0x3ca0
+	.4byte	0x3cb5
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x11
-	.4byte	0x310
+	.4byte	0x325
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc68
+	.4byte	0xdc83
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdcbe
+	.4byte	0xdcd9
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0xdcbe
+	.4byte	0xdcd9
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x11
-	.4byte	0x310
+	.4byte	0x325
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdbdd
+	.4byte	0xdbf8
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc96
+	.4byte	0xdcb1
 	.uleb128 0x14
-	.4byte	0x310
-	.4byte	0xdcf2
+	.4byte	0x325
+	.4byte	0xdd0d
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0x3454
+	.4byte	0x3469
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdb6b
+	.4byte	0xdb86
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdcca
+	.4byte	0xdce5
 	.uleb128 0x10
-	.4byte	0xdd17
+	.4byte	0xdd32
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0x310
+	.4byte	0x325
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdb6b
+	.4byte	0xdb86
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdcf8
+	.4byte	0xdd13
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdd40
+	.4byte	0xdd5b
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0xdc0e
+	.4byte	0xdc29
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdb6b
+	.4byte	0xdb86
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd1d
+	.4byte	0xdd38
 	.uleb128 0x10
-	.4byte	0xdd65
+	.4byte	0xdd80
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0xdc0e
+	.4byte	0xdc29
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdb6b
+	.4byte	0xdb86
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd46
+	.4byte	0xdd61
 	.uleb128 0x14
-	.4byte	0x310
-	.4byte	0xdd8e
+	.4byte	0x325
+	.4byte	0xdda9
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0x331
+	.4byte	0x346
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdb6b
+	.4byte	0xdb86
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd6b
+	.4byte	0xdd86
 	.uleb128 0x10
-	.4byte	0xddae
+	.4byte	0xddc9
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0x310
+	.4byte	0x325
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdb6b
+	.4byte	0xdb86
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd94
+	.4byte	0xddaf
 	.uleb128 0x10
-	.4byte	0xddce
+	.4byte	0xdde9
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0xdc0e
+	.4byte	0xdc29
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdb6b
+	.4byte	0xdb86
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xddb4
+	.4byte	0xddcf
 	.uleb128 0x10
-	.4byte	0xddee
+	.4byte	0xde09
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x11
-	.4byte	0xdb6b
+	.4byte	0xdb86
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xddd4
+	.4byte	0xddef
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xde08
+	.4byte	0xde23
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0x310
+	.4byte	0x325
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xddf4
+	.4byte	0xde0f
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xde22
+	.4byte	0xde3d
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde0e
+	.4byte	0xde29
 	.uleb128 0x14
-	.4byte	0x443
-	.4byte	0xde4b
+	.4byte	0x458
+	.4byte	0xde66
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x11
-	.4byte	0x310
+	.4byte	0x325
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde28
+	.4byte	0xde43
 	.uleb128 0x10
-	.4byte	0xde66
+	.4byte	0xde81
 	.uleb128 0x11
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x11
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x11
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde51
+	.4byte	0xde6c
 	.uleb128 0x19
-	.4byte	.LASF2922
+	.4byte	.LASF2923
 	.byte	0xa
 	.byte	0xc9
-	.4byte	0xb79f
+	.4byte	0xb7b4
 	.uleb128 0x19
-	.4byte	.LASF2923
+	.4byte	.LASF2924
 	.byte	0xa
 	.byte	0xca
-	.4byte	0xb79f
+	.4byte	0xb7b4
 	.uleb128 0x19
-	.4byte	.LASF2924
+	.4byte	.LASF2925
 	.byte	0xa
 	.byte	0xcb
-	.4byte	0xb79f
+	.4byte	0xb7b4
 	.uleb128 0x24
-	.4byte	.LASF2925
-	.uleb128 0x19
 	.4byte	.LASF2926
+	.uleb128 0x19
+	.4byte	.LASF2927
 	.byte	0xc7
 	.byte	0x7
-	.4byte	0xde9d
+	.4byte	0xdeb8
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde8d
+	.4byte	0xdea8
 	.uleb128 0x24
-	.4byte	.LASF2927
-	.uleb128 0x19
 	.4byte	.LASF2928
+	.uleb128 0x19
+	.4byte	.LASF2929
 	.byte	0xc7
 	.byte	0x8
-	.4byte	0xdeb3
+	.4byte	0xdece
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdea3
+	.4byte	0xdebe
 	.uleb128 0x19
-	.4byte	.LASF2929
+	.4byte	.LASF2930
 	.byte	0xc7
 	.byte	0x16
-	.4byte	0xb7a4
+	.4byte	0xb7b9
 	.uleb128 0x19
-	.4byte	.LASF2930
+	.4byte	.LASF2931
 	.byte	0xc8
 	.byte	0x1b
-	.4byte	0xb79f
+	.4byte	0xb7b4
 	.uleb128 0xd
-	.4byte	.LASF2931
+	.4byte	.LASF2932
 	.byte	0x18
 	.byte	0xc9
 	.byte	0xf
-	.4byte	0xdf00
+	.4byte	0xdf1b
 	.uleb128 0xe
-	.4byte	.LASF2865
+	.4byte	.LASF2866
 	.byte	0xc9
 	.byte	0x10
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2864
+	.4byte	.LASF2865
 	.byte	0xc9
 	.byte	0x11
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF986
+	.4byte	.LASF987
 	.byte	0xc9
 	.byte	0x12
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2932
+	.4byte	.LASF2933
 	.byte	0xa0
 	.byte	0xc9
 	.byte	0x15
-	.4byte	0xe044
+	.4byte	0xe05f
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xc9
 	.byte	0x16
-	.4byte	0xa55b
+	.4byte	0xa570
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2933
+	.4byte	.LASF2934
 	.byte	0xc9
 	.byte	0x17
-	.4byte	0xe105
+	.4byte	0xe120
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2934
+	.4byte	.LASF2935
 	.byte	0xc9
 	.byte	0x18
-	.4byte	0xdb05
+	.4byte	0xdb20
 	.byte	0x10
 	.uleb128 0x20
 	.string	"fb"
 	.byte	0xc9
 	.byte	0x19
-	.4byte	0xe10b
+	.4byte	0xe126
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2935
+	.4byte	.LASF2936
 	.byte	0xc9
 	.byte	0x1a
 	.4byte	0xc6
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF261
+	.4byte	.LASF262
 	.byte	0xc9
 	.byte	0x1c
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x4c
 	.uleb128 0xe
-	.4byte	.LASF2897
+	.4byte	.LASF2898
 	.byte	0xc9
 	.byte	0x1d
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2936
+	.4byte	.LASF2937
 	.byte	0xc9
 	.byte	0x1e
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x54
 	.uleb128 0xe
-	.4byte	.LASF2937
+	.4byte	.LASF2938
 	.byte	0xc9
 	.byte	0x1f
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2899
+	.4byte	.LASF2900
 	.byte	0xc9
 	.byte	0x20
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x5c
 	.uleb128 0xe
-	.4byte	.LASF2900
+	.4byte	.LASF2901
 	.byte	0xc9
 	.byte	0x21
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2938
+	.4byte	.LASF2939
 	.byte	0xc9
 	.byte	0x22
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x64
 	.uleb128 0xe
-	.4byte	.LASF2939
+	.4byte	.LASF2940
 	.byte	0xc9
 	.byte	0x23
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x68
 	.uleb128 0x20
 	.string	"lsl"
 	.byte	0xc9
 	.byte	0x24
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x6c
 	.uleb128 0x20
 	.string	"lbl"
 	.byte	0xc9
 	.byte	0x25
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x70
 	.uleb128 0x20
 	.string	"ldl"
 	.byte	0xc9
 	.byte	0x26
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x74
 	.uleb128 0x20
 	.string	"lel"
 	.byte	0xc9
 	.byte	0x27
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2940
+	.4byte	.LASF2941
 	.byte	0xc9
 	.byte	0x28
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x7c
 	.uleb128 0xe
-	.4byte	.LASF2941
+	.4byte	.LASF2942
 	.byte	0xc9
 	.byte	0x29
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x80
 	.uleb128 0x20
 	.string	"fsl"
 	.byte	0xc9
 	.byte	0x2a
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x84
 	.uleb128 0x20
 	.string	"fbl"
 	.byte	0xc9
 	.byte	0x2b
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x88
 	.uleb128 0x20
 	.string	"fdl"
 	.byte	0xc9
 	.byte	0x2c
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x8c
 	.uleb128 0x20
 	.string	"fel"
 	.byte	0xc9
 	.byte	0x2d
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2942
+	.4byte	.LASF2943
 	.byte	0xc9
 	.byte	0x2e
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x94
 	.uleb128 0xe
-	.4byte	.LASF2898
+	.4byte	.LASF2899
 	.byte	0xc9
 	.byte	0x2f
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x98
 	.uleb128 0xe
-	.4byte	.LASF2943
+	.4byte	.LASF2944
 	.byte	0xc9
 	.byte	0x30
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0x9c
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2944
+	.4byte	.LASF2945
 	.byte	0x70
 	.byte	0xb
 	.byte	0x17
-	.4byte	0xe105
+	.4byte	0xe120
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xb
 	.byte	0x18
-	.4byte	0xa55b
+	.4byte	0xa570
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2945
+	.4byte	.LASF2946
 	.byte	0xb
 	.byte	0x19
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x8
 	.uleb128 0x20
 	.string	"len"
@@ -37643,78 +37633,78 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2946
+	.4byte	.LASF2947
 	.byte	0xb
 	.byte	0x1d
-	.4byte	0xe120
+	.4byte	0xe13b
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2947
+	.4byte	.LASF2948
 	.byte	0xb
 	.byte	0x1e
-	.4byte	0xe120
+	.4byte	0xe13b
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2948
+	.4byte	.LASF2949
 	.byte	0xb
 	.byte	0x1f
-	.4byte	0xe12b
+	.4byte	0xe146
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2949
+	.4byte	.LASF2950
 	.byte	0xb
 	.byte	0x21
-	.4byte	0xe14b
+	.4byte	0xe166
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2950
+	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x22
-	.4byte	0xe15c
+	.4byte	0xe177
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2951
+	.4byte	.LASF2952
 	.byte	0xb
 	.byte	0x23
-	.4byte	0xe181
+	.4byte	0xe19c
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2952
+	.4byte	.LASF2953
 	.byte	0xb
 	.byte	0x24
-	.4byte	0xe19c
+	.4byte	0xe1b7
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2953
+	.4byte	.LASF2954
 	.byte	0xb
 	.byte	0x25
-	.4byte	0xe1b2
+	.4byte	0xe1cd
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2954
+	.4byte	.LASF2955
 	.byte	0xb
 	.byte	0x26
-	.4byte	0xe1d6
+	.4byte	0xe1f1
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2955
+	.4byte	.LASF2956
 	.byte	0xb
 	.byte	0x27
-	.4byte	0xe1ec
+	.4byte	0xe207
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2956
+	.4byte	.LASF2957
 	.byte	0xb
 	.byte	0x29
-	.4byte	0x4a2
+	.4byte	0x4b7
 	.byte	0x68
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe044
+	.4byte	0xe05f
 	.uleb128 0x5
-	.4byte	0xdecf
-	.4byte	0xe11b
+	.4byte	0xdeea
+	.4byte	0xe136
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
@@ -37723,38 +37713,38 @@ __exitcall_ebc_exit:
 	.string	"clk"
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe11b
+	.4byte	0xe136
 	.uleb128 0x24
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe126
+	.4byte	0xe141
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xe145
+	.4byte	0xe160
 	.uleb128 0x11
-	.4byte	0xe105
+	.4byte	0xe120
 	.uleb128 0x11
-	.4byte	0xe145
+	.4byte	0xe160
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdf00
+	.4byte	0xdf1b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe131
+	.4byte	0xe14c
 	.uleb128 0x10
-	.4byte	0xe15c
+	.4byte	0xe177
 	.uleb128 0x11
-	.4byte	0xe105
+	.4byte	0xe120
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe151
+	.4byte	0xe16c
 	.uleb128 0x10
-	.4byte	0xe181
+	.4byte	0xe19c
 	.uleb128 0x11
-	.4byte	0xe105
+	.4byte	0xe120
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -37766,36 +37756,36 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe162
+	.4byte	0xe17d
 	.uleb128 0x10
-	.4byte	0xe19c
+	.4byte	0xe1b7
 	.uleb128 0x11
-	.4byte	0xe105
+	.4byte	0xe120
 	.uleb128 0x11
-	.4byte	0x13a
+	.4byte	0x13f
 	.uleb128 0x11
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe187
+	.4byte	0xe1a2
 	.uleb128 0x10
-	.4byte	0xe1b2
+	.4byte	0xe1cd
 	.uleb128 0x11
-	.4byte	0xe105
+	.4byte	0xe120
 	.uleb128 0x11
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1a2
+	.4byte	0xe1bd
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xe1d6
+	.4byte	0xe1f1
 	.uleb128 0x11
-	.4byte	0xe105
+	.4byte	0xe120
 	.uleb128 0x11
-	.4byte	0x355e
+	.4byte	0x3573
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -37803,127 +37793,127 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1b8
+	.4byte	0xe1d3
 	.uleb128 0x10
-	.4byte	0xe1ec
+	.4byte	0xe207
 	.uleb128 0x11
-	.4byte	0xe105
+	.4byte	0xe120
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1dc
+	.4byte	0xe1f7
 	.uleb128 0x26
-	.4byte	.LASF2958
+	.4byte	.LASF2959
 	.2byte	0x268
 	.byte	0x1
 	.byte	0x33
-	.4byte	0xe40e
+	.4byte	0xe429
 	.uleb128 0xe
-	.4byte	.LASF2959
+	.4byte	.LASF2960
 	.byte	0x1
 	.byte	0x34
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2960
+	.4byte	.LASF2961
 	.byte	0x1
 	.byte	0x35
-	.4byte	0x219
+	.4byte	0x21e
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2961
+	.4byte	.LASF2962
 	.byte	0x1
 	.byte	0x36
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2962
+	.4byte	.LASF2963
 	.byte	0x1
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2963
+	.4byte	.LASF2964
 	.byte	0x1
 	.byte	0x38
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2964
+	.4byte	.LASF2965
 	.byte	0x1
 	.byte	0x39
 	.4byte	0xc6
 	.byte	0x1c
 	.uleb128 0xe
-	.4byte	.LASF2965
+	.4byte	.LASF2966
 	.byte	0x1
 	.byte	0x3a
 	.4byte	0x61
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2966
+	.4byte	.LASF2967
 	.byte	0x1
 	.byte	0x3b
 	.4byte	0x61
 	.byte	0x21
 	.uleb128 0xe
-	.4byte	.LASF2967
+	.4byte	.LASF2968
 	.byte	0x1
 	.byte	0x3c
 	.4byte	0xc6
 	.byte	0x24
 	.uleb128 0xe
-	.4byte	.LASF2968
+	.4byte	.LASF2969
 	.byte	0x1
 	.byte	0x3d
 	.4byte	0xc6
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2969
+	.4byte	.LASF2970
 	.byte	0x1
 	.byte	0x3e
 	.4byte	0xc6
 	.byte	0x2c
 	.uleb128 0xe
-	.4byte	.LASF2970
+	.4byte	.LASF2971
 	.byte	0x1
 	.byte	0x3f
 	.4byte	0xc6
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2897
+	.4byte	.LASF2898
 	.byte	0x1
 	.byte	0x40
 	.4byte	0xc6
 	.byte	0x34
 	.uleb128 0xe
-	.4byte	.LASF261
+	.4byte	.LASF262
 	.byte	0x1
 	.byte	0x41
 	.4byte	0xc6
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2971
+	.4byte	.LASF2972
 	.byte	0x1
 	.byte	0x42
-	.4byte	0x4669
+	.4byte	0x467e
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2972
+	.4byte	.LASF2973
 	.byte	0x1
 	.byte	0x43
 	.4byte	0xc6
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2973
+	.4byte	.LASF2974
 	.byte	0x1
 	.byte	0x44
 	.4byte	0xc6
 	.byte	0x4c
 	.uleb128 0xe
-	.4byte	.LASF2974
+	.4byte	.LASF2975
 	.byte	0x1
 	.byte	0x45
 	.4byte	0xc6
@@ -37932,3044 +37922,3068 @@ __exitcall_ebc_exit:
 	.string	"dev"
 	.byte	0x1
 	.byte	0x46
-	.4byte	0xa55b
+	.4byte	0xa570
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
 	.byte	0x47
-	.4byte	0xd871
+	.4byte	0xd88c
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2976
+	.4byte	.LASF2977
 	.byte	0x1
 	.byte	0x48
-	.4byte	0x2ef0
+	.4byte	0x2f05
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2977
+	.4byte	.LASF2978
 	.byte	0x1
 	.byte	0x4a
-	.4byte	0x4669
+	.4byte	0x467e
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF2978
+	.4byte	.LASF2979
 	.byte	0x1
 	.byte	0x4b
-	.4byte	0x4669
+	.4byte	0x467e
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF2979
+	.4byte	.LASF2980
 	.byte	0x1
 	.byte	0x4c
-	.4byte	0x4669
+	.4byte	0x467e
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2980
+	.4byte	.LASF2981
 	.byte	0x1
 	.byte	0x4e
-	.4byte	0xc0ad
+	.4byte	0xc0c8
 	.byte	0x98
 	.uleb128 0xe
-	.4byte	.LASF2981
+	.4byte	.LASF2982
 	.byte	0x1
 	.byte	0x4f
-	.4byte	0xc0ad
+	.4byte	0xc0c8
 	.byte	0xa0
 	.uleb128 0xe
-	.4byte	.LASF2982
+	.4byte	.LASF2983
 	.byte	0x1
 	.byte	0x50
-	.4byte	0xe40e
+	.4byte	0xe429
 	.byte	0xa8
 	.uleb128 0xe
-	.4byte	.LASF2983
+	.4byte	.LASF2984
 	.byte	0x1
 	.byte	0x51
 	.4byte	0xc6
 	.byte	0xb8
 	.uleb128 0xe
-	.4byte	.LASF2984
+	.4byte	.LASF2985
 	.byte	0x1
 	.byte	0x52
 	.4byte	0xc6
 	.byte	0xbc
 	.uleb128 0xe
-	.4byte	.LASF2985
+	.4byte	.LASF2986
 	.byte	0x1
 	.byte	0x53
-	.4byte	0x219
+	.4byte	0x21e
 	.byte	0xc0
 	.uleb128 0xe
-	.4byte	.LASF2986
+	.4byte	.LASF2987
 	.byte	0x1
 	.byte	0x54
-	.4byte	0xe41e
+	.4byte	0xe439
 	.byte	0xc8
 	.uleb128 0xe
-	.4byte	.LASF2987
+	.4byte	.LASF2988
 	.byte	0x1
 	.byte	0x55
-	.4byte	0xe41e
+	.4byte	0xe439
 	.byte	0xd0
 	.uleb128 0xe
-	.4byte	.LASF2988
+	.4byte	.LASF2989
 	.byte	0x1
 	.byte	0x57
-	.4byte	0xd7e7
+	.4byte	0xd802
 	.byte	0xd8
 	.uleb128 0x27
-	.4byte	.LASF2989
+	.4byte	.LASF2990
 	.byte	0x1
 	.byte	0x58
 	.4byte	0xc6
 	.2byte	0x1a8
 	.uleb128 0x27
-	.4byte	.LASF2990
+	.4byte	.LASF2991
 	.byte	0x1
 	.byte	0x5a
 	.4byte	0xc6
 	.2byte	0x1ac
 	.uleb128 0x27
-	.4byte	.LASF2991
+	.4byte	.LASF2992
 	.byte	0x1
 	.byte	0x5c
-	.4byte	0x315d
+	.4byte	0x3172
 	.2byte	0x1b0
 	.uleb128 0x27
-	.4byte	.LASF2992
+	.4byte	.LASF2993
 	.byte	0x1
 	.byte	0x5f
-	.4byte	0x315d
+	.4byte	0x3172
 	.2byte	0x1e8
 	.uleb128 0x27
-	.4byte	.LASF2993
+	.4byte	.LASF2994
 	.byte	0x1
 	.byte	0x62
-	.4byte	0x31f6
+	.4byte	0x320b
 	.2byte	0x220
 	.uleb128 0x27
-	.4byte	.LASF2994
+	.4byte	.LASF2995
 	.byte	0x1
 	.byte	0x65
 	.4byte	0xc6
 	.2byte	0x250
 	.uleb128 0x27
-	.4byte	.LASF2995
+	.4byte	.LASF2996
 	.byte	0x1
 	.byte	0x67
 	.4byte	0xc6
 	.2byte	0x254
 	.uleb128 0x27
-	.4byte	.LASF2996
+	.4byte	.LASF2997
 	.byte	0x1
 	.byte	0x69
 	.4byte	0xc6
 	.2byte	0x258
 	.uleb128 0x27
-	.4byte	.LASF2997
+	.4byte	.LASF2998
 	.byte	0x1
 	.byte	0x6b
 	.4byte	0xc6
 	.2byte	0x25c
 	.uleb128 0x27
-	.4byte	.LASF2998
+	.4byte	.LASF2999
 	.byte	0x1
 	.byte	0x6c
 	.4byte	0xc6
 	.2byte	0x260
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x443
-	.4byte	0xe41e
+	.4byte	0x458
+	.4byte	0xe439
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd8d1
+	.4byte	0xd8ec
 	.uleb128 0x4a
 	.string	"ebc"
 	.2byte	0x320
 	.byte	0x1
 	.byte	0x6f
-	.4byte	0xe46e
+	.4byte	0xe489
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x1
 	.byte	0x70
-	.4byte	0xa55b
+	.4byte	0xa570
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2933
+	.4byte	.LASF2934
 	.byte	0x1
 	.byte	0x71
-	.4byte	0xe105
+	.4byte	0xe120
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2934
+	.4byte	.LASF2935
 	.byte	0x1
 	.byte	0x72
-	.4byte	0xdb05
+	.4byte	0xdb20
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2999
+	.4byte	.LASF3000
 	.byte	0x1
 	.byte	0x73
-	.4byte	0xdf00
+	.4byte	0xdf1b
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1773
+	.4byte	.LASF1774
 	.byte	0x1
 	.byte	0x74
-	.4byte	0xe1f2
+	.4byte	0xe20d
 	.byte	0xb8
 	.byte	0
 	.uleb128 0x4b
-	.4byte	.LASF3000
+	.4byte	.LASF3001
 	.byte	0x1
 	.byte	0x77
-	.4byte	0xe483
+	.4byte	0xe49e
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	global_ebc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe424
+	.4byte	0xe43f
 	.uleb128 0x4b
-	.4byte	.LASF3001
+	.4byte	.LASF3002
 	.byte	0x1
 	.byte	0x78
-	.4byte	0x2ef0
+	.4byte	0x2f05
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_auto_task
 	.uleb128 0x4b
-	.4byte	.LASF3002
+	.4byte	.LASF3003
 	.byte	0x1
 	.byte	0x79
-	.4byte	0x4e21
+	.4byte	0x4e36
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	auto_buf_sema
 	.uleb128 0x4b
-	.4byte	.LASF3003
+	.4byte	.LASF3004
 	.byte	0x1
 	.byte	0x7b
-	.4byte	0x1585
+	.4byte	0x159a
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_wq
 	.uleb128 0x4b
-	.4byte	.LASF3004
+	.4byte	.LASF3005
 	.byte	0x1
 	.byte	0x7c
-	.4byte	0x1585
+	.4byte	0x159a
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_thread_wq
 	.uleb128 0x4b
-	.4byte	.LASF3005
+	.4byte	.LASF3006
 	.byte	0x1
 	.byte	0x7d
-	.4byte	0x1585
+	.4byte	0x159a
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_poweroff_wq
 	.uleb128 0x4b
-	.4byte	.LASF3006
+	.4byte	.LASF3007
 	.byte	0x1
 	.byte	0x7e
-	.4byte	0x5b5c
+	.4byte	0x5b71
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_auto_thread_sem
 	.uleb128 0x4c
-	.4byte	.LASF3007
+	.4byte	.LASF3008
 	.byte	0x1
-	.2byte	0x79c
-	.4byte	0x7b4
+	.2byte	0x7a2
+	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_ops
 	.uleb128 0x4c
-	.4byte	.LASF3008
+	.4byte	.LASF3009
 	.byte	0x1
-	.2byte	0x7a6
-	.4byte	0xc5f5
+	.2byte	0x7ac
+	.4byte	0xc610
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_misc
 	.uleb128 0x4c
-	.4byte	.LASF3009
+	.4byte	.LASF3010
 	.byte	0x1
-	.2byte	0x7b5
-	.4byte	0xb388
+	.2byte	0x7bb
+	.4byte	0xb39d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_waveform_version
 	.uleb128 0x4c
-	.4byte	.LASF3010
+	.4byte	.LASF3011
 	.byte	0x1
-	.2byte	0x7c0
-	.4byte	0xb388
+	.2byte	0x7c6
+	.4byte	0xb39d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_name
 	.uleb128 0x4c
-	.4byte	.LASF3011
+	.4byte	.LASF3012
 	.byte	0x1
-	.2byte	0x7ce
-	.4byte	0xb388
+	.2byte	0x7d4
+	.4byte	0xb39d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_temp
 	.uleb128 0x4c
-	.4byte	.LASF3012
+	.4byte	.LASF3013
 	.byte	0x1
-	.2byte	0x7f1
-	.4byte	0xb388
+	.2byte	0x7f7
+	.4byte	0xb39d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_vcom
 	.uleb128 0x4c
-	.4byte	.LASF3013
+	.4byte	.LASF3014
 	.byte	0x1
-	.2byte	0x7fb
-	.4byte	0xb388
+	.2byte	0x801
+	.4byte	0xb39d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_version
 	.uleb128 0x4c
-	.4byte	.LASF3014
+	.4byte	.LASF3015
 	.byte	0x1
-	.2byte	0x804
-	.4byte	0xb388
+	.2byte	0x80a
+	.4byte	0xb39d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_state
 	.uleb128 0x4c
-	.4byte	.LASF3015
+	.4byte	.LASF3016
 	.byte	0x1
-	.2byte	0x80d
-	.4byte	0xb388
+	.2byte	0x813
+	.4byte	0xb39d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_buf_state
 	.uleb128 0x4c
-	.4byte	.LASF3016
+	.4byte	.LASF3017
 	.byte	0x1
-	.2byte	0x9a8
-	.4byte	0xa547
+	.2byte	0x9c2
+	.4byte	0xa55c
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_pm
 	.uleb128 0x5
-	.4byte	0xb186
-	.4byte	0xe5f3
+	.4byte	0xb19b
+	.4byte	0xe60e
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe5e3
+	.4byte	0xe5fe
 	.uleb128 0x4c
-	.4byte	.LASF3017
+	.4byte	.LASF3018
 	.byte	0x1
-	.2byte	0x9ad
-	.4byte	0xe5f3
+	.2byte	0x9c7
+	.4byte	0xe60e
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_match
 	.uleb128 0x4c
-	.4byte	.LASF3018
+	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x9b3
-	.4byte	0xd683
+	.2byte	0x9cd
+	.4byte	0xd69e
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_driver
 	.uleb128 0x4c
-	.4byte	.LASF3019
+	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x9c7
-	.4byte	0x443
+	.2byte	0x9e1
+	.4byte	0x458
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init2503
+	.8byte	__addressable_ebc_init2529
 	.uleb128 0x4c
-	.4byte	.LASF3020
+	.4byte	.LASF3021
 	.byte	0x1
-	.2byte	0x9c8
-	.4byte	0x497
+	.2byte	0x9e2
+	.4byte	0x4ac
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	__exitcall_ebc_exit
 	.uleb128 0x4d
-	.4byte	.LASF3070
+	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0x9c2
+	.2byte	0x9dc
 	.8byte	.LFB2853
 	.8byte	.LFE2853-.LFB2853
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe67c
+	.4byte	0xe697
 	.uleb128 0x4e
 	.8byte	.LVL64
-	.4byte	0x141da
+	.4byte	0x142fc
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3021
+	.4byte	.LASF3022
 	.byte	0x1
-	.2byte	0x9bd
+	.2byte	0x9d7
 	.4byte	0xc6
 	.8byte	.LFB2852
 	.8byte	.LFE2852-.LFB2852
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe6ac
+	.4byte	0xe6c7
 	.uleb128 0x4e
 	.8byte	.LVL352
-	.4byte	0x141e6
+	.4byte	0x14308
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3022
+	.4byte	.LASF3023
 	.byte	0x1
-	.2byte	0x99c
+	.2byte	0x9b6
 	.4byte	0xc6
 	.8byte	.LFB2851
 	.8byte	.LFE2851-.LFB2851
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe748
+	.4byte	0xe763
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x99c
-	.4byte	0xa55b
+	.2byte	0x9b6
+	.4byte	0xa570
 	.4byte	.LLST11
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x99e
-	.4byte	0xe483
+	.2byte	0x9b8
+	.4byte	0xe49e
 	.uleb128 0x46
-	.4byte	.LASF2958
+	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x99f
-	.4byte	0xe748
+	.2byte	0x9b9
+	.4byte	0xe763
 	.uleb128 0x53
-	.4byte	0x135cb
-	.8byte	.LBB928
-	.8byte	.LBE928-.LBB928
+	.4byte	0x13697
+	.8byte	.LBB940
+	.8byte	.LBE940-.LBB940
 	.byte	0x1
-	.2byte	0x99e
-	.4byte	0xe718
+	.2byte	0x9b8
+	.4byte	0xe733
 	.uleb128 0x54
-	.4byte	0x135dc
+	.4byte	0x136a8
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131bc
-	.8byte	.LBB930
-	.8byte	.LBE930-.LBB930
+	.4byte	0x13288
+	.8byte	.LBB942
+	.8byte	.LBE942-.LBB942
 	.byte	0x1
-	.2byte	0x9a1
-	.4byte	0xe73a
+	.2byte	0x9bb
+	.4byte	0xe755
 	.uleb128 0x54
-	.4byte	0x131c8
+	.4byte	0x13294
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL68
-	.4byte	0x141f2
+	.4byte	0x14314
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1f2
+	.4byte	0xe20d
 	.uleb128 0x50
-	.4byte	.LASF3024
+	.4byte	.LASF3025
 	.byte	0x1
-	.2byte	0x98b
+	.2byte	0x9a5
 	.4byte	0xc6
 	.8byte	.LFB2850
 	.8byte	.LFE2850-.LFB2850
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe855
+	.4byte	0xe870
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x98b
-	.4byte	0xa55b
+	.2byte	0x9a5
+	.4byte	0xa570
 	.4byte	.LLST146
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x98d
-	.4byte	0xe483
+	.2byte	0x9a7
+	.4byte	0xe49e
 	.uleb128 0x46
-	.4byte	.LASF2958
+	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x98e
-	.4byte	0xe748
+	.2byte	0x9a8
+	.4byte	0xe763
 	.uleb128 0x55
-	.4byte	.LASF3025
-	.4byte	0xe865
+	.4byte	.LASF3026
+	.4byte	0xe880
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35267
+	.8byte	__func__.35274
 	.uleb128 0x53
-	.4byte	0x135cb
-	.8byte	.LBB1412
-	.8byte	.LBE1412-.LBB1412
+	.4byte	0x13697
+	.8byte	.LBB1424
+	.8byte	.LBE1424-.LBB1424
 	.byte	0x1
-	.2byte	0x98d
-	.4byte	0xe7cd
+	.2byte	0x9a7
+	.4byte	0xe7e8
 	.uleb128 0x54
-	.4byte	0x135dc
+	.4byte	0x136a8
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131d4
-	.8byte	.LBB1414
-	.8byte	.LBE1414-.LBB1414
+	.4byte	0x132a0
+	.8byte	.LBB1426
+	.8byte	.LBE1426-.LBB1426
 	.byte	0x1
-	.2byte	0x996
-	.4byte	0xe7ef
+	.2byte	0x9b0
+	.4byte	0xe80a
 	.uleb128 0x54
-	.4byte	0x131e0
+	.4byte	0x132ac
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12f22
-	.8byte	.LBB1416
-	.8byte	.LBE1416-.LBB1416
+	.4byte	0x12fee
+	.8byte	.LBB1428
+	.8byte	.LBE1428-.LBB1428
 	.byte	0x1
-	.2byte	0x992
-	.4byte	0xe83a
+	.2byte	0x9ac
+	.4byte	0xe855
 	.uleb128 0x54
-	.4byte	0x12f3d
+	.4byte	0x13009
 	.uleb128 0x54
-	.4byte	0x12f32
+	.4byte	0x12ffe
 	.uleb128 0x56
-	.8byte	.LBB1417
-	.8byte	.LBE1417-.LBB1417
+	.8byte	.LBB1429
+	.8byte	.LBE1429-.LBB1429
 	.uleb128 0x57
-	.4byte	0x12f48
+	.4byte	0x13014
 	.uleb128 0x4e
 	.8byte	.LVL517
-	.4byte	0x1406a
+	.4byte	0x1418c
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL515
-	.4byte	0x141f2
+	.4byte	0x14314
 	.uleb128 0x4e
 	.8byte	.LVL516
-	.4byte	0x141f2
+	.4byte	0x14314
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xe865
+	.4byte	0xe880
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xb
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe855
+	.4byte	0xe870
 	.uleb128 0x4f
-	.4byte	.LASF3026
+	.4byte	.LASF3027
 	.byte	0x1
-	.2byte	0x984
+	.2byte	0x99e
 	.4byte	0xc6
 	.8byte	.LFB2849
 	.8byte	.LFE2849-.LFB2849
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe8aa
+	.4byte	0xe8c5
 	.uleb128 0x58
-	.4byte	.LASF3027
+	.4byte	.LASF3028
 	.byte	0x1
-	.2byte	0x984
-	.4byte	0xd6ff
+	.2byte	0x99e
+	.4byte	0xd71a
 	.4byte	.LLST13
 	.uleb128 0x4e
 	.8byte	.LVL74
-	.4byte	0x141ff
+	.4byte	0x14321
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3028
+	.4byte	.LASF3029
 	.byte	0x1
-	.2byte	0x917
+	.2byte	0x91d
 	.4byte	0xc6
 	.8byte	.LFB2848
 	.8byte	.LFE2848-.LFB2848
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfca4
+	.4byte	0xfd3c
 	.uleb128 0x58
-	.4byte	.LASF3027
+	.4byte	.LASF3028
 	.byte	0x1
-	.2byte	0x917
-	.4byte	0xd6ff
+	.2byte	0x91d
+	.4byte	0xd71a
 	.4byte	.LLST147
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x919
-	.4byte	0xa55b
+	.2byte	0x91f
+	.4byte	0xa570
 	.uleb128 0x46
-	.4byte	.LASF3029
+	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0x91a
-	.4byte	0xb87f
+	.2byte	0x920
+	.4byte	0xb894
 	.uleb128 0x59
-	.4byte	.LASF3030
+	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0x91b
-	.4byte	0xd6ff
+	.2byte	0x921
+	.4byte	0xd71a
 	.4byte	.LLST148
 	.uleb128 0x46
-	.4byte	.LASF3031
+	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0x91c
-	.4byte	0xb87f
+	.2byte	0x922
+	.4byte	0xb894
 	.uleb128 0x59
-	.4byte	.LASF3032
+	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0x91d
-	.4byte	0xc028
+	.2byte	0x923
+	.4byte	0xc043
 	.4byte	.LLST149
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x91e
-	.4byte	0xe483
+	.2byte	0x924
+	.4byte	0xe49e
 	.uleb128 0x59
-	.4byte	.LASF2958
+	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x91f
-	.4byte	0xe748
+	.2byte	0x925
+	.4byte	0xe763
 	.4byte	.LLST150
 	.uleb128 0x46
-	.4byte	.LASF2999
+	.4byte	.LASF3000
 	.byte	0x1
-	.2byte	0x920
-	.4byte	0xe145
+	.2byte	0x926
+	.4byte	0xe160
+	.uleb128 0x59
+	.4byte	.LASF962
+	.byte	0x1
+	.2byte	0x927
+	.4byte	0xbcc0
+	.4byte	.LLST151
+	.uleb128 0x46
+	.4byte	.LASF2421
+	.byte	0x1
+	.2byte	0x928
+	.4byte	0xbc60
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x921
+	.2byte	0x929
+	.4byte	0xc6
+	.uleb128 0x59
+	.4byte	.LASF987
+	.byte	0x1
+	.2byte	0x92a
 	.4byte	0xc6
+	.4byte	.LLST152
 	.uleb128 0x5a
-	.4byte	0x135e9
-	.8byte	.LBB1563
+	.string	"i"
+	.byte	0x1
+	.2byte	0x92b
+	.4byte	0xc6
+	.4byte	.LLST153
+	.uleb128 0x5b
+	.4byte	0x136b5
+	.8byte	.LBB1580
 	.4byte	.Ldebug_ranges0+0xc00
 	.byte	0x1
-	.2byte	0x923
-	.4byte	0xe989
+	.2byte	0x92d
+	.4byte	0xe9de
 	.uleb128 0x54
-	.4byte	0x13612
+	.4byte	0x136de
 	.uleb128 0x54
-	.4byte	0x13606
+	.4byte	0x136d2
 	.uleb128 0x54
-	.4byte	0x135fa
+	.4byte	0x136c6
 	.uleb128 0x4e
 	.8byte	.LVL520
-	.4byte	0x1420b
+	.4byte	0x1432d
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x134c6
-	.8byte	.LBB1567
-	.8byte	.LBE1567-.LBB1567
+	.4byte	0x13592
+	.8byte	.LBB1584
+	.8byte	.LBE1584-.LBB1584
 	.byte	0x1
-	.2byte	0x935
-	.4byte	0xe9c8
+	.2byte	0x93f
+	.4byte	0xea1d
 	.uleb128 0x54
-	.4byte	0x134d6
-	.uleb128 0x5b
-	.4byte	0x135cb
-	.8byte	.LBB1568
-	.8byte	.LBE1568-.LBB1568
+	.4byte	0x135a2
+	.uleb128 0x5c
+	.4byte	0x13697
+	.8byte	.LBB1585
+	.8byte	.LBE1585-.LBB1585
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x54
-	.4byte	0x135dc
+	.4byte	0x136a8
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x134e8
-	.8byte	.LBB1570
-	.8byte	.LBE1570-.LBB1570
+	.4byte	0x135b4
+	.8byte	.LBB1587
+	.8byte	.LBE1587-.LBB1587
 	.byte	0x1
-	.2byte	0x946
-	.4byte	0xea08
+	.2byte	0x95a
+	.4byte	0xea5d
 	.uleb128 0x54
-	.4byte	0x134f9
-	.uleb128 0x5c
-	.4byte	0x135cb
-	.8byte	.LBB1571
-	.8byte	.LBE1571-.LBB1571
+	.4byte	0x135c5
+	.uleb128 0x5d
+	.4byte	0x13697
+	.8byte	.LBB1588
+	.8byte	.LBE1588-.LBB1588
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x54
-	.4byte	0x135dc
+	.4byte	0x136a8
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x11635
-	.8byte	.LBB1573
+	.uleb128 0x5b
+	.4byte	0x116cd
+	.8byte	.LBB1590
 	.4byte	.Ldebug_ranges0+0xc30
 	.byte	0x1
-	.2byte	0x954
-	.4byte	0xf3c1
+	.2byte	0x96e
+	.4byte	0xf432
 	.uleb128 0x54
-	.4byte	0x11646
-	.uleb128 0x5d
+	.4byte	0x116de
+	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xc30
 	.uleb128 0x57
-	.4byte	0x11652
-	.uleb128 0x5a
-	.4byte	0x1350c
-	.8byte	.LBB1575
-	.4byte	.Ldebug_ranges0+0xc90
+	.4byte	0x116ea
+	.uleb128 0x5b
+	.4byte	0x135d8
+	.8byte	.LBB1592
+	.4byte	.Ldebug_ranges0+0xc80
 	.byte	0x1
-	.2byte	0x67e
-	.4byte	0xea98
+	.2byte	0x684
+	.4byte	0xeaed
 	.uleb128 0x54
-	.4byte	0x13534
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x13528
+	.4byte	0x135f4
 	.uleb128 0x54
-	.4byte	0x1351d
-	.uleb128 0x5e
-	.4byte	0x13541
-	.8byte	.LBB1576
-	.4byte	.Ldebug_ranges0+0xc90
+	.4byte	0x135e9
+	.uleb128 0x5f
+	.4byte	0x1360d
+	.8byte	.LBB1593
+	.4byte	.Ldebug_ranges0+0xc80
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13575
+	.4byte	0x13641
 	.uleb128 0x54
-	.4byte	0x13569
+	.4byte	0x13635
 	.uleb128 0x54
-	.4byte	0x1355d
+	.4byte	0x13629
 	.uleb128 0x54
-	.4byte	0x13552
-	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xc90
+	.4byte	0x1361e
+	.uleb128 0x5e
+	.4byte	.Ldebug_ranges0+0xc80
 	.uleb128 0x57
-	.4byte	0x13580
+	.4byte	0x1364c
 	.uleb128 0x4e
-	.8byte	.LVL528
-	.4byte	0x14218
+	.8byte	.LVL545
+	.4byte	0x1433a
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1350c
-	.8byte	.LBB1587
-	.8byte	.LBE1587-.LBB1587
+	.4byte	0x135d8
+	.8byte	.LBB1604
+	.8byte	.LBE1604-.LBB1604
 	.byte	0x1
-	.2byte	0x681
-	.4byte	0xeb15
+	.2byte	0x687
+	.4byte	0xeb6a
 	.uleb128 0x54
-	.4byte	0x13534
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x13528
+	.4byte	0x135f4
 	.uleb128 0x54
-	.4byte	0x1351d
-	.uleb128 0x5c
-	.4byte	0x13541
-	.8byte	.LBB1588
-	.8byte	.LBE1588-.LBB1588
+	.4byte	0x135e9
+	.uleb128 0x5d
+	.4byte	0x1360d
+	.8byte	.LBB1605
+	.8byte	.LBE1605-.LBB1605
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13575
+	.4byte	0x13641
 	.uleb128 0x54
-	.4byte	0x13569
+	.4byte	0x13635
 	.uleb128 0x54
-	.4byte	0x1355d
+	.4byte	0x13629
 	.uleb128 0x54
-	.4byte	0x13552
+	.4byte	0x1361e
 	.uleb128 0x56
-	.8byte	.LBB1589
-	.8byte	.LBE1589-.LBB1589
+	.8byte	.LBB1606
+	.8byte	.LBE1606-.LBB1606
 	.uleb128 0x57
-	.4byte	0x13580
+	.4byte	0x1364c
 	.uleb128 0x4e
-	.8byte	.LVL529
-	.4byte	0x14218
+	.8byte	.LVL546
+	.4byte	0x1433a
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1350c
-	.8byte	.LBB1590
-	.8byte	.LBE1590-.LBB1590
+	.4byte	0x135d8
+	.8byte	.LBB1607
+	.8byte	.LBE1607-.LBB1607
 	.byte	0x1
-	.2byte	0x684
-	.4byte	0xeb92
+	.2byte	0x68a
+	.4byte	0xebe7
 	.uleb128 0x54
-	.4byte	0x13534
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x13528
+	.4byte	0x135f4
 	.uleb128 0x54
-	.4byte	0x1351d
-	.uleb128 0x5c
-	.4byte	0x13541
-	.8byte	.LBB1591
-	.8byte	.LBE1591-.LBB1591
+	.4byte	0x135e9
+	.uleb128 0x5d
+	.4byte	0x1360d
+	.8byte	.LBB1608
+	.8byte	.LBE1608-.LBB1608
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13575
+	.4byte	0x13641
 	.uleb128 0x54
-	.4byte	0x13569
+	.4byte	0x13635
 	.uleb128 0x54
-	.4byte	0x1355d
+	.4byte	0x13629
 	.uleb128 0x54
-	.4byte	0x13552
+	.4byte	0x1361e
 	.uleb128 0x56
-	.8byte	.LBB1592
-	.8byte	.LBE1592-.LBB1592
+	.8byte	.LBB1609
+	.8byte	.LBE1609-.LBB1609
 	.uleb128 0x57
-	.4byte	0x13580
+	.4byte	0x1364c
 	.uleb128 0x4e
-	.8byte	.LVL530
-	.4byte	0x14218
+	.8byte	.LVL547
+	.4byte	0x1433a
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1350c
-	.8byte	.LBB1593
-	.8byte	.LBE1593-.LBB1593
+	.4byte	0x135d8
+	.8byte	.LBB1610
+	.8byte	.LBE1610-.LBB1610
 	.byte	0x1
-	.2byte	0x687
-	.4byte	0xec0f
+	.2byte	0x68d
+	.4byte	0xec64
 	.uleb128 0x54
-	.4byte	0x13534
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x13528
+	.4byte	0x135f4
 	.uleb128 0x54
-	.4byte	0x1351d
-	.uleb128 0x5c
-	.4byte	0x13541
-	.8byte	.LBB1594
-	.8byte	.LBE1594-.LBB1594
+	.4byte	0x135e9
+	.uleb128 0x5d
+	.4byte	0x1360d
+	.8byte	.LBB1611
+	.8byte	.LBE1611-.LBB1611
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13575
+	.4byte	0x13641
 	.uleb128 0x54
-	.4byte	0x13569
+	.4byte	0x13635
 	.uleb128 0x54
-	.4byte	0x1355d
+	.4byte	0x13629
 	.uleb128 0x54
-	.4byte	0x13552
+	.4byte	0x1361e
 	.uleb128 0x56
-	.8byte	.LBB1595
-	.8byte	.LBE1595-.LBB1595
+	.8byte	.LBB1612
+	.8byte	.LBE1612-.LBB1612
 	.uleb128 0x57
-	.4byte	0x13580
+	.4byte	0x1364c
 	.uleb128 0x4e
-	.8byte	.LVL531
-	.4byte	0x14218
+	.8byte	.LVL548
+	.4byte	0x1433a
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1350c
-	.8byte	.LBB1596
-	.8byte	.LBE1596-.LBB1596
+	.4byte	0x135d8
+	.8byte	.LBB1613
+	.8byte	.LBE1613-.LBB1613
 	.byte	0x1
-	.2byte	0x68a
-	.4byte	0xec8c
+	.2byte	0x690
+	.4byte	0xece1
 	.uleb128 0x54
-	.4byte	0x13534
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x13528
+	.4byte	0x135f4
 	.uleb128 0x54
-	.4byte	0x1351d
-	.uleb128 0x5c
-	.4byte	0x13541
-	.8byte	.LBB1597
-	.8byte	.LBE1597-.LBB1597
+	.4byte	0x135e9
+	.uleb128 0x5d
+	.4byte	0x1360d
+	.8byte	.LBB1614
+	.8byte	.LBE1614-.LBB1614
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13575
+	.4byte	0x13641
 	.uleb128 0x54
-	.4byte	0x13569
+	.4byte	0x13635
 	.uleb128 0x54
-	.4byte	0x1355d
+	.4byte	0x13629
 	.uleb128 0x54
-	.4byte	0x13552
+	.4byte	0x1361e
 	.uleb128 0x56
-	.8byte	.LBB1598
-	.8byte	.LBE1598-.LBB1598
+	.8byte	.LBB1615
+	.8byte	.LBE1615-.LBB1615
 	.uleb128 0x57
-	.4byte	0x13580
+	.4byte	0x1364c
 	.uleb128 0x4e
-	.8byte	.LVL532
-	.4byte	0x14218
+	.8byte	.LVL549
+	.4byte	0x1433a
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1350c
-	.8byte	.LBB1599
-	.8byte	.LBE1599-.LBB1599
+	.4byte	0x135d8
+	.8byte	.LBB1616
+	.8byte	.LBE1616-.LBB1616
 	.byte	0x1
-	.2byte	0x68d
-	.4byte	0xed09
+	.2byte	0x693
+	.4byte	0xed5e
 	.uleb128 0x54
-	.4byte	0x13534
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x13528
+	.4byte	0x135f4
 	.uleb128 0x54
-	.4byte	0x1351d
-	.uleb128 0x5c
-	.4byte	0x13541
-	.8byte	.LBB1600
-	.8byte	.LBE1600-.LBB1600
+	.4byte	0x135e9
+	.uleb128 0x5d
+	.4byte	0x1360d
+	.8byte	.LBB1617
+	.8byte	.LBE1617-.LBB1617
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13575
+	.4byte	0x13641
 	.uleb128 0x54
-	.4byte	0x13569
+	.4byte	0x13635
 	.uleb128 0x54
-	.4byte	0x1355d
+	.4byte	0x13629
 	.uleb128 0x54
-	.4byte	0x13552
+	.4byte	0x1361e
 	.uleb128 0x56
-	.8byte	.LBB1601
-	.8byte	.LBE1601-.LBB1601
+	.8byte	.LBB1618
+	.8byte	.LBE1618-.LBB1618
 	.uleb128 0x57
-	.4byte	0x13580
+	.4byte	0x1364c
 	.uleb128 0x4e
-	.8byte	.LVL533
-	.4byte	0x14218
+	.8byte	.LVL550
+	.4byte	0x1433a
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1350c
-	.8byte	.LBB1602
-	.8byte	.LBE1602-.LBB1602
+	.4byte	0x135d8
+	.8byte	.LBB1619
+	.8byte	.LBE1619-.LBB1619
 	.byte	0x1
-	.2byte	0x690
-	.4byte	0xed86
+	.2byte	0x696
+	.4byte	0xeddb
 	.uleb128 0x54
-	.4byte	0x13534
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x13528
+	.4byte	0x135f4
 	.uleb128 0x54
-	.4byte	0x1351d
-	.uleb128 0x5c
-	.4byte	0x13541
-	.8byte	.LBB1603
-	.8byte	.LBE1603-.LBB1603
+	.4byte	0x135e9
+	.uleb128 0x5d
+	.4byte	0x1360d
+	.8byte	.LBB1620
+	.8byte	.LBE1620-.LBB1620
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13575
+	.4byte	0x13641
 	.uleb128 0x54
-	.4byte	0x13569
+	.4byte	0x13635
 	.uleb128 0x54
-	.4byte	0x1355d
+	.4byte	0x13629
 	.uleb128 0x54
-	.4byte	0x13552
+	.4byte	0x1361e
 	.uleb128 0x56
-	.8byte	.LBB1604
-	.8byte	.LBE1604-.LBB1604
+	.8byte	.LBB1621
+	.8byte	.LBE1621-.LBB1621
 	.uleb128 0x57
-	.4byte	0x13580
+	.4byte	0x1364c
 	.uleb128 0x4e
-	.8byte	.LVL534
-	.4byte	0x14218
+	.8byte	.LVL551
+	.4byte	0x1433a
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1350c
-	.8byte	.LBB1605
-	.8byte	.LBE1605-.LBB1605
+	.4byte	0x135d8
+	.8byte	.LBB1622
+	.8byte	.LBE1622-.LBB1622
 	.byte	0x1
-	.2byte	0x693
-	.4byte	0xee03
+	.2byte	0x699
+	.4byte	0xee58
 	.uleb128 0x54
-	.4byte	0x13534
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x13528
+	.4byte	0x135f4
 	.uleb128 0x54
-	.4byte	0x1351d
-	.uleb128 0x5c
-	.4byte	0x13541
-	.8byte	.LBB1606
-	.8byte	.LBE1606-.LBB1606
+	.4byte	0x135e9
+	.uleb128 0x5d
+	.4byte	0x1360d
+	.8byte	.LBB1623
+	.8byte	.LBE1623-.LBB1623
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13575
+	.4byte	0x13641
 	.uleb128 0x54
-	.4byte	0x13569
+	.4byte	0x13635
 	.uleb128 0x54
-	.4byte	0x1355d
+	.4byte	0x13629
 	.uleb128 0x54
-	.4byte	0x13552
+	.4byte	0x1361e
 	.uleb128 0x56
-	.8byte	.LBB1607
-	.8byte	.LBE1607-.LBB1607
+	.8byte	.LBB1624
+	.8byte	.LBE1624-.LBB1624
 	.uleb128 0x57
-	.4byte	0x13580
+	.4byte	0x1364c
 	.uleb128 0x4e
-	.8byte	.LVL535
-	.4byte	0x14218
+	.8byte	.LVL552
+	.4byte	0x1433a
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1350c
-	.8byte	.LBB1608
-	.8byte	.LBE1608-.LBB1608
+	.4byte	0x135d8
+	.8byte	.LBB1625
+	.8byte	.LBE1625-.LBB1625
 	.byte	0x1
-	.2byte	0x696
-	.4byte	0xee80
+	.2byte	0x69c
+	.4byte	0xeed5
 	.uleb128 0x54
-	.4byte	0x13534
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x13528
+	.4byte	0x135f4
 	.uleb128 0x54
-	.4byte	0x1351d
-	.uleb128 0x5c
-	.4byte	0x13541
-	.8byte	.LBB1609
-	.8byte	.LBE1609-.LBB1609
+	.4byte	0x135e9
+	.uleb128 0x5d
+	.4byte	0x1360d
+	.8byte	.LBB1626
+	.8byte	.LBE1626-.LBB1626
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13575
+	.4byte	0x13641
 	.uleb128 0x54
-	.4byte	0x13569
+	.4byte	0x13635
 	.uleb128 0x54
-	.4byte	0x1355d
+	.4byte	0x13629
 	.uleb128 0x54
-	.4byte	0x13552
+	.4byte	0x1361e
 	.uleb128 0x56
-	.8byte	.LBB1610
-	.8byte	.LBE1610-.LBB1610
+	.8byte	.LBB1627
+	.8byte	.LBE1627-.LBB1627
 	.uleb128 0x57
-	.4byte	0x13580
+	.4byte	0x1364c
 	.uleb128 0x4e
-	.8byte	.LVL536
-	.4byte	0x14218
+	.8byte	.LVL553
+	.4byte	0x1433a
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1350c
-	.8byte	.LBB1611
-	.8byte	.LBE1611-.LBB1611
+	.4byte	0x135d8
+	.8byte	.LBB1628
+	.8byte	.LBE1628-.LBB1628
 	.byte	0x1
-	.2byte	0x699
-	.4byte	0xeefd
+	.2byte	0x69f
+	.4byte	0xef52
 	.uleb128 0x54
-	.4byte	0x13534
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x13528
+	.4byte	0x135f4
 	.uleb128 0x54
-	.4byte	0x1351d
-	.uleb128 0x5c
-	.4byte	0x13541
-	.8byte	.LBB1612
-	.8byte	.LBE1612-.LBB1612
+	.4byte	0x135e9
+	.uleb128 0x5d
+	.4byte	0x1360d
+	.8byte	.LBB1629
+	.8byte	.LBE1629-.LBB1629
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13575
+	.4byte	0x13641
 	.uleb128 0x54
-	.4byte	0x13569
+	.4byte	0x13635
 	.uleb128 0x54
-	.4byte	0x1355d
+	.4byte	0x13629
 	.uleb128 0x54
-	.4byte	0x13552
+	.4byte	0x1361e
 	.uleb128 0x56
-	.8byte	.LBB1613
-	.8byte	.LBE1613-.LBB1613
+	.8byte	.LBB1630
+	.8byte	.LBE1630-.LBB1630
 	.uleb128 0x57
-	.4byte	0x13580
+	.4byte	0x1364c
 	.uleb128 0x4e
-	.8byte	.LVL537
-	.4byte	0x14218
+	.8byte	.LVL554
+	.4byte	0x1433a
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1350c
-	.8byte	.LBB1614
-	.8byte	.LBE1614-.LBB1614
+	.4byte	0x135d8
+	.8byte	.LBB1631
+	.8byte	.LBE1631-.LBB1631
 	.byte	0x1
-	.2byte	0x69c
-	.4byte	0xef7a
+	.2byte	0x6a2
+	.4byte	0xefcf
 	.uleb128 0x54
-	.4byte	0x13534
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x13528
+	.4byte	0x135f4
 	.uleb128 0x54
-	.4byte	0x1351d
-	.uleb128 0x5c
-	.4byte	0x13541
-	.8byte	.LBB1615
-	.8byte	.LBE1615-.LBB1615
+	.4byte	0x135e9
+	.uleb128 0x5d
+	.4byte	0x1360d
+	.8byte	.LBB1632
+	.8byte	.LBE1632-.LBB1632
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13575
+	.4byte	0x13641
 	.uleb128 0x54
-	.4byte	0x13569
+	.4byte	0x13635
 	.uleb128 0x54
-	.4byte	0x1355d
+	.4byte	0x13629
 	.uleb128 0x54
-	.4byte	0x13552
+	.4byte	0x1361e
 	.uleb128 0x56
-	.8byte	.LBB1616
-	.8byte	.LBE1616-.LBB1616
+	.8byte	.LBB1633
+	.8byte	.LBE1633-.LBB1633
 	.uleb128 0x57
-	.4byte	0x13580
+	.4byte	0x1364c
 	.uleb128 0x4e
-	.8byte	.LVL538
-	.4byte	0x14218
+	.8byte	.LVL555
+	.4byte	0x1433a
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1350c
-	.8byte	.LBB1617
-	.8byte	.LBE1617-.LBB1617
+	.4byte	0x135d8
+	.8byte	.LBB1634
+	.8byte	.LBE1634-.LBB1634
 	.byte	0x1
-	.2byte	0x69f
-	.4byte	0xeff7
+	.2byte	0x6a5
+	.4byte	0xf04c
 	.uleb128 0x54
-	.4byte	0x13534
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x13528
+	.4byte	0x135f4
 	.uleb128 0x54
-	.4byte	0x1351d
-	.uleb128 0x5c
-	.4byte	0x13541
-	.8byte	.LBB1618
-	.8byte	.LBE1618-.LBB1618
+	.4byte	0x135e9
+	.uleb128 0x5d
+	.4byte	0x1360d
+	.8byte	.LBB1635
+	.8byte	.LBE1635-.LBB1635
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13575
+	.4byte	0x13641
 	.uleb128 0x54
-	.4byte	0x13569
+	.4byte	0x13635
 	.uleb128 0x54
-	.4byte	0x1355d
+	.4byte	0x13629
 	.uleb128 0x54
-	.4byte	0x13552
+	.4byte	0x1361e
 	.uleb128 0x56
-	.8byte	.LBB1619
-	.8byte	.LBE1619-.LBB1619
+	.8byte	.LBB1636
+	.8byte	.LBE1636-.LBB1636
 	.uleb128 0x57
-	.4byte	0x13580
+	.4byte	0x1364c
 	.uleb128 0x4e
-	.8byte	.LVL539
-	.4byte	0x14218
+	.8byte	.LVL556
+	.4byte	0x1433a
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1350c
-	.8byte	.LBB1620
-	.8byte	.LBE1620-.LBB1620
+	.4byte	0x135d8
+	.8byte	.LBB1637
+	.8byte	.LBE1637-.LBB1637
 	.byte	0x1
-	.2byte	0x6a2
-	.4byte	0xf074
+	.2byte	0x6a8
+	.4byte	0xf0c9
 	.uleb128 0x54
-	.4byte	0x13534
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x13528
+	.4byte	0x135f4
 	.uleb128 0x54
-	.4byte	0x1351d
-	.uleb128 0x5c
-	.4byte	0x13541
-	.8byte	.LBB1621
-	.8byte	.LBE1621-.LBB1621
+	.4byte	0x135e9
+	.uleb128 0x5d
+	.4byte	0x1360d
+	.8byte	.LBB1638
+	.8byte	.LBE1638-.LBB1638
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13575
+	.4byte	0x13641
 	.uleb128 0x54
-	.4byte	0x13569
+	.4byte	0x13635
 	.uleb128 0x54
-	.4byte	0x1355d
+	.4byte	0x13629
 	.uleb128 0x54
-	.4byte	0x13552
+	.4byte	0x1361e
 	.uleb128 0x56
-	.8byte	.LBB1622
-	.8byte	.LBE1622-.LBB1622
+	.8byte	.LBB1639
+	.8byte	.LBE1639-.LBB1639
 	.uleb128 0x57
-	.4byte	0x13580
+	.4byte	0x1364c
 	.uleb128 0x4e
-	.8byte	.LVL540
-	.4byte	0x14218
+	.8byte	.LVL557
+	.4byte	0x1433a
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1350c
-	.8byte	.LBB1623
-	.8byte	.LBE1623-.LBB1623
+	.4byte	0x135d8
+	.8byte	.LBB1640
+	.8byte	.LBE1640-.LBB1640
 	.byte	0x1
-	.2byte	0x6a5
-	.4byte	0xf0f1
+	.2byte	0x6ab
+	.4byte	0xf146
 	.uleb128 0x54
-	.4byte	0x13534
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x13528
+	.4byte	0x135f4
 	.uleb128 0x54
-	.4byte	0x1351d
-	.uleb128 0x5c
-	.4byte	0x13541
-	.8byte	.LBB1624
-	.8byte	.LBE1624-.LBB1624
+	.4byte	0x135e9
+	.uleb128 0x5d
+	.4byte	0x1360d
+	.8byte	.LBB1641
+	.8byte	.LBE1641-.LBB1641
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13575
+	.4byte	0x13641
 	.uleb128 0x54
-	.4byte	0x13569
+	.4byte	0x13635
 	.uleb128 0x54
-	.4byte	0x1355d
+	.4byte	0x13629
 	.uleb128 0x54
-	.4byte	0x13552
+	.4byte	0x1361e
 	.uleb128 0x56
-	.8byte	.LBB1625
-	.8byte	.LBE1625-.LBB1625
+	.8byte	.LBB1642
+	.8byte	.LBE1642-.LBB1642
 	.uleb128 0x57
-	.4byte	0x13580
+	.4byte	0x1364c
 	.uleb128 0x4e
-	.8byte	.LVL541
-	.4byte	0x14218
+	.8byte	.LVL558
+	.4byte	0x1433a
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1350c
-	.8byte	.LBB1626
-	.8byte	.LBE1626-.LBB1626
+	.4byte	0x135d8
+	.8byte	.LBB1643
+	.8byte	.LBE1643-.LBB1643
 	.byte	0x1
-	.2byte	0x6a8
-	.4byte	0xf16e
+	.2byte	0x6ae
+	.4byte	0xf1c3
 	.uleb128 0x54
-	.4byte	0x13534
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x13528
+	.4byte	0x135f4
 	.uleb128 0x54
-	.4byte	0x1351d
-	.uleb128 0x5c
-	.4byte	0x13541
-	.8byte	.LBB1627
-	.8byte	.LBE1627-.LBB1627
+	.4byte	0x135e9
+	.uleb128 0x5d
+	.4byte	0x1360d
+	.8byte	.LBB1644
+	.8byte	.LBE1644-.LBB1644
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13575
+	.4byte	0x13641
 	.uleb128 0x54
-	.4byte	0x13569
+	.4byte	0x13635
 	.uleb128 0x54
-	.4byte	0x1355d
+	.4byte	0x13629
 	.uleb128 0x54
-	.4byte	0x13552
+	.4byte	0x1361e
 	.uleb128 0x56
-	.8byte	.LBB1628
-	.8byte	.LBE1628-.LBB1628
+	.8byte	.LBB1645
+	.8byte	.LBE1645-.LBB1645
 	.uleb128 0x57
-	.4byte	0x13580
+	.4byte	0x1364c
 	.uleb128 0x4e
-	.8byte	.LVL542
-	.4byte	0x14218
+	.8byte	.LVL559
+	.4byte	0x1433a
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1350c
-	.8byte	.LBB1629
-	.8byte	.LBE1629-.LBB1629
+	.4byte	0x135d8
+	.8byte	.LBB1646
+	.8byte	.LBE1646-.LBB1646
 	.byte	0x1
-	.2byte	0x6ab
-	.4byte	0xf1eb
+	.2byte	0x6b1
+	.4byte	0xf240
 	.uleb128 0x54
-	.4byte	0x13534
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x13528
+	.4byte	0x135f4
 	.uleb128 0x54
-	.4byte	0x1351d
-	.uleb128 0x5c
-	.4byte	0x13541
-	.8byte	.LBB1630
-	.8byte	.LBE1630-.LBB1630
+	.4byte	0x135e9
+	.uleb128 0x5d
+	.4byte	0x1360d
+	.8byte	.LBB1647
+	.8byte	.LBE1647-.LBB1647
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13575
+	.4byte	0x13641
 	.uleb128 0x54
-	.4byte	0x13569
+	.4byte	0x13635
 	.uleb128 0x54
-	.4byte	0x1355d
+	.4byte	0x13629
 	.uleb128 0x54
-	.4byte	0x13552
+	.4byte	0x1361e
 	.uleb128 0x56
-	.8byte	.LBB1631
-	.8byte	.LBE1631-.LBB1631
+	.8byte	.LBB1648
+	.8byte	.LBE1648-.LBB1648
 	.uleb128 0x57
-	.4byte	0x13580
+	.4byte	0x1364c
 	.uleb128 0x4e
-	.8byte	.LVL543
-	.4byte	0x14218
+	.8byte	.LVL560
+	.4byte	0x1433a
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x1350c
-	.8byte	.LBB1632
-	.4byte	.Ldebug_ranges0+0xce0
+	.uleb128 0x53
+	.4byte	0x135d8
+	.8byte	.LBB1649
+	.8byte	.LBE1649-.LBB1649
 	.byte	0x1
-	.2byte	0x6ae
-	.4byte	0xf261
+	.2byte	0x6b4
+	.4byte	0xf2bd
 	.uleb128 0x54
-	.4byte	0x13534
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x13528
+	.4byte	0x135f4
 	.uleb128 0x54
-	.4byte	0x1351d
-	.uleb128 0x5e
-	.4byte	0x13541
-	.8byte	.LBB1633
-	.4byte	.Ldebug_ranges0+0xce0
+	.4byte	0x135e9
+	.uleb128 0x5d
+	.4byte	0x1360d
+	.8byte	.LBB1650
+	.8byte	.LBE1650-.LBB1650
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13575
+	.4byte	0x13641
 	.uleb128 0x54
-	.4byte	0x13569
+	.4byte	0x13635
 	.uleb128 0x54
-	.4byte	0x1355d
+	.4byte	0x13629
 	.uleb128 0x54
-	.4byte	0x13552
-	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xce0
+	.4byte	0x1361e
+	.uleb128 0x56
+	.8byte	.LBB1651
+	.8byte	.LBE1651-.LBB1651
 	.uleb128 0x57
-	.4byte	0x13580
-	.uleb128 0x4e
-	.8byte	.LVL544
-	.4byte	0x14218
+	.4byte	0x1364c
 	.uleb128 0x4e
-	.8byte	.LVL576
-	.4byte	0x14218
+	.8byte	.LVL561
+	.4byte	0x1433a
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x1350c
-	.8byte	.LBB1639
-	.4byte	.Ldebug_ranges0+0xd20
+	.uleb128 0x53
+	.4byte	0x135d8
+	.8byte	.LBB1652
+	.8byte	.LBE1652-.LBB1652
 	.byte	0x1
-	.2byte	0x6b1
-	.4byte	0xf2d7
+	.2byte	0x6b7
+	.4byte	0xf33a
 	.uleb128 0x54
-	.4byte	0x13534
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x13528
+	.4byte	0x135f4
 	.uleb128 0x54
-	.4byte	0x1351d
-	.uleb128 0x5e
-	.4byte	0x13541
-	.8byte	.LBB1640
-	.4byte	.Ldebug_ranges0+0xd20
+	.4byte	0x135e9
+	.uleb128 0x5d
+	.4byte	0x1360d
+	.8byte	.LBB1653
+	.8byte	.LBE1653-.LBB1653
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13575
+	.4byte	0x13641
 	.uleb128 0x54
-	.4byte	0x13569
+	.4byte	0x13635
 	.uleb128 0x54
-	.4byte	0x1355d
+	.4byte	0x13629
 	.uleb128 0x54
-	.4byte	0x13552
-	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xd20
+	.4byte	0x1361e
+	.uleb128 0x56
+	.8byte	.LBB1654
+	.8byte	.LBE1654-.LBB1654
 	.uleb128 0x57
-	.4byte	0x13580
+	.4byte	0x1364c
 	.uleb128 0x4e
-	.8byte	.LVL545
-	.4byte	0x14218
-	.uleb128 0x4e
-	.8byte	.LVL575
-	.4byte	0x14218
+	.8byte	.LVL562
+	.4byte	0x1433a
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x1350c
-	.8byte	.LBB1646
-	.4byte	.Ldebug_ranges0+0xd60
+	.uleb128 0x53
+	.4byte	0x135d8
+	.8byte	.LBB1655
+	.8byte	.LBE1655-.LBB1655
 	.byte	0x1
-	.2byte	0x6b4
-	.4byte	0xf34d
+	.2byte	0x6ba
+	.4byte	0xf3b7
 	.uleb128 0x54
-	.4byte	0x13534
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x13528
+	.4byte	0x135f4
 	.uleb128 0x54
-	.4byte	0x1351d
-	.uleb128 0x5e
-	.4byte	0x13541
-	.8byte	.LBB1647
-	.4byte	.Ldebug_ranges0+0xd60
+	.4byte	0x135e9
+	.uleb128 0x5d
+	.4byte	0x1360d
+	.8byte	.LBB1656
+	.8byte	.LBE1656-.LBB1656
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13575
+	.4byte	0x13641
 	.uleb128 0x54
-	.4byte	0x13569
+	.4byte	0x13635
 	.uleb128 0x54
-	.4byte	0x1355d
+	.4byte	0x13629
 	.uleb128 0x54
-	.4byte	0x13552
-	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xd60
+	.4byte	0x1361e
+	.uleb128 0x56
+	.8byte	.LBB1657
+	.8byte	.LBE1657-.LBB1657
 	.uleb128 0x57
-	.4byte	0x13580
-	.uleb128 0x4e
-	.8byte	.LVL546
-	.4byte	0x14218
+	.4byte	0x1364c
 	.uleb128 0x4e
-	.8byte	.LVL574
-	.4byte	0x14218
+	.8byte	.LVL563
+	.4byte	0x1433a
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5e
-	.4byte	0x1350c
-	.8byte	.LBB1653
-	.4byte	.Ldebug_ranges0+0xda0
+	.uleb128 0x5d
+	.4byte	0x135d8
+	.8byte	.LBB1658
+	.8byte	.LBE1658-.LBB1658
 	.byte	0x1
-	.2byte	0x6b7
+	.2byte	0x6bd
 	.uleb128 0x54
-	.4byte	0x13534
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x13528
+	.4byte	0x135f4
 	.uleb128 0x54
-	.4byte	0x1351d
-	.uleb128 0x5e
-	.4byte	0x13541
-	.8byte	.LBB1654
-	.4byte	.Ldebug_ranges0+0xda0
+	.4byte	0x135e9
+	.uleb128 0x5d
+	.4byte	0x1360d
+	.8byte	.LBB1659
+	.8byte	.LBE1659-.LBB1659
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13575
+	.4byte	0x13641
 	.uleb128 0x54
-	.4byte	0x13569
+	.4byte	0x13635
 	.uleb128 0x54
-	.4byte	0x1355d
+	.4byte	0x13629
 	.uleb128 0x54
-	.4byte	0x13552
-	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xda0
+	.4byte	0x1361e
+	.uleb128 0x56
+	.8byte	.LBB1660
+	.8byte	.LBE1660-.LBB1660
 	.uleb128 0x57
-	.4byte	0x13580
-	.uleb128 0x4e
-	.8byte	.LVL547
-	.4byte	0x14218
+	.4byte	0x1364c
 	.uleb128 0x4e
-	.8byte	.LVL573
-	.4byte	0x14218
+	.8byte	.LVL564
+	.4byte	0x1433a
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0xfd98
-	.8byte	.LBB1675
-	.4byte	.Ldebug_ranges0+0xde0
+	.uleb128 0x5b
+	.4byte	0xfe30
+	.8byte	.LBB1667
+	.4byte	.Ldebug_ranges0+0xcd0
 	.byte	0x1
-	.2byte	0x960
-	.4byte	0xf56e
+	.2byte	0x97a
+	.4byte	0xf5df
 	.uleb128 0x54
-	.4byte	0xfda9
-	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xde0
-	.uleb128 0x5f
-	.4byte	0xfdb5
-	.4byte	.LLST151
+	.4byte	0xfe41
+	.uleb128 0x5e
+	.4byte	.Ldebug_ranges0+0xcd0
+	.uleb128 0x60
+	.4byte	0xfe4d
+	.4byte	.LLST154
 	.uleb128 0x57
-	.4byte	0xfdc1
+	.4byte	0xfe59
 	.uleb128 0x57
-	.4byte	0xfdcd
+	.4byte	0xfe65
 	.uleb128 0x57
-	.4byte	0xfdd9
-	.uleb128 0x60
-	.4byte	0xfde5
+	.4byte	0xfe71
+	.uleb128 0x61
+	.4byte	0xfe7d
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x57
-	.4byte	0xfdef
+	.4byte	0xfe87
 	.uleb128 0x57
-	.4byte	0xfdfb
+	.4byte	0xfe93
 	.uleb128 0x57
-	.4byte	0xfe07
-	.uleb128 0x5a
-	.4byte	0x1361f
-	.8byte	.LBB1677
-	.4byte	.Ldebug_ranges0+0xe50
+	.4byte	0xfe9f
+	.uleb128 0x5b
+	.4byte	0x136eb
+	.8byte	.LBB1669
+	.4byte	.Ldebug_ranges0+0xd40
 	.byte	0x1
-	.2byte	0x85e
-	.4byte	0xf431
+	.2byte	0x864
+	.4byte	0xf4a2
 	.uleb128 0x54
-	.4byte	0x1362f
+	.4byte	0x136fb
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x135e9
-	.8byte	.LBB1681
-	.4byte	.Ldebug_ranges0+0xe80
+	.uleb128 0x5b
+	.4byte	0x136b5
+	.8byte	.LBB1673
+	.4byte	.Ldebug_ranges0+0xd70
 	.byte	0x1
-	.2byte	0x879
-	.4byte	0xf466
+	.2byte	0x87f
+	.4byte	0xf4d7
 	.uleb128 0x54
-	.4byte	0x13612
+	.4byte	0x136de
 	.uleb128 0x54
-	.4byte	0x13606
+	.4byte	0x136d2
 	.uleb128 0x54
-	.4byte	0x135fa
+	.4byte	0x136c6
 	.uleb128 0x4e
-	.8byte	.LVL553
-	.4byte	0x1420b
+	.8byte	.LVL570
+	.4byte	0x1432d
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135e9
-	.8byte	.LBB1689
-	.8byte	.LBE1689-.LBB1689
+	.4byte	0x136b5
+	.8byte	.LBB1681
+	.8byte	.LBE1681-.LBB1681
 	.byte	0x1
-	.2byte	0x87c
-	.4byte	0xf49f
+	.2byte	0x882
+	.4byte	0xf510
 	.uleb128 0x54
-	.4byte	0x13612
+	.4byte	0x136de
 	.uleb128 0x54
-	.4byte	0x13606
+	.4byte	0x136d2
 	.uleb128 0x54
-	.4byte	0x135fa
+	.4byte	0x136c6
 	.uleb128 0x4e
-	.8byte	.LVL554
-	.4byte	0x1420b
+	.8byte	.LVL571
+	.4byte	0x1432d
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135e9
-	.8byte	.LBB1691
-	.8byte	.LBE1691-.LBB1691
+	.4byte	0x136b5
+	.8byte	.LBB1683
+	.8byte	.LBE1683-.LBB1683
 	.byte	0x1
-	.2byte	0x87f
-	.4byte	0xf4d8
+	.2byte	0x885
+	.4byte	0xf549
 	.uleb128 0x54
-	.4byte	0x13612
+	.4byte	0x136de
 	.uleb128 0x54
-	.4byte	0x13606
+	.4byte	0x136d2
 	.uleb128 0x54
-	.4byte	0x135fa
+	.4byte	0x136c6
 	.uleb128 0x4e
-	.8byte	.LVL555
-	.4byte	0x1420b
+	.8byte	.LVL572
+	.4byte	0x1432d
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135e9
-	.8byte	.LBB1693
-	.8byte	.LBE1693-.LBB1693
+	.4byte	0x136b5
+	.8byte	.LBB1685
+	.8byte	.LBE1685-.LBB1685
 	.byte	0x1
-	.2byte	0x887
-	.4byte	0xf511
+	.2byte	0x88d
+	.4byte	0xf582
 	.uleb128 0x54
-	.4byte	0x13612
+	.4byte	0x136de
 	.uleb128 0x54
-	.4byte	0x13606
+	.4byte	0x136d2
 	.uleb128 0x54
-	.4byte	0x135fa
+	.4byte	0x136c6
 	.uleb128 0x4e
-	.8byte	.LVL556
-	.4byte	0x1420b
+	.8byte	.LVL573
+	.4byte	0x1432d
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL549
-	.4byte	0x14225
+	.8byte	.LVL566
+	.4byte	0x14347
 	.uleb128 0x4e
-	.8byte	.LVL550
-	.4byte	0x14232
+	.8byte	.LVL567
+	.4byte	0x14354
 	.uleb128 0x4e
-	.8byte	.LVL551
-	.4byte	0x1423e
+	.8byte	.LVL568
+	.4byte	0x14360
 	.uleb128 0x4e
-	.8byte	.LVL552
-	.4byte	0x1424a
+	.8byte	.LVL569
+	.4byte	0x1436c
 	.uleb128 0x4e
-	.8byte	.LVL557
-	.4byte	0x14256
+	.8byte	.LVL574
+	.4byte	0x14378
 	.uleb128 0x4e
-	.8byte	.LVL558
-	.4byte	0x14260
+	.8byte	.LVL575
+	.4byte	0x14382
 	.uleb128 0x4e
-	.8byte	.LVL570
-	.4byte	0x1426c
+	.8byte	.LVL588
+	.4byte	0x1438e
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0xfe12
-	.8byte	.LBB1702
-	.4byte	.Ldebug_ranges0+0xed0
+	.uleb128 0x5b
+	.4byte	0xfeaa
+	.8byte	.LBB1694
+	.4byte	.Ldebug_ranges0+0xdc0
 	.byte	0x1
-	.2byte	0x967
-	.4byte	0xf650
+	.2byte	0x981
+	.4byte	0xf6c1
 	.uleb128 0x54
-	.4byte	0xfe23
+	.4byte	0xfebb
 	.uleb128 0x54
-	.4byte	0xfe23
-	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xed0
-	.uleb128 0x57
-	.4byte	0xfe2f
-	.uleb128 0x5f
-	.4byte	0xfe3b
-	.4byte	.LLST152
+	.4byte	0xfebb
+	.uleb128 0x5e
+	.4byte	.Ldebug_ranges0+0xdc0
 	.uleb128 0x57
-	.4byte	0xfe47
+	.4byte	0xfec7
 	.uleb128 0x60
-	.4byte	0xfe53
+	.4byte	0xfed3
+	.4byte	.LLST155
+	.uleb128 0x57
+	.4byte	0xfedf
+	.uleb128 0x61
+	.4byte	0xfeeb
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
-	.uleb128 0x5f
-	.4byte	0xfe5d
-	.4byte	.LLST153
+	.uleb128 0x60
+	.4byte	0xfef5
+	.4byte	.LLST156
 	.uleb128 0x57
-	.4byte	0xfe69
+	.4byte	0xff01
 	.uleb128 0x57
-	.4byte	0xfe75
+	.4byte	0xff0d
 	.uleb128 0x53
-	.4byte	0x1361f
-	.8byte	.LBB1704
-	.8byte	.LBE1704-.LBB1704
+	.4byte	0x136eb
+	.8byte	.LBB1696
+	.8byte	.LBE1696-.LBB1696
 	.byte	0x1
-	.2byte	0x831
-	.4byte	0xf5e6
+	.2byte	0x837
+	.4byte	0xf657
 	.uleb128 0x54
-	.4byte	0x1362f
+	.4byte	0x136fb
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL560
-	.4byte	0x14225
+	.8byte	.LVL577
+	.4byte	0x14347
 	.uleb128 0x4e
-	.8byte	.LVL561
-	.4byte	0x14232
+	.8byte	.LVL578
+	.4byte	0x14354
 	.uleb128 0x4e
-	.8byte	.LVL579
-	.4byte	0x1423e
+	.8byte	.LVL592
+	.4byte	0x14360
 	.uleb128 0x4e
-	.8byte	.LVL580
-	.4byte	0x14279
+	.8byte	.LVL593
+	.4byte	0x1439b
 	.uleb128 0x4e
-	.8byte	.LVL661
-	.4byte	0x1426c
+	.8byte	.LVL678
+	.4byte	0x1438e
 	.uleb128 0x4e
-	.8byte	.LVL662
-	.4byte	0x14285
+	.8byte	.LVL679
+	.4byte	0x143a7
 	.uleb128 0x4e
-	.8byte	.LVL663
-	.4byte	0x1426c
+	.8byte	.LVL680
+	.4byte	0x1438e
 	.uleb128 0x4e
-	.8byte	.LVL682
-	.4byte	0x1426c
+	.8byte	.LVL694
+	.4byte	0x1438e
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0xfd60
-	.8byte	.LBB1713
-	.4byte	.Ldebug_ranges0+0xf30
+	.uleb128 0x5b
+	.4byte	0xfdf8
+	.8byte	.LBB1704
+	.4byte	.Ldebug_ranges0+0xe20
 	.byte	0x1
-	.2byte	0x96e
-	.4byte	0xf7dd
+	.2byte	0x988
+	.4byte	0xf84e
 	.uleb128 0x54
-	.4byte	0xfd71
-	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xf30
-	.uleb128 0x60
-	.4byte	0xfd7d
+	.4byte	0xfe09
+	.uleb128 0x5e
+	.4byte	.Ldebug_ranges0+0xe20
+	.uleb128 0x61
+	.4byte	0xfe15
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
-	.uleb128 0x5a
-	.4byte	0x137f5
-	.8byte	.LBB1715
-	.4byte	.Ldebug_ranges0+0xf70
+	.uleb128 0x5b
+	.4byte	0x138c1
+	.8byte	.LBB1706
+	.4byte	.Ldebug_ranges0+0xe60
 	.byte	0x1
-	.2byte	0x894
-	.4byte	0xf6d7
+	.2byte	0x89a
+	.4byte	0xf748
 	.uleb128 0x54
-	.4byte	0x13801
+	.4byte	0x138cd
 	.uleb128 0x56
-	.8byte	.LBB1717
-	.8byte	.LBE1717-.LBB1717
+	.8byte	.LBB1708
+	.8byte	.LBE1708-.LBB1708
 	.uleb128 0x57
-	.4byte	0x1382c
-	.uleb128 0x5b
-	.4byte	0x13979
-	.8byte	.LBB1718
-	.8byte	.LBE1718-.LBB1718
+	.4byte	0x138f8
+	.uleb128 0x5c
+	.4byte	0x13a9b
+	.8byte	.LBB1709
+	.8byte	.LBE1709-.LBB1709
 	.byte	0x10
 	.byte	0x1c
 	.uleb128 0x54
-	.4byte	0x1399c
+	.4byte	0x13abe
 	.uleb128 0x54
-	.4byte	0x13990
+	.4byte	0x13ab2
 	.uleb128 0x54
-	.4byte	0x13986
+	.4byte	0x13aa8
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x138bb
-	.8byte	.LBB1722
-	.8byte	.LBE1722-.LBB1722
-	.byte	0x1
-	.2byte	0x89c
-	.4byte	0xf722
-	.uleb128 0x54
-	.4byte	0x138d0
-	.uleb128 0x54
-	.4byte	0x138c7
-	.uleb128 0x56
-	.8byte	.LBB1723
-	.8byte	.LBE1723-.LBB1723
-	.uleb128 0x5f
-	.4byte	0x138d9
-	.4byte	.LLST154
-	.uleb128 0x5f
-	.4byte	0x138e3
-	.4byte	.LLST155
+	.4byte	0x139dd
+	.8byte	.LBB1713
+	.8byte	.LBE1713-.LBB1713
+	.byte	0x1
+	.2byte	0x8a2
+	.4byte	0xf793
+	.uleb128 0x54
+	.4byte	0x139f2
+	.uleb128 0x54
+	.4byte	0x139e9
+	.uleb128 0x56
+	.8byte	.LBB1714
+	.8byte	.LBE1714-.LBB1714
+	.uleb128 0x60
+	.4byte	0x139fb
+	.4byte	.LLST157
+	.uleb128 0x60
+	.4byte	0x13a05
+	.4byte	.LLST158
 	.byte	0
 	.byte	0
-	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xfa0
-	.4byte	0xf74f
-	.uleb128 0x5f
-	.4byte	0xfd8a
-	.4byte	.LLST156
+	.uleb128 0x62
+	.4byte	.Ldebug_ranges0+0xe90
+	.4byte	0xf7c0
+	.uleb128 0x60
+	.4byte	0xfe22
+	.4byte	.LLST159
 	.uleb128 0x4e
-	.8byte	.LVL587
-	.4byte	0x14291
+	.8byte	.LVL600
+	.4byte	0x143b3
 	.uleb128 0x4e
-	.8byte	.LVL589
-	.4byte	0x1429d
+	.8byte	.LVL602
+	.4byte	0x143bf
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x138bb
-	.8byte	.LBB1726
-	.8byte	.LBE1726-.LBB1726
+	.4byte	0x139dd
+	.8byte	.LBB1717
+	.8byte	.LBE1717-.LBB1717
 	.byte	0x1
-	.2byte	0x8a5
-	.4byte	0xf79a
+	.2byte	0x8ab
+	.4byte	0xf80b
 	.uleb128 0x54
-	.4byte	0x138d0
+	.4byte	0x139f2
 	.uleb128 0x54
-	.4byte	0x138c7
+	.4byte	0x139e9
 	.uleb128 0x56
-	.8byte	.LBB1727
-	.8byte	.LBE1727-.LBB1727
-	.uleb128 0x5f
-	.4byte	0x138d9
-	.4byte	.LLST157
-	.uleb128 0x5f
-	.4byte	0x138e3
-	.4byte	.LLST158
+	.8byte	.LBB1718
+	.8byte	.LBE1718-.LBB1718
+	.uleb128 0x60
+	.4byte	0x139fb
+	.4byte	.LLST160
+	.uleb128 0x60
+	.4byte	0x13a05
+	.4byte	.LLST161
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL581
-	.4byte	0x14291
+	.8byte	.LVL594
+	.4byte	0x143b3
 	.uleb128 0x4e
-	.8byte	.LVL582
-	.4byte	0x142aa
+	.8byte	.LVL595
+	.4byte	0x143cc
 	.uleb128 0x4e
-	.8byte	.LVL590
-	.4byte	0x142aa
+	.8byte	.LVL603
+	.4byte	0x143cc
 	.uleb128 0x4e
-	.8byte	.LVL666
-	.4byte	0x1426c
+	.8byte	.LVL681
+	.4byte	0x1438e
 	.uleb128 0x4e
-	.8byte	.LVL670
-	.4byte	0x1426c
+	.8byte	.LVL685
+	.4byte	0x1438e
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0xfd46
-	.8byte	.LBB1730
-	.8byte	.LBE1730-.LBB1730
+	.4byte	0xfdde
+	.8byte	.LBB1721
+	.8byte	.LBE1721-.LBB1721
 	.byte	0x1
-	.2byte	0x975
-	.4byte	0xf877
+	.2byte	0x98f
+	.4byte	0xf8e8
 	.uleb128 0x54
-	.4byte	0xfd53
-	.uleb128 0x5a
-	.4byte	0x13252
-	.8byte	.LBB1732
-	.4byte	.Ldebug_ranges0+0xfd0
+	.4byte	0xfdeb
+	.uleb128 0x5b
+	.4byte	0x1331e
+	.8byte	.LBB1723
+	.4byte	.Ldebug_ranges0+0xec0
 	.byte	0x1
-	.2byte	0x8b5
-	.4byte	0xf842
+	.2byte	0x8bb
+	.4byte	0xf8b3
 	.uleb128 0x54
-	.4byte	0x13274
+	.4byte	0x13340
 	.uleb128 0x54
-	.4byte	0x13269
+	.4byte	0x13335
 	.uleb128 0x54
-	.4byte	0x1325e
-	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xfd0
-	.uleb128 0x5f
-	.4byte	0x1327f
-	.4byte	.LLST159
+	.4byte	0x1332a
+	.uleb128 0x5e
+	.4byte	.Ldebug_ranges0+0xec0
+	.uleb128 0x60
+	.4byte	0x1334b
+	.4byte	.LLST162
 	.uleb128 0x4e
-	.8byte	.LVL597
-	.4byte	0x142b7
+	.8byte	.LVL610
+	.4byte	0x143d9
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL598
-	.4byte	0x142c3
+	.8byte	.LVL611
+	.4byte	0x143e5
 	.uleb128 0x4e
-	.8byte	.LVL599
-	.4byte	0x142cf
+	.8byte	.LVL612
+	.4byte	0x143f1
 	.uleb128 0x4e
-	.8byte	.LVL600
-	.4byte	0x142c3
+	.8byte	.LVL613
+	.4byte	0x143e5
 	.uleb128 0x4e
-	.8byte	.LVL601
-	.4byte	0x142cf
+	.8byte	.LVL614
+	.4byte	0x143f1
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0xfca4
-	.8byte	.LBB1742
-	.4byte	.Ldebug_ranges0+0x1030
+	.uleb128 0x5b
+	.4byte	0xfd3c
+	.8byte	.LBB1733
+	.4byte	.Ldebug_ranges0+0xf20
 	.byte	0x1
-	.2byte	0x978
-	.4byte	0xfb1a
+	.2byte	0x992
+	.4byte	0xfb8b
 	.uleb128 0x54
-	.4byte	0xfcc1
+	.4byte	0xfd59
 	.uleb128 0x54
-	.4byte	0xfcb5
-	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0x1030
+	.4byte	0xfd4d
+	.uleb128 0x5e
+	.4byte	.Ldebug_ranges0+0xf20
 	.uleb128 0x57
-	.4byte	0xfccd
-	.uleb128 0x5f
-	.4byte	0xfcd9
-	.4byte	.LLST160
-	.uleb128 0x5f
-	.4byte	0xfce5
-	.4byte	.LLST161
-	.uleb128 0x5f
-	.4byte	0xfcf1
-	.4byte	.LLST162
-	.uleb128 0x5f
-	.4byte	0xfcfd
+	.4byte	0xfd65
+	.uleb128 0x60
+	.4byte	0xfd71
 	.4byte	.LLST163
-	.uleb128 0x5f
-	.4byte	0xfd09
+	.uleb128 0x60
+	.4byte	0xfd7d
 	.4byte	.LLST164
-	.uleb128 0x5f
-	.4byte	0xfd15
+	.uleb128 0x60
+	.4byte	0xfd89
 	.4byte	.LLST165
-	.uleb128 0x57
-	.4byte	0xfd21
-	.uleb128 0x5f
-	.4byte	0xfd2d
+	.uleb128 0x60
+	.4byte	0xfd95
 	.4byte	.LLST166
-	.uleb128 0x5f
-	.4byte	0xfd39
+	.uleb128 0x60
+	.4byte	0xfda1
 	.4byte	.LLST167
+	.uleb128 0x60
+	.4byte	0xfdad
+	.4byte	.LLST168
+	.uleb128 0x57
+	.4byte	0xfdb9
+	.uleb128 0x60
+	.4byte	0xfdc5
+	.4byte	.LLST169
+	.uleb128 0x60
+	.4byte	0xfdd1
+	.4byte	.LLST170
 	.uleb128 0x53
-	.4byte	0x116f9
-	.8byte	.LBB1744
-	.8byte	.LBE1744-.LBB1744
+	.4byte	0x11791
+	.8byte	.LBB1735
+	.8byte	.LBE1735-.LBB1735
 	.byte	0x1
-	.2byte	0x8ed
-	.4byte	0xf959
+	.2byte	0x8f3
+	.4byte	0xf9ca
 	.uleb128 0x54
-	.4byte	0x1170a
+	.4byte	0x117a2
 	.uleb128 0x54
-	.4byte	0x1170a
+	.4byte	0x117a2
 	.uleb128 0x56
-	.8byte	.LBB1745
-	.8byte	.LBE1745-.LBB1745
-	.uleb128 0x5f
-	.4byte	0x11716
-	.4byte	.LLST168
+	.8byte	.LBB1736
+	.8byte	.LBE1736-.LBB1736
+	.uleb128 0x60
+	.4byte	0x117ae
+	.4byte	.LLST171
 	.uleb128 0x4e
-	.8byte	.LVL618
-	.4byte	0x142db
+	.8byte	.LVL631
+	.4byte	0x143fd
 	.uleb128 0x4e
-	.8byte	.LVL620
-	.4byte	0x14260
+	.8byte	.LVL633
+	.4byte	0x14382
 	.uleb128 0x4e
-	.8byte	.LVL621
-	.4byte	0x142e7
+	.8byte	.LVL634
+	.4byte	0x14409
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x133cf
-	.8byte	.LBB1746
-	.8byte	.LBE1746-.LBB1746
+	.4byte	0x1349b
+	.8byte	.LBB1737
+	.8byte	.LBE1737-.LBB1737
 	.byte	0x1
-	.2byte	0x8d3
-	.4byte	0xf9b0
+	.2byte	0x8d9
+	.4byte	0xfa21
 	.uleb128 0x54
-	.4byte	0x133ec
+	.4byte	0x134b8
 	.uleb128 0x54
-	.4byte	0x133e0
-	.uleb128 0x5c
-	.4byte	0x133f9
-	.8byte	.LBB1747
-	.8byte	.LBE1747-.LBB1747
+	.4byte	0x134ac
+	.uleb128 0x5d
+	.4byte	0x134c5
+	.8byte	.LBB1738
+	.8byte	.LBE1738-.LBB1738
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x13416
+	.4byte	0x134e2
 	.uleb128 0x54
-	.4byte	0x1340a
+	.4byte	0x134d6
 	.uleb128 0x4e
-	.8byte	.LVL635
-	.4byte	0x142f3
+	.8byte	.LVL650
+	.4byte	0x14415
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x133cf
-	.8byte	.LBB1749
-	.8byte	.LBE1749-.LBB1749
+	.4byte	0x1349b
+	.8byte	.LBB1740
+	.8byte	.LBE1740-.LBB1740
 	.byte	0x1
-	.2byte	0x8e1
-	.4byte	0xfa07
+	.2byte	0x8e7
+	.4byte	0xfa78
 	.uleb128 0x54
-	.4byte	0x133ec
+	.4byte	0x134b8
 	.uleb128 0x54
-	.4byte	0x133e0
-	.uleb128 0x5c
-	.4byte	0x133f9
-	.8byte	.LBB1750
-	.8byte	.LBE1750-.LBB1750
+	.4byte	0x134ac
+	.uleb128 0x5d
+	.4byte	0x134c5
+	.8byte	.LBB1741
+	.8byte	.LBE1741-.LBB1741
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x13416
+	.4byte	0x134e2
 	.uleb128 0x54
-	.4byte	0x1340a
+	.4byte	0x134d6
 	.uleb128 0x4e
-	.8byte	.LVL650
-	.4byte	0x142f3
+	.8byte	.LVL663
+	.4byte	0x14415
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL603
-	.4byte	0x14300
+	.8byte	.LVL616
+	.4byte	0x14422
 	.uleb128 0x4e
-	.8byte	.LVL605
-	.4byte	0x14300
+	.8byte	.LVL618
+	.4byte	0x14422
 	.uleb128 0x4e
-	.8byte	.LVL607
-	.4byte	0x1430c
+	.8byte	.LVL620
+	.4byte	0x1442e
 	.uleb128 0x4e
-	.8byte	.LVL612
-	.4byte	0x1430c
+	.8byte	.LVL625
+	.4byte	0x1442e
 	.uleb128 0x4e
-	.8byte	.LVL616
-	.4byte	0x141f2
+	.8byte	.LVL629
+	.4byte	0x14314
 	.uleb128 0x4e
-	.8byte	.LVL617
-	.4byte	0x14319
+	.8byte	.LVL630
+	.4byte	0x1443b
 	.uleb128 0x4e
-	.8byte	.LVL622
-	.4byte	0x14325
+	.8byte	.LVL635
+	.4byte	0x14447
 	.uleb128 0x4e
-	.8byte	.LVL623
-	.4byte	0x14325
+	.8byte	.LVL636
+	.4byte	0x14447
 	.uleb128 0x4e
-	.8byte	.LVL634
-	.4byte	0x141f2
+	.8byte	.LVL647
+	.4byte	0x14453
 	.uleb128 0x4e
-	.8byte	.LVL639
-	.4byte	0x14331
+	.8byte	.LVL649
+	.4byte	0x14314
 	.uleb128 0x4e
-	.8byte	.LVL642
-	.4byte	0x142db
+	.8byte	.LVL654
+	.4byte	0x1445f
 	.uleb128 0x4e
-	.8byte	.LVL644
-	.4byte	0x14331
+	.8byte	.LVL657
+	.4byte	0x143fd
 	.uleb128 0x4e
-	.8byte	.LVL645
-	.4byte	0x142e7
+	.8byte	.LVL659
+	.4byte	0x1445f
 	.uleb128 0x4e
-	.8byte	.LVL647
-	.4byte	0x1433b
+	.8byte	.LVL660
+	.4byte	0x14409
 	.uleb128 0x4e
-	.8byte	.LVL649
-	.4byte	0x141f2
+	.8byte	.LVL662
+	.4byte	0x14314
 	.uleb128 0x4e
-	.8byte	.LVL653
-	.4byte	0x14331
+	.8byte	.LVL666
+	.4byte	0x1445f
 	.uleb128 0x4e
-	.8byte	.LVL656
-	.4byte	0x142db
+	.8byte	.LVL670
+	.4byte	0x143fd
 	.uleb128 0x4e
-	.8byte	.LVL658
-	.4byte	0x14331
+	.8byte	.LVL672
+	.4byte	0x1445f
 	.uleb128 0x4e
-	.8byte	.LVL659
-	.4byte	0x142e7
+	.8byte	.LVL673
+	.4byte	0x14409
 	.uleb128 0x4e
-	.8byte	.LVL686
-	.4byte	0x1426c
+	.8byte	.LVL692
+	.4byte	0x1438e
 	.uleb128 0x4e
-	.8byte	.LVL689
-	.4byte	0x1426c
+	.8byte	.LVL700
+	.4byte	0x1438e
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x134a3
-	.8byte	.LBB1755
-	.8byte	.LBE1755-.LBB1755
+	.4byte	0x1356f
+	.8byte	.LBB1747
+	.8byte	.LBE1747-.LBB1747
 	.byte	0x1
-	.2byte	0x97a
-	.4byte	0xfb63
+	.2byte	0x994
+	.4byte	0xfbd4
 	.uleb128 0x54
-	.4byte	0x134ba
+	.4byte	0x13586
 	.uleb128 0x54
-	.4byte	0x134af
-	.uleb128 0x5b
-	.4byte	0x135a5
-	.8byte	.LBB1756
-	.8byte	.LBE1756-.LBB1756
+	.4byte	0x1357b
+	.uleb128 0x5c
+	.4byte	0x13671
+	.8byte	.LBB1748
+	.8byte	.LBE1748-.LBB1748
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x54
-	.4byte	0x135be
+	.4byte	0x1368a
 	.uleb128 0x54
-	.4byte	0x135b2
+	.4byte	0x1367e
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0xfe98
-	.8byte	.LBB1758
-	.8byte	.LBE1758-.LBB1758
+	.4byte	0xff30
+	.8byte	.LBB1750
+	.8byte	.LBE1750-.LBB1750
 	.byte	0x1
-	.2byte	0x97d
-	.4byte	0xfbed
+	.2byte	0x997
+	.4byte	0xfc5e
 	.uleb128 0x54
-	.4byte	0xfea9
+	.4byte	0xff41
 	.uleb128 0x4e
-	.8byte	.LVL624
-	.4byte	0x14347
+	.8byte	.LVL637
+	.4byte	0x14469
 	.uleb128 0x4e
-	.8byte	.LVL625
-	.4byte	0x14353
+	.8byte	.LVL638
+	.4byte	0x14475
 	.uleb128 0x4e
-	.8byte	.LVL626
-	.4byte	0x14353
+	.8byte	.LVL639
+	.4byte	0x14475
 	.uleb128 0x4e
-	.8byte	.LVL627
-	.4byte	0x14353
+	.8byte	.LVL640
+	.4byte	0x14475
 	.uleb128 0x4e
-	.8byte	.LVL628
-	.4byte	0x14353
+	.8byte	.LVL641
+	.4byte	0x14475
 	.uleb128 0x4e
-	.8byte	.LVL629
-	.4byte	0x14353
+	.8byte	.LVL642
+	.4byte	0x14475
 	.uleb128 0x4e
-	.8byte	.LVL630
-	.4byte	0x14353
+	.8byte	.LVL643
+	.4byte	0x14475
 	.uleb128 0x4e
-	.8byte	.LVL631
-	.4byte	0x14353
+	.8byte	.LVL644
+	.4byte	0x14475
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL521
-	.4byte	0x14225
+	.4byte	0x14347
 	.uleb128 0x4e
 	.8byte	.LVL522
-	.4byte	0x14360
+	.4byte	0x14482
 	.uleb128 0x4e
 	.8byte	.LVL524
-	.4byte	0x14225
+	.4byte	0x1448e
 	.uleb128 0x4e
-	.8byte	.LVL525
-	.4byte	0x1436c
+	.8byte	.LVL530
+	.4byte	0x1449b
 	.uleb128 0x4e
-	.8byte	.LVL562
-	.4byte	0x1426c
+	.8byte	.LVL533
+	.4byte	0x144a8
 	.uleb128 0x4e
-	.8byte	.LVL564
-	.4byte	0x1426c
+	.8byte	.LVL534
+	.4byte	0x1438e
 	.uleb128 0x4e
-	.8byte	.LVL571
-	.4byte	0x1426c
+	.8byte	.LVL542
+	.4byte	0x14314
 	.uleb128 0x4e
-	.8byte	.LVL632
-	.4byte	0x141f2
+	.8byte	.LVL579
+	.4byte	0x1438e
 	.uleb128 0x4e
-	.8byte	.LVL667
-	.4byte	0x1426c
+	.8byte	.LVL581
+	.4byte	0x1438e
 	.uleb128 0x4e
-	.8byte	.LVL674
-	.4byte	0x1426c
+	.8byte	.LVL584
+	.4byte	0x1438e
 	.uleb128 0x4e
-	.8byte	.LVL675
-	.4byte	0x1426c
+	.8byte	.LVL586
+	.4byte	0x1438e
+	.uleb128 0x4e
+	.8byte	.LVL589
+	.4byte	0x1438e
+	.uleb128 0x4e
+	.8byte	.LVL645
+	.4byte	0x14314
 	.uleb128 0x4e
 	.8byte	.LVL676
-	.4byte	0x1426c
+	.4byte	0x1438e
 	.uleb128 0x4e
-	.8byte	.LVL680
-	.4byte	0x1426c
+	.8byte	.LVL682
+	.4byte	0x1438e
 	.uleb128 0x4e
-	.8byte	.LVL684
-	.4byte	0x14379
+	.8byte	.LVL687
+	.4byte	0x1438e
+	.uleb128 0x4e
+	.8byte	.LVL696
+	.4byte	0x144b5
 	.byte	0
-	.uleb128 0x62
-	.4byte	.LASF3041
+	.uleb128 0x63
+	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0x8c1
+	.2byte	0x8c7
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfd46
-	.uleb128 0x63
-	.string	"ebc"
-	.byte	0x1
-	.2byte	0x8c1
-	.4byte	0xe483
+	.4byte	0xfdde
 	.uleb128 0x64
-	.4byte	.LASF2999
+	.string	"ebc"
 	.byte	0x1
-	.2byte	0x8c1
-	.4byte	0xe145
-	.uleb128 0x46
-	.4byte	.LASF2958
+	.2byte	0x8c7
+	.4byte	0xe49e
+	.uleb128 0x65
+	.4byte	.LASF3000
 	.byte	0x1
-	.2byte	0x8c3
-	.4byte	0xe748
+	.2byte	0x8c7
+	.4byte	0xe160
 	.uleb128 0x46
-	.4byte	.LASF3033
+	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x8c4
-	.4byte	0x6d
+	.2byte	0x8c9
+	.4byte	0xe763
 	.uleb128 0x46
 	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0x8c5
+	.2byte	0x8ca
 	.4byte	0x6d
 	.uleb128 0x46
 	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0x8c6
-	.4byte	0xc6
+	.2byte	0x8cb
+	.4byte	0x6d
 	.uleb128 0x46
 	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0x8c7
+	.2byte	0x8cc
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0x8c8
-	.4byte	0x219
+	.2byte	0x8cd
+	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0x8c9
-	.4byte	0x219
+	.2byte	0x8ce
+	.4byte	0x21e
+	.uleb128 0x46
+	.4byte	.LASF3039
+	.byte	0x1
+	.2byte	0x8cf
+	.4byte	0x21e
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x8ca
-	.4byte	0xe41e
+	.2byte	0x8d0
+	.4byte	0xe439
 	.uleb128 0x46
-	.4byte	.LASF3039
+	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0x8cb
-	.4byte	0x443
+	.2byte	0x8d1
+	.4byte	0x458
 	.uleb128 0x46
-	.4byte	.LASF3040
+	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0x8cc
-	.4byte	0x443
+	.2byte	0x8d2
+	.4byte	0x458
 	.byte	0
-	.uleb128 0x65
-	.4byte	.LASF3096
+	.uleb128 0x66
+	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x8aa
+	.2byte	0x8b0
 	.byte	0x1
-	.4byte	0xfd60
-	.uleb128 0x64
-	.4byte	.LASF2958
+	.4byte	0xfdf8
+	.uleb128 0x65
+	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x8aa
-	.4byte	0xe748
+	.2byte	0x8b0
+	.4byte	0xe763
 	.byte	0
-	.uleb128 0x62
-	.4byte	.LASF3042
+	.uleb128 0x63
+	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0x890
+	.2byte	0x896
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfd98
-	.uleb128 0x64
-	.4byte	.LASF2958
+	.4byte	0xfe30
+	.uleb128 0x65
+	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x890
-	.4byte	0xe748
+	.2byte	0x896
+	.4byte	0xe763
 	.uleb128 0x46
-	.4byte	.LASF2465
+	.4byte	.LASF2466
 	.byte	0x1
-	.2byte	0x892
-	.4byte	0xd7ff
-	.uleb128 0x66
+	.2byte	0x898
+	.4byte	0xd81a
+	.uleb128 0x67
 	.uleb128 0x52
 	.string	"__k"
 	.byte	0x1
-	.2byte	0x89f
-	.4byte	0x2ef0
+	.2byte	0x8a5
+	.4byte	0x2f05
 	.byte	0
 	.byte	0
-	.uleb128 0x62
-	.4byte	.LASF3043
+	.uleb128 0x63
+	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0x847
+	.2byte	0x84d
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe12
-	.uleb128 0x63
+	.4byte	0xfeaa
+	.uleb128 0x64
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x847
-	.4byte	0xe483
+	.2byte	0x84d
+	.4byte	0xe49e
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x849
-	.4byte	0xa55b
+	.2byte	0x84f
+	.4byte	0xa570
 	.uleb128 0x46
-	.4byte	.LASF2999
+	.4byte	.LASF3000
 	.byte	0x1
-	.2byte	0x84a
-	.4byte	0xe145
+	.2byte	0x850
+	.4byte	0xe160
 	.uleb128 0x46
-	.4byte	.LASF2958
+	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x84b
-	.4byte	0xe748
+	.2byte	0x851
+	.4byte	0xe763
 	.uleb128 0x46
-	.4byte	.LASF3044
+	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0x84c
-	.4byte	0xb87f
+	.2byte	0x852
+	.4byte	0xb894
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x84d
-	.4byte	0x9737
+	.2byte	0x853
+	.4byte	0x974c
 	.uleb128 0x46
-	.4byte	.LASF3045
+	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0x84e
+	.2byte	0x854
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x84f
+	.2byte	0x855
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x84f
+	.2byte	0x855
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x62
-	.4byte	.LASF3046
+	.uleb128 0x63
+	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0x81e
+	.2byte	0x824
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe83
-	.uleb128 0x64
-	.4byte	.LASF2958
+	.4byte	0xff1b
+	.uleb128 0x65
+	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x81e
-	.4byte	0xe748
+	.2byte	0x824
+	.4byte	0xe763
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x820
+	.2byte	0x826
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x821
-	.4byte	0xa55b
+	.2byte	0x827
+	.4byte	0xa570
 	.uleb128 0x46
-	.4byte	.LASF3044
+	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0x822
-	.4byte	0xb87f
+	.2byte	0x828
+	.4byte	0xb894
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x823
-	.4byte	0x9737
+	.2byte	0x829
+	.4byte	0x974c
 	.uleb128 0x46
-	.4byte	.LASF3047
+	.4byte	.LASF3048
 	.byte	0x1
-	.2byte	0x824
+	.2byte	0x82a
 	.4byte	0x29
 	.uleb128 0x46
-	.4byte	.LASF3048
+	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0x825
+	.2byte	0x82b
 	.4byte	0xc6
-	.uleb128 0x67
-	.4byte	.LASF3025
-	.4byte	0xfe93
-	.4byte	.LASF3046
+	.uleb128 0x68
+	.4byte	.LASF3026
+	.4byte	0xff2b
+	.4byte	.LASF3047
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xfe93
+	.4byte	0xff2b
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x12
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xfe83
-	.uleb128 0x62
-	.4byte	.LASF3049
+	.4byte	0xff1b
+	.uleb128 0x63
+	.4byte	.LASF3050
 	.byte	0x1
-	.2byte	0x80f
+	.2byte	0x815
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfeb6
-	.uleb128 0x64
-	.4byte	.LASF2958
+	.4byte	0xff4e
+	.uleb128 0x65
+	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x80f
-	.4byte	0xe748
+	.2byte	0x815
+	.4byte	0xe763
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3050
+	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0x806
-	.4byte	0x2d9
+	.2byte	0x80c
+	.4byte	0x2ee
 	.8byte	.LFB2841
 	.8byte	.LFE2841-.LFB2841
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xff16
+	.4byte	0xffae
 	.uleb128 0x58
-	.4byte	.LASF2199
+	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x806
-	.4byte	0xa55b
+	.2byte	0x80c
+	.4byte	0xa570
 	.4byte	.LLST75
 	.uleb128 0x58
-	.4byte	.LASF2114
+	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x807
-	.4byte	0xb3d6
+	.2byte	0x80d
+	.4byte	0xb3eb
 	.4byte	.LLST76
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x808
-	.4byte	0x219
+	.2byte	0x80e
+	.4byte	0x21e
 	.4byte	.LLST77
 	.uleb128 0x4e
 	.8byte	.LVL300
-	.4byte	0x14383
+	.4byte	0x144bf
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3051
+	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0x7fd
-	.4byte	0x2d9
+	.2byte	0x803
+	.4byte	0x2ee
 	.8byte	.LFB2840
 	.8byte	.LFE2840-.LFB2840
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xff76
+	.4byte	0x1000e
 	.uleb128 0x58
-	.4byte	.LASF2199
+	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x7fd
-	.4byte	0xa55b
+	.2byte	0x803
+	.4byte	0xa570
 	.4byte	.LLST78
 	.uleb128 0x58
-	.4byte	.LASF2114
+	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x7fe
-	.4byte	0xb3d6
+	.2byte	0x804
+	.4byte	0xb3eb
 	.4byte	.LLST79
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7ff
-	.4byte	0x219
+	.2byte	0x805
+	.4byte	0x21e
 	.4byte	.LLST80
 	.uleb128 0x4e
 	.8byte	.LVL305
-	.4byte	0x1438f
+	.4byte	0x144cb
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3052
+	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0x7f4
-	.4byte	0x2d9
+	.2byte	0x7fa
+	.4byte	0x2ee
 	.8byte	.LFB2839
 	.8byte	.LFE2839-.LFB2839
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xffd6
+	.4byte	0x1006e
 	.uleb128 0x58
-	.4byte	.LASF2199
+	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x7f4
-	.4byte	0xa55b
+	.2byte	0x7fa
+	.4byte	0xa570
 	.4byte	.LLST81
 	.uleb128 0x58
-	.4byte	.LASF2114
+	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x7f5
-	.4byte	0xb3d6
+	.2byte	0x7fb
+	.4byte	0xb3eb
 	.4byte	.LLST82
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7f6
-	.4byte	0x219
+	.2byte	0x7fc
+	.4byte	0x21e
 	.4byte	.LLST83
 	.uleb128 0x4e
 	.8byte	.LVL310
-	.4byte	0x1438f
+	.4byte	0x144cb
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3053
+	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0x7dc
-	.4byte	0x2d9
+	.2byte	0x7e2
+	.4byte	0x2ee
 	.8byte	.LFB2838
 	.8byte	.LFE2838-.LFB2838
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x100a6
+	.4byte	0x1013e
 	.uleb128 0x58
-	.4byte	.LASF2199
+	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x7dc
-	.4byte	0xa55b
+	.2byte	0x7e2
+	.4byte	0xa570
 	.4byte	.LLST93
 	.uleb128 0x58
-	.4byte	.LASF2114
+	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x7dd
-	.4byte	0xb3d6
+	.2byte	0x7e3
+	.4byte	0xb3eb
 	.4byte	.LLST94
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7de
+	.2byte	0x7e4
 	.4byte	0x56
 	.4byte	.LLST95
 	.uleb128 0x58
-	.4byte	.LASF382
+	.4byte	.LASF383
 	.byte	0x1
-	.2byte	0x7de
-	.4byte	0x2ce
+	.2byte	0x7e4
+	.4byte	0x2e3
 	.4byte	.LLST96
-	.uleb128 0x68
+	.uleb128 0x5a
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x7e0
-	.4byte	0xe483
+	.2byte	0x7e6
+	.4byte	0xe49e
 	.4byte	.LLST97
 	.uleb128 0x59
-	.4byte	.LASF2455
+	.4byte	.LASF2456
 	.byte	0x1
-	.2byte	0x7e1
+	.2byte	0x7e7
 	.4byte	0xc6
 	.4byte	.LLST98
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x7e1
+	.2byte	0x7e7
 	.4byte	0xc6
 	.uleb128 0x4e
 	.8byte	.LVL336
-	.4byte	0x1439c
+	.4byte	0x144d8
 	.uleb128 0x4e
 	.8byte	.LVL338
-	.4byte	0x143a9
+	.4byte	0x144e5
 	.uleb128 0x4e
 	.8byte	.LVL343
-	.4byte	0x1426c
+	.4byte	0x1438e
 	.uleb128 0x4e
 	.8byte	.LVL346
-	.4byte	0x1426c
+	.4byte	0x1438e
 	.uleb128 0x4e
 	.8byte	.LVL347
-	.4byte	0x14379
+	.4byte	0x144b5
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3054
+	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0x7d0
-	.4byte	0x2d9
+	.2byte	0x7d6
+	.4byte	0x2ee
 	.8byte	.LFB2837
 	.8byte	.LFE2837-.LFB2837
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10140
+	.4byte	0x101d8
 	.uleb128 0x58
-	.4byte	.LASF2199
+	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x7d0
-	.4byte	0xa55b
+	.2byte	0x7d6
+	.4byte	0xa570
 	.4byte	.LLST84
 	.uleb128 0x58
-	.4byte	.LASF2114
+	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x7d1
-	.4byte	0xb3d6
+	.2byte	0x7d7
+	.4byte	0xb3eb
 	.4byte	.LLST85
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7d2
-	.4byte	0x219
+	.2byte	0x7d8
+	.4byte	0x21e
 	.4byte	.LLST86
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x7d4
-	.4byte	0xe483
+	.2byte	0x7da
+	.4byte	0xe49e
 	.uleb128 0x46
-	.4byte	.LASF2455
+	.4byte	.LASF2456
 	.byte	0x1
-	.2byte	0x7d5
+	.2byte	0x7db
 	.4byte	0xc6
 	.uleb128 0x53
-	.4byte	0x1317b
-	.8byte	.LBB1208
-	.8byte	.LBE1208-.LBB1208
+	.4byte	0x13247
+	.8byte	.LBB1220
+	.8byte	.LBE1220-.LBB1220
 	.byte	0x1
-	.2byte	0x7d7
-	.4byte	0x10132
+	.2byte	0x7dd
+	.4byte	0x101ca
 	.uleb128 0x54
-	.4byte	0x1318b
+	.4byte	0x13257
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL315
-	.4byte	0x1438f
+	.4byte	0x144cb
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3055
+	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0x7c2
-	.4byte	0x2d9
+	.2byte	0x7c8
+	.4byte	0x2ee
 	.8byte	.LFB2836
 	.8byte	.LFE2836-.LFB2836
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x101e9
+	.4byte	0x10281
 	.uleb128 0x58
-	.4byte	.LASF2199
+	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x7c2
-	.4byte	0xa55b
+	.2byte	0x7c8
+	.4byte	0xa570
 	.4byte	.LLST87
 	.uleb128 0x58
-	.4byte	.LASF2114
+	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x7c3
-	.4byte	0xb3d6
+	.2byte	0x7c9
+	.4byte	0xb3eb
 	.4byte	.LLST88
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7c4
-	.4byte	0x219
+	.2byte	0x7ca
+	.4byte	0x21e
 	.4byte	.LLST89
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x7c6
-	.4byte	0xe483
+	.2byte	0x7cc
+	.4byte	0xe49e
 	.uleb128 0x69
 	.string	"t"
 	.byte	0x1
-	.2byte	0x7c7
+	.2byte	0x7cd
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
-	.uleb128 0x5a
-	.4byte	0x13197
-	.8byte	.LBB1210
+	.uleb128 0x5b
+	.4byte	0x13263
+	.8byte	.LBB1222
 	.4byte	.Ldebug_ranges0+0x6a0
 	.byte	0x1
-	.2byte	0x7c9
-	.4byte	0x101ce
+	.2byte	0x7cf
+	.4byte	0x10266
 	.uleb128 0x54
-	.4byte	0x131b2
+	.4byte	0x1327e
 	.uleb128 0x54
-	.4byte	0x131a7
+	.4byte	0x13273
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL322
-	.4byte	0x1438f
+	.4byte	0x144cb
 	.uleb128 0x4e
 	.8byte	.LVL325
-	.4byte	0x14379
+	.4byte	0x144b5
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3056
+	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0x7b7
-	.4byte	0x2d9
+	.2byte	0x7bd
+	.4byte	0x2ee
 	.8byte	.LFB2835
 	.8byte	.LFE2835-.LFB2835
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10255
+	.4byte	0x102ed
 	.uleb128 0x58
-	.4byte	.LASF2199
+	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x7b7
-	.4byte	0xa55b
+	.2byte	0x7bd
+	.4byte	0xa570
 	.4byte	.LLST90
 	.uleb128 0x58
-	.4byte	.LASF2114
+	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x7b8
-	.4byte	0xb3d6
+	.2byte	0x7be
+	.4byte	0xb3eb
 	.4byte	.LLST91
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7b9
-	.4byte	0x219
+	.2byte	0x7bf
+	.4byte	0x21e
 	.4byte	.LLST92
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x7bb
-	.4byte	0xe483
+	.2byte	0x7c1
+	.4byte	0xe49e
 	.uleb128 0x4e
 	.8byte	.LVL330
-	.4byte	0x1438f
+	.4byte	0x144cb
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3057
+	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x7ac
-	.4byte	0x2d9
+	.2byte	0x7b2
+	.4byte	0x2ee
 	.8byte	.LFB2834
 	.8byte	.LFE2834-.LFB2834
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x102ce
+	.4byte	0x10366
 	.uleb128 0x58
-	.4byte	.LASF2199
+	.4byte	.LASF2200
 	.byte	0x1
-	.2byte	0x7ac
-	.4byte	0xa55b
+	.2byte	0x7b2
+	.4byte	0xa570
 	.4byte	.LLST99
 	.uleb128 0x58
-	.4byte	.LASF2114
+	.4byte	.LASF2115
 	.byte	0x1
-	.2byte	0x7ad
-	.4byte	0xb3d6
+	.2byte	0x7b3
+	.4byte	0xb3eb
 	.4byte	.LLST100
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7ae
-	.4byte	0x219
+	.2byte	0x7b4
+	.4byte	0x21e
 	.4byte	.LLST101
 	.uleb128 0x46
-	.4byte	.LASF3058
+	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x7b0
+	.2byte	0x7b6
 	.4byte	0x56
 	.uleb128 0x4e
 	.8byte	.LVL349
-	.4byte	0x143b5
+	.4byte	0x144f1
 	.uleb128 0x4e
 	.8byte	.LVL350
-	.4byte	0x1438f
+	.4byte	0x144cb
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3059
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x795
+	.2byte	0x79b
 	.4byte	0xc6
 	.8byte	.LFB2833
 	.8byte	.LFE2833-.LFB2833
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1030f
+	.4byte	0x103a7
 	.uleb128 0x58
-	.4byte	.LASF417
+	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0x795
-	.4byte	0x1c6a
+	.2byte	0x79b
+	.4byte	0x1c7f
 	.4byte	.LLST10
 	.uleb128 0x6a
-	.4byte	.LASF1272
+	.4byte	.LASF1273
 	.byte	0x1
-	.2byte	0x795
-	.4byte	0x5547
+	.2byte	0x79b
+	.4byte	0x555c
 	.uleb128 0x1
 	.byte	0x51
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3060
+	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x786
+	.2byte	0x78c
 	.4byte	0xc6
 	.8byte	.LFB2832
 	.8byte	.LFE2832-.LFB2832
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10378
+	.4byte	0x10410
 	.uleb128 0x58
-	.4byte	.LASF1272
+	.4byte	.LASF1273
 	.byte	0x1
-	.2byte	0x786
-	.4byte	0x5547
+	.2byte	0x78c
+	.4byte	0x555c
 	.4byte	.LLST14
 	.uleb128 0x51
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x786
-	.4byte	0x3ca0
+	.2byte	0x78c
+	.4byte	0x3cb5
 	.4byte	.LLST15
 	.uleb128 0x46
-	.4byte	.LASF883
+	.4byte	.LASF884
 	.byte	0x1
-	.2byte	0x788
+	.2byte	0x78e
 	.4byte	0x29
 	.uleb128 0x4e
 	.8byte	.LVL76
-	.4byte	0x143c1
+	.4byte	0x144fd
 	.uleb128 0x4e
 	.8byte	.LVL77
-	.4byte	0x143cd
+	.4byte	0x14509
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3061
+	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x6bd
-	.4byte	0x194
+	.2byte	0x6c3
+	.4byte	0x199
 	.8byte	.LFB2831
 	.8byte	.LFE2831-.LFB2831
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11620
+	.4byte	0x116b8
 	.uleb128 0x58
-	.4byte	.LASF1272
+	.4byte	.LASF1273
 	.byte	0x1
-	.2byte	0x6bd
-	.4byte	0x5547
+	.2byte	0x6c3
+	.4byte	0x555c
 	.4byte	.LLST16
 	.uleb128 0x51
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0x6bd
+	.2byte	0x6c3
 	.4byte	0x6d
 	.4byte	.LLST17
 	.uleb128 0x51
 	.string	"arg"
 	.byte	0x1
-	.2byte	0x6bd
+	.2byte	0x6c3
 	.4byte	0x29
 	.4byte	.LLST18
 	.uleb128 0x46
-	.4byte	.LASF3062
+	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x6bf
-	.4byte	0x443
+	.2byte	0x6c5
+	.4byte	0x458
 	.uleb128 0x46
-	.4byte	.LASF2999
+	.4byte	.LASF3000
 	.byte	0x1
-	.2byte	0x6c0
-	.4byte	0xe145
+	.2byte	0x6c6
+	.4byte	0xe160
 	.uleb128 0x46
-	.4byte	.LASF2958
+	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x6c1
-	.4byte	0xe748
+	.2byte	0x6c7
+	.4byte	0xe763
 	.uleb128 0x4c
-	.4byte	.LASF3063
+	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x6c2
-	.4byte	0xd9eb
+	.2byte	0x6c8
+	.4byte	0xda06
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 -56
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6c3
-	.4byte	0xe41e
+	.2byte	0x6c9
+	.4byte	0xe439
 	.uleb128 0x46
-	.4byte	.LASF3064
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x6c4
+	.2byte	0x6ca
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3065
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x6c5
+	.2byte	0x6cb
 	.4byte	0x29
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x6c6
+	.2byte	0x6cc
 	.4byte	0xc6
 	.uleb128 0x55
-	.4byte	.LASF3025
-	.4byte	0x11630
+	.4byte	.LASF3026
+	.4byte	0x116c8
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	__func__.34976
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x1a0
-	.4byte	0x104e2
+	.4byte	0x1057a
 	.uleb128 0x46
-	.4byte	.LASF3066
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x710
+	.2byte	0x716
 	.4byte	0xc6
-	.uleb128 0x5d
+	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x1a0
 	.uleb128 0x6b
-	.4byte	.LASF3078
+	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0x710
+	.2byte	0x716
 	.8byte	.L212
 	.uleb128 0x4c
-	.4byte	.LASF3067
+	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x710
-	.4byte	0x1513
+	.2byte	0x716
+	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -96
 	.uleb128 0x46
-	.4byte	.LASF3066
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x710
-	.4byte	0x194
+	.2byte	0x716
+	.4byte	0x199
 	.uleb128 0x6c
-	.8byte	.LBB1000
-	.8byte	.LBE1000-.LBB1000
-	.4byte	0x104c6
+	.8byte	.LBB1012
+	.8byte	.LBE1012-.LBB1012
+	.4byte	0x1055e
 	.uleb128 0x59
-	.4byte	.LASF3068
+	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0x710
-	.4byte	0x194
+	.2byte	0x716
+	.4byte	0x199
 	.4byte	.LLST33
 	.uleb128 0x4e
 	.8byte	.LVL123
-	.4byte	0x143da
+	.4byte	0x14516
 	.uleb128 0x4e
 	.8byte	.LVL124
-	.4byte	0x143e6
+	.4byte	0x14522
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL121
-	.4byte	0x143f3
+	.4byte	0x1452f
 	.uleb128 0x4e
 	.8byte	.LVL125
-	.4byte	0x143ff
+	.4byte	0x1453b
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x1328a
-	.8byte	.LBB936
+	.uleb128 0x5b
+	.4byte	0x13356
+	.8byte	.LBB948
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x778
-	.4byte	0x10702
+	.2byte	0x77e
+	.4byte	0x1079a
 	.uleb128 0x54
-	.4byte	0x132af
+	.4byte	0x1337b
 	.uleb128 0x54
-	.4byte	0x132a4
+	.4byte	0x13370
 	.uleb128 0x54
-	.4byte	0x1329a
+	.4byte	0x13366
 	.uleb128 0x6d
-	.4byte	0x132e8
-	.8byte	.LBB937
+	.4byte	0x133b4
+	.8byte	.LBB949
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x1330d
+	.4byte	0x133d9
 	.uleb128 0x54
-	.4byte	0x13302
+	.4byte	0x133ce
 	.uleb128 0x54
-	.4byte	0x132f8
+	.4byte	0x133c4
 	.uleb128 0x6e
-	.4byte	0x13385
-	.8byte	.LBB939
+	.4byte	0x13451
+	.8byte	.LBB951
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10638
+	.4byte	0x106d0
 	.uleb128 0x54
-	.4byte	0x133a0
+	.4byte	0x1346c
 	.uleb128 0x6f
-	.4byte	0x13395
+	.4byte	0x13461
 	.4byte	.LLST19
-	.uleb128 0x5d
+	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x80
-	.uleb128 0x5f
-	.4byte	0x133ab
+	.uleb128 0x60
+	.4byte	0x13477
 	.4byte	.LLST20
-	.uleb128 0x5f
-	.4byte	0x133b6
+	.uleb128 0x60
+	.4byte	0x13482
 	.4byte	.LLST21
 	.uleb128 0x70
-	.4byte	0x137d9
-	.8byte	.LBB941
-	.8byte	.LBE941-.LBB941
+	.4byte	0x138a5
+	.8byte	.LBB953
+	.8byte	.LBE953-.LBB953
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x1059e
+	.4byte	0x10636
 	.uleb128 0x56
-	.8byte	.LBB942
-	.8byte	.LBE942-.LBB942
-	.uleb128 0x5f
-	.4byte	0x137e9
+	.8byte	.LBB954
+	.8byte	.LBE954-.LBB954
+	.uleb128 0x60
+	.4byte	0x138b5
 	.4byte	.LLST22
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x137ad
-	.8byte	.LBB943
-	.8byte	.LBE943-.LBB943
+	.4byte	0x13879
+	.8byte	.LBB955
+	.8byte	.LBE955-.LBB955
 	.byte	0x6
 	.byte	0x55
-	.4byte	0x105e6
+	.4byte	0x1067e
 	.uleb128 0x54
-	.4byte	0x137c7
+	.4byte	0x13893
 	.uleb128 0x54
-	.4byte	0x137bd
-	.uleb128 0x5b
-	.4byte	0x1388f
-	.8byte	.LBB944
-	.8byte	.LBE944-.LBB944
+	.4byte	0x13889
+	.uleb128 0x5c
+	.4byte	0x139b1
+	.8byte	.LBB956
+	.8byte	.LBE956-.LBB956
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x138a9
+	.4byte	0x139cb
 	.uleb128 0x54
-	.4byte	0x1389f
+	.4byte	0x139c1
 	.byte	0
 	.byte	0
 	.uleb128 0x56
-	.8byte	.LBB946
-	.8byte	.LBE946-.LBB946
+	.8byte	.LBB958
+	.8byte	.LBE958-.LBB958
 	.uleb128 0x57
-	.4byte	0x133c2
-	.uleb128 0x5b
-	.4byte	0x1385d
-	.8byte	.LBB947
-	.8byte	.LBE947-.LBB947
+	.4byte	0x1348e
+	.uleb128 0x5c
+	.4byte	0x13929
+	.8byte	.LBB959
+	.8byte	.LBE959-.LBB959
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13878
+	.4byte	0x13944
 	.uleb128 0x54
-	.4byte	0x1386d
+	.4byte	0x13939
 	.uleb128 0x56
-	.8byte	.LBB948
-	.8byte	.LBE948-.LBB948
+	.8byte	.LBB960
+	.8byte	.LBE960-.LBB960
 	.uleb128 0x57
-	.4byte	0x13883
+	.4byte	0x1394f
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13351
-	.8byte	.LBB953
-	.8byte	.LBE953-.LBB953
+	.4byte	0x1341d
+	.8byte	.LBB965
+	.8byte	.LBE965-.LBB965
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x106f3
+	.4byte	0x1078b
 	.uleb128 0x54
-	.4byte	0x13361
+	.4byte	0x1342d
 	.uleb128 0x56
-	.8byte	.LBB954
-	.8byte	.LBE954-.LBB954
-	.uleb128 0x5f
-	.4byte	0x1336c
+	.8byte	.LBB966
+	.8byte	.LBE966-.LBB966
+	.uleb128 0x60
+	.4byte	0x13438
 	.4byte	.LLST23
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0xc0
-	.4byte	0x106be
-	.uleb128 0x5f
-	.4byte	0x13378
+	.4byte	0x10756
+	.uleb128 0x60
+	.4byte	0x13444
 	.4byte	.LLST24
-	.uleb128 0x5b
-	.4byte	0x1385d
-	.8byte	.LBB956
-	.8byte	.LBE956-.LBB956
+	.uleb128 0x5c
+	.4byte	0x13929
+	.8byte	.LBB968
+	.8byte	.LBE968-.LBB968
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13878
+	.4byte	0x13944
 	.uleb128 0x54
-	.4byte	0x1386d
+	.4byte	0x13939
 	.uleb128 0x56
-	.8byte	.LBB957
-	.8byte	.LBE957-.LBB957
+	.8byte	.LBB969
+	.8byte	.LBE969-.LBB969
 	.uleb128 0x57
-	.4byte	0x13883
+	.4byte	0x1394f
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x137d9
-	.8byte	.LBB958
-	.8byte	.LBE958-.LBB958
+	.uleb128 0x5c
+	.4byte	0x138a5
+	.8byte	.LBB970
+	.8byte	.LBE970-.LBB970
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB959
-	.8byte	.LBE959-.LBB959
-	.uleb128 0x5f
-	.4byte	0x137e9
+	.8byte	.LBB971
+	.8byte	.LBE971-.LBB971
+	.uleb128 0x60
+	.4byte	0x138b5
 	.4byte	.LLST25
 	.byte	0
 	.byte	0
@@ -40977,171 +40991,171 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL151
-	.4byte	0x1440c
+	.4byte	0x14548
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x132b9
-	.8byte	.LBB969
+	.uleb128 0x5b
+	.4byte	0x13385
+	.8byte	.LBB981
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
-	.2byte	0x6fb
-	.4byte	0x1092d
+	.2byte	0x701
+	.4byte	0x109c5
 	.uleb128 0x54
-	.4byte	0x132de
+	.4byte	0x133aa
 	.uleb128 0x54
-	.4byte	0x132d3
+	.4byte	0x1339f
 	.uleb128 0x54
-	.4byte	0x132c9
+	.4byte	0x13395
 	.uleb128 0x6d
-	.4byte	0x13317
-	.8byte	.LBB970
+	.4byte	0x133e3
+	.8byte	.LBB982
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x1333c
+	.4byte	0x13408
 	.uleb128 0x54
-	.4byte	0x13331
+	.4byte	0x133fd
 	.uleb128 0x54
-	.4byte	0x13327
-	.uleb128 0x5d
+	.4byte	0x133f3
+	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x57
-	.4byte	0x13345
+	.4byte	0x13411
 	.uleb128 0x6e
-	.4byte	0x13385
-	.8byte	.LBB972
+	.4byte	0x13451
+	.8byte	.LBB984
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x10862
+	.4byte	0x108fa
 	.uleb128 0x54
-	.4byte	0x133a0
+	.4byte	0x1346c
 	.uleb128 0x6f
-	.4byte	0x13395
+	.4byte	0x13461
 	.4byte	.LLST26
-	.uleb128 0x5d
+	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x130
-	.uleb128 0x5f
-	.4byte	0x133ab
+	.uleb128 0x60
+	.4byte	0x13477
 	.4byte	.LLST27
-	.uleb128 0x5f
-	.4byte	0x133b6
+	.uleb128 0x60
+	.4byte	0x13482
 	.4byte	.LLST28
 	.uleb128 0x70
-	.4byte	0x137d9
-	.8byte	.LBB974
-	.8byte	.LBE974-.LBB974
+	.4byte	0x138a5
+	.8byte	.LBB986
+	.8byte	.LBE986-.LBB986
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x107c8
+	.4byte	0x10860
 	.uleb128 0x56
-	.8byte	.LBB975
-	.8byte	.LBE975-.LBB975
-	.uleb128 0x5f
-	.4byte	0x137e9
+	.8byte	.LBB987
+	.8byte	.LBE987-.LBB987
+	.uleb128 0x60
+	.4byte	0x138b5
 	.4byte	.LLST29
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB976
-	.8byte	.LBE976-.LBB976
-	.4byte	0x1081c
+	.8byte	.LBB988
+	.8byte	.LBE988-.LBB988
+	.4byte	0x108b4
 	.uleb128 0x57
-	.4byte	0x133c2
-	.uleb128 0x5b
-	.4byte	0x1385d
-	.8byte	.LBB977
-	.8byte	.LBE977-.LBB977
+	.4byte	0x1348e
+	.uleb128 0x5c
+	.4byte	0x13929
+	.8byte	.LBB989
+	.8byte	.LBE989-.LBB989
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13878
+	.4byte	0x13944
 	.uleb128 0x54
-	.4byte	0x1386d
+	.4byte	0x13939
 	.uleb128 0x56
-	.8byte	.LBB978
-	.8byte	.LBE978-.LBB978
+	.8byte	.LBB990
+	.8byte	.LBE990-.LBB990
 	.uleb128 0x57
-	.4byte	0x13883
+	.4byte	0x1394f
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x137ad
-	.8byte	.LBB979
-	.8byte	.LBE979-.LBB979
+	.uleb128 0x5c
+	.4byte	0x13879
+	.8byte	.LBB991
+	.8byte	.LBE991-.LBB991
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x137c7
+	.4byte	0x13893
 	.uleb128 0x54
-	.4byte	0x137bd
-	.uleb128 0x5b
-	.4byte	0x1388f
-	.8byte	.LBB980
-	.8byte	.LBE980-.LBB980
+	.4byte	0x13889
+	.uleb128 0x5c
+	.4byte	0x139b1
+	.8byte	.LBB992
+	.8byte	.LBE992-.LBB992
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x138a9
+	.4byte	0x139cb
 	.uleb128 0x54
-	.4byte	0x1389f
+	.4byte	0x139c1
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13351
-	.8byte	.LBB984
-	.8byte	.LBE984-.LBB984
+	.4byte	0x1341d
+	.8byte	.LBB996
+	.8byte	.LBE996-.LBB996
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x1091d
+	.4byte	0x109b5
 	.uleb128 0x54
-	.4byte	0x13361
+	.4byte	0x1342d
 	.uleb128 0x56
-	.8byte	.LBB985
-	.8byte	.LBE985-.LBB985
-	.uleb128 0x5f
-	.4byte	0x1336c
+	.8byte	.LBB997
+	.8byte	.LBE997-.LBB997
+	.uleb128 0x60
+	.4byte	0x13438
 	.4byte	.LLST30
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x170
-	.4byte	0x108e8
-	.uleb128 0x5f
-	.4byte	0x13378
+	.4byte	0x10980
+	.uleb128 0x60
+	.4byte	0x13444
 	.4byte	.LLST31
-	.uleb128 0x5b
-	.4byte	0x1385d
-	.8byte	.LBB987
-	.8byte	.LBE987-.LBB987
+	.uleb128 0x5c
+	.4byte	0x13929
+	.8byte	.LBB999
+	.8byte	.LBE999-.LBB999
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13878
+	.4byte	0x13944
 	.uleb128 0x54
-	.4byte	0x1386d
+	.4byte	0x13939
 	.uleb128 0x56
-	.8byte	.LBB988
-	.8byte	.LBE988-.LBB988
+	.8byte	.LBB1000
+	.8byte	.LBE1000-.LBB1000
 	.uleb128 0x57
-	.4byte	0x13883
+	.4byte	0x1394f
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x137d9
-	.8byte	.LBB989
-	.8byte	.LBE989-.LBB989
+	.uleb128 0x5c
+	.4byte	0x138a5
+	.8byte	.LBB1001
+	.8byte	.LBE1001-.LBB1001
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB990
-	.8byte	.LBE990-.LBB990
-	.uleb128 0x5f
-	.4byte	0x137e9
+	.8byte	.LBB1002
+	.8byte	.LBE1002-.LBB1002
+	.uleb128 0x60
+	.4byte	0x138b5
 	.4byte	.LLST32
 	.byte	0
 	.byte	0
@@ -41149,172 +41163,172 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL116
-	.4byte	0x14419
+	.4byte	0x14555
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x132b9
-	.8byte	.LBB1004
+	.uleb128 0x5b
+	.4byte	0x13385
+	.8byte	.LBB1016
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
-	.2byte	0x717
-	.4byte	0x10b58
+	.2byte	0x71d
+	.4byte	0x10bf0
 	.uleb128 0x54
-	.4byte	0x132de
+	.4byte	0x133aa
 	.uleb128 0x54
-	.4byte	0x132d3
+	.4byte	0x1339f
 	.uleb128 0x54
-	.4byte	0x132c9
+	.4byte	0x13395
 	.uleb128 0x6d
-	.4byte	0x13317
-	.8byte	.LBB1005
+	.4byte	0x133e3
+	.8byte	.LBB1017
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x1333c
+	.4byte	0x13408
 	.uleb128 0x54
-	.4byte	0x13331
+	.4byte	0x133fd
 	.uleb128 0x54
-	.4byte	0x13327
-	.uleb128 0x5d
+	.4byte	0x133f3
+	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x1f0
 	.uleb128 0x57
-	.4byte	0x13345
+	.4byte	0x13411
 	.uleb128 0x6e
-	.4byte	0x13385
-	.8byte	.LBB1007
+	.4byte	0x13451
+	.8byte	.LBB1019
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x10a8d
+	.4byte	0x10b25
 	.uleb128 0x54
-	.4byte	0x133a0
+	.4byte	0x1346c
 	.uleb128 0x6f
-	.4byte	0x13395
+	.4byte	0x13461
 	.4byte	.LLST34
-	.uleb128 0x5d
+	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x230
-	.uleb128 0x5f
-	.4byte	0x133ab
+	.uleb128 0x60
+	.4byte	0x13477
 	.4byte	.LLST35
-	.uleb128 0x5f
-	.4byte	0x133b6
+	.uleb128 0x60
+	.4byte	0x13482
 	.4byte	.LLST36
 	.uleb128 0x70
-	.4byte	0x137d9
-	.8byte	.LBB1009
-	.8byte	.LBE1009-.LBB1009
+	.4byte	0x138a5
+	.8byte	.LBB1021
+	.8byte	.LBE1021-.LBB1021
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x109f3
+	.4byte	0x10a8b
 	.uleb128 0x56
-	.8byte	.LBB1010
-	.8byte	.LBE1010-.LBB1010
-	.uleb128 0x5f
-	.4byte	0x137e9
+	.8byte	.LBB1022
+	.8byte	.LBE1022-.LBB1022
+	.uleb128 0x60
+	.4byte	0x138b5
 	.4byte	.LLST37
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1011
-	.8byte	.LBE1011-.LBB1011
-	.4byte	0x10a47
+	.8byte	.LBB1023
+	.8byte	.LBE1023-.LBB1023
+	.4byte	0x10adf
 	.uleb128 0x57
-	.4byte	0x133c2
-	.uleb128 0x5b
-	.4byte	0x1385d
-	.8byte	.LBB1012
-	.8byte	.LBE1012-.LBB1012
+	.4byte	0x1348e
+	.uleb128 0x5c
+	.4byte	0x13929
+	.8byte	.LBB1024
+	.8byte	.LBE1024-.LBB1024
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13878
+	.4byte	0x13944
 	.uleb128 0x54
-	.4byte	0x1386d
+	.4byte	0x13939
 	.uleb128 0x56
-	.8byte	.LBB1013
-	.8byte	.LBE1013-.LBB1013
+	.8byte	.LBB1025
+	.8byte	.LBE1025-.LBB1025
 	.uleb128 0x57
-	.4byte	0x13883
+	.4byte	0x1394f
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x137ad
-	.8byte	.LBB1014
-	.8byte	.LBE1014-.LBB1014
+	.uleb128 0x5c
+	.4byte	0x13879
+	.8byte	.LBB1026
+	.8byte	.LBE1026-.LBB1026
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x137c7
+	.4byte	0x13893
 	.uleb128 0x54
-	.4byte	0x137bd
-	.uleb128 0x5b
-	.4byte	0x1388f
-	.8byte	.LBB1015
-	.8byte	.LBE1015-.LBB1015
+	.4byte	0x13889
+	.uleb128 0x5c
+	.4byte	0x139b1
+	.8byte	.LBB1027
+	.8byte	.LBE1027-.LBB1027
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x138a9
+	.4byte	0x139cb
 	.uleb128 0x54
-	.4byte	0x1389f
+	.4byte	0x139c1
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13351
-	.8byte	.LBB1019
-	.8byte	.LBE1019-.LBB1019
+	.4byte	0x1341d
+	.8byte	.LBB1031
+	.8byte	.LBE1031-.LBB1031
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10b48
+	.4byte	0x10be0
 	.uleb128 0x54
-	.4byte	0x13361
+	.4byte	0x1342d
 	.uleb128 0x56
-	.8byte	.LBB1020
-	.8byte	.LBE1020-.LBB1020
-	.uleb128 0x5f
-	.4byte	0x1336c
+	.8byte	.LBB1032
+	.8byte	.LBE1032-.LBB1032
+	.uleb128 0x60
+	.4byte	0x13438
 	.4byte	.LLST38
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x270
-	.4byte	0x10b13
-	.uleb128 0x5f
-	.4byte	0x13378
+	.4byte	0x10bab
+	.uleb128 0x60
+	.4byte	0x13444
 	.4byte	.LLST39
-	.uleb128 0x5b
-	.4byte	0x1385d
-	.8byte	.LBB1022
-	.8byte	.LBE1022-.LBB1022
+	.uleb128 0x5c
+	.4byte	0x13929
+	.8byte	.LBB1034
+	.8byte	.LBE1034-.LBB1034
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13878
+	.4byte	0x13944
 	.uleb128 0x54
-	.4byte	0x1386d
+	.4byte	0x13939
 	.uleb128 0x56
-	.8byte	.LBB1023
-	.8byte	.LBE1023-.LBB1023
+	.8byte	.LBB1035
+	.8byte	.LBE1035-.LBB1035
 	.uleb128 0x57
-	.4byte	0x13883
+	.4byte	0x1394f
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x137d9
-	.8byte	.LBB1024
-	.8byte	.LBE1024-.LBB1024
+	.uleb128 0x5c
+	.4byte	0x138a5
+	.8byte	.LBB1036
+	.8byte	.LBE1036-.LBB1036
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB1025
-	.8byte	.LBE1025-.LBB1025
-	.uleb128 0x5f
-	.4byte	0x137e9
+	.8byte	.LBB1037
+	.8byte	.LBE1037-.LBB1037
+	.uleb128 0x60
+	.4byte	0x138b5
 	.4byte	.LLST40
 	.byte	0
 	.byte	0
@@ -41322,168 +41336,168 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL140
-	.4byte	0x14419
+	.4byte	0x14555
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x1328a
-	.8byte	.LBB1034
+	.uleb128 0x5b
+	.4byte	0x13356
+	.8byte	.LBB1046
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
-	.2byte	0x6e5
-	.4byte	0x10d78
+	.2byte	0x6eb
+	.4byte	0x10e10
 	.uleb128 0x54
-	.4byte	0x132af
+	.4byte	0x1337b
 	.uleb128 0x54
-	.4byte	0x132a4
+	.4byte	0x13370
 	.uleb128 0x54
-	.4byte	0x1329a
+	.4byte	0x13366
 	.uleb128 0x6d
-	.4byte	0x132e8
-	.8byte	.LBB1035
+	.4byte	0x133b4
+	.8byte	.LBB1047
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x1330d
+	.4byte	0x133d9
 	.uleb128 0x54
-	.4byte	0x13302
+	.4byte	0x133ce
 	.uleb128 0x54
-	.4byte	0x132f8
+	.4byte	0x133c4
 	.uleb128 0x6e
-	.4byte	0x13385
-	.8byte	.LBB1037
+	.4byte	0x13451
+	.8byte	.LBB1049
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10cae
+	.4byte	0x10d46
 	.uleb128 0x54
-	.4byte	0x133a0
+	.4byte	0x1346c
 	.uleb128 0x6f
-	.4byte	0x13395
+	.4byte	0x13461
 	.4byte	.LLST41
-	.uleb128 0x5d
+	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x2f0
-	.uleb128 0x5f
-	.4byte	0x133ab
+	.uleb128 0x60
+	.4byte	0x13477
 	.4byte	.LLST42
-	.uleb128 0x5f
-	.4byte	0x133b6
+	.uleb128 0x60
+	.4byte	0x13482
 	.4byte	.LLST43
 	.uleb128 0x70
-	.4byte	0x137d9
-	.8byte	.LBB1039
-	.8byte	.LBE1039-.LBB1039
+	.4byte	0x138a5
+	.8byte	.LBB1051
+	.8byte	.LBE1051-.LBB1051
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10c14
+	.4byte	0x10cac
 	.uleb128 0x56
-	.8byte	.LBB1040
-	.8byte	.LBE1040-.LBB1040
-	.uleb128 0x5f
-	.4byte	0x137e9
+	.8byte	.LBB1052
+	.8byte	.LBE1052-.LBB1052
+	.uleb128 0x60
+	.4byte	0x138b5
 	.4byte	.LLST44
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1041
-	.8byte	.LBE1041-.LBB1041
-	.4byte	0x10c68
+	.8byte	.LBB1053
+	.8byte	.LBE1053-.LBB1053
+	.4byte	0x10d00
 	.uleb128 0x57
-	.4byte	0x133c2
-	.uleb128 0x5b
-	.4byte	0x1385d
-	.8byte	.LBB1042
-	.8byte	.LBE1042-.LBB1042
+	.4byte	0x1348e
+	.uleb128 0x5c
+	.4byte	0x13929
+	.8byte	.LBB1054
+	.8byte	.LBE1054-.LBB1054
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13878
+	.4byte	0x13944
 	.uleb128 0x54
-	.4byte	0x1386d
+	.4byte	0x13939
 	.uleb128 0x56
-	.8byte	.LBB1043
-	.8byte	.LBE1043-.LBB1043
+	.8byte	.LBB1055
+	.8byte	.LBE1055-.LBB1055
 	.uleb128 0x57
-	.4byte	0x13883
+	.4byte	0x1394f
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x137ad
-	.8byte	.LBB1044
-	.8byte	.LBE1044-.LBB1044
+	.uleb128 0x5c
+	.4byte	0x13879
+	.8byte	.LBB1056
+	.8byte	.LBE1056-.LBB1056
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x137c7
+	.4byte	0x13893
 	.uleb128 0x54
-	.4byte	0x137bd
-	.uleb128 0x5b
-	.4byte	0x1388f
-	.8byte	.LBB1045
-	.8byte	.LBE1045-.LBB1045
+	.4byte	0x13889
+	.uleb128 0x5c
+	.4byte	0x139b1
+	.8byte	.LBB1057
+	.8byte	.LBE1057-.LBB1057
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x138a9
+	.4byte	0x139cb
 	.uleb128 0x54
-	.4byte	0x1389f
+	.4byte	0x139c1
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13351
-	.8byte	.LBB1051
-	.8byte	.LBE1051-.LBB1051
+	.4byte	0x1341d
+	.8byte	.LBB1063
+	.8byte	.LBE1063-.LBB1063
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x10d69
+	.4byte	0x10e01
 	.uleb128 0x54
-	.4byte	0x13361
+	.4byte	0x1342d
 	.uleb128 0x56
-	.8byte	.LBB1052
-	.8byte	.LBE1052-.LBB1052
-	.uleb128 0x5f
-	.4byte	0x1336c
+	.8byte	.LBB1064
+	.8byte	.LBE1064-.LBB1064
+	.uleb128 0x60
+	.4byte	0x13438
 	.4byte	.LLST45
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x340
-	.4byte	0x10d34
-	.uleb128 0x5f
-	.4byte	0x13378
+	.4byte	0x10dcc
+	.uleb128 0x60
+	.4byte	0x13444
 	.4byte	.LLST46
-	.uleb128 0x5b
-	.4byte	0x1385d
-	.8byte	.LBB1054
-	.8byte	.LBE1054-.LBB1054
+	.uleb128 0x5c
+	.4byte	0x13929
+	.8byte	.LBB1066
+	.8byte	.LBE1066-.LBB1066
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13878
+	.4byte	0x13944
 	.uleb128 0x54
-	.4byte	0x1386d
+	.4byte	0x13939
 	.uleb128 0x56
-	.8byte	.LBB1055
-	.8byte	.LBE1055-.LBB1055
+	.8byte	.LBB1067
+	.8byte	.LBE1067-.LBB1067
 	.uleb128 0x57
-	.4byte	0x13883
+	.4byte	0x1394f
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x137d9
-	.8byte	.LBB1056
-	.8byte	.LBE1056-.LBB1056
+	.uleb128 0x5c
+	.4byte	0x138a5
+	.8byte	.LBB1068
+	.8byte	.LBE1068-.LBB1068
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB1057
-	.8byte	.LBE1057-.LBB1057
-	.uleb128 0x5f
-	.4byte	0x137e9
+	.8byte	.LBB1069
+	.8byte	.LBE1069-.LBB1069
+	.uleb128 0x60
+	.4byte	0x138b5
 	.4byte	.LLST47
 	.byte	0
 	.byte	0
@@ -41491,172 +41505,172 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL167
-	.4byte	0x1440c
+	.4byte	0x14548
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x132b9
-	.8byte	.LBB1068
+	.uleb128 0x5b
+	.4byte	0x13385
+	.8byte	.LBB1080
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
-	.2byte	0x734
-	.4byte	0x10fb4
+	.2byte	0x73a
+	.4byte	0x1104c
 	.uleb128 0x54
-	.4byte	0x132de
+	.4byte	0x133aa
 	.uleb128 0x54
-	.4byte	0x132d3
+	.4byte	0x1339f
 	.uleb128 0x54
-	.4byte	0x132c9
+	.4byte	0x13395
 	.uleb128 0x6d
-	.4byte	0x13317
-	.8byte	.LBB1069
+	.4byte	0x133e3
+	.8byte	.LBB1081
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x1333c
+	.4byte	0x13408
 	.uleb128 0x54
-	.4byte	0x13331
+	.4byte	0x133fd
 	.uleb128 0x54
-	.4byte	0x13327
-	.uleb128 0x5d
+	.4byte	0x133f3
+	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x370
-	.uleb128 0x5f
-	.4byte	0x13345
+	.uleb128 0x60
+	.4byte	0x13411
 	.4byte	.LLST48
 	.uleb128 0x6e
-	.4byte	0x13385
-	.8byte	.LBB1071
+	.4byte	0x13451
+	.8byte	.LBB1083
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x10edc
+	.4byte	0x10f74
 	.uleb128 0x54
-	.4byte	0x133a0
+	.4byte	0x1346c
 	.uleb128 0x6f
-	.4byte	0x13395
+	.4byte	0x13461
 	.4byte	.LLST49
-	.uleb128 0x5d
+	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x3d0
-	.uleb128 0x5f
-	.4byte	0x133ab
+	.uleb128 0x60
+	.4byte	0x13477
 	.4byte	.LLST50
-	.uleb128 0x5f
-	.4byte	0x133b6
+	.uleb128 0x60
+	.4byte	0x13482
 	.4byte	.LLST51
 	.uleb128 0x70
-	.4byte	0x137d9
-	.8byte	.LBB1073
-	.8byte	.LBE1073-.LBB1073
+	.4byte	0x138a5
+	.8byte	.LBB1085
+	.8byte	.LBE1085-.LBB1085
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10e42
+	.4byte	0x10eda
 	.uleb128 0x56
-	.8byte	.LBB1074
-	.8byte	.LBE1074-.LBB1074
-	.uleb128 0x5f
-	.4byte	0x137e9
+	.8byte	.LBB1086
+	.8byte	.LBE1086-.LBB1086
+	.uleb128 0x60
+	.4byte	0x138b5
 	.4byte	.LLST52
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1075
-	.8byte	.LBE1075-.LBB1075
-	.4byte	0x10e96
+	.8byte	.LBB1087
+	.8byte	.LBE1087-.LBB1087
+	.4byte	0x10f2e
 	.uleb128 0x57
-	.4byte	0x133c2
-	.uleb128 0x5b
-	.4byte	0x1385d
-	.8byte	.LBB1076
-	.8byte	.LBE1076-.LBB1076
+	.4byte	0x1348e
+	.uleb128 0x5c
+	.4byte	0x13929
+	.8byte	.LBB1088
+	.8byte	.LBE1088-.LBB1088
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13878
+	.4byte	0x13944
 	.uleb128 0x54
-	.4byte	0x1386d
+	.4byte	0x13939
 	.uleb128 0x56
-	.8byte	.LBB1077
-	.8byte	.LBE1077-.LBB1077
+	.8byte	.LBB1089
+	.8byte	.LBE1089-.LBB1089
 	.uleb128 0x57
-	.4byte	0x13883
+	.4byte	0x1394f
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x137ad
-	.8byte	.LBB1078
-	.8byte	.LBE1078-.LBB1078
+	.uleb128 0x5c
+	.4byte	0x13879
+	.8byte	.LBB1090
+	.8byte	.LBE1090-.LBB1090
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x137c7
+	.4byte	0x13893
 	.uleb128 0x54
-	.4byte	0x137bd
-	.uleb128 0x5b
-	.4byte	0x1388f
-	.8byte	.LBB1079
-	.8byte	.LBE1079-.LBB1079
+	.4byte	0x13889
+	.uleb128 0x5c
+	.4byte	0x139b1
+	.8byte	.LBB1091
+	.8byte	.LBE1091-.LBB1091
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x138a9
+	.4byte	0x139cb
 	.uleb128 0x54
-	.4byte	0x1389f
+	.4byte	0x139c1
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13351
-	.8byte	.LBB1085
-	.8byte	.LBE1085-.LBB1085
+	.4byte	0x1341d
+	.8byte	.LBB1097
+	.8byte	.LBE1097-.LBB1097
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10f97
+	.4byte	0x1102f
 	.uleb128 0x54
-	.4byte	0x13361
+	.4byte	0x1342d
 	.uleb128 0x56
-	.8byte	.LBB1086
-	.8byte	.LBE1086-.LBB1086
-	.uleb128 0x5f
-	.4byte	0x1336c
+	.8byte	.LBB1098
+	.8byte	.LBE1098-.LBB1098
+	.uleb128 0x60
+	.4byte	0x13438
 	.4byte	.LLST53
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x420
-	.4byte	0x10f62
-	.uleb128 0x5f
-	.4byte	0x13378
+	.4byte	0x10ffa
+	.uleb128 0x60
+	.4byte	0x13444
 	.4byte	.LLST54
-	.uleb128 0x5b
-	.4byte	0x1385d
-	.8byte	.LBB1088
-	.8byte	.LBE1088-.LBB1088
+	.uleb128 0x5c
+	.4byte	0x13929
+	.8byte	.LBB1100
+	.8byte	.LBE1100-.LBB1100
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13878
+	.4byte	0x13944
 	.uleb128 0x54
-	.4byte	0x1386d
+	.4byte	0x13939
 	.uleb128 0x56
-	.8byte	.LBB1089
-	.8byte	.LBE1089-.LBB1089
+	.8byte	.LBB1101
+	.8byte	.LBE1101-.LBB1101
 	.uleb128 0x57
-	.4byte	0x13883
+	.4byte	0x1394f
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x137d9
-	.8byte	.LBB1090
-	.8byte	.LBE1090-.LBB1090
+	.uleb128 0x5c
+	.4byte	0x138a5
+	.8byte	.LBB1102
+	.8byte	.LBE1102-.LBB1102
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB1091
-	.8byte	.LBE1091-.LBB1091
-	.uleb128 0x5f
-	.4byte	0x137e9
+	.8byte	.LBB1103
+	.8byte	.LBE1103-.LBB1103
+	.uleb128 0x60
+	.4byte	0x138b5
 	.4byte	.LLST55
 	.byte	0
 	.byte	0
@@ -41664,68 +41678,68 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL179
-	.4byte	0x14419
+	.4byte	0x14555
 	.uleb128 0x4e
 	.8byte	.LVL257
-	.4byte	0x14256
+	.4byte	0x14378
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x1328a
-	.8byte	.LBB1104
+	.uleb128 0x5b
+	.4byte	0x13356
+	.8byte	.LBB1116
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
-	.2byte	0x751
-	.4byte	0x11066
+	.2byte	0x757
+	.4byte	0x110fe
 	.uleb128 0x54
-	.4byte	0x132af
+	.4byte	0x1337b
 	.uleb128 0x54
-	.4byte	0x132a4
+	.4byte	0x13370
 	.uleb128 0x54
-	.4byte	0x1329a
+	.4byte	0x13366
 	.uleb128 0x6d
-	.4byte	0x132e8
-	.8byte	.LBB1105
+	.4byte	0x133b4
+	.8byte	.LBB1117
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x1330d
+	.4byte	0x133d9
 	.uleb128 0x54
-	.4byte	0x13302
+	.4byte	0x133ce
 	.uleb128 0x54
-	.4byte	0x132f8
+	.4byte	0x133c4
 	.uleb128 0x6d
-	.4byte	0x13385
-	.8byte	.LBB1107
+	.4byte	0x13451
+	.8byte	.LBB1119
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x54
-	.4byte	0x133a0
+	.4byte	0x1346c
 	.uleb128 0x71
-	.4byte	0x13395
+	.4byte	0x13461
 	.uleb128 0x1
 	.byte	0x50
-	.uleb128 0x5d
+	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x4b0
 	.uleb128 0x57
-	.4byte	0x133ab
-	.uleb128 0x5f
-	.4byte	0x133b6
+	.4byte	0x13477
+	.uleb128 0x60
+	.4byte	0x13482
 	.4byte	.LLST56
-	.uleb128 0x5b
-	.4byte	0x137d9
-	.8byte	.LBB1109
-	.8byte	.LBE1109-.LBB1109
+	.uleb128 0x5c
+	.4byte	0x138a5
+	.8byte	.LBB1121
+	.8byte	.LBE1121-.LBB1121
 	.byte	0x6
 	.byte	0x4d
 	.uleb128 0x56
-	.8byte	.LBB1110
-	.8byte	.LBE1110-.LBB1110
-	.uleb128 0x5f
-	.4byte	0x137e9
+	.8byte	.LBB1122
+	.8byte	.LBE1122-.LBB1122
+	.uleb128 0x60
+	.4byte	0x138b5
 	.4byte	.LLST57
 	.byte	0
 	.byte	0
@@ -41733,164 +41747,164 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x1328a
-	.8byte	.LBB1116
+	.uleb128 0x5b
+	.4byte	0x13356
+	.8byte	.LBB1128
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
-	.2byte	0x741
-	.4byte	0x11286
+	.2byte	0x747
+	.4byte	0x1131e
 	.uleb128 0x54
-	.4byte	0x132af
+	.4byte	0x1337b
 	.uleb128 0x54
-	.4byte	0x132a4
+	.4byte	0x13370
 	.uleb128 0x54
-	.4byte	0x1329a
+	.4byte	0x13366
 	.uleb128 0x6d
-	.4byte	0x132e8
-	.8byte	.LBB1117
+	.4byte	0x133b4
+	.8byte	.LBB1129
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x1330d
+	.4byte	0x133d9
 	.uleb128 0x54
-	.4byte	0x13302
+	.4byte	0x133ce
 	.uleb128 0x54
-	.4byte	0x132f8
+	.4byte	0x133c4
 	.uleb128 0x6e
-	.4byte	0x13385
-	.8byte	.LBB1119
+	.4byte	0x13451
+	.8byte	.LBB1131
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x111bc
+	.4byte	0x11254
 	.uleb128 0x54
-	.4byte	0x133a0
+	.4byte	0x1346c
 	.uleb128 0x6f
-	.4byte	0x13395
+	.4byte	0x13461
 	.4byte	.LLST58
-	.uleb128 0x5d
+	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x540
-	.uleb128 0x5f
-	.4byte	0x133ab
+	.uleb128 0x60
+	.4byte	0x13477
 	.4byte	.LLST59
-	.uleb128 0x5f
-	.4byte	0x133b6
+	.uleb128 0x60
+	.4byte	0x13482
 	.4byte	.LLST60
 	.uleb128 0x70
-	.4byte	0x137d9
-	.8byte	.LBB1121
-	.8byte	.LBE1121-.LBB1121
+	.4byte	0x138a5
+	.8byte	.LBB1133
+	.8byte	.LBE1133-.LBB1133
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x11122
+	.4byte	0x111ba
 	.uleb128 0x56
-	.8byte	.LBB1122
-	.8byte	.LBE1122-.LBB1122
-	.uleb128 0x5f
-	.4byte	0x137e9
+	.8byte	.LBB1134
+	.8byte	.LBE1134-.LBB1134
+	.uleb128 0x60
+	.4byte	0x138b5
 	.4byte	.LLST61
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1123
-	.8byte	.LBE1123-.LBB1123
-	.4byte	0x11176
+	.8byte	.LBB1135
+	.8byte	.LBE1135-.LBB1135
+	.4byte	0x1120e
 	.uleb128 0x57
-	.4byte	0x133c2
-	.uleb128 0x5b
-	.4byte	0x1385d
-	.8byte	.LBB1124
-	.8byte	.LBE1124-.LBB1124
+	.4byte	0x1348e
+	.uleb128 0x5c
+	.4byte	0x13929
+	.8byte	.LBB1136
+	.8byte	.LBE1136-.LBB1136
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13878
+	.4byte	0x13944
 	.uleb128 0x54
-	.4byte	0x1386d
+	.4byte	0x13939
 	.uleb128 0x56
-	.8byte	.LBB1125
-	.8byte	.LBE1125-.LBB1125
+	.8byte	.LBB1137
+	.8byte	.LBE1137-.LBB1137
 	.uleb128 0x57
-	.4byte	0x13883
+	.4byte	0x1394f
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x137ad
-	.8byte	.LBB1126
-	.8byte	.LBE1126-.LBB1126
+	.uleb128 0x5c
+	.4byte	0x13879
+	.8byte	.LBB1138
+	.8byte	.LBE1138-.LBB1138
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x137c7
+	.4byte	0x13893
 	.uleb128 0x54
-	.4byte	0x137bd
-	.uleb128 0x5b
-	.4byte	0x1388f
-	.8byte	.LBB1127
-	.8byte	.LBE1127-.LBB1127
+	.4byte	0x13889
+	.uleb128 0x5c
+	.4byte	0x139b1
+	.8byte	.LBB1139
+	.8byte	.LBE1139-.LBB1139
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x138a9
+	.4byte	0x139cb
 	.uleb128 0x54
-	.4byte	0x1389f
+	.4byte	0x139c1
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13351
-	.8byte	.LBB1135
-	.8byte	.LBE1135-.LBB1135
+	.4byte	0x1341d
+	.8byte	.LBB1147
+	.8byte	.LBE1147-.LBB1147
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x11277
+	.4byte	0x1130f
 	.uleb128 0x54
-	.4byte	0x13361
+	.4byte	0x1342d
 	.uleb128 0x56
-	.8byte	.LBB1136
-	.8byte	.LBE1136-.LBB1136
-	.uleb128 0x5f
-	.4byte	0x1336c
+	.8byte	.LBB1148
+	.8byte	.LBE1148-.LBB1148
+	.uleb128 0x60
+	.4byte	0x13438
 	.4byte	.LLST62
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x590
-	.4byte	0x11242
-	.uleb128 0x5f
-	.4byte	0x13378
+	.4byte	0x112da
+	.uleb128 0x60
+	.4byte	0x13444
 	.4byte	.LLST63
-	.uleb128 0x5b
-	.4byte	0x1385d
-	.8byte	.LBB1138
-	.8byte	.LBE1138-.LBB1138
+	.uleb128 0x5c
+	.4byte	0x13929
+	.8byte	.LBB1150
+	.8byte	.LBE1150-.LBB1150
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13878
+	.4byte	0x13944
 	.uleb128 0x54
-	.4byte	0x1386d
+	.4byte	0x13939
 	.uleb128 0x56
-	.8byte	.LBB1139
-	.8byte	.LBE1139-.LBB1139
+	.8byte	.LBB1151
+	.8byte	.LBE1151-.LBB1151
 	.uleb128 0x57
-	.4byte	0x13883
+	.4byte	0x1394f
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x137d9
-	.8byte	.LBB1140
-	.8byte	.LBE1140-.LBB1140
+	.uleb128 0x5c
+	.4byte	0x138a5
+	.8byte	.LBB1152
+	.8byte	.LBE1152-.LBB1152
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB1141
-	.8byte	.LBE1141-.LBB1141
-	.uleb128 0x5f
-	.4byte	0x137e9
+	.8byte	.LBB1153
+	.8byte	.LBE1153-.LBB1153
+	.uleb128 0x60
+	.4byte	0x138b5
 	.4byte	.LLST64
 	.byte	0
 	.byte	0
@@ -41898,167 +41912,167 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL240
-	.4byte	0x1440c
+	.4byte	0x14548
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x1328a
-	.8byte	.LBB1152
+	.uleb128 0x5b
+	.4byte	0x13356
+	.8byte	.LBB1164
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
-	.2byte	0x6f3
-	.4byte	0x114a6
+	.2byte	0x6f9
+	.4byte	0x1153e
 	.uleb128 0x54
-	.4byte	0x132af
+	.4byte	0x1337b
 	.uleb128 0x54
-	.4byte	0x132a4
+	.4byte	0x13370
 	.uleb128 0x54
-	.4byte	0x1329a
+	.4byte	0x13366
 	.uleb128 0x6d
-	.4byte	0x132e8
-	.8byte	.LBB1153
+	.4byte	0x133b4
+	.8byte	.LBB1165
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x1330d
+	.4byte	0x133d9
 	.uleb128 0x54
-	.4byte	0x13302
+	.4byte	0x133ce
 	.uleb128 0x54
-	.4byte	0x132f8
+	.4byte	0x133c4
 	.uleb128 0x6e
-	.4byte	0x13385
-	.8byte	.LBB1155
+	.4byte	0x13451
+	.8byte	.LBB1167
 	.4byte	.Ldebug_ranges0+0x620
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x113dc
+	.4byte	0x11474
 	.uleb128 0x54
-	.4byte	0x133a0
+	.4byte	0x1346c
 	.uleb128 0x6f
-	.4byte	0x13395
+	.4byte	0x13461
 	.4byte	.LLST65
-	.uleb128 0x5d
+	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x620
-	.uleb128 0x5f
-	.4byte	0x133ab
+	.uleb128 0x60
+	.4byte	0x13477
 	.4byte	.LLST66
-	.uleb128 0x5f
-	.4byte	0x133b6
+	.uleb128 0x60
+	.4byte	0x13482
 	.4byte	.LLST67
 	.uleb128 0x70
-	.4byte	0x137d9
-	.8byte	.LBB1157
-	.8byte	.LBE1157-.LBB1157
+	.4byte	0x138a5
+	.8byte	.LBB1169
+	.8byte	.LBE1169-.LBB1169
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x11342
+	.4byte	0x113da
 	.uleb128 0x56
-	.8byte	.LBB1158
-	.8byte	.LBE1158-.LBB1158
-	.uleb128 0x5f
-	.4byte	0x137e9
+	.8byte	.LBB1170
+	.8byte	.LBE1170-.LBB1170
+	.uleb128 0x60
+	.4byte	0x138b5
 	.4byte	.LLST68
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1159
-	.8byte	.LBE1159-.LBB1159
-	.4byte	0x11396
+	.8byte	.LBB1171
+	.8byte	.LBE1171-.LBB1171
+	.4byte	0x1142e
 	.uleb128 0x57
-	.4byte	0x133c2
-	.uleb128 0x5b
-	.4byte	0x1385d
-	.8byte	.LBB1160
-	.8byte	.LBE1160-.LBB1160
+	.4byte	0x1348e
+	.uleb128 0x5c
+	.4byte	0x13929
+	.8byte	.LBB1172
+	.8byte	.LBE1172-.LBB1172
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13878
+	.4byte	0x13944
 	.uleb128 0x54
-	.4byte	0x1386d
+	.4byte	0x13939
 	.uleb128 0x56
-	.8byte	.LBB1161
-	.8byte	.LBE1161-.LBB1161
+	.8byte	.LBB1173
+	.8byte	.LBE1173-.LBB1173
 	.uleb128 0x57
-	.4byte	0x13883
+	.4byte	0x1394f
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x137ad
-	.8byte	.LBB1162
-	.8byte	.LBE1162-.LBB1162
+	.uleb128 0x5c
+	.4byte	0x13879
+	.8byte	.LBB1174
+	.8byte	.LBE1174-.LBB1174
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x137c7
+	.4byte	0x13893
 	.uleb128 0x54
-	.4byte	0x137bd
-	.uleb128 0x5b
-	.4byte	0x1388f
-	.8byte	.LBB1163
-	.8byte	.LBE1163-.LBB1163
+	.4byte	0x13889
+	.uleb128 0x5c
+	.4byte	0x139b1
+	.8byte	.LBB1175
+	.8byte	.LBE1175-.LBB1175
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x138a9
+	.4byte	0x139cb
 	.uleb128 0x54
-	.4byte	0x1389f
+	.4byte	0x139c1
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13351
-	.8byte	.LBB1171
-	.8byte	.LBE1171-.LBB1171
+	.4byte	0x1341d
+	.8byte	.LBB1183
+	.8byte	.LBE1183-.LBB1183
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x11497
+	.4byte	0x1152f
 	.uleb128 0x54
-	.4byte	0x13361
+	.4byte	0x1342d
 	.uleb128 0x56
-	.8byte	.LBB1172
-	.8byte	.LBE1172-.LBB1172
-	.uleb128 0x5f
-	.4byte	0x1336c
+	.8byte	.LBB1184
+	.8byte	.LBE1184-.LBB1184
+	.uleb128 0x60
+	.4byte	0x13438
 	.4byte	.LLST69
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x670
-	.4byte	0x11462
-	.uleb128 0x5f
-	.4byte	0x13378
+	.4byte	0x114fa
+	.uleb128 0x60
+	.4byte	0x13444
 	.4byte	.LLST70
-	.uleb128 0x5b
-	.4byte	0x1385d
-	.8byte	.LBB1174
-	.8byte	.LBE1174-.LBB1174
+	.uleb128 0x5c
+	.4byte	0x13929
+	.8byte	.LBB1186
+	.8byte	.LBE1186-.LBB1186
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13878
+	.4byte	0x13944
 	.uleb128 0x54
-	.4byte	0x1386d
+	.4byte	0x13939
 	.uleb128 0x56
-	.8byte	.LBB1175
-	.8byte	.LBE1175-.LBB1175
+	.8byte	.LBB1187
+	.8byte	.LBE1187-.LBB1187
 	.uleb128 0x57
-	.4byte	0x13883
+	.4byte	0x1394f
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x137d9
-	.8byte	.LBB1176
-	.8byte	.LBE1176-.LBB1176
+	.uleb128 0x5c
+	.4byte	0x138a5
+	.8byte	.LBB1188
+	.8byte	.LBE1188-.LBB1188
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB1177
-	.8byte	.LBE1177-.LBB1177
-	.uleb128 0x5f
-	.4byte	0x137e9
+	.8byte	.LBB1189
+	.8byte	.LBE1189-.LBB1189
+	.uleb128 0x60
+	.4byte	0x138b5
 	.4byte	.LLST71
 	.byte	0
 	.byte	0
@@ -42066,196 +42080,196 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL248
-	.4byte	0x1440c
+	.4byte	0x14548
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL81
-	.4byte	0x142db
+	.4byte	0x143fd
 	.uleb128 0x4e
 	.8byte	.LVL82
-	.4byte	0x14331
+	.4byte	0x1445f
 	.uleb128 0x4e
 	.8byte	.LVL83
-	.4byte	0x143c1
+	.4byte	0x144fd
 	.uleb128 0x4e
 	.8byte	.LVL94
-	.4byte	0x14426
+	.4byte	0x14562
 	.uleb128 0x4e
 	.8byte	.LVL97
-	.4byte	0x1426c
+	.4byte	0x1438e
 	.uleb128 0x4e
 	.8byte	.LVL100
-	.4byte	0x141f2
+	.4byte	0x14314
 	.uleb128 0x4e
 	.8byte	.LVL117
-	.4byte	0x143c1
+	.4byte	0x144fd
 	.uleb128 0x4e
 	.8byte	.LVL118
-	.4byte	0x14432
+	.4byte	0x1456e
 	.uleb128 0x4e
 	.8byte	.LVL120
-	.4byte	0x142e7
+	.4byte	0x14409
 	.uleb128 0x4e
 	.8byte	.LVL127
-	.4byte	0x142db
+	.4byte	0x143fd
 	.uleb128 0x4e
 	.8byte	.LVL141
-	.4byte	0x1443e
+	.4byte	0x1457a
 	.uleb128 0x4e
 	.8byte	.LVL142
-	.4byte	0x142e7
+	.4byte	0x14409
 	.uleb128 0x4e
 	.8byte	.LVL143
-	.4byte	0x1433b
+	.4byte	0x14453
 	.uleb128 0x4e
 	.8byte	.LVL153
-	.4byte	0x1444a
+	.4byte	0x14586
 	.uleb128 0x4e
 	.8byte	.LVL154
-	.4byte	0x143c1
+	.4byte	0x144fd
 	.uleb128 0x4e
 	.8byte	.LVL181
-	.4byte	0x141f2
+	.4byte	0x14314
 	.uleb128 0x4e
 	.8byte	.LVL184
-	.4byte	0x141f2
+	.4byte	0x14314
 	.uleb128 0x4e
 	.8byte	.LVL186
-	.4byte	0x142db
+	.4byte	0x143fd
 	.uleb128 0x4e
 	.8byte	.LVL188
-	.4byte	0x142db
+	.4byte	0x143fd
 	.uleb128 0x4e
 	.8byte	.LVL189
-	.4byte	0x14331
+	.4byte	0x1445f
 	.uleb128 0x4e
 	.8byte	.LVL190
-	.4byte	0x143c1
+	.4byte	0x144fd
 	.uleb128 0x4e
 	.8byte	.LVL203
-	.4byte	0x1426c
+	.4byte	0x1438e
 	.uleb128 0x4e
 	.8byte	.LVL206
-	.4byte	0x1426c
+	.4byte	0x1438e
 	.uleb128 0x4e
 	.8byte	.LVL208
-	.4byte	0x142db
+	.4byte	0x143fd
 	.uleb128 0x4e
 	.8byte	.LVL209
-	.4byte	0x143c1
+	.4byte	0x144fd
 	.uleb128 0x4e
 	.8byte	.LVL217
-	.4byte	0x14426
+	.4byte	0x14562
 	.uleb128 0x4e
 	.8byte	.LVL251
-	.4byte	0x1433b
+	.4byte	0x14453
 	.uleb128 0x4e
 	.8byte	.LVL258
-	.4byte	0x1426c
+	.4byte	0x1438e
 	.uleb128 0x4e
 	.8byte	.LVL259
-	.4byte	0x14379
+	.4byte	0x144b5
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0x11630
+	.4byte	0x116c8
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xa
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x11620
-	.uleb128 0x62
-	.4byte	.LASF3069
+	.4byte	0x116b8
+	.uleb128 0x63
+	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0x67a
+	.2byte	0x680
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1165f
-	.uleb128 0x64
-	.4byte	.LASF2999
+	.4byte	0x116f7
+	.uleb128 0x65
+	.4byte	.LASF3000
 	.byte	0x1
-	.2byte	0x67a
-	.4byte	0xe145
+	.2byte	0x680
+	.4byte	0xe160
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x67c
-	.4byte	0xa55b
+	.2byte	0x682
+	.4byte	0xa570
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3071
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x674
+	.2byte	0x67a
 	.8byte	.LFB2829
 	.8byte	.LFE2829-.LFB2829
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11699
+	.4byte	0x11731
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x674
-	.4byte	0x31bd
+	.2byte	0x67a
+	.4byte	0x31d2
 	.4byte	.LLST72
 	.uleb128 0x4e
 	.8byte	.LVL272
-	.4byte	0x12094
+	.4byte	0x12160
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3072
+	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0x668
+	.2byte	0x66e
 	.8byte	.LFB2828
 	.8byte	.LFE2828-.LFB2828
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x116f9
+	.4byte	0x11791
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x668
-	.4byte	0x31bd
+	.2byte	0x66e
+	.4byte	0x31d2
 	.4byte	.LLST12
 	.uleb128 0x46
-	.4byte	.LASF2958
+	.4byte	.LASF2959
 	.byte	0x1
-	.2byte	0x66a
-	.4byte	0xe748
-	.uleb128 0x5e
-	.4byte	0x1321c
-	.8byte	.LBB932
+	.2byte	0x670
+	.4byte	0xe763
+	.uleb128 0x5f
+	.4byte	0x132e8
+	.8byte	.LBB944
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.2byte	0x66e
+	.2byte	0x674
 	.uleb128 0x54
-	.4byte	0x13228
+	.4byte	0x132f4
 	.uleb128 0x4e
 	.8byte	.LVL71
-	.4byte	0x14456
+	.4byte	0x14592
 	.byte	0
 	.byte	0
-	.uleb128 0x62
-	.4byte	.LASF3073
+	.uleb128 0x63
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x658
+	.2byte	0x65e
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11723
-	.uleb128 0x64
-	.4byte	.LASF2999
+	.4byte	0x117bb
+	.uleb128 0x65
+	.4byte	.LASF3000
 	.byte	0x1
-	.2byte	0x658
-	.4byte	0xe145
+	.2byte	0x65e
+	.4byte	0xe160
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x65a
-	.4byte	0xe41e
+	.2byte	0x660
+	.4byte	0xe439
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3074
+	.4byte	.LASF3075
 	.byte	0x1
 	.2byte	0x52b
 	.4byte	0xc6
@@ -42263,600 +42277,612 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2826-.LFB2826
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11ebc
+	.4byte	0x11f88
 	.uleb128 0x51
 	.string	"ptr"
 	.byte	0x1
 	.2byte	0x52b
-	.4byte	0x443
-	.4byte	.LLST183
-	.uleb128 0x68
+	.4byte	0x458
+	.4byte	.LLST186
+	.uleb128 0x5a
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x52d
-	.4byte	0xe483
-	.4byte	.LLST184
+	.4byte	0xe49e
+	.4byte	.LLST187
 	.uleb128 0x46
-	.4byte	.LASF2958
+	.4byte	.LASF2959
 	.byte	0x1
 	.2byte	0x52e
-	.4byte	0xe748
-	.uleb128 0x68
+	.4byte	0xe763
+	.uleb128 0x5a
 	.string	"buf"
 	.byte	0x1
 	.2byte	0x52f
-	.4byte	0xe41e
-	.4byte	.LLST185
+	.4byte	0xe439
+	.4byte	.LLST188
 	.uleb128 0x59
-	.4byte	.LASF3075
+	.4byte	.LASF3076
 	.byte	0x1
 	.2byte	0x530
 	.4byte	0xc6
-	.4byte	.LLST186
+	.4byte	.LLST189
 	.uleb128 0x59
-	.4byte	.LASF2969
+	.4byte	.LASF2970
 	.byte	0x1
 	.2byte	0x531
 	.4byte	0xc6
-	.4byte	.LLST187
+	.4byte	.LLST190
 	.uleb128 0x4c
-	.4byte	.LASF3076
+	.4byte	.LASF3077
 	.byte	0x1
 	.2byte	0x532
-	.4byte	0xd8d1
+	.4byte	0xd8ec
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -72
 	.uleb128 0x59
-	.4byte	.LASF3077
+	.4byte	.LASF3078
 	.byte	0x1
 	.2byte	0x533
-	.4byte	0xe41e
-	.4byte	.LLST188
+	.4byte	0xe439
+	.4byte	.LLST191
 	.uleb128 0x6b
-	.4byte	.LASF3079
+	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0x628
-	.8byte	.L792
-	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x1200
-	.4byte	0x11873
+	.2byte	0x62e
+	.8byte	.L801
+	.uleb128 0x62
+	.4byte	.Ldebug_ranges0+0x1100
+	.4byte	0x1190b
 	.uleb128 0x46
-	.4byte	.LASF3066
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x571
+	.2byte	0x574
 	.4byte	0xc6
 	.uleb128 0x56
-	.8byte	.LBB1831
-	.8byte	.LBE1831-.LBB1831
+	.8byte	.LBB1824
+	.8byte	.LBE1824-.LBB1824
 	.uleb128 0x6b
-	.4byte	.LASF3078
+	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0x571
-	.8byte	.L775
+	.2byte	0x574
+	.8byte	.L784
 	.uleb128 0x4c
-	.4byte	.LASF3067
+	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x571
-	.4byte	0x1513
+	.2byte	0x574
+	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3066
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x571
-	.4byte	0x194
-	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x1230
-	.4byte	0x11857
+	.2byte	0x574
+	.4byte	0x199
+	.uleb128 0x62
+	.4byte	.Ldebug_ranges0+0x1130
+	.4byte	0x118ef
 	.uleb128 0x59
-	.4byte	.LASF3068
+	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0x571
-	.4byte	0x194
-	.4byte	.LLST202
+	.2byte	0x574
+	.4byte	0x199
+	.4byte	.LLST205
 	.uleb128 0x4e
-	.8byte	.LVL881
-	.4byte	0x143da
+	.8byte	.LVL896
+	.4byte	0x14516
 	.uleb128 0x4e
-	.8byte	.LVL882
-	.4byte	0x143e6
+	.8byte	.LVL897
+	.4byte	0x14522
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL879
-	.4byte	0x143f3
+	.8byte	.LVL894
+	.4byte	0x1452f
 	.uleb128 0x4e
-	.8byte	.LVL883
-	.4byte	0x143ff
+	.8byte	.LVL898
+	.4byte	0x1453b
 	.byte	0
 	.byte	0
-	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x11a0
-	.4byte	0x11915
+	.uleb128 0x62
+	.4byte	.Ldebug_ranges0+0x10a0
+	.4byte	0x119ad
 	.uleb128 0x46
-	.4byte	.LASF3066
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x617
+	.2byte	0x61a
 	.4byte	0xc6
 	.uleb128 0x56
-	.8byte	.LBB1827
-	.8byte	.LBE1827-.LBB1827
+	.8byte	.LBB1820
+	.8byte	.LBE1820-.LBB1820
 	.uleb128 0x6b
-	.4byte	.LASF3078
+	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0x617
-	.8byte	.L829
+	.2byte	0x61a
+	.8byte	.L838
 	.uleb128 0x4c
-	.4byte	.LASF3067
+	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x617
-	.4byte	0x1513
+	.2byte	0x61a
+	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3066
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x617
-	.4byte	0x194
-	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x11d0
-	.4byte	0x118f9
+	.2byte	0x61a
+	.4byte	0x199
+	.uleb128 0x62
+	.4byte	.Ldebug_ranges0+0x10d0
+	.4byte	0x11991
 	.uleb128 0x59
-	.4byte	.LASF3068
+	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0x617
-	.4byte	0x194
-	.4byte	.LLST201
+	.2byte	0x61a
+	.4byte	0x199
+	.4byte	.LLST204
 	.uleb128 0x4e
-	.8byte	.LVL872
-	.4byte	0x143da
+	.8byte	.LVL887
+	.4byte	0x14516
 	.uleb128 0x4e
-	.8byte	.LVL873
-	.4byte	0x143e6
+	.8byte	.LVL888
+	.4byte	0x14522
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL870
-	.4byte	0x143f3
+	.8byte	.LVL885
+	.4byte	0x1452f
 	.uleb128 0x4e
-	.8byte	.LVL874
-	.4byte	0x143ff
+	.8byte	.LVL889
+	.4byte	0x1453b
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1813
-	.8byte	.LBE1813-.LBB1813
-	.4byte	0x119c7
+	.8byte	.LBB1806
+	.8byte	.LBE1806-.LBB1806
+	.4byte	0x11a5f
 	.uleb128 0x46
-	.4byte	.LASF3066
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x644
+	.2byte	0x64a
 	.4byte	0xc6
 	.uleb128 0x56
-	.8byte	.LBB1814
-	.8byte	.LBE1814-.LBB1814
+	.8byte	.LBB1807
+	.8byte	.LBE1807-.LBB1807
 	.uleb128 0x72
-	.4byte	.LASF3078
+	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0x644
+	.2byte	0x64a
 	.uleb128 0x4c
-	.4byte	.LASF3067
+	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x644
-	.4byte	0x1513
+	.2byte	0x64a
+	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3066
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x644
-	.4byte	0x194
+	.2byte	0x64a
+	.4byte	0x199
 	.uleb128 0x6c
-	.8byte	.LBB1815
-	.8byte	.LBE1815-.LBB1815
-	.4byte	0x119ab
+	.8byte	.LBB1808
+	.8byte	.LBE1808-.LBB1808
+	.4byte	0x11a43
 	.uleb128 0x59
-	.4byte	.LASF3068
+	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0x644
-	.4byte	0x194
-	.4byte	.LLST190
+	.2byte	0x64a
+	.4byte	0x199
+	.4byte	.LLST193
 	.uleb128 0x4e
-	.8byte	.LVL800
-	.4byte	0x143da
+	.8byte	.LVL811
+	.4byte	0x14516
 	.uleb128 0x4e
-	.8byte	.LVL801
-	.4byte	0x143e6
+	.8byte	.LVL812
+	.4byte	0x14522
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL798
-	.4byte	0x143f3
+	.8byte	.LVL809
+	.4byte	0x1452f
 	.uleb128 0x4e
-	.8byte	.LVL802
-	.4byte	0x143ff
+	.8byte	.LVL813
+	.4byte	0x1453b
 	.byte	0
 	.byte	0
-	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x1080
-	.4byte	0x11a5d
+	.uleb128 0x62
+	.4byte	.Ldebug_ranges0+0xf80
+	.4byte	0x11af5
 	.uleb128 0x46
-	.4byte	.LASF3066
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x650
+	.2byte	0x656
 	.4byte	0xc6
-	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0x1080
+	.uleb128 0x5e
+	.4byte	.Ldebug_ranges0+0xf80
 	.uleb128 0x6b
-	.4byte	.LASF3078
+	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0x650
-	.8byte	.L845
+	.2byte	0x656
+	.8byte	.L854
 	.uleb128 0x4c
-	.4byte	.LASF3067
+	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x650
-	.4byte	0x1513
+	.2byte	0x656
+	.4byte	0x1528
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3066
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x650
-	.4byte	0x194
-	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x10c0
-	.4byte	0x11a41
+	.2byte	0x656
+	.4byte	0x199
+	.uleb128 0x62
+	.4byte	.Ldebug_ranges0+0xfc0
+	.4byte	0x11ad9
 	.uleb128 0x59
-	.4byte	.LASF3068
+	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0x650
-	.4byte	0x194
-	.4byte	.LLST189
+	.2byte	0x656
+	.4byte	0x199
+	.4byte	.LLST192
 	.uleb128 0x4e
-	.8byte	.LVL766
-	.4byte	0x143da
+	.8byte	.LVL783
+	.4byte	0x14516
 	.uleb128 0x4e
-	.8byte	.LVL767
-	.4byte	0x143e6
+	.8byte	.LVL784
+	.4byte	0x14522
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL764
-	.4byte	0x143f3
+	.8byte	.LVL781
+	.4byte	0x1452f
 	.uleb128 0x4e
-	.8byte	.LVL768
-	.4byte	0x143ff
+	.8byte	.LVL785
+	.4byte	0x1453b
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x11ebc
-	.8byte	.LBB1807
-	.4byte	.Ldebug_ranges0+0x1100
+	.uleb128 0x5b
+	.4byte	0x11f88
+	.8byte	.LBB1800
+	.4byte	.Ldebug_ranges0+0x1000
 	.byte	0x1
-	.2byte	0x5ec
-	.4byte	0x11aae
+	.2byte	0x5ef
+	.4byte	0x11b46
 	.uleb128 0x54
-	.4byte	0x11ee5
+	.4byte	0x11fb1
 	.uleb128 0x54
-	.4byte	0x11ed9
+	.4byte	0x11fa5
 	.uleb128 0x54
-	.4byte	0x11ecd
-	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0x1100
+	.4byte	0x11f99
+	.uleb128 0x5e
+	.4byte	.Ldebug_ranges0+0x1000
 	.uleb128 0x57
-	.4byte	0x11ef1
+	.4byte	0x11fbd
 	.uleb128 0x57
-	.4byte	0x11efb
+	.4byte	0x11fc7
 	.uleb128 0x57
-	.4byte	0x11f07
+	.4byte	0x11fd3
 	.uleb128 0x57
-	.4byte	0x11f13
+	.4byte	0x11fdf
 	.uleb128 0x57
-	.4byte	0x11f1f
+	.4byte	0x11feb
 	.uleb128 0x57
-	.4byte	0x11f2b
+	.4byte	0x11ff7
 	.uleb128 0x73
-	.4byte	0x11f37
+	.4byte	0x12003
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12f22
-	.8byte	.LBB1816
-	.8byte	.LBE1816-.LBB1816
+	.4byte	0x12fee
+	.8byte	.LBB1809
+	.8byte	.LBE1809-.LBB1809
 	.byte	0x1
-	.2byte	0x64d
-	.4byte	0x11af9
+	.2byte	0x653
+	.4byte	0x11b91
 	.uleb128 0x54
-	.4byte	0x12f3d
+	.4byte	0x13009
 	.uleb128 0x54
-	.4byte	0x12f32
+	.4byte	0x12ffe
 	.uleb128 0x56
-	.8byte	.LBB1817
-	.8byte	.LBE1817-.LBB1817
+	.8byte	.LBB1810
+	.8byte	.LBE1810-.LBB1810
 	.uleb128 0x57
-	.4byte	0x12f48
+	.4byte	0x13014
 	.uleb128 0x4e
-	.8byte	.LVL803
-	.4byte	0x1406a
+	.8byte	.LVL814
+	.4byte	0x1418c
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x12bc8
-	.8byte	.LBB1818
-	.4byte	.Ldebug_ranges0+0x1140
+	.uleb128 0x5b
+	.4byte	0x12c94
+	.8byte	.LBB1811
+	.4byte	.Ldebug_ranges0+0x1040
 	.byte	0x1
-	.2byte	0x58e
-	.4byte	0x11bbf
+	.2byte	0x591
+	.4byte	0x11c57
 	.uleb128 0x54
-	.4byte	0x12c05
+	.4byte	0x12cd1
 	.uleb128 0x54
-	.4byte	0x12c05
+	.4byte	0x12cd1
 	.uleb128 0x54
-	.4byte	0x12c05
+	.4byte	0x12cd1
 	.uleb128 0x54
-	.4byte	0x12c11
+	.4byte	0x12cdd
 	.uleb128 0x54
-	.4byte	0x12bf9
+	.4byte	0x12cc5
 	.uleb128 0x54
-	.4byte	0x12bed
+	.4byte	0x12cb9
 	.uleb128 0x54
-	.4byte	0x12be1
+	.4byte	0x12cad
 	.uleb128 0x54
-	.4byte	0x12bd5
-	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0x1140
+	.4byte	0x12ca1
+	.uleb128 0x5e
+	.4byte	.Ldebug_ranges0+0x1040
 	.uleb128 0x57
-	.4byte	0x12c1d
-	.uleb128 0x5f
-	.4byte	0x12c29
-	.4byte	.LLST191
+	.4byte	0x12ce9
+	.uleb128 0x60
+	.4byte	0x12cf5
+	.4byte	.LLST194
 	.uleb128 0x57
-	.4byte	0x12c35
-	.uleb128 0x5f
-	.4byte	0x12c41
-	.4byte	.LLST192
-	.uleb128 0x5f
-	.4byte	0x12c4d
-	.4byte	.LLST193
+	.4byte	0x12d01
+	.uleb128 0x60
+	.4byte	0x12d0d
+	.4byte	.LLST195
+	.uleb128 0x60
+	.4byte	0x12d19
+	.4byte	.LLST196
 	.uleb128 0x57
-	.4byte	0x12c59
+	.4byte	0x12d25
 	.uleb128 0x57
-	.4byte	0x12c65
+	.4byte	0x12d31
 	.uleb128 0x57
-	.4byte	0x12c71
-	.uleb128 0x5f
-	.4byte	0x12c7d
-	.4byte	.LLST194
+	.4byte	0x12d3d
+	.uleb128 0x60
+	.4byte	0x12d49
+	.4byte	.LLST197
 	.uleb128 0x57
-	.4byte	0x12c89
-	.uleb128 0x5f
-	.4byte	0x12c95
-	.4byte	.LLST195
+	.4byte	0x12d55
 	.uleb128 0x60
-	.4byte	0x12ca1
+	.4byte	0x12d61
+	.4byte	.LLST198
+	.uleb128 0x61
+	.4byte	0x12d6d
 	.uleb128 0x1
 	.byte	0x5e
-	.uleb128 0x5f
-	.4byte	0x12cab
-	.4byte	.LLST196
-	.uleb128 0x5f
-	.4byte	0x12cb5
-	.4byte	.LLST197
-	.uleb128 0x5f
-	.4byte	0x12cc1
-	.4byte	.LLST198
-	.uleb128 0x5f
-	.4byte	0x12ccd
+	.uleb128 0x60
+	.4byte	0x12d77
 	.4byte	.LLST199
-	.uleb128 0x5f
-	.4byte	0x12cd9
+	.uleb128 0x60
+	.4byte	0x12d81
 	.4byte	.LLST200
+	.uleb128 0x60
+	.4byte	0x12d8d
+	.4byte	.LLST201
+	.uleb128 0x60
+	.4byte	0x12d99
+	.4byte	.LLST202
+	.uleb128 0x60
+	.4byte	0x12da5
+	.4byte	.LLST203
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12f22
-	.8byte	.LBB1838
-	.8byte	.LBE1838-.LBB1838
+	.4byte	0x12fee
+	.8byte	.LBB1831
+	.8byte	.LBE1831-.LBB1831
 	.byte	0x1
 	.2byte	0x538
-	.4byte	0x11c0a
+	.4byte	0x11ca2
 	.uleb128 0x54
-	.4byte	0x12f3d
+	.4byte	0x13009
 	.uleb128 0x54
-	.4byte	0x12f32
+	.4byte	0x12ffe
 	.uleb128 0x56
-	.8byte	.LBB1839
-	.8byte	.LBE1839-.LBB1839
+	.8byte	.LBB1832
+	.8byte	.LBE1832-.LBB1832
 	.uleb128 0x57
-	.4byte	0x12f48
+	.4byte	0x13014
 	.uleb128 0x4e
-	.8byte	.LVL887
-	.4byte	0x1406a
+	.8byte	.LVL903
+	.4byte	0x1418c
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL751
-	.4byte	0x14462
-	.uleb128 0x4e
-	.8byte	.LVL752
-	.4byte	0x1446e
-	.uleb128 0x4e
-	.8byte	.LVL753
-	.4byte	0x14426
+	.8byte	.LVL760
+	.4byte	0x1459e
 	.uleb128 0x4e
-	.8byte	.LVL771
-	.4byte	0x142cf
+	.8byte	.LVL761
+	.4byte	0x14314
 	.uleb128 0x4e
-	.8byte	.LVL772
-	.4byte	0x141f2
+	.8byte	.LVL763
+	.4byte	0x143f1
 	.uleb128 0x4e
-	.8byte	.LVL773
-	.4byte	0x1447a
+	.8byte	.LVL764
+	.4byte	0x14314
 	.uleb128 0x4e
-	.8byte	.LVL774
-	.4byte	0x14331
+	.8byte	.LVL765
+	.4byte	0x145aa
 	.uleb128 0x4e
-	.8byte	.LVL775
-	.4byte	0x14331
+	.8byte	.LVL766
+	.4byte	0x1445f
 	.uleb128 0x4e
-	.8byte	.LVL776
-	.4byte	0x14486
+	.8byte	.LVL767
+	.4byte	0x1445f
 	.uleb128 0x4e
-	.8byte	.LVL777
-	.4byte	0x11f40
+	.8byte	.LVL768
+	.4byte	0x145b6
 	.uleb128 0x4e
-	.8byte	.LVL779
-	.4byte	0x141f2
+	.8byte	.LVL770
+	.4byte	0x145c2
 	.uleb128 0x4e
-	.8byte	.LVL780
-	.4byte	0x1232e
+	.8byte	.LVL789
+	.4byte	0x1438e
 	.uleb128 0x4e
-	.8byte	.LVL783
-	.4byte	0x141f2
+	.8byte	.LVL791
+	.4byte	0x145c2
 	.uleb128 0x4e
-	.8byte	.LVL784
-	.4byte	0x1433b
+	.8byte	.LVL792
+	.4byte	0x14562
 	.uleb128 0x4e
-	.8byte	.LVL785
-	.4byte	0x1446e
+	.8byte	.LVL796
+	.4byte	0x14314
 	.uleb128 0x4e
-	.8byte	.LVL787
-	.4byte	0x14426
+	.8byte	.LVL799
+	.4byte	0x14314
 	.uleb128 0x4e
-	.8byte	.LVL792
-	.4byte	0x141f2
+	.8byte	.LVL800
+	.4byte	0x14453
 	.uleb128 0x4e
-	.8byte	.LVL794
-	.4byte	0x11f40
+	.8byte	.LVL801
+	.4byte	0x145c2
 	.uleb128 0x4e
-	.8byte	.LVL795
-	.4byte	0x1426c
+	.8byte	.LVL803
+	.4byte	0x14562
 	.uleb128 0x4e
-	.8byte	.LVL797
-	.4byte	0x1446e
+	.8byte	.LVL806
+	.4byte	0x1200c
 	.uleb128 0x4e
 	.8byte	.LVL807
-	.4byte	0x1447a
-	.uleb128 0x4e
-	.8byte	.LVL808
-	.4byte	0x14331
-	.uleb128 0x4e
-	.8byte	.LVL809
-	.4byte	0x1446e
+	.4byte	0x1438e
 	.uleb128 0x4e
-	.8byte	.LVL810
-	.4byte	0x14426
+	.8byte	.LVL818
+	.4byte	0x145aa
 	.uleb128 0x4e
-	.8byte	.LVL811
-	.4byte	0x12e3d
+	.8byte	.LVL819
+	.4byte	0x1445f
 	.uleb128 0x4e
-	.8byte	.LVL812
-	.4byte	0x14486
+	.8byte	.LVL820
+	.4byte	0x145c2
 	.uleb128 0x4e
-	.8byte	.LVL813
-	.4byte	0x141f2
+	.8byte	.LVL821
+	.4byte	0x14562
 	.uleb128 0x4e
-	.8byte	.LVL814
-	.4byte	0x1232e
+	.8byte	.LVL822
+	.4byte	0x12f09
 	.uleb128 0x4e
-	.8byte	.LVL815
-	.4byte	0x1426c
+	.8byte	.LVL823
+	.4byte	0x145b6
 	.uleb128 0x4e
-	.8byte	.LVL834
-	.4byte	0x141f2
+	.8byte	.LVL824
+	.4byte	0x14314
 	.uleb128 0x4e
-	.8byte	.LVL835
-	.4byte	0x1232e
+	.8byte	.LVL825
+	.4byte	0x123fa
 	.uleb128 0x4e
-	.8byte	.LVL836
-	.4byte	0x142cf
+	.8byte	.LVL844
+	.4byte	0x14314
 	.uleb128 0x4e
-	.8byte	.LVL839
-	.4byte	0x142cf
+	.8byte	.LVL845
+	.4byte	0x123fa
 	.uleb128 0x4e
-	.8byte	.LVL841
-	.4byte	0x14128
+	.8byte	.LVL846
+	.4byte	0x143f1
 	.uleb128 0x4e
-	.8byte	.LVL842
-	.4byte	0x141f2
+	.8byte	.LVL849
+	.4byte	0x143f1
 	.uleb128 0x4e
-	.8byte	.LVL845
-	.4byte	0x141f2
+	.8byte	.LVL851
+	.4byte	0x1424a
 	.uleb128 0x4e
 	.8byte	.LVL852
-	.4byte	0x11f40
+	.4byte	0x1200c
 	.uleb128 0x4e
-	.8byte	.LVL856
-	.4byte	0x14492
+	.8byte	.LVL854
+	.4byte	0x14314
+	.uleb128 0x4e
+	.8byte	.LVL855
+	.4byte	0x123fa
 	.uleb128 0x4e
 	.8byte	.LVL857
-	.4byte	0x141f2
+	.4byte	0x14314
 	.uleb128 0x4e
 	.8byte	.LVL860
-	.4byte	0x141f2
+	.4byte	0x14314
 	.uleb128 0x4e
 	.8byte	.LVL861
-	.4byte	0x14492
+	.4byte	0x14314
 	.uleb128 0x4e
 	.8byte	.LVL862
-	.4byte	0x1433b
+	.4byte	0x145c2
 	.uleb128 0x4e
 	.8byte	.LVL863
-	.4byte	0x14331
-	.uleb128 0x4e
-	.8byte	.LVL864
-	.4byte	0x14331
+	.4byte	0x14562
 	.uleb128 0x4e
-	.8byte	.LVL865
-	.4byte	0x14331
+	.8byte	.LVL870
+	.4byte	0x1200c
 	.uleb128 0x4e
-	.8byte	.LVL868
-	.4byte	0x141f2
+	.8byte	.LVL874
+	.4byte	0x14314
 	.uleb128 0x4e
-	.8byte	.LVL869
-	.4byte	0x12d76
+	.8byte	.LVL875
+	.4byte	0x145ce
 	.uleb128 0x4e
 	.8byte	.LVL876
-	.4byte	0x14128
+	.4byte	0x14453
 	.uleb128 0x4e
-	.8byte	.LVL885
-	.4byte	0x14331
+	.8byte	.LVL877
+	.4byte	0x1445f
 	.uleb128 0x4e
-	.8byte	.LVL889
-	.4byte	0x1426c
+	.8byte	.LVL878
+	.4byte	0x1445f
 	.uleb128 0x4e
-	.8byte	.LVL890
-	.4byte	0x14128
+	.8byte	.LVL879
+	.4byte	0x1445f
+	.uleb128 0x4e
+	.8byte	.LVL882
+	.4byte	0x145ce
+	.uleb128 0x4e
+	.8byte	.LVL883
+	.4byte	0x14314
 	.uleb128 0x4e
 	.8byte	.LVL891
-	.4byte	0x14128
+	.4byte	0x1424a
 	.uleb128 0x4e
-	.8byte	.LVL893
-	.4byte	0x14379
+	.8byte	.LVL900
+	.4byte	0x1445f
+	.uleb128 0x4e
+	.8byte	.LVL901
+	.4byte	0x12e42
+	.uleb128 0x4e
+	.8byte	.LVL905
+	.4byte	0x1424a
+	.uleb128 0x4e
+	.8byte	.LVL906
+	.4byte	0x1200c
+	.uleb128 0x4e
+	.8byte	.LVL907
+	.4byte	0x1438e
+	.uleb128 0x4e
+	.8byte	.LVL908
+	.4byte	0x1424a
+	.uleb128 0x4e
+	.8byte	.LVL910
+	.4byte	0x144b5
 	.byte	0
-	.uleb128 0x62
-	.4byte	.LASF3080
+	.uleb128 0x63
+	.4byte	.LASF3081
 	.byte	0x1
 	.2byte	0x514
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11f40
-	.uleb128 0x64
-	.4byte	.LASF3081
-	.byte	0x1
-	.2byte	0x514
-	.4byte	0x4669
-	.uleb128 0x64
+	.4byte	0x1200c
+	.uleb128 0x65
 	.4byte	.LASF3082
 	.byte	0x1
 	.2byte	0x514
-	.4byte	0x4669
-	.uleb128 0x64
+	.4byte	0x467e
+	.uleb128 0x65
 	.4byte	.LASF3083
 	.byte	0x1
 	.2byte	0x514
+	.4byte	0x467e
+	.uleb128 0x65
+	.4byte	.LASF3084
+	.byte	0x1
+	.2byte	0x514
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
@@ -42864,37 +42890,37 @@ __exitcall_ebc_exit:
 	.2byte	0x516
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3084
+	.4byte	.LASF3085
 	.byte	0x1
 	.2byte	0x517
-	.4byte	0x155
+	.4byte	0x15a
 	.uleb128 0x46
-	.4byte	.LASF3085
+	.4byte	.LASF3086
 	.byte	0x1
 	.2byte	0x517
-	.4byte	0x155
+	.4byte	0x15a
 	.uleb128 0x46
-	.4byte	.LASF3086
+	.4byte	.LASF3087
 	.byte	0x1
 	.2byte	0x518
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3087
+	.4byte	.LASF3088
 	.byte	0x1
 	.2byte	0x519
-	.4byte	0x466f
+	.4byte	0x4684
 	.uleb128 0x46
-	.4byte	.LASF3088
+	.4byte	.LASF3089
 	.byte	0x1
 	.2byte	0x51a
-	.4byte	0x466f
+	.4byte	0x4684
 	.uleb128 0x72
-	.4byte	.LASF3089
+	.4byte	.LASF3090
 	.byte	0x1
 	.2byte	0x527
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3090
+	.4byte	.LASF3091
 	.byte	0x1
 	.2byte	0x4b9
 	.4byte	0xc6
@@ -42902,20 +42928,20 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2824-.LFB2824
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12094
+	.4byte	0x12160
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x4b9
-	.4byte	0xe483
+	.4byte	0xe49e
 	.4byte	.LLST73
 	.uleb128 0x46
-	.4byte	.LASF2958
+	.4byte	.LASF2959
 	.byte	0x1
 	.2byte	0x4bb
-	.4byte	0xe748
+	.4byte	0xe763
 	.uleb128 0x59
-	.4byte	.LASF3091
+	.4byte	.LASF3092
 	.byte	0x1
 	.2byte	0x4bc
 	.4byte	0xc6
@@ -42928,118 +42954,118 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x64
 	.uleb128 0x53
-	.4byte	0x13197
-	.8byte	.LBB1206
-	.8byte	.LBE1206-.LBB1206
+	.4byte	0x13263
+	.8byte	.LBB1218
+	.8byte	.LBE1218-.LBB1218
 	.byte	0x1
 	.2byte	0x4c0
-	.4byte	0x11fc3
+	.4byte	0x1208f
 	.uleb128 0x54
-	.4byte	0x131b2
+	.4byte	0x1327e
 	.uleb128 0x54
-	.4byte	0x131a7
+	.4byte	0x13273
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL278
-	.4byte	0x141f2
+	.4byte	0x14314
 	.uleb128 0x4e
 	.8byte	.LVL279
-	.4byte	0x1449e
+	.4byte	0x145da
 	.uleb128 0x4e
 	.8byte	.LVL283
-	.4byte	0x1426c
+	.4byte	0x1438e
 	.uleb128 0x4e
 	.8byte	.LVL284
-	.4byte	0x141f2
+	.4byte	0x14314
 	.uleb128 0x4e
 	.8byte	.LVL286
-	.4byte	0x1449e
+	.4byte	0x145da
 	.uleb128 0x4e
 	.8byte	.LVL287
-	.4byte	0x1426c
+	.4byte	0x1438e
 	.uleb128 0x4e
 	.8byte	.LVL288
-	.4byte	0x1449e
+	.4byte	0x145da
 	.uleb128 0x4e
 	.8byte	.LVL289
-	.4byte	0x1449e
+	.4byte	0x145da
 	.uleb128 0x4e
 	.8byte	.LVL290
-	.4byte	0x1449e
+	.4byte	0x145da
 	.uleb128 0x4e
 	.8byte	.LVL291
-	.4byte	0x1449e
+	.4byte	0x145da
 	.uleb128 0x4e
 	.8byte	.LVL292
-	.4byte	0x1449e
+	.4byte	0x145da
 	.uleb128 0x4e
 	.8byte	.LVL293
-	.4byte	0x1449e
+	.4byte	0x145da
 	.uleb128 0x4e
 	.8byte	.LVL294
-	.4byte	0x1449e
+	.4byte	0x145da
 	.uleb128 0x4e
 	.8byte	.LVL295
-	.4byte	0x1449e
+	.4byte	0x145da
 	.uleb128 0x4e
 	.8byte	.LVL296
-	.4byte	0x141f2
+	.4byte	0x14314
 	.uleb128 0x4e
 	.8byte	.LVL297
-	.4byte	0x14379
+	.4byte	0x144b5
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3092
+	.4byte	.LASF3093
 	.byte	0x1
 	.2byte	0x494
 	.8byte	.LFB2823
 	.8byte	.LFE2823-.LFB2823
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1214d
+	.4byte	0x12219
 	.uleb128 0x46
-	.4byte	.LASF2958
+	.4byte	.LASF2959
 	.byte	0x1
 	.2byte	0x496
-	.4byte	0xe748
+	.4byte	0xe763
 	.uleb128 0x46
-	.4byte	.LASF2999
+	.4byte	.LASF3000
 	.byte	0x1
 	.2byte	0x497
-	.4byte	0xe145
+	.4byte	0xe160
 	.uleb128 0x4e
 	.8byte	.LVL261
-	.4byte	0x1429d
+	.4byte	0x143bf
 	.uleb128 0x4e
 	.8byte	.LVL262
-	.4byte	0x141f2
+	.4byte	0x14314
 	.uleb128 0x4e
 	.8byte	.LVL263
-	.4byte	0x1433b
+	.4byte	0x14453
 	.uleb128 0x4e
 	.8byte	.LVL264
-	.4byte	0x1433b
+	.4byte	0x14453
 	.uleb128 0x4e
 	.8byte	.LVL265
-	.4byte	0x141f2
+	.4byte	0x14314
 	.uleb128 0x4e
 	.8byte	.LVL266
-	.4byte	0x14256
+	.4byte	0x14378
 	.uleb128 0x4e
 	.8byte	.LVL267
-	.4byte	0x142cf
+	.4byte	0x143f1
 	.uleb128 0x4e
 	.8byte	.LVL268
-	.4byte	0x1433b
+	.4byte	0x14453
 	.uleb128 0x4e
 	.8byte	.LVL269
-	.4byte	0x1433b
+	.4byte	0x14453
 	.uleb128 0x4e
 	.8byte	.LVL270
-	.4byte	0x1429d
+	.4byte	0x143bf
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3093
+	.4byte	.LASF3094
 	.byte	0x1
 	.2byte	0x44c
 	.4byte	0xc6
@@ -43047,406 +43073,406 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1231e
+	.4byte	0x123ea
 	.uleb128 0x58
-	.4byte	.LASF793
+	.4byte	.LASF794
 	.byte	0x1
 	.2byte	0x44c
-	.4byte	0x443
+	.4byte	0x458
 	.4byte	.LLST143
 	.uleb128 0x69
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x44e
-	.4byte	0xe483
+	.4byte	0xe49e
 	.uleb128 0x1
 	.byte	0x66
 	.uleb128 0x46
-	.4byte	.LASF2999
+	.4byte	.LASF3000
 	.byte	0x1
 	.2byte	0x44f
-	.4byte	0xe145
+	.4byte	0xe160
 	.uleb128 0x46
-	.4byte	.LASF2958
+	.4byte	.LASF2959
 	.byte	0x1
 	.2byte	0x450
-	.4byte	0xe748
-	.uleb128 0x61
+	.4byte	0xe763
+	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0xb30
-	.4byte	0x12237
+	.4byte	0x12303
 	.uleb128 0x3f
 	.byte	0x8
 	.byte	0x1
 	.2byte	0x457
-	.4byte	0x121d0
+	.4byte	0x1229c
 	.uleb128 0x41
-	.4byte	.LASF3094
+	.4byte	.LASF3095
 	.byte	0x1
 	.2byte	0x457
-	.4byte	0x19b
+	.4byte	0x1a0
 	.uleb128 0x3d
 	.string	"__c"
 	.byte	0x1
 	.2byte	0x457
-	.4byte	0x1231e
+	.4byte	0x123ea
 	.byte	0
 	.uleb128 0x52
 	.string	"__u"
 	.byte	0x1
 	.2byte	0x457
-	.4byte	0x121ae
-	.uleb128 0x5a
-	.4byte	0x13979
-	.8byte	.LBB1390
+	.4byte	0x1227a
+	.uleb128 0x5b
+	.4byte	0x13a9b
+	.8byte	.LBB1402
 	.4byte	.Ldebug_ranges0+0xb70
 	.byte	0x1
 	.2byte	0x457
-	.4byte	0x12204
+	.4byte	0x122d0
 	.uleb128 0x54
-	.4byte	0x1399c
+	.4byte	0x13abe
 	.uleb128 0x54
-	.4byte	0x13990
+	.4byte	0x13ab2
 	.uleb128 0x54
-	.4byte	0x13986
+	.4byte	0x13aa8
 	.byte	0
-	.uleb128 0x5c
-	.4byte	0x137d9
-	.8byte	.LBB1393
-	.8byte	.LBE1393-.LBB1393
+	.uleb128 0x5d
+	.4byte	0x138a5
+	.8byte	.LBB1405
+	.8byte	.LBE1405-.LBB1405
 	.byte	0x1
 	.2byte	0x457
 	.uleb128 0x56
-	.8byte	.LBB1394
-	.8byte	.LBE1394-.LBB1394
-	.uleb128 0x60
-	.4byte	0x137e9
+	.8byte	.LBB1406
+	.8byte	.LBE1406-.LBB1406
+	.uleb128 0x61
+	.4byte	0x138b5
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x13673
-	.8byte	.LBB1398
+	.uleb128 0x5b
+	.4byte	0x1373f
+	.8byte	.LBB1410
 	.4byte	.Ldebug_ranges0+0xba0
 	.byte	0x1
 	.2byte	0x48b
-	.4byte	0x1228e
+	.4byte	0x1235a
 	.uleb128 0x54
-	.4byte	0x13684
-	.uleb128 0x5e
-	.4byte	0x13691
-	.8byte	.LBB1400
+	.4byte	0x13750
+	.uleb128 0x5f
+	.4byte	0x1375d
+	.8byte	.LBB1412
 	.4byte	.Ldebug_ranges0+0xbd0
 	.byte	0xd
 	.2byte	0x240
 	.uleb128 0x54
-	.4byte	0x136ad
+	.4byte	0x13779
 	.uleb128 0x54
-	.4byte	0x136a2
+	.4byte	0x1376e
 	.uleb128 0x4e
 	.8byte	.LVL495
-	.4byte	0x144aa
+	.4byte	0x145e6
 	.uleb128 0x4e
 	.8byte	.LVL500
-	.4byte	0x144aa
+	.4byte	0x145e6
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL488
-	.4byte	0x13f67
+	.4byte	0x14089
 	.uleb128 0x4e
 	.8byte	.LVL489
-	.4byte	0x12a6d
+	.4byte	0x12b39
 	.uleb128 0x4e
 	.8byte	.LVL490
-	.4byte	0x144b7
+	.4byte	0x145f3
 	.uleb128 0x4e
 	.8byte	.LVL491
-	.4byte	0x143da
+	.4byte	0x14516
 	.uleb128 0x4e
 	.8byte	.LVL492
-	.4byte	0x144c1
+	.4byte	0x145fd
 	.uleb128 0x4e
 	.8byte	.LVL493
-	.4byte	0x13f67
+	.4byte	0x14089
 	.uleb128 0x4e
 	.8byte	.LVL494
-	.4byte	0x12538
+	.4byte	0x12604
 	.uleb128 0x4e
 	.8byte	.LVL496
-	.4byte	0x13f67
+	.4byte	0x14089
 	.uleb128 0x4e
 	.8byte	.LVL497
-	.4byte	0x12722
+	.4byte	0x127ee
 	.uleb128 0x4e
 	.8byte	.LVL498
-	.4byte	0x13f67
+	.4byte	0x14089
 	.uleb128 0x4e
 	.8byte	.LVL499
-	.4byte	0x1290c
+	.4byte	0x129d8
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x1232e
+	.4byte	0x123fa
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3095
+	.4byte	.LASF3096
 	.byte	0x1
 	.2byte	0x3fa
 	.8byte	.LFB2821
 	.8byte	.LFE2821-.LFB2821
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x124da
+	.4byte	0x125a6
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x3fa
-	.4byte	0xe483
+	.4byte	0xe49e
 	.4byte	.LLST142
 	.uleb128 0x46
-	.4byte	.LASF2999
+	.4byte	.LASF3000
 	.byte	0x1
 	.2byte	0x3fc
-	.4byte	0xe145
+	.4byte	0xe160
 	.uleb128 0x46
-	.4byte	.LASF2958
+	.4byte	.LASF2959
 	.byte	0x1
 	.2byte	0x3fd
-	.4byte	0xe748
+	.4byte	0xe763
 	.uleb128 0x55
-	.4byte	.LASF3025
-	.4byte	0xb92b
+	.4byte	.LASF3026
+	.4byte	0xb940
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	__func__.34774
 	.uleb128 0x53
-	.4byte	0x124da
-	.8byte	.LBB1381
-	.8byte	.LBE1381-.LBB1381
+	.4byte	0x125a6
+	.8byte	.LBB1393
+	.8byte	.LBE1393-.LBB1393
 	.byte	0x1
 	.2byte	0x433
-	.4byte	0x123bb
+	.4byte	0x12487
 	.uleb128 0x54
-	.4byte	0x124f3
+	.4byte	0x125bf
 	.uleb128 0x54
-	.4byte	0x124e7
+	.4byte	0x125b3
 	.uleb128 0x4e
 	.8byte	.LVL460
-	.4byte	0x13f67
+	.4byte	0x14089
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x124da
-	.8byte	.LBB1383
-	.8byte	.LBE1383-.LBB1383
+	.4byte	0x125a6
+	.8byte	.LBB1395
+	.8byte	.LBE1395-.LBB1395
 	.byte	0x1
 	.2byte	0x419
-	.4byte	0x123ef
+	.4byte	0x124bb
 	.uleb128 0x54
-	.4byte	0x124f3
+	.4byte	0x125bf
 	.uleb128 0x54
-	.4byte	0x124e7
+	.4byte	0x125b3
 	.uleb128 0x4e
 	.8byte	.LVL465
-	.4byte	0x13f67
+	.4byte	0x14089
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x124da
-	.8byte	.LBB1385
-	.8byte	.LBE1385-.LBB1385
+	.4byte	0x125a6
+	.8byte	.LBB1397
+	.8byte	.LBE1397-.LBB1397
 	.byte	0x1
 	.2byte	0x407
-	.4byte	0x12423
+	.4byte	0x124ef
 	.uleb128 0x54
-	.4byte	0x124f3
+	.4byte	0x125bf
 	.uleb128 0x54
-	.4byte	0x124e7
+	.4byte	0x125b3
 	.uleb128 0x4e
 	.8byte	.LVL470
-	.4byte	0x13f67
+	.4byte	0x14089
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x124da
-	.8byte	.LBB1387
-	.8byte	.LBE1387-.LBB1387
+	.4byte	0x125a6
+	.8byte	.LBB1399
+	.8byte	.LBE1399-.LBB1399
 	.byte	0x1
 	.2byte	0x440
-	.4byte	0x12457
+	.4byte	0x12523
 	.uleb128 0x54
-	.4byte	0x124f3
+	.4byte	0x125bf
 	.uleb128 0x54
-	.4byte	0x124e7
+	.4byte	0x125b3
 	.uleb128 0x4e
 	.8byte	.LVL475
-	.4byte	0x13f67
+	.4byte	0x14089
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL459
-	.4byte	0x12538
+	.4byte	0x12604
 	.uleb128 0x4e
 	.8byte	.LVL461
-	.4byte	0x12538
+	.4byte	0x12604
 	.uleb128 0x4e
 	.8byte	.LVL464
-	.4byte	0x12a6d
+	.4byte	0x12b39
 	.uleb128 0x4e
 	.8byte	.LVL466
-	.4byte	0x12a6d
+	.4byte	0x12b39
 	.uleb128 0x4e
 	.8byte	.LVL469
-	.4byte	0x1290c
+	.4byte	0x129d8
 	.uleb128 0x4e
 	.8byte	.LVL471
-	.4byte	0x1290c
+	.4byte	0x129d8
 	.uleb128 0x4e
 	.8byte	.LVL474
-	.4byte	0x12722
+	.4byte	0x127ee
 	.uleb128 0x4e
 	.8byte	.LVL476
-	.4byte	0x12722
+	.4byte	0x127ee
 	.uleb128 0x4e
 	.8byte	.LVL479
-	.4byte	0x141f2
+	.4byte	0x14314
 	.uleb128 0x4e
 	.8byte	.LVL482
-	.4byte	0x141f2
+	.4byte	0x14314
 	.byte	0
-	.uleb128 0x65
-	.4byte	.LASF3097
+	.uleb128 0x66
+	.4byte	.LASF3098
 	.byte	0x1
 	.2byte	0x3f4
 	.byte	0x1
-	.4byte	0x12500
-	.uleb128 0x64
-	.4byte	.LASF2999
+	.4byte	0x125cc
+	.uleb128 0x65
+	.4byte	.LASF3000
 	.byte	0x1
 	.2byte	0x3f4
-	.4byte	0xe145
-	.uleb128 0x64
-	.4byte	.LASF2958
+	.4byte	0xe160
+	.uleb128 0x65
+	.4byte	.LASF2959
 	.byte	0x1
 	.2byte	0x3f4
-	.4byte	0xe748
+	.4byte	0xe763
 	.byte	0
-	.uleb128 0x65
-	.4byte	.LASF3098
+	.uleb128 0x66
+	.4byte	.LASF3099
 	.byte	0x1
 	.2byte	0x3e9
 	.byte	0x1
-	.4byte	0x12532
-	.uleb128 0x64
-	.4byte	.LASF2999
+	.4byte	0x125fe
+	.uleb128 0x65
+	.4byte	.LASF3000
 	.byte	0x1
 	.2byte	0x3e9
-	.4byte	0xe145
-	.uleb128 0x64
-	.4byte	.LASF2958
+	.4byte	0xe160
+	.uleb128 0x65
+	.4byte	.LASF2959
 	.byte	0x1
 	.2byte	0x3e9
-	.4byte	0xe748
+	.4byte	0xe763
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
 	.2byte	0x3eb
-	.4byte	0x12532
+	.4byte	0x125fe
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdecf
-	.uleb128 0x65
-	.4byte	.LASF3099
+	.4byte	0xdeea
+	.uleb128 0x66
+	.4byte	.LASF3100
 	.byte	0x1
 	.2byte	0x3df
 	.byte	0x1
-	.4byte	0x12576
-	.uleb128 0x64
-	.4byte	.LASF3100
+	.4byte	0x12642
+	.uleb128 0x65
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x3df
-	.4byte	0xc0ad
-	.uleb128 0x64
-	.4byte	.LASF3101
+	.4byte	0xc0c8
+	.uleb128 0x65
+	.4byte	.LASF3102
 	.byte	0x1
 	.2byte	0x3e0
-	.4byte	0xaab
-	.uleb128 0x64
-	.4byte	.LASF3102
+	.4byte	0xac0
+	.uleb128 0x65
+	.4byte	.LASF3103
 	.byte	0x1
 	.2byte	0x3e0
-	.4byte	0xaab
-	.uleb128 0x64
-	.4byte	.LASF2958
+	.4byte	0xac0
+	.uleb128 0x65
+	.4byte	.LASF2959
 	.byte	0x1
 	.2byte	0x3e1
-	.4byte	0xe748
+	.4byte	0xe763
 	.byte	0
-	.uleb128 0x65
-	.4byte	.LASF3103
+	.uleb128 0x66
+	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x3b5
 	.byte	0x1
-	.4byte	0x1264c
-	.uleb128 0x64
-	.4byte	.LASF3100
+	.4byte	0x12718
+	.uleb128 0x65
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x3b5
-	.4byte	0xc0ad
-	.uleb128 0x64
-	.4byte	.LASF3101
+	.4byte	0xc0c8
+	.uleb128 0x65
+	.4byte	.LASF3102
 	.byte	0x1
 	.2byte	0x3b6
-	.4byte	0xaab
-	.uleb128 0x64
-	.4byte	.LASF3102
+	.4byte	0xac0
+	.uleb128 0x65
+	.4byte	.LASF3103
 	.byte	0x1
 	.2byte	0x3b6
-	.4byte	0xaab
-	.uleb128 0x64
-	.4byte	.LASF2958
+	.4byte	0xac0
+	.uleb128 0x65
+	.4byte	.LASF2959
 	.byte	0x1
 	.2byte	0x3b7
-	.4byte	0xe748
+	.4byte	0xe763
 	.uleb128 0x46
-	.4byte	.LASF2999
+	.4byte	.LASF3000
 	.byte	0x1
 	.2byte	0x3b9
-	.4byte	0xe145
-	.uleb128 0x46
-	.4byte	.LASF3104
-	.byte	0x1
-	.2byte	0x3ba
-	.4byte	0x155
+	.4byte	0xe160
 	.uleb128 0x46
 	.4byte	.LASF3105
 	.byte	0x1
 	.2byte	0x3ba
-	.4byte	0x155
+	.4byte	0x15a
 	.uleb128 0x46
 	.4byte	.LASF3106
 	.byte	0x1
 	.2byte	0x3ba
-	.4byte	0x466f
+	.4byte	0x15a
 	.uleb128 0x46
 	.4byte	.LASF3107
 	.byte	0x1
 	.2byte	0x3ba
-	.4byte	0x466f
+	.4byte	0x4684
 	.uleb128 0x46
 	.4byte	.LASF3108
 	.byte	0x1
+	.2byte	0x3ba
+	.4byte	0x4684
+	.uleb128 0x46
+	.4byte	.LASF3109
+	.byte	0x1
 	.2byte	0x3bb
-	.4byte	0xc0ad
+	.4byte	0xc0c8
 	.uleb128 0x46
-	.4byte	.LASF2897
+	.4byte	.LASF2898
 	.byte	0x1
 	.2byte	0x3bc
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF261
+	.4byte	.LASF262
 	.byte	0x1
 	.2byte	0x3bc
 	.4byte	0xc6
@@ -43461,84 +43487,84 @@ __exitcall_ebc_exit:
 	.2byte	0x3bd
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3109
+	.4byte	.LASF3110
 	.byte	0x1
 	.2byte	0x3be
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2856
+	.4byte	.LASF2857
 	.byte	0x1
 	.2byte	0x3bf
-	.4byte	0xc0ad
+	.4byte	0xc0c8
 	.uleb128 0x46
-	.4byte	.LASF2943
+	.4byte	.LASF2944
 	.byte	0x1
 	.2byte	0x3c0
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x65
-	.4byte	.LASF3110
+	.uleb128 0x66
+	.4byte	.LASF3111
 	.byte	0x1
 	.2byte	0x38c
 	.byte	0x1
-	.4byte	0x12722
-	.uleb128 0x64
-	.4byte	.LASF3100
+	.4byte	0x127ee
+	.uleb128 0x65
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x38c
-	.4byte	0xc0ad
-	.uleb128 0x64
-	.4byte	.LASF3101
+	.4byte	0xc0c8
+	.uleb128 0x65
+	.4byte	.LASF3102
 	.byte	0x1
 	.2byte	0x38d
-	.4byte	0xaab
-	.uleb128 0x64
-	.4byte	.LASF3102
+	.4byte	0xac0
+	.uleb128 0x65
+	.4byte	.LASF3103
 	.byte	0x1
 	.2byte	0x38d
-	.4byte	0xaab
-	.uleb128 0x64
-	.4byte	.LASF2958
+	.4byte	0xac0
+	.uleb128 0x65
+	.4byte	.LASF2959
 	.byte	0x1
 	.2byte	0x38e
-	.4byte	0xe748
+	.4byte	0xe763
 	.uleb128 0x46
-	.4byte	.LASF2999
+	.4byte	.LASF3000
 	.byte	0x1
 	.2byte	0x390
-	.4byte	0xe145
-	.uleb128 0x46
-	.4byte	.LASF3104
-	.byte	0x1
-	.2byte	0x391
-	.4byte	0x13a
+	.4byte	0xe160
 	.uleb128 0x46
 	.4byte	.LASF3105
 	.byte	0x1
 	.2byte	0x391
-	.4byte	0x13a
+	.4byte	0x13f
 	.uleb128 0x46
 	.4byte	.LASF3106
 	.byte	0x1
 	.2byte	0x391
-	.4byte	0xaab
+	.4byte	0x13f
 	.uleb128 0x46
 	.4byte	.LASF3107
 	.byte	0x1
 	.2byte	0x391
-	.4byte	0xaab
+	.4byte	0xac0
 	.uleb128 0x46
 	.4byte	.LASF3108
 	.byte	0x1
+	.2byte	0x391
+	.4byte	0xac0
+	.uleb128 0x46
+	.4byte	.LASF3109
+	.byte	0x1
 	.2byte	0x392
-	.4byte	0xc0ad
+	.4byte	0xc0c8
 	.uleb128 0x46
-	.4byte	.LASF2897
+	.4byte	.LASF2898
 	.byte	0x1
 	.2byte	0x393
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF261
+	.4byte	.LASF262
 	.byte	0x1
 	.2byte	0x393
 	.4byte	0xc6
@@ -43553,79 +43579,79 @@ __exitcall_ebc_exit:
 	.2byte	0x394
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3109
+	.4byte	.LASF3110
 	.byte	0x1
 	.2byte	0x395
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2856
+	.4byte	.LASF2857
 	.byte	0x1
 	.2byte	0x396
-	.4byte	0xc0ad
+	.4byte	0xc0c8
 	.uleb128 0x46
-	.4byte	.LASF2943
+	.4byte	.LASF2944
 	.byte	0x1
 	.2byte	0x397
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x65
-	.4byte	.LASF3111
+	.uleb128 0x66
+	.4byte	.LASF3112
 	.byte	0x1
 	.2byte	0x381
 	.byte	0x1
-	.4byte	0x12760
-	.uleb128 0x64
-	.4byte	.LASF3100
+	.4byte	0x1282c
+	.uleb128 0x65
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x381
-	.4byte	0xc0ad
-	.uleb128 0x64
-	.4byte	.LASF3101
+	.4byte	0xc0c8
+	.uleb128 0x65
+	.4byte	.LASF3102
 	.byte	0x1
 	.2byte	0x382
-	.4byte	0xaab
-	.uleb128 0x64
-	.4byte	.LASF3102
+	.4byte	0xac0
+	.uleb128 0x65
+	.4byte	.LASF3103
 	.byte	0x1
 	.2byte	0x382
-	.4byte	0xaab
-	.uleb128 0x64
-	.4byte	.LASF2958
+	.4byte	0xac0
+	.uleb128 0x65
+	.4byte	.LASF2959
 	.byte	0x1
 	.2byte	0x383
-	.4byte	0xe748
+	.4byte	0xe763
 	.byte	0
-	.uleb128 0x65
-	.4byte	.LASF3112
+	.uleb128 0x66
+	.4byte	.LASF3113
 	.byte	0x1
 	.2byte	0x35d
 	.byte	0x1
-	.4byte	0x12836
-	.uleb128 0x64
-	.4byte	.LASF3100
+	.4byte	0x12902
+	.uleb128 0x65
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x35d
-	.4byte	0xc0ad
-	.uleb128 0x64
-	.4byte	.LASF3101
+	.4byte	0xc0c8
+	.uleb128 0x65
+	.4byte	.LASF3102
 	.byte	0x1
 	.2byte	0x35e
-	.4byte	0xaab
-	.uleb128 0x64
-	.4byte	.LASF3102
+	.4byte	0xac0
+	.uleb128 0x65
+	.4byte	.LASF3103
 	.byte	0x1
 	.2byte	0x35e
-	.4byte	0xaab
-	.uleb128 0x64
-	.4byte	.LASF2958
+	.4byte	0xac0
+	.uleb128 0x65
+	.4byte	.LASF2959
 	.byte	0x1
 	.2byte	0x35f
-	.4byte	0xe748
+	.4byte	0xe763
 	.uleb128 0x46
-	.4byte	.LASF2999
+	.4byte	.LASF3000
 	.byte	0x1
 	.2byte	0x361
-	.4byte	0xe145
+	.4byte	0xe160
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
@@ -43637,87 +43663,87 @@ __exitcall_ebc_exit:
 	.2byte	0x362
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2897
+	.4byte	.LASF2898
 	.byte	0x1
 	.2byte	0x363
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF261
+	.4byte	.LASF262
 	.byte	0x1
 	.2byte	0x364
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3104
-	.byte	0x1
-	.2byte	0x365
-	.4byte	0x13a
-	.uleb128 0x46
 	.4byte	.LASF3105
 	.byte	0x1
 	.2byte	0x365
-	.4byte	0x13a
+	.4byte	0x13f
 	.uleb128 0x46
 	.4byte	.LASF3106
 	.byte	0x1
 	.2byte	0x365
-	.4byte	0xaab
+	.4byte	0x13f
 	.uleb128 0x46
 	.4byte	.LASF3107
 	.byte	0x1
 	.2byte	0x365
-	.4byte	0xaab
+	.4byte	0xac0
 	.uleb128 0x46
 	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x366
-	.4byte	0xc0ad
+	.2byte	0x365
+	.4byte	0xac0
 	.uleb128 0x46
 	.4byte	.LASF3109
 	.byte	0x1
+	.2byte	0x366
+	.4byte	0xc0c8
+	.uleb128 0x46
+	.4byte	.LASF3110
+	.byte	0x1
 	.2byte	0x367
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2856
+	.4byte	.LASF2857
 	.byte	0x1
 	.2byte	0x368
-	.4byte	0xc0ad
+	.4byte	0xc0c8
 	.uleb128 0x46
-	.4byte	.LASF2943
+	.4byte	.LASF2944
 	.byte	0x1
 	.2byte	0x369
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x65
-	.4byte	.LASF3113
+	.uleb128 0x66
+	.4byte	.LASF3114
 	.byte	0x1
 	.2byte	0x336
 	.byte	0x1
-	.4byte	0x1290c
-	.uleb128 0x64
-	.4byte	.LASF3100
+	.4byte	0x129d8
+	.uleb128 0x65
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x336
-	.4byte	0xc0ad
-	.uleb128 0x64
-	.4byte	.LASF3101
+	.4byte	0xc0c8
+	.uleb128 0x65
+	.4byte	.LASF3102
 	.byte	0x1
 	.2byte	0x337
-	.4byte	0xaab
-	.uleb128 0x64
-	.4byte	.LASF3102
+	.4byte	0xac0
+	.uleb128 0x65
+	.4byte	.LASF3103
 	.byte	0x1
 	.2byte	0x337
-	.4byte	0xaab
-	.uleb128 0x64
-	.4byte	.LASF2958
+	.4byte	0xac0
+	.uleb128 0x65
+	.4byte	.LASF2959
 	.byte	0x1
 	.2byte	0x338
-	.4byte	0xe748
+	.4byte	0xe763
 	.uleb128 0x46
-	.4byte	.LASF2999
+	.4byte	.LASF3000
 	.byte	0x1
 	.2byte	0x33a
-	.4byte	0xe145
+	.4byte	0xe160
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
@@ -43729,105 +43755,105 @@ __exitcall_ebc_exit:
 	.2byte	0x33b
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2897
+	.4byte	.LASF2898
 	.byte	0x1
 	.2byte	0x33c
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF261
+	.4byte	.LASF262
 	.byte	0x1
 	.2byte	0x33d
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3104
-	.byte	0x1
-	.2byte	0x33e
-	.4byte	0x155
-	.uleb128 0x46
 	.4byte	.LASF3105
 	.byte	0x1
 	.2byte	0x33e
-	.4byte	0x155
+	.4byte	0x15a
 	.uleb128 0x46
 	.4byte	.LASF3106
 	.byte	0x1
 	.2byte	0x33e
-	.4byte	0x466f
+	.4byte	0x15a
 	.uleb128 0x46
 	.4byte	.LASF3107
 	.byte	0x1
 	.2byte	0x33e
-	.4byte	0x466f
+	.4byte	0x4684
 	.uleb128 0x46
 	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x33f
-	.4byte	0xc0ad
+	.2byte	0x33e
+	.4byte	0x4684
 	.uleb128 0x46
 	.4byte	.LASF3109
 	.byte	0x1
+	.2byte	0x33f
+	.4byte	0xc0c8
+	.uleb128 0x46
+	.4byte	.LASF3110
+	.byte	0x1
 	.2byte	0x340
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2856
+	.4byte	.LASF2857
 	.byte	0x1
 	.2byte	0x341
-	.4byte	0xc0ad
+	.4byte	0xc0c8
 	.uleb128 0x46
-	.4byte	.LASF2943
+	.4byte	.LASF2944
 	.byte	0x1
 	.2byte	0x342
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3114
+	.4byte	.LASF3115
 	.byte	0x1
 	.2byte	0x268
 	.8byte	.LFB2812
 	.8byte	.LFE2812-.LFB2812
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12a6d
+	.4byte	0x12b39
 	.uleb128 0x6a
-	.4byte	.LASF3100
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x268
-	.4byte	0xc0ad
+	.4byte	0xc0c8
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6a
-	.4byte	.LASF3101
+	.4byte	.LASF3102
 	.byte	0x1
 	.2byte	0x268
-	.4byte	0xaab
+	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x6a
-	.4byte	.LASF3102
+	.4byte	.LASF3103
 	.byte	0x1
 	.2byte	0x268
-	.4byte	0xaab
+	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x6a
-	.4byte	.LASF3115
+	.4byte	.LASF3116
 	.byte	0x1
 	.2byte	0x269
-	.4byte	0xc0ad
+	.4byte	0xc0c8
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x6a
-	.4byte	.LASF2958
+	.4byte	.LASF2959
 	.byte	0x1
 	.2byte	0x269
-	.4byte	0xe748
+	.4byte	0xe763
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x46
-	.4byte	.LASF2999
+	.4byte	.LASF3000
 	.byte	0x1
 	.2byte	0x26b
-	.4byte	0xe145
+	.4byte	0xe160
 	.uleb128 0x69
 	.string	"i"
 	.byte	0x1
@@ -43841,150 +43867,150 @@ __exitcall_ebc_exit:
 	.2byte	0x26d
 	.4byte	0xc6
 	.uleb128 0x4c
-	.4byte	.LASF2897
+	.4byte	.LASF2898
 	.byte	0x1
 	.2byte	0x26e
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x62
 	.uleb128 0x4c
-	.4byte	.LASF261
+	.4byte	.LASF262
 	.byte	0x1
 	.2byte	0x26f
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x59
-	.4byte	.LASF3104
+	.4byte	.LASF3105
 	.byte	0x1
 	.2byte	0x270
-	.4byte	0x13a
+	.4byte	0x13f
 	.4byte	.LLST6
 	.uleb128 0x59
-	.4byte	.LASF3105
+	.4byte	.LASF3106
 	.byte	0x1
 	.2byte	0x270
-	.4byte	0x13a
+	.4byte	0x13f
 	.4byte	.LLST7
 	.uleb128 0x46
-	.4byte	.LASF3116
+	.4byte	.LASF3117
 	.byte	0x1
 	.2byte	0x270
-	.4byte	0x13a
+	.4byte	0x13f
 	.uleb128 0x4c
-	.4byte	.LASF3106
+	.4byte	.LASF3107
 	.byte	0x1
 	.2byte	0x271
-	.4byte	0xaab
+	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4c
-	.4byte	.LASF3107
+	.4byte	.LASF3108
 	.byte	0x1
 	.2byte	0x271
-	.4byte	0xaab
+	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x59
-	.4byte	.LASF3108
+	.4byte	.LASF3109
 	.byte	0x1
 	.2byte	0x272
-	.4byte	0xc0ad
+	.4byte	0xc0c8
 	.4byte	.LLST8
 	.uleb128 0x46
-	.4byte	.LASF2965
+	.4byte	.LASF2966
 	.byte	0x1
 	.2byte	0x273
-	.4byte	0x10b
+	.4byte	0x110
 	.uleb128 0x4c
-	.4byte	.LASF3117
+	.4byte	.LASF3118
 	.byte	0x1
 	.2byte	0x274
-	.4byte	0xc0ad
+	.4byte	0xc0c8
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x46
-	.4byte	.LASF3118
+	.4byte	.LASF3119
 	.byte	0x1
 	.2byte	0x275
-	.4byte	0x10b
+	.4byte	0x110
 	.uleb128 0x46
-	.4byte	.LASF2856
+	.4byte	.LASF2857
 	.byte	0x1
 	.2byte	0x276
-	.4byte	0xc0ad
+	.4byte	0xc0c8
 	.uleb128 0x46
-	.4byte	.LASF2943
+	.4byte	.LASF2944
 	.byte	0x1
 	.2byte	0x277
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3119
+	.4byte	.LASF3120
 	.byte	0x1
 	.2byte	0x278
-	.4byte	0x10b
+	.4byte	0x110
 	.uleb128 0x46
-	.4byte	.LASF3120
+	.4byte	.LASF3121
 	.byte	0x1
 	.2byte	0x278
-	.4byte	0x10b
+	.4byte	0x110
 	.uleb128 0x59
-	.4byte	.LASF3121
+	.4byte	.LASF3122
 	.byte	0x1
 	.2byte	0x279
-	.4byte	0x13a
+	.4byte	0x13f
 	.4byte	.LLST9
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3122
+	.4byte	.LASF3123
 	.byte	0x1
 	.2byte	0x1c3
 	.8byte	.LFB2811
 	.8byte	.LFE2811-.LFB2811
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12bc8
+	.4byte	0x12c94
 	.uleb128 0x6a
-	.4byte	.LASF3100
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x1c3
-	.4byte	0xc0ad
+	.4byte	0xc0c8
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6a
-	.4byte	.LASF3101
+	.4byte	.LASF3102
 	.byte	0x1
 	.2byte	0x1c3
-	.4byte	0xaab
+	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x6a
-	.4byte	.LASF3102
+	.4byte	.LASF3103
 	.byte	0x1
 	.2byte	0x1c3
-	.4byte	0xaab
+	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x6a
-	.4byte	.LASF3115
+	.4byte	.LASF3116
 	.byte	0x1
 	.2byte	0x1c4
-	.4byte	0xc0ad
+	.4byte	0xc0c8
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x6a
-	.4byte	.LASF2958
+	.4byte	.LASF2959
 	.byte	0x1
 	.2byte	0x1c4
-	.4byte	0xe748
+	.4byte	0xe763
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x46
-	.4byte	.LASF2999
+	.4byte	.LASF3000
 	.byte	0x1
 	.2byte	0x1c6
-	.4byte	0xe145
-	.uleb128 0x68
+	.4byte	0xe160
+	.uleb128 0x5a
 	.string	"i"
 	.byte	0x1
 	.2byte	0x1c7
@@ -43996,187 +44022,187 @@ __exitcall_ebc_exit:
 	.2byte	0x1c8
 	.4byte	0xc6
 	.uleb128 0x4c
-	.4byte	.LASF2897
+	.4byte	.LASF2898
 	.byte	0x1
 	.2byte	0x1c9
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x61
 	.uleb128 0x59
-	.4byte	.LASF261
+	.4byte	.LASF262
 	.byte	0x1
 	.2byte	0x1ca
 	.4byte	0xc6
 	.4byte	.LLST1
 	.uleb128 0x59
-	.4byte	.LASF3104
+	.4byte	.LASF3105
 	.byte	0x1
 	.2byte	0x1cb
-	.4byte	0x13a
+	.4byte	0x13f
 	.4byte	.LLST2
 	.uleb128 0x59
-	.4byte	.LASF3105
+	.4byte	.LASF3106
 	.byte	0x1
 	.2byte	0x1cb
-	.4byte	0x13a
+	.4byte	0x13f
 	.4byte	.LLST3
 	.uleb128 0x4c
-	.4byte	.LASF3106
+	.4byte	.LASF3107
 	.byte	0x1
 	.2byte	0x1cc
-	.4byte	0xaab
+	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4c
-	.4byte	.LASF3107
+	.4byte	.LASF3108
 	.byte	0x1
 	.2byte	0x1cc
-	.4byte	0xaab
+	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x59
-	.4byte	.LASF3108
+	.4byte	.LASF3109
 	.byte	0x1
 	.2byte	0x1cd
-	.4byte	0xc0ad
+	.4byte	0xc0c8
 	.4byte	.LLST4
 	.uleb128 0x4c
-	.4byte	.LASF2965
+	.4byte	.LASF2966
 	.byte	0x1
 	.2byte	0x1ce
-	.4byte	0x10b
+	.4byte	0x110
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x4c
-	.4byte	.LASF3117
+	.4byte	.LASF3118
 	.byte	0x1
 	.2byte	0x1cf
-	.4byte	0xc0ad
+	.4byte	0xc0c8
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x46
-	.4byte	.LASF3118
+	.4byte	.LASF3119
 	.byte	0x1
 	.2byte	0x1d0
-	.4byte	0x10b
+	.4byte	0x110
 	.uleb128 0x46
-	.4byte	.LASF2856
+	.4byte	.LASF2857
 	.byte	0x1
 	.2byte	0x1d1
-	.4byte	0xc0ad
+	.4byte	0xc0c8
 	.uleb128 0x46
-	.4byte	.LASF2943
+	.4byte	.LASF2944
 	.byte	0x1
 	.2byte	0x1d2
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3119
+	.4byte	.LASF3120
 	.byte	0x1
 	.2byte	0x1d3
-	.4byte	0x10b
+	.4byte	0x110
 	.uleb128 0x46
-	.4byte	.LASF3120
+	.4byte	.LASF3121
 	.byte	0x1
 	.2byte	0x1d3
-	.4byte	0x10b
+	.4byte	0x110
 	.uleb128 0x59
-	.4byte	.LASF3121
+	.4byte	.LASF3122
 	.byte	0x1
 	.2byte	0x1d4
-	.4byte	0x13a
+	.4byte	0x13f
 	.4byte	.LLST5
 	.byte	0
-	.uleb128 0x65
-	.4byte	.LASF3123
-	.byte	0x1
-	.2byte	0x164
-	.byte	0x1
-	.4byte	0x12ce6
-	.uleb128 0x64
+	.uleb128 0x66
 	.4byte	.LASF3124
 	.byte	0x1
 	.2byte	0x164
-	.4byte	0xaab
-	.uleb128 0x64
+	.byte	0x1
+	.4byte	0x12db2
+	.uleb128 0x65
 	.4byte	.LASF3125
 	.byte	0x1
 	.2byte	0x164
-	.4byte	0xaab
-	.uleb128 0x64
+	.4byte	0xac0
+	.uleb128 0x65
 	.4byte	.LASF3126
 	.byte	0x1
 	.2byte	0x164
-	.4byte	0xaab
-	.uleb128 0x64
-	.4byte	.LASF3115
+	.4byte	0xac0
+	.uleb128 0x65
+	.4byte	.LASF3127
 	.byte	0x1
 	.2byte	0x164
-	.4byte	0x466f
-	.uleb128 0x64
-	.4byte	.LASF2958
+	.4byte	0xac0
+	.uleb128 0x65
+	.4byte	.LASF3116
+	.byte	0x1
+	.2byte	0x164
+	.4byte	0x4684
+	.uleb128 0x65
+	.4byte	.LASF2959
 	.byte	0x1
 	.2byte	0x165
-	.4byte	0xe748
-	.uleb128 0x64
-	.4byte	.LASF2867
+	.4byte	0xe763
+	.uleb128 0x65
+	.4byte	.LASF2868
 	.byte	0x1
 	.2byte	0x165
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2897
+	.4byte	.LASF2898
 	.byte	0x1
 	.2byte	0x167
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF261
+	.4byte	.LASF262
 	.byte	0x1
 	.2byte	0x167
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3127
-	.byte	0x1
-	.2byte	0x168
-	.4byte	0x13a
-	.uleb128 0x46
 	.4byte	.LASF3128
 	.byte	0x1
 	.2byte	0x168
-	.4byte	0x13a
+	.4byte	0x13f
 	.uleb128 0x46
 	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x168
-	.4byte	0x13a
+	.4byte	0x13f
 	.uleb128 0x46
 	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x169
-	.4byte	0xaab
+	.2byte	0x168
+	.4byte	0x13f
 	.uleb128 0x46
 	.4byte	.LASF3131
 	.byte	0x1
 	.2byte	0x169
-	.4byte	0xaab
+	.4byte	0xac0
 	.uleb128 0x46
 	.4byte	.LASF3132
 	.byte	0x1
 	.2byte	0x169
-	.4byte	0xaab
+	.4byte	0xac0
 	.uleb128 0x46
-	.4byte	.LASF3118
+	.4byte	.LASF3133
+	.byte	0x1
+	.2byte	0x169
+	.4byte	0xac0
+	.uleb128 0x46
+	.4byte	.LASF3119
 	.byte	0x1
 	.2byte	0x16a
-	.4byte	0x155
+	.4byte	0x15a
 	.uleb128 0x46
-	.4byte	.LASF3117
+	.4byte	.LASF3118
 	.byte	0x1
 	.2byte	0x16b
-	.4byte	0x466f
+	.4byte	0x4684
 	.uleb128 0x46
-	.4byte	.LASF3133
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x16c
-	.4byte	0x13a
+	.4byte	0x13f
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
@@ -44188,136 +44214,136 @@ __exitcall_ebc_exit:
 	.2byte	0x16e
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2868
+	.4byte	.LASF2869
 	.byte	0x1
 	.2byte	0x16f
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2870
+	.4byte	.LASF2871
 	.byte	0x1
 	.2byte	0x170
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2869
+	.4byte	.LASF2870
 	.byte	0x1
 	.2byte	0x171
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2871
+	.4byte	.LASF2872
 	.byte	0x1
 	.2byte	0x172
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x74
-	.4byte	.LASF3134
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x14f
 	.8byte	.LFB2809
 	.8byte	.LFE2809-.LFB2809
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12d76
+	.4byte	0x12e42
 	.uleb128 0x58
-	.4byte	.LASF2273
+	.4byte	.LASF2274
 	.byte	0x1
 	.2byte	0x14f
-	.4byte	0x31f0
-	.4byte	.LLST180
-	.uleb128 0x68
+	.4byte	0x3205
+	.4byte	.LLST183
+	.uleb128 0x5a
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x151
-	.4byte	0xe483
-	.4byte	.LLST181
+	.4byte	0xe49e
+	.4byte	.LLST184
 	.uleb128 0x59
-	.4byte	.LASF2958
+	.4byte	.LASF2959
 	.byte	0x1
 	.2byte	0x152
-	.4byte	0xe748
-	.4byte	.LLST182
+	.4byte	0xe763
+	.4byte	.LLST185
 	.uleb128 0x4e
-	.8byte	.LVL736
-	.4byte	0x1447a
+	.8byte	.LVL745
+	.4byte	0x145aa
 	.uleb128 0x4e
-	.8byte	.LVL738
-	.4byte	0x12e3d
+	.8byte	.LVL747
+	.4byte	0x12f09
 	.uleb128 0x4e
-	.8byte	.LVL739
-	.4byte	0x14486
+	.8byte	.LVL748
+	.4byte	0x145b6
 	.uleb128 0x4e
-	.8byte	.LVL742
-	.4byte	0x12d76
+	.8byte	.LVL751
+	.4byte	0x12e42
 	.uleb128 0x4e
-	.8byte	.LVL743
-	.4byte	0x14486
+	.8byte	.LVL752
+	.4byte	0x145b6
 	.byte	0
 	.uleb128 0x74
-	.4byte	.LASF3135
+	.4byte	.LASF3136
 	.byte	0x1
 	.2byte	0x11e
 	.8byte	.LFB2808
 	.8byte	.LFE2808-.LFB2808
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12e3d
+	.4byte	0x12f09
 	.uleb128 0x6a
-	.4byte	.LASF3124
+	.4byte	.LASF3125
 	.byte	0x1
 	.2byte	0x11e
-	.4byte	0xaab
+	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6a
-	.4byte	.LASF3125
+	.4byte	.LASF3126
 	.byte	0x1
 	.2byte	0x11e
-	.4byte	0xaab
+	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x6a
-	.4byte	.LASF3115
+	.4byte	.LASF3116
 	.byte	0x1
 	.2byte	0x11e
-	.4byte	0x466f
+	.4byte	0x4684
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x58
-	.4byte	.LASF2958
+	.4byte	.LASF2959
 	.byte	0x1
 	.2byte	0x11f
-	.4byte	0xe748
-	.4byte	.LLST176
+	.4byte	0xe763
+	.4byte	.LLST179
 	.uleb128 0x4c
-	.4byte	.LASF2897
+	.4byte	.LASF2898
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5d
 	.uleb128 0x4c
-	.4byte	.LASF261
+	.4byte	.LASF262
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x59
 	.uleb128 0x46
-	.4byte	.LASF3127
+	.4byte	.LASF3128
 	.byte	0x1
 	.2byte	0x122
-	.4byte	0x13a
+	.4byte	0x13f
 	.uleb128 0x59
-	.4byte	.LASF3128
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x122
-	.4byte	0x13a
-	.4byte	.LLST177
+	.4byte	0x13f
+	.4byte	.LLST180
 	.uleb128 0x59
-	.4byte	.LASF3118
+	.4byte	.LASF3119
 	.byte	0x1
 	.2byte	0x123
-	.4byte	0x155
-	.4byte	.LLST178
+	.4byte	0x15a
+	.4byte	.LLST181
 	.uleb128 0x69
 	.string	"i"
 	.byte	0x1
@@ -44331,98 +44357,98 @@ __exitcall_ebc_exit:
 	.2byte	0x124
 	.4byte	0xc6
 	.uleb128 0x59
-	.4byte	.LASF3133
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x125
-	.4byte	0x13a
-	.4byte	.LLST179
+	.4byte	0x13f
+	.4byte	.LLST182
 	.byte	0
 	.uleb128 0x75
-	.4byte	.LASF3136
+	.4byte	.LASF3137
 	.byte	0x1
 	.byte	0xd3
 	.8byte	.LFB2807
 	.8byte	.LFE2807-.LFB2807
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12f22
+	.4byte	0x12fee
 	.uleb128 0x76
-	.4byte	.LASF3124
+	.4byte	.LASF3125
 	.byte	0x1
 	.byte	0xd3
-	.4byte	0xaab
+	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x76
-	.4byte	.LASF3125
+	.4byte	.LASF3126
 	.byte	0x1
 	.byte	0xd3
-	.4byte	0xaab
+	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x76
-	.4byte	.LASF3126
+	.4byte	.LASF3127
 	.byte	0x1
 	.byte	0xd3
-	.4byte	0xaab
+	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x76
-	.4byte	.LASF3115
+	.4byte	.LASF3116
 	.byte	0x1
 	.byte	0xd3
-	.4byte	0x466f
+	.4byte	0x4684
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x77
-	.4byte	.LASF2958
+	.4byte	.LASF2959
 	.byte	0x1
 	.byte	0xd4
-	.4byte	0xe748
-	.4byte	.LLST170
+	.4byte	0xe763
+	.4byte	.LLST173
 	.uleb128 0x77
-	.4byte	.LASF2867
+	.4byte	.LASF2868
 	.byte	0x1
 	.byte	0xd4
 	.4byte	0xc6
-	.4byte	.LLST171
+	.4byte	.LLST174
 	.uleb128 0x4b
-	.4byte	.LASF2897
+	.4byte	.LASF2898
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x60
 	.uleb128 0x4b
-	.4byte	.LASF261
+	.4byte	.LASF262
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x78
-	.4byte	.LASF3127
+	.4byte	.LASF3128
 	.byte	0x1
 	.byte	0xd7
-	.4byte	0x13a
+	.4byte	0x13f
 	.uleb128 0x79
-	.4byte	.LASF3128
+	.4byte	.LASF3129
 	.byte	0x1
 	.byte	0xd7
-	.4byte	0x13a
-	.4byte	.LLST172
+	.4byte	0x13f
+	.4byte	.LLST175
 	.uleb128 0x79
-	.4byte	.LASF3129
+	.4byte	.LASF3130
 	.byte	0x1
 	.byte	0xd7
-	.4byte	0x13a
-	.4byte	.LLST173
+	.4byte	0x13f
+	.4byte	.LLST176
 	.uleb128 0x79
-	.4byte	.LASF3118
+	.4byte	.LASF3119
 	.byte	0x1
 	.byte	0xd8
-	.4byte	0x155
-	.4byte	.LLST174
+	.4byte	0x15a
+	.4byte	.LLST177
 	.uleb128 0x7a
 	.string	"i"
 	.byte	0x1
@@ -44436,414 +44462,414 @@ __exitcall_ebc_exit:
 	.byte	0xd9
 	.4byte	0xc6
 	.uleb128 0x79
-	.4byte	.LASF3133
+	.4byte	.LASF3134
 	.byte	0x1
 	.byte	0xda
-	.4byte	0x13a
-	.4byte	.LLST175
+	.4byte	0x13f
+	.4byte	.LLST178
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3137
+	.4byte	.LASF3138
 	.byte	0x1
 	.byte	0xb4
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x12f54
+	.4byte	0x13020
 	.uleb128 0x7d
 	.string	"ebc"
 	.byte	0x1
 	.byte	0xb4
-	.4byte	0xe483
+	.4byte	0xe49e
 	.uleb128 0x7e
-	.4byte	.LASF3138
+	.4byte	.LASF3139
 	.byte	0x1
 	.byte	0xb4
 	.4byte	0xc6
 	.uleb128 0x78
-	.4byte	.LASF2958
+	.4byte	.LASF2959
 	.byte	0x1
 	.byte	0xb6
-	.4byte	0xe748
+	.4byte	0xe763
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3139
+	.4byte	.LASF3140
 	.byte	0x1
 	.byte	0x86
-	.4byte	0x10b
+	.4byte	0x110
 	.byte	0x3
-	.4byte	0x12f9c
+	.4byte	0x13068
 	.uleb128 0x7e
-	.4byte	.LASF2856
+	.4byte	.LASF2857
 	.byte	0x1
 	.byte	0x86
-	.4byte	0xc0ad
+	.4byte	0xc0c8
 	.uleb128 0x7e
-	.4byte	.LASF3104
+	.4byte	.LASF3105
 	.byte	0x1
 	.byte	0x86
-	.4byte	0x11a
+	.4byte	0x11f
 	.uleb128 0x7e
-	.4byte	.LASF3105
+	.4byte	.LASF3106
 	.byte	0x1
 	.byte	0x86
-	.4byte	0x11a
+	.4byte	0x11f
 	.uleb128 0x78
-	.4byte	.LASF3140
+	.4byte	.LASF3141
 	.byte	0x1
 	.byte	0x88
-	.4byte	0x10b
+	.4byte	0x110
 	.uleb128 0x78
-	.4byte	.LASF3121
+	.4byte	.LASF3122
 	.byte	0x1
 	.byte	0x89
-	.4byte	0x11a
+	.4byte	0x11f
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3141
+	.4byte	.LASF3142
 	.byte	0x1
 	.byte	0x80
-	.4byte	0x10b
+	.4byte	0x110
 	.byte	0x3
-	.4byte	0x12fce
+	.4byte	0x1309a
 	.uleb128 0x7e
-	.4byte	.LASF2856
+	.4byte	.LASF2857
 	.byte	0x1
 	.byte	0x80
-	.4byte	0xc0ad
+	.4byte	0xc0c8
 	.uleb128 0x7e
-	.4byte	.LASF3104
+	.4byte	.LASF3105
 	.byte	0x1
 	.byte	0x80
-	.4byte	0x11a
+	.4byte	0x11f
 	.uleb128 0x7e
-	.4byte	.LASF3105
+	.4byte	.LASF3106
 	.byte	0x1
 	.byte	0x80
-	.4byte	0x11a
+	.4byte	0x11f
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3142
+	.4byte	.LASF3143
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x12ff1
+	.4byte	0x130bd
 	.uleb128 0x7e
-	.4byte	.LASF2933
+	.4byte	.LASF2934
 	.byte	0xb
 	.byte	0x4b
-	.4byte	0xe105
+	.4byte	0xe120
 	.uleb128 0x7e
-	.4byte	.LASF2965
+	.4byte	.LASF2966
 	.byte	0xb
 	.byte	0x4b
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3143
+	.4byte	.LASF3144
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x1301f
+	.4byte	0x130eb
 	.uleb128 0x7e
-	.4byte	.LASF2933
+	.4byte	.LASF2934
 	.byte	0xb
 	.byte	0x3c
-	.4byte	0xe105
+	.4byte	0xe120
 	.uleb128 0x7e
-	.4byte	.LASF3144
+	.4byte	.LASF3145
 	.byte	0xb
 	.byte	0x3c
-	.4byte	0x13a
+	.4byte	0x13f
 	.uleb128 0x7e
-	.4byte	.LASF3145
+	.4byte	.LASF3146
 	.byte	0xb
 	.byte	0x3c
-	.4byte	0x13a
+	.4byte	0x13f
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3146
+	.4byte	.LASF3147
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x13063
+	.4byte	0x1312f
 	.uleb128 0x7e
-	.4byte	.LASF2933
+	.4byte	.LASF2934
 	.byte	0xb
 	.byte	0x36
-	.4byte	0xe105
+	.4byte	0xe120
 	.uleb128 0x7e
-	.4byte	.LASF3147
+	.4byte	.LASF3148
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF3148
+	.4byte	.LASF3149
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF3149
+	.4byte	.LASF3150
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF3150
+	.4byte	.LASF3151
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3151
+	.4byte	.LASF3152
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x1307b
+	.4byte	0x13147
 	.uleb128 0x7e
-	.4byte	.LASF2933
+	.4byte	.LASF2934
 	.byte	0xb
 	.byte	0x31
-	.4byte	0xe105
+	.4byte	0xe120
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3152
+	.4byte	.LASF3153
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x130a2
+	.4byte	0x1316e
 	.uleb128 0x7e
-	.4byte	.LASF2933
+	.4byte	.LASF2934
 	.byte	0xb
 	.byte	0x2c
-	.4byte	0xe105
+	.4byte	0xe120
 	.uleb128 0x7e
-	.4byte	.LASF2999
+	.4byte	.LASF3000
 	.byte	0xb
 	.byte	0x2c
-	.4byte	0xe145
+	.4byte	0xe160
 	.byte	0
-	.uleb128 0x65
-	.4byte	.LASF3153
+	.uleb128 0x66
+	.4byte	.LASF3154
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x130ec
-	.uleb128 0x63
+	.4byte	0x131b8
+	.uleb128 0x64
 	.string	"dev"
 	.byte	0xa
 	.2byte	0x1ab
-	.4byte	0xa55b
-	.uleb128 0x64
-	.4byte	.LASF1149
+	.4byte	0xa570
+	.uleb128 0x65
+	.4byte	.LASF1150
 	.byte	0xa
 	.2byte	0x1ac
-	.4byte	0x310
-	.uleb128 0x64
-	.4byte	.LASF986
+	.4byte	0x325
+	.uleb128 0x65
+	.4byte	.LASF987
 	.byte	0xa
 	.2byte	0x1ac
-	.4byte	0x2ce
-	.uleb128 0x63
+	.4byte	0x2e3
+	.uleb128 0x64
 	.string	"dir"
 	.byte	0xa
 	.2byte	0x1ad
-	.4byte	0xdb6b
+	.4byte	0xdb86
 	.uleb128 0x52
 	.string	"ops"
 	.byte	0xa
 	.2byte	0x1af
-	.4byte	0xb7a4
+	.4byte	0xb7b9
 	.byte	0
-	.uleb128 0x62
-	.4byte	.LASF3154
+	.uleb128 0x63
+	.4byte	.LASF3155
 	.byte	0xa
 	.2byte	0x108
-	.4byte	0xb7a4
+	.4byte	0xb7b9
 	.byte	0x3
-	.4byte	0x1310a
-	.uleb128 0x63
+	.4byte	0x131d6
+	.uleb128 0x64
 	.string	"dev"
 	.byte	0xa
 	.2byte	0x108
-	.4byte	0xa55b
+	.4byte	0xa570
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3155
+	.4byte	.LASF3156
 	.byte	0xc8
 	.byte	0x1d
-	.4byte	0xb7a4
+	.4byte	0xb7b9
 	.byte	0x3
-	.4byte	0x13126
+	.4byte	0x131f2
 	.uleb128 0x7d
 	.string	"bus"
 	.byte	0xc8
 	.byte	0x1d
-	.4byte	0xadc2
+	.4byte	0xadd7
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3156
+	.4byte	.LASF3157
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13142
+	.4byte	0x1320e
 	.uleb128 0x7e
-	.4byte	.LASF3157
+	.4byte	.LASF3158
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3158
+	.4byte	.LASF3159
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x1317b
+	.4byte	0x13247
 	.uleb128 0x7d
 	.string	"dev"
 	.byte	0xcb
 	.byte	0xa3
-	.4byte	0xa55b
+	.4byte	0xa570
 	.uleb128 0x7e
-	.4byte	.LASF3159
+	.4byte	.LASF3160
 	.byte	0xcb
 	.byte	0xa4
-	.4byte	0x310
+	.4byte	0x325
 	.uleb128 0x7e
-	.4byte	.LASF986
+	.4byte	.LASF987
 	.byte	0xcb
 	.byte	0xa5
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x7e
-	.4byte	.LASF3160
+	.4byte	.LASF3161
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3161
+	.4byte	.LASF3162
 	.byte	0x3
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13197
+	.4byte	0x13263
 	.uleb128 0x7e
-	.4byte	.LASF2934
+	.4byte	.LASF2935
 	.byte	0x3
 	.byte	0x35
-	.4byte	0xdb05
+	.4byte	0xdb20
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3162
+	.4byte	.LASF3163
 	.byte	0x3
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x131bc
+	.4byte	0x13288
 	.uleb128 0x7e
-	.4byte	.LASF2934
+	.4byte	.LASF2935
 	.byte	0x3
 	.byte	0x30
-	.4byte	0xdb05
+	.4byte	0xdb20
 	.uleb128 0x7d
 	.string	"t"
 	.byte	0x3
 	.byte	0x30
-	.4byte	0x4669
+	.4byte	0x467e
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3163
+	.4byte	.LASF3164
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x131d4
+	.4byte	0x132a0
 	.uleb128 0x7e
-	.4byte	.LASF2934
+	.4byte	.LASF2935
 	.byte	0x3
 	.byte	0x2b
-	.4byte	0xdb05
+	.4byte	0xdb20
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3164
+	.4byte	.LASF3165
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x131ec
+	.4byte	0x132b8
 	.uleb128 0x7e
-	.4byte	.LASF2934
+	.4byte	.LASF2935
 	.byte	0x3
 	.byte	0x26
-	.4byte	0xdb05
+	.4byte	0xdb20
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3165
+	.4byte	.LASF3166
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x13204
+	.4byte	0x132d0
 	.uleb128 0x7e
-	.4byte	.LASF2934
+	.4byte	.LASF2935
 	.byte	0x3
 	.byte	0x21
-	.4byte	0xdb05
+	.4byte	0xdb20
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3166
+	.4byte	.LASF3167
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x1321c
+	.4byte	0x132e8
 	.uleb128 0x7e
-	.4byte	.LASF2934
+	.4byte	.LASF2935
 	.byte	0x3
 	.byte	0x1c
-	.4byte	0xdb05
+	.4byte	0xdb20
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3167
+	.4byte	.LASF3168
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x13234
+	.4byte	0x13300
 	.uleb128 0x7e
-	.4byte	.LASF115
+	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x13234
+	.4byte	0x13300
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd7e7
+	.4byte	0xd802
 	.uleb128 0x7f
-	.4byte	.LASF2838
+	.4byte	.LASF2839
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x13252
+	.4byte	0x1331e
 	.uleb128 0x7e
-	.4byte	.LASF115
+	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x13234
+	.4byte	0x13300
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3168
+	.4byte	.LASF3169
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x1328a
+	.4byte	0x13356
 	.uleb128 0x7e
-	.4byte	.LASF115
+	.4byte	.LASF116
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x13234
+	.4byte	0x13300
 	.uleb128 0x7e
-	.4byte	.LASF192
+	.4byte	.LASF193
 	.byte	0x4
 	.byte	0x24
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF264
+	.4byte	.LASF265
 	.byte	0x4
 	.byte	0x25
 	.4byte	0x56
@@ -44851,25 +44877,25 @@ __exitcall_ebc_exit:
 	.string	"ws"
 	.byte	0x4
 	.byte	0x27
-	.4byte	0xacf8
+	.4byte	0xad0d
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3169
+	.4byte	.LASF3170
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x132b9
+	.4byte	0x13385
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
 	.byte	0x98
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x7e
-	.4byte	.LASF2004
+	.4byte	.LASF2005
 	.byte	0x9
 	.byte	0x98
-	.4byte	0x30a7
+	.4byte	0x30bc
 	.uleb128 0x7d
 	.string	"n"
 	.byte	0x9
@@ -44877,22 +44903,22 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3170
+	.4byte	.LASF3171
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x132e8
+	.4byte	0x133b4
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
 	.byte	0x90
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x7e
-	.4byte	.LASF2004
+	.4byte	.LASF2005
 	.byte	0x9
 	.byte	0x90
-	.4byte	0x30a7
+	.4byte	0x30bc
 	.uleb128 0x7d
 	.string	"n"
 	.byte	0x9
@@ -44900,22 +44926,22 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3171
+	.4byte	.LASF3172
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13317
+	.4byte	0x133e3
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
 	.byte	0x81
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x7e
-	.4byte	.LASF2004
+	.4byte	.LASF2005
 	.byte	0x9
 	.byte	0x81
-	.4byte	0x30a7
+	.4byte	0x30bc
 	.uleb128 0x7d
 	.string	"n"
 	.byte	0x9
@@ -44923,22 +44949,22 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3172
+	.4byte	.LASF3173
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13351
+	.4byte	0x1341d
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
 	.byte	0x6e
-	.4byte	0x443
+	.4byte	0x458
 	.uleb128 0x7e
-	.4byte	.LASF2004
+	.4byte	.LASF2005
 	.byte	0x9
 	.byte	0x6e
-	.4byte	0x30a7
+	.4byte	0x30bc
 	.uleb128 0x7d
 	.string	"n"
 	.byte	0x9
@@ -44951,44 +44977,44 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3173
+	.4byte	.LASF3174
 	.byte	0x6
 	.byte	0xf5
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x3
-	.4byte	0x13385
+	.4byte	0x13451
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0x6
 	.byte	0xf5
-	.4byte	0x30a7
+	.4byte	0x30bc
 	.uleb128 0x78
-	.4byte	.LASF3174
+	.4byte	.LASF3175
 	.byte	0x6
 	.byte	0xf7
-	.4byte	0x443
-	.uleb128 0x66
+	.4byte	0x458
+	.uleb128 0x67
 	.uleb128 0x78
-	.4byte	.LASF3175
+	.4byte	.LASF3176
 	.byte	0x6
 	.byte	0xfe
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3176
+	.4byte	.LASF3177
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x133cf
+	.4byte	0x1349b
 	.uleb128 0x7e
-	.4byte	.LASF1149
+	.4byte	.LASF1150
 	.byte	0x6
 	.byte	0x4b
-	.4byte	0x30a7
+	.4byte	0x30bc
 	.uleb128 0x7e
-	.4byte	.LASF986
+	.4byte	.LASF987
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
@@ -44998,209 +45024,209 @@ __exitcall_ebc_exit:
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x78
-	.4byte	.LASF3177
+	.4byte	.LASF3178
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
-	.uleb128 0x66
+	.uleb128 0x67
 	.uleb128 0x78
-	.4byte	.LASF3175
+	.4byte	.LASF3176
 	.byte	0x6
 	.byte	0x56
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0
 	.byte	0
-	.uleb128 0x62
-	.4byte	.LASF3178
+	.uleb128 0x63
+	.4byte	.LASF3179
 	.byte	0x12
 	.2byte	0x2e5
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x3
-	.4byte	0x133f9
-	.uleb128 0x64
-	.4byte	.LASF986
+	.4byte	0x134c5
+	.uleb128 0x65
+	.4byte	.LASF987
 	.byte	0x12
 	.2byte	0x2e5
-	.4byte	0x2ce
-	.uleb128 0x64
-	.4byte	.LASF170
+	.4byte	0x2e3
+	.uleb128 0x65
+	.4byte	.LASF171
 	.byte	0x12
 	.2byte	0x2e5
-	.4byte	0x31b
+	.4byte	0x330
 	.byte	0
-	.uleb128 0x62
-	.4byte	.LASF3179
+	.uleb128 0x63
+	.4byte	.LASF3180
 	.byte	0x12
 	.2byte	0x216
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x3
-	.4byte	0x13431
-	.uleb128 0x64
-	.4byte	.LASF986
+	.4byte	0x134fd
+	.uleb128 0x65
+	.4byte	.LASF987
 	.byte	0x12
 	.2byte	0x216
-	.4byte	0x2ce
-	.uleb128 0x64
-	.4byte	.LASF170
+	.4byte	0x2e3
+	.uleb128 0x65
+	.4byte	.LASF171
 	.byte	0x12
 	.2byte	0x216
-	.4byte	0x31b
-	.uleb128 0x66
+	.4byte	0x330
+	.uleb128 0x67
 	.uleb128 0x46
-	.4byte	.LASF879
+	.4byte	.LASF880
 	.byte	0x12
 	.2byte	0x21a
 	.4byte	0x6d
 	.byte	0
 	.byte	0
-	.uleb128 0x62
-	.4byte	.LASF3180
+	.uleb128 0x63
+	.4byte	.LASF3181
 	.byte	0x12
 	.2byte	0x1dd
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x3
-	.4byte	0x13467
-	.uleb128 0x64
-	.4byte	.LASF986
+	.4byte	0x13533
+	.uleb128 0x65
+	.4byte	.LASF987
 	.byte	0x12
 	.2byte	0x1dd
-	.4byte	0x2ce
-	.uleb128 0x64
-	.4byte	.LASF170
+	.4byte	0x2e3
+	.uleb128 0x65
+	.4byte	.LASF171
 	.byte	0x12
 	.2byte	0x1dd
-	.4byte	0x31b
+	.4byte	0x330
 	.uleb128 0x46
-	.4byte	.LASF3181
+	.4byte	.LASF3182
 	.byte	0x12
 	.2byte	0x1df
 	.4byte	0x6d
 	.byte	0
-	.uleb128 0x62
-	.4byte	.LASF3182
+	.uleb128 0x63
+	.4byte	.LASF3183
 	.byte	0x12
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x13485
-	.uleb128 0x64
-	.4byte	.LASF986
+	.4byte	0x13551
+	.uleb128 0x65
+	.4byte	.LASF987
 	.byte	0x12
 	.2byte	0x159
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.byte	0
-	.uleb128 0x62
-	.4byte	.LASF3183
+	.uleb128 0x63
+	.4byte	.LASF3184
 	.byte	0x12
 	.2byte	0x13d
-	.4byte	0xd788
+	.4byte	0xd7a3
 	.byte	0x3
-	.4byte	0x134a3
-	.uleb128 0x64
-	.4byte	.LASF170
+	.4byte	0x1356f
+	.uleb128 0x65
+	.4byte	.LASF171
 	.byte	0x12
 	.2byte	0x13d
-	.4byte	0x31b
+	.4byte	0x330
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3184
+	.4byte	.LASF3185
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x134c6
+	.4byte	0x13592
 	.uleb128 0x7e
-	.4byte	.LASF3027
+	.4byte	.LASF3028
 	.byte	0xbe
 	.byte	0xdb
-	.4byte	0xd6ff
+	.4byte	0xd71a
 	.uleb128 0x7e
-	.4byte	.LASF793
+	.4byte	.LASF794
 	.byte	0xbe
 	.byte	0xdc
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3185
+	.4byte	.LASF3186
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x3
-	.4byte	0x134e2
+	.4byte	0x135ae
 	.uleb128 0x7e
-	.4byte	.LASF3027
+	.4byte	.LASF3028
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x134e2
+	.4byte	0x135ae
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd657
-	.uleb128 0x62
-	.4byte	.LASF3186
+	.4byte	0xd672
+	.uleb128 0x63
+	.4byte	.LASF3187
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x3
-	.4byte	0x13506
-	.uleb128 0x63
+	.4byte	0x135d2
+	.uleb128 0x64
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x13506
+	.4byte	0x135d2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc0a8
-	.uleb128 0x62
-	.4byte	.LASF3187
+	.4byte	0xc0c3
+	.uleb128 0x63
+	.4byte	.LASF3188
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13541
-	.uleb128 0x63
+	.4byte	0x1360d
+	.uleb128 0x64
 	.string	"np"
 	.byte	0xe
 	.2byte	0x498
-	.4byte	0xbca5
-	.uleb128 0x64
-	.4byte	.LASF3188
+	.4byte	0xbcba
+	.uleb128 0x65
+	.4byte	.LASF3189
 	.byte	0xe
 	.2byte	0x499
 	.4byte	0x56
-	.uleb128 0x64
-	.4byte	.LASF3189
+	.uleb128 0x65
+	.4byte	.LASF3190
 	.byte	0xe
 	.2byte	0x49a
-	.4byte	0xaab
+	.4byte	0xac0
 	.byte	0
-	.uleb128 0x62
-	.4byte	.LASF3190
+	.uleb128 0x63
+	.4byte	.LASF3191
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1358d
-	.uleb128 0x63
+	.4byte	0x13659
+	.uleb128 0x64
 	.string	"np"
 	.byte	0xe
 	.2byte	0x1ef
-	.4byte	0xbca5
-	.uleb128 0x64
-	.4byte	.LASF3188
+	.4byte	0xbcba
+	.uleb128 0x65
+	.4byte	.LASF3189
 	.byte	0xe
 	.2byte	0x1f0
 	.4byte	0x56
-	.uleb128 0x64
-	.4byte	.LASF3191
+	.uleb128 0x65
+	.4byte	.LASF3192
 	.byte	0xe
 	.2byte	0x1f1
-	.4byte	0xaab
-	.uleb128 0x63
+	.4byte	0xac0
+	.uleb128 0x64
 	.string	"sz"
 	.byte	0xe
 	.2byte	0x1f1
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0xe
@@ -45208,205 +45234,205 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3192
+	.4byte	.LASF3193
 	.byte	0xe
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x135a5
+	.4byte	0x13671
 	.uleb128 0x7e
-	.4byte	.LASF867
+	.4byte	.LASF868
 	.byte	0xe
 	.byte	0x83
-	.4byte	0xb87f
+	.4byte	0xb894
 	.byte	0
-	.uleb128 0x65
-	.4byte	.LASF3193
+	.uleb128 0x66
+	.4byte	.LASF3194
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x135cb
-	.uleb128 0x63
+	.4byte	0x13697
+	.uleb128 0x64
 	.string	"dev"
 	.byte	0x2
 	.2byte	0x4a0
-	.4byte	0xa55b
-	.uleb128 0x64
-	.4byte	.LASF793
+	.4byte	0xa570
+	.uleb128 0x65
+	.4byte	.LASF794
 	.byte	0x2
 	.2byte	0x4a0
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0
-	.uleb128 0x62
-	.4byte	.LASF3194
+	.uleb128 0x63
+	.4byte	.LASF3195
 	.byte	0x2
 	.2byte	0x49b
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x3
-	.4byte	0x135e9
-	.uleb128 0x63
+	.4byte	0x136b5
+	.uleb128 0x64
 	.string	"dev"
 	.byte	0x2
 	.2byte	0x49b
-	.4byte	0xbb15
+	.4byte	0xbb2a
 	.byte	0
-	.uleb128 0x62
-	.4byte	.LASF3195
+	.uleb128 0x63
+	.4byte	.LASF3196
 	.byte	0x2
 	.2byte	0x2c5
-	.4byte	0x443
+	.4byte	0x458
 	.byte	0x3
-	.4byte	0x1361f
-	.uleb128 0x63
+	.4byte	0x136eb
+	.uleb128 0x64
 	.string	"dev"
 	.byte	0x2
 	.2byte	0x2c5
-	.4byte	0xa55b
-	.uleb128 0x64
-	.4byte	.LASF986
+	.4byte	0xa570
+	.uleb128 0x65
+	.4byte	.LASF987
 	.byte	0x2
 	.2byte	0x2c5
-	.4byte	0x2ce
-	.uleb128 0x63
+	.4byte	0x2e3
+	.uleb128 0x64
 	.string	"gfp"
 	.byte	0x2
 	.2byte	0x2c5
-	.4byte	0x31b
+	.4byte	0x330
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3196
+	.4byte	.LASF3197
 	.byte	0xf
 	.byte	0xca
-	.4byte	0x33c
+	.4byte	0x351
 	.byte	0x3
-	.4byte	0x1363b
+	.4byte	0x13707
 	.uleb128 0x7d
 	.string	"res"
 	.byte	0xf
 	.byte	0xca
-	.4byte	0xc1b9
+	.4byte	0xc1d4
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3197
+	.4byte	.LASF3198
 	.byte	0xcc
 	.byte	0x22
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x13657
+	.4byte	0x13723
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xcc
 	.byte	0x22
-	.4byte	0x30a7
+	.4byte	0x30bc
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3198
+	.4byte	.LASF3199
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13673
+	.4byte	0x1373f
 	.uleb128 0x7e
-	.4byte	.LASF986
+	.4byte	.LASF987
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x62
-	.4byte	.LASF3199
+	.uleb128 0x63
+	.4byte	.LASF3200
 	.byte	0xd
 	.2byte	0x23e
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x13691
-	.uleb128 0x64
-	.4byte	.LASF2273
+	.4byte	0x1375d
+	.uleb128 0x65
+	.4byte	.LASF2274
 	.byte	0xd
 	.2byte	0x23e
-	.4byte	0x31f0
+	.4byte	0x3205
 	.byte	0
-	.uleb128 0x62
-	.4byte	.LASF3200
+	.uleb128 0x63
+	.4byte	.LASF3201
 	.byte	0xd
 	.2byte	0x203
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x136ba
-	.uleb128 0x63
+	.4byte	0x13786
+	.uleb128 0x64
 	.string	"wq"
 	.byte	0xd
 	.2byte	0x203
-	.4byte	0x330a
-	.uleb128 0x64
-	.4byte	.LASF2273
+	.4byte	0x331f
+	.uleb128 0x65
+	.4byte	.LASF2274
 	.byte	0xd
 	.2byte	0x204
-	.4byte	0x31f0
+	.4byte	0x3205
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3201
+	.4byte	.LASF3202
 	.byte	0xd
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x136dd
+	.4byte	0x137a9
 	.uleb128 0x7e
-	.4byte	.LASF2273
+	.4byte	.LASF2274
 	.byte	0xd
 	.byte	0xdd
-	.4byte	0x31f0
+	.4byte	0x3205
 	.uleb128 0x7e
-	.4byte	.LASF3202
+	.4byte	.LASF3203
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x62
-	.4byte	.LASF3203
+	.uleb128 0x63
+	.4byte	.LASF3204
 	.byte	0x51
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x136f9
-	.uleb128 0x63
+	.4byte	0x137c5
+	.uleb128 0x64
 	.string	"m"
 	.byte	0x51
 	.2byte	0x169
 	.4byte	0x74
 	.byte	0
-	.uleb128 0x62
-	.4byte	.LASF3204
+	.uleb128 0x63
+	.4byte	.LASF3205
 	.byte	0x51
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13715
-	.uleb128 0x63
+	.4byte	0x137e1
+	.uleb128 0x64
 	.string	"m"
 	.byte	0x51
 	.2byte	0x148
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3205
+	.4byte	.LASF3206
 	.byte	0xca
 	.byte	0x97
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x13751
+	.4byte	0x1381d
 	.uleb128 0x7e
-	.4byte	.LASF1149
+	.4byte	.LASF1150
 	.byte	0xca
 	.byte	0x97
-	.4byte	0x30a7
+	.4byte	0x30bc
 	.uleb128 0x7e
-	.4byte	.LASF3206
+	.4byte	.LASF3207
 	.byte	0xca
 	.byte	0x97
-	.4byte	0x2ce
+	.4byte	0x2e3
 	.uleb128 0x7e
-	.4byte	.LASF3207
+	.4byte	.LASF3208
 	.byte	0xca
 	.byte	0x97
-	.4byte	0x29b
+	.4byte	0x2b0
 	.uleb128 0x7b
 	.string	"sz"
 	.byte	0xca
@@ -45414,188 +45440,230 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3208
+	.4byte	.LASF3209
 	.byte	0xca
 	.byte	0x91
 	.byte	0x3
-	.4byte	0x13781
+	.4byte	0x1384d
 	.uleb128 0x7e
-	.4byte	.LASF986
+	.4byte	.LASF987
 	.byte	0xca
 	.byte	0x91
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF382
+	.4byte	.LASF383
 	.byte	0xca
 	.byte	0x91
 	.4byte	0x29
-	.uleb128 0x66
+	.uleb128 0x67
 	.uleb128 0x78
-	.4byte	.LASF3209
+	.4byte	.LASF3210
 	.byte	0xca
 	.byte	0x93
 	.4byte	0xc6
 	.byte	0
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3210
+	.4byte	.LASF3211
 	.byte	0xca
 	.byte	0x80
 	.byte	0x3
-	.4byte	0x137ad
+	.4byte	0x13879
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xca
 	.byte	0x80
-	.4byte	0x30a7
+	.4byte	0x30bc
 	.uleb128 0x7d
 	.string	"n"
 	.byte	0xca
 	.byte	0x80
 	.4byte	0x29
 	.uleb128 0x7e
-	.4byte	.LASF3211
+	.4byte	.LASF3212
 	.byte	0xca
 	.byte	0x81
-	.4byte	0x29b
+	.4byte	0x2b0
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3212
+	.4byte	.LASF3213
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x137d3
+	.4byte	0x1389f
 	.uleb128 0x7d
 	.string	"ti"
 	.byte	0xca
 	.byte	0x5f
-	.4byte	0x137d3
+	.4byte	0x1389f
 	.uleb128 0x7e
-	.4byte	.LASF3213
+	.4byte	.LASF3214
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc1e
+	.4byte	0xc33
 	.uleb128 0x7c
-	.4byte	.LASF3214
+	.4byte	.LASF3215
 	.byte	0x5
 	.byte	0xf
-	.4byte	0x2ef0
+	.4byte	0x2f05
 	.byte	0x3
-	.4byte	0x137f5
+	.4byte	0x138c1
 	.uleb128 0x78
-	.4byte	.LASF3215
+	.4byte	.LASF3216
 	.byte	0x5
 	.byte	0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3216
+	.4byte	.LASF3217
 	.byte	0x10
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x13839
+	.4byte	0x13905
 	.uleb128 0x7e
-	.4byte	.LASF961
+	.4byte	.LASF962
 	.byte	0x10
 	.byte	0x1a
-	.4byte	0x3b7
-	.uleb128 0x66
+	.4byte	0x3cc
+	.uleb128 0x67
 	.uleb128 0x21
 	.byte	0x8
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x1382c
+	.4byte	0x138f8
 	.uleb128 0x22
-	.4byte	.LASF3094
+	.4byte	.LASF3095
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x3b7
+	.4byte	0x3cc
 	.uleb128 0x28
 	.string	"__c"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x1231e
+	.4byte	0x123ea
 	.byte	0
 	.uleb128 0x7b
 	.string	"__u"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x1380d
+	.4byte	0x138d9
 	.byte	0
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3290
+	.4byte	.LASF3296
 	.byte	0x20
 	.2byte	0x126
 	.byte	0x3
 	.uleb128 0x7c
-	.4byte	.LASF3217
+	.4byte	.LASF3218
 	.byte	0xce
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1385d
+	.4byte	0x13929
 	.uleb128 0x7d
 	.string	"n"
 	.byte	0xce
 	.byte	0x22
-	.4byte	0x155
+	.4byte	0x15a
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3218
+	.4byte	.LASF3219
 	.byte	0x8
 	.byte	0x9a
-	.4byte	0xdd
+	.4byte	0xe2
 	.byte	0x3
-	.4byte	0x1388f
+	.4byte	0x1395b
 	.uleb128 0x7e
-	.4byte	.LASF2455
+	.4byte	.LASF2456
 	.byte	0x8
 	.byte	0x9a
-	.4byte	0xef
+	.4byte	0xf4
 	.uleb128 0x7e
-	.4byte	.LASF879
+	.4byte	.LASF880
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xc6
 	.uleb128 0x78
-	.4byte	.LASF260
+	.4byte	.LASF261
 	.byte	0x8
 	.byte	0x9c
 	.4byte	0x8b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3219
+	.4byte	.LASF3220
+	.byte	0xcf
+	.byte	0x50
+	.4byte	0xd2
+	.byte	0x3
+	.4byte	0x13975
+	.uleb128 0x7d
+	.string	"p"
+	.byte	0xcf
+	.byte	0x50
+	.4byte	0xbcc0
+	.byte	0
+	.uleb128 0x7c
+	.4byte	.LASF3221
+	.byte	0xd0
+	.byte	0xb8
+	.4byte	0xd2
+	.byte	0x3
+	.4byte	0x1398f
+	.uleb128 0x7d
+	.string	"p"
+	.byte	0xd0
+	.byte	0xb8
+	.4byte	0x1398f
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdd
+	.uleb128 0x7c
+	.4byte	.LASF3222
+	.byte	0xd0
+	.byte	0x39
+	.4byte	0xd2
+	.byte	0x3
+	.4byte	0x139b1
+	.uleb128 0x7d
+	.string	"val"
+	.byte	0xd0
+	.byte	0x39
+	.4byte	0xd2
+	.byte	0
+	.uleb128 0x7c
+	.4byte	.LASF3223
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x138b5
+	.4byte	0x139d7
 	.uleb128 0x7d
 	.string	"nr"
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF1149
+	.4byte	.LASF1150
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x138b5
+	.4byte	0x139d7
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x3a
 	.uleb128 0x7f
-	.4byte	.LASF3220
+	.4byte	.LASF3224
 	.byte	0x11
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x138ee
+	.4byte	0x13a10
 	.uleb128 0x7d
 	.string	"i"
 	.byte	0x11
@@ -45605,7 +45673,7 @@ __exitcall_ebc_exit:
 	.string	"v"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x138ee
+	.4byte	0x13a10
 	.uleb128 0x7b
 	.string	"w0"
 	.byte	0x11
@@ -45615,616 +45683,616 @@ __exitcall_ebc_exit:
 	.string	"x1"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x138ee
+	.4byte	0x13a10
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x367
+	.4byte	0x37c
 	.uleb128 0x7c
-	.4byte	.LASF3221
-	.byte	0xcf
+	.4byte	.LASF3225
+	.byte	0xd1
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1390e
+	.4byte	0x13a30
 	.uleb128 0x7d
 	.string	"x"
-	.byte	0xcf
+	.byte	0xd1
 	.byte	0x1b
-	.4byte	0xef
+	.4byte	0xf4
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3222
-	.byte	0xd0
+	.4byte	.LASF3226
+	.byte	0xd2
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1392a
+	.4byte	0x13a4c
 	.uleb128 0x7e
-	.4byte	.LASF2488
-	.byte	0xd0
+	.4byte	.LASF2489
+	.byte	0xd2
 	.byte	0xb
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3223
-	.byte	0xd1
+	.4byte	.LASF3227
+	.byte	0xd3
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x1394b
+	.4byte	0x13a6d
 	.uleb128 0x7d
 	.string	"p"
-	.byte	0xd1
+	.byte	0xd3
 	.byte	0xb
-	.4byte	0x1394b
+	.4byte	0x13a6d
 	.uleb128 0x7e
-	.4byte	.LASF986
-	.byte	0xd1
+	.4byte	.LASF987
+	.byte	0xd3
 	.byte	0xb
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x13953
+	.4byte	0x13a75
 	.uleb128 0x81
 	.uleb128 0x3
-	.4byte	0x13951
+	.4byte	0x13a73
 	.uleb128 0x7f
-	.4byte	.LASF3224
-	.byte	0xd1
+	.4byte	.LASF3228
+	.byte	0xd3
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x13979
+	.4byte	0x13a9b
 	.uleb128 0x7d
 	.string	"p"
-	.byte	0xd1
+	.byte	0xd3
 	.byte	0x9
-	.4byte	0x1394b
+	.4byte	0x13a6d
 	.uleb128 0x7e
-	.4byte	.LASF986
-	.byte	0xd1
+	.4byte	.LASF987
+	.byte	0xd3
 	.byte	0x9
 	.4byte	0x6d
 	.byte	0
-	.uleb128 0x65
-	.4byte	.LASF3225
+	.uleb128 0x66
+	.4byte	.LASF3229
 	.byte	0xc
 	.2byte	0x11a
 	.byte	0x3
-	.4byte	0x139a9
-	.uleb128 0x63
+	.4byte	0x13acb
+	.uleb128 0x64
 	.string	"p"
 	.byte	0xc
 	.2byte	0x11a
-	.4byte	0x139a9
-	.uleb128 0x63
+	.4byte	0x13acb
+	.uleb128 0x64
 	.string	"res"
 	.byte	0xc
 	.2byte	0x11a
-	.4byte	0x443
-	.uleb128 0x64
-	.4byte	.LASF986
+	.4byte	0x458
+	.uleb128 0x65
+	.4byte	.LASF987
 	.byte	0xc
 	.2byte	0x11a
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x13951
+	.4byte	0x13a73
 	.uleb128 0x82
-	.4byte	0x12722
+	.4byte	0x127ee
 	.8byte	.LFB2815
 	.8byte	.LFE2815-.LFB2815
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13c32
+	.4byte	0x13d54
 	.uleb128 0x71
-	.4byte	0x1272f
+	.4byte	0x127fb
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x1273b
+	.4byte	0x12807
 	.4byte	.LLST102
 	.uleb128 0x6f
-	.4byte	0x12747
+	.4byte	0x12813
 	.4byte	.LLST103
 	.uleb128 0x6f
-	.4byte	0x12753
+	.4byte	0x1281f
 	.4byte	.LLST104
 	.uleb128 0x53
-	.4byte	0x12760
-	.8byte	.LBB1232
-	.8byte	.LBE1232-.LBB1232
+	.4byte	0x1282c
+	.8byte	.LBB1244
+	.8byte	.LBE1244-.LBB1244
 	.byte	0x1
 	.2byte	0x388
-	.4byte	0x13ae7
+	.4byte	0x13c09
 	.uleb128 0x54
-	.4byte	0x12791
+	.4byte	0x1285d
 	.uleb128 0x54
-	.4byte	0x12791
+	.4byte	0x1285d
 	.uleb128 0x54
-	.4byte	0x12791
+	.4byte	0x1285d
 	.uleb128 0x54
-	.4byte	0x12785
+	.4byte	0x12851
 	.uleb128 0x54
-	.4byte	0x12779
+	.4byte	0x12845
 	.uleb128 0x54
-	.4byte	0x1276d
+	.4byte	0x12839
 	.uleb128 0x56
-	.8byte	.LBB1233
-	.8byte	.LBE1233-.LBB1233
+	.8byte	.LBB1245
+	.8byte	.LBE1245-.LBB1245
 	.uleb128 0x57
-	.4byte	0x1279d
-	.uleb128 0x5f
-	.4byte	0x127a9
+	.4byte	0x12869
+	.uleb128 0x60
+	.4byte	0x12875
 	.4byte	.LLST105
 	.uleb128 0x57
-	.4byte	0x127b3
-	.uleb128 0x5f
-	.4byte	0x127bd
+	.4byte	0x1287f
+	.uleb128 0x60
+	.4byte	0x12889
 	.4byte	.LLST106
-	.uleb128 0x5f
-	.4byte	0x127c9
+	.uleb128 0x60
+	.4byte	0x12895
 	.4byte	.LLST107
-	.uleb128 0x5f
-	.4byte	0x127d5
+	.uleb128 0x60
+	.4byte	0x128a1
 	.4byte	.LLST108
 	.uleb128 0x57
-	.4byte	0x127e1
-	.uleb128 0x60
-	.4byte	0x127ed
+	.4byte	0x128ad
+	.uleb128 0x61
+	.4byte	0x128b9
 	.uleb128 0x1
 	.byte	0x51
-	.uleb128 0x60
-	.4byte	0x127f9
+	.uleb128 0x61
+	.4byte	0x128c5
 	.uleb128 0x1
 	.byte	0x52
-	.uleb128 0x5f
-	.4byte	0x12805
+	.uleb128 0x60
+	.4byte	0x128d1
 	.4byte	.LLST109
-	.uleb128 0x5f
-	.4byte	0x12811
+	.uleb128 0x60
+	.4byte	0x128dd
 	.4byte	.LLST110
-	.uleb128 0x5f
-	.4byte	0x1281d
+	.uleb128 0x60
+	.4byte	0x128e9
 	.4byte	.LLST111
 	.uleb128 0x57
-	.4byte	0x12829
-	.uleb128 0x5a
-	.4byte	0x12f9c
-	.8byte	.LBB1234
+	.4byte	0x128f5
+	.uleb128 0x5b
+	.4byte	0x13068
+	.8byte	.LBB1246
 	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
 	.2byte	0x37b
-	.4byte	0x13ac1
+	.4byte	0x13be3
 	.uleb128 0x54
-	.4byte	0x12fc2
+	.4byte	0x1308e
 	.uleb128 0x54
-	.4byte	0x12fb7
+	.4byte	0x13083
 	.uleb128 0x54
-	.4byte	0x12fac
+	.4byte	0x13078
 	.byte	0
-	.uleb128 0x5e
-	.4byte	0x12f9c
-	.8byte	.LBB1241
+	.uleb128 0x5f
+	.4byte	0x13068
+	.8byte	.LBB1253
 	.4byte	.Ldebug_ranges0+0x730
 	.byte	0x1
 	.2byte	0x37c
 	.uleb128 0x54
-	.4byte	0x12fc2
+	.4byte	0x1308e
 	.uleb128 0x54
-	.4byte	0x12fb7
+	.4byte	0x13083
 	.uleb128 0x54
-	.4byte	0x12fac
+	.4byte	0x13078
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5d
+	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x780
 	.uleb128 0x54
-	.4byte	0x12753
+	.4byte	0x1281f
 	.uleb128 0x54
-	.4byte	0x12747
+	.4byte	0x12813
 	.uleb128 0x54
-	.4byte	0x1273b
+	.4byte	0x12807
 	.uleb128 0x54
-	.4byte	0x1272f
-	.uleb128 0x5e
-	.4byte	0x12836
-	.8byte	.LBB1253
+	.4byte	0x127fb
+	.uleb128 0x5f
+	.4byte	0x12902
+	.8byte	.LBB1265
 	.4byte	.Ldebug_ranges0+0x780
 	.byte	0x1
 	.2byte	0x386
 	.uleb128 0x54
-	.4byte	0x12867
+	.4byte	0x12933
 	.uleb128 0x54
-	.4byte	0x12867
+	.4byte	0x12933
 	.uleb128 0x54
-	.4byte	0x12867
+	.4byte	0x12933
 	.uleb128 0x54
-	.4byte	0x1285b
+	.4byte	0x12927
 	.uleb128 0x54
-	.4byte	0x1284f
+	.4byte	0x1291b
 	.uleb128 0x54
-	.4byte	0x12843
-	.uleb128 0x5d
+	.4byte	0x1290f
+	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x780
 	.uleb128 0x57
-	.4byte	0x12873
-	.uleb128 0x60
-	.4byte	0x1287f
+	.4byte	0x1293f
+	.uleb128 0x61
+	.4byte	0x1294b
 	.uleb128 0x1
 	.byte	0x5c
 	.uleb128 0x57
-	.4byte	0x12889
-	.uleb128 0x60
-	.4byte	0x12893
+	.4byte	0x12955
+	.uleb128 0x61
+	.4byte	0x1295f
 	.uleb128 0x1
 	.byte	0x5f
 	.uleb128 0x57
-	.4byte	0x1289f
-	.uleb128 0x5f
-	.4byte	0x128ab
+	.4byte	0x1296b
+	.uleb128 0x60
+	.4byte	0x12977
 	.4byte	.LLST112
-	.uleb128 0x5f
-	.4byte	0x128b7
-	.4byte	.LLST113
 	.uleb128 0x60
-	.4byte	0x128c3
+	.4byte	0x12983
+	.4byte	.LLST113
+	.uleb128 0x61
+	.4byte	0x1298f
 	.uleb128 0x1
 	.byte	0x59
-	.uleb128 0x60
-	.4byte	0x128cf
+	.uleb128 0x61
+	.4byte	0x1299b
 	.uleb128 0x1
 	.byte	0x5a
-	.uleb128 0x5f
-	.4byte	0x128db
+	.uleb128 0x60
+	.4byte	0x129a7
 	.4byte	.LLST114
-	.uleb128 0x5f
-	.4byte	0x128e7
-	.4byte	.LLST115
 	.uleb128 0x60
-	.4byte	0x128f3
+	.4byte	0x129b3
+	.4byte	.LLST115
+	.uleb128 0x61
+	.4byte	0x129bf
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x57
-	.4byte	0x128ff
-	.uleb128 0x5a
-	.4byte	0x12f9c
-	.8byte	.LBB1255
+	.4byte	0x129cb
+	.uleb128 0x5b
+	.4byte	0x13068
+	.8byte	.LBB1267
 	.4byte	.Ldebug_ranges0+0x7c0
 	.byte	0x1
 	.2byte	0x354
-	.4byte	0x13bba
+	.4byte	0x13cdc
 	.uleb128 0x54
-	.4byte	0x12fc2
+	.4byte	0x1308e
 	.uleb128 0x54
-	.4byte	0x12fb7
+	.4byte	0x13083
 	.uleb128 0x54
-	.4byte	0x12fac
+	.4byte	0x13078
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x12f9c
-	.8byte	.LBB1260
+	.uleb128 0x5b
+	.4byte	0x13068
+	.8byte	.LBB1272
 	.4byte	.Ldebug_ranges0+0x810
 	.byte	0x1
 	.2byte	0x355
-	.4byte	0x13be2
+	.4byte	0x13d04
 	.uleb128 0x54
-	.4byte	0x12fc2
+	.4byte	0x1308e
 	.uleb128 0x54
-	.4byte	0x12fb7
+	.4byte	0x13083
 	.uleb128 0x54
-	.4byte	0x12fac
+	.4byte	0x13078
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x12f9c
-	.8byte	.LBB1272
+	.uleb128 0x5b
+	.4byte	0x13068
+	.8byte	.LBB1284
 	.4byte	.Ldebug_ranges0+0x880
 	.byte	0x1
 	.2byte	0x356
-	.4byte	0x13c0a
+	.4byte	0x13d2c
 	.uleb128 0x54
-	.4byte	0x12fc2
+	.4byte	0x1308e
 	.uleb128 0x54
-	.4byte	0x12fb7
+	.4byte	0x13083
 	.uleb128 0x54
-	.4byte	0x12fac
+	.4byte	0x13078
 	.byte	0
-	.uleb128 0x5e
-	.4byte	0x12f9c
-	.8byte	.LBB1284
+	.uleb128 0x5f
+	.4byte	0x13068
+	.8byte	.LBB1296
 	.4byte	.Ldebug_ranges0+0x8f0
 	.byte	0x1
 	.2byte	0x357
 	.uleb128 0x54
-	.4byte	0x12fc2
+	.4byte	0x1308e
 	.uleb128 0x54
-	.4byte	0x12fb7
+	.4byte	0x13083
 	.uleb128 0x54
-	.4byte	0x12fac
+	.4byte	0x13078
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x82
-	.4byte	0x12538
+	.4byte	0x12604
 	.8byte	.LFB2818
 	.8byte	.LFE2818-.LFB2818
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13f67
+	.4byte	0x14089
 	.uleb128 0x71
-	.4byte	0x12545
+	.4byte	0x12611
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x12551
+	.4byte	0x1261d
 	.4byte	.LLST116
 	.uleb128 0x6f
-	.4byte	0x1255d
+	.4byte	0x12629
 	.4byte	.LLST117
 	.uleb128 0x6f
-	.4byte	0x12569
+	.4byte	0x12635
 	.4byte	.LLST118
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.Ldebug_ranges0+0x940
-	.4byte	0x13e4c
+	.4byte	0x13f6e
 	.uleb128 0x54
-	.4byte	0x12569
+	.4byte	0x12635
 	.uleb128 0x54
-	.4byte	0x1255d
+	.4byte	0x12629
 	.uleb128 0x54
-	.4byte	0x12551
+	.4byte	0x1261d
 	.uleb128 0x54
-	.4byte	0x12545
-	.uleb128 0x5e
-	.4byte	0x12576
-	.8byte	.LBB1320
+	.4byte	0x12611
+	.uleb128 0x5f
+	.4byte	0x12642
+	.8byte	.LBB1332
 	.4byte	.Ldebug_ranges0+0x940
 	.byte	0x1
 	.2byte	0x3e4
 	.uleb128 0x54
-	.4byte	0x125a7
+	.4byte	0x12673
 	.uleb128 0x54
-	.4byte	0x125a7
+	.4byte	0x12673
 	.uleb128 0x54
-	.4byte	0x125a7
+	.4byte	0x12673
 	.uleb128 0x54
-	.4byte	0x1259b
+	.4byte	0x12667
 	.uleb128 0x54
-	.4byte	0x1258f
+	.4byte	0x1265b
 	.uleb128 0x54
-	.4byte	0x12583
-	.uleb128 0x5d
+	.4byte	0x1264f
+	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x940
 	.uleb128 0x57
-	.4byte	0x125b3
-	.uleb128 0x5f
-	.4byte	0x125bf
+	.4byte	0x1267f
+	.uleb128 0x60
+	.4byte	0x1268b
 	.4byte	.LLST119
-	.uleb128 0x5f
-	.4byte	0x125cb
+	.uleb128 0x60
+	.4byte	0x12697
 	.4byte	.LLST120
-	.uleb128 0x5f
-	.4byte	0x125d7
+	.uleb128 0x60
+	.4byte	0x126a3
 	.4byte	.LLST121
-	.uleb128 0x5f
-	.4byte	0x125e3
+	.uleb128 0x60
+	.4byte	0x126af
 	.4byte	.LLST122
-	.uleb128 0x5f
-	.4byte	0x125ef
+	.uleb128 0x60
+	.4byte	0x126bb
 	.4byte	.LLST123
-	.uleb128 0x5f
-	.4byte	0x125fb
+	.uleb128 0x60
+	.4byte	0x126c7
 	.4byte	.LLST124
-	.uleb128 0x5f
-	.4byte	0x12607
+	.uleb128 0x60
+	.4byte	0x126d3
 	.4byte	.LLST125
-	.uleb128 0x5f
-	.4byte	0x12613
+	.uleb128 0x60
+	.4byte	0x126df
 	.4byte	.LLST126
 	.uleb128 0x57
-	.4byte	0x1261d
-	.uleb128 0x5f
-	.4byte	0x12627
+	.4byte	0x126e9
+	.uleb128 0x60
+	.4byte	0x126f3
 	.4byte	.LLST127
-	.uleb128 0x5f
-	.4byte	0x12633
+	.uleb128 0x60
+	.4byte	0x126ff
 	.4byte	.LLST128
 	.uleb128 0x57
-	.4byte	0x1263f
-	.uleb128 0x5a
-	.4byte	0x12f54
-	.8byte	.LBB1322
+	.4byte	0x1270b
+	.uleb128 0x5b
+	.4byte	0x13020
+	.8byte	.LBB1334
 	.4byte	.Ldebug_ranges0+0x970
 	.byte	0x1
 	.2byte	0x3d5
-	.4byte	0x13d69
+	.4byte	0x13e8b
 	.uleb128 0x54
-	.4byte	0x12f7a
+	.4byte	0x13046
 	.uleb128 0x54
-	.4byte	0x12f6f
+	.4byte	0x1303b
 	.uleb128 0x54
-	.4byte	0x12f64
-	.uleb128 0x5d
+	.4byte	0x13030
+	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x970
 	.uleb128 0x57
-	.4byte	0x12f85
-	.uleb128 0x5f
-	.4byte	0x12f90
+	.4byte	0x13051
+	.uleb128 0x60
+	.4byte	0x1305c
 	.4byte	.LLST129
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12f54
-	.8byte	.LBB1325
-	.8byte	.LBE1325-.LBB1325
+	.4byte	0x13020
+	.8byte	.LBB1337
+	.8byte	.LBE1337-.LBB1337
 	.byte	0x1
 	.2byte	0x3d2
-	.4byte	0x13db5
+	.4byte	0x13ed7
 	.uleb128 0x54
-	.4byte	0x12f7a
+	.4byte	0x13046
 	.uleb128 0x54
-	.4byte	0x12f6f
+	.4byte	0x1303b
 	.uleb128 0x54
-	.4byte	0x12f64
+	.4byte	0x13030
 	.uleb128 0x56
-	.8byte	.LBB1326
-	.8byte	.LBE1326-.LBB1326
+	.8byte	.LBB1338
+	.8byte	.LBE1338-.LBB1338
 	.uleb128 0x57
-	.4byte	0x12f85
-	.uleb128 0x5f
-	.4byte	0x12f90
+	.4byte	0x13051
+	.uleb128 0x60
+	.4byte	0x1305c
 	.4byte	.LLST130
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12f54
-	.8byte	.LBB1327
-	.8byte	.LBE1327-.LBB1327
+	.4byte	0x13020
+	.8byte	.LBB1339
+	.8byte	.LBE1339-.LBB1339
 	.byte	0x1
 	.2byte	0x3d3
-	.4byte	0x13e01
+	.4byte	0x13f23
 	.uleb128 0x54
-	.4byte	0x12f7a
+	.4byte	0x13046
 	.uleb128 0x54
-	.4byte	0x12f6f
+	.4byte	0x1303b
 	.uleb128 0x54
-	.4byte	0x12f64
+	.4byte	0x13030
 	.uleb128 0x56
-	.8byte	.LBB1328
-	.8byte	.LBE1328-.LBB1328
+	.8byte	.LBB1340
+	.8byte	.LBE1340-.LBB1340
 	.uleb128 0x57
-	.4byte	0x12f85
-	.uleb128 0x5f
-	.4byte	0x12f90
+	.4byte	0x13051
+	.uleb128 0x60
+	.4byte	0x1305c
 	.4byte	.LLST131
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
-	.4byte	0x12f54
-	.8byte	.LBB1329
-	.8byte	.LBE1329-.LBB1329
+	.uleb128 0x5d
+	.4byte	0x13020
+	.8byte	.LBB1341
+	.8byte	.LBE1341-.LBB1341
 	.byte	0x1
 	.2byte	0x3d4
 	.uleb128 0x54
-	.4byte	0x12f7a
+	.4byte	0x13046
 	.uleb128 0x54
-	.4byte	0x12f6f
+	.4byte	0x1303b
 	.uleb128 0x54
-	.4byte	0x12f64
+	.4byte	0x13030
 	.uleb128 0x56
-	.8byte	.LBB1330
-	.8byte	.LBE1330-.LBB1330
+	.8byte	.LBB1342
+	.8byte	.LBE1342-.LBB1342
 	.uleb128 0x57
-	.4byte	0x12f85
-	.uleb128 0x5f
-	.4byte	0x12f90
+	.4byte	0x13051
+	.uleb128 0x60
+	.4byte	0x1305c
 	.4byte	.LLST132
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
-	.4byte	0x1264c
-	.8byte	.LBB1334
-	.8byte	.LBE1334-.LBB1334
+	.uleb128 0x5d
+	.4byte	0x12718
+	.8byte	.LBB1346
+	.8byte	.LBE1346-.LBB1346
 	.byte	0x1
 	.2byte	0x3e6
 	.uleb128 0x54
-	.4byte	0x1267d
+	.4byte	0x12749
 	.uleb128 0x54
-	.4byte	0x1267d
+	.4byte	0x12749
 	.uleb128 0x54
-	.4byte	0x1267d
+	.4byte	0x12749
 	.uleb128 0x54
-	.4byte	0x12671
+	.4byte	0x1273d
 	.uleb128 0x54
-	.4byte	0x12665
+	.4byte	0x12731
 	.uleb128 0x54
-	.4byte	0x12659
+	.4byte	0x12725
 	.uleb128 0x56
-	.8byte	.LBB1335
-	.8byte	.LBE1335-.LBB1335
+	.8byte	.LBB1347
+	.8byte	.LBE1347-.LBB1347
 	.uleb128 0x57
-	.4byte	0x12689
+	.4byte	0x12755
 	.uleb128 0x57
-	.4byte	0x12695
+	.4byte	0x12761
 	.uleb128 0x57
-	.4byte	0x126a1
-	.uleb128 0x60
-	.4byte	0x126ad
+	.4byte	0x1276d
+	.uleb128 0x61
+	.4byte	0x12779
 	.uleb128 0x1
 	.byte	0x51
-	.uleb128 0x60
-	.4byte	0x126b9
+	.uleb128 0x61
+	.4byte	0x12785
 	.uleb128 0x1
 	.byte	0x52
-	.uleb128 0x5f
-	.4byte	0x126c5
+	.uleb128 0x60
+	.4byte	0x12791
 	.4byte	.LLST133
-	.uleb128 0x5f
-	.4byte	0x126d1
+	.uleb128 0x60
+	.4byte	0x1279d
 	.4byte	.LLST134
-	.uleb128 0x5f
-	.4byte	0x126dd
+	.uleb128 0x60
+	.4byte	0x127a9
 	.4byte	.LLST135
-	.uleb128 0x5f
-	.4byte	0x126e9
+	.uleb128 0x60
+	.4byte	0x127b5
 	.4byte	.LLST136
 	.uleb128 0x57
-	.4byte	0x126f3
-	.uleb128 0x5f
-	.4byte	0x126fd
+	.4byte	0x127bf
+	.uleb128 0x60
+	.4byte	0x127c9
 	.4byte	.LLST137
-	.uleb128 0x5f
-	.4byte	0x12709
+	.uleb128 0x60
+	.4byte	0x127d5
 	.4byte	.LLST138
 	.uleb128 0x57
-	.4byte	0x12715
-	.uleb128 0x5a
-	.4byte	0x12f54
-	.8byte	.LBB1336
+	.4byte	0x127e1
+	.uleb128 0x5b
+	.4byte	0x13020
+	.8byte	.LBB1348
 	.4byte	.Ldebug_ranges0+0x9a0
 	.byte	0x1
 	.2byte	0x3aa
-	.4byte	0x13f2c
+	.4byte	0x1404e
 	.uleb128 0x54
-	.4byte	0x12f7a
+	.4byte	0x13046
 	.uleb128 0x54
-	.4byte	0x12f6f
+	.4byte	0x1303b
 	.uleb128 0x54
-	.4byte	0x12f64
-	.uleb128 0x5d
+	.4byte	0x13030
+	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0x9a0
 	.uleb128 0x57
-	.4byte	0x12f85
-	.uleb128 0x5f
-	.4byte	0x12f90
+	.4byte	0x13051
+	.uleb128 0x60
+	.4byte	0x1305c
 	.4byte	.LLST139
 	.byte	0
 	.byte	0
-	.uleb128 0x5e
-	.4byte	0x12f54
-	.8byte	.LBB1343
+	.uleb128 0x5f
+	.4byte	0x13020
+	.8byte	.LBB1355
 	.4byte	.Ldebug_ranges0+0xa10
 	.byte	0x1
 	.2byte	0x3a9
 	.uleb128 0x54
-	.4byte	0x12f7a
+	.4byte	0x13046
 	.uleb128 0x54
-	.4byte	0x12f6f
+	.4byte	0x1303b
 	.uleb128 0x54
-	.4byte	0x12f64
-	.uleb128 0x5d
+	.4byte	0x13030
+	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xa10
 	.uleb128 0x57
-	.4byte	0x12f85
-	.uleb128 0x5f
-	.4byte	0x12f90
+	.4byte	0x13051
+	.uleb128 0x60
+	.4byte	0x1305c
 	.4byte	.LLST140
 	.byte	0
 	.byte	0
@@ -46232,493 +46300,503 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12500
+	.4byte	0x125cc
 	.8byte	.LFB2861
 	.8byte	.LFE2861-.LFB2861
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1406a
+	.4byte	0x1418c
 	.uleb128 0x6f
-	.4byte	0x1250d
+	.4byte	0x125d9
 	.4byte	.LLST141
 	.uleb128 0x54
-	.4byte	0x12519
+	.4byte	0x125e5
 	.uleb128 0x57
-	.4byte	0x12525
-	.uleb128 0x5a
-	.4byte	0x130a2
-	.8byte	.LBB1359
+	.4byte	0x125f1
+	.uleb128 0x5b
+	.4byte	0x1316e
+	.8byte	.LBB1371
 	.4byte	.Ldebug_ranges0+0xa70
 	.byte	0x1
 	.2byte	0x3ed
-	.4byte	0x13fe8
+	.4byte	0x1410a
 	.uleb128 0x54
-	.4byte	0x130d3
+	.4byte	0x1319f
 	.uleb128 0x54
-	.4byte	0x130c7
+	.4byte	0x13193
 	.uleb128 0x54
-	.4byte	0x130bb
+	.4byte	0x13187
 	.uleb128 0x54
-	.4byte	0x130af
-	.uleb128 0x5d
+	.4byte	0x1317b
+	.uleb128 0x5e
 	.4byte	.Ldebug_ranges0+0xa70
 	.uleb128 0x57
-	.4byte	0x130df
-	.uleb128 0x5e
-	.4byte	0x130ec
-	.8byte	.LBB1361
+	.4byte	0x131ab
+	.uleb128 0x5f
+	.4byte	0x131b8
+	.8byte	.LBB1373
 	.4byte	.Ldebug_ranges0+0xac0
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x54
-	.4byte	0x130fd
+	.4byte	0x131c9
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x1301f
-	.8byte	.LBB1370
+	.uleb128 0x5b
+	.4byte	0x130eb
+	.8byte	.LBB1382
 	.4byte	.Ldebug_ranges0+0xaf0
 	.byte	0x1
 	.2byte	0x3ee
-	.4byte	0x1401a
+	.4byte	0x1413c
 	.uleb128 0x54
-	.4byte	0x13057
+	.4byte	0x13123
 	.uleb128 0x54
-	.4byte	0x1304c
+	.4byte	0x13118
 	.uleb128 0x54
-	.4byte	0x13041
+	.4byte	0x1310d
 	.uleb128 0x54
-	.4byte	0x13036
+	.4byte	0x13102
 	.uleb128 0x54
-	.4byte	0x1302b
+	.4byte	0x130f7
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12ff1
-	.8byte	.LBB1376
-	.8byte	.LBE1376-.LBB1376
+	.4byte	0x130bd
+	.8byte	.LBB1388
+	.8byte	.LBE1388-.LBB1388
 	.byte	0x1
 	.2byte	0x3ef
-	.4byte	0x14046
+	.4byte	0x14168
 	.uleb128 0x54
-	.4byte	0x13013
+	.4byte	0x130df
 	.uleb128 0x54
-	.4byte	0x13008
+	.4byte	0x130d4
 	.uleb128 0x54
-	.4byte	0x12ffd
+	.4byte	0x130c9
 	.byte	0
-	.uleb128 0x5c
-	.4byte	0x12fce
-	.8byte	.LBB1378
-	.8byte	.LBE1378-.LBB1378
+	.uleb128 0x5d
+	.4byte	0x1309a
+	.8byte	.LBB1390
+	.8byte	.LBE1390-.LBB1390
 	.byte	0x1
 	.2byte	0x3f0
 	.uleb128 0x54
-	.4byte	0x12fe5
+	.4byte	0x130b1
 	.uleb128 0x54
-	.4byte	0x12fda
+	.4byte	0x130a6
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12f22
+	.4byte	0x12fee
 	.8byte	.LFB2862
 	.8byte	.LFE2862-.LFB2862
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14128
+	.4byte	0x1424a
 	.uleb128 0x6f
-	.4byte	0x12f32
+	.4byte	0x12ffe
 	.4byte	.LLST144
 	.uleb128 0x6f
-	.4byte	0x12f3d
+	.4byte	0x13009
 	.4byte	.LLST145
 	.uleb128 0x57
-	.4byte	0x12f48
+	.4byte	0x13014
 	.uleb128 0x70
-	.4byte	0x13063
-	.8byte	.LBB1406
-	.8byte	.LBE1406-.LBB1406
+	.4byte	0x1312f
+	.8byte	.LBB1418
+	.8byte	.LBE1418-.LBB1418
 	.byte	0x1
 	.byte	0xc6
-	.4byte	0x140be
+	.4byte	0x141e0
 	.uleb128 0x54
-	.4byte	0x1306f
+	.4byte	0x1313b
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x131ec
-	.8byte	.LBB1408
-	.8byte	.LBE1408-.LBB1408
+	.4byte	0x132b8
+	.8byte	.LBB1420
+	.8byte	.LBE1420-.LBB1420
 	.byte	0x1
 	.byte	0xc7
-	.4byte	0x140df
+	.4byte	0x14201
 	.uleb128 0x54
-	.4byte	0x131f8
+	.4byte	0x132c4
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x1321c
-	.8byte	.LBB1410
-	.8byte	.LBE1410-.LBB1410
+	.4byte	0x132e8
+	.8byte	.LBB1422
+	.8byte	.LBE1422-.LBB1422
 	.byte	0x1
 	.byte	0xca
-	.4byte	0x1410d
+	.4byte	0x1422f
 	.uleb128 0x54
-	.4byte	0x13228
+	.4byte	0x132f4
 	.uleb128 0x4e
 	.8byte	.LVL509
-	.4byte	0x14456
+	.4byte	0x14592
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL506
-	.4byte	0x141f2
+	.4byte	0x14314
 	.uleb128 0x4e
 	.8byte	.LVL510
-	.4byte	0x141f2
+	.4byte	0x14314
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12f22
+	.4byte	0x12fee
 	.8byte	.LFB2866
 	.8byte	.LFE2866-.LFB2866
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x141da
+	.4byte	0x142fc
 	.uleb128 0x6f
-	.4byte	0x12f32
-	.4byte	.LLST169
+	.4byte	0x12ffe
+	.4byte	.LLST172
 	.uleb128 0x57
-	.4byte	0x12f48
+	.4byte	0x13014
 	.uleb128 0x54
-	.4byte	0x12f3d
+	.4byte	0x13009
 	.uleb128 0x70
-	.4byte	0x13204
-	.8byte	.LBB1770
-	.8byte	.LBE1770-.LBB1770
+	.4byte	0x132d0
+	.8byte	.LBB1763
+	.8byte	.LBE1763-.LBB1763
 	.byte	0x1
 	.byte	0xbf
-	.4byte	0x14178
+	.4byte	0x1429a
 	.uleb128 0x54
-	.4byte	0x13210
+	.4byte	0x132dc
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x1307b
-	.8byte	.LBB1772
-	.8byte	.LBE1772-.LBB1772
+	.4byte	0x13147
+	.8byte	.LBB1765
+	.8byte	.LBE1765-.LBB1765
 	.byte	0x1
 	.byte	0xc0
-	.4byte	0x1419e
+	.4byte	0x142c0
 	.uleb128 0x54
-	.4byte	0x13096
+	.4byte	0x13162
 	.uleb128 0x54
-	.4byte	0x1308b
+	.4byte	0x13157
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x1323a
-	.8byte	.LBB1774
-	.8byte	.LBE1774-.LBB1774
+	.4byte	0x13306
+	.8byte	.LBB1767
+	.8byte	.LBE1767-.LBB1767
 	.byte	0x1
 	.byte	0xbc
-	.4byte	0x141cc
+	.4byte	0x142ee
 	.uleb128 0x54
-	.4byte	0x13246
+	.4byte	0x13312
 	.uleb128 0x4e
-	.8byte	.LVL699
-	.4byte	0x144cd
+	.8byte	.LVL708
+	.4byte	0x14609
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL696
-	.4byte	0x141f2
+	.8byte	.LVL705
+	.4byte	0x14314
 	.byte	0
 	.uleb128 0x84
-	.4byte	.LASF3226
-	.4byte	.LASF3226
+	.4byte	.LASF3230
+	.4byte	.LASF3230
 	.byte	0xbe
 	.byte	0xcc
 	.uleb128 0x84
-	.4byte	.LASF3227
-	.4byte	.LASF3227
+	.4byte	.LASF3231
+	.4byte	.LASF3231
 	.byte	0xbe
 	.byte	0xca
 	.uleb128 0x85
-	.4byte	.LASF3228
-	.4byte	.LASF3228
+	.4byte	.LASF3232
+	.4byte	.LASF3232
 	.byte	0x2
 	.2byte	0x5d1
 	.uleb128 0x84
-	.4byte	.LASF3229
-	.4byte	.LASF3229
+	.4byte	.LASF3233
+	.4byte	.LASF3233
 	.byte	0xac
 	.byte	0x4f
 	.uleb128 0x85
-	.4byte	.LASF3230
-	.4byte	.LASF3230
+	.4byte	.LASF3234
+	.4byte	.LASF3234
 	.byte	0x2
 	.2byte	0x2bf
 	.uleb128 0x85
-	.4byte	.LASF3231
-	.4byte	.LASF3231
+	.4byte	.LASF3235
+	.4byte	.LASF3235
 	.byte	0xe
 	.2byte	0x149
 	.uleb128 0x85
-	.4byte	.LASF3232
-	.4byte	.LASF3232
+	.4byte	.LASF3236
+	.4byte	.LASF3236
 	.byte	0xe
 	.2byte	0x172
 	.uleb128 0x84
-	.4byte	.LASF3233
-	.4byte	.LASF3233
-	.byte	0xd2
+	.4byte	.LASF3237
+	.4byte	.LASF3237
+	.byte	0xd4
 	.byte	0x78
 	.uleb128 0x84
-	.4byte	.LASF3234
-	.4byte	.LASF3234
+	.4byte	.LASF3238
+	.4byte	.LASF3238
 	.byte	0xaa
 	.byte	0x59
 	.uleb128 0x84
-	.4byte	.LASF3235
-	.4byte	.LASF3235
+	.4byte	.LASF3239
+	.4byte	.LASF3239
 	.byte	0xc3
 	.byte	0x30
 	.uleb128 0x86
-	.4byte	.LASF3236
-	.4byte	.LASF3236
+	.4byte	.LASF3240
+	.4byte	.LASF3240
 	.uleb128 0x84
-	.4byte	.LASF3236
-	.4byte	.LASF3236
-	.byte	0xd3
+	.4byte	.LASF3240
+	.4byte	.LASF3240
+	.byte	0xd5
 	.byte	0x36
 	.uleb128 0x85
-	.4byte	.LASF3237
-	.4byte	.LASF3237
+	.4byte	.LASF3241
+	.4byte	.LASF3241
 	.byte	0x2
 	.2byte	0x5cb
 	.uleb128 0x84
-	.4byte	.LASF3238
-	.4byte	.LASF3238
+	.4byte	.LASF3242
+	.4byte	.LASF3242
 	.byte	0xc2
 	.byte	0x30
 	.uleb128 0x84
-	.4byte	.LASF3239
-	.4byte	.LASF3239
+	.4byte	.LASF3243
+	.4byte	.LASF3243
 	.byte	0xc2
 	.byte	0x31
 	.uleb128 0x84
-	.4byte	.LASF3240
-	.4byte	.LASF3240
+	.4byte	.LASF3244
+	.4byte	.LASF3244
 	.byte	0xab
 	.byte	0x9
 	.uleb128 0x85
-	.4byte	.LASF3241
-	.4byte	.LASF3241
+	.4byte	.LASF3245
+	.4byte	.LASF3245
 	.byte	0x48
 	.2byte	0x6b8
 	.uleb128 0x85
-	.4byte	.LASF3242
-	.4byte	.LASF3242
+	.4byte	.LASF3246
+	.4byte	.LASF3246
 	.byte	0x48
 	.2byte	0x676
 	.uleb128 0x84
-	.4byte	.LASF3243
-	.4byte	.LASF3243
+	.4byte	.LASF3247
+	.4byte	.LASF3247
 	.byte	0x9c
 	.byte	0x67
 	.uleb128 0x84
-	.4byte	.LASF3244
-	.4byte	.LASF3244
+	.4byte	.LASF3248
+	.4byte	.LASF3248
 	.byte	0x54
 	.byte	0x53
 	.uleb128 0x84
-	.4byte	.LASF3245
-	.4byte	.LASF3245
+	.4byte	.LASF3249
+	.4byte	.LASF3249
 	.byte	0x54
 	.byte	0xa5
 	.uleb128 0x84
-	.4byte	.LASF3246
-	.4byte	.LASF3246
+	.4byte	.LASF3250
+	.4byte	.LASF3250
 	.byte	0xc3
 	.byte	0x2b
 	.uleb128 0x84
-	.4byte	.LASF3247
-	.4byte	.LASF3247
+	.4byte	.LASF3251
+	.4byte	.LASF3251
 	.byte	0xc3
 	.byte	0x27
 	.uleb128 0x85
-	.4byte	.LASF3248
-	.4byte	.LASF3248
+	.4byte	.LASF3252
+	.4byte	.LASF3252
 	.byte	0x12
 	.2byte	0x184
 	.uleb128 0x84
-	.4byte	.LASF3249
-	.4byte	.LASF3249
-	.byte	0xd4
+	.4byte	.LASF3253
+	.4byte	.LASF3253
+	.byte	0xd6
 	.byte	0x51
 	.uleb128 0x85
-	.4byte	.LASF3250
-	.4byte	.LASF3250
+	.4byte	.LASF3254
+	.4byte	.LASF3254
 	.byte	0x20
 	.2byte	0x1d9
 	.uleb128 0x84
-	.4byte	.LASF3251
-	.4byte	.LASF3251
+	.4byte	.LASF3255
+	.4byte	.LASF3255
 	.byte	0x3
 	.byte	0x3b
 	.uleb128 0x84
-	.4byte	.LASF3252
-	.4byte	.LASF3252
+	.4byte	.LASF3256
+	.4byte	.LASF3256
 	.byte	0x12
 	.byte	0xb9
-	.uleb128 0x86
-	.4byte	.LASF3253
-	.4byte	.LASF3253
 	.uleb128 0x84
-	.4byte	.LASF3254
-	.4byte	.LASF3254
+	.4byte	.LASF3257
+	.4byte	.LASF3257
 	.byte	0x3a
 	.byte	0xc2
+	.uleb128 0x86
+	.4byte	.LASF3258
+	.4byte	.LASF3258
 	.uleb128 0x84
-	.4byte	.LASF3255
-	.4byte	.LASF3255
+	.4byte	.LASF3259
+	.4byte	.LASF3259
 	.byte	0xac
 	.byte	0x4e
 	.uleb128 0x85
-	.4byte	.LASF3256
-	.4byte	.LASF3256
+	.4byte	.LASF3260
+	.4byte	.LASF3260
 	.byte	0x2
 	.2byte	0x287
 	.uleb128 0x84
-	.4byte	.LASF3257
-	.4byte	.LASF3257
+	.4byte	.LASF3261
+	.4byte	.LASF3261
 	.byte	0xbf
 	.byte	0x38
 	.uleb128 0x85
-	.4byte	.LASF3258
-	.4byte	.LASF3258
+	.4byte	.LASF3262
+	.4byte	.LASF3262
+	.byte	0xe
+	.2byte	0x165
+	.uleb128 0x85
+	.4byte	.LASF3263
+	.4byte	.LASF3263
 	.byte	0xa3
 	.2byte	0x37b
+	.uleb128 0x85
+	.4byte	.LASF3264
+	.4byte	.LASF3264
+	.byte	0xe
+	.2byte	0x125
 	.uleb128 0x86
-	.4byte	.LASF3259
-	.4byte	.LASF3259
+	.4byte	.LASF3265
+	.4byte	.LASF3265
 	.uleb128 0x84
-	.4byte	.LASF3260
-	.4byte	.LASF3260
+	.4byte	.LASF3266
+	.4byte	.LASF3266
 	.byte	0xc3
 	.byte	0x2e
 	.uleb128 0x85
-	.4byte	.LASF3261
-	.4byte	.LASF3261
+	.4byte	.LASF3267
+	.4byte	.LASF3267
 	.byte	0x20
 	.2byte	0x1c7
 	.uleb128 0x85
-	.4byte	.LASF3262
-	.4byte	.LASF3262
+	.4byte	.LASF3268
+	.4byte	.LASF3268
 	.byte	0x20
 	.2byte	0x17e
 	.uleb128 0x84
-	.4byte	.LASF3263
-	.4byte	.LASF3263
+	.4byte	.LASF3269
+	.4byte	.LASF3269
 	.byte	0x3
 	.byte	0x3a
 	.uleb128 0x84
-	.4byte	.LASF3264
-	.4byte	.LASF3264
+	.4byte	.LASF3270
+	.4byte	.LASF3270
 	.byte	0xc2
 	.byte	0x32
 	.uleb128 0x84
-	.4byte	.LASF3265
-	.4byte	.LASF3265
+	.4byte	.LASF3271
+	.4byte	.LASF3271
 	.byte	0xc3
 	.byte	0x2c
 	.uleb128 0x85
-	.4byte	.LASF3266
-	.4byte	.LASF3266
+	.4byte	.LASF3272
+	.4byte	.LASF3272
 	.byte	0x76
 	.2byte	0xa07
 	.uleb128 0x84
-	.4byte	.LASF3267
-	.4byte	.LASF3267
+	.4byte	.LASF3273
+	.4byte	.LASF3273
 	.byte	0x48
 	.byte	0xdc
 	.uleb128 0x85
-	.4byte	.LASF3268
-	.4byte	.LASF3268
+	.4byte	.LASF3274
+	.4byte	.LASF3274
 	.byte	0x3a
 	.2byte	0x459
 	.uleb128 0x84
-	.4byte	.LASF3269
-	.4byte	.LASF3269
+	.4byte	.LASF3275
+	.4byte	.LASF3275
 	.byte	0x3a
 	.byte	0xe9
 	.uleb128 0x85
-	.4byte	.LASF3270
-	.4byte	.LASF3270
+	.4byte	.LASF3276
+	.4byte	.LASF3276
 	.byte	0x3a
 	.2byte	0x45a
 	.uleb128 0x85
-	.4byte	.LASF3271
-	.4byte	.LASF3271
+	.4byte	.LASF3277
+	.4byte	.LASF3277
 	.byte	0x6
 	.2byte	0x19f
 	.uleb128 0x85
-	.4byte	.LASF3272
-	.4byte	.LASF3272
+	.4byte	.LASF3278
+	.4byte	.LASF3278
 	.byte	0x6
 	.2byte	0x199
 	.uleb128 0x84
-	.4byte	.LASF3273
-	.4byte	.LASF3273
+	.4byte	.LASF3279
+	.4byte	.LASF3279
 	.byte	0xc3
 	.byte	0x25
 	.uleb128 0x84
-	.4byte	.LASF3274
-	.4byte	.LASF3274
+	.4byte	.LASF3280
+	.4byte	.LASF3280
 	.byte	0xc3
 	.byte	0x2a
 	.uleb128 0x84
-	.4byte	.LASF3275
-	.4byte	.LASF3275
+	.4byte	.LASF3281
+	.4byte	.LASF3281
 	.byte	0xc3
 	.byte	0x24
 	.uleb128 0x84
-	.4byte	.LASF3276
-	.4byte	.LASF3276
+	.4byte	.LASF3282
+	.4byte	.LASF3282
 	.byte	0xc3
 	.byte	0x23
 	.uleb128 0x84
-	.4byte	.LASF3277
-	.4byte	.LASF3277
+	.4byte	.LASF3283
+	.4byte	.LASF3283
 	.byte	0x9c
 	.byte	0x73
 	.uleb128 0x84
-	.4byte	.LASF3278
-	.4byte	.LASF3278
+	.4byte	.LASF3284
+	.4byte	.LASF3284
 	.byte	0xc3
 	.byte	0x29
 	.uleb128 0x84
-	.4byte	.LASF3279
-	.4byte	.LASF3279
-	.byte	0xc3
-	.byte	0x26
-	.uleb128 0x84
-	.4byte	.LASF3280
-	.4byte	.LASF3280
+	.4byte	.LASF3285
+	.4byte	.LASF3285
 	.byte	0x72
 	.byte	0x88
 	.uleb128 0x84
-	.4byte	.LASF3281
-	.4byte	.LASF3281
+	.4byte	.LASF3286
+	.4byte	.LASF3286
 	.byte	0x72
 	.byte	0x98
 	.uleb128 0x84
-	.4byte	.LASF3282
-	.4byte	.LASF3282
+	.4byte	.LASF3287
+	.4byte	.LASF3287
+	.byte	0xc3
+	.byte	0x26
+	.uleb128 0x84
+	.4byte	.LASF3288
+	.4byte	.LASF3288
 	.byte	0xc4
 	.byte	0x68
 	.uleb128 0x84
-	.4byte	.LASF3283
-	.4byte	.LASF3283
+	.4byte	.LASF3289
+	.4byte	.LASF3289
 	.byte	0xc2
 	.byte	0x33
 	.uleb128 0x85
-	.4byte	.LASF3284
-	.4byte	.LASF3284
+	.4byte	.LASF3290
+	.4byte	.LASF3290
 	.byte	0xd
 	.2byte	0x1d6
 	.uleb128 0x87
@@ -46727,13 +46805,13 @@ __exitcall_ebc_exit:
 	.byte	0x78
 	.byte	0x2c
 	.uleb128 0x84
-	.4byte	.LASF3285
-	.4byte	.LASF3285
+	.4byte	.LASF3291
+	.4byte	.LASF3291
 	.byte	0x78
 	.byte	0x27
 	.uleb128 0x84
-	.4byte	.LASF3286
-	.4byte	.LASF3286
+	.4byte	.LASF3292
+	.4byte	.LASF3292
 	.byte	0x9c
 	.byte	0x71
 	.byte	0
@@ -47895,6 +47973,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x5b
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -47911,7 +48004,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
+	.uleb128 0x5c
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -47926,7 +48019,7 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
+	.uleb128 0x5d
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -47941,14 +48034,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x5
 	.byte	0
 	.byte	0
-	.uleb128 0x5d
+	.uleb128 0x5e
 	.uleb128 0xb
 	.byte	0x1
 	.uleb128 0x55
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -47963,7 +48056,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x5
 	.byte	0
 	.byte	0
-	.uleb128 0x5f
+	.uleb128 0x60
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x31
@@ -47972,7 +48065,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x60
+	.uleb128 0x61
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x31
@@ -47981,7 +48074,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x18
 	.byte	0
 	.byte	0
-	.uleb128 0x61
+	.uleb128 0x62
 	.uleb128 0xb
 	.byte	0x1
 	.uleb128 0x55
@@ -47990,7 +48083,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x62
+	.uleb128 0x63
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -48009,7 +48102,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x63
+	.uleb128 0x64
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -48022,7 +48115,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x64
+	.uleb128 0x65
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -48035,7 +48128,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x65
+	.uleb128 0x66
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -48052,12 +48145,12 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x66
+	.uleb128 0x67
 	.uleb128 0xb
 	.byte	0x1
 	.byte	0
 	.byte	0
-	.uleb128 0x67
+	.uleb128 0x68
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -48070,21 +48163,6 @@ __exitcall_ebc_exit:
 	.uleb128 0xe
 	.byte	0
 	.byte	0
-	.uleb128 0x68
-	.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 0x69
 	.uleb128 0x34
 	.byte	0
@@ -48576,427 +48654,525 @@ __exitcall_ebc_exit:
 	.8byte	.LVL523
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL564
-	.8byte	.LVL565
+	.8byte	.LVL534
+	.8byte	.LVL535
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL664
-	.8byte	.LVL665
+	.8byte	.LVL667
+	.8byte	.LVL668
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST149:
-	.8byte	.LVL525
-	.8byte	.LVL526
+	.8byte	.LVL530
+	.8byte	.LVL531
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL678
-	.8byte	.LVL679
+	.8byte	.LVL582
+	.8byte	.LVL583
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST150:
-	.8byte	.LVL527
-	.8byte	.LVL566
+	.8byte	.LVL534
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL543
+	.8byte	.LVL582
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL587
+	.8byte	.LVL667
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL668
+	.8byte	.LVL674
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL677
+	.8byte	.LVL686
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL688
+	.8byte	.LFE2848
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST151:
+	.8byte	.LVL525
+	.8byte	.LVL537
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL569
-	.8byte	.LVL664
+	.8byte	.LVL541
+	.8byte	.LVL544
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL665
-	.8byte	.LVL671
+	.8byte	.LVL582
+	.8byte	.LVL587
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL675
+	.8byte	.LVL677
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL695
+	.8byte	.LVL696
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST152:
+	.8byte	.LVL525
+	.8byte	.LVL526
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	.LVL526
+	.8byte	.LVL527
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL528
+	.8byte	.LVL532
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	.LVL532
+	.8byte	.LVL585
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL585
+	.8byte	.LVL667
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	.LVL668
+	.8byte	.LVL674
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	.LVL675
+	.8byte	.LVL686
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	.LVL688
+	.8byte	.LFE2848
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	0
+	.8byte	0
+.LLST153:
+	.8byte	.LVL529
+	.8byte	.LVL536
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL672
-	.8byte	.LVL673
+	.byte	0x63
+	.8byte	.LVL541
+	.8byte	.LVL543
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL677
-	.8byte	.LVL678
+	.byte	0x63
+	.8byte	.LVL582
+	.8byte	.LVL587
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL681
-	.8byte	.LFE2848
+	.byte	0x63
+	.8byte	.LVL695
+	.8byte	.LVL696
 	.2byte	0x1
-	.byte	0x65
+	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST151:
-	.8byte	.LVL548
-	.8byte	.LVL559
+.LLST154:
+	.8byte	.LVL534
+	.8byte	.LVL539
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL564
-	.8byte	.LVL567
+	.8byte	.LVL565
+	.8byte	.LVL576
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL569
-	.8byte	.LVL572
+	.8byte	.LVL587
+	.8byte	.LVL590
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL654
-	.8byte	.LVL655
+	.8byte	.LVL668
+	.8byte	.LVL669
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL672
-	.8byte	.LVL673
+	.8byte	.LVL688
+	.8byte	.LVL689
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL683
-	.8byte	.LVL684
+	.8byte	.LVL695
+	.8byte	.LVL696
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST152:
-	.8byte	.LVL559
-	.8byte	.LVL563
+.LLST155:
+	.8byte	.LVL534
+	.8byte	.LVL539
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL564
-	.8byte	.LVL567
+	.8byte	.LVL576
+	.8byte	.LVL580
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL577
-	.8byte	.LVL578
+	.8byte	.LVL590
+	.8byte	.LVL591
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL677
-	.8byte	.LVL678
+	.8byte	.LVL689
+	.8byte	.LVL690
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL683
-	.8byte	.LVL684
+	.8byte	.LVL695
+	.8byte	.LVL696
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST153:
-	.8byte	.LVL578
-	.8byte	.LVL579-1
+.LLST156:
+	.8byte	.LVL591
+	.8byte	.LVL592-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST154:
-	.8byte	.LVL583
-	.8byte	.LVL586
+.LLST157:
+	.8byte	.LVL596
+	.8byte	.LVL599
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST155:
-	.8byte	.LVL584
-	.8byte	.LVL585
+.LLST158:
+	.8byte	.LVL597
+	.8byte	.LVL598
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST156:
-	.8byte	.LVL564
-	.8byte	.LVL567
+.LLST159:
+	.8byte	.LVL534
+	.8byte	.LVL538
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL588
-	.8byte	.LVL596
+	.byte	0x68
+	.8byte	.LVL601
+	.8byte	.LVL609
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL666
-	.8byte	.LVL668
+	.byte	0x68
+	.8byte	.LVL681
+	.8byte	.LVL683
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL668
-	.8byte	.LVL669
+	.byte	0x68
+	.8byte	.LVL683
+	.8byte	.LVL684
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL669
-	.8byte	.LVL671
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL683
 	.8byte	.LVL684
+	.8byte	.LVL686
 	.2byte	0x1
-	.byte	0x69
+	.byte	0x68
+	.8byte	.LVL695
+	.8byte	.LVL696
+	.2byte	0x1
+	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST157:
-	.8byte	.LVL591
-	.8byte	.LVL594
+.LLST160:
+	.8byte	.LVL604
+	.8byte	.LVL607
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST158:
-	.8byte	.LVL592
-	.8byte	.LVL593
+.LLST161:
+	.8byte	.LVL605
+	.8byte	.LVL606
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST159:
-	.8byte	.LVL595
-	.8byte	.LVL597-1
+.LLST162:
+	.8byte	.LVL608
+	.8byte	.LVL610-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST160:
-	.8byte	.LVL564
-	.8byte	.LVL569
+.LLST163:
+	.8byte	.LVL534
+	.8byte	.LVL541
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL602
-	.8byte	.LVL637
+	.8byte	.LVL615
+	.8byte	.LVL652
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL637
-	.8byte	.LVL638
+	.8byte	.LVL652
+	.8byte	.LVL653
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL641
-	.8byte	.LVL654
+	.8byte	.LVL656
+	.8byte	.LVL667
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL655
-	.8byte	.LVL660
+	.8byte	.LVL669
+	.8byte	.LVL674
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL683
 	.8byte	.LVL690
+	.8byte	.LVL693
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	.LVL695
+	.8byte	.LVL696
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	.LVL698
+	.8byte	.LFE2848
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
 	.8byte	0
 	.8byte	0
-.LLST161:
-	.8byte	.LVL564
-	.8byte	.LVL569
+.LLST164:
+	.8byte	.LVL534
+	.8byte	.LVL541
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL602
-	.8byte	.LVL651
+	.8byte	.LVL615
+	.8byte	.LVL664
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL651
-	.8byte	.LVL652
+	.8byte	.LVL664
+	.8byte	.LVL665
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL655
-	.8byte	.LVL660
+	.8byte	.LVL669
+	.8byte	.LVL674
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL683
+	.8byte	.LVL690
+	.8byte	.LVL693
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -24
+	.8byte	.LVL695
 	.8byte	.LFE2848
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
 	.8byte	0
 	.8byte	0
-.LLST162:
-	.8byte	.LVL564
-	.8byte	.LVL567
+.LLST165:
+	.8byte	.LVL534
+	.8byte	.LVL538
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL608
-	.8byte	.LVL619
+	.byte	0x68
+	.8byte	.LVL621
+	.8byte	.LVL632
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL623
-	.8byte	.LVL633
+	.byte	0x68
+	.8byte	.LVL636
+	.8byte	.LVL646
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL641
-	.8byte	.LVL643
+	.byte	0x68
+	.8byte	.LVL656
+	.8byte	.LVL658
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL648
-	.8byte	.LVL654
+	.byte	0x68
+	.8byte	.LVL661
+	.8byte	.LVL667
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL683
-	.8byte	.LVL687
+	.byte	0x68
+	.8byte	.LVL690
+	.8byte	.LVL693
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL691
-	.8byte	.LFE2848
+	.byte	0x68
+	.8byte	.LVL695
+	.8byte	.LVL696
 	.2byte	0x1
-	.byte	0x69
+	.byte	0x68
+	.8byte	.LVL697
+	.8byte	.LVL698
+	.2byte	0x1
+	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST163:
-	.8byte	.LVL564
-	.8byte	.LVL568
+.LLST166:
+	.8byte	.LVL534
+	.8byte	.LVL540
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL613
-	.8byte	.LVL633
+	.8byte	.LVL626
+	.8byte	.LVL648
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL640
-	.8byte	.LVL654
+	.8byte	.LVL655
+	.8byte	.LVL667
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL655
-	.8byte	.LVL660
+	.8byte	.LVL669
+	.8byte	.LVL674
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL683
-	.8byte	.LVL687
+	.8byte	.LVL690
+	.8byte	.LVL693
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL695
+	.8byte	.LVL696
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST164:
-	.8byte	.LVL564
-	.8byte	.LVL567
+.LLST167:
+	.8byte	.LVL534
+	.8byte	.LVL539
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL604
-	.8byte	.LVL610
+	.8byte	.LVL617
+	.8byte	.LVL623
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL611
-	.8byte	.LVL614
+	.8byte	.LVL624
+	.8byte	.LVL627
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL623
-	.8byte	.LVL641
+	.8byte	.LVL636
+	.8byte	.LVL646
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL683
-	.8byte	.LVL684
+	.8byte	.LVL648
+	.8byte	.LVL656
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL687
+	.8byte	.LVL695
 	.8byte	.LFE2848
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST165:
-	.8byte	.LVL564
-	.8byte	.LVL568
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL606
-	.8byte	.LVL613
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL615
-	.8byte	.LVL640
+.LLST168:
+	.8byte	.LVL534
+	.8byte	.LVL540
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL646
-	.8byte	.LVL648
+	.8byte	.LVL619
+	.8byte	.LVL626
 	.2byte	0x1
 	.byte	0x6c
+	.8byte	.LVL628
 	.8byte	.LVL655
-	.8byte	.LVL660
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL683
-	.8byte	.LVL684
+	.8byte	.LVL669
+	.8byte	.LVL674
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL687
+	.8byte	.LVL695
 	.8byte	.LFE2848
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST166:
-	.8byte	.LVL564
-	.8byte	.LVL568
+.LLST169:
+	.8byte	.LVL534
+	.8byte	.LVL540
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL609
-	.8byte	.LVL633
+	.8byte	.LVL622
+	.8byte	.LVL648
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL636
-	.8byte	.LVL654
+	.8byte	.LVL651
+	.8byte	.LVL667
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL655
-	.8byte	.LVL660
+	.8byte	.LVL669
+	.8byte	.LVL674
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL683
-	.8byte	.LVL687
+	.8byte	.LVL690
+	.8byte	.LVL693
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL687
-	.8byte	.LVL688
+	.8byte	.LVL695
+	.8byte	.LVL698
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL698
+	.8byte	.LVL699
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL688
+	.8byte	.LVL699
 	.8byte	.LFE2848
 	.2byte	0x1
 	.byte	0x6b
 	.8byte	0
 	.8byte	0
-.LLST167:
-	.8byte	.LVL564
-	.8byte	.LVL567
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL610
-	.8byte	.LVL633
+.LLST170:
+	.8byte	.LVL534
+	.8byte	.LVL539
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL641
-	.8byte	.LVL654
+	.8byte	.LVL623
+	.8byte	.LVL648
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL655
-	.8byte	.LVL660
+	.8byte	.LVL656
+	.8byte	.LVL667
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL683
-	.8byte	.LVL684
+	.8byte	.LVL669
+	.8byte	.LVL674
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL684
-	.8byte	.LVL685
+	.8byte	.LVL690
+	.8byte	.LVL691
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL685
-	.8byte	.LVL687
+	.8byte	.LVL691
+	.8byte	.LVL693
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL695
+	.8byte	.LVL696
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST168:
-	.8byte	.LVL564
-	.8byte	.LVL567
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL619
-	.8byte	.LVL633
+.LLST171:
+	.8byte	.LVL534
+	.8byte	.LVL538
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL646
+	.byte	0x68
+	.8byte	.LVL632
 	.8byte	.LVL648
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL655
-	.8byte	.LVL657
+	.byte	0x68
+	.8byte	.LVL669
+	.8byte	.LVL671
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL683
-	.8byte	.LVL684
+	.byte	0x68
+	.8byte	.LVL695
+	.8byte	.LVL696
 	.2byte	0x1
-	.byte	0x69
+	.byte	0x68
 	.8byte	0
 	.8byte	0
 .LLST75:
@@ -49977,506 +50153,498 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST183:
-	.8byte	.LVL745
-	.8byte	.LVL747
+.LLST186:
+	.8byte	.LVL754
+	.8byte	.LVL756
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST184:
-	.8byte	.LVL746
-	.8byte	.LVL754
+.LLST187:
+	.8byte	.LVL755
+	.8byte	.LVL771
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL758
+	.8byte	.LVL775
 	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST185:
-	.8byte	.LVL749
-	.8byte	.LVL757
+.LLST188:
+	.8byte	.LVL758
+	.8byte	.LVL774
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL758
-	.8byte	.LVL759
+	.8byte	.LVL775
+	.8byte	.LVL776
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL759
-	.8byte	.LVL769
+	.8byte	.LVL776
+	.8byte	.LVL787
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL769
-	.8byte	.LVL790
+	.8byte	.LVL787
+	.8byte	.LVL788
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL790
-	.8byte	.LVL804
+	.8byte	.LVL788
+	.8byte	.LVL793
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL804
-	.8byte	.LVL805
+	.8byte	.LVL793
+	.8byte	.LVL794
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL805
-	.8byte	.LVL854
+	.8byte	.LVL794
+	.8byte	.LVL815
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL854
-	.8byte	.LVL855
+	.8byte	.LVL815
+	.8byte	.LVL816
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL855
+	.8byte	.LVL816
+	.8byte	.LVL880
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL880
+	.8byte	.LVL881
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL881
 	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST186:
-	.8byte	.LVL791
-	.8byte	.LVL792-1
-	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL793
-	.8byte	.LVL794-1
+.LLST189:
+	.8byte	.LVL795
+	.8byte	.LVL796-1
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL840
-	.8byte	.LVL841-1
+	.8byte	.LVL805
+	.8byte	.LVL806-1
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL866
-	.8byte	.LVL867
+	.8byte	.LVL850
+	.8byte	.LVL851-1
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST187:
-	.8byte	.LVL748
-	.8byte	.LVL755
+.LLST190:
+	.8byte	.LVL757
+	.8byte	.LVL772
 	.2byte	0x1
 	.byte	0x67
-	.8byte	.LVL758
+	.8byte	.LVL775
 	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x67
 	.8byte	0
 	.8byte	0
-.LLST188:
-	.8byte	.LVL749
-	.8byte	.LVL756
+.LLST191:
+	.8byte	.LVL758
+	.8byte	.LVL773
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL758
-	.8byte	.LVL821
+	.8byte	.LVL775
+	.8byte	.LVL831
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL825
-	.8byte	.LVL828
+	.8byte	.LVL835
+	.8byte	.LVL838
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL833
-	.8byte	.LVL846
+	.8byte	.LVL843
+	.8byte	.LVL864
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL851
-	.8byte	.LVL853
+	.8byte	.LVL869
+	.8byte	.LVL871
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL854
-	.8byte	.LVL878
+	.8byte	.LVL872
+	.8byte	.LVL893
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL884
+	.8byte	.LVL899
 	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
-	.8byte	0
-.LLST202:
-	.8byte	.LVL843
-	.8byte	.LVL844
+	.8byte	0
+.LLST205:
+	.8byte	.LVL858
+	.8byte	.LVL859
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL880
-	.8byte	.LVL881-1
+	.8byte	.LVL895
+	.8byte	.LVL896-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST201:
-	.8byte	.LVL837
-	.8byte	.LVL838
+.LLST204:
+	.8byte	.LVL847
+	.8byte	.LVL848
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL871
-	.8byte	.LVL872-1
+	.8byte	.LVL886
+	.8byte	.LVL887-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST190:
-	.8byte	.LVL760
-	.8byte	.LVL761
+.LLST193:
+	.8byte	.LVL777
+	.8byte	.LVL778
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL799
-	.8byte	.LVL800-1
+	.8byte	.LVL810
+	.8byte	.LVL811-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST189:
-	.8byte	.LVL749
-	.8byte	.LVL750
+.LLST192:
+	.8byte	.LVL758
+	.8byte	.LVL759
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL762
-	.8byte	.LVL763
+	.8byte	.LVL779
+	.8byte	.LVL780
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL765
-	.8byte	.LVL766-1
+	.8byte	.LVL782
+	.8byte	.LVL783-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST191:
-	.8byte	.LVL781
-	.8byte	.LVL783-1
-	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL796
-	.8byte	.LVL797-1
+.LLST194:
+	.8byte	.LVL769
+	.8byte	.LVL770-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL816
-	.8byte	.LVL833
+	.8byte	.LVL797
+	.8byte	.LVL799-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL846
-	.8byte	.LVL852-1
+	.8byte	.LVL826
+	.8byte	.LVL843
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL853
-	.8byte	.LVL854
+	.8byte	.LVL864
+	.8byte	.LVL870-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL858
-	.8byte	.LVL860-1
+	.8byte	.LVL871
+	.8byte	.LVL874-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL875
-	.8byte	.LVL876-1
+	.8byte	.LVL890
+	.8byte	.LVL891-1
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST192:
-	.8byte	.LVL821
-	.8byte	.LVL824
+.LLST195:
+	.8byte	.LVL831
+	.8byte	.LVL834
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL830
-	.8byte	.LVL833
+	.8byte	.LVL840
+	.8byte	.LVL843
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL846
-	.8byte	.LVL849
+	.8byte	.LVL864
+	.8byte	.LVL867
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL853
-	.8byte	.LVL854
+	.8byte	.LVL871
+	.8byte	.LVL872
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST193:
-	.8byte	.LVL749
-	.8byte	.LVL756
-	.2byte	0x1
-	.byte	0x69
+.LLST196:
 	.8byte	.LVL758
-	.8byte	.LVL770
+	.8byte	.LVL762
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL778
-	.8byte	.LVL782
+	.8byte	.LVL769
+	.8byte	.LVL773
 	.2byte	0x1
 	.byte	0x69
+	.8byte	.LVL775
 	.8byte	.LVL786
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL787
 	.8byte	.LVL788
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL789
 	.8byte	.LVL790
+	.8byte	.LVL794
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL796
-	.8byte	.LVL806
+	.8byte	.LVL797
+	.8byte	.LVL798
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL820
-	.8byte	.LVL821
+	.8byte	.LVL802
+	.8byte	.LVL804
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL823
-	.8byte	.LVL829
+	.8byte	.LVL808
+	.8byte	.LVL817
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL830
+	.8byte	.LVL831
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL833
+	.8byte	.LVL839
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL848
 	.8byte	.LVL853
+	.8byte	.LVL856
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL854
-	.8byte	.LVL859
+	.8byte	.LVL866
+	.8byte	.LVL871
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL875
-	.8byte	.LVL877
+	.8byte	.LVL872
+	.8byte	.LVL873
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL886
-	.8byte	.LVL888
+	.8byte	.LVL880
+	.8byte	.LVL884
 	.2byte	0x1
 	.byte	0x69
+	.8byte	.LVL890
 	.8byte	.LVL892
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL902
+	.8byte	.LVL904
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL909
 	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST194:
-	.8byte	.LVL781
-	.8byte	.LVL783-1
+.LLST197:
+	.8byte	.LVL769
+	.8byte	.LVL770-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL796
-	.8byte	.LVL797-1
+	.8byte	.LVL797
+	.8byte	.LVL799-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL820
-	.8byte	.LVL822
+	.8byte	.LVL830
+	.8byte	.LVL832
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL823
 	.8byte	.LVL833
+	.8byte	.LVL843
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL846
-	.8byte	.LVL847
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL851
-	.8byte	.LVL852-1
+	.8byte	.LVL864
+	.8byte	.LVL865
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL853
-	.8byte	.LVL854
+	.8byte	.LVL869
+	.8byte	.LVL870-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL858
-	.8byte	.LVL860-1
+	.8byte	.LVL871
+	.8byte	.LVL874-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL875
-	.8byte	.LVL876-1
+	.8byte	.LVL890
+	.8byte	.LVL891-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST195:
-	.8byte	.LVL781
-	.8byte	.LVL783-1
-	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL796
-	.8byte	.LVL797-1
+.LLST198:
+	.8byte	.LVL769
+	.8byte	.LVL770-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL820
-	.8byte	.LVL831
+	.8byte	.LVL797
+	.8byte	.LVL799-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL832
-	.8byte	.LVL833
+	.8byte	.LVL830
+	.8byte	.LVL841
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL846
-	.8byte	.LVL852-1
+	.8byte	.LVL842
+	.8byte	.LVL843
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL853
-	.8byte	.LVL854
+	.8byte	.LVL864
+	.8byte	.LVL870-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL858
-	.8byte	.LVL860-1
+	.8byte	.LVL871
+	.8byte	.LVL874-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL875
-	.8byte	.LVL876-1
+	.8byte	.LVL890
+	.8byte	.LVL891-1
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST196:
-	.8byte	.LVL781
-	.8byte	.LVL783-1
+.LLST199:
+	.8byte	.LVL769
+	.8byte	.LVL770-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL796
-	.8byte	.LVL797-1
+	.8byte	.LVL797
+	.8byte	.LVL799-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL820
-	.8byte	.LVL821
+	.8byte	.LVL830
+	.8byte	.LVL831
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL824
-	.8byte	.LVL826
+	.8byte	.LVL834
+	.8byte	.LVL836
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL826
-	.8byte	.LVL827
+	.8byte	.LVL836
+	.8byte	.LVL837
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL850
-	.8byte	.LVL852-1
+	.8byte	.LVL868
+	.8byte	.LVL870-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL858
-	.8byte	.LVL860-1
+	.8byte	.LVL872
+	.8byte	.LVL874-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL875
-	.8byte	.LVL876-1
+	.8byte	.LVL890
+	.8byte	.LVL891-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST197:
-	.8byte	.LVL781
-	.8byte	.LVL783-1
-	.2byte	0x1
-	.byte	0x5f
-	.8byte	.LVL796
-	.8byte	.LVL797-1
+.LLST200:
+	.8byte	.LVL769
+	.8byte	.LVL770-1
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL819
-	.8byte	.LVL833
+	.8byte	.LVL797
+	.8byte	.LVL799-1
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL846
-	.8byte	.LVL852-1
+	.8byte	.LVL829
+	.8byte	.LVL843
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL853
-	.8byte	.LVL854
+	.8byte	.LVL864
+	.8byte	.LVL870-1
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL858
-	.8byte	.LVL860-1
+	.8byte	.LVL871
+	.8byte	.LVL874-1
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL875
-	.8byte	.LVL876-1
+	.8byte	.LVL890
+	.8byte	.LVL891-1
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST198:
-	.8byte	.LVL781
-	.8byte	.LVL783-1
-	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL796
-	.8byte	.LVL797-1
+.LLST201:
+	.8byte	.LVL769
+	.8byte	.LVL770-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL817
-	.8byte	.LVL833
+	.8byte	.LVL797
+	.8byte	.LVL799-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL846
-	.8byte	.LVL852-1
+	.8byte	.LVL827
+	.8byte	.LVL843
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL853
-	.8byte	.LVL854
+	.8byte	.LVL864
+	.8byte	.LVL870-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL858
-	.8byte	.LVL860-1
+	.8byte	.LVL871
+	.8byte	.LVL874-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL875
-	.8byte	.LVL876-1
+	.8byte	.LVL890
+	.8byte	.LVL891-1
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST199:
-	.8byte	.LVL781
-	.8byte	.LVL783-1
-	.2byte	0x1
-	.byte	0x5e
-	.8byte	.LVL796
-	.8byte	.LVL797-1
+.LLST202:
+	.8byte	.LVL769
+	.8byte	.LVL770-1
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL819
-	.8byte	.LVL833
+	.8byte	.LVL797
+	.8byte	.LVL799-1
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL846
-	.8byte	.LVL852-1
+	.8byte	.LVL829
+	.8byte	.LVL843
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL853
-	.8byte	.LVL854
+	.8byte	.LVL864
+	.8byte	.LVL870-1
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL858
-	.8byte	.LVL860-1
+	.8byte	.LVL871
+	.8byte	.LVL874-1
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL875
-	.8byte	.LVL876-1
+	.8byte	.LVL890
+	.8byte	.LVL891-1
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST200:
-	.8byte	.LVL781
-	.8byte	.LVL783-1
-	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL796
-	.8byte	.LVL797-1
+.LLST203:
+	.8byte	.LVL769
+	.8byte	.LVL770-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL818
-	.8byte	.LVL833
+	.8byte	.LVL797
+	.8byte	.LVL799-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL846
-	.8byte	.LVL852-1
+	.8byte	.LVL828
+	.8byte	.LVL843
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL853
-	.8byte	.LVL854
+	.8byte	.LVL864
+	.8byte	.LVL870-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL858
-	.8byte	.LVL860-1
+	.8byte	.LVL871
+	.8byte	.LVL874-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL875
-	.8byte	.LVL876-1
+	.8byte	.LVL890
+	.8byte	.LVL891-1
 	.2byte	0x1
 	.byte	0x61
 	.8byte	0
@@ -50735,136 +50903,136 @@ __exitcall_ebc_exit:
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST180:
-	.8byte	.LVL733
-	.8byte	.LVL735
+.LLST183:
+	.8byte	.LVL742
+	.8byte	.LVL744
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST181:
-	.8byte	.LVL734
-	.8byte	.LVL737
+.LLST184:
+	.8byte	.LVL743
+	.8byte	.LVL746
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST182:
-	.8byte	.LVL737
-	.8byte	.LVL740
+.LLST185:
+	.8byte	.LVL746
+	.8byte	.LVL749
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL741
-	.8byte	.LVL744
+	.8byte	.LVL750
+	.8byte	.LVL753
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST176:
-	.8byte	.LVL722
-	.8byte	.LVL727
+.LLST179:
+	.8byte	.LVL731
+	.8byte	.LVL736
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL732
+	.8byte	.LVL741
 	.8byte	.LFE2808
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST177:
-	.8byte	.LVL728
-	.8byte	.LVL729
+.LLST180:
+	.8byte	.LVL737
+	.8byte	.LVL738
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST178:
-	.8byte	.LVL726
-	.8byte	.LVL730
+.LLST181:
+	.8byte	.LVL735
+	.8byte	.LVL739
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST179:
-	.8byte	.LVL729
-	.8byte	.LVL731
+.LLST182:
+	.8byte	.LVL738
+	.8byte	.LVL740
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST170:
-	.8byte	.LVL700
-	.8byte	.LVL706
+.LLST173:
+	.8byte	.LVL709
+	.8byte	.LVL715
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL710
-	.8byte	.LVL711
+	.8byte	.LVL719
+	.8byte	.LVL720
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL720
-	.8byte	.LVL721
+	.8byte	.LVL729
+	.8byte	.LVL730
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST171:
-	.8byte	.LVL700
-	.8byte	.LVL701
+.LLST174:
+	.8byte	.LVL709
+	.8byte	.LVL710
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST172:
-	.8byte	.LVL706
-	.8byte	.LVL709
+.LLST175:
+	.8byte	.LVL715
+	.8byte	.LVL718
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL713
-	.8byte	.LVL718
+	.8byte	.LVL722
+	.8byte	.LVL727
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL721
+	.8byte	.LVL730
 	.8byte	.LFE2807
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST173:
-	.8byte	.LVL705
-	.8byte	.LVL706
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL708
-	.8byte	.LVL712
+.LLST176:
+	.8byte	.LVL714
+	.8byte	.LVL715
 	.2byte	0x1
 	.byte	0x59
 	.8byte	.LVL717
 	.8byte	.LVL721
 	.2byte	0x1
 	.byte	0x59
+	.8byte	.LVL726
+	.8byte	.LVL730
+	.2byte	0x1
+	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST174:
-	.8byte	.LVL705
-	.8byte	.LVL707
+.LLST177:
+	.8byte	.LVL714
+	.8byte	.LVL716
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL708
-	.8byte	.LVL716
+	.8byte	.LVL717
+	.8byte	.LVL725
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL719
+	.8byte	.LVL728
 	.8byte	.LFE2807
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST175:
-	.8byte	.LVL705
+.LLST178:
 	.8byte	.LVL714
+	.8byte	.LVL723
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL715
+	.8byte	.LVL724
 	.8byte	.LFE2807
 	.2byte	0x1
 	.byte	0x57
@@ -51388,16 +51556,16 @@ __exitcall_ebc_exit:
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST169:
-	.8byte	.LVL692
-	.8byte	.LVL693
+.LLST172:
+	.8byte	.LVL701
+	.8byte	.LVL702
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL693
-	.8byte	.LVL697
+	.8byte	.LVL702
+	.8byte	.LVL706
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL698
+	.8byte	.LVL707
 	.8byte	.LFE2866
 	.2byte	0x1
 	.byte	0x63
@@ -51421,270 +51589,256 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
 .Ldebug_ranges0:
-	.8byte	.LBB932
-	.8byte	.LBE932
-	.8byte	.LBB935
-	.8byte	.LBE935
+	.8byte	.LBB944
+	.8byte	.LBE944
+	.8byte	.LBB947
+	.8byte	.LBE947
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB936
-	.8byte	.LBE936
-	.8byte	.LBB967
-	.8byte	.LBE967
-	.8byte	.LBB968
-	.8byte	.LBE968
-	.8byte	.LBB1033
-	.8byte	.LBE1033
+	.8byte	.LBB948
+	.8byte	.LBE948
+	.8byte	.LBB979
+	.8byte	.LBE979
+	.8byte	.LBB980
+	.8byte	.LBE980
+	.8byte	.LBB1045
+	.8byte	.LBE1045
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB939
-	.8byte	.LBE939
 	.8byte	.LBB951
 	.8byte	.LBE951
-	.8byte	.LBB952
-	.8byte	.LBE952
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB955
-	.8byte	.LBE955
-	.8byte	.LBB960
-	.8byte	.LBE960
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB969
-	.8byte	.LBE969
-	.8byte	.LBB1190
-	.8byte	.LBE1190
-	.8byte	.LBB1191
-	.8byte	.LBE1191
+	.8byte	.LBB963
+	.8byte	.LBE963
+	.8byte	.LBB964
+	.8byte	.LBE964
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB967
+	.8byte	.LBE967
 	.8byte	.LBB972
 	.8byte	.LBE972
-	.8byte	.LBB992
-	.8byte	.LBE992
-	.8byte	.LBB993
-	.8byte	.LBE993
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB986
-	.8byte	.LBE986
-	.8byte	.LBB991
-	.8byte	.LBE991
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB998
-	.8byte	.LBE998
-	.8byte	.LBB1201
-	.8byte	.LBE1201
+	.8byte	.LBB981
+	.8byte	.LBE981
+	.8byte	.LBB1202
+	.8byte	.LBE1202
 	.8byte	.LBB1203
 	.8byte	.LBE1203
-	.8byte	.LBB1204
-	.8byte	.LBE1204
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB984
+	.8byte	.LBE984
 	.8byte	.LBB1004
 	.8byte	.LBE1004
-	.8byte	.LBB1188
-	.8byte	.LBE1188
-	.8byte	.LBB1189
-	.8byte	.LBE1189
+	.8byte	.LBB1005
+	.8byte	.LBE1005
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1007
-	.8byte	.LBE1007
-	.8byte	.LBB1027
-	.8byte	.LBE1027
-	.8byte	.LBB1028
-	.8byte	.LBE1028
+	.8byte	.LBB998
+	.8byte	.LBE998
+	.8byte	.LBB1003
+	.8byte	.LBE1003
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1021
-	.8byte	.LBE1021
-	.8byte	.LBB1026
-	.8byte	.LBE1026
+	.8byte	.LBB1010
+	.8byte	.LBE1010
+	.8byte	.LBB1213
+	.8byte	.LBE1213
+	.8byte	.LBB1215
+	.8byte	.LBE1215
+	.8byte	.LBB1216
+	.8byte	.LBE1216
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1034
-	.8byte	.LBE1034
-	.8byte	.LBB1067
-	.8byte	.LBE1067
-	.8byte	.LBB1198
-	.8byte	.LBE1198
-	.8byte	.LBB1199
-	.8byte	.LBE1199
+	.8byte	.LBB1016
+	.8byte	.LBE1016
+	.8byte	.LBB1200
+	.8byte	.LBE1200
+	.8byte	.LBB1201
+	.8byte	.LBE1201
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1037
-	.8byte	.LBE1037
-	.8byte	.LBB1050
-	.8byte	.LBE1050
-	.8byte	.LBB1059
-	.8byte	.LBE1059
-	.8byte	.LBB1060
-	.8byte	.LBE1060
+	.8byte	.LBB1019
+	.8byte	.LBE1019
+	.8byte	.LBB1039
+	.8byte	.LBE1039
+	.8byte	.LBB1040
+	.8byte	.LBE1040
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1053
-	.8byte	.LBE1053
-	.8byte	.LBB1058
-	.8byte	.LBE1058
+	.8byte	.LBB1033
+	.8byte	.LBE1033
+	.8byte	.LBB1038
+	.8byte	.LBE1038
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1068
-	.8byte	.LBE1068
-	.8byte	.LBB1103
-	.8byte	.LBE1103
-	.8byte	.LBB1194
-	.8byte	.LBE1194
-	.8byte	.LBB1195
-	.8byte	.LBE1195
-	.8byte	.LBB1205
-	.8byte	.LBE1205
+	.8byte	.LBB1046
+	.8byte	.LBE1046
+	.8byte	.LBB1079
+	.8byte	.LBE1079
+	.8byte	.LBB1210
+	.8byte	.LBE1210
+	.8byte	.LBB1211
+	.8byte	.LBE1211
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1049
+	.8byte	.LBE1049
+	.8byte	.LBB1062
+	.8byte	.LBE1062
 	.8byte	.LBB1071
 	.8byte	.LBE1071
-	.8byte	.LBB1084
-	.8byte	.LBE1084
-	.8byte	.LBB1093
-	.8byte	.LBE1093
-	.8byte	.LBB1094
-	.8byte	.LBE1094
+	.8byte	.LBB1072
+	.8byte	.LBE1072
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1087
-	.8byte	.LBE1087
-	.8byte	.LBB1092
-	.8byte	.LBE1092
+	.8byte	.LBB1065
+	.8byte	.LBE1065
+	.8byte	.LBB1070
+	.8byte	.LBE1070
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1104
-	.8byte	.LBE1104
+	.8byte	.LBB1080
+	.8byte	.LBE1080
 	.8byte	.LBB1115
 	.8byte	.LBE1115
+	.8byte	.LBB1206
+	.8byte	.LBE1206
+	.8byte	.LBB1207
+	.8byte	.LBE1207
+	.8byte	.LBB1217
+	.8byte	.LBE1217
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1107
-	.8byte	.LBE1107
-	.8byte	.LBB1112
-	.8byte	.LBE1112
+	.8byte	.LBB1083
+	.8byte	.LBE1083
+	.8byte	.LBB1096
+	.8byte	.LBE1096
+	.8byte	.LBB1105
+	.8byte	.LBE1105
+	.8byte	.LBB1106
+	.8byte	.LBE1106
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1108
-	.8byte	.LBE1108
-	.8byte	.LBB1111
-	.8byte	.LBE1111
+	.8byte	.LBB1099
+	.8byte	.LBE1099
+	.8byte	.LBB1104
+	.8byte	.LBE1104
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1116
 	.8byte	.LBE1116
-	.8byte	.LBB1151
-	.8byte	.LBE1151
-	.8byte	.LBB1192
-	.8byte	.LBE1192
-	.8byte	.LBB1193
-	.8byte	.LBE1193
-	.8byte	.LBB1200
-	.8byte	.LBE1200
+	.8byte	.LBB1127
+	.8byte	.LBE1127
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1119
 	.8byte	.LBE1119
-	.8byte	.LBB1132
-	.8byte	.LBE1132
-	.8byte	.LBB1133
-	.8byte	.LBE1133
-	.8byte	.LBB1134
-	.8byte	.LBE1134
+	.8byte	.LBB1124
+	.8byte	.LBE1124
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1137
-	.8byte	.LBE1137
-	.8byte	.LBB1142
-	.8byte	.LBE1142
+	.8byte	.LBB1120
+	.8byte	.LBE1120
+	.8byte	.LBB1123
+	.8byte	.LBE1123
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1152
-	.8byte	.LBE1152
-	.8byte	.LBB1187
-	.8byte	.LBE1187
-	.8byte	.LBB1196
-	.8byte	.LBE1196
-	.8byte	.LBB1197
-	.8byte	.LBE1197
-	.8byte	.LBB1202
-	.8byte	.LBE1202
+	.8byte	.LBB1128
+	.8byte	.LBE1128
+	.8byte	.LBB1163
+	.8byte	.LBE1163
+	.8byte	.LBB1204
+	.8byte	.LBE1204
+	.8byte	.LBB1205
+	.8byte	.LBE1205
+	.8byte	.LBB1212
+	.8byte	.LBE1212
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1155
-	.8byte	.LBE1155
-	.8byte	.LBB1168
-	.8byte	.LBE1168
-	.8byte	.LBB1169
-	.8byte	.LBE1169
-	.8byte	.LBB1170
-	.8byte	.LBE1170
+	.8byte	.LBB1131
+	.8byte	.LBE1131
+	.8byte	.LBB1144
+	.8byte	.LBE1144
+	.8byte	.LBB1145
+	.8byte	.LBE1145
+	.8byte	.LBB1146
+	.8byte	.LBE1146
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1173
-	.8byte	.LBE1173
-	.8byte	.LBB1178
-	.8byte	.LBE1178
+	.8byte	.LBB1149
+	.8byte	.LBE1149
+	.8byte	.LBB1154
+	.8byte	.LBE1154
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1210
-	.8byte	.LBE1210
-	.8byte	.LBB1213
-	.8byte	.LBE1213
+	.8byte	.LBB1164
+	.8byte	.LBE1164
+	.8byte	.LBB1199
+	.8byte	.LBE1199
+	.8byte	.LBB1208
+	.8byte	.LBE1208
+	.8byte	.LBB1209
+	.8byte	.LBE1209
+	.8byte	.LBB1214
+	.8byte	.LBE1214
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1167
+	.8byte	.LBE1167
+	.8byte	.LBB1180
+	.8byte	.LBE1180
+	.8byte	.LBB1181
+	.8byte	.LBE1181
+	.8byte	.LBB1182
+	.8byte	.LBE1182
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1185
+	.8byte	.LBE1185
+	.8byte	.LBB1190
+	.8byte	.LBE1190
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1222
+	.8byte	.LBE1222
+	.8byte	.LBB1225
+	.8byte	.LBE1225
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1234
-	.8byte	.LBE1234
-	.8byte	.LBB1240
-	.8byte	.LBE1240
 	.8byte	.LBB1246
 	.8byte	.LBE1246
-	.8byte	.LBB1248
-	.8byte	.LBE1248
-	.8byte	.LBB1250
-	.8byte	.LBE1250
+	.8byte	.LBB1252
+	.8byte	.LBE1252
+	.8byte	.LBB1258
+	.8byte	.LBE1258
+	.8byte	.LBB1260
+	.8byte	.LBE1260
+	.8byte	.LBB1262
+	.8byte	.LBE1262
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1241
-	.8byte	.LBE1241
-	.8byte	.LBB1247
-	.8byte	.LBE1247
-	.8byte	.LBB1249
-	.8byte	.LBE1249
-	.8byte	.LBB1251
-	.8byte	.LBE1251
+	.8byte	.LBB1253
+	.8byte	.LBE1253
+	.8byte	.LBB1259
+	.8byte	.LBE1259
+	.8byte	.LBB1261
+	.8byte	.LBE1261
+	.8byte	.LBB1263
+	.8byte	.LBE1263
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1252
-	.8byte	.LBE1252
-	.8byte	.LBB1299
-	.8byte	.LBE1299
-	.8byte	.LBB1300
-	.8byte	.LBE1300
+	.8byte	.LBB1264
+	.8byte	.LBE1264
+	.8byte	.LBB1311
+	.8byte	.LBE1311
+	.8byte	.LBB1312
+	.8byte	.LBE1312
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1255
-	.8byte	.LBE1255
 	.8byte	.LBB1267
 	.8byte	.LBE1267
-	.8byte	.LBB1269
-	.8byte	.LBE1269
-	.8byte	.LBB1271
-	.8byte	.LBE1271
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1260
-	.8byte	.LBE1260
-	.8byte	.LBB1268
-	.8byte	.LBE1268
-	.8byte	.LBB1270
-	.8byte	.LBE1270
 	.8byte	.LBB1279
 	.8byte	.LBE1279
 	.8byte	.LBB1281
@@ -51699,314 +51853,296 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1280
 	.8byte	.LBB1282
 	.8byte	.LBE1282
-	.8byte	.LBB1289
-	.8byte	.LBE1289
 	.8byte	.LBB1291
 	.8byte	.LBE1291
 	.8byte	.LBB1293
 	.8byte	.LBE1293
+	.8byte	.LBB1295
+	.8byte	.LBE1295
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1284
 	.8byte	.LBE1284
-	.8byte	.LBB1290
-	.8byte	.LBE1290
 	.8byte	.LBB1292
 	.8byte	.LBE1292
 	.8byte	.LBB1294
 	.8byte	.LBE1294
+	.8byte	.LBB1301
+	.8byte	.LBE1301
+	.8byte	.LBB1303
+	.8byte	.LBE1303
+	.8byte	.LBB1305
+	.8byte	.LBE1305
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1319
-	.8byte	.LBE1319
-	.8byte	.LBB1358
-	.8byte	.LBE1358
+	.8byte	.LBB1296
+	.8byte	.LBE1296
+	.8byte	.LBB1302
+	.8byte	.LBE1302
+	.8byte	.LBB1304
+	.8byte	.LBE1304
+	.8byte	.LBB1306
+	.8byte	.LBE1306
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1322
-	.8byte	.LBE1322
 	.8byte	.LBB1331
 	.8byte	.LBE1331
+	.8byte	.LBB1370
+	.8byte	.LBE1370
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1336
-	.8byte	.LBE1336
-	.8byte	.LBB1349
-	.8byte	.LBE1349
-	.8byte	.LBB1351
-	.8byte	.LBE1351
-	.8byte	.LBB1353
-	.8byte	.LBE1353
-	.8byte	.LBB1355
-	.8byte	.LBE1355
-	.8byte	.LBB1357
-	.8byte	.LBE1357
-	.8byte	0
-	.8byte	0
+	.8byte	.LBB1334
+	.8byte	.LBE1334
 	.8byte	.LBB1343
 	.8byte	.LBE1343
-	.8byte	.LBB1350
-	.8byte	.LBE1350
-	.8byte	.LBB1352
-	.8byte	.LBE1352
-	.8byte	.LBB1354
-	.8byte	.LBE1354
-	.8byte	.LBB1356
-	.8byte	.LBE1356
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1359
-	.8byte	.LBE1359
-	.8byte	.LBB1368
-	.8byte	.LBE1368
-	.8byte	.LBB1369
-	.8byte	.LBE1369
-	.8byte	.LBB1380
-	.8byte	.LBE1380
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1348
+	.8byte	.LBE1348
 	.8byte	.LBB1361
 	.8byte	.LBE1361
-	.8byte	.LBB1364
-	.8byte	.LBE1364
+	.8byte	.LBB1363
+	.8byte	.LBE1363
+	.8byte	.LBB1365
+	.8byte	.LBE1365
+	.8byte	.LBB1367
+	.8byte	.LBE1367
+	.8byte	.LBB1369
+	.8byte	.LBE1369
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1370
-	.8byte	.LBE1370
-	.8byte	.LBB1374
-	.8byte	.LBE1374
-	.8byte	.LBB1375
-	.8byte	.LBE1375
+	.8byte	.LBB1355
+	.8byte	.LBE1355
+	.8byte	.LBB1362
+	.8byte	.LBE1362
+	.8byte	.LBB1364
+	.8byte	.LBE1364
+	.8byte	.LBB1366
+	.8byte	.LBE1366
+	.8byte	.LBB1368
+	.8byte	.LBE1368
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1389
-	.8byte	.LBE1389
-	.8byte	.LBB1396
-	.8byte	.LBE1396
-	.8byte	.LBB1397
-	.8byte	.LBE1397
+	.8byte	.LBB1371
+	.8byte	.LBE1371
+	.8byte	.LBB1380
+	.8byte	.LBE1380
+	.8byte	.LBB1381
+	.8byte	.LBE1381
+	.8byte	.LBB1392
+	.8byte	.LBE1392
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1390
-	.8byte	.LBE1390
-	.8byte	.LBB1395
-	.8byte	.LBE1395
+	.8byte	.LBB1373
+	.8byte	.LBE1373
+	.8byte	.LBB1376
+	.8byte	.LBE1376
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1398
-	.8byte	.LBE1398
-	.8byte	.LBB1405
-	.8byte	.LBE1405
+	.8byte	.LBB1382
+	.8byte	.LBE1382
+	.8byte	.LBB1386
+	.8byte	.LBE1386
+	.8byte	.LBB1387
+	.8byte	.LBE1387
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1400
-	.8byte	.LBE1400
-	.8byte	.LBB1403
-	.8byte	.LBE1403
+	.8byte	.LBB1401
+	.8byte	.LBE1401
+	.8byte	.LBB1408
+	.8byte	.LBE1408
+	.8byte	.LBB1409
+	.8byte	.LBE1409
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1563
-	.8byte	.LBE1563
-	.8byte	.LBB1566
-	.8byte	.LBE1566
+	.8byte	.LBB1402
+	.8byte	.LBE1402
+	.8byte	.LBB1407
+	.8byte	.LBE1407
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1573
-	.8byte	.LBE1573
-	.8byte	.LBB1672
-	.8byte	.LBE1672
-	.8byte	.LBB1673
-	.8byte	.LBE1673
-	.8byte	.LBB1674
-	.8byte	.LBE1674
-	.8byte	.LBB1711
-	.8byte	.LBE1711
+	.8byte	.LBB1410
+	.8byte	.LBE1410
+	.8byte	.LBB1417
+	.8byte	.LBE1417
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1575
-	.8byte	.LBE1575
-	.8byte	.LBB1584
-	.8byte	.LBE1584
-	.8byte	.LBB1585
-	.8byte	.LBE1585
-	.8byte	.LBB1586
-	.8byte	.LBE1586
+	.8byte	.LBB1412
+	.8byte	.LBE1412
+	.8byte	.LBB1415
+	.8byte	.LBE1415
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1632
-	.8byte	.LBE1632
-	.8byte	.LBB1666
-	.8byte	.LBE1666
-	.8byte	.LBB1667
-	.8byte	.LBE1667
+	.8byte	.LBB1580
+	.8byte	.LBE1580
+	.8byte	.LBB1583
+	.8byte	.LBE1583
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1639
-	.8byte	.LBE1639
+	.8byte	.LBB1590
+	.8byte	.LBE1590
 	.8byte	.LBB1664
 	.8byte	.LBE1664
 	.8byte	.LBB1665
 	.8byte	.LBE1665
+	.8byte	.LBB1666
+	.8byte	.LBE1666
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1646
-	.8byte	.LBE1646
-	.8byte	.LBB1662
-	.8byte	.LBE1662
-	.8byte	.LBB1663
-	.8byte	.LBE1663
+	.8byte	.LBB1592
+	.8byte	.LBE1592
+	.8byte	.LBB1601
+	.8byte	.LBE1601
+	.8byte	.LBB1602
+	.8byte	.LBE1602
+	.8byte	.LBB1603
+	.8byte	.LBE1603
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1653
-	.8byte	.LBE1653
-	.8byte	.LBB1660
-	.8byte	.LBE1660
-	.8byte	.LBB1661
-	.8byte	.LBE1661
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1675
-	.8byte	.LBE1675
-	.8byte	.LBB1700
-	.8byte	.LBE1700
-	.8byte	.LBB1701
-	.8byte	.LBE1701
-	.8byte	.LBB1710
-	.8byte	.LBE1710
-	.8byte	.LBB1761
-	.8byte	.LBE1761
-	.8byte	.LBB1766
-	.8byte	.LBE1766
+	.8byte	.LBB1667
+	.8byte	.LBE1667
+	.8byte	.LBB1692
+	.8byte	.LBE1692
+	.8byte	.LBB1693
+	.8byte	.LBE1693
+	.8byte	.LBB1702
+	.8byte	.LBE1702
+	.8byte	.LBB1753
+	.8byte	.LBE1753
+	.8byte	.LBB1758
+	.8byte	.LBE1758
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1677
-	.8byte	.LBE1677
+	.8byte	.LBB1669
+	.8byte	.LBE1669
+	.8byte	.LBB1672
+	.8byte	.LBE1672
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1673
+	.8byte	.LBE1673
+	.8byte	.LBB1678
+	.8byte	.LBE1678
+	.8byte	.LBB1679
+	.8byte	.LBE1679
 	.8byte	.LBB1680
 	.8byte	.LBE1680
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1681
-	.8byte	.LBE1681
-	.8byte	.LBB1686
-	.8byte	.LBE1686
-	.8byte	.LBB1687
-	.8byte	.LBE1687
-	.8byte	.LBB1688
-	.8byte	.LBE1688
+	.8byte	.LBB1694
+	.8byte	.LBE1694
+	.8byte	.LBB1703
+	.8byte	.LBE1703
+	.8byte	.LBB1755
+	.8byte	.LBE1755
+	.8byte	.LBB1759
+	.8byte	.LBE1759
+	.8byte	.LBB1761
+	.8byte	.LBE1761
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1702
-	.8byte	.LBE1702
-	.8byte	.LBB1712
-	.8byte	.LBE1712
-	.8byte	.LBB1763
-	.8byte	.LBE1763
-	.8byte	.LBB1767
-	.8byte	.LBE1767
-	.8byte	.LBB1768
-	.8byte	.LBE1768
+	.8byte	.LBB1704
+	.8byte	.LBE1704
+	.8byte	.LBB1756
+	.8byte	.LBE1756
+	.8byte	.LBB1757
+	.8byte	.LBE1757
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1713
-	.8byte	.LBE1713
-	.8byte	.LBB1764
-	.8byte	.LBE1764
-	.8byte	.LBB1765
-	.8byte	.LBE1765
+	.8byte	.LBB1706
+	.8byte	.LBE1706
+	.8byte	.LBB1712
+	.8byte	.LBE1712
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1715
 	.8byte	.LBE1715
-	.8byte	.LBB1721
-	.8byte	.LBE1721
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1724
-	.8byte	.LBE1724
-	.8byte	.LBB1725
-	.8byte	.LBE1725
+	.8byte	.LBB1716
+	.8byte	.LBE1716
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1723
+	.8byte	.LBE1723
+	.8byte	.LBB1729
+	.8byte	.LBE1729
+	.8byte	.LBB1730
+	.8byte	.LBE1730
+	.8byte	.LBB1731
+	.8byte	.LBE1731
 	.8byte	.LBB1732
 	.8byte	.LBE1732
-	.8byte	.LBB1738
-	.8byte	.LBE1738
-	.8byte	.LBB1739
-	.8byte	.LBE1739
-	.8byte	.LBB1740
-	.8byte	.LBE1740
-	.8byte	.LBB1741
-	.8byte	.LBE1741
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1742
-	.8byte	.LBE1742
+	.8byte	.LBB1733
+	.8byte	.LBE1733
+	.8byte	.LBB1752
+	.8byte	.LBE1752
+	.8byte	.LBB1754
+	.8byte	.LBE1754
 	.8byte	.LBB1760
 	.8byte	.LBE1760
 	.8byte	.LBB1762
 	.8byte	.LBE1762
-	.8byte	.LBB1769
-	.8byte	.LBE1769
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1791
+	.8byte	.LBE1791
 	.8byte	.LBB1798
 	.8byte	.LBE1798
-	.8byte	.LBB1805
-	.8byte	.LBE1805
-	.8byte	.LBB1806
-	.8byte	.LBE1806
+	.8byte	.LBB1799
+	.8byte	.LBE1799
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1793
+	.8byte	.LBE1793
+	.8byte	.LBB1794
+	.8byte	.LBE1794
+	.8byte	.LBB1795
+	.8byte	.LBE1795
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1800
 	.8byte	.LBE1800
-	.8byte	.LBB1801
-	.8byte	.LBE1801
-	.8byte	.LBB1802
-	.8byte	.LBE1802
+	.8byte	.LBB1804
+	.8byte	.LBE1804
+	.8byte	.LBB1805
+	.8byte	.LBE1805
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1807
-	.8byte	.LBE1807
 	.8byte	.LBB1811
 	.8byte	.LBE1811
-	.8byte	.LBB1812
-	.8byte	.LBE1812
-	.8byte	0
-	.8byte	0
+	.8byte	.LBB1817
+	.8byte	.LBE1817
 	.8byte	.LBB1818
 	.8byte	.LBE1818
-	.8byte	.LBB1824
-	.8byte	.LBE1824
-	.8byte	.LBB1825
-	.8byte	.LBE1825
-	.8byte	.LBB1834
-	.8byte	.LBE1834
-	.8byte	.LBB1835
-	.8byte	.LBE1835
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1826
-	.8byte	.LBE1826
-	.8byte	.LBB1836
-	.8byte	.LBE1836
-	.8byte	0
-	.8byte	0
+	.8byte	.LBB1827
+	.8byte	.LBE1827
 	.8byte	.LBB1828
 	.8byte	.LBE1828
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1819
+	.8byte	.LBE1819
 	.8byte	.LBB1829
 	.8byte	.LBE1829
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1821
+	.8byte	.LBE1821
+	.8byte	.LBB1822
+	.8byte	.LBE1822
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1823
+	.8byte	.LBE1823
 	.8byte	.LBB1830
 	.8byte	.LBE1830
-	.8byte	.LBB1837
-	.8byte	.LBE1837
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1832
-	.8byte	.LBE1832
-	.8byte	.LBB1833
-	.8byte	.LBE1833
+	.8byte	.LBB1825
+	.8byte	.LBE1825
+	.8byte	.LBB1826
+	.8byte	.LBE1826
 	.8byte	0
 	.8byte	0
 	.8byte	.Ltext0
@@ -52020,6591 +52156,6603 @@ __exitcall_ebc_exit:
 	.section	.debug_line,"",@progbits
 .Ldebug_line0:
 	.section	.debug_str,"MS",@progbits,1
-.LASF910:
+.LASF911:
 	.string	"sival_int"
-.LASF2625:
+.LASF2626:
 	.string	"PE_SIZE_PTE"
-.LASF2368:
+.LASF2369:
 	.string	"device_attribute"
-.LASF169:
+.LASF170:
 	.string	"line"
-.LASF1852:
+.LASF1853:
 	.string	"link"
-.LASF660:
+.LASF661:
 	.string	"start_time"
-.LASF2100:
+.LASF2101:
 	.string	"kernfs_node"
-.LASF2244:
+.LASF2245:
 	.string	"RPM_REQ_IDLE"
-.LASF2380:
+.LASF2381:
 	.string	"suppliers"
-.LASF3043:
+.LASF3044:
 	.string	"ebc_buffer_manage_init"
-.LASF2879:
+.LASF2880:
 	.string	"EPD_FULL_GCC16"
-.LASF37:
+.LASF38:
 	.string	"dev_t"
-.LASF1972:
+.LASF1973:
 	.string	"show_options2"
-.LASF2627:
+.LASF2628:
 	.string	"PE_SIZE_PUD"
-.LASF2590:
+.LASF2591:
 	.string	"__tracepoint_page_ref_mod"
-.LASF2970:
+.LASF2971:
 	.string	"full_mode_num"
-.LASF1042:
+.LASF1043:
 	.string	"nr_wakeups"
-.LASF1880:
+.LASF1881:
 	.string	"start"
-.LASF1338:
+.LASF1339:
 	.string	"start_brk"
-.LASF99:
+.LASF100:
 	.string	"read"
-.LASF1679:
+.LASF1680:
 	.string	"d_ino_softlimit"
-.LASF1968:
+.LASF1969:
 	.string	"copy_mnt_data"
-.LASF1779:
+.LASF1780:
 	.string	"WRITE_LIFE_LONG"
-.LASF2314:
+.LASF2315:
 	.string	"dev_pm_qos"
-.LASF1201:
+.LASF1202:
 	.string	"UTASK_RUNNING"
-.LASF164:
+.LASF165:
 	.string	"hex_asc"
-.LASF1067:
+.LASF1068:
 	.string	"watchdog_stamp"
-.LASF2837:
+.LASF2838:
 	.string	"WAKE_LOCK_TYPE_COUNT"
-.LASF2713:
+.LASF2714:
 	.string	"Elf64_Word"
-.LASF862:
+.LASF863:
 	.string	"PCPU_FC_PAGE"
-.LASF2157:
+.LASF2158:
 	.string	"kset_uevent_ops"
-.LASF370:
+.LASF371:
 	.string	"__cpu_present_mask"
-.LASF1448:
+.LASF1449:
 	.string	"zone_padding"
-.LASF181:
+.LASF182:
 	.string	"TT_NONE"
-.LASF1667:
+.LASF1668:
 	.string	"acquire_dquot"
-.LASF2212:
+.LASF2213:
 	.string	"coherent_dma_mask"
-.LASF2360:
+.LASF2361:
 	.string	"dev_kobj"
-.LASF474:
+.LASF475:
 	.string	"d_release"
-.LASF3155:
+.LASF3156:
 	.string	"get_arch_dma_ops"
-.LASF304:
+.LASF305:
 	.string	"__ctors_start"
-.LASF577:
+.LASF578:
 	.string	"state"
-.LASF523:
+.LASF524:
 	.string	"s_d_op"
-.LASF2960:
+.LASF2961:
 	.string	"ebc_buffer_vir"
-.LASF908:
+.LASF909:
 	.string	"node_states"
-.LASF2904:
+.LASF2905:
 	.string	"pmic_power_req"
-.LASF900:
+.LASF901:
 	.string	"hrtimer_resolution"
-.LASF255:
+.LASF256:
 	.string	"FTR_HIGHER_OR_ZERO_SAFE"
-.LASF1086:
+.LASF1087:
 	.string	"need_qs"
-.LASF136:
+.LASF137:
 	.string	"panic_notifier_list"
-.LASF1564:
+.LASF1565:
 	.string	"compact_defer_shift"
-.LASF258:
+.LASF259:
 	.string	"visible"
-.LASF51:
+.LASF52:
 	.string	"blkcnt_t"
-.LASF1132:
+.LASF1133:
 	.string	"icq_tree"
-.LASF945:
+.LASF946:
 	.string	"si_code"
-.LASF648:
+.LASF649:
 	.string	"thread_node"
-.LASF3091:
+.LASF3092:
 	.string	"temperature"
-.LASF1301:
+.LASF1302:
 	.string	"map_pages"
-.LASF544:
+.LASF545:
 	.string	"vfsmount"
-.LASF2230:
+.LASF2231:
 	.string	"iommu_fwspec"
-.LASF344:
+.LASF345:
 	.string	"tp2_value"
-.LASF2452:
+.LASF2453:
 	.string	"nargs"
-.LASF1541:
+.LASF1542:
 	.string	"vm_node_stat_diff"
-.LASF1161:
+.LASF1162:
 	.string	"attributes"
-.LASF2018:
+.LASF2019:
 	.string	"fs_kobj"
-.LASF2551:
+.LASF2552:
 	.string	"TASKLET_SOFTIRQ"
-.LASF1419:
+.LASF1420:
 	.string	"inodes_stat"
-.LASF251:
+.LASF252:
 	.string	"ftr_type"
-.LASF650:
+.LASF651:
 	.string	"set_child_tid"
-.LASF916:
+.LASF917:
 	.string	"_overrun"
-.LASF158:
+.LASF159:
 	.string	"system_state"
-.LASF824:
+.LASF825:
 	.string	"system_wq"
-.LASF603:
+.LASF604:
 	.string	"rcu_read_lock_nesting"
-.LASF2988:
+.LASF2989:
 	.string	"suspend_lock"
-.LASF2529:
+.LASF2530:
 	.string	"gpio_desc"
-.LASF961:
+.LASF962:
 	.string	"list"
-.LASF3172:
+.LASF3173:
 	.string	"_copy_from_user"
-.LASF3198:
+.LASF3199:
 	.string	"get_order"
-.LASF944:
+.LASF945:
 	.string	"si_errno"
-.LASF533:
+.LASF534:
 	.string	"s_inode_lru"
-.LASF2690:
+.LASF2691:
 	.string	"sysctl_stat_interval"
-.LASF1125:
+.LASF1126:
 	.string	"blk_plug"
-.LASF2785:
+.LASF2786:
 	.string	"modules_disabled"
-.LASF2643:
+.LASF2644:
 	.string	"PGSCAN_SKIP_DMA32"
-.LASF546:
+.LASF547:
 	.string	"sysctl_vfs_cache_pressure"
-.LASF2629:
+.LASF2630:
 	.string	"compound_page_dtor"
-.LASF832:
+.LASF833:
 	.string	"refs"
-.LASF1763:
+.LASF1764:
 	.string	"trace_events"
-.LASF1342:
+.LASF1343:
 	.string	"env_start"
-.LASF2913:
+.LASF2914:
 	.string	"DMA_FROM_DEVICE"
-.LASF755:
+.LASF756:
 	.string	"cpu_number"
-.LASF403:
+.LASF404:
 	.string	"d_flags"
-.LASF1312:
+.LASF1313:
 	.string	"mm_rb"
-.LASF2186:
+.LASF2187:
 	.string	"freeze_late"
-.LASF3063:
+.LASF3064:
 	.string	"buf_info"
-.LASF408:
+.LASF409:
 	.string	"d_inode"
-.LASF1831:
+.LASF1832:
 	.string	"hd_struct"
-.LASF1202:
+.LASF1203:
 	.string	"UTASK_SSTEP"
-.LASF638:
+.LASF639:
 	.string	"real_parent"
-.LASF217:
+.LASF218:
 	.string	"locked"
-.LASF72:
+.LASF73:
 	.string	"exitcall_t"
-.LASF2945:
+.LASF2946:
 	.string	"regs"
-.LASF1036:
+.LASF1037:
 	.string	"slice_max"
-.LASF671:
+.LASF672:
 	.string	"last_switch_count"
-.LASF2168:
+.LASF2169:
 	.string	"n_node"
-.LASF1623:
+.LASF1624:
 	.string	"qsize_t"
-.LASF3195:
+.LASF3196:
 	.string	"devm_kzalloc"
-.LASF379:
+.LASF380:
 	.string	"sequence"
-.LASF2530:
+.LASF2531:
 	.string	"i2c_adapter_quirks"
-.LASF673:
+.LASF674:
 	.string	"files"
-.LASF1362:
+.LASF1363:
 	.string	"file_caps_enabled"
-.LASF1912:
+.LASF1913:
 	.string	"lock_manager_operations"
-.LASF1701:
+.LASF1702:
 	.string	"s_state"
-.LASF1065:
+.LASF1066:
 	.string	"run_list"
-.LASF3112:
+.LASF3113:
 	.string	"clac_full_data_align8"
-.LASF2552:
+.LASF2553:
 	.string	"SCHED_SOFTIRQ"
-.LASF1929:
+.LASF1930:
 	.string	"fa_lock"
-.LASF2773:
-	.string	"mov0"
 .LASF2774:
-	.string	"mov1"
+	.string	"mov0"
 .LASF2775:
+	.string	"mov1"
+.LASF2776:
 	.string	"mov2"
-.LASF2803:
+.LASF2804:
 	.string	"module_sect_attrs"
-.LASF1870:
+.LASF1871:
 	.string	"flc_lock"
-.LASF1210:
+.LASF1211:
 	.string	"return_instance"
-.LASF2754:
+.LASF2755:
 	.string	"param_ops_uint"
-.LASF890:
+.LASF891:
 	.string	"softirq_activated"
-.LASF3027:
+.LASF3028:
 	.string	"pdev"
-.LASF826:
+.LASF827:
 	.string	"system_long_wq"
-.LASF156:
+.LASF157:
 	.string	"SYSTEM_RESTART"
-.LASF2257:
+.LASF2258:
 	.string	"is_prepared"
-.LASF2017:
+.LASF2018:
 	.string	"uevent_suppress"
-.LASF1517:
+.LASF1518:
 	.string	"node_id"
-.LASF1585:
+.LASF1586:
 	.string	"contig_page_data"
-.LASF2293:
+.LASF2294:
 	.string	"autosuspend_delay"
 .LASF3:
 	.string	"unsigned int"
-.LASF928:
+.LASF929:
 	.string	"_addr_bnd"
-.LASF160:
+.LASF161:
 	.string	"c_true"
-.LASF1577:
+.LASF1578:
 	.string	"notifier_call"
-.LASF3070:
+.LASF3071:
 	.string	"ebc_exit"
-.LASF1832:
+.LASF1833:
 	.string	"gendisk"
-.LASF1692:
+.LASF1693:
 	.string	"spc_timelimit"
-.LASF511:
+.LASF512:
 	.string	"s_instances"
-.LASF2735:
+.LASF2736:
 	.string	"sh_size"
-.LASF771:
+.LASF772:
 	.string	"desc"
-.LASF378:
+.LASF379:
 	.string	"seqcount"
-.LASF319:
+.LASF320:
 	.string	"__hyp_idmap_text_start"
-.LASF404:
+.LASF405:
 	.string	"d_seq"
-.LASF970:
+.LASF971:
 	.string	"rb_subtree_gap"
-.LASF1542:
+.LASF1543:
 	.string	"zone_type"
-.LASF46:
+.LASF47:
 	.string	"size_t"
-.LASF208:
+.LASF209:
 	.string	"compat_elf_hwcap"
-.LASF3268:
+.LASF3274:
 	.string	"prepare_to_wait_event"
-.LASF1109:
+.LASF1110:
 	.string	"cap_permitted"
-.LASF182:
+.LASF183:
 	.string	"TT_NATIVE"
-.LASF1551:
+.LASF1552:
 	.string	"zone_pgdat"
-.LASF548:
+.LASF549:
 	.string	"pid_type"
-.LASF1687:
+.LASF1688:
 	.string	"d_rt_spc_softlimit"
-.LASF41:
+.LASF42:
 	.string	"bool"
-.LASF2696:
+.LASF2697:
 	.string	"min_free_kbytes"
-.LASF371:
+.LASF372:
 	.string	"__cpu_active_mask"
-.LASF2401:
+.LASF2402:
 	.string	"map_page"
-.LASF609:
+.LASF610:
 	.string	"rcu_tasks_idx"
-.LASF608:
+.LASF609:
 	.string	"rcu_tasks_holdout"
-.LASF1278:
+.LASF1279:
 	.string	"f_count"
-.LASF1768:
+.LASF1769:
 	.string	"target_list"
-.LASF1384:
+.LASF1385:
 	.string	"RCU_BH_SYNC"
-.LASF283:
+.LASF284:
 	.string	"__init_end"
-.LASF1570:
+.LASF1571:
 	.string	"zoneref"
-.LASF2792:
+.LASF2793:
 	.string	"module_layout"
-.LASF526:
+.LASF527:
 	.string	"s_remove_count"
-.LASF216:
+.LASF217:
 	.string	"__reserved"
-.LASF939:
+.LASF940:
 	.string	"_sigfault"
-.LASF3126:
+.LASF3127:
 	.string	"image_bg"
-.LASF2857:
+.LASF2858:
 	.string	"ebc_buf_status"
-.LASF1806:
+.LASF1807:
 	.string	"empty_aops"
-.LASF86:
+.LASF87:
 	.string	"atomic_long_t"
-.LASF2110:
+.LASF2111:
 	.string	"prealloc"
-.LASF1304:
+.LASF1305:
 	.string	"pfn_mkwrite"
-.LASF69:
+.LASF70:
 	.string	"callback_head"
-.LASF341:
+.LASF342:
 	.string	"perf_event"
-.LASF1287:
+.LASF1288:
 	.string	"f_security"
-.LASF451:
+.LASF452:
 	.string	"i_sb_list"
-.LASF2496:
+.LASF2497:
 	.string	"detected"
-.LASF774:
+.LASF775:
 	.string	"read_cntpct_el0"
-.LASF1320:
+.LASF1321:
 	.string	"pgtables_bytes"
-.LASF1846:
+.LASF1847:
 	.string	"get_link"
-.LASF54:
+.LASF55:
 	.string	"fmode_t"
-.LASF2223:
+.LASF2224:
 	.string	"devt"
-.LASF947:
+.LASF948:
 	.string	"siginfo_t"
-.LASF2183:
+.LASF2184:
 	.string	"restore"
-.LASF1397:
+.LASF1398:
 	.string	"delayed_call"
-.LASF919:
+.LASF920:
 	.string	"_status"
-.LASF2902:
+.LASF2903:
 	.string	"pmic_name"
-.LASF1463:
+.LASF1464:
 	.string	"NR_FREE_CMA_PAGES"
-.LASF2427:
+.LASF2428:
 	.string	"kernel_ulong_t"
-.LASF2210:
+.LASF2211:
 	.string	"dma_ops"
-.LASF2139:
+.LASF2140:
 	.string	"bin_attribute"
-.LASF1602:
+.LASF1603:
 	.string	"percpu_counter"
-.LASF2990:
+.LASF2991:
 	.string	"first_in"
-.LASF2328:
+.LASF2329:
 	.string	"dev_groups"
-.LASF2952:
+.LASF2953:
 	.string	"image_addr_set"
-.LASF300:
+.LASF301:
 	.string	"__softirqentry_text_start"
-.LASF320:
+.LASF321:
 	.string	"__hyp_idmap_text_end"
-.LASF632:
+.LASF633:
 	.string	"memcg_kmem_skip_account"
-.LASF2374:
+.LASF2375:
 	.string	"dl_dev_state"
-.LASF895:
+.LASF896:
 	.string	"expires_next"
-.LASF2087:
+.LASF2088:
 	.string	"ida_bitmap"
-.LASF445:
+.LASF446:
 	.string	"i_io_list"
-.LASF1928:
+.LASF1929:
 	.string	"fasync_struct"
-.LASF2289:
+.LASF2290:
 	.string	"links_count"
-.LASF2633:
+.LASF2634:
 	.string	"PGPGOUT"
-.LASF1661:
+.LASF1662:
 	.string	"release_dqblk"
-.LASF187:
+.LASF188:
 	.string	"uaddr2"
 .LASF30:
 	.string	"__kernel_timer_t"
-.LASF1753:
+.LASF1754:
 	.string	"notes_attrs"
-.LASF2483:
+.LASF2484:
 	.string	"irqchip_fwnode_ops"
-.LASF1613:
+.LASF1614:
 	.string	"dq_id"
-.LASF3117:
+.LASF3118:
 	.string	"frame_count_tmp"
-.LASF3125:
+.LASF3126:
 	.string	"image_fb"
-.LASF1788:
+.LASF1789:
 	.string	"write_end"
-.LASF1498:
+.LASF1499:
 	.string	"NR_ION_HEAP_POOL"
-.LASF1423:
+.LASF1424:
 	.string	"sysctl_protected_hardlinks"
-.LASF3272:
+.LASF3278:
 	.string	"__arch_copy_from_user"
-.LASF1176:
+.LASF1177:
 	.string	"scan_objects"
-.LASF1552:
+.LASF1553:
 	.string	"pageset"
-.LASF1237:
+.LASF1238:
 	.string	"wb_err"
-.LASF3169:
+.LASF3170:
 	.string	"copy_to_user"
-.LASF734:
+.LASF735:
 	.string	"trace_recursion"
-.LASF1336:
+.LASF1337:
 	.string	"start_data"
-.LASF1782:
+.LASF1783:
 	.string	"writepage"
-.LASF2012:
+.LASF2013:
 	.string	"kref"
-.LASF1113:
+.LASF1114:
 	.string	"jit_keyring"
-.LASF168:
+.LASF169:
 	.string	"file_disp"
-.LASF2967:
+.LASF2968:
 	.string	"auto_need_refresh"
-.LASF2845:
+.LASF2846:
 	.string	"WF_TYPE_GRAY2"
-.LASF1089:
+.LASF1090:
 	.string	"rcu_special"
-.LASF651:
+.LASF652:
 	.string	"clear_child_tid"
-.LASF698:
+.LASF699:
 	.string	"backing_dev_info"
-.LASF2548:
+.LASF2549:
 	.string	"NET_RX_SOFTIRQ"
-.LASF810:
+.LASF811:
 	.string	"__WORK_OFFQ_CANCELING"
-.LASF536:
+.LASF537:
 	.string	"s_stack_depth"
-.LASF1329:
+.LASF1330:
 	.string	"data_vm"
 .LASF11:
 	.string	"__s32"
-.LASF2485:
+.LASF2486:
 	.string	"i2c_msg"
-.LASF768:
+.LASF769:
 	.string	"ate_match_acpi_oem_info"
-.LASF391:
+.LASF392:
 	.string	"nr_dentry"
-.LASF2182:
+.LASF2183:
 	.string	"poweroff"
-.LASF2076:
+.LASF2077:
 	.string	"stop"
-.LASF2595:
+.LASF2596:
 	.string	"__tracepoint_page_ref_unfreeze"
-.LASF2064:
+.LASF2065:
 	.string	"ratelimit_state"
-.LASF530:
+.LASF531:
 	.string	"s_pins"
-.LASF2527:
+.LASF2528:
 	.string	"scl_gpiod"
-.LASF2082:
+.LASF2083:
 	.string	"ioport_resource"
-.LASF2700:
+.LASF2701:
 	.string	"init_on_alloc"
-.LASF2464:
+.LASF2465:
 	.string	"param_count"
-.LASF2114:
+.LASF2115:
 	.string	"attr"
-.LASF2440:
+.LASF2441:
 	.string	"get_next_child_node"
-.LASF2809:
+.LASF2810:
 	.string	"module_ktype"
-.LASF2014:
+.LASF2015:
 	.string	"state_in_sysfs"
-.LASF1223:
+.LASF1224:
 	.string	"vm_fault_t"
-.LASF1204:
+.LASF1205:
 	.string	"UTASK_SSTEP_TRAPPED"
-.LASF332:
+.LASF333:
 	.string	"__entry_tramp_text_end"
-.LASF1306:
+.LASF1307:
 	.string	"find_special_page"
-.LASF2580:
+.LASF2581:
 	.string	"force_atomic"
-.LASF105:
+.LASF106:
 	.string	"poll"
-.LASF2443:
+.LASF2444:
 	.string	"graph_get_next_endpoint"
-.LASF1409:
+.LASF1410:
 	.string	"io_cq"
-.LASF2854:
+.LASF2855:
 	.string	"epd_lut_data"
-.LASF2331:
+.LASF2332:
 	.string	"probe"
-.LASF2721:
+.LASF2722:
 	.string	"elf64_sym"
-.LASF2765:
+.LASF2766:
 	.string	"latch_tree_node"
-.LASF1154:
+.LASF1155:
 	.string	"cad_pid"
-.LASF2941:
+.LASF2942:
 	.string	"lgonl"
-.LASF534:
+.LASF535:
 	.string	"destroy_work"
-.LASF3079:
+.LASF3080:
 	.string	"one_buffer_end"
-.LASF253:
+.LASF254:
 	.string	"FTR_LOWER_SAFE"
-.LASF126:
+.LASF127:
 	.string	"clone_file_range"
-.LASF2519:
+.LASF2520:
 	.string	"recover_bus"
-.LASF2267:
+.LASF2268:
 	.string	"syscore"
 .LASF13:
 	.string	"__s64"
-.LASF865:
+.LASF866:
 	.string	"pcpu_chosen_fc"
-.LASF390:
+.LASF391:
 	.string	"dentry_stat_t"
-.LASF3220:
+.LASF3224:
 	.string	"atomic_add"
-.LASF1642:
+.LASF1643:
 	.string	"dqi_bgrace"
 .LASF22:
 	.string	"__kernel_pid_t"
-.LASF157:
+.LASF158:
 	.string	"SYSTEM_SUSPEND"
-.LASF937:
+.LASF938:
 	.string	"_timer"
-.LASF1595:
+.LASF1596:
 	.string	"thread_sibling"
-.LASF2397:
+.LASF2398:
 	.string	"dma_map_ops"
-.LASF2030:
+.LASF2031:
 	.string	"ctl_table"
-.LASF43:
+.LASF44:
 	.string	"uid_t"
-.LASF3249:
+.LASF3253:
 	.string	"strstr"
-.LASF2847:
+.LASF2848:
 	.string	"WF_TYPE_A2"
-.LASF2825:
+.LASF2826:
 	.string	"of_default_bus_match_table"
-.LASF1220:
+.LASF1221:
 	.string	"__bp_harden_hyp_vecs_start"
-.LASF1260:
+.LASF1261:
 	.string	"pgmap"
-.LASF489:
+.LASF490:
 	.string	"dq_op"
-.LASF2367:
+.LASF2368:
 	.string	"sysfs_dev_char_kobj"
-.LASF607:
+.LASF608:
 	.string	"rcu_tasks_nvcsw"
-.LASF100:
+.LASF101:
 	.string	"write"
-.LASF2594:
+.LASF2595:
 	.string	"__tracepoint_page_ref_freeze"
-.LASF2931:
+.LASF2932:
 	.string	"panel_buffer"
-.LASF316:
+.LASF317:
 	.string	"__exception_text_end"
-.LASF2733:
+.LASF2734:
 	.string	"sh_addr"
-.LASF274:
+.LASF275:
 	.string	"_text"
-.LASF1886:
+.LASF1887:
 	.string	"fu_rcuhead"
-.LASF2709:
+.LASF2710:
 	.string	"modprobe_path"
-.LASF2216:
+.LASF2217:
 	.string	"dma_pools"
-.LASF2078:
+.LASF2079:
 	.string	"arch_debugfs_dir"
-.LASF927:
+.LASF928:
 	.string	"_addr_lsb"
-.LASF2036:
+.LASF2037:
 	.string	"ctl_table_poll"
-.LASF462:
+.LASF463:
 	.string	"i_generation"
-.LASF940:
+.LASF941:
 	.string	"_sigpoll"
-.LASF280:
+.LASF281:
 	.string	"__bss_start"
-.LASF1930:
+.LASF1931:
 	.string	"magic"
-.LASF2311:
+.LASF2312:
 	.string	"wakeup_count"
-.LASF999:
+.LASF1000:
 	.string	"cpu_id_start"
-.LASF2439:
+.LASF2440:
 	.string	"get_parent"
-.LASF1047:
+.LASF1048:
 	.string	"nr_wakeups_affine"
-.LASF764:
+.LASF765:
 	.string	"arch_timer_read_ool_enabled"
-.LASF834:
+.LASF835:
 	.string	"pteval_t"
-.LASF429:
+.LASF430:
 	.string	"i_ino"
-.LASF3290:
+.LASF3296:
 	.string	"might_fault"
-.LASF1561:
+.LASF1562:
 	.string	"compact_cached_free_pfn"
-.LASF879:
+.LASF880:
 	.string	"index"
-.LASF2203:
+.LASF2204:
 	.string	"driver_data"
-.LASF2939:
+.LASF2940:
 	.string	"sdck"
-.LASF2808:
+.LASF2809:
 	.string	"module_kset"
-.LASF2418:
+.LASF2419:
 	.string	"removed_region"
-.LASF2169:
+.LASF2170:
 	.string	"n_ref"
-.LASF902:
+.LASF903:
 	.string	"tick_cpu_device"
-.LASF1932:
+.LASF1933:
 	.string	"fa_next"
-.LASF1275:
+.LASF1276:
 	.string	"f_op"
-.LASF2703:
+.LASF2704:
 	.string	"randomize_va_space"
-.LASF2579:
+.LASF2580:
 	.string	"confirm_switch"
-.LASF2891:
+.LASF2892:
 	.string	"EPD_SUSPEND"
-.LASF380:
+.LASF381:
 	.string	"seqcount_t"
-.LASF1844:
+.LASF1845:
 	.string	"inode_operations"
-.LASF2449:
+.LASF2450:
 	.string	"port"
-.LASF2830:
+.LASF2831:
 	.string	"usercopy_fallback"
-.LASF925:
+.LASF926:
 	.string	"_dummy_pkey"
-.LASF2823:
+.LASF2824:
 	.string	"id_table"
-.LASF1612:
+.LASF1613:
 	.string	"dq_sb"
-.LASF901:
+.LASF902:
 	.string	"tick_device"
-.LASF127:
+.LASF128:
 	.string	"dedupe_file_range"
-.LASF1194:
+.LASF1195:
 	.string	"radix_tree_root"
-.LASF1123:
+.LASF1124:
 	.string	"sighand_struct"
-.LASF2839:
+.LASF2840:
 	.string	"sched_param"
-.LASF1351:
+.LASF1352:
 	.string	"tlb_flush_pending"
-.LASF170:
+.LASF171:
 	.string	"flags"
-.LASF710:
+.LASF711:
 	.string	"cpuset_slab_spread_rotor"
-.LASF1948:
+.LASF1949:
 	.string	"i_lock_key"
-.LASF1247:
+.LASF1248:
 	.string	"kmem_cache"
-.LASF2679:
+.LASF2680:
 	.string	"KCOMPACTD_FREE_SCANNED"
-.LASF417:
+.LASF418:
 	.string	"inode"
-.LASF2778:
+.LASF2779:
 	.string	"drivers_dir"
-.LASF1453:
+.LASF1454:
 	.string	"NR_ZONE_ACTIVE_ANON"
-.LASF166:
+.LASF167:
 	.string	"bug_entry"
-.LASF287:
+.LASF288:
 	.string	"__end_ro_after_init"
-.LASF1394:
+.LASF1395:
 	.string	"rw_sem"
-.LASF1772:
+.LASF1773:
 	.string	"dqio_sem"
-.LASF1058:
+.LASF1059:
 	.string	"prev_sum_exec_runtime"
-.LASF1737:
+.LASF1738:
 	.string	"gpl_future_syms"
-.LASF2877:
+.LASF2878:
 	.string	"EPD_FULL_GLR16"
-.LASF1041:
+.LASF1042:
 	.string	"nr_forced_migrations"
-.LASF2075:
+.LASF2076:
 	.string	"seq_operations"
-.LASF637:
+.LASF638:
 	.string	"stack_canary"
-.LASF1160:
+.LASF1161:
 	.string	"blksize"
-.LASF641:
+.LASF642:
 	.string	"sibling"
-.LASF1285:
+.LASF1286:
 	.string	"f_ra"
-.LASF1977:
+.LASF1978:
 	.string	"quota_write"
-.LASF1997:
+.LASF1998:
 	.string	"fi_extents_max"
-.LASF2480:
+.LASF2481:
 	.string	"translate"
-.LASF2521:
+.LASF2522:
 	.string	"set_scl"
-.LASF1856:
+.LASF1857:
 	.string	"rmdir"
-.LASF2132:
+.LASF2133:
 	.string	"sock"
-.LASF386:
+.LASF387:
 	.string	"hash_len"
-.LASF871:
+.LASF872:
 	.string	"HRTIMER_RESTART"
-.LASF2213:
+.LASF2214:
 	.string	"bus_dma_mask"
-.LASF561:
+.LASF562:
 	.string	"pidfd_fops"
-.LASF1916:
+.LASF1917:
 	.string	"lm_put_owner"
-.LASF3251:
+.LASF3255:
 	.string	"ebc_pmic_verity_vcom"
-.LASF2523:
+.LASF2524:
 	.string	"set_sda"
-.LASF473:
+.LASF474:
 	.string	"d_init"
-.LASF1307:
+.LASF1308:
 	.string	"core_thread"
-.LASF1781:
+.LASF1782:
 	.string	"address_space_operations"
-.LASF981:
+.LASF982:
 	.string	"vm_userfaultfd_ctx"
-.LASF2350:
+.LASF2351:
 	.string	"devnode"
-.LASF878:
+.LASF879:
 	.string	"cpu_base"
-.LASF1241:
+.LASF1242:
 	.string	"objects"
-.LASF2434:
+.LASF2435:
 	.string	"device_is_available"
-.LASF1604:
+.LASF1605:
 	.string	"dquot"
-.LASF1072:
+.LASF1073:
 	.string	"dl_runtime"
-.LASF84:
+.LASF85:
 	.string	"initcall_debug"
-.LASF559:
+.LASF560:
 	.string	"numbers"
-.LASF873:
+.LASF874:
 	.string	"_softexpires"
-.LASF2062:
+.LASF2063:
 	.string	"key_user"
-.LASF2070:
+.LASF2071:
 	.string	"printk_ratelimit_state"
-.LASF1367:
+.LASF1368:
 	.string	"semaphore"
-.LASF647:
+.LASF648:
 	.string	"thread_group"
-.LASF2334:
+.LASF2335:
 	.string	"shutdown"
-.LASF1609:
+.LASF1610:
 	.string	"dq_lock"
-.LASF1839:
+.LASF1840:
 	.string	"i_cdev"
-.LASF350:
+.LASF351:
 	.string	"sve_vl_onexec"
-.LASF1343:
+.LASF1344:
 	.string	"env_end"
-.LASF1628:
+.LASF1629:
 	.string	"dqb_bhardlimit"
-.LASF2034:
+.LASF2035:
 	.string	"extra1"
-.LASF700:
+.LASF701:
 	.string	"ptrace_message"
-.LASF1764:
+.LASF1765:
 	.string	"num_trace_events"
-.LASF918:
+.LASF919:
 	.string	"_sys_private"
-.LASF2422:
+.LASF2423:
 	.string	"properties"
-.LASF522:
+.LASF523:
 	.string	"s_subtype"
-.LASF70:
+.LASF71:
 	.string	"func"
-.LASF1140:
+.LASF1141:
 	.string	"perf_event_context"
-.LASF3001:
+.LASF3002:
 	.string	"ebc_auto_task"
-.LASF93:
+.LASF94:
 	.string	"printk_delay_msec"
-.LASF2698:
+.LASF2699:
 	.string	"mmap_pages_allocated"
-.LASF988:
+.LASF989:
 	.string	"tlbflush_unmap_batch"
-.LASF2172:
+.LASF2173:
 	.string	"power_group_name"
-.LASF778:
+.LASF779:
 	.string	"clock_event_device"
-.LASF1198:
+.LASF1199:
 	.string	"m_count"
-.LASF2163:
+.LASF2164:
 	.string	"hypervisor_kobj"
-.LASF604:
+.LASF605:
 	.string	"rcu_read_unlock_special"
-.LASF942:
+.LASF943:
 	.string	"siginfo"
-.LASF995:
+.LASF996:
 	.string	"read_bytes"
-.LASF322:
+.LASF323:
 	.string	"__hyp_text_end"
-.LASF1991:
+.LASF1992:
 	.string	"fsverity_operations"
-.LASF1090:
+.LASF1091:
 	.string	"wake_q_node"
-.LASF1116:
+.LASF1117:
 	.string	"request_key_auth"
-.LASF1953:
+.LASF1954:
 	.string	"destroy_inode"
-.LASF2964:
+.LASF2965:
 	.string	"is_busy_now"
-.LASF57:
+.LASF58:
 	.string	"irq_hw_number_t"
-.LASF2366:
+.LASF2367:
 	.string	"sysfs_dev_block_kobj"
-.LASF554:
+.LASF555:
 	.string	"upid"
-.LASF3280:
+.LASF3285:
 	.string	"down_write"
-.LASF1098:
+.LASF1099:
 	.string	"completion"
-.LASF3077:
+.LASF3078:
 	.string	"old_prev_buf"
-.LASF1499:
+.LASF1500:
 	.string	"NR_GPU_HEAP"
-.LASF860:
+.LASF861:
 	.string	"PCPU_FC_AUTO"
-.LASF1906:
+.LASF1907:
 	.string	"fl_break_time"
-.LASF1203:
+.LASF1204:
 	.string	"UTASK_SSTEP_ACK"
-.LASF76:
+.LASF77:
 	.string	"__con_initcall_end"
-.LASF1145:
+.LASF1146:
 	.string	"active_uprobe"
-.LASF3005:
+.LASF3006:
 	.string	"ebc_poweroff_wq"
-.LASF1971:
+.LASF1972:
 	.string	"show_options"
-.LASF2142:
+.LASF2143:
 	.string	"uevent_helper"
-.LASF3047:
+.LASF3048:
 	.string	"lut_buffer_phy"
-.LASF109:
+.LASF110:
 	.string	"mmap_supported_flags"
-.LASF50:
+.LASF51:
 	.string	"sector_t"
-.LASF1217:
+.LASF1218:
 	.string	"bp_hardening_cb_t"
-.LASF1808:
+.LASF1809:
 	.string	"bd_dev"
-.LASF1847:
+.LASF1848:
 	.string	"permission"
-.LASF1516:
+.LASF1517:
 	.string	"node_spanned_pages"
-.LASF920:
+.LASF921:
 	.string	"_utime"
-.LASF2248:
+.LASF2249:
 	.string	"pm_subsys_data"
-.LASF2349:
+.LASF2350:
 	.string	"device_type"
-.LASF1155:
+.LASF1156:
 	.string	"thread_union"
-.LASF1811:
+.LASF1812:
 	.string	"bd_super"
-.LASF2708:
+.LASF2709:
 	.string	"usermodehelper_table"
-.LASF159:
+.LASF160:
 	.string	"taint_flag"
-.LASF1978:
+.LASF1979:
 	.string	"get_dquots"
-.LASF2402:
+.LASF3264:
+	.string	"of_find_node_by_phandle"
+.LASF2403:
 	.string	"unmap_page"
-.LASF827:
+.LASF828:
 	.string	"system_unbound_wq"
-.LASF516:
+.LASF517:
 	.string	"s_uuid"
-.LASF1666:
+.LASF1667:
 	.string	"destroy_dquot"
-.LASF1678:
+.LASF1679:
 	.string	"d_ino_hardlimit"
-.LASF1876:
+.LASF1877:
 	.string	"fsverity_info"
-.LASF2040:
+.LASF2041:
 	.string	"nr_leaves_on_tree"
-.LASF1711:
+.LASF1712:
 	.string	"quota_on"
-.LASF2458:
+.LASF2459:
 	.string	"of_root"
-.LASF1295:
+.LASF1296:
 	.string	"vm_operations_struct"
-.LASF2390:
+.LASF2391:
 	.string	"hwirq_max"
-.LASF2198:
+.LASF3222:
+	.string	"__fswab32"
+.LASF2199:
 	.string	"runtime_idle"
-.LASF1892:
+.LASF1893:
 	.string	"fl_next"
-.LASF2526:
+.LASF2527:
 	.string	"unprepare_recovery"
-.LASF440:
+.LASF441:
 	.string	"i_state"
-.LASF593:
+.LASF594:
 	.string	"sched_class"
-.LASF1970:
+.LASF1971:
 	.string	"umount_end"
-.LASF691:
+.LASF692:
 	.string	"pi_waiters"
-.LASF2657:
+.LASF2658:
 	.string	"PGSCAN_DIRECT"
-.LASF1256:
+.LASF1257:
 	.string	"pt_frag_refcount"
-.LASF1848:
+.LASF1849:
 	.string	"permission2"
-.LASF1705:
+.LASF1706:
 	.string	"i_ino_timelimit"
-.LASF225:
+.LASF226:
 	.string	"cnts"
-.LASF2240:
+.LASF2241:
 	.string	"RPM_SUSPENDED"
-.LASF697:
+.LASF698:
 	.string	"reclaim_state"
-.LASF3289:
+.LASF3295:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
-.LASF137:
+.LASF138:
 	.string	"vendor_panic_cb"
-.LASF3072:
+.LASF3073:
 	.string	"ebc_vdd_power_timeout"
-.LASF3141:
+.LASF3142:
 	.string	"ebc_get_4pix_wf"
-.LASF2798:
+.LASF2799:
 	.string	"num_symtab"
-.LASF1598:
+.LASF1599:
 	.string	"cpu_scale"
-.LASF2645:
+.LASF2646:
 	.string	"PGSCAN_SKIP_MOVABLE"
-.LASF1955:
+.LASF1956:
 	.string	"write_inode"
-.LASF414:
+.LASF415:
 	.string	"d_fsdata"
-.LASF2241:
+.LASF2242:
 	.string	"RPM_SUSPENDING"
-.LASF2612:
+.LASF2613:
 	.string	"mmap_rnd_bits_max"
-.LASF1231:
+.LASF1232:
 	.string	"nrpages"
-.LASF845:
+.LASF846:
 	.string	"_refcount"
-.LASF465:
+.LASF466:
 	.string	"i_crypt_info"
-.LASF1871:
+.LASF1872:
 	.string	"flc_flock"
-.LASF2776:
+.LASF2777:
 	.string	"module_alloc_base"
-.LASF1751:
+.LASF1752:
 	.string	"core_kallsyms"
-.LASF3253:
+.LASF3258:
 	.string	"memcpy"
-.LASF2894:
+.LASF2895:
 	.string	"EPD_FORCE_FULL"
-.LASF2400:
+.LASF2401:
 	.string	"get_sgtable"
-.LASF3121:
+.LASF3122:
 	.string	"xor_val"
-.LASF2155:
+.LASF2156:
 	.string	"envp_idx"
-.LASF464:
+.LASF465:
 	.string	"i_fsnotify_marks"
-.LASF2015:
+.LASF2016:
 	.string	"state_add_uevent_sent"
-.LASF2668:
+.LASF2669:
 	.string	"OOM_KILL"
-.LASF444:
+.LASF445:
 	.string	"i_hash"
-.LASF3104:
+.LASF3105:
 	.string	"gray_old"
-.LASF67:
+.LASF68:
 	.string	"hlist_node"
-.LASF3261:
+.LASF3267:
 	.string	"sprintf"
-.LASF1908:
+.LASF1909:
 	.string	"fl_ops"
-.LASF1715:
+.LASF1716:
 	.string	"quota_sync"
-.LASF2707:
+.LASF2708:
 	.string	"debug_guardpage_ops"
-.LASF2673:
+.LASF2674:
 	.string	"COMPACTISOLATED"
-.LASF3231:
+.LASF3235:
 	.string	"of_property_read_variable_u32_array"
-.LASF327:
+.LASF328:
 	.string	"__inittext_begin"
-.LASF1395:
+.LASF1396:
 	.string	"writer"
-.LASF763:
+.LASF764:
 	.string	"arch_timer_read_counter"
-.LASF269:
+.LASF270:
 	.string	"ftr_bits"
-.LASF627:
+.LASF628:
 	.string	"sched_remote_wakeup"
-.LASF2179:
+.LASF2180:
 	.string	"resume"
-.LASF690:
+.LASF691:
 	.string	"wake_q"
-.LASF2675:
+.LASF2676:
 	.string	"COMPACTFAIL"
-.LASF695:
+.LASF696:
 	.string	"bio_list"
-.LASF1664:
+.LASF1665:
 	.string	"write_dquot"
-.LASF2652:
+.LASF2653:
 	.string	"PGLAZYFREED"
-.LASF1348:
+.LASF1349:
 	.string	"ioctx_lock"
-.LASF310:
+.LASF311:
 	.string	"current_stack_pointer"
-.LASF2834:
+.LASF2835:
 	.string	"NR_KMALLOC_TYPES"
-.LASF1208:
+.LASF1209:
 	.string	"dup_xol_addr"
-.LASF2474:
+.LASF2475:
 	.string	"DOMAIN_BUS_WAKEUP"
-.LASF1222:
+.LASF1223:
 	.string	"arm64_el2_vector_last_slot"
-.LASF3284:
+.LASF3290:
 	.string	"queue_work_on"
-.LASF2335:
+.LASF2336:
 	.string	"online"
-.LASF2197:
+.LASF2198:
 	.string	"runtime_resume"
-.LASF1207:
+.LASF1208:
 	.string	"dup_xol_work"
-.LASF3162:
+.LASF3163:
 	.string	"ebc_pmic_read_temp"
-.LASF2875:
+.LASF2876:
 	.string	"EPD_FULL_GC16"
-.LASF3014:
+.LASF3015:
 	.string	"dev_attr_ebc_state"
-.LASF2161:
+.LASF2162:
 	.string	"kernel_kobj"
-.LASF2587:
+.LASF2588:
 	.string	"funcs"
-.LASF2997:
+.LASF2998:
 	.string	"overlay_enable"
-.LASF1107:
+.LASF1108:
 	.string	"securebits"
-.LASF2712:
+.LASF2713:
 	.string	"Elf64_Off"
-.LASF1327:
+.LASF1328:
 	.string	"total_vm"
-.LASF622:
+.LASF623:
 	.string	"jobctl"
-.LASF2873:
+.LASF2874:
 	.string	"EPD_AUTO"
-.LASF331:
+.LASF332:
 	.string	"__entry_tramp_text_start"
-.LASF849:
+.LASF850:
 	.string	"node_list"
-.LASF2471:
+.LASF2472:
 	.string	"DOMAIN_BUS_NEXUS"
-.LASF2038:
+.LASF2039:
 	.string	"sysctl_mount_point"
-.LASF2993:
+.LASF2994:
 	.string	"auto_buffer_work"
-.LASF266:
+.LASF267:
 	.string	"user_mask"
-.LASF2742:
+.LASF2743:
 	.string	"kernel_param"
-.LASF2281:
+.LASF2282:
 	.string	"deferred_resume"
-.LASF1677:
+.LASF1678:
 	.string	"d_spc_softlimit"
-.LASF53:
+.LASF54:
 	.string	"gfp_t"
-.LASF337:
+.LASF338:
 	.string	"bps_disabled"
-.LASF905:
+.LASF906:
 	.string	"seccomp_filter"
-.LASF779:
+.LASF780:
 	.string	"timer_unstable_counter_workaround"
-.LASF653:
+.LASF654:
 	.string	"stime"
-.LASF1229:
+.LASF1230:
 	.string	"i_mmap"
-.LASF1152:
+.LASF1153:
 	.string	"phys_addr"
-.LASF397:
+.LASF398:
 	.string	"d_lru"
-.LASF2408:
+.LASF2409:
 	.string	"sync_single_for_device"
-.LASF1122:
+.LASF1123:
 	.string	"signal_struct"
-.LASF799:
+.LASF800:
 	.string	"WORK_STRUCT_COLOR_BITS"
-.LASF718:
+.LASF719:
 	.string	"perf_event_mutex"
-.LASF1130:
+.LASF1131:
 	.string	"nr_batch_requests"
-.LASF1459:
+.LASF1460:
 	.string	"NR_PAGETABLE"
-.LASF1728:
+.LASF1729:
 	.string	"crcs"
-.LASF2683:
+.LASF2684:
 	.string	"UNEVICTABLE_PGMLOCKED"
-.LASF836:
+.LASF837:
 	.string	"pgdval_t"
-.LASF2916:
+.LASF2917:
 	.string	"page_link"
-.LASF1859:
+.LASF1860:
 	.string	"setattr"
-.LASF935:
+.LASF936:
 	.string	"_pad"
-.LASF1290:
+.LASF1291:
 	.string	"f_mapping"
-.LASF2176:
+.LASF2177:
 	.string	"prepare"
-.LASF2138:
+.LASF2139:
 	.string	"bin_attrs"
-.LASF2926:
+.LASF2927:
 	.string	"HYPERVISOR_shared_info"
-.LASF682:
+.LASF683:
 	.string	"sas_ss_flags"
-.LASF1280:
+.LASF1281:
 	.string	"f_mode"
-.LASF1429:
+.LASF1430:
 	.string	"ki_complete"
-.LASF3030:
+.LASF3031:
 	.string	"ebc_tcon_pdev"
-.LASF1755:
+.LASF1756:
 	.string	"percpu"
-.LASF583:
+.LASF584:
 	.string	"wakee_flips"
-.LASF1867:
+.LASF1868:
 	.string	"set_acl"
-.LASF2060:
+.LASF2061:
 	.string	"keys"
-.LASF298:
+.LASF299:
 	.string	"__irqentry_text_start"
-.LASF563:
+.LASF564:
 	.string	"overflowuid"
-.LASF829:
+.LASF830:
 	.string	"system_power_efficient_wq"
-.LASF2201:
+.LASF2202:
 	.string	"driver"
-.LASF1544:
+.LASF1545:
 	.string	"ZONE_NORMAL"
-.LASF3127:
+.LASF3128:
 	.string	"image_new_data"
-.LASF425:
+.LASF426:
 	.string	"i_op"
-.LASF1686:
+.LASF1687:
 	.string	"d_rt_spc_hardlimit"
-.LASF2976:
+.LASF2977:
 	.string	"ebc_task"
-.LASF2126:
+.LASF2127:
 	.string	"kobj_ns_type_operations"
-.LASF1392:
+.LASF1393:
 	.string	"percpu_rw_semaphore"
-.LASF596:
+.LASF597:
 	.string	"boost_period"
-.LASF2456:
+.LASF2457:
 	.string	"of_node_ktype"
-.LASF668:
+.LASF669:
 	.string	"cred"
-.LASF240:
+.LASF241:
 	.string	"jump_entry"
-.LASF2611:
+.LASF2612:
 	.string	"mmap_rnd_bits_min"
-.LASF1443:
+.LASF1444:
 	.string	"migratetype_names"
-.LASF1183:
+.LASF1184:
 	.string	"list_lru_node"
-.LASF393:
+.LASF394:
 	.string	"age_limit"
-.LASF2880:
+.LASF2881:
 	.string	"EPD_PART_GC16"
-.LASF236:
+.LASF237:
 	.string	"spinlock_t"
-.LASF2129:
+.LASF2130:
 	.string	"netlink_ns"
-.LASF362:
+.LASF363:
 	.string	"wait_queue_head"
-.LASF791:
+.LASF792:
 	.string	"work_func_t"
-.LASF2222:
+.LASF2223:
 	.string	"fwnode"
-.LASF1799:
+.LASF1800:
 	.string	"is_dirty_writeback"
-.LASF301:
+.LASF302:
 	.string	"__softirqentry_text_end"
-.LASF1762:
+.LASF1763:
 	.string	"trace_bprintk_fmt_start"
-.LASF665:
+.LASF666:
 	.string	"cpu_timers"
-.LASF2950:
+.LASF2951:
 	.string	"disable"
-.LASF1300:
+.LASF1301:
 	.string	"huge_fault"
-.LASF2008:
+.LASF2009:
 	.string	"kstatfs"
-.LASF3165:
+.LASF3166:
 	.string	"ebc_pmic_power_off"
-.LASF2634:
+.LASF2635:
 	.string	"PGPGOUTCLEAN"
-.LASF580:
+.LASF581:
 	.string	"ptrace"
-.LASF2303:
+.LASF2304:
 	.string	"max_time"
-.LASF1593:
+.LASF1594:
 	.string	"package_id"
-.LASF103:
+.LASF104:
 	.string	"iterate"
-.LASF1184:
+.LASF1185:
 	.string	"memcg_lrus"
-.LASF1835:
+.LASF1836:
 	.string	"i_dentry"
-.LASF2128:
+.LASF2129:
 	.string	"grab_current_ns"
-.LASF3045:
+.LASF3046:
 	.string	"fb_size"
-.LASF883:
+.LASF884:
 	.string	"offset"
-.LASF1266:
+.LASF1267:
 	.string	"altmap"
-.LASF1874:
+.LASF1875:
 	.string	"fsnotify_mark_connector"
-.LASF941:
+.LASF942:
 	.string	"_sigsys"
-.LASF3090:
+.LASF3091:
 	.string	"ebc_lut_update"
-.LASF1921:
+.LASF1922:
 	.string	"lm_setup"
-.LASF426:
+.LASF427:
 	.string	"i_sb"
-.LASF347:
+.LASF348:
 	.string	"fpsimd_cpu"
-.LASF2790:
+.LASF2791:
 	.string	"MODULE_STATE_UNFORMED"
-.LASF193:
+.LASF194:
 	.string	"expires"
-.LASF1380:
+.LASF1381:
 	.string	"rcuwait"
-.LASF329:
+.LASF330:
 	.string	"__mmuoff_data_start"
-.LASF659:
+.LASF660:
 	.string	"nivcsw"
-.LASF2497:
+.LASF2498:
 	.string	"i2c_adapter"
-.LASF1372:
+.LASF1373:
 	.string	"fe_reserved64"
-.LASF2378:
+.LASF2379:
 	.string	"DL_DEV_UNBINDING"
-.LASF354:
+.LASF355:
 	.string	"signal_minsigstksz"
-.LASF750:
+.LASF751:
 	.string	"thread"
-.LASF2348:
+.LASF2349:
 	.string	"subsys_private"
-.LASF2561:
+.LASF2562:
 	.string	"idmap_pg_dir"
-.LASF2518:
+.LASF2519:
 	.string	"i2c_bus_recovery_info"
-.LASF3048:
+.LASF3049:
 	.string	"lut_buffer_size"
-.LASF483:
+.LASF484:
 	.string	"s_dev"
-.LASF345:
+.LASF346:
 	.string	"fpsimd_state"
-.LASF1662:
+.LASF1663:
 	.string	"get_next_id"
-.LASF237:
+.LASF238:
 	.string	"rwlock_t"
-.LASF3288:
+.LASF3294:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
-.LASF840:
+.LASF841:
 	.string	"pgprot"
 .LASF17:
 	.string	"false"
-.LASF1974:
+.LASF1975:
 	.string	"show_path"
-.LASF1252:
-	.string	"_compound_pad_1"
 .LASF1253:
+	.string	"_compound_pad_1"
+.LASF1254:
 	.string	"_compound_pad_2"
-.LASF550:
+.LASF551:
 	.string	"PIDTYPE_TGID"
-.LASF1915:
+.LASF1916:
 	.string	"lm_get_owner"
-.LASF2903:
+.LASF2904:
 	.string	"drvpar"
-.LASF2631:
+.LASF2632:
 	.string	"vm_event_item"
-.LASF2570:
+.LASF2571:
 	.string	"kthreadd_task"
-.LASF1805:
+.LASF1806:
 	.string	"swap_info_struct"
-.LASF87:
+.LASF88:
 	.string	"__icache_flags"
-.LASF147:
+.LASF148:
 	.string	"crash_kexec_post_notifiers"
-.LASF3150:
+.LASF3151:
 	.string	"eink_mode"
-.LASF1697:
+.LASF1698:
 	.string	"rt_spc_warnlimit"
-.LASF1190:
+.LASF1191:
 	.string	"exceptional"
-.LASF1995:
+.LASF1996:
 	.string	"fi_flags"
-.LASF1579:
+.LASF1580:
 	.string	"blocking_notifier_head"
-.LASF2347:
+.LASF2348:
 	.string	"coredump"
-.LASF277:
+.LASF278:
 	.string	"_data"
-.LASF1533:
+.LASF1534:
 	.string	"vm_stat"
-.LASF557:
+.LASF558:
 	.string	"tasks"
-.LASF913:
+.LASF914:
 	.string	"_pid"
-.LASF1156:
+.LASF1157:
 	.string	"init_stack"
-.LASF3133:
+.LASF3134:
 	.string	"dmask"
-.LASF1225:
+.LASF1226:
 	.string	"address_space"
-.LASF1216:
+.LASF1217:
 	.string	"mm_context_t"
-.LASF1311:
+.LASF1312:
 	.string	"startup"
-.LASF1418:
+.LASF1419:
 	.string	"sysctl_nr_open"
-.LASF81:
+.LASF82:
 	.string	"reset_devices"
-.LASF2979:
+.LASF2980:
 	.string	"auto_image_bg"
-.LASF446:
+.LASF447:
 	.string	"i_wb"
-.LASF2086:
+.LASF2087:
 	.string	"idr_next"
-.LASF3118:
+.LASF3119:
 	.string	"frame_count_data"
-.LASF2955:
+.LASF2956:
 	.string	"frame_start"
-.LASF1250:
+.LASF1251:
 	.string	"compound_order"
-.LASF1254:
+.LASF1255:
 	.string	"deferred_list"
-.LASF953:
+.LASF954:
 	.string	"locked_shm"
-.LASF1085:
+.LASF1086:
 	.string	"inactive_timer"
-.LASF926:
+.LASF927:
 	.string	"_pkey"
-.LASF288:
+.LASF289:
 	.string	"_end"
-.LASF477:
+.LASF478:
 	.string	"d_dname"
-.LASF1730:
+.LASF1731:
 	.string	"param_lock"
-.LASF972:
+.LASF973:
 	.string	"vm_page_prot"
-.LASF178:
+.LASF179:
 	.string	"timespec64"
-.LASF552:
+.LASF553:
 	.string	"PIDTYPE_SID"
-.LASF2405:
+.LASF2406:
 	.string	"map_resource"
-.LASF475:
+.LASF476:
 	.string	"d_prune"
-.LASF82:
+.LASF83:
 	.string	"rodata_enabled"
-.LASF2067:
+.LASF2068:
 	.string	"printed"
-.LASF317:
+.LASF318:
 	.string	"__hibernate_exit_text_start"
-.LASF2191:
+.LASF2192:
 	.string	"resume_noirq"
-.LASF1550:
+.LASF1551:
 	.string	"lowmem_reserve"
-.LASF844:
+.LASF845:
 	.string	"page"
-.LASF1673:
+.LASF1674:
 	.string	"get_inode_usage"
-.LASF2419:
+.LASF2420:
 	.string	"device_node"
-.LASF591:
+.LASF592:
 	.string	"normal_prio"
-.LASF1288:
+.LASF1289:
 	.string	"f_ep_links"
-.LASF3131:
+.LASF3132:
 	.string	"image_fb_tmp"
-.LASF2294:
+.LASF2295:
 	.string	"last_busy"
-.LASF1837:
+.LASF1838:
 	.string	"i_pipe"
-.LASF874:
+.LASF875:
 	.string	"base"
-.LASF1226:
+.LASF1227:
 	.string	"host"
-.LASF184:
+.LASF185:
 	.string	"uaddr"
-.LASF3279:
+.LASF3287:
 	.string	"ebc_remove_from_dsp_buf_list"
-.LASF661:
+.LASF662:
 	.string	"real_start_time"
 .LASF28:
 	.string	"__kernel_time_t"
-.LASF1992:
+.LASF1993:
 	.string	"unicode_map"
-.LASF2567:
+.LASF2568:
 	.string	"MEMREMAP_WC"
-.LASF2444:
+.LASF2445:
 	.string	"graph_get_remote_endpoint"
-.LASF1567:
+.LASF1568:
 	.string	"contiguous"
-.LASF1330:
+.LASF1331:
 	.string	"exec_vm"
-.LASF2566:
+.LASF2567:
 	.string	"MEMREMAP_WT"
-.LASF2722:
+.LASF2723:
 	.string	"st_name"
-.LASF227:
+.LASF228:
 	.string	"wait_lock"
-.LASF1809:
+.LASF1810:
 	.string	"bd_openers"
-.LASF701:
+.LASF702:
 	.string	"last_siginfo"
-.LASF1952:
+.LASF1953:
 	.string	"alloc_inode"
-.LASF2833:
+.LASF2834:
 	.string	"KMALLOC_RECLAIM"
-.LASF409:
+.LASF410:
 	.string	"d_iname"
-.LASF2225:
+.LASF2226:
 	.string	"devres_head"
-.LASF427:
+.LASF428:
 	.string	"i_mapping"
-.LASF3255:
+.LASF3259:
 	.string	"misc_register"
-.LASF722:
+.LASF723:
 	.string	"rseq_sig"
-.LASF3184:
+.LASF3185:
 	.string	"platform_set_drvdata"
-.LASF342:
+.LASF343:
 	.string	"cpu_context"
-.LASF2315:
+.LASF2316:
 	.string	"dev_pm_domain"
-.LASF1513:
+.LASF1514:
 	.string	"nr_zones"
-.LASF3207:
+.LASF3208:
 	.string	"is_source"
-.LASF1375:
+.LASF1376:
 	.string	"migrate_mode"
-.LASF2688:
+.LASF2689:
 	.string	"SWAP_RA_HIT"
-.LASF616:
+.LASF617:
 	.string	"vmacache"
-.LASF1445:
+.LASF1446:
 	.string	"free_area"
-.LASF1523:
+.LASF1524:
 	.string	"kswapd_failures"
-.LASF2188:
+.LASF2189:
 	.string	"poweroff_late"
-.LASF876:
+.LASF877:
 	.string	"is_soft"
-.LASF175:
+.LASF176:
 	.string	"timezone"
-.LASF405:
+.LASF406:
 	.string	"d_hash"
-.LASF1075:
+.LASF1076:
 	.string	"dl_bw"
-.LASF3177:
+.LASF3178:
 	.string	"limit"
-.LASF2145:
+.LASF2146:
 	.string	"kobj"
-.LASF3262:
+.LASF3268:
 	.string	"kstrtouint"
-.LASF113:
+.LASF114:
 	.string	"fsync"
-.LASF1993:
+.LASF1994:
 	.string	"mtd_info"
-.LASF422:
+.LASF423:
 	.string	"i_flags"
-.LASF2892:
+.LASF2893:
 	.string	"EPD_RESUME"
-.LASF3250:
+.LASF3254:
 	.string	"sscanf"
-.LASF3246:
+.LASF3250:
 	.string	"ebc_empty_buf_get"
-.LASF1474:
+.LASF1475:
 	.string	"NR_ISOLATED_ANON"
-.LASF3046:
+.LASF3047:
 	.string	"ebc_lut_table_init"
-.LASF1213:
+.LASF1214:
 	.string	"uprobes_state"
-.LASF1553:
+.LASF1554:
 	.string	"cma_alloc"
-.LASF850:
+.LASF851:
 	.string	"rb_node"
-.LASF613:
+.LASF614:
 	.string	"pushable_tasks"
-.LASF3132:
+.LASF3133:
 	.string	"image_bg_tmp"
-.LASF2202:
+.LASF2203:
 	.string	"platform_data"
-.LASF1396:
+.LASF1397:
 	.string	"readers_block"
-.LASF676:
+.LASF677:
 	.string	"sighand"
-.LASF104:
+.LASF105:
 	.string	"iterate_shared"
-.LASF2135:
+.LASF2136:
 	.string	"is_visible"
-.LASF675:
+.LASF676:
 	.string	"signal"
-.LASF2121:
+.LASF2122:
 	.string	"released"
-.LASF2617:
+.LASF2618:
 	.string	"sysctl_max_map_count"
-.LASF1665:
+.LASF1666:
 	.string	"alloc_dquot"
-.LASF2173:
+.LASF2174:
 	.string	"pm_message"
-.LASF524:
+.LASF525:
 	.string	"cleancache_poolid"
-.LASF846:
+.LASF847:
 	.string	"mem_cgroup"
-.LASF1015:
+.LASF1016:
 	.string	"last_update_time"
-.LASF1137:
+.LASF1138:
 	.string	"robust_list_head"
-.LASF3244:
+.LASF3248:
 	.string	"init_timer_key"
-.LASF1480:
+.LASF1481:
 	.string	"NR_ANON_MAPPED"
-.LASF382:
+.LASF383:
 	.string	"count"
-.LASF556:
+.LASF557:
 	.string	"level"
-.LASF531:
+.LASF532:
 	.string	"s_user_ns"
-.LASF1725:
+.LASF1726:
 	.string	"srcversion"
-.LASF858:
+.LASF859:
 	.string	"pcpu_unit_offsets"
-.LASF3153:
+.LASF3154:
 	.string	"dma_sync_single_for_device"
-.LASF2956:
+.LASF2957:
 	.string	"dsp_end_callback"
-.LASF460:
+.LASF461:
 	.string	"i_data"
-.LASF2007:
+.LASF2008:
 	.string	"poll_event"
-.LASF2556:
+.LASF2557:
 	.string	"softirq_to_name"
-.LASF65:
+.LASF66:
 	.string	"hlist_head"
-.LASF505:
+.LASF506:
 	.string	"s_encoding_flags"
-.LASF1053:
+.LASF1054:
 	.string	"runnable_weight"
-.LASF2446:
+.LASF2447:
 	.string	"graph_parse_endpoint"
-.LASF1401:
+.LASF1402:
 	.string	"uuid_null"
-.LASF1331:
+.LASF1332:
 	.string	"stack_vm"
-.LASF2276:
+.LASF2277:
 	.string	"usage_count"
-.LASF2077:
+.LASF2078:
 	.string	"show"
-.LASF3011:
+.LASF3012:
 	.string	"dev_attr_pmic_temp"
 .LASF7:
 	.string	"unsigned char"
-.LASF1969:
+.LASF1970:
 	.string	"umount_begin"
-.LASF1215:
+.LASF1216:
 	.string	"vdso"
-.LASF1315:
+.LASF1316:
 	.string	"mmap_legacy_base"
-.LASF2664:
+.LASF2665:
 	.string	"PAGEOUTRUN"
-.LASF982:
+.LASF983:
 	.string	"task_rss_stat"
-.LASF1141:
+.LASF1142:
 	.string	"pipe_inode_info"
-.LASF2983:
+.LASF2984:
 	.string	"ebc_power_status"
-.LASF960:
+.LASF961:
 	.string	"ratelimit"
-.LASF2488:
+.LASF2489:
 	.string	"word"
-.LASF2013:
+.LASF2014:
 	.string	"state_initialized"
-.LASF848:
+.LASF849:
 	.string	"prio_list"
-.LASF2542:
+.LASF2543:
 	.string	"nmi_contexts"
-.LASF2146:
+.LASF2147:
 	.string	"uevent_ops"
-.LASF545:
+.LASF546:
 	.string	"rename_lock"
-.LASF3078:
+.LASF3079:
 	.string	"__out"
-.LASF680:
+.LASF681:
 	.string	"sas_ss_sp"
-.LASF1452:
+.LASF1453:
 	.string	"NR_ZONE_INACTIVE_ANON"
-.LASF728:
+.LASF729:
 	.string	"nr_dirtied"
-.LASF3194:
+.LASF3195:
 	.string	"dev_get_drvdata"
-.LASF2395:
+.LASF2396:
 	.string	"linear_revmap"
-.LASF334:
+.LASF335:
 	.string	"arm64_dma_phys_limit"
-.LASF1450:
+.LASF1451:
 	.string	"NR_FREE_PAGES"
-.LASF521:
+.LASF522:
 	.string	"s_vfs_rename_mutex"
-.LASF2184:
+.LASF2185:
 	.string	"suspend_late"
-.LASF2265:
+.LASF2266:
 	.string	"wakeup"
-.LASF712:
+.LASF713:
 	.string	"cg_list"
-.LASF1820:
+.LASF1821:
 	.string	"bd_partno"
-.LASF1941:
+.LASF1942:
 	.string	"alloc_mnt_data"
-.LASF1827:
+.LASF1828:
 	.string	"bd_list"
-.LASF2264:
+.LASF2265:
 	.string	"driver_flags"
-.LASF1197:
+.LASF1198:
 	.string	"rw_semaphore"
-.LASF2185:
+.LASF2186:
 	.string	"resume_early"
-.LASF1934:
+.LASF1935:
 	.string	"fa_rcu"
-.LASF1866:
+.LASF1867:
 	.string	"tmpfile"
-.LASF1773:
+.LASF1774:
 	.string	"info"
-.LASF154:
+.LASF155:
 	.string	"SYSTEM_HALT"
-.LASF1863:
+.LASF1864:
 	.string	"fiemap"
-.LASF2431:
+.LASF2432:
 	.string	"waiters"
-.LASF2704:
+.LASF2705:
 	.string	"sysctl_memory_failure_early_kill"
-.LASF2760:
+.LASF2761:
 	.string	"param_ops_bool_enable_only"
-.LASF3138:
+.LASF3139:
 	.string	"power_status"
-.LASF306:
+.LASF307:
 	.string	"__start_opd"
-.LASF3258:
+.LASF3263:
 	.string	"of_find_i2c_device_by_node"
-.LASF153:
+.LASF154:
 	.string	"SYSTEM_RUNNING"
-.LASF2850:
+.LASF2851:
 	.string	"WF_TYPE_GLR16"
-.LASF946:
+.LASF947:
 	.string	"_sifields"
-.LASF2024:
+.LASF2025:
 	.string	"page_symlink_inode_operations"
-.LASF735:
+.LASF736:
 	.string	"memcg_in_oom"
-.LASF479:
+.LASF480:
 	.string	"d_manage"
-.LASF1133:
+.LASF1134:
 	.string	"icq_hint"
-.LASF1994:
+.LASF1995:
 	.string	"fiemap_extent_info"
-.LASF2912:
+.LASF2913:
 	.string	"DMA_TO_DEVICE"
-.LASF2729:
+.LASF2730:
 	.string	"elf64_shdr"
-.LASF297:
+.LASF298:
 	.string	"__end_rodata"
-.LASF770:
+.LASF771:
 	.string	"match_type"
-.LASF2747:
+.LASF2748:
 	.string	"elem"
-.LASF892:
+.LASF893:
 	.string	"nr_retries"
-.LASF2658:
+.LASF2659:
 	.string	"PGSCAN_DIRECT_THROTTLE"
-.LASF912:
+.LASF913:
 	.string	"sigval_t"
-.LASF1933:
+.LASF1934:
 	.string	"fa_file"
-.LASF2999:
+.LASF3000:
 	.string	"panel"
-.LASF2432:
+.LASF2433:
 	.string	"irq_data"
-.LASF3085:
+.LASF3086:
 	.string	"old_buffer_temp"
-.LASF2705:
+.LASF2706:
 	.string	"sysctl_memory_failure_recovery"
-.LASF2692:
+.LASF2693:
 	.string	"vm_event_states"
-.LASF406:
+.LASF407:
 	.string	"d_parent"
-.LASF2068:
+.LASF2069:
 	.string	"missed"
-.LASF149:
+.LASF150:
 	.string	"root_mountflags"
-.LASF1976:
+.LASF1977:
 	.string	"quota_read"
-.LASF2725:
+.LASF2726:
 	.string	"st_shndx"
-.LASF2399:
+.LASF2400:
 	.string	"free"
-.LASF3053:
+.LASF3054:
 	.string	"pmic_vcom_write"
-.LASF2133:
+.LASF2134:
 	.string	"attribute"
-.LASF448:
+.LASF449:
 	.string	"i_wb_frn_avg_time"
-.LASF2656:
+.LASF2657:
 	.string	"PGSCAN_KSWAPD"
-.LASF1829:
+.LASF1830:
 	.string	"bd_fsfreeze_count"
-.LASF192:
+.LASF193:
 	.string	"type"
-.LASF163:
+.LASF164:
 	.string	"taint_flags"
-.LASF1347:
+.LASF1348:
 	.string	"membarrier_state"
-.LASF3144:
+.LASF3145:
 	.string	"pre_image_addr"
-.LASF2178:
+.LASF2179:
 	.string	"suspend"
-.LASF1742:
+.LASF1743:
 	.string	"init"
-.LASF1121:
+.LASF1122:
 	.string	"files_struct"
-.LASF102:
+.LASF103:
 	.string	"write_iter"
-.LASF499:
+.LASF500:
 	.string	"s_security"
-.LASF656:
+.LASF657:
 	.string	"max_state"
-.LASF529:
+.LASF530:
 	.string	"s_dio_done_wq"
-.LASF2667:
+.LASF2668:
 	.string	"DROP_SLAB"
-.LASF922:
+.LASF923:
 	.string	"_dummy_bnd"
-.LASF681:
+.LASF682:
 	.string	"sas_ss_size"
-.LASF2468:
+.LASF2469:
 	.string	"DOMAIN_BUS_WIRED"
-.LASF1049:
+.LASF1050:
 	.string	"nr_wakeups_passive"
-.LASF1937:
+.LASF1938:
 	.string	"file_system_type"
-.LASF2023:
+.LASF2024:
 	.string	"generic_ro_fops"
-.LASF1165:
+.LASF1166:
 	.string	"mtime"
-.LASF1356:
+.LASF1357:
 	.string	"vm_fault"
-.LASF1382:
+.LASF1383:
 	.string	"RCU_SYNC"
-.LASF1556:
+.LASF1557:
 	.string	"spanned_pages"
-.LASF2152:
+.LASF2153:
 	.string	"kobj_uevent_env"
-.LASF2097:
+.LASF2098:
 	.string	"deactivate_waitq"
-.LASF1010:
+.LASF1011:
 	.string	"inv_weight"
-.LASF1954:
+.LASF1955:
 	.string	"dirty_inode"
-.LASF1569:
+.LASF1570:
 	.string	"vm_numa_stat"
-.LASF1512:
+.LASF1513:
 	.string	"node_zonelists"
-.LASF541:
+.LASF542:
 	.string	"path"
-.LASF2727:
+.LASF2728:
 	.string	"st_size"
-.LASF3015:
+.LASF3016:
 	.string	"dev_attr_ebc_buf_state"
-.LASF188:
+.LASF189:
 	.string	"rmtp"
-.LASF2426:
+.LASF2427:
 	.string	"platform_notify_remove"
-.LASF1027:
+.LASF1028:
 	.string	"wait_sum"
-.LASF1757:
+.LASF1758:
 	.string	"num_tracepoints"
-.LASF619:
+.LASF620:
 	.string	"exit_code"
-.LASF1056:
+.LASF1057:
 	.string	"exec_start"
-.LASF2381:
+.LASF2382:
 	.string	"consumers"
-.LASF2098:
+.LASF2099:
 	.string	"kernfs_elem_symlink"
-.LASF1181:
+.LASF1182:
 	.string	"nr_items"
-.LASF2505:
+.LASF2506:
 	.string	"userspace_clients_lock"
-.LASF886:
+.LASF887:
 	.string	"clock_was_set_seq"
-.LASF1286:
+.LASF1287:
 	.string	"f_version"
-.LASF140:
+.LASF141:
 	.string	"panic_timeout"
-.LASF1199:
+.LASF1200:
 	.string	"arch_uprobe_task"
-.LASF458:
+.LASF459:
 	.string	"i_fop"
-.LASF2886:
+.LASF2887:
 	.string	"EPD_A2_DITHER"
-.LASF1853:
+.LASF1854:
 	.string	"unlink"
-.LASF2717:
+.LASF2718:
 	.string	"d_ptr"
-.LASF3055:
+.LASF3056:
 	.string	"pmic_temp_read"
-.LASF1652:
+.LASF1653:
 	.string	"dqstats"
-.LASF1019:
+.LASF1020:
 	.string	"period_contrib"
-.LASF605:
+.LASF606:
 	.string	"rcu_node_entry"
-.LASF1668:
+.LASF1669:
 	.string	"release_dquot"
-.LASF1414:
+.LASF1415:
 	.string	"max_files"
-.LASF1106:
+.LASF1107:
 	.string	"fsgid"
-.LASF2340:
+.LASF2341:
 	.string	"need_parent_lock"
-.LASF1385:
+.LASF1386:
 	.string	"rcu_sync"
-.LASF2613:
+.LASF2614:
 	.string	"mmap_rnd_bits"
-.LASF2461:
+.LASF2462:
 	.string	"of_stdout"
-.LASF3076:
+.LASF3077:
 	.string	"new_prev_buf"
-.LASF976:
+.LASF977:
 	.string	"vm_ops"
-.LASF2932:
+.LASF2933:
 	.string	"ebc_panel"
-.LASF1302:
+.LASF1303:
 	.string	"pagesize"
-.LASF485:
+.LASF486:
 	.string	"s_blocksize"
-.LASF977:
+.LASF978:
 	.string	"vm_pgoff"
-.LASF2301:
+.LASF2302:
 	.string	"timer"
-.LASF2462:
+.LASF2463:
 	.string	"devtree_lock"
-.LASF3135:
+.LASF3136:
 	.string	"refresh_new_image_auto"
-.LASF3066:
+.LASF3067:
 	.string	"__ret"
-.LASF1864:
+.LASF1865:
 	.string	"update_time"
-.LASF1979:
+.LASF1980:
 	.string	"bdev_try_to_free_page"
-.LASF1578:
+.LASF1579:
 	.string	"priority"
-.LASF932:
+.LASF933:
 	.string	"_call_addr"
-.LASF821:
+.LASF822:
 	.string	"WORK_BUSY_RUNNING"
-.LASF2052:
+.LASF2053:
 	.string	"check"
-.LASF1416:
+.LASF1417:
 	.string	"nr_inodes"
-.LASF2504:
+.LASF2505:
 	.string	"dev_released"
-.LASF2056:
+.LASF2057:
 	.string	"expiry"
-.LASF571:
+.LASF572:
 	.string	"optimistic_spin_queue"
-.LASF2961:
+.LASF2962:
 	.string	"ebc_buffer_size"
-.LASF3263:
+.LASF3269:
 	.string	"ebc_pmic_set_vcom"
-.LASF2641:
+.LASF2642:
 	.string	"ALLOCSTALL_NORMAL"
-.LASF3108:
+.LASF3109:
 	.string	"data_buf_tmp"
-.LASF325:
+.LASF326:
 	.string	"__initdata_begin"
-.LASF2906:
+.LASF2907:
 	.string	"pmic_pm_resume"
-.LASF224:
+.LASF225:
 	.string	"__lstate"
-.LASF2158:
+.LASF2159:
 	.string	"uevent"
-.LASF383:
+.LASF384:
 	.string	"lock_count"
-.LASF148:
+.LASF149:
 	.string	"panic_cpu"
-.LASF833:
+.LASF834:
 	.string	"refcount_t"
-.LASF696:
+.LASF697:
 	.string	"plug"
-.LASF1365:
+.LASF1366:
 	.string	"__cap_empty_set"
-.LASF1344:
+.LASF1345:
 	.string	"saved_auxv"
-.LASF1747:
+.LASF1748:
 	.string	"num_bugs"
-.LASF1649:
+.LASF1650:
 	.string	"qf_ops"
-.LASF2342:
+.LASF2343:
 	.string	"mod_name"
-.LASF2438:
+.LASF2439:
 	.string	"property_read_string_array"
-.LASF721:
+.LASF722:
 	.string	"rseq_len"
-.LASF2465:
+.LASF2466:
 	.string	"param"
-.LASF2781:
+.LASF2782:
 	.string	"module_attribute"
-.LASF1317:
+.LASF1318:
 	.string	"highest_vm_end"
-.LASF243:
+.LASF244:
 	.string	"pollfd"
-.LASF1046:
+.LASF1047:
 	.string	"nr_wakeups_remote"
-.LASF374:
+.LASF375:
 	.string	"cpu_bit_bitmap"
-.LASF1626:
+.LASF1627:
 	.string	"dq_data_lock"
-.LASF2718:
+.LASF2719:
 	.string	"d_tag"
-.LASF752:
+.LASF753:
 	.string	"llist_node"
-.LASF1624:
+.LASF1625:
 	.string	"projid"
-.LASF1150:
+.LASF1151:
 	.string	"pages"
-.LASF1187:
+.LASF1188:
 	.string	"memcg_aware"
-.LASF1070:
+.LASF1071:
 	.string	"back"
-.LASF2325:
+.LASF2326:
 	.string	"dev_name"
-.LASF1363:
+.LASF1364:
 	.string	"kernel_cap_struct"
-.LASF2740:
+.LASF2741:
 	.string	"_DYNAMIC"
-.LASF1001:
+.LASF1002:
 	.string	"rseq_cs"
-.LASF2436:
+.LASF2437:
 	.string	"property_present"
-.LASF897:
+.LASF898:
 	.string	"softirq_expires_next"
-.LASF1594:
+.LASF1595:
 	.string	"llc_id"
-.LASF1850:
+.LASF1851:
 	.string	"readlink"
-.LASF2499:
+.LASF2500:
 	.string	"algo_data"
-.LASF1511:
+.LASF1512:
 	.string	"node_zones"
-.LASF3012:
+.LASF3013:
 	.string	"dev_attr_pmic_vcom"
-.LASF1559:
+.LASF1560:
 	.string	"initialized"
-.LASF1817:
+.LASF1818:
 	.string	"bd_holder_disks"
-.LASF62:
+.LASF63:
 	.string	"list_head"
-.LASF1530:
+.LASF1531:
 	.string	"lru_lock"
-.LASF2766:
+.LASF2767:
 	.string	"mod_plt_sec"
-.LASF636:
+.LASF637:
 	.string	"tgid"
-.LASF2896:
+.LASF2897:
 	.string	"epd_mode"
-.LASF1138:
+.LASF1139:
 	.string	"compat_robust_list_head"
-.LASF915:
+.LASF916:
 	.string	"_tid"
-.LASF539:
+.LASF540:
 	.string	"s_inode_wblist_lock"
-.LASF2004:
+.LASF2005:
 	.string	"from"
-.LASF1814:
+.LASF1815:
 	.string	"bd_holder"
-.LASF1335:
+.LASF1336:
 	.string	"end_code"
-.LASF1013:
+.LASF1014:
 	.string	"ewma"
-.LASF221:
+.LASF222:
 	.string	"qspinlock"
-.LASF89:
+.LASF90:
 	.string	"linux_banner_ptr"
-.LASF1491:
+.LASF1492:
 	.string	"NR_VMSCAN_WRITE"
-.LASF2801:
+.LASF2802:
 	.string	"insn"
-.LASF1999:
+.LASF2000:
 	.string	"filldir_t"
-.LASF1902:
+.LASF1903:
 	.string	"fl_file"
-.LASF1218:
+.LASF1219:
 	.string	"bp_hardening_data"
-.LASF1082:
+.LASF1083:
 	.string	"dl_non_contending"
-.LASF2525:
+.LASF2526:
 	.string	"prepare_recovery"
-.LASF2000:
+.LASF2001:
 	.string	"dir_context"
-.LASF2540:
+.LASF2541:
 	.string	"irq_stat"
-.LASF2646:
+.LASF2647:
 	.string	"PGFREE"
-.LASF2588:
+.LASF2589:
 	.string	"tracepoint_ptr_t"
-.LASF741:
+.LASF742:
 	.string	"utask"
-.LASF1471:
+.LASF1472:
 	.string	"NR_UNEVICTABLE"
-.LASF1051:
+.LASF1052:
 	.string	"sched_entity"
-.LASF1676:
+.LASF1677:
 	.string	"d_spc_hardlimit"
-.LASF2738:
+.LASF2739:
 	.string	"sh_addralign"
-.LASF773:
+.LASF774:
 	.string	"read_cntv_tval_el0"
 .LASF0:
 	.string	"long unsigned int"
-.LASF1031:
+.LASF1032:
 	.string	"sleep_max"
-.LASF321:
+.LASF322:
 	.string	"__hyp_text_start"
-.LASF1314:
+.LASF1315:
 	.string	"mmap_base"
-.LASF699:
+.LASF700:
 	.string	"io_context"
-.LASF209:
+.LASF210:
 	.string	"compat_elf_hwcap2"
-.LASF2509:
+.LASF2510:
 	.string	"host_notify_domain"
-.LASF816:
+.LASF817:
 	.string	"WORK_OFFQ_POOL_NONE"
-.LASF1733:
+.LASF1734:
 	.string	"gpl_syms"
-.LASF2105:
+.LASF2106:
 	.string	"seq_show"
-.LASF766:
+.LASF767:
 	.string	"ate_match_dt"
-.LASF3192:
+.LASF3193:
 	.string	"of_node_put"
-.LASF1360:
+.LASF1361:
 	.string	"cow_page"
-.LASF1592:
+.LASF1593:
 	.string	"core_id"
-.LASF2489:
+.LASF2490:
 	.string	"block"
-.LASF2691:
+.LASF2692:
 	.string	"vm_event_state"
-.LASF1704:
+.LASF1705:
 	.string	"i_spc_timelimit"
-.LASF1147:
+.LASF1148:
 	.string	"return_instances"
-.LASF2020:
+.LASF2021:
 	.string	"blockdev_superblock"
-.LASF2199:
+.LASF2200:
 	.string	"device"
-.LASF2752:
+.LASF2753:
 	.string	"param_ops_ushort"
-.LASF525:
+.LASF526:
 	.string	"s_shrink"
-.LASF3116:
+.LASF3117:
 	.string	"gray_new_temp"
-.LASF1525:
+.LASF1526:
 	.string	"kcompactd_classzone_idx"
-.LASF3182:
+.LASF3183:
 	.string	"kmalloc_index"
-.LASF869:
+.LASF870:
 	.string	"hrtimer_restart"
-.LASF2607:
+.LASF2608:
 	.string	"totalram_pages"
-.LASF2486:
+.LASF2487:
 	.string	"i2c_smbus_data"
-.LASF2987:
+.LASF2988:
 	.string	"curr_dsp_buf"
-.LASF1068:
+.LASF1069:
 	.string	"time_slice"
-.LASF2421:
+.LASF2422:
 	.string	"full_name"
-.LASF2117:
+.LASF2118:
 	.string	"kernfs_open_file"
-.LASF867:
+.LASF868:
 	.string	"node"
-.LASF1812:
+.LASF1813:
 	.string	"bd_mutex"
-.LASF1379:
+.LASF1380:
 	.string	"MIGRATE_SYNC_NO_COPY"
-.LASF2305:
+.LASF2306:
 	.string	"start_prevent_time"
-.LASF2669:
+.LASF2670:
 	.string	"PGMIGRATE_SUCCESS"
-.LASF800:
+.LASF801:
 	.string	"WORK_STRUCT_PENDING"
-.LASF633:
+.LASF634:
 	.string	"no_cgroup_migration"
-.LASF284:
+.LASF285:
 	.string	"_sinittext"
-.LASF2655:
+.LASF2656:
 	.string	"PGSTEAL_DIRECT"
-.LASF373:
+.LASF374:
 	.string	"cpu_all_bits"
-.LASF2065:
+.LASF2066:
 	.string	"interval"
-.LASF2723:
+.LASF2724:
 	.string	"st_info"
-.LASF2218:
+.LASF2219:
 	.string	"cma_area"
-.LASF590:
+.LASF591:
 	.string	"static_prio"
-.LASF2838:
+.LASF2839:
 	.string	"wake_lock"
-.LASF2270:
+.LASF2271:
 	.string	"may_skip_resume"
-.LASF2995:
+.LASF2996:
 	.string	"is_deep_sleep"
-.LASF1174:
+.LASF1175:
 	.string	"shrinker"
-.LASF1081:
+.LASF1082:
 	.string	"dl_yielded"
-.LASF1638:
+.LASF1639:
 	.string	"dqi_format"
-.LASF2672:
+.LASF2673:
 	.string	"COMPACTFREE_SCANNED"
-.LASF2616:
+.LASF2617:
 	.string	"mmap_rnd_compat_bits"
-.LASF594:
+.LASF595:
 	.string	"last_sleep_ts"
-.LASF453:
+.LASF454:
 	.string	"i_version"
-.LASF657:
+.LASF658:
 	.string	"prev_cputime"
-.LASF2207:
+.LASF2208:
 	.string	"msi_domain"
-.LASF2016:
+.LASF2017:
 	.string	"state_remove_uevent_sent"
-.LASF1438:
+.LASF1439:
 	.string	"ia_size"
-.LASF888:
+.LASF889:
 	.string	"in_hrtirq"
-.LASF502:
+.LASF503:
 	.string	"s_master_keys"
-.LASF767:
+.LASF768:
 	.string	"ate_match_local_cap_id"
-.LASF2453:
+.LASF2454:
 	.string	"property"
-.LASF3049:
+.LASF3050:
 	.string	"ebc_sysfs_init"
-.LASF991:
+.LASF992:
 	.string	"wchar"
-.LASF315:
+.LASF316:
 	.string	"__exception_text_start"
-.LASF2425:
+.LASF2426:
 	.string	"platform_notify"
-.LASF61:
+.LASF62:
 	.string	"kernel_symbol"
-.LASF2924:
+.LASF2925:
 	.string	"dma_virt_ops"
-.LASF2298:
+.LASF2299:
 	.string	"subsys_data"
-.LASF2720:
+.LASF2721:
 	.string	"Elf64_Dyn"
-.LASF2355:
+.LASF2356:
 	.string	"compatible"
-.LASF173:
+.LASF174:
 	.string	"tv_sec"
-.LASF39:
+.LASF40:
 	.string	"pid_t"
-.LASF77:
+.LASF78:
 	.string	"__security_initcall_start"
-.LASF1054:
+.LASF1055:
 	.string	"run_node"
-.LASF795:
+.LASF796:
 	.string	"WORK_STRUCT_DELAYED_BIT"
-.LASF1038:
+.LASF1039:
 	.string	"nr_failed_migrations_affine"
-.LASF3197:
+.LASF3198:
 	.string	"IS_ERR"
-.LASF861:
+.LASF862:
 	.string	"PCPU_FC_EMBED"
-.LASF2096:
+.LASF2097:
 	.string	"supers"
-.LASF811:
+.LASF812:
 	.string	"WORK_OFFQ_CANCELING"
-.LASF2093:
+.LASF2094:
 	.string	"last_ino"
-.LASF692:
+.LASF693:
 	.string	"pi_top_task"
-.LASF805:
+.LASF806:
 	.string	"WORK_NR_COLORS"
-.LASF3136:
+.LASF3137:
 	.string	"refresh_new_image2"
-.LASF527:
+.LASF528:
 	.string	"s_fsnotify_inode_refs"
-.LASF415:
+.LASF416:
 	.string	"d_child"
-.LASF2001:
+.LASF2002:
 	.string	"actor"
-.LASF1209:
+.LASF1210:
 	.string	"uprobe"
-.LASF528:
+.LASF529:
 	.string	"s_readonly_remount"
-.LASF3223:
+.LASF3227:
 	.string	"kasan_check_write"
-.LASF377:
+.LASF378:
 	.string	"hlist_bl_node"
-.LASF2724:
+.LASF2725:
 	.string	"st_other"
-.LASF1949:
+.LASF1950:
 	.string	"i_mutex_key"
-.LASF2010:
+.LASF2011:
 	.string	"kset"
-.LASF877:
+.LASF878:
 	.string	"hrtimer_clock_base"
-.LASF1057:
+.LASF1058:
 	.string	"vruntime"
-.LASF2278:
+.LASF2279:
 	.string	"disable_depth"
-.LASF431:
+.LASF432:
 	.string	"i_size"
-.LASF1073:
+.LASF1074:
 	.string	"dl_deadline"
-.LASF564:
+.LASF565:
 	.string	"overflowgid"
-.LASF817:
+.LASF818:
 	.string	"WORK_STRUCT_FLAG_MASK"
-.LASF1271:
+.LASF1272:
 	.string	"units"
-.LASF3238:
+.LASF3242:
 	.string	"epd_lut_from_mem_init"
-.LASF311:
+.LASF312:
 	.string	"__nosave_begin"
-.LASF162:
+.LASF163:
 	.string	"module"
-.LASF2647:
+.LASF2648:
 	.string	"PGACTIVATE"
-.LASF2072:
+.LASF2073:
 	.string	"ngroups"
-.LASF1658:
+.LASF1659:
 	.string	"free_file_info"
-.LASF1205:
+.LASF1206:
 	.string	"autask"
-.LASF2538:
+.LASF2539:
 	.string	"ipi_irqs"
-.LASF567:
+.LASF568:
 	.string	"user_namespace"
-.LASF2756:
+.LASF2757:
 	.string	"param_ops_ulong"
-.LASF3214:
+.LASF3215:
 	.string	"get_current"
-.LASF231:
+.LASF232:
 	.string	"raw_spinlock"
-.LASF1518:
+.LASF1519:
 	.string	"kswapd_wait"
-.LASF2287:
+.LASF2288:
 	.string	"timer_autosuspends"
-.LASF2882:
+.LASF2883:
 	.string	"EPD_PART_GLR16"
-.LASF2678:
+.LASF2679:
 	.string	"KCOMPACTD_MIGRATE_SCANNED"
-.LASF1408:
+.LASF1409:
 	.string	"__rcu_head"
-.LASF1752:
+.LASF1753:
 	.string	"sect_attrs"
-.LASF2758:
+.LASF2759:
 	.string	"param_ops_charp"
-.LASF1712:
+.LASF1713:
 	.string	"quota_off"
-.LASF351:
+.LASF352:
 	.string	"fault_address"
-.LASF1606:
+.LASF1607:
 	.string	"dq_inuse"
-.LASF3099:
+.LASF3100:
 	.string	"direct_mode_data_change_part"
-.LASF1641:
+.LASF1642:
 	.string	"dqi_flags"
-.LASF2653:
+.LASF2654:
 	.string	"PGREFILL"
-.LASF2762:
+.LASF2763:
 	.string	"param_ops_bint"
-.LASF3247:
+.LASF3251:
 	.string	"ebc_add_to_dsp_buf_list"
-.LASF3252:
+.LASF3256:
 	.string	"kfree"
-.LASF1802:
+.LASF1803:
 	.string	"swap_deactivate"
-.LASF2940:
+.LASF2941:
 	.string	"gdck_sta"
-.LASF1143:
+.LASF1144:
 	.string	"request_queue"
-.LASF1476:
+.LASF1477:
 	.string	"WORKINGSET_REFAULT"
-.LASF1640:
+.LASF1641:
 	.string	"dqi_dirty_list"
-.LASF3050:
+.LASF3051:
 	.string	"ebc_buf_state_read"
-.LASF229:
+.LASF230:
 	.string	"prove_locking"
-.LASF2791:
+.LASF2792:
 	.string	"mod_tree_node"
-.LASF2585:
+.LASF2586:
 	.string	"regfunc"
-.LASF241:
+.LASF242:
 	.string	"code"
-.LASF654:
+.LASF655:
 	.string	"gtime"
-.LASF572:
+.LASF573:
 	.string	"debug_locks"
-.LASF3002:
+.LASF3003:
 	.string	"auto_buf_sema"
-.LASF1783:
+.LASF1784:
 	.string	"readpage"
-.LASF2671:
+.LASF2672:
 	.string	"COMPACTMIGRATE_SCANNED"
-.LASF395:
+.LASF396:
 	.string	"dummy"
-.LASF2384:
+.LASF2385:
 	.string	"need_for_probe"
-.LASF219:
+.LASF220:
 	.string	"locked_pending"
-.LASF1179:
+.LASF1180:
 	.string	"nr_deferred"
-.LASF1877:
+.LASF1878:
 	.string	"fown_struct"
-.LASF1987:
+.LASF1988:
 	.string	"perm"
-.LASF714:
+.LASF715:
 	.string	"compat_robust_list"
-.LASF2959:
+.LASF2960:
 	.string	"ebc_buffer_phy"
-.LASF2477:
+.LASF2478:
 	.string	"unmap"
-.LASF2011:
+.LASF2012:
 	.string	"ktype"
-.LASF384:
+.LASF385:
 	.string	"lockref"
-.LASF2256:
+.LASF2257:
 	.string	"in_dpm_list"
-.LASF1823:
+.LASF1824:
 	.string	"bd_invalidated"
-.LASF1096:
+.LASF1097:
 	.string	"mm_struct"
-.LASF1431:
+.LASF1432:
 	.string	"ki_hint"
-.LASF420:
+.LASF421:
 	.string	"i_uid"
-.LASF85:
+.LASF86:
 	.string	"alternatives_applied"
-.LASF597:
+.LASF598:
 	.string	"boost_expires"
-.LASF2911:
+.LASF2912:
 	.string	"DMA_BIDIRECTIONAL"
-.LASF3271:
+.LASF3277:
 	.string	"__arch_copy_to_user"
-.LASF235:
+.LASF236:
 	.string	"spinlock"
-.LASF769:
+.LASF770:
 	.string	"arch_timer_erratum_workaround"
-.LASF555:
+.LASF556:
 	.string	"pid_namespace"
-.LASF933:
+.LASF934:
 	.string	"_syscall"
-.LASF2769:
+.LASF2770:
 	.string	"mod_arch_specific"
-.LASF2532:
+.LASF2533:
 	.string	"max_write_len"
-.LASF471:
+.LASF472:
 	.string	"d_compare"
-.LASF971:
+.LASF972:
 	.string	"vm_mm"
-.LASF3086:
+.LASF3087:
 	.string	"need_refresh"
-.LASF2820:
+.LASF2821:
 	.string	"platform_bus_type"
-.LASF3100:
+.LASF3101:
 	.string	"data_buf"
-.LASF3039:
+.LASF3040:
 	.string	"ulogo_buf"
-.LASF1637:
+.LASF1638:
 	.string	"mem_dqinfo"
 .LASF18:
 	.string	"true"
-.LASF455:
+.LASF456:
 	.string	"i_count"
-.LASF870:
+.LASF871:
 	.string	"HRTIMER_NORESTART"
-.LASF369:
+.LASF370:
 	.string	"__cpu_online_mask"
-.LASF1824:
+.LASF1825:
 	.string	"bd_disk"
-.LASF815:
+.LASF816:
 	.string	"WORK_OFFQ_POOL_BITS"
-.LASF1905:
+.LASF1906:
 	.string	"fl_fasync"
-.LASF3147:
+.LASF3148:
 	.string	"update_mode"
-.LASF2938:
+.LASF2939:
 	.string	"direct_mode"
-.LASF2411:
+.LASF2412:
 	.string	"cache_sync"
-.LASF435:
+.LASF436:
 	.string	"i_lock"
-.LASF2974:
+.LASF2975:
 	.string	"ebc_dsp_buf_status"
-.LASF407:
+.LASF408:
 	.string	"d_name"
-.LASF733:
+.LASF734:
 	.string	"trace"
-.LASF2151:
+.LASF2152:
 	.string	"get_ownership"
-.LASF2684:
+.LASF2685:
 	.string	"UNEVICTABLE_PGMUNLOCKED"
-.LASF194:
+.LASF195:
 	.string	"ufds"
-.LASF1350:
+.LASF1351:
 	.string	"exe_file"
-.LASF1172:
+.LASF1173:
 	.string	"nr_scanned"
-.LASF646:
+.LASF647:
 	.string	"pid_links"
-.LASF1206:
+.LASF1207:
 	.string	"vaddr"
-.LASF2290:
+.LASF2291:
 	.string	"request"
-.LASF1510:
+.LASF1511:
 	.string	"pglist_data"
-.LASF1774:
+.LASF1775:
 	.string	"rw_hint"
-.LASF2550:
+.LASF2551:
 	.string	"IRQ_POLL_SOFTIRQ"
-.LASF1066:
+.LASF1067:
 	.string	"timeout"
-.LASF672:
+.LASF673:
 	.string	"last_switch_time"
-.LASF565:
+.LASF566:
 	.string	"fs_overflowuid"
-.LASF2927:
+.LASF2928:
 	.string	"start_info"
-.LASF2693:
+.LASF2694:
 	.string	"vm_zone_stat"
-.LASF2828:
+.LASF2829:
 	.string	"init_thread_union"
-.LASF1674:
+.LASF1675:
 	.string	"qc_dqblk"
-.LASF2120:
+.LASF2121:
 	.string	"mmapped"
-.LASF2277:
+.LASF2278:
 	.string	"child_count"
-.LASF1942:
+.LASF1943:
 	.string	"kill_sb"
-.LASF411:
+.LASF412:
 	.string	"d_op"
-.LASF2517:
+.LASF2518:
 	.string	"unlock_bus"
-.LASF1376:
+.LASF1377:
 	.string	"MIGRATE_ASYNC"
-.LASF357:
+.LASF358:
 	.string	"__sched_text_end"
-.LASF438:
+.LASF439:
 	.string	"i_write_hint"
-.LASF1114:
+.LASF1115:
 	.string	"process_keyring"
-.LASF2581:
+.LASF2582:
 	.string	"page_ext_operations"
-.LASF2663:
+.LASF2664:
 	.string	"KSWAPD_HIGH_WMARK_HIT_QUICKLY"
-.LASF3051:
+.LASF3052:
 	.string	"ebc_state_read"
-.LASF3259:
+.LASF3265:
 	.string	"__stack_chk_fail"
-.LASF2909:
+.LASF2910:
 	.string	"pmic_set_vcom"
-.LASF2699:
+.LASF2700:
 	.string	"stack_guard_gap"
-.LASF3206:
+.LASF3207:
 	.string	"bytes"
-.LASF1738:
+.LASF1739:
 	.string	"gpl_future_crcs"
-.LASF1024:
+.LASF1025:
 	.string	"wait_start"
-.LASF1447:
+.LASF1448:
 	.string	"nr_free"
-.LASF271:
+.LASF272:
 	.string	"cpu_hwcaps"
-.LASF389:
+.LASF390:
 	.string	"slash_name"
-.LASF124:
+.LASF125:
 	.string	"show_fdinfo"
-.LASF2802:
+.LASF2803:
 	.string	"fixup"
-.LASF385:
+.LASF386:
 	.string	"hash"
-.LASF1246:
+.LASF1247:
 	.string	"freelist"
-.LASF1843:
+.LASF1844:
 	.string	"posix_acl"
-.LASF244:
+.LASF245:
 	.string	"static_key_mod"
-.LASF167:
+.LASF168:
 	.string	"bug_addr_disp"
-.LASF1643:
+.LASF1644:
 	.string	"dqi_igrace"
-.LASF2193:
+.LASF2194:
 	.string	"thaw_noirq"
-.LASF969:
+.LASF970:
 	.string	"vm_rb"
-.LASF3023:
+.LASF3024:
 	.string	"kernel_read_file_str"
-.LASF568:
+.LASF569:
 	.string	"init_user_ns"
-.LASF2447:
+.LASF2448:
 	.string	"add_links"
-.LASF2174:
+.LASF2175:
 	.string	"pm_message_t"
-.LASF2929:
+.LASF2930:
 	.string	"xen_dma_ops"
-.LASF1444:
+.LASF1445:
 	.string	"page_group_by_mobility_disabled"
-.LASF2373:
+.LASF2374:
 	.string	"secondary"
-.LASF2371:
+.LASF2372:
 	.string	"segment_boundary_mask"
-.LASF1467:
+.LASF1468:
 	.string	"NR_INACTIVE_ANON"
-.LASF245:
+.LASF246:
 	.string	"static_key"
-.LASF967:
+.LASF968:
 	.string	"vm_next"
-.LASF2333:
+.LASF2334:
 	.string	"remove"
-.LASF494:
+.LASF495:
 	.string	"s_magic"
-.LASF1083:
+.LASF1084:
 	.string	"dl_overrun"
-.LASF2398:
+.LASF2399:
 	.string	"alloc"
-.LASF294:
+.LASF295:
 	.string	"__entry_text_start"
-.LASF751:
+.LASF752:
 	.string	"sys_tz"
-.LASF2391:
+.LASF2392:
 	.string	"revmap_direct_max_irq"
-.LASF782:
+.LASF783:
 	.string	"jiffies_64"
-.LASF2061:
+.LASF2062:
 	.string	"payload"
-.LASF1389:
+.LASF1390:
 	.string	"cb_state"
-.LASF2921:
+.LASF2922:
 	.string	"orig_nents"
-.LASF3065:
+.LASF3066:
 	.string	"buf_addr"
-.LASF412:
+.LASF413:
 	.string	"d_sb"
-.LASF669:
+.LASF670:
 	.string	"comm"
-.LASF293:
+.LASF294:
 	.string	"__kprobes_text_end"
-.LASF2304:
+.LASF2305:
 	.string	"last_time"
-.LASF549:
+.LASF550:
 	.string	"PIDTYPE_PID"
-.LASF983:
+.LASF984:
 	.string	"events"
-.LASF2232:
+.LASF2233:
 	.string	"offline"
-.LASF1865:
+.LASF1866:
 	.string	"atomic_open"
-.LASF1573:
+.LASF1574:
 	.string	"_zonerefs"
-.LASF142:
+.LASF143:
 	.string	"panic_on_unrecovered_nmi"
-.LASF1235:
+.LASF1236:
 	.string	"private_lock"
-.LASF433:
+.LASF434:
 	.string	"i_mtime"
-.LASF2604:
+.LASF2605:
 	.string	"dev_page_fault_t"
-.LASF3093:
+.LASF3094:
 	.string	"ebc_auto_tast_function"
 .LASF24:
 	.string	"__kernel_gid32_t"
-.LASF1461:
+.LASF1462:
 	.string	"NR_BOUNCE"
-.LASF1284:
+.LASF1285:
 	.string	"f_cred"
-.LASF2788:
+.LASF2789:
 	.string	"MODULE_STATE_COMING"
-.LASF2231:
+.LASF2232:
 	.string	"offline_disabled"
-.LASF3190:
+.LASF3191:
 	.string	"of_property_read_u32_array"
-.LASF2476:
+.LASF2477:
 	.string	"select"
-.LASF88:
+.LASF89:
 	.string	"linux_banner"
-.LASF2387:
+.LASF2388:
 	.string	"host_data"
-.LASF2761:
+.LASF2762:
 	.string	"param_ops_invbool"
-.LASF2516:
+.LASF2517:
 	.string	"trylock_bus"
-.LASF108:
+.LASF109:
 	.string	"mmap"
-.LASF281:
+.LASF282:
 	.string	"__bss_stop"
-.LASF1899:
+.LASF1900:
 	.string	"fl_pid"
-.LASF2719:
+.LASF2720:
 	.string	"d_un"
-.LASF1352:
+.LASF1353:
 	.string	"async_put_work"
-.LASF2116:
+.LASF2117:
 	.string	"kernfs_syscall_ops"
-.LASF2984:
+.LASF2985:
 	.string	"ebc_last_display"
-.LASF1857:
+.LASF1858:
 	.string	"mknod"
-.LASF151:
+.LASF152:
 	.string	"SYSTEM_BOOTING"
-.LASF1600:
+.LASF1601:
 	.string	"max_freq_scale"
-.LASF2922:
+.LASF2923:
 	.string	"dma_direct_ops"
-.LASF2252:
+.LASF2253:
 	.string	"dev_pm_info"
 .LASF27:
 	.string	"__kernel_loff_t"
-.LASF2316:
+.LASF2317:
 	.string	"detach"
-.LASF117:
+.LASF118:
 	.string	"get_unmapped_area"
-.LASF1263:
+.LASF1264:
 	.string	"dev_pagemap"
-.LASF2648:
+.LASF2649:
 	.string	"PGDEACTIVATE"
-.LASF3107:
+.LASF3108:
 	.string	"buffer_old_tmp"
-.LASF1784:
+.LASF1785:
 	.string	"writepages"
-.LASF1023:
+.LASF1024:
 	.string	"sched_statistics"
-.LASF135:
+.LASF136:
 	.string	"head"
-.LASF1506:
+.LASF1507:
 	.string	"reclaim_stat"
-.LASF2841:
+.LASF2842:
 	.string	"epd_lut_type"
-.LASF2541:
+.LASF2542:
 	.string	"nmi_ctx"
-.LASF1144:
+.LASF1145:
 	.string	"uprobe_task"
-.LASF1803:
+.LASF1804:
 	.string	"writeback_control"
-.LASF1904:
+.LASF1905:
 	.string	"fl_end"
-.LASF3274:
+.LASF3280:
 	.string	"ebc_find_buf_by_phy_addr"
-.LASF1951:
+.LASF1952:
 	.string	"super_operations"
-.LASF394:
+.LASF395:
 	.string	"want_pages"
-.LASF2948:
+.LASF2949:
 	.string	"regmap_base"
-.LASF338:
+.LASF339:
 	.string	"wps_disabled"
-.LASF2404:
+.LASF2405:
 	.string	"unmap_sg"
-.LASF2860:
+.LASF2861:
 	.string	"buf_dsp"
-.LASF2862:
+.LASF2863:
 	.string	"buf_error"
-.LASF1022:
+.LASF1023:
 	.string	"util_avg"
-.LASF758:
+.LASF759:
 	.string	"task"
-.LASF598:
+.LASF599:
 	.string	"sched_task_group"
-.LASF2843:
+.LASF2844:
 	.string	"WF_TYPE_GRAY16"
-.LASF2187:
+.LASF2188:
 	.string	"thaw_early"
-.LASF677:
+.LASF678:
 	.string	"blocked"
-.LASF428:
+.LASF429:
 	.string	"i_security"
-.LASF2644:
+.LASF2645:
 	.string	"PGSCAN_SKIP_NORMAL"
-.LASF2920:
+.LASF2921:
 	.string	"nents"
-.LASF756:
+.LASF757:
 	.string	"__smp_cross_call"
-.LASF2770:
+.LASF2771:
 	.string	"core"
-.LASF1815:
+.LASF1816:
 	.string	"bd_holders"
-.LASF3097:
+.LASF3098:
 	.string	"reset_and_flip"
-.LASF2949:
+.LASF2950:
 	.string	"enable"
-.LASF955:
+.LASF956:
 	.string	"pipe_bufs"
-.LASF3211:
+.LASF3212:
 	.string	"to_user"
-.LASF2124:
+.LASF2125:
 	.string	"KOBJ_NS_TYPE_NET"
-.LASF295:
+.LASF296:
 	.string	"__entry_text_end"
-.LASF1371:
+.LASF1372:
 	.string	"fe_length"
-.LASF1690:
+.LASF1691:
 	.string	"d_rt_spc_warns"
-.LASF308:
+.LASF309:
 	.string	"__noinstr_text_start"
-.LASF466:
+.LASF467:
 	.string	"i_verity_info"
-.LASF180:
+.LASF181:
 	.string	"timespec_type"
-.LASF851:
+.LASF852:
 	.string	"__rb_parent_color"
-.LASF2224:
+.LASF2225:
 	.string	"devres_lock"
-.LASF3134:
+.LASF3135:
 	.string	"new_buffer_refresh"
-.LASF365:
+.LASF366:
 	.string	"bits"
-.LASF560:
+.LASF561:
 	.string	"init_struct_pid"
-.LASF2033:
+.LASF2034:
 	.string	"child"
-.LASF1108:
+.LASF1109:
 	.string	"cap_inheritable"
-.LASF1388:
+.LASF1389:
 	.string	"gp_wait"
-.LASF1845:
+.LASF1846:
 	.string	"lookup"
-.LASF1590:
+.LASF1591:
 	.string	"cpu_topology"
-.LASF3215:
+.LASF3216:
 	.string	"sp_el0"
-.LASF3278:
+.LASF3284:
 	.string	"ebc_dsp_buf_get"
-.LASF2898:
+.LASF2899:
 	.string	"panel_color"
-.LASF1896:
+.LASF1897:
 	.string	"fl_owner"
-.LASF2851:
+.LASF2852:
 	.string	"WF_TYPE_GLD16"
-.LASF2996:
+.LASF2997:
 	.string	"is_power_off"
-.LASF979:
+.LASF980:
 	.string	"vm_private_data"
-.LASF1944:
+.LASF1945:
 	.string	"s_lock_key"
-.LASF1200:
+.LASF1201:
 	.string	"uprobe_task_state"
-.LASF206:
+.LASF207:
 	.string	"ttbr0"
-.LASF2147:
+.LASF2148:
 	.string	"kobj_type"
-.LASF2622:
+.LASF2623:
 	.string	"sysctl_overcommit_kbytes"
-.LASF2968:
+.LASF2969:
 	.string	"frame_left"
-.LASF2479:
+.LASF2480:
 	.string	"deactivate"
-.LASF2846:
+.LASF2847:
 	.string	"WF_TYPE_AUTO"
-.LASF1227:
+.LASF1228:
 	.string	"i_pages"
-.LASF3174:
+.LASF3175:
 	.string	"safe_ptr"
-.LASF376:
+.LASF377:
 	.string	"hlist_bl_head"
-.LASF1696:
+.LASF1697:
 	.string	"ino_warnlimit"
-.LASF1519:
+.LASF1520:
 	.string	"pfmemalloc_wait"
-.LASF114:
+.LASF115:
 	.string	"fasync"
-.LASF1709:
+.LASF1710:
 	.string	"i_rt_spc_warnlimit"
-.LASF1369:
+.LASF1370:
 	.string	"fe_logical"
-.LASF806:
+.LASF807:
 	.string	"WORK_NO_COLOR"
-.LASF985:
+.LASF986:
 	.string	"page_frag"
-.LASF996:
+.LASF997:
 	.string	"write_bytes"
-.LASF1996:
+.LASF1997:
 	.string	"fi_extents_mapped"
-.LASF1482:
+.LASF1483:
 	.string	"NR_FILE_PAGES"
 .LASF2:
 	.string	"char"
-.LASF954:
+.LASF955:
 	.string	"unix_inflight"
-.LASF1726:
+.LASF1727:
 	.string	"holders_dir"
-.LASF3067:
+.LASF3068:
 	.string	"__wq_entry"
-.LASF3081:
+.LASF3082:
 	.string	"new_buffer"
-.LASF463:
+.LASF464:
 	.string	"i_fsnotify_mask"
-.LASF2662:
+.LASF2663:
 	.string	"KSWAPD_LOW_WMARK_HIT_QUICKLY"
-.LASF994:
+.LASF995:
 	.string	"syscfs"
-.LASF3167:
+.LASF3168:
 	.string	"wake_unlock"
-.LASF2445:
+.LASF2446:
 	.string	"graph_get_port_parent"
-.LASF2682:
+.LASF2683:
 	.string	"UNEVICTABLE_PGRESCUED"
-.LASF2209:
+.LASF2210:
 	.string	"msi_list"
-.LASF3217:
+.LASF3218:
 	.string	"__ilog2_u64"
-.LASF547:
+.LASF548:
 	.string	"compat_time_t"
-.LASF399:
+.LASF400:
 	.string	"d_alias"
-.LASF1486:
+.LASF1487:
 	.string	"NR_SHMEM"
-.LASF364:
+.LASF365:
 	.string	"cpumask"
-.LASF2167:
+.LASF2168:
 	.string	"n_klist"
-.LASF1310:
+.LASF1311:
 	.string	"dumper"
-.LASF1739:
+.LASF1740:
 	.string	"num_gpl_future_syms"
-.LASF2275:
+.LASF2276:
 	.string	"wakeirq"
-.LASF847:
+.LASF848:
 	.string	"plist_node"
-.LASF1110:
+.LASF1111:
 	.string	"cap_effective"
-.LASF1746:
+.LASF1747:
 	.string	"taints"
-.LASF3233:
+.LASF3237:
 	.string	"of_address_to_resource"
-.LASF1012:
+.LASF1013:
 	.string	"enqueued"
-.LASF1003:
+.LASF1004:
 	.string	"sum_exec_runtime"
-.LASF165:
+.LASF166:
 	.string	"hex_asc_upper"
-.LASF506:
+.LASF507:
 	.string	"s_roots"
-.LASF2910:
+.LASF2911:
 	.string	"dma_data_direction"
-.LASF1689:
+.LASF1690:
 	.string	"d_rt_spc_timer"
-.LASF1957:
+.LASF1958:
 	.string	"evict_inode"
-.LASF1490:
+.LASF1491:
 	.string	"NR_UNSTABLE_NFS"
-.LASF2454:
+.LASF2455:
 	.string	"length"
-.LASF1583:
+.LASF1584:
 	.string	"sysctl_lowmem_reserve_ratio"
-.LASF2156:
+.LASF2157:
 	.string	"buflen"
-.LASF1828:
+.LASF1829:
 	.string	"bd_private"
-.LASF1903:
+.LASF1904:
 	.string	"fl_start"
-.LASF3189:
+.LASF3190:
 	.string	"out_value"
-.LASF1961:
+.LASF1962:
 	.string	"freeze_fs"
-.LASF909:
+.LASF910:
 	.string	"sigset_t"
-.LASF1917:
+.LASF1918:
 	.string	"lm_notify"
-.LASF3146:
+.LASF3147:
 	.string	"ebc_tcon_dsp_mode_set"
-.LASF880:
+.LASF881:
 	.string	"running"
-.LASF723:
+.LASF724:
 	.string	"rseq_event_mask"
-.LASF495:
+.LASF496:
 	.string	"s_root"
-.LASF1882:
+.LASF1883:
 	.string	"ra_pages"
-.LASF74:
+.LASF75:
 	.string	"aarch32_opcode_cond_checks"
-.LASF183:
+.LASF184:
 	.string	"TT_COMPAT"
-.LASF864:
+.LASF865:
 	.string	"pcpu_fc_names"
-.LASF2372:
+.LASF2373:
 	.string	"fwnode_handle"
-.LASF2728:
+.LASF2729:
 	.string	"Elf64_Sym"
-.LASF2095:
+.LASF2096:
 	.string	"syscall_ops"
-.LASF478:
+.LASF479:
 	.string	"d_automount"
-.LASF1265:
+.LASF1266:
 	.string	"page_free"
-.LASF3094:
+.LASF3095:
 	.string	"__val"
-.LASF1481:
+.LASF1482:
 	.string	"NR_FILE_MAPPED"
-.LASF639:
+.LASF640:
 	.string	"parent"
-.LASF1164:
+.LASF1165:
 	.string	"atime"
-.LASF125:
+.LASF126:
 	.string	"copy_file_range"
-.LASF2685:
+.LASF2686:
 	.string	"UNEVICTABLE_PGCLEARED"
-.LASF3264:
+.LASF3270:
 	.string	"epd_lut_get_wf_version"
-.LASF2047:
+.LASF2048:
 	.string	"key_type"
-.LASF797:
+.LASF798:
 	.string	"WORK_STRUCT_LINKED_BIT"
-.LASF3208:
+.LASF3209:
 	.string	"copy_overflow"
-.LASF2441:
+.LASF2442:
 	.string	"get_named_child_node"
-.LASF2258:
+.LASF2259:
 	.string	"is_suspended"
-.LASF2918:
+.LASF2919:
 	.string	"dma_length"
-.LASF2066:
+.LASF2067:
 	.string	"burst"
-.LASF1967:
+.LASF1968:
 	.string	"clone_mnt_data"
-.LASF2777:
+.LASF2778:
 	.string	"module_kobject"
-.LASF3044:
+.LASF3045:
 	.string	"memory"
-.LASF3181:
+.LASF3182:
 	.string	"order"
-.LASF739:
+.LASF740:
 	.string	"active_memcg"
-.LASF1332:
+.LASF1333:
 	.string	"def_flags"
-.LASF3000:
+.LASF3001:
 	.string	"global_ebc"
-.LASF1473:
+.LASF1474:
 	.string	"NR_SLAB_UNRECLAIMABLE"
-.LASF1126:
+.LASF1127:
 	.string	"refcount"
-.LASF1790:
+.LASF1791:
 	.string	"invalidatepage"
-.LASF3071:
+.LASF3072:
 	.string	"ebc_frame_timeout"
-.LASF363:
+.LASF364:
 	.string	"wait_queue_head_t"
-.LASF1270:
+.LASF1271:
 	.string	"page_type"
-.LASF2049:
+.LASF2050:
 	.string	"rcu_data0"
-.LASF1111:
+.LASF1112:
 	.string	"cap_bset"
-.LASF893:
+.LASF894:
 	.string	"nr_hangs"
-.LASF2253:
+.LASF2254:
 	.string	"power_state"
-.LASF744:
+.LASF745:
 	.string	"stack_vm_area"
-.LASF2819:
+.LASF2820:
 	.string	"mfd_cell"
-.LASF2885:
+.LASF2886:
 	.string	"EPD_A2"
-.LASF2102:
+.LASF2103:
 	.string	"kernfs_elem_attr"
-.LASF3084:
+.LASF3085:
 	.string	"new_buffer_temp"
-.LASF2299:
+.LASF2300:
 	.string	"set_latency_tolerance"
-.LASF573:
+.LASF574:
 	.string	"debug_locks_silent"
-.LASF1353:
+.LASF1354:
 	.string	"linux_binfmt"
-.LASF141:
+.LASF142:
 	.string	"panic_on_oops"
-.LASF270:
+.LASF271:
 	.string	"arm64_ftr_reg_ctrel0"
-.LASF1244:
+.LASF1245:
 	.string	"counters"
-.LASF3224:
+.LASF3228:
 	.string	"kasan_check_read"
-.LASF2059:
+.LASF2060:
 	.string	"name_link"
-.LASF542:
+.LASF543:
 	.string	"d_canonical_path"
-.LASF190:
+.LASF191:
 	.string	"compat_timespec"
-.LASF1489:
+.LASF1490:
 	.string	"NR_ANON_THPS"
-.LASF731:
+.LASF732:
 	.string	"timer_slack_ns"
-.LASF1913:
+.LASF1914:
 	.string	"lm_compare_owner"
-.LASF2324:
+.LASF2325:
 	.string	"bus_type"
-.LASF599:
+.LASF600:
 	.string	"policy"
-.LASF1293:
+.LASF1294:
 	.string	"shared"
-.LASF3017:
+.LASF3018:
 	.string	"ebc_match"
-.LASF2947:
+.LASF2948:
 	.string	"dclk"
-.LASF2217:
+.LASF2218:
 	.string	"dma_mem"
-.LASF358:
+.LASF359:
 	.string	"wait_queue_entry"
-.LASF2319:
+.LASF2320:
 	.string	"dismiss"
-.LASF2026:
+.LASF2027:
 	.string	"simple_dentry_operations"
-.LASF931:
+.LASF932:
 	.string	"_band"
-.LASF595:
+.LASF596:
 	.string	"boost"
-.LASF2106:
+.LASF2107:
 	.string	"seq_start"
-.LASF2810:
+.LASF2811:
 	.string	"module_sysfs_initialized"
-.LASF1002:
+.LASF1003:
 	.string	"task_cputime"
-.LASF2971:
+.LASF2972:
 	.string	"lut_addr"
-.LASF1196:
+.LASF1197:
 	.string	"rnode"
-.LASF232:
+.LASF233:
 	.string	"raw_lock"
-.LASF75:
+.LASF76:
 	.string	"__con_initcall_start"
-.LASF1717:
+.LASF1718:
 	.string	"get_dqblk"
-.LASF3029:
+.LASF3030:
 	.string	"ebc_tcon_node"
-.LASF2817:
+.LASF2818:
 	.string	"id_entry"
-.LASF1796:
+.LASF1797:
 	.string	"putback_page"
-.LASF2536:
+.LASF2537:
 	.string	"nr_irqs"
-.LASF894:
+.LASF895:
 	.string	"max_hang_time"
-.LASF3170:
+.LASF3171:
 	.string	"copy_from_user"
-.LASF2467:
+.LASF2468:
 	.string	"DOMAIN_BUS_ANY"
-.LASF2071:
+.LASF2072:
 	.string	"root_user"
-.LASF2090:
+.LASF2091:
 	.string	"subdirs"
-.LASF2887:
+.LASF2888:
 	.string	"EPD_DU"
-.LASF1883:
+.LASF1884:
 	.string	"mmap_miss"
-.LASF1654:
+.LASF1655:
 	.string	"quota_format_ops"
-.LASF3276:
+.LASF3282:
 	.string	"ebc_osd_buf_get"
-.LASF3062:
+.LASF3063:
 	.string	"argp"
-.LASF1754:
+.LASF1755:
 	.string	"args"
-.LASF33:
+.LASF34:
 	.string	"__poll_t"
-.LASF2433:
+.LASF2434:
 	.string	"fwnode_operations"
-.LASF1005:
+.LASF1006:
 	.string	"run_delay"
-.LASF1998:
+.LASF1999:
 	.string	"fi_extents_start"
-.LASF2930:
+.LASF2931:
 	.string	"dummy_dma_ops"
-.LASF238:
+.LASF239:
 	.string	"static_key_initialized"
-.LASF2784:
+.LASF2785:
 	.string	"module_uevent"
-.LASF3075:
+.LASF3076:
 	.string	"is_full_mode"
-.LASF2597:
+.LASF2598:
 	.string	"base_pfn"
-.LASF261:
+.LASF262:
 	.string	"width"
-.LASF929:
+.LASF930:
 	.string	"_addr_pkey"
-.LASF3058:
+.LASF3059:
 	.string	"waveform_buffer"
-.LASF296:
+.LASF297:
 	.string	"__start_rodata"
-.LASF1468:
+.LASF1469:
 	.string	"NR_ACTIVE_ANON"
-.LASF2933:
+.LASF2934:
 	.string	"tcon"
-.LASF1115:
+.LASF1116:
 	.string	"thread_keyring"
-.LASF2745:
+.LASF2746:
 	.string	"kparam_array"
-.LASF3226:
+.LASF3230:
 	.string	"platform_driver_unregister"
-.LASF652:
+.LASF653:
 	.string	"utime"
-.LASF1334:
+.LASF1335:
 	.string	"start_code"
-.LASF3018:
+.LASF3019:
 	.string	"ebc_driver"
-.LASF2605:
+.LASF2606:
 	.string	"dev_page_free_t"
-.LASF3187:
+.LASF3188:
 	.string	"of_property_read_u32"
-.LASF1398:
+.LASF1399:
 	.string	"guid_t"
-.LASF146:
+.LASF147:
 	.string	"sysctl_panic_on_stackoverflow"
-.LASF1894:
+.LASF1895:
 	.string	"fl_link"
-.LASF2249:
+.LASF2250:
 	.string	"clock_list"
-.LASF1587:
+.LASF1588:
 	.string	"section_mem_map"
-.LASF309:
+.LASF310:
 	.string	"__noinstr_text_end"
-.LASF2137:
+.LASF2138:
 	.string	"attrs"
-.LASF176:
+.LASF177:
 	.string	"tz_minuteswest"
-.LASF2459:
+.LASF2460:
 	.string	"of_chosen"
-.LASF3095:
+.LASF3096:
 	.string	"ebc_frame_start"
-.LASF348:
+.LASF349:
 	.string	"sve_state"
-.LASF1560:
+.LASF1561:
 	.string	"percpu_drift_mark"
-.LASF366:
+.LASF367:
 	.string	"cpumask_t"
-.LASF133:
+.LASF134:
 	.string	"kmsg_fops"
-.LASF3273:
+.LASF3279:
 	.string	"ebc_buf_release"
-.LASF819:
+.LASF820:
 	.string	"WORK_STRUCT_NO_POOL"
-.LASF1633:
+.LASF1634:
 	.string	"dqb_isoftlimit"
-.LASF2533:
+.LASF2534:
 	.string	"max_read_len"
-.LASF601:
+.LASF602:
 	.string	"cpus_allowed"
-.LASF1289:
+.LASF1290:
 	.string	"f_tfile_llink"
-.LASF1813:
+.LASF1814:
 	.string	"bd_claiming"
-.LASF2177:
+.LASF2178:
 	.string	"complete"
-.LASF2866:
+.LASF2867:
 	.string	"tid_name"
-.LASF1064:
+.LASF1065:
 	.string	"sched_rt_entity"
-.LASF116:
+.LASF117:
 	.string	"sendpage"
-.LASF3140:
+.LASF3141:
 	.string	"ret_val"
-.LASF866:
+.LASF867:
 	.string	"timerqueue_node"
-.LASF257:
+.LASF258:
 	.string	"sign"
-.LASF1627:
+.LASF1628:
 	.string	"mem_dqblk"
-.LASF2772:
+.LASF2773:
 	.string	"plt_entry"
-.LASF3148:
+.LASF3149:
 	.string	"display_mode"
-.LASF1980:
+.LASF1981:
 	.string	"nr_cached_objects"
-.LASF1440:
+.LASF1441:
 	.string	"ia_mtime"
-.LASF1169:
+.LASF1170:
 	.string	"shrink_control"
-.LASF1412:
+.LASF1413:
 	.string	"nr_files"
-.LASF2091:
+.LASF2092:
 	.string	"kernfs_root"
-.LASF729:
+.LASF730:
 	.string	"nr_dirtied_pause"
-.LASF1497:
+.LASF1498:
 	.string	"NR_ION_HEAP"
-.LASF2753:
+.LASF2754:
 	.string	"param_ops_int"
-.LASF938:
+.LASF939:
 	.string	"_sigchld"
-.LASF1822:
+.LASF1823:
 	.string	"bd_part_count"
-.LASF356:
+.LASF357:
 	.string	"__sched_text_start"
-.LASF2872:
+.LASF2873:
 	.string	"panel_refresh_mode"
-.LASF90:
+.LASF91:
 	.string	"linux_proc_banner"
-.LASF2573:
+.LASF2574:
 	.string	"fops"
-.LASF1273:
+.LASF1274:
 	.string	"f_path"
-.LASF3240:
+.LASF3244:
 	.string	"kthread_create_on_node"
-.LASF711:
+.LASF712:
 	.string	"cgroups"
-.LASF3173:
+.LASF3174:
 	.string	"__uaccess_mask_ptr"
-.LASF2344:
+.LASF2345:
 	.string	"probe_type"
-.LASF1810:
+.LASF1811:
 	.string	"bd_inode"
-.LASF2246:
+.LASF2247:
 	.string	"RPM_REQ_AUTOSUSPEND"
-.LASF267:
+.LASF268:
 	.string	"sys_val"
-.LASF302:
+.LASF303:
 	.string	"__start_once"
-.LASF95:
+.LASF96:
 	.string	"kptr_restrict"
-.LASF171:
+.LASF172:
 	.string	"time64_t"
-.LASF2506:
+.LASF2507:
 	.string	"userspace_clients"
-.LASF2143:
+.LASF2144:
 	.string	"uevent_seqnum"
-.LASF3236:
+.LASF3240:
 	.string	"memset"
-.LASF3145:
+.LASF3146:
 	.string	"cur_image_addr"
-.LASF2144:
+.LASF2145:
 	.string	"list_lock"
-.LASF2206:
+.LASF2207:
 	.string	"pm_domain"
-.LASF1097:
+.LASF1098:
 	.string	"cpu_bitmap"
-.LASF857:
+.LASF858:
 	.string	"pcpu_base_addr"
-.LASF1962:
+.LASF1963:
 	.string	"thaw_super"
-.LASF1011:
+.LASF1012:
 	.string	"util_est"
-.LASF1699:
+.LASF1700:
 	.string	"qc_state"
-.LASF2226:
+.LASF2227:
 	.string	"knode_class"
-.LASF1936:
+.LASF1937:
 	.string	"wait_unfrozen"
-.LASF2043:
+.LASF2044:
 	.string	"key_perm_t"
-.LASF2338:
+.LASF2339:
 	.string	"iommu_ops"
-.LASF898:
+.LASF899:
 	.string	"softirq_next_timer"
-.LASF1821:
+.LASF1822:
 	.string	"bd_part"
-.LASF118:
+.LASF119:
 	.string	"check_flags"
-.LASF1888:
+.LASF1889:
 	.string	"file_lock_operations"
-.LASF343:
+.LASF344:
 	.string	"tp_value"
-.LASF3026:
+.LASF3027:
 	.string	"ebc_remove"
-.LASF1893:
+.LASF1894:
 	.string	"fl_list"
-.LASF1269:
+.LASF1270:
 	.string	"_mapcount"
-.LASF889:
+.LASF890:
 	.string	"hang_detected"
-.LASF2149:
+.LASF2150:
 	.string	"child_ns_type"
-.LASF1648:
+.LASF1649:
 	.string	"qf_fmt_id"
-.LASF1050:
+.LASF1051:
 	.string	"nr_wakeups_idle"
-.LASF3281:
+.LASF3286:
 	.string	"up_write"
-.LASF1458:
+.LASF1459:
 	.string	"NR_MLOCK"
-.LASF2826:
+.LASF2827:
 	.string	"tasklist_lock"
-.LASF55:
+.LASF56:
 	.string	"phys_addr_t"
-.LASF1931:
+.LASF1932:
 	.string	"fa_fd"
-.LASF2565:
+.LASF2566:
 	.string	"MEMREMAP_WB"
-.LASF2702:
+.LASF2703:
 	.string	"sysctl_drop_caches"
-.LASF1973:
+.LASF1974:
 	.string	"show_devname"
-.LASF2942:
+.LASF2943:
 	.string	"panel_16bit"
-.LASF1322:
+.LASF1323:
 	.string	"page_table_lock"
-.LASF3016:
+.LASF3017:
 	.string	"ebc_pm"
-.LASF2840:
+.LASF2841:
 	.string	"sched_priority"
-.LASF1656:
+.LASF1657:
 	.string	"read_file_info"
-.LASF2598:
+.LASF2599:
 	.string	"reserve"
-.LASF1771:
+.LASF1772:
 	.string	"quota_info"
-.LASF1016:
+.LASF1017:
 	.string	"load_sum"
-.LASF91:
+.LASF92:
 	.string	"console_printk"
-.LASF702:
+.LASF703:
 	.string	"ioac"
-.LASF3201:
+.LASF3202:
 	.string	"__init_work"
-.LASF1171:
+.LASF1172:
 	.string	"nr_to_scan"
-.LASF2632:
+.LASF2633:
 	.string	"PGPGIN"
-.LASF1614:
+.LASF1615:
 	.string	"dq_off"
-.LASF1035:
+.LASF1036:
 	.string	"exec_max"
-.LASF1403:
+.LASF1404:
 	.string	"uuid_index"
-.LASF3202:
+.LASF3203:
 	.string	"onstack"
-.LASF189:
+.LASF190:
 	.string	"compat_rmtp"
-.LASF436:
+.LASF437:
 	.string	"i_bytes"
-.LASF2848:
+.LASF2849:
 	.string	"WF_TYPE_GC16"
-.LASF1926:
+.LASF1927:
 	.string	"nfs_fl"
-.LASF402:
+.LASF403:
 	.string	"dentry"
-.LASF2166:
+.LASF3220:
+	.string	"__be32_to_cpup"
+.LASF2167:
 	.string	"klist_node"
-.LASF1890:
+.LASF1891:
 	.string	"fl_release_private"
-.LASF2883:
+.LASF2884:
 	.string	"EPD_PART_GLD16"
-.LASF106:
+.LASF107:
 	.string	"unlocked_ioctl"
-.LASF1148:
+.LASF1149:
 	.string	"vm_struct"
-.LASF1309:
+.LASF1310:
 	.string	"nr_threads"
-.LASF1834:
+.LASF1835:
 	.string	"__i_nlink"
-.LASF144:
+.LASF145:
 	.string	"panic_on_warn"
-.LASF3069:
+.LASF3070:
 	.string	"ebc_panel_probe"
-.LASF79:
+.LASF80:
 	.string	"boot_command_line"
-.LASF2494:
+.LASF2495:
 	.string	"adapter"
-.LASF2466:
+.LASF2467:
 	.string	"irq_domain_bus_token"
-.LASF1451:
+.LASF1452:
 	.string	"NR_ZONE_LRU_BASE"
-.LASF2204:
+.LASF2205:
 	.string	"links"
-.LASF1868:
+.LASF1869:
 	.string	"bdi_writeback"
-.LASF1685:
+.LASF1686:
 	.string	"d_spc_warns"
-.LASF1040:
+.LASF1041:
 	.string	"nr_failed_migrations_hot"
-.LASF2934:
+.LASF2935:
 	.string	"pmic"
-.LASF1136:
+.LASF1137:
 	.string	"css_set"
-.LASF1402:
+.LASF1403:
 	.string	"guid_index"
-.LASF2973:
+.LASF2974:
 	.string	"ebc_irq_status"
-.LASF2544:
+.LASF2545:
 	.string	"force_irqthreads"
-.LASF1325:
+.LASF1326:
 	.string	"hiwater_rss"
-.LASF2164:
+.LASF2165:
 	.string	"power_kobj"
-.LASF491:
+.LASF492:
 	.string	"s_export_op"
-.LASF1836:
+.LASF1837:
 	.string	"i_rcu"
-.LASF2878:
+.LASF2879:
 	.string	"EPD_FULL_GLD16"
-.LASF155:
+.LASF156:
 	.string	"SYSTEM_POWER_OFF"
-.LASF747:
+.LASF748:
 	.string	"futex_exit_mutex"
-.LASF2493:
+.LASF2494:
 	.string	"i2c_client"
-.LASF1566:
+.LASF1567:
 	.string	"compact_blockskip_flush"
-.LASF1680:
+.LASF1681:
 	.string	"d_space"
-.LASF318:
+.LASF319:
 	.string	"__hibernate_exit_text_end"
-.LASF2171:
+.LASF2172:
 	.string	"pm_power_off_prepare"
-.LASF2054:
+.LASF2055:
 	.string	"graveyard_link"
-.LASF2822:
+.LASF2823:
 	.string	"platform_driver"
-.LASF1146:
+.LASF1147:
 	.string	"xol_vaddr"
-.LASF121:
+.LASF122:
 	.string	"splice_read"
-.LASF2710:
+.LASF2711:
 	.string	"Elf64_Addr"
-.LASF1688:
+.LASF1689:
 	.string	"d_rt_space"
-.LASF264:
+.LASF265:
 	.string	"name"
-.LASF3245:
+.LASF3249:
 	.string	"mod_timer"
-.LASF150:
+.LASF151:
 	.string	"early_boot_irqs_disabled"
-.LASF658:
+.LASF659:
 	.string	"nvcsw"
-.LASF3042:
+.LASF3043:
 	.string	"ebc_task_init"
-.LASF2832:
+.LASF2833:
 	.string	"KMALLOC_NORMAL"
-.LASF1087:
+.LASF1088:
 	.string	"exp_need_qs"
-.LASF249:
+.LASF250:
 	.string	"__stop___jump_table"
-.LASF1142:
+.LASF1143:
 	.string	"task_delay_info"
-.LASF1361:
+.LASF1362:
 	.string	"prealloc_pte"
-.LASF1455:
+.LASF1456:
 	.string	"NR_ZONE_ACTIVE_FILE"
-.LASF2389:
+.LASF2390:
 	.string	"bus_token"
-.LASF421:
+.LASF422:
 	.string	"i_gid"
-.LASF1619:
+.LASF1620:
 	.string	"quota_type"
-.LASF3102:
+.LASF3103:
 	.string	"buffer_old"
-.LASF1536:
+.LASF1537:
 	.string	"high"
-.LASF430:
+.LASF431:
 	.string	"i_rdev"
-.LASF2028:
+.LASF2029:
 	.string	"simple_dir_inode_operations"
-.LASF1922:
+.LASF1923:
 	.string	"nfs_lock_info"
-.LASF1373:
+.LASF1374:
 	.string	"fe_flags"
-.LASF687:
+.LASF688:
 	.string	"self_exec_id"
-.LASF1907:
+.LASF1908:
 	.string	"fl_downgrade_time"
-.LASF2980:
+.LASF2981:
 	.string	"auto_frame_count"
-.LASF2104:
+.LASF2105:
 	.string	"kernfs_ops"
-.LASF2977:
+.LASF2978:
 	.string	"auto_image_new"
-.LASF807:
+.LASF808:
 	.string	"WORK_CPU_UNBOUND"
-.LASF2787:
+.LASF2788:
 	.string	"MODULE_STATE_LIVE"
-.LASF1424:
+.LASF1425:
 	.string	"sysctl_protected_fifos"
-.LASF1059:
+.LASF1060:
 	.string	"nr_migrations"
-.LASF966:
+.LASF967:
 	.string	"vm_end"
-.LASF1966:
+.LASF1967:
 	.string	"remount_fs2"
-.LASF2083:
+.LASF2084:
 	.string	"iomem_resource"
-.LASF1897:
+.LASF1898:
 	.string	"fl_flags"
-.LASF2180:
+.LASF2181:
 	.string	"freeze"
-.LASF1457:
+.LASF1458:
 	.string	"NR_ZONE_WRITE_PENDING"
-.LASF1296:
+.LASF1297:
 	.string	"close"
-.LASF3128:
+.LASF3129:
 	.string	"image_fb_data"
-.LASF3040:
+.LASF3041:
 	.string	"klogo_buf"
-.LASF2893:
+.LASF2894:
 	.string	"EPD_POWER_OFF"
-.LASF1501:
+.LASF1502:
 	.string	"zone_reclaim_stat"
-.LASF3003:
+.LASF3004:
 	.string	"ebc_wq"
-.LASF736:
+.LASF737:
 	.string	"memcg_oom_gfp_mask"
-.LASF3204:
+.LASF3205:
 	.string	"_msecs_to_jiffies"
-.LASF1683:
+.LASF1684:
 	.string	"d_spc_timer"
-.LASF1759:
+.LASF1760:
 	.string	"jump_entries"
-.LASF3212:
+.LASF3213:
 	.string	"test_ti_thread_flag"
-.LASF2255:
+.LASF2256:
 	.string	"async_suspend"
-.LASF2630:
+.LASF2631:
 	.string	"compound_page_dtors"
-.LASF2006:
+.LASF2007:
 	.string	"read_pos"
-.LASF481:
+.LASF482:
 	.string	"super_block"
-.LASF3175:
+.LASF3176:
 	.string	"__addr"
-.LASF2322:
+.LASF2323:
 	.string	"dma_coherent"
-.LASF1071:
+.LASF1072:
 	.string	"sched_dl_entity"
-.LASF611:
+.LASF612:
 	.string	"rcu_tasks_holdout_list"
-.LASF1297:
+.LASF1298:
 	.string	"split"
-.LASF709:
+.LASF710:
 	.string	"cpuset_mem_spread_rotor"
-.LASF796:
+.LASF797:
 	.string	"WORK_STRUCT_PWQ_BIT"
-.LASF2039:
+.LASF2040:
 	.string	"assoc_array"
-.LASF566:
+.LASF567:
 	.string	"fs_overflowgid"
-.LASF1616:
+.LASF1617:
 	.string	"dq_dqb"
-.LASF2714:
+.LASF2715:
 	.string	"Elf64_Xword"
-.LASF987:
+.LASF988:
 	.string	"lock_class_key"
-.LASF1729:
+.LASF1730:
 	.string	"num_syms"
-.LASF2804:
+.LASF2805:
 	.string	"module_notes_attrs"
-.LASF2112:
+.LASF2113:
 	.string	"generation"
-.LASF553:
+.LASF554:
 	.string	"PIDTYPE_MAX"
-.LASF2768:
+.LASF2769:
 	.string	"plt_max_entries"
-.LASF2403:
+.LASF2404:
 	.string	"map_sg"
-.LASF1159:
+.LASF1160:
 	.string	"nlink"
-.LASF3035:
+.LASF3036:
 	.string	"ulogo_addr_valid"
-.LASF2577:
+.LASF2578:
 	.string	"percpu_ref"
-.LASF92:
+.LASF93:
 	.string	"devkmsg_log_str"
-.LASF254:
+.LASF255:
 	.string	"FTR_HIGHER_SAFE"
-.LASF3186:
+.LASF3187:
 	.string	"i2c_get_clientdata"
-.LASF3171:
+.LASF3172:
 	.string	"_copy_to_user"
-.LASF3219:
+.LASF3223:
 	.string	"test_bit"
-.LASF248:
+.LASF249:
 	.string	"__start___jump_table"
-.LASF783:
+.LASF784:
 	.string	"jiffies"
-.LASF2274:
+.LASF2275:
 	.string	"wait_queue"
-.LASF1646:
+.LASF1647:
 	.string	"dqi_priv"
-.LASF617:
+.LASF618:
 	.string	"rss_stat"
-.LASF708:
+.LASF709:
 	.string	"mems_allowed_seq"
-.LASF1770:
+.LASF1771:
 	.string	"refcnt"
-.LASF3087:
+.LASF3088:
 	.string	"pbuf_new"
-.LASF2181:
+.LASF2182:
 	.string	"thaw"
-.LASF1718:
+.LASF1719:
 	.string	"get_nextdqblk"
-.LASF517:
+.LASF518:
 	.string	"s_fs_info"
-.LASF1502:
+.LASF1503:
 	.string	"recent_rotated"
-.LASF2170:
+.LASF2171:
 	.string	"pm_power_off"
-.LASF197:
+.LASF198:
 	.string	"futex"
-.LASF1025:
+.LASF1026:
 	.string	"wait_max"
-.LASF3243:
+.LASF3247:
 	.string	"wakeup_source_add"
-.LASF3164:
+.LASF3165:
 	.string	"ebc_pmic_suspend"
-.LASF1158:
+.LASF1159:
 	.string	"result_mask"
-.LASF2234:
+.LASF2235:
 	.string	"state_synced"
-.LASF2420:
+.LASF2421:
 	.string	"phandle"
-.LASF1663:
+.LASF1664:
 	.string	"dquot_operations"
-.LASF1224:
+.LASF1225:
 	.string	"mapping"
-.LASF3196:
+.LASF3197:
 	.string	"resource_size"
-.LASF3241:
+.LASF3245:
 	.string	"wake_up_process"
-.LASF1354:
+.LASF1355:
 	.string	"kioctx_table"
-.LASF852:
+.LASF853:
 	.string	"rb_right"
-.LASF3106:
+.LASF3107:
 	.string	"buffer_new_tmp"
-.LASF978:
+.LASF979:
 	.string	"vm_file"
-.LASF2695:
+.LASF2696:
 	.string	"vmstat_text"
-.LASF2085:
+.LASF2086:
 	.string	"idr_base"
-.LASF745:
+.LASF746:
 	.string	"stack_refcount"
-.LASF439:
+.LASF440:
 	.string	"i_blocks"
-.LASF1521:
+.LASF1522:
 	.string	"kswapd_order"
-.LASF2175:
+.LASF2176:
 	.string	"dev_pm_ops"
-.LASF2780:
+.LASF2781:
 	.string	"module_param_attrs"
-.LASF875:
+.LASF876:
 	.string	"is_rel"
-.LASF2041:
+.LASF2042:
 	.string	"assoc_array_ptr"
-.LASF326:
+.LASF327:
 	.string	"__initdata_end"
-.LASF2501:
+.LASF2502:
 	.string	"bus_lock"
-.LASF3183:
+.LASF3184:
 	.string	"kmalloc_type"
-.LASF387:
+.LASF388:
 	.string	"qstr"
-.LASF3105:
+.LASF3106:
 	.string	"gray_new"
-.LASF1092:
+.LASF1093:
 	.string	"futex_state"
-.LASF1478:
+.LASF1479:
 	.string	"WORKINGSET_RESTORE"
-.LASF628:
+.LASF629:
 	.string	"sched_psi_wake_requeue"
-.LASF3205:
+.LASF3206:
 	.string	"check_copy_size"
-.LASF737:
+.LASF738:
 	.string	"memcg_oom_order"
-.LASF706:
+.LASF707:
 	.string	"acct_timexpd"
-.LASF1406:
+.LASF1407:
 	.string	"__rcu_icq_cache"
-.LASF145:
+.LASF146:
 	.string	"sysctl_panic_on_rcu_stall"
-.LASF986:
+.LASF987:
 	.string	"size"
-.LASF1543:
+.LASF1544:
 	.string	"ZONE_DMA32"
-.LASF2300:
+.LASF2301:
 	.string	"wakeup_source"
-.LASF1282:
+.LASF1283:
 	.string	"f_pos"
-.LASF1483:
+.LASF1484:
 	.string	"NR_FILE_DIRTY"
 .LASF19:
 	.string	"__kernel_long_t"
-.LASF726:
+.LASF727:
 	.string	"task_frag"
-.LASF1989:
+.LASF1990:
 	.string	"datalen"
-.LASF1048:
+.LASF1049:
 	.string	"nr_wakeups_affine_attempts"
-.LASF1466:
+.LASF1467:
 	.string	"NR_LRU_BASE"
-.LASF1741:
+.LASF1742:
 	.string	"extable"
-.LASF1769:
+.LASF1770:
 	.string	"exit"
-.LASF1563:
+.LASF1564:
 	.string	"compact_considered"
-.LASF2741:
+.LASF2742:
 	.string	"kernel_param_ops"
-.LASF442:
+.LASF443:
 	.string	"dirtied_when"
-.LASF2559:
+.LASF2560:
 	.string	"swapper_pg_dir"
-.LASF336:
+.LASF337:
 	.string	"suspended_step"
-.LASF250:
+.LASF251:
 	.string	"static_key_false"
-.LASF1238:
+.LASF1239:
 	.string	"pobjects"
-.LASF1798:
+.LASF1799:
 	.string	"is_partially_uptodate"
-.LASF1233:
+.LASF1234:
 	.string	"writeback_index"
-.LASF1308:
+.LASF1309:
 	.string	"core_state"
-.LASF868:
+.LASF869:
 	.string	"timerqueue_head"
-.LASF3242:
+.LASF3246:
 	.string	"sched_setscheduler_nocheck"
-.LASF1291:
+.LASF1292:
 	.string	"f_wb_err"
-.LASF3199:
+.LASF3200:
 	.string	"schedule_work"
-.LASF2430:
+.LASF2431:
 	.string	"rt_mutex"
-.LASF990:
+.LASF991:
 	.string	"rchar"
-.LASF3156:
+.LASF3157:
 	.string	"valid_dma_direction"
-.LASF1818:
+.LASF1819:
 	.string	"bd_contains"
-.LASF1139:
+.LASF1140:
 	.string	"futex_pi_state"
-.LASF1157:
+.LASF1158:
 	.string	"kstat"
 .LASF23:
 	.string	"__kernel_uid32_t"
-.LASF2524:
+.LASF2525:
 	.string	"get_bus_free"
 .LASF32:
 	.string	"__le32"
-.LASF432:
+.LASF433:
 	.string	"i_atime"
-.LASF837:
+.LASF838:
 	.string	"pte_t"
-.LASF1257:
+.LASF1258:
 	.string	"_pt_pad_1"
-.LASF1259:
+.LASF1260:
 	.string	"_pt_pad_2"
-.LASF2972:
+.LASF2973:
 	.string	"buf_align16"
-.LASF2812:
+.LASF2813:
 	.string	"cpuhp_tasks_frozen"
-.LASF1923:
+.LASF1924:
 	.string	"nlm_lockowner"
-.LASF2341:
+.LASF2342:
 	.string	"device_driver"
-.LASF667:
+.LASF668:
 	.string	"real_cred"
-.LASF808:
+.LASF809:
 	.string	"WORK_STRUCT_FLAG_BITS"
-.LASF2448:
+.LASF2449:
 	.string	"fwnode_endpoint"
-.LASF3068:
+.LASF3069:
 	.string	"__int"
-.LASF952:
+.LASF953:
 	.string	"epoll_watches"
-.LASF2677:
+.LASF2678:
 	.string	"KCOMPACTD_WAKE"
-.LASF3123:
+.LASF3124:
 	.string	"refresh_new_image"
-.LASF2074:
+.LASF2075:
 	.string	"non_rcu"
-.LASF2638:
+.LASF2639:
 	.string	"PGALLOC_NORMAL"
-.LASF368:
+.LASF369:
 	.string	"__cpu_possible_mask"
-.LASF786:
+.LASF787:
 	.string	"timekeeping_suspended"
-.LASF1526:
+.LASF1527:
 	.string	"kcompactd_wait"
-.LASF1630:
+.LASF1631:
 	.string	"dqb_curspace"
-.LASF804:
+.LASF805:
 	.string	"WORK_STRUCT_STATIC"
-.LASF1386:
+.LASF1387:
 	.string	"gp_state"
-.LASF185:
+.LASF186:
 	.string	"bitset"
-.LASF1020:
+.LASF1021:
 	.string	"load_avg"
-.LASF1305:
+.LASF1306:
 	.string	"access"
-.LASF2491:
+.LASF2492:
 	.string	"i2c_adapter_type"
-.LASF1421:
+.LASF1422:
 	.string	"lease_break_time"
-.LASF1062:
+.LASF1063:
 	.string	"cfs_rq"
-.LASF914:
+.LASF915:
 	.string	"_uid"
-.LASF339:
+.LASF340:
 	.string	"hbp_break"
-.LASF3031:
+.LASF3032:
 	.string	"pmic_node"
-.LASF138:
+.LASF139:
 	.string	"panic_blink"
-.LASF2771:
+.LASF2772:
 	.string	"ftrace_trampoline"
-.LASF924:
+.LASF925:
 	.string	"_upper"
-.LASF543:
+.LASF544:
 	.string	"__UNIQUE_ID_android_kabi_hide23"
-.LASF2674:
+.LASF2675:
 	.string	"COMPACTSTALL"
 .LASF10:
 	.string	"short unsigned int"
-.LASF1221:
+.LASF1222:
 	.string	"__bp_harden_hyp_vecs_end"
-.LASF780:
+.LASF781:
 	.string	"tick_usec"
-.LASF1826:
+.LASF1827:
 	.string	"bd_bdi"
-.LASF2715:
+.LASF2716:
 	.string	"Elf64_Sxword"
-.LASF1940:
+.LASF1941:
 	.string	"mount2"
-.LASF1950:
+.LASF1951:
 	.string	"i_mutex_dir_key"
-.LASF1405:
+.LASF1406:
 	.string	"q_node"
-.LASF2511:
+.LASF2512:
 	.string	"master_xfer"
-.LASF2326:
+.LASF2327:
 	.string	"dev_root"
-.LASF1695:
+.LASF1696:
 	.string	"spc_warnlimit"
-.LASF1494:
+.LASF1495:
 	.string	"NR_WRITTEN"
-.LASF2582:
+.LASF2583:
 	.string	"need"
-.LASF504:
+.LASF505:
 	.string	"s_encoding"
-.LASF3200:
+.LASF3201:
 	.string	"queue_work"
-.LASF1734:
+.LASF1735:
 	.string	"gpl_crcs"
-.LASF1720:
+.LASF1721:
 	.string	"get_state"
-.LASF3159:
+.LASF3160:
 	.string	"dma_handle"
-.LASF1359:
+.LASF1360:
 	.string	"orig_pte"
-.LASF2759:
+.LASF2760:
 	.string	"param_ops_bool"
-.LASF2460:
+.LASF2461:
 	.string	"of_aliases"
-.LASF1634:
+.LASF1635:
 	.string	"dqb_curinodes"
-.LASF1464:
+.LASF1465:
 	.string	"NR_VM_ZONE_STAT_ITEMS"
-.LASF1052:
+.LASF1053:
 	.string	"load"
 .LASF5:
 	.string	"__s8"
-.LASF352:
+.LASF353:
 	.string	"fault_code"
-.LASF3009:
+.LASF3010:
 	.string	"dev_attr_waveform_version"
-.LASF2211:
+.LASF2212:
 	.string	"dma_mask"
-.LASF2118:
+.LASF2119:
 	.string	"prealloc_mutex"
-.LASF2473:
+.LASF2474:
 	.string	"DOMAIN_BUS_FSL_MC_MSI"
-.LASF1465:
+.LASF1466:
 	.string	"node_stat_item"
-.LASF2495:
+.LASF2496:
 	.string	"init_irq"
-.LASF1091:
+.LASF1092:
 	.string	"__UNIQUE_ID_android_kabi_hide46"
-.LASF1093:
+.LASF1094:
 	.string	"__UNIQUE_ID_android_kabi_hide47"
-.LASF1339:
+.LASF1340:
 	.string	"start_stack"
-.LASF2073:
+.LASF2074:
 	.string	"init_groups"
-.LASF1911:
+.LASF1912:
 	.string	"android_reserved1"
-.LASF312:
+.LASF313:
 	.string	"__nosave_end"
-.LASF2037:
+.LASF2038:
 	.string	"event"
-.LASF519:
+.LASF520:
 	.string	"s_mode"
-.LASF1610:
+.LASF1611:
 	.string	"dq_dqb_lock"
 .LASF21:
 	.string	"__kernel_ulong_t"
-.LASF2606:
+.LASF2607:
 	.string	"max_mapnr"
-.LASF2957:
+.LASF2958:
 	.string	"regmap"
-.LASF2925:
+.LASF2926:
 	.string	"shared_info"
-.LASF772:
+.LASF773:
 	.string	"read_cntp_tval_el0"
-.LASF2636:
+.LASF2637:
 	.string	"PSWPOUT"
-.LASF1074:
+.LASF1075:
 	.string	"dl_period"
-.LASF809:
+.LASF810:
 	.string	"WORK_OFFQ_FLAG_BASE"
-.LASF1485:
+.LASF1486:
 	.string	"NR_WRITEBACK_TEMP"
-.LASF2513:
+.LASF2514:
 	.string	"functionality"
-.LASF3110:
+.LASF3111:
 	.string	"clac_part_data_align8"
-.LASF305:
+.LASF306:
 	.string	"__ctors_end"
-.LASF2266:
+.LASF2267:
 	.string	"wakeup_path"
-.LASF3260:
+.LASF3266:
 	.string	"ebc_buf_state_show"
-.LASF968:
+.LASF969:
 	.string	"vm_prev"
-.LASF273:
+.LASF274:
 	.string	"arm64_const_caps_ready"
-.LASF1167:
+.LASF1168:
 	.string	"btime"
-.LASF1910:
+.LASF1911:
 	.string	"fl_u"
-.LASF2035:
+.LASF2036:
 	.string	"extra2"
 .LASF6:
 	.string	"__u8"
-.LASF115:
+.LASF116:
 	.string	"lock"
-.LASF3163:
+.LASF3164:
 	.string	"ebc_pmic_resume"
-.LASF1562:
+.LASF1563:
 	.string	"compact_cached_migrate_pfn"
-.LASF2637:
+.LASF2638:
 	.string	"PGALLOC_DMA32"
-.LASF2755:
+.LASF2756:
 	.string	"param_ops_long"
-.LASF2998:
+.LASF2999:
 	.string	"overlay_start"
-.LASF2953:
+.LASF2954:
 	.string	"frame_addr_set"
-.LASF1077:
+.LASF1078:
 	.string	"runtime"
-.LASF398:
+.LASF399:
 	.string	"d_wait"
-.LASF2450:
+.LASF2451:
 	.string	"local_fwnode"
-.LASF2748:
+.LASF2749:
 	.string	"__start___param"
-.LASF1180:
+.LASF1181:
 	.string	"list_lru_one"
-.LASF1918:
+.LASF1919:
 	.string	"lm_grant"
-.LASF143:
+.LASF144:
 	.string	"panic_on_io_nmi"
-.LASF2576:
+.LASF2577:
 	.string	"percpu_ref_func_t"
-.LASF2108:
+.LASF2109:
 	.string	"seq_stop"
-.LASF1249:
+.LASF1250:
 	.string	"compound_dtor"
-.LASF1983:
+.LASF1984:
 	.string	"xattr_handler"
-.LASF1426:
+.LASF1427:
 	.string	"kiocb"
-.LASF2899:
+.LASF2900:
 	.string	"width_mm"
-.LASF1565:
+.LASF1566:
 	.string	"compact_order_failed"
-.LASF1105:
+.LASF1106:
 	.string	"fsuid"
-.LASF3213:
+.LASF3214:
 	.string	"flag"
-.LASF1475:
+.LASF1476:
 	.string	"NR_ISOLATED_FILE"
-.LASF484:
+.LASF485:
 	.string	"s_blocksize_bits"
-.LASF2295:
+.LASF2296:
 	.string	"active_jiffies"
-.LASF1555:
+.LASF1556:
 	.string	"managed_pages"
-.LASF2589:
+.LASF2590:
 	.string	"__tracepoint_page_ref_set"
-.LASF3152:
+.LASF3153:
 	.string	"ebc_tcon_enable"
-.LASF3287:
+.LASF3293:
 	.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"
-.LASF2620:
+.LASF2621:
 	.string	"sysctl_overcommit_memory"
-.LASF2535:
+.LASF2536:
 	.string	"max_comb_2nd_msg_len"
-.LASF1601:
+.LASF1602:
 	.string	"gfp_allowed_mask"
-.LASF1186:
+.LASF1187:
 	.string	"shrinker_id"
-.LASF2569:
+.LASF2570:
 	.string	"MEMREMAP_DEC"
-.LASF753:
+.LASF754:
 	.string	"total_cpus"
-.LASF1191:
+.LASF1192:
 	.string	"root"
-.LASF34:
+.LASF35:
 	.string	"value_offset"
-.LASF743:
+.LASF744:
 	.string	"oom_reaper_list"
-.LASF353:
+.LASF354:
 	.string	"debug"
-.LASF1549:
+.LASF1550:
 	.string	"nr_reserved_highatomic"
-.LASF2364:
+.LASF2365:
 	.string	"shutdown_pre"
-.LASF2284:
+.LASF2285:
 	.string	"no_callbacks"
-.LASF2824:
+.LASF2825:
 	.string	"prevent_deferred_probe"
 .LASF9:
 	.string	"__u16"
-.LASF1026:
+.LASF1027:
 	.string	"wait_count"
-.LASF1487:
+.LASF1488:
 	.string	"NR_SHMEM_THPS"
-.LASF1735:
+.LASF1736:
 	.string	"sig_ok"
-.LASF2080:
+.LASF2081:
 	.string	"lpj_fine"
-.LASF503:
+.LASF504:
 	.string	"s_vop"
-.LASF1650:
+.LASF1651:
 	.string	"qf_owner"
-.LASF3225:
+.LASF3229:
 	.string	"__write_once_size"
-.LASF2831:
+.LASF2832:
 	.string	"kmalloc_cache_type"
-.LASF574:
+.LASF575:
 	.string	"mutex"
-.LASF3191:
+.LASF3192:
 	.string	"out_values"
-.LASF839:
+.LASF840:
 	.string	"pgd_t"
-.LASF600:
+.LASF601:
 	.string	"nr_cpus_allowed"
-.LASF1460:
+.LASF1461:
 	.string	"NR_KERNEL_STACK_KB"
-.LASF1500:
+.LASF1501:
 	.string	"NR_VM_NODE_STAT_ITEMS"
-.LASF233:
+.LASF234:
 	.string	"raw_spinlock_t"
-.LASF2936:
+.LASF2937:
 	.string	"vir_width"
-.LASF3216:
+.LASF3217:
 	.string	"INIT_LIST_HEAD"
-.LASF1938:
+.LASF1939:
 	.string	"fs_flags"
-.LASF1792:
+.LASF1793:
 	.string	"freepage"
-.LASF2273:
+.LASF2274:
 	.string	"work"
-.LASF2053:
+.LASF2054:
 	.string	"keytype"
-.LASF951:
+.LASF952:
 	.string	"sigpending"
-.LASF2214:
+.LASF2215:
 	.string	"dma_pfn_offset"
-.LASF1189:
+.LASF1190:
 	.string	"radix_tree_node"
-.LASF3218:
+.LASF3219:
 	.string	"sign_extend64"
-.LASF2313:
+.LASF2314:
 	.string	"wake_irq"
-.LASF3033:
+.LASF3034:
 	.string	"ulogo_addr"
-.LASF859:
+.LASF860:
 	.string	"pcpu_fc"
-.LASF2297:
+.LASF2298:
 	.string	"accounting_timestamp"
-.LASF508:
+.LASF509:
 	.string	"s_bdev"
-.LASF177:
+.LASF178:
 	.string	"tz_dsttime"
 .LASF12:
 	.string	"__u32"
-.LASF2659:
+.LASF2660:
 	.string	"PGINODESTEAL"
-.LASF643:
+.LASF644:
 	.string	"ptraced"
-.LASF2751:
+.LASF2752:
 	.string	"param_ops_short"
-.LASF3257:
+.LASF3261:
 	.string	"of_find_device_by_node"
-.LASF2553:
+.LASF2554:
 	.string	"HRTIMER_SOFTIRQ"
-.LASF801:
+.LASF802:
 	.string	"WORK_STRUCT_DELAYED"
-.LASF454:
+.LASF455:
 	.string	"i_sequence"
-.LASF1509:
+.LASF1510:
 	.string	"pgdat"
-.LASF1088:
+.LASF1089:
 	.string	"sigval"
-.LASF2609:
+.LASF2610:
 	.string	"page_cluster"
-.LASF1632:
+.LASF1633:
 	.string	"dqb_ihardlimit"
-.LASF410:
+.LASF411:
 	.string	"d_lockref"
-.LASF2242:
+.LASF2243:
 	.string	"rpm_request"
-.LASF3061:
+.LASF3062:
 	.string	"ebc_io_ctl"
-.LASF1149:
+.LASF1150:
 	.string	"addr"
-.LASF2385:
+.LASF2386:
 	.string	"device_private"
-.LASF3154:
+.LASF3155:
 	.string	"get_dma_ops"
-.LASF2697:
+.LASF2698:
 	.string	"watermark_scale_factor"
-.LASF1841:
+.LASF1842:
 	.string	"i_dir_seq"
-.LASF2123:
+.LASF2124:
 	.string	"KOBJ_NS_TYPE_NONE"
-.LASF1801:
+.LASF1802:
 	.string	"swap_activate"
-.LASF984:
+.LASF985:
 	.string	"mm_rss_stat"
-.LASF1722:
+.LASF1723:
 	.string	"mkobj"
-.LASF2963:
+.LASF2964:
 	.string	"direct_buf_real_size"
-.LASF3277:
+.LASF3283:
 	.string	"__pm_relax"
-.LASF472:
+.LASF473:
 	.string	"d_delete"
-.LASF1622:
+.LASF1623:
 	.string	"PRJQUOTA"
-.LASF2069:
+.LASF2070:
 	.string	"begin"
-.LASF2736:
+.LASF2737:
 	.string	"sh_link"
-.LASF3024:
+.LASF3025:
 	.string	"ebc_suspend"
-.LASF2357:
+.LASF2358:
 	.string	"cls_msk"
-.LASF2665:
+.LASF2666:
 	.string	"PGROTATED"
-.LASF1670:
+.LASF1671:
 	.string	"write_info"
-.LASF2159:
+.LASF2160:
 	.string	"kobj_attribute"
-.LASF2279:
+.LASF2280:
 	.string	"idle_notification"
-.LASF1807:
+.LASF1808:
 	.string	"block_device"
-.LASF2122:
+.LASF2123:
 	.string	"kobj_ns_type"
-.LASF2618:
+.LASF2619:
 	.string	"sysctl_user_reserve_kbytes"
-.LASF2816:
+.LASF2817:
 	.string	"num_resources"
-.LASF1575:
+.LASF1576:
 	.string	"notifier_fn_t"
-.LASF3032:
+.LASF3033:
 	.string	"pmic_client"
-.LASF2571:
+.LASF2572:
 	.string	"miscdevice"
-.LASF655:
+.LASF656:
 	.string	"time_in_state"
-.LASF3041:
+.LASF3042:
 	.string	"ebc_logo_init"
-.LASF1268:
+.LASF1269:
 	.string	"kill"
-.LASF1029:
+.LASF1030:
 	.string	"iowait_sum"
-.LASF3124:
+.LASF3125:
 	.string	"image_new"
 .LASF15:
 	.string	"__u64"
-.LASF694:
+.LASF695:
 	.string	"journal_info"
-.LASF2876:
+.LASF2877:
 	.string	"EPD_FULL_GL16"
-.LASF625:
+.LASF626:
 	.string	"sched_contributes_to_load"
-.LASF1009:
+.LASF1010:
 	.string	"weight"
-.LASF467:
+.LASF468:
 	.string	"i_private"
-.LASF1985:
+.LASF1986:
 	.string	"serial"
-.LASF111:
+.LASF112:
 	.string	"flush"
-.LASF2863:
+.LASF2864:
 	.string	"ebc_buf_s"
-.LASF2196:
+.LASF2197:
 	.string	"runtime_suspend"
-.LASF437:
+.LASF438:
 	.string	"i_blkbits"
-.LASF2455:
+.LASF2456:
 	.string	"value"
-.LASF2992:
+.LASF2993:
 	.string	"frame_timer"
-.LASF1032:
+.LASF1033:
 	.string	"sum_sleep_runtime"
-.LASF3037:
+.LASF3038:
 	.string	"ulogo_addr_str"
-.LASF3098:
+.LASF3099:
 	.string	"flip"
-.LASF1078:
+.LASF1079:
 	.string	"deadline"
-.LASF963:
+.LASF964:
 	.string	"vmas"
-.LASF1328:
+.LASF1329:
 	.string	"pinned_vm"
-.LASF1514:
+.LASF1515:
 	.string	"node_start_pfn"
-.LASF2547:
+.LASF2548:
 	.string	"NET_TX_SOFTIRQ"
-.LASF703:
+.LASF704:
 	.string	"psi_flags"
-.LASF1358:
+.LASF1359:
 	.string	"address"
-.LASF1830:
+.LASF1831:
 	.string	"bd_fsfreeze_mutex"
-.LASF1234:
+.LASF1235:
 	.string	"a_ops"
-.LASF2353:
+.LASF2354:
 	.string	"PROBE_FORCE_SYNCHRONOUS"
-.LASF94:
+.LASF95:
 	.string	"dmesg_restrict"
-.LASF965:
+.LASF966:
 	.string	"vm_start"
-.LASF492:
+.LASF493:
 	.string	"s_flags"
-.LASF372:
+.LASF373:
 	.string	"cpumask_var_t"
-.LASF1299:
+.LASF1300:
 	.string	"fault"
-.LASF80:
+.LASF81:
 	.string	"saved_command_line"
-.LASF1975:
+.LASF1976:
 	.string	"show_stats"
-.LASF1076:
+.LASF1077:
 	.string	"dl_density"
-.LASF1659:
+.LASF1660:
 	.string	"read_dqblk"
-.LASF1615:
+.LASF1616:
 	.string	"dq_flags"
-.LASF3101:
+.LASF3102:
 	.string	"buffer_new"
-.LASF212:
+.LASF213:
 	.string	"user_fpsimd_state"
-.LASF3256:
+.LASF3260:
 	.string	"device_create_file"
-.LASF520:
+.LASF521:
 	.string	"s_time_gran"
-.LASF2363:
+.LASF2364:
 	.string	"dev_release"
-.LASF1364:
+.LASF1365:
 	.string	"kernel_cap_t"
-.LASF575:
+.LASF576:
 	.string	"wait_list"
-.LASF2280:
+.LASF2281:
 	.string	"request_pending"
-.LASF872:
+.LASF873:
 	.string	"hrtimer"
-.LASF493:
+.LASF494:
 	.string	"s_iflags"
-.LASF717:
+.LASF718:
 	.string	"perf_event_ctxp"
-.LASF456:
+.LASF457:
 	.string	"i_dio_count"
-.LASF509:
+.LASF510:
 	.string	"s_bdi"
-.LASF2856:
+.LASF2857:
 	.string	"wf_table"
-.LASF3130:
+.LASF3131:
 	.string	"image_new_tmp"
-.LASF1731:
+.LASF1732:
 	.string	"num_kp"
-.LASF3286:
+.LASF3292:
 	.string	"__pm_stay_awake"
-.LASF2564:
+.LASF2565:
 	.string	"vmap_area_list"
-.LASF3006:
+.LASF3007:
 	.string	"ebc_auto_thread_sem"
-.LASF629:
+.LASF630:
 	.string	"in_execve"
-.LASF2245:
+.LASF2246:
 	.string	"RPM_REQ_SUSPEND"
-.LASF482:
+.LASF483:
 	.string	"s_list"
-.LASF1631:
+.LASF1632:
 	.string	"dqb_rsvspace"
-.LASF1724:
+.LASF1725:
 	.string	"version"
-.LASF2563:
+.LASF2564:
 	.string	"xen_start_flags"
-.LASF2881:
+.LASF2882:
 	.string	"EPD_PART_GL16"
-.LASF1538:
+.LASF1539:
 	.string	"stat_threshold"
-.LASF2362:
+.LASF2363:
 	.string	"class_release"
-.LASF1885:
+.LASF1886:
 	.string	"fu_llist"
-.LASF688:
+.LASF689:
 	.string	"alloc_lock"
-.LASF513:
+.LASF514:
 	.string	"s_dquot"
-.LASF825:
+.LASF826:
 	.string	"system_highpri_wq"
-.LASF1193:
+.LASF1194:
 	.string	"tags"
-.LASF1884:
+.LASF1885:
 	.string	"prev_pos"
-.LASF2310:
+.LASF2311:
 	.string	"expire_count"
-.LASF276:
+.LASF277:
 	.string	"_etext"
-.LASF496:
+.LASF497:
 	.string	"s_umount"
-.LASF2136:
+.LASF2137:
 	.string	"is_bin_visible"
-.LASF1357:
+.LASF1358:
 	.string	"pgoff"
-.LASF2221:
+.LASF2222:
 	.string	"of_node"
-.LASF2884:
+.LASF2885:
 	.string	"EPD_PART_GCC16"
-.LASF2019:
+.LASF2020:
 	.string	"names_cachep"
-.LASF784:
+.LASF785:
 	.string	"preset_lpj"
-.LASF2991:
+.LASF2992:
 	.string	"vdd_timer"
-.LASF2220:
+.LASF2221:
 	.string	"archdata"
-.LASF1436:
+.LASF1437:
 	.string	"ia_uid"
-.LASF1366:
+.LASF1367:
 	.string	"__cap_init_eff_set"
-.LASF727:
+.LASF728:
 	.string	"delays"
-.LASF640:
+.LASF641:
 	.string	"children"
-.LASF1292:
+.LASF1293:
 	.string	"rb_subtree_last"
-.LASF2268:
+.LASF2269:
 	.string	"no_pm_callbacks"
-.LASF1597:
+.LASF1598:
 	.string	"llc_sibling"
-.LASF2670:
+.LASF2671:
 	.string	"PGMIGRATE_FAIL"
-.LASF2435:
+.LASF2436:
 	.string	"device_get_match_data"
-.LASF649:
+.LASF650:
 	.string	"vfork_done"
-.LASF198:
+.LASF199:
 	.string	"nanosleep"
-.LASF1415:
+.LASF1416:
 	.string	"inodes_stat_t"
-.LASF842:
+.LASF843:
 	.string	"pud_t"
-.LASF2814:
+.LASF2815:
 	.string	"platform_device"
-.LASF1694:
+.LASF1695:
 	.string	"rt_spc_timelimit"
-.LASF220:
+.LASF221:
 	.string	"tail"
-.LASF1439:
+.LASF1440:
 	.string	"ia_atime"
-.LASF2543:
+.LASF2544:
 	.string	"irq_default_affinity"
-.LASF724:
+.LASF725:
 	.string	"tlb_ubc"
-.LASF2415:
+.LASF2416:
 	.string	"remap"
-.LASF1647:
+.LASF1648:
 	.string	"quota_format_type"
-.LASF2815:
+.LASF2816:
 	.string	"id_auto"
-.LASF1178:
+.LASF1179:
 	.string	"seeks"
-.LASF576:
+.LASF577:
 	.string	"task_struct"
-.LASF2900:
+.LASF2901:
 	.string	"height_mm"
-.LASF2639:
+.LASF2640:
 	.string	"PGALLOC_MOVABLE"
-.LASF2271:
+.LASF2272:
 	.string	"suspend_timer"
-.LASF1988:
+.LASF1989:
 	.string	"quotalen"
-.LASF2409:
+.LASF2410:
 	.string	"sync_sg_for_cpu"
-.LASF1528:
+.LASF1529:
 	.string	"totalreserve_pages"
-.LASF449:
+.LASF450:
 	.string	"i_wb_frn_history"
-.LASF585:
+.LASF586:
 	.string	"last_wakee"
-.LASF63:
+.LASF64:
 	.string	"next"
-.LASF814:
+.LASF815:
 	.string	"WORK_OFFQ_LEFT"
-.LASF222:
+.LASF223:
 	.string	"arch_spinlock_t"
-.LASF1245:
+.LASF1246:
 	.string	"slab_cache"
-.LASF1128:
+.LASF1129:
 	.string	"nr_tasks"
-.LASF2507:
+.LASF2508:
 	.string	"bus_recovery_info"
-.LASF1324:
+.LASF1325:
 	.string	"mmlist"
-.LASF1719:
+.LASF1720:
 	.string	"set_dqblk"
-.LASF1243:
+.LASF1244:
 	.string	"s_mem"
-.LASF2239:
+.LASF2240:
 	.string	"RPM_RESUMING"
-.LASF470:
+.LASF471:
 	.string	"d_weak_revalidate"
-.LASF2986:
+.LASF2987:
 	.string	"prev_dsp_buf"
-.LASF1492:
+.LASF1493:
 	.string	"NR_VMSCAN_IMMEDIATE"
-.LASF512:
+.LASF513:
 	.string	"s_quota_types"
-.LASF1454:
+.LASF1455:
 	.string	"NR_ZONE_INACTIVE_FILE"
-.LASF2472:
+.LASF2473:
 	.string	"DOMAIN_BUS_IPI"
-.LASF1313:
+.LASF1314:
 	.string	"vmacache_seqnum"
-.LASF761:
+.LASF762:
 	.string	"setup_max_cpus"
-.LASF1833:
+.LASF1834:
 	.string	"i_nlink"
-.LASF2943:
+.LASF2944:
 	.string	"mirror"
-.LASF1787:
+.LASF1788:
 	.string	"write_begin"
-.LASF2228:
+.LASF2229:
 	.string	"groups"
-.LASF693:
+.LASF694:
 	.string	"pi_blocked_on"
-.LASF3028:
+.LASF3029:
 	.string	"ebc_probe"
-.LASF500:
+.LASF501:
 	.string	"s_xattr"
-.LASF3038:
+.LASF3039:
 	.string	"klogo_addr_str"
-.LASF992:
+.LASF993:
 	.string	"syscr"
-.LASF1946:
+.LASF1947:
 	.string	"s_vfs_rename_key"
-.LASF1432:
+.LASF1433:
 	.string	"ki_ioprio"
-.LASF1162:
+.LASF1163:
 	.string	"attributes_mask"
-.LASF199:
+.LASF200:
 	.string	"restart_block"
-.LASF38:
+.LASF39:
 	.string	"umode_t"
-.LASF200:
+.LASF201:
 	.string	"memstart_addr"
-.LASF2642:
+.LASF2643:
 	.string	"ALLOCSTALL_MOVABLE"
-.LASF742:
+.LASF743:
 	.string	"pagefault_disabled"
-.LASF993:
+.LASF994:
 	.string	"syscw"
-.LASF1400:
+.LASF1401:
 	.string	"guid_null"
-.LASF223:
+.LASF224:
 	.string	"wlocked"
-.LASF2689:
+.LASF2690:
 	.string	"NR_VM_EVENT_ITEMS"
-.LASF1960:
+.LASF1961:
 	.string	"freeze_super"
-.LASF537:
+.LASF538:
 	.string	"s_inode_list_lock"
-.LASF2599:
+.LASF2600:
 	.string	"align"
-.LASF3109:
+.LASF3110:
 	.string	"frame_idx"
-.LASF203:
+.LASF204:
 	.string	"mm_segment_t"
-.LASF2757:
+.LASF2758:
 	.string	"param_ops_ullong"
-.LASF1909:
+.LASF1910:
 	.string	"fl_lmops"
-.LASF2818:
+.LASF2819:
 	.string	"driver_override"
-.LASF1014:
+.LASF1015:
 	.string	"sched_avg"
-.LASF1713:
+.LASF1714:
 	.string	"quota_enable"
-.LASF1547:
+.LASF1548:
 	.string	"zone"
-.LASF1795:
+.LASF1796:
 	.string	"isolate_page"
-.LASF663:
+.LASF664:
 	.string	"maj_flt"
-.LASF228:
+.LASF229:
 	.string	"arch_rwlock_t"
-.LASF3275:
+.LASF3281:
 	.string	"ebc_osd_buf_clone"
-.LASF161:
+.LASF162:
 	.string	"c_false"
-.LASF899:
+.LASF900:
 	.string	"clock_base"
-.LASF2907:
+.LASF2908:
 	.string	"pmic_read_temperature"
-.LASF1797:
+.LASF1798:
 	.string	"launder_page"
-.LASF1842:
+.LASF1843:
 	.string	"cdev"
-.LASF1063:
+.LASF1064:
 	.string	"my_q"
-.LASF642:
+.LASF643:
 	.string	"group_leader"
-.LASF1855:
+.LASF1856:
 	.string	"mkdir"
-.LASF1572:
+.LASF1573:
 	.string	"zonelist"
-.LASF252:
+.LASF253:
 	.string	"FTR_EXACT"
-.LASF2572:
+.LASF2573:
 	.string	"minor"
-.LASF1698:
+.LASF1699:
 	.string	"nextents"
-.LASF3157:
+.LASF3158:
 	.string	"dma_direction"
 .LASF1:
 	.string	"sizetype"
-.LASF678:
+.LASF679:
 	.string	"real_blocked"
-.LASF1333:
+.LASF1334:
 	.string	"arg_lock"
-.LASF1740:
+.LASF1741:
 	.string	"num_exentries"
-.LASF3089:
+.LASF3090:
 	.string	"check_out"
-.LASF2608:
+.LASF2609:
 	.string	"high_memory"
-.LASF48:
+.LASF49:
 	.string	"int32_t"
-.LASF3020:
+.LASF3021:
 	.string	"__exitcall_ebc_exit"
-.LASF1039:
+.LASF1040:
 	.string	"nr_failed_migrations_running"
-.LASF896:
+.LASF897:
 	.string	"next_timer"
-.LASF740:
+.LASF741:
 	.string	"throttle_queue"
-.LASF3270:
+.LASF3276:
 	.string	"finish_wait"
-.LASF1479:
+.LASF1480:
 	.string	"WORKINGSET_NODERECLAIM"
-.LASF540:
+.LASF541:
 	.string	"s_inodes_wb"
-.LASF2247:
+.LASF2248:
 	.string	"RPM_REQ_RESUME"
-.LASF2044:
+.LASF2045:
 	.string	"keyring_index_key"
-.LASF3151:
+.LASF3152:
 	.string	"ebc_tcon_disable"
-.LASF1420:
+.LASF1421:
 	.string	"leases_enable"
-.LASF226:
+.LASF227:
 	.string	"qrwlock"
-.LASF2687:
+.LASF2688:
 	.string	"SWAP_RA"
-.LASF828:
+.LASF829:
 	.string	"system_freezable_wq"
-.LASF1879:
+.LASF1880:
 	.string	"file_ra_state"
-.LASF948:
+.LASF949:
 	.string	"user_struct"
-.LASF2365:
+.LASF2366:
 	.string	"ns_type"
-.LASF2888:
+.LASF2889:
 	.string	"EPD_DU4"
-.LASF588:
+.LASF589:
 	.string	"on_rq"
-.LASF2339:
+.LASF2340:
 	.string	"lock_key"
-.LASF2562:
+.LASF2563:
 	.string	"tramp_pg_dir"
-.LASF3013:
+.LASF3014:
 	.string	"dev_attr_ebc_version"
-.LASF863:
+.LASF864:
 	.string	"PCPU_FC_NR"
-.LASF2119:
+.LASF2120:
 	.string	"prealloc_buf"
-.LASF2377:
+.LASF2378:
 	.string	"DL_DEV_DRIVER_BOUND"
-.LASF841:
+.LASF842:
 	.string	"pgprot_t"
-.LASF1956:
+.LASF1957:
 	.string	"drop_inode"
-.LASF1766:
+.LASF1767:
 	.string	"num_trace_evals"
-.LASF2336:
+.LASF2337:
 	.string	"num_vf"
-.LASF1534:
+.LASF1535:
 	.string	"isolate_mode_t"
-.LASF3158:
+.LASF3159:
 	.string	"debug_dma_sync_single_for_device"
-.LASF98:
+.LASF99:
 	.string	"llseek"
-.LASF2376:
+.LASF2377:
 	.string	"DL_DEV_PROBING"
-.LASF1785:
+.LASF1786:
 	.string	"set_page_dirty"
-.LASF1819:
+.LASF1820:
 	.string	"bd_block_size"
-.LASF1660:
+.LASF1661:
 	.string	"commit_dqblk"
-.LASF2150:
+.LASF2151:
 	.string	"namespace"
-.LASF1708:
+.LASF1709:
 	.string	"i_ino_warnlimit"
-.LASF2789:
+.LASF2790:
 	.string	"MODULE_STATE_GOING"
-.LASF1095:
+.LASF1096:
 	.string	"rcu_node"
-.LASF2200:
+.LASF2201:
 	.string	"init_name"
-.LASF83:
+.LASF84:
 	.string	"late_time_init"
-.LASF1963:
+.LASF1964:
 	.string	"unfreeze_fs"
-.LASF906:
+.LASF907:
 	.string	"nodemask_t"
-.LASF2227:
+.LASF2228:
 	.string	"class"
-.LASF1891:
+.LASF1892:
 	.string	"file_lock"
-.LASF324:
+.LASF325:
 	.string	"__idmap_text_end"
-.LASF2965:
+.LASF2966:
 	.string	"frame_total"
-.LASF775:
+.LASF776:
 	.string	"read_cntvct_el0"
-.LASF242:
+.LASF243:
 	.string	"target"
-.LASF2545:
+.LASF2546:
 	.string	"HI_SOFTIRQ"
-.LASF3160:
+.LASF3161:
 	.string	"direction"
-.LASF3129:
+.LASF3130:
 	.string	"image_bg_data"
-.LASF957:
+.LASF958:
 	.string	"session_keyring"
-.LASF333:
+.LASF334:
 	.string	"__boot_cpu_mode"
-.LASF2050:
+.LASF2051:
 	.string	"key_restrict_link_func_t"
-.LASF1484:
+.LASF1485:
 	.string	"NR_WRITEBACK"
-.LASF3115:
+.LASF3116:
 	.string	"frame_count"
-.LASF486:
+.LASF487:
 	.string	"s_maxbytes"
-.LASF2356:
+.LASF2357:
 	.string	"acpi_device_id"
-.LASF1681:
+.LASF1682:
 	.string	"d_ino_count"
-.LASF2686:
+.LASF2687:
 	.string	"UNEVICTABLE_PGSTRANDED"
-.LASF2490:
+.LASF2491:
 	.string	"i2c_bus_type"
-.LASF884:
+.LASF885:
 	.string	"hrtimer_cpu_base"
-.LASF3282:
+.LASF3288:
 	.string	"ebc_notify"
-.LASF1390:
+.LASF1391:
 	.string	"cb_head"
-.LASF1655:
+.LASF1656:
 	.string	"check_quota_file"
-.LASF1924:
+.LASF1925:
 	.string	"nfs4_lock_info"
-.LASF1990:
+.LASF1991:
 	.string	"restrict_link"
-.LASF2320:
+.LASF2321:
 	.string	"dev_archdata"
-.LASF2021:
+.LASF2022:
 	.string	"def_blk_fops"
-.LASF461:
+.LASF462:
 	.string	"i_devices"
-.LASF328:
+.LASF329:
 	.string	"__inittext_end"
-.LASF716:
+.LASF717:
 	.string	"pi_state_cache"
-.LASF974:
+.LASF975:
 	.string	"anon_vma_chain"
-.LASF1732:
+.LASF1733:
 	.string	"num_gpl_syms"
-.LASF602:
+.LASF603:
 	.string	"cpus_requested"
-.LASF2593:
+.LASF2594:
 	.string	"__tracepoint_page_ref_mod_unless"
-.LASF3168:
+.LASF3169:
 	.string	"wake_lock_init"
-.LASF1185:
+.LASF1186:
 	.string	"list_lru"
-.LASF215:
+.LASF216:
 	.string	"fpcr"
-.LASF2099:
+.LASF2100:
 	.string	"target_kn"
-.LASF911:
+.LASF912:
 	.string	"sival_ptr"
-.LASF419:
+.LASF420:
 	.string	"i_opflags"
-.LASF713:
+.LASF714:
 	.string	"robust_list"
-.LASF1714:
+.LASF1715:
 	.string	"quota_disable"
-.LASF2055:
+.LASF2056:
 	.string	"serial_node"
-.LASF1700:
+.LASF1701:
 	.string	"s_incoredqs"
-.LASF476:
+.LASF477:
 	.string	"d_iput"
-.LASF107:
+.LASF108:
 	.string	"compat_ioctl"
-.LASF3176:
+.LASF3177:
 	.string	"__range_ok"
-.LASF286:
+.LASF287:
 	.string	"__start_ro_after_init"
-.LASF2706:
+.LASF2707:
 	.string	"num_poisoned_pages"
-.LASF904:
+.LASF905:
 	.string	"filter"
-.LASF3161:
+.LASF3162:
 	.string	"ebc_pmic_get_vcom"
-.LASF2944:
+.LASF2945:
 	.string	"ebc_tcon"
-.LASF2610:
+.LASF2611:
 	.string	"sysctl_legacy_va_layout"
-.LASF818:
+.LASF819:
 	.string	"WORK_STRUCT_WQ_DATA_MASK"
-.LASF2379:
+.LASF2380:
 	.string	"dev_links_info"
-.LASF45:
+.LASF46:
 	.string	"loff_t"
-.LASF2716:
+.LASF2717:
 	.string	"d_val"
-.LASF645:
+.LASF646:
 	.string	"thread_pid"
-.LASF802:
+.LASF803:
 	.string	"WORK_STRUCT_PWQ"
-.LASF1496:
+.LASF1497:
 	.string	"NR_UNRECLAIMABLE_PAGES"
-.LASF2512:
+.LASF2513:
 	.string	"smbus_xfer"
-.LASF2763:
+.LASF2764:
 	.string	"param_array_ops"
-.LASF2676:
+.LASF2677:
 	.string	"COMPACTSUCCESS"
-.LASF934:
+.LASF935:
 	.string	"_arch"
-.LASF2726:
+.LASF2727:
 	.string	"st_value"
-.LASF2859:
+.LASF2860:
 	.string	"buf_user"
-.LASF2125:
+.LASF2126:
 	.string	"KOBJ_NS_TYPES"
-.LASF68:
+.LASF69:
 	.string	"pprev"
-.LASF424:
+.LASF425:
 	.string	"i_default_acl"
-.LASF1407:
+.LASF1408:
 	.string	"ioc_node"
-.LASF2233:
+.LASF2234:
 	.string	"of_node_reused"
-.LASF2113:
+.LASF2114:
 	.string	"kernfs_node_id"
-.LASF2352:
+.LASF2353:
 	.string	"PROBE_PREFER_ASYNCHRONOUS"
-.LASF1134:
+.LASF1135:
 	.string	"icq_list"
 .LASF25:
 	.string	"__kernel_size_t"
-.LASF615:
+.LASF616:
 	.string	"active_mm"
-.LASF1435:
+.LASF1436:
 	.string	"ia_mode"
-.LASF1080:
+.LASF1081:
 	.string	"dl_boosted"
-.LASF1177:
+.LASF1178:
 	.string	"batch"
-.LASF1881:
+.LASF1882:
 	.string	"async_size"
-.LASF705:
+.LASF706:
 	.string	"acct_vm_mem1"
-.LASF2737:
+.LASF2738:
 	.string	"sh_info"
-.LASF2148:
+.LASF2149:
 	.string	"default_attrs"
-.LASF2600:
+.LASF2601:
 	.string	"memory_type"
-.LASF854:
+.LASF855:
 	.string	"rb_root"
-.LASF1045:
+.LASF1046:
 	.string	"nr_wakeups_local"
-.LASF1182:
+.LASF1183:
 	.string	"list_lru_memcg"
-.LASF1776:
+.LASF1777:
 	.string	"WRITE_LIFE_NONE"
-.LASF1775:
+.LASF1776:
 	.string	"WRITE_LIFE_NOT_SET"
-.LASF2749:
+.LASF2750:
 	.string	"__stop___param"
-.LASF2813:
+.LASF2814:
 	.string	"cpu_subsys"
-.LASF679:
+.LASF680:
 	.string	"saved_sigmask"
-.LASF413:
+.LASF414:
 	.string	"d_time"
-.LASF2958:
+.LASF2959:
 	.string	"ebc_info"
-.LASF239:
+.LASF240:
 	.string	"entries"
-.LASF1000:
+.LASF1001:
 	.string	"cpu_id"
-.LASF2951:
+.LASF2952:
 	.string	"dsp_mode_set"
-.LASF2651:
+.LASF2652:
 	.string	"PGMAJFAULT"
-.LASF1546:
+.LASF1547:
 	.string	"__MAX_NR_ZONES"
-.LASF2463:
+.LASF2464:
 	.string	"irq_fwspec"
-.LASF1804:
+.LASF1805:
 	.string	"iov_iter"
-.LASF510:
+.LASF511:
 	.string	"s_mtd"
-.LASF2743:
+.LASF2744:
 	.string	"kparam_string"
-.LASF2205:
+.LASF2206:
 	.string	"power"
-.LASF265:
+.LASF266:
 	.string	"strict_mask"
-.LASF3269:
+.LASF3275:
 	.string	"init_wait_entry"
-.LASF2786:
+.LASF2787:
 	.string	"module_state"
-.LASF3228:
+.LASF3232:
 	.string	"_dev_info"
-.LASF416:
+.LASF417:
 	.string	"d_subdirs"
-.LASF1986:
+.LASF1987:
 	.string	"last_used_at"
-.LASF1277:
+.LASF1278:
 	.string	"f_write_hint"
-.LASF1007:
+.LASF1008:
 	.string	"last_queued"
-.LASF1118:
+.LASF1119:
 	.string	"user_ns"
-.LASF2635:
+.LASF2636:
 	.string	"PSWPIN"
-.LASF66:
+.LASF67:
 	.string	"first"
-.LASF2229:
+.LASF2230:
 	.string	"iommu_group"
-.LASF558:
+.LASF559:
 	.string	"wait_pidfd"
-.LASF1945:
+.LASF1946:
 	.string	"s_umount_key"
-.LASF2928:
+.LASF2929:
 	.string	"xen_start_info"
-.LASF2457:
+.LASF2458:
 	.string	"of_fwnode_ops"
-.LASF2867:
+.LASF2868:
 	.string	"buf_mode"
-.LASF973:
+.LASF974:
 	.string	"vm_flags"
-.LASF1723:
+.LASF1724:
 	.string	"modinfo_attrs"
-.LASF2502:
+.LASF2503:
 	.string	"mux_lock"
-.LASF196:
+.LASF197:
 	.string	"has_timeout"
-.LASF2739:
+.LASF2740:
 	.string	"sh_entsize"
-.LASF418:
+.LASF419:
 	.string	"i_mode"
-.LASF2029:
+.LASF2030:
 	.string	"proc_handler"
-.LASF2219:
+.LASF2220:
 	.string	"removed_mem"
-.LASF247:
+.LASF248:
 	.string	"jump_label_t"
-.LASF3142:
+.LASF3262:
+	.string	"of_get_property"
+.LASF3143:
 	.string	"ebc_tcon_frame_start"
-.LASF2711:
+.LASF2712:
 	.string	"Elf64_Half"
-.LASF2286:
+.LASF2287:
 	.string	"use_autosuspend"
-.LASF3021:
+.LASF3022:
 	.string	"ebc_init"
-.LASF674:
+.LASF675:
 	.string	"nsproxy"
-.LASF2254:
+.LASF2255:
 	.string	"can_wakeup"
-.LASF2546:
+.LASF2547:
 	.string	"TIMER_SOFTIRQ"
-.LASF3120:
+.LASF3121:
 	.string	"temp_data"
-.LASF1214:
+.LASF1215:
 	.string	"xol_area"
-.LASF234:
+.LASF235:
 	.string	"rlock"
-.LASF1887:
+.LASF1888:
 	.string	"fl_owner_t"
-.LASF2731:
+.LASF2732:
 	.string	"sh_type"
-.LASF1103:
+.LASF1104:
 	.string	"euid"
-.LASF1100:
+.LASF1101:
 	.string	"wait"
-.LASF1749:
+.LASF1750:
 	.string	"bug_table"
-.LASF962:
+.LASF963:
 	.string	"seqnum"
-.LASF443:
+.LASF444:
 	.string	"dirtied_time_when"
-.LASF1895:
+.LASF1896:
 	.string	"fl_block"
-.LASF2701:
+.LASF2702:
 	.string	"init_on_free"
-.LASF1151:
+.LASF1152:
 	.string	"nr_pages"
-.LASF3137:
+.LASF3138:
 	.string	"ebc_power_set"
-.LASF1761:
+.LASF1762:
 	.string	"num_trace_bprintk_fmt"
-.LASF3222:
+.LASF3226:
 	.string	"__fls"
-.LASF1129:
+.LASF1130:
 	.string	"ioprio"
-.LASF2994:
+.LASF2995:
 	.string	"is_early_suspend"
-.LASF1163:
+.LASF1164:
 	.string	"rdev"
-.LASF1236:
+.LASF1237:
 	.string	"private_data"
-.LASF1878:
+.LASF1879:
 	.string	"signum"
-.LASF507:
+.LASF508:
 	.string	"s_mounts"
-.LASF634:
+.LASF635:
 	.string	"use_memdelay"
-.LASF1153:
+.LASF1154:
 	.string	"caller"
-.LASF346:
+.LASF347:
 	.string	"thread_struct"
-.LASF2154:
+.LASF2155:
 	.string	"envp"
-.LASF787:
+.LASF788:
 	.string	"persistent_clock_is_local"
-.LASF2413:
+.LASF2414:
 	.string	"dma_supported"
-.LASF3193:
+.LASF3194:
 	.string	"dev_set_drvdata"
-.LASF3283:
+.LASF3289:
 	.string	"epd_lut_get"
-.LASF1535:
+.LASF1536:
 	.string	"per_cpu_pages"
-.LASF1166:
+.LASF1167:
 	.string	"ctime"
-.LASF2414:
+.LASF2415:
 	.string	"set_dma_mask"
-.LASF112:
+.LASF113:
 	.string	"release"
-.LASF2370:
+.LASF2371:
 	.string	"max_segment_size"
-.LASF36:
+.LASF37:
 	.string	"__kernel_dev_t"
-.LASF2109:
+.LASF2110:
 	.string	"atomic_write_len"
-.LASF1635:
+.LASF1636:
 	.string	"dqb_btime"
-.LASF2393:
+.LASF2394:
 	.string	"revmap_tree"
-.LASF1318:
+.LASF1319:
 	.string	"mm_users"
-.LASF1477:
+.LASF1478:
 	.string	"WORKINGSET_ACTIVATE"
-.LASF515:
+.LASF516:
 	.string	"s_id"
-.LASF314:
+.LASF315:
 	.string	"__alt_instructions_end"
-.LASF1462:
+.LASF1463:
 	.string	"NR_ZSPAGES"
-.LASF532:
+.LASF533:
 	.string	"s_dentry_lru"
-.LASF2549:
+.LASF2550:
 	.string	"BLOCK_SOFTIRQ"
-.LASF1411:
+.LASF1412:
 	.string	"files_stat_struct"
-.LASF3234:
+.LASF3238:
 	.string	"devm_memremap"
-.LASF843:
+.LASF844:
 	.string	"pgtable_t"
-.LASF1033:
+.LASF1034:
 	.string	"block_start"
-.LASF2575:
+.LASF2576:
 	.string	"nodename"
-.LASF1854:
+.LASF1855:
 	.string	"symlink"
-.LASF1574:
+.LASF1575:
 	.string	"mem_map"
-.LASF3082:
+.LASF3083:
 	.string	"old_buffer"
-.LASF2954:
+.LASF2955:
 	.string	"lut_data_set"
-.LASF790:
+.LASF791:
 	.string	"sysctl_timer_migration"
-.LASF2914:
+.LASF2915:
 	.string	"DMA_NONE"
-.LASF1898:
+.LASF1899:
 	.string	"fl_type"
-.LASF58:
+.LASF59:
 	.string	"counter"
-.LASF2836:
+.LASF2837:
 	.string	"WAKE_LOCK_SUSPEND"
-.LASF1777:
+.LASF1778:
 	.string	"WRITE_LIFE_SHORT"
-.LASF285:
+.LASF3221:
+	.string	"__swab32p"
+.LASF286:
 	.string	"_einittext"
-.LASF2424:
+.LASF2425:
 	.string	"_flags"
-.LASF401:
+.LASF402:
 	.string	"d_rcu"
-.LASF205:
+.LASF206:
 	.string	"addr_limit"
-.LASF2806:
+.LASF2807:
 	.string	"trace_eval_map"
-.LASF1099:
+.LASF1100:
 	.string	"done"
-.LASF210:
+.LASF211:
 	.string	"elf_hwcap"
-.LASF2750:
+.LASF2751:
 	.string	"param_ops_byte"
-.LASF1984:
+.LASF1985:
 	.string	"fscrypt_operations"
-.LASF2412:
+.LASF2413:
 	.string	"mapping_error"
-.LASF1135:
+.LASF1136:
 	.string	"release_work"
-.LASF1838:
+.LASF1839:
 	.string	"i_bdev"
-.LASF2694:
+.LASF2695:
 	.string	"vm_node_stat"
-.LASF1939:
+.LASF1940:
 	.string	"mount"
-.LASF2835:
+.LASF2836:
 	.string	"kmalloc_caches"
-.LASF1378:
+.LASF1379:
 	.string	"MIGRATE_SYNC"
-.LASF1982:
+.LASF1983:
 	.string	"export_operations"
-.LASF551:
+.LASF552:
 	.string	"PIDTYPE_PGID"
-.LASF1721:
+.LASF1722:
 	.string	"rm_xquota"
-.LASF1084:
+.LASF1085:
 	.string	"dl_timer"
-.LASF3266:
+.LASF3272:
 	.string	"remap_pfn_range"
-.LASF2375:
+.LASF2376:
 	.string	"DL_DEV_NO_DRIVER"
-.LASF340:
+.LASF341:
 	.string	"hbp_watch"
-.LASF2842:
+.LASF2843:
 	.string	"WF_TYPE_RESET"
-.LASF2528:
+.LASF2529:
 	.string	"sda_gpiod"
-.LASF1548:
+.LASF1549:
 	.string	"watermark"
-.LASF2423:
+.LASF2424:
 	.string	"deadprops"
-.LASF3230:
+.LASF3234:
 	.string	"devm_kmalloc"
 .LASF16:
 	.string	"long long unsigned int"
-.LASF1294:
+.LASF1295:
 	.string	"anon_name"
-.LASF1442:
+.LASF1443:
 	.string	"ia_file"
-.LASF263:
+.LASF264:
 	.string	"arm64_ftr_reg"
-.LASF2484:
+.LASF2485:
 	.string	"irq_domain_simple_ops"
-.LASF468:
+.LASF469:
 	.string	"dentry_operations"
-.LASF738:
+.LASF739:
 	.string	"memcg_nr_pages_over_high"
-.LASF1603:
+.LASF1604:
 	.string	"percpu_counter_batch"
-.LASF42:
+.LASF43:
 	.string	"_Bool"
-.LASF1261:
+.LASF1262:
 	.string	"hmm_data"
-.LASF1030:
+.LASF1031:
 	.string	"sleep_start"
-.LASF662:
+.LASF663:
 	.string	"min_flt"
-.LASF1873:
+.LASF1874:
 	.string	"flc_lease"
-.LASF2406:
+.LASF2407:
 	.string	"unmap_resource"
-.LASF2989:
+.LASF2990:
 	.string	"wake_lock_is_set"
-.LASF2358:
+.LASF2359:
 	.string	"driver_private"
-.LASF1840:
+.LASF1841:
 	.string	"i_link"
-.LASF1381:
+.LASF1382:
 	.string	"rcu_sync_type"
-.LASF1862:
+.LASF1863:
 	.string	"listxattr"
-.LASF923:
+.LASF924:
 	.string	"_lower"
-.LASF1736:
+.LASF1737:
 	.string	"async_probe_requested"
-.LASF2308:
+.LASF2309:
 	.string	"active_count"
-.LASF279:
+.LASF280:
 	.string	"_edata"
-.LASF78:
+.LASF79:
 	.string	"__security_initcall_end"
-.LASF2160:
+.LASF2161:
 	.string	"kobj_sysfs_ops"
-.LASF2890:
+.LASF2891:
 	.string	"EPD_RESET"
-.LASF2369:
+.LASF2370:
 	.string	"device_dma_parameters"
-.LASF214:
+.LASF215:
 	.string	"fpsr"
-.LASF497:
+.LASF498:
 	.string	"s_count"
-.LASF469:
+.LASF470:
 	.string	"d_revalidate"
-.LASF2327:
+.LASF2328:
 	.string	"bus_groups"
-.LASF838:
+.LASF839:
 	.string	"pmd_t"
-.LASF488:
+.LASF489:
 	.string	"s_op"
-.LASF1611:
+.LASF1612:
 	.string	"dq_count"
-.LASF396:
+.LASF397:
 	.string	"dentry_stat"
-.LASF71:
+.LASF72:
 	.string	"pstate_check_t"
-.LASF830:
+.LASF831:
 	.string	"system_freezable_power_efficient_wq"
-.LASF3025:
+.LASF3026:
 	.string	"__func__"
-.LASF56:
+.LASF57:
 	.string	"resource_size_t"
-.LASF581:
+.LASF582:
 	.string	"wake_entry"
-.LASF950:
+.LASF951:
 	.string	"processes"
-.LASF1101:
+.LASF1102:
 	.string	"suid"
-.LASF2475:
+.LASF2476:
 	.string	"irq_domain_ops"
-.LASF959:
+.LASF960:
 	.string	"locked_vm"
-.LASF853:
+.LASF854:
 	.string	"rb_left"
-.LASF2107:
+.LASF2108:
 	.string	"seq_next"
-.LASF275:
+.LASF276:
 	.string	"_stext"
-.LASF1710:
+.LASF1711:
 	.string	"quotactl_ops"
-.LASF535:
+.LASF536:
 	.string	"s_sync_lock"
-.LASF2302:
+.LASF2303:
 	.string	"total_time"
 .LASF29:
 	.string	"__kernel_clock_t"
-.LASF392:
+.LASF393:
 	.string	"nr_unused"
-.LASF2917:
+.LASF2918:
 	.string	"dma_address"
-.LASF2615:
+.LASF2616:
 	.string	"mmap_rnd_compat_bits_max"
-.LASF40:
+.LASF41:
 	.string	"clockid_t"
-.LASF1607:
+.LASF1608:
 	.string	"dq_free"
-.LASF1581:
+.LASF1582:
 	.string	"reboot_notifier_list"
-.LASF686:
+.LASF687:
 	.string	"parent_exec_id"
-.LASF2503:
+.LASF2504:
 	.string	"retries"
-.LASF2089:
+.LASF2090:
 	.string	"kernfs_elem_dir"
-.LASF213:
+.LASF214:
 	.string	"vregs"
-.LASF2624:
+.LASF2625:
 	.string	"page_entry_size"
-.LASF2975:
+.LASF2976:
 	.string	"lut_data"
-.LASF3096:
+.LASF3097:
 	.string	"ebc_other_init"
-.LASF1446:
+.LASF1447:
 	.string	"free_list"
-.LASF589:
+.LASF590:
 	.string	"prio"
-.LASF3185:
+.LASF3186:
 	.string	"platform_get_drvdata"
-.LASF2555:
+.LASF2556:
 	.string	"NR_SOFTIRQS"
-.LASF2312:
+.LASF2313:
 	.string	"autosleep_enabled"
-.LASF644:
+.LASF645:
 	.string	"ptrace_entry"
-.LASF2515:
+.LASF2516:
 	.string	"lock_bus"
-.LASF2022:
+.LASF2023:
 	.string	"def_chr_fops"
-.LASF586:
+.LASF587:
 	.string	"recent_used_cpu"
-.LASF1760:
+.LASF1761:
 	.string	"num_jump_entries"
-.LASF490:
+.LASF491:
 	.string	"s_qcop"
-.LASF59:
+.LASF60:
 	.string	"atomic_t"
-.LASF812:
+.LASF813:
 	.string	"WORK_OFFQ_FLAG_BITS"
-.LASF3143:
+.LASF3144:
 	.string	"ebc_tcon_image_addr_set"
-.LASF2531:
+.LASF2532:
 	.string	"max_num_msgs"
-.LASF2103:
+.LASF2104:
 	.string	"notify_next"
-.LASF2306:
+.LASF2307:
 	.string	"prevent_sleep_time"
-.LASF2621:
+.LASF2622:
 	.string	"sysctl_overcommit_ratio"
-.LASF202:
+.LASF203:
 	.string	"kimage_voffset"
 .LASF8:
 	.string	"short int"
-.LASF2354:
+.LASF2355:
 	.string	"of_device_id"
-.LASF2915:
+.LASF2916:
 	.string	"scatterlist"
-.LASF1267:
+.LASF1268:
 	.string	"altmap_valid"
-.LASF3285:
+.LASF3291:
 	.string	"down"
-.LASF101:
+.LASF102:
 	.string	"read_iter"
-.LASF335:
+.LASF336:
 	.string	"debug_info"
-.LASF1283:
+.LASF1284:
 	.string	"f_owner"
-.LASF2482:
+.LASF2483:
 	.string	"irq_domain_chip_generic"
-.LASF1383:
+.LASF1384:
 	.string	"RCU_SCHED_SYNC"
-.LASF2584:
+.LASF2585:
 	.string	"tracepoint"
-.LASF2783:
+.LASF2784:
 	.string	"test"
-.LASF2574:
+.LASF2575:
 	.string	"this_device"
-.LASF2005:
+.LASF2006:
 	.string	"pad_until"
-.LASF457:
+.LASF458:
 	.string	"i_writecount"
-.LASF447:
+.LASF448:
 	.string	"i_wb_frn_winner"
-.LASF1947:
+.LASF1948:
 	.string	"s_writers_key"
-.LASF1006:
+.LASF1007:
 	.string	"last_arrival"
-.LASF2388:
+.LASF2389:
 	.string	"mapcount"
-.LASF762:
+.LASF763:
 	.string	"__boot_cpu_id"
-.LASF1584:
+.LASF1585:
 	.string	"numa_zonelist_order"
-.LASF2251:
+.LASF2252:
 	.string	"pm_domain_data"
-.LASF2487:
+.LASF2488:
 	.string	"byte"
-.LASF3254:
+.LASF3257:
 	.string	"__wake_up_sync"
-.LASF2002:
+.LASF2003:
 	.string	"poll_table_struct"
-.LASF1793:
+.LASF1794:
 	.string	"direct_IO"
-.LASF2127:
+.LASF2128:
 	.string	"current_may_mount"
-.LASF381:
+.LASF382:
 	.string	"seqlock_t"
-.LASF2946:
+.LASF2947:
 	.string	"hclk"
-.LASF2115:
+.LASF2116:
 	.string	"kernfs_iattrs"
-.LASF2908:
+.LASF2909:
 	.string	"pmic_get_vcom"
-.LASF626:
+.LASF627:
 	.string	"sched_migrated"
-.LASF1242:
+.LASF1243:
 	.string	"frozen"
-.LASF2343:
+.LASF2344:
 	.string	"suppress_bind_attrs"
-.LASF1264:
+.LASF1265:
 	.string	"page_fault"
-.LASF1469:
+.LASF1470:
 	.string	"NR_INACTIVE_FILE"
-.LASF3209:
+.LASF3210:
 	.string	"__ret_warn_on"
-.LASF1625:
+.LASF1626:
 	.string	"kqid"
-.LASF2481:
+.LASF2482:
 	.string	"irq_generic_chip_ops"
-.LASF2058:
+.LASF2059:
 	.string	"index_key"
-.LASF2288:
+.LASF2289:
 	.string	"memalloc_noio"
-.LASF1621:
+.LASF1622:
 	.string	"GRPQUOTA"
-.LASF1580:
+.LASF1581:
 	.string	"rwsem"
-.LASF1434:
+.LASF1435:
 	.string	"ia_valid"
-.LASF1410:
+.LASF1411:
 	.string	"__invalid_size_argument_for_IOC"
-.LASF1240:
+.LASF1241:
 	.string	"inuse"
-.LASF822:
+.LASF823:
 	.string	"WORKER_DESC_LEN"
-.LASF1691:
+.LASF1692:
 	.string	"qc_type_state"
-.LASF2042:
+.LASF2043:
 	.string	"key_serial_t"
-.LASF1589:
+.LASF1590:
 	.string	"__highest_present_section_nr"
-.LASF2361:
+.LASF2362:
 	.string	"dev_uevent"
-.LASF2782:
+.LASF2783:
 	.string	"setup"
-.LASF1276:
+.LASF1277:
 	.string	"f_lock"
-.LASF2681:
+.LASF2682:
 	.string	"UNEVICTABLE_PGSCANNED"
-.LASF881:
+.LASF882:
 	.string	"active"
-.LASF2478:
+.LASF2479:
 	.string	"xlate"
-.LASF1636:
+.LASF1637:
 	.string	"dqb_itime"
-.LASF1778:
+.LASF1779:
 	.string	"WRITE_LIFE_MEDIUM"
-.LASF2470:
+.LASF2471:
 	.string	"DOMAIN_BUS_PLATFORM_MSI"
-.LASF268:
+.LASF269:
 	.string	"user_val"
-.LASF803:
+.LASF804:
 	.string	"WORK_STRUCT_LINKED"
-.LASF452:
+.LASF453:
 	.string	"i_wb_list"
-.LASF2027:
+.LASF2028:
 	.string	"simple_dir_operations"
-.LASF2383:
+.LASF2384:
 	.string	"defer_hook"
-.LASF128:
+.LASF129:
 	.string	"fadvise"
-.LASF2614:
+.LASF2615:
 	.string	"mmap_rnd_compat_bits_min"
-.LASF2596:
+.LASF2597:
 	.string	"vmem_altmap"
-.LASF1341:
+.LASF1342:
 	.string	"arg_end"
-.LASF2057:
+.LASF2058:
 	.string	"revoked_at"
-.LASF1188:
+.LASF1189:
 	.string	"private_list"
-.LASF260:
+.LASF261:
 	.string	"shift"
-.LASF1437:
+.LASF1438:
 	.string	"ia_gid"
-.LASF35:
+.LASF36:
 	.string	"name_offset"
-.LASF2134:
+.LASF2135:
 	.string	"attribute_group"
-.LASF299:
+.LASF300:
 	.string	"__irqentry_text_end"
-.LASF1346:
+.LASF1347:
 	.string	"context"
-.LASF3114:
+.LASF3115:
 	.string	"get_overlay_image"
-.LASF1540:
+.LASF1541:
 	.string	"per_cpu_nodestat"
-.LASF2520:
+.LASF2521:
 	.string	"get_scl"
-.LASF2601:
+.LASF2602:
 	.string	"MEMORY_DEVICE_PRIVATE"
-.LASF1591:
+.LASF1592:
 	.string	"thread_id"
-.LASF732:
+.LASF733:
 	.string	"default_timer_slack_ns"
-.LASF3057:
+.LASF3058:
 	.string	"waveform_version_read"
-.LASF1767:
+.LASF1768:
 	.string	"source_list"
-.LASF757:
+.LASF758:
 	.string	"secondary_data"
-.LASF2243:
+.LASF2244:
 	.string	"RPM_REQ_NONE"
-.LASF980:
+.LASF981:
 	.string	"swap_readahead_info"
-.LASF1127:
+.LASF1128:
 	.string	"active_ref"
-.LASF835:
+.LASF836:
 	.string	"pmdval_t"
-.LASF2522:
+.LASF2523:
 	.string	"get_sda"
-.LASF1119:
+.LASF1120:
 	.string	"group_info"
-.LASF765:
+.LASF766:
 	.string	"arch_timer_erratum_match_type"
-.LASF2498:
+.LASF2499:
 	.string	"algo"
-.LASF1272:
+.LASF1273:
 	.string	"file"
-.LASF820:
+.LASF821:
 	.string	"WORK_BUSY_PENDING"
-.LASF2345:
+.LASF2346:
 	.string	"of_match_table"
-.LASF2578:
+.LASF2579:
 	.string	"percpu_count_ptr"
-.LASF3265:
+.LASF3271:
 	.string	"ebc_phy_buf_base_get"
-.LASF2079:
+.LASF2080:
 	.string	"loops_per_jiffy"
-.LASF2510:
+.LASF2511:
 	.string	"i2c_algorithm"
-.LASF2858:
+.LASF2859:
 	.string	"buf_idle"
-.LASF1399:
+.LASF1400:
 	.string	"uuid_t"
-.LASF2437:
+.LASF2438:
 	.string	"property_read_int_array"
-.LASF2978:
+.LASF2979:
 	.string	"auto_image_old"
-.LASF1860:
+.LASF1861:
 	.string	"setattr2"
-.LASF1355:
+.LASF1356:
 	.string	"init_mm"
-.LASF2661:
+.LASF2662:
 	.string	"KSWAPD_INODESTEAL"
-.LASF1175:
+.LASF1176:
 	.string	"count_objects"
-.LASF3221:
+.LASF3225:
 	.string	"fls64"
-.LASF921:
+.LASF922:
 	.string	"_stime"
-.LASF2382:
+.LASF2383:
 	.string	"needs_suppliers"
-.LASF2317:
+.LASF2318:
 	.string	"activate"
-.LASF1524:
+.LASF1525:
 	.string	"kcompactd_max_order"
-.LASF781:
+.LASF782:
 	.string	"tick_nsec"
-.LASF459:
+.LASF460:
 	.string	"i_flctx"
-.LASF134:
+.LASF135:
 	.string	"atomic_notifier_head"
-.LASF1060:
+.LASF1061:
 	.string	"statistics"
-.LASF2935:
+.LASF2936:
 	.string	"current_buffer"
-.LASF3111:
+.LASF3112:
 	.string	"direct_mode_data_change"
-.LASF1618:
+.LASF1619:
 	.string	"kprojid_t"
-.LASF666:
+.LASF667:
 	.string	"ptracer_cred"
-.LASF2141:
+.LASF2142:
 	.string	"store"
-.LASF1303:
+.LASF1304:
 	.string	"page_mkwrite"
-.LASF2009:
+.LASF2010:
 	.string	"kobject"
-.LASF2410:
+.LASF2411:
 	.string	"sync_sg_for_device"
-.LASF1964:
+.LASF1965:
 	.string	"statfs"
-.LASF3248:
+.LASF3252:
 	.string	"__kmalloc"
-.LASF3237:
+.LASF3241:
 	.string	"_dev_err"
-.LASF3227:
+.LASF3231:
 	.string	"__platform_driver_register"
-.LASF2962:
+.LASF2963:
 	.string	"ebc_buf_real_size"
-.LASF3004:
+.LASF3005:
 	.string	"ebc_thread_wq"
-.LASF1794:
+.LASF1795:
 	.string	"migratepage"
-.LASF2666:
+.LASF2667:
 	.string	"DROP_PAGECACHE"
-.LASF792:
+.LASF793:
 	.string	"work_struct"
-.LASF2897:
+.LASF2898:
 	.string	"height"
-.LASF1094:
+.LASF1095:
 	.string	"task_group"
-.LASF1069:
+.LASF1070:
 	.string	"on_list"
-.LASF2767:
+.LASF2768:
 	.string	"plt_num_entries"
-.LASF2680:
+.LASF2681:
 	.string	"UNEVICTABLE_PGCULLED"
-.LASF570:
+.LASF571:
 	.string	"kgid_t"
-.LASF582:
+.LASF583:
 	.string	"on_cpu"
-.LASF2131:
+.LASF2132:
 	.string	"drop_ns"
-.LASF1422:
+.LASF1423:
 	.string	"sysctl_protected_symlinks"
-.LASF3019:
-	.string	"__addressable_ebc_init2503"
-.LASF2623:
+.LASF2624:
 	.string	"protection_map"
-.LASF2764:
+.LASF2765:
 	.string	"param_ops_string"
-.LASF2359:
+.LASF2360:
 	.string	"class_groups"
-.LASF289:
+.LASF290:
 	.string	"__per_cpu_load"
-.LASF1925:
+.LASF1926:
 	.string	"nfs4_lock_state"
-.LASF2805:
+.LASF2806:
 	.string	"trace_event_call"
-.LASF1230:
+.LASF1231:
 	.string	"i_mmap_rwsem"
-.LASF1404:
+.LASF1405:
 	.string	"errseq_t"
-.LASF1349:
+.LASF1350:
 	.string	"ioctx_table"
-.LASF1488:
+.LASF1489:
 	.string	"NR_SHMEM_PMDMAPPED"
-.LASF2534:
+.LASF2535:
 	.string	"max_comb_1st_msg_len"
-.LASF1545:
+.LASF1546:
 	.string	"ZONE_MOVABLE"
-.LASF3008:
+.LASF3009:
 	.string	"ebc_misc"
-.LASF2392:
+.LASF2393:
 	.string	"revmap_size"
-.LASF1901:
+.LASF1902:
 	.string	"fl_wait"
-.LASF684:
+.LASF685:
 	.string	"audit_context"
-.LASF290:
+.LASF291:
 	.string	"__per_cpu_start"
-.LASF282:
+.LASF283:
 	.string	"__init_begin"
-.LASF2140:
+.LASF2141:
 	.string	"sysfs_ops"
-.LASF2864:
+.LASF2865:
 	.string	"phy_addr"
-.LASF2165:
+.LASF2166:
 	.string	"firmware_kobj"
-.LASF291:
+.LASF3020:
+	.string	"__addressable_ebc_init2529"
+.LASF292:
 	.string	"__per_cpu_end"
-.LASF2640:
+.LASF2641:
 	.string	"ALLOCSTALL_DMA32"
-.LASF2649:
+.LASF2650:
 	.string	"PGLAZYFREE"
-.LASF1851:
+.LASF1852:
 	.string	"create"
-.LASF1433:
+.LASF1434:
 	.string	"iattr"
-.LASF794:
+.LASF795:
 	.string	"WORK_STRUCT_PENDING_BIT"
-.LASF720:
+.LASF721:
 	.string	"rseq"
-.LASF3122:
+.LASF3123:
 	.string	"get_auto_image"
-.LASF195:
+.LASF196:
 	.string	"nfds"
-.LASF813:
+.LASF814:
 	.string	"WORK_OFFQ_POOL_SHIFT"
-.LASF719:
+.LASF720:
 	.string	"perf_event_list"
-.LASF1671:
+.LASF1672:
 	.string	"get_reserved_space"
-.LASF423:
+.LASF424:
 	.string	"i_acl"
-.LASF1789:
+.LASF1790:
 	.string	"bmap"
-.LASF3235:
+.LASF3239:
 	.string	"ebc_buf_init"
-.LASF2048:
+.LASF2049:
 	.string	"key_payload"
-.LASF2981:
+.LASF2982:
 	.string	"auto_image_osd"
-.LASF480:
+.LASF481:
 	.string	"d_real"
-.LASF2560:
+.LASF2561:
 	.string	"swapper_pg_end"
-.LASF3010:
+.LASF3011:
 	.string	"dev_attr_pmic_name"
-.LASF631:
+.LASF632:
 	.string	"in_user_fault"
-.LASF1920:
+.LASF1921:
 	.string	"lm_change"
-.LASF2539:
+.LASF2540:
 	.string	"irq_cpustat_t"
-.LASF1644:
+.LASF1645:
 	.string	"dqi_max_spc_limit"
-.LASF1258:
+.LASF1259:
 	.string	"pmd_huge_pte"
-.LASF2800:
+.LASF2801:
 	.string	"exception_table_entry"
-.LASF1558:
+.LASF1559:
 	.string	"nr_isolate_pageblock"
-.LASF2307:
+.LASF2308:
 	.string	"event_count"
-.LASF207:
+.LASF208:
 	.string	"preempt_count"
-.LASF1582:
+.LASF1583:
 	.string	"movable_zone"
-.LASF798:
+.LASF799:
 	.string	"WORK_STRUCT_COLOR_SHIFT"
-.LASF73:
+.LASF74:
 	.string	"initcall_entry_t"
-.LASF123:
+.LASF124:
 	.string	"fallocate"
-.LASF1707:
+.LASF1708:
 	.string	"i_spc_warnlimit"
-.LASF3210:
+.LASF3211:
 	.string	"check_object_size"
-.LASF1515:
+.LASF1516:
 	.string	"node_present_pages"
-.LASF1228:
+.LASF1229:
 	.string	"i_mmap_writable"
-.LASF707:
+.LASF708:
 	.string	"mems_allowed"
-.LASF2259:
+.LASF2260:
 	.string	"is_noirq_suspended"
-.LASF1758:
+.LASF1759:
 	.string	"tracepoints_ptrs"
-.LASF186:
+.LASF187:
 	.string	"time"
-.LASF584:
+.LASF585:
 	.string	"wakee_flip_decay_ts"
-.LASF1554:
+.LASF1555:
 	.string	"zone_start_pfn"
-.LASF518:
+.LASF519:
 	.string	"s_max_links"
-.LASF1043:
+.LASF1044:
 	.string	"nr_wakeups_sync"
-.LASF1750:
+.LASF1751:
 	.string	"kallsyms"
-.LASF1527:
+.LASF1528:
 	.string	"kcompactd"
-.LASF64:
+.LASF65:
 	.string	"prev"
-.LASF2215:
+.LASF2216:
 	.string	"dma_parms"
-.LASF1120:
+.LASF1121:
 	.string	"fs_struct"
-.LASF191:
+.LASF192:
 	.string	"clockid"
-.LASF1018:
+.LASF1019:
 	.string	"util_sum"
-.LASF49:
+.LASF50:
 	.string	"uint32_t"
-.LASF1340:
+.LASF1341:
 	.string	"arg_start"
-.LASF2416:
+.LASF2417:
 	.string	"unremap"
-.LASF2469:
+.LASF2470:
 	.string	"DOMAIN_BUS_PCI_MSI"
-.LASF1168:
+.LASF1169:
 	.string	"blocks"
-.LASF323:
+.LASF324:
 	.string	"__idmap_text_start"
-.LASF1716:
+.LASF1717:
 	.string	"set_info"
-.LASF3060:
+.LASF3061:
 	.string	"ebc_mmap"
-.LASF2619:
+.LASF2620:
 	.string	"sysctl_admin_reserve_kbytes"
-.LASF788:
+.LASF789:
 	.string	"timer_list"
-.LASF1684:
+.LASF1685:
 	.string	"d_ino_warns"
-.LASF2500:
+.LASF2501:
 	.string	"lock_ops"
-.LASF1326:
+.LASF1327:
 	.string	"hiwater_vm"
-.LASF3054:
+.LASF3055:
 	.string	"pmic_vcom_read"
-.LASF3229:
+.LASF3233:
 	.string	"misc_deregister"
-.LASF1248:
+.LASF1249:
 	.string	"compound_head"
-.LASF2558:
+.LASF2559:
 	.string	"empty_zero_page"
-.LASF1872:
+.LASF1873:
 	.string	"flc_posix"
-.LASF292:
+.LASF293:
 	.string	"__kprobes_text_start"
 .LASF26:
 	.string	"__kernel_ssize_t"
-.LASF1211:
+.LASF1212:
 	.string	"orig_ret_vaddr"
-.LASF434:
+.LASF435:
 	.string	"i_ctime"
-.LASF1816:
+.LASF1817:
 	.string	"bd_write_holder"
-.LASF2194:
+.LASF2195:
 	.string	"poweroff_noirq"
-.LASF3232:
+.LASF3236:
 	.string	"of_parse_phandle"
-.LASF1858:
+.LASF1859:
 	.string	"rename"
-.LASF964:
+.LASF965:
 	.string	"vm_area_struct"
-.LASF2237:
+.LASF2238:
 	.string	"rpm_status"
-.LASF1935:
+.LASF1936:
 	.string	"sb_writers"
-.LASF1693:
+.LASF1694:
 	.string	"ino_timelimit"
-.LASF120:
+.LASF121:
 	.string	"splice_write"
-.LASF2092:
+.LASF2093:
 	.string	"ino_idr"
-.LASF1706:
+.LASF1707:
 	.string	"i_rt_spc_timelimit"
-.LASF139:
+.LASF140:
 	.string	"oops_in_progress"
-.LASF3007:
+.LASF3008:
 	.string	"ebc_ops"
-.LASF3034:
+.LASF3035:
 	.string	"klogo_addr"
-.LASF1651:
+.LASF1652:
 	.string	"qf_next"
-.LASF2407:
+.LASF2408:
 	.string	"sync_single_for_cpu"
-.LASF793:
+.LASF794:
 	.string	"data"
-.LASF3178:
+.LASF3179:
 	.string	"kzalloc"
-.LASF3203:
+.LASF3204:
 	.string	"msecs_to_jiffies"
-.LASF1919:
+.LASF1920:
 	.string	"lm_break"
-.LASF1219:
+.LASF1220:
 	.string	"hyp_vectors_slot"
-.LASF1239:
+.LASF1240:
 	.string	"slab_list"
-.LASF907:
+.LASF908:
 	.string	"_unused_nodemask_arg_"
-.LASF623:
+.LASF624:
 	.string	"personality"
-.LASF1825:
+.LASF1826:
 	.string	"bd_queue"
-.LASF3022:
+.LASF3023:
 	.string	"ebc_resume"
-.LASF2829:
+.LASF2830:
 	.string	"init_task"
-.LASF388:
+.LASF389:
 	.string	"empty_name"
-.LASF1316:
+.LASF1317:
 	.string	"task_size"
-.LASF538:
+.LASF539:
 	.string	"s_inodes"
-.LASF930:
+.LASF931:
 	.string	"_addr"
-.LASF1588:
+.LASF1589:
 	.string	"pageblock_flags"
-.LASF1345:
+.LASF1346:
 	.string	"binfmt"
-.LASF2238:
+.LASF2239:
 	.string	"RPM_ACTIVE"
 .LASF4:
 	.string	"signed char"
-.LASF375:
+.LASF376:
 	.string	"rcu_scheduler_active"
-.LASF3188:
+.LASF3189:
 	.string	"propname"
-.LASF2101:
+.LASF2102:
 	.string	"priv"
-.LASF1861:
+.LASF1862:
 	.string	"getattr"
-.LASF612:
+.LASF613:
 	.string	"sched_info"
-.LASF1675:
+.LASF1676:
 	.string	"d_fieldmask"
-.LASF2003:
+.LASF2004:
 	.string	"seq_file"
-.LASF2192:
+.LASF2193:
 	.string	"freeze_noirq"
-.LASF1493:
+.LASF1494:
 	.string	"NR_DIRTIED"
-.LASF2732:
+.LASF2733:
 	.string	"sh_flags"
-.LASF610:
+.LASF611:
 	.string	"rcu_tasks_idle_cpu"
-.LASF1657:
+.LASF1658:
 	.string	"write_file_info"
-.LASF1849:
+.LASF1850:
 	.string	"get_acl"
-.LASF1959:
+.LASF1960:
 	.string	"sync_fs"
-.LASF129:
-	.string	"android_kabi_reserved1"
 .LASF130:
-	.string	"android_kabi_reserved2"
+	.string	"android_kabi_reserved1"
 .LASF131:
-	.string	"android_kabi_reserved3"
+	.string	"android_kabi_reserved2"
 .LASF132:
+	.string	"android_kabi_reserved3"
+.LASF133:
 	.string	"android_kabi_reserved4"
-.LASF2235:
-	.string	"android_kabi_reserved5"
 .LASF2236:
+	.string	"android_kabi_reserved5"
+.LASF2237:
 	.string	"android_kabi_reserved6"
-.LASF748:
-	.string	"android_kabi_reserved7"
 .LASF749:
+	.string	"android_kabi_reserved7"
+.LASF750:
 	.string	"android_kabi_reserved8"
-.LASF246:
+.LASF247:
 	.string	"enabled"
-.LASF562:
+.LASF563:
 	.string	"init_pid_ns"
-.LASF96:
+.LASF97:
 	.string	"file_operations"
-.LASF2861:
+.LASF2862:
 	.string	"buf_osd"
-.LASF1745:
+.LASF1746:
 	.string	"arch"
-.LASF2261:
+.LASF2262:
 	.string	"no_pm"
-.LASF2895:
+.LASF2896:
 	.string	"ebc_buf_info"
-.LASF936:
+.LASF937:
 	.string	"_kill"
-.LASF785:
+.LASF786:
 	.string	"ktime_t"
-.LASF1900:
+.LASF1901:
 	.string	"fl_link_cpu"
-.LASF1727:
+.LASF1728:
 	.string	"syms"
-.LASF1055:
+.LASF1056:
 	.string	"group_node"
-.LASF2111:
+.LASF2112:
 	.string	"kernfs_open_node"
-.LASF1682:
+.LASF1683:
 	.string	"d_ino_timer"
-.LASF1470:
+.LASF1471:
 	.string	"NR_ACTIVE_FILE"
-.LASF2063:
+.LASF2064:
 	.string	"key_sysctls"
-.LASF1337:
+.LASF1338:
 	.string	"end_data"
-.LASF349:
+.LASF350:
 	.string	"sve_vl"
-.LASF2654:
+.LASF2655:
 	.string	"PGSTEAL_KSWAPD"
-.LASF3036:
+.LASF3037:
 	.string	"klogo_addr_valid"
-.LASF2602:
+.LASF2603:
 	.string	"MEMORY_DEVICE_PUBLIC"
-.LASF2332:
+.LASF2333:
 	.string	"sync_state"
-.LASF1428:
+.LASF1429:
 	.string	"ki_pos"
-.LASF1017:
+.LASF1018:
 	.string	"runnable_load_sum"
-.LASF2318:
+.LASF2319:
 	.string	"sync"
-.LASF2660:
+.LASF2661:
 	.string	"SLABS_SCANNED"
-.LASF1532:
+.LASF1533:
 	.string	"per_cpu_nodestats"
-.LASF122:
+.LASF123:
 	.string	"setlease"
-.LASF2208:
+.LASF2209:
 	.string	"pins"
-.LASF2794:
+.LASF2795:
 	.string	"ro_size"
-.LASF2269:
+.LASF2270:
 	.string	"must_resume"
 .LASF20:
 	.string	"long int"
-.LASF1557:
+.LASF1558:
 	.string	"present_pages"
-.LASF1869:
+.LASF1870:
 	.string	"file_lock_context"
-.LASF579:
+.LASF580:
 	.string	"usage"
-.LASF1537:
+.LASF1538:
 	.string	"per_cpu_pageset"
-.LASF759:
+.LASF760:
 	.string	"status"
-.LASF943:
+.LASF944:
 	.string	"si_signo"
-.LASF958:
+.LASF959:
 	.string	"uidhash_node"
-.LASF278:
+.LASF279:
 	.string	"_sdata"
-.LASF2852:
+.LASF2853:
 	.string	"WF_TYPE_GCC16"
-.LASF2514:
+.LASF2515:
 	.string	"i2c_lock_operations"
-.LASF3139:
+.LASF3140:
 	.string	"ebc_get_4pix_wf_part"
-.LASF1620:
+.LASF1621:
 	.string	"USRQUOTA"
-.LASF2045:
+.LASF2046:
 	.string	"description"
-.LASF2797:
+.LASF2798:
 	.string	"symtab"
-.LASF2919:
+.LASF2920:
 	.string	"sg_table"
-.LASF1124:
+.LASF1125:
 	.string	"rt_mutex_waiter"
-.LASF1965:
+.LASF1966:
 	.string	"remount_fs"
-.LASF487:
+.LASF488:
 	.string	"s_type"
-.LASF2291:
+.LASF2292:
 	.string	"runtime_status"
-.LASF630:
+.LASF631:
 	.string	"in_iowait"
-.LASF2586:
+.LASF2587:
 	.string	"unregfunc"
-.LASF2905:
+.LASF2906:
 	.string	"pmic_pm_suspend"
-.LASF1104:
+.LASF1105:
 	.string	"egid"
-.LASF1605:
+.LASF1606:
 	.string	"dq_hash"
-.LASF1472:
+.LASF1473:
 	.string	"NR_SLAB_RECLAIMABLE"
-.LASF1875:
+.LASF1876:
 	.string	"fscrypt_info"
-.LASF1958:
+.LASF1959:
 	.string	"put_super"
-.LASF2429:
+.LASF2430:
 	.string	"max_lock_depth"
-.LASF2451:
+.LASF2452:
 	.string	"fwnode_reference_args"
-.LASF614:
+.LASF615:
 	.string	"pushable_dl_tasks"
-.LASF1279:
+.LASF1280:
 	.string	"f_flags"
-.LASF1274:
+.LASF1275:
 	.string	"f_inode"
-.LASF2031:
+.LASF2032:
 	.string	"procname"
-.LASF3119:
+.LASF3120:
 	.string	"point_data"
-.LASF3239:
+.LASF3243:
 	.string	"epd_lut_from_file_init"
-.LASF1669:
+.LASF1670:
 	.string	"mark_dirty"
-.LASF760:
+.LASF761:
 	.string	"__early_cpu_boot_status"
-.LASF2346:
+.LASF2347:
 	.string	"acpi_match_table"
-.LASF1744:
+.LASF1745:
 	.string	"init_layout"
-.LASF1529:
+.LASF1530:
 	.string	"_pad1_"
-.LASF2779:
+.LASF2780:
 	.string	"kobj_completion"
-.LASF2868:
+.LASF2869:
 	.string	"win_x1"
-.LASF2870:
+.LASF2871:
 	.string	"win_x2"
-.LASF2428:
+.LASF2429:
 	.string	"platform_device_id"
 .LASF31:
 	.string	"__kernel_clockid_t"
-.LASF685:
+.LASF686:
 	.string	"seccomp"
-.LASF3073:
+.LASF3074:
 	.string	"ebc_rst_panel"
-.LASF1791:
+.LASF1792:
 	.string	"releasepage"
-.LASF1702:
+.LASF1703:
 	.string	"qc_info"
-.LASF3074:
+.LASF3075:
 	.string	"ebc_thread"
-.LASF3088:
+.LASF3089:
 	.string	"pbuf_old"
-.LASF2889:
+.LASF2890:
 	.string	"EPD_A2_ENTER"
-.LASF1503:
+.LASF1504:
 	.string	"recent_scanned"
-.LASF2937:
+.LASF2938:
 	.string	"vir_height"
-.LASF1743:
+.LASF1744:
 	.string	"core_layout"
-.LASF1531:
+.LASF1532:
 	.string	"_pad2_"
-.LASF997:
+.LASF998:
 	.string	"cancelled_write_bytes"
-.LASF2869:
+.LASF2870:
 	.string	"win_y1"
-.LASF2871:
+.LASF2872:
 	.string	"win_y2"
-.LASF3083:
+.LASF3084:
 	.string	"buf_size"
-.LASF2088:
+.LASF2089:
 	.string	"bitmap"
-.LASF1586:
+.LASF1587:
 	.string	"mem_section"
-.LASF1173:
+.LASF1174:
 	.string	"memcg"
-.LASF917:
+.LASF918:
 	.string	"_sigval"
-.LASF2568:
+.LASF2569:
 	.string	"MEMREMAP_ENC"
-.LASF2557:
+.LASF2558:
 	.string	"ksoftirqd"
-.LASF670:
+.LASF671:
 	.string	"nameidata"
-.LASF1425:
+.LASF1426:
 	.string	"sysctl_protected_regular"
-.LASF2025:
+.LASF2026:
 	.string	"simple_symlink_inode_operations"
-.LASF2796:
+.LASF2797:
 	.string	"mod_kallsyms"
-.LASF355:
+.LASF356:
 	.string	"sve_max_vl"
-.LASF2865:
+.LASF2866:
 	.string	"virt_addr"
-.LASF1596:
+.LASF1597:
 	.string	"core_sibling"
-.LASF1061:
+.LASF1062:
 	.string	"depth"
-.LASF1568:
+.LASF1569:
 	.string	"_pad3_"
-.LASF361:
+.LASF362:
 	.string	"wait_queue_func_t"
-.LASF272:
+.LASF273:
 	.string	"cpu_hwcap_keys"
-.LASF1377:
+.LASF1378:
 	.string	"MIGRATE_SYNC_LIGHT"
-.LASF1037:
+.LASF1038:
 	.string	"nr_migrations_cold"
-.LASF3052:
+.LASF3053:
 	.string	"ebc_version_read"
-.LASF303:
+.LASF304:
 	.string	"__end_once"
-.LASF2923:
+.LASF2924:
 	.string	"dma_noncoherent_ops"
-.LASF1505:
+.LASF1506:
 	.string	"lists"
-.LASF52:
+.LASF53:
 	.string	"dma_addr_t"
-.LASF47:
+.LASF48:
 	.string	"ssize_t"
-.LASF776:
+.LASF777:
 	.string	"set_next_event_phys"
-.LASF2628:
+.LASF2629:
 	.string	"shmem_enabled_attr"
-.LASF1507:
+.LASF1508:
 	.string	"inactive_age"
-.LASF2603:
+.LASF2604:
 	.string	"MEMORY_DEVICE_FS_DAX"
-.LASF2966:
+.LASF2967:
 	.string	"frame_bw_total"
-.LASF2795:
+.LASF2796:
 	.string	"ro_after_init_size"
-.LASF2046:
+.LASF2047:
 	.string	"desc_len"
-.LASF119:
+.LASF120:
 	.string	"flock"
-.LASF989:
+.LASF990:
 	.string	"task_io_accounting"
-.LASF1298:
+.LASF1299:
 	.string	"mremap"
-.LASF514:
+.LASF515:
 	.string	"s_writers"
-.LASF2844:
+.LASF2845:
 	.string	"WF_TYPE_GRAY4"
-.LASF2583:
+.LASF2584:
 	.string	"tracepoint_func"
-.LASF2153:
+.LASF2154:
 	.string	"argv"
-.LASF360:
+.LASF361:
 	.string	"entry"
-.LASF1981:
+.LASF1982:
 	.string	"free_cached_objects"
-.LASF823:
+.LASF824:
 	.string	"workqueue_struct"
-.LASF689:
+.LASF690:
 	.string	"pi_lock"
-.LASF2821:
+.LASF2822:
 	.string	"platform_bus"
-.LASF882:
+.LASF883:
 	.string	"get_time"
-.LASF664:
+.LASF665:
 	.string	"cputime_expires"
-.LASF730:
+.LASF731:
 	.string	"dirty_paused_when"
-.LASF2032:
+.LASF2033:
 	.string	"maxlen"
-.LASF1456:
+.LASF1457:
 	.string	"NR_ZONE_UNEVICTABLE"
-.LASF1756:
+.LASF1757:
 	.string	"percpu_size"
-.LASF1323:
+.LASF1324:
 	.string	"mmap_sem"
-.LASF3267:
+.LASF3273:
 	.string	"schedule"
-.LASF2442:
+.LASF2443:
 	.string	"get_reference_args"
-.LASF2285:
+.LASF2286:
 	.string	"irq_safe"
-.LASF174:
+.LASF175:
 	.string	"tv_nsec"
-.LASF450:
+.LASF451:
 	.string	"i_lru"
-.LASF1786:
+.LASF1787:
 	.string	"readpages"
-.LASF256:
+.LASF257:
 	.string	"arm64_ftr_bits"
-.LASF1571:
+.LASF1572:
 	.string	"zone_idx"
-.LASF1170:
+.LASF1171:
 	.string	"gfp_mask"
-.LASF715:
+.LASF716:
 	.string	"pi_state_list"
-.LASF1495:
+.LASF1496:
 	.string	"NR_KERNEL_MISC_RECLAIMABLE"
-.LASF1617:
+.LASF1618:
 	.string	"projid_t"
-.LASF1232:
+.LASF1233:
 	.string	"nrexceptional"
-.LASF1117:
+.LASF1118:
 	.string	"user"
-.LASF1780:
+.LASF1781:
 	.string	"WRITE_LIFE_EXTREME"
-.LASF1044:
+.LASF1045:
 	.string	"nr_wakeups_migrate"
-.LASF1645:
+.LASF1646:
 	.string	"dqi_max_ino_limit"
-.LASF1639:
+.LASF1640:
 	.string	"dqi_fmt_id"
-.LASF2396:
+.LASF2397:
 	.string	"dev_pin_info"
-.LASF1374:
+.LASF1375:
 	.string	"fe_reserved"
-.LASF1319:
+.LASF1320:
 	.string	"mm_count"
-.LASF2329:
+.LASF2330:
 	.string	"drv_groups"
-.LASF578:
+.LASF579:
 	.string	"stack"
-.LASF2417:
+.LASF2418:
 	.string	"dma_coherent_mem"
-.LASF259:
+.LASF260:
 	.string	"strict"
-.LASF201:
+.LASF202:
 	.string	"kimage_vaddr"
-.LASF1370:
+.LASF1371:
 	.string	"fe_physical"
-.LASF789:
+.LASF790:
 	.string	"function"
-.LASF1430:
+.LASF1431:
 	.string	"ki_flags"
-.LASF1391:
+.LASF1392:
 	.string	"gp_type"
-.LASF2969:
+.LASF2970:
 	.string	"part_mode_count"
-.LASF400:
+.LASF401:
 	.string	"d_in_lookup_hash"
-.LASF1102:
+.LASF1103:
 	.string	"sgid"
-.LASF2130:
+.LASF2131:
 	.string	"initial_ns"
-.LASF2811:
+.LASF2812:
 	.string	"node_devices"
-.LASF856:
+.LASF857:
 	.string	"rb_leftmost"
-.LASF204:
+.LASF205:
 	.string	"thread_info"
-.LASF777:
+.LASF778:
 	.string	"set_next_event_virt"
-.LASF172:
+.LASF173:
 	.string	"timespec"
-.LASF2799:
+.LASF2800:
 	.string	"strtab"
-.LASF2330:
+.LASF2331:
 	.string	"match"
-.LASF230:
+.LASF231:
 	.string	"lock_stat"
-.LASF2394:
+.LASF2395:
 	.string	"revmap_tree_mutex"
-.LASF3056:
+.LASF3057:
 	.string	"pmic_name_read"
-.LASF1079:
+.LASF1080:
 	.string	"dl_throttled"
-.LASF441:
+.LASF442:
 	.string	"i_rwsem"
-.LASF1672:
+.LASF1673:
 	.string	"get_projid"
-.LASF624:
+.LASF625:
 	.string	"sched_reset_on_fork"
-.LASF1522:
+.LASF1523:
 	.string	"kswapd_classzone_idx"
-.LASF211:
+.LASF212:
 	.string	"__int128 unsigned"
-.LASF1004:
+.LASF1005:
 	.string	"pcount"
-.LASF2195:
+.LASF2196:
 	.string	"restore_noirq"
-.LASF1427:
+.LASF1428:
 	.string	"ki_filp"
-.LASF3113:
+.LASF3114:
 	.string	"clac_full_data_align16"
-.LASF1112:
+.LASF1113:
 	.string	"cap_ambient"
-.LASF2337:
+.LASF2338:
 	.string	"dma_configure"
-.LASF2292:
+.LASF2293:
 	.string	"runtime_error"
-.LASF3064:
+.LASF3065:
 	.string	"temp_offset"
-.LASF949:
+.LASF950:
 	.string	"__count"
-.LASF60:
+.LASF61:
 	.string	"atomic64_t"
-.LASF975:
+.LASF976:
 	.string	"anon_vma"
-.LASF2282:
+.LASF2283:
 	.string	"runtime_auto"
-.LASF2351:
+.LASF2352:
 	.string	"PROBE_DEFAULT_STRATEGY"
-.LASF2746:
+.LASF2747:
 	.string	"elemsize"
-.LASF3103:
+.LASF3104:
 	.string	"clac_part_data_align16"
-.LASF891:
+.LASF892:
 	.string	"nr_events"
-.LASF2321:
+.LASF2322:
 	.string	"iommu"
-.LASF359:
+.LASF360:
 	.string	"private"
-.LASF2592:
+.LASF2593:
 	.string	"__tracepoint_page_ref_mod_and_return"
-.LASF2793:
+.LASF2794:
 	.string	"text_size"
-.LASF1653:
+.LASF1654:
 	.string	"stat"
-.LASF2985:
+.LASF2986:
 	.string	"lut_ddr_vir"
-.LASF1321:
+.LASF1322:
 	.string	"map_count"
-.LASF621:
+.LASF622:
 	.string	"pdeath_signal"
-.LASF620:
+.LASF621:
 	.string	"exit_signal"
-.LASF2855:
+.LASF2856:
 	.string	"frame_num"
-.LASF956:
+.LASF957:
 	.string	"uid_keyring"
-.LASF725:
+.LASF726:
 	.string	"splice_pipe"
-.LASF3092:
+.LASF3093:
 	.string	"frame_done_callback"
-.LASF1800:
+.LASF1801:
 	.string	"error_remove_page"
-.LASF2323:
+.LASF2324:
 	.string	"pdev_archdata"
-.LASF1520:
+.LASF1521:
 	.string	"kswapd"
-.LASF110:
+.LASF111:
 	.string	"open"
-.LASF903:
+.LASF904:
 	.string	"mode"
-.LASF592:
+.LASF593:
 	.string	"rt_priority"
-.LASF1192:
+.LASF1193:
 	.string	"slots"
-.LASF498:
+.LASF499:
 	.string	"s_active"
-.LASF998:
+.LASF999:
 	.string	"ptr64"
-.LASF1441:
+.LASF1442:
 	.string	"ia_ctime"
-.LASF44:
+.LASF45:
 	.string	"gid_t"
-.LASF587:
+.LASF588:
 	.string	"wake_cpu"
-.LASF1212:
+.LASF1213:
 	.string	"chained"
-.LASF1368:
+.LASF1369:
 	.string	"fiemap_extent"
-.LASF683:
+.LASF684:
 	.string	"task_works"
-.LASF1889:
+.LASF1890:
 	.string	"fl_copy_lock"
-.LASF855:
+.LASF856:
 	.string	"rb_root_cached"
-.LASF501:
+.LASF33:
+	.string	"__be32"
+.LASF502:
 	.string	"s_cop"
-.LASF1021:
+.LASF1022:
 	.string	"runnable_load_avg"
-.LASF1251:
+.LASF1252:
 	.string	"compound_mapcount"
-.LASF1449:
+.LASF1450:
 	.string	"zone_stat_item"
-.LASF3180:
+.LASF3181:
 	.string	"kmalloc_large"
-.LASF2626:
+.LASF2627:
 	.string	"PE_SIZE_PMD"
-.LASF887:
+.LASF888:
 	.string	"hres_active"
-.LASF1608:
+.LASF1609:
 	.string	"dq_dirty"
-.LASF1748:
+.LASF1749:
 	.string	"bug_list"
-.LASF2263:
+.LASF2264:
 	.string	"direct_complete"
-.LASF754:
+.LASF755:
 	.string	"__per_cpu_offset"
-.LASF2084:
+.LASF2085:
 	.string	"idr_rt"
-.LASF2508:
+.LASF2509:
 	.string	"quirks"
-.LASF1195:
+.LASF1196:
 	.string	"xa_lock"
-.LASF1927:
+.LASF1928:
 	.string	"nfs4_fl"
-.LASF1508:
+.LASF1509:
 	.string	"refaults"
-.LASF1008:
+.LASF1009:
 	.string	"load_weight"
-.LASF2853:
+.LASF2854:
 	.string	"WF_TYPE_MAX"
-.LASF569:
+.LASF570:
 	.string	"kuid_t"
-.LASF1034:
+.LASF1035:
 	.string	"block_max"
-.LASF606:
+.LASF607:
 	.string	"rcu_blocked_node"
-.LASF1387:
+.LASF1388:
 	.string	"gp_count"
-.LASF2051:
+.LASF2052:
 	.string	"key_restriction"
-.LASF3080:
+.LASF3081:
 	.string	"check_part_mode"
-.LASF618:
+.LASF619:
 	.string	"exit_state"
-.LASF152:
+.LASF153:
 	.string	"SYSTEM_SCHEDULING"
-.LASF2260:
+.LASF2261:
 	.string	"is_late_suspended"
-.LASF307:
+.LASF308:
 	.string	"__end_opd"
-.LASF1417:
+.LASF1418:
 	.string	"files_stat"
-.LASF1914:
+.LASF1915:
 	.string	"lm_owner_key"
-.LASF1539:
+.LASF1540:
 	.string	"vm_stat_diff"
-.LASF2849:
+.LASF2850:
 	.string	"WF_TYPE_GL16"
-.LASF2283:
+.LASF2284:
 	.string	"ignore_children"
-.LASF2081:
+.LASF2082:
 	.string	"resource"
-.LASF2189:
+.LASF2190:
 	.string	"restore_early"
-.LASF2094:
+.LASF2095:
 	.string	"next_generation"
-.LASF2591:
+.LASF2592:
 	.string	"__tracepoint_page_ref_mod_and_test"
-.LASF1943:
+.LASF1944:
 	.string	"fs_supers"
-.LASF1131:
+.LASF1132:
 	.string	"last_waited"
-.LASF3059:
+.LASF3060:
 	.string	"ebc_open"
-.LASF3149:
+.LASF3150:
 	.string	"three_win_mode"
-.LASF2874:
+.LASF2875:
 	.string	"EPD_OVERLAY"
-.LASF1629:
+.LASF1630:
 	.string	"dqb_bsoftlimit"
-.LASF218:
+.LASF219:
 	.string	"pending"
-.LASF2982:
+.LASF2983:
 	.string	"direct_buffer"
-.LASF2492:
+.LASF2493:
 	.string	"i2c_client_type"
-.LASF1028:
+.LASF1029:
 	.string	"iowait_count"
-.LASF2554:
+.LASF2555:
 	.string	"RCU_SOFTIRQ"
-.LASF2807:
+.LASF2808:
 	.string	"module_mutex"
-.LASF2650:
+.LASF2651:
 	.string	"PGFAULT"
-.LASF1576:
+.LASF1577:
 	.string	"notifier_block"
-.LASF2296:
+.LASF2297:
 	.string	"suspended_jiffies"
-.LASF2162:
+.LASF2163:
 	.string	"mm_kobj"
-.LASF2744:
+.LASF2745:
 	.string	"string"
-.LASF1393:
+.LASF1394:
 	.string	"read_count"
-.LASF1255:
+.LASF1256:
 	.string	"pt_mm"
-.LASF1504:
+.LASF1505:
 	.string	"lruvec"
-.LASF2901:
+.LASF2902:
 	.string	"ebc_pmic"
 .LASF14:
 	.string	"long long int"
-.LASF313:
+.LASF314:
 	.string	"__alt_instructions"
-.LASF2386:
+.LASF2387:
 	.string	"irq_domain"
-.LASF635:
+.LASF636:
 	.string	"atomic_flags"
-.LASF2537:
+.LASF2538:
 	.string	"__softirq_pending"
-.LASF1599:
+.LASF1600:
 	.string	"freq_scale"
-.LASF2272:
+.LASF2273:
 	.string	"timer_expires"
-.LASF2827:
+.LASF2828:
 	.string	"mmlist_lock"
-.LASF3166:
+.LASF3167:
 	.string	"ebc_pmic_power_on"
-.LASF1765:
+.LASF1766:
 	.string	"trace_evals"
-.LASF885:
+.LASF886:
 	.string	"active_bases"
-.LASF2734:
+.LASF2735:
 	.string	"sh_offset"
-.LASF2262:
+.LASF2263:
 	.string	"early_init"
-.LASF2730:
+.LASF2731:
 	.string	"sh_name"
-.LASF746:
+.LASF747:
 	.string	"security"
-.LASF262:
+.LASF263:
 	.string	"safe_val"
-.LASF367:
+.LASF368:
 	.string	"nr_cpu_ids"
-.LASF1281:
+.LASF1282:
 	.string	"f_pos_lock"
-.LASF179:
+.LASF180:
 	.string	"system_states"
-.LASF2190:
+.LASF2191:
 	.string	"suspend_noirq"
-.LASF1703:
+.LASF1704:
 	.string	"i_fieldmask"
-.LASF97:
+.LASF98:
 	.string	"owner"
-.LASF704:
+.LASF705:
 	.string	"acct_rss_mem1"
-.LASF831:
+.LASF832:
 	.string	"refcount_struct"
-.LASF1262:
+.LASF1263:
 	.string	"_zd_pad_1"
-.LASF2250:
+.LASF2251:
 	.string	"domain_data"
-.LASF330:
+.LASF331:
 	.string	"__mmuoff_data_end"
-.LASF2309:
+.LASF2310:
 	.string	"relax_count"
-.LASF1413:
+.LASF1414:
 	.string	"nr_free_files"
-.LASF3179:
+.LASF3180:
 	.string	"kmalloc"
 	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
 	.section	.note.GNU-stack,"",@progbits

commit 8133d7dca66803e49e83bb153e8ae28ea14d52a7
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Tue Jul 27 19:48:40 2021 +0800

    drivers: rkflash: Add some delay after DMA finish
    
    When internal DMA ready, the last spare data may still in fifo.
    
    Change-Id: I1cf670d2008ea62b67b517641e31386fd0877417
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/rkflash/nandc.c b/drivers/rkflash/nandc.c
index 69e3b0ed5598..efeeede068b9 100644
--- a/drivers/rkflash/nandc.c
+++ b/drivers/rkflash/nandc.c
@@ -323,26 +323,29 @@ static void nandc_xfer_done(void)
 			do {
 				fl_reg.d32 = nandc_readl(NANDC_V9_FLCTL);
 				stat_reg.d32 = nandc_readl(NANDC_V9_MTRANS_STAT);
+				usleep_range(20, 30);
 			} while (stat_reg.V9.mtrans_cnt < fl_reg.V9.page_num ||
 				 fl_reg.V9.tr_rdy == 0);
+			udelay(5);
 			if (master.mapped) {
 				rknandc_dma_unmap_single((u64)master.page_phy,
-					fl_reg.V6.page_num * 1024,
+					fl_reg.V9.page_num * 1024,
 					0);
 				rknandc_dma_unmap_single((u64)master.spare_phy,
-					fl_reg.V6.page_num * 64,
+					fl_reg.V9.page_num * 64,
 					0);
 			}
 		} else {
 			do {
 				fl_reg.d32 = nandc_readl(NANDC_V9_FLCTL);
+				usleep_range(20, 30);
 			} while (fl_reg.V9.tr_rdy == 0);
 			if (master.mapped) {
 				rknandc_dma_unmap_single((u64)master.page_phy,
-					fl_reg.V6.page_num * 1024,
+					fl_reg.V9.page_num * 1024,
 					1);
 				rknandc_dma_unmap_single((u64)master.spare_phy,
-					fl_reg.V6.page_num * 64,
+					fl_reg.V9.page_num * 64,
 					1);
 			}
 		}
@@ -355,6 +358,7 @@ static void nandc_xfer_done(void)
 			do {
 				fl_reg.d32 = nandc_readl(NANDC_FLCTL);
 				stat_reg.d32 = nandc_readl(NANDC_MTRANS_STAT);
+				usleep_range(20, 30);
 			} while (stat_reg.V6.mtrans_cnt < fl_reg.V6.page_num ||
 				 fl_reg.V6.tr_rdy == 0);
 
@@ -371,6 +375,7 @@ static void nandc_xfer_done(void)
 		} else {
 			do {
 				fl_reg.d32 = nandc_readl(NANDC_FLCTL);
+				usleep_range(20, 30);
 			} while (fl_reg.V6.tr_rdy == 0);
 			if (master.mapped) {
 				rknandc_dma_unmap_single(

commit 75e3349fd265324145e92c9c3a474bb02c5568cd
Author: XiaoTan Luo <lxt@rock-chips.com>
Date:   Mon Aug 9 16:15:33 2021 +0800

    media: i2c: techpoint: add support audio feature
    
    Signed-off-by: Xing Zheng <zhengxing@rock-chips.com>
    Signed-off-by: XiaoTan Luo <lxt@rock-chips.com>
    Change-Id: Ie5fdd39284575e89f8242c12bc6c14033ee5e80e

diff --git a/drivers/media/i2c/techpoint/techpoint_common.h b/drivers/media/i2c/techpoint/techpoint_common.h
index f6bbc9a5fe0f..2ac5f26581e7 100644
--- a/drivers/media/i2c/techpoint/techpoint_common.h
+++ b/drivers/media/i2c/techpoint/techpoint_common.h
@@ -8,7 +8,6 @@
 #ifndef _TECHPOINT_COMMON_H
 #define _TECHPOINT_COMMON_H
 
-// #define DEBUG
 #include <linux/clk.h>
 #include <linux/device.h>
 #include <linux/delay.h>
@@ -89,7 +88,23 @@ struct techpoint_video_modes {
 	enum techpoint_support_reso channel_reso[PAD_MAX];
 };
 
+/* Audio output port formats */
+enum techpoint_audfmts {
+	AUDFMT_I2S = 0,
+	AUDFMT_DSP,
+};
+
+struct techpoint_audio {
+	enum techpoint_audfmts audfmt;
+	int mclk_fs;
+	int cascade_num;
+	int cascade_order;
+	int slave_num;
+	struct techpoint *slave_tp[3];
+};
+
 struct techpoint {
+	struct device dev;
 	struct i2c_client *client;
 	struct clk *xvclk;
 	struct gpio_desc *reset_gpio;
@@ -105,6 +120,9 @@ struct techpoint {
 	struct mutex mutex;
 	struct regulator_bulk_data *supplies;
 	u32 xvclk_freq_value;
+	struct techpoint_audio *audio_in;
+	struct techpoint_audio *audio_out;
+	int i2c_idx;
 	u32 channel_nums;
 
 	enum techpoint_chips chip_id;
diff --git a/drivers/media/i2c/techpoint/techpoint_v4l2.c b/drivers/media/i2c/techpoint/techpoint_v4l2.c
index 8144640070ec..bab8436f2ed6 100644
--- a/drivers/media/i2c/techpoint/techpoint_v4l2.c
+++ b/drivers/media/i2c/techpoint/techpoint_v4l2.c
@@ -6,6 +6,11 @@
  *
  */
 
+#include <sound/core.h>
+#include <sound/pcm.h>
+#include <sound/pcm_params.h>
+#include <sound/soc.h>
+#include <sound/tlv.h>
 #include "techpoint_dev.h"
 
 #define TECHPOINT_NAME  "techpoint"
@@ -13,6 +18,28 @@
 #define OF_CAMERA_PINCTRL_STATE_DEFAULT		"rockchip,camera_default"
 #define OF_CAMERA_PINCTRL_STATE_SLEEP		"rockchip,camera_sleep"
 
+#define I2S				0
+#define DSP				1
+#define AUDIO_FORMAT			I2S
+
+#define SAMPLE_8K			0
+#define SAMPLE_16K			1
+#define SAMPLE_RATE			SAMPLE_8K
+
+#define DATA_16BIT			0
+#define DATA_8BIT			1
+#define DATA_BIT			DATA_16BIT
+
+#define AUDIO_CHN			8
+#define MAX_CHIPS			4
+#define MAX_SLAVES			(MAX_CHIPS - 1)
+
+#define TECHPOINT_I2C_CHIP_ADDRESS_0	0x44
+#define TECHPOINT_I2C_CHIP_ADDRESS_1	0x45
+
+static int g_idx;
+static struct techpoint *g_techpoints[MAX_CHIPS];
+
 static const char *const techpoint_supply_names[] = {
 	"dovdd",		/* Digital I/O power */
 	"avdd",			/* Analog power */
@@ -809,6 +836,496 @@ static const struct i2c_device_id techpoint_match_id[] = {
 	{ },
 };
 
+static int techpoint_9930_audio_init(struct techpoint *techpoint);
+
+static struct snd_soc_dai_driver techpoint_audio_dai = {
+	.name = "techpoint",
+	.playback = {
+		.stream_name = "Playback",
+		.channels_min = 1,
+		.channels_max = 16,
+		.rates = SNDRV_PCM_RATE_8000_384000,
+		.formats = (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE),
+	},
+	.capture = {
+		.stream_name = "Capture",
+		.channels_min = 1,
+		.channels_max = 16,
+		.rates = SNDRV_PCM_RATE_8000_384000,
+		.formats = (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE),
+	},
+};
+
+static ssize_t i2c_rdwr_store(struct device *dev,
+			      struct device_attribute *attr,
+			      const char *buf, size_t count)
+{
+	struct techpoint *techpoint =
+		container_of(dev, struct techpoint, dev);
+	unsigned char op_type;
+	unsigned int reg, v;
+	int ret;
+
+	ret = sscanf(buf, "%c %x %x", &op_type, &reg, &v);
+	if (ret != 3) {
+		dev_err(&techpoint->client->dev, "%s sscanf failed: %d\n",
+			__func__, ret);
+		return -EFAULT;
+	}
+
+	if (op_type == 'r')
+		techpoint_read_reg(techpoint->client, reg, (unsigned char *)&v);
+	else if (op_type == 'w')
+		techpoint_write_reg(techpoint->client, reg, v);
+	else if (op_type == 'd')
+		techpoint_9930_audio_init(techpoint);
+
+	return count;
+}
+
+static const struct device_attribute techpoint_attrs[] = {
+	__ATTR_WO(i2c_rdwr),
+};
+
+static int techpoint_codec_probe(struct snd_soc_component *component)
+{
+	return 0;
+}
+
+static void techpoint_codec_remove(struct snd_soc_component *component)
+{
+}
+
+static const struct snd_soc_component_driver techpoint_codec_driver = {
+	.probe			= techpoint_codec_probe,
+	.remove			= techpoint_codec_remove,
+	.idle_bias_on		= 1,
+	.use_pmdown_time	= 1,
+	.endianness		= 1,
+	.non_legacy_dai_naming	= 1,
+};
+
+static int tp2833_audio_config_rmpos(struct i2c_client *client,
+		unsigned int chip, unsigned int format, unsigned int chn_num)
+{
+	int i = 0;
+	unsigned char v;
+
+	/* clear first */
+	for (i = 0; i < 20; i++)
+		techpoint_write_reg(client, i, 0x00);
+
+	switch (chn_num) {
+
+	case 2:
+		if (format == DSP) {
+			techpoint_write_reg(client, 0x0, 1);
+			techpoint_write_reg(client, 0x1, 2);
+		} else {
+			techpoint_write_reg(client, 0x0, 1);
+			techpoint_write_reg(client, 0x8, 2);
+		}
+		break;
+
+	case 4:
+		if (format == DSP) {
+			techpoint_write_reg(client, 0x0, 1);
+			techpoint_write_reg(client, 0x1, 2);
+			techpoint_write_reg(client, 0x2, 3);
+			techpoint_write_reg(client, 0x3, 4);
+		} else {
+			techpoint_write_reg(client, 0x0, 1);
+			techpoint_write_reg(client, 0x1, 3);
+			techpoint_write_reg(client, 0x8, 2);
+			techpoint_write_reg(client, 0x9, 4);
+		}
+		break;
+
+	case 8:
+		if (chip % 4 == 0) {
+			if (format == DSP) {
+				techpoint_write_reg(client, 0x0, 1);
+				techpoint_write_reg(client, 0x1, 2);
+				techpoint_write_reg(client, 0x2, 3);
+				techpoint_write_reg(client, 0x3, 4);
+				techpoint_write_reg(client, 0x4, 5);
+				techpoint_write_reg(client, 0x5, 6);
+				techpoint_write_reg(client, 0x6, 7);
+				techpoint_write_reg(client, 0x7, 8);
+			} else {
+				techpoint_write_reg(client, 0x0, 1);
+				techpoint_write_reg(client, 0x1, 2);
+				techpoint_write_reg(client, 0x2, 3);
+				techpoint_write_reg(client, 0x3, 4);
+				techpoint_write_reg(client, 0x8, 5);
+				techpoint_write_reg(client, 0x9, 6);
+				techpoint_write_reg(client, 0xa, 7);
+				techpoint_write_reg(client, 0xb, 8);
+			}
+		} else if (chip % 4 == 1) {
+			if (format == DSP) {
+				techpoint_write_reg(client, 0x0, 0);
+				techpoint_write_reg(client, 0x1, 0);
+				techpoint_write_reg(client, 0x2, 0);
+				techpoint_write_reg(client, 0x3, 0);
+				techpoint_write_reg(client, 0x4, 1);
+				techpoint_write_reg(client, 0x5, 2);
+				techpoint_write_reg(client, 0x6, 3);
+				techpoint_write_reg(client, 0x7, 4);
+			} else {
+				techpoint_write_reg(client, 0x0, 0);
+				techpoint_write_reg(client, 0x1, 0);
+				techpoint_write_reg(client, 0x2, 1);
+				techpoint_write_reg(client, 0x3, 2);
+				techpoint_write_reg(client, 0x8, 0);
+				techpoint_write_reg(client, 0x9, 0);
+				techpoint_write_reg(client, 0xa, 3);
+				techpoint_write_reg(client, 0xb, 4);
+				techpoint_read_reg(client, 0x3, &v);
+			}
+		}
+		break;
+
+	case 16:
+		if (chip % 4 == 0) {
+			for (i = 0; i < 16; i++)
+				techpoint_write_reg(client, i, i+1);
+		} else if (chip % 4 == 1) {
+			for (i = 4; i < 16; i++)
+				techpoint_write_reg(client, i, i+1 - 4);
+		} else if (chip % 4 == 2) {
+			for (i = 8; i < 16; i++)
+				techpoint_write_reg(client, i, i+1 - 8);
+		} else {
+			for (i = 12; i < 16; i++)
+				techpoint_write_reg(client, i, i+1 - 12);
+		}
+		break;
+
+	case 20:
+		for (i = 0; i < 20; i++)
+			techpoint_write_reg(client, i, i+1);
+		break;
+
+	default:
+		for (i = 0; i < 20; i++)
+			techpoint_write_reg(client, i, i+1);
+		break;
+	}
+
+	mdelay(10);
+	return 0;
+}
+
+static int techpoint_2855_audio_init(struct techpoint *techpoint)
+{
+	struct i2c_client *client = techpoint->client;
+
+	unsigned char bank;
+	unsigned char chip_id_h = 0xFF, chip_id_l = 0xFF;
+
+	techpoint_read_reg(client, CHIP_ID_H_REG, &chip_id_h);
+	techpoint_read_reg(client, CHIP_ID_L_REG, &chip_id_l);
+
+	techpoint_read_reg(client, 0x40, &bank);
+	techpoint_write_reg(client, 0x40, 0x40);
+
+	tp2833_audio_config_rmpos(client, 0, AUDIO_FORMAT, AUDIO_CHN);
+
+	techpoint_write_reg(client, 0x17, 0x00|(DATA_BIT<<2));
+	techpoint_write_reg(client, 0x1B, 0x01|(DATA_BIT<<6));
+
+#if (AUDIO_CHN == 20)
+	techpoint_write_reg(client, 0x18, 0x90|(SAMPLE_RATE));
+#else
+	techpoint_write_reg(client, 0x18, 0x80|(SAMPLE_RATE));
+#endif
+
+#if (AUDIO_CHN >= 8)
+	techpoint_write_reg(client, 0x19, 0x1F);
+#else
+	techpoint_write_reg(client, 0x19, 0x0F);
+#endif
+
+	techpoint_write_reg(client, 0x1A, 0x15);
+
+	techpoint_write_reg(client, 0x37, 0x20);
+	techpoint_write_reg(client, 0x38, 0x38);
+	techpoint_write_reg(client, 0x3E, 0x00);
+
+	/* audio reset */
+	techpoint_write_reg(client, 0x3d, 0x01);
+
+	techpoint_write_reg(client, 0x40, bank);
+
+	return 0;
+}
+
+static int techpoint_9930_audio_init(struct techpoint *techpoint)
+{
+	struct i2c_client *client = techpoint->client;
+
+	unsigned char bank;
+	unsigned char chip_id_h = 0xFF;
+	unsigned char chip_id_l = 0xFF;
+
+	techpoint_read_reg(client, CHIP_ID_H_REG, &chip_id_h);
+	techpoint_read_reg(client, CHIP_ID_L_REG, &chip_id_l);
+
+	techpoint_read_reg(client, 0x40, &bank);
+	techpoint_write_reg(client, 0x40, 0x40);
+
+	tp2833_audio_config_rmpos(client, 1, AUDIO_FORMAT, AUDIO_CHN);
+
+	techpoint_write_reg(client, 0x17, 0x00|(DATA_BIT<<2));
+	techpoint_write_reg(client, 0x1B, 0x01|(DATA_BIT<<6));
+
+#if (AUDIO_CHN == 20)
+	techpoint_write_reg(client, 0x18, 0x90|(SAMPLE_RATE));
+#else
+	techpoint_write_reg(client, 0x18, 0x80|(SAMPLE_RATE));
+#endif
+
+#if (AUDIO_CHN >= 8)
+	techpoint_write_reg(client, 0x19, 0x1F);
+#else
+	techpoint_write_reg(client, 0x19, 0x0F);
+#endif
+
+	techpoint_write_reg(client, 0x1A, 0x15);
+	techpoint_write_reg(client, 0x37, 0x20);
+	techpoint_write_reg(client, 0x38, 0x38);
+	techpoint_write_reg(client, 0x3E, 0x00);
+
+	/* reset audio */
+	techpoint_write_reg(client, 0x3d, 0x01);
+
+	techpoint_write_reg(client, 0x40, bank);
+
+	return 0;
+}
+
+static int techpoint_audio_init(struct techpoint *techpoint)
+{
+	if (techpoint)
+		techpoint_2855_audio_init(techpoint);
+
+	if (techpoint && techpoint->audio_in)
+		techpoint_9930_audio_init(techpoint->audio_in->slave_tp[0]);
+
+	return 0;
+}
+
+static int techpoint_audio_dt_parse(struct techpoint *techpoint)
+{
+	struct device *dev = &techpoint->client->dev;
+	struct device_node *node = dev->of_node;
+	const char *str;
+	u32 v;
+
+	/* Parse audio parts */
+	techpoint->audio_in = NULL;
+	if (!of_property_read_string(node, "techpoint,audio-in-format", &str)) {
+		struct techpoint_audio *audio_stream;
+
+		techpoint->audio_in = devm_kzalloc(dev, sizeof(struct techpoint_audio),
+						   GFP_KERNEL);
+		if (!techpoint->audio_in)
+			return -ENOMEM;
+
+		audio_stream = techpoint->audio_in;
+
+		if (strcmp(str, "i2s") == 0)
+			audio_stream->audfmt = AUDFMT_I2S;
+		else if (strcmp(str, "dsp") == 0)
+			audio_stream->audfmt = AUDFMT_DSP;
+		else {
+			dev_err(dev, "techpoint,audio-in-format invalid\n");
+			return -EINVAL;
+		}
+
+		if (!of_property_read_u32(node, "techpoint,audio-in-mclk-fs", &v)) {
+			switch (v) {
+			case 256:
+				break;
+			default:
+				dev_err(dev,
+					"techpoint,audio-in-mclk-fs invalid\n");
+				return -EINVAL;
+			}
+			audio_stream->mclk_fs = v;
+		}
+
+		if (!of_property_read_u32(node, "techpoint,audio-in-cascade-num", &v))
+			audio_stream->cascade_num = v;
+
+		if (!of_property_read_u32(node, "techpoint,audio-in-cascade-order", &v)) {
+			if (v > 1)
+				dev_err(dev,
+					"audio-in-cascade-order should be 1st chip, otherwise without cascade (is 0)\n");
+			else
+				audio_stream->cascade_order = v;
+		}
+
+		if (audio_stream->cascade_order == 1) {
+			struct device_node *np;
+			int i, count;
+
+			count = of_count_phandle_with_args(node, "techpoint,audio-in-cascade-slaves", NULL);
+			if (count < 0 || count > MAX_SLAVES)
+				return -EINVAL;
+
+			for (i = 0; i < count; i++) {
+				np = of_parse_phandle(node, "techpoint,audio-in-cascade-slaves", i);
+				if (!np)
+					return -ENODEV;
+			}
+
+			for (i = 0; i < g_idx; i++) {
+				struct techpoint *tp = g_techpoints[i];
+
+				if (tp->i2c_idx != techpoint->i2c_idx) {
+					audio_stream->slave_tp[i] = tp;
+					audio_stream->slave_num++;
+				}
+			}
+		}
+	}
+
+	techpoint->audio_out = NULL;
+	if (!of_property_read_string(node, "techpoint,audio-out-format", &str)) {
+		struct techpoint_audio *audio_stream;
+
+		techpoint->audio_out = devm_kzalloc(dev, sizeof(struct techpoint_audio),
+						    GFP_KERNEL);
+		if (!techpoint->audio_out)
+			return -ENOMEM;
+
+		audio_stream = techpoint->audio_out;
+
+		if (strcmp(str, "i2s") == 0)
+			audio_stream->audfmt = AUDFMT_I2S;
+		else if (strcmp(str, "dsp") == 0)
+			audio_stream->audfmt = AUDFMT_DSP;
+		else {
+			dev_err(dev, "techpoint,audio-out-format invalid\n");
+			return -EINVAL;
+		}
+
+		if (!of_property_read_u32(node, "techpoint,audio-out-mclk-fs", &v)) {
+			switch (v) {
+			case 256:
+				break;
+			default:
+				dev_err(dev,
+					"techpoint,audio-out-mclk-fs invalid\n");
+				return -EINVAL;
+			}
+			audio_stream->mclk_fs = v;
+		}
+
+		if (!of_property_read_u32(node, "techpoint,audio-out-cascade-num", &v))
+			audio_stream->cascade_num = v;
+
+		if (!of_property_read_u32(node, "techpoint,audio-out-cascade-order", &v)) {
+			if (v > 1)
+				dev_err(dev,
+					"audio-out-cascade-order should be 1st chip, otherwise without cascade (is 0)\n");
+			else
+				audio_stream->cascade_order = v;
+		}
+	}
+
+	if (!techpoint->audio_in && !techpoint->audio_out)
+		return -ENODEV;
+
+	return 0;
+}
+
+static int techpoint_audio_probe(struct techpoint *techpoint)
+{
+	struct device *dev = &techpoint->client->dev;
+	int ret;
+	unsigned char i;
+
+	switch (techpoint->chip_id) {
+	case CHIP_TP9930:
+		techpoint_9930_audio_init(techpoint);
+		break;
+	case CHIP_TP2855:
+		techpoint_2855_audio_init(techpoint);
+		break;
+	default:
+		break;
+	}
+
+	if (techpoint->chip_id == CHIP_TP9930) {
+
+		techpoint_write_reg(techpoint->client, 0x40, 0x00);
+		for (i = 0; i < 0xff; i++)
+			techpoint_write_reg(techpoint->client, i, 0xbb);
+	}
+
+	ret = techpoint_audio_dt_parse(techpoint);
+	if (ret) {
+		dev_info(dev, "hasn't audio DT nodes\n");
+		return 0;
+	}
+
+	ret = techpoint_audio_init(techpoint);
+	if (ret) {
+		dev_info(dev, "audio init failed(%d)\n", ret);
+		return 0;
+	}
+
+	ret = devm_snd_soc_register_component(dev,
+					      &techpoint_codec_driver,
+					      &techpoint_audio_dai, 1);
+	if (ret) {
+		dev_err(dev, "register audio codec failed\n");
+		return -EINVAL;
+	}
+
+	dev_info(dev, "registered audio codec\n");
+
+	return 0;
+}
+
+static void techpoint_device_release(struct device *dev)
+{
+
+}
+
+static int techpoint_sysfs_init(struct i2c_client *client,
+				struct techpoint *techpoint)
+{
+	struct device *dev = &techpoint->dev;
+	int i;
+
+	dev->release = techpoint_device_release;
+	dev->parent = &client->dev;
+	set_dev_node(dev, dev_to_node(&client->dev));
+	dev_set_name(dev, "techpoint-dev");
+
+	if (device_register(dev)) {
+		dev_err(&client->dev,
+			"Register 'techpoint-dev' failed\n");
+		dev->parent = NULL;
+		return -ENOMEM;
+	}
+
+	for (i = 0; i < ARRAY_SIZE(techpoint_attrs); i++) {
+		if (device_create_file(dev, &techpoint_attrs[i])) {
+			dev_err(&client->dev,
+				"Create 'techpoint-dev' attr failed\n");
+			device_unregister(dev);
+			return -ENOMEM;
+		}
+	}
+
+	return 0;
+}
+
 static int techpoint_probe(struct i2c_client *client,
 			   const struct i2c_device_id *id)
 {
@@ -829,6 +1346,8 @@ static int techpoint_probe(struct i2c_client *client,
 	techpoint->client = client;
 	techpoint->supplies = NULL;
 
+	techpoint_sysfs_init(client, techpoint);
+
 	mutex_init(&techpoint->mutex);
 
 	sd = &techpoint->subdev;
@@ -883,6 +1402,15 @@ static int techpoint_probe(struct i2c_client *client,
 		goto err_clean_entity;
 	}
 
+	techpoint->i2c_idx = g_idx;
+	g_techpoints[g_idx++] = techpoint;
+
+	ret = techpoint_audio_probe(techpoint);
+	if (ret) {
+		dev_err(dev, "sound audio probe failed\n");
+		goto err_clean_entity;
+	}
+
 	pm_runtime_set_active(dev);
 	pm_runtime_enable(dev);
 	pm_runtime_idle(dev);

commit af2d7e096b9f5e276a3d3a0e1d5bdfe1f972bcf0
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Thu Aug 12 09:19:31 2021 +0800

    PCI: rockchip: dw: Request perst IO as output-low state
    
    Requesting perst# as high and then drive it low makes some
    buggy devices fail to work properly, for instance Biwin SSD.
    It's not mandatory to have a high-low transition for perst#
    before powering up. So we request it as output-low state directly
    and remove redundant code.
    
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: Ib62954f8dccc8a21dd06e7a582263bcf62995f29

diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
index 4fedaf4136e2..c2203da4b6ca 100644
--- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
+++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
@@ -818,8 +818,16 @@ static int rk_pcie_resource_get(struct platform_device *pdev,
 	if (IS_ERR(rk_pcie->apb_base))
 		return PTR_ERR(rk_pcie->apb_base);
 
+	/*
+	 * Rest the device before enabling power because some of the
+	 * platforms may use external refclk input with the some power
+	 * rail connect to 100MHz OSC chip. So once the power is up for
+	 * the slot and the refclk is available, which isn't quite follow
+	 * the spec. We should make sure it is in reset state before
+	 * everthing's ready.
+	 */
 	rk_pcie->rst_gpio = devm_gpiod_get_optional(&pdev->dev, "reset",
-						    GPIOD_OUT_HIGH);
+						    GPIOD_OUT_LOW);
 	if (IS_ERR(rk_pcie->rst_gpio)) {
 		dev_err(&pdev->dev, "invalid reset-gpios property in node\n");
 		return PTR_ERR(rk_pcie->rst_gpio);
@@ -1285,16 +1293,6 @@ static int rk_pcie_really_probe(void *p)
 		dev_info(dev, "no vpcie3v3 regulator found\n");
 	}
 
-	/*
-	 * Rest the device before enabling power because some of the
-	 * platforms may use external refclk input with the some power
-	 * rail connect to 100MHz OSC chip. So once the power is up for
-	 * the slot and the refclk is available, which isn't quite follow
-	 * the spec. We should make sure it is in reset state before
-	 * everthing's ready.
-	 */
-	gpiod_set_value_cansleep(rk_pcie->rst_gpio, 0);
-
 	ret = rk_pcie_enable_power(rk_pcie);
 	if (ret)
 		return ret;

commit ce93adb4e411b0cc3ac63f9c77a37ba0e909ec7c
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Fri Aug 6 15:02:41 2021 +0800

    rknpu: gem: fix error sg_dma_addr for iommu case
    
    Fixes: 9a93c881e9dd ("driver: rknpu: Add rknpu driver for rk356x, version: 0.4.2")
    
    Change-Id: I33a85f5eea54912113575d307977961424e28c0e
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/rknpu/rknpu_gem.c b/drivers/rknpu/rknpu_gem.c
index 76080cf121b4..5f4d6ff99472 100644
--- a/drivers/rknpu/rknpu_gem.c
+++ b/drivers/rknpu/rknpu_gem.c
@@ -937,7 +937,6 @@ int rknpu_gem_sync_ioctl(struct drm_device *dev, void *data,
 	} else {
 		length = args->size;
 		offset = args->offset;
-		sg_dma_addr = rknpu_obj->dma_addr;
 
 		for_each_sg(rknpu_obj->sgt->sgl, sg, rknpu_obj->sgt->nents,
 			     i) {
@@ -945,6 +944,7 @@ int rknpu_gem_sync_ioctl(struct drm_device *dev, void *data,
 			if (len <= offset)
 				continue;
 
+			sg_dma_addr = sg_dma_address(sg);
 			sg_left = len - offset;
 			sg_offset = sg->length - sg_left;
 			size = (length < sg_left) ? length : sg_left;
@@ -964,7 +964,6 @@ int rknpu_gem_sync_ioctl(struct drm_device *dev, void *data,
 
 			offset += size;
 			length -= size;
-			sg_dma_addr += sg->length;
 
 			if (length == 0)
 				break;

commit 78a4d032ec09523a24f81b8ca580a79c7e804477
Merge: 54e366cc7bd7 addba38e7c3b
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Thu Aug 12 13:58:30 2021 +0200

    Merge 4.19.203 into android-4.19-stable
    
    Changes in 4.19.203
            Revert "ACPICA: Fix memory leak caused by _CID repair function"
            ALSA: seq: Fix racy deletion of subscriber
            ARM: imx: add missing iounmap()
            ARM: dts: colibri-imx6ull: limit SDIO clock to 25MHz
            ALSA: usb-audio: fix incorrect clock source setting
            clk: stm32f4: fix post divisor setup for I2S/SAI PLLs
            omap5-board-common: remove not physically existing vdds_1v8_main fixed-regulator
            scsi: sr: Return correct event when media event code is 3
            media: videobuf2-core: dequeue if start_streaming fails
            net: natsemi: Fix missing pci_disable_device() in probe and remove
            sctp: move the active_key update after sh_keys is added
            nfp: update ethtool reporting of pauseframe control
            net: ipv6: fix returned variable type in ip6_skb_dst_mtu
            mips: Fix non-POSIX regexp
            bnx2x: fix an error code in bnx2x_nic_load()
            net: pegasus: fix uninit-value in get_interrupt_interval
            net: fec: fix use-after-free in fec_drv_remove
            net: vxge: fix use-after-free in vxge_device_unregister
            blk-iolatency: error out if blk_get_queue() failed in iolatency_set_limit()
            Bluetooth: defer cleanup of resources in hci_unregister_dev()
            USB: usbtmc: Fix RCU stall warning
            USB: serial: option: add Telit FD980 composition 0x1056
            USB: serial: ch341: fix character loss at high transfer rates
            USB: serial: ftdi_sio: add device ID for Auto-M3 OP-COM v2
            firmware_loader: use -ETIMEDOUT instead of -EAGAIN in fw_load_sysfs_fallback
            firmware_loader: fix use-after-free in firmware_fallback_sysfs
            ALSA: usb-audio: Add registration quirk for JBL Quantum 600
            usb: gadget: f_hid: added GET_IDLE and SET_IDLE handlers
            usb: gadget: f_hid: fixed NULL pointer dereference
            usb: gadget: f_hid: idle uses the highest byte for duration
            usb: otg-fsm: Fix hrtimer list corruption
            scripts/tracing: fix the bug that can't parse raw_trace_func
            tracing / histogram: Give calculation hist_fields a size
            tracing/histogram: Rename "cpu" to "common_cpu"
            optee: Clear stale cache entries during initialization
            staging: rtl8723bs: Fix a resource leak in sd_int_dpc
            media: rtl28xxu: fix zero-length control request
            pipe: increase minimum default pipe size to 2 pages
            ext4: fix potential htree corruption when growing large_dir directories
            serial: 8250: Mask out floating 16/32-bit bus bits
            MIPS: Malta: Do not byte-swap accesses to the CBUS UART
            pcmcia: i82092: fix a null pointer dereference bug
            KVM: x86: accept userspace interrupt only if no event is injected
            KVM: x86/mmu: Fix per-cpu counter corruption on 32-bit builds
            spi: meson-spicc: fix memory leak in meson_spicc_remove
            perf/x86/amd: Don't touch the AMD64_EVENTSEL_HOSTONLY bit inside the guest
            qmi_wwan: add network device usage statistics for qmimux devices
            libata: fix ata_pio_sector for CONFIG_HIGHMEM
            reiserfs: add check for root_inode in reiserfs_fill_super
            reiserfs: check directory items on read from disk
            alpha: Send stop IPI to send to online CPUs
            net/qla3xxx: fix schedule while atomic in ql_wait_for_drvr_lock and ql_adapter_reset
            ARM: imx: add mmdc ipg clock operation for mmdc
            Linux 4.19.203
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I4adcce1092ab000faec667eda6cf569e7a269562

commit addba38e7c3bc19036a05c83bcce7878dc644d87
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Thu Aug 12 13:19:45 2021 +0200

    Linux 4.19.203
    
    Link: https://lore.kernel.org/r/20210810172944.179901509@linuxfoundation.org
    Tested-by: Hulk Robot <hulkrobot@huawei.com>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index b0f3a4d5a85d..6d2670300d47 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 202
+SUBLEVEL = 203
 EXTRAVERSION =
 NAME = "People's Front"
 

commit 4534571e1baf18dfe8a12addcb08cd82c2bd11b6
Author: Anson Huang <Anson.Huang@nxp.com>
Date:   Fri Aug 31 15:53:12 2018 +0800

    ARM: imx: add mmdc ipg clock operation for mmdc
    
    [ Upstream commit 9454a0caff6ac6d2a5ea17dd624dc13387bbfcd3 ]
    
    i.MX6 SoCs have MMDC ipg clock for registers access, to make
    sure MMDC registers access successfully, add optional clock
    enable for MMDC driver.
    
    Signed-off-by: Anson Huang <Anson.Huang@nxp.com>
    Signed-off-by: Shawn Guo <shawnguo@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/mach-imx/mmdc.c b/arch/arm/mach-imx/mmdc.c
index 1d340fda5e4f..ae0a61c61a6e 100644
--- a/arch/arm/mach-imx/mmdc.c
+++ b/arch/arm/mach-imx/mmdc.c
@@ -11,6 +11,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
+#include <linux/clk.h>
 #include <linux/hrtimer.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
@@ -547,7 +548,20 @@ static int imx_mmdc_probe(struct platform_device *pdev)
 {
 	struct device_node *np = pdev->dev.of_node;
 	void __iomem *mmdc_base, *reg;
+	struct clk *mmdc_ipg_clk;
 	u32 val;
+	int err;
+
+	/* the ipg clock is optional */
+	mmdc_ipg_clk = devm_clk_get(&pdev->dev, NULL);
+	if (IS_ERR(mmdc_ipg_clk))
+		mmdc_ipg_clk = NULL;
+
+	err = clk_prepare_enable(mmdc_ipg_clk);
+	if (err) {
+		dev_err(&pdev->dev, "Unable to enable mmdc ipg clock.\n");
+		return err;
+	}
 
 	mmdc_base = of_iomap(np, 0);
 	WARN_ON(!mmdc_base);

commit fa73444311956b5b1f14382ef0f6e32198c1c363
Author: Letu Ren <fantasquex@gmail.com>
Date:   Sun Jul 25 21:45:12 2021 +0800

    net/qla3xxx: fix schedule while atomic in ql_wait_for_drvr_lock and ql_adapter_reset
    
    [ Upstream commit 92766c4628ea349c8ddab0cd7bd0488f36e5c4ce ]
    
    When calling the 'ql_wait_for_drvr_lock' and 'ql_adapter_reset', the driver
    has already acquired the spin lock, so the driver should not call 'ssleep'
    in atomic context.
    
    This bug can be fixed by using 'mdelay' instead of 'ssleep'.
    
    Reported-by: Letu Ren <fantasquex@gmail.com>
    Signed-off-by: Letu Ren <fantasquex@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/qlogic/qla3xxx.c b/drivers/net/ethernet/qlogic/qla3xxx.c
index 2d71646640ac..f98e2f417c2e 100644
--- a/drivers/net/ethernet/qlogic/qla3xxx.c
+++ b/drivers/net/ethernet/qlogic/qla3xxx.c
@@ -155,7 +155,7 @@ static int ql_wait_for_drvr_lock(struct ql3_adapter *qdev)
 				      "driver lock acquired\n");
 			return 1;
 		}
-		ssleep(1);
+		mdelay(1000);
 	} while (++i < 10);
 
 	netdev_err(qdev->ndev, "Timed out waiting for driver lock...\n");
@@ -3292,7 +3292,7 @@ static int ql_adapter_reset(struct ql3_adapter *qdev)
 		if ((value & ISP_CONTROL_SR) == 0)
 			break;
 
-		ssleep(1);
+		mdelay(1000);
 	} while ((--max_wait_time));
 
 	/*
@@ -3328,7 +3328,7 @@ static int ql_adapter_reset(struct ql3_adapter *qdev)
 						   ispControlStatus);
 			if ((value & ISP_CONTROL_FSR) == 0)
 				break;
-			ssleep(1);
+			mdelay(1000);
 		} while ((--max_wait_time));
 	}
 	if (max_wait_time == 0)

commit 704e08f3475347666ebed4e018fad7277834f056
Author: Prarit Bhargava <prarit@redhat.com>
Date:   Tue Jan 5 10:16:27 2021 -0500

    alpha: Send stop IPI to send to online CPUs
    
    [ Upstream commit caace6ca4e06f09413fb8f8a63319594cfb7d47d ]
    
    This issue was noticed while debugging a shutdown issue where some
    secondary CPUs are not being shutdown correctly.  A fix for that [1] requires
    that secondary cpus be offlined using the cpu_online_mask so that the
    stop operation is a no-op if CPU HOTPLUG is disabled.  I, like the author in
    [1] looked at the architectures and found that alpha is one of two
    architectures that executes smp_send_stop() on all possible CPUs.
    
    On alpha, smp_send_stop() sends an IPI to all possible CPUs but only needs
    to send them to online CPUs.
    
    Send the stop IPI to only the online CPUs.
    
    [1] https://lkml.org/lkml/2020/1/10/250
    
    Signed-off-by: Prarit Bhargava <prarit@redhat.com>
    Cc: Richard Henderson <rth@twiddle.net>
    Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
    Signed-off-by: Matt Turner <mattst88@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/alpha/kernel/smp.c b/arch/alpha/kernel/smp.c
index d0dccae53ba9..8a89b9adb4fe 100644
--- a/arch/alpha/kernel/smp.c
+++ b/arch/alpha/kernel/smp.c
@@ -585,7 +585,7 @@ void
 smp_send_stop(void)
 {
 	cpumask_t to_whom;
-	cpumask_copy(&to_whom, cpu_possible_mask);
+	cpumask_copy(&to_whom, cpu_online_mask);
 	cpumask_clear_cpu(smp_processor_id(), &to_whom);
 #ifdef DEBUG_IPI_MSG
 	if (hard_smp_processor_id() != boot_cpu_id)

commit 4d7ee5d0a6a960f1790be3c9a0c71573405df63a
Author: Shreyansh Chouhan <chouhan.shreyansh630@gmail.com>
Date:   Fri Jul 9 20:59:29 2021 +0530

    reiserfs: check directory items on read from disk
    
    [ Upstream commit 13d257503c0930010ef9eed78b689cec417ab741 ]
    
    While verifying the leaf item that we read from the disk, reiserfs
    doesn't check the directory items, this could cause a crash when we
    read a directory item from the disk that has an invalid deh_location.
    
    This patch adds a check to the directory items read from the disk that
    does a bounds check on deh_location for the directory entries. Any
    directory entry header with a directory entry offset greater than the
    item length is considered invalid.
    
    Link: https://lore.kernel.org/r/20210709152929.766363-1-chouhan.shreyansh630@gmail.com
    Reported-by: syzbot+c31a48e6702ccb3d64c9@syzkaller.appspotmail.com
    Signed-off-by: Shreyansh Chouhan <chouhan.shreyansh630@gmail.com>
    Signed-off-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/reiserfs/stree.c b/fs/reiserfs/stree.c
index 5229038852ca..4ebad6781b0e 100644
--- a/fs/reiserfs/stree.c
+++ b/fs/reiserfs/stree.c
@@ -387,6 +387,24 @@ void pathrelse(struct treepath *search_path)
 	search_path->path_length = ILLEGAL_PATH_ELEMENT_OFFSET;
 }
 
+static int has_valid_deh_location(struct buffer_head *bh, struct item_head *ih)
+{
+	struct reiserfs_de_head *deh;
+	int i;
+
+	deh = B_I_DEH(bh, ih);
+	for (i = 0; i < ih_entry_count(ih); i++) {
+		if (deh_location(&deh[i]) > ih_item_len(ih)) {
+			reiserfs_warning(NULL, "reiserfs-5094",
+					 "directory entry location seems wrong %h",
+					 &deh[i]);
+			return 0;
+		}
+	}
+
+	return 1;
+}
+
 static int is_leaf(char *buf, int blocksize, struct buffer_head *bh)
 {
 	struct block_head *blkh;
@@ -454,11 +472,14 @@ static int is_leaf(char *buf, int blocksize, struct buffer_head *bh)
 					 "(second one): %h", ih);
 			return 0;
 		}
-		if (is_direntry_le_ih(ih) && (ih_item_len(ih) < (ih_entry_count(ih) * IH_SIZE))) {
-			reiserfs_warning(NULL, "reiserfs-5093",
-					 "item entry count seems wrong %h",
-					 ih);
-			return 0;
+		if (is_direntry_le_ih(ih)) {
+			if (ih_item_len(ih) < (ih_entry_count(ih) * IH_SIZE)) {
+				reiserfs_warning(NULL, "reiserfs-5093",
+						 "item entry count seems wrong %h",
+						 ih);
+				return 0;
+			}
+			return has_valid_deh_location(bh, ih);
 		}
 		prev_location = ih_location(ih);
 	}

commit df2f583b63637f9f882ba604cf23e0336de82220
Author: Yu Kuai <yukuai3@huawei.com>
Date:   Fri Jul 2 12:07:43 2021 +0800

    reiserfs: add check for root_inode in reiserfs_fill_super
    
    [ Upstream commit 2acf15b94d5b8ea8392c4b6753a6ffac3135cd78 ]
    
    Our syzcaller report a NULL pointer dereference:
    
    BUG: kernel NULL pointer dereference, address: 0000000000000000
    PGD 116e95067 P4D 116e95067 PUD 1080b5067 PMD 0
    Oops: 0010 [#1] SMP KASAN
    CPU: 7 PID: 592 Comm: a.out Not tainted 5.13.0-next-20210629-dirty #67
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS ?-20190727_073836-buildvm-p4
    RIP: 0010:0x0
    Code: Unable to access opcode bytes at RIP 0xffffffffffffffd6.
    RSP: 0018:ffff888114e779b8 EFLAGS: 00010246
    RAX: 0000000000000000 RBX: 1ffff110229cef39 RCX: ffffffffaa67e1aa
    RDX: 0000000000000000 RSI: ffff88810a58ee00 RDI: ffff8881233180b0
    RBP: ffffffffac38e9c0 R08: ffffffffaa67e17e R09: 0000000000000001
    R10: ffffffffb91c5557 R11: fffffbfff7238aaa R12: ffff88810a58ee00
    R13: ffff888114e77aa0 R14: 0000000000000000 R15: ffff8881233180b0
    FS:  00007f946163c480(0000) GS:ffff88839f1c0000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: ffffffffffffffd6 CR3: 00000001099c1000 CR4: 00000000000006e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
     __lookup_slow+0x116/0x2d0
     ? page_put_link+0x120/0x120
     ? __d_lookup+0xfc/0x320
     ? d_lookup+0x49/0x90
     lookup_one_len+0x13c/0x170
     ? __lookup_slow+0x2d0/0x2d0
     ? reiserfs_schedule_old_flush+0x31/0x130
     reiserfs_lookup_privroot+0x64/0x150
     reiserfs_fill_super+0x158c/0x1b90
     ? finish_unfinished+0xb10/0xb10
     ? bprintf+0xe0/0xe0
     ? __mutex_lock_slowpath+0x30/0x30
     ? __kasan_check_write+0x20/0x30
     ? up_write+0x51/0xb0
     ? set_blocksize+0x9f/0x1f0
     mount_bdev+0x27c/0x2d0
     ? finish_unfinished+0xb10/0xb10
     ? reiserfs_kill_sb+0x120/0x120
     get_super_block+0x19/0x30
     legacy_get_tree+0x76/0xf0
     vfs_get_tree+0x49/0x160
     ? capable+0x1d/0x30
     path_mount+0xacc/0x1380
     ? putname+0x97/0xd0
     ? finish_automount+0x450/0x450
     ? kmem_cache_free+0xf8/0x5a0
     ? putname+0x97/0xd0
     do_mount+0xe2/0x110
     ? path_mount+0x1380/0x1380
     ? copy_mount_options+0x69/0x140
     __x64_sys_mount+0xf0/0x190
     do_syscall_64+0x35/0x80
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    This is because 'root_inode' is initialized with wrong mode, and
    it's i_op is set to 'reiserfs_special_inode_operations'. Thus add
    check for 'root_inode' to fix the problem.
    
    Link: https://lore.kernel.org/r/20210702040743.1918552-1-yukuai3@huawei.com
    Signed-off-by: Yu Kuai <yukuai3@huawei.com>
    Signed-off-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c
index ec5716dd58c2..831a542c22c6 100644
--- a/fs/reiserfs/super.c
+++ b/fs/reiserfs/super.c
@@ -2085,6 +2085,14 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent)
 		unlock_new_inode(root_inode);
 	}
 
+	if (!S_ISDIR(root_inode->i_mode) || !inode_get_bytes(root_inode) ||
+	    !root_inode->i_size) {
+		SWARN(silent, s, "", "corrupt root inode, run fsck");
+		iput(root_inode);
+		errval = -EUCLEAN;
+		goto error;
+	}
+
 	s->s_root = d_make_root(root_inode);
 	if (!s->s_root)
 		goto error;

commit 5d4f303010b717a05ec560dc1228918116f58637
Author: Christoph Hellwig <hch@lst.de>
Date:   Fri Jul 9 15:02:37 2021 +0200

    libata: fix ata_pio_sector for CONFIG_HIGHMEM
    
    [ Upstream commit ecef6a9effe49e8e2635c839020b9833b71e934c ]
    
    Data transfers are not required to be block aligned in memory, so they
    span two pages.  Fix this by splitting the call to >sff_data_xfer into
    two for that case.
    
    This has been broken since the initial libata import before the damn
    of git, but was uncovered by the legacy ide driver removal.
    
    Reported-by: kernel test robot <oliver.sang@intel.com>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Link: https://lore.kernel.org/r/20210709130237.3730959-1-hch@lst.de
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index 7484ffdabd54..ec62d26c32a9 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -657,6 +657,20 @@ unsigned int ata_sff_data_xfer32(struct ata_queued_cmd *qc, unsigned char *buf,
 }
 EXPORT_SYMBOL_GPL(ata_sff_data_xfer32);
 
+static void ata_pio_xfer(struct ata_queued_cmd *qc, struct page *page,
+		unsigned int offset, size_t xfer_size)
+{
+	bool do_write = (qc->tf.flags & ATA_TFLAG_WRITE);
+	unsigned char *buf;
+
+	buf = kmap_atomic(page);
+	qc->ap->ops->sff_data_xfer(qc, buf + offset, xfer_size, do_write);
+	kunmap_atomic(buf);
+
+	if (!do_write && !PageSlab(page))
+		flush_dcache_page(page);
+}
+
 /**
  *	ata_pio_sector - Transfer a sector of data.
  *	@qc: Command on going
@@ -668,11 +682,9 @@ EXPORT_SYMBOL_GPL(ata_sff_data_xfer32);
  */
 static void ata_pio_sector(struct ata_queued_cmd *qc)
 {
-	int do_write = (qc->tf.flags & ATA_TFLAG_WRITE);
 	struct ata_port *ap = qc->ap;
 	struct page *page;
 	unsigned int offset;
-	unsigned char *buf;
 
 	if (!qc->cursg) {
 		qc->curbytes = qc->nbytes;
@@ -690,13 +702,20 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)
 
 	DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");
 
-	/* do the actual data transfer */
-	buf = kmap_atomic(page);
-	ap->ops->sff_data_xfer(qc, buf + offset, qc->sect_size, do_write);
-	kunmap_atomic(buf);
+	/*
+	 * Split the transfer when it splits a page boundary.  Note that the
+	 * split still has to be dword aligned like all ATA data transfers.
+	 */
+	WARN_ON_ONCE(offset % 4);
+	if (offset + qc->sect_size > PAGE_SIZE) {
+		unsigned int split_len = PAGE_SIZE - offset;
 
-	if (!do_write && !PageSlab(page))
-		flush_dcache_page(page);
+		ata_pio_xfer(qc, page, offset, split_len);
+		ata_pio_xfer(qc, nth_page(page, 1), 0,
+			     qc->sect_size - split_len);
+	} else {
+		ata_pio_xfer(qc, page, offset, qc->sect_size);
+	}
 
 	qc->curbytes += qc->sect_size;
 	qc->cursg_ofs += qc->sect_size;

commit 8d0f60617bc108e866c26fbd1a9f11cc5f3c3014
Author: Reinhard Speyerer <rspmn@arcor.de>
Date:   Wed Jun 12 19:02:46 2019 +0200

    qmi_wwan: add network device usage statistics for qmimux devices
    
    commit 44f82312fe9113bab6642f4d0eab6b1b7902b6e1 upstream.
    
    Add proper network device usage statistics for qmimux devices
    instead of reporting all-zero values for them.
    
    Fixes: c6adf77953bc ("net: usb: qmi_wwan: add qmap mux protocol support")
    Cc: Daniele Palmas <dnlplm@gmail.com>
    Signed-off-by: Reinhard Speyerer <rspmn@arcor.de>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
index d08e1de26030..54b37a30df18 100644
--- a/drivers/net/usb/qmi_wwan.c
+++ b/drivers/net/usb/qmi_wwan.c
@@ -22,6 +22,7 @@
 #include <linux/usb/cdc.h>
 #include <linux/usb/usbnet.h>
 #include <linux/usb/cdc-wdm.h>
+#include <linux/u64_stats_sync.h>
 
 /* This driver supports wwan (3G/LTE/?) devices using a vendor
  * specific management protocol called Qualcomm MSM Interface (QMI) -
@@ -74,6 +75,7 @@ struct qmimux_hdr {
 struct qmimux_priv {
 	struct net_device *real_dev;
 	u8 mux_id;
+	struct pcpu_sw_netstats __percpu *stats64;
 };
 
 static int qmimux_open(struct net_device *dev)
@@ -100,19 +102,65 @@ static netdev_tx_t qmimux_start_xmit(struct sk_buff *skb, struct net_device *dev
 	struct qmimux_priv *priv = netdev_priv(dev);
 	unsigned int len = skb->len;
 	struct qmimux_hdr *hdr;
+	netdev_tx_t ret;
 
 	hdr = skb_push(skb, sizeof(struct qmimux_hdr));
 	hdr->pad = 0;
 	hdr->mux_id = priv->mux_id;
 	hdr->pkt_len = cpu_to_be16(len);
 	skb->dev = priv->real_dev;
-	return dev_queue_xmit(skb);
+	ret = dev_queue_xmit(skb);
+
+	if (likely(ret == NET_XMIT_SUCCESS || ret == NET_XMIT_CN)) {
+		struct pcpu_sw_netstats *stats64 = this_cpu_ptr(priv->stats64);
+
+		u64_stats_update_begin(&stats64->syncp);
+		stats64->tx_packets++;
+		stats64->tx_bytes += len;
+		u64_stats_update_end(&stats64->syncp);
+	} else {
+		dev->stats.tx_dropped++;
+	}
+
+	return ret;
+}
+
+static void qmimux_get_stats64(struct net_device *net,
+			       struct rtnl_link_stats64 *stats)
+{
+	struct qmimux_priv *priv = netdev_priv(net);
+	unsigned int start;
+	int cpu;
+
+	netdev_stats_to_stats64(stats, &net->stats);
+
+	for_each_possible_cpu(cpu) {
+		struct pcpu_sw_netstats *stats64;
+		u64 rx_packets, rx_bytes;
+		u64 tx_packets, tx_bytes;
+
+		stats64 = per_cpu_ptr(priv->stats64, cpu);
+
+		do {
+			start = u64_stats_fetch_begin_irq(&stats64->syncp);
+			rx_packets = stats64->rx_packets;
+			rx_bytes = stats64->rx_bytes;
+			tx_packets = stats64->tx_packets;
+			tx_bytes = stats64->tx_bytes;
+		} while (u64_stats_fetch_retry_irq(&stats64->syncp, start));
+
+		stats->rx_packets += rx_packets;
+		stats->rx_bytes += rx_bytes;
+		stats->tx_packets += tx_packets;
+		stats->tx_bytes += tx_bytes;
+	}
 }
 
 static const struct net_device_ops qmimux_netdev_ops = {
-	.ndo_open       = qmimux_open,
-	.ndo_stop       = qmimux_stop,
-	.ndo_start_xmit = qmimux_start_xmit,
+	.ndo_open        = qmimux_open,
+	.ndo_stop        = qmimux_stop,
+	.ndo_start_xmit  = qmimux_start_xmit,
+	.ndo_get_stats64 = qmimux_get_stats64,
 };
 
 static void qmimux_setup(struct net_device *dev)
@@ -197,8 +245,19 @@ static int qmimux_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
 		}
 
 		skb_put_data(skbn, skb->data + offset + qmimux_hdr_sz, pkt_len);
-		if (netif_rx(skbn) != NET_RX_SUCCESS)
+		if (netif_rx(skbn) != NET_RX_SUCCESS) {
+			net->stats.rx_errors++;
 			return 0;
+		} else {
+			struct pcpu_sw_netstats *stats64;
+			struct qmimux_priv *priv = netdev_priv(net);
+
+			stats64 = this_cpu_ptr(priv->stats64);
+			u64_stats_update_begin(&stats64->syncp);
+			stats64->rx_packets++;
+			stats64->rx_bytes += pkt_len;
+			u64_stats_update_end(&stats64->syncp);
+		}
 
 skip:
 		offset += len + qmimux_hdr_sz;
@@ -222,6 +281,12 @@ static int qmimux_register_device(struct net_device *real_dev, u8 mux_id)
 	priv->mux_id = mux_id;
 	priv->real_dev = real_dev;
 
+	priv->stats64 = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
+	if (!priv->stats64) {
+		err = -ENOBUFS;
+		goto out_free_newdev;
+	}
+
 	err = register_netdevice(new_dev);
 	if (err < 0)
 		goto out_free_newdev;
@@ -252,6 +317,7 @@ static void qmimux_unregister_device(struct net_device *dev,
 	struct qmimux_priv *priv = netdev_priv(dev);
 	struct net_device *real_dev = priv->real_dev;
 
+	free_percpu(priv->stats64);
 	netdev_upper_dev_unlink(real_dev, dev);
 	unregister_netdevice_queue(dev, head);
 

commit 344dd5f1a330eb4baddbb81fa28e89ba97dbeaa1
Author: Like Xu <likexu@tencent.com>
Date:   Mon Aug 2 15:08:50 2021 +0800

    perf/x86/amd: Don't touch the AMD64_EVENTSEL_HOSTONLY bit inside the guest
    
    commit df51fe7ea1c1c2c3bfdb81279712fdd2e4ea6c27 upstream.
    
    If we use "perf record" in an AMD Milan guest, dmesg reports a #GP
    warning from an unchecked MSR access error on MSR_F15H_PERF_CTLx:
    
      [] unchecked MSR access error: WRMSR to 0xc0010200 (tried to write 0x0000020000110076) at rIP: 0xffffffff8106ddb4 (native_write_msr+0x4/0x20)
      [] Call Trace:
      []  amd_pmu_disable_event+0x22/0x90
      []  x86_pmu_stop+0x4c/0xa0
      []  x86_pmu_del+0x3a/0x140
    
    The AMD64_EVENTSEL_HOSTONLY bit is defined and used on the host,
    while the guest perf driver should avoid such use.
    
    Fixes: 1018faa6cf23 ("perf/x86/kvm: Fix Host-Only/Guest-Only counting with SVM disabled")
    Signed-off-by: Like Xu <likexu@tencent.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Liam Merwick <liam.merwick@oracle.com>
    Tested-by: Kim Phillips <kim.phillips@amd.com>
    Tested-by: Liam Merwick <liam.merwick@oracle.com>
    Link: https://lkml.kernel.org/r/20210802070850.35295-1-likexu@tencent.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h
index 05659c7b43d4..d2e87dbc55c5 100644
--- a/arch/x86/events/perf_event.h
+++ b/arch/x86/events/perf_event.h
@@ -799,9 +799,10 @@ void x86_pmu_stop(struct perf_event *event, int flags);
 
 static inline void x86_pmu_disable_event(struct perf_event *event)
 {
+	u64 disable_mask = __this_cpu_read(cpu_hw_events.perf_ctr_virt_mask);
 	struct hw_perf_event *hwc = &event->hw;
 
-	wrmsrl(hwc->config_base, hwc->config);
+	wrmsrl(hwc->config_base, hwc->config & ~disable_mask);
 }
 
 void x86_pmu_enable_event(struct perf_event *event);

commit 683b47d0ebb10ba0d272604b09686e023d10d40c
Author: Dongliang Mu <mudongliangabcd@gmail.com>
Date:   Tue Jul 20 18:01:16 2021 +0800

    spi: meson-spicc: fix memory leak in meson_spicc_remove
    
    commit 8311ee2164c5cd1b63a601ea366f540eae89f10e upstream.
    
    In meson_spicc_probe, the error handling code needs to clean up master
    by calling spi_master_put, but the remove function does not have this
    function call. This will lead to memory leak of spicc->master.
    
    Reported-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Fixes: 454fa271bc4e("spi: Add Meson SPICC driver")
    Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Link: https://lore.kernel.org/r/20210720100116.1438974-1-mudongliangabcd@gmail.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/spi/spi-meson-spicc.c b/drivers/spi/spi-meson-spicc.c
index 7fe4488ace57..419756ebf2c0 100644
--- a/drivers/spi/spi-meson-spicc.c
+++ b/drivers/spi/spi-meson-spicc.c
@@ -599,6 +599,8 @@ static int meson_spicc_remove(struct platform_device *pdev)
 
 	clk_disable_unprepare(spicc->core);
 
+	spi_master_put(spicc->master);
+
 	return 0;
 }
 

commit 4af3486a7f8150d141a1f9390e63e169b2b64771
Author: Sean Christopherson <seanjc@google.com>
Date:   Wed Aug 4 14:46:09 2021 -0700

    KVM: x86/mmu: Fix per-cpu counter corruption on 32-bit builds
    
    commit d5aaad6f83420efb8357ac8e11c868708b22d0a9 upstream.
    
    Take a signed 'long' instead of an 'unsigned long' for the number of
    pages to add/subtract to the total number of pages used by the MMU.  This
    fixes a zero-extension bug on 32-bit kernels that effectively corrupts
    the per-cpu counter used by the shrinker.
    
    Per-cpu counters take a signed 64-bit value on both 32-bit and 64-bit
    kernels, whereas kvm_mod_used_mmu_pages() takes an unsigned long and thus
    an unsigned 32-bit value on 32-bit kernels.  As a result, the value used
    to adjust the per-cpu counter is zero-extended (unsigned -> signed), not
    sign-extended (signed -> signed), and so KVM's intended -1 gets morphed to
    4294967295 and effectively corrupts the counter.
    
    This was found by a staggering amount of sheer dumb luck when running
    kvm-unit-tests on a 32-bit KVM build.  The shrinker just happened to kick
    in while running tests and do_shrink_slab() logged an error about trying
    to free a negative number of objects.  The truly lucky part is that the
    kernel just happened to be a slightly stale build, as the shrinker no
    longer yells about negative objects as of commit 18bb473e5031 ("mm:
    vmscan: shrink deferred objects proportional to priority").
    
     vmscan: shrink_slab: mmu_shrink_scan+0x0/0x210 [kvm] negative objects to delete nr=-858993460
    
    Fixes: bc8a3d8925a8 ("kvm: mmu: Fix overflow on kvm mmu page limit calculation")
    Cc: stable@vger.kernel.org
    Cc: Ben Gardon <bgardon@google.com>
    Signed-off-by: Sean Christopherson <seanjc@google.com>
    Message-Id: <20210804214609.1096003-1-seanjc@google.com>
    Reviewed-by: Jim Mattson <jmattson@google.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index 5faa49a95ac9..762baba4ecd5 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -2042,7 +2042,7 @@ static int is_empty_shadow_page(u64 *spt)
  * aggregate version in order to make the slab shrinker
  * faster
  */
-static inline void kvm_mod_used_mmu_pages(struct kvm *kvm, unsigned long nr)
+static inline void kvm_mod_used_mmu_pages(struct kvm *kvm, long nr)
 {
 	kvm->arch.n_used_mmu_pages += nr;
 	percpu_counter_add(&kvm_total_used_mmu_pages, nr);

commit 360928c500d1c004e2e01c432ba62dd800f976c5
Author: Paolo Bonzini <pbonzini@redhat.com>
Date:   Wed Jul 14 17:37:49 2021 -0400

    KVM: x86: accept userspace interrupt only if no event is injected
    
    commit fa7a549d321a4189677b0cea86e58d9db7977f7b upstream.
    
    Once an exception has been injected, any side effects related to
    the exception (such as setting CR2 or DR6) have been taked place.
    Therefore, once KVM sets the VM-entry interruption information
    field or the AMD EVENTINJ field, the next VM-entry must deliver that
    exception.
    
    Pending interrupts are processed after injected exceptions, so
    in theory it would not be a problem to use KVM_INTERRUPT when
    an injected exception is present.  However, DOSEMU is using
    run->ready_for_interrupt_injection to detect interrupt windows
    and then using KVM_SET_SREGS/KVM_SET_REGS to inject the
    interrupt manually.  For this to work, the interrupt window
    must be delayed after the completion of the previous event
    injection.
    
    Cc: stable@vger.kernel.org
    Reported-by: Stas Sergeev <stsp2@yandex.ru>
    Tested-by: Stas Sergeev <stsp2@yandex.ru>
    Fixes: 71cc849b7093 ("KVM: x86: Fix split-irqchip vs interrupt injection window request")
    Reviewed-by: Sean Christopherson <seanjc@google.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 9cfc669b4a24..f913127e942a 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -3366,8 +3366,17 @@ static int kvm_cpu_accept_dm_intr(struct kvm_vcpu *vcpu)
 
 static int kvm_vcpu_ready_for_interrupt_injection(struct kvm_vcpu *vcpu)
 {
-	return kvm_arch_interrupt_allowed(vcpu) &&
-		kvm_cpu_accept_dm_intr(vcpu);
+	/*
+	 * Do not cause an interrupt window exit if an exception
+	 * is pending or an event needs reinjection; userspace
+	 * might want to inject the interrupt manually using KVM_SET_REGS
+	 * or KVM_SET_SREGS.  For that to work, we must be at an
+	 * instruction boundary and with no events half-injected.
+	 */
+	return (kvm_arch_interrupt_allowed(vcpu) &&
+		kvm_cpu_accept_dm_intr(vcpu) &&
+		!kvm_event_needs_reinjection(vcpu) &&
+		!vcpu->arch.exception.pending);
 }
 
 static int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu,

commit 0c83af3b16d201733a0881296b724b90b6ba56b7
Author: Zheyu Ma <zheyuma97@gmail.com>
Date:   Tue Jun 22 07:11:31 2021 +0000

    pcmcia: i82092: fix a null pointer dereference bug
    
    commit e39cdacf2f664b09029e7c1eb354c91a20c367af upstream.
    
    During the driver loading process, the 'dev' field was not assigned, but
    the 'dev' field was referenced in the subsequent 'i82092aa_set_mem_map'
    function.
    
    Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
    CC: <stable@vger.kernel.org>
    [linux@dominikbrodowski.net: shorten commit message, add Cc to stable]
    Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pcmcia/i82092.c b/drivers/pcmcia/i82092.c
index aae7e6df99cd..ba13e3c3d6b8 100644
--- a/drivers/pcmcia/i82092.c
+++ b/drivers/pcmcia/i82092.c
@@ -105,6 +105,7 @@ static int i82092aa_pci_probe(struct pci_dev *dev, const struct pci_device_id *i
 	for (i = 0;i<socket_count;i++) {
 		sockets[i].card_state = 1; /* 1 = present but empty */
 		sockets[i].io_base = pci_resource_start(dev, 0);
+		sockets[i].dev = dev;
 		sockets[i].socket.features |= SS_CAP_PCCARD;
 		sockets[i].socket.map_size = 0x1000;
 		sockets[i].socket.irq_mask = 0;

commit 0d631eeedf40ab717f8472fb5d743a16416e5218
Author: Maciej W. Rozycki <macro@orcam.me.uk>
Date:   Sat Jun 26 06:11:13 2021 +0200

    MIPS: Malta: Do not byte-swap accesses to the CBUS UART
    
    commit 9a936d6c3d3d6c33ecbadf72dccdb567b5cd3c72 upstream.
    
    Correct big-endian accesses to the CBUS UART, a Malta on-board discrete
    TI16C550C part wired directly to the system controller's device bus, and
    do not use byte swapping with the 32-bit accesses to the device.
    
    The CBUS is used for devices such as the boot flash memory needed early
    on in system bootstrap even before PCI has been initialised.  Therefore
    it uses the system controller's device bus, which follows the endianness
    set with the CPU, which means no byte-swapping is ever required for data
    accesses to CBUS, unlike with PCI.
    
    The CBUS UART uses the UPIO_MEM32 access method, that is the `readl' and
    `writel' MMIO accessors, which on the MIPS platform imply byte-swapping
    with PCI systems.  Consequently the wrong byte lane is accessed with the
    big-endian configuration and the UART is not correctly accessed.
    
    As it happens the UPIO_MEM32BE access method makes use of the `ioread32'
    and `iowrite32' MMIO accessors, which still use `readl' and `writel'
    respectively, however they byte-swap data passed, effectively cancelling
    swapping done with the accessors themselves and making it suitable for
    the CBUS UART.
    
    Make the CBUS UART switch between UPIO_MEM32 and UPIO_MEM32BE then,
    based on the endianness selected.  With this change in place the device
    is correctly recognised with big-endian Malta at boot, along with the
    Super I/O devices behind PCI:
    
    Serial: 8250/16550 driver, 5 ports, IRQ sharing enabled
    printk: console [ttyS0] disabled
    serial8250.0: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A
    printk: console [ttyS0] enabled
    printk: bootconsole [uart8250] disabled
    serial8250.0: ttyS1 at I/O 0x2f8 (irq = 3, base_baud = 115200) is a 16550A
    serial8250.0: ttyS2 at MMIO 0x1f000900 (irq = 20, base_baud = 230400) is a 16550A
    
    Fixes: e7c4782f92fc ("[MIPS] Put an end to <asm/serial.h>'s long and annyoing existence")
    Cc: stable@vger.kernel.org # v2.6.23+
    Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
    Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk>
    Link: https://lore.kernel.org/r/alpine.DEB.2.21.2106260524430.37803@angie.orcam.me.uk
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/mips/mti-malta/malta-platform.c b/arch/mips/mti-malta/malta-platform.c
index 11e9527c6e44..62ffac500eb5 100644
--- a/arch/mips/mti-malta/malta-platform.c
+++ b/arch/mips/mti-malta/malta-platform.c
@@ -47,7 +47,8 @@ static struct plat_serial8250_port uart8250_data[] = {
 		.mapbase	= 0x1f000900,	/* The CBUS UART */
 		.irq		= MIPS_CPU_IRQ_BASE + MIPSCPU_INT_MB2,
 		.uartclk	= 3686400,	/* Twice the usual clk! */
-		.iotype		= UPIO_MEM32,
+		.iotype		= IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) ?
+				  UPIO_MEM32BE : UPIO_MEM32,
 		.flags		= CBUS_UART_FLAGS,
 		.regshift	= 3,
 	},

commit 2c39c32f92084736bc871c1ef096602eb1cc7b5b
Author: Maciej W. Rozycki <macro@orcam.me.uk>
Date:   Sat Jun 26 06:11:05 2021 +0200

    serial: 8250: Mask out floating 16/32-bit bus bits
    
    commit e5227c51090e165db4b48dcaa300605bfced7014 upstream.
    
    Make sure only actual 8 bits of the IIR register are used in determining
    the port type in `autoconfig'.
    
    The `serial_in' port accessor returns the `unsigned int' type, meaning
    that with UPIO_AU, UPIO_MEM16, UPIO_MEM32, and UPIO_MEM32BE access types
    more than 8 bits of data are returned, of which the high order bits will
    often come from bus lines that are left floating in the data phase.  For
    example with the MIPS Malta board's CBUS UART, where the registers are
    aligned on 8-byte boundaries and which uses 32-bit accesses, data as
    follows is returned:
    
    YAMON> dump -32 0xbf000900 0x40
    
    BF000900: 1F000942 1F000942 1F000900 1F000900  ...B...B........
    BF000910: 1F000901 1F000901 1F000900 1F000900  ................
    BF000920: 1F000900 1F000900 1F000960 1F000960  ...........`...`
    BF000930: 1F000900 1F000900 1F0009FF 1F0009FF  ................
    
    YAMON>
    
    Evidently high-order 24 bits return values previously driven in the
    address phase (the 3 highest order address bits used with the command
    above are masked out in the simple virtual address mapping used here and
    come out at zeros on the external bus), a common scenario with bus lines
    left floating, due to bus capacitance.
    
    Consequently when the value of IIR, mapped at 0x1f000910, is retrieved
    in `autoconfig', it comes out at 0x1f0009c1 and when it is right-shifted
    by 6 and then assigned to 8-bit `scratch' variable, the value calculated
    is 0x27, not one of 0, 1, 2, 3 expected in port type determination.
    
    Fix the issue then, by assigning the value returned from `serial_in' to
    `scratch' first, which masks out 24 high-order bits retrieved, and only
    then right-shift the resulting 8-bit data quantity, producing the value
    of 3 in this case, as expected.  Fix the same issue in `serial_dl_read'.
    
    The problem first appeared with Linux 2.6.9-rc3 which predates our repo
    history, but the origin could be identified with the old MIPS/Linux repo
    also at: <git://git.kernel.org/pub/scm/linux/kernel/git/ralf/linux.git>
    as commit e0d2356c0777 ("Merge with Linux 2.6.9-rc3."), where code in
    `serial_in' was updated with this case:
    
    +       case UPIO_MEM32:
    +               return readl(up->port.membase + offset);
    +
    
    which made it produce results outside the unsigned 8-bit range for the
    first time, though obviously it is system dependent what actual values
    appear in the high order bits retrieved and it may well have been zeros
    in the relevant positions with the system the change originally was
    intended for.  It is at that point that code in `autoconf' should have
    been updated accordingly, but clearly it was overlooked.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: stable@vger.kernel.org # v2.6.12+
    Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
    Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk>
    Link: https://lore.kernel.org/r/alpine.DEB.2.21.2106260516220.37803@angie.orcam.me.uk
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c
index 56693dfe0f5b..68f71298c11b 100644
--- a/drivers/tty/serial/8250/8250_port.c
+++ b/drivers/tty/serial/8250/8250_port.c
@@ -313,7 +313,11 @@ static const struct serial8250_config uart_config[] = {
 /* Uart divisor latch read */
 static int default_serial_dl_read(struct uart_8250_port *up)
 {
-	return serial_in(up, UART_DLL) | serial_in(up, UART_DLM) << 8;
+	/* Assign these in pieces to truncate any bits above 7.  */
+	unsigned char dll = serial_in(up, UART_DLL);
+	unsigned char dlm = serial_in(up, UART_DLM);
+
+	return dll | dlm << 8;
 }
 
 /* Uart divisor latch write */
@@ -1301,9 +1305,11 @@ static void autoconfig(struct uart_8250_port *up)
 	serial_out(up, UART_LCR, 0);
 
 	serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
-	scratch = serial_in(up, UART_IIR) >> 6;
 
-	switch (scratch) {
+	/* Assign this as it is to truncate any bits above 7.  */
+	scratch = serial_in(up, UART_IIR);
+
+	switch (scratch >> 6) {
 	case 0:
 		autoconfig_8250(up);
 		break;

commit bc1954aa8a7e195ebd686a77e81c11863ce8edbf
Author: Theodore Ts'o <tytso@mit.edu>
Date:   Wed Aug 4 14:23:55 2021 -0400

    ext4: fix potential htree corruption when growing large_dir directories
    
    commit 877ba3f729fd3d8ef0e29bc2a55e57cfa54b2e43 upstream.
    
    Commit b5776e7524af ("ext4: fix potential htree index checksum
    corruption) removed a required restart when multiple levels of index
    nodes need to be split.  Fix this to avoid directory htree corruptions
    when using the large_dir feature.
    
    Cc: stable@kernel.org # v5.11
    Cc: ?лагода?енко ????м <artem.blagodarenko@gmail.com>
    Fixes: b5776e7524af ("ext4: fix potential htree index checksum corruption)
    Reported-by: Denis <denis@voxelsoft.com>
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index 358f6378882f..797fe41d071f 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -2317,7 +2317,7 @@ static int ext4_dx_add_entry(handle_t *handle, struct ext4_filename *fname,
 				goto journal_error;
 			err = ext4_handle_dirty_dx_node(handle, dir,
 							frame->bh);
-			if (err)
+			if (restart || err)
 				goto journal_error;
 		} else {
 			struct dx_root *dxroot;

commit 76ccb26c5312760113b2b3ef6de307474e8d4b45
Author: Alex Xu (Hello71) <alex_y_xu@yahoo.ca>
Date:   Thu Aug 5 10:40:47 2021 -0400

    pipe: increase minimum default pipe size to 2 pages
    
    commit 46c4c9d1beb7f5b4cec4dd90e7728720583ee348 upstream.
    
    This program always prints 4096 and hangs before the patch, and always
    prints 8192 and exits successfully after:
    
      int main()
      {
          int pipefd[2];
          for (int i = 0; i < 1025; i++)
              if (pipe(pipefd) == -1)
                  return 1;
          size_t bufsz = fcntl(pipefd[1], F_GETPIPE_SZ);
          printf("%zd\n", bufsz);
          char *buf = calloc(bufsz, 1);
          write(pipefd[1], buf, bufsz);
          read(pipefd[0], buf, bufsz-1);
          write(pipefd[1], buf, 1);
      }
    
    Note that you may need to increase your RLIMIT_NOFILE before running the
    program.
    
    Fixes: 759c01142a ("pipe: limit the per-user amount of pages allocated in pipes")
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/lkml/1628086770.5rn8p04n6j.none@localhost/
    Link: https://lore.kernel.org/lkml/1628127094.lxxn016tj7.none@localhost/
    Signed-off-by: Alex Xu (Hello71) <alex_y_xu@yahoo.ca>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/pipe.c b/fs/pipe.c
index 2a297bce381f..1489257a6c95 100644
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -29,6 +29,21 @@
 
 #include "internal.h"
 
+/*
+ * New pipe buffers will be restricted to this size while the user is exceeding
+ * their pipe buffer quota. The general pipe use case needs at least two
+ * buffers: one for data yet to be read, and one for new data. If this is less
+ * than two, then a write to a non-empty pipe may block even if the pipe is not
+ * full. This can occur with GNU make jobserver or similar uses of pipes as
+ * semaphores: multiple processes may be waiting to write tokens back to the
+ * pipe before reading tokens: https://lore.kernel.org/lkml/1628086770.5rn8p04n6j.none@localhost/.
+ *
+ * Users can reduce their pipe buffers with F_SETPIPE_SZ below this at their
+ * own risk, namely: pipe writes to non-full pipes may block until the pipe is
+ * emptied.
+ */
+#define PIPE_MIN_DEF_BUFFERS 2
+
 /*
  * The max size that a non-root user is allowed to grow the pipe. Can
  * be set by root in /proc/sys/fs/pipe-max-size
@@ -654,8 +669,8 @@ struct pipe_inode_info *alloc_pipe_info(void)
 	user_bufs = account_pipe_buffers(user, 0, pipe_bufs);
 
 	if (too_many_pipe_buffers_soft(user_bufs) && is_unprivileged_user()) {
-		user_bufs = account_pipe_buffers(user, pipe_bufs, 1);
-		pipe_bufs = 1;
+		user_bufs = account_pipe_buffers(user, pipe_bufs, PIPE_MIN_DEF_BUFFERS);
+		pipe_bufs = PIPE_MIN_DEF_BUFFERS;
 	}
 
 	if (too_many_pipe_buffers_hard(user_bufs) && is_unprivileged_user())

commit 51f990c70a320cd51317ba21be1150bc40a96d91
Author: Johan Hovold <johan@kernel.org>
Date:   Wed Jun 23 10:45:21 2021 +0200

    media: rtl28xxu: fix zero-length control request
    
    commit 76f22c93b209c811bd489950f17f8839adb31901 upstream.
    
    The direction of the pipe argument must match the request-type direction
    bit or control requests may fail depending on the host-controller-driver
    implementation.
    
    Control transfers without a data stage are treated as OUT requests by
    the USB stack and should be using usb_sndctrlpipe(). Failing to do so
    will now trigger a warning.
    
    The driver uses a zero-length i2c-read request for type detection so
    update the control-request code to use usb_sndctrlpipe() in this case.
    
    Note that actually trying to read the i2c register in question does not
    work as the register might not exist (e.g. depending on the demodulator)
    as reported by Eero Lehtinen <debiangamer2@gmail.com>.
    
    Reported-by: syzbot+faf11bbadc5a372564da@syzkaller.appspotmail.com
    Reported-by: Eero Lehtinen <debiangamer2@gmail.com>
    Tested-by: Eero Lehtinen <debiangamer2@gmail.com>
    Fixes: d0f232e823af ("[media] rtl28xxu: add heuristic to detect chip type")
    Cc: stable@vger.kernel.org      # 4.0
    Cc: Antti Palosaari <crope@iki.fi>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Sean Young <sean@mess.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
index a970224a94bd..857ef9edbc12 100644
--- a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
+++ b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
@@ -50,7 +50,16 @@ static int rtl28xxu_ctrl_msg(struct dvb_usb_device *d, struct rtl28xxu_req *req)
 	} else {
 		/* read */
 		requesttype = (USB_TYPE_VENDOR | USB_DIR_IN);
-		pipe = usb_rcvctrlpipe(d->udev, 0);
+
+		/*
+		 * Zero-length transfers must use usb_sndctrlpipe() and
+		 * rtl28xxu_identify_state() uses a zero-length i2c read
+		 * command to determine the chip type.
+		 */
+		if (req->size)
+			pipe = usb_rcvctrlpipe(d->udev, 0);
+		else
+			pipe = usb_sndctrlpipe(d->udev, 0);
 	}
 
 	ret = usb_control_msg(d->udev, pipe, 0, requesttype, req->value,

commit ef757e5b3bf2ddfeed744353ad59a0b63a8370c6
Author: Xiangyang Zhang <xyz.sun.ok@gmail.com>
Date:   Mon Jun 28 23:22:39 2021 +0800

    staging: rtl8723bs: Fix a resource leak in sd_int_dpc
    
    commit 990e4ad3ddcb72216caeddd6e62c5f45a21e8121 upstream.
    
    The "c2h_evt" variable is not freed when function call
    "c2h_evt_read_88xx" failed
    
    Fixes: 554c0a3abf21 ("staging: Add rtl8723bs sdio wifi driver")
    Reviewed-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Xiangyang Zhang <xyz.sun.ok@gmail.com>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210628152239.5475-1-xyz.sun.ok@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/staging/rtl8723bs/hal/sdio_ops.c b/drivers/staging/rtl8723bs/hal/sdio_ops.c
index d6b93e1f78d8..8aac87598e62 100644
--- a/drivers/staging/rtl8723bs/hal/sdio_ops.c
+++ b/drivers/staging/rtl8723bs/hal/sdio_ops.c
@@ -1077,6 +1077,8 @@ void sd_int_dpc(struct adapter *adapter)
 				} else {
 					rtw_c2h_wk_cmd(adapter, (u8 *)c2h_evt);
 				}
+			} else {
+				kfree(c2h_evt);
 			}
 		} else {
 			/* Error handling for malloc fail */

commit 78264dfb6fafa8efff024a473dfbeec3bb861f18
Author: Tyler Hicks <tyhicks@linux.microsoft.com>
Date:   Mon Jun 14 17:33:13 2021 -0500

    optee: Clear stale cache entries during initialization
    
    commit b5c10dd04b7418793517e3286cde5c04759a86de upstream.
    
    The shm cache could contain invalid addresses if
    optee_disable_shm_cache() was not called from the .shutdown hook of the
    previous kernel before a kexec. These addresses could be unmapped or
    they could point to mapped but unintended locations in memory.
    
    Clear the shared memory cache, while being careful to not translate the
    addresses returned from OPTEE_SMC_DISABLE_SHM_CACHE, during driver
    initialization. Once all pre-cache shm objects are removed, proceed with
    enabling the cache so that we know that we can handle cached shm objects
    with confidence later in the .shutdown hook.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Tyler Hicks <tyhicks@linux.microsoft.com>
    Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org>
    Reviewed-by: Sumit Garg <sumit.garg@linaro.org>
    Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/tee/optee/call.c b/drivers/tee/optee/call.c
index 7cb7efe62b01..4f4a7e2b122b 100644
--- a/drivers/tee/optee/call.c
+++ b/drivers/tee/optee/call.c
@@ -413,11 +413,13 @@ void optee_enable_shm_cache(struct optee *optee)
 }
 
 /**
- * optee_disable_shm_cache() - Disables caching of some shared memory allocation
- *			      in OP-TEE
+ * __optee_disable_shm_cache() - Disables caching of some shared memory
+ *                               allocation in OP-TEE
  * @optee:	main service struct
+ * @is_mapped:	true if the cached shared memory addresses were mapped by this
+ *		kernel, are safe to dereference, and should be freed
  */
-void optee_disable_shm_cache(struct optee *optee)
+static void __optee_disable_shm_cache(struct optee *optee, bool is_mapped)
 {
 	struct optee_call_waiter w;
 
@@ -436,6 +438,13 @@ void optee_disable_shm_cache(struct optee *optee)
 		if (res.result.status == OPTEE_SMC_RETURN_OK) {
 			struct tee_shm *shm;
 
+			/*
+			 * Shared memory references that were not mapped by
+			 * this kernel must be ignored to prevent a crash.
+			 */
+			if (!is_mapped)
+				continue;
+
 			shm = reg_pair_to_ptr(res.result.shm_upper32,
 					      res.result.shm_lower32);
 			tee_shm_free(shm);
@@ -446,6 +455,27 @@ void optee_disable_shm_cache(struct optee *optee)
 	optee_cq_wait_final(&optee->call_queue, &w);
 }
 
+/**
+ * optee_disable_shm_cache() - Disables caching of mapped shared memory
+ *                             allocations in OP-TEE
+ * @optee:	main service struct
+ */
+void optee_disable_shm_cache(struct optee *optee)
+{
+	return __optee_disable_shm_cache(optee, true);
+}
+
+/**
+ * optee_disable_unmapped_shm_cache() - Disables caching of shared memory
+ *                                      allocations in OP-TEE which are not
+ *                                      currently mapped
+ * @optee:	main service struct
+ */
+void optee_disable_unmapped_shm_cache(struct optee *optee)
+{
+	return __optee_disable_shm_cache(optee, false);
+}
+
 #define PAGELIST_ENTRIES_PER_PAGE				\
 	((OPTEE_MSG_NONCONTIG_PAGE_SIZE / sizeof(u64)) - 1)
 
diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c
index 1d71fcb13dba..473981e3ad70 100644
--- a/drivers/tee/optee/core.c
+++ b/drivers/tee/optee/core.c
@@ -619,6 +619,15 @@ static struct optee *optee_probe(struct device_node *np)
 	optee->memremaped_shm = memremaped_shm;
 	optee->pool = pool;
 
+	/*
+	 * Ensure that there are no pre-existing shm objects before enabling
+	 * the shm cache so that there's no chance of receiving an invalid
+	 * address during shutdown. This could occur, for example, if we're
+	 * kexec booting from an older kernel that did not properly cleanup the
+	 * shm cache.
+	 */
+	optee_disable_unmapped_shm_cache(optee);
+
 	optee_enable_shm_cache(optee);
 
 	pr_info("initialized driver\n");
diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_private.h
index 35e79386c556..489039acb16c 100644
--- a/drivers/tee/optee/optee_private.h
+++ b/drivers/tee/optee/optee_private.h
@@ -160,6 +160,7 @@ int optee_cancel_req(struct tee_context *ctx, u32 cancel_id, u32 session);
 
 void optee_enable_shm_cache(struct optee *optee);
 void optee_disable_shm_cache(struct optee *optee);
+void optee_disable_unmapped_shm_cache(struct optee *optee);
 
 int optee_shm_register(struct tee_context *ctx, struct tee_shm *shm,
 		       struct page **pages, size_t num_pages,

commit c0add455ae992b53b0d52cd4d8682528b4014c42
Author: Steven Rostedt (VMware) <rostedt@goodmis.org>
Date:   Wed Jul 21 11:00:53 2021 -0400

    tracing/histogram: Rename "cpu" to "common_cpu"
    
    commit 1e3bac71c5053c99d438771fc9fa5082ae5d90aa upstream.
    
    Currently the histogram logic allows the user to write "cpu" in as an
    event field, and it will record the CPU that the event happened on.
    
    The problem with this is that there's a lot of events that have "cpu"
    as a real field, and using "cpu" as the CPU it ran on, makes it
    impossible to run histograms on the "cpu" field of events.
    
    For example, if I want to have a histogram on the count of the
    workqueue_queue_work event on its cpu field, running:
    
     ># echo 'hist:keys=cpu' > events/workqueue/workqueue_queue_work/trigger
    
    Gives a misleading and wrong result.
    
    Change the command to "common_cpu" as no event should have "common_*"
    fields as that's a reserved name for fields used by all events. And
    this makes sense here as common_cpu would be a field used by all events.
    
    Now we can even do:
    
     ># echo 'hist:keys=common_cpu,cpu if cpu < 100' > events/workqueue/workqueue_queue_work/trigger
     ># cat events/workqueue/workqueue_queue_work/hist
     # event histogram
     #
     # trigger info: hist:keys=common_cpu,cpu:vals=hitcount:sort=hitcount:size=2048 if cpu < 100 [active]
     #
    
     { common_cpu:          0, cpu:          2 } hitcount:          1
     { common_cpu:          0, cpu:          4 } hitcount:          1
     { common_cpu:          7, cpu:          7 } hitcount:          1
     { common_cpu:          0, cpu:          7 } hitcount:          1
     { common_cpu:          0, cpu:          1 } hitcount:          1
     { common_cpu:          0, cpu:          6 } hitcount:          2
     { common_cpu:          0, cpu:          5 } hitcount:          2
     { common_cpu:          1, cpu:          1 } hitcount:          4
     { common_cpu:          6, cpu:          6 } hitcount:          4
     { common_cpu:          5, cpu:          5 } hitcount:         14
     { common_cpu:          4, cpu:          4 } hitcount:         26
     { common_cpu:          0, cpu:          0 } hitcount:         39
     { common_cpu:          2, cpu:          2 } hitcount:        184
    
    Now for backward compatibility, I added a trick. If "cpu" is used, and
    the field is not found, it will fall back to "common_cpu" and work as
    it did before. This way, it will still work for old programs that use
    "cpu" to get the actual CPU, but if the event has a "cpu" as a field, it
    will get that event's "cpu" field, which is probably what it wants
    anyway.
    
    I updated the tracefs/README to include documentation about both the
    common_timestamp and the common_cpu. This way, if that text is present in
    the README, then an application can know that common_cpu is supported over
    just plain "cpu".
    
    Link: https://lkml.kernel.org/r/20210721110053.26b4f641@oasis.local.home
    
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: stable@vger.kernel.org
    Fixes: 8b7622bf94a44 ("tracing: Add cpu field for hist triggers")
    Reviewed-by: Tom Zanussi <zanussi@kernel.org>
    Reviewed-by: Masami Hiramatsu <mhiramat@kernel.org>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Documentation/trace/histogram.rst b/Documentation/trace/histogram.rst
index 5ac724baea7d..c14dab13a47e 100644
--- a/Documentation/trace/histogram.rst
+++ b/Documentation/trace/histogram.rst
@@ -191,7 +191,7 @@ Documentation written by Tom Zanussi
                                 with the event, in nanoseconds.  May be
 			        modified by .usecs to have timestamps
 			        interpreted as microseconds.
-    cpu                    int  the cpu on which the event occurred.
+    common_cpu             int  the cpu on which the event occurred.
     ====================== ==== =======================================
 
 Extended error information
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 895026ccfea2..8168403427a6 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -4727,6 +4727,10 @@ static const char readme_msg[] =
 	"\t            [:pause][:continue][:clear]\n"
 	"\t            [:name=histname1]\n"
 	"\t            [if <filter>]\n\n"
+	"\t    Note, special fields can be used as well:\n"
+	"\t            common_timestamp - to record current timestamp\n"
+	"\t            common_cpu - to record the CPU the event happened on\n"
+	"\n"
 	"\t    When a matching event is hit, an entry is added to a hash\n"
 	"\t    table using the key(s) and value(s) named, and the value of a\n"
 	"\t    sum called 'hitcount' is incremented.  Keys and values\n"
diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
index c33e4cf34547..6d2a69652c39 100644
--- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c
@@ -1773,7 +1773,7 @@ static const char *hist_field_name(struct hist_field *field,
 		 field->flags & HIST_FIELD_FL_ALIAS)
 		field_name = hist_field_name(field->operands[0], ++level);
 	else if (field->flags & HIST_FIELD_FL_CPU)
-		field_name = "cpu";
+		field_name = "common_cpu";
 	else if (field->flags & HIST_FIELD_FL_EXPR ||
 		 field->flags & HIST_FIELD_FL_VAR_REF) {
 		if (field->system) {
@@ -2627,14 +2627,23 @@ parse_field(struct hist_trigger_data *hist_data, struct trace_event_file *file,
 		hist_data->enable_timestamps = true;
 		if (*flags & HIST_FIELD_FL_TIMESTAMP_USECS)
 			hist_data->attrs->ts_in_usecs = true;
-	} else if (strcmp(field_name, "cpu") == 0)
+	} else if (strcmp(field_name, "common_cpu") == 0)
 		*flags |= HIST_FIELD_FL_CPU;
 	else {
 		field = trace_find_event_field(file->event_call, field_name);
 		if (!field || !field->size) {
-			hist_err("Couldn't find field: ", field_name);
-			field = ERR_PTR(-EINVAL);
-			goto out;
+			/*
+			 * For backward compatibility, if field_name
+			 * was "cpu", then we treat this the same as
+			 * common_cpu.
+			 */
+			if (strcmp(field_name, "cpu") == 0) {
+				*flags |= HIST_FIELD_FL_CPU;
+			} else {
+				hist_err("Couldn't find field: ", field_name);
+				field = ERR_PTR(-EINVAL);
+				goto out;
+			}
 		}
 	}
  out:
@@ -5052,7 +5061,7 @@ static void hist_field_print(struct seq_file *m, struct hist_field *hist_field)
 		seq_printf(m, "%s=", hist_field->var.name);
 
 	if (hist_field->flags & HIST_FIELD_FL_CPU)
-		seq_puts(m, "cpu");
+		seq_puts(m, "common_cpu");
 	else if (field_name) {
 		if (hist_field->flags & HIST_FIELD_FL_VAR_REF ||
 		    hist_field->flags & HIST_FIELD_FL_ALIAS)

commit 43cba13ff1e793c0e1e1e317c951dea63710290e
Author: Steven Rostedt (VMware) <rostedt@goodmis.org>
Date:   Fri Jul 30 17:19:51 2021 -0400

    tracing / histogram: Give calculation hist_fields a size
    
    commit 2c05caa7ba8803209769b9e4fe02c38d77ae88d0 upstream.
    
    When working on my user space applications, I found a bug in the synthetic
    event code where the automated synthetic event field was not matching the
    event field calculation it was attached to. Looking deeper into it, it was
    because the calculation hist_field was not given a size.
    
    The synthetic event fields are matched to their hist_fields either by
    having the field have an identical string type, or if that does not match,
    then the size and signed values are used to match the fields.
    
    The problem arose when I tried to match a calculation where the fields
    were "unsigned int". My tool created a synthetic event of type "u32". But
    it failed to match. The string was:
    
      diff=field1-field2:onmatch(event).trace(synth,$diff)
    
    Adding debugging into the kernel, I found that the size of "diff" was 0.
    And since it was given "unsigned int" as a type, the histogram fallback
    code used size and signed. The signed matched, but the size of u32 (4) did
    not match zero, and the event failed to be created.
    
    This can be worse if the field you want to match is not one of the
    acceptable fields for a synthetic event. As event fields can have any type
    that is supported in Linux, this can cause an issue. For example, if a
    type is an enum. Then there's no way to use that with any calculations.
    
    Have the calculation field simply take on the size of what it is
    calculating.
    
    Link: https://lkml.kernel.org/r/20210730171951.59c7743f@oasis.local.home
    
    Cc: Tom Zanussi <zanussi@kernel.org>
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: stable@vger.kernel.org
    Fixes: 100719dcef447 ("tracing: Add simple expression support to hist triggers")
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
index 28e4ff45cb4c..c33e4cf34547 100644
--- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c
@@ -2911,6 +2911,10 @@ static struct hist_field *parse_expr(struct hist_trigger_data *hist_data,
 
 	expr->operands[0] = operand1;
 	expr->operands[1] = operand2;
+
+	/* The operand sizes should be the same, so just pick one */
+	expr->size = operand1->size;
+
 	expr->operator = field_op;
 	expr->name = expr_str(expr, 0);
 	expr->type = kstrdup(operand1->type, GFP_KERNEL);

commit 2ee3c5f196b0f8144d213700879fec840a2576e2
Author: Hui Su <suhui@zeku.com>
Date:   Fri Jun 11 10:21:07 2021 +0800

    scripts/tracing: fix the bug that can't parse raw_trace_func
    
    commit 1c0cec64a7cc545eb49f374a43e9f7190a14defa upstream.
    
    Since commit 77271ce4b2c0 ("tracing: Add irq, preempt-count and need resched info
    to default trace output"), the default trace output format has been changed to:
              <idle>-0       [009] d.h. 22420.068695: _raw_spin_lock_irqsave <-hrtimer_interrupt
              <idle>-0       [000] ..s. 22420.068695: _nohz_idle_balance <-run_rebalance_domains
              <idle>-0       [011] d.h. 22420.068695: account_process_tick <-update_process_times
    
    origin trace output format:(before v3.2.0)
         # tracer: nop
         #
         #           TASK-PID    CPU#    TIMESTAMP  FUNCTION
         #              | |       |          |         |
              migration/0-6     [000]    50.025810: rcu_note_context_switch <-__schedule
              migration/0-6     [000]    50.025812: trace_rcu_utilization <-rcu_note_context_switch
              migration/0-6     [000]    50.025813: rcu_sched_qs <-rcu_note_context_switch
              migration/0-6     [000]    50.025815: rcu_preempt_qs <-rcu_note_context_switch
              migration/0-6     [000]    50.025817: trace_rcu_utilization <-rcu_note_context_switch
              migration/0-6     [000]    50.025818: debug_lockdep_rcu_enabled <-__schedule
              migration/0-6     [000]    50.025820: debug_lockdep_rcu_enabled <-__schedule
    
    The draw_functrace.py(introduced in v2.6.28) can't parse the new version format trace_func,
    So we need modify draw_functrace.py to adapt the new version trace output format.
    
    Link: https://lkml.kernel.org/r/20210611022107.608787-1-suhui@zeku.com
    
    Cc: stable@vger.kernel.org
    Fixes: 77271ce4b2c0 tracing: Add irq, preempt-count and need resched info to default trace output
    Signed-off-by: Hui Su <suhui@zeku.com>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/scripts/tracing/draw_functrace.py b/scripts/tracing/draw_functrace.py
index 9b6dd4f36335..5706b42be3d2 100755
--- a/scripts/tracing/draw_functrace.py
+++ b/scripts/tracing/draw_functrace.py
@@ -17,7 +17,7 @@ Usage:
 	$ cat /sys/kernel/debug/tracing/trace_pipe > ~/raw_trace_func
 	Wait some times but not too much, the script is a bit slow.
 	Break the pipe (Ctrl + Z)
-	$ scripts/draw_functrace.py < raw_trace_func > draw_functrace
+	$ scripts/tracing/draw_functrace.py < ~/raw_trace_func > draw_functrace
 	Then you have your drawn trace in draw_functrace
 """
 
@@ -103,10 +103,10 @@ def parseLine(line):
 	line = line.strip()
 	if line.startswith("#"):
 		raise CommentLineException
-	m = re.match("[^]]+?\\] +([0-9.]+): (\\w+) <-(\\w+)", line)
+	m = re.match("[^]]+?\\] +([a-z.]+) +([0-9.]+): (\\w+) <-(\\w+)", line)
 	if m is None:
 		raise BrokenLineException
-	return (m.group(1), m.group(2), m.group(3))
+	return (m.group(2), m.group(3), m.group(4))
 
 
 def main():

commit 4549564ca1dbf81fb63a7dfaeeaaa482931c0cfe
Author: Dmitry Osipenko <digetx@gmail.com>
Date:   Sat Jul 17 21:21:27 2021 +0300

    usb: otg-fsm: Fix hrtimer list corruption
    
    commit bf88fef0b6f1488abeca594d377991171c00e52a upstream.
    
    The HNP work can be re-scheduled while it's still in-fly. This results in
    re-initialization of the busy work, resetting the hrtimer's list node of
    the work and crashing kernel with null dereference within kernel/timer
    once work's timer is expired. It's very easy to trigger this problem by
    re-plugging USB cable quickly. Initialize HNP work only once to fix this
    trouble.
    
     Unable to handle kernel NULL pointer dereference at virtual address 00000126)
     ...
     PC is at __run_timers.part.0+0x150/0x228
     LR is at __next_timer_interrupt+0x51/0x9c
     ...
     (__run_timers.part.0) from [<c0187a2b>] (run_timer_softirq+0x2f/0x50)
     (run_timer_softirq) from [<c01013ad>] (__do_softirq+0xd5/0x2f0)
     (__do_softirq) from [<c012589b>] (irq_exit+0xab/0xb8)
     (irq_exit) from [<c0170341>] (handle_domain_irq+0x45/0x60)
     (handle_domain_irq) from [<c04c4a43>] (gic_handle_irq+0x6b/0x7c)
     (gic_handle_irq) from [<c0100b65>] (__irq_svc+0x65/0xac)
    
    Cc: stable@vger.kernel.org
    Acked-by: Peter Chen <peter.chen@kernel.org>
    Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
    Link: https://lore.kernel.org/r/20210717182134.30262-6-digetx@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/common/usb-otg-fsm.c b/drivers/usb/common/usb-otg-fsm.c
index 3740cf95560e..0697fde51d00 100644
--- a/drivers/usb/common/usb-otg-fsm.c
+++ b/drivers/usb/common/usb-otg-fsm.c
@@ -193,7 +193,11 @@ static void otg_start_hnp_polling(struct otg_fsm *fsm)
 	if (!fsm->host_req_flag)
 		return;
 
-	INIT_DELAYED_WORK(&fsm->hnp_polling_work, otg_hnp_polling_work);
+	if (!fsm->hnp_work_inited) {
+		INIT_DELAYED_WORK(&fsm->hnp_polling_work, otg_hnp_polling_work);
+		fsm->hnp_work_inited = true;
+	}
+
 	schedule_delayed_work(&fsm->hnp_polling_work,
 					msecs_to_jiffies(T_HOST_REQ_POLL));
 }
diff --git a/include/linux/usb/otg-fsm.h b/include/linux/usb/otg-fsm.h
index e78eb577d0fa..8ef7d148c149 100644
--- a/include/linux/usb/otg-fsm.h
+++ b/include/linux/usb/otg-fsm.h
@@ -196,6 +196,7 @@ struct otg_fsm {
 	struct mutex lock;
 	u8 *host_req_flag;
 	struct delayed_work hnp_polling_work;
+	bool hnp_work_inited;
 	bool state_changed;
 };
 

commit 8b575d820ddac2e959acc9575c55a5d5272fbcee
Author: Maxim Devaev <mdevaev@gmail.com>
Date:   Tue Jul 27 21:58:00 2021 +0300

    usb: gadget: f_hid: idle uses the highest byte for duration
    
    commit fa20bada3f934e3b3e4af4c77e5b518cd5a282e5 upstream.
    
    SET_IDLE value must be shifted 8 bits to the right to get duration.
    This confirmed by USBCV test.
    
    Fixes: afcff6dc690e ("usb: gadget: f_hid: added GET_IDLE and SET_IDLE handlers")
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Maxim Devaev <mdevaev@gmail.com>
    Link: https://lore.kernel.org/r/20210727185800.43796-1-mdevaev@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/gadget/function/f_hid.c b/drivers/usb/gadget/function/f_hid.c
index f9fe94d1764a..1d10d29c115b 100644
--- a/drivers/usb/gadget/function/f_hid.c
+++ b/drivers/usb/gadget/function/f_hid.c
@@ -579,7 +579,7 @@ static int hidg_setup(struct usb_function *f,
 		  | HID_REQ_SET_IDLE):
 		VDBG(cdev, "set_idle\n");
 		length = 0;
-		hidg->idle = value;
+		hidg->idle = value >> 8;
 		goto respond;
 		break;
 

commit 1071804cc89e984e0d2c966e890fd37f77a8e951
Author: Phil Elwell <phil@raspberrypi.com>
Date:   Fri Jul 23 18:59:30 2021 +0300

    usb: gadget: f_hid: fixed NULL pointer dereference
    
    commit 2867652e4766360adf14dfda3832455e04964f2a upstream.
    
    Disconnecting and reconnecting the USB cable can lead to crashes
    and a variety of kernel log spam.
    
    The problem was found and reproduced on the Raspberry Pi [1]
    and the original fix was created in Raspberry's own fork [2].
    
    Link: https://github.com/raspberrypi/linux/issues/3870 [1]
    Link: https://github.com/raspberrypi/linux/commit/a6e47d5f4efbd2ea6a0b6565cd2f9b7bb217ded5 [2]
    Signed-off-by: Maxim Devaev <mdevaev@gmail.com>
    Signed-off-by: Phil Elwell <phil@raspberrypi.com>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210723155928.210019-1-mdevaev@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/gadget/function/f_hid.c b/drivers/usb/gadget/function/f_hid.c
index db32091140d4..f9fe94d1764a 100644
--- a/drivers/usb/gadget/function/f_hid.c
+++ b/drivers/usb/gadget/function/f_hid.c
@@ -345,6 +345,11 @@ static ssize_t f_hidg_write(struct file *file, const char __user *buffer,
 
 	spin_lock_irqsave(&hidg->write_spinlock, flags);
 
+	if (!hidg->req) {
+		spin_unlock_irqrestore(&hidg->write_spinlock, flags);
+		return -ESHUTDOWN;
+	}
+
 #define WRITE_COND (!hidg->write_pending)
 try_again:
 	/* write queue */
@@ -365,8 +370,14 @@ static ssize_t f_hidg_write(struct file *file, const char __user *buffer,
 	count  = min_t(unsigned, count, hidg->report_length);
 
 	spin_unlock_irqrestore(&hidg->write_spinlock, flags);
-	status = copy_from_user(req->buf, buffer, count);
 
+	if (!req) {
+		ERROR(hidg->func.config->cdev, "hidg->req is NULL\n");
+		status = -ESHUTDOWN;
+		goto release_write_pending;
+	}
+
+	status = copy_from_user(req->buf, buffer, count);
 	if (status != 0) {
 		ERROR(hidg->func.config->cdev,
 			"copy_from_user error\n");
@@ -394,14 +405,17 @@ static ssize_t f_hidg_write(struct file *file, const char __user *buffer,
 
 	spin_unlock_irqrestore(&hidg->write_spinlock, flags);
 
+	if (!hidg->in_ep->enabled) {
+		ERROR(hidg->func.config->cdev, "in_ep is disabled\n");
+		status = -ESHUTDOWN;
+		goto release_write_pending;
+	}
+
 	status = usb_ep_queue(hidg->in_ep, req, GFP_ATOMIC);
-	if (status < 0) {
-		ERROR(hidg->func.config->cdev,
-			"usb_ep_queue error on int endpoint %zd\n", status);
+	if (status < 0)
 		goto release_write_pending;
-	} else {
+	else
 		status = count;
-	}
 
 	return status;
 release_write_pending:

commit 92bb8520970470028aab5a1ea7875a798d2ba4c8
Author: Maxim Devaev <mdevaev@gmail.com>
Date:   Wed Jul 21 21:03:51 2021 +0300

    usb: gadget: f_hid: added GET_IDLE and SET_IDLE handlers
    
    commit afcff6dc690e24d636a41fd4bee6057e7c70eebd upstream.
    
    The USB HID standard declares mandatory support for GET_IDLE and SET_IDLE
    requests for Boot Keyboard. Most hosts can handle their absence, but others
    like some old/strange UEFIs and BIOSes consider this a critical error
    and refuse to work with f_hid.
    
    This primitive implementation of saving and returning idle is sufficient
    to meet the requirements of the standard and these devices.
    
    Acked-by: Felipe Balbi <balbi@kernel.org>
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Maxim Devaev <mdevaev@gmail.com>
    Link: https://lore.kernel.org/r/20210721180351.129450-1-mdevaev@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/gadget/function/f_hid.c b/drivers/usb/gadget/function/f_hid.c
index fa8a8e04008a..db32091140d4 100644
--- a/drivers/usb/gadget/function/f_hid.c
+++ b/drivers/usb/gadget/function/f_hid.c
@@ -41,6 +41,7 @@ struct f_hidg {
 	unsigned char			bInterfaceSubClass;
 	unsigned char			bInterfaceProtocol;
 	unsigned char			protocol;
+	unsigned char			idle;
 	unsigned short			report_desc_length;
 	char				*report_desc;
 	unsigned short			report_length;
@@ -529,6 +530,14 @@ static int hidg_setup(struct usb_function *f,
 		goto respond;
 		break;
 
+	case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8
+		  | HID_REQ_GET_IDLE):
+		VDBG(cdev, "get_idle\n");
+		length = min_t(unsigned int, length, 1);
+		((u8 *) req->buf)[0] = hidg->idle;
+		goto respond;
+		break;
+
 	case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8
 		  | HID_REQ_SET_REPORT):
 		VDBG(cdev, "set_report | wLength=%d\n", ctrl->wLength);
@@ -552,6 +561,14 @@ static int hidg_setup(struct usb_function *f,
 		goto stall;
 		break;
 
+	case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8
+		  | HID_REQ_SET_IDLE):
+		VDBG(cdev, "set_idle\n");
+		length = 0;
+		hidg->idle = value;
+		goto respond;
+		break;
+
 	case ((USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_INTERFACE) << 8
 		  | USB_REQ_GET_DESCRIPTOR):
 		switch (value >> 8) {
@@ -779,6 +796,7 @@ static int hidg_bind(struct usb_configuration *c, struct usb_function *f)
 	hidg_interface_desc.bInterfaceSubClass = hidg->bInterfaceSubClass;
 	hidg_interface_desc.bInterfaceProtocol = hidg->bInterfaceProtocol;
 	hidg->protocol = HID_REPORT_PROTOCOL;
+	hidg->idle = 1;
 	hidg_ss_in_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length);
 	hidg_ss_in_comp_desc.wBytesPerInterval =
 				cpu_to_le16(hidg->report_length);

commit 6d55383c699ad771e551835a8dce2197fdfc8cad
Author: Alexander Tsoy <alexander@tsoy.me>
Date:   Tue Jul 27 12:33:26 2021 +0300

    ALSA: usb-audio: Add registration quirk for JBL Quantum 600
    
    commit 4b0556b96e1fe7723629bd40e3813a30cd632faf upstream.
    
    Apparently JBL Quantum 600 has multiple hardware revisions. Apply
    registration quirk to another device id as well.
    
    Signed-off-by: Alexander Tsoy <alexander@tsoy.me>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210727093326.1153366-1-alexander@tsoy.me
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
index 87d3ea979638..4114594e57a3 100644
--- a/sound/usb/quirks.c
+++ b/sound/usb/quirks.c
@@ -1555,6 +1555,7 @@ static const struct registration_quirk registration_quirks[] = {
 	REG_QUIRK_ENTRY(0x0951, 0x16ea, 2),	/* Kingston HyperX Cloud Flight S */
 	REG_QUIRK_ENTRY(0x0ecb, 0x1f46, 2),	/* JBL Quantum 600 */
 	REG_QUIRK_ENTRY(0x0ecb, 0x2039, 2),	/* JBL Quantum 400 */
+	REG_QUIRK_ENTRY(0x0ecb, 0x203c, 2),	/* JBL Quantum 600 */
 	REG_QUIRK_ENTRY(0x0ecb, 0x203e, 2),	/* JBL Quantum 800 */
 	{ 0 }					/* terminator */
 };

commit 67cf0fbcac0d42d4d4686cddc1e39f465bbfec37
Author: Anirudh Rayabharam <mail@anirudhrb.com>
Date:   Wed Jul 28 14:21:07 2021 +0530

    firmware_loader: fix use-after-free in firmware_fallback_sysfs
    
    commit 75d95e2e39b27f733f21e6668af1c9893a97de5e upstream.
    
    This use-after-free happens when a fw_priv object has been freed but
    hasn't been removed from the pending list (pending_fw_head). The next
    time fw_load_sysfs_fallback tries to insert into the list, it ends up
    accessing the pending_list member of the previously freed fw_priv.
    
    The root cause here is that all code paths that abort the fw load
    don't delete it from the pending list. For example:
    
            _request_firmware()
              -> fw_abort_batch_reqs()
                  -> fw_state_aborted()
    
    To fix this, delete the fw_priv from the list in __fw_set_state() if
    the new state is DONE or ABORTED. This way, all aborts will remove
    the fw_priv from the list. Accordingly, remove calls to list_del_init
    that were being made before calling fw_state_(aborted|done).
    
    Also, in fw_load_sysfs_fallback, don't add the fw_priv to the pending
    list if it is already aborted. Instead, just jump out and return early.
    
    Fixes: bcfbd3523f3c ("firmware: fix a double abort case with fw_load_sysfs_fallback")
    Cc: stable <stable@vger.kernel.org>
    Reported-by: syzbot+de271708674e2093097b@syzkaller.appspotmail.com
    Tested-by: syzbot+de271708674e2093097b@syzkaller.appspotmail.com
    Reviewed-by: Shuah Khan <skhan@linuxfoundation.org>
    Acked-by: Luis Chamberlain <mcgrof@kernel.org>
    Signed-off-by: Anirudh Rayabharam <mail@anirudhrb.com>
    Link: https://lore.kernel.org/r/20210728085107.4141-3-mail@anirudhrb.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/base/firmware_loader/fallback.c b/drivers/base/firmware_loader/fallback.c
index 885e942178a3..821e27bda4ca 100644
--- a/drivers/base/firmware_loader/fallback.c
+++ b/drivers/base/firmware_loader/fallback.c
@@ -86,12 +86,11 @@ static void __fw_load_abort(struct fw_priv *fw_priv)
 {
 	/*
 	 * There is a small window in which user can write to 'loading'
-	 * between loading done and disappearance of 'loading'
+	 * between loading done/aborted and disappearance of 'loading'
 	 */
-	if (fw_sysfs_done(fw_priv))
+	if (fw_state_is_aborted(fw_priv) || fw_sysfs_done(fw_priv))
 		return;
 
-	list_del_init(&fw_priv->pending_list);
 	fw_state_aborted(fw_priv);
 }
 
@@ -297,7 +296,6 @@ static ssize_t firmware_loading_store(struct device *dev,
 			 * Same logic as fw_load_abort, only the DONE bit
 			 * is ignored and we set ABORT only on failure.
 			 */
-			list_del_init(&fw_priv->pending_list);
 			if (rc) {
 				fw_state_aborted(fw_priv);
 				written = rc;
@@ -559,6 +557,11 @@ static int fw_load_sysfs_fallback(struct fw_sysfs *fw_sysfs,
 	}
 
 	mutex_lock(&fw_lock);
+	if (fw_state_is_aborted(fw_priv)) {
+		mutex_unlock(&fw_lock);
+		retval = -EINTR;
+		goto out;
+	}
 	list_add(&fw_priv->pending_list, &pending_fw_head);
 	mutex_unlock(&fw_lock);
 
@@ -584,6 +587,7 @@ static int fw_load_sysfs_fallback(struct fw_sysfs *fw_sysfs,
 	} else if (fw_priv->is_paged_buf && !fw_priv->data)
 		retval = -ENOMEM;
 
+out:
 	device_del(f_dev);
 err_put_dev:
 	put_device(f_dev);
diff --git a/drivers/base/firmware_loader/firmware.h b/drivers/base/firmware_loader/firmware.h
index 4c1395f8e7ed..e2000b4ad09b 100644
--- a/drivers/base/firmware_loader/firmware.h
+++ b/drivers/base/firmware_loader/firmware.h
@@ -106,8 +106,16 @@ static inline void __fw_state_set(struct fw_priv *fw_priv,
 
 	WRITE_ONCE(fw_st->status, status);
 
-	if (status == FW_STATUS_DONE || status == FW_STATUS_ABORTED)
+	if (status == FW_STATUS_DONE || status == FW_STATUS_ABORTED) {
+#ifdef CONFIG_FW_LOADER_USER_HELPER
+		/*
+		 * Doing this here ensures that the fw_priv is deleted from
+		 * the pending list in all abort/done paths.
+		 */
+		list_del_init(&fw_priv->pending_list);
+#endif
 		complete_all(&fw_st->completion);
+	}
 }
 
 static inline void fw_state_aborted(struct fw_priv *fw_priv)
diff --git a/drivers/base/firmware_loader/main.c b/drivers/base/firmware_loader/main.c
index 8e9213b36e31..24410a0d6df0 100644
--- a/drivers/base/firmware_loader/main.c
+++ b/drivers/base/firmware_loader/main.c
@@ -558,8 +558,10 @@ static void fw_abort_batch_reqs(struct firmware *fw)
 		return;
 
 	fw_priv = fw->priv;
+	mutex_lock(&fw_lock);
 	if (!fw_state_is_aborted(fw_priv))
 		fw_state_aborted(fw_priv);
+	mutex_unlock(&fw_lock);
 }
 
 /* called from request_firmware() and request_firmware_work_func() */

commit ce699ac03ec0e41347363e1cf0924669f5449e34
Author: Anirudh Rayabharam <mail@anirudhrb.com>
Date:   Wed Jul 28 14:21:06 2021 +0530

    firmware_loader: use -ETIMEDOUT instead of -EAGAIN in fw_load_sysfs_fallback
    
    commit 0d6434e10b5377a006f6dd995c8fc5e2d82acddc upstream.
    
    The only motivation for using -EAGAIN in commit 0542ad88fbdd81bb
    ("firmware loader: Fix _request_firmware_load() return val for fw load
    abort") was to distinguish the error from -ENOMEM, and so there is no
    real reason in keeping it. -EAGAIN is typically used to tell the
    userspace to try something again and in this case re-using the sysfs
    loading interface cannot be retried when a timeout happens, so the
    return value is also bogus.
    
    -ETIMEDOUT is received when the wait times out and returning that
    is much more telling of what the reason for the failure was. So, just
    propagate that instead of returning -EAGAIN.
    
    Suggested-by: Luis Chamberlain <mcgrof@kernel.org>
    Reviewed-by: Shuah Khan <skhan@linuxfoundation.org>
    Acked-by: Luis Chamberlain <mcgrof@kernel.org>
    Signed-off-by: Anirudh Rayabharam <mail@anirudhrb.com>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210728085107.4141-2-mail@anirudhrb.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/base/firmware_loader/fallback.c b/drivers/base/firmware_loader/fallback.c
index 3b7b748c4d4f..885e942178a3 100644
--- a/drivers/base/firmware_loader/fallback.c
+++ b/drivers/base/firmware_loader/fallback.c
@@ -581,8 +581,6 @@ static int fw_load_sysfs_fallback(struct fw_sysfs *fw_sysfs,
 	if (fw_state_is_aborted(fw_priv)) {
 		if (retval == -ERESTARTSYS)
 			retval = -EINTR;
-		else
-			retval = -EAGAIN;
 	} else if (fw_priv->is_paged_buf && !fw_priv->data)
 		retval = -ENOMEM;
 

commit c660c337e846be1be897e2d71c3ebbf1763743cb
Author: David Bauer <mail@david-bauer.net>
Date:   Thu Aug 5 01:25:22 2021 +0200

    USB: serial: ftdi_sio: add device ID for Auto-M3 OP-COM v2
    
    commit 8da0e55c7988ef9f08a708c38e5c75ecd8862cf8 upstream.
    
    The Auto-M3 OP-COM v2 is a OBD diagnostic device using a FTD232 for the
    USB connection.
    
    Signed-off-by: David Bauer <mail@david-bauer.net>
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index 8242bf686303..784d281eb847 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -209,6 +209,7 @@ static const struct usb_device_id id_table_combined[] = {
 	{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) },
 	{ USB_DEVICE(FTDI_VID, FTDI_R2000KU_TRUE_RNG) },
 	{ USB_DEVICE(FTDI_VID, FTDI_VARDAAN_PID) },
+	{ USB_DEVICE(FTDI_VID, FTDI_AUTO_M3_OP_COM_V2_PID) },
 	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0100_PID) },
 	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0101_PID) },
 	{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0102_PID) },
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h
index add602bebd82..755858ca20ba 100644
--- a/drivers/usb/serial/ftdi_sio_ids.h
+++ b/drivers/usb/serial/ftdi_sio_ids.h
@@ -159,6 +159,9 @@
 /* Vardaan Enterprises Serial Interface VEUSB422R3 */
 #define FTDI_VARDAAN_PID	0xF070
 
+/* Auto-M3 Ltd. - OP-COM USB V2 - OBD interface Adapter */
+#define FTDI_AUTO_M3_OP_COM_V2_PID	0x4f50
+
 /*
  * Xsens Technologies BV products (http://www.xsens.com).
  */

commit d5008c3e90a9b39dd6a2b05edc0c293eda58dd2b
Author: Willy Tarreau <w@1wt.eu>
Date:   Sat Jul 24 17:27:39 2021 +0200

    USB: serial: ch341: fix character loss at high transfer rates
    
    commit 3c18e9baee0ef97510dcda78c82285f52626764b upstream.
    
    The chip supports high transfer rates, but with the small default buffers
    (64 bytes read), some entire blocks are regularly lost. This typically
    happens at 1.5 Mbps (which is the default speed on Rockchip devices) when
    used as a console to access U-Boot where the output of the "help" command
    misses many lines and where "printenv" mangles the environment.
    
    The FTDI driver doesn't suffer at all from this. One difference is that
    it uses 512 bytes rx buffers and 256 bytes tx buffers. Adopting these
    values completely resolved the issue, even the output of "dmesg" is
    reliable. I preferred to leave the Tx value unchanged as it is not
    involved in this issue, while a change could increase the risk of
    triggering the same issue with other devices having too small buffers.
    
    I verified that it backports well (and works) at least to 5.4. It's of
    low importance enough to be dropped where it doesn't trivially apply
    anymore.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Willy Tarreau <w@1wt.eu>
    Link: https://lore.kernel.org/r/20210724152739.18726-1-w@1wt.eu
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c
index c87cb25e70ec..e6dce35ca1aa 100644
--- a/drivers/usb/serial/ch341.c
+++ b/drivers/usb/serial/ch341.c
@@ -625,6 +625,7 @@ static struct usb_serial_driver ch341_device = {
 		.owner	= THIS_MODULE,
 		.name	= "ch341-uart",
 	},
+	.bulk_in_size      = 512,
 	.id_table          = id_table,
 	.num_ports         = 1,
 	.open              = ch341_open,

commit 67a377163fea67e9140e0ac67fb3d85ab5ced613
Author: Daniele Palmas <dnlplm@gmail.com>
Date:   Tue Aug 3 21:47:11 2021 +0200

    USB: serial: option: add Telit FD980 composition 0x1056
    
    commit 5648c073c33d33a0a19d0cb1194a4eb88efe2b71 upstream.
    
    Add the following Telit FD980 composition 0x1056:
    
    Cfg #1: mass storage
    Cfg #2: rndis, tty, adb, tty, tty, tty, tty
    
    Signed-off-by: Daniele Palmas <dnlplm@gmail.com>
    Link: https://lore.kernel.org/r/20210803194711.3036-1-dnlplm@gmail.com
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index 9370c6fa7bc8..e6103a27e440 100644
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -1203,6 +1203,8 @@ static const struct usb_device_id option_ids[] = {
 	  .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(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910),
 	  .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) },
 	{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM),

commit 08433a2b5b0d3975feac4c6b50b02e8c47b74948
Author: Qiang.zhang <qiang.zhang@windriver.com>
Date:   Fri Jul 23 08:43:34 2021 +0800

    USB: usbtmc: Fix RCU stall warning
    
    commit 30fad76ce4e98263edfa8f885c81d5426c1bf169 upstream.
    
    rcu: INFO: rcu_preempt self-detected stall on CPU
    rcu:    1-...!: (2 ticks this GP) idle=d92/1/0x4000000000000000
            softirq=25390/25392 fqs=3
            (t=12164 jiffies g=31645 q=43226)
    rcu: rcu_preempt kthread starved for 12162 jiffies! g31645 f0x0
         RCU_GP_WAIT_FQS(5) ->state=0x0 ->cpu=0
    rcu:    Unless rcu_preempt kthread gets sufficient CPU time,
            OOM is now expected behavior.
    rcu: RCU grace-period kthread stack dump:
    task:rcu_preempt     state:R  running task
    ...........
    usbtmc 3-1:0.0: unknown status received: -71
    usbtmc 3-1:0.0: unknown status received: -71
    usbtmc 3-1:0.0: unknown status received: -71
    usbtmc 3-1:0.0: unknown status received: -71
    usbtmc 3-1:0.0: unknown status received: -71
    usbtmc 3-1:0.0: unknown status received: -71
    usbtmc 3-1:0.0: unknown status received: -71
    usbtmc 3-1:0.0: unknown status received: -71
    usbtmc 3-1:0.0: usb_submit_urb failed: -19
    
    The function usbtmc_interrupt() resubmits urbs when the error status
    of an urb is -EPROTO. In systems using the dummy_hcd usb controller
    this can result in endless interrupt loops when the usbtmc device is
    disconnected from the host system.
    
    Since host controller drivers already try to recover from transmission
    errors, there is no need to resubmit the urb or try other solutions
    to repair the error situation.
    
    In case of errors the INT pipe just stops to wait for further packets.
    
    Fixes: dbf3e7f654c0 ("Implement an ioctl to support the USMTMC-USB488 READ_STATUS_BYTE operation")
    Cc: stable@vger.kernel.org
    Reported-by: syzbot+e2eae5639e7203360018@syzkaller.appspotmail.com
    Signed-off-by: Qiang.zhang <qiang.zhang@windriver.com>
    Acked-by: Guido Kiener <guido.kiener@rohde-schwarz.com>
    Link: https://lore.kernel.org/r/20210723004334.458930-1-qiang.zhang@windriver.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c
index e6a7c86b70f2..5c98f561272d 100644
--- a/drivers/usb/class/usbtmc.c
+++ b/drivers/usb/class/usbtmc.c
@@ -1537,17 +1537,10 @@ static void usbtmc_interrupt(struct urb *urb)
 		dev_err(dev, "overflow with length %d, actual length is %d\n",
 			data->iin_wMaxPacketSize, urb->actual_length);
 		/* fall through */
-	case -ECONNRESET:
-	case -ENOENT:
-	case -ESHUTDOWN:
-	case -EILSEQ:
-	case -ETIME:
-	case -EPIPE:
+	default:
 		/* urb terminated, clean up */
 		dev_dbg(dev, "urb terminated, status: %d\n", status);
 		return;
-	default:
-		dev_err(dev, "unknown status received: %d\n", status);
 	}
 exit:
 	rv = usb_submit_urb(urb, GFP_ATOMIC);

commit 3719acc161d5c1ce09912cc1c9eddc2c5faa3c66
Author: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Date:   Wed Aug 4 19:26:56 2021 +0900

    Bluetooth: defer cleanup of resources in hci_unregister_dev()
    
    [ Upstream commit e04480920d1eec9c061841399aa6f35b6f987d8b ]
    
    syzbot is hitting might_sleep() warning at hci_sock_dev_event() due to
    calling lock_sock() with rw spinlock held [1].
    
    It seems that history of this locking problem is a trial and error.
    
    Commit b40df5743ee8 ("[PATCH] bluetooth: fix socket locking in
    hci_sock_dev_event()") in 2.6.21-rc4 changed bh_lock_sock() to
    lock_sock() as an attempt to fix lockdep warning.
    
    Then, commit 4ce61d1c7a8e ("[BLUETOOTH]: Fix locking in
    hci_sock_dev_event().") in 2.6.22-rc2 changed lock_sock() to
    local_bh_disable() + bh_lock_sock_nested() as an attempt to fix the
    sleep in atomic context warning.
    
    Then, commit 4b5dd696f81b ("Bluetooth: Remove local_bh_disable() from
    hci_sock.c") in 3.3-rc1 removed local_bh_disable().
    
    Then, commit e305509e678b ("Bluetooth: use correct lock to prevent UAF
    of hdev object") in 5.13-rc5 again changed bh_lock_sock_nested() to
    lock_sock() as an attempt to fix CVE-2021-3573.
    
    This difficulty comes from current implementation that
    hci_sock_dev_event(HCI_DEV_UNREG) is responsible for dropping all
    references from sockets because hci_unregister_dev() immediately
    reclaims resources as soon as returning from
    hci_sock_dev_event(HCI_DEV_UNREG).
    
    But the history suggests that hci_sock_dev_event(HCI_DEV_UNREG) was not
    doing what it should do.
    
    Therefore, instead of trying to detach sockets from device, let's accept
    not detaching sockets from device at hci_sock_dev_event(HCI_DEV_UNREG),
    by moving actual cleanup of resources from hci_unregister_dev() to
    hci_cleanup_dev() which is called by bt_host_release() when all
    references to this unregistered device (which is a kobject) are gone.
    
    Since hci_sock_dev_event(HCI_DEV_UNREG) no longer resets
    hci_pi(sk)->hdev, we need to check whether this device was unregistered
    and return an error based on HCI_UNREGISTER flag.  There might be subtle
    behavioral difference in "monitor the hdev" functionality; please report
    if you found something went wrong due to this patch.
    
    Link: https://syzkaller.appspot.com/bug?extid=a5df189917e79d5e59c9 [1]
    Reported-by: syzbot <syzbot+a5df189917e79d5e59c9@syzkaller.appspotmail.com>
    Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Fixes: e305509e678b ("Bluetooth: use correct lock to prevent UAF of hdev object")
    Acked-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 6a61faf0cc79..75d892dc7796 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -1042,6 +1042,7 @@ struct hci_dev *hci_alloc_dev(void);
 void hci_free_dev(struct hci_dev *hdev);
 int hci_register_dev(struct hci_dev *hdev);
 void hci_unregister_dev(struct hci_dev *hdev);
+void hci_cleanup_dev(struct hci_dev *hdev);
 int hci_suspend_dev(struct hci_dev *hdev);
 int hci_resume_dev(struct hci_dev *hdev);
 int hci_reset_dev(struct hci_dev *hdev);
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 219cdbb476fb..7a85f215da45 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -3261,14 +3261,10 @@ EXPORT_SYMBOL(hci_register_dev);
 /* Unregister HCI device */
 void hci_unregister_dev(struct hci_dev *hdev)
 {
-	int id;
-
 	BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
 
 	hci_dev_set_flag(hdev, HCI_UNREGISTER);
 
-	id = hdev->id;
-
 	write_lock(&hci_dev_list_lock);
 	list_del(&hdev->list);
 	write_unlock(&hci_dev_list_lock);
@@ -3297,7 +3293,14 @@ void hci_unregister_dev(struct hci_dev *hdev)
 	}
 
 	device_del(&hdev->dev);
+	/* Actual cleanup is deferred until hci_cleanup_dev(). */
+	hci_dev_put(hdev);
+}
+EXPORT_SYMBOL(hci_unregister_dev);
 
+/* Cleanup HCI device */
+void hci_cleanup_dev(struct hci_dev *hdev)
+{
 	debugfs_remove_recursive(hdev->debugfs);
 	kfree_const(hdev->hw_info);
 	kfree_const(hdev->fw_info);
@@ -3320,11 +3323,8 @@ void hci_unregister_dev(struct hci_dev *hdev)
 	hci_discovery_filter_clear(hdev);
 	hci_dev_unlock(hdev);
 
-	hci_dev_put(hdev);
-
-	ida_simple_remove(&hci_index_ida, id);
+	ida_simple_remove(&hci_index_ida, hdev->id);
 }
-EXPORT_SYMBOL(hci_unregister_dev);
 
 /* Suspend HCI device */
 int hci_suspend_dev(struct hci_dev *hdev)
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c
index 06156de24c50..3ba0c6df73ce 100644
--- a/net/bluetooth/hci_sock.c
+++ b/net/bluetooth/hci_sock.c
@@ -59,6 +59,17 @@ struct hci_pinfo {
 	char              comm[TASK_COMM_LEN];
 };
 
+static struct hci_dev *hci_hdev_from_sock(struct sock *sk)
+{
+	struct hci_dev *hdev = hci_pi(sk)->hdev;
+
+	if (!hdev)
+		return ERR_PTR(-EBADFD);
+	if (hci_dev_test_flag(hdev, HCI_UNREGISTER))
+		return ERR_PTR(-EPIPE);
+	return hdev;
+}
+
 void hci_sock_set_flag(struct sock *sk, int nr)
 {
 	set_bit(nr, &hci_pi(sk)->flags);
@@ -752,19 +763,13 @@ void hci_sock_dev_event(struct hci_dev *hdev, int event)
 	if (event == HCI_DEV_UNREG) {
 		struct sock *sk;
 
-		/* Detach sockets from device */
+		/* Wake up sockets using this dead device */
 		read_lock(&hci_sk_list.lock);
 		sk_for_each(sk, &hci_sk_list.head) {
-			lock_sock(sk);
 			if (hci_pi(sk)->hdev == hdev) {
-				hci_pi(sk)->hdev = NULL;
 				sk->sk_err = EPIPE;
-				sk->sk_state = BT_OPEN;
 				sk->sk_state_change(sk);
-
-				hci_dev_put(hdev);
 			}
-			release_sock(sk);
 		}
 		read_unlock(&hci_sk_list.lock);
 	}
@@ -923,10 +928,10 @@ static int hci_sock_blacklist_del(struct hci_dev *hdev, void __user *arg)
 static int hci_sock_bound_ioctl(struct sock *sk, unsigned int cmd,
 				unsigned long arg)
 {
-	struct hci_dev *hdev = hci_pi(sk)->hdev;
+	struct hci_dev *hdev = hci_hdev_from_sock(sk);
 
-	if (!hdev)
-		return -EBADFD;
+	if (IS_ERR(hdev))
+		return PTR_ERR(hdev);
 
 	if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL))
 		return -EBUSY;
@@ -1080,6 +1085,18 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
 
 	lock_sock(sk);
 
+	/* Allow detaching from dead device and attaching to alive device, if
+	 * the caller wants to re-bind (instead of close) this socket in
+	 * response to hci_sock_dev_event(HCI_DEV_UNREG) notification.
+	 */
+	hdev = hci_pi(sk)->hdev;
+	if (hdev && hci_dev_test_flag(hdev, HCI_UNREGISTER)) {
+		hci_pi(sk)->hdev = NULL;
+		sk->sk_state = BT_OPEN;
+		hci_dev_put(hdev);
+	}
+	hdev = NULL;
+
 	if (sk->sk_state == BT_BOUND) {
 		err = -EALREADY;
 		goto done;
@@ -1356,9 +1373,9 @@ static int hci_sock_getname(struct socket *sock, struct sockaddr *addr,
 
 	lock_sock(sk);
 
-	hdev = hci_pi(sk)->hdev;
-	if (!hdev) {
-		err = -EBADFD;
+	hdev = hci_hdev_from_sock(sk);
+	if (IS_ERR(hdev)) {
+		err = PTR_ERR(hdev);
 		goto done;
 	}
 
@@ -1718,9 +1735,9 @@ static int hci_sock_sendmsg(struct socket *sock, struct msghdr *msg,
 		goto done;
 	}
 
-	hdev = hci_pi(sk)->hdev;
-	if (!hdev) {
-		err = -EBADFD;
+	hdev = hci_hdev_from_sock(sk);
+	if (IS_ERR(hdev)) {
+		err = PTR_ERR(hdev);
 		goto done;
 	}
 
diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c
index 9874844a95a9..b69d88b88d2e 100644
--- a/net/bluetooth/hci_sysfs.c
+++ b/net/bluetooth/hci_sysfs.c
@@ -83,6 +83,9 @@ void hci_conn_del_sysfs(struct hci_conn *conn)
 static void bt_host_release(struct device *dev)
 {
 	struct hci_dev *hdev = to_hci_dev(dev);
+
+	if (hci_dev_test_flag(hdev, HCI_UNREGISTER))
+		hci_cleanup_dev(hdev);
 	kfree(hdev);
 	module_put(THIS_MODULE);
 }

commit 76ab02d9b861da0785176f0228340f22023902fa
Author: Yu Kuai <yukuai3@huawei.com>
Date:   Thu Aug 5 20:46:45 2021 +0800

    blk-iolatency: error out if blk_get_queue() failed in iolatency_set_limit()
    
    [ Upstream commit 8d75d0eff6887bcac7225e12b9c75595e523d92d ]
    
    If queue is dying while iolatency_set_limit() is in progress,
    blk_get_queue() won't increment the refcount of the queue. However,
    blk_put_queue() will still decrement the refcount later, which will
    cause the refcout to be unbalanced.
    
    Thus error out in such case to fix the problem.
    
    Fixes: 8c772a9bfc7c ("blk-iolatency: fix IO hang due to negative inflight counter")
    Signed-off-by: Yu Kuai <yukuai3@huawei.com>
    Acked-by: Tejun Heo <tj@kernel.org>
    Link: https://lore.kernel.org/r/20210805124645.543797-1-yukuai3@huawei.com
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/block/blk-iolatency.c b/block/blk-iolatency.c
index 0529e94a20f7..019cf002ecee 100644
--- a/block/blk-iolatency.c
+++ b/block/blk-iolatency.c
@@ -800,7 +800,11 @@ static ssize_t iolatency_set_limit(struct kernfs_open_file *of, char *buf,
 
 	enable = iolatency_set_min_lat_nsec(blkg, lat_val);
 	if (enable) {
-		WARN_ON_ONCE(!blk_get_queue(blkg->q));
+		if (!blk_get_queue(blkg->q)) {
+			ret = -ENODEV;
+			goto out;
+		}
+
 		blkg_get(blkg);
 	}
 

commit 92c8d9aebe575f2a44a875cbdcd98c93594473af
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Wed Aug 4 18:52:20 2021 +0300

    net: vxge: fix use-after-free in vxge_device_unregister
    
    [ Upstream commit 942e560a3d3862dd5dee1411dbdd7097d29b8416 ]
    
    Smatch says:
    drivers/net/ethernet/neterion/vxge/vxge-main.c:3518 vxge_device_unregister() error: Using vdev after free_{netdev,candev}(dev);
    drivers/net/ethernet/neterion/vxge/vxge-main.c:3518 vxge_device_unregister() error: Using vdev after free_{netdev,candev}(dev);
    drivers/net/ethernet/neterion/vxge/vxge-main.c:3520 vxge_device_unregister() error: Using vdev after free_{netdev,candev}(dev);
    drivers/net/ethernet/neterion/vxge/vxge-main.c:3520 vxge_device_unregister() error: Using vdev after free_{netdev,candev}(dev);
    
    Since vdev pointer is netdev private data accessing it after free_netdev()
    call can cause use-after-free bug. Fix it by moving free_netdev() call at
    the end of the function
    
    Fixes: 6cca200362b4 ("vxge: cleanup probe error paths")
    Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/neterion/vxge/vxge-main.c b/drivers/net/ethernet/neterion/vxge/vxge-main.c
index 5ae3fa82909f..0766288e2f38 100644
--- a/drivers/net/ethernet/neterion/vxge/vxge-main.c
+++ b/drivers/net/ethernet/neterion/vxge/vxge-main.c
@@ -3529,13 +3529,13 @@ static void vxge_device_unregister(struct __vxge_hw_device *hldev)
 
 	kfree(vdev->vpaths);
 
-	/* we are safe to free it now */
-	free_netdev(dev);
-
 	vxge_debug_init(vdev->level_trace, "%s: ethernet device unregistered",
 			buf);
 	vxge_debug_entryexit(vdev->level_trace,	"%s: %s:%d  Exiting...", buf,
 			     __func__, __LINE__);
+
+	/* we are safe to free it now */
+	free_netdev(dev);
 }
 
 /*

commit bfee67c40873f47b2b4c4c7ea56cc9170e18daad
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Wed Aug 4 18:51:51 2021 +0300

    net: fec: fix use-after-free in fec_drv_remove
    
    [ Upstream commit 44712965bf12ae1758cec4de53816ed4b914ca1a ]
    
    Smatch says:
            drivers/net/ethernet/freescale/fec_main.c:3994 fec_drv_remove() error: Using fep after free_{netdev,candev}(ndev);
            drivers/net/ethernet/freescale/fec_main.c:3995 fec_drv_remove() error: Using fep after free_{netdev,candev}(ndev);
    
    Since fep pointer is netdev private data, accessing it after free_netdev()
    call can cause use-after-free bug. Fix it by moving free_netdev() call at
    the end of the function
    
    Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
    Fixes: a31eda65ba21 ("net: fec: fix clock count mis-match")
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Reviewed-by: Joakim Zhang <qiangqing.zhang@nxp.com>
    Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 6b9eada1feb2..3fc823e9cdc9 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -3733,13 +3733,13 @@ fec_drv_remove(struct platform_device *pdev)
 	if (of_phy_is_fixed_link(np))
 		of_phy_deregister_fixed_link(np);
 	of_node_put(fep->phy_node);
-	free_netdev(ndev);
 
 	clk_disable_unprepare(fep->clk_ahb);
 	clk_disable_unprepare(fep->clk_ipg);
 	pm_runtime_put_noidle(&pdev->dev);
 	pm_runtime_disable(&pdev->dev);
 
+	free_netdev(ndev);
 	return 0;
 }
 

commit 423cbae7ee2a70ea8dd0bc129aa3aa32c54e0f12
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Wed Aug 4 17:30:05 2021 +0300

    net: pegasus: fix uninit-value in get_interrupt_interval
    
    [ Upstream commit af35fc37354cda3c9c8cc4961b1d24bdc9d27903 ]
    
    Syzbot reported uninit value pegasus_probe(). The problem was in missing
    error handling.
    
    get_interrupt_interval() internally calls read_eprom_word() which can
    fail in some cases. For example: failed to receive usb control message.
    These cases should be handled to prevent uninit value bug, since
    read_eprom_word() will not initialize passed stack variable in case of
    internal failure.
    
    Fail log:
    
    BUG: KMSAN: uninit-value in get_interrupt_interval drivers/net/usb/pegasus.c:746 [inline]
    BUG: KMSAN: uninit-value in pegasus_probe+0x10e7/0x4080 drivers/net/usb/pegasus.c:1152
    CPU: 1 PID: 825 Comm: kworker/1:1 Not tainted 5.12.0-rc6-syzkaller #0
    ...
    Workqueue: usb_hub_wq hub_event
    Call Trace:
     __dump_stack lib/dump_stack.c:79 [inline]
     dump_stack+0x24c/0x2e0 lib/dump_stack.c:120
     kmsan_report+0xfb/0x1e0 mm/kmsan/kmsan_report.c:118
     __msan_warning+0x5c/0xa0 mm/kmsan/kmsan_instr.c:197
     get_interrupt_interval drivers/net/usb/pegasus.c:746 [inline]
     pegasus_probe+0x10e7/0x4080 drivers/net/usb/pegasus.c:1152
    ....
    
    Local variable ----data.i@pegasus_probe created at:
     get_interrupt_interval drivers/net/usb/pegasus.c:1151 [inline]
     pegasus_probe+0xe57/0x4080 drivers/net/usb/pegasus.c:1152
     get_interrupt_interval drivers/net/usb/pegasus.c:1151 [inline]
     pegasus_probe+0xe57/0x4080 drivers/net/usb/pegasus.c:1152
    
    Reported-and-tested-by: syzbot+02c9f70f3afae308464a@syzkaller.appspotmail.com
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Link: https://lore.kernel.org/r/20210804143005.439-1-paskripkin@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/usb/pegasus.c b/drivers/net/usb/pegasus.c
index b7a0df95d4b0..9f1777e56d7d 100644
--- a/drivers/net/usb/pegasus.c
+++ b/drivers/net/usb/pegasus.c
@@ -750,12 +750,16 @@ static inline void disable_net_traffic(pegasus_t *pegasus)
 	set_registers(pegasus, EthCtrl0, sizeof(tmp), &tmp);
 }
 
-static inline void get_interrupt_interval(pegasus_t *pegasus)
+static inline int get_interrupt_interval(pegasus_t *pegasus)
 {
 	u16 data;
 	u8 interval;
+	int ret;
+
+	ret = read_eprom_word(pegasus, 4, &data);
+	if (ret < 0)
+		return ret;
 
-	read_eprom_word(pegasus, 4, &data);
 	interval = data >> 8;
 	if (pegasus->usb->speed != USB_SPEED_HIGH) {
 		if (interval < 0x80) {
@@ -770,6 +774,8 @@ static inline void get_interrupt_interval(pegasus_t *pegasus)
 		}
 	}
 	pegasus->intr_interval = interval;
+
+	return 0;
 }
 
 static void set_carrier(struct net_device *net)
@@ -1188,7 +1194,9 @@ static int pegasus_probe(struct usb_interface *intf,
 				| NETIF_MSG_PROBE | NETIF_MSG_LINK);
 
 	pegasus->features = usb_dev_id[dev_index].private;
-	get_interrupt_interval(pegasus);
+	res = get_interrupt_interval(pegasus);
+	if (res)
+		goto out2;
 	if (reset_mac(pegasus)) {
 		dev_err(&intf->dev, "can't reset MAC\n");
 		res = -EIO;

commit 836e2fd208c87ab00d843cbe4cec884ba0895158
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Thu Aug 5 13:38:26 2021 +0300

    bnx2x: fix an error code in bnx2x_nic_load()
    
    [ Upstream commit fb653827c758725b149b5c924a5eb50ab4812750 ]
    
    Set the error code if bnx2x_alloc_fw_stats_mem() fails.  The current
    code returns success.
    
    Fixes: ad5afc89365e ("bnx2x: Separate VF and PF logic")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
index cf01e73d1bcc..2610acf9ac36 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
@@ -2668,7 +2668,8 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
 	}
 
 	/* Allocated memory for FW statistics  */
-	if (bnx2x_alloc_fw_stats_mem(bp))
+	rc = bnx2x_alloc_fw_stats_mem(bp);
+	if (rc)
 		LOAD_ERROR_EXIT(bp, load_error0);
 
 	/* request pf to initialize status blocks */

commit 273a38908f0ce411f4cc61212233c0fbc089757c
Author: H. Nikolaus Schaller <hns@goldelico.com>
Date:   Thu Jul 8 10:57:10 2021 +0200

    mips: Fix non-POSIX regexp
    
    [ Upstream commit 28bbbb9875a35975904e46f9b06fa689d051b290 ]
    
    When cross compiling a MIPS kernel on a BSD based HOSTCC leads
    to errors like
    
      SYNC    include/config/auto.conf.cmd - due to: .config
    egrep: empty (sub)expression
      UPD     include/config/kernel.release
      HOSTCC  scripts/dtc/dtc.o - due to target missing
    
    It turns out that egrep uses this egrep pattern:
    
                    (|MINOR_|PATCHLEVEL_)
    
    This is not valid syntax or gives undefined results according
    to POSIX 9.5.3 ERE Grammar
    
            https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html
    
    It seems to be silently accepted by the Linux egrep implementation
    while a BSD host complains.
    
    Such patterns can be replaced by a transformation like
    
            "(|p1|p2)" -> "(p1|p2)?"
    
    Fixes: 48c35b2d245f ("[MIPS] There is no __GNUC_MAJOR__")
    Signed-off-by: H. Nikolaus Schaller <hns@goldelico.com>
    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/Makefile b/arch/mips/Makefile
index 63e2ad43bd6a..8f4e169cde11 100644
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
@@ -325,7 +325,7 @@ KBUILD_LDFLAGS		+= -m $(ld-emul)
 
 ifdef CONFIG_MIPS
 CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -x c /dev/null | \
-	egrep -vw '__GNUC_(|MINOR_|PATCHLEVEL_)_' | \
+	egrep -vw '__GNUC_(MINOR_|PATCHLEVEL_)?_' | \
 	sed -e "s/^\#define /-D'/" -e "s/ /'='/" -e "s/$$/'/" -e 's/\$$/&&/g')
 endif
 

commit 08882fba72a9be9446d744c60d6d418f547a0c96
Author: Antoine Tenart <atenart@kernel.org>
Date:   Tue Aug 3 12:00:16 2021 +0200

    net: ipv6: fix returned variable type in ip6_skb_dst_mtu
    
    [ Upstream commit 4039146777a91e1576da2bf38e0d8a1061a1ae47 ]
    
    The patch fixing the returned value of ip6_skb_dst_mtu (int -> unsigned
    int) was rebased between its initial review and the version applied. In
    the meantime fade56410c22 was applied, which added a new variable (int)
    used as the returned value. This lead to a mismatch between the function
    prototype and the variable used as the return value.
    
    Fixes: 40fc3054b458 ("net: ipv6: fix return value of ip6_skb_dst_mtu")
    Cc: Vadim Fedorenko <vfedorenko@novek.ru>
    Signed-off-by: Antoine Tenart <atenart@kernel.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h
index a8f5410ae0d4..f237573a2651 100644
--- a/include/net/ip6_route.h
+++ b/include/net/ip6_route.h
@@ -243,7 +243,7 @@ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
 
 static inline unsigned int ip6_skb_dst_mtu(struct sk_buff *skb)
 {
-	int mtu;
+	unsigned int mtu;
 
 	struct ipv6_pinfo *np = skb->sk && !dev_recursion_level() ?
 				inet6_sk(skb->sk) : NULL;

commit 264216f8837a6ac690377c3118144de7f07e801b
Author: Fei Qin <fei.qin@corigine.com>
Date:   Tue Aug 3 12:39:11 2021 +0200

    nfp: update ethtool reporting of pauseframe control
    
    [ Upstream commit 9fdc5d85a8fe684cdf24dc31c6bc4a727decfe87 ]
    
    Pauseframe control is set to symmetric mode by default on the NFP.
    Pause frames can not be configured through ethtool now, but ethtool can
    report the supported mode.
    
    Fixes: 265aeb511bd5 ("nfp: add support for .get_link_ksettings()")
    Signed-off-by: Fei Qin <fei.qin@corigine.com>
    Signed-off-by: Louis Peens <louis.peens@corigine.com>
    Signed-off-by: Simon Horman <simon.horman@corigine.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c b/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c
index 9043d2cadd5d..2e75d0af4a58 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c
@@ -292,6 +292,8 @@ nfp_net_get_link_ksettings(struct net_device *netdev,
 
 	/* Init to unknowns */
 	ethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE);
+	ethtool_link_ksettings_add_link_mode(cmd, supported, Pause);
+	ethtool_link_ksettings_add_link_mode(cmd, advertising, Pause);
 	cmd->base.port = PORT_OTHER;
 	cmd->base.speed = SPEED_UNKNOWN;
 	cmd->base.duplex = DUPLEX_UNKNOWN;

commit f91e7bd934c705f25dc6651e29e9c857d48a51f4
Author: Xin Long <lucien.xin@gmail.com>
Date:   Sun Aug 1 02:25:31 2021 -0400

    sctp: move the active_key update after sh_keys is added
    
    [ Upstream commit ae954bbc451d267f7d60d7b49db811d5a68ebd7b ]
    
    In commit 58acd1009226 ("sctp: update active_key for asoc when old key is
    being replaced"), sctp_auth_asoc_init_active_key() is called to update
    the active_key right after the old key is deleted and before the new key
    is added, and it caused that the active_key could be found with the key_id.
    
    In Ying Xu's testing, the BUG_ON in sctp_auth_asoc_init_active_key() was
    triggered:
    
      [ ] kernel BUG at net/sctp/auth.c:416!
      [ ] RIP: 0010:sctp_auth_asoc_init_active_key.part.8+0xe7/0xf0 [sctp]
      [ ] Call Trace:
      [ ]  sctp_auth_set_key+0x16d/0x1b0 [sctp]
      [ ]  sctp_setsockopt.part.33+0x1ba9/0x2bd0 [sctp]
      [ ]  __sys_setsockopt+0xd6/0x1d0
      [ ]  __x64_sys_setsockopt+0x20/0x30
      [ ]  do_syscall_64+0x5b/0x1a0
    
    So fix it by moving the active_key update after sh_keys is added.
    
    Fixes: 58acd1009226 ("sctp: update active_key for asoc when old key is being replaced")
    Reported-by: Ying Xu <yinxu@redhat.com>
    Signed-off-by: Xin Long <lucien.xin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sctp/auth.c b/net/sctp/auth.c
index b2ca66c4a21d..9e0c98df20da 100644
--- a/net/sctp/auth.c
+++ b/net/sctp/auth.c
@@ -880,14 +880,18 @@ int sctp_auth_set_key(struct sctp_endpoint *ep,
 	memcpy(key->data, &auth_key->sca_key[0], auth_key->sca_keylength);
 	cur_key->key = key;
 
-	if (replace) {
-		list_del_init(&shkey->key_list);
-		sctp_auth_shkey_release(shkey);
-		if (asoc && asoc->active_key_id == auth_key->sca_keynumber)
-			sctp_auth_asoc_init_active_key(asoc, GFP_KERNEL);
+	if (!replace) {
+		list_add(&cur_key->key_list, sh_keys);
+		return 0;
 	}
+
+	list_del_init(&shkey->key_list);
+	sctp_auth_shkey_release(shkey);
 	list_add(&cur_key->key_list, sh_keys);
 
+	if (asoc && asoc->active_key_id == auth_key->sca_keynumber)
+		sctp_auth_asoc_init_active_key(asoc, GFP_KERNEL);
+
 	return 0;
 }
 

commit 9309cd087b4d9dbb40395d37e5ea2072422a1b95
Author: Wang Hai <wanghai38@huawei.com>
Date:   Sat Jul 31 14:38:01 2021 +0800

    net: natsemi: Fix missing pci_disable_device() in probe and remove
    
    [ Upstream commit 7fe74dfd41c428afb24e2e615470832fa997ff14 ]
    
    Replace pci_enable_device() with pcim_enable_device(),
    pci_disable_device() and pci_release_regions() will be
    called in release automatically.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Wang Hai <wanghai38@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/natsemi/natsemi.c b/drivers/net/ethernet/natsemi/natsemi.c
index b9a1a9f999ea..039d5dd98dfe 100644
--- a/drivers/net/ethernet/natsemi/natsemi.c
+++ b/drivers/net/ethernet/natsemi/natsemi.c
@@ -819,7 +819,7 @@ static int natsemi_probe1(struct pci_dev *pdev, const struct pci_device_id *ent)
 		printk(version);
 #endif
 
-	i = pci_enable_device(pdev);
+	i = pcim_enable_device(pdev);
 	if (i) return i;
 
 	/* natsemi has a non-standard PM control register
@@ -852,7 +852,7 @@ static int natsemi_probe1(struct pci_dev *pdev, const struct pci_device_id *ent)
 	ioaddr = ioremap(iostart, iosize);
 	if (!ioaddr) {
 		i = -ENOMEM;
-		goto err_ioremap;
+		goto err_pci_request_regions;
 	}
 
 	/* Work around the dropped serial bit. */
@@ -974,9 +974,6 @@ static int natsemi_probe1(struct pci_dev *pdev, const struct pci_device_id *ent)
  err_register_netdev:
 	iounmap(ioaddr);
 
- err_ioremap:
-	pci_release_regions(pdev);
-
  err_pci_request_regions:
 	free_netdev(dev);
 	return i;
@@ -3242,7 +3239,6 @@ static void natsemi_remove1(struct pci_dev *pdev)
 
 	NATSEMI_REMOVE_FILE(pdev, dspcfg_workaround);
 	unregister_netdev (dev);
-	pci_release_regions (pdev);
 	iounmap(ioaddr);
 	free_netdev (dev);
 }

commit a351cafd536e9fa8a8d16c7749af97325b6a1fa3
Author: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Date:   Wed Jun 30 09:58:23 2021 +0200

    media: videobuf2-core: dequeue if start_streaming fails
    
    [ Upstream commit c592b46907adbeb81243f7eb7a468c36692658b8 ]
    
    If a vb2_queue sets q->min_buffers_needed then when the number of
    queued buffers reaches q->min_buffers_needed, vb2_core_qbuf() will call
    the start_streaming() callback. If start_streaming() returns an error,
    then that error was just returned by vb2_core_qbuf(), but the buffer
    was still queued. However, userspace expects that if VIDIOC_QBUF fails,
    the buffer is returned dequeued.
    
    So if start_streaming() fails, then remove the buffer from the queue,
    thus avoiding this unwanted side-effect.
    
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
    Tested-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
    Fixes: b3379c6201bb ("[media] vb2: only call start_streaming if sufficient buffers are queued")
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/media/common/videobuf2/videobuf2-core.c
index 93d250db0b6f..50015a2ea5ce 100644
--- a/drivers/media/common/videobuf2/videobuf2-core.c
+++ b/drivers/media/common/videobuf2/videobuf2-core.c
@@ -1391,6 +1391,7 @@ static int vb2_start_streaming(struct vb2_queue *q)
 int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb)
 {
 	struct vb2_buffer *vb;
+	enum vb2_buffer_state orig_state;
 	int ret;
 
 	if (q->error) {
@@ -1420,6 +1421,7 @@ int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb)
 	 * Add to the queued buffers list, a buffer will stay on it until
 	 * dequeued in dqbuf.
 	 */
+	orig_state = vb->state;
 	list_add_tail(&vb->queued_entry, &q->queued_list);
 	q->queued_count++;
 	q->waiting_for_buffers = false;
@@ -1450,8 +1452,17 @@ int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb)
 	if (q->streaming && !q->start_streaming_called &&
 	    q->queued_count >= q->min_buffers_needed) {
 		ret = vb2_start_streaming(q);
-		if (ret)
+		if (ret) {
+			/*
+			 * Since vb2_core_qbuf will return with an error,
+			 * we should return it to state DEQUEUED since
+			 * the error indicates that the buffer wasn't queued.
+			 */
+			list_del(&vb->queued_entry);
+			q->queued_count--;
+			vb->state = orig_state;
 			return ret;
+		}
 	}
 
 	dprintk(2, "qbuf of buffer %d succeeded\n", vb->index);

commit 489492b5a81f0f6de1ffa246e4183e479298fd2b
Author: Li Manyi <limanyi@uniontech.com>
Date:   Mon Jul 26 19:49:13 2021 +0800

    scsi: sr: Return correct event when media event code is 3
    
    [ Upstream commit 5c04243a56a7977185b00400e59ca7e108004faf ]
    
    Media event code 3 is defined in the MMC-6 spec as follows:
    
      "MediaRemoval: The media has been removed from the specified slot, and
       the Drive is unable to access the media without user intervention. This
       applies to media changers only."
    
    This indicated that treating the condition as an EJECT_REQUEST was
    appropriate. However, doing so had the unfortunate side-effect of causing
    the drive tray to be physically ejected on resume. Instead treat the event
    as a MEDIA_CHANGE request.
    
    Fixes: 7dd753ca59d6 ("scsi: sr: Return appropriate error code when disk is ejected")
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=213759
    Link: https://lore.kernel.org/r/20210726114913.6760-1-limanyi@uniontech.com
    Signed-off-by: Li Manyi <limanyi@uniontech.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c
index acf0c244141f..84dd776d36c3 100644
--- a/drivers/scsi/sr.c
+++ b/drivers/scsi/sr.c
@@ -217,7 +217,7 @@ static unsigned int sr_get_events(struct scsi_device *sdev)
 	else if (med->media_event_code == 2)
 		return DISK_EVENT_MEDIA_CHANGE;
 	else if (med->media_event_code == 3)
-		return DISK_EVENT_EJECT_REQUEST;
+		return DISK_EVENT_MEDIA_CHANGE;
 	return 0;
 }
 

commit a6af9385fe59c73b60df6842d96059cff7151e31
Author: H. Nikolaus Schaller <hns@goldelico.com>
Date:   Thu Jul 1 16:00:22 2021 +0200

    omap5-board-common: remove not physically existing vdds_1v8_main fixed-regulator
    
    [ Upstream commit c68ef4ad180e09805fa46965d15e1dfadf09ffa5 ]
    
    This device tree include file describes a fixed-regulator
    connecting smps7_reg output (1.8V) to some 1.8V rail and
    consumers (vdds_1v8_main).
    
    This regulator does not physically exist.
    
    I assume it was introduced as a wrapper around smps7_reg
    to provide a speaking signal name "vdds_1v8_main" as label.
    
    This fixed-regulator without real function was not an issue
    in driver code until
    
      Commit 98e48cd9283d ("regulator: core: resolve supply for boot-on/always-on regulators")
    
    introduced a new check for regulator initialization which
    makes Palmas regulator registration fail:
    
    [    5.407712] ldo1: supplied by vsys_cobra
    [    5.412748] ldo2: supplied by vsys_cobra
    [    5.417603] palmas-pmic 48070000.i2c:palmas@48:palmas_pmic: failed to register 48070000.i2c:palmas@48:palmas_pmic regulator
    
    The reason is that the supply-chain of regulators is too
    long and goes from ldo3 through the virtual vdds_1v8_main
    regulator and then back to smps7. This adds a cross-dependency
    of probing Palmas regulators and the fixed-regulator which
    leads to probe deferral by the new check and is no longer
    resolved.
    
    Since we do not control what device tree files including this
    one reference (either &vdds_1v8_main or &smps7_reg or both)
    we keep both labels for smps7 for compatibility.
    
    Fixes: 98e48cd9283d ("regulator: core: resolve supply for boot-on/always-on regulators")
    Signed-off-by: H. Nikolaus Schaller <hns@goldelico.com>
    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/omap5-board-common.dtsi b/arch/arm/boot/dts/omap5-board-common.dtsi
index 61a06f6add3c..d1cb9ba080b2 100644
--- a/arch/arm/boot/dts/omap5-board-common.dtsi
+++ b/arch/arm/boot/dts/omap5-board-common.dtsi
@@ -33,14 +33,6 @@
 		regulator-max-microvolt = <5000000>;
 	};
 
-	vdds_1v8_main: fixedregulator-vdds_1v8_main {
-		compatible = "regulator-fixed";
-		regulator-name = "vdds_1v8_main";
-		vin-supply = <&smps7_reg>;
-		regulator-min-microvolt = <1800000>;
-		regulator-max-microvolt = <1800000>;
-	};
-
 	vmmcsd_fixed: fixedregulator-mmcsd {
 		compatible = "regulator-fixed";
 		regulator-name = "vmmcsd_fixed";
@@ -490,6 +482,7 @@
 					regulator-boot-on;
 				};
 
+				vdds_1v8_main:
 				smps7_reg: smps7 {
 					/* VDDS_1v8_OMAP over VDDS_1v8_MAIN */
 					regulator-name = "smps7";

commit 82ff713e72b5eeb97312cd7944159ba55934963a
Author: Dario Binacchi <dariobin@libero.it>
Date:   Sun Jul 25 18:07:25 2021 +0200

    clk: stm32f4: fix post divisor setup for I2S/SAI PLLs
    
    [ Upstream commit 24b5b1978cd5a80db58e2a19db2f9c36fe8d4f7a ]
    
    Enabling the framebuffer leads to a system hang. Running, as a debug
    hack, the store_pan() function in drivers/video/fbdev/core/fbsysfs.c
    without taking the console_lock, allows to see the crash backtrace on
    the serial line.
    
    ~ # echo 0 0 > /sys/class/graphics/fb0/pan
    
    [    9.719414] Unhandled exception: IPSR = 00000005 LR = fffffff1
    [    9.726937] CPU: 0 PID: 49 Comm: sh Not tainted 5.13.0-rc5 #9
    [    9.733008] Hardware name: STM32 (Device Tree Support)
    [    9.738296] PC is at clk_gate_is_enabled+0x0/0x28
    [    9.743426] LR is at stm32f4_pll_div_set_rate+0xf/0x38
    [    9.748857] pc : [<0011e4be>]    lr : [<0011f9e3>]    psr: 0100000b
    [    9.755373] sp : 00bc7be0  ip : 00000000  fp : 001f3ac4
    [    9.760812] r10: 002610d0  r9 : 01efe920  r8 : 00540560
    [    9.766269] r7 : 02e7ddb0  r6 : 0173eed8  r5 : 00000000  r4 : 004027c0
    [    9.773081] r3 : 0011e4bf  r2 : 02e7ddb0  r1 : 0173eed8  r0 : 1d3267b8
    [    9.779911] xPSR: 0100000b
    [    9.782719] CPU: 0 PID: 49 Comm: sh Not tainted 5.13.0-rc5 #9
    [    9.788791] Hardware name: STM32 (Device Tree Support)
    [    9.794120] [<0000afa1>] (unwind_backtrace) from [<0000a33f>] (show_stack+0xb/0xc)
    [    9.802421] [<0000a33f>] (show_stack) from [<0000a8df>] (__invalid_entry+0x4b/0x4c)
    
    The `pll_num' field in the post_div_data configuration contained a wrong
    value which also referenced an uninitialized hardware clock when
    clk_register_pll_div() was called.
    
    Fixes: 517633ef630e ("clk: stm32f4: Add post divisor for I2S & SAI PLLs")
    Signed-off-by: Dario Binacchi <dariobin@libero.it>
    Reviewed-by: Gabriel Fernandez <gabriel.fernandez@st.com>
    Link: https://lore.kernel.org/r/20210725160725.10788-1-dariobin@libero.it
    Signed-off-by: Stephen Boyd <sboyd@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/clk/clk-stm32f4.c b/drivers/clk/clk-stm32f4.c
index 294850bdc195..61de486dec41 100644
--- a/drivers/clk/clk-stm32f4.c
+++ b/drivers/clk/clk-stm32f4.c
@@ -454,7 +454,7 @@ struct stm32f4_pll {
 
 struct stm32f4_pll_post_div_data {
 	int idx;
-	u8 pll_num;
+	int pll_idx;
 	const char *name;
 	const char *parent;
 	u8 flag;
@@ -485,13 +485,13 @@ static const struct clk_div_table post_divr_table[] = {
 
 #define MAX_POST_DIV 3
 static const struct stm32f4_pll_post_div_data  post_div_data[MAX_POST_DIV] = {
-	{ CLK_I2SQ_PDIV, PLL_I2S, "plli2s-q-div", "plli2s-q",
+	{ CLK_I2SQ_PDIV, PLL_VCO_I2S, "plli2s-q-div", "plli2s-q",
 		CLK_SET_RATE_PARENT, STM32F4_RCC_DCKCFGR, 0, 5, 0, NULL},
 
-	{ CLK_SAIQ_PDIV, PLL_SAI, "pllsai-q-div", "pllsai-q",
+	{ CLK_SAIQ_PDIV, PLL_VCO_SAI, "pllsai-q-div", "pllsai-q",
 		CLK_SET_RATE_PARENT, STM32F4_RCC_DCKCFGR, 8, 5, 0, NULL },
 
-	{ NO_IDX, PLL_SAI, "pllsai-r-div", "pllsai-r", CLK_SET_RATE_PARENT,
+	{ NO_IDX, PLL_VCO_SAI, "pllsai-r-div", "pllsai-r", CLK_SET_RATE_PARENT,
 		STM32F4_RCC_DCKCFGR, 16, 2, 0, post_divr_table },
 };
 
@@ -1499,7 +1499,7 @@ static void __init stm32f4_rcc_init(struct device_node *np)
 				post_div->width,
 				post_div->flag_div,
 				post_div->div_table,
-				clks[post_div->pll_num],
+				clks[post_div->pll_idx],
 				&stm32f4_clk_lock);
 
 		if (post_div->idx != NO_IDX)

commit cb6c9448a5c85135b8553bd28643b42cb05745d9
Author: chihhao.chen <chihhao.chen@mediatek.com>
Date:   Sat Jul 24 12:23:41 2021 +0800

    ALSA: usb-audio: fix incorrect clock source setting
    
    [ Upstream commit 4511781f95da0a3b2bad34f3f5e3967e80cd2d18 ]
    
    The following scenario describes an echo test for
    Samsung USBC Headset (AKG) with VID/PID (0x04e8/0xa051).
    
    We first start a capture stream(USB IN transfer) in 96Khz/24bit/1ch mode.
    In clock find source function, we get value 0x2 for clock selector
    and 0x1 for clock source.
    
    Kernel-4.14 behavior
    Since clock source is valid so clock selector was not set again.
    We pass through this function and start a playback stream(USB OUT transfer)
    in 48Khz/32bit/2ch mode. This time we get value 0x1 for clock selector
    and 0x1 for clock source. Finally clock id with this setting is 0x9.
    
    Kernel-5.10 behavior
    Clock selector was always set one more time even it is valid.
    When we start a playback stream, we will get 0x2 for clock selector
    and 0x1 for clock source. In this case clock id becomes 0xA.
    This is an incorrect clock source setting and results in severe noises.
    We see wrong data rate in USB IN transfer.
    (From 288 bytes/ms becomes 144 bytes/ms) It should keep in 288 bytes/ms.
    
    This earphone works fine on older kernel version load because
    this is a newly-added behavior.
    
    Fixes: d2e8f641257d ("ALSA: usb-audio: Explicitly set up the clock selector")
    Signed-off-by: chihhao.chen <chihhao.chen@mediatek.com>
    Link: https://lore.kernel.org/r/1627100621-19225-1-git-send-email-chihhao.chen@mediatek.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/usb/clock.c b/sound/usb/clock.c
index 863ac42076e5..d1455fb2c6fc 100644
--- a/sound/usb/clock.c
+++ b/sound/usb/clock.c
@@ -296,6 +296,12 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip,
 					      selector->baCSourceID[ret - 1],
 					      visited, validate);
 		if (ret > 0) {
+			/*
+			 * For Samsung USBC Headset (AKG), setting clock selector again
+			 * will result in incorrect default clock setting problems
+			 */
+			if (chip->usb_id == USB_ID(0x04e8, 0xa051))
+				return ret;
 			err = uac_clock_selector_set_val(chip, entity_id, cur);
 			if (err < 0)
 				return err;

commit c22aabdfb7c358cc8c9df970994a3c8f455f7ca9
Author: Oleksandr Suvorov <oleksandr.suvorov@toradex.com>
Date:   Tue Jul 13 23:21:07 2021 +0300

    ARM: dts: colibri-imx6ull: limit SDIO clock to 25MHz
    
    [ Upstream commit 828db68f4ff1ab6982a36a56522b585160dc8c8e ]
    
    NXP and AzureWave don't recommend using SDIO bus mode 3.3V@50MHz due
    to noise affecting the wireless throughput. Colibri iMX6ULL uses only
    3.3V signaling for Wi-Fi module AW-CM276NF.
    
    Limit the SDIO Clock on Colibri iMX6ULL to 25MHz.
    
    Fixes: c2e4987e0e02 ("ARM: dts: imx6ull: add Toradex Colibri iMX6ULL support")
    Signed-off-by: Oleksandr Suvorov <oleksandr.suvorov@toradex.com>
    Reviewed-by: Fabio Estevam <festevam@gmail.com>
    Signed-off-by: Shawn Guo <shawnguo@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi b/arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi
index 038d8c90f6df..621396884c31 100644
--- a/arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi
+++ b/arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi
@@ -43,6 +43,7 @@
 	assigned-clock-rates = <0>, <198000000>;
 	cap-power-off-card;
 	keep-power-in-suspend;
+	max-frequency = <25000000>;
 	mmc-pwrseq = <&wifi_pwrseq>;
 	no-1-8-v;
 	non-removable;

commit ba5b3733e026e0b54c98dac28874a510ef10adf5
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Tue Jun 15 20:52:38 2021 +0800

    ARM: imx: add missing iounmap()
    
    [ Upstream commit f9613aa07f16d6042e74208d1b40a6104d72964a ]
    
    Commit e76bdfd7403a ("ARM: imx: Added perf functionality to mmdc driver")
    introduced imx_mmdc_remove(), the mmdc_base need be unmapped in it if
    config PERF_EVENTS is enabled.
    
    If imx_mmdc_perf_init() fails, the mmdc_base also need be unmapped.
    
    Fixes: e76bdfd7403a ("ARM: imx: Added perf functionality to mmdc driver")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Reviewed-by: Dong Aisheng <aisheng.dong@nxp.com>
    Signed-off-by: Shawn Guo <shawnguo@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/mach-imx/mmdc.c b/arch/arm/mach-imx/mmdc.c
index 04b3bf71de94..1d340fda5e4f 100644
--- a/arch/arm/mach-imx/mmdc.c
+++ b/arch/arm/mach-imx/mmdc.c
@@ -472,6 +472,7 @@ static int imx_mmdc_remove(struct platform_device *pdev)
 
 	cpuhp_state_remove_instance_nocalls(cpuhp_mmdc_state, &pmu_mmdc->node);
 	perf_pmu_unregister(&pmu_mmdc->pmu);
+	iounmap(pmu_mmdc->mmdc_base);
 	kfree(pmu_mmdc);
 	return 0;
 }
@@ -564,7 +565,11 @@ static int imx_mmdc_probe(struct platform_device *pdev)
 	val &= ~(1 << BP_MMDC_MAPSR_PSD);
 	writel_relaxed(val, reg);
 
-	return imx_mmdc_perf_init(pdev, mmdc_base);
+	err = imx_mmdc_perf_init(pdev, mmdc_base);
+	if (err)
+		iounmap(mmdc_base);
+
+	return err;
 }
 
 int imx_mmdc_get_ddr_type(void)

commit a61a98bbff14d8dcd767b17b0b6d18d0d65116be
Author: Takashi Iwai <tiwai@suse.de>
Date:   Tue Aug 3 13:43:12 2021 +0200

    ALSA: seq: Fix racy deletion of subscriber
    
    commit 97367c97226aab8b298ada954ce12659ee3ad2a4 upstream.
    
    It turned out that the current implementation of the port subscription
    is racy.  The subscription contains two linked lists, and we have to
    add to or delete from both lists.  Since both connection and
    disconnection procedures perform the same order for those two lists
    (i.e. src list, then dest list), when a deletion happens during a
    connection procedure, the src list may be deleted before the dest list
    addition completes, and this may lead to a use-after-free or an Oops,
    even though the access to both lists are protected via mutex.
    
    The simple workaround for this race is to change the access order for
    the disconnection, namely, dest list, then src list.  This assures
    that the connection has been established when disconnecting, and also
    the concurrent deletion can be avoided.
    
    Reported-and-tested-by: folkert <folkert@vanheusden.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210801182754.GP890690@belle.intranet.vanheusden.com
    Link: https://lore.kernel.org/r/20210803114312.2536-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/core/seq/seq_ports.c b/sound/core/seq/seq_ports.c
index 16289aefb443..efecb8b8e7b1 100644
--- a/sound/core/seq/seq_ports.c
+++ b/sound/core/seq/seq_ports.c
@@ -532,10 +532,11 @@ static int check_and_subscribe_port(struct snd_seq_client *client,
 	return err;
 }
 
-static void delete_and_unsubscribe_port(struct snd_seq_client *client,
-					struct snd_seq_client_port *port,
-					struct snd_seq_subscribers *subs,
-					bool is_src, bool ack)
+/* called with grp->list_mutex held */
+static void __delete_and_unsubscribe_port(struct snd_seq_client *client,
+					  struct snd_seq_client_port *port,
+					  struct snd_seq_subscribers *subs,
+					  bool is_src, bool ack)
 {
 	struct snd_seq_port_subs_info *grp;
 	struct list_head *list;
@@ -543,7 +544,6 @@ static void delete_and_unsubscribe_port(struct snd_seq_client *client,
 
 	grp = is_src ? &port->c_src : &port->c_dest;
 	list = is_src ? &subs->src_list : &subs->dest_list;
-	down_write(&grp->list_mutex);
 	write_lock_irq(&grp->list_lock);
 	empty = list_empty(list);
 	if (!empty)
@@ -553,6 +553,18 @@ static void delete_and_unsubscribe_port(struct snd_seq_client *client,
 
 	if (!empty)
 		unsubscribe_port(client, port, grp, &subs->info, ack);
+}
+
+static void delete_and_unsubscribe_port(struct snd_seq_client *client,
+					struct snd_seq_client_port *port,
+					struct snd_seq_subscribers *subs,
+					bool is_src, bool ack)
+{
+	struct snd_seq_port_subs_info *grp;
+
+	grp = is_src ? &port->c_src : &port->c_dest;
+	down_write(&grp->list_mutex);
+	__delete_and_unsubscribe_port(client, port, subs, is_src, ack);
 	up_write(&grp->list_mutex);
 }
 
@@ -608,27 +620,30 @@ int snd_seq_port_disconnect(struct snd_seq_client *connector,
 			    struct snd_seq_client_port *dest_port,
 			    struct snd_seq_port_subscribe *info)
 {
-	struct snd_seq_port_subs_info *src = &src_port->c_src;
+	struct snd_seq_port_subs_info *dest = &dest_port->c_dest;
 	struct snd_seq_subscribers *subs;
 	int err = -ENOENT;
 
-	down_write(&src->list_mutex);
+	/* always start from deleting the dest port for avoiding concurrent
+	 * deletions
+	 */
+	down_write(&dest->list_mutex);
 	/* look for the connection */
-	list_for_each_entry(subs, &src->list_head, src_list) {
+	list_for_each_entry(subs, &dest->list_head, dest_list) {
 		if (match_subs_info(info, &subs->info)) {
-			atomic_dec(&subs->ref_count); /* mark as not ready */
+			__delete_and_unsubscribe_port(dest_client, dest_port,
+						      subs, false,
+						      connector->number != dest_client->number);
 			err = 0;
 			break;
 		}
 	}
-	up_write(&src->list_mutex);
+	up_write(&dest->list_mutex);
 	if (err < 0)
 		return err;
 
 	delete_and_unsubscribe_port(src_client, src_port, subs, true,
 				    connector->number != src_client->number);
-	delete_and_unsubscribe_port(dest_client, dest_port, subs, false,
-				    connector->number != dest_client->number);
 	kfree(subs);
 	return 0;
 }

commit 87db7214e292d6b53e2068311c090acad47ad272
Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Date:   Tue Aug 3 18:14:44 2021 +0200

    Revert "ACPICA: Fix memory leak caused by _CID repair function"
    
    commit 6511a8b5b7a65037340cd8ee91a377811effbc83 upstream.
    
    Revert commit c27bac0314131 ("ACPICA: Fix memory leak caused by _CID
    repair function") which is reported to cause a boot issue on Acer
    Swift 3 (SF314-51).
    
    Reported-by: Adrien Precigout <dev@asdrip.fr>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/acpi/acpica/nsrepair2.c b/drivers/acpi/acpica/nsrepair2.c
index 4c8ce483805d..a3bd6280882c 100644
--- a/drivers/acpi/acpica/nsrepair2.c
+++ b/drivers/acpi/acpica/nsrepair2.c
@@ -375,13 +375,6 @@ acpi_ns_repair_CID(struct acpi_evaluate_info *info,
 
 			(*element_ptr)->common.reference_count =
 			    original_ref_count;
-
-			/*
-			 * The original_element holds a reference from the package object
-			 * that represents _HID. Since a new element was created by _HID,
-			 * remove the reference from the _CID package.
-			 */
-			acpi_ut_remove_reference(original_element);
 		}
 
 		element_ptr++;

commit b6707ded53b0085552ec2482c763f0ed890b1700
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Fri Aug 6 14:58:13 2021 +0800

    drm/rockchip: fix error sg_dma_addr for iommu case
    
    Fixes: e68e6d1a35b7 ("drm/rockchip: add dmabuf sync partial to dma_buf_ops")
    
    Change-Id: I7499f049243b1c5bfe88793cd141730a90aef180
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
index f0850bf319c6..1d1a7dd9632d 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
@@ -1042,15 +1042,11 @@ static int rockchip_gem_prime_sgl_sync_range(struct device *dev,
 	for_each_sg(sgl, sg, nents, i) {
 		unsigned int sg_offset, sg_left, size = 0;
 
-		if (i == 0)
-			sg_dma_addr = sg_dma_address(sg);
-
 		len += sg->length;
-		if (len <= offset) {
-			sg_dma_addr += sg->length;
+		if (len <= offset)
 			continue;
-		}
 
+		sg_dma_addr = sg_dma_address(sg);
 		sg_left = len - offset;
 		sg_offset = sg->length - sg_left;
 
@@ -1064,7 +1060,6 @@ static int rockchip_gem_prime_sgl_sync_range(struct device *dev,
 
 		offset += size;
 		length -= size;
-		sg_dma_addr += sg->length;
 
 		if (length == 0)
 			break;

commit b5fcca90bf1901a4753c436aa560d0e5cfcd32d8
Author: Herman Chen <herman.chen@rock-chips.com>
Date:   Tue Aug 3 21:07:44 2021 +0800

    video: rockchip: mpp: rkvdec2: code cleanup
    
    1. Remove unused state
    The link mode process will be moved to new function.
    2. Remove reduce frequency function
    The future link mode process should not reduce hardware frequency.
    
    Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
    Change-Id: I173912e149e68aca97d5367ce92facf1af05eda7

diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2.c b/drivers/video/rockchip/mpp/mpp_rkvdec2.c
index 8b212a081d33..da37976fa9db 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvdec2.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec2.c
@@ -38,6 +38,7 @@
 #include "mpp_common.h"
 #include "mpp_iommu.h"
 #include "hack/mpp_rkvdec2_hack_rk3568.c"
+
 #define RKVDEC_DRIVER_NAME		"mpp_rkvdec2"
 
 #define	RKVDEC_SESSION_MAX_BUFFERS	40
@@ -74,6 +75,10 @@
 #define RKVDEC_READY_STA		BIT(2)
 #define RKVDEC_IRQ_RAW			BIT(1)
 #define RKVDEC_IRQ			BIT(0)
+#define RKVDEC_INT_ERROR_MASK		(RKVDEC_COLMV_REF_ERR_STA |\
+					RKVDEC_BUF_EMPTY_STA |\
+					RKVDEC_TIMEOUT_STA |\
+					RKVDEC_ERROR_STA)
 
 /* perf sel reference register */
 #define RKVDEC_PERF_SEL_OFFSET		0x20000
@@ -103,12 +108,6 @@
 #define to_rkvdec2_dev(dev)		\
 		container_of(dev, struct rkvdec2_dev, mpp)
 
-enum RKVDEC_STATE {
-	RKVDEC_STATE_NORMAL,
-	RKVDEC_STATE_LT_START,
-	RKVDEC_STATE_LT_RUN,
-};
-
 enum RKVDEC_FMT {
 	RKVDEC_FMT_H265D	= 0,
 	RKVDEC_FMT_H264D	= 1,
@@ -185,7 +184,6 @@ struct rkvdec2_dev {
 	struct reset_control *rst_cabac;
 	struct reset_control *rst_hevc_cabac;
 
-	enum RKVDEC_STATE state;
 	/* internal rcb-memory */
 	u32 sram_size;
 	u32 rcb_size;
@@ -451,52 +449,40 @@ static void *rkvdec2_rk3568_alloc_task(struct mpp_session *session,
 
 static int rkvdec2_run(struct mpp_dev *mpp, struct mpp_task *mpp_task)
 {
+	struct rkvdec2_task *task = to_rkvdec2_task(mpp_task);
+	u32 reg_en = mpp_task->hw_info->reg_en;
+	/* set cache size */
+	u32 reg = RKVDEC_CACHE_PERMIT_CACHEABLE_ACCESS |
+		  RKVDEC_CACHE_PERMIT_READ_ALLOCATE;
 	int i;
-	u32 reg_en;
-	struct rkvdec2_dev *dec = NULL;
-	struct rkvdec2_task *task = NULL;
 
 	mpp_debug_enter();
 
-	dec = to_rkvdec2_dev(mpp);
-	task = to_rkvdec2_task(mpp_task);
-	reg_en = mpp_task->hw_info->reg_en;
-	switch (dec->state) {
-	case RKVDEC_STATE_NORMAL: {
-		u32 reg;
-
-		/* set cache size */
-		reg = RKVDEC_CACHE_PERMIT_CACHEABLE_ACCESS
-			| RKVDEC_CACHE_PERMIT_READ_ALLOCATE;
-		if (!mpp_debug_unlikely(DEBUG_CACHE_32B))
-			reg |= RKVDEC_CACHE_LINE_SIZE_64_BYTES;
-
-		mpp_write_relaxed(mpp, RKVDEC_REG_CACHE0_SIZE_BASE, reg);
-		mpp_write_relaxed(mpp, RKVDEC_REG_CACHE1_SIZE_BASE, reg);
-		mpp_write_relaxed(mpp, RKVDEC_REG_CACHE2_SIZE_BASE, reg);
-		/* clear cache */
-		mpp_write_relaxed(mpp, RKVDEC_REG_CLR_CACHE0_BASE, 1);
-		mpp_write_relaxed(mpp, RKVDEC_REG_CLR_CACHE1_BASE, 1);
-		mpp_write_relaxed(mpp, RKVDEC_REG_CLR_CACHE2_BASE, 1);
-		/* set registers for hardware */
-		for (i = 0; i < task->w_req_cnt; i++) {
-			int s, e;
-			struct mpp_request *req = &task->w_reqs[i];
-
-			s = req->offset / sizeof(u32);
-			e = s + req->size / sizeof(u32);
-			mpp_write_req(mpp, task->reg, s, e, reg_en);
-		}
-		/* init current task */
-		mpp->cur_task = mpp_task;
-		/* Flush the register before the start the device */
-		wmb();
-		mpp_write(mpp, RKVDEC_REG_START_EN_BASE, task->reg[reg_en] | RKVDEC_START_EN);
-
-	} break;
-	default:
-		break;
+	if (!mpp_debug_unlikely(DEBUG_CACHE_32B))
+		reg |= RKVDEC_CACHE_LINE_SIZE_64_BYTES;
+
+	mpp_write_relaxed(mpp, RKVDEC_REG_CACHE0_SIZE_BASE, reg);
+	mpp_write_relaxed(mpp, RKVDEC_REG_CACHE1_SIZE_BASE, reg);
+	mpp_write_relaxed(mpp, RKVDEC_REG_CACHE2_SIZE_BASE, reg);
+	/* clear cache */
+	mpp_write_relaxed(mpp, RKVDEC_REG_CLR_CACHE0_BASE, 1);
+	mpp_write_relaxed(mpp, RKVDEC_REG_CLR_CACHE1_BASE, 1);
+	mpp_write_relaxed(mpp, RKVDEC_REG_CLR_CACHE2_BASE, 1);
+
+	/* set registers for hardware */
+	for (i = 0; i < task->w_req_cnt; i++) {
+		int s, e;
+		struct mpp_request *req = &task->w_reqs[i];
+
+		s = req->offset / sizeof(u32);
+		e = s + req->size / sizeof(u32);
+		mpp_write_req(mpp, task->reg, s, e, reg_en);
 	}
+	/* init current task */
+	mpp->cur_task = mpp_task;
+	/* 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_debug_leave();
 
@@ -505,29 +491,19 @@ static int rkvdec2_run(struct mpp_dev *mpp, struct mpp_task *mpp_task)
 
 static int rkvdec2_rk3568_run(struct mpp_dev *mpp, struct mpp_task *mpp_task)
 {
-	struct rkvdec2_dev *dec = NULL;
-	struct rkvdec2_task *task = NULL;
+	struct rkvdec2_task *task = to_rkvdec2_task(mpp_task);
 	int ret = 0;
 
 	mpp_debug_enter();
 
-	dec = to_rkvdec2_dev(mpp);
-	task = to_rkvdec2_task(mpp_task);
-	switch (dec->state) {
-	case RKVDEC_STATE_NORMAL:
-		/*
-		 * run fix before task processing
-		 * workaround for rk356x, fix the hw bug of cabac/cavlc switch only in h264d
-		 */
-		if (task->need_hack)
-			rkvdec2_3568_hack_fix(mpp);
-
-		ret = rkvdec2_run(mpp, mpp_task);
-
-		break;
-	default:
-		break;
-	}
+	/*
+	 * run fix before task processing
+	 * workaround for rk356x, fix the hw bug of cabac/cavlc switch only in h264d
+	 */
+	if (task->need_hack)
+		rkvdec2_3568_hack_fix(mpp);
+
+	ret = rkvdec2_run(mpp, mpp_task);
 
 	mpp_debug_leave();
 
@@ -550,7 +526,6 @@ static int rkvdec2_isr(struct mpp_dev *mpp)
 	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) {
@@ -561,26 +536,20 @@ static int rkvdec2_isr(struct mpp_dev *mpp)
 	mpp->cur_task = NULL;
 	task = to_rkvdec2_task(mpp_task);
 	task->irq_status = mpp->irq_status;
-	switch (dec->state) {
-	case RKVDEC_STATE_NORMAL:
-		mpp_debug(DEBUG_IRQ_STATUS, "irq_status: %08x\n", task->irq_status);
-		err_mask = RKVDEC_COLMV_REF_ERR_STA | RKVDEC_BUF_EMPTY_STA |
-			   RKVDEC_TIMEOUT_STA | RKVDEC_ERROR_STA;
-		if (err_mask & task->irq_status) {
-			atomic_inc(&mpp->reset_request);
-			mpp_debug(DEBUG_DUMP_ERR_REG, "irq_status: %08x\n",
-				  task->irq_status);
-			mpp_task_dump_hw_reg(mpp, mpp_task);
-		}
-
-		mpp_task_finish(mpp_task->session, mpp_task);
 
-		mpp_debug_leave();
-		return IRQ_HANDLED;
-	default:
-		goto fail;
+	mpp_debug(DEBUG_IRQ_STATUS, "irq_status: %08x\n", task->irq_status);
+	err_mask = RKVDEC_COLMV_REF_ERR_STA | RKVDEC_BUF_EMPTY_STA |
+		   RKVDEC_TIMEOUT_STA | RKVDEC_ERROR_STA;
+	if (err_mask & task->irq_status) {
+		atomic_inc(&mpp->reset_request);
+		mpp_debug(DEBUG_DUMP_ERR_REG, "irq_status: %08x\n",
+			  task->irq_status);
+		mpp_task_dump_hw_reg(mpp, mpp_task);
 	}
-fail:
+
+	mpp_task_finish(mpp_task->session, mpp_task);
+
+	mpp_debug_leave();
 	return IRQ_HANDLED;
 }
 
@@ -617,43 +586,35 @@ static int rkvdec2_finish(struct mpp_dev *mpp, struct mpp_task *mpp_task)
 	u32 i;
 	u32 dec_get;
 	s32 dec_length;
-	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
 	struct rkvdec2_task *task = to_rkvdec2_task(mpp_task);
+	struct mpp_request *req;
+	u32 s, e;
 
 	mpp_debug_enter();
 
-	switch (dec->state) {
-	case RKVDEC_STATE_NORMAL: {
-		u32 s, e;
-		struct mpp_request *req;
-
-		/* read register after running */
-		for (i = 0; i < task->r_req_cnt; i++) {
-			req = &task->r_reqs[i];
-			/* read perf register */
-			if (req->offset >= RKVDEC_PERF_SEL_OFFSET) {
-				int off = req->offset - RKVDEC_PERF_SEL_OFFSET;
+	/* read register after running */
+	for (i = 0; i < task->r_req_cnt; i++) {
+		req = &task->r_reqs[i];
+		/* read perf register */
+		if (req->offset >= RKVDEC_PERF_SEL_OFFSET) {
+			int off = req->offset - RKVDEC_PERF_SEL_OFFSET;
 
-				s = off / sizeof(u32);
-				e = s + req->size / sizeof(u32);
-				rkvdec2_read_perf_sel(mpp, task->reg_sel, s, e);
-			} else {
-				s = req->offset / sizeof(u32);
-				e = s + req->size / sizeof(u32);
-				mpp_read_req(mpp, task->reg, s, e);
-			}
+			s = off / sizeof(u32);
+			e = s + req->size / sizeof(u32);
+			rkvdec2_read_perf_sel(mpp, task->reg_sel, s, e);
+		} else {
+			s = req->offset / sizeof(u32);
+			e = s + req->size / sizeof(u32);
+			mpp_read_req(mpp, task->reg, s, e);
 		}
-		/* revert hack for irq status */
-		task->reg[RKVDEC_REG_INT_EN_INDEX] = task->irq_status;
-		/* revert hack for decoded length */
-		dec_get = mpp_read_relaxed(mpp, RKVDEC_REG_RLC_BASE);
-		dec_length = dec_get - task->strm_addr;
-		task->reg[RKVDEC_REG_RLC_BASE_INDEX] = dec_length << 10;
-		mpp_debug(DEBUG_REGISTER, "dec_get %08x dec_length %d\n", dec_get, dec_length);
-	} break;
-	default:
-		break;
 	}
+	/* revert hack for irq status */
+	task->reg[RKVDEC_REG_INT_EN_INDEX] = task->irq_status;
+	/* revert hack for decoded length */
+	dec_get = mpp_read_relaxed(mpp, RKVDEC_REG_RLC_BASE);
+	dec_length = dec_get - task->strm_addr;
+	task->reg[RKVDEC_REG_RLC_BASE_INDEX] = dec_length << 10;
+	mpp_debug(DEBUG_REGISTER, "dec_get %08x dec_length %d\n", dec_get, dec_length);
 
 	mpp_debug_leave();
 
@@ -815,6 +776,8 @@ static int rkvdec2_procfs_init(struct mpp_dev *mpp)
 			      dec->procfs, &mpp->session_max_buffers);
 	proc_create_single("perf_sel_offset", 0444,
 			   dec->procfs, rkvdec2_show_pref_sel_offset);
+	mpp_procfs_create_u32("task_count", 0644,
+			      dec->procfs, &mpp->task_index);
 
 	return 0;
 }
@@ -992,18 +955,6 @@ static int rkvdec2_set_freq(struct mpp_dev *mpp,
 	return 0;
 }
 
-static int rkvdec2_reduce_freq(struct mpp_dev *mpp)
-{
-	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
-
-	mpp_clk_set_rate(&dec->aclk_info, CLK_MODE_REDUCE);
-	mpp_clk_set_rate(&dec->core_clk_info, CLK_MODE_REDUCE);
-	mpp_clk_set_rate(&dec->cabac_clk_info, CLK_MODE_REDUCE);
-	mpp_clk_set_rate(&dec->hevc_cabac_clk_info, CLK_MODE_REDUCE);
-
-	return 0;
-}
-
 static int rkvdec2_reset(struct mpp_dev *mpp)
 {
 	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
@@ -1039,7 +990,6 @@ static struct mpp_hw_ops rkvdec_v2_hw_ops = {
 	.clk_off = rkvdec2_clk_off,
 	.get_freq = rkvdec2_get_freq,
 	.set_freq = rkvdec2_set_freq,
-	.reduce_freq = rkvdec2_reduce_freq,
 	.reset = rkvdec2_reset,
 };
 
@@ -1050,7 +1000,6 @@ static struct mpp_hw_ops rkvdec_rk3568_hw_ops = {
 	.clk_off = rkvdec2_clk_off,
 	.get_freq = rkvdec2_get_freq,
 	.set_freq = rkvdec2_set_freq,
-	.reduce_freq = rkvdec2_reduce_freq,
 	.reset = rkvdec2_reset,
 };
 
@@ -1246,7 +1195,6 @@ static int rkvdec2_probe(struct platform_device *pdev)
 	}
 
 	rkvdec2_alloc_rcbbuf(pdev, dec);
-	dec->state = RKVDEC_STATE_NORMAL;
 	mpp->session_max_buffers = RKVDEC_SESSION_MAX_BUFFERS;
 	rkvdec2_procfs_init(mpp);
 	dev_info(dev, "probing finish\n");

commit 6a3ea1ba7add2342c4889f28f3049ff90cd5d732
Author: Herman Chen <herman.chen@rock-chips.com>
Date:   Tue Aug 3 19:52:05 2021 +0800

    video: rockchip: mpp: Add process/wait/worker
    
    Add new function pointer for process task, wait task result and task
    worker thread.
    
    Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
    Change-Id: Ib0b23c90083b9acab6a8eec8db0871304dbb72ca

diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c
index 9114241ae455..343e71a0442e 100644
--- a/drivers/video/rockchip/mpp/mpp_common.c
+++ b/drivers/video/rockchip/mpp/mpp_common.c
@@ -8,6 +8,9 @@
  *	Ding Wei, leo.ding@rock-chips.com
  *
  */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
@@ -274,15 +277,8 @@ static struct mpp_session *mpp_session_init(void)
 	return session;
 }
 
-int mpp_session_deinit(struct mpp_session *session)
+static void mpp_session_deinit_default(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;
-
 	if (session->mpp) {
 		struct mpp_dev *mpp = session->mpp;
 
@@ -308,6 +304,21 @@ int mpp_session_deinit(struct mpp_session *session)
 	}
 
 	list_del_init(&session->session_link);
+}
+
+int 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;
+
+	if (likely(session->deinit))
+		session->deinit(session);
+	else
+		pr_err("invalid NULL session deinit function\n");
 
 	mpp_dbg_session("session %p:%d deinit\n", session, session->index);
 
@@ -473,14 +484,14 @@ static void mpp_task_timeout_work(struct work_struct *work_s)
 	mpp_taskqueue_pop_running(mpp->queue, task);
 }
 
-static int mpp_process_task(struct mpp_session *session,
-			    struct mpp_task_msgs *msgs)
+static int mpp_process_task_default(struct mpp_session *session,
+				struct mpp_task_msgs *msgs)
 {
 	struct mpp_task *task = NULL;
 	struct mpp_dev *mpp = session->mpp;
 
-	if (!mpp) {
-		mpp_err("pid %d not find clinet %d\n",
+	if (unlikely(!mpp)) {
+		mpp_err("pid %d clinet %d found invalid process function\n",
 			session->pid, session->device_type);
 		return -EINVAL;
 	}
@@ -518,6 +529,16 @@ static int mpp_process_task(struct mpp_session *session,
 	return 0;
 }
 
+static int mpp_process_task(struct mpp_session *session,
+			    struct mpp_task_msgs *msgs)
+{
+	if (likely(session->process_task))
+		return session->process_task(session, msgs);
+
+	pr_err("invalid NULL process task function\n");
+	return -EINVAL;
+}
+
 struct reset_control *
 mpp_reset_control_get(struct mpp_dev *mpp, enum MPP_RESET_TYPE type, const char *name)
 {
@@ -728,15 +749,15 @@ static void mpp_task_try_run(struct kthread_work *work_s)
 	}
 }
 
-static int mpp_wait_result(struct mpp_session *session,
-			   struct mpp_task_msgs *msgs)
+static int mpp_wait_result_default(struct mpp_session *session,
+			       struct mpp_task_msgs *msgs)
 {
 	int ret;
 	struct mpp_task *task;
 	struct mpp_dev *mpp = session->mpp;
 
-	if (!mpp) {
-		mpp_err("pid %d not find clinet %d\n",
+	if (unlikely(!mpp)) {
+		mpp_err("pid %d clinet %d found invalid wait result function\n",
 			session->pid, session->device_type);
 		return -EINVAL;
 	}
@@ -791,7 +812,7 @@ static int mpp_wait_result(struct mpp_session *session,
 				task, task->task_index);
 			ret = -ETIMEDOUT;
 		} else {
-			return mpp_wait_result(session, msgs);
+			return mpp_wait_result_default(session, msgs);
 		}
 	}
 
@@ -802,6 +823,16 @@ static int mpp_wait_result(struct mpp_session *session,
 	return ret;
 }
 
+static int mpp_wait_result(struct mpp_session *session,
+			   struct mpp_task_msgs *msgs)
+{
+	if (likely(session->wait_result))
+		return session->wait_result(session, msgs);
+
+	pr_err("invalid NULL wait result function\n");
+	return -EINVAL;
+}
+
 static int mpp_attach_service(struct mpp_dev *mpp, struct device *dev)
 {
 	u32 taskqueue_node = 0;
@@ -1078,8 +1109,20 @@ static int mpp_process_request(struct mpp_session *session,
 		session->device_type = (enum MPP_DEVICE_TYPE)client_type;
 		session->dma = mpp_dma_session_create(mpp->dev, mpp->session_max_buffers);
 		session->mpp = mpp;
+		if (mpp->dev_ops) {
+			if (mpp->dev_ops->process_task)
+				session->process_task =
+					mpp->dev_ops->process_task;
+
+			if (mpp->dev_ops->wait_result)
+				session->wait_result =
+					mpp->dev_ops->wait_result;
+
+			if (mpp->dev_ops->deinit)
+				session->deinit = mpp->dev_ops->deinit;
+		}
 		session->index = atomic_fetch_inc(&mpp->session_index);
-		if (mpp->dev_ops->init_session) {
+		if (mpp->dev_ops && mpp->dev_ops->init_session) {
 			ret = mpp->dev_ops->init_session(session);
 			if (ret)
 				return ret;
@@ -1330,6 +1373,9 @@ static int mpp_dev_open(struct inode *inode, struct file *filp)
 		list_add_tail(&session->service_link, &srv->session_list);
 		mutex_unlock(&srv->session_lock);
 	}
+	session->process_task = mpp_process_task_default;
+	session->wait_result = mpp_wait_result_default;
+	session->deinit = mpp_session_deinit_default;
 	filp->private_data = (void *)session;
 
 	mpp_debug_leave();
@@ -1754,18 +1800,6 @@ int mpp_dev_probe(struct mpp_dev *mpp,
 	mpp->kworker_task = kthread_run(kthread_worker_fn, &mpp->worker,
 					"%s", np->name);
 
-	/* read link table capacity */
-	ret = of_property_read_u32(np, "rockchip,task-capacity",
-				   &mpp->task_capacity);
-	if (ret) {
-		mpp->task_capacity = 1;
-		kthread_init_work(&mpp->work, mpp_task_try_run);
-	} else {
-		dev_info(dev, "%d task capacity link mode detected\n",
-			 mpp->task_capacity);
-		kthread_init_work(&mpp->work, NULL);
-	}
-
 	/* Get and attach to service */
 	ret = mpp_attach_service(mpp, dev);
 	if (ret) {
@@ -1777,6 +1811,18 @@ int mpp_dev_probe(struct mpp_dev *mpp,
 	mpp->hw_ops = mpp->var->hw_ops;
 	mpp->dev_ops = mpp->var->dev_ops;
 
+	/* read link table capacity */
+	ret = of_property_read_u32(np, "rockchip,task-capacity",
+				   &mpp->task_capacity);
+	if (ret)
+		mpp->task_capacity = 1;
+	else
+		dev_info(dev, "%d task capacity link mode detected\n",
+			 mpp->task_capacity);
+
+	kthread_init_work(&mpp->work, mpp->dev_ops->task_worker ?
+			  mpp->dev_ops->task_worker : mpp_task_try_run);
+
 	atomic_set(&mpp->reset_request, 0);
 	atomic_set(&mpp->session_index, 0);
 	atomic_set(&mpp->task_count, 0);
diff --git a/drivers/video/rockchip/mpp/mpp_common.h b/drivers/video/rockchip/mpp/mpp_common.h
index 1e4d84415bc0..75c78c9e340e 100644
--- a/drivers/video/rockchip/mpp/mpp_common.h
+++ b/drivers/video/rockchip/mpp/mpp_common.h
@@ -355,6 +355,18 @@ struct mpp_session {
 	struct list_head session_link;
 	/* private data */
 	void *priv;
+
+	/*
+	 * session handler from mpp_dev_ops
+	 * process_task - handle messages of sending task
+	 * wait_result  - handle messages of polling task
+	 * deinit	- handle session deinit
+	 */
+	int (*process_task)(struct mpp_session *session,
+			    struct mpp_task_msgs *msgs);
+	int (*wait_result)(struct mpp_session *session,
+			   struct mpp_task_msgs *msgs);
+	void (*deinit)(struct mpp_session *session);
 };
 
 /* task state in work thread */
@@ -367,6 +379,11 @@ enum mpp_task_state {
 	TASK_STATE_FINISH	= 5,
 	TASK_STATE_TIMEOUT	= 6,
 	TASK_STATE_DONE		= 7,
+
+	TASK_STATE_PREPARE	= 8,
+	TASK_STATE_ABORT	= 9,
+	TASK_STATE_ABORT_READY	= 10,
+	TASK_STATE_PROC_DONE	= 11,
 };
 
 /* The context for the a task */
@@ -464,6 +481,7 @@ struct mpp_service {
 	/* lock for session list */
 	struct mutex session_lock;
 	struct list_head session_list;
+	u32 session_count;
 };
 
 /*
@@ -502,11 +520,19 @@ struct mpp_hw_ops {
  * @result	Read status to userspace.
  * @free_task	Release the resource allocate which alloc.
  * @ioctl	Special cammand from userspace.
- * @open	Open a instance for hardware when set client.
- * @release	Specific instance release operation for hardware.
- * @free	Specific instance free operation for hardware.
+ * @init_session extra initialization on session init.
+ * @free_session extra cleanup on session deinit.
+ * @dump_session information dump for session.
+ * @dump_dev    information dump for hardware device.
  */
 struct mpp_dev_ops {
+	int (*process_task)(struct mpp_session *session,
+			    struct mpp_task_msgs *msgs);
+	int (*wait_result)(struct mpp_session *session,
+			   struct mpp_task_msgs *msgs);
+	void (*deinit)(struct mpp_session *session);
+	void (*task_worker)(struct kthread_work *work_s);
+
 	void *(*alloc_task)(struct mpp_session *session,
 			    struct mpp_task_msgs *msgs);
 	void *(*prepare)(struct mpp_dev *mpp, struct mpp_task *task);
@@ -522,6 +548,7 @@ struct mpp_dev_ops {
 	int (*init_session)(struct mpp_session *session);
 	int (*free_session)(struct mpp_session *session);
 	int (*dump_session)(struct mpp_session *session, struct seq_file *seq);
+	int (*dump_dev)(struct mpp_dev *mpp);
 };
 
 struct mpp_taskqueue *mpp_taskqueue_init(struct device *dev);

commit 167b70d89d6b658df76aeb5f7434092fd1314eff
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Wed Aug 11 11:21:00 2021 +0800

    dt-bindings: sound: rockchip: Remove unused rockchip-audio.txt
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: I66906fd849b5bcb58cab24640ad7c59f22551b0b

diff --git a/Documentation/devicetree/bindings/sound/rockchip-audio.txt b/Documentation/devicetree/bindings/sound/rockchip-audio.txt
deleted file mode 100644
index 55025950dfef..000000000000
--- a/Documentation/devicetree/bindings/sound/rockchip-audio.txt
+++ /dev/null
@@ -1,133 +0,0 @@
-* Rockchip Audio controller
-
-Required SoC Specific Properties:
-
-- compatible : "rk3036-audio"
-- reg: physical base address of the controller and length of memory mapped
-  region.
-- clocks: must include clock specifiers corresponding to entries in the
-  clock-names property.
-- clocks-names: list of clock names sorted in the same order as the clocks
-  property. Must contain "rockchip-i2s" and "rk3036-codec".
-- interrupts: interrupt number to the cpu.
-- dmas: list of DMA controller phandle and DMA request line ordered pairs.
-- dma-names: identifier string for each DMA request line in the dmas property.
-  These strings correspond 1:1 with the ordered pairs in dmas.
-- pinctrl-names: must contain a "default" entry.
-- pinctrl-0: pin control group to be used for this controller.
-- pinctrl-1: pin control group to be used for gpio.
-
-Example:
-
-rockchip-audio {
-	compatible = "rk3036-audio";
-	dais {
-		dai0 {
-			audio-codec = <&codec>;
-			audio-controller = <&i2s>;
-			format = "i2s";
-			//continuous-clock;
-			//bitclock-inversion;
-			//frame-inversion;
-			//bitclock-master;
-			//frame-master;
-		};
-	};
-};
-
-
-- compatible : "audio-rk312x"
-- reg: physical base address of the controller and length of memory mapped
-  region.
-- clocks: must include clock specifiers corresponding to entries in the
-  clock-names property.
-- clocks-names: list of clock names sorted in the same order as the clocks
-  property. Must contain "rockchip-i2s" and "rk3036-codec".
-- interrupts: interrupt number to the cpu.
-- dmas: list of DMA controller phandle and DMA request line ordered pairs.
-- dma-names: identifier string for each DMA request line in the dmas property.
-  These strings correspond 1:1 with the ordered pairs in dmas.
-- pinctrl-names: must contain a "default" entry.
-- pinctrl-0: pin control group to be used for this controller.
-- pinctrl-1: pin control group to be used for gpio.
-
-Example:
-
-rockchip-audio {
-        compatible = "audio-rk312x";
-        dais {
-                dai0 {
-                        audio-codec = <&codec>;
-                        audio-controller = <&i2s1>;
-                        format = "i2s";
-                        //continuous-clock;
-                        //bitclock-inversion;
-                        //frame-inversion;
-                        //bitclock-master;
-                        //frame-master;
-                };
-        };
-};
-
-
-- compatible : "rk312x-spdif"
-- reg: physical base address of the controller and length of memory mapped
-  region.
-- clocks: must include clock specifiers corresponding to entries in the
-  clock-names property.
-- clocks-names: list of clock names sorted in the same order as the clocks
-  property. Must contain "rockchip-i2s" and "rk3036-codec".
-- interrupts: interrupt number to the cpu.
-- dmas: list of DMA controller phandle and DMA request line ordered pairs.
-- dma-names: identifier string for each DMA request line in the dmas property.
-  These strings correspond 1:1 with the ordered pairs in dmas.
-- pinctrl-names: must contain a "default" entry.
-- pinctrl-0: pin control group to be used for this controller.
-- pinctrl-1: pin control group to be used for gpio.
-
-Example:
-
-spdif: spdif@10204000 {
-	compatible = "rk312x-spdif";
-	reg = <0x10204000 0x1000>;
-	clocks = <&clk_spdif>, <&clk_gates10 9>;
-	clock-names = "spdif_8ch_mclk", "spdif_hclk";
-	interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
-	dmas = <&pdma 13>;
-	//#dma-cells = <1>;
-	dma-names = "tx";
-	pinctrl-names = "default";
-	pinctrl-0 = <&spdif_tx>;
-};
-
-
-
-- compatible : "rk312x-codec"
-- reg: physical base address of the controller and length of memory mapped
-  region.
-- clocks: must include clock specifiers corresponding to entries in the
-  clock-names property.
-- clocks-names: list of clock names sorted in the same order as the clocks
-  property. Must contain "rockchip-i2s" and "rk3036-codec".
-- interrupts: interrupt number to the cpu.
-- dmas: list of DMA controller phandle and DMA request line ordered pairs.
-- dma-names: identifier string for each DMA request line in the dmas property.
-  These strings correspond 1:1 with the ordered pairs in dmas.
-- pinctrl-names: must contain a "default" entry.
-- pinctrl-0: pin control group to be used for this controller.
-- pinctrl-1: pin control group to be used for gpio.
-
-Example:
-
-codec: codec@20030000 {
-	compatible = "rk312x-codec";
-	reg = <0x20030000 0x1000>;
-	spk_ctl_io = <&gpio1 GPIO_A3 0>;
-	//pinctrl-names = "default";
-	//pinctrl-0 = <&i2s_gpio>;
-
-	boot_depop = <1>;
-	pa_enable_time = <1000>;
-	clocks = <&clk_gates5 14>;
-	clock-names = "g_pclk_acodec";
-};

commit d5ab87cf4f58b1d82817231b587d5f70eb7267d6
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Wed Aug 11 17:44:27 2021 +0800

    input: touchscreen: vtl_ts: remove unused fw dat files
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: I8f8ea8d4797dede8f3eb61f4a16bacffb23c3257

diff --git a/drivers/input/touchscreen/vtl_ts/LX20JS06_A1_CT363_V03_5198_121015.dat b/drivers/input/touchscreen/vtl_ts/LX20JS06_A1_CT363_V03_5198_121015.dat
deleted file mode 100755
index dd2c3d8b25b4..000000000000
--- a/drivers/input/touchscreen/vtl_ts/LX20JS06_A1_CT363_V03_5198_121015.dat
+++ /dev/null
@@ -1,4096 +0,0 @@
-  0x02, 0x65, 0x1E, 0x02, 0x00, 0x3F, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x02, 0x78, 0xC9, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x02, 0x27, 0xFF, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x02, 0x65, 0x17, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x02, 0x64, 0xE8, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x02, 0x78, 0xA0, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x02, 0x27, 0xFC, 0x75, 0x86,
-  0x09, 0x75, 0x84, 0x9C, 0xD2, 0xA9, 0x22, 0x32,
-  0x90, 0x3F, 0xF0, 0x74, 0x56, 0xF0, 0xA3, 0x74,
-  0x54, 0xF0, 0xA3, 0x74, 0x4C, 0xF0, 0x22, 0x78,
-  0xE4, 0x7C, 0x12, 0x7D, 0x01, 0x7B, 0xFF, 0x7A,
-  0x78, 0x79, 0x7D, 0x7E, 0x00, 0x7F, 0x05, 0x12,
-  0x59, 0x49, 0x90, 0x12, 0xF2, 0x12, 0x5B, 0x94,
-  0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x12, 0xF6, 0x12,
-  0x5B, 0x94, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0A,
-  0x7C, 0x13, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x78,
-  0x79, 0x82, 0x7E, 0x00, 0x7F, 0x0A, 0x12, 0x59,
-  0x49, 0x78, 0x14, 0x7C, 0x13, 0x7D, 0x01, 0x7B,
-  0xFF, 0x7A, 0x78, 0x79, 0x8C, 0x7E, 0x00, 0x7F,
-  0x14, 0x12, 0x59, 0x49, 0xC2, 0x1A, 0xE4, 0x90,
-  0xED, 0x9F, 0x0F, 0x6F, 0xED, 0x6D, 0x0F, 0x6F,
-  0xED, 0x6C, 0x0F, 0x6F, 0xEC, 0xF6, 0x8B, 0xFC,
-  0xF0, 0x30, 0x15, 0x0A, 0x90, 0x88, 0xB0, 0xE0,
-  0x90, 0x88, 0xC1, 0xF0, 0x80, 0x05, 0xE4, 0x90,
-  0x88, 0xC1, 0xF0, 0xE4, 0x90, 0x12, 0xDF, 0xF0,
-  0xC2, 0x0F, 0xC2, 0x11, 0x90, 0x13, 0x09, 0xE0,
-  0xFF, 0x90, 0x88, 0xC1, 0xE0, 0xD3, 0x9F, 0x40,
-  0x03, 0x02, 0x03, 0xB1, 0x90, 0x88, 0xC0, 0xE0,
-  0x9F, 0x40, 0x03, 0x02, 0x03, 0xB1, 0xE4, 0xF0,
-  0x75, 0x9E, 0x55, 0x90, 0x12, 0xDB, 0xF0, 0x90,
-  0x12, 0xDB, 0xE0, 0xFF, 0xC3, 0x95, 0x0D, 0x40,
-  0x03, 0x02, 0x03, 0x71, 0x75, 0x9E, 0x55, 0x74,
-  0xE5, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5,
-  0x83, 0xE0, 0x64, 0x01, 0x60, 0x15, 0x90, 0x12,
-  0xDB, 0xE0, 0x24, 0xE5, 0xF5, 0x82, 0xE4, 0x34,
-  0x88, 0xF5, 0x83, 0xE0, 0x64, 0x02, 0x60, 0x03,
-  0x02, 0x03, 0x59, 0x90, 0x12, 0xDB, 0xE0, 0xFF,
-  0x90, 0x88, 0xC0, 0xE0, 0x24, 0x04, 0xF5, 0x82,
-  0xE4, 0x34, 0x13, 0xF5, 0x83, 0xEF, 0xF0, 0x74,
-  0xE5, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5,
-  0x83, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x12, 0xDC,
-  0xF0, 0x90, 0x88, 0xC1, 0xE0, 0xFF, 0x90, 0x12,
-  0xDC, 0xE0, 0xFE, 0xC3, 0x9F, 0x40, 0x03, 0x02,
-  0x03, 0x51, 0x75, 0x9E, 0x55, 0x90, 0x12, 0xDB,
-  0xE0, 0xFF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x50,
-  0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xE0,
-  0xFC, 0xA3, 0xE0, 0xFD, 0xEE, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xF2,
-  0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xC3, 0x9D,
-  0xEA, 0x9C, 0x40, 0x36, 0xEF, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x50, 0xF5, 0x82, 0xE4, 0x34, 0xF2,
-  0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90,
-  0x12, 0xDC, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x00, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83,
-  0xE0, 0xFC, 0xA3, 0xE0, 0xC3, 0x9F, 0xFF, 0xEC,
-  0x9E, 0x90, 0x12, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
-  0x80, 0x37, 0x90, 0x12, 0xDC, 0xE0, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34,
-  0xF2, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-  0x90, 0x12, 0xDB, 0xE0, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x50, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5,
-  0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xC3, 0x9F, 0xFF,
-  0xEC, 0x9E, 0x90, 0x12, 0xEE, 0xF0, 0xA3, 0xEF,
-  0xF0, 0x90, 0x12, 0xDB, 0xE0, 0xFF, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x52, 0xF5, 0x82, 0xE4, 0x34,
-  0xF2, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD,
-  0x90, 0x12, 0xDC, 0xE0, 0xFE, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xF2,
-  0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xC3, 0x9D,
-  0xEA, 0x9C, 0x40, 0x33, 0xEF, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0xF2,
-  0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEE,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82,
-  0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xE0, 0xFE, 0xA3,
-  0xE0, 0xC3, 0x9D, 0xFF, 0xEE, 0x9C, 0x90, 0x12,
-  0xF0, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x37, 0x90,
-  0x12, 0xDC, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x02, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83,
-  0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x12, 0xDB,
-  0xE0, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x52, 0xF5,
-  0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xE0, 0xFC,
-  0xA3, 0xE0, 0xC3, 0x9F, 0xFF, 0xEC, 0x9E, 0x90,
-  0x12, 0xF0, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x12,
-  0xF0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xFB, 0xAA,
-  0x06, 0xE4, 0xF9, 0xF8, 0x90, 0x12, 0xF0, 0xE0,
-  0xA3, 0xE0, 0xE4, 0xFC, 0xFD, 0x12, 0x5A, 0x34,
-  0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07,
-  0x90, 0x12, 0xEE, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-  0xFB, 0xAA, 0x06, 0xE4, 0xF9, 0xF8, 0x90, 0x12,
-  0xEE, 0xE0, 0xA3, 0xE0, 0xE4, 0xFC, 0xFD, 0x12,
-  0x5A, 0x34, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01,
-  0xD0, 0x00, 0xEF, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE,
-  0xED, 0x39, 0xFD, 0xEC, 0x38, 0xFC, 0x90, 0x88,
-  0xC0, 0xE0, 0x75, 0xF0, 0x14, 0xA4, 0x24, 0xB4,
-  0xF5, 0x82, 0xE4, 0x34, 0x37, 0xF5, 0x83, 0xC0,
-  0x83, 0xC0, 0x82, 0x90, 0x12, 0xDC, 0xE0, 0xD0,
-  0x82, 0xD0, 0x83, 0x75, 0xF0, 0x04, 0x12, 0x5B,
-  0xC5, 0x12, 0x5B, 0x88, 0x90, 0x88, 0xC0, 0xE0,
-  0x75, 0xF0, 0x14, 0xA4, 0x24, 0xB4, 0xF5, 0x82,
-  0xE4, 0x34, 0x37, 0xF5, 0x83, 0xC0, 0x83, 0xC0,
-  0x82, 0x90, 0x12, 0xDC, 0xE0, 0xD0, 0x82, 0xD0,
-  0x83, 0x75, 0xF0, 0x04, 0x12, 0x5B, 0xC5, 0xE0,
-  0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3,
-  0xE0, 0xFF, 0xE4, 0x7B, 0x32, 0xFA, 0xF9, 0xF8,
-  0xD3, 0x12, 0x5B, 0x51, 0x40, 0x02, 0xD2, 0x1A,
-  0x90, 0x12, 0xDC, 0xE0, 0x04, 0xF0, 0x02, 0x01,
-  0x49, 0x90, 0x88, 0xC0, 0xE0, 0x04, 0xF0, 0x80,
-  0x0F, 0x90, 0x12, 0xDB, 0xE0, 0x24, 0xE5, 0xF5,
-  0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0,
-  0x90, 0x12, 0xDB, 0xE0, 0x04, 0xF0, 0x02, 0x00,
-  0xEF, 0xE4, 0x90, 0x12, 0xDC, 0xF0, 0x90, 0x13,
-  0x09, 0xE0, 0xFF, 0x90, 0x12, 0xDC, 0xE0, 0xFE,
-  0xC3, 0x9F, 0x50, 0x2D, 0x90, 0x88, 0xC1, 0xE0,
-  0xFF, 0xEE, 0xC3, 0x9F, 0x50, 0x0F, 0x74, 0xA0,
-  0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x37, 0xF5, 0x83,
-  0x74, 0x01, 0xF0, 0x80, 0x0C, 0x74, 0xA0, 0x2E,
-  0xF5, 0x82, 0xE4, 0x34, 0x37, 0xF5, 0x83, 0xE4,
-  0xF0, 0x90, 0x12, 0xDC, 0xE0, 0x04, 0xF0, 0x80,
-  0xC5, 0x75, 0x9E, 0x55, 0x90, 0x13, 0x09, 0xE0,
-  0xFF, 0x90, 0x88, 0xC1, 0xE0, 0xD3, 0x9F, 0x40,
-  0x03, 0x02, 0x1B, 0x20, 0x90, 0x88, 0xC0, 0xE0,
-  0x9F, 0x40, 0x03, 0x02, 0x1B, 0x20, 0x30, 0x1A,
-  0x03, 0x02, 0x1B, 0x20, 0xE0, 0x94, 0x00, 0x50,
-  0x03, 0x02, 0x18, 0x51, 0x90, 0x88, 0xC1, 0xE0,
-  0xD3, 0x94, 0x00, 0x50, 0x03, 0x02, 0x18, 0x51,
-  0xE0, 0xFF, 0x90, 0x88, 0xC0, 0xE0, 0xD3, 0x9F,
-  0x40, 0x03, 0x02, 0x0E, 0x23, 0x90, 0x88, 0xC0,
-  0xE0, 0x24, 0xE3, 0xF5, 0x82, 0xE4, 0x34, 0x12,
-  0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x88, 0xC1, 0xE0,
-  0xFE, 0xEF, 0x6E, 0x70, 0x03, 0x02, 0x06, 0x01,
-  0x75, 0x9E, 0x55, 0xE4, 0x90, 0x12, 0xDA, 0xF0,
-  0x90, 0x88, 0xC1, 0xE0, 0xFF, 0x90, 0x12, 0xDA,
-  0xE0, 0xFE, 0xC3, 0x9F, 0x50, 0x14, 0x74, 0xE9,
-  0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83,
-  0xE4, 0xF0, 0x90, 0x12, 0xDA, 0xE0, 0x04, 0xF0,
-  0x80, 0xDE, 0xC2, 0x19, 0xE4, 0x90, 0x12, 0xDA,
-  0xF0, 0x90, 0x88, 0xC0, 0xE0, 0xFF, 0x90, 0x12,
-  0xDA, 0xE0, 0xFE, 0xC3, 0x9F, 0x50, 0x4E, 0x74,
-  0xE4, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5,
-  0x83, 0xE0, 0xFF, 0x90, 0x88, 0xC1, 0xE0, 0xFE,
-  0xEF, 0xB5, 0x06, 0x04, 0xD2, 0x19, 0x80, 0x35,
-  0x74, 0xE9, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x12,
-  0xF5, 0x83, 0xE0, 0x70, 0x1C, 0x90, 0x12, 0xDA,
-  0xE0, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x12,
-  0xF5, 0x83, 0xE0, 0x24, 0xE9, 0xF5, 0x82, 0xE4,
-  0x34, 0x12, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x80,
-  0x04, 0xD2, 0x19, 0x80, 0x08, 0x90, 0x12, 0xDA,
-  0xE0, 0x04, 0xF0, 0x80, 0xA4, 0x90, 0x12, 0xF6,
-  0x12, 0x5B, 0x94, 0x00, 0x00, 0x00, 0x00, 0x30,
-  0x19, 0x03, 0x02, 0x05, 0x9E, 0xE4, 0x90, 0x12,
-  0xDA, 0xF0, 0x90, 0x88, 0xC0, 0xE0, 0xFF, 0x90,
-  0x12, 0xDA, 0xE0, 0xFE, 0xC3, 0x9F, 0x50, 0x77,
-  0xE0, 0xFF, 0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34,
-  0x12, 0xF5, 0x83, 0xE0, 0xFD, 0x74, 0xFA, 0x2F,
-  0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xED,
-  0xF0, 0x90, 0x12, 0xF6, 0xE0, 0xF8, 0xA3, 0xE0,
-  0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xEE,
-  0x75, 0xF0, 0x14, 0xA4, 0x24, 0xB4, 0xF5, 0x82,
-  0xE4, 0x34, 0x37, 0xF5, 0x83, 0xC0, 0x83, 0xC0,
-  0x82, 0x90, 0x12, 0xDA, 0xE0, 0x24, 0xE4, 0xF5,
-  0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE0, 0xD0,
-  0x82, 0xD0, 0x83, 0x75, 0xF0, 0x04, 0x12, 0x5B,
-  0xC5, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0,
-  0xFE, 0xA3, 0xE0, 0xFF, 0xEB, 0x2F, 0xFF, 0xEA,
-  0x3E, 0xFE, 0xE9, 0x3D, 0xFD, 0xE8, 0x3C, 0xFC,
-  0x90, 0x12, 0xF6, 0x12, 0x5B, 0x88, 0x90, 0x12,
-  0xDA, 0xE0, 0x04, 0xF0, 0x02, 0x04, 0xB2, 0x90,
-  0x12, 0xF2, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3,
-  0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xF8,
-  0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0,
-  0xFB, 0xC3, 0x12, 0x5B, 0x51, 0x50, 0x47, 0x90,
-  0x12, 0xF6, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3,
-  0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x12, 0xF2,
-  0x12, 0x5B, 0x88, 0xE4, 0x90, 0x12, 0xDA, 0xF0,
-  0x90, 0x88, 0xC0, 0xE0, 0xFF, 0x90, 0x12, 0xDA,
-  0xE0, 0xFE, 0xC3, 0x9F, 0x50, 0x20, 0x74, 0xFA,
-  0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83,
-  0xE0, 0xFF, 0x74, 0xFF, 0x2E, 0xF5, 0x82, 0xE4,
-  0x34, 0x12, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x12,
-  0xDA, 0xE0, 0x04, 0xF0, 0x80, 0xD2, 0xC2, 0x18,
-  0xE4, 0x90, 0x12, 0xDA, 0xF0, 0x90, 0x88, 0xC0,
-  0xE0, 0x14, 0xFF, 0x90, 0x12, 0xDA, 0xE0, 0xFE,
-  0xC3, 0x9F, 0x50, 0x3E, 0x74, 0xE4, 0x2E, 0xF5,
-  0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE0, 0xFF,
-  0x90, 0x88, 0xC1, 0xE0, 0xFE, 0xEF, 0xB5, 0x06,
-  0x21, 0x90, 0x12, 0xDA, 0xE0, 0xFF, 0x24, 0xE4,
-  0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE4,
-  0xF0, 0x74, 0xE5, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
-  0x12, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0xD2, 0x18,
-  0x80, 0x08, 0x90, 0x12, 0xDA, 0xE0, 0x04, 0xF0,
-  0x80, 0xB3, 0x30, 0x18, 0x03, 0x02, 0x03, 0xF5,
-  0x90, 0x12, 0xE4, 0xE0, 0x04, 0xF0, 0x02, 0x03,
-  0xF5, 0x90, 0x88, 0xC0, 0xE0, 0x90, 0x12, 0xE0,
-  0xF0, 0xE4, 0x90, 0x12, 0xDA, 0xF0, 0x90, 0x12,
-  0xE0, 0xE0, 0xFF, 0x90, 0x12, 0xDA, 0xE0, 0xFE,
-  0xC3, 0x9F, 0x40, 0x03, 0x02, 0x18, 0x51, 0xE0,
-  0xFF, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x13,
-  0xF5, 0x83, 0xE0, 0x90, 0x12, 0xE2, 0xF0, 0x74,
-  0xFF, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5,
-  0x83, 0xE0, 0x90, 0x12, 0xE1, 0xF0, 0xC2, 0x0F,
-  0xC2, 0x11, 0xEE, 0x75, 0xF0, 0x14, 0xA4, 0x24,
-  0xB4, 0xF5, 0x82, 0xE4, 0x34, 0x37, 0xF5, 0x83,
-  0xC0, 0x83, 0xC0, 0x82, 0x90, 0x12, 0xE1, 0xE0,
-  0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x04, 0x12,
-  0x5B, 0xC5, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3,
-  0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x74, 0xFF, 0xFB,
-  0xFA, 0xF9, 0xF8, 0xD3, 0x12, 0x5B, 0x51, 0x50,
-  0x03, 0x02, 0x0E, 0x1A, 0x90, 0x12, 0xDA, 0xE0,
-  0x75, 0xF0, 0x14, 0xA4, 0x24, 0xB4, 0xF5, 0x82,
-  0xE4, 0x34, 0x37, 0xF5, 0x83, 0xC0, 0x83, 0xC0,
-  0x82, 0x90, 0x12, 0xE1, 0xE0, 0xD0, 0x82, 0xD0,
-  0x83, 0x75, 0xF0, 0x04, 0x12, 0x5B, 0xC5, 0xE0,
-  0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3,
-  0xE0, 0xFF, 0xE4, 0x7B, 0xE0, 0x7A, 0x2E, 0xF9,
-  0xF8, 0xC3, 0x12, 0x5B, 0x51, 0x50, 0x57, 0x90,
-  0x12, 0xE1, 0xE0, 0xFF, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5,
-  0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x12,
-  0xE2, 0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x00, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83,
-  0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34,
-  0xF2, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD,
-  0xEE, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEC, 0xF0,
-  0xA3, 0xED, 0xF0, 0x02, 0x09, 0xEC, 0x90, 0x12,
-  0xDA, 0xE0, 0x75, 0xF0, 0x14, 0xA4, 0x24, 0xB4,
-  0xF5, 0x82, 0xE4, 0x34, 0x37, 0xF5, 0x83, 0xC0,
-  0x83, 0xC0, 0x82, 0x90, 0x12, 0xE1, 0xE0, 0xD0,
-  0x82, 0xD0, 0x83, 0x75, 0xF0, 0x04, 0x12, 0x5B,
-  0xC5, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0,
-  0xFE, 0xA3, 0xE0, 0xFF, 0xE4, 0x7B, 0xB8, 0x7A,
-  0x0B, 0xF9, 0xF8, 0xC3, 0x12, 0x5B, 0x51, 0x40,
-  0x03, 0x02, 0x08, 0x35, 0x90, 0x12, 0xE1, 0xE0,
-  0xFD, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5,
-  0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xA3, 0xE0,
-  0x25, 0xE0, 0xFF, 0x05, 0x82, 0xD5, 0x82, 0x02,
-  0x15, 0x83, 0x15, 0x82, 0xE0, 0x33, 0xFE, 0x90,
-  0x12, 0xE2, 0xE0, 0xFC, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0x2F, 0xFF, 0xEA,
-  0x3E, 0xFE, 0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x00, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83,
-  0xE0, 0xFA, 0xA3, 0xE0, 0x2F, 0xFF, 0xEA, 0x3E,
-  0xFE, 0xEF, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE,
-  0x13, 0xD8, 0xF9, 0xFF, 0xEC, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x89,
-  0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90,
-  0x12, 0xE1, 0xE0, 0xFD, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5,
-  0x83, 0xA3, 0xE0, 0x25, 0xE0, 0xFF, 0x05, 0x82,
-  0xD5, 0x82, 0x02, 0x15, 0x83, 0x15, 0x82, 0xE0,
-  0x33, 0xFE, 0x90, 0x12, 0xE2, 0xE0, 0xFC, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4,
-  0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0,
-  0x2F, 0xFF, 0xEA, 0x3E, 0xFE, 0xED, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34,
-  0xF2, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0x2F,
-  0xFF, 0xEA, 0x3E, 0xFE, 0xEF, 0x78, 0x02, 0xCE,
-  0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xEC,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82,
-  0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0xA3,
-  0xEF, 0xF0, 0x02, 0x09, 0xEC, 0x90, 0x12, 0xDA,
-  0xE0, 0x75, 0xF0, 0x14, 0xA4, 0x24, 0xB4, 0xF5,
-  0x82, 0xE4, 0x34, 0x37, 0xF5, 0x83, 0xC0, 0x83,
-  0xC0, 0x82, 0x90, 0x12, 0xE1, 0xE0, 0xD0, 0x82,
-  0xD0, 0x83, 0x75, 0xF0, 0x04, 0x12, 0x5B, 0xC5,
-  0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE,
-  0xA3, 0xE0, 0xFF, 0xE4, 0x7B, 0xDC, 0x7A, 0x05,
-  0xF9, 0xF8, 0xC3, 0x12, 0x5B, 0x51, 0x40, 0x03,
-  0x02, 0x09, 0x06, 0x90, 0x12, 0xE2, 0xE0, 0xFD,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82,
-  0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3,
-  0xE0, 0xFF, 0x90, 0x12, 0xE1, 0xE0, 0xFC, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4,
-  0x34, 0xF2, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0,
-  0x2F, 0xFF, 0xEA, 0x3E, 0xC3, 0x13, 0xFE, 0xEF,
-  0x13, 0xFF, 0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x00, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83,
-  0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x12, 0xE2,
-  0xE0, 0xFD, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02,
-  0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0,
-  0xFE, 0xA3, 0xE0, 0xFF, 0xEC, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xF2,
-  0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0x2F, 0xFF,
-  0xEA, 0x3E, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF,
-  0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0,
-  0xA3, 0xEF, 0xF0, 0x02, 0x09, 0xEC, 0x90, 0x12,
-  0xE2, 0xE0, 0xFD, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x00, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83,
-  0xA3, 0xE0, 0x25, 0xE0, 0xFF, 0x05, 0x82, 0xD5,
-  0x82, 0x02, 0x15, 0x83, 0x15, 0x82, 0xE0, 0x33,
-  0xFE, 0x90, 0x12, 0xE1, 0xE0, 0xFC, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34,
-  0xF2, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0x2F,
-  0xFF, 0xEA, 0x3E, 0xFE, 0xED, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x89,
-  0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0x2F, 0xFF,
-  0xEA, 0x3E, 0xFE, 0xEF, 0x78, 0x02, 0xCE, 0xC3,
-  0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x12,
-  0xE2, 0xE0, 0xFD, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x00, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83,
-  0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xED, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34,
-  0x89, 0xF5, 0x83, 0xA3, 0xE0, 0x25, 0xE0, 0xFF,
-  0x05, 0x82, 0xD5, 0x82, 0x02, 0x15, 0x83, 0x15,
-  0x82, 0xE0, 0x33, 0xFE, 0xEC, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xF2,
-  0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0x2F, 0xFF,
-  0xEC, 0x3E, 0xFE, 0x90, 0x12, 0xE2, 0xE0, 0xFD,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82,
-  0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFA, 0xA3,
-  0xE0, 0x2F, 0xFF, 0xEA, 0x3E, 0xFE, 0xEF, 0x78,
-  0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9,
-  0xFF, 0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02,
-  0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE,
-  0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x12, 0xE2, 0xE0,
-  0xFF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x50, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFC,
-  0xA3, 0xE0, 0xFD, 0xEF, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xC3, 0x9D, 0xFF,
-  0xEE, 0x9C, 0xFE, 0x12, 0x78, 0xF1, 0x90, 0x13,
-  0x28, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x12,
-  0xE2, 0xE0, 0xFF, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x52, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83,
-  0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEF, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34,
-  0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xC3,
-  0x9D, 0xFF, 0xEE, 0x9C, 0xFE, 0x12, 0x78, 0xF1,
-  0x90, 0x13, 0x2A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
-  0x90, 0x13, 0x2A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-  0x90, 0x13, 0x29, 0xE0, 0x2F, 0xFF, 0x90, 0x13,
-  0x28, 0xE0, 0x3E, 0xFE, 0x90, 0x13, 0x2C, 0xF0,
-  0xA3, 0xEF, 0xF0, 0xD3, 0x94, 0x0C, 0xEE, 0x94,
-  0x00, 0x40, 0x4A, 0x90, 0x12, 0xE2, 0xE0, 0xFF,
-  0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5,
-  0x83, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x0E, 0x74,
-  0x81, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5,
-  0x83, 0xE0, 0x24, 0xFC, 0xF0, 0x90, 0x12, 0xE2,
-  0xE0, 0xFF, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34,
-  0x12, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x01, 0x50,
-  0x0C, 0x74, 0x81, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
-  0x12, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xF1, 0x0A,
-  0x74, 0x01, 0xF0, 0x80, 0x66, 0x90, 0x12, 0xE2,
-  0xE0, 0xFF, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34,
-  0x12, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x74, 0x81,
-  0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83,
-  0xE0, 0xD3, 0x94, 0x16, 0x40, 0x18, 0x90, 0x12,
-  0xE2, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34,
-  0x12, 0xF5, 0x83, 0x74, 0x16, 0xF0, 0x90, 0xF1,
-  0x0A, 0x74, 0x02, 0xF0, 0x80, 0x29, 0x90, 0x12,
-  0x92, 0xE0, 0xD3, 0x94, 0x00, 0x50, 0x08, 0x90,
-  0x12, 0x60, 0xE0, 0x94, 0x00, 0x40, 0x09, 0x30,
-  0x04, 0x06, 0x90, 0xF1, 0x0A, 0x74, 0x01, 0xF0,
-  0x90, 0x12, 0x93, 0xE0, 0xD3, 0x94, 0x00, 0x40,
-  0x06, 0x90, 0xF1, 0x0A, 0x74, 0x01, 0xF0, 0xC2,
-  0x0F, 0xC2, 0x11, 0x90, 0x12, 0xE2, 0xE0, 0xFF,
-  0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5,
-  0x83, 0xE0, 0xFD, 0x90, 0x13, 0x2C, 0xE0, 0xFA,
-  0xA3, 0xE0, 0xFB, 0xD3, 0x9D, 0xEA, 0x94, 0x00,
-  0x40, 0x13, 0xD2, 0x0F, 0xD2, 0x11, 0x74, 0x77,
-  0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83,
-  0x74, 0x01, 0xF0, 0x80, 0x04, 0xC2, 0x0F, 0xC2,
-  0x11, 0x90, 0x12, 0xE2, 0xE0, 0x24, 0x77, 0xF5,
-  0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE0, 0xB4,
-  0x01, 0x13, 0xD3, 0xEB, 0x94, 0x01, 0xEA, 0x94,
-  0x00, 0x40, 0x06, 0xD2, 0x0F, 0xD2, 0x11, 0x80,
-  0x04, 0xC2, 0x0F, 0xC2, 0x11, 0x90, 0x12, 0xE2,
-  0xE0, 0xFF, 0x24, 0xC0, 0xF5, 0x82, 0xE4, 0x34,
-  0x12, 0xF5, 0x83, 0xE0, 0x64, 0x01, 0x60, 0x03,
-  0x02, 0x0C, 0x7F, 0x90, 0x12, 0xE1, 0xE0, 0xFE,
-  0x24, 0x0A, 0xF5, 0x82, 0xE4, 0x34, 0x13, 0xF5,
-  0x83, 0xE0, 0xFD, 0x74, 0xCA, 0x2F, 0xF5, 0x82,
-  0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE0, 0xC3, 0x9D,
-  0x50, 0x4D, 0xC2, 0x0D, 0x90, 0x12, 0xE2, 0xE0,
-  0x24, 0x3C, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5,
-  0x83, 0xE0, 0xFD, 0xEE, 0x25, 0xE0, 0x24, 0x14,
-  0xF5, 0x82, 0xE4, 0x34, 0x13, 0xF5, 0x83, 0xE0,
-  0xFA, 0xA3, 0xE0, 0xD3, 0x9D, 0x74, 0x80, 0xF8,
-  0xEA, 0x64, 0x80, 0x98, 0x50, 0x10, 0x74, 0xCA,
-  0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83,
-  0xE0, 0x04, 0xF0, 0x02, 0x0C, 0x81, 0x90, 0x12,
-  0xE2, 0xE0, 0x24, 0xCA, 0xF5, 0x82, 0xE4, 0x34,
-  0x12, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x72, 0x90,
-  0x12, 0xE2, 0xE0, 0xFF, 0x24, 0xC0, 0xF5, 0x82,
-  0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE4, 0xF0, 0x74,
-  0xCA, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5,
-  0x83, 0xE4, 0xF0, 0xEF, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x94, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5,
-  0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x12,
-  0xE2, 0xE0, 0xFD, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x00, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83,
-  0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xED, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34,
-  0x12, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-  0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0,
-  0xA3, 0xEF, 0xF0, 0xD2, 0x0D, 0x80, 0x02, 0xD2,
-  0x0D, 0x30, 0x01, 0x57, 0x90, 0x12, 0xE1, 0xE0,
-  0xFF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5,
-  0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xE0, 0xFC,
-  0xA3, 0xE0, 0xFD, 0x90, 0x12, 0xE2, 0xE0, 0xFE,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0x50, 0xF5, 0x82,
-  0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEC, 0xF0, 0xA3,
-  0xED, 0xF0, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x02, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83,
-  0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEE, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x52, 0xF5, 0x82, 0xE4, 0x34,
-  0x89, 0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0,
-  0x02, 0x0D, 0x60, 0x20, 0x0F, 0x03, 0x02, 0x0D,
-  0x60, 0x30, 0x11, 0x7C, 0x30, 0x0D, 0x79, 0x90,
-  0x13, 0x2C, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3,
-  0x94, 0x78, 0xEE, 0x94, 0x00, 0x40, 0x06, 0x90,
-  0x12, 0x92, 0xE0, 0x04, 0xF0, 0xD3, 0xEF, 0x94,
-  0x72, 0xEE, 0x94, 0x01, 0x40, 0x06, 0x90, 0x12,
-  0x93, 0xE0, 0x04, 0xF0, 0x90, 0x12, 0xE2, 0xE0,
-  0xFF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFC,
-  0xA3, 0xE0, 0xFD, 0xEF, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x50, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x12,
-  0xE2, 0xE0, 0xFF, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83,
-  0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEF, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x52, 0xF5, 0x82, 0xE4, 0x34,
-  0x89, 0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0,
-  0x90, 0x12, 0xE1, 0xE0, 0xFF, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xF2,
-  0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90,
-  0x12, 0xE2, 0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x50, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5,
-  0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4,
-  0x34, 0xF2, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0,
-  0xFD, 0xEE, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x52,
-  0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xEC,
-  0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x12, 0xE1, 0xE0,
-  0xFF, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x8A,
-  0xF5, 0x83, 0xE0, 0xFE, 0x90, 0x12, 0xE2, 0xE0,
-  0xFD, 0x24, 0x14, 0xF5, 0x82, 0xE4, 0x34, 0x8A,
-  0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x28, 0x2F, 0xF5,
-  0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xFF,
-  0x74, 0x3C, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8A,
-  0xF5, 0x83, 0xEF, 0xF0, 0x74, 0xE5, 0x2D, 0xF5,
-  0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0x74, 0x02,
-  0xF0, 0x90, 0x12, 0xE1, 0xE0, 0x24, 0xA0, 0xF5,
-  0x82, 0xE4, 0x34, 0x37, 0xF5, 0x83, 0xE4, 0xF0,
-  0x90, 0x12, 0xDF, 0xE0, 0x04, 0xF0, 0x90, 0x88,
-  0xC0, 0xE0, 0x14, 0xF0, 0x90, 0x88, 0xC1, 0xE0,
-  0x14, 0xF0, 0x90, 0x12, 0xDA, 0xE0, 0x04, 0xF0,
-  0x02, 0x06, 0x0E, 0x90, 0x88, 0xC1, 0xE0, 0x24,
-  0xE3, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83,
-  0xE0, 0xFF, 0x90, 0x88, 0xC0, 0xE0, 0xFE, 0xEF,
-  0x6E, 0x70, 0x03, 0x02, 0x10, 0x2F, 0x75, 0x9E,
-  0x55, 0xE4, 0x90, 0x12, 0xDA, 0xF0, 0x90, 0x88,
-  0xC0, 0xE0, 0xFF, 0x90, 0x12, 0xDA, 0xE0, 0xFE,
-  0xC3, 0x9F, 0x50, 0x14, 0x74, 0xE9, 0x2E, 0xF5,
-  0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE4, 0xF0,
-  0x90, 0x12, 0xDA, 0xE0, 0x04, 0xF0, 0x80, 0xDE,
-  0xC2, 0x19, 0xE4, 0x90, 0x12, 0xDA, 0xF0, 0x90,
-  0x88, 0xC1, 0xE0, 0xFF, 0x90, 0x12, 0xDA, 0xE0,
-  0xFE, 0xC3, 0x9F, 0x50, 0x4E, 0x74, 0xE4, 0x2E,
-  0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE0,
-  0xFF, 0x90, 0x88, 0xC0, 0xE0, 0xFE, 0xEF, 0xB5,
-  0x06, 0x04, 0xD2, 0x19, 0x80, 0x35, 0x74, 0xE9,
-  0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83,
-  0xE0, 0x70, 0x1C, 0x90, 0x12, 0xDA, 0xE0, 0x24,
-  0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83,
-  0xE0, 0x24, 0xE9, 0xF5, 0x82, 0xE4, 0x34, 0x12,
-  0xF5, 0x83, 0x74, 0x01, 0xF0, 0x80, 0x04, 0xD2,
-  0x19, 0x80, 0x08, 0x90, 0x12, 0xDA, 0xE0, 0x04,
-  0xF0, 0x80, 0xA4, 0x90, 0x12, 0xF6, 0x12, 0x5B,
-  0x94, 0x00, 0x00, 0x00, 0x00, 0x30, 0x19, 0x03,
-  0x02, 0x0F, 0xCC, 0xE4, 0x90, 0x12, 0xDA, 0xF0,
-  0x90, 0x88, 0xC1, 0xE0, 0xFF, 0x90, 0x12, 0xDA,
-  0xE0, 0xFE, 0xC3, 0x9F, 0x50, 0x77, 0xE0, 0xFF,
-  0x24, 0xE4, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5,
-  0x83, 0xE0, 0xFD, 0x74, 0xFA, 0x2F, 0xF5, 0x82,
-  0xE4, 0x34, 0x12, 0xF5, 0x83, 0xED, 0xF0, 0x90,
-  0x12, 0xF6, 0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3,
-  0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x74, 0xE4, 0x2E,
-  0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE0,
-  0x75, 0xF0, 0x14, 0xA4, 0x24, 0xB4, 0xF5, 0x82,
-  0xE4, 0x34, 0x37, 0xF5, 0x83, 0xC0, 0x83, 0xC0,
-  0x82, 0x90, 0x12, 0xDA, 0xE0, 0xD0, 0x82, 0xD0,
-  0x83, 0x75, 0xF0, 0x04, 0x12, 0x5B, 0xC5, 0xE0,
-  0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3,
-  0xE0, 0xFF, 0xEB, 0x2F, 0xFF, 0xEA, 0x3E, 0xFE,
-  0xE9, 0x3D, 0xFD, 0xE8, 0x3C, 0xFC, 0x90, 0x12,
-  0xF6, 0x12, 0x5B, 0x88, 0x90, 0x12, 0xDA, 0xE0,
-  0x04, 0xF0, 0x02, 0x0E, 0xE0, 0x90, 0x12, 0xF2,
-  0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE,
-  0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xF8, 0xA3, 0xE0,
-  0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xC3,
-  0x12, 0x5B, 0x51, 0x50, 0x47, 0x90, 0x12, 0xF6,
-  0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE,
-  0xA3, 0xE0, 0xFF, 0x90, 0x12, 0xF2, 0x12, 0x5B,
-  0x88, 0xE4, 0x90, 0x12, 0xDA, 0xF0, 0x90, 0x88,
-  0xC1, 0xE0, 0xFF, 0x90, 0x12, 0xDA, 0xE0, 0xFE,
-  0xC3, 0x9F, 0x50, 0x20, 0x74, 0xFA, 0x2E, 0xF5,
-  0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE0, 0xFF,
-  0x74, 0xFF, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x12,
-  0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x12, 0xDA, 0xE0,
-  0x04, 0xF0, 0x80, 0xD2, 0xC2, 0x18, 0xE4, 0x90,
-  0x12, 0xDA, 0xF0, 0x90, 0x88, 0xC1, 0xE0, 0x14,
-  0xFF, 0x90, 0x12, 0xDA, 0xE0, 0xFE, 0xC3, 0x9F,
-  0x50, 0x3E, 0x74, 0xE4, 0x2E, 0xF5, 0x82, 0xE4,
-  0x34, 0x12, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x88,
-  0xC0, 0xE0, 0xFE, 0xEF, 0xB5, 0x06, 0x21, 0x90,
-  0x12, 0xDA, 0xE0, 0xFF, 0x24, 0xE4, 0xF5, 0x82,
-  0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE4, 0xF0, 0x74,
-  0xE5, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5,
-  0x83, 0xE0, 0x04, 0xF0, 0xD2, 0x18, 0x80, 0x08,
-  0x90, 0x12, 0xDA, 0xE0, 0x04, 0xF0, 0x80, 0xB3,
-  0x30, 0x18, 0x03, 0x02, 0x0E, 0x23, 0x90, 0x12,
-  0xE4, 0xE0, 0x04, 0xF0, 0x02, 0x0E, 0x23, 0x90,
-  0x88, 0xC1, 0xE0, 0x90, 0x12, 0xE0, 0xF0, 0xE4,
-  0x90, 0x12, 0xDA, 0xF0, 0x90, 0x12, 0xE0, 0xE0,
-  0xFF, 0x90, 0x12, 0xDA, 0xE0, 0xC3, 0x9F, 0x40,
-  0x03, 0x02, 0x18, 0x51, 0xE0, 0xFF, 0x24, 0xFF,
-  0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE0,
-  0xFE, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x13,
-  0xF5, 0x83, 0xE0, 0x90, 0x12, 0xE2, 0xF0, 0x90,
-  0x12, 0xE1, 0xEF, 0xF0, 0xC2, 0x0F, 0xC2, 0x11,
-  0xEE, 0x75, 0xF0, 0x14, 0xA4, 0x24, 0xB4, 0xF5,
-  0x82, 0xE4, 0x34, 0x37, 0xF5, 0x83, 0xC0, 0x83,
-  0xC0, 0x82, 0x90, 0x12, 0xDA, 0xE0, 0xD0, 0x82,
-  0xD0, 0x83, 0x75, 0xF0, 0x04, 0x12, 0x5B, 0xC5,
-  0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE,
-  0xA3, 0xE0, 0xFF, 0x74, 0xFF, 0xFB, 0xFA, 0xF9,
-  0xF8, 0xD3, 0x12, 0x5B, 0x51, 0x50, 0x03, 0x02,
-  0x18, 0x48, 0x90, 0x12, 0xDA, 0xE0, 0x75, 0xF0,
-  0x14, 0xA4, 0x24, 0xB4, 0xF5, 0x82, 0xE4, 0x34,
-  0x37, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0x90,
-  0x12, 0xE1, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75,
-  0xF0, 0x04, 0x12, 0x5B, 0xC5, 0xE0, 0xFC, 0xA3,
-  0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-  0xE4, 0x7B, 0xE0, 0x7A, 0x2E, 0xF9, 0xF8, 0xC3,
-  0x12, 0x5B, 0x51, 0x50, 0x57, 0x90, 0x12, 0xE1,
-  0xE0, 0xFF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00,
-  0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xE0,
-  0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x12, 0xE2, 0xE0,
-  0xFE, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEC, 0xF0,
-  0xA3, 0xED, 0xF0, 0xEF, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5,
-  0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEE, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4,
-  0x34, 0x89, 0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED,
-  0xF0, 0x02, 0x14, 0x1A, 0x90, 0x12, 0xDA, 0xE0,
-  0x75, 0xF0, 0x14, 0xA4, 0x24, 0xB4, 0xF5, 0x82,
-  0xE4, 0x34, 0x37, 0xF5, 0x83, 0xC0, 0x83, 0xC0,
-  0x82, 0x90, 0x12, 0xE1, 0xE0, 0xD0, 0x82, 0xD0,
-  0x83, 0x75, 0xF0, 0x04, 0x12, 0x5B, 0xC5, 0xE0,
-  0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3,
-  0xE0, 0xFF, 0xE4, 0x7B, 0xB8, 0x7A, 0x0B, 0xF9,
-  0xF8, 0xC3, 0x12, 0x5B, 0x51, 0x40, 0x03, 0x02,
-  0x12, 0x63, 0x90, 0x12, 0xE1, 0xE0, 0xFD, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4,
-  0x34, 0xF2, 0xF5, 0x83, 0xA3, 0xE0, 0x25, 0xE0,
-  0xFF, 0x05, 0x82, 0xD5, 0x82, 0x02, 0x15, 0x83,
-  0x15, 0x82, 0xE0, 0x33, 0xFE, 0x90, 0x12, 0xE2,
-  0xE0, 0xFC, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00,
-  0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0,
-  0xFA, 0xA3, 0xE0, 0x2F, 0xFF, 0xEA, 0x3E, 0xFE,
-  0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5,
-  0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xE0, 0xFA,
-  0xA3, 0xE0, 0x2F, 0xFF, 0xEA, 0x3E, 0xFE, 0xEF,
-  0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8,
-  0xF9, 0xFF, 0xEC, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x00, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83,
-  0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x12, 0xE1,
-  0xE0, 0xFD, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02,
-  0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xA3,
-  0xE0, 0x25, 0xE0, 0xFF, 0x05, 0x82, 0xD5, 0x82,
-  0x02, 0x15, 0x83, 0x15, 0x82, 0xE0, 0x33, 0xFE,
-  0x90, 0x12, 0xE2, 0xE0, 0xFC, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89,
-  0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0x2F, 0xFF,
-  0xEA, 0x3E, 0xFE, 0xED, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5,
-  0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0x2F, 0xFF, 0xEA,
-  0x3E, 0xFE, 0xEF, 0x78, 0x02, 0xCE, 0xC3, 0x13,
-  0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xEC, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34,
-  0x89, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
-  0x02, 0x14, 0x1A, 0x90, 0x12, 0xDA, 0xE0, 0x75,
-  0xF0, 0x14, 0xA4, 0x24, 0xB4, 0xF5, 0x82, 0xE4,
-  0x34, 0x37, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82,
-  0x90, 0x12, 0xE1, 0xE0, 0xD0, 0x82, 0xD0, 0x83,
-  0x75, 0xF0, 0x04, 0x12, 0x5B, 0xC5, 0xE0, 0xFC,
-  0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0,
-  0xFF, 0xE4, 0x7B, 0xDC, 0x7A, 0x05, 0xF9, 0xF8,
-  0xC3, 0x12, 0x5B, 0x51, 0x40, 0x03, 0x02, 0x13,
-  0x34, 0x90, 0x12, 0xE2, 0xE0, 0xFD, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34,
-  0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-  0x90, 0x12, 0xE1, 0xE0, 0xFC, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xF2,
-  0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0x2F, 0xFF,
-  0xEA, 0x3E, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF,
-  0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0,
-  0xA3, 0xEF, 0xF0, 0x90, 0x12, 0xE2, 0xE0, 0xFD,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82,
-  0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3,
-  0xE0, 0xFF, 0xEC, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x02, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83,
-  0xE0, 0xFA, 0xA3, 0xE0, 0x2F, 0xFF, 0xEA, 0x3E,
-  0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xED, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4,
-  0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF,
-  0xF0, 0x02, 0x14, 0x1A, 0x90, 0x12, 0xE2, 0xE0,
-  0xFD, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xA3, 0xE0,
-  0x25, 0xE0, 0xFF, 0x05, 0x82, 0xD5, 0x82, 0x02,
-  0x15, 0x83, 0x15, 0x82, 0xE0, 0x33, 0xFE, 0x90,
-  0x12, 0xE1, 0xE0, 0xFC, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5,
-  0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0x2F, 0xFF, 0xEA,
-  0x3E, 0xFE, 0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x00, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83,
-  0xE0, 0xFA, 0xA3, 0xE0, 0x2F, 0xFF, 0xEA, 0x3E,
-  0xFE, 0xEF, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE,
-  0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x12, 0xE2, 0xE0,
-  0xFD, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0,
-  0xA3, 0xEF, 0xF0, 0xED, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xA3, 0xE0, 0x25, 0xE0, 0xFF, 0x05, 0x82,
-  0xD5, 0x82, 0x02, 0x15, 0x83, 0x15, 0x82, 0xE0,
-  0x33, 0xFE, 0xEC, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x02, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83,
-  0xE0, 0xFC, 0xA3, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E,
-  0xFE, 0x90, 0x12, 0xE2, 0xE0, 0xFD, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34,
-  0x89, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0x2F,
-  0xFF, 0xEA, 0x3E, 0xFE, 0xEF, 0x78, 0x02, 0xCE,
-  0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xED,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82,
-  0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0xA3,
-  0xEF, 0xF0, 0x90, 0x12, 0xE2, 0xE0, 0xFF, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x50, 0xF5, 0x82, 0xE4,
-  0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0,
-  0xFD, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00,
-  0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0,
-  0xFE, 0xA3, 0xE0, 0xC3, 0x9D, 0xFF, 0xEE, 0x9C,
-  0xFE, 0x12, 0x78, 0xF1, 0x90, 0x13, 0x28, 0xEE,
-  0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x12, 0xE2, 0xE0,
-  0xFF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x52, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFC,
-  0xA3, 0xE0, 0xFD, 0xEF, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xC3, 0x9D, 0xFF,
-  0xEE, 0x9C, 0xFE, 0x12, 0x78, 0xF1, 0x90, 0x13,
-  0x2A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x13,
-  0x2A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x13,
-  0x29, 0xE0, 0x2F, 0xFF, 0x90, 0x13, 0x28, 0xE0,
-  0x3E, 0xFE, 0x90, 0x13, 0x2C, 0xF0, 0xA3, 0xEF,
-  0xF0, 0xD3, 0x94, 0x0C, 0xEE, 0x94, 0x00, 0x40,
-  0x4A, 0x90, 0x12, 0xE2, 0xE0, 0xFF, 0x24, 0x81,
-  0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE0,
-  0xD3, 0x94, 0x04, 0x40, 0x0E, 0x74, 0x81, 0x2F,
-  0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE0,
-  0x24, 0xFC, 0xF0, 0x90, 0x12, 0xE2, 0xE0, 0xFF,
-  0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5,
-  0x83, 0xE0, 0xC3, 0x94, 0x01, 0x50, 0x0C, 0x74,
-  0x81, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5,
-  0x83, 0xE4, 0xF0, 0x90, 0xF1, 0x0A, 0x74, 0x01,
-  0xF0, 0x80, 0x66, 0x90, 0x12, 0xE2, 0xE0, 0xFF,
-  0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5,
-  0x83, 0xE0, 0x04, 0xF0, 0x74, 0x81, 0x2F, 0xF5,
-  0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE0, 0xD3,
-  0x94, 0x16, 0x40, 0x18, 0x90, 0x12, 0xE2, 0xE0,
-  0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5,
-  0x83, 0x74, 0x16, 0xF0, 0x90, 0xF1, 0x0A, 0x74,
-  0x02, 0xF0, 0x80, 0x29, 0x90, 0x12, 0x92, 0xE0,
-  0xD3, 0x94, 0x00, 0x50, 0x08, 0x90, 0x12, 0x60,
-  0xE0, 0x94, 0x00, 0x40, 0x09, 0x30, 0x04, 0x06,
-  0x90, 0xF1, 0x0A, 0x74, 0x01, 0xF0, 0x90, 0x12,
-  0x93, 0xE0, 0xD3, 0x94, 0x00, 0x40, 0x06, 0x90,
-  0xF1, 0x0A, 0x74, 0x01, 0xF0, 0xC2, 0x0F, 0xC2,
-  0x11, 0x90, 0x12, 0xE2, 0xE0, 0xFF, 0x24, 0x81,
-  0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE0,
-  0xFD, 0x90, 0x13, 0x2C, 0xE0, 0xFA, 0xA3, 0xE0,
-  0xFB, 0xD3, 0x9D, 0xEA, 0x94, 0x00, 0x40, 0x13,
-  0xD2, 0x0F, 0xD2, 0x11, 0x74, 0x77, 0x2F, 0xF5,
-  0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0x74, 0x01,
-  0xF0, 0x80, 0x04, 0xC2, 0x0F, 0xC2, 0x11, 0x90,
-  0x12, 0xE2, 0xE0, 0x24, 0x77, 0xF5, 0x82, 0xE4,
-  0x34, 0x12, 0xF5, 0x83, 0xE0, 0xB4, 0x01, 0x13,
-  0xD3, 0xEB, 0x94, 0x01, 0xEA, 0x94, 0x00, 0x40,
-  0x06, 0xD2, 0x0F, 0xD2, 0x11, 0x80, 0x04, 0xC2,
-  0x0F, 0xC2, 0x11, 0x90, 0x12, 0xE2, 0xE0, 0xFF,
-  0x24, 0xC0, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5,
-  0x83, 0xE0, 0x64, 0x01, 0x60, 0x03, 0x02, 0x16,
-  0xAD, 0x90, 0x12, 0xE1, 0xE0, 0xFE, 0x24, 0x0A,
-  0xF5, 0x82, 0xE4, 0x34, 0x13, 0xF5, 0x83, 0xE0,
-  0xFD, 0x74, 0xCA, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
-  0x12, 0xF5, 0x83, 0xE0, 0xC3, 0x9D, 0x50, 0x4D,
-  0xC2, 0x0D, 0x90, 0x12, 0xE2, 0xE0, 0x24, 0x3C,
-  0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0,
-  0xFD, 0xEE, 0x25, 0xE0, 0x24, 0x14, 0xF5, 0x82,
-  0xE4, 0x34, 0x13, 0xF5, 0x83, 0xE0, 0xFA, 0xA3,
-  0xE0, 0xD3, 0x9D, 0x74, 0x80, 0xF8, 0xEA, 0x64,
-  0x80, 0x98, 0x50, 0x10, 0x74, 0xCA, 0x2F, 0xF5,
-  0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE0, 0x04,
-  0xF0, 0x02, 0x16, 0xAF, 0x90, 0x12, 0xE2, 0xE0,
-  0x24, 0xCA, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5,
-  0x83, 0xE4, 0xF0, 0x80, 0x72, 0x90, 0x12, 0xE2,
-  0xE0, 0xFF, 0x24, 0xC0, 0xF5, 0x82, 0xE4, 0x34,
-  0x12, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xCA, 0x2F,
-  0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE4,
-  0xF0, 0xD2, 0x0D, 0xEF, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x94, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5,
-  0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x12,
-  0xE2, 0xE0, 0xFD, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x00, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83,
-  0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xED, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34,
-  0x12, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-  0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0,
-  0xA3, 0xEF, 0xF0, 0x80, 0x02, 0xD2, 0x0D, 0x30,
-  0x01, 0x57, 0x90, 0x12, 0xE1, 0xE0, 0xFF, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4,
-  0x34, 0xF2, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0,
-  0xFD, 0x90, 0x12, 0xE2, 0xE0, 0xFE, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x50, 0xF5, 0x82, 0xE4, 0x34,
-  0x89, 0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0,
-  0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5,
-  0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xE0, 0xFC,
-  0xA3, 0xE0, 0xFD, 0xEE, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x02, 0x17,
-  0x8E, 0x20, 0x0F, 0x03, 0x02, 0x17, 0x8E, 0x30,
-  0x11, 0x7C, 0x30, 0x0D, 0x79, 0x90, 0x13, 0x2C,
-  0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x94, 0x78,
-  0xEE, 0x94, 0x00, 0x40, 0x06, 0x90, 0x12, 0x92,
-  0xE0, 0x04, 0xF0, 0xD3, 0xEF, 0x94, 0x72, 0xEE,
-  0x94, 0x01, 0x40, 0x06, 0x90, 0x12, 0x93, 0xE0,
-  0x04, 0xF0, 0x90, 0x12, 0xE2, 0xE0, 0xFF, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4,
-  0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0,
-  0xFD, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x50,
-  0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEC,
-  0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x12, 0xE2, 0xE0,
-  0xFF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFC,
-  0xA3, 0xE0, 0xFD, 0xEF, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x12,
-  0xE1, 0xE0, 0xFF, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x00, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83,
-  0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x12, 0xE2,
-  0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x50,
-  0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xEC,
-  0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xF2,
-  0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEE,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0x52, 0xF5, 0x82,
-  0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xEC, 0xF0, 0xA3,
-  0xED, 0xF0, 0x90, 0x12, 0xE1, 0xE0, 0xFF, 0x24,
-  0x00, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83,
-  0xE0, 0xFE, 0x90, 0x12, 0xE2, 0xE0, 0xFD, 0x24,
-  0x14, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83,
-  0xEE, 0xF0, 0x74, 0x28, 0x2F, 0xF5, 0x82, 0xE4,
-  0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x3C,
-  0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83,
-  0xEF, 0xF0, 0x74, 0xE5, 0x2D, 0xF5, 0x82, 0xE4,
-  0x34, 0x88, 0xF5, 0x83, 0x74, 0x02, 0xF0, 0x90,
-  0x12, 0xE1, 0xE0, 0x24, 0xA0, 0xF5, 0x82, 0xE4,
-  0x34, 0x37, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x12,
-  0xDF, 0xE0, 0x04, 0xF0, 0x90, 0x88, 0xC0, 0xE0,
-  0x14, 0xF0, 0x90, 0x88, 0xC1, 0xE0, 0x14, 0xF0,
-  0x90, 0x12, 0xDA, 0xE0, 0x04, 0xF0, 0x02, 0x10,
-  0x3C, 0x90, 0x12, 0xDF, 0xE0, 0xC3, 0x95, 0x0D,
-  0x40, 0x03, 0x02, 0x18, 0xE0, 0x90, 0x88, 0xC0,
-  0xE0, 0x94, 0x00, 0x40, 0x7B, 0xE4, 0x90, 0x12,
-  0xDB, 0xF0, 0x90, 0x12, 0xDB, 0xE0, 0xFF, 0xC3,
-  0x95, 0x0D, 0x50, 0x6C, 0x74, 0xE5, 0x2F, 0xF5,
-  0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0x64,
-  0x04, 0x70, 0x55, 0x90, 0x12, 0xDF, 0xE0, 0xC3,
-  0x95, 0x0D, 0x50, 0x4C, 0x90, 0x12, 0xDB, 0xE0,
-  0x24, 0xE5, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5,
-  0x83, 0x74, 0x03, 0xF0, 0x74, 0x77, 0x2F, 0xF5,
-  0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE4, 0xF0,
-  0x90, 0x88, 0xC0, 0xE0, 0x14, 0xF0, 0x90, 0x12,
-  0xDF, 0xE0, 0x04, 0xF0, 0x74, 0xD1, 0x2F, 0xF5,
-  0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0,
-  0x74, 0xCA, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x12,
-  0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xC0, 0x2F, 0xF5,
-  0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE4, 0xF0,
-  0x90, 0x12, 0xDB, 0xE0, 0x04, 0xF0, 0x80, 0x8A,
-  0x90, 0x12, 0xDF, 0xE0, 0xC3, 0x95, 0x0D, 0x40,
-  0x03, 0x02, 0x26, 0x16, 0x90, 0x88, 0xC1, 0xE0,
-  0x94, 0x00, 0x50, 0x03, 0x02, 0x26, 0x16, 0xE4,
-  0x90, 0x12, 0xDC, 0xF0, 0x90, 0x88, 0xB0, 0xE0,
-  0xFF, 0x90, 0x12, 0xDC, 0xE0, 0xFE, 0xC3, 0x9F,
-  0x40, 0x03, 0x02, 0x26, 0x16, 0x74, 0xA0, 0x2E,
-  0xF5, 0x82, 0xE4, 0x34, 0x37, 0xF5, 0x83, 0xE0,
-  0x70, 0x03, 0x02, 0x1B, 0x17, 0xE4, 0x90, 0x12,
-  0xDB, 0xF0, 0x90, 0x12, 0xDB, 0xE0, 0xFF, 0xC3,
-  0x95, 0x0D, 0x40, 0x03, 0x02, 0x1B, 0x17, 0x74,
-  0xE5, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5,
-  0x83, 0xE0, 0x60, 0x03, 0x02, 0x1B, 0x0E, 0x90,
-  0x12, 0xDF, 0xE0, 0xC3, 0x95, 0x0D, 0x40, 0x03,
-  0x02, 0x1B, 0x0E, 0x90, 0x12, 0xDC, 0xE0, 0xFF,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82,
-  0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xE0, 0xFC, 0xA3,
-  0xE0, 0xFD, 0x90, 0x12, 0xDB, 0xE0, 0xFE, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x50, 0xF5, 0x82, 0xE4,
-  0x34, 0xF2, 0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED,
-  0xF0, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02,
-  0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xE0,
-  0xFC, 0xA3, 0xE0, 0xFD, 0xEE, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0xF2,
-  0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90,
-  0x12, 0xDC, 0xE0, 0xFF, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5,
-  0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEE, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4,
-  0x34, 0x89, 0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED,
-  0xF0, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02,
-  0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xE0,
-  0xFC, 0xA3, 0xE0, 0xFD, 0xEE, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89,
-  0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90,
-  0x12, 0xDC, 0xE0, 0xFF, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5,
-  0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEE, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x50, 0xF5, 0x82, 0xE4,
-  0x34, 0x89, 0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED,
-  0xF0, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02,
-  0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xE0,
-  0xFC, 0xA3, 0xE0, 0xFD, 0xEE, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x89,
-  0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90,
-  0x12, 0xDC, 0xE0, 0xFF, 0x24, 0x00, 0xF5, 0x82,
-  0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xFE, 0x90,
-  0x12, 0xDB, 0xE0, 0xFD, 0x24, 0x14, 0xF5, 0x82,
-  0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEE, 0xF0, 0x74,
-  0x28, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5,
-  0x83, 0xE0, 0xFF, 0x74, 0x3C, 0x2D, 0xF5, 0x82,
-  0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEF, 0xF0, 0x74,
-  0xC0, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5,
-  0x83, 0x74, 0x01, 0xF0, 0x90, 0x12, 0xDC, 0xE0,
-  0xFF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5,
-  0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xE0, 0xFC,
-  0xA3, 0xE0, 0xFD, 0x90, 0x12, 0xDB, 0xE0, 0xFE,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0x94, 0xF5, 0x82,
-  0xE4, 0x34, 0x12, 0xF5, 0x83, 0xEC, 0xF0, 0xA3,
-  0xED, 0xF0, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x02, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83,
-  0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEE, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34,
-  0x12, 0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0,
-  0x74, 0xE5, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x88,
-  0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0x12, 0xDC,
-  0xE0, 0x24, 0xA0, 0xF5, 0x82, 0xE4, 0x34, 0x37,
-  0xF5, 0x83, 0xE4, 0xF0, 0x74, 0xD1, 0x2E, 0xF5,
-  0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0,
-  0x90, 0x88, 0xC1, 0xE0, 0x14, 0xF0, 0x90, 0x12,
-  0xDF, 0xE0, 0x04, 0xF0, 0x80, 0x09, 0x90, 0x12,
-  0xDB, 0xE0, 0x04, 0xF0, 0x02, 0x19, 0x22, 0x90,
-  0x12, 0xDC, 0xE0, 0x04, 0xF0, 0x02, 0x18, 0xFC,
-  0xE4, 0x90, 0x88, 0xC0, 0xF0, 0xF5, 0xDC, 0xF5,
-  0xDD, 0xF5, 0xDE, 0x90, 0x12, 0xDB, 0xF0, 0x90,
-  0x12, 0xDB, 0xE0, 0xFF, 0xC3, 0x95, 0x0D, 0x50,
-  0x5A, 0x74, 0xE5, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
-  0x88, 0xF5, 0x83, 0xE0, 0x64, 0x01, 0x60, 0x20,
-  0x90, 0x12, 0xDB, 0xE0, 0x24, 0xE5, 0xF5, 0x82,
-  0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0x64, 0x02,
-  0x60, 0x0E, 0x74, 0xE5, 0x2F, 0xF5, 0x82, 0xE4,
-  0x34, 0x88, 0xF5, 0x83, 0xE0, 0xB4, 0x04, 0x14,
-  0x90, 0x88, 0xC0, 0xE0, 0x04, 0xF0, 0x90, 0x12,
-  0xDB, 0xE0, 0xFF, 0x7B, 0x01, 0xE4, 0xFD, 0x12,
-  0x4C, 0x38, 0x80, 0x0F, 0x90, 0x12, 0xDB, 0xE0,
-  0x24, 0xE5, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5,
-  0x83, 0xE4, 0xF0, 0x90, 0x12, 0xDB, 0xE0, 0x04,
-  0xF0, 0x80, 0x9C, 0xE4, 0xF5, 0xD9, 0xF5, 0xDA,
-  0xF5, 0xDB, 0x90, 0x12, 0xDC, 0xF0, 0x90, 0x88,
-  0xC1, 0xE0, 0xFE, 0x90, 0x12, 0xDC, 0xE0, 0xFF,
-  0xC3, 0x9E, 0x50, 0x0E, 0xE4, 0xFB, 0xFD, 0x12,
-  0x4C, 0x38, 0x90, 0x12, 0xDC, 0xE0, 0x04, 0xF0,
-  0x80, 0xE4, 0x90, 0x88, 0xC0, 0xE0, 0xFF, 0x90,
-  0x88, 0xC1, 0xE0, 0xC3, 0x9F, 0x50, 0x07, 0xE0,
-  0x90, 0x12, 0xE3, 0xF0, 0x80, 0x08, 0x90, 0x88,
-  0xC0, 0xE0, 0x90, 0x12, 0xE3, 0xF0, 0xE4, 0x90,
-  0x12, 0xDD, 0xF0, 0x90, 0x12, 0xE3, 0xE0, 0xFF,
-  0x90, 0x12, 0xDD, 0xE0, 0xC3, 0x9F, 0x40, 0x03,
-  0x02, 0x23, 0x57, 0xC2, 0x0F, 0xC2, 0x11, 0xD2,
-  0xB4, 0x20, 0xB4, 0x06, 0x30, 0x0E, 0x03, 0x20,
-  0xDD, 0x05, 0x75, 0x9E, 0x55, 0x80, 0xF2, 0xC2,
-  0xDD, 0xC2, 0x0E, 0xAF, 0xE2, 0xEF, 0xFE, 0xAD,
-  0xE3, 0x7C, 0x00, 0xE4, 0x2D, 0xFF, 0xEC, 0x3E,
-  0xAD, 0x07, 0xFC, 0xC3, 0xED, 0x94, 0x20, 0xEC,
-  0x94, 0x4E, 0x40, 0x03, 0x02, 0x23, 0x57, 0xED,
-  0x94, 0xC8, 0xEC, 0x94, 0x00, 0x40, 0x57, 0xAF,
-  0xDF, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00,
-  0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xE0,
-  0xFE, 0xA3, 0xE0, 0xFF, 0xAB, 0xE1, 0xEB, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4,
-  0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF,
-  0xF0, 0xAF, 0xDF, 0xEF, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5,
-  0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xAB, 0xE1,
-  0xEB, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0,
-  0xA3, 0xEF, 0xF0, 0x02, 0x1E, 0xFC, 0xD3, 0xED,
-  0x94, 0x64, 0xEC, 0x94, 0x00, 0x50, 0x03, 0x02,
-  0x1D, 0x73, 0xAF, 0xDF, 0xEF, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xF2,
-  0xF5, 0x83, 0xA3, 0xE0, 0x25, 0xE0, 0xFF, 0x05,
-  0x82, 0xD5, 0x82, 0x02, 0x15, 0x83, 0x15, 0x82,
-  0xE0, 0x33, 0xFE, 0xAB, 0xDF, 0xEB, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34,
-  0xF2, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0x2F,
-  0xFF, 0xEA, 0x3E, 0xFE, 0xAB, 0xE1, 0xEB, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4,
-  0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0,
-  0x2F, 0xFF, 0xEA, 0x3E, 0xFE, 0xEF, 0x78, 0x02,
-  0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF,
-  0xAB, 0xE1, 0xEB, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x00, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83,
-  0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0xDF, 0xEF,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82,
-  0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xA3, 0xE0, 0x25,
-  0xE0, 0xFF, 0x05, 0x82, 0xD5, 0x82, 0x02, 0x15,
-  0x83, 0x15, 0x82, 0xE0, 0x33, 0xFE, 0xAB, 0xDF,
-  0xEB, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5,
-  0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xE0, 0xFA,
-  0xA3, 0xE0, 0x2F, 0xFF, 0xEA, 0x3E, 0xFE, 0xAB,
-  0xE1, 0xEB, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02,
-  0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0,
-  0xFA, 0xA3, 0xE0, 0x2F, 0xFF, 0xEA, 0x3E, 0xFE,
-  0xEF, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13,
-  0xD8, 0xF9, 0xFF, 0xAB, 0xE1, 0xEB, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34,
-  0x89, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
-  0x02, 0x1E, 0xFC, 0xAE, 0x04, 0xAF, 0x05, 0xD3,
-  0xED, 0x94, 0x32, 0xEC, 0x94, 0x00, 0x50, 0x03,
-  0x02, 0x1E, 0x16, 0xAF, 0xE1, 0xEF, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34,
-  0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-  0xAD, 0xDF, 0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x00, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83,
-  0xE0, 0xFC, 0xA3, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E,
-  0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xAD, 0xE1,
-  0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0,
-  0xA3, 0xEF, 0xF0, 0xAF, 0xE1, 0xEF, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34,
-  0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-  0xAD, 0xDF, 0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x02, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83,
-  0xE0, 0xFC, 0xA3, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E,
-  0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xAD, 0xE1,
-  0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0,
-  0xA3, 0xEF, 0xF0, 0x02, 0x1E, 0xFC, 0xAF, 0xE1,
-  0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xA3, 0xE0,
-  0x25, 0xE0, 0xFF, 0x05, 0x82, 0xD5, 0x82, 0x02,
-  0x15, 0x83, 0x15, 0x82, 0xE0, 0x33, 0xFE, 0xAD,
-  0xE1, 0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00,
-  0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0,
-  0xFC, 0xA3, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE,
-  0xAD, 0xDF, 0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x00, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83,
-  0xE0, 0xFC, 0xA3, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E,
-  0xFE, 0xEF, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE,
-  0x13, 0xD8, 0xF9, 0xFF, 0xAD, 0xE1, 0xED, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4,
-  0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF,
-  0xF0, 0xAF, 0xE1, 0xEF, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xA3, 0xE0, 0x25, 0xE0, 0xFF, 0x05, 0x82,
-  0xD5, 0x82, 0x02, 0x15, 0x83, 0x15, 0x82, 0xE0,
-  0x33, 0xFE, 0xAD, 0xE1, 0xED, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x89,
-  0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0x2F, 0xFF,
-  0xEC, 0x3E, 0xFE, 0xAD, 0xDF, 0xED, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34,
-  0xF2, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0x2F,
-  0xFF, 0xEC, 0x3E, 0xFE, 0xEF, 0x78, 0x02, 0xCE,
-  0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xAD,
-  0xE1, 0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02,
-  0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE,
-  0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0xE1, 0xEF, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x50, 0xF5, 0x82, 0xE4,
-  0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0,
-  0xFF, 0xAD, 0xE1, 0xED, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xC3, 0x9F, 0xFF,
-  0xEC, 0x9E, 0xFE, 0x12, 0x78, 0xF1, 0x90, 0x13,
-  0x28, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0xE1,
-  0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x52, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE,
-  0xA3, 0xE0, 0xFF, 0xAD, 0xE1, 0xED, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34,
-  0x89, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xC3,
-  0x9F, 0xFF, 0xEC, 0x9E, 0xFE, 0x12, 0x78, 0xF1,
-  0x90, 0x13, 0x2A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
-  0x90, 0x13, 0x2A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-  0x90, 0x13, 0x29, 0xE0, 0x2F, 0xFF, 0x90, 0x13,
-  0x28, 0xE0, 0x3E, 0xFE, 0x90, 0x13, 0x2C, 0xF0,
-  0xA3, 0xEF, 0xF0, 0xD3, 0x94, 0x0C, 0xEE, 0x94,
-  0x00, 0x40, 0x4E, 0xD2, 0x0F, 0xD2, 0x11, 0xAF,
-  0xE1, 0x74, 0x81, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
-  0x12, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x04, 0x40,
-  0x10, 0xAF, 0xE1, 0x74, 0x81, 0x2F, 0xF5, 0x82,
-  0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE0, 0x24, 0xFC,
-  0xF0, 0xAF, 0xE1, 0x74, 0x81, 0x2F, 0xF5, 0x82,
-  0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE0, 0xC3, 0x94,
-  0x01, 0x50, 0x0E, 0xAF, 0xE1, 0x74, 0x81, 0x2F,
-  0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE4,
-  0xF0, 0x90, 0xF1, 0x0A, 0x74, 0x01, 0xF0, 0x80,
-  0x65, 0xAF, 0xE1, 0x74, 0x81, 0x2F, 0xF5, 0x82,
-  0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE0, 0x04, 0xF0,
-  0xAF, 0xE1, 0x74, 0x81, 0x2F, 0xF5, 0x82, 0xE4,
-  0x34, 0x12, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x16,
-  0x40, 0x17, 0xAF, 0xE1, 0x74, 0x81, 0x2F, 0xF5,
-  0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0x74, 0x16,
-  0xF0, 0x90, 0xF1, 0x0A, 0x74, 0x02, 0xF0, 0x80,
-  0x29, 0x90, 0x12, 0x92, 0xE0, 0xD3, 0x94, 0x00,
-  0x50, 0x08, 0x90, 0x12, 0x60, 0xE0, 0x94, 0x00,
-  0x40, 0x09, 0x30, 0x04, 0x06, 0x90, 0xF1, 0x0A,
-  0x74, 0x01, 0xF0, 0x90, 0x12, 0x93, 0xE0, 0xD3,
-  0x94, 0x00, 0x40, 0x06, 0x90, 0xF1, 0x0A, 0x74,
-  0x01, 0xF0, 0xC2, 0x0F, 0xC2, 0x11, 0xAF, 0xE1,
-  0x74, 0x81, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x12,
-  0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x13, 0x2C, 0xE0,
-  0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x9F, 0xEC, 0x94,
-  0x00, 0x40, 0x15, 0xD2, 0x0F, 0xD2, 0x11, 0xAF,
-  0xE1, 0x74, 0x77, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
-  0x12, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x80, 0x04,
-  0xC2, 0x0F, 0xC2, 0x11, 0xAF, 0xE1, 0x74, 0x77,
-  0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83,
-  0xE0, 0xB4, 0x01, 0x13, 0xD3, 0xED, 0x94, 0x01,
-  0xEC, 0x94, 0x00, 0x40, 0x06, 0xD2, 0x0F, 0xD2,
-  0x11, 0x80, 0x04, 0xC2, 0x0F, 0xC2, 0x11, 0xAF,
-  0xE1, 0x74, 0xC0, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
-  0x12, 0xF5, 0x83, 0xE0, 0x64, 0x01, 0x60, 0x03,
-  0x02, 0x21, 0x95, 0xAF, 0xDF, 0x74, 0x0A, 0x2F,
-  0xF5, 0x82, 0xE4, 0x34, 0x13, 0xF5, 0x83, 0xE0,
-  0xFF, 0xAE, 0xE1, 0x74, 0xCA, 0x2E, 0xF5, 0x82,
-  0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE0, 0xC3, 0x9F,
-  0x50, 0x4F, 0xC2, 0x0D, 0xAF, 0xE1, 0x74, 0x3C,
-  0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83,
-  0xE0, 0xFF, 0xAD, 0xDF, 0xED, 0x25, 0xE0, 0x24,
-  0x14, 0xF5, 0x82, 0xE4, 0x34, 0x13, 0xF5, 0x83,
-  0xE0, 0xFC, 0xA3, 0xE0, 0xD3, 0x9F, 0x74, 0x80,
-  0xF8, 0xEC, 0x64, 0x80, 0x98, 0x50, 0x12, 0xAF,
-  0xE1, 0x74, 0xCA, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
-  0x12, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x02, 0x21,
-  0x97, 0xAF, 0xE1, 0x74, 0xCA, 0x2F, 0xF5, 0x82,
-  0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE4, 0xF0, 0x80,
-  0x76, 0xAF, 0xE1, 0x74, 0xC0, 0x2F, 0xF5, 0x82,
-  0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE4, 0xF0, 0xAF,
-  0xE1, 0x74, 0xCA, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
-  0x12, 0xF5, 0x83, 0xE4, 0xF0, 0xAF, 0xE1, 0xEF,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0x94, 0xF5, 0x82,
-  0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE0, 0xFE, 0xA3,
-  0xE0, 0xFF, 0xAD, 0xE1, 0xED, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x89,
-  0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF,
-  0xE1, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x96,
-  0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE0,
-  0xFE, 0xA3, 0xE0, 0xFF, 0xAD, 0xE1, 0xED, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4,
-  0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF,
-  0xF0, 0xD2, 0x0D, 0x80, 0x02, 0xD2, 0x0D, 0x30,
-  0x01, 0x57, 0xAF, 0xDF, 0xEF, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xF2,
-  0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xAD,
-  0xE1, 0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x50,
-  0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE,
-  0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0xDF, 0xEF, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4,
-  0x34, 0xF2, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0,
-  0xFF, 0xAD, 0xE1, 0xED, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x02, 0x22,
-  0x81, 0x20, 0x0F, 0x03, 0x02, 0x22, 0x81, 0x20,
-  0x11, 0x03, 0x02, 0x22, 0x81, 0x20, 0x0D, 0x03,
-  0x02, 0x22, 0x81, 0xD3, 0x90, 0x13, 0x2D, 0xE0,
-  0x94, 0x78, 0x90, 0x13, 0x2C, 0xE0, 0x94, 0x00,
-  0x40, 0x06, 0x90, 0x12, 0x92, 0xE0, 0x04, 0xF0,
-  0xD3, 0x90, 0x13, 0x2D, 0xE0, 0x94, 0x72, 0x90,
-  0x13, 0x2C, 0xE0, 0x94, 0x01, 0x40, 0x06, 0x90,
-  0x12, 0x93, 0xE0, 0x04, 0xF0, 0xAF, 0xE1, 0xEF,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82,
-  0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3,
-  0xE0, 0xFF, 0xAD, 0xE1, 0xED, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x50, 0xF5, 0x82, 0xE4, 0x34, 0x89,
-  0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF,
-  0xE1, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02,
-  0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0,
-  0xFE, 0xA3, 0xE0, 0xFF, 0xAD, 0xE1, 0xED, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x52, 0xF5, 0x82, 0xE4,
-  0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF,
-  0xF0, 0xAF, 0xDF, 0xEF, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5,
-  0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xAD, 0xE1,
-  0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x50, 0xF5,
-  0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xEE, 0xF0,
-  0xA3, 0xEF, 0xF0, 0xAF, 0xDF, 0xEF, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34,
-  0xF2, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-  0xAD, 0xE1, 0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x52, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83,
-  0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xAF, 0xDF, 0x74,
-  0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5,
-  0x83, 0xE0, 0xFF, 0xAE, 0xE1, 0x74, 0x14, 0x2E,
-  0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEF,
-  0xF0, 0xAF, 0xDF, 0x74, 0x28, 0x2F, 0xF5, 0x82,
-  0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xFF, 0xAE,
-  0xE1, 0x74, 0x3C, 0x2E, 0xF5, 0x82, 0xE4, 0x34,
-  0x8A, 0xF5, 0x83, 0xEF, 0xF0, 0xAF, 0xE1, 0x74,
-  0xE5, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5,
-  0x83, 0x74, 0x02, 0xF0, 0x90, 0x12, 0xDF, 0xE0,
-  0x04, 0xF0, 0x90, 0x88, 0xC0, 0xE0, 0x14, 0xF0,
-  0x90, 0x88, 0xC1, 0xE0, 0x14, 0xF0, 0xAF, 0xE1,
-  0x74, 0xD1, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88,
-  0xF5, 0x83, 0xE4, 0xF0, 0x7B, 0x01, 0x7D, 0x01,
-  0xAF, 0xE1, 0x12, 0x4C, 0x38, 0xE4, 0xFB, 0x7D,
-  0x01, 0xAF, 0xDF, 0x12, 0x4C, 0x38, 0x90, 0x12,
-  0xDD, 0xE0, 0x04, 0xF0, 0x02, 0x1B, 0xDB, 0x90,
-  0x12, 0xDF, 0xE0, 0xC3, 0x95, 0x0D, 0x40, 0x03,
-  0x02, 0x23, 0xE4, 0x90, 0x88, 0xC0, 0xE0, 0x94,
-  0x00, 0x40, 0x79, 0xE4, 0x90, 0x12, 0xDB, 0xF0,
-  0x90, 0x12, 0xDB, 0xE0, 0xFF, 0xC3, 0x95, 0x0D,
-  0x50, 0x6A, 0x7B, 0x01, 0x7D, 0x02, 0x12, 0x4C,
-  0x38, 0x90, 0x12, 0xDE, 0xEF, 0xF0, 0x60, 0x54,
-  0xA3, 0xE0, 0xC3, 0x95, 0x0D, 0x50, 0x4D, 0x90,
-  0x12, 0xDB, 0xE0, 0xFF, 0x24, 0xCA, 0xF5, 0x82,
-  0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE4, 0xF0, 0x74,
-  0xC0, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5,
-  0x83, 0xE4, 0xF0, 0x74, 0xE5, 0x2F, 0xF5, 0x82,
-  0xE4, 0x34, 0x88, 0xF5, 0x83, 0x74, 0x03, 0xF0,
-  0x74, 0x77, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x12,
-  0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x88, 0xC0, 0xE0,
-  0x14, 0xF0, 0x90, 0x12, 0xDF, 0xE0, 0x04, 0xF0,
-  0x74, 0xD1, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88,
-  0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x12, 0xDB, 0xE0,
-  0x04, 0xF0, 0x80, 0x8C, 0x90, 0x12, 0xDF, 0xE0,
-  0xC3, 0x95, 0x0D, 0x40, 0x03, 0x02, 0x26, 0x16,
-  0x90, 0x88, 0xC1, 0xE0, 0x94, 0x00, 0x50, 0x03,
-  0x02, 0x26, 0x16, 0xE4, 0x90, 0x12, 0xDC, 0xF0,
-  0x90, 0x88, 0xB0, 0xE0, 0xFE, 0x90, 0x12, 0xDC,
-  0xE0, 0xFF, 0xC3, 0x9E, 0x40, 0x03, 0x02, 0x26,
-  0x16, 0xE4, 0xFB, 0x7D, 0x02, 0x12, 0x4C, 0x38,
-  0x90, 0x12, 0xDE, 0xEF, 0xF0, 0x70, 0x03, 0x02,
-  0x26, 0x0D, 0xE4, 0x90, 0x12, 0xDB, 0xF0, 0x90,
-  0x12, 0xDB, 0xE0, 0xFF, 0xC3, 0x95, 0x0D, 0x40,
-  0x03, 0x02, 0x26, 0x0D, 0x74, 0xE5, 0x2F, 0xF5,
-  0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0x60,
-  0x03, 0x02, 0x26, 0x04, 0x90, 0x12, 0xDF, 0xE0,
-  0xC3, 0x95, 0x0D, 0x40, 0x03, 0x02, 0x26, 0x04,
-  0x90, 0x12, 0xDC, 0xE0, 0xFF, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xF2,
-  0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90,
-  0x12, 0xDB, 0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x50, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5,
-  0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4,
-  0x34, 0xF2, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0,
-  0xFD, 0xEE, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x52,
-  0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xEC,
-  0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x12, 0xDC, 0xE0,
-  0xFF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5,
-  0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xE0, 0xFC,
-  0xA3, 0xE0, 0xFD, 0xEE, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4,
-  0x34, 0xF2, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0,
-  0xFD, 0xEE, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x02,
-  0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEC,
-  0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x12, 0xDC, 0xE0,
-  0xFF, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x8A,
-  0xF5, 0x83, 0xE0, 0xFE, 0x90, 0x12, 0xDB, 0xE0,
-  0xFD, 0x24, 0x14, 0xF5, 0x82, 0xE4, 0x34, 0x8A,
-  0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x28, 0x2F, 0xF5,
-  0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0, 0xFF,
-  0x74, 0x3C, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8A,
-  0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x12, 0xDC, 0xE0,
-  0xFF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5,
-  0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xE0, 0xFC,
-  0xA3, 0xE0, 0xFD, 0x90, 0x12, 0xDB, 0xE0, 0xFE,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0x50, 0xF5, 0x82,
-  0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEC, 0xF0, 0xA3,
-  0xED, 0xF0, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x02, 0xF5, 0x82, 0xE4, 0x34, 0xF2, 0xF5, 0x83,
-  0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEE, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0x52, 0xF5, 0x82, 0xE4, 0x34,
-  0x89, 0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0,
-  0x74, 0xE5, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x88,
-  0xF5, 0x83, 0x74, 0x01, 0xF0, 0x74, 0xC0, 0x2E,
-  0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0x74,
-  0x01, 0xF0, 0x90, 0x12, 0xDC, 0xE0, 0xFF, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4,
-  0x34, 0xF2, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0,
-  0xFD, 0xEE, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x94,
-  0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xEC,
-  0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xF2,
-  0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEE,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0x96, 0xF5, 0x82,
-  0xE4, 0x34, 0x12, 0xF5, 0x83, 0xEC, 0xF0, 0xA3,
-  0xED, 0xF0, 0x74, 0xD1, 0x2E, 0xF5, 0x82, 0xE4,
-  0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x88,
-  0xC1, 0xE0, 0x14, 0xF0, 0x90, 0x12, 0xDF, 0xE0,
-  0x04, 0xF0, 0x80, 0x09, 0x90, 0x12, 0xDB, 0xE0,
-  0x04, 0xF0, 0x02, 0x24, 0x27, 0x90, 0x12, 0xDC,
-  0xE0, 0x04, 0xF0, 0x02, 0x24, 0x00, 0x22, 0xE4,
-  0xF5, 0x99, 0x75, 0x96, 0x03, 0x75, 0x9E, 0x55,
-  0xF5, 0xA1, 0xF5, 0xA1, 0xF5, 0xA1, 0xC2, 0x09,
-  0xC2, 0x0A, 0xC2, 0x0E, 0xC2, 0x15, 0xC2, 0x05,
-  0xC2, 0x06, 0x90, 0x12, 0x81, 0xF0, 0xA3, 0xF0,
-  0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
-  0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
-  0x90, 0x12, 0x77, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
-  0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
-  0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x12,
-  0xC0, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
-  0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
-  0xA3, 0xF0, 0xA3, 0xF0, 0xD2, 0xB1, 0xC2, 0xB6,
-  0xC2, 0xB7, 0x75, 0xA0, 0x02, 0xF5, 0xAE, 0x90,
-  0xF0, 0xC4, 0xF0, 0x90, 0x8F, 0xF0, 0xF0, 0xFF,
-  0xFE, 0xAD, 0x07, 0x74, 0xE5, 0x2D, 0xF5, 0x82,
-  0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0x74,
-  0xA0, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x37, 0xF5,
-  0x83, 0xE4, 0xF0, 0x0F, 0xBF, 0x00, 0x01, 0x0E,
-  0xEF, 0x64, 0x14, 0x4E, 0x70, 0xDB, 0xE4, 0x90,
-  0x88, 0xC0, 0xF0, 0x90, 0x88, 0xC1, 0xF0, 0xF5,
-  0xDC, 0xF5, 0xDD, 0xF5, 0xDE, 0xF5, 0xD9, 0xF5,
-  0xDA, 0xF5, 0xDB, 0x90, 0x88, 0xC2, 0xF0, 0x90,
-  0x88, 0xC6, 0xF0, 0x90, 0x88, 0xCD, 0xF0, 0xC2,
-  0x0C, 0xC2, 0x0B, 0xC2, 0x14, 0x75, 0x8A, 0x8F,
-  0xF5, 0x8B, 0x90, 0x8F, 0xFF, 0xF0, 0xC2, 0x03,
-  0xC2, 0x16, 0x90, 0x28, 0x11, 0x93, 0xF5, 0x08,
-  0x90, 0x28, 0x10, 0xE4, 0x93, 0xFD, 0xF5, 0x0D,
-  0x90, 0x8B, 0x7C, 0xED, 0xF0, 0x90, 0x28, 0x12,
-  0xE4, 0x93, 0x90, 0x8B, 0x7D, 0xF0, 0x90, 0x28,
-  0x13, 0xE4, 0x93, 0x90, 0x8B, 0x7E, 0xF0, 0x90,
-  0x28, 0x0B, 0xE4, 0x93, 0xF5, 0x0B, 0x90, 0x28,
-  0x0C, 0xE4, 0x93, 0xF5, 0x0C, 0x90, 0x8B, 0x78,
-  0x74, 0x05, 0xF0, 0xA3, 0xE4, 0xF0, 0x90, 0x8B,
-  0x7A, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x20, 0xF0,
-  0xE4, 0x90, 0x3F, 0xFE, 0xF0, 0xC2, 0x10, 0x90,
-  0x12, 0xBC, 0xF0, 0x90, 0x12, 0x58, 0xF0, 0x90,
-  0x12, 0x59, 0xF0, 0x90, 0x12, 0x63, 0xF0, 0xA3,
-  0x74, 0x03, 0xF0, 0xE4, 0x90, 0x8F, 0xFE, 0xF0,
-  0xFE, 0xFF, 0x75, 0x9E, 0x55, 0xAD, 0x07, 0x74,
-  0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5,
-  0x83, 0xE4, 0xF0, 0x74, 0x78, 0x2D, 0xF5, 0x82,
-  0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0x0F,
-  0xBF, 0x00, 0x01, 0x0E, 0xEF, 0x64, 0x3C, 0x4E,
-  0x70, 0xD8, 0xE4, 0xFE, 0xFF, 0xAD, 0x07, 0x74,
-  0xCA, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5,
-  0x83, 0xE4, 0xF0, 0x74, 0x65, 0x2D, 0xF5, 0x82,
-  0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE4, 0xF0, 0x0F,
-  0xBF, 0x00, 0x01, 0x0E, 0xEF, 0x64, 0x0A, 0x4E,
-  0x70, 0xDB, 0xE4, 0x90, 0x12, 0x71, 0xF0, 0xA3,
-  0xF0, 0x90, 0x12, 0xBD, 0xF0, 0xA3, 0xF0, 0x90,
-  0x12, 0xBF, 0xF0, 0x90, 0x3F, 0xFD, 0x04, 0xF0,
-  0x22, 0xE4, 0x90, 0x12, 0xDA, 0xF0, 0xA3, 0xF0,
-  0x90, 0x8F, 0xFE, 0x74, 0xAA, 0xF0, 0x90, 0x8F,
-  0xFD, 0xE0, 0x64, 0xBB, 0x60, 0x1A, 0x90, 0x12,
-  0xDB, 0xE0, 0x04, 0xF0, 0x70, 0x06, 0x90, 0x12,
-  0xDA, 0xE0, 0x04, 0xF0, 0x75, 0x9E, 0x55, 0x7F,
-  0xFA, 0x7E, 0x00, 0x12, 0x67, 0xEE, 0x80, 0xDE,
-  0xE4, 0x90, 0x8F, 0xFD, 0xF0, 0x90, 0x8F, 0xFE,
-  0xF0, 0xD2, 0xD8, 0xA2, 0xD9, 0x33, 0x90, 0x8E,
-  0x01, 0xF0, 0x90, 0xF0, 0xC4, 0x74, 0x01, 0xF0,
-  0x22, 0xD2, 0xD8, 0x22, 0xD2, 0x0E, 0x32, 0x32,
-  0x1C, 0x1C, 0x20, 0x1E, 0x28, 0x03, 0xE8, 0x1E,
-  0xC8, 0x14, 0x01, 0x40, 0x40, 0x20, 0x20, 0x02,
-  0x0A, 0x0A, 0x01, 0x05, 0xE4, 0x90, 0x12, 0xE8,
-  0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3,
-  0xF0, 0xA3, 0xF0, 0x90, 0xF1, 0x03, 0xE0, 0xD3,
-  0x94, 0x50, 0x40, 0x0F, 0xE0, 0x90, 0xF2, 0xA5,
-  0xF0, 0x90, 0xF1, 0x03, 0xE0, 0x90, 0xF2, 0xA4,
-  0xF0, 0x80, 0x0A, 0x90, 0xF2, 0xA5, 0x74, 0xFA,
-  0xF0, 0x90, 0xF2, 0xA4, 0xF0, 0x90, 0xF1, 0x03,
-  0xE0, 0x90, 0xF2, 0xB1, 0xF0, 0xD2, 0xB6, 0xD2,
-  0xB7, 0xD2, 0xB2, 0x20, 0xB2, 0x06, 0x30, 0x0E,
-  0x03, 0x20, 0xDC, 0x05, 0x75, 0x9E, 0x55, 0x80,
-  0xF2, 0xC2, 0xDC, 0xC2, 0x0E, 0x90, 0xF2, 0xB0,
-  0xE0, 0x64, 0x01, 0x70, 0x35, 0x90, 0x12, 0xFA,
-  0x74, 0x16, 0xF0, 0x90, 0x12, 0x92, 0xE0, 0xD3,
-  0x94, 0x00, 0x50, 0x08, 0x90, 0x12, 0x60, 0xE0,
-  0x94, 0x00, 0x40, 0x09, 0x30, 0x04, 0x06, 0x90,
-  0x12, 0xFA, 0x74, 0x12, 0xF0, 0x90, 0x12, 0x93,
-  0xE0, 0xD3, 0x94, 0x00, 0x50, 0x03, 0x02, 0x29,
-  0xC6, 0x90, 0x12, 0xFA, 0x74, 0x10, 0xF0, 0x02,
-  0x29, 0xC6, 0x90, 0xF2, 0xB0, 0xE0, 0x64, 0x02,
-  0x70, 0x35, 0x90, 0x12, 0xFA, 0x74, 0x16, 0xF0,
-  0x90, 0x12, 0x92, 0xE0, 0xD3, 0x94, 0x00, 0x50,
-  0x08, 0x90, 0x12, 0x60, 0xE0, 0x94, 0x00, 0x40,
-  0x09, 0x30, 0x04, 0x06, 0x90, 0x12, 0xFA, 0x74,
-  0x12, 0xF0, 0x90, 0x12, 0x93, 0xE0, 0xD3, 0x94,
-  0x00, 0x50, 0x03, 0x02, 0x29, 0xC6, 0x90, 0x12,
-  0xFA, 0x74, 0x10, 0xF0, 0x02, 0x29, 0xC6, 0x90,
-  0xF2, 0xB0, 0xE0, 0x64, 0x03, 0x70, 0x35, 0x90,
-  0x12, 0xFA, 0x74, 0x16, 0xF0, 0x90, 0x12, 0x92,
-  0xE0, 0xD3, 0x94, 0x00, 0x50, 0x08, 0x90, 0x12,
-  0x60, 0xE0, 0x94, 0x00, 0x40, 0x09, 0x30, 0x04,
-  0x06, 0x90, 0x12, 0xFA, 0x74, 0x12, 0xF0, 0x90,
-  0x12, 0x93, 0xE0, 0xD3, 0x94, 0x00, 0x50, 0x03,
-  0x02, 0x29, 0xC6, 0x90, 0x12, 0xFA, 0x74, 0x10,
-  0xF0, 0x02, 0x29, 0xC6, 0x90, 0xF2, 0xB0, 0xE0,
-  0x64, 0x04, 0x70, 0x31, 0x90, 0x12, 0xFA, 0x74,
-  0x18, 0xF0, 0x90, 0x12, 0x92, 0xE0, 0xD3, 0x94,
-  0x00, 0x50, 0x08, 0x90, 0x12, 0x60, 0xE0, 0x94,
-  0x00, 0x40, 0x09, 0x30, 0x04, 0x06, 0x90, 0x12,
-  0xFA, 0x74, 0x16, 0xF0, 0x90, 0x12, 0x93, 0xE0,
-  0xD3, 0x94, 0x00, 0x40, 0x79, 0x90, 0x12, 0xFA,
-  0x74, 0x12, 0xF0, 0x80, 0x71, 0x90, 0xF2, 0xB0,
-  0xE0, 0x64, 0x05, 0x70, 0x31, 0x90, 0x12, 0xFA,
-  0x74, 0x19, 0xF0, 0x90, 0x12, 0x92, 0xE0, 0xD3,
-  0x94, 0x00, 0x50, 0x08, 0x90, 0x12, 0x60, 0xE0,
-  0x94, 0x00, 0x40, 0x09, 0x30, 0x04, 0x06, 0x90,
-  0x12, 0xFA, 0x74, 0x17, 0xF0, 0x90, 0x12, 0x93,
-  0xE0, 0xD3, 0x94, 0x00, 0x40, 0x40, 0x90, 0x12,
-  0xFA, 0x74, 0x12, 0xF0, 0x80, 0x38, 0x90, 0xF2,
-  0xB0, 0xE0, 0xD3, 0x94, 0x05, 0x40, 0x2F, 0x90,
-  0x12, 0xFA, 0x74, 0x19, 0xF0, 0x90, 0x12, 0x92,
-  0xE0, 0xD3, 0x94, 0x00, 0x50, 0x08, 0x90, 0x12,
-  0x60, 0xE0, 0x94, 0x00, 0x40, 0x09, 0x30, 0x04,
-  0x06, 0x90, 0x12, 0xFA, 0x74, 0x17, 0xF0, 0x90,
-  0x12, 0x93, 0xE0, 0xD3, 0x94, 0x00, 0x40, 0x06,
-  0x90, 0x12, 0xFA, 0x74, 0x12, 0xF0, 0x90, 0xF2,
-  0xB0, 0xE0, 0xD3, 0x94, 0x00, 0x50, 0x03, 0x02,
-  0x35, 0x7F, 0xE4, 0x90, 0x12, 0xDA, 0xF0, 0xA3,
-  0xF0, 0x90, 0xF2, 0xB0, 0xE0, 0xFF, 0x90, 0x12,
-  0xDA, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xC3, 0x9F,
-  0xEC, 0x94, 0x00, 0x40, 0x03, 0x02, 0x35, 0x7F,
-  0x30, 0xD9, 0x03, 0x02, 0x2A, 0x95, 0xED, 0x25,
-  0xE0, 0xFD, 0xEC, 0x33, 0xFC, 0x74, 0x81, 0x2D,
-  0xF5, 0x82, 0x74, 0x81, 0x3C, 0xF5, 0x83, 0xE0,
-  0x25, 0xE0, 0x24, 0x29, 0xF5, 0x82, 0xE4, 0x34,
-  0x80, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x81, 0x2D,
-  0xF5, 0x82, 0x74, 0x81, 0x3C, 0xF5, 0x83, 0xE0,
-  0x25, 0xE0, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34,
-  0x80, 0xF5, 0x83, 0xE0, 0x7C, 0x00, 0x24, 0x00,
-  0xFF, 0xEC, 0x3E, 0xFE, 0x7D, 0x14, 0x12, 0x59,
-  0x93, 0x90, 0x12, 0xF4, 0xEE, 0xF0, 0xA3, 0xEF,
-  0xF0, 0x90, 0x12, 0xDB, 0xE0, 0x25, 0xE0, 0xFD,
-  0x90, 0x12, 0xDA, 0xE0, 0x33, 0xFC, 0x74, 0x80,
-  0x2D, 0xF5, 0x82, 0x74, 0x81, 0x3C, 0xF5, 0x83,
-  0xE0, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4,
-  0x34, 0x80, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x80,
-  0x2D, 0xF5, 0x82, 0x74, 0x81, 0x3C, 0xF5, 0x83,
-  0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4,
-  0x34, 0x80, 0xF5, 0x83, 0xE0, 0x7C, 0x00, 0x24,
-  0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0x7D, 0x1E, 0x12,
-  0x59, 0x93, 0x90, 0x12, 0xF6, 0xEE, 0xF0, 0xA3,
-  0xEF, 0xF0, 0x02, 0x2B, 0x37, 0x90, 0x12, 0xDB,
-  0xE0, 0x25, 0xE0, 0xFD, 0x90, 0x12, 0xDA, 0xE0,
-  0x33, 0xFC, 0x74, 0x81, 0x2D, 0xF5, 0x82, 0x74,
-  0x81, 0x3C, 0xF5, 0x83, 0xE0, 0x25, 0xE0, 0x24,
-  0xE9, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83,
-  0xE0, 0xFE, 0x74, 0x81, 0x2D, 0xF5, 0x82, 0x74,
-  0x81, 0x3C, 0xF5, 0x83, 0xE0, 0x25, 0xE0, 0x24,
-  0xE8, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83,
-  0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E,
-  0xFE, 0x7D, 0x14, 0x12, 0x59, 0x93, 0x90, 0x12,
-  0xF4, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x12,
-  0xDB, 0xE0, 0x25, 0xE0, 0xFD, 0x90, 0x12, 0xDA,
-  0xE0, 0x33, 0xFC, 0x74, 0x80, 0x2D, 0xF5, 0x82,
-  0x74, 0x81, 0x3C, 0xF5, 0x83, 0xE0, 0x25, 0xE0,
-  0x24, 0xC1, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5,
-  0x83, 0xE0, 0xFE, 0x74, 0x80, 0x2D, 0xF5, 0x82,
-  0x74, 0x81, 0x3C, 0xF5, 0x83, 0xE0, 0x25, 0xE0,
-  0x24, 0xC0, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5,
-  0x83, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC,
-  0x3E, 0xFE, 0x7D, 0x1E, 0x12, 0x59, 0x93, 0x90,
-  0x12, 0xF6, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90,
-  0x12, 0xF4, 0xE0, 0xC4, 0xF8, 0x54, 0xF0, 0xC8,
-  0x68, 0xFE, 0xA3, 0xE0, 0xC4, 0x54, 0x0F, 0x48,
-  0xFF, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x59, 0x81,
-  0x90, 0x12, 0xF4, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
-  0xA3, 0xE0, 0xC4, 0xF8, 0x54, 0xF0, 0xC8, 0x68,
-  0xFE, 0xA3, 0xE0, 0xC4, 0x54, 0x0F, 0x48, 0xFF,
-  0x12, 0x59, 0x81, 0x90, 0x12, 0xF6, 0xEE, 0xF0,
-  0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x12, 0xE2, 0xF0,
-  0xA3, 0xF0, 0x90, 0x12, 0xDB, 0xE0, 0x25, 0xE0,
-  0xFD, 0x90, 0x12, 0xDA, 0xE0, 0x33, 0xFC, 0x74,
-  0x81, 0x2D, 0xF5, 0x82, 0x74, 0x81, 0x3C, 0xF5,
-  0x83, 0xE0, 0x75, 0xF0, 0x14, 0xA4, 0xFF, 0x74,
-  0x80, 0x2D, 0xF5, 0x82, 0x74, 0x81, 0x3C, 0xF5,
-  0x83, 0xE0, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35,
-  0xF0, 0xFE, 0xEF, 0x25, 0xE0, 0xFF, 0xEE, 0x33,
-  0xFE, 0xA2, 0xD9, 0xE4, 0x33, 0x2F, 0xFF, 0xEC,
-  0x3E, 0x90, 0x12, 0xF0, 0xF0, 0xA3, 0xEF, 0xF0,
-  0x90, 0x12, 0xDB, 0xE0, 0x25, 0xE0, 0xFF, 0x90,
-  0x12, 0xDA, 0xE0, 0x33, 0xFE, 0x74, 0x81, 0x2F,
-  0xF5, 0x82, 0x74, 0x81, 0x3E, 0xF5, 0x83, 0xE0,
-  0x60, 0x03, 0x02, 0x2C, 0x7C, 0x90, 0x12, 0xF0,
-  0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x24, 0x00, 0xF5,
-  0x82, 0x74, 0x60, 0x3E, 0xF5, 0x83, 0xE0, 0xFD,
-  0x74, 0x50, 0x2F, 0xF5, 0x82, 0x74, 0x60, 0x3E,
-  0xF5, 0x83, 0xE0, 0xC3, 0x9D, 0xFF, 0xE4, 0x9C,
-  0xFE, 0x12, 0x78, 0xF1, 0x90, 0x12, 0xFA, 0xE0,
-  0x24, 0x0A, 0xFD, 0xE4, 0x33, 0xFC, 0xC3, 0xEF,
-  0x9D, 0xEC, 0x64, 0x80, 0xF8, 0xEE, 0x64, 0x80,
-  0x98, 0x50, 0x0E, 0x90, 0x12, 0xE3, 0xE0, 0x04,
-  0xF0, 0x70, 0x06, 0x90, 0x12, 0xE2, 0xE0, 0x04,
-  0xF0, 0x90, 0x12, 0xF0, 0xE0, 0xFE, 0xA3, 0xE0,
-  0xFF, 0x24, 0x28, 0xF5, 0x82, 0x74, 0x60, 0x3E,
-  0xF5, 0x83, 0xE0, 0xFD, 0x74, 0x00, 0x2F, 0xF5,
-  0x82, 0x74, 0x60, 0x3E, 0xF5, 0x83, 0xE0, 0xC3,
-  0x9D, 0xFF, 0xE4, 0x94, 0x00, 0xFE, 0x12, 0x78,
-  0xF1, 0x90, 0x12, 0xFA, 0xE0, 0x24, 0x0A, 0xFD,
-  0xE4, 0x33, 0xFC, 0xC3, 0xEF, 0x9D, 0xEC, 0x64,
-  0x80, 0xF8, 0xEE, 0x64, 0x80, 0x98, 0x40, 0x03,
-  0x02, 0x2E, 0xD9, 0x90, 0x12, 0xE3, 0xE0, 0x04,
-  0xF0, 0x70, 0x06, 0x90, 0x12, 0xE2, 0xE0, 0x04,
-  0xF0, 0x02, 0x2E, 0xD9, 0x90, 0x12, 0xDB, 0xE0,
-  0x25, 0xE0, 0xFF, 0x90, 0x12, 0xDA, 0xE0, 0x33,
-  0xFE, 0x74, 0x81, 0x2F, 0xF5, 0x82, 0x74, 0x81,
-  0x3E, 0xF5, 0x83, 0xE0, 0x64, 0x1D, 0x60, 0x03,
-  0x02, 0x2D, 0x3B, 0x90, 0x12, 0xF0, 0xE0, 0xFE,
-  0xA3, 0xE0, 0xFF, 0x24, 0x00, 0xF5, 0x82, 0x74,
-  0x60, 0x3E, 0xF5, 0x83, 0xE0, 0xFD, 0x74, 0xB0,
-  0x2F, 0xF5, 0x82, 0x74, 0x5F, 0x3E, 0xF5, 0x83,
-  0xE0, 0xC3, 0x9D, 0xFF, 0xE4, 0x94, 0x00, 0xFE,
-  0x12, 0x78, 0xF1, 0x90, 0x12, 0xFA, 0xE0, 0x24,
-  0x0A, 0xFD, 0xE4, 0x33, 0xFC, 0xC3, 0xEF, 0x9D,
-  0xEC, 0x64, 0x80, 0xF8, 0xEE, 0x64, 0x80, 0x98,
-  0x50, 0x0E, 0x90, 0x12, 0xE3, 0xE0, 0x04, 0xF0,
-  0x70, 0x06, 0x90, 0x12, 0xE2, 0xE0, 0x04, 0xF0,
-  0x90, 0x12, 0xF0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-  0x24, 0xD8, 0xF5, 0x82, 0x74, 0x5F, 0x3E, 0xF5,
-  0x83, 0xE0, 0xFD, 0x74, 0x00, 0x2F, 0xF5, 0x82,
-  0x74, 0x60, 0x3E, 0xF5, 0x83, 0xE0, 0xC3, 0x9D,
-  0xFF, 0xE4, 0x94, 0x00, 0xFE, 0x12, 0x78, 0xF1,
-  0x90, 0x12, 0xFA, 0xE0, 0x24, 0x0A, 0xFD, 0xE4,
-  0x33, 0xFC, 0xC3, 0xEF, 0x9D, 0xEC, 0x64, 0x80,
-  0xF8, 0xEE, 0x64, 0x80, 0x98, 0x40, 0x03, 0x02,
-  0x2E, 0xD9, 0x90, 0x12, 0xE3, 0xE0, 0x04, 0xF0,
-  0x70, 0x06, 0x90, 0x12, 0xE2, 0xE0, 0x04, 0xF0,
-  0x02, 0x2E, 0xD9, 0x90, 0x12, 0xF0, 0xE0, 0xFE,
-  0xA3, 0xE0, 0xFF, 0x24, 0xFF, 0xF5, 0x82, 0x74,
-  0x5F, 0x3E, 0xF5, 0x83, 0xE0, 0xFD, 0x74, 0xD7,
-  0x2F, 0xF5, 0x82, 0x74, 0x5F, 0x3E, 0xF5, 0x83,
-  0xE0, 0xC3, 0x9D, 0xFF, 0xE4, 0x94, 0x00, 0xFE,
-  0x12, 0x78, 0xF1, 0x90, 0x12, 0xFA, 0xE0, 0xFD,
-  0xC3, 0xEF, 0x9D, 0x74, 0x80, 0xF8, 0x6E, 0x98,
-  0x50, 0x0E, 0x90, 0x12, 0xE3, 0xE0, 0x04, 0xF0,
-  0x70, 0x06, 0x90, 0x12, 0xE2, 0xE0, 0x04, 0xF0,
-  0x90, 0x12, 0xF0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-  0x24, 0x27, 0xF5, 0x82, 0x74, 0x60, 0x3E, 0xF5,
-  0x83, 0xE0, 0xFD, 0x74, 0xFF, 0x2F, 0xF5, 0x82,
-  0x74, 0x5F, 0x3E, 0xF5, 0x83, 0xE0, 0xC3, 0x9D,
-  0xFF, 0xE4, 0x94, 0x00, 0xFE, 0x12, 0x78, 0xF1,
-  0x90, 0x12, 0xFA, 0xE0, 0xFD, 0xC3, 0xEF, 0x9D,
-  0x74, 0x80, 0xF8, 0x6E, 0x98, 0x50, 0x0E, 0x90,
-  0x12, 0xE3, 0xE0, 0x04, 0xF0, 0x70, 0x06, 0x90,
-  0x12, 0xE2, 0xE0, 0x04, 0xF0, 0x90, 0x12, 0xF0,
-  0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x24, 0x00, 0xF5,
-  0x82, 0x74, 0x60, 0x3E, 0xF5, 0x83, 0xE0, 0xFD,
-  0x74, 0xD8, 0x2F, 0xF5, 0x82, 0x74, 0x5F, 0x3E,
-  0xF5, 0x83, 0xE0, 0xC3, 0x9D, 0xFF, 0xE4, 0x94,
-  0x00, 0xFE, 0x12, 0x78, 0xF1, 0x90, 0x12, 0xFA,
-  0xE0, 0xFD, 0xC3, 0xEF, 0x9D, 0x74, 0x80, 0xF8,
-  0x6E, 0x98, 0x50, 0x0E, 0x90, 0x12, 0xE3, 0xE0,
-  0x04, 0xF0, 0x70, 0x06, 0x90, 0x12, 0xE2, 0xE0,
-  0x04, 0xF0, 0x90, 0x12, 0xF0, 0xE0, 0xFE, 0xA3,
-  0xE0, 0xFF, 0x24, 0x28, 0xF5, 0x82, 0x74, 0x60,
-  0x3E, 0xF5, 0x83, 0xE0, 0xFD, 0x74, 0x00, 0x2F,
-  0xF5, 0x82, 0x74, 0x60, 0x3E, 0xF5, 0x83, 0xE0,
-  0xC3, 0x9D, 0xFF, 0xE4, 0x94, 0x00, 0xFE, 0x12,
-  0x78, 0xF1, 0x90, 0x12, 0xFA, 0xE0, 0xFD, 0xC3,
-  0xEF, 0x9D, 0x74, 0x80, 0xF8, 0x6E, 0x98, 0x50,
-  0x0E, 0x90, 0x12, 0xE3, 0xE0, 0x04, 0xF0, 0x70,
-  0x06, 0x90, 0x12, 0xE2, 0xE0, 0x04, 0xF0, 0x90,
-  0x12, 0xF0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x24,
-  0x01, 0xF5, 0x82, 0x74, 0x60, 0x3E, 0xF5, 0x83,
-  0xE0, 0xFD, 0x74, 0xD9, 0x2F, 0xF5, 0x82, 0x74,
-  0x5F, 0x3E, 0xF5, 0x83, 0xE0, 0xC3, 0x9D, 0xFF,
-  0xE4, 0x94, 0x00, 0xFE, 0x12, 0x78, 0xF1, 0x90,
-  0x12, 0xFA, 0xE0, 0xFD, 0xC3, 0xEF, 0x9D, 0x74,
-  0x80, 0xF8, 0x6E, 0x98, 0x50, 0x0E, 0x90, 0x12,
-  0xE3, 0xE0, 0x04, 0xF0, 0x70, 0x06, 0x90, 0x12,
-  0xE2, 0xE0, 0x04, 0xF0, 0x90, 0x12, 0xF0, 0xE0,
-  0xFE, 0xA3, 0xE0, 0xFF, 0x24, 0x29, 0xF5, 0x82,
-  0x74, 0x60, 0x3E, 0xF5, 0x83, 0xE0, 0xFD, 0x74,
-  0x01, 0x2F, 0xF5, 0x82, 0x74, 0x60, 0x3E, 0xF5,
-  0x83, 0xE0, 0xC3, 0x9D, 0xFF, 0xE4, 0x94, 0x00,
-  0xFE, 0x12, 0x78, 0xF1, 0x90, 0x12, 0xFA, 0xE0,
-  0xFD, 0xC3, 0xEF, 0x9D, 0x74, 0x80, 0xF8, 0x6E,
-  0x98, 0x50, 0x0E, 0x90, 0x12, 0xE3, 0xE0, 0x04,
-  0xF0, 0x70, 0x06, 0x90, 0x12, 0xE2, 0xE0, 0x04,
-  0xF0, 0xE4, 0x90, 0x12, 0xE4, 0xF0, 0xA3, 0xF0,
-  0x90, 0x12, 0xF0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-  0x24, 0xD8, 0xF5, 0x82, 0x74, 0x5F, 0x3E, 0xF5,
-  0x83, 0xE0, 0xFD, 0x74, 0xD7, 0x2F, 0xF5, 0x82,
-  0x74, 0x5F, 0x3E, 0xF5, 0x83, 0xE0, 0xC3, 0x9D,
-  0xFF, 0xE4, 0x94, 0x00, 0xFE, 0x12, 0x78, 0xF1,
-  0x90, 0x12, 0xFA, 0xE0, 0xFD, 0xD3, 0xEF, 0x9D,
-  0x74, 0x80, 0xF8, 0x6E, 0x98, 0x40, 0x0E, 0x90,
-  0x12, 0xE5, 0xE0, 0x04, 0xF0, 0x70, 0x06, 0x90,
-  0x12, 0xE4, 0xE0, 0x04, 0xF0, 0x90, 0x12, 0xF0,
-  0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x24, 0xD9, 0xF5,
-  0x82, 0x74, 0x5F, 0x3E, 0xF5, 0x83, 0xE0, 0xFD,
-  0x74, 0xD8, 0x2F, 0xF5, 0x82, 0x74, 0x5F, 0x3E,
-  0xF5, 0x83, 0xE0, 0xC3, 0x9D, 0xFF, 0xE4, 0x94,
-  0x00, 0xFE, 0x12, 0x78, 0xF1, 0x90, 0x12, 0xFA,
-  0xE0, 0xFD, 0xD3, 0xEF, 0x9D, 0x74, 0x80, 0xF8,
-  0x6E, 0x98, 0x40, 0x0E, 0x90, 0x12, 0xE5, 0xE0,
-  0x04, 0xF0, 0x70, 0x06, 0x90, 0x12, 0xE4, 0xE0,
-  0x04, 0xF0, 0x90, 0x12, 0xF0, 0xE0, 0xFE, 0xA3,
-  0xE0, 0xFF, 0x24, 0x00, 0xF5, 0x82, 0x74, 0x60,
-  0x3E, 0xF5, 0x83, 0xE0, 0xFD, 0x74, 0xFF, 0x2F,
-  0xF5, 0x82, 0x74, 0x5F, 0x3E, 0xF5, 0x83, 0xE0,
-  0xC3, 0x9D, 0xFF, 0xE4, 0x94, 0x00, 0xFE, 0x12,
-  0x78, 0xF1, 0x90, 0x12, 0xFA, 0xE0, 0xFD, 0xD3,
-  0xEF, 0x9D, 0x74, 0x80, 0xF8, 0x6E, 0x98, 0x40,
-  0x0E, 0x90, 0x12, 0xE5, 0xE0, 0x04, 0xF0, 0x70,
-  0x06, 0x90, 0x12, 0xE4, 0xE0, 0x04, 0xF0, 0x90,
-  0x12, 0xF0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x24,
-  0x01, 0xF5, 0x82, 0x74, 0x60, 0x3E, 0xF5, 0x83,
-  0xE0, 0xFD, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0x74,
-  0x60, 0x3E, 0xF5, 0x83, 0xE0, 0xC3, 0x9D, 0xFF,
-  0xE4, 0x94, 0x00, 0xFE, 0x12, 0x78, 0xF1, 0x90,
-  0x12, 0xFA, 0xE0, 0xFD, 0xD3, 0xEF, 0x9D, 0x74,
-  0x80, 0xF8, 0x6E, 0x98, 0x40, 0x0E, 0x90, 0x12,
-  0xE5, 0xE0, 0x04, 0xF0, 0x70, 0x06, 0x90, 0x12,
-  0xE4, 0xE0, 0x04, 0xF0, 0x90, 0x12, 0xF0, 0xE0,
-  0xFE, 0xA3, 0xE0, 0xFF, 0x24, 0x28, 0xF5, 0x82,
-  0x74, 0x60, 0x3E, 0xF5, 0x83, 0xE0, 0xFD, 0x74,
-  0x27, 0x2F, 0xF5, 0x82, 0x74, 0x60, 0x3E, 0xF5,
-  0x83, 0xE0, 0xC3, 0x9D, 0xFF, 0xE4, 0x94, 0x00,
-  0xFE, 0x12, 0x78, 0xF1, 0x90, 0x12, 0xFA, 0xE0,
-  0xFD, 0xD3, 0xEF, 0x9D, 0x74, 0x80, 0xF8, 0x6E,
-  0x98, 0x40, 0x0E, 0x90, 0x12, 0xE5, 0xE0, 0x04,
-  0xF0, 0x70, 0x06, 0x90, 0x12, 0xE4, 0xE0, 0x04,
-  0xF0, 0x90, 0x12, 0xF0, 0xE0, 0xFE, 0xA3, 0xE0,
-  0xFF, 0x24, 0x29, 0xF5, 0x82, 0x74, 0x60, 0x3E,
-  0xF5, 0x83, 0xE0, 0xFD, 0x74, 0x28, 0x2F, 0xF5,
-  0x82, 0x74, 0x60, 0x3E, 0xF5, 0x83, 0xE0, 0xC3,
-  0x9D, 0xFF, 0xE4, 0x94, 0x00, 0xFE, 0x12, 0x78,
-  0xF1, 0x90, 0x12, 0xFA, 0xE0, 0xFD, 0xD3, 0xEF,
-  0x9D, 0x74, 0x80, 0xF8, 0x6E, 0x98, 0x40, 0x0E,
-  0x90, 0x12, 0xE5, 0xE0, 0x04, 0xF0, 0x70, 0x06,
-  0x90, 0x12, 0xE4, 0xE0, 0x04, 0xF0, 0x90, 0x12,
-  0xDB, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0x12, 0xDA,
-  0xE0, 0x33, 0xFE, 0x74, 0x80, 0x2F, 0xF5, 0x82,
-  0x74, 0x81, 0x3E, 0xF5, 0x83, 0xE0, 0xFD, 0x74,
-  0x81, 0x2F, 0xF5, 0x82, 0x74, 0x81, 0x3E, 0xF5,
-  0x83, 0xE0, 0x75, 0xF0, 0x14, 0xA4, 0x24, 0x00,
-  0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x10, 0xF5, 0x83,
-  0xE5, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83,
-  0xF5, 0x83, 0xE4, 0xF0, 0x90, 0xF1, 0x03, 0xE0,
-  0xFF, 0x90, 0x12, 0xF5, 0xE0, 0x2F, 0xFF, 0x90,
-  0x12, 0xF4, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x12,
-  0xF0, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x24, 0x00,
-  0xF5, 0x82, 0x74, 0x60, 0x3C, 0xF5, 0x83, 0xE0,
-  0xD3, 0x9F, 0xE4, 0x9E, 0x40, 0x62, 0x90, 0xF1,
-  0x03, 0xE0, 0xFF, 0x90, 0x12, 0xF7, 0xE0, 0x2F,
-  0xFF, 0x90, 0x12, 0xF6, 0xE0, 0x34, 0x00, 0xFE,
-  0x74, 0x00, 0x2D, 0xF5, 0x82, 0x74, 0x60, 0x3C,
-  0xF5, 0x83, 0xE0, 0xD3, 0x9F, 0xE4, 0x9E, 0x40,
-  0x3F, 0x90, 0x12, 0xDB, 0xE0, 0x25, 0xE0, 0xFF,
-  0x90, 0x12, 0xDA, 0xE0, 0x33, 0xFE, 0x74, 0x80,
-  0x2F, 0xF5, 0x82, 0x74, 0x81, 0x3E, 0xF5, 0x83,
-  0xE0, 0xFD, 0x74, 0x81, 0x2F, 0xF5, 0x82, 0x74,
-  0x81, 0x3E, 0xF5, 0x83, 0xE0, 0x75, 0xF0, 0x14,
-  0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE5, 0xF0, 0x34,
-  0x10, 0xF5, 0x83, 0xE5, 0x82, 0x2D, 0xF5, 0x82,
-  0xE4, 0x35, 0x83, 0xF5, 0x83, 0x74, 0x01, 0xF0,
-  0x90, 0x12, 0xDA, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD,
-  0x25, 0xE0, 0xFB, 0xEC, 0x33, 0xFA, 0x74, 0x81,
-  0x2B, 0xF5, 0x82, 0x74, 0x81, 0x3A, 0xF5, 0x83,
-  0xE0, 0x70, 0x4D, 0xD3, 0x90, 0x12, 0xE3, 0xE0,
-  0x94, 0x01, 0x90, 0x12, 0xE2, 0xE0, 0x94, 0x00,
-  0x50, 0x03, 0x02, 0x32, 0x5E, 0xED, 0x25, 0xE0,
-  0xFF, 0xEC, 0x33, 0xFE, 0x74, 0x80, 0x2F, 0xF5,
-  0x82, 0x74, 0x81, 0x3E, 0xF5, 0x83, 0xE0, 0xFD,
-  0x74, 0x81, 0x2F, 0xF5, 0x82, 0x74, 0x81, 0x3E,
-  0xF5, 0x83, 0xE0, 0x75, 0xF0, 0x14, 0xA4, 0x24,
-  0x00, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x10, 0xF5,
-  0x83, 0xE5, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35,
-  0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x02, 0x32, 0x5E,
-  0x74, 0x81, 0x2B, 0xF5, 0x82, 0x74, 0x81, 0x3A,
-  0xF5, 0x83, 0xE0, 0x64, 0x1D, 0x70, 0x52, 0xD3,
-  0x90, 0x12, 0xE3, 0xE0, 0x94, 0x01, 0x90, 0x12,
-  0xE2, 0xE0, 0x94, 0x00, 0x50, 0x03, 0x02, 0x32,
-  0x5E, 0x90, 0x12, 0xDB, 0xE0, 0x25, 0xE0, 0xFF,
-  0x90, 0x12, 0xDA, 0xE0, 0x33, 0xFE, 0x74, 0x80,
-  0x2F, 0xF5, 0x82, 0x74, 0x81, 0x3E, 0xF5, 0x83,
-  0xE0, 0xFD, 0x74, 0x81, 0x2F, 0xF5, 0x82, 0x74,
-  0x81, 0x3E, 0xF5, 0x83, 0xE0, 0x75, 0xF0, 0x14,
-  0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE5, 0xF0, 0x34,
-  0x10, 0xF5, 0x83, 0xE5, 0x82, 0x2D, 0xF5, 0x82,
-  0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x80,
-  0x4D, 0xD3, 0x90, 0x12, 0xE3, 0xE0, 0x94, 0x05,
-  0x90, 0x12, 0xE2, 0xE0, 0x94, 0x00, 0x40, 0x3E,
-  0x90, 0x12, 0xDB, 0xE0, 0x25, 0xE0, 0xFF, 0x90,
-  0x12, 0xDA, 0xE0, 0x33, 0xFE, 0x74, 0x80, 0x2F,
-  0xF5, 0x82, 0x74, 0x81, 0x3E, 0xF5, 0x83, 0xE0,
-  0xFD, 0x74, 0x81, 0x2F, 0xF5, 0x82, 0x74, 0x81,
-  0x3E, 0xF5, 0x83, 0xE0, 0x75, 0xF0, 0x14, 0xA4,
-  0x24, 0x00, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x10,
-  0xF5, 0x83, 0xE5, 0x82, 0x2D, 0xF5, 0x82, 0xE4,
-  0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x12,
-  0xDB, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0x12, 0xDA,
-  0xE0, 0x33, 0xFE, 0x74, 0x80, 0x2F, 0xF5, 0x82,
-  0x74, 0x81, 0x3E, 0xF5, 0x83, 0xE0, 0xF5, 0xCB,
-  0x74, 0x81, 0x2F, 0xF5, 0x82, 0x74, 0x81, 0x3E,
-  0xF5, 0x83, 0xE0, 0xF5, 0xCC, 0xD2, 0xB5, 0x30,
-  0xB5, 0x05, 0x75, 0x9E, 0x55, 0x80, 0xF8, 0x7D,
-  0x19, 0x90, 0x12, 0xDB, 0xE0, 0x25, 0xE0, 0xFF,
-  0x90, 0x12, 0xDA, 0xE0, 0x33, 0xFE, 0x74, 0x81,
-  0x2F, 0xF5, 0x82, 0x74, 0x81, 0x3E, 0xF5, 0x83,
-  0xE0, 0x70, 0x03, 0x02, 0x35, 0x6E, 0x74, 0x81,
-  0x2F, 0xF5, 0x82, 0x74, 0x81, 0x3E, 0xF5, 0x83,
-  0xE0, 0x64, 0x1D, 0x70, 0x03, 0x02, 0x35, 0x6E,
-  0x90, 0x12, 0xDB, 0xE0, 0x25, 0xE0, 0xFF, 0x90,
-  0x12, 0xDA, 0xE0, 0x33, 0xFE, 0x74, 0x80, 0x2F,
-  0xF5, 0x82, 0x74, 0x81, 0x3E, 0xF5, 0x83, 0xE0,
-  0x70, 0x03, 0x02, 0x35, 0x6E, 0x74, 0x80, 0x2F,
-  0xF5, 0x82, 0x74, 0x81, 0x3E, 0xF5, 0x83, 0xE0,
-  0x64, 0x13, 0x70, 0x03, 0x02, 0x35, 0x6E, 0x90,
-  0x12, 0xDA, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x25,
-  0xE0, 0xFF, 0xEA, 0x33, 0xFE, 0x74, 0x80, 0x2F,
-  0xF5, 0x82, 0x74, 0x81, 0x3E, 0xF5, 0x83, 0xE0,
-  0xFC, 0x74, 0x81, 0x2F, 0xF5, 0x82, 0x74, 0x81,
-  0x3E, 0xF5, 0x83, 0xE0, 0x75, 0xF0, 0x14, 0xA4,
-  0x24, 0x00, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x10,
-  0xF5, 0x83, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4,
-  0x35, 0x83, 0xF5, 0x83, 0xE0, 0x64, 0x01, 0x60,
-  0x03, 0x02, 0x35, 0x6E, 0xC3, 0xE5, 0xCA, 0x95,
-  0xB7, 0xC3, 0x9D, 0x50, 0x39, 0xEB, 0x25, 0xE0,
-  0xFF, 0xEA, 0x33, 0xFE, 0x74, 0x80, 0x2F, 0xF5,
-  0x82, 0x74, 0x81, 0x3E, 0xF5, 0x83, 0xE0, 0xFC,
-  0x74, 0x81, 0x2F, 0xF5, 0x82, 0x74, 0x81, 0x3E,
-  0xF5, 0x83, 0xE0, 0x75, 0xF0, 0x14, 0xA4, 0x24,
-  0xEB, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x0F, 0xF5,
-  0x83, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35,
-  0x83, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0xC3, 0xE5,
-  0xCA, 0x95, 0xB9, 0xC3, 0x9D, 0x50, 0x3F, 0x90,
-  0x12, 0xDB, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0x12,
-  0xDA, 0xE0, 0x33, 0xFE, 0x74, 0x80, 0x2F, 0xF5,
-  0x82, 0x74, 0x81, 0x3E, 0xF5, 0x83, 0xE0, 0xFC,
-  0x74, 0x81, 0x2F, 0xF5, 0x82, 0x74, 0x81, 0x3E,
-  0xF5, 0x83, 0xE0, 0x75, 0xF0, 0x14, 0xA4, 0x24,
-  0xEC, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x0F, 0xF5,
-  0x83, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35,
-  0x83, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0xC3, 0xE5,
-  0xCA, 0x95, 0xBA, 0xC3, 0x9D, 0x50, 0x3F, 0x90,
-  0x12, 0xDB, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0x12,
-  0xDA, 0xE0, 0x33, 0xFE, 0x74, 0x80, 0x2F, 0xF5,
-  0x82, 0x74, 0x81, 0x3E, 0xF5, 0x83, 0xE0, 0xFC,
-  0x74, 0x81, 0x2F, 0xF5, 0x82, 0x74, 0x81, 0x3E,
-  0xF5, 0x83, 0xE0, 0x75, 0xF0, 0x14, 0xA4, 0x24,
-  0xED, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x0F, 0xF5,
-  0x83, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35,
-  0x83, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0xC3, 0xE5,
-  0xCA, 0x95, 0xBD, 0xC3, 0x9D, 0x50, 0x3F, 0x90,
-  0x12, 0xDB, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0x12,
-  0xDA, 0xE0, 0x33, 0xFE, 0x74, 0x80, 0x2F, 0xF5,
-  0x82, 0x74, 0x81, 0x3E, 0xF5, 0x83, 0xE0, 0xFC,
-  0x74, 0x81, 0x2F, 0xF5, 0x82, 0x74, 0x81, 0x3E,
-  0xF5, 0x83, 0xE0, 0x75, 0xF0, 0x14, 0xA4, 0x24,
-  0xFF, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x0F, 0xF5,
-  0x83, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35,
-  0x83, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0xC3, 0xE5,
-  0xCA, 0x95, 0xBE, 0xC3, 0x9D, 0x50, 0x3F, 0x90,
-  0x12, 0xDB, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0x12,
-  0xDA, 0xE0, 0x33, 0xFE, 0x74, 0x80, 0x2F, 0xF5,
-  0x82, 0x74, 0x81, 0x3E, 0xF5, 0x83, 0xE0, 0xFC,
-  0x74, 0x81, 0x2F, 0xF5, 0x82, 0x74, 0x81, 0x3E,
-  0xF5, 0x83, 0xE0, 0x75, 0xF0, 0x14, 0xA4, 0x24,
-  0x01, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x10, 0xF5,
-  0x83, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35,
-  0x83, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0xC3, 0xE5,
-  0xCA, 0x95, 0xC2, 0xC3, 0x9D, 0x50, 0x3F, 0x90,
-  0x12, 0xDB, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0x12,
-  0xDA, 0xE0, 0x33, 0xFE, 0x74, 0x80, 0x2F, 0xF5,
-  0x82, 0x74, 0x81, 0x3E, 0xF5, 0x83, 0xE0, 0xFC,
-  0x74, 0x81, 0x2F, 0xF5, 0x82, 0x74, 0x81, 0x3E,
-  0xF5, 0x83, 0xE0, 0x75, 0xF0, 0x14, 0xA4, 0x24,
-  0x13, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x10, 0xF5,
-  0x83, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35,
-  0x83, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0xC3, 0xE5,
-  0xCA, 0x95, 0xC3, 0xC3, 0x9D, 0x50, 0x3F, 0x90,
-  0x12, 0xDB, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0x12,
-  0xDA, 0xE0, 0x33, 0xFE, 0x74, 0x80, 0x2F, 0xF5,
-  0x82, 0x74, 0x81, 0x3E, 0xF5, 0x83, 0xE0, 0xFC,
-  0x74, 0x81, 0x2F, 0xF5, 0x82, 0x74, 0x81, 0x3E,
-  0xF5, 0x83, 0xE0, 0x75, 0xF0, 0x14, 0xA4, 0x24,
-  0x14, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x10, 0xF5,
-  0x83, 0xE5, 0x82, 0x2C, 0xF5, 0x82, 0xE4, 0x35,
-  0x83, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0xC3, 0xE5,
-  0xCA, 0x95, 0xC4, 0xC3, 0x9D, 0x50, 0x3F, 0x90,
-  0x12, 0xDB, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0x12,
-  0xDA, 0xE0, 0x33, 0xFE, 0x74, 0x80, 0x2F, 0xF5,
-  0x82, 0x74, 0x81, 0x3E, 0xF5, 0x83, 0xE0, 0xFD,
-  0x74, 0x81, 0x2F, 0xF5, 0x82, 0x74, 0x81, 0x3E,
-  0xF5, 0x83, 0xE0, 0x75, 0xF0, 0x14, 0xA4, 0x24,
-  0x15, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x10, 0xF5,
-  0x83, 0xE5, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35,
-  0x83, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0x12,
-  0xDB, 0xE0, 0x04, 0xF0, 0x70, 0x06, 0x90, 0x12,
-  0xDA, 0xE0, 0x04, 0xF0, 0x02, 0x29, 0xD9, 0x22,
-  0xE4, 0x90, 0x8F, 0xF0, 0xF0, 0xD2, 0x18, 0x30,
-  0x14, 0x03, 0x02, 0x3B, 0x5F, 0x90, 0x12, 0x5F,
-  0xF0, 0x90, 0x12, 0xDA, 0xF0, 0x90, 0x12, 0xDA,
-  0xE0, 0xFF, 0xC3, 0x95, 0x0D, 0x40, 0x03, 0x02,
-  0x3A, 0x13, 0x74, 0xE5, 0x2F, 0xF5, 0x82, 0xE4,
-  0x34, 0x88, 0xF5, 0x83, 0xE0, 0x70, 0x03, 0x02,
-  0x3A, 0x0A, 0x90, 0x12, 0xDA, 0xE0, 0x24, 0xC0,
-  0xF5, 0x82, 0xE4, 0x34, 0x12, 0xF5, 0x83, 0xE0,
-  0x60, 0x03, 0x02, 0x3A, 0x0A, 0x74, 0x14, 0x2F,
-  0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xE0,
-  0xC3, 0x94, 0x01, 0x74, 0x80, 0x94, 0x88, 0x40,
-  0x03, 0x02, 0x3A, 0x0A, 0x90, 0x12, 0xDA, 0xE0,
-  0x24, 0xE5, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5,
-  0x83, 0xE0, 0x64, 0x03, 0x60, 0x04, 0xC2, 0x18,
-  0x80, 0x07, 0x7F, 0x70, 0x7E, 0x17, 0x12, 0x67,
-  0xEE, 0x90, 0x12, 0xDA, 0xE0, 0x24, 0xE5, 0xF5,
-  0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0xB4,
-  0x02, 0x08, 0x90, 0x12, 0x5F, 0xE0, 0x04, 0xF0,
-  0x80, 0x06, 0x90, 0x12, 0x5F, 0xE0, 0x14, 0xF0,
-  0x90, 0x12, 0xDA, 0xE0, 0xFF, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0xAC, 0xF5, 0x82, 0xE4, 0x34, 0x89,
-  0xF5, 0x83, 0xE0, 0xFD, 0xA3, 0xE0, 0x90, 0x12,
-  0xDB, 0xCD, 0xF0, 0xA3, 0xED, 0xF0, 0xEF, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0xAE, 0xF5, 0x82, 0xE4,
-  0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0,
-  0xFF, 0x90, 0x12, 0xDA, 0xE0, 0xFD, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0xAC, 0xF5, 0x82, 0xE4, 0x34,
-  0x89, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
-  0x90, 0x12, 0xDB, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-  0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0xAE, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0,
-  0xA3, 0xEF, 0xF0, 0x90, 0x12, 0xE1, 0x74, 0x1E,
-  0xF0, 0xA3, 0x74, 0x14, 0xF0, 0xED, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0xAC, 0xF5, 0x82, 0xE4, 0x34,
-  0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-  0xEE, 0x33, 0x95, 0xE0, 0xFD, 0xFC, 0xE4, 0xFB,
-  0x7A, 0x05, 0xF9, 0xF8, 0x12, 0x5A, 0x34, 0x78,
-  0x04, 0x12, 0x5B, 0x75, 0x90, 0x12, 0xDD, 0x12,
-  0x5B, 0x88, 0x90, 0x12, 0xE1, 0xE0, 0xFF, 0x90,
-  0x28, 0x0B, 0xE4, 0x93, 0x8F, 0xF0, 0xA4, 0xFF,
-  0xAE, 0xF0, 0xFB, 0xAA, 0x06, 0xE4, 0xF9, 0xF8,
-  0x90, 0x12, 0xDD, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD,
-  0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x5A,
-  0xBF, 0xAC, 0x00, 0xAD, 0x01, 0xAE, 0x02, 0xAF,
-  0x03, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x12, 0xE1,
-  0xE0, 0xFF, 0x90, 0x28, 0x0B, 0xE4, 0x93, 0x8F,
-  0xF0, 0xA4, 0xFF, 0xE5, 0xF0, 0xA2, 0xE7, 0x13,
-  0xFE, 0xEF, 0x13, 0xFF, 0xFB, 0xAA, 0x06, 0xEA,
-  0x33, 0x95, 0xE0, 0xF9, 0xF8, 0xD0, 0x07, 0xD0,
-  0x06, 0xD3, 0x12, 0x5B, 0x51, 0x50, 0x3C, 0x90,
-  0x12, 0xE1, 0xE0, 0xFF, 0x90, 0x28, 0x0B, 0xE4,
-  0x93, 0x8F, 0xF0, 0xA4, 0xFF, 0xAE, 0xF0, 0xFB,
-  0xAA, 0x06, 0xE4, 0xF9, 0xF8, 0x90, 0x12, 0xDD,
-  0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE,
-  0xA3, 0xE0, 0xFF, 0x12, 0x5A, 0xBF, 0xEF, 0x24,
-  0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0x3D, 0xFD,
-  0xE4, 0x3C, 0xFC, 0x90, 0x12, 0xDD, 0x12, 0x5B,
-  0x88, 0x80, 0x33, 0x90, 0x12, 0xDD, 0xE0, 0xFC,
-  0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0,
-  0xFF, 0xC0, 0x06, 0xC0, 0x07, 0xA3, 0xE0, 0xFF,
-  0x90, 0x28, 0x0B, 0xE4, 0x93, 0x8F, 0xF0, 0xA4,
-  0xFF, 0xAE, 0xF0, 0xFB, 0xAA, 0x06, 0xE4, 0xF9,
-  0xF8, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x5A, 0xBF,
-  0x90, 0x12, 0xDD, 0x12, 0x5B, 0x88, 0x90, 0x12,
-  0xDD, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0,
-  0xFE, 0xA3, 0xE0, 0xFF, 0x78, 0x04, 0x12, 0x5B,
-  0x62, 0x90, 0x12, 0xDA, 0xE0, 0xFD, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0xAC, 0xF5, 0x82, 0xE4, 0x34,
-  0x89, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
-  0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0xAE, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE,
-  0xA3, 0xE0, 0xFF, 0xEE, 0x33, 0x95, 0xE0, 0xFD,
-  0xFC, 0xE4, 0x7B, 0x20, 0x7A, 0x03, 0xF9, 0xF8,
-  0x12, 0x5A, 0x34, 0x78, 0x04, 0x12, 0x5B, 0x75,
-  0x90, 0x12, 0xDD, 0x12, 0x5B, 0x88, 0x90, 0x12,
-  0xE2, 0xE0, 0xFF, 0x90, 0x28, 0x0C, 0xE4, 0x93,
-  0x8F, 0xF0, 0xA4, 0xFF, 0xAE, 0xF0, 0xFB, 0xAA,
-  0x06, 0xE4, 0xF9, 0xF8, 0x90, 0x12, 0xDD, 0xE0,
-  0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3,
-  0xE0, 0xFF, 0x12, 0x5A, 0xBF, 0xAC, 0x00, 0xAD,
-  0x01, 0xAE, 0x02, 0xAF, 0x03, 0xC0, 0x06, 0xC0,
-  0x07, 0x90, 0x12, 0xE2, 0xE0, 0xFF, 0x90, 0x28,
-  0x0C, 0xE4, 0x93, 0x8F, 0xF0, 0xA4, 0xFF, 0xE5,
-  0xF0, 0xA2, 0xE7, 0x13, 0xFE, 0xEF, 0x13, 0xFF,
-  0xFB, 0xAA, 0x06, 0xEA, 0x33, 0x95, 0xE0, 0xF9,
-  0xF8, 0xD0, 0x07, 0xD0, 0x06, 0xD3, 0x12, 0x5B,
-  0x51, 0x50, 0x3C, 0x90, 0x12, 0xE2, 0xE0, 0xFF,
-  0x90, 0x28, 0x0C, 0xE4, 0x93, 0x8F, 0xF0, 0xA4,
-  0xFF, 0xAE, 0xF0, 0xFB, 0xAA, 0x06, 0xE4, 0xF9,
-  0xF8, 0x90, 0x12, 0xDD, 0xE0, 0xFC, 0xA3, 0xE0,
-  0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12,
-  0x5A, 0xBF, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E,
-  0xFE, 0xE4, 0x3D, 0xFD, 0xE4, 0x3C, 0xFC, 0x90,
-  0x12, 0xDD, 0x12, 0x5B, 0x88, 0x80, 0x35, 0x90,
-  0x12, 0xDD, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3,
-  0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC0, 0x06, 0xC0,
-  0x07, 0x90, 0x12, 0xE2, 0xE0, 0xFF, 0x90, 0x28,
-  0x0C, 0xE4, 0x93, 0x8F, 0xF0, 0xA4, 0xFF, 0xAE,
-  0xF0, 0xFB, 0xAA, 0x06, 0xE4, 0xF9, 0xF8, 0xD0,
-  0x07, 0xD0, 0x06, 0x12, 0x5A, 0xBF, 0x90, 0x12,
-  0xDD, 0x12, 0x5B, 0x88, 0x90, 0x12, 0xDD, 0xE0,
-  0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3,
-  0xE0, 0xFF, 0x78, 0x04, 0x12, 0x5B, 0x62, 0x90,
-  0x12, 0xDA, 0xE0, 0xFD, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0xAE, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xED, 0x04,
-  0xFF, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x74,
-  0xE5, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5,
-  0x83, 0xE0, 0x4F, 0xFF, 0x90, 0x8F, 0xF0, 0xE0,
-  0x75, 0xF0, 0x06, 0xA4, 0x24, 0x03, 0xF5, 0x82,
-  0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEF, 0xF0, 0xED,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0xAC, 0xF5, 0x82,
-  0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3,
-  0xE0, 0x78, 0x04, 0xCE, 0xA2, 0xE7, 0x13, 0xCE,
-  0x13, 0xD8, 0xF8, 0xFF, 0x90, 0x8F, 0xF0, 0xE0,
-  0x75, 0xF0, 0x06, 0xA4, 0x24, 0x00, 0xF5, 0x82,
-  0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEF, 0xF0, 0xED,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0xAE, 0xF5, 0x82,
-  0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE, 0xA3,
-  0xE0, 0x78, 0x04, 0xCE, 0xA2, 0xE7, 0x13, 0xCE,
-  0x13, 0xD8, 0xF8, 0xFF, 0x90, 0x8F, 0xF0, 0xE0,
-  0x75, 0xF0, 0x06, 0xA4, 0x24, 0x01, 0xF5, 0x82,
-  0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEF, 0xF0, 0xED,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0xAC, 0xF5, 0x82,
-  0xE4, 0x34, 0x89, 0xF5, 0x83, 0xA3, 0xE0, 0xC4,
-  0xF8, 0x54, 0x0F, 0xC8, 0x68, 0xFF, 0x05, 0x82,
-  0xD5, 0x82, 0x02, 0x15, 0x83, 0x15, 0x82, 0xE0,
-  0xC4, 0x54, 0xF0, 0x48, 0xEF, 0x54, 0xF0, 0xFF,
-  0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0xAE, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xA3,
-  0xE0, 0x54, 0x0F, 0x4F, 0xFF, 0x90, 0x8F, 0xF0,
-  0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x02, 0xF5,
-  0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEF, 0xF0,
-  0x90, 0x3F, 0xFE, 0xE0, 0xB4, 0x01, 0x2D, 0xE5,
-  0x09, 0xFF, 0x90, 0x8F, 0xF0, 0xE0, 0x75, 0xF0,
-  0x06, 0xA4, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34,
-  0x8F, 0xF5, 0x83, 0xEF, 0xF0, 0xAF, 0x0A, 0x90,
-  0x8F, 0xF0, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24,
-  0x05, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83,
-  0xEF, 0xF0, 0x80, 0x28, 0x90, 0x8F, 0xF0, 0xE0,
-  0x75, 0xF0, 0x06, 0xA4, 0x24, 0x04, 0xF5, 0x82,
-  0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74, 0x08, 0xF0,
-  0x90, 0x8F, 0xF0, 0xE0, 0x75, 0xF0, 0x06, 0xA4,
-  0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5,
-  0x83, 0x74, 0x08, 0xF0, 0x90, 0x8F, 0xF0, 0xE0,
-  0x04, 0xF0, 0x90, 0x12, 0xDA, 0xE0, 0x04, 0xF0,
-  0x02, 0x35, 0x95, 0x90, 0x8F, 0xF0, 0xE0, 0xFF,
-  0x90, 0x12, 0x5F, 0xE0, 0xB5, 0x07, 0x04, 0xD2,
-  0x04, 0x80, 0x02, 0xC2, 0x04, 0x20, 0x16, 0x03,
-  0x02, 0x3A, 0xC4, 0x78, 0x10, 0xE6, 0x60, 0x02,
-  0xC2, 0x18, 0x78, 0x11, 0xE6, 0x24, 0x14, 0xFF,
-  0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x78, 0x10,
-  0xE6, 0xFE, 0x4F, 0xFF, 0x90, 0x8F, 0xF0, 0xE0,
-  0x75, 0xF0, 0x06, 0xA4, 0x24, 0x00, 0xF5, 0x82,
-  0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEF, 0xF0, 0x90,
-  0x8F, 0xF0, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24,
-  0x01, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83,
-  0xE4, 0xF0, 0x90, 0x8F, 0xF0, 0xE0, 0x75, 0xF0,
-  0x06, 0xA4, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34,
-  0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x8F, 0xF0,
-  0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x03, 0xF5,
-  0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0,
-  0x90, 0x8F, 0xF0, 0xE0, 0x75, 0xF0, 0x06, 0xA4,
-  0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5,
-  0x83, 0xE4, 0xF0, 0x90, 0x8F, 0xF0, 0xE0, 0x75,
-  0xF0, 0x06, 0xA4, 0x24, 0x05, 0xF5, 0x82, 0xE4,
-  0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x8F,
-  0xF0, 0xE0, 0x04, 0xF0, 0xEE, 0x70, 0x05, 0x78,
-  0x11, 0xF6, 0xC2, 0x16, 0x30, 0x0B, 0x03, 0x02,
-  0x3B, 0x4A, 0x90, 0x8F, 0xF0, 0xE0, 0x90, 0x12,
-  0xDA, 0xF0, 0x90, 0x12, 0xDA, 0xE0, 0xFF, 0xC3,
-  0x95, 0x0D, 0x50, 0x6E, 0xEF, 0x75, 0xF0, 0x06,
-  0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x8F,
-  0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xEF, 0x75, 0xF0,
-  0x06, 0xA4, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34,
-  0x8F, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xEF, 0x75,
-  0xF0, 0x06, 0xA4, 0x24, 0x02, 0xF5, 0x82, 0xE4,
-  0x34, 0x8F, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xEF,
-  0x75, 0xF0, 0x06, 0xA4, 0x24, 0x03, 0xF5, 0x82,
-  0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74, 0xFF, 0xF0,
-  0xEF, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x04, 0xF5,
-  0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74, 0xFF,
-  0xF0, 0xEF, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x05,
-  0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74,
-  0xFF, 0xF0, 0x90, 0x12, 0xDA, 0xE0, 0x04, 0xF0,
-  0x80, 0x88, 0x90, 0x8F, 0xF0, 0xE0, 0xD3, 0x94,
-  0x00, 0x50, 0x03, 0x02, 0x41, 0x2C, 0x20, 0x18,
-  0x03, 0x02, 0x41, 0x2C, 0xD2, 0x0C, 0x22, 0xE4,
-  0x90, 0x12, 0xDA, 0xF0, 0x90, 0x12, 0xDA, 0xE0,
-  0xFF, 0xC3, 0x95, 0x0D, 0x40, 0x03, 0x02, 0x3F,
-  0xE7, 0xE4, 0x90, 0x12, 0x5F, 0xF0, 0x74, 0xE5,
-  0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83,
-  0xE0, 0x70, 0x03, 0x02, 0x3F, 0xDE, 0x90, 0x12,
-  0xDA, 0xE0, 0x24, 0xC0, 0xF5, 0x82, 0xE4, 0x34,
-  0x12, 0xF5, 0x83, 0xE0, 0x60, 0x03, 0x02, 0x3F,
-  0xDE, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
-  0x8A, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x01, 0x74,
-  0x80, 0x94, 0x88, 0x40, 0x03, 0x02, 0x3F, 0xDE,
-  0x90, 0x12, 0xDA, 0xE0, 0x24, 0xE5, 0xF5, 0x82,
-  0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0x64, 0x03,
-  0x60, 0x04, 0xC2, 0x18, 0x80, 0x07, 0x7F, 0x70,
-  0x7E, 0x17, 0x12, 0x67, 0xEE, 0x90, 0x12, 0xDA,
-  0xE0, 0x24, 0xE5, 0xF5, 0x82, 0xE4, 0x34, 0x88,
-  0xF5, 0x83, 0xE0, 0xB4, 0x02, 0x08, 0x90, 0x12,
-  0x5F, 0xE0, 0x04, 0xF0, 0x80, 0x06, 0x90, 0x12,
-  0x5F, 0xE0, 0x14, 0xF0, 0x90, 0x12, 0xDA, 0xE0,
-  0xFF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0xAC, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFD,
-  0xA3, 0xE0, 0x90, 0x12, 0xDB, 0xCD, 0xF0, 0xA3,
-  0xED, 0xF0, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0xAE, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83,
-  0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x12, 0xDA,
-  0xE0, 0xFD, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0xAC,
-  0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE,
-  0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x12, 0xDB, 0xE0,
-  0xFE, 0xA3, 0xE0, 0xFF, 0xED, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0xAE, 0xF5, 0x82, 0xE4, 0x34, 0x89,
-  0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90,
-  0x12, 0xE1, 0x74, 0x1E, 0xF0, 0xA3, 0x74, 0x14,
-  0xF0, 0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0xAC,
-  0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0,
-  0xFE, 0xA3, 0xE0, 0xFF, 0xEE, 0x33, 0x95, 0xE0,
-  0xFD, 0xFC, 0xE4, 0xFB, 0x7A, 0x05, 0xF9, 0xF8,
-  0x12, 0x5A, 0x34, 0x78, 0x04, 0x12, 0x5B, 0x75,
-  0x90, 0x12, 0xDD, 0x12, 0x5B, 0x88, 0x90, 0x12,
-  0xE1, 0xE0, 0xFF, 0x90, 0x28, 0x0B, 0xE4, 0x93,
-  0x8F, 0xF0, 0xA4, 0xFF, 0xAE, 0xF0, 0xFB, 0xAA,
-  0x06, 0xE4, 0xF9, 0xF8, 0x90, 0x12, 0xDD, 0xE0,
-  0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3,
-  0xE0, 0xFF, 0x12, 0x5A, 0xBF, 0xAC, 0x00, 0xAD,
-  0x01, 0xAE, 0x02, 0xAF, 0x03, 0xC0, 0x06, 0xC0,
-  0x07, 0x90, 0x12, 0xE1, 0xE0, 0xFF, 0x90, 0x28,
-  0x0B, 0xE4, 0x93, 0x8F, 0xF0, 0xA4, 0xFF, 0xE5,
-  0xF0, 0xA2, 0xE7, 0x13, 0xFE, 0xEF, 0x13, 0xFF,
-  0xFB, 0xAA, 0x06, 0xEA, 0x33, 0x95, 0xE0, 0xF9,
-  0xF8, 0xD0, 0x07, 0xD0, 0x06, 0xD3, 0x12, 0x5B,
-  0x51, 0x50, 0x3C, 0x90, 0x12, 0xE1, 0xE0, 0xFF,
-  0x90, 0x28, 0x0B, 0xE4, 0x93, 0x8F, 0xF0, 0xA4,
-  0xFF, 0xAE, 0xF0, 0xFB, 0xAA, 0x06, 0xE4, 0xF9,
-  0xF8, 0x90, 0x12, 0xDD, 0xE0, 0xFC, 0xA3, 0xE0,
-  0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12,
-  0x5A, 0xBF, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E,
-  0xFE, 0xE4, 0x3D, 0xFD, 0xE4, 0x3C, 0xFC, 0x90,
-  0x12, 0xDD, 0x12, 0x5B, 0x88, 0x80, 0x33, 0x90,
-  0x12, 0xDD, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3,
-  0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC0, 0x06, 0xC0,
-  0x07, 0xA3, 0xE0, 0xFF, 0x90, 0x28, 0x0B, 0xE4,
-  0x93, 0x8F, 0xF0, 0xA4, 0xFF, 0xAE, 0xF0, 0xFB,
-  0xAA, 0x06, 0xE4, 0xF9, 0xF8, 0xD0, 0x07, 0xD0,
-  0x06, 0x12, 0x5A, 0xBF, 0x90, 0x12, 0xDD, 0x12,
-  0x5B, 0x88, 0x90, 0x12, 0xDD, 0xE0, 0xFC, 0xA3,
-  0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-  0x78, 0x04, 0x12, 0x5B, 0x62, 0x90, 0x12, 0xDA,
-  0xE0, 0xFD, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0xAC,
-  0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE,
-  0xF0, 0xA3, 0xEF, 0xF0, 0xED, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0xAE, 0xF5, 0x82, 0xE4, 0x34, 0x89,
-  0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xEE,
-  0x33, 0x95, 0xE0, 0xFD, 0xFC, 0xE4, 0x7B, 0x20,
-  0x7A, 0x03, 0xF9, 0xF8, 0x12, 0x5A, 0x34, 0x78,
-  0x04, 0x12, 0x5B, 0x75, 0x90, 0x12, 0xDD, 0x12,
-  0x5B, 0x88, 0x90, 0x12, 0xE2, 0xE0, 0xFF, 0x90,
-  0x28, 0x0C, 0xE4, 0x93, 0x8F, 0xF0, 0xA4, 0xFF,
-  0xAE, 0xF0, 0xFB, 0xAA, 0x06, 0xE4, 0xF9, 0xF8,
-  0x90, 0x12, 0xDD, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD,
-  0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x5A,
-  0xBF, 0xAC, 0x00, 0xAD, 0x01, 0xAE, 0x02, 0xAF,
-  0x03, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x12, 0xE2,
-  0xE0, 0xFF, 0x90, 0x28, 0x0C, 0xE4, 0x93, 0x8F,
-  0xF0, 0xA4, 0xFF, 0xE5, 0xF0, 0xA2, 0xE7, 0x13,
-  0xFE, 0xEF, 0x13, 0xFF, 0xFB, 0xAA, 0x06, 0xEA,
-  0x33, 0x95, 0xE0, 0xF9, 0xF8, 0xD0, 0x07, 0xD0,
-  0x06, 0xD3, 0x12, 0x5B, 0x51, 0x50, 0x3C, 0x90,
-  0x12, 0xE2, 0xE0, 0xFF, 0x90, 0x28, 0x0C, 0xE4,
-  0x93, 0x8F, 0xF0, 0xA4, 0xFF, 0xAE, 0xF0, 0xFB,
-  0xAA, 0x06, 0xE4, 0xF9, 0xF8, 0x90, 0x12, 0xDD,
-  0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE,
-  0xA3, 0xE0, 0xFF, 0x12, 0x5A, 0xBF, 0xEF, 0x24,
-  0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0x3D, 0xFD,
-  0xE4, 0x3C, 0xFC, 0x90, 0x12, 0xDD, 0x12, 0x5B,
-  0x88, 0x80, 0x35, 0x90, 0x12, 0xDD, 0xE0, 0xFC,
-  0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0,
-  0xFF, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x12, 0xE2,
-  0xE0, 0xFF, 0x90, 0x28, 0x0C, 0xE4, 0x93, 0x8F,
-  0xF0, 0xA4, 0xFF, 0xAE, 0xF0, 0xFB, 0xAA, 0x06,
-  0xE4, 0xF9, 0xF8, 0xD0, 0x07, 0xD0, 0x06, 0x12,
-  0x5A, 0xBF, 0x90, 0x12, 0xDD, 0x12, 0x5B, 0x88,
-  0x90, 0x12, 0xDD, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD,
-  0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x78, 0x04,
-  0x12, 0x5B, 0x62, 0x90, 0x12, 0xDA, 0xE0, 0xFD,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0xAE, 0xF5, 0x82,
-  0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0xA3,
-  0xEF, 0xF0, 0xED, 0x04, 0xFF, 0x33, 0x33, 0x33,
-  0x54, 0xF8, 0xFF, 0x74, 0xE5, 0x2D, 0xF5, 0x82,
-  0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0x4F, 0xFF,
-  0x90, 0x8F, 0xF0, 0xE0, 0x75, 0xF0, 0x06, 0xA4,
-  0x24, 0x7B, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5,
-  0x83, 0xEF, 0xF0, 0xED, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0xAC, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x78, 0x04, 0xCE,
-  0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF,
-  0x90, 0x8F, 0xF0, 0xE0, 0x75, 0xF0, 0x06, 0xA4,
-  0x24, 0x78, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5,
-  0x83, 0xEF, 0xF0, 0xED, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0xAE, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0x78, 0x04, 0xCE,
-  0xA2, 0xE7, 0x13, 0xCE, 0x13, 0xD8, 0xF8, 0xFF,
-  0x90, 0x8F, 0xF0, 0xE0, 0x75, 0xF0, 0x06, 0xA4,
-  0x24, 0x79, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5,
-  0x83, 0xEF, 0xF0, 0xED, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0xAC, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xA3, 0xE0, 0xC4, 0xF8, 0x54, 0x0F, 0xC8,
-  0x68, 0xFF, 0x05, 0x82, 0xD5, 0x82, 0x02, 0x15,
-  0x83, 0x15, 0x82, 0xE0, 0xC4, 0x54, 0xF0, 0x48,
-  0xEF, 0x54, 0xF0, 0xFF, 0xED, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0xAE, 0xF5, 0x82, 0xE4, 0x34, 0x89,
-  0xF5, 0x83, 0xE0, 0xA3, 0xE0, 0x54, 0x0F, 0x4F,
-  0xFF, 0x90, 0x8F, 0xF0, 0xE0, 0x75, 0xF0, 0x06,
-  0xA4, 0x24, 0x7A, 0xF5, 0x82, 0xE4, 0x34, 0x8F,
-  0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x3F, 0xFE, 0xE0,
-  0xB4, 0x01, 0x2D, 0xE5, 0x09, 0xFF, 0x90, 0x8F,
-  0xF0, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x7C,
-  0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEF,
-  0xF0, 0xAF, 0x0A, 0x90, 0x8F, 0xF0, 0xE0, 0x75,
-  0xF0, 0x06, 0xA4, 0x24, 0x7D, 0xF5, 0x82, 0xE4,
-  0x34, 0x8F, 0xF5, 0x83, 0xEF, 0xF0, 0x80, 0x28,
-  0x90, 0x8F, 0xF0, 0xE0, 0x75, 0xF0, 0x06, 0xA4,
-  0x24, 0x7C, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5,
-  0x83, 0x74, 0x08, 0xF0, 0x90, 0x8F, 0xF0, 0xE0,
-  0x75, 0xF0, 0x06, 0xA4, 0x24, 0x7D, 0xF5, 0x82,
-  0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74, 0x08, 0xF0,
-  0x90, 0x8F, 0xF0, 0xE0, 0x04, 0xF0, 0x90, 0x12,
-  0xDA, 0xE0, 0x04, 0xF0, 0x02, 0x3B, 0x64, 0x90,
-  0x8F, 0xF0, 0xE0, 0xFF, 0x90, 0x12, 0x5F, 0xE0,
-  0xB5, 0x07, 0x04, 0xD2, 0x04, 0x80, 0x02, 0xC2,
-  0x04, 0x20, 0x16, 0x03, 0x02, 0x40, 0x98, 0x78,
-  0x10, 0xE6, 0x60, 0x02, 0xC2, 0x18, 0x78, 0x11,
-  0xE6, 0x24, 0x14, 0xFF, 0x33, 0x33, 0x33, 0x54,
-  0xF8, 0xFF, 0x78, 0x10, 0xE6, 0xFE, 0x4F, 0xFF,
-  0x90, 0x8F, 0xF0, 0xE0, 0x75, 0xF0, 0x06, 0xA4,
-  0x24, 0x78, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5,
-  0x83, 0xEF, 0xF0, 0x90, 0x8F, 0xF0, 0xE0, 0x75,
-  0xF0, 0x06, 0xA4, 0x24, 0x79, 0xF5, 0x82, 0xE4,
-  0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x8F,
-  0xF0, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x7A,
-  0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4,
-  0xF0, 0x90, 0x8F, 0xF0, 0xE0, 0x75, 0xF0, 0x06,
-  0xA4, 0x24, 0x7B, 0xF5, 0x82, 0xE4, 0x34, 0x8F,
-  0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x8F, 0xF0, 0xE0,
-  0x75, 0xF0, 0x06, 0xA4, 0x24, 0x7C, 0xF5, 0x82,
-  0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE4, 0xF0, 0x90,
-  0x8F, 0xF0, 0xE0, 0x75, 0xF0, 0x06, 0xA4, 0x24,
-  0x7D, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83,
-  0xE4, 0xF0, 0x90, 0x8F, 0xF0, 0xE0, 0x04, 0xF0,
-  0xEE, 0x70, 0x05, 0x78, 0x11, 0xF6, 0xC2, 0x16,
-  0x30, 0x0B, 0x03, 0x02, 0x41, 0x1E, 0x90, 0x8F,
-  0xF0, 0xE0, 0x90, 0x12, 0xDA, 0xF0, 0x90, 0x12,
-  0xDA, 0xE0, 0xFF, 0xC3, 0x95, 0x0D, 0x50, 0x6E,
-  0xEF, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x78, 0xF5,
-  0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74, 0xFF,
-  0xF0, 0xEF, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x79,
-  0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x74,
-  0xFF, 0xF0, 0xEF, 0x75, 0xF0, 0x06, 0xA4, 0x24,
-  0x7A, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83,
-  0x74, 0xFF, 0xF0, 0xEF, 0x75, 0xF0, 0x06, 0xA4,
-  0x24, 0x7B, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5,
-  0x83, 0x74, 0xFF, 0xF0, 0xEF, 0x75, 0xF0, 0x06,
-  0xA4, 0x24, 0x7C, 0xF5, 0x82, 0xE4, 0x34, 0x8F,
-  0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xEF, 0x75, 0xF0,
-  0x06, 0xA4, 0x24, 0x7D, 0xF5, 0x82, 0xE4, 0x34,
-  0x8F, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x90, 0x12,
-  0xDA, 0xE0, 0x04, 0xF0, 0x80, 0x88, 0x90, 0x8F,
-  0xF0, 0xE0, 0xD3, 0x94, 0x00, 0x40, 0x05, 0x30,
-  0x18, 0x02, 0xD2, 0x0C, 0x22, 0x90, 0xF1, 0x93,
-  0x74, 0x01, 0xF0, 0xE4, 0x90, 0xF1, 0x46, 0xF0,
-  0x90, 0xF1, 0x1B, 0x04, 0xF0, 0x90, 0xF0, 0x02,
-  0x74, 0x08, 0xF0, 0xE4, 0x90, 0xF0, 0x01, 0xF0,
-  0x90, 0xF0, 0x04, 0x74, 0x08, 0xF0, 0xE4, 0x90,
-  0xF0, 0x03, 0xF0, 0x90, 0xF0, 0x06, 0x74, 0x08,
-  0xF0, 0xE4, 0x90, 0xF0, 0x05, 0xF0, 0x90, 0xF0,
-  0x08, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0xF0, 0x07,
-  0xF0, 0x90, 0xF0, 0x0A, 0x74, 0x08, 0xF0, 0xE4,
-  0x90, 0xF0, 0x09, 0xF0, 0x90, 0xF0, 0x0C, 0x74,
-  0x08, 0xF0, 0xE4, 0x90, 0xF0, 0x0B, 0xF0, 0x90,
-  0xF0, 0x0E, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0xF0,
-  0x0D, 0xF0, 0x90, 0xF0, 0x10, 0x74, 0x20, 0xF0,
-  0xE4, 0x90, 0xF0, 0x0F, 0xF0, 0x90, 0xF0, 0x12,
-  0x74, 0x20, 0xF0, 0x90, 0xF0, 0x11, 0x74, 0x01,
-  0xF0, 0x90, 0xF0, 0x14, 0x74, 0x20, 0xF0, 0x90,
-  0xF0, 0x13, 0x74, 0x02, 0xF0, 0x90, 0xF0, 0x16,
-  0x74, 0x20, 0xF0, 0x90, 0xF0, 0x15, 0x74, 0x03,
-  0xF0, 0x90, 0xF0, 0x18, 0x74, 0x20, 0xF0, 0x90,
-  0xF0, 0x17, 0x74, 0x04, 0xF0, 0x90, 0xF0, 0x1A,
-  0x74, 0x20, 0xF0, 0x90, 0xF0, 0x19, 0x74, 0x05,
-  0xF0, 0x90, 0xF0, 0x1C, 0x74, 0x20, 0xF0, 0x90,
-  0xF0, 0x1B, 0x74, 0x06, 0xF0, 0x90, 0xF0, 0x1E,
-  0x74, 0x20, 0xF0, 0x90, 0xF0, 0x1D, 0x74, 0x07,
-  0xF0, 0x90, 0xF0, 0x20, 0x74, 0x20, 0xF0, 0x90,
-  0xF0, 0x1F, 0x74, 0x08, 0xF0, 0x90, 0xF0, 0x22,
-  0x74, 0x20, 0xF0, 0x90, 0xF0, 0x21, 0x74, 0x09,
-  0xF0, 0x90, 0xF0, 0x24, 0x74, 0x20, 0xF0, 0x90,
-  0xF0, 0x23, 0x74, 0x0A, 0xF0, 0x90, 0xF0, 0x26,
-  0x74, 0x20, 0xF0, 0x90, 0xF0, 0x25, 0x74, 0x0B,
-  0xF0, 0x90, 0xF0, 0x28, 0x74, 0x20, 0xF0, 0x90,
-  0xF0, 0x27, 0x74, 0x0C, 0xF0, 0x90, 0xF0, 0x2A,
-  0x74, 0x20, 0xF0, 0x90, 0xF0, 0x29, 0x74, 0x0D,
-  0xF0, 0x90, 0xF0, 0x2C, 0x74, 0x20, 0xF0, 0x90,
-  0xF0, 0x2B, 0x74, 0x0E, 0xF0, 0x90, 0xF0, 0x2E,
-  0x74, 0x20, 0xF0, 0x90, 0xF0, 0x2D, 0x74, 0x0F,
-  0xF0, 0x90, 0xF0, 0x30, 0x74, 0x20, 0xF0, 0x90,
-  0xF0, 0x2F, 0x74, 0x10, 0xF0, 0x90, 0xF0, 0x32,
-  0x74, 0x08, 0xF0, 0xE4, 0x90, 0xF0, 0x31, 0xF0,
-  0x90, 0xF0, 0x34, 0x74, 0x08, 0xF0, 0xE4, 0x90,
-  0xF0, 0x33, 0xF0, 0x90, 0xF0, 0x36, 0x74, 0x08,
-  0xF0, 0xE4, 0x90, 0xF0, 0x35, 0xF0, 0x90, 0xF0,
-  0x38, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0xF0, 0x37,
-  0xF0, 0x90, 0xF0, 0x3A, 0x74, 0x08, 0xF0, 0xE4,
-  0x90, 0xF0, 0x39, 0xF0, 0x90, 0xF0, 0x3C, 0x74,
-  0x08, 0xF0, 0xE4, 0x90, 0xF0, 0x3B, 0xF0, 0x90,
-  0xF0, 0x3E, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0xF0,
-  0x3D, 0xF0, 0x90, 0xF0, 0x40, 0x74, 0x08, 0xF0,
-  0xE4, 0x90, 0xF0, 0x3F, 0xF0, 0x90, 0xF0, 0x42,
-  0x74, 0x08, 0xF0, 0xE4, 0x90, 0xF0, 0x41, 0xF0,
-  0x90, 0xF0, 0x44, 0x74, 0x08, 0xF0, 0xE4, 0x90,
-  0xF0, 0x43, 0xF0, 0x90, 0xF0, 0x46, 0x74, 0x08,
-  0xF0, 0xE4, 0x90, 0xF0, 0x45, 0xF0, 0x90, 0xF0,
-  0x48, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0xF0, 0x47,
-  0xF0, 0x90, 0xF0, 0x4A, 0x74, 0x08, 0xF0, 0xE4,
-  0x90, 0xF0, 0x49, 0xF0, 0x90, 0xF0, 0x4C, 0x74,
-  0x08, 0xF0, 0xE4, 0x90, 0xF0, 0x4B, 0xF0, 0x90,
-  0xF0, 0x4E, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0xF0,
-  0x4D, 0xF0, 0x90, 0xF0, 0x50, 0x74, 0x20, 0xF0,
-  0x90, 0xF0, 0x4F, 0x74, 0x11, 0xF0, 0x90, 0xF0,
-  0x52, 0x74, 0x20, 0xF0, 0x90, 0xF0, 0x51, 0x74,
-  0x12, 0xF0, 0x90, 0xF0, 0x54, 0x74, 0x20, 0xF0,
-  0x90, 0xF0, 0x53, 0x74, 0x13, 0xF0, 0x90, 0xF0,
-  0x56, 0x74, 0x20, 0xF0, 0x90, 0xF0, 0x55, 0x74,
-  0x14, 0xF0, 0x90, 0xF0, 0x58, 0x74, 0x20, 0xF0,
-  0x90, 0xF0, 0x57, 0x74, 0x15, 0xF0, 0x90, 0xF0,
-  0x5A, 0x74, 0x20, 0xF0, 0x90, 0xF0, 0x59, 0x74,
-  0x16, 0xF0, 0x90, 0xF0, 0x5C, 0x74, 0x20, 0xF0,
-  0x90, 0xF0, 0x5B, 0x74, 0x17, 0xF0, 0x90, 0xF0,
-  0x5E, 0x74, 0x20, 0xF0, 0x90, 0xF0, 0x5D, 0x74,
-  0x18, 0xF0, 0x90, 0xF0, 0x60, 0x74, 0x20, 0xF0,
-  0x90, 0xF0, 0x5F, 0x74, 0x19, 0xF0, 0x90, 0xF0,
-  0x62, 0x74, 0x20, 0xF0, 0x90, 0xF0, 0x61, 0x74,
-  0x1A, 0xF0, 0x90, 0xF0, 0x64, 0x74, 0x20, 0xF0,
-  0x90, 0xF0, 0x63, 0x74, 0x1B, 0xF0, 0x90, 0xF0,
-  0x66, 0x74, 0x20, 0xF0, 0x90, 0xF0, 0x65, 0x74,
-  0x1C, 0xF0, 0x90, 0xF0, 0x68, 0x74, 0x20, 0xF0,
-  0x90, 0xF0, 0x67, 0x74, 0x1D, 0xF0, 0x90, 0xF0,
-  0x6A, 0x74, 0x16, 0xF0, 0x90, 0xF0, 0x69, 0x74,
-  0x01, 0xF0, 0x90, 0xF0, 0x6C, 0x74, 0x16, 0xF0,
-  0xE4, 0x90, 0xF0, 0x6B, 0xF0, 0x90, 0xF0, 0x6E,
-  0x74, 0x15, 0xF0, 0x90, 0xF0, 0x6D, 0x74, 0x02,
-  0xF0, 0x90, 0xF0, 0x70, 0x74, 0x15, 0xF0, 0x90,
-  0xF0, 0x6F, 0x74, 0x01, 0xF0, 0x90, 0xF0, 0x72,
-  0x74, 0x08, 0xF0, 0xE4, 0x90, 0xF0, 0x71, 0xF0,
-  0x90, 0xF0, 0x74, 0x74, 0x08, 0xF0, 0xE4, 0x90,
-  0xF0, 0x73, 0xF0, 0x90, 0xF0, 0x76, 0x74, 0x08,
-  0xF0, 0xE4, 0x90, 0xF0, 0x75, 0xF0, 0x90, 0xF0,
-  0x78, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0xF0, 0x77,
-  0xF0, 0x90, 0xF0, 0x7A, 0x74, 0x08, 0xF0, 0xE4,
-  0x90, 0xF0, 0x79, 0xF0, 0x90, 0xF0, 0x7C, 0x74,
-  0x08, 0xF0, 0xE4, 0x90, 0xF0, 0x7B, 0xF0, 0x90,
-  0xF0, 0x7E, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0xF0,
-  0x7D, 0xF0, 0x90, 0xF0, 0x80, 0x74, 0x08, 0xF0,
-  0xE4, 0x90, 0xF0, 0x7F, 0xF0, 0x90, 0xF0, 0x82,
-  0x74, 0x08, 0xF0, 0xE4, 0x90, 0xF0, 0x81, 0xF0,
-  0x90, 0xF0, 0x84, 0x74, 0x08, 0xF0, 0xE4, 0x90,
-  0xF0, 0x83, 0xF0, 0x90, 0xF0, 0x86, 0x74, 0x08,
-  0xF0, 0xE4, 0x90, 0xF0, 0x85, 0xF0, 0x90, 0xF0,
-  0x88, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0xF0, 0x87,
-  0xF0, 0x90, 0xF0, 0x8A, 0x74, 0x08, 0xF0, 0xE4,
-  0x90, 0xF0, 0x89, 0xF0, 0x90, 0xF0, 0x8C, 0x74,
-  0x08, 0xF0, 0xE4, 0x90, 0xF0, 0x8B, 0xF0, 0x90,
-  0xF0, 0x8E, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0xF0,
-  0x8D, 0xF0, 0x90, 0xF0, 0x90, 0x74, 0x08, 0xF0,
-  0xE4, 0x90, 0xF0, 0x8F, 0xF0, 0x90, 0xF0, 0x92,
-  0x74, 0x15, 0xF0, 0xE4, 0x90, 0xF0, 0x91, 0xF0,
-  0x90, 0xF0, 0x94, 0x74, 0x14, 0xF0, 0x90, 0xF0,
-  0x93, 0x74, 0x02, 0xF0, 0x90, 0xF0, 0x96, 0x74,
-  0x14, 0xF0, 0x90, 0xF0, 0x95, 0x74, 0x01, 0xF0,
-  0x90, 0xF0, 0x98, 0x74, 0x14, 0xF0, 0xE4, 0x90,
-  0xF0, 0x97, 0xF0, 0x90, 0xF0, 0x9A, 0x74, 0x13,
-  0xF0, 0x90, 0xF0, 0x99, 0x74, 0x02, 0xF0, 0x90,
-  0xF0, 0x9C, 0x74, 0x13, 0xF0, 0x90, 0xF0, 0x9B,
-  0x74, 0x01, 0xF0, 0x90, 0xF0, 0x9E, 0x74, 0x13,
-  0xF0, 0xE4, 0x90, 0xF0, 0x9D, 0xF0, 0x90, 0xF0,
-  0xA0, 0x74, 0x12, 0xF0, 0x90, 0xF0, 0x9F, 0x74,
-  0x02, 0xF0, 0x90, 0xF0, 0xA2, 0x74, 0x12, 0xF0,
-  0x90, 0xF0, 0xA1, 0x74, 0x01, 0xF0, 0x90, 0xF0,
-  0xA4, 0x74, 0x12, 0xF0, 0xE4, 0x90, 0xF0, 0xA3,
-  0xF0, 0x90, 0xF0, 0xA6, 0x74, 0x11, 0xF0, 0x90,
-  0xF0, 0xA5, 0x74, 0x02, 0xF0, 0x90, 0xF0, 0xA8,
-  0x74, 0x11, 0xF0, 0x90, 0xF0, 0xA7, 0x74, 0x01,
-  0xF0, 0x90, 0xF0, 0xAA, 0x74, 0x11, 0xF0, 0xE4,
-  0x90, 0xF0, 0xA9, 0xF0, 0x90, 0xF0, 0xAC, 0x74,
-  0x10, 0xF0, 0x90, 0xF0, 0xAB, 0x74, 0x02, 0xF0,
-  0x90, 0xF0, 0xAE, 0x74, 0x10, 0xF0, 0x90, 0xF0,
-  0xAD, 0x74, 0x01, 0xF0, 0x90, 0xF0, 0xB0, 0x74,
-  0x10, 0xF0, 0xE4, 0x90, 0xF0, 0xAF, 0xF0, 0x90,
-  0xF0, 0xB2, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0xF0,
-  0xB1, 0xF0, 0x90, 0xF0, 0xB4, 0x74, 0x08, 0xF0,
-  0xE4, 0x90, 0xF0, 0xB3, 0xF0, 0x90, 0xF0, 0xB6,
-  0x74, 0x08, 0xF0, 0xE4, 0x90, 0xF0, 0xB5, 0xF0,
-  0x90, 0xF0, 0xB8, 0x74, 0x08, 0xF0, 0xE4, 0x90,
-  0xF0, 0xB7, 0xF0, 0x90, 0xF0, 0xBA, 0x74, 0x08,
-  0xF0, 0xE4, 0x90, 0xF0, 0xB9, 0xF0, 0x90, 0xF0,
-  0xBC, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0xF0, 0xBB,
-  0xF0, 0x90, 0xF0, 0xBE, 0x74, 0x08, 0xF0, 0xE4,
-  0x90, 0xF0, 0xBD, 0xF0, 0x90, 0xF0, 0xC0, 0x74,
-  0x08, 0xF0, 0xE4, 0x90, 0xF0, 0xBF, 0xF0, 0x90,
-  0xF1, 0x06, 0x74, 0x14, 0xF0, 0x90, 0xF1, 0x07,
-  0x74, 0x1E, 0xF0, 0x90, 0xF1, 0x0E, 0x74, 0x03,
-  0xF0, 0x90, 0xF1, 0x0F, 0xF0, 0x90, 0xF1, 0x10,
-  0xF0, 0x90, 0xF1, 0x11, 0xF0, 0x90, 0xF1, 0x12,
-  0xF0, 0x90, 0xF1, 0x13, 0xF0, 0x90, 0xF1, 0x14,
-  0x14, 0xF0, 0xE4, 0x90, 0xF1, 0x15, 0xF0, 0x90,
-  0xF1, 0x1F, 0x74, 0x08, 0xF0, 0x90, 0xF1, 0x22,
-  0x74, 0x03, 0xF0, 0x90, 0xF1, 0x1D, 0x74, 0x08,
-  0xF0, 0x90, 0xF1, 0x21, 0x74, 0x0A, 0xF0, 0xE4,
-  0x90, 0xF1, 0x1C, 0xF0, 0x90, 0xF1, 0x43, 0x74,
-  0x3A, 0xF0, 0x90, 0xF2, 0xA4, 0x74, 0x32, 0xF0,
-  0x90, 0xF2, 0xA5, 0xF0, 0x90, 0x28, 0x01, 0xE4,
-  0x93, 0x90, 0xF1, 0x01, 0xF0, 0x90, 0x28, 0x00,
-  0xE4, 0x93, 0x90, 0xF1, 0x02, 0xF0, 0x90, 0x28,
-  0x02, 0xE4, 0x93, 0x90, 0xF1, 0x03, 0xF0, 0x90,
-  0x28, 0x03, 0xE4, 0x93, 0x90, 0xF1, 0x04, 0xF0,
-  0x90, 0x28, 0x04, 0xE4, 0x93, 0x90, 0xF1, 0x05,
-  0xF0, 0x90, 0x28, 0x05, 0xE4, 0x93, 0x90, 0xF1,
-  0x08, 0xF0, 0x90, 0x28, 0x06, 0xE4, 0x93, 0x90,
-  0xF1, 0x09, 0xF0, 0x90, 0x28, 0x0F, 0xE4, 0x93,
-  0x90, 0xF1, 0x0A, 0xF0, 0x90, 0x28, 0x07, 0xE4,
-  0x93, 0x90, 0xF1, 0x0B, 0xF0, 0x90, 0xF0, 0xC5,
-  0x74, 0x07, 0xF0, 0x90, 0xF1, 0x18, 0x74, 0xF4,
-  0xF0, 0xE0, 0x54, 0x0F, 0xB4, 0x09, 0x00, 0x50,
-  0x6A, 0x90, 0x46, 0x50, 0xF8, 0x28, 0x28, 0x73,
-  0x02, 0x46, 0x6B, 0x02, 0x46, 0x73, 0x02, 0x46,
-  0x7B, 0x02, 0x46, 0x83, 0x02, 0x46, 0x8B, 0x02,
-  0x46, 0x93, 0x02, 0x46, 0x9B, 0x02, 0x46, 0xA3,
-  0x02, 0x46, 0xAB, 0x90, 0xF1, 0x0C, 0x74, 0x02,
-  0xF0, 0x80, 0x46, 0x90, 0xF1, 0x0C, 0x74, 0x04,
-  0xF0, 0x80, 0x3E, 0x90, 0xF1, 0x0C, 0x74, 0x08,
-  0xF0, 0x80, 0x36, 0x90, 0xF1, 0x0C, 0x74, 0x10,
-  0xF0, 0x80, 0x2E, 0x90, 0xF1, 0x0C, 0x74, 0x20,
-  0xF0, 0x80, 0x26, 0x90, 0xF1, 0x0C, 0x74, 0x40,
-  0xF0, 0x80, 0x1E, 0x90, 0xF1, 0x0C, 0x74, 0x80,
-  0xF0, 0x80, 0x16, 0x90, 0xF1, 0x0C, 0x74, 0x80,
-  0xF0, 0x80, 0x0E, 0x90, 0xF1, 0x0C, 0x74, 0x80,
-  0xF0, 0x80, 0x06, 0x90, 0xF1, 0x0C, 0x74, 0x02,
-  0xF0, 0x90, 0x28, 0x08, 0xE4, 0x93, 0x90, 0xF1,
-  0x0D, 0xF0, 0x90, 0x28, 0x09, 0xE4, 0x93, 0x90,
-  0xF1, 0x16, 0xF0, 0xD2, 0xAD, 0xE4, 0x90, 0xF1,
-  0x17, 0xF0, 0x90, 0xF0, 0xC4, 0x04, 0xF0, 0x20,
-  0x0A, 0x07, 0x75, 0x9E, 0x55, 0xB2, 0x83, 0x80,
-  0xF6, 0x22, 0x90, 0x12, 0xDB, 0xE4, 0xF0, 0xA3,
-  0x74, 0x40, 0xF0, 0xE4, 0x90, 0x12, 0xDF, 0xF0,
-  0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x12,
-  0xDD, 0xF0, 0xA3, 0x74, 0x40, 0xF0, 0xE4, 0x90,
-  0x12, 0xE3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3,
-  0xF0, 0x90, 0x12, 0xDA, 0xF0, 0x90, 0x12, 0xDA,
-  0xE0, 0xFF, 0xC3, 0x95, 0x0D, 0x40, 0x03, 0x02,
-  0x4C, 0x37, 0x74, 0xE5, 0x2F, 0xF5, 0x82, 0xE4,
-  0x34, 0x88, 0xF5, 0x83, 0xE0, 0x70, 0x03, 0x02,
-  0x4C, 0x2E, 0x90, 0x12, 0xDA, 0xE0, 0xF9, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x50, 0xF5, 0x82, 0xE4,
-  0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0,
-  0xFD, 0x90, 0x12, 0xDB, 0xE0, 0xFA, 0xA3, 0xE0,
-  0xFB, 0xC3, 0xED, 0x9B, 0xEA, 0x64, 0x80, 0xF8,
-  0xEC, 0x64, 0x80, 0x98, 0x40, 0x03, 0x02, 0x48,
-  0x22, 0x90, 0x28, 0x0D, 0xE4, 0x93, 0xFB, 0xFD,
-  0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x50, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE,
-  0xA3, 0xE0, 0xC3, 0x9D, 0xFF, 0xEE, 0x94, 0x00,
-  0xFE, 0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0xAC,
-  0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE,
-  0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x12, 0xDF, 0xE0,
-  0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x90, 0x12, 0xDC,
-  0xE0, 0x9F, 0xFF, 0x90, 0x12, 0xDB, 0xE0, 0x9E,
-  0xFE, 0x90, 0x12, 0xDA, 0xE0, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0xAC, 0xF5, 0x82, 0xE4, 0x34, 0x89,
-  0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12,
-  0x59, 0x81, 0xEB, 0xFD, 0xC3, 0x90, 0x12, 0xDC,
-  0xE0, 0x9D, 0xFD, 0x90, 0x12, 0xDB, 0xE0, 0x94,
-  0x00, 0xFC, 0x12, 0x59, 0xE8, 0x90, 0x12, 0xE0,
-  0xE0, 0x2F, 0xFF, 0x90, 0x12, 0xDF, 0xE0, 0x3E,
-  0xFE, 0x90, 0x12, 0xDA, 0xE0, 0xFD, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0xAC, 0xF5, 0x82, 0xE4, 0x34,
-  0x89, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
-  0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0xAC, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFE,
-  0xA3, 0xE0, 0xC3, 0xEE, 0x64, 0x80, 0x94, 0x80,
-  0x40, 0x03, 0x02, 0x49, 0xAC, 0xED, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0xAC, 0xF5, 0x82, 0xE4, 0x34,
-  0x89, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x02,
-  0x49, 0xAC, 0x90, 0xF1, 0x06, 0xE0, 0xFF, 0xAE,
-  0x0B, 0xEE, 0x8F, 0xF0, 0xA4, 0xFF, 0x90, 0x12,
-  0xDB, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xC3, 0xEF,
-  0x9D, 0xFF, 0xE5, 0xF0, 0x9C, 0xFE, 0x90, 0x12,
-  0xDA, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x50,
-  0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0,
-  0xFC, 0xA3, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80,
-  0xF8, 0xEC, 0x64, 0x80, 0x98, 0x50, 0x03, 0x02,
-  0x49, 0x82, 0x90, 0xF1, 0x06, 0xE0, 0xFF, 0xAE,
-  0x0B, 0xEE, 0x8F, 0xF0, 0xA4, 0xFF, 0x90, 0x12,
-  0xDB, 0xE0, 0xFC, 0xA3, 0xE0, 0xC3, 0xEF, 0x9D,
-  0xFF, 0xE5, 0xF0, 0x9C, 0xFE, 0x90, 0x12, 0xDA,
-  0xE0, 0xF9, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x50,
-  0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0,
-  0xFA, 0xA3, 0xE0, 0xC3, 0x9F, 0xFF, 0xEA, 0x9E,
-  0xFE, 0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0xAC,
-  0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE,
-  0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x12, 0xE1, 0xE0,
-  0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0xED, 0x9F, 0xFF,
-  0xEC, 0x9E, 0xFE, 0xE9, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0xAC, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12, 0x59,
-  0x81, 0x90, 0x28, 0x0D, 0xE4, 0x93, 0xFD, 0x90,
-  0x12, 0xDB, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xC3,
-  0x9D, 0xFD, 0xEA, 0x94, 0x00, 0xFC, 0x12, 0x59,
-  0xE8, 0x90, 0x12, 0xE2, 0xE0, 0x2F, 0xFF, 0x90,
-  0x12, 0xE1, 0xE0, 0x3E, 0xFE, 0x90, 0x12, 0xDA,
-  0xE0, 0xF9, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0xAC,
-  0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE,
-  0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xF1, 0x06, 0xE0,
-  0xFF, 0xAE, 0x0B, 0xEE, 0x8F, 0xF0, 0xA4, 0xC3,
-  0x9B, 0xFF, 0xE5, 0xF0, 0x9A, 0xFE, 0xE9, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0xAC, 0xF5, 0x82, 0xE4,
-  0x34, 0x89, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12,
-  0x5A, 0x1E, 0x90, 0xF1, 0x06, 0xE0, 0xFF, 0xAE,
-  0x0B, 0xEE, 0x8F, 0xF0, 0xA4, 0xFF, 0xE9, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0xAC, 0xF5, 0x82, 0xE4,
-  0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0,
-  0xD3, 0x9F, 0xE5, 0xF0, 0x64, 0x80, 0xF8, 0xEC,
-  0x64, 0x80, 0x98, 0x40, 0x4F, 0x90, 0xF1, 0x06,
-  0xE0, 0xFF, 0xAE, 0x0B, 0xEE, 0x8F, 0xF0, 0xA4,
-  0xFF, 0x90, 0x12, 0xDA, 0xE0, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0xAC, 0xF5, 0x82, 0xE4, 0x34, 0x89,
-  0xF5, 0x83, 0xE5, 0xF0, 0xF0, 0xA3, 0xEF, 0xF0,
-  0x80, 0x2A, 0x90, 0x12, 0xDA, 0xE0, 0xFF, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0x50, 0xF5, 0x82, 0xE4,
-  0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0,
-  0xFD, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0xAC,
-  0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEC,
-  0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x12, 0xDA, 0xE0,
-  0xF9, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x52, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFC,
-  0xA3, 0xE0, 0xFD, 0x90, 0x12, 0xDD, 0xE0, 0xFA,
-  0xA3, 0xE0, 0xFB, 0xC3, 0xED, 0x9B, 0xEA, 0x64,
-  0x80, 0xF8, 0xEC, 0x64, 0x80, 0x98, 0x40, 0x03,
-  0x02, 0x4A, 0xA4, 0x90, 0x28, 0x0E, 0xE4, 0x93,
-  0xFB, 0xFD, 0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0x52, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83,
-  0xE0, 0xFE, 0xA3, 0xE0, 0xC3, 0x9D, 0xFF, 0xEE,
-  0x94, 0x00, 0xFE, 0xE9, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0xAE, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x12,
-  0xE3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x90,
-  0x12, 0xDE, 0xE0, 0x9F, 0xFF, 0x90, 0x12, 0xDD,
-  0xE0, 0x9E, 0xFE, 0x90, 0x12, 0xDA, 0xE0, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0xAE, 0xF5, 0x82, 0xE4,
-  0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0,
-  0xFD, 0x12, 0x59, 0x81, 0xEB, 0xFD, 0xC3, 0x90,
-  0x12, 0xDE, 0xE0, 0x9D, 0xFD, 0x90, 0x12, 0xDD,
-  0xE0, 0x94, 0x00, 0xFC, 0x12, 0x59, 0xE8, 0x90,
-  0x12, 0xE4, 0xE0, 0x2F, 0xFF, 0x90, 0x12, 0xE3,
-  0xE0, 0x3E, 0xFE, 0x90, 0x12, 0xDA, 0xE0, 0xFD,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0xAE, 0xF5, 0x82,
-  0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0xF0, 0xA3,
-  0xEF, 0xF0, 0xED, 0x25, 0xE0, 0x25, 0xE0, 0x24,
-  0xAE, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83,
-  0xE0, 0xFE, 0xA3, 0xE0, 0xC3, 0xEE, 0x64, 0x80,
-  0x94, 0x80, 0x40, 0x03, 0x02, 0x4C, 0x2E, 0xED,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0xAE, 0xF5, 0x82,
-  0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE4, 0xF0, 0xA3,
-  0xF0, 0x02, 0x4C, 0x2E, 0x90, 0xF1, 0x07, 0xE0,
-  0xFF, 0xAE, 0x0C, 0xEE, 0x8F, 0xF0, 0xA4, 0xFF,
-  0x90, 0x12, 0xDD, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD,
-  0xC3, 0xEF, 0x9D, 0xFF, 0xE5, 0xF0, 0x9C, 0xFE,
-  0x90, 0x12, 0xDA, 0xE0, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xD3, 0x9F, 0xEE,
-  0x64, 0x80, 0xF8, 0xEC, 0x64, 0x80, 0x98, 0x50,
-  0x03, 0x02, 0x4C, 0x04, 0x90, 0xF1, 0x07, 0xE0,
-  0xFF, 0xAE, 0x0C, 0xEE, 0x8F, 0xF0, 0xA4, 0xFF,
-  0x90, 0x12, 0xDD, 0xE0, 0xFC, 0xA3, 0xE0, 0xC3,
-  0xEF, 0x9D, 0xFF, 0xE5, 0xF0, 0x9C, 0xFE, 0x90,
-  0x12, 0xDA, 0xE0, 0xF9, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0x52, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xC3, 0x9F, 0xFF,
-  0xEA, 0x9E, 0xFE, 0xE9, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0xAE, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x12,
-  0xE5, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0xED,
-  0x9F, 0xFF, 0xEC, 0x9E, 0xFE, 0xE9, 0x25, 0xE0,
-  0x25, 0xE0, 0x24, 0xAE, 0xF5, 0x82, 0xE4, 0x34,
-  0x89, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD,
-  0x12, 0x59, 0x81, 0x90, 0x28, 0x0E, 0xE4, 0x93,
-  0xFD, 0x90, 0x12, 0xDD, 0xE0, 0xFA, 0xA3, 0xE0,
-  0xFB, 0xC3, 0x9D, 0xFD, 0xEA, 0x94, 0x00, 0xFC,
-  0x12, 0x59, 0xE8, 0x90, 0x12, 0xE6, 0xE0, 0x2F,
-  0xFF, 0x90, 0x12, 0xE5, 0xE0, 0x3E, 0xFE, 0x90,
-  0x12, 0xDA, 0xE0, 0xF9, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0xAE, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xF1,
-  0x07, 0xE0, 0xFF, 0xAE, 0x0C, 0xEE, 0x8F, 0xF0,
-  0xA4, 0xC3, 0x9B, 0xFF, 0xE5, 0xF0, 0x9A, 0xFE,
-  0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0xAE, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xEE, 0x8F,
-  0xF0, 0x12, 0x5A, 0x1E, 0x90, 0xF1, 0x07, 0xE0,
-  0xFF, 0xAE, 0x0C, 0xEE, 0x8F, 0xF0, 0xA4, 0xFF,
-  0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0xAE, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFC,
-  0xA3, 0xE0, 0xD3, 0x9F, 0xE5, 0xF0, 0x64, 0x80,
-  0xF8, 0xEC, 0x64, 0x80, 0x98, 0x40, 0x4F, 0x90,
-  0xF1, 0x07, 0xE0, 0xFF, 0xAE, 0x0C, 0xEE, 0x8F,
-  0xF0, 0xA4, 0xFF, 0x90, 0x12, 0xDA, 0xE0, 0x25,
-  0xE0, 0x25, 0xE0, 0x24, 0xAE, 0xF5, 0x82, 0xE4,
-  0x34, 0x89, 0xF5, 0x83, 0xE5, 0xF0, 0xF0, 0xA3,
-  0xEF, 0xF0, 0x80, 0x2A, 0x90, 0x12, 0xDA, 0xE0,
-  0xFF, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x52, 0xF5,
-  0x82, 0xE4, 0x34, 0x89, 0xF5, 0x83, 0xE0, 0xFC,
-  0xA3, 0xE0, 0xFD, 0xEF, 0x25, 0xE0, 0x25, 0xE0,
-  0x24, 0xAE, 0xF5, 0x82, 0xE4, 0x34, 0x89, 0xF5,
-  0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x12,
-  0xDA, 0xE0, 0x04, 0xF0, 0x02, 0x47, 0x0D, 0x22,
-  0x90, 0x13, 0x2E, 0xEF, 0xF0, 0xA9, 0x03, 0xA3,
-  0xED, 0xF0, 0x60, 0x03, 0x02, 0x4D, 0xE7, 0xE9,
-  0x60, 0x03, 0x02, 0x4D, 0x20, 0x90, 0x13, 0x2E,
-  0xE0, 0xB4, 0x14, 0x00, 0x40, 0x03, 0x02, 0x4D,
-  0x14, 0x90, 0x4C, 0x60, 0xF8, 0x28, 0x28, 0x73,
-  0x02, 0x4C, 0x9C, 0x02, 0x4C, 0xA2, 0x02, 0x4C,
-  0xA8, 0x02, 0x4C, 0xAE, 0x02, 0x4C, 0xB4, 0x02,
-  0x4C, 0xBA, 0x02, 0x4C, 0xC0, 0x02, 0x4C, 0xC6,
-  0x02, 0x4C, 0xCC, 0x02, 0x4C, 0xD2, 0x02, 0x4C,
-  0xD8, 0x02, 0x4C, 0xDE, 0x02, 0x4C, 0xE4, 0x02,
-  0x4C, 0xEA, 0x02, 0x4C, 0xF0, 0x02, 0x4C, 0xF6,
-  0x02, 0x4C, 0xFC, 0x02, 0x4D, 0x02, 0x02, 0x4D,
-  0x08, 0x02, 0x4D, 0x0E, 0x43, 0xDB, 0x01, 0x02,
-  0x4D, 0xE4, 0x43, 0xDB, 0x02, 0x02, 0x4D, 0xE4,
-  0x43, 0xDB, 0x04, 0x02, 0x4D, 0xE4, 0x43, 0xDB,
-  0x08, 0x02, 0x4D, 0xE4, 0x43, 0xDB, 0x10, 0x02,
-  0x4D, 0xE4, 0x43, 0xDB, 0x20, 0x02, 0x4D, 0xE4,
-  0x43, 0xDB, 0x40, 0x02, 0x4D, 0xE4, 0x43, 0xDB,
-  0x80, 0x02, 0x4D, 0xE4, 0x43, 0xDA, 0x01, 0x02,
-  0x4D, 0xE4, 0x43, 0xDA, 0x02, 0x02, 0x4D, 0xE4,
-  0x43, 0xDA, 0x04, 0x02, 0x4D, 0xE4, 0x43, 0xDA,
-  0x08, 0x02, 0x4D, 0xE4, 0x43, 0xDA, 0x10, 0x02,
-  0x4D, 0xE4, 0x43, 0xDA, 0x20, 0x02, 0x4D, 0xE4,
-  0x43, 0xDA, 0x40, 0x02, 0x4D, 0xE4, 0x43, 0xDA,
-  0x80, 0x02, 0x4D, 0xE4, 0x43, 0xD9, 0x01, 0x02,
-  0x4D, 0xE4, 0x43, 0xD9, 0x02, 0x02, 0x4D, 0xE4,
-  0x43, 0xD9, 0x04, 0x02, 0x4D, 0xE4, 0x43, 0xD9,
-  0x08, 0x02, 0x4D, 0xE4, 0x85, 0xD9, 0xD9, 0x85,
-  0xDA, 0xDA, 0x85, 0xDB, 0xDB, 0x02, 0x4D, 0xE4,
-  0xE9, 0x64, 0x01, 0x60, 0x03, 0x02, 0x4D, 0xE4,
-  0x90, 0x13, 0x2E, 0xE0, 0xB4, 0x14, 0x00, 0x40,
-  0x03, 0x02, 0x4D, 0xDB, 0x90, 0x4D, 0x3B, 0xF8,
-  0x28, 0x28, 0x73, 0x02, 0x4D, 0x77, 0x02, 0x4D,
-  0x7C, 0x02, 0x4D, 0x81, 0x02, 0x4D, 0x86, 0x02,
-  0x4D, 0x8B, 0x02, 0x4D, 0x90, 0x02, 0x4D, 0x95,
-  0x02, 0x4D, 0x9A, 0x02, 0x4D, 0x9F, 0x02, 0x4D,
-  0xA4, 0x02, 0x4D, 0xA9, 0x02, 0x4D, 0xAE, 0x02,
-  0x4D, 0xB3, 0x02, 0x4D, 0xB8, 0x02, 0x4D, 0xBD,
-  0x02, 0x4D, 0xC2, 0x02, 0x4D, 0xC7, 0x02, 0x4D,
-  0xCC, 0x02, 0x4D, 0xD1, 0x02, 0x4D, 0xD6, 0x43,
-  0xDE, 0x01, 0x80, 0x68, 0x43, 0xDE, 0x02, 0x80,
-  0x63, 0x43, 0xDE, 0x04, 0x80, 0x5E, 0x43, 0xDE,
-  0x08, 0x80, 0x59, 0x43, 0xDE, 0x10, 0x80, 0x54,
-  0x43, 0xDE, 0x20, 0x80, 0x4F, 0x43, 0xDE, 0x40,
-  0x80, 0x4A, 0x43, 0xDE, 0x80, 0x80, 0x45, 0x43,
-  0xDD, 0x01, 0x80, 0x40, 0x43, 0xDD, 0x02, 0x80,
-  0x3B, 0x43, 0xDD, 0x04, 0x80, 0x36, 0x43, 0xDD,
-  0x08, 0x80, 0x31, 0x43, 0xDD, 0x10, 0x80, 0x2C,
-  0x43, 0xDD, 0x20, 0x80, 0x27, 0x43, 0xDD, 0x40,
-  0x80, 0x22, 0x43, 0xDD, 0x80, 0x80, 0x1D, 0x43,
-  0xDC, 0x01, 0x80, 0x18, 0x43, 0xDC, 0x02, 0x80,
-  0x13, 0x43, 0xDC, 0x04, 0x80, 0x0E, 0x43, 0xDC,
-  0x08, 0x80, 0x09, 0x85, 0xDC, 0xDC, 0x85, 0xDD,
-  0xDD, 0x85, 0xDE, 0xDE, 0x7F, 0x00, 0x22, 0x90,
-  0x13, 0x2F, 0xE0, 0x64, 0x01, 0x60, 0x03, 0x02,
-  0x4F, 0x92, 0xE9, 0x60, 0x03, 0x02, 0x4E, 0xCB,
-  0x90, 0x13, 0x2E, 0xE0, 0xB4, 0x14, 0x00, 0x40,
-  0x03, 0x02, 0x4E, 0xBF, 0x90, 0x4E, 0x0B, 0xF8,
-  0x28, 0x28, 0x73, 0x02, 0x4E, 0x47, 0x02, 0x4E,
-  0x4D, 0x02, 0x4E, 0x53, 0x02, 0x4E, 0x59, 0x02,
-  0x4E, 0x5F, 0x02, 0x4E, 0x65, 0x02, 0x4E, 0x6B,
-  0x02, 0x4E, 0x71, 0x02, 0x4E, 0x77, 0x02, 0x4E,
-  0x7D, 0x02, 0x4E, 0x83, 0x02, 0x4E, 0x89, 0x02,
-  0x4E, 0x8F, 0x02, 0x4E, 0x95, 0x02, 0x4E, 0x9B,
-  0x02, 0x4E, 0xA1, 0x02, 0x4E, 0xA7, 0x02, 0x4E,
-  0xAD, 0x02, 0x4E, 0xB3, 0x02, 0x4E, 0xB9, 0x53,
-  0xDB, 0xFE, 0x02, 0x4F, 0x8F, 0x53, 0xDB, 0xFD,
-  0x02, 0x4F, 0x8F, 0x53, 0xDB, 0xFB, 0x02, 0x4F,
-  0x8F, 0x53, 0xDB, 0xF7, 0x02, 0x4F, 0x8F, 0x53,
-  0xDB, 0xEF, 0x02, 0x4F, 0x8F, 0x53, 0xDB, 0xDF,
-  0x02, 0x4F, 0x8F, 0x53, 0xDB, 0xBF, 0x02, 0x4F,
-  0x8F, 0x53, 0xDB, 0x7F, 0x02, 0x4F, 0x8F, 0x53,
-  0xDA, 0xFE, 0x02, 0x4F, 0x8F, 0x53, 0xDA, 0xFD,
-  0x02, 0x4F, 0x8F, 0x53, 0xDA, 0xFB, 0x02, 0x4F,
-  0x8F, 0x53, 0xDA, 0xF7, 0x02, 0x4F, 0x8F, 0x53,
-  0xDA, 0xEF, 0x02, 0x4F, 0x8F, 0x53, 0xDA, 0xDF,
-  0x02, 0x4F, 0x8F, 0x53, 0xDA, 0xBF, 0x02, 0x4F,
-  0x8F, 0x53, 0xDA, 0x7F, 0x02, 0x4F, 0x8F, 0x53,
-  0xD9, 0xFE, 0x02, 0x4F, 0x8F, 0x53, 0xD9, 0xFD,
-  0x02, 0x4F, 0x8F, 0x53, 0xD9, 0xFB, 0x02, 0x4F,
-  0x8F, 0x53, 0xD9, 0xF7, 0x02, 0x4F, 0x8F, 0x85,
-  0xD9, 0xD9, 0x85, 0xDA, 0xDA, 0x85, 0xDB, 0xDB,
-  0x02, 0x4F, 0x8F, 0xE9, 0x64, 0x01, 0x60, 0x03,
-  0x02, 0x4F, 0x8F, 0x90, 0x13, 0x2E, 0xE0, 0xB4,
-  0x14, 0x00, 0x40, 0x03, 0x02, 0x4F, 0x86, 0x90,
-  0x4E, 0xE6, 0xF8, 0x28, 0x28, 0x73, 0x02, 0x4F,
-  0x22, 0x02, 0x4F, 0x27, 0x02, 0x4F, 0x2C, 0x02,
-  0x4F, 0x31, 0x02, 0x4F, 0x36, 0x02, 0x4F, 0x3B,
-  0x02, 0x4F, 0x40, 0x02, 0x4F, 0x45, 0x02, 0x4F,
-  0x4A, 0x02, 0x4F, 0x4F, 0x02, 0x4F, 0x54, 0x02,
-  0x4F, 0x59, 0x02, 0x4F, 0x5E, 0x02, 0x4F, 0x63,
-  0x02, 0x4F, 0x68, 0x02, 0x4F, 0x6D, 0x02, 0x4F,
-  0x72, 0x02, 0x4F, 0x77, 0x02, 0x4F, 0x7C, 0x02,
-  0x4F, 0x81, 0x53, 0xDE, 0xFE, 0x80, 0x68, 0x53,
-  0xDE, 0xFD, 0x80, 0x63, 0x53, 0xDE, 0xFB, 0x80,
-  0x5E, 0x53, 0xDE, 0xF7, 0x80, 0x59, 0x53, 0xDE,
-  0xEF, 0x80, 0x54, 0x53, 0xDE, 0xDF, 0x80, 0x4F,
-  0x53, 0xDE, 0xBF, 0x80, 0x4A, 0x53, 0xDE, 0x7F,
-  0x80, 0x45, 0x53, 0xDD, 0xFE, 0x80, 0x40, 0x53,
-  0xDD, 0xFD, 0x80, 0x3B, 0x53, 0xDD, 0xFB, 0x80,
-  0x36, 0x53, 0xDD, 0xF7, 0x80, 0x31, 0x53, 0xDD,
-  0xEF, 0x80, 0x2C, 0x53, 0xDD, 0xDF, 0x80, 0x27,
-  0x53, 0xDD, 0xBF, 0x80, 0x22, 0x53, 0xDD, 0x7F,
-  0x80, 0x1D, 0x53, 0xDC, 0xFE, 0x80, 0x18, 0x53,
-  0xDC, 0xFD, 0x80, 0x13, 0x53, 0xDC, 0xFB, 0x80,
-  0x0E, 0x53, 0xDC, 0xF7, 0x80, 0x09, 0x85, 0xDC,
-  0xDC, 0x85, 0xDD, 0xDD, 0x85, 0xDE, 0xDE, 0x7F,
-  0x00, 0x22, 0x90, 0x13, 0x2F, 0xE0, 0x64, 0x02,
-  0x60, 0x03, 0x02, 0x51, 0x6E, 0xE9, 0x60, 0x03,
-  0x02, 0x50, 0x85, 0x90, 0x13, 0x2E, 0xE0, 0xB4,
-  0x14, 0x00, 0x40, 0x03, 0x02, 0x50, 0x80, 0x90,
-  0x4F, 0xB6, 0xF8, 0x28, 0x28, 0x73, 0x02, 0x4F,
-  0xF2, 0x02, 0x4F, 0xFA, 0x02, 0x50, 0x02, 0x02,
-  0x50, 0x09, 0x02, 0x50, 0x10, 0x02, 0x50, 0x17,
-  0x02, 0x50, 0x1E, 0x02, 0x50, 0x25, 0x02, 0x50,
-  0x2C, 0x02, 0x50, 0x33, 0x02, 0x50, 0x3A, 0x02,
-  0x50, 0x41, 0x02, 0x50, 0x48, 0x02, 0x50, 0x4F,
-  0x02, 0x50, 0x56, 0x02, 0x50, 0x5D, 0x02, 0x50,
-  0x64, 0x02, 0x50, 0x6B, 0x02, 0x50, 0x72, 0x02,
-  0x50, 0x79, 0xE5, 0xDB, 0x54, 0x01, 0xFE, 0x02,
-  0x50, 0x82, 0xE5, 0xDB, 0x54, 0x02, 0xFE, 0x02,
-  0x50, 0x82, 0xE5, 0xDB, 0x54, 0x04, 0xFE, 0x80,
-  0x79, 0xE5, 0xDB, 0x54, 0x08, 0xFE, 0x80, 0x72,
-  0xE5, 0xDB, 0x54, 0x10, 0xFE, 0x80, 0x6B, 0xE5,
-  0xDB, 0x54, 0x20, 0xFE, 0x80, 0x64, 0xE5, 0xDB,
-  0x54, 0x40, 0xFE, 0x80, 0x5D, 0xE5, 0xDB, 0x54,
-  0x80, 0xFE, 0x80, 0x56, 0xE5, 0xDA, 0x54, 0x01,
-  0xFE, 0x80, 0x4F, 0xE5, 0xDA, 0x54, 0x02, 0xFE,
-  0x80, 0x48, 0xE5, 0xDA, 0x54, 0x04, 0xFE, 0x80,
-  0x41, 0xE5, 0xDA, 0x54, 0x08, 0xFE, 0x80, 0x3A,
-  0xE5, 0xDA, 0x54, 0x10, 0xFE, 0x80, 0x33, 0xE5,
-  0xDA, 0x54, 0x20, 0xFE, 0x80, 0x2C, 0xE5, 0xDA,
-  0x54, 0x40, 0xFE, 0x80, 0x25, 0xE5, 0xDA, 0x54,
-  0x80, 0xFE, 0x80, 0x1E, 0xE5, 0xD9, 0x54, 0x01,
-  0xFE, 0x80, 0x17, 0xE5, 0xD9, 0x54, 0x02, 0xFE,
-  0x80, 0x10, 0xE5, 0xD9, 0x54, 0x04, 0xFE, 0x80,
-  0x09, 0xE5, 0xD9, 0x54, 0x08, 0xFE, 0x80, 0x02,
-  0xE4, 0xFE, 0xAF, 0x06, 0x22, 0xE9, 0x64, 0x01,
-  0x60, 0x03, 0x02, 0x51, 0x6E, 0x90, 0x13, 0x2E,
-  0xE0, 0xB4, 0x14, 0x00, 0x40, 0x03, 0x02, 0x51,
-  0x6A, 0x90, 0x50, 0xA0, 0xF8, 0x28, 0x28, 0x73,
-  0x02, 0x50, 0xDC, 0x02, 0x50, 0xE4, 0x02, 0x50,
-  0xEC, 0x02, 0x50, 0xF3, 0x02, 0x50, 0xFA, 0x02,
-  0x51, 0x01, 0x02, 0x51, 0x08, 0x02, 0x51, 0x0F,
-  0x02, 0x51, 0x16, 0x02, 0x51, 0x1D, 0x02, 0x51,
-  0x24, 0x02, 0x51, 0x2B, 0x02, 0x51, 0x32, 0x02,
-  0x51, 0x39, 0x02, 0x51, 0x40, 0x02, 0x51, 0x47,
-  0x02, 0x51, 0x4E, 0x02, 0x51, 0x55, 0x02, 0x51,
-  0x5C, 0x02, 0x51, 0x63, 0xE5, 0xDE, 0x54, 0x01,
-  0xFE, 0x02, 0x51, 0x6C, 0xE5, 0xDE, 0x54, 0x02,
-  0xFE, 0x02, 0x51, 0x6C, 0xE5, 0xDE, 0x54, 0x04,
-  0xFE, 0x80, 0x79, 0xE5, 0xDE, 0x54, 0x08, 0xFE,
-  0x80, 0x72, 0xE5, 0xDE, 0x54, 0x10, 0xFE, 0x80,
-  0x6B, 0xE5, 0xDE, 0x54, 0x20, 0xFE, 0x80, 0x64,
-  0xE5, 0xDE, 0x54, 0x40, 0xFE, 0x80, 0x5D, 0xE5,
-  0xDE, 0x54, 0x80, 0xFE, 0x80, 0x56, 0xE5, 0xDD,
-  0x54, 0x01, 0xFE, 0x80, 0x4F, 0xE5, 0xDD, 0x54,
-  0x02, 0xFE, 0x80, 0x48, 0xE5, 0xDD, 0x54, 0x04,
-  0xFE, 0x80, 0x41, 0xE5, 0xDD, 0x54, 0x08, 0xFE,
-  0x80, 0x3A, 0xE5, 0xDD, 0x54, 0x10, 0xFE, 0x80,
-  0x33, 0xE5, 0xDD, 0x54, 0x20, 0xFE, 0x80, 0x2C,
-  0xE5, 0xDD, 0x54, 0x40, 0xFE, 0x80, 0x25, 0xE5,
-  0xDD, 0x54, 0x80, 0xFE, 0x80, 0x1E, 0xE5, 0xDC,
-  0x54, 0x01, 0xFE, 0x80, 0x17, 0xE5, 0xDC, 0x54,
-  0x02, 0xFE, 0x80, 0x10, 0xE5, 0xDC, 0x54, 0x04,
-  0xFE, 0x80, 0x09, 0xE5, 0xDC, 0x54, 0x08, 0xFE,
-  0x80, 0x02, 0xE4, 0xFE, 0xAF, 0x06, 0x22, 0x90,
-  0x19, 0x40, 0x74, 0x02, 0xF0, 0x80, 0x06, 0x90,
-  0x19, 0x40, 0x74, 0x03, 0xF0, 0x90, 0x19, 0x41,
-  0x74, 0x02, 0xF0, 0x80, 0x06, 0x90, 0x19, 0x41,
-  0x74, 0x03, 0xF0, 0x90, 0x19, 0x42, 0x74, 0x02,
-  0xF0, 0x80, 0x06, 0x90, 0x19, 0x42, 0x74, 0x03,
-  0xF0, 0x90, 0x19, 0x43, 0x74, 0x02, 0xF0, 0x80,
-  0x06, 0x90, 0x19, 0x43, 0x74, 0x03, 0xF0, 0x90,
-  0x19, 0x44, 0x74, 0x02, 0xF0, 0x80, 0x06, 0x90,
-  0x19, 0x44, 0x74, 0x03, 0xF0, 0x90, 0x19, 0x45,
-  0x74, 0x02, 0xF0, 0x80, 0x06, 0x90, 0x19, 0x45,
-  0x74, 0x03, 0xF0, 0x90, 0x19, 0x46, 0x74, 0x02,
-  0xF0, 0x80, 0x06, 0x90, 0x19, 0x46, 0x74, 0x03,
-  0xF0, 0x90, 0x19, 0x47, 0x74, 0x01, 0xF0, 0x90,
-  0x19, 0x48, 0x74, 0x01, 0xF0, 0x90, 0x19, 0x49,
-  0x74, 0x01, 0xF0, 0x90, 0x19, 0x4A, 0x74, 0x01,
-  0xF0, 0x90, 0x19, 0x4B, 0x74, 0x01, 0xF0, 0x90,
-  0x19, 0x4C, 0x74, 0x01, 0xF0, 0x90, 0x19, 0x4D,
-  0x74, 0x01, 0xF0, 0x90, 0x19, 0x4E, 0x74, 0x01,
-  0xF0, 0x90, 0x19, 0x4F, 0x74, 0x01, 0xF0, 0x90,
-  0x19, 0x50, 0x74, 0x01, 0xF0, 0x90, 0x19, 0x51,
-  0x74, 0x01, 0xF0, 0x90, 0x19, 0x52, 0x74, 0x01,
-  0xF0, 0x90, 0x19, 0x53, 0x74, 0x01, 0xF0, 0x90,
-  0x19, 0x54, 0x74, 0x01, 0xF0, 0x90, 0x19, 0x55,
-  0x74, 0x01, 0xF0, 0x90, 0x19, 0x56, 0x74, 0x01,
-  0xF0, 0x90, 0x19, 0x57, 0x74, 0x01, 0xF0, 0x90,
-  0x19, 0x58, 0x74, 0x02, 0xF0, 0x80, 0x06, 0x90,
-  0x19, 0x58, 0x74, 0x03, 0xF0, 0x90, 0x19, 0x59,
-  0x74, 0x02, 0xF0, 0x80, 0x06, 0x90, 0x19, 0x59,
-  0x74, 0x03, 0xF0, 0x90, 0x19, 0x5A, 0x74, 0x02,
-  0xF0, 0x80, 0x06, 0x90, 0x19, 0x5A, 0x74, 0x03,
-  0xF0, 0x90, 0x19, 0x5B, 0x74, 0x02, 0xF0, 0x80,
-  0x06, 0x90, 0x19, 0x5B, 0x74, 0x03, 0xF0, 0x90,
-  0x19, 0x5C, 0x74, 0x02, 0xF0, 0x80, 0x06, 0x90,
-  0x19, 0x5C, 0x74, 0x03, 0xF0, 0x90, 0x19, 0x5D,
-  0x74, 0x02, 0xF0, 0x80, 0x06, 0x90, 0x19, 0x5D,
-  0x74, 0x03, 0xF0, 0x90, 0x19, 0x5E, 0x74, 0x02,
-  0xF0, 0x80, 0x06, 0x90, 0x19, 0x5E, 0x74, 0x03,
-  0xF0, 0x90, 0x19, 0x5F, 0x74, 0x02, 0xF0, 0x80,
-  0x06, 0x90, 0x19, 0x5F, 0x74, 0x03, 0xF0, 0x90,
-  0x19, 0x60, 0x74, 0x02, 0xF0, 0x80, 0x06, 0x90,
-  0x19, 0x60, 0x74, 0x03, 0xF0, 0x90, 0x19, 0x61,
-  0x74, 0x02, 0xF0, 0x80, 0x06, 0x90, 0x19, 0x61,
-  0x74, 0x03, 0xF0, 0x90, 0x19, 0x62, 0x74, 0x02,
-  0xF0, 0x80, 0x06, 0x90, 0x19, 0x62, 0x74, 0x03,
-  0xF0, 0x90, 0x19, 0x63, 0x74, 0x02, 0xF0, 0x80,
-  0x06, 0x90, 0x19, 0x63, 0x74, 0x03, 0xF0, 0x90,
-  0x19, 0x64, 0x74, 0x02, 0xF0, 0x80, 0x06, 0x90,
-  0x19, 0x64, 0x74, 0x03, 0xF0, 0x90, 0x19, 0x65,
-  0x74, 0x02, 0xF0, 0x80, 0x06, 0x90, 0x19, 0x65,
-  0x74, 0x03, 0xF0, 0x90, 0x19, 0x66, 0x74, 0x02,
-  0xF0, 0x80, 0x06, 0x90, 0x19, 0x66, 0x74, 0x03,
-  0xF0, 0x90, 0x19, 0x67, 0x74, 0x01, 0xF0, 0x90,
-  0x19, 0x68, 0x74, 0x01, 0xF0, 0x90, 0x19, 0x69,
-  0x74, 0x01, 0xF0, 0x90, 0x19, 0x6A, 0x74, 0x01,
-  0xF0, 0x90, 0x19, 0x6B, 0x74, 0x01, 0xF0, 0x90,
-  0x19, 0x6C, 0x74, 0x01, 0xF0, 0x90, 0x19, 0x6D,
-  0x74, 0x01, 0xF0, 0x90, 0x19, 0x6E, 0x74, 0x01,
-  0xF0, 0x90, 0x19, 0x6F, 0x74, 0x01, 0xF0, 0x90,
-  0x19, 0x70, 0x74, 0x01, 0xF0, 0x90, 0x19, 0x71,
-  0x74, 0x01, 0xF0, 0x90, 0x19, 0x72, 0x74, 0x01,
-  0xF0, 0x90, 0x19, 0x73, 0x74, 0x01, 0xF0, 0x90,
-  0x19, 0x74, 0x74, 0x03, 0xF0, 0x90, 0x19, 0x75,
-  0x74, 0x03, 0xF0, 0x90, 0x19, 0x76, 0x74, 0x03,
-  0xF0, 0x90, 0x19, 0x77, 0x74, 0x03, 0xF0, 0x90,
-  0x19, 0x78, 0x74, 0x02, 0xF0, 0x80, 0x06, 0x90,
-  0x19, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x19, 0x79,
-  0x74, 0x02, 0xF0, 0x80, 0x06, 0x90, 0x19, 0x79,
-  0x74, 0x03, 0xF0, 0x90, 0x19, 0x7A, 0x74, 0x02,
-  0xF0, 0x80, 0x06, 0x90, 0x19, 0x7A, 0x74, 0x03,
-  0xF0, 0x90, 0x19, 0x7B, 0x74, 0x02, 0xF0, 0x80,
-  0x06, 0x90, 0x19, 0x7B, 0x74, 0x03, 0xF0, 0x90,
-  0x19, 0x7C, 0x74, 0x02, 0xF0, 0x80, 0x06, 0x90,
-  0x19, 0x7C, 0x74, 0x03, 0xF0, 0x90, 0x19, 0x7D,
-  0x74, 0x02, 0xF0, 0x80, 0x06, 0x90, 0x19, 0x7D,
-  0x74, 0x03, 0xF0, 0x90, 0x19, 0x7E, 0x74, 0x02,
-  0xF0, 0x80, 0x06, 0x90, 0x19, 0x7E, 0x74, 0x03,
-  0xF0, 0x90, 0x19, 0x7F, 0x74, 0x02, 0xF0, 0x80,
-  0x06, 0x90, 0x19, 0x7F, 0x74, 0x03, 0xF0, 0x90,
-  0x19, 0x80, 0x74, 0x02, 0xF0, 0x80, 0x06, 0x90,
-  0x19, 0x80, 0x74, 0x03, 0xF0, 0x90, 0x19, 0x81,
-  0x74, 0x02, 0xF0, 0x80, 0x06, 0x90, 0x19, 0x81,
-  0x74, 0x03, 0xF0, 0x90, 0x19, 0x82, 0x74, 0x02,
-  0xF0, 0x80, 0x06, 0x90, 0x19, 0x82, 0x74, 0x03,
-  0xF0, 0x90, 0x19, 0x83, 0x74, 0x02, 0xF0, 0x80,
-  0x06, 0x90, 0x19, 0x83, 0x74, 0x03, 0xF0, 0x90,
-  0x19, 0x84, 0x74, 0x02, 0xF0, 0x80, 0x06, 0x90,
-  0x19, 0x84, 0x74, 0x03, 0xF0, 0x90, 0x19, 0x85,
-  0x74, 0x02, 0xF0, 0x80, 0x06, 0x90, 0x19, 0x85,
-  0x74, 0x03, 0xF0, 0x90, 0x19, 0x86, 0x74, 0x02,
-  0xF0, 0x80, 0x06, 0x90, 0x19, 0x86, 0x74, 0x03,
-  0xF0, 0x90, 0x19, 0x87, 0x74, 0x02, 0xF0, 0x80,
-  0x06, 0x90, 0x19, 0x87, 0x74, 0x03, 0xF0, 0x90,
-  0x19, 0x88, 0x74, 0x03, 0xF0, 0x90, 0x19, 0x89,
-  0x74, 0x03, 0xF0, 0x90, 0x19, 0x8A, 0x74, 0x03,
-  0xF0, 0x90, 0x19, 0x8B, 0x74, 0x03, 0xF0, 0x90,
-  0x19, 0x8C, 0x74, 0x03, 0xF0, 0x90, 0x19, 0x8D,
-  0x74, 0x03, 0xF0, 0x90, 0x19, 0x8E, 0x74, 0x03,
-  0xF0, 0x90, 0x19, 0x8F, 0x74, 0x03, 0xF0, 0x90,
-  0x19, 0x90, 0x74, 0x03, 0xF0, 0x90, 0x19, 0x91,
-  0x74, 0x03, 0xF0, 0x90, 0x19, 0x92, 0x74, 0x03,
-  0xF0, 0x90, 0x19, 0x93, 0x74, 0x03, 0xF0, 0x90,
-  0x19, 0x94, 0x74, 0x03, 0xF0, 0x90, 0x19, 0x95,
-  0x74, 0x03, 0xF0, 0x90, 0x19, 0x96, 0x74, 0x03,
-  0xF0, 0x90, 0x19, 0x97, 0x74, 0x03, 0xF0, 0x90,
-  0x19, 0x98, 0x74, 0x02, 0xF0, 0x80, 0x06, 0x90,
-  0x19, 0x98, 0x74, 0x03, 0xF0, 0x90, 0x19, 0x99,
-  0x74, 0x02, 0xF0, 0x80, 0x06, 0x90, 0x19, 0x99,
-  0x74, 0x03, 0xF0, 0x90, 0x19, 0x9A, 0x74, 0x02,
-  0xF0, 0x80, 0x06, 0x90, 0x19, 0x9A, 0x74, 0x03,
-  0xF0, 0x90, 0x19, 0x9B, 0x74, 0x02, 0xF0, 0x80,
-  0x06, 0x90, 0x19, 0x9B, 0x74, 0x03, 0xF0, 0x90,
-  0x19, 0x9C, 0x74, 0x02, 0xF0, 0x80, 0x06, 0x90,
-  0x19, 0x9C, 0x74, 0x03, 0xF0, 0x90, 0x19, 0x9D,
-  0x74, 0x02, 0xF0, 0x80, 0x06, 0x90, 0x19, 0x9D,
-  0x74, 0x03, 0xF0, 0x90, 0x19, 0x9E, 0x74, 0x02,
-  0xF0, 0x80, 0x06, 0x90, 0x19, 0x9E, 0x74, 0x03,
-  0xF0, 0x90, 0x19, 0x9F, 0x74, 0x02, 0xF0, 0x22,
-  0x90, 0x19, 0x9F, 0x74, 0x03, 0xF0, 0x22, 0xE4,
-  0x90, 0x88, 0xB0, 0xF0, 0x90, 0x12, 0xDA, 0xF0,
-  0x90, 0x12, 0xDA, 0xE0, 0xFF, 0xC3, 0x94, 0x50,
-  0x50, 0x14, 0x74, 0x60, 0x2F, 0xF5, 0x82, 0xE4,
-  0x34, 0x88, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x12,
-  0xDA, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0xD2, 0xB3,
-  0x30, 0xB3, 0x05, 0x75, 0x9E, 0x55, 0x80, 0xF8,
-  0xC2, 0xDB, 0xC2, 0x0E, 0xE4, 0x90, 0x12, 0xDA,
-  0xF0, 0x90, 0xF2, 0xA8, 0xE0, 0xFF, 0x90, 0x12,
-  0xDA, 0xE0, 0xFE, 0xC3, 0x9F, 0x40, 0x03, 0x02,
-  0x58, 0x78, 0x74, 0x00, 0x2E, 0xF5, 0x82, 0xE4,
-  0x34, 0x50, 0xF5, 0x83, 0xE0, 0xB5, 0x06, 0x06,
-  0x90, 0x88, 0xB0, 0xE0, 0x04, 0xF0, 0x90, 0x12,
-  0xDA, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xA4, 0x24,
-  0x02, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x18, 0xF5,
-  0x83, 0xE0, 0x90, 0x88, 0xC3, 0xF0, 0x75, 0xF0,
-  0x04, 0xEF, 0xA4, 0x24, 0x01, 0xF5, 0x82, 0xE5,
-  0xF0, 0x34, 0x18, 0xF5, 0x83, 0xE0, 0x90, 0x88,
-  0xC4, 0xF0, 0x90, 0x12, 0xDA, 0xE0, 0xFF, 0x75,
-  0xF0, 0x04, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE5,
-  0xF0, 0x34, 0x18, 0xF5, 0x83, 0xE0, 0x90, 0x88,
-  0xC5, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0xA4, 0x24,
-  0x02, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x30, 0xF5,
-  0x83, 0xE0, 0x90, 0x88, 0xC7, 0xF0, 0x90, 0x12,
-  0xDA, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xA4, 0x24,
-  0x01, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x30, 0xF5,
-  0x83, 0xE0, 0x90, 0x88, 0xC8, 0xF0, 0x75, 0xF0,
-  0x04, 0xEF, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE5,
-  0xF0, 0x34, 0x30, 0xF5, 0x83, 0xE0, 0x90, 0x88,
-  0xC9, 0xF0, 0x90, 0x12, 0xDA, 0xE0, 0xFF, 0x75,
-  0xF0, 0x04, 0xA4, 0x24, 0x52, 0xF5, 0x82, 0xE5,
-  0xF0, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0x90, 0x88,
-  0xCE, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0xA4, 0x24,
-  0x51, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x82, 0xF5,
-  0x83, 0xE0, 0x90, 0x88, 0xCF, 0xF0, 0x90, 0x12,
-  0xDA, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xA4, 0x24,
-  0x50, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x82, 0xF5,
-  0x83, 0xE0, 0x90, 0x88, 0xD0, 0xF0, 0x74, 0x00,
-  0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x50, 0xF5, 0x83,
-  0xE0, 0x24, 0x60, 0xF5, 0x82, 0xE4, 0x34, 0x88,
-  0xF5, 0x83, 0xE0, 0x60, 0x03, 0x02, 0x57, 0x45,
-  0x90, 0x12, 0xDA, 0xE0, 0xFB, 0x24, 0x00, 0xF5,
-  0x82, 0xE4, 0x34, 0x50, 0xF5, 0x83, 0xE0, 0x24,
-  0x60, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83,
-  0x74, 0x01, 0xF0, 0x90, 0x88, 0xC2, 0xE0, 0xFC,
-  0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0,
-  0xFF, 0x74, 0x00, 0x2B, 0xF5, 0x82, 0xE4, 0x34,
-  0x50, 0xF5, 0x83, 0xE0, 0x75, 0xF0, 0x04, 0xA4,
-  0x24, 0x00, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x84,
-  0xF5, 0x83, 0x12, 0x5B, 0x88, 0x90, 0x88, 0xC6,
-  0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE,
-  0xA3, 0xE0, 0xFF, 0x90, 0x12, 0xDA, 0xE0, 0xFB,
-  0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x50, 0xF5,
-  0x83, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0x24, 0x40,
-  0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x85, 0xF5, 0x83,
-  0x12, 0x5B, 0x88, 0x90, 0x88, 0xCD, 0xE0, 0xFC,
-  0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0,
-  0xFF, 0x74, 0x00, 0x2B, 0xF5, 0x82, 0xE4, 0x34,
-  0x50, 0xF5, 0x83, 0xE0, 0x75, 0xF0, 0x04, 0xA4,
-  0x24, 0x80, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x86,
-  0xF5, 0x83, 0x12, 0x5B, 0x88, 0x90, 0x12, 0xDA,
-  0xE0, 0xFD, 0x25, 0xE0, 0x24, 0x53, 0xF5, 0x82,
-  0xE4, 0x34, 0x50, 0xF5, 0x83, 0xE0, 0xFE, 0xED,
-  0x25, 0xE0, 0x24, 0x52, 0xF5, 0x82, 0xE4, 0x34,
-  0x50, 0xF5, 0x83, 0xE0, 0x7C, 0x00, 0x24, 0x00,
-  0xFF, 0xEC, 0x3E, 0xFE, 0x90, 0x12, 0xDA, 0xE0,
-  0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x50, 0xF5,
-  0x83, 0xE0, 0x25, 0xE0, 0x24, 0xC0, 0xF5, 0x82,
-  0xE4, 0x34, 0x87, 0xF5, 0x83, 0xEE, 0xF0, 0xA3,
-  0xEF, 0xF0, 0x02, 0x58, 0x6F, 0x90, 0x12, 0xDA,
-  0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x50,
-  0xF5, 0x83, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0x24,
-  0x00, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x84, 0xF5,
-  0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFC, 0xA3,
-  0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-  0x90, 0x88, 0xC2, 0xE0, 0xF8, 0xA3, 0xE0, 0xF9,
-  0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xEF, 0x2B,
-  0xFF, 0xEE, 0x3A, 0xFE, 0xED, 0x39, 0xFD, 0xEC,
-  0x38, 0xFC, 0xD0, 0x82, 0xD0, 0x83, 0x12, 0x5B,
-  0x88, 0x90, 0x12, 0xDA, 0xE0, 0x24, 0x00, 0xF5,
-  0x82, 0xE4, 0x34, 0x50, 0xF5, 0x83, 0xE0, 0x75,
-  0xF0, 0x04, 0xA4, 0x24, 0x40, 0xF5, 0x82, 0xE5,
-  0xF0, 0x34, 0x85, 0xF5, 0x83, 0xC0, 0x83, 0xC0,
-  0x82, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0,
-  0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x88, 0xC6, 0xE0,
-  0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3,
-  0xE0, 0xFB, 0xEF, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE,
-  0xED, 0x39, 0xFD, 0xEC, 0x38, 0xFC, 0xD0, 0x82,
-  0xD0, 0x83, 0x12, 0x5B, 0x88, 0x90, 0x12, 0xDA,
-  0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x50,
-  0xF5, 0x83, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0x24,
-  0x80, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x86, 0xF5,
-  0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFC, 0xA3,
-  0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-  0x90, 0x88, 0xCD, 0xE0, 0xF8, 0xA3, 0xE0, 0xF9,
-  0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xEF, 0x2B,
-  0xFF, 0xEE, 0x3A, 0xFE, 0xED, 0x39, 0xFD, 0xEC,
-  0x38, 0xFC, 0xD0, 0x82, 0xD0, 0x83, 0x12, 0x5B,
-  0x88, 0x90, 0x12, 0xDA, 0xE0, 0xFD, 0x25, 0xE0,
-  0x24, 0x53, 0xF5, 0x82, 0xE4, 0x34, 0x50, 0xF5,
-  0x83, 0xE0, 0xFE, 0xED, 0x25, 0xE0, 0x24, 0x52,
-  0xF5, 0x82, 0xE4, 0x34, 0x50, 0xF5, 0x83, 0xE0,
-  0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE,
-  0x90, 0x12, 0xDA, 0xE0, 0x24, 0x00, 0xF5, 0x82,
-  0xE4, 0x34, 0x50, 0xF5, 0x83, 0xE0, 0x25, 0xE0,
-  0x24, 0xC0, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5,
-  0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x5A, 0x1E, 0x90,
-  0x12, 0xDA, 0xE0, 0x04, 0xF0, 0x02, 0x55, 0x59,
-  0x22, 0xE7, 0x09, 0xF6, 0x08, 0xDF, 0xFA, 0x80,
-  0x46, 0xE7, 0x09, 0xF2, 0x08, 0xDF, 0xFA, 0x80,
-  0x3E, 0x88, 0x82, 0x8C, 0x83, 0xE7, 0x09, 0xF0,
-  0xA3, 0xDF, 0xFA, 0x80, 0x32, 0xE3, 0x09, 0xF6,
-  0x08, 0xDF, 0xFA, 0x80, 0x78, 0xE3, 0x09, 0xF2,
-  0x08, 0xDF, 0xFA, 0x80, 0x70, 0x88, 0x82, 0x8C,
-  0x83, 0xE3, 0x09, 0xF0, 0xA3, 0xDF, 0xFA, 0x80,
-  0x64, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xA3, 0xF6,
-  0x08, 0xDF, 0xFA, 0x80, 0x58, 0x89, 0x82, 0x8A,
-  0x83, 0xE0, 0xA3, 0xF2, 0x08, 0xDF, 0xFA, 0x80,
-  0x4C, 0x80, 0xD2, 0x80, 0xFA, 0x80, 0xC6, 0x80,
-  0xD4, 0x80, 0x69, 0x80, 0xF2, 0x80, 0x33, 0x80,
-  0x10, 0x80, 0xA6, 0x80, 0xEA, 0x80, 0x9A, 0x80,
-  0xA8, 0x80, 0xDA, 0x80, 0xE2, 0x80, 0xCA, 0x80,
-  0x33, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE4,
-  0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5,
-  0x83, 0xCC, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8,
-  0xCC, 0xC5, 0x83, 0xCC, 0xDF, 0xE9, 0xDE, 0xE7,
-  0x80, 0x0D, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93,
-  0xA3, 0xF6, 0x08, 0xDF, 0xF9, 0xEC, 0xFA, 0xA9,
-  0xF0, 0xED, 0xFB, 0x22, 0x89, 0x82, 0x8A, 0x83,
-  0xEC, 0xFA, 0xE0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8,
-  0xCC, 0xC5, 0x83, 0xCC, 0xF0, 0xA3, 0xC8, 0xC5,
-  0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xDF, 0xEA,
-  0xDE, 0xE8, 0x80, 0xDB, 0x89, 0x82, 0x8A, 0x83,
-  0xE4, 0x93, 0xA3, 0xF2, 0x08, 0xDF, 0xF9, 0x80,
-  0xCC, 0x88, 0xF0, 0xEF, 0x60, 0x01, 0x0E, 0x4E,
-  0x60, 0xC3, 0x88, 0xF0, 0xED, 0x24, 0x02, 0xB4,
-  0x04, 0x00, 0x50, 0xB9, 0xF5, 0x82, 0xEB, 0x24,
-  0x02, 0xB4, 0x04, 0x00, 0x50, 0xAF, 0x23, 0x23,
-  0x45, 0x82, 0x23, 0x90, 0x58, 0xC9, 0x73, 0xBB,
-  0x01, 0x06, 0x89, 0x82, 0x8A, 0x83, 0xF0, 0x22,
-  0x50, 0x02, 0xF7, 0x22, 0xBB, 0xFE, 0x01, 0xF3,
-  0x22, 0xEF, 0x8D, 0xF0, 0xA4, 0xA8, 0xF0, 0xCF,
-  0x8C, 0xF0, 0xA4, 0x28, 0xCE, 0x8D, 0xF0, 0xA4,
-  0x2E, 0xFE, 0x22, 0xBC, 0x00, 0x0B, 0xBE, 0x00,
-  0x29, 0xEF, 0x8D, 0xF0, 0x84, 0xFF, 0xAD, 0xF0,
-  0x22, 0xE4, 0xCC, 0xF8, 0x75, 0xF0, 0x08, 0xEF,
-  0x2F, 0xFF, 0xEE, 0x33, 0xFE, 0xEC, 0x33, 0xFC,
-  0xEE, 0x9D, 0xEC, 0x98, 0x40, 0x05, 0xFC, 0xEE,
-  0x9D, 0xFE, 0x0F, 0xD5, 0xF0, 0xE9, 0xE4, 0xCE,
-  0xFD, 0x22, 0xED, 0xF8, 0xF5, 0xF0, 0xEE, 0x84,
-  0x20, 0xD2, 0x1C, 0xFE, 0xAD, 0xF0, 0x75, 0xF0,
-  0x08, 0xEF, 0x2F, 0xFF, 0xED, 0x33, 0xFD, 0x40,
-  0x07, 0x98, 0x50, 0x06, 0xD5, 0xF0, 0xF2, 0x22,
-  0xC3, 0x98, 0xFD, 0x0F, 0xD5, 0xF0, 0xEA, 0x22,
-  0xC2, 0xD5, 0xEC, 0x30, 0xE7, 0x09, 0xB2, 0xD5,
-  0xE4, 0xC3, 0x9D, 0xFD, 0xE4, 0x9C, 0xFC, 0xEE,
-  0x30, 0xE7, 0x15, 0xB2, 0xD5, 0xE4, 0xC3, 0x9F,
-  0xFF, 0xE4, 0x9E, 0xFE, 0x12, 0x59, 0x93, 0xC3,
-  0xE4, 0x9D, 0xFD, 0xE4, 0x9C, 0xFC, 0x80, 0x03,
-  0x12, 0x59, 0x93, 0x30, 0xD5, 0x07, 0xC3, 0xE4,
-  0x9F, 0xFF, 0xE4, 0x9E, 0xFE, 0x22, 0xC5, 0xF0,
-  0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, 0xF8,
-  0xE5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83,
-  0xE0, 0x38, 0xF0, 0x22, 0xE8, 0x8F, 0xF0, 0xA4,
-  0xCC, 0x8B, 0xF0, 0xA4, 0x2C, 0xFC, 0xE9, 0x8E,
-  0xF0, 0xA4, 0x2C, 0xFC, 0x8A, 0xF0, 0xED, 0xA4,
-  0x2C, 0xFC, 0xEA, 0x8E, 0xF0, 0xA4, 0xCD, 0xA8,
-  0xF0, 0x8B, 0xF0, 0xA4, 0x2D, 0xCC, 0x38, 0x25,
-  0xF0, 0xFD, 0xE9, 0x8F, 0xF0, 0xA4, 0x2C, 0xCD,
-  0x35, 0xF0, 0xFC, 0xEB, 0x8E, 0xF0, 0xA4, 0xFE,
-  0xA9, 0xF0, 0xEB, 0x8F, 0xF0, 0xA4, 0xCF, 0xC5,
-  0xF0, 0x2E, 0xCD, 0x39, 0xFE, 0xE4, 0x3C, 0xFC,
-  0xEA, 0xA4, 0x2D, 0xCE, 0x35, 0xF0, 0xFD, 0xE4,
-  0x3C, 0xFC, 0x22, 0x75, 0xF0, 0x08, 0x75, 0x82,
-  0x00, 0xEF, 0x2F, 0xFF, 0xEE, 0x33, 0xFE, 0xCD,
-  0x33, 0xCD, 0xCC, 0x33, 0xCC, 0xC5, 0x82, 0x33,
-  0xC5, 0x82, 0x9B, 0xED, 0x9A, 0xEC, 0x99, 0xE5,
-  0x82, 0x98, 0x40, 0x0C, 0xF5, 0x82, 0xEE, 0x9B,
-  0xFE, 0xED, 0x9A, 0xFD, 0xEC, 0x99, 0xFC, 0x0F,
-  0xD5, 0xF0, 0xD6, 0xE4, 0xCE, 0xFB, 0xE4, 0xCD,
-  0xFA, 0xE4, 0xCC, 0xF9, 0xA8, 0x82, 0x22, 0xB8,
-  0x00, 0xC1, 0xB9, 0x00, 0x59, 0xBA, 0x00, 0x2D,
-  0xEC, 0x8B, 0xF0, 0x84, 0xCF, 0xCE, 0xCD, 0xFC,
-  0xE5, 0xF0, 0xCB, 0xF9, 0x78, 0x18, 0xEF, 0x2F,
-  0xFF, 0xEE, 0x33, 0xFE, 0xED, 0x33, 0xFD, 0xEC,
-  0x33, 0xFC, 0xEB, 0x33, 0xFB, 0x10, 0xD7, 0x03,
-  0x99, 0x40, 0x04, 0xEB, 0x99, 0xFB, 0x0F, 0xD8,
-  0xE5, 0xE4, 0xF9, 0xFA, 0x22, 0x78, 0x18, 0xEF,
-  0x2F, 0xFF, 0xEE, 0x33, 0xFE, 0xED, 0x33, 0xFD,
-  0xEC, 0x33, 0xFC, 0xC9, 0x33, 0xC9, 0x10, 0xD7,
-  0x05, 0x9B, 0xE9, 0x9A, 0x40, 0x07, 0xEC, 0x9B,
-  0xFC, 0xE9, 0x9A, 0xF9, 0x0F, 0xD8, 0xE0, 0xE4,
-  0xC9, 0xFA, 0xE4, 0xCC, 0xFB, 0x22, 0x75, 0xF0,
-  0x10, 0xEF, 0x2F, 0xFF, 0xEE, 0x33, 0xFE, 0xED,
-  0x33, 0xFD, 0xCC, 0x33, 0xCC, 0xC8, 0x33, 0xC8,
-  0x10, 0xD7, 0x07, 0x9B, 0xEC, 0x9A, 0xE8, 0x99,
-  0x40, 0x0A, 0xED, 0x9B, 0xFD, 0xEC, 0x9A, 0xFC,
-  0xE8, 0x99, 0xF8, 0x0F, 0xD5, 0xF0, 0xDA, 0xE4,
-  0xCD, 0xFB, 0xE4, 0xCC, 0xFA, 0xE4, 0xC8, 0xF9,
-  0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42,
-  0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, 0x9C, 0x45,
-  0xF0, 0x22, 0xE8, 0x60, 0x0F, 0xEC, 0xC3, 0x13,
-  0xFC, 0xED, 0x13, 0xFD, 0xEE, 0x13, 0xFE, 0xEF,
-  0x13, 0xFF, 0xD8, 0xF1, 0x22, 0xE8, 0x60, 0x0F,
-  0xEF, 0xC3, 0x33, 0xFF, 0xEE, 0x33, 0xFE, 0xED,
-  0x33, 0xFD, 0xEC, 0x33, 0xFC, 0xD8, 0xF1, 0x22,
-  0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEE, 0xF0,
-  0xA3, 0xEF, 0xF0, 0x22, 0xA8, 0x82, 0x85, 0x83,
-  0xF0, 0xD0, 0x83, 0xD0, 0x82, 0x12, 0x5B, 0xAB,
-  0x12, 0x5B, 0xAB, 0x12, 0x5B, 0xAB, 0x12, 0x5B,
-  0xAB, 0xE4, 0x73, 0xE4, 0x93, 0xA3, 0xC5, 0x83,
-  0xC5, 0xF0, 0xC5, 0x83, 0xC8, 0xC5, 0x82, 0xC8,
-  0xF0, 0xA3, 0xC5, 0x83, 0xC5, 0xF0, 0xC5, 0x83,
-  0xC8, 0xC5, 0x82, 0xC8, 0x22, 0xA4, 0x25, 0x82,
-  0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83,
-  0x22, 0x75, 0x81, 0x64, 0xD2, 0xAF, 0xD2, 0xAE,
-  0x12, 0x00, 0x40, 0x12, 0x7F, 0xF0, 0x7F, 0x64,
-  0x7E, 0x00, 0x12, 0x67, 0xEE, 0x12, 0x78, 0x00,
-  0x12, 0x51, 0x6F, 0xC2, 0x12, 0xE4, 0x90, 0x12,
-  0x5B, 0xF0, 0xC2, 0x01, 0x75, 0x9E, 0x55, 0x20,
-  0x0A, 0x03, 0x02, 0x5D, 0xFE, 0xC2, 0x0A, 0x85,
-  0x0E, 0x09, 0x85, 0x0F, 0x0A, 0xE4, 0xF5, 0x0E,
-  0xF5, 0x0F, 0x20, 0x12, 0x03, 0x12, 0x78, 0xE5,
-  0x30, 0x03, 0x06, 0x12, 0x27, 0xB1, 0x02, 0x5D,
-  0xFE, 0x20, 0x12, 0x03, 0x02, 0x5C, 0xB2, 0xE4,
-  0x90, 0xF1, 0x0A, 0xF0, 0x90, 0xF1, 0x1B, 0xF0,
-  0x90, 0xF1, 0x1F, 0x74, 0x0F, 0xF0, 0x90, 0xF1,
-  0x22, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0xF1, 0x1C,
-  0xF0, 0x90, 0xF1, 0x06, 0x04, 0xF0, 0xA3, 0xF0,
-  0x90, 0xF1, 0x0E, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3,
-  0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3,
-  0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xE4,
-  0xFD, 0xFC, 0xED, 0x25, 0xE0, 0xFE, 0xEC, 0x33,
-  0x90, 0x12, 0xD8, 0xF0, 0xA3, 0xCE, 0xF0, 0x90,
-  0x12, 0xD8, 0xE0, 0xFE, 0xA3, 0xE0, 0x7B, 0x01,
-  0x7A, 0xF0, 0x79, 0x01, 0x24, 0x01, 0xF9, 0x74,
-  0xF0, 0x3E, 0xFA, 0xE4, 0x12, 0x59, 0x6F, 0x04,
-  0x29, 0xF9, 0xE4, 0x3A, 0xFA, 0x74, 0x08, 0x12,
-  0x59, 0x6F, 0x0D, 0xBD, 0x00, 0x01, 0x0C, 0xED,
-  0x64, 0x60, 0x4C, 0x70, 0xC5, 0x12, 0x5E, 0xE7,
-  0x90, 0x12, 0x5B, 0xE0, 0x04, 0xF0, 0xE0, 0x64,
-  0x60, 0x60, 0x03, 0x02, 0x5D, 0xFE, 0xF0, 0x90,
-  0x8F, 0xFD, 0x74, 0xBB, 0xF0, 0xC2, 0x12, 0x02,
-  0x5D, 0xFE, 0x90, 0x12, 0xBF, 0xE0, 0xFF, 0x12,
-  0x63, 0xD9, 0x12, 0x27, 0xF9, 0xA2, 0xD9, 0xE4,
-  0x33, 0x90, 0x8E, 0x01, 0xF0, 0x90, 0xF0, 0xC4,
-  0x74, 0x01, 0xF0, 0x30, 0x15, 0x09, 0x12, 0x28,
-  0x14, 0x12, 0x55, 0x1F, 0x12, 0x61, 0x81, 0x12,
-  0x00, 0x4F, 0x12, 0x46, 0xE2, 0x12, 0x35, 0x80,
-  0x90, 0x3F, 0xFD, 0xE0, 0xB4, 0x02, 0x19, 0xE5,
-  0x91, 0x30, 0xE4, 0x05, 0x75, 0x9E, 0x55, 0x80,
-  0xF6, 0x90, 0x8F, 0xF0, 0xE0, 0xD3, 0x94, 0x00,
-  0x40, 0x04, 0xC2, 0x84, 0x80, 0x02, 0xD2, 0x84,
-  0xE5, 0x91, 0x30, 0xE4, 0x03, 0x02, 0x5D, 0xEA,
-  0x90, 0x8F, 0xF0, 0xE0, 0xD3, 0x94, 0x00, 0x40,
-  0x7C, 0xE4, 0x90, 0x12, 0x63, 0xF0, 0xA3, 0xF0,
-  0xB2, 0x14, 0x75, 0x8A, 0x8B, 0xF5, 0x8B, 0x30,
-  0x14, 0x2C, 0x90, 0x12, 0xD5, 0xF0, 0x90, 0x12,
-  0xD5, 0xE0, 0xFF, 0x24, 0x00, 0xF5, 0x82, 0xE4,
-  0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x00,
-  0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8B, 0xF5, 0x83,
-  0xEE, 0xF0, 0x90, 0x12, 0xD5, 0xE0, 0x04, 0xF0,
-  0xE0, 0xB4, 0x3C, 0xDA, 0x80, 0x2B, 0xE4, 0x90,
-  0x12, 0xD5, 0xF0, 0x90, 0x12, 0xD5, 0xE0, 0xFF,
-  0x24, 0x78, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5,
-  0x83, 0xE0, 0xFE, 0x74, 0x00, 0x2F, 0xF5, 0x82,
-  0xE4, 0x34, 0x8B, 0xF5, 0x83, 0xEE, 0xF0, 0x90,
-  0x12, 0xD5, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x3C,
-  0xDA, 0x90, 0x3F, 0xFD, 0xE0, 0x64, 0x01, 0x70,
-  0x7B, 0xC2, 0x84, 0x7F, 0x32, 0xFE, 0x12, 0x67,
-  0xEE, 0xD2, 0x84, 0x80, 0x6F, 0x30, 0x0C, 0x6C,
-  0x30, 0x07, 0x16, 0x90, 0x3F, 0xFD, 0xE0, 0xB4,
-  0x01, 0x0B, 0xC2, 0x84, 0x7F, 0x32, 0x7E, 0x00,
-  0x12, 0x67, 0xEE, 0xD2, 0x84, 0xC2, 0x07, 0x80,
-  0x53, 0x90, 0x12, 0x8B, 0xE4, 0xF0, 0xA3, 0x74,
-  0x64, 0xF0, 0x7F, 0x19, 0x7E, 0x00, 0x12, 0x67,
-  0xEE, 0x90, 0x12, 0x8C, 0xE0, 0x24, 0xFF, 0xF0,
-  0x90, 0x12, 0x8B, 0xE0, 0x34, 0xFF, 0xF0, 0x75,
-  0x9E, 0x55, 0x30, 0x0C, 0x0D, 0xD3, 0xA3, 0xE0,
-  0x94, 0x00, 0x90, 0x12, 0x8B, 0xE0, 0x94, 0x00,
-  0x50, 0xD8, 0x30, 0x0C, 0x1F, 0xC2, 0x84, 0x7F,
-  0x19, 0x7E, 0x00, 0x12, 0x67, 0xEE, 0xD2, 0x84,
-  0x80, 0x12, 0x90, 0x8F, 0xF0, 0xE0, 0xD3, 0x94,
-  0x00, 0x40, 0x09, 0x30, 0x0C, 0x04, 0xD2, 0x0B,
-  0x80, 0x02, 0xC2, 0x0B, 0xC2, 0x15, 0x20, 0x05,
-  0x03, 0x02, 0x5E, 0xDB, 0xC2, 0x05, 0xC2, 0x03,
-  0x90, 0x8F, 0xFF, 0xE0, 0x64, 0xAF, 0x70, 0x2A,
-  0xF0, 0x12, 0x67, 0x75, 0xE4, 0xF5, 0xA1, 0x7F,
-  0x32, 0xFE, 0x12, 0x67, 0xEE, 0xE4, 0xF5, 0xA1,
-  0x7F, 0x32, 0xFE, 0x12, 0x67, 0xEE, 0xE4, 0xF5,
-  0xA1, 0x7F, 0x32, 0xFE, 0x12, 0x67, 0xEE, 0x75,
-  0x87, 0x02, 0x75, 0x97, 0x55, 0x00, 0x00, 0x02,
-  0x5E, 0xE0, 0x90, 0x8F, 0xFF, 0xE0, 0x64, 0xAE,
-  0x70, 0x03, 0x02, 0x5E, 0xE0, 0x90, 0x8F, 0xFF,
-  0xE0, 0xB4, 0xBF, 0x05, 0xD2, 0x03, 0x02, 0x5E,
-  0xE0, 0x90, 0x8F, 0xFF, 0xE0, 0xB4, 0xCC, 0x24,
-  0xC2, 0x84, 0x7F, 0x64, 0x7E, 0x00, 0x12, 0x67,
-  0xEE, 0xD2, 0x84, 0x7F, 0xF8, 0x7E, 0x8E, 0x12,
-  0x67, 0xEE, 0xC2, 0x84, 0x7F, 0x64, 0x7E, 0x00,
-  0x12, 0x67, 0xEE, 0xD2, 0x84, 0xE4, 0x90, 0x8F,
-  0xFF, 0xF0, 0x80, 0x64, 0x90, 0x8F, 0xFF, 0xE0,
-  0xB4, 0xC3, 0x04, 0xD2, 0x01, 0x80, 0x59, 0x90,
-  0x8F, 0xFF, 0xE0, 0x64, 0xC5, 0x70, 0x38, 0xF0,
-  0x90, 0x8F, 0xFD, 0x74, 0xAA, 0xF0, 0xD2, 0x12,
-  0xE4, 0x90, 0x12, 0x5B, 0xF0, 0x90, 0xF1, 0x0A,
-  0xF0, 0x90, 0xF1, 0x1F, 0x74, 0x14, 0xF0, 0x90,
-  0xF1, 0x22, 0xF0, 0xE4, 0x90, 0xF1, 0x1C, 0xF0,
-  0x75, 0x9E, 0x55, 0x90, 0xF0, 0xC5, 0xE0, 0x44,
-  0x01, 0xF0, 0x12, 0x27, 0xF9, 0x90, 0xF0, 0xC4,
-  0x74, 0x01, 0xF0, 0xC2, 0x0A, 0x80, 0x19, 0x90,
-  0x8F, 0xFF, 0xE0, 0x64, 0xD1, 0x60, 0x11, 0x90,
-  0x8F, 0xFF, 0xE0, 0xB4, 0xE1, 0x0A, 0x12, 0x66,
-  0x0C, 0x80, 0x05, 0x30, 0x06, 0x02, 0xC2, 0x06,
-  0x12, 0x79, 0x05, 0x02, 0x5B, 0xF4, 0x22, 0x90,
-  0x12, 0x5B, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54,
-  0x1F, 0x90, 0x12, 0xDA, 0xF0, 0xEF, 0x54, 0x07,
-  0xA3, 0xF0, 0x90, 0x12, 0x5B, 0xE0, 0x24, 0x40,
-  0xF5, 0x82, 0xE4, 0x34, 0x19, 0xF5, 0x83, 0xE0,
-  0xB4, 0x01, 0x1A, 0x74, 0x41, 0x2F, 0xF5, 0x82,
-  0xE4, 0x34, 0x19, 0xF5, 0x83, 0xE0, 0xB4, 0x02,
-  0x0C, 0x90, 0x12, 0x5B, 0xE0, 0xD3, 0x94, 0x00,
-  0x40, 0x03, 0x02, 0x5F, 0xAB, 0x90, 0x12, 0x5B,
-  0xE0, 0xFF, 0x24, 0x40, 0xF5, 0x82, 0xE4, 0x34,
-  0x19, 0xF5, 0x83, 0xE0, 0xB4, 0x01, 0x17, 0x74,
-  0x41, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x19, 0xF5,
-  0x83, 0xE0, 0xB4, 0x03, 0x09, 0x90, 0x12, 0x5B,
-  0xE0, 0xD3, 0x94, 0x00, 0x50, 0x5D, 0x90, 0x12,
-  0x5B, 0xE0, 0xFF, 0x24, 0x40, 0xF5, 0x82, 0xE4,
-  0x34, 0x19, 0xF5, 0x83, 0xE0, 0xB4, 0x03, 0x17,
-  0x74, 0x41, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x19,
-  0xF5, 0x83, 0xE0, 0xB4, 0x02, 0x09, 0x90, 0x12,
-  0x5B, 0xE0, 0xD3, 0x94, 0x00, 0x50, 0x34, 0x90,
-  0x12, 0x5B, 0xE0, 0xFF, 0x24, 0x40, 0xF5, 0x82,
-  0xE4, 0x34, 0x19, 0xF5, 0x83, 0xE0, 0x64, 0x03,
-  0x60, 0x03, 0x02, 0x60, 0x58, 0x74, 0x41, 0x2F,
-  0xF5, 0x82, 0xE4, 0x34, 0x19, 0xF5, 0x83, 0xE0,
-  0x64, 0x01, 0x60, 0x03, 0x02, 0x60, 0x58, 0x90,
-  0x12, 0x5B, 0xE0, 0xD3, 0x94, 0x00, 0x50, 0x03,
-  0x02, 0x60, 0x58, 0x90, 0x12, 0x5B, 0xE0, 0x75,
-  0xF0, 0x02, 0xA4, 0xFF, 0xAE, 0xF0, 0x90, 0x12,
-  0x75, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7A, 0xF0,
-  0x79, 0x01, 0x24, 0x01, 0xF9, 0x74, 0xF0, 0x3E,
-  0xFA, 0x90, 0x12, 0x5C, 0x74, 0x01, 0xF0, 0xA3,
-  0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x90, 0x12, 0x5C,
-  0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9,
-  0xE4, 0x12, 0x59, 0x6F, 0x90, 0x12, 0x5D, 0x75,
-  0xF0, 0x01, 0x12, 0x5A, 0x1E, 0x90, 0x12, 0x5C,
-  0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9,
-  0x74, 0x20, 0x12, 0x59, 0x6F, 0x90, 0x12, 0x5B,
-  0xE0, 0x24, 0xFF, 0xFF, 0xE4, 0x34, 0xFF, 0xFE,
-  0xEF, 0x25, 0xE0, 0xFF, 0xEE, 0x33, 0xFE, 0x90,
-  0x12, 0x75, 0xF0, 0xA3, 0xEF, 0xF0, 0x7A, 0xF0,
-  0x79, 0x01, 0x24, 0x01, 0xF9, 0x74, 0xF0, 0x3E,
-  0xFA, 0x90, 0x12, 0x5C, 0x74, 0x01, 0xF0, 0xA3,
-  0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x90, 0x12, 0x5C,
-  0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9,
-  0xE4, 0x12, 0x59, 0x6F, 0x90, 0x12, 0x5D, 0x75,
-  0xF0, 0x01, 0x12, 0x5A, 0x1E, 0x90, 0x12, 0x5C,
-  0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9,
-  0x74, 0x10, 0x12, 0x59, 0x6F, 0x02, 0x61, 0x4A,
-  0x90, 0x12, 0x5B, 0xE0, 0xFF, 0x24, 0x40, 0xF5,
-  0x82, 0xE4, 0x34, 0x19, 0xF5, 0x83, 0xE0, 0xB4,
-  0x01, 0x0F, 0x74, 0x41, 0x2F, 0xF5, 0x82, 0xE4,
-  0x34, 0x19, 0xF5, 0x83, 0xE0, 0x64, 0x01, 0x60,
-  0x28, 0x90, 0x12, 0x5B, 0xE0, 0xFF, 0x24, 0x40,
-  0xF5, 0x82, 0xE4, 0x34, 0x19, 0xF5, 0x83, 0xE0,
-  0x64, 0x03, 0x60, 0x03, 0x02, 0x61, 0x4A, 0x74,
-  0x41, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x19, 0xF5,
-  0x83, 0xE0, 0x64, 0x03, 0x60, 0x03, 0x02, 0x61,
-  0x4A, 0x90, 0x12, 0x5B, 0xE0, 0x75, 0xF0, 0x02,
-  0xA4, 0xFF, 0xAE, 0xF0, 0x90, 0x12, 0x75, 0xEE,
-  0xF0, 0xA3, 0xEF, 0xF0, 0x7A, 0xF0, 0x79, 0x01,
-  0x24, 0x01, 0xF9, 0x74, 0xF0, 0x3E, 0xFA, 0x90,
-  0x12, 0x5C, 0x74, 0x01, 0xF0, 0xA3, 0xEA, 0xF0,
-  0xA3, 0xE9, 0xF0, 0x90, 0x12, 0x5C, 0xE0, 0xFB,
-  0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0xE4, 0x12,
-  0x59, 0x6F, 0x90, 0x12, 0x5D, 0x75, 0xF0, 0x01,
-  0x12, 0x5A, 0x1E, 0x90, 0x12, 0x5C, 0xE0, 0xFB,
-  0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0x74, 0x10,
-  0x12, 0x59, 0x6F, 0x90, 0x12, 0x5B, 0xE0, 0x24,
-  0x01, 0xFF, 0xE4, 0x33, 0xFE, 0xEF, 0x25, 0xE0,
-  0xFF, 0xEE, 0x33, 0xFE, 0x90, 0x12, 0x75, 0xF0,
-  0xA3, 0xEF, 0xF0, 0x7A, 0xF0, 0x79, 0x01, 0x24,
-  0x01, 0xF9, 0x74, 0xF0, 0x3E, 0xFA, 0x90, 0x12,
-  0x5C, 0x74, 0x01, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3,
-  0xE9, 0xF0, 0x90, 0x12, 0x5C, 0xE0, 0xFB, 0xA3,
-  0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0xE4, 0x12, 0x59,
-  0x6F, 0x90, 0x12, 0x5D, 0x75, 0xF0, 0x01, 0x12,
-  0x5A, 0x1E, 0x90, 0x12, 0x5C, 0xE0, 0xFB, 0xA3,
-  0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0x74, 0x20, 0x12,
-  0x59, 0x6F, 0x12, 0x27, 0xF9, 0x90, 0xF0, 0xC4,
-  0x74, 0x01, 0xF0, 0x20, 0x0A, 0x05, 0x75, 0x9E,
-  0x55, 0x80, 0xF8, 0x90, 0x00, 0x01, 0xE0, 0xFE,
-  0x90, 0x00, 0x00, 0xE0, 0x7C, 0x00, 0x24, 0x00,
-  0xFF, 0xEC, 0x3E, 0xFE, 0x90, 0x12, 0x5B, 0xE0,
-  0x25, 0xE0, 0x24, 0xA0, 0xF5, 0x82, 0xE4, 0x34,
-  0x19, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
-  0x22, 0xE4, 0x90, 0x12, 0xDB, 0xF0, 0x90, 0x12,
-  0xDA, 0xF0, 0x90, 0xF2, 0xA8, 0xE0, 0xFF, 0x90,
-  0x12, 0xDA, 0xE0, 0xFE, 0xC3, 0x9F, 0x40, 0x03,
-  0x02, 0x63, 0xD0, 0x74, 0x60, 0x2E, 0xF5, 0x82,
-  0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0x64, 0x01,
-  0x60, 0x03, 0x02, 0x63, 0xB5, 0xEE, 0x25, 0xE0,
-  0x24, 0xC0, 0xF5, 0x82, 0xE4, 0x34, 0x87, 0xF5,
-  0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0xFF,
-  0xEE, 0x94, 0x00, 0x40, 0x12, 0x90, 0x12, 0xDB,
-  0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x8A,
-  0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x80, 0x22, 0x90,
-  0x12, 0xDA, 0xE0, 0x25, 0xE0, 0x24, 0xC0, 0xF5,
-  0x82, 0xE4, 0x34, 0x87, 0xF5, 0x83, 0xE0, 0xA3,
-  0xE0, 0xFF, 0x90, 0x12, 0xDB, 0xE0, 0x24, 0x00,
-  0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83, 0xEF,
-  0xF0, 0x90, 0x12, 0xDA, 0xE0, 0x75, 0xF0, 0x04,
-  0xA4, 0x24, 0x80, 0xF5, 0x82, 0xE5, 0xF0, 0x34,
-  0x86, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD,
-  0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x78, 0x02,
-  0x12, 0x5B, 0x62, 0xE4, 0x7B, 0xFF, 0xFA, 0xF9,
-  0xF8, 0xC3, 0x12, 0x5B, 0x51, 0x50, 0x12, 0x90,
-  0x12, 0xDB, 0xE0, 0x24, 0x28, 0xF5, 0x82, 0xE4,
-  0x34, 0x8A, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x80,
-  0x31, 0x90, 0x12, 0xDA, 0xE0, 0x75, 0xF0, 0x04,
-  0xA4, 0x24, 0x80, 0xF5, 0x82, 0xE5, 0xF0, 0x34,
-  0x86, 0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD,
-  0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x78, 0x02,
-  0x12, 0x5B, 0x62, 0x90, 0x12, 0xDB, 0xE0, 0x24,
-  0x28, 0xF5, 0x82, 0xE4, 0x34, 0x8A, 0xF5, 0x83,
-  0xEF, 0xF0, 0x85, 0x0B, 0xAF, 0x90, 0x12, 0xDA,
-  0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xA4, 0x24, 0x01,
-  0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x84, 0xF5, 0x83,
-  0xE0, 0xF5, 0xA9, 0x75, 0xF0, 0x04, 0xEF, 0xA4,
-  0x24, 0x02, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x84,
-  0xF5, 0x83, 0xE0, 0xF5, 0xAA, 0x90, 0x12, 0xDA,
-  0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xA4, 0x24, 0x03,
-  0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x84, 0xF5, 0x83,
-  0xE0, 0xF5, 0xAB, 0x75, 0xF0, 0x04, 0xEF, 0xA4,
-  0x24, 0x81, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x86,
-  0xF5, 0x83, 0xE0, 0xF5, 0xA2, 0x90, 0x12, 0xDA,
-  0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xA4, 0x24, 0x82,
-  0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x86, 0xF5, 0x83,
-  0xE0, 0xF5, 0xA3, 0x75, 0xF0, 0x04, 0xEF, 0xA4,
-  0x24, 0x83, 0xF5, 0x82, 0xE5, 0xF0, 0x34, 0x86,
-  0xF5, 0x83, 0xE0, 0xF5, 0xA4, 0xD2, 0xB0, 0x85,
-  0x0C, 0xAF, 0x90, 0x12, 0xDA, 0xE0, 0xFF, 0x75,
-  0xF0, 0x04, 0xA4, 0x24, 0x41, 0xF5, 0x82, 0xE5,
-  0xF0, 0x34, 0x85, 0xF5, 0x83, 0xE0, 0xF5, 0xA9,
-  0x75, 0xF0, 0x04, 0xEF, 0xA4, 0x24, 0x42, 0xF5,
-  0x82, 0xE5, 0xF0, 0x34, 0x85, 0xF5, 0x83, 0xE0,
-  0xF5, 0xAA, 0x90, 0x12, 0xDA, 0xE0, 0x75, 0xF0,
-  0x04, 0xA4, 0x24, 0x43, 0xF5, 0x82, 0xE5, 0xF0,
-  0x34, 0x85, 0xF5, 0x83, 0xE0, 0xF5, 0xAB, 0x20,
-  0xB0, 0x06, 0x30, 0x0E, 0x03, 0x20, 0xDA, 0x05,
-  0x75, 0x9E, 0x55, 0x80, 0xF2, 0xC2, 0xDA, 0xC2,
-  0x0E, 0xAF, 0xA6, 0xEF, 0xFE, 0xAD, 0xA7, 0x7C,
-  0x00, 0xE4, 0x2D, 0xFF, 0xEC, 0x3E, 0xFE, 0x90,
-  0x28, 0x0B, 0xE4, 0x93, 0xFD, 0xC3, 0x13, 0x2F,
-  0xFF, 0xEC, 0x3E, 0xFE, 0x90, 0x12, 0xDB, 0xE0,
-  0x25, 0xE0, 0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82,
-  0xE4, 0x34, 0xF2, 0xF5, 0x83, 0xEE, 0xF0, 0xA3,
-  0xEF, 0xF0, 0xD2, 0xB0, 0x20, 0xB0, 0x06, 0x30,
-  0x0E, 0x03, 0x20, 0xDA, 0x05, 0x75, 0x9E, 0x55,
-  0x80, 0xF2, 0xC2, 0xDA, 0xC2, 0x0E, 0xAF, 0xA6,
-  0xEF, 0xFE, 0xAD, 0xA7, 0x7C, 0x00, 0xE4, 0x2D,
-  0xFF, 0xEC, 0x3E, 0xFE, 0x90, 0x28, 0x0C, 0xE4,
-  0x93, 0xFD, 0xC3, 0x13, 0x2F, 0xFF, 0xEC, 0x3E,
-  0xFE, 0x90, 0x12, 0xDB, 0xE0, 0x25, 0xE0, 0x25,
-  0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xF2,
-  0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90,
-  0x12, 0xDB, 0xE0, 0x04, 0xF0, 0x90, 0x12, 0xDB,
-  0xE0, 0xFF, 0x65, 0x08, 0x60, 0x12, 0x90, 0x88,
-  0xB0, 0xE0, 0xFE, 0xEF, 0x6E, 0x60, 0x09, 0x90,
-  0x12, 0xDA, 0xE0, 0x04, 0xF0, 0x02, 0x61, 0x8A,
-  0x90, 0x12, 0xDB, 0xE0, 0x90, 0x88, 0xB0, 0xF0,
-  0x22, 0xAB, 0x07, 0xC2, 0x18, 0xEB, 0x25, 0xE0,
-  0xFE, 0xE4, 0x33, 0x90, 0x12, 0xDC, 0xF0, 0xA3,
-  0xCE, 0xF0, 0xE4, 0xFA, 0xEA, 0xFF, 0x7E, 0x00,
-  0x7C, 0x00, 0x7D, 0x28, 0x12, 0x59, 0x81, 0xAC,
-  0x06, 0xAD, 0x07, 0xEB, 0x25, 0xE0, 0xFF, 0xE4,
-  0x33, 0xFE, 0xED, 0x2F, 0xFF, 0xEC, 0x3E, 0x90,
-  0x12, 0xDC, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x12,
-  0xDC, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x24, 0x01,
-  0xF5, 0x82, 0x74, 0x20, 0x3C, 0xF5, 0x83, 0xE0,
-  0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0x74, 0x20,
-  0x3C, 0xF5, 0x83, 0xE0, 0xFD, 0xEE, 0xED, 0xFF,
-  0x90, 0x12, 0xDA, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
-  0xA3, 0xE0, 0xA3, 0xE0, 0xFD, 0x24, 0x01, 0xF5,
-  0x82, 0x74, 0x00, 0x3C, 0xF5, 0x83, 0xE0, 0xFE,
-  0x74, 0x00, 0x2D, 0xF5, 0x82, 0x74, 0x00, 0x3C,
-  0xF5, 0x83, 0xE0, 0xFD, 0xEE, 0xED, 0xFF, 0x90,
-  0x12, 0xDB, 0xE0, 0x24, 0xFA, 0xFD, 0x90, 0x12,
-  0xDA, 0xE0, 0x34, 0x00, 0xFC, 0xD3, 0xEF, 0x9D,
-  0xEE, 0x9C, 0x40, 0x0E, 0x90, 0x12, 0x72, 0xE0,
-  0x04, 0xF0, 0x70, 0x06, 0x90, 0x12, 0x71, 0xE0,
-  0x04, 0xF0, 0xEF, 0x24, 0xFA, 0xFF, 0xE4, 0x3E,
-  0xFE, 0xD3, 0x90, 0x12, 0xDB, 0xE0, 0x9F, 0x90,
-  0x12, 0xDA, 0xE0, 0x9E, 0x40, 0x0E, 0x90, 0x12,
-  0xBE, 0xE0, 0x04, 0xF0, 0x70, 0x06, 0x90, 0x12,
-  0xBD, 0xE0, 0x04, 0xF0, 0x0A, 0xEA, 0x64, 0x1E,
-  0x60, 0x03, 0x02, 0x63, 0xEC, 0x90, 0x12, 0xBF,
-  0xE0, 0x04, 0xF0, 0xE0, 0x64, 0x14, 0x70, 0x37,
-  0xF0, 0x90, 0x12, 0xBD, 0xE0, 0xFE, 0xA3, 0xE0,
-  0xFF, 0xD3, 0x90, 0x12, 0x72, 0xE0, 0x9F, 0x90,
-  0x12, 0x71, 0xE0, 0x9E, 0x40, 0x02, 0xD2, 0x18,
-  0x30, 0x18, 0x1C, 0xC2, 0x18, 0xE4, 0x90, 0x12,
-  0x71, 0xF0, 0xA3, 0xF0, 0x90, 0x12, 0xBD, 0xF0,
-  0xA3, 0xF0, 0x90, 0xF1, 0x04, 0x74, 0x1E, 0xF0,
-  0x90, 0xF0, 0xC5, 0xE0, 0x44, 0x01, 0xF0, 0x22,
-  0x30, 0x98, 0x04, 0xD2, 0x05, 0xC2, 0x98, 0x30,
-  0x99, 0x24, 0xD2, 0x06, 0xC2, 0x99, 0x30, 0x0B,
-  0x19, 0xB2, 0x14, 0x30, 0x14, 0x08, 0x75, 0x8A,
-  0x8F, 0x75, 0x8B, 0x00, 0x80, 0x06, 0x75, 0x8A,
-  0x8F, 0x75, 0x8B, 0x78, 0xC2, 0x0B, 0xD2, 0x07,
-  0x80, 0x04, 0xC2, 0x0C, 0xC2, 0x07, 0x32, 0x32,
-  0x05, 0x00, 0x03, 0x20, 0x03, 0x03, 0xE5, 0xC0,
-  0x54, 0x02, 0x70, 0x03, 0x02, 0x5B, 0xD1, 0xE5,
-  0xC0, 0x54, 0x02, 0x60, 0x13, 0x90, 0x00, 0x00,
-  0x7F, 0x00, 0x7E, 0x90, 0xE4, 0x74, 0xFF, 0xF0,
-  0xA3, 0x75, 0x9E, 0x55, 0xDF, 0xF9, 0xDE, 0xF7,
-  0x02, 0x5B, 0xD1, 0xC2, 0xD3, 0xC2, 0xD4, 0x75,
-  0x9E, 0x55, 0x12, 0x65, 0xEF, 0x12, 0x65, 0xEF,
-  0x78, 0x01, 0x74, 0x55, 0xF6, 0x64, 0xFF, 0x08,
-  0xB8, 0x60, 0xF9, 0x78, 0x80, 0x74, 0x55, 0xF6,
-  0x64, 0xFF, 0x08, 0xB8, 0x00, 0xF9, 0x75, 0x9E,
-  0x55, 0x12, 0x65, 0xEF, 0x12, 0x65, 0xEF, 0x78,
-  0x01, 0x74, 0x55, 0xC0, 0xE0, 0x66, 0x70, 0x22,
-  0xD0, 0xE0, 0x63, 0xE0, 0xFF, 0x08, 0xB8, 0x60,
-  0xF2, 0x78, 0x80, 0x74, 0x55, 0xC0, 0xE0, 0x66,
-  0x70, 0x10, 0xD0, 0xE0, 0x63, 0xE0, 0xFF, 0x08,
-  0xB8, 0x00, 0xF2, 0x90, 0x00, 0x00, 0x74, 0x01,
-  0xF0, 0x22, 0x90, 0x00, 0x00, 0x74, 0x00, 0xF0,
-  0xA3, 0x90, 0x00, 0x01, 0xE8, 0xF0, 0xD0, 0xE0,
-  0x22, 0x78, 0x60, 0x74, 0x55, 0xF6, 0x64, 0xFF,
-  0x08, 0xB8, 0x81, 0xF9, 0x75, 0x9E, 0x55, 0x12,
-  0x65, 0xEF, 0x12, 0x65, 0xEF, 0x78, 0x60, 0x74,
-  0x55, 0xC0, 0xE0, 0x66, 0x70, 0x11, 0xD0, 0xE0,
-  0x63, 0xE0, 0xFF, 0x08, 0xB8, 0x81, 0xF2, 0x90,
-  0x00, 0x00, 0xE0, 0x44, 0x02, 0xF0, 0x22, 0x90,
-  0x00, 0x00, 0xE0, 0x44, 0x00, 0xF0, 0x90, 0x00,
-  0x02, 0xE8, 0xF0, 0xD0, 0xE0, 0x22, 0xC0, 0xE0,
-  0xC0, 0xD0, 0xD0, 0xD0, 0xD0, 0xE0, 0x32, 0x78,
-  0x00, 0xD8, 0xFE, 0x22, 0x78, 0x96, 0x79, 0xFA,
-  0xD9, 0xFE, 0xD8, 0xFA, 0x22, 0x78, 0x02, 0x79,
-  0xFA, 0x7A, 0xFA, 0xDA, 0xFE, 0xD9, 0xFA, 0xD8,
-  0xF6, 0x22, 0x00, 0x00, 0xE4, 0x90, 0x12, 0xDE,
-  0xF0, 0xA3, 0xF0, 0x90, 0x12, 0xDA, 0xF0, 0xA3,
-  0xF0, 0xB2, 0x86, 0xB2, 0x86, 0xFD, 0xFC, 0xB2,
-  0x85, 0x75, 0x9E, 0x55, 0xED, 0xAE, 0x04, 0x78,
-  0x07, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9,
-  0xFF, 0x90, 0x12, 0xDA, 0xEE, 0xF0, 0xA3, 0xEF,
-  0xF0, 0xE4, 0x90, 0x12, 0xE0, 0xF0, 0xA3, 0xF0,
-  0x90, 0x12, 0xDA, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB,
-  0xEA, 0xA3, 0xF0, 0xEB, 0xA3, 0xF0, 0xE4, 0xF9,
-  0xFB, 0xFA, 0x90, 0x12, 0xDA, 0xE0, 0xFE, 0xA3,
-  0xE0, 0xFF, 0x12, 0x78, 0xFD, 0xEF, 0x29, 0xF9,
-  0x90, 0x12, 0xDB, 0xE0, 0x04, 0xF0, 0x70, 0x06,
-  0x90, 0x12, 0xDA, 0xE0, 0x04, 0xF0, 0x0B, 0xBB,
-  0x00, 0x01, 0x0A, 0xEB, 0x64, 0x08, 0x4A, 0x70,
-  0xD9, 0x90, 0x12, 0xDC, 0xE0, 0x29, 0xFF, 0xA3,
-  0xE0, 0x2F, 0x24, 0x08, 0xF9, 0xF4, 0x04, 0xF9,
-  0xFF, 0x90, 0x12, 0xDF, 0xE0, 0x2F, 0xF0, 0x90,
-  0x12, 0xDE, 0xE0, 0x34, 0x00, 0xF0, 0x90, 0x12,
-  0xE1, 0xE0, 0x04, 0xF0, 0x70, 0x06, 0x90, 0x12,
-  0xE0, 0xE0, 0x04, 0xF0, 0xC3, 0x90, 0x12, 0xE1,
-  0xE0, 0x94, 0x10, 0x90, 0x12, 0xE0, 0xE0, 0x64,
-  0x80, 0x94, 0x80, 0x40, 0x8B, 0x0D, 0xBD, 0x00,
-  0x01, 0x0C, 0xED, 0x70, 0x03, 0xEC, 0x64, 0x01,
-  0x60, 0x03, 0x02, 0x66, 0x1F, 0x90, 0x12, 0xDE,
-  0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0x90, 0x8E,
-  0x0E, 0xF0, 0xED, 0x90, 0x8E, 0x0F, 0xF0, 0x90,
-  0x8E, 0x0D, 0x74, 0xAA, 0xF0, 0xB2, 0x86, 0xB2,
-  0x86, 0x75, 0x9E, 0x55, 0x80, 0xFB, 0x22, 0x75,
-  0x9E, 0x55, 0x90, 0xF1, 0x40, 0x74, 0x03, 0xF0,
-  0x7F, 0x01, 0x7E, 0x00, 0x12, 0x78, 0x5A, 0x7F,
-  0x01, 0x7E, 0x00, 0x12, 0x78, 0x5A, 0x75, 0x9E,
-  0x55, 0x90, 0xF1, 0x41, 0x74, 0x01, 0xF0, 0x7F,
-  0x05, 0x7E, 0x00, 0x12, 0x78, 0x5A, 0x7F, 0x05,
-  0x7E, 0x00, 0x12, 0x78, 0x5A, 0x75, 0x9E, 0x55,
-  0x90, 0xF1, 0x41, 0x74, 0x13, 0xF0, 0x7F, 0x05,
-  0x7E, 0x00, 0x12, 0x78, 0x5A, 0x7F, 0x05, 0x7E,
-  0x00, 0x12, 0x78, 0x5A, 0x75, 0x9E, 0x55, 0x90,
-  0xF1, 0x41, 0x74, 0x1F, 0xF0, 0x7F, 0x05, 0x7E,
-  0x00, 0x12, 0x78, 0x5A, 0x7F, 0x05, 0x7E, 0x00,
-  0x12, 0x78, 0x5A, 0x75, 0x9E, 0x55, 0x90, 0xF1,
-  0x41, 0x74, 0x3F, 0xF0, 0x7F, 0x05, 0x7E, 0x00,
-  0x12, 0x78, 0x5A, 0x7F, 0x05, 0x7E, 0x00, 0x12,
-  0x78, 0x5A, 0x75, 0x9E, 0x55, 0x90, 0xF1, 0x40,
-  0x74, 0x83, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x12,
-  0x78, 0x5A, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x78,
-  0x5A, 0x75, 0x9E, 0x55, 0x22, 0xE4, 0x90, 0xF0,
-  0xC4, 0xF0, 0x75, 0x9E, 0x55, 0xFD, 0xFC, 0x90,
-  0xF1, 0x47, 0xE0, 0xFE, 0x90, 0xF1, 0x48, 0xE0,
-  0x7A, 0x00, 0x24, 0x00, 0xFB, 0xEA, 0x3E, 0xFA,
-  0x90, 0xF1, 0x49, 0xE0, 0x7F, 0x00, 0xFE, 0xEF,
-  0x2B, 0xFF, 0xEA, 0x3E, 0xFE, 0x90, 0xF1, 0x4A,
-  0xE0, 0x7A, 0x00, 0x2F, 0xFD, 0xEA, 0x3E, 0xFC,
-  0x90, 0xF1, 0x40, 0x74, 0xE3, 0xF0, 0xE4, 0x90,
-  0xF1, 0x41, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0x12,
-  0x78, 0xB6, 0x75, 0x9E, 0x55, 0x90, 0xF1, 0x41,
-  0x74, 0x40, 0xF0, 0x7F, 0x05, 0x7E, 0x00, 0x12,
-  0x78, 0x5A, 0x7F, 0x05, 0x7E, 0x00, 0x12, 0x78,
-  0x5A, 0x75, 0x9E, 0x55, 0xE4, 0x90, 0xF1, 0x41,
-  0xF0, 0x90, 0xF1, 0x40, 0xF0, 0x7F, 0x02, 0xFE,
-  0x12, 0x78, 0x5A, 0x7F, 0x02, 0x7E, 0x00, 0x12,
-  0x78, 0x5A, 0x75, 0x9E, 0x55, 0x22, 0xEF, 0x1F,
-  0x70, 0x01, 0x1E, 0x75, 0x9E, 0x55, 0xD3, 0xEF,
-  0x94, 0x00, 0xEE, 0x94, 0x00, 0x50, 0xEF, 0x22,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xE5, 0xC0, 0x30, 0xE3, 0x1B, 0x12, 0x67, 0x75,
-  0x7F, 0x32, 0x7E, 0x00, 0x12, 0x78, 0x5A, 0x12,
-  0x66, 0xE7, 0x12, 0x26, 0x17, 0x12, 0x00, 0x36,
-  0x12, 0x78, 0xD8, 0x12, 0x41, 0x2D, 0x80, 0x36,
-  0xE5, 0xC0, 0x30, 0xE2, 0x0D, 0x12, 0x66, 0xE7,
-  0x90, 0xF0, 0xC4, 0x74, 0x01, 0xF0, 0xD2, 0xAF,
-  0x80, 0x24, 0xE5, 0xC0, 0x30, 0xE0, 0x0B, 0x12,
-  0x66, 0xE7, 0x90, 0xF0, 0xC4, 0x74, 0x01, 0xF0,
-  0x80, 0x14, 0xE5, 0xC0, 0x30, 0xE1, 0x0F, 0x12,
-  0x66, 0xE7, 0x12, 0x26, 0x17, 0x12, 0x00, 0x36,
-  0x12, 0x78, 0xD8, 0x12, 0x41, 0x2D, 0xE4, 0xF5,
-  0xC0, 0x22, 0xE4, 0xFD, 0xFC, 0xC3, 0xED, 0x9F,
-  0xEC, 0x9E, 0x50, 0x18, 0xE4, 0xFB, 0xFA, 0x75,
-  0x9E, 0x55, 0x0B, 0xBB, 0x00, 0x01, 0x0A, 0xBA,
-  0x03, 0xF5, 0xBB, 0x20, 0xF2, 0x0D, 0xBD, 0x00,
-  0x01, 0x0C, 0x80, 0xE1, 0x22, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04,
-  0x04, 0x04, 0x04, 0x04, 0x00, 0x03, 0x00, 0x03,
-  0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03,
-  0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03,
-  0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xD2, 0x0A,
-  0x90, 0xF0, 0xC4, 0xE4, 0xF0, 0xC2, 0xD8, 0xD0,
-  0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xE4, 0xFD,
-  0xFC, 0xC3, 0xED, 0x9F, 0xEC, 0x9E, 0x50, 0x08,
-  0x00, 0x0D, 0xBD, 0x00, 0x01, 0x0C, 0x80, 0xF1,
-  0x22, 0xC0, 0xE0, 0xD2, 0x09, 0x05, 0x0F, 0xE5,
-  0x0F, 0x70, 0x02, 0x05, 0x0E, 0xD0, 0xE0, 0x32,
-  0x75, 0x91, 0x01, 0x90, 0x28, 0x0A, 0xE4, 0x93,
-  0xF5, 0x89, 0xD2, 0xAC, 0x22, 0x90, 0xF0, 0xC5,
-  0x74, 0x06, 0xF0, 0x30, 0xF8, 0x02, 0xD2, 0x15,
-  0x22, 0xEE, 0x30, 0xE7, 0x07, 0xC3, 0xE4, 0x9F,
-  0xFF, 0xE4, 0x9E, 0xFE, 0x22, 0x8F, 0x82, 0x8E,
-  0x83, 0xE4, 0x93, 0xFF, 0x22, 0x00, 0x22, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x90, 0x3F, 0xFF, 0x74, 0x03, 0xF0, 0x22, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
\ No newline at end of file
diff --git a/drivers/input/touchscreen/vtl_ts/f307&f317&f316_CT363S_01_V10_F7E9_140212.dat b/drivers/input/touchscreen/vtl_ts/f307&f317&f316_CT363S_01_V10_F7E9_140212.dat
deleted file mode 100644
index 8d43138759b3..000000000000
--- a/drivers/input/touchscreen/vtl_ts/f307&f317&f316_CT363S_01_V10_F7E9_140212.dat
+++ /dev/null
@@ -1,2048 +0,0 @@
-0x02,0x48,0xA5,0x02,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x02,0x4D,0xE5,0x00,0x00,
-
0x00,0x00,0x00,0x02,0x3D,0xFE,0x00,0x00,0x00,0x00,0x00,0x02,0x3D,0xFF,0x00,0x00,
-
0x00,0x00,0x00,0x02,0x4C,0xF6,0x00,0x00,0x00,0x00,0x00,0x02,0x3D,0xE5,0x00,0x00,
-
0x00,0x00,0x00,0x02,0x4E,0x1D,0x75,0x86,0x09,0x75,0x84,0x9C,0xD2,0xA9,0x22,0x32,
-
0x90,0x3F,0xF0,0x74,0x56,0xF0,0xA3,0x74,0x54,0xF0,0xA3,0x74,0x4C,0xF0,0x22,0x78,
-
0x95,0x7C,0x13,0x7A,0x4D,0x79,0x9D,0x7F,0x05,0x12,0x25,0x27,0x90,0x13,0xA3,0x12,
-
0x41,0x6A,0xFF,0xFF,0xFF,0xFF,0x90,0x13,0xA7,0x12,0x41,0x6A,0x00,0x00,0x00,0x00,
-
0x78,0xBB,0x7C,0x13,0x7A,0x4D,0x79,0xA2,0x7F,0x0A,0x12,0x25,0x27,0x78,0xC5,0x7C,
-
0x13,0x7D,0x01,0x7B,0xFF,0x7A,0x4D,0x79,0xAC,0x7E,0x00,0x7F,0x14,0x12,0x40,0x00,
-
0xC2,0x1D,0xE4,0x90,0x12,0x38,0xF0,0x90,0x12,0x6E,0xF0,0x90,0x12,0x6F,0xF0,0x90,
-
0xEC,0x45,0x8B,0xFC,0x0F,0xCF,0xE7,0xF9,0x6F,0x77,0x4F,0x1F,0x7F,0xFE,0x1B,0x6F,
-
0x88,0xC1,0xF0,0xE4,0x90,0x13,0x90,0xF0,0xC2,0x12,0xC2,0x14,0x12,0x25,0x30,0xD3,
-
0x9F,0x40,0x03,0x02,0x02,0x76,0x90,0x88,0xC0,0xE0,0x9F,0x40,0x03,0x02,0x02,0x76,
-
0xE4,0xF0,0x75,0x9E,0x55,0x90,0x13,0x8C,0xF0,0x12,0x23,0x37,0x40,0x03,0x02,0x02,
-
0x48,0x75,0x9E,0x55,0x74,0xE5,0x2F,0x12,0x1E,0xBB,0xE0,0x64,0x01,0x60,0x0E,0x12,
-
0x25,0x3A,0x12,0x1E,0xBB,0xE0,0x64,0x02,0x60,0x03,0x02,0x02,0x3A,0x90,0x13,0x8C,
-
0x12,0x26,0xE2,0x12,0x25,0x41,0xEF,0xF0,0x74,0xE5,0x2F,0x12,0x1E,0xBB,0x74,0x04,
-
0xF0,0xE4,0x90,0x13,0x8D,0xF0,0x90,0x88,0xC1,0x12,0x26,0x1F,0x9F,0x40,0x03,0x02,
-
0x02,0x32,0x75,0x9E,0x55,0x90,0x13,0x8C,0xE0,0xFF,0x12,0x21,0xD0,0x12,0x1D,0xC5,
-
0xFD,0xEE,0x12,0x1E,0x62,0x12,0x26,0xAC,0x40,0x11,0xEF,0x12,0x21,0xD0,0x12,0x20,
-
0x30,0xFF,0x90,0x13,0x8D,0xE0,0x12,0x1E,0x62,0x80,0x12,0x90,0x13,0x8D,0xE0,0x12,
-
0x1E,0x62,0x12,0x20,0x30,0xFF,0x90,0x13,0x8C,0xE0,0x12,0x21,0xD0,0x12,0x1D,0xC5,
-
0xC3,0x9F,0xFF,0xEC,0x9E,0x90,0x13,0x9F,0xF0,0xA3,0xEF,0xF0,0x90,0x13,0x8C,0xE0,
-
0xFF,0x12,0x23,0x49,0x12,0x1D,0xC5,0xFD,0x90,0x13,0x8D,0xE0,0xFE,0x12,0x24,0x48,
-
0x12,0x26,0xAC,0x40,0x13,0xEF,0x12,0x23,0x49,0x12,0x1D,0xC5,0xFD,0xEE,0x12,0x20,
-
0x25,0xC3,0x9D,0xFF,0xEE,0x9C,0x80,0x17,0x90,0x13,0x8D,0xE0,0x12,0x20,0x25,0xFF,
-
0x90,0x13,0x8C,0xE0,0x12,0x23,0x49,0x12,0x1D,0xC5,0xC3,0x9F,0xFF,0xEC,0x9E,0x90,
-
0x13,0xA1,0xF0,0xA3,0xEF,0xF0,0x90,0x13,0xA1,0xE0,0xFE,0xA3,0xE0,0x90,0x13,0xA1,
-
0x12,0x25,0xC7,0xC0,0x04,0xC0,0x05,0xC0,0x06,0xC0,0x07,0x90,0x13,0x9F,0xE0,0xFE,
-
0xA3,0xE0,0x90,0x13,0x9F,0x12,0x25,0xC7,0xD0,0x03,0xD0,0x02,0xD0,0x01,0xD0,0x00,
-
0xEF,0x2B,0xFF,0xEE,0x3A,0xFE,0xED,0x39,0xFD,0xEC,0x38,0xFC,0x90,0x88,0xC0,0xE0,
-
0x12,0x1F,0x97,0xC0,0x83,0xC0,0x82,0x90,0x13,0x8D,0xE0,0xD0,0x82,0xD0,0x83,0x75,
-
0xF0,0x04,0x12,0x41,0x9B,0x12,0x41,0x5E,0x90,0x88,0xC0,0xE0,0x12,0x1F,0x97,0xC0,
-
0x83,0xC0,0x82,0x90,0x13,0x8D,0xE0,0xD0,0x82,0xD0,0x83,0x12,0x1E,0xC3,0xE4,0x7B,
-
0x01,0xFA,0xF9,0xF8,0xD3,0x12,0x41,0x3A,0x40,0x02,0xD2,0x1D,0x12,0x25,0x4B,0x02,
-
0x01,0x16,0x90,0x88,0xC0,0xE0,0x04,0xF0,0x80,0x08,0x12,0x25,0x3A,0x12,0x1E,0xBB,
-
0xE4,0xF0,0x12,0x24,0x54,0x02,0x00,0xD9,0xE4,0x90,0x13,0x8D,0xF0,0x90,0x13,0xBA,
-
0xE0,0xFF,0x12,0x26,0x21,0x9F,0x50,0x1E,0x90,0x88,0xC1,0xE0,0xFF,0xEE,0xC3,0x9F,
-
0x74,0xA0,0x50,0x08,0x12,0x24,0xBA,0x74,0x01,0xF0,0x80,0x05,0x12,0x24,0xBA,0xE4,
-
0xF0,0x12,0x25,0x4B,0x80,0xD7,0x75,0x9E,0x55,0x12,0x25,0x30,0xD3,0x9F,0x40,0x03,
-
0x02,0x0C,0x61,0x90,0x88,0xC0,0xE0,0x9F,0x40,0x03,0x02,0x0C,0x61,0x30,0x1D,0x03,
-
0x02,0x0C,0x61,0xE0,0x94,0x00,0x50,0x03,0x02,0x0B,0x53,0x90,0x88,0xC1,0xE0,0xD3,
-
0x94,0x00,0x50,0x03,0x02,0x0B,0x53,0xE0,0xFF,0x90,0x88,0xC0,0xE0,0xD3,0x9F,0x40,
-
0x03,0x02,0x07,0x04,0x90,0x88,0xC0,0x12,0x25,0xFD,0x90,0x88,0xC1,0xE0,0xFE,0xEF,
-
0x6E,0x70,0x03,0x02,0x03,0xBF,0x75,0x9E,0x55,0xE4,0x90,0x13,0x8B,0xF0,0x12,0x21,
-
0x0D,0x50,0x09,0x12,0x23,0x64,0xE4,0x12,0x21,0x31,0x80,0xF2,0xC2,0x1C,0xE4,0x90,
-
0x13,0x8B,0xF0,0x90,0x88,0xC0,0x12,0x21,0x10,0x50,0x36,0x74,0x95,0x2E,0x12,0x20,
-
0xFA,0x12,0x25,0x33,0xFE,0xEF,0xB5,0x06,0x04,0xD2,0x1C,0x80,0x24,0x74,0x9A,0x2F,
-
0x12,0x23,0x67,0xE0,0x70,0x12,0x90,0x13,0x8B,0xE0,0x12,0x20,0xF8,0xE0,0x24,0x9A,
-
0x12,0x23,0x67,0x74,0x01,0xF0,0x80,0x04,0xD2,0x1C,0x80,0x05,0x12,0x21,0x32,0x80,
-
0xC2,0x90,0x13,0xA7,0x12,0x41,0x6A,0x00,0x00,0x00,0x00,0x20,0x1C,0x56,0xE4,0x90,
-
0x13,0x8B,0xF0,0x90,0x88,0xC0,0x12,0x21,0x10,0x50,0x26,0x12,0x20,0xF6,0x12,0x22,
-
0x03,0xEE,0x12,0x1F,0x97,0xC0,0x83,0xC0,0x82,0x90,0x13,0x8B,0xE0,0x12,0x20,0xF8,
-
0xE0,0xD0,0x82,0xD0,0x83,0x12,0x1E,0xC3,0x12,0x24,0x5B,0x12,0x21,0x32,0x02,0x03,
-
0x33,0x12,0x22,0xEC,0xA3,0x12,0x22,0x14,0xC3,0x12,0x41,0x3A,0x50,0x16,0x90,0x13,
-
0xA7,0x12,0x22,0xEF,0x12,0x26,0x28,0x90,0x88,0xC0,0x12,0x21,0x10,0x50,0x05,0x12,
-
0x21,0x1A,0x80,0xF3,0xC2,0x1B,0xE4,0x90,0x13,0x8B,0xF0,0x90,0x88,0xC0,0xE0,0x14,
-
0x12,0x21,0x11,0x50,0x1B,0x74,0x95,0x2E,0x12,0x20,0xFA,0x12,0x25,0x33,0xFE,0xEF,
-
0xB5,0x06,0x08,0x12,0x20,0xF3,0x12,0x24,0xC3,0x80,0x05,0x12,0x21,0x32,0x80,0xDB,
-
0x30,0x1B,0x03,0x02,0x02,0xB4,0x90,0x13,0x95,0xE0,0x04,0xF0,0x02,0x02,0xB4,0x90,
-
0x88,0xC0,0x12,0x26,0xB7,0x12,0x26,0xE9,0xFE,0xC3,0x9F,0x40,0x03,0x02,0x0B,0x53,
-
0xE0,0xFF,0x12,0x25,0x41,0xE0,0x90,0x13,0x93,0xF0,0x74,0xB0,0x2F,0x12,0x25,0xE0,
-
0xE0,0x90,0x13,0x92,0xF0,0xC2,0x12,0xC2,0x14,0xEE,0x12,0x1E,0x98,0x7B,0xF4,0x12,
-
0x25,0x52,0x12,0x1F,0x93,0xC0,0x83,0xC0,0x82,0x90,0x13,0x92,0xE0,0xD0,0x82,0xD0,
-
0x83,0x12,0x24,0x11,0x40,0x03,0x02,0x06,0xFE,0x12,0x1F,0x93,0xC0,0x83,0xC0,0x82,
-
0x90,0x13,0x92,0xE0,0xD0,0x82,0xD0,0x83,0x12,0x1E,0xC3,0x12,0x23,0x2C,0x50,0x1C,
-
0x90,0x13,0x92,0x12,0x1E,0x60,0x12,0x1D,0xC5,0x12,0x26,0x0A,0x12,0x1D,0xA7,0xFD,
-
0xEE,0x12,0x1E,0x87,0xEC,0xF0,0xA3,0xED,0xF0,0x02,0x05,0x47,0x12,0x1F,0x93,0xC0,
-
0x83,0xC0,0x82,0x90,0x13,0x92,0xE0,0xD0,0x82,0xD0,0x83,0x12,0x1E,0xC3,0x7B,0xD0,
-
0x7A,0x07,0x12,0x23,0x30,0x50,0x52,0x90,0x13,0x92,0xE0,0xFD,0x12,0x1E,0x62,0x12,
-
0x20,0x59,0xD5,0x82,0x02,0x15,0x83,0x12,0x23,0x93,0x12,0x1E,0x1D,0x12,0x1F,0x0C,
-
0xFE,0xED,0x12,0x1E,0x62,0x12,0x1F,0x0A,0xFE,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,
-
0x13,0xD8,0xF9,0xFF,0xEC,0x12,0x1E,0x1D,0x12,0x20,0x44,0xD5,0x82,0x02,0x15,0x83,
-
0x12,0x23,0x93,0x12,0x1E,0x87,0x12,0x1E,0xF5,0xFE,0xEF,0x78,0x02,0xCE,0xC3,0x13,
-
0xCE,0x13,0xD8,0xF9,0xFF,0xEC,0x02,0x05,0x3F,0x12,0x1F,0x93,0xC0,0x83,0xC0,0x82,
-
0x90,0x13,0x92,0xE0,0xD0,0x82,0xD0,0x83,0x12,0x1E,0xC3,0xE4,0x7B,0xE8,0x7A,0x03,
-
0x12,0x23,0x31,0x50,0x1A,0x12,0x1D,0xE5,0x12,0x23,0xAC,0xFD,0x12,0x1E,0x87,0xE0,
-
0xFE,0xA3,0xE0,0xFF,0xEC,0x12,0x1E,0xFF,0x12,0x25,0x20,0xED,0x02,0x05,0x3F,0x90,
-
0x13,0x93,0xE0,0xFD,0x12,0x1E,0x1D,0x12,0x20,0x5B,0xD5,0x82,0x02,0x15,0x83,0x12,
-
0x26,0xC2,0x12,0x1E,0x62,0x12,0x1F,0x0A,0xFE,0x12,0x1E,0x1C,0x12,0x1F,0x0C,0xFE,
-
0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,0xF9,0x12,0x26,0x11,0x12,0x1E,0x1D,
-
0xEE,0xF0,0xA3,0xEF,0xF0,0x12,0x1E,0x86,0x12,0x20,0x5B,0xD5,0x82,0x02,0x15,0x83,
-
0x15,0x82,0xE0,0x33,0xFE,0xEC,0x12,0x1D,0xBA,0x12,0x26,0xCD,0x12,0x1E,0x87,0x12,
-
0x1F,0x0C,0xFE,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,0xF9,0xFF,0xED,0x12,
-
0x1E,0x87,0xEE,0xF0,0xA3,0xEF,0xF0,0x90,0x13,0x93,0xE0,0xFF,0x12,0x1E,0xE9,0x12,
-
0x1D,0xC5,0xFD,0xEF,0x12,0x1E,0x1D,0x12,0x23,0x9E,0x12,0x4E,0x00,0x12,0x23,0xA9,
-
0xFF,0x12,0x1F,0xC7,0x12,0x1D,0xC5,0xFD,0xEF,0x12,0x1E,0x87,0x12,0x23,0x9E,0x12,
-
0x4E,0x00,0x12,0x20,0xC9,0x40,0x29,0x12,0x1F,0x84,0xE0,0xD3,0x94,0x04,0x40,0x0A,
-
0x74,0x5B,0x2F,0x12,0x1F,0x8B,0xE0,0x24,0xFC,0xF0,0x12,0x1F,0x84,0xE0,0xC3,0x94,
-
0x01,0x50,0x08,0x74,0x5B,0x2F,0x12,0x1F,0x8B,0xE4,0xF0,0x12,0x23,0x55,0x80,0x3F,
-
0x12,0x1F,0x84,0xE0,0x04,0xF0,0x74,0x5B,0x2F,0x12,0x1F,0x8B,0xE0,0xD3,0x94,0x01,
-
0x40,0x11,0x90,0x13,0x93,0xE0,0x12,0x1F,0x89,0x74,0x01,0xF0,0x90,0xF1,0x0A,0x04,
-
0xF0,0x80,0x18,0x12,0x26,0x34,0x50,0x05,0x12,0x26,0xF3,0x40,0x06,0x30,0x06,0x03,
-
0x12,0x23,0x55,0x12,0x26,0x3C,0x40,0x03,0x12,0x23,0x55,0xC2,0x12,0xC2,0x14,0x12,
-
0x1F,0x84,0x12,0x25,0x61,0x40,0x0F,0xD2,0x12,0xD2,0x14,0x74,0x51,0x2F,0x12,0x21,
-
0xFB,0x74,0x01,0xF0,0x80,0x04,0xC2,0x12,0xC2,0x14,0x12,0x21,0xF4,0xE0,0xB4,0x01,
-
0x09,0xEF,0x12,0x1E,0x98,0x12,0x26,0x44,0x80,0x0A,0x90,0x13,0x93,0xE0,0x12,0x1E,
-
0x98,0x12,0x24,0x6D,0x90,0x13,0x93,0xE0,0x12,0x21,0xF9,0xE0,0xB4,0x01,0x13,0xD3,
-
0xEB,0x94,0x01,0xEA,0x94,0x00,0x40,0x06,0xD2,0x12,0xD2,0x14,0x80,0x04,0xC2,0x12,
-
0xC2,0x14,0x90,0x13,0x93,0xE0,0xFF,0x24,0xE5,0x12,0x1E,0xBB,0x12,0x21,0xBC,0xE0,
-
0x64,0x01,0x70,0x58,0x12,0x20,0x63,0xE0,0xC3,0x9E,0x50,0x1B,0xC2,0x10,0x12,0x1F,
-
0x55,0x12,0x23,0x0C,0x50,0x09,0x12,0x20,0x78,0xE0,0x04,0xF0,0x02,0x06,0x9E,0x12,
-
0x20,0x78,0xE4,0xF0,0x02,0x06,0x9E,0x90,0x13,0x93,0xE0,0xFF,0x24,0x70,0x12,0x21,
-
0xC2,0xE4,0xF0,0x74,0x7A,0x2F,0x12,0x20,0x7A,0xE4,0xF0,0x12,0x22,0x80,0x12,0x20,
-
0x30,0x12,0x26,0x11,0x12,0x1E,0x1D,0x12,0x1E,0x6E,0xEE,0xF0,0xA3,0xEF,0xF0,0xD2,
-
0x10,0x74,0xE5,0x2D,0x12,0x1E,0xBB,0x74,0x01,0xF0,0x80,0x02,0xD2,0x10,0x30,0x01,
-
0x16,0x90,0x13,0x92,0x12,0x1E,0x60,0x12,0x1D,0xC5,0x12,0x26,0x0A,0x12,0x1E,0xE9,
-
0x12,0x1D,0xB2,0xFD,0xEE,0x80,0x2C,0x30,0x12,0x2F,0x30,0x14,0x2C,0x30,0x10,0x29,
-
0x12,0x23,0xC1,0x40,0x03,0x12,0x26,0xFA,0x12,0x23,0xCF,0x40,0x03,0x12,0x27,0x01,
-
0x12,0x22,0xFB,0x12,0x1D,0xC5,0xFD,0xEF,0x12,0x1E,0xE9,0x12,0x21,0xDC,0x12,0x1D,
-
0xC5,0xFD,0xEF,0x12,0x1F,0xC7,0x12,0x25,0x71,0x90,0x13,0x92,0x12,0x1E,0x60,0x12,
-
0x1D,0xC5,0x12,0x21,0xCA,0x12,0x1D,0xB2,0x12,0x1F,0x15,0x12,0x21,0x64,0x12,0x21,
-
0x32,0x02,0x03,0xC5,0x90,0x88,0xC1,0x12,0x25,0xFD,0x90,0x88,0xC0,0xE0,0xFE,0xEF,
-
0x6E,0x70,0x03,0x02,0x08,0x0A,0x75,0x9E,0x55,0xE4,0x90,0x13,0x8B,0xF0,0x90,0x88,
-
0xC0,0x12,0x21,0x10,0x50,0x09,0x12,0x23,0x64,0xE4,0x12,0x21,0x31,0x80,0xEF,0xC2,
-
0x1C,0xE4,0x90,0x13,0x8B,0xF0,0x12,0x21,0x0D,0x50,0x36,0x74,0x95,0x2E,0x12,0x20,
-
0xFA,0x12,0x26,0xE2,0xFE,0xEF,0xB5,0x06,0x04,0xD2,0x1C,0x80,0x24,0x74,0x9A,0x2F,
-
0x12,0x23,0x67,0xE0,0x70,0x12,0x90,0x13,0x8B,0xE0,0x12,0x20,0xF8,0xE0,0x24,0x9A,
-
0x12,0x23,0x67,0x74,0x01,0xF0,0x80,0x04,0xD2,0x1C,0x80,0x05,0x12,0x21,0x32,0x80,
-
0xC5,0x90,0x13,0xA7,0x12,0x41,0x6A,0x00,0x00,0x00,0x00,0x20,0x1C,0x51,0xE4,0x90,
-
0x13,0x8B,0xF0,0x12,0x21,0x0D,0x50,0x27,0x12,0x20,0xF6,0x12,0x22,0x03,0x74,0x95,
-
0x2E,0x12,0x20,0xFA,0x12,0x1F,0x96,0xC0,0x83,0xC0,0x82,0x90,0x13,0x8B,0xE0,0xD0,
-
0x82,0xD0,0x83,0x12,0x1E,0xC3,0x12,0x24,0x5B,0x12,0x21,0x32,0x02,0x07,0x83,0x12,
-
0x22,0xEC,0xA3,0x12,0x22,0x14,0xC3,0x12,0x41,0x3A,0x50,0x13,0x90,0x13,0xA7,0x12,
-
0x22,0xEF,0x12,0x26,0x28,0x12,0x21,0x0D,0x50,0x05,0x12,0x21,0x1A,0x80,0xF6,0xC2,
-
0x1B,0xE4,0x90,0x13,0x8B,0xF0,0x90,0x88,0xC1,0xE0,0x14,0x12,0x21,0x11,0x50,0x1B,
-
0x74,0x95,0x2E,0x12,0x20,0xFA,0x12,0x26,0xE2,0xFE,0xEF,0xB5,0x06,0x08,0x12,0x20,
-
0xF3,0x12,0x24,0xC3,0x80,0x05,0x12,0x21,0x32,0x80,0xDB,0x30,0x1B,0x03,0x02,0x07,
-
0x04,0x90,0x13,0x95,0xE0,0x04,0xF0,0x02,0x07,0x04,0x90,0x88,0xC1,0x12,0x26,0xB7,
-
0x12,0x26,0xE9,0xC3,0x9F,0x40,0x03,0x02,0x0B,0x53,0xE0,0xFF,0x12,0x25,0xDE,0xE0,
-
0x12,0x25,0x41,0xE0,0x90,0x13,0x93,0xF0,0x90,0x13,0x92,0xEF,0xF0,0xC2,0x12,0xC2,
-
0x14,0x12,0x1E,0x98,0x7B,0x90,0x12,0x25,0x52,0x90,0x13,0x8B,0xE0,0x12,0x25,0xDE,
-
0x12,0x1F,0x96,0xC0,0x83,0xC0,0x82,0x90,0x13,0x8B,0xE0,0xD0,0x82,0xD0,0x83,0x12,
-
0x24,0x11,0x40,0x03,0x02,0x0B,0x4D,0x12,0x1F,0x93,0xC0,0x83,0xC0,0x82,0x90,0x13,
-
0x92,0xE0,0xD0,0x82,0xD0,0x83,0x12,0x1E,0xC3,0x12,0x23,0x2C,0x50,0x1C,0x90,0x13,
-
0x92,0x12,0x1E,0x60,0x12,0x1D,0xC5,0x12,0x26,0x0A,0x12,0x1D,0xA7,0xFD,0xEE,0x12,
-
0x1E,0x87,0xEC,0xF0,0xA3,0xED,0xF0,0x02,0x09,0x96,0x12,0x1F,0x93,0xC0,0x83,0xC0,
-
0x82,0x90,0x13,0x92,0xE0,0xD0,0x82,0xD0,0x83,0x12,0x1E,0xC3,0xE4,0x7B,0xD0,0x7A,
-
0x07,0x12,0x23,0x31,0x50,0x52,0x90,0x13,0x92,0xE0,0xFD,0x12,0x1E,0x62,0x12,0x20,
-
0x59,0xD5,0x82,0x02,0x15,0x83,0x12,0x23,0x93,0x12,0x1E,0x1D,0x12,0x1F,0x0C,0xFE,
-
0xED,0x12,0x1E,0x62,0x12,0x1F,0x0A,0xFE,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,
-
0xD8,0xF9,0xFF,0xEC,0x12,0x1E,0x1D,0x12,0x20,0x44,0xD5,0x82,0x02,0x15,0x83,0x12,
-
0x23,0x93,0x12,0x1E,0x87,0x12,0x1E,0xF5,0xFE,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,
-
0x13,0xD8,0xF9,0xFF,0xEC,0x02,0x09,0x8E,0x12,0x1F,0x93,0xC0,0x83,0xC0,0x82,0x90,
-
0x13,0x92,0xE0,0xD0,0x82,0xD0,0x83,0x12,0x1E,0xC3,0xE4,0x7B,0xE8,0x7A,0x03,0x12,
-
0x23,0x31,0x50,0x1A,0x12,0x1D,0xE5,0x12,0x23,0xAC,0xFD,0x12,0x1E,0x87,0xE0,0xFE,
-
0xA3,0xE0,0xFF,0xEC,0x12,0x1E,0xFF,0x12,0x25,0x20,0xED,0x02,0x09,0x8E,0x90,0x13,
-
0x93,0xE0,0xFD,0x12,0x1E,0x1D,0x12,0x20,0x5B,0xD5,0x82,0x02,0x15,0x83,0x12,0x26,
-
0xC2,0x12,0x1E,0x62,0x12,0x1F,0x0A,0xFE,0x12,0x1E,0x1C,0x12,0x1F,0x0C,0xFE,0xEF,
-
0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,0xF9,0x12,0x26,0x11,0x12,0x1E,0x1D,0xEE,
-
0xF0,0xA3,0xEF,0xF0,0x12,0x1E,0x86,0x12,0x20,0x5B,0xD5,0x82,0x02,0x15,0x83,0x15,
-
0x82,0xE0,0x33,0xFE,0xEC,0x12,0x1D,0xBA,0x12,0x26,0xCD,0x12,0x1E,0x87,0x12,0x1F,
-
0x0C,0xFE,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,0xF9,0xFF,0xED,0x12,0x1E,
-
0x87,0xEE,0xF0,0xA3,0xEF,0xF0,0x90,0x13,0x93,0xE0,0xFF,0x12,0x1E,0xE9,0x12,0x1D,
-
0xC5,0xFD,0xEF,0x12,0x1E,0x1D,0x12,0x23,0x9E,0x12,0x4E,0x00,0x12,0x23,0xA9,0xFF,
-
0x12,0x1F,0xC7,0x12,0x1D,0xC5,0xFD,0xEF,0x12,0x1E,0x87,0x12,0x23,0x9E,0x12,0x4E,
-
0x00,0x12,0x20,0xC9,0x40,0x29,0x12,0x1F,0x84,0xE0,0xD3,0x94,0x04,0x40,0x0A,0x74,
-
0x5B,0x2F,0x12,0x1F,0x8B,0xE0,0x24,0xFC,0xF0,0x12,0x1F,0x84,0xE0,0xC3,0x94,0x01,
-
0x50,0x08,0x74,0x5B,0x2F,0x12,0x1F,0x8B,0xE4,0xF0,0x12,0x23,0x55,0x80,0x3F,0x12,
-
0x1F,0x84,0xE0,0x04,0xF0,0x74,0x5B,0x2F,0x12,0x1F,0x8B,0xE0,0xD3,0x94,0x01,0x40,
-
0x11,0x90,0x13,0x93,0xE0,0x12,0x1F,0x89,0x74,0x01,0xF0,0x90,0xF1,0x0A,0x04,0xF0,
-
0x80,0x18,0x12,0x26,0x34,0x50,0x05,0x12,0x26,0xF3,0x40,0x06,0x30,0x06,0x03,0x12,
-
0x23,0x55,0x12,0x26,0x3C,0x40,0x03,0x12,0x23,0x55,0xC2,0x12,0xC2,0x14,0x12,0x1F,
-
0x84,0x12,0x25,0x61,0x40,0x0F,0xD2,0x12,0xD2,0x14,0x74,0x51,0x2F,0x12,0x21,0xFB,
-
0x74,0x01,0xF0,0x80,0x04,0xC2,0x12,0xC2,0x14,0x12,0x21,0xF4,0xE0,0xB4,0x01,0x09,
-
0xEF,0x12,0x1E,0x98,0x12,0x26,0x44,0x80,0x0A,0x90,0x13,0x93,0xE0,0x12,0x1E,0x98,
-
0x12,0x24,0x6D,0x90,0x13,0x93,0xE0,0x12,0x21,0xF9,0xE0,0xB4,0x01,0x13,0xD3,0xEB,
-
0x94,0x01,0xEA,0x94,0x00,0x40,0x06,0xD2,0x12,0xD2,0x14,0x80,0x04,0xC2,0x12,0xC2,
-
0x14,0x90,0x13,0x93,0xE0,0xFF,0x24,0xE5,0x12,0x1E,0xBB,0x12,0x21,0xBC,0xE0,0x64,
-
0x01,0x70,0x58,0x12,0x20,0x63,0xE0,0xC3,0x9E,0x50,0x1B,0xC2,0x10,0x12,0x1F,0x55,
-
0x12,0x23,0x0C,0x50,0x09,0x12,0x20,0x78,0xE0,0x04,0xF0,0x02,0x0A,0xED,0x12,0x20,
-
0x78,0xE4,0xF0,0x02,0x0A,0xED,0x90,0x13,0x93,0xE0,0xFF,0x24,0x70,0x12,0x21,0xC2,
-
0xE4,0xF0,0x74,0x7A,0x2F,0x12,0x20,0x7A,0xE4,0xF0,0xD2,0x10,0x12,0x22,0x80,0x12,
-
0x20,0x30,0x12,0x26,0x11,0x12,0x1E,0x1D,0x12,0x1E,0x6E,0xEE,0xF0,0xA3,0xEF,0xF0,
-
0x74,0xE5,0x2D,0x12,0x1E,0xBB,0x74,0x01,0xF0,0x80,0x02,0xD2,0x10,0x30,0x01,0x16,
-
0x90,0x13,0x92,0x12,0x1E,0x60,0x12,0x1D,0xC5,0x12,0x26,0x0A,0x12,0x1E,0xE9,0x12,
-
0x1D,0xB2,0xFD,0xEE,0x80,0x2C,0x30,0x12,0x2F,0x30,0x14,0x2C,0x30,0x10,0x29,0x12,
-
0x23,0xC1,0x40,0x03,0x12,0x26,0xFA,0x12,0x23,0xCF,0x40,0x03,0x12,0x27,0x01,0x12,
-
0x22,0xFB,0x12,0x1D,0xC5,0xFD,0xEF,0x12,0x1E,0xE9,0x12,0x21,0xDC,0x12,0x1D,0xC5,
-
0xFD,0xEF,0x12,0x1F,0xC7,0x12,0x25,0x71,0x90,0x13,0x92,0x12,0x1E,0x60,0x12,0x1D,
-
0xC5,0x12,0x21,0xCA,0x12,0x1D,0xB2,0x12,0x1F,0x15,0x12,0x21,0x64,0x12,0x21,0x32,
-
0x02,0x08,0x10,0x12,0x23,0x5C,0x50,0x45,0x90,0x88,0xC0,0xE0,0x94,0x00,0x40,0x3D,
-
0xE4,0x90,0x13,0x8C,0xF0,0x12,0x23,0x37,0x50,0x33,0x74,0xE5,0x2F,0x12,0x1E,0xBB,
-
0xE0,0x64,0x04,0x70,0x22,0x12,0x23,0x5C,0x50,0x1D,0x12,0x25,0x3A,0x12,0x1E,0xBB,
-
0x74,0x03,0xF0,0xEF,0x12,0x1E,0x98,0x12,0x21,0x39,0x74,0x7A,0x2F,0x12,0x20,0x7A,
-
0xE4,0xF0,0x12,0x21,0xBF,0xE4,0xF0,0x12,0x24,0x54,0x02,0x0B,0x65,0x12,0x23,0x5C,
-
0x40,0x03,0x02,0x12,0x80,0x90,0x88,0xC1,0xE0,0x94,0x00,0x50,0x03,0x02,0x12,0x80,
-
0xE4,0x90,0x13,0x8D,0xF0,0x90,0x88,0xB0,0x12,0x26,0x1F,0x9F,0x40,0x03,0x02,0x12,
-
0x80,0x74,0xA0,0x12,0x24,0xBA,0xE0,0x70,0x03,0x02,0x0C,0x5B,0xE4,0x90,0x13,0x8C,
-
0xF0,0x12,0x23,0x37,0x40,0x03,0x02,0x0C,0x5B,0x74,0xE5,0x2F,0x12,0x1E,0xBB,0xE0,
-
0x70,0x73,0x12,0x23,0x5C,0x50,0x6E,0x12,0x1D,0x3B,0xFD,0xEE,0x12,0x1E,0x87,0xEC,
-
0xF0,0xA3,0xED,0x12,0x1E,0x5C,0x12,0x1D,0xC5,0xFD,0xEE,0x12,0x1E,0xE9,0x12,0x1D,
-
0xB2,0xFD,0xEE,0x12,0x1F,0xC7,0xF5,0x83,0x12,0x22,0x8D,0xE0,0x90,0x13,0x8C,0x12,
-
0x1F,0x3B,0xEF,0xF0,0x74,0x70,0x2D,0x12,0x1E,0x53,0x12,0x1D,0xC5,0xFD,0x90,0x13,
-
0x8C,0xE0,0xFE,0x12,0x22,0x81,0x12,0x1D,0xB2,0x12,0x24,0x26,0x12,0x1E,0xB1,0x74,
-
0x01,0xF0,0xEE,0x12,0x1E,0x98,0x12,0x24,0x6D,0x90,0x13,0x8D,0xE0,0x24,0xA0,0x12,
-
0x24,0xBB,0xE4,0xF0,0x74,0xD1,0x2E,0x12,0x21,0x5A,0x12,0x21,0x81,0x90,0x13,0x90,
-
0xE0,0x04,0xF0,0x80,0x06,0x12,0x24,0x54,0x02,0x0B,0xD1,0x12,0x25,0x4B,0x02,0x0B,
-
0xB5,0xE4,0x90,0x88,0xC0,0xF0,0xF5,0xDC,0xF5,0xDD,0xF5,0xDE,0x90,0x13,0x8C,0xF0,
-
0x12,0x23,0x37,0x50,0x41,0x74,0xE5,0x2F,0x12,0x1E,0xBB,0xE0,0x64,0x01,0x60,0x15,
-
0x12,0x25,0x3A,0x12,0x1E,0xBB,0xE0,0x64,0x02,0x60,0x0A,0x74,0xE5,0x2F,0x12,0x1E,
-
0xBB,0xE0,0xB4,0x04,0x14,0x90,0x88,0xC0,0xE0,0x04,0xF0,0x90,0x13,0x8C,0xE0,0xFF,
-
0x7B,0x01,0xE4,0xFD,0x12,0x2C,0x9C,0x80,0x08,0x12,0x25,0x3A,0x12,0x1E,0xBB,0xE4,
-
0xF0,0x12,0x24,0x54,0x80,0xBA,0xE4,0xF5,0xD9,0xF5,0xDA,0xF5,0xDB,0x90,0x13,0x8D,
-
0xF0,0x90,0x88,0xC1,0x12,0x27,0x08,0x50,0x0B,0xE4,0xFB,0xFD,0x12,0x2C,0x9C,0x12,
-
0x25,0x4B,0x80,0xED,0x90,0x88,0xC0,0xE0,0xFF,0x90,0x88,0xC1,0xE0,0xC3,0x9F,0x50,
-
0x02,0x80,0x03,0x90,0x88,0xC0,0xE0,0x90,0x13,0x94,0xF0,0xE4,0x90,0x13,0x8E,0xF0,
-
0x90,0x13,0x94,0xE0,0xFF,0x90,0x13,0x8E,0xE0,0xC3,0x9F,0x40,0x03,0x02,0x11,0x8C,
-
0xC2,0x12,0xC2,0x14,0xD2,0xB4,0x20,0xB4,0x06,0x30,0x11,0x03,0x20,0xDD,0x05,0x75,
-
0x9E,0x55,0x80,0xF2,0xC2,0xDD,0xC2,0x11,0xAF,0xE2,0xAD,0xE3,0x12,0x22,0x79,0xFF,
-
0xEC,0x3E,0xAD,0x07,0xFC,0x90,0xF2,0xB0,0xE0,0xD3,0x94,0x06,0x50,0x32,0x12,0x1E,
-
0x95,0xE0,0xFE,0xA3,0xE0,0xFF,0xBE,0x04,0x10,0xBF,0xB0,0x0D,0x12,0x1E,0x95,0x74,
-
0x2E,0xF0,0xA3,0x74,0xE0,0xF0,0x02,0x0D,0x8B,0x12,0x1E,0x95,0xE0,0xFE,0xA3,0xE0,
-
0x64,0x40,0x4E,0x70,0x36,0x12,0x1E,0x95,0xE4,0xF0,0xA3,0x74,0xC0,0xF0,0x80,0x2B,
-
0x12,0x1E,0x95,0xE0,0xFE,0xA3,0xE0,0xFF,0xBE,0x04,0x0E,0xBF,0xB0,0x0B,0x12,0x1E,
-
0x95,0xE4,0xF0,0xA3,0x74,0xF0,0xF0,0x80,0x12,0x12,0x1E,0x95,0xE0,0xFE,0xA3,0xE0,
-
0x64,0x40,0x4E,0x70,0x06,0x12,0x1E,0x95,0x12,0x24,0x6D,0x12,0x1E,0x95,0xE0,0xFE,
-
0xA3,0xE0,0xD3,0x9D,0xEE,0x9C,0x50,0x03,0x02,0x11,0x8C,0xD3,0xED,0x94,0xC8,0xEC,
-
0x94,0x00,0x40,0x16,0xAF,0xDF,0xEF,0x12,0x1E,0x62,0x12,0x20,0x30,0xFF,0xAB,0xE1,
-
0xEB,0x12,0x1E,0x1D,0x12,0x20,0x1D,0x02,0x0E,0x2B,0xD3,0xED,0x94,0x64,0xEC,0x94,
-
0x00,0x40,0x6F,0xAF,0xDF,0xEF,0x12,0x1E,0x62,0x12,0x20,0x59,0xD5,0x82,0x02,0x15,
-
0x83,0x15,0x82,0xE0,0x33,0xFE,0xAB,0xDF,0xEB,0x12,0x1E,0x62,0x12,0x1F,0x0A,0xFE,
-
0xAB,0xE1,0xEB,0x12,0x1E,0x1D,0x12,0x1F,0x0C,0xFE,0xEF,0x78,0x02,0xCE,0xC3,0x13,
-
0xCE,0x13,0xD8,0xF9,0xFF,0xAB,0xE1,0xEB,0x12,0x1E,0x1D,0xEE,0xF0,0xA3,0xEF,0xF0,
-
0xAF,0xDF,0xEF,0x12,0x20,0x4E,0xD5,0x82,0x02,0x15,0x83,0x15,0x82,0xE0,0x33,0xFE,
-
0xAB,0xDF,0xEB,0x12,0x1E,0xFF,0xFE,0xAB,0xE1,0xEB,0x12,0x1E,0x87,0x12,0x1F,0x0C,
-
0xFE,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,0xF9,0xFF,0xAB,0xE1,0xEB,0x02,
-
0x0E,0xE6,0xAE,0x04,0xAF,0x05,0xD3,0xED,0x94,0x32,0xEC,0x94,0x00,0x40,0x2D,0xAF,
-
0xE1,0xEF,0x12,0x1E,0x1D,0x12,0x26,0x4C,0x12,0x1E,0x62,0x12,0x1D,0xC5,0x12,0x25,
-
0x1C,0xAD,0xE1,0xED,0x12,0x1E,0x1D,0x12,0x24,0x74,0x12,0x1E,0x87,0x12,0x26,0x4C,
-
0x12,0x1D,0xBA,0x12,0x25,0x1C,0xAD,0xE1,0xED,0x02,0x0E,0xE6,0xAF,0xE1,0xEF,0x12,
-
0x1E,0x1D,0x12,0x20,0x5B,0xD5,0x82,0x02,0x15,0x83,0x15,0x82,0xE0,0x33,0xFE,0xAD,
-
0xE1,0xED,0x12,0x23,0x00,0x12,0x1D,0xC5,0x2F,0xFF,0xEC,0x3E,0xFE,0xAD,0xDF,0xED,
-
0x12,0x1E,0x62,0x12,0x1D,0xC5,0x2F,0xFF,0xEC,0x3E,0xFE,0xEF,0x78,0x02,0xCE,0xC3,
-
0x13,0xCE,0x13,0xD8,0xF9,0xFF,0xAD,0xE1,0xED,0x12,0x1E,0x1D,0x12,0x24,0x74,0x12,
-
0x1E,0x87,0x12,0x20,0x5B,0xD5,0x82,0x02,0x15,0x83,0x15,0x82,0xE0,0x33,0xFE,0xAD,
-
0xE1,0xED,0x12,0x21,0xE8,0x12,0x1D,0xC5,0x2F,0xFF,0xEC,0x3E,0xFE,0xAD,0xDF,0xED,
-
0x12,0x1D,0xBA,0x2F,0xFF,0xEC,0x3E,0xFE,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,
-
0xD8,0xF9,0xFF,0xAD,0xE1,0xED,0x12,0x1E,0x87,0xEE,0xF0,0xA3,0xEF,0xF0,0xAF,0xE1,
-
0xEF,0x12,0x1E,0xE9,0x12,0x20,0x30,0xFF,0xAD,0xE1,0xED,0x12,0x23,0x00,0x12,0x1D,
-
0xC5,0x12,0x25,0x79,0x12,0x4E,0x00,0x90,0x13,0xD9,0x12,0x24,0x74,0x12,0x1F,0xC7,
-
0x12,0x20,0x30,0xFF,0xAD,0xE1,0xED,0x12,0x21,0xE8,0x12,0x1D,0xC5,0x12,0x25,0x79,
-
0x12,0x4E,0x00,0x12,0x20,0xC9,0x40,0x3B,0xD2,0x12,0xD2,0x14,0xAF,0xE1,0x74,0x5B,
-
0x2F,0x12,0x1F,0x8B,0xE0,0xD3,0x94,0x04,0x40,0x0C,0xAF,0xE1,0x74,0x5B,0x2F,0x12,
-
0x1F,0x8B,0xE0,0x24,0xFC,0xF0,0xAF,0xE1,0x74,0x5B,0x2F,0x12,0x1F,0x8B,0xE0,0xC3,
-
0x94,0x01,0x50,0x0A,0xAF,0xE1,0x74,0x5B,0x2F,0x12,0x1F,0x8B,0xE4,0xF0,0x12,0x23,
-
0x55,0x80,0x47,0xAF,0xE1,0x74,0x5B,0x2F,0x12,0x1F,0x8B,0xE0,0x04,0xF0,0xAF,0xE1,
-
0x74,0x5B,0x2F,0x12,0x1F,0x8B,0xE0,0xD3,0x94,0x01,0x40,0x12,0xAF,0xE1,0x74,0x5B,
-
0x2F,0x12,0x1F,0x8B,0x74,0x01,0xF0,0x90,0xF1,0x0A,0x04,0xF0,0x80,0x18,0x12,0x26,
-
0x34,0x50,0x05,0x12,0x26,0xF3,0x40,0x06,0x30,0x06,0x03,0x12,0x23,0x55,0x12,0x26,
-
0x3C,0x40,0x03,0x12,0x23,0x55,0xC2,0x12,0xC2,0x14,0xAF,0xE1,0x74,0x5B,0x2F,0x12,
-
0x1F,0x8B,0xE0,0xFF,0x90,0x13,0xDD,0xE0,0xFC,0xA3,0xD3,0x12,0x24,0x00,0x40,0x11,
-
0xD2,0x12,0xD2,0x14,0xAF,0xE1,0x74,0x51,0x2F,0x12,0x21,0xFB,0x74,0x01,0xF0,0x80,
-
0x04,0xC2,0x12,0xC2,0x14,0xAF,0xE1,0x74,0x51,0x2F,0x12,0x21,0xFB,0xE0,0xAF,0xE1,
-
0xB4,0x01,0x08,0x12,0x1E,0x97,0x12,0x26,0x44,0x80,0x06,0x12,0x1E,0x97,0x12,0x24,
-
0x6D,0xAF,0xE1,0x74,0x51,0x2F,0x12,0x21,0xFB,0xE0,0xB4,0x01,0x13,0xD3,0xED,0x94,
-
0x01,0xEC,0x94,0x00,0x40,0x06,0xD2,0x12,0xD2,0x14,0x80,0x04,0xC2,0x12,0xC2,0x14,
-
0xAF,0xE1,0x74,0x70,0x2F,0x12,0x21,0xC2,0xE0,0x64,0x01,0x60,0x03,0x02,0x10,0xB4,
-
0xAF,0xDF,0x74,0xBB,0x2F,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0xE0,0xFF,0xAE,0xE1,
-
0x74,0x7A,0x2E,0x12,0x20,0x7A,0xE0,0xC3,0x9F,0x50,0x3C,0xC2,0x10,0xAF,0xE1,0x74,
-
0x3C,0x2F,0x12,0x1F,0x58,0xE0,0xFF,0xAD,0xDF,0xED,0x25,0xE0,0x24,0xC5,0xF5,0x82,
-
0xE4,0x34,0x13,0x12,0x1D,0xC5,0xD3,0x9F,0x74,0x80,0xF8,0xEC,0x64,0x80,0x98,0xAF,
-
0xE1,0x74,0x7A,0x50,0x0A,0x2F,0x12,0x20,0x7A,0xE0,0x04,0xF0,0x02,0x10,0xB6,0x2F,
-
0x12,0x20,0x7A,0xE4,0xF0,0x80,0x3F,0xAF,0xE1,0x74,0x70,0x2F,0x12,0x21,0xC2,0xE4,
-
0xF0,0xAF,0xE1,0x74,0x7A,0x2F,0x12,0x20,0x7A,0xE4,0xF0,0xAF,0xE1,0xEF,0x12,0x22,
-
0x81,0x12,0x20,0x30,0xFF,0xAD,0xE1,0xED,0x12,0x1E,0x1D,0x12,0x24,0x74,0x12,0x24,
-
0x28,0x12,0x20,0x30,0xFF,0xAD,0xE1,0xED,0x12,0x1E,0x87,0xEE,0xF0,0xA3,0xEF,0xF0,
-
0xD2,0x10,0x80,0x02,0xD2,0x10,0x30,0x01,0x1B,0xAF,0xDF,0xEF,0x12,0x1E,0x62,0x12,
-
0x20,0x30,0xFF,0xAD,0xE1,0xED,0x12,0x1E,0xE9,0x12,0x21,0xB4,0xAF,0xDF,0xEF,0x12,
-
0x24,0x48,0x80,0x30,0x30,0x12,0x3A,0x30,0x14,0x37,0x30,0x10,0x34,0x12,0x23,0xC1,
-
0x40,0x03,0x12,0x26,0xFA,0x12,0x23,0xCF,0x40,0x03,0x12,0x27,0x01,0xAF,0xE1,0xEF,
-
0x12,0x1E,0x1D,0xAD,0xE1,0x12,0x26,0x4E,0x12,0x1E,0xE9,0x12,0x21,0xB4,0xAF,0xE1,
-
0xEF,0x12,0x21,0xE8,0x12,0x20,0x30,0xFF,0xAD,0xE1,0xED,0x12,0x1F,0xC7,0x12,0x21,
-
0xB4,0xAF,0xDF,0xEF,0x12,0x1E,0x62,0x12,0x20,0x30,0xFF,0xAD,0xE1,0xED,0x12,0x21,
-
0xD0,0xF5,0x83,0x12,0x20,0x1D,0xFF,0xAD,0xE1,0xED,0x12,0x23,0x49,0x12,0x21,0xB4,
-
0xAF,0xDF,0x74,0x00,0x2F,0x12,0x22,0x99,0xE0,0xFF,0xAE,0xE1,0x74,0x14,0x2E,0xF5,
-
0x82,0xE4,0x34,0x8A,0xF5,0x83,0xEF,0xF0,0xAF,0xDF,0x74,0x28,0x2F,0x12,0x24,0xB2,
-
0xE0,0xFF,0xAE,0xE1,0x74,0x3C,0x2E,0x12,0x1F,0x58,0xEF,0xF0,0xAF,0xE1,0x74,0xE5,
-
0x2F,0x12,0x1E,0xBB,0x74,0x02,0x12,0x21,0x74,0xAF,0xE1,0x74,0xD1,0x2F,0x12,0x21,
-
0x5A,0x7B,0x01,0x7D,0x01,0xAF,0xE1,0x12,0x2C,0x9C,0xE4,0xFB,0x7D,0x01,0xAF,0xDF,
-
0x12,0x2C,0x9C,0x90,0x13,0x8E,0xE0,0x04,0xF0,0x02,0x0C,0xF0,0x12,0x23,0x5C,0x50,
-
0x45,0x90,0x88,0xC0,0xE0,0x94,0x00,0x40,0x3D,0xE4,0x90,0x13,0x8C,0xF0,0x12,0x23,
-
0x37,0x50,0x33,0x7B,0x01,0x12,0x12,0x81,0x60,0x26,0xA3,0xE0,0xC3,0x95,0x1C,0x50,
-
0x1F,0x90,0x13,0x8C,0xE0,0xFF,0x12,0x20,0x78,0xE4,0xF0,0x12,0x21,0xBF,0xE4,0xF0,
-
0x74,0xE5,0x2F,0x12,0x1E,0xBB,0x74,0x03,0xF0,0xEF,0x12,0x1E,0x98,0x12,0x21,0x39,
-
0x12,0x24,0x54,0x02,0x11,0x9E,0x12,0x23,0x5C,0x40,0x03,0x02,0x12,0x80,0x90,0x88,
-
0xC1,0xE0,0x94,0x00,0x50,0x03,0x02,0x12,0x80,0xE4,0x90,0x13,0x8D,0xF0,0x90,0x88,
-
0xB0,0x12,0x27,0x08,0x40,0x03,0x02,0x12,0x80,0xE4,0xFB,0x12,0x12,0x81,0x60,0x7A,
-
0xE4,0x90,0x13,0x8C,0xF0,0x12,0x23,0x37,0x50,0x70,0x74,0xE5,0x2F,0x12,0x1E,0xBB,
-
0xE0,0x70,0x61,0x12,0x23,0x5C,0x50,0x5C,0x12,0x1D,0x3B,0xFD,0xEE,0x12,0x1E,0x87,
-
0x12,0x22,0x8D,0xE0,0xFE,0x90,0x13,0x8C,0x12,0x1F,0x3C,0xEF,0xF0,0x12,0x1E,0x5D,
-
0x12,0x1D,0xC5,0xFD,0x90,0x13,0x8C,0xE0,0xFE,0x12,0x1E,0xE9,0x12,0x1D,0xB2,0x12,
-
0x1E,0xA4,0x74,0x01,0xF0,0xEE,0x12,0x1E,0x98,0x12,0x24,0x6D,0x74,0x70,0x2E,0x12,
-
0x1E,0x53,0x12,0x1D,0xC5,0xFD,0xEE,0x12,0x22,0x81,0x12,0x1D,0xB2,0x12,0x24,0x26,
-
0x12,0x25,0x71,0x74,0xD1,0x2E,0x12,0x21,0x5A,0x12,0x21,0x81,0x90,0x13,0x90,0xE0,
-
0x04,0xF0,0x80,0x06,0x12,0x24,0x54,0x02,0x12,0x05,0x12,0x25,0x4B,0x02,0x11,0xEE,
-
0x22,0x7D,0x02,0x12,0x2C,0x9C,0x90,0x13,0x8F,0xEF,0xF0,0x22,0xE4,0x90,0x13,0x99,
-
0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0x90,0xF1,0x03,0xE0,0xD3,
-
0x94,0x50,0x40,0x0B,0xE0,0x90,0xF2,0xA5,0xF0,0x90,0xF1,0x03,0xE0,0x80,0x06,0x90,
-
0xF2,0xA5,0x74,0xFA,0xF0,0x90,0xF2,0xA4,0xF0,0x90,0xF1,0x03,0xE0,0x90,0xF2,0xB1,
-
0xF0,0xD2,0xB6,0xD2,0xB7,0xD2,0xB2,0x20,0xB2,0x06,0x30,0x11,0x03,0x20,0xDC,0x05,
-
0x75,0x9E,0x55,0x80,0xF2,0xC2,0xDC,0xC2,0x11,0x90,0xF2,0xB0,0xE0,0xD3,0x94,0x00,
-
0x50,0x03,0x02,0x1C,0xF7,0xE4,0x90,0x13,0x8B,0xF0,0xA3,0xF0,0x12,0x23,0xF4,0x40,
-
0x03,0x02,0x1C,0xF7,0x20,0xD9,0x3E,0xED,0x25,0xE0,0xFD,0xEC,0x12,0x22,0xBE,0x12,
-
0x20,0xC2,0x24,0x39,0xF5,0x82,0xE4,0x34,0x80,0xF5,0x83,0xE0,0xFE,0x12,0x22,0xC0,
-
0x12,0x20,0xC2,0x24,0x38,0xF5,0x82,0xE4,0x34,0x80,0x12,0x20,0x96,0x24,0x01,0xF5,
-
0x82,0xE4,0x34,0x80,0xF5,0x83,0xE0,0xFE,0x12,0x20,0xBB,0x24,0x00,0xF5,0x82,0xE4,
-
0x34,0x80,0x02,0x13,0x6B,0x12,0x22,0xB3,0x12,0x20,0xC2,0x24,0xF9,0xF5,0x82,0xE4,
-
0x34,0x80,0xF5,0x83,0xE0,0xFE,0x12,0x22,0xC0,0x12,0x20,0xC2,0x24,0xF8,0xF5,0x82,
-
0xE4,0x34,0x80,0x12,0x20,0x96,0x24,0xC1,0xF5,0x82,0xE4,0x34,0x80,0xF5,0x83,0xE0,
-
0xFE,0x12,0x20,0xBB,0x24,0xC0,0xF5,0x82,0xE4,0x34,0x80,0xF5,0x83,0xE0,0x7C,0x00,
-
0x24,0x00,0xFF,0xEC,0x3E,0xFE,0x7D,0x14,0x12,0x40,0x4A,0x90,0x13,0xA5,0xEE,0xF0,
-
0xA3,0xEF,0xF0,0x90,0x13,0xA5,0xE0,0xFE,0xA3,0xE0,0xFF,0x90,0x13,0xA4,0xE0,0x2F,
-
0xFF,0x90,0x13,0xA3,0xE0,0x3E,0xFE,0xD3,0xEF,0x94,0x28,0xEE,0x94,0x00,0x40,0x34,
-
0xE4,0x90,0x13,0x8B,0xF0,0xA3,0xF0,0x12,0x23,0xF4,0x40,0x03,0x02,0x1C,0xF7,0xED,
-
0x25,0xE0,0xFF,0xEC,0x12,0x1D,0xD7,0xFD,0x12,0x1E,0x47,0x12,0x21,0x88,0x2D,0x12,
-
0x20,0x3C,0xE4,0xF0,0x90,0x13,0x8C,0xE0,0x04,0xF0,0x70,0xDB,0x90,0x13,0x8B,0xE0,
-
0x04,0xF0,0x80,0xD3,0x90,0x13,0xA3,0xE0,0xFE,0xA3,0xE0,0xFF,0x7C,0x00,0x7D,0x05,
-
0x12,0x40,0x4A,0x90,0x13,0xA3,0xEE,0xF0,0xA3,0xEF,0xF0,0x12,0x22,0xF4,0x7C,0x00,
-
0x7D,0x05,0x12,0x40,0x4A,0x90,0x13,0xA5,0xEE,0xF0,0xA3,0xEF,0xF0,0xE4,0x90,0x13,
-
0x93,0xF0,0xA3,0xF0,0x12,0x22,0xB3,0x3C,0xF5,0x83,0xE0,0x75,0xF0,0x1C,0xA4,0xFF,
-
0x74,0x80,0x2D,0xF5,0x82,0x74,0x81,0x3C,0xF5,0x83,0xE0,0x7C,0x00,0x2F,0xFF,0xEC,
-
0x35,0xF0,0xFE,0xEF,0x25,0xE0,0xFF,0xEE,0x33,0xFE,0xA2,0xD9,0xE4,0x33,0x2F,0xFF,
-
0xEC,0x3E,0xAD,0x07,0xFC,0x12,0x1D,0xCC,0xFB,0x12,0x1E,0x47,0x12,0x21,0x88,0x2B,
-
0x12,0x20,0x3C,0xE4,0xF0,0x90,0xF1,0x03,0xE0,0xFF,0x90,0x13,0xA4,0xE0,0x2F,0xFF,
-
0x90,0x13,0xA3,0xE0,0x34,0x00,0xFE,0x12,0x1D,0x2F,0xD3,0x9F,0xE4,0x9E,0x40,0x2C,
-
0x90,0xF1,0x03,0xE0,0xFF,0x90,0x13,0xA6,0xE0,0x2F,0xFF,0x90,0x13,0xA5,0xE0,0x34,
-
0x00,0xFE,0x12,0x1D,0x2F,0xD3,0x9F,0xE4,0x9E,0x40,0x11,0x12,0x1D,0xCC,0xFB,0x12,
-
0x1E,0x47,0x12,0x21,0x88,0x2B,0x12,0x20,0x3C,0x74,0x01,0xF0,0xE4,0x90,0x13,0x95,
-
0xF0,0xA3,0xF0,0x12,0x1D,0xCC,0x70,0x6C,0x12,0x1D,0x2F,0x12,0x1E,0x2B,0x50,0x06,
-
0x12,0x1D,0x23,0x12,0x1F,0xA5,0x12,0x1D,0x2F,0x12,0x23,0x40,0x12,0x1E,0x33,0x50,
-
0x03,0x12,0x1C,0xF8,0x12,0x1D,0x2F,0x12,0x22,0xC8,0x12,0x1E,0x33,0x50,0x06,0x12,
-
0x22,0xC9,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x23,0x6F,0x12,0x1E,0x33,0x50,0x06,
-
0x12,0x23,0x70,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x24,0xE7,0x12,0x1E,0x33,0x50,
-
0x06,0x12,0x24,0xE8,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0xFF,0x74,0x0C,0x2D,0xF5,0x82,
-
0x74,0x60,0x12,0x1E,0x33,0x40,0x03,0x02,0x17,0x99,0x74,0x0C,0x2D,0xF5,0x82,0x74,
-
0x60,0x02,0x17,0x96,0x12,0x1D,0xCC,0x64,0x01,0x70,0x63,0x12,0x1D,0x2F,0x12,0x1E,
-
0x2B,0x50,0x06,0x12,0x1D,0x23,0x12,0x1F,0xA5,0x12,0x1D,0x2F,0x12,0x23,0x40,0x12,
-
0x1E,0x33,0x50,0x03,0x12,0x1C,0xF8,0x12,0x1D,0x2F,0x12,0x22,0xC8,0x12,0x1E,0x33,
-
0x50,0x06,0x12,0x22,0xC9,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x23,0x6F,0x12,0x1E,
-
0x33,0x50,0x06,0x12,0x23,0x70,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x24,0xE7,0x12,
-
0x1E,0x33,0x50,0x06,0x12,0x24,0xE8,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x21,0x99,
-
0x12,0x1E,0x33,0x40,0x03,0x02,0x17,0x99,0x12,0x21,0x9A,0x02,0x17,0x96,0x12,0x1D,
-
0xCC,0x64,0x02,0x70,0x63,0x12,0x1D,0x2F,0x12,0x1E,0x2B,0x50,0x06,0x12,0x1D,0x23,
-
0x12,0x1F,0xA5,0x12,0x1D,0x2F,0x12,0x23,0x40,0x12,0x1E,0x33,0x50,0x03,0x12,0x1C,
-
0xF8,0x12,0x1D,0x2F,0x12,0x22,0xC8,0x12,0x1E,0x33,0x50,0x06,0x12,0x22,0xC9,0x12,
-
0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x23,0x6F,0x12,0x1E,0x33,0x50,0x06,0x12,0x23,0x70,
-
0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x21,0x99,0x12,0x1E,0x33,0x50,0x06,0x12,0x21,
-
0x9A,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x22,0x20,0x12,0x1E,0x33,0x40,0x03,0x02,
-
0x17,0x99,0x12,0x22,0x21,0x02,0x17,0x96,0x12,0x1D,0xCC,0x64,0x1B,0x70,0x75,0x12,
-
0x1D,0x2F,0x12,0x21,0x99,0x12,0x1E,0x33,0x50,0x09,0x12,0x21,0x9A,0x12,0x1D,0x2A,
-
0x12,0x1F,0xA5,0x12,0x1D,0x2F,0x12,0x22,0x20,0x12,0x1E,0x33,0x50,0x06,0x12,0x22,
-
0x21,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x22,0xD1,0x12,0x1E,0x33,0x50,0x06,0x12,
-
0x22,0xD2,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x23,0x78,0x12,0x1E,0x33,0x50,0x06,
-
0x12,0x23,0x79,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x24,0xF0,0x12,0x1E,0x33,0x50,
-
0x06,0x12,0x24,0xF1,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0xFF,0x74,0xF4,0x2D,0xF5,0x82,
-
0x74,0x5F,0x12,0x1E,0x33,0x40,0x03,0x02,0x17,0x99,0x74,0xF4,0x2D,0xF5,0x82,0x74,
-
0x5F,0x02,0x17,0x96,0x12,0x1D,0xCC,0x64,0x1A,0x70,0x6D,0x12,0x1D,0x2F,0x12,0x21,
-
0x99,0x12,0x1E,0x33,0x50,0x09,0x12,0x21,0x9A,0x12,0x1D,0x2A,0x12,0x1F,0xA5,0x12,
-
0x1D,0x2F,0x12,0x22,0x20,0x12,0x1E,0x33,0x50,0x06,0x12,0x22,0x21,0x12,0x1C,0xFF,
-
0x12,0x1D,0x2F,0x12,0x22,0xD1,0x12,0x1E,0x33,0x50,0x06,0x12,0x22,0xD2,0x12,0x1C,
-
0xFF,0x12,0x1D,0x2F,0x12,0x23,0x78,0x12,0x1E,0x33,0x50,0x06,0x12,0x23,0x79,0x12,
-
0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x24,0xF0,0x12,0x1E,0x33,0x50,0x06,0x12,0x24,0xF1,
-
0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x1E,0x2B,0x40,0x03,0x02,0x17,0x99,0x74,0x02,
-
0x2D,0xF5,0x82,0x74,0x60,0x02,0x17,0x96,0x12,0x1D,0xCC,0x64,0x19,0x70,0x6A,0x12,
-
0x1D,0x2F,0x12,0x21,0x99,0x12,0x1E,0x33,0x50,0x09,0x12,0x21,0x9A,0x12,0x1D,0x2A,
-
0x12,0x1F,0xA5,0x12,0x1D,0x2F,0x12,0x22,0x20,0x12,0x1E,0x33,0x50,0x06,0x12,0x22,
-
0x21,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x22,0xD1,0x12,0x1E,0x33,0x50,0x06,0x12,
-
0x22,0xD2,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x23,0x78,0x12,0x1E,0x33,0x50,0x06,
-
0x12,0x23,0x79,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x1E,0x2B,0x50,0x0A,0x74,0x02,
-
0x2D,0xF5,0x82,0x74,0x60,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x23,0x40,0x12,0x1E,
-
0x33,0x50,0x66,0x12,0x23,0x41,0x02,0x17,0x96,0x12,0x1D,0x2F,0x12,0x1E,0x2B,0x50,
-
0x06,0x12,0x1D,0x23,0x12,0x1F,0xA5,0x12,0x1D,0x2F,0x12,0x23,0x40,0x12,0x1E,0x33,
-
0x50,0x03,0x12,0x1C,0xF8,0x12,0x1D,0x2F,0x12,0x22,0xC8,0x12,0x1E,0x33,0x50,0x06,
-
0x12,0x22,0xC9,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x21,0x99,0x12,0x1E,0x33,0x50,
-
0x06,0x12,0x21,0x9A,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x22,0x20,0x12,0x1E,0x33,
-
0x50,0x06,0x12,0x22,0x21,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x22,0xD1,0x12,0x1E,
-
0x33,0x50,0x06,0x12,0x22,0xD2,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0xC3,0x94,0x32,0x50,
-
0x08,0x12,0x1D,0x2F,0x75,0xF0,0x03,0x80,0x18,0x12,0x1D,0x2F,0xD3,0x94,0x4B,0x74,
-
0x00,0x40,0x08,0x12,0x1D,0x31,0x75,0xF0,0x03,0x80,0x06,0x12,0x1D,0x31,0x75,0xF0,
-
0x02,0xA4,0xFF,0x90,0x13,0xA9,0xE5,0xF0,0xF0,0xA3,0xEF,0xF0,0x90,0x13,0xA9,0x12,
-
0x24,0xF9,0x50,0x10,0x12,0x1D,0xCC,0xFB,0x12,0x1E,0x47,0x12,0x21,0x88,0x2B,0x12,
-
0x20,0x3C,0xE4,0xF0,0xE4,0x90,0x13,0x95,0xF0,0xA3,0xF0,0x12,0x1E,0x3A,0x70,0x75,
-
0x12,0x1D,0x2F,0x12,0x21,0xA2,0x12,0x1E,0x33,0x50,0x09,0x12,0x21,0xA3,0x12,0x1D,
-
0x2A,0x12,0x1F,0xA5,0x12,0x1D,0x2F,0x12,0x22,0x29,0x12,0x1E,0x33,0x50,0x06,0x12,
-
0x22,0x2A,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x22,0xDA,0x12,0x1E,0x33,0x50,0x06,
-
0x12,0x22,0xDB,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x23,0x81,0x12,0x1E,0x33,0x50,
-
0x06,0x12,0x23,0x82,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x25,0x0A,0x12,0x1E,0x33,
-
0x50,0x06,0x12,0x25,0x0B,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0xFF,0x74,0x50,0x2D,0xF5,
-
0x82,0x74,0x61,0x12,0x1E,0x33,0x40,0x03,0x02,0x1B,0x13,0x74,0x50,0x2D,0xF5,0x82,
-
0x74,0x61,0x02,0x1B,0x10,0x12,0x1E,0x3A,0x64,0x01,0x70,0x6C,0x12,0x1D,0x2F,0x12,
-
0x21,0xA2,0x12,0x1E,0x33,0x50,0x09,0x12,0x21,0xA3,0x12,0x1D,0x2A,0x12,0x1F,0xA5,
-
0x12,0x1D,0x2F,0x12,0x22,0x29,0x12,0x1E,0x33,0x50,0x06,0x12,0x22,0x2A,0x12,0x1C,
-
0xFF,0x12,0x1D,0x2F,0x12,0x22,0xDA,0x12,0x1E,0x33,0x50,0x06,0x12,0x22,0xDB,0x12,
-
0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x23,0x81,0x12,0x1E,0x33,0x50,0x06,0x12,0x23,0x82,
-
0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x25,0x0A,0x12,0x1E,0x33,0x50,0x06,0x12,0x25,
-
0x0B,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x21,0xAB,0x12,0x1E,0x33,0x40,0x03,0x02,
-
0x1B,0x13,0x12,0x21,0xAC,0x02,0x1B,0x10,0x12,0x1E,0x3A,0x64,0x02,0x70,0x6C,0x12,
-
0x1D,0x2F,0x12,0x21,0xA2,0x12,0x1E,0x33,0x50,0x09,0x12,0x21,0xA3,0x12,0x1D,0x2A,
-
0x12,0x1F,0xA5,0x12,0x1D,0x2F,0x12,0x22,0x29,0x12,0x1E,0x33,0x50,0x06,0x12,0x22,
-
0x2A,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x22,0xDA,0x12,0x1E,0x33,0x50,0x06,0x12,
-
0x22,0xDB,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x23,0x81,0x12,0x1E,0x33,0x50,0x06,
-
0x12,0x23,0x82,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x21,0xAB,0x12,0x1E,0x33,0x50,
-
0x06,0x12,0x21,0xAC,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x22,0x32,0x12,0x1E,0x33,
-
0x40,0x03,0x02,0x1B,0x13,0x12,0x22,0x33,0x02,0x1B,0x10,0x12,0x1E,0x3A,0x64,0x13,
-
0x70,0x75,0x12,0x1D,0x2F,0x12,0x21,0xAB,0x12,0x1E,0x33,0x50,0x09,0x12,0x21,0xAC,
-
0x12,0x1D,0x2A,0x12,0x1F,0xA5,0x12,0x1D,0x2F,0x12,0x22,0x32,0x12,0x1E,0x33,0x50,
-
0x06,0x12,0x22,0x33,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x22,0xE3,0x12,0x1E,0x33,
-
0x50,0x06,0x12,0x22,0xE4,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x23,0x8A,0x12,0x1E,
-
0x33,0x50,0x06,0x12,0x23,0x8B,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x25,0x13,0x12,
-
0x1E,0x33,0x50,0x06,0x12,0x25,0x14,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0xFF,0x74,0xB0,
-
0x2D,0xF5,0x82,0x74,0x5E,0x12,0x1E,0x33,0x40,0x03,0x02,0x1B,0x13,0x74,0xB0,0x2D,
-
0xF5,0x82,0x74,0x5E,0x02,0x1B,0x10,0x12,0x1E,0x3A,0x64,0x12,0x70,0x6C,0x12,0x1D,
-
0x2F,0x12,0x21,0xAB,0x12,0x1E,0x33,0x50,0x09,0x12,0x21,0xAC,0x12,0x1D,0x2A,0x12,
-
0x1F,0xA5,0x12,0x1D,0x2F,0x12,0x22,0x32,0x12,0x1E,0x33,0x50,0x06,0x12,0x22,0x33,
-
0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x22,0xE3,0x12,0x1E,0x33,0x50,0x06,0x12,0x22,
-
0xE4,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x23,0x8A,0x12,0x1E,0x33,0x50,0x06,0x12,
-
0x23,0x8B,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x25,0x13,0x12,0x1E,0x33,0x50,0x06,
-
0x12,0x25,0x14,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x21,0xA2,0x12,0x1E,0x33,0x40,
-
0x03,0x02,0x1B,0x13,0x12,0x21,0xA3,0x02,0x1B,0x10,0x12,0x1E,0x3A,0x64,0x11,0x70,
-
0x69,0x12,0x1D,0x2F,0x12,0x21,0xAB,0x12,0x1E,0x33,0x50,0x09,0x12,0x21,0xAC,0x12,
-
0x1D,0x2A,0x12,0x1F,0xA5,0x12,0x1D,0x2F,0x12,0x22,0x32,0x12,0x1E,0x33,0x50,0x06,
-
0x12,0x22,0x33,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x22,0xE3,0x12,0x1E,0x33,0x50,
-
0x06,0x12,0x22,0xE4,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x23,0x8A,0x12,0x1E,0x33,
-
0x50,0x06,0x12,0x23,0x8B,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x21,0xA2,0x12,0x1E,
-
0x33,0x50,0x06,0x12,0x21,0xA3,0x12,0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x22,0x29,0x12,
-
0x1E,0x33,0x50,0x6F,0x12,0x22,0x2A,0x02,0x1B,0x10,0x12,0x1D,0x2F,0x12,0x21,0xA2,
-
0x12,0x1E,0x33,0x50,0x09,0x12,0x21,0xA3,0x12,0x1D,0x2A,0x12,0x1F,0xA5,0x12,0x1D,
-
0x2F,0x12,0x22,0x29,0x12,0x1E,0x33,0x50,0x06,0x12,0x22,0x2A,0x12,0x1C,0xFF,0x12,
-
0x1D,0x2F,0x12,0x22,0xDA,0x12,0x1E,0x33,0x50,0x06,0x12,0x22,0xDB,0x12,0x1C,0xFF,
-
0x12,0x1D,0x2F,0x12,0x21,0xAB,0x12,0x1E,0x33,0x50,0x06,0x12,0x21,0xAC,0x12,0x1C,
-
0xFF,0x12,0x1D,0x2F,0x12,0x22,0x32,0x12,0x1E,0x33,0x50,0x06,0x12,0x22,0x33,0x12,
-
0x1C,0xFF,0x12,0x1D,0x2F,0x12,0x22,0xE3,0x12,0x1E,0x33,0x50,0x06,0x12,0x22,0xE4,
-
0x12,0x1C,0xFF,0x12,0x1D,0x2F,0xC3,0x94,0x32,0x50,0x08,0x12,0x1D,0x2F,0x75,0xF0,
-
0x03,0x80,0x22,0x12,0x1D,0x2F,0xD3,0x94,0x4B,0x40,0x08,0x12,0x1D,0x2F,0x75,0xF0,
-
0x03,0x80,0x12,0xAE,0x04,0xAF,0x05,0x74,0x00,0x2D,0xF5,0x82,0x74,0x60,0x3C,0xF5,
-
0x83,0xE0,0x75,0xF0,0x02,0xA4,0xFF,0x90,0x13,0xAB,0xE5,0xF0,0xF0,0xA3,0xEF,0xF0,
-
0x90,0x13,0xAB,0x12,0x24,0xF9,0x50,0x10,0x12,0x1D,0xCC,0xFD,0x12,0x1E,0x47,0x12,
-
0x21,0x88,0x2D,0x12,0x20,0x3C,0xE4,0xF0,0x12,0x1D,0xCC,0xF5,0xCB,0x12,0x1E,0x47,
-
0xF5,0xCC,0xD2,0xB5,0x30,0xB5,0x05,0x75,0x9E,0x55,0x80,0xF8,0x7D,0x19,0x12,0x1E,
-
0x3A,0x70,0x03,0x02,0x1C,0xE6,0x12,0x1E,0x47,0x64,0x13,0x70,0x03,0x02,0x1C,0xE6,
-
0x12,0x1D,0xCC,0x70,0x03,0x02,0x1C,0xE6,0x12,0x1D,0xD9,0x64,0x1B,0x70,0x03,0x02,
-
0x1C,0xE6,0x90,0x13,0x8B,0xE0,0xFA,0xA3,0xE0,0xFB,0x25,0xE0,0xFF,0xEA,0x12,0x1D,
-
0xD7,0xFC,0x12,0x1E,0x47,0x75,0xF0,0x1C,0xA4,0x24,0x00,0xF5,0x82,0xE5,0xF0,0x34,
-
0x10,0x12,0x20,0x37,0xE0,0x64,0x01,0x60,0x03,0x02,0x1C,0xE6,0xC3,0xE5,0xCA,0x95,
-
0xB7,0xC3,0x9D,0x50,0x1E,0xEB,0x25,0xE0,0xFF,0xEA,0x12,0x1D,0xD7,0xFC,0x12,0x1E,
-
0x47,0x75,0xF0,0x1C,0xA4,0x24,0xE3,0xF5,0x82,0xE5,0xF0,0x34,0x0F,0x12,0x20,0x37,
-
0x74,0x01,0xF0,0xC3,0xE5,0xCA,0x95,0xB9,0xC3,0x9D,0x50,0x19,0x12,0x1D,0xCC,0xFC,
-
0x12,0x1E,0x47,0x75,0xF0,0x1C,0xA4,0x24,0xE4,0xF5,0x82,0xE5,0xF0,0x34,0x0F,0x12,
-
0x20,0x37,0x74,0x01,0xF0,0xC3,0xE5,0xCA,0x95,0xBA,0xC3,0x9D,0x50,0x19,0x12,0x1D,
-
0xCC,0xFC,0x12,0x1E,0x47,0x75,0xF0,0x1C,0xA4,0x24,0xE5,0xF5,0x82,0xE5,0xF0,0x34,
-
0x0F,0x12,0x20,0x37,0x74,0x01,0xF0,0xC3,0xE5,0xCA,0x95,0xBD,0xC3,0x9D,0x50,0x19,
-
0x12,0x1D,0xCC,0xFC,0x12,0x1E,0x47,0x75,0xF0,0x1C,0xA4,0x24,0xFF,0xF5,0x82,0xE5,
-
0xF0,0x34,0x0F,0x12,0x20,0x37,0x74,0x01,0xF0,0xC3,0xE5,0xCA,0x95,0xBE,0xC3,0x9D,
-
0x50,0x19,0x12,0x1D,0xCC,0xFC,0x12,0x1E,0x47,0x75,0xF0,0x1C,0xA4,0x24,0x01,0xF5,
-
0x82,0xE5,0xF0,0x34,0x10,0x12,0x20,0x37,0x74,0x01,0xF0,0xC3,0xE5,0xCA,0x95,0xC2,
-
0xC3,0x9D,0x50,0x19,0x12,0x1D,0xCC,0xFC,0x12,0x1E,0x47,0x75,0xF0,0x1C,0xA4,0x24,
-
0x1B,0xF5,0x82,0xE5,0xF0,0x34,0x10,0x12,0x20,0x37,0x74,0x01,0xF0,0xC3,0xE5,0xCA,
-
0x95,0xC3,0xC3,0x9D,0x50,0x19,0x12,0x1D,0xCC,0xFC,0x12,0x1E,0x47,0x75,0xF0,0x1C,
-
0xA4,0x24,0x1C,0xF5,0x82,0xE5,0xF0,0x34,0x10,0x12,0x20,0x37,0x74,0x01,0xF0,0xC3,
-
0xE5,0xCA,0x95,0xC4,0xC3,0x9D,0x50,0x1E,0x12,0x1D,0xCC,0xFD,0x12,0x1E,0x47,0x75,
-
0xF0,0x1C,0xA4,0x24,0x1D,0xF5,0x82,0xE5,0xF0,0x34,0x10,0xF5,0x83,0xE5,0x82,0x2D,
-
0x12,0x20,0x3C,0x74,0x01,0xF0,0x90,0x13,0x8C,0xE0,0x04,0xF0,0x70,0x06,0x90,0x13,
-
0x8B,0xE0,0x04,0xF0,0x02,0x12,0xEC,0x22,0x74,0x04,0x2D,0xF5,0x82,0x74,0x60,0x3C,
-
0xF5,0x83,0xE0,0xFF,0x74,0x00,0x2D,0xF5,0x82,0x74,0x60,0x3C,0xF5,0x83,0xE0,0xC3,
-
0x9F,0xFF,0xE4,0x94,0x00,0xFE,0x90,0x13,0x96,0xE0,0x2F,0xF0,0x90,0x13,0x95,0xE0,
-
0x3E,0xF0,0x22,0x74,0x02,0x2D,0xF5,0x82,0x74,0x60,0x3C,0xF5,0x83,0xE0,0xFF,0x74,
-
0x00,0x2D,0xF5,0x82,0x74,0x60,0x3C,0xF5,0x83,0xE0,0x22,0x90,0x13,0x8D,0xE0,0xFF,
-
0x25,0xE0,0x25,0xE0,0x24,0x00,0xF5,0x82,0xE4,0x34,0xF2,0xF5,0x83,0xE0,0xFC,0xA3,
-
0xE0,0xFD,0x90,0x13,0x8C,0xE0,0xFE,0x25,0xE0,0x25,0xE0,0x24,0x50,0xF5,0x82,0xE4,
-
0x34,0xF2,0xF5,0x83,0xEC,0xF0,0xA3,0xED,0xF0,0xEF,0x25,0xE0,0x25,0xE0,0x24,0x02,
-
0xF5,0x82,0xE4,0x34,0xF2,0xF5,0x83,0xE0,0xFC,0xA3,0xE0,0xFD,0xEE,0x25,0xE0,0x25,
-
0xE0,0x24,0x52,0xF5,0x82,0xE4,0x34,0xF2,0xF5,0x83,0xEC,0xF0,0xA3,0xED,0xF0,0x90,
-
0x13,0x8D,0xE0,0xFF,0x25,0xE0,0x25,0xE0,0x24,0x00,0xF5,0x82,0xE4,0x34,0xF2,0xF5,
-
0x83,0xE0,0xFC,0xA3,0xE0,0xFD,0xEE,0x25,0xE0,0x25,0xE0,0x24,0x00,0xF5,0x82,0xE4,
-
0x34,0x89,0xF5,0x83,0xEC,0xF0,0xA3,0xED,0xF0,0xEF,0x25,0xE0,0x25,0xE0,0x24,0x02,
-
0xF5,0x82,0xE4,0x34,0xF2,0xF5,0x83,0xE0,0xFC,0xA3,0xE0,0x22,0x90,0x13,0x8C,0xE0,
-
0x25,0xE0,0xFF,0x90,0x13,0x8B,0xE0,0x33,0xFE,0x74,0x80,0x2F,0xF5,0x82,0x74,0x81,
-
0x3E,0xF5,0x83,0xE0,0x22,0x90,0x13,0x93,0xE0,0xFD,0x25,0xE0,0x25,0xE0,0x24,0x00,
-
0xF5,0x82,0xE4,0x34,0x89,0xF5,0x83,0xE0,0xFE,0xA3,0xE0,0xFF,0x90,0x13,0x92,0xE0,
-
0xFC,0x25,0xE0,0x25,0xE0,0x24,0x00,0xF5,0x82,0xE4,0x34,0xF2,0xF5,0x83,0xE0,0xFA,
-
0xA3,0xE0,0x2F,0xFF,0xEA,0x3E,0xC3,0x13,0xFE,0xEF,0x13,0xFF,0xED,0x25,0xE0,0x25,
-
0xE0,0x24,0x00,0xF5,0x82,0xE4,0x34,0x89,0xF5,0x83,0x22,0xFF,0x74,0x02,0x2D,0xF5,
-
0x82,0x74,0x60,0x3C,0xF5,0x83,0xE0,0xC3,0x9F,0x22,0x90,0x13,0x8C,0xE0,0x25,0xE0,
-
0xFF,0x90,0x13,0x8B,0xE0,0x33,0xFE,0x74,0x81,0x2F,0xF5,0x82,0x74,0x81,0x3E,0xF5,
-
0x83,0xE0,0x22,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0x74,0x01,0xF0,0x90,0x13,0x8D,
-
0xE0,0xFF,0x25,0xE0,0x25,0xE0,0x24,0x00,0xF5,0x82,0xE4,0x34,0xF2,0x22,0xEE,0xF0,
-
0xA3,0xEF,0xF0,0xED,0x25,0xE0,0x25,0xE0,0x24,0x72,0xF5,0x82,0xE4,0x34,0x12,0xF5,
-
0x83,0xE0,0xFE,0xA3,0xE0,0xFF,0xED,0x25,0xE0,0x25,0xE0,0x24,0x02,0xF5,0x82,0xE4,
-
0x34,0x89,0xF5,0x83,0x22,0xAF,0xE1,0xEF,0x25,0xE0,0x24,0x5B,0xF5,0x82,0xE4,0x34,
-
0x13,0xF5,0x83,0x22,0xFD,0xEE,0x25,0xE0,0x25,0xE0,0x24,0x52,0xF5,0x82,0xE4,0x34,
-
0x89,0xF5,0x83,0xEC,0xF0,0xA3,0xED,0xF0,0x74,0xE5,0x2E,0xF5,0x82,0xE4,0x34,0x88,
-
0xF5,0x83,0x22,0x75,0xF0,0x04,0x12,0x41,0x9B,0xE0,0xFC,0xA3,0xE0,0xFD,0xA3,0xE0,
-
0xFE,0xA3,0xE0,0xFF,0x22,0x90,0xF1,0x06,0xE0,0xFF,0xAE,0x1A,0xEE,0x8F,0xF0,0xA4,
-
0x24,0x9C,0xFF,0xE5,0xF0,0x34,0xFF,0xFE,0xEB,0x25,0xE0,0x25,0xE0,0x24,0x50,0xF5,
-
0x82,0xE4,0x34,0x89,0x22,0xE0,0xFA,0xA3,0xE0,0x2F,0xFF,0xEA,0x3E,0xFE,0xED,0x25,
-
0xE0,0x25,0xE0,0x24,0x02,0xF5,0x82,0xE4,0x34,0xF2,0xF5,0x83,0xE0,0xFA,0xA3,0xE0,
-
0x2F,0xFF,0xEA,0x3E,0x22,0xFD,0xEE,0x25,0xE0,0x25,0xE0,0x24,0x52,0xF5,0x82,0xE4,
-
0x34,0xF2,0xF5,0x83,0xEC,0xF0,0xA3,0xED,0xF0,0x90,0x13,0x92,0xE0,0xFF,0x24,0x00,
-
0xF5,0x82,0xE4,0x34,0x8A,0xF5,0x83,0xE0,0x90,0x13,0x93,0xFE,0xE0,0xFD,0x24,0x14,
-
0xF5,0x82,0xE4,0x34,0x8A,0xF5,0x83,0xEE,0xF0,0x74,0x28,0x2F,0xF5,0x82,0xE4,0x34,
-
0x8A,0xF5,0x83,0xE0,0xFF,0x74,0x3C,0x2D,0xF5,0x82,0xE4,0x34,0x8A,0xF5,0x83,0x22,
-
0x15,0x82,0xEF,0x54,0xF0,0xFF,0xED,0x25,0xE0,0x25,0xE0,0x24,0xAE,0xF5,0x82,0xE4,
-
0x34,0x89,0xF5,0x83,0xE0,0xA3,0xE0,0x54,0x0F,0x4F,0xFF,0x90,0x8F,0xF0,0xE0,0x75,
-
0xF0,0x06,0xA4,0x22,0x90,0x13,0x93,0xE0,0xFF,0x24,0x5B,0xF5,0x82,0xE4,0x34,0x12,
-
0xF5,0x83,0x22,0x90,0x13,0x8B,0xE0,0x75,0xF0,0x14,0xA4,0x24,0xB4,0xF5,0x82,0xE4,
-
0x34,0x37,0xF5,0x83,0x22,0xC3,0x9F,0xFE,0xE4,0x94,0x00,0x90,0x13,0x95,0xF0,0xA3,
-
0xCE,0xF0,0x22,0x90,0xF1,0x07,0xE0,0xFF,0xAE,0x1B,0xEE,0x8F,0xF0,0xA4,0x24,0x9C,
-
0xFF,0xE5,0xF0,0x34,0xFF,0xFE,0xEB,0x25,0xE0,0x25,0xE0,0x24,0x52,0xF5,0x82,0xE4,
-
0x34,0x89,0x22,0xF5,0x83,0xEF,0xF0,0xED,0x25,0xE0,0x25,0xE0,0x24,0xAC,0xF5,0x82,
-
0xE4,0x34,0x89,0x22,0x12,0x41,0x5E,0x90,0x13,0x8B,0xE0,0xFD,0x25,0xE0,0x24,0x53,
-
0xF5,0x82,0xE4,0x34,0x50,0xF5,0x83,0xE0,0xFE,0xED,0x25,0xE0,0x24,0x52,0xF5,0x82,
-
0xE4,0x34,0x50,0xF5,0x83,0xE0,0x7C,0x00,0x24,0x00,0xFF,0xEC,0x3E,0xFE,0x90,0x13,
-
0x8B,0xE0,0x24,0x00,0xF5,0x82,0xE4,0x34,0x50,0xF5,0x83,0xE0,0x22,0xEE,0xF0,0xA3,
-
0xEF,0xF0,0xAF,0xDF,0xEF,0x25,0xE0,0x25,0xE0,0x24,0x02,0xF5,0x82,0xE4,0x34,0xF2,
-
0xF5,0x83,0xE0,0xFE,0xA3,0xE0,0x22,0xF5,0x83,0xE5,0x82,0x2C,0xF5,0x82,0xE4,0x35,
-
0x83,0xF5,0x83,0x22,0xEE,0xF0,0xA3,0xEF,0xF0,0x90,0x13,0x92,0xE0,0xFD,0x25,0xE0,
-
0x25,0xE0,0x24,0x02,0xF5,0x82,0xE4,0x34,0xF2,0xF5,0x83,0xA3,0xE0,0x25,0xE0,0xFF,
-
0x05,0x82,0x22,0x90,0x13,0x92,0xE0,0xFF,0x24,0xBB,0xF5,0x82,0xE4,0x34,0x13,0xF5,
-
0x83,0xE0,0xFE,0x90,0x13,0x93,0xE0,0xFD,0x24,0x7A,0xF5,0x82,0xE4,0x34,0x13,0xF5,
-
0x83,0x22,0xF5,0x83,0xEE,0xF0,0xA3,0xEF,0xF0,0xED,0x25,0xE0,0x25,0xE0,0x24,0xAE,
-
0xF5,0x82,0xE4,0x34,0x89,0x22,0xF5,0x83,0xE0,0x7C,0x00,0x24,0x00,0xFF,0xEC,0x3E,
-
0xFE,0x7D,0x1C,0x12,0x40,0x4A,0x90,0x13,0xA3,0xEE,0xF0,0xA3,0xEF,0xF0,0x90,0x13,
-
0x8C,0xE0,0x25,0xE0,0xFD,0x90,0x13,0x8B,0xE0,0x33,0xFC,0x74,0x80,0x2D,0xF5,0x82,
-
0x74,0x81,0x3C,0xF5,0x83,0xE0,0x25,0xE0,0x22,0x90,0x13,0xDB,0xEE,0xF0,0xA3,0xEF,
-
0xF0,0x90,0x13,0xDB,0xE0,0xFE,0xA3,0xE0,0xFF,0x90,0x13,0xDA,0xE0,0x2F,0xFF,0x90,
-
0x13,0xD9,0xE0,0x3E,0xFE,0x90,0x13,0xDD,0xF0,0xA3,0xEF,0xF0,0xD3,0x94,0x01,0xEE,
-
0x94,0x00,0x22,0x90,0x13,0x8B,0xE0,0xFF,0x24,0x95,0xF5,0x82,0xE4,0x34,0x13,0xF5,
-
0x83,0x22,0xF5,0x83,0x74,0xFF,0xF0,0xEF,0x75,0xF0,0x06,0xA4,0x22,0x90,0x88,0xC1,
-
0xE0,0xFF,0x90,0x13,0x8B,0xE0,0xFE,0xC3,0x9F,0x22,0x74,0xAB,0x2E,0xF5,0x82,0xE4,
-
0x34,0x13,0xF5,0x83,0xE0,0xFF,0x74,0xB0,0x2E,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,
-
0xEF,0xF0,0x90,0x13,0x8B,0xE0,0x04,0xF0,0x22,0xE4,0xF0,0xA3,0x74,0x40,0xF0,0x74,
-
0x51,0x2F,0xF5,0x82,0xE4,0x34,0x12,0xF5,0x83,0xE4,0xF0,0x90,0x88,0xC0,0xE0,0x14,
-
0xF0,0x90,0x13,0x90,0xE0,0x04,0xF0,0x74,0xD1,0x2F,0xF5,0x82,0xE4,0x34,0x88,0xF5,
-
0x83,0xE4,0xF0,0x22,0xEF,0xF0,0x90,0x13,0x92,0xE0,0x24,0xA0,0xF5,0x82,0xE4,0x34,
-
0x37,0xF5,0x83,0xE4,0xF0,0x90,0x13,0x90,0xE0,0x04,0xF0,0x90,0x88,0xC0,0xE0,0x14,
-
0xF0,0x90,0x88,0xC1,0xE0,0x14,0xF0,0x22,0x75,0xF0,0x1C,0xA4,0x24,0x00,0xF5,0x82,
-
0xE5,0xF0,0x34,0x10,0xF5,0x83,0xE5,0x82,0x22,0xFF,0x74,0xFE,0x2D,0xF5,0x82,0x74,
-
0x5F,0x22,0xFF,0x74,0x38,0x2D,0xF5,0x82,0x74,0x60,0x22,0xFF,0x74,0xC8,0x2D,0xF5,
-
0x82,0x74,0x5F,0x22,0xF5,0x83,0xEE,0xF0,0xA3,0xEF,0xF0,0x22,0x74,0x02,0xF0,0x74,
-
0x70,0x2F,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0x22,0xFD,0x90,0x13,0x93,0xE0,0xFE,
-
0x25,0xE0,0x25,0xE0,0x24,0x50,0xF5,0x82,0xE4,0x34,0xF2,0x22,0xF5,0x83,0xEC,0xF0,
-
0xA3,0xED,0xF0,0x90,0x13,0x93,0xE0,0xFF,0x25,0xE0,0x25,0xE0,0x24,0x02,0xF5,0x82,
-
0xE4,0x34,0x89,0x22,0x90,0x13,0x93,0xE0,0xFF,0x24,0x51,0xF5,0x82,0xE4,0x34,0x12,
-
0xF5,0x83,0x22,0xE0,0xFD,0x74,0xAB,0x2F,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0xED,
-
0xF0,0x90,0x13,0xA7,0xE0,0xF8,0xA3,0xE0,0xF9,0xA3,0xE0,0xFA,0xA3,0xE0,0xFB,0x22,
-
0xFF,0x74,0xFC,0x2D,0xF5,0x82,0x74,0x5F,0x22,0xFF,0x74,0x70,0x2D,0xF5,0x82,0x74,
-
0x60,0x22,0xFF,0x74,0x90,0x2D,0xF5,0x82,0x74,0x5F,0x22,0xE0,0xF8,0xA3,0xE0,0xF9,
-
0xA3,0xE0,0xFA,0xA3,0xE0,0xFB,0xEF,0x2B,0xFF,0xEE,0x3A,0xFE,0xED,0x39,0xFD,0xEC,
-
0x38,0xFC,0x22,0xF0,0x90,0x13,0x8B,0xE0,0xFF,0x75,0xF0,0x04,0xA4,0x22,0x90,0x13,
-
0x8B,0xE0,0x75,0xF0,0x04,0xA4,0x24,0x80,0xF5,0x82,0xE5,0xF0,0x34,0x86,0xF5,0x83,
-
0x22,0xC2,0xDA,0xC2,0x11,0xAF,0xA6,0xAD,0xA7,0xEF,0xFE,0x7C,0x00,0xE4,0x2D,0x22,
-
0xEF,0x25,0xE0,0x25,0xE0,0x24,0x70,0xF5,0x82,0xE4,0x34,0x12,0x22,0xEC,0xF0,0xA3,
-
0xED,0xF0,0x90,0x13,0x8D,0xE0,0xFF,0x24,0x00,0xF5,0x82,0xE4,0x34,0x8A,0xF5,0x83,
-
0x22,0xAF,0x1A,0x90,0xF1,0x06,0xE0,0x8F,0xF0,0xA4,0x24,0xFF,0xFF,0xE5,0xF0,0x34,
-
0xFF,0xFE,0x22,0x90,0x13,0x8C,0xE0,0x25,0xE0,0xFD,0x90,0x13,0x8B,0xE0,0x33,0xFC,
-
0x74,0x81,0x2D,0xF5,0x82,0x74,0x81,0x22,0xFF,0x74,0x06,0x2D,0xF5,0x82,0x74,0x60,
-
0x22,0xFF,0x74,0xFA,0x2D,0xF5,0x82,0x74,0x5F,0x22,0xFF,0x74,0xA8,0x2D,0xF5,0x82,
-
0x74,0x60,0x22,0xFF,0x74,0x58,0x2D,0xF5,0x82,0x74,0x5F,0x22,0x90,0x13,0xA3,0xE0,
-
0xFC,0xA3,0xE0,0xFD,0xA3,0xE0,0xFE,0xA3,0xE0,0xFF,0x22,0x90,0x13,0x93,0xE0,0xFF,
-
0x25,0xE0,0x25,0xE0,0x24,0x00,0xF5,0x82,0xE4,0x34,0x89,0x22,0xE0,0xFD,0xEF,0x25,
-
0xE0,0x24,0xC5,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0xE0,0xFE,0xA3,0xE0,0xD3,0x9D,
-
0x74,0x80,0xF8,0xEE,0x64,0x80,0x98,0x90,0x13,0x93,0xE0,0x22,0x7B,0x40,0x7A,0x1F,
-
0xE4,0xF9,0xF8,0xC3,0x02,0x41,0x3A,0x90,0x13,0x8C,0xE0,0xFF,0xC3,0x95,0x1C,0x22,
-
0xFF,0x74,0x04,0x2D,0xF5,0x82,0x74,0x60,0x22,0x25,0xE0,0x25,0xE0,0x24,0x52,0xF5,
-
0x82,0xE4,0x34,0xF2,0x22,0x90,0xF1,0x0A,0x74,0x01,0xF0,0x22,0x90,0x13,0x90,0xE0,
-
0xC3,0x95,0x1C,0x22,0x74,0x9A,0x2E,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0x22,0xFF,
-
0x74,0x08,0x2D,0xF5,0x82,0x74,0x60,0x22,0xFF,0x74,0xF8,0x2D,0xF5,0x82,0x74,0x5F,
-
0x22,0xFF,0x74,0xE0,0x2D,0xF5,0x82,0x74,0x60,0x22,0xFF,0x74,0x20,0x2D,0xF5,0x82,
-
0x74,0x5F,0x22,0x15,0x82,0xE0,0x33,0xFE,0x90,0x13,0x93,0xE0,0xFC,0x22,0xE0,0xFE,
-
0xA3,0xE0,0xC3,0x9D,0xFF,0xEE,0x9C,0xFE,0x22,0x90,0x13,0xD9,0xEE,0xF0,0xA3,0xEF,
-
0xF0,0x90,0x13,0x93,0xE0,0x22,0xD3,0x9F,0xEE,0x64,0x80,0xF8,0xEC,0x64,0x80,0x98,
-
0x22,0xD3,0x90,0x13,0xDE,0xE0,0x94,0x78,0x90,0x13,0xDD,0xE0,0x94,0x00,0x22,0xD3,
-
0x90,0x13,0xDE,0xE0,0x94,0x72,0x90,0x13,0xDD,0xE0,0x94,0x01,0x22,0x9E,0xFE,0xEF,
-
0xC4,0xF8,0x54,0x0F,0xC8,0x68,0xFF,0xEE,0xC4,0x54,0xF0,0x48,0xFE,0x7C,0x00,0x7D,
-
0x20,0x02,0x40,0x9F,0x90,0xF2,0xB0,0xE0,0xFF,0x90,0x13,0x8B,0xE0,0xFC,0xA3,0xC3,
-
0xE0,0xFD,0x9F,0xEC,0x94,0x00,0x22,0x25,0xE0,0x24,0xC0,0xF5,0x82,0xE4,0x34,0x87,
-
0x22,0x75,0xF0,0x04,0x12,0x41,0x9B,0xE0,0xF8,0xA3,0xE0,0xF9,0xA3,0xE0,0xFA,0xA3,
-
0xE0,0xFB,0xC3,0x02,0x41,0x3A,0xFD,0xEE,0x25,0xE0,0x25,0xE0,0x24,0x72,0xF5,0x82,
-
0xE4,0x34,0x12,0x22,0x24,0x05,0xF5,0x82,0xE4,0x34,0x8F,0xF5,0x83,0x22,0x24,0x7D,
-
0xF5,0x82,0xE4,0x34,0x8F,0xF5,0x83,0x22,0x25,0xE0,0x25,0xE0,0x24,0x02,0xF5,0x82,
-
0xE4,0x34,0xF2,0x22,0x90,0x13,0x8C,0xE0,0x04,0xF0,0x22,0xEB,0x2F,0xFF,0xEA,0x3E,
-
0xFE,0xE9,0x3D,0xFD,0xE8,0x3C,0xFC,0x90,0x13,0xA7,0x02,0x41,0x5E,0xE4,0xF0,0xA3,
-
0x74,0x40,0xF0,0x22,0xEE,0xF0,0xA3,0xEF,0xF0,0xAF,0xE1,0xEF,0x22,0x90,0x13,0x8B,
-
0xE0,0xFF,0xC3,0x95,0x1C,0x22,0x74,0x14,0x2F,0xF5,0x82,0xE4,0x34,0x8A,0xF5,0x83,
-
0xE0,0xC3,0x94,0x01,0x74,0x80,0x94,0x88,0x22,0xF5,0x83,0xE0,0xFE,0xA3,0xE0,0x78,
-
0x04,0x22,0x24,0x60,0xF5,0x82,0xE4,0x34,0x88,0xF5,0x83,0x22,0x90,0x13,0x8C,0xE0,
-
0x24,0x28,0xF5,0x82,0xE4,0x34,0x8A,0xF5,0x83,0x22,0x2E,0xF5,0x82,0xE4,0x34,0x37,
-
0xF5,0x83,0x22,0xE4,0xF0,0x74,0x96,0x2F,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0xE0,
-
0x04,0xF0,0xD2,0x1B,0x22,0x78,0x25,0xE6,0x24,0x14,0x33,0x33,0x33,0x54,0xF8,0xFF,
-
0x78,0x24,0xE6,0xFE,0x4F,0xFF,0x22,0xFF,0x74,0x0A,0x2D,0xF5,0x82,0x74,0x60,0x22,
-
0xFF,0x74,0xF6,0x2D,0xF5,0x82,0x74,0x5F,0x22,0xE0,0xFE,0xA3,0xE0,0xFF,0xC3,0x90,
-
0x13,0x96,0xE0,0x9F,0x90,0x13,0x95,0xE0,0x9E,0x22,0xFF,0x74,0x18,0x2D,0xF5,0x82,
-
0x74,0x61,0x22,0xFF,0x74,0xE8,0x2D,0xF5,0x82,0x74,0x5E,0x22,0x2F,0xFF,0xEC,0x3E,
-
0xC3,0x13,0xFE,0xEF,0x13,0xFF,0x22,0x7D,0x01,0x7B,0xFF,0x7E,0x00,0x02,0x40,0x00,
-
0x90,0x13,0xBA,0xE0,0xFF,0x90,0x88,0xC1,0xE0,0x22,0x90,0x13,0x8C,0xE0,0x24,0xE5,
-
0x22,0x24,0xB5,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0x22,0x90,0x13,0x8D,0xE0,0x04,
-
0xF0,0x22,0xE0,0xFE,0xA3,0xE0,0xFF,0xE4,0xFC,0xFD,0x7A,0x01,0xF9,0xF8,0x02,0x40,
-
0xEB,0xE0,0xFD,0x90,0x13,0xDD,0xE0,0xFA,0xA3,0xE0,0xFB,0xD3,0x9D,0xEA,0x94,0x00,
-
0x22,0xF5,0x83,0xEC,0xF0,0xA3,0xED,0xF0,0x22,0xC3,0x9F,0xFF,0xEC,0x9E,0xFE,0x22,
-
0x24,0x04,0xF5,0x82,0xE4,0x34,0x8F,0x22,0x74,0xFF,0xF0,0x90,0x13,0x8B,0xE0,0x04,
-
0xF0,0x22,0x24,0x7C,0xF5,0x82,0xE4,0x34,0x8F,0x22,0x75,0xF0,0x04,0xA4,0x24,0x00,
-
0xF5,0x82,0xE5,0xF0,0x34,0x84,0xF5,0x83,0x22,0x75,0xF0,0x04,0xA4,0x24,0x40,0xF5,
-
0x82,0xE5,0xF0,0x34,0x85,0xF5,0x83,0x22,0xFF,0xEC,0x3E,0xCF,0x24,0x20,0xCF,0x34,
-
0x00,0xFE,0x90,0x13,0x8C,0xE0,0x22,0xFF,0xFB,0xAA,0x06,0xE4,0xF9,0xF8,0xA3,0xE4,
-
0xFC,0xFD,0x02,0x40,0xEB,0xE4,0xF0,0x90,0x8F,0xF0,0xE0,0x04,0xF0,0x22,0x24,0xB0,
-
0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0x22,0xF5,0x83,0xA3,0xE0,0xC4,0xF8,0x54,0x0F,
-
0xC8,0x68,0xFF,0x05,0x82,0x22,0xF0,0x75,0xF0,0x04,0xEF,0xA4,0x22,0xE0,0x24,0x94,
-
0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0xE0,0xFF,0x22,0xFD,0x90,0x13,0x93,0xE0,0xFE,
-
0x22,0xFF,0x90,0x13,0x93,0xE0,0xFD,0x22,0xCE,0xA2,0xE7,0x13,0xCE,0x13,0x22,0xE0,
-
0xFF,0x90,0x13,0x8D,0xE0,0xFE,0xC3,0x22,0x90,0x13,0xA3,0x12,0x41,0x5E,0xE4,0x90,
-
0x13,0x8B,0xF0,0x22,0x90,0x12,0x6E,0xE0,0xD3,0x94,0x00,0x22,0x90,0x12,0x6F,0xE0,
-
0xD3,0x94,0x00,0x22,0x74,0x04,0xF0,0xA3,0x74,0xB0,0xF0,0x22,0xAD,0xDF,0xE0,0xFE,
-
0xA3,0xE0,0xFF,0xED,0x22,0x24,0x03,0xF5,0x82,0xE4,0x34,0x8F,0x22,0x24,0x00,0xF5,
-
0x82,0xE4,0x34,0x8F,0x22,0x24,0x01,0xF5,0x82,0xE4,0x34,0x8F,0x22,0x24,0x02,0xF5,
-
0x82,0xE4,0x34,0x8F,0x22,0x24,0x7B,0xF5,0x82,0xE4,0x34,0x8F,0x22,0x24,0x78,0xF5,
-
0x82,0xE4,0x34,0x8F,0x22,0x24,0x79,0xF5,0x82,0xE4,0x34,0x8F,0x22,0x24,0x7A,0xF5,
-
0x82,0xE4,0x34,0x8F,0x22,0xF5,0xA9,0xEC,0xF5,0xAA,0xED,0xF5,0xAB,0xE4,0xF5,0xA2,
-
0x22,0xF5,0x83,0xE0,0xF5,0xA9,0x75,0xF0,0x04,0xEF,0xA4,0x22,0xF5,0x83,0xE0,0xFA,
-
0xA3,0xE0,0xC3,0x9D,0xEA,0x9C,0x22,0xE0,0x90,0x13,0x91,0xF0,0xE4,0x90,0x13,0x8B,
-
0xF0,0x22,0x15,0x82,0xE0,0x33,0xFE,0x90,0x13,0x92,0xE0,0xFC,0x22,0x2F,0xFF,0xEC,
-
0x3E,0xFE,0x90,0x13,0x93,0xE0,0xFD,0x22,0x7C,0x00,0x12,0x40,0x38,0x7D,0x20,0x02,
-
0x40,0x9F,0xE0,0xFF,0x90,0x88,0xC0,0xE0,0x22,0x90,0x13,0x91,0xE0,0xFF,0x90,0x13,
-
0x8B,0xE0,0x22,0x90,0x12,0x38,0xE0,0x94,0x00,0x22,0x90,0x12,0x6E,0xE0,0x04,0xF0,
-
0x22,0x90,0x12,0x6F,0xE0,0x04,0xF0,0x22,0xE0,0xFE,0x90,0x13,0x8D,0xE0,0xFF,0xC3,
-
0x9E,0x22,0x85,0xD9,0xD9,0x85,0xDA,0xDA,0x85,0xDB,0xDB,0x22,0x85,0xDC,0xDC,0x85,
-
0xDD,0xDD,0x85,0xDE,0xDE,0x22,0x90,0x8F,0xF0,0xE0,0xFF,0x90,0x12,0x37,0xE0,0x22,
-
0x90,0xF1,0x93,0x74,0x01,0xF0,0xE4,0x90,0xF1,0x46,0xF0,0x90,0xF1,0x1B,0x74,0x08,
-
0xF0,0x90,0xF0,0x02,0x30,0x04,0x03,0x02,0x29,0x72,0x12,0x3A,0x11,0x74,0x10,0xF0,
-
0xE4,0x90,0xF0,0x0F,0xF0,0x74,0x10,0x12,0x3A,0x79,0x74,0x10,0xF0,0x90,0xF0,0x13,
-
0x74,0x02,0xF0,0x74,0x10,0x12,0x3A,0x87,0x74,0x11,0xF0,0xE4,0x90,0xF0,0x17,0xF0,
-
0x90,0xF0,0x1A,0x74,0x11,0xF0,0x90,0xF0,0x19,0x74,0x01,0xF0,0x90,0xF0,0x1C,0x74,
-
0x11,0xF0,0x90,0xF0,0x1B,0x74,0x02,0xF0,0x90,0xF0,0x1E,0x74,0x11,0xF0,0x90,0xF0,
-
0x1D,0x74,0x03,0xF0,0x90,0xF0,0x20,0x74,0x12,0xF0,0xE4,0x90,0xF0,0x1F,0xF0,0x90,
-
0xF0,0x22,0x74,0x12,0xF0,0x90,0xF0,0x21,0x74,0x01,0xF0,0x90,0xF0,0x24,0x74,0x12,
-
0xF0,0x90,0xF0,0x23,0x74,0x02,0xF0,0x90,0xF0,0x26,0x74,0x12,0xF0,0x90,0xF0,0x25,
-
0x74,0x03,0xF0,0x90,0xF0,0x28,0x74,0x13,0xF0,0xE4,0x90,0xF0,0x27,0xF0,0x90,0xF0,
-
0x2A,0x74,0x13,0xF0,0x90,0xF0,0x29,0x74,0x01,0xF0,0x90,0xF0,0x2C,0x74,0x13,0xF0,
-
0x90,0xF0,0x2B,0x74,0x02,0xF0,0x90,0xF0,0x2E,0x74,0x13,0xF0,0x90,0xF0,0x2D,0x74,
-
0x03,0xF0,0x90,0xF0,0x30,0x74,0x14,0xF0,0xE4,0x90,0xF0,0x2F,0x12,0x38,0xF4,0x74,
-
0x14,0xF0,0x90,0xF0,0x4F,0x74,0x01,0xF0,0x90,0xF0,0x52,0x74,0x14,0xF0,0x90,0xF0,
-
0x51,0x74,0x02,0xF0,0x90,0xF0,0x54,0x74,0x14,0xF0,0x90,0xF0,0x53,0x74,0x03,0xF0,
-
0x90,0xF0,0x56,0x74,0x15,0xF0,0xE4,0x90,0xF0,0x55,0xF0,0x90,0xF0,0x58,0x74,0x15,
-
0xF0,0x90,0xF0,0x57,0x74,0x01,0xF0,0x90,0xF0,0x5A,0x74,0x15,0xF0,0x90,0xF0,0x59,
-
0x74,0x02,0xF0,0x90,0xF0,0x5C,0x74,0x15,0xF0,0x90,0xF0,0x5B,0x74,0x03,0xF0,0x90,
-
0xF0,0x5E,0x74,0x16,0xF0,0xE4,0x90,0xF0,0x5D,0xF0,0x90,0xF0,0x60,0x74,0x16,0xF0,
-
0x90,0xF0,0x5F,0x74,0x01,0xF0,0x90,0xF0,0x62,0x74,0x16,0xF0,0x90,0xF0,0x61,0x74,
-
0x02,0xF0,0x90,0xF0,0x64,0x74,0x16,0xF0,0x90,0xF0,0x63,0x74,0x03,0xF0,0x90,0xF0,
-
0x66,0x74,0x20,0xF0,0x90,0xF0,0x65,0x74,0x13,0xF0,0x90,0xF0,0x68,0x74,0x20,0xF0,
-
0x90,0xF0,0x67,0x74,0x12,0xF0,0x90,0xF0,0x6A,0x74,0x20,0xF0,0x90,0xF0,0x69,0x74,
-
0x11,0xF0,0x90,0xF0,0x6C,0x74,0x20,0xF0,0x90,0xF0,0x6B,0x74,0x10,0xF0,0x90,0xF0,
-
0x6E,0x74,0x20,0xF0,0x90,0xF0,0x6D,0x74,0x0F,0xF0,0x90,0xF0,0x70,0x74,0x20,0xF0,
-
0x74,0x0E,0x12,0x38,0x3C,0x74,0x20,0xF0,0x90,0xF0,0x91,0x74,0x0D,0xF0,0x90,0xF0,
-
0x94,0x74,0x20,0xF0,0x90,0xF0,0x93,0x74,0x0C,0xF0,0x90,0xF0,0x96,0x74,0x20,0xF0,
-
0x90,0xF0,0x95,0x74,0x0B,0xF0,0x90,0xF0,0x98,0x74,0x20,0xF0,0x90,0xF0,0x97,0x74,
-
0x0A,0xF0,0x90,0xF0,0x9A,0x74,0x20,0xF0,0x90,0xF0,0x99,0x74,0x09,0xF0,0x90,0xF0,
-
0x9C,0x74,0x20,0xF0,0x90,0xF0,0x9B,0x74,0x08,0xF0,0x90,0xF0,0x9E,0x74,0x20,0xF0,
-
0x90,0xF0,0x9D,0x74,0x07,0xF0,0x90,0xF0,0xA0,0x74,0x20,0xF0,0x90,0xF0,0x9F,0x74,
-
0x06,0xF0,0x90,0xF0,0xA2,0x74,0x20,0xF0,0x90,0xF0,0xA1,0x74,0x05,0xF0,0x90,0xF0,
-
0xA4,0x74,0x20,0xF0,0x90,0xF0,0xA3,0x74,0x04,0xF0,0x90,0xF0,0xA6,0x74,0x20,0xF0,
-
0x90,0xF0,0xA5,0x74,0x03,0xF0,0x74,0x20,0x12,0x3A,0x95,0x74,0x20,0xF0,0x90,0xF0,
-
0xA9,0x74,0x01,0xF0,0x90,0xF0,0xAC,0x74,0x20,0xF0,0xE4,0x90,0xF0,0xAB,0x12,0x39,
-
0x9E,0x74,0x1C,0xF0,0x90,0xF1,0x07,0x74,0x14,0xF0,0x74,0x04,0x12,0x3A,0x5D,0x02,
-
0x2B,0x9A,0x74,0x08,0x12,0x3A,0x11,0x74,0x20,0xF0,0xE4,0x90,0xF0,0x0F,0xF0,0x74,
-
0x20,0x12,0x3A,0x79,0x74,0x20,0xF0,0x90,0xF0,0x13,0x74,0x02,0xF0,0x74,0x20,0x12,
-
0x3A,0x87,0x74,0x20,0xF0,0x90,0xF0,0x17,0x74,0x04,0xF0,0x90,0xF0,0x1A,0x74,0x20,
-
0xF0,0x90,0xF0,0x19,0x74,0x05,0xF0,0x90,0xF0,0x1C,0x74,0x20,0xF0,0x90,0xF0,0x1B,
-
0x74,0x06,0xF0,0x90,0xF0,0x1E,0x74,0x20,0xF0,0x90,0xF0,0x1D,0x74,0x07,0xF0,0x90,
-
0xF0,0x20,0x74,0x20,0xF0,0x90,0xF0,0x1F,0x74,0x08,0xF0,0x90,0xF0,0x22,0x74,0x20,
-
0xF0,0x90,0xF0,0x21,0x74,0x09,0xF0,0x90,0xF0,0x24,0x74,0x20,0xF0,0x90,0xF0,0x23,
-
0x74,0x0A,0xF0,0x90,0xF0,0x26,0x74,0x20,0xF0,0x90,0xF0,0x25,0x74,0x0B,0xF0,0x90,
-
0xF0,0x28,0x74,0x20,0xF0,0x90,0xF0,0x27,0x74,0x0C,0xF0,0x90,0xF0,0x2A,0x74,0x20,
-
0xF0,0x90,0xF0,0x29,0x74,0x0D,0xF0,0x90,0xF0,0x2C,0x74,0x20,0xF0,0x90,0xF0,0x2B,
-
0x74,0x0E,0xF0,0x90,0xF0,0x2E,0x74,0x20,0xF0,0x90,0xF0,0x2D,0x74,0x0F,0xF0,0x90,
-
0xF0,0x30,0x74,0x20,0xF0,0x90,0xF0,0x2F,0x74,0x10,0x12,0x38,0xF4,0x74,0x20,0xF0,
-
0x90,0xF0,0x4F,0x74,0x11,0xF0,0x90,0xF0,0x52,0x74,0x20,0xF0,0x90,0xF0,0x51,0x74,
-
0x12,0xF0,0x90,0xF0,0x54,0x74,0x20,0xF0,0x90,0xF0,0x53,0x74,0x13,0xF0,0x90,0xF0,
-
0x56,0x74,0x20,0xF0,0x90,0xF0,0x55,0x74,0x14,0xF0,0x90,0xF0,0x58,0x74,0x20,0xF0,
-
0x90,0xF0,0x57,0x74,0x15,0xF0,0x90,0xF0,0x5A,0x74,0x20,0xF0,0x90,0xF0,0x59,0x74,
-
0x16,0xF0,0x90,0xF0,0x5C,0x74,0x20,0xF0,0x90,0xF0,0x5B,0x74,0x17,0xF0,0x90,0xF0,
-
0x5E,0x74,0x20,0xF0,0x90,0xF0,0x5D,0x74,0x18,0xF0,0x90,0xF0,0x60,0x74,0x20,0xF0,
-
0x90,0xF0,0x5F,0x74,0x19,0xF0,0x90,0xF0,0x62,0x74,0x20,0xF0,0x90,0xF0,0x61,0x74,
-
0x1A,0xF0,0x90,0xF0,0x64,0x74,0x20,0xF0,0x90,0xF0,0x63,0x74,0x1B,0xF0,0x90,0xF0,
-
0x66,0x74,0x10,0xF0,0xE4,0x90,0xF0,0x65,0xF0,0x90,0xF0,0x68,0x74,0x10,0xF0,0x90,
-
0xF0,0x67,0x74,0x01,0xF0,0x90,0xF0,0x6A,0x74,0x10,0xF0,0x90,0xF0,0x69,0x74,0x02,
-
0xF0,0x90,0xF0,0x6C,0x74,0x11,0xF0,0xE4,0x90,0xF0,0x6B,0xF0,0x90,0xF0,0x6E,0x74,
-
0x11,0xF0,0x90,0xF0,0x6D,0x74,0x01,0xF0,0x90,0xF0,0x70,0x74,0x11,0xF0,0x74,0x02,
-
0x12,0x38,0x3C,0x74,0x12,0xF0,0xE4,0x90,0xF0,0x91,0xF0,0x90,0xF0,0x94,0x74,0x12,
-
0xF0,0x90,0xF0,0x93,0x74,0x01,0xF0,0x90,0xF0,0x96,0x74,0x12,0xF0,0x90,0xF0,0x95,
-
0x74,0x02,0xF0,0x90,0xF0,0x98,0x74,0x13,0xF0,0xE4,0x90,0xF0,0x97,0xF0,0x90,0xF0,
-
0x9A,0x74,0x13,0xF0,0x90,0xF0,0x99,0x74,0x01,0xF0,0x90,0xF0,0x9C,0x74,0x13,0xF0,
-
0x90,0xF0,0x9B,0x74,0x02,0xF0,0x90,0xF0,0x9E,0x74,0x14,0xF0,0xE4,0x90,0xF0,0x9D,
-
0xF0,0x90,0xF0,0xA0,0x74,0x14,0xF0,0x90,0xF0,0x9F,0x74,0x01,0xF0,0x90,0xF0,0xA2,
-
0x74,0x14,0xF0,0x90,0xF0,0xA1,0x74,0x02,0xF0,0x90,0xF0,0xA4,0x74,0x15,0xF0,0xE4,
-
0x90,0xF0,0xA3,0xF0,0x90,0xF0,0xA6,0x74,0x15,0xF0,0x90,0xF0,0xA5,0x74,0x01,0xF0,
-
0x74,0x15,0x12,0x3A,0x95,0x74,0x16,0xF0,0xE4,0x90,0xF0,0xA9,0xF0,0x90,0xF0,0xAC,
-
0x74,0x16,0xF0,0x90,0xF0,0xAB,0x74,0x01,0x12,0x39,0x9E,0x74,0x14,0xF0,0x90,0xF1,
-
0x07,0x74,0x1C,0xF0,0x74,0x03,0x12,0x3A,0x5D,0x14,0xF0,0xE4,0x90,0xF1,0x15,0xF0,
-
0x90,0xF1,0x1F,0x74,0x28,0xF0,0x90,0xF1,0x1D,0x74,0x08,0xF0,0x90,0xF1,0x21,0x74,
-
0x0A,0xF0,0xE4,0x90,0xF1,0x1C,0xF0,0x90,0xF1,0x43,0x74,0x3A,0xF0,0x90,0xF1,0x19,
-
0x74,0x08,0xF0,0x90,0xF1,0x1E,0x74,0x01,0xF0,0x90,0xF1,0x20,0x74,0x05,0xF0,0x90,
-
0xF2,0xA4,0x74,0x32,0xF0,0x90,0xF2,0xA5,0xF0,0x90,0xF1,0x01,0x74,0x16,0xF0,0x90,
-
0xF1,0x02,0xF0,0x90,0xF1,0x03,0x74,0x19,0xF0,0x90,0xF1,0x04,0x74,0x0F,0xF0,0x90,
-
0xF1,0x05,0x74,0x28,0xF0,0x90,0xF1,0x08,0x74,0x03,0xF0,0x90,0xF1,0x09,0x74,0xE8,
-
0xF0,0x90,0xF1,0x0A,0x74,0x02,0xF0,0x90,0xF1,0x0B,0x74,0x0F,0xF0,0x90,0xF0,0xC5,
-
0x74,0x27,0xF0,0x90,0xF1,0x18,0x74,0xF5,0xF0,0xE0,0x54,0x0F,0xB4,0x09,0x00,0x50,
-
0x54,0x90,0x2C,0x28,0xF8,0x28,0x28,0x73,0x02,0x2C,0x43,0x02,0x2C,0x45,0x02,0x2C,
-
0x4D,0x02,0x2C,0x55,0x02,0x2C,0x5D,0x02,0x2C,0x65,0x02,0x2C,0x6D,0x02,0x2C,0x6D,
-
0x02,0x2C,0x6D,0x80,0x30,0x90,0xF1,0x0C,0x74,0x04,0xF0,0x80,0x2E,0x90,0xF1,0x0C,
-
0x74,0x08,0xF0,0x80,0x26,0x90,0xF1,0x0C,0x74,0x10,0xF0,0x80,0x1E,0x90,0xF1,0x0C,
-
0x74,0x20,0xF0,0x80,0x16,0x90,0xF1,0x0C,0x74,0x40,0xF0,0x80,0x0E,0x90,0xF1,0x0C,
-
0x74,0x80,0xF0,0x80,0x06,0x90,0xF1,0x0C,0x74,0x02,0xF0,0x90,0xF1,0x0D,0x74,0xC8,
-
0xF0,0x90,0xF1,0x16,0x74,0x12,0xF0,0xD2,0xAD,0xE4,0x90,0xF1,0x17,0xF0,0x90,0xF0,
-
0xC4,0x04,0xF0,0x20,0x0C,0x05,0x75,0x9E,0x55,0x80,0xF8,0x22,0x90,0x13,0xDF,0xEF,
-
0xF0,0xA9,0x03,0xA3,0xED,0xF0,0x60,0x03,0x02,0x2E,0x3F,0xE9,0x60,0x03,0x02,0x2D,
-
0x7E,0x90,0x13,0xDF,0xE0,0xB4,0x14,0x00,0x40,0x03,0x02,0x2D,0x78,0x90,0x2C,0xC4,
-
0xF8,0x28,0x28,0x73,0x02,0x2D,0x00,0x02,0x2D,0x06,0x02,0x2D,0x0C,0x02,0x2D,0x12,
-
0x02,0x2D,0x18,0x02,0x2D,0x1E,0x02,0x2D,0x24,0x02,0x2D,0x2A,0x02,0x2D,0x30,0x02,
-
0x2D,0x36,0x02,0x2D,0x3C,0x02,0x2D,0x42,0x02,0x2D,0x48,0x02,0x2D,0x4E,0x02,0x2D,
-
0x54,0x02,0x2D,0x5A,0x02,0x2D,0x60,0x02,0x2D,0x66,0x02,0x2D,0x6C,0x02,0x2D,0x72,
-
0x43,0xDB,0x01,0x02,0x2E,0x3C,0x43,0xDB,0x02,0x02,0x2E,0x3C,0x43,0xDB,0x04,0x02,
-
0x2E,0x3C,0x43,0xDB,0x08,0x02,0x2E,0x3C,0x43,0xDB,0x10,0x02,0x2E,0x3C,0x43,0xDB,
-
0x20,0x02,0x2E,0x3C,0x43,0xDB,0x40,0x02,0x2E,0x3C,0x43,0xDB,0x80,0x02,0x2E,0x3C,
-
0x43,0xDA,0x01,0x02,0x2E,0x3C,0x43,0xDA,0x02,0x02,0x2E,0x3C,0x43,0xDA,0x04,0x02,
-
0x2E,0x3C,0x43,0xDA,0x08,0x02,0x2E,0x3C,0x43,0xDA,0x10,0x02,0x2E,0x3C,0x43,0xDA,
-
0x20,0x02,0x2E,0x3C,0x43,0xDA,0x40,0x02,0x2E,0x3C,0x43,0xDA,0x80,0x02,0x2E,0x3C,
-
0x43,0xD9,0x01,0x02,0x2E,0x3C,0x43,0xD9,0x02,0x02,0x2E,0x3C,0x43,0xD9,0x04,0x02,
-
0x2E,0x3C,0x43,0xD9,0x08,0x02,0x2E,0x3C,0x12,0x27,0x12,0x02,0x2E,0x3C,0xE9,0x64,
-
0x01,0x60,0x03,0x02,0x2E,0x3C,0x90,0x13,0xDF,0xE0,0xB4,0x14,0x00,0x40,0x03,0x02,
-
0x2E,0x39,0x90,0x2D,0x99,0xF8,0x28,0x28,0x73,0x02,0x2D,0xD5,0x02,0x2D,0xDA,0x02,
-
0x2D,0xDF,0x02,0x2D,0xE4,0x02,0x2D,0xE9,0x02,0x2D,0xEE,0x02,0x2D,0xF3,0x02,0x2D,
-
0xF8,0x02,0x2D,0xFD,0x02,0x2E,0x02,0x02,0x2E,0x07,0x02,0x2E,0x0C,0x02,0x2E,0x11,
-
0x02,0x2E,0x16,0x02,0x2E,0x1B,0x02,0x2E,0x20,0x02,0x2E,0x25,0x02,0x2E,0x2A,0x02,
-
0x2E,0x2F,0x02,0x2E,0x34,0x43,0xDE,0x01,0x80,0x62,0x43,0xDE,0x02,0x80,0x5D,0x43,
-
0xDE,0x04,0x80,0x58,0x43,0xDE,0x08,0x80,0x53,0x43,0xDE,0x10,0x80,0x4E,0x43,0xDE,
-
0x20,0x80,0x49,0x43,0xDE,0x40,0x80,0x44,0x43,0xDE,0x80,0x80,0x3F,0x43,0xDD,0x01,
-
0x80,0x3A,0x43,0xDD,0x02,0x80,0x35,0x43,0xDD,0x04,0x80,0x30,0x43,0xDD,0x08,0x80,
-
0x2B,0x43,0xDD,0x10,0x80,0x26,0x43,0xDD,0x20,0x80,0x21,0x43,0xDD,0x40,0x80,0x1C,
-
0x43,0xDD,0x80,0x80,0x17,0x43,0xDC,0x01,0x80,0x12,0x43,0xDC,0x02,0x80,0x0D,0x43,
-
0xDC,0x04,0x80,0x08,0x43,0xDC,0x08,0x80,0x03,0x12,0x27,0x1C,0x7F,0x00,0x22,0x90,
-
0x13,0xE0,0xE0,0x64,0x01,0x60,0x03,0x02,0x2F,0xDE,0xE9,0x60,0x03,0x02,0x2F,0x1D,
-
0x90,0x13,0xDF,0xE0,0xB4,0x14,0x00,0x40,0x03,0x02,0x2F,0x17,0x90,0x2E,0x63,0xF8,
-
0x28,0x28,0x73,0x02,0x2E,0x9F,0x02,0x2E,0xA5,0x02,0x2E,0xAB,0x02,0x2E,0xB1,0x02,
-
0x2E,0xB7,0x02,0x2E,0xBD,0x02,0x2E,0xC3,0x02,0x2E,0xC9,0x02,0x2E,0xCF,0x02,0x2E,
-
0xD5,0x02,0x2E,0xDB,0x02,0x2E,0xE1,0x02,0x2E,0xE7,0x02,0x2E,0xED,0x02,0x2E,0xF3,
-
0x02,0x2E,0xF9,0x02,0x2E,0xFF,0x02,0x2F,0x05,0x02,0x2F,0x0B,0x02,0x2F,0x11,0x53,
-
0xDB,0xFE,0x02,0x2F,0xDB,0x53,0xDB,0xFD,0x02,0x2F,0xDB,0x53,0xDB,0xFB,0x02,0x2F,
-
0xDB,0x53,0xDB,0xF7,0x02,0x2F,0xDB,0x53,0xDB,0xEF,0x02,0x2F,0xDB,0x53,0xDB,0xDF,
-
0x02,0x2F,0xDB,0x53,0xDB,0xBF,0x02,0x2F,0xDB,0x53,0xDB,0x7F,0x02,0x2F,0xDB,0x53,
-
0xDA,0xFE,0x02,0x2F,0xDB,0x53,0xDA,0xFD,0x02,0x2F,0xDB,0x53,0xDA,0xFB,0x02,0x2F,
-
0xDB,0x53,0xDA,0xF7,0x02,0x2F,0xDB,0x53,0xDA,0xEF,0x02,0x2F,0xDB,0x53,0xDA,0xDF,
-
0x02,0x2F,0xDB,0x53,0xDA,0xBF,0x02,0x2F,0xDB,0x53,0xDA,0x7F,0x02,0x2F,0xDB,0x53,
-
0xD9,0xFE,0x02,0x2F,0xDB,0x53,0xD9,0xFD,0x02,0x2F,0xDB,0x53,0xD9,0xFB,0x02,0x2F,
-
0xDB,0x53,0xD9,0xF7,0x02,0x2F,0xDB,0x12,0x27,0x12,0x02,0x2F,0xDB,0xE9,0x64,0x01,
-
0x60,0x03,0x02,0x2F,0xDB,0x90,0x13,0xDF,0xE0,0xB4,0x14,0x00,0x40,0x03,0x02,0x2F,
-
0xD8,0x90,0x2F,0x38,0xF8,0x28,0x28,0x73,0x02,0x2F,0x74,0x02,0x2F,0x79,0x02,0x2F,
-
0x7E,0x02,0x2F,0x83,0x02,0x2F,0x88,0x02,0x2F,0x8D,0x02,0x2F,0x92,0x02,0x2F,0x97,
-
0x02,0x2F,0x9C,0x02,0x2F,0xA1,0x02,0x2F,0xA6,0x02,0x2F,0xAB,0x02,0x2F,0xB0,0x02,
-
0x2F,0xB5,0x02,0x2F,0xBA,0x02,0x2F,0xBF,0x02,0x2F,0xC4,0x02,0x2F,0xC9,0x02,0x2F,
-
0xCE,0x02,0x2F,0xD3,0x53,0xDE,0xFE,0x80,0x62,0x53,0xDE,0xFD,0x80,0x5D,0x53,0xDE,
-
0xFB,0x80,0x58,0x53,0xDE,0xF7,0x80,0x53,0x53,0xDE,0xEF,0x80,0x4E,0x53,0xDE,0xDF,
-
0x80,0x49,0x53,0xDE,0xBF,0x80,0x44,0x53,0xDE,0x7F,0x80,0x3F,0x53,0xDD,0xFE,0x80,
-
0x3A,0x53,0xDD,0xFD,0x80,0x35,0x53,0xDD,0xFB,0x80,0x30,0x53,0xDD,0xF7,0x80,0x2B,
-
0x53,0xDD,0xEF,0x80,0x26,0x53,0xDD,0xDF,0x80,0x21,0x53,0xDD,0xBF,0x80,0x1C,0x53,
-
0xDD,0x7F,0x80,0x17,0x53,0xDC,0xFE,0x80,0x12,0x53,0xDC,0xFD,0x80,0x0D,0x53,0xDC,
-
0xFB,0x80,0x08,0x53,0xDC,0xF7,0x80,0x03,0x12,0x27,0x1C,0x7F,0x00,0x22,0x90,0x13,
-
0xE0,0xE0,0x64,0x02,0x60,0x03,0x02,0x31,0x6E,0xE9,0x60,0x03,0x02,0x30,0xAB,0x90,
-
0x13,0xDF,0xE0,0xB4,0x14,0x00,0x40,0x03,0x02,0x30,0xA6,0x90,0x30,0x02,0xF8,0x28,
-
0x28,0x73,0x02,0x30,0x3E,0x02,0x30,0x42,0x02,0x30,0x46,0x02,0x30,0x4A,0x02,0x30,
-
0x4E,0x02,0x30,0x52,0x02,0x30,0x56,0x02,0x30,0x5A,0x02,0x30,0x5E,0x02,0x30,0x62,
-
0x02,0x30,0x66,0x02,0x30,0x6A,0x02,0x30,0x6E,0x02,0x30,0x75,0x02,0x30,0x7C,0x02,
-
0x30,0x83,0x02,0x30,0x8A,0x02,0x30,0x91,0x02,0x30,0x98,0x02,0x30,0x9F,0xE5,0xDB,
-
0x80,0x4A,0xE5,0xDB,0x80,0x4D,0xE5,0xDB,0x80,0x50,0xE5,0xDB,0x80,0x53,0xE5,0xDB,
-
0x80,0x1E,0xE5,0xDB,0x80,0x21,0xE5,0xDB,0x80,0x24,0xE5,0xDB,0x80,0x27,0xE5,0xDA,
-
0x80,0x2A,0xE5,0xDA,0x80,0x2D,0xE5,0xDA,0x80,0x30,0xE5,0xDA,0x80,0x33,0xE5,0xDA,
-
0x54,0x10,0xFE,0x80,0x33,0xE5,0xDA,0x54,0x20,0xFE,0x80,0x2C,0xE5,0xDA,0x54,0x40,
-
0xFE,0x80,0x25,0xE5,0xDA,0x54,0x80,0xFE,0x80,0x1E,0xE5,0xD9,0x54,0x01,0xFE,0x80,
-
0x17,0xE5,0xD9,0x54,0x02,0xFE,0x80,0x10,0xE5,0xD9,0x54,0x04,0xFE,0x80,0x09,0xE5,
-
0xD9,0x54,0x08,0xFE,0x80,0x02,0xE4,0xFE,0xAF,0x06,0x22,0xE9,0x64,0x01,0x60,0x03,
-
0x02,0x31,0x6E,0x90,0x13,0xDF,0xE0,0xB4,0x14,0x00,0x40,0x03,0x02,0x31,0x6A,0x90,
-
0x30,0xC6,0xF8,0x28,0x28,0x73,0x02,0x31,0x02,0x02,0x31,0x06,0x02,0x31,0x0A,0x02,
-
0x31,0x0E,0x02,0x31,0x12,0x02,0x31,0x16,0x02,0x31,0x1A,0x02,0x31,0x1E,0x02,0x31,
-
0x22,0x02,0x31,0x26,0x02,0x31,0x2A,0x02,0x31,0x2E,0x02,0x31,0x32,0x02,0x31,0x39,
-
0x02,0x31,0x40,0x02,0x31,0x47,0x02,0x31,0x4E,0x02,0x31,0x55,0x02,0x31,0x5C,0x02,
-
0x31,0x63,0xE5,0xDE,0x80,0x4A,0xE5,0xDE,0x80,0x4D,0xE5,0xDE,0x80,0x50,0xE5,0xDE,
-
0x80,0x53,0xE5,0xDE,0x80,0x1E,0xE5,0xDE,0x80,0x21,0xE5,0xDE,0x80,0x24,0xE5,0xDE,
-
0x80,0x27,0xE5,0xDD,0x80,0x2A,0xE5,0xDD,0x80,0x2D,0xE5,0xDD,0x80,0x30,0xE5,0xDD,
-
0x80,0x33,0xE5,0xDD,0x54,0x10,0xFE,0x80,0x33,0xE5,0xDD,0x54,0x20,0xFE,0x80,0x2C,
-
0xE5,0xDD,0x54,0x40,0xFE,0x80,0x25,0xE5,0xDD,0x54,0x80,0xFE,0x80,0x1E,0xE5,0xDC,
-
0x54,0x01,0xFE,0x80,0x17,0xE5,0xDC,0x54,0x02,0xFE,0x80,0x10,0xE5,0xDC,0x54,0x04,
-
0xFE,0x80,0x09,0xE5,0xDC,0x54,0x08,0xFE,0x80,0x02,0xE4,0xFE,0xAF,0x06,0x22,0xE4,
-
0x90,0x8F,0xF0,0xF0,0xD2,0x1B,0x30,0x17,0x03,0x02,0x33,0x2D,0x90,0x12,0x37,0xF0,
-
0x90,0x13,0x8B,0xF0,0x12,0x24,0x7D,0x40,0x03,0x02,0x32,0x81,0x74,0xE5,0x2F,0x12,
-
0x1E,0xBB,0xE0,0x70,0x03,0x02,0x32,0x7B,0x90,0x13,0x8B,0xE0,0x24,0x70,0x12,0x21,
-
0xC2,0xE0,0x60,0x03,0x02,0x32,0x7B,0x12,0x24,0x86,0x40,0x03,0x02,0x32,0x7B,0x90,
-
0x13,0x8B,0xE0,0x24,0xE5,0x12,0x1E,0xBB,0xE0,0x64,0x03,0x60,0x04,0xC2,0x1B,0x80,
-
0x07,0x7F,0x70,0x7E,0x17,0x12,0x4D,0xD3,0x90,0x13,0x8B,0xE0,0xFF,0x24,0xE5,0x12,
-
0x1E,0xBB,0xE0,0x90,0x12,0x37,0xB4,0x02,0x05,0xE0,0x04,0xF0,0x80,0x03,0xE0,0x14,
-
0xF0,0xEF,0x12,0x1F,0xD8,0x12,0x1D,0xC5,0xFD,0x7F,0x04,0x7E,0x00,0x12,0x4D,0x4F,
-
0x12,0x35,0x2B,0x12,0x1F,0xD8,0x12,0x20,0x82,0x12,0x1D,0xC5,0xFD,0x7F,0x03,0x7E,
-
0x00,0x12,0x4D,0x4F,0x12,0x34,0xDA,0x12,0x26,0x55,0x12,0x1F,0xD3,0x12,0x24,0x99,
-
0x12,0x26,0x18,0xD8,0xFB,0x12,0x1F,0x7A,0x12,0x26,0x5D,0xF5,0x83,0xEF,0xF0,0x12,
-
0x20,0x89,0x12,0x24,0x99,0x12,0x26,0x18,0xD8,0xFB,0x12,0x1F,0x7A,0x12,0x26,0x65,
-
0x12,0x1F,0xD3,0x12,0x25,0xE8,0xD5,0x82,0x02,0x15,0x83,0x12,0x1F,0x60,0x12,0x26,
-
0x6D,0xF5,0x83,0xEF,0xF0,0x90,0x3F,0xFE,0xE0,0xB4,0x01,0x18,0xE5,0x18,0x12,0x1F,
-
0x7A,0x12,0x25,0x80,0xF5,0x83,0xEF,0xF0,0xAF,0x19,0x12,0x1F,0x7B,0x12,0x24,0x34,
-
0xEF,0xF0,0x80,0x14,0x12,0x1F,0x7B,0x12,0x25,0x80,0xF5,0x83,0x74,0x08,0xF0,0x12,
-
0x1F,0x7B,0x12,0x24,0x34,0x74,0x08,0xF0,0x12,0x25,0xD7,0x12,0x25,0x8B,0x02,0x31,
-
0x84,0x12,0x27,0x26,0xB5,0x07,0x04,0xD2,0x06,0x80,0x02,0xC2,0x06,0x30,0x19,0x4D,
-
0x78,0x24,0xE6,0x60,0x02,0xC2,0x1B,0x12,0x24,0xD5,0x12,0x1F,0x7B,0x12,0x26,0x5D,
-
0xF5,0x83,0xEF,0xF0,0x12,0x1F,0x7B,0x12,0x26,0x65,0xF5,0x83,0xE4,0xF0,0x12,0x1F,
-
0x7B,0x12,0x26,0x6D,0xF5,0x83,0xE4,0xF0,0x12,0x1F,0x7B,0x12,0x26,0x55,0xF5,0x83,
-
0xE4,0xF0,0x12,0x1F,0x7B,0x12,0x25,0x80,0xF5,0x83,0xE4,0xF0,0x12,0x1F,0x7B,0x12,
-
0x24,0x34,0x12,0x25,0xD5,0xEE,0x70,0x05,0x78,0x25,0xF6,0xC2,0x19,0x20,0x0D,0x38,
-
0x90,0x8F,0xF0,0xE0,0x90,0x13,0x8B,0xF0,0x12,0x24,0x7D,0x50,0x2B,0xEF,0x75,0xF0,
-
0x06,0xA4,0x12,0x26,0x5D,0x12,0x21,0x02,0x12,0x26,0x65,0x12,0x21,0x02,0x12,0x26,
-
0x6D,0x12,0x21,0x02,0x12,0x26,0x55,0x12,0x21,0x02,0x12,0x25,0x80,0x12,0x21,0x02,
-
0x12,0x24,0x34,0x12,0x25,0x88,0x80,0xD0,0x90,0x8F,0xF0,0xE0,0xD3,0x94,0x00,0x50,
-
0x03,0x02,0x34,0xD9,0x20,0x1B,0x03,0x02,0x34,0xD9,0xD2,0x0E,0x22,0xE4,0x90,0x13,
-
0x8B,0xF0,0x12,0x24,0x7D,0x40,0x03,0x02,0x34,0x34,0xE4,0x90,0x12,0x37,0xF0,0x74,
-
0xE5,0x2F,0x12,0x1E,0xBB,0xE0,0x70,0x03,0x02,0x34,0x2E,0x90,0x13,0x8B,0xE0,0x24,
-
0x70,0x12,0x21,0xC2,0xE0,0x60,0x03,0x02,0x34,0x2E,0x12,0x24,0x86,0x40,0x03,0x02,
-
0x34,0x2E,0x90,0x13,0x8B,0xE0,0x24,0xE5,0x12,0x1E,0xBB,0xE0,0x64,0x03,0x60,0x04,
-
0xC2,0x1B,0x80,0x07,0x7F,0x70,0x7E,0x17,0x12,0x4D,0xD3,0x90,0x13,0x8B,0xE0,0xFF,
-
0x24,0xE5,0x12,0x1E,0xBB,0xE0,0x90,0x12,0x37,0xB4,0x02,0x05,0xE0,0x04,0xF0,0x80,
-
0x03,0xE0,0x14,0xF0,0xEF,0x12,0x1F,0xD8,0x12,0x1D,0xC5,0xFD,0x7F,0x04,0x7E,0x00,
-
0x12,0x4D,0x4F,0x12,0x35,0x2B,0x12,0x1F,0xD8,0x12,0x20,0x82,0x12,0x1D,0xC5,0xFD,
-
0x7F,0x03,0x7E,0x00,0x12,0x4D,0x4F,0x12,0x34,0xDA,0x12,0x26,0x75,0x12,0x1F,0xD3,
-
0x12,0x24,0x99,0x12,0x26,0x18,0xD8,0xFB,0x12,0x1F,0x7A,0x12,0x26,0x7D,0xF5,0x83,
-
0xEF,0xF0,0x12,0x20,0x89,0x12,0x24,0x99,0x12,0x26,0x18,0xD8,0xFB,0x12,0x1F,0x7A,
-
0x12,0x26,0x85,0x12,0x1F,0xD3,0x12,0x25,0xE8,0xD5,0x82,0x02,0x15,0x83,0x12,0x1F,
-
0x60,0x12,0x26,0x8D,0xF5,0x83,0xEF,0xF0,0x90,0x3F,0xFE,0xE0,0xB4,0x01,0x18,0xE5,
-
0x18,0x12,0x1F,0x7A,0x12,0x25,0x92,0xF5,0x83,0xEF,0xF0,0xAF,0x19,0x12,0x1F,0x7B,
-
0x12,0x24,0x3E,0xEF,0xF0,0x80,0x14,0x12,0x1F,0x7B,0x12,0x25,0x92,0xF5,0x83,0x74,
-
0x08,0xF0,0x12,0x1F,0x7B,0x12,0x24,0x3E,0x74,0x08,0xF0,0x12,0x25,0xD7,0x12,0x25,
-
0x8B,0x02,0x33,0x32,0x12,0x27,0x26,0xB5,0x07,0x04,0xD2,0x06,0x80,0x02,0xC2,0x06,
-
0x30,0x19,0x4D,0x78,0x24,0xE6,0x60,0x02,0xC2,0x1B,0x12,0x24,0xD5,0x12,0x1F,0x7B,
-
0x12,0x26,0x7D,0xF5,0x83,0xEF,0xF0,0x12,0x1F,0x7B,0x12,0x26,0x85,0xF5,0x83,0xE4,
-
0xF0,0x12,0x1F,0x7B,0x12,0x26,0x8D,0xF5,0x83,0xE4,0xF0,0x12,0x1F,0x7B,0x12,0x26,
-
0x75,0xF5,0x83,0xE4,0xF0,0x12,0x1F,0x7B,0x12,0x25,0x92,0xF5,0x83,0xE4,0xF0,0x12,
-
0x1F,0x7B,0x12,0x24,0x3E,0x12,0x25,0xD5,0xEE,0x70,0x05,0x78,0x25,0xF6,0xC2,0x19,
-
0x20,0x0D,0x38,0x90,0x8F,0xF0,0xE0,0x90,0x13,0x8B,0xF0,0x12,0x24,0x7D,0x50,0x2B,
-
0xEF,0x75,0xF0,0x06,0xA4,0x12,0x26,0x7D,0x12,0x21,0x02,0x12,0x26,0x85,0x12,0x21,
-
0x02,0x12,0x26,0x8D,0x12,0x21,0x02,0x12,0x26,0x75,0x12,0x21,0x02,0x12,0x25,0x92,
-
0x12,0x21,0x02,0x12,0x24,0x3E,0x12,0x25,0x88,0x80,0xD0,0x90,0x8F,0xF0,0xE0,0xD3,
-
0x94,0x00,0x40,0x05,0x30,0x1B,0x02,0xD2,0x0E,0x22,0xE4,0xFC,0xFD,0x90,0x13,0x8E,
-
0x12,0x41,0x5E,0x90,0x13,0x8E,0xA3,0xA3,0xE0,0xFE,0xA3,0xE0,0xFD,0xAC,0x06,0x7F,
-
0x05,0x7E,0x00,0x12,0x4D,0x24,0x90,0x13,0x8B,0xE0,0xFD,0x25,0xE0,0x25,0xE0,0x24,
-
0xAE,0xF5,0x82,0xE4,0x34,0x89,0xF5,0x83,0xEE,0xF0,0xA3,0xEF,0xF0,0xED,0x04,0x33,
-
0x33,0x33,0x54,0xF8,0xFF,0x74,0xE5,0x2D,0xF5,0x82,0xE4,0x34,0x88,0xF5,0x83,0xE0,
-
0x4F,0xFF,0x90,0x8F,0xF0,0xE0,0x75,0xF0,0x06,0xA4,0x22,0xE4,0xFC,0xFD,0x90,0x13,
-
0x8E,0x12,0x41,0x5E,0x90,0x13,0x8E,0xA3,0xA3,0xE0,0xFE,0xA3,0xE0,0xFD,0xAC,0x06,
-
0x7F,0x07,0x7E,0x00,0x12,0x4D,0x24,0x90,0x13,0x8B,0xE0,0xFD,0x22,0xE4,0xF5,0x15,
-
0xF5,0x16,0xF5,0x1F,0x75,0x81,0x64,0xD2,0xAF,0xD2,0xAE,0x12,0x00,0x40,0x12,0x7F,
-
0xF0,0x7F,0x64,0x7E,0x00,0x12,0x4D,0xD3,0x12,0x4C,0x23,0x12,0x3A,0xAA,0xC2,0x15,
-
0x12,0x4C,0xEC,0xC2,0x01,0x75,0x9E,0x55,0x20,0x0C,0x03,0x02,0x37,0x41,0xC2,0x0C,
-
0x85,0x1D,0x18,0x85,0x1E,0x19,0xE4,0xF5,0x1D,0xF5,0x1E,0x20,0x15,0x03,0x12,0x4D,
-
0xF4,0x30,0x05,0x09,0x12,0x12,0x8C,0x12,0x4C,0x7F,0x02,0x37,0x41,0x20,0x15,0x03,
-
0x02,0x36,0x2E,0xE4,0x90,0xF1,0x0A,0xF0,0x90,0xF1,0x1B,0xF0,0x90,0xF1,0x1F,0x74,
-
0x0F,0xF0,0x90,0xF1,0x22,0x74,0x05,0xF0,0xE4,0x90,0xF1,0x1C,0xF0,0x90,0xF1,0x06,
-
0x04,0xF0,0xA3,0xF0,0x90,0xF1,0x0E,0xF0,0xE4,0x12,0x4C,0xE4,0xF0,0x12,0x4C,0xE4,
-
0x74,0x05,0xF0,0xE4,0xFD,0xFC,0xED,0x25,0xE0,0xFE,0xEC,0x33,0x90,0x13,0x89,0xF0,
-
0xA3,0xCE,0xF0,0x90,0x13,0x89,0xE0,0xFE,0xA3,0xE0,0x7B,0x01,0x24,0x01,0xF9,0x74,
-
0xF0,0x3E,0xFA,0xE4,0x12,0x40,0x26,0x04,0x29,0xF9,0xE4,0x3A,0xFA,0x74,0x08,0x12,
-
0x40,0x26,0x0D,0xBD,0x00,0x01,0x0C,0xED,0x64,0x60,0x4C,0x70,0xC9,0x12,0x4A,0x44,
-
0x90,0x12,0x33,0xE0,0x04,0xF0,0xE0,0x64,0x60,0x60,0x03,0x02,0x37,0x41,0xF0,0x90,
-
0x12,0x49,0xF0,0x90,0x8F,0xFD,0x74,0xBB,0xF0,0xC2,0x15,0x02,0x37,0x41,0x90,0x13,
-
0x6F,0xE0,0xFF,0x12,0x47,0x98,0x12,0x3D,0xFB,0xA2,0xD9,0xE4,0x33,0x90,0x8E,0x01,
-
0xF0,0x90,0xF0,0xC4,0x74,0x01,0xF0,0x30,0x18,0x09,0x12,0x12,0x8C,0x12,0x41,0xA7,
-
0x12,0x43,0x55,0x12,0x00,0x4F,0x12,0x46,0x3D,0x12,0x31,0x6F,0x90,0x3F,0xFD,0xE0,
-
0xB4,0x02,0x15,0xE5,0x91,0x30,0xE4,0x05,0x75,0x9E,0x55,0x80,0xF6,0x12,0x4C,0xDC,
-
0x40,0x04,0xC2,0x84,0x80,0x02,0xD2,0x84,0xE5,0x91,0x30,0xE4,0x03,0x02,0x37,0x31,
-
0x12,0x4C,0xDC,0x40,0x4F,0xE4,0x90,0x12,0x3B,0xF0,0xA3,0xF0,0xB2,0x17,0x75,0x8A,
-
0x8B,0xF5,0x8B,0x30,0x17,0x18,0x90,0x13,0x85,0xF0,0x90,0x13,0x85,0xE0,0xFF,0x24,
-
0x00,0xF5,0x82,0xE4,0x34,0x8F,0x12,0x4C,0xC4,0xB4,0x3C,0xEE,0x80,0x17,0xE4,0x90,
-
0x13,0x85,0xF0,0x90,0x13,0x85,0xE0,0xFF,0x24,0x78,0xF5,0x82,0xE4,0x34,0x8F,0x12,
-
0x4C,0xC4,0xB4,0x3C,0xEE,0x90,0x3F,0xFD,0xE0,0x64,0x01,0x70,0x72,0xC2,0x84,0x7F,
-
0x32,0xFE,0x80,0x56,0x30,0x0E,0x68,0x30,0x09,0x16,0x90,0x3F,0xFD,0xE0,0xB4,0x01,
-
0x0B,0xC2,0x84,0x7F,0x32,0x7E,0x00,0x12,0x4D,0xD3,0xD2,0x84,0xC2,0x09,0x80,0x4F,
-
0x90,0x12,0x65,0xE4,0xF0,0xA3,0x74,0x64,0xF0,0x7F,0x19,0x7E,0x00,0x12,0x4D,0xD3,
-
0x90,0x12,0x66,0xE0,0x24,0xFF,0xF0,0x90,0x12,0x65,0xE0,0x34,0xFF,0xF0,0x75,0x9E,
-
0x55,0x30,0x0E,0x0D,0xD3,0xA3,0xE0,0x94,0x00,0x90,0x12,0x65,0xE0,0x94,0x00,0x50,
-
0xD8,0x30,0x0E,0x1B,0xC2,0x84,0x7F,0x19,0x7E,0x00,0x12,0x4D,0xD3,0xD2,0x84,0x80,
-
0x0E,0x12,0x4C,0xDC,0x40,0x09,0x30,0x0E,0x04,0xD2,0x0D,0x80,0x02,0xC2,0x0D,0xC2,
-
0x18,0x20,0x07,0x03,0x02,0x38,0x13,0xC2,0x07,0xC2,0x05,0x90,0x8F,0xFF,0xE0,0xB4,
-
0xAF,0x21,0xE4,0xF0,0x12,0x4A,0xE4,0x75,0xA1,0x10,0x90,0xF1,0x42,0xE0,0x44,0x10,
-
0xF0,0x7F,0x02,0x7E,0x00,0x12,0x4D,0x7A,0x75,0x87,0x02,0x75,0x97,0x55,0x00,0x00,
-
0x02,0x35,0x75,0x90,0x8F,0xFF,0xE0,0x64,0xAE,0x70,0x03,0x02,0x35,0x75,0x90,0x8F,
-
0xFF,0xE0,0xB4,0xBF,0x05,0xD2,0x05,0x02,0x35,0x75,0x90,0x8F,0xFF,0xE0,0xB4,0xCC,
-
0x13,0x12,0x38,0x1E,0xD2,0x84,0x7F,0x64,0x7E,0x00,0x12,0x4D,0xD3,0x12,0x38,0x1E,
-
0xD2,0x84,0x80,0x67,0x90,0x8F,0xFF,0xE0,0xB4,0xC3,0x05,0xD2,0x01,0x02,0x35,0x75,
-
0x90,0x8F,0xFF,0xE0,0x64,0xC5,0x70,0x37,0xF0,0x90,0x8F,0xFD,0x74,0xAA,0xF0,0xD2,
-
0x15,0x12,0x4C,0xEC,0x90,0xF1,0x0A,0xF0,0x90,0xF1,0x1F,0x74,0x14,0xF0,0x90,0xF1,
-
0x22,0xF0,0xE4,0x90,0xF1,0x1C,0xF0,0x75,0x9E,0x55,0x90,0xF0,0xC5,0xE0,0x44,0x01,
-
0xF0,0x12,0x3D,0xFB,0x90,0xF0,0xC4,0x74,0x01,0xF0,0xC2,0x0C,0x02,0x35,0x75,0x90,
-
0x8F,0xFF,0xE0,0xB4,0xD1,0x07,0xD2,0x04,0x12,0x27,0x30,0x80,0x0E,0x90,0x8F,0xFF,
-
0xE0,0x64,0xE1,0x60,0x03,0x02,0x35,0x75,0x12,0x3D,0x2A,0xE4,0x90,0x8F,0xFF,0xF0,
-
0x02,0x35,0x75,0x20,0x08,0x03,0x02,0x35,0x75,0xC2,0x08,0x02,0x35,0x75,0xC2,0x84,
-
0x7F,0x64,0x7E,0x00,0x12,0x4D,0xD3,0x22,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,
-
0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0x22,0x90,0xF0,0x6F,0xF0,
-
0x90,0xF0,0x72,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x71,0xF0,0x90,0xF0,0x74,0x74,0x08,
-
0xF0,0xE4,0x90,0xF0,0x73,0xF0,0x90,0xF0,0x76,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x75,
-
0xF0,0x90,0xF0,0x78,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x77,0xF0,0x90,0xF0,0x7A,0x74,
-
0x08,0xF0,0xE4,0x90,0xF0,0x79,0xF0,0x90,0xF0,0x7C,0x74,0x08,0xF0,0xE4,0x90,0xF0,
-
0x7B,0xF0,0x90,0xF0,0x7E,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x7D,0xF0,0x90,0xF0,0x80,
-
0x74,0x08,0xF0,0xE4,0x90,0xF0,0x7F,0xF0,0x90,0xF0,0x82,0x74,0x08,0xF0,0xE4,0x90,
-
0xF0,0x81,0xF0,0x90,0xF0,0x84,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x83,0xF0,0x90,0xF0,
-
0x86,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x85,0xF0,0x90,0xF0,0x88,0x74,0x08,0xF0,0xE4,
-
0x90,0xF0,0x87,0xF0,0x90,0xF0,0x8A,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x89,0xF0,0x90,
-
0xF0,0x8C,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x8B,0xF0,0x90,0xF0,0x8E,0x74,0x08,0xF0,
-
0xE4,0x90,0xF0,0x8D,0xF0,0x90,0xF0,0x90,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x8F,0xF0,
-
0x90,0xF0,0x92,0x22,0xF0,0x90,0xF0,0x32,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x31,0xF0,
-
0x90,0xF0,0x34,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x33,0xF0,0x90,0xF0,0x36,0x74,0x08,
-
0xF0,0xE4,0x90,0xF0,0x35,0xF0,0x90,0xF0,0x38,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x37,
-
0xF0,0x90,0xF0,0x3A,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x39,0xF0,0x90,0xF0,0x3C,0x74,
-
0x08,0xF0,0xE4,0x90,0xF0,0x3B,0xF0,0x90,0xF0,0x3E,0x74,0x08,0xF0,0xE4,0x90,0xF0,
-
0x3D,0xF0,0x90,0xF0,0x40,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x3F,0xF0,0x90,0xF0,0x42,
-
0x74,0x08,0xF0,0xE4,0x90,0xF0,0x41,0xF0,0x90,0xF0,0x44,0x74,0x08,0xF0,0xE4,0x90,
-
0xF0,0x43,0xF0,0x90,0xF0,0x46,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x45,0xF0,0x90,0xF0,
-
0x48,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x47,0xF0,0x90,0xF0,0x4A,0x74,0x08,0xF0,0xE4,
-
0x90,0xF0,0x49,0xF0,0x90,0xF0,0x4C,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x4B,0xF0,0x90,
-
0xF0,0x4E,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x4D,0xF0,0x90,0xF0,0x50,0x22,0xF0,0x90,
-
0xF0,0xAE,0x74,0x08,0xF0,0xE4,0x90,0xF0,0xAD,0xF0,0x90,0xF0,0xB0,0x74,0x08,0xF0,
-
0xE4,0x90,0xF0,0xAF,0xF0,0x90,0xF0,0xB2,0x74,0x08,0xF0,0xE4,0x90,0xF0,0xB1,0xF0,
-
0x90,0xF0,0xB4,0x74,0x08,0xF0,0xE4,0x90,0xF0,0xB3,0xF0,0x90,0xF0,0xB6,0x74,0x08,
-
0xF0,0xE4,0x90,0xF0,0xB5,0xF0,0x90,0xF0,0xB8,0x74,0x08,0xF0,0xE4,0x90,0xF0,0xB7,
-
0xF0,0x90,0xF0,0xBA,0x74,0x08,0xF0,0xE4,0x90,0xF0,0xB9,0xF0,0x90,0xF0,0xBC,0x74,
-
0x08,0xF0,0xE4,0x90,0xF0,0xBB,0xF0,0x90,0xF0,0xBE,0x74,0x08,0xF0,0xE4,0x90,0xF0,
-
0xBD,0xF0,0x90,0xF0,0xC0,0x74,0x08,0xF0,0xE4,0x90,0xF0,0xBF,0xF0,0x90,0xF1,0x06,
-
0x22,0xF0,0xE4,0x90,0xF0,0x01,0xF0,0x90,0xF0,0x04,0x74,0x08,0xF0,0xE4,0x90,0xF0,
-
0x03,0xF0,0x90,0xF0,0x06,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x05,0xF0,0x90,0xF0,0x08,
-
0x74,0x08,0xF0,0xE4,0x90,0xF0,0x07,0xF0,0x90,0xF0,0x0A,0x74,0x08,0xF0,0xE4,0x90,
-
0xF0,0x09,0xF0,0x90,0xF0,0x0C,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x0B,0xF0,0x90,0xF0,
-
0x0E,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x0D,0xF0,0x90,0xF0,0x10,0x22,0x90,0xF1,0x0E,
-
0xF0,0x90,0xF1,0x0F,0xF0,0x90,0xF1,0x10,0xF0,0x90,0xF1,0x11,0xF0,0x90,0xF1,0x12,
-
0xF0,0x90,0xF1,0x13,0xF0,0x90,0xF1,0x14,0x22,0x90,0xF0,0x12,0xF0,0x90,0xF0,0x11,
-
0x74,0x01,0xF0,0x90,0xF0,0x14,0x22,0x90,0xF0,0x16,0xF0,0x90,0xF0,0x15,0x74,0x03,
-
0xF0,0x90,0xF0,0x18,0x22,0x90,0xF0,0xA8,0xF0,0x90,0xF0,0xA7,0x74,0x02,0xF0,0x90,
-
0xF0,0xAA,0x22,0xAD,0x07,0x2D,0xF5,0x82,0xE4,0x22,0x90,0x19,0x40,0x74,0x02,0xF0,
-
0x90,0x19,0x41,0x74,0x02,0xF0,0x90,0x19,0x42,0x74,0x02,0xF0,0x90,0x19,0x43,0x74,
-
0x02,0xF0,0x90,0x19,0x44,0x74,0x02,0xF0,0x90,0x19,0x45,0x74,0x02,0xF0,0x90,0x19,
-
0x46,0x74,0x02,0xF0,0x90,0x19,0x47,0x74,0x03,0xF0,0x90,0x19,0x48,0x74,0x03,0xF0,
-
0x90,0x19,0x49,0x74,0x03,0xF0,0x90,0x19,0x4A,0x74,0x03,0xF0,0x90,0x19,0x4B,0x74,
-
0x03,0xF0,0x90,0x19,0x4C,0x74,0x03,0xF0,0x90,0x19,0x4D,0x74,0x03,0xF0,0x90,0x19,
-
0x4E,0x74,0x03,0xF0,0x90,0x19,0x4F,0x74,0x03,0xF0,0x90,0x19,0x50,0x74,0x03,0xF0,
-
0x90,0x19,0x51,0x74,0x03,0xF0,0x90,0x19,0x52,0x74,0x03,0xF0,0x90,0x19,0x53,0x74,
-
0x03,0xF0,0x90,0x19,0x54,0x74,0x03,0xF0,0x90,0x19,0x55,0x74,0x03,0xF0,0x90,0x19,
-
0x56,0x74,0x03,0xF0,0x90,0x19,0x57,0x74,0x03,0xF0,0x90,0x19,0x58,0x74,0x02,0xF0,
-
0x90,0x19,0x59,0x74,0x02,0xF0,0x90,0x19,0x5A,0x74,0x02,0xF0,0x90,0x19,0x5B,0x74,
-
0x02,0xF0,0x90,0x19,0x5C,0x74,0x02,0xF0,0x90,0x19,0x5D,0x74,0x02,0xF0,0x90,0x19,
-
0x5E,0x74,0x02,0xF0,0x90,0x19,0x5F,0x74,0x02,0xF0,0x90,0x19,0x60,0x74,0x02,0xF0,
-
0x90,0x19,0x61,0x74,0x02,0xF0,0x90,0x19,0x62,0x74,0x02,0xF0,0x90,0x19,0x63,0x74,
-
0x02,0xF0,0x90,0x19,0x64,0x74,0x02,0xF0,0x90,0x19,0x65,0x74,0x02,0xF0,0x90,0x19,
-
0x66,0x74,0x02,0xF0,0x90,0x19,0x67,0x74,0x03,0xF0,0x90,0x19,0x68,0x74,0x03,0xF0,
-
0x90,0x19,0x69,0x74,0x03,0xF0,0x90,0x19,0x6A,0x74,0x03,0xF0,0x90,0x19,0x6B,0x74,
-
0x03,0xF0,0x90,0x19,0x6C,0x74,0x03,0xF0,0x90,0x19,0x6D,0x74,0x03,0xF0,0x90,0x19,
-
0x6E,0x74,0x03,0xF0,0x90,0x19,0x6F,0x74,0x03,0xF0,0x90,0x19,0x70,0x74,0x03,0xF0,
-
0x90,0x19,0x71,0x74,0x03,0xF0,0x90,0x19,0x72,0x74,0x01,0xF0,0x90,0x19,0x73,0x74,
-
0x01,0xF0,0x90,0x19,0x74,0x74,0x01,0xF0,0x90,0x19,0x75,0x74,0x01,0xF0,0x90,0x19,
-
0x76,0x74,0x01,0xF0,0x90,0x19,0x77,0x74,0x01,0xF0,0x90,0x19,0x78,0x74,0x02,0xF0,
-
0x90,0x19,0x79,0x74,0x02,0xF0,0x90,0x19,0x7A,0x74,0x02,0xF0,0x90,0x19,0x7B,0x74,
-
0x02,0xF0,0x90,0x19,0x7C,0x74,0x02,0xF0,0x90,0x19,0x7D,0x74,0x02,0xF0,0x90,0x19,
-
0x7E,0x74,0x02,0xF0,0x90,0x19,0x7F,0x74,0x02,0xF0,0x90,0x19,0x80,0x74,0x02,0xF0,
-
0x90,0x19,0x81,0x74,0x02,0xF0,0x90,0x19,0x82,0x74,0x02,0xF0,0x90,0x19,0x83,0x74,
-
0x02,0xF0,0x90,0x19,0x84,0x74,0x02,0xF0,0x90,0x19,0x85,0x74,0x02,0xF0,0x90,0x19,
-
0x86,0x74,0x02,0xF0,0x90,0x19,0x87,0x74,0x02,0xF0,0x90,0x19,0x88,0x74,0x01,0xF0,
-
0x90,0x19,0x89,0x74,0x01,0xF0,0x90,0x19,0x8A,0x74,0x01,0xF0,0x90,0x19,0x8B,0x74,
-
0x01,0xF0,0x90,0x19,0x8C,0x74,0x01,0xF0,0x90,0x19,0x8D,0x74,0x01,0xF0,0x90,0x19,
-
0x8E,0x74,0x01,0xF0,0x90,0x19,0x8F,0x74,0x01,0xF0,0x90,0x19,0x90,0x74,0x01,0xF0,
-
0x90,0x19,0x91,0x74,0x01,0xF0,0x90,0x19,0x92,0x74,0x01,0xF0,0x90,0x19,0x93,0x74,
-
0x01,0xF0,0x90,0x19,0x94,0x74,0x01,0xF0,0x90,0x19,0x95,0x74,0x01,0xF0,0x90,0x19,
-
0x96,0x74,0x02,0xF0,0x90,0x19,0x97,0x74,0x02,0xF0,0x90,0x19,0x98,0x74,0x02,0xF0,
-
0x90,0x19,0x99,0x74,0x02,0xF0,0x90,0x19,0x9A,0x74,0x02,0xF0,0x90,0x19,0x9B,0x74,
-
0x02,0xF0,0x90,0x19,0x9C,0x74,0x02,0xF0,0x90,0x19,0x9D,0x74,0x02,0xF0,0x90,0x19,
-
0x9E,0x74,0x02,0xF0,0x90,0x19,0x9F,0x74,0x02,0xF0,0x75,0x9E,0x55,0xE4,0xFF,0xFE,
-
0x12,0x4A,0x06,0xB4,0x01,0x09,0x12,0x49,0xE9,0x74,0x01,0x12,0x49,0xF6,0x0F,0x12,
-
0x4A,0x06,0xB4,0x03,0x09,0x12,0x49,0xE9,0x74,0x03,0x12,0x49,0xF6,0x0F,0x0E,0xEE,
-
0xB4,0x60,0xDD,0xAE,0x07,0xEE,0xC3,0x94,0x60,0x50,0x0E,0xEE,0x12,0x49,0xEA,0x74,
-
0x1F,0xF0,0xEE,0x12,0x49,0xF8,0x0E,0x80,0xEC,0x22,0xE4,0xF5,0x0C,0xF5,0x0D,0xF5,
-
0x08,0xF5,0x09,0xB2,0x86,0xB2,0x86,0xF5,0x0E,0xF5,0x0F,0xB2,0x85,0x75,0x9E,0x55,
-
0xE5,0x0F,0xAE,0x0E,0x78,0x07,0xC3,0x33,0xCE,0x33,0xCE,0xD8,0xF9,0xF5,0x09,0x8E,
-
0x08,0xE4,0xF5,0x10,0xF5,0x11,0xE5,0x08,0xF5,0x0A,0xE5,0x09,0xF5,0x0B,0xE4,0xF5,
-
0x14,0xF5,0x12,0xF5,0x13,0xAF,0x09,0xAE,0x08,0x12,0x4E,0x15,0xEF,0x25,0x14,0xF5,
-
0x14,0x05,0x09,0xE5,0x09,0x70,0x02,0x05,0x08,0x05,0x13,0xE5,0x13,0x70,0x02,0x05,
-
0x12,0xC3,0x94,0x08,0xE5,0x12,0x64,0x80,0x94,0x80,0x40,0xD9,0xE5,0x14,0x25,0x0A,
-
0x25,0x0B,0x24,0x08,0xF5,0x14,0xF4,0x04,0xF5,0x14,0x25,0x0D,0xF5,0x0D,0xE4,0x35,
-
0x0C,0xF5,0x0C,0x05,0x11,0xE5,0x11,0x70,0x02,0x05,0x10,0xC3,0x94,0x10,0xE5,0x10,
-
0x64,0x80,0x94,0x80,0x40,0xA0,0x05,0x0F,0xE5,0x0F,0x70,0x02,0x05,0x0E,0xC3,0xE5,
-
0x0E,0x64,0x80,0x94,0x81,0x50,0x03,0x02,0x3D,0x3B,0xE5,0x0C,0x90,0x8E,0x0E,0xF0,
-
0xE5,0x0D,0x90,0x8E,0x0F,0xF0,0x90,0x8E,0x0D,0x74,0xAA,0xF0,0xB2,0x86,0xB2,0x86,
-
0x75,0x9E,0x55,0x80,0xFB,0xC0,0xE0,0xC0,0x83,0xC0,0x82,0xD2,0x0C,0x90,0xF0,0xC4,
-
0xE4,0xF0,0xC2,0xD8,0xD0,0x82,0xD0,0x83,0xD0,0xE0,0x32,0xD2,0xD8,0x22,0x32,0x32,
-
0x04,0x00,0x03,0x00,0x10,0x21,0x4E,0x01,0x0A,0x40,0x1C,0x14,0x01,0x00,0x00,0x00,
-
0x00,0x01,0x08,0x01,0x01,0x00,0x80,0x00,0xFA,0x13,0x88,0x00,0x01,0x05,0x01,0x01,
-
0x0A,0x01,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x66,0x33,0x30,0x37,0x26,0x66,0x33,0x31,0x37,0x26,0x66,0x33,0x31,0x36,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x64,0x77,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0xE7,0x09,0xF6,0x08,0xDF,0xFA,0x80,0x46,0xE7,0x09,0xF2,0x08,0xDF,0xFA,0x80,0x3E,
-
0x88,0x82,0x8C,0x83,0xE7,0x09,0xF0,0xA3,0xDF,0xFA,0x80,0x32,0xE3,0x09,0xF6,0x08,
-
0xDF,0xFA,0x80,0x78,0xE3,0x09,0xF2,0x08,0xDF,0xFA,0x80,0x70,0x88,0x82,0x8C,0x83,
-
0xE3,0x09,0xF0,0xA3,0xDF,0xFA,0x80,0x64,0x89,0x82,0x8A,0x83,0xE0,0xA3,0xF6,0x08,
-
0xDF,0xFA,0x80,0x58,0x89,0x82,0x8A,0x83,0xE0,0xA3,0xF2,0x08,0xDF,0xFA,0x80,0x4C,
-
0x80,0xD2,0x80,0xFA,0x80,0xC6,0x80,0xD4,0x80,0x69,0x80,0xF2,0x80,0x33,0x80,0x10,
-
0x80,0xA6,0x80,0xEA,0x80,0x9A,0x80,0xA8,0x80,0xDA,0x80,0xE2,0x80,0xCA,0x80,0x33,
-
0x89,0x82,0x8A,0x83,0xEC,0xFA,0xE4,0x93,0xA3,0xC8,0xC5,0x82,0xC8,0xCC,0xC5,0x83,
-
0xCC,0xF0,0xA3,0xC8,0xC5,0x82,0xC8,0xCC,0xC5,0x83,0xCC,0xDF,0xE9,0xDE,0xE7,0x80,
-
0x0D,0x89,0x82,0x8A,0x83,0xE4,0x93,0xA3,0xF6,0x08,0xDF,0xF9,0xEC,0xFA,0xA9,0xF0,
-
0xED,0xFB,0x22,0x89,0x82,0x8A,0x83,0xEC,0xFA,0xE0,0xA3,0xC8,0xC5,0x82,0xC8,0xCC,
-
0xC5,0x83,0xCC,0xF0,0xA3,0xC8,0xC5,0x82,0xC8,0xCC,0xC5,0x83,0xCC,0xDF,0xEA,0xDE,
-
0xE8,0x80,0xDB,0x89,0x82,0x8A,0x83,0xE4,0x93,0xA3,0xF2,0x08,0xDF,0xF9,0x80,0xCC,
-
0x88,0xF0,0xEF,0x60,0x01,0x0E,0x4E,0x60,0xC3,0x88,0xF0,0xED,0x24,0x02,0xB4,0x04,
-
0x00,0x50,0xB9,0xF5,0x82,0xEB,0x24,0x02,0xB4,0x04,0x00,0x50,0xAF,0x23,0x23,0x45,
-
0x82,0x23,0x90,0x3F,0x80,0x73,0xBB,0x01,0x06,0x89,0x82,0x8A,0x83,0xF0,0x22,0x50,
-
0x02,0xF7,0x22,0xBB,0xFE,0x01,0xF3,0x22,0xEF,0x8D,0xF0,0xA4,0xA8,0xF0,0xCF,0x8C,
-
0xF0,0xA4,0x28,0xCE,0x8D,0xF0,0xA4,0x2E,0xFE,0x22,0xBC,0x00,0x0B,0xBE,0x00,0x29,
-
0xEF,0x8D,0xF0,0x84,0xFF,0xAD,0xF0,0x22,0xE4,0xCC,0xF8,0x75,0xF0,0x08,0xEF,0x2F,
-
0xFF,0xEE,0x33,0xFE,0xEC,0x33,0xFC,0xEE,0x9D,0xEC,0x98,0x40,0x05,0xFC,0xEE,0x9D,
-
0xFE,0x0F,0xD5,0xF0,0xE9,0xE4,0xCE,0xFD,0x22,0xED,0xF8,0xF5,0xF0,0xEE,0x84,0x20,
-
0xD2,0x1C,0xFE,0xAD,0xF0,0x75,0xF0,0x08,0xEF,0x2F,0xFF,0xED,0x33,0xFD,0x40,0x07,
-
0x98,0x50,0x06,0xD5,0xF0,0xF2,0x22,0xC3,0x98,0xFD,0x0F,0xD5,0xF0,0xEA,0x22,0xC2,
-
0xD5,0xEC,0x30,0xE7,0x09,0xB2,0xD5,0xE4,0xC3,0x9D,0xFD,0xE4,0x9C,0xFC,0xEE,0x30,
-
0xE7,0x15,0xB2,0xD5,0xE4,0xC3,0x9F,0xFF,0xE4,0x9E,0xFE,0x12,0x40,0x4A,0xC3,0xE4,
-
0x9D,0xFD,0xE4,0x9C,0xFC,0x80,0x03,0x12,0x40,0x4A,0x30,0xD5,0x07,0xC3,0xE4,0x9F,
-
0xFF,0xE4,0x9E,0xFE,0x22,0xC5,0xF0,0xF8,0xA3,0xE0,0x28,0xF0,0xC5,0xF0,0xF8,0xE5,
-
0x82,0x15,0x82,0x70,0x02,0x15,0x83,0xE0,0x38,0xF0,0x22,0xE8,0x8F,0xF0,0xA4,0xCC,
-
0x8B,0xF0,0xA4,0x2C,0xFC,0xE9,0x8E,0xF0,0xA4,0x2C,0xFC,0x8A,0xF0,0xED,0xA4,0x2C,
-
0xFC,0xEA,0x8E,0xF0,0xA4,0xCD,0xA8,0xF0,0x8B,0xF0,0xA4,0x2D,0xCC,0x38,0x25,0xF0,
-
0xFD,0xE9,0x8F,0xF0,0xA4,0x2C,0xCD,0x35,0xF0,0xFC,0xEB,0x8E,0xF0,0xA4,0xFE,0xA9,
-
0xF0,0xEB,0x8F,0xF0,0xA4,0xCF,0xC5,0xF0,0x2E,0xCD,0x39,0xFE,0xE4,0x3C,0xFC,0xEA,
-
0xA4,0x2D,0xCE,0x35,0xF0,0xFD,0xE4,0x3C,0xFC,0x22,0xEB,0x9F,0xF5,0xF0,0xEA,0x9E,
-
0x42,0xF0,0xE9,0x9D,0x42,0xF0,0xE8,0x9C,0x45,0xF0,0x22,0xE8,0x60,0x0F,0xEC,0xC3,
-
0x13,0xFC,0xED,0x13,0xFD,0xEE,0x13,0xFE,0xEF,0x13,0xFF,0xD8,0xF1,0x22,0xEC,0xF0,
-
0xA3,0xED,0xF0,0xA3,0xEE,0xF0,0xA3,0xEF,0xF0,0x22,0xA8,0x82,0x85,0x83,0xF0,0xD0,
-
0x83,0xD0,0x82,0x12,0x41,0x81,0x12,0x41,0x81,0x12,0x41,0x81,0x12,0x41,0x81,0xE4,
-
0x73,0xE4,0x93,0xA3,0xC5,0x83,0xC5,0xF0,0xC5,0x83,0xC8,0xC5,0x82,0xC8,0xF0,0xA3,
-
0xC5,0x83,0xC5,0xF0,0xC5,0x83,0xC8,0xC5,0x82,0xC8,0x22,0xA4,0x25,0x82,0xF5,0x82,
-
0xE5,0xF0,0x35,0x83,0xF5,0x83,0x22,0xE4,0x90,0x88,0xB0,0xF0,0x90,0x13,0x8B,0xF0,
-
0x90,0x13,0x8B,0xE0,0xFF,0xC3,0x94,0x50,0x50,0x10,0x74,0x60,0x2F,0x12,0x24,0xA4,
-
0xE4,0xF0,0x90,0x13,0x8B,0xE0,0x04,0xF0,0x80,0xE6,0xD2,0xB3,0x30,0xB3,0x05,0x75,
-
0x9E,0x55,0x80,0xF8,0xC2,0xDB,0xC2,0x11,0xE4,0x90,0x13,0x8B,0xF0,0x90,0xF2,0xA8,
-
0xE0,0xFF,0x90,0x13,0x8B,0xE0,0xFE,0xC3,0x9F,0x40,0x03,0x02,0x43,0x54,0x74,0x00,
-
0x2E,0x12,0x20,0x14,0xB5,0x06,0x06,0x90,0x88,0xB0,0xE0,0x04,0xF0,0x12,0x22,0x54,
-
0x24,0x02,0xF5,0x82,0xE5,0xF0,0x34,0x18,0xF5,0x83,0xE0,0x90,0x88,0xC3,0x12,0x25,
-
0xF6,0x24,0x01,0xF5,0x82,0xE5,0xF0,0x34,0x18,0xF5,0x83,0xE0,0x90,0x88,0xC4,0x12,
-
0x22,0x53,0x24,0x00,0xF5,0x82,0xE5,0xF0,0x34,0x18,0xF5,0x83,0xE0,0x90,0x88,0xC5,
-
0x12,0x25,0xF6,0x24,0x02,0xF5,0x82,0xE5,0xF0,0x34,0x30,0xF5,0x83,0xE0,0x90,0x88,
-
0xC7,0x12,0x22,0x53,0x24,0x01,0xF5,0x82,0xE5,0xF0,0x34,0x30,0xF5,0x83,0xE0,0x90,
-
0x88,0xC8,0x12,0x25,0xF6,0x24,0x00,0xF5,0x82,0xE5,0xF0,0x34,0x30,0xF5,0x83,0xE0,
-
0x90,0x88,0xC9,0x12,0x22,0x53,0x24,0x52,0xF5,0x82,0xE5,0xF0,0x34,0x82,0xF5,0x83,
-
0xE0,0x90,0x88,0xCE,0x12,0x25,0xF6,0x24,0x51,0xF5,0x82,0xE5,0xF0,0x34,0x82,0xF5,
-
0x83,0xE0,0x90,0x88,0xCF,0x12,0x22,0x53,0x24,0x50,0xF5,0x82,0xE5,0xF0,0x34,0x82,
-
0xF5,0x83,0xE0,0x90,0x88,0xD0,0xF0,0x74,0x00,0x2F,0x12,0x20,0x14,0x12,0x24,0xA2,
-
0xE0,0x90,0x13,0x8B,0x70,0x4C,0xE0,0xFB,0x12,0x20,0x12,0x12,0x24,0xA2,0x74,0x01,
-
0xF0,0x90,0x88,0xC2,0x12,0x1E,0xC9,0x74,0x00,0x2B,0x12,0x20,0x14,0x12,0x25,0x9A,
-
0x12,0x41,0x5E,0x90,0x88,0xC6,0x12,0x1E,0xC9,0x90,0x13,0x8B,0xE0,0xFB,0x12,0x20,
-
0x12,0x12,0x25,0xA9,0x12,0x41,0x5E,0x90,0x88,0xCD,0x12,0x1E,0xC9,0x74,0x00,0x2B,
-
0x12,0x20,0x14,0x12,0x22,0x62,0x12,0x1F,0xE4,0x12,0x24,0x07,0x12,0x21,0xB4,0x02,
-
0x43,0x4B,0x12,0x20,0x11,0x12,0x25,0x9A,0xC0,0x83,0xC0,0x82,0x12,0x1E,0xC9,0x90,
-
0x88,0xC2,0x12,0x22,0x3B,0xD0,0x82,0xD0,0x83,0x12,0x41,0x5E,0x12,0x20,0x0E,0x12,
-
0x25,0xA9,0xC0,0x83,0xC0,0x82,0x12,0x1E,0xC9,0x90,0x88,0xC6,0x12,0x22,0x3B,0xD0,
-
0x82,0xD0,0x83,0x12,0x41,0x5E,0x12,0x20,0x0E,0x12,0x22,0x62,0xC0,0x83,0xC0,0x82,
-
0x12,0x1E,0xC9,0x90,0x88,0xCD,0x12,0x22,0x3B,0xD0,0x82,0xD0,0x83,0x12,0x1F,0xE4,
-
0x12,0x24,0x07,0xF5,0x83,0xEE,0x8F,0xF0,0x12,0x40,0xD5,0x90,0x13,0x8B,0xE0,0x04,
-
0xF0,0x02,0x41,0xDD,0x22,0xE4,0x90,0x13,0x8C,0xF0,0x90,0x13,0x8B,0xF0,0x90,0xF2,
-
0xA8,0xE0,0xFF,0x90,0x13,0x8B,0xE0,0xFE,0xC3,0x9F,0x40,0x03,0x02,0x44,0xD4,0x74,
-
0x60,0x2E,0x12,0x24,0xA4,0xE0,0x64,0x01,0x60,0x03,0x02,0x44,0xB9,0xEE,0x12,0x24,
-
0x07,0x12,0x20,0x30,0xD3,0x94,0xFF,0xEE,0x94,0x00,0x40,0x0C,0x90,0x13,0x8C,0xE0,
-
0x12,0x22,0x97,0x74,0xFF,0xF0,0x80,0x16,0x90,0x13,0x8B,0xE0,0x12,0x24,0x07,0xF5,
-
0x83,0xE0,0xA3,0xE0,0xFF,0x90,0x13,0x8C,0xE0,0x12,0x22,0x97,0xEF,0xF0,0x12,0x22,
-
0x5E,0x12,0x1E,0xC9,0x78,0x02,0x12,0x41,0x4B,0xE4,0x7B,0xFF,0xFA,0x12,0x23,0x31,
-
0x50,0x08,0x12,0x24,0xAC,0x74,0xFF,0xF0,0x80,0x10,0x12,0x22,0x5E,0x12,0x1E,0xC9,
-
0x78,0x02,0x12,0x41,0x4B,0x12,0x24,0xAC,0xEF,0xF0,0x85,0x1A,0xAF,0x90,0x13,0x8B,
-
0x12,0x22,0x57,0x24,0x01,0xF5,0x82,0xE5,0xF0,0x34,0x84,0x12,0x26,0xA1,0x24,0x02,
-
0xF5,0x82,0xE5,0xF0,0x34,0x84,0xF5,0x83,0xE0,0xF5,0xAA,0x90,0x13,0x8B,0x12,0x22,
-
0x57,0x24,0x03,0xF5,0x82,0xE5,0xF0,0x34,0x84,0xF5,0x83,0xE0,0xF5,0xAB,0x75,0xF0,
-
0x04,0xEF,0xA4,0x24,0x81,0xF5,0x82,0xE5,0xF0,0x34,0x86,0xF5,0x83,0xE0,0xF5,0xA2,
-
0x90,0x13,0x8B,0x12,0x22,0x57,0x24,0x82,0xF5,0x82,0xE5,0xF0,0x34,0x86,0xF5,0x83,
-
0xE0,0xF5,0xA3,0x75,0xF0,0x04,0xEF,0xA4,0x24,0x83,0xF5,0x82,0xE5,0xF0,0x34,0x86,
-
0xF5,0x83,0xE0,0xF5,0xA4,0xD2,0xB0,0x85,0x1B,0xAF,0x90,0x13,0x8B,0x12,0x22,0x57,
-
0x24,0x41,0xF5,0x82,0xE5,0xF0,0x34,0x85,0x12,0x26,0xA1,0x24,0x42,0xF5,0x82,0xE5,
-
0xF0,0x34,0x85,0xF5,0x83,0xE0,0xF5,0xAA,0x90,0x13,0x8B,0xE0,0x75,0xF0,0x04,0xA4,
-
0x24,0x43,0xF5,0x82,0xE5,0xF0,0x34,0x85,0xF5,0x83,0xE0,0xF5,0xAB,0x20,0xB0,0x06,
-
0x30,0x11,0x03,0x20,0xDA,0x05,0x75,0x9E,0x55,0x80,0xF2,0x12,0x22,0x71,0x12,0x25,
-
0xB8,0x12,0x1E,0x62,0x12,0x21,0xB4,0xD2,0xB0,0x20,0xB0,0x06,0x30,0x11,0x03,0x20,
-
0xDA,0x05,0x75,0x9E,0x55,0x80,0xF2,0x12,0x22,0x71,0x12,0x25,0xB8,0x12,0x24,0x48,
-
0x12,0x21,0xB4,0x90,0x13,0x8C,0xE0,0x04,0xF0,0x90,0x13,0x8C,0xE0,0xFF,0x65,0x17,
-
0x60,0x12,0x90,0x88,0xB0,0xE0,0xFE,0xEF,0x6E,0x60,0x09,0x90,0x13,0x8B,0xE0,0x04,
-
0xF0,0x02,0x43,0x5E,0x90,0x13,0x8C,0xE0,0x90,0x88,0xB0,0xF0,0x22,0xE4,0xF5,0x99,
-
0x75,0x96,0x03,0x75,0x9E,0x55,0xC2,0x04,0xC2,0x0B,0xC2,0x0C,0xC2,0x11,0xC2,0x18,
-
0xC2,0x07,0xC2,0x08,0x90,0x12,0x5B,0x12,0x38,0x28,0x90,0x12,0x51,0x12,0x38,0x28,
-
0x90,0x13,0x5B,0x12,0x38,0x28,0xA3,0x12,0x38,0x28,0x90,0x13,0x70,0x12,0x38,0x28,
-
0xD2,0xB1,0xC2,0xB6,0xC2,0xB7,0x75,0xA0,0x02,0xF5,0xAE,0x90,0xF0,0xC4,0xF0,0x90,
-
0x8F,0xF0,0xF0,0xFF,0xFE,0x74,0xE5,0x12,0x3A,0xA3,0x34,0x88,0xF5,0x83,0xE4,0xF0,
-
0x74,0xA0,0x2D,0xF5,0x82,0xE4,0x34,0x37,0xF5,0x83,0xE4,0xF0,0x0F,0xBF,0x00,0x01,
-
0x0E,0xEF,0x64,0x14,0x4E,0x70,0xDE,0xE4,0x90,0x88,0xC0,0xF0,0x90,0x88,0xC1,0xF0,
-
0xF5,0xDC,0xF5,0xDD,0xF5,0xDE,0xF5,0xD9,0xF5,0xDA,0xF5,0xDB,0x90,0x88,0xC2,0xF0,
-
0x90,0x88,0xC6,0xF0,0x90,0x88,0xCD,0xF0,0xC2,0x0E,0xC2,0x0D,0xC2,0x17,0x75,0x8A,
-
0x8F,0xF5,0x8B,0x90,0x8F,0xFF,0xF0,0xC2,0x05,0xC2,0x19,0x75,0x17,0x0A,0x75,0x1C,
-
0x0A,0x90,0x8B,0x7C,0x74,0x0A,0xF0,0x90,0x8B,0x7D,0x74,0x01,0xF0,0x90,0x8B,0x7E,
-
0x74,0x05,0xF0,0x75,0x1A,0x40,0x75,0x1B,0x40,0x90,0x8B,0x78,0x14,0xF0,0xA3,0xE4,
-
0xF0,0x90,0x8B,0x7A,0x74,0x03,0xF0,0xA3,0xE4,0xF0,0x90,0x3F,0xFE,0xF0,0xC2,0x13,
-
0x90,0x12,0x98,0xF0,0x90,0x12,0x30,0xF0,0x90,0x12,0x31,0xF0,0x90,0x12,0x3B,0xF0,
-
0xA3,0x74,0x03,0xF0,0xC2,0x0F,0xC2,0x03,0xE4,0x90,0x12,0x6C,0xF0,0xA3,0xF0,0x90,
-
0x12,0x4E,0xF0,0x90,0x8F,0xFE,0xF0,0xFE,0xFF,0x75,0x9E,0x55,0x74,0x00,0x12,0x3A,
-
0xA3,0x34,0x8F,0xF5,0x83,0xE4,0xF0,0x74,0x78,0x2D,0xF5,0x82,0xE4,0x34,0x8F,0xF5,
-
0x83,0xE4,0xF0,0x0F,0xBF,0x00,0x01,0x0E,0xEF,0x64,0x3C,0x4E,0x70,0xDB,0xE4,0xFE,
-
0xFF,0xAD,0x07,0x74,0x7A,0x2D,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0xE4,0xF0,0x74,
-
0x3D,0x2D,0xF5,0x82,0xE4,0x34,0x12,0xF5,0x83,0xE4,0xF0,0x0F,0xBF,0x00,0x01,0x0E,
-
0xEF,0x64,0x0A,0x4E,0x70,0xDB,0xE4,0x90,0x12,0x4A,0xF0,0xA3,0xF0,0x90,0x13,0x59,
-
0xF0,0xA3,0xF0,0x90,0x13,0x6F,0xF0,0x90,0x3F,0xFD,0x04,0xF0,0x22,0xE4,0xFB,0xEB,
-
0xC3,0x95,0x1C,0x40,0x03,0x02,0x47,0x97,0x74,0xE5,0x2B,0x12,0x1E,0xBB,0xE0,0x70,
-
0x03,0x02,0x47,0x93,0x12,0x1E,0xE8,0x12,0x20,0x30,0xC3,0x94,0x64,0xEE,0x64,0x80,
-
0x94,0x80,0x50,0x40,0x12,0x1E,0xE8,0x12,0x20,0x30,0xFF,0xC3,0x74,0x64,0x9F,0xFF,
-
0xE4,0x9E,0xFE,0x7D,0x0E,0x12,0x26,0xD8,0x12,0x1E,0xE8,0x12,0x1D,0xC5,0x12,0x25,
-
0x79,0xEB,0x12,0x1F,0xD8,0x12,0x21,0xB4,0xEB,0x12,0x1F,0xD8,0x12,0x20,0x30,0xC3,
-
0xEE,0x64,0x80,0x94,0x80,0x50,0x59,0xEB,0x12,0x1F,0xD8,0xF5,0x83,0xE4,0xF0,0xA3,
-
0xF0,0x02,0x46,0xF0,0x12,0x1E,0xD5,0x12,0x1D,0xC5,0x12,0x23,0xB6,0x40,0x33,0x12,
-
0x1E,0xD5,0x12,0x1D,0xC5,0xC3,0x9F,0xFF,0xEC,0x12,0x23,0xDD,0x12,0x1E,0xE8,0x12,
-
0x1D,0xC5,0x2F,0xFF,0xEC,0x3E,0xFE,0xEB,0x12,0x1F,0xD8,0x12,0x21,0xB4,0x12,0x22,
-
0xA1,0xEB,0x12,0x1F,0xD8,0x12,0x1D,0xC5,0x12,0x23,0xB6,0x40,0x13,0x12,0x22,0xA1,
-
0x80,0x07,0x12,0x1E,0xE8,0x12,0x20,0x30,0xFF,0xEB,0x12,0x1F,0xD8,0x12,0x21,0xB4,
-
0x12,0x1F,0xC6,0x12,0x20,0x30,0xC3,0x94,0x64,0xEE,0x64,0x80,0x94,0x80,0x50,0x3C,
-
0x12,0x1F,0xC6,0x12,0x20,0x30,0xFF,0xC3,0x74,0x64,0x9F,0xFF,0xE4,0x12,0x23,0xDD,
-
0x12,0x1F,0xC6,0x12,0x1D,0xC5,0x12,0x25,0x79,0xEB,0x12,0x20,0x8A,0x12,0x21,0xB4,
-
0xEB,0x12,0x20,0x8A,0x12,0x20,0x30,0xC3,0xEE,0x64,0x80,0x94,0x80,0x50,0x64,0xEB,
-
0x12,0x20,0x8A,0xF5,0x83,0xE4,0xF0,0xA3,0xF0,0x02,0x47,0x93,0x12,0x1F,0xB3,0x12,
-
0x1D,0xC5,0x12,0x23,0xB6,0x40,0x3E,0x12,0x1F,0xB3,0x12,0x1D,0xC5,0x12,0x25,0x79,
-
0x7D,0x12,0x12,0x26,0xD8,0x12,0x1F,0xC6,0x12,0x1D,0xC5,0x2F,0xFF,0xEC,0x3E,0xFE,
-
0xEB,0x12,0x20,0x8A,0x12,0x21,0xB4,0xAF,0x1B,0x90,0xF1,0x07,0x12,0x22,0xA6,0xEB,
-
0x12,0x20,0x8A,0x12,0x1D,0xC5,0x12,0x23,0xB6,0x40,0x18,0xAF,0x1B,0x90,0xF1,0x07,
-
0x12,0x22,0xA6,0x80,0x07,0x12,0x1F,0xC6,0x12,0x20,0x30,0xFF,0xEB,0x12,0x20,0x8A,
-
0x12,0x21,0xB4,0x0B,0x02,0x46,0x3F,0x22,0xAB,0x07,0xC2,0x1B,0xEB,0x25,0xE0,0xFE,
-
0xE4,0x33,0x90,0x13,0x8D,0xF0,0xA3,0xCE,0xF0,0xE4,0xFA,0xEA,0xFF,0x7E,0x00,0x7C,
-
0x00,0x7D,0x38,0x12,0x40,0x38,0xAC,0x06,0xAD,0x07,0xEB,0x25,0xE0,0xFF,0xE4,0x33,
-
0xFE,0xED,0x2F,0xFF,0xEC,0x3E,0x90,0x13,0x8D,0xF0,0xA3,0xEF,0xF0,0x90,0x13,0x8D,
-
0xE0,0xFC,0xA3,0xE0,0xFD,0x24,0x01,0xF5,0x82,0x74,0x20,0x3C,0xF5,0x83,0xE0,0xFE,
-
0x74,0x00,0x2D,0xF5,0x82,0x74,0x20,0x3C,0xF5,0x83,0xE0,0xFD,0xED,0xFF,0x90,0x13,
-
0x8B,0xEE,0xF0,0xA3,0xEF,0xF0,0xA3,0xA3,0xE0,0xFD,0x24,0x01,0xF5,0x82,0x74,0x00,
-
0x3C,0xF5,0x83,0xE0,0xFE,0x74,0x00,0x2D,0xF5,0x82,0x74,0x00,0x3C,0xF5,0x83,0xE0,
-
0xFD,0xED,0xFF,0x90,0x13,0x8C,0xE0,0x24,0x58,0xFD,0x90,0x13,0x8B,0xE0,0x34,0x02,
-
0xFC,0xD3,0xEF,0x9D,0xEE,0x9C,0x40,0x0E,0x90,0x12,0x4B,0xE0,0x04,0xF0,0x70,0x06,
-
0x90,0x12,0x4A,0xE0,0x04,0xF0,0xEF,0x24,0x58,0xFF,0xEE,0x34,0x02,0xFE,0xD3,0x90,
-
0x13,0x8C,0xE0,0x9F,0x90,0x13,0x8B,0xE0,0x9E,0x40,0x0E,0x90,0x13,0x5A,0xE0,0x04,
-
0xF0,0x70,0x06,0x90,0x13,0x59,0xE0,0x04,0xF0,0x0A,0xEA,0x64,0x14,0x60,0x03,0x02,
-
0x47,0xAB,0x90,0x13,0x6F,0xE0,0x04,0xF0,0xE0,0x64,0x1C,0x70,0x37,0xF0,0x90,0x13,
-
0x59,0xE0,0xFE,0xA3,0xE0,0xFF,0xD3,0x90,0x12,0x4B,0xE0,0x9F,0x90,0x12,0x4A,0xE0,
-
0x9E,0x40,0x02,0xD2,0x1B,0x30,0x1B,0x1C,0xC2,0x1B,0xE4,0x90,0x12,0x4A,0xF0,0xA3,
-
0xF0,0x90,0x13,0x59,0xF0,0xA3,0xF0,0x90,0xF1,0x04,0x74,0x1E,0xF0,0x90,0xF0,0xC5,
-
0xE0,0x44,0x01,0xF0,0x22,0xE5,0xC0,0x54,0x02,0x70,0x03,0x02,0x35,0x4D,0xE5,0xC0,
-
0x54,0x02,0x60,0x13,0x90,0x00,0x00,0x7F,0x00,0x7E,0x90,0xE4,0x74,0xFF,0xF0,0xA3,
-
0x75,0x9E,0x55,0xDF,0xF9,0xDE,0xF7,0x02,0x35,0x4D,0xC2,0xD3,0xC2,0xD4,0x75,0x9E,
-
0x55,0x12,0x49,0x76,0x12,0x49,0x76,0x78,0x01,0x74,0x55,0xF6,0x64,0xFF,0x08,0xB8,
-
0x60,0xF9,0x78,0x80,0x74,0x55,0xF6,0x64,0xFF,0x08,0xB8,0x00,0xF9,0x75,0x9E,0x55,
-
0x12,0x49,0x76,0x12,0x49,0x76,0x78,0x01,0x74,0x55,0xC0,0xE0,0x66,0x70,0x22,0xD0,
-
0xE0,0x63,0xE0,0xFF,0x08,0xB8,0x60,0xF2,0x78,0x80,0x74,0x55,0xC0,0xE0,0x66,0x70,
-
0x10,0xD0,0xE0,0x63,0xE0,0xFF,0x08,0xB8,0x00,0xF2,0x90,0x00,0x00,0x74,0x01,0xF0,
-
0x22,0x90,0x00,0x00,0x74,0x00,0xF0,0xA3,0x90,0x00,0x01,0xE8,0xF0,0xD0,0xE0,0x22,
-
0x78,0x60,0x74,0x55,0xF6,0x64,0xFF,0x08,0xB8,0x81,0xF9,0x75,0x9E,0x55,0x12,0x49,
-
0x76,0x12,0x49,0x76,0x78,0x60,0x74,0x55,0xC0,0xE0,0x66,0x70,0x11,0xD0,0xE0,0x63,
-
0xE0,0xFF,0x08,0xB8,0x81,0xF2,0x90,0x00,0x00,0xE0,0x44,0x02,0xF0,0x22,0x90,0x00,
-
0x00,0xE0,0x44,0x00,0xF0,0x90,0x00,0x02,0xE8,0xF0,0xD0,0xE0,0x22,0xC0,0xE0,0xC0,
-
0xD0,0xD0,0xD0,0xD0,0xE0,0x32,0x78,0x00,0xD8,0xFE,0x22,0x78,0x96,0x79,0xFA,0xD9,
-
0xFE,0xD8,0xFA,0x22,0x78,0x02,0x79,0xFA,0x7A,0xFA,0xDA,0xFE,0xD9,0xFA,0xD8,0xF6,
-
0x22,0x00,0x00,0x90,0x12,0x49,0xE0,0x25,0xE0,0x24,0x9A,0xF5,0x82,0xE4,0x34,0x12,
-
0xF5,0x83,0xE0,0x75,0xF0,0x02,0xA4,0xFF,0xAE,0xF0,0x90,0x12,0x4F,0xEE,0xF0,0xA3,
-
0xEF,0xF0,0x24,0x01,0xF9,0x74,0xF0,0x3E,0xFA,0x90,0x12,0x34,0x74,0x01,0xF0,0xA3,
-
0xEA,0xF0,0xA3,0xE9,0xF0,0x90,0x12,0x34,0xE0,0xFB,0xA3,0xE0,0xFA,0xA3,0xE0,0xF9,
-
0xE4,0x12,0x40,0x26,0x90,0x12,0x35,0x75,0xF0,0x01,0x12,0x40,0xD5,0x90,0x12,0x34,
-
0xE0,0xFB,0xA3,0xE0,0xFA,0xA3,0xE0,0xF9,0x22,0xEF,0x25,0xE0,0x24,0x99,0xF5,0x82,
-
0xE4,0x34,0x12,0xF5,0x83,0x22,0xF0,0xEF,0x25,0xE0,0x24,0x9A,0xF5,0x82,0xE4,0x34,
-
0x12,0xF5,0x83,0xEE,0xF0,0x22,0x74,0x40,0x2E,0xF5,0x82,0xE4,0x34,0x19,0xF5,0x83,
-
0xE0,0x22,0x90,0x12,0x33,0xE0,0x25,0xE0,0x24,0xA0,0xF5,0x82,0xE4,0x34,0x19,0xF5,
-
0x83,0x22,0x74,0x10,0x12,0x40,0x26,0x90,0x12,0x49,0xE0,0x25,0xE0,0x22,0xF0,0x12,
-
0x3D,0xFB,0x90,0xF0,0xC4,0x74,0x01,0xF0,0x22,0x24,0x9B,0xF5,0x82,0xE4,0x34,0x12,
-
0xF5,0x83,0xE0,0x22,0x90,0x12,0x33,0xE0,0xFF,0x24,0x40,0x12,0x4A,0x09,0x64,0x01,
-
0x60,0x0A,0x74,0x40,0x2F,0x12,0x4A,0x09,0x64,0x03,0x70,0x74,0x90,0x12,0x49,0xE0,
-
0xFF,0x12,0x49,0xEA,0xE0,0xFE,0xB4,0x01,0x0A,0xEF,0x25,0xE0,0x12,0x4A,0x39,0x64,
-
0x01,0x60,0x0F,0xEE,0x64,0x03,0x70,0x19,0x12,0x4A,0x27,0x12,0x4A,0x39,0x64,0x03,
-
0x70,0x0F,0x12,0x49,0x93,0x12,0x4A,0x22,0x24,0x9C,0xF5,0x82,0xE4,0x34,0x12,0x80,
-
0x0D,0x12,0x49,0x93,0x12,0x4A,0x22,0x24,0x98,0xF5,0x82,0xE4,0x34,0x12,0x12,0x49,
-
0xA0,0x74,0x20,0x12,0x40,0x26,0x90,0x12,0x49,0xE0,0x04,0x12,0x4A,0x2E,0x20,0x0C,
-
0x05,0x75,0x9E,0x55,0x80,0xF8,0x90,0x00,0x01,0xE0,0xFE,0x90,0x00,0x00,0xE0,0x7C,
-
0x00,0x24,0x00,0xFF,0xEC,0x3E,0xFE,0x12,0x4A,0x12,0xEE,0xF0,0xA3,0xEF,0xF0,0x22,
-
0x12,0x4A,0x12,0xE4,0xF0,0xA3,0x74,0x08,0x12,0x4A,0x2E,0x20,0x0C,0x05,0x75,0x9E,
-
0x55,0x80,0xF8,0x22,0xE4,0x90,0xF0,0xC4,0xF0,0x75,0x9E,0x55,0x90,0xF1,0x47,0xE0,
-
0xFE,0x90,0xF1,0x48,0xE0,0x7C,0x00,0x24,0x00,0xFD,0xEC,0x3E,0xFC,0x90,0xF1,0x49,
-
0xE0,0x7F,0x00,0xFE,0xEF,0x2D,0xFF,0xEC,0x3E,0xFE,0x90,0xF1,0x4A,0xE0,0x7C,0x00,
-
0x2F,0xFF,0xEC,0x3E,0xFE,0x90,0xF1,0x40,0x74,0xE3,0xF0,0xE4,0x90,0xF1,0x41,0xF0,
-
0x12,0x4D,0xC0,0x75,0x9E,0x55,0x90,0xF1,0x41,0x74,0x40,0xF0,0x7F,0x05,0x7E,0x00,
-
0x12,0x4D,0x7A,0x7F,0x05,0x7E,0x00,0x12,0x4D,0x7A,0x75,0x9E,0x55,0xE4,0x90,0xF1,
-
0x41,0xF0,0x90,0xF1,0x40,0xF0,0x7F,0x02,0xFE,0x12,0x4D,0x7A,0x7F,0x02,0x7E,0x00,
-
0x12,0x4D,0x7A,0x75,0x9E,0x55,0x22,0x75,0x9E,0x55,0x74,0x03,0x12,0x4B,0x95,0x74,
-
0x01,0x12,0x4B,0x7F,0x74,0x13,0x12,0x4B,0x7F,0x74,0x1F,0x12,0x4B,0xAB,0x75,0x9E,
-
0x55,0x74,0x3F,0x12,0x4B,0xAB,0x75,0x9E,0x55,0x74,0x83,0x12,0x4B,0x95,0x22,0x90,
-
0xF1,0x41,0xF0,0x7F,0x05,0x7E,0x00,0x12,0x4D,0x7A,0x7F,0x05,0x7E,0x00,0x12,0x4D,
-
0x7A,0x75,0x9E,0x55,0x22,0x90,0xF1,0x40,0xF0,0x7F,0x01,0x7E,0x00,0x12,0x4D,0x7A,
-
0x7F,0x01,0x7E,0x00,0x12,0x4D,0x7A,0x75,0x9E,0x55,0x22,0x90,0xF1,0x41,0xF0,0x7F,
-
0x05,0x7E,0x00,0x12,0x4D,0x7A,0x7F,0x05,0x7E,0x00,0x12,0x4D,0x7A,0x22,0x30,0x18,
-
0x07,0x90,0x88,0xB0,0xE0,0xFF,0x80,0x02,0xE4,0xFF,0xE4,0xFE,0xEE,0xC3,0x9F,0x50,
-
0x2A,0xEE,0x12,0x1E,0x62,0x12,0x1D,0xC5,0xFD,0xEE,0x12,0x1E,0xE9,0x12,0x25,0x71,
-
0xEE,0x12,0x1D,0xBA,0x12,0x1E,0xA4,0xE0,0x70,0x08,0x12,0x1E,0xB8,0x74,0x01,0xF0,
-
0x80,0x06,0x12,0x1E,0xB8,0x74,0x02,0xF0,0x0E,0x80,0xD1,0xAE,0x07,0xEE,0xC3,0x95,
-
0x1C,0x50,0x1F,0x12,0x1E,0xB8,0xE0,0x64,0x01,0x60,0x07,0x12,0x1E,0xB8,0xE0,0xB4,
-
0x02,0x08,0x12,0x1E,0xB8,0x74,0x03,0xF0,0x80,0x05,0x12,0x1E,0xB8,0xE4,0xF0,0x0E,
-
0x80,0xDB,0x22,0xE5,0xC0,0x30,0xE3,0x11,0xE4,0x90,0xF0,0xC4,0xF0,0x12,0x4A,0xE4,
-
0x7F,0x32,0x7E,0x00,0x12,0x4D,0x7A,0x80,0x29,0xE5,0xC0,0x30,0xE2,0x07,0x12,0x4C,
-
0x75,0xD2,0xAF,0x80,0x2C,0xE5,0xC0,0x30,0xE0,0x13,0x90,0xF1,0x42,0xE0,0x54,0xEF,
-
0xF0,0x7F,0x02,0x7E,0x00,0x12,0x4D,0x7A,0x12,0x4C,0x75,0x80,0x14,0xE5,0xC0,0x30,
-
0xE1,0x0F,0x12,0x4E,0x0C,0x12,0x4B,0x57,0x12,0x44,0xDD,0x12,0x00,0x36,0x12,0x27,
-
0x30,0xE4,0xF5,0xC0,0x22,0x12,0x4B,0x57,0x90,0xF0,0xC4,0x74,0x01,0xF0,0x22,0xE4,
-
0x90,0x13,0x8B,0xF0,0xA3,0xF0,0x90,0x8F,0xFE,0x74,0xAA,0xF0,0x90,0x8F,0xFD,0xE0,
-
0x64,0xBB,0x60,0x1A,0x90,0x13,0x8C,0xE0,0x04,0xF0,0x70,0x06,0x90,0x13,0x8B,0xE0,
-
0x04,0xF0,0x75,0x9E,0x55,0x7F,0xFA,0x7E,0x00,0x12,0x4D,0xD3,0x80,0xDE,0xE4,0x90,
-
0x8F,0xFD,0xF0,0x90,0x8F,0xFE,0xF0,0xD2,0xD8,0xA2,0xD9,0x33,0x90,0x8E,0x01,0xF0,
-
0x12,0x4A,0x32,0x22,0xF5,0x83,0xE0,0xFE,0x74,0x00,0x2F,0xF5,0x82,0xE4,0x34,0x8B,
-
0xF5,0x83,0xEE,0xF0,0x90,0x13,0x85,0xE0,0x04,0xF0,0xE0,0x22,0x90,0x8F,0xF0,0xE0,
-
0xD3,0x94,0x00,0x22,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0x22,0xE4,0x90,0x12,0x33,
-
0xF0,0x90,0x12,0x49,0xF0,0x22,0x30,0x98,0x04,0xD2,0x07,0xC2,0x98,0x30,0x99,0x23,
-
0xD2,0x08,0xC2,0x99,0x30,0x0D,0x18,0xB2,0x17,0x30,0x17,0x08,0x75,0x8A,0x8F,0x75,
-
0x8B,0x00,0x80,0x06,0x75,0x8A,0x8F,0x75,0x8B,0x78,0xC2,0x0D,0xD2,0x09,0x32,0xC2,
-
0x0E,0xC2,0x09,0x32,0xAB,0x07,0xAA,0x06,0xE4,0xF5,0xAE,0x75,0xAF,0x01,0x12,0x26,
-
0x95,0xEA,0xF5,0xA3,0xEB,0xF5,0xA4,0xD2,0xB0,0x20,0xB0,0x06,0x30,0x11,0x03,0x20,
-
0xDA,0x05,0x75,0x9E,0x55,0x80,0xF2,0x12,0x22,0x71,0xFF,0xEC,0x3E,0xFE,0x22,0xAB,
-
0x07,0xAA,0x06,0xEA,0xF5,0xAE,0xEB,0xF5,0xAF,0xE4,0x12,0x26,0x95,0xF5,0xA3,0x75,
-
0xA4,0x01,0xD2,0xB0,0x20,0xB0,0x06,0x30,0x11,0x03,0x20,0xDA,0x05,0x75,0x9E,0x55,
-
0x80,0xF2,0x12,0x22,0x71,0xFF,0xEC,0x3E,0xFE,0x22,0xE4,0xFD,0xFC,0xC3,0xED,0x9F,
-
0xEC,0x9E,0x50,0x18,0xE4,0xFB,0xFA,0x75,0x9E,0x55,0x0B,0xBB,0x00,0x01,0x0A,0xBA,
-
0x03,0xF5,0xBB,0x20,0xF2,0x0D,0xBD,0x00,0x01,0x0C,0x80,0xE1,0x22,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x1E,0x00,0x19,
-
0x00,0x19,0x00,0x19,0x00,0x19,0x00,0x19,0x00,0x19,0x00,0x19,0x00,0x19,0x00,0x19,
-
0xE4,0xFD,0xFC,0xC3,0xED,0x9F,0xEC,0x9E,0x50,0x08,0x00,0x0D,0xBD,0x00,0x01,0x0C,
-
0x80,0xF1,0x22,0xEF,0x1F,0x70,0x01,0x1E,0x75,0x9E,0x55,0xD3,0xEF,0x94,0x00,0xEE,
-
0x94,0x00,0x50,0xEF,0x22,0xC0,0xE0,0xD2,0x0B,0x05,0x1E,0xE5,0x1E,0x70,0x02,0x05,
-
0x1D,0xD0,0xE0,0x32,0x90,0xF0,0xC5,0x74,0x26,0xF0,0x30,0xF8,0x02,0xD2,0x18,0x22,
-
0xEE,0x30,0xE7,0x07,0xC3,0xE4,0x9F,0xFF,0xE4,0x9E,0xFE,0x22,0x75,0x91,0x01,0x75,
-
0x89,0x01,0xD2,0xAC,0x22,0x8F,0x82,0x8E,0x83,0xE4,0x93,0xFF,0x22,0xD2,0x11,0x32,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x90,0x3F,0xFF,0x74,0x10,0xF0,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
\ No newline at end of file
diff --git a/drivers/input/touchscreen/vtl_ts/lx--js77_97_CT365_V01_E7DA_130419.dat b/drivers/input/touchscreen/vtl_ts/lx--js77_97_CT365_V01_E7DA_130419.dat
deleted file mode 100755
index d3fc42f43e6b..000000000000
--- a/drivers/input/touchscreen/vtl_ts/lx--js77_97_CT365_V01_E7DA_130419.dat
+++ /dev/null
@@ -1,2048 +0,0 @@
-0x02,0x48,0x60,0x02,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x02,0x4E,0x75,0x00,0x00,
-
0x00,0x00,0x00,0x02,0x4E,0xB3,0x00,0x00,0x00,0x00,0x00,0x02,0x4E,0xB4,0x00,0x00,
-
0x00,0x00,0x00,0x02,0x4D,0x86,0x00,0x00,0x00,0x00,0x00,0x02,0x3D,0xEA,0x00,0x00,
-
0x00,0x00,0x00,0x02,0x4E,0xB0,0x75,0x86,0x09,0x75,0x84,0x9C,0xD2,0xA9,0x22,0x32,
-
0x90,0x3F,0xF0,0x74,0x56,0xF0,0xA3,0x74,0x54,0xF0,0xA3,0x74,0x4C,0xF0,0x22,0x78,
-
0xBD,0x7C,0x13,0x7A,0x4E,0x79,0x2D,0x7F,0x05,0x12,0x1A,0x9F,0x90,0x13,0xCB,0x12,
-
0x3D,0x68,0xFF,0xFF,0xFF,0xFF,0x90,0x13,0xCF,0x12,0x3D,0x68,0x00,0x00,0x00,0x00,
-
0x78,0xE3,0x7C,0x13,0x7A,0x4E,0x79,0x32,0x7F,0x0A,0x12,0x1A,0x9F,0x78,0xED,0x7C,
-
0x13,0x7D,0x01,0x7B,0xFF,0x7A,0x4E,0x79,0x3C,0x7E,0x00,0x7F,0x14,0x12,0x3B,0xFE,
-
0xC2,0x1D,0xE4,0x90,0x12,0x60,0xF0,0x90,0x12,0x96,0xF0,0x90,0x12,0x97,0xF0,0x90,
-
0xEC,0x1D,0x8B,0xFC,0x0F,0xCF,0xE7,0xF9,0x6F,0x77,0x4F,0x1F,0x7F,0xFE,0x1B,0x6F,
-
0x88,0xC1,0xF0,0xE4,0x90,0x13,0xB8,0xF0,0xC2,0x12,0xC2,0x14,0x12,0x1A,0xA8,0xD3,
-
0x9F,0x40,0x03,0x02,0x02,0x84,0x90,0x88,0xC0,0xE0,0x9F,0x40,0x03,0x02,0x02,0x84,
-
0xE4,0xF0,0x75,0x9E,0x55,0x90,0x13,0xB4,0xF0,0x12,0x18,0xF1,0x40,0x03,0x02,0x02,
-
0x56,0x75,0x9E,0x55,0x74,0xE5,0x2F,0x12,0x14,0x97,0xE0,0x64,0x01,0x60,0x0E,0x12,
-
0x1A,0xB2,0x12,0x14,0x97,0xE0,0x64,0x02,0x60,0x03,0x02,0x02,0x48,0x90,0x13,0xB4,
-
0x12,0x1C,0x73,0x12,0x1A,0xB9,0xEF,0xF0,0x74,0xE5,0x2F,0x12,0x14,0x97,0x74,0x04,
-
0xF0,0xE4,0x90,0x13,0xB5,0xF0,0x90,0x88,0xC1,0x12,0x1B,0xC3,0x9F,0x40,0x03,0x02,
-
0x02,0x40,0x75,0x9E,0x55,0x90,0x13,0xB4,0xE0,0xFF,0x12,0x17,0xA3,0x12,0x13,0x68,
-
0xFD,0xEE,0x12,0x13,0xF7,0x12,0x1B,0x82,0xC3,0x9D,0xEA,0x9C,0x40,0x11,0xEF,0x12,
-
0x17,0xA3,0x12,0x15,0x6D,0xFF,0x90,0x13,0xB5,0xE0,0x12,0x13,0xF7,0x80,0x12,0x90,
-
0x13,0xB5,0xE0,0x12,0x13,0xF7,0x12,0x15,0x6D,0xFF,0x90,0x13,0xB4,0xE0,0x12,0x17,
-
0xA3,0x12,0x13,0x68,0xC3,0x9F,0xFF,0xEC,0x9E,0x90,0x13,0xC7,0xF0,0xA3,0xEF,0xF0,
-
0x90,0x13,0xB4,0xE0,0xFF,0x12,0x19,0x03,0x12,0x13,0x68,0xFD,0x90,0x13,0xB5,0xE0,
-
0xFE,0x12,0x15,0xC6,0x12,0x1B,0x82,0xC3,0x9D,0xEA,0x9C,0x40,0x16,0xEF,0x12,0x19,
-
0x03,0x12,0x13,0x68,0xFD,0xEE,0x12,0x15,0xC6,0x12,0x15,0x6D,0xC3,0x9D,0xFF,0xEE,
-
0x9C,0x80,0x1A,0x90,0x13,0xB5,0xE0,0x12,0x15,0xC6,0x12,0x15,0x6D,0xFF,0x90,0x13,
-
0xB4,0xE0,0x12,0x19,0x03,0x12,0x13,0x68,0xC3,0x9F,0xFF,0xEC,0x9E,0x90,0x13,0xC9,
-
0xF0,0xA3,0xEF,0xF0,0x90,0x13,0xC9,0xE0,0xFE,0xA3,0xE0,0x90,0x13,0xC9,0x12,0x1B,
-
0x43,0xC0,0x04,0xC0,0x05,0xC0,0x06,0xC0,0x07,0x90,0x13,0xC7,0xE0,0xFE,0xA3,0xE0,
-
0x90,0x13,0xC7,0x12,0x1B,0x43,0xD0,0x03,0xD0,0x02,0xD0,0x01,0xD0,0x00,0xEF,0x2B,
-
0xFF,0xEE,0x3A,0xFE,0xED,0x39,0xFD,0xEC,0x38,0xFC,0x90,0x88,0xC0,0xE0,0x12,0x15,
-
0xA7,0xC0,0x83,0xC0,0x82,0x90,0x13,0xB5,0xE0,0xD0,0x82,0xD0,0x83,0x75,0xF0,0x04,
-
0x12,0x3D,0x99,0x12,0x3D,0x5C,0x90,0x88,0xC0,0xE0,0x12,0x15,0xA7,0xC0,0x83,0xC0,
-
0x82,0x90,0x13,0xB5,0xE0,0xD0,0x82,0xD0,0x83,0x12,0x14,0xAE,0xE4,0x7B,0x32,0xFA,
-
0xF9,0xF8,0xD3,0x12,0x3D,0x38,0x40,0x02,0xD2,0x1D,0x12,0x1A,0xC3,0x02,0x01,0x16,
-
0x90,0x88,0xC0,0xE0,0x04,0xF0,0x80,0x08,0x12,0x1A,0xB2,0x12,0x14,0x97,0xE4,0xF0,
-
0x12,0x19,0xD0,0x02,0x00,0xD9,0xE4,0x90,0x13,0xB5,0xF0,0x90,0x13,0xE2,0xE0,0xFF,
-
0x12,0x1B,0xC5,0x9F,0x50,0x1E,0x90,0x88,0xC1,0xE0,0xFF,0xEE,0xC3,0x9F,0x74,0xA0,
-
0x50,0x08,0x12,0x1A,0x2D,0x74,0x01,0xF0,0x80,0x05,0x12,0x1A,0x2D,0xE4,0xF0,0x12,
-
0x1A,0xC3,0x80,0xD7,0x75,0x9E,0x55,0x12,0x1A,0xA8,0xD3,0x9F,0x40,0x03,0x02,0x0C,
-
0x5B,0x90,0x88,0xC0,0xE0,0x9F,0x40,0x03,0x02,0x0C,0x5B,0x30,0x1D,0x03,0x02,0x0C,
-
0x5B,0xE0,0x94,0x00,0x50,0x03,0x02,0x0B,0x47,0x90,0x88,0xC1,0xE0,0xD3,0x94,0x00,
-
0x50,0x03,0x02,0x0B,0x47,0xE0,0xFF,0x90,0x88,0xC0,0xE0,0xD3,0x9F,0x40,0x03,0x02,
-
0x07,0x05,0x90,0x88,0xC0,0x12,0x1B,0x89,0x90,0x88,0xC1,0xE0,0xFE,0xEF,0x6E,0x70,
-
0x03,0x02,0x03,0xCD,0x75,0x9E,0x55,0xE4,0x90,0x13,0xB3,0xF0,0x12,0x16,0xE8,0x50,
-
0x09,0x12,0x19,0x1E,0xE4,0x12,0x17,0x1D,0x80,0xF2,0xC2,0x1C,0xE4,0x90,0x13,0xB3,
-
0xF0,0x90,0x88,0xC0,0x12,0x16,0xEB,0x50,0x36,0x74,0xBD,0x2E,0x12,0x16,0xD5,0x12,
-
0x1A,0xAB,0xFE,0xEF,0xB5,0x06,0x04,0xD2,0x1C,0x80,0x24,0x74,0xC2,0x2F,0x12,0x19,
-
0x21,0xE0,0x70,0x12,0x90,0x13,0xB3,0xE0,0x12,0x16,0xD3,0xE0,0x24,0xC2,0x12,0x19,
-
0x21,0x74,0x01,0xF0,0x80,0x04,0xD2,0x1C,0x80,0x05,0x12,0x17,0x1E,0x80,0xC2,0x90,
-
0x13,0xCF,0x12,0x3D,0x68,0x00,0x00,0x00,0x00,0x20,0x1C,0x56,0xE4,0x90,0x13,0xB3,
-
0xF0,0x90,0x88,0xC0,0x12,0x16,0xEB,0x50,0x26,0x12,0x16,0xD1,0x12,0x17,0xD3,0xEE,
-
0x12,0x15,0xA7,0xC0,0x83,0xC0,0x82,0x90,0x13,0xB3,0xE0,0x12,0x16,0xD3,0xE0,0xD0,
-
0x82,0xD0,0x83,0x12,0x14,0xAE,0x12,0x19,0xD7,0x12,0x17,0x1E,0x02,0x03,0x41,0x12,
-
0x18,0xC8,0xA3,0x12,0x17,0xE4,0xC3,0x12,0x3D,0x38,0x50,0x16,0x90,0x13,0xCF,0x12,
-
0x18,0xCB,0x12,0x1B,0xCC,0x90,0x88,0xC0,0x12,0x16,0xEB,0x50,0x05,0x12,0x17,0x06,
-
0x80,0xF3,0xC2,0x1B,0xE4,0x90,0x13,0xB3,0xF0,0x90,0x88,0xC0,0xE0,0x14,0x12,0x16,
-
0xEC,0x50,0x1B,0x74,0xBD,0x2E,0x12,0x16,0xD5,0x12,0x1A,0xAB,0xFE,0xEF,0xB5,0x06,
-
0x08,0x12,0x16,0xCE,0x12,0x1A,0x36,0x80,0x05,0x12,0x17,0x1E,0x80,0xDB,0x30,0x1B,
-
0x03,0x02,0x02,0xC2,0x90,0x13,0xBD,0xE0,0x04,0xF0,0x02,0x02,0xC2,0x90,0x88,0xC0,
-
0x12,0x1C,0x47,0x12,0x1C,0x7A,0xFE,0xC3,0x9F,0x40,0x03,0x02,0x0B,0x47,0xE0,0xFF,
-
0x12,0x1A,0xB9,0xE0,0x90,0x13,0xBB,0xF0,0x74,0xD8,0x2F,0x12,0x1B,0x65,0xE0,0x90,
-
0x13,0xBA,0xF0,0xC2,0x12,0xC2,0x14,0xEE,0x12,0x14,0xA2,0x7B,0xF4,0x12,0x1A,0xCA,
-
0x12,0x15,0xA3,0xC0,0x83,0xC0,0x82,0x90,0x13,0xBA,0xE0,0xD0,0x82,0xD0,0x83,0x12,
-
0x19,0x9A,0x40,0x03,0x02,0x06,0xFF,0x12,0x15,0xA3,0xC0,0x83,0xC0,0x82,0x90,0x13,
-
0xBA,0xE0,0xD0,0x82,0xD0,0x83,0x12,0x14,0xAE,0x12,0x18,0xD7,0x50,0x1A,0x90,0x13,
-
0xBA,0x12,0x13,0xF5,0x12,0x13,0x68,0x12,0x1B,0x96,0x12,0x13,0x4A,0xFD,0xEE,0x12,
-
0x14,0x35,0x12,0x17,0xBC,0x02,0x05,0x45,0x12,0x15,0xA3,0xC0,0x83,0xC0,0x82,0x90,
-
0x13,0xBA,0xE0,0xD0,0x82,0xD0,0x83,0x12,0x14,0xAE,0x7B,0xB8,0x7A,0x0B,0x12,0x18,
-
0xDB,0x50,0x5B,0x90,0x13,0xBA,0xE0,0xFD,0x12,0x13,0xF7,0x12,0x16,0x34,0xD5,0x82,
-
0x02,0x15,0x83,0x12,0x19,0x4D,0x12,0x14,0x75,0xED,0x12,0x13,0xF7,0x12,0x14,0x80,
-
0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,0xF9,0xFF,0xEC,0x12,0x13,0xC6,0x90,
-
0x13,0xBA,0xE0,0xFD,0x12,0x15,0xC6,0x12,0x16,0x34,0xD5,0x82,0x02,0x15,0x83,0x12,
-
0x19,0x4D,0x12,0x14,0x35,0x12,0x14,0x80,0xED,0x12,0x15,0xC6,0x12,0x14,0x80,0xEF,
-
0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,0xF9,0xFF,0xEC,0x02,0x05,0x3F,0x12,0x15,
-
0xA3,0xC0,0x83,0xC0,0x82,0x90,0x13,0xBA,0xE0,0xD0,0x82,0xD0,0x83,0x12,0x14,0xAE,
-
0xE4,0x7B,0xDC,0x7A,0x05,0x12,0x18,0xDC,0x50,0x1A,0x12,0x13,0x8E,0x90,0x13,0xBB,
-
0xE0,0xFD,0x12,0x14,0x35,0x12,0x15,0x6D,0xFF,0xEC,0x12,0x15,0xC6,0x12,0x19,0x58,
-
0xED,0x02,0x05,0x3F,0x12,0x16,0x24,0xD5,0x82,0x02,0x15,0x83,0x12,0x1C,0x52,0x12,
-
0x13,0xF7,0x12,0x14,0x69,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,0xF9,0x12,
-
0x1B,0x9D,0x12,0x13,0xC6,0xED,0x12,0x14,0x35,0x12,0x16,0x34,0xD5,0x82,0x02,0x15,
-
0x83,0x15,0x82,0xE0,0x33,0xFE,0xEC,0x12,0x13,0x5D,0x12,0x1C,0x5D,0x12,0x14,0x35,
-
0x12,0x14,0x80,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,0xF9,0xFF,0xED,0x12,
-
0x14,0x35,0x12,0x13,0xD1,0x90,0x13,0xBB,0xE0,0xFF,0x12,0x14,0xFC,0x12,0x13,0x68,
-
0xFD,0xEF,0x12,0x16,0xFA,0x12,0x15,0x6D,0x12,0x1B,0xA4,0x12,0x4E,0x90,0x12,0x1B,
-
0x5A,0x90,0x13,0xBB,0xE0,0xFF,0x12,0x15,0x88,0x12,0x13,0x68,0xFD,0xEF,0x12,0x14,
-
0x35,0x12,0x15,0x6D,0x12,0x1B,0xA4,0x12,0x4E,0x90,0x12,0x16,0x90,0x40,0x29,0x12,
-
0x15,0x94,0xE0,0xD3,0x94,0x04,0x40,0x0A,0x74,0x83,0x2F,0x12,0x15,0x9B,0xE0,0x24,
-
0xFC,0xF0,0x12,0x15,0x94,0xE0,0xC3,0x94,0x01,0x50,0x08,0x74,0x83,0x2F,0x12,0x15,
-
0x9B,0xE4,0xF0,0x12,0x19,0x0F,0x80,0x3A,0x12,0x15,0x94,0xE0,0x04,0xF0,0x74,0x83,
-
0x2F,0x12,0x15,0x9B,0xE0,0xD3,0x94,0x16,0x40,0x0C,0x90,0x13,0xBB,0xE0,0x12,0x15,
-
0x99,0x12,0x1B,0xAB,0x80,0x18,0x12,0x1B,0xD8,0x50,0x05,0x12,0x1C,0x84,0x40,0x06,
-
0x30,0x06,0x03,0x12,0x19,0x0F,0x12,0x1B,0xE0,0x40,0x03,0x12,0x19,0x0F,0xC2,0x12,
-
0xC2,0x14,0x12,0x15,0x94,0x12,0x1A,0xD9,0x40,0x0F,0xD2,0x12,0xD2,0x14,0x74,0x79,
-
0x2F,0x12,0x17,0xCB,0x74,0x01,0xF0,0x80,0x04,0xC2,0x12,0xC2,0x14,0x12,0x17,0xC4,
-
0xE0,0xB4,0x01,0x09,0xEF,0x12,0x14,0xA2,0x12,0x1B,0xE8,0x80,0x0A,0x90,0x13,0xBB,
-
0xE0,0x12,0x14,0xA2,0x12,0x19,0xE9,0x90,0x13,0xBB,0xE0,0x12,0x17,0xC9,0xE0,0xB4,
-
0x01,0x13,0xD3,0xEB,0x94,0x01,0xEA,0x94,0x00,0x40,0x06,0xD2,0x12,0xD2,0x14,0x80,
-
0x04,0xC2,0x12,0xC2,0x14,0x90,0x13,0xBB,0xE0,0xFF,0x24,0xE5,0x12,0x14,0x97,0x12,
-
0x17,0x8F,0xE0,0x64,0x01,0x70,0x5B,0x12,0x16,0x3E,0xE0,0xC3,0x9E,0x50,0x1B,0xC2,
-
0x10,0x12,0x15,0x48,0x12,0x18,0xA8,0x50,0x09,0x12,0x16,0x53,0xE0,0x04,0xF0,0x02,
-
0x06,0xA4,0x12,0x16,0x53,0xE4,0xF0,0x02,0x06,0xA4,0x90,0x13,0xBB,0xE0,0xFF,0x24,
-
0x98,0x12,0x17,0x95,0xE4,0xF0,0x74,0xA2,0x2F,0x12,0x16,0x55,0xE4,0xF0,0x12,0x18,
-
0x62,0x12,0x15,0x6D,0x12,0x1B,0x9D,0x12,0x13,0xC6,0x12,0x19,0xC3,0x12,0x15,0x6D,
-
0xFF,0xED,0x12,0x14,0x35,0x12,0x13,0xD1,0xD2,0x10,0x12,0x14,0x94,0x74,0x01,0xF0,
-
0x80,0x02,0xD2,0x10,0x30,0x01,0x16,0x90,0x13,0xBA,0x12,0x13,0xF5,0x12,0x13,0x68,
-
0x12,0x1B,0x96,0x12,0x14,0xFC,0x12,0x13,0x55,0xFD,0xEE,0x80,0x27,0x30,0x12,0x2A,
-
0x30,0x14,0x27,0x30,0x10,0x24,0x12,0x19,0x74,0x40,0x03,0x12,0x1C,0x8B,0x12,0x19,
-
0x82,0x40,0x03,0x12,0x1C,0x92,0x12,0x16,0xF5,0x12,0x13,0x68,0x12,0x14,0x1C,0x12,
-
0x13,0x68,0xFD,0xEF,0x12,0x15,0x88,0x12,0x17,0xBC,0x90,0x13,0xBA,0x12,0x13,0xF5,
-
0x12,0x13,0x68,0x12,0x17,0x9D,0x12,0x13,0x55,0x12,0x15,0x08,0x12,0x17,0x50,0x12,
-
0x17,0x1E,0x02,0x03,0xD3,0x90,0x88,0xC1,0x12,0x1B,0x89,0x90,0x88,0xC0,0xE0,0xFE,
-
0xEF,0x6E,0x70,0x03,0x02,0x08,0x0B,0x75,0x9E,0x55,0xE4,0x90,0x13,0xB3,0xF0,0x90,
-
0x88,0xC0,0x12,0x16,0xEB,0x50,0x09,0x12,0x19,0x1E,0xE4,0x12,0x17,0x1D,0x80,0xEF,
-
0xC2,0x1C,0xE4,0x90,0x13,0xB3,0xF0,0x12,0x16,0xE8,0x50,0x36,0x74,0xBD,0x2E,0x12,
-
0x16,0xD5,0x12,0x1C,0x73,0xFE,0xEF,0xB5,0x06,0x04,0xD2,0x1C,0x80,0x24,0x74,0xC2,
-
0x2F,0x12,0x19,0x21,0xE0,0x70,0x12,0x90,0x13,0xB3,0xE0,0x12,0x16,0xD3,0xE0,0x24,
-
0xC2,0x12,0x19,0x21,0x74,0x01,0xF0,0x80,0x04,0xD2,0x1C,0x80,0x05,0x12,0x17,0x1E,
-
0x80,0xC5,0x90,0x13,0xCF,0x12,0x3D,0x68,0x00,0x00,0x00,0x00,0x20,0x1C,0x51,0xE4,
-
0x90,0x13,0xB3,0xF0,0x12,0x16,0xE8,0x50,0x27,0x12,0x16,0xD1,0x12,0x17,0xD3,0x74,
-
0xBD,0x2E,0x12,0x16,0xD5,0x12,0x15,0xA6,0xC0,0x83,0xC0,0x82,0x90,0x13,0xB3,0xE0,
-
0xD0,0x82,0xD0,0x83,0x12,0x14,0xAE,0x12,0x19,0xD7,0x12,0x17,0x1E,0x02,0x07,0x84,
-
0x12,0x18,0xC8,0xA3,0x12,0x17,0xE4,0xC3,0x12,0x3D,0x38,0x50,0x13,0x90,0x13,0xCF,
-
0x12,0x18,0xCB,0x12,0x1B,0xCC,0x12,0x16,0xE8,0x50,0x05,0x12,0x17,0x06,0x80,0xF6,
-
0xC2,0x1B,0xE4,0x90,0x13,0xB3,0xF0,0x90,0x88,0xC1,0xE0,0x14,0x12,0x16,0xEC,0x50,
-
0x1B,0x74,0xBD,0x2E,0x12,0x16,0xD5,0x12,0x1C,0x73,0xFE,0xEF,0xB5,0x06,0x08,0x12,
-
0x16,0xCE,0x12,0x1A,0x36,0x80,0x05,0x12,0x17,0x1E,0x80,0xDB,0x30,0x1B,0x03,0x02,
-
0x07,0x05,0x90,0x13,0xBD,0xE0,0x04,0xF0,0x02,0x07,0x05,0x90,0x88,0xC1,0x12,0x1C,
-
0x47,0x12,0x1C,0x7A,0xC3,0x9F,0x40,0x03,0x02,0x0B,0x47,0xE0,0xFF,0x12,0x1B,0x63,
-
0xE0,0x12,0x1A,0xB9,0xE0,0x90,0x13,0xBB,0xF0,0x90,0x13,0xBA,0xEF,0xF0,0xC2,0x12,
-
0xC2,0x14,0x12,0x14,0xA2,0x7B,0x90,0x12,0x1A,0xCA,0x90,0x13,0xB3,0xE0,0x12,0x1B,
-
0x63,0x12,0x15,0xA6,0xC0,0x83,0xC0,0x82,0x90,0x13,0xB3,0xE0,0xD0,0x82,0xD0,0x83,
-
0x12,0x19,0x9A,0x40,0x03,0x02,0x0B,0x41,0x12,0x15,0xA3,0xC0,0x83,0xC0,0x82,0x90,
-
0x13,0xBA,0xE0,0xD0,0x82,0xD0,0x83,0x12,0x14,0xAE,0x12,0x18,0xD7,0x50,0x1A,0x90,
-
0x13,0xBA,0x12,0x13,0xF5,0x12,0x13,0x68,0x12,0x1B,0x96,0x12,0x13,0x4A,0xFD,0xEE,
-
0x12,0x14,0x35,0x12,0x17,0xBC,0x02,0x09,0x87,0x12,0x15,0xA3,0xC0,0x83,0xC0,0x82,
-
0x90,0x13,0xBA,0xE0,0xD0,0x82,0xD0,0x83,0x12,0x14,0xAE,0xE4,0x7B,0xB8,0x7A,0x0B,
-
0x12,0x18,0xDC,0x50,0x5B,0x90,0x13,0xBA,0xE0,0xFD,0x12,0x13,0xF7,0x12,0x16,0x34,
-
0xD5,0x82,0x02,0x15,0x83,0x12,0x19,0x4D,0x12,0x14,0x75,0xED,0x12,0x13,0xF7,0x12,
-
0x14,0x80,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,0xF9,0xFF,0xEC,0x12,0x13,
-
0xC6,0x90,0x13,0xBA,0xE0,0xFD,0x12,0x15,0xC6,0x12,0x16,0x34,0xD5,0x82,0x02,0x15,
-
0x83,0x12,0x19,0x4D,0x12,0x14,0x35,0x12,0x14,0x80,0xED,0x12,0x15,0xC6,0x12,0x14,
-
0x80,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,0xF9,0xFF,0xEC,0x02,0x09,0x81,
-
0x12,0x15,0xA3,0xC0,0x83,0xC0,0x82,0x90,0x13,0xBA,0xE0,0xD0,0x82,0xD0,0x83,0x12,
-
0x14,0xAE,0xE4,0x7B,0xDC,0x7A,0x05,0x12,0x18,0xDC,0x50,0x1A,0x12,0x13,0x8E,0x90,
-
0x13,0xBB,0xE0,0xFD,0x12,0x14,0x35,0x12,0x15,0x6D,0xFF,0xEC,0x12,0x15,0xC6,0x12,
-
0x19,0x58,0xED,0x02,0x09,0x81,0x12,0x16,0x24,0xD5,0x82,0x02,0x15,0x83,0x12,0x1C,
-
0x52,0x12,0x13,0xF7,0x12,0x14,0x69,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,
-
0xF9,0x12,0x1B,0x9D,0x12,0x13,0xC6,0xED,0x12,0x14,0x35,0x12,0x16,0x34,0xD5,0x82,
-
0x02,0x15,0x83,0x15,0x82,0xE0,0x33,0xFE,0xEC,0x12,0x13,0x5D,0x12,0x1C,0x5D,0x12,
-
0x14,0x35,0x12,0x14,0x80,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,0xF9,0xFF,
-
0xED,0x12,0x14,0x35,0x12,0x13,0xD1,0x90,0x13,0xBB,0xE0,0xFF,0x12,0x14,0xFC,0x12,
-
0x13,0x68,0xFD,0xEF,0x12,0x16,0xFA,0x12,0x15,0x6D,0x12,0x1B,0xA4,0x12,0x4E,0x90,
-
0x12,0x1B,0x5A,0x90,0x13,0xBB,0xE0,0xFF,0x12,0x15,0x88,0x12,0x13,0x68,0xFD,0xEF,
-
0x12,0x14,0x35,0x12,0x15,0x6D,0x12,0x1B,0xA4,0x12,0x4E,0x90,0x12,0x16,0x90,0x40,
-
0x29,0x12,0x15,0x94,0xE0,0xD3,0x94,0x04,0x40,0x0A,0x74,0x83,0x2F,0x12,0x15,0x9B,
-
0xE0,0x24,0xFC,0xF0,0x12,0x15,0x94,0xE0,0xC3,0x94,0x01,0x50,0x08,0x74,0x83,0x2F,
-
0x12,0x15,0x9B,0xE4,0xF0,0x12,0x19,0x0F,0x80,0x3A,0x12,0x15,0x94,0xE0,0x04,0xF0,
-
0x74,0x83,0x2F,0x12,0x15,0x9B,0xE0,0xD3,0x94,0x16,0x40,0x0C,0x90,0x13,0xBB,0xE0,
-
0x12,0x15,0x99,0x12,0x1B,0xAB,0x80,0x18,0x12,0x1B,0xD8,0x50,0x05,0x12,0x1C,0x84,
-
0x40,0x06,0x30,0x06,0x03,0x12,0x19,0x0F,0x12,0x1B,0xE0,0x40,0x03,0x12,0x19,0x0F,
-
0xC2,0x12,0xC2,0x14,0x12,0x15,0x94,0x12,0x1A,0xD9,0x40,0x0F,0xD2,0x12,0xD2,0x14,
-
0x74,0x79,0x2F,0x12,0x17,0xCB,0x74,0x01,0xF0,0x80,0x04,0xC2,0x12,0xC2,0x14,0x12,
-
0x17,0xC4,0xE0,0xB4,0x01,0x09,0xEF,0x12,0x14,0xA2,0x12,0x1B,0xE8,0x80,0x0A,0x90,
-
0x13,0xBB,0xE0,0x12,0x14,0xA2,0x12,0x19,0xE9,0x90,0x13,0xBB,0xE0,0x12,0x17,0xC9,
-
0xE0,0xB4,0x01,0x13,0xD3,0xEB,0x94,0x01,0xEA,0x94,0x00,0x40,0x06,0xD2,0x12,0xD2,
-
0x14,0x80,0x04,0xC2,0x12,0xC2,0x14,0x90,0x13,0xBB,0xE0,0xFF,0x24,0xE5,0x12,0x14,
-
0x97,0x12,0x17,0x8F,0xE0,0x64,0x01,0x70,0x5B,0x12,0x16,0x3E,0xE0,0xC3,0x9E,0x50,
-
0x1B,0xC2,0x10,0x12,0x15,0x48,0x12,0x18,0xA8,0x50,0x09,0x12,0x16,0x53,0xE0,0x04,
-
0xF0,0x02,0x0A,0xE6,0x12,0x16,0x53,0xE4,0xF0,0x02,0x0A,0xE6,0x90,0x13,0xBB,0xE0,
-
0xFF,0x24,0x98,0x12,0x17,0x95,0xE4,0xF0,0x74,0xA2,0x2F,0x12,0x16,0x55,0xE4,0xF0,
-
0xD2,0x10,0x12,0x18,0x62,0x12,0x15,0x6D,0x12,0x1B,0x9D,0x12,0x13,0xC6,0x12,0x19,
-
0xC3,0x12,0x15,0x6D,0xFF,0xED,0x12,0x14,0x35,0x12,0x13,0xD1,0x12,0x14,0x94,0x74,
-
0x01,0xF0,0x80,0x02,0xD2,0x10,0x30,0x01,0x16,0x90,0x13,0xBA,0x12,0x13,0xF5,0x12,
-
0x13,0x68,0x12,0x1B,0x96,0x12,0x14,0xFC,0x12,0x13,0x55,0xFD,0xEE,0x80,0x27,0x30,
-
0x12,0x2A,0x30,0x14,0x27,0x30,0x10,0x24,0x12,0x19,0x74,0x40,0x03,0x12,0x1C,0x8B,
-
0x12,0x19,0x82,0x40,0x03,0x12,0x1C,0x92,0x12,0x16,0xF5,0x12,0x13,0x68,0x12,0x14,
-
0x1C,0x12,0x13,0x68,0xFD,0xEF,0x12,0x15,0x88,0x12,0x17,0xBC,0x90,0x13,0xBA,0x12,
-
0x13,0xF5,0x12,0x13,0x68,0x12,0x17,0x9D,0x12,0x13,0x55,0x12,0x15,0x08,0x12,0x17,
-
0x50,0x12,0x17,0x1E,0x02,0x08,0x11,0x12,0x19,0x16,0x50,0x45,0x90,0x88,0xC0,0xE0,
-
0x94,0x00,0x40,0x3D,0xE4,0x90,0x13,0xB4,0xF0,0x12,0x18,0xF1,0x50,0x33,0x74,0xE5,
-
0x2F,0x12,0x14,0x97,0xE0,0x64,0x04,0x70,0x22,0x12,0x19,0x16,0x50,0x1D,0x12,0x1A,
-
0xB2,0x12,0x14,0x97,0x74,0x03,0xF0,0xEF,0x12,0x14,0xA2,0x12,0x17,0x25,0x74,0xA2,
-
0x2F,0x12,0x16,0x55,0xE4,0xF0,0x12,0x17,0x92,0xE4,0xF0,0x12,0x19,0xD0,0x02,0x0B,
-
0x59,0x12,0x19,0x16,0x40,0x03,0x02,0x12,0x8F,0x90,0x88,0xC1,0xE0,0x94,0x00,0x50,
-
0x03,0x02,0x12,0x8F,0xE4,0x90,0x13,0xB5,0xF0,0x90,0x88,0xB0,0x12,0x1B,0xC3,0x9F,
-
0x40,0x03,0x02,0x12,0x8F,0x74,0xA0,0x12,0x1A,0x2D,0xE0,0x70,0x03,0x02,0x0C,0x55,
-
0xE4,0x90,0x13,0xB4,0xF0,0x12,0x18,0xF1,0x40,0x03,0x02,0x0C,0x55,0x74,0xE5,0x2F,
-
0x12,0x14,0x97,0xE0,0x70,0x79,0x12,0x19,0x16,0x50,0x74,0x12,0x12,0xDE,0xFD,0xEE,
-
0x12,0x14,0x35,0xF5,0x83,0xEC,0xF0,0xA3,0xED,0x12,0x13,0xF1,0x12,0x13,0x68,0xFD,
-
0xEE,0x12,0x14,0xFC,0x12,0x13,0x55,0xFD,0xEE,0x12,0x15,0x88,0x12,0x17,0xBC,0x12,
-
0x18,0xE2,0xE0,0x90,0x13,0xB4,0x12,0x15,0x2E,0xEF,0xF0,0x74,0x98,0x2D,0x12,0x13,
-
0xE8,0x12,0x13,0x68,0xFD,0x90,0x13,0xB4,0xE0,0xFE,0x12,0x18,0x63,0x12,0x13,0x55,
-
0x12,0x17,0xAF,0x74,0xE5,0x2E,0x12,0x14,0x97,0x74,0x01,0xF0,0xEE,0x12,0x14,0xA2,
-
0x12,0x19,0xE9,0x90,0x13,0xB5,0xE0,0x24,0xA0,0x12,0x1A,0x2E,0xE4,0xF0,0x74,0xD1,
-
0x2E,0x12,0x17,0x46,0x12,0x17,0x6D,0x90,0x13,0xB8,0xE0,0x04,0xF0,0x80,0x06,0x12,
-
0x19,0xD0,0x02,0x0B,0xC5,0x12,0x1A,0xC3,0x02,0x0B,0xA9,0xE4,0x90,0x88,0xC0,0xF0,
-
0xF5,0xDC,0xF5,0xDD,0xF5,0xDE,0x90,0x13,0xB4,0xF0,0x12,0x18,0xF1,0x50,0x41,0x74,
-
0xE5,0x2F,0x12,0x14,0x97,0xE0,0x64,0x01,0x60,0x15,0x12,0x1A,0xB2,0x12,0x14,0x97,
-
0xE0,0x64,0x02,0x60,0x0A,0x74,0xE5,0x2F,0x12,0x14,0x97,0xE0,0xB4,0x04,0x14,0x90,
-
0x88,0xC0,0xE0,0x04,0xF0,0x90,0x13,0xB4,0xE0,0xFF,0x7B,0x01,0xE4,0xFD,0x12,0x2C,
-
0xF6,0x80,0x08,0x12,0x1A,0xB2,0x12,0x14,0x97,0xE4,0xF0,0x12,0x19,0xD0,0x80,0xBA,
-
0xE4,0xF5,0xD9,0xF5,0xDA,0xF5,0xDB,0x90,0x13,0xB5,0xF0,0x90,0x88,0xC1,0x12,0x1C,
-
0x99,0x50,0x0B,0xE4,0xFB,0xFD,0x12,0x2C,0xF6,0x12,0x1A,0xC3,0x80,0xED,0x90,0x88,
-
0xC0,0xE0,0xFF,0x90,0x88,0xC1,0xE0,0xC3,0x9F,0x50,0x02,0x80,0x03,0x90,0x88,0xC0,
-
0xE0,0x90,0x13,0xBC,0xF0,0xE4,0x90,0x13,0xB6,0xF0,0x90,0x13,0xBC,0xE0,0xFF,0x90,
-
0x13,0xB6,0xE0,0xC3,0x9F,0x40,0x03,0x02,0x11,0x8D,0xC2,0x12,0xC2,0x14,0xD2,0xB4,
-
0x20,0xB4,0x06,0x30,0x11,0x03,0x20,0xDD,0x05,0x75,0x9E,0x55,0x80,0xF2,0xC2,0xDD,
-
0xC2,0x11,0xAF,0xE2,0xAD,0xE3,0x12,0x18,0x5B,0xFF,0xEC,0x3E,0xAD,0x07,0xFC,0x90,
-
0xF2,0xB0,0xE0,0xD3,0x94,0x06,0x50,0x33,0x12,0x14,0x9F,0xE0,0xFE,0xA3,0xE0,0xFF,
-
0xBE,0x06,0x10,0xBF,0x40,0x0D,0x12,0x14,0x9F,0x74,0x3E,0xF0,0xA3,0x74,0x80,0xF0,
-
0x02,0x0D,0x87,0x12,0x14,0x9F,0xE0,0xFE,0xA3,0xE0,0x64,0x64,0x4E,0x70,0x38,0x12,
-
0x14,0x9F,0x74,0x01,0xF0,0xA3,0x74,0x2C,0xF0,0x80,0x2C,0x12,0x14,0x9F,0xE0,0xFE,
-
0xA3,0xE0,0xFF,0xBE,0x06,0x0F,0xBF,0x40,0x0C,0x12,0x14,0x9F,0x74,0x01,0xF0,0xA3,
-
0x74,0x40,0xF0,0x80,0x12,0x12,0x14,0x9F,0xE0,0xFE,0xA3,0xE0,0x64,0x64,0x4E,0x70,
-
0x06,0x12,0x14,0x9F,0x12,0x19,0xE9,0x12,0x14,0x9F,0xE0,0xFE,0xA3,0xE0,0xD3,0x9D,
-
0xEE,0x9C,0x50,0x03,0x02,0x11,0x8D,0xD3,0xED,0x94,0xC8,0xEC,0x94,0x00,0x40,0x19,
-
0xAF,0xDF,0xEF,0x12,0x13,0xF7,0x12,0x15,0x6D,0xFF,0xAB,0xE1,0xEB,0x12,0x13,0xC6,
-
0x12,0x15,0xC3,0x12,0x15,0x6D,0x02,0x0E,0x21,0xD3,0xED,0x94,0x64,0xEC,0x94,0x00,
-
0x40,0x66,0xAF,0xDF,0xEF,0x12,0x13,0xF7,0x12,0x16,0x34,0xD5,0x82,0x02,0x15,0x83,
-
0x15,0x82,0xE0,0x33,0xFE,0xAB,0xDF,0xEB,0x12,0x13,0xF7,0x12,0x14,0x80,0xAB,0xE1,
-
0xEB,0x12,0x14,0x75,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,0xF9,0xFF,0xAB,
-
0xE1,0xEB,0x12,0x13,0xC6,0x12,0x15,0xC3,0x12,0x16,0x34,0xD5,0x82,0x02,0x15,0x83,
-
0x15,0x82,0xE0,0x33,0xFE,0xAB,0xDF,0xEB,0x12,0x15,0xC6,0x12,0x14,0x80,0xAB,0xE1,
-
0xEB,0x12,0x14,0x35,0x12,0x14,0x80,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,
-
0xF9,0xFF,0xAB,0xE1,0xEB,0x02,0x0E,0xE7,0xAE,0x04,0xAF,0x05,0xD3,0xED,0x94,0x32,
-
0xEC,0x94,0x00,0x40,0x3B,0xAF,0xE1,0xEF,0x12,0x16,0xFA,0x12,0x15,0x6D,0xFF,0xAD,
-
0xDF,0xED,0x12,0x13,0xF7,0x12,0x13,0x68,0x2F,0xFF,0xEC,0x12,0x19,0x61,0xAD,0xE1,
-
0xED,0x12,0x13,0xC6,0xAF,0xE1,0xEF,0x12,0x14,0x35,0x12,0x15,0x6D,0xFF,0xAD,0xDF,
-
0xED,0x12,0x13,0x5D,0x2F,0xFF,0xEC,0x12,0x19,0x61,0xAD,0xE1,0xED,0x02,0x0E,0xE7,
-
0xAF,0xE1,0xEF,0x12,0x16,0x29,0xD5,0x82,0x02,0x15,0x83,0x15,0x82,0xE0,0x33,0xFE,
-
0xAD,0xE1,0xED,0x12,0x16,0xFA,0x12,0x13,0x68,0x2F,0xFF,0xEC,0x3E,0xFE,0xAD,0xDF,
-
0xED,0x12,0x13,0xF7,0x12,0x13,0x68,0x2F,0xFF,0xEC,0x3E,0xFE,0xEF,0x78,0x02,0xCE,
-
0xC3,0x13,0xCE,0x13,0xD8,0xF9,0xFF,0xAD,0xE1,0xED,0x12,0x13,0xC6,0xAF,0xE1,0xEF,
-
0x12,0x14,0x35,0x12,0x16,0x34,0xD5,0x82,0x02,0x15,0x83,0x15,0x82,0xE0,0x33,0xFE,
-
0xAD,0xE1,0xED,0x12,0x14,0x35,0x12,0x13,0x68,0x2F,0xFF,0xEC,0x3E,0xFE,0xAD,0xDF,
-
0xED,0x12,0x13,0x5D,0x2F,0xFF,0xEC,0x3E,0xFE,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,
-
0x13,0xD8,0xF9,0xFF,0xAD,0xE1,0xED,0x12,0x14,0x35,0x12,0x13,0xD1,0xAF,0xE1,0xEF,
-
0x12,0x14,0xFC,0x12,0x15,0x6D,0xFF,0xAD,0xE1,0xED,0x12,0x16,0xFA,0x12,0x13,0x68,
-
0x12,0x1A,0xE9,0x12,0x4E,0x90,0x12,0x1B,0x5A,0xAF,0xE1,0xEF,0x12,0x15,0x88,0x12,
-
0x15,0x6D,0xFF,0xAD,0xE1,0xED,0x12,0x14,0x35,0x12,0x13,0x68,0x12,0x1A,0xE9,0x12,
-
0x4E,0x90,0x12,0x16,0x90,0x40,0x3B,0xD2,0x12,0xD2,0x14,0xAF,0xE1,0x74,0x83,0x2F,
-
0x12,0x15,0x9B,0xE0,0xD3,0x94,0x04,0x40,0x0C,0xAF,0xE1,0x74,0x83,0x2F,0x12,0x15,
-
0x9B,0xE0,0x24,0xFC,0xF0,0xAF,0xE1,0x74,0x83,0x2F,0x12,0x15,0x9B,0xE0,0xC3,0x94,
-
0x01,0x50,0x0A,0xAF,0xE1,0x74,0x83,0x2F,0x12,0x15,0x9B,0xE4,0xF0,0x12,0x19,0x0F,
-
0x80,0x45,0xAF,0xE1,0x74,0x83,0x2F,0x12,0x15,0x9B,0xE0,0x04,0xF0,0xAF,0xE1,0x74,
-
0x83,0x2F,0x12,0x15,0x9B,0xE0,0xD3,0x94,0x16,0x40,0x10,0xAF,0xE1,0x74,0x83,0x2F,
-
0x12,0x15,0x9B,0x74,0x16,0xF0,0x12,0x1B,0xAE,0x80,0x18,0x12,0x1B,0xD8,0x50,0x05,
-
0x12,0x1C,0x84,0x40,0x06,0x30,0x06,0x03,0x12,0x19,0x0F,0x12,0x1B,0xE0,0x40,0x03,
-
0x12,0x19,0x0F,0xC2,0x12,0xC2,0x14,0xAF,0xE1,0x74,0x83,0x2F,0x12,0x15,0x9B,0xE0,
-
0xFF,0x90,0x14,0x05,0xE0,0xFC,0xA3,0xE0,0xFD,0xD3,0x9F,0xEC,0x94,0x00,0x40,0x11,
-
0xD2,0x12,0xD2,0x14,0xAF,0xE1,0x74,0x79,0x2F,0x12,0x17,0xCB,0x74,0x01,0xF0,0x80,
-
0x04,0xC2,0x12,0xC2,0x14,0xAF,0xE1,0x74,0x79,0x2F,0x12,0x17,0xCB,0xE0,0xAF,0xE1,
-
0xB4,0x01,0x08,0x12,0x14,0xA1,0x12,0x1B,0xE8,0x80,0x06,0x12,0x14,0xA1,0x12,0x19,
-
0xE9,0xAF,0xE1,0x74,0x79,0x2F,0x12,0x17,0xCB,0xE0,0xB4,0x01,0x13,0xD3,0xED,0x94,
-
0x01,0xEC,0x94,0x00,0x40,0x06,0xD2,0x12,0xD2,0x14,0x80,0x04,0xC2,0x12,0xC2,0x14,
-
0xAF,0xE1,0x74,0x98,0x2F,0x12,0x17,0x95,0xE0,0x64,0x01,0x60,0x03,0x02,0x10,0xB2,
-
0xAF,0xDF,0x74,0xE3,0x2F,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0xE0,0xFF,0xAE,0xE1,
-
0x74,0xA2,0x2E,0x12,0x16,0x55,0xE0,0xC3,0x9F,0x50,0x3C,0xC2,0x10,0xAF,0xE1,0x74,
-
0x3C,0x2F,0x12,0x15,0x4B,0xE0,0xFF,0xAD,0xDF,0xED,0x25,0xE0,0x24,0xED,0xF5,0x82,
-
0xE4,0x34,0x13,0x12,0x13,0x68,0xD3,0x9F,0x74,0x80,0xF8,0xEC,0x64,0x80,0x98,0xAF,
-
0xE1,0x74,0xA2,0x50,0x0A,0x2F,0x12,0x16,0x55,0xE0,0x04,0xF0,0x02,0x10,0xB4,0x2F,
-
0x12,0x16,0x55,0xE4,0xF0,0x80,0x3D,0xAF,0xE1,0x74,0x98,0x2F,0x12,0x17,0x95,0xE4,
-
0xF0,0xAF,0xE1,0x74,0xA2,0x2F,0x12,0x16,0x55,0xE4,0xF0,0xAF,0xE1,0xEF,0x12,0x18,
-
0x63,0x12,0x15,0x6D,0xFF,0xAD,0xE1,0xED,0x12,0x13,0xC6,0xAF,0xE1,0xEF,0x12,0x19,
-
0xC4,0x12,0x15,0x6D,0xFF,0xAD,0xE1,0xED,0x12,0x14,0x35,0x12,0x13,0xD1,0xD2,0x10,
-
0x80,0x02,0xD2,0x10,0x30,0x01,0x18,0xAF,0xDF,0xEF,0x12,0x13,0xF7,0x12,0x15,0x6D,
-
0xFF,0xAD,0xE1,0xED,0x12,0x14,0xFC,0x12,0x13,0xD1,0x12,0x15,0xC3,0x80,0x32,0x30,
-
0x12,0x3C,0x30,0x14,0x39,0x30,0x10,0x36,0x12,0x19,0x74,0x40,0x03,0x12,0x1C,0x8B,
-
0x12,0x19,0x82,0x40,0x03,0x12,0x1C,0x92,0xAF,0xE1,0xEF,0x12,0x16,0xFA,0x12,0x15,
-
0x6D,0xFF,0xAD,0xE1,0xED,0x12,0x14,0xFC,0x12,0x13,0xD1,0xAF,0xE1,0xEF,0x12,0x14,
-
0x35,0x12,0x15,0x6D,0xFF,0xAD,0xE1,0xED,0x12,0x15,0x88,0x12,0x13,0xD1,0xAF,0xDF,
-
0xEF,0x12,0x13,0xF7,0x12,0x15,0x6D,0xFF,0xAD,0xE1,0xED,0x12,0x17,0xA3,0x12,0x13,
-
0xD1,0x12,0x15,0xC3,0x12,0x15,0x6D,0xFF,0xAD,0xE1,0xED,0x12,0x19,0x03,0x12,0x13,
-
0xD1,0xAF,0xDF,0x74,0x00,0x2F,0x12,0x18,0xE9,0xE0,0xFF,0xAE,0xE1,0x74,0x14,0x2E,
-
0xF5,0x82,0xE4,0x34,0x8A,0xF5,0x83,0xEF,0xF0,0xAF,0xDF,0x74,0x28,0x2F,0x12,0x1A,
-
0x25,0xE0,0xFF,0xAE,0xE1,0x74,0x3C,0x2E,0x12,0x15,0x4B,0xEF,0xF0,0xAF,0xE1,0x74,
-
0xE5,0x2F,0x12,0x14,0x97,0x74,0x02,0x12,0x17,0x60,0xAF,0xE1,0x74,0xD1,0x2F,0x12,
-
0x17,0x46,0x7B,0x01,0x7D,0x01,0xAF,0xE1,0x12,0x2C,0xF6,0xE4,0xFB,0x7D,0x01,0xAF,
-
0xDF,0x12,0x2C,0xF6,0x90,0x13,0xB6,0xE0,0x04,0xF0,0x02,0x0C,0xEA,0x12,0x19,0x16,
-
0x50,0x45,0x90,0x88,0xC0,0xE0,0x94,0x00,0x40,0x3D,0xE4,0x90,0x13,0xB4,0xF0,0x12,
-
0x18,0xF1,0x50,0x33,0x7B,0x01,0x12,0x12,0x90,0x60,0x26,0xA3,0xE0,0xC3,0x95,0x0D,
-
0x50,0x1F,0x90,0x13,0xB4,0xE0,0xFF,0x12,0x16,0x53,0xE4,0xF0,0x12,0x17,0x92,0xE4,
-
0xF0,0x74,0xE5,0x2F,0x12,0x14,0x97,0x74,0x03,0xF0,0xEF,0x12,0x14,0xA2,0x12,0x17,
-
0x25,0x12,0x19,0xD0,0x02,0x11,0x9F,0x12,0x19,0x16,0x40,0x03,0x02,0x12,0x8F,0x90,
-
0x88,0xC1,0xE0,0x94,0x00,0x50,0x03,0x02,0x12,0x8F,0xE4,0x90,0x13,0xB5,0xF0,0x90,
-
0x88,0xB0,0x12,0x1C,0x99,0x40,0x03,0x02,0x12,0x8F,0xE4,0xFB,0x12,0x12,0x90,0x70,
-
0x03,0x02,0x12,0x89,0xE4,0x90,0x13,0xB4,0xF0,0x12,0x18,0xF1,0x50,0x7B,0x74,0xE5,
-
0x2F,0x12,0x14,0x97,0xE0,0x70,0x6C,0x12,0x19,0x16,0x50,0x67,0x12,0x12,0xDE,0xFD,
-
0xEE,0x12,0x14,0x35,0x12,0x17,0xBC,0x12,0x18,0xE2,0xE0,0xFE,0x90,0x13,0xB4,0x12,
-
0x15,0x2F,0xEF,0xF0,0x12,0x13,0xF2,0x12,0x13,0x68,0xFD,0x90,0x13,0xB4,0xE0,0xFE,
-
0x12,0x14,0xFC,0x12,0x13,0x55,0xFD,0xEE,0x12,0x15,0x88,0x12,0x17,0xBC,0x74,0xE5,
-
0x2E,0x12,0x14,0x97,0x74,0x01,0xF0,0xEE,0x12,0x14,0xA2,0x12,0x19,0xE9,0x74,0x98,
-
0x2E,0x12,0x13,0xE8,0x12,0x13,0x68,0xFD,0xEE,0x12,0x18,0x63,0x12,0x13,0x55,0x12,
-
0x17,0xAF,0x74,0xD1,0x2E,0x12,0x17,0x46,0x12,0x17,0x6D,0x90,0x13,0xB8,0xE0,0x04,
-
0xF0,0x80,0x06,0x12,0x19,0xD0,0x02,0x12,0x09,0x12,0x1A,0xC3,0x02,0x11,0xEF,0x22,
-
0x7D,0x02,0x12,0x2C,0xF6,0x90,0x13,0xB7,0xEF,0xF0,0x22,0x74,0x04,0x2D,0xF5,0x82,
-
0x74,0x60,0x3C,0xF5,0x83,0xE0,0xFF,0x74,0x00,0x2D,0xF5,0x82,0x74,0x60,0x3C,0xF5,
-
0x83,0xE0,0xC3,0x9F,0xFF,0xE4,0x94,0x00,0xFE,0x90,0x13,0xBE,0xE0,0x2F,0xF0,0x90,
-
0x13,0xBD,0xE0,0x3E,0xF0,0x22,0x74,0x02,0x2D,0xF5,0x82,0x74,0x60,0x3C,0xF5,0x83,
-
0xE0,0xFF,0x74,0x00,0x2D,0xF5,0x82,0x74,0x60,0x3C,0xF5,0x83,0xE0,0x22,0x90,0x13,
-
0xB5,0xE0,0xFF,0x25,0xE0,0x25,0xE0,0x24,0x00,0xF5,0x82,0xE4,0x34,0xF2,0xF5,0x83,
-
0xE0,0xFC,0xA3,0xE0,0xFD,0x90,0x13,0xB4,0xE0,0xFE,0x25,0xE0,0x25,0xE0,0x24,0x50,
-
0xF5,0x82,0xE4,0x34,0xF2,0xF5,0x83,0xEC,0xF0,0xA3,0xED,0xF0,0xEF,0x25,0xE0,0x25,
-
0xE0,0x24,0x02,0xF5,0x82,0xE4,0x34,0xF2,0xF5,0x83,0xE0,0xFC,0xA3,0xE0,0xFD,0xEE,
-
0x25,0xE0,0x25,0xE0,0x24,0x52,0xF5,0x82,0xE4,0x34,0xF2,0xF5,0x83,0xEC,0xF0,0xA3,
-
0xED,0xF0,0x90,0x13,0xB5,0xE0,0xFF,0x25,0xE0,0x25,0xE0,0x24,0x00,0xF5,0x82,0xE4,
-
0x34,0xF2,0xF5,0x83,0xE0,0xFC,0xA3,0xE0,0xFD,0xEE,0x25,0xE0,0x25,0xE0,0x24,0x00,
-
0xF5,0x82,0xE4,0x34,0x89,0xF5,0x83,0xEC,0xF0,0xA3,0xED,0xF0,0xEF,0x25,0xE0,0x25,
-
0xE0,0x24,0x02,0xF5,0x82,0xE4,0x34,0xF2,0xF5,0x83,0xE0,0xFC,0xA3,0xE0,0x22,0x90,
-
0x13,0xBD,0xA3,0xE0,0xFC,0x90,0x13,0xB4,0xE0,0x25,0xE0,0xFF,0x90,0x13,0xB3,0xE0,
-
0x33,0xFE,0x74,0x80,0x2F,0xF5,0x82,0x74,0x81,0x3E,0xF5,0x83,0xE0,0x22,0x90,0x13,
-
0xBB,0xE0,0xFD,0x25,0xE0,0x25,0xE0,0x24,0x00,0xF5,0x82,0xE4,0x34,0x89,0xF5,0x83,
-
0xE0,0xFE,0xA3,0xE0,0xFF,0x90,0x13,0xBA,0xE0,0xFC,0x25,0xE0,0x25,0xE0,0x24,0x00,
-
0xF5,0x82,0xE4,0x34,0xF2,0xF5,0x83,0xE0,0xFA,0xA3,0xE0,0x2F,0xFF,0xEA,0x3E,0xC3,
-
0x13,0xFE,0xEF,0x13,0xFF,0xED,0x25,0xE0,0x25,0xE0,0x24,0x00,0xF5,0x82,0xE4,0x34,
-
0x89,0xF5,0x83,0xEE,0xF0,0xA3,0xEF,0xF0,0x22,0xFF,0x74,0x02,0x2D,0xF5,0x82,0x74,
-
0x60,0x3C,0xF5,0x83,0xE0,0xC3,0x9F,0x22,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0x74,
-
0x01,0xF0,0x90,0x13,0xB5,0xE0,0xFF,0x25,0xE0,0x25,0xE0,0x24,0x00,0xF5,0x82,0xE4,
-
0x34,0xF2,0x22,0x90,0x13,0xB4,0xE0,0x25,0xE0,0xFF,0x90,0x13,0xB3,0xE0,0x33,0xFE,
-
0x74,0x81,0x2F,0xF5,0x82,0x74,0x81,0x3E,0xF5,0x83,0xE0,0x22,0xFD,0xEF,0x25,0xE0,
-
0x25,0xE0,0x24,0x50,0xF5,0x82,0xE4,0x34,0x89,0xF5,0x83,0xEC,0xF0,0xA3,0xED,0xF0,
-
0x90,0x13,0xBB,0xE0,0xFF,0x25,0xE0,0x25,0xE0,0x24,0x02,0xF5,0x82,0xE4,0x34,0x89,
-
0x22,0x90,0x13,0xB4,0xE0,0xFE,0xA3,0xE0,0xFF,0xED,0x25,0xE0,0x25,0xE0,0x24,0xAE,
-
0xF5,0x82,0xE4,0x34,0x89,0xF5,0x83,0xEE,0xF0,0xA3,0xEF,0xF0,0xED,0x25,0xE0,0x25,
-
0xE0,0x24,0xAC,0xF5,0x82,0xE4,0x34,0x89,0x22,0xF5,0x83,0xE0,0xFA,0xA3,0xE0,0x2F,
-
0xFF,0xEA,0x3E,0xFE,0xED,0x25,0xE0,0x25,0xE0,0x24,0x00,0xF5,0x82,0xE4,0x34,0x89,
-
0xF5,0x83,0xE0,0xFA,0xA3,0xE0,0x2F,0xFF,0xEA,0x3E,0xFE,0x22,0xED,0x04,0x33,0x33,
-
0x33,0x54,0xF8,0xFF,0x74,0xE5,0x2D,0xF5,0x82,0xE4,0x34,0x88,0xF5,0x83,0x22,0xAF,
-
0xE1,0xEF,0x25,0xE0,0x24,0x83,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0x22,0x75,0xF0,
-
0x04,0x12,0x3D,0x99,0xE0,0xFC,0xA3,0xE0,0xFD,0xA3,0xE0,0xFE,0xA3,0xE0,0xFF,0x22,
-
0x15,0x82,0xEF,0x54,0xF0,0xFF,0xED,0x25,0xE0,0x25,0xE0,0x24,0xAE,0xF5,0x82,0xE4,
-
0x34,0x89,0xF5,0x83,0xE0,0xA3,0xE0,0x54,0x0F,0x4F,0xFF,0x90,0x8F,0xF0,0xE0,0x75,
-
0xF0,0x06,0xA4,0x22,0x9E,0xFE,0xEF,0xC4,0xF8,0x54,0x0F,0xC8,0x68,0xFF,0xEE,0xC4,
-
0x54,0xF0,0x48,0xFE,0x7C,0x00,0x7D,0x20,0x12,0x3C,0x9D,0xEB,0x25,0xE0,0x25,0xE0,
-
0x24,0x50,0xF5,0x82,0xE4,0x34,0x89,0x22,0xFD,0xEE,0x25,0xE0,0x25,0xE0,0x24,0x52,
-
0xF5,0x82,0xE4,0x34,0xF2,0xF5,0x83,0xEC,0xF0,0xA3,0xED,0xF0,0x90,0x13,0xBA,0xE0,
-
0xFF,0x24,0x00,0xF5,0x82,0xE4,0x34,0x8A,0xF5,0x83,0xE0,0x90,0x13,0xBB,0xFE,0xE0,
-
0xFD,0x24,0x14,0xF5,0x82,0xE4,0x34,0x8A,0xF5,0x83,0xEE,0xF0,0x74,0x28,0x2F,0xF5,
-
0x82,0xE4,0x34,0x8A,0xF5,0x83,0xE0,0xFF,0x74,0x3C,0x2D,0xF5,0x82,0xE4,0x34,0x8A,
-
0xF5,0x83,0x22,0xF5,0x83,0xE0,0xFD,0xA3,0xE0,0x90,0x13,0xB4,0xCD,0xF0,0xA3,0xED,
-
0xF0,0xEF,0x25,0xE0,0x25,0xE0,0x24,0xAE,0xF5,0x82,0xE4,0x34,0x89,0xF5,0x83,0xE0,
-
0xFE,0xA3,0xE0,0x22,0x90,0xF1,0x07,0xE0,0xFF,0xAE,0x0C,0xEE,0x8F,0xF0,0xA4,0x24,
-
0x9C,0xFF,0xE5,0xF0,0x34,0xFF,0xFE,0xEB,0x25,0xE0,0x25,0xE0,0x24,0x52,0xF5,0x82,
-
0xE4,0x34,0x89,0x22,0x90,0x13,0xBB,0xE0,0xFF,0x24,0x83,0xF5,0x82,0xE4,0x34,0x12,
-
0xF5,0x83,0x22,0x90,0x13,0xB3,0xE0,0x75,0xF0,0x14,0xA4,0x24,0xB4,0xF5,0x82,0xE4,
-
0x34,0x37,0xF5,0x83,0x22,0xC3,0x9F,0xFE,0xE4,0x94,0x00,0x90,0x13,0xBD,0xF0,0xA3,
-
0xCE,0xF0,0x22,0xAF,0xDF,0xEF,0x25,0xE0,0x25,0xE0,0x24,0x02,0xF5,0x82,0xE4,0x34,
-
0xF2,0x22,0x75,0xF0,0x14,0xA4,0x24,0x00,0xF5,0x82,0xE5,0xF0,0x34,0x10,0xF5,0x83,
-
0xE5,0x82,0x2B,0xF5,0x82,0xE4,0x35,0x83,0xF5,0x83,0x22,0x12,0x3D,0x5C,0x90,0x13,
-
0xB3,0xE0,0xFD,0x25,0xE0,0x24,0x53,0xF5,0x82,0xE4,0x34,0x50,0xF5,0x83,0xE0,0xFE,
-
0xED,0x25,0xE0,0x24,0x52,0xF5,0x82,0xE4,0x34,0x50,0xF5,0x83,0xE0,0x7C,0x00,0x24,
-
0x00,0xFF,0xEC,0x3E,0xFE,0x90,0x13,0xB3,0xE0,0x24,0x00,0xF5,0x82,0xE4,0x34,0x50,
-
0xF5,0x83,0xE0,0x22,0x90,0x13,0xBB,0xE0,0xFD,0x25,0xE0,0x25,0xE0,0x24,0x00,0xF5,
-
0x82,0xE4,0x34,0x89,0xF5,0x83,0xA3,0xE0,0x25,0xE0,0xFF,0x05,0x82,0x22,0x90,0x13,
-
0xBA,0xE0,0xFF,0x24,0xE3,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0xE0,0xFE,0x90,0x13,
-
0xBB,0xE0,0xFD,0x24,0xA2,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0x22,0xF5,0x83,0xE0,
-
0x7C,0x00,0x24,0x00,0xFF,0xEC,0x3E,0xFE,0x7D,0x14,0x12,0x3C,0x48,0x90,0x13,0xCB,
-
0xEE,0xF0,0xA3,0xEF,0xF0,0x90,0x13,0xB4,0xE0,0x25,0xE0,0xFD,0x90,0x13,0xB3,0xE0,
-
0x33,0xFC,0x74,0x80,0x2D,0xF5,0x82,0x74,0x81,0x3C,0xF5,0x83,0xE0,0x25,0xE0,0x22,
-
0x90,0x14,0x03,0xEE,0xF0,0xA3,0xEF,0xF0,0x90,0x14,0x03,0xE0,0xFE,0xA3,0xE0,0xFF,
-
0x90,0x14,0x02,0xE0,0x2F,0xFF,0x90,0x14,0x01,0xE0,0x3E,0xFE,0x90,0x14,0x05,0xF0,
-
0xA3,0xEF,0xF0,0xD3,0x94,0x0C,0xEE,0x94,0x00,0x22,0xF5,0x83,0xEE,0xF0,0xA3,0xEF,
-
0xF0,0xED,0x25,0xE0,0x25,0xE0,0x24,0xAE,0xF5,0x82,0xE4,0x34,0x89,0x22,0x90,0x13,
-
0xB3,0xE0,0xFF,0x24,0xBD,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0x22,0xF5,0x83,0x74,
-
0xFF,0xF0,0xEF,0x75,0xF0,0x06,0xA4,0x22,0x90,0x88,0xC1,0xE0,0xFF,0x90,0x13,0xB3,
-
0xE0,0xFE,0xC3,0x9F,0x22,0x90,0x13,0xBB,0xE0,0xFF,0x25,0xE0,0x25,0xE0,0x24,0x00,
-
0xF5,0x82,0xE4,0x34,0x89,0x22,0x74,0xD3,0x2E,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,
-
0xE0,0xFF,0x74,0xD8,0x2E,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0xEF,0xF0,0x90,0x13,
-
0xB3,0xE0,0x04,0xF0,0x22,0xE4,0xF0,0xA3,0x74,0x64,0xF0,0x74,0x79,0x2F,0xF5,0x82,
-
0xE4,0x34,0x12,0xF5,0x83,0xE4,0xF0,0x90,0x88,0xC0,0xE0,0x14,0xF0,0x90,0x13,0xB8,
-
0xE0,0x04,0xF0,0x74,0xD1,0x2F,0xF5,0x82,0xE4,0x34,0x88,0xF5,0x83,0xE4,0xF0,0x22,
-
0xEF,0xF0,0x90,0x13,0xBA,0xE0,0x24,0xA0,0xF5,0x82,0xE4,0x34,0x37,0xF5,0x83,0xE4,
-
0xF0,0x90,0x13,0xB8,0xE0,0x04,0xF0,0x90,0x88,0xC0,0xE0,0x14,0xF0,0x90,0x88,0xC1,
-
0xE0,0x14,0xF0,0x22,0xFF,0x74,0xFE,0x2D,0xF5,0x82,0x74,0x5F,0x22,0xFF,0x74,0x28,
-
0x2D,0xF5,0x82,0x74,0x60,0x22,0xFF,0x74,0xD8,0x2D,0xF5,0x82,0x74,0x5F,0x22,0x74,
-
0x02,0xF0,0x74,0x98,0x2F,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0x22,0xFD,0x90,0x13,
-
0xBB,0xE0,0xFE,0x25,0xE0,0x25,0xE0,0x24,0x50,0xF5,0x82,0xE4,0x34,0xF2,0x22,0xFD,
-
0xEE,0x25,0xE0,0x25,0xE0,0x24,0x9A,0xF5,0x82,0xE4,0x34,0x12,0xF5,0x83,0xEC,0xF0,
-
0xA3,0xED,0xF0,0x22,0x90,0x13,0xBB,0xE0,0xFF,0x24,0x79,0xF5,0x82,0xE4,0x34,0x12,
-
0xF5,0x83,0x22,0xE0,0xFD,0x74,0xD3,0x2F,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0xED,
-
0xF0,0x90,0x13,0xCF,0xE0,0xF8,0xA3,0xE0,0xF9,0xA3,0xE0,0xFA,0xA3,0xE0,0xFB,0x22,
-
0xFF,0x74,0xFC,0x2D,0xF5,0x82,0x74,0x5F,0x22,0xFF,0x74,0x50,0x2D,0xF5,0x82,0x74,
-
0x60,0x22,0xFF,0x74,0xB0,0x2D,0xF5,0x82,0x74,0x5F,0x22,0xE0,0xF8,0xA3,0xE0,0xF9,
-
0xA3,0xE0,0xFA,0xA3,0xE0,0xFB,0xEF,0x2B,0xFF,0xEE,0x3A,0xFE,0xED,0x39,0xFD,0xEC,
-
0x38,0xFC,0x22,0xF0,0x90,0x13,0xB3,0xE0,0xFF,0x75,0xF0,0x04,0xA4,0x22,0xAF,0x0B,
-
0x90,0xF1,0x06,0xE0,0x8F,0xF0,0xA4,0x24,0xFF,0xFF,0xE5,0xF0,0x34,0xFF,0xFE,0x22,
-
0x90,0x13,0xB3,0xE0,0x75,0xF0,0x04,0xA4,0x24,0x80,0xF5,0x82,0xE5,0xF0,0x34,0x86,
-
0xF5,0x83,0x22,0xC2,0xDA,0xC2,0x11,0xAF,0xA6,0xAD,0xA7,0xEF,0xFE,0x7C,0x00,0xE4,
-
0x2D,0x22,0xEF,0x25,0xE0,0x25,0xE0,0x24,0x98,0xF5,0x82,0xE4,0x34,0x12,0x22,0x90,
-
0x13,0xB4,0xE0,0x25,0xE0,0xFD,0x90,0x13,0xB3,0xE0,0x33,0xFC,0x74,0x81,0x2D,0xF5,
-
0x82,0x74,0x81,0x22,0xFF,0x74,0x06,0x2D,0xF5,0x82,0x74,0x60,0x22,0xFF,0x74,0xFA,
-
0x2D,0xF5,0x82,0x74,0x5F,0x22,0xFF,0x74,0x78,0x2D,0xF5,0x82,0x74,0x60,0x22,0xFF,
-
0x74,0x88,0x2D,0xF5,0x82,0x74,0x5F,0x22,0xE0,0xFD,0xEF,0x25,0xE0,0x24,0xED,0xF5,
-
0x82,0xE4,0x34,0x13,0xF5,0x83,0xE0,0xFE,0xA3,0xE0,0xD3,0x9D,0x74,0x80,0xF8,0xEE,
-
0x64,0x80,0x98,0x90,0x13,0xBB,0xE0,0x22,0x90,0x13,0xCB,0xE0,0xFC,0xA3,0xE0,0xFD,
-
0xA3,0xE0,0xFE,0xA3,0xE0,0xFF,0x22,0x7B,0xE0,0x7A,0x2E,0xE4,0xF9,0xF8,0xC3,0x02,
-
0x3D,0x38,0x90,0x13,0xB5,0xE0,0xFF,0x24,0x00,0xF5,0x82,0xE4,0x34,0x8A,0xF5,0x83,
-
0x22,0x90,0x13,0xB4,0xE0,0xFF,0xC3,0x95,0x0D,0x22,0xFF,0x74,0x04,0x2D,0xF5,0x82,
-
0x74,0x60,0x22,0x25,0xE0,0x25,0xE0,0x24,0x52,0xF5,0x82,0xE4,0x34,0xF2,0x22,0x90,
-
0xF1,0x0A,0x74,0x01,0xF0,0x22,0x90,0x13,0xB8,0xE0,0xC3,0x95,0x0D,0x22,0x74,0xC2,
-
0x2E,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0x22,0xFF,0x74,0x08,0x2D,0xF5,0x82,0x74,
-
0x60,0x22,0xFF,0x74,0xF8,0x2D,0xF5,0x82,0x74,0x5F,0x22,0xFF,0x74,0xA0,0x2D,0xF5,
-
0x82,0x74,0x60,0x22,0xFF,0x74,0x60,0x2D,0xF5,0x82,0x74,0x5F,0x22,0x15,0x82,0xE0,
-
0x33,0xFE,0x90,0x13,0xBB,0xE0,0xFC,0x22,0xF5,0x83,0xE0,0xFA,0xA3,0xE0,0x2F,0xFF,
-
0xEA,0x3E,0xC3,0x13,0xFE,0xEF,0x13,0xFF,0x22,0xD3,0x9F,0xEE,0x64,0x80,0xF8,0xEC,
-
0x64,0x80,0x98,0x22,0xD3,0x90,0x14,0x06,0xE0,0x94,0x78,0x90,0x14,0x05,0xE0,0x94,
-
0x00,0x22,0xD3,0x90,0x14,0x06,0xE0,0x94,0x72,0x90,0x14,0x05,0xE0,0x94,0x01,0x22,
-
0x25,0xE0,0x24,0xC0,0xF5,0x82,0xE4,0x34,0x87,0x22,0x75,0xF0,0x04,0x12,0x3D,0x99,
-
0xE0,0xF8,0xA3,0xE0,0xF9,0xA3,0xE0,0xFA,0xA3,0xE0,0xFB,0xC3,0x02,0x3D,0x38,0x24,
-
0x05,0xF5,0x82,0xE4,0x34,0x8F,0xF5,0x83,0x22,0x24,0x7D,0xF5,0x82,0xE4,0x34,0x8F,
-
0xF5,0x83,0x22,0xED,0x25,0xE0,0x25,0xE0,0x24,0x9A,0xF5,0x82,0xE4,0x34,0x12,0x22,
-
0x90,0x13,0xB4,0xE0,0x04,0xF0,0x22,0xEB,0x2F,0xFF,0xEA,0x3E,0xFE,0xE9,0x3D,0xFD,
-
0xE8,0x3C,0xFC,0x90,0x13,0xCF,0x02,0x3D,0x5C,0xE4,0xF0,0xA3,0x74,0x64,0xF0,0x22,
-
0x90,0x13,0xB3,0xE0,0xFF,0xC3,0x95,0x0D,0x22,0x74,0x14,0x2F,0xF5,0x82,0xE4,0x34,
-
0x8A,0xF5,0x83,0xE0,0xC3,0x94,0x01,0x74,0x80,0x94,0x88,0x22,0xF5,0x83,0xE0,0xFE,
-
0xA3,0xE0,0x78,0x04,0x22,0x24,0x60,0xF5,0x82,0xE4,0x34,0x88,0xF5,0x83,0x22,0x90,
-
0x13,0xB4,0xE0,0x24,0x28,0xF5,0x82,0xE4,0x34,0x8A,0xF5,0x83,0x22,0x2E,0xF5,0x82,
-
0xE4,0x34,0x37,0xF5,0x83,0x22,0xE4,0xF0,0x74,0xBE,0x2F,0xF5,0x82,0xE4,0x34,0x13,
-
0xF5,0x83,0xE0,0x04,0xF0,0xD2,0x1B,0x22,0x78,0x11,0xE6,0x24,0x14,0x33,0x33,0x33,
-
0x54,0xF8,0xFF,0x78,0x10,0xE6,0xFE,0x4F,0xFF,0x22,0xFF,0x74,0x0A,0x2D,0xF5,0x82,
-
0x74,0x60,0x22,0xFF,0x74,0xF6,0x2D,0xF5,0x82,0x74,0x5F,0x22,0xFF,0x74,0xC8,0x2D,
-
0xF5,0x82,0x74,0x60,0x22,0xFF,0x74,0x38,0x2D,0xF5,0x82,0x74,0x5F,0x22,0x75,0xF0,
-
0x14,0xA4,0x24,0x00,0xF5,0x82,0xE5,0xF0,0x34,0x10,0xF5,0x83,0xE5,0x82,0x22,0xE0,
-
0xC4,0xF8,0x54,0xF0,0xC8,0x68,0xFE,0xA3,0xE0,0xC4,0x54,0x0F,0x48,0xFF,0x22,0x7D,
-
0x01,0x7B,0xFF,0x7E,0x00,0x02,0x3B,0xFE,0x90,0x13,0xE2,0xE0,0xFF,0x90,0x88,0xC1,
-
0xE0,0x22,0x90,0x13,0xB4,0xE0,0x24,0xE5,0x22,0x24,0xDD,0xF5,0x82,0xE4,0x34,0x13,
-
0xF5,0x83,0x22,0x90,0x13,0xB5,0xE0,0x04,0xF0,0x22,0xE0,0xFE,0xA3,0xE0,0xFF,0xE4,
-
0xFC,0xFD,0x7A,0x01,0xF9,0xF8,0x02,0x3C,0xE9,0xE0,0xFD,0x90,0x14,0x05,0xE0,0xFA,
-
0xA3,0xE0,0xFB,0xD3,0x9D,0xEA,0x94,0x00,0x22,0xC3,0x9F,0xFF,0xEC,0x9E,0xFE,0x22,
-
0xF5,0x83,0xA3,0xE0,0xC4,0xF8,0x54,0x0F,0xC8,0x68,0xFF,0x22,0x24,0x04,0xF5,0x82,
-
0xE4,0x34,0x8F,0x22,0x74,0xFF,0xF0,0x90,0x13,0xB3,0xE0,0x04,0xF0,0x22,0x24,0x7C,
-
0xF5,0x82,0xE4,0x34,0x8F,0x22,0x75,0xF0,0x04,0xA4,0x24,0x00,0xF5,0x82,0xE5,0xF0,
-
0x34,0x84,0xF5,0x83,0x22,0x75,0xF0,0x04,0xA4,0x24,0x40,0xF5,0x82,0xE5,0xF0,0x34,
-
0x85,0xF5,0x83,0x22,0xFF,0xEC,0x3E,0xCF,0x24,0x20,0xCF,0x34,0x00,0xFE,0x90,0x13,
-
0xB4,0xE0,0x22,0xFF,0xFB,0xAA,0x06,0xE4,0xF9,0xF8,0xA3,0xE4,0xFC,0xFD,0x02,0x3C,
-
0xE9,0xE4,0xF0,0x90,0x8F,0xF0,0xE0,0x04,0xF0,0x22,0x90,0x14,0x01,0xEE,0xF0,0xA3,
-
0xEF,0xF0,0x22,0x24,0xD8,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0x22,0x90,0xF1,0x06,
-
0xE0,0xFF,0xAE,0x0B,0xEE,0x8F,0xF0,0xA4,0x24,0x9C,0x22,0xF0,0x75,0xF0,0x04,0xEF,
-
0xA4,0x22,0xF5,0x83,0xE0,0xFA,0xA3,0xE0,0x22,0xE0,0x24,0xBC,0xF5,0x82,0xE4,0x34,
-
0x13,0xF5,0x83,0xE0,0xFF,0x22,0xFD,0x90,0x13,0xBB,0xE0,0xFE,0x22,0xFF,0x90,0x13,
-
0xBB,0xE0,0xFD,0x22,0xC3,0x9D,0xFF,0xEE,0x9C,0xFE,0x22,0x74,0x16,0xF0,0x90,0xF1,
-
0x0A,0x74,0x02,0xF0,0x22,0x90,0x13,0xB3,0xE0,0x24,0xE5,0x22,0xCE,0xA2,0xE7,0x13,
-
0xCE,0x13,0x22,0xE0,0xFF,0x90,0x13,0xB5,0xE0,0xFE,0xC3,0x22,0x90,0x13,0xCB,0x12,
-
0x3D,0x5C,0xE4,0x90,0x13,0xB3,0xF0,0x22,0x90,0x12,0x96,0xE0,0xD3,0x94,0x00,0x22,
-
0x90,0x12,0x97,0xE0,0xD3,0x94,0x00,0x22,0x74,0x06,0xF0,0xA3,0x74,0x40,0xF0,0x22,
-
0x24,0x03,0xF5,0x82,0xE4,0x34,0x8F,0x22,0x24,0x00,0xF5,0x82,0xE4,0x34,0x8F,0x22,
-
0x24,0x01,0xF5,0x82,0xE4,0x34,0x8F,0x22,0x24,0x02,0xF5,0x82,0xE4,0x34,0x8F,0x22,
-
0x24,0x7B,0xF5,0x82,0xE4,0x34,0x8F,0x22,0x24,0x78,0xF5,0x82,0xE4,0x34,0x8F,0x22,
-
0x24,0x79,0xF5,0x82,0xE4,0x34,0x8F,0x22,0x24,0x7A,0xF5,0x82,0xE4,0x34,0x8F,0x22,
-
0xF5,0xA9,0xEC,0xF5,0xAA,0xED,0xF5,0xAB,0xE4,0xF5,0xA2,0x22,0xF5,0x83,0xE0,0xF5,
-
0xA9,0x75,0xF0,0x04,0xEF,0xA4,0x22,0xE0,0x90,0x13,0xB9,0xF0,0xE4,0x90,0x13,0xB3,
-
0xF0,0x22,0x15,0x82,0xE0,0x33,0xFE,0x90,0x13,0xBA,0xE0,0xFC,0x22,0x2F,0xFF,0xEC,
-
0x3E,0xFE,0x90,0x13,0xBB,0xE0,0xFD,0x22,0xFF,0xC3,0x74,0xFF,0x9F,0xFF,0x74,0x07,
-
0x9E,0xFE,0x22,0xE0,0xFF,0x90,0x88,0xC0,0xE0,0x22,0x90,0x13,0xB9,0xE0,0xFF,0x90,
-
0x13,0xB3,0xE0,0x22,0x90,0x12,0x60,0xE0,0x94,0x00,0x22,0x90,0x12,0x96,0xE0,0x04,
-
0xF0,0x22,0x90,0x12,0x97,0xE0,0x04,0xF0,0x22,0xE0,0xFE,0x90,0x13,0xB5,0xE0,0xFF,
-
0xC3,0x9E,0x22,0xF5,0x83,0x74,0x7F,0xF0,0xA3,0x74,0xFF,0xF0,0x22,0x85,0xD9,0xD9,
-
0x85,0xDA,0xDA,0x85,0xDB,0xDB,0x22,0x85,0xDC,0xDC,0x85,0xDD,0xDD,0x85,0xDE,0xDE,
-
0x22,0x90,0x8F,0xF0,0xE0,0xFF,0x90,0x12,0x5F,0xE0,0x22,0xE4,0x90,0x13,0xC1,0xF0,
-
0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0x90,0xF1,0x03,0xE0,0xD3,0x94,
-
0x50,0x40,0x0B,0xE0,0x90,0xF2,0xA5,0xF0,0x90,0xF1,0x03,0xE0,0x80,0x06,0x90,0xF2,
-
0xA5,0x74,0xFA,0xF0,0x90,0xF2,0xA4,0xF0,0x90,0xF1,0x03,0xE0,0x90,0xF2,0xB1,0xF0,
-
0xD2,0xB6,0xD2,0xB7,0xD2,0xB2,0x20,0xB2,0x06,0x30,0x11,0x03,0x20,0xDC,0x05,0x75,
-
0x9E,0x55,0x80,0xF2,0xC2,0xDC,0xC2,0x11,0x90,0xF2,0xB0,0xE0,0xD3,0x94,0x00,0x50,
-
0x03,0x02,0x26,0x7A,0xE4,0x90,0x13,0xB3,0xF0,0xA3,0xF0,0x90,0xF2,0xB0,0xE0,0xFF,
-
0x90,0x13,0xB3,0xE0,0xFC,0xA3,0xE0,0xFD,0xC3,0x9F,0xEC,0x94,0x00,0x40,0x03,0x02,
-
0x26,0x7A,0x20,0xD9,0x3E,0xED,0x25,0xE0,0xFD,0xEC,0x12,0x18,0x7A,0x12,0x16,0x89,
-
0x24,0x29,0xF5,0x82,0xE4,0x34,0x80,0xF5,0x83,0xE0,0xFE,0x12,0x18,0x7C,0x12,0x16,
-
0x89,0x24,0x28,0xF5,0x82,0xE4,0x34,0x80,0x12,0x16,0x5D,0x24,0x01,0xF5,0x82,0xE4,
-
0x34,0x80,0xF5,0x83,0xE0,0xFE,0x12,0x16,0x82,0x24,0x00,0xF5,0x82,0xE4,0x34,0x80,
-
0x02,0x1D,0xB9,0x12,0x18,0x6F,0x12,0x16,0x89,0x24,0xE9,0xF5,0x82,0xE4,0x34,0x80,
-
0xF5,0x83,0xE0,0xFE,0x12,0x18,0x7C,0x12,0x16,0x89,0x24,0xE8,0xF5,0x82,0xE4,0x34,
-
0x80,0x12,0x16,0x5D,0x24,0xC1,0xF5,0x82,0xE4,0x34,0x80,0xF5,0x83,0xE0,0xFE,0x12,
-
0x16,0x82,0x24,0xC0,0xF5,0x82,0xE4,0x34,0x80,0xF5,0x83,0xE0,0x7C,0x00,0x24,0x00,
-
0xFF,0xEC,0x3E,0xFE,0x7D,0x1E,0x12,0x3C,0x48,0x90,0x13,0xCD,0xEE,0xF0,0xA3,0xEF,
-
0xF0,0x90,0x13,0xCB,0x12,0x1A,0x8F,0x7C,0x00,0x7D,0x03,0x12,0x3C,0x36,0x90,0x13,
-
0xCB,0xEE,0xF0,0xA3,0xEF,0xF0,0xA3,0x12,0x1A,0x8F,0x12,0x3C,0x36,0x90,0x13,0xCD,
-
0xEE,0xF0,0xA3,0xEF,0xF0,0xE4,0x90,0x13,0xBB,0xF0,0xA3,0xF0,0x12,0x18,0x6F,0x3C,
-
0xF5,0x83,0xE0,0x75,0xF0,0x14,0xA4,0xFF,0x74,0x80,0x2D,0xF5,0x82,0x74,0x81,0x3C,
-
0xF5,0x83,0xE0,0x7C,0x00,0x2F,0xFF,0xEC,0x35,0xF0,0xFE,0xEF,0x25,0xE0,0xFF,0xEE,
-
0x33,0xFE,0xA2,0xD9,0xE4,0x33,0x2F,0xFF,0xEC,0x3E,0xAD,0x07,0xFC,0x12,0x13,0x75,
-
0xFB,0x12,0x14,0x10,0x12,0x15,0xD2,0xE4,0xF0,0x90,0xF1,0x03,0xE0,0xFF,0x90,0x13,
-
0xCC,0xE0,0x2F,0xFF,0x90,0x13,0xCB,0xE0,0x34,0x00,0xFE,0x12,0x12,0xD2,0xD3,0x9F,
-
0xE4,0x9E,0x40,0x28,0x90,0xF1,0x03,0xE0,0xFF,0x90,0x13,0xCE,0xE0,0x2F,0xFF,0x90,
-
0x13,0xCD,0xE0,0x34,0x00,0xFE,0x12,0x12,0xD2,0xD3,0x9F,0xE4,0x9E,0x40,0x0D,0x12,
-
0x13,0x75,0xFB,0x12,0x14,0x10,0x12,0x15,0xD2,0x74,0x01,0xF0,0xE4,0x90,0x13,0xBD,
-
0xF0,0xA3,0xF0,0x12,0x13,0x75,0x70,0x6C,0x12,0x12,0xD2,0x12,0x13,0xD9,0x50,0x06,
-
0x12,0x12,0xC6,0x12,0x15,0xB5,0x12,0x12,0xD2,0x12,0x18,0xFA,0x12,0x13,0xE1,0x50,
-
0x03,0x12,0x12,0x9B,0x12,0x12,0xD2,0x12,0x18,0x84,0x12,0x13,0xE1,0x50,0x06,0x12,
-
0x18,0x85,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x19,0x29,0x12,0x13,0xE1,0x50,0x06,
-
0x12,0x19,0x2A,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x1A,0x5A,0x12,0x13,0xE1,0x50,
-
0x06,0x12,0x1A,0x5B,0x12,0x12,0xA2,0x12,0x12,0xD2,0xFF,0x74,0x0C,0x2D,0xF5,0x82,
-
0x74,0x60,0x12,0x13,0xE1,0x40,0x03,0x02,0x21,0x89,0x74,0x0C,0x2D,0xF5,0x82,0x74,
-
0x60,0x02,0x21,0x86,0x12,0x13,0x75,0x64,0x01,0x70,0x63,0x12,0x12,0xD2,0x12,0x13,
-
0xD9,0x50,0x06,0x12,0x12,0xC6,0x12,0x15,0xB5,0x12,0x12,0xD2,0x12,0x18,0xFA,0x12,
-
0x13,0xE1,0x50,0x03,0x12,0x12,0x9B,0x12,0x12,0xD2,0x12,0x18,0x84,0x12,0x13,0xE1,
-
0x50,0x06,0x12,0x18,0x85,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x19,0x29,0x12,0x13,
-
0xE1,0x50,0x06,0x12,0x19,0x2A,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x1A,0x5A,0x12,
-
0x13,0xE1,0x50,0x06,0x12,0x1A,0x5B,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x17,0x74,
-
0x12,0x13,0xE1,0x40,0x03,0x02,0x21,0x89,0x12,0x17,0x75,0x02,0x21,0x86,0x12,0x13,
-
0x75,0x64,0x02,0x70,0x63,0x12,0x12,0xD2,0x12,0x13,0xD9,0x50,0x06,0x12,0x12,0xC6,
-
0x12,0x15,0xB5,0x12,0x12,0xD2,0x12,0x18,0xFA,0x12,0x13,0xE1,0x50,0x03,0x12,0x12,
-
0x9B,0x12,0x12,0xD2,0x12,0x18,0x84,0x12,0x13,0xE1,0x50,0x06,0x12,0x18,0x85,0x12,
-
0x12,0xA2,0x12,0x12,0xD2,0x12,0x19,0x29,0x12,0x13,0xE1,0x50,0x06,0x12,0x19,0x2A,
-
0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x17,0x74,0x12,0x13,0xE1,0x50,0x06,0x12,0x17,
-
0x75,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x17,0xF0,0x12,0x13,0xE1,0x40,0x03,0x02,
-
0x21,0x89,0x12,0x17,0xF1,0x02,0x21,0x86,0x12,0x13,0x75,0x64,0x13,0x70,0x75,0x12,
-
0x12,0xD2,0x12,0x17,0x74,0x12,0x13,0xE1,0x50,0x09,0x12,0x17,0x75,0x12,0x12,0xCD,
-
0x12,0x15,0xB5,0x12,0x12,0xD2,0x12,0x17,0xF0,0x12,0x13,0xE1,0x50,0x06,0x12,0x17,
-
0xF1,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x18,0x8D,0x12,0x13,0xE1,0x50,0x06,0x12,
-
0x18,0x8E,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x19,0x32,0x12,0x13,0xE1,0x50,0x06,
-
0x12,0x19,0x33,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x1A,0x63,0x12,0x13,0xE1,0x50,
-
0x06,0x12,0x1A,0x64,0x12,0x12,0xA2,0x12,0x12,0xD2,0xFF,0x74,0xF4,0x2D,0xF5,0x82,
-
0x74,0x5F,0x12,0x13,0xE1,0x40,0x03,0x02,0x21,0x89,0x74,0xF4,0x2D,0xF5,0x82,0x74,
-
0x5F,0x02,0x21,0x86,0x12,0x13,0x75,0x64,0x12,0x70,0x6D,0x12,0x12,0xD2,0x12,0x17,
-
0x74,0x12,0x13,0xE1,0x50,0x09,0x12,0x17,0x75,0x12,0x12,0xCD,0x12,0x15,0xB5,0x12,
-
0x12,0xD2,0x12,0x17,0xF0,0x12,0x13,0xE1,0x50,0x06,0x12,0x17,0xF1,0x12,0x12,0xA2,
-
0x12,0x12,0xD2,0x12,0x18,0x8D,0x12,0x13,0xE1,0x50,0x06,0x12,0x18,0x8E,0x12,0x12,
-
0xA2,0x12,0x12,0xD2,0x12,0x19,0x32,0x12,0x13,0xE1,0x50,0x06,0x12,0x19,0x33,0x12,
-
0x12,0xA2,0x12,0x12,0xD2,0x12,0x1A,0x63,0x12,0x13,0xE1,0x50,0x06,0x12,0x1A,0x64,
-
0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x13,0xD9,0x40,0x03,0x02,0x21,0x89,0x74,0x02,
-
0x2D,0xF5,0x82,0x74,0x60,0x02,0x21,0x86,0x12,0x13,0x75,0x64,0x11,0x70,0x6A,0x12,
-
0x12,0xD2,0x12,0x17,0x74,0x12,0x13,0xE1,0x50,0x09,0x12,0x17,0x75,0x12,0x12,0xCD,
-
0x12,0x15,0xB5,0x12,0x12,0xD2,0x12,0x17,0xF0,0x12,0x13,0xE1,0x50,0x06,0x12,0x17,
-
0xF1,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x18,0x8D,0x12,0x13,0xE1,0x50,0x06,0x12,
-
0x18,0x8E,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x19,0x32,0x12,0x13,0xE1,0x50,0x06,
-
0x12,0x19,0x33,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x13,0xD9,0x50,0x0A,0x74,0x02,
-
0x2D,0xF5,0x82,0x74,0x60,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x18,0xFA,0x12,0x13,
-
0xE1,0x50,0x66,0x12,0x18,0xFB,0x02,0x21,0x86,0x12,0x12,0xD2,0x12,0x13,0xD9,0x50,
-
0x06,0x12,0x12,0xC6,0x12,0x15,0xB5,0x12,0x12,0xD2,0x12,0x18,0xFA,0x12,0x13,0xE1,
-
0x50,0x03,0x12,0x12,0x9B,0x12,0x12,0xD2,0x12,0x18,0x84,0x12,0x13,0xE1,0x50,0x06,
-
0x12,0x18,0x85,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x17,0x74,0x12,0x13,0xE1,0x50,
-
0x06,0x12,0x17,0x75,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x17,0xF0,0x12,0x13,0xE1,
-
0x50,0x06,0x12,0x17,0xF1,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x18,0x8D,0x12,0x13,
-
0xE1,0x50,0x06,0x12,0x18,0x8E,0x12,0x12,0xA2,0xC3,0x90,0x13,0xBE,0xE0,0x94,0x6E,
-
0x90,0x13,0xBD,0xE0,0x94,0x00,0x50,0x0C,0x12,0x13,0x75,0xFB,0x12,0x14,0x10,0x12,
-
0x15,0xD2,0xE4,0xF0,0xE4,0x90,0x13,0xBD,0xF0,0xA3,0xF0,0x12,0x14,0x03,0x70,0x75,
-
0x12,0x12,0xD2,0x12,0x17,0x7D,0x12,0x13,0xE1,0x50,0x09,0x12,0x17,0x7E,0x12,0x12,
-
0xCD,0x12,0x15,0xB5,0x12,0x12,0xD2,0x12,0x17,0xF9,0x12,0x13,0xE1,0x50,0x06,0x12,
-
0x17,0xFA,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x18,0x96,0x12,0x13,0xE1,0x50,0x06,
-
0x12,0x18,0x97,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x19,0x3B,0x12,0x13,0xE1,0x50,
-
0x06,0x12,0x19,0x3C,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x1A,0x6C,0x12,0x13,0xE1,
-
0x50,0x06,0x12,0x1A,0x6D,0x12,0x12,0xA2,0x12,0x12,0xD2,0xFF,0x74,0xF0,0x2D,0xF5,
-
0x82,0x74,0x60,0x12,0x13,0xE1,0x40,0x03,0x02,0x24,0xD3,0x74,0xF0,0x2D,0xF5,0x82,
-
0x74,0x60,0x02,0x24,0xD0,0x12,0x14,0x03,0x64,0x01,0x70,0x6C,0x12,0x12,0xD2,0x12,
-
0x17,0x7D,0x12,0x13,0xE1,0x50,0x09,0x12,0x17,0x7E,0x12,0x12,0xCD,0x12,0x15,0xB5,
-
0x12,0x12,0xD2,0x12,0x17,0xF9,0x12,0x13,0xE1,0x50,0x06,0x12,0x17,0xFA,0x12,0x12,
-
0xA2,0x12,0x12,0xD2,0x12,0x18,0x96,0x12,0x13,0xE1,0x50,0x06,0x12,0x18,0x97,0x12,
-
0x12,0xA2,0x12,0x12,0xD2,0x12,0x19,0x3B,0x12,0x13,0xE1,0x50,0x06,0x12,0x19,0x3C,
-
0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x1A,0x6C,0x12,0x13,0xE1,0x50,0x06,0x12,0x1A,
-
0x6D,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x17,0x86,0x12,0x13,0xE1,0x40,0x03,0x02,
-
0x24,0xD3,0x12,0x17,0x87,0x02,0x24,0xD0,0x12,0x14,0x03,0x64,0x02,0x70,0x6C,0x12,
-
0x12,0xD2,0x12,0x17,0x7D,0x12,0x13,0xE1,0x50,0x09,0x12,0x17,0x7E,0x12,0x12,0xCD,
-
0x12,0x15,0xB5,0x12,0x12,0xD2,0x12,0x17,0xF9,0x12,0x13,0xE1,0x50,0x06,0x12,0x17,
-
0xFA,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x18,0x96,0x12,0x13,0xE1,0x50,0x06,0x12,
-
0x18,0x97,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x19,0x3B,0x12,0x13,0xE1,0x50,0x06,
-
0x12,0x19,0x3C,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x17,0x86,0x12,0x13,0xE1,0x50,
-
0x06,0x12,0x17,0x87,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x18,0x02,0x12,0x13,0xE1,
-
0x40,0x03,0x02,0x24,0xD3,0x12,0x18,0x03,0x02,0x24,0xD0,0x12,0x14,0x03,0x64,0x1D,
-
0x70,0x75,0x12,0x12,0xD2,0x12,0x17,0x86,0x12,0x13,0xE1,0x50,0x09,0x12,0x17,0x87,
-
0x12,0x12,0xCD,0x12,0x15,0xB5,0x12,0x12,0xD2,0x12,0x18,0x02,0x12,0x13,0xE1,0x50,
-
0x06,0x12,0x18,0x03,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x18,0x9F,0x12,0x13,0xE1,
-
0x50,0x06,0x12,0x18,0xA0,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x19,0x44,0x12,0x13,
-
0xE1,0x50,0x06,0x12,0x19,0x45,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x1A,0x75,0x12,
-
0x13,0xE1,0x50,0x06,0x12,0x1A,0x76,0x12,0x12,0xA2,0x12,0x12,0xD2,0xFF,0x74,0x10,
-
0x2D,0xF5,0x82,0x74,0x5F,0x12,0x13,0xE1,0x40,0x03,0x02,0x24,0xD3,0x74,0x10,0x2D,
-
0xF5,0x82,0x74,0x5F,0x02,0x24,0xD0,0x12,0x14,0x03,0x64,0x1C,0x70,0x6C,0x12,0x12,
-
0xD2,0x12,0x17,0x86,0x12,0x13,0xE1,0x50,0x09,0x12,0x17,0x87,0x12,0x12,0xCD,0x12,
-
0x15,0xB5,0x12,0x12,0xD2,0x12,0x18,0x02,0x12,0x13,0xE1,0x50,0x06,0x12,0x18,0x03,
-
0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x18,0x9F,0x12,0x13,0xE1,0x50,0x06,0x12,0x18,
-
0xA0,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x19,0x44,0x12,0x13,0xE1,0x50,0x06,0x12,
-
0x19,0x45,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x1A,0x75,0x12,0x13,0xE1,0x50,0x06,
-
0x12,0x1A,0x76,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x17,0x7D,0x12,0x13,0xE1,0x40,
-
0x03,0x02,0x24,0xD3,0x12,0x17,0x7E,0x02,0x24,0xD0,0x12,0x14,0x03,0x64,0x1B,0x70,
-
0x69,0x12,0x12,0xD2,0x12,0x17,0x86,0x12,0x13,0xE1,0x50,0x09,0x12,0x17,0x87,0x12,
-
0x12,0xCD,0x12,0x15,0xB5,0x12,0x12,0xD2,0x12,0x18,0x02,0x12,0x13,0xE1,0x50,0x06,
-
0x12,0x18,0x03,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x18,0x9F,0x12,0x13,0xE1,0x50,
-
0x06,0x12,0x18,0xA0,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x19,0x44,0x12,0x13,0xE1,
-
0x50,0x06,0x12,0x19,0x45,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x17,0x7D,0x12,0x13,
-
0xE1,0x50,0x06,0x12,0x17,0x7E,0x12,0x12,0xA2,0x12,0x12,0xD2,0x12,0x17,0xF9,0x12,
-
0x13,0xE1,0x50,0x6F,0x12,0x17,0xFA,0x02,0x24,0xD0,0x12,0x12,0xD2,0x12,0x17,0x7D,
-
0x12,0x13,0xE1,0x50,0x09,0x12,0x17,0x7E,0x12,0x12,0xCD,0x12,0x15,0xB5,0x12,0x12,
-
0xD2,0x12,0x17,0xF9,0x12,0x13,0xE1,0x50,0x06,0x12,0x17,0xFA,0x12,0x12,0xA2,0x12,
-
0x12,0xD2,0x12,0x18,0x96,0x12,0x13,0xE1,0x50,0x06,0x12,0x18,0x97,0x12,0x12,0xA2,
-
0x12,0x12,0xD2,0x12,0x17,0x86,0x12,0x13,0xE1,0x50,0x06,0x12,0x17,0x87,0x12,0x12,
-
0xA2,0x12,0x12,0xD2,0x12,0x18,0x02,0x12,0x13,0xE1,0x50,0x06,0x12,0x18,0x03,0x12,
-
0x12,0xA2,0x12,0x12,0xD2,0x12,0x18,0x9F,0x12,0x13,0xE1,0x50,0x06,0x12,0x18,0xA0,
-
0x12,0x12,0xA2,0x90,0x13,0xBD,0xE0,0xFA,0xA3,0xE0,0xFB,0xC3,0x94,0x6E,0xEA,0x94,
-
0x00,0x50,0x10,0x12,0x13,0x75,0xFD,0x12,0x14,0x10,0x12,0x1A,0x7E,0x2D,0x12,0x15,
-
0xE3,0xE4,0xF0,0x7C,0x00,0x7D,0x0A,0xAF,0x03,0xAE,0x02,0x12,0x3C,0x48,0x90,0x13,
-
0xBD,0xEE,0xF0,0xA3,0xEF,0xF0,0x12,0x13,0x75,0xF5,0xCB,0x12,0x14,0x10,0xF5,0xCC,
-
0xD2,0xB5,0x30,0xB5,0x05,0x75,0x9E,0x55,0x80,0xF8,0x7D,0x19,0x12,0x14,0x03,0x70,
-
0x03,0x02,0x26,0x69,0x12,0x14,0x10,0x64,0x1D,0x70,0x03,0x02,0x26,0x69,0x12,0x13,
-
0x75,0x70,0x03,0x02,0x26,0x69,0x12,0x13,0x82,0x64,0x13,0x70,0x03,0x02,0x26,0x69,
-
0x12,0x13,0x75,0xFC,0x12,0x14,0x10,0x12,0x1A,0x7E,0x2C,0x12,0x15,0xE3,0xE0,0x64,
-
0x01,0x60,0x03,0x02,0x26,0x69,0xC3,0xE5,0xCA,0x95,0xB7,0xC3,0x9D,0x50,0x18,0x12,
-
0x13,0x6F,0xFB,0x12,0x14,0x10,0x75,0xF0,0x14,0xA4,0x24,0xEB,0xF5,0x82,0xE5,0xF0,
-
0x34,0x0F,0x12,0x15,0xDE,0xEC,0xF0,0xC3,0xE5,0xCA,0x95,0xB9,0xC3,0x9D,0x50,0x18,
-
0x12,0x13,0x6F,0xFB,0x12,0x14,0x10,0x75,0xF0,0x14,0xA4,0x24,0xEC,0xF5,0x82,0xE5,
-
0xF0,0x34,0x0F,0x12,0x15,0xDE,0xEC,0xF0,0xC3,0xE5,0xCA,0x95,0xBA,0xC3,0x9D,0x50,
-
0x18,0x12,0x13,0x6F,0xFB,0x12,0x14,0x10,0x75,0xF0,0x14,0xA4,0x24,0xED,0xF5,0x82,
-
0xE5,0xF0,0x34,0x0F,0x12,0x15,0xDE,0xEC,0xF0,0xC3,0xE5,0xCA,0x95,0xBD,0xC3,0x9D,
-
0x50,0x18,0x12,0x13,0x6F,0xFB,0x12,0x14,0x10,0x75,0xF0,0x14,0xA4,0x24,0xFF,0xF5,
-
0x82,0xE5,0xF0,0x34,0x0F,0x12,0x15,0xDE,0xEC,0xF0,0xC3,0xE5,0xCA,0x95,0xBE,0xC3,
-
0x9D,0x50,0x18,0x12,0x13,0x6F,0xFB,0x12,0x14,0x10,0x75,0xF0,0x14,0xA4,0x24,0x01,
-
0xF5,0x82,0xE5,0xF0,0x34,0x10,0x12,0x15,0xDE,0xEC,0xF0,0xC3,0xE5,0xCA,0x95,0xC2,
-
0xC3,0x9D,0x50,0x18,0x12,0x13,0x6F,0xFB,0x12,0x14,0x10,0x75,0xF0,0x14,0xA4,0x24,
-
0x13,0xF5,0x82,0xE5,0xF0,0x34,0x10,0x12,0x15,0xDE,0xEC,0xF0,0xC3,0xE5,0xCA,0x95,
-
0xC3,0xC3,0x9D,0x50,0x18,0x12,0x13,0x6F,0xFB,0x12,0x14,0x10,0x75,0xF0,0x14,0xA4,
-
0x24,0x14,0xF5,0x82,0xE5,0xF0,0x34,0x10,0x12,0x15,0xDE,0xEC,0xF0,0xC3,0xE5,0xCA,
-
0x95,0xC4,0xC3,0x9D,0x50,0x23,0x90,0x13,0xBD,0xA3,0xE0,0xFD,0x12,0x13,0x75,0xFC,
-
0x12,0x14,0x10,0x75,0xF0,0x14,0xA4,0x24,0x15,0xF5,0x82,0xE5,0xF0,0x34,0x10,0xF5,
-
0x83,0xE5,0x82,0x2C,0x12,0x15,0xE3,0xED,0xF0,0x90,0x13,0xB4,0xE0,0x04,0xF0,0x70,
-
0x06,0x90,0x13,0xB3,0xE0,0x04,0xF0,0x02,0x1D,0x2B,0x22,0x90,0xF1,0x93,0x74,0x01,
-
0xF0,0xE4,0x90,0xF1,0x46,0xF0,0x90,0xF1,0x1B,0x74,0x03,0xF0,0x90,0xF0,0x02,0x30,
-
0x04,0x03,0x02,0x29,0x3F,0x74,0x10,0xF0,0xE4,0x90,0xF0,0x01,0xF0,0x90,0xF0,0x04,
-
0x74,0x10,0xF0,0x90,0xF0,0x03,0x74,0x01,0xF0,0x74,0x10,0x12,0x40,0x82,0x74,0x11,
-
0xF0,0xE4,0x90,0xF0,0x0F,0xF0,0x90,0xF0,0x12,0x74,0x11,0xF0,0x90,0xF0,0x11,0x74,
-
0x01,0xF0,0x90,0xF0,0x14,0x74,0x11,0xF0,0x90,0xF0,0x13,0x74,0x02,0xF0,0x90,0xF0,
-
0x16,0x74,0x12,0xF0,0xE4,0x90,0xF0,0x15,0xF0,0x90,0xF0,0x18,0x74,0x12,0xF0,0x90,
-
0xF0,0x17,0x74,0x01,0xF0,0x90,0xF0,0x1A,0x74,0x12,0xF0,0x90,0xF0,0x19,0x74,0x02,
-
0xF0,0x74,0x13,0x12,0x41,0x2C,0x74,0x13,0xF0,0x90,0xF0,0x1D,0x74,0x01,0xF0,0x90,
-
0xF0,0x20,0x74,0x13,0xF0,0x90,0xF0,0x1F,0x74,0x02,0xF0,0x90,0xF0,0x22,0x74,0x14,
-
0xF0,0xE4,0x90,0xF0,0x21,0xF0,0x74,0x14,0x12,0x40,0xD8,0x74,0x14,0xF0,0x90,0xF0,
-
0x25,0x74,0x02,0xF0,0x90,0xF0,0x28,0x74,0x15,0xF0,0xE4,0x90,0xF0,0x27,0xF0,0x90,
-
0xF0,0x2A,0x74,0x15,0xF0,0x90,0xF0,0x29,0x74,0x01,0xF0,0x74,0x15,0x12,0x40,0xE6,
-
0x74,0x16,0xF0,0xE4,0x90,0xF0,0x2D,0xF0,0x90,0xF0,0x30,0x74,0x16,0xF0,0x90,0xF0,
-
0x2F,0x74,0x01,0xF0,0x90,0xF0,0x32,0x74,0x20,0xF0,0xE4,0x90,0xF0,0x31,0xF0,0x90,
-
0xF0,0x34,0x74,0x20,0xF0,0x90,0xF0,0x33,0x74,0x01,0xF0,0x74,0x20,0x12,0x40,0xF4,
-
0x74,0x20,0xF0,0x90,0xF0,0x37,0x74,0x03,0xF0,0x90,0xF0,0x3A,0x74,0x20,0xF0,0x90,
-
0xF0,0x39,0x74,0x04,0x12,0x40,0x25,0x74,0x20,0xF0,0x90,0xF0,0x4B,0x74,0x05,0xF0,
-
0x90,0xF0,0x4E,0x74,0x20,0xF0,0x90,0xF0,0x4D,0x74,0x06,0xF0,0x90,0xF0,0x50,0x74,
-
0x20,0xF0,0x90,0xF0,0x4F,0x74,0x07,0xF0,0x90,0xF0,0x52,0x74,0x20,0xF0,0x90,0xF0,
-
0x51,0x74,0x08,0xF0,0x90,0xF0,0x54,0x74,0x20,0xF0,0x90,0xF0,0x53,0x74,0x09,0xF0,
-
0x90,0xF0,0x56,0x74,0x20,0xF0,0x90,0xF0,0x55,0x74,0x0A,0xF0,0x90,0xF0,0x58,0x74,
-
0x20,0xF0,0x90,0xF0,0x57,0x74,0x0B,0xF0,0x90,0xF0,0x5A,0x74,0x20,0xF0,0x90,0xF0,
-
0x59,0x74,0x0C,0xF0,0x90,0xF0,0x5C,0x74,0x20,0xF0,0x90,0xF0,0x5B,0x74,0x0D,0xF0,
-
0x90,0xF0,0x5E,0x74,0x20,0xF0,0x90,0xF0,0x5D,0x74,0x0E,0xF0,0x90,0xF0,0x60,0x74,
-
0x20,0xF0,0x90,0xF0,0x5F,0x74,0x0F,0xF0,0x90,0xF0,0x62,0x74,0x20,0xF0,0x90,0xF0,
-
0x61,0x74,0x10,0xF0,0x90,0xF0,0x64,0x74,0x20,0xF0,0x90,0xF0,0x63,0x74,0x11,0xF0,
-
0x90,0xF0,0x66,0x74,0x20,0xF0,0x90,0xF0,0x65,0x74,0x12,0xF0,0x90,0xF0,0x68,0x74,
-
0x20,0xF0,0x90,0xF0,0x67,0x74,0x13,0xF0,0x90,0xF0,0x6A,0x74,0x20,0xF0,0x90,0xF0,
-
0x69,0x74,0x14,0xF0,0x90,0xF0,0x6C,0x74,0x20,0xF0,0x74,0x15,0x12,0x41,0x02,0x74,
-
0x16,0xF0,0x90,0xF0,0x70,0x74,0x20,0xF0,0x74,0x17,0x12,0x41,0x10,0x74,0x18,0x12,
-
0x41,0x39,0x74,0x19,0xF0,0x90,0xF0,0x76,0x74,0x20,0xF0,0x74,0x1A,0x12,0x3F,0x44,
-
0x74,0x1B,0xF0,0x90,0xF0,0x8E,0x74,0x20,0xF0,0x74,0x1C,0x12,0x41,0x1E,0x74,0x1D,
-
0xF0,0x90,0xF0,0x92,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x91,0xF0,0x90,0xF0,0x94,0x74,
-
0x08,0xF0,0xE4,0x90,0xF0,0x93,0xF0,0x90,0xF0,0x96,0x74,0x08,0xF0,0xE4,0x90,0xF0,
-
0x95,0xF0,0x90,0xF0,0x98,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x97,0xF0,0x90,0xF0,0x9A,
-
0x74,0x08,0xF0,0xE4,0x90,0xF0,0x99,0xF0,0x90,0xF0,0x9C,0x74,0x08,0xF0,0xE4,0x90,
-
0xF0,0x9B,0xF0,0x90,0xF0,0x9E,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x9D,0xF0,0x90,0xF0,
-
0xA0,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x9F,0xF0,0x90,0xF0,0xA2,0x74,0x08,0xF0,0xE4,
-
0x90,0xF0,0xA1,0xF0,0x90,0xF0,0xA4,0x74,0x08,0xF0,0xE4,0x90,0xF0,0xA3,0xF0,0x90,
-
0xF0,0xA6,0x74,0x08,0xF0,0xE4,0x90,0xF0,0xA5,0xF0,0x90,0xF0,0xA8,0x74,0x08,0xF0,
-
0xE4,0x90,0xF0,0xA7,0xF0,0x90,0xF0,0xAA,0x74,0x08,0xF0,0xE4,0x90,0xF0,0xA9,0xF0,
-
0x90,0xF0,0xAC,0x74,0x08,0xF0,0xE4,0x90,0xF0,0xAB,0xF0,0x90,0xF0,0xAE,0x74,0x08,
-
0xF0,0xE4,0x90,0xF0,0xAD,0xF0,0x74,0x08,0x12,0x3F,0xC0,0x74,0x14,0xF0,0x90,0xF1,
-
0x07,0x74,0x1E,0xF0,0x74,0x03,0x12,0x40,0xBC,0x14,0xF0,0xE4,0x02,0x2B,0xF2,0x74,
-
0x17,0xF0,0x90,0xF0,0x01,0x74,0x04,0xF0,0x90,0xF0,0x04,0x74,0x17,0xF0,0x90,0xF0,
-
0x03,0x74,0x03,0xF0,0x74,0x17,0x12,0x40,0x82,0x74,0x17,0xF0,0x90,0xF0,0x0F,0x74,
-
0x01,0xF0,0x90,0xF0,0x12,0x74,0x17,0xF0,0xE4,0x90,0xF0,0x11,0xF0,0x90,0xF0,0x14,
-
0x74,0x16,0xF0,0x90,0xF0,0x13,0x74,0x04,0xF0,0x90,0xF0,0x16,0x74,0x16,0xF0,0x90,
-
0xF0,0x15,0x74,0x03,0xF0,0x90,0xF0,0x18,0x74,0x16,0xF0,0x90,0xF0,0x17,0x74,0x02,
-
0xF0,0x90,0xF0,0x1A,0x74,0x16,0xF0,0x90,0xF0,0x19,0x74,0x01,0xF0,0x74,0x16,0x12,
-
0x41,0x2C,0x74,0x15,0xF0,0x90,0xF0,0x1D,0x74,0x04,0xF0,0x90,0xF0,0x20,0x74,0x15,
-
0xF0,0x90,0xF0,0x1F,0x74,0x03,0xF0,0x90,0xF0,0x22,0x74,0x15,0xF0,0x90,0xF0,0x21,
-
0x74,0x02,0xF0,0x74,0x15,0x12,0x40,0xD8,0x74,0x15,0xF0,0xE4,0x90,0xF0,0x25,0xF0,
-
0x90,0xF0,0x28,0x74,0x14,0xF0,0x90,0xF0,0x27,0x74,0x04,0xF0,0x90,0xF0,0x2A,0x74,
-
0x14,0xF0,0x90,0xF0,0x29,0x74,0x03,0xF0,0x74,0x14,0x12,0x40,0xE6,0x74,0x14,0xF0,
-
0x90,0xF0,0x2D,0x74,0x01,0xF0,0x90,0xF0,0x30,0x74,0x14,0xF0,0xE4,0x90,0xF0,0x2F,
-
0xF0,0x90,0xF0,0x32,0x74,0x13,0xF0,0x90,0xF0,0x31,0x74,0x04,0xF0,0x90,0xF0,0x34,
-
0x74,0x13,0xF0,0x90,0xF0,0x33,0x74,0x03,0xF0,0x74,0x13,0x12,0x40,0xF4,0x74,0x13,
-
0xF0,0x90,0xF0,0x37,0x74,0x01,0xF0,0x90,0xF0,0x3A,0x74,0x13,0xF0,0xE4,0x90,0xF0,
-
0x39,0x12,0x40,0x25,0x74,0x12,0xF0,0x90,0xF0,0x4B,0x74,0x04,0xF0,0x90,0xF0,0x4E,
-
0x74,0x12,0xF0,0x90,0xF0,0x4D,0x74,0x03,0xF0,0x90,0xF0,0x50,0x74,0x12,0xF0,0x90,
-
0xF0,0x4F,0x74,0x02,0xF0,0x90,0xF0,0x52,0x74,0x12,0xF0,0x90,0xF0,0x51,0x74,0x01,
-
0xF0,0x90,0xF0,0x54,0x74,0x12,0xF0,0xE4,0x90,0xF0,0x53,0xF0,0x90,0xF0,0x56,0x74,
-
0x11,0xF0,0x90,0xF0,0x55,0x74,0x04,0xF0,0x90,0xF0,0x58,0x74,0x11,0xF0,0x90,0xF0,
-
0x57,0x74,0x03,0xF0,0x90,0xF0,0x5A,0x74,0x11,0xF0,0x90,0xF0,0x59,0x74,0x02,0xF0,
-
0x90,0xF0,0x5C,0x74,0x11,0xF0,0x90,0xF0,0x5B,0x74,0x01,0xF0,0x90,0xF0,0x5E,0x74,
-
0x11,0xF0,0xE4,0x90,0xF0,0x5D,0xF0,0x90,0xF0,0x60,0x74,0x10,0xF0,0x90,0xF0,0x5F,
-
0x74,0x04,0xF0,0x90,0xF0,0x62,0x74,0x10,0xF0,0x90,0xF0,0x61,0x74,0x03,0xF0,0x90,
-
0xF0,0x64,0x74,0x10,0xF0,0x90,0xF0,0x63,0x74,0x02,0xF0,0x90,0xF0,0x66,0x74,0x10,
-
0xF0,0x90,0xF0,0x65,0x74,0x01,0xF0,0x90,0xF0,0x68,0x74,0x10,0xF0,0xE4,0x90,0xF0,
-
0x67,0xF0,0x90,0xF0,0x6A,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x69,0xF0,0x90,0xF0,0x6C,
-
0x74,0x20,0xF0,0x74,0x18,0x12,0x41,0x02,0x74,0x17,0xF0,0x90,0xF0,0x70,0x74,0x20,
-
0xF0,0x74,0x16,0x12,0x41,0x10,0x74,0x15,0x12,0x41,0x39,0x74,0x14,0xF0,0x90,0xF0,
-
0x76,0x74,0x20,0xF0,0x74,0x13,0x12,0x3F,0x44,0x74,0x12,0xF0,0x90,0xF0,0x8E,0x74,
-
0x20,0xF0,0x74,0x11,0x12,0x41,0x1E,0x74,0x10,0xF0,0x90,0xF0,0x92,0x74,0x20,0xF0,
-
0x90,0xF0,0x91,0x74,0x0F,0xF0,0x90,0xF0,0x94,0x74,0x20,0xF0,0x90,0xF0,0x93,0x74,
-
0x0E,0xF0,0x90,0xF0,0x96,0x74,0x20,0xF0,0x90,0xF0,0x95,0x74,0x0D,0xF0,0x90,0xF0,
-
0x98,0x74,0x20,0xF0,0x90,0xF0,0x97,0x74,0x0C,0xF0,0x90,0xF0,0x9A,0x74,0x20,0xF0,
-
0x90,0xF0,0x99,0x74,0x0B,0xF0,0x90,0xF0,0x9C,0x74,0x20,0xF0,0x90,0xF0,0x9B,0x74,
-
0x0A,0xF0,0x90,0xF0,0x9E,0x74,0x20,0xF0,0x90,0xF0,0x9D,0x74,0x09,0xF0,0x90,0xF0,
-
0xA0,0x74,0x20,0xF0,0x90,0xF0,0x9F,0x74,0x08,0xF0,0x90,0xF0,0xA2,0x74,0x20,0xF0,
-
0x90,0xF0,0xA1,0x74,0x07,0xF0,0x90,0xF0,0xA4,0x74,0x20,0xF0,0x90,0xF0,0xA3,0x74,
-
0x06,0xF0,0x90,0xF0,0xA6,0x74,0x20,0xF0,0x90,0xF0,0xA5,0x74,0x05,0xF0,0x90,0xF0,
-
0xA8,0x74,0x20,0xF0,0x90,0xF0,0xA7,0x74,0x04,0xF0,0x90,0xF0,0xAA,0x74,0x20,0xF0,
-
0x90,0xF0,0xA9,0x74,0x03,0xF0,0x90,0xF0,0xAC,0x74,0x20,0xF0,0x90,0xF0,0xAB,0x74,
-
0x02,0xF0,0x90,0xF0,0xAE,0x74,0x20,0xF0,0x90,0xF0,0xAD,0x74,0x01,0xF0,0x74,0x20,
-
0x12,0x3F,0xC0,0x74,0x1E,0xF0,0x90,0xF1,0x07,0x74,0x14,0xF0,0x74,0x05,0x12,0x40,
-
0xBC,0xF0,0x90,0xF1,0x15,0xF0,0x90,0xF1,0x1F,0x74,0x0C,0xF0,0x90,0xF1,0x22,0x74,
-
0x03,0xF0,0x90,0xF1,0x1D,0x74,0x08,0xF0,0x90,0xF1,0x21,0x74,0x0A,0xF0,0xE4,0x90,
-
0xF1,0x1C,0xF0,0x90,0xF1,0x43,0x74,0x3A,0xF0,0xE4,0x90,0xF1,0x19,0xF0,0x90,0xF1,
-
0x1E,0x04,0xF0,0x90,0xF1,0x20,0x74,0x05,0xF0,0x90,0xF2,0xA4,0x74,0x32,0xF0,0x90,
-
0xF2,0xA5,0xF0,0x90,0xF1,0x01,0x74,0x19,0xF0,0x90,0xF1,0x02,0xF0,0x90,0xF1,0x03,
-
0x74,0x1C,0xF0,0x90,0xF1,0x04,0x74,0x0F,0xF0,0x90,0xF1,0x05,0x74,0x28,0xF0,0x90,
-
0xF1,0x08,0x74,0x03,0xF0,0x90,0xF1,0x09,0x74,0xE8,0xF0,0x90,0xF1,0x0A,0x74,0x02,
-
0xF0,0x90,0xF1,0x0B,0x74,0x0F,0xF0,0x90,0xF0,0xC5,0x74,0x07,0xF0,0x90,0xF1,0x18,
-
0x74,0xF4,0xF0,0xE0,0x54,0x0F,0xB4,0x09,0x00,0x50,0x54,0x90,0x2C,0x82,0xF8,0x28,
-
0x28,0x73,0x02,0x2C,0x9D,0x02,0x2C,0x9F,0x02,0x2C,0xA7,0x02,0x2C,0xAF,0x02,0x2C,
-
0xB7,0x02,0x2C,0xBF,0x02,0x2C,0xC7,0x02,0x2C,0xC7,0x02,0x2C,0xC7,0x80,0x30,0x90,
-
0xF1,0x0C,0x74,0x04,0xF0,0x80,0x2E,0x90,0xF1,0x0C,0x74,0x08,0xF0,0x80,0x26,0x90,
-
0xF1,0x0C,0x74,0x10,0xF0,0x80,0x1E,0x90,0xF1,0x0C,0x74,0x20,0xF0,0x80,0x16,0x90,
-
0xF1,0x0C,0x74,0x40,0xF0,0x80,0x0E,0x90,0xF1,0x0C,0x74,0x80,0xF0,0x80,0x06,0x90,
-
0xF1,0x0C,0x74,0x02,0xF0,0x90,0xF1,0x0D,0x74,0xC8,0xF0,0x90,0xF1,0x16,0x74,0x14,
-
0xF0,0xD2,0xAD,0xE4,0x90,0xF1,0x17,0xF0,0x90,0xF0,0xC4,0x04,0xF0,0x20,0x0C,0x05,
-
0x75,0x9E,0x55,0x80,0xF8,0x22,0x90,0x14,0x07,0xEF,0xF0,0xA9,0x03,0xA3,0xED,0xF0,
-
0x60,0x03,0x02,0x2E,0x99,0xE9,0x60,0x03,0x02,0x2D,0xD8,0x90,0x14,0x07,0xE0,0xB4,
-
0x14,0x00,0x40,0x03,0x02,0x2D,0xD2,0x90,0x2D,0x1E,0xF8,0x28,0x28,0x73,0x02,0x2D,
-
0x5A,0x02,0x2D,0x60,0x02,0x2D,0x66,0x02,0x2D,0x6C,0x02,0x2D,0x72,0x02,0x2D,0x78,
-
0x02,0x2D,0x7E,0x02,0x2D,0x84,0x02,0x2D,0x8A,0x02,0x2D,0x90,0x02,0x2D,0x96,0x02,
-
0x2D,0x9C,0x02,0x2D,0xA2,0x02,0x2D,0xA8,0x02,0x2D,0xAE,0x02,0x2D,0xB4,0x02,0x2D,
-
0xBA,0x02,0x2D,0xC0,0x02,0x2D,0xC6,0x02,0x2D,0xCC,0x43,0xDB,0x01,0x02,0x2E,0x96,
-
0x43,0xDB,0x02,0x02,0x2E,0x96,0x43,0xDB,0x04,0x02,0x2E,0x96,0x43,0xDB,0x08,0x02,
-
0x2E,0x96,0x43,0xDB,0x10,0x02,0x2E,0x96,0x43,0xDB,0x20,0x02,0x2E,0x96,0x43,0xDB,
-
0x40,0x02,0x2E,0x96,0x43,0xDB,0x80,0x02,0x2E,0x96,0x43,0xDA,0x01,0x02,0x2E,0x96,
-
0x43,0xDA,0x02,0x02,0x2E,0x96,0x43,0xDA,0x04,0x02,0x2E,0x96,0x43,0xDA,0x08,0x02,
-
0x2E,0x96,0x43,0xDA,0x10,0x02,0x2E,0x96,0x43,0xDA,0x20,0x02,0x2E,0x96,0x43,0xDA,
-
0x40,0x02,0x2E,0x96,0x43,0xDA,0x80,0x02,0x2E,0x96,0x43,0xD9,0x01,0x02,0x2E,0x96,
-
0x43,0xD9,0x02,0x02,0x2E,0x96,0x43,0xD9,0x04,0x02,0x2E,0x96,0x43,0xD9,0x08,0x02,
-
0x2E,0x96,0x12,0x1C,0xAD,0x02,0x2E,0x96,0xE9,0x64,0x01,0x60,0x03,0x02,0x2E,0x96,
-
0x90,0x14,0x07,0xE0,0xB4,0x14,0x00,0x40,0x03,0x02,0x2E,0x93,0x90,0x2D,0xF3,0xF8,
-
0x28,0x28,0x73,0x02,0x2E,0x2F,0x02,0x2E,0x34,0x02,0x2E,0x39,0x02,0x2E,0x3E,0x02,
-
0x2E,0x43,0x02,0x2E,0x48,0x02,0x2E,0x4D,0x02,0x2E,0x52,0x02,0x2E,0x57,0x02,0x2E,
-
0x5C,0x02,0x2E,0x61,0x02,0x2E,0x66,0x02,0x2E,0x6B,0x02,0x2E,0x70,0x02,0x2E,0x75,
-
0x02,0x2E,0x7A,0x02,0x2E,0x7F,0x02,0x2E,0x84,0x02,0x2E,0x89,0x02,0x2E,0x8E,0x43,
-
0xDE,0x01,0x80,0x62,0x43,0xDE,0x02,0x80,0x5D,0x43,0xDE,0x04,0x80,0x58,0x43,0xDE,
-
0x08,0x80,0x53,0x43,0xDE,0x10,0x80,0x4E,0x43,0xDE,0x20,0x80,0x49,0x43,0xDE,0x40,
-
0x80,0x44,0x43,0xDE,0x80,0x80,0x3F,0x43,0xDD,0x01,0x80,0x3A,0x43,0xDD,0x02,0x80,
-
0x35,0x43,0xDD,0x04,0x80,0x30,0x43,0xDD,0x08,0x80,0x2B,0x43,0xDD,0x10,0x80,0x26,
-
0x43,0xDD,0x20,0x80,0x21,0x43,0xDD,0x40,0x80,0x1C,0x43,0xDD,0x80,0x80,0x17,0x43,
-
0xDC,0x01,0x80,0x12,0x43,0xDC,0x02,0x80,0x0D,0x43,0xDC,0x04,0x80,0x08,0x43,0xDC,
-
0x08,0x80,0x03,0x12,0x1C,0xB7,0x7F,0x00,0x22,0x90,0x14,0x08,0xE0,0x64,0x01,0x60,
-
0x03,0x02,0x30,0x38,0xE9,0x60,0x03,0x02,0x2F,0x77,0x90,0x14,0x07,0xE0,0xB4,0x14,
-
0x00,0x40,0x03,0x02,0x2F,0x71,0x90,0x2E,0xBD,0xF8,0x28,0x28,0x73,0x02,0x2E,0xF9,
-
0x02,0x2E,0xFF,0x02,0x2F,0x05,0x02,0x2F,0x0B,0x02,0x2F,0x11,0x02,0x2F,0x17,0x02,
-
0x2F,0x1D,0x02,0x2F,0x23,0x02,0x2F,0x29,0x02,0x2F,0x2F,0x02,0x2F,0x35,0x02,0x2F,
-
0x3B,0x02,0x2F,0x41,0x02,0x2F,0x47,0x02,0x2F,0x4D,0x02,0x2F,0x53,0x02,0x2F,0x59,
-
0x02,0x2F,0x5F,0x02,0x2F,0x65,0x02,0x2F,0x6B,0x53,0xDB,0xFE,0x02,0x30,0x35,0x53,
-
0xDB,0xFD,0x02,0x30,0x35,0x53,0xDB,0xFB,0x02,0x30,0x35,0x53,0xDB,0xF7,0x02,0x30,
-
0x35,0x53,0xDB,0xEF,0x02,0x30,0x35,0x53,0xDB,0xDF,0x02,0x30,0x35,0x53,0xDB,0xBF,
-
0x02,0x30,0x35,0x53,0xDB,0x7F,0x02,0x30,0x35,0x53,0xDA,0xFE,0x02,0x30,0x35,0x53,
-
0xDA,0xFD,0x02,0x30,0x35,0x53,0xDA,0xFB,0x02,0x30,0x35,0x53,0xDA,0xF7,0x02,0x30,
-
0x35,0x53,0xDA,0xEF,0x02,0x30,0x35,0x53,0xDA,0xDF,0x02,0x30,0x35,0x53,0xDA,0xBF,
-
0x02,0x30,0x35,0x53,0xDA,0x7F,0x02,0x30,0x35,0x53,0xD9,0xFE,0x02,0x30,0x35,0x53,
-
0xD9,0xFD,0x02,0x30,0x35,0x53,0xD9,0xFB,0x02,0x30,0x35,0x53,0xD9,0xF7,0x02,0x30,
-
0x35,0x12,0x1C,0xAD,0x02,0x30,0x35,0xE9,0x64,0x01,0x60,0x03,0x02,0x30,0x35,0x90,
-
0x14,0x07,0xE0,0xB4,0x14,0x00,0x40,0x03,0x02,0x30,0x32,0x90,0x2F,0x92,0xF8,0x28,
-
0x28,0x73,0x02,0x2F,0xCE,0x02,0x2F,0xD3,0x02,0x2F,0xD8,0x02,0x2F,0xDD,0x02,0x2F,
-
0xE2,0x02,0x2F,0xE7,0x02,0x2F,0xEC,0x02,0x2F,0xF1,0x02,0x2F,0xF6,0x02,0x2F,0xFB,
-
0x02,0x30,0x00,0x02,0x30,0x05,0x02,0x30,0x0A,0x02,0x30,0x0F,0x02,0x30,0x14,0x02,
-
0x30,0x19,0x02,0x30,0x1E,0x02,0x30,0x23,0x02,0x30,0x28,0x02,0x30,0x2D,0x53,0xDE,
-
0xFE,0x80,0x62,0x53,0xDE,0xFD,0x80,0x5D,0x53,0xDE,0xFB,0x80,0x58,0x53,0xDE,0xF7,
-
0x80,0x53,0x53,0xDE,0xEF,0x80,0x4E,0x53,0xDE,0xDF,0x80,0x49,0x53,0xDE,0xBF,0x80,
-
0x44,0x53,0xDE,0x7F,0x80,0x3F,0x53,0xDD,0xFE,0x80,0x3A,0x53,0xDD,0xFD,0x80,0x35,
-
0x53,0xDD,0xFB,0x80,0x30,0x53,0xDD,0xF7,0x80,0x2B,0x53,0xDD,0xEF,0x80,0x26,0x53,
-
0xDD,0xDF,0x80,0x21,0x53,0xDD,0xBF,0x80,0x1C,0x53,0xDD,0x7F,0x80,0x17,0x53,0xDC,
-
0xFE,0x80,0x12,0x53,0xDC,0xFD,0x80,0x0D,0x53,0xDC,0xFB,0x80,0x08,0x53,0xDC,0xF7,
-
0x80,0x03,0x12,0x1C,0xB7,0x7F,0x00,0x22,0x90,0x14,0x08,0xE0,0x64,0x02,0x60,0x03,
-
0x02,0x31,0xC8,0xE9,0x60,0x03,0x02,0x31,0x05,0x90,0x14,0x07,0xE0,0xB4,0x14,0x00,
-
0x40,0x03,0x02,0x31,0x00,0x90,0x30,0x5C,0xF8,0x28,0x28,0x73,0x02,0x30,0x98,0x02,
-
0x30,0x9C,0x02,0x30,0xA0,0x02,0x30,0xA4,0x02,0x30,0xA8,0x02,0x30,0xAC,0x02,0x30,
-
0xB0,0x02,0x30,0xB4,0x02,0x30,0xB8,0x02,0x30,0xBC,0x02,0x30,0xC0,0x02,0x30,0xC4,
-
0x02,0x30,0xC8,0x02,0x30,0xCF,0x02,0x30,0xD6,0x02,0x30,0xDD,0x02,0x30,0xE4,0x02,
-
0x30,0xEB,0x02,0x30,0xF2,0x02,0x30,0xF9,0xE5,0xDB,0x80,0x4A,0xE5,0xDB,0x80,0x4D,
-
0xE5,0xDB,0x80,0x50,0xE5,0xDB,0x80,0x53,0xE5,0xDB,0x80,0x1E,0xE5,0xDB,0x80,0x21,
-
0xE5,0xDB,0x80,0x24,0xE5,0xDB,0x80,0x27,0xE5,0xDA,0x80,0x2A,0xE5,0xDA,0x80,0x2D,
-
0xE5,0xDA,0x80,0x30,0xE5,0xDA,0x80,0x33,0xE5,0xDA,0x54,0x10,0xFE,0x80,0x33,0xE5,
-
0xDA,0x54,0x20,0xFE,0x80,0x2C,0xE5,0xDA,0x54,0x40,0xFE,0x80,0x25,0xE5,0xDA,0x54,
-
0x80,0xFE,0x80,0x1E,0xE5,0xD9,0x54,0x01,0xFE,0x80,0x17,0xE5,0xD9,0x54,0x02,0xFE,
-
0x80,0x10,0xE5,0xD9,0x54,0x04,0xFE,0x80,0x09,0xE5,0xD9,0x54,0x08,0xFE,0x80,0x02,
-
0xE4,0xFE,0xAF,0x06,0x22,0xE9,0x64,0x01,0x60,0x03,0x02,0x31,0xC8,0x90,0x14,0x07,
-
0xE0,0xB4,0x14,0x00,0x40,0x03,0x02,0x31,0xC4,0x90,0x31,0x20,0xF8,0x28,0x28,0x73,
-
0x02,0x31,0x5C,0x02,0x31,0x60,0x02,0x31,0x64,0x02,0x31,0x68,0x02,0x31,0x6C,0x02,
-
0x31,0x70,0x02,0x31,0x74,0x02,0x31,0x78,0x02,0x31,0x7C,0x02,0x31,0x80,0x02,0x31,
-
0x84,0x02,0x31,0x88,0x02,0x31,0x8C,0x02,0x31,0x93,0x02,0x31,0x9A,0x02,0x31,0xA1,
-
0x02,0x31,0xA8,0x02,0x31,0xAF,0x02,0x31,0xB6,0x02,0x31,0xBD,0xE5,0xDE,0x80,0x4A,
-
0xE5,0xDE,0x80,0x4D,0xE5,0xDE,0x80,0x50,0xE5,0xDE,0x80,0x53,0xE5,0xDE,0x80,0x1E,
-
0xE5,0xDE,0x80,0x21,0xE5,0xDE,0x80,0x24,0xE5,0xDE,0x80,0x27,0xE5,0xDD,0x80,0x2A,
-
0xE5,0xDD,0x80,0x2D,0xE5,0xDD,0x80,0x30,0xE5,0xDD,0x80,0x33,0xE5,0xDD,0x54,0x10,
-
0xFE,0x80,0x33,0xE5,0xDD,0x54,0x20,0xFE,0x80,0x2C,0xE5,0xDD,0x54,0x40,0xFE,0x80,
-
0x25,0xE5,0xDD,0x54,0x80,0xFE,0x80,0x1E,0xE5,0xDC,0x54,0x01,0xFE,0x80,0x17,0xE5,
-
0xDC,0x54,0x02,0xFE,0x80,0x10,0xE5,0xDC,0x54,0x04,0xFE,0x80,0x09,0xE5,0xDC,0x54,
-
0x08,0xFE,0x80,0x02,0xE4,0xFE,0xAF,0x06,0x22,0xE4,0x90,0x8F,0xF0,0xF0,0xD2,0x1B,
-
0x30,0x17,0x03,0x02,0x33,0xB7,0x90,0x12,0x5F,0xF0,0x90,0x13,0xB3,0xF0,0x12,0x19,
-
0xF0,0x40,0x03,0x02,0x33,0x0B,0x74,0xE5,0x2F,0x12,0x14,0x97,0xE0,0x70,0x03,0x02,
-
0x33,0x05,0x90,0x13,0xB3,0xE0,0x24,0x98,0x12,0x17,0x95,0xE0,0x60,0x03,0x02,0x33,
-
0x05,0x12,0x19,0xF9,0x40,0x03,0x02,0x33,0x05,0x12,0x1B,0xB5,0x12,0x14,0x97,0xE0,
-
0x64,0x03,0x60,0x04,0xC2,0x1B,0x80,0x07,0x7F,0x70,0x7E,0x17,0x12,0x4E,0x63,0x12,
-
0x1B,0xB5,0x12,0x14,0x97,0xE0,0x90,0x12,0x5F,0xB4,0x02,0x05,0xE0,0x04,0xF0,0x80,
-
0x03,0xE0,0x14,0xF0,0x90,0x13,0xB3,0xE0,0xFF,0x12,0x14,0x5D,0x12,0x15,0x53,0xFF,
-
0x90,0x13,0xB3,0xE0,0xFD,0x12,0x14,0x5D,0x12,0x13,0xD1,0x12,0x14,0x41,0x12,0x13,
-
0x68,0xFD,0x7F,0x10,0x7E,0x00,0x12,0x4D,0xDF,0x12,0x35,0x94,0x12,0x14,0x5D,0x12,
-
0x16,0xBA,0x12,0x13,0x68,0xFD,0x7F,0x06,0x7E,0x00,0x12,0x4D,0xDF,0x12,0x35,0xB6,
-
0x12,0x14,0x4A,0x12,0x15,0x6D,0x12,0x1C,0x68,0x12,0x14,0x5C,0x12,0x13,0xD1,0x12,
-
0x14,0x8C,0xE0,0x4F,0x12,0x14,0xDA,0x12,0x1B,0xF0,0xF5,0x83,0xEF,0xF0,0x12,0x14,
-
0x5C,0x12,0x1A,0x0C,0x12,0x1B,0xBC,0xD8,0xFB,0x12,0x14,0xDA,0x12,0x1B,0xF8,0xF5,
-
0x83,0xEF,0xF0,0x12,0x16,0xC1,0x12,0x1A,0x0C,0x12,0x1B,0xBC,0xD8,0xFB,0x12,0x14,
-
0xDA,0x12,0x1C,0x00,0xF5,0x83,0xEF,0xF0,0x12,0x14,0x5C,0x12,0x1A,0xF0,0x05,0x82,
-
0xD5,0x82,0x02,0x15,0x83,0x12,0x14,0xC0,0x12,0x1C,0x08,0xF5,0x83,0xEF,0xF0,0x90,
-
0x3F,0xFE,0xE0,0xB4,0x01,0x18,0xE5,0x09,0x12,0x14,0xDA,0x12,0x1A,0xFC,0xF5,0x83,
-
0xEF,0xF0,0xAF,0x0A,0x12,0x14,0xDB,0x12,0x19,0xAF,0xEF,0xF0,0x80,0x14,0x12,0x14,
-
0xDB,0x12,0x1A,0xFC,0xF5,0x83,0x74,0x08,0xF0,0x12,0x14,0xDB,0x12,0x19,0xAF,0x74,
-
0x08,0xF0,0x12,0x1B,0x53,0x12,0x1B,0x07,0x02,0x31,0xDE,0x12,0x1C,0xC1,0xB5,0x07,
-
0x04,0xD2,0x06,0x80,0x02,0xC2,0x06,0x30,0x19,0x4D,0x78,0x10,0xE6,0x60,0x02,0xC2,
-
0x1B,0x12,0x1A,0x48,0x12,0x14,0xDB,0x12,0x1B,0xF8,0xF5,0x83,0xEF,0xF0,0x12,0x14,
-
0xDB,0x12,0x1C,0x00,0xF5,0x83,0xE4,0xF0,0x12,0x14,0xDB,0x12,0x1C,0x08,0xF5,0x83,
-
0xE4,0xF0,0x12,0x14,0xDB,0x12,0x1B,0xF0,0xF5,0x83,0xE4,0xF0,0x12,0x14,0xDB,0x12,
-
0x1A,0xFC,0xF5,0x83,0xE4,0xF0,0x12,0x14,0xDB,0x12,0x19,0xAF,0x12,0x1B,0x51,0xEE,
-
0x70,0x05,0x78,0x11,0xF6,0xC2,0x19,0x20,0x0D,0x38,0x90,0x8F,0xF0,0xE0,0x90,0x13,
-
0xB3,0xF0,0x12,0x19,0xF0,0x50,0x2B,0xEF,0x75,0xF0,0x06,0xA4,0x12,0x1B,0xF8,0x12,
-
0x16,0xDD,0x12,0x1C,0x00,0x12,0x16,0xDD,0x12,0x1C,0x08,0x12,0x16,0xDD,0x12,0x1B,
-
0xF0,0x12,0x16,0xDD,0x12,0x1A,0xFC,0x12,0x16,0xDD,0x12,0x19,0xAF,0x12,0x1B,0x04,
-
0x80,0xD0,0x90,0x8F,0xF0,0xE0,0xD3,0x94,0x00,0x50,0x03,0x02,0x35,0x93,0x20,0x1B,
-
0x03,0x02,0x35,0x93,0xD2,0x0E,0x22,0xE4,0x90,0x13,0xB3,0xF0,0x12,0x19,0xF0,0x40,
-
0x03,0x02,0x34,0xEE,0xE4,0x90,0x12,0x5F,0xF0,0x74,0xE5,0x2F,0x12,0x14,0x97,0xE0,
-
0x70,0x03,0x02,0x34,0xE8,0x90,0x13,0xB3,0xE0,0x24,0x98,0x12,0x17,0x95,0xE0,0x60,
-
0x03,0x02,0x34,0xE8,0x12,0x19,0xF9,0x40,0x03,0x02,0x34,0xE8,0x12,0x1B,0xB5,0x12,
-
0x14,0x97,0xE0,0x64,0x03,0x60,0x04,0xC2,0x1B,0x80,0x07,0x7F,0x70,0x7E,0x17,0x12,
-
0x4E,0x63,0x12,0x1B,0xB5,0x12,0x14,0x97,0xE0,0x90,0x12,0x5F,0xB4,0x02,0x05,0xE0,
-
0x04,0xF0,0x80,0x03,0xE0,0x14,0xF0,0x90,0x13,0xB3,0xE0,0xFF,0x12,0x14,0x5D,0x12,
-
0x15,0x53,0xFF,0x90,0x13,0xB3,0xE0,0xFD,0x12,0x14,0x5D,0x12,0x13,0xD1,0x12,0x14,
-
0x41,0x12,0x13,0x68,0xFD,0x7F,0x10,0x7E,0x00,0x12,0x4D,0xDF,0x12,0x35,0x94,0x12,
-
0x14,0x5D,0x12,0x16,0xBA,0x12,0x13,0x68,0xFD,0x7F,0x06,0x7E,0x00,0x12,0x4D,0xDF,
-
0x12,0x35,0xB6,0x12,0x14,0x4A,0x12,0x15,0x6D,0x12,0x1C,0x68,0x12,0x14,0x5C,0x12,
-
0x13,0xD1,0x12,0x14,0x8C,0xE0,0x4F,0x12,0x14,0xDA,0x12,0x1C,0x10,0xF5,0x83,0xEF,
-
0xF0,0x12,0x14,0x5C,0x12,0x1A,0x0C,0x12,0x1B,0xBC,0xD8,0xFB,0x12,0x14,0xDA,0x12,
-
0x1C,0x18,0xF5,0x83,0xEF,0xF0,0x12,0x16,0xC1,0x12,0x1A,0x0C,0x12,0x1B,0xBC,0xD8,
-
0xFB,0x12,0x14,0xDA,0x12,0x1C,0x20,0xF5,0x83,0xEF,0xF0,0x12,0x14,0x5C,0x12,0x1A,
-
0xF0,0x05,0x82,0xD5,0x82,0x02,0x15,0x83,0x12,0x14,0xC0,0x12,0x1C,0x28,0xF5,0x83,
-
0xEF,0xF0,0x90,0x3F,0xFE,0xE0,0xB4,0x01,0x18,0xE5,0x09,0x12,0x14,0xDA,0x12,0x1B,
-
0x0E,0xF5,0x83,0xEF,0xF0,0xAF,0x0A,0x12,0x14,0xDB,0x12,0x19,0xB9,0xEF,0xF0,0x80,
-
0x14,0x12,0x14,0xDB,0x12,0x1B,0x0E,0xF5,0x83,0x74,0x08,0xF0,0x12,0x14,0xDB,0x12,
-
0x19,0xB9,0x74,0x08,0xF0,0x12,0x1B,0x53,0x12,0x1B,0x07,0x02,0x33,0xBC,0x12,0x1C,
-
0xC1,0xB5,0x07,0x04,0xD2,0x06,0x80,0x02,0xC2,0x06,0x30,0x19,0x4D,0x78,0x10,0xE6,
-
0x60,0x02,0xC2,0x1B,0x12,0x1A,0x48,0x12,0x14,0xDB,0x12,0x1C,0x18,0xF5,0x83,0xEF,
-
0xF0,0x12,0x14,0xDB,0x12,0x1C,0x20,0xF5,0x83,0xE4,0xF0,0x12,0x14,0xDB,0x12,0x1C,
-
0x28,0xF5,0x83,0xE4,0xF0,0x12,0x14,0xDB,0x12,0x1C,0x10,0xF5,0x83,0xE4,0xF0,0x12,
-
0x14,0xDB,0x12,0x1B,0x0E,0xF5,0x83,0xE4,0xF0,0x12,0x14,0xDB,0x12,0x19,0xB9,0x12,
-
0x1B,0x51,0xEE,0x70,0x05,0x78,0x11,0xF6,0xC2,0x19,0x20,0x0D,0x38,0x90,0x8F,0xF0,
-
0xE0,0x90,0x13,0xB3,0xF0,0x12,0x19,0xF0,0x50,0x2B,0xEF,0x75,0xF0,0x06,0xA4,0x12,
-
0x1C,0x18,0x12,0x16,0xDD,0x12,0x1C,0x20,0x12,0x16,0xDD,0x12,0x1C,0x28,0x12,0x16,
-
0xDD,0x12,0x1C,0x10,0x12,0x16,0xDD,0x12,0x1B,0x0E,0x12,0x16,0xDD,0x12,0x19,0xB9,
-
0x12,0x1B,0x04,0x80,0xD0,0x90,0x8F,0xF0,0xE0,0xD3,0x94,0x00,0x40,0x05,0x30,0x1B,
-
0x02,0xD2,0x0E,0x22,0xE4,0xFC,0xFD,0x90,0x13,0xB6,0x12,0x3D,0x5C,0x90,0x13,0xB6,
-
0xA3,0xA3,0xE0,0xFE,0xA3,0xE0,0xFD,0xAC,0x06,0x7F,0x0F,0x7E,0x00,0x12,0x4D,0xB4,
-
0x90,0x13,0xB3,0xE0,0xFD,0x22,0xE4,0xFC,0xFD,0x90,0x13,0xB6,0x12,0x3D,0x5C,0x90,
-
0x13,0xB6,0xA3,0xA3,0xE0,0xFE,0xA3,0xE0,0xFD,0xAC,0x06,0x7F,0x05,0x7E,0x00,0x12,
-
0x4D,0xB4,0x90,0x13,0xB3,0xE0,0xFD,0x22,0x75,0x81,0x64,0xD2,0xAF,0xD2,0xAE,0x12,
-
0x00,0x40,0x12,0x7F,0xF0,0x7F,0x64,0x7E,0x00,0x12,0x4E,0x63,0x12,0x4C,0xF8,0x12,
-
0x38,0xAE,0xC2,0x15,0x12,0x4D,0x7C,0xC2,0x01,0x75,0x9E,0x55,0x20,0x0C,0x03,0x02,
-
0x37,0xC5,0xC2,0x0C,0x85,0x0E,0x09,0x85,0x0F,0x0A,0xE4,0xF5,0x0E,0xF5,0x0F,0x20,
-
0x15,0x03,0x12,0x4E,0x84,0x30,0x05,0x09,0x12,0x1C,0xCB,0x12,0x3D,0xA5,0x02,0x37,
-
0xC5,0x20,0x15,0x03,0x02,0x36,0xB2,0xE4,0x90,0xF1,0x0A,0xF0,0x90,0xF1,0x1B,0xF0,
-
0x90,0xF1,0x1F,0x74,0x0F,0xF0,0x90,0xF1,0x22,0x74,0x05,0xF0,0xE4,0x90,0xF1,0x1C,
-
0xF0,0x90,0xF1,0x06,0x04,0xF0,0xA3,0xF0,0x90,0xF1,0x0E,0xF0,0xE4,0x12,0x4D,0x74,
-
0xF0,0x12,0x4D,0x74,0x74,0x05,0xF0,0xE4,0xFD,0xFC,0xED,0x25,0xE0,0xFE,0xEC,0x33,
-
0x90,0x13,0xB1,0xF0,0xA3,0xCE,0xF0,0x90,0x13,0xB1,0xE0,0xFE,0xA3,0xE0,0x7B,0x01,
-
0x24,0x01,0xF9,0x74,0xF0,0x3E,0xFA,0xE4,0x12,0x3C,0x24,0x04,0x29,0xF9,0xE4,0x3A,
-
0xFA,0x74,0x08,0x12,0x3C,0x24,0x0D,0xBD,0x00,0x01,0x0C,0xED,0x64,0x60,0x4C,0x70,
-
0xC9,0x12,0x4B,0x7E,0x90,0x12,0x5B,0xE0,0x04,0xF0,0xE0,0x64,0x60,0x60,0x03,0x02,
-
0x37,0xC5,0xF0,0x90,0x12,0x71,0xF0,0x90,0x8F,0xFD,0x74,0xBB,0xF0,0xC2,0x15,0x02,
-
0x37,0xC5,0x90,0x13,0x97,0xE0,0xFF,0x12,0x47,0x53,0x12,0x4E,0xAD,0xA2,0xD9,0xE4,
-
0x33,0x90,0x8E,0x01,0xF0,0x90,0xF0,0xC4,0x74,0x01,0xF0,0x30,0x18,0x09,0x12,0x1C,
-
0xCB,0x12,0x41,0x4B,0x12,0x42,0xF9,0x12,0x00,0x4F,0x12,0x44,0x81,0x12,0x31,0xC9,
-
0x90,0x3F,0xFD,0xE0,0xB4,0x02,0x15,0xE5,0x91,0x30,0xE4,0x05,0x75,0x9E,0x55,0x80,
-
0xF6,0x12,0x4D,0x6C,0x40,0x04,0xC2,0x84,0x80,0x02,0xD2,0x84,0xE5,0x91,0x30,0xE4,
-
0x03,0x02,0x37,0xB5,0x12,0x4D,0x6C,0x40,0x4F,0xE4,0x90,0x12,0x63,0xF0,0xA3,0xF0,
-
0xB2,0x17,0x75,0x8A,0x8B,0xF5,0x8B,0x30,0x17,0x18,0x90,0x13,0xAD,0xF0,0x90,0x13,
-
0xAD,0xE0,0xFF,0x24,0x00,0xF5,0x82,0xE4,0x34,0x8F,0x12,0x4D,0x54,0xB4,0x3C,0xEE,
-
0x80,0x17,0xE4,0x90,0x13,0xAD,0xF0,0x90,0x13,0xAD,0xE0,0xFF,0x24,0x78,0xF5,0x82,
-
0xE4,0x34,0x8F,0x12,0x4D,0x54,0xB4,0x3C,0xEE,0x90,0x3F,0xFD,0xE0,0x64,0x01,0x70,
-
0x72,0xC2,0x84,0x7F,0x32,0xFE,0x80,0x56,0x30,0x0E,0x68,0x30,0x09,0x16,0x90,0x3F,
-
0xFD,0xE0,0xB4,0x01,0x0B,0xC2,0x84,0x7F,0x32,0x7E,0x00,0x12,0x4E,0x63,0xD2,0x84,
-
0xC2,0x09,0x80,0x4F,0x90,0x12,0x8D,0xE4,0xF0,0xA3,0x74,0x64,0xF0,0x7F,0x19,0x7E,
-
0x00,0x12,0x4E,0x63,0x90,0x12,0x8E,0xE0,0x24,0xFF,0xF0,0x90,0x12,0x8D,0xE0,0x34,
-
0xFF,0xF0,0x75,0x9E,0x55,0x30,0x0E,0x0D,0xD3,0xA3,0xE0,0x94,0x00,0x90,0x12,0x8D,
-
0xE0,0x94,0x00,0x50,0xD8,0x30,0x0E,0x1B,0xC2,0x84,0x7F,0x19,0x7E,0x00,0x12,0x4E,
-
0x63,0xD2,0x84,0x80,0x0E,0x12,0x4D,0x6C,0x40,0x09,0x30,0x0E,0x04,0xD2,0x0D,0x80,
-
0x02,0xC2,0x0D,0xC2,0x18,0x20,0x07,0x03,0x02,0x38,0x99,0xC2,0x07,0xC2,0x05,0x90,
-
0x8F,0xFF,0xE0,0xB4,0xAF,0x21,0xE4,0xF0,0x12,0x4C,0x1E,0x75,0xA1,0x10,0x90,0xF1,
-
0x42,0xE0,0x44,0x10,0xF0,0x7F,0x02,0x7E,0x00,0x12,0x4E,0x0A,0x75,0x87,0x02,0x75,
-
0x97,0x55,0x00,0x00,0x02,0x35,0xF9,0x90,0x8F,0xFF,0xE0,0x64,0xAE,0x70,0x03,0x02,
-
0x35,0xF9,0x90,0x8F,0xFF,0xE0,0xB4,0xBF,0x05,0xD2,0x05,0x02,0x35,0xF9,0x90,0x8F,
-
0xFF,0xE0,0xB4,0xCC,0x13,0x12,0x38,0xA4,0xD2,0x84,0x7F,0x64,0x7E,0x00,0x12,0x4E,
-
0x63,0x12,0x38,0xA4,0xD2,0x84,0x80,0x57,0x90,0x8F,0xFF,0xE0,0xB4,0xC3,0x05,0xD2,
-
0x01,0x02,0x35,0xF9,0x90,0x8F,0xFF,0xE0,0x64,0xC5,0x70,0x37,0xF0,0x90,0x8F,0xFD,
-
0x74,0xAA,0xF0,0xD2,0x15,0x12,0x4D,0x7C,0x90,0xF1,0x0A,0xF0,0x90,0xF1,0x1F,0x74,
-
0x14,0xF0,0x90,0xF1,0x22,0xF0,0xE4,0x90,0xF1,0x1C,0xF0,0x75,0x9E,0x55,0x90,0xF0,
-
0xC5,0xE0,0x44,0x01,0xF0,0x12,0x4E,0xAD,0x90,0xF0,0xC4,0x74,0x01,0xF0,0xC2,0x0C,
-
0x02,0x35,0xF9,0x90,0x8F,0xFF,0xE0,0xB4,0xD1,0x0D,0xD2,0x04,0x12,0x26,0x7B,0xE4,
-
0x90,0x8F,0xFF,0xF0,0x02,0x35,0xF9,0x90,0x8F,0xFF,0xE0,0x64,0xE1,0x60,0x03,0x02,
-
0x35,0xF9,0xF0,0x12,0x49,0x4E,0x02,0x35,0xF9,0x20,0x08,0x03,0x02,0x35,0xF9,0xC2,
-
0x08,0x02,0x35,0xF9,0xC2,0x84,0x7F,0x64,0x7E,0x00,0x12,0x4E,0x63,0x22,0x90,0x19,
-
0x40,0x74,0x03,0xF0,0x90,0x19,0x41,0x74,0x03,0xF0,0x90,0x19,0x42,0x74,0x03,0xF0,
-
0x90,0x19,0x43,0x74,0x02,0xF0,0x90,0x19,0x44,0x74,0x02,0xF0,0x90,0x19,0x45,0x74,
-
0x02,0xF0,0x90,0x19,0x46,0x74,0x02,0xF0,0x90,0x19,0x47,0x74,0x03,0xF0,0x90,0x19,
-
0x48,0x74,0x03,0xF0,0x90,0x19,0x49,0x74,0x03,0xF0,0x90,0x19,0x4A,0x74,0x03,0xF0,
-
0x90,0x19,0x4B,0x74,0x03,0xF0,0x90,0x19,0x4C,0x74,0x03,0xF0,0x90,0x19,0x4D,0x74,
-
0x03,0xF0,0x90,0x19,0x4E,0x74,0x03,0xF0,0x90,0x19,0x4F,0x74,0x03,0xF0,0x90,0x19,
-
0x50,0x74,0x03,0xF0,0x90,0x19,0x51,0x74,0x03,0xF0,0x90,0x19,0x52,0x74,0x03,0xF0,
-
0x90,0x19,0x53,0x74,0x03,0xF0,0x90,0x19,0x54,0x74,0x03,0xF0,0x90,0x19,0x55,0x74,
-
0x03,0xF0,0x90,0x19,0x56,0x74,0x03,0xF0,0x90,0x19,0x57,0x74,0x03,0xF0,0x90,0x19,
-
0x58,0x74,0x01,0xF0,0x90,0x19,0x59,0x74,0x01,0xF0,0x90,0x19,0x5A,0x74,0x01,0xF0,
-
0x90,0x19,0x5B,0x74,0x01,0xF0,0x90,0x19,0x5C,0x74,0x01,0xF0,0x90,0x19,0x5D,0x74,
-
0x02,0xF0,0x90,0x19,0x5E,0x74,0x02,0xF0,0x90,0x19,0x5F,0x74,0x02,0xF0,0x90,0x19,
-
0x60,0x74,0x02,0xF0,0x90,0x19,0x61,0x74,0x02,0xF0,0x90,0x19,0x62,0x74,0x02,0xF0,
-
0x90,0x19,0x63,0x74,0x02,0xF0,0x90,0x19,0x64,0x74,0x02,0xF0,0x90,0x19,0x65,0x74,
-
0x01,0xF0,0x90,0x19,0x66,0x74,0x01,0xF0,0x90,0x19,0x67,0x74,0x01,0xF0,0x90,0x19,
-
0x68,0x74,0x01,0xF0,0x90,0x19,0x69,0x74,0x01,0xF0,0x90,0x19,0x6A,0x74,0x01,0xF0,
-
0x90,0x19,0x6B,0x74,0x01,0xF0,0x90,0x19,0x6C,0x74,0x01,0xF0,0x90,0x19,0x6D,0x74,
-
0x01,0xF0,0x90,0x19,0x6E,0x74,0x01,0xF0,0x90,0x19,0x6F,0x74,0x01,0xF0,0x90,0x19,
-
0x70,0x74,0x01,0xF0,0x90,0x19,0x71,0x74,0x01,0xF0,0x90,0x19,0x72,0x74,0x01,0xF0,
-
0x90,0x19,0x73,0x74,0x01,0xF0,0x90,0x19,0x74,0x74,0x01,0xF0,0x90,0x19,0x75,0x74,
-
0x01,0xF0,0x90,0x19,0x76,0x74,0x01,0xF0,0x90,0x19,0x77,0x74,0x01,0xF0,0x90,0x19,
-
0x78,0x74,0x01,0xF0,0x90,0x19,0x79,0x74,0x01,0xF0,0x90,0x19,0x7A,0x74,0x01,0xF0,
-
0x90,0x19,0x7B,0x74,0x02,0xF0,0x90,0x19,0x7C,0x74,0x02,0xF0,0x90,0x19,0x7D,0x74,
-
0x02,0xF0,0x90,0x19,0x7E,0x74,0x02,0xF0,0x90,0x19,0x7F,0x74,0x02,0xF0,0x90,0x19,
-
0x80,0x74,0x02,0xF0,0x90,0x19,0x81,0x74,0x02,0xF0,0x90,0x19,0x82,0x74,0x02,0xF0,
-
0x90,0x19,0x83,0x74,0x02,0xF0,0x90,0x19,0x84,0x74,0x02,0xF0,0x90,0x19,0x85,0x74,
-
0x01,0xF0,0x90,0x19,0x86,0x74,0x01,0xF0,0x90,0x19,0x87,0x74,0x01,0xF0,0x90,0x19,
-
0x88,0x74,0x02,0xF0,0x90,0x19,0x89,0x74,0x02,0xF0,0x90,0x19,0x8A,0x74,0x02,0xF0,
-
0x90,0x19,0x8B,0x74,0x02,0xF0,0x90,0x19,0x8C,0x74,0x02,0xF0,0x90,0x19,0x8D,0x74,
-
0x02,0xF0,0x90,0x19,0x8E,0x74,0x02,0xF0,0x90,0x19,0x8F,0x74,0x02,0xF0,0x90,0x19,
-
0x90,0x74,0x02,0xF0,0x90,0x19,0x91,0x74,0x02,0xF0,0x90,0x19,0x92,0x74,0x02,0xF0,
-
0x90,0x19,0x93,0x74,0x02,0xF0,0x90,0x19,0x94,0x74,0x02,0xF0,0x90,0x19,0x95,0x74,
-
0x02,0xF0,0x90,0x19,0x96,0x74,0x02,0xF0,0x90,0x19,0x97,0x74,0x02,0xF0,0x90,0x19,
-
0x98,0x74,0x02,0xF0,0x90,0x19,0x99,0x74,0x02,0xF0,0x90,0x19,0x9A,0x74,0x02,0xF0,
-
0x90,0x19,0x9B,0x74,0x02,0xF0,0x90,0x19,0x9C,0x74,0x02,0xF0,0x90,0x19,0x9D,0x74,
-
0x02,0xF0,0x90,0x19,0x9E,0x74,0x02,0xF0,0x90,0x19,0x9F,0x74,0x02,0xF0,0x75,0x9E,
-
0x55,0xE4,0xFF,0xFE,0x12,0x4A,0x9A,0xB4,0x01,0x09,0x12,0x4A,0x7D,0x74,0x01,0x12,
-
0x4A,0x8A,0x0F,0x12,0x4A,0x9A,0xB4,0x03,0x09,0x12,0x4A,0x7D,0x74,0x03,0x12,0x4A,
-
0x8A,0x0F,0x0E,0xEE,0xB4,0x60,0xDD,0xAE,0x07,0xEE,0xC3,0x94,0x60,0x50,0x0E,0xEE,
-
0x12,0x4A,0x7E,0x74,0x1F,0xF0,0xEE,0x12,0x4A,0x8C,0x0E,0x80,0xEC,0x22,0xE7,0x09,
-
0xF6,0x08,0xDF,0xFA,0x80,0x46,0xE7,0x09,0xF2,0x08,0xDF,0xFA,0x80,0x3E,0x88,0x82,
-
0x8C,0x83,0xE7,0x09,0xF0,0xA3,0xDF,0xFA,0x80,0x32,0xE3,0x09,0xF6,0x08,0xDF,0xFA,
-
0x80,0x78,0xE3,0x09,0xF2,0x08,0xDF,0xFA,0x80,0x70,0x88,0x82,0x8C,0x83,0xE3,0x09,
-
0xF0,0xA3,0xDF,0xFA,0x80,0x64,0x89,0x82,0x8A,0x83,0xE0,0xA3,0xF6,0x08,0xDF,0xFA,
-
0x80,0x58,0x89,0x82,0x8A,0x83,0xE0,0xA3,0xF2,0x08,0xDF,0xFA,0x80,0x4C,0x80,0xD2,
-
0x80,0xFA,0x80,0xC6,0x80,0xD4,0x80,0x69,0x80,0xF2,0x80,0x33,0x80,0x10,0x80,0xA6,
-
0x80,0xEA,0x80,0x9A,0x80,0xA8,0x80,0xDA,0x80,0xE2,0x80,0xCA,0x80,0x33,0x89,0x82,
-
0x8A,0x83,0xEC,0xFA,0xE4,0x93,0xA3,0xC8,0xC5,0x82,0xC8,0xCC,0xC5,0x83,0xCC,0xF0,
-
0xA3,0xC8,0xC5,0x82,0xC8,0xCC,0xC5,0x83,0xCC,0xDF,0xE9,0xDE,0xE7,0x80,0x0D,0x89,
-
0x82,0x8A,0x83,0xE4,0x93,0xA3,0xF6,0x08,0xDF,0xF9,0xEC,0xFA,0xA9,0xF0,0xED,0xFB,
-
0x22,0x89,0x82,0x8A,0x83,0xEC,0xFA,0xE0,0xA3,0xC8,0xC5,0x82,0xC8,0xCC,0xC5,0x83,
-
0xCC,0xF0,0xA3,0xC8,0xC5,0x82,0xC8,0xCC,0xC5,0x83,0xCC,0xDF,0xEA,0xDE,0xE8,0x80,
-
0xDB,0x89,0x82,0x8A,0x83,0xE4,0x93,0xA3,0xF2,0x08,0xDF,0xF9,0x80,0xCC,0x88,0xF0,
-
0xEF,0x60,0x01,0x0E,0x4E,0x60,0xC3,0x88,0xF0,0xED,0x24,0x02,0xB4,0x04,0x00,0x50,
-
0xB9,0xF5,0x82,0xEB,0x24,0x02,0xB4,0x04,0x00,0x50,0xAF,0x23,0x23,0x45,0x82,0x23,
-
0x90,0x3B,0x7E,0x73,0xBB,0x01,0x06,0x89,0x82,0x8A,0x83,0xF0,0x22,0x50,0x02,0xF7,
-
0x22,0xBB,0xFE,0x01,0xF3,0x22,0xEF,0x8D,0xF0,0xA4,0xA8,0xF0,0xCF,0x8C,0xF0,0xA4,
-
0x28,0xCE,0x8D,0xF0,0xA4,0x2E,0xFE,0x22,0xBC,0x00,0x0B,0xBE,0x00,0x29,0xEF,0x8D,
-
0xF0,0x84,0xFF,0xAD,0xF0,0x22,0xE4,0xCC,0xF8,0x75,0xF0,0x08,0xEF,0x2F,0xFF,0xEE,
-
0x33,0xFE,0xEC,0x33,0xFC,0xEE,0x9D,0xEC,0x98,0x40,0x05,0xFC,0xEE,0x9D,0xFE,0x0F,
-
0xD5,0xF0,0xE9,0xE4,0xCE,0xFD,0x22,0xED,0xF8,0xF5,0xF0,0xEE,0x84,0x20,0xD2,0x1C,
-
0xFE,0xAD,0xF0,0x75,0xF0,0x08,0xEF,0x2F,0xFF,0xED,0x33,0xFD,0x40,0x07,0x98,0x50,
-
0x06,0xD5,0xF0,0xF2,0x22,0xC3,0x98,0xFD,0x0F,0xD5,0xF0,0xEA,0x22,0xC2,0xD5,0xEC,
-
0x30,0xE7,0x09,0xB2,0xD5,0xE4,0xC3,0x9D,0xFD,0xE4,0x9C,0xFC,0xEE,0x30,0xE7,0x15,
-
0xB2,0xD5,0xE4,0xC3,0x9F,0xFF,0xE4,0x9E,0xFE,0x12,0x3C,0x48,0xC3,0xE4,0x9D,0xFD,
-
0xE4,0x9C,0xFC,0x80,0x03,0x12,0x3C,0x48,0x30,0xD5,0x07,0xC3,0xE4,0x9F,0xFF,0xE4,
-
0x9E,0xFE,0x22,0xC5,0xF0,0xF8,0xA3,0xE0,0x28,0xF0,0xC5,0xF0,0xF8,0xE5,0x82,0x15,
-
0x82,0x70,0x02,0x15,0x83,0xE0,0x38,0xF0,0x22,0xE8,0x8F,0xF0,0xA4,0xCC,0x8B,0xF0,
-
0xA4,0x2C,0xFC,0xE9,0x8E,0xF0,0xA4,0x2C,0xFC,0x8A,0xF0,0xED,0xA4,0x2C,0xFC,0xEA,
-
0x8E,0xF0,0xA4,0xCD,0xA8,0xF0,0x8B,0xF0,0xA4,0x2D,0xCC,0x38,0x25,0xF0,0xFD,0xE9,
-
0x8F,0xF0,0xA4,0x2C,0xCD,0x35,0xF0,0xFC,0xEB,0x8E,0xF0,0xA4,0xFE,0xA9,0xF0,0xEB,
-
0x8F,0xF0,0xA4,0xCF,0xC5,0xF0,0x2E,0xCD,0x39,0xFE,0xE4,0x3C,0xFC,0xEA,0xA4,0x2D,
-
0xCE,0x35,0xF0,0xFD,0xE4,0x3C,0xFC,0x22,0xEB,0x9F,0xF5,0xF0,0xEA,0x9E,0x42,0xF0,
-
0xE9,0x9D,0x42,0xF0,0xE8,0x9C,0x45,0xF0,0x22,0xE8,0x60,0x0F,0xEC,0xC3,0x13,0xFC,
-
0xED,0x13,0xFD,0xEE,0x13,0xFE,0xEF,0x13,0xFF,0xD8,0xF1,0x22,0xEC,0xF0,0xA3,0xED,
-
0xF0,0xA3,0xEE,0xF0,0xA3,0xEF,0xF0,0x22,0xA8,0x82,0x85,0x83,0xF0,0xD0,0x83,0xD0,
-
0x82,0x12,0x3D,0x7F,0x12,0x3D,0x7F,0x12,0x3D,0x7F,0x12,0x3D,0x7F,0xE4,0x73,0xE4,
-
0x93,0xA3,0xC5,0x83,0xC5,0xF0,0xC5,0x83,0xC8,0xC5,0x82,0xC8,0xF0,0xA3,0xC5,0x83,
-
0xC5,0xF0,0xC5,0x83,0xC8,0xC5,0x82,0xC8,0x22,0xA4,0x25,0x82,0xF5,0x82,0xE5,0xF0,
-
0x35,0x83,0xF5,0x83,0x22,0xE4,0x90,0x13,0xB3,0xF0,0xA3,0xF0,0x90,0x8F,0xFE,0x74,
-
0xAA,0xF0,0x90,0x8F,0xFD,0xE0,0x64,0xBB,0x60,0x1A,0x90,0x13,0xB4,0xE0,0x04,0xF0,
-
0x70,0x06,0x90,0x13,0xB3,0xE0,0x04,0xF0,0x75,0x9E,0x55,0x7F,0xFA,0x7E,0x00,0x12,
-
0x4E,0x63,0x80,0xDE,0xE4,0x90,0x8F,0xFD,0xF0,0x90,0x8F,0xFE,0xF0,0xD2,0xD8,0xA2,
-
0xD9,0x33,0x90,0x8E,0x01,0xF0,0x12,0x4A,0xC6,0x22,0xC0,0xE0,0xC0,0x83,0xC0,0x82,
-
0xD2,0x0C,0x90,0xF0,0xC4,0xE4,0xF0,0xC2,0xD8,0xD0,0x82,0xD0,0x83,0xD0,0xE0,0x32,
-
0x08,0x00,0x06,0x00,0x01,0x05,0x97,0x01,0x0A,0x40,0x14,0x1E,0x01,0x00,0x00,0x00,
-
0x00,0x01,0x08,0x01,0x01,0x00,0x80,0x00,0xFA,0x13,0x88,0x00,0x01,0x05,0x01,0x01,
-
0x0A,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x6C,0x78,0x2D,0x2D,0x6A,0x73,0x37,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x7A,0x63,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,
-
0xF0,0xA3,0xF0,0x22,0x90,0xF0,0x75,0xF0,0x90,0xF0,0x78,0x74,0x08,0xF0,0xE4,0x90,
-
0xF0,0x77,0xF0,0x90,0xF0,0x7A,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x79,0xF0,0x90,0xF0,
-
0x7C,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x7B,0xF0,0x90,0xF0,0x7E,0x74,0x08,0xF0,0xE4,
-
0x90,0xF0,0x7D,0xF0,0x90,0xF0,0x80,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x7F,0xF0,0x90,
-
0xF0,0x82,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x81,0xF0,0x90,0xF0,0x84,0x74,0x08,0xF0,
-
0xE4,0x90,0xF0,0x83,0xF0,0x90,0xF0,0x86,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x85,0xF0,
-
0x90,0xF0,0x88,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x87,0xF0,0x90,0xF0,0x8A,0x74,0x08,
-
0xF0,0xE4,0x90,0xF0,0x89,0xF0,0x90,0xF0,0x8C,0x74,0x20,0xF0,0x90,0xF0,0x8B,0x22,
-
0x90,0xF0,0xB0,0xF0,0xE4,0x90,0xF0,0xAF,0xF0,0x90,0xF0,0xB2,0x74,0x08,0xF0,0xE4,
-
0x90,0xF0,0xB1,0xF0,0x90,0xF0,0xB4,0x74,0x08,0xF0,0xE4,0x90,0xF0,0xB3,0xF0,0x90,
-
0xF0,0xB6,0x74,0x08,0xF0,0xE4,0x90,0xF0,0xB5,0xF0,0x90,0xF0,0xB8,0x74,0x08,0xF0,
-
0xE4,0x90,0xF0,0xB7,0xF0,0x90,0xF0,0xBA,0x74,0x08,0xF0,0xE4,0x90,0xF0,0xB9,0xF0,
-
0x90,0xF0,0xBC,0x74,0x08,0xF0,0xE4,0x90,0xF0,0xBB,0xF0,0x90,0xF0,0xBE,0x74,0x08,
-
0xF0,0xE4,0x90,0xF0,0xBD,0xF0,0x90,0xF0,0xC0,0x74,0x08,0xF0,0xE4,0x90,0xF0,0xBF,
-
0xF0,0x90,0xF1,0x06,0x22,0xF0,0x90,0xF0,0x3C,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x3B,
-
0xF0,0x90,0xF0,0x3E,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x3D,0xF0,0x90,0xF0,0x40,0x74,
-
0x08,0xF0,0xE4,0x90,0xF0,0x3F,0xF0,0x90,0xF0,0x42,0x74,0x08,0xF0,0xE4,0x90,0xF0,
-
0x41,0xF0,0x90,0xF0,0x44,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x43,0xF0,0x90,0xF0,0x46,
-
0x74,0x08,0xF0,0xE4,0x90,0xF0,0x45,0xF0,0x90,0xF0,0x48,0x74,0x08,0xF0,0xE4,0x90,
-
0xF0,0x47,0xF0,0x90,0xF0,0x4A,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x49,0xF0,0x90,0xF0,
-
0x4C,0x22,0x90,0xF0,0x06,0xF0,0x90,0xF0,0x05,0x74,0x02,0xF0,0x90,0xF0,0x08,0x74,
-
0x08,0xF0,0xE4,0x90,0xF0,0x07,0xF0,0x90,0xF0,0x0A,0x74,0x08,0xF0,0xE4,0x90,0xF0,
-
0x09,0xF0,0x90,0xF0,0x0C,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x0B,0xF0,0x90,0xF0,0x0E,
-
0x74,0x08,0xF0,0xE4,0x90,0xF0,0x0D,0xF0,0x90,0xF0,0x10,0x22,0x90,0xF1,0x0E,0xF0,
-
0x90,0xF1,0x0F,0xF0,0x90,0xF1,0x10,0xF0,0x90,0xF1,0x11,0xF0,0x90,0xF1,0x12,0xF0,
-
0x90,0xF1,0x13,0xF0,0x90,0xF1,0x14,0x22,0x90,0xF0,0x24,0xF0,0x90,0xF0,0x23,0x74,
-
0x01,0xF0,0x90,0xF0,0x26,0x22,0x90,0xF0,0x2C,0xF0,0x90,0xF0,0x2B,0x74,0x02,0xF0,
-
0x90,0xF0,0x2E,0x22,0x90,0xF0,0x36,0xF0,0x90,0xF0,0x35,0x74,0x02,0xF0,0x90,0xF0,
-
0x38,0x22,0x90,0xF0,0x6B,0xF0,0x90,0xF0,0x6E,0x74,0x20,0xF0,0x90,0xF0,0x6D,0x22,
-
0x90,0xF0,0x6F,0xF0,0x90,0xF0,0x72,0x74,0x20,0xF0,0x90,0xF0,0x71,0x22,0x90,0xF0,
-
0x8D,0xF0,0x90,0xF0,0x90,0x74,0x20,0xF0,0x90,0xF0,0x8F,0x22,0x90,0xF0,0x1C,0xF0,
-
0xE4,0x90,0xF0,0x1B,0xF0,0x90,0xF0,0x1E,0x22,0xF0,0x90,0xF0,0x74,0x74,0x20,0xF0,
-
0x90,0xF0,0x73,0x22,0xAD,0x07,0x2D,0xF5,0x82,0xE4,0x22,0xE4,0x90,0x88,0xB0,0xF0,
-
0x90,0x13,0xB3,0xF0,0x90,0x13,0xB3,0xE0,0xFF,0xC3,0x94,0x50,0x50,0x10,0x74,0x60,
-
0x2F,0x12,0x1A,0x17,0xE4,0xF0,0x90,0x13,0xB3,0xE0,0x04,0xF0,0x80,0xE6,0xD2,0xB3,
-
0x30,0xB3,0x05,0x75,0x9E,0x55,0x80,0xF8,0xC2,0xDB,0xC2,0x11,0xE4,0x90,0x13,0xB3,
-
0xF0,0x90,0xF2,0xA8,0xE0,0xFF,0x90,0x13,0xB3,0xE0,0xFE,0xC3,0x9F,0x40,0x03,0x02,
-
0x42,0xF8,0x74,0x00,0x2E,0x12,0x16,0x1B,0xB5,0x06,0x06,0x90,0x88,0xB0,0xE0,0x04,
-
0xF0,0x12,0x18,0x24,0x24,0x02,0xF5,0x82,0xE5,0xF0,0x34,0x18,0xF5,0x83,0xE0,0x90,
-
0x88,0xC3,0x12,0x1B,0x7B,0x24,0x01,0xF5,0x82,0xE5,0xF0,0x34,0x18,0xF5,0x83,0xE0,
-
0x90,0x88,0xC4,0x12,0x18,0x23,0x24,0x00,0xF5,0x82,0xE5,0xF0,0x34,0x18,0xF5,0x83,
-
0xE0,0x90,0x88,0xC5,0x12,0x1B,0x7B,0x24,0x02,0xF5,0x82,0xE5,0xF0,0x34,0x30,0xF5,
-
0x83,0xE0,0x90,0x88,0xC7,0x12,0x18,0x23,0x24,0x01,0xF5,0x82,0xE5,0xF0,0x34,0x30,
-
0xF5,0x83,0xE0,0x90,0x88,0xC8,0x12,0x1B,0x7B,0x24,0x00,0xF5,0x82,0xE5,0xF0,0x34,
-
0x30,0xF5,0x83,0xE0,0x90,0x88,0xC9,0x12,0x18,0x23,0x24,0x52,0xF5,0x82,0xE5,0xF0,
-
0x34,0x82,0xF5,0x83,0xE0,0x90,0x88,0xCE,0x12,0x1B,0x7B,0x24,0x51,0xF5,0x82,0xE5,
-
0xF0,0x34,0x82,0xF5,0x83,0xE0,0x90,0x88,0xCF,0x12,0x18,0x23,0x24,0x50,0xF5,0x82,
-
0xE5,0xF0,0x34,0x82,0xF5,0x83,0xE0,0x90,0x88,0xD0,0xF0,0x74,0x00,0x2F,0x12,0x16,
-
0x1B,0x12,0x1A,0x15,0xE0,0x90,0x13,0xB3,0x70,0x4C,0xE0,0xFB,0x12,0x16,0x19,0x12,
-
0x1A,0x15,0x74,0x01,0xF0,0x90,0x88,0xC2,0x12,0x14,0xB4,0x74,0x00,0x2B,0x12,0x16,
-
0x1B,0x12,0x1B,0x16,0x12,0x3D,0x5C,0x90,0x88,0xC6,0x12,0x14,0xB4,0x90,0x13,0xB3,
-
0xE0,0xFB,0x12,0x16,0x19,0x12,0x1B,0x25,0x12,0x3D,0x5C,0x90,0x88,0xCD,0x12,0x14,
-
0xB4,0x74,0x00,0x2B,0x12,0x16,0x1B,0x12,0x18,0x44,0x12,0x15,0xEB,0x12,0x19,0x90,
-
0x12,0x13,0xD1,0x02,0x42,0xEF,0x12,0x16,0x18,0x12,0x1B,0x16,0xC0,0x83,0xC0,0x82,
-
0x12,0x14,0xB4,0x90,0x88,0xC2,0x12,0x18,0x0B,0xD0,0x82,0xD0,0x83,0x12,0x3D,0x5C,
-
0x12,0x16,0x15,0x12,0x1B,0x25,0xC0,0x83,0xC0,0x82,0x12,0x14,0xB4,0x90,0x88,0xC6,
-
0x12,0x18,0x0B,0xD0,0x82,0xD0,0x83,0x12,0x3D,0x5C,0x12,0x16,0x15,0x12,0x18,0x44,
-
0xC0,0x83,0xC0,0x82,0x12,0x14,0xB4,0x90,0x88,0xCD,0x12,0x18,0x0B,0xD0,0x82,0xD0,
-
0x83,0x12,0x15,0xEB,0x12,0x19,0x90,0xF5,0x83,0xEE,0x8F,0xF0,0x12,0x3C,0xD3,0x90,
-
0x13,0xB3,0xE0,0x04,0xF0,0x02,0x41,0x81,0x22,0xE4,0x90,0x13,0xB4,0xF0,0x90,0x13,
-
0xB3,0xF0,0x90,0xF2,0xA8,0xE0,0xFF,0x90,0x13,0xB3,0xE0,0xFE,0xC3,0x9F,0x40,0x03,
-
0x02,0x44,0x78,0x74,0x60,0x2E,0x12,0x1A,0x17,0xE0,0x64,0x01,0x60,0x03,0x02,0x44,
-
0x5D,0xEE,0x12,0x19,0x90,0x12,0x15,0x6D,0xD3,0x94,0xFF,0xEE,0x94,0x00,0x40,0x0C,
-
0x90,0x13,0xB4,0xE0,0x12,0x18,0xE7,0x74,0xFF,0xF0,0x80,0x16,0x90,0x13,0xB3,0xE0,
-
0x12,0x19,0x90,0xF5,0x83,0xE0,0xA3,0xE0,0xFF,0x90,0x13,0xB4,0xE0,0x12,0x18,0xE7,
-
0xEF,0xF0,0x12,0x18,0x40,0x12,0x14,0xB4,0x78,0x02,0x12,0x3D,0x49,0xE4,0x7B,0xFF,
-
0xFA,0x12,0x18,0xDC,0x50,0x08,0x12,0x1A,0x1F,0x74,0xFF,0xF0,0x80,0x10,0x12,0x18,
-
0x40,0x12,0x14,0xB4,0x78,0x02,0x12,0x3D,0x49,0x12,0x1A,0x1F,0xEF,0xF0,0x85,0x0B,
-
0xAF,0x90,0x13,0xB3,0x12,0x18,0x27,0x24,0x01,0xF5,0x82,0xE5,0xF0,0x34,0x84,0x12,
-
0x1C,0x3C,0x24,0x02,0xF5,0x82,0xE5,0xF0,0x34,0x84,0xF5,0x83,0xE0,0xF5,0xAA,0x90,
-
0x13,0xB3,0x12,0x18,0x27,0x24,0x03,0xF5,0x82,0xE5,0xF0,0x34,0x84,0xF5,0x83,0xE0,
-
0xF5,0xAB,0x75,0xF0,0x04,0xEF,0xA4,0x24,0x81,0xF5,0x82,0xE5,0xF0,0x34,0x86,0xF5,
-
0x83,0xE0,0xF5,0xA2,0x90,0x13,0xB3,0x12,0x18,0x27,0x24,0x82,0xF5,0x82,0xE5,0xF0,
-
0x34,0x86,0xF5,0x83,0xE0,0xF5,0xA3,0x75,0xF0,0x04,0xEF,0xA4,0x24,0x83,0xF5,0x82,
-
0xE5,0xF0,0x34,0x86,0xF5,0x83,0xE0,0xF5,0xA4,0xD2,0xB0,0x85,0x0C,0xAF,0x90,0x13,
-
0xB3,0x12,0x18,0x27,0x24,0x41,0xF5,0x82,0xE5,0xF0,0x34,0x85,0x12,0x1C,0x3C,0x24,
-
0x42,0xF5,0x82,0xE5,0xF0,0x34,0x85,0xF5,0x83,0xE0,0xF5,0xAA,0x90,0x13,0xB3,0xE0,
-
0x75,0xF0,0x04,0xA4,0x24,0x43,0xF5,0x82,0xE5,0xF0,0x34,0x85,0xF5,0x83,0xE0,0xF5,
-
0xAB,0x20,0xB0,0x06,0x30,0x11,0x03,0x20,0xDA,0x05,0x75,0x9E,0x55,0x80,0xF2,0x12,
-
0x18,0x53,0x12,0x1B,0x34,0x12,0x13,0xF7,0x12,0x13,0xD1,0xD2,0xB0,0x20,0xB0,0x06,
-
0x30,0x11,0x03,0x20,0xDA,0x05,0x75,0x9E,0x55,0x80,0xF2,0x12,0x18,0x53,0x12,0x1B,
-
0x34,0x12,0x15,0xC6,0x12,0x13,0xD1,0x90,0x13,0xB4,0xE0,0x04,0xF0,0x90,0x13,0xB4,
-
0xE0,0xFF,0x65,0x08,0x60,0x12,0x90,0x88,0xB0,0xE0,0xFE,0xEF,0x6E,0x60,0x09,0x90,
-
0x13,0xB3,0xE0,0x04,0xF0,0x02,0x43,0x02,0x90,0x13,0xB4,0xE0,0x90,0x88,0xB0,0xF0,
-
0x22,0xE4,0xFB,0xEB,0xC3,0x95,0x0D,0x40,0x03,0x02,0x45,0xF1,0x74,0xE5,0x2B,0x12,
-
0x14,0x97,0xE0,0x70,0x03,0x02,0x45,0xED,0x12,0x14,0xFB,0x12,0x15,0x6D,0xC3,0x94,
-
0x64,0xEE,0x64,0x80,0x94,0x80,0x50,0x39,0x12,0x14,0xFB,0x12,0x15,0x6D,0xFF,0xC3,
-
0x74,0x64,0x9F,0xFF,0xE4,0x12,0x14,0xE4,0x12,0x13,0x68,0x12,0x1A,0xE9,0xEB,0x12,
-
0x14,0x5D,0x12,0x13,0xD1,0xEB,0x12,0x14,0x5D,0x12,0x15,0x6D,0xC3,0xEE,0x64,0x80,
-
0x94,0x80,0x50,0x62,0xEB,0x12,0x14,0x5D,0xF5,0x83,0xE4,0xF0,0xA3,0xF0,0x02,0x45,
-
0x36,0x12,0x1B,0x6D,0x12,0x18,0x39,0x12,0x14,0xFB,0x12,0x13,0x68,0x12,0x19,0x69,
-
0x40,0x36,0x12,0x1B,0x6D,0x12,0x18,0x39,0x12,0x14,0xFB,0x12,0x13,0x68,0xC3,0x9F,
-
0xFF,0xEC,0x12,0x14,0xE4,0x12,0x13,0x68,0x2F,0xFF,0xEC,0x3E,0xFE,0xEB,0x12,0x14,
-
0x5D,0x12,0x13,0xD1,0x12,0x18,0x2E,0xEB,0x12,0x14,0x5D,0x12,0x13,0x68,0x12,0x19,
-
0x69,0x40,0x13,0x12,0x18,0x2E,0x80,0x07,0x12,0x14,0xFB,0x12,0x15,0x6D,0xFF,0xEB,
-
0x12,0x14,0x5D,0x12,0x13,0xD1,0x12,0x15,0x87,0x12,0x15,0x6D,0xC3,0x94,0x64,0xEE,
-
0x64,0x80,0x94,0x80,0x50,0x49,0x12,0x15,0x87,0x12,0x15,0x6D,0xFF,0xC3,0x74,0x64,
-
0x9F,0xFF,0xE4,0x9E,0xFE,0xEF,0x12,0x1A,0xF4,0xEE,0xC4,0x54,0xF0,0x48,0xFE,0x7C,
-
0x00,0x7D,0x20,0x12,0x3C,0x9D,0x12,0x15,0x87,0x12,0x13,0x68,0x12,0x1A,0xE9,0xEB,
-
0x12,0x16,0xC2,0x12,0x13,0xD1,0xEB,0x12,0x15,0x62,0xC3,0xEE,0x64,0x80,0x94,0x80,
-
0x50,0x6B,0xEB,0x12,0x16,0xC2,0xF5,0x83,0xE4,0xF0,0xA3,0xF0,0x02,0x45,0xED,0x12,
-
0x15,0x74,0x12,0x13,0x68,0x12,0x19,0x69,0x40,0x45,0x12,0x15,0x74,0x12,0x13,0x68,
-
0x12,0x1A,0xE9,0x7C,0x00,0x7D,0x12,0x12,0x3C,0x36,0x7D,0x20,0x12,0x3C,0x9D,0x12,
-
0x15,0x87,0x12,0x13,0x68,0x2F,0xFF,0xEC,0x3E,0xFE,0xEB,0x12,0x16,0xC2,0x12,0x13,
-
0xD1,0xAF,0x0C,0x90,0xF1,0x07,0x12,0x18,0x33,0xEB,0x12,0x16,0xC2,0x12,0x13,0x68,
-
0x12,0x19,0x69,0x40,0x18,0xAF,0x0C,0x90,0xF1,0x07,0x12,0x18,0x33,0x80,0x07,0x12,
-
0x15,0x87,0x12,0x15,0x6D,0xFF,0xEB,0x12,0x16,0xC2,0x12,0x13,0xD1,0x0B,0x02,0x44,
-
0x83,0x22,0xE4,0xF5,0x99,0x75,0x96,0x03,0x75,0x9E,0x55,0xC2,0x04,0xC2,0x0B,0xC2,
-
0x0C,0xC2,0x11,0xC2,0x18,0xC2,0x07,0xC2,0x08,0x90,0x12,0x83,0x12,0x3F,0x30,0x90,
-
0x12,0x79,0x12,0x3F,0x30,0x90,0x13,0x83,0x12,0x3F,0x30,0xA3,0x12,0x3F,0x30,0x90,
-
0x13,0x98,0x12,0x3F,0x30,0xD2,0xB1,0xC2,0xB6,0xC2,0xB7,0x75,0xA0,0x02,0xF5,0xAE,
-
0x90,0xF0,0xC4,0xF0,0x90,0x8F,0xF0,0xF0,0xFF,0xFE,0x74,0xE5,0x12,0x41,0x44,0x34,
-
0x88,0xF5,0x83,0xE4,0xF0,0x74,0xA0,0x2D,0xF5,0x82,0xE4,0x34,0x37,0xF5,0x83,0xE4,
-
0xF0,0x0F,0xBF,0x00,0x01,0x0E,0xEF,0x64,0x14,0x4E,0x70,0xDE,0xE4,0x90,0x88,0xC0,
-
0xF0,0x90,0x88,0xC1,0xF0,0xF5,0xDC,0xF5,0xDD,0xF5,0xDE,0xF5,0xD9,0xF5,0xDA,0xF5,
-
0xDB,0x90,0x88,0xC2,0xF0,0x90,0x88,0xC6,0xF0,0x90,0x88,0xCD,0xF0,0xC2,0x0E,0xC2,
-
0x0D,0xC2,0x17,0x75,0x8A,0x8F,0xF5,0x8B,0x90,0x8F,0xFF,0xF0,0xC2,0x05,0xC2,0x19,
-
0x75,0x08,0x0A,0x75,0x0D,0x0A,0x90,0x8B,0x7C,0x74,0x0A,0xF0,0x90,0x8B,0x7D,0x74,
-
0x01,0xF0,0x90,0x8B,0x7E,0x74,0x05,0xF0,0x75,0x0B,0x40,0x75,0x0C,0x40,0x90,0x8B,
-
0x78,0x74,0x08,0xF0,0xA3,0xE4,0xF0,0x90,0x8B,0x7A,0x74,0x06,0xF0,0xA3,0xE4,0xF0,
-
0x90,0x3F,0xFE,0xF0,0xC2,0x13,0x90,0x12,0xC0,0xF0,0x90,0x12,0x58,0xF0,0x90,0x12,
-
0x59,0xF0,0x90,0x12,0x63,0xF0,0xA3,0x74,0x03,0xF0,0xC2,0x0F,0xC2,0x03,0xE4,0x90,
-
0x12,0x94,0xF0,0xA3,0xF0,0x90,0x12,0x76,0xF0,0x90,0x8F,0xFE,0xF0,0xFE,0xFF,0x75,
-
0x9E,0x55,0x74,0x00,0x12,0x41,0x44,0x34,0x8F,0xF5,0x83,0xE4,0xF0,0x74,0x78,0x2D,
-
0xF5,0x82,0xE4,0x34,0x8F,0xF5,0x83,0xE4,0xF0,0x0F,0xBF,0x00,0x01,0x0E,0xEF,0x64,
-
0x3C,0x4E,0x70,0xDB,0xE4,0xFE,0xFF,0xAD,0x07,0x74,0xA2,0x2D,0xF5,0x82,0xE4,0x34,
-
0x13,0xF5,0x83,0xE4,0xF0,0x74,0x65,0x2D,0xF5,0x82,0xE4,0x34,0x12,0xF5,0x83,0xE4,
-
0xF0,0x0F,0xBF,0x00,0x01,0x0E,0xEF,0x64,0x0A,0x4E,0x70,0xDB,0xE4,0x90,0x12,0x72,
-
0xF0,0xA3,0xF0,0x90,0x13,0x81,0xF0,0xA3,0xF0,0x90,0x13,0x97,0xF0,0x90,0x3F,0xFD,
-
0x04,0xF0,0x22,0xAB,0x07,0xC2,0x1B,0xEB,0x25,0xE0,0xFE,0xE4,0x33,0x90,0x13,0xB5,
-
0xF0,0xA3,0xCE,0xF0,0xE4,0xFA,0xEA,0xFF,0x7E,0x00,0x7C,0x00,0x7D,0x28,0x12,0x3C,
-
0x36,0xAC,0x06,0xAD,0x07,0xEB,0x25,0xE0,0xFF,0xE4,0x33,0xFE,0xED,0x2F,0xFF,0xEC,
-
0x3E,0x90,0x13,0xB5,0xF0,0xA3,0xEF,0xF0,0x90,0x13,0xB5,0xE0,0xFC,0xA3,0xE0,0xFD,
-
0x24,0x01,0xF5,0x82,0x74,0x20,0x3C,0xF5,0x83,0xE0,0xFE,0x74,0x00,0x2D,0xF5,0x82,
-
0x74,0x20,0x3C,0xF5,0x83,0xE0,0xFD,0xED,0xFF,0x90,0x13,0xB3,0xEE,0xF0,0xA3,0xEF,
-
0xF0,0xA3,0xA3,0xE0,0xFD,0x24,0x01,0xF5,0x82,0x74,0x00,0x3C,0xF5,0x83,0xE0,0xFE,
-
0x74,0x00,0x2D,0xF5,0x82,0x74,0x00,0x3C,0xF5,0x83,0xE0,0xFD,0xED,0xFF,0x90,0x13,
-
0xB4,0xE0,0x24,0x58,0xFD,0x90,0x13,0xB3,0xE0,0x34,0x02,0xFC,0xD3,0xEF,0x9D,0xEE,
-
0x9C,0x40,0x0E,0x90,0x12,0x73,0xE0,0x04,0xF0,0x70,0x06,0x90,0x12,0x72,0xE0,0x04,
-
0xF0,0xEF,0x24,0x58,0xFF,0xEE,0x34,0x02,0xFE,0xD3,0x90,0x13,0xB4,0xE0,0x9F,0x90,
-
0x13,0xB3,0xE0,0x9E,0x40,0x0E,0x90,0x13,0x82,0xE0,0x04,0xF0,0x70,0x06,0x90,0x13,
-
0x81,0xE0,0x04,0xF0,0x0A,0xEA,0x64,0x1E,0x60,0x03,0x02,0x47,0x66,0x90,0x13,0x97,
-
0xE0,0x04,0xF0,0xE0,0x64,0x14,0x70,0x37,0xF0,0x90,0x13,0x81,0xE0,0xFE,0xA3,0xE0,
-
0xFF,0xD3,0x90,0x12,0x73,0xE0,0x9F,0x90,0x12,0x72,0xE0,0x9E,0x40,0x02,0xD2,0x1B,
-
0x30,0x1B,0x1C,0xC2,0x1B,0xE4,0x90,0x12,0x72,0xF0,0xA3,0xF0,0x90,0x13,0x81,0xF0,
-
0xA3,0xF0,0x90,0xF1,0x04,0x74,0x1E,0xF0,0x90,0xF0,0xC5,0xE0,0x44,0x01,0xF0,0x22,
-
0xE5,0xC0,0x54,0x02,0x70,0x03,0x02,0x35,0xD8,0xE5,0xC0,0x54,0x02,0x60,0x13,0x90,
-
0x00,0x00,0x7F,0x00,0x7E,0x90,0xE4,0x74,0xFF,0xF0,0xA3,0x75,0x9E,0x55,0xDF,0xF9,
-
0xDE,0xF7,0x02,0x35,0xD8,0xC2,0xD3,0xC2,0xD4,0x75,0x9E,0x55,0x12,0x49,0x31,0x12,
-
0x49,0x31,0x78,0x01,0x74,0x55,0xF6,0x64,0xFF,0x08,0xB8,0x60,0xF9,0x78,0x80,0x74,
-
0x55,0xF6,0x64,0xFF,0x08,0xB8,0x00,0xF9,0x75,0x9E,0x55,0x12,0x49,0x31,0x12,0x49,
-
0x31,0x78,0x01,0x74,0x55,0xC0,0xE0,0x66,0x70,0x22,0xD0,0xE0,0x63,0xE0,0xFF,0x08,
-
0xB8,0x60,0xF2,0x78,0x80,0x74,0x55,0xC0,0xE0,0x66,0x70,0x10,0xD0,0xE0,0x63,0xE0,
-
0xFF,0x08,0xB8,0x00,0xF2,0x90,0x00,0x00,0x74,0x01,0xF0,0x22,0x90,0x00,0x00,0x74,
-
0x00,0xF0,0xA3,0x90,0x00,0x01,0xE8,0xF0,0xD0,0xE0,0x22,0x78,0x60,0x74,0x55,0xF6,
-
0x64,0xFF,0x08,0xB8,0x81,0xF9,0x75,0x9E,0x55,0x12,0x49,0x31,0x12,0x49,0x31,0x78,
-
0x60,0x74,0x55,0xC0,0xE0,0x66,0x70,0x11,0xD0,0xE0,0x63,0xE0,0xFF,0x08,0xB8,0x81,
-
0xF2,0x90,0x00,0x00,0xE0,0x44,0x02,0xF0,0x22,0x90,0x00,0x00,0xE0,0x44,0x00,0xF0,
-
0x90,0x00,0x02,0xE8,0xF0,0xD0,0xE0,0x22,0xC0,0xE0,0xC0,0xD0,0xD0,0xD0,0xD0,0xE0,
-
0x32,0x78,0x00,0xD8,0xFE,0x22,0x78,0x96,0x79,0xFA,0xD9,0xFE,0xD8,0xFA,0x22,0x78,
-
0x02,0x79,0xFA,0x7A,0xFA,0xDA,0xFE,0xD9,0xFA,0xD8,0xF6,0x22,0x00,0x00,0xE4,0x90,
-
0x13,0xB7,0xF0,0xA3,0xF0,0x90,0x13,0xB3,0xF0,0xA3,0xF0,0xB2,0x86,0xB2,0x86,0xFD,
-
0xFC,0xB2,0x85,0x75,0x9E,0x55,0xED,0xAE,0x04,0x78,0x07,0xC3,0x33,0xCE,0x33,0xCE,
-
0xD8,0xF9,0xFF,0x90,0x13,0xB3,0xEE,0xF0,0xA3,0xEF,0xF0,0xE4,0x90,0x13,0xB9,0xF0,
-
0xA3,0xF0,0x90,0x13,0xB3,0xE0,0xFA,0xA3,0xE0,0xFB,0xEA,0xA3,0xF0,0xEB,0xA3,0xF0,
-
0xE4,0xF9,0xFB,0xFA,0x90,0x13,0xB3,0xE0,0xFE,0xA3,0xE0,0xFF,0x12,0x4E,0xA5,0xEF,
-
0x29,0xF9,0x90,0x13,0xB4,0xE0,0x04,0xF0,0x70,0x06,0x90,0x13,0xB3,0xE0,0x04,0xF0,
-
0x0B,0xBB,0x00,0x01,0x0A,0xEB,0x64,0x08,0x4A,0x70,0xD9,0x90,0x13,0xB5,0xE0,0x29,
-
0xFF,0xA3,0xE0,0x2F,0x24,0x08,0xF4,0x04,0xF9,0xFF,0x90,0x13,0xB8,0xE0,0x2F,0xF0,
-
0x90,0x13,0xB7,0xE0,0x34,0x00,0xF0,0x90,0x13,0xBA,0xE0,0x04,0xF0,0x70,0x06,0x90,
-
0x13,0xB9,0xE0,0x04,0xF0,0xC3,0x90,0x13,0xBA,0xE0,0x94,0x10,0x90,0x13,0xB9,0xE0,
-
0x64,0x80,0x94,0x80,0x40,0x8C,0x0D,0xBD,0x00,0x01,0x0C,0xED,0x70,0x03,0xEC,0x64,
-
0x01,0x60,0x03,0x02,0x49,0x61,0x90,0x13,0xB7,0xE0,0xFC,0xA3,0xE0,0xFD,0xEC,0x90,
-
0x8E,0x0E,0xF0,0xED,0x90,0x8E,0x0F,0xF0,0x90,0x8E,0x0D,0x74,0xAA,0xF0,0xB2,0x86,
-
0xB2,0x86,0x75,0x9E,0x55,0x80,0xFB,0x90,0x12,0x71,0xE0,0x25,0xE0,0x24,0xC2,0xF5,
-
0x82,0xE4,0x34,0x12,0xF5,0x83,0xE0,0x75,0xF0,0x02,0xA4,0xFF,0xAE,0xF0,0x90,0x12,
-
0x77,0xEE,0xF0,0xA3,0xEF,0xF0,0x24,0x01,0xF9,0x74,0xF0,0x3E,0xFA,0x90,0x12,0x5C,
-
0x74,0x01,0xF0,0xA3,0xEA,0xF0,0xA3,0xE9,0xF0,0x90,0x12,0x5C,0xE0,0xFB,0xA3,0xE0,
-
0xFA,0xA3,0xE0,0xF9,0xE4,0x12,0x3C,0x24,0x90,0x12,0x5D,0x75,0xF0,0x01,0x12,0x3C,
-
0xD3,0x90,0x12,0x5C,0xE0,0xFB,0xA3,0xE0,0xFA,0xA3,0xE0,0xF9,0x22,0xEF,0x25,0xE0,
-
0x24,0xC1,0xF5,0x82,0xE4,0x34,0x12,0xF5,0x83,0x22,0xF0,0xEF,0x25,0xE0,0x24,0xC2,
-
0xF5,0x82,0xE4,0x34,0x12,0xF5,0x83,0xEE,0xF0,0x22,0x74,0x40,0x2E,0xF5,0x82,0xE4,
-
0x34,0x19,0xF5,0x83,0xE0,0x22,0x90,0x12,0x5B,0xE0,0x25,0xE0,0x24,0xA0,0xF5,0x82,
-
0xE4,0x34,0x19,0xF5,0x83,0x22,0x74,0x10,0x12,0x3C,0x24,0x90,0x12,0x71,0xE0,0x25,
-
0xE0,0x22,0xF0,0x12,0x4E,0xAD,0x90,0xF0,0xC4,0x74,0x01,0xF0,0x22,0x24,0xC3,0xF5,
-
0x82,0xE4,0x34,0x12,0xF5,0x83,0xE0,0x22,0xE4,0xFE,0x30,0x18,0x07,0x90,0x88,0xB0,
-
0xE0,0xFF,0x80,0x02,0xE4,0xFF,0xE4,0xFD,0xED,0xC3,0x9F,0x50,0x4E,0xED,0x12,0x13,
-
0xF7,0x12,0x1B,0x82,0xFB,0xED,0x12,0x14,0xFC,0xF5,0x83,0xEA,0xF0,0xA3,0xEB,0xF0,
-
0xED,0x12,0x15,0xC6,0x12,0x1B,0x82,0xFB,0xED,0x12,0x15,0x88,0xF5,0x83,0xEA,0xF0,
-
0xA3,0xEB,0xF0,0x12,0x14,0x94,0xE0,0x70,0x02,0x80,0x16,0x12,0x14,0x94,0xE0,0xB4,
-
0x01,0x08,0x12,0x14,0x94,0x74,0x02,0xF0,0x80,0x0D,0x12,0x14,0x94,0xE0,0xB4,0x03,
-
0x06,0x12,0x14,0x94,0x74,0x01,0xF0,0x0D,0x02,0x4A,0xE8,0xE4,0xFE,0xAD,0x07,0xED,
-
0xC3,0x95,0x0D,0x50,0x19,0x12,0x14,0x94,0xE0,0x64,0x01,0x60,0x07,0x12,0x14,0x94,
-
0xE0,0xB4,0x02,0x07,0x12,0x14,0x94,0x74,0x03,0xF0,0x0E,0x0D,0x80,0xE1,0xEF,0x2E,
-
0xFD,0xED,0xC3,0x95,0x0D,0x50,0x16,0xED,0x12,0x14,0xFC,0x12,0x1C,0xA3,0xED,0x12,
-
0x15,0x88,0x12,0x1C,0xA3,0x12,0x14,0x94,0xE4,0xF0,0x0D,0x80,0xE4,0x22,0x90,0x12,
-
0x5B,0xE0,0xFF,0x24,0x40,0x12,0x4A,0x9D,0x64,0x01,0x60,0x0A,0x74,0x40,0x2F,0x12,
-
0x4A,0x9D,0x64,0x03,0x70,0x74,0x90,0x12,0x71,0xE0,0xFF,0x12,0x4A,0x7E,0xE0,0xFE,
-
0xB4,0x01,0x0A,0xEF,0x25,0xE0,0x12,0x4A,0xCD,0x64,0x01,0x60,0x0F,0xEE,0x64,0x03,
-
0x70,0x19,0x12,0x4A,0xBB,0x12,0x4A,0xCD,0x64,0x03,0x70,0x0F,0x12,0x4A,0x27,0x12,
-
0x4A,0xB6,0x24,0xC4,0xF5,0x82,0xE4,0x34,0x12,0x80,0x0D,0x12,0x4A,0x27,0x12,0x4A,
-
0xB6,0x24,0xC0,0xF5,0x82,0xE4,0x34,0x12,0x12,0x4A,0x34,0x74,0x20,0x12,0x3C,0x24,
-
0x90,0x12,0x71,0xE0,0x04,0x12,0x4A,0xC2,0x20,0x0C,0x05,0x75,0x9E,0x55,0x80,0xF8,
-
0x90,0x00,0x01,0xE0,0xFE,0x90,0x00,0x00,0xE0,0x7C,0x00,0x24,0x00,0xFF,0xEC,0x3E,
-
0xFE,0x12,0x4A,0xA6,0xEE,0xF0,0xA3,0xEF,0xF0,0x22,0x12,0x4A,0xA6,0xE4,0xF0,0xA3,
-
0x74,0x08,0x12,0x4A,0xC2,0x20,0x0C,0x05,0x75,0x9E,0x55,0x80,0xF8,0x22,0xE4,0x90,
-
0xF0,0xC4,0xF0,0x75,0x9E,0x55,0x90,0xF1,0x47,0xE0,0xFE,0x90,0xF1,0x48,0xE0,0x7C,
-
0x00,0x24,0x00,0xFD,0xEC,0x3E,0xFC,0x90,0xF1,0x49,0xE0,0x7F,0x00,0xFE,0xEF,0x2D,
-
0xFF,0xEC,0x3E,0xFE,0x90,0xF1,0x4A,0xE0,0x7C,0x00,0x2F,0xFF,0xEC,0x3E,0xFE,0x90,
-
0xF1,0x40,0x74,0xE3,0xF0,0xE4,0x90,0xF1,0x41,0xF0,0x12,0x4E,0x50,0x75,0x9E,0x55,
-
0x90,0xF1,0x41,0x74,0x40,0xF0,0x7F,0x05,0x7E,0x00,0x12,0x4E,0x0A,0x7F,0x05,0x7E,
-
0x00,0x12,0x4E,0x0A,0x75,0x9E,0x55,0xE4,0x90,0xF1,0x41,0xF0,0x90,0xF1,0x40,0xF0,
-
0x7F,0x02,0xFE,0x12,0x4E,0x0A,0x7F,0x02,0x7E,0x00,0x12,0x4E,0x0A,0x75,0x9E,0x55,
-
0x22,0x75,0x9E,0x55,0x74,0x03,0x12,0x4C,0xCF,0x74,0x01,0x12,0x4C,0xB9,0x74,0x13,
-
0x12,0x4C,0xB9,0x74,0x1F,0x12,0x4C,0xE5,0x75,0x9E,0x55,0x74,0x3F,0x12,0x4C,0xE5,
-
0x75,0x9E,0x55,0x74,0x83,0x12,0x4C,0xCF,0x22,0x90,0xF1,0x41,0xF0,0x7F,0x05,0x7E,
-
0x00,0x12,0x4E,0x0A,0x7F,0x05,0x7E,0x00,0x12,0x4E,0x0A,0x75,0x9E,0x55,0x22,0x90,
-
0xF1,0x40,0xF0,0x7F,0x01,0x7E,0x00,0x12,0x4E,0x0A,0x7F,0x01,0x7E,0x00,0x12,0x4E,
-
0x0A,0x75,0x9E,0x55,0x22,0x90,0xF1,0x41,0xF0,0x7F,0x05,0x7E,0x00,0x12,0x4E,0x0A,
-
0x7F,0x05,0x7E,0x00,0x12,0x4E,0x0A,0x22,0xE5,0xC0,0x30,0xE3,0x11,0xE4,0x90,0xF0,
-
0xC4,0xF0,0x12,0x4C,0x1E,0x7F,0x32,0x7E,0x00,0x12,0x4E,0x0A,0x80,0x29,0xE5,0xC0,
-
0x30,0xE2,0x07,0x12,0x4D,0x4A,0xD2,0xAF,0x80,0x2C,0xE5,0xC0,0x30,0xE0,0x13,0x90,
-
0xF1,0x42,0xE0,0x54,0xEF,0xF0,0x7F,0x02,0x7E,0x00,0x12,0x4E,0x0A,0x12,0x4D,0x4A,
-
0x80,0x14,0xE5,0xC0,0x30,0xE1,0x0F,0x12,0x4E,0x9C,0x12,0x4C,0x91,0x12,0x45,0xF2,
-
0x12,0x00,0x36,0x12,0x26,0x7B,0xE4,0xF5,0xC0,0x22,0x12,0x4C,0x91,0x90,0xF0,0xC4,
-
0x74,0x01,0xF0,0x22,0xF5,0x83,0xE0,0xFE,0x74,0x00,0x2F,0xF5,0x82,0xE4,0x34,0x8B,
-
0xF5,0x83,0xEE,0xF0,0x90,0x13,0xAD,0xE0,0x04,0xF0,0xE0,0x22,0x90,0x8F,0xF0,0xE0,
-
0xD3,0x94,0x00,0x22,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0x22,0xE4,0x90,0x12,0x5B,
-
0xF0,0x90,0x12,0x71,0xF0,0x22,0x30,0x98,0x04,0xD2,0x07,0xC2,0x98,0x30,0x99,0x23,
-
0xD2,0x08,0xC2,0x99,0x30,0x0D,0x18,0xB2,0x17,0x30,0x17,0x08,0x75,0x8A,0x8F,0x75,
-
0x8B,0x00,0x80,0x06,0x75,0x8A,0x8F,0x75,0x8B,0x78,0xC2,0x0D,0xD2,0x09,0x32,0xC2,
-
0x0E,0xC2,0x09,0x32,0xAB,0x07,0xAA,0x06,0xE4,0xF5,0xAE,0x75,0xAF,0x01,0x12,0x1C,
-
0x30,0xEA,0xF5,0xA3,0xEB,0xF5,0xA4,0xD2,0xB0,0x20,0xB0,0x06,0x30,0x11,0x03,0x20,
-
0xDA,0x05,0x75,0x9E,0x55,0x80,0xF2,0x12,0x18,0x53,0xFF,0xEC,0x3E,0xFE,0x22,0xAB,
-
0x07,0xAA,0x06,0xEA,0xF5,0xAE,0xEB,0xF5,0xAF,0xE4,0x12,0x1C,0x30,0xF5,0xA3,0x75,
-
0xA4,0x01,0xD2,0xB0,0x20,0xB0,0x06,0x30,0x11,0x03,0x20,0xDA,0x05,0x75,0x9E,0x55,
-
0x80,0xF2,0x12,0x18,0x53,0xFF,0xEC,0x3E,0xFE,0x22,0xE4,0xFD,0xFC,0xC3,0xED,0x9F,
-
0xEC,0x9E,0x50,0x18,0xE4,0xFB,0xFA,0x75,0x9E,0x55,0x0B,0xBB,0x00,0x01,0x0A,0xBA,
-
0x03,0xF5,0xBB,0x20,0xF2,0x0D,0xBD,0x00,0x01,0x0C,0x80,0xE1,0x22,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x1E,0x00,0x1E,
-
0x00,0x1E,0x00,0x1E,0x00,0x1E,0x00,0x1E,0x00,0x1E,0x00,0x1E,0x00,0x1E,0x00,0x1E,
-
0xE4,0xFD,0xFC,0xC3,0xED,0x9F,0xEC,0x9E,0x50,0x08,0x00,0x0D,0xBD,0x00,0x01,0x0C,
-
0x80,0xF1,0x22,0xEF,0x1F,0x70,0x01,0x1E,0x75,0x9E,0x55,0xD3,0xEF,0x94,0x00,0xEE,
-
0x94,0x00,0x50,0xEF,0x22,0xC0,0xE0,0xD2,0x0B,0x05,0x0F,0xE5,0x0F,0x70,0x02,0x05,
-
0x0E,0xD0,0xE0,0x32,0x90,0xF0,0xC5,0x74,0x06,0xF0,0x30,0xF8,0x02,0xD2,0x18,0x22,
-
0xEE,0x30,0xE7,0x07,0xC3,0xE4,0x9F,0xFF,0xE4,0x9E,0xFE,0x22,0x75,0x91,0x01,0x75,
-
0x89,0x01,0xD2,0xAC,0x22,0x8F,0x82,0x8E,0x83,0xE4,0x93,0xFF,0x22,0xD2,0xD8,0x22,
-
0xD2,0x11,0x32,0x32,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x90,0x3F,0xFF,0x74,0x01,0xF0,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
\ No newline at end of file
diff --git a/drivers/input/touchscreen/vtl_ts/wgj36js07_A1_CT363_V01_0187_140306.dat b/drivers/input/touchscreen/vtl_ts/wgj36js07_A1_CT363_V01_0187_140306.dat
deleted file mode 100755
index a488e98122a6..000000000000
--- a/drivers/input/touchscreen/vtl_ts/wgj36js07_A1_CT363_V01_0187_140306.dat
+++ /dev/null
@@ -1,2048 +0,0 @@
-0x02,0x4D,0xAB,0x02,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x02,0x53,0x85,0x00,0x00,
-
0x00,0x00,0x00,0x02,0x3D,0xFE,0x00,0x00,0x00,0x00,0x00,0x02,0x3D,0xFF,0x00,0x00,
-
0x00,0x00,0x00,0x02,0x52,0xA3,0x00,0x00,0x00,0x00,0x00,0x02,0x53,0x4A,0x00,0x00,
-
0x00,0x00,0x00,0x02,0x53,0xB7,0x75,0x86,0x09,0x75,0x84,0x9C,0xD2,0xA9,0x22,0x32,
-
0x90,0x3F,0xF0,0x74,0x56,0xF0,0xA3,0x74,0x54,0xF0,0xA3,0x74,0x4C,0xF0,0x22,0x78,
-
0xBD,0x7C,0x13,0x7A,0x41,0x79,0x88,0x7F,0x05,0x12,0x27,0x10,0x90,0x13,0xCB,0x12,
-
0x43,0xE5,0xFF,0xFF,0xFF,0xFF,0x90,0x13,0xCF,0x12,0x43,0xE5,0x00,0x00,0x00,0x00,
-
0x78,0xE3,0x7C,0x13,0x7A,0x41,0x79,0x8D,0x7F,0x0A,0x12,0x27,0x10,0x78,0xED,0x7C,
-
0x13,0x7D,0x01,0x7B,0xFF,0x7A,0x41,0x79,0x97,0x7E,0x00,0x7F,0x14,0x12,0x42,0x7B,
-
0xC2,0x1D,0xE4,0x90,0x12,0x60,0xF0,0x90,0x12,0x96,0xF0,0x90,0x12,0x97,0xF0,0x90,
-
0xEC,0x1D,0x8B,0xFC,0x0F,0xCF,0xE7,0xF9,0x6F,0x77,0x4F,0x1F,0x7F,0xFE,0x1B,0x6F,
-
0x88,0xC1,0xF0,0xE4,0x90,0x13,0xB8,0xF0,0xC2,0x12,0xC2,0x14,0x12,0x27,0x19,0xD3,
-
0x9F,0x40,0x03,0x02,0x02,0x7E,0x90,0x88,0xC0,0xE0,0x9F,0x40,0x03,0x02,0x02,0x7E,
-
0xE4,0xF0,0x75,0x9E,0x55,0x90,0x13,0xB4,0xF0,0x12,0x24,0xF3,0x40,0x03,0x02,0x02,
-
0x50,0x75,0x9E,0x55,0x74,0xE5,0x2F,0x12,0x20,0x7E,0xE0,0x64,0x01,0x60,0x0E,0x12,
-
0x27,0x23,0x12,0x20,0x7E,0xE0,0x64,0x02,0x60,0x03,0x02,0x02,0x42,0x90,0x13,0xB4,
-
0x12,0x29,0x74,0x12,0x27,0x2A,0xEF,0xF0,0x74,0xE5,0x2F,0x12,0x20,0x7E,0x74,0x04,
-
0xF0,0xE4,0x90,0x13,0xB5,0xF0,0x90,0x88,0xC1,0x12,0x28,0xC4,0x9F,0x40,0x03,0x02,
-
0x02,0x3A,0x75,0x9E,0x55,0x90,0x13,0xB4,0xE0,0xFF,0x12,0x23,0x7A,0x12,0x1F,0x1B,
-
0xFD,0xEE,0x12,0x1F,0xDF,0x12,0x28,0x2B,0xC3,0x9D,0xEA,0x9C,0x40,0x11,0xEF,0x12,
-
0x23,0x7A,0x12,0x21,0x7C,0xFF,0x90,0x13,0xB5,0xE0,0x12,0x1F,0xDF,0x80,0x12,0x90,
-
0x13,0xB5,0xE0,0x12,0x1F,0xDF,0x12,0x21,0x7C,0xFF,0x90,0x13,0xB4,0xE0,0x12,0x23,
-
0x7A,0x12,0x1F,0x1B,0xC3,0x9F,0xFF,0xEC,0x9E,0x90,0x13,0xC7,0xF0,0xA3,0xEF,0xF0,
-
0x90,0x13,0xB4,0xE0,0xFF,0x12,0x25,0x2C,0x12,0x1F,0x1B,0xFD,0x90,0x13,0xB5,0xE0,
-
0xFE,0x12,0x21,0xE7,0x12,0x28,0x2B,0xC3,0x9D,0xEA,0x9C,0x40,0x13,0xEF,0x12,0x25,
-
0x2C,0x12,0x1F,0x1B,0xFD,0xEE,0x12,0x21,0x71,0xC3,0x9D,0xFF,0xEE,0x9C,0x80,0x17,
-
0x90,0x13,0xB5,0xE0,0x12,0x21,0x71,0xFF,0x90,0x13,0xB4,0xE0,0x12,0x25,0x2C,0x12,
-
0x1F,0x1B,0xC3,0x9F,0xFF,0xEC,0x9E,0x90,0x13,0xC9,0xF0,0xA3,0xEF,0xF0,0x90,0x13,
-
0xC9,0xE0,0xFE,0xA3,0xE0,0x90,0x13,0xC9,0x12,0x27,0xC8,0xC0,0x04,0xC0,0x05,0xC0,
-
0x06,0xC0,0x07,0x90,0x13,0xC7,0xE0,0xFE,0xA3,0xE0,0x90,0x13,0xC7,0x12,0x27,0xC8,
-
0xD0,0x03,0xD0,0x02,0xD0,0x01,0xD0,0x00,0xEF,0x2B,0xFF,0xEE,0x3A,0xFE,0xED,0x39,
-
0xFD,0xEC,0x38,0xFC,0x90,0x88,0xC0,0xE0,0x12,0x21,0x87,0xC0,0x83,0xC0,0x82,0x90,
-
0x13,0xB5,0xE0,0xD0,0x82,0xD0,0x83,0x75,0xF0,0x04,0x12,0x44,0x16,0x12,0x43,0xD9,
-
0x90,0x88,0xC0,0xE0,0x12,0x21,0x87,0xC0,0x83,0xC0,0x82,0x90,0x13,0xB5,0xE0,0xD0,
-
0x82,0xD0,0x83,0x12,0x20,0x95,0xE4,0x7B,0x32,0xFA,0xF9,0xF8,0xD3,0x12,0x43,0xB5,
-
0x40,0x02,0xD2,0x1D,0x12,0x27,0x34,0x02,0x01,0x16,0x90,0x88,0xC0,0xE0,0x04,0xF0,
-
0x80,0x08,0x12,0x27,0x23,0x12,0x20,0x7E,0xE4,0xF0,0x12,0x26,0x57,0x02,0x00,0xD9,
-
0xE4,0x90,0x13,0xB5,0xF0,0x90,0x13,0xE2,0xE0,0xFF,0x12,0x28,0xC6,0x9F,0x50,0x1E,
-
0x90,0x88,0xC1,0xE0,0xFF,0xEE,0xC3,0x9F,0x74,0xA0,0x50,0x08,0x12,0x26,0xC6,0x74,
-
0x01,0xF0,0x80,0x05,0x12,0x26,0xC6,0xE4,0xF0,0x12,0x27,0x34,0x80,0xD7,0x75,0x9E,
-
0x55,0x12,0x27,0x19,0xD3,0x9F,0x40,0x03,0x02,0x0C,0x4B,0x90,0x88,0xC0,0xE0,0x9F,
-
0x40,0x03,0x02,0x0C,0x4B,0x30,0x1D,0x03,0x02,0x0C,0x4B,0xE0,0x94,0x00,0x50,0x03,
-
0x02,0x0B,0x37,0x90,0x88,0xC1,0xE0,0xD3,0x94,0x00,0x50,0x03,0x02,0x0B,0x37,0xE0,
-
0xFF,0x90,0x88,0xC0,0xE0,0xD3,0x9F,0x40,0x03,0x02,0x06,0xFA,0x90,0x88,0xC0,0x12,
-
0x28,0x32,0x90,0x88,0xC1,0xE0,0xFE,0xEF,0x6E,0x70,0x03,0x02,0x03,0xC7,0x75,0x9E,
-
0x55,0xE4,0x90,0x13,0xB3,0xF0,0x12,0x22,0xB0,0x50,0x09,0x12,0x25,0x47,0xE4,0x12,
-
0x22,0xE5,0x80,0xF2,0xC2,0x1C,0xE4,0x90,0x13,0xB3,0xF0,0x90,0x88,0xC0,0x12,0x22,
-
0xB3,0x50,0x36,0x74,0xBD,0x2E,0x12,0x22,0x9D,0x12,0x27,0x1C,0xFE,0xEF,0xB5,0x06,
-
0x04,0xD2,0x1C,0x80,0x24,0x74,0xC2,0x2F,0x12,0x25,0x4A,0xE0,0x70,0x12,0x90,0x13,
-
0xB3,0xE0,0x12,0x22,0x9B,0xE0,0x24,0xC2,0x12,0x25,0x4A,0x74,0x01,0xF0,0x80,0x04,
-
0xD2,0x1C,0x80,0x05,0x12,0x22,0xE6,0x80,0xC2,0x90,0x13,0xCF,0x12,0x43,0xE5,0x00,
-
0x00,0x00,0x00,0x20,0x1C,0x56,0xE4,0x90,0x13,0xB3,0xF0,0x90,0x88,0xC0,0x12,0x22,
-
0xB3,0x50,0x26,0x12,0x22,0x99,0x12,0x23,0xB2,0xEE,0x12,0x21,0x87,0xC0,0x83,0xC0,
-
0x82,0x90,0x13,0xB3,0xE0,0x12,0x22,0x9B,0xE0,0xD0,0x82,0xD0,0x83,0x12,0x20,0x95,
-
0x12,0x26,0x5E,0x12,0x22,0xE6,0x02,0x03,0x3B,0x12,0x24,0xAF,0xA3,0x12,0x23,0xC3,
-
0xC3,0x12,0x43,0xB5,0x50,0x16,0x90,0x13,0xCF,0x12,0x24,0xB2,0x12,0x28,0xCD,0x90,
-
0x88,0xC0,0x12,0x22,0xB3,0x50,0x05,0x12,0x22,0xCE,0x80,0xF3,0xC2,0x1B,0xE4,0x90,
-
0x13,0xB3,0xF0,0x90,0x88,0xC0,0xE0,0x14,0x12,0x22,0xB4,0x50,0x1B,0x74,0xBD,0x2E,
-
0x12,0x22,0x9D,0x12,0x27,0x1C,0xFE,0xEF,0xB5,0x06,0x08,0x12,0x22,0x96,0x12,0x26,
-
0xCF,0x80,0x05,0x12,0x22,0xE6,0x80,0xDB,0x30,0x1B,0x03,0x02,0x02,0xBC,0x90,0x13,
-
0xBD,0xE0,0x04,0xF0,0x02,0x02,0xBC,0x90,0x88,0xC0,0x12,0x29,0x53,0x12,0x29,0x7B,
-
0xFE,0xC3,0x9F,0x40,0x03,0x02,0x0B,0x37,0xE0,0xFF,0x12,0x27,0x2A,0xE0,0x90,0x13,
-
0xBB,0xF0,0x74,0xD8,0x2F,0x12,0x28,0x0E,0xE0,0x90,0x13,0xBA,0xF0,0xC2,0x12,0xC2,
-
0x14,0xEE,0x12,0x20,0x89,0x7B,0xF4,0x12,0x27,0x3B,0x12,0x21,0x83,0xC0,0x83,0xC0,
-
0x82,0x90,0x13,0xBA,0xE0,0xD0,0x82,0xD0,0x83,0x12,0x25,0xCD,0x40,0x03,0x02,0x06,
-
0xF4,0x12,0x21,0x83,0xC0,0x83,0xC0,0x82,0x90,0x13,0xBA,0xE0,0xD0,0x82,0xD0,0x83,
-
0x12,0x20,0x95,0x12,0x24,0xBE,0x50,0x1A,0x90,0x13,0xBA,0x12,0x1F,0xDD,0x12,0x1F,
-
0x1B,0x12,0x28,0x3F,0x12,0x1E,0xFD,0xFD,0xEE,0x12,0x20,0x04,0x12,0x23,0x93,0x02,
-
0x05,0x3A,0x12,0x21,0x83,0xC0,0x83,0xC0,0x82,0x90,0x13,0xBA,0xE0,0xD0,0x82,0xD0,
-
0x83,0x12,0x20,0x95,0x7B,0xB8,0x7A,0x0B,0x12,0x24,0xC2,0x50,0x56,0x90,0x13,0xBA,
-
0xE0,0xFD,0x12,0x1F,0xDF,0x12,0x22,0x03,0xD5,0x82,0x02,0x15,0x83,0x12,0x25,0x52,
-
0x12,0x20,0x5C,0xED,0x12,0x1F,0xDF,0x12,0x20,0x67,0xEF,0x78,0x02,0xCE,0xC3,0x13,
-
0xCE,0x13,0xD8,0xF9,0xFF,0xEC,0x12,0x1F,0x81,0x12,0x21,0xE2,0x12,0x22,0x03,0xD5,
-
0x82,0x02,0x15,0x83,0x12,0x25,0x52,0x12,0x20,0x04,0x12,0x20,0x67,0xED,0x12,0x21,
-
0xE7,0x12,0x20,0x67,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,0xF9,0xFF,0xEC,
-
0x02,0x05,0x34,0x12,0x21,0x83,0xC0,0x83,0xC0,0x82,0x90,0x13,0xBA,0xE0,0xD0,0x82,
-
0xD0,0x83,0x12,0x20,0x95,0xE4,0x7B,0xDC,0x7A,0x05,0x12,0x24,0xC3,0x50,0x1A,0x12,
-
0x1F,0x49,0x90,0x13,0xBB,0xE0,0xFD,0x12,0x20,0x04,0x12,0x21,0x7C,0xFF,0xEC,0x12,
-
0x21,0xE7,0x12,0x25,0x5D,0xED,0x02,0x05,0x34,0x12,0x21,0xF3,0xD5,0x82,0x02,0x15,
-
0x83,0x12,0x29,0x5E,0x12,0x1F,0xDF,0x12,0x20,0x50,0xEF,0x78,0x02,0xCE,0xC3,0x13,
-
0xCE,0x13,0xD8,0xF9,0x12,0x28,0x46,0x12,0x1F,0x81,0xED,0x12,0x20,0x04,0x12,0x22,
-
0x03,0xD5,0x82,0x02,0x15,0x83,0x15,0x82,0xE0,0x33,0xFE,0xEC,0x12,0x1F,0x10,0x12,
-
0x29,0x69,0x12,0x20,0x04,0x12,0x20,0x67,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,
-
0xD8,0xF9,0xFF,0xED,0x12,0x20,0x04,0x12,0x1F,0x8C,0x90,0x13,0xBB,0xE0,0xFF,0x12,
-
0x20,0xCC,0x12,0x1F,0x1B,0xFD,0xEF,0x12,0x22,0xC2,0x12,0x21,0x7C,0x12,0x28,0x4D,
-
0x12,0x53,0xA0,0x12,0x28,0x03,0x90,0x13,0xBB,0xE0,0xFF,0x12,0x21,0x53,0x12,0x1F,
-
0x1B,0xFD,0xEF,0x12,0x20,0x04,0x12,0x21,0x7C,0x12,0x28,0x4D,0x12,0x53,0xA0,0x12,
-
0x22,0x6C,0x40,0x29,0x12,0x21,0x5F,0xE0,0xD3,0x94,0x04,0x40,0x0A,0x74,0x83,0x2F,
-
0x12,0x21,0x66,0xE0,0x24,0xFC,0xF0,0x12,0x21,0x5F,0xE0,0xC3,0x94,0x01,0x50,0x08,
-
0x74,0x83,0x2F,0x12,0x21,0x66,0xE4,0xF0,0x12,0x25,0x38,0x80,0x3A,0x12,0x21,0x5F,
-
0xE0,0x04,0xF0,0x74,0x83,0x2F,0x12,0x21,0x66,0xE0,0xD3,0x94,0x16,0x40,0x0C,0x90,
-
0x13,0xBB,0xE0,0x12,0x21,0x64,0x12,0x28,0x54,0x80,0x18,0x12,0x28,0xD9,0x50,0x05,
-
0x12,0x29,0x85,0x40,0x06,0x30,0x06,0x03,0x12,0x25,0x38,0x12,0x28,0xE1,0x40,0x03,
-
0x12,0x25,0x38,0xC2,0x12,0xC2,0x14,0x12,0x21,0x5F,0x12,0x27,0x4A,0x40,0x0F,0xD2,
-
0x12,0xD2,0x14,0x74,0x79,0x2F,0x12,0x23,0xAA,0x74,0x01,0xF0,0x80,0x04,0xC2,0x12,
-
0xC2,0x14,0x12,0x23,0xA3,0xE0,0xB4,0x01,0x09,0xEF,0x12,0x20,0x89,0x12,0x28,0xE9,
-
0x80,0x0A,0x90,0x13,0xBB,0xE0,0x12,0x20,0x89,0x12,0x26,0x70,0x90,0x13,0xBB,0xE0,
-
0x12,0x23,0xA8,0xE0,0xB4,0x01,0x13,0xD3,0xEB,0x94,0x06,0xEA,0x94,0x00,0x40,0x06,
-
0xD2,0x12,0xD2,0x14,0x80,0x04,0xC2,0x12,0xC2,0x14,0x90,0x13,0xBB,0xE0,0xFF,0x24,
-
0xE5,0x12,0x20,0x7E,0x12,0x23,0x66,0xE0,0x64,0x01,0x70,0x5B,0x12,0x22,0x0D,0xE0,
-
0xC3,0x9E,0x50,0x1B,0xC2,0x10,0x12,0x21,0x18,0x12,0x24,0x8F,0x50,0x09,0x12,0x22,
-
0x22,0xE0,0x04,0xF0,0x02,0x06,0x99,0x12,0x22,0x22,0xE4,0xF0,0x02,0x06,0x99,0x90,
-
0x13,0xBB,0xE0,0xFF,0x24,0x98,0x12,0x23,0x6C,0xE4,0xF0,0x74,0xA2,0x2F,0x12,0x22,
-
0x24,0xE4,0xF0,0x12,0x24,0x49,0x12,0x21,0x7C,0x12,0x28,0x46,0x12,0x1F,0x81,0x12,
-
0x25,0xF6,0x12,0x21,0x7C,0xFF,0xED,0x12,0x20,0x04,0x12,0x1F,0x8C,0xD2,0x10,0x12,
-
0x20,0x7B,0x74,0x01,0xF0,0x80,0x02,0xD2,0x10,0x30,0x01,0x16,0x90,0x13,0xBA,0x12,
-
0x1F,0xDD,0x12,0x1F,0x1B,0x12,0x28,0x3F,0x12,0x20,0xCC,0x12,0x1F,0x08,0xFD,0xEE,
-
0x80,0x27,0x30,0x12,0x2A,0x30,0x14,0x27,0x30,0x10,0x24,0x12,0x25,0x9D,0x40,0x03,
-
0x12,0x29,0x8C,0x12,0x25,0xAB,0x40,0x03,0x12,0x29,0x93,0x12,0x22,0xBD,0x12,0x1F,
-
0x1B,0x12,0x1F,0xEB,0x12,0x1F,0x1B,0xFD,0xEF,0x12,0x21,0x53,0x12,0x23,0x93,0x90,
-
0x13,0xBA,0x12,0x1F,0xDD,0x12,0x1F,0x1B,0x12,0x23,0x74,0x12,0x1F,0x08,0x12,0x20,
-
0xD8,0x12,0x23,0x18,0x12,0x22,0xE6,0x02,0x03,0xCD,0x90,0x88,0xC1,0x12,0x28,0x32,
-
0x90,0x88,0xC0,0xE0,0xFE,0xEF,0x6E,0x70,0x03,0x02,0x08,0x00,0x75,0x9E,0x55,0xE4,
-
0x90,0x13,0xB3,0xF0,0x90,0x88,0xC0,0x12,0x22,0xB3,0x50,0x09,0x12,0x25,0x47,0xE4,
-
0x12,0x22,0xE5,0x80,0xEF,0xC2,0x1C,0xE4,0x90,0x13,0xB3,0xF0,0x12,0x22,0xB0,0x50,
-
0x36,0x74,0xBD,0x2E,0x12,0x22,0x9D,0x12,0x29,0x74,0xFE,0xEF,0xB5,0x06,0x04,0xD2,
-
0x1C,0x80,0x24,0x74,0xC2,0x2F,0x12,0x25,0x4A,0xE0,0x70,0x12,0x90,0x13,0xB3,0xE0,
-
0x12,0x22,0x9B,0xE0,0x24,0xC2,0x12,0x25,0x4A,0x74,0x01,0xF0,0x80,0x04,0xD2,0x1C,
-
0x80,0x05,0x12,0x22,0xE6,0x80,0xC5,0x90,0x13,0xCF,0x12,0x43,0xE5,0x00,0x00,0x00,
-
0x00,0x20,0x1C,0x51,0xE4,0x90,0x13,0xB3,0xF0,0x12,0x22,0xB0,0x50,0x27,0x12,0x22,
-
0x99,0x12,0x23,0xB2,0x74,0xBD,0x2E,0x12,0x22,0x9D,0x12,0x21,0x86,0xC0,0x83,0xC0,
-
0x82,0x90,0x13,0xB3,0xE0,0xD0,0x82,0xD0,0x83,0x12,0x20,0x95,0x12,0x26,0x5E,0x12,
-
0x22,0xE6,0x02,0x07,0x79,0x12,0x24,0xAF,0xA3,0x12,0x23,0xC3,0xC3,0x12,0x43,0xB5,
-
0x50,0x13,0x90,0x13,0xCF,0x12,0x24,0xB2,0x12,0x28,0xCD,0x12,0x22,0xB0,0x50,0x05,
-
0x12,0x22,0xCE,0x80,0xF6,0xC2,0x1B,0xE4,0x90,0x13,0xB3,0xF0,0x90,0x88,0xC1,0xE0,
-
0x14,0x12,0x22,0xB4,0x50,0x1B,0x74,0xBD,0x2E,0x12,0x22,0x9D,0x12,0x29,0x74,0xFE,
-
0xEF,0xB5,0x06,0x08,0x12,0x22,0x96,0x12,0x26,0xCF,0x80,0x05,0x12,0x22,0xE6,0x80,
-
0xDB,0x30,0x1B,0x03,0x02,0x06,0xFA,0x90,0x13,0xBD,0xE0,0x04,0xF0,0x02,0x06,0xFA,
-
0x90,0x88,0xC1,0x12,0x29,0x53,0x12,0x29,0x7B,0xC3,0x9F,0x40,0x03,0x02,0x0B,0x37,
-
0xE0,0xFF,0x12,0x28,0x0C,0xE0,0x12,0x27,0x2A,0xE0,0x90,0x13,0xBB,0xF0,0x90,0x13,
-
0xBA,0xEF,0xF0,0xC2,0x12,0xC2,0x14,0x12,0x20,0x89,0x7B,0x90,0x12,0x27,0x3B,0x90,
-
0x13,0xB3,0xE0,0x12,0x28,0x0C,0x12,0x21,0x86,0xC0,0x83,0xC0,0x82,0x90,0x13,0xB3,
-
0xE0,0xD0,0x82,0xD0,0x83,0x12,0x25,0xCD,0x40,0x03,0x02,0x0B,0x31,0x12,0x21,0x83,
-
0xC0,0x83,0xC0,0x82,0x90,0x13,0xBA,0xE0,0xD0,0x82,0xD0,0x83,0x12,0x20,0x95,0x12,
-
0x24,0xBE,0x50,0x1A,0x90,0x13,0xBA,0x12,0x1F,0xDD,0x12,0x1F,0x1B,0x12,0x28,0x3F,
-
0x12,0x1E,0xFD,0xFD,0xEE,0x12,0x20,0x04,0x12,0x23,0x93,0x02,0x09,0x77,0x12,0x21,
-
0x83,0xC0,0x83,0xC0,0x82,0x90,0x13,0xBA,0xE0,0xD0,0x82,0xD0,0x83,0x12,0x20,0x95,
-
0xE4,0x7B,0xB8,0x7A,0x0B,0x12,0x24,0xC3,0x50,0x56,0x90,0x13,0xBA,0xE0,0xFD,0x12,
-
0x1F,0xDF,0x12,0x22,0x03,0xD5,0x82,0x02,0x15,0x83,0x12,0x25,0x52,0x12,0x20,0x5C,
-
0xED,0x12,0x1F,0xDF,0x12,0x20,0x67,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,
-
0xF9,0xFF,0xEC,0x12,0x1F,0x81,0x12,0x21,0xE2,0x12,0x22,0x03,0xD5,0x82,0x02,0x15,
-
0x83,0x12,0x25,0x52,0x12,0x20,0x04,0x12,0x20,0x67,0xED,0x12,0x21,0xE7,0x12,0x20,
-
0x67,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,0xF9,0xFF,0xEC,0x02,0x09,0x71,
-
0x12,0x21,0x83,0xC0,0x83,0xC0,0x82,0x90,0x13,0xBA,0xE0,0xD0,0x82,0xD0,0x83,0x12,
-
0x20,0x95,0xE4,0x7B,0xDC,0x7A,0x05,0x12,0x24,0xC3,0x50,0x1A,0x12,0x1F,0x49,0x90,
-
0x13,0xBB,0xE0,0xFD,0x12,0x20,0x04,0x12,0x21,0x7C,0xFF,0xEC,0x12,0x21,0xE7,0x12,
-
0x25,0x5D,0xED,0x02,0x09,0x71,0x12,0x21,0xF3,0xD5,0x82,0x02,0x15,0x83,0x12,0x29,
-
0x5E,0x12,0x1F,0xDF,0x12,0x20,0x50,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,
-
0xF9,0x12,0x28,0x46,0x12,0x1F,0x81,0xED,0x12,0x20,0x04,0x12,0x22,0x03,0xD5,0x82,
-
0x02,0x15,0x83,0x15,0x82,0xE0,0x33,0xFE,0xEC,0x12,0x1F,0x10,0x12,0x29,0x69,0x12,
-
0x20,0x04,0x12,0x20,0x67,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,0xF9,0xFF,
-
0xED,0x12,0x20,0x04,0x12,0x1F,0x8C,0x90,0x13,0xBB,0xE0,0xFF,0x12,0x20,0xCC,0x12,
-
0x1F,0x1B,0xFD,0xEF,0x12,0x22,0xC2,0x12,0x21,0x7C,0x12,0x28,0x4D,0x12,0x53,0xA0,
-
0x12,0x28,0x03,0x90,0x13,0xBB,0xE0,0xFF,0x12,0x21,0x53,0x12,0x1F,0x1B,0xFD,0xEF,
-
0x12,0x20,0x04,0x12,0x21,0x7C,0x12,0x28,0x4D,0x12,0x53,0xA0,0x12,0x22,0x6C,0x40,
-
0x29,0x12,0x21,0x5F,0xE0,0xD3,0x94,0x04,0x40,0x0A,0x74,0x83,0x2F,0x12,0x21,0x66,
-
0xE0,0x24,0xFC,0xF0,0x12,0x21,0x5F,0xE0,0xC3,0x94,0x01,0x50,0x08,0x74,0x83,0x2F,
-
0x12,0x21,0x66,0xE4,0xF0,0x12,0x25,0x38,0x80,0x3A,0x12,0x21,0x5F,0xE0,0x04,0xF0,
-
0x74,0x83,0x2F,0x12,0x21,0x66,0xE0,0xD3,0x94,0x16,0x40,0x0C,0x90,0x13,0xBB,0xE0,
-
0x12,0x21,0x64,0x12,0x28,0x54,0x80,0x18,0x12,0x28,0xD9,0x50,0x05,0x12,0x29,0x85,
-
0x40,0x06,0x30,0x06,0x03,0x12,0x25,0x38,0x12,0x28,0xE1,0x40,0x03,0x12,0x25,0x38,
-
0xC2,0x12,0xC2,0x14,0x12,0x21,0x5F,0x12,0x27,0x4A,0x40,0x0F,0xD2,0x12,0xD2,0x14,
-
0x74,0x79,0x2F,0x12,0x23,0xAA,0x74,0x01,0xF0,0x80,0x04,0xC2,0x12,0xC2,0x14,0x12,
-
0x23,0xA3,0xE0,0xB4,0x01,0x09,0xEF,0x12,0x20,0x89,0x12,0x28,0xE9,0x80,0x0A,0x90,
-
0x13,0xBB,0xE0,0x12,0x20,0x89,0x12,0x26,0x70,0x90,0x13,0xBB,0xE0,0x12,0x23,0xA8,
-
0xE0,0xB4,0x01,0x13,0xD3,0xEB,0x94,0x06,0xEA,0x94,0x00,0x40,0x06,0xD2,0x12,0xD2,
-
0x14,0x80,0x04,0xC2,0x12,0xC2,0x14,0x90,0x13,0xBB,0xE0,0xFF,0x24,0xE5,0x12,0x20,
-
0x7E,0x12,0x23,0x66,0xE0,0x64,0x01,0x70,0x5B,0x12,0x22,0x0D,0xE0,0xC3,0x9E,0x50,
-
0x1B,0xC2,0x10,0x12,0x21,0x18,0x12,0x24,0x8F,0x50,0x09,0x12,0x22,0x22,0xE0,0x04,
-
0xF0,0x02,0x0A,0xD6,0x12,0x22,0x22,0xE4,0xF0,0x02,0x0A,0xD6,0x90,0x13,0xBB,0xE0,
-
0xFF,0x24,0x98,0x12,0x23,0x6C,0xE4,0xF0,0x74,0xA2,0x2F,0x12,0x22,0x24,0xE4,0xF0,
-
0xD2,0x10,0x12,0x24,0x49,0x12,0x21,0x7C,0x12,0x28,0x46,0x12,0x1F,0x81,0x12,0x25,
-
0xF6,0x12,0x21,0x7C,0xFF,0xED,0x12,0x20,0x04,0x12,0x1F,0x8C,0x12,0x20,0x7B,0x74,
-
0x01,0xF0,0x80,0x02,0xD2,0x10,0x30,0x01,0x16,0x90,0x13,0xBA,0x12,0x1F,0xDD,0x12,
-
0x1F,0x1B,0x12,0x28,0x3F,0x12,0x20,0xCC,0x12,0x1F,0x08,0xFD,0xEE,0x80,0x27,0x30,
-
0x12,0x2A,0x30,0x14,0x27,0x30,0x10,0x24,0x12,0x25,0x9D,0x40,0x03,0x12,0x29,0x8C,
-
0x12,0x25,0xAB,0x40,0x03,0x12,0x29,0x93,0x12,0x22,0xBD,0x12,0x1F,0x1B,0x12,0x1F,
-
0xEB,0x12,0x1F,0x1B,0xFD,0xEF,0x12,0x21,0x53,0x12,0x23,0x93,0x90,0x13,0xBA,0x12,
-
0x1F,0xDD,0x12,0x1F,0x1B,0x12,0x23,0x74,0x12,0x1F,0x08,0x12,0x20,0xD8,0x12,0x23,
-
0x18,0x12,0x22,0xE6,0x02,0x08,0x06,0x12,0x25,0x3F,0x50,0x45,0x90,0x88,0xC0,0xE0,
-
0x94,0x00,0x40,0x3D,0xE4,0x90,0x13,0xB4,0xF0,0x12,0x24,0xF3,0x50,0x33,0x74,0xE5,
-
0x2F,0x12,0x20,0x7E,0xE0,0x64,0x04,0x70,0x22,0x12,0x25,0x3F,0x50,0x1D,0x12,0x27,
-
0x23,0x12,0x20,0x7E,0x74,0x03,0xF0,0xEF,0x12,0x20,0x89,0x12,0x22,0xED,0x74,0xA2,
-
0x2F,0x12,0x22,0x24,0xE4,0xF0,0x12,0x23,0x69,0xE4,0xF0,0x12,0x26,0x57,0x02,0x0B,
-
0x49,0x12,0x25,0x3F,0x40,0x03,0x02,0x12,0x7F,0x90,0x88,0xC1,0xE0,0x94,0x00,0x50,
-
0x03,0x02,0x12,0x7F,0xE4,0x90,0x13,0xB5,0xF0,0x90,0x88,0xB0,0x12,0x28,0xC4,0x9F,
-
0x40,0x03,0x02,0x12,0x7F,0x74,0xA0,0x12,0x26,0xC6,0xE0,0x70,0x03,0x02,0x0C,0x45,
-
0xE4,0x90,0x13,0xB4,0xF0,0x12,0x24,0xF3,0x40,0x03,0x02,0x0C,0x45,0x74,0xE5,0x2F,
-
0x12,0x20,0x7E,0xE0,0x70,0x79,0x12,0x25,0x3F,0x50,0x74,0x12,0x1E,0x91,0xFD,0xEE,
-
0x12,0x20,0x04,0xF5,0x83,0xEC,0xF0,0xA3,0xED,0x12,0x1F,0xD9,0x12,0x1F,0x1B,0xFD,
-
0xEE,0x12,0x20,0xCC,0x12,0x1F,0x08,0xFD,0xEE,0x12,0x21,0x53,0x12,0x23,0x93,0x12,
-
0x24,0xC9,0xE0,0x90,0x13,0xB4,0x12,0x20,0xFE,0xEF,0xF0,0x74,0x98,0x2D,0x12,0x1F,
-
0xD0,0x12,0x1F,0x1B,0xFD,0x90,0x13,0xB4,0xE0,0xFE,0x12,0x24,0x4A,0x12,0x1F,0x08,
-
0x12,0x23,0x86,0x74,0xE5,0x2E,0x12,0x20,0x7E,0x74,0x01,0xF0,0xEE,0x12,0x20,0x89,
-
0x12,0x26,0x70,0x90,0x13,0xB5,0xE0,0x24,0xA0,0x12,0x26,0xC7,0xE4,0xF0,0x74,0xD1,
-
0x2E,0x12,0x23,0x0E,0x12,0x23,0x35,0x90,0x13,0xB8,0xE0,0x04,0xF0,0x80,0x06,0x12,
-
0x26,0x57,0x02,0x0B,0xB5,0x12,0x27,0x34,0x02,0x0B,0x99,0xE4,0x90,0x88,0xC0,0xF0,
-
0xF5,0xDC,0xF5,0xDD,0xF5,0xDE,0x90,0x13,0xB4,0xF0,0x12,0x24,0xF3,0x50,0x41,0x74,
-
0xE5,0x2F,0x12,0x20,0x7E,0xE0,0x64,0x01,0x60,0x15,0x12,0x27,0x23,0x12,0x20,0x7E,
-
0xE0,0x64,0x02,0x60,0x0A,0x74,0xE5,0x2F,0x12,0x20,0x7E,0xE0,0xB4,0x04,0x14,0x90,
-
0x88,0xC0,0xE0,0x04,0xF0,0x90,0x13,0xB4,0xE0,0xFF,0x7B,0x01,0xE4,0xFD,0x12,0x2F,
-
0x6A,0x80,0x08,0x12,0x27,0x23,0x12,0x20,0x7E,0xE4,0xF0,0x12,0x26,0x57,0x80,0xBA,
-
0xE4,0xF5,0xD9,0xF5,0xDA,0xF5,0xDB,0x90,0x13,0xB5,0xF0,0x90,0x88,0xC1,0x12,0x29,
-
0x9A,0x50,0x0B,0xE4,0xFB,0xFD,0x12,0x2F,0x6A,0x12,0x27,0x34,0x80,0xED,0x90,0x88,
-
0xC0,0xE0,0xFF,0x90,0x88,0xC1,0xE0,0xC3,0x9F,0x50,0x02,0x80,0x03,0x90,0x88,0xC0,
-
0xE0,0x90,0x13,0xBC,0xF0,0xE4,0x90,0x13,0xB6,0xF0,0x90,0x13,0xBC,0xE0,0xFF,0x90,
-
0x13,0xB6,0xE0,0xC3,0x9F,0x40,0x03,0x02,0x11,0x7D,0xC2,0x12,0xC2,0x14,0xD2,0xB4,
-
0x20,0xB4,0x06,0x30,0x11,0x03,0x20,0xDD,0x05,0x75,0x9E,0x55,0x80,0xF2,0xC2,0xDD,
-
0xC2,0x11,0xAF,0xE2,0xAD,0xE3,0x12,0x24,0x42,0xFF,0xEC,0x3E,0xAD,0x07,0xFC,0x90,
-
0xF2,0xB0,0xE0,0xD3,0x94,0x06,0x50,0x33,0x12,0x20,0x86,0xE0,0xFE,0xA3,0xE0,0xFF,
-
0xBE,0x06,0x10,0xBF,0x40,0x0D,0x12,0x20,0x86,0x74,0x3E,0xF0,0xA3,0x74,0x80,0xF0,
-
0x02,0x0D,0x77,0x12,0x20,0x86,0xE0,0xFE,0xA3,0xE0,0x64,0x64,0x4E,0x70,0x38,0x12,
-
0x20,0x86,0x74,0x01,0xF0,0xA3,0x74,0x2C,0xF0,0x80,0x2C,0x12,0x20,0x86,0xE0,0xFE,
-
0xA3,0xE0,0xFF,0xBE,0x06,0x0F,0xBF,0x40,0x0C,0x12,0x20,0x86,0x74,0x01,0xF0,0xA3,
-
0x74,0x40,0xF0,0x80,0x12,0x12,0x20,0x86,0xE0,0xFE,0xA3,0xE0,0x64,0x64,0x4E,0x70,
-
0x06,0x12,0x20,0x86,0x12,0x26,0x70,0x12,0x20,0x86,0xE0,0xFE,0xA3,0xE0,0xD3,0x9D,
-
0xEE,0x9C,0x50,0x03,0x02,0x11,0x7D,0xD3,0xED,0x94,0xC8,0xEC,0x94,0x00,0x40,0x16,
-
0xAF,0xDF,0xEF,0x12,0x1F,0xDF,0x12,0x21,0x7C,0xFF,0xAB,0xE1,0xEB,0x12,0x1F,0x81,
-
0x12,0x21,0x6E,0x02,0x0E,0x11,0xD3,0xED,0x94,0x64,0xEC,0x94,0x00,0x40,0x69,0xAF,
-
0xDF,0xEF,0x12,0x1F,0xDF,0x12,0x22,0x03,0xD5,0x82,0x02,0x15,0x83,0x15,0x82,0xE0,
-
0x33,0xFE,0xAB,0xDF,0xEB,0x12,0x1F,0xDF,0x12,0x20,0x67,0xAB,0xE1,0xEB,0x12,0x20,
-
0x5C,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,0xF9,0xFF,0xAB,0xE1,0xEB,0x12,
-
0x1F,0x81,0xAF,0xDF,0xEF,0x12,0x21,0xE7,0x12,0x22,0x03,0xD5,0x82,0x02,0x15,0x83,
-
0x15,0x82,0xE0,0x33,0xFE,0xAB,0xDF,0xEB,0x12,0x21,0xE7,0x12,0x20,0x67,0xAB,0xE1,
-
0xEB,0x12,0x20,0x04,0x12,0x20,0x67,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,0x13,0xD8,
-
0xF9,0xFF,0xAB,0xE1,0xEB,0x02,0x0E,0xD7,0xAE,0x04,0xAF,0x05,0xD3,0xED,0x94,0x32,
-
0xEC,0x94,0x00,0x40,0x3B,0xAF,0xE1,0xEF,0x12,0x22,0xC2,0x12,0x21,0x7C,0xFF,0xAD,
-
0xDF,0xED,0x12,0x1F,0xDF,0x12,0x1F,0x1B,0x2F,0xFF,0xEC,0x12,0x25,0x66,0xAD,0xE1,
-
0xED,0x12,0x1F,0x81,0xAF,0xE1,0xEF,0x12,0x20,0x04,0x12,0x21,0x7C,0xFF,0xAD,0xDF,
-
0xED,0x12,0x1F,0x10,0x2F,0xFF,0xEC,0x12,0x25,0x66,0xAD,0xE1,0xED,0x02,0x0E,0xD7,
-
0xAF,0xE1,0xEF,0x12,0x21,0xF8,0xD5,0x82,0x02,0x15,0x83,0x15,0x82,0xE0,0x33,0xFE,
-
0xAD,0xE1,0xED,0x12,0x22,0xC2,0x12,0x1F,0x1B,0x2F,0xFF,0xEC,0x3E,0xFE,0xAD,0xDF,
-
0xED,0x12,0x1F,0xDF,0x12,0x1F,0x1B,0x2F,0xFF,0xEC,0x3E,0xFE,0xEF,0x78,0x02,0xCE,
-
0xC3,0x13,0xCE,0x13,0xD8,0xF9,0xFF,0xAD,0xE1,0xED,0x12,0x1F,0x81,0xAF,0xE1,0xEF,
-
0x12,0x20,0x04,0x12,0x22,0x03,0xD5,0x82,0x02,0x15,0x83,0x15,0x82,0xE0,0x33,0xFE,
-
0xAD,0xE1,0xED,0x12,0x20,0x04,0x12,0x1F,0x1B,0x2F,0xFF,0xEC,0x3E,0xFE,0xAD,0xDF,
-
0xED,0x12,0x1F,0x10,0x2F,0xFF,0xEC,0x3E,0xFE,0xEF,0x78,0x02,0xCE,0xC3,0x13,0xCE,
-
0x13,0xD8,0xF9,0xFF,0xAD,0xE1,0xED,0x12,0x20,0x04,0x12,0x1F,0x8C,0xAF,0xE1,0xEF,
-
0x12,0x20,0xCC,0x12,0x21,0x7C,0xFF,0xAD,0xE1,0xED,0x12,0x22,0xC2,0x12,0x1F,0x1B,
-
0x12,0x28,0x5E,0x12,0x53,0xA0,0x12,0x28,0x03,0xAF,0xE1,0xEF,0x12,0x21,0x53,0x12,
-
0x21,0x7C,0xFF,0xAD,0xE1,0xED,0x12,0x20,0x04,0x12,0x1F,0x1B,0x12,0x28,0x5E,0x12,
-
0x53,0xA0,0x12,0x22,0x6C,0x40,0x3B,0xD2,0x12,0xD2,0x14,0xAF,0xE1,0x74,0x83,0x2F,
-
0x12,0x21,0x66,0xE0,0xD3,0x94,0x04,0x40,0x0C,0xAF,0xE1,0x74,0x83,0x2F,0x12,0x21,
-
0x66,0xE0,0x24,0xFC,0xF0,0xAF,0xE1,0x74,0x83,0x2F,0x12,0x21,0x66,0xE0,0xC3,0x94,
-
0x01,0x50,0x0A,0xAF,0xE1,0x74,0x83,0x2F,0x12,0x21,0x66,0xE4,0xF0,0x12,0x25,0x38,
-
0x80,0x45,0xAF,0xE1,0x74,0x83,0x2F,0x12,0x21,0x66,0xE0,0x04,0xF0,0xAF,0xE1,0x74,
-
0x83,0x2F,0x12,0x21,0x66,0xE0,0xD3,0x94,0x16,0x40,0x10,0xAF,0xE1,0x74,0x83,0x2F,
-
0x12,0x21,0x66,0x74,0x16,0xF0,0x12,0x28,0x57,0x80,0x18,0x12,0x28,0xD9,0x50,0x05,
-
0x12,0x29,0x85,0x40,0x06,0x30,0x06,0x03,0x12,0x25,0x38,0x12,0x28,0xE1,0x40,0x03,
-
0x12,0x25,0x38,0xC2,0x12,0xC2,0x14,0xAF,0xE1,0x74,0x83,0x2F,0x12,0x21,0x66,0xE0,
-
0xFF,0x90,0x14,0x05,0xE0,0xFC,0xA3,0xE0,0xFD,0xD3,0x9F,0xEC,0x94,0x00,0x40,0x11,
-
0xD2,0x12,0xD2,0x14,0xAF,0xE1,0x74,0x79,0x2F,0x12,0x23,0xAA,0x74,0x01,0xF0,0x80,
-
0x04,0xC2,0x12,0xC2,0x14,0xAF,0xE1,0x74,0x79,0x2F,0x12,0x23,0xAA,0xE0,0xAF,0xE1,
-
0xB4,0x01,0x08,0x12,0x20,0x88,0x12,0x28,0xE9,0x80,0x06,0x12,0x20,0x88,0x12,0x26,
-
0x70,0xAF,0xE1,0x74,0x79,0x2F,0x12,0x23,0xAA,0xE0,0xB4,0x01,0x13,0xD3,0xED,0x94,
-
0x06,0xEC,0x94,0x00,0x40,0x06,0xD2,0x12,0xD2,0x14,0x80,0x04,0xC2,0x12,0xC2,0x14,
-
0xAF,0xE1,0x74,0x98,0x2F,0x12,0x23,0x6C,0xE0,0x64,0x01,0x60,0x03,0x02,0x10,0xA2,
-
0xAF,0xDF,0x74,0xE3,0x2F,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0xE0,0xFF,0xAE,0xE1,
-
0x74,0xA2,0x2E,0x12,0x22,0x24,0xE0,0xC3,0x9F,0x50,0x3C,0xC2,0x10,0xAF,0xE1,0x74,
-
0x3C,0x2F,0x12,0x21,0x1B,0xE0,0xFF,0xAD,0xDF,0xED,0x25,0xE0,0x24,0xED,0xF5,0x82,
-
0xE4,0x34,0x13,0x12,0x1F,0x1B,0xD3,0x9F,0x74,0x80,0xF8,0xEC,0x64,0x80,0x98,0xAF,
-
0xE1,0x74,0xA2,0x50,0x0A,0x2F,0x12,0x22,0x24,0xE0,0x04,0xF0,0x02,0x10,0xA4,0x2F,
-
0x12,0x22,0x24,0xE4,0xF0,0x80,0x3D,0xAF,0xE1,0x74,0x98,0x2F,0x12,0x23,0x6C,0xE4,
-
0xF0,0xAF,0xE1,0x74,0xA2,0x2F,0x12,0x22,0x24,0xE4,0xF0,0xAF,0xE1,0xEF,0x12,0x24,
-
0x4A,0x12,0x21,0x7C,0xFF,0xAD,0xE1,0xED,0x12,0x1F,0x81,0xAF,0xE1,0xEF,0x12,0x25,
-
0xF7,0x12,0x21,0x7C,0xFF,0xAD,0xE1,0xED,0x12,0x20,0x04,0x12,0x1F,0x8C,0xD2,0x10,
-
0x80,0x02,0xD2,0x10,0x30,0x01,0x1B,0xAF,0xDF,0xEF,0x12,0x1F,0xDF,0x12,0x21,0x7C,
-
0xFF,0xAD,0xE1,0xED,0x12,0x20,0xCC,0x12,0x1F,0x8C,0xAF,0xDF,0xEF,0x12,0x21,0xE7,
-
0x80,0x32,0x30,0x12,0x3C,0x30,0x14,0x39,0x30,0x10,0x36,0x12,0x25,0x9D,0x40,0x03,
-
0x12,0x29,0x8C,0x12,0x25,0xAB,0x40,0x03,0x12,0x29,0x93,0xAF,0xE1,0xEF,0x12,0x22,
-
0xC2,0x12,0x21,0x7C,0xFF,0xAD,0xE1,0xED,0x12,0x20,0xCC,0x12,0x1F,0x8C,0xAF,0xE1,
-
0xEF,0x12,0x20,0x04,0x12,0x21,0x7C,0xFF,0xAD,0xE1,0xED,0x12,0x21,0x53,0x12,0x1F,
-
0x8C,0xAF,0xDF,0xEF,0x12,0x1F,0xDF,0x12,0x21,0x7C,0xFF,0xAD,0xE1,0xED,0x12,0x23,
-
0x7A,0x12,0x1F,0x8C,0x12,0x21,0x6E,0xFF,0xAD,0xE1,0xED,0x12,0x25,0x2C,0x12,0x1F,
-
0x8C,0xAF,0xDF,0x74,0x00,0x2F,0x12,0x24,0xD0,0xE0,0xFF,0xAE,0xE1,0x74,0x14,0x2E,
-
0xF5,0x82,0xE4,0x34,0x8A,0xF5,0x83,0xEF,0xF0,0xAF,0xDF,0x74,0x28,0x2F,0x12,0x26,
-
0xBE,0xE0,0xFF,0xAE,0xE1,0x74,0x3C,0x2E,0x12,0x21,0x1B,0xEF,0xF0,0xAF,0xE1,0x74,
-
0xE5,0x2F,0x12,0x20,0x7E,0x74,0x02,0x12,0x23,0x28,0xAF,0xE1,0x74,0xD1,0x2F,0x12,
-
0x23,0x0E,0x7B,0x01,0x7D,0x01,0xAF,0xE1,0x12,0x2F,0x6A,0xE4,0xFB,0x7D,0x01,0xAF,
-
0xDF,0x12,0x2F,0x6A,0x90,0x13,0xB6,0xE0,0x04,0xF0,0x02,0x0C,0xDA,0x12,0x25,0x3F,
-
0x50,0x45,0x90,0x88,0xC0,0xE0,0x94,0x00,0x40,0x3D,0xE4,0x90,0x13,0xB4,0xF0,0x12,
-
0x24,0xF3,0x50,0x33,0x7B,0x01,0x12,0x12,0x80,0x60,0x26,0xA3,0xE0,0xC3,0x95,0x0D,
-
0x50,0x1F,0x90,0x13,0xB4,0xE0,0xFF,0x12,0x22,0x22,0xE4,0xF0,0x12,0x23,0x69,0xE4,
-
0xF0,0x74,0xE5,0x2F,0x12,0x20,0x7E,0x74,0x03,0xF0,0xEF,0x12,0x20,0x89,0x12,0x22,
-
0xED,0x12,0x26,0x57,0x02,0x11,0x8F,0x12,0x25,0x3F,0x40,0x03,0x02,0x12,0x7F,0x90,
-
0x88,0xC1,0xE0,0x94,0x00,0x50,0x03,0x02,0x12,0x7F,0xE4,0x90,0x13,0xB5,0xF0,0x90,
-
0x88,0xB0,0x12,0x29,0x9A,0x40,0x03,0x02,0x12,0x7F,0xE4,0xFB,0x12,0x12,0x80,0x70,
-
0x03,0x02,0x12,0x79,0xE4,0x90,0x13,0xB4,0xF0,0x12,0x24,0xF3,0x50,0x7B,0x74,0xE5,
-
0x2F,0x12,0x20,0x7E,0xE0,0x70,0x6C,0x12,0x25,0x3F,0x50,0x67,0x12,0x1E,0x91,0xFD,
-
0xEE,0x12,0x20,0x04,0x12,0x23,0x93,0x12,0x24,0xC9,0xE0,0xFE,0x90,0x13,0xB4,0x12,
-
0x20,0xFF,0xEF,0xF0,0x12,0x1F,0xDA,0x12,0x1F,0x1B,0xFD,0x90,0x13,0xB4,0xE0,0xFE,
-
0x12,0x20,0xCC,0x12,0x1F,0x08,0xFD,0xEE,0x12,0x21,0x53,0x12,0x23,0x93,0x74,0xE5,
-
0x2E,0x12,0x20,0x7E,0x74,0x01,0xF0,0xEE,0x12,0x20,0x89,0x12,0x26,0x70,0x74,0x98,
-
0x2E,0x12,0x1F,0xD0,0x12,0x1F,0x1B,0xFD,0xEE,0x12,0x24,0x4A,0x12,0x1F,0x08,0x12,
-
0x23,0x86,0x74,0xD1,0x2E,0x12,0x23,0x0E,0x12,0x23,0x35,0x90,0x13,0xB8,0xE0,0x04,
-
0xF0,0x80,0x06,0x12,0x26,0x57,0x02,0x11,0xF9,0x12,0x27,0x34,0x02,0x11,0xDF,0x22,
-
0x7D,0x02,0x12,0x2F,0x6A,0x90,0x13,0xB7,0xEF,0xF0,0x22,0xE4,0x90,0x13,0xBF,0xF0,
-
0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0x90,0xF1,0x03,0xE0,0xD3,0x94,
-
0x50,0x40,0x0B,0xE0,0x90,0xF2,0xA5,0xF0,0x90,0xF1,0x03,0xE0,0x80,0x06,0x90,0xF2,
-
0xA5,0x74,0xFA,0xF0,0x90,0xF2,0xA4,0xF0,0x90,0xF1,0x03,0xE0,0x90,0xF2,0xB1,0xF0,
-
0xD2,0xB6,0xD2,0xB7,0xD2,0xB2,0x20,0xB2,0x06,0x30,0x11,0x03,0x20,0xDC,0x05,0x75,
-
0x9E,0x55,0x80,0xF2,0xC2,0xDC,0xC2,0x11,0x90,0xF2,0xB0,0xE0,0xD3,0x94,0x00,0x50,
-
0x03,0x02,0x1E,0x7D,0xE4,0x90,0x13,0xB3,0xF0,0xA3,0xF0,0x90,0xF2,0xB0,0xE0,0xFF,
-
0x12,0x28,0x73,0xC3,0x9F,0xEC,0x94,0x00,0x40,0x03,0x02,0x1E,0x7D,0x20,0xD9,0x3E,
-
0xED,0x25,0xE0,0xFD,0xEC,0x12,0x24,0x85,0x12,0x22,0x65,0x24,0x29,0xF5,0x82,0xE4,
-
0x34,0x80,0xF5,0x83,0xE0,0xFE,0x12,0x24,0x87,0x12,0x22,0x65,0x24,0x28,0xF5,0x82,
-
0xE4,0x34,0x80,0x12,0x22,0x39,0x24,0x01,0xF5,0x82,0xE4,0x34,0x80,0xF5,0x83,0xE0,
-
0xFE,0x12,0x22,0x5E,0x24,0x00,0xF5,0x82,0xE4,0x34,0x80,0x02,0x13,0x74,0x12,0x24,
-
0x7A,0x12,0x22,0x65,0x24,0xE9,0xF5,0x82,0xE4,0x34,0x80,0xF5,0x83,0xE0,0xFE,0x12,
-
0x24,0x87,0x12,0x22,0x65,0x24,0xE8,0xF5,0x82,0xE4,0x34,0x80,0x12,0x22,0x39,0x24,
-
0xC1,0xF5,0x82,0xE4,0x34,0x80,0xF5,0x83,0xE0,0xFE,0x12,0x22,0x5E,0x24,0xC0,0xF5,
-
0x82,0xE4,0x34,0x80,0xF5,0x83,0xE0,0x7C,0x00,0x24,0x00,0xFF,0xEC,0x3E,0xFE,0x7D,
-
0x1E,0x12,0x42,0xC5,0x90,0x13,0xCD,0xEE,0xF0,0xA3,0xEF,0xF0,0x90,0x13,0xCB,0x12,
-
0x28,0x7C,0x40,0x1E,0xEF,0x78,0x03,0xCE,0xC3,0x13,0xCE,0x13,0xD8,0xF9,0x78,0x02,
-
0xC3,0x33,0xCE,0x33,0xCE,0xD8,0xF9,0xFF,0x90,0x13,0xCB,0xEE,0xF0,0xA3,0xEF,0xF0,
-
0x80,0x16,0x90,0x13,0xCB,0xE0,0xFE,0xA3,0xE0,0x78,0x03,0xCE,0xC3,0x13,0xCE,0x13,
-
0xD8,0xF9,0xF0,0xEE,0x90,0x13,0xCB,0xF0,0x90,0x13,0xCD,0x12,0x28,0x7C,0x40,0x1E,
-
0xEF,0x78,0x03,0xCE,0xC3,0x13,0xCE,0x13,0xD8,0xF9,0x78,0x02,0xC3,0x33,0xCE,0x33,
-
0xCE,0xD8,0xF9,0xFF,0x90,0x13,0xCD,0xEE,0xF0,0xA3,0xEF,0xF0,0x80,0x16,0x90,0x13,
-
0xCD,0xE0,0xFE,0xA3,0xE0,0x78,0x03,0xCE,0xC3,0x13,0xCE,0x13,0xD8,0xF9,0xF0,0xEE,
-
0x90,0x13,0xCD,0xF0,0xE4,0x90,0x13,0xBB,0xF0,0xA3,0xF0,0x12,0x24,0x7A,0x3C,0xF5,
-
0x83,0xE0,0x75,0xF0,0x14,0xA4,0xFF,0x74,0x80,0x2D,0xF5,0x82,0x74,0x81,0x3C,0xF5,
-
0x83,0xE0,0x7C,0x00,0x2F,0xFF,0xEC,0x35,0xF0,0xFE,0xEF,0x25,0xE0,0xFF,0xEE,0x33,
-
0xFE,0xA2,0xD9,0xE4,0x33,0x2F,0xFF,0xEC,0x3E,0x90,0x13,0xC7,0xF0,0xA3,0xEF,0xF0,
-
0x12,0x28,0x73,0x25,0xE0,0xFF,0xEC,0x12,0x1F,0x3B,0xFB,0x12,0x1F,0xC4,0x12,0x24,
-
0x0B,0x2B,0x12,0x22,0x31,0xE4,0xF0,0xED,0x25,0xE0,0xFF,0xEC,0x12,0x1F,0x3B,0xFD,
-
0x12,0x1F,0xC4,0x12,0x26,0x9C,0x12,0x22,0x31,0x12,0x29,0x3D,0x90,0x13,0xCC,0xE0,
-
0x90,0x13,0xCB,0x12,0x27,0x8C,0xE0,0xFC,0x12,0x26,0xFF,0x40,0x30,0x12,0x1F,0x30,
-
0xFD,0x12,0x1F,0xC4,0x12,0x26,0x9C,0x12,0x22,0x31,0x12,0x29,0x3D,0x90,0x13,0xCE,
-
0xE0,0x90,0x13,0xCD,0x12,0x27,0x8C,0x12,0x26,0xFF,0x40,0x11,0x12,0x1F,0x30,0xFD,
-
0x12,0x1F,0xC4,0x12,0x24,0x0B,0x2D,0x12,0x22,0x31,0x74,0x01,0xF0,0xE4,0xFD,0xFC,
-
0x12,0x1F,0x30,0x60,0x03,0x02,0x15,0x4B,0x12,0x1E,0x7E,0x12,0x1F,0xA8,0x50,0x0C,
-
0x12,0x21,0xCE,0x12,0x1E,0x88,0xC3,0x9D,0xFD,0xE4,0x9C,0xFC,0x12,0x1E,0x7E,0x12,
-
0x25,0x79,0x12,0x1F,0xB0,0x50,0x09,0x12,0x1F,0x94,0x12,0x1E,0x88,0x12,0x1F,0x22,
-
0x12,0x1E,0x7E,0x12,0x26,0x33,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x24,0xFC,0x12,0x1F,
-
0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,0x27,0xDF,0x12,0x1F,0xB0,
-
0x50,0x0C,0x12,0x26,0x03,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,
-
0x7E,0xFB,0x74,0x0A,0x2F,0xF5,0x82,0x74,0x60,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x28,
-
0x88,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0xFB,0x74,0x0C,
-
0x2F,0xF5,0x82,0x74,0x60,0x12,0x1F,0xB0,0x40,0x03,0x02,0x18,0xAD,0x90,0x13,0xC7,
-
0xA3,0xE0,0x24,0x0C,0xF5,0x82,0x74,0x60,0x02,0x18,0xA4,0x12,0x1F,0x30,0x64,0x01,
-
0x60,0x03,0x02,0x15,0xD8,0x12,0x1E,0x7E,0x12,0x1F,0xA8,0x50,0x09,0x12,0x21,0xCE,
-
0x12,0x1E,0x88,0x12,0x23,0x9B,0x12,0x1E,0x7E,0x12,0x25,0x79,0x12,0x1F,0xB0,0x50,
-
0x09,0x12,0x1F,0x94,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,0x26,0x33,
-
0x12,0x1F,0xB0,0x50,0x0C,0x12,0x24,0xFC,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,
-
0x22,0x12,0x1E,0x7E,0x12,0x27,0xDF,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x26,0x03,0x12,
-
0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0xFB,0x74,0x0A,0x2F,0xF5,
-
0x82,0x74,0x60,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x28,0x88,0x12,0x1F,0x9F,0x12,0x1E,
-
0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,0x24,0xD8,0x12,0x1F,0xB0,0x40,0x03,0x02,
-
0x18,0xAD,0x12,0x23,0xCF,0x02,0x18,0xA4,0x12,0x1F,0x30,0x64,0x02,0x60,0x03,0x02,
-
0x16,0x60,0x12,0x1E,0x7E,0x12,0x1F,0xA8,0x50,0x09,0x12,0x21,0xCE,0x12,0x1E,0x88,
-
0x12,0x23,0x9B,0x12,0x1E,0x7E,0x12,0x25,0x79,0x12,0x1F,0xB0,0x50,0x09,0x12,0x1F,
-
0x94,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,0x26,0x33,0x12,0x1F,0xB0,
-
0x50,0x0C,0x12,0x24,0xFC,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,
-
0x7E,0x12,0x27,0xDF,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x26,0x03,0x12,0x1F,0x9F,0x12,
-
0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,0x24,0xD8,0x12,0x1F,0xB0,0x50,0x0C,
-
0x12,0x23,0xCF,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,
-
0x25,0x82,0x12,0x1F,0xB0,0x40,0x03,0x02,0x18,0xAD,0x12,0x24,0x56,0x02,0x18,0xA4,
-
0x12,0x1F,0x30,0x64,0x13,0x60,0x03,0x02,0x17,0x03,0x12,0x1E,0x7E,0x12,0x24,0xD8,
-
0x12,0x1F,0xB0,0x50,0x0C,0x12,0x23,0xCF,0x12,0x21,0xD9,0x12,0x1E,0x88,0x12,0x23,
-
0x9B,0x12,0x1E,0x7E,0x12,0x25,0x82,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x24,0x56,0x12,
-
0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,0x26,0x3C,0x12,0x1F,
-
0xB0,0x50,0x0C,0x12,0x25,0x08,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,
-
0x1E,0x7E,0x12,0x27,0xE8,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x26,0x0F,0x12,0x1F,0x9F,
-
0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0xFB,0x74,0xF6,0x2F,0xF5,0x82,0x74,
-
0x5F,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x28,0x94,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,
-
0x1F,0x22,0x12,0x1E,0x7E,0xFB,0x74,0xF4,0x2F,0xF5,0x82,0x74,0x5F,0x12,0x1F,0xB0,
-
0x40,0x03,0x02,0x18,0xAD,0x90,0x13,0xC7,0xA3,0xE0,0x24,0xF4,0xF5,0x82,0x74,0x5F,
-
0x02,0x18,0xA4,0x12,0x1F,0x30,0x64,0x12,0x60,0x03,0x02,0x17,0x96,0x12,0x1E,0x7E,
-
0x12,0x24,0xD8,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x23,0xCF,0x12,0x21,0xD9,0x12,0x1E,
-
0x88,0x12,0x23,0x9B,0x12,0x1E,0x7E,0x12,0x25,0x82,0x12,0x1F,0xB0,0x50,0x0C,0x12,
-
0x24,0x56,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,0x26,
-
0x3C,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x25,0x08,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,
-
0x1F,0x22,0x12,0x1E,0x7E,0x12,0x27,0xE8,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x26,0x0F,
-
0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0xFB,0x74,0xF6,0x2F,
-
0xF5,0x82,0x74,0x5F,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x28,0x94,0x12,0x1F,0x9F,0x12,
-
0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,0x1F,0xA8,0x40,0x03,0x02,0x18,0xAD,
-
0x12,0x28,0xA0,0x02,0x18,0xA4,0x12,0x1F,0x30,0x64,0x11,0x60,0x03,0x02,0x18,0x2C,
-
0x12,0x1E,0x7E,0x12,0x24,0xD8,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x23,0xCF,0x12,0x21,
-
0xD9,0x12,0x1E,0x88,0x12,0x23,0x9B,0x12,0x1E,0x7E,0x12,0x25,0x82,0x12,0x1F,0xB0,
-
0x50,0x0C,0x12,0x24,0x56,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,
-
0x7E,0x12,0x26,0x3C,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x25,0x08,0x12,0x1F,0x9F,0x12,
-
0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,0x27,0xE8,0x12,0x1F,0xB0,0x50,0x0C,
-
0x12,0x26,0x0F,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,
-
0x1F,0xA8,0x50,0x0C,0x12,0x28,0xA0,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,
-
0x12,0x1E,0x7E,0x12,0x25,0x79,0x12,0x1F,0xB0,0x40,0x03,0x02,0x18,0xAD,0x90,0x13,
-
0xC7,0xA3,0xE0,0x24,0x04,0xF5,0x82,0x74,0x60,0x02,0x18,0xA4,0x12,0x1E,0x7E,0x12,
-
0x1F,0xA8,0x50,0x09,0x12,0x21,0xCE,0x12,0x1E,0x88,0x12,0x23,0x9B,0x12,0x1E,0x7E,
-
0x12,0x25,0x79,0x12,0x1F,0xB0,0x50,0x09,0x12,0x1F,0x94,0x12,0x1E,0x88,0x12,0x1F,
-
0x22,0x12,0x1E,0x7E,0x12,0x26,0x33,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x24,0xFC,0x12,
-
0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,0x24,0xD8,0x12,0x1F,
-
0xB0,0x50,0x0C,0x12,0x23,0xCF,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,
-
0x1E,0x7E,0x12,0x25,0x82,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x24,0x56,0x12,0x1F,0x9F,
-
0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,0x26,0x3C,0x12,0x1F,0xB0,0x50,
-
0x0C,0x12,0x25,0x08,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0xC3,0xED,0x94,
-
0x8C,0xEC,0x94,0x00,0x50,0x03,0x02,0x1C,0xE4,0xE4,0xFC,0xFD,0x12,0x1F,0xB7,0x60,
-
0x03,0x02,0x19,0x60,0x12,0x1E,0x7E,0x12,0x24,0xE1,0x12,0x1F,0xB0,0x50,0x0F,0x12,
-
0x23,0xDB,0x12,0x21,0xD9,0x12,0x1E,0x88,0xC3,0x9D,0xFD,0xE4,0x9C,0xFC,0x12,0x1E,
-
0x7E,0x12,0x25,0x8B,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x24,0x62,0x12,0x1F,0x9F,0x12,
-
0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,0x26,0x45,0x12,0x1F,0xB0,0x50,0x0C,
-
0x12,0x25,0x14,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,
-
0x27,0xF1,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x26,0x1B,0x12,0x1F,0x9F,0x12,0x1E,0x88,
-
0x12,0x1F,0x22,0x12,0x1E,0x7E,0xFB,0x74,0xC8,0x2F,0xF5,0x82,0x74,0x60,0x12,0x1F,
-
0xB0,0x50,0x0C,0x12,0x28,0xAC,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,
-
0x1E,0x7E,0xFB,0x74,0xF0,0x2F,0xF5,0x82,0x74,0x60,0x12,0x1F,0xB0,0x40,0x03,0x02,
-
0x1C,0xDB,0x90,0x13,0xC7,0xA3,0xE0,0x24,0xF0,0xF5,0x82,0x74,0x60,0x02,0x1C,0xD2,
-
0x12,0x1F,0xB7,0x64,0x01,0x60,0x03,0x02,0x19,0xF6,0x12,0x1E,0x7E,0x12,0x24,0xE1,
-
0x12,0x1F,0xB0,0x50,0x0C,0x12,0x23,0xDB,0x12,0x21,0xD9,0x12,0x1E,0x88,0x12,0x23,
-
0x9B,0x12,0x1E,0x7E,0x12,0x25,0x8B,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x24,0x62,0x12,
-
0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,0x26,0x45,0x12,0x1F,
-
0xB0,0x50,0x0C,0x12,0x25,0x14,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,
-
0x1E,0x7E,0x12,0x27,0xF1,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x26,0x1B,0x12,0x1F,0x9F,
-
0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0xFB,0x74,0xC8,0x2F,0xF5,0x82,0x74,
-
0x60,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x28,0xAC,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,
-
0x1F,0x22,0x12,0x1E,0x7E,0x12,0x24,0xEA,0x12,0x1F,0xB0,0x40,0x03,0x02,0x1C,0xDB,
-
0x12,0x23,0xE7,0x02,0x1C,0xD2,0x12,0x1F,0xB7,0x64,0x02,0x60,0x03,0x02,0x1A,0x87,
-
0x12,0x1E,0x7E,0x12,0x24,0xE1,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x23,0xDB,0x12,0x21,
-
0xD9,0x12,0x1E,0x88,0x12,0x23,0x9B,0x12,0x1E,0x7E,0x12,0x25,0x8B,0x12,0x1F,0xB0,
-
0x50,0x0C,0x12,0x24,0x62,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,
-
0x7E,0x12,0x26,0x45,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x25,0x14,0x12,0x1F,0x9F,0x12,
-
0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,0x27,0xF1,0x12,0x1F,0xB0,0x50,0x0C,
-
0x12,0x26,0x1B,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,
-
0x24,0xEA,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x23,0xE7,0x12,0x1F,0x9F,0x12,0x1E,0x88,
-
0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,0x25,0x94,0x12,0x1F,0xB0,0x40,0x03,0x02,0x1C,
-
0xDB,0x12,0x24,0x6E,0x02,0x1C,0xD2,0x12,0x1F,0xB7,0x64,0x1D,0x60,0x03,0x02,0x1B,
-
0x2A,0x12,0x1E,0x7E,0x12,0x24,0xEA,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x23,0xE7,0x12,
-
0x21,0xD9,0x12,0x1E,0x88,0x12,0x23,0x9B,0x12,0x1E,0x7E,0x12,0x25,0x94,0x12,0x1F,
-
0xB0,0x50,0x0C,0x12,0x24,0x6E,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,
-
0x1E,0x7E,0x12,0x26,0x4E,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x25,0x20,0x12,0x1F,0x9F,
-
0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,0x27,0xFA,0x12,0x1F,0xB0,0x50,
-
0x0C,0x12,0x26,0x27,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,
-
0xFB,0x74,0x38,0x2F,0xF5,0x82,0x74,0x5F,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x28,0xB8,
-
0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0xFB,0x74,0x10,0x2F,
-
0xF5,0x82,0x74,0x5F,0x12,0x1F,0xB0,0x40,0x03,0x02,0x1C,0xDB,0x90,0x13,0xC7,0xA3,
-
0xE0,0x24,0x10,0xF5,0x82,0x74,0x5F,0x02,0x1C,0xD2,0x12,0x1F,0xB7,0x64,0x1C,0x60,
-
0x03,0x02,0x1B,0xC0,0x12,0x1E,0x7E,0x12,0x24,0xEA,0x12,0x1F,0xB0,0x50,0x0C,0x12,
-
0x23,0xE7,0x12,0x21,0xD9,0x12,0x1E,0x88,0x12,0x23,0x9B,0x12,0x1E,0x7E,0x12,0x25,
-
0x94,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x24,0x6E,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,
-
0x1F,0x22,0x12,0x1E,0x7E,0x12,0x26,0x4E,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x25,0x20,
-
0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,0x27,0xFA,0x12,
-
0x1F,0xB0,0x50,0x0C,0x12,0x26,0x27,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,
-
0x12,0x1E,0x7E,0xFB,0x74,0x38,0x2F,0xF5,0x82,0x74,0x5F,0x12,0x1F,0xB0,0x50,0x0C,
-
0x12,0x28,0xB8,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,
-
0x24,0xE1,0x12,0x1F,0xB0,0x40,0x03,0x02,0x1C,0xDB,0x12,0x23,0xDB,0x02,0x1C,0xD2,
-
0x12,0x1F,0xB7,0x64,0x1B,0x60,0x03,0x02,0x1C,0x51,0x12,0x1E,0x7E,0x12,0x24,0xEA,
-
0x12,0x1F,0xB0,0x50,0x0C,0x12,0x23,0xE7,0x12,0x21,0xD9,0x12,0x1E,0x88,0x12,0x23,
-
0x9B,0x12,0x1E,0x7E,0x12,0x25,0x94,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x24,0x6E,0x12,
-
0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,0x26,0x4E,0x12,0x1F,
-
0xB0,0x50,0x0C,0x12,0x25,0x20,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,
-
0x1E,0x7E,0x12,0x27,0xFA,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x26,0x27,0x12,0x1F,0x9F,
-
0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,0x24,0xE1,0x12,0x1F,0xB0,0x50,
-
0x0C,0x12,0x23,0xDB,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,
-
0x12,0x25,0x8B,0x12,0x1F,0xB0,0x40,0x03,0x02,0x1C,0xDB,0x12,0x24,0x62,0x02,0x1C,
-
0xD2,0x12,0x1E,0x7E,0x12,0x24,0xE1,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x23,0xDB,0x12,
-
0x21,0xD9,0x12,0x1E,0x88,0x12,0x23,0x9B,0x12,0x1E,0x7E,0x12,0x25,0x8B,0x12,0x1F,
-
0xB0,0x50,0x0C,0x12,0x24,0x62,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,
-
0x1E,0x7E,0x12,0x26,0x45,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x25,0x14,0x12,0x1F,0x9F,
-
0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,0x24,0xEA,0x12,0x1F,0xB0,0x50,
-
0x0C,0x12,0x23,0xE7,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,
-
0x12,0x25,0x94,0x12,0x1F,0xB0,0x50,0x0C,0x12,0x24,0x6E,0x12,0x1F,0x9F,0x12,0x1E,
-
0x88,0x12,0x1F,0x22,0x12,0x1E,0x7E,0x12,0x26,0x4E,0x12,0x1F,0xB0,0x50,0x0C,0x12,
-
0x25,0x20,0x12,0x1F,0x9F,0x12,0x1E,0x88,0x12,0x1F,0x22,0xC3,0xED,0x94,0x6E,0xEC,
-
0x94,0x00,0x50,0x13,0x12,0x1F,0x30,0xFD,0x12,0x1F,0xC4,0x12,0x24,0x0B,0x2D,0x12,
-
0x22,0x31,0xE4,0xF0,0x02,0x1E,0x6C,0x7C,0x00,0x7D,0x02,0x12,0x1F,0x30,0xF5,0xCB,
-
0x12,0x1F,0xC4,0xF5,0xCC,0xD2,0xB5,0x30,0xB5,0x05,0x75,0x9E,0x55,0x80,0xF8,0xE5,
-
0xCA,0xC3,0x94,0x1E,0x90,0x13,0xD2,0x50,0x05,0x74,0x0F,0xF0,0x80,0x03,0x74,0x19,
-
0xF0,0x12,0x1F,0xB7,0x70,0x03,0x02,0x1E,0x6C,0x12,0x1F,0xC4,0x64,0x1D,0x70,0x03,
-
0x02,0x1E,0x6C,0x12,0x1F,0x30,0x70,0x03,0x02,0x1E,0x6C,0x12,0x1F,0x3D,0x64,0x13,
-
0x70,0x03,0x02,0x1E,0x6C,0x12,0x1F,0x30,0xFB,0x12,0x1F,0xC4,0x12,0x24,0x0B,0x2B,
-
0x12,0x22,0x31,0xE0,0x64,0x01,0x60,0x03,0x02,0x1E,0x6C,0xC3,0xE5,0xCA,0x95,0xB7,
-
0x12,0x25,0xB9,0x50,0x18,0x12,0x1F,0x30,0xFA,0x12,0x1F,0xC4,0x75,0xF0,0x14,0xA4,
-
0x24,0xEB,0xF5,0x82,0xE5,0xF0,0x34,0x0F,0x12,0x22,0x2C,0xED,0xF0,0xC3,0xE5,0xCA,
-
0x95,0xB9,0xC3,0x99,0x50,0x18,0x12,0x1F,0x30,0xFA,0x12,0x1F,0xC4,0x75,0xF0,0x14,
-
0xA4,0x24,0xEC,0xF5,0x82,0xE5,0xF0,0x34,0x0F,0x12,0x22,0x2C,0xED,0xF0,0xC3,0xE5,
-
0xCA,0x95,0xBA,0x12,0x25,0xB9,0x50,0x18,0x12,0x1F,0x30,0xFA,0x12,0x1F,0xC4,0x75,
-
0xF0,0x14,0xA4,0x24,0xED,0xF5,0x82,0xE5,0xF0,0x34,0x0F,0x12,0x22,0x2C,0xED,0xF0,
-
0xC3,0xE5,0xCA,0x95,0xBD,0xC3,0x99,0x50,0x18,0x12,0x1F,0x30,0xFA,0x12,0x1F,0xC4,
-
0x75,0xF0,0x14,0xA4,0x24,0xFF,0xF5,0x82,0xE5,0xF0,0x34,0x0F,0x12,0x22,0x2C,0xED,
-
0xF0,0xC3,0xE5,0xCA,0x95,0xBE,0x12,0x25,0xB9,0x50,0x18,0x12,0x1F,0x30,0xFA,0x12,
-
0x1F,0xC4,0x75,0xF0,0x14,0xA4,0x24,0x01,0xF5,0x82,0xE5,0xF0,0x34,0x10,0x12,0x22,
-
0x2C,0xED,0xF0,0xC3,0xE5,0xCA,0x95,0xC2,0xC3,0x99,0x50,0x18,0x12,0x1F,0x30,0xFA,
-
0x12,0x1F,0xC4,0x75,0xF0,0x14,0xA4,0x24,0x13,0xF5,0x82,0xE5,0xF0,0x34,0x10,0x12,
-
0x22,0x2C,0xED,0xF0,0xC3,0xE5,0xCA,0x95,0xC3,0x12,0x25,0xB9,0x50,0x18,0x12,0x1F,
-
0x30,0xFA,0x12,0x1F,0xC4,0x75,0xF0,0x14,0xA4,0x24,0x14,0xF5,0x82,0xE5,0xF0,0x34,
-
0x10,0x12,0x22,0x2C,0xED,0xF0,0xC3,0xE5,0xCA,0x95,0xC4,0xC3,0x99,0x50,0x1D,0x12,
-
0x1F,0x30,0xFC,0x12,0x1F,0xC4,0x75,0xF0,0x14,0xA4,0x24,0x15,0xF5,0x82,0xE5,0xF0,
-
0x34,0x10,0xF5,0x83,0xE5,0x82,0x2C,0x12,0x22,0x31,0xED,0xF0,0x90,0x13,0xB4,0xE0,
-
0x04,0xF0,0x70,0x06,0x90,0x13,0xB3,0xE0,0x04,0xF0,0x02,0x12,0xEB,0x22,0x90,0x13,
-
0xC7,0xE0,0xFE,0xA3,0xE0,0xFF,0x24,0x00,0xF5,0x82,0x74,0x60,0x3E,0xF5,0x83,0xE0,
-
0x22,0x90,0x13,0xB5,0xE0,0xFF,0x25,0xE0,0x25,0xE0,0x24,0x00,0xF5,0x82,0xE4,0x34,
-
0xF2,0xF5,0x83,0xE0,0xFC,0xA3,0xE0,0xFD,0x90,0x13,0xB4,0xE0,0xFE,0x25,0xE0,0x25,
-
0xE0,0x24,0x50,0xF5,0x82,0xE4,0x34,0xF2,0xF5,0x83,0xEC,0xF0,0xA3,0xED,0xF0,0xEF,
-
0x25,0xE0,0x25,0xE0,0x24,0x02,0xF5,0x82,0xE4,0x34,0xF2,0xF5,0x83,0xE0,0xFC,0xA3,
-
0xE0,0xFD,0xEE,0x25,0xE0,0x25,0xE0,0x24,0x52,0xF5,0x82,0xE4,0x34,0xF2,0xF5,0x83,
-
0xEC,0xF0,0xA3,0xED,0xF0,0x90,0x13,0xB5,0xE0,0xFF,0x25,0xE0,0x25,0xE0,0x24,0x00,
-
0xF5,0x82,0xE4,0x34,0xF2,0xF5,0x83,0xE0,0xFC,0xA3,0xE0,0xFD,0xEE,0x25,0xE0,0x25,
-
0xE0,0x24,0x00,0xF5,0x82,0xE4,0x34,0x89,0xF5,0x83,0xEC,0xF0,0xA3,0xED,0xF0,0xEF,
-
0x25,0xE0,0x25,0xE0,0x24,0x02,0xF5,0x82,0xE4,0x34,0xF2,0xF5,0x83,0xE0,0xFC,0xA3,
-
0xE0,0x22,0xC3,0x9B,0xFF,0xE4,0x94,0x00,0xFE,0xEF,0x2D,0xFD,0xEE,0x3C,0xFC,0x22,
-
0x90,0x13,0xB4,0xE0,0x25,0xE0,0xFF,0x90,0x13,0xB3,0xE0,0x33,0xFE,0x74,0x80,0x2F,
-
0xF5,0x82,0x74,0x81,0x3E,0xF5,0x83,0xE0,0x22,0x90,0x13,0xBB,0xE0,0xFD,0x25,0xE0,
-
0x25,0xE0,0x24,0x00,0xF5,0x82,0xE4,0x34,0x89,0xF5,0x83,0xE0,0xFE,0xA3,0xE0,0xFF,
-
0x90,0x13,0xBA,0xE0,0xFC,0x25,0xE0,0x25,0xE0,0x24,0x00,0xF5,0x82,0xE4,0x34,0xF2,
-
0xF5,0x83,0xE0,0xFA,0xA3,0xE0,0x2F,0xFF,0xEA,0x3E,0xC3,0x13,0xFE,0xEF,0x13,0xFF,
-
0xED,0x25,0xE0,0x25,0xE0,0x24,0x00,0xF5,0x82,0xE4,0x34,0x89,0xF5,0x83,0xEE,0xF0,
-
0xA3,0xEF,0xF0,0x22,0x90,0x13,0xC7,0xA3,0xE0,0x24,0x04,0xF5,0x82,0x74,0x60,0x3E,
-
0xF5,0x83,0xE0,0xFB,0x74,0x00,0x2F,0x22,0xFB,0x74,0x02,0x2F,0xF5,0x82,0x74,0x60,
-
0x3E,0xF5,0x83,0xE0,0xC3,0x9B,0x22,0x90,0x13,0xB4,0xE0,0x25,0xE0,0xFF,0x90,0x13,
-
0xB3,0xE0,0x33,0xFE,0x74,0x81,0x2F,0xF5,0x82,0x74,0x81,0x3E,0xF5,0x83,0xE0,0x22,
-
0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0x74,0x01,0xF0,0x90,0x13,0xB5,0xE0,0xFF,0x25,
-
0xE0,0x25,0xE0,0x24,0x00,0xF5,0x82,0xE4,0x34,0xF2,0x22,0xFD,0xEF,0x25,0xE0,0x25,
-
0xE0,0x24,0x50,0xF5,0x82,0xE4,0x34,0x89,0xF5,0x83,0xEC,0xF0,0xA3,0xED,0xF0,0x90,
-
0x13,0xBB,0xE0,0xFF,0x25,0xE0,0x25,0xE0,0x24,0x02,0xF5,0x82,0xE4,0x34,0x89,0x22,
-
0x90,0x13,0xB3,0xE0,0xFD,0x25,0xE0,0x25,0xE0,0x24,0xAE,0xF5,0x82,0xE4,0x34,0x89,
-
0xF5,0x83,0xEE,0xF0,0xA3,0xEF,0xF0,0xED,0x25,0xE0,0x25,0xE0,0x24,0xAE,0xF5,0x82,
-
0xE4,0x34,0x89,0xF5,0x83,0xE0,0xFE,0xA3,0xE0,0xFF,0xC3,0x74,0xAF,0x9F,0xFF,0x74,
-
0x04,0x9E,0xFE,0xED,0x25,0xE0,0x25,0xE0,0x24,0xAE,0xF5,0x82,0xE4,0x34,0x89,0x22,
-
0xF5,0x83,0xE0,0xFA,0xA3,0xE0,0x2F,0xFF,0xEA,0x3E,0xFE,0xED,0x25,0xE0,0x25,0xE0,
-
0x24,0x00,0xF5,0x82,0xE4,0x34,0x89,0xF5,0x83,0xE0,0xFA,0xA3,0xE0,0x2F,0xFF,0xEA,
-
0x3E,0xFE,0x22,0xED,0x04,0x33,0x33,0x33,0x54,0xF8,0xFF,0x74,0xE5,0x2D,0xF5,0x82,
-
0xE4,0x34,0x88,0xF5,0x83,0x22,0xAF,0xE1,0xEF,0x25,0xE0,0x24,0x83,0xF5,0x82,0xE4,
-
0x34,0x13,0xF5,0x83,0x22,0x75,0xF0,0x04,0x12,0x44,0x16,0xE0,0xFC,0xA3,0xE0,0xFD,
-
0xA3,0xE0,0xFE,0xA3,0xE0,0xFF,0x22,0xF5,0x83,0xE4,0xF0,0x90,0x8F,0xF0,0xE0,0x75,
-
0xF0,0x06,0xA4,0x22,0x9E,0xFE,0xEF,0xC4,0xF8,0x54,0x0F,0xC8,0x68,0xFF,0xEE,0xC4,
-
0x54,0xF0,0x48,0xFE,0x7C,0x00,0x7D,0x20,0x12,0x43,0x1A,0xEB,0x25,0xE0,0x25,0xE0,
-
0x24,0x50,0xF5,0x82,0xE4,0x34,0x89,0x22,0xFD,0xEE,0x25,0xE0,0x25,0xE0,0x24,0x52,
-
0xF5,0x82,0xE4,0x34,0xF2,0xF5,0x83,0xEC,0xF0,0xA3,0xED,0xF0,0x90,0x13,0xBA,0xE0,
-
0xFF,0x24,0x00,0xF5,0x82,0xE4,0x34,0x8A,0xF5,0x83,0xE0,0x90,0x13,0xBB,0xFE,0xE0,
-
0xFD,0x24,0x14,0xF5,0x82,0xE4,0x34,0x8A,0xF5,0x83,0xEE,0xF0,0x74,0x28,0x2F,0xF5,
-
0x82,0xE4,0x34,0x8A,0xF5,0x83,0xE0,0xFF,0x74,0x3C,0x2D,0xF5,0x82,0xE4,0x34,0x8A,
-
0xF5,0x83,0x22,0xF5,0x83,0xE0,0xFE,0xA3,0xE0,0xFF,0x90,0x13,0xB3,0xE0,0xFD,0x25,
-
0xE0,0x25,0xE0,0x24,0xAC,0xF5,0x82,0xE4,0x34,0x89,0x22,0x9E,0xFE,0xEF,0xC4,0xF8,
-
0x54,0x0F,0xC8,0x68,0xFF,0xEE,0xC4,0x54,0xF0,0x48,0xFE,0x7C,0x00,0x7D,0x20,0x12,
-
0x43,0x1A,0xEB,0x25,0xE0,0x25,0xE0,0x24,0x52,0xF5,0x82,0xE4,0x34,0x89,0x22,0x90,
-
0x13,0xBB,0xE0,0xFF,0x24,0x83,0xF5,0x82,0xE4,0x34,0x12,0xF5,0x83,0x22,0xAF,0xDF,
-
0xEF,0x25,0xE0,0x25,0xE0,0x24,0x02,0xF5,0x82,0xE4,0x34,0xF2,0xF5,0x83,0xE0,0xFE,
-
0xA3,0xE0,0x22,0x90,0x13,0xB3,0xE0,0x75,0xF0,0x14,0xA4,0x24,0xB4,0xF5,0x82,0xE4,
-
0x34,0x37,0xF5,0x83,0x22,0x12,0x43,0xD9,0x90,0x13,0xB3,0xE0,0xFD,0x25,0xE0,0x24,
-
0x53,0xF5,0x82,0xE4,0x34,0x50,0xF5,0x83,0xE0,0xFE,0xED,0x25,0xE0,0x24,0x52,0xF5,
-
0x82,0xE4,0x34,0x50,0xF5,0x83,0xE0,0x7C,0x00,0x24,0x00,0xFF,0xEC,0x3E,0xFE,0x90,
-
0x13,0xB3,0xE0,0x24,0x00,0xF5,0x82,0xE4,0x34,0x50,0xF5,0x83,0xE0,0x22,0x90,0x13,
-
0xC7,0xA3,0xE0,0x24,0x02,0xF5,0x82,0x74,0x60,0x3E,0xF5,0x83,0xE0,0xFD,0x74,0x00,
-
0x2F,0x22,0x90,0x13,0xBA,0xE0,0xFD,0x25,0xE0,0x25,0xE0,0x24,0x02,0xF5,0x82,0xE4,
-
0x34,0xF2,0x22,0x90,0x13,0xBB,0xE0,0xFD,0x25,0xE0,0x25,0xE0,0x24,0x00,0xF5,0x82,
-
0xE4,0x34,0x89,0xF5,0x83,0xA3,0xE0,0x25,0xE0,0xFF,0x05,0x82,0x22,0x90,0x13,0xBA,
-
0xE0,0xFF,0x24,0xE3,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0xE0,0xFE,0x90,0x13,0xBB,
-
0xE0,0xFD,0x24,0xA2,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0x22,0xF5,0x83,0xE5,0x82,
-
0x2A,0xF5,0x82,0xE4,0x35,0x83,0xF5,0x83,0x22,0xF5,0x83,0xE0,0x7C,0x00,0x24,0x00,
-
0xFF,0xEC,0x3E,0xFE,0x7D,0x14,0x12,0x42,0xC5,0x90,0x13,0xCB,0xEE,0xF0,0xA3,0xEF,
-
0xF0,0x90,0x13,0xB4,0xE0,0x25,0xE0,0xFD,0x90,0x13,0xB3,0xE0,0x33,0xFC,0x74,0x80,
-
0x2D,0xF5,0x82,0x74,0x81,0x3C,0xF5,0x83,0xE0,0x25,0xE0,0x22,0x90,0x14,0x03,0xEE,
-
0xF0,0xA3,0xEF,0xF0,0x90,0x14,0x03,0xE0,0xFE,0xA3,0xE0,0xFF,0x90,0x14,0x02,0xE0,
-
0x2F,0xFF,0x90,0x14,0x01,0xE0,0x3E,0xFE,0x90,0x14,0x05,0xF0,0xA3,0xEF,0xF0,0xD3,
-
0x94,0x12,0xEE,0x94,0x00,0x22,0x90,0x13,0xB3,0xE0,0xFF,0x24,0xBD,0xF5,0x82,0xE4,
-
0x34,0x13,0xF5,0x83,0x22,0xF5,0x83,0x74,0xFF,0xF0,0xEF,0x75,0xF0,0x06,0xA4,0x22,
-
0x90,0x88,0xC1,0xE0,0xFF,0x90,0x13,0xB3,0xE0,0xFE,0xC3,0x9F,0x22,0x90,0x13,0xBB,
-
0xE0,0xFF,0x25,0xE0,0x25,0xE0,0x24,0x00,0xF5,0x82,0xE4,0x34,0x89,0x22,0x74,0xD3,
-
0x2E,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0xE0,0xFF,0x74,0xD8,0x2E,0xF5,0x82,0xE4,
-
0x34,0x13,0xF5,0x83,0xEF,0xF0,0x90,0x13,0xB3,0xE0,0x04,0xF0,0x22,0xE4,0xF0,0xA3,
-
0x74,0x64,0xF0,0x74,0x79,0x2F,0xF5,0x82,0xE4,0x34,0x12,0xF5,0x83,0xE4,0xF0,0x90,
-
0x88,0xC0,0xE0,0x14,0xF0,0x90,0x13,0xB8,0xE0,0x04,0xF0,0x74,0xD1,0x2F,0xF5,0x82,
-
0xE4,0x34,0x88,0xF5,0x83,0xE4,0xF0,0x22,0xEF,0xF0,0x90,0x13,0xBA,0xE0,0x24,0xA0,
-
0xF5,0x82,0xE4,0x34,0x37,0xF5,0x83,0xE4,0xF0,0x90,0x13,0xB8,0xE0,0x04,0xF0,0x90,
-
0x88,0xC0,0xE0,0x14,0xF0,0x90,0x88,0xC1,0xE0,0x14,0xF0,0x22,0xE4,0xFC,0xFD,0x90,
-
0x13,0xB6,0x12,0x43,0xD9,0x90,0x13,0xB6,0xA3,0xA3,0xE0,0xFE,0xA3,0xE0,0xFD,0xAC,
-
0x06,0x22,0x90,0xF1,0x06,0xAE,0x0B,0xE0,0xFF,0xEE,0x8F,0xF0,0xA4,0x24,0x9C,0xFF,
-
0xE5,0xF0,0x34,0xFF,0xFE,0x22,0x74,0x02,0xF0,0x74,0x98,0x2F,0xF5,0x82,0xE4,0x34,
-
0x13,0xF5,0x83,0x22,0xFD,0x90,0x13,0xBB,0xE0,0xFE,0x25,0xE0,0x25,0xE0,0x24,0x50,
-
0xF5,0x82,0xE4,0x34,0xF2,0x22,0xFD,0xEE,0x25,0xE0,0x25,0xE0,0x24,0x9A,0xF5,0x82,
-
0xE4,0x34,0x12,0xF5,0x83,0xEC,0xF0,0xA3,0xED,0xF0,0x22,0xC3,0x9D,0xFD,0xE4,0x94,
-
0x00,0xFC,0x22,0x90,0x13,0xBB,0xE0,0xFF,0x24,0x79,0xF5,0x82,0xE4,0x34,0x12,0xF5,
-
0x83,0x22,0xE0,0xFD,0x74,0xD3,0x2F,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0xED,0xF0,
-
0x90,0x13,0xCF,0xE0,0xF8,0xA3,0xE0,0xF9,0xA3,0xE0,0xFA,0xA3,0xE0,0xFB,0x22,0x90,
-
0x13,0xC7,0xA3,0xE0,0x24,0xFE,0xF5,0x82,0x74,0x5F,0x22,0x90,0x13,0xC7,0xA3,0xE0,
-
0x24,0x28,0xF5,0x82,0x74,0x60,0x22,0x90,0x13,0xC7,0xA3,0xE0,0x24,0xD8,0xF5,0x82,
-
0x74,0x5F,0x22,0xE0,0xF8,0xA3,0xE0,0xF9,0xA3,0xE0,0xFA,0xA3,0xE0,0xFB,0xEF,0x2B,
-
0xFF,0xEE,0x3A,0xFE,0xED,0x39,0xFD,0xEC,0x38,0xFC,0x22,0x75,0xF0,0x14,0xA4,0x24,
-
0x00,0xF5,0x82,0xE5,0xF0,0x34,0x10,0xF5,0x83,0xE5,0x82,0x22,0xF0,0x90,0x13,0xB3,
-
0xE0,0xFF,0x75,0xF0,0x04,0xA4,0x22,0x90,0x13,0xB3,0xE0,0x75,0xF0,0x04,0xA4,0x24,
-
0x80,0xF5,0x82,0xE5,0xF0,0x34,0x86,0xF5,0x83,0x22,0xC2,0xDA,0xC2,0x11,0xAF,0xA6,
-
0xAD,0xA7,0xEF,0xFE,0x7C,0x00,0xE4,0x2D,0x22,0xEF,0x25,0xE0,0x25,0xE0,0x24,0x98,
-
0xF5,0x82,0xE4,0x34,0x12,0x22,0x90,0x13,0xC7,0xA3,0xE0,0x24,0xFC,0xF5,0x82,0x74,
-
0x5F,0x22,0x90,0x13,0xC7,0xA3,0xE0,0x24,0x50,0xF5,0x82,0x74,0x60,0x22,0x90,0x13,
-
0xC7,0xA3,0xE0,0x24,0xB0,0xF5,0x82,0x74,0x5F,0x22,0x90,0x13,0xB4,0xE0,0x25,0xE0,
-
0xFD,0x90,0x13,0xB3,0xE0,0x33,0xFC,0x74,0x81,0x2D,0xF5,0x82,0x74,0x81,0x22,0xE0,
-
0xFD,0xEF,0x25,0xE0,0x24,0xED,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0xE0,0xFE,0xA3,
-
0xE0,0xD3,0x9D,0x74,0x80,0xF8,0xEE,0x64,0x80,0x98,0x90,0x13,0xBB,0xE0,0x22,0x90,
-
0x13,0xCB,0xE0,0xFC,0xA3,0xE0,0xFD,0xA3,0xE0,0xFE,0xA3,0xE0,0xFF,0x22,0x7B,0xE0,
-
0x7A,0x2E,0xE4,0xF9,0xF8,0xC3,0x02,0x43,0xB5,0x90,0x13,0xB5,0xE0,0xFF,0x24,0x00,
-
0xF5,0x82,0xE4,0x34,0x8A,0xF5,0x83,0x22,0xFB,0x74,0xFE,0x2F,0xF5,0x82,0x74,0x5F,
-
0x22,0xFB,0x74,0x28,0x2F,0xF5,0x82,0x74,0x60,0x22,0xFB,0x74,0xD8,0x2F,0xF5,0x82,
-
0x74,0x5F,0x22,0x90,0x13,0xB4,0xE0,0xFF,0xC3,0x95,0x0D,0x22,0x90,0x13,0xC7,0xA3,
-
0xE0,0x24,0x06,0xF5,0x82,0x74,0x60,0x22,0x90,0x13,0xC7,0xA3,0xE0,0x24,0xFA,0xF5,
-
0x82,0x74,0x5F,0x22,0x90,0x13,0xC7,0xA3,0xE0,0x24,0x78,0xF5,0x82,0x74,0x60,0x22,
-
0x90,0x13,0xC7,0xA3,0xE0,0x24,0x88,0xF5,0x82,0x74,0x5F,0x22,0x25,0xE0,0x25,0xE0,
-
0x24,0x52,0xF5,0x82,0xE4,0x34,0xF2,0x22,0x90,0xF1,0x0A,0x74,0x01,0xF0,0x22,0x90,
-
0x13,0xB8,0xE0,0xC3,0x95,0x0D,0x22,0x74,0xC2,0x2E,0xF5,0x82,0xE4,0x34,0x13,0xF5,
-
0x83,0x22,0x15,0x82,0xE0,0x33,0xFE,0x90,0x13,0xBB,0xE0,0xFC,0x22,0xF5,0x83,0xE0,
-
0xFA,0xA3,0xE0,0x2F,0xFF,0xEA,0x3E,0xC3,0x13,0xFE,0xEF,0x13,0xFF,0x22,0xD3,0x9F,
-
0xEE,0x64,0x80,0xF8,0xEC,0x64,0x80,0x98,0x22,0xFB,0x74,0x04,0x2F,0xF5,0x82,0x74,
-
0x60,0x22,0xFB,0x74,0xFC,0x2F,0xF5,0x82,0x74,0x5F,0x22,0xFB,0x74,0x50,0x2F,0xF5,
-
0x82,0x74,0x60,0x22,0xFB,0x74,0xB0,0x2F,0xF5,0x82,0x74,0x5F,0x22,0xD3,0x90,0x14,
-
0x06,0xE0,0x94,0x78,0x90,0x14,0x05,0xE0,0x94,0x00,0x22,0xD3,0x90,0x14,0x06,0xE0,
-
0x94,0x72,0x90,0x14,0x05,0xE0,0x94,0x01,0x22,0xFF,0x90,0x13,0xD2,0xE0,0xF9,0xEF,
-
0xC3,0x99,0x22,0x25,0xE0,0x24,0xC0,0xF5,0x82,0xE4,0x34,0x87,0x22,0x75,0xF0,0x04,
-
0x12,0x44,0x16,0xE0,0xF8,0xA3,0xE0,0xF9,0xA3,0xE0,0xFA,0xA3,0xE0,0xFB,0xC3,0x02,
-
0x43,0xB5,0x24,0x05,0xF5,0x82,0xE4,0x34,0x8F,0xF5,0x83,0x22,0x24,0x7D,0xF5,0x82,
-
0xE4,0x34,0x8F,0xF5,0x83,0x22,0xED,0x25,0xE0,0x25,0xE0,0x24,0x9A,0xF5,0x82,0xE4,
-
0x34,0x12,0x22,0x90,0x13,0xC7,0xA3,0xE0,0x24,0x08,0xF5,0x82,0x74,0x60,0x22,0x90,
-
0x13,0xC7,0xA3,0xE0,0x24,0xF8,0xF5,0x82,0x74,0x5F,0x22,0x90,0x13,0xC7,0xA3,0xE0,
-
0x24,0xA0,0xF5,0x82,0x74,0x60,0x22,0x90,0x13,0xC7,0xA3,0xE0,0x24,0x60,0xF5,0x82,
-
0x74,0x5F,0x22,0xFB,0x74,0x06,0x2F,0xF5,0x82,0x74,0x60,0x22,0xFB,0x74,0xFA,0x2F,
-
0xF5,0x82,0x74,0x5F,0x22,0xFB,0x74,0x78,0x2F,0xF5,0x82,0x74,0x60,0x22,0xFB,0x74,
-
0x88,0x2F,0xF5,0x82,0x74,0x5F,0x22,0x90,0x13,0xB4,0xE0,0x04,0xF0,0x22,0xEB,0x2F,
-
0xFF,0xEA,0x3E,0xFE,0xE9,0x3D,0xFD,0xE8,0x3C,0xFC,0x90,0x13,0xCF,0x02,0x43,0xD9,
-
0xE4,0xF0,0xA3,0x74,0x64,0xF0,0x22,0x90,0x13,0xB3,0xE0,0xFF,0xC3,0x95,0x0D,0x22,
-
0x74,0x14,0x2F,0xF5,0x82,0xE4,0x34,0x8A,0xF5,0x83,0xE0,0xC3,0x94,0x01,0x74,0x80,
-
0x94,0x88,0x22,0xF5,0x83,0xE0,0xFE,0xA3,0xE0,0x78,0x04,0x22,0x75,0xF0,0x14,0xA4,
-
0x24,0x30,0xF5,0x82,0xE5,0xF0,0x34,0x3F,0xF5,0x83,0xE5,0x82,0x2D,0x22,0x24,0x60,
-
0xF5,0x82,0xE4,0x34,0x88,0xF5,0x83,0x22,0x90,0x13,0xB4,0xE0,0x24,0x28,0xF5,0x82,
-
0xE4,0x34,0x8A,0xF5,0x83,0x22,0x2E,0xF5,0x82,0xE4,0x34,0x37,0xF5,0x83,0x22,0xE4,
-
0xF0,0x74,0xBE,0x2F,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0xE0,0x04,0xF0,0xD2,0x1B,
-
0x22,0xAF,0x0B,0x90,0xF1,0x06,0xE0,0x8F,0xF0,0xA4,0x24,0xFF,0x22,0x78,0x11,0xE6,
-
0x24,0x14,0x33,0x33,0x33,0x54,0xF8,0xFF,0x78,0x10,0xE6,0xFE,0x4F,0xFF,0x22,0xA3,
-
0xE0,0x24,0x00,0xF5,0x82,0x74,0x60,0x3C,0xF5,0x83,0xE0,0xD3,0x9F,0xE4,0x9E,0x22,
-
0x7D,0x01,0x7B,0xFF,0x7E,0x00,0x02,0x42,0x7B,0x90,0x13,0xE2,0xE0,0xFF,0x90,0x88,
-
0xC1,0xE0,0x22,0x90,0x13,0xB4,0xE0,0x24,0xE5,0x22,0x24,0xDD,0xF5,0x82,0xE4,0x34,
-
0x13,0xF5,0x83,0x22,0x90,0x13,0xB5,0xE0,0x04,0xF0,0x22,0xE0,0xFE,0xA3,0xE0,0xFF,
-
0xE4,0xFC,0xFD,0x7A,0x01,0xF9,0xF8,0x02,0x43,0x66,0xE0,0xFD,0x90,0x14,0x05,0xE0,
-
0xFA,0xA3,0xE0,0xFB,0xD3,0x9D,0xEA,0x94,0x00,0x22,0xF5,0x83,0xE0,0xFD,0xA3,0xE0,
-
0x90,0x13,0xB4,0xCD,0xF0,0xA3,0xED,0xF0,0xEF,0x22,0xF5,0x83,0xEE,0xF0,0xA3,0xEF,
-
0xF0,0x22,0x24,0x04,0xF5,0x82,0xE4,0x34,0x8F,0x22,0x74,0xFF,0xF0,0x90,0x13,0xB3,
-
0xE0,0x04,0xF0,0x22,0x24,0x7C,0xF5,0x82,0xE4,0x34,0x8F,0x22,0x2D,0xFD,0xE0,0x34,
-
0x00,0xCD,0x2F,0xFF,0xEE,0x3D,0xFE,0x90,0x13,0xC7,0x22,0x75,0xF0,0x04,0xA4,0x24,
-
0x00,0xF5,0x82,0xE5,0xF0,0x34,0x84,0xF5,0x83,0x22,0x75,0xF0,0x04,0xA4,0x24,0x40,
-
0xF5,0x82,0xE5,0xF0,0x34,0x85,0xF5,0x83,0x22,0xFF,0xEC,0x3E,0xCF,0x24,0x20,0xCF,
-
0x34,0x00,0xFE,0x90,0x13,0xB4,0xE0,0x22,0xFF,0xFB,0xAA,0x06,0xE4,0xF9,0xF8,0xA3,
-
0xE4,0xFC,0xFD,0x02,0x43,0x66,0xE4,0xF0,0x90,0x8F,0xF0,0xE0,0x04,0xF0,0x22,0xFB,
-
0x74,0x08,0x2F,0xF5,0x82,0x74,0x60,0x22,0xFB,0x74,0xF8,0x2F,0xF5,0x82,0x74,0x5F,
-
0x22,0xFB,0x74,0xA0,0x2F,0xF5,0x82,0x74,0x60,0x22,0xFB,0x74,0x60,0x2F,0xF5,0x82,
-
0x74,0x5F,0x22,0x90,0x14,0x01,0xEE,0xF0,0xA3,0xEF,0xF0,0x22,0x24,0xD8,0xF5,0x82,
-
0xE4,0x34,0x13,0xF5,0x83,0x22,0xF5,0x83,0xA3,0xE0,0xC4,0xF8,0x54,0x0F,0xC8,0x68,
-
0xFF,0x05,0x82,0x22,0xF0,0x75,0xF0,0x04,0xEF,0xA4,0x22,0xF5,0x83,0xE0,0xFA,0xA3,
-
0xE0,0x22,0xE0,0x24,0xBC,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0xE0,0xFF,0x22,0xFD,
-
0x90,0x13,0xBB,0xE0,0xFE,0x22,0xFF,0x90,0x13,0xBB,0xE0,0xFD,0x22,0xC3,0x9D,0xFF,
-
0xEE,0x9C,0xFE,0x22,0x74,0x16,0xF0,0x90,0xF1,0x0A,0x74,0x02,0xF0,0x22,0xC3,0x9F,
-
0xFF,0xEC,0x9E,0xFE,0x22,0x90,0x13,0xB3,0xE0,0x24,0xE5,0x22,0xCE,0xA2,0xE7,0x13,
-
0xCE,0x13,0x22,0x90,0x13,0xB3,0xE0,0xFC,0xA3,0xE0,0xFD,0x22,0xE0,0xFE,0xA3,0xE0,
-
0xFF,0xD3,0x94,0x20,0xEE,0x94,0x00,0x22,0x90,0x13,0xC7,0xA3,0xE0,0x24,0x0A,0xF5,
-
0x82,0x74,0x60,0x22,0x90,0x13,0xC7,0xA3,0xE0,0x24,0xF6,0xF5,0x82,0x74,0x5F,0x22,
-
0x90,0x13,0xC7,0xA3,0xE0,0x24,0x02,0xF5,0x82,0x74,0x60,0x22,0x90,0x13,0xC7,0xA3,
-
0xE0,0x24,0xC8,0xF5,0x82,0x74,0x60,0x22,0x90,0x13,0xC7,0xA3,0xE0,0x24,0x38,0xF5,
-
0x82,0x74,0x5F,0x22,0xE0,0xFF,0x90,0x13,0xB5,0xE0,0xFE,0xC3,0x22,0x90,0x13,0xCB,
-
0x12,0x43,0xD9,0xE4,0x90,0x13,0xB3,0xF0,0x22,0x90,0x12,0x96,0xE0,0xD3,0x94,0x00,
-
0x22,0x90,0x12,0x97,0xE0,0xD3,0x94,0x00,0x22,0x74,0x06,0xF0,0xA3,0x74,0x40,0xF0,
-
0x22,0x24,0x03,0xF5,0x82,0xE4,0x34,0x8F,0x22,0x24,0x00,0xF5,0x82,0xE4,0x34,0x8F,
-
0x22,0x24,0x01,0xF5,0x82,0xE4,0x34,0x8F,0x22,0x24,0x02,0xF5,0x82,0xE4,0x34,0x8F,
-
0x22,0x24,0x7B,0xF5,0x82,0xE4,0x34,0x8F,0x22,0x24,0x78,0xF5,0x82,0xE4,0x34,0x8F,
-
0x22,0x24,0x79,0xF5,0x82,0xE4,0x34,0x8F,0x22,0x24,0x7A,0xF5,0x82,0xE4,0x34,0x8F,
-
0x22,0xF5,0xA9,0xEC,0xF5,0xAA,0xED,0xF5,0xAB,0xE4,0xF5,0xA2,0x22,0xE4,0x93,0xFF,
-
0x7E,0x00,0x90,0xF1,0x03,0xE0,0xFD,0x22,0xF5,0x83,0xE0,0xF5,0xA9,0x75,0xF0,0x04,
-
0xEF,0xA4,0x22,0xE0,0x90,0x13,0xB9,0xF0,0xE4,0x90,0x13,0xB3,0xF0,0x22,0x15,0x82,
-
0xE0,0x33,0xFE,0x90,0x13,0xBA,0xE0,0xFC,0x22,0x2F,0xFF,0xEC,0x3E,0xFE,0x90,0x13,
-
0xBB,0xE0,0xFD,0x22,0xE0,0xFF,0x90,0x88,0xC0,0xE0,0x22,0x90,0x13,0xB9,0xE0,0xFF,
-
0x90,0x13,0xB3,0xE0,0x22,0x90,0x12,0x60,0xE0,0x94,0x00,0x22,0x90,0x12,0x96,0xE0,
-
0x04,0xF0,0x22,0x90,0x12,0x97,0xE0,0x04,0xF0,0x22,0xE0,0xFE,0x90,0x13,0xB5,0xE0,
-
0xFF,0xC3,0x9E,0x22,0xF5,0x83,0x74,0x7F,0xF0,0xA3,0x74,0xFF,0xF0,0x22,0x85,0xD9,
-
0xD9,0x85,0xDA,0xDA,0x85,0xDB,0xDB,0x22,0x85,0xDC,0xDC,0x85,0xDD,0xDD,0x85,0xDE,
-
0xDE,0x22,0xF5,0x83,0xE0,0xA3,0xE0,0x54,0x0F,0x4F,0xFF,0x22,0x90,0x8F,0xF0,0xE0,
-
0xFF,0x90,0x12,0x5F,0xE0,0x22,0x90,0xF1,0x93,0x74,0x01,0xF0,0xE4,0x90,0xF1,0x46,
-
0xF0,0x90,0xF1,0x1B,0xF0,0x90,0xF0,0x02,0x74,0x08,0x30,0x04,0x03,0x02,0x2C,0x2F,
-
0x12,0x45,0xFD,0x74,0x20,0xF0,0xE4,0x90,0xF0,0x0F,0xF0,0x74,0x20,0x12,0x46,0x65,
-
0x74,0x20,0xF0,0x90,0xF0,0x13,0x74,0x02,0xF0,0x74,0x20,0x12,0x46,0x73,0x74,0x20,
-
0xF0,0x90,0xF0,0x17,0x74,0x04,0xF0,0x90,0xF0,0x1A,0x74,0x20,0xF0,0x90,0xF0,0x19,
-
0x74,0x05,0xF0,0x90,0xF0,0x1C,0x74,0x20,0xF0,0x90,0xF0,0x1B,0x74,0x06,0xF0,0x90,
-
0xF0,0x1E,0x74,0x20,0xF0,0x90,0xF0,0x1D,0x74,0x07,0xF0,0x90,0xF0,0x20,0x74,0x20,
-
0xF0,0x90,0xF0,0x1F,0x74,0x08,0xF0,0x90,0xF0,0x22,0x74,0x20,0xF0,0x90,0xF0,0x21,
-
0x74,0x09,0xF0,0x90,0xF0,0x24,0x74,0x20,0xF0,0x90,0xF0,0x23,0x74,0x0A,0xF0,0x90,
-
0xF0,0x26,0x74,0x20,0xF0,0x90,0xF0,0x25,0x74,0x0B,0xF0,0x90,0xF0,0x28,0x74,0x20,
-
0xF0,0x90,0xF0,0x27,0x74,0x0C,0xF0,0x90,0xF0,0x2A,0x74,0x20,0xF0,0x90,0xF0,0x29,
-
0x74,0x0D,0xF0,0x90,0xF0,0x2C,0x74,0x20,0xF0,0x90,0xF0,0x2B,0x74,0x0E,0xF0,0x90,
-
0xF0,0x2E,0x74,0x20,0xF0,0x90,0xF0,0x2D,0x74,0x0F,0xF0,0x90,0xF0,0x30,0x74,0x20,
-
0xF0,0x90,0xF0,0x2F,0x74,0x10,0x12,0x44,0xEE,0x74,0x20,0xF0,0x90,0xF0,0x4F,0x74,
-
0x11,0xF0,0x90,0xF0,0x52,0x74,0x20,0xF0,0x90,0xF0,0x51,0x74,0x12,0xF0,0x90,0xF0,
-
0x54,0x74,0x20,0xF0,0x90,0xF0,0x53,0x74,0x13,0xF0,0x90,0xF0,0x56,0x74,0x20,0xF0,
-
0x90,0xF0,0x55,0x74,0x14,0xF0,0x90,0xF0,0x58,0x74,0x20,0xF0,0x90,0xF0,0x57,0x74,
-
0x15,0xF0,0x90,0xF0,0x5A,0x74,0x20,0xF0,0x90,0xF0,0x59,0x74,0x16,0xF0,0x90,0xF0,
-
0x5C,0x74,0x20,0xF0,0x90,0xF0,0x5B,0x74,0x17,0xF0,0x90,0xF0,0x5E,0x74,0x20,0xF0,
-
0x90,0xF0,0x5D,0x74,0x18,0xF0,0x90,0xF0,0x60,0x74,0x20,0xF0,0x90,0xF0,0x5F,0x74,
-
0x19,0xF0,0x90,0xF0,0x62,0x74,0x20,0xF0,0x90,0xF0,0x61,0x74,0x1A,0xF0,0x90,0xF0,
-
0x64,0x74,0x20,0xF0,0x90,0xF0,0x63,0x74,0x1B,0xF0,0x90,0xF0,0x66,0x74,0x20,0xF0,
-
0x90,0xF0,0x65,0x74,0x1C,0xF0,0x90,0xF0,0x68,0x74,0x20,0xF0,0x90,0xF0,0x67,0x74,
-
0x1D,0xF0,0x90,0xF0,0x6A,0x74,0x16,0xF0,0x90,0xF0,0x69,0x74,0x01,0xF0,0x90,0xF0,
-
0x6C,0x74,0x16,0xF0,0xE4,0x90,0xF0,0x6B,0xF0,0x90,0xF0,0x6E,0x74,0x15,0xF0,0x90,
-
0xF0,0x6D,0x74,0x02,0xF0,0x90,0xF0,0x70,0x74,0x15,0xF0,0x74,0x01,0x12,0x44,0x36,
-
0x74,0x15,0xF0,0xE4,0x90,0xF0,0x91,0xF0,0x90,0xF0,0x94,0x74,0x14,0xF0,0x90,0xF0,
-
0x93,0x74,0x02,0xF0,0x90,0xF0,0x96,0x74,0x14,0xF0,0x90,0xF0,0x95,0x74,0x01,0xF0,
-
0x90,0xF0,0x98,0x74,0x14,0xF0,0xE4,0x90,0xF0,0x97,0xF0,0x90,0xF0,0x9A,0x74,0x13,
-
0xF0,0x90,0xF0,0x99,0x74,0x02,0xF0,0x90,0xF0,0x9C,0x74,0x13,0xF0,0x90,0xF0,0x9B,
-
0x74,0x01,0xF0,0x90,0xF0,0x9E,0x74,0x13,0xF0,0xE4,0x90,0xF0,0x9D,0xF0,0x90,0xF0,
-
0xA0,0x74,0x12,0xF0,0x90,0xF0,0x9F,0x74,0x02,0xF0,0x90,0xF0,0xA2,0x74,0x12,0xF0,
-
0x90,0xF0,0xA1,0x74,0x01,0xF0,0x90,0xF0,0xA4,0x74,0x12,0xF0,0xE4,0x90,0xF0,0xA3,
-
0xF0,0x90,0xF0,0xA6,0x74,0x11,0xF0,0x90,0xF0,0xA5,0x74,0x02,0xF0,0x90,0xF0,0xA8,
-
0x74,0x11,0xF0,0x90,0xF0,0xA7,0x74,0x01,0xF0,0x90,0xF0,0xAA,0x74,0x11,0xF0,0xE4,
-
0x90,0xF0,0xA9,0xF0,0x74,0x10,0x12,0x46,0x81,0x74,0x10,0xF0,0x90,0xF0,0xAD,0x74,
-
0x01,0xF0,0x74,0x10,0x12,0x45,0x98,0x74,0x14,0xF0,0x90,0xF1,0x07,0x74,0x1E,0xF0,
-
0x74,0x03,0x12,0x46,0x49,0x14,0xF0,0xE4,0x90,0xF1,0x15,0xF0,0x02,0x2E,0x6A,0x12,
-
0x45,0xFD,0x74,0x10,0xF0,0xE4,0x90,0xF0,0x0F,0xF0,0x74,0x10,0x12,0x46,0x65,0x74,
-
0x10,0xF0,0x90,0xF0,0x13,0x74,0x02,0xF0,0x74,0x10,0x12,0x46,0x73,0x74,0x11,0xF0,
-
0xE4,0x90,0xF0,0x17,0xF0,0x90,0xF0,0x1A,0x74,0x11,0xF0,0x90,0xF0,0x19,0x74,0x01,
-
0xF0,0x90,0xF0,0x1C,0x74,0x11,0xF0,0x90,0xF0,0x1B,0x74,0x02,0xF0,0x90,0xF0,0x1E,
-
0x74,0x11,0xF0,0x90,0xF0,0x1D,0x74,0x03,0xF0,0x90,0xF0,0x20,0x74,0x12,0xF0,0xE4,
-
0x90,0xF0,0x1F,0xF0,0x90,0xF0,0x22,0x74,0x12,0xF0,0x90,0xF0,0x21,0x74,0x01,0xF0,
-
0x90,0xF0,0x24,0x74,0x12,0xF0,0x90,0xF0,0x23,0x74,0x02,0xF0,0x90,0xF0,0x26,0x74,
-
0x12,0xF0,0x90,0xF0,0x25,0x74,0x03,0xF0,0x90,0xF0,0x28,0x74,0x13,0xF0,0xE4,0x90,
-
0xF0,0x27,0xF0,0x90,0xF0,0x2A,0x74,0x13,0xF0,0x90,0xF0,0x29,0x74,0x01,0xF0,0x90,
-
0xF0,0x2C,0x74,0x13,0xF0,0x90,0xF0,0x2B,0x74,0x02,0xF0,0x90,0xF0,0x2E,0x74,0x13,
-
0xF0,0x90,0xF0,0x2D,0x74,0x03,0xF0,0x90,0xF0,0x30,0x74,0x14,0xF0,0xE4,0x90,0xF0,
-
0x2F,0x12,0x44,0xEE,0x74,0x14,0xF0,0x90,0xF0,0x4F,0x74,0x01,0xF0,0x90,0xF0,0x52,
-
0x74,0x14,0xF0,0x90,0xF0,0x51,0x74,0x02,0xF0,0x90,0xF0,0x54,0x74,0x14,0xF0,0x90,
-
0xF0,0x53,0x74,0x03,0xF0,0x90,0xF0,0x56,0x74,0x15,0xF0,0xE4,0x90,0xF0,0x55,0xF0,
-
0x90,0xF0,0x58,0x74,0x15,0xF0,0x90,0xF0,0x57,0x74,0x01,0xF0,0x90,0xF0,0x5A,0x74,
-
0x15,0xF0,0x90,0xF0,0x59,0x74,0x02,0xF0,0x90,0xF0,0x5C,0x74,0x15,0xF0,0x90,0xF0,
-
0x5B,0x74,0x03,0xF0,0x90,0xF0,0x5E,0x74,0x16,0xF0,0xE4,0x90,0xF0,0x5D,0xF0,0x90,
-
0xF0,0x60,0x74,0x16,0xF0,0x90,0xF0,0x5F,0x74,0x01,0xF0,0x90,0xF0,0x62,0x74,0x16,
-
0xF0,0x90,0xF0,0x61,0x74,0x02,0xF0,0x90,0xF0,0x64,0x74,0x16,0xF0,0x90,0xF0,0x63,
-
0x74,0x03,0xF0,0x90,0xF0,0x66,0x74,0x17,0xF0,0xE4,0x90,0xF0,0x65,0xF0,0x90,0xF0,
-
0x68,0x74,0x17,0xF0,0x90,0xF0,0x67,0x74,0x01,0xF0,0x90,0xF0,0x6A,0x74,0x20,0xF0,
-
0x90,0xF0,0x69,0x74,0x13,0xF0,0x90,0xF0,0x6C,0x74,0x20,0xF0,0x90,0xF0,0x6B,0x74,
-
0x12,0xF0,0x90,0xF0,0x6E,0x74,0x20,0xF0,0x90,0xF0,0x6D,0x74,0x11,0xF0,0x90,0xF0,
-
0x70,0x74,0x20,0xF0,0x74,0x10,0x12,0x44,0x36,0x74,0x20,0xF0,0x90,0xF0,0x91,0x74,
-
0x0F,0xF0,0x90,0xF0,0x94,0x74,0x20,0xF0,0x90,0xF0,0x93,0x74,0x0E,0xF0,0x90,0xF0,
-
0x96,0x74,0x20,0xF0,0x90,0xF0,0x95,0x74,0x0D,0xF0,0x90,0xF0,0x98,0x74,0x20,0xF0,
-
0x90,0xF0,0x97,0x74,0x0C,0xF0,0x90,0xF0,0x9A,0x74,0x20,0xF0,0x90,0xF0,0x99,0x74,
-
0x0B,0xF0,0x90,0xF0,0x9C,0x74,0x20,0xF0,0x90,0xF0,0x9B,0x74,0x0A,0xF0,0x90,0xF0,
-
0x9E,0x74,0x20,0xF0,0x90,0xF0,0x9D,0x74,0x09,0xF0,0x90,0xF0,0xA0,0x74,0x20,0xF0,
-
0x90,0xF0,0x9F,0x74,0x08,0xF0,0x90,0xF0,0xA2,0x74,0x20,0xF0,0x90,0xF0,0xA1,0x74,
-
0x07,0xF0,0x90,0xF0,0xA4,0x74,0x20,0xF0,0x90,0xF0,0xA3,0x74,0x06,0xF0,0x90,0xF0,
-
0xA6,0x74,0x20,0xF0,0x90,0xF0,0xA5,0x74,0x05,0xF0,0x90,0xF0,0xA8,0x74,0x20,0xF0,
-
0x90,0xF0,0xA7,0x74,0x04,0xF0,0x90,0xF0,0xAA,0x74,0x20,0xF0,0x90,0xF0,0xA9,0x74,
-
0x03,0xF0,0x74,0x20,0x12,0x46,0x81,0x74,0x20,0xF0,0x90,0xF0,0xAD,0x74,0x01,0xF0,
-
0x74,0x20,0x12,0x45,0x98,0x74,0x1E,0xF0,0x90,0xF1,0x07,0x74,0x14,0xF0,0x74,0x04,
-
0x12,0x46,0x49,0xF0,0x90,0xF1,0x15,0x74,0x02,0xF0,0x90,0xF1,0x1F,0x74,0x0C,0xF0,
-
0x90,0xF1,0x22,0x74,0x03,0xF0,0x90,0xF1,0x1D,0x74,0x08,0xF0,0x90,0xF1,0x21,0x74,
-
0x0A,0xF0,0xE4,0x90,0xF1,0x1C,0xF0,0x90,0xF1,0x43,0x74,0x3A,0xF0,0xE4,0x90,0xF1,
-
0x19,0xF0,0x90,0xF1,0x1E,0x04,0xF0,0x90,0xF1,0x20,0x74,0x05,0xF0,0x90,0xF2,0xA4,
-
0x74,0x32,0xF0,0x90,0xF2,0xA5,0xF0,0x90,0xF1,0x01,0x74,0x16,0xF0,0x90,0xF1,0x02,
-
0xF0,0x90,0xF1,0x03,0x74,0x18,0xF0,0x90,0xF1,0x04,0x74,0x0F,0xF0,0x90,0xF1,0x05,
-
0x74,0x14,0xF0,0x90,0xF1,0x08,0x74,0x03,0xF0,0x90,0xF1,0x09,0x74,0xE8,0xF0,0x90,
-
0xF1,0x0A,0x74,0x01,0xF0,0x90,0xF1,0x0B,0x74,0x14,0xF0,0x90,0xF0,0xC5,0x74,0x27,
-
0xF0,0x90,0xF1,0x18,0x74,0xF3,0xF0,0xE0,0x54,0x0F,0xB4,0x09,0x00,0x50,0x54,0x90,
-
0x2E,0xF6,0xF8,0x28,0x28,0x73,0x02,0x2F,0x11,0x02,0x2F,0x13,0x02,0x2F,0x1B,0x02,
-
0x2F,0x23,0x02,0x2F,0x2B,0x02,0x2F,0x33,0x02,0x2F,0x3B,0x02,0x2F,0x3B,0x02,0x2F,
-
0x3B,0x80,0x30,0x90,0xF1,0x0C,0x74,0x04,0xF0,0x80,0x2E,0x90,0xF1,0x0C,0x74,0x08,
-
0xF0,0x80,0x26,0x90,0xF1,0x0C,0x74,0x10,0xF0,0x80,0x1E,0x90,0xF1,0x0C,0x74,0x20,
-
0xF0,0x80,0x16,0x90,0xF1,0x0C,0x74,0x40,0xF0,0x80,0x0E,0x90,0xF1,0x0C,0x74,0x80,
-
0xF0,0x80,0x06,0x90,0xF1,0x0C,0x74,0x02,0xF0,0x90,0xF1,0x0D,0x74,0xC8,0xF0,0x90,
-
0xF1,0x16,0x74,0x10,0xF0,0xD2,0xAD,0xE4,0x90,0xF1,0x17,0xF0,0x90,0xF0,0xC4,0x04,
-
0xF0,0x20,0x0C,0x05,0x75,0x9E,0x55,0x80,0xF8,0x22,0x90,0x14,0x07,0xEF,0xF0,0xA9,
-
0x03,0xA3,0xED,0xF0,0x60,0x03,0x02,0x31,0x0D,0xE9,0x60,0x03,0x02,0x30,0x4C,0x90,
-
0x14,0x07,0xE0,0xB4,0x14,0x00,0x40,0x03,0x02,0x30,0x46,0x90,0x2F,0x92,0xF8,0x28,
-
0x28,0x73,0x02,0x2F,0xCE,0x02,0x2F,0xD4,0x02,0x2F,0xDA,0x02,0x2F,0xE0,0x02,0x2F,
-
0xE6,0x02,0x2F,0xEC,0x02,0x2F,0xF2,0x02,0x2F,0xF8,0x02,0x2F,0xFE,0x02,0x30,0x04,
-
0x02,0x30,0x0A,0x02,0x30,0x10,0x02,0x30,0x16,0x02,0x30,0x1C,0x02,0x30,0x22,0x02,
-
0x30,0x28,0x02,0x30,0x2E,0x02,0x30,0x34,0x02,0x30,0x3A,0x02,0x30,0x40,0x43,0xDB,
-
0x01,0x02,0x31,0x0A,0x43,0xDB,0x02,0x02,0x31,0x0A,0x43,0xDB,0x04,0x02,0x31,0x0A,
-
0x43,0xDB,0x08,0x02,0x31,0x0A,0x43,0xDB,0x10,0x02,0x31,0x0A,0x43,0xDB,0x20,0x02,
-
0x31,0x0A,0x43,0xDB,0x40,0x02,0x31,0x0A,0x43,0xDB,0x80,0x02,0x31,0x0A,0x43,0xDA,
-
0x01,0x02,0x31,0x0A,0x43,0xDA,0x02,0x02,0x31,0x0A,0x43,0xDA,0x04,0x02,0x31,0x0A,
-
0x43,0xDA,0x08,0x02,0x31,0x0A,0x43,0xDA,0x10,0x02,0x31,0x0A,0x43,0xDA,0x20,0x02,
-
0x31,0x0A,0x43,0xDA,0x40,0x02,0x31,0x0A,0x43,0xDA,0x80,0x02,0x31,0x0A,0x43,0xD9,
-
0x01,0x02,0x31,0x0A,0x43,0xD9,0x02,0x02,0x31,0x0A,0x43,0xD9,0x04,0x02,0x31,0x0A,
-
0x43,0xD9,0x08,0x02,0x31,0x0A,0x12,0x29,0xAE,0x02,0x31,0x0A,0xE9,0x64,0x01,0x60,
-
0x03,0x02,0x31,0x0A,0x90,0x14,0x07,0xE0,0xB4,0x14,0x00,0x40,0x03,0x02,0x31,0x07,
-
0x90,0x30,0x67,0xF8,0x28,0x28,0x73,0x02,0x30,0xA3,0x02,0x30,0xA8,0x02,0x30,0xAD,
-
0x02,0x30,0xB2,0x02,0x30,0xB7,0x02,0x30,0xBC,0x02,0x30,0xC1,0x02,0x30,0xC6,0x02,
-
0x30,0xCB,0x02,0x30,0xD0,0x02,0x30,0xD5,0x02,0x30,0xDA,0x02,0x30,0xDF,0x02,0x30,
-
0xE4,0x02,0x30,0xE9,0x02,0x30,0xEE,0x02,0x30,0xF3,0x02,0x30,0xF8,0x02,0x30,0xFD,
-
0x02,0x31,0x02,0x43,0xDE,0x01,0x80,0x62,0x43,0xDE,0x02,0x80,0x5D,0x43,0xDE,0x04,
-
0x80,0x58,0x43,0xDE,0x08,0x80,0x53,0x43,0xDE,0x10,0x80,0x4E,0x43,0xDE,0x20,0x80,
-
0x49,0x43,0xDE,0x40,0x80,0x44,0x43,0xDE,0x80,0x80,0x3F,0x43,0xDD,0x01,0x80,0x3A,
-
0x43,0xDD,0x02,0x80,0x35,0x43,0xDD,0x04,0x80,0x30,0x43,0xDD,0x08,0x80,0x2B,0x43,
-
0xDD,0x10,0x80,0x26,0x43,0xDD,0x20,0x80,0x21,0x43,0xDD,0x40,0x80,0x1C,0x43,0xDD,
-
0x80,0x80,0x17,0x43,0xDC,0x01,0x80,0x12,0x43,0xDC,0x02,0x80,0x0D,0x43,0xDC,0x04,
-
0x80,0x08,0x43,0xDC,0x08,0x80,0x03,0x12,0x29,0xB8,0x7F,0x00,0x22,0x90,0x14,0x08,
-
0xE0,0x64,0x01,0x60,0x03,0x02,0x32,0xAC,0xE9,0x60,0x03,0x02,0x31,0xEB,0x90,0x14,
-
0x07,0xE0,0xB4,0x14,0x00,0x40,0x03,0x02,0x31,0xE5,0x90,0x31,0x31,0xF8,0x28,0x28,
-
0x73,0x02,0x31,0x6D,0x02,0x31,0x73,0x02,0x31,0x79,0x02,0x31,0x7F,0x02,0x31,0x85,
-
0x02,0x31,0x8B,0x02,0x31,0x91,0x02,0x31,0x97,0x02,0x31,0x9D,0x02,0x31,0xA3,0x02,
-
0x31,0xA9,0x02,0x31,0xAF,0x02,0x31,0xB5,0x02,0x31,0xBB,0x02,0x31,0xC1,0x02,0x31,
-
0xC7,0x02,0x31,0xCD,0x02,0x31,0xD3,0x02,0x31,0xD9,0x02,0x31,0xDF,0x53,0xDB,0xFE,
-
0x02,0x32,0xA9,0x53,0xDB,0xFD,0x02,0x32,0xA9,0x53,0xDB,0xFB,0x02,0x32,0xA9,0x53,
-
0xDB,0xF7,0x02,0x32,0xA9,0x53,0xDB,0xEF,0x02,0x32,0xA9,0x53,0xDB,0xDF,0x02,0x32,
-
0xA9,0x53,0xDB,0xBF,0x02,0x32,0xA9,0x53,0xDB,0x7F,0x02,0x32,0xA9,0x53,0xDA,0xFE,
-
0x02,0x32,0xA9,0x53,0xDA,0xFD,0x02,0x32,0xA9,0x53,0xDA,0xFB,0x02,0x32,0xA9,0x53,
-
0xDA,0xF7,0x02,0x32,0xA9,0x53,0xDA,0xEF,0x02,0x32,0xA9,0x53,0xDA,0xDF,0x02,0x32,
-
0xA9,0x53,0xDA,0xBF,0x02,0x32,0xA9,0x53,0xDA,0x7F,0x02,0x32,0xA9,0x53,0xD9,0xFE,
-
0x02,0x32,0xA9,0x53,0xD9,0xFD,0x02,0x32,0xA9,0x53,0xD9,0xFB,0x02,0x32,0xA9,0x53,
-
0xD9,0xF7,0x02,0x32,0xA9,0x12,0x29,0xAE,0x02,0x32,0xA9,0xE9,0x64,0x01,0x60,0x03,
-
0x02,0x32,0xA9,0x90,0x14,0x07,0xE0,0xB4,0x14,0x00,0x40,0x03,0x02,0x32,0xA6,0x90,
-
0x32,0x06,0xF8,0x28,0x28,0x73,0x02,0x32,0x42,0x02,0x32,0x47,0x02,0x32,0x4C,0x02,
-
0x32,0x51,0x02,0x32,0x56,0x02,0x32,0x5B,0x02,0x32,0x60,0x02,0x32,0x65,0x02,0x32,
-
0x6A,0x02,0x32,0x6F,0x02,0x32,0x74,0x02,0x32,0x79,0x02,0x32,0x7E,0x02,0x32,0x83,
-
0x02,0x32,0x88,0x02,0x32,0x8D,0x02,0x32,0x92,0x02,0x32,0x97,0x02,0x32,0x9C,0x02,
-
0x32,0xA1,0x53,0xDE,0xFE,0x80,0x62,0x53,0xDE,0xFD,0x80,0x5D,0x53,0xDE,0xFB,0x80,
-
0x58,0x53,0xDE,0xF7,0x80,0x53,0x53,0xDE,0xEF,0x80,0x4E,0x53,0xDE,0xDF,0x80,0x49,
-
0x53,0xDE,0xBF,0x80,0x44,0x53,0xDE,0x7F,0x80,0x3F,0x53,0xDD,0xFE,0x80,0x3A,0x53,
-
0xDD,0xFD,0x80,0x35,0x53,0xDD,0xFB,0x80,0x30,0x53,0xDD,0xF7,0x80,0x2B,0x53,0xDD,
-
0xEF,0x80,0x26,0x53,0xDD,0xDF,0x80,0x21,0x53,0xDD,0xBF,0x80,0x1C,0x53,0xDD,0x7F,
-
0x80,0x17,0x53,0xDC,0xFE,0x80,0x12,0x53,0xDC,0xFD,0x80,0x0D,0x53,0xDC,0xFB,0x80,
-
0x08,0x53,0xDC,0xF7,0x80,0x03,0x12,0x29,0xB8,0x7F,0x00,0x22,0x90,0x14,0x08,0xE0,
-
0x64,0x02,0x60,0x03,0x02,0x34,0x3C,0xE9,0x60,0x03,0x02,0x33,0x79,0x90,0x14,0x07,
-
0xE0,0xB4,0x14,0x00,0x40,0x03,0x02,0x33,0x74,0x90,0x32,0xD0,0xF8,0x28,0x28,0x73,
-
0x02,0x33,0x0C,0x02,0x33,0x10,0x02,0x33,0x14,0x02,0x33,0x18,0x02,0x33,0x1C,0x02,
-
0x33,0x20,0x02,0x33,0x24,0x02,0x33,0x28,0x02,0x33,0x2C,0x02,0x33,0x30,0x02,0x33,
-
0x34,0x02,0x33,0x38,0x02,0x33,0x3C,0x02,0x33,0x43,0x02,0x33,0x4A,0x02,0x33,0x51,
-
0x02,0x33,0x58,0x02,0x33,0x5F,0x02,0x33,0x66,0x02,0x33,0x6D,0xE5,0xDB,0x80,0x4A,
-
0xE5,0xDB,0x80,0x4D,0xE5,0xDB,0x80,0x50,0xE5,0xDB,0x80,0x53,0xE5,0xDB,0x80,0x1E,
-
0xE5,0xDB,0x80,0x21,0xE5,0xDB,0x80,0x24,0xE5,0xDB,0x80,0x27,0xE5,0xDA,0x80,0x2A,
-
0xE5,0xDA,0x80,0x2D,0xE5,0xDA,0x80,0x30,0xE5,0xDA,0x80,0x33,0xE5,0xDA,0x54,0x10,
-
0xFE,0x80,0x33,0xE5,0xDA,0x54,0x20,0xFE,0x80,0x2C,0xE5,0xDA,0x54,0x40,0xFE,0x80,
-
0x25,0xE5,0xDA,0x54,0x80,0xFE,0x80,0x1E,0xE5,0xD9,0x54,0x01,0xFE,0x80,0x17,0xE5,
-
0xD9,0x54,0x02,0xFE,0x80,0x10,0xE5,0xD9,0x54,0x04,0xFE,0x80,0x09,0xE5,0xD9,0x54,
-
0x08,0xFE,0x80,0x02,0xE4,0xFE,0xAF,0x06,0x22,0xE9,0x64,0x01,0x60,0x03,0x02,0x34,
-
0x3C,0x90,0x14,0x07,0xE0,0xB4,0x14,0x00,0x40,0x03,0x02,0x34,0x38,0x90,0x33,0x94,
-
0xF8,0x28,0x28,0x73,0x02,0x33,0xD0,0x02,0x33,0xD4,0x02,0x33,0xD8,0x02,0x33,0xDC,
-
0x02,0x33,0xE0,0x02,0x33,0xE4,0x02,0x33,0xE8,0x02,0x33,0xEC,0x02,0x33,0xF0,0x02,
-
0x33,0xF4,0x02,0x33,0xF8,0x02,0x33,0xFC,0x02,0x34,0x00,0x02,0x34,0x07,0x02,0x34,
-
0x0E,0x02,0x34,0x15,0x02,0x34,0x1C,0x02,0x34,0x23,0x02,0x34,0x2A,0x02,0x34,0x31,
-
0xE5,0xDE,0x80,0x4A,0xE5,0xDE,0x80,0x4D,0xE5,0xDE,0x80,0x50,0xE5,0xDE,0x80,0x53,
-
0xE5,0xDE,0x80,0x1E,0xE5,0xDE,0x80,0x21,0xE5,0xDE,0x80,0x24,0xE5,0xDE,0x80,0x27,
-
0xE5,0xDD,0x80,0x2A,0xE5,0xDD,0x80,0x2D,0xE5,0xDD,0x80,0x30,0xE5,0xDD,0x80,0x33,
-
0xE5,0xDD,0x54,0x10,0xFE,0x80,0x33,0xE5,0xDD,0x54,0x20,0xFE,0x80,0x2C,0xE5,0xDD,
-
0x54,0x40,0xFE,0x80,0x25,0xE5,0xDD,0x54,0x80,0xFE,0x80,0x1E,0xE5,0xDC,0x54,0x01,
-
0xFE,0x80,0x17,0xE5,0xDC,0x54,0x02,0xFE,0x80,0x10,0xE5,0xDC,0x54,0x04,0xFE,0x80,
-
0x09,0xE5,0xDC,0x54,0x08,0xFE,0x80,0x02,0xE4,0xFE,0xAF,0x06,0x22,0xE4,0x90,0x8F,
-
0xF0,0xF0,0xD2,0x1B,0x30,0x17,0x03,0x02,0x36,0x3D,0x90,0x12,0x5F,0xF0,0x90,0x13,
-
0xB3,0xF0,0x12,0x26,0x77,0x40,0x03,0x02,0x35,0xA2,0x74,0xE5,0x2F,0x12,0x20,0x7E,
-
0xE0,0x70,0x03,0x02,0x35,0x9C,0x90,0x13,0xB3,0xE0,0x24,0x98,0x12,0x23,0x6C,0xE0,
-
0x60,0x03,0x02,0x35,0x9C,0x12,0x26,0x80,0x40,0x03,0x02,0x35,0x9C,0x12,0x28,0x65,
-
0x12,0x20,0x7E,0xE0,0x64,0x03,0x60,0x04,0xC2,0x1B,0x80,0x07,0x7F,0x70,0x7E,0x17,
-
0x12,0x53,0x73,0x12,0x28,0x65,0x12,0x20,0x7E,0xE0,0x90,0x12,0x5F,0xB4,0x02,0x05,
-
0xE0,0x04,0xF0,0x80,0x03,0xE0,0x14,0xF0,0x90,0x13,0xB3,0xE0,0xFF,0x12,0x21,0x2F,
-
0x12,0x27,0x5A,0x12,0x20,0x44,0x12,0x21,0x23,0x12,0x1F,0x8C,0x90,0x13,0xB4,0xE0,
-
0xFE,0xA3,0xE0,0xFF,0x12,0x20,0x43,0x12,0x27,0x6A,0xED,0x12,0x21,0x2F,0x12,0x1F,
-
0x1B,0xFD,0x7F,0x01,0x7E,0x00,0x12,0x52,0xFC,0x12,0x23,0x3C,0x7F,0x01,0x7E,0x00,
-
0x12,0x52,0xD1,0x12,0x21,0x2A,0x12,0x27,0x6A,0x12,0x20,0x43,0x12,0x1F,0x1B,0xFD,
-
0x7F,0x0F,0x7E,0x00,0x12,0x52,0xFC,0x12,0x23,0x3C,0x7F,0x10,0x7E,0x00,0x12,0x52,
-
0xD1,0x12,0x20,0x10,0x12,0x1F,0x8C,0x12,0x20,0x73,0xE0,0x4F,0xFF,0x12,0x20,0xAB,
-
0x12,0x28,0xF1,0xF5,0x83,0xEF,0xF0,0xED,0x12,0x21,0x2F,0x12,0x26,0x93,0x12,0x28,
-
0x6C,0xD8,0xFB,0xFF,0x12,0x20,0xAB,0x12,0x28,0xF9,0xF5,0x83,0xEF,0xF0,0x12,0x20,
-
0x43,0x12,0x26,0x93,0x12,0x28,0x6C,0xD8,0xFB,0xFF,0x12,0x20,0xAB,0x12,0x29,0x01,
-
0xF5,0x83,0xEF,0xF0,0xED,0x12,0x21,0x2F,0x12,0x28,0x16,0xD5,0x82,0x02,0x15,0x83,
-
0x15,0x82,0xEF,0x54,0xF0,0xFF,0x12,0x20,0x43,0x12,0x29,0xC2,0x12,0x20,0xAB,0x12,
-
0x29,0x09,0xF5,0x83,0xEF,0xF0,0x90,0x3F,0xFE,0xE0,0xB4,0x01,0x19,0xE5,0x09,0xFF,
-
0x12,0x20,0xAB,0x12,0x27,0x72,0xF5,0x83,0xEF,0xF0,0xAF,0x0A,0x12,0x20,0xAB,0x12,
-
0x25,0xE2,0xEF,0xF0,0x80,0x13,0x12,0x20,0xAB,0x12,0x27,0x72,0xF5,0x83,0x74,0x08,
-
0x12,0x20,0xAA,0x12,0x25,0xE2,0x74,0x08,0xF0,0x12,0x27,0xD8,0x12,0x27,0x7D,0x02,
-
0x34,0x52,0x12,0x29,0xCC,0xB5,0x07,0x04,0xD2,0x06,0x80,0x02,0xC2,0x06,0x30,0x19,
-
0x3C,0x78,0x10,0xE6,0x60,0x02,0xC2,0x1B,0x12,0x26,0xED,0x12,0x20,0xAB,0x12,0x28,
-
0xF9,0xF5,0x83,0xEF,0x12,0x20,0xAA,0x12,0x29,0x01,0x12,0x20,0xA7,0x12,0x29,0x09,
-
0x12,0x20,0xA7,0x12,0x28,0xF1,0x12,0x20,0xA7,0x12,0x27,0x72,0x12,0x20,0xA7,0x12,
-
0x25,0xE2,0x12,0x27,0xD6,0xEE,0x70,0x05,0x78,0x11,0xF6,0xC2,0x19,0x20,0x0D,0x38,
-
0x90,0x8F,0xF0,0xE0,0x90,0x13,0xB3,0xF0,0x12,0x26,0x77,0x50,0x2B,0xEF,0x75,0xF0,
-
0x06,0xA4,0x12,0x28,0xF9,0x12,0x22,0xA5,0x12,0x29,0x01,0x12,0x22,0xA5,0x12,0x29,
-
0x09,0x12,0x22,0xA5,0x12,0x28,0xF1,0x12,0x22,0xA5,0x12,0x27,0x72,0x12,0x22,0xA5,
-
0x12,0x25,0xE2,0x12,0x27,0x7A,0x80,0xD0,0x90,0x8F,0xF0,0xE0,0xD3,0x94,0x00,0x50,
-
0x03,0x02,0x38,0x2B,0x20,0x1B,0x03,0x02,0x38,0x2B,0xD2,0x0E,0x22,0xE4,0x90,0x13,
-
0xB3,0xF0,0x12,0x26,0x77,0x40,0x03,0x02,0x37,0x97,0xE4,0x90,0x12,0x5F,0xF0,0x74,
-
0xE5,0x2F,0x12,0x20,0x7E,0xE0,0x70,0x03,0x02,0x37,0x91,0x90,0x13,0xB3,0xE0,0x24,
-
0x98,0x12,0x23,0x6C,0xE0,0x60,0x03,0x02,0x37,0x91,0x12,0x26,0x80,0x40,0x03,0x02,
-
0x37,0x91,0x12,0x28,0x65,0x12,0x20,0x7E,0xE0,0x64,0x03,0x60,0x04,0xC2,0x1B,0x80,
-
0x07,0x7F,0x70,0x7E,0x17,0x12,0x53,0x73,0x12,0x28,0x65,0x12,0x20,0x7E,0xE0,0x90,
-
0x12,0x5F,0xB4,0x02,0x05,0xE0,0x04,0xF0,0x80,0x03,0xE0,0x14,0xF0,0x90,0x13,0xB3,
-
0xE0,0xFF,0x12,0x21,0x2F,0x12,0x27,0x5A,0x12,0x20,0x44,0x12,0x21,0x23,0x12,0x1F,
-
0x8C,0x90,0x13,0xB4,0xE0,0xFE,0xA3,0xE0,0xFF,0x12,0x20,0x43,0x12,0x27,0x6A,0xED,
-
0x12,0x21,0x2F,0x12,0x1F,0x1B,0xFD,0x7F,0x01,0x7E,0x00,0x12,0x52,0xFC,0x12,0x23,
-
0x3C,0x7F,0x01,0x7E,0x00,0x12,0x52,0xD1,0x12,0x21,0x2A,0x12,0x27,0x6A,0x12,0x20,
-
0x43,0x12,0x1F,0x1B,0xFD,0x7F,0x0F,0x7E,0x00,0x12,0x52,0xFC,0x12,0x23,0x3C,0x7F,
-
0x10,0x7E,0x00,0x12,0x52,0xD1,0x12,0x20,0x10,0x12,0x1F,0x8C,0x12,0x20,0x73,0xE0,
-
0x4F,0xFF,0x12,0x20,0xAB,0x12,0x29,0x11,0xF5,0x83,0xEF,0xF0,0xED,0x12,0x21,0x2F,
-
0x12,0x26,0x93,0x12,0x28,0x6C,0xD8,0xFB,0xFF,0x12,0x20,0xAB,0x12,0x29,0x19,0xF5,
-
0x83,0xEF,0xF0,0x12,0x20,0x43,0x12,0x26,0x93,0x12,0x28,0x6C,0xD8,0xFB,0xFF,0x12,
-
0x20,0xAB,0x12,0x29,0x21,0xF5,0x83,0xEF,0xF0,0xED,0x12,0x21,0x2F,0x12,0x28,0x16,
-
0xD5,0x82,0x02,0x15,0x83,0x15,0x82,0xEF,0x54,0xF0,0xFF,0x12,0x20,0x43,0x12,0x29,
-
0xC2,0x12,0x20,0xAB,0x12,0x29,0x29,0xF5,0x83,0xEF,0xF0,0x90,0x3F,0xFE,0xE0,0xB4,
-
0x01,0x19,0xE5,0x09,0xFF,0x12,0x20,0xAB,0x12,0x27,0x84,0xF5,0x83,0xEF,0xF0,0xAF,
-
0x0A,0x12,0x20,0xAB,0x12,0x25,0xEC,0xEF,0xF0,0x80,0x13,0x12,0x20,0xAB,0x12,0x27,
-
0x84,0xF5,0x83,0x74,0x08,0x12,0x20,0xAA,0x12,0x25,0xEC,0x74,0x08,0xF0,0x12,0x27,
-
0xD8,0x12,0x27,0x7D,0x02,0x36,0x42,0x12,0x29,0xCC,0xB5,0x07,0x04,0xD2,0x06,0x80,
-
0x02,0xC2,0x06,0x30,0x19,0x3C,0x78,0x10,0xE6,0x60,0x02,0xC2,0x1B,0x12,0x26,0xED,
-
0x12,0x20,0xAB,0x12,0x29,0x19,0xF5,0x83,0xEF,0x12,0x20,0xAA,0x12,0x29,0x21,0x12,
-
0x20,0xA7,0x12,0x29,0x29,0x12,0x20,0xA7,0x12,0x29,0x11,0x12,0x20,0xA7,0x12,0x27,
-
0x84,0x12,0x20,0xA7,0x12,0x25,0xEC,0x12,0x27,0xD6,0xEE,0x70,0x05,0x78,0x11,0xF6,
-
0xC2,0x19,0x20,0x0D,0x38,0x90,0x8F,0xF0,0xE0,0x90,0x13,0xB3,0xF0,0x12,0x26,0x77,
-
0x50,0x2B,0xEF,0x75,0xF0,0x06,0xA4,0x12,0x29,0x19,0x12,0x22,0xA5,0x12,0x29,0x21,
-
0x12,0x22,0xA5,0x12,0x29,0x29,0x12,0x22,0xA5,0x12,0x29,0x11,0x12,0x22,0xA5,0x12,
-
0x27,0x84,0x12,0x22,0xA5,0x12,0x25,0xEC,0x12,0x27,0x7A,0x80,0xD0,0x90,0x8F,0xF0,
-
0xE0,0xD3,0x94,0x00,0x40,0x05,0x30,0x1B,0x02,0xD2,0x0E,0x22,0x75,0x81,0x64,0xD2,
-
0xAF,0xD2,0xAE,0x12,0x00,0x40,0x12,0x7F,0xF0,0x7F,0x64,0x7E,0x00,0x12,0x53,0x73,
-
0x12,0x51,0xD0,0x12,0x3B,0x02,0xC2,0x15,0x12,0x52,0x99,0xC2,0x01,0x75,0x9E,0x55,
-
0x20,0x0C,0x03,0x02,0x3A,0x19,0xC2,0x0C,0x85,0x0E,0x09,0x85,0x0F,0x0A,0xE4,0xF5,
-
0x0E,0xF5,0x0F,0x20,0x15,0x03,0x12,0x53,0x94,0x30,0x05,0x09,0x12,0x12,0x8B,0x12,
-
0x52,0x2C,0x02,0x3A,0x19,0x20,0x15,0x03,0x02,0x39,0x06,0xE4,0x90,0xF1,0x0A,0xF0,
-
0x90,0xF1,0x1B,0xF0,0x90,0xF1,0x1F,0x74,0x0F,0xF0,0x90,0xF1,0x22,0x74,0x05,0xF0,
-
0xE4,0x90,0xF1,0x1C,0xF0,0x90,0xF1,0x06,0x04,0xF0,0xA3,0xF0,0x90,0xF1,0x0E,0xF0,
-
0xE4,0x12,0x52,0x91,0xF0,0x12,0x52,0x91,0x74,0x05,0xF0,0xE4,0xFD,0xFC,0xED,0x25,
-
0xE0,0xFE,0xEC,0x33,0x90,0x13,0xB1,0xF0,0xA3,0xCE,0xF0,0x90,0x13,0xB1,0xE0,0xFE,
-
0xA3,0xE0,0x7B,0x01,0x24,0x01,0xF9,0x74,0xF0,0x3E,0xFA,0xE4,0x12,0x42,0xA1,0x04,
-
0x29,0xF9,0xE4,0x3A,0xFA,0x74,0x08,0x12,0x42,0xA1,0x0D,0xBD,0x00,0x01,0x0C,0xED,
-
0x64,0x60,0x4C,0x70,0xC9,0x12,0x50,0xC9,0x90,0x12,0x5B,0xE0,0x04,0xF0,0xE0,0x64,
-
0x60,0x60,0x03,0x02,0x3A,0x19,0xF0,0x90,0x12,0x71,0xF0,0x90,0x8F,0xFD,0x74,0xBB,
-
0xF0,0xC2,0x15,0x02,0x3A,0x19,0x90,0x13,0x97,0xE0,0xFF,0x12,0x4C,0x9E,0x12,0x53,
-
0xB4,0xA2,0xD9,0xE4,0x33,0x90,0x8E,0x01,0xF0,0x90,0xF0,0xC4,0x74,0x01,0xF0,0x30,
-
0x18,0x09,0x12,0x12,0x8B,0x12,0x46,0x96,0x12,0x48,0x44,0x12,0x00,0x4F,0x12,0x49,
-
0xCC,0x12,0x34,0x3D,0x90,0x3F,0xFD,0xE0,0xB4,0x02,0x15,0xE5,0x91,0x30,0xE4,0x05,
-
0x75,0x9E,0x55,0x80,0xF6,0x12,0x52,0x89,0x40,0x04,0xC2,0x84,0x80,0x02,0xD2,0x84,
-
0xE5,0x91,0x30,0xE4,0x03,0x02,0x3A,0x09,0x12,0x52,0x89,0x40,0x4F,0xE4,0x90,0x12,
-
0x63,0xF0,0xA3,0xF0,0xB2,0x17,0x75,0x8A,0x8B,0xF5,0x8B,0x30,0x17,0x18,0x90,0x13,
-
0xAD,0xF0,0x90,0x13,0xAD,0xE0,0xFF,0x24,0x00,0xF5,0x82,0xE4,0x34,0x8F,0x12,0x52,
-
0x71,0xB4,0x3C,0xEE,0x80,0x17,0xE4,0x90,0x13,0xAD,0xF0,0x90,0x13,0xAD,0xE0,0xFF,
-
0x24,0x78,0xF5,0x82,0xE4,0x34,0x8F,0x12,0x52,0x71,0xB4,0x3C,0xEE,0x90,0x3F,0xFD,
-
0xE0,0x64,0x01,0x70,0x72,0xC2,0x84,0x7F,0x32,0xFE,0x80,0x56,0x30,0x0E,0x68,0x30,
-
0x09,0x16,0x90,0x3F,0xFD,0xE0,0xB4,0x01,0x0B,0xC2,0x84,0x7F,0x32,0x7E,0x00,0x12,
-
0x53,0x73,0xD2,0x84,0xC2,0x09,0x80,0x4F,0x90,0x12,0x8D,0xE4,0xF0,0xA3,0x74,0x64,
-
0xF0,0x7F,0x19,0x7E,0x00,0x12,0x53,0x73,0x90,0x12,0x8E,0xE0,0x24,0xFF,0xF0,0x90,
-
0x12,0x8D,0xE0,0x34,0xFF,0xF0,0x75,0x9E,0x55,0x30,0x0E,0x0D,0xD3,0xA3,0xE0,0x94,
-
0x00,0x90,0x12,0x8D,0xE0,0x94,0x00,0x50,0xD8,0x30,0x0E,0x1B,0xC2,0x84,0x7F,0x19,
-
0x7E,0x00,0x12,0x53,0x73,0xD2,0x84,0x80,0x0E,0x12,0x52,0x89,0x40,0x09,0x30,0x0E,
-
0x04,0xD2,0x0D,0x80,0x02,0xC2,0x0D,0xC2,0x18,0x20,0x07,0x03,0x02,0x3A,0xED,0xC2,
-
0x07,0xC2,0x05,0x90,0x8F,0xFF,0xE0,0xB4,0xAF,0x21,0xE4,0xF0,0x12,0x3D,0x82,0x75,
-
0xA1,0x10,0x90,0xF1,0x42,0xE0,0x44,0x10,0xF0,0x7F,0x02,0x7E,0x00,0x12,0x53,0x27,
-
0x75,0x87,0x02,0x75,0x97,0x55,0x00,0x00,0x02,0x38,0x4D,0x90,0x8F,0xFF,0xE0,0x64,
-
0xAE,0x70,0x03,0x02,0x38,0x4D,0x90,0x8F,0xFF,0xE0,0xB4,0xBF,0x05,0xD2,0x05,0x02,
-
0x38,0x4D,0x90,0x8F,0xFF,0xE0,0xB4,0xCC,0x13,0x12,0x3A,0xF8,0xD2,0x84,0x7F,0x64,
-
0x7E,0x00,0x12,0x53,0x73,0x12,0x3A,0xF8,0xD2,0x84,0x80,0x57,0x90,0x8F,0xFF,0xE0,
-
0xB4,0xC3,0x05,0xD2,0x01,0x02,0x38,0x4D,0x90,0x8F,0xFF,0xE0,0x64,0xC5,0x70,0x37,
-
0xF0,0x90,0x8F,0xFD,0x74,0xAA,0xF0,0xD2,0x15,0x12,0x52,0x99,0x90,0xF1,0x0A,0xF0,
-
0x90,0xF1,0x1F,0x74,0x14,0xF0,0x90,0xF1,0x22,0xF0,0xE4,0x90,0xF1,0x1C,0xF0,0x75,
-
0x9E,0x55,0x90,0xF0,0xC5,0xE0,0x44,0x01,0xF0,0x12,0x53,0xB4,0x90,0xF0,0xC4,0x74,
-
0x01,0xF0,0xC2,0x0C,0x02,0x38,0x4D,0x90,0x8F,0xFF,0xE0,0xB4,0xD1,0x0D,0xD2,0x04,
-
0x12,0x29,0xD6,0xE4,0x90,0x8F,0xFF,0xF0,0x02,0x38,0x4D,0x90,0x8F,0xFF,0xE0,0x64,
-
0xE1,0x60,0x03,0x02,0x38,0x4D,0xF0,0x12,0x4E,0x99,0x02,0x38,0x4D,0x20,0x08,0x03,
-
0x02,0x38,0x4D,0xC2,0x08,0x02,0x38,0x4D,0xC2,0x84,0x7F,0x64,0x7E,0x00,0x12,0x53,
-
0x73,0x22,0x90,0x19,0x40,0x74,0x02,0xF0,0x90,0x19,0x41,0x74,0x02,0xF0,0x90,0x19,
-
0x42,0x74,0x02,0xF0,0x90,0x19,0x43,0x74,0x02,0xF0,0x90,0x19,0x44,0x74,0x02,0xF0,
-
0x90,0x19,0x45,0x74,0x02,0xF0,0x90,0x19,0x46,0x74,0x02,0xF0,0x90,0x19,0x47,0x74,
-
0x01,0xF0,0x90,0x19,0x48,0x74,0x01,0xF0,0x90,0x19,0x49,0x74,0x01,0xF0,0x90,0x19,
-
0x4A,0x74,0x01,0xF0,0x90,0x19,0x4B,0x74,0x01,0xF0,0x90,0x19,0x4C,0x74,0x01,0xF0,
-
0x90,0x19,0x4D,0x74,0x01,0xF0,0x90,0x19,0x4E,0x74,0x01,0xF0,0x90,0x19,0x4F,0x74,
-
0x01,0xF0,0x90,0x19,0x50,0x74,0x01,0xF0,0x90,0x19,0x51,0x74,0x01,0xF0,0x90,0x19,
-
0x52,0x74,0x01,0xF0,0x90,0x19,0x53,0x74,0x01,0xF0,0x90,0x19,0x54,0x74,0x01,0xF0,
-
0x90,0x19,0x55,0x74,0x01,0xF0,0x90,0x19,0x56,0x74,0x01,0xF0,0x90,0x19,0x57,0x74,
-
0x01,0xF0,0x90,0x19,0x58,0x74,0x02,0xF0,0x90,0x19,0x59,0x74,0x02,0xF0,0x90,0x19,
-
0x5A,0x74,0x02,0xF0,0x90,0x19,0x5B,0x74,0x02,0xF0,0x90,0x19,0x5C,0x74,0x02,0xF0,
-
0x90,0x19,0x5D,0x74,0x02,0xF0,0x90,0x19,0x5E,0x74,0x02,0xF0,0x90,0x19,0x5F,0x74,
-
0x02,0xF0,0x90,0x19,0x60,0x74,0x02,0xF0,0x90,0x19,0x61,0x74,0x02,0xF0,0x90,0x19,
-
0x62,0x74,0x02,0xF0,0x90,0x19,0x63,0x74,0x02,0xF0,0x90,0x19,0x64,0x74,0x02,0xF0,
-
0x90,0x19,0x65,0x74,0x02,0xF0,0x90,0x19,0x66,0x74,0x02,0xF0,0x90,0x19,0x67,0x74,
-
0x01,0xF0,0x90,0x19,0x68,0x74,0x01,0xF0,0x90,0x19,0x69,0x74,0x01,0xF0,0x90,0x19,
-
0x6A,0x74,0x01,0xF0,0x90,0x19,0x6B,0x74,0x01,0xF0,0x90,0x19,0x6C,0x74,0x01,0xF0,
-
0x90,0x19,0x6D,0x74,0x01,0xF0,0x90,0x19,0x6E,0x74,0x01,0xF0,0x90,0x19,0x6F,0x74,
-
0x01,0xF0,0x90,0x19,0x70,0x74,0x01,0xF0,0x90,0x19,0x71,0x74,0x01,0xF0,0x90,0x19,
-
0x72,0x74,0x01,0xF0,0x90,0x19,0x73,0x74,0x01,0xF0,0x90,0x19,0x74,0x74,0x03,0xF0,
-
0x90,0x19,0x75,0x74,0x03,0xF0,0x90,0x19,0x76,0x74,0x03,0xF0,0x90,0x19,0x77,0x74,
-
0x03,0xF0,0x90,0x19,0x78,0x74,0x02,0xF0,0x90,0x19,0x79,0x74,0x02,0xF0,0x90,0x19,
-
0x7A,0x74,0x02,0xF0,0x90,0x19,0x7B,0x74,0x02,0xF0,0x90,0x19,0x7C,0x74,0x02,0xF0,
-
0x90,0x19,0x7D,0x74,0x02,0xF0,0x90,0x19,0x7E,0x74,0x02,0xF0,0x90,0x19,0x7F,0x74,
-
0x02,0xF0,0x90,0x19,0x80,0x74,0x02,0xF0,0x90,0x19,0x81,0x74,0x02,0xF0,0x90,0x19,
-
0x82,0x74,0x02,0xF0,0x90,0x19,0x83,0x74,0x02,0xF0,0x90,0x19,0x84,0x74,0x02,0xF0,
-
0x90,0x19,0x85,0x74,0x02,0xF0,0x90,0x19,0x86,0x74,0x02,0xF0,0x90,0x19,0x87,0x74,
-
0x02,0xF0,0x90,0x19,0x88,0x74,0x03,0xF0,0x90,0x19,0x89,0x74,0x03,0xF0,0x90,0x19,
-
0x8A,0x74,0x03,0xF0,0x90,0x19,0x8B,0x74,0x03,0xF0,0x90,0x19,0x8C,0x74,0x03,0xF0,
-
0x90,0x19,0x8D,0x74,0x03,0xF0,0x90,0x19,0x8E,0x74,0x03,0xF0,0x90,0x19,0x8F,0x74,
-
0x03,0xF0,0x90,0x19,0x90,0x74,0x03,0xF0,0x90,0x19,0x91,0x74,0x03,0xF0,0x90,0x19,
-
0x92,0x74,0x03,0xF0,0x90,0x19,0x93,0x74,0x03,0xF0,0x90,0x19,0x94,0x74,0x03,0xF0,
-
0x90,0x19,0x95,0x74,0x03,0xF0,0x90,0x19,0x96,0x74,0x03,0xF0,0x90,0x19,0x97,0x74,
-
0x03,0xF0,0x90,0x19,0x98,0x74,0x02,0xF0,0x90,0x19,0x99,0x74,0x02,0xF0,0x90,0x19,
-
0x9A,0x74,0x02,0xF0,0x90,0x19,0x9B,0x74,0x02,0xF0,0x90,0x19,0x9C,0x74,0x02,0xF0,
-
0x90,0x19,0x9D,0x74,0x02,0xF0,0x90,0x19,0x9E,0x74,0x02,0xF0,0x90,0x19,0x9F,0x74,
-
0x02,0xF0,0x75,0x9E,0x55,0xE4,0xFF,0xFE,0x12,0x4F,0xE5,0xB4,0x01,0x09,0x12,0x4F,
-
0xC8,0x74,0x01,0x12,0x4F,0xD5,0x0F,0x12,0x4F,0xE5,0xB4,0x03,0x09,0x12,0x4F,0xC8,
-
0x74,0x03,0x12,0x4F,0xD5,0x0F,0x0E,0xEE,0xB4,0x60,0xDD,0xAE,0x07,0xEE,0xC3,0x94,
-
0x60,0x50,0x0E,0xEE,0x12,0x4F,0xC9,0x74,0x1F,0xF0,0xEE,0x12,0x4F,0xD7,0x0E,0x80,
-
0xEC,0x22,0xE4,0x90,0xF0,0xC4,0xF0,0x75,0x9E,0x55,0x90,0xF1,0x47,0xE0,0xFE,0x90,
-
0xF1,0x48,0xE0,0x7C,0x00,0x24,0x00,0xFD,0xEC,0x3E,0xFC,0x90,0xF1,0x49,0xE0,0x7F,
-
0x00,0xFE,0xEF,0x2D,0xFF,0xEC,0x3E,0xFE,0x90,0xF1,0x4A,0xE0,0x7C,0x00,0x2F,0xFF,
-
0xEC,0x3E,0xFE,0x90,0xF1,0x40,0x74,0xE3,0xF0,0xE4,0x90,0xF1,0x41,0xF0,0x12,0x53,
-
0x60,0x75,0x9E,0x55,0x90,0xF1,0x41,0x74,0x40,0xF0,0x7F,0x05,0x7E,0x00,0x12,0x53,
-
0x27,0x7F,0x05,0x7E,0x00,0x12,0x53,0x27,0x75,0x9E,0x55,0xE4,0x90,0xF1,0x41,0xF0,
-
0x90,0xF1,0x40,0xF0,0x7F,0x02,0xFE,0x12,0x53,0x27,0x7F,0x02,0x7E,0x00,0x12,0x53,
-
0x27,0x75,0x9E,0x55,0x22,0x75,0x91,0x01,0x75,0x89,0x01,0xD2,0xAC,0x22,0x32,0x32,
-
0x07,0x80,0x04,0xB0,0x01,0x03,0xA1,0x01,0x0A,0x40,0x14,0x1E,0x01,0x00,0x00,0x00,
-
0x00,0x01,0x08,0x01,0x01,0x00,0x80,0x00,0xFA,0x13,0x88,0x00,0x01,0x05,0x01,0x01,
-
0x0A,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x77,0x67,0x6A,0x33,0x36,0x6A,0x73,0x30,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x6C,0x78,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x10,0x10,0x10,0x10,0x10,0x10,0x12,0x12,0x12,0x11,0x11,0x11,0x13,0x13,0x13,0x14,
-
0x15,0x15,0x17,0x1B,0x04,0x05,0x05,0x04,0x05,0x05,0x07,0x07,0x08,0x06,0x07,0x07,
-
0x08,0x08,0x09,0x09,0x0A,0x0A,0x0B,0x0C,0x04,0x04,0x05,0x04,0x04,0x05,0x06,0x07,
-
0x07,0x06,0x06,0x06,0x07,0x08,0x08,0x08,0x09,0x0A,0x0B,0x09,0x04,0x05,0x05,0x04,
-
0x05,0x05,0x07,0x07,0x07,0x06,0x06,0x07,0x08,0x08,0x08,0x09,0x0A,0x0A,0x0B,0x09,
-
0x04,0x05,0x05,0x04,0x05,0x05,0x06,0x07,0x07,0x06,0x06,0x06,0x08,0x08,0x08,0x09,
-
0x09,0x0A,0x0B,0x0B,0x04,0x05,0x05,0x04,0x05,0x05,0x07,0x07,0x07,0x06,0x06,0x06,
-
0x08,0x08,0x08,0x09,0x09,0x0A,0x0B,0x0B,0x04,0x05,0x05,0x04,0x05,0x05,0x07,0x07,
-
0x07,0x06,0x06,0x06,0x08,0x08,0x08,0x09,0x09,0x0A,0x0B,0x0B,0x04,0x05,0x05,0x04,
-
0x05,0x05,0x07,0x07,0x07,0x06,0x06,0x06,0x08,0x08,0x08,0x09,0x0A,0x0A,0x0B,0x0B,
-
0x04,0x05,0x05,0x04,0x05,0x05,0x07,0x07,0x07,0x06,0x06,0x06,0x08,0x08,0x08,0x09,
-
0x09,0x0A,0x0B,0x0B,0x04,0x05,0x05,0x04,0x05,0x05,0x06,0x07,0x07,0x06,0x06,0x06,
-
0x08,0x08,0x08,0x09,0x09,0x0A,0x0B,0x0B,0x04,0x04,0x05,0x04,0x05,0x05,0x06,0x07,
-
0x07,0x06,0x06,0x06,0x08,0x08,0x08,0x09,0x09,0x0A,0x0B,0x0B,0x04,0x04,0x05,0x04,
-
0x05,0x05,0x06,0x07,0x07,0x06,0x06,0x06,0x08,0x08,0x08,0x09,0x09,0x0A,0x0B,0x0B,
-
0x04,0x04,0x05,0x04,0x05,0x05,0x06,0x07,0x07,0x06,0x06,0x06,0x08,0x08,0x08,0x09,
-
0x0A,0x0A,0x0B,0x0B,0x04,0x04,0x05,0x04,0x05,0x05,0x06,0x07,0x07,0x06,0x06,0x06,
-
0x08,0x08,0x08,0x09,0x0A,0x0A,0x0B,0x0B,0x04,0x05,0x05,0x04,0x05,0x05,0x07,0x07,
-
0x07,0x06,0x06,0x06,0x08,0x08,0x08,0x09,0x0A,0x0A,0x0B,0x0B,0x04,0x05,0x05,0x04,
-
0x05,0x05,0x07,0x07,0x07,0x06,0x06,0x07,0x08,0x08,0x08,0x09,0x0A,0x0A,0x0B,0x0B,
-
0x04,0x05,0x05,0x04,0x05,0x05,0x07,0x07,0x07,0x06,0x06,0x07,0x08,0x08,0x09,0x09,
-
0x0A,0x0A,0x0B,0x0B,0x04,0x05,0x05,0x04,0x05,0x05,0x07,0x07,0x07,0x06,0x06,0x07,
-
0x08,0x08,0x09,0x09,0x0A,0x0A,0x0B,0x0C,0x04,0x05,0x05,0x04,0x05,0x05,0x07,0x07,
-
0x08,0x06,0x07,0x07,0x08,0x08,0x09,0x09,0x0A,0x0A,0x0B,0x0C,0x04,0x05,0x05,0x05,
-
0x05,0x05,0x07,0x07,0x08,0x06,0x07,0x07,0x08,0x09,0x09,0x09,0x0A,0x0A,0x0B,0x0C,
-
0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x08,0x06,0x07,0x07,0x08,0x09,0x09,0x09,
-
0x0A,0x0A,0x0B,0x0C,0x05,0x05,0x06,0x05,0x05,0x06,0x07,0x08,0x08,0x07,0x07,0x07,
-
0x08,0x09,0x09,0x09,0x0A,0x0B,0x0C,0x0C,0x05,0x05,0x06,0x05,0x06,0x06,0x07,0x08,
-
0x08,0x07,0x07,0x07,0x09,0x09,0x09,0x0A,0x0A,0x0B,0x0C,0x0C,0x05,0x05,0x06,0x05,
-
0x06,0x06,0x08,0x08,0x08,0x07,0x07,0x08,0x09,0x09,0x09,0x0A,0x0B,0x0B,0x0C,0x0C,
-
0x05,0x05,0x06,0x05,0x06,0x06,0x08,0x08,0x08,0x07,0x07,0x07,0x09,0x09,0x09,0x0A,
-
0x0B,0x0B,0x0C,0x0C,0x05,0x05,0x06,0x05,0x06,0x06,0x08,0x08,0x08,0x07,0x07,0x08,
-
0x09,0x09,0x09,0x0A,0x0B,0x0B,0x0C,0x0C,0x05,0x06,0x06,0x05,0x06,0x06,0x08,0x08,
-
0x08,0x07,0x08,0x08,0x09,0x09,0x09,0x0A,0x0B,0x0B,0x0C,0x0A,0x05,0x06,0x06,0x06,
-
0x06,0x06,0x08,0x08,0x09,0x07,0x08,0x08,0x09,0x09,0x0A,0x0A,0x0B,0x0B,0x0C,0x0B,
-
0x05,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x09,0x07,0x08,0x08,0x09,0x09,0x0A,0x0A,
-
0x0B,0x0B,0x0C,0x0B,0x0A,0x0B,0x0B,0x0A,0x0B,0x0B,0x0D,0x0E,0x0E,0x0D,0x0E,0x0E,
-
0x0F,0x10,0x10,0x10,0x13,0x12,0x11,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,
-
0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x28,0x00,0x28,0x00,0x28,0x00,0x28,0x00,
-
0x28,0x00,0x28,0x00,0x28,0x00,0x28,0x00,0x28,0x00,0x28,0xE7,0x09,0xF6,0x08,0xDF,
-
0xFA,0x80,0x46,0xE7,0x09,0xF2,0x08,0xDF,0xFA,0x80,0x3E,0x88,0x82,0x8C,0x83,0xE7,
-
0x09,0xF0,0xA3,0xDF,0xFA,0x80,0x32,0xE3,0x09,0xF6,0x08,0xDF,0xFA,0x80,0x78,0xE3,
-
0x09,0xF2,0x08,0xDF,0xFA,0x80,0x70,0x88,0x82,0x8C,0x83,0xE3,0x09,0xF0,0xA3,0xDF,
-
0xFA,0x80,0x64,0x89,0x82,0x8A,0x83,0xE0,0xA3,0xF6,0x08,0xDF,0xFA,0x80,0x58,0x89,
-
0x82,0x8A,0x83,0xE0,0xA3,0xF2,0x08,0xDF,0xFA,0x80,0x4C,0x80,0xD2,0x80,0xFA,0x80,
-
0xC6,0x80,0xD4,0x80,0x69,0x80,0xF2,0x80,0x33,0x80,0x10,0x80,0xA6,0x80,0xEA,0x80,
-
0x9A,0x80,0xA8,0x80,0xDA,0x80,0xE2,0x80,0xCA,0x80,0x33,0x89,0x82,0x8A,0x83,0xEC,
-
0xFA,0xE4,0x93,0xA3,0xC8,0xC5,0x82,0xC8,0xCC,0xC5,0x83,0xCC,0xF0,0xA3,0xC8,0xC5,
-
0x82,0xC8,0xCC,0xC5,0x83,0xCC,0xDF,0xE9,0xDE,0xE7,0x80,0x0D,0x89,0x82,0x8A,0x83,
-
0xE4,0x93,0xA3,0xF6,0x08,0xDF,0xF9,0xEC,0xFA,0xA9,0xF0,0xED,0xFB,0x22,0x89,0x82,
-
0x8A,0x83,0xEC,0xFA,0xE0,0xA3,0xC8,0xC5,0x82,0xC8,0xCC,0xC5,0x83,0xCC,0xF0,0xA3,
-
0xC8,0xC5,0x82,0xC8,0xCC,0xC5,0x83,0xCC,0xDF,0xEA,0xDE,0xE8,0x80,0xDB,0x89,0x82,
-
0x8A,0x83,0xE4,0x93,0xA3,0xF2,0x08,0xDF,0xF9,0x80,0xCC,0x88,0xF0,0xEF,0x60,0x01,
-
0x0E,0x4E,0x60,0xC3,0x88,0xF0,0xED,0x24,0x02,0xB4,0x04,0x00,0x50,0xB9,0xF5,0x82,
-
0xEB,0x24,0x02,0xB4,0x04,0x00,0x50,0xAF,0x23,0x23,0x45,0x82,0x23,0x90,0x41,0xFB,
-
0x73,0xBB,0x01,0x06,0x89,0x82,0x8A,0x83,0xF0,0x22,0x50,0x02,0xF7,0x22,0xBB,0xFE,
-
0x01,0xF3,0x22,0xEF,0x8D,0xF0,0xA4,0xA8,0xF0,0xCF,0x8C,0xF0,0xA4,0x28,0xCE,0x8D,
-
0xF0,0xA4,0x2E,0xFE,0x22,0xBC,0x00,0x0B,0xBE,0x00,0x29,0xEF,0x8D,0xF0,0x84,0xFF,
-
0xAD,0xF0,0x22,0xE4,0xCC,0xF8,0x75,0xF0,0x08,0xEF,0x2F,0xFF,0xEE,0x33,0xFE,0xEC,
-
0x33,0xFC,0xEE,0x9D,0xEC,0x98,0x40,0x05,0xFC,0xEE,0x9D,0xFE,0x0F,0xD5,0xF0,0xE9,
-
0xE4,0xCE,0xFD,0x22,0xED,0xF8,0xF5,0xF0,0xEE,0x84,0x20,0xD2,0x1C,0xFE,0xAD,0xF0,
-
0x75,0xF0,0x08,0xEF,0x2F,0xFF,0xED,0x33,0xFD,0x40,0x07,0x98,0x50,0x06,0xD5,0xF0,
-
0xF2,0x22,0xC3,0x98,0xFD,0x0F,0xD5,0xF0,0xEA,0x22,0xC2,0xD5,0xEC,0x30,0xE7,0x09,
-
0xB2,0xD5,0xE4,0xC3,0x9D,0xFD,0xE4,0x9C,0xFC,0xEE,0x30,0xE7,0x15,0xB2,0xD5,0xE4,
-
0xC3,0x9F,0xFF,0xE4,0x9E,0xFE,0x12,0x42,0xC5,0xC3,0xE4,0x9D,0xFD,0xE4,0x9C,0xFC,
-
0x80,0x03,0x12,0x42,0xC5,0x30,0xD5,0x07,0xC3,0xE4,0x9F,0xFF,0xE4,0x9E,0xFE,0x22,
-
0xC5,0xF0,0xF8,0xA3,0xE0,0x28,0xF0,0xC5,0xF0,0xF8,0xE5,0x82,0x15,0x82,0x70,0x02,
-
0x15,0x83,0xE0,0x38,0xF0,0x22,0xE8,0x8F,0xF0,0xA4,0xCC,0x8B,0xF0,0xA4,0x2C,0xFC,
-
0xE9,0x8E,0xF0,0xA4,0x2C,0xFC,0x8A,0xF0,0xED,0xA4,0x2C,0xFC,0xEA,0x8E,0xF0,0xA4,
-
0xCD,0xA8,0xF0,0x8B,0xF0,0xA4,0x2D,0xCC,0x38,0x25,0xF0,0xFD,0xE9,0x8F,0xF0,0xA4,
-
0x2C,0xCD,0x35,0xF0,0xFC,0xEB,0x8E,0xF0,0xA4,0xFE,0xA9,0xF0,0xEB,0x8F,0xF0,0xA4,
-
0xCF,0xC5,0xF0,0x2E,0xCD,0x39,0xFE,0xE4,0x3C,0xFC,0xEA,0xA4,0x2D,0xCE,0x35,0xF0,
-
0xFD,0xE4,0x3C,0xFC,0x22,0xEB,0x9F,0xF5,0xF0,0xEA,0x9E,0x42,0xF0,0xE9,0x9D,0x42,
-
0xF0,0xE8,0x9C,0x45,0xF0,0x22,0xE8,0x60,0x0F,0xEC,0xC3,0x13,0xFC,0xED,0x13,0xFD,
-
0xEE,0x13,0xFE,0xEF,0x13,0xFF,0xD8,0xF1,0x22,0xEC,0xF0,0xA3,0xED,0xF0,0xA3,0xEE,
-
0xF0,0xA3,0xEF,0xF0,0x22,0xA8,0x82,0x85,0x83,0xF0,0xD0,0x83,0xD0,0x82,0x12,0x43,
-
0xFC,0x12,0x43,0xFC,0x12,0x43,0xFC,0x12,0x43,0xFC,0xE4,0x73,0xE4,0x93,0xA3,0xC5,
-
0x83,0xC5,0xF0,0xC5,0x83,0xC8,0xC5,0x82,0xC8,0xF0,0xA3,0xC5,0x83,0xC5,0xF0,0xC5,
-
0x83,0xC8,0xC5,0x82,0xC8,0x22,0xA4,0x25,0x82,0xF5,0x82,0xE5,0xF0,0x35,0x83,0xF5,
-
0x83,0x22,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,
-
0xF0,0xA3,0xF0,0xA3,0xF0,0x22,0x90,0xF0,0x6F,0xF0,0x90,0xF0,0x72,0x74,0x08,0xF0,
-
0xE4,0x90,0xF0,0x71,0xF0,0x90,0xF0,0x74,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x73,0xF0,
-
0x90,0xF0,0x76,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x75,0xF0,0x90,0xF0,0x78,0x74,0x08,
-
0xF0,0xE4,0x90,0xF0,0x77,0xF0,0x90,0xF0,0x7A,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x79,
-
0xF0,0x90,0xF0,0x7C,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x7B,0xF0,0x90,0xF0,0x7E,0x74,
-
0x08,0xF0,0xE4,0x90,0xF0,0x7D,0xF0,0x90,0xF0,0x80,0x74,0x08,0xF0,0xE4,0x90,0xF0,
-
0x7F,0xF0,0x90,0xF0,0x82,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x81,0xF0,0x90,0xF0,0x84,
-
0x74,0x08,0xF0,0xE4,0x90,0xF0,0x83,0xF0,0x90,0xF0,0x86,0x74,0x08,0xF0,0xE4,0x90,
-
0xF0,0x85,0xF0,0x90,0xF0,0x88,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x87,0xF0,0x90,0xF0,
-
0x8A,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x89,0xF0,0x90,0xF0,0x8C,0x74,0x08,0xF0,0xE4,
-
0x90,0xF0,0x8B,0xF0,0x90,0xF0,0x8E,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x8D,0xF0,0x90,
-
0xF0,0x90,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x8F,0xF0,0x90,0xF0,0x92,0x22,0xF0,0x90,
-
0xF0,0x32,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x31,0xF0,0x90,0xF0,0x34,0x74,0x08,0xF0,
-
0xE4,0x90,0xF0,0x33,0xF0,0x90,0xF0,0x36,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x35,0xF0,
-
0x90,0xF0,0x38,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x37,0xF0,0x90,0xF0,0x3A,0x74,0x08,
-
0xF0,0xE4,0x90,0xF0,0x39,0xF0,0x90,0xF0,0x3C,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x3B,
-
0xF0,0x90,0xF0,0x3E,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x3D,0xF0,0x90,0xF0,0x40,0x74,
-
0x08,0xF0,0xE4,0x90,0xF0,0x3F,0xF0,0x90,0xF0,0x42,0x74,0x08,0xF0,0xE4,0x90,0xF0,
-
0x41,0xF0,0x90,0xF0,0x44,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x43,0xF0,0x90,0xF0,0x46,
-
0x74,0x08,0xF0,0xE4,0x90,0xF0,0x45,0xF0,0x90,0xF0,0x48,0x74,0x08,0xF0,0xE4,0x90,
-
0xF0,0x47,0xF0,0x90,0xF0,0x4A,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x49,0xF0,0x90,0xF0,
-
0x4C,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x4B,0xF0,0x90,0xF0,0x4E,0x74,0x08,0xF0,0xE4,
-
0x90,0xF0,0x4D,0xF0,0x90,0xF0,0x50,0x22,0x90,0xF0,0xB0,0xF0,0xE4,0x90,0xF0,0xAF,
-
0xF0,0x90,0xF0,0xB2,0x74,0x08,0xF0,0xE4,0x90,0xF0,0xB1,0xF0,0x90,0xF0,0xB4,0x74,
-
0x08,0xF0,0xE4,0x90,0xF0,0xB3,0xF0,0x90,0xF0,0xB6,0x74,0x08,0xF0,0xE4,0x90,0xF0,
-
0xB5,0xF0,0x90,0xF0,0xB8,0x74,0x08,0xF0,0xE4,0x90,0xF0,0xB7,0xF0,0x90,0xF0,0xBA,
-
0x74,0x08,0xF0,0xE4,0x90,0xF0,0xB9,0xF0,0x90,0xF0,0xBC,0x74,0x08,0xF0,0xE4,0x90,
-
0xF0,0xBB,0xF0,0x90,0xF0,0xBE,0x74,0x08,0xF0,0xE4,0x90,0xF0,0xBD,0xF0,0x90,0xF0,
-
0xC0,0x74,0x08,0xF0,0xE4,0x90,0xF0,0xBF,0xF0,0x90,0xF1,0x06,0x22,0xF0,0xE4,0x90,
-
0xF0,0x01,0xF0,0x90,0xF0,0x04,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x03,0xF0,0x90,0xF0,
-
0x06,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x05,0xF0,0x90,0xF0,0x08,0x74,0x08,0xF0,0xE4,
-
0x90,0xF0,0x07,0xF0,0x90,0xF0,0x0A,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x09,0xF0,0x90,
-
0xF0,0x0C,0x74,0x08,0xF0,0xE4,0x90,0xF0,0x0B,0xF0,0x90,0xF0,0x0E,0x74,0x08,0xF0,
-
0xE4,0x90,0xF0,0x0D,0xF0,0x90,0xF0,0x10,0x22,0x90,0xF1,0x0E,0xF0,0x90,0xF1,0x0F,
-
0xF0,0x90,0xF1,0x10,0xF0,0x90,0xF1,0x11,0xF0,0x90,0xF1,0x12,0xF0,0x90,0xF1,0x13,
-
0xF0,0x90,0xF1,0x14,0x22,0x90,0xF0,0x12,0xF0,0x90,0xF0,0x11,0x74,0x01,0xF0,0x90,
-
0xF0,0x14,0x22,0x90,0xF0,0x16,0xF0,0x90,0xF0,0x15,0x74,0x03,0xF0,0x90,0xF0,0x18,
-
0x22,0x90,0xF0,0xAC,0xF0,0x90,0xF0,0xAB,0x74,0x02,0xF0,0x90,0xF0,0xAE,0x22,0xAD,
-
0x07,0x2D,0xF5,0x82,0xE4,0x22,0xE4,0x90,0x88,0xB0,0xF0,0x90,0x13,0xB3,0xF0,0x90,
-
0x13,0xB3,0xE0,0xFF,0xC3,0x94,0x50,0x50,0x10,0x74,0x60,0x2F,0x12,0x26,0xB0,0xE4,
-
0xF0,0x90,0x13,0xB3,0xE0,0x04,0xF0,0x80,0xE6,0xD2,0xB3,0x30,0xB3,0x05,0x75,0x9E,
-
0x55,0x80,0xF8,0xC2,0xDB,0xC2,0x11,0xE4,0x90,0x13,0xB3,0xF0,0x90,0xF2,0xA8,0xE0,
-
0xFF,0x90,0x13,0xB3,0xE0,0xFE,0xC3,0x9F,0x40,0x03,0x02,0x48,0x43,0x74,0x00,0x2E,
-
0x12,0x21,0xC5,0xB5,0x06,0x06,0x90,0x88,0xB0,0xE0,0x04,0xF0,0x12,0x24,0x1D,0x24,
-
0x02,0xF5,0x82,0xE5,0xF0,0x34,0x18,0xF5,0x83,0xE0,0x90,0x88,0xC3,0x12,0x28,0x24,
-
0x24,0x01,0xF5,0x82,0xE5,0xF0,0x34,0x18,0xF5,0x83,0xE0,0x90,0x88,0xC4,0x12,0x24,
-
0x1C,0x24,0x00,0xF5,0x82,0xE5,0xF0,0x34,0x18,0xF5,0x83,0xE0,0x90,0x88,0xC5,0x12,
-
0x28,0x24,0x24,0x02,0xF5,0x82,0xE5,0xF0,0x34,0x30,0xF5,0x83,0xE0,0x90,0x88,0xC7,
-
0x12,0x24,0x1C,0x24,0x01,0xF5,0x82,0xE5,0xF0,0x34,0x30,0xF5,0x83,0xE0,0x90,0x88,
-
0xC8,0x12,0x28,0x24,0x24,0x00,0xF5,0x82,0xE5,0xF0,0x34,0x30,0xF5,0x83,0xE0,0x90,
-
0x88,0xC9,0x12,0x24,0x1C,0x24,0x52,0xF5,0x82,0xE5,0xF0,0x34,0x82,0xF5,0x83,0xE0,
-
0x90,0x88,0xCE,0x12,0x28,0x24,0x24,0x51,0xF5,0x82,0xE5,0xF0,0x34,0x82,0xF5,0x83,
-
0xE0,0x90,0x88,0xCF,0x12,0x24,0x1C,0x24,0x50,0xF5,0x82,0xE5,0xF0,0x34,0x82,0xF5,
-
0x83,0xE0,0x90,0x88,0xD0,0xF0,0x74,0x00,0x2F,0x12,0x21,0xC5,0x12,0x26,0xAE,0xE0,
-
0x90,0x13,0xB3,0x70,0x4C,0xE0,0xFB,0x12,0x21,0xC3,0x12,0x26,0xAE,0x74,0x01,0xF0,
-
0x90,0x88,0xC2,0x12,0x20,0x9B,0x74,0x00,0x2B,0x12,0x21,0xC5,0x12,0x27,0x9B,0x12,
-
0x43,0xD9,0x90,0x88,0xC6,0x12,0x20,0x9B,0x90,0x13,0xB3,0xE0,0xFB,0x12,0x21,0xC3,
-
0x12,0x27,0xAA,0x12,0x43,0xD9,0x90,0x88,0xCD,0x12,0x20,0x9B,0x74,0x00,0x2B,0x12,
-
0x21,0xC5,0x12,0x24,0x2B,0x12,0x21,0x95,0x12,0x25,0xC3,0x12,0x1F,0x8C,0x02,0x48,
-
0x3A,0x12,0x21,0xC2,0x12,0x27,0x9B,0xC0,0x83,0xC0,0x82,0x12,0x20,0x9B,0x90,0x88,
-
0xC2,0x12,0x23,0xF3,0xD0,0x82,0xD0,0x83,0x12,0x43,0xD9,0x12,0x21,0xBF,0x12,0x27,
-
0xAA,0xC0,0x83,0xC0,0x82,0x12,0x20,0x9B,0x90,0x88,0xC6,0x12,0x23,0xF3,0xD0,0x82,
-
0xD0,0x83,0x12,0x43,0xD9,0x12,0x21,0xBF,0x12,0x24,0x2B,0xC0,0x83,0xC0,0x82,0x12,
-
0x20,0x9B,0x90,0x88,0xCD,0x12,0x23,0xF3,0xD0,0x82,0xD0,0x83,0x12,0x21,0x95,0x12,
-
0x25,0xC3,0xF5,0x83,0xEE,0x8F,0xF0,0x12,0x43,0x50,0x90,0x13,0xB3,0xE0,0x04,0xF0,
-
0x02,0x46,0xCC,0x22,0xE4,0x90,0x13,0xB4,0xF0,0x90,0x13,0xB3,0xF0,0x90,0xF2,0xA8,
-
0xE0,0xFF,0x90,0x13,0xB3,0xE0,0xFE,0xC3,0x9F,0x40,0x03,0x02,0x49,0xC3,0x74,0x60,
-
0x2E,0x12,0x26,0xB0,0xE0,0x64,0x01,0x60,0x03,0x02,0x49,0xA8,0xEE,0x12,0x25,0xC3,
-
0x12,0x21,0x7C,0xD3,0x94,0xFF,0xEE,0x94,0x00,0x40,0x0C,0x90,0x13,0xB4,0xE0,0x12,
-
0x24,0xCE,0x74,0xFF,0xF0,0x80,0x16,0x90,0x13,0xB3,0xE0,0x12,0x25,0xC3,0xF5,0x83,
-
0xE0,0xA3,0xE0,0xFF,0x90,0x13,0xB4,0xE0,0x12,0x24,0xCE,0xEF,0xF0,0x12,0x24,0x27,
-
0x12,0x20,0x9B,0x78,0x02,0x12,0x43,0xC6,0xE4,0x7B,0xFF,0xFA,0x12,0x24,0xC3,0x50,
-
0x08,0x12,0x26,0xB8,0x74,0xFF,0xF0,0x80,0x10,0x12,0x24,0x27,0x12,0x20,0x9B,0x78,
-
0x02,0x12,0x43,0xC6,0x12,0x26,0xB8,0xEF,0xF0,0x85,0x0B,0xAF,0x90,0x13,0xB3,0x12,
-
0x24,0x20,0x24,0x01,0xF5,0x82,0xE5,0xF0,0x34,0x84,0x12,0x29,0x48,0x24,0x02,0xF5,
-
0x82,0xE5,0xF0,0x34,0x84,0xF5,0x83,0xE0,0xF5,0xAA,0x90,0x13,0xB3,0x12,0x24,0x20,
-
0x24,0x03,0xF5,0x82,0xE5,0xF0,0x34,0x84,0xF5,0x83,0xE0,0xF5,0xAB,0x75,0xF0,0x04,
-
0xEF,0xA4,0x24,0x81,0xF5,0x82,0xE5,0xF0,0x34,0x86,0xF5,0x83,0xE0,0xF5,0xA2,0x90,
-
0x13,0xB3,0x12,0x24,0x20,0x24,0x82,0xF5,0x82,0xE5,0xF0,0x34,0x86,0xF5,0x83,0xE0,
-
0xF5,0xA3,0x75,0xF0,0x04,0xEF,0xA4,0x24,0x83,0xF5,0x82,0xE5,0xF0,0x34,0x86,0xF5,
-
0x83,0xE0,0xF5,0xA4,0xD2,0xB0,0x85,0x0C,0xAF,0x90,0x13,0xB3,0x12,0x24,0x20,0x24,
-
0x41,0xF5,0x82,0xE5,0xF0,0x34,0x85,0x12,0x29,0x48,0x24,0x42,0xF5,0x82,0xE5,0xF0,
-
0x34,0x85,0xF5,0x83,0xE0,0xF5,0xAA,0x90,0x13,0xB3,0xE0,0x75,0xF0,0x04,0xA4,0x24,
-
0x43,0xF5,0x82,0xE5,0xF0,0x34,0x85,0xF5,0x83,0xE0,0xF5,0xAB,0x20,0xB0,0x06,0x30,
-
0x11,0x03,0x20,0xDA,0x05,0x75,0x9E,0x55,0x80,0xF2,0x12,0x24,0x3A,0x12,0x27,0xB9,
-
0x12,0x1F,0xDF,0x12,0x1F,0x8C,0xD2,0xB0,0x20,0xB0,0x06,0x30,0x11,0x03,0x20,0xDA,
-
0x05,0x75,0x9E,0x55,0x80,0xF2,0x12,0x24,0x3A,0x12,0x27,0xB9,0x12,0x21,0xE7,0x12,
-
0x1F,0x8C,0x90,0x13,0xB4,0xE0,0x04,0xF0,0x90,0x13,0xB4,0xE0,0xFF,0x65,0x08,0x60,
-
0x12,0x90,0x88,0xB0,0xE0,0xFE,0xEF,0x6E,0x60,0x09,0x90,0x13,0xB3,0xE0,0x04,0xF0,
-
0x02,0x48,0x4D,0x90,0x13,0xB4,0xE0,0x90,0x88,0xB0,0xF0,0x22,0xE4,0xFB,0xEB,0xC3,
-
0x95,0x0D,0x40,0x03,0x02,0x4B,0x39,0x74,0xE5,0x2B,0x12,0x20,0x7E,0xE0,0x70,0x03,
-
0x02,0x4B,0x35,0x12,0x20,0xCB,0x12,0x21,0x7C,0xC3,0x94,0x64,0xEE,0x64,0x80,0x94,
-
0x80,0x50,0x39,0x12,0x20,0xCB,0x12,0x21,0x7C,0xFF,0xC3,0x74,0x64,0x9F,0xFF,0xE4,
-
0x12,0x20,0xB4,0x12,0x1F,0x1B,0x12,0x28,0x5E,0xEB,0x12,0x21,0x2F,0x12,0x1F,0x8C,
-
0xEB,0x12,0x21,0x2F,0x12,0x21,0x7C,0xC3,0xEE,0x64,0x80,0x94,0x80,0x50,0x62,0xEB,
-
0x12,0x21,0x2F,0xF5,0x83,0xE4,0xF0,0xA3,0xF0,0x02,0x4A,0x81,0x12,0x23,0x52,0x12,
-
0x20,0xCB,0x12,0x1F,0x1B,0x12,0x25,0x6E,0x40,0x39,0x12,0x23,0x52,0x12,0x20,0xCB,
-
0x12,0x1F,0x1B,0xC3,0x9F,0xFF,0xEC,0x12,0x20,0xB4,0x12,0x1F,0x1B,0x2F,0xFF,0xEC,
-
0x3E,0xFE,0xEB,0x12,0x21,0x2F,0x12,0x1F,0x8C,0x12,0x26,0xE1,0x12,0x23,0x5F,0xEB,
-
0x12,0x21,0x2F,0x12,0x1F,0x1B,0x12,0x25,0x6E,0x40,0x16,0x12,0x26,0xE1,0x12,0x23,
-
0x5F,0x80,0x07,0x12,0x20,0xCB,0x12,0x21,0x7C,0xFF,0xEB,0x12,0x21,0x2F,0x12,0x1F,
-
0x8C,0x12,0x21,0x52,0x12,0x21,0x7C,0xC3,0x94,0x64,0xEE,0x64,0x80,0x94,0x80,0x50,
-
0x39,0x12,0x21,0x52,0x12,0x21,0x7C,0xFF,0xC3,0x74,0x64,0x9F,0xFF,0xE4,0x12,0x21,
-
0x3B,0x12,0x1F,0x1B,0x12,0x28,0x5E,0xEB,0x12,0x20,0x44,0x12,0x1F,0x8C,0xEB,0x12,
-
0x20,0x44,0x12,0x21,0x7C,0xC3,0xEE,0x64,0x80,0x94,0x80,0x50,0x78,0xEB,0x12,0x20,
-
0x44,0xF5,0x83,0xE4,0xF0,0xA3,0xF0,0x02,0x4B,0x35,0x90,0xF1,0x07,0xAE,0x0C,0x12,
-
0x23,0x57,0x12,0x21,0x52,0x12,0x1F,0x1B,0x12,0x25,0x6E,0x40,0x4A,0x90,0xF1,0x07,
-
0xE0,0xFF,0xAE,0x0C,0x12,0x23,0x59,0x12,0x21,0x52,0x12,0x1F,0x1B,0xC3,0x9F,0xFF,
-
0xEC,0x12,0x21,0x3B,0x12,0x1F,0x1B,0x2F,0xFF,0xEC,0x3E,0xFE,0xEB,0x12,0x20,0x44,
-
0x12,0x1F,0x8C,0xAF,0x0C,0x90,0xF1,0x07,0x12,0x26,0xE6,0x12,0x23,0x5F,0xEB,0x12,
-
0x20,0x44,0x12,0x1F,0x1B,0x12,0x25,0x6E,0x40,0x1B,0xAF,0x0C,0x90,0xF1,0x07,0x12,
-
0x26,0xE6,0x12,0x23,0x5F,0x80,0x07,0x12,0x21,0x52,0x12,0x21,0x7C,0xFF,0xEB,0x12,
-
0x20,0x44,0x12,0x1F,0x8C,0x0B,0x02,0x49,0xCE,0x22,0xE4,0xF5,0x99,0x75,0x96,0x03,
-
0x75,0x9E,0x55,0xC2,0x04,0xC2,0x0B,0xC2,0x0C,0xC2,0x11,0xC2,0x18,0xC2,0x07,0xC2,
-
0x08,0x90,0x12,0x83,0x12,0x44,0x22,0x90,0x12,0x79,0x12,0x44,0x22,0x90,0x13,0x83,
-
0x12,0x44,0x22,0xA3,0x12,0x44,0x22,0x90,0x13,0x98,0x12,0x44,0x22,0xD2,0xB1,0xC2,
-
0xB6,0xC2,0xB7,0x75,0xA0,0x02,0xF5,0xAE,0x90,0xF0,0xC4,0xF0,0x90,0x8F,0xF0,0xF0,
-
0xFF,0xFE,0x74,0xE5,0x12,0x46,0x8F,0x34,0x88,0xF5,0x83,0xE4,0xF0,0x74,0xA0,0x2D,
-
0xF5,0x82,0xE4,0x34,0x37,0xF5,0x83,0xE4,0xF0,0x0F,0xBF,0x00,0x01,0x0E,0xEF,0x64,
-
0x14,0x4E,0x70,0xDE,0xE4,0x90,0x88,0xC0,0xF0,0x90,0x88,0xC1,0xF0,0xF5,0xDC,0xF5,
-
0xDD,0xF5,0xDE,0xF5,0xD9,0xF5,0xDA,0xF5,0xDB,0x90,0x88,0xC2,0xF0,0x90,0x88,0xC6,
-
0xF0,0x90,0x88,0xCD,0xF0,0xC2,0x0E,0xC2,0x0D,0xC2,0x17,0x75,0x8A,0x8F,0xF5,0x8B,
-
0x90,0x8F,0xFF,0xF0,0xC2,0x05,0xC2,0x19,0x75,0x08,0x0A,0x75,0x0D,0x0A,0x90,0x8B,
-
0x7C,0x74,0x0A,0xF0,0x90,0x8B,0x7D,0x74,0x01,0xF0,0x90,0x8B,0x7E,0x74,0x05,0xF0,
-
0x75,0x0B,0x40,0x75,0x0C,0x40,0x90,0x8B,0x78,0x74,0x07,0xF0,0xA3,0x74,0x80,0xF0,
-
0x90,0x8B,0x7A,0x74,0x04,0xF0,0xA3,0x74,0xB0,0xF0,0xE4,0x90,0x3F,0xFE,0xF0,0xC2,
-
0x13,0x90,0x12,0xC0,0xF0,0x90,0x12,0x58,0xF0,0x90,0x12,0x59,0xF0,0x90,0x12,0x63,
-
0xF0,0xA3,0x74,0x03,0xF0,0xC2,0x0F,0xC2,0x03,0xE4,0x90,0x12,0x94,0xF0,0xA3,0xF0,
-
0x90,0x12,0x76,0xF0,0x90,0x8F,0xFE,0xF0,0xFE,0xFF,0x75,0x9E,0x55,0x74,0x00,0x12,
-
0x46,0x8F,0x34,0x8F,0xF5,0x83,0xE4,0xF0,0x74,0x78,0x2D,0xF5,0x82,0xE4,0x34,0x8F,
-
0xF5,0x83,0xE4,0xF0,0x0F,0xBF,0x00,0x01,0x0E,0xEF,0x64,0x3C,0x4E,0x70,0xDB,0xE4,
-
0xFE,0xFF,0xAD,0x07,0x74,0xA2,0x2D,0xF5,0x82,0xE4,0x34,0x13,0xF5,0x83,0xE4,0xF0,
-
0x74,0x65,0x2D,0xF5,0x82,0xE4,0x34,0x12,0xF5,0x83,0xE4,0xF0,0x0F,0xBF,0x00,0x01,
-
0x0E,0xEF,0x64,0x0A,0x4E,0x70,0xDB,0xE4,0x90,0x12,0x72,0xF0,0xA3,0xF0,0x90,0x13,
-
0x81,0xF0,0xA3,0xF0,0x90,0x13,0x97,0xF0,0x90,0x3F,0xFD,0x04,0xF0,0x22,0xAB,0x07,
-
0xC2,0x1B,0xEB,0x25,0xE0,0xFE,0xE4,0x33,0x90,0x13,0xB5,0xF0,0xA3,0xCE,0xF0,0xE4,
-
0xFA,0xEA,0xFF,0x7E,0x00,0x7C,0x00,0x7D,0x28,0x12,0x42,0xB3,0xAC,0x06,0xAD,0x07,
-
0xEB,0x25,0xE0,0xFF,0xE4,0x33,0xFE,0xED,0x2F,0xFF,0xEC,0x3E,0x90,0x13,0xB5,0xF0,
-
0xA3,0xEF,0xF0,0x90,0x13,0xB5,0xE0,0xFC,0xA3,0xE0,0xFD,0x24,0x01,0xF5,0x82,0x74,
-
0x20,0x3C,0xF5,0x83,0xE0,0xFE,0x74,0x00,0x2D,0xF5,0x82,0x74,0x20,0x3C,0xF5,0x83,
-
0xE0,0xFD,0xED,0xFF,0x90,0x13,0xB3,0xEE,0xF0,0xA3,0xEF,0xF0,0xA3,0xA3,0xE0,0xFD,
-
0x24,0x01,0xF5,0x82,0x74,0x00,0x3C,0xF5,0x83,0xE0,0xFE,0x74,0x00,0x2D,0xF5,0x82,
-
0x74,0x00,0x3C,0xF5,0x83,0xE0,0xFD,0xED,0xFF,0x90,0x13,0xB4,0xE0,0x24,0x58,0xFD,
-
0x90,0x13,0xB3,0xE0,0x34,0x02,0xFC,0xD3,0xEF,0x9D,0xEE,0x9C,0x40,0x0E,0x90,0x12,
-
0x73,0xE0,0x04,0xF0,0x70,0x06,0x90,0x12,0x72,0xE0,0x04,0xF0,0xEF,0x24,0x58,0xFF,
-
0xEE,0x34,0x02,0xFE,0xD3,0x90,0x13,0xB4,0xE0,0x9F,0x90,0x13,0xB3,0xE0,0x9E,0x40,
-
0x0E,0x90,0x13,0x82,0xE0,0x04,0xF0,0x70,0x06,0x90,0x13,0x81,0xE0,0x04,0xF0,0x0A,
-
0xEA,0x64,0x1E,0x60,0x03,0x02,0x4C,0xB1,0x90,0x13,0x97,0xE0,0x04,0xF0,0xE0,0x64,
-
0x14,0x70,0x37,0xF0,0x90,0x13,0x81,0xE0,0xFE,0xA3,0xE0,0xFF,0xD3,0x90,0x12,0x73,
-
0xE0,0x9F,0x90,0x12,0x72,0xE0,0x9E,0x40,0x02,0xD2,0x1B,0x30,0x1B,0x1C,0xC2,0x1B,
-
0xE4,0x90,0x12,0x72,0xF0,0xA3,0xF0,0x90,0x13,0x81,0xF0,0xA3,0xF0,0x90,0xF1,0x04,
-
0x74,0x1E,0xF0,0x90,0xF0,0xC5,0xE0,0x44,0x01,0xF0,0x22,0xE5,0xC0,0x54,0x02,0x70,
-
0x03,0x02,0x38,0x2C,0xE5,0xC0,0x54,0x02,0x60,0x13,0x90,0x00,0x00,0x7F,0x00,0x7E,
-
0x90,0xE4,0x74,0xFF,0xF0,0xA3,0x75,0x9E,0x55,0xDF,0xF9,0xDE,0xF7,0x02,0x38,0x2C,
-
0xC2,0xD3,0xC2,0xD4,0x75,0x9E,0x55,0x12,0x4E,0x7C,0x12,0x4E,0x7C,0x78,0x01,0x74,
-
0x55,0xF6,0x64,0xFF,0x08,0xB8,0x60,0xF9,0x78,0x80,0x74,0x55,0xF6,0x64,0xFF,0x08,
-
0xB8,0x00,0xF9,0x75,0x9E,0x55,0x12,0x4E,0x7C,0x12,0x4E,0x7C,0x78,0x01,0x74,0x55,
-
0xC0,0xE0,0x66,0x70,0x22,0xD0,0xE0,0x63,0xE0,0xFF,0x08,0xB8,0x60,0xF2,0x78,0x80,
-
0x74,0x55,0xC0,0xE0,0x66,0x70,0x10,0xD0,0xE0,0x63,0xE0,0xFF,0x08,0xB8,0x00,0xF2,
-
0x90,0x00,0x00,0x74,0x01,0xF0,0x22,0x90,0x00,0x00,0x74,0x00,0xF0,0xA3,0x90,0x00,
-
0x01,0xE8,0xF0,0xD0,0xE0,0x22,0x78,0x60,0x74,0x55,0xF6,0x64,0xFF,0x08,0xB8,0x81,
-
0xF9,0x75,0x9E,0x55,0x12,0x4E,0x7C,0x12,0x4E,0x7C,0x78,0x60,0x74,0x55,0xC0,0xE0,
-
0x66,0x70,0x11,0xD0,0xE0,0x63,0xE0,0xFF,0x08,0xB8,0x81,0xF2,0x90,0x00,0x00,0xE0,
-
0x44,0x02,0xF0,0x22,0x90,0x00,0x00,0xE0,0x44,0x00,0xF0,0x90,0x00,0x02,0xE8,0xF0,
-
0xD0,0xE0,0x22,0xC0,0xE0,0xC0,0xD0,0xD0,0xD0,0xD0,0xE0,0x32,0x78,0x00,0xD8,0xFE,
-
0x22,0x78,0x96,0x79,0xFA,0xD9,0xFE,0xD8,0xFA,0x22,0x78,0x02,0x79,0xFA,0x7A,0xFA,
-
0xDA,0xFE,0xD9,0xFA,0xD8,0xF6,0x22,0x00,0x00,0xE4,0x90,0x13,0xB7,0xF0,0xA3,0xF0,
-
0x90,0x13,0xB3,0xF0,0xA3,0xF0,0xB2,0x86,0xB2,0x86,0xFD,0xFC,0xB2,0x85,0x75,0x9E,
-
0x55,0xED,0xAE,0x04,0x78,0x07,0xC3,0x33,0xCE,0x33,0xCE,0xD8,0xF9,0xFF,0x90,0x13,
-
0xB3,0xEE,0xF0,0xA3,0xEF,0xF0,0xE4,0x90,0x13,0xB9,0xF0,0xA3,0xF0,0x90,0x13,0xB3,
-
0xE0,0xFA,0xA3,0xE0,0xFB,0xEA,0xA3,0xF0,0xEB,0xA3,0xF0,0xE4,0xF9,0xFB,0xFA,0x90,
-
0x13,0xB3,0xE0,0xFE,0xA3,0xE0,0xFF,0x12,0x53,0xAC,0xEF,0x29,0xF9,0x90,0x13,0xB4,
-
0xE0,0x04,0xF0,0x70,0x06,0x90,0x13,0xB3,0xE0,0x04,0xF0,0x0B,0xBB,0x00,0x01,0x0A,
-
0xEB,0x64,0x08,0x4A,0x70,0xD9,0x90,0x13,0xB5,0xE0,0x29,0xFF,0xA3,0xE0,0x2F,0x24,
-
0x08,0xF4,0x04,0xF9,0xFF,0x90,0x13,0xB8,0xE0,0x2F,0xF0,0x90,0x13,0xB7,0xE0,0x34,
-
0x00,0xF0,0x90,0x13,0xBA,0xE0,0x04,0xF0,0x70,0x06,0x90,0x13,0xB9,0xE0,0x04,0xF0,
-
0xC3,0x90,0x13,0xBA,0xE0,0x94,0x10,0x90,0x13,0xB9,0xE0,0x64,0x80,0x94,0x80,0x40,
-
0x8C,0x0D,0xBD,0x00,0x01,0x0C,0xED,0x70,0x03,0xEC,0x64,0x01,0x60,0x03,0x02,0x4E,
-
0xAC,0x90,0x13,0xB7,0xE0,0xFC,0xA3,0xE0,0xFD,0xEC,0x90,0x8E,0x0E,0xF0,0xED,0x90,
-
0x8E,0x0F,0xF0,0x90,0x8E,0x0D,0x74,0xAA,0xF0,0xB2,0x86,0xB2,0x86,0x75,0x9E,0x55,
-
0x80,0xFB,0x90,0x12,0x71,0xE0,0x25,0xE0,0x24,0xC2,0xF5,0x82,0xE4,0x34,0x12,0xF5,
-
0x83,0xE0,0x75,0xF0,0x02,0xA4,0xFF,0xAE,0xF0,0x90,0x12,0x77,0xEE,0xF0,0xA3,0xEF,
-
0xF0,0x24,0x01,0xF9,0x74,0xF0,0x3E,0xFA,0x90,0x12,0x5C,0x74,0x01,0xF0,0xA3,0xEA,
-
0xF0,0xA3,0xE9,0xF0,0x90,0x12,0x5C,0xE0,0xFB,0xA3,0xE0,0xFA,0xA3,0xE0,0xF9,0xE4,
-
0x12,0x42,0xA1,0x90,0x12,0x5D,0x75,0xF0,0x01,0x12,0x43,0x50,0x90,0x12,0x5C,0xE0,
-
0xFB,0xA3,0xE0,0xFA,0xA3,0xE0,0xF9,0x22,0xEF,0x25,0xE0,0x24,0xC1,0xF5,0x82,0xE4,
-
0x34,0x12,0xF5,0x83,0x22,0xF0,0xEF,0x25,0xE0,0x24,0xC2,0xF5,0x82,0xE4,0x34,0x12,
-
0xF5,0x83,0xEE,0xF0,0x22,0x74,0x40,0x2E,0xF5,0x82,0xE4,0x34,0x19,0xF5,0x83,0xE0,
-
0x22,0x90,0x12,0x5B,0xE0,0x25,0xE0,0x24,0xA0,0xF5,0x82,0xE4,0x34,0x19,0xF5,0x83,
-
0x22,0x74,0x10,0x12,0x42,0xA1,0x90,0x12,0x71,0xE0,0x25,0xE0,0x22,0xF0,0x12,0x53,
-
0xB4,0x90,0xF0,0xC4,0x74,0x01,0xF0,0x22,0x24,0xC3,0xF5,0x82,0xE4,0x34,0x12,0xF5,
-
0x83,0xE0,0x22,0xE4,0xFE,0x30,0x18,0x07,0x90,0x88,0xB0,0xE0,0xFF,0x80,0x02,0xE4,
-
0xFF,0xE4,0xFD,0xED,0xC3,0x9F,0x50,0x4E,0xED,0x12,0x1F,0xDF,0x12,0x28,0x2B,0xFB,
-
0xED,0x12,0x20,0xCC,0xF5,0x83,0xEA,0xF0,0xA3,0xEB,0xF0,0xED,0x12,0x21,0xE7,0x12,
-
0x28,0x2B,0xFB,0xED,0x12,0x21,0x53,0xF5,0x83,0xEA,0xF0,0xA3,0xEB,0xF0,0x12,0x20,
-
0x7B,0xE0,0x70,0x02,0x80,0x16,0x12,0x20,0x7B,0xE0,0xB4,0x01,0x08,0x12,0x20,0x7B,
-
0x74,0x02,0xF0,0x80,0x0D,0x12,0x20,0x7B,0xE0,0xB4,0x03,0x06,0x12,0x20,0x7B,0x74,
-
0x01,0xF0,0x0D,0x02,0x50,0x33,0xE4,0xFE,0xAD,0x07,0xED,0xC3,0x95,0x0D,0x50,0x19,
-
0x12,0x20,0x7B,0xE0,0x64,0x01,0x60,0x07,0x12,0x20,0x7B,0xE0,0xB4,0x02,0x07,0x12,
-
0x20,0x7B,0x74,0x03,0xF0,0x0E,0x0D,0x80,0xE1,0xEF,0x2E,0xFD,0xED,0xC3,0x95,0x0D,
-
0x50,0x16,0xED,0x12,0x20,0xCC,0x12,0x29,0xA4,0xED,0x12,0x21,0x53,0x12,0x29,0xA4,
-
0x12,0x20,0x7B,0xE4,0xF0,0x0D,0x80,0xE4,0x22,0x90,0x12,0x5B,0xE0,0xFF,0x24,0x40,
-
0x12,0x4F,0xE8,0x64,0x01,0x60,0x0A,0x74,0x40,0x2F,0x12,0x4F,0xE8,0x64,0x03,0x70,
-
0x74,0x90,0x12,0x71,0xE0,0xFF,0x12,0x4F,0xC9,0xE0,0xFE,0xB4,0x01,0x0A,0xEF,0x25,
-
0xE0,0x12,0x50,0x18,0x64,0x01,0x60,0x0F,0xEE,0x64,0x03,0x70,0x19,0x12,0x50,0x06,
-
0x12,0x50,0x18,0x64,0x03,0x70,0x0F,0x12,0x4F,0x72,0x12,0x50,0x01,0x24,0xC4,0xF5,
-
0x82,0xE4,0x34,0x12,0x80,0x0D,0x12,0x4F,0x72,0x12,0x50,0x01,0x24,0xC0,0xF5,0x82,
-
0xE4,0x34,0x12,0x12,0x4F,0x7F,0x74,0x20,0x12,0x42,0xA1,0x90,0x12,0x71,0xE0,0x04,
-
0x12,0x50,0x0D,0x20,0x0C,0x05,0x75,0x9E,0x55,0x80,0xF8,0x90,0x00,0x01,0xE0,0xFE,
-
0x90,0x00,0x00,0xE0,0x7C,0x00,0x24,0x00,0xFF,0xEC,0x3E,0xFE,0x12,0x4F,0xF1,0xEE,
-
0xF0,0xA3,0xEF,0xF0,0x22,0x12,0x4F,0xF1,0xE4,0xF0,0xA3,0x74,0x08,0x12,0x50,0x0D,
-
0x20,0x0C,0x05,0x75,0x9E,0x55,0x80,0xF8,0x22,0x75,0x9E,0x55,0x74,0x03,0x12,0x51,
-
0xA7,0x74,0x01,0x12,0x51,0x91,0x74,0x13,0x12,0x51,0x91,0x74,0x1F,0x12,0x51,0xBD,
-
0x75,0x9E,0x55,0x74,0x3F,0x12,0x51,0xBD,0x75,0x9E,0x55,0x74,0x83,0x12,0x51,0xA7,
-
0x22,0x90,0xF1,0x41,0xF0,0x7F,0x05,0x7E,0x00,0x12,0x53,0x27,0x7F,0x05,0x7E,0x00,
-
0x12,0x53,0x27,0x75,0x9E,0x55,0x22,0x90,0xF1,0x40,0xF0,0x7F,0x01,0x7E,0x00,0x12,
-
0x53,0x27,0x7F,0x01,0x7E,0x00,0x12,0x53,0x27,0x75,0x9E,0x55,0x22,0x90,0xF1,0x41,
-
0xF0,0x7F,0x05,0x7E,0x00,0x12,0x53,0x27,0x7F,0x05,0x7E,0x00,0x12,0x53,0x27,0x22,
-
0xE5,0xC0,0x30,0xE3,0x11,0xE4,0x90,0xF0,0xC4,0xF0,0x12,0x3D,0x82,0x7F,0x32,0x7E,
-
0x00,0x12,0x53,0x27,0x80,0x29,0xE5,0xC0,0x30,0xE2,0x07,0x12,0x52,0x22,0xD2,0xAF,
-
0x80,0x2C,0xE5,0xC0,0x30,0xE0,0x13,0x90,0xF1,0x42,0xE0,0x54,0xEF,0xF0,0x7F,0x02,
-
0x7E,0x00,0x12,0x53,0x27,0x12,0x52,0x22,0x80,0x14,0xE5,0xC0,0x30,0xE1,0x0F,0x12,
-
0x3D,0xF5,0x12,0x51,0x69,0x12,0x4B,0x3A,0x12,0x00,0x36,0x12,0x29,0xD6,0xE4,0xF5,
-
0xC0,0x22,0x12,0x51,0x69,0x90,0xF0,0xC4,0x74,0x01,0xF0,0x22,0xE4,0x90,0x13,0xB3,
-
0xF0,0xA3,0xF0,0x90,0x8F,0xFE,0x74,0xAA,0xF0,0x90,0x8F,0xFD,0xE0,0x64,0xBB,0x60,
-
0x1A,0x90,0x13,0xB4,0xE0,0x04,0xF0,0x70,0x06,0x90,0x13,0xB3,0xE0,0x04,0xF0,0x75,
-
0x9E,0x55,0x7F,0xFA,0x7E,0x00,0x12,0x53,0x73,0x80,0xDE,0xE4,0x90,0x8F,0xFD,0xF0,
-
0x90,0x8F,0xFE,0xF0,0xD2,0xD8,0xA2,0xD9,0x33,0x90,0x8E,0x01,0xF0,0x12,0x50,0x11,
-
0x22,0xF5,0x83,0xE0,0xFE,0x74,0x00,0x2F,0xF5,0x82,0xE4,0x34,0x8B,0xF5,0x83,0xEE,
-
0xF0,0x90,0x13,0xAD,0xE0,0x04,0xF0,0xE0,0x22,0x90,0x8F,0xF0,0xE0,0xD3,0x94,0x00,
-
0x22,0xA3,0xF0,0xA3,0xF0,0xA3,0xF0,0xA3,0x22,0xE4,0x90,0x12,0x5B,0xF0,0x90,0x12,
-
0x71,0xF0,0x22,0x30,0x98,0x04,0xD2,0x07,0xC2,0x98,0x30,0x99,0x23,0xD2,0x08,0xC2,
-
0x99,0x30,0x0D,0x18,0xB2,0x17,0x30,0x17,0x08,0x75,0x8A,0x8F,0x75,0x8B,0x00,0x80,
-
0x06,0x75,0x8A,0x8F,0x75,0x8B,0x78,0xC2,0x0D,0xD2,0x09,0x32,0xC2,0x0E,0xC2,0x09,
-
0x32,0xAB,0x07,0xAA,0x06,0xE4,0xF5,0xAE,0x75,0xAF,0x01,0x12,0x29,0x31,0xEA,0xF5,
-
0xA3,0xEB,0xF5,0xA4,0xD2,0xB0,0x20,0xB0,0x06,0x30,0x11,0x03,0x20,0xDA,0x05,0x75,
-
0x9E,0x55,0x80,0xF2,0x12,0x24,0x3A,0xFF,0xEC,0x3E,0xFE,0x22,0xAB,0x07,0xAA,0x06,
-
0xEA,0xF5,0xAE,0xEB,0xF5,0xAF,0xE4,0x12,0x29,0x31,0xF5,0xA3,0x75,0xA4,0x01,0xD2,
-
0xB0,0x20,0xB0,0x06,0x30,0x11,0x03,0x20,0xDA,0x05,0x75,0x9E,0x55,0x80,0xF2,0x12,
-
0x24,0x3A,0xFF,0xEC,0x3E,0xFE,0x22,0xE4,0xFD,0xFC,0xC3,0xED,0x9F,0xEC,0x9E,0x50,
-
0x18,0xE4,0xFB,0xFA,0x75,0x9E,0x55,0x0B,0xBB,0x00,0x01,0x0A,0xBA,0x03,0xF5,0xBB,
-
0x20,0xF2,0x0D,0xBD,0x00,0x01,0x0C,0x80,0xE1,0x22,0xC0,0xE0,0xC0,0x83,0xC0,0x82,
-
0xD2,0x0C,0x90,0xF0,0xC4,0xE4,0xF0,0xC2,0xD8,0xD0,0x82,0xD0,0x83,0xD0,0xE0,0x32,
-
0xE4,0xFD,0xFC,0xC3,0xED,0x9F,0xEC,0x9E,0x50,0x08,0x00,0x0D,0xBD,0x00,0x01,0x0C,
-
0x80,0xF1,0x22,0xEF,0x1F,0x70,0x01,0x1E,0x75,0x9E,0x55,0xD3,0xEF,0x94,0x00,0xEE,
-
0x94,0x00,0x50,0xEF,0x22,0xC0,0xE0,0xD2,0x0B,0x05,0x0F,0xE5,0x0F,0x70,0x02,0x05,
-
0x0E,0xD0,0xE0,0x32,0x90,0xF0,0xC5,0x74,0x26,0xF0,0x30,0xF8,0x02,0xD2,0x18,0x22,
-
0xEE,0x30,0xE7,0x07,0xC3,0xE4,0x9F,0xFF,0xE4,0x9E,0xFE,0x22,0x8F,0x82,0x8E,0x83,
-
0xE4,0x93,0xFF,0x22,0xD2,0xD8,0x22,0xD2,0x11,0x32,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
0x90,0x3F,0xFF,0x74,0x01,0xF0,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
\ No newline at end of file

commit 08097421e420f206bc69187c1ba5aa3b39c2fb55
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Wed Aug 11 15:14:52 2021 +0800

    media: rockchip: cif: fixed vc err in linear mode, if sensor driver not had vc config
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I5f0e383d8493958abfee7b62cdbd4ceb74f84b28

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index 1f9497235c48..77eda1fcb7fb 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -1717,7 +1717,7 @@ static int rkcif_csi_channel_init(struct rkcif_stream *stream,
 	channel->data_type = get_data_type(stream->cif_fmt_in->mbus_code,
 					   channel->cmd_mode_en);
 
-	if (dev->hdr.mode == NO_HDR ||
+	if ((dev->hdr.mode == NO_HDR && stream->vc >= 0) ||
 	    (dev->hdr.mode == HDR_X2 && stream->vc > 1) ||
 	    (dev->hdr.mode == HDR_X3 && stream->vc > 2))
 		channel->vc = stream->vc;

commit 7b7373e36874384cb8b692a789a9d20b1692112d
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Wed Aug 4 19:01:50 2021 +0800

    media: rockchip: isp/ispp to version v1.6.2
    
    Change-Id: I3959939530392f71313a3e30132d9746533f2d36
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/version.h b/drivers/media/platform/rockchip/isp/version.h
index c70ac7747371..762ac7d9e210 100644
--- a/drivers/media/platform/rockchip/isp/version.h
+++ b/drivers/media/platform/rockchip/isp/version.h
@@ -140,6 +140,18 @@
  * 13.apply en params if no match for isp21
  * 14.isp21 get 3a stats from ddr
  * 15.reserved memory using rdma_sg ops
+ *
+ * v1.6.2:
+ * 1.hdr direct for isp21
+ * 2.fix same frame id
+ * 3.fix isp and ispp share dmabuf release fail
+ * 4.clear rdbk fifo at dmarx stop
+ * 5.add lock for isp stream
+ * 6.disable params when it stream off
+ * 7.dmarx support yuv format
+ * 8.frame buffer done early
+ * 9.fix set pdaf in dpcc error
+ * 10.add v-blank to procfs
  */
 
 #define RKISP_DRIVER_VERSION RKISP_API_VERSION
diff --git a/drivers/media/platform/rockchip/ispp/version.h b/drivers/media/platform/rockchip/ispp/version.h
index 69979689aca3..df445daad02e 100644
--- a/drivers/media/platform/rockchip/ispp/version.h
+++ b/drivers/media/platform/rockchip/ispp/version.h
@@ -103,6 +103,16 @@
  * v1.6.1
  * 1. reserved memory using rdma_sg ops
  * 2. destory ispp buffers if start_stream failed
+ *
+ * v1.6.2
+ * 1. fix isp and ispp share dmabuf release fail
+ * 2. fix bug that ispp register isn't included in SEI
+ * 3. frame buffer done early
+ * 4. reset at frame end
+ * 5. fix page fault due to scl exit early
+ * 6. fbc error handle
+ * 7. first frame handle for multi dev
+ * 8. fix driver mode sync with ispserver
  */
 
 #define RKISPP_DRIVER_VERSION ISPP_API_VERSION
diff --git a/include/uapi/linux/rkisp2-config.h b/include/uapi/linux/rkisp2-config.h
index 079bd9c7e2d4..9932b44e89e1 100644
--- a/include/uapi/linux/rkisp2-config.h
+++ b/include/uapi/linux/rkisp2-config.h
@@ -10,7 +10,7 @@
 #include <linux/types.h>
 #include <linux/v4l2-controls.h>
 
-#define RKISP_API_VERSION		KERNEL_VERSION(1, 6, 1)
+#define RKISP_API_VERSION		KERNEL_VERSION(1, 6, 2)
 
 #define RKISP_CMD_TRIGGER_READ_BACK \
 	_IOW('V', BASE_VIDIOC_PRIVATE + 0, struct isp2x_csi_trigger)
diff --git a/include/uapi/linux/rkispp-config.h b/include/uapi/linux/rkispp-config.h
index 8a3425fb8a38..b77b79ab3908 100644
--- a/include/uapi/linux/rkispp-config.h
+++ b/include/uapi/linux/rkispp-config.h
@@ -9,7 +9,7 @@
 #include <linux/types.h>
 #include <linux/v4l2-controls.h>
 
-#define ISPP_API_VERSION		KERNEL_VERSION(1, 6, 0)
+#define ISPP_API_VERSION		KERNEL_VERSION(1, 6, 2)
 
 #define ISPP_ID_TNR			(0)
 #define ISPP_ID_NR			(1)

commit 337af37f841cb841ad4be5bce76de8ca2859828d
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Tue Aug 10 08:56:18 2021 +0800

    media: rockchip: ispp: first frame handle for multi dev
    
    Change-Id: Ie4bc4c8b8a7486fca6bd6b55ca395eb774997120
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/ispp/dev.h b/drivers/media/platform/rockchip/ispp/dev.h
index d55413b7337f..b39e2a5b1945 100644
--- a/drivers/media/platform/rockchip/ispp/dev.h
+++ b/drivers/media/platform/rockchip/ispp/dev.h
@@ -56,5 +56,8 @@ struct rkispp_device {
 	bool stream_sync;
 
 	void (*irq_hdl)(u32 mis, struct rkispp_device *dev);
+
+	u32 first_frame_dma;
+	bool is_first;
 };
 #endif
diff --git a/drivers/media/platform/rockchip/ispp/hw.c b/drivers/media/platform/rockchip/ispp/hw.c
index 5c608738e129..06262702b205 100644
--- a/drivers/media/platform/rockchip/ispp/hw.c
+++ b/drivers/media/platform/rockchip/ispp/hw.c
@@ -329,7 +329,6 @@ static int rkispp_hw_probe(struct platform_device *pdev)
 	hw_dev->is_dma_sg_ops = false;
 	hw_dev->is_shutdown = false;
 	hw_dev->is_first = true;
-	hw_dev->first_frame_dma = -1;
 	hw_dev->is_mmu = is_iommu_enable(dev);
 	ret = of_reserved_mem_device_init(dev);
 	if (ret) {
diff --git a/drivers/media/platform/rockchip/ispp/hw.h b/drivers/media/platform/rockchip/ispp/hw.h
index d750dae270e6..8eb2585ecb71 100644
--- a/drivers/media/platform/rockchip/ispp/hw.h
+++ b/drivers/media/platform/rockchip/ispp/hw.h
@@ -53,7 +53,6 @@ struct rkispp_hw_dev {
 	atomic_t refcnt;
 	const struct vb2_mem_ops *mem_ops;
 	struct rkisp_ispp_reg *reg_buf;
-	u32 first_frame_dma;
 	bool is_mmu;
 	bool is_idle;
 	bool is_single;
diff --git a/drivers/media/platform/rockchip/ispp/ispp.c b/drivers/media/platform/rockchip/ispp/ispp.c
index 4490f3432bd4..ad9a12025c71 100644
--- a/drivers/media/platform/rockchip/ispp/ispp.c
+++ b/drivers/media/platform/rockchip/ispp/ispp.c
@@ -273,6 +273,8 @@ static int rkispp_sd_s_stream(struct v4l2_subdev *sd, int on)
 		 "s_stream on:%d\n", on);
 
 	if (on) {
+		dev->is_first = true;
+		dev->first_frame_dma = -1;
 		ispp_sdev->state = ISPP_START;
 		ispp_sdev->frm_sync_seq = -1;
 		ispp_sdev->frame_timestamp = 0;
@@ -457,28 +459,28 @@ static long rkispp_compat_ioctl32(struct v4l2_subdev *sd,
 	switch (cmd) {
 	case RKISPP_CMD_GET_FECBUF_INFO:
 		ret = rkispp_ioctl(sd, cmd, &fecbuf);
-		if (!ret)
-			ret = copy_to_user(up, &fecbuf, sizeof(fecbuf));
+		if (!ret && copy_to_user(up, &fecbuf, sizeof(fecbuf)))
+			ret = -EFAULT;
 		break;
 	case RKISPP_CMD_SET_FECBUF_SIZE:
-		ret = copy_from_user(&fecsize, up, sizeof(fecsize));
-		if (!ret)
-			ret = rkispp_ioctl(sd, cmd, &fecsize);
+		if (copy_from_user(&fecsize, up, sizeof(fecsize)))
+			return -EFAULT;
+		ret = rkispp_ioctl(sd, cmd, &fecsize);
 		break;
 	case RKISPP_CMD_TRIGGER_YNRRUN:
-		ret = copy_from_user(&tnr_inf, up, sizeof(tnr_inf));
-		if (!ret)
-			ret = rkispp_ioctl(sd, cmd, &tnr_inf);
+		if (copy_from_user(&tnr_inf, up, sizeof(tnr_inf)))
+			return -EFAULT;
+		ret = rkispp_ioctl(sd, cmd, &tnr_inf);
 		break;
 	case RKISPP_CMD_GET_TNRBUF_FD:
 		ret = rkispp_ioctl(sd, cmd, &idxfd);
-		if (!ret)
-			ret = copy_to_user(up, &idxfd, sizeof(idxfd));
+		if (!ret && copy_to_user(up, &idxfd, sizeof(idxfd)))
+			ret = -EFAULT;
 		break;
 	case RKISPP_CMD_TRIGGER_MODE:
-		ret = copy_from_user(&t_mode, up, sizeof(t_mode));
-		if (!ret)
-			ret = rkispp_ioctl(sd, cmd, &t_mode);
+		if (copy_from_user(&t_mode, up, sizeof(t_mode)))
+			return -EFAULT;
+		ret = rkispp_ioctl(sd, cmd, &t_mode);
 		break;
 	default:
 		ret = -ENOIOCTLCMD;
diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c
index 9de507df5591..78b2e247b5c0 100644
--- a/drivers/media/platform/rockchip/ispp/stream.c
+++ b/drivers/media/platform/rockchip/ispp/stream.c
@@ -2383,13 +2383,6 @@ static void restart_module(struct rkispp_device *dev)
 		rkispp_set_bits(dev, RKISPP_TNR_CTRL, 0, SW_TNR_1ST_FRM);
 		monitor->tnr.is_err = false;
 	}
-	if (monitor->restart_module & MONITOR_NR && monitor->nr.is_err) {
-		rkispp_write(dev, RKISPP_NR_ADDR_BASE_Y,
-			     readl(base + RKISPP_NR_ADDR_BASE_Y_SHD));
-		rkispp_write(dev, RKISPP_NR_ADDR_BASE_UV,
-			     readl(base + RKISPP_NR_ADDR_BASE_UV_SHD));
-		monitor->nr.is_err = false;
-	}
 	rkispp_soft_reset(dev->hw_dev);
 	rkispp_update_regs(dev, RKISPP_CTRL_QUICK, RKISPP_FEC_CROP);
 	writel(ALL_FORCE_UPD, base + RKISPP_CTRL_UPDATE);
@@ -2404,6 +2397,32 @@ static void restart_module(struct rkispp_device *dev)
 			complete(&monitor->tnr.cmpl);
 	}
 	if (monitor->restart_module & MONITOR_NR) {
+		if (monitor->nr.is_err) {
+			struct rkispp_stream_vdev *vdev = &dev->stream_vdev;
+			struct v4l2_subdev *sd = dev->ispp_sdev.remote_sd;
+			struct rkispp_buffer *inbuf;
+
+			if (vdev->nr.cur_rd) {
+				if (vdev->nr.cur_rd->is_isp) {
+					v4l2_subdev_call(sd, video, s_rx_buffer,
+							 vdev->nr.cur_rd, NULL);
+				} else if (!vdev->nr.cur_rd->priv) {
+					list_add_tail(&vdev->nr.cur_rd->list,
+						      &vdev->tnr.list_wr);
+				} else {
+					inbuf = vdev->nr.cur_rd->priv;
+					vb2_buffer_done(&inbuf->vb.vb2_buf, VB2_BUF_STATE_DONE);
+				}
+				vdev->nr.cur_rd = NULL;
+			}
+			rkispp_set_bits(dev, RKISPP_TNR_CTRL, 0, SW_TNR_1ST_FRM);
+			vdev->nr.is_end = true;
+			monitor->nr.is_err = false;
+			monitor->is_restart = false;
+			monitor->restart_module = 0;
+			rkispp_event_handle(dev, CMD_QUEUE_DMABUF, NULL);
+			goto end;
+		}
 		val |= NR_SHP_ST;
 		monitor->monitoring_module |= MONITOR_NR;
 		if (!completion_done(&monitor->nr.cmpl))
@@ -2801,9 +2820,10 @@ static void nr_work_event(struct rkispp_device *dev,
 			dbuf = vdev->nr.cur_rd->dbuf[GROUP_BUF_PIC];
 			dummy = dbuf_to_dummy(dbuf, &vdev->tnr.buf.iir, size);
 			val = dummy->dma_addr;
-			if (dev->hw_dev->is_first && dev->hw_dev->first_frame_dma != -1) {
-				val = dev->hw_dev->first_frame_dma;
-				dev->hw_dev->first_frame_dma = -1;
+			if (dev->is_first && dev->first_frame_dma != -1) {
+				val = dev->first_frame_dma;
+				dev->first_frame_dma = -1;
+				dev->is_first = false;
 			}
 			rkispp_write(dev, RKISPP_NR_ADDR_BASE_Y, val);
 			val += vdev->nr.uv_offset;
@@ -3002,10 +3022,11 @@ static void tnr_work_event(struct rkispp_device *dev,
 	if (!buf_rd && !buf_wr && is_isr) {
 		vdev->tnr.is_end = true;
 
-		if (dev->hw_dev->is_first && vdev->tnr.nxt_rd) {
+		if (dev->is_first && vdev->tnr.nxt_rd) {
 			struct rkispp_isp_buf_pool *tbuf = get_pool_buf(dev, vdev->tnr.nxt_rd);
 
-			dev->hw_dev->first_frame_dma = tbuf->dma[GROUP_BUF_PIC];
+			dev->first_frame_dma = tbuf->dma[GROUP_BUF_PIC];
+			rkispp_set_bits(dev, RKISPP_TNR_CTRL, 0, SW_TNR_1ST_FRM);
 		}
 
 		if (vdev->tnr.cur_rd) {
@@ -3088,8 +3109,7 @@ static void tnr_work_event(struct rkispp_device *dev,
 		vdev->tnr.cur_rd = vdev->tnr.nxt_rd;
 		vdev->tnr.nxt_rd = buf_rd;
 		/* first buf for 3to1 using twice */
-		if (!is_3to1 ||
-		    (rkispp_read(dev, RKISPP_TNR_CTRL) & SW_TNR_1ST_FRM))
+		if (!is_3to1 || dev->is_first)
 			vdev->tnr.cur_rd = vdev->tnr.nxt_rd;
 	} else if (vdev->tnr.is_end && !list_empty(list)) {
 		/* tnr read buf from list
@@ -3148,7 +3168,7 @@ static void tnr_work_event(struct rkispp_device *dev,
 				val = buf->dma[GROUP_BUF_GAIN];
 				rkispp_write(dev, RKISPP_TNR_GAIN_NXT_Y_BASE, val);
 
-				if (rkispp_read(dev, RKISPP_TNR_CTRL) & SW_TNR_1ST_FRM)
+				if (dev->is_first)
 					vdev->tnr.cur_rd = NULL;
 			}
 		}
@@ -3454,7 +3474,7 @@ void rkispp_isr(u32 mis_val, struct rkispp_device *dev)
 	    (dev->isp_mode & ISP_ISPP_QUICK))
 		++dev->ispp_sdev.frm_sync_seq;
 
-	if (mis_val & TNR_INT && !dev->hw_dev->is_first)
+	if (mis_val & TNR_INT)
 		if (rkispp_read(dev, RKISPP_TNR_CTRL) & SW_TNR_1ST_FRM)
 			rkispp_clear_bits(dev, RKISPP_TNR_CTRL, SW_TNR_1ST_FRM);
 

commit dd2f32a8b353337311c69d4edfb64bc432bd63eb
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Wed Aug 11 11:13:22 2021 +0800

    Revert "NFC: Add to support ap6441 & ap6493 nfc function."
    
    This reverts commit 384134cb604fe63896b525b457ae6a330b8b5ebb.
    
    bcm2079x is unused.
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: Ibbc1b18fbadc1de9fa66915348b3382533ad1621

diff --git a/drivers/nfc/bcm2079x-i2c.c b/drivers/nfc/bcm2079x-i2c.c
deleted file mode 100644
index f829dd45c402..000000000000
--- a/drivers/nfc/bcm2079x-i2c.c
+++ /dev/null
@@ -1,698 +0,0 @@
-/*
- * Copyright (C) 2012 Broadcom Corporation.
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/fs.h>
-#include <linux/slab.h>
-#include <linux/init.h>
-#include <linux/list.h>
-#include <linux/i2c.h>
-#include <linux/irq.h>
-#include <linux/jiffies.h>
-#include <linux/uaccess.h>
-#include <linux/delay.h>
-#include <linux/interrupt.h>
-#include <linux/io.h>
-#include <linux/platform_device.h>
-#include <linux/gpio.h>
-#include <linux/miscdevice.h>
-#include <linux/spinlock.h>
-#include <linux/poll.h>
-#include <linux/version.h>
-#ifdef CONFIG_OF
-#include <linux/of.h>
-#include <linux/of_device.h>
-#include <linux/of_gpio.h>
-#endif
-
-#include <linux/bcm2079x.h>
-
-#define USE_WAKE_LOCK
-
-#ifdef USE_WAKE_LOCK
-#include <linux/wakelock.h>
-#endif
-
-#define TRUE		1
-#define FALSE		0
-#define STATE_HIGH	1
-#define STATE_LOW	0
-
-/* end of compile options */
-
-/* do not change below */
-#define MAX_BUFFER_SIZE		780
-
-	/* Read data */
-#define PACKET_HEADER_SIZE_NCI	(4)
-#define PACKET_HEADER_SIZE_HCI	(3)
-#define PACKET_TYPE_NCI		(16)
-#define PACKET_TYPE_HCIEV	(4)
-#define MAX_PACKET_SIZE		(PACKET_HEADER_SIZE_NCI + 255)
-
-struct bcm2079x_dev {
-	wait_queue_head_t read_wq;
-	struct mutex read_mutex;
-	struct i2c_client *client;
-	struct miscdevice bcm2079x_device;
-	unsigned int wake_gpio;
-	unsigned int en_gpio;
-	unsigned int irq_gpio;
-	bool irq_enabled;
-	spinlock_t irq_enabled_lock;
-	unsigned int error_write;
-	unsigned int error_read;
-	unsigned int count_read;
-	unsigned int count_irq;
-        int original_address;
-#ifdef USE_WAKE_LOCK
-        struct wake_lock wake_lock;
-#endif
-};
-
-#define BCM2079X_NAME	"bcm2079x-i2c"
-#define VERSION "AMPAK-BCM2079X-DRIVER-VERSION-1.0.0"
-unsigned int nfc_handle = -1;
-unsigned int bcm2079x_irq_handle(void *para);
-
-static void bcm2079x_init_stat(struct bcm2079x_dev *bcm2079x_dev)
-{
-	bcm2079x_dev->error_write = 0;
-	bcm2079x_dev->error_read = 0;
-	bcm2079x_dev->count_read = 0;
-	bcm2079x_dev->count_irq = 0;
-}
-
-static void bcm2079x_disable_irq(struct bcm2079x_dev *bcm2079x_dev)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&bcm2079x_dev->irq_enabled_lock, flags);
-	if (bcm2079x_dev->irq_enabled) {
-		disable_irq_nosync(bcm2079x_dev->client->irq);
-		bcm2079x_dev->irq_enabled = false;
-	}
-	spin_unlock_irqrestore(&bcm2079x_dev->irq_enabled_lock, flags);
-}
-
-static void bcm2079x_enable_irq(struct bcm2079x_dev *bcm2079x_dev)
-{
-	unsigned long flags;
-	spin_lock_irqsave(&bcm2079x_dev->irq_enabled_lock, flags);
-	if (!bcm2079x_dev->irq_enabled) {
-		bcm2079x_dev->irq_enabled = true;
-		enable_irq(bcm2079x_dev->client->irq);
-	}
-	spin_unlock_irqrestore(&bcm2079x_dev->irq_enabled_lock, flags);
-}
-
-/*
- The alias address 0x79, when sent as a 7-bit address from the host processor
- will match the first byte (highest 2 bits) of the default client address
- (0x1FA) that is programmed in bcm20791.
- When used together with the first byte (0xFA) of the byte sequence below,
- it can be used to address the bcm20791 in a system that does not support
- 10-bit address and change the default address to 0x38.
- the new address can be changed by changing the CLIENT_ADDRESS below if 0x38
- conflicts with other device on the same i2c bus.
- */
-#define ALIAS_ADDRESS	  0x79
-
-static void set_client_addr(struct bcm2079x_dev *bcm2079x_dev, int addr)
-{
-	struct i2c_client *client = bcm2079x_dev->client;
-	client->addr = addr;
-	if (addr > 0x7F)
-		client->flags |= I2C_CLIENT_TEN;
-       else
-                client->flags &= ~I2C_CLIENT_TEN;
-
-	dev_info(&client->dev,
-		"Set client device changed to (0x%04X) flag = %04x\n",
-		client->addr, client->flags);
-}
-
-static void change_client_addr(struct bcm2079x_dev *bcm2079x_dev, int addr)
-{
-	struct i2c_client *client;
-	int ret;
-	int i;
-	int offset = 1;
-	char addr_data[] = {
-		0xFA, 0xF2, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x2A
-	};
-
-	client = bcm2079x_dev->client;
-	if ((client->flags & I2C_CLIENT_TEN) == I2C_CLIENT_TEN) {
-		client->addr = ALIAS_ADDRESS;
-		client->flags &= ~I2C_CLIENT_TEN;
-		offset = 0;
-	}
-
-	addr_data[5] = addr & 0xFF;
-	ret = 0;
-	for (i = 1; i < sizeof(addr_data) - 1; ++i)
-		ret += addr_data[i];
-	addr_data[sizeof(addr_data) - 1] = (ret & 0xFF);
-	dev_info(&client->dev,
-		 "Change client device from (0x%04X) flag = "\
-		 "%04x, addr_data[%d] = %02x\n",
-		 client->addr, client->flags, sizeof(addr_data) - 1,
-		 addr_data[sizeof(addr_data) - 1]);
-	ret = i2c_master_send(client, addr_data+offset, sizeof(addr_data)-offset);
-	if (ret != sizeof(addr_data)-offset) {
-		client->addr = ALIAS_ADDRESS;
-		client->flags &= ~I2C_CLIENT_TEN;
-		dev_info(&client->dev,
-			 "Change client device from (0x%04X) flag = "\
-			 "%04x, addr_data[%d] = %02x\n",
-			 client->addr, client->flags, sizeof(addr_data) - 1,
-			 addr_data[sizeof(addr_data) - 1]);
-		ret = i2c_master_send(client, addr_data, sizeof(addr_data));
-	}
-	client->addr = addr_data[5];
-
-	dev_info(&client->dev,
-		 "Change client device changed to (0x%04X) flag = %04x, ret = %d\n",
-		 client->addr, client->flags, ret);
-}
-
-static irqreturn_t bcm2079x_dev_irq_handler(int irq, void *dev_id)
-{
-	struct bcm2079x_dev *bcm2079x_dev = dev_id;
-	unsigned long flags;
-#ifdef USE_WAKE_LOCK
-	int wakelockcnt = 0;
-#endif
-
-	printk("%s: nfc irq handler\n", __func__);
-#ifdef USE_WAKE_LOCK
-	if(!(wakelockcnt =  wake_lock_active(&bcm2079x_dev->wake_lock )))
-	{
-		printk("irq aquire wake lock\n");
-		wake_lock(&bcm2079x_dev->wake_lock);
-	}else
-	{
-//		printk("irq wake lock count = %d\n", wakelockcnt);
-	}
-	//printk("irq handler ( wake lock %d)...\n", wakelockcnt);
-#endif
-
-	spin_lock_irqsave(&bcm2079x_dev->irq_enabled_lock, flags);
-	bcm2079x_dev->count_irq++;
-	spin_unlock_irqrestore(&bcm2079x_dev->irq_enabled_lock, flags);
-	wake_up(&bcm2079x_dev->read_wq);
-
-	return IRQ_HANDLED;
-}
-
-static unsigned int bcm2079x_dev_poll(struct file *filp, poll_table *wait)
-{
-	struct bcm2079x_dev *bcm2079x_dev = filp->private_data;
-	unsigned int mask = 0;
-	unsigned long flags;
-
-	spin_lock_irqsave(&bcm2079x_dev->irq_enabled_lock, flags);
-	//Platform specific API
-	//if(!__gpio_get_value(bcm2079x_dev->irq_gpio) && (bcm2079x_dev->count_irq < 1) )
-	if(!gpio_get_value(bcm2079x_dev->irq_gpio) && (bcm2079x_dev->count_irq < 1) )
-	{
-		spin_unlock_irqrestore(&bcm2079x_dev->irq_enabled_lock, flags);
-//		printk("poll wait, irq count %d, irq_gpio %d\n", bcm2079x_dev->count_irq,  bcm2079x_dev->irq_gpio  );
-		poll_wait(filp, &bcm2079x_dev->read_wq, wait);
-	}else
-	{
-		if (bcm2079x_dev->count_irq < 1)
-			bcm2079x_dev->count_irq = 1;
-
-		spin_unlock_irqrestore(&bcm2079x_dev->irq_enabled_lock, flags);
-//		printk("poll there is data to read!!! no wait any more.\n");
-		return (POLLIN | POLLRDNORM);
-	}
-
-	spin_lock_irqsave(&bcm2079x_dev->irq_enabled_lock, flags);
-	if (bcm2079x_dev->count_irq > 0)
-		mask |= POLLIN | POLLRDNORM;
-	spin_unlock_irqrestore(&bcm2079x_dev->irq_enabled_lock, flags);
-
-	return mask;
-}
-
-static ssize_t bcm2079x_dev_read(struct file *filp, char __user *buf,
-				  size_t count, loff_t *offset)
-{
-	struct bcm2079x_dev *bcm2079x_dev = filp->private_data;
-	unsigned char tmp[MAX_BUFFER_SIZE];
-	int total, len, ret;
-
-	total = 0;
-	len = 0;
-
-	if (bcm2079x_dev->count_irq > 0)
-		bcm2079x_dev->count_irq--;
-
-	bcm2079x_dev->count_read++;
-	if (count > MAX_BUFFER_SIZE)
-		count = MAX_BUFFER_SIZE;
-
-	mutex_lock(&bcm2079x_dev->read_mutex);
-
-	/** Read the first 4 bytes to include the length of the NCI or HCI packet.
-	**/
-	ret = i2c_master_recv(bcm2079x_dev->client, tmp, 4);
-	if (ret == 4) {
-		total = ret;
-		/** First byte is the packet type
-		**/
-		switch(tmp[0]) {
-			case PACKET_TYPE_NCI:
-				len = tmp[PACKET_HEADER_SIZE_NCI-1];
-				break;
-
-			case PACKET_TYPE_HCIEV:
-				len = tmp[PACKET_HEADER_SIZE_HCI-1];
-				if (len == 0)
-					total--;				/*Since payload is 0, decrement total size (from 4 to 3) */
-				else
-					len--;					/*First byte of payload is in tmp[3] already */
-				break;
-
-			default:
-				len = 0;					/*Unknown packet byte */
-				break;
-		} /* switch*/
-
-		/** make sure full packet fits in the buffer
-		**/
-		if (len > 0 && (len + total) <= count) {
-			/** read the remainder of the packet.
-			**/
-			ret = i2c_master_recv(bcm2079x_dev->client, tmp+total, len);
-			if (ret == len)
-				total += len;
-		} /* if */
-	} /* if */
-
-	mutex_unlock(&bcm2079x_dev->read_mutex);
-
-	if (total > count || copy_to_user(buf, tmp, total)) {
-		dev_err(&bcm2079x_dev->client->dev,
-			"failed to copy to user space, total = %d\n", total);
-		total = -EFAULT;
-		bcm2079x_dev->error_read++;
-	}
-
-	return total;
-}
-
-static ssize_t bcm2079x_dev_write(struct file *filp, const char __user *buf,
-				   size_t count, loff_t *offset)
-{
-	struct bcm2079x_dev *bcm2079x_dev = filp->private_data;
-	char tmp[MAX_BUFFER_SIZE];
-	int ret;
-
-	if (count > MAX_BUFFER_SIZE) {
-		dev_err(&bcm2079x_dev->client->dev, "out of memory\n");
-		return -ENOMEM;
-	}
-
-	if (copy_from_user(tmp, buf, count)) {
-		dev_err(&bcm2079x_dev->client->dev,
-			"failed to copy from user space\n");
-		return -EFAULT;
-	}
-
-	mutex_lock(&bcm2079x_dev->read_mutex);
-	/* Write data */
-
-	ret = i2c_master_send(bcm2079x_dev->client, tmp, count);
-	if (ret != count) {
-		if ((bcm2079x_dev->client->flags & I2C_CLIENT_TEN) != I2C_CLIENT_TEN && bcm2079x_dev->error_write == 0) {
-			set_client_addr(bcm2079x_dev, 0x1FA);
-			ret = i2c_master_send(bcm2079x_dev->client, tmp, count);
-			if (ret != count)
-				bcm2079x_dev->error_write++;
-		       set_client_addr(bcm2079x_dev, bcm2079x_dev->original_address);
-		} else {
-			dev_err(&bcm2079x_dev->client->dev,
-				"failed to write %d\n", ret);
-			ret = -EIO;
-			bcm2079x_dev->error_write++;
-		}
-	}
-	mutex_unlock(&bcm2079x_dev->read_mutex);
-
-	return ret;
-}
-
-static int bcm2079x_dev_open(struct inode *inode, struct file *filp)
-{
-	int ret = 0;
-
-	struct bcm2079x_dev *bcm2079x_dev = container_of(filp->private_data,
-							   struct bcm2079x_dev,
-							   bcm2079x_device);
-	filp->private_data = bcm2079x_dev;
-	bcm2079x_init_stat(bcm2079x_dev);
-	bcm2079x_enable_irq(bcm2079x_dev);
-	dev_info(&bcm2079x_dev->client->dev,
-		 "device node major=%d, minor=%d\n", imajor(inode), iminor(inode));
-
-	return ret;
-}
-
-static long bcm2079x_dev_unlocked_ioctl(struct file *filp,
-					 unsigned int cmd, unsigned long arg)
-{
-	struct bcm2079x_dev *bcm2079x_dev = filp->private_data;
-
-	switch (cmd) {
-	case BCMNFC_READ_FULL_PACKET:
-		break;
-	case BCMNFC_READ_MULTI_PACKETS:
-		break;
-	case BCMNFC_CHANGE_ADDR:
-		dev_info(&bcm2079x_dev->client->dev,
-			 "%s, BCMNFC_CHANGE_ADDR (%x, %lx):\n", __func__, cmd,
-			 arg);
-		change_client_addr(bcm2079x_dev, arg);
-		break;
-	case BCMNFC_POWER_CTL:
-		dev_info(&bcm2079x_dev->client->dev,
-			 "%s, BCMNFC_POWER_CTL (%x, %lx):\n", __func__, cmd, arg);
-		if (arg != 1)
-			set_client_addr(bcm2079x_dev, bcm2079x_dev->original_address);
-	    gpio_direction_output(bcm2079x_dev->en_gpio, arg);
-        gpio_set_value(bcm2079x_dev->en_gpio, arg);
-		break;
-	case BCMNFC_WAKE_CTL:
-		dev_info(&bcm2079x_dev->client->dev,
-			 "%s, BCMNFC_WAKE_CTL (%x, %lx):\n", __func__, cmd, arg);
-#ifdef USE_WAKE_LOCK
-		if(arg != 0)
-		{
-			while(wake_lock_active(&bcm2079x_dev->wake_lock ))
-			{
-				printk("release wake lock!!!\n");
-				wake_unlock(&bcm2079x_dev->wake_lock);
-			}
-			//wake_lock_timeout(&bcm2079x_dev->wake_lock, HZ*2);
-		}
-#endif
-	    gpio_direction_output(bcm2079x_dev->wake_gpio, arg);
-        gpio_set_value(bcm2079x_dev->wake_gpio, arg);
-		break;
-	default:
-		dev_err(&bcm2079x_dev->client->dev,
-			"%s, unknown cmd (%x, %lx)\n", __func__, cmd, arg);
-		return 0;
-	}
-
-	return 0;
-}
-
-static const struct file_operations bcm2079x_dev_fops = {
-	.owner = THIS_MODULE,
-	.llseek = no_llseek,
-	.poll = bcm2079x_dev_poll,
-	.read = bcm2079x_dev_read,
-	.write = bcm2079x_dev_write,
-	.open = bcm2079x_dev_open,
-	.unlocked_ioctl = bcm2079x_dev_unlocked_ioctl
-};
-
-unsigned int bcm2079x_irq_handle(void *para)
-{
-	bcm2079x_dev_irq_handler(0, para);
-	return 0;	
-}
-
-#ifdef CONFIG_OF
-static int nfc_platdata_parse_dt(struct device *dev, struct bcm2079x_platform_data *data)
-{
-    int ret = 0;
-    int gpio = -1;
-    enum of_gpio_flags flags;
-    struct device_node *node = dev->of_node;
-
-    if (!node)
-        return -ENODEV;
-
-    memset(data, 0, sizeof(*data));    
-
-    gpio = of_get_named_gpio_flags(node, "en_gpio", 0, &flags);
-    if (gpio_is_valid(gpio)){
-        data->en_gpio = gpio;
-        dev_err(dev, "%s: get property: en_gpio = %d\n", __func__, gpio);
-    } else ret = -1;
-    gpio = of_get_named_gpio_flags(node, "wake_gpio", 0, &flags);
-    if (gpio_is_valid(gpio)){
-        data->wake_gpio = gpio;
-        dev_err(dev, "%s: get property: wake_gpio = %d\n", __func__, gpio);
-    } else ret = -1;
-    gpio = of_get_named_gpio_flags(node, "irq_gpio", 0, &flags);
-    if (gpio_is_valid(gpio)){
-        data->irq_gpio = gpio;
-        dev_err(dev, "%s: get property: irq_gpio = %d\n", __func__, gpio);
-    } else ret = -1;
-
-    return ret;
-}
-#endif
-
-static int bcm2079x_probe(struct i2c_client *client,
-			   const struct i2c_device_id *id)
-{
-	int ret, err = -1;
-	struct bcm2079x_platform_data *platform_data;
-	struct bcm2079x_dev *bcm2079x_dev;
-
-    err = i2c_check_functionality(client->adapter, I2C_FUNC_I2C);
-    if (!err) {
-        dev_info(&client->dev, "Check I2C Functionality Failed.\n");
-        return -ENODEV;
-    }
-
-    dev_info(&client->dev, "Driver Version: %s\n", VERSION);
-	dev_info(&client->dev, "%s, probing bcm2079x driver flags = %x\n", __func__, client->flags);
-
-	platform_data = client->dev.platform_data;
-	if (platform_data == NULL) {
-#ifdef CONFIG_OF
-        platform_data = devm_kzalloc(&client->dev, sizeof(struct bcm2079x_platform_data), GFP_KERNEL);
-        if (!platform_data)
-            return -ENOMEM;
-
-        if (nfc_platdata_parse_dt(&client->dev, platform_data)) {
-#endif
-		 dev_err(&client->dev, "nfc probe fail\n");
-		 return -ENODEV;
-#ifdef CONFIG_OF
-        }
-        client->dev.platform_data = platform_data;
-#endif
-	}
-
-	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
-		dev_err(&client->dev, "need I2C_FUNC_I2C\n");
-		return -ENODEV;
-	}
-
-	ret = gpio_request(platform_data->irq_gpio, "nfc_int");
-	if (ret)
-		return -ENODEV;
-	ret = gpio_request(platform_data->en_gpio, "nfc_ven");
-	if (ret)
-		goto err_en;
-	ret = gpio_request(platform_data->wake_gpio, "nfc_firm");
-	if (ret)
-		goto err_firm;
-
-	gpio_direction_output(platform_data->en_gpio, 0 );
-	gpio_direction_output(platform_data->wake_gpio, 0);
-	gpio_set_value(platform_data->en_gpio, 0);
-	gpio_set_value(platform_data->wake_gpio, 0);
-
-	//gpio_direction_input(platform_data->irq_gpio );
-
-	bcm2079x_dev = kzalloc(sizeof(*bcm2079x_dev), GFP_KERNEL);
-	if (bcm2079x_dev == NULL) {
-		dev_err(&client->dev,
-			"failed to allocate memory for module data\n");
-		ret = -ENOMEM;
-		goto err_exit;
-	}
-
-	client->irq = gpio_to_irq(platform_data->irq_gpio);
-	if (client->irq == -ENXIO) {
-		dev_err(&client->dev,"[bcm2079x]: get gpio irq fail.\n");
-		goto err_exit;	
-	}
-
-	bcm2079x_dev->wake_gpio = platform_data->wake_gpio;
-	bcm2079x_dev->irq_gpio = platform_data->irq_gpio;
-	bcm2079x_dev->en_gpio = platform_data->en_gpio;
-	bcm2079x_dev->client = client;
-
-	/* init mutex and queues */
-	init_waitqueue_head(&bcm2079x_dev->read_wq);
-	mutex_init(&bcm2079x_dev->read_mutex);
-	spin_lock_init(&bcm2079x_dev->irq_enabled_lock);
-
-	bcm2079x_dev->bcm2079x_device.minor = MISC_DYNAMIC_MINOR;
-	bcm2079x_dev->bcm2079x_device.name = "bcm2079x";
-	bcm2079x_dev->bcm2079x_device.fops = &bcm2079x_dev_fops;
-
-	ret = misc_register(&bcm2079x_dev->bcm2079x_device);
-	if (ret) {
-		dev_err(&client->dev, "misc_register failed\n");
-		goto err_misc_register;
-	}
-
-	dev_info(&client->dev,
-		 "%s, saving address %d\n",
-		 __func__, client->addr);
-        bcm2079x_dev->original_address = client->addr;
-
-	/* request irq.  the irq is set whenever the chip has data available
-	 * for reading.  it is cleared when all data has been read.
-	 */
-	dev_info(&client->dev, "requesting IRQ %d with IRQF_NO_SUSPEND\n", client->irq);
-	bcm2079x_dev->irq_enabled = true;
-
-	//ret = request_irq(client->irq, bcm2079x_dev_irq_handler,
-	//		  IRQF_TRIGGER_RISING|IRQF_NO_SUSPEND, client->name, bcm2079x_dev);
-	//if (ret) {
-	//	dev_err(&client->dev, "request_irq failed\n");
-	//	goto err_request_irq_failed;
-	//}
-	//enable_irq_wake(client->irq);
-
-        //Platform specific API
-	//nfc_handle = sw_gpio_irq_request(bcm2079x_dev->irq_gpio, TRIG_EDGE_POSITIVE,
-	//					 bcm2079x_irq_handle, bcm2079x_dev);
-	
-	nfc_handle = request_irq(client->irq, bcm2079x_dev_irq_handler,
-			  IRQF_TRIGGER_RISING|IRQF_NO_SUSPEND, client->name, bcm2079x_dev);
-	if (nfc_handle != 0) {
-		dev_err(&client->dev, "request_irq failed.\n");
-		goto err_request_irq_failed;
-	}
-	enable_irq_wake(client->irq);
-
-	bcm2079x_disable_irq(bcm2079x_dev);
-	i2c_set_clientdata(client, bcm2079x_dev);
-	dev_info(&client->dev,
-		 "%s, probing bcm2079x driver exited successfully\n",
-		 __func__);
-
-#ifdef USE_WAKE_LOCK
-	wake_lock_init(&bcm2079x_dev->wake_lock , WAKE_LOCK_SUSPEND, "nfcwakelock" );
-#endif
-	return 0;
-
-err_request_irq_failed:
-	misc_deregister(&bcm2079x_dev->bcm2079x_device);
-err_misc_register:
-	mutex_destroy(&bcm2079x_dev->read_mutex);
-	kfree(bcm2079x_dev);
-err_exit:
-	gpio_free(platform_data->wake_gpio);
-err_firm:
-	gpio_free(platform_data->en_gpio);
-err_en:
-	gpio_free(platform_data->irq_gpio);
-	return ret;
-}
-
-static int bcm2079x_remove(struct i2c_client *client)
-{
-	struct bcm2079x_dev *bcm2079x_dev;
-
-	bcm2079x_dev = i2c_get_clientdata(client);
-
-	//Platform specific API
-	if (nfc_handle == 0)
-	    free_irq(client->irq, bcm2079x_dev);
-		//sw_gpio_irq_free(nfc_handle);	
-
-	misc_deregister(&bcm2079x_dev->bcm2079x_device);
-	mutex_destroy(&bcm2079x_dev->read_mutex);
-	gpio_free(bcm2079x_dev->irq_gpio);
-	gpio_free(bcm2079x_dev->en_gpio);
-	gpio_free(bcm2079x_dev->wake_gpio);
-	kfree(bcm2079x_dev);
-
-	return 0;
-}
-
-/*******************************************************************/
-/*                           AP6493                                */
-/*******************************************************************/
-//static const unsigned short normal_i2c[] = {0x77, I2C_CLIENT_END};
-/*******************************************************************/
-/*                           AP6441                                */
-/*******************************************************************/
-//static const unsigned short normal_i2c[] = {0x76, I2C_CLIENT_END};
-static const struct i2c_device_id bcm2079x_id[] = {
-    {"bcm2079x-i2c", 0},
-    {}
-};
-MODULE_DEVICE_TABLE(i2c, bcm2079x_id);
-
-static struct of_device_id bcm2079x_ids[] = {
-    { .compatible = "nfc-bcm2079x.ap6441" },
-    { .compatible = "nfc-bcm2079x.ap6493" },
-    { }
-};
-
-static struct i2c_driver bcm2079x_driver = {
-	.probe = bcm2079x_probe,
-	.remove = bcm2079x_remove,
-	.id_table = bcm2079x_id,
-	.driver = {
-		.owner = THIS_MODULE,
-		.name = "bcm2079x-i2c",
-        .of_match_table = of_match_ptr(bcm2079x_ids),
-	},
-};
-
-/*
- * module load/unload record keeping
- */
-
-static int __init bcm2079x_dev_init(void)
-{
-    printk("Enter %s\n", __func__);
-	return i2c_add_driver(&bcm2079x_driver);
-}
-module_init(bcm2079x_dev_init);
-
-static void __exit bcm2079x_dev_exit(void)
-{
-    printk("Enter %s\n", __func__);
-	i2c_del_driver(&bcm2079x_driver);
-}
-module_exit(bcm2079x_dev_exit);
-
-MODULE_AUTHOR("Broadcom");
-MODULE_DESCRIPTION("NFC bcm2079x driver");
-MODULE_LICENSE("GPL");
diff --git a/include/linux/bcm2079x.h b/include/linux/bcm2079x.h
deleted file mode 100644
index 359a00839325..000000000000
--- a/include/linux/bcm2079x.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2012 Broadcom Corporation.
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef _BCM2079X_H
-#define _BCM2079X_H
-
-#define BCMNFC_MAGIC	0xFA
-
-/*
- * BCMNFC power control via ioctl
- * BCMNFC_POWER_CTL(0): power off
- * BCMNFC_POWER_CTL(1): power on
- * BCMNFC_WAKE_CTL(0): wake off
- * BCMNFC_WAKE_CTL(1): wake on
- */
-#define BCMNFC_POWER_CTL		_IO(BCMNFC_MAGIC, 0x01)
-#define BCMNFC_CHANGE_ADDR		_IO(BCMNFC_MAGIC, 0x02)
-#define BCMNFC_READ_FULL_PACKET		_IO(BCMNFC_MAGIC, 0x03)
-#define BCMNFC_SET_WAKE_ACTIVE_STATE	_IO(BCMNFC_MAGIC, 0x04)
-#define BCMNFC_WAKE_CTL			_IO(BCMNFC_MAGIC, 0x05)
-#define BCMNFC_READ_MULTI_PACKETS	_IO(BCMNFC_MAGIC, 0x06)
-
-struct bcm2079x_platform_data {
-	unsigned int irq_gpio;
-	unsigned int en_gpio;
-	int wake_gpio;
-};
-
-#endif

commit c07549b1cb10c92e78a33da4661c27ec3e59c423
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Wed Aug 11 11:08:26 2021 +0800

    Revert "new add bmp logo for factorytool"
    
    This reverts commit 170a300423a13c3c9a082b10756ef8c17110858c.
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: I2a9701d3d175ee3e74e57df2395c792227e33c4b

diff --git a/scripts/bmptologo.c b/scripts/bmptologo.c
deleted file mode 100644
index 443cdda4da24..000000000000
--- a/scripts/bmptologo.c
+++ /dev/null
@@ -1,450 +0,0 @@
-
-/*
- *  Convert a logo in ASCII PNM format to C source suitable for inclusion in
- *  the Linux kernel
- *
- *  (C) Copyright 2001-2003 by Geert Uytterhoeven <geert@linux-m68k.org>
- *
- *  --------------------------------------------------------------------------
- *
- *  This file is subject to the terms and conditions of the GNU General Public
- *  License. See the file COPYING in the main directory of the Linux
- *  distribution for more details.
- */
-
-#include <ctype.h>
-#include <errno.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/mman.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-
-
-static const char *programname;
-static const char *filename;
-static const char *logoname = "linux_logo";
-static const char *outputname;
-static FILE *out;
-
-//#define debug 0
-#define LINUX_LOGO_MONO		1	/* monochrome black/white */
-#define LINUX_LOGO_VGA16	2	/* 16 colors VGA text palette */
-#define LINUX_LOGO_CLUT224	3	/* 224 colors */
-#define LINUX_LOGO_GRAY256	4	/* 256 levels grayscale */
-#define LINUX_LOGO_bmp		5	/* truecolours*/
-
-static const char *logo_types[LINUX_LOGO_bmp+1] = {
-    [LINUX_LOGO_MONO] = "LINUX_LOGO_MONO",
-    [LINUX_LOGO_VGA16] = "LINUX_LOGO_VGA16",
-    [LINUX_LOGO_CLUT224] = "LINUX_LOGO_CLUT224",
-    [LINUX_LOGO_GRAY256] = "LINUX_LOGO_GRAY256",
-    [LINUX_LOGO_bmp] = "LINUX_LOGO_bmp"
-};
-
-#define MAX_LINUX_LOGO_COLORS	224
-
-struct color {
-    char blue;
-    char green;
-    char red;
-};
-
-static const struct color clut_vga16[16] = {
-    { 0x00, 0x00, 0x00 },
-    { 0x00, 0x00, 0xaa },
-    { 0x00, 0xaa, 0x00 },
-    { 0x00, 0xaa, 0xaa },
-    { 0xaa, 0x00, 0x00 },
-    { 0xaa, 0x00, 0xaa },
-    { 0xaa, 0x55, 0x00 },
-    { 0xaa, 0xaa, 0xaa },
-    { 0x55, 0x55, 0x55 },
-    { 0x55, 0x55, 0xff },
-    { 0x55, 0xff, 0x55 },
-    { 0x55, 0xff, 0xff },
-    { 0xff, 0x55, 0x55 },
-    { 0xff, 0x55, 0xff },
-    { 0xff, 0xff, 0x55 },
-    { 0xff, 0xff, 0xff },
-};
-
-unsigned char data_name[] = {
-	0x6C, 0x6F, 0x67,
-	0x6F, 0x5F, 0x52,
-	0x4B, 0x6C, 0x6F,
-	0x67, 0x6F, 0x5F,
-	0x64, 0x61, 0x74,
-	0x61
-};
-
-unsigned char clut_name[] = {
-	0x62, 0x6D, 0x70,
-	0x6C, 0x6F, 0x67,
-	0x6F, 0x5F, 0x52,
-	0x4B, 0x6C, 0x6F,
-	0x67, 0x6F, 0x5F,
-	0x63, 0x6C, 0x75,
-	0x74, 0x00
-};
-
-static int logo_type = LINUX_LOGO_CLUT224;
-static unsigned long logo_width;
-static unsigned long logo_height;
-static unsigned long data_long;
-static unsigned long data_start;
-static unsigned char *logo_data;
-
-static void die(const char *fmt, ...)
-    __attribute__ ((noreturn)) __attribute ((format (printf, 1, 2)));
-static void usage(void) __attribute ((noreturn));
-
-static void read_image(void)
-{
-	int fd;
-	struct stat s;
-	unsigned char *data;
-	
-	/* open image file */
-	fd = open(filename, O_RDONLY);
-	if (fd < 0)
-		die("Cannot open file isll.. %s: %s\n", filename, strerror(errno));
-
-	if (fstat(fd, &s) < 0)
-		die("Cannot stat file isll.. %s: %s\n", filename, strerror(errno));
-
-#if 0
-	ret = fread(read_buf,1,0x26,fp);
-	if (ret != 0x26)
-		die("read file %s: error read_buf=%ld\n", filename,ret);
-
-	logo_height = (read_buf[0x19]<<24) + (read_buf[0x18]<<16) +(read_buf[0x17]<<8) +(read_buf[0x16]);
-	logo_width  = (read_buf[0x15]<<24) + (read_buf[0x14]<<16) +(read_buf[0x13]<<8) +(read_buf[0x12]);
-	data_start = (read_buf[0x0d]<<24) + (read_buf[0x0c]<<16) +(read_buf[0x0b]<<8) +(read_buf[0x0a]);
-	data_long  = (read_buf[0x25]<<24) + (read_buf[0x24]<<16) +(read_buf[0x023]<<8) +(read_buf[0x22]);
-#endif	
-	/* allocate image data */
-	//logo_data = (char *)malloc(logo_height * logo_width * 3);
-	//data_long = logo_height * logo_width * 3;
-//#ifdef debug
-#if 0
-	die("%s..logo_height=%ld,logo_width=%ld,data_start=%ld,data_long=%ld,sizeof(struct color)=%d,  \
-		read_buf[0x17]=%d  read_buf[0x13]=%d\n\n",filename,logo_height,logo_width,data_start,  \
-		data_long,sizeof(struct color),read_buf[0x17],read_buf[0x13]);
-	if ((logo_width*logo_height*3) != data_long)
-		die("something is wront in scripts/bmptologo.c\n");
-
-#endif
-#if 0
-	fseek(fp,data_start,SEEK_SET);
-	ret = fread(logo_data,1,data_long,fp);
-	if (ret != data_long)
-		die("read file %s: error logo_data=%ld\n", filename,ret);
-#else
-	data = mmap(0, s.st_size, PROT_READ, MAP_SHARED, fd, 0);
-	if (data == MAP_FAILED)
-		die("read file %s: error logo_data\n", filename);
-	logo_data = data + 54;
-	logo_height = (data[0x19]<<24) + (data[0x18]<<16) +(data[0x17]<<8) +(data[0x16]);
-	logo_width  = (data[0x15]<<24) + (data[0x14]<<16) +(data[0x13]<<8) +(data[0x12]);
-	data_start = (data[0x0d]<<24) + (data[0x0c]<<16) +(data[0x0b]<<8) +(data[0x0a]);
-	data_long  = (data[0x25]<<24) + (data[0x24]<<16) +(data[0x023]<<8) +(data[0x22]);
-	data_long = logo_height * logo_width * 3;
-#if 0
-	die("%s..logo_height=%ld,logo_width=%ld,data_start=%ld,data_long=%ld,sizeof(struct color)=%d,  \
-		read_buf[0x17]=%d  read_buf[0x13]=%d\n\n",filename,logo_height,logo_width,data_start,  \
-		data_long,sizeof(struct color),read_buf[0x17],read_buf[0x13]);
-	if ((logo_width*logo_height*3) != data_long)
-		die("something is wront in scripts/bmptologo.c\n");
-#endif	
-#endif
-#ifdef  debug
-	die("logo_data is:%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x:over\n", \
-		logo_data[0],logo_data[1],logo_data[2],logo_data[3],logo_data[4],logo_data[5],logo_data[6],logo_data[7],logo_data[8], \
-logo_data[9],logo_data[10],logo_data[11]);
-#endif
-    /* close file */
-    close(fd);
-}
-
-
-static inline int is_black(struct color c)
-{
-    return c.red == 0 && c.green == 0 && c.blue == 0;
-}
-
-static inline int is_white(struct color c)
-{
-    return c.red == 255 && c.green == 255 && c.blue == 255;
-}
-
-static inline int is_gray(struct color c)
-{
-    return c.red == c.green && c.red == c.blue;
-}
-
-static inline int is_equal(struct color c1, struct color c2)
-{
-    return c1.red == c2.red && c1.green == c2.green && c1.blue == c2.blue;
-}
-
-static int write_hex_cnt;
-
-static void write_hex(unsigned char byte)
-{
-    if (write_hex_cnt % 12)
-	fprintf(out, ", 0x%02x", byte);
-    else if (write_hex_cnt)
-	fprintf(out, ",\n\t0x%02x", byte);
-    else
-	fprintf(out, "\t0x%02x", byte);
-    write_hex_cnt++;
-}
-
-static void write_header(void)
-{
-	/* open logo file */
-	if (outputname) {
-		out = fopen(outputname, "w");
-		if (!out)
-			die("Cannot create file %s: %s\n", outputname, strerror(errno));
-	} else {
-		out = stdout;
-	}
-
-	fputs("/*\n", out);
-	fputs(" *  DO NOT EDIT THIS FILE!\n", out);
-	fputs(" *\n", out);
-	fprintf(out, " *  It was automatically generated from %s\n", filename);
-	fputs(" *\n", out);
-	fprintf(out, " *  Linux logo %s\n", logoname);
-	fputs(" */\n\n", out);
-	fputs("#include <linux/linux_logo.h>\n\n", out);
-	fprintf(out, "static unsigned char %s_data[] __initdata = {\n",
-		logoname);
-}
-
-static void write_footer(void)
-{
-	fputs("\n};\n\n", out);
-	fprintf(out, "const struct linux_logo %s __initconst = {\n", logoname);
-	fprintf(out, "\t.type\t\t= %s,\n", logo_types[logo_type]);
-
-	if (logo_type == LINUX_LOGO_bmp) {
-		fprintf(out, "\t.width\t\t= %ld,\n",  logo_width);
-		fprintf(out, "\t.height\t\t= %ld,\n",  logo_height);
-		//fprintf(out, "\t.data\t\t= %s_data,\n", logoname);
-		fprintf(out, "\t.data\t\t= &(%s_data[%ld]),\n", logoname,sizeof(data_name) + 8);
-		fprintf(out, "\t.clut\t\t= %s_clut\n", logoname);
-	}  
-
-	fputs("};\n\n", out);
-
-	/* close logo file */
-	if (outputname)
-		fclose(out);
-}
-
-
-static void write_logo_bmp(void)
-{
-	unsigned long  i=0, j=0;
-	unsigned char *position ;
-	
-	/* validate image */
-/*statistics how many colours ,and if have over 224
-	logo_clutsize = 0;
-	for (i = 0; i < logo_height; i++)
-		for (j = 0; j < logo_width; j++) {
-			for (k = 0; k < logo_clutsize; k++)
-				if (is_equal(logo_data[i][j], logo_clut[k]))
-					break;
-			if (k == logo_clutsize) {
-				if (logo_clutsize == MAX_LINUX_LOGO_COLORS)
-					die("Image has more than %d colors\n"
-						"Use ppmquant(1) to reduce the number of colors\n",
-						MAX_LINUX_LOGO_COLORS);
-					logo_clut[logo_clutsize++] = logo_data[i][j];
-			}
-		}
-
-*/
-	write_hex_cnt = 0;
-
-	
-	/* write file header */
-	write_header();
-#if 1
-	write_hex((unsigned char)(logo_width >> 8));
-	write_hex((unsigned char)logo_width);
-	write_hex((unsigned char)(logo_height >> 8));
-	write_hex((unsigned char)logo_height);
-
-	for (i = 0; i < sizeof(data_name); i++){
-		write_hex(data_name[i]);
-	}
-	write_hex((unsigned char)(logo_width >> 8));
-	write_hex((unsigned char)logo_width);
-	write_hex((unsigned char)(logo_height >> 8));
-	write_hex((unsigned char)logo_height);
-#endif
-	
-#if 0
-	/* write logo data */
-	for (i = 0; i < logo_height; i++)
-		for (j = 0; j < logo_width; j++) {
-	 		for (k = 0; k < logo_clutsize; k++)
-				if (is_equal(logo_data[i][j], logo_clut[k]))
-					break;
-			write_hex(k+32);
-		}
-	fputs("\n};\n\n", out);
-
-	
-
-	/* write logo clut */
-	fprintf(out, "static unsigned char %s_clut[] __initdata = {\n",
-		logoname);
-
-	write_hex_cnt = 0;
-
-	for (i = 0; i < sizeof(clut_name); i++){
-		write_hex(clut_name[i]);
-	}
-	write_hex(logo_clutsize);
-
-	for (i = 0; i < logo_clutsize; i++) {
-		write_hex(logo_clut[i].red);
-		write_hex(logo_clut[i].green);
-		write_hex(logo_clut[i].blue);
-	}
-
-	for (i = logo_clutsize; i < (MAX_LINUX_LOGO_COLORS * 3); i++)
-	{
-		write_hex(32);
-	}
-
-	/* write logo structure and file footer */
-#endif
-
-#if 1
-	for (i=logo_height; i>0; i--)
-	{
-		for (j=0; j<logo_width; j++)
-		{	
-				position = logo_data + (i-1)* logo_width * 3 + 3 * j;
-#if 0
-			write_hex(*(position));
-			write_hex(*(position+1));
-			write_hex(*(position+2));
-#else
-			write_hex(*(position));
-			write_hex(*(position+1));
-			write_hex(*(position+2));		
-			write_hex(0);
-#endif
-		}
-	}
-#endif
-
-	fputs("\n};\n\n", out);
-	/* write logo clut */
-	fprintf(out, "static unsigned char %s_clut[] __initdata = {\n",
-		logoname);
-
-	write_hex_cnt = 0;
-	for (i = 0; i < sizeof(clut_name); i++){
-		write_hex(clut_name[i]);
-	}
-	
-	write_footer();
-}
-
-static void die(const char *fmt, ...)
-{
-    va_list ap;
-
-    va_start(ap, fmt);
-    vfprintf(stderr, fmt, ap);
-    va_end(ap);
-
-    exit(1);
-}
-
-static void usage(void)
-{
-    die("\n"
-	"Usage: %s [options] <filename>\n"
-	"\n"
-	"Valid options:\n"
-	"    -h          : display this usage information\n"
-	"    -n <name>   : specify logo name (default: linux_logo)\n"
-	"    -o <output> : output to file <output> instead of stdout\n"
-	"    -t <type>   : specify logo type, one of\n"	                      
-	"                      bmp : truecolour\n"
-	"\n", programname);
-}
-
-int main(int argc, char *argv[])
-{
-    int opt;
-
-    programname = argv[0];
-
-    opterr = 0;
-    while (1) {
-	opt = getopt(argc, argv, "hn:o:t:");
-	if (opt == -1)
-	    break;
-
-	switch (opt) {
-	    case 'h':
-		usage();
-		break;
-
-	    case 'n':
-		logoname = optarg;
-		break;
-
-	    case 'o':
-		outputname = optarg;
-		break;
-
-	    case 't':
-		if (!strcmp(optarg, "bmp"))
-		    logo_type = LINUX_LOGO_bmp;		
-		else
-			die("logo_type is wrong without bmp\n");
-		break;
-
-	    default:
-		usage();
-		break;
-	}
-    }
-    if (optind != argc-1)
-	usage();
-
-    filename = argv[optind];
-
-  	read_image();
-    switch (logo_type) {
-	case LINUX_LOGO_bmp:
-	  	write_logo_bmp();
-	    break;
-	default :
-		die("logo_type is wrong\n");
-    }
-    exit(0);
-}
-

commit c7a202965de6ab1033ee753eacde0b4925eeedda
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Wed Aug 11 11:00:37 2021 +0800

    Revert "edp transmitter dp501 support"
    
    This reverts commit c8cdb6107eb46dd13329c70a40d46c87ca168833.
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: I16260895178df1471baf98ff4a5ccce37d99a299

diff --git a/include/linux/dp501.h b/include/linux/dp501.h
deleted file mode 100644
index 82cac02b82cd..000000000000
--- a/include/linux/dp501.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef __DP501_H_
-#define __DP501_H_
-
-#include <linux/i2c.h>
-#include<linux/earlysuspend.h>
-
-
-#define DP501_P0_ADDR (0x30)
-#define DP501_P1_ADDR (0x32)
-#define DP501_P2_ADDR (0x34)
-#define DP501_P3_ADDR (0x36)
-
-#define DP501_SCL_RATE  (100*1000)
-#define MAX_REG     	(0xff)
-
-
-
-#define CHIP_ID_L	(0x80)
-#define CHIP_ID_H	(0x81)
-
-struct  dp501_platform_data {
-	unsigned int dvdd33_en_pin;
-	int 	     dvdd33_en_val;
-	unsigned int dvdd18_en_pin;
-	int 	     dvdd18_en_val;
-	unsigned int edp_rst_pin;
-	int (*power_ctl)(void);
-};
-
-struct dp501 {
-	struct i2c_client *client;
-	struct dp501_platform_data *pdata;
-	int (*edp_init)(struct i2c_client *client);
-#ifdef CONFIG_HAS_EARLYSUSPEND
-	struct early_suspend early_suspend;
-#endif 
-};
-
-#endif

commit 53f5d872b5b4c7b08b4be353869d153f3ea7bae8
Author: Yandong Lin <yandong.lin@rock-chips.com>
Date:   Wed Aug 4 10:02:49 2021 +0800

    video: rockchip: mpp: fix failed to enable jpegd issue
    
    Failed to enable jpeg dec hw when the soft-reset of
    the previous frame has not been completed.
    So we have to manually trigger to do soft-reset when checking
    that the soft-reset of this frame is not completed
    
    Signed-off-by: Yandong Lin <yandong.lin@rock-chips.com>
    Change-Id: Ib4cbb3c8a42af9d7235bcf41194f5b9ea7c9e207

diff --git a/drivers/video/rockchip/mpp/mpp_jpgdec.c b/drivers/video/rockchip/mpp/mpp_jpgdec.c
index edb81e1f0801..495624138491 100644
--- a/drivers/video/rockchip/mpp/mpp_jpgdec.c
+++ b/drivers/video/rockchip/mpp/mpp_jpgdec.c
@@ -58,6 +58,9 @@
 #define JPGDEC_IRQ_DIS			BIT(1)
 #define JPGDEC_START_EN			BIT(0)
 
+#define JPGDEC_REG_SYS_BASE		0x008
+#define JPGDEC_FORCE_SOFTRESET_VALID	BIT(17)
+
 #define JPGDEC_REG_PIC_INFO_BASE	0x00c
 #define JPGDEC_REG_PIC_INFO_INDEX	(3)
 #define JPGDEC_GET_WIDTH(x)		(((x) & 0xffff) + 1)
@@ -234,6 +237,14 @@ static void *jpgdec_alloc_task(struct mpp_session *session,
 	return NULL;
 }
 
+static int jpgdec_soft_reset(struct mpp_dev *mpp)
+{
+	mpp_write(mpp, JPGDEC_REG_SYS_BASE, JPGDEC_FORCE_SOFTRESET_VALID);
+	mpp_write(mpp, JPGDEC_REG_INT_EN_BASE, JPGDEC_SOFT_REST_EN);
+
+	return 0;
+}
+
 static int jpgdec_run(struct mpp_dev *mpp,
 		      struct mpp_task *mpp_task)
 {
@@ -289,6 +300,15 @@ static int jpgdec_finish(struct mpp_dev *mpp,
 	dec_get = mpp_read_relaxed(mpp, JPGDEC_REG_STREAM_RLC_BASE);
 	dec_length = dec_get - task->strm_addr;
 	task->reg[JPGDEC_REG_STREAM_RLC_BASE_INDEX] = dec_length << 10;
+	/*
+	 * If the softrest_rdy bit is low,
+	 * it means that the soft-reset of the previous frame
+	 * has not been completed.We have to manually trigger to do soft-reset.
+	 */
+	if (!(task->irq_status & JPGDEC_SOFT_RSET_READY) &&
+	    !atomic_read(&mpp->reset_request))
+		jpgdec_soft_reset(mpp);
+
 	mpp_debug(DEBUG_REGISTER,
 		  "dec_get %08x dec_length %d\n", dec_get, dec_length);
 

commit 1a36b157baa77d34014e6be9f62b79e0fea98033
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Mon Aug 9 18:15:28 2021 +0800

    drivers: rkflash: Add retry after flash buffer bitflip
    
    We found that this abnormality exists not only in power lost,
    but also in extreme environments during normal use, so the
    retry mechanism is added.
    
    Change-Id: Iaaa84a099c575dde833f6806036ea216ab98fe54
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/rkflash/sfc_nand.c b/drivers/rkflash/sfc_nand.c
index 75b8b44e5548..34b967076a68 100644
--- a/drivers/rkflash/sfc_nand.c
+++ b/drivers/rkflash/sfc_nand.c
@@ -762,15 +762,16 @@ u32 sfc_nand_prog_page_raw(u8 cs, u32 addr, u32 *p_page_buf)
 	sfc_request(&op, plane, p_page_buf, page_size);
 
 	/*
-	 * At the moment of power lost, flash maybe work in a unkonw state
-	 * and result in bit flip, when this situation is detected by cache
-	 * recheck, it's better to wait a second for a reliable hardware
-	 * environment to avoid abnormal data written to flash array.
+	 * At the moment of power lost or dev running in harsh environment, flash
+	 * maybe work in a unkonw state and result in bit flip, when this situation
+	 * is detected by cache recheck, it's better to wait a second for a reliable
+	 * hardware environment to avoid abnormal data written to flash array.
 	 */
 	sfc_nand_read_cache(addr, (u32 *)sfc_nand_dev.recheck_buffer, 0, data_area_size);
 	if (memcmp(sfc_nand_dev.recheck_buffer, p_page_buf, data_area_size)) {
 		rkflash_print_error("%s cache bitflip1\n", __func__);
 		msleep(1000);
+		sfc_request(&op, plane, p_page_buf, page_size);
 	}
 
 	op.sfcmd.d32 = 0;

commit 698423bf9fd0113e84924942bdb032aae4fe56e7
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Thu Aug 5 20:11:46 2021 +0800

    media: rockchip: ispp: fix driver mode sync with ispserver
    
    Change-Id: Id3dad2f5c4e8a326f6c8541bdf75d8b8630b603d
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c
index 107d123a5b7d..9de507df5591 100644
--- a/drivers/media/platform/rockchip/ispp/stream.c
+++ b/drivers/media/platform/rockchip/ispp/stream.c
@@ -1191,8 +1191,6 @@ static int config_modules(struct rkispp_device *dev)
 {
 	int ret;
 
-	rkispp_start_3a_run(dev);
-
 	v4l2_dbg(1, rkispp_debug, &dev->v4l2_dev,
 		 "stream module ens:0x%x\n", dev->stream_vdev.module_ens);
 	dev->stream_vdev.monitor.monitoring_module = 0;
@@ -1251,6 +1249,7 @@ static int start_ii(struct rkispp_stream *stream)
 static int config_ii(struct rkispp_stream *stream)
 {
 	stream->is_cfg = true;
+	rkispp_start_3a_run(stream->isppdev);
 	return config_modules(stream->isppdev);
 }
 
@@ -1780,6 +1779,8 @@ static int start_isp(struct rkispp_device *dev)
 		return 0;
 	}
 
+	rkispp_start_3a_run(dev);
+
 	mutex_lock(&dev->hw_dev->dev_lock);
 
 	mode.work_mode = dev->isp_mode;

commit b93fb903559696c43266dabb22bf7f8f515497ea
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Tue Aug 10 10:46:20 2021 +0800

    Revert "misc: SRAM: Add option to map SRAM to allow code execution"
    
    This reverts commit 6e701bfc17f52d4a36802976ad6baa5ae8b4639d.
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: I22c9babebd361c5858251a08c97c79c02df42397

diff --git a/include/linux/platform_data/sram.h b/include/linux/platform_data/sram.h
deleted file mode 100644
index 38db9ae07308..000000000000
--- a/include/linux/platform_data/sram.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef _LINUX_SRAM_H
-#define _LINUX_SRAM_H
-
-struct sram_platform_data {
-	bool map_exec;
-};
-
-#endif

commit 9cc9fda6e7e2d5f9ed20d599f9d9f2797728d701
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Tue Aug 10 10:34:48 2021 +0800

    dt-bindings: pinctrl: Remove unused rockchip files
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: I97ee25706ee8b4307b6c6fc788f75988845fb6e4

diff --git a/include/dt-bindings/pinctrl/rockchip-rk3036.h b/include/dt-bindings/pinctrl/rockchip-rk3036.h
deleted file mode 100644
index 553c33579065..000000000000
--- a/include/dt-bindings/pinctrl/rockchip-rk3036.h
+++ /dev/null
@@ -1,267 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef __DT_BINDINGS_ROCKCHIP_PINCTRL_RK3036_H__
-#define __DT_BINDINGS_ROCKCHIP_PINCTRL_RK3036_H__
-
-        /* GPIO0_A */
-        #define GPIO0_A0 0x0a00
-        #define I2C0_SCL 0x0a01
-        #define PWM1 0x0a02
-
-        #define GPIO0_A1 0x0a10
-        #define I2C0_SDA 0x0a11
-        #define PWM2 0x0a12
-
-        #define GPIO0_A2 0x0a20
-        #define I2C1_SCL 0x0a21
-
-        #define GPIO0_A3 0x0a30
-        #define I2C1_SDA 0x0a31
-
-
-        /* GPIO0_B */
-        #define GPIO0_B0 0x0b00
-        #define MMC1_CMD 0x0b01
-        #define I2S1_SDO 0x0b02
-
-        #define GPIO0_B1 0x0b10
-        #define MMC1_CLKOUT 0x0b11
-        #define I2S1_MCLK 0x0b12
-
-        #define GPIO0_B3 0x0b30
-        #define MMC1_D0 0x0b31
-        #define I2S1_LRCKRX 0x0b32
-
-        #define GPIO0_B4 0x0b40
-        #define MMC1_D1 0x0b41
-        #define I2S1_LRCKTX 0x0b42
-
-        #define GPIO0_B5 0x0b50
-        #define MMC1_D2 0x0b51
-        #define I2S1_SDI 0x0b52
-
-        #define GPIO0_B6 0x0b60
-        #define MMC1_D3 0x0b61
-        #define I2S1_SCLK 0x0b62
-
-
-        /* GPIO0_C */
-        #define GPIO0_C0 0x0c00
-        #define UART0_SOUT 0x0c01
-
-        #define GPIO0_C1 0x0c10
-        #define UART0_SIN 0x0c11
-
-        #define GPIO0_C2 0x0c20
-        #define UART0_RTSN 0x0c21
-
-        #define GPIO0_C3 0x0c30
-        #define UART0_CTSN 0x0c31
-
-        #define GPIO0_C4 0x0c40
-        #define DRIVE_VBUS 0x0c41
-
-
-        /* GPIO0_D */
-        #define GPIO0_D2 0x0d20
-        #define PWM0 0x0d21
-
-        #define GPIO0_D3 0x0d30
-        #define PWM3(IR) 0x0d31
-
-        #define GPIO0_D4 0x0d40
-        #define SPDIF_TX 0x0d41
-
-
-        /* GPIO1_A */
-        #define GPIO1_A0 0x1a00
-        #define I2S0_MCLK 0x1a01
-
-        #define GPIO1_A1 0x1a10
-        #define I2S0_SCLK 0x1a11
-
-        #define GPIO1_A2 0x1a20
-        #define I2S0_LRCKRX 0x1a21
-        #define PWM1_0 0x1a22
-
-        #define GPIO1_A3 0x1a30
-        #define I2S0_LRCKTX 0x1a31
-
-        #define GPIO1_A4 0x1a40
-        #define I2S0_SDO 0x1a41
-
-        #define GPIO1_A5 0x1a50
-        #define I2S0_SDI 0x1a51
-
-
-        /* GPIO1_B */
-        #define GPIO1_B0 0x1b00
-        #define HDMI_CEC 0x1b01
-
-        #define GPIO1_B1 0x1b10
-        #define HDMI_SDA 0x1b11
-
-        #define GPIO1_B2 0x1b20
-        #define HDMI_SCL 0x1b21
-
-        #define GPIO1_B3 0x1b30
-        #define HDMI_HPD 0x1b31
-
-        #define GPIO1_B7 0x1b70
-        #define MMC0_CMD 0x1b71
-
-
-        /* GPIO1_C */
-        #define GPIO1_C0 0x1c00
-        #define MMC0_CLKOUT 0x1c01
-
-        #define GPIO1_C1 0x1c10
-        #define MMC0_DETN 0x1c11
-
-        #define GPIO1_C2 0x1c20
-        #define MMC0_D0 0x1c21
-        #define UART2_SIN 0x1c22
-
-        #define GPIO1_C3 0x1c30
-        #define MMC0_D1 0x1c31
-        #define UART2_SOUT 0x1c32
-
-        #define GPIO1_C4 0x1c40
-        #define MMC0_D2 0x1c41
-        #define JTAG_TCK 0x1c42
-
-        #define GPIO1_C5 0x1c50
-        #define MMC0_D3 0x1c51
-        #define JTAG_TMS 0x1c52
-
-
-        /* GPIO1_D */
-        #define GPIO1_D0 0x1d00
-        #define NAND_D0 0x1d01
-        #define EMMC_D0 0x1d02
-        #define SFC_SIO0 0x1d03
-
-        #define GPIO1_D1 0x1d10
-        #define NAND_D1 0x1d11
-        #define EMMC_D1 0x1d12
-        #define SFC_SIO1 0x1d13
-
-        #define GPIO1_D2 0x1d20
-        #define NAND_D2 0x1d21
-        #define EMMC_D2 0x1d22
-        #define SFC_SIO2 0x1d23
-
-        #define GPIO1_D3 0x1d30
-        #define NAND_D3 0x1d31
-        #define EMMC_D3 0x1d32
-        #define SFC_SIO3 0x1d33
-
-        #define GPIO1_D4 0x1d40
-        #define NAND_D4 0x1d41
-        #define EMMC_D4 0x1d42
-        #define SPI0_RXD 0x1d43
-
-        #define GPIO1_D5 0x1d50
-        #define NAND_D5 0x1d51
-        #define EMMC_D5 0x1d52
-        #define SPI0_TXD 0x1d53
-
-        #define GPIO1_D6 0x1d60
-        #define NAND_D6 0x1d61
-        #define EMMC_D6 0x1d62
-        #define SPI0_CS0 0x1d63
-
-        #define GPIO1_D7 0x1d70
-        #define NAND_D7 0x1d71
-        #define EMMC_D7 0x1d72
-        #define SPI0_CS1 0x1d73
-
-
-        /* GPIO2_A */
-        #define GPIO2_A0 0x2a00
-        #define NAND_ALE 0x2a01
-        #define SPI0_CLK 0x2a02
-
-        #define GPIO2_A1 0x2a10
-        #define NAND_CLE 0x2a11
-        #define EMMC_CLKOUT 0x2a12
-
-        #define GPIO2_A2 0x2a20
-        #define NAND_WRN 0x2a21
-        #define SFC_CSN0 0x2a22
-
-        #define GPIO2_A3 0x2a30
-        #define NAND_RDN 0x2a31
-        #define SFC_CSN1 0x2a32
-
-        #define GPIO2_A4 0x2a40
-        #define NAND_RDY 0x2a41
-        #define EMMC_CMD 0x2a42
-        #define SFC_CLK 0x2a43
-
-        #define GPIO2_A6 0x2a60
-        #define NAND_CS0 0x2a61
-
-        #define GPIO2_A7 0x2a70
-        #define TESTCLK_OUT 0x2a71
-
-
-        /* GPIO2_B */
-        #define GPIO2_B2 0x2b20
-        #define MAC_CRS 0x2b21
-
-        #define GPIO2_B4 0x2b40
-        #define MAC_MDIO 0x2b41
-
-        #define GPIO2_B5 0x2b50
-        #define MAC_TXEN 0x2b51
-
-        #define GPIO2_B6 0x2b60
-        #define MAC_CLKOUT 0x2b61
-        #define MAC_CLKIN 0x2b62
-
-        #define GPIO2_B7 0x2b70
-        #define MAC_RXER 0x2b71
-
-
-        /* GPIO2_C */
-        #define GPIO2_C0 0x2c00
-        #define MAC_RXD1 0x2c01
-
-        #define GPIO2_C1 0x2c10
-        #define MAC_RXD0 0x2c11
-
-        #define GPIO2_C2 0x2c20
-        #define MAC_TXD1 0x2c21
-
-        #define GPIO2_C3 0x2c30
-        #define MAC_TXD0 0x2c31
-
-        #define GPIO2_C4 0x2c40
-        #define I2C2_SDA 0x2c41
-
-        #define GPIO2_C5 0x2c50
-        #define I2C2_SCL 0x2c51
-
-        #define GPIO2_C6 0x2c60
-        #define UART1_SIN 0x2c61
-
-        #define GPIO2_C7 0x2c70
-        #define UART1_SOUT 0x2c71
-        #define TESTCLK_OUT1 0x2c72
-
-
-        /* GPIO2_D */
-        #define GPIO2_D1 0x2d10
-        #define MAC_MDC 0x2d11
-
-        #define GPIO2_D4 0x2d40
-        #define I2S0_SDO3 0x2d41
-
-        #define GPIO2_D5 0x2d50
-        #define I2S0_SDO2 0x2d51
-
-        #define GPIO2_D6 0x2d60
-        #define I2S0_SDO1 0x2d61
-
-
-#endif
diff --git a/include/dt-bindings/pinctrl/rockchip-rk312x.h b/include/dt-bindings/pinctrl/rockchip-rk312x.h
deleted file mode 100644
index e0fa5976c18f..000000000000
--- a/include/dt-bindings/pinctrl/rockchip-rk312x.h
+++ /dev/null
@@ -1,384 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef __DT_BINDINGS_ROCKCHIP_PINCTRL_RK312X_H__
-#define __DT_BINDINGS_ROCKCHIP_PINCTRL_RK312X_H__
-
-/* GPIO0_A */
-#define GPIO0_A0 0x0a00
-#define I2C0_SCL 0x0a01
-
-#define GPIO0_A1 0x0a10
-#define I2C0_SDA 0x0a11
-
-#define GPIO0_A2 0x0a20
-#define I2C1_SCL 0x0a21
-
-#define GPIO0_A3 0x0a30
-#define I2C1_SDA 0x0a31
-#define MMC1_CMD 0x0a32
-
-#define GPIO0_A6 0x0a60
-#define I2C3_SCL 0x0a61
-#define HDMI_DSCL 0x0a62
-
-#define GPIO0_A7 0x0a70
-#define I2C3_SDA 0x0a71
-#define HDMI_DSDA 0x0a72
-
-
-/* GPIO0_B */
-#define GPIO0_B0 0x0b00
-#define I2S0_MCLK_MUX0 0x0b01
-
-#define GPIO0_B1 0x0b10
-#define I2S0_SCLK_MUX0 0x0b11
-#define SPI0_CLK_MUX2 0x0b12
-
-#define GPIO0_B3 0x0b30
-#define I2S0_LRCKRX_MUX0 0x0b31
-#define SPI0_TXD_MUX2 0x0b32
-
-#define GPIO0_B4 0x0b40
-#define I2S0_LRCKTX_MUX0 0x0b41
-
-#define GPIO0_B5 0x0b50
-#define I2S0_SDO_MUX0 0x0b51
-#define SPI0_RXD_MUX2 0x0b52
-
-#define GPIO0_B6 0x0b60
-#define I2S0_SDI_MUX0 0x0b61
-#define SPI0_CS0_MUX2 0x0b62
-
-#define GPIO0_B7 0x0b70
-#define HDMI_HPD 0x0b71
-
-
-/* GPIO0_C */
-#define GPIO0_C1 0x0c10
-#define SC_IO 0x0c11
-#define UART0_RTSN 0x0c12
-
-#define GPIO0_C4 0x0c40
-#define HDMI_CEC 0x0c41
-
-#define GPIO0_C7 0x0c70
-#define NAND_CS1 0x0c71
-
-
-/* GPIO0_D */
-#define GPIO0_D0 0x0d00
-#define UART2_RTSN 0x0d01
-#define PMIC_SLEEP_MUX0 0x0d02
-
-#define GPIO0_D1 0x0d10
-#define UART2_CTSN 0x0d11
-
-#define GPIO0_D2 0x0d20
-#define PWM0 0x0d21
-
-#define GPIO0_D3 0x0d30
-#define PWM1 0x0d31
-
-#define GPIO0_D4 0x0d40
-#define PWM2 0x0d41
-
-#define GPIO0_D6 0x0d60
-#define MMC1_PWREN 0x0d61
-
-
-/* GPIO1_A */
-#define GPIO1_A0 0x1a00
-#define I2S0_MCLK_MUX1 0x1a01
-#define SDMMC_CLKOUT 0x1a02
-#define XIN32K 0x1a03
-
-#define GPIO1_A1 0x1a10
-#define I2S0_SCLK_MUX1 0x1a11
-#define SDMMC_DATA0 0x1a12
-#define PMIC_SLEEP_MUX1 0x1a13
-
-#define GPIO1_A2 0x1a20
-#define I2S0_LRCKRX_MUX1 0x1a21
-#define SDMMC_DATA1 0x1a22
-
-#define GPIO1_A3 0x1a30
-#define I2S0_LRCKTX_MUX1 0x1a31
-
-#define GPIO1_A4 0x1a40
-#define I2S0_SDO_MUX1 0x1a41
-#define SDMMC_DATA2 0x1a42
-
-#define GPIO1_A5 0x1a50
-#define I2S0_SDI_MUX1 0x1a51
-#define SDMMC_DATA3 0x1a52
-
-#define GPIO1_A7 0x1a70
-#define MMC0_WRPRT 0x1a71
-
-
-/* GPIO1_B */
-#define GPIO1_B0 0x1b00
-#define SPI0_CLK_MUX0 0x1b01
-#define UART1_CTSN 0x1b02
-
-#define GPIO1_B1 0x1b10
-#define SPI0_TXD_MUX0 0x1b11
-#define UART1_SOUT 0x1b12
-
-#define GPIO1_B2 0x1b20
-#define SPI0_RXD_MUX0 0x1b21
-#define UART1_SIN 0x1b22
-
-#define GPIO1_B3 0x1b30
-#define SPI0_CS0_MUX0 0x1b31
-#define UART1_RTSN 0x1b32
-
-#define GPIO1_B4 0x1b40
-#define SPI0_CS1_MUX0 0x1b41
-
-#define GPIO1_B6 0x1b60
-#define MMC0_PWREN 0x1b61
-
-#define GPIO1_B7 0x1b70
-#define MMC0_CMD 0x1b71
-
-
-/* GPIO1_C */
-#define GPIO1_C0 0x1c00
-#define MMC0_CLKOUT 0x1c01
-
-#define GPIO1_C1 0x1c10
-#define MMC0_DETN 0x1c11
-
-#define GPIO1_C2 0x1c20
-#define MMC0_D0 0x1c21
-#define UART2_SOUT 0x1c22
-
-#define GPIO1_C3 0x1c30
-#define MMC0_D1 0x1c31
-#define UART2_SIN 0x1c32
-
-#define GPIO1_C4 0x1c40
-#define MMC0_D2 0x1c41
-#define JTAG_TCK 0x1c42
-
-#define GPIO1_C5 0x1c50
-#define MMC0_D3 0x1c51
-#define JTAG_TMS 0x1c52
-
-#define GPIO1_C6 0x1c60
-#define NAND_CS2 0x1c61
-#define EMMC_CMD_MUX0 0x1c62
-
-#define GPIO1_C7 0x1c70
-#define NAND_CS3 0x1c71
-#define EMMC_RSTNOUT 0x1c72
-
-
-/* GPIO1_D */
-#define GPIO1_D0 0x1d00
-#define NAND_D0 0x1d01
-#define EMMC_D0 0x1d02
-#define SFC_D0 0x1d03
-
-#define GPIO1_D1 0x1d10
-#define NAND_D1 0x1d11
-#define EMMC_D1 0x1d12
-#define SFC_D1 0x1d13
-
-#define GPIO1_D2 0x1d20
-#define NAND_D2 0x1d21
-#define EMMC_D2 0x1d22
-#define SFC_D2 0x1d23
-
-#define GPIO1_D3 0x1d30
-#define NAND_D3 0x1d31
-#define EMMC_D3 0x1d32
-#define SFC_D3 0x1d33
-
-#define GPIO1_D4 0x1d40
-#define NAND_D4 0x1d41
-#define EMMC_D4 0x1d42
-#define SPI0_RXD_MUX1 0x1d43
-
-#define GPIO1_D5 0x1d50
-#define NAND_D5 0x1d51
-#define EMMC_D5 0x1d52
-#define SPI0_TXD_MUX1 0x1d53
-
-#define GPIO1_D6 0x1d60
-#define NAND_D6 0x1d61
-#define EMMC_D6 0x1d62
-#define SPI0_CS0_MUX1 0x1d63
-
-#define GPIO1_D7 0x1d70
-#define NAND_D7 0x1d71
-#define EMMC_D7 0x1d72
-#define SPI0_CS1_MUX1 0x1d73
-
-
-/* GPIO2_A */
-#define GPIO2_A0 0x2a00
-#define NAND_ALE 0x2a01
-#define SPI0_CLK_MUX1 0x2a02
-
-#define GPIO2_A1 0x2a10
-#define NAND_CLE 0x2a11
-
-#define GPIO2_A2 0x2a20
-#define NAND_WRN 0x2a21
-#define SFC_CSN0 0x2a22
-
-#define GPIO2_A3 0x2a30
-#define NAND_RDN 0x2a31
-#define SFC_CSN1 0x2a32
-
-#define GPIO2_A4 0x2a40
-#define NAND_RDY 0x2a41
-#define EMMC_CMD_MUX1 0x2a42
-#define SFC_CLK 0x2a43
-
-#define GPIO2_A5 0x2a50
-#define NAND_WP 0x2a51
-#define EMMC_PWREN 0x2a52
-
-#define GPIO2_A6 0x2a60
-#define NAND_CS0 0x2a61
-
-#define GPIO2_A7 0x2a70
-#define NAND_DQS 0x2a71
-#define EMMC_CLKOUT 0x2a72
-
-
-/* GPIO2_B */
-#define GPIO2_B0 0x2b00
-#define LCDC0_DCLK 0x2b01
-#define EBC_SDCLK 0x2b02
-#define GMAC_RXDV 0x2b03
-
-#define GPIO2_B1 0x2b10
-#define LCDC0_HSYNC 0x2b11
-#define EBC_SDLE 0x2b12
-#define GMAC_TXCLK 0x2b13
-
-#define GPIO2_B2 0x2b20
-#define LCDC0_VSYNC 0x2b21
-#define EBC_SDOE 0x2b22
-#define GMAC_CRS 0x2b23
-
-#define GPIO2_B3 0x2b30
-#define LCDC0_DEN 0x2b31
-#define EBC_GDCLK 0x2b32
-#define GMAC_RXCLK 0x2b33
-
-#define GPIO2_B4 0x2b40
-#define LCDC0_D10 0x2b41
-#define EBC_SDCE2 0x2b42
-#define GMAC_MDIO 0x2b43
-
-#define GPIO2_B5 0x2b50
-#define LCDC0_D11 0x2b51
-#define EBC_SDCE3 0x2b52
-#define GMAC_TXEN 0x2b53
-
-#define GPIO2_B6 0x2b60
-#define LCDC0_D12 0x2b61
-#define EBC_SDCE4 0x2b62
-#define GMAC_CLK 0x2b63
-
-#define GPIO2_B7 0x2b70
-#define LCDC0_D13 0x2b71
-#define EBC_SDCE5 0x2b72
-#define GMAC_RXER 0x2b73
-
-
-/* GPIO2_C */
-#define GPIO2_C0 0x2c00
-#define LCDC0_D14 0x2c01
-#define EBC_VCOM 0x2c02
-#define GMAC_RXD1 0x2c03
-
-#define GPIO2_C1 0x2c10
-#define LCDC0_D15 0x2c11
-#define EBC_GDOE 0x2c12
-#define GMAC_RXD0 0x2c13
-
-#define GPIO2_C2 0x2c20
-#define LCDC0_D16 0x2c21
-#define EBC_GDSP 0x2c22
-#define GMAC_TXD1 0x2c23
-
-#define GPIO2_C3 0x2c30
-#define LCDC0_D17 0x2c31
-#define EBC_GDPWR0 0x2c32
-#define GMAC_TXD0 0x2c33
-
-#define GPIO2_C4 0x2c40
-#define LCDC0_D18 0x2c41
-#define EBC_GDRL 0x2c42
-#define I2C2_SDA 0x2c43
-#define GMAC_RXD3 0x2c44
-
-#define GPIO2_C5 0x2c50
-#define LCDC0_D19 0x2c51
-#define EBC_SDSHR 0x2c52
-#define I2C2_SCL 0x2c53
-#define GMAC_RXD2 0x2c54
-
-#define GPIO2_C6 0x2c60
-#define LCDC0_D20 0x2c61
-#define EBC_BORDER0 0x2c62
-#define GPS_SIGN 0x2c63
-#define GMAC_TXD2 0x2c64
-
-#define GPIO2_C7 0x2c70
-#define LCDC0_D21 0x2c71
-#define EBC_BORDER1 0x2c72
-#define GPS_MAG 0x2c73
-#define GMAC_TXD3 0x2c74
-
-
-/* GPIO2_D */
-#define GPIO2_D0 0x2d00
-#define LCDC0_D22 0x2d01
-#define EBC_GDPWR1 0x2d02
-#define GPS_CLK 0x2d03
-#define GMAC_COL 0x2d04
-
-#define GPIO2_D1 0x2d10
-#define LCDC0_D23 0x2d11
-#define EBC_GDPWR2 0x2d12
-#define GMAC_MDC 0x2d13
-
-#define GPIO2_D2 0x2d20
-#define SC_RST 0x2d21
-#define UART0_SOUT 0x2d22
-
-#define GPIO2_D3 0x2d30
-#define SC_CLK 0x2d31
-#define UART0_SIN 0x2d32
-
-#define GPIO2_D5 0x2d50
-#define SC_DET 0x2d51
-#define UART0_CTSN 0x2d52
-
-
-/* GPIO3_A */
-/* GPIO3_B */
-#define GPIO3_B3 0x3b30
-#define TESTCLK_OUT 0x3b31
-
-
-/* GPIO3_C */
-#define GPIO3_C1 0x3c10
-#define OTG_DRVVBUS 0x3c11
-
-
-/* GPIO3_D */
-#define GPIO3_D2 0x3d20
-#define PWM_IRIN 0x3d21
-
-#define GPIO3_D3 0x3d30
-#define SPDIF_TX 0x3d31
-
-
-#endif
diff --git a/include/dt-bindings/pinctrl/rockchip-rk3188.h b/include/dt-bindings/pinctrl/rockchip-rk3188.h
deleted file mode 100755
index 58bba225d1de..000000000000
--- a/include/dt-bindings/pinctrl/rockchip-rk3188.h
+++ /dev/null
@@ -1,457 +0,0 @@
-/*
- * Header providing constants for Rockchip pinctrl bindings.
- *
- * Copyright (c) 2013 MundoReader S.L.
- * Author: Heiko Stuebner <heiko@sntech.de>
- *
- * 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.
- *
- * 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.
- */
-
-#ifndef __DT_BINDINGS_ROCKCHIP_PINCTRL_RK3188_H__
-#define __DT_BINDINGS_ROCKCHIP_PINCTRL_RK3188_H__
-
-
-/* GPIO0_A */
-#define GPIO0_A0 0x0A00
-#define GPIO0_A1 0x0A10
-
-/* GPIO0_B */
-/* GPIO0_C */
-#define GPIO0_C0 0x0c00
-#define NAND_D8 0x0c01
-
-#define GPIO0_C1 0x0c10
-#define NAND_D9 0x0c11
-
-#define GPIO0_C2 0x0c20
-#define NAND_D10 0x0c21
-
-#define GPIO0_C3 0x0c30
-#define NAND_D11 0x0c31
-
-#define GPIO0_C4 0x0c40
-#define NAND_D12 0x0c41
-
-#define GPIO0_C5 0x0c50
-#define NAND_D13 0x0c51
-
-#define GPIO0_C6 0x0c60
-#define NAND_D14 0x0c61
-
-#define GPIO0_C7 0x0c70
-#define NAND_D15 0x0c71
-
-
-/* GPIO0_D */
-#define GPIO0_D0 0x0d00
-#define NAND_DQS 0x0d01
-#define EMMC_CLKOUT 0x0d02
-
-#define GPIO0_D1 0x0d10
-#define NAND_CS1 0x0d11
-
-#define GPIO0_D2 0x0d20
-#define NAND_CS2 0x0d21
-#define EMMC_CMD 0x0d22
-
-#define GPIO0_D3 0x0d30
-#define NAND_CS3 0x0d31
-#define EMMC_RSTNOUT 0x0d32
-
-#define GPIO0_D4 0x0d40
-#define SPI1_RXD 0x0d41
-
-#define GPIO0_D5 0x0d50
-#define SPI1_TXD 0x0d51
-
-#define GPIO0_D6 0x0d60
-#define SPI1_CLK 0x0d61
-
-#define GPIO0_D7 0x0d70
-#define SPI1_CS0 0x0d71
-
-
-/* GPIO1_A */
-#define GPIO1_A0 0x1a00
-#define UART0_SIN 0x1a01
-
-#define GPIO1_A1 0x1a10
-#define UART0_SOUT 0x1a11
-
-#define GPIO1_A2 0x1a20
-#define UART0_CTSN 0x1a21
-
-#define GPIO1_A3 0x1a30
-#define UART0_RTSN 0x1a31
-
-#define GPIO1_A4 0x1a40
-#define UART1_SIN 0x1a41
-#define SPI0_RXD 0x1a42
-
-#define GPIO1_A5 0x1a50
-#define UART1_SOUT 0x1a51
-#define SPI0_TXD 0x1a52
-
-#define GPIO1_A6 0x1a60
-#define UART1_CTSN 0x1a61
-#define SPI0_CLK 0x1a62
-
-#define GPIO1_A7 0x1a70
-#define UART1_RTSN 0x1a71
-#define SPI0_CS0 0x1a72
-
-/* GPIO1_B */
-#define GPIO1_B0 0x1b00
-#define UART2_SIN 0x1b01
-#define JTAG_TDI 0x1b02
-
-#define GPIO1_B1 0x1b10
-#define UART2_SOUT 0x1b11
-#define JTAG_TDO 0x1b12
-
-#define GPIO1_B2 0x1b20
-#define UART3_SIN 0x1b21
-#define GPS_MAG 0x1b22
-
-#define GPIO1_B3 0x1b30
-#define UART3_SOUT 0x1b31
-#define GPS_SIG 0x1b32
-
-#define GPIO1_B4 0x1b40
-#define UART3_CTSN 0x1b41
-#define GPS_RFCLK 0x1b42
-
-#define GPIO1_B5 0x1b50
-#define UART3_RTSN 0x1b51
-
-#define GPIO1_B6 0x1b60
-#define SPDIF_TX 0x1b61
-#define SPI1_CS1 0x1b62
-
-#define GPIO1_B7 0x1b70
-#define SPI0_CS1 0x1b71
-
-
-/* GPIO1_C */
-#define GPIO1_C0 0x1c00
-#define I2S0_MCLK 0x1c01
-
-#define GPIO1_C1 0x1c10
-#define I2S0_SCLK 0x1c11
-
-#define GPIO1_C2 0x1c20
-#define I2S0_LRCKRX 0x1c21
-
-#define GPIO1_C3 0x1c30
-#define I2S0_LRCKTX 0x1c31
-
-#define GPIO1_C4 0x1c40
-#define I2S0_SDI 0x1c41
-
-#define GPIO1_C5 0x1c50
-#define I2S0_SDO 0x1c51
-
-
-/* GPIO1_D */
-#define GPIO1_D0 0x1d00
-#define I2C0_SDA 0x1d01
-
-#define GPIO1_D1 0x1d10
-#define I2C0_SCL 0x1d11
-
-#define GPIO1_D2 0x1d20
-#define I2C1_SDA 0x1d21
-
-#define GPIO1_D3 0x1d30
-#define I2C1_SCL 0x1d31
-
-#define GPIO1_D4 0x1d40
-#define I2C2_SDA 0x1d41
-
-#define GPIO1_D5 0x1d50
-#define I2C2_SCL 0x1d51
-
-#define GPIO1_D6 0x1d60
-#define I2C4_SDA 0x1d61
-
-#define GPIO1_D7 0x1d70
-#define I2C4_SCL 0x1d71
-
-
-/* GPIO2_A */
-#define GPIO2_A0 0x2a00
-#define LCDC1_D0 0x2a01
-#define SMC_D0 0x2a02
-#define TRACE_D0 0x2a03
-
-#define GPIO2_A1 0x2a10
-#define LCDC1_D1 0x2a11
-#define SMC_D1 0x2a12
-#define TRACE_D1 0x2a13
-
-#define GPIO2_A2 0x2a20
-#define LCDC1_D2 0x2a21
-#define SMC_D2 0x2a22
-#define TRACE_D2 0x2a23
-
-#define GPIO2_A3 0x2a30
-#define LCDC1_D3 0x2a31
-#define SMC_D3 0x2a32
-#define TRACE_D3 0x2a33
-
-#define GPIO2_A4 0x2a40
-#define LCDC1_D4 0x2a41
-#define SMC_D4 0x2a42
-#define TRACE_D4 0x2a43
-
-#define GPIO2_A5 0x2a50
-#define LCDC1_D5 0x2a51
-#define SMC_D5 0x2a52
-#define TRACE_D5 0x2a53
-
-#define GPIO2_A6 0x2a60
-#define LCDC1_D6 0x2a61
-#define SMC_D6 0x2a62
-#define TRACE_D6 0x2a63
-
-#define GPIO2_A7 0x2a70
-#define LCDC1_D7 0x2a71
-#define SMC_D7 0x2a72
-#define TRACE_D7 0x2a73
-
-
-/* GPIO2_B */
-#define GPIO2_B0 0x2b00
-#define LCDC1_D8 0x2b01
-#define SMC_D8 0x2b02
-#define TRACE_D8 0x2b03
-
-#define GPIO2_B1 0x2b10
-#define LCDC1_D9 0x2b11
-#define SMC_D9 0x2b11
-#define TRACE_D9 0x2b12
-
-#define GPIO2_B2 0x2b20
-#define LCDC1_D10 0x2b21
-#define SMC_D10 0x2b22
-#define TRACE_D10 0x2b23
-
-#define GPIO2_B3 0x2b30
-#define LCDC1_D11 0x2b31
-#define SMC_D11 0x2b32
-#define TRACE_D11 0x2b33
-
-#define GPIO2_B4 0x2b40
-#define LCDC1_D12 0x2b41
-#define SMC_D12 0x2b42
-#define TRACE_D12 0x2b43
-
-#define GPIO2_B5 0x2b50
-#define LCDC1_D13 0x2b51
-#define SMC_D13 0x2b52
-#define TRACE_D13 0x2b53
-
-#define GPIO2_B6 0x2b60
-#define LCDC1_D14 0x2b61
-#define SMC_D14 0x2b62
-#define TRACE_D14 0x2b63
-
-
-#define GPIO2_B7 0x2b70
-#define LCDC1_D15 0x2b71
-#define SMC_D15 0x2b72
-#define TRACE_D15 0x2b73
-
-
-/* GPIO2_C */
-#define GPIO2_C0 0x2c00
-#define LCDC1_D16 0x2c01
-#define SMC_R0 0x2c02
-#define TRACE_CLK 0x2c03
-
-#define GPIO2_C1 0x2c10
-#define LCDC1_D17 0x2c11
-#define SMC_R1 0x2c12
-#define TRACE_CTL 0x2c13
-
-#define GPIO2_C2 0x2c20
-#define LCDC1_D18 0x2c21
-#define SMC_R2 0x2c22
-
-#define GPIO2_C3 0x2c30
-#define LCDC1_D19 0x2c31
-#define SMC_R3 0x2c32
-
-#define GPIO2_C4 0x2c40
-#define LCDC1_D20 0x2c41
-#define SMC_R4 0x2c42
-
-#define GPIO2_C5 0x2c50
-#define LCDC1_D21 0x2c51
-#define SMC_R5 0x2c52
-
-#define GPIO2_C6 0x2c60
-#define LCDC1_D22 0x2c61
-#define SMC_R6 0x2c62
-
-#define GPIO2_C7 0x2c70
-#define LCDC1_D23 0x2c71
-#define SMC_R7 0x2c72
- 
-
-/* GPIO2_D */
-#define GPIO2_D0 0x2d00
-#define LCDC1_DCLK 0x2d01
-#define SMC_CS0 0x2d02
-
-#define GPIO2_D1 0x2d10
-#define LCDC1_DEN 0x2d11
-#define SMC_WEN 0x2d12
-
-#define GPIO2_D2 0x2d20
-#define LCDC1_HSYNC 0x2d21
-#define SMC_OEN 0x2d22
-
-#define GPIO2_D3 0x2d30
-#define LCDC1_VSYNC 0x2d31
-#define SMC_ADVN 0x2d32
-
-#define GPIO2_D4 0x2d40
-#define SMC_BLSN0 0x2d41
-
-#define GPIO2_D5 0x2d50
-#define SMC_BLSN1 0x2d51
-
-#define GPIO2_D6 0x2d60
-#define SMC_CS1 0x2d61
-
-#define GPIO2_D7 0x2d70
-#define TEST_CLK_OUT 0x2d71
-
-
-/* GPIO3_A */
-#define GPIO3_A0 0x3a00
-#define MMC0_RSTNOUT 0x3a01
-
-#define GPIO3_A1 0x3a10
-#define MMC0_PWREN 0x3a11
-
-#define GPIO3_A2 0x3a20
-#define MMC0_CLKOUT 0x3a21
-
-#define GPIO3_A3 0x3a30
-#define MMC0_CMD 0x3a31
-
-#define GPIO3_A4 0x3a40
-#define MMC0_D0 0x3a41
-
-#define GPIO3_A5 0x3a50
-#define MMC0_D1 0x3a51
-
-#define GPIO3_A6 0x3a60
-#define MMC0_D2 0x3a61
-
-#define GPIO3_A7 0x3a70
-#define MMC0_D3 0x3a71
-
-
-/* GPIO3_B */
-#define GPIO3_B0 0x3b00
-#define MMC0_DETN 0x3b01
-
-#define GPIO3_B1 0x3b10
-#define MMC0_WRPRT 0x3b11
-
-#define GPIO3_B3 0x3b30
-#define CIF0_CLKOUT 0x3b31
-
-#define GPIO3_B4 0x3b40
-#define CIF0_D0 0x3b41
-#define HSADC_D8 0x3b42
-
-#define GPIO3_B5 0x3b50
-#define CIF0_D1 0x3b51
-#define HSADC_D9 0x3b52
-
-#define GPIO3_B6 0x3b60
-#define CIF0_D10 0x3b61
-#define I2C3_SDA 0x3b62
-
-#define GPIO3_B7 0x3b70
-#define CIF0_D11 0x3b71
-#define I2C3_SCL 0x3b72
-
-
-/* GPIO3_C */
-#define GPIO3_C0 0x3c00
-#define MMC1_CMD 0x3c01
-#define RMII_TXEN 0x3c02
-
-#define GPIO3_C1 0x3c10
-#define MMC1_D0 0x3c11
-#define RMII_TXD1 0x3c12
-
-#define GPIO3_C2 0x3c20
-#define MMC1_D1 0x3c21
-#define RMII_TXD0 0x3c22
-
-#define GPIO3_C3 0x3c30
-#define MMC1_D2 0x3c31
-#define RMII_RXD0 0x3c32
-
-#define GPIO3_C4 0x3c40
-#define MMC1_D3 0x3c41
-#define RMII_RXD1 0x3c42
-
-#define GPIO3_C5 0x3c50
-#define MMC1_CLKOUT 0x3c51
-#define RMII_CLKOUT 0x3c52
-#define RMII_CLKIN 0x3c52
-
-#define GPIO3_C6 0x3c60
-#define MMC1_DETN 0x3c61
-#define RMII_RXERR 0x3c62
-
-#define GPIO3_C7 0x3c70
-#define MMC1_WRPRT 0x3c71
-#define RMII_CRS 0x3c72
-
-
-/* GPIO3_D */
-#define GPIO3_D0 0x3d00
-#define MMC1_PWREN 0x3d01
-#define RMII_MD 0x3d02
-
-#define GPIO3_D1 0x3d10
-#define MMC1_BKEPWR 0x3d11
-#define RMII_MDCLK 0x3d12
-
-#define GPIO3_D2 0x3d20
-#define MMC1_INTN 0x3d21
-
-#define GPIO3_D3 0x3d30
-#define PWM0 0x3d31
-
-#define GPIO3_D4 0x3d40
-#define PWM1 0x3d41
-#define JTAG_TRSTN 0x3d42
-
-#define GPIO3_D5 0x3d50
-#define PWM2 0x3d51
-#define JTAG_TCK 0x3d52
-#define OTG_DRV_VBUS 0x3d53
-
-#define GPIO3_D6 0x3d60
-#define PWM3 0x3d61
-#define JTAG_TMS 0x3d62
-#define HOST_DRV_VBUS 0x3d63
-
-#endif
diff --git a/include/dt-bindings/pinctrl/rockchip-rk3288.h b/include/dt-bindings/pinctrl/rockchip-rk3288.h
deleted file mode 100755
index 97aa66e2b329..000000000000
--- a/include/dt-bindings/pinctrl/rockchip-rk3288.h
+++ /dev/null
@@ -1,666 +0,0 @@
-/*
- * Header providing constants for Rockchip pinctrl bindings.
- *
- * Copyright (c) 2013 MundoReader S.L.
- * Author: Heiko Stuebner <heiko@sntech.de>
- *
- * 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.
- *
- * 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.
- */
-
-#ifndef __DT_BINDINGS_ROCKCHIP_PINCTRL_RK3288_H__
-#define __DT_BINDINGS_ROCKCHIP_PINCTRL_RK3288_H__
-
-/* GPIO0_A */
-#define GPIO0_A0 0x0a00
-#define GLOBAL_PWROFF 0x0a01
-
-#define GPIO0_A1 0x0a10
-#define DDRIO_PWROFF 0x0a11
-
-#define GPIO0_A2 0x0a20
-#define DDR0_RETENTION 0x0a21
-
-#define GPIO0_A3 0x0a30
-#define DDR1_RETENTION 0x0a31
-
-#define GPIO0_A4 0x0a40
-
-#define GPIO0_A5 0x0a50
-
-#define GPIO0_A6 0x0a60
-
-#define GPIO0_A7 0x0a70
-
-/* GPIO0_B */
-#define GPIO0_B0 0x0b00
-
-#define GPIO0_B1 0x0b10
-
-#define GPIO0_B2 0x0b20
-#define TSADC_INT 0x0b21
-
-#define GPIO0_B3 0x0b30
-
-#define GPIO0_B4 0x0b40
-
-#define GPIO0_B5 0x0b50
-#define CLK_27M 0x0b51
-
-#define GPIO0_B6 0x0b60
-
-#define GPIO0_B7 0x0b70
-#define I2C0PMU_SDA 0x0b71
-
-
-/* GPIO0_C */
-#define GPIO0_C0 0x0c00
-#define I2C0PMU_SCL 0x0c01
-
-#define GPIO0_C1 0x0c10
-#define TEST_CLKOUT 0x0c11
-#define CLKT1_27M 0x0c12
-
-#define GPIO0_C2 0x0c20
-
-
-/* GPIO1_A */
-/* GPIO1_B */
-/* GPIO1_C */
-/* GPIO1_D */
-#define GPIO1_D0 0x1d00
-#define LCDC0_HSYNC_GPIO1D 0x1d01
-
-#define GPIO1_D1 0x1d10
-#define LCDC0_VSYNC_GPIO1D 0x1d11
-
-#define GPIO1_D2 0x1d20
-#define LCDC0_DEN_GPIO1D 0x1d21
-
-#define GPIO1_D3 0x1d30
-#define LCDC0_DCLK_GPIO1D 0x1d31
-
-
-/* GPIO2_A */
-#define GPIO2_A0 0x2a00
-#define CIF_DATA2 0x2a01
-#define HOST_DIN0 0x2a02
-#define HSADC_DATA0 0x2a03
-
-#define GPIO2_A1 0x2a10
-#define CIF_DATA3 0x2a11
-#define HOST_DIN1 0x2a12
-#define HSADC_DATA1 0x2a13
-
-#define GPIO2_A2 0x2a20
-#define CIF_DATA4 0x2a21
-#define HOST_DIN2 0x2a22
-#define HSADC_DATA2 0x2a23
-
-#define GPIO2_A3 0x2a30
-#define CIF_DATA5 0x2a31
-#define HOST_DIN3 0x2a32
-#define HSADC_DATA3 0x2a33
-
-#define GPIO2_A4 0x2a40
-#define CIF_DATA6 0x2a41
-#define HOST_CKINP 0x2a42
-#define HSADC_DATA4 0x2a43
-
-#define GPIO2_A5 0x2a50
-#define CIF_DATA7 0x2a51
-#define HOST_CKINN 0x2a52
-#define HSADC_DATA5 0x2a53
-
-#define GPIO2_A6 0x2a60
-#define CIF_DATA8 0x2a61
-#define HOST_DIN4 0x2a62
-#define HSADC_DATA6 0x2a63
-
-#define GPIO2_A7 0x2a70
-#define CIF_DATA9 0x2a71
-#define HOST_DIN5 0x2a72
-#define HSADC_DATA7 0x2a73
-
-
-/* GPIO2_B */
-#define GPIO2_B0 0x2b00
-#define CIF_VSYNC 0x2b01
-#define HOST_DIN6 0x2b02
-#define HSADCTS_SYNC 0x2b03
-
-#define GPIO2_B1 0x2b10
-#define CIF_HREF 0x2b11
-#define HOST_DIN7 0x2b12
-#define HSADCTS_VALID 0x2b13
-
-#define GPIO2_B2 0x2b20
-#define CIF_CLKIN 0x2b21
-#define HOST_WKACK 0x2b22
-#define GPS_CLK 0x2b23
-
-#define GPIO2_B3 0x2b30
-#define CIF_CLKOUT 0x2b31
-#define HOST_WKREQ 0x2b32
-#define HSADCTS_FAIL 0x2b33
-
-#define GPIO2_B4 0x2b40
-#define CIF_DATA0 0x2b41
-
-#define GPIO2_B5 0x2b50
-#define CIF_DATA1 0x2b51
-
-#define GPIO2_B6 0x2b60
-#define CIF_DATA10 0x2b61
-
-#define GPIO2_B7 0x2b70
-#define CIF_DATA11 0x2b71
-
-
-/* GPIO2_C */
-#define GPIO2_C0 0x2c00
-#define I2C3CAM_SCL 0x2c01
-
-#define GPIO2_C1 0x2c10
-#define I2C3CAM_SDA 0x2c11
-
-
-/* GPIO2_D */
-/* GPIO3_A */
-#define GPIO3_A0 0x3a00
-#define FLASH0_DATA0 0x3a01
-#define EMMC_DATA0 0x3a02
-
-#define GPIO3_A1 0x3a10
-#define FLASH0_DATA1 0x3a11
-#define EMMC_DATA1 0x3a12
-
-#define GPIO3_A2 0x3a20
-#define FLASH0_DATA2 0x3a21
-#define EMMC_DATA2 0x3a22
-
-#define GPIO3_A3 0x3a30
-#define FLASH0_DATA3 0x3a31
-#define EMMC_DATA3 0x3a32
-
-#define GPIO3_A4 0x3a40
-#define FLASH0_DATA4 0x3a41
-#define EMMC_DATA4 0x3a42
-
-#define GPIO3_A5 0x3a50
-#define FLASH0_DATA5 0x3a51
-#define EMMC_DATA5 0x3a52
-
-#define GPIO3_A6 0x3a60
-#define FLASH0_DATA6 0x3a61
-#define EMMC_DATA6 0x3a62
-
-#define GPIO3_A7 0x3a70
-#define FLASH0_DATA7 0x3a71
-#define EMMC_DATA7 0x3a72
-
-
-/* GPIO3_B */
-#define GPIO3_B0 0x3b00
-#define FLASH0_RDY 0x3b01
-
-#define GPIO3_B1 0x3b10
-#define FLASH0_WP 0x3b11
-#define EMMC_PWREN 0x3b12
-
-#define GPIO3_B2 0x3b20
-#define FLASH0_RDN 0x3b21
-
-#define GPIO3_B3 0x3b30
-#define FLASH0_ALE 0x3b31
-
-#define GPIO3_B4 0x3b40
-#define FLASH0_CLE 0x3b41
-
-#define GPIO3_B5 0x3b50
-#define FLASH0_WRN 0x3b51
-
-#define GPIO3_B6 0x3b60
-#define FLASH0_CSN0 0x3b61
-
-#define GPIO3_B7 0x3b70
-#define FLASH0_CSN1 0x3b71
-
-
-/* GPIO3_C */
-#define GPIO3_C0 0x3c00
-#define FLASH0_CSN2 0x3c01
-#define EMMC_CMD 0x3c02
-
-#define GPIO3_C1 0x3c10
-#define FLASH0_CSN3 0x3c11
-#define EMMC_RSTNOUT 0x3c12
-
-#define GPIO3_C2 0x3c20
-#define FLASH0_DQS 0x3c21
-#define EMMC_CLKOUT 0x3c22
-
-
-/* GPIO3_D */
-#define GPIO3_D0 0x3d00
-#define FLASH1_DATA0 0x3d01
-#define HOST_DOUT0 0x3d02
-#define MAC_TXD2 0x3d03
-#define SDIO1_DATA0 0x3d04
-
-#define GPIO3_D1 0x3d10
-#define FLASH1_DATA1 0x3d11
-#define HOST_DOUT1 0x3d12
-#define MAC_TXD3 0x3d13
-#define SDIO1_DATA1 0x3d14
-
-#define GPIO3_D2 0x3d20
-#define FLASH1_DATA2 0x3d21
-#define HOST_DOUT2 0x3d22
-#define MAC_RXD2 0x3d23
-#define SDIO1_DATA2 0x3d24
-
-#define GPIO3_D3 0x3d30
-#define FLASH1_DATA3 0x3d31
-#define HOST_DOUT3 0x3d32
-#define MAC_RXD3 0x3d33
-#define SDIO1_DATA3 0x3d34
-
-#define GPIO3_D4 0x3d40
-#define FLASH1_DATA4 0x3d41
-#define HOST_DOUT4 0x3d42
-#define MAC_TXD0 0x3d43
-#define SDIO1_DETECTN 0x3d44
-
-#define GPIO3_D5 0x3d50
-#define FLASH1_DATA5 0x3d51
-#define HOST_DOUT5 0x3d52
-#define MAC_TXD1 0x3d53
-#define SDIO1_WRPRT 0x3d54
-
-#define GPIO3_D6 0x3d60
-#define FLASH1_DATA6 0x3d61
-#define HOST_DOUT6 0x3d62
-#define MAC_RXD0 0x3d63
-#define SDIO1_BKPWR 0x3d64
-
-#define GPIO3_D7 0x3d70
-#define FLASH1_DATA7 0x3d71
-#define HOST_DOUT7 0x3d72
-#define MAC_RXD1 0x3d73
-#define SDIO1_INTN 0x3d74
-
-
-/* GPIO4_A */
-#define GPIO4_A0 0x4a00
-#define FLASH1_RDY 0x4a01
-#define HOST_CKOUTP 0x4a02
-#define MAC_MDC 0x4a03
-
-#define GPIO4_A1 0x4a10
-#define FLASH1_WP 0x4a11
-#define HOST_CKOUTN 0x4a12
-#define MAC_RXDV 0x4a13
-#define FLASH0_CSN4 0x4a14
-
-#define GPIO4_A2 0x4a20
-#define FLASH1_RDN 0x4a21
-#define HOST_DOUT8 0x4a22
-#define MAC_RXER 0x4a23
-#define FLASH0_CSN5 0x4a24
-
-#define GPIO4_A3 0x4a30
-#define FLASH1_ALE 0x4a31
-#define HOST_DOUT9 0x4a32
-#define MAC_CLK 0x4a33
-#define FLASH0_CSN6 0x4a34
-
-#define GPIO4_A4 0x4a40
-#define FLASH1_CLE 0x4a41
-#define HOST_DOUT10 0x4a42
-#define MAC_TXEN 0x4a43
-#define FLASH0_CSN7 0x4a44
-
-#define GPIO4_A5 0x4a50
-#define FLASH1_WRN 0x4a51
-#define HOST_DOUT11 0x4a52
-#define MAC_MDIO 0x4a53
-
-#define GPIO4_A6 0x4a60
-#define FLASH1_CSN0 0x4a61
-#define HOST_DOUT12 0x4a62
-#define MAC_RXCLK 0x4a63
-#define SDIO1_CMD 0x4a64
-
-#define GPIO4_A7 0x4a70
-#define FLASH1_CSN1 0x4a71
-#define HOST_DOUT13 0x4a72
-#define MAC_CRS 0x4a73
-#define SDIO1_CLKOUT 0x4a74
-
-
-/* GPIO4_B */
-#define GPIO4_B0 0x4b00
-#define FLASH1_DQS 0x4b01
-#define HOST_DOUT14 0x4b02
-#define MAC_COL 0x4b03
-#define FLASH1_CSN3 0x4b04
-
-#define GPIO4_B1 0x4b10
-#define FLASH1_CSN2 0x4b11
-#define HOST_DOUT15 0x4b12
-#define MAC_TXCLK 0x4b13
-#define SDIO1_PWREN 0x4b14
-
-
-/* GPIO4_C */
-#define GPIO4_C0 0x4c00
-#define UART0BT_SIN 0x4c01
-
-#define GPIO4_C1 0x4c10
-#define UART0BT_SOUT 0x4c11
-
-#define GPIO4_C2 0x4c20
-#define UART0BT_CTSN 0x4c21
-
-#define GPIO4_C3 0x4c30
-#define UART0BT_RTSN 0x4c31
-
-#define GPIO4_C4 0x4c40
-#define SDIO0_DATA0 0x4c41
-
-#define GPIO4_C5 0x4c50
-#define SDIO0_DATA1 0x4c51
-
-#define GPIO4_C6 0x4c60
-#define SDIO0_DATA2 0x4c61
-
-#define GPIO4_C7 0x4c70
-#define SDIO0_DATA3 0x4c71
-
-
-/* GPIO4_D */
-#define GPIO4_D0 0x4d00
-#define SDIO0_CMD 0x4d01
-
-#define GPIO4_D1 0x4d10
-#define SDIO0_CLKOUT 0x4d11
-
-#define GPIO4_D2 0x4d20
-#define SDIO0_DETECTN 0x4d21
-
-#define GPIO4_D3 0x4d30
-#define SDIO0_WRPRT 0x4d31
-
-#define GPIO4_D4 0x4d40
-#define SDIO0_PWREN 0x4d41
-
-#define GPIO4_D5 0x4d50
-#define SDIO0_BKPWR 0x4d51
-
-#define GPIO4_D6 0x4d60
-#define SDIO0_INTN 0x4d61
-
-
-/* GPIO5_A */
-/* GPIO5_B */
-#define GPIO5_B0 0x5b00
-#define UART1BB_SIN 0x5b01
-#define TS0_DATA0 0x5b02
-
-#define GPIO5_B1 0x5b10
-#define UART1BB_SOUT 0x5b11
-#define TS0_DATA1 0x5b12
-
-#define GPIO5_B2 0x5b20
-#define UART1BB_CTSN 0x5b21
-#define TS0_DATA2 0x5b22
-
-#define GPIO5_B3 0x5b30
-#define UART1BB_RTSN 0x5b31
-#define TS0_DATA3 0x5b32
-
-#define GPIO5_B4 0x5b40
-#define SPI0_CLK 0x5b41
-#define TS0_DATA4 0x5b42
-#define UART4EXP_CTSN 0x5b43
-
-#define GPIO5_B5 0x5b50
-#define SPI0_CS0 0x5b51
-#define TS0_DATA5 0x5b52
-#define UART4EXP_RTSN 0x5b53
-
-#define GPIO5_B6 0x5b60
-#define SPI0_TXD 0x5b61
-#define TS0_DATA6 0x5b62
-#define UART4EXP_SOUT 0x5b63
-
-#define GPIO5_B7 0x5b70
-#define SPI0_RXD 0x5b71
-#define TS0_DATA7 0x5b72
-#define UART4EXP_SIN 0x5b73
-
-
-/* GPIO5_C */
-#define GPIO5_C0 0x5c00
-#define SPI0_CS1 0x5c01
-#define TS0_SYNC 0x5c02
-
-#define GPIO5_C1 0x5c10
-#define TS0_VALID 0x5c11
-
-#define GPIO5_C2 0x5c20
-#define TS0_CLK 0x5c21
-
-#define GPIO5_C3 0x5c30
-#define TS0_ERR 0x5c31
-
-
-/* GPIO5_D */
-/* GPIO6_A */
-#define GPIO6_A0 0x6a00
-#define I2S_SCLK 0x6a01
-
-#define GPIO6_A1 0x6a10
-#define I2S_LRCKRX 0x6a11
-
-#define GPIO6_A2 0x6a20
-#define I2S_LRCKTX 0x6a21
-
-#define GPIO6_A3 0x6a30
-#define I2S_SDI 0x6a31
-
-#define GPIO6_A4 0x6a40
-#define I2S_SDO0 0x6a41
-
-#define GPIO6_A5 0x6a50
-#define I2S_SDO1 0x6a51
-
-#define GPIO6_A6 0x6a60
-#define I2S_SDO2 0x6a61
-
-#define GPIO6_A7 0x6a70
-#define I2S_SDO3 0x6a71
-
-
-/* GPIO6_B */
-#define GPIO6_B0 0x6b00
-#define I2S_CLK 0x6b01
-
-#define GPIO6_B1 0x6b10
-#define I2C2AUDIO_SDA 0x6b11
-
-#define GPIO6_B2 0x6b20
-#define I2C2AUDIO_SCL 0x6b21
-
-#define GPIO6_B3 0x6b30
-#define SPDIF_TX 0x6b31
-
-
-/* GPIO6_C */
-#define GPIO6_C0 0x6c00
-#define SDMMC0_DATA0 0x6c01
-#define JTAG_TMS 0x6c02
-
-#define GPIO6_C1 0x6c10
-#define SDMMC0_DATA1 0x6c11
-#define JTAG_TRSTN 0x6c12
-
-#define GPIO6_C2 0x6c20
-#define SDMMC0_DATA2 0x6c21
-#define JTAG_TDI 0x6c22
-
-#define GPIO6_C3 0x6c30
-#define SDMMC0_DATA3 0x6c31
-#define JTAG_TCK 0x6c32
-
-#define GPIO6_C4 0x6c40
-#define SDMMC0_CLKOUT 0x6c41
-#define JTAG_TDO 0x6c42
-
-#define GPIO6_C5 0x6c50
-#define SDMMC0_CMD 0x6c51
-
-#define GPIO6_C6 0x6c60
-#define SDMMC0_DECTN 0x6c61
-
-
-/* GPIO6_D */
-/* GPIO7_A */
-#define GPIO7_A0 0x7a00
-#define PWM0 0x7a01
-#define VOP0_PWM 0x7a02
-#define VOP1_PWM 0x7a03
-
-#define GPIO7_A1 0x7a10
-#define PWM1 0x7a11
-
-#define GPIO7_A7 0x7a70
-#define UART3GPS_SIN 0x7a71
-#define GPS_MAG 0x7a72
-#define HSADCT1_DATA0 0x7a73
-
-
-/* GPIO7_B */
-#define GPIO7_B0 0x7b00
-#define UART3GPS_SOUT 0x7b01
-#define GPS_SIG 0x7b02
-#define HSADCT1_DATA1 0x7b03
-
-#define GPIO7_B1 0x7b10
-#define UART3GPS_CTSN 0x7b11
-#define GPS_RFCLK 0x7b12
-#define GPST1_CLK 0x7b13
-
-#define GPIO7_B2 0x7b20
-#define UART3GPS_RTSN 0x7b21
-#define USB_DRVVBUS0 0x7b22
-
-#define GPIO7_B3 0x7b30
-#define USB_DRVVBUS1 0x7b31
-#define EDP_HOTPLUG 0x7b32
-
-#define GPIO7_B4 0x7b40
-#define ISP_SHUTTEREN 0x7b41
-#define SPI1_CLK 0x7b42
-
-#define GPIO7_B5 0x7b50
-#define ISP_FLASHTRIGOUTSPI1_CS0 0x7b51
-#define SPI1_CS0 0x7b52
-
-#define GPIO7_B6 0x7b60
-#define ISP_PRELIGHTTRIGSPI1_RXD 0x7b61
-#define SPI1_RXD 0x7b62
-
-#define GPIO7_B7 0x7b70
-#define ISP_SHUTTERTRIG 0x7b71
-#define SPI1_TXD 0x7b72
-
-
-/* GPIO7_C */
-#define GPIO7_C0 0x7c00
-#define ISP_FLASHTRIGIN 0x7c01
-#define EDPHDMI_CECINOUTRESERVED 0x7c02
-
-#define GPIO7_C1 0x7c10
-#define I2C4TP_SDA 0x7c11
-
-#define GPIO7_C2 0x7c20
-#define I2C4TP_SCL 0x7c21
-
-#define GPIO7_C3 0x7c30
-#define I2C5HDMI_SDA 0x7c31
-#define EDPHDMII2C_SDA 0x7c32
-
-#define GPIO7_C4 0x7c40
-#define I2C5HDMI_SCL 0x7c41
-#define EDPHDMII2C_SCL 0x7c42
-
-#define GPIO7_C6 0x7c60
-#define UART2DBG_SIN 0x7c61
-#define UART2DBG_SIRIN 0x7c62
-#define PWM2 0x7c63
-
-#define GPIO7_C7 0x7c70
-#define UART2DBG_SOUT 0x7c71
-#define UART2DBG_SIROUT 0x7c72
-#define PWM3 0x7c73
-#define EDPHDMI_CECINOUT 0x7c74
-
-
-/* GPIO7_D */
-/* GPIO8_A */
-#define GPIO8_A0 0x8a00
-#define PS2_CLK 0x8a01
-#define SC_VCC18V 0x8a02
-
-#define GPIO8_A1 0x8a10
-#define PS2_DATA 0x8a11
-#define SC_VCC33V 0x8a12
-
-#define GPIO8_A2 0x8a20
-#define SC_DETECTT1 0x8a21
-
-#define GPIO8_A3 0x8a30
-#define SPI2_CS1 0x8a31
-#define SC_IOT1 0x8a32
-
-#define GPIO8_A4 0x8a40
-#define I2C1SENSOR_SDA 0x8a41
-#define SC_RST_GPIO8A 0x8a42
-
-#define GPIO8_A5 0x8a50
-#define I2C1SENSOR_SCL 0x8a51
-#define SC_CLK_GPIO8A 0x8a52
-
-#define GPIO8_A6 0x8a60
-#define SPI2_CLK 0x8a61
-#define SC_IO 0x8a62
-
-#define GPIO8_A7 0x8a70
-#define SPI2_CS0 0x8a71
-#define SC_DETECT 0x8a72
-
-
-/* GPIO8_B */
-#define GPIO8_B0 0x8b00
-#define SPI2_RXD 0x8b01
-#define SC_RST_GPIO8B 0x8b02
-
-#define GPIO8_B1 0x8b10
-#define SPI2_TXD 0x8b11
-#define SC_CLK_GPIO8B 0x8b12
-
-
-/* GPIO8_C */
-/* GPIO8_D */
-
-
-#endif

commit c91d02910993823f38fa956285262aaadb6c58a7
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Tue Aug 10 10:11:40 2021 +0800

    dt-bindings: clock: Remove unused rockchip files
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: I9a528f75413a7376407afff4e0737747d6f66a87

diff --git a/include/dt-bindings/clock/rockchip,rk3036.h b/include/dt-bindings/clock/rockchip,rk3036.h
deleted file mode 100644
index 019550c7d0c1..000000000000
--- a/include/dt-bindings/clock/rockchip,rk3036.h
+++ /dev/null
@@ -1,155 +0,0 @@
-#ifndef _DT_BINDINGS_CLOCK_ROCKCHIP_RK3036_H
-#define _DT_BINDINGS_CLOCK_ROCKCHIP_RK3036_H
-
-#include "rockchip.h"
-
-/* pll id */
-#define RK3036_APLL_ID		0
-#define RK3036_DPLL_ID		1
-#define RK3036_GPLL_ID		2
-#define RK3036_END_PLL_ID	3
-
-/* reset id */
-#define RK3036_RST_CORE0		0
-#define RK3036_RST_CORE1		1
-#define RK3036_RST_0RES2		2
-#define RK3036_RST_0RES3		3
-#define RK3036_RST_CORE0_DBG		4
-#define RK3036_RST_CORE1_DBG		5
-#define RK3036_RST_0RES6		6
-#define RK3036_RST_0RES7		7
-#define RK3036_RST_CORE0_POR		8
-#define RK3036_RST_CORE1_POR		9
-#define RK3036_RST_0RES10		10
-#define RK3036_RST_0RES11		11
-#define RK3036_RST_L2C			12
-#define RK3036_RST_TOPDBG		13
-#define RK3036_RST_STRC_SYS_A		14
-#define RK3036_RST_PD_CORE_NIU		15
-
-#define RK3036_RST_TIMER2		16
-#define RK3036_RST_CPUSYS_H		17
-#define RK3036_RST_1RES2		18
-#define RK3036_RST_AHB2APB_H		19
-#define RK3036_RST_TIMER3		20
-#define RK3036_RST_INTMEM		21
-#define RK3036_RST_ROM			22
-#define RK3036_RST_PERI_NIU		23
-#define RK3036_RST_I2S			24
-#define RK3036_RST_DDR_PLL		25
-#define RK3036_RST_GPU_DLL		26
-#define RK3036_RST_TIMER0		27
-#define RK3036_RST_TIMER1		28
-#define RK3036_RST_CORE_DLL		29
-#define RK3036_RST_EFUSE_P		30
-#define RK3036_RST_ACODEC_P		31
-
-#define RK3036_RST_GPIO0		32
-#define RK3036_RST_GPIO1		33
-#define RK3036_RST_GPIO2		34
-#define RK3036_RST_2RES3		35
-#define RK3036_RST_2RES4		36
-#define RK3036_RST_2RES5		37
-#define RK3036_RST_2RES6		38
-#define RK3036_RST_UART0		39
-#define RK3036_RST_UART1		40
-#define RK3036_RST_UART2		41
-#define RK3036_RST_2RES10		42
-#define RK3036_RST_I2C0			43
-#define RK3036_RST_I2C1			44
-#define RK3036_RST_I2C2			45
-#define RK3036_RST_2RES14		46
-#define RK3036_RST_SFC			47
-
-#define RK3036_RST_PWM0			48
-#define RK3036_RST_3RES1		49
-#define RK3036_RST_3RES2		50
-#define RK3036_RST_DAP			51
-#define RK3036_RST_DAP_SYS		52
-#define RK3036_RST_3RES5		53
-#define RK3036_RST_3RES6		54
-#define RK3036_RST_GRF			55
-#define RK3036_RST_3RES8		56
-#define RK3036_RST_PERIPHSYS_A		57
-#define RK3036_RST_PERIPHSYS_H		58
-#define RK3036_RST_PERIPHSYS_P		59
-#define RK3036_RST_3RES12		60
-#define RK3036_RST_CPU_PERI		61
-#define RK3036_RST_EMEM_PERI		62
-#define RK3036_RST_USB_PERI		63
-
-#define RK3036_RST_DMA2			64
-#define RK3036_RST_4RES1		65
-#define RK3036_RST_MAC			66
-#define RK3036_RST_4RES3		67
-#define RK3036_RST_NANDC		68
-#define RK3036_RST_USBOTG0		69
-#define RK3036_RST_4RES6		70
-#define RK3036_RST_OTGC0		71
-#define RK3036_RST_USBOTG1		72
-#define RK3036_RST_4RES9		73
-#define RK3036_RST_OTGC1		74
-#define RK3036_RST_4RES11		75
-#define RK3036_RST_4RES12		76
-#define RK3036_RST_4RES13		77
-#define RK3036_RST_4RES14		78
-#define RK3036_RST_DDRMSCH		79
-
-#define RK3036_RST_5RES0		80
-#define RK3036_RST_MMC0			81
-#define RK3036_RST_SDIO			82
-#define RK3036_RST_EMMC			83
-#define RK3036_RST_SPI0			84
-#define RK3036_RST_5RES5		85
-#define RK3036_RST_WDT			86
-#define RK3036_RST_5RES7		87
-#define RK3036_RST_DDRPHY		88
-#define RK3036_RST_DDRPHY_P		89
-#define RK3036_RST_DDRCTRL		90
-#define RK3036_RST_DDRCTRL_P		91
-#define RK3036_RST_5RES12		92
-#define RK3036_RST_5RES13		93
-#define RK3036_RST_5RES14		94
-#define RK3036_RST_5RES15		95
-
-#define RK3036_RST_HDMI_P		96
-#define RK3036_RST_6RES1		97
-#define RK3036_RST_6RES2		98
-#define RK3036_RST_VIO_BUS_H		99
-#define RK3036_RST_6RES4		100
-#define RK3036_RST_6RES5		101
-#define RK3036_RST_6RES6		102
-#define RK3036_RST_UTMI0		103
-#define RK3036_RST_UTMI1		104
-#define RK3036_RST_USBPOR		105
-#define RK3036_RST_6RES10		106
-#define RK3036_RST_6RES11		107
-#define RK3036_RST_6RES12		108
-#define RK3036_RST_6RES13		109
-#define RK3036_RST_6RES14		110
-#define RK3036_RST_6RES15		111
-
-#define RK3036_RST_VCODEC_A		112
-#define RK3036_RST_VCODEC_H		113
-#define RK3036_RST_VIO1_A		114
-#define RK3036_RST_HEVC			115
-#define RK3036_RST_VCODEC_NIU_A		116
-#define RK3036_RST_LCDC1_A		117
-#define RK3036_RST_LCDC1_H		118
-#define RK3036_RST_LCDC1_D		119
-#define RK3036_RST_GPU			120
-#define RK3036_RST_7RES9		121
-#define RK3036_RST_GPU_NIU_A		122
-#define RK3036_RST_7RES11		123
-#define RK3036_RST_7RES12		124
-#define RK3036_RST_7RES13		125
-#define RK3036_RST_7RES14		126
-#define RK3036_RST_7RES15		127
-
-#define RK3036_RST_8RES0		128
-#define RK3036_RST_8RES1		129
-#define RK3036_RST_8RES2		130
-#define RK3036_RST_DBG_P		131
-/* con8[15:4] is reserved */
-
-#endif /* _DT_BINDINGS_CLOCK_ROCKCHIP_RK3036_H */
diff --git a/include/dt-bindings/clock/rockchip,rk312x.h b/include/dt-bindings/clock/rockchip,rk312x.h
deleted file mode 100755
index 0af5abca3470..000000000000
--- a/include/dt-bindings/clock/rockchip,rk312x.h
+++ /dev/null
@@ -1,167 +0,0 @@
-#ifndef _DT_BINDINGS_CLOCK_ROCKCHIP_RK3128_H
-#define _DT_BINDINGS_CLOCK_ROCKCHIP_RK3128_H
-
-#include "rockchip.h"
-
-/* pll id */
-#define RK3128_APLL_ID		0
-#define RK3128_DPLL_ID		1
-#define RK3128_CPLL_ID		2
-#define RK3128_GPLL_ID		3
-#define RK3128_END_PLL_ID	4
-
-/* reset id */
-#define RK3128_RST_CORE0_PO		0
-#define RK3128_RST_CORE1_PO		1
-#define RK3128_RST_CORE2_PO		2
-#define RK3128_RST_CORE3_PO		3
-#define RK3128_RST_CORE0		4
-#define RK3128_RST_CORE1		5
-#define RK3128_RST_CORE2		6
-#define RK3128_RST_CORE3		7
-#define RK3128_RST_CORE0_DBG		8
-#define RK3128_RST_CORE1_DBG		9
-#define RK3128_RST_CORE2_DBG		10
-#define RK3128_RST_CORE3_DBG		11
-#define RK3128_RST_TOPDBG		12
-#define RK3128_RST_ACLK_CORE		13
-#define RK3128_RST_STRC_SYS_A		14
-#define RK3128_RST_L2C			15
-
-#define RK3128_RST_1RES0		16
-#define RK3128_RST_1RES1		17
-#define RK3128_RST_CPUSYS_H		18
-#define RK3128_RST_AHB2APB_H		19
-#define RK3128_RST_SPDIF		20
-#define RK3128_RST_INTMEM		21
-#define RK3128_RST_ROM			22
-#define RK3128_RST_PERI_NIU		23
-#define RK3128_RST_I2S_2CH			24
-#define RK3128_RST_I2S_8CH			25
-#define RK3128_RST_GPU_PVTM			26
-#define RK3128_RST_FUNC_PVTM			27
-#define RK3128_RST_1RES12		28
-#define RK3128_RST_CORE_PVTM		29
-#define RK3128_RST_EFUSE_P		30
-#define RK3128_RST_ACODEC_P		31
-
-#define RK3128_RST_GPIO0		32
-#define RK3128_RST_GPIO1		33
-#define RK3128_RST_GPIO2		34
-#define RK3128_RST_GPIO3		35
-#define RK3128_RST_MIPIPHY		36
-#define RK3128_RST_2RES5		37
-#define RK3128_RST_2RES6		38
-#define RK3128_RST_UART0		39
-#define RK3128_RST_UART1		40
-#define RK3128_RST_UART2		41
-#define RK3128_RST_2RES10		42
-#define RK3128_RST_I2C0			43
-#define RK3128_RST_I2C1			44
-#define RK3128_RST_I2C2			45
-#define RK3128_RST_I2C3			46
-#define RK3128_RST_SFC			47
-
-#define RK3128_RST_PWM0			48
-#define RK3128_RST_3RES1		49
-#define RK3128_RST_DAP_P			50
-#define RK3128_RST_DAP			51
-#define RK3128_RST_DAP_SYS		52
-#define RK3128_RST_CRYPTO		53
-#define RK3128_RST_3RES6		54
-#define RK3128_RST_GRF			55
-#define RK3128_RST_GMAC		56
-#define RK3128_RST_PERIPHSYS_A		57
-#define RK3128_RST_PERIPHSYS_H		58
-#define RK3128_RST_PERIPHSYS_P		59
-#define RK3128_RST_SMART_CARD		60
-#define RK3128_RST_CPU_PERI		61
-#define RK3128_RST_EMEM_PERI		62
-#define RK3128_RST_USB_PERI		63
-
-#define RK3128_RST_DMA2			64
-#define RK3128_RST_4RES1		65
-#define RK3128_RST_4RES2			66
-#define RK3128_RST_GPS		67
-#define RK3128_RST_NANDC		68
-#define RK3128_RST_USBOTG0		69
-#define RK3128_RST_4RES6		70
-#define RK3128_RST_OTGC0		71
-#define RK3128_RST_USBOTG1		72
-#define RK3128_RST_4RES9		73
-#define RK3128_RST_OTGC1		74
-#define RK3128_RST_4RES11		75
-#define RK3128_RST_4RES12		76
-#define RK3128_RST_4RES13		77
-#define RK3128_RST_4RES14		78
-#define RK3128_RST_DDRMSCH		79
-
-#define RK3128_RST_5RES0		80
-#define RK3128_RST_MMC0			81
-#define RK3128_RST_SDIO			82
-#define RK3128_RST_EMMC			83
-#define RK3128_RST_SPI0			84
-#define RK3128_RST_5RES5		85
-#define RK3128_RST_WDT			86
-#define RK3128_RST_SARADC		87
-#define RK3128_RST_DDRPHY		88
-#define RK3128_RST_DDRPHY_P		89
-#define RK3128_RST_DDRCTRL		90
-#define RK3128_RST_DDRCTRL_P		91
-#define RK3128_RST_TSP		92
-#define RK3128_RST_TSP_CLKIN0		93
-#define RK3128_RST_USBHOST0_EHCI		94
-#define RK3128_RST_5RES15		95
-
-#define RK3128_RST_HDMI_P		96
-#define RK3128_RST_VIO_ARBI_H		97
-#define RK3128_RST_VIO_A		98
-#define RK3128_RST_VIO_BUS_H		99
-#define RK3128_RST_LCDC0_A		100
-#define RK3128_RST_LCDC0_H		101
-#define RK3128_RST_LCDC0_D		102
-#define RK3128_RST_UTMI0		103
-#define RK3128_RST_UTMI1		104
-#define RK3128_RST_USBPOR		105
-#define RK3128_RST_IEP_A		106
-#define RK3128_RST_IEP_H		107
-#define RK3128_RST_RGA_A		108
-#define RK3128_RST_RGA_H		109
-#define RK3128_RST_CIF0		110
-#define RK3128_RST_PMU		111
-
-#define RK3128_RST_VCODEC_A		112
-#define RK3128_RST_VCODEC_H		113
-#define RK3128_RST_VIO1_A		114
-#define RK3128_RST_HEVC			115
-#define RK3128_RST_VCODEC_NIU_A		116
-#define RK3128_RST_PMU_NIU		117
-#define RK3128_RST_7RES6		118
-#define RK3128_RST_LCDC0_S		119
-#define RK3128_RST_GPU			120
-#define RK3128_RST_7RES9		121
-#define RK3128_RST_GPU_NIU_A		122
-#define RK3128_RST_EBC_A		123
-#define RK3128_RST_EBC_H		124
-#define RK3128_RST_7RES13		125
-#define RK3128_RST_7RES14		126
-#define RK3128_RST_7RES15		127
-
-#define RK3128_RST_CORE_DBG		128
-#define RK3128_RST_DBG_P		129
-#define RK3128_RST_TIMER0		130
-#define RK3128_RST_TIMER1		131
-#define RK3128_RST_TIMER2		132
-#define RK3128_RST_TIMER3		133
-#define RK3128_RST_TIMER4		134
-#define RK3128_RST_TIMER5		135
-#define RK3128_RST_VIO_H2P		136
-#define RK3128_RST_VIO_MIPI_DSI		137
-#define RK3128_RST_8RES10		138
-#define RK3128_RST_8RES11		139
-#define RK3128_RST_8RES12		140
-#define RK3128_RST_8RES13		141
-#define RK3128_RST_8RES14		142
-#define RK3128_RST_8RES15		143
-
-#endif /* _DT_BINDINGS_CLOCK_ROCKCHIP_RK3128_H */
diff --git a/include/dt-bindings/clock/rockchip,rk3188.h b/include/dt-bindings/clock/rockchip,rk3188.h
deleted file mode 100644
index b8c57e1cfed8..000000000000
--- a/include/dt-bindings/clock/rockchip,rk3188.h
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef _DT_BINDINGS_CLOCK_ROCKCHIP_RK3188_H
-#define _DT_BINDINGS_CLOCK_ROCKCHIP_RK3188_H
-
-#include "rockchip.h"
-
-/* pll id */
-#define RK3188_APLL_ID		0
-#define RK3188_DPLL_ID 		1
-#define RK3188_CPLL_ID 		2
-#define RK3188_GPLL_ID 		3
-#define RK3188_END_PLL_ID	4
-
-#endif /* _DT_BINDINGS_CLOCK_ROCKCHIP_RK3188_H */
diff --git a/include/dt-bindings/clock/rockchip,rk3228.h b/include/dt-bindings/clock/rockchip,rk3228.h
deleted file mode 100644
index b86e44536722..000000000000
--- a/include/dt-bindings/clock/rockchip,rk3228.h
+++ /dev/null
@@ -1,167 +0,0 @@
-#ifndef _DT_BINDINGS_CLOCK_ROCKCHIP_RK3228_H
-#define _DT_BINDINGS_CLOCK_ROCKCHIP_RK3228_H
-
-#include "rockchip.h"
-
-/* pll id */
-#define RK3228_APLL_ID			0
-#define RK3228_DPLL_ID			1
-#define RK3228_CPLL_ID			2
-#define RK3228_GPLL_ID			3
-#define RK3228_END_PLL_ID		4
-
-/* reset id */
-#define RK3228_RST_CORE0_PO		0
-#define RK3228_RST_CORE1_PO		1
-#define RK3228_RST_CORE2_PO		2
-#define RK3228_RST_CORE3_PO		3
-#define RK3228_RST_CORE0		4
-#define RK3228_RST_CORE1		5
-#define RK3228_RST_CORE2		6
-#define RK3228_RST_CORE3		7
-#define RK3228_RST_CORE0_DBG		8
-#define RK3228_RST_CORE1_DBG		9
-#define RK3228_RST_CORE2_DBG		10
-#define RK3228_RST_CORE3_DBG		11
-#define RK3228_RST_TOPDBG		12
-#define RK3228_RST_ACLK_CORE		13
-#define RK3228_RST_NOC_A		14
-#define RK3228_RST_L2C			15
-
-#define RK3228_RST_1RES0		16
-#define RK3228_RST_1RES1		17
-#define RK3228_RST_CPUSYS_H		18
-#define RK3228_RST_BUSSYS_H		19
-#define RK3228_RST_SPDIF		20
-#define RK3228_RST_INTMEM		21
-#define RK3228_RST_ROM			22
-#define RK3228_RST_OTG_ADP		23
-#define RK3228_RST_I2S0			24
-#define RK3228_RST_I2S1			25
-#define RK3228_RST_I2S2			26
-#define RK3228_RST_ACODEC_P		27
-#define RK3228_RST_DFIMON		28
-#define RK3228_RST_MSCH			29
-#define RK3228_RST_EFUSE_1024		30
-#define RK3228_RST_EFUSE_256		31
-
-#define RK3228_RST_GPIO0		32
-#define RK3228_RST_GPIO1		33
-#define RK3228_RST_GPIO2		34
-#define RK3228_RST_GPIO3		35
-#define RK3228_RST_PERIPH_NOC_A		36
-#define RK3228_RST_PERIPH_NOC_H		37
-#define RK3228_RST_PERIPH_NOC_P		38
-#define RK3228_RST_UART0		39
-#define RK3228_RST_UART1		40
-#define RK3228_RST_UART2		41
-#define RK3228_RST_PHYNOC		42
-#define RK3228_RST_I2C0			43
-#define RK3228_RST_I2C1			44
-#define RK3228_RST_I2C2			45
-#define RK3228_RST_I2C3			46
-#define RK3228_RST_2RES15		47
-
-#define RK3228_RST_PWM0			48
-#define RK3228_RST_A53_GIC		49
-#define RK3228_RST_3RES2		50
-#define RK3228_RST_DAP			51
-#define RK3228_RST_DAP_NOC		52
-#define RK3228_RST_CRYPTO		53
-#define RK3228_RST_SGRF			54
-#define RK3228_RST_GRF			55
-#define RK3228_RST_GMAC			56
-#define RK3228_RST_3RES9		57
-#define RK3228_RST_PERIPHSYS_A		58
-#define RK3228_RST_3RES11		59
-#define RK3228_RST_3RES12		60
-#define RK3228_RST_3RES13		61
-#define RK3228_RST_3RES14		62
-#define RK3228_RST_MACPHY		63
-
-#define RK3228_RST_4RES0		64
-#define RK3228_RST_4RES1		65
-#define RK3228_RST_4RES2		66
-#define RK3228_RST_4RES3		67
-#define RK3228_RST_NANDC		68
-#define RK3228_RST_USBOTG0		69
-#define RK3228_RST_OTGC0		70
-#define RK3228_RST_USBHOST0		71
-#define RK3228_RST_HOST_CTRL0		72
-#define RK3228_RST_USBHOST1		73
-#define RK3228_RST_HOST_CTRL1		74
-#define RK3228_RST_USBHOST2		75
-#define RK3228_RST_HOST_CTRL2		76
-#define RK3228_RST_USBPOR0		77
-#define RK3228_RST_USBPOR1		78
-#define RK3228_RST_DDRMSCH		79
-
-#define RK3228_RST_SMART_CARD		80
-#define RK3228_RST_SDMMC0		81
-#define RK3228_RST_SDIO			82
-#define RK3228_RST_EMMC			83
-#define RK3228_RST_SPI0			84
-#define RK3228_RST_TSP_H		85
-#define RK3228_RST_TSP			86
-#define RK3228_RST_TSADC		87
-#define RK3228_RST_DDRPHY		88
-#define RK3228_RST_DDRPHY_P		89
-#define RK3228_RST_DDRCTRL		90
-#define RK3228_RST_DDRCTRL_P		91
-#define RK3228_RST_HOST0_ECHI		92
-#define RK3228_RST_HOST1_ECHI		93
-#define RK3228_RST_HOST2_ECHI		94
-#define RK3228_RST_VOP			95
-
-#define RK3228_RST_HDMI_P		96
-#define RK3228_RST_VIO_ARBI_H		97
-#define RK3228_RST_IEP_NOC_A		98
-#define RK3228_RST_VIO_NOC_H		99
-#define RK3228_RST_VOP_A		100
-#define RK3228_RST_VOP_H		101
-#define RK3228_RST_VOP_D		102
-#define RK3228_RST_UTMI0		103
-#define RK3228_RST_UTMI1		104
-#define RK3228_RST_UTMI2		105
-#define RK3228_RST_UTMI3		106
-#define RK3228_RST_RGA			107
-#define RK3228_RST_RGA_NOC_A		108
-#define RK3228_RST_RGA_A		109
-#define RK3228_RST_RGA_H		110
-#define RK3228_RST_HDCP_A		111
-
-#define RK3228_RST_VPU_A		112
-#define RK3228_RST_VPU_H		113
-#define RK3228_RST_7RES2		114
-#define RK3228_RST_7RES3		115
-#define RK3228_RST_VPU_NOC_A		116
-#define RK3228_RST_VPU_NOC_H		117
-#define RK3228_RST_RKVDEC_A		118
-#define RK3228_RST_RKVDEC_NOC_A		119
-#define RK3228_RST_RKVDEC_H		120
-#define RK3228_RST_RKVDEC_NOC_H		121
-#define RK3228_RST_RKVDEC_CORE		122
-#define RK3228_RST_RKVDEC_CABAC		123
-#define RK3228_RST_IEP_A		124
-#define RK3228_RST_IEP_H		125
-#define RK3228_RST_GPU_A		126
-#define RK3228_RST_GPU_NOC_A		127
-
-#define RK3228_RST_CORE_DBG		128
-#define RK3228_RST_DBG_P		129
-#define RK3228_RST_TIMER0		130
-#define RK3228_RST_TIMER1		131
-#define RK3228_RST_TIMER2		132
-#define RK3228_RST_TIMER3		133
-#define RK3228_RST_TIMER4		134
-#define RK3228_RST_TIMER5		135
-#define RK3228_RST_VIO_H2P		136
-#define RK3228_RST_8RES9		137
-#define RK3228_RST_8RES10		138
-#define RK3228_RST_HDMIPHY		139
-#define RK3228_RST_VDAC			140
-#define RK3228_RST_TIMER_6CH		141
-#define RK3228_RST_8RES14		142
-#define RK3228_RST_8RES15		143
-
-#endif /* _DT_BINDINGS_CLOCK_ROCKCHIP_RK3228_H */
diff --git a/include/dt-bindings/clock/rockchip,rk3288.h b/include/dt-bindings/clock/rockchip,rk3288.h
deleted file mode 100644
index 1a2803c4f168..000000000000
--- a/include/dt-bindings/clock/rockchip,rk3288.h
+++ /dev/null
@@ -1,220 +0,0 @@
-#ifndef _DT_BINDINGS_CLOCK_ROCKCHIP_RK3288_H
-#define _DT_BINDINGS_CLOCK_ROCKCHIP_RK3288_H
-
-#include "rockchip.h"
-
-/* pll id */
-#define RK3288_APLL_ID		0
-#define RK3288_DPLL_ID 		1
-#define RK3288_CPLL_ID 		2
-#define RK3288_GPLL_ID 		3
-#define RK3288_NPLL_ID 		4
-#define RK3288_END_PLL_ID	5
-
-/* reset id */
-#define RK3288_SOFT_RST_CORE0			0
-#define RK3288_SOFT_RST_CORE1			1
-#define RK3288_SOFT_RST_CORE2			2
-#define RK3288_SOFT_RST_CORE3			3
-#define RK3288_SOFT_RST_CORE0_PO		4
-#define RK3288_SOFT_RST_CORE1_PO		5
-#define RK3288_SOFT_RST_CORE2_PO		6
-#define RK3288_SOFT_RST_CORE3_PO		7
-#define RK3288_SOFT_RST_PD_CORE_STR_SYS_A	8
-#define RK3288_SOFT_RST_PD_BUS_STR_SYS_A	9
-#define RK3288_SOFT_RST_L2C			10
-#define RK3288_SOFT_RST_TOPDBG			11
-#define RK3288_SOFT_RST_CORE0_DBG		12
-#define RK3288_SOFT_RST_CORE1_DBG		13
-#define RK3288_SOFT_RST_CORE2_DBG		14
-#define RK3288_SOFT_RST_CORE3_DBG		15
-
-#define RK3288_SOFT_RST_PD_BUS_AHB_ARBITOR	16
-#define RK3288_SOFT_RST_EFUSE_256BIT_P		17
-#define RK3288_SOFT_RST_DMA1			18
-#define RK3288_SOFT_RST_INTMEM			19
-#define RK3288_SOFT_RST_ROM			20
-#define RK3288_SOFT_RST_SPDIF_8CH		21
-#define RK3288_SOFT_RST_TIMER_P			22
-#define RK3288_SOFT_RST_I2S			23
-#define RK3288_SOFT_RST_SPDIF			24
-#define RK3288_SOFT_RST_TIMER0			25
-#define RK3288_SOFT_RST_TIMER1			26
-#define RK3288_SOFT_RST_TIMER2			27
-#define RK3288_SOFT_RST_TIMER3			28
-#define RK3288_SOFT_RST_TIMER4			29
-#define RK3288_SOFT_RST_TIMER5			30
-#define RK3288_SOFT_RST_EFUSE_P			31
-
-#define RK3288_SOFT_RST_GPIO0			32
-#define RK3288_SOFT_RST_GPIO1			33
-#define RK3288_SOFT_RST_GPIO2			34
-#define RK3288_SOFT_RST_GPIO3			35
-#define RK3288_SOFT_RST_GPIO4			36
-#define RK3288_SOFT_RST_GPIO5			37
-#define RK3288_SOFT_RST_GPIO6			38
-#define RK3288_SOFT_RST_GPIO7			39
-#define RK3288_SOFT_RST_GPIO8			40
-#define RK3288_SOFT_RST_2RES9			41
-#define RK3288_SOFT_RST_I2C0			42
-#define RK3288_SOFT_RST_I2C1			43
-#define RK3288_SOFT_RST_I2C2			44
-#define RK3288_SOFT_RST_I2C3			45
-#define RK3288_SOFT_RST_I2C4			46
-#define RK3288_SOFT_RST_I2C5			47
-
-#define RK3288_SOFT_RST_DW_PWM			48
-#define RK3288_SOFT_RST_MMC_PERI		49
-#define RK3288_SOFT_RST_PERIPH_MMU		50
-#define RK3288_SOFT_RST_DAP			51
-#define RK3288_SOFT_RST_DAP_SYS			52
-#define RK3288_SOFT_RST_TPIU_AT			53
-#define RK3288_SOFT_RST_PMU_P			54
-#define RK3288_SOFT_RST_GRF			55
-#define RK3288_SOFT_RST_PMU			56
-#define RK3288_SOFT_RST_PERIPHSYS_A		57
-#define RK3288_SOFT_RST_PERIPHSYS_H		58
-#define RK3288_SOFT_RST_PERIPHSYS_P		59
-#define RK3288_SOFT_RST_PERIPH_NIU		60
-#define RK3288_SOFT_RST_PD_PERI_AHB_ARBITOR	61
-#define RK3288_SOFT_RST_EMEM_PERI		62
-#define RK3288_SOFT_RST_USB_PERI		63
-
-#define RK3288_SOFT_RST_DMA2			64
-#define RK3288_SOFT_RST_4RES1			65
-#define RK3288_SOFT_RST_MAC			66
-#define RK3288_SOFT_RST_GPS			67
-#define RK3288_SOFT_RST_4RES4			68
-#define RK3288_SOFT_RST_RK_PWM			69
-#define RK3288_SOFT_RST_4RES6			70
-#define RK3288_SOFT_RST_CCP			71
-#define RK3288_SOFT_RST_USB_HOST0		72
-#define RK3288_SOFT_RST_EHCI1			73
-#define RK3288_SOFT_RST_EHCI1_AUX		74
-#define RK3288_SOFT_RST_EHCI1PHY		75
-#define RK3288_SOFT_RST_HSADC			76
-#define RK3288_SOFT_RST_NANDC0			77
-#define RK3288_SOFT_RST_NANDC1			78
-#define RK3288_SOFT_RST_4RES15			79
-
-#define RK3288_SOFT_RST_TZPC			80
-#define RK3288_SOFT_RST_5RES1			81
-#define RK3288_SOFT_RST_5RES2			82
-#define RK3288_SOFT_RST_SPI0			83
-#define RK3288_SOFT_RST_SPI1			84
-#define RK3288_SOFT_RST_SPI2			85
-#define RK3288_SOFT_RST_5RES6			86
-#define RK3288_SOFT_RST_SARADC			87
-#define RK3288_SOFT_RST_PD_ALIVE_NIU_P		88
-#define RK3288_SOFT_RST_PD_PMU_INTMEM_P		89
-#define RK3288_SOFT_RST_PD_PMU_NIU_P		90
-#define RK3288_SOFT_RST_SECURITY_GRF_P		91
-#define RK3288_SOFT_RST_5RES12			92
-#define RK3288_SOFT_RST_5RES13			93
-#define RK3288_SOFT_RST_5RES14			94
-#define RK3288_SOFT_RST_5RES15			95
-
-#define RK3288_SOFT_RST_VIO_ARBI_H		96
-#define RK3288_SOFT_RST_RGA_NIU_A		97
-#define RK3288_SOFT_RST_VIO0_NIU_A		98
-#define RK3288_SOFT_RST_VIO_NIU_H		99
-#define RK3288_SOFT_RST_LCDC0_A			100
-#define RK3288_SOFT_RST_LCDC0_H			101
-#define RK3288_SOFT_RST_LCDC0_D			102
-#define RK3288_SOFT_RST_VIO1_NIU_A		103
-#define RK3288_SOFT_RST_VIP			104
-#define RK3288_SOFT_RST_RGA_CORE		105
-#define RK3288_SOFT_RST_IEP_A			106
-#define RK3288_SOFT_RST_IEP_H			107
-#define RK3288_SOFT_RST_RGA_A			108
-#define RK3288_SOFT_RST_RGA_H			109
-#define RK3288_SOFT_RST_ISP			110
-#define RK3288_SOFT_RST_EDP			111
-
-#define RK3288_SOFT_RST_VCODEC_A		112
-#define RK3288_SOFT_RST_VCODEC_H		113
-#define RK3288_SOFT_RST_VIO_H2P_H		114
-#define RK3288_SOFT_RST_MIPIDSI0_P		115
-#define RK3288_SOFT_RST_MIPIDSI1_P		116
-#define RK3288_SOFT_RST_MIPICSI_P		117
-#define RK3288_SOFT_RST_LVDS_PHY_P		118
-#define RK3288_SOFT_RST_LVDS_CON		119
-#define RK3288_SOFT_RST_GPU			120
-#define RK3288_SOFT_RST_HDMI			121
-#define RK3288_SOFT_RST_7RES10			122
-#define RK3288_SOFT_RST_7RES11			123
-#define RK3288_SOFT_RST_CORE_PVTM		124
-#define RK3288_SOFT_RST_GPU_PVTM		125
-#define RK3288_SOFT_RST_7RES14			126
-#define RK3288_SOFT_RST_7RES15			127
-
-#define RK3288_SOFT_RST_MMC0			128
-#define RK3288_SOFT_RST_SDIO0			129
-#define RK3288_SOFT_RST_SDIO1			130
-#define RK3288_SOFT_RST_EMMC			131
-#define RK3288_SOFT_RST_USBOTG_H		132
-#define RK3288_SOFT_RST_USBOTGPHY		133
-#define RK3288_SOFT_RST_USBOTGC			134
-#define RK3288_SOFT_RST_USBHOST0_H		135
-#define RK3288_SOFT_RST_USBHOST0PHY		136
-#define RK3288_SOFT_RST_USBHOST0C		137
-#define RK3288_SOFT_RST_USBHOST1_H		138
-#define RK3288_SOFT_RST_USBHOST1PHY		139
-#define RK3288_SOFT_RST_USBHOST1C		140
-#define RK3288_SOFT_RST_USB_ADP			141
-#define RK3288_SOFT_RST_ACC_EFUSE		142
-#define RK3288_SOFT_RST_8RES15			143
-
-#define RK3288_SOFT_RST_CORESIGHT		144
-#define RK3288_SOFT_RST_PD_CORE_AHB_NOC		145
-#define RK3288_SOFT_RST_PD_CORE_APB_NOC		146
-#define RK3288_SOFT_RST_PD_CORE_MP_AXI		147
-#define RK3288_SOFT_RST_GIC			148
-#define RK3288_SOFT_RST_LCDCPWM0		149
-#define RK3288_SOFT_RST_LCDCPWM1		150
-#define RK3288_SOFT_RST_VIO0_H2P_BRG		151
-#define RK3288_SOFT_RST_VIO1_H2P_BRG		152
-#define RK3288_SOFT_RST_RGA_H2P_BRG		153
-#define RK3288_SOFT_RST_HEVC			154
-#define RK3288_SOFT_RST_9RES11			155
-#define RK3288_SOFT_RST_9RES12			156
-#define RK3288_SOFT_RST_9RES13			157
-#define RK3288_SOFT_RST_9RES14			158
-#define RK3288_SOFT_RST_TSADC_P			159
-
-#define RK3288_SOFT_RST_DDRPHY0			160
-#define RK3288_SOFT_RST_DDRPHY0_P		161
-#define RK3288_SOFT_RST_DDRCTRL0		162
-#define RK3288_SOFT_RST_DDRCTRL0_P		163
-#define RK3288_SOFT_RST_DDRPHY0_CTL		164
-#define RK3288_SOFT_RST_DDRPHY1			165
-#define RK3288_SOFT_RST_DDRPHY1_P		166
-#define RK3288_SOFT_RST_DDRCTRL1		167
-#define RK3288_SOFT_RST_DDRCTRL1_P		168
-#define RK3288_SOFT_RST_DDRPHY1_CTL		169
-#define RK3288_SOFT_RST_DDRMSCH0		170
-#define RK3288_SOFT_RST_DDRMSCH1		171
-#define RK3288_SOFT_RST_10RES12			172
-#define RK3288_SOFT_RST_10RES13			173
-#define RK3288_SOFT_RST_CRYPTO			174
-#define RK3288_SOFT_RST_C2C_HOST		175
-
-#define RK3288_SOFT_RST_LCDC1_A			176
-#define RK3288_SOFT_RST_LCDC1_H			177
-#define RK3288_SOFT_RST_LCDC1_D			178
-#define RK3288_SOFT_RST_UART0			179
-#define RK3288_SOFT_RST_UART1			180
-#define RK3288_SOFT_RST_UART2			181
-#define RK3288_SOFT_RST_UART3			182
-#define RK3288_SOFT_RST_UART4			183
-#define RK3288_SOFT_RST_11RES8			184
-#define RK3288_SOFT_RST_11RES9			185
-#define RK3288_SOFT_RST_SIMC			186
-#define RK3288_SOFT_RST_PS2C			187
-#define RK3288_SOFT_RST_TSP			188
-#define RK3288_SOFT_RST_TSP_CLKIN0		189
-#define RK3288_SOFT_RST_TSP_CLKIN1		190
-#define RK3288_SOFT_RST_TSP_27M			191
-
-
-#endif /* _DT_BINDINGS_CLOCK_ROCKCHIP_RK3288_H */
diff --git a/include/dt-bindings/clock/rockchip,rk3368.h b/include/dt-bindings/clock/rockchip,rk3368.h
deleted file mode 100644
index 76630794b4d9..000000000000
--- a/include/dt-bindings/clock/rockchip,rk3368.h
+++ /dev/null
@@ -1,263 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef _DT_BINDINGS_CLOCK_ROCKCHIP_RK3368_H
-#define _DT_BINDINGS_CLOCK_ROCKCHIP_RK3368_H
-
-#include "rockchip.h"
-
-/* reset id */
-#define RK3368_SRST_CORE_B_0_SC         0
-#define RK3368_SRST_CORE_B_1            1
-#define RK3368_SRST_CORE_B_2            2
-#define RK3368_SRST_CORE_B_3            3
-#define RK3368_SRST_CORE_B_PO0_SC       4
-#define RK3368_SRST_CORE_B_PO1          5
-#define RK3368_SRST_CORE_B_PO2          6
-#define RK3368_SRST_CORE_B_PO3          7
-#define RK3368_SRST_L2_B_SC             8
-#define RK3368_SRST_ADB_B_SC            9
-#define RK3368_SRST_PD_CORE_B_NIU       10
-#define RK3368_SRST_STRC_SYS_A_SC       11
-#define RK3368_SRST_0RES12              12
-#define RK3368_SRST_0RES13              13
-#define RK3368_SRST_SOCDBG_B            14
-#define RK3368_SRST_CORE_B_DBG          15
-
-#define RK3368_SRST_1RES0               16
-#define RK3368_SRST_1RES1               17
-#define RK3368_SRST_DMA1                18
-#define RK3368_SRST_INTMEM              19
-#define RK3368_SRST_ROM                 20
-#define RK3368_SRST_SPDIF_8CH           21
-#define RK3368_SRST_1RES6               22
-#define RK3368_SRST_I2S                 23
-#define RK3368_SRST_MAILBOX             24
-#define RK3368_SRST_I2S_2CH             25
-#define RK3368_SRST_EFUSE_256_P         26
-#define RK3368_SRST_1RES11              27
-#define RK3368_SRST_MCU_SYS             28
-#define RK3368_SRST_MCU_PO              29
-#define RK3368_SRST_MCU_NOC_H           30
-#define RK3368_SRST_EFUSE_P             31
-
-#define RK3368_SRST_GPIO0               32
-#define RK3368_SRST_GPIO1               33
-#define RK3368_SRST_GPIO2               34
-#define RK3368_SRST_GPIO3               35
-#define RK3368_SRST_GPIO4               36
-#define RK3368_SRST_2RES5               37
-#define RK3368_SRST_2RES6               38
-#define RK3368_SRST_2RES7               39
-#define RK3368_SRST_2RES8               40
-#define RK3368_SRST_PMUGRF_P            41
-#define RK3368_SRST_I2C0                42
-#define RK3368_SRST_I2C1                43
-#define RK3368_SRST_I2C2                44
-#define RK3368_SRST_I2C3                45
-#define RK3368_SRST_I2C4                46
-#define RK3368_SRST_I2C5                47
-
-#define RK3368_SRST_DW_PWM              48
-#define RK3368_SRST_MMC_PERI            49
-#define RK3368_SRST_PERIPH_MMU          50
-#define RK3368_SRST_3RES3               51
-#define RK3368_SRST_3RES4               52
-#define RK3368_SRST_3RES5               53
-#define RK3368_SRST_3RES6               54
-#define RK3368_SRST_GRF                 55
-#define RK3368_SRST_PMU                 56
-#define RK3368_SRST_PERIPH_SYS_A        57
-#define RK3368_SRST_PERIPH_SYS_H        58
-#define RK3368_SRST_PERIPH_SYS_P        59
-#define RK3368_SRST_PERIPH_NIU          60
-#define RK3368_SRST_PD_PERI_AHB_ARBITOR 61
-#define RK3368_SRST_EMEM_PERI           62
-#define RK3368_SRST_USB_PERI            63
-
-#define RK3368_SRST_DMA2                64
-#define RK3368_SRST_4RES1               65
-#define RK3368_SRST_MAC                 66
-#define RK3368_SRST_GPS                 67
-#define RK3368_SRST_4RES4               68
-#define RK3368_SRST_RK_PWM              69
-#define RK3368_SRST_4RES6               70
-#define RK3368_SRST_4RES7               71
-#define RK3368_SRST_HOST0_H             72
-#define RK3368_SRST_EHCI1                73
-#define RK3368_SRST_EHCI1_AUX            74
-#define RK3368_SRST_EHCI1PHY             75
-#define RK3368_SRST_HSADC_H             76
-#define RK3368_SRST_NANDC0              77
-#define RK3368_SRST_4RES14              78
-#define RK3368_SRST_SFC                 79
-
-#define RK3368_SRST_5RES0               80
-#define RK3368_SRST_5RES1               81
-#define RK3368_SRST_5RES2               82
-#define RK3368_SRST_SPI0                83
-#define RK3368_SRST_SPI1                84
-#define RK3368_SRST_SPI2                85
-#define RK3368_SRST_5RES6               86
-#define RK3368_SRST_SARADC              87
-#define RK3368_SRST_PD_ALIVE_NIU_P      88
-#define RK3368_SRST_PD_PMU_INTMEM_P     89
-#define RK3368_SRST_PD_PMU_NIU_P        90
-#define RK3368_SRST_SGRF_P              91
-#define RK3368_SRST_5RES12              92
-#define RK3368_SRST_5RES13              93
-#define RK3368_SRST_5RES14              94
-#define RK3368_SRST_5RES15              95
-
-#define RK3368_SRST_VIO_ARBI_H          96
-#define RK3368_SRST_RGA_NIU_A           97
-#define RK3368_SRST_VIO0_NIU_A          98
-#define RK3368_SRST_VIO0_BUS_H          99
-#define RK3368_SRST_LCDC0_A             100
-#define RK3368_SRST_LCDC0_H             101
-#define RK3368_SRST_LCDC0_D             102
-#define RK3368_SRST_6RES7               103
-#define RK3368_SRST_VIP                 104
-#define RK3368_SRST_RGA_CORE            105
-#define RK3368_SRST_IEP_A               106
-#define RK3368_SRST_IEP_H               107
-#define RK3368_SRST_RGA_A               108
-#define RK3368_SRST_RGA_H               109
-#define RK3368_SRST_ISP                 110
-#define RK3368_SRST_EDP_24M             111
-
-#define RK3368_SRST_VIDEO_A             112
-#define RK3368_SRST_VIDEO_H             113
-#define RK3368_SRST_MIPIDPHYTX_P        114
-#define RK3368_SRST_MIPIDSI0_P          115
-#define RK3368_SRST_MIPIDPHYRX_P        116
-#define RK3368_SRST_MIPICSI_P           117
-#define RK3368_SRST_7RES6               118
-#define RK3368_SRST_7RES7               119
-#define RK3368_SRST_GPU_CORE            120
-#define RK3368_SRST_HDMI                121
-#define RK3368_SRST_EDP_P               122
-#define RK3368_SRST_PMU_PVTM            123
-#define RK3368_SRST_CORE_PVTM           124
-#define RK3368_SRST_GPU_PVTM            125
-#define RK3368_SRST_GPU_SYS_A           126
-#define RK3368_SRST_GPU_MEM_NIU_A       127
-
-#define RK3368_SRST_MMC0                128
-#define RK3368_SRST_SDIO0               129
-#define RK3368_SRST_8RES2               130
-#define RK3368_SRST_EMMC                131
-#define RK3368_SRST_USBOTG0_H           132
-#define RK3368_SRST_USBOTGPHY0          133
-#define RK3368_SRST_USBOTGC0            134
-#define RK3368_SRST_USBHOSTC0_H         135
-#define RK3368_SRST_USBOTGPHY1          136
-#define RK3368_SRST_USBHOSTC0           137
-#define RK3368_SRST_USBPHY0_UTMI        138
-#define RK3368_SRST_USBPHY1_UTMI        139
-#define RK3368_SRST_8RES12              140
-#define RK3368_SRST_USB_ADP             141
-#define RK3368_SRST_8RES14              142
-#define RK3368_SRST_8RES15              143
-
-#define RK3368_SRST_DBG                 144
-#define RK3368_SRST_PD_CORE_AHB_NOC     145
-#define RK3368_SRST_PD_CORE_APB_NOC     146
-#define RK3368_SRST_9RES3               147
-#define RK3368_SRST_GIC                 148
-#define RK3368_SRST_LCDCPWM0            149
-#define RK3368_SRST_9RES6               150
-#define RK3368_SRST_9RES7               151
-#define RK3368_SRST_9RES8               152
-#define RK3368_SRST_RGA_H2P_BRG         153
-#define RK3368_SRST_VIDEO               154
-#define RK3368_SRST_9RES11              155
-#define RK3368_SRST_9RES12              156
-#define RK3368_SRST_GPU_CFG_NIU_A       157
-#define RK3368_SRST_9RES14              158
-#define RK3368_SRST_TSADC_P             159
-
-#define RK3368_SRST_DDRPHY0             160
-#define RK3368_SRST_DDRPHY0_P           161
-#define RK3368_SRST_DDRCTRL0            162
-#define RK3368_SRST_DDRCTRL0_P          163
-#define RK3368_SRST_10RES4              164
-#define RK3368_SRST_VIDEO_NIU_A         165
-#define RK3368_SRST_10RES6              166
-#define RK3368_SRST_VIDEO_NIU_H         167
-#define RK3368_SRST_10RES8              168
-#define RK3368_SRST_10RES9              169
-#define RK3368_SRST_DDRMSCH0            170
-#define RK3368_SRST_10RES11             171
-#define RK3368_SRST_10RES12             172
-#define RK3368_SRST_SYS_BUS             173
-#define RK3368_SRST_CRYPTO              174
-#define RK3368_SRST_10RES15             175
-
-#define RK3368_SRST_11RES0              176
-#define RK3368_SRST_11RES1              177
-#define RK3368_SRST_11RES2              178
-#define RK3368_SRST_UART0               179
-#define RK3368_SRST_UART1               180
-#define RK3368_SRST_UART2               181
-#define RK3368_SRST_UART3               182
-#define RK3368_SRST_UART4               183
-#define RK3368_SRST_11RES8              184
-#define RK3368_SRST_11RES9              185
-#define RK3368_SRST_SIMC_P              186
-#define RK3368_SRST_11RES11             187
-#define RK3368_SRST_TSP_H               188
-#define RK3368_SRST_TSP_CLKIN0          189
-#define RK3368_SRST_11RES14             190
-#define RK3368_SRST_11RES15             191
-
-#define RK3368_SRST_CORE_L_0_SC         192
-#define RK3368_SRST_CORE_L_1            193
-#define RK3368_SRST_CORE_L_2            194
-#define RK3368_SRST_CORE_L_3            195
-#define RK3368_SRST_CORE_L_PO0_SC       196
-#define RK3368_SRST_CORE_L_PO1          197
-#define RK3368_SRST_CORE_L_PO2          198
-#define RK3368_SRST_CORE_L_PO3          199
-#define RK3368_SRST_L2_L_SC             200
-#define RK3368_SRST_ADB_L_SC            201
-#define RK3368_SRST_PD_CORE_L_NIU_A_SC  202
-#define RK3368_SRST_CCI400_SYS_SC       203
-#define RK3368_SRST_CCI400_DDR_SC       204
-#define RK3368_SRST_CCI400_SC           205
-#define RK3368_SRST_SOCDBG_L            206
-#define RK3368_SRST_CORE_L_DBG          207
-
-#define RK3368_SRST_CORE_B_0            208
-#define RK3368_SRST_CORE_B_PO0          209
-#define RK3368_SRST_L2_B                210
-#define RK3368_SRST_ADB_B               211
-#define RK3368_SRST_PD_CORE_B_NIU_A     212
-#define RK3368_SRST_STRC_SYS_A          213
-#define RK3368_SRST_CORE_L_0            214
-#define RK3368_SRST_CORE_L_PO0          215
-#define RK3368_SRST_L2_L                216
-#define RK3368_SRST_ADB_L               217
-#define RK3368_SRST_PD_CORE_L_NIU_A     218
-#define RK3368_SRST_CCI400_SYS          219
-#define RK3368_SRST_CCI400_DDR          220
-#define RK3368_SRST_CCI400              221
-#define RK3368_SRST_TRACE               222
-#define RK3368_SRST_13RES15             223
-
-#define RK3368_SRST_TIMER00             224
-#define RK3368_SRST_TIMER01             225
-#define RK3368_SRST_TIMER02             226
-#define RK3368_SRST_TIMER03             227
-#define RK3368_SRST_TIMER04             228
-#define RK3368_SRST_TIMER05             229
-#define RK3368_SRST_TIMER10             230
-#define RK3368_SRST_TIMER11             231
-#define RK3368_SRST_TIMER12             232
-#define RK3368_SRST_TIMER13             233
-#define RK3368_SRST_TIMER14             234
-#define RK3368_SRST_TIMER15             235
-#define RK3368_SRST_TIMER0_P            236
-#define RK3368_SRST_TIMER1_P            237
-#define RK3368_SRST_14RES14             238
-#define RK3368_SRST_14RES15             239
-
-#endif /* _DT_BINDINGS_CLOCK_ROCKCHIP_RK3368_H */
diff --git a/include/dt-bindings/clock/rockchip.h b/include/dt-bindings/clock/rockchip.h
deleted file mode 100644
index b438f7bd4083..000000000000
--- a/include/dt-bindings/clock/rockchip.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef _DT_BINDINGS_CLOCK_ROCKCHIP_H
-#define _DT_BINDINGS_CLOCK_ROCKCHIP_H
-
-#ifndef BIT
-#define BIT(nr)			(1 << (nr))
-#endif
-
-#define CLK_DIVIDER_PLUS_ONE		(0)
-#define CLK_DIVIDER_ONE_BASED		BIT(0)
-#define CLK_DIVIDER_POWER_OF_TWO	BIT(1)
-#define CLK_DIVIDER_ALLOW_ZERO		BIT(2)
-#define CLK_DIVIDER_HIWORD_MASK		BIT(3)
-
-/* Rockchip special defined */
-//#define CLK_DIVIDER_FIXED		BIT(6)
-#define CLK_DIVIDER_USER_DEFINE		BIT(7)
-
-/*
- * flags used across common struct clk.  these flags should only affect the
- * top-level framework.  custom flags for dealing with hardware specifics
- * belong in struct clk_foo
- */
-#define CLK_SET_RATE_GATE	BIT(0) /* must be gated across rate change */
-#define CLK_SET_PARENT_GATE	BIT(1) /* must be gated across re-parent */
-#define CLK_SET_RATE_PARENT	BIT(2) /* propagate rate change up one level */
-#define CLK_IGNORE_UNUSED	BIT(3) /* do not gate even if unused */
-#define CLK_IS_ROOT		BIT(4) /* root clk, has no parent */
-#define CLK_IS_BASIC		BIT(5) /* Basic clk, can't do a to_clk_foo() */
-#define CLK_GET_RATE_NOCACHE	BIT(6) /* do not use the cached clk rate */
-#define CLK_SET_RATE_NO_REPARENT BIT(7) /* don't re-parent on rate change */
-#define CLK_SET_RATE_PARENT_IN_ORDER BIT(8) /* consider the order of re-parent
-						and set_div on rate change */
-
-
-
-/* Rockchip pll flags */
-#define CLK_PLL_3188		BIT(0)
-#define CLK_PLL_3188_APLL	BIT(1)
-#define CLK_PLL_3188PLUS	BIT(2)
-#define CLK_PLL_3188PLUS_APLL	BIT(3)
-#define CLK_PLL_3288_APLL	BIT(4)
-#define CLK_PLL_3188PLUS_AUTO	BIT(5)
-#define CLK_PLL_3036_APLL	BIT(6)
-#define CLK_PLL_3036PLUS_AUTO	BIT(7)
-#define CLK_PLL_312XPLUS	BIT(8)
-#define CLK_PLL_3368_APLLB	BIT(9)
-#define CLK_PLL_3368_APLLL	BIT(10)
-#define CLK_PLL_3368_LOW_JITTER	BIT(11)
-
-
-/* rate_ops index */
-#define CLKOPS_RATE_MUX_DIV		1
-#define CLKOPS_RATE_EVENDIV		2
-#define CLKOPS_RATE_MUX_EVENDIV		3
-#define CLKOPS_RATE_I2S_FRAC		4
-#define CLKOPS_RATE_FRAC		5
-#define CLKOPS_RATE_I2S			6
-#define CLKOPS_RATE_CIFOUT		7
-#define CLKOPS_RATE_UART		8
-#define CLKOPS_RATE_HSADC		9
-#define CLKOPS_RATE_MAC_REF		10
-#define CLKOPS_RATE_CORE		11
-#define CLKOPS_RATE_CORE_CHILD		12
-#define CLKOPS_RATE_DDR			13
-#define CLKOPS_RATE_RK3288_I2S		14
-#define CLKOPS_RATE_RK3288_USB480M	15
-#define CLKOPS_RATE_RK3288_DCLK_LCDC0	16
-#define CLKOPS_RATE_RK3288_DCLK_LCDC1	17
-#define CLKOPS_RATE_DDR_DIV2		18
-#define CLKOPS_RATE_DDR_DIV4		19
-#define CLKOPS_RATE_RK3368_MUX_DIV_NPLL 20
-#define CLKOPS_RATE_RK3368_DCLK_LCDC	21
-#define CLKOPS_RATE_RK3368_DDR		22
-
-#define CLKOPS_TABLE_END		(~0)
-
-/* pd id */
-#define CLK_PD_BCPU		0
-#define CLK_PD_BDSP		1
-#define CLK_PD_BUS		2
-#define CLK_PD_CPU_0 		3
-#define CLK_PD_CPU_1 		4
-#define CLK_PD_CPU_2 		5
-#define CLK_PD_CPU_3 		6
-#define CLK_PD_CS 		7
-#define CLK_PD_GPU 		8
-#define CLK_PD_HEVC 		9
-#define CLK_PD_PERI 		10
-#define CLK_PD_SCU 		11
-#define CLK_PD_VIDEO 		12
-#define CLK_PD_VIO		13
-#define CLK_PD_GPU_0		14
-#define CLK_PD_GPU_1		15
-
-#define CLK_PD_VIRT		255
-
-/* reset flag */
-#define ROCKCHIP_RESET_HIWORD_MASK	BIT(0)
-
-#endif /* _DT_BINDINGS_CLOCK_ROCKCHIP_H */

commit 54e366cc7bd755f2400900f8a0491a4fdf105b8e
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Mon Aug 9 16:10:59 2021 +0200

    Revert "bdi: add a ->dev_name field to struct backing_dev_info"
    
    This reverts commit d6c434ae9d3b5cd1fcb8e3aa28172f3d79d81641 which is
    commit 6bd87eec23cbc9ed222bed0f5b5b02bf300e9a8d upstream.
    
    It breaks the Android KABI and is not needed in this branch at this
    point in time.
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I69a71f7ae3dca4c5bec52b31dcc082ad1c343220

diff --git a/include/linux/backing-dev-defs.h b/include/linux/backing-dev-defs.h
index 65d47522413c..07e02d6df5ad 100644
--- a/include/linux/backing-dev-defs.h
+++ b/include/linux/backing-dev-defs.h
@@ -197,7 +197,6 @@ struct backing_dev_info {
 	wait_queue_head_t wb_waitq;
 
 	struct device *dev;
-	char dev_name[64];
 	struct device *owner;
 
 	struct timer_list laptop_mode_wb_timer;
diff --git a/mm/backing-dev.c b/mm/backing-dev.c
index 1d37c80d023a..8501b033bca8 100644
--- a/mm/backing-dev.c
+++ b/mm/backing-dev.c
@@ -880,8 +880,7 @@ int bdi_register_va(struct backing_dev_info *bdi, const char *fmt, va_list args)
 	if (bdi->dev)	/* The driver needs to use separate queues per device */
 		return 0;
 
-	vsnprintf(bdi->dev_name, sizeof(bdi->dev_name), fmt, args);
-	dev = device_create(bdi_class, NULL, MKDEV(0, 0), bdi, bdi->dev_name);
+	dev = device_create_vargs(bdi_class, NULL, MKDEV(0, 0), bdi, fmt, args);
 	if (IS_ERR(dev))
 		return PTR_ERR(dev);
 
@@ -981,7 +980,7 @@ const char *bdi_dev_name(struct backing_dev_info *bdi)
 {
 	if (!bdi || !bdi->dev)
 		return bdi_unknown_name;
-	return bdi->dev_name;
+	return dev_name(bdi->dev);
 }
 EXPORT_SYMBOL_GPL(bdi_dev_name);
 

commit 79cb5d085a463f38db71a982e84afed0a2a53a55
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Mon Aug 9 16:04:54 2021 +0200

    Revert "padata: validate cpumask without removed CPU during offline"
    
    This reverts commit 2b1207801c393a5e9af2fbac2dd8b0377d8ae63a which is
    commit 6bd87eec23cbc9ed222bed0f5b5b02bf300e9a8d upstream.
    
    It breaks the Android kernel abi and is not needed in this branch at
    this point in time.
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: Idf0bfa987ca8fa7932e390ddc7ad4c8c020f40b2

diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h
index 2c93bdad4fdb..2a7359382954 100644
--- a/include/linux/cpuhotplug.h
+++ b/include/linux/cpuhotplug.h
@@ -59,7 +59,6 @@ enum cpuhp_state {
 	CPUHP_IOMMU_INTEL_DEAD,
 	CPUHP_LUSTRE_CFS_DEAD,
 	CPUHP_AP_ARM_CACHE_B15_RAC_DEAD,
-	CPUHP_PADATA_DEAD,
 	CPUHP_WORKQUEUE_PREP,
 	CPUHP_POWER_NUMA_PREPARE,
 	CPUHP_HRTIMERS_PREPARE,
diff --git a/kernel/padata.c b/kernel/padata.c
index 4401b4f13d0b..93e4fb2d9f2e 100644
--- a/kernel/padata.c
+++ b/kernel/padata.c
@@ -682,7 +682,7 @@ static int __padata_remove_cpu(struct padata_instance *pinst, int cpu)
 {
 	struct parallel_data *pd = NULL;
 
-	if (!cpumask_test_cpu(cpu, cpu_online_mask)) {
+	if (cpumask_test_cpu(cpu, cpu_online_mask)) {
 
 		if (!padata_validate_cpumask(pinst, pinst->cpumask.pcpu) ||
 		    !padata_validate_cpumask(pinst, pinst->cpumask.cbcpu))
@@ -758,7 +758,7 @@ static int padata_cpu_online(unsigned int cpu, struct hlist_node *node)
 	return ret;
 }
 
-static int padata_cpu_dead(unsigned int cpu, struct hlist_node *node)
+static int padata_cpu_prep_down(unsigned int cpu, struct hlist_node *node)
 {
 	struct padata_instance *pinst;
 	int ret;
@@ -779,7 +779,6 @@ static enum cpuhp_state hp_online;
 static void __padata_free(struct padata_instance *pinst)
 {
 #ifdef CONFIG_HOTPLUG_CPU
-	cpuhp_state_remove_instance_nocalls(CPUHP_PADATA_DEAD, &pinst->node);
 	cpuhp_state_remove_instance_nocalls(hp_online, &pinst->node);
 #endif
 
@@ -965,8 +964,6 @@ static struct padata_instance *padata_alloc(struct workqueue_struct *wq,
 
 #ifdef CONFIG_HOTPLUG_CPU
 	cpuhp_state_add_instance_nocalls_cpuslocked(hp_online, &pinst->node);
-	cpuhp_state_add_instance_nocalls_cpuslocked(CPUHP_PADATA_DEAD,
-						    &pinst->node);
 #endif
 	return pinst;
 
@@ -1013,24 +1010,17 @@ static __init int padata_driver_init(void)
 	int ret;
 
 	ret = cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN, "padata:online",
-				      padata_cpu_online, NULL);
+				      padata_cpu_online,
+				      padata_cpu_prep_down);
 	if (ret < 0)
 		return ret;
 	hp_online = ret;
-
-	ret = cpuhp_setup_state_multi(CPUHP_PADATA_DEAD, "padata:dead",
-				      NULL, padata_cpu_dead);
-	if (ret < 0) {
-		cpuhp_remove_multi_state(hp_online);
-		return ret;
-	}
 	return 0;
 }
 module_init(padata_driver_init);
 
 static __exit void padata_driver_exit(void)
 {
-	cpuhp_remove_multi_state(CPUHP_PADATA_DEAD);
 	cpuhp_remove_multi_state(hp_online);
 }
 module_exit(padata_driver_exit);

commit 51aa764028f411fcc6a8b6fe88c2b0b92a4b365c
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Mon Aug 9 16:04:50 2021 +0200

    Revert "padata: add separate cpuhp node for CPUHP_PADATA_DEAD"
    
    This reverts commit d6c434ae9d3b5cd1fcb8e3aa28172f3d79d81641 which is
    commit 93175d935d76f4a7220fe9111ba452bb5c512fa4 upstream.
    
    It breaks the Android kernel abi and is not needed in this branch at
    this point in time.
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I53f15ad34f2124aa7a4e06dafcdb828666a91278

diff --git a/include/linux/padata.h b/include/linux/padata.h
index 8c9827cc6374..d803397a28f7 100644
--- a/include/linux/padata.h
+++ b/include/linux/padata.h
@@ -138,8 +138,7 @@ struct parallel_data {
 /**
  * struct padata_instance - The overall control structure.
  *
- * @cpu_online_node: Linkage for CPU online callback.
- * @cpu_dead_node: Linkage for CPU offline callback.
+ * @cpu_notifier: cpu hotplug notifier.
  * @wq: The workqueue in use.
  * @pd: The internal control structure.
  * @cpumask: User supplied cpumasks for parallel and serial works.
@@ -151,8 +150,7 @@ struct parallel_data {
  * @flags: padata flags.
  */
 struct padata_instance {
-	struct hlist_node		cpu_online_node;
-	struct hlist_node		cpu_dead_node;
+	struct hlist_node		 node;
 	struct workqueue_struct		*wq;
 	struct parallel_data		*pd;
 	struct padata_cpumask		cpumask;
diff --git a/kernel/padata.c b/kernel/padata.c
index 7f2b6d369fd4..4401b4f13d0b 100644
--- a/kernel/padata.c
+++ b/kernel/padata.c
@@ -748,7 +748,7 @@ static int padata_cpu_online(unsigned int cpu, struct hlist_node *node)
 	struct padata_instance *pinst;
 	int ret;
 
-	pinst = hlist_entry_safe(node, struct padata_instance, cpu_online_node);
+	pinst = hlist_entry_safe(node, struct padata_instance, node);
 	if (!pinst_has_cpu(pinst, cpu))
 		return 0;
 
@@ -763,7 +763,7 @@ static int padata_cpu_dead(unsigned int cpu, struct hlist_node *node)
 	struct padata_instance *pinst;
 	int ret;
 
-	pinst = hlist_entry_safe(node, struct padata_instance, cpu_dead_node);
+	pinst = hlist_entry_safe(node, struct padata_instance, node);
 	if (!pinst_has_cpu(pinst, cpu))
 		return 0;
 
@@ -779,9 +779,8 @@ static enum cpuhp_state hp_online;
 static void __padata_free(struct padata_instance *pinst)
 {
 #ifdef CONFIG_HOTPLUG_CPU
-	cpuhp_state_remove_instance_nocalls(CPUHP_PADATA_DEAD,
-					    &pinst->cpu_dead_node);
-	cpuhp_state_remove_instance_nocalls(hp_online, &pinst->cpu_online_node);
+	cpuhp_state_remove_instance_nocalls(CPUHP_PADATA_DEAD, &pinst->node);
+	cpuhp_state_remove_instance_nocalls(hp_online, &pinst->node);
 #endif
 
 	padata_stop(pinst);
@@ -965,10 +964,9 @@ static struct padata_instance *padata_alloc(struct workqueue_struct *wq,
 	mutex_init(&pinst->lock);
 
 #ifdef CONFIG_HOTPLUG_CPU
-	cpuhp_state_add_instance_nocalls_cpuslocked(hp_online,
-						    &pinst->cpu_online_node);
+	cpuhp_state_add_instance_nocalls_cpuslocked(hp_online, &pinst->node);
 	cpuhp_state_add_instance_nocalls_cpuslocked(CPUHP_PADATA_DEAD,
-						    &pinst->cpu_dead_node);
+						    &pinst->node);
 #endif
 	return pinst;
 

commit afef406d9f42b5c9ec80aeab329189650881e47c
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Fri Aug 6 20:16:38 2021 +0800

    media: rockchip: cif: fixed vc err in HDR mode
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: Id4f8403d9449179f2572994d2cea6fb9c8f95ca1

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index e07a89ced802..1f9497235c48 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -1717,7 +1717,9 @@ static int rkcif_csi_channel_init(struct rkcif_stream *stream,
 	channel->data_type = get_data_type(stream->cif_fmt_in->mbus_code,
 					   channel->cmd_mode_en);
 
-	if (stream->vc >= 0)
+	if (dev->hdr.mode == NO_HDR ||
+	    (dev->hdr.mode == HDR_X2 && stream->vc > 1) ||
+	    (dev->hdr.mode == HDR_X3 && stream->vc > 2))
 		channel->vc = stream->vc;
 	else
 		channel->vc = channel->id;

commit 027d66dc25b25ce704e1d556ebc6ac730552944a
Author: Steven Liu <steven.liu@rock-chips.com>
Date:   Mon Aug 9 11:38:06 2021 +0800

    pinctrl: rockchip: fix error mux route for rk3568 uart1
    
    Signed-off-by: Steven Liu <steven.liu@rock-chips.com>
    Change-Id: I0ca4459ae95e3f81c86cb386e679a36502e0eca9

diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
index 0e6d2a1c474a..95365e481a0c 100644
--- a/drivers/pinctrl/pinctrl-rockchip.c
+++ b/drivers/pinctrl/pinctrl-rockchip.c
@@ -1647,7 +1647,7 @@ static struct rockchip_mux_route_data rk3568_mux_route_data[] = {
 	MR_TOPGRF(RK_GPIO4, RK_PB3, RK_FUNC_4, 0x030c, RK_GENMASK_VAL(6, 6, 0)), /* SPI3 IO mux selection M0 */
 	MR_TOPGRF(RK_GPIO4, RK_PC2, RK_FUNC_2, 0x030c, RK_GENMASK_VAL(6, 6, 1)), /* SPI3 IO mux selection M1 */
 	MR_TOPGRF(RK_GPIO2, RK_PB4, RK_FUNC_2, 0x030c, RK_GENMASK_VAL(8, 8, 0)), /* UART1 IO mux selection M0 */
-	MR_TOPGRF(RK_GPIO0, RK_PD1, RK_FUNC_1, 0x030c, RK_GENMASK_VAL(8, 8, 1)), /* UART1 IO mux selection M1 */
+	MR_TOPGRF(RK_GPIO3, RK_PD6, RK_FUNC_4, 0x030c, RK_GENMASK_VAL(8, 8, 1)), /* UART1 IO mux selection M1 */
 	MR_TOPGRF(RK_GPIO0, RK_PD1, RK_FUNC_1, 0x030c, RK_GENMASK_VAL(10, 10, 0)), /* UART2 IO mux selection M0 */
 	MR_TOPGRF(RK_GPIO1, RK_PD5, RK_FUNC_2, 0x030c, RK_GENMASK_VAL(10, 10, 1)), /* UART2 IO mux selection M1 */
 	MR_TOPGRF(RK_GPIO1, RK_PA1, RK_FUNC_2, 0x030c, RK_GENMASK_VAL(12, 12, 0)), /* UART3 IO mux selection M0 */

commit 8711f6e3f49a10b1b063b87fd93973de7a0cc26c
Merge: f758dd08c6cf 5c66974a6304
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Sun Aug 8 09:10:51 2021 +0200

    Merge 4.19.202 into android-4.19-stable
    
    Changes in 4.19.202
            btrfs: mark compressed range uptodate only if all bio succeed
            regulator: rt5033: Fix n_voltages settings for BUCK and LDO
            ASoC: tlv320aic31xx: fix reversed bclk/wclk master bits
            r8152: Fix potential PM refcount imbalance
            qed: fix possible unpaired spin_{un}lock_bh in _qed_mcp_cmd_and_union()
            net: Fix zero-copy head len calculation.
            bdi: move bdi_dev_name out of line
            bdi: use bdi_dev_name() to get device name
            bdi: add a ->dev_name field to struct backing_dev_info
            Revert "Bluetooth: Shutdown controller after workqueues are flushed or cancelled"
            drm/i915: Ensure intel_engine_init_execlist() builds with Clang
            firmware: arm_scmi: Ensure drivers provide a probe function
            Revert "watchdog: iTCO_wdt: Account for rebooting on second timeout"
            padata: validate cpumask without removed CPU during offline
            padata: add separate cpuhp node for CPUHP_PADATA_DEAD
            spi: mediatek: Fix fifo transfer
            Linux 4.19.202
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I7778013d057c7b9d1c0749b9d80c00b71f23f116

commit 5c66974a63046780925e5d99b6dc6631fe2f9a31
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Sun Aug 8 08:54:30 2021 +0200

    Linux 4.19.202
    
    Link: https://lore.kernel.org/r/20210806081111.144943357@linuxfoundation.org
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index 80954901733d..b0f3a4d5a85d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 201
+SUBLEVEL = 202
 EXTRAVERSION =
 NAME = "People's Front"
 

commit 1706f008380a8421c3c7ee02abf7631fdfa2534d
Author: Guenter Roeck <linux@roeck-us.net>
Date:   Sun Aug 1 20:00:23 2021 -0700

    spi: mediatek: Fix fifo transfer
    
    commit 0d5c3954b35eddff0da0436c31e8d721eceb7dc2 upstream.
    
    Commit 3a70dd2d0503 ("spi: mediatek: fix fifo rx mode") claims that
    fifo RX mode was never handled, and adds the presumably missing code
    to the FIFO transfer function. However, the claim that receive data
    was not handled is incorrect. It was handled as part of interrupt
    handling after the transfer was complete. The code added with the above
    mentioned commit reads data from the receive FIFO before the transfer
    is started, which is wrong. This results in an actual transfer error
    on a Hayato Chromebook.
    
    Remove the code trying to handle receive data before the transfer is
    started to fix the problem.
    
    Fixes: 3a70dd2d0503 ("spi: mediatek: fix fifo rx mode")
    Cc: Peter Hess <peter.hess@ph-home.de>
    Cc: Frank Wunderlich <frank-w@public-files.de>
    Cc: Tzung-Bi Shih <tzungbi@google.com>
    Cc: Hsin-Yi Wang <hsinyi@google.com>
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Tested-by: Hsin-Yi Wang <hsinyi@google.com>
    Tested-by: Tzung-Bi Shih <tzungbi@google.com>
    Link: https://lore.kernel.org/r/20210802030023.1748777-1-linux@roeck-us.net
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/spi/spi-mt65xx.c b/drivers/spi/spi-mt65xx.c
index e2b171057b3b..690e8ddf5f6b 100644
--- a/drivers/spi/spi-mt65xx.c
+++ b/drivers/spi/spi-mt65xx.c
@@ -391,24 +391,15 @@ static int mtk_spi_fifo_transfer(struct spi_master *master,
 	mtk_spi_prepare_transfer(master, xfer);
 	mtk_spi_setup_packet(master);
 
-	cnt = xfer->len / 4;
-	if (xfer->tx_buf)
+	if (xfer->tx_buf) {
+		cnt = xfer->len / 4;
 		iowrite32_rep(mdata->base + SPI_TX_DATA_REG, xfer->tx_buf, cnt);
-
-	if (xfer->rx_buf)
-		ioread32_rep(mdata->base + SPI_RX_DATA_REG, xfer->rx_buf, cnt);
-
-	remainder = xfer->len % 4;
-	if (remainder > 0) {
-		reg_val = 0;
-		if (xfer->tx_buf) {
+		remainder = xfer->len % 4;
+		if (remainder > 0) {
+			reg_val = 0;
 			memcpy(&reg_val, xfer->tx_buf + (cnt * 4), remainder);
 			writel(reg_val, mdata->base + SPI_TX_DATA_REG);
 		}
-		if (xfer->rx_buf) {
-			reg_val = readl(mdata->base + SPI_RX_DATA_REG);
-			memcpy(xfer->rx_buf + (cnt * 4), &reg_val, remainder);
-		}
 	}
 
 	mtk_spi_enable_transfer(master);

commit 93175d935d76f4a7220fe9111ba452bb5c512fa4
Author: Daniel Jordan <daniel.m.jordan@oracle.com>
Date:   Tue Apr 21 12:34:55 2020 -0400

    padata: add separate cpuhp node for CPUHP_PADATA_DEAD
    
    commit 3c2214b6027ff37945799de717c417212e1a8c54 upstream.
    
    Removing the pcrypt module triggers this:
    
      general protection fault, probably for non-canonical
        address 0xdead000000000122
      CPU: 5 PID: 264 Comm: modprobe Not tainted 5.6.0+ #2
      Hardware name: QEMU Standard PC
      RIP: 0010:__cpuhp_state_remove_instance+0xcc/0x120
      Call Trace:
       padata_sysfs_release+0x74/0xce
       kobject_put+0x81/0xd0
       padata_free+0x12/0x20
       pcrypt_exit+0x43/0x8ee [pcrypt]
    
    padata instances wrongly use the same hlist node for the online and dead
    states, so __padata_free()'s second cpuhp remove call chokes on the node
    that the first poisoned.
    
    cpuhp multi-instance callbacks only walk forward in cpuhp_step->list and
    the same node is linked in both the online and dead lists, so the list
    corruption that results from padata_alloc() adding the node to a second
    list without removing it from the first doesn't cause problems as long
    as no instances are freed.
    
    Avoid the issue by giving each state its own node.
    
    Fixes: 894c9ef9780c ("padata: validate cpumask without removed CPU during offline")
    Signed-off-by: Daniel Jordan <daniel.m.jordan@oracle.com>
    Cc: Herbert Xu <herbert@gondor.apana.org.au>
    Cc: Steffen Klassert <steffen.klassert@secunet.com>
    Cc: linux-crypto@vger.kernel.org
    Cc: linux-kernel@vger.kernel.org
    Cc: stable@vger.kernel.org # v5.4+
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/padata.h b/include/linux/padata.h
index d803397a28f7..8c9827cc6374 100644
--- a/include/linux/padata.h
+++ b/include/linux/padata.h
@@ -138,7 +138,8 @@ struct parallel_data {
 /**
  * struct padata_instance - The overall control structure.
  *
- * @cpu_notifier: cpu hotplug notifier.
+ * @cpu_online_node: Linkage for CPU online callback.
+ * @cpu_dead_node: Linkage for CPU offline callback.
  * @wq: The workqueue in use.
  * @pd: The internal control structure.
  * @cpumask: User supplied cpumasks for parallel and serial works.
@@ -150,7 +151,8 @@ struct parallel_data {
  * @flags: padata flags.
  */
 struct padata_instance {
-	struct hlist_node		 node;
+	struct hlist_node		cpu_online_node;
+	struct hlist_node		cpu_dead_node;
 	struct workqueue_struct		*wq;
 	struct parallel_data		*pd;
 	struct padata_cpumask		cpumask;
diff --git a/kernel/padata.c b/kernel/padata.c
index 4401b4f13d0b..7f2b6d369fd4 100644
--- a/kernel/padata.c
+++ b/kernel/padata.c
@@ -748,7 +748,7 @@ static int padata_cpu_online(unsigned int cpu, struct hlist_node *node)
 	struct padata_instance *pinst;
 	int ret;
 
-	pinst = hlist_entry_safe(node, struct padata_instance, node);
+	pinst = hlist_entry_safe(node, struct padata_instance, cpu_online_node);
 	if (!pinst_has_cpu(pinst, cpu))
 		return 0;
 
@@ -763,7 +763,7 @@ static int padata_cpu_dead(unsigned int cpu, struct hlist_node *node)
 	struct padata_instance *pinst;
 	int ret;
 
-	pinst = hlist_entry_safe(node, struct padata_instance, node);
+	pinst = hlist_entry_safe(node, struct padata_instance, cpu_dead_node);
 	if (!pinst_has_cpu(pinst, cpu))
 		return 0;
 
@@ -779,8 +779,9 @@ static enum cpuhp_state hp_online;
 static void __padata_free(struct padata_instance *pinst)
 {
 #ifdef CONFIG_HOTPLUG_CPU
-	cpuhp_state_remove_instance_nocalls(CPUHP_PADATA_DEAD, &pinst->node);
-	cpuhp_state_remove_instance_nocalls(hp_online, &pinst->node);
+	cpuhp_state_remove_instance_nocalls(CPUHP_PADATA_DEAD,
+					    &pinst->cpu_dead_node);
+	cpuhp_state_remove_instance_nocalls(hp_online, &pinst->cpu_online_node);
 #endif
 
 	padata_stop(pinst);
@@ -964,9 +965,10 @@ static struct padata_instance *padata_alloc(struct workqueue_struct *wq,
 	mutex_init(&pinst->lock);
 
 #ifdef CONFIG_HOTPLUG_CPU
-	cpuhp_state_add_instance_nocalls_cpuslocked(hp_online, &pinst->node);
+	cpuhp_state_add_instance_nocalls_cpuslocked(hp_online,
+						    &pinst->cpu_online_node);
 	cpuhp_state_add_instance_nocalls_cpuslocked(CPUHP_PADATA_DEAD,
-						    &pinst->node);
+						    &pinst->cpu_dead_node);
 #endif
 	return pinst;
 

commit 2b1207801c393a5e9af2fbac2dd8b0377d8ae63a
Author: Daniel Jordan <daniel.m.jordan@oracle.com>
Date:   Tue Dec 3 14:31:10 2019 -0500

    padata: validate cpumask without removed CPU during offline
    
    commit 894c9ef9780c5cf2f143415e867ee39a33ecb75d upstream.
    
    Configuring an instance's parallel mask without any online CPUs...
    
      echo 2 > /sys/kernel/pcrypt/pencrypt/parallel_cpumask
      echo 0 > /sys/devices/system/cpu/cpu1/online
    
    ...makes tcrypt mode=215 crash like this:
    
      divide error: 0000 [#1] SMP PTI
      CPU: 4 PID: 283 Comm: modprobe Not tainted 5.4.0-rc8-padata-doc-v2+ #2
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS ?-20191013_105130-anatol 04/01/2014
      RIP: 0010:padata_do_parallel+0x114/0x300
      Call Trace:
       pcrypt_aead_encrypt+0xc0/0xd0 [pcrypt]
       crypto_aead_encrypt+0x1f/0x30
       do_mult_aead_op+0x4e/0xdf [tcrypt]
       test_mb_aead_speed.constprop.0.cold+0x226/0x564 [tcrypt]
       do_test+0x28c2/0x4d49 [tcrypt]
       tcrypt_mod_init+0x55/0x1000 [tcrypt]
       ...
    
    cpumask_weight() in padata_cpu_hash() returns 0 because the mask has no
    CPUs.  The problem is __padata_remove_cpu() checks for valid masks too
    early and so doesn't mark the instance PADATA_INVALID as expected, which
    would have made padata_do_parallel() return error before doing the
    division.
    
    Fix by introducing a second padata CPU hotplug state before
    CPUHP_BRINGUP_CPU so that __padata_remove_cpu() sees the online mask
    without @cpu.  No need for the second argument to padata_replace() since
    @cpu is now already missing from the online mask.
    
    Fixes: 33e54450683c ("padata: Handle empty padata cpumasks")
    Signed-off-by: Daniel Jordan <daniel.m.jordan@oracle.com>
    Cc: Eric Biggers <ebiggers@kernel.org>
    Cc: Herbert Xu <herbert@gondor.apana.org.au>
    Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Cc: Steffen Klassert <steffen.klassert@secunet.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: linux-crypto@vger.kernel.org
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h
index 3d323c6c8526..b51da879d7be 100644
--- a/include/linux/cpuhotplug.h
+++ b/include/linux/cpuhotplug.h
@@ -59,6 +59,7 @@ enum cpuhp_state {
 	CPUHP_IOMMU_INTEL_DEAD,
 	CPUHP_LUSTRE_CFS_DEAD,
 	CPUHP_AP_ARM_CACHE_B15_RAC_DEAD,
+	CPUHP_PADATA_DEAD,
 	CPUHP_WORKQUEUE_PREP,
 	CPUHP_POWER_NUMA_PREPARE,
 	CPUHP_HRTIMERS_PREPARE,
diff --git a/kernel/padata.c b/kernel/padata.c
index 93e4fb2d9f2e..4401b4f13d0b 100644
--- a/kernel/padata.c
+++ b/kernel/padata.c
@@ -682,7 +682,7 @@ static int __padata_remove_cpu(struct padata_instance *pinst, int cpu)
 {
 	struct parallel_data *pd = NULL;
 
-	if (cpumask_test_cpu(cpu, cpu_online_mask)) {
+	if (!cpumask_test_cpu(cpu, cpu_online_mask)) {
 
 		if (!padata_validate_cpumask(pinst, pinst->cpumask.pcpu) ||
 		    !padata_validate_cpumask(pinst, pinst->cpumask.cbcpu))
@@ -758,7 +758,7 @@ static int padata_cpu_online(unsigned int cpu, struct hlist_node *node)
 	return ret;
 }
 
-static int padata_cpu_prep_down(unsigned int cpu, struct hlist_node *node)
+static int padata_cpu_dead(unsigned int cpu, struct hlist_node *node)
 {
 	struct padata_instance *pinst;
 	int ret;
@@ -779,6 +779,7 @@ static enum cpuhp_state hp_online;
 static void __padata_free(struct padata_instance *pinst)
 {
 #ifdef CONFIG_HOTPLUG_CPU
+	cpuhp_state_remove_instance_nocalls(CPUHP_PADATA_DEAD, &pinst->node);
 	cpuhp_state_remove_instance_nocalls(hp_online, &pinst->node);
 #endif
 
@@ -964,6 +965,8 @@ static struct padata_instance *padata_alloc(struct workqueue_struct *wq,
 
 #ifdef CONFIG_HOTPLUG_CPU
 	cpuhp_state_add_instance_nocalls_cpuslocked(hp_online, &pinst->node);
+	cpuhp_state_add_instance_nocalls_cpuslocked(CPUHP_PADATA_DEAD,
+						    &pinst->node);
 #endif
 	return pinst;
 
@@ -1010,17 +1013,24 @@ static __init int padata_driver_init(void)
 	int ret;
 
 	ret = cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN, "padata:online",
-				      padata_cpu_online,
-				      padata_cpu_prep_down);
+				      padata_cpu_online, NULL);
 	if (ret < 0)
 		return ret;
 	hp_online = ret;
+
+	ret = cpuhp_setup_state_multi(CPUHP_PADATA_DEAD, "padata:dead",
+				      NULL, padata_cpu_dead);
+	if (ret < 0) {
+		cpuhp_remove_multi_state(hp_online);
+		return ret;
+	}
 	return 0;
 }
 module_init(padata_driver_init);
 
 static __exit void padata_driver_exit(void)
 {
+	cpuhp_remove_multi_state(CPUHP_PADATA_DEAD);
 	cpuhp_remove_multi_state(hp_online);
 }
 module_exit(padata_driver_exit);

commit 7cbcb642a6dcaa21842fd1bab089efae3425f37e
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Fri Aug 6 08:28:48 2021 +0200

    Revert "watchdog: iTCO_wdt: Account for rebooting on second timeout"
    
    This reverts commit 5bfbacfeadf864cb23dfe66c610ed036d5e48879 which is
    commit cb011044e34c293e139570ce5c01aed66a34345c upstream.
    
    It is reported to cause problems with systems and probably should not
    have been backported in the first place :(
    
    Link: https://lore.kernel.org/r/20210803165108.4154cd52@endymion
    Reported-by: Jean Delvare <jdelvare@suse.de>
    Cc: Jan Kiszka <jan.kiszka@siemens.com>
    Cc: Guenter Roeck <linux@roeck-us.net>
    Cc: Guenter Roeck <linux@roeck-us.net>
    Cc: Wim Van Sebroeck <wim@linux-watchdog.org>
    Cc: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/watchdog/iTCO_wdt.c b/drivers/watchdog/iTCO_wdt.c
index 059c9eddb546..347f0389b089 100644
--- a/drivers/watchdog/iTCO_wdt.c
+++ b/drivers/watchdog/iTCO_wdt.c
@@ -75,8 +75,6 @@
 #define TCOBASE(p)	((p)->tco_res->start)
 /* SMI Control and Enable Register */
 #define SMI_EN(p)	((p)->smi_res->start)
-#define TCO_EN		(1 << 13)
-#define GBL_SMI_EN	(1 << 0)
 
 #define TCO_RLD(p)	(TCOBASE(p) + 0x00) /* TCO Timer Reload/Curr. Value */
 #define TCOv1_TMR(p)	(TCOBASE(p) + 0x01) /* TCOv1 Timer Initial Value*/
@@ -332,12 +330,8 @@ static int iTCO_wdt_set_timeout(struct watchdog_device *wd_dev, unsigned int t)
 
 	tmrval = seconds_to_ticks(p, t);
 
-	/*
-	 * If TCO SMIs are off, the timer counts down twice before rebooting.
-	 * Otherwise, the BIOS generally reboots when the SMI triggers.
-	 */
-	if (p->smi_res &&
-	    (SMI_EN(p) & (TCO_EN | GBL_SMI_EN)) != (TCO_EN | GBL_SMI_EN))
+	/* For TCO v1 the timer counts down twice before rebooting */
+	if (p->iTCO_version == 1)
 		tmrval /= 2;
 
 	/* from the specs: */
@@ -499,7 +493,7 @@ static int iTCO_wdt_probe(struct platform_device *pdev)
 		 * Disables TCO logic generating an SMI#
 		 */
 		val32 = inl(SMI_EN(p));
-		val32 &= ~TCO_EN;	/* Turn off SMI clearing watchdog */
+		val32 &= 0xffffdfff;	/* Turn off SMI clearing watchdog */
 		outl(val32, SMI_EN(p));
 	}
 

commit 193b1b15a4bd58736258e308ee26de9947649cb3
Author: Sudeep Holla <sudeep.holla@arm.com>
Date:   Thu Jun 24 10:50:59 2021 +0100

    firmware: arm_scmi: Ensure drivers provide a probe function
    
    commit 5e469dac326555d2038d199a6329458cc82a34e5 upstream.
    
    The bus probe callback calls the driver callback without further
    checking. Better be safe than sorry and refuse registration of a driver
    without a probe function to prevent a NULL pointer exception.
    
    Link: https://lore.kernel.org/r/20210624095059.4010157-2-sudeep.holla@arm.com
    Fixes: 933c504424a2 ("firmware: arm_scmi: add scmi protocol bus to enumerate protocol devices")
    Reported-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
    Tested-by: Cristian Marussi <cristian.marussi@arm.com>
    Reviewed-by: Cristian Marussi <cristian.marussi@arm.com>
    Acked-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/firmware/arm_scmi/bus.c b/drivers/firmware/arm_scmi/bus.c
index 7a30952b463d..66d445b14e51 100644
--- a/drivers/firmware/arm_scmi/bus.c
+++ b/drivers/firmware/arm_scmi/bus.c
@@ -100,6 +100,9 @@ int scmi_driver_register(struct scmi_driver *driver, struct module *owner,
 {
 	int retval;
 
+	if (!driver->probe)
+		return -EINVAL;
+
 	driver->driver.bus = &scmi_bus_type;
 	driver->driver.name = driver->name;
 	driver->driver.owner = owner;

commit 0dcd7a637489394fa0b8a55019da609f6b3c13d5
Author: Jani Nikula <jani.nikula@intel.com>
Date:   Tue Oct 16 15:29:38 2018 +0300

    drm/i915: Ensure intel_engine_init_execlist() builds with Clang
    
    commit 410ed5731a6566498a3aa904420aa2e49ba0ba90 upstream.
    
    Clang build with UBSAN enabled leads to the following build error:
    
    drivers/gpu/drm/i915/intel_engine_cs.o: In function `intel_engine_init_execlist':
    drivers/gpu/drm/i915/intel_engine_cs.c:411: undefined reference to `__compiletime_assert_411'
    
    Again, for this to work the code would first need to be inlined and then
    constant folded, which doesn't work for Clang because semantic analysis
    happens before optimization/inlining.
    
    Use GEM_BUG_ON() instead of BUILD_BUG_ON().
    
    v2: Use is_power_of_2() from log2.h (Chris)
    
    References: http://mid.mail-archive.com/20181015203410.155997-1-swboyd@chromium.org
    Reported-by: Stephen Boyd <swboyd@chromium.org>
    Cc: Stephen Boyd <swboyd@chromium.org>
    Cc: Chris Wilson <chris@chris-wilson.co.uk>
    Tested-by: Nathan Chancellor <natechancellor@gmail.com>
    Tested-by: Stephen Boyd <swboyd@chromium.org>
    Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
    Signed-off-by: Jani Nikula <jani.nikula@intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20181016122938.18757-2-jani.nikula@intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c
index 2d1952849d69..12ade478533f 100644
--- a/drivers/gpu/drm/i915/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/intel_engine_cs.c
@@ -463,7 +463,7 @@ static void intel_engine_init_execlist(struct intel_engine_cs *engine)
 	struct intel_engine_execlists * const execlists = &engine->execlists;
 
 	execlists->port_mask = 1;
-	BUILD_BUG_ON_NOT_POWER_OF_2(execlists_num_ports(execlists));
+	GEM_BUG_ON(!is_power_of_2(execlists_num_ports(execlists)));
 	GEM_BUG_ON(execlists_num_ports(execlists) > EXECLIST_MAX_PORTS);
 
 	execlists->queue_priority = INT_MIN;

commit 608ba4af66a0b3c0bc15885ee14264abd099ae4e
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Thu Aug 5 20:58:57 2021 +0200

    Revert "Bluetooth: Shutdown controller after workqueues are flushed or cancelled"
    
    This reverts commit 78b03389d2773255ceaf051f2dca134b816d96f2 which is
    commit 0ea9fd001a14ebc294f112b0361a4e601551d508 upstream.
    
    It has been reported to have problems:
            https://lore.kernel.org/linux-bluetooth/8735ryk0o7.fsf@baylibre.com/
    
    Reported-by: Guenter Roeck <linux@roeck-us.net>
    Cc: Kai-Heng Feng <kai.heng.feng@canonical.com>
    Cc: Marcel Holtmann <marcel@holtmann.org>
    Cc: Sasha Levin <sashal@kernel.org>
    Link: https://lore.kernel.org/r/efee3a58-a4d2-af22-0931-e81b877ab539@roeck-us.net
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index e9902bf0f137..219cdbb476fb 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -1609,6 +1609,14 @@ int hci_dev_do_close(struct hci_dev *hdev)
 
 	BT_DBG("%s %p", hdev->name, hdev);
 
+	if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) &&
+	    !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
+	    test_bit(HCI_UP, &hdev->flags)) {
+		/* Execute vendor specific shutdown routine */
+		if (hdev->shutdown)
+			hdev->shutdown(hdev);
+	}
+
 	cancel_delayed_work(&hdev->power_off);
 
 	hci_request_cancel_all(hdev);
@@ -1682,14 +1690,6 @@ int hci_dev_do_close(struct hci_dev *hdev)
 		clear_bit(HCI_INIT, &hdev->flags);
 	}
 
-	if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) &&
-	    !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
-	    test_bit(HCI_UP, &hdev->flags)) {
-		/* Execute vendor specific shutdown routine */
-		if (hdev->shutdown)
-			hdev->shutdown(hdev);
-	}
-
 	/* flush cmd  work */
 	flush_work(&hdev->cmd_work);
 

commit d6c434ae9d3b5cd1fcb8e3aa28172f3d79d81641
Author: Christoph Hellwig <hch@lst.de>
Date:   Mon May 4 14:47:56 2020 +0200

    bdi: add a ->dev_name field to struct backing_dev_info
    
    [ Upstream commit 6bd87eec23cbc9ed222bed0f5b5b02bf300e9a8d ]
    
    Cache a copy of the name for the life time of the backing_dev_info
    structure so that we can reference it even after unregistering.
    
    Fixes: 68f23b89067f ("memcg: fix a crash in wb_workfn when a device disappears")
    Reported-by: Yufen Yu <yuyufen@huawei.com>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Jan Kara <jack@suse.cz>
    Reviewed-by: Bart Van Assche <bvanassche@acm.org>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/backing-dev-defs.h b/include/linux/backing-dev-defs.h
index 07e02d6df5ad..65d47522413c 100644
--- a/include/linux/backing-dev-defs.h
+++ b/include/linux/backing-dev-defs.h
@@ -197,6 +197,7 @@ struct backing_dev_info {
 	wait_queue_head_t wb_waitq;
 
 	struct device *dev;
+	char dev_name[64];
 	struct device *owner;
 
 	struct timer_list laptop_mode_wb_timer;
diff --git a/mm/backing-dev.c b/mm/backing-dev.c
index 8501b033bca8..1d37c80d023a 100644
--- a/mm/backing-dev.c
+++ b/mm/backing-dev.c
@@ -880,7 +880,8 @@ int bdi_register_va(struct backing_dev_info *bdi, const char *fmt, va_list args)
 	if (bdi->dev)	/* The driver needs to use separate queues per device */
 		return 0;
 
-	dev = device_create_vargs(bdi_class, NULL, MKDEV(0, 0), bdi, fmt, args);
+	vsnprintf(bdi->dev_name, sizeof(bdi->dev_name), fmt, args);
+	dev = device_create(bdi_class, NULL, MKDEV(0, 0), bdi, bdi->dev_name);
 	if (IS_ERR(dev))
 		return PTR_ERR(dev);
 
@@ -980,7 +981,7 @@ const char *bdi_dev_name(struct backing_dev_info *bdi)
 {
 	if (!bdi || !bdi->dev)
 		return bdi_unknown_name;
-	return dev_name(bdi->dev);
+	return bdi->dev_name;
 }
 EXPORT_SYMBOL_GPL(bdi_dev_name);
 

commit 19a845e19ded4f81dad2a0941f44fb668ed25564
Author: Yufen Yu <yuyufen@huawei.com>
Date:   Mon May 4 14:47:55 2020 +0200

    bdi: use bdi_dev_name() to get device name
    
    [ Upstream commit d51cfc53ade3189455a1b88ec7a2ff0c24597cf8 ]
    
    Use the common interface bdi_dev_name() to get device name.
    
    Signed-off-by: Yufen Yu <yuyufen@huawei.com>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Reviewed-by: Jan Kara <jack@suse.cz>
    Reviewed-by: Bart Van Assche <bvanassche@acm.org>
    
    Add missing <linux/backing-dev.h> include BFQ
    
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
index d984592b0995..5b3e5483c657 100644
--- a/block/bfq-iosched.c
+++ b/block/bfq-iosched.c
@@ -132,6 +132,7 @@
 #include <linux/ioprio.h>
 #include <linux/sbitmap.h>
 #include <linux/delay.h>
+#include <linux/backing-dev.h>
 
 #include "blk.h"
 #include "blk-mq.h"
@@ -4212,8 +4213,9 @@ bfq_set_next_ioprio_data(struct bfq_queue *bfqq, struct bfq_io_cq *bic)
 	ioprio_class = IOPRIO_PRIO_CLASS(bic->ioprio);
 	switch (ioprio_class) {
 	default:
-		dev_err(bfqq->bfqd->queue->backing_dev_info->dev,
-			"bfq: bad prio class %d\n", ioprio_class);
+		pr_err("bdi %s: bfq: bad prio class %d\n",
+				bdi_dev_name(bfqq->bfqd->queue->backing_dev_info),
+				ioprio_class);
 		/* fall through */
 	case IOPRIO_CLASS_NONE:
 		/*
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c
index 85bd46e0a745..ddde117eb2e0 100644
--- a/block/blk-cgroup.c
+++ b/block/blk-cgroup.c
@@ -474,7 +474,7 @@ const char *blkg_dev_name(struct blkcg_gq *blkg)
 {
 	/* some drivers (floppy) instantiate a queue w/o disk registered */
 	if (blkg->q->backing_dev_info->dev)
-		return dev_name(blkg->q->backing_dev_info->dev);
+		return bdi_dev_name(blkg->q->backing_dev_info);
 	return NULL;
 }
 EXPORT_SYMBOL_GPL(blkg_dev_name);
diff --git a/fs/ceph/debugfs.c b/fs/ceph/debugfs.c
index abdf98deeec4..e6b7d43b5077 100644
--- a/fs/ceph/debugfs.c
+++ b/fs/ceph/debugfs.c
@@ -251,7 +251,7 @@ int ceph_fs_debugfs_init(struct ceph_fs_client *fsc)
 		goto out;
 
 	snprintf(name, sizeof(name), "../../bdi/%s",
-		 dev_name(fsc->sb->s_bdi->dev));
+		 bdi_dev_name(fsc->sb->s_bdi));
 	fsc->debugfs_bdi =
 		debugfs_create_symlink("bdi",
 				       fsc->client->debugfs_dir,
diff --git a/include/trace/events/wbt.h b/include/trace/events/wbt.h
index 37342a13c9cb..9996420d7ec4 100644
--- a/include/trace/events/wbt.h
+++ b/include/trace/events/wbt.h
@@ -33,7 +33,7 @@ TRACE_EVENT(wbt_stat,
 	),
 
 	TP_fast_assign(
-		strlcpy(__entry->name, dev_name(bdi->dev),
+		strlcpy(__entry->name, bdi_dev_name(bdi),
 			ARRAY_SIZE(__entry->name));
 		__entry->rmean		= stat[0].mean;
 		__entry->rmin		= stat[0].min;
@@ -68,7 +68,7 @@ TRACE_EVENT(wbt_lat,
 	),
 
 	TP_fast_assign(
-		strlcpy(__entry->name, dev_name(bdi->dev),
+		strlcpy(__entry->name, bdi_dev_name(bdi),
 			ARRAY_SIZE(__entry->name));
 		__entry->lat = div_u64(lat, 1000);
 	),
@@ -105,7 +105,7 @@ TRACE_EVENT(wbt_step,
 	),
 
 	TP_fast_assign(
-		strlcpy(__entry->name, dev_name(bdi->dev),
+		strlcpy(__entry->name, bdi_dev_name(bdi),
 			ARRAY_SIZE(__entry->name));
 		__entry->msg	= msg;
 		__entry->step	= step;
@@ -141,7 +141,7 @@ TRACE_EVENT(wbt_timer,
 	),
 
 	TP_fast_assign(
-		strlcpy(__entry->name, dev_name(bdi->dev),
+		strlcpy(__entry->name, bdi_dev_name(bdi),
 			ARRAY_SIZE(__entry->name));
 		__entry->status		= status;
 		__entry->step		= step;

commit 0129d7637fed08b8aa805362074fe4370a9290ea
Author: Christoph Hellwig <hch@lst.de>
Date:   Mon May 4 14:47:54 2020 +0200

    bdi: move bdi_dev_name out of line
    
    [ Upstream commit eb7ae5e06bb6e6ac6bb86872d27c43ebab92f6b2 ]
    
    bdi_dev_name is not a fast path function, move it out of line.  This
    prepares for using it from modular callers without having to export
    an implementation detail like bdi_unknown_name.
    
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Jan Kara <jack@suse.cz>
    Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Reviewed-by: Bart Van Assche <bvanassche@acm.org>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h
index 1ef4aca7b953..d28d57eefe9f 100644
--- a/include/linux/backing-dev.h
+++ b/include/linux/backing-dev.h
@@ -499,13 +499,6 @@ static inline int bdi_rw_congested(struct backing_dev_info *bdi)
 				  (1 << WB_async_congested));
 }
 
-extern const char *bdi_unknown_name;
-
-static inline const char *bdi_dev_name(struct backing_dev_info *bdi)
-{
-	if (!bdi || !bdi->dev)
-		return bdi_unknown_name;
-	return dev_name(bdi->dev);
-}
+const char *bdi_dev_name(struct backing_dev_info *bdi);
 
 #endif	/* _LINUX_BACKING_DEV_H */
diff --git a/mm/backing-dev.c b/mm/backing-dev.c
index 2152e85891d1..8501b033bca8 100644
--- a/mm/backing-dev.c
+++ b/mm/backing-dev.c
@@ -19,7 +19,7 @@ struct backing_dev_info noop_backing_dev_info = {
 EXPORT_SYMBOL_GPL(noop_backing_dev_info);
 
 static struct class *bdi_class;
-const char *bdi_unknown_name = "(unknown)";
+static const char *bdi_unknown_name = "(unknown)";
 
 /*
  * bdi_lock protects updates to bdi_list. bdi_list has RCU reader side
@@ -976,6 +976,14 @@ void bdi_put(struct backing_dev_info *bdi)
 }
 EXPORT_SYMBOL(bdi_put);
 
+const char *bdi_dev_name(struct backing_dev_info *bdi)
+{
+	if (!bdi || !bdi->dev)
+		return bdi_unknown_name;
+	return dev_name(bdi->dev);
+}
+EXPORT_SYMBOL_GPL(bdi_dev_name);
+
 static wait_queue_head_t congestion_wqh[2] = {
 		__WAIT_QUEUE_HEAD_INITIALIZER(congestion_wqh[0]),
 		__WAIT_QUEUE_HEAD_INITIALIZER(congestion_wqh[1])

commit a66fdcda469a0e103fe105dc0c95536fa28dc733
Author: Pravin B Shelar <pshelar@ovn.org>
Date:   Thu Jul 15 16:59:00 2021 -0700

    net: Fix zero-copy head len calculation.
    
    [ Upstream commit a17ad0961706244dce48ec941f7e476a38c0e727 ]
    
    In some cases skb head could be locked and entire header
    data is pulled from skb. When skb_zerocopy() called in such cases,
    following BUG is triggered. This patch fixes it by copying entire
    skb in such cases.
    This could be optimized incase this is performance bottleneck.
    
    ---8<---
    kernel BUG at net/core/skbuff.c:2961!
    invalid opcode: 0000 [#1] SMP PTI
    CPU: 2 PID: 0 Comm: swapper/2 Tainted: G           OE     5.4.0-77-generic #86-Ubuntu
    Hardware name: OpenStack Foundation OpenStack Nova, BIOS 1.13.0-1ubuntu1.1 04/01/2014
    RIP: 0010:skb_zerocopy+0x37a/0x3a0
    RSP: 0018:ffffbcc70013ca38 EFLAGS: 00010246
    Call Trace:
     <IRQ>
     queue_userspace_packet+0x2af/0x5e0 [openvswitch]
     ovs_dp_upcall+0x3d/0x60 [openvswitch]
     ovs_dp_process_packet+0x125/0x150 [openvswitch]
     ovs_vport_receive+0x77/0xd0 [openvswitch]
     netdev_port_receive+0x87/0x130 [openvswitch]
     netdev_frame_hook+0x4b/0x60 [openvswitch]
     __netif_receive_skb_core+0x2b4/0xc90
     __netif_receive_skb_one_core+0x3f/0xa0
     __netif_receive_skb+0x18/0x60
     process_backlog+0xa9/0x160
     net_rx_action+0x142/0x390
     __do_softirq+0xe1/0x2d6
     irq_exit+0xae/0xb0
     do_IRQ+0x5a/0xf0
     common_interrupt+0xf/0xf
    
    Code that triggered BUG:
    int
    skb_zerocopy(struct sk_buff *to, struct sk_buff *from, int len, int hlen)
    {
            int i, j = 0;
            int plen = 0; /* length of skb->head fragment */
            int ret;
            struct page *page;
            unsigned int offset;
    
            BUG_ON(!from->head_frag && !hlen);
    
    Signed-off-by: Pravin B Shelar <pshelar@ovn.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index ea9684bcc2e8..e1daab49b0eb 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -2705,8 +2705,11 @@ skb_zerocopy_headlen(const struct sk_buff *from)
 
 	if (!from->head_frag ||
 	    skb_headlen(from) < L1_CACHE_BYTES ||
-	    skb_shinfo(from)->nr_frags >= MAX_SKB_FRAGS)
+	    skb_shinfo(from)->nr_frags >= MAX_SKB_FRAGS) {
 		hlen = skb_headlen(from);
+		if (!hlen)
+			hlen = from->len;
+	}
 
 	if (skb_has_frag_list(from))
 		hlen = from->len;

commit 6a6047bf892cc1ee2abe3a96e59c8fcbecbf9483
Author: Jia He <justin.he@arm.com>
Date:   Thu Jul 15 16:08:21 2021 +0800

    qed: fix possible unpaired spin_{un}lock_bh in _qed_mcp_cmd_and_union()
    
    [ Upstream commit 6206b7981a36476f4695d661ae139f7db36a802d ]
    
    Liajian reported a bug_on hit on a ThunderX2 arm64 server with FastLinQ
    QL41000 ethernet controller:
     BUG: scheduling while atomic: kworker/0:4/531/0x00000200
      [qed_probe:488()]hw prepare failed
      kernel BUG at mm/vmalloc.c:2355!
      Internal error: Oops - BUG: 0 [#1] SMP
      CPU: 0 PID: 531 Comm: kworker/0:4 Tainted: G W 5.4.0-77-generic #86-Ubuntu
      pstate: 00400009 (nzcv daif +PAN -UAO)
     Call trace:
      vunmap+0x4c/0x50
      iounmap+0x48/0x58
      qed_free_pci+0x60/0x80 [qed]
      qed_probe+0x35c/0x688 [qed]
      __qede_probe+0x88/0x5c8 [qede]
      qede_probe+0x60/0xe0 [qede]
      local_pci_probe+0x48/0xa0
      work_for_cpu_fn+0x24/0x38
      process_one_work+0x1d0/0x468
      worker_thread+0x238/0x4e0
      kthread+0xf0/0x118
      ret_from_fork+0x10/0x18
    
    In this case, qed_hw_prepare() returns error due to hw/fw error, but in
    theory work queue should be in process context instead of interrupt.
    
    The root cause might be the unpaired spin_{un}lock_bh() in
    _qed_mcp_cmd_and_union(), which causes botton half is disabled incorrectly.
    
    Reported-by: Lijian Zhang <Lijian.Zhang@arm.com>
    Signed-off-by: Jia He <justin.he@arm.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/qlogic/qed/qed_mcp.c b/drivers/net/ethernet/qlogic/qed/qed_mcp.c
index 938ace333af1..0d62db3241be 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_mcp.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_mcp.c
@@ -498,14 +498,18 @@ _qed_mcp_cmd_and_union(struct qed_hwfn *p_hwfn,
 
 		spin_lock_bh(&p_hwfn->mcp_info->cmd_lock);
 
-		if (!qed_mcp_has_pending_cmd(p_hwfn))
+		if (!qed_mcp_has_pending_cmd(p_hwfn)) {
+			spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock);
 			break;
+		}
 
 		rc = qed_mcp_update_pending_cmd(p_hwfn, p_ptt);
-		if (!rc)
+		if (!rc) {
+			spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock);
 			break;
-		else if (rc != -EAGAIN)
+		} else if (rc != -EAGAIN) {
 			goto err;
+		}
 
 		spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock);
 
@@ -522,6 +526,8 @@ _qed_mcp_cmd_and_union(struct qed_hwfn *p_hwfn,
 		return -EAGAIN;
 	}
 
+	spin_lock_bh(&p_hwfn->mcp_info->cmd_lock);
+
 	/* Send the mailbox command */
 	qed_mcp_reread_offsets(p_hwfn, p_ptt);
 	seq_num = ++p_hwfn->mcp_info->drv_mb_seq;
@@ -548,14 +554,18 @@ _qed_mcp_cmd_and_union(struct qed_hwfn *p_hwfn,
 
 		spin_lock_bh(&p_hwfn->mcp_info->cmd_lock);
 
-		if (p_cmd_elem->b_is_completed)
+		if (p_cmd_elem->b_is_completed) {
+			spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock);
 			break;
+		}
 
 		rc = qed_mcp_update_pending_cmd(p_hwfn, p_ptt);
-		if (!rc)
+		if (!rc) {
+			spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock);
 			break;
-		else if (rc != -EAGAIN)
+		} else if (rc != -EAGAIN) {
 			goto err;
+		}
 
 		spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock);
 	} while (++cnt < max_retries);
@@ -576,6 +586,7 @@ _qed_mcp_cmd_and_union(struct qed_hwfn *p_hwfn,
 		return -EAGAIN;
 	}
 
+	spin_lock_bh(&p_hwfn->mcp_info->cmd_lock);
 	qed_mcp_cmd_del_elem(p_hwfn, p_cmd_elem);
 	spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock);
 

commit 9b091d54444c6b6512903ce6758b841b1699c5bf
Author: Takashi Iwai <tiwai@suse.de>
Date:   Wed Jul 14 19:00:21 2021 +0200

    r8152: Fix potential PM refcount imbalance
    
    [ Upstream commit 9c23aa51477a37f8b56c3c40192248db0663c196 ]
    
    rtl8152_close() takes the refcount via usb_autopm_get_interface() but
    it doesn't release when RTL8152_UNPLUG test hits.  This may lead to
    the imbalance of PM refcount.  This patch addresses it.
    
    Link: https://bugzilla.suse.com/show_bug.cgi?id=1186194
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index 726fb5561a0f..4764e4f54cef 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -3960,9 +3960,10 @@ static int rtl8152_close(struct net_device *netdev)
 		tp->rtl_ops.down(tp);
 
 		mutex_unlock(&tp->control);
+	}
 
+	if (!res)
 		usb_autopm_put_interface(tp->intf);
-	}
 
 	free_all_mem(tp);
 

commit 40071bc72f52fd0ecc9122858e19644ff1fdcdaf
Author: Kyle Russell <bkylerussell@gmail.com>
Date:   Mon Jun 21 21:09:41 2021 -0400

    ASoC: tlv320aic31xx: fix reversed bclk/wclk master bits
    
    [ Upstream commit 9cf76a72af6ab81030dea6481b1d7bdd814fbdaf ]
    
    These are backwards from Table 7-71 of the TLV320AIC3100 spec [1].
    
    This was broken in 12eb4d66ba2e when BCLK_MASTER and WCLK_MASTER
    were converted from 0x08 and 0x04 to BIT(2) and BIT(3), respectively.
    
    -#define AIC31XX_BCLK_MASTER            0x08
    -#define AIC31XX_WCLK_MASTER            0x04
    +#define AIC31XX_BCLK_MASTER            BIT(2)
    +#define AIC31XX_WCLK_MASTER            BIT(3)
    
    Probably just a typo since the defines were not listed in bit order.
    
    [1] https://www.ti.com/lit/gpn/tlv320aic3100
    
    Signed-off-by: Kyle Russell <bkylerussell@gmail.com>
    Link: https://lore.kernel.org/r/20210622010941.241386-1-bkylerussell@gmail.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/codecs/tlv320aic31xx.h b/sound/soc/codecs/tlv320aic31xx.h
index 0b587585b38b..6071de5fca57 100644
--- a/sound/soc/codecs/tlv320aic31xx.h
+++ b/sound/soc/codecs/tlv320aic31xx.h
@@ -147,8 +147,8 @@ struct aic31xx_pdata {
 #define AIC31XX_WORD_LEN_24BITS		0x02
 #define AIC31XX_WORD_LEN_32BITS		0x03
 #define AIC31XX_IFACE1_MASTER_MASK	GENMASK(3, 2)
-#define AIC31XX_BCLK_MASTER		BIT(2)
-#define AIC31XX_WCLK_MASTER		BIT(3)
+#define AIC31XX_BCLK_MASTER		BIT(3)
+#define AIC31XX_WCLK_MASTER		BIT(2)
 
 /* AIC31XX_DATA_OFFSET */
 #define AIC31XX_DATA_OFFSET_MASK	GENMASK(7, 0)

commit ce35fbada898e50673b4bd9878d1889fa1fd6a79
Author: Axel Lin <axel.lin@ingics.com>
Date:   Sun Jun 27 16:04:18 2021 +0800

    regulator: rt5033: Fix n_voltages settings for BUCK and LDO
    
    [ Upstream commit 6549c46af8551b346bcc0b9043f93848319acd5c ]
    
    For linear regulators, the n_voltages should be (max - min) / step + 1.
    
    Buck voltage from 1v to 3V, per step 100mV, and vout mask is 0x1f.
    If value is from 20 to 31, the voltage will all be fixed to 3V.
    And LDO also, just vout range is different from 1.2v to 3v, step is the
    same. If value is from 18 to 31, the voltage will also be fixed to 3v.
    
    Signed-off-by: Axel Lin <axel.lin@ingics.com>
    Reviewed-by: ChiYuan Huang <cy_huang@richtek.com>
    Link: https://lore.kernel.org/r/20210627080418.1718127-1-axel.lin@ingics.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/mfd/rt5033-private.h b/include/linux/mfd/rt5033-private.h
index 1b63fc2f42d1..52d53d134f72 100644
--- a/include/linux/mfd/rt5033-private.h
+++ b/include/linux/mfd/rt5033-private.h
@@ -203,13 +203,13 @@ enum rt5033_reg {
 #define RT5033_REGULATOR_BUCK_VOLTAGE_MIN		1000000U
 #define RT5033_REGULATOR_BUCK_VOLTAGE_MAX		3000000U
 #define RT5033_REGULATOR_BUCK_VOLTAGE_STEP		100000U
-#define RT5033_REGULATOR_BUCK_VOLTAGE_STEP_NUM		32
+#define RT5033_REGULATOR_BUCK_VOLTAGE_STEP_NUM		21
 
 /* RT5033 regulator LDO output voltage uV */
 #define RT5033_REGULATOR_LDO_VOLTAGE_MIN		1200000U
 #define RT5033_REGULATOR_LDO_VOLTAGE_MAX		3000000U
 #define RT5033_REGULATOR_LDO_VOLTAGE_STEP		100000U
-#define RT5033_REGULATOR_LDO_VOLTAGE_STEP_NUM		32
+#define RT5033_REGULATOR_LDO_VOLTAGE_STEP_NUM		19
 
 /* RT5033 regulator SAFE LDO output voltage uV */
 #define RT5033_REGULATOR_SAFE_LDO_VOLTAGE		4900000U

commit ad929b7bfb3f12afeb403d6df5a7cf1dd7dcad66
Author: Goldwyn Rodrigues <rgoldwyn@suse.de>
Date:   Mon Aug 2 09:32:06 2021 -0500

    btrfs: mark compressed range uptodate only if all bio succeed
    
    [ Upstream commit 240246f6b913b0c23733cfd2def1d283f8cc9bbe ]
    
    In compression write endio sequence, the range which the compressed_bio
    writes is marked as uptodate if the last bio of the compressed (sub)bios
    is completed successfully. There could be previous bio which may
    have failed which is recorded in cb->errors.
    
    Set the writeback range as uptodate only if cb->errors is zero, as opposed
    to checking only the last bio's status.
    
    Backporting notes: in all versions up to 4.4 the last argument is always
    replaced by "!cb->errors".
    
    CC: stable@vger.kernel.org # 4.4+
    Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
index c71e534ca7ef..919c033b9e31 100644
--- a/fs/btrfs/compression.c
+++ b/fs/btrfs/compression.c
@@ -270,8 +270,7 @@ static void end_compressed_bio_write(struct bio *bio)
 					 cb->start,
 					 cb->start + cb->len - 1,
 					 NULL,
-					 bio->bi_status ?
-					 BLK_STS_OK : BLK_STS_NOTSUPP);
+					 !cb->errors);
 	cb->compressed_pages[0]->mapping = NULL;
 
 	end_compressed_writeback(inode, cb);

commit 28475410de8797517802f2aa9b72660b3b2c123b
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Fri Aug 6 21:56:22 2021 +0800

    staging: android: remove unused uapi/android_alarm.h
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: Idcf4a68d0ebb25e3105bf60b06efbc51da0b6aa5

diff --git a/drivers/staging/android/uapi/android_alarm.h b/drivers/staging/android/uapi/android_alarm.h
deleted file mode 100644
index aa013f6f5f3a..000000000000
--- a/drivers/staging/android/uapi/android_alarm.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* drivers/staging/android/uapi/android_alarm.h
- *
- * Copyright (C) 2006-2007 Google, Inc.
- *
- * 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.
- *
- */
-
-#ifndef _UAPI_LINUX_ANDROID_ALARM_H
-#define _UAPI_LINUX_ANDROID_ALARM_H
-
-#include <linux/ioctl.h>
-#include <linux/time.h>
-
-enum android_alarm_type {
-	/* return code bit numbers or set alarm arg */
-	ANDROID_ALARM_RTC_WAKEUP,
-	ANDROID_ALARM_RTC,
-	ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP,
-	ANDROID_ALARM_ELAPSED_REALTIME,
-	ANDROID_ALARM_SYSTEMTIME,
-
-	ANDROID_ALARM_TYPE_COUNT,
-
-	/* return code bit numbers */
-	/* ANDROID_ALARM_TIME_CHANGE = 16 */
-};
-
-enum android_alarm_return_flags {
-	ANDROID_ALARM_RTC_WAKEUP_MASK = 1U << ANDROID_ALARM_RTC_WAKEUP,
-	ANDROID_ALARM_RTC_MASK = 1U << ANDROID_ALARM_RTC,
-	ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP_MASK =
-				1U << ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP,
-	ANDROID_ALARM_ELAPSED_REALTIME_MASK =
-				1U << ANDROID_ALARM_ELAPSED_REALTIME,
-	ANDROID_ALARM_SYSTEMTIME_MASK = 1U << ANDROID_ALARM_SYSTEMTIME,
-	ANDROID_ALARM_TIME_CHANGE_MASK = 1U << 16
-};
-
-/* Disable alarm */
-#define ANDROID_ALARM_CLEAR(type)           _IO('a', 0 | ((type) << 4))
-
-/* Ack last alarm and wait for next */
-#define ANDROID_ALARM_WAIT                  _IO('a', 1)
-
-#define ALARM_IOW(c, type, size)            _IOW('a', (c) | ((type) << 4), size)
-/* Set alarm */
-#define ANDROID_ALARM_SET(type)             ALARM_IOW(2, type, struct timespec)
-#define ANDROID_ALARM_SET_AND_WAIT(type)    ALARM_IOW(3, type, struct timespec)
-#define ANDROID_ALARM_GET_TIME(type)        ALARM_IOW(4, type, struct timespec)
-#define ANDROID_ALARM_SET_RTC               _IOW('a', 5, struct timespec)
-#define ANDROID_ALARM_BASE_CMD(cmd)         (cmd & ~(_IOC(0, 0, 0xf0, 0)))
-#define ANDROID_ALARM_IOCTL_TO_TYPE(cmd)    (_IOC_NR(cmd) >> 4)
-
-#endif

commit 5b59d622951d009b12cc6551874f94021d8de115
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Fri Aug 6 21:49:54 2021 +0800

    Revert "add some auto test code, maybe useful for someone"
    
    This reverts commit 1b9ac442969c6b1311f7fea188fbc90a3b0480ab.
    
    testcode is unused.
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: I8b770eb8069289e59352e04081de4963cccc6a89

diff --git a/drivers/testcode/Kconfig b/drivers/testcode/Kconfig
deleted file mode 100644
index c5aa4c1a0674..000000000000
--- a/drivers/testcode/Kconfig
+++ /dev/null
@@ -1,17 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-#
-# Input misc drivers configuration
-#
-menuconfig TEST_CODE
-	bool "some test code for kernel"
-	help
-	  Say Y here, and a list of test code will be displayed.
-	  
-	  If unsure, say N.
-
-if TEST_CODE
-	
-config USE_GPIO_GENERATE_WAVE
-	tristate "use gpio to generate square wave"
-	
-endif
diff --git a/drivers/testcode/Makefile b/drivers/testcode/Makefile
deleted file mode 100644
index deda19e16fab..000000000000
--- a/drivers/testcode/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-#
-# Makefile for the test code drivers.
-#
-
-# Each configuration option enables a list of files.
-
-obj-$(CONFIG_USE_GPIO_GENERATE_WAVE)		+= gpio_wave.o
diff --git a/drivers/testcode/gpio_wave.c b/drivers/testcode/gpio_wave.c
deleted file mode 100644
index 3b958ddf53ce..000000000000
--- a/drivers/testcode/gpio_wave.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#include <linux/delay.h>
-#include <linux/platform_device.h>
-#include <linux/clk.h>
-#include <mach/gpio.h>
-#include <linux/wakelock.h>
-
-#include "gpio_wave.h"
-
-struct wave_data {
-	struct delayed_work d_work;
-	int Htime;
-	int Ltime;
-	unsigned int gpio;
-	int cur_value;
-	int last_value;
-	struct device *dev;  
-};
-
-static struct wake_lock w_lock;
-
-static void gpio_wave_dwork_handle(struct work_struct *work)
-{
-	struct wave_data *data = (struct wave_data *)container_of(work, struct wave_data, d_work.work);
-	
-	int delay_time = data->cur_value ? data->Ltime : data->Htime;
-	data->cur_value = !data->cur_value;
-	gpio_set_value(data->gpio, data->cur_value);
-	schedule_delayed_work(&(data->d_work), msecs_to_jiffies(delay_time));
-}
-
-
-static int gpio_wave_probe(struct platform_device *pdev)
-{
-	int ret;
-	struct wave_data *data;
-	struct gpio_wave_platform_data *pdata = pdev->dev.platform_data;
-
-	data = kmalloc(sizeof(struct wave_data), GFP_KERNEL);
-	if (!data) {
-		printk("func %s, line %d, malloc fail\n", __func__, __LINE__);
-		return -ENOMEM;
-	}
-
-	data->dev = &pdev->dev;
-	platform_set_drvdata(pdev, data);
-	
-	if (pdata) {
-		int dtime = pdata->Dvalue ? pdata->Htime : pdata->Ltime;
-		data->gpio = pdata->gpio;
-		data->cur_value = pdata->Dvalue;
-		data->last_value = pdata->Dvalue;
-		data->Htime = pdata->Htime;
-		data->Ltime = pdata->Ltime;
-		
-		ret = gpio_request(data->gpio, NULL);
-		if (ret) {
-			printk("func %s, line %d, gpio request err\n", __func__, __LINE__);
-			return ret;
-		}
-		gpio_direction_output(data->gpio, data->cur_value);
-		gpio_set_value(data->gpio, data->cur_value);
-		wake_lock_init(&w_lock, WAKE_LOCK_SUSPEND, "gpio_wave");
-		INIT_DELAYED_WORK(&(data->d_work), gpio_wave_dwork_handle);
-		wake_lock(&w_lock);
-		schedule_delayed_work(&(data->d_work), msecs_to_jiffies(dtime));
-	}
-	else {
-		kfree(data);
-	}
-	
-	return 0;
-}
-
-static int gpio_wave_remove(struct platform_device *pdev)
-{
-	struct wave_data *data = platform_get_drvdata(pdev);
-	gpio_free(data->gpio);
-	kfree(data);
-	return 0;
-}
-
-static struct platform_driver gpio_wave_driver = {
-	.probe		= gpio_wave_probe,
-	.remove 	= gpio_wave_remove,
-	.driver 	= {
-		.owner	= THIS_MODULE,
-		.name	= "gpio_wave",
-	},
-};
-
-static int __init gpio_wave_init(void)
-{
-	return platform_driver_register(&gpio_wave_driver);
-}
-
-static void __exit gpio_wave_exit(void)
-{
-	platform_driver_unregister(&gpio_wave_driver);
-}
-
-
-module_init(gpio_wave_init);
-module_exit(gpio_wave_exit);
-
-MODULE_DESCRIPTION("Driver for gpio wave");
-MODULE_AUTHOR("lyx, lyx@rock-chips.com");
-MODULE_LICENSE("GPL");
-
diff --git a/drivers/testcode/gpio_wave.h b/drivers/testcode/gpio_wave.h
deleted file mode 100644
index 6ef181b383f9..000000000000
--- a/drivers/testcode/gpio_wave.h
+++ /dev/null
@@ -1,12 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef __GPIO_PWM_H__
-#define __GPIO_PWM_H__
-
-struct gpio_wave_platform_data {
-	unsigned int gpio;	//the pin use to exert spuare wave
-	int Htime;	//spuare wave Hight width
-	int Ltime;	//spuare wave Low width
-	int Dvalue;	//gpio default value 
-};
-
-#endif

commit dea0d2c1519e98bc2ca67c96c516a3237a1f6f24
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Fri Aug 6 19:25:26 2021 +0800

    media: remove unused camera head file
    
    After commit cdc6f7d0b05f ("media: remove unused video drivers"),
    these files are unused, so just remove them.
    
    include/media/camsys_head.h
    include/media/v4l2-chip-ident.h
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: Ib561e90ec55f8f2b51c6d5fe3e03fe25836e511e

diff --git a/include/media/camsys_head.h b/include/media/camsys_head.h
deleted file mode 100644
index 4b9bcc5dd831..000000000000
--- a/include/media/camsys_head.h
+++ /dev/null
@@ -1,294 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef __RKCAMSYS_HEAR_H__
-#define __RKCAMSYS_HEAR_H__
-
-#include <linux/ioctl.h>
-
-/*
-*               C A M S Y S   H E A D   F I L E   V E R S I O N 
-*
-*v0.0.1:
-*        1) test version;
-*v0.0.2:
-*        1) modify camsys_irqcnnt_t;
-*v0.0.3:
-*        1) add support cif phy for marvin;
-*v0.0.4:
-*        1) add clock information in struct camsys_devio_name_s;
-*v0.0.5:
-*        1) add pwren control
-*v0.6.0:
-*        1) add support mipi phy configuration;
-*        2) add support io domain and mclk driver strength configuration;
-*v0.7.0:
-		 1) add flash_trigger_out control
-*v0.8.0:
-		 1) support isp iommu
-*v0.9.0:
-         1) add dev_name in struct camsys_devio_name_s;
-*v0.a.0:
-         1) support external flash IC
-*v0.b.0:
-	1) add CamSys_SensorBit0_CifBit4 in enum camsys_cifio_e.
-*v0.c.0:
-	1) support sensor powerup sequence configurable.
-*v0.d.0:
-	1) powerup sequence type moved to common_head.h.
-*v0.e.0:
-	1) add fs_id, fe_id and some reserved bytes in struct camsys_irqsta_s.
-*v0.f.0:
-	1) add pid in struct camsys_irqsta_s.
-*v1.0.0:
-	1) add enum camsys_mipiphy_dir_e.
-*/
-
-#define CAMSYS_HEAD_VERSION           KERNEL_VERSION(1, 0x0, 0)
-
-#define CAMSYS_MARVIN_DEVNAME         "camsys_marvin"
-#define CAMSYS_CIF0_DEVNAME           "camsys_cif0"
-#define CAMSYS_CIF1_DEVNAME           "camsys_cif1"
-
-#define CAMSYS_NAME_LEN               32
-
-#define CAMSYS_DEVID_MARVIN           0x00000001
-#define CAMSYS_DEVID_CIF_0            0x00000002
-#define CAMSYS_DEVID_CIF_1            0x00000004
-#define CAMSYS_DEVID_INTERNAL         0x000000FF
-
-#define CAMSYS_DEVID_SENSOR_1A        0x01000000
-#define CAMSYS_DEVID_SENSOR_1B        0x02000000
-#define CAMSYS_DEVID_SENSOR_2         0x04000000
-#define CAMSYS_DEVID_EXTERNAL         0xFF000000
-#define CAMSYS_DEVID_EXTERNAL_NUM     8
-
-#define CAMSYS_DEVCFG_FLASHLIGHT      0x00000001
-#define CAMSYS_DEVCFG_PREFLASHLIGHT   0x00000002
-#define CAMSYS_DEVCFG_SHUTTER         0x00000004
-
-typedef struct camsys_irqsta_s {
-    unsigned int ris;                 //Raw interrupt status
-    unsigned int mis;                 //Masked interrupt status
-	unsigned int fs_id; // frame number from Frame Start (FS) short packet
-	unsigned int fe_id; // frame number from Frame End (FE) short packet
-	int pid;
-	unsigned int reserved[3];
-} camsys_irqsta_t;
-
-typedef struct camsys_irqcnnt_s {
-    int          pid;
-    unsigned int timeout;             //us
-
-    unsigned int mis;
-	unsigned int icr;
-} camsys_irqcnnt_t;
-
-typedef enum camsys_mmap_type_e {     //this type can be filled in mmap offset argument      
-    CamSys_Mmap_RegisterMem,
-    CamSys_Mmap_I2cMem,
-
-    CamSys_Mmap_End
-} camsys_mmap_type_t;
-
-typedef struct camsys_querymem_s {
-    camsys_mmap_type_t      mem_type;
-    unsigned long           mem_offset;
-
-    unsigned int            mem_size;
-} camsys_querymem_t;
-
-typedef struct camsys_i2c_info_s {
-    unsigned char     bus_num;
-    unsigned short    slave_addr;
-    unsigned int      reg_addr;       //i2c device register address
-    unsigned int      reg_size;       //register address size
-    unsigned int      val;
-    unsigned int      val_size;       //register value size
-    unsigned int      i2cbuf_directly;
-    unsigned int      i2cbuf_bytes;   
-    unsigned int      speed;          //100000 == 100KHz
-} camsys_i2c_info_t;
-
-typedef struct camsys_reginfo_s {
-    unsigned int      dev_mask;
-    unsigned int      reg_offset;
-    unsigned int      val;
-} camsys_reginfo_t;
-
-typedef enum camsys_sysctrl_ops_e {
-
-    CamSys_Vdd_Start_Tag,
-    CamSys_Avdd,
-    CamSys_Dovdd,
-    CamSys_Dvdd,
-    CamSys_Afvdd,
-    CamSys_Vdd_End_Tag,
-
-    CamSys_Gpio_Start_Tag,    
-    CamSys_PwrDn,
-    CamSys_Rst,
-    CamSys_AfPwr,
-    CamSys_AfPwrDn,
-    CamSys_PwrEn,    
-    CamSys_Gpio_End_Tag,
-
-    CamSys_Clk_Start_Tag,    
-    CamSys_ClkIn,
-    CamSys_Clk_End_Tag,
-
-    CamSys_Phy_Start_Tag,    
-    CamSys_Phy,
-    CamSys_Phy_End_Tag,
-    CamSys_Flash_Trigger_Start_Tag, 
-    CamSys_Flash_Trigger,
-    CamSys_Flash_Trigger_End_Tag,
-    CamSys_IOMMU
-    
-} camsys_sysctrl_ops_t;
-
-typedef struct camsys_regulator_info_s {
-    unsigned char     name[CAMSYS_NAME_LEN];
-    int               min_uv;
-    int               max_uv;
-} camsys_regulator_info_t;
-
-typedef struct camsys_gpio_info_s {
-    unsigned char     name[CAMSYS_NAME_LEN];
-    unsigned int      active;
-} camsys_gpio_info_t;
-
-typedef struct camsys_iommu_s{
-    int client_fd;
-    int map_fd;
-    unsigned long linear_addr;
-    unsigned long len;
-}camsys_iommu_t;
-
-typedef struct camsys_sysctrl_s {
-    unsigned int              dev_mask;
-    camsys_sysctrl_ops_t      ops;
-    unsigned int              on;
-
-    unsigned int              rev[20];
-} camsys_sysctrl_t;
-
-typedef struct camsys_flash_info_s {
-    unsigned char     fl_drv_name[CAMSYS_NAME_LEN];
-    camsys_gpio_info_t        fl; //fl_trig
-    camsys_gpio_info_t        fl_en;
-} camsys_flash_info_t;
-
-enum camsys_mipiphy_dir_e {
-	CamSys_Mipiphy_Rx = 0,
-	CamSys_Mipiphy_Tx = 1,
-};
-
-typedef struct camsys_mipiphy_s {
-    unsigned int                data_en_bit;        // data lane enable bit;
-    unsigned int                bit_rate;           // Mbps/lane
-    unsigned int                phy_index;          // phy0,phy1
-	enum camsys_mipiphy_dir_e   dir;            // direction
-} camsys_mipiphy_t;
-
-typedef enum camsys_fmt_e {
-    CamSys_Fmt_Yuv420_8b = 0x18,
-    CamSys_Fmt_Yuv420_10b = 0x19,
-    CamSys_Fmt_LegacyYuv420_8b = 0x19,
-
-    CamSys_Fmt_Yuv422_8b = 0x1e,
-    CamSys_Fmt_Yuv422_10b = 0x1f,
-
-    CamSys_Fmt_Raw_6b = 0x28,
-    CamSys_Fmt_Raw_7b = 0x29,
-    CamSys_Fmt_Raw_8b = 0x2a,
-    CamSys_Fmt_Raw_10b = 0x2b,
-    CamSys_Fmt_Raw_12b = 0x2c,
-    CamSys_Fmt_Raw_14b = 0x2d,
-} camsys_fmt_t;
-
-typedef enum camsys_cifio_e {
-    CamSys_SensorBit0_CifBit0 = 0x00,
-    CamSys_SensorBit0_CifBit2 = 0x01,
-    CamSys_SensorBit0_CifBit4 = 0x02,
-} camsys_cifio_t;
-
-typedef struct camsys_cifphy_s {
-    unsigned int                cif_num; 
-    camsys_fmt_t                fmt;
-    camsys_cifio_t              cifio;
-    
-} camsys_cifphy_t;
-
-typedef enum camsys_phy_type_e {
-    CamSys_Phy_Mipi,
-    CamSys_Phy_Cif,
-
-    CamSys_Phy_end
-} camsys_phy_type_t;
-
-typedef struct camsys_extdev_phy_s {
-    camsys_phy_type_t           type;
-    union {
-        camsys_mipiphy_t            mipi;
-        camsys_cifphy_t             cif;
-    } info;
-    
-} camsys_extdev_phy_t;
-
-typedef struct camsys_extdev_clk_s {
-    unsigned int in_rate;
-    unsigned int driver_strength;             //0 - 3
-} camsys_extdev_clk_t;
-
-typedef struct camsys_devio_name_s {
-    unsigned char               dev_name[CAMSYS_NAME_LEN];
-    unsigned int                dev_id;
-    
-    camsys_regulator_info_t     avdd;         // sensor avdd power regulator name
-    camsys_regulator_info_t     dovdd;        // sensor dovdd power regulator name
-    camsys_regulator_info_t     dvdd;         // sensor dvdd power regulator name    "NC" describe no regulator
-    camsys_regulator_info_t     afvdd; 
-
-    camsys_gpio_info_t          pwrdn;        // standby gpio name
-    camsys_gpio_info_t          rst;          // hard reset gpio name 
-    camsys_gpio_info_t          afpwr;        // auto focus vcm driver ic power gpio name
-    camsys_gpio_info_t          afpwrdn;      // auto focus vcm driver ic standby gpio 
-    camsys_gpio_info_t          pwren;        // power enable gpio name  
-
-
-    camsys_flash_info_t         fl;
-
-    camsys_extdev_phy_t         phy;
-    camsys_extdev_clk_t         clk;
-    
-    unsigned int                dev_cfg;     // function bit mask configuration 
-} camsys_devio_name_t;
-
-typedef struct camsys_version_s {
-    unsigned int drv_ver;
-    unsigned int head_ver;
-} camsys_version_t;
-
-/*
- *	I O C T L   C O D E S   F O R    R O C K C H I P S   C A M S Y S   D E V I C E S
- *
- */
-#define CAMSYS_IOC_MAGIC  'M'
-#define CAMSYS_IOC_MAXNR  14
-
-#define CAMSYS_VERCHK            _IOR(CAMSYS_IOC_MAGIC,  0, camsys_version_t)
-
-#define CAMSYS_I2CRD             _IOWR(CAMSYS_IOC_MAGIC,  1, camsys_i2c_info_t)
-#define CAMSYS_I2CWR             _IOW(CAMSYS_IOC_MAGIC,  2, camsys_i2c_info_t)
-
-#define CAMSYS_SYSCTRL           _IOW(CAMSYS_IOC_MAGIC,  3, camsys_sysctrl_t) 
-#define CAMSYS_REGRD             _IOWR(CAMSYS_IOC_MAGIC,  4, camsys_reginfo_t)
-#define CAMSYS_REGWR             _IOW(CAMSYS_IOC_MAGIC,  5, camsys_reginfo_t)
-#define CAMSYS_REGISTER_DEVIO    _IOW(CAMSYS_IOC_MAGIC,  6, camsys_devio_name_t)
-#define CAMSYS_DEREGISTER_DEVIO  _IOW(CAMSYS_IOC_MAGIC,  7, unsigned int)
-#define CAMSYS_IRQCONNECT        _IOW(CAMSYS_IOC_MAGIC,  8, camsys_irqcnnt_t)
-#define CAMSYS_IRQWAIT           _IOR(CAMSYS_IOC_MAGIC,  9, camsys_irqsta_t)
-#define CAMSYS_IRQDISCONNECT     _IOW(CAMSYS_IOC_MAGIC,   10, camsys_irqcnnt_t)
-
-#define CAMSYS_QUREYMEM          _IOR(CAMSYS_IOC_MAGIC,  11, camsys_querymem_t)
-#define CAMSYS_QUREYIOMMU        _IOW(CAMSYS_IOC_MAGIC,  12, int)
-#endif
diff --git a/include/media/v4l2-chip-ident.h b/include/media/v4l2-chip-ident.h
deleted file mode 100644
index 359ccc948dfd..000000000000
--- a/include/media/v4l2-chip-ident.h
+++ /dev/null
@@ -1,414 +0,0 @@
-/*
-    v4l2 chip identifiers header
-
-    This header provides a list of chip identifiers that can be returned
-    through the VIDIOC_DBG_G_CHIP_IDENT ioctl.
-
-    Copyright (C) 2007 Hans Verkuil <hverkuil@xs4all.nl>
-
-    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.
-
-    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.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef V4L2_CHIP_IDENT_H_
-#define V4L2_CHIP_IDENT_H_
-
-/* VIDIOC_DBG_G_CHIP_IDENT: identifies the actual chip installed on the board */
-
-/* KEEP THIS LIST ORDERED BY ID!
-   Otherwise it will be hard to see which ranges are already in use when
-   adding support to a new chip family. */
-enum {
-	/* general idents: reserved range 0-49 */
-	V4L2_IDENT_NONE      = 0,       /* No chip matched */
-	V4L2_IDENT_AMBIGUOUS = 1,       /* Match too general, multiple chips matched */
-	V4L2_IDENT_UNKNOWN   = 2,       /* Chip found, but cannot identify */
-
-	/* module tvaudio: reserved range 50-99 */
-	V4L2_IDENT_TVAUDIO = 50,	/* A tvaudio chip, unknown which it is exactly */
-
-	/* Sony IMX074 */
-	V4L2_IDENT_IMX074 = 74,
-
-	/* module saa7110: just ident 100 */
-	V4L2_IDENT_SAA7110 = 100,
-
-	/* module saa7115: reserved range 101-149 */
-	V4L2_IDENT_SAA7111 = 101,
-	V4L2_IDENT_SAA7111A = 102,
-	V4L2_IDENT_SAA7113 = 103,
-	V4L2_IDENT_SAA7114 = 104,
-	V4L2_IDENT_SAA7115 = 105,
-	V4L2_IDENT_SAA7118 = 108,
-
-	/* module saa7127: reserved range 150-199 */
-	V4L2_IDENT_SAA7127 = 157,
-	V4L2_IDENT_SAA7129 = 159,
-
-	/* module cx25840: reserved range 200-249 */
-	V4L2_IDENT_CX25836 = 236,
-	V4L2_IDENT_CX25837 = 237,
-	V4L2_IDENT_CX25840 = 240,
-	V4L2_IDENT_CX25841 = 241,
-	V4L2_IDENT_CX25842 = 242,
-	V4L2_IDENT_CX25843 = 243,
-
-	/* OmniVision sensors: reserved range 250-299 */
-	V4L2_IDENT_OV7670 = 250,
-	V4L2_IDENT_OV7720 = 251,
-	V4L2_IDENT_OV7725 = 252,
-	V4L2_IDENT_OV7660 = 253,
-	V4L2_IDENT_OV9650 = 254,
-	V4L2_IDENT_OV9655 = 255,
-	V4L2_IDENT_SOI968 = 256,
-	V4L2_IDENT_OV9640 = 257,
-	V4L2_IDENT_OV6650 = 258,
-	V4L2_IDENT_OV2640 = 259,
-	V4L2_IDENT_OV9740 = 260,
-	V4L2_IDENT_OV5642 = 261,
-/***********yzm**********/
-	V4L2_IDENT_OV2655 = 262,                            /* ddl@rock-chips.com : ov2655 support */
-	V4L2_IDENT_OV2659 = 263,
-	V4L2_IDENT_OV3640 = 264,
-	V4L2_IDENT_OV5640 = 265,
-	V4L2_IDENT_OV7675 = 266,
-	V4L2_IDENT_OV7690 = 267,
-	V4L2_IDENT_OV3660 = 268,
-	V4L2_IDENT_TP2825 = 269,
-	V4L2_IDENT_GC2155 = 270,
-	V4L2_IDENT_ADV7181 = 271,
-	V4L2_IDENT_GC2145 = 272,
-/***********yzm********end*/
-	/* module saa7146: reserved range 300-309 */
-	V4L2_IDENT_SAA7146 = 300,
-/***********yzm*************/
-	/* Samsung sensors: reserved range 310-319 */
-	V4L2_IDENT_S5K66A = 310,							/* ddl@rock-chips.com : s5k66a support */
-	V4L2_IDENT_S5K5CA = 311,							/* ddl@rock-chips.com : s5k5ca support */
-
-	V4L2_IDENT_MTK9335ISP = 320,							/* ddl@rock-chips.com : MTK9335ISP support */
-	V4L2_IDENT_ICATCH7002_MI1040 = 321,
-	V4L2_IDENT_ICATCH7002_OV5693 =322,
-	V4L2_IDENT_ICATCH7002_OV8825 = 323, //zyt
-	V4L2_IDENT_ICATCH7002_OV2720 = 324, //zyt
-/************yzm************end*/
-	/* Conexant MPEG encoder/decoders: reserved range 400-420 */
-	V4L2_IDENT_CX23418_843 = 403, /* Integrated A/V Decoder on the '418 */
-	V4L2_IDENT_CX23415 = 415,
-	V4L2_IDENT_CX23416 = 416,
-	V4L2_IDENT_CX23417 = 417,
-	V4L2_IDENT_CX23418 = 418,
-
-	/* module bt819: reserved range 810-819 */
-	V4L2_IDENT_BT815A = 815,
-	V4L2_IDENT_BT817A = 817,
-	V4L2_IDENT_BT819A = 819,
-
-	/* module au0828 */
-	V4L2_IDENT_AU0828 = 828,
-
-	/* module bttv: ident 848 + 849 */
-	V4L2_IDENT_BT848 = 848,
-	V4L2_IDENT_BT849 = 849,
-
-	/* module bt856: just ident 856 */
-	V4L2_IDENT_BT856 = 856,
-
-	/* module bt866: just ident 866 */
-	V4L2_IDENT_BT866 = 866,
-
-	/* module bttv: ident 878 + 879 */
-	V4L2_IDENT_BT878 = 878,
-	V4L2_IDENT_BT879 = 879,
-
-	/* module ks0127: reserved range 1120-1129 */
-	V4L2_IDENT_KS0122S = 1122,
-	V4L2_IDENT_KS0127  = 1127,
-	V4L2_IDENT_KS0127B = 1128,
-
-	/* module indycam: just ident 2000 */
-	V4L2_IDENT_INDYCAM = 2000,
-
-	/* module vp27smpx: just ident 2700 */
-	V4L2_IDENT_VP27SMPX = 2700,
-
-	/* module vpx3220: reserved range: 3210-3229 */
-	V4L2_IDENT_VPX3214C = 3214,
-	V4L2_IDENT_VPX3216B = 3216,
-	V4L2_IDENT_VPX3220A = 3220,
-
-	/* VX855 just ident 3409 */
-	/* Other via devs could use 3314, 3324, 3327, 3336, 3364, 3353 */
-	V4L2_IDENT_VIA_VX855 = 3409,
-
-	/* module tvp5150 */
-	V4L2_IDENT_TVP5150 = 5150,
-
-	/* module saa5246a: just ident 5246 */
-	V4L2_IDENT_SAA5246A = 5246,
-
-	/* module saa5249: just ident 5249 */
-	V4L2_IDENT_SAA5249 = 5249,
-
-	/* module cs5345: just ident 5345 */
-	V4L2_IDENT_CS5345 = 5345,
-
-	/* module tea6415c: just ident 6415 */
-	V4L2_IDENT_TEA6415C = 6415,
-
-	/* module tea6420: just ident 6420 */
-	V4L2_IDENT_TEA6420 = 6420,
-
-	/* module saa6588: just ident 6588 */
-	V4L2_IDENT_SAA6588 = 6588,
-
-	/* module vs6624: just ident 6624 */
-	V4L2_IDENT_VS6624 = 6624,
-
-	/* module saa6752hs: reserved range 6750-6759 */
-	V4L2_IDENT_SAA6752HS = 6752,
-	V4L2_IDENT_SAA6752HS_AC3 = 6753,
-
-	/* modules tef6862: just ident 6862 */
-	V4L2_IDENT_TEF6862 = 6862,
-
-	/* module tvp7002: just ident 7002 */
-	V4L2_IDENT_TVP7002 = 7002,
-
-	/* module adv7170: just ident 7170 */
-	V4L2_IDENT_ADV7170 = 7170,
-
-	/* module adv7175: just ident 7175 */
-	V4L2_IDENT_ADV7175 = 7175,
-
-	/* module adv7180: just ident 7180 */
-	V4L2_IDENT_ADV7180 = 7180,
-
-	/* module adv7183: just ident 7183 */
-	V4L2_IDENT_ADV7183 = 7183,
-
-	/* module saa7185: just ident 7185 */
-	V4L2_IDENT_SAA7185 = 7185,
-
-	/* module saa7191: just ident 7191 */
-	V4L2_IDENT_SAA7191 = 7191,
-
-	/* module ths7303: just ident 7303 */
-	V4L2_IDENT_THS7303 = 7303,
-
-	/* module adv7343: just ident 7343 */
-	V4L2_IDENT_ADV7343 = 7343,
-
-	/* module ths7353: just ident 7353 */
-	V4L2_IDENT_THS7353 = 7353,
-
-	/* module adv7393: just ident 7393 */
-	V4L2_IDENT_ADV7393 = 7393,
-
-	/* module adv7604: just ident 7604 */
-	V4L2_IDENT_ADV7604 = 7604,
-
-	/* module saa7706h: just ident 7706 */
-	V4L2_IDENT_SAA7706H = 7706,
-
-	/* module mt9v011, just ident 8243 */
-	V4L2_IDENT_MT9V011 = 8243,
-
-	/* module wm8739: just ident 8739 */
-	V4L2_IDENT_WM8739 = 8739,
-
-	/* module wm8775: just ident 8775 */
-	V4L2_IDENT_WM8775 = 8775,
-
-	/* Marvell controllers starting at 8801 */
-	V4L2_IDENT_CAFE = 8801,
-	V4L2_IDENT_ARMADA610 = 8802,
-
-	/* AKM AK8813/AK8814 */
-	V4L2_IDENT_AK8813 = 8813,
-	V4L2_IDENT_AK8814 = 8814,
-
-	/* module cx23885 and cx25840 */
-	V4L2_IDENT_CX23885    = 8850,
-	V4L2_IDENT_CX23885_AV = 8851, /* Integrated A/V decoder */
-	V4L2_IDENT_CX23887    = 8870,
-	V4L2_IDENT_CX23887_AV = 8871, /* Integrated A/V decoder */
-	V4L2_IDENT_CX23888    = 8880,
-	V4L2_IDENT_CX23888_AV = 8881, /* Integrated A/V decoder */
-	V4L2_IDENT_CX23888_IR = 8882, /* Integrated infrared controller */
-
-	/* module ad9389b: just ident 9389 */
-	V4L2_IDENT_AD9389B = 9389,
-
-	/* module tda9840: just ident 9840 */
-	V4L2_IDENT_TDA9840 = 9840,
-
-	/* module tw9910: just ident 9910 */
-	V4L2_IDENT_TW9910 = 9910,
-
-	/* module sn9c20x: just ident 10000 */
-	V4L2_IDENT_SN9C20X = 10000,
-
-	/* Siliconfile sensors: reserved range 10100 - 10199 */
-	V4L2_IDENT_NOON010PC30	= 10100,/*yzm*/
-	/* module cx231xx and cx25840 */
-	V4L2_IDENT_CX2310X_AV = 23099, /* Integrated A/V decoder; not in '100 */
-	V4L2_IDENT_CX23100    = 23100,
-	V4L2_IDENT_CX23101    = 23101,
-	V4L2_IDENT_CX23102    = 23102,
-
-	/* module msp3400: reserved range 34000-34999 for msp34xx */
-	V4L2_IDENT_MSPX4XX  = 34000, /* generic MSPX4XX identifier, only
-					use internally (tveeprom.c). */
-
-	V4L2_IDENT_MSP3400B = 34002,
-	V4L2_IDENT_MSP3400C = 34003,
-	V4L2_IDENT_MSP3400D = 34004,
-	V4L2_IDENT_MSP3400G = 34007,
-	V4L2_IDENT_MSP3401G = 34017,
-	V4L2_IDENT_MSP3402G = 34027,
-	V4L2_IDENT_MSP3405D = 34054,
-	V4L2_IDENT_MSP3405G = 34057,
-	V4L2_IDENT_MSP3407D = 34074,
-	V4L2_IDENT_MSP3407G = 34077,
-
-	V4L2_IDENT_MSP3410B = 34102,
-	V4L2_IDENT_MSP3410C = 34103,
-	V4L2_IDENT_MSP3410D = 34104,
-	V4L2_IDENT_MSP3410G = 34107,
-	V4L2_IDENT_MSP3411G = 34117,
-	V4L2_IDENT_MSP3412G = 34127,
-	V4L2_IDENT_MSP3415D = 34154,
-	V4L2_IDENT_MSP3415G = 34157,
-	V4L2_IDENT_MSP3417D = 34174,
-	V4L2_IDENT_MSP3417G = 34177,
-
-	V4L2_IDENT_MSP3420G = 34207,
-	V4L2_IDENT_MSP3421G = 34217,
-	V4L2_IDENT_MSP3422G = 34227,
-	V4L2_IDENT_MSP3425G = 34257,
-	V4L2_IDENT_MSP3427G = 34277,
-
-	V4L2_IDENT_MSP3430G = 34307,
-	V4L2_IDENT_MSP3431G = 34317,
-	V4L2_IDENT_MSP3435G = 34357,
-	V4L2_IDENT_MSP3437G = 34377,
-
-	V4L2_IDENT_MSP3440G = 34407,
-	V4L2_IDENT_MSP3441G = 34417,
-	V4L2_IDENT_MSP3442G = 34427,
-	V4L2_IDENT_MSP3445G = 34457,
-	V4L2_IDENT_MSP3447G = 34477,
-
-	V4L2_IDENT_MSP3450G = 34507,
-	V4L2_IDENT_MSP3451G = 34517,
-	V4L2_IDENT_MSP3452G = 34527,
-	V4L2_IDENT_MSP3455G = 34557,
-	V4L2_IDENT_MSP3457G = 34577,
-
-	V4L2_IDENT_MSP3460G = 34607,
-	V4L2_IDENT_MSP3461G = 34617,
-	V4L2_IDENT_MSP3465G = 34657,
-	V4L2_IDENT_MSP3467G = 34677,
-
-	/* module msp3400: reserved range 44000-44999 for msp44xx */
-	V4L2_IDENT_MSP4400G = 44007,
-	V4L2_IDENT_MSP4408G = 44087,
-	V4L2_IDENT_MSP4410G = 44107,
-	V4L2_IDENT_MSP4418G = 44187,
-	V4L2_IDENT_MSP4420G = 44207,
-	V4L2_IDENT_MSP4428G = 44287,
-	V4L2_IDENT_MSP4440G = 44407,
-	V4L2_IDENT_MSP4448G = 44487,
-	V4L2_IDENT_MSP4450G = 44507,
-	V4L2_IDENT_MSP4458G = 44587,
-
-	/* Micron CMOS sensor chips: 45000-45099 */
-	V4L2_IDENT_MT9M001C12ST		= 45000,
-	V4L2_IDENT_MT9M001C12STM	= 45005,
-	V4L2_IDENT_MT9M111		= 45007,
-	V4L2_IDENT_MT9M112		= 45008,
-	V4L2_IDENT_MT9D112		= 45009,		/* ddl@rock-chips.com : MT9D112 support */
-	V4L2_IDENT_MT9V022IX7ATC	= 45010, /* No way to detect "normal" I77ATx */
-	V4L2_IDENT_MT9V022IX7ATM	= 45015, /* and "lead free" IA7ATx chips */
-	V4L2_IDENT_MT9T031		= 45020,
-	V4L2_IDENT_MT9T111		= 45021,
-	V4L2_IDENT_MT9T112		= 45022,
-	V4L2_IDENT_MT9V111		= 45031,
-	V4L2_IDENT_MT9V112		= 45032,
-
-	V4L2_IDENT_MT9P111		= 45033,     /* ddl@rock-chips.com : MT9P111 support */
-	V4L2_IDENT_MT9D113      = 45034,     /* ddl@rock-chips.com : MT9D113 support */
-
-	/* HV7131R CMOS sensor: just ident 46000 */
-	V4L2_IDENT_HV7131R		= 46000,
-
-	/* Sharp RJ54N1CB0C, 0xCB0C = 51980 */
-	V4L2_IDENT_RJ54N1CB0C = 51980,
-
-	/* module m52790: just ident 52790 */
-	V4L2_IDENT_M52790 = 52790,
-
-	/* module cs53132a: just ident 53132 */
-	V4L2_IDENT_CS53l32A = 53132,
-
-	/* modules upd61151 MPEG2 encoder: just ident 54000 */
-	V4L2_IDENT_UPD61161 = 54000,
-	/* modules upd61152 MPEG2 encoder with AC3: just ident 54001 */
-	V4L2_IDENT_UPD61162 = 54001,
-
-	/* module upd64031a: just ident 64031 */
-	V4L2_IDENT_UPD64031A = 64031,
-
-	/* module upd64083: just ident 64083 */
-	V4L2_IDENT_UPD64083 = 64083,
-
-/*************yzm************/
-	V4L2_IDENT_NT99250 = 64100,    /* ddl@rock-chips.com : nt99250 support */
-	V4L2_IDENT_SID130B = 64101,      /* ddl@rock-chips.com : sid130B support */
-
-	V4L2_IDENT_GT2005 = 64110,       /* ddl@rock-chips.com : GT2005 support */
-	V4L2_IDENT_GC0307 = 64111,      /* ddl@rock-chips.com : GC0308 support */
-	V4L2_IDENT_GC0308 = 64112,      /* ddl@rock-chips.com : GC0308 support */
-	V4L2_IDENT_GC0309 = 64113,      /* ddl@rock-chips.com : GC0309 support */
-	V4L2_IDENT_GC2015 = 64114,      /* ddl@rock-chips.com : gc2015 support */
-	V4L2_IDENT_GC0329 = 64115,      /* ddl@rock-chips.com : GC0329 support */
-	V4L2_IDENT_GC2035= 64116,      /* ddl@rock-chips.com : GC0329 support */
-	V4L2_IDENT_GC0328 = 64117,
-
-	V4L2_IDENT_SP0838 = 64120,      /* ddl@rock-chips.com : SP0838 support */
-	V4L2_IDENT_SP2518 = 64121,      /* ddl@rock-chips.com : SP2518 support */
-	V4L2_IDENT_SP0718 = 64122,      /* ddl@rock-chips.com : SP0718 support */
-	V4L2_IDENT_GC0312 = 64124,
-
-	V4L2_IDENT_HI253 = 64130,      /* ddl@rock-chips.com : hi253 support */
-	V4L2_IDENT_HI704 = 64131,      /* ddl@rock-chips.com : hi704 support */
-
-	V4L2_IDENT_SIV120B = 64140,      /* ddl@rock-chips.com : siv120b support */
-	V4L2_IDENT_SIV121D= 64141,      /* ddl@rock-chips.com : sid130B support */
-
-
-	V4L2_IDENT_HM2057 = 64150,
-	V4L2_IDENT_HM5065 = 64151,
-
-	V4L2_IDENT_NT99160 = 64161,    /* oyyf@rock-chips.com : nt99160 support */
-	V4L2_IDENT_NT99340 = 64162,    /* oyyf@rock-chips.com : nt99340 support */
-	V4L2_IDENT_NT99252 = 64163,    /* oyyf@rock-chips.com : nt99252 support */
-	V4L2_IDENT_NT99240 = 64164,    /* oyyf@rock-chips.com : nt99252 support */
-/***********yzm***********end*/
-
-	/* Don't just add new IDs at the end: KEEP THIS LIST ORDERED BY ID! */
-};
-
-#endif

commit dcf6e4c1356048be26a32df6962b932b186c455c
Author: Huang zhibao <hzb@rock-chips.com>
Date:   Fri Aug 6 10:52:11 2021 +0800

    arm64: dts: rockchip: rk3566-box: enabled rknpu_mmu
    
    Signed-off-by: Huang zhibao <hzb@rock-chips.com>
    Change-Id: I05cbb2136ece639443d427839be4cef3b7cd14a7

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi
index bc7f618602ef..ce72808fa3bc 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi
@@ -56,21 +56,6 @@
 		};
 	};
 
-	reserved-memory {
-		#address-cells = <2>;
-		#size-cells = <2>;
-		ranges;
-
-		rknpu_reserved: rknpu {
-			compatible = "shared-dma-pool";
-			inactive;
-			reusable;
-			size = <0x0 0x20000000>;
-			alignment = <0x0 0x1000>;
-			status = "disabled";
-		};
-	};
-
 	spdif-sound {
 		status = "okay";
 		compatible = "simple-audio-card";
@@ -273,13 +258,12 @@
 };
 
 &rknpu {
-	memory-region = <&rknpu_reserved>;
 	rknpu-supply = <&vdd_fixed>;
 	status = "okay";
 };
 
 &rknpu_mmu {
-	status = "disabled";
+	status = "okay";
 };
 
 &rkvdec {

commit 0b1548f20254539c4fcc24f79a50581dfe164cc3
Author: David Wu <david.wu@rock-chips.com>
Date:   Fri Aug 6 15:50:22 2021 +0800

    net: stmmac: dwmac-rk: Set XPCS port1 speed for GMAC1 SGMII mode
    
    When gmac1 is working in SGMII mode, need to additionally
    configure the speed of XPCS port1 according to the current
    link information, otherwise it will not work.
    
    Signed-off-by: David Wu <david.wu@rock-chips.com>
    Change-Id: Ie9407e1566e5ef2804ed50ee203d277f652aca23

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index 7b9896ff7a67..daab8994994a 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -47,6 +47,7 @@ struct rk_gmac_ops {
 	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 (*set_sgmii_speed)(struct rk_priv_data *bsp_priv, int speed);
 	void (*integrated_phy_powerup)(struct rk_priv_data *bsp_priv);
 };
 
@@ -195,10 +196,10 @@ static int xpcs_setup(struct rk_priv_data *bsp_priv, int mode)
 				   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);
 	}
 
@@ -1400,6 +1401,34 @@ static void rk3568_set_gmac_speed(struct rk_priv_data *bsp_priv, int speed)
 			__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 +1436,7 @@ static const struct rk_gmac_ops rk3568_ops = {
 	.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
@@ -2005,6 +2035,8 @@ static void rk_fix_speed(void *priv, unsigned int speed)
 			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:

commit a3e78a55c8cd8a44b638e749a011cfef8a2aa54f
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Wed Aug 4 17:11:56 2021 +0800

    media: rockchip: ispp: fix page fault due to scl exit early
    
    Change-Id: I8a7499a5d6e10707269525f7a0aa7a01b5aae7d6
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c
index 4c2fdecef968..107d123a5b7d 100644
--- a/drivers/media/platform/rockchip/ispp/stream.c
+++ b/drivers/media/platform/rockchip/ispp/stream.c
@@ -2884,7 +2884,7 @@ static void nr_work_event(struct rkispp_device *dev,
 			 seq, readl(base + RKISPP_NR_ADDR_BASE_Y_SHD),
 			 readl(base + RKISPP_SHARP_WR_Y_BASE_SHD));
 
-		for (val = STREAM_S0; val <= STREAM_S2; val++) {
+		for (val = STREAM_S0; val <= STREAM_S2 && !is_fec_en; val++) {
 			stream = &vdev->stream[val];
 			if (stream->stopping && stream->ops->stop)
 				stream->ops->stop(stream);
@@ -3467,7 +3467,8 @@ void rkispp_isr(u32 mis_val, struct rkispp_device *dev)
 			continue;
 		if (stream->stopping &&
 		    stream->ops->is_stopped &&
-		    stream->ops->is_stopped(stream)) {
+		    (stream->ops->is_stopped(stream) ||
+		     dev->ispp_sdev.state == ISPP_STOP)) {
 			stream->stopping = false;
 			stream->streaming = false;
 			stream->is_upd = false;

commit a2bcfddd6e354deda48ff40b3d5fffd00f5891c9
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Tue Aug 3 16:37:09 2021 +0800

    media: rockchip: isp: add v-blank to procfs
    
    Change-Id: Ic62bf4b3fe26712ce4382025b1a234a55453c631
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/procfs.c b/drivers/media/platform/rockchip/isp/procfs.c
index 0ce3eb390fe6..467e46dd3079 100644
--- a/drivers/media/platform/rockchip/isp/procfs.c
+++ b/drivers/media/platform/rockchip/isp/procfs.c
@@ -257,11 +257,12 @@ static int isp_show(struct seq_file *p, void *v)
 			   dev->rdbk_cnt_x2,
 			   dev->rdbk_cnt_x3);
 	else
-		seq_printf(p, "%-10s frame:%d %s time:%dms\n",
+		seq_printf(p, "%-10s frame:%d %s time:%dms v-blank:%dus\n",
 			   "Isp online",
 			   sdev->dbg.id,
 			   (dev->isp_state & ISP_FRAME_END) ? "idle" : "working",
-			   sdev->dbg.interval / 1000 / 1000);
+			   sdev->dbg.interval / 1000 / 1000,
+			   sdev->dbg.delay / 1000);
 
 	if (dev->br_dev.en)
 		seq_printf(p, "%-10s rkispp%d Format:%s%s Size:%dx%d (frame:%d rate:%dms)\n",
diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c
index ba77e7886816..c4f1385cd21e 100644
--- a/drivers/media/platform/rockchip/isp/rkisp.c
+++ b/drivers/media/platform/rockchip/isp/rkisp.c
@@ -2922,8 +2922,14 @@ void rkisp_isp_isr(unsigned int isp_mis,
 	dev->isp_isr_cnt++;
 	/* start edge of v_sync */
 	if (isp_mis & CIF_ISP_V_START) {
-		if (dev->isp_state & ISP_FRAME_END)
+		if (dev->isp_state & ISP_FRAME_END) {
+			u64 tmp = dev->isp_sdev.dbg.interval +
+					dev->isp_sdev.dbg.timestamp;
+
 			dev->isp_sdev.dbg.timestamp = ktime_get_ns();
+			/* v-blank: frame_end - frame_start */
+			dev->isp_sdev.dbg.delay = dev->isp_sdev.dbg.timestamp - tmp;
+		}
 		rkisp_set_state(&dev->isp_state, ISP_FRAME_VS);
 		if (dev->hw_dev->monitor.is_en) {
 			rkisp_set_state(&dev->hw_dev->monitor.state, ISP_FRAME_VS);

commit 396bb2461a9c4c823b036c91d188f08a8b2a1568
Author: Hu Kejun <william.hu@rock-chips.com>
Date:   Mon Jan 11 10:02:54 2021 +0800

    media: rockchip: isp: fix set pdaf in dpcc error
    
    Signed-off-by: Hu Kejun <william.hu@rock-chips.com>
    Change-Id: I1c1782091b0e011535b34b46c69a5cc805f3d103

diff --git a/drivers/media/platform/rockchip/isp/isp_params_v21.c b/drivers/media/platform/rockchip/isp/isp_params_v21.c
index 520237e81c2e..a0741e5887ba 100644
--- a/drivers/media/platform/rockchip/isp/isp_params_v21.c
+++ b/drivers/media/platform/rockchip/isp/isp_params_v21.c
@@ -279,8 +279,8 @@ isp_dpcc_config(struct rkisp_isp_params_vdev *params_vdev,
 		rkisp_iowrite32(params_vdev, value, ISP_DPCC1_PDAF_POINT_0 + 4 * i);
 	}
 
-	rkisp_iowrite32(params_vdev, arg->pdaf_forward_med, ISP_DPCC0_BPT_ADDR);
-	rkisp_iowrite32(params_vdev, arg->pdaf_forward_med, ISP_DPCC1_BPT_ADDR);
+	rkisp_iowrite32(params_vdev, arg->pdaf_forward_med, ISP_DPCC0_PDAF_FORWARD_MED);
+	rkisp_iowrite32(params_vdev, arg->pdaf_forward_med, ISP_DPCC1_PDAF_FORWARD_MED);
 }
 
 static void
diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.c b/drivers/media/platform/rockchip/isp/isp_params_v2x.c
index 181d3efd70a3..b3e0088e8174 100644
--- a/drivers/media/platform/rockchip/isp/isp_params_v2x.c
+++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.c
@@ -318,9 +318,9 @@ isp_dpcc_config(struct rkisp_isp_params_vdev *params_vdev,
 		rkisp_iowrite32(params_vdev, value, ISP_DPCC2_PDAF_POINT_0 + 4 * i);
 	}
 
-	rkisp_iowrite32(params_vdev, arg->pdaf_forward_med, ISP_DPCC0_BPT_ADDR);
-	rkisp_iowrite32(params_vdev, arg->pdaf_forward_med, ISP_DPCC1_BPT_ADDR);
-	rkisp_iowrite32(params_vdev, arg->pdaf_forward_med, ISP_DPCC2_BPT_ADDR);
+	rkisp_iowrite32(params_vdev, arg->pdaf_forward_med, ISP_DPCC0_PDAF_FORWARD_MED);
+	rkisp_iowrite32(params_vdev, arg->pdaf_forward_med, ISP_DPCC1_PDAF_FORWARD_MED);
+	rkisp_iowrite32(params_vdev, arg->pdaf_forward_med, ISP_DPCC2_PDAF_FORWARD_MED);
 }
 
 static void

commit 584d1f62df4f6f2a1d7d71708a7b68b52d3fccca
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Wed Aug 4 16:35:41 2021 +0800

    media: rockchip: ispp: fbc error handle
    
    Change-Id: I9c303ef76831ed45962991a8d7d6e8b67fce78f8
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/ispp/common.h b/drivers/media/platform/rockchip/ispp/common.h
index 94fc3bccf56d..716293976fa6 100644
--- a/drivers/media/platform/rockchip/ispp/common.h
+++ b/drivers/media/platform/rockchip/ispp/common.h
@@ -107,6 +107,7 @@ extern bool rkispp_reg_withstream;
 extern char rkispp_reg_withstream_video_name[RKISPP_VIDEO_NAME_LEN];
 extern unsigned int rkispp_debug_reg;
 extern struct platform_driver rkispp_plat_drv;
+extern char rkispp_dump_path[128];
 
 void rkispp_write(struct rkispp_device *dev, u32 reg, u32 val);
 void rkispp_set_bits(struct rkispp_device *dev, u32 reg, u32 mask, u32 val);
diff --git a/drivers/media/platform/rockchip/ispp/dev.c b/drivers/media/platform/rockchip/ispp/dev.c
index 4eebe1f0d5e1..1182c83da912 100644
--- a/drivers/media/platform/rockchip/ispp/dev.c
+++ b/drivers/media/platform/rockchip/ispp/dev.c
@@ -64,6 +64,10 @@ static unsigned int rkispp_wait_line;
 module_param_named(wait_line, rkispp_wait_line, uint, 0644);
 MODULE_PARM_DESC(wait_line, "rkispp wait line to buf done early");
 
+char rkispp_dump_path[128];
+module_param_string(dump_path, rkispp_dump_path, sizeof(rkispp_dump_path), 0644);
+MODULE_PARM_DESC(dump_path, "rkispp dump debug file path");
+
 void rkispp_set_clk_rate(struct clk *clk, unsigned long rate)
 {
 	if (rkispp_clk_dbg)
diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c
index b3e4385e88f1..4c2fdecef968 100644
--- a/drivers/media/platform/rockchip/ispp/stream.c
+++ b/drivers/media/platform/rockchip/ispp/stream.c
@@ -2269,6 +2269,89 @@ static int rkispp_register_stream_video(struct rkispp_stream *stream)
 	return ret;
 }
 
+static void dump_file(struct rkispp_device *dev, u32 restart_module)
+{
+	struct rkispp_stream_vdev *vdev = &dev->stream_vdev;
+	void __iomem *base = dev->hw_dev->base_addr;
+	struct rkispp_isp_buf_pool *buf;
+	struct rkispp_dummy_buffer *dummy;
+	struct file *fp = NULL;
+	char file[160], reg[48];
+	int i;
+
+	snprintf(file, sizeof(file), "%s/%s%d.reg",
+		 rkispp_dump_path, DRIVER_NAME, dev->dev_id);
+	fp = filp_open(file, O_RDWR | O_CREAT, 0644);
+	if (IS_ERR(fp)) {
+		v4l2_err(&dev->v4l2_dev, "%s open %s fail\n", __func__, file);
+		return;
+	}
+	for (i = 0; i < 0x1000; i += 16) {
+		snprintf(reg, sizeof(reg), "ffb6%04x:  %08x %08x %08x %08x\n",
+			 i, readl(base + i), readl(base + i + 4),
+			 readl(base + i + 8), readl(base + i + 12));
+		kernel_write(fp, reg, strlen(reg), &fp->f_pos);
+	}
+	filp_close(fp, NULL);
+
+	if (restart_module & MONITOR_TNR) {
+		if (vdev->tnr.cur_rd) {
+			snprintf(file, sizeof(file), "%s/%s%d_tnr_cur.fbc",
+				 rkispp_dump_path, DRIVER_NAME, dev->dev_id);
+			fp = filp_open(file, O_RDWR | O_CREAT, 0644);
+			if (IS_ERR(fp)) {
+				v4l2_err(&dev->v4l2_dev,
+					 "%s open %s fail\n", __func__, file);
+				return;
+			}
+			buf = get_pool_buf(dev, vdev->tnr.cur_rd);
+			kernel_write(fp, buf->vaddr[0], vdev->tnr.cur_rd->dbuf[0]->size, &fp->f_pos);
+			filp_close(fp, NULL);
+			v4l2_dbg(1, rkispp_debug, &dev->v4l2_dev,
+				 "dump tnr cur_rd dma:0x%x vaddr:%p\n",
+				 buf->dma[0], buf->vaddr[0]);
+		}
+
+		if (vdev->tnr.nxt_rd && vdev->tnr.nxt_rd != vdev->tnr.cur_rd) {
+			snprintf(file, sizeof(file), "%s/%s%d_tnr_nxt.fbc",
+				 rkispp_dump_path, DRIVER_NAME, dev->dev_id);
+			fp = filp_open(file, O_RDWR | O_CREAT, 0644);
+			if (IS_ERR(fp)) {
+				v4l2_err(&dev->v4l2_dev,
+					 "%s open %s fail\n", __func__, file);
+				return;
+			}
+			buf = get_pool_buf(dev, vdev->tnr.nxt_rd);
+			kernel_write(fp, buf->vaddr[0], vdev->tnr.nxt_rd->dbuf[0]->size, &fp->f_pos);
+			filp_close(fp, NULL);
+			v4l2_dbg(1, rkispp_debug, &dev->v4l2_dev,
+				 "dump tnr nxt_rd dma:0x%x vaddr:%p\n",
+				 buf->dma[0], buf->vaddr[0]);
+		}
+	}
+
+	if (!(restart_module & MONITOR_FEC)) {
+		for (i = 0; i < RKISPP_BUF_MAX; i++) {
+			dummy = &vdev->tnr.buf.wr[i][0];
+			if (!dummy->mem_priv)
+				break;
+			snprintf(file, sizeof(file), "%s/%s%d_iir%d.fbc",
+				 rkispp_dump_path, DRIVER_NAME, dev->dev_id, i);
+			fp = filp_open(file, O_RDWR | O_CREAT, 0644);
+			if (IS_ERR(fp)) {
+				v4l2_err(&dev->v4l2_dev,
+					 "%s open %s fail\n", __func__, file);
+				return;
+			}
+			kernel_write(fp, dummy->vaddr, dummy->size, &fp->f_pos);
+			filp_close(fp, NULL);
+			v4l2_dbg(1, rkispp_debug, &dev->v4l2_dev,
+				 "dump tnr wr dma:0x%x vaddr:%p\n",
+				 dummy->dma_addr, dummy->vaddr);
+		}
+	}
+}
+
 static void restart_module(struct rkispp_device *dev)
 {
 	struct rkispp_monitor *monitor = &dev->stream_vdev.monitor;
@@ -2291,6 +2374,21 @@ static void restart_module(struct rkispp_device *dev)
 		monitor->is_restart = false;
 		goto end;
 	}
+
+	if (rkispp_dump_path[0] == '/')
+		dump_file(dev, monitor->restart_module);
+
+	if (monitor->restart_module & MONITOR_TNR && monitor->tnr.is_err) {
+		rkispp_set_bits(dev, RKISPP_TNR_CTRL, 0, SW_TNR_1ST_FRM);
+		monitor->tnr.is_err = false;
+	}
+	if (monitor->restart_module & MONITOR_NR && monitor->nr.is_err) {
+		rkispp_write(dev, RKISPP_NR_ADDR_BASE_Y,
+			     readl(base + RKISPP_NR_ADDR_BASE_Y_SHD));
+		rkispp_write(dev, RKISPP_NR_ADDR_BASE_UV,
+			     readl(base + RKISPP_NR_ADDR_BASE_UV_SHD));
+		monitor->nr.is_err = false;
+	}
 	rkispp_soft_reset(dev->hw_dev);
 	rkispp_update_regs(dev, RKISPP_CTRL_QUICK, RKISPP_FEC_CROP);
 	writel(ALL_FORCE_UPD, base + RKISPP_CTRL_UPDATE);
@@ -2797,6 +2895,7 @@ static void nr_work_event(struct rkispp_device *dev,
 		if (monitor->is_en) {
 			monitor->nr.time = vdev->nr.dbg.interval / 1000 / 1000;
 			monitor->monitoring_module |= MONITOR_NR;
+			monitor->nr.is_err = false;
 			if (!completion_done(&monitor->nr.cmpl))
 				complete(&monitor->nr.cmpl);
 		}
@@ -3107,6 +3206,7 @@ static void tnr_work_event(struct rkispp_device *dev,
 		if (monitor->is_en) {
 			monitor->tnr.time = vdev->tnr.dbg.interval / 1000 / 1000;
 			monitor->monitoring_module |= MONITOR_TNR;
+			monitor->tnr.is_err = false;
 			if (!completion_done(&monitor->tnr.cmpl))
 				complete(&monitor->tnr.cmpl);
 		}
@@ -3302,9 +3402,10 @@ void rkispp_isr(u32 mis_val, struct rkispp_device *dev)
 {
 	struct rkispp_stream_vdev *vdev;
 	struct rkispp_stream *stream;
-	u32 i, err_mask = NR_LOST_ERR | TNR_LOST_ERR |
-		FBCH_EMPTY_NR | FBCH_EMPTY_TNR | FBCD_DEC_ERR_NR |
-		FBCD_DEC_ERR_TNR | BUS_ERR_NR | BUS_ERR_TNR;
+	u32 i, nr_err = NR_LOST_ERR | FBCH_EMPTY_NR |
+		FBCD_DEC_ERR_NR | BUS_ERR_NR;
+	u32 tnr_err = TNR_LOST_ERR | FBCH_EMPTY_TNR |
+		FBCD_DEC_ERR_TNR | BUS_ERR_TNR;
 	u64 ns = ktime_get_ns();
 
 	v4l2_dbg(3, rkispp_debug, &dev->v4l2_dev,
@@ -3312,7 +3413,11 @@ void rkispp_isr(u32 mis_val, struct rkispp_device *dev)
 
 	vdev = &dev->stream_vdev;
 	dev->isr_cnt++;
-	if (mis_val & err_mask) {
+	if (mis_val & (tnr_err | nr_err)) {
+		if (mis_val & tnr_err)
+			vdev->monitor.tnr.is_err = true;
+		if (mis_val & nr_err)
+			vdev->monitor.nr.is_err = true;
 		dev->isr_err_cnt++;
 		v4l2_err(&dev->v4l2_dev,
 			 "ispp err:0x%x, seq:%d\n",
@@ -3348,7 +3453,7 @@ void rkispp_isr(u32 mis_val, struct rkispp_device *dev)
 	    (dev->isp_mode & ISP_ISPP_QUICK))
 		++dev->ispp_sdev.frm_sync_seq;
 
-	if (mis_val & TNR_INT)
+	if (mis_val & TNR_INT && !dev->hw_dev->is_first)
 		if (rkispp_read(dev, RKISPP_TNR_CTRL) & SW_TNR_1ST_FRM)
 			rkispp_clear_bits(dev, RKISPP_TNR_CTRL, SW_TNR_1ST_FRM);
 
diff --git a/drivers/media/platform/rockchip/ispp/stream.h b/drivers/media/platform/rockchip/ispp/stream.h
index 07c981a5ef6e..728e55497d7d 100644
--- a/drivers/media/platform/rockchip/ispp/stream.h
+++ b/drivers/media/platform/rockchip/ispp/stream.h
@@ -184,6 +184,7 @@ struct module_monitor {
 	struct completion cmpl;
 	u16 time;
 	u8 module;
+	bool is_err;
 };
 
 struct rkispp_monitor {

commit 483aa991420e76a2a5646884b8108bb86528a7fc
Author: Simon Xue <xxm@rock-chips.com>
Date:   Fri Aug 6 09:50:00 2021 +0800

    PCI: rockchip: add checksum for dma trx
    
    Change-Id: Ib51edd5527976a4aa66893937918911d9d1d20c1
    Signed-off-by: Simon Xue <xxm@rock-chips.com>

diff --git a/drivers/pci/controller/rockchip-pcie-dma.c b/drivers/pci/controller/rockchip-pcie-dma.c
index 5e23a51acf03..55028cc4c7b4 100644
--- a/drivers/pci/controller/rockchip-pcie-dma.c
+++ b/drivers/pci/controller/rockchip-pcie-dma.c
@@ -121,6 +121,7 @@
 #define PCIE_DMA_SET_DATA_CHECK_POS	(SZ_1M - 0x4)
 #define PCIE_DMA_SET_LOCAL_IDX_POS	(SZ_1M - 0x8)
 #define PCIE_DMA_SET_BUF_SIZE_POS	(SZ_1M - 0xc)
+#define PCIE_DMA_SET_CHK_SUM_POS	(SZ_1M - 0x10)
 
 #define PCIE_DMA_DATA_CHECK		0x12345678
 #define PCIE_DMA_DATA_ACK_CHECK		0xdeadbeef
@@ -129,6 +130,8 @@
 #define PCIE_DMA_PARAM_SIZE		64
 #define PCIE_DMA_CHN0			0x0
 
+static int enable_check_sum;
+
 struct pcie_misc_dev {
 	struct miscdevice dev;
 	struct dma_trx_obj *obj;
@@ -139,6 +142,18 @@ static inline bool is_rc(struct dma_trx_obj *obj)
 	return (obj->busno == 0);
 }
 
+static unsigned int rk_pcie_check_sum(unsigned int *src, int size)
+{
+	unsigned int result = 0;
+
+	size /= sizeof(*src);
+
+	while (size-- > 0)
+		result ^= *src++;
+
+	return result;
+}
+
 static void rk_pcie_prepare_dma(struct dma_trx_obj *obj,
 			unsigned int idx, unsigned int bus_idx,
 			unsigned int local_idx, size_t buf_size,
@@ -149,6 +164,7 @@ static void rk_pcie_prepare_dma(struct dma_trx_obj *obj,
 	void *virt;
 	unsigned long flags;
 	struct dma_table *table = NULL;
+	unsigned int checksum;
 
 	switch (type) {
 	case PCIE_DMA_DATA_SND:
@@ -170,6 +186,11 @@ static void rk_pcie_prepare_dma(struct dma_trx_obj *obj,
 		writel(local_idx, virt + PCIE_DMA_SET_LOCAL_IDX_POS);
 		writel(buf_size, virt + PCIE_DMA_SET_BUF_SIZE_POS);
 
+		if (enable_check_sum) {
+			checksum = rk_pcie_check_sum(virt, SZ_1M - 0x10);
+			writel(checksum, virt + PCIE_DMA_SET_CHK_SUM_POS);
+		}
+
 		buf_size = SZ_1M;
 		break;
 	case PCIE_DMA_DATA_RCV_ACK:
@@ -274,6 +295,7 @@ static enum hrtimer_restart rk_pcie_scan_timer(struct hrtimer *timer)
 	bool need_ack = false;
 	struct dma_trx_obj *obj = container_of(timer,
 					struct dma_trx_obj, scan_timer);
+	unsigned int check_sum, check_sum_tmp;
 
 	for (i = 0; i < PCIE_DMA_BUF_CNT; i++) {
 		sda_base = obj->mem_base + PCIE_DMA_BUF_SIZE * i;
@@ -289,7 +311,19 @@ static enum hrtimer_restart rk_pcie_scan_timer(struct hrtimer *timer)
 		if (sdv == PCIE_DMA_DATA_CHECK) {
 			if (!need_ack)
 				need_ack = true;
+			if (enable_check_sum) {
+				check_sum = readl(scan_data_addr + PCIE_DMA_SET_CHK_SUM_POS);
+				check_sum_tmp = rk_pcie_check_sum(scan_data_addr, SZ_1M - 0x10);
+				if (check_sum != check_sum_tmp) {
+					pr_err("checksum[%d] failed, 0x%x, should be 0x%x\n",
+					       idx, check_sum_tmp, check_sum);
+					print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET,
+						       32, 4, scan_data_addr, SZ_1M, false);
+				}
+				writel(0x0, scan_data_addr + PCIE_DMA_SET_CHK_SUM_POS);
+			}
 			writel(0x0, scan_data_addr + PCIE_DMA_SET_DATA_CHECK_POS);
+
 			set_bit(i, &obj->local_read_available);
 			rk_pcie_prepare_dma(obj, idx, 0, 0, 0x4,
 					PCIE_DMA_DATA_RCV_ACK);
@@ -646,12 +680,25 @@ static int rk_pcie_debugfs_open(struct inode *inode, struct file *file)
 	return single_open(file, rk_pcie_debugfs_trx_show, inode->i_private);
 }
 
+static ssize_t rk_pcie_debugfs_write(struct file *file, const char __user *user_buf,
+				 size_t count, loff_t *ppos)
+{
+	int ret;
+
+	ret = kstrtoint_from_user(user_buf, count, 0, &enable_check_sum);
+	if (ret)
+		return ret;
+
+	return count;
+}
+
 static const struct file_operations rk_pcie_debugfs_fops = {
 	.owner = THIS_MODULE,
 	.open = rk_pcie_debugfs_open,
 	.read = seq_read,
 	.llseek = seq_lseek,
 	.release = single_release,
+	.write = rk_pcie_debugfs_write,
 };
 #endif
 

commit 9b8db035641f6b1499d326ad68de00be921f5bc2
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Thu Aug 5 17:13:51 2021 +0800

    media: platform: cif: mipi support interlaced capture
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I72e96b45faaf43b50f40cf978ab11717c409d5a0

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index 0df71553b7e2..e07a89ced802 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -1248,6 +1248,7 @@ static void rkcif_assign_new_buffer_init(struct rkcif_stream *stream,
 	u32 frm1_addr_y, frm1_addr_uv;
 	unsigned long flags;
 	struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf;
+	struct csi_channel_info *channel = &dev->channels[channel_id];
 
 	if (mbus_cfg->type == V4L2_MBUS_CSI2 ||
 	    mbus_cfg->type == V4L2_MBUS_CCP2) {
@@ -1281,20 +1282,31 @@ static void rkcif_assign_new_buffer_init(struct rkcif_stream *stream,
 					     stream->curr_buf->buff_addr[RKCIF_PLANE_CBCR]);
 	}
 
-	if (!stream->next_buf) {
-		if (!list_empty(&stream->buf_head)) {
-			stream->next_buf = list_first_entry(&stream->buf_head,
-							    struct rkcif_buffer, queue);
-			list_del(&stream->next_buf->queue);
+	if (stream->cif_fmt_in->field == V4L2_FIELD_INTERLACED) {
+		stream->next_buf = stream->curr_buf;
+		if (stream->next_buf) {
+			rkcif_write_register(dev, frm1_addr_y,
+					     stream->next_buf->buff_addr[RKCIF_PLANE_Y] + (channel->virtual_width / 2));
+			if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
+				rkcif_write_register(dev, frm1_addr_uv,
+						     stream->next_buf->buff_addr[RKCIF_PLANE_CBCR] + (channel->virtual_width / 2));
+		}
+	} else {
+		if (!stream->next_buf) {
+			if (!list_empty(&stream->buf_head)) {
+				stream->next_buf = list_first_entry(&stream->buf_head,
+								    struct rkcif_buffer, queue);
+				list_del(&stream->next_buf->queue);
+			}
 		}
-	}
 
-	if (stream->next_buf) {
-		rkcif_write_register(dev, frm1_addr_y,
-				     stream->next_buf->buff_addr[RKCIF_PLANE_Y]);
-		if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
-			rkcif_write_register(dev, frm1_addr_uv,
-					     stream->next_buf->buff_addr[RKCIF_PLANE_CBCR]);
+		if (stream->next_buf) {
+			rkcif_write_register(dev, frm1_addr_y,
+					     stream->next_buf->buff_addr[RKCIF_PLANE_Y]);
+			if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
+				rkcif_write_register(dev, frm1_addr_uv,
+						     stream->next_buf->buff_addr[RKCIF_PLANE_CBCR]);
+		}
 	}
 	spin_unlock_irqrestore(&stream->vbq_lock, flags);
 
@@ -1335,6 +1347,7 @@ static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
 	struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus;
 	struct rkcif_buffer *buffer = NULL;
 	u32 frm_addr_y, frm_addr_uv;
+	struct csi_channel_info *channel = &dev->channels[channel_id];
 	int ret = 0;
 	unsigned long flags;
 
@@ -1365,11 +1378,17 @@ static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
 				buffer = stream->curr_buf;
 			}
 		} else if (stream->frame_phase == CIF_CSI_FRAME1_READY) {
-			stream->next_buf = list_first_entry(&stream->buf_head,
-							    struct rkcif_buffer, queue);
-			if (stream->next_buf) {
-				list_del(&stream->next_buf->queue);
+			if (stream->cif_fmt_in->field == V4L2_FIELD_INTERLACED) {
+				stream->next_buf = stream->curr_buf;
 				buffer = stream->next_buf;
+
+			} else {
+				stream->next_buf = list_first_entry(&stream->buf_head,
+								    struct rkcif_buffer, queue);
+				if (stream->next_buf) {
+					list_del(&stream->next_buf->queue);
+					buffer = stream->next_buf;
+				}
 			}
 		}
 	} else {
@@ -1378,11 +1397,20 @@ static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
 	spin_unlock_irqrestore(&stream->vbq_lock, flags);
 
 	if (buffer) {
-		rkcif_write_register(dev, frm_addr_y,
-				     buffer->buff_addr[RKCIF_PLANE_Y]);
-		if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
-			rkcif_write_register(dev, frm_addr_uv,
-					     buffer->buff_addr[RKCIF_PLANE_CBCR]);
+		if (stream->cif_fmt_in->field == V4L2_FIELD_INTERLACED &&
+		    stream->frame_phase == CIF_CSI_FRAME1_READY) {
+			rkcif_write_register(dev, frm_addr_y,
+					     buffer->buff_addr[RKCIF_PLANE_Y] + (channel->virtual_width / 2));
+			if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
+				rkcif_write_register(dev, frm_addr_uv,
+						     buffer->buff_addr[RKCIF_PLANE_CBCR] + (channel->virtual_width / 2));
+		} else {
+			rkcif_write_register(dev, frm_addr_y,
+					     buffer->buff_addr[RKCIF_PLANE_Y]);
+			if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
+				rkcif_write_register(dev, frm_addr_uv,
+						     buffer->buff_addr[RKCIF_PLANE_CBCR]);
+		}
 	} else {
 		ret = -EINVAL;
 		v4l2_info(&dev->v4l2_dev,
@@ -1397,7 +1425,7 @@ static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
 static int rkcif_get_new_buffer_wake_up_mode(struct rkcif_stream *stream)
 {
 	int ret = 0;
-	unsigned long flags = 0;
+	unsigned long flags;
 
 	spin_lock_irqsave(&stream->vbq_lock, flags);
 	if (!list_empty(&stream->buf_head)) {
@@ -1681,6 +1709,10 @@ static int rkcif_csi_channel_init(struct rkcif_stream *stream,
 		channel->width *= 2;
 		channel->virtual_width *= 2;
 	}
+	if (stream->cif_fmt_in->field == V4L2_FIELD_INTERLACED) {
+		channel->virtual_width *= 2;
+		channel->height /= 2;
+	}
 
 	channel->data_type = get_data_type(stream->cif_fmt_in->mbus_code,
 					   channel->cmd_mode_en);
@@ -4861,11 +4893,18 @@ static void rkcif_buf_done_prepare(struct rkcif_stream *stream,
 			stream->readout.wk_timestamp = vb_done->vb2_buf.timestamp;
 			spin_unlock_irqrestore(&stream->fps_lock, flags);
 		}
+		if (stream->cif_fmt_in->field == V4L2_FIELD_INTERLACED)
+			vb_done->sequence /= 2;
 	}
 
 	if (cif_dev->hdr.mode == NO_HDR) {
-		if (active_buf)
-			rkcif_vb_done_oneframe(stream, vb_done);
+		if (stream->cif_fmt_in->field == V4L2_FIELD_INTERLACED) {
+			if (stream->frame_phase == CIF_CSI_FRAME1_READY && active_buf)
+				rkcif_vb_done_oneframe(stream, vb_done);
+		} else {
+			if (active_buf)
+				rkcif_vb_done_oneframe(stream, vb_done);
+		}
 	} else {
 		if (cif_dev->is_start_hdr) {
 			spin_lock_irqsave(&cif_dev->hdr_lock, flags);
@@ -5250,7 +5289,7 @@ static bool rkcif_is_reduced_frame_rate(struct rkcif_device *dev)
 	struct rkcif_stream *stream = &dev->stream[RKCIF_STREAM_MIPI_ID0];
 	struct v4l2_rect *raw_rect = &dev->terminal_sensor.raw_rect;
 	u64 fps, timestamp0, timestamp1, diff_time;
-	unsigned long fps_flags = 0;
+	unsigned long fps_flags;
 	unsigned int deviation = 1;
 	bool is_reduced = false;
 
diff --git a/drivers/media/platform/rockchip/cif/version.h b/drivers/media/platform/rockchip/cif/version.h
index 743732aa67d3..627b4a3a11e5 100644
--- a/drivers/media/platform/rockchip/cif/version.h
+++ b/drivers/media/platform/rockchip/cif/version.h
@@ -65,6 +65,8 @@
  *5. mipi csi host add cru rst
  *6. support wake up mode with mipi
  *7. add keepint time to csi2 err for resetting
+ *8. mipi supports pdaf/embedded data
+ *9. mipi supports interlaced capture
  */
 
 #define RKCIF_DRIVER_VERSION RKCIF_API_VERSION

commit f31d69f4bbadd989d9e2e670e29c821129713ea3
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Thu Aug 5 17:08:28 2021 +0800

    media: platform: cif: add dummy buf only for BT.656/BT.1120 multi channels function
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I67eacd18cc2bcae51302911b2b4490314d678362

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index c3d64477fc6b..0df71553b7e2 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -1247,6 +1247,7 @@ static void rkcif_assign_new_buffer_init(struct rkcif_stream *stream,
 	u32 frm0_addr_y, frm0_addr_uv;
 	u32 frm1_addr_y, frm1_addr_uv;
 	unsigned long flags;
+	struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf;
 
 	if (mbus_cfg->type == V4L2_MBUS_CSI2 ||
 	    mbus_cfg->type == V4L2_MBUS_CCP2) {
@@ -1308,21 +1309,19 @@ static void rkcif_assign_new_buffer_init(struct rkcif_stream *stream,
 		for (ch_id = 0; ch_id < RKCIF_MAX_STREAM_DVP; ch_id++) {
 			if (dev->stream[ch_id].is_dvp_yuv_addr_init)
 				continue;
-			if (stream->curr_buf) {
+			if (dummy_buf->dma_addr) {
 				rkcif_write_register(dev,
 						     get_dvp_reg_index_of_frm0_y_addr(ch_id),
-						     stream->curr_buf->buff_addr[RKCIF_PLANE_Y]);
+						     dummy_buf->dma_addr);
 				rkcif_write_register(dev,
 						     get_dvp_reg_index_of_frm0_uv_addr(ch_id),
-						     stream->curr_buf->buff_addr[RKCIF_PLANE_CBCR]);
-			}
-			if (stream->next_buf) {
+						     dummy_buf->dma_addr);
 				rkcif_write_register(dev,
 						     get_dvp_reg_index_of_frm1_y_addr(ch_id),
-						     stream->next_buf->buff_addr[RKCIF_PLANE_Y]);
+						     dummy_buf->dma_addr);
 				rkcif_write_register(dev,
 						     get_dvp_reg_index_of_frm1_uv_addr(ch_id),
-						     stream->next_buf->buff_addr[RKCIF_PLANE_CBCR]);
+						     dummy_buf->dma_addr);
 			}
 		}
 	}
@@ -1470,9 +1469,40 @@ static int rkcif_update_new_buffer_wake_up_mode(struct rkcif_stream *stream)
 			  mbus_cfg->type == V4L2_MBUS_CCP2) ? "mipi/lvds" : "dvp",
 			  stream->id);
 	}
+
 	return ret;
 }
 
+static void rkcif_assign_dummy_buffer(struct rkcif_stream *stream)
+{
+	struct rkcif_device *dev = stream->cifdev;
+	struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus;
+	struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf;
+	unsigned long flags;
+
+	spin_lock_irqsave(&stream->vbq_lock, flags);
+
+	/* for BT.656/BT.1120 multi channels function,
+	 * yuv addr of unused channel must be set
+	 */
+	if (mbus_cfg->type == V4L2_MBUS_BT656 && dummy_buf->vaddr) {
+		rkcif_write_register(dev,
+				     get_dvp_reg_index_of_frm0_y_addr(stream->id),
+				     dummy_buf->dma_addr);
+		rkcif_write_register(dev,
+				     get_dvp_reg_index_of_frm0_uv_addr(stream->id),
+				     dummy_buf->dma_addr);
+		rkcif_write_register(dev,
+				     get_dvp_reg_index_of_frm1_y_addr(stream->id),
+				     dummy_buf->dma_addr);
+		rkcif_write_register(dev,
+				     get_dvp_reg_index_of_frm1_uv_addr(stream->id),
+				     dummy_buf->dma_addr);
+	}
+
+	spin_unlock_irqrestore(&stream->vbq_lock, flags);
+}
+
 static int rkcif_assign_new_buffer_pingpong(struct rkcif_stream *stream,
 					     int init, int channel_id)
 {
@@ -1860,12 +1890,14 @@ static void rkcif_stream_stop(struct rkcif_stream *stream)
 					~CSI_ALL_ERROR_INTEN);
 
 	} else {
-		val = rkcif_read_register(cif_dev, CIF_REG_DVP_CTRL);
-		rkcif_write_register(cif_dev, CIF_REG_DVP_CTRL,
-				     val & (~ENABLE_CAPTURE));
-		rkcif_write_register(cif_dev, CIF_REG_DVP_INTEN, 0x0);
-		rkcif_write_register(cif_dev, CIF_REG_DVP_INTSTAT, 0x3ff);
-		rkcif_write_register(cif_dev, CIF_REG_DVP_FRAME_STATUS, 0x0);
+		if (atomic_read(&cif_dev->pipe.stream_cnt) == 1) {
+			val = rkcif_read_register(cif_dev, CIF_REG_DVP_CTRL);
+			rkcif_write_register(cif_dev, CIF_REG_DVP_CTRL,
+					     val & (~ENABLE_CAPTURE));
+			rkcif_write_register(cif_dev, CIF_REG_DVP_INTEN, 0x0);
+			rkcif_write_register(cif_dev, CIF_REG_DVP_INTSTAT, 0x3ff);
+			rkcif_write_register(cif_dev, CIF_REG_DVP_FRAME_STATUS, 0x0);
+		}
 	}
 
 	stream->state = RKCIF_STATE_READY;
@@ -2001,6 +2033,57 @@ static void rkcif_buf_queue(struct vb2_buffer *vb)
 	spin_unlock_irqrestore(&stream->vbq_lock, flags);
 }
 
+static int rkcif_create_dummy_buf(struct rkcif_stream *stream)
+{
+	u32 fourcc;
+	struct rkcif_device *dev = stream->cifdev;
+	struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf;
+	struct rkcif_hw *hw_dev = dev->hw_dev;
+
+	/* get a maximum plane size */
+	dummy_buf->size = max3(stream->pixm.plane_fmt[0].bytesperline *
+		stream->pixm.height,
+		stream->pixm.plane_fmt[1].sizeimage,
+		stream->pixm.plane_fmt[2].sizeimage);
+	/*
+	 * rk cif don't support output yuyv fmt data
+	 * if user request yuyv fmt, the input mode must be RAW8
+	 * and the width is double Because the real input fmt is
+	 * yuyv
+	 */
+	fourcc  = stream->cif_fmt_out->fourcc;
+	if (fourcc == V4L2_PIX_FMT_YUYV || fourcc == V4L2_PIX_FMT_YVYU ||
+	    fourcc == V4L2_PIX_FMT_UYVY || fourcc == V4L2_PIX_FMT_VYUY)
+		dummy_buf->size *= 2;
+
+	dummy_buf->vaddr = dma_alloc_coherent(hw_dev->dev, dummy_buf->size,
+					      &dummy_buf->dma_addr,
+					      GFP_KERNEL);
+	if (!dummy_buf->vaddr) {
+		v4l2_err(&dev->v4l2_dev,
+			 "Failed to allocate the memory for dummy buffer\n");
+		return -ENOMEM;
+	}
+
+	v4l2_info(&dev->v4l2_dev, "Allocate dummy buffer, size: 0x%08x\n",
+		  dummy_buf->size);
+
+	return 0;
+}
+
+static void rkcif_destroy_dummy_buf(struct rkcif_stream *stream)
+{
+	struct rkcif_device *dev = stream->cifdev;
+	struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf;
+	struct rkcif_hw *hw_dev = dev->hw_dev;
+
+	if (dummy_buf->vaddr)
+		dma_free_coherent(hw_dev->dev, dummy_buf->size,
+				  dummy_buf->vaddr, dummy_buf->dma_addr);
+	dummy_buf->dma_addr = 0;
+	dummy_buf->vaddr = NULL;
+}
+
 static void rkcif_do_cru_reset(struct rkcif_device *dev)
 {
 	struct rkcif_hw *cif_hw = dev->hw_dev;
@@ -2175,6 +2258,9 @@ static void rkcif_stop_streaming(struct vb2_queue *queue)
 	}
 	pm_runtime_put(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);
@@ -2774,6 +2860,16 @@ static int rkcif_start_streaming(struct vb2_queue *queue, unsigned int count)
 	if (ret < 0)
 		goto destroy_buf;
 
+	if (dev->active_sensor &&
+	    dev->active_sensor->mbus.type == V4L2_MBUS_BT656 &&
+	    (!dev->dummy_buf.vaddr)) {
+		ret = rkcif_create_dummy_buf(stream);
+		if (ret < 0) {
+			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) {
@@ -5786,6 +5882,7 @@ void rkcif_irq_pingpong(struct rkcif_device *cif_dev)
 				if (stream->stopping) {
 					rkcif_stream_stop(stream);
 					stream->stopping = false;
+					rkcif_assign_dummy_buffer(stream);
 					wake_up(&stream->wq_stopped);
 					return;
 				}
diff --git a/drivers/media/platform/rockchip/cif/dev.h b/drivers/media/platform/rockchip/cif/dev.h
index f0542656871a..333852216fdc 100644
--- a/drivers/media/platform/rockchip/cif/dev.h
+++ b/drivers/media/platform/rockchip/cif/dev.h
@@ -170,6 +170,12 @@ struct rkcif_buffer {
 	};
 };
 
+struct rkcif_dummy_buffer {
+	void *vaddr;
+	dma_addr_t dma_addr;
+	u32 size;
+};
+
 extern int rkcif_debug;
 
 /*
@@ -541,6 +547,7 @@ struct rkcif_device {
 	unsigned int			wait_line;
 	unsigned int			wait_line_bak;
 	unsigned int			wait_line_cache;
+	struct rkcif_dummy_buffer	dummy_buf;
 	bool				is_start_hdr;
 	bool				reset_work_cancel;
 	bool				iommu_en;

commit dfddfad158c5a0128fceb7dd7a6053ce7eb9e90e
Author: Hu Kejun <william.hu@rock-chips.com>
Date:   Thu Nov 19 18:25:02 2020 +0800

    media: rockchip: cif: support pdaf/embedded data
    
    Signed-off-by: Hu Kejun <william.hu@rock-chips.com>
    Change-Id: I039388158c3febfab8a7cd3f9c53edbeced70a4a
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index 8e778eabe0be..c3d64477fc6b 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -259,18 +259,39 @@ static const struct cif_output_fmt out_fmts[] = {
 		.mplanes = 1,
 		.bpp = { 16 },
 		.raw_bpp = 16,
+		.csi_fmt_val = CSI_WRDDR_TYPE_RAW8,
 		.fmt_type = CIF_FMT_TYPE_RAW,
 	}, {
 		.fourcc = V4L2_PIX_FMT_Y16,
 		.cplanes = 1,
 		.mplanes = 1,
 		.bpp = { 16 },
+		.raw_bpp = 16,
+		.csi_fmt_val	= CSI_WRDDR_TYPE_RAW8,
 		.fmt_type = CIF_FMT_TYPE_RAW,
 	}, {
 		.fourcc = V4L2_PIX_FMT_GREY,
 		.cplanes = 1,
 		.mplanes = 1,
 		.bpp = {8},
+		.raw_bpp = 8,
+		.csi_fmt_val	= CSI_WRDDR_TYPE_RAW8,
+		.fmt_type = CIF_FMT_TYPE_RAW,
+	}, {
+		.fourcc = V4l2_PIX_FMT_EBD8,
+		.cplanes = 1,
+		.mplanes = 1,
+		.bpp = {8},
+		.raw_bpp = 8,
+		.csi_fmt_val	= CSI_WRDDR_TYPE_RAW8,
+		.fmt_type = CIF_FMT_TYPE_RAW,
+	}, {
+		.fourcc = V4l2_PIX_FMT_SPD16,
+		.cplanes = 1,
+		.mplanes = 1,
+		.bpp = {16},
+		.raw_bpp = 16,
+		.csi_fmt_val	= CSI_WRDDR_TYPE_RAW8,
 		.fmt_type = CIF_FMT_TYPE_RAW,
 	}
 
@@ -428,6 +449,18 @@ static const struct cif_input_fmt in_fmts[] = {
 		.csi_fmt_val	= CSI_WRDDR_TYPE_RAW12,
 		.fmt_type	= CIF_FMT_TYPE_RAW,
 		.field		= V4L2_FIELD_NONE,
+	}, {
+		.mbus_code	= MEDIA_BUS_FMT_EBD_1X8,
+		.dvp_fmt_val	= INPUT_MODE_RAW | RAW_DATA_WIDTH_8,
+		.csi_fmt_val	= CSI_WRDDR_TYPE_RAW8,
+		.fmt_type	= CIF_FMT_TYPE_RAW,
+		.field		= V4L2_FIELD_NONE,
+	}, {
+		.mbus_code	= MEDIA_BUS_FMT_SPD_2X8,
+		.dvp_fmt_val	= INPUT_MODE_RAW | RAW_DATA_WIDTH_12,
+		.csi_fmt_val	= CSI_WRDDR_TYPE_RAW12,
+		.fmt_type	= CIF_FMT_TYPE_RAW,
+		.field		= V4L2_FIELD_NONE,
 	}
 };
 
@@ -545,6 +578,10 @@ static unsigned char get_data_type(u32 pixelformat, u8 cmd_mode_en)
 		else /* dsi video mode */
 			return 0x3e;
 	}
+	case MEDIA_BUS_FMT_EBD_1X8:
+		return 0x12;
+	case MEDIA_BUS_FMT_SPD_2X8:
+		return 0x2f;
 
 	default:
 		return 0x2b;
@@ -569,7 +606,7 @@ static int get_csi_crop_align(const struct cif_input_fmt *fmt_in)
 
 static const struct
 cif_input_fmt *get_input_fmt(struct v4l2_subdev *sd, struct v4l2_rect *rect,
-			     u32 pad)
+			     u32 pad, int *vc)
 {
 	struct v4l2_subdev_format fmt;
 	int ret;
@@ -577,6 +614,7 @@ cif_input_fmt *get_input_fmt(struct v4l2_subdev *sd, struct v4l2_rect *rect,
 
 	fmt.pad = pad;
 	fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
+	fmt.reserved[0] = 0;
 	ret = v4l2_subdev_call(sd, pad, get_fmt, NULL, &fmt);
 	if (ret < 0) {
 		v4l2_warn(sd->v4l2_dev,
@@ -584,6 +622,26 @@ cif_input_fmt *get_input_fmt(struct v4l2_subdev *sd, struct v4l2_rect *rect,
 		goto set_default;
 	}
 
+	/* v4l2_subdev_format reserved[0]
+	 * using as mipi virtual channel
+	 */
+	switch (fmt.reserved[0]) {
+	case V4L2_MBUS_CSI2_CHANNEL_3:
+		*vc = 3;
+		break;
+	case V4L2_MBUS_CSI2_CHANNEL_2:
+		*vc = 2;
+		break;
+	case V4L2_MBUS_CSI2_CHANNEL_1:
+		*vc = 1;
+		break;
+	case V4L2_MBUS_CSI2_CHANNEL_0:
+		*vc = 0;
+		break;
+	default:
+		*vc = -1;
+	}
+
 	v4l2_dbg(1, rkcif_debug, sd->v4l2_dev,
 		 "remote fmt: mbus code:0x%x, size:%dx%d, field: %d\n",
 		 fmt.format.code, fmt.format.width,
@@ -1572,7 +1630,7 @@ static int rkcif_csi_channel_init(struct rkcif_stream *stream,
 	if (fmt->fmt_type == CIF_FMT_TYPE_RAW && stream->is_compact) {
 		channel->virtual_width = ALIGN(channel->width * fmt->raw_bpp / 8, 256);
 	} else {
-		if (fmt->fmt_type == CIF_FMT_TYPE_RAW)
+		if (fmt->fmt_type == CIF_FMT_TYPE_RAW && fmt->csi_fmt_val != CSI_WRDDR_TYPE_RAW8)
 			channel->virtual_width = ALIGN(channel->width * 2, 8);
 		else
 			channel->virtual_width = ALIGN(channel->width * fmt->bpp[0] / 8, 8);
@@ -1597,6 +1655,11 @@ static int rkcif_csi_channel_init(struct rkcif_stream *stream,
 	channel->data_type = get_data_type(stream->cif_fmt_in->mbus_code,
 					   channel->cmd_mode_en);
 
+	if (stream->vc >= 0)
+		channel->vc = stream->vc;
+	else
+		channel->vc = channel->id;
+
 	return 0;
 }
 
@@ -1689,10 +1752,10 @@ static int rkcif_csi_channel_set(struct rkcif_stream *stream,
 					 channel->id);
 
 	if (mbus_type  == V4L2_MBUS_CSI2) {
+		//need always enable crop
 		val = CSI_ENABLE_CAPTURE | channel->fmt_val |
 		      channel->cmd_mode_en << 4 | CSI_ENABLE_CROP |
-		      channel->id << 8 | channel->data_type << 10;
-
+		      channel->vc << 8 | channel->data_type << 10;
 		if (stream->is_compact)
 			val |= CSI_ENABLE_MIPI_COMPACT;
 		else
@@ -2202,10 +2265,11 @@ static inline u32 rkcif_scl_ctl(struct rkcif_stream *stream)
  * rkcif_align_bits_per_pixel() - return the bit width of per pixel for stored
  * In raw or jpeg mode, data is stored by 16-bits,so need to align it.
  */
-static u32 rkcif_align_bits_per_pixel(const struct cif_output_fmt *fmt,
+static u32 rkcif_align_bits_per_pixel(struct rkcif_stream *stream,
+				      const struct cif_output_fmt *fmt,
 				      int plane_index)
 {
-	u32 bpp = 0, i;
+	u32 bpp = 0, i, cal = 0;
 
 	if (fmt) {
 		switch (fmt->fourcc) {
@@ -2237,10 +2301,18 @@ static u32 rkcif_align_bits_per_pixel(const struct cif_output_fmt *fmt,
 		case V4L2_PIX_FMT_SGBRG12:
 		case V4L2_PIX_FMT_SBGGR12:
 		case V4L2_PIX_FMT_SBGGR16:
-			bpp = max(fmt->bpp[plane_index], (u8)CIF_RAW_STORED_BIT_WIDTH);
+		case V4l2_PIX_FMT_SPD16:
+		case V4l2_PIX_FMT_EBD8:
+			if (stream->cifdev->chip_id < CHIP_RV1126_CIF) {
+				bpp = max(fmt->bpp[plane_index], (u8)CIF_RAW_STORED_BIT_WIDTH);
+				cal = CIF_RAW_STORED_BIT_WIDTH;
+			} else {
+				bpp = max(fmt->bpp[plane_index], (u8)CIF_RAW_STORED_BIT_WIDTH_RV1126);
+				cal = CIF_RAW_STORED_BIT_WIDTH_RV1126;
+			}
 			for (i = 1; i < 5; i++) {
-				if (i * CIF_RAW_STORED_BIT_WIDTH >= bpp) {
-					bpp = i * CIF_RAW_STORED_BIT_WIDTH;
+				if (i * cal >= bpp) {
+					bpp = i * cal;
 					break;
 				}
 			}
@@ -2259,12 +2331,13 @@ static u32 rkcif_align_bits_per_pixel(const struct cif_output_fmt *fmt,
  * In raw or jpeg mode, data is stored by 16-bits,
  * so need to align virtual line width.
  */
-static u32 rkcif_cal_raw_vir_line_ratio(const struct cif_output_fmt *fmt)
+static u32 rkcif_cal_raw_vir_line_ratio(struct rkcif_stream *stream,
+					const struct cif_output_fmt *fmt)
 {
 	u32 ratio = 0, bpp = 0;
 
 	if (fmt) {
-		bpp = rkcif_align_bits_per_pixel(fmt, 0);
+		bpp = rkcif_align_bits_per_pixel(stream, fmt, 0);
 		ratio = bpp / CIF_YUV_STORED_BIT_WIDTH;
 	}
 
@@ -2324,14 +2397,22 @@ static int rkcif_sanity_check_fmt(struct rkcif_stream *stream,
 	struct rkcif_device *dev = stream->cifdev;
 	struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
 	struct v4l2_rect input, *crop;
+	int vc;
 
-	stream->cif_fmt_in = get_input_fmt(dev->active_sensor->sd,
-					   &input, stream->id + 1);
+	stream->cif_fmt_in = get_input_fmt(dev->terminal_sensor.sd,
+					   &input, stream->id, &vc);
 	if (!stream->cif_fmt_in) {
 		v4l2_err(v4l2_dev, "Input fmt is invalid\n");
 		return -EINVAL;
 	}
 
+	stream->vc = vc;
+	if (stream->cif_fmt_in->mbus_code == MEDIA_BUS_FMT_EBD_1X8 ||
+		stream->cif_fmt_in->mbus_code == MEDIA_BUS_FMT_SPD_2X8) {
+		stream->crop_enable = false;
+		return 0;
+	}
+
 	if (s_crop)
 		crop = (struct v4l2_rect *)s_crop;
 	else
@@ -2559,7 +2640,7 @@ static int rkcif_stream_start(struct rkcif_stream *stream)
 	val = stream->pixm.width;
 	if (stream->cif_fmt_in->fmt_type == CIF_FMT_TYPE_RAW) {
 		fmt = find_output_fmt(stream, stream->pixm.pixelformat);
-		val = stream->pixm.width * rkcif_cal_raw_vir_line_ratio(fmt);
+		val = stream->pixm.width * rkcif_cal_raw_vir_line_ratio(stream, fmt);
 	}
 	rkcif_write_register(dev, CIF_REG_DVP_VIR_LINE_WIDTH, val);
 	rkcif_write_register(dev, CIF_REG_DVP_SET_SIZE,
@@ -2845,7 +2926,7 @@ static void rkcif_set_fmt(struct rkcif_stream *stream,
 	u32 xsubs = 1, ysubs = 1, i;
 	struct rkmodule_hdr_cfg hdr_cfg;
 	struct rkcif_extend_info *extend_line = &stream->extend_line;
-	int ret;
+	int ret, vc;
 
 	fmt = find_output_fmt(stream, pixm->pixelformat);
 	if (!fmt)
@@ -2855,8 +2936,8 @@ static void rkcif_set_fmt(struct rkcif_stream *stream,
 	input_rect.height = RKCIF_DEFAULT_HEIGHT;
 
 	if (dev->active_sensor && dev->active_sensor->sd) {
-		cif_fmt_in = get_input_fmt(dev->active_sensor->sd,
-			      &input_rect, stream->id + 1);
+		cif_fmt_in = get_input_fmt(dev->terminal_sensor.sd,
+			      &input_rect, stream->id, &vc);
 		stream->cif_fmt_in = cif_fmt_in;
 	}
 
@@ -2918,12 +2999,18 @@ static void rkcif_set_fmt(struct rkcif_stream *stream,
 		 * align 8 to bring into correspondence with virtual width.
 		 * to optimize reading and writing of ddr, aliged with 256.
 		 */
+		if (fmt->fmt_type == CIF_FMT_TYPE_RAW &&
+			(stream->cif_fmt_in->mbus_code == MEDIA_BUS_FMT_EBD_1X8 ||
+			stream->cif_fmt_in->mbus_code == MEDIA_BUS_FMT_SPD_2X8)) {
+			stream->is_compact = false;
+		}
+
 		if (fmt->fmt_type == CIF_FMT_TYPE_RAW && stream->is_compact &&
 		    (dev->active_sensor->mbus.type == V4L2_MBUS_CSI2 ||
 		     dev->active_sensor->mbus.type == V4L2_MBUS_CCP2)) {
 			bpl = ALIGN(width * fmt->raw_bpp / 8, 256);
 		} else {
-			bpp = rkcif_align_bits_per_pixel(fmt, i);
+			bpp = rkcif_align_bits_per_pixel(stream, fmt, i);
 			bpl = width * bpp / CIF_YUV_STORED_BIT_WIDTH;
 		}
 		size = bpl * height;
@@ -3139,6 +3226,7 @@ static int rkcif_enum_framesizes(struct file *file, void *prov,
 	struct rkcif_stream *stream = video_drvdata(file);
 	struct rkcif_device *dev = stream->cifdev;
 	struct v4l2_rect input_rect;
+	int vc;
 
 	if (fsize->index != 0)
 		return -EINVAL;
@@ -3149,9 +3237,9 @@ static int rkcif_enum_framesizes(struct file *file, void *prov,
 	input_rect.width = RKCIF_DEFAULT_WIDTH;
 	input_rect.height = RKCIF_DEFAULT_HEIGHT;
 
-	if (dev->active_sensor && dev->active_sensor->sd)
-		get_input_fmt(dev->active_sensor->sd,
-			      &input_rect, stream->id + 1);
+	if (dev->terminal_sensor.sd)
+		get_input_fmt(dev->terminal_sensor.sd,
+			      &input_rect, stream->id, &vc);
 
 	fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE;
 	s->min_width = CIF_MIN_WIDTH;
@@ -4423,7 +4511,7 @@ static void rkcif_dynamic_crop(struct rkcif_stream *stream)
 
 		if (stream->cif_fmt_in->fmt_type == CIF_FMT_TYPE_RAW) {
 			fmt = find_output_fmt(stream, stream->pixm.pixelformat);
-			crop_vwidth = raw_width * rkcif_cal_raw_vir_line_ratio(fmt);
+			crop_vwidth = raw_width * rkcif_cal_raw_vir_line_ratio(stream, fmt);
 		}
 		rkcif_write_register(cif_dev, CIF_REG_DVP_VIR_LINE_WIDTH, crop_vwidth);
 
@@ -5350,6 +5438,114 @@ static void rkcif_detect_wake_up_mode_change(struct rkcif_stream *stream)
 	}
 }
 
+static u32 rkisp_mbus_pixelcode_to_v4l2(u32 pixelcode)
+{
+	u32 pixelformat;
+
+	switch (pixelcode) {
+	case MEDIA_BUS_FMT_Y8_1X8:
+		pixelformat = V4L2_PIX_FMT_GREY;
+		break;
+	case MEDIA_BUS_FMT_SBGGR8_1X8:
+		pixelformat = V4L2_PIX_FMT_SBGGR8;
+		break;
+	case MEDIA_BUS_FMT_SGBRG8_1X8:
+		pixelformat = V4L2_PIX_FMT_SGBRG8;
+		break;
+	case MEDIA_BUS_FMT_SGRBG8_1X8:
+		pixelformat = V4L2_PIX_FMT_SGRBG8;
+		break;
+	case MEDIA_BUS_FMT_SRGGB8_1X8:
+		pixelformat = V4L2_PIX_FMT_SRGGB8;
+		break;
+	case MEDIA_BUS_FMT_Y10_1X10:
+		pixelformat = V4L2_PIX_FMT_Y10;
+		break;
+	case MEDIA_BUS_FMT_SBGGR10_1X10:
+		pixelformat = V4L2_PIX_FMT_SBGGR10;
+		break;
+	case MEDIA_BUS_FMT_SGBRG10_1X10:
+		pixelformat = V4L2_PIX_FMT_SGBRG10;
+		break;
+	case MEDIA_BUS_FMT_SGRBG10_1X10:
+		pixelformat = V4L2_PIX_FMT_SGRBG10;
+		break;
+	case MEDIA_BUS_FMT_SRGGB10_1X10:
+		pixelformat = V4L2_PIX_FMT_SRGGB10;
+		break;
+	case MEDIA_BUS_FMT_Y12_1X12:
+		pixelformat = V4L2_PIX_FMT_Y12;
+		break;
+	case MEDIA_BUS_FMT_SBGGR12_1X12:
+		pixelformat = V4L2_PIX_FMT_SBGGR12;
+		break;
+	case MEDIA_BUS_FMT_SGBRG12_1X12:
+		pixelformat = V4L2_PIX_FMT_SGBRG12;
+		break;
+	case MEDIA_BUS_FMT_SGRBG12_1X12:
+		pixelformat = V4L2_PIX_FMT_SGRBG12;
+		break;
+	case MEDIA_BUS_FMT_SRGGB12_1X12:
+		pixelformat = V4L2_PIX_FMT_SRGGB12;
+		break;
+	case MEDIA_BUS_FMT_SPD_2X8:
+		pixelformat = V4l2_PIX_FMT_SPD16;
+		break;
+	case MEDIA_BUS_FMT_EBD_1X8:
+		pixelformat = V4l2_PIX_FMT_EBD8;
+		break;
+	default:
+		pixelformat = V4L2_PIX_FMT_SRGGB10;
+	}
+
+	return pixelformat;
+}
+
+void rkcif_set_default_fmt(struct rkcif_device *cif_dev)
+{
+	struct v4l2_subdev_selection input_sel;
+	struct v4l2_pix_format_mplane pixm;
+	struct v4l2_subdev_format fmt;
+	int stream_num = 0;
+	int ret, i;
+
+	if (cif_dev->chip_id < CHIP_RV1126_CIF)
+		return;
+
+	stream_num = RKCIF_MAX_STREAM_MIPI;
+
+	if (!cif_dev->terminal_sensor.sd)
+		rkcif_update_sensor_info(&cif_dev->stream[0]);
+
+	if (cif_dev->terminal_sensor.sd) {
+		for (i = 0; i < stream_num; i++) {
+			if (i == RKCIF_STREAM_MIPI_ID3)
+				cif_dev->stream[i].is_compact = false;
+			memset(&fmt, 0, sizeof(fmt));
+			fmt.pad = i;
+			fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
+			v4l2_subdev_call(cif_dev->terminal_sensor.sd, pad, get_fmt, NULL, &fmt);
+
+			memset(&pixm, 0, sizeof(pixm));
+			pixm.pixelformat = rkisp_mbus_pixelcode_to_v4l2(fmt.format.code);
+			pixm.width = fmt.format.width;
+			pixm.height = fmt.format.height;
+
+			memset(&input_sel, 0, sizeof(input_sel));
+			input_sel.pad = i;
+			input_sel.target = V4L2_SEL_TGT_CROP_BOUNDS;
+			ret = v4l2_subdev_call(cif_dev->terminal_sensor.sd,
+					       pad, get_selection, NULL,
+					       &input_sel);
+			if (!ret) {
+				pixm.width = input_sel.r.width;
+				pixm.height = input_sel.r.height;
+			}
+			rkcif_set_fmt(&cif_dev->stream[i], &pixm, false);
+		}
+	}
+}
+
 void rkcif_irq_pingpong(struct rkcif_device *cif_dev)
 {
 	struct rkcif_stream *stream;
diff --git a/drivers/media/platform/rockchip/cif/dev.c b/drivers/media/platform/rockchip/cif/dev.c
index ef6f0b556835..5fe6aec953af 100644
--- a/drivers/media/platform/rockchip/cif/dev.c
+++ b/drivers/media/platform/rockchip/cif/dev.c
@@ -617,6 +617,7 @@ static int rkcif_create_links(struct rkcif_device *dev)
 
 static int _set_pipeline_default_fmt(struct rkcif_device *dev)
 {
+	rkcif_set_default_fmt(dev);
 	return 0;
 }
 
diff --git a/drivers/media/platform/rockchip/cif/dev.h b/drivers/media/platform/rockchip/cif/dev.h
index 57e88e6cbb8c..f0542656871a 100644
--- a/drivers/media/platform/rockchip/cif/dev.h
+++ b/drivers/media/platform/rockchip/cif/dev.h
@@ -429,6 +429,7 @@ struct rkcif_stream {
 	struct rkcif_readout_stats	readout;
 	unsigned int			fs_cnt_in_single_frame;
 	u64				line_int_cnt;
+	int				vc;
 	bool				stopping;
 	bool				crop_enable;
 	bool				crop_dyn_en;
@@ -565,6 +566,7 @@ int rkcif_register_stream_vdevs(struct rkcif_device *dev,
 				int stream_num,
 				bool is_multi_input);
 void rkcif_stream_init(struct rkcif_device *dev, u32 id);
+void rkcif_set_default_fmt(struct rkcif_device *cif_dev);
 void rkcif_irq_oneframe(struct rkcif_device *cif_dev);
 void rkcif_irq_pingpong(struct rkcif_device *cif_dev);
 void rkcif_soft_reset(struct rkcif_device *cif_dev,
diff --git a/drivers/media/platform/rockchip/cif/mipi-csi2.c b/drivers/media/platform/rockchip/cif/mipi-csi2.c
index 3f642f75bb5d..ebc7d97b3287 100644
--- a/drivers/media/platform/rockchip/cif/mipi-csi2.c
+++ b/drivers/media/platform/rockchip/cif/mipi-csi2.c
@@ -297,7 +297,7 @@ static void csi2_enable(struct csi2_dev *csi2,
 		write_csihost_reg(base, CSIHOST_CONTROL,
 				  SW_CPHY_EN(0) | SW_DSI_EN(0));
 		write_csihost_reg(base, CSIHOST_MSK1, 0);
-		write_csihost_reg(base, CSIHOST_MSK2, 0);
+		write_csihost_reg(base, CSIHOST_MSK2, 0xf000);
 	}
 
 	write_csihost_reg(base, CSIHOST_RESETN, 1);
diff --git a/drivers/media/platform/rockchip/cif/regs.h b/drivers/media/platform/rockchip/cif/regs.h
index 65c6042330f7..b8f1f01f515a 100644
--- a/drivers/media/platform/rockchip/cif/regs.h
+++ b/drivers/media/platform/rockchip/cif/regs.h
@@ -209,6 +209,7 @@ enum cif_reg_index {
 /* Check if swap y and c in bt1120 mode */
 #define CIF_FETCH_IS_Y_FIRST(val)	((val >> 5) & 0x3)
 #define CIF_RAW_STORED_BIT_WIDTH	(16U)
+#define CIF_RAW_STORED_BIT_WIDTH_RV1126	(8U)
 #define CIF_YUV_STORED_BIT_WIDTH	(8U)
 
 /* RK1808 & RV1126 CIF CSI & LVDS Registers Offset */

commit 7d73deedd31c9ac26c2ac6161844bf837f0ea5a2
Author: Allon Huang <allon.huang@rock-chips.com>
Date:   Wed May 26 15:47:58 2021 +0800

    media: platform: rockchip: cif: add keeping time to csi2 err for resetting
    
    Signed-off-by: Allon Huang <allon.huang@rock-chips.com>
    Change-Id: I0ecd5aad0a91553b8a978c23aceae8c5451892f5
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index f8758af72d10..8e778eabe0be 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -4214,19 +4214,49 @@ static bool rkcif_is_csi2_err_trigger_reset(struct rkcif_timer *timer)
 						struct rkcif_device,
 						reset_watchdog_timer);
 	struct rkcif_stream *stream = &dev->stream[RKCIF_STREAM_MIPI_ID0];
-
-	bool is_triggered = false;
+	bool is_triggered = false, is_assign_triggered = false, is_first_err = false;
 	unsigned long flags;
+	u64 cur_time, diff_time;
 
 	spin_lock_irqsave(&timer->csi2_err_lock, flags);
 
 	if (timer->csi2_err_cnt_even != 0 &&
 	    timer->csi2_err_cnt_odd != 0) {
-		is_triggered = true;
 		timer->csi2_err_cnt_odd = 0;
 		timer->csi2_err_cnt_even = 0;
 		timer->reset_src = RKCIF_RESET_SRC_ERR_CSI2;
-		v4l2_info(&dev->v4l2_dev, "do csi2 err reset\n");
+		timer->csi2_err_triggered_cnt++;
+		if (timer->csi2_err_triggered_cnt == 1) {
+			is_first_err = true;
+			timer->csi2_first_err_timestamp = ktime_get_ns();
+		}
+
+		is_assign_triggered = true;
+
+		v4l2_info(&dev->v4l2_dev,
+			  "find csi2 err cnt is:%d\n",
+			  timer->csi2_err_triggered_cnt);
+	}
+
+	if (!is_first_err) {
+		if (timer->csi2_err_triggered_cnt >= 1) {
+			cur_time = ktime_get_ns();
+			diff_time = cur_time - timer->csi2_first_err_timestamp;
+			diff_time = div_u64(diff_time, 1000000);
+			if (diff_time >= timer->err_time_interval) {
+				is_triggered = true;
+				v4l2_info(&dev->v4l2_dev, "trigger reset for time out of csi err\n");
+				goto end_judge;
+			}
+
+			if (!is_assign_triggered &&
+			   (timer->csi2_err_cnt_odd == 0 ||
+			    timer->csi2_err_cnt_even == 0)) {
+				is_triggered = true;
+				v4l2_info(&dev->v4l2_dev, "trigger reset for csi err\n");
+				goto end_judge;
+			}
+		}
 	}
 
 	/*
@@ -4238,7 +4268,7 @@ static bool rkcif_is_csi2_err_trigger_reset(struct rkcif_timer *timer)
 		is_triggered = true;
 		v4l2_info(&dev->v4l2_dev, "reset for fs & fe not paired\n");
 	}
-
+end_judge:
 	spin_unlock_irqrestore(&timer->csi2_err_lock, flags);
 
 	return is_triggered;
@@ -4999,6 +5029,7 @@ static int rkcif_do_reset_work(struct rkcif_device *cif_dev,
 	rkcif_start_luma(&cif_dev->luma_vdev,
 			 cif_dev->stream[RKCIF_STREAM_MIPI_ID0].cif_fmt_in);
 
+	timer->csi2_err_triggered_cnt = 0;
 	rkcif_monitor_reset_event(cif_dev);
 
 	v4l2_dbg(1, rkcif_debug, &cif_dev->v4l2_dev, "do rkcif reset successfully!\n");
diff --git a/drivers/media/platform/rockchip/cif/dev.c b/drivers/media/platform/rockchip/cif/dev.c
index d1d8d0b0261d..ef6f0b556835 100644
--- a/drivers/media/platform/rockchip/cif/dev.c
+++ b/drivers/media/platform/rockchip/cif/dev.c
@@ -1035,6 +1035,8 @@ static void rkcif_init_reset_monitor(struct rkcif_device *dev)
 	timer->csi2_err_cnt_odd = 0;
 	timer->csi2_err_fs_fe_cnt = 0;
 	timer->csi2_err_fs_fe_detect_cnt = 0;
+	timer->csi2_err_triggered_cnt = 0;
+	timer->csi2_first_err_timestamp = 0;
 
 	timer_setup(&timer->timer, rkcif_reset_watchdog_timer_handler, 0);
 
diff --git a/drivers/media/platform/rockchip/cif/dev.h b/drivers/media/platform/rockchip/cif/dev.h
index e2f3e8e30d14..57e88e6cbb8c 100644
--- a/drivers/media/platform/rockchip/cif/dev.h
+++ b/drivers/media/platform/rockchip/cif/dev.h
@@ -370,8 +370,10 @@ struct rkcif_timer {
 	unsigned int		raw_height;
 	/* unit: ms */
 	unsigned int		err_time_interval;
-	unsigned long		frame_end_cycle_us;
+	unsigned int		csi2_err_triggered_cnt;
 	unsigned int		notifer_called_cnt;
+	unsigned long		frame_end_cycle_us;
+	u64			csi2_first_err_timestamp;
 	bool			is_triggered;
 	bool			is_buf_stop_update;
 	bool			is_running;
diff --git a/drivers/media/platform/rockchip/cif/version.h b/drivers/media/platform/rockchip/cif/version.h
index 7cd2f711a3de..743732aa67d3 100644
--- a/drivers/media/platform/rockchip/cif/version.h
+++ b/drivers/media/platform/rockchip/cif/version.h
@@ -64,6 +64,7 @@
  *4. register cif itf dev when clear unready subdev
  *5. mipi csi host add cru rst
  *6. support wake up mode with mipi
+ *7. add keepint time to csi2 err for resetting
  */
 
 #define RKCIF_DRIVER_VERSION RKCIF_API_VERSION

commit 500585fdc15b6338a6157f967f29f6d01c98097e
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Mon Jul 5 17:39:39 2021 +0800

    media: rockchip: cif: mipi wakes up buf by line int
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: If10afeec22ce89a52f7c0e0e454005ca3c3cdc5e

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index 3dfaac4c870c..f8758af72d10 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -1107,9 +1107,10 @@ static int rkcif_assign_new_buffer_oneframe(struct rkcif_stream *stream,
 	struct rkcif_buffer *buffer = NULL;
 	u32 frm_addr_y = CIF_REG_DVP_FRM0_ADDR_Y;
 	u32 frm_addr_uv = CIF_REG_DVP_FRM0_ADDR_UV;
+	unsigned long flags;
 	int ret = 0;
 
-	spin_lock(&stream->vbq_lock);
+	spin_lock_irqsave(&stream->vbq_lock, flags);
 	if (stat == RKCIF_YUV_ADDR_STATE_INIT) {
 		if (!stream->curr_buf) {
 			if (!list_empty(&stream->buf_head)) {
@@ -1157,7 +1158,6 @@ static int rkcif_assign_new_buffer_oneframe(struct rkcif_stream *stream,
 		} else {
 			buffer = NULL;
 		}
-
 		if (stream->frame_phase == CIF_CSI_FRAME0_READY) {
 			frm_addr_y = CIF_REG_DVP_FRM0_ADDR_Y;
 			frm_addr_uv = CIF_REG_DVP_FRM0_ADDR_UV;
@@ -1177,7 +1177,7 @@ static int rkcif_assign_new_buffer_oneframe(struct rkcif_stream *stream,
 				 "not active buffer, frame Drop\n");
 		}
 	}
-	spin_unlock(&stream->vbq_lock);
+	spin_unlock_irqrestore(&stream->vbq_lock, flags);
 	return ret;
 }
 
@@ -1188,6 +1188,7 @@ static void rkcif_assign_new_buffer_init(struct rkcif_stream *stream,
 	struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus;
 	u32 frm0_addr_y, frm0_addr_uv;
 	u32 frm1_addr_y, frm1_addr_uv;
+	unsigned long flags;
 
 	if (mbus_cfg->type == V4L2_MBUS_CSI2 ||
 	    mbus_cfg->type == V4L2_MBUS_CCP2) {
@@ -1202,7 +1203,7 @@ static void rkcif_assign_new_buffer_init(struct rkcif_stream *stream,
 		frm1_addr_uv = get_dvp_reg_index_of_frm1_uv_addr(channel_id);
 	}
 
-	spin_lock(&stream->vbq_lock);
+	spin_lock_irqsave(&stream->vbq_lock, flags);
 
 	if (!stream->curr_buf) {
 		if (!list_empty(&stream->buf_head)) {
@@ -1236,6 +1237,7 @@ static void rkcif_assign_new_buffer_init(struct rkcif_stream *stream,
 			rkcif_write_register(dev, frm1_addr_uv,
 					     stream->next_buf->buff_addr[RKCIF_PLANE_CBCR]);
 	}
+	spin_unlock_irqrestore(&stream->vbq_lock, flags);
 
 	stream->is_dvp_yuv_addr_init = true;
 
@@ -1267,7 +1269,6 @@ static void rkcif_assign_new_buffer_init(struct rkcif_stream *stream,
 		}
 	}
 
-	spin_unlock(&stream->vbq_lock);
 }
 
 static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
@@ -1278,6 +1279,7 @@ static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
 	struct rkcif_buffer *buffer = NULL;
 	u32 frm_addr_y, frm_addr_uv;
 	int ret = 0;
+	unsigned long flags;
 
 	if (mbus_cfg->type == V4L2_MBUS_CSI2 ||
 	    mbus_cfg->type == V4L2_MBUS_CCP2) {
@@ -1296,7 +1298,7 @@ static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
 			      get_dvp_reg_index_of_frm1_uv_addr(channel_id);
 	}
 
-	spin_lock(&stream->vbq_lock);
+	spin_lock_irqsave(&stream->vbq_lock, flags);
 	if (!list_empty(&stream->buf_head)) {
 		if (stream->frame_phase == CIF_CSI_FRAME0_READY) {
 			stream->curr_buf = list_first_entry(&stream->buf_head,
@@ -1316,7 +1318,85 @@ static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
 	} else {
 		buffer = NULL;
 	}
-	spin_unlock(&stream->vbq_lock);
+	spin_unlock_irqrestore(&stream->vbq_lock, flags);
+
+	if (buffer) {
+		rkcif_write_register(dev, frm_addr_y,
+				     buffer->buff_addr[RKCIF_PLANE_Y]);
+		if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
+			rkcif_write_register(dev, frm_addr_uv,
+					     buffer->buff_addr[RKCIF_PLANE_CBCR]);
+	} else {
+		ret = -EINVAL;
+		v4l2_info(&dev->v4l2_dev,
+			 "not active buffer, skip current frame, %s stream[%d]\n",
+			 (mbus_cfg->type == V4L2_MBUS_CSI2 ||
+			  mbus_cfg->type == V4L2_MBUS_CCP2) ? "mipi/lvds" : "dvp",
+			  stream->id);
+	}
+	return ret;
+}
+
+static int rkcif_get_new_buffer_wake_up_mode(struct rkcif_stream *stream)
+{
+	int ret = 0;
+	unsigned long flags = 0;
+
+	spin_lock_irqsave(&stream->vbq_lock, flags);
+	if (!list_empty(&stream->buf_head)) {
+		if (stream->line_int_cnt % 2) {
+			stream->curr_buf = list_first_entry(&stream->buf_head,
+							    struct rkcif_buffer, queue);
+			if (stream->curr_buf)
+				list_del(&stream->curr_buf->queue);
+		} else {
+			stream->next_buf = list_first_entry(&stream->buf_head,
+							    struct rkcif_buffer, queue);
+			if (stream->next_buf)
+				list_del(&stream->next_buf->queue);
+		}
+		stream->is_buf_active = true;
+	} else {
+		ret = -EINVAL;
+		stream->is_buf_active = false;
+	}
+	spin_unlock_irqrestore(&stream->vbq_lock, flags);
+
+	return ret;
+}
+
+static int rkcif_update_new_buffer_wake_up_mode(struct rkcif_stream *stream)
+{
+	struct rkcif_device *dev = stream->cifdev;
+	struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus;
+	struct rkcif_buffer *buffer = NULL;
+	u32 frm_addr_y, frm_addr_uv;
+	int channel_id = stream->id;
+	int ret = 0;
+
+	if (mbus_cfg->type == V4L2_MBUS_CSI2 ||
+	    mbus_cfg->type == V4L2_MBUS_CCP2) {
+		frm_addr_y = stream->frame_phase & CIF_CSI_FRAME0_READY ?
+			     get_reg_index_of_frm0_y_addr(channel_id) :
+			     get_reg_index_of_frm1_y_addr(channel_id);
+		frm_addr_uv = stream->frame_phase & CIF_CSI_FRAME0_READY ?
+			      get_reg_index_of_frm0_uv_addr(channel_id) :
+			      get_reg_index_of_frm1_uv_addr(channel_id);
+	} else {
+		frm_addr_y = stream->frame_phase & CIF_CSI_FRAME0_READY ?
+			     get_dvp_reg_index_of_frm0_y_addr(channel_id) :
+			     get_dvp_reg_index_of_frm1_y_addr(channel_id);
+		frm_addr_uv = stream->frame_phase & CIF_CSI_FRAME0_READY ?
+			      get_dvp_reg_index_of_frm0_uv_addr(channel_id) :
+			      get_dvp_reg_index_of_frm1_uv_addr(channel_id);
+	}
+
+	if (stream->is_buf_active) {
+		if (stream->frame_phase == CIF_CSI_FRAME0_READY)
+			buffer = stream->curr_buf;
+		else if (stream->frame_phase == CIF_CSI_FRAME1_READY)
+			buffer = stream->next_buf;
+	}
 
 	if (buffer) {
 		rkcif_write_register(dev, frm_addr_y,
@@ -1526,6 +1606,8 @@ static int rkcif_csi_channel_set(struct rkcif_stream *stream,
 {
 	unsigned int val = 0x0;
 	struct rkcif_device *dev = stream->cifdev;
+	struct rkcif_stream *detect_stream = &dev->stream[0];
+	unsigned int wait_line = 0x3fff;
 
 	if (channel->id >= 4)
 		return -EINVAL;
@@ -1545,15 +1627,18 @@ static int rkcif_csi_channel_set(struct rkcif_stream *stream,
 	if (channel->id == RKCIF_STREAM_MIPI_ID0)
 		rkcif_write_register_or(dev, CIF_REG_MIPI_LVDS_INTEN,
 					CSI_START_INTEN(channel->id));
-
+	if (detect_stream->is_line_wake_up) {
+		rkcif_write_register_or(dev, CIF_REG_MIPI_LVDS_INTEN,
+					CSI_LINE_INTEN(channel->id));
+		wait_line = dev->wait_line;
+	}
 	rkcif_write_register(dev, CIF_REG_MIPI_LVDS_LINE_INT_NUM_ID0_1,
-			     0x3fff << 16 | 0x3fff);
+			     wait_line << 16 | wait_line);
 	rkcif_write_register(dev, CIF_REG_MIPI_LVDS_LINE_INT_NUM_ID2_3,
-			     0x3fff << 16 | 0x3fff);
+			     wait_line << 16 | wait_line);
 
 	rkcif_write_register_or(dev, CIF_REG_MIPI_LVDS_INTEN,
 				CSI_DMA_END_INTEN(channel->id));
-
 	rkcif_write_register(dev, CIF_REG_MIPI_WATER_LINE,
 			     CIF_MIPI_LVDS_SW_WATER_LINE_25_RK1808 |
 			     CIF_MIPI_LVDS_SW_WATER_LINE_ENABLE_RK1808 |
@@ -1669,6 +1754,11 @@ static int rkcif_csi_stream_start(struct rkcif_stream *stream)
 		rkcif_csi_channel_set(stream, channel, V4L2_MBUS_CCP2);
 	}
 
+	stream->line_int_cnt = 0;
+	if (stream->is_line_wake_up)
+		stream->is_can_stop = false;
+	else
+		stream->is_can_stop = true;
 	stream->state = RKCIF_STATE_STREAMING;
 	dev->workmode = RKCIF_WORKMODE_PINGPONG;
 
@@ -1813,7 +1903,7 @@ static void rkcif_buf_queue(struct vb2_buffer *vb)
 	struct v4l2_pix_format_mplane *pixm = &stream->pixm;
 	const struct cif_output_fmt *fmt = stream->cif_fmt_out;
 	struct rkcif_hw *hw_dev = stream->cifdev->hw_dev;
-	unsigned long lock_flags = 0;
+	unsigned long flags;
 	int i;
 
 	memset(cifbuf->buff_addr, 0, sizeof(cifbuf->buff_addr));
@@ -1843,10 +1933,9 @@ static void rkcif_buf_queue(struct vb2_buffer *vb)
 			cifbuf->buff_addr[i + 1] = cifbuf->buff_addr[i] +
 				pixm->plane_fmt[i].bytesperline * pixm->height;
 	}
-
-	spin_lock_irqsave(&stream->vbq_lock, lock_flags);
+	spin_lock_irqsave(&stream->vbq_lock, flags);
 	list_add_tail(&cifbuf->queue, &stream->buf_head);
-	spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
+	spin_unlock_irqrestore(&stream->vbq_lock, flags);
 }
 
 static void rkcif_do_cru_reset(struct rkcif_device *dev)
@@ -1897,7 +1986,7 @@ static void rkcif_release_rdbk_buf(struct rkcif_stream *stream)
 	struct rkcif_device *dev = stream->cifdev;
 	struct rkcif_buffer *rdbk_buf;
 	struct rkcif_buffer *tmp_buf;
-	unsigned long lock_flags = 0;
+	unsigned long flags;
 	bool has_added;
 	int index = 0;
 
@@ -1910,7 +1999,7 @@ static void rkcif_release_rdbk_buf(struct rkcif_stream *stream)
 	else
 		return;
 
-	spin_lock_irqsave(&dev->hdr_lock, lock_flags);
+	spin_lock_irqsave(&dev->hdr_lock, flags);
 	rdbk_buf = dev->rdbk_buf[index];
 	if (rdbk_buf) {
 		if (rdbk_buf != stream->curr_buf &&
@@ -1930,7 +2019,7 @@ static void rkcif_release_rdbk_buf(struct rkcif_stream *stream)
 		}
 		dev->rdbk_buf[index] = NULL;
 	}
-	spin_unlock_irqrestore(&dev->hdr_lock, lock_flags);
+	spin_unlock_irqrestore(&dev->hdr_lock, flags);
 
 }
 
@@ -2550,6 +2639,8 @@ static int rkcif_start_streaming(struct vb2_queue *queue, unsigned int count)
 	int rkmodule_stream_seq = RKMODULE_START_STREAM_DEFAULT;
 	int ret;
 
+	v4l2_info(&dev->v4l2_dev, "stream[%d] start streaming\n", stream->id);
+
 	mutex_lock(&dev->stream_lock);
 
 	if (WARN_ON(stream->state != RKCIF_STATE_READY)) {
@@ -2557,7 +2648,10 @@ static int rkcif_start_streaming(struct vb2_queue *queue, unsigned int count)
 		v4l2_err(v4l2_dev, "stream in busy state\n");
 		goto destroy_buf;
 	}
-
+	if (stream->is_line_wake_up)
+		stream->is_line_inten = true;
+	else
+		stream->is_line_inten = false;
 	stream->fs_cnt_in_single_frame = 0;
 
 	if (dev->active_sensor) {
@@ -2920,6 +3014,15 @@ void rkcif_stream_init(struct rkcif_device *dev, u32 id)
 	stream->is_dvp_yuv_addr_init = false;
 	stream->is_fs_fe_not_paired = false;
 	stream->fs_cnt_in_single_frame = 0;
+	if (dev->wait_line) {
+		dev->wait_line_cache = dev->wait_line;
+		dev->wait_line_bak = dev->wait_line;
+		stream->is_line_wake_up = true;
+	} else {
+		stream->is_line_wake_up = false;
+		dev->wait_line_cache = 0;
+		dev->wait_line_bak = 0;
+	}
 
 }
 
@@ -3368,8 +3471,7 @@ static int rkcif_s_ctrl(struct file *file, void *fh,
 			stream->is_compact = true;
 		else
 			stream->is_compact = false;
-	break;
-
+		break;
 	default:
 		return -EINVAL;
 	}
@@ -4114,9 +4216,9 @@ static bool rkcif_is_csi2_err_trigger_reset(struct rkcif_timer *timer)
 	struct rkcif_stream *stream = &dev->stream[RKCIF_STREAM_MIPI_ID0];
 
 	bool is_triggered = false;
-	unsigned long lock_flags;
+	unsigned long flags;
 
-	spin_lock_irqsave(&timer->csi2_err_lock, lock_flags);
+	spin_lock_irqsave(&timer->csi2_err_lock, flags);
 
 	if (timer->csi2_err_cnt_even != 0 &&
 	    timer->csi2_err_cnt_odd != 0) {
@@ -4137,7 +4239,7 @@ static bool rkcif_is_csi2_err_trigger_reset(struct rkcif_timer *timer)
 		v4l2_info(&dev->v4l2_dev, "reset for fs & fe not paired\n");
 	}
 
-	spin_unlock_irqrestore(&timer->csi2_err_lock, lock_flags);
+	spin_unlock_irqrestore(&timer->csi2_err_lock, flags);
 
 	return is_triggered;
 }
@@ -4308,7 +4410,7 @@ static void rkcif_monitor_reset_event(struct rkcif_device *dev)
 	struct rkcif_timer *timer = &dev->reset_watchdog_timer;
 	unsigned int cycle = 0;
 	u64 fps, timestamp0, timestamp1;
-	unsigned long lock_flags = 0, fps_flags = 0;
+	unsigned long flags, fps_flags;
 
 	if (timer->monitor_mode == RKCIF_MONITOR_MODE_IDLE)
 		return;
@@ -4333,7 +4435,7 @@ static void rkcif_monitor_reset_event(struct rkcif_device *dev)
 		timestamp1 = stream->fps_stats.frm1_timestamp;
 		spin_unlock_irqrestore(&stream->fps_lock, fps_flags);
 
-		spin_lock_irqsave(&timer->timer_lock, lock_flags);
+		spin_lock_irqsave(&timer->timer_lock, flags);
 
 		fps = timestamp0 > timestamp1 ?
 		      timestamp0 - timestamp1 : timestamp1 - timestamp0;
@@ -4365,7 +4467,7 @@ static void rkcif_monitor_reset_event(struct rkcif_device *dev)
 		timer->timer.expires = jiffies + timer->cycle;
 		mod_timer(&timer->timer, timer->timer.expires);
 
-		spin_unlock_irqrestore(&timer->timer_lock, lock_flags);
+		spin_unlock_irqrestore(&timer->timer_lock, flags);
 
 		v4l2_dbg(1, rkcif_debug, &dev->v4l2_dev,
 			 "%s:mode:%d, raw height:%d,vblank:%d, cycle:%ld, fps:%llu\n",
@@ -4523,52 +4625,28 @@ static void rkcif_rdbk_frame_end(struct rkcif_stream *stream)
 	dev->rdbk_buf[RDBK_S] = NULL;
 }
 
-static void rkcif_update_stream(struct rkcif_device *cif_dev,
-				struct rkcif_stream *stream,
-				int mipi_id)
+static void rkcif_buf_done_prepare(struct rkcif_stream *stream,
+					 struct rkcif_buffer *active_buf,
+					 int mipi_id,
+					 u32 mode)
 {
-	struct rkcif_buffer *active_buf = NULL;
+	unsigned long flags;
 	struct vb2_v4l2_buffer *vb_done = NULL;
-	unsigned long lock_flags = 0;
-	int ret = 0;
-
-	if (stream->frame_phase == (CIF_CSI_FRAME0_READY | CIF_CSI_FRAME1_READY)) {
-
-		v4l2_err(&cif_dev->v4l2_dev, "stream[%d], frm0/frm1 end simultaneously,frm id:%d\n",
-			 stream->id, stream->frame_idx);
-
-		stream->frame_idx++;
-		return;
-	}
-
-	spin_lock(&stream->fps_lock);
-	if (stream->frame_phase & CIF_CSI_FRAME0_READY) {
-		if (stream->curr_buf)
-			active_buf = stream->curr_buf;
-		stream->fps_stats.frm0_timestamp = ktime_get_ns();
-	} else if (stream->frame_phase & CIF_CSI_FRAME1_READY) {
-		if (stream->next_buf)
-			active_buf = stream->next_buf;
-		stream->fps_stats.frm1_timestamp = ktime_get_ns();
-	}
-	spin_unlock(&stream->fps_lock);
-
-	cif_dev->buf_wake_up_cnt += 1;
-	ret = rkcif_assign_new_buffer_pingpong(stream,
-					       RKCIF_YUV_ADDR_STATE_UPDATE,
-					       mipi_id);
-	if (ret)
-		goto end;
-
-	if (cif_dev->chip_id == CHIP_RV1126_CIF ||
-	    cif_dev->chip_id == CHIP_RV1126_CIF_LITE ||
-	    cif_dev->chip_id == CHIP_RK3568_CIF)
-		rkcif_luma_isr(&cif_dev->luma_vdev, mipi_id, stream->frame_idx);
+	struct rkcif_device *cif_dev = stream->cifdev;
 
 	if (active_buf) {
 		vb_done = &active_buf->vb;
 		vb_done->vb2_buf.timestamp = ktime_get_ns();
 		vb_done->sequence = stream->frame_idx;
+		if (stream->is_line_wake_up) {
+			spin_lock_irqsave(&stream->fps_lock, flags);
+			if (mode)
+				stream->fps_stats.frm0_timestamp = vb_done->vb2_buf.timestamp;
+			else
+				stream->fps_stats.frm1_timestamp = vb_done->vb2_buf.timestamp;
+			stream->readout.wk_timestamp = vb_done->vb2_buf.timestamp;
+			spin_unlock_irqrestore(&stream->fps_lock, flags);
+		}
 	}
 
 	if (cif_dev->hdr.mode == NO_HDR) {
@@ -4576,7 +4654,7 @@ static void rkcif_update_stream(struct rkcif_device *cif_dev,
 			rkcif_vb_done_oneframe(stream, vb_done);
 	} else {
 		if (cif_dev->is_start_hdr) {
-			spin_lock_irqsave(&cif_dev->hdr_lock, lock_flags);
+			spin_lock_irqsave(&cif_dev->hdr_lock, flags);
 			if (mipi_id == RKCIF_STREAM_MIPI_ID0) {
 				if (cif_dev->rdbk_buf[RDBK_L]) {
 					v4l2_err(&cif_dev->v4l2_dev,
@@ -4616,7 +4694,7 @@ static void rkcif_update_stream(struct rkcif_device *cif_dev,
 				if (cif_dev->hdr.mode == HDR_X3)
 					rkcif_rdbk_frame_end(stream);
 			}
-			spin_unlock_irqrestore(&cif_dev->hdr_lock, lock_flags);
+			spin_unlock_irqrestore(&cif_dev->hdr_lock, flags);
 		} else {
 			if (active_buf) {
 				vb_done->vb2_buf.state = VB2_BUF_STATE_ACTIVE;
@@ -4632,8 +4710,123 @@ static void rkcif_update_stream(struct rkcif_device *cif_dev,
 				  cif_dev->stream[3].state != RKCIF_STATE_STREAMING ? "stopped" : "running");
 		}
 	}
-end:
+
+}
+
+static void rkcif_line_wake_up(struct rkcif_stream *stream, int mipi_id)
+{
+	u32 mode;
+	struct rkcif_buffer *active_buf = NULL;
+	struct rkcif_device *cif_dev = stream->cifdev;
+	int ret = 0;
+
+	mode = stream->line_int_cnt % 2;
+	if (mode) {
+		if (stream->curr_buf)
+			active_buf = stream->curr_buf;
+	} else {
+		if (stream->next_buf)
+			active_buf = stream->next_buf;
+	}
+
+	if (stream->stopping) {
+		stream->is_can_stop = true;
+		return;
+	}
+	ret = rkcif_get_new_buffer_wake_up_mode(stream);
+	if (ret)
+		goto end_wake_up;
+
+	rkcif_buf_done_prepare(stream, active_buf, mipi_id, mode);
+end_wake_up:
+	if (mipi_id == RKCIF_STREAM_MIPI_ID0)
+		cif_dev->buf_wake_up_cnt += 1;
 	stream->frame_idx++;
+
+}
+
+static void rkcif_deal_readout_time(struct rkcif_stream *stream)
+{
+	struct rkcif_device *cif_dev = stream->cifdev;
+	struct rkcif_stream *detect_stream = &cif_dev->stream[0];
+	unsigned long flags;
+
+	spin_lock_irqsave(&stream->fps_lock, flags);
+	stream->readout.fe_timestamp = ktime_get_ns();
+	if (stream->id == RKCIF_STREAM_MIPI_ID0)
+		detect_stream->readout.readout_time = stream->readout.fe_timestamp - stream->readout.fs_timestamp;
+
+	if ((cif_dev->hdr.mode == NO_HDR) && (stream->id == RKCIF_STREAM_MIPI_ID0)) {
+		detect_stream->readout.early_time = stream->readout.fe_timestamp - stream->readout.wk_timestamp;
+
+	} else if ((cif_dev->hdr.mode == HDR_X2) && (stream->id == RKCIF_STREAM_MIPI_ID1)) {
+		detect_stream->readout.early_time = stream->readout.fe_timestamp - stream->readout.wk_timestamp;
+		detect_stream->readout.total_time = stream->readout.fe_timestamp - detect_stream->readout.fs_timestamp;
+	} else if ((cif_dev->hdr.mode == HDR_X3) && (stream->id == RKCIF_STREAM_MIPI_ID2)) {
+		detect_stream->readout.early_time = stream->readout.fe_timestamp - stream->readout.wk_timestamp;
+		detect_stream->readout.total_time = stream->readout.fe_timestamp - detect_stream->readout.fs_timestamp;
+	}
+	if (!stream->is_line_wake_up)
+		detect_stream->readout.early_time = 0;
+	spin_unlock_irqrestore(&stream->fps_lock, flags);
+}
+
+static void rkcif_update_stream(struct rkcif_device *cif_dev,
+				struct rkcif_stream *stream,
+				int mipi_id)
+{
+	struct rkcif_buffer *active_buf = NULL;
+	unsigned long flags;
+	int ret = 0;
+
+	if (stream->frame_phase == (CIF_CSI_FRAME0_READY | CIF_CSI_FRAME1_READY)) {
+
+		v4l2_err(&cif_dev->v4l2_dev, "stream[%d], frm0/frm1 end simultaneously,frm id:%d\n",
+			 stream->id, stream->frame_idx);
+
+		stream->frame_idx++;
+		return;
+	}
+	if (!stream->is_line_wake_up) {
+
+		spin_lock_irqsave(&stream->fps_lock, flags);
+		if (stream->frame_phase & CIF_CSI_FRAME0_READY) {
+			if (stream->curr_buf)
+				active_buf = stream->curr_buf;
+			stream->fps_stats.frm0_timestamp = ktime_get_ns();
+		} else if (stream->frame_phase & CIF_CSI_FRAME1_READY) {
+			if (stream->next_buf)
+				active_buf = stream->next_buf;
+			stream->fps_stats.frm1_timestamp = ktime_get_ns();
+		}
+		spin_unlock_irqrestore(&stream->fps_lock, flags);
+		if (mipi_id == RKCIF_STREAM_MIPI_ID0)
+			cif_dev->buf_wake_up_cnt += 1;
+	}
+
+	rkcif_deal_readout_time(stream);
+
+	if (!stream->is_line_wake_up) {
+		ret = rkcif_assign_new_buffer_pingpong(stream,
+					 RKCIF_YUV_ADDR_STATE_UPDATE,
+					 mipi_id);
+		if (ret)
+			goto end;
+	} else {
+		ret = rkcif_update_new_buffer_wake_up_mode(stream);
+		if (ret)
+			return;
+	}
+
+	if (cif_dev->chip_id == CHIP_RV1126_CIF ||
+	    cif_dev->chip_id == CHIP_RV1126_CIF_LITE ||
+	    cif_dev->chip_id == CHIP_RK3568_CIF)
+		rkcif_luma_isr(&cif_dev->luma_vdev, mipi_id, stream->frame_idx);
+	if (!stream->is_line_wake_up) {
+		rkcif_buf_done_prepare(stream, active_buf, mipi_id, 0);
+end:
+		stream->frame_idx++;
+	}
 }
 
 u32 rkcif_get_sof(struct rkcif_device *cif_dev)
@@ -4903,7 +5096,7 @@ static void rkcif_init_reset_work(struct rkcif_timer *timer)
 	struct rkcif_device *dev = container_of(timer,
 						struct rkcif_device,
 						reset_watchdog_timer);
-	unsigned long lock_flags = 0;
+	unsigned long flags;
 
 	if (timer->has_been_init)
 		return;
@@ -4912,7 +5105,7 @@ static void rkcif_init_reset_work(struct rkcif_timer *timer)
 		  "do reset work schedule, run_cnt:%d, reset source:%d\n",
 		  timer->run_cnt, timer->reset_src);
 
-	spin_lock_irqsave(&timer->timer_lock, lock_flags);
+	spin_lock_irqsave(&timer->timer_lock, flags);
 	timer->is_running = false;
 	timer->is_triggered = false;
 	timer->csi2_err_cnt_odd = 0;
@@ -4920,7 +5113,7 @@ static void rkcif_init_reset_work(struct rkcif_timer *timer)
 	timer->csi2_err_fs_fe_cnt = 0;
 	timer->notifer_called_cnt = 0;
 	timer->last_buf_wakeup_cnt = dev->buf_wake_up_cnt;
-	spin_unlock_irqrestore(&timer->timer_lock, lock_flags);
+	spin_unlock_irqrestore(&timer->timer_lock, flags);
 
 	dev->reset_work.reset_src = timer->reset_src;
 	if (schedule_work(&dev->reset_work.work)) {
@@ -4941,7 +5134,7 @@ void rkcif_reset_watchdog_timer_handler(struct timer_list *t)
 						reset_watchdog_timer);
 	struct rkcif_sensor_info *terminal_sensor = &dev->terminal_sensor;
 
-	unsigned long lock_flags = 0;
+	unsigned long flags;
 	unsigned int i, stream_num = 1;
 	int ret, is_reset = 0;
 	struct rkmodule_vicap_reset_info rst_info;
@@ -5013,10 +5206,10 @@ void rkcif_reset_watchdog_timer_handler(struct timer_list *t)
 			if (timer->run_cnt <= timer->max_run_cnt) {
 				mod_timer(&timer->timer, jiffies + timer->cycle);
 			} else {
-				spin_lock_irqsave(&timer->timer_lock, lock_flags);
+				spin_lock_irqsave(&timer->timer_lock, flags);
 				timer->is_triggered = false;
 				timer->is_running = false;
-				spin_unlock_irqrestore(&timer->timer_lock, lock_flags);
+				spin_unlock_irqrestore(&timer->timer_lock, flags);
 				v4l2_info(&dev->v4l2_dev, "stop reset detecting!\n");
 			}
 		}
@@ -5041,10 +5234,10 @@ void rkcif_reset_watchdog_timer_handler(struct timer_list *t)
 	return;
 end_detect:
 
-	spin_lock_irqsave(&timer->timer_lock, lock_flags);
+	spin_lock_irqsave(&timer->timer_lock, flags);
 	timer->is_triggered = false;
 	timer->is_running = false;
-	spin_unlock_irqrestore(&timer->timer_lock, lock_flags);
+	spin_unlock_irqrestore(&timer->timer_lock, flags);
 
 	v4l2_info(&dev->v4l2_dev,
 		  "stream[%d] is stopped, stop reset detect!\n",
@@ -5056,11 +5249,11 @@ int rkcif_reset_notifier(struct notifier_block *nb,
 {
 	struct rkcif_device *dev = container_of(nb, struct rkcif_device, reset_notifier);
 	struct rkcif_timer *timer = &dev->reset_watchdog_timer;
-	unsigned long lock_flags = 0, val;
+	unsigned long flags, val;
 
 	if (timer->is_running) {
 		val = action & CSI2_ERR_COUNT_ALL_MASK;
-		spin_lock_irqsave(&timer->csi2_err_lock, lock_flags);
+		spin_lock_irqsave(&timer->csi2_err_lock, flags);
 		if ((val % timer->csi2_err_ref_cnt) == 0) {
 			timer->notifer_called_cnt++;
 			if ((timer->notifer_called_cnt % 2) == 0)
@@ -5070,18 +5263,69 @@ int rkcif_reset_notifier(struct notifier_block *nb,
 		}
 
 		timer->csi2_err_fs_fe_cnt = (action & CSI2_ERR_FSFE_MASK) >> 8;
-		spin_unlock_irqrestore(&timer->csi2_err_lock, lock_flags);
+		spin_unlock_irqrestore(&timer->csi2_err_lock, flags);
 	}
 
 	return 0;
 }
 
+static void rkcif_modify_line_int(struct rkcif_stream *stream, bool en)
+{
+	struct rkcif_device *cif_dev = stream->cifdev;
+
+	if (en) {
+		if (cif_dev->wait_line_bak != cif_dev->wait_line) {
+			cif_dev->wait_line_bak = cif_dev->wait_line;
+			rkcif_write_register(cif_dev, CIF_REG_MIPI_LVDS_LINE_INT_NUM_ID0_1,
+					     cif_dev->wait_line << 16 | cif_dev->wait_line);
+			rkcif_write_register(cif_dev, CIF_REG_MIPI_LVDS_LINE_INT_NUM_ID2_3,
+					     cif_dev->wait_line << 16 | cif_dev->wait_line);
+		}
+		rkcif_write_register_or(cif_dev, CIF_REG_MIPI_LVDS_INTEN,
+					CSI_LINE_INTEN(stream->id));
+	} else {
+		rkcif_write_register_and(cif_dev, CIF_REG_MIPI_LVDS_INTEN,
+					 ~(CSI_LINE_INTEN(stream->id)));
+	}
+}
+
+static void rkcif_detect_wake_up_mode_change(struct rkcif_stream *stream)
+{
+	struct rkcif_device *cif_dev = stream->cifdev;
+
+	if (cif_dev->wait_line && (!stream->is_line_wake_up)) {
+		stream->is_line_wake_up = true;
+		if (stream->frame_phase == CIF_CSI_FRAME0_READY)
+			stream->line_int_cnt = 1;
+		else if (stream->frame_phase == CIF_CSI_FRAME1_READY)
+			stream->line_int_cnt = 0;
+	} else if ((cif_dev->wait_line == 0) && stream->is_line_wake_up) {
+		stream->is_line_wake_up = false;
+	}
+	if (stream->is_line_wake_up) {
+		rkcif_modify_line_int(stream, true);
+		stream->is_line_inten = true;
+	}
+
+	if (cif_dev->hdr.mode == NO_HDR && stream->id == RKCIF_STREAM_MIPI_ID0) {
+		if (cif_dev->wait_line != cif_dev->wait_line_cache)
+			cif_dev->wait_line = cif_dev->wait_line_cache;
+	} else if (cif_dev->hdr.mode == HDR_X2 && stream->id == RKCIF_STREAM_MIPI_ID1) {
+		if (cif_dev->wait_line != cif_dev->wait_line_cache)
+			cif_dev->wait_line = cif_dev->wait_line_cache;
+	} else if (cif_dev->hdr.mode == HDR_X3 && stream->id == RKCIF_STREAM_MIPI_ID2) {
+		if (cif_dev->wait_line != cif_dev->wait_line_cache)
+			cif_dev->wait_line = cif_dev->wait_line_cache;
+	}
+}
+
 void rkcif_irq_pingpong(struct rkcif_device *cif_dev)
 {
 	struct rkcif_stream *stream;
 	struct rkcif_stream *detect_stream = &cif_dev->stream[0];
 	struct v4l2_mbus_config *mbus;
 	unsigned int intstat = 0x0, i = 0xff, bak_intstat = 0x0;
+	unsigned long flags;
 	int ret = 0;
 
 	if (!cif_dev->active_sensor)
@@ -5136,12 +5380,10 @@ void rkcif_irq_pingpong(struct rkcif_device *cif_dev)
 				rkcif_csi2_event_inc_sof();
 			else if (mbus->type == V4L2_MBUS_CCP2)
 				rkcif_lvds_event_inc_sof(cif_dev);
-
-			if (detect_stream->fs_cnt_in_single_frame >= 1)
-				v4l2_warn(&cif_dev->v4l2_dev,
-					  "%s:warn: fs has been incread:%u(frm0)\n",
-					  __func__, detect_stream->fs_cnt_in_single_frame);
 			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) {
@@ -5149,11 +5391,23 @@ void rkcif_irq_pingpong(struct rkcif_device *cif_dev)
 				rkcif_csi2_event_inc_sof();
 			else if (mbus->type == V4L2_MBUS_CCP2)
 				rkcif_lvds_event_inc_sof(cif_dev);
-
-			if (detect_stream->fs_cnt_in_single_frame >= 1)
-				v4l2_warn(&cif_dev->v4l2_dev, "%s:warn: fs has been incread:%u(frm1)\n",
-				 __func__, detect_stream->fs_cnt_in_single_frame);
 			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];
+				if (stream->is_line_inten) {
+					stream->line_int_cnt++;
+					rkcif_line_wake_up(stream, stream->id);
+					rkcif_modify_line_int(stream, false);
+					stream->is_line_inten = false;
+				}
+				v4l2_dbg(1, rkcif_debug, &cif_dev->v4l2_dev,
+					 "%s: id0 cur line:%d\n", __func__, lastline & 0x3fff);
+			}
 		}
 
 		/* if do not reach frame dma end, return irq */
@@ -5168,8 +5422,7 @@ void rkcif_irq_pingpong(struct rkcif_device *cif_dev)
 				continue;
 
 			stream = &cif_dev->stream[mipi_id];
-
-			if (stream->stopping) {
+			if (stream->stopping && stream->is_can_stop) {
 				rkcif_stream_stop(stream);
 				stream->stopping = false;
 				wake_up(&stream->wq_stopped);
@@ -5202,6 +5455,7 @@ void rkcif_irq_pingpong(struct rkcif_device *cif_dev)
 				rkcif_dynamic_crop(stream);
 
 			rkcif_update_stream(cif_dev, stream, mipi_id);
+			rkcif_detect_wake_up_mode_change(stream);
 			rkcif_monitor_reset_event(cif_dev);
 			if (mipi_id == RKCIF_STREAM_MIPI_ID0) {
 				if ((intstat & (CSI_FRAME1_START_ID0 | CSI_FRAME0_START_ID0)) == 0 &&
@@ -5338,12 +5592,12 @@ void rkcif_irq_pingpong(struct rkcif_device *cif_dev)
 					stream->frame_phase = CIF_CSI_FRAME1_READY;
 				}
 
-				spin_lock(&stream->fps_lock);
+				spin_lock_irqsave(&stream->fps_lock, flags);
 				if (stream->frame_phase & CIF_CSI_FRAME0_READY)
 					stream->fps_stats.frm0_timestamp = ktime_get_ns();
 				else if (stream->frame_phase & CIF_CSI_FRAME1_READY)
 					stream->fps_stats.frm1_timestamp = ktime_get_ns();
-				spin_unlock(&stream->fps_lock);
+				spin_unlock_irqrestore(&stream->fps_lock, flags);
 
 				ret = rkcif_assign_new_buffer_oneframe(stream,
 								 RKCIF_YUV_ADDR_STATE_UPDATE);
diff --git a/drivers/media/platform/rockchip/cif/dev.c b/drivers/media/platform/rockchip/cif/dev.c
index 33310e0bb9be..d1d8d0b0261d 100644
--- a/drivers/media/platform/rockchip/cif/dev.c
+++ b/drivers/media/platform/rockchip/cif/dev.c
@@ -91,11 +91,44 @@ static ssize_t rkcif_store_compact_mode(struct device *dev,
 
 	return len;
 }
+
+static ssize_t rkcif_show_line_int_num(struct device *dev,
+					      struct device_attribute *attr,
+					      char *buf)
+{
+	struct rkcif_device *cif_dev = (struct rkcif_device *)dev_get_drvdata(dev);
+	int ret;
+
+	ret = snprintf(buf, PAGE_SIZE, "%d\n",
+		       cif_dev->wait_line_cache);
+	return ret;
+}
+
+static ssize_t rkcif_store_line_int_num(struct device *dev,
+					       struct device_attribute *attr,
+					       const char *buf, size_t len)
+{
+	struct rkcif_device *cif_dev = (struct rkcif_device *)dev_get_drvdata(dev);
+	int val = 0;
+	int ret = 0;
+
+	ret = kstrtoint(buf, 0, &val);
+	if (!ret && val >= 0 && val <= 0x3fff)
+		cif_dev->wait_line_cache = val;
+	else
+		dev_info(cif_dev->dev, "set line int num failed\n");
+	return len;
+}
+
 static DEVICE_ATTR(compact_test, S_IWUSR | S_IRUSR,
 		   rkcif_show_compact_mode, rkcif_store_compact_mode);
 
+static DEVICE_ATTR(wait_line, S_IWUSR | S_IRUSR,
+		   rkcif_show_line_int_num, rkcif_store_line_int_num);
+
 static struct attribute *dev_attrs[] = {
 	&dev_attr_compact_test.attr,
+	&dev_attr_wait_line.attr,
 	NULL,
 };
 
@@ -1149,6 +1182,19 @@ static const struct of_device_id rkcif_plat_of_match[] = {
 	{},
 };
 
+static void rkcif_parse_dts(struct rkcif_device *cif_dev)
+{
+	int ret = 0;
+	struct device_node *node = cif_dev->dev->of_node;
+
+	ret = of_property_read_u32(node,
+			     OF_CIF_WAIT_LINE,
+			     &cif_dev->wait_line);
+	if (ret != 0)
+		cif_dev->wait_line = 0;
+	dev_info(cif_dev->dev, "rkcif wait line %d\n", cif_dev->wait_line);
+}
+
 static int rkcif_plat_probe(struct platform_device *pdev)
 {
 	const struct of_device_id *match;
@@ -1182,6 +1228,8 @@ static int rkcif_plat_probe(struct platform_device *pdev)
 
 	rkcif_attach_hw(cif_dev);
 
+	rkcif_parse_dts(cif_dev);
+
 	ret = rkcif_plat_init(cif_dev, node, data->inf_id);
 	if (ret) {
 		rkcif_detach_hw(cif_dev);
diff --git a/drivers/media/platform/rockchip/cif/dev.h b/drivers/media/platform/rockchip/cif/dev.h
index 40bc72937ab5..e2f3e8e30d14 100644
--- a/drivers/media/platform/rockchip/cif/dev.h
+++ b/drivers/media/platform/rockchip/cif/dev.h
@@ -29,6 +29,8 @@
 #define CIF_VIDEODEVICE_NAME	"stream_cif"
 
 #define OF_CIF_MONITOR_PARA	"rockchip,cif-monitor"
+#define OF_CIF_WAIT_LINE	"wait-line"
+
 #define CIF_MONITOR_PARA_NUM	(5)
 
 #define RKCIF_SINGLE_STREAM	1
@@ -283,6 +285,23 @@ struct rkcif_fps_stats {
 	u64 frm1_timestamp;
 };
 
+/* struct rkcif_fps_stats - take notes on timestamp of buf
+ * @fs_timestamp: timesstamp of frame start
+ * @fe_timestamp: timesstamp of frame end
+ * @wk_timestamp: timesstamp of buf send to user in wake up mode
+ * @readout_time: one frame of readout time
+ * @early_time: early time of buf send to user
+ * @total_time: totaltime of readout time in hdr
+ */
+struct rkcif_readout_stats {
+	u64 fs_timestamp;
+	u64 fe_timestamp;
+	u64 wk_timestamp;
+	u64 readout_time;
+	u64 early_time;
+	u64 total_time;
+};
+
 /* struct rkcif_irq_stats - take notes on irq number
  * @csi_overflow_cnt: count of csi overflow irq
  * @csi_bwidth_lack_cnt: count of csi bandwidth lack irq
@@ -385,10 +404,6 @@ struct rkcif_stream {
 	struct rkcif_device		*cifdev;
 	struct rkcif_vdev_node		vnode;
 	enum rkcif_state		state;
-	bool				stopping;
-	bool				crop_enable;
-	bool				crop_dyn_en;
-	bool				is_compact;
 	wait_queue_head_t		wq_stopped;
 	unsigned int			frame_idx;
 	int				frame_phase;
@@ -409,9 +424,19 @@ struct rkcif_stream {
 	struct v4l2_rect		crop[CROP_SRC_MAX];
 	struct rkcif_fps_stats		fps_stats;
 	struct rkcif_extend_info	extend_line;
+	struct rkcif_readout_stats	readout;
+	unsigned int			fs_cnt_in_single_frame;
+	u64				line_int_cnt;
+	bool				stopping;
+	bool				crop_enable;
+	bool				crop_dyn_en;
+	bool				is_compact;
 	bool				is_dvp_yuv_addr_init;
 	bool				is_fs_fe_not_paired;
-	unsigned int			fs_cnt_in_single_frame;
+	bool				is_line_wake_up;
+	bool				is_line_inten;
+	bool				is_can_stop;
+	bool				is_buf_active;
 };
 
 struct rkcif_lvds_subdev {
@@ -505,16 +530,17 @@ struct rkcif_device {
 	struct proc_dir_entry		*proc_dir;
 	struct rkcif_irq_stats		irq_stats;
 	spinlock_t			hdr_lock; /* lock for hdr buf sync */
-	bool				is_start_hdr;
-
+	struct rkcif_timer		reset_watchdog_timer;
+	unsigned int			buf_wake_up_cnt;
 	struct notifier_block		reset_notifier; /* reset for mipi csi crc err */
 	struct rkcif_work_struct	reset_work;
+	unsigned int			dvp_sof_in_oneframe;
+	unsigned int			wait_line;
+	unsigned int			wait_line_bak;
+	unsigned int			wait_line_cache;
+	bool				is_start_hdr;
 	bool				reset_work_cancel;
-	struct rkcif_timer		reset_watchdog_timer;
-	unsigned int			buf_wake_up_cnt;
-
 	bool				iommu_en;
-	unsigned int			dvp_sof_in_oneframe;
 };
 
 extern struct platform_driver rkcif_plat_drv;
diff --git a/drivers/media/platform/rockchip/cif/procfs.c b/drivers/media/platform/rockchip/cif/procfs.c
index e9f86e8abc21..e77b2c8fe6ac 100644
--- a/drivers/media/platform/rockchip/cif/procfs.c
+++ b/drivers/media/platform/rockchip/cif/procfs.c
@@ -249,9 +249,10 @@ static void rkcif_show_format(struct rkcif_device *dev, struct seq_file *f)
 	struct v4l2_rect *rect = &sensor->raw_rect;
 	struct v4l2_subdev_frame_interval *interval = &sensor->fi;
 	struct v4l2_subdev_selection *sel = &sensor->selection;
-	u32 i, flags;
+	u32 i, mbus_flags;
 	u64 fps, timestamp0, timestamp1;
-	unsigned long lock_flags = 0;
+	unsigned long flags;
+	u32 time_val = 0;
 
 	if (atomic_read(&pipe->stream_cnt) < 1)
 		return;
@@ -260,24 +261,24 @@ static void rkcif_show_format(struct rkcif_device *dev, struct seq_file *f)
 		seq_puts(f, "Input Info:\n");
 
 		seq_printf(f, "\tsrc subdev:%s\n", sensor->sd->name);
-		flags = sensor->mbus.flags;
+		mbus_flags = sensor->mbus.flags;
 		if (sensor->mbus.type == V4L2_MBUS_PARALLEL ||
 		    sensor->mbus.type == V4L2_MBUS_BT656) {
 			seq_printf(f, "\tinterface:%s\n",
 				   sensor->mbus.type == V4L2_MBUS_PARALLEL ? "BT601" : "BT656/BT1120");
 			seq_printf(f, "\thref_pol:%s\n",
-				   flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH ? "high active" : "low active");
+				   mbus_flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH ? "high active" : "low active");
 			seq_printf(f, "\tvsync_pol:%s\n",
-				   flags & V4L2_MBUS_VSYNC_ACTIVE_HIGH ? "high active" : "low active");
+				   mbus_flags & V4L2_MBUS_VSYNC_ACTIVE_HIGH ? "high active" : "low active");
 		} else {
 			seq_printf(f, "\tinterface:%s\n",
 				   sensor->mbus.type == V4L2_MBUS_CSI2 ? "mipi csi2" :
 				   sensor->mbus.type == V4L2_MBUS_CCP2 ? "lvds" : "unknown");
 			seq_printf(f, "\tlanes:%d\n", sensor->lanes);
 			seq_puts(f, "\tvc channel:");
-			if (flags & V4L2_MBUS_CSI2_CHANNELS) {
+			if (mbus_flags & V4L2_MBUS_CSI2_CHANNELS) {
 				for (i = 0; i < 4; i++) {
-					if ((flags >> (4 + i)) & 0x1)
+					if ((mbus_flags >> (4 + i)) & 0x1)
 						seq_printf(f, " %d", i);
 				}
 				seq_puts(f, "\n");
@@ -299,14 +300,13 @@ static void rkcif_show_format(struct rkcif_device *dev, struct seq_file *f)
 			   sel->r.left, sel->r.top,
 			   sel->r.width, sel->r.height);
 
-		spin_lock_irqsave(&stream->fps_lock, lock_flags);
+		spin_lock_irqsave(&stream->fps_lock, flags);
 		timestamp0 = stream->fps_stats.frm0_timestamp;
 		timestamp1 = stream->fps_stats.frm1_timestamp;
-		spin_unlock_irqrestore(&stream->fps_lock, lock_flags);
+		spin_unlock_irqrestore(&stream->fps_lock, flags);
 		fps = timestamp0 > timestamp1 ?
 		      timestamp0 - timestamp1 : timestamp1 - timestamp0;
 		fps = div_u64(fps, 1000000);
-		fps = div_u64(1000, fps);
 
 		seq_puts(f, "Output Info:\n");
 		seq_printf(f, "\tformat:%s/%ux%u(%u,%u)\n",
@@ -315,6 +315,20 @@ static void rkcif_show_format(struct rkcif_device *dev, struct seq_file *f)
 			   dev->channels[0].crop_st_x, dev->channels[0].crop_st_y);
 		seq_printf(f, "\tcompact:%s\n", stream->is_compact ? "enable" : "disabled");
 		seq_printf(f, "\tframe amount:%d\n", stream->frame_idx);
+		time_val = div_u64(stream->readout.early_time, 1000000);
+		seq_printf(f, "\tearly:%u ms\n", time_val);
+		if (dev->hdr.mode == NO_HDR) {
+			time_val = div_u64(stream->readout.readout_time, 1000000);
+			seq_printf(f, "\treadout:%u ms\n", time_val);
+		} else {
+			time_val = div_u64(stream->readout.readout_time, 1000000);
+			seq_printf(f, "\tsingle readout:%u ms\n", time_val);
+			time_val = div_u64(stream->readout.total_time, 1000000);
+			seq_printf(f, "\ttotal readout:%u ms\n", time_val);
+
+		}
+		seq_printf(f, "\trate:%llu ms\n", fps);
+		fps = div_u64(1000, fps);
 		seq_printf(f, "\tfps:%llu\n", fps);
 		seq_puts(f, "\tirq statistics:\n");
 		seq_printf(f, "\t\t\ttotal:%llu\n",
diff --git a/drivers/media/platform/rockchip/cif/version.h b/drivers/media/platform/rockchip/cif/version.h
index 712befd13c65..7cd2f711a3de 100644
--- a/drivers/media/platform/rockchip/cif/version.h
+++ b/drivers/media/platform/rockchip/cif/version.h
@@ -63,6 +63,7 @@
  *3. optimize dts config of cif's pipeline
  *4. register cif itf dev when clear unready subdev
  *5. mipi csi host add cru rst
+ *6. support wake up mode with mipi
  */
 
 #define RKCIF_DRIVER_VERSION RKCIF_API_VERSION

commit e1229de58bc29460b172dc5936d0a5fe1eb9301c
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Wed Aug 4 16:00:14 2021 +0800

    staging: ion: do flush_cache_all for large size
    
    Change-Id: Iac8e5bd0d4405cb9faf84ca2f0579b085861997c
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c
index b2c6d7b11203..77d6f43c69fa 100644
--- a/drivers/staging/android/ion/ion.c
+++ b/drivers/staging/android/ion/ion.c
@@ -29,6 +29,7 @@
 #include <linux/slab.h>
 #include <linux/uaccess.h>
 #include <linux/vmalloc.h>
+#include <asm/cacheflush.h>
 
 #define CREATE_TRACE_POINTS
 #include "ion_trace.h"
@@ -530,6 +531,18 @@ static int ion_dma_buf_end_cpu_access(struct dma_buf *dmabuf,
 		mutex_unlock(&buffer->lock);
 	}
 
+	if (buffer->size >= SZ_1M) {
+		if (direction == DMA_FROM_DEVICE) {
+			flush_cache_all();
+			goto exit;
+		} else {
+#ifdef CONFIG_ARM64
+			__flush_dcache_all();
+			goto exit;
+#endif
+		}
+	}
+
 	mutex_lock(&buffer->lock);
 	if (IS_ENABLED(CONFIG_ION_FORCE_DMA_SYNC)) {
 		struct device *dev = ion_dev;
@@ -557,7 +570,7 @@ static int ion_dma_buf_end_cpu_access(struct dma_buf *dmabuf,
 	}
 unlock:
 	mutex_unlock(&buffer->lock);
-
+exit:
 	return 0;
 }
 
@@ -614,6 +627,18 @@ static int ion_dma_buf_end_cpu_access_partial(struct dma_buf *dmabuf,
 	struct ion_dma_buf_attachment *a;
 	int ret = 0;
 
+	if (len >= SZ_1M) {
+		if (direction == DMA_FROM_DEVICE) {
+			flush_cache_all();
+			goto exit;
+		} else {
+#ifdef CONFIG_ARM64
+			__flush_dcache_all();
+			goto exit;
+#endif
+		}
+	}
+
 	mutex_lock(&buffer->lock);
 	if (IS_ENABLED(CONFIG_ION_FORCE_DMA_SYNC)) {
 		if (dev) {
@@ -638,7 +663,7 @@ static int ion_dma_buf_end_cpu_access_partial(struct dma_buf *dmabuf,
 	}
 unlock:
 	mutex_unlock(&buffer->lock);
-
+exit:
 	return ret;
 }
 

commit 47e86f6791335a2dccac25f47f458264eaea7b5d
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Thu Aug 5 10:52:55 2021 +0800

    arm64: mm: export __flush_dcache_all
    
    Change-Id: I268a515f98361a4fd152d399262307aadb058344
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/arch/arm64/include/asm/cacheflush.h b/arch/arm64/include/asm/cacheflush.h
index 3f8a615bfc82..a4fa4b50712a 100644
--- a/arch/arm64/include/asm/cacheflush.h
+++ b/arch/arm64/include/asm/cacheflush.h
@@ -79,6 +79,7 @@
 extern void flush_cache_all(void);
 extern void __flush_icache_range(unsigned long start, unsigned long end);
 extern int  invalidate_icache_range(unsigned long start, unsigned long end);
+extern void __flush_dcache_all(void);
 extern void __flush_dcache_area(void *addr, size_t len);
 extern void __inval_dcache_area(void *addr, size_t len);
 extern void __clean_dcache_area_poc(void *addr, size_t len);
diff --git a/arch/arm64/mm/cache.S b/arch/arm64/mm/cache.S
index 000fb4465414..7fdea6b62ab0 100644
--- a/arch/arm64/mm/cache.S
+++ b/arch/arm64/mm/cache.S
@@ -32,7 +32,7 @@
  *
  *	Corrupted registers: x0-x7, x9-x11
  */
-__flush_dcache_all:
+ENTRY(__flush_dcache_all)
 	dmb	sy				// ensure ordering with previous memory accesses
 	mrs	x0, clidr_el1			// read clidr
 	and	x3, x0, #0x7000000		// extract loc from clidr

commit 4370fdf1a4eb8b9c187c5ee5b6c8eb76c2a92497
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Wed Aug 4 09:38:19 2021 +0800

    staging: ion: do sync once for DMA TYPE HEAP
    
    Change-Id: If1d3d778b43fe59f771e9bdc994f9e1740de564b
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c
index 5a17f9b6f147..b2c6d7b11203 100644
--- a/drivers/staging/android/ion/ion.c
+++ b/drivers/staging/android/ion/ion.c
@@ -494,8 +494,14 @@ static int ion_dma_buf_begin_cpu_access(struct dma_buf *dmabuf,
 		struct sg_table *table = buffer->sg_table;
 
 		if (dev) {
-			dma_sync_sg_for_cpu(dev, table->sgl, table->nents,
-					    direction);
+			if (buffer->heap->type == ION_HEAP_TYPE_DMA)
+				dma_sync_single_range_for_cpu(dev,
+							      sg_dma_address(table->sgl),
+							      0, buffer->size,
+							      direction);
+			else
+				dma_sync_sg_for_cpu(dev, table->sgl, table->nents,
+						    direction);
 			goto unlock;
 		}
 	}
@@ -530,11 +536,16 @@ static int ion_dma_buf_end_cpu_access(struct dma_buf *dmabuf,
 		struct sg_table *table = buffer->sg_table;
 
 		if (dev) {
-			dma_sync_sg_for_device(dev, table->sgl, table->nents,
-					       direction);
-			mutex_unlock(&buffer->lock);
-
-			return 0;
+			if (buffer->heap->type == ION_HEAP_TYPE_DMA)
+				dma_sync_single_range_for_device(dev,
+								 sg_dma_address(table->sgl),
+								 0, buffer->size,
+								 direction);
+			else
+
+				dma_sync_sg_for_device(dev, table->sgl, table->nents,
+						       direction);
+			goto unlock;
 		}
 	}
 
@@ -544,6 +555,7 @@ static int ion_dma_buf_end_cpu_access(struct dma_buf *dmabuf,
 		dma_sync_sg_for_device(a->dev, a->table->sgl, a->table->nents,
 				       direction);
 	}
+unlock:
 	mutex_unlock(&buffer->lock);
 
 	return 0;
@@ -554,7 +566,9 @@ static int ion_dma_buf_begin_cpu_access_partial(struct dma_buf *dmabuf,
 						unsigned int offset,
 						unsigned int len)
 {
+	struct device *dev = ion_dev;
 	struct ion_buffer *buffer = dmabuf->priv;
+	struct sg_table *table = buffer->sg_table;
 	struct ion_dma_buf_attachment *a;
 	int ret = 0;
 
@@ -563,13 +577,15 @@ static int ion_dma_buf_begin_cpu_access_partial(struct dma_buf *dmabuf,
 
 	mutex_lock(&buffer->lock);
 	if (IS_ENABLED(CONFIG_ION_FORCE_DMA_SYNC)) {
-		struct device *dev = ion_dev;
-		struct sg_table *table = buffer->sg_table;
-
 		if (dev) {
-			ret = ion_sgl_sync_range(dev, table->sgl, table->nents,
-						 offset, len, direction, true);
-
+			if (buffer->heap->type == ION_HEAP_TYPE_DMA)
+				dma_sync_single_range_for_cpu(dev,
+							      sg_dma_address(table->sgl),
+							      offset, len,
+							      direction);
+			else
+				ret = ion_sgl_sync_range(dev, table->sgl, table->nents,
+							 offset, len, direction, true);
 			goto unlock;
 		}
 	}
@@ -592,19 +608,23 @@ static int ion_dma_buf_end_cpu_access_partial(struct dma_buf *dmabuf,
 					      unsigned int offset,
 					      unsigned int len)
 {
+	struct device *dev = ion_dev;
 	struct ion_buffer *buffer = dmabuf->priv;
+	struct sg_table *table = buffer->sg_table;
 	struct ion_dma_buf_attachment *a;
 	int ret = 0;
 
 	mutex_lock(&buffer->lock);
 	if (IS_ENABLED(CONFIG_ION_FORCE_DMA_SYNC)) {
-		struct device *dev = ion_dev;
-		struct sg_table *table = buffer->sg_table;
-
 		if (dev) {
-			ret = ion_sgl_sync_range(dev, table->sgl, table->nents,
-						 offset, len, direction, false);
-
+			if (buffer->heap->type == ION_HEAP_TYPE_DMA)
+				dma_sync_single_range_for_device(dev,
+								 sg_dma_address(table->sgl),
+								 offset, len,
+								 direction);
+			else
+				ret = ion_sgl_sync_range(dev, table->sgl, table->nents,
+							 offset, len, direction, false);
 			goto unlock;
 		}
 	}

commit bfce6910d4622e3aefba36c64274fd21318aaf68
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Wed Aug 4 09:13:57 2021 +0800

    staging: ion: bypass for start cpu access if dir is DMA_TO_DEVICE
    
    From the final function
    ENTRY(__dma_unmap_area)
            cmp     w2, #DMA_TO_DEVICE
            b.ne    __dma_inv_area
            ret
    ENDPIPROC(__dma_unmap_area)
    
    if the direction isn't DMA_TO_DEVICE, it will do __dma_inv_area. So
    directly return if the dir is DMA_TO_DEVICE.
    
    Change-Id: I9ec2affddb8efb431a165100d78afca7fe6b2a45
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c
index e3051e99b200..5a17f9b6f147 100644
--- a/drivers/staging/android/ion/ion.c
+++ b/drivers/staging/android/ion/ion.c
@@ -485,6 +485,9 @@ static int ion_dma_buf_begin_cpu_access(struct dma_buf *dmabuf,
 		mutex_unlock(&buffer->lock);
 	}
 
+	if (direction == DMA_TO_DEVICE)
+		return 0;
+
 	mutex_lock(&buffer->lock);
 	if (IS_ENABLED(CONFIG_ION_FORCE_DMA_SYNC)) {
 		struct device *dev = ion_dev;
@@ -555,6 +558,9 @@ static int ion_dma_buf_begin_cpu_access_partial(struct dma_buf *dmabuf,
 	struct ion_dma_buf_attachment *a;
 	int ret = 0;
 
+	if (direction == DMA_TO_DEVICE)
+		return 0;
+
 	mutex_lock(&buffer->lock);
 	if (IS_ENABLED(CONFIG_ION_FORCE_DMA_SYNC)) {
 		struct device *dev = ion_dev;

commit ea0a51bb9d96a53e0c3c510656bd2443e900339d
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Tue Aug 3 10:34:05 2021 +0800

    dma-buf: buffer should align to cacheline size
    
    Fixes: 0f4763b1c656 ("dma-buf: add DMA_BUF_IOCTL_SYNC_PARTIAL support")
    Change-Id: Iff8b633cb89337bba3f7693a28657034a6aa2223
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
index bf92ce7e4e3e..8f101e83caed 100644
--- a/drivers/dma-buf/dma-buf.c
+++ b/drivers/dma-buf/dma-buf.c
@@ -39,6 +39,7 @@
 #include <linux/hashtable.h>
 #include <linux/list_sort.h>
 #include <linux/mount.h>
+#include <linux/cache.h>
 
 #include <uapi/linux/dma-buf.h>
 #include <uapi/linux/magic.h>
@@ -453,6 +454,9 @@ static long dma_buf_ioctl(struct file *file,
 		if (sync_p.len == 0)
 			return -EINVAL;
 
+		if ((sync_p.offset % cache_line_size()) || (sync_p.len % cache_line_size()))
+			return -EINVAL;
+
 		if (sync_p.len > dmabuf->size || sync_p.offset > dmabuf->size - sync_p.len)
 			return -EINVAL;
 

commit e497827ad3ccaeadf7d74b1f63f6fa96adb2262c
Author: Finley Xiao <finley.xiao@rock-chips.com>
Date:   Fri Jul 30 11:40:11 2021 +0800

    arm64: dts: rockchip: rk3568: Modify sustainable-power
    
    The cpufreq cooling doesn't support calculating static power in 5.10
    and the cpu and gpu opp table are changed.
    
    Change-Id: Ia1abaf6d7614b874081159db7cc41e910bf47462
    Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index 01145ddaa877..1f26350482de 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -75,14 +75,6 @@
 			cpu-idle-states = <&CPU_SLEEP>;
 			#cooling-cells = <2>;
 			dynamic-power-coefficient = <187>;
-			power-model {
-				compatible = "simple-power-model";
-				leakage-range= <10 40>;
-				ls = <(-9196) 6360 0>;
-				static-coefficient = <100000>;
-				ts = <83822 206397 (-4300) 71>;
-				thermal-zone = "soc-thermal";
-			};
 		};
 
 		cpu1: cpu@100 {
@@ -360,12 +352,12 @@
 		soc_thermal: soc-thermal {
 			polling-delay-passive = <20>; /* milliseconds */
 			polling-delay = <1000>; /* milliseconds */
-			sustainable-power = <1475>; /* milliwatts */
+			sustainable-power = <905>; /* milliwatts */
 
 			thermal-sensors = <&tsadc 0>;
 			trips {
 				threshold: trip-point-0 {
-					temperature = <70000>;
+					temperature = <75000>;
 					hysteresis = <2000>;
 					type = "passive";
 				};

commit 8593cc2d8db7b1bae53526bff7a69d5a4a3dcb1b
Author: Finley Xiao <finley.xiao@rock-chips.com>
Date:   Mon Aug 2 17:35:33 2021 +0800

    soc: rockchip: ipa: Fix getting error power model node
    
    The power model node must be the child node of the device node.
    
    Change-Id: Ib16e37c31e573f183ea304b072d2a7912e155197
    Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>

diff --git a/drivers/soc/rockchip/rockchip_ipa.c b/drivers/soc/rockchip/rockchip_ipa.c
index 927fbfbc1313..e8982b7defee 100644
--- a/drivers/soc/rockchip/rockchip_ipa.c
+++ b/drivers/soc/rockchip/rockchip_ipa.c
@@ -65,8 +65,8 @@ struct ipa_power_model_data *rockchip_ipa_power_model_init(struct device *dev,
 	if (!model_data)
 		return ERR_PTR(-ENOMEM);
 
-	model_node = of_find_compatible_node(dev->of_node,
-					     NULL, "simple-power-model");
+	model_node = of_get_compatible_child(dev->of_node,
+					     "simple-power-model");
 	if (!model_node) {
 		dev_err(dev, "failed to find power_model node\n");
 		ret = -ENODEV;
@@ -119,8 +119,11 @@ struct ipa_power_model_data *rockchip_ipa_power_model_init(struct device *dev,
 cal_static_coeff:
 	calculate_static_coefficient(model_data);
 
+	of_node_put(model_node);
+
 	return model_data;
 err:
+	of_node_put(model_node);
 	kfree(model_data);
 
 	return ERR_PTR(ret);

commit cbb6b0b79d3eb5c099609327145d13fd4942df07
Author: Wang Panzhenzhuan <randy.wang@rock-chips.com>
Date:   Mon May 17 10:23:02 2021 +0800

    media: platform: cif: fix multi dev issue
    
    if rkcif_dvp & rkcif_mipi_all registered,
    close rkcif_dvp streams alone can't reset rkcif,
    only rkcif_dvp & mipi dev all close can do reset.
    
    Signed-off-by: Wang Panzhenzhuan <randy.wang@rock-chips.com>
    Change-Id: I103ca247a0866629d351699f752293af028d29d5

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index 8a8f5f56b872..3dfaac4c870c 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -1942,6 +1942,9 @@ static void rkcif_stop_streaming(struct vb2_queue *queue)
 	struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
 	struct rkcif_buffer *buf = NULL;
 	int ret;
+	struct rkcif_hw *hw_dev = dev->hw_dev;
+	bool can_reset = true;
+	int i;
 
 	mutex_lock(&dev->stream_lock);
 
@@ -2006,7 +2009,14 @@ static void rkcif_stop_streaming(struct vb2_queue *queue)
 		dev->can_be_reset = true;
 	}
 
-	if (dev->can_be_reset && !atomic_read(&(dev->pipe.stream_cnt))) {
+	for (i = 0; i < hw_dev->dev_num; i++) {
+		if (atomic_read(&hw_dev->cif_dev[i]->pipe.stream_cnt) != 0) {
+			can_reset = false;
+			break;
+		}
+	}
+
+	if (dev->can_be_reset && can_reset) {
 		rkcif_do_cru_reset(dev);
 		dev->can_be_reset = false;
 		dev->reset_work_cancel = true;

commit 8cf5c599ca72adf9082a1a59f33f21f3552f88bc
Author: Yu Qiaowei <cerf.yu@rock-chips.com>
Date:   Wed Aug 4 17:12:58 2021 +0800

    video/rockchip: rga2: Fix rga2_dma_flush_page warnning
    
    "uninitialized symbol 'paddr'."
    
    Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
    Change-Id: Ia97afed916b5121a2d0bd20413ed31f1d6702217

diff --git a/drivers/video/rockchip/rga2/rga2_drv.c b/drivers/video/rockchip/rga2/rga2_drv.c
index f1cbf578eebf..394c495c93ff 100644
--- a/drivers/video/rockchip/rga2/rga2_drv.c
+++ b/drivers/video/rockchip/rga2/rga2_drv.c
@@ -12,7 +12,7 @@
  *
  */
 
-#define pr_fmt(fmt) "rga: " fmt
+#define pr_fmt(fmt) "rga2: " fmt
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/module.h>
diff --git a/drivers/video/rockchip/rga2/rga2_mmu_info.c b/drivers/video/rockchip/rga2/rga2_mmu_info.c
index 94a7e9274821..753e2afdd6c1 100644
--- a/drivers/video/rockchip/rga2/rga2_mmu_info.c
+++ b/drivers/video/rockchip/rga2/rga2_mmu_info.c
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0 */
 
-
+#define pr_fmt(fmt) "rga2_mmu: " fmt
 #include <linux/version.h>
 #include <linux/init.h>
 #include <linux/module.h>
@@ -65,6 +65,10 @@ dma_addr_t rga2_dma_flush_page(struct page *page, int map)
 			paddr = dma_map_page(rga2_drvdata->dev, page, 0,
 					     PAGE_SIZE, DMA_BIDIRECTIONAL);
 			break;
+		default:
+			paddr = 0;
+			pr_err("unknown map cmd 0x%x\n", map);
+			break;
 		}
 
 		return paddr;
@@ -84,6 +88,9 @@ dma_addr_t rga2_dma_flush_page(struct page *page, int map)
 			dma_unmap_page(rga2_drvdata->dev, paddr,
 				       PAGE_SIZE, DMA_BIDIRECTIONAL);
 			break;
+		default:
+			pr_err("unknown map cmd 0x%x\n", map);
+			break;
 		}
 
 		return paddr;

commit f758dd08c6cfabcbbe65c8c38029cc21fef56ed6
Merge: 15699848963a 6ca2f514c578
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Wed Aug 4 14:58:28 2021 +0200

    Merge 4.19.201 into android-4.19-stable
    
    Changes in 4.19.201
            virtio_net: Do not pull payload in skb->head
            gro: ensure frag0 meets IP header alignment
            x86/asm: Ensure asm/proto.h can be included stand-alone
            btrfs: fix rw device counting in __btrfs_free_extra_devids
            x86/kvm: fix vcpu-id indexed array sizes
            ocfs2: fix zero out valid data
            ocfs2: issue zeroout to EOF blocks
            can: raw: raw_setsockopt(): fix raw_rcv panic for sock UAF
            can: mcba_usb_start(): add missing urb->transfer_dma initialization
            can: usb_8dev: fix memory leak
            can: ems_usb: fix memory leak
            can: esd_usb2: fix memory leak
            NIU: fix incorrect error return, missed in previous revert
            nfc: nfcsim: fix use after free during module unload
            cfg80211: Fix possible memory leak in function cfg80211_bss_update
            netfilter: conntrack: adjust stop timestamp to real expiry value
            netfilter: nft_nat: allow to specify layer 4 protocol NAT only
            i40e: Fix logic of disabling queues
            i40e: Fix log TC creation failure when max num of queues is exceeded
            tipc: fix sleeping in tipc accept routine
            mlx4: Fix missing error code in mlx4_load_one()
            net: llc: fix skb_over_panic
            net/mlx5: Fix flow table chaining
            sctp: fix return value check in __sctp_rcv_asconf_lookup
            tulip: windbond-840: Fix missing pci_disable_device() in probe and remove
            sis900: Fix missing pci_disable_device() in probe and remove
            can: hi311x: fix a signedness bug in hi3110_cmd()
            powerpc/pseries: Fix regression while building external modules
            Revert "perf map: Fix dso->nsinfo refcounting"
            i40e: Add additional info to PHY type error
            Linux 4.19.201
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I89f69eba9523274f96ea396a562f340b578d968c

commit ef484cbba2eddedddc6473cf0c8e42def2b3fb35
Author: Huang zhibao <hzb@rock-chips.com>
Date:   Wed Aug 4 15:40:25 2021 +0800

    arm64: dts: rockchip: rk3568-nvr: enabled rknpu_mmu
    
    Signed-off-by: Huang zhibao <hzb@rock-chips.com>
    Change-Id: I2e28ca3322822cedceaa629baa7a407c5f99dd8c

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi
index 7697ee16ad64..45b2fdac490a 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi
@@ -56,20 +56,6 @@
 		};
 	};
 
-	reserved-memory {
-		#address-cells = <2>;
-		#size-cells = <2>;
-		ranges;
-
-		rknpu_reserved: rknpu {
-			compatible = "shared-dma-pool";
-			inactive;
-			reusable;
-			size = <0x0 0x20000000>;
-			alignment = <0x0 0x1000>;
-		};
-	};
-
 	spdif-sound {
 		status = "okay";
 		compatible = "simple-audio-card";
@@ -344,13 +330,12 @@
 };
 
 &rknpu {
-	memory-region = <&rknpu_reserved>;
 	rknpu-supply = <&vdd_npu>;
 	status = "okay";
 };
 
 &rknpu_mmu {
-	status = "disabled";
+	status = "okay";
 };
 
 &rkvdec {

commit 400987462f10dbadef625460ebec05dc11dd38fe
Author: Lei Chen <lei.chen@rock-chips.com>
Date:   Wed Aug 4 09:22:43 2021 +0800

    drm/rockchip: analogix_dp: clear the eDP flag in output_if
    
    To dynamically configure eDP to different VP ports, clear flags.
    
    Signed-off-by: Lei Chen <lei.chen@rock-chips.com>
    Change-Id: I68a9eb32f860e791e68d73fa2c083d0ce5bafb8d

diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
index 84a6c3068371..47d10d4626c3 100644
--- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
+++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
@@ -299,9 +299,12 @@ static void rockchip_dp_drm_encoder_enable(struct drm_encoder *encoder)
 		DRM_DEV_ERROR(dp->dev, "Could not write to GRF: %d\n", ret);
 }
 
-static void rockchip_dp_drm_encoder_nop(struct drm_encoder *encoder)
+static void rockchip_dp_drm_encoder_disable(struct drm_encoder *encoder)
 {
-	/* do nothing */
+	struct drm_crtc *crtc = encoder->crtc;
+	struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state);
+
+	s->output_if &= ~VOP_OUTPUT_IF_eDP0;
 }
 
 static int
@@ -400,7 +403,7 @@ static struct drm_encoder_helper_funcs rockchip_dp_encoder_helper_funcs = {
 	.mode_fixup = rockchip_dp_drm_encoder_mode_fixup,
 	.mode_set = rockchip_dp_drm_encoder_mode_set,
 	.enable = rockchip_dp_drm_encoder_enable,
-	.disable = rockchip_dp_drm_encoder_nop,
+	.disable = rockchip_dp_drm_encoder_disable,
 	.atomic_check = rockchip_dp_drm_encoder_atomic_check,
 	.loader_protect = rockchip_dp_drm_encoder_loader_protect,
 };

commit ffbc5b745c72892af85c41b758ca77d6a59e0aeb
Author: Algea Cao <algea.cao@rock-chips.com>
Date:   Fri Jul 2 15:22:55 2021 +0800

    drm/rockchip: dw_hdmi: Add property to show whether sink is DVI
    
    Add property output_type_capacity:
    enums: DVI=0 HDMI=1
    
    Signed-off-by: Algea Cao <algea.cao@rock-chips.com>
    Change-Id: Iad09b386b55c52e21b01f98e81fadfd5aa1a42d3

diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index 1bb727fe7229..d02c1bf563cf 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -2947,6 +2947,12 @@ bool dw_hdmi_get_output_whether_hdmi(struct dw_hdmi *hdmi)
 }
 EXPORT_SYMBOL_GPL(dw_hdmi_get_output_whether_hdmi);
 
+int dw_hdmi_get_output_type_cap(struct dw_hdmi *hdmi)
+{
+	return hdmi->support_hdmi;
+}
+EXPORT_SYMBOL_GPL(dw_hdmi_get_output_type_cap);
+
 static void dw_hdmi_connector_force(struct drm_connector *connector)
 {
 	struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi,
diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
index b15ceefa6795..47f913ab5972 100644
--- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
+++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
@@ -132,6 +132,7 @@ struct rockchip_hdmi {
 	struct drm_property *quant_range;
 	struct drm_property *hdr_panel_metadata_property;
 	struct drm_property *output_hdmi_dvi;
+	struct drm_property *output_type_capacity;
 
 	struct drm_property_blob *hdr_panel_blob_ptr;
 
@@ -1000,6 +1001,11 @@ static const struct drm_prop_enum_list output_hdmi_dvi_enum_list[] = {
 	{ 2, "force_dvi" },
 };
 
+static const struct drm_prop_enum_list output_type_cap_list[] = {
+	{ 0, "DVI" },
+	{ 1, "HDMI" },
+};
+
 static void
 dw_hdmi_rockchip_attach_properties(struct drm_connector *connector,
 				   unsigned int color, int version,
@@ -1129,6 +1135,15 @@ dw_hdmi_rockchip_attach_properties(struct drm_connector *connector,
 		drm_object_attach_property(&connector->base, prop, 0);
 	}
 
+	prop = drm_property_create_enum(connector->dev, 0,
+					 "output_type_capacity",
+					 output_type_cap_list,
+					 ARRAY_SIZE(output_type_cap_list));
+	if (prop) {
+		hdmi->output_type_capacity = prop;
+		drm_object_attach_property(&connector->base, prop, 0);
+	}
+
 	prop = connector->dev->mode_config.hdr_output_metadata_property;
 	if (version >= 0x211a)
 		drm_object_attach_property(&connector->base, prop, 0);
@@ -1188,6 +1203,12 @@ dw_hdmi_rockchip_destroy_properties(struct drm_connector *connector,
 				     hdmi->output_hdmi_dvi);
 		hdmi->output_hdmi_dvi = NULL;
 	}
+
+	if (hdmi->output_type_capacity) {
+		drm_property_destroy(connector->dev,
+				     hdmi->output_type_capacity);
+		hdmi->output_type_capacity = NULL;
+	}
 }
 
 static int
@@ -1298,6 +1319,9 @@ dw_hdmi_rockchip_get_property(struct drm_connector *connector,
 	} else if (property == hdmi->output_hdmi_dvi) {
 		*val = hdmi->force_output;
 		return 0;
+	} else if (property == hdmi->output_type_capacity) {
+		*val = dw_hdmi_get_output_type_cap(hdmi->hdmi);
+		return 0;
 	}
 
 	DRM_ERROR("failed to get rockchip hdmi connector property %s\n", property->name);
diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h
index 46cd16575473..12451542a2ec 100644
--- a/include/drm/bridge/dw_hdmi.h
+++ b/include/drm/bridge/dw_hdmi.h
@@ -219,5 +219,6 @@ void dw_hdmi_phy_setup_hpd(struct dw_hdmi *hdmi, void *data);
 void dw_hdmi_set_quant_range(struct dw_hdmi *hdmi);
 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);
 
 #endif /* __IMX_HDMI_H__ */

commit b4644bfc5a548044a68035d93bc945e28a20080f
Author: Algea Cao <algea.cao@rock-chips.com>
Date:   Fri Jul 2 10:58:06 2021 +0800

    drm/rockchip: dw_hdmi: Add property to switch HDMI/DVI mode
    
    Add property output_hdmi_dvi:
    enums: auto=0 force_hdmi=1 force_dvi=2
    
    Signed-off-by: Algea Cao <algea.cao@rock-chips.com>
    Change-Id: Ic048fb5c004f332b60bbbeca857de4abe9c0ca08

diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index a3255467c428..1bb727fe7229 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -324,6 +324,8 @@ struct dw_hdmi {
 	bool sink_is_hdmi;
 	bool sink_has_audio;
 	bool hpd_state;
+	bool support_hdmi;
+	int force_output;
 
 	struct delayed_work work;
 	struct workqueue_struct *workqueue;
@@ -390,6 +392,16 @@ static void hdmi_mask_writeb(struct dw_hdmi *hdmi, u8 data, unsigned int reg,
 	hdmi_modb(hdmi, data << shift, mask, reg);
 }
 
+static void dw_hdmi_check_output_type(struct dw_hdmi *hdmi)
+{
+	if (hdmi->force_output == 1)
+		hdmi->sink_is_hdmi = true;
+	else if (hdmi->force_output == 2)
+		hdmi->sink_is_hdmi = false;
+	else
+		hdmi->sink_is_hdmi = hdmi->support_hdmi;
+}
+
 static void repo_hpd_event(struct work_struct *p_work)
 {
 	struct dw_hdmi *hdmi = container_of(p_work, struct dw_hdmi, work.work);
@@ -2740,7 +2752,7 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
 		dev_dbg(hdmi->dev, "got edid: width[%d] x height[%d]\n",
 			edid->width_cm, edid->height_cm);
 
-		hdmi->sink_is_hdmi = drm_detect_hdmi_monitor(edid);
+		hdmi->support_hdmi = drm_detect_hdmi_monitor(edid);
 		hdmi->sink_has_audio = drm_detect_monitor_audio(edid);
 		drm_connector_update_edid_property(connector, edid);
 		cec_notifier_set_phys_addr_from_edid(hdmi->cec_notifier, edid);
@@ -2748,7 +2760,7 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
 		dw_hdmi_update_hdr_property(connector);
 		kfree(edid);
 	} else {
-		hdmi->sink_is_hdmi = true;
+		hdmi->support_hdmi = true;
 		hdmi->sink_has_audio = true;
 
 		for (i = 0; i < ARRAY_SIZE(dw_hdmi_default_modes); i++) {
@@ -2772,6 +2784,7 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
 
 		dev_info(hdmi->dev, "failed to get edid\n");
 	}
+	dw_hdmi_check_output_type(hdmi);
 
 	return ret;
 }
@@ -2916,6 +2929,24 @@ void dw_hdmi_set_quant_range(struct dw_hdmi *hdmi)
 }
 EXPORT_SYMBOL_GPL(dw_hdmi_set_quant_range);
 
+void dw_hdmi_set_output_type(struct dw_hdmi *hdmi, u64 val)
+{
+	hdmi->force_output = val;
+
+	dw_hdmi_check_output_type(hdmi);
+
+	hdmi_writeb(hdmi, HDMI_FC_GCP_SET_AVMUTE, HDMI_FC_GCP);
+	dw_hdmi_setup(hdmi, &hdmi->previous_mode);
+	hdmi_writeb(hdmi, HDMI_FC_GCP_CLEAR_AVMUTE, HDMI_FC_GCP);
+}
+EXPORT_SYMBOL_GPL(dw_hdmi_set_output_type);
+
+bool dw_hdmi_get_output_whether_hdmi(struct dw_hdmi *hdmi)
+{
+	return hdmi->sink_is_hdmi;
+}
+EXPORT_SYMBOL_GPL(dw_hdmi_get_output_whether_hdmi);
+
 static void dw_hdmi_connector_force(struct drm_connector *connector)
 {
 	struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi,
diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
index 094061cd7b7d..b15ceefa6795 100644
--- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
+++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
@@ -116,6 +116,7 @@ struct rockchip_hdmi {
 	bool unsupported_yuv_input;
 	bool unsupported_deep_color;
 	bool mode_changed;
+	u8 force_output;
 	u8 id;
 
 	unsigned long bus_format;
@@ -130,6 +131,7 @@ struct rockchip_hdmi {
 	struct drm_property *colorimetry_property;
 	struct drm_property *quant_range;
 	struct drm_property *hdr_panel_metadata_property;
+	struct drm_property *output_hdmi_dvi;
 
 	struct drm_property_blob *hdr_panel_blob_ptr;
 
@@ -642,6 +644,7 @@ dw_hdmi_rockchip_select_output(struct drm_connector_state *conn_state,
 	unsigned long tmdsclock, pixclock = mode->crtc_clock;
 	unsigned int color_depth;
 	bool support_dc = false;
+	bool sink_is_hdmi = dw_hdmi_get_output_whether_hdmi(hdmi->hdmi);
 	int max_tmds_clock = info->max_tmds_clock;
 	int output_eotf;
 
@@ -702,6 +705,11 @@ dw_hdmi_rockchip_select_output(struct drm_connector_state *conn_state,
 	else
 		color_depth = 8;
 
+	if (!sink_is_hdmi) {
+		*color_format = DRM_HDMI_OUTPUT_DEFAULT_RGB;
+		color_depth = 8;
+	}
+
 	*eotf = TRADITIONAL_GAMMA_SDR;
 	if (conn_state->hdr_output_metadata) {
 		hdr_metadata = (struct hdr_output_metadata *)
@@ -986,6 +994,12 @@ static const struct drm_prop_enum_list colorimetry_enum_list[] = {
 	{ RK_HDMI_COLORIMETRY_BT2020, "ITU_2020" },
 };
 
+static const struct drm_prop_enum_list output_hdmi_dvi_enum_list[] = {
+	{ 0, "auto" },
+	{ 1, "force_hdmi" },
+	{ 2, "force_dvi" },
+};
+
 static void
 dw_hdmi_rockchip_attach_properties(struct drm_connector *connector,
 				   unsigned int color, int version,
@@ -1106,6 +1120,15 @@ dw_hdmi_rockchip_attach_properties(struct drm_connector *connector,
 		drm_object_attach_property(&connector->base, prop, 0);
 	}
 
+	prop = drm_property_create_enum(connector->dev, 0,
+					"output_hdmi_dvi",
+					output_hdmi_dvi_enum_list,
+					ARRAY_SIZE(output_hdmi_dvi_enum_list));
+	if (prop) {
+		hdmi->output_hdmi_dvi = prop;
+		drm_object_attach_property(&connector->base, prop, 0);
+	}
+
 	prop = connector->dev->mode_config.hdr_output_metadata_property;
 	if (version >= 0x211a)
 		drm_object_attach_property(&connector->base, prop, 0);
@@ -1159,6 +1182,12 @@ dw_hdmi_rockchip_destroy_properties(struct drm_connector *connector,
 				     hdmi->hdr_panel_metadata_property);
 		hdmi->hdr_panel_metadata_property = NULL;
 	}
+
+	if (hdmi->output_hdmi_dvi) {
+		drm_property_destroy(connector->dev,
+				     hdmi->output_hdmi_dvi);
+		hdmi->output_hdmi_dvi = NULL;
+	}
 }
 
 static int
@@ -1195,6 +1224,12 @@ dw_hdmi_rockchip_set_property(struct drm_connector *connector,
 	} else if (property == hdmi->colorimetry_property) {
 		hdmi->colorimetry = val;
 		return 0;
+	} else if (property == hdmi->output_hdmi_dvi) {
+		if (hdmi->force_output != val)
+			hdmi->color_changed++;
+		hdmi->force_output = val;
+		dw_hdmi_set_output_type(hdmi->hdmi, val);
+		return 0;
 	}
 
 	DRM_ERROR("failed to set rockchip hdmi connector property %s\n", property->name);
@@ -1260,6 +1295,9 @@ dw_hdmi_rockchip_get_property(struct drm_connector *connector,
 	} else if (property == private->connector_id_prop) {
 		*val = hdmi->id;
 		return 0;
+	} else if (property == hdmi->output_hdmi_dvi) {
+		*val = hdmi->force_output;
+		return 0;
 	}
 
 	DRM_ERROR("failed to get rockchip hdmi connector property %s\n", property->name);
diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h
index 5e3e592d5bd6..46cd16575473 100644
--- a/include/drm/bridge/dw_hdmi.h
+++ b/include/drm/bridge/dw_hdmi.h
@@ -217,5 +217,7 @@ void dw_hdmi_phy_update_hpd(struct dw_hdmi *hdmi, void *data,
 			    bool force, bool disabled, bool rxsense);
 void dw_hdmi_phy_setup_hpd(struct dw_hdmi *hdmi, void *data);
 void dw_hdmi_set_quant_range(struct dw_hdmi *hdmi);
+void dw_hdmi_set_output_type(struct dw_hdmi *hdmi, u64 val);
+bool dw_hdmi_get_output_whether_hdmi(struct dw_hdmi *hdmi);
 
 #endif /* __IMX_HDMI_H__ */

commit bab03f605fd8ebf4bc4b750854b974261073cabb
Author: Algea Cao <algea.cao@rock-chips.com>
Date:   Thu Jul 1 18:04:41 2021 +0800

    drm/rockchip: dw_hdmi: Support set quant range take effect immediately
    
    When set property hdmi_quant_range, quant range was changed immediately.
    
    Signed-off-by: Algea Cao <algea.cao@rock-chips.com>
    Change-Id: Ib8c14404cc3dde645012399b6155d047b4e9609a

diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index 4f9cf315801c..a3255467c428 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -2908,6 +2908,14 @@ static int dw_hdmi_connector_atomic_check(struct drm_connector *connector,
 	return 0;
 }
 
+void dw_hdmi_set_quant_range(struct dw_hdmi *hdmi)
+{
+	hdmi_writeb(hdmi, HDMI_FC_GCP_SET_AVMUTE, HDMI_FC_GCP);
+	dw_hdmi_setup(hdmi, &hdmi->previous_mode);
+	hdmi_writeb(hdmi, HDMI_FC_GCP_CLEAR_AVMUTE, HDMI_FC_GCP);
+}
+EXPORT_SYMBOL_GPL(dw_hdmi_set_quant_range);
+
 static void dw_hdmi_connector_force(struct drm_connector *connector)
 {
 	struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi,
diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
index 40cce5486ebe..094061cd7b7d 100644
--- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
+++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
@@ -1188,6 +1188,7 @@ dw_hdmi_rockchip_set_property(struct drm_connector *connector,
 		return 0;
 	} else if (property == hdmi->quant_range) {
 		hdmi->hdmi_quant_range = val;
+		dw_hdmi_set_quant_range(hdmi->hdmi);
 		return 0;
 	} else if (property == config->hdr_output_metadata_property) {
 		return 0;
diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h
index 12d129db70dc..5e3e592d5bd6 100644
--- a/include/drm/bridge/dw_hdmi.h
+++ b/include/drm/bridge/dw_hdmi.h
@@ -216,5 +216,6 @@ enum drm_connector_status dw_hdmi_phy_read_hpd(struct dw_hdmi *hdmi,
 void dw_hdmi_phy_update_hpd(struct dw_hdmi *hdmi, void *data,
 			    bool force, bool disabled, bool rxsense);
 void dw_hdmi_phy_setup_hpd(struct dw_hdmi *hdmi, void *data);
+void dw_hdmi_set_quant_range(struct dw_hdmi *hdmi);
 
 #endif /* __IMX_HDMI_H__ */

commit 474fc0a02541adabc3105086fd59bb838427376f
Author: Algea Cao <algea.cao@rock-chips.com>
Date:   Fri Jul 2 15:37:06 2021 +0800

    drm/bridge: dw-hdmi: Make sure to output full range RGB in DVI mode
    
    Signed-off-by: Algea Cao <algea.cao@rock-chips.com>
    Change-Id: I0858fe28139ead5fba6fc797cb6f3bec00f333fa

diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index 0df9ddfcaf55..4f9cf315801c 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -2478,6 +2478,9 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
 	else
 		hdmi->hdmi_data.quant_range = HDMI_QUANTIZATION_RANGE_DEFAULT;
 
+	if (!hdmi->sink_is_hdmi)
+		hdmi->hdmi_data.quant_range = HDMI_QUANTIZATION_RANGE_FULL;
+
 	/*
 	 * According to the dw-hdmi specification 6.4.2
 	 * vp_pr_cd[3:0]:

commit 6ca2f514c57864e3085a65c5e9d2adca4144bc4c
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Wed Aug 4 12:23:47 2021 +0200

    Linux 4.19.201
    
    Link: https://lore.kernel.org/r/20210802134334.081433902@linuxfoundation.org
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index a4ea351c4e5d..80954901733d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 200
+SUBLEVEL = 201
 EXTRAVERSION =
 NAME = "People's Front"
 

commit fbb04f7cf9cfaee7d8300c614a06adb813846a74
Author: Lukasz Cieplicki <lukaszx.cieplicki@intel.com>
Date:   Mon May 31 16:55:49 2021 +0000

    i40e: Add additional info to PHY type error
    
    commit dc614c46178b0b89bde86ac54fc687a28580d2b7 upstream.
    
    In case of PHY type error occurs, the message was too generic.
    Add additional info to PHY type error indicating that it can be
    wrong cable connected.
    
    Fixes: 124ed15bf126 ("i40e: Add dual speed module support")
    Signed-off-by: Lukasz Cieplicki <lukaszx.cieplicki@intel.com>
    Signed-off-by: Michal Maloszewski <michal.maloszewski@intel.com>
    Tested-by: Tony Brelinski <tonyx.brelinski@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index 4c7c1998f358..5242d3dfeb22 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -674,7 +674,7 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
 	default:
 		/* if we got here and link is up something bad is afoot */
 		netdev_info(netdev,
-			    "WARNING: Link is up but PHY type 0x%x is not recognized.\n",
+			    "WARNING: Link is up but PHY type 0x%x is not recognized, or incorrect cable is in use\n",
 			    hw_link_info->phy_type);
 	}
 

commit 265c33f7417646cf6a48327e2fdabf49d3262cd3
Author: Arnaldo Carvalho de Melo <acme@redhat.com>
Date:   Fri Jul 30 18:26:22 2021 -0300

    Revert "perf map: Fix dso->nsinfo refcounting"
    
    commit 9bac1bd6e6d36459087a728a968e79e37ebcea1a upstream.
    
    This makes 'perf top' abort in some cases, and the right fix will
    involve surgery that is too much to do at this stage, so revert for now
    and fix it in the next merge window.
    
    This reverts commit 2d6b74baa7147251c30a46c4996e8cc224aa2dc5.
    
    Cc: Riccardo Mancini <rickyman7@gmail.com>
    Cc: Ian Rogers <irogers@google.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Krister Johansen <kjlx@templeofstupid.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c
index 603086692290..769d11575a7b 100644
--- a/tools/perf/util/map.c
+++ b/tools/perf/util/map.c
@@ -209,8 +209,6 @@ struct map *map__new(struct machine *machine, u64 start, u64 len,
 			if (!(prot & PROT_EXEC))
 				dso__set_loaded(dso);
 		}
-
-		nsinfo__put(dso->nsinfo);
 		dso->nsinfo = nsi;
 		dso__put(dso);
 	}

commit 91bbeacf5a4c78176042aca62708b6bb5ab68a37
Author: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Date:   Thu Jul 29 11:34:49 2021 +0530

    powerpc/pseries: Fix regression while building external modules
    
    commit 333cf507465fbebb3727f5b53e77538467df312a upstream.
    
    With commit c9f3401313a5 ("powerpc: Always enable queued spinlocks for
    64s, disable for others") CONFIG_PPC_QUEUED_SPINLOCKS is always
    enabled on ppc64le, external modules that use spinlock APIs are
    failing.
    
      ERROR: modpost: GPL-incompatible module XXX.ko uses GPL-only symbol 'shared_processor'
    
    Before the above commit, modules were able to build without any
    issues. Also this problem is not seen on other architectures. This
    problem can be workaround if CONFIG_UNINLINE_SPIN_UNLOCK is enabled in
    the config. However CONFIG_UNINLINE_SPIN_UNLOCK is not enabled by
    default and only enabled in certain conditions like
    CONFIG_DEBUG_SPINLOCKS is set in the kernel config.
    
      #include <linux/module.h>
      spinlock_t spLock;
    
      static int __init spinlock_test_init(void)
      {
              spin_lock_init(&spLock);
              spin_lock(&spLock);
              spin_unlock(&spLock);
              return 0;
      }
    
      static void __exit spinlock_test_exit(void)
      {
            printk("spinlock_test unloaded\n");
      }
      module_init(spinlock_test_init);
      module_exit(spinlock_test_exit);
    
      MODULE_DESCRIPTION ("spinlock_test");
      MODULE_LICENSE ("non-GPL");
      MODULE_AUTHOR ("Srikar Dronamraju");
    
    Given that spin locks are one of the basic facilities for module code,
    this effectively makes it impossible to build/load almost any non GPL
    modules on ppc64le.
    
    This was first reported at https://github.com/openzfs/zfs/issues/11172
    
    Currently shared_processor is exported as GPL only symbol.
    Fix this for parity with other architectures by exposing
    shared_processor to non-GPL modules too.
    
    Fixes: 14c73bd344da ("powerpc/vcpu: Assume dedicated processors as non-preempt")
    Cc: stable@vger.kernel.org # v5.5+
    Reported-by: marc.c.dionne@gmail.com
    Signed-off-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210729060449.292780-1-srikar@linux.vnet.ibm.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
index 2e0d38cafdd4..885d910bfd9d 100644
--- a/arch/powerpc/platforms/pseries/setup.c
+++ b/arch/powerpc/platforms/pseries/setup.c
@@ -76,7 +76,7 @@
 #include "../../../../drivers/pci/pci.h"
 
 DEFINE_STATIC_KEY_FALSE(shared_processor);
-EXPORT_SYMBOL_GPL(shared_processor);
+EXPORT_SYMBOL(shared_processor);
 
 int CMO_PrPSP = -1;
 int CMO_SecPSP = -1;

commit 5a6c550c2f0e49492a906ebd08d8af9b455c4fa9
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Thu Jul 29 17:12:46 2021 +0300

    can: hi311x: fix a signedness bug in hi3110_cmd()
    
    [ Upstream commit f6b3c7848e66e9046c8a79a5b88fd03461cc252b ]
    
    The hi3110_cmd() is supposed to return zero on success and negative
    error codes on failure, but it was accidentally declared as a u8 when
    it needs to be an int type.
    
    Fixes: 57e83fb9b746 ("can: hi311x: Add Holt HI-311x CAN driver")
    Link: https://lore.kernel.org/r/20210729141246.GA1267@kili
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/can/spi/hi311x.c b/drivers/net/can/spi/hi311x.c
index ddaf46239e39..472175e37055 100644
--- a/drivers/net/can/spi/hi311x.c
+++ b/drivers/net/can/spi/hi311x.c
@@ -236,7 +236,7 @@ static int hi3110_spi_trans(struct spi_device *spi, int len)
 	return ret;
 }
 
-static u8 hi3110_cmd(struct spi_device *spi, u8 command)
+static int hi3110_cmd(struct spi_device *spi, u8 command)
 {
 	struct hi3110_priv *priv = spi_get_drvdata(spi);
 

commit 6bee38856647fa679bf08966be7f0c84a3db9994
Author: Wang Hai <wanghai38@huawei.com>
Date:   Wed Jul 28 20:11:07 2021 +0800

    sis900: Fix missing pci_disable_device() in probe and remove
    
    [ Upstream commit 89fb62fde3b226f99b7015280cf132e2a7438edf ]
    
    Replace pci_enable_device() with pcim_enable_device(),
    pci_disable_device() and pci_release_regions() will be
    called in release automatically.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Wang Hai <wanghai38@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/sis/sis900.c b/drivers/net/ethernet/sis/sis900.c
index 823873030a21..e1bd9eacee17 100644
--- a/drivers/net/ethernet/sis/sis900.c
+++ b/drivers/net/ethernet/sis/sis900.c
@@ -441,7 +441,7 @@ static int sis900_probe(struct pci_dev *pci_dev,
 #endif
 
 	/* setup various bits in PCI command register */
-	ret = pci_enable_device(pci_dev);
+	ret = pcim_enable_device(pci_dev);
 	if(ret) return ret;
 
 	i = pci_set_dma_mask(pci_dev, DMA_BIT_MASK(32));
@@ -467,7 +467,7 @@ static int sis900_probe(struct pci_dev *pci_dev,
 	ioaddr = pci_iomap(pci_dev, 0, 0);
 	if (!ioaddr) {
 		ret = -ENOMEM;
-		goto err_out_cleardev;
+		goto err_out;
 	}
 
 	sis_priv = netdev_priv(net_dev);
@@ -575,8 +575,6 @@ static int sis900_probe(struct pci_dev *pci_dev,
 		sis_priv->tx_ring_dma);
 err_out_unmap:
 	pci_iounmap(pci_dev, ioaddr);
-err_out_cleardev:
-	pci_release_regions(pci_dev);
  err_out:
 	free_netdev(net_dev);
 	return ret;
@@ -2421,7 +2419,6 @@ static void sis900_remove(struct pci_dev *pci_dev)
 		sis_priv->tx_ring_dma);
 	pci_iounmap(pci_dev, sis_priv->ioaddr);
 	free_netdev(net_dev);
-	pci_release_regions(pci_dev);
 }
 
 #ifdef CONFIG_PM

commit fdb90238e5f54868e9c4a176d2b11e6f2105d23c
Author: Wang Hai <wanghai38@huawei.com>
Date:   Wed Jul 28 15:43:13 2021 +0800

    tulip: windbond-840: Fix missing pci_disable_device() in probe and remove
    
    [ Upstream commit 76a16be07b209a3f507c72abe823bd3af1c8661a ]
    
    Replace pci_enable_device() with pcim_enable_device(),
    pci_disable_device() and pci_release_regions() will be
    called in release automatically.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Wang Hai <wanghai38@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/dec/tulip/winbond-840.c b/drivers/net/ethernet/dec/tulip/winbond-840.c
index 70cb2d689c2c..79bdd2a79dbd 100644
--- a/drivers/net/ethernet/dec/tulip/winbond-840.c
+++ b/drivers/net/ethernet/dec/tulip/winbond-840.c
@@ -367,7 +367,7 @@ static int w840_probe1(struct pci_dev *pdev, const struct pci_device_id *ent)
 	int i, option = find_cnt < MAX_UNITS ? options[find_cnt] : 0;
 	void __iomem *ioaddr;
 
-	i = pci_enable_device(pdev);
+	i = pcim_enable_device(pdev);
 	if (i) return i;
 
 	pci_set_master(pdev);
@@ -389,7 +389,7 @@ static int w840_probe1(struct pci_dev *pdev, const struct pci_device_id *ent)
 
 	ioaddr = pci_iomap(pdev, TULIP_BAR, netdev_res_size);
 	if (!ioaddr)
-		goto err_out_free_res;
+		goto err_out_netdev;
 
 	for (i = 0; i < 3; i++)
 		((__le16 *)dev->dev_addr)[i] = cpu_to_le16(eeprom_read(ioaddr, i));
@@ -468,8 +468,6 @@ static int w840_probe1(struct pci_dev *pdev, const struct pci_device_id *ent)
 
 err_out_cleardev:
 	pci_iounmap(pdev, ioaddr);
-err_out_free_res:
-	pci_release_regions(pdev);
 err_out_netdev:
 	free_netdev (dev);
 	return -ENODEV;
@@ -1535,7 +1533,6 @@ static void w840_remove1(struct pci_dev *pdev)
 	if (dev) {
 		struct netdev_private *np = netdev_priv(dev);
 		unregister_netdev(dev);
-		pci_release_regions(pdev);
 		pci_iounmap(pdev, np->base_addr);
 		free_netdev(dev);
 	}

commit d9b6f0a200bef5fb9ba00e4e7d0d51f0b0fa5c6f
Author: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Date:   Tue Jul 27 23:40:54 2021 -0300

    sctp: fix return value check in __sctp_rcv_asconf_lookup
    
    [ Upstream commit 557fb5862c9272ad9b21407afe1da8acfd9b53eb ]
    
    As Ben Hutchings noticed, this check should have been inverted: the call
    returns true in case of success.
    
    Reported-by: Ben Hutchings <ben@decadent.org.uk>
    Fixes: 0c5dc070ff3d ("sctp: validate from_addr_param return")
    Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Reviewed-by: Xin Long <lucien.xin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sctp/input.c b/net/sctp/input.c
index 203aaefd8d04..23c4f14bec25 100644
--- a/net/sctp/input.c
+++ b/net/sctp/input.c
@@ -1132,7 +1132,7 @@ static struct sctp_association *__sctp_rcv_asconf_lookup(
 	if (unlikely(!af))
 		return NULL;
 
-	if (af->from_addr_param(&paddr, param, peer_port, 0))
+	if (!af->from_addr_param(&paddr, param, peer_port, 0))
 		return NULL;
 
 	return __sctp_lookup_association(net, laddr, &paddr, transportp);

commit 2a7b6a5203b6f80c35fcd66c995201cb54f4178f
Author: Maor Gottlieb <maorg@nvidia.com>
Date:   Mon Jul 26 09:20:14 2021 +0300

    net/mlx5: Fix flow table chaining
    
    [ Upstream commit 8b54874ef1617185048029a3083d510569e93751 ]
    
    Fix a bug when flow table is created in priority that already
    has other flow tables as shown in the below diagram.
    If the new flow table (FT-B) has the lowest level in the priority,
    we need to connect the flow tables from the previous priority (p0)
    to this new table. In addition when this flow table is destroyed
    (FT-B), we need to connect the flow tables from the previous
    priority (p0) to the next level flow table (FT-C) in the same
    priority of the destroyed table (if exists).
    
                           ---------
                           |root_ns|
                           ---------
                                |
                --------------------------------
                |               |              |
           ----------      ----------      ---------
           |p(prio)-x|     |   p-y  |      |   p-n |
           ----------      ----------      ---------
                |               |
         ----------------  ------------------
         |ns(e.g bypass)|  |ns(e.g. kernel) |
         ----------------  ------------------
                |            |           |
            -------        ------       ----
            |  p0 |        | p1 |       |p2|
            -------        ------       ----
               |             |    \
            --------       ------- ------
            | FT-A |       |FT-B | |FT-C|
            --------       ------- ------
    
    Fixes: f90edfd279f3 ("net/mlx5_core: Connect flow tables")
    Signed-off-by: Maor Gottlieb <maorg@nvidia.com>
    Reviewed-by: Mark Bloch <mbloch@nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
index a38a0c86705a..774f0a619a6d 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
@@ -904,17 +904,19 @@ static int connect_fwd_rules(struct mlx5_core_dev *dev,
 static int connect_flow_table(struct mlx5_core_dev *dev, struct mlx5_flow_table *ft,
 			      struct fs_prio *prio)
 {
-	struct mlx5_flow_table *next_ft;
+	struct mlx5_flow_table *next_ft, *first_ft;
 	int err = 0;
 
 	/* Connect_prev_fts and update_root_ft_create are mutually exclusive */
 
-	if (list_empty(&prio->node.children)) {
+	first_ft = list_first_entry_or_null(&prio->node.children,
+					    struct mlx5_flow_table, node.list);
+	if (!first_ft || first_ft->level > ft->level) {
 		err = connect_prev_fts(dev, ft, prio);
 		if (err)
 			return err;
 
-		next_ft = find_next_chained_ft(prio);
+		next_ft = first_ft ? first_ft : find_next_chained_ft(prio);
 		err = connect_fwd_rules(dev, ft, next_ft);
 		if (err)
 			return err;
@@ -1945,7 +1947,7 @@ static int disconnect_flow_table(struct mlx5_flow_table *ft)
 				node.list) == ft))
 		return 0;
 
-	next_ft = find_next_chained_ft(prio);
+	next_ft = find_next_ft(ft);
 	err = connect_fwd_rules(dev, next_ft, ft);
 	if (err)
 		return err;

commit 9a27cd7f98627ac5166022572f6955da4af4091d
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Sun Jul 25 00:11:59 2021 +0300

    net: llc: fix skb_over_panic
    
    [ Upstream commit c7c9d2102c9c098916ab9e0ab248006107d00d6c ]
    
    Syzbot reported skb_over_panic() in llc_pdu_init_as_xid_cmd(). The
    problem was in wrong LCC header manipulations.
    
    Syzbot's reproducer tries to send XID packet. llc_ui_sendmsg() is
    doing following steps:
    
            1. skb allocation with size = len + header size
                    len is passed from userpace and header size
                    is 3 since addr->sllc_xid is set.
    
            2. skb_reserve() for header_len = 3
            3. filling all other space with memcpy_from_msg()
    
    Ok, at this moment we have fully loaded skb, only headers needs to be
    filled.
    
    Then code comes to llc_sap_action_send_xid_c(). This function pushes 3
    bytes for LLC PDU header and initializes it. Then comes
    llc_pdu_init_as_xid_cmd(). It initalizes next 3 bytes *AFTER* LLC PDU
    header and call skb_push(skb, 3). This looks wrong for 2 reasons:
    
            1. Bytes rigth after LLC header are user data, so this function
               was overwriting payload.
    
            2. skb_push(skb, 3) call can cause skb_over_panic() since
               all free space was filled in llc_ui_sendmsg(). (This can
               happen is user passed 686 len: 686 + 14 (eth header) + 3 (LLC
               header) = 703. SKB_DATA_ALIGN(703) = 704)
    
    So, in this patch I added 2 new private constansts: LLC_PDU_TYPE_U_XID
    and LLC_PDU_LEN_U_XID. LLC_PDU_LEN_U_XID is used to correctly reserve
    header size to handle LLC + XID case. LLC_PDU_TYPE_U_XID is used by
    llc_pdu_header_init() function to push 6 bytes instead of 3. And finally
    I removed skb_push() call from llc_pdu_init_as_xid_cmd().
    
    This changes should not affect other parts of LLC, since after
    all steps we just transmit buffer.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-and-tested-by: syzbot+5e5a981ad7cc54c4b2b4@syzkaller.appspotmail.com
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/net/llc_pdu.h b/include/net/llc_pdu.h
index c0f0a13ed818..49aa79c7b278 100644
--- a/include/net/llc_pdu.h
+++ b/include/net/llc_pdu.h
@@ -15,9 +15,11 @@
 #include <linux/if_ether.h>
 
 /* Lengths of frame formats */
-#define LLC_PDU_LEN_I	4       /* header and 2 control bytes */
-#define LLC_PDU_LEN_S	4
-#define LLC_PDU_LEN_U	3       /* header and 1 control byte */
+#define LLC_PDU_LEN_I		4       /* header and 2 control bytes */
+#define LLC_PDU_LEN_S		4
+#define LLC_PDU_LEN_U		3       /* header and 1 control byte */
+/* header and 1 control byte and XID info */
+#define LLC_PDU_LEN_U_XID	(LLC_PDU_LEN_U + sizeof(struct llc_xid_info))
 /* Known SAP addresses */
 #define LLC_GLOBAL_SAP	0xFF
 #define LLC_NULL_SAP	0x00	/* not network-layer visible */
@@ -50,9 +52,10 @@
 #define LLC_PDU_TYPE_U_MASK    0x03	/* 8-bit control field */
 #define LLC_PDU_TYPE_MASK      0x03
 
-#define LLC_PDU_TYPE_I	0	/* first bit */
-#define LLC_PDU_TYPE_S	1	/* first two bits */
-#define LLC_PDU_TYPE_U	3	/* first two bits */
+#define LLC_PDU_TYPE_I		0	/* first bit */
+#define LLC_PDU_TYPE_S		1	/* first two bits */
+#define LLC_PDU_TYPE_U		3	/* first two bits */
+#define LLC_PDU_TYPE_U_XID	4	/* private type for detecting XID commands */
 
 #define LLC_PDU_TYPE_IS_I(pdu) \
 	((!(pdu->ctrl_1 & LLC_PDU_TYPE_I_MASK)) ? 1 : 0)
@@ -230,9 +233,18 @@ static inline struct llc_pdu_un *llc_pdu_un_hdr(struct sk_buff *skb)
 static inline void llc_pdu_header_init(struct sk_buff *skb, u8 type,
 				       u8 ssap, u8 dsap, u8 cr)
 {
-	const int hlen = type == LLC_PDU_TYPE_U ? 3 : 4;
+	int hlen = 4; /* default value for I and S types */
 	struct llc_pdu_un *pdu;
 
+	switch (type) {
+	case LLC_PDU_TYPE_U:
+		hlen = 3;
+		break;
+	case LLC_PDU_TYPE_U_XID:
+		hlen = 6;
+		break;
+	}
+
 	skb_push(skb, hlen);
 	skb_reset_network_header(skb);
 	pdu = llc_pdu_un_hdr(skb);
@@ -374,7 +386,10 @@ static inline void llc_pdu_init_as_xid_cmd(struct sk_buff *skb,
 	xid_info->fmt_id = LLC_XID_FMT_ID;	/* 0x81 */
 	xid_info->type	 = svcs_supported;
 	xid_info->rw	 = rx_window << 1;	/* size of receive window */
-	skb_put(skb, sizeof(struct llc_xid_info));
+
+	/* no need to push/put since llc_pdu_header_init() has already
+	 * pushed 3 + 3 bytes
+	 */
 }
 
 /**
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c
index bcba579e292f..89a3dc7d5d40 100644
--- a/net/llc/af_llc.c
+++ b/net/llc/af_llc.c
@@ -98,8 +98,16 @@ static inline u8 llc_ui_header_len(struct sock *sk, struct sockaddr_llc *addr)
 {
 	u8 rc = LLC_PDU_LEN_U;
 
-	if (addr->sllc_test || addr->sllc_xid)
+	if (addr->sllc_test)
 		rc = LLC_PDU_LEN_U;
+	else if (addr->sllc_xid)
+		/* We need to expand header to sizeof(struct llc_xid_info)
+		 * since llc_pdu_init_as_xid_cmd() sets 4,5,6 bytes of LLC header
+		 * as XID PDU. In llc_ui_sendmsg() we reserved header size and then
+		 * filled all other space with user data. If we won't reserve this
+		 * bytes, llc_pdu_init_as_xid_cmd() will overwrite user data
+		 */
+		rc = LLC_PDU_LEN_U_XID;
 	else if (sk->sk_type == SOCK_STREAM)
 		rc = LLC_PDU_LEN_I;
 	return rc;
diff --git a/net/llc/llc_s_ac.c b/net/llc/llc_s_ac.c
index 7ae4cc684d3a..9fa3342c7a82 100644
--- a/net/llc/llc_s_ac.c
+++ b/net/llc/llc_s_ac.c
@@ -79,7 +79,7 @@ int llc_sap_action_send_xid_c(struct llc_sap *sap, struct sk_buff *skb)
 	struct llc_sap_state_ev *ev = llc_sap_ev(skb);
 	int rc;
 
-	llc_pdu_header_init(skb, LLC_PDU_TYPE_U, ev->saddr.lsap,
+	llc_pdu_header_init(skb, LLC_PDU_TYPE_U_XID, ev->saddr.lsap,
 			    ev->daddr.lsap, LLC_PDU_CMD);
 	llc_pdu_init_as_xid_cmd(skb, LLC_XID_NULL_CLASS_2, 0);
 	rc = llc_mac_hdr_init(skb, ev->saddr.mac, ev->daddr.mac);

commit 6f243cef30e4439122da672f6b845c1a9349da8d
Author: Jiapeng Chong <jiapeng.chong@linux.alibaba.com>
Date:   Fri Jul 23 18:36:09 2021 +0800

    mlx4: Fix missing error code in mlx4_load_one()
    
    [ Upstream commit 7e4960b3d66d7248b23de3251118147812b42da2 ]
    
    The error code is missing in this code scenario, add the error code
    '-EINVAL' to the return value 'err'.
    
    Eliminate the follow smatch warning:
    
    drivers/net/ethernet/mellanox/mlx4/main.c:3538 mlx4_load_one() warn:
    missing error code 'err'.
    
    Reported-by: Abaci Robot <abaci@linux.alibaba.com>
    Fixes: 7ae0e400cd93 ("net/mlx4_core: Flexible (asymmetric) allocation of EQs and MSI-X vectors for PF/VFs")
    Signed-off-by: Jiapeng Chong <jiapeng.chong@linux.alibaba.com>
    Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
index a0affcb090a0..d9707d47f1e7 100644
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/main.c
@@ -3515,6 +3515,7 @@ static int mlx4_load_one(struct pci_dev *pdev, int pci_dev_data,
 
 		if (!SRIOV_VALID_STATE(dev->flags)) {
 			mlx4_err(dev, "Invalid SRIOV state\n");
+			err = -EINVAL;
 			goto err_close;
 		}
 	}

commit 01f178e5f855d38da00f87e9ba51764757e9cee4
Author: Hoang Le <hoang.h.le@dektech.com.au>
Date:   Fri Jul 23 09:25:34 2021 +0700

    tipc: fix sleeping in tipc accept routine
    
    [ Upstream commit d237a7f11719ff9320721be5818352e48071aab6 ]
    
    The release_sock() is blocking function, it would change the state
    after sleeping. In order to evaluate the stated condition outside
    the socket lock context, switch to use wait_woken() instead.
    
    Fixes: 6398e23cdb1d8 ("tipc: standardize accept routine")
    Acked-by: Jon Maloy <jmaloy@redhat.com>
    Signed-off-by: Hoang Le <hoang.h.le@dektech.com.au>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index 3c41fb8edc5f..6aead6deaa6c 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -2440,7 +2440,7 @@ static int tipc_listen(struct socket *sock, int len)
 static int tipc_wait_for_accept(struct socket *sock, long timeo)
 {
 	struct sock *sk = sock->sk;
-	DEFINE_WAIT(wait);
+	DEFINE_WAIT_FUNC(wait, woken_wake_function);
 	int err;
 
 	/* True wake-one mechanism for incoming connections: only
@@ -2449,12 +2449,12 @@ static int tipc_wait_for_accept(struct socket *sock, long timeo)
 	 * anymore, the common case will execute the loop only once.
 	*/
 	for (;;) {
-		prepare_to_wait_exclusive(sk_sleep(sk), &wait,
-					  TASK_INTERRUPTIBLE);
 		if (timeo && skb_queue_empty(&sk->sk_receive_queue)) {
+			add_wait_queue(sk_sleep(sk), &wait);
 			release_sock(sk);
-			timeo = schedule_timeout(timeo);
+			timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo);
 			lock_sock(sk);
+			remove_wait_queue(sk_sleep(sk), &wait);
 		}
 		err = 0;
 		if (!skb_queue_empty(&sk->sk_receive_queue))
@@ -2466,7 +2466,6 @@ static int tipc_wait_for_accept(struct socket *sock, long timeo)
 		if (signal_pending(current))
 			break;
 	}
-	finish_wait(sk_sleep(sk), &wait);
 	return err;
 }
 

commit 498d7ab105ed4e853065ddc64b2da11e971c0dc0
Author: Jedrzej Jagielski <jedrzej.jagielski@intel.com>
Date:   Fri Jun 18 08:49:49 2021 +0000

    i40e: Fix log TC creation failure when max num of queues is exceeded
    
    [ Upstream commit ea52faae1d17cd3048681d86d2e8641f44de484d ]
    
    Fix missing failed message if driver does not have enough queues to
    complete TC command. Without this fix no message is displayed in dmesg.
    
    Fixes: a9ce82f744dc ("i40e: Enable 'channel' mode in mqprio for TC configs")
    Signed-off-by: Grzegorz Szczurek <grzegorzx.szczurek@intel.com>
    Signed-off-by: Jedrzej Jagielski <jedrzej.jagielski@intel.com>
    Tested-by: Imam Hassan Reza Biswas <imam.hassan.reza.biswas@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index a35445ea7064..246734be5177 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -6762,6 +6762,8 @@ static int i40e_validate_mqprio_qopt(struct i40e_vsi *vsi,
 	}
 	if (vsi->num_queue_pairs <
 	    (mqprio_qopt->qopt.offset[i] + mqprio_qopt->qopt.count[i])) {
+		dev_err(&vsi->back->pdev->dev,
+			"Failed to create traffic channel, insufficient number of queues.\n");
 		return -EINVAL;
 	}
 	if (sum_max_rate > i40e_get_link_speed(vsi)) {

commit 6d51a5fb5b864b137cf1135abb526fff5afdce21
Author: Arkadiusz Kubalewski <arkadiusz.kubalewski@intel.com>
Date:   Thu Apr 29 19:49:47 2021 +0200

    i40e: Fix logic of disabling queues
    
    [ Upstream commit 65662a8dcdd01342b71ee44234bcfd0162e195af ]
    
    Correct the message flow between driver and firmware when disabling
    queues.
    
    Previously in case of PF reset (due to required reinit after reconfig),
    the error like: "VSI seid 397 Tx ring 60 disable timeout" could show up
    occasionally. The error was not a real issue of hardware or firmware,
    it was caused by wrong sequence of messages invoked by the driver.
    
    Fixes: 41c445ff0f48 ("i40e: main driver core")
    Signed-off-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
    Signed-off-by: Arkadiusz Kubalewski <arkadiusz.kubalewski@intel.com>
    Tested-by: Tony Brelinski <tonyx.brelinski@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 1b101b526ed3..a35445ea7064 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -4310,11 +4310,10 @@ int i40e_control_wait_tx_q(int seid, struct i40e_pf *pf, int pf_q,
 }
 
 /**
- * i40e_vsi_control_tx - Start or stop a VSI's rings
+ * i40e_vsi_enable_tx - Start a VSI's rings
  * @vsi: the VSI being configured
- * @enable: start or stop the rings
  **/
-static int i40e_vsi_control_tx(struct i40e_vsi *vsi, bool enable)
+static int i40e_vsi_enable_tx(struct i40e_vsi *vsi)
 {
 	struct i40e_pf *pf = vsi->back;
 	int i, pf_q, ret = 0;
@@ -4323,7 +4322,7 @@ static int i40e_vsi_control_tx(struct i40e_vsi *vsi, bool enable)
 	for (i = 0; i < vsi->num_queue_pairs; i++, pf_q++) {
 		ret = i40e_control_wait_tx_q(vsi->seid, pf,
 					     pf_q,
-					     false /*is xdp*/, enable);
+					     false /*is xdp*/, true);
 		if (ret)
 			break;
 
@@ -4332,7 +4331,7 @@ static int i40e_vsi_control_tx(struct i40e_vsi *vsi, bool enable)
 
 		ret = i40e_control_wait_tx_q(vsi->seid, pf,
 					     pf_q + vsi->alloc_queue_pairs,
-					     true /*is xdp*/, enable);
+					     true /*is xdp*/, true);
 		if (ret)
 			break;
 	}
@@ -4430,32 +4429,25 @@ int i40e_control_wait_rx_q(struct i40e_pf *pf, int pf_q, bool enable)
 }
 
 /**
- * i40e_vsi_control_rx - Start or stop a VSI's rings
+ * i40e_vsi_enable_rx - Start a VSI's rings
  * @vsi: the VSI being configured
- * @enable: start or stop the rings
  **/
-static int i40e_vsi_control_rx(struct i40e_vsi *vsi, bool enable)
+static int i40e_vsi_enable_rx(struct i40e_vsi *vsi)
 {
 	struct i40e_pf *pf = vsi->back;
 	int i, pf_q, ret = 0;
 
 	pf_q = vsi->base_queue;
 	for (i = 0; i < vsi->num_queue_pairs; i++, pf_q++) {
-		ret = i40e_control_wait_rx_q(pf, pf_q, enable);
+		ret = i40e_control_wait_rx_q(pf, pf_q, true);
 		if (ret) {
 			dev_info(&pf->pdev->dev,
-				 "VSI seid %d Rx ring %d %sable timeout\n",
-				 vsi->seid, pf_q, (enable ? "en" : "dis"));
+				 "VSI seid %d Rx ring %d enable timeout\n",
+				 vsi->seid, pf_q);
 			break;
 		}
 	}
 
-	/* Due to HW errata, on Rx disable only, the register can indicate done
-	 * before it really is. Needs 50ms to be sure
-	 */
-	if (!enable)
-		mdelay(50);
-
 	return ret;
 }
 
@@ -4468,29 +4460,47 @@ int i40e_vsi_start_rings(struct i40e_vsi *vsi)
 	int ret = 0;
 
 	/* do rx first for enable and last for disable */
-	ret = i40e_vsi_control_rx(vsi, true);
+	ret = i40e_vsi_enable_rx(vsi);
 	if (ret)
 		return ret;
-	ret = i40e_vsi_control_tx(vsi, true);
+	ret = i40e_vsi_enable_tx(vsi);
 
 	return ret;
 }
 
+#define I40E_DISABLE_TX_GAP_MSEC	50
+
 /**
  * i40e_vsi_stop_rings - Stop a VSI's rings
  * @vsi: the VSI being configured
  **/
 void i40e_vsi_stop_rings(struct i40e_vsi *vsi)
 {
+	struct i40e_pf *pf = vsi->back;
+	int pf_q, err, q_end;
+
 	/* When port TX is suspended, don't wait */
 	if (test_bit(__I40E_PORT_SUSPENDED, vsi->back->state))
 		return i40e_vsi_stop_rings_no_wait(vsi);
 
-	/* do rx first for enable and last for disable
-	 * Ignore return value, we need to shutdown whatever we can
-	 */
-	i40e_vsi_control_tx(vsi, false);
-	i40e_vsi_control_rx(vsi, false);
+	q_end = vsi->base_queue + vsi->num_queue_pairs;
+	for (pf_q = vsi->base_queue; pf_q < q_end; pf_q++)
+		i40e_pre_tx_queue_cfg(&pf->hw, (u32)pf_q, false);
+
+	for (pf_q = vsi->base_queue; pf_q < q_end; pf_q++) {
+		err = i40e_control_wait_rx_q(pf, pf_q, false);
+		if (err)
+			dev_info(&pf->pdev->dev,
+				 "VSI seid %d Rx ring %d dissable timeout\n",
+				 vsi->seid, pf_q);
+	}
+
+	msleep(I40E_DISABLE_TX_GAP_MSEC);
+	pf_q = vsi->base_queue;
+	for (pf_q = vsi->base_queue; pf_q < q_end; pf_q++)
+		wr32(&pf->hw, I40E_QTX_ENA(pf_q), 0);
+
+	i40e_vsi_wait_queues_disabled(vsi);
 }
 
 /**

commit 1cb5995a39eb3dc97a7539d00d2c82be030e0bb8
Author: Pablo Neira Ayuso <pablo@netfilter.org>
Date:   Tue Jul 20 18:22:50 2021 +0200

    netfilter: nft_nat: allow to specify layer 4 protocol NAT only
    
    [ Upstream commit a33f387ecd5aafae514095c2c4a8c24f7aea7e8b ]
    
    nft_nat reports a bogus EAFNOSUPPORT if no layer 3 information is specified.
    
    Fixes: d07db9884a5f ("netfilter: nf_tables: introduce nft_validate_register_load()")
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netfilter/nft_nat.c b/net/netfilter/nft_nat.c
index 3e82a7d0df2a..2c3d7ff6f58a 100644
--- a/net/netfilter/nft_nat.c
+++ b/net/netfilter/nft_nat.c
@@ -153,7 +153,9 @@ static int nft_nat_init(const struct nft_ctx *ctx, const struct nft_expr *expr,
 		alen = FIELD_SIZEOF(struct nf_nat_range, min_addr.ip6);
 		break;
 	default:
-		return -EAFNOSUPPORT;
+		if (tb[NFTA_NAT_REG_ADDR_MIN])
+			return -EAFNOSUPPORT;
+		break;
 	}
 	priv->family = family;
 

commit 512fd52e2091560de66da26799b3f1ca7ca1d41b
Author: Florian Westphal <fw@strlen.de>
Date:   Sun Jul 18 18:36:00 2021 +0200

    netfilter: conntrack: adjust stop timestamp to real expiry value
    
    [ Upstream commit 30a56a2b881821625f79837d4d968c679852444e ]
    
    In case the entry is evicted via garbage collection there is
    delay between the timeout value and the eviction event.
    
    This adjusts the stop value based on how much time has passed.
    
    Fixes: b87a2f9199ea82 ("netfilter: conntrack: add gc worker to remove timed-out entries")
    Signed-off-by: Florian Westphal <fw@strlen.de>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
index 1dceda3c0e75..c5590d36b775 100644
--- a/net/netfilter/nf_conntrack_core.c
+++ b/net/netfilter/nf_conntrack_core.c
@@ -630,8 +630,13 @@ bool nf_ct_delete(struct nf_conn *ct, u32 portid, int report)
 		return false;
 
 	tstamp = nf_conn_tstamp_find(ct);
-	if (tstamp && tstamp->stop == 0)
+	if (tstamp) {
+		s32 timeout = ct->timeout - nfct_time_stamp;
+
 		tstamp->stop = ktime_get_real_ns();
+		if (timeout < 0)
+			tstamp->stop -= jiffies_to_nsecs(-timeout);
+	}
 
 	if (nf_conntrack_event_report(IPCT_DESTROY, ct,
 				    portid, report) < 0) {

commit 672f6ea510391a85dfce3362ad5d832bce447c14
Author: Nguyen Dinh Phi <phind.uet@gmail.com>
Date:   Mon Jun 28 21:23:34 2021 +0800

    cfg80211: Fix possible memory leak in function cfg80211_bss_update
    
    commit f9a5c358c8d26fed0cc45f2afc64633d4ba21dff upstream.
    
    When we exceed the limit of BSS entries, this function will free the
    new entry, however, at this time, it is the last door to access the
    inputed ies, so these ies will be unreferenced objects and cause memory
    leak.
    Therefore we should free its ies before deallocating the new entry, beside
    of dropping it from hidden_list.
    
    Signed-off-by: Nguyen Dinh Phi <phind.uet@gmail.com>
    Link: https://lore.kernel.org/r/20210628132334.851095-1-phind.uet@gmail.com
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/wireless/scan.c b/net/wireless/scan.c
index 67b2747ad9ef..d871349036a5 100644
--- a/net/wireless/scan.c
+++ b/net/wireless/scan.c
@@ -1029,16 +1029,14 @@ cfg80211_bss_update(struct cfg80211_registered_device *rdev,
 			 * be grouped with this beacon for updates ...
 			 */
 			if (!cfg80211_combine_bsses(rdev, new)) {
-				kfree(new);
+				bss_ref_put(rdev, new);
 				goto drop;
 			}
 		}
 
 		if (rdev->bss_entries >= bss_entries_limit &&
 		    !cfg80211_bss_expire_oldest(rdev)) {
-			if (!list_empty(&new->hidden_list))
-				list_del(&new->hidden_list);
-			kfree(new);
+			bss_ref_put(rdev, new);
 			goto drop;
 		}
 

commit 0bf3eb2e85f6bfd66b954c5bbcd3330ce64b7ad8
Author: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Date:   Wed Jul 28 08:49:09 2021 +0200

    nfc: nfcsim: fix use after free during module unload
    
    commit 5e7b30d24a5b8cb691c173b45b50e3ca0191be19 upstream.
    
    There is a use after free memory corruption during module exit:
     - nfcsim_exit()
      - nfcsim_device_free(dev0)
        - nfc_digital_unregister_device()
          This iterates over command queue and frees all commands,
        - dev->up = false
        - nfcsim_link_shutdown()
          - nfcsim_link_recv_wake()
            This wakes the sleeping thread nfcsim_link_recv_skb().
    
     - nfcsim_link_recv_skb()
       Wake from wait_event_interruptible_timeout(),
       call directly the deb->cb callback even though (dev->up == false),
       - digital_send_cmd_complete()
         Dereference of "struct digital_cmd" cmd which was freed earlier by
         nfc_digital_unregister_device().
    
    This causes memory corruption shortly after (with unrelated stack
    trace):
    
      nfc nfc0: NFC: nfcsim_recv_wq: Device is down
      llcp: nfc_llcp_recv: err -19
      nfc nfc1: NFC: nfcsim_recv_wq: Device is down
      BUG: unable to handle page fault for address: ffffffffffffffed
      Call Trace:
       fsnotify+0x54b/0x5c0
       __fsnotify_parent+0x1fe/0x300
       ? vfs_write+0x27c/0x390
       vfs_write+0x27c/0x390
       ksys_write+0x63/0xe0
       do_syscall_64+0x3b/0x90
       entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    KASAN report:
    
      BUG: KASAN: use-after-free in digital_send_cmd_complete+0x16/0x50
      Write of size 8 at addr ffff88800a05f720 by task kworker/0:2/71
      Workqueue: events nfcsim_recv_wq [nfcsim]
      Call Trace:
      ?dump_stack_lvl+0x45/0x59
      ?print_address_description.constprop.0+0x21/0x140
      ?? digital_send_cmd_complete+0x16/0x50
      ?? digital_send_cmd_complete+0x16/0x50
      ?kasan_report.cold+0x7f/0x11b
      ?? digital_send_cmd_complete+0x16/0x50
      ?? digital_dep_link_down+0x60/0x60
      ?digital_send_cmd_complete+0x16/0x50
      ?nfcsim_recv_wq+0x38f/0x3d5 [nfcsim]
      ?? nfcsim_in_send_cmd+0x4a/0x4a [nfcsim]
      ?? lock_is_held_type+0x98/0x110
      ?? finish_wait+0x110/0x110
      ?? rcu_read_lock_sched_held+0x9c/0xd0
      ?? rcu_read_lock_bh_held+0xb0/0xb0
      ?? lockdep_hardirqs_on_prepare+0x12e/0x1f0
    
    This flow of calling digital_send_cmd_complete() callback on driver exit
    is specific to nfcsim which implements reading and sending work queues.
    Since the NFC digital device was unregistered, the callback should not
    be called.
    
    Fixes: 204bddcb508f ("NFC: nfcsim: Make use of the Digital layer")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/nfc/nfcsim.c b/drivers/nfc/nfcsim.c
index 33449820e754..533e3aa6275c 100644
--- a/drivers/nfc/nfcsim.c
+++ b/drivers/nfc/nfcsim.c
@@ -201,8 +201,7 @@ static void nfcsim_recv_wq(struct work_struct *work)
 
 		if (!IS_ERR(skb))
 			dev_kfree_skb(skb);
-
-		skb = ERR_PTR(-ENODEV);
+		return;
 	}
 
 	dev->cb(dev->nfc_digital_dev, dev->arg, skb);

commit 4cd2534cbf6f5986682c12f4a6881fb2fe065e50
Author: Paul Jakma <paul@jakma.org>
Date:   Fri Jul 23 16:13:04 2021 +0100

    NIU: fix incorrect error return, missed in previous revert
    
    commit 15bbf8bb4d4ab87108ecf5f4155ec8ffa3c141d6 upstream.
    
    Commit 7930742d6, reverting 26fd962, missed out on reverting an incorrect
    change to a return value.  The niu_pci_vpd_scan_props(..) == 1 case appears
    to be a normal path - treating it as an error and return -EINVAL was
    breaking VPD_SCAN and causing the driver to fail to load.
    
    Fix, so my Neptune card works again.
    
    Cc: Kangjie Lu <kjlu@umn.edu>
    Cc: Shannon Nelson <shannon.lee.nelson@gmail.com>
    Cc: David S. Miller <davem@davemloft.net>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: stable <stable@vger.kernel.org>
    Fixes: 7930742d ('Revert "niu: fix missing checks of niu_pci_eeprom_read"')
    Signed-off-by: Paul Jakma <paul@jakma.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/sun/niu.c b/drivers/net/ethernet/sun/niu.c
index 5894edf79d65..605c4d15b88c 100644
--- a/drivers/net/ethernet/sun/niu.c
+++ b/drivers/net/ethernet/sun/niu.c
@@ -8192,8 +8192,9 @@ static int niu_pci_vpd_fetch(struct niu *np, u32 start)
 		err = niu_pci_vpd_scan_props(np, here, end);
 		if (err < 0)
 			return err;
+		/* ret == 1 is not an error */
 		if (err == 1)
-			return -EINVAL;
+			return 0;
 	}
 	return 0;
 }

commit 9c9e45112c2331d1a873fba92678b497977fb1e5
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Tue Jul 27 20:00:46 2021 +0300

    can: esd_usb2: fix memory leak
    
    commit 928150fad41ba16df7fcc9f7f945747d0f56cbb6 upstream.
    
    In esd_usb2_setup_rx_urbs() MAX_RX_URBS coherent buffers are allocated
    and there is nothing, that frees them:
    
    1) In callback function the urb is resubmitted and that's all
    2) In disconnect function urbs are simply killed, but URB_FREE_BUFFER
       is not set (see esd_usb2_setup_rx_urbs) and this flag cannot be used
       with coherent buffers.
    
    So, all allocated buffers should be freed with usb_free_coherent()
    explicitly.
    
    Side note: This code looks like a copy-paste of other can drivers. The
    same patch was applied to mcba_usb driver and it works nice with real
    hardware. There is no change in functionality, only clean-up code for
    coherent buffers.
    
    Fixes: 96d8e90382dc ("can: Add driver for esd CAN-USB/2 device")
    Link: https://lore.kernel.org/r/b31b096926dcb35998ad0271aac4b51770ca7cc8.1627404470.git.paskripkin@gmail.com
    Cc: linux-stable <stable@vger.kernel.org>
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/can/usb/esd_usb2.c b/drivers/net/can/usb/esd_usb2.c
index 5820fd5b69b5..e95358269525 100644
--- a/drivers/net/can/usb/esd_usb2.c
+++ b/drivers/net/can/usb/esd_usb2.c
@@ -207,6 +207,8 @@ struct esd_usb2 {
 	int net_count;
 	u32 version;
 	int rxinitdone;
+	void *rxbuf[MAX_RX_URBS];
+	dma_addr_t rxbuf_dma[MAX_RX_URBS];
 };
 
 struct esd_usb2_net_priv {
@@ -556,6 +558,7 @@ static int esd_usb2_setup_rx_urbs(struct esd_usb2 *dev)
 	for (i = 0; i < MAX_RX_URBS; i++) {
 		struct urb *urb = NULL;
 		u8 *buf = NULL;
+		dma_addr_t buf_dma;
 
 		/* create a URB, and a buffer for it */
 		urb = usb_alloc_urb(0, GFP_KERNEL);
@@ -565,7 +568,7 @@ static int esd_usb2_setup_rx_urbs(struct esd_usb2 *dev)
 		}
 
 		buf = usb_alloc_coherent(dev->udev, RX_BUFFER_SIZE, GFP_KERNEL,
-					 &urb->transfer_dma);
+					 &buf_dma);
 		if (!buf) {
 			dev_warn(dev->udev->dev.parent,
 				 "No memory left for USB buffer\n");
@@ -573,6 +576,8 @@ static int esd_usb2_setup_rx_urbs(struct esd_usb2 *dev)
 			goto freeurb;
 		}
 
+		urb->transfer_dma = buf_dma;
+
 		usb_fill_bulk_urb(urb, dev->udev,
 				  usb_rcvbulkpipe(dev->udev, 1),
 				  buf, RX_BUFFER_SIZE,
@@ -585,8 +590,12 @@ static int esd_usb2_setup_rx_urbs(struct esd_usb2 *dev)
 			usb_unanchor_urb(urb);
 			usb_free_coherent(dev->udev, RX_BUFFER_SIZE, buf,
 					  urb->transfer_dma);
+			goto freeurb;
 		}
 
+		dev->rxbuf[i] = buf;
+		dev->rxbuf_dma[i] = buf_dma;
+
 freeurb:
 		/* Drop reference, USB core will take care of freeing it */
 		usb_free_urb(urb);
@@ -674,6 +683,11 @@ static void unlink_all_urbs(struct esd_usb2 *dev)
 	int i, j;
 
 	usb_kill_anchored_urbs(&dev->rx_submitted);
+
+	for (i = 0; i < MAX_RX_URBS; ++i)
+		usb_free_coherent(dev->udev, RX_BUFFER_SIZE,
+				  dev->rxbuf[i], dev->rxbuf_dma[i]);
+
 	for (i = 0; i < dev->net_count; i++) {
 		priv = dev->nets[i];
 		if (priv) {

commit 71758cd0f1b09e8cd7c22059301018ffb0696778
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Tue Jul 27 20:00:33 2021 +0300

    can: ems_usb: fix memory leak
    
    commit 9969e3c5f40c166e3396acc36c34f9de502929f6 upstream.
    
    In ems_usb_start() MAX_RX_URBS coherent buffers are allocated and
    there is nothing, that frees them:
    
    1) In callback function the urb is resubmitted and that's all
    2) In disconnect function urbs are simply killed, but URB_FREE_BUFFER
       is not set (see ems_usb_start) and this flag cannot be used with
       coherent buffers.
    
    So, all allocated buffers should be freed with usb_free_coherent()
    explicitly.
    
    Side note: This code looks like a copy-paste of other can drivers. The
    same patch was applied to mcba_usb driver and it works nice with real
    hardware. There is no change in functionality, only clean-up code for
    coherent buffers.
    
    Fixes: 702171adeed3 ("ems_usb: Added support for EMS CPC-USB/ARM7 CAN/USB interface")
    Link: https://lore.kernel.org/r/59aa9fbc9a8cbf9af2bbd2f61a659c480b415800.1627404470.git.paskripkin@gmail.com
    Cc: linux-stable <stable@vger.kernel.org>
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/can/usb/ems_usb.c b/drivers/net/can/usb/ems_usb.c
index 16b96f978aae..3957b746107f 100644
--- a/drivers/net/can/usb/ems_usb.c
+++ b/drivers/net/can/usb/ems_usb.c
@@ -267,6 +267,8 @@ struct ems_usb {
 	unsigned int free_slots; /* remember number of available slots */
 
 	struct ems_cpc_msg active_params; /* active controller parameters */
+	void *rxbuf[MAX_RX_URBS];
+	dma_addr_t rxbuf_dma[MAX_RX_URBS];
 };
 
 static void ems_usb_read_interrupt_callback(struct urb *urb)
@@ -599,6 +601,7 @@ static int ems_usb_start(struct ems_usb *dev)
 	for (i = 0; i < MAX_RX_URBS; i++) {
 		struct urb *urb = NULL;
 		u8 *buf = NULL;
+		dma_addr_t buf_dma;
 
 		/* create a URB, and a buffer for it */
 		urb = usb_alloc_urb(0, GFP_KERNEL);
@@ -608,7 +611,7 @@ static int ems_usb_start(struct ems_usb *dev)
 		}
 
 		buf = usb_alloc_coherent(dev->udev, RX_BUFFER_SIZE, GFP_KERNEL,
-					 &urb->transfer_dma);
+					 &buf_dma);
 		if (!buf) {
 			netdev_err(netdev, "No memory left for USB buffer\n");
 			usb_free_urb(urb);
@@ -616,6 +619,8 @@ static int ems_usb_start(struct ems_usb *dev)
 			break;
 		}
 
+		urb->transfer_dma = buf_dma;
+
 		usb_fill_bulk_urb(urb, dev->udev, usb_rcvbulkpipe(dev->udev, 2),
 				  buf, RX_BUFFER_SIZE,
 				  ems_usb_read_bulk_callback, dev);
@@ -631,6 +636,9 @@ static int ems_usb_start(struct ems_usb *dev)
 			break;
 		}
 
+		dev->rxbuf[i] = buf;
+		dev->rxbuf_dma[i] = buf_dma;
+
 		/* Drop reference, USB core will take care of freeing it */
 		usb_free_urb(urb);
 	}
@@ -696,6 +704,10 @@ static void unlink_all_urbs(struct ems_usb *dev)
 
 	usb_kill_anchored_urbs(&dev->rx_submitted);
 
+	for (i = 0; i < MAX_RX_URBS; ++i)
+		usb_free_coherent(dev->udev, RX_BUFFER_SIZE,
+				  dev->rxbuf[i], dev->rxbuf_dma[i]);
+
 	usb_kill_anchored_urbs(&dev->tx_submitted);
 	atomic_set(&dev->active_tx_urbs, 0);
 

commit 6c9d61989af94ac67fb0120a7e61a622f6da8068
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Tue Jul 27 19:59:57 2021 +0300

    can: usb_8dev: fix memory leak
    
    commit 0e865f0c31928d6a313269ef624907eec55287c4 upstream.
    
    In usb_8dev_start() MAX_RX_URBS coherent buffers are allocated and
    there is nothing, that frees them:
    
    1) In callback function the urb is resubmitted and that's all
    2) In disconnect function urbs are simply killed, but URB_FREE_BUFFER
       is not set (see usb_8dev_start) and this flag cannot be used with
       coherent buffers.
    
    So, all allocated buffers should be freed with usb_free_coherent()
    explicitly.
    
    Side note: This code looks like a copy-paste of other can drivers. The
    same patch was applied to mcba_usb driver and it works nice with real
    hardware. There is no change in functionality, only clean-up code for
    coherent buffers.
    
    Fixes: 0024d8ad1639 ("can: usb_8dev: Add support for USB2CAN interface from 8 devices")
    Link: https://lore.kernel.org/r/d39b458cd425a1cf7f512f340224e6e9563b07bd.1627404470.git.paskripkin@gmail.com
    Cc: linux-stable <stable@vger.kernel.org>
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/can/usb/usb_8dev.c b/drivers/net/can/usb/usb_8dev.c
index 3e4416473607..df99354ec12a 100644
--- a/drivers/net/can/usb/usb_8dev.c
+++ b/drivers/net/can/usb/usb_8dev.c
@@ -148,7 +148,8 @@ struct usb_8dev_priv {
 	u8 *cmd_msg_buffer;
 
 	struct mutex usb_8dev_cmd_lock;
-
+	void *rxbuf[MAX_RX_URBS];
+	dma_addr_t rxbuf_dma[MAX_RX_URBS];
 };
 
 /* tx frame */
@@ -744,6 +745,7 @@ static int usb_8dev_start(struct usb_8dev_priv *priv)
 	for (i = 0; i < MAX_RX_URBS; i++) {
 		struct urb *urb = NULL;
 		u8 *buf;
+		dma_addr_t buf_dma;
 
 		/* create a URB, and a buffer for it */
 		urb = usb_alloc_urb(0, GFP_KERNEL);
@@ -753,7 +755,7 @@ static int usb_8dev_start(struct usb_8dev_priv *priv)
 		}
 
 		buf = usb_alloc_coherent(priv->udev, RX_BUFFER_SIZE, GFP_KERNEL,
-					 &urb->transfer_dma);
+					 &buf_dma);
 		if (!buf) {
 			netdev_err(netdev, "No memory left for USB buffer\n");
 			usb_free_urb(urb);
@@ -761,6 +763,8 @@ static int usb_8dev_start(struct usb_8dev_priv *priv)
 			break;
 		}
 
+		urb->transfer_dma = buf_dma;
+
 		usb_fill_bulk_urb(urb, priv->udev,
 				  usb_rcvbulkpipe(priv->udev,
 						  USB_8DEV_ENDP_DATA_RX),
@@ -778,6 +782,9 @@ static int usb_8dev_start(struct usb_8dev_priv *priv)
 			break;
 		}
 
+		priv->rxbuf[i] = buf;
+		priv->rxbuf_dma[i] = buf_dma;
+
 		/* Drop reference, USB core will take care of freeing it */
 		usb_free_urb(urb);
 	}
@@ -847,6 +854,10 @@ static void unlink_all_urbs(struct usb_8dev_priv *priv)
 
 	usb_kill_anchored_urbs(&priv->rx_submitted);
 
+	for (i = 0; i < MAX_RX_URBS; ++i)
+		usb_free_coherent(priv->udev, RX_BUFFER_SIZE,
+				  priv->rxbuf[i], priv->rxbuf_dma[i]);
+
 	usb_kill_anchored_urbs(&priv->tx_submitted);
 	atomic_set(&priv->active_tx_urbs, 0);
 

commit ab9597bc0fa772d478fb02b10a7b10b2887b3736
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Sun Jul 25 13:36:30 2021 +0300

    can: mcba_usb_start(): add missing urb->transfer_dma initialization
    
    commit fc43fb69a7af92839551f99c1a96a37b77b3ae7a upstream.
    
    Yasushi reported, that his Microchip CAN Analyzer stopped working
    since commit 91c02557174b ("can: mcba_usb: fix memory leak in
    mcba_usb"). The problem was in missing urb->transfer_dma
    initialization.
    
    In my previous patch to this driver I refactored mcba_usb_start() code
    to avoid leaking usb coherent buffers. To archive it, I passed local
    stack variable to usb_alloc_coherent() and then saved it to private
    array to correctly free all coherent buffers on ->close() call. But I
    forgot to initialize urb->transfer_dma with variable passed to
    usb_alloc_coherent().
    
    All of this was causing device to not work, since dma addr 0 is not
    valid and following log can be found on bug report page, which points
    exactly to problem described above.
    
    | DMAR: [DMA Write] Request device [00:14.0] PASID ffffffff fault addr 0 [fault reason 05] PTE Write access is not set
    
    Fixes: 91c02557174b ("can: mcba_usb: fix memory leak in mcba_usb")
    Link: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=990850
    Link: https://lore.kernel.org/r/20210725103630.23864-1-paskripkin@gmail.com
    Cc: linux-stable <stable@vger.kernel.org>
    Reported-by: Yasushi SHOJI <yasushi.shoji@gmail.com>
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Tested-by: Yasushi SHOJI <yashi@spacecubics.com>
    [mkl: fixed typos in commit message - thanks Yasushi SHOJI]
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/can/usb/mcba_usb.c b/drivers/net/can/usb/mcba_usb.c
index 3215ba69a9e7..097d4a673b05 100644
--- a/drivers/net/can/usb/mcba_usb.c
+++ b/drivers/net/can/usb/mcba_usb.c
@@ -664,6 +664,8 @@ static int mcba_usb_start(struct mcba_priv *priv)
 			break;
 		}
 
+		urb->transfer_dma = buf_dma;
+
 		usb_fill_bulk_urb(urb, priv->udev,
 				  usb_rcvbulkpipe(priv->udev, MCBA_USB_EP_IN),
 				  buf, MCBA_USB_RX_BUFF_SIZE,

commit 96faa82a5ddb21b99b673f1992ad1ad6684307a0
Author: Ziyang Xuan <william.xuanziyang@huawei.com>
Date:   Thu Jul 22 15:08:19 2021 +0800

    can: raw: raw_setsockopt(): fix raw_rcv panic for sock UAF
    
    commit 54f93336d000229f72c26d8a3f69dd256b744528 upstream.
    
    We get a bug during ltp can_filter test as following.
    
    ===========================================
    [60919.264984] BUG: unable to handle kernel NULL pointer dereference at 0000000000000010
    [60919.265223] PGD 8000003dda726067 P4D 8000003dda726067 PUD 3dda727067 PMD 0
    [60919.265443] Oops: 0000 [#1] SMP PTI
    [60919.265550] CPU: 30 PID: 3638365 Comm: can_filter Kdump: loaded Tainted: G        W         4.19.90+ #1
    [60919.266068] RIP: 0010:selinux_socket_sock_rcv_skb+0x3e/0x200
    [60919.293289] RSP: 0018:ffff8d53bfc03cf8 EFLAGS: 00010246
    [60919.307140] RAX: 0000000000000000 RBX: 000000000000001d RCX: 0000000000000007
    [60919.320756] RDX: 0000000000000001 RSI: ffff8d5104a8ed00 RDI: ffff8d53bfc03d30
    [60919.334319] RBP: ffff8d9338056800 R08: ffff8d53bfc29d80 R09: 0000000000000001
    [60919.347969] R10: ffff8d53bfc03ec0 R11: ffffb8526ef47c98 R12: ffff8d53bfc03d30
    [60919.350320] perf: interrupt took too long (3063 > 2500), lowering kernel.perf_event_max_sample_rate to 65000
    [60919.361148] R13: 0000000000000001 R14: ffff8d53bcf90000 R15: 0000000000000000
    [60919.361151] FS:  00007fb78b6b3600(0000) GS:ffff8d53bfc00000(0000) knlGS:0000000000000000
    [60919.400812] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [60919.413730] CR2: 0000000000000010 CR3: 0000003e3f784006 CR4: 00000000007606e0
    [60919.426479] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    [60919.439339] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    [60919.451608] PKRU: 55555554
    [60919.463622] Call Trace:
    [60919.475617]  <IRQ>
    [60919.487122]  ? update_load_avg+0x89/0x5d0
    [60919.498478]  ? update_load_avg+0x89/0x5d0
    [60919.509822]  ? account_entity_enqueue+0xc5/0xf0
    [60919.520709]  security_sock_rcv_skb+0x2a/0x40
    [60919.531413]  sk_filter_trim_cap+0x47/0x1b0
    [60919.542178]  ? kmem_cache_alloc+0x38/0x1b0
    [60919.552444]  sock_queue_rcv_skb+0x17/0x30
    [60919.562477]  raw_rcv+0x110/0x190 [can_raw]
    [60919.572539]  can_rcv_filter+0xbc/0x1b0 [can]
    [60919.582173]  can_receive+0x6b/0xb0 [can]
    [60919.591595]  can_rcv+0x31/0x70 [can]
    [60919.600783]  __netif_receive_skb_one_core+0x5a/0x80
    [60919.609864]  process_backlog+0x9b/0x150
    [60919.618691]  net_rx_action+0x156/0x400
    [60919.627310]  ? sched_clock_cpu+0xc/0xa0
    [60919.635714]  __do_softirq+0xe8/0x2e9
    [60919.644161]  do_softirq_own_stack+0x2a/0x40
    [60919.652154]  </IRQ>
    [60919.659899]  do_softirq.part.17+0x4f/0x60
    [60919.667475]  __local_bh_enable_ip+0x60/0x70
    [60919.675089]  __dev_queue_xmit+0x539/0x920
    [60919.682267]  ? finish_wait+0x80/0x80
    [60919.689218]  ? finish_wait+0x80/0x80
    [60919.695886]  ? sock_alloc_send_pskb+0x211/0x230
    [60919.702395]  ? can_send+0xe5/0x1f0 [can]
    [60919.708882]  can_send+0xe5/0x1f0 [can]
    [60919.715037]  raw_sendmsg+0x16d/0x268 [can_raw]
    
    It's because raw_setsockopt() concurrently with
    unregister_netdevice_many(). Concurrent scenario as following.
    
            cpu0                                            cpu1
    raw_bind
    raw_setsockopt                                  unregister_netdevice_many
                                                    unlist_netdevice
    dev_get_by_index                                raw_notifier
    raw_enable_filters                              ......
    can_rx_register
    can_rcv_list_find(..., net->can.rx_alldev_list)
    
    ......
    
    sock_close
    raw_release(sock_a)
    
    ......
    
    can_receive
    can_rcv_filter(net->can.rx_alldev_list, ...)
    raw_rcv(skb, sock_a)
    BUG
    
    After unlist_netdevice(), dev_get_by_index() return NULL in
    raw_setsockopt(). Function raw_enable_filters() will add sock
    and can_filter to net->can.rx_alldev_list. Then the sock is closed.
    Followed by, we sock_sendmsg() to a new vcan device use the same
    can_filter. Protocol stack match the old receiver whose sock has
    been released on net->can.rx_alldev_list in can_rcv_filter().
    Function raw_rcv() uses the freed sock. UAF BUG is triggered.
    
    We can find that the key issue is that net_device has not been
    protected in raw_setsockopt(). Use rtnl_lock to protect net_device
    in raw_setsockopt().
    
    Fixes: c18ce101f2e4 ("[CAN]: Add raw protocol")
    Link: https://lore.kernel.org/r/20210722070819.1048263-1-william.xuanziyang@huawei.com
    Cc: linux-stable <stable@vger.kernel.org>
    Signed-off-by: Ziyang Xuan <william.xuanziyang@huawei.com>
    Acked-by: Oliver Hartkopp <socketcan@hartkopp.net>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/can/raw.c b/net/can/raw.c
index 296a11a922e0..d0fb5a57c66d 100644
--- a/net/can/raw.c
+++ b/net/can/raw.c
@@ -549,10 +549,18 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
 				return -EFAULT;
 		}
 
+		rtnl_lock();
 		lock_sock(sk);
 
-		if (ro->bound && ro->ifindex)
+		if (ro->bound && ro->ifindex) {
 			dev = dev_get_by_index(sock_net(sk), ro->ifindex);
+			if (!dev) {
+				if (count > 1)
+					kfree(filter);
+				err = -ENODEV;
+				goto out_fil;
+			}
+		}
 
 		if (ro->bound) {
 			/* (try to) register the new filters */
@@ -591,6 +599,7 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
 			dev_put(dev);
 
 		release_sock(sk);
+		rtnl_unlock();
 
 		break;
 
@@ -603,10 +612,16 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
 
 		err_mask &= CAN_ERR_MASK;
 
+		rtnl_lock();
 		lock_sock(sk);
 
-		if (ro->bound && ro->ifindex)
+		if (ro->bound && ro->ifindex) {
 			dev = dev_get_by_index(sock_net(sk), ro->ifindex);
+			if (!dev) {
+				err = -ENODEV;
+				goto out_err;
+			}
+		}
 
 		/* remove current error mask */
 		if (ro->bound) {
@@ -630,6 +645,7 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
 			dev_put(dev);
 
 		release_sock(sk);
+		rtnl_unlock();
 
 		break;
 

commit 40b5e3f544a4c464fc509de6f57948b99f50f1b0
Author: Junxiao Bi <junxiao.bi@oracle.com>
Date:   Thu Jul 29 14:53:41 2021 -0700

    ocfs2: issue zeroout to EOF blocks
    
    commit 9449ad33be8480f538b11a593e2dda2fb33ca06d upstream.
    
    For punch holes in EOF blocks, fallocate used buffer write to zero the
    EOF blocks in last cluster.  But since ->writepage will ignore EOF
    pages, those zeros will not be flushed.
    
    This "looks" ok as commit 6bba4471f0cc ("ocfs2: fix data corruption by
    fallocate") will zero the EOF blocks when extend the file size, but it
    isn't.  The problem happened on those EOF pages, before writeback, those
    pages had DIRTY flag set and all buffer_head in them also had DIRTY flag
    set, when writeback run by write_cache_pages(), DIRTY flag on the page
    was cleared, but DIRTY flag on the buffer_head not.
    
    When next write happened to those EOF pages, since buffer_head already
    had DIRTY flag set, it would not mark page DIRTY again.  That made
    writeback ignore them forever.  That will cause data corruption.  Even
    directio write can't work because it will fail when trying to drop pages
    caches before direct io, as it found the buffer_head for those pages
    still had DIRTY flag set, then it will fall back to buffer io mode.
    
    To make a summary of the issue, as writeback ingores EOF pages, once any
    EOF page is generated, any write to it will only go to the page cache,
    it will never be flushed to disk even file size extends and that page is
    not EOF page any more.  The fix is to avoid zero EOF blocks with buffer
    write.
    
    The following code snippet from qemu-img could trigger the corruption.
    
      656   open("6b3711ae-3306-4bdd-823c-cf1c0060a095.conv.2", O_RDWR|O_DIRECT|O_CLOEXEC) = 11
      ...
      660   fallocate(11, FALLOC_FL_KEEP_SIZE|FALLOC_FL_PUNCH_HOLE, 2275868672, 327680 <unfinished ...>
      660   fallocate(11, 0, 2275868672, 327680) = 0
      658   pwrite64(11, "
    
    Link: https://lkml.kernel.org/r/20210722054923.24389-2-junxiao.bi@oracle.com
    Signed-off-by: Junxiao Bi <junxiao.bi@oracle.com>
    Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
    Cc: Mark Fasheh <mark@fasheh.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Cc: Changwei Ge <gechangwei@live.cn>
    Cc: Gang He <ghe@suse.com>
    Cc: Jun Piao <piaojun@huawei.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
index c1a46061f9c0..6ca4dc57f70b 100644
--- a/fs/ocfs2/file.c
+++ b/fs/ocfs2/file.c
@@ -1537,6 +1537,45 @@ static void ocfs2_truncate_cluster_pages(struct inode *inode, u64 byte_start,
 	}
 }
 
+/*
+ * zero out partial blocks of one cluster.
+ *
+ * start: file offset where zero starts, will be made upper block aligned.
+ * len: it will be trimmed to the end of current cluster if "start + len"
+ *      is bigger than it.
+ */
+static int ocfs2_zeroout_partial_cluster(struct inode *inode,
+					u64 start, u64 len)
+{
+	int ret;
+	u64 start_block, end_block, nr_blocks;
+	u64 p_block, offset;
+	u32 cluster, p_cluster, nr_clusters;
+	struct super_block *sb = inode->i_sb;
+	u64 end = ocfs2_align_bytes_to_clusters(sb, start);
+
+	if (start + len < end)
+		end = start + len;
+
+	start_block = ocfs2_blocks_for_bytes(sb, start);
+	end_block = ocfs2_blocks_for_bytes(sb, end);
+	nr_blocks = end_block - start_block;
+	if (!nr_blocks)
+		return 0;
+
+	cluster = ocfs2_bytes_to_clusters(sb, start);
+	ret = ocfs2_get_clusters(inode, cluster, &p_cluster,
+				&nr_clusters, NULL);
+	if (ret)
+		return ret;
+	if (!p_cluster)
+		return 0;
+
+	offset = start_block - ocfs2_clusters_to_blocks(sb, cluster);
+	p_block = ocfs2_clusters_to_blocks(sb, p_cluster) + offset;
+	return sb_issue_zeroout(sb, p_block, nr_blocks, GFP_NOFS);
+}
+
 static int ocfs2_zero_partial_clusters(struct inode *inode,
 				       u64 start, u64 len)
 {
@@ -1546,6 +1585,7 @@ static int ocfs2_zero_partial_clusters(struct inode *inode,
 	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
 	unsigned int csize = osb->s_clustersize;
 	handle_t *handle;
+	loff_t isize = i_size_read(inode);
 
 	/*
 	 * The "start" and "end" values are NOT necessarily part of
@@ -1566,6 +1606,26 @@ static int ocfs2_zero_partial_clusters(struct inode *inode,
 	if ((start & (csize - 1)) == 0 && (end & (csize - 1)) == 0)
 		goto out;
 
+	/* No page cache for EOF blocks, issue zero out to disk. */
+	if (end > isize) {
+		/*
+		 * zeroout eof blocks in last cluster starting from
+		 * "isize" even "start" > "isize" because it is
+		 * complicated to zeroout just at "start" as "start"
+		 * may be not aligned with block size, buffer write
+		 * would be required to do that, but out of eof buffer
+		 * write is not supported.
+		 */
+		ret = ocfs2_zeroout_partial_cluster(inode, isize,
+					end - isize);
+		if (ret) {
+			mlog_errno(ret);
+			goto out;
+		}
+		if (start >= isize)
+			goto out;
+		end = isize;
+	}
 	handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS);
 	if (IS_ERR(handle)) {
 		ret = PTR_ERR(handle);
@@ -1863,45 +1923,6 @@ int ocfs2_remove_inode_range(struct inode *inode,
 	return ret;
 }
 
-/*
- * zero out partial blocks of one cluster.
- *
- * start: file offset where zero starts, will be made upper block aligned.
- * len: it will be trimmed to the end of current cluster if "start + len"
- *      is bigger than it.
- */
-static int ocfs2_zeroout_partial_cluster(struct inode *inode,
-					u64 start, u64 len)
-{
-	int ret;
-	u64 start_block, end_block, nr_blocks;
-	u64 p_block, offset;
-	u32 cluster, p_cluster, nr_clusters;
-	struct super_block *sb = inode->i_sb;
-	u64 end = ocfs2_align_bytes_to_clusters(sb, start);
-
-	if (start + len < end)
-		end = start + len;
-
-	start_block = ocfs2_blocks_for_bytes(sb, start);
-	end_block = ocfs2_blocks_for_bytes(sb, end);
-	nr_blocks = end_block - start_block;
-	if (!nr_blocks)
-		return 0;
-
-	cluster = ocfs2_bytes_to_clusters(sb, start);
-	ret = ocfs2_get_clusters(inode, cluster, &p_cluster,
-				&nr_clusters, NULL);
-	if (ret)
-		return ret;
-	if (!p_cluster)
-		return 0;
-
-	offset = start_block - ocfs2_clusters_to_blocks(sb, cluster);
-	p_block = ocfs2_clusters_to_blocks(sb, p_cluster) + offset;
-	return sb_issue_zeroout(sb, p_block, nr_blocks, GFP_NOFS);
-}
-
 /*
  * Parts of this function taken from xfs_change_file_space()
  */

commit 4c97ed4332beba3ed26b2f14461d3cc469c7f27e
Author: Junxiao Bi <junxiao.bi@oracle.com>
Date:   Thu Jul 29 14:53:38 2021 -0700

    ocfs2: fix zero out valid data
    
    commit f267aeb6dea5e468793e5b8eb6a9c72c0020d418 upstream.
    
    If append-dio feature is enabled, direct-io write and fallocate could
    run in parallel to extend file size, fallocate used "orig_isize" to
    record i_size before taking "ip_alloc_sem", when
    ocfs2_zeroout_partial_cluster() zeroout EOF blocks, i_size maybe already
    extended by ocfs2_dio_end_io_write(), that will cause valid data zeroed
    out.
    
    Link: https://lkml.kernel.org/r/20210722054923.24389-1-junxiao.bi@oracle.com
    Fixes: 6bba4471f0cc ("ocfs2: fix data corruption by fallocate")
    Signed-off-by: Junxiao Bi <junxiao.bi@oracle.com>
    Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
    Cc: Changwei Ge <gechangwei@live.cn>
    Cc: Gang He <ghe@suse.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Cc: Jun Piao <piaojun@huawei.com>
    Cc: Mark Fasheh <mark@fasheh.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
index 94df697e2638..c1a46061f9c0 100644
--- a/fs/ocfs2/file.c
+++ b/fs/ocfs2/file.c
@@ -1943,7 +1943,6 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode,
 		goto out_inode_unlock;
 	}
 
-	orig_isize = i_size_read(inode);
 	switch (sr->l_whence) {
 	case 0: /*SEEK_SET*/
 		break;
@@ -1951,7 +1950,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode,
 		sr->l_start += f_pos;
 		break;
 	case 2: /*SEEK_END*/
-		sr->l_start += orig_isize;
+		sr->l_start += i_size_read(inode);
 		break;
 	default:
 		ret = -EINVAL;
@@ -2006,6 +2005,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode,
 		ret = -EINVAL;
 	}
 
+	orig_isize = i_size_read(inode);
 	/* zeroout eof blocks in the cluster. */
 	if (!ret && change_size && orig_isize < size) {
 		ret = ocfs2_zeroout_partial_cluster(inode, orig_isize,

commit ce1fd5a2262265a8be09b861340a79683cc1f7cf
Author: Juergen Gross <jgross@suse.com>
Date:   Thu Jul 1 17:41:00 2021 +0200

    x86/kvm: fix vcpu-id indexed array sizes
    
    commit 76b4f357d0e7d8f6f0013c733e6cba1773c266d3 upstream.
    
    KVM_MAX_VCPU_ID is the maximum vcpu-id of a guest, and not the number
    of vcpu-ids. Fix array indexed by vcpu-id to have KVM_MAX_VCPU_ID+1
    elements.
    
    Note that this is currently no real problem, as KVM_MAX_VCPU_ID is
    an odd number, resulting in always enough padding being available at
    the end of those arrays.
    
    Nevertheless this should be fixed in order to avoid rare problems in
    case someone is using an even number for KVM_MAX_VCPU_ID.
    
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Message-Id: <20210701154105.23215-2-jgross@suse.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kvm/ioapic.c b/arch/x86/kvm/ioapic.c
index bac2ec9b4443..9944b9c7ceee 100644
--- a/arch/x86/kvm/ioapic.c
+++ b/arch/x86/kvm/ioapic.c
@@ -96,7 +96,7 @@ static unsigned long ioapic_read_indirect(struct kvm_ioapic *ioapic,
 static void rtc_irq_eoi_tracking_reset(struct kvm_ioapic *ioapic)
 {
 	ioapic->rtc_status.pending_eoi = 0;
-	bitmap_zero(ioapic->rtc_status.dest_map.map, KVM_MAX_VCPU_ID);
+	bitmap_zero(ioapic->rtc_status.dest_map.map, KVM_MAX_VCPU_ID + 1);
 }
 
 static void kvm_rtc_eoi_tracking_restore_all(struct kvm_ioapic *ioapic);
diff --git a/arch/x86/kvm/ioapic.h b/arch/x86/kvm/ioapic.h
index ea1a4e0297da..283f1f489bca 100644
--- a/arch/x86/kvm/ioapic.h
+++ b/arch/x86/kvm/ioapic.h
@@ -43,13 +43,13 @@ struct kvm_vcpu;
 
 struct dest_map {
 	/* vcpu bitmap where IRQ has been sent */
-	DECLARE_BITMAP(map, KVM_MAX_VCPU_ID);
+	DECLARE_BITMAP(map, KVM_MAX_VCPU_ID + 1);
 
 	/*
 	 * Vector sent to a given vcpu, only valid when
 	 * the vcpu's bit in map is set
 	 */
-	u8 vectors[KVM_MAX_VCPU_ID];
+	u8 vectors[KVM_MAX_VCPU_ID + 1];
 };
 
 

commit d96a56a7605da8acbeadfb1c9660cb79d345d382
Author: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
Date:   Tue Jul 27 15:13:03 2021 +0800

    btrfs: fix rw device counting in __btrfs_free_extra_devids
    
    commit b2a616676839e2a6b02c8e40be7f886f882ed194 upstream.
    
    When removing a writeable device in __btrfs_free_extra_devids, the rw
    device count should be decremented.
    
    This error was caught by Syzbot which reported a warning in
    close_fs_devices:
    
      WARNING: CPU: 1 PID: 9355 at fs/btrfs/volumes.c:1168 close_fs_devices+0x763/0x880 fs/btrfs/volumes.c:1168
      Modules linked in:
      CPU: 0 PID: 9355 Comm: syz-executor552 Not tainted 5.13.0-rc1-syzkaller #0
      Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
      RIP: 0010:close_fs_devices+0x763/0x880 fs/btrfs/volumes.c:1168
      RSP: 0018:ffffc9000333f2f0 EFLAGS: 00010293
      RAX: ffffffff8365f5c3 RBX: 0000000000000001 RCX: ffff888029afd4c0
      RDX: 0000000000000000 RSI: 0000000000000001 RDI: 0000000000000000
      RBP: ffff88802846f508 R08: ffffffff8365f525 R09: ffffed100337d128
      R10: ffffed100337d128 R11: 0000000000000000 R12: dffffc0000000000
      R13: ffff888019be8868 R14: 1ffff1100337d10d R15: 1ffff1100337d10a
      FS:  00007f6f53828700(0000) GS:ffff8880b9a00000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 000000000047c410 CR3: 00000000302a6000 CR4: 00000000001506f0
      DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      Call Trace:
       btrfs_close_devices+0xc9/0x450 fs/btrfs/volumes.c:1180
       open_ctree+0x8e1/0x3968 fs/btrfs/disk-io.c:3693
       btrfs_fill_super fs/btrfs/super.c:1382 [inline]
       btrfs_mount_root+0xac5/0xc60 fs/btrfs/super.c:1749
       legacy_get_tree+0xea/0x180 fs/fs_context.c:592
       vfs_get_tree+0x86/0x270 fs/super.c:1498
       fc_mount fs/namespace.c:993 [inline]
       vfs_kern_mount+0xc9/0x160 fs/namespace.c:1023
       btrfs_mount+0x3d3/0xb50 fs/btrfs/super.c:1809
       legacy_get_tree+0xea/0x180 fs/fs_context.c:592
       vfs_get_tree+0x86/0x270 fs/super.c:1498
       do_new_mount fs/namespace.c:2905 [inline]
       path_mount+0x196f/0x2be0 fs/namespace.c:3235
       do_mount fs/namespace.c:3248 [inline]
       __do_sys_mount fs/namespace.c:3456 [inline]
       __se_sys_mount+0x2f9/0x3b0 fs/namespace.c:3433
       do_syscall_64+0x3f/0xb0 arch/x86/entry/common.c:47
       entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Because fs_devices->rw_devices was not 0 after
    closing all devices. Here is the call trace that was observed:
    
      btrfs_mount_root():
        btrfs_scan_one_device():
          device_list_add();   <---------------- device added
        btrfs_open_devices():
          open_fs_devices():
            btrfs_open_one_device();   <-------- writable device opened,
                                                 rw device count ++
        btrfs_fill_super():
          open_ctree():
            btrfs_free_extra_devids():
              __btrfs_free_extra_devids();  <--- writable device removed,
                                          rw device count not decremented
              fail_tree_roots:
                btrfs_close_devices():
                  close_fs_devices();   <------- rw device count off by 1
    
    As a note, prior to commit cf89af146b7e ("btrfs: dev-replace: fail
    mount if we don't have replace item with target device"), rw_devices
    was decremented on removing a writable device in
    __btrfs_free_extra_devids only if the BTRFS_DEV_STATE_REPLACE_TGT bit
    was not set for the device. However, this check does not need to be
    reinstated as it is now redundant and incorrect.
    
    In __btrfs_free_extra_devids, we skip removing the device if it is the
    target for replacement. This is done by checking whether device->devid
    == BTRFS_DEV_REPLACE_DEVID. Since BTRFS_DEV_STATE_REPLACE_TGT is set
    only on the device with devid BTRFS_DEV_REPLACE_DEVID, no devices
    should have the BTRFS_DEV_STATE_REPLACE_TGT bit set after the check,
    and so it's redundant to test for that bit.
    
    Additionally, following commit 82372bc816d7 ("Btrfs: make
    the logic of source device removing more clear"), rw_devices is
    incremented whenever a writeable device is added to the alloc
    list (including the target device in btrfs_dev_replace_finishing), so
    all removals of writable devices from the alloc list should also be
    accompanied by a decrement to rw_devices.
    
    Reported-by: syzbot+a70e2ad0879f160b9217@syzkaller.appspotmail.com
    Fixes: cf89af146b7e ("btrfs: dev-replace: fail mount if we don't have replace item with target device")
    CC: stable@vger.kernel.org # 5.10+
    Tested-by: syzbot+a70e2ad0879f160b9217@syzkaller.appspotmail.com
    Reviewed-by: Anand Jain <anand.jain@oracle.com>
    Signed-off-by: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 662711200eeb..5a19f5ee7038 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -995,6 +995,7 @@ void btrfs_free_extra_devids(struct btrfs_fs_devices *fs_devices, int step)
 		if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state)) {
 			list_del_init(&device->dev_alloc_list);
 			clear_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
+			fs_devices->rw_devices--;
 		}
 		list_del_init(&device->dev_list);
 		fs_devices->num_devices--;

commit 6c8c88a4627686e7090be3c969306ceda5a48612
Author: Jan Kiszka <jan.kiszka@siemens.com>
Date:   Sun Apr 11 10:12:16 2021 +0200

    x86/asm: Ensure asm/proto.h can be included stand-alone
    
    [ Upstream commit f7b21a0e41171d22296b897dac6e4c41d2a3643c ]
    
    Fix:
    
      ../arch/x86/include/asm/proto.h:14:30: warning: ?struct task_struct??declared \
        inside parameter list will not be visible outside of this definition or declaration
      long do_arch_prctl_64(struct task_struct *task, int option, unsigned long arg2);
                                   ^~~~~~~~~~~
    
      .../arch/x86/include/asm/proto.h:40:34: warning: ?struct task_struct??declared \
        inside parameter list will not be visible outside of this definition or declaration
       long do_arch_prctl_common(struct task_struct *task, int option,
                                        ^~~~~~~~~~~
    
    if linux/sched.h hasn't be included previously. This fixes a build error
    when this header is used outside of the kernel tree.
    
     [ bp: Massage commit message. ]
    
    Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Link: https://lkml.kernel.org/r/b76b4be3-cf66-f6b2-9a6c-3e7ef54f9845@web.de
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/x86/include/asm/proto.h b/arch/x86/include/asm/proto.h
index 6e81788a30c1..0eaca7a130c9 100644
--- a/arch/x86/include/asm/proto.h
+++ b/arch/x86/include/asm/proto.h
@@ -4,6 +4,8 @@
 
 #include <asm/ldt.h>
 
+struct task_struct;
+
 /* misc architecture specific prototypes */
 
 void syscall_init(void);

commit d94d95ae0dd0086f465442fad48fbb2fa1bd7ed3
Author: Eric Dumazet <edumazet@google.com>
Date:   Tue Apr 13 05:41:35 2021 -0700

    gro: ensure frag0 meets IP header alignment
    
    commit 38ec4944b593fd90c5ef42aaaa53e66ae5769d04 upstream.
    
    After commit 0f6925b3e8da ("virtio_net: Do not pull payload in skb->head")
    Guenter Roeck reported one failure in his tests using sh architecture.
    
    After much debugging, we have been able to spot silent unaligned accesses
    in inet_gro_receive()
    
    The issue at hand is that upper networking stacks assume their header
    is word-aligned. Low level drivers are supposed to reserve NET_IP_ALIGN
    bytes before the Ethernet header to make that happen.
    
    This patch hardens skb_gro_reset_offset() to not allow frag0 fast-path
    if the fragment is not properly aligned.
    
    Some arches like x86, arm64 and powerpc do not care and define NET_IP_ALIGN
    as 0, this extra check will be a NOP for them.
    
    Note that if frag0 is not used, GRO will call pskb_may_pull()
    as many times as needed to pull network and transport headers.
    
    Fixes: 0f6925b3e8da ("virtio_net: Do not pull payload in skb->head")
    Fixes: 78a478d0efd9 ("gro: Inline skb_gro_header and cache frag0 virtual address")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: Guenter Roeck <linux@roeck-us.net>
    Cc: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
    Cc: "Michael S. Tsirkin" <mst@redhat.com>
    Cc: Jason Wang <jasowang@redhat.com>
    Acked-by: Michael S. Tsirkin <mst@redhat.com>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 06176ef2a842..5f2e6451ece5 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -2788,6 +2788,15 @@ static inline void skb_propagate_pfmemalloc(struct page *page,
 		skb->pfmemalloc = true;
 }
 
+/**
+ * skb_frag_off() - Returns the offset of a skb fragment
+ * @frag: the paged fragment
+ */
+static inline unsigned int skb_frag_off(const skb_frag_t *frag)
+{
+	return frag->page_offset;
+}
+
 /**
  * skb_frag_page - retrieve the page referred to by a paged fragment
  * @frag: the paged fragment
diff --git a/net/core/dev.c b/net/core/dev.c
index 722ae0b57f3f..a6798117bb1a 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -5400,7 +5400,8 @@ static void skb_gro_reset_offset(struct sk_buff *skb)
 
 	if (skb_mac_header(skb) == skb_tail_pointer(skb) &&
 	    pinfo->nr_frags &&
-	    !PageHighMem(skb_frag_page(frag0))) {
+	    !PageHighMem(skb_frag_page(frag0)) &&
+	    (!NET_IP_ALIGN || !(skb_frag_off(frag0) & 3))) {
 		NAPI_GRO_CB(skb)->frag0 = skb_frag_address(frag0);
 		NAPI_GRO_CB(skb)->frag0_len = min_t(unsigned int,
 						    skb_frag_size(frag0),

commit 16851e34b621bc7e652c508bb28c47948fb86958
Author: Eric Dumazet <edumazet@google.com>
Date:   Fri Apr 2 06:26:02 2021 -0700

    virtio_net: Do not pull payload in skb->head
    
    commit 0f6925b3e8da0dbbb52447ca8a8b42b371aac7db upstream.
    
    Xuan Zhuo reported that commit 3226b158e67c ("net: avoid 32 x truesize
    under-estimation for tiny skbs") brought  a ~10% performance drop.
    
    The reason for the performance drop was that GRO was forced
    to chain sk_buff (using skb_shinfo(skb)->frag_list), which
    uses more memory but also cause packet consumers to go over
    a lot of overhead handling all the tiny skbs.
    
    It turns out that virtio_net page_to_skb() has a wrong strategy :
    It allocates skbs with GOOD_COPY_LEN (128) bytes in skb->head, then
    copies 128 bytes from the page, before feeding the packet to GRO stack.
    
    This was suboptimal before commit 3226b158e67c ("net: avoid 32 x truesize
    under-estimation for tiny skbs") because GRO was using 2 frags per MSS,
    meaning we were not packing MSS with 100% efficiency.
    
    Fix is to pull only the ethernet header in page_to_skb()
    
    Then, we change virtio_net_hdr_to_skb() to pull the missing
    headers, instead of assuming they were already pulled by callers.
    
    This fixes the performance regression, but could also allow virtio_net
    to accept packets with more than 128bytes of headers.
    
    Many thanks to Xuan Zhuo for his report, and his tests/help.
    
    Fixes: 3226b158e67c ("net: avoid 32 x truesize under-estimation for tiny skbs")
    Reported-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
    Link: https://www.spinics.net/lists/netdev/msg731397.html
    Co-Developed-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
    Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Cc: "Michael S. Tsirkin" <mst@redhat.com>
    Cc: Jason Wang <jasowang@redhat.com>
    Cc: virtualization@lists.linux-foundation.org
    Acked-by: Jason Wang <jasowang@redhat.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 5e8b40630286..1a8fe5bacb19 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -413,9 +413,13 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi,
 	offset += hdr_padded_len;
 	p += hdr_padded_len;
 
-	copy = len;
-	if (copy > skb_tailroom(skb))
-		copy = skb_tailroom(skb);
+	/* Copy all frame if it fits skb->head, otherwise
+	 * we let virtio_net_hdr_to_skb() and GRO pull headers as needed.
+	 */
+	if (len <= skb_tailroom(skb))
+		copy = len;
+	else
+		copy = ETH_HLEN + metasize;
 	skb_put_data(skb, p, copy);
 
 	if (metasize) {
diff --git a/include/linux/virtio_net.h b/include/linux/virtio_net.h
index a1829139ff4a..8f48264f5dab 100644
--- a/include/linux/virtio_net.h
+++ b/include/linux/virtio_net.h
@@ -65,14 +65,18 @@ static inline int virtio_net_hdr_to_skb(struct sk_buff *skb,
 	skb_reset_mac_header(skb);
 
 	if (hdr->flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) {
-		u16 start = __virtio16_to_cpu(little_endian, hdr->csum_start);
-		u16 off = __virtio16_to_cpu(little_endian, hdr->csum_offset);
+		u32 start = __virtio16_to_cpu(little_endian, hdr->csum_start);
+		u32 off = __virtio16_to_cpu(little_endian, hdr->csum_offset);
+		u32 needed = start + max_t(u32, thlen, off + sizeof(__sum16));
+
+		if (!pskb_may_pull(skb, needed))
+			return -EINVAL;
 
 		if (!skb_partial_csum_set(skb, start, off))
 			return -EINVAL;
 
 		p_off = skb_transport_offset(skb) + thlen;
-		if (p_off > skb_headlen(skb))
+		if (!pskb_may_pull(skb, p_off))
 			return -EINVAL;
 	} else {
 		/* gso packets without NEEDS_CSUM do not set transport_offset.
@@ -102,14 +106,14 @@ static inline int virtio_net_hdr_to_skb(struct sk_buff *skb,
 			}
 
 			p_off = keys.control.thoff + thlen;
-			if (p_off > skb_headlen(skb) ||
+			if (!pskb_may_pull(skb, p_off) ||
 			    keys.basic.ip_proto != ip_proto)
 				return -EINVAL;
 
 			skb_set_transport_header(skb, keys.control.thoff);
 		} else if (gso_type) {
 			p_off = thlen;
-			if (p_off > skb_headlen(skb))
+			if (!pskb_may_pull(skb, p_off))
 				return -EINVAL;
 		}
 	}

commit 67dd166442bac69da935f23318be61f520f72ee5
Author: Steven Liu <steven.liu@rock-chips.com>
Date:   Tue Aug 3 16:51:32 2021 +0800

    serial: 8250_port: fix UART DL check when setting divisor.
    
    Signed-off-by: Steven Liu <steven.liu@rock-chips.com>
    Change-Id: I907480ec39c6603bca7bb30e5f889bac3e57057c

diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c
index b05183c432d7..99d52647908b 100644
--- a/drivers/tty/serial/8250/8250_port.c
+++ b/drivers/tty/serial/8250/8250_port.c
@@ -2681,14 +2681,16 @@ void serial8250_do_set_divisor(struct uart_port *port, unsigned int baud,
 		serial_port_out(port, UART_LCR, up->lcr | UART_LCR_DLAB);
 
 	serial_dl_write(up, quot);
+#ifdef CONFIG_ARCH_ROCKCHIP
+	if (quot != serial_dl_read(up))
+		dev_warn_ratelimited(port->dev, "ttyS%d set divisor fail, quot:%d != dll,dlh:%d\n",
+					serial_index(port), quot, serial_dl_read(up));
+#endif
 	if (port->type != PORT_16750)
 		serial_port_out(port, UART_LCR, up->lcr);	/* reset DLAB */
 
 #ifdef CONFIG_ARCH_ROCKCHIP
 	serial_port_out(port, UART_MCR, up->mcr);
-	if (quot != serial_dl_read(up))
-		pr_warn_ratelimited("ttyS%d set divisor fail, quot:%d != dll,dlh:%d\n",
-					 serial_index(port), quot, serial_dl_read(up));
 #endif
 
 	/* XR17V35x UARTs have an extra fractional divisor register (DLD) */

commit b35dcbe150e169d56f0b59610b6c8219505b8384
Author: Yu Qiaowei <cerf.yu@rock-chips.com>
Date:   Wed Aug 4 09:24:43 2021 +0800

    video/rockchip: rga2: Remove the useless code about the src1 channel
    
    1. Remove the useless code about the coordinate after rotation in
       the src1 channel.
    2. Remove 4 alignment of the src1 channel.
    
    Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
    Change-Id: Ib780c0143a76e4bfc50c0be95e483c503525ab9f

diff --git a/drivers/video/rockchip/rga2/rga2_mmu_info.c b/drivers/video/rockchip/rga2/rga2_mmu_info.c
index a9ab495a63a5..94a7e9274821 100644
--- a/drivers/video/rockchip/rga2/rga2_mmu_info.c
+++ b/drivers/video/rockchip/rga2/rga2_mmu_info.c
@@ -704,7 +704,6 @@ static int rga2_mmu_info_BitBlt_mode(struct rga2_reg *reg, struct rga2_req *req)
 						  req->src1.vir_w,
 						  (req->src1.vir_h),
 						  &Src1Start);
-		Src1PageCount = (Src1PageCount + 3) & (~3);
 		if (Src1PageCount == 0)
 			return -EINVAL;
 	}
diff --git a/drivers/video/rockchip/rga2/rga2_reg_info.c b/drivers/video/rockchip/rga2/rga2_reg_info.c
index 244b2e4c9967..29e0dee977ad 100644
--- a/drivers/video/rockchip/rga2/rga2_reg_info.c
+++ b/drivers/video/rockchip/rga2/rga2_reg_info.c
@@ -382,8 +382,6 @@ static void RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
     RK_U32 u_lt_addr, u_ld_addr, u_rt_addr, u_rd_addr;
     RK_U32 v_lt_addr, v_ld_addr, v_rt_addr, v_rd_addr;
 
-    RK_U32 s_y_lt_addr, s_y_ld_addr, s_y_rt_addr, s_y_rd_addr;
-
     dpw = 1;
     x_div = y_div = 1;
 
@@ -543,12 +541,9 @@ static void RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
 		*RGA_DST_NN_QUANTIZE_OFFSET = (msg->gr_color.gr_y_r & 0xffff) | (msg->gr_color.gr_y_g << 10) | (msg->gr_color.gr_y_b << 20);
 	}
 
-    yrgb_addr = (RK_U32)msg->src1.yrgb_addr + (msg->src1.y_offset * s_stride) + (msg->src1.x_offset * spw);
+    s_yrgb_addr = (RK_U32)msg->src1.yrgb_addr + (msg->src1.y_offset * s_stride) + (msg->src1.x_offset * spw);
 
-    s_y_lt_addr = yrgb_addr;
-    s_y_ld_addr = yrgb_addr + (msg->src1.act_h - 1) * s_stride;
-    s_y_rt_addr = yrgb_addr + (msg->dst.act_w - 1) * spw;
-    s_y_rd_addr = s_y_ld_addr + (msg->dst.act_w - 1) * spw;
+    *bRGA_SRC_BASE3 = s_yrgb_addr;
 
 	if (dst_fmt_y4_en) {
 		yrgb_addr = (RK_U32)msg->dst.yrgb_addr + (msg->dst.y_offset * d_stride) + ((msg->dst.x_offset * dpw)>>1);
@@ -607,16 +602,12 @@ static void RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
                 yrgb_addr = y_rd_addr;
                 u_addr = u_rd_addr;
                 v_addr = v_rd_addr;
-
-                s_yrgb_addr = s_y_rd_addr;
             }
             else
             {
                 yrgb_addr = y_ld_addr;
                 u_addr = u_ld_addr;
                 v_addr = v_ld_addr;
-
-                s_yrgb_addr = s_y_ld_addr;
             }
         }
         else
@@ -626,16 +617,12 @@ static void RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
                 yrgb_addr = y_rt_addr;
                 u_addr = u_rt_addr;
                 v_addr = v_rt_addr;
-
-                s_yrgb_addr = s_y_rt_addr;
             }
             else
             {
                 yrgb_addr = y_lt_addr;
                 u_addr = u_lt_addr;
                 v_addr = v_lt_addr;
-
-                s_yrgb_addr = s_y_lt_addr;
             }
         }
     }
@@ -648,16 +635,12 @@ static void RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
                 yrgb_addr = y_ld_addr;
                 u_addr = u_ld_addr;
                 v_addr = v_ld_addr;
-
-                s_yrgb_addr = s_y_ld_addr;
             }
             else
             {
                 yrgb_addr = y_rd_addr;
                 u_addr = u_rd_addr;
                 v_addr = v_rd_addr;
-
-                s_yrgb_addr = s_y_rd_addr;
             }
         }
         else
@@ -667,16 +650,12 @@ static void RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
                 yrgb_addr = y_lt_addr;
                 u_addr = u_lt_addr;
                 v_addr = v_lt_addr;
-
-                s_yrgb_addr = s_y_lt_addr;
             }
             else
             {
                 yrgb_addr = y_rt_addr;
                 u_addr = u_rt_addr;
                 v_addr = v_rt_addr;
-
-                s_yrgb_addr = s_y_rt_addr;
             }
         }
     }
@@ -702,7 +681,6 @@ static void RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
 	//if (msg->dst.format >= 0x18) {
 	//	*bRGA_DST_BASE1 = msg->dst.x_offset;
 	//}
-    *bRGA_SRC_BASE3 = (RK_U32)s_y_lt_addr;
 }
 
 static void RGA2_set_reg_alpha_info(u8 *base, struct rga2_req *msg)

commit fa0b8533c1f434953be95b338e233fdb6f248e33
Author: Yiqing Zeng <zack.zeng@rock-chips.com>
Date:   Mon Aug 2 16:31:40 2021 +0800

    media: i2c: ov7251 support 640x480@120fps mode
    
    Signed-off-by: Yiqing Zeng <zack.zeng@rock-chips.com>
    Change-Id: Ic00cfd746ebc91458452ce91c9ae16c078a9db5b

diff --git a/drivers/media/i2c/ov7251.c b/drivers/media/i2c/ov7251.c
index d51374354465..75e416bb15d6 100644
--- a/drivers/media/i2c/ov7251.c
+++ b/drivers/media/i2c/ov7251.c
@@ -9,6 +9,7 @@
  * V0.0X01.0X03 add enum_frame_interval function.
  * V0.0X01.0X04 add quick stream on/off
  * V0.0X01.0X05 add function g_mbus_config
+ * V0.0X01.0X06 support 640x480@120fps mode
  */
 
 #include <linux/clk.h>
@@ -18,6 +19,7 @@
 #include <linux/i2c.h>
 #include <linux/module.h>
 #include <linux/pm_runtime.h>
+#include <linux/pinctrl/consumer.h>
 #include <linux/regulator/consumer.h>
 #include <linux/sysfs.h>
 #include <linux/slab.h>
@@ -28,7 +30,7 @@
 #include <media/v4l2-ctrls.h>
 #include <media/v4l2-subdev.h>
 
-#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x05)
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x06)
 
 #ifndef V4L2_CID_DIGITAL_GAIN
 #define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
@@ -51,6 +53,7 @@
 #define OV7251_EXPOSURE_MIN		4
 #define OV7251_EXPOSURE_STEP		0xf
 #define OV7251_VTS_MAX			0xffff
+#define OV7251_REG_VTS			0x380e
 
 #define OV7251_REG_ANALOG_GAIN		0x350a
 #define ANALOG_GAIN_MASK		0x3ff
@@ -63,8 +66,6 @@
 #define	OV7251_TEST_PATTERN_ENABLE	0x80
 #define	OV7251_TEST_PATTERN_DISABLE	0x0
 
-#define OV7251_REG_VTS			0x380e
-
 #define REG_NULL			0xFFFF
 
 #define OV7251_REG_VALUE_08BIT		1
@@ -72,8 +73,11 @@
 #define OV7251_REG_VALUE_24BIT		3
 
 #define OV7251_NAME			"ov7251"
-
 #define OV7251_LANES			1
+#define PIX_FORMAT			MEDIA_BUS_FMT_Y10_1X10
+
+#define OF_CAMERA_PINCTRL_STATE_DEFAULT	"rockchip,camera_default"
+#define OF_CAMERA_PINCTRL_STATE_SLEEP	"rockchip,camera_sleep"
 
 static const char * const ov7251_supply_names[] = {
 	"avdd",		/* Analog power */
@@ -96,6 +100,7 @@ struct ov7251_mode {
 	u32 vts_def;
 	u32 exp_def;
 	const struct regval *reg_list;
+	u32 hdr_mode;
 };
 
 struct ov7251 {
@@ -104,7 +109,9 @@ struct ov7251 {
 	struct gpio_desc	*reset_gpio;
 	struct gpio_desc	*pwdn_gpio;
 	struct regulator_bulk_data supplies[OV7251_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;
@@ -126,6 +133,160 @@ struct ov7251 {
 
 #define to_ov7251(sd) container_of(sd, struct ov7251, subdev)
 
+/*
+ * Xclk 24Mhz
+ * Pclk 48Mhz
+ * PCLK = HTS * VTS * FPS
+ * linelength 775(0x302)
+ * framelength 516(0x204)
+ * grabwindow_width 640
+ * grabwindow_height 480
+ * max_framerate 120fps
+ * mipi_datarate per lane 640Mbps
+ */
+static const struct regval ov7251_640x480_120fps_regs[] = {
+	{0x0103, 0x01},
+	{0x0100, 0x00},
+	{0x3005, 0x00},
+	{0x3012, 0xc0},
+	{0x3013, 0xd2},
+	{0x3014, 0x04},
+	{0x3016, 0x10},
+	{0x3017, 0x00},
+	{0x3018, 0x00},
+	{0x301a, 0x00},
+	{0x301b, 0x00},
+	{0x301c, 0x00},
+	{0x3023, 0x05},
+	{0x3037, 0xf0},
+	{0x3098, 0x04},
+	{0x3099, 0x32},
+	{0x309a, 0x05},
+	{0x309b, 0x04},
+	{0x30b0, 0x0a},
+	{0x30b1, 0x01},
+	{0x30b3, 0x64},
+	{0x30b4, 0x03},
+	{0x30b5, 0x05},
+	{0x3106, 0xda},
+	{0x3500, 0x00},
+	{0x3501, 0x1f},
+	{0x3502, 0x80},
+	{0x3503, 0x07},
+	{0x3509, 0x10},
+	{0x350b, 0x10},
+	{0x3600, 0x1c},
+	{0x3602, 0x62},
+	{0x3620, 0xb7},
+	{0x3622, 0x04},
+	{0x3626, 0x21},
+	{0x3627, 0x30},
+	{0x3630, 0x44},
+	{0x3631, 0x35},
+	{0x3634, 0x60},
+	{0x3636, 0x00},
+	{0x3662, 0x01},
+	{0x3663, 0x70},
+	{0x3664, 0xf0},
+	{0x3666, 0x0a},
+	{0x3669, 0x1a},
+	{0x366a, 0x00},
+	{0x366b, 0x50},
+	{0x3673, 0x01},
+	{0x3674, 0xef},
+	{0x3675, 0x03},
+	{0x3705, 0xc1},
+	{0x3709, 0x40},
+	{0x373c, 0x08},
+	{0x3742, 0x00},
+	{0x3757, 0xb3},
+	{0x3788, 0x00},
+	{0x37a8, 0x01},
+	{0x37a9, 0xc0},
+	{0x3800, 0x00},
+	{0x3801, 0x04},
+	{0x3802, 0x00},
+	{0x3803, 0x04},
+	{0x3804, 0x02},
+	{0x3805, 0x8b},
+	{0x3806, 0x01},
+	{0x3807, 0xeb},
+	{0x3808, 0x02},
+	{0x3809, 0x80},
+	{0x380a, 0x01},
+	{0x380b, 0xe0},
+	{0x380c, 0x03},
+	{0x380d, 0xa1},
+	{0x380e, 0x02},
+	{0x380f, 0x1a},
+	{0x3810, 0x00},
+	{0x3811, 0x04},
+	{0x3812, 0x00},
+	{0x3813, 0x05},
+	{0x3814, 0x11},
+	{0x3815, 0x11},
+	{0x3820, 0x40},
+	{0x3821, 0x00},
+	{0x382f, 0x0e},
+	{0x3832, 0x00},
+	{0x3833, 0x05},
+	{0x3834, 0x00},
+	{0x3835, 0x0c},
+	{0x3837, 0x00},
+	{0x3b80, 0x00},
+	{0x3b81, 0xa5},
+	{0x3b82, 0x10},
+	{0x3b83, 0x00},
+	{0x3b84, 0x08},
+	{0x3b85, 0x00},
+	{0x3b86, 0x01},
+	{0x3b87, 0x00},
+	{0x3b88, 0x00},
+	{0x3b89, 0x00},
+	{0x3b8a, 0x00},
+	{0x3b8b, 0x05},
+	{0x3b8c, 0x00},
+	{0x3b8d, 0x00},
+	{0x3b8e, 0x00},
+	{0x3b8f, 0x1a},
+	{0x3b94, 0x05},
+	{0x3b95, 0xf2},
+	{0x3b96, 0x40},
+	{0x3c00, 0x89},
+	{0x3c01, 0x63},
+	{0x3c02, 0x01},
+	{0x3c03, 0x00},
+	{0x3c04, 0x00},
+	{0x3c05, 0x03},
+	{0x3c06, 0x00},
+	{0x3c07, 0x06},
+	{0x3c0c, 0x01},
+	{0x3c0d, 0xd0},
+	{0x3c0e, 0x02},
+	{0x3c0f, 0x0a},
+	{0x4001, 0x42},
+	{0x4004, 0x04},
+	{0x4005, 0x00},
+	{0x404e, 0x01},
+	{0x4300, 0xff},
+	{0x4301, 0x00},
+	{0x4501, 0x48},
+	{0x4600, 0x00},
+	{0x4601, 0x4e},
+	{0x4801, 0x0f},
+	{0x4806, 0x0f},
+	{0x4819, 0xaa},
+	{0x4823, 0x3e},
+	{0x4837, 0x19},
+	{0x4a0d, 0x00},
+	{0x4a47, 0x7f},
+	{0x4a49, 0xf0},
+	{0x4a4b, 0x30},
+	{0x5000, 0x85},
+	{0x5001, 0x80},
+	{REG_NULL, 0x00},
+};
+
 /*
  * Xclk 24Mhz
  * Pclk 48Mhz
@@ -137,10 +298,9 @@ struct ov7251 {
  * max_framerate 30fps
  * mipi_datarate per lane 640Mbps
  */
-static const struct regval ov7251_640x480_regs[] = {
+static const struct regval ov7251_640x480_30fps_regs[] = {
 	{0x0100, 0x00},
 	{0x0103, 0x01},
-
 	{0x3001, 0x62},
 	{0x3005, 0x00},
 	{0x3012, 0xc0},
@@ -285,6 +445,19 @@ static const struct regval ov7251_640x480_regs[] = {
 };
 
 static const struct ov7251_mode supported_modes[] = {
+	{
+		.width = 640,
+		.height = 480,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 1200000,
+		},
+		.exp_def = 0x00f8,
+		.hts_def = 0x03a1,
+		.vts_def = 0x021a,
+		.reg_list = ov7251_640x480_120fps_regs,
+		.hdr_mode = 0,
+	},
 	{
 		.width = 640,
 		.height = 480,
@@ -295,8 +468,9 @@ static const struct ov7251_mode supported_modes[] = {
 		.exp_def = 0x061c,
 		.hts_def = 0x03a0,
 		.vts_def = 0x06b8,
-		.reg_list = ov7251_640x480_regs,
-	},
+		.reg_list = ov7251_640x480_30fps_regs,
+		.hdr_mode = 0,
+	}
 };
 
 #define OV7251_LINK_FREQ_320MHZ		320000000
@@ -425,7 +599,7 @@ static int ov7251_set_fmt(struct v4l2_subdev *sd,
 	mutex_lock(&ov7251->mutex);
 
 	mode = ov7251_find_best_fit(fmt);
-	fmt->format.code = MEDIA_BUS_FMT_Y10_1X10;
+	fmt->format.code = PIX_FORMAT;
 	fmt->format.width = mode->width;
 	fmt->format.height = mode->height;
 	fmt->format.field = V4L2_FIELD_NONE;
@@ -470,7 +644,7 @@ static int ov7251_get_fmt(struct v4l2_subdev *sd,
 	} else {
 		fmt->format.width = mode->width;
 		fmt->format.height = mode->height;
-		fmt->format.code = MEDIA_BUS_FMT_Y10_1X10;
+		fmt->format.code = PIX_FORMAT;
 		fmt->format.field = V4L2_FIELD_NONE;
 	}
 	mutex_unlock(&ov7251->mutex);
@@ -484,7 +658,7 @@ static int ov7251_enum_mbus_code(struct v4l2_subdev *sd,
 {
 	if (code->index != 0)
 		return -EINVAL;
-	code->code = MEDIA_BUS_FMT_Y10_1X10;
+	code->code = PIX_FORMAT;
 
 	return 0;
 }
@@ -496,7 +670,7 @@ static int ov7251_enum_frame_sizes(struct v4l2_subdev *sd,
 	if (fse->index >= ARRAY_SIZE(supported_modes))
 		return -EINVAL;
 
-	if (fse->code != MEDIA_BUS_FMT_Y10_1X10)
+	if (fse->code != PIX_FORMAT)
 		return -EINVAL;
 
 	fse->min_width  = supported_modes[fse->index].width;
@@ -537,15 +711,16 @@ static void ov7251_get_module_inf(struct ov7251 *ov7251,
 				  struct rkmodule_inf *inf)
 {
 	memset(inf, 0, sizeof(*inf));
-	strlcpy(inf->base.sensor, OV7251_NAME, sizeof(inf->base.sensor));
-	strlcpy(inf->base.module, ov7251->module_name,
+	strscpy(inf->base.sensor, OV7251_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, ov7251->module_name,
 		sizeof(inf->base.module));
-	strlcpy(inf->base.lens, ov7251->len_name, sizeof(inf->base.lens));
+	strscpy(inf->base.lens, ov7251->len_name, sizeof(inf->base.lens));
 }
 
 static long ov7251_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 {
 	struct ov7251 *ov7251 = to_ov7251(sd);
+	struct rkmodule_hdr_cfg *hdr;
 	long ret = 0;
 	u32 stream = 0;
 
@@ -553,10 +728,18 @@ static long ov7251_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 	case RKMODULE_GET_MODULE_INFO:
 		ov7251_get_module_inf(ov7251, (struct rkmodule_inf *)arg);
 		break;
+	case RKMODULE_GET_HDR_CFG:
+		hdr = (struct rkmodule_hdr_cfg *)arg;
+		hdr->esp.mode = HDR_NORMAL_VC;
+		hdr->hdr_mode = ov7251->cur_mode->hdr_mode;
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr = (struct rkmodule_hdr_cfg *)arg;
+		if (hdr->hdr_mode != 0)
+			ret = -1;
+		break;
 	case RKMODULE_SET_QUICK_STREAM:
-
 		stream = *((u32 *)arg);
-
 		if (stream)
 			ret = ov7251_write_reg(ov7251->client, OV7251_REG_CTRL_MODE,
 				OV7251_REG_VALUE_08BIT, OV7251_MODE_STREAMING);
@@ -578,7 +761,7 @@ static long ov7251_compat_ioctl32(struct v4l2_subdev *sd,
 {
 	void __user *up = compat_ptr(arg);
 	struct rkmodule_inf *inf;
-	struct rkmodule_awb_cfg *cfg;
+	struct rkmodule_hdr_cfg *hdr;
 	long ret;
 	u32 stream = 0;
 
@@ -591,26 +774,48 @@ static long ov7251_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = ov7251_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:
-		cfg = kzalloc(sizeof(*cfg), GFP_KERNEL);
-		if (!cfg) {
+	case RKMODULE_GET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
 			ret = -ENOMEM;
 			return ret;
 		}
 
-		ret = copy_from_user(cfg, up, sizeof(*cfg));
-		if (!ret)
-			ret = ov7251_ioctl(sd, cmd, cfg);
-		kfree(cfg);
+		ret = ov7251_ioctl(sd, cmd, hdr);
+		if (!ret) {
+			ret = copy_to_user(up, hdr, sizeof(*hdr));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(hdr);
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		if (copy_from_user(hdr, up, sizeof(*hdr))) {
+			kfree(hdr);
+			return -EFAULT;
+		}
+
+		ret = ov7251_ioctl(sd, cmd, hdr);
+		kfree(hdr);
 		break;
 	case RKMODULE_SET_QUICK_STREAM:
-		ret = copy_from_user(&stream, up, sizeof(u32));
-		if (!ret)
-			ret = ov7251_ioctl(sd, cmd, &stream);
+		if (copy_from_user(&stream, up, sizeof(u32)))
+			return -EFAULT;
+
+		ret = ov7251_ioctl(sd, cmd, &stream);
 		break;
 	default:
 		ret = -ENOIOCTLCMD;
@@ -726,11 +931,18 @@ static int __ov7251_power_on(struct ov7251 *ov7251)
 	u32 delay_us;
 	struct device *dev = &ov7251->client->dev;
 
+	if (!IS_ERR_OR_NULL(ov7251->pins_default)) {
+		ret = pinctrl_select_state(ov7251->pinctrl,
+					   ov7251->pins_default);
+		if (ret < 0)
+			dev_err(dev, "could not set pins\n");
+	}
+
 	ret = clk_set_rate(ov7251->xvclk, OV7251_XVCLK_FREQ);
 	if (ret < 0)
-		dev_warn(dev, "Failed to set xvclk rate (24MHz)\n");
+		dev_err(dev, "Failed to set xvclk rate (24MHz)\n");
 	if (clk_get_rate(ov7251->xvclk) != OV7251_XVCLK_FREQ)
-		dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n");
+		dev_err(dev, "xvclk mismatched, modes are based on 24MHz\n");
 	ret = clk_prepare_enable(ov7251->xvclk);
 	if (ret < 0) {
 		dev_err(dev, "Failed to enable xvclk\n");
@@ -763,11 +975,23 @@ static int __ov7251_power_on(struct ov7251 *ov7251)
 disable_clk:
 	clk_disable_unprepare(ov7251->xvclk);
 
+	if (!IS_ERR_OR_NULL(ov7251->pins_sleep))
+		pinctrl_select_state(ov7251->pinctrl, ov7251->pins_sleep);
+
 	return ret;
 }
 
 static void __ov7251_power_off(struct ov7251 *ov7251)
 {
+	int ret;
+	struct device *dev = &ov7251->client->dev;
+
+	if (!IS_ERR_OR_NULL(ov7251->pins_sleep)) {
+		ret = pinctrl_select_state(ov7251->pinctrl,
+					   ov7251->pins_sleep);
+		if (ret < 0)
+			dev_dbg(dev, "could not set pins\n");
+	}
 	if (!IS_ERR(ov7251->pwdn_gpio))
 		gpiod_set_value_cansleep(ov7251->pwdn_gpio, 0);
 	clk_disable_unprepare(ov7251->xvclk);
@@ -808,7 +1032,7 @@ static int ov7251_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
 	/* Initialize try_fmt */
 	try_fmt->width = def_mode->width;
 	try_fmt->height = def_mode->height;
-	try_fmt->code = MEDIA_BUS_FMT_Y10_1X10;
+	try_fmt->code = PIX_FORMAT;
 	try_fmt->field = V4L2_FIELD_NONE;
 
 	mutex_unlock(&ov7251->mutex);
@@ -825,7 +1049,7 @@ static int ov7251_enum_frame_interval(struct v4l2_subdev *sd,
 	if (fie->index >= ARRAY_SIZE(supported_modes))
 		return -EINVAL;
 
-	if (fie->code != MEDIA_BUS_FMT_Y10_1X10)
+	if (fie->code != PIX_FORMAT)
 		return -EINVAL;
 
 	fie->width = supported_modes[fie->index].width;
@@ -848,6 +1072,35 @@ static int ov7251_g_mbus_config(struct v4l2_subdev *sd,
 	return 0;
 }
 
+#define CROP_START(SRC, DST) (((SRC) - (DST)) / 2 / 4 * 4)
+#define DST_WIDTH 640
+#define DST_HEIGHT 480
+
+/*
+ * The resolution of the driver configuration needs to be exactly
+ * the same as the current output resolution of the sensor,
+ * the input width of the isp needs to be 16 aligned,
+ * the input height of the isp needs to be 8 aligned.
+ * Can be cropped to standard resolution by this function,
+ * otherwise it will crop out strange resolution according
+ * to the alignment rules.
+ */
+static int ov7251_get_selection(struct v4l2_subdev *sd,
+				struct v4l2_subdev_pad_config *cfg,
+				struct v4l2_subdev_selection *sel)
+{
+	struct ov7251 *ov7251 = to_ov7251(sd);
+
+	if (sel->target == V4L2_SEL_TGT_CROP_BOUNDS) {
+		sel->r.left = CROP_START(ov7251->cur_mode->width, DST_WIDTH);
+		sel->r.width = DST_WIDTH;
+		sel->r.top = CROP_START(ov7251->cur_mode->height, DST_HEIGHT);
+		sel->r.height = DST_HEIGHT;
+		return 0;
+	}
+	return -EINVAL;
+}
+
 static const struct dev_pm_ops ov7251_pm_ops = {
 	SET_RUNTIME_PM_OPS(ov7251_runtime_suspend,
 			   ov7251_runtime_resume, NULL)
@@ -879,6 +1132,7 @@ static const struct v4l2_subdev_pad_ops ov7251_pad_ops = {
 	.enum_frame_interval = ov7251_enum_frame_interval,
 	.get_fmt = ov7251_get_fmt,
 	.set_fmt = ov7251_set_fmt,
+	.get_selection = ov7251_get_selection,
 };
 
 static const struct v4l2_subdev_ops ov7251_subdev_ops = {
@@ -1098,7 +1352,22 @@ static int ov7251_probe(struct i2c_client *client,
 		dev_err(dev, "Failed to get power regulators\n");
 		return ret;
 	}
-
+	ov7251->pinctrl = devm_pinctrl_get(dev);
+	if (!IS_ERR(ov7251->pinctrl)) {
+		ov7251->pins_default =
+			pinctrl_lookup_state(ov7251->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_DEFAULT);
+		if (IS_ERR(ov7251->pins_default))
+			dev_info(dev, "could not get default pinstate\n");
+
+		ov7251->pins_sleep =
+			pinctrl_lookup_state(ov7251->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_SLEEP);
+		if (IS_ERR(ov7251->pins_sleep))
+			dev_info(dev, "could not get sleep pinstate\n");
+	} else {
+		dev_info(dev, "no pinctrl\n");
+	}
 	mutex_init(&ov7251->mutex);
 
 	sd = &ov7251->subdev;

commit 5eb4e050725489c349cd7df5f3ddeae73cf11cf5
Author: Yiqing Zeng <zack.zeng@rock-chips.com>
Date:   Mon Aug 2 11:27:33 2021 +0800

    media: i2c: support os08a20 sensor driver
    
    Signed-off-by: Yiqing Zeng <zack.zeng@rock-chips.com>
    Change-Id: I54ad0fdf782832fe410e42063b569ba15aa40109

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index 1db5086e1add..dcd9c46e1159 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -884,6 +884,15 @@ config VIDEO_OS08A10
 	  This is a Video4Linux2 sensor driver for the OmniVision
 	  OS08A10 camera.
 
+config VIDEO_OS08A20
+	tristate "OmniVision OS08A20 sensor support"
+	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
+	depends on MEDIA_CAMERA_SUPPORT
+	select V4L2_FWNODE
+	help
+	  This is a Video4Linux2 sensor driver for the OmniVision
+	  OS08A20 camera.
+
 config VIDEO_OV02B10
 	tristate "OmniVision OV02B10 sensor support"
 	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index 8c231b5df6b2..2f88762febaa 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -81,6 +81,7 @@ obj-$(CONFIG_VIDEO_OS04A10) += os04a10.o
 obj-$(CONFIG_VIDEO_OS04C10) += os04c10.o
 obj-$(CONFIG_VIDEO_OS05A20) += os05a20.o
 obj-$(CONFIG_VIDEO_OS08A10) += os08a10.o
+obj-$(CONFIG_VIDEO_OS08A20) += os08a20.o
 obj-$(CONFIG_VIDEO_OV02B10) += ov02b10.o
 obj-$(CONFIG_VIDEO_OV02K10) += ov02k10.o
 obj-$(CONFIG_VIDEO_OV2640) += ov2640.o
diff --git a/drivers/media/i2c/os08a20.c b/drivers/media/i2c/os08a20.c
new file mode 100644
index 000000000000..fd49d420cb21
--- /dev/null
+++ b/drivers/media/i2c/os08a20.c
@@ -0,0 +1,1609 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * os08a20 driver
+ *
+ * Copyright (C) 2021 Rockchip Electronics Co., Ltd.
+ *
+ * V0.0X01.0X00 init version.
+ */
+
+#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/of.h>
+#include <linux/of_graph.h>
+#include <linux/regulator/consumer.h>
+#include <linux/sysfs.h>
+#include <linux/pinctrl/consumer.h>
+#include <linux/version.h>
+#include <media/v4l2-async.h>
+#include <media/media-entity.h>
+#include <media/v4l2-common.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-event.h>
+#include <media/v4l2-fwnode.h>
+#include <media/v4l2-image-sizes.h>
+#include <media/v4l2-mediabus.h>
+#include <media/v4l2-subdev.h>
+
+#include <linux/rk-camera-module.h>
+
+/* verify default register values */
+//#define CHECK_REG_VALUE
+
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x00)
+
+#ifndef V4L2_CID_DIGITAL_GAIN
+#define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
+#endif
+
+/* pixel rate = link frequency * 2 * lanes / BITS_PER_SAMPLE */
+#define MIPI_FREQ	360000000U
+#define OS08A20_PIXEL_RATE		(MIPI_FREQ * 2LL * 4LL / 10)
+#define OS08A20_XVCLK_FREQ		24000000
+
+#define CHIP_ID				0x530841
+#define OS08A20_REG_CHIP_ID		0x300a
+
+#define OS08A20_REG_CTRL_MODE		0x0100
+#define OS08A20_MODE_SW_STANDBY		0x00
+#define OS08A20_MODE_STREAMING		0x01
+
+#define OS08A20_REG_EXPOSURE		0x3501
+#define	OS08A20_EXPOSURE_MIN		4
+#define	OS08A20_EXPOSURE_STEP		1
+#define OS08A20_VTS_MAX			0x7fff
+
+#define OS08A20_REG_GAIN_H		0x3508
+#define OS08A20_REG_GAIN_L		0x3509
+#define OS08A20_GAIN_L_MASK		0xff
+#define OS08A20_GAIN_H_MASK		0x3f
+#define OS08A20_GAIN_H_SHIFT	8
+#define	ANALOG_GAIN_MIN			0x80
+#define	ANALOG_GAIN_MAX			0x7C0
+#define	ANALOG_GAIN_STEP		1
+#define	ANALOG_GAIN_DEFAULT		1024
+
+#define OS08A20_REG_GROUP	0x3208
+#define OS08A20_REG_FLIP	0x3820
+#define OS08A20_REG_MIRROR	0x3821
+#define MIRROR_BIT_MASK			BIT(2)
+#define FLIP_BIT_MASK			BIT(2)
+
+#define OS08A20_REG_TEST_PATTERN		0x5081
+#define	OS08A20_TEST_PATTERN_ENABLE	0x08
+#define	OS08A20_TEST_PATTERN_DISABLE	0x0
+
+#define OS08A20_REG_VTS			0x380e
+
+#define REG_NULL			0xFFFF
+#define DELAY_MS			0xEEEE	/* Array delay token */
+
+#define OS08A20_REG_VALUE_08BIT		1
+#define OS08A20_REG_VALUE_16BIT		2
+#define OS08A20_REG_VALUE_24BIT		3
+
+#define OS08A20_LANES			4
+#define OS08A20_BITS_PER_SAMPLE		10
+
+#define OF_CAMERA_PINCTRL_STATE_DEFAULT	"rockchip,camera_default"
+#define OF_CAMERA_PINCTRL_STATE_SLEEP	"rockchip,camera_sleep"
+
+#define OS08A20_NAME			"os08a20"
+#define OS08A20_MEDIA_BUS_FMT		MEDIA_BUS_FMT_SBGGR10_1X10
+
+struct os08a20_otp_info {
+	int flag; // bit[7]: info, bit[6]:wb
+	int module_id;
+	int lens_id;
+	int year;
+	int month;
+	int day;
+	int rg_ratio;
+	int bg_ratio;
+};
+
+static const char * const os08a20_supply_names[] = {
+	"avdd",		/* Analog power */
+	"dovdd",	/* Digital I/O power */
+	"dvdd",		/* Digital core power */
+};
+
+#define OS08A20_NUM_SUPPLIES ARRAY_SIZE(os08a20_supply_names)
+
+struct regval {
+	u16 addr;
+	u8 val;
+};
+
+struct os08a20_mode {
+	u32 width;
+	u32 height;
+	struct v4l2_fract max_fps;
+	u32 hts_def;
+	u32 vts_def;
+	u32 exp_def;
+	const struct regval *reg_list;
+	u8 hdr_mode;
+};
+
+struct os08a20 {
+	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[OS08A20_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	*test_pattern;
+	struct mutex		mutex;
+	bool			streaming;
+	bool			power_on;
+	const struct os08a20_mode *cur_mode;
+	unsigned int lane_num;
+	unsigned int cfg_num;
+	unsigned int pixel_rate;
+	u32			module_index;
+	struct os08a20_otp_info *otp;
+	const char		*module_facing;
+	const char		*module_name;
+	const char		*len_name;
+	struct rkmodule_awb_cfg	awb_cfg;
+};
+
+#define to_os08a20(sd) container_of(sd, struct os08a20, subdev)
+
+struct os08a20_id_name {
+	int id;
+	char name[RKMODULE_NAME_LEN];
+};
+
+/*
+ * Xclk 24Mhz
+ * grabwindow_width 3840
+ * grabwindow_height 2160
+ * max_framerate 30fps
+ * mipi_datarate per lane 960Mbps
+ */
+static const struct regval os08a20_global_regs[] = {
+	{0x0100, 0x00},
+	{0x0103, 0x01},
+	{0x0303, 0x01},
+	{0x0305, 0x5a},
+	{0x0306, 0x00},
+	{0x0308, 0x03},
+	{0x0309, 0x04},
+	{0x032a, 0x00},
+	{0x300f, 0x11},
+	{0x3010, 0x01},
+	{0x3011, 0x04},
+	{0x3012, 0x41},
+	{0x3016, 0xf0},
+	{0x301e, 0x98},
+	{0x3031, 0xa9},
+	{0x3103, 0x92},
+	{0x3104, 0x01},
+	{0x3106, 0x10},
+	{0x340c, 0xff},
+	{0x340d, 0xff},
+	{0x031e, 0x09},
+	{0x3505, 0x83},
+	{0x3508, 0x00},
+	{0x3509, 0x80},
+	{0x350a, 0x04},
+	{0x350b, 0x00},
+	{0x350c, 0x00},
+	{0x350d, 0x80},
+	{0x350e, 0x04},
+	{0x350f, 0x00},
+	{0x3600, 0x00},
+	{0x3603, 0x2c},
+	{0x3605, 0x50},
+	{0x3609, 0xb5},
+	{0x3610, 0x39},
+	{0x3762, 0x11},
+	{0x360c, 0x01},
+	{0x3628, 0xa4},
+	{0x362d, 0x10},
+	{0x3660, 0x43},
+	{0x3661, 0x06},
+	{0x3662, 0x00},
+	{0x3663, 0x28},
+	{0x3664, 0x0d},
+	{0x366a, 0x38},
+	{0x366b, 0xa0},
+	{0x366d, 0x00},
+	{0x366e, 0x00},
+	{0x3680, 0x00},
+	{0x36c0, 0x00},
+	{0x3701, 0x02},
+	{0x373b, 0x02},
+	{0x373c, 0x02},
+	{0x3736, 0x02},
+	{0x3737, 0x02},
+	{0x3705, 0x00},
+	{0x3706, 0x39},
+	{0x370a, 0x00},
+	{0x370b, 0x98},
+	{0x3709, 0x49},
+	{0x3714, 0x21},
+	{0x371c, 0x00},
+	{0x371d, 0x08},
+	{0x3740, 0x1b},
+	{0x3741, 0x04},
+	{0x375e, 0x0b},
+	{0x3760, 0x10},
+	{0x3776, 0x10},
+	{0x3781, 0x02},
+	{0x3782, 0x04},
+	{0x3783, 0x02},
+	{0x3784, 0x08},
+	{0x3785, 0x08},
+	{0x3788, 0x01},
+	{0x3789, 0x01},
+	{0x3797, 0x04},
+	{0x3800, 0x00},
+	{0x3801, 0x00},
+	{0x3802, 0x00},
+	{0x3803, 0x0c},
+	{0x3804, 0x0e},
+	{0x3805, 0xff},
+	{0x3806, 0x08},
+	{0x3807, 0x6f},
+	{0x3808, 0x0f},
+	{0x3809, 0x00},
+	{0x380a, 0x08},
+	{0x380b, 0x70},
+	{0x380c, 0x04},
+	{0x380d, 0x0c},
+	{0x380e, 0x09},
+	{0x380f, 0x0a},
+	{0x3813, 0x10},
+	{0x3814, 0x01},
+	{0x3815, 0x01},
+	{0x3816, 0x01},
+	{0x3817, 0x01},
+	{0x381c, 0x00},
+	{0x3820, 0x00},
+	{0x3821, 0x04},
+	{0x3823, 0x08},
+	{0x3826, 0x00},
+	{0x3827, 0x08},
+	{0x382d, 0x08},
+	{0x3832, 0x02},
+	{0x3833, 0x00},
+	{0x383c, 0x48},
+	{0x383d, 0xff},
+	{0x3d85, 0x0b},
+	{0x3d84, 0x40},
+	{0x3d8c, 0x63},
+	{0x3d8d, 0xd7},
+	{0x4000, 0xf8},
+	{0x4001, 0x2b},
+	{0x4004, 0x00},
+	{0x4005, 0x40},
+	{0x400a, 0x01},
+	{0x400f, 0xa0},
+	{0x4010, 0x12},
+	{0x4018, 0x00},
+	{0x4008, 0x02},
+	{0x4009, 0x0d},
+	{0x401a, 0x58},
+	{0x4050, 0x00},
+	{0x4051, 0x01},
+	{0x4028, 0x2f},
+	{0x4052, 0x00},
+	{0x4053, 0x80},
+	{0x4054, 0x00},
+	{0x4055, 0x80},
+	{0x4056, 0x00},
+	{0x4057, 0x80},
+	{0x4058, 0x00},
+	{0x4059, 0x80},
+	{0x430b, 0xff},
+	{0x430c, 0xff},
+	{0x430d, 0x00},
+	{0x430e, 0x00},
+	{0x4501, 0x18},
+	{0x4502, 0x00},
+	{0x4643, 0x00},
+	{0x4640, 0x01},
+	{0x4641, 0x04},
+	{0x4800, 0x64},
+	{0x4809, 0x2b},
+	{0x4813, 0x90},
+	{0x4817, 0x04},
+	{0x4833, 0x18},
+	{0x483b, 0x00},
+	{0x484b, 0x03},
+	{0x4850, 0x7c},
+	{0x4852, 0x06},
+	{0x4856, 0x58},
+	{0x4857, 0xaa},
+	{0x4862, 0x0a},
+	{0x4869, 0x18},
+	{0x486a, 0xaa},
+	{0x486e, 0x03},
+	{0x486f, 0x55},
+	{0x4875, 0xf0},
+	{0x5000, 0x89},
+	{0x5001, 0x42},
+	{0x5004, 0x40},
+	{0x5005, 0x00},
+	{0x5180, 0x00},
+	{0x5181, 0x10},
+	{0x580b, 0x03},
+	{0x4d00, 0x03},
+	{0x4d01, 0xc9},
+	{0x4d02, 0xbc},
+	{0x4d03, 0xc6},
+	{0x4d04, 0x4a},
+	{0x4d05, 0x25},
+	{REG_NULL, 0x00},
+};
+
+/*
+ * Xclk 24Mhz
+ * Pclk 210Mhz
+ * linelength 2200(0x898)
+ * framelength 2250(0x7f6)
+ * grabwindow_width 3840
+ * grabwindow_height 2160
+ * max_framerate 30fps
+ * mipi_datarate per lane 960Mbps
+ */
+static const struct regval os08a20_3840x2160_regs_4lane[] = {
+	// Sysclk 148Mhz, MIPI4_960Mbps/Lane, 30Fps.
+	//Line_length =2200, Frame_length =2250
+	{0x4700, 0x2b},
+	{0x4e00, 0x2b},
+	{0x0305, 0x3c},
+	{0x0323, 0x07},
+	{0x0324, 0x01},
+	{0x0325, 0x29},
+	{0x380c, 0x08},
+	{0x380d, 0x98},
+	{0x380e, 0x08},
+	{0x380f, 0xca},
+	{0x3501, 0x06},
+	{0x3502, 0xca},
+	{0x4837, 0x10},
+	{REG_NULL, 0x00},
+};
+
+
+static const struct os08a20_mode supported_modes_4lane[] = {
+	{
+		.width = 3840,
+		.height = 2160,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x08b0,
+		.hts_def = 0x898 * 2,
+		.vts_def = 0x08c6,
+		.reg_list = os08a20_3840x2160_regs_4lane,
+		.hdr_mode = NO_HDR,
+	},
+};
+
+static const struct os08a20_mode *supported_modes;
+
+static const s64 link_freq_menu_items[] = {
+	MIPI_FREQ
+};
+
+static const char * const os08a20_test_pattern_menu[] = {
+	"Disabled",
+	"Vertical Color Bar Type 1",
+	"Vertical Color Bar Type 2",
+	"Vertical Color Bar Type 3",
+	"Vertical Color Bar Type 4",
+	"Square_BW Color Bar Type 1",
+	"Square_BW Color Bar Type 2",
+	"Square_BW Color Bar Type 3",
+	"Square_BW Color Bar Type 4",
+	"Transparent Color Bar Type 1",
+	"Transparent Color Bar Type 2",
+	"Transparent Color Bar Type 3",
+	"Transparent Color Bar Type 4",
+	"Rolling Color Bar Type 1",
+	"Rolling Color Bar Type 2",
+	"Rolling Color Bar Type 3",
+	"Rolling Color Bar Type 4",
+};
+
+/* Write registers up to 4 at a time */
+static int os08a20_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, "%s(%d) enter!\n", __func__, __LINE__);
+	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) {
+		dev_err(&client->dev,
+			   "write reg(0x%x val:0x%x)failed !\n", reg, val);
+		return -EIO;
+	}
+	return 0;
+}
+
+static int os08a20_write_array(struct i2c_client *client,
+			      const struct regval *regs)
+{
+	int i, delay_ms, ret = 0;
+
+	for (i = 0; ret == 0 && regs[i].addr != REG_NULL; i++) {
+		if (regs[i].addr == DELAY_MS) {
+			delay_ms = regs[i].val;
+			dev_info(&client->dev, "delay(%d) ms !\n", delay_ms);
+			usleep_range(1000 * delay_ms, 1000 * delay_ms + 100);
+			continue;
+		}
+		ret = os08a20_write_reg(client, regs[i].addr,
+				       OS08A20_REG_VALUE_08BIT, regs[i].val);
+		if (ret)
+			dev_err(&client->dev, "%s failed !\n", __func__);
+	}
+	return ret;
+}
+
+/* Read registers up to 4 at a time */
+static int os08a20_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 *)&reg_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;
+}
+
+/* Check Register value */
+#ifdef CHECK_REG_VALUE
+static int os08a20_reg_verify(struct i2c_client *client,
+				const struct regval *regs)
+{
+	u32 i;
+	int ret = 0;
+	u32 value;
+
+	for (i = 0; ret == 0 && regs[i].addr != REG_NULL; i++) {
+		ret = os08a20_read_reg(client, regs[i].addr,
+			  OS08A20_REG_VALUE_08BIT, &value);
+		if (value != regs[i].val) {
+			dev_info(&client->dev, "%s: 0x%04x is 0x%x instead of 0x%x\n",
+				  __func__, regs[i].addr, value, regs[i].val);
+		}
+	}
+	return ret;
+}
+#endif
+
+static int os08a20_get_reso_dist(const struct os08a20_mode *mode,
+				struct v4l2_mbus_framefmt *framefmt)
+{
+	return abs(mode->width - framefmt->width) +
+	       abs(mode->height - framefmt->height);
+}
+
+static const struct os08a20_mode *
+os08a20_find_best_fit(struct os08a20 *os08a20,
+			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 < os08a20->cfg_num; i++) {
+		dist = os08a20_get_reso_dist(&supported_modes[i], framefmt);
+		if (cur_best_fit_dist == -1 || dist < cur_best_fit_dist) {
+			cur_best_fit_dist = dist;
+			cur_best_fit = i;
+		}
+	}
+
+	return &supported_modes[cur_best_fit];
+}
+
+static int os08a20_set_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct os08a20 *os08a20 = to_os08a20(sd);
+	const struct os08a20_mode *mode;
+	s64 h_blank, vblank_def;
+
+	mutex_lock(&os08a20->mutex);
+
+	mode = os08a20_find_best_fit(os08a20, fmt);
+	fmt->format.code = OS08A20_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(&os08a20->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		os08a20->cur_mode = mode;
+		h_blank = mode->hts_def - mode->width;
+		__v4l2_ctrl_modify_range(os08a20->hblank, h_blank,
+					 h_blank, 1, h_blank);
+		vblank_def = mode->vts_def - mode->height;
+		__v4l2_ctrl_modify_range(os08a20->vblank, vblank_def,
+					 OS08A20_VTS_MAX - mode->height,
+					 1, vblank_def);
+	}
+
+	mutex_unlock(&os08a20->mutex);
+
+	return 0;
+}
+
+static int os08a20_get_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct os08a20 *os08a20 = to_os08a20(sd);
+	const struct os08a20_mode *mode = os08a20->cur_mode;
+
+	mutex_lock(&os08a20->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(&os08a20->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		fmt->format.width = mode->width;
+		fmt->format.height = mode->height;
+		fmt->format.code = OS08A20_MEDIA_BUS_FMT;
+		fmt->format.field = V4L2_FIELD_NONE;
+	}
+	mutex_unlock(&os08a20->mutex);
+
+	return 0;
+}
+
+static int os08a20_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 = OS08A20_MEDIA_BUS_FMT;
+
+	return 0;
+}
+
+static int os08a20_enum_frame_sizes(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_pad_config *cfg,
+				   struct v4l2_subdev_frame_size_enum *fse)
+{
+	struct os08a20 *os08a20 = to_os08a20(sd);
+
+	if (fse->index >= os08a20->cfg_num)
+		return -EINVAL;
+
+	if (fse->code != OS08A20_MEDIA_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;
+
+	return 0;
+}
+
+static int os08a20_enable_test_pattern(struct os08a20 *os08a20, u32 pattern)
+{
+	u32 val;
+
+	if (pattern)
+		val = (pattern - 1) | OS08A20_TEST_PATTERN_ENABLE;
+	else
+		val = OS08A20_TEST_PATTERN_DISABLE;
+
+	/* test pattern select*/
+	return os08a20_write_reg(os08a20->client, OS08A20_REG_TEST_PATTERN,
+				OS08A20_REG_VALUE_08BIT, val);
+}
+
+static int os08a20_g_frame_interval(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_frame_interval *fi)
+{
+	struct os08a20 *os08a20 = to_os08a20(sd);
+	const struct os08a20_mode *mode = os08a20->cur_mode;
+
+	mutex_lock(&os08a20->mutex);
+	fi->interval = mode->max_fps;
+	mutex_unlock(&os08a20->mutex);
+
+	return 0;
+}
+
+static void os08a20_get_module_inf(struct os08a20 *os08a20,
+				  struct rkmodule_inf *inf)
+{
+	memset(inf, 0, sizeof(*inf));
+	strscpy(inf->base.sensor, OS08A20_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, os08a20->module_name,
+		sizeof(inf->base.module));
+	strscpy(inf->base.lens, os08a20->len_name, sizeof(inf->base.lens));
+}
+
+static void os08a20_set_awb_cfg(struct os08a20 *os08a20,
+				 struct rkmodule_awb_cfg *cfg)
+{
+	mutex_lock(&os08a20->mutex);
+	memcpy(&os08a20->awb_cfg, cfg, sizeof(*cfg));
+	mutex_unlock(&os08a20->mutex);
+}
+
+static long os08a20_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	struct os08a20 *os08a20 = to_os08a20(sd);
+	struct rkmodule_hdr_cfg *hdr;
+	long ret = 0;
+	u32 stream = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		os08a20_get_module_inf(os08a20, (struct rkmodule_inf *)arg);
+		break;
+	case RKMODULE_GET_HDR_CFG:
+		hdr = (struct rkmodule_hdr_cfg *)arg;
+		hdr->esp.mode = HDR_NORMAL_VC;
+		hdr->hdr_mode = os08a20->cur_mode->hdr_mode;
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr = (struct rkmodule_hdr_cfg *)arg;
+		if (hdr->hdr_mode != 0)
+			ret = -1;
+		break;
+	case RKMODULE_AWB_CFG:
+		os08a20_set_awb_cfg(os08a20, (struct rkmodule_awb_cfg *)arg);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+
+		stream = *((u32 *)arg);
+
+		if (stream)
+			ret = os08a20_write_reg(os08a20->client, OS08A20_REG_CTRL_MODE,
+				OS08A20_REG_VALUE_08BIT, OS08A20_MODE_STREAMING);
+		else
+			ret = os08a20_write_reg(os08a20->client, OS08A20_REG_CTRL_MODE,
+				OS08A20_REG_VALUE_08BIT, OS08A20_MODE_SW_STANDBY);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+
+#ifdef CONFIG_COMPAT
+static long os08a20_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 *awb_cfg;
+	struct rkmodule_hdr_cfg *hdr;
+	long ret;
+	u32 stream = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		inf = kzalloc(sizeof(*inf), GFP_KERNEL);
+		if (!inf) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = os08a20_ioctl(sd, cmd, inf);
+		if (!ret) {
+			ret = copy_to_user(up, inf, sizeof(*inf));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(inf);
+		break;
+	case RKMODULE_GET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = os08a20_ioctl(sd, cmd, hdr);
+		if (!ret) {
+			ret = copy_to_user(up, hdr, sizeof(*hdr));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(hdr);
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		if (copy_from_user(hdr, up, sizeof(*hdr))) {
+			kfree(hdr);
+			return -EFAULT;
+		}
+
+		ret = os08a20_ioctl(sd, cmd, hdr);
+		kfree(hdr);
+		break;
+	case RKMODULE_AWB_CFG:
+		awb_cfg = kzalloc(sizeof(*awb_cfg), GFP_KERNEL);
+		if (!awb_cfg) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		if (copy_from_user(awb_cfg, up, sizeof(*awb_cfg))) {
+			kfree(awb_cfg);
+			return -EFAULT;
+		}
+
+		ret = os08a20_ioctl(sd, cmd, awb_cfg);
+		kfree(awb_cfg);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		if (copy_from_user(&stream, up, sizeof(u32)))
+			return -EFAULT;
+
+		ret = os08a20_ioctl(sd, cmd, &stream);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+#endif
+
+static int __os08a20_start_stream(struct os08a20 *os08a20)
+{
+	int ret;
+
+	ret = os08a20_write_array(os08a20->client, os08a20->cur_mode->reg_list);
+	if (ret)
+		return ret;
+
+#ifdef CHECK_REG_VALUE
+	usleep_range(10000, 20000);
+	/*  verify default values to make sure everything has */
+	/*  been written correctly as expected */
+	dev_info(&os08a20->client->dev, "%s:Check register value!\n",
+				__func__);
+	ret = os08a20_reg_verify(os08a20->client, os08a20_global_regs);
+	if (ret)
+		return ret;
+
+	ret = os08a20_reg_verify(os08a20->client, os08a20->cur_mode->reg_list);
+	if (ret)
+		return ret;
+#endif
+
+	/* In case these controls are set before streaming */
+	mutex_unlock(&os08a20->mutex);
+	ret = v4l2_ctrl_handler_setup(&os08a20->ctrl_handler);
+	mutex_lock(&os08a20->mutex);
+	if (ret)
+		return ret;
+
+	ret = os08a20_write_reg(os08a20->client, OS08A20_REG_CTRL_MODE,
+				OS08A20_REG_VALUE_08BIT, OS08A20_MODE_STREAMING);
+	return ret;
+}
+
+static int __os08a20_stop_stream(struct os08a20 *os08a20)
+{
+	return os08a20_write_reg(os08a20->client, OS08A20_REG_CTRL_MODE,
+				OS08A20_REG_VALUE_08BIT, OS08A20_MODE_SW_STANDBY);
+}
+
+static int os08a20_s_stream(struct v4l2_subdev *sd, int on)
+{
+	struct os08a20 *os08a20 = to_os08a20(sd);
+	struct i2c_client *client = os08a20->client;
+	int ret = 0;
+
+	dev_info(&client->dev, "%s: on: %d, %dx%d@%d\n", __func__, on,
+				os08a20->cur_mode->width,
+				os08a20->cur_mode->height,
+		DIV_ROUND_CLOSEST(os08a20->cur_mode->max_fps.denominator,
+		os08a20->cur_mode->max_fps.numerator));
+
+	mutex_lock(&os08a20->mutex);
+	on = !!on;
+	if (on == os08a20->streaming)
+		goto unlock_and_return;
+
+	if (on) {
+		dev_info(&client->dev, "stream on!!!\n");
+		ret = pm_runtime_get_sync(&client->dev);
+		if (ret < 0) {
+			pm_runtime_put_noidle(&client->dev);
+			goto unlock_and_return;
+		}
+
+		ret = __os08a20_start_stream(os08a20);
+		if (ret) {
+			v4l2_err(sd, "start stream failed while write regs\n");
+			pm_runtime_put(&client->dev);
+			goto unlock_and_return;
+		}
+	} else {
+		dev_info(&client->dev, "stream off!!!\n");
+		__os08a20_stop_stream(os08a20);
+		pm_runtime_put(&client->dev);
+	}
+
+	os08a20->streaming = on;
+
+unlock_and_return:
+	mutex_unlock(&os08a20->mutex);
+
+	return ret;
+}
+
+static int os08a20_s_power(struct v4l2_subdev *sd, int on)
+{
+	struct os08a20 *os08a20 = to_os08a20(sd);
+	struct i2c_client *client = os08a20->client;
+	int ret = 0;
+
+	dev_dbg(&client->dev, "%s(%d) on(%d)\n", __func__, __LINE__, on);
+
+	mutex_lock(&os08a20->mutex);
+
+	/* If the power state is not modified - no work to do. */
+	if (os08a20->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;
+		}
+
+		ret = os08a20_write_array(os08a20->client, os08a20_global_regs);
+		if (ret) {
+			v4l2_err(sd, "could not set init registers\n");
+			pm_runtime_put_noidle(&client->dev);
+			goto unlock_and_return;
+		}
+
+		os08a20->power_on = true;
+		/* export gpio */
+		if (!IS_ERR(os08a20->reset_gpio))
+			gpiod_export(os08a20->reset_gpio, false);
+		if (!IS_ERR(os08a20->pwdn_gpio))
+			gpiod_export(os08a20->pwdn_gpio, false);
+	} else {
+		pm_runtime_put(&client->dev);
+		os08a20->power_on = false;
+	}
+
+unlock_and_return:
+	mutex_unlock(&os08a20->mutex);
+
+	return ret;
+}
+
+/* Calculate the delay in us by clock rate and clock cycles */
+static inline u32 os08a20_cal_delay(u32 cycles)
+{
+	return DIV_ROUND_UP(cycles, OS08A20_XVCLK_FREQ / 1000 / 1000);
+}
+
+static int __os08a20_power_on(struct os08a20 *os08a20)
+{
+	int ret;
+	u32 delay_us;
+	struct device *dev = &os08a20->client->dev;
+
+	if (!IS_ERR(os08a20->power_gpio))
+		gpiod_set_value_cansleep(os08a20->power_gpio, 1);
+
+	usleep_range(1000, 2000);
+
+	if (!IS_ERR_OR_NULL(os08a20->pins_default)) {
+		ret = pinctrl_select_state(os08a20->pinctrl,
+					   os08a20->pins_default);
+		if (ret < 0)
+			dev_err(dev, "could not set pins\n");
+	}
+	ret = clk_set_rate(os08a20->xvclk, OS08A20_XVCLK_FREQ);
+	if (ret < 0)
+		dev_warn(dev, "Failed to set xvclk rate (24MHz)\n");
+	if (clk_get_rate(os08a20->xvclk) != OS08A20_XVCLK_FREQ)
+		dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n");
+	ret = clk_prepare_enable(os08a20->xvclk);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable xvclk\n");
+		return ret;
+	}
+
+	ret = regulator_bulk_enable(OS08A20_NUM_SUPPLIES, os08a20->supplies);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable regulators\n");
+		goto disable_clk;
+	}
+
+	if (!IS_ERR(os08a20->reset_gpio))
+		gpiod_set_value_cansleep(os08a20->reset_gpio, 1);
+
+	if (!IS_ERR(os08a20->pwdn_gpio))
+		gpiod_set_value_cansleep(os08a20->pwdn_gpio, 1);
+
+	/* export gpio */
+	if (!IS_ERR(os08a20->reset_gpio))
+		gpiod_export(os08a20->reset_gpio, false);
+	if (!IS_ERR(os08a20->pwdn_gpio))
+		gpiod_export(os08a20->pwdn_gpio, false);
+
+	/* 8192 cycles prior to first SCCB transaction */
+	delay_us = os08a20_cal_delay(8192);
+	usleep_range(delay_us, delay_us * 2);
+	usleep_range(10000, 20000);
+	return 0;
+
+disable_clk:
+	clk_disable_unprepare(os08a20->xvclk);
+
+	return ret;
+}
+
+static void __os08a20_power_off(struct os08a20 *os08a20)
+{
+	int ret;
+	struct device *dev = &os08a20->client->dev;
+
+	if (!IS_ERR(os08a20->pwdn_gpio))
+		gpiod_set_value_cansleep(os08a20->pwdn_gpio, 0);
+	clk_disable_unprepare(os08a20->xvclk);
+	if (!IS_ERR(os08a20->reset_gpio))
+		gpiod_set_value_cansleep(os08a20->reset_gpio, 0);
+	if (!IS_ERR_OR_NULL(os08a20->pins_sleep)) {
+		ret = pinctrl_select_state(os08a20->pinctrl,
+					   os08a20->pins_sleep);
+		if (ret < 0)
+			dev_dbg(dev, "could not set pins\n");
+	}
+	if (!IS_ERR(os08a20->power_gpio))
+		gpiod_set_value_cansleep(os08a20->power_gpio, 0);
+
+	regulator_bulk_disable(OS08A20_NUM_SUPPLIES, os08a20->supplies);
+}
+
+static int os08a20_runtime_resume(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct os08a20 *os08a20 = to_os08a20(sd);
+
+	return __os08a20_power_on(os08a20);
+}
+
+static int os08a20_runtime_suspend(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct os08a20 *os08a20 = to_os08a20(sd);
+
+	__os08a20_power_off(os08a20);
+
+	return 0;
+}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static int os08a20_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
+{
+	struct os08a20 *os08a20 = to_os08a20(sd);
+	struct v4l2_mbus_framefmt *try_fmt =
+				v4l2_subdev_get_try_format(sd, fh->pad, 0);
+	const struct os08a20_mode *def_mode = &supported_modes[0];
+
+	mutex_lock(&os08a20->mutex);
+	/* Initialize try_fmt */
+	try_fmt->width = def_mode->width;
+	try_fmt->height = def_mode->height;
+	try_fmt->code = OS08A20_MEDIA_BUS_FMT;
+	try_fmt->field = V4L2_FIELD_NONE;
+
+	mutex_unlock(&os08a20->mutex);
+	/* No crop or compose */
+
+	return 0;
+}
+#endif
+
+static int os08a20_enum_frame_interval(struct v4l2_subdev *sd,
+				       struct v4l2_subdev_pad_config *cfg,
+				       struct v4l2_subdev_frame_interval_enum *fie)
+{
+	struct os08a20 *os08a20 = to_os08a20(sd);
+
+	if (fie->index >= os08a20->cfg_num)
+		return -EINVAL;
+
+	if (fie->code != OS08A20_MEDIA_BUS_FMT)
+		return -EINVAL;
+
+	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;
+	return 0;
+}
+
+static int os08a20_g_mbus_config(struct v4l2_subdev *sd,
+				struct v4l2_mbus_config *config)
+{
+	u32 val = 0;
+
+	val = 1 << (OS08A20_LANES - 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 os08a20_pm_ops = {
+	SET_RUNTIME_PM_OPS(os08a20_runtime_suspend,
+			   os08a20_runtime_resume, NULL)
+};
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static const struct v4l2_subdev_internal_ops os08a20_internal_ops = {
+	.open = os08a20_open,
+};
+#endif
+
+static const struct v4l2_subdev_core_ops os08a20_core_ops = {
+	.s_power = os08a20_s_power,
+	.ioctl = os08a20_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = os08a20_compat_ioctl32,
+#endif
+};
+
+static const struct v4l2_subdev_video_ops os08a20_video_ops = {
+	.s_stream = os08a20_s_stream,
+	.g_frame_interval = os08a20_g_frame_interval,
+	.g_mbus_config = os08a20_g_mbus_config,
+};
+
+static const struct v4l2_subdev_pad_ops os08a20_pad_ops = {
+	.enum_mbus_code = os08a20_enum_mbus_code,
+	.enum_frame_size = os08a20_enum_frame_sizes,
+	.enum_frame_interval = os08a20_enum_frame_interval,
+	.get_fmt = os08a20_get_fmt,
+	.set_fmt = os08a20_set_fmt,
+};
+
+static const struct v4l2_subdev_ops os08a20_subdev_ops = {
+	.core	= &os08a20_core_ops,
+	.video	= &os08a20_video_ops,
+	.pad	= &os08a20_pad_ops,
+};
+
+static int os08a20_set_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct os08a20 *os08a20 = container_of(ctrl->handler,
+					       struct os08a20, ctrl_handler);
+	struct i2c_client *client = os08a20->client;
+	s64 max;
+	u32 val = 0;
+	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 = os08a20->cur_mode->height + ctrl->val - 4;
+		__v4l2_ctrl_modify_range(os08a20->exposure,
+					 os08a20->exposure->minimum, max,
+					 os08a20->exposure->step,
+					 os08a20->exposure->default_value);
+		break;
+	}
+
+	if (!pm_runtime_get_if_in_use(&client->dev))
+		return 0;
+
+	switch (ctrl->id) {
+	case V4L2_CID_EXPOSURE:
+		ret = os08a20_write_reg(os08a20->client, OS08A20_REG_EXPOSURE,
+					OS08A20_REG_VALUE_16BIT, ctrl->val);
+		break;
+	case V4L2_CID_ANALOGUE_GAIN:
+		ret = os08a20_write_reg(os08a20->client, OS08A20_REG_GAIN_L,
+					OS08A20_REG_VALUE_08BIT,
+					ctrl->val & OS08A20_GAIN_L_MASK);
+		ret |= os08a20_write_reg(os08a20->client, OS08A20_REG_GAIN_H,
+					 OS08A20_REG_VALUE_08BIT,
+					 (ctrl->val >> OS08A20_GAIN_H_SHIFT) &
+					 OS08A20_GAIN_H_MASK);
+		break;
+	case V4L2_CID_VBLANK:
+		ret = os08a20_write_reg(os08a20->client, OS08A20_REG_VTS,
+					OS08A20_REG_VALUE_16BIT,
+					ctrl->val + os08a20->cur_mode->height);
+		break;
+	case V4L2_CID_TEST_PATTERN:
+		ret = os08a20_enable_test_pattern(os08a20, ctrl->val);
+		break;
+	case V4L2_CID_HFLIP:
+		ret = os08a20_read_reg(os08a20->client, OS08A20_REG_MIRROR,
+				       OS08A20_REG_VALUE_08BIT,
+				       &val);
+		if (ctrl->val)
+			val |= MIRROR_BIT_MASK;
+		else
+			val &= ~MIRROR_BIT_MASK;
+		ret |= os08a20_write_reg(os08a20->client, OS08A20_REG_MIRROR,
+					OS08A20_REG_VALUE_08BIT,
+					val);
+		break;
+	case V4L2_CID_VFLIP:
+		ret = os08a20_read_reg(os08a20->client, OS08A20_REG_FLIP,
+				       OS08A20_REG_VALUE_08BIT,
+				       &val);
+		if (ctrl->val)
+			val |= FLIP_BIT_MASK;
+		else
+			val &= ~FLIP_BIT_MASK;
+		ret |= os08a20_write_reg(os08a20->client, OS08A20_REG_FLIP,
+					OS08A20_REG_VALUE_08BIT,
+					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 os08a20_ctrl_ops = {
+	.s_ctrl = os08a20_set_ctrl,
+};
+
+static int os08a20_initialize_controls(struct os08a20 *os08a20)
+{
+	const struct os08a20_mode *mode;
+	struct v4l2_ctrl_handler *handler;
+	struct v4l2_ctrl *ctrl;
+	s64 exposure_max, vblank_def;
+	u32 h_blank;
+	int ret;
+
+	handler = &os08a20->ctrl_handler;
+	mode = os08a20->cur_mode;
+	ret = v4l2_ctrl_handler_init(handler, 9);
+	if (ret)
+		return ret;
+	handler->lock = &os08a20->mutex;
+
+	ctrl = v4l2_ctrl_new_int_menu(handler, NULL, V4L2_CID_LINK_FREQ,
+				      0, 0, link_freq_menu_items);
+	if (ctrl)
+		ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+
+	v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE,
+			  0, os08a20->pixel_rate, 1, os08a20->pixel_rate);
+
+	h_blank = mode->hts_def - mode->width;
+	os08a20->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
+					    h_blank, h_blank, 1, h_blank);
+	if (os08a20->hblank)
+		os08a20->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+
+	vblank_def = mode->vts_def - mode->height;
+	os08a20->vblank = v4l2_ctrl_new_std(handler, &os08a20_ctrl_ops,
+				V4L2_CID_VBLANK, vblank_def,
+				OS08A20_VTS_MAX - mode->height,
+				1, vblank_def);
+
+	exposure_max = mode->vts_def - 4;
+	os08a20->exposure = v4l2_ctrl_new_std(handler, &os08a20_ctrl_ops,
+				V4L2_CID_EXPOSURE, OS08A20_EXPOSURE_MIN,
+				exposure_max, OS08A20_EXPOSURE_STEP,
+				mode->exp_def);
+
+	os08a20->anal_gain = v4l2_ctrl_new_std(handler, &os08a20_ctrl_ops,
+				V4L2_CID_ANALOGUE_GAIN, ANALOG_GAIN_MIN,
+				ANALOG_GAIN_MAX, ANALOG_GAIN_STEP,
+				ANALOG_GAIN_DEFAULT);
+
+	os08a20->test_pattern = v4l2_ctrl_new_std_menu_items(handler,
+				&os08a20_ctrl_ops, V4L2_CID_TEST_PATTERN,
+				ARRAY_SIZE(os08a20_test_pattern_menu) - 1,
+				0, 0, os08a20_test_pattern_menu);
+
+	v4l2_ctrl_new_std(handler, &os08a20_ctrl_ops,
+				V4L2_CID_HFLIP, 0, 1, 1, 0);
+
+	v4l2_ctrl_new_std(handler, &os08a20_ctrl_ops,
+				V4L2_CID_VFLIP, 0, 1, 1, 0);
+
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(&os08a20->client->dev,
+			"Failed to init controls(%d)\n", ret);
+		goto err_free_handler;
+	}
+
+	os08a20->subdev.ctrl_handler = handler;
+
+	return 0;
+
+err_free_handler:
+	v4l2_ctrl_handler_free(handler);
+
+	return ret;
+}
+
+static int os08a20_check_sensor_id(struct os08a20 *os08a20,
+				  struct i2c_client *client)
+{
+	struct device *dev = &os08a20->client->dev;
+	u32 id = 0;
+	int ret;
+
+	ret = os08a20_read_reg(client, OS08A20_REG_CHIP_ID,
+			       OS08A20_REG_VALUE_24BIT, &id);
+	if (id != CHIP_ID) {
+		dev_err(dev, "Unexpected sensor id(%06x), ret(%d)\n", id, ret);
+		return -ENODEV;
+	}
+
+	dev_info(dev, "Detected OV%06x sensor\n", CHIP_ID);
+
+	return 0;
+}
+
+static int os08a20_configure_regulators(struct os08a20 *os08a20)
+{
+	unsigned int i;
+
+	for (i = 0; i < OS08A20_NUM_SUPPLIES; i++)
+		os08a20->supplies[i].supply = os08a20_supply_names[i];
+
+	return devm_regulator_bulk_get(&os08a20->client->dev,
+				       OS08A20_NUM_SUPPLIES,
+				       os08a20->supplies);
+}
+
+static int os08a20_parse_of(struct os08a20 *os08a20)
+{
+	struct device *dev = &os08a20->client->dev;
+	struct device_node *endpoint;
+	struct fwnode_handle *fwnode;
+	int rval;
+
+	endpoint = of_graph_get_next_endpoint(dev->of_node, NULL);
+	if (!endpoint) {
+		dev_err(dev, "Failed to get endpoint\n");
+		return -EINVAL;
+	}
+	fwnode = of_fwnode_handle(endpoint);
+	rval = fwnode_property_read_u32_array(fwnode, "data-lanes", NULL, 0);
+	if (rval <= 0) {
+		dev_warn(dev, " Get mipi lane num failed!\n");
+		return -1;
+	}
+
+	os08a20->lane_num = rval;
+	if (os08a20->lane_num == 4) {
+		os08a20->cur_mode = &supported_modes_4lane[0];
+		supported_modes = supported_modes_4lane;
+		os08a20->cfg_num = ARRAY_SIZE(supported_modes_4lane);
+
+		/* pixel rate = link frequency * 2 * lanes / BITS_PER_SAMPLE */
+		os08a20->pixel_rate = MIPI_FREQ * 2U * os08a20->lane_num / 8U;
+		dev_info(dev, "lane_num(%d)  pixel_rate(%u)\n",
+			 os08a20->lane_num, os08a20->pixel_rate);
+	} else {
+		dev_err(dev, "unsupported lane_num(%d)\n", os08a20->lane_num);
+		return -1;
+	}
+
+	return 0;
+}
+
+static int os08a20_probe(struct i2c_client *client,
+			const struct i2c_device_id *id)
+{
+	struct device *dev = &client->dev;
+	struct device_node *node = dev->of_node;
+	struct os08a20 *os08a20;
+	struct v4l2_subdev *sd;
+	char facing[2] = "b";
+	int ret;
+
+	dev_info(dev, "driver version: %02x.%02x.%02x",
+		DRIVER_VERSION >> 16,
+		(DRIVER_VERSION & 0xff00) >> 8,
+		DRIVER_VERSION & 0x00ff);
+
+	os08a20 = devm_kzalloc(dev, sizeof(*os08a20), GFP_KERNEL);
+	if (!os08a20)
+		return -ENOMEM;
+
+	ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
+				   &os08a20->module_index);
+	if (ret) {
+		dev_warn(dev, "could not get module index!\n");
+		os08a20->module_index = 0;
+	}
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
+				       &os08a20->module_facing);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME,
+				       &os08a20->module_name);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME,
+				       &os08a20->len_name);
+	if (ret) {
+		dev_err(dev, "could not get module information!\n");
+		return -EINVAL;
+	}
+
+	os08a20->client = client;
+
+	os08a20->xvclk = devm_clk_get(dev, "xvclk");
+	if (IS_ERR(os08a20->xvclk)) {
+		dev_err(dev, "Failed to get xvclk\n");
+		return -EINVAL;
+	}
+
+	os08a20->power_gpio = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW);
+	if (IS_ERR(os08a20->power_gpio))
+		dev_warn(dev, "Failed to get power-gpios, maybe no use\n");
+
+	os08a20->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+	if (IS_ERR(os08a20->reset_gpio))
+		dev_warn(dev, "Failed to get reset-gpios, maybe no use\n");
+
+	os08a20->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW);
+	if (IS_ERR(os08a20->pwdn_gpio))
+		dev_warn(dev, "Failed to get pwdn-gpios\n");
+
+	ret = os08a20_configure_regulators(os08a20);
+	if (ret) {
+		dev_err(dev, "Failed to get power regulators\n");
+		return ret;
+	}
+	ret = os08a20_parse_of(os08a20);
+	if (ret != 0)
+		return -EINVAL;
+
+	os08a20->pinctrl = devm_pinctrl_get(dev);
+	if (!IS_ERR(os08a20->pinctrl)) {
+		os08a20->pins_default =
+			pinctrl_lookup_state(os08a20->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_DEFAULT);
+		if (IS_ERR(os08a20->pins_default))
+			dev_err(dev, "could not get default pinstate\n");
+
+		os08a20->pins_sleep =
+			pinctrl_lookup_state(os08a20->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_SLEEP);
+		if (IS_ERR(os08a20->pins_sleep))
+			dev_err(dev, "could not get sleep pinstate\n");
+	}
+
+	mutex_init(&os08a20->mutex);
+
+	sd = &os08a20->subdev;
+	v4l2_i2c_subdev_init(sd, client, &os08a20_subdev_ops);
+	ret = os08a20_initialize_controls(os08a20);
+	if (ret)
+		goto err_destroy_mutex;
+
+	ret = __os08a20_power_on(os08a20);
+	if (ret)
+		goto err_free_handler;
+
+	ret = os08a20_check_sensor_id(os08a20, client);
+	if (ret < 0) {
+		dev_err(&client->dev, "%s(%d) Check id  failed,\n"
+			  "check following information:\n"
+			  "Power/PowerDown/Reset/Mclk/I2cBus !!\n",
+			  __func__, __LINE__);
+		goto err_power_off;
+	}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+	sd->internal_ops = &os08a20_internal_ops;
+	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
+		     V4L2_SUBDEV_FL_HAS_EVENTS;
+#endif
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	os08a20->pad.flags = MEDIA_PAD_FL_SOURCE;
+	sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
+	ret = media_entity_pads_init(&sd->entity, 1, &os08a20->pad);
+	if (ret < 0)
+		goto err_power_off;
+#endif
+
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(os08a20->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s",
+		 os08a20->module_index, facing,
+		 OS08A20_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:
+	__os08a20_power_off(os08a20);
+err_free_handler:
+	v4l2_ctrl_handler_free(&os08a20->ctrl_handler);
+err_destroy_mutex:
+	mutex_destroy(&os08a20->mutex);
+
+	return ret;
+}
+
+static int os08a20_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct os08a20 *os08a20 = to_os08a20(sd);
+
+	v4l2_async_unregister_subdev(sd);
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	media_entity_cleanup(&sd->entity);
+#endif
+	v4l2_ctrl_handler_free(&os08a20->ctrl_handler);
+	mutex_destroy(&os08a20->mutex);
+
+	pm_runtime_disable(&client->dev);
+	if (!pm_runtime_status_suspended(&client->dev))
+		__os08a20_power_off(os08a20);
+	pm_runtime_set_suspended(&client->dev);
+
+	return 0;
+}
+
+#if IS_ENABLED(CONFIG_OF)
+static const struct of_device_id os08a20_of_match[] = {
+	{ .compatible = "ovti,os08a20" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, os08a20_of_match);
+#endif
+
+static const struct i2c_device_id os08a20_match_id[] = {
+	{ "ovti,os08a20", 0 },
+	{ },
+};
+
+static struct i2c_driver os08a20_i2c_driver = {
+	.driver = {
+		.name = OS08A20_NAME,
+		.pm = &os08a20_pm_ops,
+		.of_match_table = of_match_ptr(os08a20_of_match),
+	},
+	.probe		= &os08a20_probe,
+	.remove		= &os08a20_remove,
+	.id_table	= os08a20_match_id,
+};
+
+static int __init sensor_mod_init(void)
+{
+	return i2c_add_driver(&os08a20_i2c_driver);
+}
+
+static void __exit sensor_mod_exit(void)
+{
+	i2c_del_driver(&os08a20_i2c_driver);
+}
+
+device_initcall_sync(sensor_mod_init);
+module_exit(sensor_mod_exit);
+
+MODULE_DESCRIPTION("OmniVision os08a20 sensor driver");
+MODULE_LICENSE("GPL v2");

commit a7a66fc7a70064ae4543800839799e4e28e73ff4
Author: Yiqing Zeng <zack.zeng@rock-chips.com>
Date:   Thu Jul 29 11:15:47 2021 +0800

    media: i2c: support sc5239 sensor driver
    
    support linear/hdr 2560*1920@15fps mode
    
    Signed-off-by: Yiqing Zeng <zack.zeng@rock-chips.com>
    Change-Id: I5ba1c881d009ee2348fe7e982e5fc531d2cbbb31

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index 5812988f4d5c..1db5086e1add 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -1837,6 +1837,17 @@ config VIDEO_SC500AI
 	  To compile this driver as a module, choose M here: the
 	  module will be called SC500AI.
 
+config VIDEO_SC5239
+	tristate "SmartSens SC5239 sensor support"
+	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
+	depends on MEDIA_CAMERA_SUPPORT
+	select V4L2_FWNODE
+	help
+	  Support for the SmartSens SC5239 sensor.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called SC5239.
+
 config VIDEO_SC8220
 	tristate "SmartSens SC8220 sensor support"
 	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index 3eab36772fa9..8c231b5df6b2 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -197,6 +197,7 @@ obj-$(CONFIG_VIDEO_SC401AI)	+= sc401ai.o
 obj-$(CONFIG_VIDEO_SC4238)	+= sc4238.o
 obj-$(CONFIG_VIDEO_SC430CS)	+= sc430cs.o
 obj-$(CONFIG_VIDEO_SC500AI)	+= sc500ai.o
+obj-$(CONFIG_VIDEO_SC5239)	+= sc5239.o
 obj-$(CONFIG_VIDEO_SC8220)	+= sc8220.o
 obj-$(CONFIG_VIDEO_SP250A)	+= sp250a.o
 obj-$(CONFIG_VIDEO_HYNIX_HI556)	+= hynix_hi556.o
diff --git a/drivers/media/i2c/sc5239.c b/drivers/media/i2c/sc5239.c
new file mode 100644
index 000000000000..544d70677ec4
--- /dev/null
+++ b/drivers/media/i2c/sc5239.c
@@ -0,0 +1,1554 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * sc5239 sensor driver
+ *
+ * Copyright (C) 2020 Rockchip Electronics Co., Ltd.
+ *
+ * V0.0X01.0X00 first version.
+ */
+
+//#define DEBUG
+#include <linux/clk.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/of_graph.h>
+#include <linux/regmap.h>
+#include <linux/pinctrl/consumer.h>
+#include <linux/regulator/consumer.h>
+#include <linux/version.h>
+#include <linux/rk-camera-module.h>
+#include <linux/rk-preisp.h>
+#include <media/v4l2-async.h>
+#include <media/media-entity.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-fwnode.h>
+#include <media/v4l2-subdev.h>
+
+#define DRIVER_VERSION		KERNEL_VERSION(0, 0x01, 0x00)
+
+#define OF_CAMERA_PINCTRL_STATE_DEFAULT	"rockchip,camera_default"
+#define OF_CAMERA_PINCTRL_STATE_SLEEP	"rockchip,camera_sleep"
+
+#define SC5239_NAME		"sc5239"
+#define SC5239_MEDIA_BUS_FMT	MEDIA_BUS_FMT_SBGGR10_1X10
+#define SC5239_LINK_FREQ_600M	300000000
+#define SC5239_LINK_FREQ_828M	414000000
+
+#define SC5239_XVCLK_FREQ	24000000
+
+#define SC5239_REG_CHIP_ID_H	0x3107
+#define SC5239_REG_CHIP_ID_L	0x3108
+
+#define SC5239_REG_EXP_LONG_H   0x3e01
+#define SC5239_REG_EXP_LONG_L	0x3e02
+#define SC5239_REG_EXP_SHORT_H	0x3e04
+#define SC5239_REG_EXP_SHORT_L	0x3e05
+
+#define SC5239_REG_LONG_DGAIN		0x3e06
+#define SC5239_REG_LONG_FINE_DGAIN	0x3e07
+#define SC5239_REG_LONG_AGAIN		0x3e08
+#define SC5239_REG_LONG_FINE_AGAIN	0x3e09
+
+#define SC5239_REG_SHORT_DGAIN		0x3e10
+#define SC5239_REG_SHORT_FINE_DGAIN	0x3e11
+#define SC5239_REG_SHORT_AGAIN		0x3e12
+#define SC5239_REG_SHORT_FINE_AGAIN	0x3e13
+
+#define SC5239_FLIP_MIRROR_REG	0x3221
+#define SC5239_MIRROR_MASK		0x06
+#define SC5239_FLIP_MASK		0xe0
+
+#define SC5239_REG_CTRL_MODE	0x0100
+#define SC5239_MODE_SW_STANDBY	0x0
+#define SC5239_MODE_STREAMING	BIT(0)
+
+#define SC5239_CHIP_ID		0x5235
+
+#define SC5239_REG_VTS_H	0x320e
+#define SC5239_REG_VTS_L	0x320f
+
+#define SC5239_VTS_MAX		0x3FFF
+#define SC5239_HTS_MAX		0x0FFF
+
+#define SC5239_EXPOSURE_NORMAL_MAX  0x118A
+#define SC5239_EXPOSURE_NORMAL_MIN  3
+#define SC5239_EXPOSURE_NORMAL_STEP 1
+
+#define SC5239_GAIN_MIN		0x20
+#define SC5239_GAIN_MAX		0x4000
+#define SC5239_GAIN_STEP	1
+#define SC5239_GAIN_DEFAULT	0x20
+
+#define SC5239_LANES		2
+
+static const char * const sc5239_supply_names[] = {
+	"dovdd",    /* Digital I/O power */
+	"avdd",     /* Analog power */
+	"dvdd",     /* Digital power */
+};
+
+#define SC5239_NUM_SUPPLIES ARRAY_SIZE(sc5239_supply_names)
+
+#define to_sc5239(sd) container_of(sd, struct sc5239, subdev)
+
+enum {
+	PAD0,
+	PAD1,
+	PAD2,
+	PAD3,
+	PAD_MAX,
+};
+
+enum {
+	LINK_FREQ_INDEX,
+	LINK_FREQ_15FPS_24MHz_HDR,
+};
+
+struct sc5239_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_index;
+	u32 bpp;
+	const struct reg_sequence *reg_list;
+	u32 reg_num;
+	u32 hdr_mode;
+	u32 vc[PAD_MAX];
+};
+
+struct sc5239 {
+	struct i2c_client	*client;
+	struct device	*dev;
+	struct clk	*xvclk;
+	struct regmap	*regmap;
+	struct gpio_desc *reset_gpio;
+	struct gpio_desc *pwdn_gpio;
+	struct regulator_bulk_data supplies[SC5239_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    *hblank;
+	struct v4l2_ctrl    *vblank;
+	struct v4l2_ctrl    *h_flip;
+	struct v4l2_ctrl    *v_flip;
+	struct v4l2_ctrl    *link_freq;
+	struct v4l2_ctrl    *pixel_rate;
+	struct mutex        lock;
+	bool		    streaming;
+	bool		    power_on;
+	unsigned int        cfg_num;
+	const struct sc5239_mode *cur_mode;
+	u32		module_index;
+	const char      *module_facing;
+	const char      *module_name;
+	const char      *len_name;
+	bool			  has_init_exp;
+	struct preisp_hdrae_exp_s init_hdrae_exp;
+};
+
+static const struct regmap_config sc5239_regmap_config = {
+	.reg_bits = 16,
+	.val_bits = 8,
+	.max_register = 0xff00,
+};
+
+static const s64 link_freq_menu_items[] = {
+	SC5239_LINK_FREQ_600M,
+	SC5239_LINK_FREQ_828M,
+};
+
+/*
+ * window size=2560*1920 mipi@2lane
+ * mclk=24M mipi_clk=600Mbps
+ * pixel_line_total=xxxx line_frame_total=2256
+ * row_time=60us frame_rate=15fps
+ */
+static const struct reg_sequence sc5239_24M_2560_1920_liner_15fps_settings[] = {
+	{0x0103, 0x01},
+	{0x0100, 0x00},
+	{0x3039, 0x80},
+	{0x3029, 0x80},
+	{0x302a, 0x36},
+	{0x302b, 0x10},
+	{0x302c, 0x00},
+	{0x302d, 0x03},
+	{0x3038, 0x44},
+	{0x303a, 0x3b},
+	{0x303d, 0x20},
+	{0x3200, 0x00},
+	{0x3201, 0x14},
+	{0x3202, 0x00},
+	{0x3203, 0x10},
+	{0x3204, 0x0a},
+	{0x3205, 0x1c},
+	{0x3206, 0x07},
+	{0x3207, 0x97},
+	{0x3208, 0x0a},
+	{0x3209, 0x00},
+	{0x320a, 0x07},
+	{0x320b, 0x80},
+	{0x320c, 0x05},
+	{0x320d, 0xdc},
+	{0x320e, 0x0a},
+	{0x320f, 0x6a},
+	{0x3211, 0x05},
+	{0x3213, 0x04},
+	{0x3221, 0x00},
+	{0x3235, 0x0f},
+	{0x3236, 0x9e},
+	{0x3301, 0x1c},
+	{0x3303, 0x28},
+	{0x3304, 0x10},
+	{0x3306, 0x50},
+	{0x3308, 0x10},
+	{0x3309, 0x70},
+	{0x330a, 0x00},
+	{0x330b, 0xb8},
+	{0x330e, 0x20},
+	{0x3314, 0x14},
+	{0x3315, 0x02},
+	{0x331b, 0x83},
+	{0x331e, 0x19},
+	{0x331f, 0x61},
+	{0x3320, 0x01},
+	{0x3321, 0x04},
+	{0x3326, 0x00},
+	{0x3333, 0x20},
+	{0x3334, 0x40},
+	{0x3364, 0x05},
+	{0x3366, 0x78},
+	{0x3367, 0x08},
+	{0x3368, 0x03},
+	{0x3369, 0x00},
+	{0x336a, 0x00},
+	{0x336b, 0x00},
+	{0x336c, 0x01},
+	{0x336d, 0x40},
+	{0x337f, 0x03},
+	{0x338f, 0x40},
+	{0x33b6, 0x07},
+	{0x33b7, 0x17},
+	{0x33b8, 0x20},
+	{0x33b9, 0x20},
+	{0x33ba, 0x44},
+	{0x3620, 0x28},
+	{0x3621, 0xac},
+	{0x3622, 0xf6},
+	{0x3623, 0x10},
+	{0x3624, 0x47},
+	{0x3625, 0x0b},
+	{0x3630, 0x30},
+	{0x3631, 0x88},
+	{0x3632, 0x18},
+	{0x3633, 0x23},
+	{0x3634, 0x86},
+	{0x3635, 0x4d},
+	{0x3636, 0x21},
+	{0x3637, 0x20},
+	{0x3638, 0x18},
+	{0x3639, 0x09},
+	{0x363a, 0x83},
+	{0x363b, 0x02},
+	{0x363c, 0x07},
+	{0x363d, 0x03},
+	{0x3670, 0x00},
+	{0x3677, 0x86},
+	{0x3678, 0x86},
+	{0x3679, 0xa8},
+	{0x367e, 0x08},
+	{0x367f, 0x18},
+	{0x3802, 0x00},
+	{0x3905, 0x98},
+	{0x3907, 0x01},
+	{0x3908, 0x11},
+	{0x390a, 0x00},
+	{0x391c, 0x9f},
+	{0x391d, 0x00},
+	{0x391e, 0x01},
+	{0x391f, 0xc0},
+	{0x3e00, 0x00},
+	{0x3e01, 0xf9},
+	{0x3e02, 0x80},
+	{0x3e03, 0x0b},
+	{0x3e06, 0x00},
+	{0x3e07, 0x80},
+	{0x3e08, 0x03},
+	{0x3e09, 0x20},
+	{0x3e1e, 0x30},
+	{0x3e26, 0x20},
+	{0x3f00, 0x0d},
+	{0x3f04, 0x02},
+	{0x3f05, 0xe6},
+	{0x3f08, 0x04},
+	{0x4500, 0x5d},
+	{0x4509, 0x10},
+	{0x4809, 0x01},
+	{0x4837, 0x21},
+	{0x5000, 0x06},
+	{0x5002, 0x06},
+	{0x5780, 0x7f},
+	{0x5781, 0x06},
+	{0x5782, 0x04},
+	{0x5783, 0x00},
+	{0x5784, 0x00},
+	{0x5785, 0x16},
+	{0x5786, 0x12},
+	{0x5787, 0x08},
+	{0x5788, 0x02},
+	{0x578b, 0x07},
+	{0x57a0, 0x00},
+	{0x57a1, 0x72},
+	{0x57a2, 0x01},
+	{0x57a3, 0xf2},
+	{0x6000, 0x20},
+	{0x6002, 0x00},
+	{0x3039, 0x24},
+	{0x3029, 0x27},
+};
+
+/*
+ * window size=2560*1920 mipi@2lane
+ * mclk=24M mipi_clk=600Mbps
+ * pixel_line_total= line_frame_total=2256
+ * row_time=60us frame_rate=15fps
+ */
+static const struct reg_sequence sc5239_24M_2560_1920_hdr_15fps_settings[] = {
+	{0x0103, 0x01},
+	{0x0100, 0x00},
+	{0x3039, 0x80},
+	{0x3029, 0x80},
+	{0x301f, 0x1b},
+	{0x302a, 0x69},
+	{0x302b, 0x01},
+	{0x302c, 0x00},
+	{0x302d, 0x03},
+	{0x3037, 0x26},
+	{0x3038, 0x66},
+	{0x303a, 0x29},
+	{0x303b, 0x0a},
+	{0x303c, 0x0e},
+	{0x303d, 0x03},
+	{0x3200, 0x00},
+	{0x3201, 0x10},
+	{0x3202, 0x00},
+	{0x3203, 0x0c},
+	{0x3204, 0x0a},
+	{0x3205, 0x1f},
+	{0x3206, 0x07},
+	{0x3207, 0x93},
+	{0x3208, 0x0a},
+	{0x3209, 0x00},
+	{0x320a, 0x07},
+	{0x320b, 0x80},
+	{0x320c, 0x05},
+	{0x320d, 0x64},
+	{0x320e, 0x0f},
+	{0x320f, 0xa0},
+	{0x3210, 0x00},
+	{0x3211, 0x08},
+	{0x3212, 0x00},
+	{0x3213, 0x04},
+	{0x3220, 0x50},
+	{0x3221, 0x00},
+	{0x3235, 0x1f},
+	{0x3236, 0x3e},
+	{0x3301, 0x38},
+	{0x3303, 0x20},
+	{0x3304, 0x10},
+	{0x3306, 0x58},
+	{0x3308, 0x10},
+	{0x3309, 0x60},
+	{0x330a, 0x00},
+	{0x330b, 0xb8},
+	{0x330d, 0x30},
+	{0x330e, 0x20},
+	{0x3314, 0x14},
+	{0x3315, 0x02},
+	{0x331b, 0x83},
+	{0x331e, 0x19},
+	{0x331f, 0x59},
+	{0x3320, 0x01},
+	{0x3321, 0x04},
+	{0x3326, 0x00},
+	{0x3332, 0x22},
+	{0x3333, 0x20},
+	{0x3334, 0x40},
+	{0x3350, 0x22},
+	{0x3359, 0x22},
+	{0x335c, 0x22},
+	{0x3364, 0x05},
+	{0x3366, 0xc8},
+	{0x3367, 0x08},
+	{0x3368, 0x03},
+	{0x3369, 0x00},
+	{0x336a, 0x00},
+	{0x336b, 0x00},
+	{0x336c, 0x01},
+	{0x336d, 0x40},
+	{0x337e, 0x88},
+	{0x337f, 0x03},
+	{0x338f, 0x40},
+	{0x33ae, 0x22},
+	{0x33af, 0x22},
+	{0x33b0, 0x22},
+	{0x33b4, 0x22},
+	{0x33b6, 0x07},
+	{0x33b7, 0x17},
+	{0x33b8, 0x20},
+	{0x33b9, 0x20},
+	{0x33ba, 0x44},
+	{0x3614, 0x00},
+	{0x3620, 0x28},
+	{0x3621, 0xac},
+	{0x3622, 0xf6},
+	{0x3623, 0x08},
+	{0x3624, 0x47},
+	{0x3625, 0x0b},
+	{0x3630, 0x30},
+	{0x3631, 0x88},
+	{0x3632, 0x18},
+	{0x3633, 0x34},
+	{0x3634, 0x86},
+	{0x3635, 0x4d},
+	{0x3636, 0x21},
+	{0x3637, 0x20},
+	{0x3638, 0x18},
+	{0x3639, 0x09},
+	{0x363a, 0x83},
+	{0x363b, 0x02},
+	{0x363c, 0x07},
+	{0x363d, 0x03},
+	{0x3670, 0x00},
+	{0x3677, 0x86},
+	{0x3678, 0x86},
+	{0x3679, 0xa8},
+	{0x367e, 0x08},
+	{0x367f, 0x18},
+	{0x3905, 0x98},
+	{0x3907, 0x01},
+	{0x3908, 0x11},
+	{0x390a, 0x00},
+	{0x391c, 0x9f},
+	{0x391d, 0x00},
+	{0x391e, 0x01},
+	{0x391f, 0xc0},
+	{0x3988, 0x11},
+	{0x3e00, 0x01},
+	{0x3e01, 0xd4},
+	{0x3e02, 0xe0},
+	{0x3e03, 0x0b},
+	{0x3e04, 0x1d},
+	{0x3e05, 0xe0},
+	{0x3e06, 0x00},
+	{0x3e07, 0x80},
+	{0x3e08, 0x03},
+	{0x3e09, 0x20},
+	{0x3e1e, 0x30},
+	{0x3e23, 0x00},
+	{0x3e24, 0xf2},
+	{0x3e26, 0x20},
+	{0x3f00, 0x0d},
+	{0x3f02, 0x05},
+	{0x3f04, 0x02},
+	{0x3f05, 0xaa},
+	{0x3f06, 0x21},
+	{0x3f08, 0x04},
+	{0x4500, 0x5d},
+	{0x4502, 0x10},
+	{0x4509, 0x10},
+	{0x4602, 0x0f},
+	{0x4809, 0x01},
+	{0x4816, 0x51},
+	{0x4837, 0x19},
+	{0x5000, 0x20},
+	{0x5002, 0x00},
+	{0x6000, 0x26},
+	{0x6002, 0x06},
+	{0x3039, 0x23},
+	{0x3029, 0x33},
+};
+
+static const struct sc5239_mode supported_modes[] = {
+	{
+		.width = 2560,
+		.height = 1920,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 150000,
+		},
+		.exp_def = 0x08f9,
+		.hts_def = 0x05dc,
+		.vts_def = 0x0a6a,
+		.link_freq_index = LINK_FREQ_INDEX,
+		.bus_fmt = SC5239_MEDIA_BUS_FMT,
+		.reg_list = sc5239_24M_2560_1920_liner_15fps_settings,
+		.reg_num = ARRAY_SIZE(sc5239_24M_2560_1920_liner_15fps_settings),
+		.hdr_mode = NO_HDR,
+		.bpp = 10,
+		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0,
+	},
+	{
+		.width = 2560,
+		.height = 1920,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 150000,
+		},
+		.exp_def = 0x0ed4,
+		.hts_def = 0x05dc,
+		.vts_def = 0x0fa0,
+		.link_freq_index = LINK_FREQ_15FPS_24MHz_HDR,
+		.bus_fmt = SC5239_MEDIA_BUS_FMT,
+		.reg_list = sc5239_24M_2560_1920_hdr_15fps_settings,
+		.reg_num = ARRAY_SIZE(sc5239_24M_2560_1920_hdr_15fps_settings),
+		.hdr_mode = HDR_X2,
+		.bpp = 10,
+		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_1,
+		.vc[PAD1] = V4L2_MBUS_CSI2_CHANNEL_0,
+		.vc[PAD2] = V4L2_MBUS_CSI2_CHANNEL_1,
+		.vc[PAD3] = V4L2_MBUS_CSI2_CHANNEL_1,
+	},
+};
+
+/* pixel rate = link frequency * 2 * lanes / BITS_PER_SAMPLE */
+static u64 to_pixel_rate(u32 index)
+{
+	u64 pixel_rate = link_freq_menu_items[index] * 2 * SC5239_LANES;
+
+	do_div(pixel_rate, 10);
+	return pixel_rate;
+}
+
+static inline int sc5239_read_reg(struct sc5239 *sc5239, u16 addr, u8 *value)
+{
+	unsigned int val;
+	int ret;
+
+	ret = regmap_read(sc5239->regmap, addr, &val);
+	if (ret) {
+		dev_err(sc5239->dev, "i2c read failed at addr: %x\n", addr);
+		return ret;
+	}
+	*value = val & 0xff;
+	return 0;
+}
+
+static inline int sc5239_write_reg(struct sc5239 *sc5239, u16 addr, u8 value)
+{
+	int ret;
+
+	ret = regmap_write(sc5239->regmap, addr, value);
+	if (ret) {
+		dev_err(sc5239->dev, "i2c write failed at addr: %x\n", addr);
+		return ret;
+	}
+	return ret;
+}
+
+static void sc5239_get_gain_reg(u32 total_gain, u32 *again, u32 *again_fine,
+					 u32 *dgain, u32 *dgain_fine)
+{
+	if (total_gain < 0x40) {/* 1 ~ 2 gain */
+		*again = 0x03;
+		*again_fine = total_gain;
+		*dgain = 0x00;
+		*dgain_fine = 0x80;
+	} else if (total_gain < 0x80) {/* 2 ~ 4 gain */
+		*again = 0x07;
+		*again_fine = total_gain >> 1;
+		*dgain = 0x00;
+		*dgain_fine = 0x80;
+	} else if (total_gain < 0x100) {/* 4 ~ 8 gain */
+		*again = 0x0F;
+		*again_fine = total_gain >> 2;
+		*dgain = 0x00;
+		*dgain_fine = 0x80;
+	} else if (total_gain < 0x200) {/* 8 ~ 16 gain */
+		*again = 0x01F;
+		*again_fine = total_gain >> 3;
+		*dgain = 0x00;
+		*dgain_fine = 0x80;
+	} else if (total_gain < 0x400) {/* 16 ~ 32 gain */
+		*again = 0x1F;
+		*again_fine = 0x3F;
+		*dgain = 0x00;
+		*dgain_fine = total_gain >> 2;
+	} else if (total_gain < 0x800) {/* 32 ~ 64 gain */
+		*again = 0x1F;
+		*again_fine = 0x3F;
+		*dgain = 0x01;
+		*dgain_fine = total_gain >> 3;
+	} else if (total_gain < 0x1000) {/* 64 ~ 128 gain */
+		*again = 0x1F;
+		*dgain_fine = 0x3F;
+		*dgain = 0x03;
+		*dgain_fine = total_gain >> 4;
+	} else if (total_gain < 0x2000) {/* 128 ~ 256 gain */
+		*again = 0x1F;
+		*again_fine = 0x3F;
+		*dgain = 0x07;
+		*dgain_fine = total_gain >> 5;
+	} else if (total_gain < 0x4000) {/* 256 ~ 512 gain */
+		*again = 0x1F;
+		*again_fine = 0x3F;
+		*dgain = 0x0F;
+		*dgain_fine = total_gain >> 6;
+	}
+}
+
+static int sc5239_set_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct sc5239 *sc5239 = container_of(ctrl->handler,
+					     struct sc5239, ctrl_handler);
+	s64 max;
+	u32 again = 0, again_fine = 0, dgain = 0, dgain_fine = 0;
+	int ret = 0;
+	u32 vts = 0;
+	u8 val = 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 = ((sc5239->cur_mode->height + ctrl->val) << 1) - 4;
+		__v4l2_ctrl_modify_range(sc5239->exposure,
+					 sc5239->exposure->minimum, max,
+					 sc5239->exposure->step,
+					 sc5239->exposure->default_value);
+		break;
+	}
+
+	if (pm_runtime_get(sc5239->dev) <= 0)
+		return 0;
+
+	switch (ctrl->id) {
+	case V4L2_CID_EXPOSURE:
+		if (sc5239->cur_mode->hdr_mode != NO_HDR)
+			return ret;
+		dev_dbg(sc5239->dev, "set exposure 0x%x\n", ctrl->val);
+		ret |= sc5239_write_reg(sc5239, SC5239_REG_EXP_LONG_H, ctrl->val >> 4);
+		ret |= sc5239_write_reg(sc5239, SC5239_REG_EXP_LONG_L, ctrl->val << 4);
+		break;
+	case V4L2_CID_ANALOGUE_GAIN:
+		if (sc5239->cur_mode->hdr_mode != NO_HDR)
+			return ret;
+		dev_dbg(sc5239->dev, "set again 0x%x\n", ctrl->val);
+		sc5239_get_gain_reg(ctrl->val, &again, &again_fine, &dgain, &dgain_fine);
+		ret |= sc5239_write_reg(sc5239, SC5239_REG_LONG_DGAIN, dgain);
+		ret |= sc5239_write_reg(sc5239, SC5239_REG_LONG_FINE_DGAIN, dgain_fine);
+		ret |= sc5239_write_reg(sc5239, SC5239_REG_LONG_AGAIN, again);
+		ret |= sc5239_write_reg(sc5239, SC5239_REG_LONG_FINE_AGAIN, again_fine);
+		break;
+	case V4L2_CID_VBLANK:
+		dev_dbg(sc5239->dev, "set vblank 0x%x\n", ctrl->val);
+		vts = ctrl->val + sc5239->cur_mode->height;
+		ret |= sc5239_write_reg(sc5239, SC5239_REG_VTS_H, (vts >> 8) & 0xff);
+		ret |= sc5239_write_reg(sc5239, SC5239_REG_VTS_L, vts & 0xff);
+		break;
+	case V4L2_CID_HFLIP:
+		ret |= sc5239_read_reg(sc5239, SC5239_FLIP_MIRROR_REG, &val);
+		if (ret)
+			break;
+
+		if (ctrl->val)
+			val |= SC5239_MIRROR_MASK;
+		else
+			val &= ~SC5239_MIRROR_MASK;
+		ret |= sc5239_write_reg(sc5239, SC5239_FLIP_MIRROR_REG, val);
+		break;
+	case V4L2_CID_VFLIP:
+		ret |= sc5239_read_reg(sc5239, SC5239_FLIP_MIRROR_REG, &val);
+		if (ret)
+			break;
+
+		if (ctrl->val)
+			val |= SC5239_FLIP_MASK;
+		else
+			val &= ~SC5239_FLIP_MASK;
+		ret |= sc5239_write_reg(sc5239, SC5239_FLIP_MIRROR_REG, val);
+		break;
+	default:
+		dev_warn(sc5239->dev, "%s Unhandled id:0x%x, val:0x%x\n",
+			 __func__, ctrl->id, ctrl->val);
+		break;
+	}
+	pm_runtime_put(sc5239->dev);
+	return ret;
+}
+
+static const struct v4l2_ctrl_ops sc5239_ctrl_ops = {
+	.s_ctrl = sc5239_set_ctrl,
+};
+
+static int sc5239_get_regulators(struct sc5239 *sc5239)
+{
+	unsigned int i;
+
+	for (i = 0; i < SC5239_NUM_SUPPLIES; i++)
+		sc5239->supplies[i].supply = sc5239_supply_names[i];
+	return devm_regulator_bulk_get(sc5239->dev,
+				       SC5239_NUM_SUPPLIES,
+				       sc5239->supplies);
+}
+
+static int sc5239_initialize_controls(struct sc5239 *sc5239)
+{
+	const struct sc5239_mode *mode;
+	struct v4l2_ctrl_handler *handler;
+	s64 exposure_max, vblank_def;
+	u32 h_blank;
+	int ret;
+
+	handler = &sc5239->ctrl_handler;
+	mode = sc5239->cur_mode;
+	ret = v4l2_ctrl_handler_init(handler, 8);
+	if (ret)
+		return ret;
+	handler->lock = &sc5239->lock;
+	sc5239->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, V4L2_CID_LINK_FREQ,
+						  ARRAY_SIZE(link_freq_menu_items) - 1, 0,
+						  link_freq_menu_items);
+
+	sc5239->pixel_rate = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE,
+					      0, to_pixel_rate(LINK_FREQ_INDEX),
+					      1, to_pixel_rate(LINK_FREQ_INDEX));
+	h_blank = mode->hts_def - mode->width;
+
+	sc5239->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
+					  h_blank, h_blank, 1, h_blank);
+	if (sc5239->hblank)
+		sc5239->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+	vblank_def = mode->vts_def - mode->height;
+
+	sc5239->vblank = v4l2_ctrl_new_std(handler, &sc5239_ctrl_ops,
+					  V4L2_CID_VBLANK, vblank_def,
+					  SC5239_VTS_MAX - mode->height,
+					  1, vblank_def);
+
+	exposure_max = (2 * mode->vts_def - 8);
+
+	sc5239->exposure = v4l2_ctrl_new_std(handler, &sc5239_ctrl_ops,
+					    V4L2_CID_EXPOSURE, SC5239_EXPOSURE_NORMAL_MIN,
+					    exposure_max, SC5239_EXPOSURE_NORMAL_STEP,
+					    mode->exp_def);
+
+	sc5239->anal_gain = v4l2_ctrl_new_std(handler, &sc5239_ctrl_ops,
+					     V4L2_CID_ANALOGUE_GAIN, SC5239_GAIN_MIN,
+					     SC5239_GAIN_MAX, SC5239_GAIN_STEP,
+					     SC5239_GAIN_DEFAULT);
+
+	v4l2_ctrl_new_std(handler, &sc5239_ctrl_ops,
+					  V4L2_CID_HFLIP, 0, 1, 1, 0);
+
+	v4l2_ctrl_new_std(handler, &sc5239_ctrl_ops,
+					  V4L2_CID_VFLIP, 0, 1, 1, 0);
+
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(sc5239->dev, "Failed to init controls(%d)\n", ret);
+		goto err_free_handler;
+	}
+
+	sc5239->subdev.ctrl_handler = handler;
+	sc5239->has_init_exp = false;
+
+	return 0;
+err_free_handler:
+	v4l2_ctrl_handler_free(handler);
+	return ret;
+}
+
+static int __sc5239_power_on(struct sc5239 *sc5239)
+{
+	int ret;
+	struct device *dev = sc5239->dev;
+
+	if (!IS_ERR_OR_NULL(sc5239->pins_default)) {
+		ret = pinctrl_select_state(sc5239->pinctrl,
+					   sc5239->pins_default);
+		if (ret < 0)
+			dev_err(dev, "could not set pins\n");
+	}
+	ret = clk_set_rate(sc5239->xvclk, SC5239_XVCLK_FREQ);
+	if (ret < 0)
+		dev_warn(dev, "Failed to set xvclk rate\n");
+	if (clk_get_rate(sc5239->xvclk) != SC5239_XVCLK_FREQ)
+		dev_warn(dev, "xvclk mismatched, modes are based on 27MHz\n");
+	ret = clk_prepare_enable(sc5239->xvclk);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable xvclk\n");
+		return ret;
+	}
+	ret = regulator_bulk_enable(SC5239_NUM_SUPPLIES, sc5239->supplies);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable regulators\n");
+		goto disable_clk;
+	}
+	if (!IS_ERR(sc5239->reset_gpio))
+		gpiod_set_value_cansleep(sc5239->reset_gpio, 1);
+	usleep_range(1000, 2000);
+	if (!IS_ERR(sc5239->pwdn_gpio))
+		gpiod_set_value_cansleep(sc5239->pwdn_gpio, 1);
+	if (!IS_ERR(sc5239->reset_gpio))
+		gpiod_set_value_cansleep(sc5239->reset_gpio, 0);
+
+	return 0;
+disable_clk:
+	clk_disable_unprepare(sc5239->xvclk);
+
+	if (!IS_ERR_OR_NULL(sc5239->pins_sleep))
+		pinctrl_select_state(sc5239->pinctrl, sc5239->pins_sleep);
+
+	return ret;
+}
+
+static void __sc5239_power_off(struct sc5239 *sc5239)
+{
+	int ret;
+	struct device *dev = sc5239->dev;
+
+	if (!IS_ERR_OR_NULL(sc5239->pins_sleep)) {
+		ret = pinctrl_select_state(sc5239->pinctrl,
+					   sc5239->pins_sleep);
+		if (ret < 0)
+			dev_dbg(dev, "could not set pins\n");
+	}
+	if (!IS_ERR(sc5239->reset_gpio))
+		gpiod_set_value_cansleep(sc5239->reset_gpio, 1);
+	if (!IS_ERR(sc5239->pwdn_gpio))
+		gpiod_set_value_cansleep(sc5239->pwdn_gpio, 0);
+	regulator_bulk_disable(SC5239_NUM_SUPPLIES, sc5239->supplies);
+	clk_disable_unprepare(sc5239->xvclk);
+}
+
+static int sc5239_check_sensor_id(struct sc5239 *sc5239)
+{
+	u8 id_h = 0, id_l = 0;
+	u16 id = 0;
+	int ret = 0;
+
+	ret = sc5239_read_reg(sc5239, SC5239_REG_CHIP_ID_H, &id_h);
+	ret |= sc5239_read_reg(sc5239, SC5239_REG_CHIP_ID_L, &id_l);
+	if (ret) {
+		dev_err(sc5239->dev, "Failed to read sensor id, (%d)\n", ret);
+		return ret;
+	}
+	id = id_h << 8 | id_l;
+	if (id != SC5239_CHIP_ID) {
+		dev_err(sc5239->dev, "sensor id: %04X mismatched\n", id);
+		return -ENODEV;
+	}
+	dev_info(sc5239->dev, "Detected SC5239 sensor\n");
+
+	return 0;
+}
+
+static void sc5239_get_module_inf(struct sc5239 *sc5239,
+				  struct rkmodule_inf *inf)
+{
+	memset(inf, 0, sizeof(*inf));
+	strscpy(inf->base.lens, sc5239->len_name, sizeof(inf->base.lens));
+	strscpy(inf->base.sensor, SC5239_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, sc5239->module_name, sizeof(inf->base.module));
+}
+
+static int sc5239_set_hdrae(struct sc5239 *sc5239,
+			 struct preisp_hdrae_exp_s *ae)
+{
+	int ret = 0;
+	u32 l_exp_time, m_exp_time, s_exp_time;
+	u32 l_t_gain, m_t_gain, s_t_gain;
+	u32 l_again = 0, l_again_fine = 0, l_dgain = 0, l_dgain_fine = 0;
+	u32 s_again = 0, s_again_fine = 0, s_dgain = 0, s_dgain_fine = 0;
+
+	if (!sc5239->has_init_exp && !sc5239->streaming) {
+		sc5239->init_hdrae_exp = *ae;
+		sc5239->has_init_exp = true;
+		dev_dbg(&sc5239->client->dev, "sc5239 don't stream, record exp for hdr!\n");
+		return ret;
+	}
+
+	l_exp_time = ae->long_exp_reg;
+	m_exp_time = ae->middle_exp_reg;
+	s_exp_time = ae->short_exp_reg;
+	l_t_gain = ae->long_gain_reg;
+	m_t_gain = ae->middle_gain_reg;
+	s_t_gain = ae->short_gain_reg;
+
+	dev_dbg(&sc5239->client->dev,
+		"rev exp req: L_exp: 0x%x, M_exp: 0x%x, S_exp: 0x%x, L_tgain: 0x%x, M_tgain: 0x%x, S_tgain: 0x%x\n",
+		l_exp_time, m_exp_time, s_exp_time,
+		l_t_gain, m_t_gain, s_t_gain);
+
+	if (sc5239->cur_mode->hdr_mode == HDR_X2) {
+		//2 stagger
+		l_t_gain = m_t_gain;
+		l_exp_time = m_exp_time;
+	}
+
+	l_exp_time = l_exp_time << 1;
+	s_exp_time = s_exp_time << 1;
+
+	// set exposure reg
+	ret |= sc5239_write_reg(sc5239, SC5239_REG_EXP_LONG_L, (l_exp_time << 4) & 0xff);
+	ret |= sc5239_write_reg(sc5239, SC5239_REG_EXP_LONG_H, (l_exp_time >> 4));
+
+	ret |= sc5239_write_reg(sc5239, SC5239_REG_EXP_SHORT_L, (s_exp_time << 4) & 0xff);
+	ret |= sc5239_write_reg(sc5239, SC5239_REG_EXP_SHORT_H, (s_exp_time >> 4));
+
+	// set gain reg
+	sc5239_get_gain_reg(l_t_gain, &l_again, &l_again_fine, &l_dgain, &l_dgain_fine);
+	sc5239_get_gain_reg(s_t_gain, &s_again, &s_again_fine, &s_dgain, &s_dgain_fine);
+
+	ret |= sc5239_write_reg(sc5239, SC5239_REG_LONG_DGAIN, l_dgain);
+	ret |= sc5239_write_reg(sc5239, SC5239_REG_LONG_FINE_DGAIN, l_dgain_fine);
+	ret |= sc5239_write_reg(sc5239, SC5239_REG_LONG_AGAIN, l_again);
+	ret |= sc5239_write_reg(sc5239, SC5239_REG_LONG_FINE_AGAIN, l_again_fine);
+
+	ret |= sc5239_write_reg(sc5239, SC5239_REG_SHORT_DGAIN, s_dgain);
+	ret |= sc5239_write_reg(sc5239, SC5239_REG_SHORT_FINE_DGAIN, s_dgain_fine);
+	ret |= sc5239_write_reg(sc5239, SC5239_REG_SHORT_AGAIN, s_again);
+	ret |= sc5239_write_reg(sc5239, SC5239_REG_SHORT_FINE_AGAIN, s_again_fine);
+
+	return ret;
+}
+
+static long sc5239_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	struct sc5239 *sc5239 = to_sc5239(sd);
+	struct rkmodule_hdr_cfg *hdr_cfg;
+	const struct sc5239_mode *mode;
+	long ret = 0;
+	u32 stream = 0;
+	u32 i, h, w;
+	u64 pixel_rate = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_HDR_CFG:
+		hdr_cfg = (struct rkmodule_hdr_cfg *)arg;
+		hdr_cfg->esp.mode = HDR_NORMAL_VC;
+		hdr_cfg->hdr_mode = sc5239->cur_mode->hdr_mode;
+		break;
+	case RKMODULE_GET_MODULE_INFO:
+		sc5239_get_module_inf(sc5239, (struct rkmodule_inf *)arg);
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr_cfg = (struct rkmodule_hdr_cfg *)arg;
+		w = sc5239->cur_mode->width;
+		h = sc5239->cur_mode->height;
+
+		for (i = 0; i < sc5239->cfg_num; i++) {
+			if (w == supported_modes[i].width &&
+			h == supported_modes[i].height &&
+			supported_modes[i].hdr_mode == hdr_cfg->hdr_mode) {
+				sc5239->cur_mode = &supported_modes[i];
+				break;
+			}
+		}
+		if (i == sc5239->cfg_num) {
+			dev_err(sc5239->dev, "not find hdr mode:%d %dx%d config\n",
+				hdr_cfg->hdr_mode, w, h);
+			ret = -EINVAL;
+		} else {
+			mode = sc5239->cur_mode;
+			w = mode->hts_def - mode->width;
+			h = mode->vts_def - mode->height;
+			__v4l2_ctrl_modify_range(sc5239->hblank, w, w, 1, w);
+			__v4l2_ctrl_modify_range(sc5239->vblank, h,
+						 SC5239_VTS_MAX - mode->height, 1, h);
+
+			__v4l2_ctrl_s_ctrl(sc5239->link_freq, mode->link_freq_index);
+			pixel_rate = (u32)link_freq_menu_items[mode->link_freq_index]
+							/ mode->bpp * 2 * SC5239_LANES;
+			__v4l2_ctrl_s_ctrl_int64(sc5239->pixel_rate, pixel_rate);
+
+			dev_info(sc5239->dev, "sensor mode: %d\n", mode->hdr_mode);
+		}
+		break;
+	case PREISP_CMD_SET_HDRAE_EXP:
+		if (sc5239->cur_mode->hdr_mode == HDR_X2)
+			ret = sc5239_set_hdrae(sc5239, arg);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		stream = *((u32 *)arg);
+		if (stream)
+			ret = sc5239_write_reg(sc5239, SC5239_REG_CTRL_MODE,
+				SC5239_MODE_STREAMING);
+		else
+			ret = sc5239_write_reg(sc5239, SC5239_REG_CTRL_MODE,
+				SC5239_MODE_SW_STANDBY);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+	return ret;
+}
+
+static int __sc5239_start_stream(struct sc5239 *sc5239)
+{
+	int ret;
+
+	ret = regmap_multi_reg_write(sc5239->regmap,
+				     sc5239->cur_mode->reg_list,
+				     sc5239->cur_mode->reg_num);
+	if (ret)
+		return ret;
+	__v4l2_ctrl_handler_setup(&sc5239->ctrl_handler);
+	return sc5239_write_reg(sc5239, SC5239_REG_CTRL_MODE, SC5239_MODE_STREAMING);
+}
+
+static int __sc5239_stop_stream(struct sc5239 *sc5239)
+{
+	sc5239->has_init_exp = false;
+	return sc5239_write_reg(sc5239, SC5239_REG_CTRL_MODE, SC5239_MODE_SW_STANDBY);
+}
+
+#ifdef CONFIG_COMPAT
+static long sc5239_compat_ioctl32(struct v4l2_subdev *sd,
+				  unsigned int cmd, unsigned long arg)
+{
+	void __user *up = compat_ptr(arg);
+	struct rkmodule_inf *inf;
+	struct rkmodule_hdr_cfg *hdr;
+	struct preisp_hdrae_exp_s *hdrae;
+	u32 stream = 0;
+	long ret = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		inf = kzalloc(sizeof(*inf), GFP_KERNEL);
+		if (!inf) {
+			ret = -ENOMEM;
+			return ret;
+		}
+		ret = sc5239_ioctl(sd, cmd, inf);
+		if (!ret) {
+			ret = copy_to_user(up, inf, sizeof(*inf));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(inf);
+		break;
+	case RKMODULE_GET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+		ret = sc5239_ioctl(sd, cmd, hdr);
+		if (!ret) {
+			ret = copy_to_user(up, hdr, sizeof(*hdr));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(hdr);
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		if (copy_from_user(hdr, up, sizeof(*hdr))) {
+			kfree(hdr);
+			return -EFAULT;
+		}
+
+		ret = sc5239_ioctl(sd, cmd, hdr);
+
+		kfree(hdr);
+		break;
+	case PREISP_CMD_SET_HDRAE_EXP:
+		hdrae = kzalloc(sizeof(*hdrae), GFP_KERNEL);
+		if (!hdrae) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		if (copy_from_user(hdrae, up, sizeof(*hdrae))) {
+			kfree(hdrae);
+			return -EFAULT;
+		}
+
+		ret = sc5239_ioctl(sd, cmd, hdrae);
+
+		kfree(hdrae);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		if (copy_from_user(&stream, up, sizeof(u32)))
+			return -EFAULT;
+
+		ret = sc5239_ioctl(sd, cmd, &stream);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+	return ret;
+}
+#endif
+
+static int sc5239_s_stream(struct v4l2_subdev *sd, int on)
+{
+	struct sc5239 *sc5239 = to_sc5239(sd);
+	int ret = 0;
+
+	mutex_lock(&sc5239->lock);
+	on = !!on;
+	if (on == sc5239->streaming)
+		goto unlock_and_return;
+	if (on) {
+		ret = pm_runtime_get_sync(sc5239->dev);
+		if (ret < 0) {
+			pm_runtime_put_noidle(sc5239->dev);
+			goto unlock_and_return;
+		}
+		ret = __sc5239_start_stream(sc5239);
+		if (ret) {
+			dev_err(sc5239->dev, "Failed to start sc5239 stream\n");
+			pm_runtime_put(sc5239->dev);
+			goto unlock_and_return;
+		}
+	} else {
+		__sc5239_stop_stream(sc5239);
+		pm_runtime_put(sc5239->dev);
+	}
+	sc5239->streaming = on;
+unlock_and_return:
+	mutex_unlock(&sc5239->lock);
+	return 0;
+}
+
+static int sc5239_g_frame_interval(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_frame_interval *fi)
+{
+	struct sc5239 *sc5239 = to_sc5239(sd);
+	const struct sc5239_mode *mode = sc5239->cur_mode;
+
+	mutex_lock(&sc5239->lock);
+	fi->interval = mode->max_fps;
+	mutex_unlock(&sc5239->lock);
+	return 0;
+}
+
+static int sc5239_g_mbus_config(struct v4l2_subdev *sd,
+				struct v4l2_mbus_config *config)
+{
+	struct sc5239 *sc5239 = to_sc5239(sd);
+
+	u32 val = 1 << (SC5239_LANES - 1) | V4L2_MBUS_CSI2_CHANNEL_0 |
+		  V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
+	config->type = V4L2_MBUS_CSI2;
+	config->flags = (sc5239->cur_mode->hdr_mode == NO_HDR) ?
+			val : (val | V4L2_MBUS_CSI2_CHANNEL_1);
+	return 0;
+}
+
+static int sc5239_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 = SC5239_MEDIA_BUS_FMT;
+	return 0;
+}
+
+static int sc5239_enum_frame_sizes(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_pad_config *cfg,
+				   struct v4l2_subdev_frame_size_enum *fse)
+{
+	struct sc5239 *sc5239 = to_sc5239(sd);
+
+	if (fse->index >= sc5239->cfg_num)
+		return -EINVAL;
+
+	if (fse->code != SC5239_MEDIA_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;
+	return 0;
+}
+
+static int sc5239_enum_frame_interval(struct v4l2_subdev *sd,
+						  struct v4l2_subdev_pad_config *cfg,
+						  struct v4l2_subdev_frame_interval_enum *fie)
+{
+	struct sc5239 *sc5239 = to_sc5239(sd);
+
+	if (fie->index >= sc5239->cfg_num)
+		return -EINVAL;
+	fie->code = SC5239_MEDIA_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;
+	return 0;
+}
+
+static int sc5239_set_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct sc5239 *sc5239 = to_sc5239(sd);
+	const struct sc5239_mode *mode;
+	s64 h_blank, vblank_def;
+
+	mutex_lock(&sc5239->lock);
+	mode = v4l2_find_nearest_size(supported_modes,
+				      ARRAY_SIZE(supported_modes),
+				      width, height,
+				      fmt->format.width, fmt->format.height);
+	fmt->format.code = SC5239_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(&sc5239->lock);
+		return -ENOTTY;
+#endif
+	} else {
+		sc5239->cur_mode = mode;
+		__v4l2_ctrl_s_ctrl(sc5239->link_freq, mode->link_freq_index);
+		__v4l2_ctrl_s_ctrl_int64(sc5239->pixel_rate,
+					 to_pixel_rate(mode->link_freq_index));
+		h_blank = mode->hts_def - mode->width;
+		__v4l2_ctrl_modify_range(sc5239->hblank, h_blank,
+					 h_blank, 1, h_blank);
+		vblank_def = mode->vts_def - mode->height;
+		__v4l2_ctrl_modify_range(sc5239->vblank, vblank_def,
+					 SC5239_VTS_MAX - mode->height,
+					 1, vblank_def);
+	}
+	mutex_unlock(&sc5239->lock);
+	return 0;
+}
+
+static int sc5239_get_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct sc5239 *sc5239 = to_sc5239(sd);
+	const struct sc5239_mode *mode = sc5239->cur_mode;
+
+	mutex_lock(&sc5239->lock);
+	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(&sc5239->lock);
+		return -ENOTTY;
+#endif
+	} else {
+		fmt->format.width = mode->width;
+		fmt->format.height = mode->height;
+		fmt->format.code = SC5239_MEDIA_BUS_FMT;
+		fmt->format.field = V4L2_FIELD_NONE;
+		fmt->reserved[0] = mode->vc[PAD0];
+	}
+	mutex_unlock(&sc5239->lock);
+	return 0;
+}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static int sc5239_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
+{
+	struct sc5239 *sc5239 = to_sc5239(sd);
+	struct v4l2_mbus_framefmt *try_fmt =
+				v4l2_subdev_get_try_format(sd, fh->pad, 0);
+	const struct sc5239_mode *def_mode = &supported_modes[0];
+
+	mutex_lock(&sc5239->lock);
+	/* Initialize try_fmt */
+	try_fmt->width = def_mode->width;
+	try_fmt->height = def_mode->height;
+	try_fmt->code = SC5239_MEDIA_BUS_FMT;
+	try_fmt->field = V4L2_FIELD_NONE;
+	mutex_unlock(&sc5239->lock);
+	return 0;
+}
+#endif
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static const struct v4l2_subdev_internal_ops sc5239_internal_ops = {
+	.open = sc5239_open,
+};
+#endif
+
+static int sc5239_s_power(struct v4l2_subdev *sd, int on)
+{
+	struct sc5239 *sc5239 = to_sc5239(sd);
+	int ret = 0;
+
+	mutex_lock(&sc5239->lock);
+	if (sc5239->power_on == !!on)
+		goto unlock_and_return;
+	if (on) {
+		ret = pm_runtime_get_sync(sc5239->dev);
+		if (ret < 0) {
+			pm_runtime_put_noidle(sc5239->dev);
+			goto unlock_and_return;
+		}
+		sc5239->power_on = true;
+	} else {
+		pm_runtime_put(sc5239->dev);
+		sc5239->power_on = false;
+	}
+unlock_and_return:
+	mutex_unlock(&sc5239->lock);
+	return ret;
+}
+
+static const struct v4l2_subdev_core_ops sc5239_core_ops = {
+	.s_power = sc5239_s_power,
+	.ioctl = sc5239_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = sc5239_compat_ioctl32,
+#endif
+};
+
+static const struct v4l2_subdev_video_ops sc5239_video_ops = {
+	.s_stream = sc5239_s_stream,
+	.g_frame_interval = sc5239_g_frame_interval,
+	.g_mbus_config = sc5239_g_mbus_config,
+};
+
+static const struct v4l2_subdev_pad_ops sc5239_pad_ops = {
+	.enum_mbus_code = sc5239_enum_mbus_code,
+	.enum_frame_size = sc5239_enum_frame_sizes,
+	.enum_frame_interval = sc5239_enum_frame_interval,
+	.get_fmt = sc5239_get_fmt,
+	.set_fmt = sc5239_set_fmt,
+};
+
+static const struct v4l2_subdev_ops sc5239_subdev_ops = {
+	.core   = &sc5239_core_ops,
+	.video  = &sc5239_video_ops,
+	.pad    = &sc5239_pad_ops,
+};
+
+static int sc5239_runtime_resume(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct sc5239 *sc5239 = to_sc5239(sd);
+
+	__sc5239_power_on(sc5239);
+	return 0;
+}
+
+static int sc5239_runtime_suspend(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct sc5239 *sc5239 = to_sc5239(sd);
+
+	__sc5239_power_off(sc5239);
+	return 0;
+}
+
+static const struct dev_pm_ops sc5239_pm_ops = {
+	SET_RUNTIME_PM_OPS(sc5239_runtime_suspend,
+			   sc5239_runtime_resume, NULL)
+};
+
+static int sc5239_probe(struct i2c_client *client,
+			 const struct i2c_device_id *id)
+{
+	struct device *dev = &client->dev;
+	struct device_node *node = dev->of_node;
+	struct sc5239 *sc5239;
+	struct v4l2_subdev *sd;
+	char facing[2];
+	int ret;
+
+	dev_info(dev, "driver version: %02x.%02x.%02x",
+		 DRIVER_VERSION >> 16,
+		 (DRIVER_VERSION & 0xff00) >> 8,
+		 DRIVER_VERSION & 0x00ff);
+	sc5239 = devm_kzalloc(dev, sizeof(*sc5239), GFP_KERNEL);
+	if (!sc5239)
+		return -ENOMEM;
+	sc5239->dev = dev;
+	sc5239->regmap = devm_regmap_init_i2c(client, &sc5239_regmap_config);
+	if (IS_ERR(sc5239->regmap)) {
+		dev_err(dev, "Failed to initialize I2C\n");
+		return -ENODEV;
+	}
+	ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
+				   &sc5239->module_index);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
+				       &sc5239->module_facing);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME,
+				       &sc5239->module_name);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME,
+				       &sc5239->len_name);
+	if (ret) {
+		dev_err(dev, "Failed to get module information\n");
+		return -EINVAL;
+	}
+	sc5239->xvclk = devm_clk_get(sc5239->dev, "xvclk");
+	if (IS_ERR(sc5239->xvclk)) {
+		dev_err(sc5239->dev, "Failed to get xvclk\n");
+		return -EINVAL;
+	}
+	sc5239->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+	if (IS_ERR(sc5239->reset_gpio))
+		dev_warn(dev, "Failed to get reset-gpios\n");
+	sc5239->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_HIGH);
+	if (IS_ERR(sc5239->pwdn_gpio))
+		dev_warn(dev, "Failed to get pwdn-gpios\n");
+	ret = sc5239_get_regulators(sc5239);
+	if (ret) {
+		dev_err(dev, "Failed to get regulators\n");
+		return ret;
+	}
+	sc5239->pinctrl = devm_pinctrl_get(dev);
+	if (!IS_ERR(sc5239->pinctrl)) {
+		sc5239->pins_default =
+			pinctrl_lookup_state(sc5239->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_DEFAULT);
+		if (IS_ERR(sc5239->pins_default))
+			dev_info(dev, "could not get default pinstate\n");
+
+		sc5239->pins_sleep =
+			pinctrl_lookup_state(sc5239->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_SLEEP);
+		if (IS_ERR(sc5239->pins_sleep))
+			dev_info(dev, "could not get sleep pinstate\n");
+	} else {
+		dev_info(dev, "no pinctrl\n");
+	}
+	mutex_init(&sc5239->lock);
+	/* set default mode */
+	sc5239->cur_mode = &supported_modes[0];
+	sc5239->cfg_num = ARRAY_SIZE(supported_modes);
+	sd = &sc5239->subdev;
+	ret = __sc5239_power_on(sc5239);
+	if (ret)
+		goto err_free_handler;
+	ret = sc5239_check_sensor_id(sc5239);
+	if (ret)
+		goto err_power_off;
+	v4l2_i2c_subdev_init(sd, client, &sc5239_subdev_ops);
+	ret = sc5239_initialize_controls(sc5239);
+	if (ret)
+		goto err_destroy_mutex;
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+	sd->internal_ops = &sc5239_internal_ops;
+	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
+#endif
+#ifdef CONFIG_MEDIA_CONTROLLER
+	sc5239->pad.flags = MEDIA_PAD_FL_SOURCE;
+	sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
+	ret = media_entity_pads_init(&sd->entity, 1, &sc5239->pad);
+	if (ret < 0)
+		goto err_power_off;
+#endif
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(sc5239->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s",
+		 sc5239->module_index, facing,
+		 SC5239_NAME, dev_name(sd->dev));
+	ret = v4l2_async_register_subdev_sensor_common(sd);
+	if (ret) {
+		dev_err(dev, "Failed to register v4l2 async subdev\n");
+		goto err_clean_entity;
+	}
+
+	pm_runtime_set_active(dev);
+	pm_runtime_enable(dev);
+	pm_runtime_idle(dev);
+	return 0;
+err_clean_entity:
+#ifdef CONFIG_MEDIA_CONTROLLER
+	media_entity_cleanup(&sd->entity);
+#endif
+err_power_off:
+	__sc5239_power_off(sc5239);
+err_free_handler:
+	v4l2_ctrl_handler_free(&sc5239->ctrl_handler);
+err_destroy_mutex:
+	mutex_destroy(&sc5239->lock);
+	return ret;
+}
+
+static int sc5239_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct sc5239 *sc5239 = to_sc5239(sd);
+
+	v4l2_async_unregister_subdev(sd);
+#ifdef CONFIG_MEDIA_CONTROLLER
+	media_entity_cleanup(&sd->entity);
+#endif
+	v4l2_ctrl_handler_free(&sc5239->ctrl_handler);
+	mutex_destroy(&sc5239->lock);
+	pm_runtime_disable(&client->dev);
+	if (!pm_runtime_status_suspended(&client->dev))
+		__sc5239_power_off(sc5239);
+	pm_runtime_set_suspended(&client->dev);
+	return 0;
+}
+
+static const struct i2c_device_id sc5239_match_id[] = {
+	{ "smartsens,sc5239", 0 },
+	{ },
+};
+
+static const struct of_device_id sc5239_of_match[] = {
+	{ .compatible = "smartsens,sc5239" },
+	{},
+};
+
+MODULE_DEVICE_TABLE(of, sc5239_of_match);
+
+static struct i2c_driver sc5239_i2c_driver = {
+	.driver = {
+		.name = SC5239_NAME,
+		.pm = &sc5239_pm_ops,
+		.of_match_table = of_match_ptr(sc5239_of_match),
+	},
+	.probe      = &sc5239_probe,
+	.remove     = &sc5239_remove,
+	.id_table   = sc5239_match_id,
+};
+
+static int __init sensor_mod_init(void)
+{
+	return i2c_add_driver(&sc5239_i2c_driver);
+}
+
+static void __exit sensor_mod_exit(void)
+{
+	i2c_del_driver(&sc5239_i2c_driver);
+}
+
+device_initcall_sync(sensor_mod_init);
+module_exit(sensor_mod_exit);
+
+MODULE_DESCRIPTION("Smartsens sc5239 Image Sensor driver");
+MODULE_LICENSE("GPL v2");

commit 34913157111b3a8ae1631daeb2d857959ec299cf
Author: Wang Panzhenzhuan <randy.wang@rock-chips.com>
Date:   Tue Aug 3 11:48:45 2021 +0800

    media: i2c: gc032a: set default stream off state
    
    Set sensor in stream off state by default,
    to avoid sending abnormal data in the early stage.
    
    Signed-off-by: Wang Panzhenzhuan <randy.wang@rock-chips.com>
    Change-Id: Iaae2fd3be95a5fcac05ebaf39a68614b7b807d4a

diff --git a/drivers/media/i2c/gc032a.c b/drivers/media/i2c/gc032a.c
index 01caa179fe33..1115d3035300 100644
--- a/drivers/media/i2c/gc032a.c
+++ b/drivers/media/i2c/gc032a.c
@@ -5,6 +5,8 @@
  * Copyright (C) 2020 Rockchip Electronics Co., Ltd.
  * V0.0X01.0X01 init driver.
  * V0.0X01.0X02 add quick stream on/off
+ * V0.0X01.0X03 set sensor in stream off state by default
+ * to avoid sending abnormal data in the early stage.
  */
 
 #include <linux/clk.h>
@@ -115,7 +117,7 @@ struct gc032a {
 
 static const struct sensor_register gc032a_vga_regs[] = {
 	/*System*/
-	{0xf3, 0xff},
+	{0xf3, 0x00},
 	{0xf5, 0x06},
 	{0xf7, 0x01},
 	{0xf8, 0x03},

commit eb37718088a0f2aa8d8c9763e4e52bd4f6b0b4dd
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Tue Aug 3 10:47:24 2021 +0800

    media: rockchip: ispp: reset at frame end
    
    Change-Id: I83d1bd9c4464fc138bf87f349e3f464b74eefd38
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/ispp/hw.c b/drivers/media/platform/rockchip/ispp/hw.c
index 7028b5e30b59..5c608738e129 100644
--- a/drivers/media/platform/rockchip/ispp/hw.c
+++ b/drivers/media/platform/rockchip/ispp/hw.c
@@ -323,7 +323,7 @@ static int rkispp_hw_probe(struct platform_device *pdev)
 	atomic_set(&hw_dev->refcnt, 0);
 	INIT_LIST_HEAD(&hw_dev->list);
 	hw_dev->is_idle = true;
-	hw_dev->is_single = true;
+	hw_dev->is_single = false;
 	hw_dev->is_fec_ext = false;
 	hw_dev->is_dma_contig = true;
 	hw_dev->is_dma_sg_ops = false;
diff --git a/drivers/media/platform/rockchip/ispp/params.c b/drivers/media/platform/rockchip/ispp/params.c
index e23808adc7c2..a25fbd1c21ac 100644
--- a/drivers/media/platform/rockchip/ispp/params.c
+++ b/drivers/media/platform/rockchip/ispp/params.c
@@ -320,7 +320,7 @@ static void nr_config(struct rkispp_params_vdev *params_vdev,
 		nobig_en = 0;
 	}
 
-	if (params_vdev->dev->hw_dev->is_single)
+	if (params_vdev->dev->hw_dev->dev_num == 1)
 		sd32_self_en = arg->uvnr_sd32_self_en;
 	val = arg->uvnr_step1_en << 1 | arg->uvnr_step2_en << 2 |
 	      arg->nr_gain_en << 3 | sd32_self_en << 4 |
diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c
index 3931cf566a29..b3e4385e88f1 100644
--- a/drivers/media/platform/rockchip/ispp/stream.c
+++ b/drivers/media/platform/rockchip/ispp/stream.c
@@ -3281,6 +3281,7 @@ void rkispp_module_work_event(struct rkispp_device *dev,
 	      ((module == ISPP_MODULE_NR && is_single) ||
 	       (module == ISPP_MODULE_FEC && !is_single))))) {
 		dev->stream_vdev.monitor.retry = 0;
+		rkispp_soft_reset(dev->hw_dev);
 		rkispp_event_handle(dev, CMD_QUEUE_DMABUF, NULL);
 	}
 
@@ -3314,7 +3315,8 @@ void rkispp_isr(u32 mis_val, struct rkispp_device *dev)
 	if (mis_val & err_mask) {
 		dev->isr_err_cnt++;
 		v4l2_err(&dev->v4l2_dev,
-			 "ispp err:0x%x\n", mis_val);
+			 "ispp err:0x%x, seq:%d\n",
+			 mis_val, dev->ispp_sdev.frm_sync_seq);
 	}
 
 	if (mis_val & TNR_INT) {

commit 20e9c1ac5485c0bc453bb844e5c2995e5a8e0366
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Wed Jul 7 09:27:45 2021 +0800

    media: rockchip: ispp: frame buffer done early
    
    config wait-line to ispp virtual device dts node,
    or ispp debug node before open ispp video.
    /sys/module/video_rkispp/parameters/wait_line
    
    for example: output is 2688x1520, config
    wait-line to 768 (128 align), vb2 buffer
    will done when poll image processing greater
    than 768, wait-line less than (height - 128) is valid.
    
    Change-Id: I4a448cc6baffbb5794eef91965e4b2bc349aa5ed
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/ispp/dev.c b/drivers/media/platform/rockchip/ispp/dev.c
index 863a12f62589..4eebe1f0d5e1 100644
--- a/drivers/media/platform/rockchip/ispp/dev.c
+++ b/drivers/media/platform/rockchip/ispp/dev.c
@@ -60,6 +60,10 @@ unsigned int rkispp_debug_reg = 0x1F;
 module_param_named(debug_reg, rkispp_debug_reg, uint, 0644);
 MODULE_PARM_DESC(debug_reg, "rkispp debug register");
 
+static unsigned int rkispp_wait_line;
+module_param_named(wait_line, rkispp_wait_line, uint, 0644);
+MODULE_PARM_DESC(wait_line, "rkispp wait line to buf done early");
+
 void rkispp_set_clk_rate(struct clk *clk, unsigned long rate)
 {
 	if (rkispp_clk_dbg)
@@ -297,6 +301,9 @@ static int rkispp_plat_probe(struct platform_device *pdev)
 	if (ret < 0)
 		goto err_unreg_media_dev;
 
+	rkispp_wait_line = 0;
+	of_property_read_u32(pdev->dev.of_node, "wait-line",
+			     &rkispp_wait_line);
 	rkispp_proc_init(ispp_dev);
 	pm_runtime_enable(&pdev->dev);
 
@@ -347,6 +354,7 @@ static int __maybe_unused rkispp_runtime_resume(struct device *dev)
 	ispp_dev->isp_mode = rkisp_ispp_mode;
 	ispp_dev->stream_sync = rkispp_stream_sync;
 	ispp_dev->stream_vdev.monitor.is_en = rkispp_monitor;
+	ispp_dev->stream_vdev.wait_line = rkispp_wait_line;
 
 	mutex_lock(&ispp_dev->hw_dev->dev_lock);
 	ret = pm_runtime_get_sync(ispp_dev->hw_dev->dev);
diff --git a/drivers/media/platform/rockchip/ispp/params.c b/drivers/media/platform/rockchip/ispp/params.c
index aeeea2c6785e..e23808adc7c2 100644
--- a/drivers/media/platform/rockchip/ispp/params.c
+++ b/drivers/media/platform/rockchip/ispp/params.c
@@ -729,6 +729,24 @@ rkispp_param_init_fecbuf(struct rkispp_params_vdev *params,
 		fec_data->meshyf_oft = fec_data->meshxf_oft + ALIGN(mesh_size, 16);
 		fec_data->meshxi_oft = fec_data->meshyf_oft + ALIGN(mesh_size, 16);
 		fec_data->meshyi_oft = fec_data->meshxi_oft + ALIGN(mesh_size * 2, 16);
+
+		if (!i) {
+			u32 val, dma_addr = params->buf_fec[i].dma_addr;
+
+			val = dma_addr + fec_data->meshxf_oft;
+			rkispp_write(pp_dev, RKISPP_FEC_MESH_XFRA_BASE, val);
+			val = dma_addr + fec_data->meshyf_oft;
+			rkispp_write(pp_dev, RKISPP_FEC_MESH_YFRA_BASE, val);
+			val = dma_addr + fec_data->meshxi_oft;
+			rkispp_write(pp_dev, RKISPP_FEC_MESH_XINT_BASE, val);
+			val = dma_addr + fec_data->meshyi_oft;
+			rkispp_write(pp_dev, RKISPP_FEC_MESH_YINT_BASE, val);
+		}
+		v4l2_dbg(1, rkispp_debug, &pp_dev->v4l2_dev,
+			 "%s idx:%d fd:%d dma:0x%x offset xf:0x%x yf:0x%x xi:0x%x yi:0x%x\n",
+			 __func__, i, params->buf_fec[i].dma_fd, params->buf_fec[i].dma_addr,
+			fec_data->meshxf_oft, fec_data->meshyf_oft,
+			fec_data->meshxi_oft, fec_data->meshyi_oft);
 	}
 
 	return 0;
diff --git a/drivers/media/platform/rockchip/ispp/regs.h b/drivers/media/platform/rockchip/ispp/regs.h
index fce1b09b1f15..e44e3a8eb134 100644
--- a/drivers/media/platform/rockchip/ispp/regs.h
+++ b/drivers/media/platform/rockchip/ispp/regs.h
@@ -405,6 +405,21 @@
 #define GLB_ISP2NR_DIF(a)		(((a) & 0xff) << 8)
 #define GLB_NR2FEC_DIF(a)		((a) & 0xff)
 
+/* SYS_STATUS */
+#define TNR_WORKING			BIT(0)
+#define NR_WORKING			BIT(1)
+#define SHP_WORKING			BIT(2)
+#define ORB_WORKING			BIT(3)
+#define SCL0_WORKING			BIT(4)
+#define SCL1_WORKING			BIT(5)
+#define SCL2_WORKING			BIT(6)
+#define FEC_WORKING			BIT(7)
+
+/* SYS_CTL_STA0 */
+#define TNR_TILE_LINE_CNT_MASK		GENMASK(6, 0)
+#define NR_TILE_LINE_CNT_MASK		GENMASK(14, 8)
+#define FEC_TILE_LINE_CNT_MASK		GENMASK(22, 16)
+
 /* TNR CTRL */
 #define SW_TNR_WR_FORMAT_MASK		GENMASK(7, 4)
 #define SW_TNR_RD_FORMAT_MASK		GENMASK(3, 0)
diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c
index 451d268b9f8e..3931cf566a29 100644
--- a/drivers/media/platform/rockchip/ispp/stream.c
+++ b/drivers/media/platform/rockchip/ispp/stream.c
@@ -371,9 +371,9 @@ static void irq_work(struct work_struct *work)
 {
 	struct rkispp_device *dev = container_of(work, struct rkispp_device, irq_work);
 
-	dev->hw_dev->is_first = false;
 	rkispp_set_clk_rate(dev->hw_dev->clks[0], dev->hw_dev->core_clk_max);
 	check_to_force_update(dev, dev->mis_val);
+	dev->hw_dev->is_first = false;
 }
 
 static void update_mi(struct rkispp_stream *stream)
@@ -402,7 +402,7 @@ static void update_mi(struct rkispp_stream *stream)
 		 rkispp_read(dev, stream->config->reg.cur_uv_base));
 }
 
-static int rkispp_frame_end(struct rkispp_stream *stream)
+static int rkispp_frame_end(struct rkispp_stream *stream, u32 state)
 {
 	struct rkispp_device *dev = stream->isppdev;
 	struct capture_fmt *fmt = &stream->out_cap_fmt;
@@ -410,6 +410,9 @@ static int rkispp_frame_end(struct rkispp_stream *stream)
 	unsigned long lock_flags = 0;
 	int i = 0;
 
+	if (state == FRAME_IRQ && dev->stream_vdev.is_done_early)
+		return 0;
+
 	if (stream->curr_buf) {
 		struct rkispp_stream *vir = &dev->stream_vdev.stream[STREAM_VIR];
 		u64 ns = dev->ispp_sdev.frame_timestamp;
@@ -499,6 +502,85 @@ static int rkispp_frame_end(struct rkispp_stream *stream)
 	return 0;
 }
 
+static bool is_en_done_early(struct rkispp_device *dev)
+{
+	u32 height = dev->ispp_sdev.out_fmt.height;
+	u32 line = dev->stream_vdev.wait_line;
+	bool en =  false;
+
+	if (line) {
+		if (line > height - 128)
+			dev->stream_vdev.wait_line = height - 128;
+		en = true;
+		v4l2_dbg(1, rkispp_debug, &dev->v4l2_dev,
+			 "wait %d line to wake up frame\n", line);
+	}
+
+	return en;
+}
+
+static enum hrtimer_restart rkispp_frame_done_early(struct hrtimer *timer)
+{
+	struct rkispp_stream_vdev *vdev =
+		container_of(timer, struct rkispp_stream_vdev, frame_qst);
+	struct rkispp_stream *stream = &vdev->stream[0];
+	struct rkispp_device *dev = stream->isppdev;
+	void __iomem *base = dev->hw_dev->base_addr;
+	bool is_fec_en = (vdev->module_ens & ISPP_MODULE_FEC);
+	enum hrtimer_restart ret = HRTIMER_NORESTART;
+	u32 threshold = vdev->wait_line / 128;
+	u32 tile, tile_mask, working, work_mask;
+	u32 i, seq, ycnt, shift, time, max_time;
+	u64 t, ns = ktime_get_ns();
+
+	working = readl(base + RKISPP_CTRL_SYS_STATUS);
+	tile = readl(base + RKISPP_CTRL_SYS_CTL_STA0);
+	if (is_fec_en) {
+		shift = 16;
+		work_mask = FEC_WORKING;
+		tile_mask = FEC_TILE_LINE_CNT_MASK;
+		t = vdev->fec.dbg.timestamp;
+		seq = vdev->fec.dbg.id;
+		max_time = 6000000;
+	} else {
+		shift = 8;
+		work_mask = NR_WORKING;
+		tile_mask = NR_TILE_LINE_CNT_MASK;
+		t = vdev->nr.dbg.timestamp;
+		seq = vdev->nr.dbg.id;
+		max_time = 2000000;
+	}
+	working &= work_mask;
+	tile &= tile_mask;
+	ycnt = tile >> shift;
+	time = (u32)(ns - t);
+	if (dev->ispp_sdev.state == ISPP_STOP) {
+		vdev->is_done_early = false;
+		goto end;
+	} else if (working && ycnt < threshold) {
+		if (!ycnt)
+			ns = max_time;
+		else
+			ns = time * (threshold - ycnt) / ycnt + 100 * 1000;
+		if (ns > max_time)
+			ns = max_time;
+		hrtimer_forward(timer, timer->base->get_time(), ns_to_ktime(ns));
+		ret = HRTIMER_RESTART;
+	} else {
+		v4l2_dbg(3, rkispp_debug, &stream->isppdev->v4l2_dev,
+			 "%s seq:%d line:%d ycnt:%d time:%dus\n",
+			 __func__, seq, vdev->wait_line, ycnt * 128, time / 1000);
+		for (i = 0; i < STREAM_MAX; i++) {
+			stream = &vdev->stream[i];
+			if (!stream->streaming || !stream->is_cfg || stream->stopping)
+				continue;
+			rkispp_frame_end(stream, FRAME_WORK);
+		}
+	}
+end:
+	return ret;
+}
+
 static void *get_pool_buf(struct rkispp_device *dev,
 			  struct rkisp_ispp_buf *dbufs)
 {
@@ -817,7 +899,8 @@ static int nr_init_buf(struct rkispp_device *dev, u32 size)
 	int i, ret, cnt = 0;
 
 	if (vdev->module_ens & ISPP_MODULE_FEC)
-		cnt = RKISPP_BUF_MAX;
+		cnt = vdev->is_done_early ? 1 : RKISPP_BUF_MAX;
+
 	for (i = 0; i < cnt; i++) {
 		buf = &vdev->nr.buf.wr[i];
 		buf->size = size;
@@ -856,6 +939,8 @@ static int config_nr_shp(struct rkispp_device *dev)
 	if (!(vdev->module_ens & (ISPP_MODULE_NR | ISPP_MODULE_SHP)))
 		return 0;
 
+	vdev->is_done_early = is_en_done_early(dev);
+
 	if (dev->inp == INP_DDR) {
 		stream = &vdev->stream[STREAM_II];
 		fmt = stream->out_cap_fmt.wr_fmt;
@@ -931,6 +1016,9 @@ static int config_nr_shp(struct rkispp_device *dev)
 		rkispp_write(dev, RKISPP_SHARP_WR_UV_BASE, val + addr_offs);
 		rkispp_write(dev, RKISPP_SHARP_WR_VIR_STRIDE, ALIGN(width * mult, 16) >> 2);
 		rkispp_set_bits(dev, RKISPP_SHARP_CTRL, SW_SHP_WR_FORMAT_MASK, fmt & (~FMT_FBC));
+
+		rkispp_write(dev, RKISPP_FEC_RD_Y_BASE, val);
+		rkispp_write(dev, RKISPP_FEC_RD_UV_BASE, val + addr_offs);
 	} else {
 		stream = &vdev->stream[STREAM_MB];
 		if (!stream->streaming) {
@@ -1212,7 +1300,7 @@ static void secure_config_mb(struct rkispp_stream *stream)
 	set_vir_stride(stream, ALIGN(stream->out_fmt.width * mult, 16) >> 2);
 
 	/* config first buf */
-	rkispp_frame_end(stream);
+	rkispp_frame_end(stream, FRAME_INIT);
 
 	stream->is_cfg = true;
 }
@@ -1331,7 +1419,7 @@ static int config_scl(struct rkispp_stream *stream)
 		SW_SCL_WR_UV_DIS | SW_SCL_BYPASS;
 
 	/* config first buf */
-	rkispp_frame_end(stream);
+	rkispp_frame_end(stream, FRAME_INIT);
 	if (hy_fac == 8193 && vy_fac == 8193)
 		val |= SW_SCL_BYPASS;
 	if (fmt->wr_fmt & FMT_YUYV)
@@ -2316,7 +2404,7 @@ static void monitor_init(struct rkispp_device *dev)
 
 static void fec_work_event(struct rkispp_device *dev,
 			   struct rkispp_dummy_buffer *buf_rd,
-			   bool is_isr)
+			   bool is_isr, bool is_quick)
 {
 	struct rkispp_stream_vdev *vdev = &dev->stream_vdev;
 	struct rkispp_monitor *monitor = &vdev->monitor;
@@ -2325,23 +2413,20 @@ static void fec_work_event(struct rkispp_device *dev,
 	struct rkispp_dummy_buffer *dummy;
 	struct rkispp_stream *stream;
 	unsigned long lock_flags = 0, lock_flags1 = 0;
-	bool is_start = false, is_quick = false;
+	bool is_start = false;
 	struct rkisp_ispp_reg *reg_buf = NULL;
 	u32 val;
 
 	if (!(vdev->module_ens & ISPP_MODULE_FEC))
 		return;
 
-	if (dev->inp == INP_ISP && dev->isp_mode & ISP_ISPP_QUICK)
-		is_quick = true;
-
 	spin_lock_irqsave(&vdev->fec.buf_lock, lock_flags);
 
 	/* event from fec frame end */
 	if (!buf_rd && is_isr) {
 		vdev->fec.is_end = true;
 
-		if (vdev->fec.cur_rd)
+		if (vdev->fec.cur_rd || vdev->is_done_early)
 			rkispp_module_work_event(dev, NULL, vdev->fec.cur_rd,
 						 ISPP_MODULE_NR, false);
 		vdev->fec.cur_rd = NULL;
@@ -2380,14 +2465,19 @@ static void fec_work_event(struct rkispp_device *dev,
 		is_start = true;
 	}
 
-	if (is_start) {
+	if (is_start || is_quick) {
 		u32 seq = 0;
 
-		if (vdev->fec.cur_rd && !is_quick) {
+		if (vdev->fec.cur_rd) {
 			seq = vdev->fec.cur_rd->id;
 			dev->ispp_sdev.frame_timestamp =
 				vdev->fec.cur_rd->timestamp;
 			dev->ispp_sdev.frm_sync_seq = seq;
+		} else {
+			seq = vdev->nr.buf.wr[0].id;
+			dev->ispp_sdev.frame_timestamp =
+				vdev->nr.buf.wr[0].timestamp;
+			dev->ispp_sdev.frm_sync_seq = seq;
 		}
 
 		stream = &vdev->stream[STREAM_MB];
@@ -2414,8 +2504,13 @@ static void fec_work_event(struct rkispp_device *dev,
 			}
 		}
 		v4l2_dbg(3, rkispp_debug, &dev->v4l2_dev,
-			 "FEC start seq:%d | Y_SHD rd:0x%x\n",
-			 seq, readl(base + RKISPP_FEC_RD_Y_BASE_SHD));
+			 "FEC start seq:%d | Y_SHD rd:0x%x\n"
+			 "\txint:0x%x xfra:0x%x yint:0x%x yfra:0x%x\n",
+			 seq, readl(base + RKISPP_FEC_RD_Y_BASE_SHD),
+			 readl(base + RKISPP_FEC_MESH_XINT_BASE_SHD),
+			 readl(base + RKISPP_FEC_MESH_XFRA_BASE_SHD),
+			 readl(base + RKISPP_FEC_MESH_YINT_BASE_SHD),
+			 readl(base + RKISPP_FEC_MESH_YFRA_BASE_SHD));
 
 		vdev->fec.dbg.id = seq;
 		vdev->fec.dbg.timestamp = ktime_get_ns();
@@ -2441,8 +2536,14 @@ static void fec_work_event(struct rkispp_device *dev,
 			reg_buf->reg_size = offset;
 		}
 
-		if (!dev->hw_dev->is_shutdown)
+		if (!dev->hw_dev->is_shutdown) {
 			writel(FEC_ST, base + RKISPP_CTRL_STRT);
+
+			if (vdev->is_done_early)
+				hrtimer_start(&vdev->frame_qst,
+					      ns_to_ktime(5000000),
+					      HRTIMER_MODE_REL);
+		}
 		vdev->fec.is_end = false;
 	}
 restart_unlock:
@@ -2450,6 +2551,39 @@ static void fec_work_event(struct rkispp_device *dev,
 	spin_unlock_irqrestore(&vdev->fec.buf_lock, lock_flags);
 }
 
+static enum hrtimer_restart rkispp_fec_do_early(struct hrtimer *timer)
+{
+	struct rkispp_stream_vdev *vdev =
+		container_of(timer, struct rkispp_stream_vdev, fec_qst);
+	struct rkispp_stream *stream = &vdev->stream[0];
+	struct rkispp_device *dev = stream->isppdev;
+	void __iomem *base = dev->hw_dev->base_addr;
+	enum hrtimer_restart ret = HRTIMER_NORESTART;
+	u32 ycnt, tile = readl(base + RKISPP_CTRL_SYS_CTL_STA0);
+	u32 working = readl(base + RKISPP_CTRL_SYS_STATUS);
+	u64 ns = ktime_get_ns();
+	u32 time;
+
+	working &= NR_WORKING;
+	tile &= NR_TILE_LINE_CNT_MASK;
+	ycnt = tile >> 8;
+	time = (u32)(ns - vdev->nr.dbg.timestamp);
+	if (dev->ispp_sdev.state == ISPP_STOP) {
+		vdev->is_done_early = false;
+		goto end;
+	} else if (working && !ycnt) {
+		hrtimer_forward(timer, timer->base->get_time(), ns_to_ktime(500000));
+		ret = HRTIMER_RESTART;
+	} else {
+		v4l2_dbg(3, rkispp_debug, &dev->v4l2_dev,
+			 "%s seq:%d ycnt:%d time:%dus\n",
+			 __func__, vdev->nr.dbg.id, ycnt * 128, time / 1000);
+		fec_work_event(dev, NULL, false, true);
+	}
+end:
+	return ret;
+}
+
 static void nr_work_event(struct rkispp_device *dev,
 			  struct rkisp_ispp_buf *buf_rd,
 			  struct rkispp_dummy_buffer *buf_wr,
@@ -2505,6 +2639,9 @@ static void nr_work_event(struct rkispp_device *dev,
 			/* nr write buf to fec */
 			buf_to_fec = vdev->nr.cur_wr;
 			vdev->nr.cur_wr = NULL;
+
+			if (vdev->is_done_early && !dev->hw_dev->is_first)
+				buf_to_fec = NULL;
 		}
 	}
 
@@ -2613,6 +2750,9 @@ static void nr_work_event(struct rkispp_device *dev,
 			if (vdev->nr.cur_wr) {
 				vdev->nr.cur_wr->id = seq;
 				vdev->nr.cur_wr->timestamp = timestamp;
+			} else {
+				vdev->nr.buf.wr[0].id = seq;
+				vdev->nr.buf.wr[0].timestamp = timestamp;
 			}
 			if (!is_fec_en && !is_quick) {
 				dev->ispp_sdev.frame_timestamp = timestamp;
@@ -2700,8 +2840,14 @@ static void nr_work_event(struct rkispp_device *dev,
 			reg_buf->reg_size = offset;
 		}
 
-		if (!is_quick && !dev->hw_dev->is_shutdown)
+		if (!is_quick && !dev->hw_dev->is_shutdown) {
 			writel(NR_SHP_ST, base + RKISPP_CTRL_STRT);
+
+			if (!is_fec_en && vdev->is_done_early)
+				hrtimer_start(&vdev->frame_qst,
+					      ns_to_ktime(1000000),
+					      HRTIMER_MODE_REL);
+		}
 		vdev->nr.is_end = false;
 	}
 restart_unlock:
@@ -2715,6 +2861,12 @@ static void nr_work_event(struct rkispp_device *dev,
 		rkispp_module_work_event(dev, buf_to_fec, NULL,
 					 ISPP_MODULE_FEC, is_isr);
 	spin_unlock_irqrestore(&vdev->nr.buf_lock, lock_flags);
+
+	if (is_fec_en && vdev->is_done_early &&
+	    is_start && !dev->hw_dev->is_first)
+		hrtimer_start(&vdev->fec_qst,
+			      ns_to_ktime(1000000),
+			      HRTIMER_MODE_REL);
 }
 
 static void tnr_work_event(struct rkispp_device *dev,
@@ -3093,6 +3245,9 @@ void rkispp_module_work_event(struct rkispp_device *dev,
 			      u32 module, bool is_isr)
 {
 	struct rkispp_stream_vdev *vdev = &dev->stream_vdev;
+	bool is_fec_en = !!(vdev->module_ens & ISPP_MODULE_FEC);
+	bool is_single = dev->hw_dev->is_single;
+	//bool is_early = vdev->is_done_early;
 
 	if (dev->hw_dev->is_shutdown)
 		return;
@@ -3103,18 +3258,28 @@ void rkispp_module_work_event(struct rkispp_device *dev,
 		else if (module & ISPP_MODULE_NR)
 			nr_work_event(dev, buf_rd, buf_wr, is_isr);
 		else
-			fec_work_event(dev, buf_rd, is_isr);
+			fec_work_event(dev, buf_rd, is_isr, false);
 	}
 
-	/* cur frame (tnr->nr->fec) done for next frame
-	 * fec start at nr end if fec enable, and fec can async with
-	 * tnr different frames for single device.
-	 * tnr->nr->fec frame0
-	 *       |->tnr->nr->fec frame1
+	/*
+	 * ispp frame done to do next conditions
+	 * mulit dev: cur frame (tnr->nr->fec) done for next frame
+	 * 1.single dev: fec async with tnr, and sync with nr:
+	 *   {    f0    }
+	 *   tnr->nr->fec->|
+	 *          |->tnr->nr->fec
+	 *             {    f1    }
+	 * 2.single dev and early mode:
+	 *   {  f0 }  {  f1 }  {  f2 }
+	 *   tnr->nr->tnr->nr->tnr->nr
+	 *        |->fec->||->fec->|
+	 *        {   f0  }{   f1  }
 	 */
 	if (is_isr && !buf_rd && !buf_wr &&
-	    ((module == ISPP_MODULE_FEC && !dev->hw_dev->is_single) ||
-	     (module == ISPP_MODULE_NR && (dev->hw_dev->is_single || vdev->fec.is_end)))) {
+	    ((!is_fec_en && module == ISPP_MODULE_NR) ||
+	     (is_fec_en &&
+	      ((module == ISPP_MODULE_NR && is_single) ||
+	       (module == ISPP_MODULE_FEC && !is_single))))) {
 		dev->stream_vdev.monitor.retry = 0;
 		rkispp_event_handle(dev, CMD_QUEUE_DMABUF, NULL);
 	}
@@ -3201,7 +3366,7 @@ void rkispp_isr(u32 mis_val, struct rkispp_device *dev)
 			stream->is_upd = false;
 			wake_up(&stream->done);
 		} else if (i != STREAM_II) {
-			rkispp_frame_end(stream);
+			rkispp_frame_end(stream, FRAME_IRQ);
 		}
 	}
 
@@ -3236,6 +3401,11 @@ int rkispp_register_stream_vdevs(struct rkispp_device *dev)
 	spin_lock_init(&stream_vdev->fec.buf_lock);
 	stream_vdev->tnr.is_but_init = false;
 
+	hrtimer_init(&stream_vdev->fec_qst, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+	stream_vdev->fec_qst.function = rkispp_fec_do_early;
+	hrtimer_init(&stream_vdev->frame_qst, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+	stream_vdev->frame_qst.function = rkispp_frame_done_early;
+
 	for (i = 0; i < STREAM_MAX; i++) {
 		stream = &stream_vdev->stream[i];
 		stream->id = i;
diff --git a/drivers/media/platform/rockchip/ispp/stream.h b/drivers/media/platform/rockchip/ispp/stream.h
index 5fb071460910..07c981a5ef6e 100644
--- a/drivers/media/platform/rockchip/ispp/stream.h
+++ b/drivers/media/platform/rockchip/ispp/stream.h
@@ -217,9 +217,13 @@ struct rkispp_stream_vdev {
 	struct rkispp_monitor monitor;
 	struct rkispp_vir_cpy vir_cpy;
 	struct rkisp_ispp_buf input[VIDEO_MAX_FRAME];
+	struct hrtimer fec_qst;
+	struct hrtimer frame_qst;
 	atomic_t refcnt;
 	u32 module_ens;
 	u32 irq_ends;
+	u32 wait_line;
+	bool is_done_early;
 };
 
 int rkispp_get_tnrbuf_fd(struct rkispp_device *dev, struct rkispp_buf_idxfd *idxfd);

commit f28667e0c58abad160c519094052a4da4b8e4e88
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Thu Jul 8 18:16:32 2021 +0800

    media: rockchip: isp: frame buffer done early
    
    config wait-line to isp virtual device dts node,
    or echo value to debug node before open isp video.
    /sys/module/video_rkisp/parameters/wait_line
    
    Change-Id: I5c73c90117455663620b4c025e78aa6233ca40b9
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/bridge.c b/drivers/media/platform/rockchip/isp/bridge.c
index 61ced4505cb4..7cc018622e23 100644
--- a/drivers/media/platform/rockchip/isp/bridge.c
+++ b/drivers/media/platform/rockchip/isp/bridge.c
@@ -511,14 +511,18 @@ static void rkisp_bridge_work(struct work_struct *work)
 	kfree(br_wk);
 }
 
-static int frame_end(struct rkisp_bridge_device *dev, bool en)
+static int frame_end(struct rkisp_bridge_device *dev, bool en, u32 state)
 {
-	struct rkisp_hw_dev *hw = dev->ispdev->hw_dev;
+	struct rkisp_device *ispdev = dev->ispdev;
+	struct rkisp_hw_dev *hw = ispdev->hw_dev;
 	struct v4l2_subdev *sd = v4l2_get_subdev_hostdata(&dev->sd);
 	unsigned long lock_flags = 0;
 	u64 ns = ktime_get_ns();
 	struct rkisp_bridge_buf *buf;
 
+	if (state == FRAME_IRQ && ispdev->cap_dev.is_done_early)
+		return 0;
+
 	rkisp_dmarx_get_frame(dev->ispdev, &dev->dbg.id, NULL, NULL, true);
 	dev->dbg.interval = ns - dev->dbg.timestamp;
 	dev->dbg.timestamp = ns;
@@ -591,9 +595,8 @@ static int frame_end(struct rkisp_bridge_device *dev, bool en)
 			}
 		}
 		hw->cur_buf = NULL;
-	} else if (dev->ispdev->send_fbcgain) {
-		v4l2_dbg(1, rkisp_debug, &dev->sd,
-			 "use dummy buffer, lost fbcgain data, frm_id %d\n", dev->dbg.id);
+	} else {
+		v4l2_dbg(1, rkisp_debug, &dev->sd, "no buf, lost frame:%d\n", dev->dbg.id);
 	}
 
 	if (hw->nxt_buf) {
@@ -604,6 +607,41 @@ static int frame_end(struct rkisp_bridge_device *dev, bool en)
 	return 0;
 }
 
+static enum hrtimer_restart rkisp_bridge_frame_done_early(struct hrtimer *timer)
+{
+	struct rkisp_bridge_device *br =
+		container_of(timer, struct rkisp_bridge_device, frame_qst);
+	struct rkisp_device *dev = br->ispdev;
+	enum hrtimer_restart ret = HRTIMER_NORESTART;
+	u32 ycnt, line = dev->cap_dev.wait_line;
+	u32 seq, time, max_time = 1000000;
+	u64 ns = ktime_get_ns();
+
+	time = (u32)(ns - br->fs_ns);
+	ycnt = rkisp_read(dev, ISP_MPFBC_ENC_POS, true) & 0x3ff;
+	ycnt *= 8;
+	rkisp_dmarx_get_frame(dev, &seq, NULL, NULL, true);
+	if (!br->en || dev->isp_state == ISP_STOP) {
+		goto end;
+	} else if (ycnt < line) {
+		if (!ycnt)
+			ns = max_time;
+		else
+			ns = time * (line - ycnt) / ycnt;
+		if (ns > max_time)
+			ns = max_time;
+		hrtimer_forward(timer, timer->base->get_time(), ns_to_ktime(ns));
+		ret = HRTIMER_RESTART;
+	} else {
+		v4l2_dbg(3, rkisp_debug, &dev->v4l2_dev,
+			 "%s seq:%d line:%d ycnt:%d time:%dus\n",
+			 __func__, seq, line, ycnt, time / 1000);
+		frame_end(br, br->en, FRAME_WORK);
+	}
+end:
+	return ret;
+}
+
 static int config_gain(struct rkisp_bridge_device *dev)
 {
 	u32 w = dev->crop.width;
@@ -1002,6 +1040,7 @@ static void crop_off(struct rkisp_bridge_device *dev)
 
 static int bridge_start(struct rkisp_bridge_device *dev)
 {
+	struct rkisp_device *ispdev = dev->ispdev;
 	struct rkisp_stream *sp_stream;
 
 	sp_stream = &dev->ispdev->cap_dev.stream[RKISP_STREAM_SP];
@@ -1019,6 +1058,15 @@ static int bridge_start(struct rkisp_bridge_device *dev)
 	dev->ispdev->skip_frame = 0;
 	rkisp_stats_first_ddr_config(&dev->ispdev->stats_vdev);
 	dev->en = true;
+
+	ispdev->cap_dev.is_done_early = false;
+	if (ispdev->send_fbcgain)
+		ispdev->cap_dev.wait_line = 0;
+	if (ispdev->cap_dev.wait_line) {
+		if (ispdev->cap_dev.wait_line < dev->crop.height / 4)
+			ispdev->cap_dev.wait_line = dev->crop.height / 4;
+		ispdev->cap_dev.is_done_early = true;
+	}
 	return 0;
 }
 
@@ -1455,6 +1503,7 @@ void rkisp_bridge_update_mi(struct rkisp_device *dev)
 	    br->work_mode & ISP_ISPP_QUICK)
 		return;
 
+	br->fs_ns = ktime_get_ns();
 	spin_lock_irqsave(&hw->buf_lock, lock_flags);
 	if (!hw->nxt_buf && !list_empty(&hw->list)) {
 		hw->nxt_buf = list_first_entry(&hw->list,
@@ -1473,6 +1522,9 @@ void rkisp_bridge_update_mi(struct rkisp_device *dev)
 		rkisp_write(dev, br->cfg->reg.g0_base, val, true);
 	}
 
+	if (dev->cap_dev.is_done_early)
+		hrtimer_start(&br->frame_qst, ns_to_ktime(1000000), HRTIMER_MODE_REL);
+
 	v4l2_dbg(2, rkisp_debug, &br->sd,
 		 "update pic(shd:0x%x base:0x%x) gain(shd:0x%x base:0x%x)\n",
 		 rkisp_read(dev, br->cfg->reg.y0_base_shd, true),
@@ -1509,7 +1561,7 @@ void rkisp_bridge_isr(u32 *mis_val, struct rkisp_device *dev)
 
 	irq = (irq == MI_MPFBC_FRAME) ? ISP_FRAME_MPFBC : ISP_FRAME_MP;
 	if (!(bridge->work_mode & ISP_ISPP_QUICK)) {
-		frame_end(bridge, bridge->en);
+		frame_end(bridge, bridge->en, FRAME_IRQ);
 		if (!bridge->en)
 			dev->irq_ends_mask &= ~irq;
 	}
@@ -1556,6 +1608,8 @@ int rkisp_register_bridge_subdev(struct rkisp_device *dev,
 	init_waitqueue_head(&bridge->done);
 	bridge->wq = alloc_workqueue("rkisp bridge workqueue",
 				     WQ_UNBOUND | WQ_MEM_RECLAIM, 1);
+	hrtimer_init(&bridge->frame_qst, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+	bridge->frame_qst.function = rkisp_bridge_frame_done_early;
 	return ret;
 
 free_media:
diff --git a/drivers/media/platform/rockchip/isp/bridge.h b/drivers/media/platform/rockchip/isp/bridge.h
index 97fbd79fc7c3..1a3fb69bfb2a 100644
--- a/drivers/media/platform/rockchip/isp/bridge.h
+++ b/drivers/media/platform/rockchip/isp/bridge.h
@@ -56,13 +56,15 @@ struct rkisp_bridge_device {
 	struct rkisp_bridge_ops *ops;
 	struct rkisp_bridge_config *cfg;
 	struct frame_debug_info dbg;
+	struct workqueue_struct *wq;
+	struct hrtimer frame_qst;
+	u64 fs_ns;
 	u8 work_mode;
 	u8 buf_num;
 	bool pingpong;
 	bool stopping;
 	bool linked;
 	bool en;
-	struct workqueue_struct *wq;
 };
 
 int rkisp_register_bridge_subdev(struct rkisp_device *dev,
diff --git a/drivers/media/platform/rockchip/isp/capture.h b/drivers/media/platform/rockchip/isp/capture.h
index 96d552e76e92..c1755386e96d 100644
--- a/drivers/media/platform/rockchip/isp/capture.h
+++ b/drivers/media/platform/rockchip/isp/capture.h
@@ -238,6 +238,8 @@ struct rkisp_capture_device {
 	struct rkisp_stream stream[RKISP_MAX_STREAM];
 	struct rkisp_buffer *rdbk_buf[RDBK_MAX];
 	atomic_t refcnt;
+	u32 wait_line;
+	bool is_done_early;
 };
 
 extern struct stream_config rkisp_mp_stream_config;
diff --git a/drivers/media/platform/rockchip/isp/dev.c b/drivers/media/platform/rockchip/isp/dev.c
index 20bcb4f53a21..30687acfa0ce 100644
--- a/drivers/media/platform/rockchip/isp/dev.c
+++ b/drivers/media/platform/rockchip/isp/dev.c
@@ -75,6 +75,10 @@ u64 rkisp_debug_reg = 0xFFFFFFFFFLL;
 module_param_named(debug_reg, rkisp_debug_reg, ullong, 0644);
 MODULE_PARM_DESC(debug_reg, "rkisp debug register");
 
+static unsigned int rkisp_wait_line;
+module_param_named(wait_line, rkisp_wait_line, uint, 0644);
+MODULE_PARM_DESC(wait_line, "rkisp wait line to buf done early");
+
 static DEFINE_MUTEX(rkisp_dev_mutex);
 static LIST_HEAD(rkisp_device_list);
 
@@ -776,6 +780,9 @@ static int rkisp_plat_probe(struct platform_device *pdev)
 	if (ret < 0)
 		goto err_unreg_media_dev;
 
+	rkisp_wait_line = 0;
+	of_property_read_u32(dev->of_node, "wait-line", &rkisp_wait_line);
+
 	rkisp_proc_init(isp_dev);
 
 	mutex_lock(&rkisp_dev_mutex);
@@ -828,6 +835,7 @@ static int __maybe_unused rkisp_runtime_resume(struct device *dev)
 	struct rkisp_device *isp_dev = dev_get_drvdata(dev);
 	int ret;
 
+	isp_dev->cap_dev.wait_line = rkisp_wait_line;
 	mutex_lock(&isp_dev->hw_dev->dev_lock);
 	ret = pm_runtime_get_sync(isp_dev->hw_dev->dev);
 	mutex_unlock(&isp_dev->hw_dev->dev_lock);
diff --git a/drivers/media/platform/rockchip/isp/isp_ispp.h b/drivers/media/platform/rockchip/isp/isp_ispp.h
index 8cce504bfbdf..a8804a8c4f4c 100644
--- a/drivers/media/platform/rockchip/isp/isp_ispp.h
+++ b/drivers/media/platform/rockchip/isp/isp_ispp.h
@@ -29,6 +29,12 @@
 #define RKISP_ISPP_CMD_GET_REG_WITHSTREAM	\
 	_IOW('V', BASE_VIDIOC_PRIVATE + 3, bool)
 
+enum frame_end_state {
+	FRAME_INIT,
+	FRAME_IRQ,
+	FRAME_WORK,
+};
+
 enum rkisp_ispp_dev {
 	DEV_ID0 = 0,
 	DEV_ID1,

commit d8ab4596ea360b6b5f5abb65e7a175572ef0a372
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Tue Aug 3 11:35:11 2021 +0800

    drm/rockchip: vop2: output error info when cluster use non afbc format
    
    This is special feature at rk356x, the cluster layer only can support
    afbc format and can't support linear format;
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: Ic8efc26c07a088c246969622fcf2973b00abd9c2

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 72ebfee6c856..7cac259bd675 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -2852,6 +2852,17 @@ static int vop2_plane_atomic_check(struct drm_plane *plane, struct drm_plane_sta
 	else
 		vpstate->afbc_en = false;
 
+	/*
+	 * This is special feature at rk356x, the cluster layer only can support
+	 * afbc format and can't support linear format;
+	 */
+	if (VOP_MAJOR(vop2_data->version) == 0x40 && VOP_MINOR(vop2_data->version) == 0x15) {
+		if (vop2_cluster_window(win) && !vpstate->afbc_en) {
+			DRM_ERROR("Unsupported linear format at %s\n", win->name);
+			return -EINVAL;
+		}
+	}
+
 	/*
 	 * Src.x1 can be odd when do clip, but yuv plane start point
 	 * need align with 2 pixel.

commit 307d8b27bacbe90f4a5bd7485ccd93b8188bb2b5
Author: Wang Panzhenzhuan <randy.wang@rock-chips.com>
Date:   Fri Jul 16 16:51:23 2021 +0800

    media: i2c: gc2375h: fix vblank set issue
    
    Signed-off-by: Wang Panzhenzhuan <randy.wang@rock-chips.com>
    Change-Id: Idf54706a751766fd4a0221eb42a7035989c45c34

diff --git a/drivers/media/i2c/gc2375h.c b/drivers/media/i2c/gc2375h.c
index 6c4f39177120..b98a3a053016 100644
--- a/drivers/media/i2c/gc2375h.c
+++ b/drivers/media/i2c/gc2375h.c
@@ -10,6 +10,7 @@
  * TODO: add OTP function.
  * V0.0X01.0X04 add quick stream on/off
  * V0.0X01.0X05 add function g_mbus_config
+ * V0.0X01.0X06 fix vblank set issue
  */
 
 //#define DEBUG 1
@@ -35,7 +36,7 @@
 #include <linux/pinctrl/consumer.h>
 #include <linux/slab.h>
 
-#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x5)
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x6)
 
 #ifndef V4L2_CID_DIGITAL_GAIN
 #define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
@@ -722,8 +723,11 @@ static long gc2375h_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = gc2375h_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:
@@ -736,12 +740,16 @@ static long gc2375h_compat_ioctl32(struct v4l2_subdev *sd,
 		ret = copy_from_user(cfg, up, sizeof(*cfg));
 		if (!ret)
 			ret = gc2375h_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 = gc2375h_ioctl(sd, cmd, &stream);
+		else
+			ret = -EFAULT;
 		break;
 	default:
 		ret = -ENOIOCTLCMD;
@@ -1251,7 +1259,7 @@ static int gc2375h_set_ctrl(struct v4l2_ctrl *ctrl)
 			 ((ctrl->val) >> 8) & 0x1f);
 		ret |= gc2375h_write_reg(gc2375h->client,
 			 GC2375H_REG_VTS_L,
-			 ((ctrl->val) >> 8) & 0xff);
+			 (ctrl->val & 0xff));
 		break;
 
 	default:

commit 8c60d2453954d91f19cd4e5a5e18159980c7b591
Author: Dongbo Yang <db.yang@rock-chips.com>
Date:   Thu Jun 17 18:05:27 2021 +0800

    misc: add driver for rk803.
    
    Signed-off-by: Dongbo Yang <db.yang@rock-chips.com>
    Change-Id: Ieba56551c48ed42f7f24c631b117d40a6e14a8f4

diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index a27095e6c0e3..a575ad1275ab 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -542,6 +542,12 @@ config PIR_ASCHIP
 	  Provides a driver to control the sensibility of the Aschip PIR detection
 	  sensor.
 
+config RK803
+	tristate "RK803"
+	default n
+	help
+	  Driver for RK803 which is used for driving porjector and IR flood LED.
+
 source "drivers/misc/c2port/Kconfig"
 source "drivers/misc/eeprom/Kconfig"
 source "drivers/misc/cb710/Kconfig"
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index 7617ccb363f9..341233a0cbae 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -60,4 +60,5 @@ obj-$(CONFIG_PCI_ENDPOINT_TEST)	+= pci_endpoint_test.o
 obj-$(CONFIG_OCXL)		+= ocxl/
 obj-$(CONFIG_MISC_RTSX)		+= cardreader/
 obj-$(CONFIG_UID_SYS_STATS)	+= uid_sys_stats.o
-obj-$(CONFIG_PIR_ASCHIP)	+= pir-aschip.o
\ No newline at end of file
+obj-$(CONFIG_PIR_ASCHIP)	+= pir-aschip.o
+obj-$(CONFIG_RK803)		+= rk803.o
diff --git a/drivers/misc/rk803.c b/drivers/misc/rk803.c
new file mode 100644
index 000000000000..e22cb51bcf4f
--- /dev/null
+++ b/drivers/misc/rk803.c
@@ -0,0 +1,281 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Rockchip RK803 driver
+ *
+ * Copyright (C) 2021 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+#include <linux/fs.h>
+#include <linux/gpio/consumer.h>
+#include <linux/i2c.h>
+#include <linux/kernel.h>
+#include <linux/miscdevice.h>
+#include <linux/module.h>
+#include <linux/regmap.h>
+#include <uapi/linux/rk803.h>
+
+#define RK803_CHIPID1	0x0A
+#define RK803_CHIPID2	0x0B
+
+#define IR_LED_DEFAULT_CURRENT	LED_500MA
+#define PRO_LED_DEFAULT_CURRENT	LED_600MA
+
+#define RK803_TIMEOUT		1000 /* usec */
+
+enum SL_LED_CURRENT {
+	LED_0MA = 0,
+	LED_100MA,
+	LED_200MA,
+	LED_300MA,
+	LED_400MA,
+	LED_500MA,
+	LED_600MA,
+	LED_700MA,
+	LED_800MA,
+	LED_900MA,
+	LED_1000MA,
+	LED_1100MA,
+	LED_1200MA,
+	LED_1300MA,
+	LED_1400MA,
+	LED_1544MA = 15,
+	LED_1600MA,
+	LED_1700MA,
+	LED_1800MA,
+	LED_1900MA,
+	LED_2000MA = 20,
+	LED_2100MA,
+	LED_2200MA,
+	LED_2300MA,
+	LED_2400MA,
+	LED_2500MA,
+	LED_2600MA,
+	LED_2700MA,
+	LED_2800MA,
+	LED_2900MA,
+	LED_3000MA = 30,
+	LED_3100MA,
+	LED_3200MA
+};
+
+struct rk803_data {
+	struct i2c_client *client;
+	struct regmap *regmap;
+	unsigned short chip_id;
+
+	unsigned char current1;
+	unsigned char current2;
+	struct gpio_desc *gpio_encc1;
+	struct gpio_desc *gpio_encc2;
+	struct miscdevice misc;
+};
+
+static const struct of_device_id rk803_of_match[] = {
+	{ .compatible = "rockchip,rk803" },
+	{ },
+};
+
+static ssize_t
+rk803_i2c_write_reg(struct rk803_data *rk803, uint8_t reg, uint8_t val)
+{
+	unsigned long timeout, write_time;
+	struct i2c_client *client;
+	struct regmap *regmap;
+	int ret;
+
+	regmap = rk803->regmap;
+	client = rk803->client;
+	timeout = jiffies + msecs_to_jiffies(25);
+
+	do {
+		/*
+		 * The timestamp shall be taken before the actual operation
+		 * to avoid a premature timeout in case of high CPU load.
+		 */
+		write_time = jiffies;
+
+		ret = regmap_write(regmap, reg, val);
+		dev_dbg(&client->dev, "write %xu@%d --> %d (%ld)\n",
+			 val, reg, ret, jiffies);
+		if (!ret)
+			return 1;
+
+		usleep_range(1000, 1500);
+	} while (time_before(write_time, timeout));
+
+	return -ETIMEDOUT;
+}
+
+static long rk803_dev_ioctl(struct file *file, unsigned int cmd,
+			    unsigned long arg)
+{
+	int ret = 0;
+	struct rk803_data *rk803 =
+		container_of(file->private_data, struct rk803_data, misc);
+
+	switch (cmd) {
+	case RK803_SET_GPIO1: {
+		int val = (int)arg;
+
+		gpiod_set_value(rk803->gpio_encc1, val);
+		break;
+	}
+	case RK803_SET_GPIO2: {
+		int val = (int)arg;
+
+		gpiod_set_value(rk803->gpio_encc2, val);
+		break;
+	}
+	case RK803_SET_CURENT1: {
+		int val = (int)arg;
+
+		rk803->current1 = val;
+		rk803_i2c_write_reg(rk803, 0, rk803->current1);
+		break;
+	}
+	case RK803_SET_CURENT2: {
+		int val = (int)arg;
+
+		rk803->current2 = val;
+		rk803_i2c_write_reg(rk803, 0, rk803->current2);
+		break;
+	}
+	default:
+		ret = -EFAULT;
+		break;
+	}
+	return ret;
+}
+
+static const struct file_operations rk803_fops = {
+	.owner = THIS_MODULE,
+	.unlocked_ioctl = rk803_dev_ioctl,
+};
+
+static int
+rk803_probe(struct i2c_client *client, const struct i2c_device_id *id)
+{
+	//struct device_node *np = client->dev.of_node;
+	struct device *dev = &client->dev;
+	int msb, lsb;
+	unsigned short chipid;
+	struct rk803_data *rk803;
+	struct regmap *regmap;
+	struct regmap_config regmap_config = { };
+	int ret;
+
+	/* check chip id */
+	msb = i2c_smbus_read_byte_data(client, RK803_CHIPID1);
+	if (msb < 0) {
+		dev_err(dev, "failed to read the chip1 id at 0x%x\n",
+			RK803_CHIPID1);
+		return msb;
+	}
+	lsb = i2c_smbus_read_byte_data(client, RK803_CHIPID2);
+	if (lsb < 0) {
+		dev_err(dev, "failed to read the chip2 id at 0x%x\n",
+			RK803_CHIPID2);
+		return lsb;
+	}
+
+	chipid = ((msb << 8) | lsb);
+	dev_info(dev, "chip id: 0x%x\n", (unsigned int)chipid);
+
+	regmap_config.val_bits = 8;
+	regmap_config.reg_bits = 8;
+	regmap_config.disable_locking = true;
+
+	regmap = devm_regmap_init_i2c(client, &regmap_config);
+	if (IS_ERR(regmap))
+		return PTR_ERR(regmap);
+
+	rk803 = devm_kzalloc(dev, sizeof(*rk803), GFP_KERNEL);
+	if (!rk803)
+		return -ENOMEM;
+
+	rk803->chip_id = chipid;
+	rk803->client = client;
+	rk803->regmap = regmap;
+	rk803->current1 = IR_LED_DEFAULT_CURRENT;
+	rk803->current2 = PRO_LED_DEFAULT_CURRENT;
+
+	rk803->gpio_encc1 = devm_gpiod_get(dev, "gpio-encc1", GPIOD_OUT_LOW);
+	if (IS_ERR(rk803->gpio_encc1)) {
+		dev_err(dev, "can not find gpio_encc1\n");
+		return PTR_ERR(rk803->gpio_encc1);
+	}
+	rk803->gpio_encc2 = devm_gpiod_get(dev, "gpio-encc2", GPIOD_OUT_LOW);
+	if (IS_ERR(rk803->gpio_encc2)) {
+		dev_err(dev, "can not find gpio_encc2\n");
+		return PTR_ERR(rk803->gpio_encc2);
+	}
+
+	/* OVP */
+	rk803_i2c_write_reg(rk803, 4, 1);
+
+	/* Control time */
+	rk803_i2c_write_reg(rk803, 2, 0xe3);
+
+	/* Control CV */
+	rk803_i2c_write_reg(rk803, 3, 0xa7);
+
+	/* PRO */
+	rk803_i2c_write_reg(rk803, 0, PRO_LED_DEFAULT_CURRENT);
+
+	/* IR */
+	rk803_i2c_write_reg(rk803, 1, IR_LED_DEFAULT_CURRENT);
+
+	i2c_set_clientdata(client, rk803);
+
+	rk803->misc.minor = MISC_DYNAMIC_MINOR;
+	rk803->misc.name = "rk803";
+	rk803->misc.fops = &rk803_fops;
+
+	ret = misc_register(&rk803->misc);
+	if (ret < 0) {
+		dev_err(&client->dev, "Error: misc_register returned %d\n",
+			ret);
+		return ret;
+	}
+
+	dev_info(dev, "rk803 probe ok!\n");
+	return 0;
+}
+
+static int rk803_remove(struct i2c_client *client)
+{
+	struct rk803_data *rk803;
+
+	rk803 = i2c_get_clientdata(client);
+	misc_deregister(&rk803->misc);
+	i2c_unregister_device(rk803->client);
+	return 0;
+}
+
+static struct i2c_driver rk803_driver = {
+	.driver = {
+		.name = "rk803",
+		.of_match_table = rk803_of_match,
+	},
+	.probe = rk803_probe,
+	.remove = rk803_remove,
+};
+
+static int __init rk803_init(void)
+{
+	return i2c_add_driver(&rk803_driver);
+}
+
+subsys_initcall(rk803_init);
+
+static void __exit rk803_exit(void)
+{
+	i2c_del_driver(&rk803_driver);
+}
+
+module_exit(rk803_exit);
+
+MODULE_DESCRIPTION("Driver for RK803");
+MODULE_AUTHOR("Rockchip");
+MODULE_LICENSE("GPL");
diff --git a/include/uapi/linux/rk803.h b/include/uapi/linux/rk803.h
new file mode 100644
index 000000000000..448468da9e8d
--- /dev/null
+++ b/include/uapi/linux/rk803.h
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: ((GPL-2.0+ WITH Linux-syscall-note) OR MIT) */
+/*
+ * Copyright (C) 2021 Rockchip Electronics Co., Ltd.
+ */
+
+#ifndef _UAPI_RK803_H
+#define _UAPI_RK803_H
+
+#include <linux/types.h>
+
+#define RK803_SET_GPIO1		_IOW('p',  1, int)
+#define RK803_SET_GPIO2		_IOW('p',  2, int)
+#define RK803_SET_CURENT1	_IOW('p',  3, int)
+#define RK803_SET_CURENT2	_IOW('p',  4, int)
+
+#endif /* _UAPI_RK803_H */

commit 15699848963a8192fe545c8f4509e737162f722a
Merge: 212b4d3a4267 53bd76690e27
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Sat Jul 31 09:05:30 2021 +0200

    Merge 4.19.200 into android-4.19-stable
    
    Changes in 4.19.200
            selftest: fix build error in tools/testing/selftests/vm/userfaultfd.c
            iio: dac: ds4422/ds4424 drop of_node check
            KVM: x86: determine if an exception has an error code only when injecting it.
            net: split out functions related to registering inflight socket files
            af_unix: fix garbage collect vs MSG_PEEK
            workqueue: fix UAF in pwq_unbound_release_workfn()
            net/802/mrp: fix memleak in mrp_request_join()
            net/802/garp: fix memleak in garp_request_join()
            net: annotate data race around sk_ll_usec
            sctp: move 198 addresses from unusable to private scope
            hfs: add missing clean-up in hfs_fill_super
            hfs: fix high memory mapping in hfs_bnode_read
            hfs: add lock nesting notation to hfs_find_init
            firmware: arm_scmi: Fix possible scmi_linux_errmap buffer overflow
            firmware: arm_scmi: Fix range check for the maximum number of pending messages
            cifs: fix the out of range assignment to bit fields in parse_server_interfaces
            ARM: dts: versatile: Fix up interrupt controller node names
            Linux 4.19.200
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I8aa8c1be3b2a7db30b8f9fb29bd24302186cb636

commit 53bd76690e27f37c9df221a651a52cea04214da9
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Sat Jul 31 08:22:38 2021 +0200

    Linux 4.19.200
    
    Link: https://lore.kernel.org/r/20210729135137.260993951@linuxfoundation.org
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index f3ad63a089a1..a4ea351c4e5d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 199
+SUBLEVEL = 200
 EXTRAVERSION =
 NAME = "People's Front"
 

commit 7715443b7dc061d2709de596640e519efd6fc67e
Author: Sudeep Holla <sudeep.holla@arm.com>
Date:   Thu Jul 1 14:21:18 2021 +0100

    ARM: dts: versatile: Fix up interrupt controller node names
    
    [ Upstream commit 82a1c67554dff610d6be4e1982c425717b3c6a23 ]
    
    Once the new schema interrupt-controller/arm,vic.yaml is added, we get
    the below warnings:
    
            arch/arm/boot/dts/versatile-ab.dt.yaml:
            intc@10140000: $nodename:0: 'intc@10140000' does not match
            '^interrupt-controller(@[0-9a-f,]+)*$'
    
            arch/arm/boot/dts/versatile-ab.dt.yaml:
            intc@10140000: 'clear-mask' does not match any of the regexes
    
    Fix the node names for the interrupt controller to conform
    to the standard node name interrupt-controller@.. Also drop invalid
    clear-mask property.
    
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Acked-by: Linus Walleij <linus.walleij@linaro.org>
    Link: https://lore.kernel.org/r/20210701132118.759454-1-sudeep.holla@arm.com'
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/versatile-ab.dts b/arch/arm/boot/dts/versatile-ab.dts
index 6f4f60ba5429..990b7ef1800e 100644
--- a/arch/arm/boot/dts/versatile-ab.dts
+++ b/arch/arm/boot/dts/versatile-ab.dts
@@ -192,16 +192,15 @@
 		#size-cells = <1>;
 		ranges;
 
-		vic: intc@10140000 {
+		vic: interrupt-controller@10140000 {
 			compatible = "arm,versatile-vic";
 			interrupt-controller;
 			#interrupt-cells = <1>;
 			reg = <0x10140000 0x1000>;
-			clear-mask = <0xffffffff>;
 			valid-mask = <0xffffffff>;
 		};
 
-		sic: intc@10003000 {
+		sic: interrupt-controller@10003000 {
 			compatible = "arm,versatile-sic";
 			interrupt-controller;
 			#interrupt-cells = <1>;
diff --git a/arch/arm/boot/dts/versatile-pb.dts b/arch/arm/boot/dts/versatile-pb.dts
index 06a0fdf24026..e7e751a858d8 100644
--- a/arch/arm/boot/dts/versatile-pb.dts
+++ b/arch/arm/boot/dts/versatile-pb.dts
@@ -7,7 +7,7 @@
 
 	amba {
 		/* The Versatile PB is using more SIC IRQ lines than the AB */
-		sic: intc@10003000 {
+		sic: interrupt-controller@10003000 {
 			clear-mask = <0xffffffff>;
 			/*
 			 * Valid interrupt lines mask according to

commit c30f239f06f6b1a6c0a6ddb2a3d628a815415f0d
Author: Hyunchul Lee <hyc.lee@gmail.com>
Date:   Mon Jul 12 19:34:02 2021 +0900

    cifs: fix the out of range assignment to bit fields in parse_server_interfaces
    
    [ Upstream commit c9c9c6815f9004ee1ec87401ed0796853bd70f1b ]
    
    Because the out of range assignment to bit fields
    are compiler-dependant, the fields could have wrong
    value.
    
    Signed-off-by: Hyunchul Lee <hyc.lee@gmail.com>
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
index 5a14f518cd97..61955a7c838b 100644
--- a/fs/cifs/smb2ops.c
+++ b/fs/cifs/smb2ops.c
@@ -386,8 +386,8 @@ parse_server_interfaces(struct network_interface_info_ioctl_rsp *buf,
 	p = buf;
 	while (bytes_left >= sizeof(*p)) {
 		info->speed = le64_to_cpu(p->LinkSpeed);
-		info->rdma_capable = le32_to_cpu(p->Capability & RDMA_CAPABLE);
-		info->rss_capable = le32_to_cpu(p->Capability & RSS_CAPABLE);
+		info->rdma_capable = le32_to_cpu(p->Capability & RDMA_CAPABLE) ? 1 : 0;
+		info->rss_capable = le32_to_cpu(p->Capability & RSS_CAPABLE) ? 1 : 0;
 
 		cifs_dbg(FYI, "%s: adding iface %zu\n", __func__, *iface_count);
 		cifs_dbg(FYI, "%s: speed %zu bps\n", __func__, info->speed);

commit 78d282f23bec739a4a3ca73b538368f009cb4a7a
Author: Cristian Marussi <cristian.marussi@arm.com>
Date:   Mon Jul 12 15:18:18 2021 +0100

    firmware: arm_scmi: Fix range check for the maximum number of pending messages
    
    [ Upstream commit bdb8742dc6f7c599c3d61959234fe4c23638727b ]
    
    SCMI message headers carry a sequence number and such field is sized to
    allow for MSG_TOKEN_MAX distinct numbers; moreover zero is not really an
    acceptable maximum number of pending in-flight messages.
    
    Fix accordingly the checks performed on the value exported by transports
    in scmi_desc.max_msg
    
    Link: https://lore.kernel.org/r/20210712141833.6628-3-cristian.marussi@arm.com
    Reported-by: Vincent Guittot <vincent.guittot@linaro.org>
    Signed-off-by: Cristian Marussi <cristian.marussi@arm.com>
    [sudeep.holla: updated the patch title and error message]
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
index 081fbe28da4b..af5139eb96b5 100644
--- a/drivers/firmware/arm_scmi/driver.c
+++ b/drivers/firmware/arm_scmi/driver.c
@@ -629,8 +629,9 @@ static int scmi_xfer_info_init(struct scmi_info *sinfo)
 	struct scmi_xfers_info *info = &sinfo->minfo;
 
 	/* Pre-allocated messages, no more than what hdr.seq can support */
-	if (WARN_ON(desc->max_msg >= MSG_TOKEN_MAX)) {
-		dev_err(dev, "Maximum message of %d exceeds supported %ld\n",
+	if (WARN_ON(!desc->max_msg || desc->max_msg > MSG_TOKEN_MAX)) {
+		dev_err(dev,
+			"Invalid maximum messages %d, not in range [1 - %lu]\n",
 			desc->max_msg, MSG_TOKEN_MAX);
 		return -EINVAL;
 	}

commit edb6f5a95a0c7cdd40c91db952a63c915375e876
Author: Sudeep Holla <sudeep.holla@arm.com>
Date:   Wed Jul 7 14:50:28 2021 +0100

    firmware: arm_scmi: Fix possible scmi_linux_errmap buffer overflow
    
    [ Upstream commit 7a691f16ccad05d770f813d9c4b4337a30c6d63f ]
    
    The scmi_linux_errmap buffer access index is supposed to depend on the
    array size to prevent element out of bounds access. It uses SCMI_ERR_MAX
    to check bounds but that can mismatch with the array size. It also
    changes the success into -EIO though scmi_linux_errmap is never used in
    case of success, it is expected to work for success case too.
    
    It is slightly confusing code as the negative of the error code
    is used as index to the buffer. Fix it by negating it at the start and
    make it more readable.
    
    Link: https://lore.kernel.org/r/20210707135028.1869642-1-sudeep.holla@arm.com
    Reported-by: kernel test robot <lkp@intel.com>
    Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
    Reviewed-by: Cristian Marussi <cristian.marussi@arm.com>
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
index effc4c17e0fb..081fbe28da4b 100644
--- a/drivers/firmware/arm_scmi/driver.c
+++ b/drivers/firmware/arm_scmi/driver.c
@@ -48,7 +48,6 @@ enum scmi_error_codes {
 	SCMI_ERR_GENERIC = -8,	/* Generic Error */
 	SCMI_ERR_HARDWARE = -9,	/* Hardware Error */
 	SCMI_ERR_PROTOCOL = -10,/* Protocol Error */
-	SCMI_ERR_MAX
 };
 
 /* List of all SCMI devices active in system */
@@ -168,8 +167,10 @@ static const int scmi_linux_errmap[] = {
 
 static inline int scmi_to_linux_errno(int errno)
 {
-	if (errno < SCMI_SUCCESS && errno > SCMI_ERR_MAX)
-		return scmi_linux_errmap[-errno];
+	int err_idx = -errno;
+
+	if (err_idx >= SCMI_SUCCESS && err_idx < ARRAY_SIZE(scmi_linux_errmap))
+		return scmi_linux_errmap[err_idx];
 	return -EIO;
 }
 

commit 4cb60d03efa7e77498fd93a85f39769550ed768d
Author: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
Date:   Wed Jul 14 21:27:08 2021 -0700

    hfs: add lock nesting notation to hfs_find_init
    
    [ Upstream commit b3b2177a2d795e35dc11597b2609eb1e7e57e570 ]
    
    Syzbot reports a possible recursive lock in [1].
    
    This happens due to missing lock nesting information.  From the logs, we
    see that a call to hfs_fill_super is made to mount the hfs filesystem.
    While searching for the root inode, the lock on the catalog btree is
    grabbed.  Then, when the parent of the root isn't found, a call to
    __hfs_bnode_create is made to create the parent of the root.  This
    eventually leads to a call to hfs_ext_read_extent which grabs a lock on
    the extents btree.
    
    Since the order of locking is catalog btree -> extents btree, this lock
    hierarchy does not lead to a deadlock.
    
    To tell lockdep that this locking is safe, we add nesting notation to
    distinguish between catalog btrees, extents btrees, and attributes
    btrees (for HFS+).  This has already been done in hfsplus.
    
    Link: https://syzkaller.appspot.com/bug?id=f007ef1d7a31a469e3be7aeb0fde0769b18585db [1]
    Link: https://lkml.kernel.org/r/20210701030756.58760-4-desmondcheongzx@gmail.com
    Signed-off-by: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
    Reported-by: syzbot+b718ec84a87b7e73ade4@syzkaller.appspotmail.com
    Tested-by: syzbot+b718ec84a87b7e73ade4@syzkaller.appspotmail.com
    Reviewed-by: Viacheslav Dubeyko <slava@dubeyko.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Gustavo A. R. Silva <gustavoars@kernel.org>
    Cc: Shuah Khan <skhan@linuxfoundation.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/hfs/bfind.c b/fs/hfs/bfind.c
index 4af318fbda77..ef9498a6e88a 100644
--- a/fs/hfs/bfind.c
+++ b/fs/hfs/bfind.c
@@ -25,7 +25,19 @@ int hfs_find_init(struct hfs_btree *tree, struct hfs_find_data *fd)
 	fd->key = ptr + tree->max_key_len + 2;
 	hfs_dbg(BNODE_REFS, "find_init: %d (%p)\n",
 		tree->cnid, __builtin_return_address(0));
-	mutex_lock(&tree->tree_lock);
+	switch (tree->cnid) {
+	case HFS_CAT_CNID:
+		mutex_lock_nested(&tree->tree_lock, CATALOG_BTREE_MUTEX);
+		break;
+	case HFS_EXT_CNID:
+		mutex_lock_nested(&tree->tree_lock, EXTENTS_BTREE_MUTEX);
+		break;
+	case HFS_ATTR_CNID:
+		mutex_lock_nested(&tree->tree_lock, ATTR_BTREE_MUTEX);
+		break;
+	default:
+		return -EINVAL;
+	}
 	return 0;
 }
 
diff --git a/fs/hfs/btree.h b/fs/hfs/btree.h
index dcc2aab1b2c4..25ac9a8bb57a 100644
--- a/fs/hfs/btree.h
+++ b/fs/hfs/btree.h
@@ -13,6 +13,13 @@ typedef int (*btree_keycmp)(const btree_key *, const btree_key *);
 
 #define NODE_HASH_SIZE  256
 
+/* B-tree mutex nested subclasses */
+enum hfs_btree_mutex_classes {
+	CATALOG_BTREE_MUTEX,
+	EXTENTS_BTREE_MUTEX,
+	ATTR_BTREE_MUTEX,
+};
+
 /* A HFS BTree held in memory */
 struct hfs_btree {
 	struct super_block *sb;

commit f6a2be76077f984d741509e994da25d0eaac37b2
Author: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
Date:   Wed Jul 14 21:27:05 2021 -0700

    hfs: fix high memory mapping in hfs_bnode_read
    
    [ Upstream commit 54a5ead6f5e2b47131a7385d0c0af18e7b89cb02 ]
    
    Pages that we read in hfs_bnode_read need to be kmapped into kernel
    address space.  However, currently only the 0th page is kmapped.  If the
    given offset + length exceeds this 0th page, then we have an invalid
    memory access.
    
    To fix this, we kmap relevant pages one by one and copy their relevant
    portions of data.
    
    An example of invalid memory access occurring without this fix can be seen
    in the following crash report:
    
      ==================================================================
      BUG: KASAN: use-after-free in memcpy include/linux/fortify-string.h:191 [inline]
      BUG: KASAN: use-after-free in hfs_bnode_read+0xc4/0xe0 fs/hfs/bnode.c:26
      Read of size 2 at addr ffff888125fdcffe by task syz-executor5/4634
    
      CPU: 0 PID: 4634 Comm: syz-executor5 Not tainted 5.13.0-syzkaller #0
      Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
      Call Trace:
       __dump_stack lib/dump_stack.c:79 [inline]
       dump_stack+0x195/0x1f8 lib/dump_stack.c:120
       print_address_description.constprop.0+0x1d/0x110 mm/kasan/report.c:233
       __kasan_report mm/kasan/report.c:419 [inline]
       kasan_report.cold+0x7b/0xd4 mm/kasan/report.c:436
       check_region_inline mm/kasan/generic.c:180 [inline]
       kasan_check_range+0x154/0x1b0 mm/kasan/generic.c:186
       memcpy+0x24/0x60 mm/kasan/shadow.c:65
       memcpy include/linux/fortify-string.h:191 [inline]
       hfs_bnode_read+0xc4/0xe0 fs/hfs/bnode.c:26
       hfs_bnode_read_u16 fs/hfs/bnode.c:34 [inline]
       hfs_bnode_find+0x880/0xcc0 fs/hfs/bnode.c:365
       hfs_brec_find+0x2d8/0x540 fs/hfs/bfind.c:126
       hfs_brec_read+0x27/0x120 fs/hfs/bfind.c:165
       hfs_cat_find_brec+0x19a/0x3b0 fs/hfs/catalog.c:194
       hfs_fill_super+0xc13/0x1460 fs/hfs/super.c:419
       mount_bdev+0x331/0x3f0 fs/super.c:1368
       hfs_mount+0x35/0x40 fs/hfs/super.c:457
       legacy_get_tree+0x10c/0x220 fs/fs_context.c:592
       vfs_get_tree+0x93/0x300 fs/super.c:1498
       do_new_mount fs/namespace.c:2905 [inline]
       path_mount+0x13f5/0x20e0 fs/namespace.c:3235
       do_mount fs/namespace.c:3248 [inline]
       __do_sys_mount fs/namespace.c:3456 [inline]
       __se_sys_mount fs/namespace.c:3433 [inline]
       __x64_sys_mount+0x2b8/0x340 fs/namespace.c:3433
       do_syscall_64+0x37/0xc0 arch/x86/entry/common.c:47
       entry_SYSCALL_64_after_hwframe+0x44/0xae
      RIP: 0033:0x45e63a
      Code: 48 c7 c2 bc ff ff ff f7 d8 64 89 02 b8 ff ff ff ff eb d2 e8 88 04 00 00 0f 1f 84 00 00 00 00 00 49 89 ca b8 a5 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 bc ff ff ff f7 d8 64 89 01 48
      RSP: 002b:00007f9404d410d8 EFLAGS: 00000246 ORIG_RAX: 00000000000000a5
      RAX: ffffffffffffffda RBX: 0000000020000248 RCX: 000000000045e63a
      RDX: 0000000020000000 RSI: 0000000020000100 RDI: 00007f9404d41120
      RBP: 00007f9404d41120 R08: 00000000200002c0 R09: 0000000020000000
      R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000003
      R13: 0000000000000003 R14: 00000000004ad5d8 R15: 0000000000000000
    
      The buggy address belongs to the page:
      page:00000000dadbcf3e refcount:0 mapcount:0 mapping:0000000000000000 index:0x1 pfn:0x125fdc
      flags: 0x2fffc0000000000(node=0|zone=2|lastcpupid=0x3fff)
      raw: 02fffc0000000000 ffffea000497f748 ffffea000497f6c8 0000000000000000
      raw: 0000000000000001 0000000000000000 00000000ffffffff 0000000000000000
      page dumped because: kasan: bad access detected
    
      Memory state around the buggy address:
       ffff888125fdce80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
       ffff888125fdcf00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
      >ffff888125fdcf80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
                                                                      ^
       ffff888125fdd000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
       ffff888125fdd080: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
      ==================================================================
    
    Link: https://lkml.kernel.org/r/20210701030756.58760-3-desmondcheongzx@gmail.com
    Signed-off-by: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
    Reviewed-by: Viacheslav Dubeyko <slava@dubeyko.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Gustavo A. R. Silva <gustavoars@kernel.org>
    Cc: Shuah Khan <skhan@linuxfoundation.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/hfs/bnode.c b/fs/hfs/bnode.c
index b63a4df7327b..c0a73a6ffb28 100644
--- a/fs/hfs/bnode.c
+++ b/fs/hfs/bnode.c
@@ -15,16 +15,31 @@
 
 #include "btree.h"
 
-void hfs_bnode_read(struct hfs_bnode *node, void *buf,
-		int off, int len)
+void hfs_bnode_read(struct hfs_bnode *node, void *buf, int off, int len)
 {
 	struct page *page;
+	int pagenum;
+	int bytes_read;
+	int bytes_to_read;
+	void *vaddr;
 
 	off += node->page_offset;
-	page = node->page[0];
+	pagenum = off >> PAGE_SHIFT;
+	off &= ~PAGE_MASK; /* compute page offset for the first page */
 
-	memcpy(buf, kmap(page) + off, len);
-	kunmap(page);
+	for (bytes_read = 0; bytes_read < len; bytes_read += bytes_to_read) {
+		if (pagenum >= node->tree->pages_per_bnode)
+			break;
+		page = node->page[pagenum];
+		bytes_to_read = min_t(int, len - bytes_read, PAGE_SIZE - off);
+
+		vaddr = kmap_atomic(page);
+		memcpy(buf + bytes_read, vaddr + off, bytes_to_read);
+		kunmap_atomic(vaddr);
+
+		pagenum++;
+		off = 0; /* page offset only applies to the first page */
+	}
 }
 
 u16 hfs_bnode_read_u16(struct hfs_bnode *node, int off)

commit 04c6a7861ab5ff620eec60a6d08f4c73cef7653e
Author: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
Date:   Wed Jul 14 21:27:01 2021 -0700

    hfs: add missing clean-up in hfs_fill_super
    
    [ Upstream commit 16ee572eaf0d09daa4c8a755fdb71e40dbf8562d ]
    
    Patch series "hfs: fix various errors", v2.
    
    This series ultimately aims to address a lockdep warning in
    hfs_find_init reported by Syzbot [1].
    
    The work done for this led to the discovery of another bug, and the
    Syzkaller repro test also reveals an invalid memory access error after
    clearing the lockdep warning.  Hence, this series is broken up into
    three patches:
    
    1. Add a missing call to hfs_find_exit for an error path in
       hfs_fill_super
    
    2. Fix memory mapping in hfs_bnode_read by fixing calls to kmap
    
    3. Add lock nesting notation to tell lockdep that the observed locking
       hierarchy is safe
    
    This patch (of 3):
    
    Before exiting hfs_fill_super, the struct hfs_find_data used in
    hfs_find_init should be passed to hfs_find_exit to be cleaned up, and to
    release the lock held on the btree.
    
    The call to hfs_find_exit is missing from an error path.  We add it back
    in by consolidating calls to hfs_find_exit for error paths.
    
    Link: https://syzkaller.appspot.com/bug?id=f007ef1d7a31a469e3be7aeb0fde0769b18585db [1]
    Link: https://lkml.kernel.org/r/20210701030756.58760-1-desmondcheongzx@gmail.com
    Link: https://lkml.kernel.org/r/20210701030756.58760-2-desmondcheongzx@gmail.com
    Signed-off-by: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
    Reviewed-by: Viacheslav Dubeyko <slava@dubeyko.com>
    Cc: Gustavo A. R. Silva <gustavoars@kernel.org>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Shuah Khan <skhan@linuxfoundation.org>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/hfs/super.c b/fs/hfs/super.c
index 173876782f73..77b6f35a4aa9 100644
--- a/fs/hfs/super.c
+++ b/fs/hfs/super.c
@@ -427,14 +427,12 @@ static int hfs_fill_super(struct super_block *sb, void *data, int silent)
 	if (!res) {
 		if (fd.entrylength > sizeof(rec) || fd.entrylength < 0) {
 			res =  -EIO;
-			goto bail;
+			goto bail_hfs_find;
 		}
 		hfs_bnode_read(fd.bnode, &rec, fd.entryoffset, fd.entrylength);
 	}
-	if (res) {
-		hfs_find_exit(&fd);
-		goto bail_no_root;
-	}
+	if (res)
+		goto bail_hfs_find;
 	res = -EINVAL;
 	root_inode = hfs_iget(sb, &fd.search_key->cat, &rec);
 	hfs_find_exit(&fd);
@@ -450,6 +448,8 @@ static int hfs_fill_super(struct super_block *sb, void *data, int silent)
 	/* everything's okay */
 	return 0;
 
+bail_hfs_find:
+	hfs_find_exit(&fd);
 bail_no_root:
 	pr_err("get root inode failed\n");
 bail:

commit 53012dd6ca2f3c9420b5cc447279375a90290fb4
Author: Xin Long <lucien.xin@gmail.com>
Date:   Tue Jun 29 23:34:08 2021 -0400

    sctp: move 198 addresses from unusable to private scope
    
    [ Upstream commit 1d11fa231cabeae09a95cb3e4cf1d9dd34e00f08 ]
    
    The doc draft-stewart-tsvwg-sctp-ipv4-00 that restricts 198 addresses
    was never published. These addresses as private addresses should be
    allowed to use in SCTP.
    
    As Michael Tuexen suggested, this patch is to move 198 addresses from
    unusable to private scope.
    
    Reported-by: Sérgio <surkamp@gmail.com>
    Signed-off-by: Xin Long <lucien.xin@gmail.com>
    Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/net/sctp/constants.h b/include/net/sctp/constants.h
index 48d74674d5e9..bc22e44ffcdf 100644
--- a/include/net/sctp/constants.h
+++ b/include/net/sctp/constants.h
@@ -348,8 +348,7 @@ enum {
 #define SCTP_SCOPE_POLICY_MAX	SCTP_SCOPE_POLICY_LINK
 
 /* Based on IPv4 scoping <draft-stewart-tsvwg-sctp-ipv4-00.txt>,
- * SCTP IPv4 unusable addresses: 0.0.0.0/8, 224.0.0.0/4, 198.18.0.0/24,
- * 192.88.99.0/24.
+ * SCTP IPv4 unusable addresses: 0.0.0.0/8, 224.0.0.0/4, 192.88.99.0/24.
  * Also, RFC 8.4, non-unicast addresses are not considered valid SCTP
  * addresses.
  */
@@ -357,7 +356,6 @@ enum {
 	((htonl(INADDR_BROADCAST) == a) ||  \
 	 ipv4_is_multicast(a) ||	    \
 	 ipv4_is_zeronet(a) ||		    \
-	 ipv4_is_test_198(a) ||		    \
 	 ipv4_is_anycast_6to4(a))
 
 /* Flags used for the bind address copy functions.  */
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c
index dd5125658255..7207a9769f1a 100644
--- a/net/sctp/protocol.c
+++ b/net/sctp/protocol.c
@@ -412,7 +412,8 @@ static enum sctp_scope sctp_v4_scope(union sctp_addr *addr)
 		retval = SCTP_SCOPE_LINK;
 	} else if (ipv4_is_private_10(addr->v4.sin_addr.s_addr) ||
 		   ipv4_is_private_172(addr->v4.sin_addr.s_addr) ||
-		   ipv4_is_private_192(addr->v4.sin_addr.s_addr)) {
+		   ipv4_is_private_192(addr->v4.sin_addr.s_addr) ||
+		   ipv4_is_test_198(addr->v4.sin_addr.s_addr)) {
 		retval = SCTP_SCOPE_PRIVATE;
 	} else {
 		retval = SCTP_SCOPE_GLOBAL;

commit c1a5cd807960d07381364c7b05aa3a43eb6d3a2f
Author: Eric Dumazet <edumazet@google.com>
Date:   Tue Jun 29 07:12:45 2021 -0700

    net: annotate data race around sk_ll_usec
    
    [ Upstream commit 0dbffbb5335a1e3aa6855e4ee317e25e669dd302 ]
    
    sk_ll_usec is read locklessly from sk_can_busy_loop()
    while another thread can change its value in sock_setsockopt()
    
    This is correct but needs annotations.
    
    BUG: KCSAN: data-race in __skb_try_recv_datagram / sock_setsockopt
    
    write to 0xffff88814eb5f904 of 4 bytes by task 14011 on cpu 0:
     sock_setsockopt+0x1287/0x2090 net/core/sock.c:1175
     __sys_setsockopt+0x14f/0x200 net/socket.c:2100
     __do_sys_setsockopt net/socket.c:2115 [inline]
     __se_sys_setsockopt net/socket.c:2112 [inline]
     __x64_sys_setsockopt+0x62/0x70 net/socket.c:2112
     do_syscall_64+0x4a/0x90 arch/x86/entry/common.c:47
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    read to 0xffff88814eb5f904 of 4 bytes by task 14001 on cpu 1:
     sk_can_busy_loop include/net/busy_poll.h:41 [inline]
     __skb_try_recv_datagram+0x14f/0x320 net/core/datagram.c:273
     unix_dgram_recvmsg+0x14c/0x870 net/unix/af_unix.c:2101
     unix_seqpacket_recvmsg+0x5a/0x70 net/unix/af_unix.c:2067
     ____sys_recvmsg+0x15d/0x310 include/linux/uio.h:244
     ___sys_recvmsg net/socket.c:2598 [inline]
     do_recvmmsg+0x35c/0x9f0 net/socket.c:2692
     __sys_recvmmsg net/socket.c:2771 [inline]
     __do_sys_recvmmsg net/socket.c:2794 [inline]
     __se_sys_recvmmsg net/socket.c:2787 [inline]
     __x64_sys_recvmmsg+0xcf/0x150 net/socket.c:2787
     do_syscall_64+0x4a/0x90 arch/x86/entry/common.c:47
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    value changed: 0x00000000 -> 0x00000101
    
    Reported by Kernel Concurrency Sanitizer on:
    CPU: 1 PID: 14001 Comm: syz-executor.3 Not tainted 5.13.0-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/net/busy_poll.h b/include/net/busy_poll.h
index cf8f792743ec..c76a5e9894da 100644
--- a/include/net/busy_poll.h
+++ b/include/net/busy_poll.h
@@ -48,7 +48,7 @@ static inline bool net_busy_loop_on(void)
 
 static inline bool sk_can_busy_loop(const struct sock *sk)
 {
-	return sk->sk_ll_usec && !signal_pending(current);
+	return READ_ONCE(sk->sk_ll_usec) && !signal_pending(current);
 }
 
 bool sk_busy_loop_end(void *p, unsigned long start_time);
diff --git a/net/core/sock.c b/net/core/sock.c
index e6cbe137cb6f..956af38aa0d6 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -989,7 +989,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
 			if (val < 0)
 				ret = -EINVAL;
 			else
-				sk->sk_ll_usec = val;
+				WRITE_ONCE(sk->sk_ll_usec, val);
 		}
 		break;
 #endif

commit e954107513e5e984821591b9b0ee4b002fcb63c6
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Tue Jun 29 19:53:28 2021 +0800

    net/802/garp: fix memleak in garp_request_join()
    
    [ Upstream commit 42ca63f980842918560b25f0244307fd83b4777c ]
    
    I got kmemleak report when doing fuzz test:
    
    BUG: memory leak
    unreferenced object 0xffff88810c909b80 (size 64):
      comm "syz", pid 957, jiffies 4295220394 (age 399.090s)
      hex dump (first 32 bytes):
        01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        00 00 00 00 00 00 00 00 08 00 00 00 01 02 00 04  ................
      backtrace:
        [<00000000ca1f2e2e>] garp_request_join+0x285/0x3d0
        [<00000000bf153351>] vlan_gvrp_request_join+0x15b/0x190
        [<0000000024005e72>] vlan_dev_open+0x706/0x980
        [<00000000dc20c4d4>] __dev_open+0x2bb/0x460
        [<0000000066573004>] __dev_change_flags+0x501/0x650
        [<0000000035b42f83>] rtnl_configure_link+0xee/0x280
        [<00000000a5e69de0>] __rtnl_newlink+0xed5/0x1550
        [<00000000a5258f4a>] rtnl_newlink+0x66/0x90
        [<00000000506568ee>] rtnetlink_rcv_msg+0x439/0xbd0
        [<00000000b7eaeae1>] netlink_rcv_skb+0x14d/0x420
        [<00000000c373ce66>] netlink_unicast+0x550/0x750
        [<00000000ec74ce74>] netlink_sendmsg+0x88b/0xda0
        [<00000000381ff246>] sock_sendmsg+0xc9/0x120
        [<000000008f6a2db3>] ____sys_sendmsg+0x6e8/0x820
        [<000000008d9c1735>] ___sys_sendmsg+0x145/0x1c0
        [<00000000aa39dd8b>] __sys_sendmsg+0xfe/0x1d0
    
    Calling garp_request_leave() after garp_request_join(), the attr->state
    is set to GARP_APPLICANT_VO, garp_attr_destroy() won't be called in last
    transmit event in garp_uninit_applicant(), the attr of applicant will be
    leaked. To fix this leak, iterate and free each attr of applicant before
    rerturning from garp_uninit_applicant().
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/802/garp.c b/net/802/garp.c
index 7f50d47470bd..8e19f51833d6 100644
--- a/net/802/garp.c
+++ b/net/802/garp.c
@@ -206,6 +206,19 @@ static void garp_attr_destroy(struct garp_applicant *app, struct garp_attr *attr
 	kfree(attr);
 }
 
+static void garp_attr_destroy_all(struct garp_applicant *app)
+{
+	struct rb_node *node, *next;
+	struct garp_attr *attr;
+
+	for (node = rb_first(&app->gid);
+	     next = node ? rb_next(node) : NULL, node != NULL;
+	     node = next) {
+		attr = rb_entry(node, struct garp_attr, node);
+		garp_attr_destroy(app, attr);
+	}
+}
+
 static int garp_pdu_init(struct garp_applicant *app)
 {
 	struct sk_buff *skb;
@@ -612,6 +625,7 @@ void garp_uninit_applicant(struct net_device *dev, struct garp_application *appl
 
 	spin_lock_bh(&app->lock);
 	garp_gid_event(app, GARP_EVENT_TRANSMIT_PDU);
+	garp_attr_destroy_all(app);
 	garp_pdu_queue(app);
 	spin_unlock_bh(&app->lock);
 

commit f9dd1e4e9d39e799fbe2be9ac7e6b43a9567ff8c
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Tue Jun 29 15:22:37 2021 +0800

    net/802/mrp: fix memleak in mrp_request_join()
    
    [ Upstream commit 996af62167d0e0ec69b938a3561e96f84ffff1aa ]
    
    I got kmemleak report when doing fuzz test:
    
    BUG: memory leak
    unreferenced object 0xffff88810c239500 (size 64):
    comm "syz-executor940", pid 882, jiffies 4294712870 (age 14.631s)
    hex dump (first 32 bytes):
    01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
    00 00 00 00 00 00 00 00 01 00 00 00 01 02 00 04 ................
    backtrace:
    [<00000000a323afa4>] slab_alloc_node mm/slub.c:2972 [inline]
    [<00000000a323afa4>] slab_alloc mm/slub.c:2980 [inline]
    [<00000000a323afa4>] __kmalloc+0x167/0x340 mm/slub.c:4130
    [<000000005034ca11>] kmalloc include/linux/slab.h:595 [inline]
    [<000000005034ca11>] mrp_attr_create net/802/mrp.c:276 [inline]
    [<000000005034ca11>] mrp_request_join+0x265/0x550 net/802/mrp.c:530
    [<00000000fcfd81f3>] vlan_mvrp_request_join+0x145/0x170 net/8021q/vlan_mvrp.c:40
    [<000000009258546e>] vlan_dev_open+0x477/0x890 net/8021q/vlan_dev.c:292
    [<0000000059acd82b>] __dev_open+0x281/0x410 net/core/dev.c:1609
    [<000000004e6dc695>] __dev_change_flags+0x424/0x560 net/core/dev.c:8767
    [<00000000471a09af>] rtnl_configure_link+0xd9/0x210 net/core/rtnetlink.c:3122
    [<0000000037a4672b>] __rtnl_newlink+0xe08/0x13e0 net/core/rtnetlink.c:3448
    [<000000008d5d0fda>] rtnl_newlink+0x64/0xa0 net/core/rtnetlink.c:3488
    [<000000004882fe39>] rtnetlink_rcv_msg+0x369/0xa10 net/core/rtnetlink.c:5552
    [<00000000907e6c54>] netlink_rcv_skb+0x134/0x3d0 net/netlink/af_netlink.c:2504
    [<00000000e7d7a8c4>] netlink_unicast_kernel net/netlink/af_netlink.c:1314 [inline]
    [<00000000e7d7a8c4>] netlink_unicast+0x4a0/0x6a0 net/netlink/af_netlink.c:1340
    [<00000000e0645d50>] netlink_sendmsg+0x78e/0xc90 net/netlink/af_netlink.c:1929
    [<00000000c24559b7>] sock_sendmsg_nosec net/socket.c:654 [inline]
    [<00000000c24559b7>] sock_sendmsg+0x139/0x170 net/socket.c:674
    [<00000000fc210bc2>] ____sys_sendmsg+0x658/0x7d0 net/socket.c:2350
    [<00000000be4577b5>] ___sys_sendmsg+0xf8/0x170 net/socket.c:2404
    
    Calling mrp_request_leave() after mrp_request_join(), the attr->state
    is set to MRP_APPLICANT_VO, mrp_attr_destroy() won't be called in last
    TX event in mrp_uninit_applicant(), the attr of applicant will be leaked.
    To fix this leak, iterate and free each attr of applicant before rerturning
    from mrp_uninit_applicant().
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/802/mrp.c b/net/802/mrp.c
index a808dd5bbb27..32f87d458f05 100644
--- a/net/802/mrp.c
+++ b/net/802/mrp.c
@@ -295,6 +295,19 @@ static void mrp_attr_destroy(struct mrp_applicant *app, struct mrp_attr *attr)
 	kfree(attr);
 }
 
+static void mrp_attr_destroy_all(struct mrp_applicant *app)
+{
+	struct rb_node *node, *next;
+	struct mrp_attr *attr;
+
+	for (node = rb_first(&app->mad);
+	     next = node ? rb_next(node) : NULL, node != NULL;
+	     node = next) {
+		attr = rb_entry(node, struct mrp_attr, node);
+		mrp_attr_destroy(app, attr);
+	}
+}
+
 static int mrp_pdu_init(struct mrp_applicant *app)
 {
 	struct sk_buff *skb;
@@ -898,6 +911,7 @@ void mrp_uninit_applicant(struct net_device *dev, struct mrp_application *appl)
 
 	spin_lock_bh(&app->lock);
 	mrp_mad_event(app, MRP_EVENT_TX);
+	mrp_attr_destroy_all(app);
 	mrp_pdu_queue(app);
 	spin_unlock_bh(&app->lock);
 

commit b7dc6715506df244571f6cf41f599291bdec8881
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Wed Jul 14 17:19:33 2021 +0800

    workqueue: fix UAF in pwq_unbound_release_workfn()
    
    commit b42b0bddcbc87b4c66f6497f66fc72d52b712aa7 upstream.
    
    I got a UAF report when doing fuzz test:
    
    [  152.880091][ T8030] ==================================================================
    [  152.881240][ T8030] BUG: KASAN: use-after-free in pwq_unbound_release_workfn+0x50/0x190
    [  152.882442][ T8030] Read of size 4 at addr ffff88810d31bd00 by task kworker/3:2/8030
    [  152.883578][ T8030]
    [  152.883932][ T8030] CPU: 3 PID: 8030 Comm: kworker/3:2 Not tainted 5.13.0+ #249
    [  152.885014][ T8030] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014
    [  152.886442][ T8030] Workqueue: events pwq_unbound_release_workfn
    [  152.887358][ T8030] Call Trace:
    [  152.887837][ T8030]  dump_stack_lvl+0x75/0x9b
    [  152.888525][ T8030]  ? pwq_unbound_release_workfn+0x50/0x190
    [  152.889371][ T8030]  print_address_description.constprop.10+0x48/0x70
    [  152.890326][ T8030]  ? pwq_unbound_release_workfn+0x50/0x190
    [  152.891163][ T8030]  ? pwq_unbound_release_workfn+0x50/0x190
    [  152.891999][ T8030]  kasan_report.cold.15+0x82/0xdb
    [  152.892740][ T8030]  ? pwq_unbound_release_workfn+0x50/0x190
    [  152.893594][ T8030]  __asan_load4+0x69/0x90
    [  152.894243][ T8030]  pwq_unbound_release_workfn+0x50/0x190
    [  152.895057][ T8030]  process_one_work+0x47b/0x890
    [  152.895778][ T8030]  worker_thread+0x5c/0x790
    [  152.896439][ T8030]  ? process_one_work+0x890/0x890
    [  152.897163][ T8030]  kthread+0x223/0x250
    [  152.897747][ T8030]  ? set_kthread_struct+0xb0/0xb0
    [  152.898471][ T8030]  ret_from_fork+0x1f/0x30
    [  152.899114][ T8030]
    [  152.899446][ T8030] Allocated by task 8884:
    [  152.900084][ T8030]  kasan_save_stack+0x21/0x50
    [  152.900769][ T8030]  __kasan_kmalloc+0x88/0xb0
    [  152.901416][ T8030]  __kmalloc+0x29c/0x460
    [  152.902014][ T8030]  alloc_workqueue+0x111/0x8e0
    [  152.902690][ T8030]  __btrfs_alloc_workqueue+0x11e/0x2a0
    [  152.903459][ T8030]  btrfs_alloc_workqueue+0x6d/0x1d0
    [  152.904198][ T8030]  scrub_workers_get+0x1e8/0x490
    [  152.904929][ T8030]  btrfs_scrub_dev+0x1b9/0x9c0
    [  152.905599][ T8030]  btrfs_ioctl+0x122c/0x4e50
    [  152.906247][ T8030]  __x64_sys_ioctl+0x137/0x190
    [  152.906916][ T8030]  do_syscall_64+0x34/0xb0
    [  152.907535][ T8030]  entry_SYSCALL_64_after_hwframe+0x44/0xae
    [  152.908365][ T8030]
    [  152.908688][ T8030] Freed by task 8884:
    [  152.909243][ T8030]  kasan_save_stack+0x21/0x50
    [  152.909893][ T8030]  kasan_set_track+0x20/0x30
    [  152.910541][ T8030]  kasan_set_free_info+0x24/0x40
    [  152.911265][ T8030]  __kasan_slab_free+0xf7/0x140
    [  152.911964][ T8030]  kfree+0x9e/0x3d0
    [  152.912501][ T8030]  alloc_workqueue+0x7d7/0x8e0
    [  152.913182][ T8030]  __btrfs_alloc_workqueue+0x11e/0x2a0
    [  152.913949][ T8030]  btrfs_alloc_workqueue+0x6d/0x1d0
    [  152.914703][ T8030]  scrub_workers_get+0x1e8/0x490
    [  152.915402][ T8030]  btrfs_scrub_dev+0x1b9/0x9c0
    [  152.916077][ T8030]  btrfs_ioctl+0x122c/0x4e50
    [  152.916729][ T8030]  __x64_sys_ioctl+0x137/0x190
    [  152.917414][ T8030]  do_syscall_64+0x34/0xb0
    [  152.918034][ T8030]  entry_SYSCALL_64_after_hwframe+0x44/0xae
    [  152.918872][ T8030]
    [  152.919203][ T8030] The buggy address belongs to the object at ffff88810d31bc00
    [  152.919203][ T8030]  which belongs to the cache kmalloc-512 of size 512
    [  152.921155][ T8030] The buggy address is located 256 bytes inside of
    [  152.921155][ T8030]  512-byte region [ffff88810d31bc00, ffff88810d31be00)
    [  152.922993][ T8030] The buggy address belongs to the page:
    [  152.923800][ T8030] page:ffffea000434c600 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x10d318
    [  152.925249][ T8030] head:ffffea000434c600 order:2 compound_mapcount:0 compound_pincount:0
    [  152.926399][ T8030] flags: 0x57ff00000010200(slab|head|node=1|zone=2|lastcpupid=0x7ff)
    [  152.927515][ T8030] raw: 057ff00000010200 dead000000000100 dead000000000122 ffff888009c42c80
    [  152.928716][ T8030] raw: 0000000000000000 0000000080100010 00000001ffffffff 0000000000000000
    [  152.929890][ T8030] page dumped because: kasan: bad access detected
    [  152.930759][ T8030]
    [  152.931076][ T8030] Memory state around the buggy address:
    [  152.931851][ T8030]  ffff88810d31bc00: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [  152.932967][ T8030]  ffff88810d31bc80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [  152.934068][ T8030] >ffff88810d31bd00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [  152.935189][ T8030]                    ^
    [  152.935763][ T8030]  ffff88810d31bd80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [  152.936847][ T8030]  ffff88810d31be00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    [  152.937940][ T8030] ==================================================================
    
    If apply_wqattrs_prepare() fails in alloc_workqueue(), it will call put_pwq()
    which invoke a work queue to call pwq_unbound_release_workfn() and use the 'wq'.
    The 'wq' allocated in alloc_workqueue() will be freed in error path when
    apply_wqattrs_prepare() fails. So it will lead a UAF.
    
    CPU0                                          CPU1
    alloc_workqueue()
    alloc_and_link_pwqs()
    apply_wqattrs_prepare() fails
    apply_wqattrs_cleanup()
    schedule_work(&pwq->unbound_release_work)
    kfree(wq)
                                                  worker_thread()
                                                  pwq_unbound_release_workfn() <- trigger uaf here
    
    If apply_wqattrs_prepare() fails, the new pwq are not linked, it doesn't
    hold any reference to the 'wq', 'wq' is invalid to access in the worker,
    so add check pwq if linked to fix this.
    
    Fixes: 2d5f0764b526 ("workqueue: split apply_workqueue_attrs() into 3 stages")
    Cc: stable@vger.kernel.org # v4.2+
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Suggested-by: Lai Jiangshan <jiangshanlai@gmail.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Reviewed-by: Lai Jiangshan <jiangshanlai@gmail.com>
    Tested-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: Tejun Heo <tj@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index f278e2f584fd..1573d1bf6300 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -3498,15 +3498,21 @@ static void pwq_unbound_release_workfn(struct work_struct *work)
 						  unbound_release_work);
 	struct workqueue_struct *wq = pwq->wq;
 	struct worker_pool *pool = pwq->pool;
-	bool is_last;
+	bool is_last = false;
 
-	if (WARN_ON_ONCE(!(wq->flags & WQ_UNBOUND)))
-		return;
+	/*
+	 * when @pwq is not linked, it doesn't hold any reference to the
+	 * @wq, and @wq is invalid to access.
+	 */
+	if (!list_empty(&pwq->pwqs_node)) {
+		if (WARN_ON_ONCE(!(wq->flags & WQ_UNBOUND)))
+			return;
 
-	mutex_lock(&wq->mutex);
-	list_del_rcu(&pwq->pwqs_node);
-	is_last = list_empty(&wq->pwqs);
-	mutex_unlock(&wq->mutex);
+		mutex_lock(&wq->mutex);
+		list_del_rcu(&pwq->pwqs_node);
+		is_last = list_empty(&wq->pwqs);
+		mutex_unlock(&wq->mutex);
+	}
 
 	mutex_lock(&wq_pool_mutex);
 	put_unbound_pool(pool);

commit 1dabafa9f61118b1377fde424d9a94bf8dbf2813
Author: Miklos Szeredi <mszeredi@redhat.com>
Date:   Wed Jul 28 14:47:20 2021 +0200

    af_unix: fix garbage collect vs MSG_PEEK
    
    commit cbcf01128d0a92e131bd09f1688fe032480b65ca upstream.
    
    unix_gc() assumes that candidate sockets can never gain an external
    reference (i.e.  be installed into an fd) while the unix_gc_lock is
    held.  Except for MSG_PEEK this is guaranteed by modifying inflight
    count under the unix_gc_lock.
    
    MSG_PEEK does not touch any variable protected by unix_gc_lock (file
    count is not), yet it needs to be serialized with garbage collection.
    Do this by locking/unlocking unix_gc_lock:
    
     1) increment file count
    
     2) lock/unlock barrier to make sure incremented file count is visible
        to garbage collection
    
     3) install file into fd
    
    This is a lock barrier (unlike smp_mb()) that ensures that garbage
    collection is run completely before or completely after the barrier.
    
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index 337c4797ab16..98c253afa0db 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -1517,6 +1517,53 @@ static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int peer)
 	return err;
 }
 
+static void unix_peek_fds(struct scm_cookie *scm, struct sk_buff *skb)
+{
+	scm->fp = scm_fp_dup(UNIXCB(skb).fp);
+
+	/*
+	 * Garbage collection of unix sockets starts by selecting a set of
+	 * candidate sockets which have reference only from being in flight
+	 * (total_refs == inflight_refs).  This condition is checked once during
+	 * the candidate collection phase, and candidates are marked as such, so
+	 * that non-candidates can later be ignored.  While inflight_refs is
+	 * protected by unix_gc_lock, total_refs (file count) is not, hence this
+	 * is an instantaneous decision.
+	 *
+	 * Once a candidate, however, the socket must not be reinstalled into a
+	 * file descriptor while the garbage collection is in progress.
+	 *
+	 * If the above conditions are met, then the directed graph of
+	 * candidates (*) does not change while unix_gc_lock is held.
+	 *
+	 * Any operations that changes the file count through file descriptors
+	 * (dup, close, sendmsg) does not change the graph since candidates are
+	 * not installed in fds.
+	 *
+	 * Dequeing a candidate via recvmsg would install it into an fd, but
+	 * that takes unix_gc_lock to decrement the inflight count, so it's
+	 * serialized with garbage collection.
+	 *
+	 * MSG_PEEK is special in that it does not change the inflight count,
+	 * yet does install the socket into an fd.  The following lock/unlock
+	 * pair is to ensure serialization with garbage collection.  It must be
+	 * done between incrementing the file count and installing the file into
+	 * an fd.
+	 *
+	 * If garbage collection starts after the barrier provided by the
+	 * lock/unlock, then it will see the elevated refcount and not mark this
+	 * as a candidate.  If a garbage collection is already in progress
+	 * before the file count was incremented, then the lock/unlock pair will
+	 * ensure that garbage collection is finished before progressing to
+	 * installing the fd.
+	 *
+	 * (*) A -> B where B is on the queue of A or B is on the queue of C
+	 * which is on the queue of listening socket A.
+	 */
+	spin_lock(&unix_gc_lock);
+	spin_unlock(&unix_gc_lock);
+}
+
 static int unix_scm_to_skb(struct scm_cookie *scm, struct sk_buff *skb, bool send_fds)
 {
 	int err = 0;
@@ -2142,7 +2189,7 @@ static int unix_dgram_recvmsg(struct socket *sock, struct msghdr *msg,
 		sk_peek_offset_fwd(sk, size);
 
 		if (UNIXCB(skb).fp)
-			scm.fp = scm_fp_dup(UNIXCB(skb).fp);
+			unix_peek_fds(&scm, skb);
 	}
 	err = (flags & MSG_TRUNC) ? skb->len - skip : size;
 
@@ -2383,7 +2430,7 @@ static int unix_stream_read_generic(struct unix_stream_read_state *state,
 			/* It is questionable, see note in unix_dgram_recvmsg.
 			 */
 			if (UNIXCB(skb).fp)
-				scm.fp = scm_fp_dup(UNIXCB(skb).fp);
+				unix_peek_fds(&scm, skb);
 
 			sk_peek_offset_fwd(sk, chunk);
 

commit db44d020633dad681cc234d0e04618b6b9049f9f
Author: Jens Axboe <axboe@kernel.dk>
Date:   Fri Feb 8 09:01:44 2019 -0700

    net: split out functions related to registering inflight socket files
    
    commit f4e65870e5cede5ca1ec0006b6c9803994e5f7b8 upstream.
    
    We need this functionality for the io_uring file registration, but
    we cannot rely on it since CONFIG_UNIX can be modular. Move the helpers
    to a separate file, that's always builtin to the kernel if CONFIG_UNIX is
    m/y.
    
    No functional changes in this patch, just moving code around.
    
    Reviewed-by: Hannes Reinecke <hare@suse.com>
    Acked-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    [ backported to older kernels to get access to unix_gc_lock - gregkh ]
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/net/af_unix.h b/include/net/af_unix.h
index a5ba41b3b867..7ec1cdb66be8 100644
--- a/include/net/af_unix.h
+++ b/include/net/af_unix.h
@@ -10,6 +10,7 @@
 
 void unix_inflight(struct user_struct *user, struct file *fp);
 void unix_notinflight(struct user_struct *user, struct file *fp);
+void unix_destruct_scm(struct sk_buff *skb);
 void unix_gc(void);
 void wait_for_unix_gc(void);
 struct sock *unix_get_socket(struct file *filp);
diff --git a/net/Makefile b/net/Makefile
index bdaf53925acd..449fc0b221f8 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -18,7 +18,7 @@ obj-$(CONFIG_NETFILTER)		+= netfilter/
 obj-$(CONFIG_INET)		+= ipv4/
 obj-$(CONFIG_TLS)		+= tls/
 obj-$(CONFIG_XFRM)		+= xfrm/
-obj-$(CONFIG_UNIX)		+= unix/
+obj-$(CONFIG_UNIX_SCM)		+= unix/
 obj-$(CONFIG_NET)		+= ipv6/
 obj-$(CONFIG_BPFILTER)		+= bpfilter/
 obj-$(CONFIG_PACKET)		+= packet/
diff --git a/net/unix/Kconfig b/net/unix/Kconfig
index 8b31ab85d050..3b9e450656a4 100644
--- a/net/unix/Kconfig
+++ b/net/unix/Kconfig
@@ -19,6 +19,11 @@ config UNIX
 
 	  Say Y unless you know what you are doing.
 
+config UNIX_SCM
+	bool
+	depends on UNIX
+	default y
+
 config UNIX_DIAG
 	tristate "UNIX: socket monitoring interface"
 	depends on UNIX
diff --git a/net/unix/Makefile b/net/unix/Makefile
index ffd0a275c3a7..54e58cc4f945 100644
--- a/net/unix/Makefile
+++ b/net/unix/Makefile
@@ -10,3 +10,5 @@ unix-$(CONFIG_SYSCTL)	+= sysctl_net_unix.o
 
 obj-$(CONFIG_UNIX_DIAG)	+= unix_diag.o
 unix_diag-y		:= diag.o
+
+obj-$(CONFIG_UNIX_SCM)	+= scm.o
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index 53fe5ada5a83..337c4797ab16 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -119,6 +119,8 @@
 #include <linux/freezer.h>
 #include <linux/file.h>
 
+#include "scm.h"
+
 struct hlist_head unix_socket_table[2 * UNIX_HASH_SIZE];
 EXPORT_SYMBOL_GPL(unix_socket_table);
 DEFINE_SPINLOCK(unix_table_lock);
@@ -1515,67 +1517,6 @@ static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int peer)
 	return err;
 }
 
-static void unix_detach_fds(struct scm_cookie *scm, struct sk_buff *skb)
-{
-	int i;
-
-	scm->fp = UNIXCB(skb).fp;
-	UNIXCB(skb).fp = NULL;
-
-	for (i = scm->fp->count-1; i >= 0; i--)
-		unix_notinflight(scm->fp->user, scm->fp->fp[i]);
-}
-
-static void unix_destruct_scm(struct sk_buff *skb)
-{
-	struct scm_cookie scm;
-	memset(&scm, 0, sizeof(scm));
-	scm.pid  = UNIXCB(skb).pid;
-	if (UNIXCB(skb).fp)
-		unix_detach_fds(&scm, skb);
-
-	/* Alas, it calls VFS */
-	/* So fscking what? fput() had been SMP-safe since the last Summer */
-	scm_destroy(&scm);
-	sock_wfree(skb);
-}
-
-/*
- * The "user->unix_inflight" variable is protected by the garbage
- * collection lock, and we just read it locklessly here. If you go
- * over the limit, there might be a tiny race in actually noticing
- * it across threads. Tough.
- */
-static inline bool too_many_unix_fds(struct task_struct *p)
-{
-	struct user_struct *user = current_user();
-
-	if (unlikely(user->unix_inflight > task_rlimit(p, RLIMIT_NOFILE)))
-		return !capable(CAP_SYS_RESOURCE) && !capable(CAP_SYS_ADMIN);
-	return false;
-}
-
-static int unix_attach_fds(struct scm_cookie *scm, struct sk_buff *skb)
-{
-	int i;
-
-	if (too_many_unix_fds(current))
-		return -ETOOMANYREFS;
-
-	/*
-	 * Need to duplicate file references for the sake of garbage
-	 * collection.  Otherwise a socket in the fps might become a
-	 * candidate for GC while the skb is not yet queued.
-	 */
-	UNIXCB(skb).fp = scm_fp_dup(scm->fp);
-	if (!UNIXCB(skb).fp)
-		return -ENOMEM;
-
-	for (i = scm->fp->count - 1; i >= 0; i--)
-		unix_inflight(scm->fp->user, scm->fp->fp[i]);
-	return 0;
-}
-
 static int unix_scm_to_skb(struct scm_cookie *scm, struct sk_buff *skb, bool send_fds)
 {
 	int err = 0;
diff --git a/net/unix/garbage.c b/net/unix/garbage.c
index c36757e72844..8bbe1b8e4ff7 100644
--- a/net/unix/garbage.c
+++ b/net/unix/garbage.c
@@ -86,77 +86,13 @@
 #include <net/scm.h>
 #include <net/tcp_states.h>
 
+#include "scm.h"
+
 /* Internal data structures and random procedures: */
 
-static LIST_HEAD(gc_inflight_list);
 static LIST_HEAD(gc_candidates);
-static DEFINE_SPINLOCK(unix_gc_lock);
 static DECLARE_WAIT_QUEUE_HEAD(unix_gc_wait);
 
-unsigned int unix_tot_inflight;
-
-struct sock *unix_get_socket(struct file *filp)
-{
-	struct sock *u_sock = NULL;
-	struct inode *inode = file_inode(filp);
-
-	/* Socket ? */
-	if (S_ISSOCK(inode->i_mode) && !(filp->f_mode & FMODE_PATH)) {
-		struct socket *sock = SOCKET_I(inode);
-		struct sock *s = sock->sk;
-
-		/* PF_UNIX ? */
-		if (s && sock->ops && sock->ops->family == PF_UNIX)
-			u_sock = s;
-	}
-	return u_sock;
-}
-
-/* Keep the number of times in flight count for the file
- * descriptor if it is for an AF_UNIX socket.
- */
-
-void unix_inflight(struct user_struct *user, struct file *fp)
-{
-	struct sock *s = unix_get_socket(fp);
-
-	spin_lock(&unix_gc_lock);
-
-	if (s) {
-		struct unix_sock *u = unix_sk(s);
-
-		if (atomic_long_inc_return(&u->inflight) == 1) {
-			BUG_ON(!list_empty(&u->link));
-			list_add_tail(&u->link, &gc_inflight_list);
-		} else {
-			BUG_ON(list_empty(&u->link));
-		}
-		unix_tot_inflight++;
-	}
-	user->unix_inflight++;
-	spin_unlock(&unix_gc_lock);
-}
-
-void unix_notinflight(struct user_struct *user, struct file *fp)
-{
-	struct sock *s = unix_get_socket(fp);
-
-	spin_lock(&unix_gc_lock);
-
-	if (s) {
-		struct unix_sock *u = unix_sk(s);
-
-		BUG_ON(!atomic_long_read(&u->inflight));
-		BUG_ON(list_empty(&u->link));
-
-		if (atomic_long_dec_and_test(&u->inflight))
-			list_del_init(&u->link);
-		unix_tot_inflight--;
-	}
-	user->unix_inflight--;
-	spin_unlock(&unix_gc_lock);
-}
-
 static void scan_inflight(struct sock *x, void (*func)(struct unix_sock *),
 			  struct sk_buff_head *hitlist)
 {
diff --git a/net/unix/scm.c b/net/unix/scm.c
new file mode 100644
index 000000000000..83413ade7983
--- /dev/null
+++ b/net/unix/scm.c
@@ -0,0 +1,148 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/socket.h>
+#include <linux/net.h>
+#include <linux/fs.h>
+#include <net/af_unix.h>
+#include <net/scm.h>
+#include <linux/init.h>
+
+#include "scm.h"
+
+unsigned int unix_tot_inflight;
+EXPORT_SYMBOL(unix_tot_inflight);
+
+LIST_HEAD(gc_inflight_list);
+EXPORT_SYMBOL(gc_inflight_list);
+
+DEFINE_SPINLOCK(unix_gc_lock);
+EXPORT_SYMBOL(unix_gc_lock);
+
+struct sock *unix_get_socket(struct file *filp)
+{
+	struct sock *u_sock = NULL;
+	struct inode *inode = file_inode(filp);
+
+	/* Socket ? */
+	if (S_ISSOCK(inode->i_mode) && !(filp->f_mode & FMODE_PATH)) {
+		struct socket *sock = SOCKET_I(inode);
+		struct sock *s = sock->sk;
+
+		/* PF_UNIX ? */
+		if (s && sock->ops && sock->ops->family == PF_UNIX)
+			u_sock = s;
+	}
+	return u_sock;
+}
+EXPORT_SYMBOL(unix_get_socket);
+
+/* Keep the number of times in flight count for the file
+ * descriptor if it is for an AF_UNIX socket.
+ */
+void unix_inflight(struct user_struct *user, struct file *fp)
+{
+	struct sock *s = unix_get_socket(fp);
+
+	spin_lock(&unix_gc_lock);
+
+	if (s) {
+		struct unix_sock *u = unix_sk(s);
+
+		if (atomic_long_inc_return(&u->inflight) == 1) {
+			BUG_ON(!list_empty(&u->link));
+			list_add_tail(&u->link, &gc_inflight_list);
+		} else {
+			BUG_ON(list_empty(&u->link));
+		}
+		unix_tot_inflight++;
+	}
+	user->unix_inflight++;
+	spin_unlock(&unix_gc_lock);
+}
+
+void unix_notinflight(struct user_struct *user, struct file *fp)
+{
+	struct sock *s = unix_get_socket(fp);
+
+	spin_lock(&unix_gc_lock);
+
+	if (s) {
+		struct unix_sock *u = unix_sk(s);
+
+		BUG_ON(!atomic_long_read(&u->inflight));
+		BUG_ON(list_empty(&u->link));
+
+		if (atomic_long_dec_and_test(&u->inflight))
+			list_del_init(&u->link);
+		unix_tot_inflight--;
+	}
+	user->unix_inflight--;
+	spin_unlock(&unix_gc_lock);
+}
+
+/*
+ * The "user->unix_inflight" variable is protected by the garbage
+ * collection lock, and we just read it locklessly here. If you go
+ * over the limit, there might be a tiny race in actually noticing
+ * it across threads. Tough.
+ */
+static inline bool too_many_unix_fds(struct task_struct *p)
+{
+	struct user_struct *user = current_user();
+
+	if (unlikely(user->unix_inflight > task_rlimit(p, RLIMIT_NOFILE)))
+		return !capable(CAP_SYS_RESOURCE) && !capable(CAP_SYS_ADMIN);
+	return false;
+}
+
+int unix_attach_fds(struct scm_cookie *scm, struct sk_buff *skb)
+{
+	int i;
+
+	if (too_many_unix_fds(current))
+		return -ETOOMANYREFS;
+
+	/*
+	 * Need to duplicate file references for the sake of garbage
+	 * collection.  Otherwise a socket in the fps might become a
+	 * candidate for GC while the skb is not yet queued.
+	 */
+	UNIXCB(skb).fp = scm_fp_dup(scm->fp);
+	if (!UNIXCB(skb).fp)
+		return -ENOMEM;
+
+	for (i = scm->fp->count - 1; i >= 0; i--)
+		unix_inflight(scm->fp->user, scm->fp->fp[i]);
+	return 0;
+}
+EXPORT_SYMBOL(unix_attach_fds);
+
+void unix_detach_fds(struct scm_cookie *scm, struct sk_buff *skb)
+{
+	int i;
+
+	scm->fp = UNIXCB(skb).fp;
+	UNIXCB(skb).fp = NULL;
+
+	for (i = scm->fp->count-1; i >= 0; i--)
+		unix_notinflight(scm->fp->user, scm->fp->fp[i]);
+}
+EXPORT_SYMBOL(unix_detach_fds);
+
+void unix_destruct_scm(struct sk_buff *skb)
+{
+	struct scm_cookie scm;
+
+	memset(&scm, 0, sizeof(scm));
+	scm.pid  = UNIXCB(skb).pid;
+	if (UNIXCB(skb).fp)
+		unix_detach_fds(&scm, skb);
+
+	/* Alas, it calls VFS */
+	/* So fscking what? fput() had been SMP-safe since the last Summer */
+	scm_destroy(&scm);
+	sock_wfree(skb);
+}
+EXPORT_SYMBOL(unix_destruct_scm);
diff --git a/net/unix/scm.h b/net/unix/scm.h
new file mode 100644
index 000000000000..5a255a477f16
--- /dev/null
+++ b/net/unix/scm.h
@@ -0,0 +1,10 @@
+#ifndef NET_UNIX_SCM_H
+#define NET_UNIX_SCM_H
+
+extern struct list_head gc_inflight_list;
+extern spinlock_t unix_gc_lock;
+
+int unix_attach_fds(struct scm_cookie *scm, struct sk_buff *skb);
+void unix_detach_fds(struct scm_cookie *scm, struct sk_buff *skb);
+
+#endif

commit da84e8e9290e5a8f5ba2eda669ba41d6f8e94c20
Author: Maxim Levitsky <mlevitsk@redhat.com>
Date:   Thu Feb 25 17:41:32 2021 +0200

    KVM: x86: determine if an exception has an error code only when injecting it.
    
    commit b97f074583736c42fb36f2da1164e28c73758912 upstream.
    
    A page fault can be queued while vCPU is in real paged mode on AMD, and
    AMD manual asks the user to always intercept it
    (otherwise result is undefined).
    The resulting VM exit, does have an error code.
    
    Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
    Message-Id: <20210225154135.405125-2-mlevitsk@redhat.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Zubin Mithra <zsm@chromium.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 43fb4e296d8d..9cfc669b4a24 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -416,8 +416,6 @@ static void kvm_multiple_exception(struct kvm_vcpu *vcpu,
 
 	if (!vcpu->arch.exception.pending && !vcpu->arch.exception.injected) {
 	queue:
-		if (has_error && !is_protmode(vcpu))
-			has_error = false;
 		if (reinject) {
 			/*
 			 * On vmentry, vcpu->arch.exception.pending is only
@@ -7114,6 +7112,13 @@ static void update_cr8_intercept(struct kvm_vcpu *vcpu)
 	kvm_x86_ops->update_cr8_intercept(vcpu, tpr, max_irr);
 }
 
+static void kvm_inject_exception(struct kvm_vcpu *vcpu)
+{
+       if (vcpu->arch.exception.error_code && !is_protmode(vcpu))
+               vcpu->arch.exception.error_code = false;
+       kvm_x86_ops->queue_exception(vcpu);
+}
+
 static int inject_pending_event(struct kvm_vcpu *vcpu)
 {
 	int r;
@@ -7121,7 +7126,7 @@ static int inject_pending_event(struct kvm_vcpu *vcpu)
 	/* try to reinject previous events if any */
 
 	if (vcpu->arch.exception.injected)
-		kvm_x86_ops->queue_exception(vcpu);
+		kvm_inject_exception(vcpu);
 	/*
 	 * Do not inject an NMI or interrupt if there is a pending
 	 * exception.  Exceptions and interrupts are recognized at
@@ -7175,7 +7180,7 @@ static int inject_pending_event(struct kvm_vcpu *vcpu)
 			kvm_update_dr7(vcpu);
 		}
 
-		kvm_x86_ops->queue_exception(vcpu);
+		kvm_inject_exception(vcpu);
 	}
 
 	/* Don't consider new event if we re-injected an event */

commit 0365fcac3aa14b54d535a9dbf073eebaaa8e0287
Author: Ruslan Babayev <ruslan@babayev.com>
Date:   Sun May 5 12:24:36 2019 -0700

    iio: dac: ds4422/ds4424 drop of_node check
    
    commit a2d2010d95cd7ffe3773aba6eaee35d54e332c25 upstream.
    
    The driver doesn't actually rely on any DT properties. Removing this
    check makes it usable on ACPI based platforms.
    
    Signed-off-by: Ruslan Babayev <ruslan@babayev.com>
    Cc: xe-linux-external@cisco.com
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Cc: Paul Menzel <pmenzel@molgen.mpg.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iio/dac/ds4424.c b/drivers/iio/dac/ds4424.c
index 714a97f91319..ae9be792693b 100644
--- a/drivers/iio/dac/ds4424.c
+++ b/drivers/iio/dac/ds4424.c
@@ -236,12 +236,6 @@ static int ds4424_probe(struct i2c_client *client,
 	indio_dev->dev.of_node = client->dev.of_node;
 	indio_dev->dev.parent = &client->dev;
 
-	if (!client->dev.of_node) {
-		dev_err(&client->dev,
-				"Not found DT.\n");
-		return -ENODEV;
-	}
-
 	data->vcc_reg = devm_regulator_get(&client->dev, "vcc");
 	if (IS_ERR(data->vcc_reg)) {
 		dev_err(&client->dev,

commit 74c9985e30cf576ee19f877a40eec4d0fe076308
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Wed Jul 28 13:51:58 2021 +0200

    selftest: fix build error in tools/testing/selftests/vm/userfaultfd.c
    
    When backporting 0db282ba2c12 ("selftest: use mmap instead of
    posix_memalign to allocate memory") to this stable branch, I forgot a {
    breaking the build.
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/testing/selftests/vm/userfaultfd.c b/tools/testing/selftests/vm/userfaultfd.c
index 16d42b2de424..1963440f6725 100644
--- a/tools/testing/selftests/vm/userfaultfd.c
+++ b/tools/testing/selftests/vm/userfaultfd.c
@@ -131,7 +131,7 @@ static void anon_allocate_area(void **alloc_area)
 {
 	*alloc_area = mmap(NULL, nr_pages * page_size, PROT_READ | PROT_WRITE,
 			   MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
-	if (*alloc_area == MAP_FAILED)
+	if (*alloc_area == MAP_FAILED) {
 		fprintf(stderr, "mmap of anonymous memory failed");
 		*alloc_area = NULL;
 	}

commit ea771845119434207ae0905af33fa10b96dac18b
Author: Dongbo Yang <db.yang@rock-chips.com>
Date:   Fri Jul 30 09:50:36 2021 +0800

    media: i2c: add strobe control & fix expsoure for ov9281.
    
    Signed-off-by: Dongbo Yang <db.yang@rock-chips.com>
    Change-Id: I12ba55000c1814b4aeedc414b9ce7f6ddfb8ed19

diff --git a/drivers/media/i2c/ov9281.c b/drivers/media/i2c/ov9281.c
index 484f0668991a..0897791e1f8d 100644
--- a/drivers/media/i2c/ov9281.c
+++ b/drivers/media/i2c/ov9281.c
@@ -66,6 +66,15 @@
 
 #define OV9281_REG_VTS			0x380e
 
+#define OV9281_AEC_STROBE_REG		0x3927
+#define OV9281_AEC_STROBE_REG_H		0x3927
+#define OV9281_AEC_STROBE_REG_L		0x3928
+
+#define OV9282_AEC_GROUP_UPDATE_ADDRESS		0x3208
+#define OV9282_AEC_GROUP_UPDATE_START_DATA	0x00
+#define OV9282_AEC_GROUP_UPDATE_END_DATA	0x10
+#define OV9282_AEC_GROUP_UPDATE_END_LAUNCH	0xA0
+
 #define REG_NULL			0xFFFF
 
 #define OV9281_REG_VALUE_08BIT		1
@@ -149,6 +158,7 @@ struct ov9281 {
 	struct v4l2_ctrl	*hblank;
 	struct v4l2_ctrl	*vblank;
 	struct v4l2_ctrl	*test_pattern;
+	struct v4l2_ctrl	*strobe;
 	struct mutex		mutex;
 	bool			streaming;
 	bool			power_on;
@@ -1080,9 +1090,17 @@ static int ov9281_set_ctrl(struct v4l2_ctrl *ctrl)
 
 	switch (ctrl->id) {
 	case V4L2_CID_EXPOSURE:
+		ov9281_write_reg(ov9281->client, OV9282_AEC_GROUP_UPDATE_ADDRESS,
+				       OV9281_REG_VALUE_08BIT, OV9282_AEC_GROUP_UPDATE_START_DATA);
+
 		/* 4 least significant bits of expsoure are fractional part */
 		ret = ov9281_write_reg(ov9281->client, OV9281_REG_EXPOSURE,
 				       OV9281_REG_VALUE_24BIT, ctrl->val << 4);
+
+		ov9281_write_reg(ov9281->client, OV9282_AEC_GROUP_UPDATE_ADDRESS,
+				       OV9281_REG_VALUE_08BIT, OV9282_AEC_GROUP_UPDATE_END_DATA);
+		ov9281_write_reg(ov9281->client, OV9282_AEC_GROUP_UPDATE_ADDRESS,
+				       OV9281_REG_VALUE_08BIT, OV9282_AEC_GROUP_UPDATE_END_LAUNCH);
 		break;
 	case V4L2_CID_ANALOGUE_GAIN:
 		ret = ov9281_write_reg(ov9281->client, OV9281_REG_GAIN_H,
@@ -1097,6 +1115,14 @@ static int ov9281_set_ctrl(struct v4l2_ctrl *ctrl)
 				       OV9281_REG_VALUE_16BIT,
 				       ctrl->val + ov9281->cur_mode->height);
 		break;
+	case V4L2_CID_BRIGHTNESS:
+		ret = ov9281_write_reg(ov9281->client, OV9281_AEC_STROBE_REG_H,
+					   OV9281_REG_VALUE_08BIT,
+					   (ctrl->val >> 8) & 0xff);
+		ret |= ov9281_write_reg(ov9281->client, OV9281_AEC_STROBE_REG_L,
+					   OV9281_REG_VALUE_08BIT,
+					   ctrl->val & 0xff);
+		break;
 	case V4L2_CID_TEST_PATTERN:
 		ret = ov9281_enable_test_pattern(ov9281, ctrl->val);
 		break;
@@ -1162,6 +1188,11 @@ static int ov9281_initialize_controls(struct ov9281 *ov9281)
 				OV9281_GAIN_MAX, OV9281_GAIN_STEP,
 				OV9281_GAIN_DEFAULT);
 
+	ov9281->strobe = v4l2_ctrl_new_std(handler, &ov9281_ctrl_ops,
+				V4L2_CID_BRIGHTNESS, 1,
+				exposure_max/16, 1,
+				0xc8);
+
 	ov9281->test_pattern = v4l2_ctrl_new_std_menu_items(handler,
 				&ov9281_ctrl_ops, V4L2_CID_TEST_PATTERN,
 				ARRAY_SIZE(ov9281_test_pattern_menu) - 1,

commit 25db7b2bb4fdabfb8b49367a2ca8f2ff30987065
Author: Dongbo Yang <db.yang@rock-chips.com>
Date:   Wed Jul 7 16:23:53 2021 +0800

    media: i2c: modify ov9281 driver for thunderboot.
    
    Signed-off-by: Dongbo Yang <db.yang@rock-chips.com>
    Change-Id: I17defb2b02913de0a1e70479068cec244b554593

diff --git a/drivers/media/i2c/ov9281.c b/drivers/media/i2c/ov9281.c
index 245b11f4f4d2..484f0668991a 100644
--- a/drivers/media/i2c/ov9281.c
+++ b/drivers/media/i2c/ov9281.c
@@ -152,6 +152,9 @@ struct ov9281 {
 	struct mutex		mutex;
 	bool			streaming;
 	bool			power_on;
+	bool			is_thunderboot;
+	bool			is_thunderboot_ng;
+	bool			is_first_streamoff;
 	const struct ov9281_mode *cur_mode;
 	u32			module_index;
 	const char		*module_facing;
@@ -753,10 +756,11 @@ static int __ov9281_start_stream(struct ov9281 *ov9281)
 {
 	int ret;
 
-	ret = ov9281_write_array(ov9281->client, ov9281->cur_mode->reg_list);
-	if (ret)
-		return ret;
-
+	if (!ov9281->is_thunderboot) {
+		ret = ov9281_write_array(ov9281->client, ov9281->cur_mode->reg_list);
+		if (ret)
+			return ret;
+	}
 	/* In case these controls are set before streaming */
 	mutex_unlock(&ov9281->mutex);
 	ret = v4l2_ctrl_handler_setup(&ov9281->ctrl_handler);
@@ -770,6 +774,8 @@ static int __ov9281_start_stream(struct ov9281 *ov9281)
 
 static int __ov9281_stop_stream(struct ov9281 *ov9281)
 {
+	if (ov9281->is_thunderboot)
+		ov9281->is_first_streamoff = true;
 	return ov9281_write_reg(ov9281->client, OV9281_REG_CTRL_MODE,
 				OV9281_REG_VALUE_08BIT, OV9281_MODE_SW_STANDBY);
 }
@@ -859,6 +865,11 @@ static int __ov9281_power_on(struct ov9281 *ov9281)
 	u32 delay_us;
 	struct device *dev = &ov9281->client->dev;
 
+	/* No need when thunderboot. */
+	if (ov9281->is_thunderboot) {
+		return 0;
+	}
+
 	if (!IS_ERR_OR_NULL(ov9281->pins_default)) {
 		ret = pinctrl_select_state(ov9281->pinctrl,
 					   ov9281->pins_default);
@@ -910,6 +921,15 @@ static void __ov9281_power_off(struct ov9281 *ov9281)
 	int ret;
 	struct device *dev = &ov9281->client->dev;
 
+	if (ov9281->is_thunderboot) {
+		if (ov9281->is_first_streamoff) {
+			ov9281->is_thunderboot = false;
+			ov9281->is_first_streamoff = false;
+		} else {
+			return;
+		}
+	}
+
 	if (!IS_ERR(ov9281->pwdn_gpio))
 		gpiod_set_value_cansleep(ov9281->pwdn_gpio, 0);
 	clk_disable_unprepare(ov9281->xvclk);
@@ -1171,6 +1191,11 @@ static int ov9281_check_sensor_id(struct ov9281 *ov9281,
 	u32 id = 0;
 	int ret;
 
+	if (ov9281->is_thunderboot) {
+		dev_info(dev, "Enable thunderboot mode, skip sensor id check\n");
+		return 0;
+	}
+
 	ret = ov9281_read_reg(client, OV9281_REG_CHIP_ID,
 			      OV9281_REG_VALUE_16BIT, &id);
 	if (id != CHIP_ID) {
@@ -1229,6 +1254,7 @@ static int ov9281_probe(struct i2c_client *client,
 
 	ov9281->client = client;
 	ov9281->cur_mode = &supported_modes[0];
+	ov9281->is_thunderboot = IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP);
 
 	ov9281->xvclk = devm_clk_get(dev, "xvclk");
 	if (IS_ERR(ov9281->xvclk)) {
@@ -1236,11 +1262,11 @@ static int ov9281_probe(struct i2c_client *client,
 		return -EINVAL;
 	}
 
-	ov9281->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+	ov9281->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_ASIS);
 	if (IS_ERR(ov9281->reset_gpio))
 		dev_warn(dev, "Failed to get reset-gpios\n");
 
-	ov9281->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW);
+	ov9281->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_ASIS);
 	if (IS_ERR(ov9281->pwdn_gpio))
 		dev_warn(dev, "Failed to get pwdn-gpios\n");
 

commit 6863a5d24ada33a5e4c613568a40f78fe1ca5bc6
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Fri Jul 30 16:50:39 2021 +0800

    staging: android: ion: fix partial sync for iommu
    
    Fixes: 975372e2cb6c ("staging: android: ion: support partial cpu access")
    Change-Id: Iabf3b04dbc838ca5c60fa1a0592bbb5aac496090
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c
index afe389ed3084..e3051e99b200 100644
--- a/drivers/staging/android/ion/ion.c
+++ b/drivers/staging/android/ion/ion.c
@@ -437,14 +437,11 @@ static int ion_sgl_sync_range(struct device *dev, struct scatterlist *sgl,
 	for_each_sg(sgl, sg, nents, i) {
 		unsigned int sg_offset, sg_left, size = 0;
 
-		if (i == 0)
-			sg_dma_addr = sg_dma_address(sg);
+		sg_dma_addr = sg_dma_address(sg);
 
 		len += sg->length;
-		if (len <= offset) {
-			sg_dma_addr += sg->length;
+		if (len <= offset)
 			continue;
-		}
 
 		sg_left = len - offset;
 		sg_offset = sg->length - sg_left;
@@ -459,7 +456,6 @@ static int ion_sgl_sync_range(struct device *dev, struct scatterlist *sgl,
 
 		offset += size;
 		length -= size;
-		sg_dma_addr += sg->length;
 
 		if (length == 0)
 			break;

commit d206db33762676304efb295c38a57801839c312a
Author: Ziyuan Xu <xzy.xu@rock-chips.com>
Date:   Thu Jul 29 17:39:32 2021 +0800

    ARM: configs: disable tb_isp as default for rv1126-tb
    
    THUNDER_BOOT_ISP is used for snapshot first frame in risc-v, it's
    useless for most of products.
    
    Signed-off-by: Ziyuan Xu <xzy.xu@rock-chips.com>
    Change-Id: Id64c514f9d21671dfae43b7eff927cae861ce733

diff --git a/arch/arm/configs/rv1126-battery-evb.config b/arch/arm/configs/rv1126-battery-evb.config
index 0bf4941ef112..6b8a2e3b7ba1 100644
--- a/arch/arm/configs/rv1126-battery-evb.config
+++ b/arch/arm/configs/rv1126-battery-evb.config
@@ -34,6 +34,5 @@ CONFIG_SOUND=y
 # CONFIG_VIDEO_OS04A10 is not set
 CONFIG_VIDEO_OS04C10=y
 # CONFIG_VIDEO_OV2718 is not set
-# CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP is not set
 # CONFIG_SDIO_CIS_CYW43012 is not set
 CONFIG_SDIO_CIS_CYW43438=y
diff --git a/arch/arm/configs/rv1126-snapshot.config b/arch/arm/configs/rv1126-snapshot.config
index 0347da223faf..8129fa59eeb3 100644
--- a/arch/arm/configs/rv1126-snapshot.config
+++ b/arch/arm/configs/rv1126-snapshot.config
@@ -38,5 +38,6 @@ CONFIG_USB_DWC3_GADGET=y
 CONFIG_VIDEO_OS04C10=y
 # CONFIG_VIDEO_OV2718 is not set
 # CONFIG_VIDEO_ROCKCHIP_CIF is not set
+CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP=y
 # CONFIG_WIRELESS is not set
 # CONFIG_XZ_DEC is not set
diff --git a/arch/arm/configs/rv1126-tb.config b/arch/arm/configs/rv1126-tb.config
index 729df48a8cb0..e3206f843780 100644
--- a/arch/arm/configs/rv1126-tb.config
+++ b/arch/arm/configs/rv1126-tb.config
@@ -71,6 +71,7 @@ CONFIG_VIDEO_OV2718=y
 # CONFIG_VIDEO_OV4689 is not set
 CONFIG_WL_ROCKCHIP=m
 CONFIG_INITCALL_ASYNC=y
+# CONFIG_ROCKCHIP_THUNDER_BOOT_CRYPTO is not set
 CONFIG_ROCKCHIP_THUNDER_BOOT_MMC=y
 CONFIG_ROCKCHIP_THUNDER_BOOT_SFC=y
 CONFIG_ROMFS_BACKED_BY_BLOCK=y
@@ -79,4 +80,4 @@ CONFIG_ROMFS_BACKED_BY_BLOCK=y
 CONFIG_ROMFS_ON_BLOCK=y
 # CONFIG_USB_KBD is not set
 # CONFIG_USB_MOUSE is not set
-CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP=y
+# CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP is not set

commit 02cb79c93b598378dd22baf8095c983b678846e5
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Fri Jul 2 21:46:51 2021 +0800

    drivers: rk_flash: set dma mask to 32bits
    
    The nandc's DMA only supports 32bits. When the DDR capacity exceeds 4GB,
    It need to configure DMA mask to 32bits and use API dma_map_single to
    get the physical address.
    
    Change-Id: I1510f7bbe2779ea20ff83a93e3a4dabb941263e3
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/rkflash/rknandc_base.c b/drivers/rkflash/rknandc_base.c
index 05b62ec21c50..b5d6cb36af40 100644
--- a/drivers/rkflash/rknandc_base.c
+++ b/drivers/rkflash/rknandc_base.c
@@ -39,23 +39,14 @@ static struct completion nandc_irq_complete;
 
 unsigned long rknandc_dma_map_single(unsigned long ptr, int size, int dir)
 {
-#ifdef CONFIG_ARM64
-	__dma_map_area((void *)ptr, size, dir);
-	return ((unsigned long)virt_to_phys((void *)ptr));
-#else
-	return dma_map_single(NULL, (void *)ptr, size
+	return dma_map_single(g_nandc_dev, (void *)ptr, size
 		, dir ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
-#endif
 }
 
 void rknandc_dma_unmap_single(unsigned long ptr, int size, int dir)
 {
-#ifdef CONFIG_ARM64
-	__dma_unmap_area(phys_to_virt(ptr), size, dir);
-#else
-	dma_unmap_single(NULL, (dma_addr_t)ptr, size
+	dma_unmap_single(g_nandc_dev, (dma_addr_t)ptr, size
 		, dir ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
-#endif
 }
 
 static irqreturn_t rknandc_interrupt(int irq, void *dev_id)
@@ -136,7 +127,10 @@ static int rknandc_probe(struct platform_device *pdev)
 	rknandc_irq_init();
 	ret = rkflash_dev_init(g_nandc_info.reg_base, FLASH_TYPE_NANDC_NAND, &nandc_nand_ops);
 
-	return ret;
+	if (ret)
+		return ret;
+
+	return dma_set_mask(g_nandc_dev, DMA_BIT_MASK(32));
 }
 
 static int __maybe_unused rknandc_suspend(struct device *dev)
diff --git a/drivers/rkflash/rksfc_base.c b/drivers/rkflash/rksfc_base.c
index ec557c27d282..213c602ca8fc 100644
--- a/drivers/rkflash/rksfc_base.c
+++ b/drivers/rkflash/rksfc_base.c
@@ -41,23 +41,14 @@ static struct completion sfc_irq_complete;
 
 unsigned long rksfc_dma_map_single(unsigned long ptr, int size, int dir)
 {
-#ifdef CONFIG_ARM64
-	__dma_map_area((void *)ptr, size, dir);
-	return ((unsigned long)virt_to_phys((void *)ptr));
-#else
-	return dma_map_single(NULL, (void *)ptr, size
+	return dma_map_single(g_sfc_dev, (void *)ptr, size
 		, dir ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
-#endif
 }
 
 void rksfc_dma_unmap_single(unsigned long ptr, int size, int dir)
 {
-#ifdef CONFIG_ARM64
-	__dma_unmap_area(phys_to_virt(ptr), size, dir);
-#else
-	dma_unmap_single(NULL, (dma_addr_t)ptr, size
+	dma_unmap_single(g_sfc_dev, (dma_addr_t)ptr, size
 		, dir ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
-#endif
 }
 
 static irqreturn_t rksfc_interrupt(int irq, void *dev_id)
@@ -244,7 +235,10 @@ static int rksfc_probe(struct platform_device *pdev)
 		dev_result = rkflash_dev_init(g_sfc_info.reg_base, FLASH_TYPE_SFC_NAND, &sfc_nand_ops);
 #endif
 
-	return dev_result;
+	if (dev_result)
+		return dev_result;
+
+	return dma_set_mask(g_sfc_dev, DMA_BIT_MASK(32));
 }
 
 static int __maybe_unused rksfc_suspend(struct device *dev)
diff --git a/drivers/rkflash/sfc_nand.c b/drivers/rkflash/sfc_nand.c
index 08e12a9e7736..75b8b44e5548 100644
--- a/drivers/rkflash/sfc_nand.c
+++ b/drivers/rkflash/sfc_nand.c
@@ -160,7 +160,7 @@ static struct nand_info spi_nand_tbl[] = {
 };
 
 static struct nand_info *p_nand_info;
-static u32 gp_page_buf[SFC_NAND_PAGE_MAX_SIZE / 4];
+static u32 *gp_page_buf;
 static struct SFNAND_DEV sfc_nand_dev;
 
 static struct nand_info *sfc_nand_get_info(u8 *nand_id)
@@ -1045,6 +1045,10 @@ u32 sfc_nand_init(void)
 		return (u32)FTL_UNSUPPORTED_FLASH;
 	}
 
+	gp_page_buf = (u32 *)__get_free_pages(GFP_KERNEL | GFP_DMA32, get_order(SFC_NAND_PAGE_MAX_SIZE));
+	if (!gp_page_buf)
+		return -ENOMEM;
+
 	sfc_nand_dev.manufacturer = id_byte[0];
 	sfc_nand_dev.mem_type = id_byte[1];
 	sfc_nand_dev.capacity = p_nand_info->density;
@@ -1057,7 +1061,7 @@ u32 sfc_nand_init(void)
 	sfc_nand_dev.prog_lines = DATA_LINES_X1;
 	sfc_nand_dev.page_read_cmd = 0x03;
 	sfc_nand_dev.page_prog_cmd = 0x02;
-	sfc_nand_dev.recheck_buffer = kmalloc(SFC_NAND_PAGE_MAX_SIZE, GFP_KERNEL | GFP_DMA);
+	sfc_nand_dev.recheck_buffer = (u8 *)__get_free_pages(GFP_KERNEL | GFP_DMA32, get_order(SFC_NAND_PAGE_MAX_SIZE));
 	if (!sfc_nand_dev.recheck_buffer) {
 		pr_err("%s recheck_buffer alloc failed\n", __func__);
 		return -ENOMEM;
@@ -1092,7 +1096,8 @@ u32 sfc_nand_init(void)
 void sfc_nand_deinit(void)
 {
 	/* to-do */
-	kfree(sfc_nand_dev.recheck_buffer);
+	free_pages((unsigned long)sfc_nand_dev.recheck_buffer, get_order(SFC_NAND_PAGE_MAX_SIZE));
+	free_pages((unsigned long)gp_page_buf, get_order(SFC_NAND_PAGE_MAX_SIZE));
 }
 
 struct SFNAND_DEV *sfc_nand_get_private_dev(void)
diff --git a/drivers/rkflash/sfc_nor_mtd.c b/drivers/rkflash/sfc_nor_mtd.c
index bff6ec1f73ef..8c9d69a581f2 100644
--- a/drivers/rkflash/sfc_nor_mtd.c
+++ b/drivers/rkflash/sfc_nor_mtd.c
@@ -202,7 +202,7 @@ int sfc_nor_mtd_init(struct SFNOR_DEV *p_dev, struct mutex *lock)
 	priv_dev->mtd.erasesize = p_dev->blk_size << 9;
 	priv_dev->mtd.writebufsize = NOR_PAGE_SIZE;
 	priv_dev->lock = lock;
-	priv_dev->dma_buf = kmalloc(SFC_NOR_MTD_DMA_MAX, GFP_KERNEL | GFP_DMA);
+	priv_dev->dma_buf = (u8 *)__get_free_pages(GFP_KERNEL | GFP_DMA32, get_order(SFC_NOR_MTD_DMA_MAX));
 	if (!priv_dev->dma_buf) {
 		rkflash_print_error("%s %d alloc failed\n", __func__, __LINE__);
 		ret = -ENOMEM;
@@ -258,7 +258,7 @@ int sfc_nor_mtd_init(struct SFNOR_DEV *p_dev, struct mutex *lock)
 		return 0;
 	}
 
-	kfree(priv_dev->dma_buf);
+	free_pages((unsigned long)priv_dev->dma_buf, get_order(SFC_NOR_MTD_DMA_MAX));
 error_out:
 	kfree(priv_dev);
 

commit 212b4d3a42674d2cf366bd7b06fe9faae03477fc
Author: Hridya Valsaraju <hridya@google.com>
Date:   Sun Jul 25 20:49:06 2021 -0700

    ANDROID: staging: ion: move buffer kmap from begin/end_cpu_access()
    
    Since dma_buf_begin/end_cpu_access() calls always used to bracket
    dma_buf_kmap/kunmap calls, ION performed kmap/kunmap invocations for the
    buffer during dma_buf_begin/end_cpu_access() calls and cached the
    results with a kmap counter.
    However, dma_buf_begin/end_cpu_access() invocations can be
    triggered from the userspace using the DMA_BUF_IOC_SYNC ioctl as well.
    This means that a mapping that was created by a device driver using by a
    dma_buf_kmap() call or an ion_map_kernel() call could be unmapped
    from userspace if a client accidentally(or maliciously) invoked
    DMA_BUF_IOCTL_SYNC IOCTL with 'DMA_BUF_SYNC_END' argument since this
    would inturn invoke dma_buf_end_cpu_access() which would then decrement
    the kmap counter and invoke kunmap() when the counter gets to 0.
    
    This patch moves the kmap/kunmap operations from the
    begin/end_cpu_access() DMA-BUF ops to the map/unmap DMA-BUF ops to
    prevent the issue.
    
    Bug: 187527909
    Change-Id: I00dc8eefefb1f3aab99e770f90d624011f7740f0
    Signed-off-by: Hridya Valsaraju <hridya@google.com>

diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c
index 5692828dd23d..40da0a02a570 100644
--- a/drivers/staging/android/ion/ion.c
+++ b/drivers/staging/android/ion/ion.c
@@ -323,45 +323,50 @@ static void ion_dma_buf_release(struct dma_buf *dmabuf)
 static void *ion_dma_buf_kmap(struct dma_buf *dmabuf, unsigned long offset)
 {
 	struct ion_buffer *buffer = dmabuf->priv;
+	void *vaddr;
+
+	if (!buffer->heap->ops->map_kernel) {
+		pr_err("%s: map kernel is not implemented by this heap.\n",
+		       __func__);
+		return ERR_PTR(-ENOTTY);
+	}
+	mutex_lock(&buffer->lock);
+	vaddr = ion_buffer_kmap_get(buffer);
+	mutex_unlock(&buffer->lock);
 
-	return buffer->vaddr + offset * PAGE_SIZE;
+	if (IS_ERR(vaddr))
+		return vaddr;
+
+	return vaddr + offset * PAGE_SIZE;
 }
 
 static void ion_dma_buf_kunmap(struct dma_buf *dmabuf, unsigned long offset,
 			       void *ptr)
 {
+	struct ion_buffer *buffer = dmabuf->priv;
+
+	if (buffer->heap->ops->map_kernel) {
+		mutex_lock(&buffer->lock);
+		ion_buffer_kmap_put(buffer);
+		mutex_unlock(&buffer->lock);
+	}
+
 }
 
 static int ion_dma_buf_begin_cpu_access(struct dma_buf *dmabuf,
 					enum dma_data_direction direction)
 {
 	struct ion_buffer *buffer = dmabuf->priv;
-	void *vaddr;
 	struct ion_dma_buf_attachment *a;
-	int ret = 0;
-
-	/*
-	 * TODO: Move this elsewhere because we don't always need a vaddr
-	 */
-	if (buffer->heap->ops->map_kernel) {
-		mutex_lock(&buffer->lock);
-		vaddr = ion_buffer_kmap_get(buffer);
-		if (IS_ERR(vaddr)) {
-			ret = PTR_ERR(vaddr);
-			goto unlock;
-		}
-		mutex_unlock(&buffer->lock);
-	}
 
 	mutex_lock(&buffer->lock);
 	list_for_each_entry(a, &buffer->attachments, list) {
 		dma_sync_sg_for_cpu(a->dev, a->table->sgl, a->table->nents,
 				    direction);
 	}
-
-unlock:
 	mutex_unlock(&buffer->lock);
-	return ret;
+
+	return 0;
 }
 
 static int ion_dma_buf_end_cpu_access(struct dma_buf *dmabuf,
@@ -370,12 +375,6 @@ static int ion_dma_buf_end_cpu_access(struct dma_buf *dmabuf,
 	struct ion_buffer *buffer = dmabuf->priv;
 	struct ion_dma_buf_attachment *a;
 
-	if (buffer->heap->ops->map_kernel) {
-		mutex_lock(&buffer->lock);
-		ion_buffer_kmap_put(buffer);
-		mutex_unlock(&buffer->lock);
-	}
-
 	mutex_lock(&buffer->lock);
 	list_for_each_entry(a, &buffer->attachments, list) {
 		dma_sync_sg_for_device(a->dev, a->table->sgl, a->table->nents,

commit 912b48e8708920fa3b5eae60fa72767047cccc6a
Author: Simon Xue <xxm@rock-chips.com>
Date:   Thu Jul 29 09:50:36 2021 +0800

    PCI: rockchip: fix subsys_irq_handler logic
    
    Clear irq status first then handle the udma interrupt.
    
    Change-Id: I3638524b7bd09ad21a431bfebd3ba0b5bfbe7b8e
    Signed-off-by: Simon Xue <xxm@rock-chips.com>

diff --git a/drivers/pci/controller/pcie-rockchip-host.c b/drivers/pci/controller/pcie-rockchip-host.c
index 45547ee5e2cd..7b98f586d91c 100644
--- a/drivers/pci/controller/pcie-rockchip-host.c
+++ b/drivers/pci/controller/pcie-rockchip-host.c
@@ -544,9 +544,9 @@ static irqreturn_t rockchip_pcie_subsys_irq_handler(int irq, void *arg)
 	}
 
 	if (reg & PCIE_CLIENT_INT_UDMA) {
-		rockchip_pcie_handle_dma_interrupt(rockchip);
 		rockchip_pcie_write(rockchip, sub_reg, PCIE_CLIENT_INT_STATUS);
 		rockchip_pcie_write(rockchip, reg, PCIE_CLIENT_INT_STATUS);
+		rockchip_pcie_handle_dma_interrupt(rockchip);
 	}
 
 	rockchip_pcie_write(rockchip, reg & PCIE_CLIENT_INT_LOCAL,

commit 9697ead7cc989eb833222577079acc9adf23eca5
Author: William Wu <william.wu@rock-chips.com>
Date:   Thu Jul 29 12:10:16 2021 +0800

    arm64: dts: rockchip: rk3568: disable receiver detection in P3 for usb
    
    RK3568 USB DWC3 controllers require to disable receiver detection
    in P3 for correct detection of USB devices. And this quirk to set
    the GUSB3PIPECTL.DISRXDETINP3, then the DWC3 core will change the
    PHY power state to P2 and then perform receiver detection. After
    receiver detection, the DWC3 core will change the PHY power state
    to P3 state.
    
    Signed-off-by: William Wu <william.wu@rock-chips.com>
    Change-Id: Iaad3f7ce2c4dee1788539781e3bcfbb39458f5d6

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index bd074644061a..01145ddaa877 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -568,6 +568,7 @@
 			snps,dis-u2-freeclk-exists-quirk;
 			snps,dis-del-phy-power-chg-quirk;
 			snps,dis-tx-ipgap-linecheck-quirk;
+			snps,dis_rxdet_inp3_quirk;
 			snps,xhci-trb-ent-quirk;
 			status = "disabled";
 		};
@@ -599,6 +600,7 @@
 			snps,dis-u2-freeclk-exists-quirk;
 			snps,dis-del-phy-power-chg-quirk;
 			snps,dis-tx-ipgap-linecheck-quirk;
+			snps,dis_rxdet_inp3_quirk;
 			snps,xhci-trb-ent-quirk;
 			status = "disabled";
 		};

commit 7b641cbfffae454f95679532b2a042f291ec6139
Author: William Wu <william.wu@rock-chips.com>
Date:   Wed Jul 28 20:26:05 2021 +0800

    usb: gadget: uvc: fix NULL pointer dereference when usb hotplug
    
    When do uvc hotplug test on RV1126 EVB, it may crash in the
    uvc_v4l2_streamon() with the following error log. Because
    it tries to enable the video stream after usb disconnect.
    
    [ 1748.947755] configfs-gadget gadget: uvc_function_disable
    [ 1748.947947] android_work: sent uevent USB_STATE=DISCONNECTED
    [ 1748.955347] Unable to handle kernel NULL pointer dereference at virtual address 00000003
    [ 1748.956158] pgd = ef2a7e72
    [ 1748.956550] [00000003] *pgd=6dde7835
    [ 1748.956893] Internal error: Oops: 17 [#1] PREEMPT SMP ARM
    [ 1748.957381] Modules linked in: galcore(O) bcmdhd
    [ 1748.957819] CPU: 3 PID: 2706 Comm: uvc_gadget_pthr Tainted: G        W  O      4.19.111 #9
    [ 1748.958567] Hardware name: Generic DT based system
    [ 1748.959218] PC is at uvcg_video_enable+0xb8/0x228
    [ 1748.959775] LR is at vb2_core_streamon+0x11c/0x15c
    ......
    [ 1749.041063] [<b056a2cc>] (uvcg_video_enable) from [<b0569968>] (uvc_v4l2_streamon+0x28/0x70)
    [ 1749.041906] [<b0569968>] (uvc_v4l2_streamon) from [<b0590b54>] (__video_do_ioctl+0x1c8/0x3a0)
    [ 1749.042681] [<b0590b54>] (__video_do_ioctl) from [<b0594288>] (video_usercopy+0x200/0x494)
    [ 1749.043475] [<b0594288>] (video_usercopy) from [<b0220c38>] (do_vfs_ioctl+0xac/0x798)
    [ 1749.044178] [<b0220c38>] (do_vfs_ioctl) from [<b0221358>] (ksys_ioctl+0x34/0x58)
    [ 1749.044843] [<b0221358>] (ksys_ioctl) from [<b0101000>] (ret_fast_syscall+0x0/0x4c)
    
    Signed-off-by: William Wu <william.wu@rock-chips.com>
    Change-Id: I6bb58133aaade0ff389fa4af2cfc05fe598de250

diff --git a/drivers/usb/gadget/function/uvc_v4l2.c b/drivers/usb/gadget/function/uvc_v4l2.c
index 2fb819e56a38..e66002023664 100644
--- a/drivers/usb/gadget/function/uvc_v4l2.c
+++ b/drivers/usb/gadget/function/uvc_v4l2.c
@@ -201,6 +201,9 @@ uvc_v4l2_streamon(struct file *file, void *fh, enum v4l2_buf_type type)
 	if (type != video->queue.queue.type)
 		return -EINVAL;
 
+	if (uvc->state != UVC_STATE_CONNECTED)
+		return -ENODEV;
+
 	/* Enable UVC video. */
 	ret = uvcg_video_enable(video, 1);
 	if (ret < 0)

commit 79bd4cbaf9243e091ac1728b732e33aa5e731b34
Merge: e6f64a043b8f a89b48fe9308
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Wed Jul 28 13:24:42 2021 +0200

    Merge 4.19.199 into android-4.19-stable
    
    Changes in 4.19.199
            ARM: dts: gemini: rename mdio to the right name
            ARM: dts: gemini: add device_type on pci
            ARM: dts: rockchip: fix pinctrl sleep nodename for rk3036-kylin and rk3288
            arm64: dts: rockchip: fix pinctrl sleep nodename for rk3399.dtsi
            ARM: dts: rockchip: Fix the timer clocks order
            ARM: dts: rockchip: Fix IOMMU nodes properties on rk322x
            ARM: dts: rockchip: Fix power-controller node names for rk3288
            arm64: dts: rockchip: Fix power-controller node names for rk3328
            reset: ti-syscon: fix to_ti_syscon_reset_data macro
            ARM: brcmstb: dts: fix NAND nodes names
            ARM: Cygnus: dts: fix NAND nodes names
            ARM: NSP: dts: fix NAND nodes names
            ARM: dts: BCM63xx: Fix NAND nodes names
            ARM: dts: Hurricane 2: Fix NAND nodes names
            ARM: dts: imx6: phyFLEX: Fix UART hardware flow control
            ARM: imx: pm-imx5: Fix references to imx5_cpu_suspend_info
            rtc: mxc_v2: add missing MODULE_DEVICE_TABLE
            ARM: dts: stm32: fix gpio-keys node on STM32 MCU boards
            ARM: dts: stm32: fix RCC node name on stm32f429 MCU
            ARM: dts: stm32: fix timer nodes on STM32 MCU to prevent warnings
            arm64: dts: juno: Update SCPI nodes as per the YAML schema
            ARM: dts: rockchip: fix supply properties in io-domains nodes
            ARM: dts: stm32: fix i2c node name on stm32f746 to prevent warnings
            ARM: dts: stm32: move stmmac axi config in ethernet node on stm32mp15
            soc/tegra: fuse: Fix Tegra234-only builds
            arm64: dts: ls208xa: remove bus-num from dspi node
            thermal/core: Correct function name thermal_zone_device_unregister()
            kbuild: mkcompile_h: consider timestamp if KBUILD_BUILD_TIMESTAMP is set
            rtc: max77686: Do not enforce (incorrect) interrupt trigger type
            scsi: aic7xxx: Fix unintentional sign extension issue on left shift of u8
            scsi: libsas: Add LUN number check in .slave_alloc callback
            scsi: libfc: Fix array index out of bound exception
            sched/fair: Fix CFS bandwidth hrtimer expiry type
            mm: slab: fix kmem_cache_create failed when sysfs node not destroyed
            dm writecache: return the exact table values that were set
            dm writecache: fix writing beyond end of underlying device when shrinking
            net: dsa: mv88e6xxx: enable .rmu_disable() on Topaz
            net: ipv6: fix return value of ip6_skb_dst_mtu
            netfilter: ctnetlink: suspicious RCU usage in ctnetlink_dump_helpinfo
            net: bridge: sync fdb to new unicast-filtering ports
            net: bcmgenet: Ensure all TX/RX queues DMAs are disabled
            net: moxa: fix UAF in moxart_mac_probe
            net: qcom/emac: fix UAF in emac_remove
            net: ti: fix UAF in tlan_remove_one
            net: send SYNACK packet with accepted fwmark
            net: validate lwtstate->data before returning from skb_tunnel_info()
            dma-buf/sync_file: Don't leak fences on merge failure
            tcp: annotate data races around tp->mtu_info
            ipv6: tcp: drop silly ICMPv6 packet too big messages
            bpftool: Properly close va_list 'ap' by va_end() on error
            udp: annotate data races around unix_sk(sk)->gso_size
            net: ip_tunnel: fix mtu calculation for ETHER tunnel devices
            igb: Fix use-after-free error during reset
            ixgbe: Fix an error handling path in 'ixgbe_probe()'
            igb: Fix an error handling path in 'igb_probe()'
            fm10k: Fix an error handling path in 'fm10k_probe()'
            e1000e: Fix an error handling path in 'e1000_probe()'
            iavf: Fix an error handling path in 'iavf_probe()'
            igb: Check if num of q_vectors is smaller than max before array access
            igb: Fix position of assignment to *ring
            ipv6: fix 'disable_policy' for fwd packets
            nvme-pci: do not call nvme_dev_remove_admin from nvme_remove
            perf map: Fix dso->nsinfo refcounting
            perf probe: Fix dso->nsinfo refcounting
            perf dso: Fix memory leak in dso__new_map()
            perf lzma: Close lzma stream on exit
            perf test bpf: Free obj_buf
            perf probe-file: Delete namelist in del_events() on the error path
            spi: mediatek: fix fifo rx mode
            liquidio: Fix unintentional sign extension issue on left shift of u16
            s390/bpf: Perform r1 range checking before accessing jit->seen_reg[r1]
            bpftool: Check malloc return value in mount_bpffs_for_pin
            net: fix uninit-value in caif_seqpkt_sendmsg
            net: decnet: Fix sleeping inside in af_decnet
            KVM: PPC: Fix kvm_arch_vcpu_ioctl vcpu_load leak
            netrom: Decrease sock refcount when sock timers expire
            scsi: iscsi: Fix iface sysfs attr detection
            scsi: target: Fix protect handling in WRITE SAME(32)
            spi: cadence: Correct initialisation of runtime PM again
            net/tcp_fastopen: fix data races around tfo_active_disable_stamp
            net/sched: act_skbmod: Skip non-Ethernet packets
            nvme-pci: don't WARN_ON in nvme_reset_work if ctrl.state is not RESETTING
            Revert "USB: quirks: ignore remote wake-up on Fibocom L850-GL LTE modem"
            sctp: update active_key for asoc when old key is being replaced
            net: sched: cls_api: Fix the the wrong parameter
            drm/panel: raspberrypi-touchscreen: Prevent double-free
            proc: Avoid mixing integer types in mem_rw()
            Revert "MIPS: add PMD table accounting into MIPS'pmd_alloc_one"
            s390/ftrace: fix ftrace_update_ftrace_func implementation
            ALSA: usb-audio: Add registration quirk for JBL Quantum headsets
            ALSA: sb: Fix potential ABBA deadlock in CSP driver
            xhci: Fix lost USB 2 remote wake
            KVM: PPC: Book3S: Fix H_RTAS rets buffer overflow
            usb: hub: Disable USB 3 device initiated lpm if exit latency is too high
            usb: hub: Fix link power management max exit latency (MEL) calculations
            USB: usb-storage: Add LaCie Rugged USB3-FW to IGNORE_UAS
            usb: max-3421: Prevent corruption of freed memory
            usb: renesas_usbhs: Fix superfluous irqs happen after usb_pkt_pop()
            USB: serial: option: add support for u-blox LARA-R6 family
            USB: serial: cp210x: fix comments for GE CS1000
            USB: serial: cp210x: add ID for CEL EM3588 USB ZigBee stick
            usb: dwc2: gadget: Fix sending zero length packet in DDMA mode.
            tracing: Fix bug in rb_per_cpu_empty() that might cause deadloop.
            media: ngene: Fix out-of-bounds bug in ngene_command_config_free_buf()
            ixgbe: Fix packet corruption due to missing DMA sync
            selftest: use mmap instead of posix_memalign to allocate memory
            nds32: fix up stack guard gap
            drm: Return -ENOTTY for non-drm ioctls
            KVM: do not assume PTE is writable after follow_pfn
            KVM: do not allow mapping valid but non-reference-counted pages
            KVM: Use kvm_pfn_t for local PFN variable in hva_to_pfn_remapped()
            net: dsa: mv88e6xxx: use correct .stats_set_histogram() on Topaz
            net: bcmgenet: ensure EXT_ENERGY_DET_MASK is clear
            iio: accel: bma180: Use explicit member assignment
            iio: accel: bma180: Fix BMA25x bandwidth register values
            btrfs: compression: don't try to compress if we don't have enough pages
            PCI: Mark AMD Navi14 GPU ATS as broken
            spi: spi-fsl-dspi: Fix a resource leak in an error handling path
            xhci: add xhci_get_virt_ep() helper
            Linux 4.19.199
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I64b971750ef2532ef201367d980a3519b8c8a591

commit a89b48fe9308d976d9dcb2112e264d647f7efce4
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Wed Jul 28 11:13:52 2021 +0200

    Linux 4.19.199
    
    Link: https://lore.kernel.org/r/20210726153832.339431936@linuxfoundation.org
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Link: https://lore.kernel.org/r/20210727071938.046014616@linuxfoundation.org
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Link: https://lore.kernel.org/r/20210727112108.341674321@linuxfoundation.org
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index 09688ffc3f00..f3ad63a089a1 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 198
+SUBLEVEL = 199
 EXTRAVERSION =
 NAME = "People's Front"
 

commit 80050dfea3c757da5dd5f6b23d49f38c6c6ea855
Author: Mathias Nyman <mathias.nyman@linux.intel.com>
Date:   Fri Jan 29 15:00:22 2021 +0200

    xhci: add xhci_get_virt_ep() helper
    
    [commit b1adc42d440df3233255e313a45ab7e9b2b74096 upstream]
    
    In several event handlers we need to find the right endpoint
    structure from slot_id and ep_index in the event.
    
    Add a helper for this, check that slot_id and ep_index are valid.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Link: https://lore.kernel.org/r/20210129130044.206855-6-mathias.nyman@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Carsten Schmid <carsten_schmid@mentor.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index 22b1de99d02d..7c981ad34251 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -433,6 +433,26 @@ static void ring_doorbell_for_active_rings(struct xhci_hcd *xhci,
 	}
 }
 
+static struct xhci_virt_ep *xhci_get_virt_ep(struct xhci_hcd *xhci,
+					     unsigned int slot_id,
+					     unsigned int ep_index)
+{
+	if (slot_id == 0 || slot_id >= MAX_HC_SLOTS) {
+		xhci_warn(xhci, "Invalid slot_id %u\n", slot_id);
+		return NULL;
+	}
+	if (ep_index >= EP_CTX_PER_DEV) {
+		xhci_warn(xhci, "Invalid endpoint index %u\n", ep_index);
+		return NULL;
+	}
+	if (!xhci->devs[slot_id]) {
+		xhci_warn(xhci, "No xhci virt device for slot_id %u\n", slot_id);
+		return NULL;
+	}
+
+	return &xhci->devs[slot_id]->eps[ep_index];
+}
+
 /* Get the right ring for the given slot_id, ep_index and stream_id.
  * If the endpoint supports streams, boundary check the URB's stream ID.
  * If the endpoint doesn't support streams, return the singular endpoint ring.
@@ -443,7 +463,10 @@ struct xhci_ring *xhci_triad_to_transfer_ring(struct xhci_hcd *xhci,
 {
 	struct xhci_virt_ep *ep;
 
-	ep = &xhci->devs[slot_id]->eps[ep_index];
+	ep = xhci_get_virt_ep(xhci, slot_id, ep_index);
+	if (!ep)
+		return NULL;
+
 	/* Common case: no streams */
 	if (!(ep->ep_state & EP_HAS_STREAMS))
 		return ep->ring;
@@ -718,11 +741,14 @@ static void xhci_handle_cmd_stop_ep(struct xhci_hcd *xhci, int slot_id,
 	memset(&deq_state, 0, sizeof(deq_state));
 	ep_index = TRB_TO_EP_INDEX(le32_to_cpu(trb->generic.field[3]));
 
+	ep = xhci_get_virt_ep(xhci, slot_id, ep_index);
+	if (!ep)
+		return;
+
 	vdev = xhci->devs[slot_id];
 	ep_ctx = xhci_get_ep_ctx(xhci, vdev->out_ctx, ep_index);
 	trace_xhci_handle_cmd_stop_ep(ep_ctx);
 
-	ep = &xhci->devs[slot_id]->eps[ep_index];
 	last_unlinked_td = list_last_entry(&ep->cancelled_td_list,
 			struct xhci_td, cancelled_td_list);
 
@@ -1043,9 +1069,11 @@ static void xhci_handle_cmd_set_deq(struct xhci_hcd *xhci, int slot_id,
 
 	ep_index = TRB_TO_EP_INDEX(le32_to_cpu(trb->generic.field[3]));
 	stream_id = TRB_TO_STREAM_ID(le32_to_cpu(trb->generic.field[2]));
-	dev = xhci->devs[slot_id];
-	ep = &dev->eps[ep_index];
+	ep = xhci_get_virt_ep(xhci, slot_id, ep_index);
+	if (!ep)
+		return;
 
+	dev = xhci->devs[slot_id];
 	ep_ring = xhci_stream_id_to_ring(dev, ep_index, stream_id);
 	if (!ep_ring) {
 		xhci_warn(xhci, "WARN Set TR deq ptr command for freed stream ID %u\n",
@@ -1118,9 +1146,9 @@ static void xhci_handle_cmd_set_deq(struct xhci_hcd *xhci, int slot_id,
 	}
 
 cleanup:
-	dev->eps[ep_index].ep_state &= ~SET_DEQ_PENDING;
-	dev->eps[ep_index].queued_deq_seg = NULL;
-	dev->eps[ep_index].queued_deq_ptr = NULL;
+	ep->ep_state &= ~SET_DEQ_PENDING;
+	ep->queued_deq_seg = NULL;
+	ep->queued_deq_ptr = NULL;
 	/* Restart any rings with pending URBs */
 	ring_doorbell_for_active_rings(xhci, slot_id, ep_index);
 }
@@ -1129,10 +1157,15 @@ static void xhci_handle_cmd_reset_ep(struct xhci_hcd *xhci, int slot_id,
 		union xhci_trb *trb, u32 cmd_comp_code)
 {
 	struct xhci_virt_device *vdev;
+	struct xhci_virt_ep *ep;
 	struct xhci_ep_ctx *ep_ctx;
 	unsigned int ep_index;
 
 	ep_index = TRB_TO_EP_INDEX(le32_to_cpu(trb->generic.field[3]));
+	ep = xhci_get_virt_ep(xhci, slot_id, ep_index);
+	if (!ep)
+		return;
+
 	vdev = xhci->devs[slot_id];
 	ep_ctx = xhci_get_ep_ctx(xhci, vdev->out_ctx, ep_index);
 	trace_xhci_handle_cmd_reset_ep(ep_ctx);
@@ -1162,7 +1195,7 @@ static void xhci_handle_cmd_reset_ep(struct xhci_hcd *xhci, int slot_id,
 		xhci_ring_cmd_db(xhci);
 	} else {
 		/* Clear our internal halted state */
-		xhci->devs[slot_id]->eps[ep_index].ep_state &= ~EP_HALTED;
+		ep->ep_state &= ~EP_HALTED;
 	}
 }
 
@@ -2281,14 +2314,13 @@ static int handle_tx_event(struct xhci_hcd *xhci,
 	trb_comp_code = GET_COMP_CODE(le32_to_cpu(event->transfer_len));
 	ep_trb_dma = le64_to_cpu(event->buffer);
 
-	xdev = xhci->devs[slot_id];
-	if (!xdev) {
-		xhci_err(xhci, "ERROR Transfer event pointed to bad slot %u\n",
-			 slot_id);
+	ep = xhci_get_virt_ep(xhci, slot_id, ep_index);
+	if (!ep) {
+		xhci_err(xhci, "ERROR Invalid Transfer event\n");
 		goto err_out;
 	}
 
-	ep = &xdev->eps[ep_index];
+	xdev = xhci->devs[slot_id];
 	ep_ring = xhci_dma_to_transfer_ring(ep, ep_trb_dma);
 	ep_ctx = xhci_get_ep_ctx(xhci, xdev->out_ctx, ep_index);
 
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
index 7a4195f8cd1c..dfc914713704 100644
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -991,6 +991,7 @@ struct xhci_interval_bw_table {
 	unsigned int		ss_bw_out;
 };
 
+#define EP_CTX_PER_DEV		31
 
 struct xhci_virt_device {
 	struct usb_device		*udev;
@@ -1005,7 +1006,7 @@ struct xhci_virt_device {
 	struct xhci_container_ctx       *out_ctx;
 	/* Used for addressing devices and configuration changes */
 	struct xhci_container_ctx       *in_ctx;
-	struct xhci_virt_ep		eps[31];
+	struct xhci_virt_ep		eps[EP_CTX_PER_DEV];
 	u8				fake_port;
 	u8				real_port;
 	struct xhci_interval_bw_table	*bw_table;

commit 00450ed03a17143e2433b461a656ef9cd17c2f1d
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Sun May 9 21:12:27 2021 +0200

    spi: spi-fsl-dspi: Fix a resource leak in an error handling path
    
    commit 680ec0549a055eb464dce6ffb4bfb736ef87236e upstream
    
    'dspi_request_dma()' should be undone by a 'dspi_release_dma()' call in the
    error handling path of the probe function, as already done in the remove
    function
    
    Fixes: 90ba37033cb9 ("spi: spi-fsl-dspi: Add DMA support for Vybrid")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
    Link: https://lore.kernel.org/r/d51caaac747277a1099ba8dea07acd85435b857e.1620587472.git.christophe.jaillet@wanadoo.fr
    Signed-off-by: Mark Brown <broonie@kernel.org>
    [sudip: adjust context]
    Signed-off-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c
index 1b003dba86f9..25486ee8379b 100644
--- a/drivers/spi/spi-fsl-dspi.c
+++ b/drivers/spi/spi-fsl-dspi.c
@@ -1124,11 +1124,13 @@ static int dspi_probe(struct platform_device *pdev)
 	ret = spi_register_master(master);
 	if (ret != 0) {
 		dev_err(&pdev->dev, "Problem registering DSPI master\n");
-		goto out_free_irq;
+		goto out_release_dma;
 	}
 
 	return ret;
 
+out_release_dma:
+	dspi_release_dma(dspi);
 out_free_irq:
 	if (dspi->irq)
 		free_irq(dspi->irq, dspi);

commit a941105525cbcc24d81e284112c26c551b6d6d87
Author: Evan Quan <evan.quan@amd.com>
Date:   Wed Jun 2 10:12:55 2021 +0800

    PCI: Mark AMD Navi14 GPU ATS as broken
    
    commit e8946a53e2a698c148b3b3ed732f43c7747fbeb6 upstream
    
    Observed unexpected GPU hang during runpm stress test on 0x7341 rev 0x00.
    Further debugging shows broken ATS is related.
    
    Disable ATS on this part.  Similar issues on other devices:
    
      a2da5d8cc0b0 ("PCI: Mark AMD Raven iGPU ATS as broken in some platforms")
      45beb31d3afb ("PCI: Mark AMD Navi10 GPU rev 0x00 ATS as broken")
      5e89cd303e3a ("PCI: Mark AMD Navi14 GPU rev 0xc5 ATS as broken")
    
    Suggested-by: Alex Deucher <alexander.deucher@amd.com>
    Link: https://lore.kernel.org/r/20210602021255.939090-1-evan.quan@amd.com
    Signed-off-by: Evan Quan <evan.quan@amd.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Krzysztof Wilczy?ski <kw@linux.com>
    Cc: stable@vger.kernel.org
    [sudip: adjust context]
    Signed-off-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index bfb22de693eb..f287a9f919da 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -5172,7 +5172,8 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0422, quirk_no_ext_tags);
 static void quirk_amd_harvest_no_ats(struct pci_dev *pdev)
 {
 	if ((pdev->device == 0x7312 && pdev->revision != 0x00) ||
-	    (pdev->device == 0x7340 && pdev->revision != 0xc5))
+	    (pdev->device == 0x7340 && pdev->revision != 0xc5) ||
+	    (pdev->device == 0x7341 && pdev->revision != 0x00))
 		return;
 
 	pci_info(pdev, "disabling ATS\n");
@@ -5187,6 +5188,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x6900, quirk_amd_harvest_no_ats);
 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x7312, quirk_amd_harvest_no_ats);
 /* AMD Navi14 dGPU */
 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x7340, quirk_amd_harvest_no_ats);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x7341, quirk_amd_harvest_no_ats);
 #endif /* CONFIG_PCI_ATS */
 
 /* Freescale PCIe doesn't support MSI in RC mode */

commit a91010f5e28c95309bd0e35903728fab654b7ea5
Author: David Sterba <dsterba@suse.com>
Date:   Mon Jun 14 12:45:18 2021 +0200

    btrfs: compression: don't try to compress if we don't have enough pages
    
    commit f2165627319ffd33a6217275e5690b1ab5c45763 upstream
    
    The early check if we should attempt compression does not take into
    account the number of input pages. It can happen that there's only one
    page, eg. a tail page after some ranges of the BTRFS_MAX_UNCOMPRESSED
    have been processed, or an isolated page that won't be converted to an
    inline extent.
    
    The single page would be compressed but a later check would drop it
    again because the result size must be at least one block shorter than
    the input. That can never work with just one page.
    
    CC: stable@vger.kernel.org # 4.4+
    Signed-off-by: David Sterba <dsterba@suse.com>
    [sudip: adjust context]
    Signed-off-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index bf0e0e3e09c5..d29f4cf125d2 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -530,7 +530,7 @@ static noinline void compress_file_range(struct inode *inode,
 	 * inode has not been flagged as nocompress.  This flag can
 	 * change at any time if we discover bad compression ratios.
 	 */
-	if (inode_need_compress(inode, start, end)) {
+	if (nr_pages > 1 && inode_need_compress(inode, start, end)) {
 		WARN_ON(pages);
 		pages = kcalloc(nr_pages, sizeof(struct page *), GFP_NOFS);
 		if (!pages) {

commit e276295031c553b6d063de8667dcb6a3b0ef781c
Author: Stephan Gerhold <stephan@gerhold.net>
Date:   Wed May 26 11:44:07 2021 +0200

    iio: accel: bma180: Fix BMA25x bandwidth register values
    
    commit 8090d67421ddab0ae932abab5a60200598bf0bbb upstream
    
    According to the BMA253 datasheet [1] and BMA250 datasheet [2] the
    bandwidth value for BMA25x should be set as 01xxx:
    
      "Settings 00xxx result in a bandwidth of 7.81 Hz; [...]
       It is recommended [...] to use the range from ´01000b´ to ´01111b´
       only in order to be compatible with future products."
    
    However, at the moment the drivers sets bandwidth values from 0 to 6,
    which is not recommended and always results into 7.81 Hz bandwidth
    according to the datasheet.
    
    Fix this by introducing a bw_offset = 8 = 01000b for BMA25x,
    so the additional bit is always set for BMA25x.
    
    [1]: https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bma253-ds000.pdf
    [2]: https://datasheet.octopart.com/BMA250-Bosch-datasheet-15540103.pdf
    
    Cc: Peter Meerwald <pmeerw@pmeerw.net>
    Fixes: 2017cff24cc0 ("iio:bma180: Add BMA250 chip support")
    Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
    Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
    Link: https://lore.kernel.org/r/20210526094408.34298-2-stephan@gerhold.net
    Cc: <Stable@vger.kernel.org>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    [sudip: adjust context]
    Signed-off-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iio/accel/bma180.c b/drivers/iio/accel/bma180.c
index a020427ed1ca..52275dddab3e 100644
--- a/drivers/iio/accel/bma180.c
+++ b/drivers/iio/accel/bma180.c
@@ -50,7 +50,7 @@ struct bma180_part_info {
 
 	u8 int_reset_reg, int_reset_mask;
 	u8 sleep_reg, sleep_mask;
-	u8 bw_reg, bw_mask;
+	u8 bw_reg, bw_mask, bw_offset;
 	u8 scale_reg, scale_mask;
 	u8 power_reg, power_mask, lowpower_val;
 	u8 int_enable_reg, int_enable_mask;
@@ -106,6 +106,7 @@ struct bma180_part_info {
 
 #define BMA250_RANGE_MASK	GENMASK(3, 0) /* Range of accel values */
 #define BMA250_BW_MASK		GENMASK(4, 0) /* Accel bandwidth */
+#define BMA250_BW_OFFSET	8
 #define BMA250_SUSPEND_MASK	BIT(7) /* chip will sleep */
 #define BMA250_LOWPOWER_MASK	BIT(6)
 #define BMA250_DATA_INTEN_MASK	BIT(4)
@@ -243,7 +244,8 @@ static int bma180_set_bw(struct bma180_data *data, int val)
 	for (i = 0; i < data->part_info->num_bw; ++i) {
 		if (data->part_info->bw_table[i] == val) {
 			ret = bma180_set_bits(data, data->part_info->bw_reg,
-				data->part_info->bw_mask, i);
+				data->part_info->bw_mask,
+				i + data->part_info->bw_offset);
 			if (ret) {
 				dev_err(&data->client->dev,
 					"failed to set bandwidth\n");
@@ -661,6 +663,7 @@ static const struct bma180_part_info bma180_part_info[] = {
 		.sleep_mask = BMA250_SUSPEND_MASK,
 		.bw_reg = BMA250_BW_REG,
 		.bw_mask = BMA250_BW_MASK,
+		.bw_offset = BMA250_BW_OFFSET,
 		.scale_reg = BMA250_RANGE_REG,
 		.scale_mask = BMA250_RANGE_MASK,
 		.power_reg = BMA250_POWER_REG,

commit c1fd285f090c01811b05d18908da81e507bbd21c
Author: Linus Walleij <linus.walleij@linaro.org>
Date:   Wed Dec 11 22:38:18 2019 +0100

    iio: accel: bma180: Use explicit member assignment
    
    commit 9436abc40139503a7cea22a96437697d048f31c0 upstream
    
    This uses the C99 explicit .member assignment for the
    variant data in struct bma180_part_info. This makes it
    easier to understand and add new variants.
    
    Cc: Peter Meerwald <pmeerw@pmeerw.net>
    Cc: Oleksandr Kravchenko <o.v.kravchenko@globallogic.com>
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iio/accel/bma180.c b/drivers/iio/accel/bma180.c
index 4bedf48d662a..a020427ed1ca 100644
--- a/drivers/iio/accel/bma180.c
+++ b/drivers/iio/accel/bma180.c
@@ -625,32 +625,52 @@ static const struct iio_chan_spec bma250_channels[] = {
 
 static const struct bma180_part_info bma180_part_info[] = {
 	[BMA180] = {
-		bma180_channels, ARRAY_SIZE(bma180_channels),
-		bma180_scale_table, ARRAY_SIZE(bma180_scale_table),
-		bma180_bw_table, ARRAY_SIZE(bma180_bw_table),
-		BMA180_CTRL_REG0, BMA180_RESET_INT,
-		BMA180_CTRL_REG0, BMA180_SLEEP,
-		BMA180_BW_TCS, BMA180_BW,
-		BMA180_OFFSET_LSB1, BMA180_RANGE,
-		BMA180_TCO_Z, BMA180_MODE_CONFIG, BMA180_LOW_POWER,
-		BMA180_CTRL_REG3, BMA180_NEW_DATA_INT,
-		BMA180_RESET,
-		bma180_chip_config,
-		bma180_chip_disable,
+		.channels = bma180_channels,
+		.num_channels = ARRAY_SIZE(bma180_channels),
+		.scale_table = bma180_scale_table,
+		.num_scales = ARRAY_SIZE(bma180_scale_table),
+		.bw_table = bma180_bw_table,
+		.num_bw = ARRAY_SIZE(bma180_bw_table),
+		.int_reset_reg = BMA180_CTRL_REG0,
+		.int_reset_mask = BMA180_RESET_INT,
+		.sleep_reg = BMA180_CTRL_REG0,
+		.sleep_mask = BMA180_SLEEP,
+		.bw_reg = BMA180_BW_TCS,
+		.bw_mask = BMA180_BW,
+		.scale_reg = BMA180_OFFSET_LSB1,
+		.scale_mask = BMA180_RANGE,
+		.power_reg = BMA180_TCO_Z,
+		.power_mask = BMA180_MODE_CONFIG,
+		.lowpower_val = BMA180_LOW_POWER,
+		.int_enable_reg = BMA180_CTRL_REG3,
+		.int_enable_mask = BMA180_NEW_DATA_INT,
+		.softreset_reg = BMA180_RESET,
+		.chip_config = bma180_chip_config,
+		.chip_disable = bma180_chip_disable,
 	},
 	[BMA250] = {
-		bma250_channels, ARRAY_SIZE(bma250_channels),
-		bma250_scale_table, ARRAY_SIZE(bma250_scale_table),
-		bma250_bw_table, ARRAY_SIZE(bma250_bw_table),
-		BMA250_INT_RESET_REG, BMA250_INT_RESET_MASK,
-		BMA250_POWER_REG, BMA250_SUSPEND_MASK,
-		BMA250_BW_REG, BMA250_BW_MASK,
-		BMA250_RANGE_REG, BMA250_RANGE_MASK,
-		BMA250_POWER_REG, BMA250_LOWPOWER_MASK, 1,
-		BMA250_INT_ENABLE_REG, BMA250_DATA_INTEN_MASK,
-		BMA250_RESET_REG,
-		bma250_chip_config,
-		bma250_chip_disable,
+		.channels = bma250_channels,
+		.num_channels = ARRAY_SIZE(bma250_channels),
+		.scale_table = bma250_scale_table,
+		.num_scales = ARRAY_SIZE(bma250_scale_table),
+		.bw_table = bma250_bw_table,
+		.num_bw = ARRAY_SIZE(bma250_bw_table),
+		.int_reset_reg = BMA250_INT_RESET_REG,
+		.int_reset_mask = BMA250_INT_RESET_MASK,
+		.sleep_reg = BMA250_POWER_REG,
+		.sleep_mask = BMA250_SUSPEND_MASK,
+		.bw_reg = BMA250_BW_REG,
+		.bw_mask = BMA250_BW_MASK,
+		.scale_reg = BMA250_RANGE_REG,
+		.scale_mask = BMA250_RANGE_MASK,
+		.power_reg = BMA250_POWER_REG,
+		.power_mask = BMA250_LOWPOWER_MASK,
+		.lowpower_val = 1,
+		.int_enable_reg = BMA250_INT_ENABLE_REG,
+		.int_enable_mask = BMA250_DATA_INTEN_MASK,
+		.softreset_reg = BMA250_RESET_REG,
+		.chip_config = bma250_chip_config,
+		.chip_disable = bma250_chip_disable,
 	},
 };
 

commit 8810e8e477693860f7670046b89db79e2532efba
Author: Doug Berger <opendmb@gmail.com>
Date:   Tue Jun 29 17:14:19 2021 -0700

    net: bcmgenet: ensure EXT_ENERGY_DET_MASK is clear
    
    commit 5a3c680aa2c12c90c44af383fe6882a39875ab81 upstream.
    
    Setting the EXT_ENERGY_DET_MASK bit allows the port energy detection
    logic of the internal PHY to prevent the system from sleeping. Some
    internal PHYs will report that energy is detected when the network
    interface is closed which can prevent the system from going to sleep
    if WoL is enabled when the interface is brought down.
    
    Since the driver does not support waking the system on this logic,
    this commit clears the bit whenever the internal PHY is powered up
    and the other logic for manipulating the bit is removed since it
    serves no useful function.
    
    Fixes: 1c1008c793fa ("net: bcmgenet: add main driver file")
    Signed-off-by: Doug Berger <opendmb@gmail.com>
    Acked-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index bcc01fb1472c..79e156e2ad6a 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -1189,7 +1189,8 @@ static void bcmgenet_power_up(struct bcmgenet_priv *priv,
 
 	switch (mode) {
 	case GENET_POWER_PASSIVE:
-		reg &= ~(EXT_PWR_DOWN_DLL | EXT_PWR_DOWN_BIAS);
+		reg &= ~(EXT_PWR_DOWN_DLL | EXT_PWR_DOWN_BIAS |
+			 EXT_ENERGY_DET_MASK);
 		if (GENET_IS_V5(priv)) {
 			reg &= ~(EXT_PWR_DOWN_PHY_EN |
 				 EXT_PWR_DOWN_PHY_RD |
@@ -2908,12 +2909,6 @@ static int bcmgenet_open(struct net_device *dev)
 
 	bcmgenet_set_hw_addr(priv, dev->dev_addr);
 
-	if (priv->internal_phy) {
-		reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT);
-		reg |= EXT_ENERGY_DET_MASK;
-		bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT);
-	}
-
 	/* Disable RX/TX DMA and flush TX queues */
 	dma_ctrl = bcmgenet_dma_disable(priv);
 
@@ -3632,7 +3627,6 @@ static int bcmgenet_resume(struct device *d)
 	struct bcmgenet_priv *priv = netdev_priv(dev);
 	unsigned long dma_ctrl;
 	int ret;
-	u32 reg;
 
 	if (!netif_running(dev))
 		return 0;
@@ -3664,12 +3658,6 @@ static int bcmgenet_resume(struct device *d)
 
 	bcmgenet_set_hw_addr(priv, dev->dev_addr);
 
-	if (priv->internal_phy) {
-		reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT);
-		reg |= EXT_ENERGY_DET_MASK;
-		bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT);
-	}
-
 	if (priv->wolopts)
 		bcmgenet_power_up(priv, GENET_POWER_WOL_MAGIC);
 
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c b/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c
index 57582efa362d..457ee9ff0851 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c
@@ -166,12 +166,6 @@ int bcmgenet_wol_power_down_cfg(struct bcmgenet_priv *priv,
 	reg |= CMD_RX_EN;
 	bcmgenet_umac_writel(priv, reg, UMAC_CMD);
 
-	if (priv->hw_params->flags & GENET_HAS_EXT) {
-		reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT);
-		reg &= ~EXT_ENERGY_DET_MASK;
-		bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT);
-	}
-
 	return 0;
 }
 

commit a114b7c673af84b91c5a93170d6df3adf3860c90
Author: Marek Behún <kabel@kernel.org>
Date:   Thu Jul 1 00:22:27 2021 +0200

    net: dsa: mv88e6xxx: use correct .stats_set_histogram() on Topaz
    
    commit 11527f3c4725640e6c40a2b7654e303f45e82a6c upstream.
    
    Commit 40cff8fca9e3 ("net: dsa: mv88e6xxx: Fix stats histogram mode")
    introduced wrong .stats_set_histogram() method for Topaz family.
    
    The Peridot method should be used instead.
    
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Fixes: 40cff8fca9e3 ("net: dsa: mv88e6xxx: Fix stats histogram mode")
    Reviewed-by: Andrew Lunn <andrew@lunn.ch>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index 7c50d27bab76..1df7aed5ae15 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -3051,7 +3051,7 @@ static const struct mv88e6xxx_ops mv88e6141_ops = {
 	.port_link_state = mv88e6352_port_link_state,
 	.port_get_cmode = mv88e6352_port_get_cmode,
 	.stats_snapshot = mv88e6390_g1_stats_snapshot,
-	.stats_set_histogram = mv88e6095_g1_stats_set_histogram,
+	.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
 	.stats_get_sset_count = mv88e6320_stats_get_sset_count,
 	.stats_get_strings = mv88e6320_stats_get_strings,
 	.stats_get_stats = mv88e6390_stats_get_stats,
@@ -3672,7 +3672,7 @@ static const struct mv88e6xxx_ops mv88e6341_ops = {
 	.port_link_state = mv88e6352_port_link_state,
 	.port_get_cmode = mv88e6352_port_get_cmode,
 	.stats_snapshot = mv88e6390_g1_stats_snapshot,
-	.stats_set_histogram = mv88e6095_g1_stats_set_histogram,
+	.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
 	.stats_get_sset_count = mv88e6320_stats_get_sset_count,
 	.stats_get_strings = mv88e6320_stats_get_strings,
 	.stats_get_stats = mv88e6390_stats_get_stats,

commit fbb7f6a05a06d6998950fe65d4ad6857e1fa0b56
Author: Sean Christopherson <seanjc@google.com>
Date:   Mon Feb 8 12:19:40 2021 -0800

    KVM: Use kvm_pfn_t for local PFN variable in hva_to_pfn_remapped()
    
    commit a9545779ee9e9e103648f6f2552e73cfe808d0f4 upstream.
    
    Use kvm_pfn_t, a.k.a. u64, for the local 'pfn' variable when retrieving
    a so called "remapped" hva/pfn pair.  In theory, the hva could resolve to
    a pfn in high memory on a 32-bit kernel.
    
    This bug was inadvertantly exposed by commit bd2fae8da794 ("KVM: do not
    assume PTE is writable after follow_pfn"), which added an error PFN value
    to the mix, causing gcc to comlain about overflowing the unsigned long.
    
      arch/x86/kvm/../../../virt/kvm/kvm_main.c: In function ?hva_to_pfn_remapped??
      include/linux/kvm_host.h:89:30: error: conversion from ?long long unsigned int??                                      to ?long unsigned int??changes value from
                                      ??218868437227405314??to ????[-Werror=overflow]
       89 | #define KVM_PFN_ERR_RO_FAULT (KVM_PFN_ERR_MASK + 2)
          |                              ^
    virt/kvm/kvm_main.c:1935:9: note: in expansion of macro ?KVM_PFN_ERR_RO_FAULT??    
    Cc: stable@vger.kernel.org
    Fixes: add6a0cd1c5b ("KVM: MMU: try to fix up page faults before giving up")
    Signed-off-by: Sean Christopherson <seanjc@google.com>
    Message-Id: <20210208201940.1258328-1-seanjc@google.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 3559eba5f502..a3d82113ae1c 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -1501,7 +1501,7 @@ static int hva_to_pfn_remapped(struct vm_area_struct *vma,
 			       bool write_fault, bool *writable,
 			       kvm_pfn_t *p_pfn)
 {
-	unsigned long pfn;
+	kvm_pfn_t pfn;
 	pte_t *ptep;
 	spinlock_t *ptl;
 	int r;

commit 117777467bc015f0dc5fc079eeba0fa80c965149
Author: Nicholas Piggin <npiggin@gmail.com>
Date:   Thu Jun 24 08:29:04 2021 -0400

    KVM: do not allow mapping valid but non-reference-counted pages
    
    commit f8be156be163a052a067306417cd0ff679068c97 upstream.
    
    It's possible to create a region which maps valid but non-refcounted
    pages (e.g., tail pages of non-compound higher order allocations). These
    host pages can then be returned by gfn_to_page, gfn_to_pfn, etc., family
    of APIs, which take a reference to the page, which takes it from 0 to 1.
    When the reference is dropped, this will free the page incorrectly.
    
    Fix this by only taking a reference on valid pages if it was non-zero,
    which indicates it is participating in normal refcounting (and can be
    released with put_page).
    
    This addresses CVE-2021-22543.
    
    Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
    Tested-by: Paolo Bonzini <pbonzini@redhat.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 6aeac96bf147..3559eba5f502 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -1489,6 +1489,13 @@ static bool vma_is_valid(struct vm_area_struct *vma, bool write_fault)
 	return true;
 }
 
+static int kvm_try_get_pfn(kvm_pfn_t pfn)
+{
+	if (kvm_is_reserved_pfn(pfn))
+		return 1;
+	return get_page_unless_zero(pfn_to_page(pfn));
+}
+
 static int hva_to_pfn_remapped(struct vm_area_struct *vma,
 			       unsigned long addr, bool *async,
 			       bool write_fault, bool *writable,
@@ -1538,13 +1545,21 @@ static int hva_to_pfn_remapped(struct vm_area_struct *vma,
 	 * Whoever called remap_pfn_range is also going to call e.g.
 	 * unmap_mapping_range before the underlying pages are freed,
 	 * causing a call to our MMU notifier.
+	 *
+	 * Certain IO or PFNMAP mappings can be backed with valid
+	 * struct pages, but be allocated without refcounting e.g.,
+	 * tail pages of non-compound higher order allocations, which
+	 * would then underflow the refcount when the caller does the
+	 * required put_page. Don't allow those pages here.
 	 */ 
-	kvm_get_pfn(pfn);
+	if (!kvm_try_get_pfn(pfn))
+		r = -EFAULT;
 
 out:
 	pte_unmap_unlock(ptep, ptl);
 	*p_pfn = pfn;
-	return 0;
+
+	return r;
 }
 
 /*

commit 918e0039ec570aec22338a405bfd6dab1264de30
Author: Paolo Bonzini <pbonzini@redhat.com>
Date:   Mon Feb 1 05:12:11 2021 -0500

    KVM: do not assume PTE is writable after follow_pfn
    
    commit bd2fae8da794b55bf2ac02632da3a151b10e664c upstream.
    
    In order to convert an HVA to a PFN, KVM usually tries to use
    the get_user_pages family of functinso.  This however is not
    possible for VM_IO vmas; in that case, KVM instead uses follow_pfn.
    
    In doing this however KVM loses the information on whether the
    PFN is writable.  That is usually not a problem because the main
    use of VM_IO vmas with KVM is for BARs in PCI device assignment,
    however it is a bug.  To fix it, use follow_pte and check pte_write
    while under the protection of the PTE lock.  The information can
    be used to fail hva_to_pfn_remapped or passed back to the
    caller via *writable.
    
    Usage of follow_pfn was introduced in commit add6a0cd1c5b ("KVM: MMU: try to fix
    up page faults before giving up", 2016-07-05); however, even older version
    have the same issue, all the way back to commit 2e2e3738af33 ("KVM:
    Handle vma regions with no backing page", 2008-07-20), as they also did
    not check whether the PFN was writable.
    
    Fixes: 2e2e3738af33 ("KVM: Handle vma regions with no backing page")
    Reported-by: David Stevens <stevensd@google.com>
    Cc: 3pvd@google.com
    Cc: Jann Horn <jannh@google.com>
    Cc: Jason Gunthorpe <jgg@ziepe.ca>
    Cc: stable@vger.kernel.org
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    [OP: backport to 4.19, adjust follow_pte() -> follow_pte_pmd()]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 1ecb27b3421a..6aeac96bf147 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -1495,9 +1495,11 @@ static int hva_to_pfn_remapped(struct vm_area_struct *vma,
 			       kvm_pfn_t *p_pfn)
 {
 	unsigned long pfn;
+	pte_t *ptep;
+	spinlock_t *ptl;
 	int r;
 
-	r = follow_pfn(vma, addr, &pfn);
+	r = follow_pte_pmd(vma->vm_mm, addr, NULL, NULL, &ptep, NULL, &ptl);
 	if (r) {
 		/*
 		 * get_user_pages fails for VM_IO and VM_PFNMAP vmas and does
@@ -1512,14 +1514,19 @@ static int hva_to_pfn_remapped(struct vm_area_struct *vma,
 		if (r)
 			return r;
 
-		r = follow_pfn(vma, addr, &pfn);
+		r = follow_pte_pmd(vma->vm_mm, addr, NULL, NULL, &ptep, NULL, &ptl);
 		if (r)
 			return r;
+	}
 
+	if (write_fault && !pte_write(*ptep)) {
+		pfn = KVM_PFN_ERR_RO_FAULT;
+		goto out;
 	}
 
 	if (writable)
-		*writable = true;
+		*writable = pte_write(*ptep);
+	pfn = pte_pfn(*ptep);
 
 	/*
 	 * Get a reference here because callers of *hva_to_pfn* and
@@ -1534,6 +1541,8 @@ static int hva_to_pfn_remapped(struct vm_area_struct *vma,
 	 */ 
 	kvm_get_pfn(pfn);
 
+out:
+	pte_unmap_unlock(ptep, ptl);
 	*p_pfn = pfn;
 	return 0;
 }

commit 020a44cc54d65e673a13195e96fc0addbfd3a601
Author: Charles Baylis <cb-kernel@fishzet.co.uk>
Date:   Fri Jul 16 17:43:12 2021 +0100

    drm: Return -ENOTTY for non-drm ioctls
    
    commit 3abab27c322e0f2acf981595aa8040c9164dc9fb upstream.
    
    drm: Return -ENOTTY for non-drm ioctls
    
    Return -ENOTTY from drm_ioctl() when userspace passes in a cmd number
    which doesn't relate to the drm subsystem.
    
    Glibc uses the TCGETS ioctl to implement isatty(), and without this
    change isatty() returns it incorrectly returns true for drm devices.
    
    To test run this command:
    $ if [ -t 0 ]; then echo is a tty; fi < /dev/dri/card0
    which shows "is a tty" without this patch.
    
    This may also modify memory which the userspace application is not
    expecting.
    
    Signed-off-by: Charles Baylis <cb-kernel@fishzet.co.uk>
    Cc: stable@vger.kernel.org
    Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
    Link: https://patchwork.freedesktop.org/patch/msgid/YPG3IBlzaMhfPqCr@stando.fishzet.co.uk
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
index 2449b357f524..babd7ebabfef 100644
--- a/drivers/gpu/drm/drm_ioctl.c
+++ b/drivers/gpu/drm/drm_ioctl.c
@@ -797,6 +797,9 @@ long drm_ioctl(struct file *filp,
 	if (drm_dev_is_unplugged(dev))
 		return -ENODEV;
 
+       if (DRM_IOCTL_TYPE(cmd) != DRM_IOCTL_BASE)
+               return -ENOTTY;
+
 	is_driver_ioctl = nr >= DRM_COMMAND_BASE && nr < DRM_COMMAND_END;
 
 	if (is_driver_ioctl) {
diff --git a/include/drm/drm_ioctl.h b/include/drm/drm_ioctl.h
index fafb6f592c4b..b722757a5dc2 100644
--- a/include/drm/drm_ioctl.h
+++ b/include/drm/drm_ioctl.h
@@ -68,6 +68,7 @@ typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd,
 			       unsigned long arg);
 
 #define DRM_IOCTL_NR(n)                _IOC_NR(n)
+#define DRM_IOCTL_TYPE(n)              _IOC_TYPE(n)
 #define DRM_MAJOR       226
 
 /**

commit acb8e83073074bd885466c7da12919f80e9ccf5d
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Tue Jun 29 12:40:24 2021 +0200

    nds32: fix up stack guard gap
    
    commit c453db6cd96418c79702eaf38259002755ab23ff upstream.
    
    Commit 1be7107fbe18 ("mm: larger stack guard gap, between vmas") fixed
    up all architectures to deal with the stack guard gap.  But when nds32
    was added to the tree, it forgot to do the same thing.
    
    Resolve this by properly fixing up the nsd32's version of
    arch_get_unmapped_area()
    
    Cc: Nick Hu <nickhu@andestech.com>
    Cc: Greentime Hu <green.hu@gmail.com>
    Cc: Vincent Chen <deanbo422@gmail.com>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Qiang Liu <cyruscyliu@gmail.com>
    Cc: stable <stable@vger.kernel.org>
    Reported-by: iLifetruth <yixiaonn@gmail.com>
    Acked-by: Hugh Dickins <hughd@google.com>
    Link: https://lore.kernel.org/r/20210629104024.2293615-1-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/nds32/mm/mmap.c b/arch/nds32/mm/mmap.c
index c206b31ce07a..1bdf5e7d1b43 100644
--- a/arch/nds32/mm/mmap.c
+++ b/arch/nds32/mm/mmap.c
@@ -59,7 +59,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
 
 		vma = find_vma(mm, addr);
 		if (TASK_SIZE - len >= addr &&
-		    (!vma || addr + len <= vma->vm_start))
+		    (!vma || addr + len <= vm_start_gap(vma)))
 			return addr;
 	}
 

commit f96dfc7ce42c44533fb630e1ca6dad7cf48f803a
Author: Peter Collingbourne <pcc@google.com>
Date:   Fri Jul 23 15:50:04 2021 -0700

    selftest: use mmap instead of posix_memalign to allocate memory
    
    commit 0db282ba2c12c1515d490d14a1ff696643ab0f1b upstream.
    
    This test passes pointers obtained from anon_allocate_area to the
    userfaultfd and mremap APIs.  This causes a problem if the system
    allocator returns tagged pointers because with the tagged address ABI
    the kernel rejects tagged addresses passed to these APIs, which would
    end up causing the test to fail.  To make this test compatible with such
    system allocators, stop using the system allocator to allocate memory in
    anon_allocate_area, and instead just use mmap.
    
    Link: https://lkml.kernel.org/r/20210714195437.118982-3-pcc@google.com
    Link: https://linux-review.googlesource.com/id/Icac91064fcd923f77a83e8e133f8631c5b8fc241
    Fixes: c47174fc362a ("userfaultfd: selftest")
    Co-developed-by: Lokesh Gidra <lokeshgidra@google.com>
    Signed-off-by: Lokesh Gidra <lokeshgidra@google.com>
    Signed-off-by: Peter Collingbourne <pcc@google.com>
    Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Vincenzo Frascino <vincenzo.frascino@arm.com>
    Cc: Dave Martin <Dave.Martin@arm.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Alistair Delva <adelva@google.com>
    Cc: William McVicker <willmcvicker@google.com>
    Cc: Evgenii Stepanov <eugenis@google.com>
    Cc: Mitch Phillips <mitchp@google.com>
    Cc: Andrey Konovalov <andreyknvl@gmail.com>
    Cc: <stable@vger.kernel.org>    [5.4]
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/testing/selftests/vm/userfaultfd.c b/tools/testing/selftests/vm/userfaultfd.c
index 7b8171e3128a..16d42b2de424 100644
--- a/tools/testing/selftests/vm/userfaultfd.c
+++ b/tools/testing/selftests/vm/userfaultfd.c
@@ -129,8 +129,10 @@ static int anon_release_pages(char *rel_area)
 
 static void anon_allocate_area(void **alloc_area)
 {
-	if (posix_memalign(alloc_area, page_size, nr_pages * page_size)) {
-		fprintf(stderr, "out of memory\n");
+	*alloc_area = mmap(NULL, nr_pages * page_size, PROT_READ | PROT_WRITE,
+			   MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
+	if (*alloc_area == MAP_FAILED)
+		fprintf(stderr, "mmap of anonymous memory failed");
 		*alloc_area = NULL;
 	}
 }

commit 08c2d7c8aa871027c7e56bf61335e70dd51bf017
Author: Markus Boehme <markubo@amazon.com>
Date:   Tue Jul 20 16:26:19 2021 -0700

    ixgbe: Fix packet corruption due to missing DMA sync
    
    commit 09cfae9f13d51700b0fecf591dcd658fc5375428 upstream.
    
    When receiving a packet with multiple fragments, hardware may still
    touch the first fragment until the entire packet has been received. The
    driver therefore keeps the first fragment mapped for DMA until end of
    packet has been asserted, and delays its dma_sync call until then.
    
    The driver tries to fit multiple receive buffers on one page. When using
    3K receive buffers (e.g. using Jumbo frames and legacy-rx is turned
    off/build_skb is being used) on an architecture with 4K pages, the
    driver allocates an order 1 compound page and uses one page per receive
    buffer. To determine the correct offset for a delayed DMA sync of the
    first fragment of a multi-fragment packet, the driver then cannot just
    use PAGE_MASK on the DMA address but has to construct a mask based on
    the actual size of the backing page.
    
    Using PAGE_MASK in the 3K RX buffer/4K page architecture configuration
    will always sync the first page of a compound page. With the SWIOTLB
    enabled this can lead to corrupted packets (zeroed out first fragment,
    re-used garbage from another packet) and various consequences, such as
    slow/stalling data transfers and connection resets. For example, testing
    on a link with MTU exceeding 3058 bytes on a host with SWIOTLB enabled
    (e.g. "iommu=soft swiotlb=262144,force") TCP transfers quickly fizzle
    out without this patch.
    
    Cc: stable@vger.kernel.org
    Fixes: 0c5661ecc5dd7 ("ixgbe: fix crash in build_skb Rx code path")
    Signed-off-by: Markus Boehme <markubo@amazon.com>
    Tested-by: Tony Brelinski <tonyx.brelinski@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index 4d9d97e0b6c4..ef92438e4e6d 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -1823,7 +1823,8 @@ static void ixgbe_dma_sync_frag(struct ixgbe_ring *rx_ring,
 				struct sk_buff *skb)
 {
 	if (ring_uses_build_skb(rx_ring)) {
-		unsigned long offset = (unsigned long)(skb->data) & ~PAGE_MASK;
+		unsigned long mask = (unsigned long)ixgbe_rx_pg_size(rx_ring) - 1;
+		unsigned long offset = (unsigned long)(skb->data) & mask;
 
 		dma_sync_single_range_for_cpu(rx_ring->dev,
 					      IXGBE_CB(skb)->dma,

commit ec731c6ef564ee6fc101fc5d73e3a3a953d09a00
Author: Gustavo A. R. Silva <gustavoars@kernel.org>
Date:   Mon Apr 19 18:43:32 2021 -0500

    media: ngene: Fix out-of-bounds bug in ngene_command_config_free_buf()
    
    commit 8d4abca95ecc82fc8c41912fa0085281f19cc29f upstream.
    
    Fix an 11-year old bug in ngene_command_config_free_buf() while
    addressing the following warnings caught with -Warray-bounds:
    
    arch/alpha/include/asm/string.h:22:16: warning: '__builtin_memcpy' offset [12, 16] from the object at 'com' is out of the bounds of referenced subobject 'config' with type 'unsigned char' at offset 10 [-Warray-bounds]
    arch/x86/include/asm/string_32.h:182:25: warning: '__builtin_memcpy' offset [12, 16] from the object at 'com' is out of the bounds of referenced subobject 'config' with type 'unsigned char' at offset 10 [-Warray-bounds]
    
    The problem is that the original code is trying to copy 6 bytes of
    data into a one-byte size member _config_ of the wrong structue
    FW_CONFIGURE_BUFFERS, in a single call to memcpy(). This causes a
    legitimate compiler warning because memcpy() overruns the length
    of &com.cmd.ConfigureBuffers.config. It seems that the right
    structure is FW_CONFIGURE_FREE_BUFFERS, instead, because it contains
    6 more members apart from the header _hdr_. Also, the name of
    the function ngene_command_config_free_buf() suggests that the actual
    intention is to ConfigureFreeBuffers, instead of ConfigureBuffers
    (which takes place in the function ngene_command_config_buf(), above).
    
    Fix this by enclosing those 6 members of struct FW_CONFIGURE_FREE_BUFFERS
    into new struct config, and use &com.cmd.ConfigureFreeBuffers.config as
    the destination address, instead of &com.cmd.ConfigureBuffers.config,
    when calling memcpy().
    
    This also helps with the ongoing efforts to globally enable
    -Warray-bounds and get us closer to being able to tighten the
    FORTIFY_SOURCE routines on memcpy().
    
    Link: https://github.com/KSPP/linux/issues/109
    Fixes: dae52d009fc9 ("V4L/DVB: ngene: Initial check-in")
    Cc: stable@vger.kernel.org
    Reported-by: kernel test robot <lkp@intel.com>
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
    Link: https://lore.kernel.org/linux-hardening/20210420001631.GA45456@embeddedor/
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/media/pci/ngene/ngene-core.c b/drivers/media/pci/ngene/ngene-core.c
index 25f16833a475..aa60559bbbb4 100644
--- a/drivers/media/pci/ngene/ngene-core.c
+++ b/drivers/media/pci/ngene/ngene-core.c
@@ -398,7 +398,7 @@ static int ngene_command_config_free_buf(struct ngene *dev, u8 *config)
 
 	com.cmd.hdr.Opcode = CMD_CONFIGURE_FREE_BUFFER;
 	com.cmd.hdr.Length = 6;
-	memcpy(&com.cmd.ConfigureBuffers.config, config, 6);
+	memcpy(&com.cmd.ConfigureFreeBuffers.config, config, 6);
 	com.in_len = 6;
 	com.out_len = 0;
 
diff --git a/drivers/media/pci/ngene/ngene.h b/drivers/media/pci/ngene/ngene.h
index 01d9f1b58fcb..9728bce1ea1c 100644
--- a/drivers/media/pci/ngene/ngene.h
+++ b/drivers/media/pci/ngene/ngene.h
@@ -419,12 +419,14 @@ enum _BUFFER_CONFIGS {
 
 struct FW_CONFIGURE_FREE_BUFFERS {
 	struct FW_HEADER hdr;
-	u8   UVI1_BufferLength;
-	u8   UVI2_BufferLength;
-	u8   TVO_BufferLength;
-	u8   AUD1_BufferLength;
-	u8   AUD2_BufferLength;
-	u8   TVA_BufferLength;
+	struct {
+		u8   UVI1_BufferLength;
+		u8   UVI2_BufferLength;
+		u8   TVO_BufferLength;
+		u8   AUD1_BufferLength;
+		u8   AUD2_BufferLength;
+		u8   TVA_BufferLength;
+	} __packed config;
 } __attribute__ ((__packed__));
 
 struct FW_CONFIGURE_UART {

commit 6a99bfee7f5625d2577a5c3b09a2bd2a845feb8a
Author: Haoran Luo <www@aegistudio.net>
Date:   Wed Jul 21 14:12:07 2021 +0000

    tracing: Fix bug in rb_per_cpu_empty() that might cause deadloop.
    
    commit 67f0d6d9883c13174669f88adac4f0ee656cc16a upstream.
    
    The "rb_per_cpu_empty()" misinterpret the condition (as not-empty) when
    "head_page" and "commit_page" of "struct ring_buffer_per_cpu" points to
    the same buffer page, whose "buffer_data_page" is empty and "read" field
    is non-zero.
    
    An error scenario could be constructed as followed (kernel perspective):
    
    1. All pages in the buffer has been accessed by reader(s) so that all of
    them will have non-zero "read" field.
    
    2. Read and clear all buffer pages so that "rb_num_of_entries()" will
    return 0 rendering there's no more data to read. It is also required
    that the "read_page", "commit_page" and "tail_page" points to the same
    page, while "head_page" is the next page of them.
    
    3. Invoke "ring_buffer_lock_reserve()" with large enough "length"
    so that it shot pass the end of current tail buffer page. Now the
    "head_page", "commit_page" and "tail_page" points to the same page.
    
    4. Discard current event with "ring_buffer_discard_commit()", so that
    "head_page", "commit_page" and "tail_page" points to a page whose buffer
    data page is now empty.
    
    When the error scenario has been constructed, "tracing_read_pipe" will
    be trapped inside a deadloop: "trace_empty()" returns 0 since
    "rb_per_cpu_empty()" returns 0 when it hits the CPU containing such
    constructed ring buffer. Then "trace_find_next_entry_inc()" always
    return NULL since "rb_num_of_entries()" reports there's no more entry
    to read. Finally "trace_seq_to_user()" returns "-EBUSY" spanking
    "tracing_read_pipe" back to the start of the "waitagain" loop.
    
    I've also written a proof-of-concept script to construct the scenario
    and trigger the bug automatically, you can use it to trace and validate
    my reasoning above:
    
      https://github.com/aegistudio/RingBufferDetonator.git
    
    Tests has been carried out on linux kernel 5.14-rc2
    (2734d6c1b1a089fb593ef6a23d4b70903526fe0c), my fixed version
    of kernel (for testing whether my update fixes the bug) and
    some older kernels (for range of affected kernels). Test result is
    also attached to the proof-of-concept repository.
    
    Link: https://lore.kernel.org/linux-trace-devel/YPaNxsIlb2yjSi5Y@aegistudio/
    Link: https://lore.kernel.org/linux-trace-devel/YPgrN85WL9VyrZ55@aegistudio
    
    Cc: stable@vger.kernel.org
    Fixes: bf41a158cacba ("ring-buffer: make reentrant")
    Suggested-by: Linus Torvalds <torvalds@linuxfoundation.org>
    Signed-off-by: Haoran Luo <www@aegistudio.net>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index 360129e47540..987d3447bf2a 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -3172,10 +3172,30 @@ static bool rb_per_cpu_empty(struct ring_buffer_per_cpu *cpu_buffer)
 	if (unlikely(!head))
 		return true;
 
-	return reader->read == rb_page_commit(reader) &&
-		(commit == reader ||
-		 (commit == head &&
-		  head->read == rb_page_commit(commit)));
+	/* Reader should exhaust content in reader page */
+	if (reader->read != rb_page_commit(reader))
+		return false;
+
+	/*
+	 * If writers are committing on the reader page, knowing all
+	 * committed content has been read, the ring buffer is empty.
+	 */
+	if (commit == reader)
+		return true;
+
+	/*
+	 * If writers are committing on a page other than reader page
+	 * and head page, there should always be content to read.
+	 */
+	if (commit != head)
+		return false;
+
+	/*
+	 * Writers are committing on the head page, we just need
+	 * to care about there're committed data, and the reader will
+	 * swap reader page with head page when it is to read data.
+	 */
+	return rb_page_commit(commit) == 0;
 }
 
 /**

commit ba176c1bd7ca3e9f3bec70f2637c17d2b86469d1
Author: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
Date:   Tue Jul 20 05:41:24 2021 -0700

    usb: dwc2: gadget: Fix sending zero length packet in DDMA mode.
    
    commit d53dc38857f6dbefabd9eecfcbf67b6eac9a1ef4 upstream.
    
    Sending zero length packet in DDMA mode perform by DMA descriptor
    by setting SP (short packet) flag.
    
    For DDMA in function dwc2_hsotg_complete_in() does not need to send
    zlp.
    
    Tested by USBCV MSC tests.
    
    Fixes: f71b5e2533de ("usb: dwc2: gadget: fix zero length packet transfers")
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
    Link: https://lore.kernel.org/r/967bad78c55dd2db1c19714eee3d0a17cf99d74a.1626777738.git.Minas.Harutyunyan@synopsys.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index d0edb7e453c0..7fff96dff0a0 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -2645,12 +2645,14 @@ static void dwc2_hsotg_complete_in(struct dwc2_hsotg *hsotg,
 		return;
 	}
 
-	/* Zlp for all endpoints, for ep0 only in DATA IN stage */
+	/* Zlp for all endpoints in non DDMA, for ep0 only in DATA IN stage */
 	if (hs_ep->send_zlp) {
-		dwc2_hsotg_program_zlp(hsotg, hs_ep);
 		hs_ep->send_zlp = 0;
-		/* transfer will be completed on next complete interrupt */
-		return;
+		if (!using_desc_dma(hsotg)) {
+			dwc2_hsotg_program_zlp(hsotg, hs_ep);
+			/* transfer will be completed on next complete interrupt */
+			return;
+		}
 	}
 
 	if (hs_ep->index == 0 && hsotg->ep0_state == DWC2_EP0_DATA_IN) {

commit 7b9ff81c60602d16663d0b2aa830fdc999f80fd6
Author: John Keeping <john@metanate.com>
Date:   Wed Jul 21 17:17:45 2021 +0100

    USB: serial: cp210x: add ID for CEL EM3588 USB ZigBee stick
    
    commit d6a206e60124a9759dd7f6dfb86b0e1d3b1df82e upstream.
    
    Add the USB serial device ID for the CEL ZigBee EM3588 radio stick.
    
    Signed-off-by: John Keeping <john@metanate.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
index 796e8ddaafa6..eaf915566302 100644
--- a/drivers/usb/serial/cp210x.c
+++ b/drivers/usb/serial/cp210x.c
@@ -156,6 +156,7 @@ static const struct usb_device_id id_table[] = {
 	{ USB_DEVICE(0x10C4, 0x89A4) }, /* CESINEL FTBC Flexible Thyristor Bridge Controller */
 	{ USB_DEVICE(0x10C4, 0x89FB) }, /* Qivicon ZigBee USB Radio Stick */
 	{ USB_DEVICE(0x10C4, 0x8A2A) }, /* HubZ dual ZigBee and Z-Wave dongle */
+	{ USB_DEVICE(0x10C4, 0x8A5B) }, /* CEL EM3588 ZigBee USB Stick */
 	{ USB_DEVICE(0x10C4, 0x8A5E) }, /* CEL EM3588 ZigBee USB Stick Long Range */
 	{ USB_DEVICE(0x10C4, 0x8B34) }, /* Qivicon ZigBee USB Radio Stick */
 	{ USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */

commit b508413328df4465fe5f21bbdf30bca87c1d6271
Author: Ian Ray <ian.ray@ge.com>
Date:   Mon Jul 19 18:43:49 2021 +0200

    USB: serial: cp210x: fix comments for GE CS1000
    
    commit e9db418d4b828dd049caaf5ed65dc86f93bb1a0c upstream.
    
    Fix comments for GE CS1000 CP210x USB ID assignments.
    
    Fixes: 42213a0190b5 ("USB: serial: cp210x: add some more GE USB IDs")
    Signed-off-by: Ian Ray <ian.ray@ge.com>
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
index 851f178ff56f..796e8ddaafa6 100644
--- a/drivers/usb/serial/cp210x.c
+++ b/drivers/usb/serial/cp210x.c
@@ -203,8 +203,8 @@ static const struct usb_device_id id_table[] = {
 	{ USB_DEVICE(0x1901, 0x0194) },	/* GE Healthcare Remote Alarm Box */
 	{ USB_DEVICE(0x1901, 0x0195) },	/* GE B850/B650/B450 CP2104 DP UART interface */
 	{ USB_DEVICE(0x1901, 0x0196) },	/* GE B850 CP2105 DP UART interface */
-	{ USB_DEVICE(0x1901, 0x0197) }, /* GE CS1000 Display serial interface */
-	{ USB_DEVICE(0x1901, 0x0198) }, /* GE CS1000 M.2 Key E serial interface */
+	{ USB_DEVICE(0x1901, 0x0197) }, /* GE CS1000 M.2 Key E serial interface */
+	{ USB_DEVICE(0x1901, 0x0198) }, /* GE CS1000 Display serial interface */
 	{ USB_DEVICE(0x199B, 0xBA30) }, /* LORD WSDA-200-USB */
 	{ USB_DEVICE(0x19CF, 0x3000) }, /* Parrot NMEA GPS Flight Recorder */
 	{ USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */

commit fceeb4e889e7a69b60f37be84870a48088ab48e2
Author: Marco De Marco <marco.demarco@posteo.net>
Date:   Mon Jul 5 19:44:21 2021 +0000

    USB: serial: option: add support for u-blox LARA-R6 family
    
    commit 94b619a07655805a1622484967754f5848640456 upstream.
    
    The patch is meant to support LARA-R6 Cat 1 module family.
    
    Module USB ID:
    Vendor  ID: 0x05c6
    Product ID: 0x90fA
    
    Interface layout:
    If 0: Diagnostic
    If 1: AT parser
    If 2: AT parser
    If 3: QMI wwan (not available in all versions)
    
    Signed-off-by: Marco De Marco <marco.demarco@posteo.net>
    Link: https://lore.kernel.org/r/49260184.kfMIbaSn9k@mars
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index 5e3430d456f3..9370c6fa7bc8 100644
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -238,6 +238,7 @@ static void option_instat_callback(struct urb *urb);
 #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
 
@@ -1101,6 +1102,8 @@ static const struct usb_device_id option_ids[] = {
 	/* 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 },

commit f9a8c7de72879cee9e8cc5d151514ffbc5db9ef9
Author: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Date:   Thu Jun 24 21:20:39 2021 +0900

    usb: renesas_usbhs: Fix superfluous irqs happen after usb_pkt_pop()
    
    commit 5719df243e118fb343725e8b2afb1637e1af1373 upstream.
    
    This driver has a potential issue which this driver is possible to
    cause superfluous irqs after usb_pkt_pop() is called. So, after
    the commit 3af32605289e ("usb: renesas_usbhs: fix error return
    code of usbhsf_pkt_handler()") had been applied, we could observe
    the following error happened when we used g_audio.
    
        renesas_usbhs e6590000.usb: irq_ready run_error 1 : -22
    
    To fix the issue, disable the tx or rx interrupt in usb_pkt_pop().
    
    Fixes: 2743e7f90dc0 ("usb: renesas_usbhs: fix the usb_pkt_pop()")
    Cc: <stable@vger.kernel.org> # v4.4+
    Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
    Link: https://lore.kernel.org/r/20210624122039.596528-1-yoshihiro.shimoda.uh@renesas.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/renesas_usbhs/fifo.c b/drivers/usb/renesas_usbhs/fifo.c
index 6b92a57382db..e49f6d41f5ec 100644
--- a/drivers/usb/renesas_usbhs/fifo.c
+++ b/drivers/usb/renesas_usbhs/fifo.c
@@ -101,6 +101,8 @@ static struct dma_chan *usbhsf_dma_chan_get(struct usbhs_fifo *fifo,
 #define usbhsf_dma_map(p)	__usbhsf_dma_map_ctrl(p, 1)
 #define usbhsf_dma_unmap(p)	__usbhsf_dma_map_ctrl(p, 0)
 static int __usbhsf_dma_map_ctrl(struct usbhs_pkt *pkt, int map);
+static void usbhsf_tx_irq_ctrl(struct usbhs_pipe *pipe, int enable);
+static void usbhsf_rx_irq_ctrl(struct usbhs_pipe *pipe, int enable);
 struct usbhs_pkt *usbhs_pkt_pop(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt)
 {
 	struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
@@ -123,6 +125,11 @@ struct usbhs_pkt *usbhs_pkt_pop(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt)
 		if (chan) {
 			dmaengine_terminate_all(chan);
 			usbhsf_dma_unmap(pkt);
+		} else {
+			if (usbhs_pipe_is_dir_in(pipe))
+				usbhsf_rx_irq_ctrl(pipe, 0);
+			else
+				usbhsf_tx_irq_ctrl(pipe, 0);
 		}
 
 		usbhs_pipe_clear_without_sequence(pipe, 0, 0);

commit 51fc12f4d37622fa0c481604833f98f11b1cac4f
Author: Mark Tomlinson <mark.tomlinson@alliedtelesis.co.nz>
Date:   Fri Jun 25 15:14:56 2021 +1200

    usb: max-3421: Prevent corruption of freed memory
    
    commit b5fdf5c6e6bee35837e160c00ac89327bdad031b upstream.
    
    The MAX-3421 USB driver remembers the state of the USB toggles for a
    device/endpoint. To save SPI writes, this was only done when a new
    device/endpoint was being used. Unfortunately, if the old device was
    removed, this would cause writes to freed memory.
    
    To fix this, a simpler scheme is used. The toggles are read from
    hardware when a URB is completed, and the toggles are always written to
    hardware when any URB transaction is started. This will cause a few more
    SPI transactions, but no causes kernel panics.
    
    Fixes: 2d53139f3162 ("Add support for using a MAX3421E chip as a host driver.")
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Mark Tomlinson <mark.tomlinson@alliedtelesis.co.nz>
    Link: https://lore.kernel.org/r/20210625031456.8632-1-mark.tomlinson@alliedtelesis.co.nz
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/host/max3421-hcd.c b/drivers/usb/host/max3421-hcd.c
index c9acc59f4add..16efe37b7558 100644
--- a/drivers/usb/host/max3421-hcd.c
+++ b/drivers/usb/host/max3421-hcd.c
@@ -153,8 +153,6 @@ struct max3421_hcd {
 	 */
 	struct urb *curr_urb;
 	enum scheduling_pass sched_pass;
-	struct usb_device *loaded_dev;	/* dev that's loaded into the chip */
-	int loaded_epnum;		/* epnum whose toggles are loaded */
 	int urb_done;			/* > 0 -> no errors, < 0: errno */
 	size_t curr_len;
 	u8 hien;
@@ -492,39 +490,17 @@ max3421_set_speed(struct usb_hcd *hcd, struct usb_device *dev)
  * Caller must NOT hold HCD spinlock.
  */
 static void
-max3421_set_address(struct usb_hcd *hcd, struct usb_device *dev, int epnum,
-		    int force_toggles)
+max3421_set_address(struct usb_hcd *hcd, struct usb_device *dev, int epnum)
 {
-	struct max3421_hcd *max3421_hcd = hcd_to_max3421(hcd);
-	int old_epnum, same_ep, rcvtog, sndtog;
-	struct usb_device *old_dev;
+	int rcvtog, sndtog;
 	u8 hctl;
 
-	old_dev = max3421_hcd->loaded_dev;
-	old_epnum = max3421_hcd->loaded_epnum;
-
-	same_ep = (dev == old_dev && epnum == old_epnum);
-	if (same_ep && !force_toggles)
-		return;
-
-	if (old_dev && !same_ep) {
-		/* save the old end-points toggles: */
-		u8 hrsl = spi_rd8(hcd, MAX3421_REG_HRSL);
-
-		rcvtog = (hrsl >> MAX3421_HRSL_RCVTOGRD_BIT) & 1;
-		sndtog = (hrsl >> MAX3421_HRSL_SNDTOGRD_BIT) & 1;
-
-		/* no locking: HCD (i.e., we) own toggles, don't we? */
-		usb_settoggle(old_dev, old_epnum, 0, rcvtog);
-		usb_settoggle(old_dev, old_epnum, 1, sndtog);
-	}
 	/* setup new endpoint's toggle bits: */
 	rcvtog = usb_gettoggle(dev, epnum, 0);
 	sndtog = usb_gettoggle(dev, epnum, 1);
 	hctl = (BIT(rcvtog + MAX3421_HCTL_RCVTOG0_BIT) |
 		BIT(sndtog + MAX3421_HCTL_SNDTOG0_BIT));
 
-	max3421_hcd->loaded_epnum = epnum;
 	spi_wr8(hcd, MAX3421_REG_HCTL, hctl);
 
 	/*
@@ -532,7 +508,6 @@ max3421_set_address(struct usb_hcd *hcd, struct usb_device *dev, int epnum,
 	 * address-assignment so it's best to just always load the
 	 * address whenever the end-point changed/was forced.
 	 */
-	max3421_hcd->loaded_dev = dev;
 	spi_wr8(hcd, MAX3421_REG_PERADDR, dev->devnum);
 }
 
@@ -667,7 +642,7 @@ max3421_select_and_start_urb(struct usb_hcd *hcd)
 	struct max3421_hcd *max3421_hcd = hcd_to_max3421(hcd);
 	struct urb *urb, *curr_urb = NULL;
 	struct max3421_ep *max3421_ep;
-	int epnum, force_toggles = 0;
+	int epnum;
 	struct usb_host_endpoint *ep;
 	struct list_head *pos;
 	unsigned long flags;
@@ -777,7 +752,6 @@ max3421_select_and_start_urb(struct usb_hcd *hcd)
 			usb_settoggle(urb->dev, epnum, 0, 1);
 			usb_settoggle(urb->dev, epnum, 1, 1);
 			max3421_ep->pkt_state = PKT_STATE_SETUP;
-			force_toggles = 1;
 		} else
 			max3421_ep->pkt_state = PKT_STATE_TRANSFER;
 	}
@@ -785,7 +759,7 @@ max3421_select_and_start_urb(struct usb_hcd *hcd)
 	spin_unlock_irqrestore(&max3421_hcd->lock, flags);
 
 	max3421_ep->last_active = max3421_hcd->frame_number;
-	max3421_set_address(hcd, urb->dev, epnum, force_toggles);
+	max3421_set_address(hcd, urb->dev, epnum);
 	max3421_set_speed(hcd, urb->dev);
 	max3421_next_transfer(hcd, 0);
 	return 1;
@@ -1380,6 +1354,16 @@ max3421_urb_done(struct usb_hcd *hcd)
 		status = 0;
 	urb = max3421_hcd->curr_urb;
 	if (urb) {
+		/* save the old end-points toggles: */
+		u8 hrsl = spi_rd8(hcd, MAX3421_REG_HRSL);
+		int rcvtog = (hrsl >> MAX3421_HRSL_RCVTOGRD_BIT) & 1;
+		int sndtog = (hrsl >> MAX3421_HRSL_SNDTOGRD_BIT) & 1;
+		int epnum = usb_endpoint_num(&urb->ep->desc);
+
+		/* no locking: HCD (i.e., we) own toggles, don't we? */
+		usb_settoggle(urb->dev, epnum, 0, rcvtog);
+		usb_settoggle(urb->dev, epnum, 1, sndtog);
+
 		max3421_hcd->curr_urb = NULL;
 		spin_lock_irqsave(&max3421_hcd->lock, flags);
 		usb_hcd_unlink_urb_from_ep(hcd, urb);

commit 0b515af95790b625d121f5799897d50f939e7b13
Author: Julian Sikorski <belegdol@gmail.com>
Date:   Tue Jul 20 19:19:10 2021 +0200

    USB: usb-storage: Add LaCie Rugged USB3-FW to IGNORE_UAS
    
    commit 6abf2fe6b4bf6e5256b80c5817908151d2d33e9f upstream.
    
    LaCie Rugged USB3-FW appears to be incompatible with UAS. It generates
    errors like:
    [ 1151.582598] sd 14:0:0:0: tag#16 uas_eh_abort_handler 0 uas-tag 1 inflight: IN
    [ 1151.582602] sd 14:0:0:0: tag#16 CDB: Report supported operation codes a3 0c 01 12 00 00 00 00 02 00 00 00
    [ 1151.588594] scsi host14: uas_eh_device_reset_handler start
    [ 1151.710482] usb 2-4: reset SuperSpeed Gen 1 USB device number 2 using xhci_hcd
    [ 1151.741398] scsi host14: uas_eh_device_reset_handler success
    [ 1181.785534] scsi host14: uas_eh_device_reset_handler start
    
    Signed-off-by: Julian Sikorski <belegdol+github@gmail.com>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210720171910.36497-1-belegdol+github@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h
index cb7b15ecb7ab..c7db6c943ba5 100644
--- a/drivers/usb/storage/unusual_uas.h
+++ b/drivers/usb/storage/unusual_uas.h
@@ -45,6 +45,13 @@ UNUSUAL_DEV(0x059f, 0x105f, 0x0000, 0x9999,
 		USB_SC_DEVICE, USB_PR_DEVICE, NULL,
 		US_FL_NO_REPORT_OPCODES | US_FL_NO_SAME),
 
+/* Reported-by: Julian Sikorski <belegdol@gmail.com> */
+UNUSUAL_DEV(0x059f, 0x1061, 0x0000, 0x9999,
+		"LaCie",
+		"Rugged USB3-FW",
+		USB_SC_DEVICE, USB_PR_DEVICE, NULL,
+		US_FL_IGNORE_UAS),
+
 /*
  * Apricorn USB3 dongle sometimes returns "USBSUSBSUSBS" in response to SCSI
  * commands in UAS mode.  Observed with the 1.28 firmware; are there others?

commit 391bbec1d6cce4616a5a99cfe1b2b686535abfae
Author: Mathias Nyman <mathias.nyman@linux.intel.com>
Date:   Thu Jul 15 18:01:21 2021 +0300

    usb: hub: Fix link power management max exit latency (MEL) calculations
    
    commit 1bf2761c837571a66ec290fb66c90413821ffda2 upstream.
    
    Maximum Exit Latency (MEL) value is used by host to know how much in
    advance it needs to start waking up a U1/U2 suspended link in order to
    service a periodic transfer in time.
    
    Current MEL calculation only includes the time to wake up the path from
    U1/U2 to U0. This is called tMEL1 in USB 3.1 section C 1.5.2
    
    Total MEL = tMEL1 + tMEL2 +tMEL3 + tMEL4 which should additinally include:
    - tMEL2 which is the time it takes for PING message to reach device
    - tMEL3 time for device to process the PING and submit a PING_RESPONSE
    - tMEL4 time for PING_RESPONSE to traverse back upstream to host.
    
    Add the missing tMEL2, tMEL3 and tMEL4 to MEL calculation.
    
    Cc: <stable@kernel.org> # v3.5
    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Link: https://lore.kernel.org/r/20210715150122.1995966-1-mathias.nyman@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 8fc79d9946ec..f1a11032a0a0 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -45,6 +45,7 @@
 
 #define USB_TP_TRANSMISSION_DELAY	40	/* ns */
 #define USB_TP_TRANSMISSION_DELAY_MAX	65535	/* ns */
+#define USB_PING_RESPONSE_TIME		400	/* ns */
 
 /* Protect struct usb_device->state and ->children members
  * Note: Both are also protected by ->dev.sem, except that ->state can
@@ -179,8 +180,9 @@ int usb_device_supports_lpm(struct usb_device *udev)
 }
 
 /*
- * Set the Maximum Exit Latency (MEL) for the host to initiate a transition from
- * either U1 or U2.
+ * Set the Maximum Exit Latency (MEL) for the host to wakup up the path from
+ * U1/U2, send a PING to the device and receive a PING_RESPONSE.
+ * See USB 3.1 section C.1.5.2
  */
 static void usb_set_lpm_mel(struct usb_device *udev,
 		struct usb3_lpm_parameters *udev_lpm_params,
@@ -190,35 +192,37 @@ static void usb_set_lpm_mel(struct usb_device *udev,
 		unsigned int hub_exit_latency)
 {
 	unsigned int total_mel;
-	unsigned int device_mel;
-	unsigned int hub_mel;
 
 	/*
-	 * Calculate the time it takes to transition all links from the roothub
-	 * to the parent hub into U0.  The parent hub must then decode the
-	 * packet (hub header decode latency) to figure out which port it was
-	 * bound for.
-	 *
-	 * The Hub Header decode latency is expressed in 0.1us intervals (0x1
-	 * means 0.1us).  Multiply that by 100 to get nanoseconds.
+	 * tMEL1. time to transition path from host to device into U0.
+	 * MEL for parent already contains the delay up to parent, so only add
+	 * the exit latency for the last link (pick the slower exit latency),
+	 * and the hub header decode latency. See USB 3.1 section C 2.2.1
+	 * Store MEL in nanoseconds
 	 */
 	total_mel = hub_lpm_params->mel +
-		(hub->descriptor->u.ss.bHubHdrDecLat * 100);
+		max(udev_exit_latency, hub_exit_latency) * 1000 +
+		hub->descriptor->u.ss.bHubHdrDecLat * 100;
 
 	/*
-	 * How long will it take to transition the downstream hub's port into
-	 * U0?  The greater of either the hub exit latency or the device exit
-	 * latency.
-	 *
-	 * The BOS U1/U2 exit latencies are expressed in 1us intervals.
-	 * Multiply that by 1000 to get nanoseconds.
+	 * tMEL2. Time to submit PING packet. Sum of tTPTransmissionDelay for
+	 * each link + wHubDelay for each hub. Add only for last link.
+	 * tMEL4, the time for PING_RESPONSE to traverse upstream is similar.
+	 * Multiply by 2 to include it as well.
 	 */
-	device_mel = udev_exit_latency * 1000;
-	hub_mel = hub_exit_latency * 1000;
-	if (device_mel > hub_mel)
-		total_mel += device_mel;
-	else
-		total_mel += hub_mel;
+	total_mel += (__le16_to_cpu(hub->descriptor->u.ss.wHubDelay) +
+		      USB_TP_TRANSMISSION_DELAY) * 2;
+
+	/*
+	 * tMEL3, tPingResponse. Time taken by device to generate PING_RESPONSE
+	 * after receiving PING. Also add 2100ns as stated in USB 3.1 C 1.5.2.4
+	 * to cover the delay if the PING_RESPONSE is queued behind a Max Packet
+	 * Size DP.
+	 * Note these delays should be added only once for the entire path, so
+	 * add them to the MEL of the device connected to the roothub.
+	 */
+	if (!hub->hdev->parent)
+		total_mel += USB_PING_RESPONSE_TIME + 2100;
 
 	udev_lpm_params->mel = total_mel;
 }

commit 6deeb1a716d757a545f755f203075208ce95b469
Author: Mathias Nyman <mathias.nyman@linux.intel.com>
Date:   Thu Jul 15 18:01:22 2021 +0300

    usb: hub: Disable USB 3 device initiated lpm if exit latency is too high
    
    commit 1b7f56fbc7a1b66967b6114d1b5f5a257c3abae6 upstream.
    
    The device initiated link power management U1/U2 states should not be
    enabled in case the system exit latency plus one bus interval (125us) is
    greater than the shortest service interval of any periodic endpoint.
    
    This is the case for both U1 and U2 sytstem exit latencies and link states.
    
    See USB 3.2 section 9.4.9 "Set Feature" for more details
    
    Note, before this patch the host and device initiated U1/U2 lpm states
    were both enabled with lpm. After this patch it's possible to end up with
    only host inititated U1/U2 lpm in case the exit latencies won't allow
    device initiated lpm.
    
    If this case we still want to set the udev->usb3_lpm_ux_enabled flag so
    that sysfs users can see the link may go to U1/U2.
    
    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210715150122.1995966-2-mathias.nyman@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index a7f16dbfffdf..8fc79d9946ec 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -3988,6 +3988,47 @@ static int usb_set_lpm_timeout(struct usb_device *udev,
 	return 0;
 }
 
+/*
+ * Don't allow device intiated U1/U2 if the system exit latency + one bus
+ * interval is greater than the minimum service interval of any active
+ * periodic endpoint. See USB 3.2 section 9.4.9
+ */
+static bool usb_device_may_initiate_lpm(struct usb_device *udev,
+					enum usb3_link_state state)
+{
+	unsigned int sel;		/* us */
+	int i, j;
+
+	if (state == USB3_LPM_U1)
+		sel = DIV_ROUND_UP(udev->u1_params.sel, 1000);
+	else if (state == USB3_LPM_U2)
+		sel = DIV_ROUND_UP(udev->u2_params.sel, 1000);
+	else
+		return false;
+
+	for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) {
+		struct usb_interface *intf;
+		struct usb_endpoint_descriptor *desc;
+		unsigned int interval;
+
+		intf = udev->actconfig->interface[i];
+		if (!intf)
+			continue;
+
+		for (j = 0; j < intf->cur_altsetting->desc.bNumEndpoints; j++) {
+			desc = &intf->cur_altsetting->endpoint[j].desc;
+
+			if (usb_endpoint_xfer_int(desc) ||
+			    usb_endpoint_xfer_isoc(desc)) {
+				interval = (1 << (desc->bInterval - 1)) * 125;
+				if (sel + 125 > interval)
+					return false;
+			}
+		}
+	}
+	return true;
+}
+
 /*
  * Enable the hub-initiated U1/U2 idle timeouts, and enable device-initiated
  * U1/U2 entry.
@@ -4060,20 +4101,23 @@ static void usb_enable_link_state(struct usb_hcd *hcd, struct usb_device *udev,
 	 * U1/U2_ENABLE
 	 */
 	if (udev->actconfig &&
-	    usb_set_device_initiated_lpm(udev, state, true) == 0) {
-		if (state == USB3_LPM_U1)
-			udev->usb3_lpm_u1_enabled = 1;
-		else if (state == USB3_LPM_U2)
-			udev->usb3_lpm_u2_enabled = 1;
-	} else {
-		/* Don't request U1/U2 entry if the device
-		 * cannot transition to U1/U2.
-		 */
-		usb_set_lpm_timeout(udev, state, 0);
-		hcd->driver->disable_usb3_lpm_timeout(hcd, udev, state);
+	    usb_device_may_initiate_lpm(udev, state)) {
+		if (usb_set_device_initiated_lpm(udev, state, true)) {
+			/*
+			 * Request to enable device initiated U1/U2 failed,
+			 * better to turn off lpm in this case.
+			 */
+			usb_set_lpm_timeout(udev, state, 0);
+			hcd->driver->disable_usb3_lpm_timeout(hcd, udev, state);
+			return;
+		}
 	}
-}
 
+	if (state == USB3_LPM_U1)
+		udev->usb3_lpm_u1_enabled = 1;
+	else if (state == USB3_LPM_U2)
+		udev->usb3_lpm_u2_enabled = 1;
+}
 /*
  * Disable the hub-initiated U1/U2 idle timeouts, and disable device-initiated
  * U1/U2 entry.

commit 0493b10c06021796ba80cbe53c961defd5aca6e5
Author: Nicholas Piggin <npiggin@gmail.com>
Date:   Tue Jul 20 20:43:09 2021 +1000

    KVM: PPC: Book3S: Fix H_RTAS rets buffer overflow
    
    commit f62f3c20647ebd5fb6ecb8f0b477b9281c44c10a upstream.
    
    The kvmppc_rtas_hcall() sets the host rtas_args.rets pointer based on
    the rtas_args.nargs that was provided by the guest. That guest nargs
    value is not range checked, so the guest can cause the host rets pointer
    to be pointed outside the args array. The individual rtas function
    handlers check the nargs and nrets values to ensure they are correct,
    but if they are not, the handlers store a -3 (0xfffffffd) failure
    indication in rets[0] which corrupts host memory.
    
    Fix this by testing up front whether the guest supplied nargs and nret
    would exceed the array size, and fail the hcall directly without storing
    a failure indication to rets[0].
    
    Also expand on a comment about why we kill the guest and try not to
    return errors directly if we have a valid rets[0] pointer.
    
    Fixes: 8e591cb72047 ("KVM: PPC: Book3S: Add infrastructure to implement kernel-side RTAS calls")
    Cc: stable@vger.kernel.org # v3.10+
    Reported-by: Alexey Kardashevskiy <aik@ozlabs.ru>
    Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/powerpc/kvm/book3s_rtas.c b/arch/powerpc/kvm/book3s_rtas.c
index 8f2355138f80..a56c56aa829c 100644
--- a/arch/powerpc/kvm/book3s_rtas.c
+++ b/arch/powerpc/kvm/book3s_rtas.c
@@ -243,6 +243,17 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu)
 	 * value so we can restore it on the way out.
 	 */
 	orig_rets = args.rets;
+	if (be32_to_cpu(args.nargs) >= ARRAY_SIZE(args.args)) {
+		/*
+		 * Don't overflow our args array: ensure there is room for
+		 * at least rets[0] (even if the call specifies 0 nret).
+		 *
+		 * Each handler must then check for the correct nargs and nret
+		 * values, but they may always return failure in rets[0].
+		 */
+		rc = -EINVAL;
+		goto fail;
+	}
 	args.rets = &args.args[be32_to_cpu(args.nargs)];
 
 	mutex_lock(&vcpu->kvm->arch.rtas_token_lock);
@@ -270,9 +281,17 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu)
 fail:
 	/*
 	 * We only get here if the guest has called RTAS with a bogus
-	 * args pointer. That means we can't get to the args, and so we
-	 * can't fail the RTAS call. So fail right out to userspace,
-	 * which should kill the guest.
+	 * args pointer or nargs/nret values that would overflow the
+	 * array. That means we can't get to the args, and so we can't
+	 * fail the RTAS call. So fail right out to userspace, which
+	 * should kill the guest.
+	 *
+	 * SLOF should actually pass the hcall return value from the
+	 * rtas handler call in r3, so enter_rtas could be modified to
+	 * return a failure indication in r3 and we could return such
+	 * errors to the guest rather than failing to host userspace.
+	 * However old guests that don't test for failure could then
+	 * continue silently after errors, so for now we won't do this.
 	 */
 	return rc;
 }

commit e6490342937c0e2dba2f78f2e6c580ccbc12b138
Author: Mathias Nyman <mathias.nyman@linux.intel.com>
Date:   Thu Jul 15 18:06:51 2021 +0300

    xhci: Fix lost USB 2 remote wake
    
    commit 72f68bf5c756f5ce1139b31daae2684501383ad5 upstream.
    
    There's a small window where a USB 2 remote wake may be left unhandled
    due to a race between hub thread and xhci port event interrupt handler.
    
    When the resume event is detected in the xhci interrupt handler it kicks
    the hub timer, which should move the port from resume to U0 once resume
    has been signalled for long enough.
    
    To keep the hub "thread" running we set a bus_state->resuming_ports flag.
    This flag makes sure hub timer function kicks itself.
    
    checking this flag was not properly protected by the spinlock. Flag was
    copied to a local variable before lock was taken. The local variable was
    then checked later with spinlock held.
    
    If interrupt is handled right after copying the flag to the local variable
    we end up stopping the hub thread before it can handle the USB 2 resume.
    
    CPU0                                    CPU1
    (hub thread)                            (xhci event handler)
    
    xhci_hub_status_data()
    status = bus_state->resuming_ports;
                                            <Interrupt>
                                            handle_port_status()
                                            spin_lock()
                                            bus_state->resuming_ports = 1
                                            set_flag(HCD_FLAG_POLL_RH)
                                            spin_unlock()
    spin_lock()
    if (!status)
      clear_flag(HCD_FLAG_POLL_RH)
    spin_unlock()
    
    Fix this by taking the lock a bit earlier so that it covers
    the resuming_ports flag copy in the hub thread
    
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Link: https://lore.kernel.org/r/20210715150651.1996099-2-mathias.nyman@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
index e6e8bed11aea..9143e74b7051 100644
--- a/drivers/usb/host/xhci-hub.c
+++ b/drivers/usb/host/xhci-hub.c
@@ -1458,11 +1458,12 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf)
 	 * Inform the usbcore about resume-in-progress by returning
 	 * a non-zero value even if there are no status changes.
 	 */
+	spin_lock_irqsave(&xhci->lock, flags);
+
 	status = bus_state->resuming_ports;
 
 	mask = PORT_CSC | PORT_PEC | PORT_OCC | PORT_PLC | PORT_WRC | PORT_CEC;
 
-	spin_lock_irqsave(&xhci->lock, flags);
 	/* For each port, did anything change?  If so, set that bit in buf. */
 	for (i = 0; i < max_ports; i++) {
 		temp = readl(ports[i]->addr);

commit b6963f63fe686a700c03879156475eb394992b90
Author: Takashi Iwai <tiwai@suse.de>
Date:   Fri Jul 16 15:27:23 2021 +0200

    ALSA: sb: Fix potential ABBA deadlock in CSP driver
    
    commit 1c2b9519159b470ef24b2638f4794e86e2952ab7 upstream.
    
    SB16 CSP driver may hit potentially a typical ABBA deadlock in two
    code paths:
    
     In snd_sb_csp_stop():
         spin_lock_irqsave(&p->chip->mixer_lock, flags);
         spin_lock(&p->chip->reg_lock);
    
     In snd_sb_csp_load():
         spin_lock_irqsave(&p->chip->reg_lock, flags);
         spin_lock(&p->chip->mixer_lock);
    
    Also the similar pattern is seen in snd_sb_csp_start().
    
    Although the practical impact is very small (those states aren't
    triggered in the same running state and this happens only on a real
    hardware, decades old ISA sound boards -- which must be very difficult
    to find nowadays), it's a real scenario and has to be fixed.
    
    This patch addresses those deadlocks by splitting the locks in
    snd_sb_csp_start() and snd_sb_csp_stop() for avoiding the nested
    locks.
    
    Reported-by: Jia-Ju Bai <baijiaju1990@gmail.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/7b0fcdaf-cd4f-4728-2eae-48c151a92e10@gmail.com
    Link: https://lore.kernel.org/r/20210716132723.13216-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/isa/sb/sb16_csp.c b/sound/isa/sb/sb16_csp.c
index b3eecde0b612..c16c8151160c 100644
--- a/sound/isa/sb/sb16_csp.c
+++ b/sound/isa/sb/sb16_csp.c
@@ -828,6 +828,7 @@ static int snd_sb_csp_start(struct snd_sb_csp * p, int sample_width, int channel
 	mixR = snd_sbmixer_read(p->chip, SB_DSP4_PCM_DEV + 1);
 	snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV, mixL & 0x7);
 	snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV + 1, mixR & 0x7);
+	spin_unlock_irqrestore(&p->chip->mixer_lock, flags);
 
 	spin_lock(&p->chip->reg_lock);
 	set_mode_register(p->chip, 0xc0);	/* c0 = STOP */
@@ -867,6 +868,7 @@ static int snd_sb_csp_start(struct snd_sb_csp * p, int sample_width, int channel
 	spin_unlock(&p->chip->reg_lock);
 
 	/* restore PCM volume */
+	spin_lock_irqsave(&p->chip->mixer_lock, flags);
 	snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV, mixL);
 	snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV + 1, mixR);
 	spin_unlock_irqrestore(&p->chip->mixer_lock, flags);
@@ -892,6 +894,7 @@ static int snd_sb_csp_stop(struct snd_sb_csp * p)
 	mixR = snd_sbmixer_read(p->chip, SB_DSP4_PCM_DEV + 1);
 	snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV, mixL & 0x7);
 	snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV + 1, mixR & 0x7);
+	spin_unlock_irqrestore(&p->chip->mixer_lock, flags);
 
 	spin_lock(&p->chip->reg_lock);
 	if (p->running & SNDRV_SB_CSP_ST_QSOUND) {
@@ -906,6 +909,7 @@ static int snd_sb_csp_stop(struct snd_sb_csp * p)
 	spin_unlock(&p->chip->reg_lock);
 
 	/* restore PCM volume */
+	spin_lock_irqsave(&p->chip->mixer_lock, flags);
 	snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV, mixL);
 	snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV + 1, mixR);
 	spin_unlock_irqrestore(&p->chip->mixer_lock, flags);

commit 135e4da2a62b14ac6a86161d101db8b96a66472f
Author: Alexander Tsoy <alexander@tsoy.me>
Date:   Thu Jul 22 02:56:05 2021 +0300

    ALSA: usb-audio: Add registration quirk for JBL Quantum headsets
    
    commit b0084afde27fe8a504377dee65f55bc6aa776937 upstream.
    
    These devices has two interfaces, but only the second interface
    contains the capture endpoint, thus quirk is required to delay the
    registration until the second interface appears.
    
    Tested-by: Jakub Fišer <jakub@ufiseru.cz>
    Signed-off-by: Alexander Tsoy <alexander@tsoy.me>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210721235605.53741-1-alexander@tsoy.me
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
index b5f2b18b8b42..87d3ea979638 100644
--- a/sound/usb/quirks.c
+++ b/sound/usb/quirks.c
@@ -1553,6 +1553,9 @@ static const struct registration_quirk registration_quirks[] = {
 	REG_QUIRK_ENTRY(0x0951, 0x16d8, 2),	/* Kingston HyperX AMP */
 	REG_QUIRK_ENTRY(0x0951, 0x16ed, 2),	/* Kingston HyperX Cloud Alpha S */
 	REG_QUIRK_ENTRY(0x0951, 0x16ea, 2),	/* Kingston HyperX Cloud Flight S */
+	REG_QUIRK_ENTRY(0x0ecb, 0x1f46, 2),	/* JBL Quantum 600 */
+	REG_QUIRK_ENTRY(0x0ecb, 0x2039, 2),	/* JBL Quantum 400 */
+	REG_QUIRK_ENTRY(0x0ecb, 0x203e, 2),	/* JBL Quantum 800 */
 	{ 0 }					/* terminator */
 };
 

commit aa2f15f54de3644b3f58dff33ebd96fbb2b9ee68
Author: Vasily Gorbik <gor@linux.ibm.com>
Date:   Fri Jun 25 23:50:07 2021 +0200

    s390/ftrace: fix ftrace_update_ftrace_func implementation
    
    commit f8c2602733c953ed7a16e060640b8e96f9d94b9b upstream.
    
    s390 enforces DYNAMIC_FTRACE if FUNCTION_TRACER is selected.
    At the same time implementation of ftrace_caller is not compliant with
    HAVE_DYNAMIC_FTRACE since it doesn't provide implementation of
    ftrace_update_ftrace_func() and calls ftrace_trace_function() directly.
    
    The subtle difference is that during ftrace code patching ftrace
    replaces function tracer via ftrace_update_ftrace_func() and activates
    it back afterwards. Unexpected direct calls to ftrace_trace_function()
    during ftrace code patching leads to nullptr-dereferences when tracing
    is activated for one of functions which are used during code patching.
    Those function currently are:
    copy_from_kernel_nofault()
    copy_from_kernel_nofault_allowed()
    preempt_count_sub() [with debug_defconfig]
    preempt_count_add() [with debug_defconfig]
    
    Corresponding KASAN report:
     BUG: KASAN: nullptr-dereference in function_trace_call+0x316/0x3b0
     Read of size 4 at addr 0000000000001e08 by task migration/0/15
    
     CPU: 0 PID: 15 Comm: migration/0 Tainted: G B 5.13.0-41423-g08316af3644d
     Hardware name: IBM 3906 M04 704 (LPAR)
     Stopper: multi_cpu_stop+0x0/0x3e0 <- stop_machine_cpuslocked+0x1e4/0x218
     Call Trace:
      [<0000000001f77caa>] show_stack+0x16a/0x1d0
      [<0000000001f8de42>] dump_stack+0x15a/0x1b0
      [<0000000001f81d56>] print_address_description.constprop.0+0x66/0x2e0
      [<000000000082b0ca>] kasan_report+0x152/0x1c0
      [<00000000004cfd8e>] function_trace_call+0x316/0x3b0
      [<0000000001fb7082>] ftrace_caller+0x7a/0x7e
      [<00000000006bb3e6>] copy_from_kernel_nofault_allowed+0x6/0x10
      [<00000000006bb42e>] copy_from_kernel_nofault+0x3e/0xd0
      [<000000000014605c>] ftrace_make_call+0xb4/0x1f8
      [<000000000047a1b4>] ftrace_replace_code+0x134/0x1d8
      [<000000000047a6e0>] ftrace_modify_all_code+0x120/0x1d0
      [<000000000047a7ec>] __ftrace_modify_code+0x5c/0x78
      [<000000000042395c>] multi_cpu_stop+0x224/0x3e0
      [<0000000000423212>] cpu_stopper_thread+0x33a/0x5a0
      [<0000000000243ff2>] smpboot_thread_fn+0x302/0x708
      [<00000000002329ea>] kthread+0x342/0x408
      [<00000000001066b2>] __ret_from_fork+0x92/0xf0
      [<0000000001fb57fa>] ret_from_fork+0xa/0x30
    
     The buggy address belongs to the page:
     page:(____ptrval____) refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x1
     flags: 0x1ffff00000001000(reserved|node=0|zone=0|lastcpupid=0x1ffff)
     raw: 1ffff00000001000 0000040000000048 0000040000000048 0000000000000000
     raw: 0000000000000000 0000000000000000 ffffffff00000001 0000000000000000
     page dumped because: kasan: bad access detected
    
     Memory state around the buggy address:
      0000000000001d00: f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7
      0000000000001d80: f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7
     >0000000000001e00: f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7
                           ^
      0000000000001e80: f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7
      0000000000001f00: f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7 f7
     ==================================================================
    
    To fix that introduce ftrace_func callback to be called from
    ftrace_caller and update it in ftrace_update_ftrace_func().
    
    Fixes: 4cc9bed034d1 ("[S390] cleanup ftrace backend functions")
    Cc: stable@vger.kernel.org
    Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
    Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/s390/include/asm/ftrace.h b/arch/s390/include/asm/ftrace.h
index 8ea270fdc7fb..ec698fc52afd 100644
--- a/arch/s390/include/asm/ftrace.h
+++ b/arch/s390/include/asm/ftrace.h
@@ -20,6 +20,7 @@ void ftrace_caller(void);
 
 extern char ftrace_graph_caller_end;
 extern unsigned long ftrace_plt;
+extern void *ftrace_func;
 
 struct dyn_arch_ftrace { };
 
diff --git a/arch/s390/kernel/ftrace.c b/arch/s390/kernel/ftrace.c
index 39b13d71a8fe..463b9e927501 100644
--- a/arch/s390/kernel/ftrace.c
+++ b/arch/s390/kernel/ftrace.c
@@ -57,6 +57,7 @@
  * >	brasl	%r0,ftrace_caller	# offset 0
  */
 
+void *ftrace_func __read_mostly = ftrace_stub;
 unsigned long ftrace_plt;
 
 static inline void ftrace_generate_orig_insn(struct ftrace_insn *insn)
@@ -166,6 +167,7 @@ int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
 
 int ftrace_update_ftrace_func(ftrace_func_t func)
 {
+	ftrace_func = func;
 	return 0;
 }
 
diff --git a/arch/s390/kernel/mcount.S b/arch/s390/kernel/mcount.S
index 020f9aac7dc0..a59e6b2b2761 100644
--- a/arch/s390/kernel/mcount.S
+++ b/arch/s390/kernel/mcount.S
@@ -60,13 +60,13 @@ ENTRY(ftrace_caller)
 #ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
 	aghik	%r2,%r0,-MCOUNT_INSN_SIZE
 	lgrl	%r4,function_trace_op
-	lgrl	%r1,ftrace_trace_function
+	lgrl	%r1,ftrace_func
 #else
 	lgr	%r2,%r0
 	aghi	%r2,-MCOUNT_INSN_SIZE
 	larl	%r4,function_trace_op
 	lg	%r4,0(%r4)
-	larl	%r1,ftrace_trace_function
+	larl	%r1,ftrace_func
 	lg	%r1,0(%r1)
 #endif
 	lgr	%r3,%r14

commit 2e207001ef2446dc282a14f4fabc10dd135fc1d6
Author: Huang Pei <huangpei@loongson.cn>
Date:   Mon Jul 26 15:26:42 2021 +0800

    Revert "MIPS: add PMD table accounting into MIPS'pmd_alloc_one"
    
    This reverts commit 68046cc531577b8f0ebe67ccf18b9c70106d7937 which is
    commit ed914d48b6a1040d1039d371b56273d422c0081e upstream.
    
    Commit b2b29d6d011944 (mm: account PMD tables like PTE tables) is
    introduced between v5.9 and v5.10, so this fix (commit 002d8b395fa1)
    should NOT apply to any pre-5.10 branch.
    
    Signed-off-by: Huang Pei <huangpei@loongson.cn>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/mips/include/asm/pgalloc.h b/arch/mips/include/asm/pgalloc.h
index f800872f867b..39b9f311c4ef 100644
--- a/arch/mips/include/asm/pgalloc.h
+++ b/arch/mips/include/asm/pgalloc.h
@@ -93,15 +93,11 @@ do {							\
 
 static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
 {
-	pmd_t *pmd = NULL;
-	struct page *pg;
+	pmd_t *pmd;
 
-	pg = alloc_pages(GFP_KERNEL | __GFP_ACCOUNT, PMD_ORDER);
-	if (pg) {
-		pgtable_pmd_page_ctor(pg);
-		pmd = (pmd_t *)page_address(pg);
+	pmd = (pmd_t *) __get_free_pages(GFP_KERNEL, PMD_ORDER);
+	if (pmd)
 		pmd_init((unsigned long)pmd, (unsigned long)invalid_pte_table);
-	}
 	return pmd;
 }
 

commit 66bcd449e04c2530d9859ff628d2596658bcf825
Author: Marcelo Henrique Cerri <marcelo.cerri@canonical.com>
Date:   Wed Jun 30 18:54:38 2021 -0700

    proc: Avoid mixing integer types in mem_rw()
    
    [ Upstream commit d238692b4b9f2c36e35af4c6e6f6da36184aeb3e ]
    
    Use size_t when capping the count argument received by mem_rw(). Since
    count is size_t, using min_t(int, ...) can lead to a negative value
    that will later be passed to access_remote_vm(), which can cause
    unexpected behavior.
    
    Since we are capping the value to at maximum PAGE_SIZE, the conversion
    from size_t to int when passing it to access_remote_vm() as "len"
    shouldn't be a problem.
    
    Link: https://lkml.kernel.org/r/20210512125215.3348316-1-marcelo.cerri@canonical.com
    Reviewed-by: David Disseldorp <ddiss@suse.de>
    Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
    Signed-off-by: Marcelo Henrique Cerri <marcelo.cerri@canonical.com>
    Cc: Alexey Dobriyan <adobriyan@gmail.com>
    Cc: Souza Cascardo <cascardo@canonical.com>
    Cc: Christian Brauner <christian.brauner@ubuntu.com>
    Cc: Michel Lespinasse <walken@google.com>
    Cc: Helge Deller <deller@gmx.de>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Lorenzo Stoakes <lstoakes@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/proc/base.c b/fs/proc/base.c
index 317a0762fc5f..e3f10c110b74 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -835,7 +835,7 @@ static ssize_t mem_rw(struct file *file, char __user *buf,
 	flags = FOLL_FORCE | (write ? FOLL_WRITE : 0);
 
 	while (count > 0) {
-		int this_len = min_t(int, count, PAGE_SIZE);
+		size_t this_len = min_t(size_t, count, PAGE_SIZE);
 
 		if (write && copy_from_user(page, buf, this_len)) {
 			copied = -EFAULT;

commit b8000c1799b562e947b0109c2bd7b449b945a863
Author: Maxime Ripard <maxime@cerno.tech>
Date:   Tue Jul 20 15:45:23 2021 +0200

    drm/panel: raspberrypi-touchscreen: Prevent double-free
    
    [ Upstream commit 7bbcb919e32d776ca8ddce08abb391ab92eef6a9 ]
    
    The mipi_dsi_device allocated by mipi_dsi_device_register_full() is
    already free'd on release.
    
    Fixes: 2f733d6194bd ("drm/panel: Add support for the Raspberry Pi 7" Touchscreen.")
    Signed-off-by: Maxime Ripard <maxime@cerno.tech>
    Reviewed-by: Sam Ravnborg <sam@ravnborg.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20210720134525.563936-9-maxime@cerno.tech
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
index aab6a70ece7f..06bd03915973 100644
--- a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
+++ b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
@@ -454,7 +454,6 @@ static int rpi_touchscreen_remove(struct i2c_client *i2c)
 	drm_panel_remove(&ts->base);
 
 	mipi_dsi_device_unregister(ts->dsi);
-	kfree(ts->dsi);
 
 	return 0;
 }

commit d682390655b388f7eb69add0006a4fce9cc33b3a
Author: Yajun Deng <yajun.deng@linux.dev>
Date:   Thu Jul 22 11:23:43 2021 +0800

    net: sched: cls_api: Fix the the wrong parameter
    
    [ Upstream commit 9d85a6f44bd5585761947f40f7821c9cd78a1bbe ]
    
    The 4th parameter in tc_chain_notify() should be flags rather than seq.
    Let's change it back correctly.
    
    Fixes: 32a4f5ecd738 ("net: sched: introduce chain object to uapi")
    Signed-off-by: Yajun Deng <yajun.deng@linux.dev>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c
index 184c20b86393..4413aa8d4e82 100644
--- a/net/sched/cls_api.c
+++ b/net/sched/cls_api.c
@@ -1918,7 +1918,7 @@ static int tc_ctl_chain(struct sk_buff *skb, struct nlmsghdr *n,
 		break;
 	case RTM_GETCHAIN:
 		err = tc_chain_notify(chain, skb, n->nlmsg_seq,
-				      n->nlmsg_seq, n->nlmsg_type, true);
+				      n->nlmsg_flags, n->nlmsg_type, true);
 		if (err < 0)
 			NL_SET_ERR_MSG(extack, "Failed to send chain notify message");
 		break;

commit 50b57223da67653c61e405d0a7592355cfe4585e
Author: Xin Long <lucien.xin@gmail.com>
Date:   Tue Jul 20 16:07:01 2021 -0400

    sctp: update active_key for asoc when old key is being replaced
    
    [ Upstream commit 58acd10092268831e49de279446c314727101292 ]
    
    syzbot reported a call trace:
    
      BUG: KASAN: use-after-free in sctp_auth_shkey_hold+0x22/0xa0 net/sctp/auth.c:112
      Call Trace:
       sctp_auth_shkey_hold+0x22/0xa0 net/sctp/auth.c:112
       sctp_set_owner_w net/sctp/socket.c:131 [inline]
       sctp_sendmsg_to_asoc+0x152e/0x2180 net/sctp/socket.c:1865
       sctp_sendmsg+0x103b/0x1d30 net/sctp/socket.c:2027
       inet_sendmsg+0x99/0xe0 net/ipv4/af_inet.c:821
       sock_sendmsg_nosec net/socket.c:703 [inline]
       sock_sendmsg+0xcf/0x120 net/socket.c:723
    
    This is an use-after-free issue caused by not updating asoc->shkey after
    it was replaced in the key list asoc->endpoint_shared_keys, and the old
    key was freed.
    
    This patch is to fix by also updating active_key for asoc when old key is
    being replaced with a new one. Note that this issue doesn't exist in
    sctp_auth_del_key_id(), as it's not allowed to delete the active_key
    from the asoc.
    
    Fixes: 1b1e0bc99474 ("sctp: add refcnt support for sh_key")
    Reported-by: syzbot+b774577370208727d12b@syzkaller.appspotmail.com
    Signed-off-by: Xin Long <lucien.xin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sctp/auth.c b/net/sctp/auth.c
index 2bd8c80bd85f..b2ca66c4a21d 100644
--- a/net/sctp/auth.c
+++ b/net/sctp/auth.c
@@ -883,6 +883,8 @@ int sctp_auth_set_key(struct sctp_endpoint *ep,
 	if (replace) {
 		list_del_init(&shkey->key_list);
 		sctp_auth_shkey_release(shkey);
+		if (asoc && asoc->active_key_id == auth_key->sca_keynumber)
+			sctp_auth_asoc_init_active_key(asoc, GFP_KERNEL);
 	}
 	list_add(&cur_key->key_list, sh_keys);
 

commit 7ae622aa93ba4adb34fc47aad981549bb357f785
Author: Vincent Palatin <vpalatin@chromium.org>
Date:   Wed Jul 21 11:25:16 2021 +0200

    Revert "USB: quirks: ignore remote wake-up on Fibocom L850-GL LTE modem"
    
    [ Upstream commit f3a1a937f7b240be623d989c8553a6d01465d04f ]
    
    This reverts commit 0bd860493f81eb2a46173f6f5e44cc38331c8dbd.
    
    While the patch was working as stated,ie preventing the L850-GL LTE modem
    from crashing on some U3 wake-ups due to a race condition between the
    host wake-up and the modem-side wake-up, when using the MBIM interface,
    this would force disabling the USB runtime PM on the device.
    
    The increased power consumption is significant for LTE laptops,
    and given that with decently recent modem firmwares, when the modem hits
    the bug, it automatically recovers (ie it drops from the bus, but
    automatically re-enumerates after less than half a second, rather than being
    stuck until a power cycle as it was doing with ancient firmware), for
    most people, the trade-off now seems in favor of re-enabling it by
    default.
    
    For people with access to the platform code, the bug can also be worked-around
    successfully by changing the USB3 LFPM polling off-time for the XHCI
    controller in the BIOS code.
    
    Signed-off-by: Vincent Palatin <vpalatin@chromium.org>
    Link: https://lore.kernel.org/r/20210721092516.2775971-1-vpalatin@chromium.org
    Fixes: 0bd860493f81 ("USB: quirks: ignore remote wake-up on Fibocom L850-GL LTE modem")
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
index f6a6c54cba35..d97544fd339b 100644
--- a/drivers/usb/core/quirks.c
+++ b/drivers/usb/core/quirks.c
@@ -502,10 +502,6 @@ static const struct usb_device_id usb_quirk_list[] = {
 	/* DJI CineSSD */
 	{ USB_DEVICE(0x2ca3, 0x0031), .driver_info = USB_QUIRK_NO_LPM },
 
-	/* Fibocom L850-GL LTE Modem */
-	{ USB_DEVICE(0x2cb7, 0x0007), .driver_info =
-			USB_QUIRK_IGNORE_REMOTE_WAKEUP },
-
 	/* INTEL VALUE SSD */
 	{ USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
 

commit 0ac2cafd710e4db558e269b7f88f731f76e23f3e
Author: Zhihao Cheng <chengzhihao1@huawei.com>
Date:   Mon Jul 5 21:38:29 2021 +0800

    nvme-pci: don't WARN_ON in nvme_reset_work if ctrl.state is not RESETTING
    
    [ Upstream commit 7764656b108cd308c39e9a8554353b8f9ca232a3 ]
    
    Followling process:
    nvme_probe
      nvme_reset_ctrl
        nvme_change_ctrl_state(ctrl, NVME_CTRL_RESETTING)
        queue_work(nvme_reset_wq, &ctrl->reset_work)
    
    --------------> nvme_remove
                      nvme_change_ctrl_state(&dev->ctrl, NVME_CTRL_DELETING)
    worker_thread
      process_one_work
        nvme_reset_work
        WARN_ON(dev->ctrl.state != NVME_CTRL_RESETTING)
    
    , which will trigger WARN_ON in nvme_reset_work():
    [  127.534298] WARNING: CPU: 0 PID: 139 at drivers/nvme/host/pci.c:2594
    [  127.536161] CPU: 0 PID: 139 Comm: kworker/u8:7 Not tainted 5.13.0
    [  127.552518] Call Trace:
    [  127.552840]  ? kvm_sched_clock_read+0x25/0x40
    [  127.553936]  ? native_send_call_func_single_ipi+0x1c/0x30
    [  127.555117]  ? send_call_function_single_ipi+0x9b/0x130
    [  127.556263]  ? __smp_call_single_queue+0x48/0x60
    [  127.557278]  ? ttwu_queue_wakelist+0xfa/0x1c0
    [  127.558231]  ? try_to_wake_up+0x265/0x9d0
    [  127.559120]  ? ext4_end_io_rsv_work+0x160/0x290
    [  127.560118]  process_one_work+0x28c/0x640
    [  127.561002]  worker_thread+0x39a/0x700
    [  127.561833]  ? rescuer_thread+0x580/0x580
    [  127.562714]  kthread+0x18c/0x1e0
    [  127.563444]  ? set_kthread_struct+0x70/0x70
    [  127.564347]  ret_from_fork+0x1f/0x30
    
    The preceding problem can be easily reproduced by executing following
    script (based on blktests suite):
    test() {
      pdev="$(_get_pci_dev_from_blkdev)"
      sysfs="/sys/bus/pci/devices/${pdev}"
      for ((i = 0; i < 10; i++)); do
        echo 1 > "$sysfs/remove"
        echo 1 > /sys/bus/pci/rescan
      done
    }
    
    Since the device ctrl could be updated as an non-RESETTING state by
    repeating probe/remove in userspace (which is a normal situation), we
    can replace stack dumping WARN_ON with a warnning message.
    
    Fixes: 82b057caefaff ("nvme-pci: fix multiple ctrl removal schedulin")
    Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index 8f1f10fa0dd6..d7cf3202cdd3 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -2273,7 +2273,9 @@ static void nvme_reset_work(struct work_struct *work)
 	int result;
 	enum nvme_ctrl_state new_state = NVME_CTRL_LIVE;
 
-	if (WARN_ON(dev->ctrl.state != NVME_CTRL_RESETTING)) {
+	if (dev->ctrl.state != NVME_CTRL_RESETTING) {
+		dev_warn(dev->ctrl.device, "ctrl state %d is not RESETTING\n",
+			 dev->ctrl.state);
 		result = -ENODEV;
 		goto out;
 	}

commit e4fdca366806f6bab374d1a95e626a10a3854b0c
Author: Peilin Ye <peilin.ye@bytedance.com>
Date:   Mon Jul 19 16:41:24 2021 -0700

    net/sched: act_skbmod: Skip non-Ethernet packets
    
    [ Upstream commit 727d6a8b7ef3d25080fad228b2c4a1d4da5999c6 ]
    
    Currently tcf_skbmod_act() assumes that packets use Ethernet as their L2
    protocol, which is not always the case.  As an example, for CAN devices:
    
            $ ip link add dev vcan0 type vcan
            $ ip link set up vcan0
            $ tc qdisc add dev vcan0 root handle 1: htb
            $ tc filter add dev vcan0 parent 1: protocol ip prio 10 \
                    matchall action skbmod swap mac
    
    Doing the above silently corrupts all the packets.  Do not perform skbmod
    actions for non-Ethernet packets.
    
    Fixes: 86da71b57383 ("net_sched: Introduce skbmod action")
    Reviewed-by: Cong Wang <cong.wang@bytedance.com>
    Signed-off-by: Peilin Ye <peilin.ye@bytedance.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sched/act_skbmod.c b/net/sched/act_skbmod.c
index 21d195296121..03a272af664a 100644
--- a/net/sched/act_skbmod.c
+++ b/net/sched/act_skbmod.c
@@ -10,6 +10,7 @@
 */
 
 #include <linux/module.h>
+#include <linux/if_arp.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include <linux/skbuff.h>
@@ -36,6 +37,13 @@ static int tcf_skbmod_act(struct sk_buff *skb, const struct tc_action *a,
 	tcf_lastuse_update(&d->tcf_tm);
 	bstats_cpu_update(this_cpu_ptr(d->common.cpu_bstats), skb);
 
+	action = READ_ONCE(d->tcf_action);
+	if (unlikely(action == TC_ACT_SHOT))
+		goto drop;
+
+	if (!skb->dev || skb->dev->type != ARPHRD_ETHER)
+		return action;
+
 	/* XXX: if you are going to edit more fields beyond ethernet header
 	 * (example when you add IP header replacement or vlan swap)
 	 * then MAX_EDIT_LEN needs to change appropriately
@@ -44,10 +52,6 @@ static int tcf_skbmod_act(struct sk_buff *skb, const struct tc_action *a,
 	if (unlikely(err)) /* best policy is to drop on the floor */
 		goto drop;
 
-	action = READ_ONCE(d->tcf_action);
-	if (unlikely(action == TC_ACT_SHOT))
-		goto drop;
-
 	p = rcu_dereference_bh(d->skbmod_p);
 	flags = p->flags;
 	if (flags & SKBMOD_F_DMAC)

commit 86aef177e03baedb8009c4a8692c4505c6063bec
Author: Eric Dumazet <edumazet@google.com>
Date:   Mon Jul 19 02:12:18 2021 -0700

    net/tcp_fastopen: fix data races around tfo_active_disable_stamp
    
    [ Upstream commit 6f20c8adb1813467ea52c1296d52c4e95978cb2f ]
    
    tfo_active_disable_stamp is read and written locklessly.
    We need to annotate these accesses appropriately.
    
    Then, we need to perform the atomic_inc(tfo_active_disable_times)
    after the timestamp has been updated, and thus add barriers
    to make sure tcp_fastopen_active_should_disable() wont read
    a stale timestamp.
    
    Fixes: cf1ef3f0719b ("net/tcp_fastopen: Disable active side TFO in certain scenarios")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Cc: Wei Wang <weiwan@google.com>
    Cc: Yuchung Cheng <ycheng@google.com>
    Cc: Neal Cardwell <ncardwell@google.com>
    Acked-by: Wei Wang <weiwan@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv4/tcp_fastopen.c b/net/ipv4/tcp_fastopen.c
index 018a48477355..2ab371f55525 100644
--- a/net/ipv4/tcp_fastopen.c
+++ b/net/ipv4/tcp_fastopen.c
@@ -454,8 +454,15 @@ void tcp_fastopen_active_disable(struct sock *sk)
 {
 	struct net *net = sock_net(sk);
 
+	/* Paired with READ_ONCE() in tcp_fastopen_active_should_disable() */
+	WRITE_ONCE(net->ipv4.tfo_active_disable_stamp, jiffies);
+
+	/* Paired with smp_rmb() in tcp_fastopen_active_should_disable().
+	 * We want net->ipv4.tfo_active_disable_stamp to be updated first.
+	 */
+	smp_mb__before_atomic();
 	atomic_inc(&net->ipv4.tfo_active_disable_times);
-	net->ipv4.tfo_active_disable_stamp = jiffies;
+
 	NET_INC_STATS(net, LINUX_MIB_TCPFASTOPENBLACKHOLE);
 }
 
@@ -473,10 +480,16 @@ bool tcp_fastopen_active_should_disable(struct sock *sk)
 	if (!tfo_da_times)
 		return false;
 
+	/* Paired with smp_mb__before_atomic() in tcp_fastopen_active_disable() */
+	smp_rmb();
+
 	/* Limit timout to max: 2^6 * initial timeout */
 	multiplier = 1 << min(tfo_da_times - 1, 6);
-	timeout = multiplier * tfo_bh_timeout * HZ;
-	if (time_before(jiffies, sock_net(sk)->ipv4.tfo_active_disable_stamp + timeout))
+
+	/* Paired with the WRITE_ONCE() in tcp_fastopen_active_disable(). */
+	timeout = READ_ONCE(sock_net(sk)->ipv4.tfo_active_disable_stamp) +
+		  multiplier * tfo_bh_timeout * HZ;
+	if (time_before(jiffies, timeout))
 		return true;
 
 	/* Mark check bit so we can check for successful active TFO

commit 5df32cc4db806fda51f00bf6b4f7163857060bdf
Author: Marek Vasut <marex@denx.de>
Date:   Fri Jul 16 20:21:33 2021 +0200

    spi: cadence: Correct initialisation of runtime PM again
    
    [ Upstream commit 56912da7a68c8356df6a6740476237441b0b792a ]
    
    The original implementation of RPM handling in probe() was mostly
    correct, except it failed to call pm_runtime_get_*() to activate the
    hardware. The subsequent fix, 734882a8bf98 ("spi: cadence: Correct
    initialisation of runtime PM"), breaks the implementation further,
    to the point where the system using this hard IP on ZynqMP hangs on
    boot, because it accesses hardware which is gated off.
    
    Undo 734882a8bf98 ("spi: cadence: Correct initialisation of runtime
    PM") and instead add missing pm_runtime_get_noresume() and move the
    RPM disabling all the way to the end of probe(). That makes ZynqMP
    not hang on boot yet again.
    
    Fixes: 734882a8bf98 ("spi: cadence: Correct initialisation of runtime PM")
    Signed-off-by: Marek Vasut <marex@denx.de>
    Cc: Charles Keepax <ckeepax@opensource.cirrus.com>
    Cc: Mark Brown <broonie@kernel.org>
    Link: https://lore.kernel.org/r/20210716182133.218640-1-marex@denx.de
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/spi/spi-cadence.c b/drivers/spi/spi-cadence.c
index f5055ceb7529..91f83683c15a 100644
--- a/drivers/spi/spi-cadence.c
+++ b/drivers/spi/spi-cadence.c
@@ -585,6 +585,12 @@ static int cdns_spi_probe(struct platform_device *pdev)
 		goto clk_dis_apb;
 	}
 
+	pm_runtime_use_autosuspend(&pdev->dev);
+	pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT);
+	pm_runtime_get_noresume(&pdev->dev);
+	pm_runtime_set_active(&pdev->dev);
+	pm_runtime_enable(&pdev->dev);
+
 	ret = of_property_read_u32(pdev->dev.of_node, "num-cs", &num_cs);
 	if (ret < 0)
 		master->num_chipselect = CDNS_SPI_DEFAULT_NUM_CS;
@@ -599,11 +605,6 @@ static int cdns_spi_probe(struct platform_device *pdev)
 	/* SPI controller initializations */
 	cdns_spi_init_hw(xspi);
 
-	pm_runtime_set_active(&pdev->dev);
-	pm_runtime_enable(&pdev->dev);
-	pm_runtime_use_autosuspend(&pdev->dev);
-	pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT);
-
 	irq = platform_get_irq(pdev, 0);
 	if (irq <= 0) {
 		ret = -ENXIO;
@@ -636,6 +637,9 @@ static int cdns_spi_probe(struct platform_device *pdev)
 
 	master->bits_per_word_mask = SPI_BPW_MASK(8);
 
+	pm_runtime_mark_last_busy(&pdev->dev);
+	pm_runtime_put_autosuspend(&pdev->dev);
+
 	ret = spi_register_master(master);
 	if (ret) {
 		dev_err(&pdev->dev, "spi_register_master failed\n");

commit 032fb65d3adc564f18f11a2c800866628cd259c9
Author: Dmitry Bogdanov <d.bogdanov@yadro.com>
Date:   Fri Jul 2 12:16:55 2021 +0300

    scsi: target: Fix protect handling in WRITE SAME(32)
    
    [ Upstream commit 6d8e7e7c932162bccd06872362751b0e1d76f5af ]
    
    WRITE SAME(32) command handling reads WRPROTECT at the wrong offset in 1st
    byte instead of 10th byte.
    
    Link: https://lore.kernel.org/r/20210702091655.22818-1-d.bogdanov@yadro.com
    Fixes: afd73f1b60fc ("target: Perform PROTECT sanity checks for WRITE_SAME")
    Signed-off-by: Dmitry Bogdanov <d.bogdanov@yadro.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c
index ebac2b49b9c6..af9b038da3ba 100644
--- a/drivers/target/target_core_sbc.c
+++ b/drivers/target/target_core_sbc.c
@@ -38,7 +38,7 @@
 #include "target_core_alua.h"
 
 static sense_reason_t
-sbc_check_prot(struct se_device *, struct se_cmd *, unsigned char *, u32, bool);
+sbc_check_prot(struct se_device *, struct se_cmd *, unsigned char, u32, bool);
 static sense_reason_t sbc_execute_unmap(struct se_cmd *cmd);
 
 static sense_reason_t
@@ -292,14 +292,14 @@ static inline unsigned long long transport_lba_64_ext(unsigned char *cdb)
 }
 
 static sense_reason_t
-sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *ops)
+sbc_setup_write_same(struct se_cmd *cmd, unsigned char flags, struct sbc_ops *ops)
 {
 	struct se_device *dev = cmd->se_dev;
 	sector_t end_lba = dev->transport->get_blocks(dev) + 1;
 	unsigned int sectors = sbc_get_write_same_sectors(cmd);
 	sense_reason_t ret;
 
-	if ((flags[0] & 0x04) || (flags[0] & 0x02)) {
+	if ((flags & 0x04) || (flags & 0x02)) {
 		pr_err("WRITE_SAME PBDATA and LBDATA"
 			" bits not supported for Block Discard"
 			" Emulation\n");
@@ -321,7 +321,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *o
 	}
 
 	/* We always have ANC_SUP == 0 so setting ANCHOR is always an error */
-	if (flags[0] & 0x10) {
+	if (flags & 0x10) {
 		pr_warn("WRITE SAME with ANCHOR not supported\n");
 		return TCM_INVALID_CDB_FIELD;
 	}
@@ -329,7 +329,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *o
 	 * Special case for WRITE_SAME w/ UNMAP=1 that ends up getting
 	 * translated into block discard requests within backend code.
 	 */
-	if (flags[0] & 0x08) {
+	if (flags & 0x08) {
 		if (!ops->execute_unmap)
 			return TCM_UNSUPPORTED_SCSI_OPCODE;
 
@@ -344,7 +344,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *o
 	if (!ops->execute_write_same)
 		return TCM_UNSUPPORTED_SCSI_OPCODE;
 
-	ret = sbc_check_prot(dev, cmd, &cmd->t_task_cdb[0], sectors, true);
+	ret = sbc_check_prot(dev, cmd, flags >> 5, sectors, true);
 	if (ret)
 		return ret;
 
@@ -702,10 +702,9 @@ sbc_set_prot_op_checks(u8 protect, bool fabric_prot, enum target_prot_type prot_
 }
 
 static sense_reason_t
-sbc_check_prot(struct se_device *dev, struct se_cmd *cmd, unsigned char *cdb,
+sbc_check_prot(struct se_device *dev, struct se_cmd *cmd, unsigned char protect,
 	       u32 sectors, bool is_write)
 {
-	u8 protect = cdb[1] >> 5;
 	int sp_ops = cmd->se_sess->sup_prot_ops;
 	int pi_prot_type = dev->dev_attrib.pi_prot_type;
 	bool fabric_prot = false;
@@ -753,7 +752,7 @@ sbc_check_prot(struct se_device *dev, struct se_cmd *cmd, unsigned char *cdb,
 		/* Fallthrough */
 	default:
 		pr_err("Unable to determine pi_prot_type for CDB: 0x%02x "
-		       "PROTECT: 0x%02x\n", cdb[0], protect);
+		       "PROTECT: 0x%02x\n", cmd->t_task_cdb[0], protect);
 		return TCM_INVALID_CDB_FIELD;
 	}
 
@@ -828,7 +827,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
 		if (sbc_check_dpofua(dev, cmd, cdb))
 			return TCM_INVALID_CDB_FIELD;
 
-		ret = sbc_check_prot(dev, cmd, cdb, sectors, false);
+		ret = sbc_check_prot(dev, cmd, cdb[1] >> 5, sectors, false);
 		if (ret)
 			return ret;
 
@@ -842,7 +841,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
 		if (sbc_check_dpofua(dev, cmd, cdb))
 			return TCM_INVALID_CDB_FIELD;
 
-		ret = sbc_check_prot(dev, cmd, cdb, sectors, false);
+		ret = sbc_check_prot(dev, cmd, cdb[1] >> 5, sectors, false);
 		if (ret)
 			return ret;
 
@@ -856,7 +855,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
 		if (sbc_check_dpofua(dev, cmd, cdb))
 			return TCM_INVALID_CDB_FIELD;
 
-		ret = sbc_check_prot(dev, cmd, cdb, sectors, false);
+		ret = sbc_check_prot(dev, cmd, cdb[1] >> 5, sectors, false);
 		if (ret)
 			return ret;
 
@@ -877,7 +876,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
 		if (sbc_check_dpofua(dev, cmd, cdb))
 			return TCM_INVALID_CDB_FIELD;
 
-		ret = sbc_check_prot(dev, cmd, cdb, sectors, true);
+		ret = sbc_check_prot(dev, cmd, cdb[1] >> 5, sectors, true);
 		if (ret)
 			return ret;
 
@@ -891,7 +890,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
 		if (sbc_check_dpofua(dev, cmd, cdb))
 			return TCM_INVALID_CDB_FIELD;
 
-		ret = sbc_check_prot(dev, cmd, cdb, sectors, true);
+		ret = sbc_check_prot(dev, cmd, cdb[1] >> 5, sectors, true);
 		if (ret)
 			return ret;
 
@@ -906,7 +905,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
 		if (sbc_check_dpofua(dev, cmd, cdb))
 			return TCM_INVALID_CDB_FIELD;
 
-		ret = sbc_check_prot(dev, cmd, cdb, sectors, true);
+		ret = sbc_check_prot(dev, cmd, cdb[1] >> 5, sectors, true);
 		if (ret)
 			return ret;
 
@@ -965,7 +964,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
 			size = sbc_get_size(cmd, 1);
 			cmd->t_task_lba = get_unaligned_be64(&cdb[12]);
 
-			ret = sbc_setup_write_same(cmd, &cdb[10], ops);
+			ret = sbc_setup_write_same(cmd, cdb[10], ops);
 			if (ret)
 				return ret;
 			break;
@@ -1064,7 +1063,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
 		size = sbc_get_size(cmd, 1);
 		cmd->t_task_lba = get_unaligned_be64(&cdb[2]);
 
-		ret = sbc_setup_write_same(cmd, &cdb[1], ops);
+		ret = sbc_setup_write_same(cmd, cdb[1], ops);
 		if (ret)
 			return ret;
 		break;
@@ -1082,7 +1081,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
 		 * Follow sbcr26 with WRITE_SAME (10) and check for the existence
 		 * of byte 1 bit 3 UNMAP instead of original reserved field
 		 */
-		ret = sbc_setup_write_same(cmd, &cdb[1], ops);
+		ret = sbc_setup_write_same(cmd, cdb[1], ops);
 		if (ret)
 			return ret;
 		break;

commit 638d29f8563ddbfe699bd5ca77d945381d9853c9
Author: Mike Christie <michael.christie@oracle.com>
Date:   Wed Jun 30 19:25:59 2021 -0500

    scsi: iscsi: Fix iface sysfs attr detection
    
    [ Upstream commit e746f3451ec7f91dcc9fd67a631239c715850a34 ]
    
    A ISCSI_IFACE_PARAM can have the same value as a ISCSI_NET_PARAM so when
    iscsi_iface_attr_is_visible tries to figure out the type by just checking
    the value, we can collide and return the wrong type. When we call into the
    driver we might not match and return that we don't want attr visible in
    sysfs. The patch fixes this by setting the type when we figure out what the
    param is.
    
    Link: https://lore.kernel.org/r/20210701002559.89533-1-michael.christie@oracle.com
    Fixes: 3e0f65b34cc9 ("[SCSI] iscsi_transport: Additional parameters for network settings")
    Signed-off-by: Mike Christie <michael.christie@oracle.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
index 2aaa5a2bd613..20e69052161e 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -427,39 +427,10 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,
 	struct device *dev = container_of(kobj, struct device, kobj);
 	struct iscsi_iface *iface = iscsi_dev_to_iface(dev);
 	struct iscsi_transport *t = iface->transport;
-	int param;
-	int param_type;
+	int param = -1;
 
 	if (attr == &dev_attr_iface_enabled.attr)
 		param = ISCSI_NET_PARAM_IFACE_ENABLE;
-	else if (attr == &dev_attr_iface_vlan_id.attr)
-		param = ISCSI_NET_PARAM_VLAN_ID;
-	else if (attr == &dev_attr_iface_vlan_priority.attr)
-		param = ISCSI_NET_PARAM_VLAN_PRIORITY;
-	else if (attr == &dev_attr_iface_vlan_enabled.attr)
-		param = ISCSI_NET_PARAM_VLAN_ENABLED;
-	else if (attr == &dev_attr_iface_mtu.attr)
-		param = ISCSI_NET_PARAM_MTU;
-	else if (attr == &dev_attr_iface_port.attr)
-		param = ISCSI_NET_PARAM_PORT;
-	else if (attr == &dev_attr_iface_ipaddress_state.attr)
-		param = ISCSI_NET_PARAM_IPADDR_STATE;
-	else if (attr == &dev_attr_iface_delayed_ack_en.attr)
-		param = ISCSI_NET_PARAM_DELAYED_ACK_EN;
-	else if (attr == &dev_attr_iface_tcp_nagle_disable.attr)
-		param = ISCSI_NET_PARAM_TCP_NAGLE_DISABLE;
-	else if (attr == &dev_attr_iface_tcp_wsf_disable.attr)
-		param = ISCSI_NET_PARAM_TCP_WSF_DISABLE;
-	else if (attr == &dev_attr_iface_tcp_wsf.attr)
-		param = ISCSI_NET_PARAM_TCP_WSF;
-	else if (attr == &dev_attr_iface_tcp_timer_scale.attr)
-		param = ISCSI_NET_PARAM_TCP_TIMER_SCALE;
-	else if (attr == &dev_attr_iface_tcp_timestamp_en.attr)
-		param = ISCSI_NET_PARAM_TCP_TIMESTAMP_EN;
-	else if (attr == &dev_attr_iface_cache_id.attr)
-		param = ISCSI_NET_PARAM_CACHE_ID;
-	else if (attr == &dev_attr_iface_redirect_en.attr)
-		param = ISCSI_NET_PARAM_REDIRECT_EN;
 	else if (attr == &dev_attr_iface_def_taskmgmt_tmo.attr)
 		param = ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO;
 	else if (attr == &dev_attr_iface_header_digest.attr)
@@ -496,6 +467,38 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,
 		param = ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN;
 	else if (attr == &dev_attr_iface_initiator_name.attr)
 		param = ISCSI_IFACE_PARAM_INITIATOR_NAME;
+
+	if (param != -1)
+		return t->attr_is_visible(ISCSI_IFACE_PARAM, param);
+
+	if (attr == &dev_attr_iface_vlan_id.attr)
+		param = ISCSI_NET_PARAM_VLAN_ID;
+	else if (attr == &dev_attr_iface_vlan_priority.attr)
+		param = ISCSI_NET_PARAM_VLAN_PRIORITY;
+	else if (attr == &dev_attr_iface_vlan_enabled.attr)
+		param = ISCSI_NET_PARAM_VLAN_ENABLED;
+	else if (attr == &dev_attr_iface_mtu.attr)
+		param = ISCSI_NET_PARAM_MTU;
+	else if (attr == &dev_attr_iface_port.attr)
+		param = ISCSI_NET_PARAM_PORT;
+	else if (attr == &dev_attr_iface_ipaddress_state.attr)
+		param = ISCSI_NET_PARAM_IPADDR_STATE;
+	else if (attr == &dev_attr_iface_delayed_ack_en.attr)
+		param = ISCSI_NET_PARAM_DELAYED_ACK_EN;
+	else if (attr == &dev_attr_iface_tcp_nagle_disable.attr)
+		param = ISCSI_NET_PARAM_TCP_NAGLE_DISABLE;
+	else if (attr == &dev_attr_iface_tcp_wsf_disable.attr)
+		param = ISCSI_NET_PARAM_TCP_WSF_DISABLE;
+	else if (attr == &dev_attr_iface_tcp_wsf.attr)
+		param = ISCSI_NET_PARAM_TCP_WSF;
+	else if (attr == &dev_attr_iface_tcp_timer_scale.attr)
+		param = ISCSI_NET_PARAM_TCP_TIMER_SCALE;
+	else if (attr == &dev_attr_iface_tcp_timestamp_en.attr)
+		param = ISCSI_NET_PARAM_TCP_TIMESTAMP_EN;
+	else if (attr == &dev_attr_iface_cache_id.attr)
+		param = ISCSI_NET_PARAM_CACHE_ID;
+	else if (attr == &dev_attr_iface_redirect_en.attr)
+		param = ISCSI_NET_PARAM_REDIRECT_EN;
 	else if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) {
 		if (attr == &dev_attr_ipv4_iface_ipaddress.attr)
 			param = ISCSI_NET_PARAM_IPV4_ADDR;
@@ -586,32 +589,7 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,
 		return 0;
 	}
 
-	switch (param) {
-	case ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO:
-	case ISCSI_IFACE_PARAM_HDRDGST_EN:
-	case ISCSI_IFACE_PARAM_DATADGST_EN:
-	case ISCSI_IFACE_PARAM_IMM_DATA_EN:
-	case ISCSI_IFACE_PARAM_INITIAL_R2T_EN:
-	case ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN:
-	case ISCSI_IFACE_PARAM_PDU_INORDER_EN:
-	case ISCSI_IFACE_PARAM_ERL:
-	case ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH:
-	case ISCSI_IFACE_PARAM_FIRST_BURST:
-	case ISCSI_IFACE_PARAM_MAX_R2T:
-	case ISCSI_IFACE_PARAM_MAX_BURST:
-	case ISCSI_IFACE_PARAM_CHAP_AUTH_EN:
-	case ISCSI_IFACE_PARAM_BIDI_CHAP_EN:
-	case ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL:
-	case ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN:
-	case ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN:
-	case ISCSI_IFACE_PARAM_INITIATOR_NAME:
-		param_type = ISCSI_IFACE_PARAM;
-		break;
-	default:
-		param_type = ISCSI_NET_PARAM;
-	}
-
-	return t->attr_is_visible(param_type, param);
+	return t->attr_is_visible(ISCSI_NET_PARAM, param);
 }
 
 static struct attribute *iscsi_iface_attrs[] = {

commit 9619cc7d97c3aa8ed3cfd2b8678b74fb6d6c7950
Author: Nguyen Dinh Phi <phind.uet@gmail.com>
Date:   Sun Jul 18 22:40:13 2021 +0800

    netrom: Decrease sock refcount when sock timers expire
    
    [ Upstream commit 517a16b1a88bdb6b530f48d5d153478b2552d9a8 ]
    
    Commit 63346650c1a9 ("netrom: switch to sock timer API") switched to use
    sock timer API. It replaces mod_timer() by sk_reset_timer(), and
    del_timer() by sk_stop_timer().
    
    Function sk_reset_timer() will increase the refcount of sock if it is
    called on an inactive timer, hence, in case the timer expires, we need to
    decrease the refcount ourselves in the handler, otherwise, the sock
    refcount will be unbalanced and the sock will never be freed.
    
    Signed-off-by: Nguyen Dinh Phi <phind.uet@gmail.com>
    Reported-by: syzbot+10f1194569953b72f1ae@syzkaller.appspotmail.com
    Fixes: 63346650c1a9 ("netrom: switch to sock timer API")
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netrom/nr_timer.c b/net/netrom/nr_timer.c
index 908e53ab47a4..426d49609524 100644
--- a/net/netrom/nr_timer.c
+++ b/net/netrom/nr_timer.c
@@ -124,11 +124,9 @@ static void nr_heartbeat_expiry(struct timer_list *t)
 		   is accepted() it isn't 'dead' so doesn't get removed. */
 		if (sock_flag(sk, SOCK_DESTROY) ||
 		    (sk->sk_state == TCP_LISTEN && sock_flag(sk, SOCK_DEAD))) {
-			sock_hold(sk);
 			bh_unlock_sock(sk);
 			nr_destroy_socket(sk);
-			sock_put(sk);
-			return;
+			goto out;
 		}
 		break;
 
@@ -149,6 +147,8 @@ static void nr_heartbeat_expiry(struct timer_list *t)
 
 	nr_start_heartbeat(sk);
 	bh_unlock_sock(sk);
+out:
+	sock_put(sk);
 }
 
 static void nr_t2timer_expiry(struct timer_list *t)
@@ -162,6 +162,7 @@ static void nr_t2timer_expiry(struct timer_list *t)
 		nr_enquiry_response(sk);
 	}
 	bh_unlock_sock(sk);
+	sock_put(sk);
 }
 
 static void nr_t4timer_expiry(struct timer_list *t)
@@ -172,6 +173,7 @@ static void nr_t4timer_expiry(struct timer_list *t)
 	bh_lock_sock(sk);
 	nr_sk(sk)->condition &= ~NR_COND_PEER_RX_BUSY;
 	bh_unlock_sock(sk);
+	sock_put(sk);
 }
 
 static void nr_idletimer_expiry(struct timer_list *t)
@@ -200,6 +202,7 @@ static void nr_idletimer_expiry(struct timer_list *t)
 		sock_set_flag(sk, SOCK_DEAD);
 	}
 	bh_unlock_sock(sk);
+	sock_put(sk);
 }
 
 static void nr_t1timer_expiry(struct timer_list *t)
@@ -212,8 +215,7 @@ static void nr_t1timer_expiry(struct timer_list *t)
 	case NR_STATE_1:
 		if (nr->n2count == nr->n2) {
 			nr_disconnect(sk, ETIMEDOUT);
-			bh_unlock_sock(sk);
-			return;
+			goto out;
 		} else {
 			nr->n2count++;
 			nr_write_internal(sk, NR_CONNREQ);
@@ -223,8 +225,7 @@ static void nr_t1timer_expiry(struct timer_list *t)
 	case NR_STATE_2:
 		if (nr->n2count == nr->n2) {
 			nr_disconnect(sk, ETIMEDOUT);
-			bh_unlock_sock(sk);
-			return;
+			goto out;
 		} else {
 			nr->n2count++;
 			nr_write_internal(sk, NR_DISCREQ);
@@ -234,8 +235,7 @@ static void nr_t1timer_expiry(struct timer_list *t)
 	case NR_STATE_3:
 		if (nr->n2count == nr->n2) {
 			nr_disconnect(sk, ETIMEDOUT);
-			bh_unlock_sock(sk);
-			return;
+			goto out;
 		} else {
 			nr->n2count++;
 			nr_requeue_frames(sk);
@@ -244,5 +244,7 @@ static void nr_t1timer_expiry(struct timer_list *t)
 	}
 
 	nr_start_t1timer(sk);
+out:
 	bh_unlock_sock(sk);
+	sock_put(sk);
 }

commit 9bafc34dc4ad0cef18727c557f21ed3c3304df50
Author: Nicholas Piggin <npiggin@gmail.com>
Date:   Fri Jul 16 12:43:10 2021 +1000

    KVM: PPC: Fix kvm_arch_vcpu_ioctl vcpu_load leak
    
    [ Upstream commit bc4188a2f56e821ea057aca6bf444e138d06c252 ]
    
    vcpu_put is not called if the user copy fails. This can result in preempt
    notifier corruption and crashes, among other issues.
    
    Fixes: b3cebfe8c1ca ("KVM: PPC: Move vcpu_load/vcpu_put down to each ioctl case in kvm_arch_vcpu_ioctl")
    Reported-by: Alexey Kardashevskiy <aik@ozlabs.ru>
    Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210716024310.164448-2-npiggin@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index 7c8354dfe80e..ad5a871a6cbf 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -1995,9 +1995,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
 	{
 		struct kvm_enable_cap cap;
 		r = -EFAULT;
-		vcpu_load(vcpu);
 		if (copy_from_user(&cap, argp, sizeof(cap)))
 			goto out;
+		vcpu_load(vcpu);
 		r = kvm_vcpu_ioctl_enable_cap(vcpu, &cap);
 		vcpu_put(vcpu);
 		break;
@@ -2021,9 +2021,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
 	case KVM_DIRTY_TLB: {
 		struct kvm_dirty_tlb dirty;
 		r = -EFAULT;
-		vcpu_load(vcpu);
 		if (copy_from_user(&dirty, argp, sizeof(dirty)))
 			goto out;
+		vcpu_load(vcpu);
 		r = kvm_vcpu_ioctl_dirty_tlb(vcpu, &dirty);
 		vcpu_put(vcpu);
 		break;

commit f5dfcd1d49e5ea9ffc88debc038437634489b135
Author: Yajun Deng <yajun.deng@linux.dev>
Date:   Wed Jul 14 17:13:20 2021 +0800

    net: decnet: Fix sleeping inside in af_decnet
    
    [ Upstream commit 5f119ba1d5771bbf46d57cff7417dcd84d3084ba ]
    
    The release_sock() is blocking function, it would change the state
    after sleeping. use wait_woken() instead.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Yajun Deng <yajun.deng@linux.dev>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c
index 0e6f32defd67..cc7077105969 100644
--- a/net/decnet/af_decnet.c
+++ b/net/decnet/af_decnet.c
@@ -823,7 +823,7 @@ static int dn_auto_bind(struct socket *sock)
 static int dn_confirm_accept(struct sock *sk, long *timeo, gfp_t allocation)
 {
 	struct dn_scp *scp = DN_SK(sk);
-	DEFINE_WAIT(wait);
+	DEFINE_WAIT_FUNC(wait, woken_wake_function);
 	int err;
 
 	if (scp->state != DN_CR)
@@ -833,11 +833,11 @@ static int dn_confirm_accept(struct sock *sk, long *timeo, gfp_t allocation)
 	scp->segsize_loc = dst_metric_advmss(__sk_dst_get(sk));
 	dn_send_conn_conf(sk, allocation);
 
-	prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
+	add_wait_queue(sk_sleep(sk), &wait);
 	for(;;) {
 		release_sock(sk);
 		if (scp->state == DN_CC)
-			*timeo = schedule_timeout(*timeo);
+			*timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, *timeo);
 		lock_sock(sk);
 		err = 0;
 		if (scp->state == DN_RUN)
@@ -851,9 +851,8 @@ static int dn_confirm_accept(struct sock *sk, long *timeo, gfp_t allocation)
 		err = -EAGAIN;
 		if (!*timeo)
 			break;
-		prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
 	}
-	finish_wait(sk_sleep(sk), &wait);
+	remove_wait_queue(sk_sleep(sk), &wait);
 	if (err == 0) {
 		sk->sk_socket->state = SS_CONNECTED;
 	} else if (scp->state != DN_CC) {
@@ -865,7 +864,7 @@ static int dn_confirm_accept(struct sock *sk, long *timeo, gfp_t allocation)
 static int dn_wait_run(struct sock *sk, long *timeo)
 {
 	struct dn_scp *scp = DN_SK(sk);
-	DEFINE_WAIT(wait);
+	DEFINE_WAIT_FUNC(wait, woken_wake_function);
 	int err = 0;
 
 	if (scp->state == DN_RUN)
@@ -874,11 +873,11 @@ static int dn_wait_run(struct sock *sk, long *timeo)
 	if (!*timeo)
 		return -EALREADY;
 
-	prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
+	add_wait_queue(sk_sleep(sk), &wait);
 	for(;;) {
 		release_sock(sk);
 		if (scp->state == DN_CI || scp->state == DN_CC)
-			*timeo = schedule_timeout(*timeo);
+			*timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, *timeo);
 		lock_sock(sk);
 		err = 0;
 		if (scp->state == DN_RUN)
@@ -892,9 +891,8 @@ static int dn_wait_run(struct sock *sk, long *timeo)
 		err = -ETIMEDOUT;
 		if (!*timeo)
 			break;
-		prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
 	}
-	finish_wait(sk_sleep(sk), &wait);
+	remove_wait_queue(sk_sleep(sk), &wait);
 out:
 	if (err == 0) {
 		sk->sk_socket->state = SS_CONNECTED;
@@ -1039,16 +1037,16 @@ static void dn_user_copy(struct sk_buff *skb, struct optdata_dn *opt)
 
 static struct sk_buff *dn_wait_for_connect(struct sock *sk, long *timeo)
 {
-	DEFINE_WAIT(wait);
+	DEFINE_WAIT_FUNC(wait, woken_wake_function);
 	struct sk_buff *skb = NULL;
 	int err = 0;
 
-	prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
+	add_wait_queue(sk_sleep(sk), &wait);
 	for(;;) {
 		release_sock(sk);
 		skb = skb_dequeue(&sk->sk_receive_queue);
 		if (skb == NULL) {
-			*timeo = schedule_timeout(*timeo);
+			*timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, *timeo);
 			skb = skb_dequeue(&sk->sk_receive_queue);
 		}
 		lock_sock(sk);
@@ -1063,9 +1061,8 @@ static struct sk_buff *dn_wait_for_connect(struct sock *sk, long *timeo)
 		err = -EAGAIN;
 		if (!*timeo)
 			break;
-		prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
 	}
-	finish_wait(sk_sleep(sk), &wait);
+	remove_wait_queue(sk_sleep(sk), &wait);
 
 	return skb == NULL ? ERR_PTR(err) : skb;
 }

commit 452c3ed7bf63721b07bc2238ed1261bb26027e85
Author: Ziyang Xuan <william.xuanziyang@huawei.com>
Date:   Thu Jul 15 20:22:04 2021 +0800

    net: fix uninit-value in caif_seqpkt_sendmsg
    
    [ Upstream commit 991e634360f2622a683b48dfe44fe6d9cb765a09 ]
    
    When nr_segs equal to zero in iovec_from_user, the object
    msg->msg_iter.iov is uninit stack memory in caif_seqpkt_sendmsg
    which is defined in ___sys_sendmsg. So we cann't just judge
    msg->msg_iter.iov->base directlly. We can use nr_segs to judge
    msg in caif_seqpkt_sendmsg whether has data buffers.
    
    =====================================================
    BUG: KMSAN: uninit-value in caif_seqpkt_sendmsg+0x693/0xf60 net/caif/caif_socket.c:542
    Call Trace:
     __dump_stack lib/dump_stack.c:77 [inline]
     dump_stack+0x1c9/0x220 lib/dump_stack.c:118
     kmsan_report+0xf7/0x1e0 mm/kmsan/kmsan_report.c:118
     __msan_warning+0x58/0xa0 mm/kmsan/kmsan_instr.c:215
     caif_seqpkt_sendmsg+0x693/0xf60 net/caif/caif_socket.c:542
     sock_sendmsg_nosec net/socket.c:652 [inline]
     sock_sendmsg net/socket.c:672 [inline]
     ____sys_sendmsg+0x12b6/0x1350 net/socket.c:2343
     ___sys_sendmsg net/socket.c:2397 [inline]
     __sys_sendmmsg+0x808/0xc90 net/socket.c:2480
     __compat_sys_sendmmsg net/compat.c:656 [inline]
    
    Reported-by: syzbot+09a5d591c1f98cf5efcb@syzkaller.appspotmail.com
    Link: https://syzkaller.appspot.com/bug?id=1ace85e8fc9b0d5a45c08c2656c3e91762daa9b8
    Fixes: bece7b2398d0 ("caif: Rewritten socket implementation")
    Signed-off-by: Ziyang Xuan <william.xuanziyang@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c
index 4b31f0aaa96d..348b8cb0bc24 100644
--- a/net/caif/caif_socket.c
+++ b/net/caif/caif_socket.c
@@ -539,7 +539,8 @@ static int caif_seqpkt_sendmsg(struct socket *sock, struct msghdr *msg,
 		goto err;
 
 	ret = -EINVAL;
-	if (unlikely(msg->msg_iter.iov->iov_base == NULL))
+	if (unlikely(msg->msg_iter.nr_segs == 0) ||
+	    unlikely(msg->msg_iter.iov->iov_base == NULL))
 		goto err;
 	noblock = msg->msg_flags & MSG_DONTWAIT;
 

commit 10b5522407b93fd31d73c8ae8779dc8009744f31
Author: Tobias Klauser <tklauser@distanz.ch>
Date:   Thu Jul 15 13:06:09 2021 +0200

    bpftool: Check malloc return value in mount_bpffs_for_pin
    
    [ Upstream commit d444b06e40855219ef38b5e9286db16d435f06dc ]
    
    Fix and add a missing NULL check for the prior malloc() call.
    
    Fixes: 49a086c201a9 ("bpftool: implement prog load command")
    Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: Quentin Monnet <quentin@isovalent.com>
    Acked-by: Roman Gushchin <guro@fb.com>
    Link: https://lore.kernel.org/bpf/20210715110609.29364-1-tklauser@distanz.ch
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/tools/bpf/bpftool/common.c b/tools/bpf/bpftool/common.c
index 158469f57461..7faf24ef3c80 100644
--- a/tools/bpf/bpftool/common.c
+++ b/tools/bpf/bpftool/common.c
@@ -182,6 +182,11 @@ int do_pin_fd(int fd, const char *name)
 		goto out;
 
 	file = malloc(strlen(name) + 1);
+	if (!file) {
+		p_err("mem alloc failed");
+		return -1;
+	}
+
 	strcpy(file, name);
 	dir = dirname(file);
 

commit 0d0927f545aeaf64f39d0618ae568ae8b1a668f3
Author: Colin Ian King <colin.king@canonical.com>
Date:   Thu Jul 15 13:57:12 2021 +0100

    s390/bpf: Perform r1 range checking before accessing jit->seen_reg[r1]
    
    [ Upstream commit 91091656252f5d6d8c476e0c92776ce9fae7b445 ]
    
    Currently array jit->seen_reg[r1] is being accessed before the range
    checking of index r1. The range changing on r1 should be performed
    first since it will avoid any potential out-of-range accesses on the
    array seen_reg[] and also it is more optimal to perform checks on r1
    before fetching data from the array. Fix this by swapping the order
    of the checks before the array access.
    
    Fixes: 054623105728 ("s390/bpf: Add s390x eBPF JIT compiler backend")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Tested-by: Ilya Leoshkevich <iii@linux.ibm.com>
    Acked-by: Ilya Leoshkevich <iii@linux.ibm.com>
    Link: https://lore.kernel.org/bpf/20210715125712.24690-1-colin.king@canonical.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c
index 2617e426c792..e42354b15e0b 100644
--- a/arch/s390/net/bpf_jit_comp.c
+++ b/arch/s390/net/bpf_jit_comp.c
@@ -113,7 +113,7 @@ static inline void reg_set_seen(struct bpf_jit *jit, u32 b1)
 {
 	u32 r1 = reg2hex[b1];
 
-	if (!jit->seen_reg[r1] && r1 >= 6 && r1 <= 15)
+	if (r1 >= 6 && r1 <= 15 && !jit->seen_reg[r1])
 		jit->seen_reg[r1] = 1;
 }
 

commit 9e56921e9131850aa55e2e18e1637c4391763793
Author: Colin Ian King <colin.king@canonical.com>
Date:   Wed Jul 14 16:23:43 2021 +0100

    liquidio: Fix unintentional sign extension issue on left shift of u16
    
    [ Upstream commit e7efc2ce3d0789cd7c21b70ff00cd7838d382639 ]
    
    Shifting the u16 integer oct->pcie_port by CN23XX_PKT_INPUT_CTL_MAC_NUM_POS
    (29) bits will be promoted to a 32 bit signed int and then sign-extended
    to a u64. In the cases where oct->pcie_port where bit 2 is set (e.g. 3..7)
    the shifted value will be sign extended and the top 32 bits of the result
    will be set.
    
    Fix this by casting the u16 values to a u64 before the 29 bit left shift.
    
    Addresses-Coverity: ("Unintended sign extension")
    
    Fixes: 3451b97cce2d ("liquidio: CN23XX register setup")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.c b/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.c
index 55fe80ca10d3..9e447983d0aa 100644
--- a/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.c
+++ b/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.c
@@ -420,7 +420,7 @@ static int cn23xx_pf_setup_global_input_regs(struct octeon_device *oct)
 	 * bits 32:47 indicate the PVF num.
 	 */
 	for (q_no = 0; q_no < ern; q_no++) {
-		reg_val = oct->pcie_port << CN23XX_PKT_INPUT_CTL_MAC_NUM_POS;
+		reg_val = (u64)oct->pcie_port << CN23XX_PKT_INPUT_CTL_MAC_NUM_POS;
 
 		/* for VF assigned queues. */
 		if (q_no < oct->sriov_info.pf_srn) {

commit bd0447f72de0963129612bf18202204d5b25e133
Author: Peter Hess <peter.hess@ph-home.de>
Date:   Tue Jul 6 14:16:09 2021 +0200

    spi: mediatek: fix fifo rx mode
    
    [ Upstream commit 3a70dd2d050331ee4cf5ad9d5c0a32d83ead9a43 ]
    
    In FIFO mode were two problems:
    - RX mode was never handled and
    - in this case the tx_buf pointer was NULL and caused an exception
    
    fix this by handling RX mode in mtk_spi_fifo_transfer
    
    Fixes: a568231f4632 ("spi: mediatek: Add spi bus for Mediatek MT8173")
    Signed-off-by: Peter Hess <peter.hess@ph-home.de>
    Signed-off-by: Frank Wunderlich <frank-w@public-files.de>
    Link: https://lore.kernel.org/r/20210706121609.680534-1-linux@fw-web.de
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/spi/spi-mt65xx.c b/drivers/spi/spi-mt65xx.c
index da28c52c9da1..e2b171057b3b 100644
--- a/drivers/spi/spi-mt65xx.c
+++ b/drivers/spi/spi-mt65xx.c
@@ -392,13 +392,23 @@ static int mtk_spi_fifo_transfer(struct spi_master *master,
 	mtk_spi_setup_packet(master);
 
 	cnt = xfer->len / 4;
-	iowrite32_rep(mdata->base + SPI_TX_DATA_REG, xfer->tx_buf, cnt);
+	if (xfer->tx_buf)
+		iowrite32_rep(mdata->base + SPI_TX_DATA_REG, xfer->tx_buf, cnt);
+
+	if (xfer->rx_buf)
+		ioread32_rep(mdata->base + SPI_RX_DATA_REG, xfer->rx_buf, cnt);
 
 	remainder = xfer->len % 4;
 	if (remainder > 0) {
 		reg_val = 0;
-		memcpy(&reg_val, xfer->tx_buf + (cnt * 4), remainder);
-		writel(reg_val, mdata->base + SPI_TX_DATA_REG);
+		if (xfer->tx_buf) {
+			memcpy(&reg_val, xfer->tx_buf + (cnt * 4), remainder);
+			writel(reg_val, mdata->base + SPI_TX_DATA_REG);
+		}
+		if (xfer->rx_buf) {
+			reg_val = readl(mdata->base + SPI_RX_DATA_REG);
+			memcpy(xfer->rx_buf + (cnt * 4), &reg_val, remainder);
+		}
 	}
 
 	mtk_spi_enable_transfer(master);

commit 63b823ae24cc85cf718fd08e2834d47c60554f50
Author: Riccardo Mancini <rickyman7@gmail.com>
Date:   Thu Jul 15 18:07:25 2021 +0200

    perf probe-file: Delete namelist in del_events() on the error path
    
    [ Upstream commit e0fa7ab42232e742dcb3de9f3c1f6127b5adc019 ]
    
    ASan reports some memory leaks when running:
    
      # perf test "42: BPF filter"
    
    This second leak is caused by a strlist not being dellocated on error
    inside probe_file__del_events.
    
    This patch adds a goto label before the deallocation and makes the error
    path jump to it.
    
    Signed-off-by: Riccardo Mancini <rickyman7@gmail.com>
    Fixes: e7895e422e4da63d ("perf probe: Split del_perf_probe_events()")
    Cc: Ian Rogers <irogers@google.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lore.kernel.org/lkml/174963c587ae77fa108af794669998e4ae558338.1626343282.git.rickyman7@gmail.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c
index 6a6548890d5a..b67ae3b8d996 100644
--- a/tools/perf/util/probe-file.c
+++ b/tools/perf/util/probe-file.c
@@ -342,11 +342,11 @@ int probe_file__del_events(int fd, struct strfilter *filter)
 
 	ret = probe_file__get_events(fd, filter, namelist);
 	if (ret < 0)
-		return ret;
+		goto out;
 
 	ret = probe_file__del_strlist(fd, namelist);
+out:
 	strlist__delete(namelist);
-
 	return ret;
 }
 

commit 2ce4170c20781187ef2888a4a24b6d0cfa4c4ddf
Author: Riccardo Mancini <rickyman7@gmail.com>
Date:   Thu Jul 15 18:07:24 2021 +0200

    perf test bpf: Free obj_buf
    
    [ Upstream commit 937654ce497fb6e977a8c52baee5f7d9616302d9 ]
    
    ASan reports some memory leaks when running:
    
      # perf test "42: BPF filter"
    
    The first of these leaks is caused by obj_buf never being deallocated in
    __test__bpf.
    
    This patch adds the missing free.
    
    Signed-off-by: Riccardo Mancini <rickyman7@gmail.com>
    Fixes: ba1fae431e74bb42 ("perf test: Add 'perf test BPF'")
    Cc: Ian Rogers <irogers@google.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Wang Nan <wangnan0@huawei.com>
    Link: http://lore.kernel.org/lkml/60f3ca935fe6672e7e866276ce6264c9e26e4c87.1626343282.git.rickyman7@gmail.com
    [ Added missing stdlib.h include ]
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/tools/perf/tests/bpf.c b/tools/perf/tests/bpf.c
index 79b54f8ddebf..df478f67b6b6 100644
--- a/tools/perf/tests/bpf.c
+++ b/tools/perf/tests/bpf.c
@@ -1,5 +1,6 @@
 #include <errno.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <sys/epoll.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -277,6 +278,7 @@ static int __test__bpf(int idx)
 	}
 
 out:
+	free(obj_buf);
 	bpf__clear();
 	return ret;
 }

commit 2c1d156b94636f8b6d00c95e39616efa6a6b894d
Author: Riccardo Mancini <rickyman7@gmail.com>
Date:   Thu Jul 15 18:07:19 2021 +0200

    perf lzma: Close lzma stream on exit
    
    [ Upstream commit f8cbb0f926ae1e1fb5f9e51614e5437560ed4039 ]
    
    ASan reports memory leaks when running:
    
      # perf test "88: Check open filename arg using perf trace + vfs_getname"
    
    One of these is caused by the lzma stream never being closed inside
    lzma_decompress_to_file().
    
    This patch adds the missing lzma_end().
    
    Signed-off-by: Riccardo Mancini <rickyman7@gmail.com>
    Fixes: 80a32e5b498a7547 ("perf tools: Add lzma decompression support for kernel module")
    Cc: Ian Rogers <irogers@google.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lore.kernel.org/lkml/aaf50bdce7afe996cfc06e1bbb36e4a2a9b9db93.1626343282.git.rickyman7@gmail.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/tools/perf/util/lzma.c b/tools/perf/util/lzma.c
index b1dd29a9d915..6c844110fc25 100644
--- a/tools/perf/util/lzma.c
+++ b/tools/perf/util/lzma.c
@@ -68,7 +68,7 @@ int lzma_decompress_to_file(const char *input, int output_fd)
 
 			if (ferror(infile)) {
 				pr_err("lzma: read error: %s\n", strerror(errno));
-				goto err_fclose;
+				goto err_lzma_end;
 			}
 
 			if (feof(infile))
@@ -82,7 +82,7 @@ int lzma_decompress_to_file(const char *input, int output_fd)
 
 			if (writen(output_fd, buf_out, write_size) != write_size) {
 				pr_err("lzma: write error: %s\n", strerror(errno));
-				goto err_fclose;
+				goto err_lzma_end;
 			}
 
 			strm.next_out  = buf_out;
@@ -94,11 +94,13 @@ int lzma_decompress_to_file(const char *input, int output_fd)
 				break;
 
 			pr_err("lzma: failed %s\n", lzma_strerror(ret));
-			goto err_fclose;
+			goto err_lzma_end;
 		}
 	}
 
 	err = 0;
+err_lzma_end:
+	lzma_end(&strm);
 err_fclose:
 	fclose(infile);
 	return err;

commit 6cf3e71c229a729f4791341e14d6d7d910ff6ae0
Author: Riccardo Mancini <rickyman7@gmail.com>
Date:   Thu Jul 15 18:07:11 2021 +0200

    perf dso: Fix memory leak in dso__new_map()
    
    [ Upstream commit 581e295a0f6b5c2931d280259fbbfff56959faa9 ]
    
    ASan reports a memory leak when running:
    
      # perf test "65: maps__merge_in".
    
    The causes of the leaks are two, this patch addresses only the first
    one, which is related to dso__new_map().
    
    The bug is that dso__new_map() creates a new dso but never decreases the
    refcount it gets from creating it.
    
    This patch adds the missing dso__put().
    
    Signed-off-by: Riccardo Mancini <rickyman7@gmail.com>
    Fixes: d3a7c489c7fd2463 ("perf tools: Reference count struct dso")
    Cc: Ian Rogers <irogers@google.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lore.kernel.org/lkml/60bfe0cd06e89e2ca33646eb8468d7f5de2ee597.1626343282.git.rickyman7@gmail.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
index 56f86317694d..1231f3181041 100644
--- a/tools/perf/util/dso.c
+++ b/tools/perf/util/dso.c
@@ -1025,8 +1025,10 @@ struct map *dso__new_map(const char *name)
 	struct map *map = NULL;
 	struct dso *dso = dso__new(name);
 
-	if (dso)
+	if (dso) {
 		map = map__new2(0, dso);
+		dso__put(dso);
+	}
 
 	return map;
 }

commit c7184d73f20cb6c828274e3e6c2307ef17027e48
Author: Riccardo Mancini <rickyman7@gmail.com>
Date:   Thu Jul 15 18:07:06 2021 +0200

    perf probe: Fix dso->nsinfo refcounting
    
    [ Upstream commit dedeb4be203b382ba7245d13079bc3b0f6d40c65 ]
    
    ASan reports a memory leak of nsinfo during the execution of:
    
     # perf test "31: Lookup mmap thread".
    
    The leak is caused by a refcounted variable being replaced without
    dropping the refcount.
    
    This patch makes sure that the refcnt of nsinfo is decreased whenever
    a refcounted variable is replaced with a new value.
    
    Signed-off-by: Riccardo Mancini <rickyman7@gmail.com>
    Fixes: 544abd44c7064c8a ("perf probe: Allow placing uprobes in alternate namespaces.")
    Cc: Ian Rogers <irogers@google.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Krister Johansen <kjlx@templeofstupid.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lore.kernel.org/lkml/55223bc8821b34ccb01f92ef1401c02b6a32e61f.1626343282.git.rickyman7@gmail.com
    [ Split from a larger patch ]
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 4ac3c89bfac8..633fa5425fd9 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -184,8 +184,10 @@ struct map *get_target_map(const char *target, struct nsinfo *nsi, bool user)
 		struct map *map;
 
 		map = dso__new_map(target);
-		if (map && map->dso)
+		if (map && map->dso) {
+			nsinfo__put(map->dso->nsinfo);
 			map->dso->nsinfo = nsinfo__get(nsi);
+		}
 		return map;
 	} else {
 		return kernel_get_module_map(target);

commit d41308df6129905ddce9b6bcaa02c387c1edbfd0
Author: Riccardo Mancini <rickyman7@gmail.com>
Date:   Thu Jul 15 18:07:06 2021 +0200

    perf map: Fix dso->nsinfo refcounting
    
    [ Upstream commit 2d6b74baa7147251c30a46c4996e8cc224aa2dc5 ]
    
    ASan reports a memory leak of nsinfo during the execution of
    
      # perf test "31: Lookup mmap thread"
    
    The leak is caused by a refcounted variable being replaced without
    dropping the refcount.
    
    This patch makes sure that the refcnt of nsinfo is decreased whenever a
    refcounted variable is replaced with a new value.
    
    Signed-off-by: Riccardo Mancini <rickyman7@gmail.com>
    Fixes: bf2e710b3cb8445c ("perf maps: Lookup maps in both intitial mountns and inner mountns.")
    Cc: Ian Rogers <irogers@google.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Krister Johansen <kjlx@templeofstupid.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lore.kernel.org/lkml/55223bc8821b34ccb01f92ef1401c02b6a32e61f.1626343282.git.rickyman7@gmail.com
    [ Split from a larger patch ]
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c
index 769d11575a7b..603086692290 100644
--- a/tools/perf/util/map.c
+++ b/tools/perf/util/map.c
@@ -209,6 +209,8 @@ struct map *map__new(struct machine *machine, u64 start, u64 len,
 			if (!(prot & PROT_EXEC))
 				dso__set_loaded(dso);
 		}
+
+		nsinfo__put(dso->nsinfo);
 		dso->nsinfo = nsi;
 		dso__put(dso);
 	}

commit b248990aca0b1a352b94ead12605f84e878c4a5d
Author: Casey Chen <cachen@purestorage.com>
Date:   Wed Jul 7 14:14:32 2021 -0700

    nvme-pci: do not call nvme_dev_remove_admin from nvme_remove
    
    [ Upstream commit 251ef6f71be2adfd09546a26643426fe62585173 ]
    
    nvme_dev_remove_admin could free dev->admin_q and the admin_tagset
    while they are being accessed by nvme_dev_disable(), which can be called
    by nvme_reset_work via nvme_remove_dead_ctrl.
    
    Commit cb4bfda62afa ("nvme-pci: fix hot removal during error handling")
    intended to avoid requests being stuck on a removed controller by killing
    the admin queue. But the later fix c8e9e9b7646e ("nvme-pci: unquiesce
    admin queue on shutdown"), together with nvme_dev_disable(dev, true)
    right before nvme_dev_remove_admin() could help dispatch requests and
    fail them early, so we don't need nvme_dev_remove_admin() any more.
    
    Fixes: cb4bfda62afa ("nvme-pci: fix hot removal during error handling")
    Signed-off-by: Casey Chen <cachen@purestorage.com>
    Reviewed-by: Keith Busch <kbusch@kernel.org>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index 82d87d2e280c..8f1f10fa0dd6 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -2605,7 +2605,6 @@ static void nvme_remove(struct pci_dev *pdev)
 	if (!pci_device_is_present(pdev)) {
 		nvme_change_ctrl_state(&dev->ctrl, NVME_CTRL_DEAD);
 		nvme_dev_disable(dev, true);
-		nvme_dev_remove_admin(dev);
 	}
 
 	flush_work(&dev->ctrl.reset_work);

commit bff0854e2f804f68d3e93d19e4580dbd69777e1d
Author: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Date:   Tue Jul 6 11:13:35 2021 +0200

    ipv6: fix 'disable_policy' for fwd packets
    
    [ Upstream commit ccd27f05ae7b8ebc40af5b004e94517a919aa862 ]
    
    The goal of commit df789fe75206 ("ipv6: Provide ipv6 version of
    "disable_policy" sysctl") was to have the disable_policy from ipv4
    available on ipv6.
    However, it's not exactly the same mechanism. On IPv4, all packets coming
    from an interface, which has disable_policy set, bypass the policy check.
    For ipv6, this is done only for local packets, ie for packets destinated to
    an address configured on the incoming interface.
    
    Let's align ipv6 with ipv4 so that the 'disable_policy' sysctl has the same
    effect for both protocols.
    
    My first approach was to create a new kind of route cache entries, to be
    able to set DST_NOPOLICY without modifying routes. This would have added a
    lot of code. Because the local delivery path is already handled, I choose
    to focus on the forwarding path to minimize code churn.
    
    Fixes: df789fe75206 ("ipv6: Provide ipv6 version of "disable_policy" sysctl")
    Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index aa8f19f852cc..fc36f3b0dceb 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -459,7 +459,9 @@ int ip6_forward(struct sk_buff *skb)
 	if (skb_warn_if_lro(skb))
 		goto drop;
 
-	if (!xfrm6_policy_check(NULL, XFRM_POLICY_FWD, skb)) {
+	if (!net->ipv6.devconf_all->disable_policy &&
+	    !idev->cnf.disable_policy &&
+	    !xfrm6_policy_check(NULL, XFRM_POLICY_FWD, skb)) {
 		__IP6_INC_STATS(net, idev, IPSTATS_MIB_INDISCARDS);
 		goto drop;
 	}

commit 0c46bacfac2dcf28ca104398178b7056d5b90e1a
Author: Jedrzej Jagielski <jedrzej.jagielski@intel.com>
Date:   Fri Jun 11 22:42:17 2021 +0000

    igb: Fix position of assignment to *ring
    
    [ Upstream commit 382a7c20d9253bcd5715789b8179528d0f3de72c ]
    
    Assignment to *ring should be done after correctness check of the
    argument queue.
    
    Fixes: 91db364236c8 ("igb: Refactor igb_configure_cbs()")
    Signed-off-by: Jedrzej Jagielski <jedrzej.jagielski@intel.com>
    Acked-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>
    Tested-by: Tony Brelinski <tonyx.brelinski@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index 243e304c35cd..6221dafc76b9 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -1692,14 +1692,15 @@ static bool is_any_txtime_enabled(struct igb_adapter *adapter)
  **/
 static void igb_config_tx_modes(struct igb_adapter *adapter, int queue)
 {
-	struct igb_ring *ring = adapter->tx_ring[queue];
 	struct net_device *netdev = adapter->netdev;
 	struct e1000_hw *hw = &adapter->hw;
+	struct igb_ring *ring;
 	u32 tqavcc, tqavctrl;
 	u16 value;
 
 	WARN_ON(hw->mac.type != e1000_i210);
 	WARN_ON(queue < 0 || queue > 1);
+	ring = adapter->tx_ring[queue];
 
 	/* If any of the Qav features is enabled, configure queues as SR and
 	 * with HIGH PRIO. If none is, then configure them with LOW PRIO and

commit 4b65576c3e31c4e180570efa61e5c88fb8193eca
Author: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
Date:   Thu Apr 22 10:19:23 2021 +0000

    igb: Check if num of q_vectors is smaller than max before array access
    
    [ Upstream commit 6c19d772618fea40d9681f259368f284a330fd90 ]
    
    Ensure that the adapter->q_vector[MAX_Q_VECTORS] array isn't accessed
    beyond its size. It was fixed by using a local variable num_q_vectors
    as a limit for loop index, and ensure that num_q_vectors is not bigger
    than MAX_Q_VECTORS.
    
    Fixes: 047e0030f1e6 ("igb: add new data structure for handling interrupts and NAPI")
    Signed-off-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
    Reviewed-by: Grzegorz Siwik <grzegorz.siwik@intel.com>
    Reviewed-by: Arkadiusz Kubalewski <arkadiusz.kubalewski@intel.com>
    Reviewed-by: Slawomir Laba <slawomirx.laba@intel.com>
    Reviewed-by: Sylwester Dziedziuch <sylwesterx.dziedziuch@intel.com>
    Reviewed-by: Mateusz Palczewski <mateusz.placzewski@intel.com>
    Tested-by: Tony Brelinski <tonyx.brelinski@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index 8558d2e4ec18..243e304c35cd 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -938,6 +938,7 @@ static void igb_configure_msix(struct igb_adapter *adapter)
  **/
 static int igb_request_msix(struct igb_adapter *adapter)
 {
+	unsigned int num_q_vectors = adapter->num_q_vectors;
 	struct net_device *netdev = adapter->netdev;
 	int i, err = 0, vector = 0, free_vector = 0;
 
@@ -946,7 +947,13 @@ static int igb_request_msix(struct igb_adapter *adapter)
 	if (err)
 		goto err_out;
 
-	for (i = 0; i < adapter->num_q_vectors; i++) {
+	if (num_q_vectors > MAX_Q_VECTORS) {
+		num_q_vectors = MAX_Q_VECTORS;
+		dev_warn(&adapter->pdev->dev,
+			 "The number of queue vectors (%d) is higher than max allowed (%d)\n",
+			 adapter->num_q_vectors, MAX_Q_VECTORS);
+	}
+	for (i = 0; i < num_q_vectors; i++) {
 		struct igb_q_vector *q_vector = adapter->q_vector[i];
 
 		vector++;

commit 11030837e1ea0d14cc5242f80a8adc3d9b9afa6f
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Wed Jun 16 07:53:02 2021 +0200

    iavf: Fix an error handling path in 'iavf_probe()'
    
    [ Upstream commit af30cbd2f4d6d66a9b6094e0aa32420bc8b20e08 ]
    
    If an error occurs after a 'pci_enable_pcie_error_reporting()' call, it
    must be undone by a corresponding 'pci_disable_pcie_error_reporting()'
    call, as already done in the remove function.
    
    Fixes: 5eae00c57f5e ("i40evf: main driver core")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_main.c b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
index f50c19b83368..ac5709624c7a 100644
--- a/drivers/net/ethernet/intel/i40evf/i40evf_main.c
+++ b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
@@ -3735,6 +3735,7 @@ static int i40evf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 err_ioremap:
 	free_netdev(netdev);
 err_alloc_etherdev:
+	pci_disable_pcie_error_reporting(pdev);
 	pci_release_regions(pdev);
 err_pci_reg:
 err_dma:

commit 46cc1391606454dddd25042e760abc8781cc37c6
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Wed Jun 16 07:05:53 2021 +0200

    e1000e: Fix an error handling path in 'e1000_probe()'
    
    [ Upstream commit 4589075608420bc49fcef6e98279324bf2bb91ae ]
    
    If an error occurs after a 'pci_enable_pcie_error_reporting()' call, it
    must be undone by a corresponding 'pci_disable_pcie_error_reporting()'
    call, as already done in the remove function.
    
    Fixes: 111b9dc5c981 ("e1000e: add aer support")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Acked-by: Sasha Neftin <sasha.neftin@intel.com>
    Tested-by: Dvora Fuxbrumer <dvorax.fuxbrumer@linux.intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
index 6bbe7afdf30c..398f5951d11c 100644
--- a/drivers/net/ethernet/intel/e1000e/netdev.c
+++ b/drivers/net/ethernet/intel/e1000e/netdev.c
@@ -7369,6 +7369,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 err_ioremap:
 	free_netdev(netdev);
 err_alloc_etherdev:
+	pci_disable_pcie_error_reporting(pdev);
 	pci_release_mem_regions(pdev);
 err_pci_reg:
 err_dma:

commit d536ea0959518fa198fd0877ec340a5f7194e71b
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Wed Jun 16 07:00:36 2021 +0200

    fm10k: Fix an error handling path in 'fm10k_probe()'
    
    [ Upstream commit e85e14d68f517ef12a5fb8123fff65526b35b6cd ]
    
    If an error occurs after a 'pci_enable_pcie_error_reporting()' call, it
    must be undone by a corresponding 'pci_disable_pcie_error_reporting()'
    call, as already done in the remove function.
    
    Fixes: 19ae1b3fb99c ("fm10k: Add support for PCI power management and error handling")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_pci.c b/drivers/net/ethernet/intel/fm10k/fm10k_pci.c
index c859ababeed5..6e888874010e 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k_pci.c
+++ b/drivers/net/ethernet/intel/fm10k/fm10k_pci.c
@@ -2228,6 +2228,7 @@ static int fm10k_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 err_ioremap:
 	free_netdev(netdev);
 err_alloc_netdev:
+	pci_disable_pcie_error_reporting(pdev);
 	pci_release_mem_regions(pdev);
 err_pci_reg:
 err_dma:

commit 23f3831f3eb03c21af6da1d0588f77f86ff01aea
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Sat Jun 12 22:08:33 2021 +0200

    igb: Fix an error handling path in 'igb_probe()'
    
    [ Upstream commit fea03b1cebd653cd095f2e9a58cfe1c85661c363 ]
    
    If an error occurs after a 'pci_enable_pcie_error_reporting()' call, it
    must be undone by a corresponding 'pci_disable_pcie_error_reporting()'
    call, as already done in the remove function.
    
    Fixes: 40a914fa72ab ("igb: Add support for pci-e Advanced Error Reporting")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Tested-by: Tony Brelinski <tonyx.brelinski@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index cee5baa6d646..8558d2e4ec18 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -3495,6 +3495,7 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 err_ioremap:
 	free_netdev(netdev);
 err_alloc_etherdev:
+	pci_disable_pcie_error_reporting(pdev);
 	pci_release_mem_regions(pdev);
 err_pci_reg:
 err_dma:

commit 62b744bc30bf5c8a921f71c97d07c3fe46148ab5
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Sat Jun 12 15:46:09 2021 +0200

    ixgbe: Fix an error handling path in 'ixgbe_probe()'
    
    [ Upstream commit dd2aefcd5e37989ae5f90afdae44bbbf3a2990da ]
    
    If an error occurs after a 'pci_enable_pcie_error_reporting()' call, it
    must be undone by a corresponding 'pci_disable_pcie_error_reporting()'
    call, as already done in the remove function.
    
    Fixes: 6fabd715e6d8 ("ixgbe: Implement PCIe AER support")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Tested-by: Tony Brelinski <tonyx.brelinski@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index 8fcd3ffb43e0..4d9d97e0b6c4 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -10925,6 +10925,7 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	disable_dev = !test_and_set_bit(__IXGBE_DISABLED, &adapter->state);
 	free_netdev(netdev);
 err_alloc_etherdev:
+	pci_disable_pcie_error_reporting(pdev);
 	pci_release_mem_regions(pdev);
 err_pci_reg:
 err_dma:

commit d3ccb18ed5ac3283c7b31ecc685b499e580d5492
Author: Vinicius Costa Gomes <vinicius.gomes@intel.com>
Date:   Thu May 13 17:31:04 2021 -0700

    igb: Fix use-after-free error during reset
    
    [ Upstream commit 7b292608db23ccbbfbfa50cdb155d01725d7a52e ]
    
    Cleans the next descriptor to watch (next_to_watch) when cleaning the
    TX ring.
    
    Failure to do so can cause invalid memory accesses. If igb_poll() runs
    while the controller is reset this can lead to the driver try to free
    a skb that was already freed.
    
    (The crash is harder to reproduce with the igb driver, but the same
    potential problem exists as the code is identical to igc)
    
    Fixes: 7cc6fd4c60f2 ("igb: Don't bother clearing Tx buffer_info in igb_clean_tx_ring")
    Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>
    Reported-by: Erez Geva <erez.geva.ext@siemens.com>
    Tested-by: Tony Brelinski <tonyx.brelinski@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index d85eb80d8249..cee5baa6d646 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -4684,6 +4684,8 @@ static void igb_clean_tx_ring(struct igb_ring *tx_ring)
 					       DMA_TO_DEVICE);
 		}
 
+		tx_buffer->next_to_watch = NULL;
+
 		/* move us one more past the eop_desc for start of next pkt */
 		tx_buffer++;
 		i++;

commit be680f4bf72231e75383a097981016c2b1ab0197
Author: Hangbin Liu <liuhangbin@gmail.com>
Date:   Fri Jul 9 11:45:02 2021 +0800

    net: ip_tunnel: fix mtu calculation for ETHER tunnel devices
    
    commit 9992a078b1771da354ac1f9737e1e639b687caa2 upstream.
    
    Commit 28e104d00281 ("net: ip_tunnel: fix mtu calculation") removed
    dev->hard_header_len subtraction when calculate MTU for tunnel devices
    as there is an overhead for device that has header_ops.
    
    But there are ETHER tunnel devices, like gre_tap or erspan, which don't
    have header_ops but set dev->hard_header_len during setup. This makes
    pkts greater than (MTU - ETH_HLEN) could not be xmited. Fix it by
    subtracting the ETHER tunnel devices' dev->hard_header_len for MTU
    calculation.
    
    Fixes: 28e104d00281 ("net: ip_tunnel: fix mtu calculation")
    Reported-by: Jianlin Shi <jishi@redhat.com>
    Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c
index bdd073ea300a..30e93b4f831f 100644
--- a/net/ipv4/ip_tunnel.c
+++ b/net/ipv4/ip_tunnel.c
@@ -330,7 +330,7 @@ static int ip_tunnel_bind_dev(struct net_device *dev)
 	}
 
 	dev->needed_headroom = t_hlen + hlen;
-	mtu -= t_hlen;
+	mtu -= t_hlen + (dev->type == ARPHRD_ETHER ? dev->hard_header_len : 0);
 
 	if (mtu < IPV4_MIN_MTU)
 		mtu = IPV4_MIN_MTU;
@@ -361,6 +361,9 @@ static struct ip_tunnel *ip_tunnel_create(struct net *net,
 	t_hlen = nt->hlen + sizeof(struct iphdr);
 	dev->min_mtu = ETH_MIN_MTU;
 	dev->max_mtu = IP_MAX_MTU - t_hlen;
+	if (dev->type == ARPHRD_ETHER)
+		dev->max_mtu -= dev->hard_header_len;
+
 	ip_tunnel_add(itn, nt);
 	return nt;
 
@@ -502,13 +505,18 @@ static int tnl_update_pmtu(struct net_device *dev, struct sk_buff *skb,
 			    const struct iphdr *inner_iph)
 {
 	struct ip_tunnel *tunnel = netdev_priv(dev);
-	int pkt_size = skb->len - tunnel->hlen;
+	int pkt_size;
 	int mtu;
 
-	if (df)
+	pkt_size = skb->len - tunnel->hlen;
+	pkt_size -= dev->type == ARPHRD_ETHER ? dev->hard_header_len : 0;
+
+	if (df) {
 		mtu = dst_mtu(&rt->dst) - (sizeof(struct iphdr) + tunnel->hlen);
-	else
+		mtu -= dev->type == ARPHRD_ETHER ? dev->hard_header_len : 0;
+	} else {
 		mtu = skb_dst(skb) ? dst_mtu(skb_dst(skb)) : dev->mtu;
+	}
 
 	skb_dst_update_pmtu_no_confirm(skb, mtu);
 
@@ -936,6 +944,9 @@ int __ip_tunnel_change_mtu(struct net_device *dev, int new_mtu, bool strict)
 	int t_hlen = tunnel->hlen + sizeof(struct iphdr);
 	int max_mtu = IP_MAX_MTU - t_hlen;
 
+	if (dev->type == ARPHRD_ETHER)
+		max_mtu -= dev->hard_header_len;
+
 	if (new_mtu < ETH_MIN_MTU)
 		return -EINVAL;
 
@@ -1113,6 +1124,9 @@ int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[],
 	if (tb[IFLA_MTU]) {
 		unsigned int max = IP_MAX_MTU - (nt->hlen + sizeof(struct iphdr));
 
+		if (dev->type == ARPHRD_ETHER)
+			max -= dev->hard_header_len;
+
 		mtu = clamp(dev->mtu, (unsigned int)ETH_MIN_MTU, max);
 	}
 

commit dd1f607cad1f3be1880193521bee2bbd48354a23
Author: Eric Dumazet <edumazet@google.com>
Date:   Wed Jun 30 09:42:44 2021 -0700

    udp: annotate data races around unix_sk(sk)->gso_size
    
    commit 18a419bad63b7f68a1979e28459782518e7b6bbe upstream.
    
    Accesses to unix_sk(sk)->gso_size are lockless.
    Add READ_ONCE()/WRITE_ONCE() around them.
    
    BUG: KCSAN: data-race in udp_lib_setsockopt / udpv6_sendmsg
    
    write to 0xffff88812d78f47c of 2 bytes by task 10849 on cpu 1:
     udp_lib_setsockopt+0x3b3/0x710 net/ipv4/udp.c:2696
     udpv6_setsockopt+0x63/0x90 net/ipv6/udp.c:1630
     sock_common_setsockopt+0x5d/0x70 net/core/sock.c:3265
     __sys_setsockopt+0x18f/0x200 net/socket.c:2104
     __do_sys_setsockopt net/socket.c:2115 [inline]
     __se_sys_setsockopt net/socket.c:2112 [inline]
     __x64_sys_setsockopt+0x62/0x70 net/socket.c:2112
     do_syscall_64+0x4a/0x90 arch/x86/entry/common.c:47
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    read to 0xffff88812d78f47c of 2 bytes by task 10852 on cpu 0:
     udpv6_sendmsg+0x161/0x16b0 net/ipv6/udp.c:1299
     inet6_sendmsg+0x5f/0x80 net/ipv6/af_inet6.c:642
     sock_sendmsg_nosec net/socket.c:654 [inline]
     sock_sendmsg net/socket.c:674 [inline]
     ____sys_sendmsg+0x360/0x4d0 net/socket.c:2337
     ___sys_sendmsg net/socket.c:2391 [inline]
     __sys_sendmmsg+0x315/0x4b0 net/socket.c:2477
     __do_sys_sendmmsg net/socket.c:2506 [inline]
     __se_sys_sendmmsg net/socket.c:2503 [inline]
     __x64_sys_sendmmsg+0x53/0x60 net/socket.c:2503
     do_syscall_64+0x4a/0x90 arch/x86/entry/common.c:47
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    value changed: 0x0000 -> 0x0005
    
    Reported by Kernel Concurrency Sanitizer on:
    CPU: 0 PID: 10852 Comm: syz-executor.0 Not tainted 5.13.0-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    
    Fixes: bec1f6f69736 ("udp: generate gso with UDP_SEGMENT")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Cc: Willem de Bruijn <willemb@google.com>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index 2ff9f774d446..32f0d1bb3b6d 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -997,7 +997,7 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
 	}
 
 	ipcm_init_sk(&ipc, inet);
-	ipc.gso_size = up->gso_size;
+	ipc.gso_size = READ_ONCE(up->gso_size);
 
 	if (msg->msg_controllen) {
 		err = udp_cmsg_send(sk, msg, &ipc.gso_size);
@@ -2505,7 +2505,7 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,
 	case UDP_SEGMENT:
 		if (val < 0 || val > USHRT_MAX)
 			return -EINVAL;
-		up->gso_size = val;
+		WRITE_ONCE(up->gso_size, val);
 		break;
 
 	/*
@@ -2599,7 +2599,7 @@ int udp_lib_getsockopt(struct sock *sk, int level, int optname,
 		break;
 
 	case UDP_SEGMENT:
-		val = up->gso_size;
+		val = READ_ONCE(up->gso_size);
 		break;
 
 	/* The following two cannot be changed on UDP sockets, the return is
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index c4a76c6af205..042ab5428a4f 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -1175,7 +1175,7 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
 	int (*getfrag)(void *, char *, int, int, int, struct sk_buff *);
 
 	ipcm6_init(&ipc6);
-	ipc6.gso_size = up->gso_size;
+	ipc6.gso_size = READ_ONCE(up->gso_size);
 	ipc6.sockc.tsflags = sk->sk_tsflags;
 
 	/* destination address check */

commit 4416df721325d97b9b8eb297e8a5d844dd3bf8b9
Author: Gu Shengxian <gushengxian@yulong.com>
Date:   Mon Jul 5 18:35:43 2021 -0700

    bpftool: Properly close va_list 'ap' by va_end() on error
    
    commit bc832065b60f973771ff3e657214bb21b559833c upstream.
    
    va_list 'ap' was opened but not closed by va_end() in error case. It should
    be closed by va_end() before the return.
    
    Fixes: aa52bcbe0e72 ("tools: bpftool: Fix json dump crash on powerpc")
    Signed-off-by: Gu Shengxian <gushengxian@yulong.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Link: https://lore.kernel.org/bpf/20210706013543.671114-1-gushengxian507419@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/bpf/bpftool/jit_disasm.c b/tools/bpf/bpftool/jit_disasm.c
index 73d7252729fa..e4cfbecf0218 100644
--- a/tools/bpf/bpftool/jit_disasm.c
+++ b/tools/bpf/bpftool/jit_disasm.c
@@ -51,11 +51,13 @@ static int fprintf_json(void *out, const char *fmt, ...)
 {
 	va_list ap;
 	char *s;
+	int err;
 
 	va_start(ap, fmt);
-	if (vasprintf(&s, fmt, ap) < 0)
-		return -1;
+	err = vasprintf(&s, fmt, ap);
 	va_end(ap);
+	if (err < 0)
+		return -1;
 
 	if (!oper_count) {
 		int i;

commit 4818f187041761e68bfabcce40601608fcf2591a
Author: Eric Dumazet <edumazet@google.com>
Date:   Thu Jul 8 00:21:09 2021 -0700

    ipv6: tcp: drop silly ICMPv6 packet too big messages
    
    commit c7bb4b89033b764eb07db4e060548a6311d801ee upstream.
    
    While TCP stack scales reasonably well, there is still one part that
    can be used to DDOS it.
    
    IPv6 Packet too big messages have to lookup/insert a new route,
    and if abused by attackers, can easily put hosts under high stress,
    with many cpus contending on a spinlock while one is stuck in fib6_run_gc()
    
    ip6_protocol_deliver_rcu()
     icmpv6_rcv()
      icmpv6_notify()
       tcp_v6_err()
        tcp_v6_mtu_reduced()
         inet6_csk_update_pmtu()
          ip6_rt_update_pmtu()
           __ip6_rt_update_pmtu()
            ip6_rt_cache_alloc()
             ip6_dst_alloc()
              dst_alloc()
               ip6_dst_gc()
                fib6_run_gc()
                 spin_lock_bh() ...
    
    Some of our servers have been hit by malicious ICMPv6 packets
    trying to _increase_ the MTU/MSS of TCP flows.
    
    We believe these ICMPv6 packets are a result of a bug in one ISP stack,
    since they were blindly sent back for _every_ (small) packet sent to them.
    
    These packets are for one TCP flow:
    09:24:36.266491 IP6 Addr1 > Victim ICMP6, packet too big, mtu 1460, length 1240
    09:24:36.266509 IP6 Addr1 > Victim ICMP6, packet too big, mtu 1460, length 1240
    09:24:36.316688 IP6 Addr1 > Victim ICMP6, packet too big, mtu 1460, length 1240
    09:24:36.316704 IP6 Addr1 > Victim ICMP6, packet too big, mtu 1460, length 1240
    09:24:36.608151 IP6 Addr1 > Victim ICMP6, packet too big, mtu 1460, length 1240
    
    TCP stack can filter some silly requests :
    
    1) MTU below IPV6_MIN_MTU can be filtered early in tcp_v6_err()
    2) tcp_v6_mtu_reduced() can drop requests trying to increase current MSS.
    
    This tests happen before the IPv6 routing stack is entered, thus
    removing the potential contention and route exhaustion.
    
    Note that IPv6 stack was performing these checks, but too late
    (ie : after the route has been added, and after the potential
    garbage collect war)
    
    v2: fix typo caught by Martin, thanks !
    v3: exports tcp_mtu_to_mss(), caught by David, thanks !
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reviewed-by: Maciej Żenczykowski <maze@google.com>
    Cc: Martin KaFai Lau <kafai@fb.com>
    Acked-by: Martin KaFai Lau <kafai@fb.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index 9b74041e8dd1..d55ee43cd1b8 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -1472,6 +1472,7 @@ int tcp_mtu_to_mss(struct sock *sk, int pmtu)
 	return __tcp_mtu_to_mss(sk, pmtu) -
 	       (tcp_sk(sk)->tcp_header_len - sizeof(struct tcphdr));
 }
+EXPORT_SYMBOL(tcp_mtu_to_mss);
 
 /* Inverse of above */
 int tcp_mss_to_mtu(struct sock *sk, int mss)
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index 5121012cc741..e8d206725cb7 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -336,11 +336,20 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
 static void tcp_v6_mtu_reduced(struct sock *sk)
 {
 	struct dst_entry *dst;
+	u32 mtu;
 
 	if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))
 		return;
 
-	dst = inet6_csk_update_pmtu(sk, READ_ONCE(tcp_sk(sk)->mtu_info));
+	mtu = READ_ONCE(tcp_sk(sk)->mtu_info);
+
+	/* Drop requests trying to increase our current mss.
+	 * Check done in __ip6_rt_update_pmtu() is too late.
+	 */
+	if (tcp_mtu_to_mss(sk, mtu) >= tcp_sk(sk)->mss_cache)
+		return;
+
+	dst = inet6_csk_update_pmtu(sk, mtu);
 	if (!dst)
 		return;
 
@@ -419,6 +428,8 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
 	}
 
 	if (type == ICMPV6_PKT_TOOBIG) {
+		u32 mtu = ntohl(info);
+
 		/* We are not interested in TCP_LISTEN and open_requests
 		 * (SYN-ACKs send out by Linux are always <576bytes so
 		 * they should go through unfragmented).
@@ -429,7 +440,11 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
 		if (!ip6_sk_accept_pmtu(sk))
 			goto out;
 
-		WRITE_ONCE(tp->mtu_info, ntohl(info));
+		if (mtu < IPV6_MIN_MTU)
+			goto out;
+
+		WRITE_ONCE(tp->mtu_info, mtu);
+
 		if (!sock_owned_by_user(sk))
 			tcp_v6_mtu_reduced(sk);
 		else if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED,

commit d694db2f90ffc44b8fb9f9ae2d38edaa4aa4f444
Author: Eric Dumazet <edumazet@google.com>
Date:   Fri Jul 2 13:09:03 2021 -0700

    tcp: annotate data races around tp->mtu_info
    
    commit 561022acb1ce62e50f7a8258687a21b84282a4cb upstream.
    
    While tp->mtu_info is read while socket is owned, the write
    sides happen from err handlers (tcp_v[46]_mtu_reduced)
    which only own the socket spinlock.
    
    Fixes: 563d34d05786 ("tcp: dont drop MTU reduction indications")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index ac6135555e24..71236aa7388d 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -348,7 +348,7 @@ void tcp_v4_mtu_reduced(struct sock *sk)
 
 	if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))
 		return;
-	mtu = tcp_sk(sk)->mtu_info;
+	mtu = READ_ONCE(tcp_sk(sk)->mtu_info);
 	dst = inet_csk_update_pmtu(sk, mtu);
 	if (!dst)
 		return;
@@ -516,7 +516,7 @@ void tcp_v4_err(struct sk_buff *icmp_skb, u32 info)
 			if (sk->sk_state == TCP_LISTEN)
 				goto out;
 
-			tp->mtu_info = info;
+			WRITE_ONCE(tp->mtu_info, info);
 			if (!sock_owned_by_user(sk)) {
 				tcp_v4_mtu_reduced(sk);
 			} else {
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index 2e7a28f327a8..5121012cc741 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -340,7 +340,7 @@ static void tcp_v6_mtu_reduced(struct sock *sk)
 	if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))
 		return;
 
-	dst = inet6_csk_update_pmtu(sk, tcp_sk(sk)->mtu_info);
+	dst = inet6_csk_update_pmtu(sk, READ_ONCE(tcp_sk(sk)->mtu_info));
 	if (!dst)
 		return;
 
@@ -429,7 +429,7 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
 		if (!ip6_sk_accept_pmtu(sk))
 			goto out;
 
-		tp->mtu_info = ntohl(info);
+		WRITE_ONCE(tp->mtu_info, ntohl(info));
 		if (!sock_owned_by_user(sk))
 			tcp_v6_mtu_reduced(sk);
 		else if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED,

commit e0355a0ad31a1d677b2a4514206de4902bd550e8
Author: Jason Ekstrand <jason@jlekstrand.net>
Date:   Thu Jun 24 12:47:32 2021 -0500

    dma-buf/sync_file: Don't leak fences on merge failure
    
    commit ffe000217c5068c5da07ccb1c0f8cce7ad767435 upstream.
    
    Each add_fence() call does a dma_fence_get() on the relevant fence.  In
    the error path, we weren't calling dma_fence_put() so all those fences
    got leaked.  Also, in the krealloc_array failure case, we weren't
    freeing the fences array.  Instead, ensure that i and fences are always
    zero-initialized and dma_fence_put() all the fences and kfree(fences) on
    every error path.
    
    Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Fixes: a02b9dc90d84 ("dma-buf/sync_file: refactor fence storage in struct sync_file")
    Cc: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
    Cc: Christian König <christian.koenig@amd.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20210624174732.1754546-1-jason@jlekstrand.net
    Signed-off-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/dma-buf/sync_file.c b/drivers/dma-buf/sync_file.c
index 91d620994123..b0d2563cde5d 100644
--- a/drivers/dma-buf/sync_file.c
+++ b/drivers/dma-buf/sync_file.c
@@ -220,8 +220,8 @@ static struct sync_file *sync_file_merge(const char *name, struct sync_file *a,
 					 struct sync_file *b)
 {
 	struct sync_file *sync_file;
-	struct dma_fence **fences, **nfences, **a_fences, **b_fences;
-	int i, i_a, i_b, num_fences, a_num_fences, b_num_fences;
+	struct dma_fence **fences = NULL, **nfences, **a_fences, **b_fences;
+	int i = 0, i_a, i_b, num_fences, a_num_fences, b_num_fences;
 
 	sync_file = sync_file_alloc();
 	if (!sync_file)
@@ -245,7 +245,7 @@ static struct sync_file *sync_file_merge(const char *name, struct sync_file *a,
 	 * If a sync_file can only be created with sync_file_merge
 	 * and sync_file_create, this is a reasonable assumption.
 	 */
-	for (i = i_a = i_b = 0; i_a < a_num_fences && i_b < b_num_fences; ) {
+	for (i_a = i_b = 0; i_a < a_num_fences && i_b < b_num_fences; ) {
 		struct dma_fence *pt_a = a_fences[i_a];
 		struct dma_fence *pt_b = b_fences[i_b];
 
@@ -286,15 +286,16 @@ static struct sync_file *sync_file_merge(const char *name, struct sync_file *a,
 		fences = nfences;
 	}
 
-	if (sync_file_set_fence(sync_file, fences, i) < 0) {
-		kfree(fences);
+	if (sync_file_set_fence(sync_file, fences, i) < 0)
 		goto err;
-	}
 
 	strlcpy(sync_file->user_name, name, sizeof(sync_file->user_name));
 	return sync_file;
 
 err:
+	while (i)
+		dma_fence_put(fences[--i]);
+	kfree(fences);
 	fput(sync_file->file);
 	return NULL;
 

commit 8bb1589c89e61e3b182dd546f1021928ebb5c2a6
Author: Taehee Yoo <ap420073@gmail.com>
Date:   Fri Jul 9 17:35:18 2021 +0000

    net: validate lwtstate->data before returning from skb_tunnel_info()
    
    commit 67a9c94317402b826fc3db32afc8f39336803d97 upstream.
    
    skb_tunnel_info() returns pointer of lwtstate->data as ip_tunnel_info
    type without validation. lwtstate->data can have various types such as
    mpls_iptunnel_encap, etc and these are not compatible.
    So skb_tunnel_info() should validate before returning that pointer.
    
    Splat looks like:
    BUG: KASAN: slab-out-of-bounds in vxlan_get_route+0x418/0x4b0 [vxlan]
    Read of size 2 at addr ffff888106ec2698 by task ping/811
    
    CPU: 1 PID: 811 Comm: ping Not tainted 5.13.0+ #1195
    Call Trace:
     dump_stack_lvl+0x56/0x7b
     print_address_description.constprop.8.cold.13+0x13/0x2ee
     ? vxlan_get_route+0x418/0x4b0 [vxlan]
     ? vxlan_get_route+0x418/0x4b0 [vxlan]
     kasan_report.cold.14+0x83/0xdf
     ? vxlan_get_route+0x418/0x4b0 [vxlan]
     vxlan_get_route+0x418/0x4b0 [vxlan]
     [ ... ]
     vxlan_xmit_one+0x148b/0x32b0 [vxlan]
     [ ... ]
     vxlan_xmit+0x25c5/0x4780 [vxlan]
     [ ... ]
     dev_hard_start_xmit+0x1ae/0x6e0
     __dev_queue_xmit+0x1f39/0x31a0
     [ ... ]
     neigh_xmit+0x2f9/0x940
     mpls_xmit+0x911/0x1600 [mpls_iptunnel]
     lwtunnel_xmit+0x18f/0x450
     ip_finish_output2+0x867/0x2040
     [ ... ]
    
    Fixes: 61adedf3e3f1 ("route: move lwtunnel state to dst_entry")
    Signed-off-by: Taehee Yoo <ap420073@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/net/dst_metadata.h b/include/net/dst_metadata.h
index 56cb3c38569a..14efa0ded75d 100644
--- a/include/net/dst_metadata.h
+++ b/include/net/dst_metadata.h
@@ -45,7 +45,9 @@ skb_tunnel_info(const struct sk_buff *skb)
 		return &md_dst->u.tun_info;
 
 	dst = skb_dst(skb);
-	if (dst && dst->lwtstate)
+	if (dst && dst->lwtstate &&
+	    (dst->lwtstate->type == LWTUNNEL_ENCAP_IP ||
+	     dst->lwtstate->type == LWTUNNEL_ENCAP_IP6))
 		return lwt_tun_info(dst->lwtstate);
 
 	return NULL;

commit d8142fffdb3e8c32b282a1a6c48b763eb92a8acf
Author: Alexander Ovechkin <ovov@yandex-team.ru>
Date:   Fri Jul 9 18:28:23 2021 +0300

    net: send SYNACK packet with accepted fwmark
    
    commit 43b90bfad34bcb81b8a5bc7dc650800f4be1787e upstream.
    
    commit e05a90ec9e16 ("net: reflect mark on tcp syn ack packets")
    fixed IPv4 only.
    
    This part is for the IPv6 side.
    
    Fixes: e05a90ec9e16 ("net: reflect mark on tcp syn ack packets")
    Signed-off-by: Alexander Ovechkin <ovov@yandex-team.ru>
    Acked-by: Dmitry Yakunin <zeil@yandex-team.ru>
    Reviewed-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index 8d822df83b08..2e7a28f327a8 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -503,7 +503,8 @@ static int tcp_v6_send_synack(const struct sock *sk, struct dst_entry *dst,
 		opt = ireq->ipv6_opt;
 		if (!opt)
 			opt = rcu_dereference(np->opt);
-		err = ip6_xmit(sk, skb, fl6, sk->sk_mark, opt, np->tclass);
+		err = ip6_xmit(sk, skb, fl6, skb->mark ? : sk->sk_mark, opt,
+			       np->tclass);
 		rcu_read_unlock();
 		err = net_xmit_eval(err);
 	}

commit a0a817b2d308fac090a05cbbe80988e073ac5193
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Fri Jul 9 17:58:29 2021 +0300

    net: ti: fix UAF in tlan_remove_one
    
    commit 0336f8ffece62f882ab3012820965a786a983f70 upstream.
    
    priv is netdev private data and it cannot be
    used after free_netdev() call. Using priv after free_netdev()
    can cause UAF bug. Fix it by moving free_netdev() at the end of the
    function.
    
    Fixes: 1e0a8b13d355 ("tlan: cancel work at remove path")
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/ti/tlan.c b/drivers/net/ethernet/ti/tlan.c
index 01f99e5df145..9f2129623d18 100644
--- a/drivers/net/ethernet/ti/tlan.c
+++ b/drivers/net/ethernet/ti/tlan.c
@@ -312,9 +312,8 @@ static void tlan_remove_one(struct pci_dev *pdev)
 	pci_release_regions(pdev);
 #endif
 
-	free_netdev(dev);
-
 	cancel_work_sync(&priv->tlan_tqueue);
+	free_netdev(dev);
 }
 
 static void tlan_start(struct net_device *dev)

commit 11e9d163d631198bb3eb41a677a61b499516c0f7
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Fri Jul 9 17:24:18 2021 +0300

    net: qcom/emac: fix UAF in emac_remove
    
    commit ad297cd2db8953e2202970e9504cab247b6c7cb4 upstream.
    
    adpt is netdev private data and it cannot be
    used after free_netdev() call. Using adpt after free_netdev()
    can cause UAF bug. Fix it by moving free_netdev() at the end of the
    function.
    
    Fixes: 54e19bc74f33 ("net: qcom/emac: do not use devm on internal phy pdev")
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/qualcomm/emac/emac.c b/drivers/net/ethernet/qualcomm/emac/emac.c
index 19673ed929e6..76a9b37c8680 100644
--- a/drivers/net/ethernet/qualcomm/emac/emac.c
+++ b/drivers/net/ethernet/qualcomm/emac/emac.c
@@ -759,12 +759,13 @@ static int emac_remove(struct platform_device *pdev)
 
 	put_device(&adpt->phydev->mdio.dev);
 	mdiobus_unregister(adpt->mii_bus);
-	free_netdev(netdev);
 
 	if (adpt->phy.digital)
 		iounmap(adpt->phy.digital);
 	iounmap(adpt->phy.base);
 
+	free_netdev(netdev);
+
 	return 0;
 }
 

commit 9947e8768f1f3634a54c810384def243038329f5
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Fri Jul 9 17:09:53 2021 +0300

    net: moxa: fix UAF in moxart_mac_probe
    
    commit c78eaeebe855fd93f2e77142ffd0404a54070d84 upstream.
    
    In case of netdev registration failure the code path will
    jump to init_fail label:
    
    init_fail:
            netdev_err(ndev, "init failed\n");
            moxart_mac_free_memory(ndev);
    irq_map_fail:
            free_netdev(ndev);
            return ret;
    
    So, there is no need to call free_netdev() before jumping
    to error handling path, since it can cause UAF or double-free
    bug.
    
    Fixes: 6c821bd9edc9 ("net: Add MOXA ART SoCs ethernet driver")
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/moxa/moxart_ether.c b/drivers/net/ethernet/moxa/moxart_ether.c
index 4db3431b79ac..e1a3c3fefc31 100644
--- a/drivers/net/ethernet/moxa/moxart_ether.c
+++ b/drivers/net/ethernet/moxa/moxart_ether.c
@@ -538,10 +538,8 @@ static int moxart_mac_probe(struct platform_device *pdev)
 	SET_NETDEV_DEV(ndev, &pdev->dev);
 
 	ret = register_netdev(ndev);
-	if (ret) {
-		free_netdev(ndev);
+	if (ret)
 		goto init_fail;
-	}
 
 	netdev_dbg(ndev, "%s: IRQ=%d address=%pM\n",
 		   __func__, ndev->irq, ndev->dev_addr);

commit 13d520ab0396157efd604333d22937777f9df57c
Author: Florian Fainelli <f.fainelli@gmail.com>
Date:   Thu Jul 8 18:55:32 2021 -0700

    net: bcmgenet: Ensure all TX/RX queues DMAs are disabled
    
    commit 2b452550a203d88112eaf0ba9fc4b750a000b496 upstream.
    
    Make sure that we disable each of the TX and RX queues in the TDMA and
    RDMA control registers. This is a correctness change to be symmetrical
    with the code that enables the TX and RX queues.
    
    Tested-by: Maxime Ripard <maxime@cerno.tech>
    Fixes: 1c1008c793fa ("net: bcmgenet: add main driver file")
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index 1546a9bd9203..bcc01fb1472c 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -2790,15 +2790,21 @@ static void bcmgenet_set_hw_addr(struct bcmgenet_priv *priv,
 /* Returns a reusable dma control register value */
 static u32 bcmgenet_dma_disable(struct bcmgenet_priv *priv)
 {
+	unsigned int i;
 	u32 reg;
 	u32 dma_ctrl;
 
 	/* disable DMA */
 	dma_ctrl = 1 << (DESC_INDEX + DMA_RING_BUF_EN_SHIFT) | DMA_EN;
+	for (i = 0; i < priv->hw_params->tx_queues; i++)
+		dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT));
 	reg = bcmgenet_tdma_readl(priv, DMA_CTRL);
 	reg &= ~dma_ctrl;
 	bcmgenet_tdma_writel(priv, reg, DMA_CTRL);
 
+	dma_ctrl = 1 << (DESC_INDEX + DMA_RING_BUF_EN_SHIFT) | DMA_EN;
+	for (i = 0; i < priv->hw_params->rx_queues; i++)
+		dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT));
 	reg = bcmgenet_rdma_readl(priv, DMA_CTRL);
 	reg &= ~dma_ctrl;
 	bcmgenet_rdma_writel(priv, reg, DMA_CTRL);

commit a2281d2f761f990cb004398506fc5a0e720817e6
Author: Wolfgang Bumiller <w.bumiller@proxmox.com>
Date:   Fri Jul 2 14:07:36 2021 +0200

    net: bridge: sync fdb to new unicast-filtering ports
    
    commit a019abd8022061b917da767cd1a66ed823724eab upstream.
    
    Since commit 2796d0c648c9 ("bridge: Automatically manage
    port promiscuous mode.")
    bridges with `vlan_filtering 1` and only 1 auto-port don't
    set IFF_PROMISC for unicast-filtering-capable ports.
    
    Normally on port changes `br_manage_promisc` is called to
    update the promisc flags and unicast filters if necessary,
    but it cannot distinguish between *new* ports and ones
    losing their promisc flag, and new ports end up not
    receiving the MAC address list.
    
    Fix this by calling `br_fdb_sync_static` in `br_add_if`
    after the port promisc flags are updated and the unicast
    filter was supposed to have been filled.
    
    Fixes: 2796d0c648c9 ("bridge: Automatically manage port promiscuous mode.")
    Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
    Acked-by: Nikolay Aleksandrov <nikolay@nvidia.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c
index ed2b6002ae53..5aa508a08a69 100644
--- a/net/bridge/br_if.c
+++ b/net/bridge/br_if.c
@@ -564,7 +564,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev,
 	struct net_bridge_port *p;
 	int err = 0;
 	unsigned br_hr, dev_hr;
-	bool changed_addr;
+	bool changed_addr, fdb_synced = false;
 
 	/* Don't allow bridging non-ethernet like devices, or DSA-enabled
 	 * master network devices since the bridge layer rx_handler prevents
@@ -640,6 +640,19 @@ int br_add_if(struct net_bridge *br, struct net_device *dev,
 	list_add_rcu(&p->list, &br->port_list);
 
 	nbp_update_port_count(br);
+	if (!br_promisc_port(p) && (p->dev->priv_flags & IFF_UNICAST_FLT)) {
+		/* When updating the port count we also update all ports'
+		 * promiscuous mode.
+		 * A port leaving promiscuous mode normally gets the bridge's
+		 * fdb synced to the unicast filter (if supported), however,
+		 * `br_port_clear_promisc` does not distinguish between
+		 * non-promiscuous ports and *new* ports, so we need to
+		 * sync explicitly here.
+		 */
+		fdb_synced = br_fdb_sync_static(br, p) == 0;
+		if (!fdb_synced)
+			netdev_err(dev, "failed to sync bridge static fdb addresses to this port\n");
+	}
 
 	netdev_update_features(br->dev);
 
@@ -680,6 +693,8 @@ int br_add_if(struct net_bridge *br, struct net_device *dev,
 	return 0;
 
 err7:
+	if (fdb_synced)
+		br_fdb_unsync_static(br, p);
 	list_del_rcu(&p->list);
 	br_fdb_delete_by_port(br, p, 0, 1);
 	nbp_update_port_count(br);

commit 1b72d43e6b9f5dee6969df1570680652cf3ecbe4
Author: Vasily Averin <vvs@virtuozzo.com>
Date:   Thu Jul 1 08:02:49 2021 +0300

    netfilter: ctnetlink: suspicious RCU usage in ctnetlink_dump_helpinfo
    
    commit c23a9fd209bc6f8c1fa6ee303fdf037d784a1627 upstream.
    
    Two patches listed below removed ctnetlink_dump_helpinfo call from under
    rcu_read_lock. Now its rcu_dereference generates following warning:
    =============================
    WARNING: suspicious RCU usage
    5.13.0+ #5 Not tainted
    -----------------------------
    net/netfilter/nf_conntrack_netlink.c:221 suspicious rcu_dereference_check() usage!
    
    other info that might help us debug this:
    rcu_scheduler_active = 2, debug_locks = 1
    stack backtrace:
    CPU: 1 PID: 2251 Comm: conntrack Not tainted 5.13.0+ #5
    Call Trace:
     dump_stack+0x7f/0xa1
     ctnetlink_dump_helpinfo+0x134/0x150 [nf_conntrack_netlink]
     ctnetlink_fill_info+0x2c2/0x390 [nf_conntrack_netlink]
     ctnetlink_dump_table+0x13f/0x370 [nf_conntrack_netlink]
     netlink_dump+0x10c/0x370
     __netlink_dump_start+0x1a7/0x260
     ctnetlink_get_conntrack+0x1e5/0x250 [nf_conntrack_netlink]
     nfnetlink_rcv_msg+0x613/0x993 [nfnetlink]
     netlink_rcv_skb+0x50/0x100
     nfnetlink_rcv+0x55/0x120 [nfnetlink]
     netlink_unicast+0x181/0x260
     netlink_sendmsg+0x23f/0x460
     sock_sendmsg+0x5b/0x60
     __sys_sendto+0xf1/0x160
     __x64_sys_sendto+0x24/0x30
     do_syscall_64+0x36/0x70
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Fixes: 49ca022bccc5 ("netfilter: ctnetlink: don't dump ct extensions of unconfirmed conntracks")
    Fixes: 0b35f6031a00 ("netfilter: Remove duplicated rcu_read_lock.")
    Signed-off-by: Vasily Averin <vvs@virtuozzo.com>
    Reviewed-by: Florian Westphal <fw@strlen.de>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c
index 15c9fbcd32f2..2850a638401d 100644
--- a/net/netfilter/nf_conntrack_netlink.c
+++ b/net/netfilter/nf_conntrack_netlink.c
@@ -213,6 +213,7 @@ static int ctnetlink_dump_helpinfo(struct sk_buff *skb,
 	if (!help)
 		return 0;
 
+	rcu_read_lock();
 	helper = rcu_dereference(help->helper);
 	if (!helper)
 		goto out;
@@ -228,9 +229,11 @@ static int ctnetlink_dump_helpinfo(struct sk_buff *skb,
 
 	nla_nest_end(skb, nest_helper);
 out:
+	rcu_read_unlock();
 	return 0;
 
 nla_put_failure:
+	rcu_read_unlock();
 	return -1;
 }
 

commit 2655699f2e625486be2d8c8b2e8506654df58cde
Author: Vadim Fedorenko <vfedorenko@novek.ru>
Date:   Fri Jul 2 02:47:00 2021 +0300

    net: ipv6: fix return value of ip6_skb_dst_mtu
    
    commit 40fc3054b45820c28ea3c65e2c86d041dc244a8a upstream.
    
    Commit 628a5c561890 ("[INET]: Add IP(V6)_PMTUDISC_RPOBE") introduced
    ip6_skb_dst_mtu with return value of signed int which is inconsistent
    with actually returned values. Also 2 users of this function actually
    assign its value to unsigned int variable and only __xfrm6_output
    assigns result of this function to signed variable but actually uses
    as unsigned in further comparisons and calls. Change this function
    to return unsigned int value.
    
    Fixes: 628a5c561890 ("[INET]: Add IP(V6)_PMTUDISC_RPOBE")
    Reviewed-by: David Ahern <dsahern@kernel.org>
    Signed-off-by: Vadim Fedorenko <vfedorenko@novek.ru>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h
index 5c38a80cee3a..a8f5410ae0d4 100644
--- a/include/net/ip6_route.h
+++ b/include/net/ip6_route.h
@@ -241,7 +241,7 @@ static inline bool ipv6_anycast_destination(const struct dst_entry *dst,
 int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
 		 int (*output)(struct net *, struct sock *, struct sk_buff *));
 
-static inline int ip6_skb_dst_mtu(struct sk_buff *skb)
+static inline unsigned int ip6_skb_dst_mtu(struct sk_buff *skb)
 {
 	int mtu;
 
diff --git a/net/ipv6/xfrm6_output.c b/net/ipv6/xfrm6_output.c
index 71d022704923..b5941c9475f3 100644
--- a/net/ipv6/xfrm6_output.c
+++ b/net/ipv6/xfrm6_output.c
@@ -146,7 +146,7 @@ static int __xfrm6_output(struct net *net, struct sock *sk, struct sk_buff *skb)
 {
 	struct dst_entry *dst = skb_dst(skb);
 	struct xfrm_state *x = dst->xfrm;
-	int mtu;
+	unsigned int mtu;
 	bool toobig;
 
 #ifdef CONFIG_NETFILTER

commit 29e28d7fe30066895b38e0fc5ebd5d2cbfa6bf54
Author: Marek Behún <kabel@kernel.org>
Date:   Thu Jul 1 00:22:28 2021 +0200

    net: dsa: mv88e6xxx: enable .rmu_disable() on Topaz
    
    commit 3709488790022c85720f991bff50d48ed5a36e6a upstream.
    
    Commit 9e5baf9b36367 ("net: dsa: mv88e6xxx: add RMU disable op")
    introduced .rmu_disable() method with implementation for several models,
    but forgot to add Topaz, which can use the Peridot implementation.
    
    Use the Peridot implementation of .rmu_disable() on Topaz.
    
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Fixes: 9e5baf9b36367 ("net: dsa: mv88e6xxx: add RMU disable op")
    Reviewed-by: Andrew Lunn <andrew@lunn.ch>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index 67c0ad3b8079..7c50d27bab76 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -3682,6 +3682,7 @@ static const struct mv88e6xxx_ops mv88e6341_ops = {
 	.mgmt_rsvd2cpu =  mv88e6390_g1_mgmt_rsvd2cpu,
 	.pot_clear = mv88e6xxx_g2_pot_clear,
 	.reset = mv88e6352_g1_reset,
+	.rmu_disable = mv88e6390_g1_rmu_disable,
 	.vtu_getnext = mv88e6352_g1_vtu_getnext,
 	.vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
 	.serdes_power = mv88e6341_serdes_power,
@@ -3764,6 +3765,7 @@ static const struct mv88e6xxx_ops mv88e6351_ops = {
 	.mgmt_rsvd2cpu = mv88e6352_g2_mgmt_rsvd2cpu,
 	.pot_clear = mv88e6xxx_g2_pot_clear,
 	.reset = mv88e6352_g1_reset,
+	.rmu_disable = mv88e6390_g1_rmu_disable,
 	.vtu_getnext = mv88e6352_g1_vtu_getnext,
 	.vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
 	.avb_ops = &mv88e6352_avb_ops,

commit 797b950e8aaec3fc30312bb9a44d702c6cc9d25e
Author: Mikulas Patocka <mpatocka@redhat.com>
Date:   Tue Feb 9 10:56:20 2021 -0500

    dm writecache: fix writing beyond end of underlying device when shrinking
    
    commit 4134455f2aafdfeab50cabb4cccb35e916034b93 upstream.
    
    Do not attempt to write any data beyond the end of the underlying data
    device while shrinking it.
    
    The DM writecache device must be suspended when the underlying data
    device is shrunk.
    
    Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Mike Snitzer <snitzer@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/md/dm-writecache.c b/drivers/md/dm-writecache.c
index 51ba6caa7dae..3ca8627c2f1d 100644
--- a/drivers/md/dm-writecache.c
+++ b/drivers/md/dm-writecache.c
@@ -142,6 +142,7 @@ struct dm_writecache {
 	size_t metadata_sectors;
 	size_t n_blocks;
 	uint64_t seq_count;
+	sector_t data_device_sectors;
 	void *block_start;
 	struct wc_entry *entries;
 	unsigned block_size;
@@ -929,6 +930,8 @@ static void writecache_resume(struct dm_target *ti)
 
 	wc_lock(wc);
 
+	wc->data_device_sectors = i_size_read(wc->dev->bdev->bd_inode) >> SECTOR_SHIFT;
+
 	if (WC_MODE_PMEM(wc)) {
 		persistent_memory_invalidate_cache(wc->memory_map, wc->memory_map_size);
 	} else {
@@ -1499,6 +1502,10 @@ static bool wc_add_block(struct writeback_struct *wb, struct wc_entry *e, gfp_t
 	void *address = memory_data(wc, e);
 
 	persistent_memory_flush_cache(address, block_size);
+
+	if (unlikely(bio_end_sector(&wb->bio) >= wc->data_device_sectors))
+		return true;
+
 	return bio_add_page(&wb->bio, persistent_memory_page(address),
 			    block_size, persistent_memory_page_offset(address)) != 0;
 }
@@ -1571,6 +1578,9 @@ static void __writecache_writeback_pmem(struct dm_writecache *wc, struct writeba
 		if (writecache_has_error(wc)) {
 			bio->bi_status = BLK_STS_IOERR;
 			bio_endio(&wb->bio);
+		} else if (unlikely(!bio_sectors(&wb->bio))) {
+			bio->bi_status = BLK_STS_OK;
+			bio_endio(&wb->bio);
 		} else {
 			submit_bio(&wb->bio);
 		}
@@ -1614,6 +1624,14 @@ static void __writecache_writeback_ssd(struct dm_writecache *wc, struct writebac
 			e = f;
 		}
 
+		if (unlikely(to.sector + to.count > wc->data_device_sectors)) {
+			if (to.sector >= wc->data_device_sectors) {
+				writecache_copy_endio(0, 0, c);
+				continue;
+			}
+			from.count = to.count = wc->data_device_sectors - to.sector;
+		}
+
 		dm_kcopyd_copy(wc->dm_kcopyd, &from, 1, &to, 0, writecache_copy_endio, c);
 
 		__writeback_throttle(wc, wbl);

commit fb55695f41f6471ae8dff9e0a175fcec24fd3180
Author: Mikulas Patocka <mpatocka@redhat.com>
Date:   Thu Feb 4 05:20:52 2021 -0500

    dm writecache: return the exact table values that were set
    
    commit 054bee16163df023e2589db09fd27d81f7ad9e72 upstream.
    
    LVM doesn't like it when the target returns different values from what
    was set in the constructor. Fix dm-writecache so that the returned
    table values are exactly the same as requested values.
    
    Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
    Cc: stable@vger.kernel.org # v4.18+
    Signed-off-by: Mike Snitzer <snitzer@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/md/dm-writecache.c b/drivers/md/dm-writecache.c
index a1d4166864d0..51ba6caa7dae 100644
--- a/drivers/md/dm-writecache.c
+++ b/drivers/md/dm-writecache.c
@@ -153,6 +153,7 @@ struct dm_writecache {
 	bool overwrote_committed:1;
 	bool memory_vmapped:1;
 
+	bool start_sector_set:1;
 	bool high_wm_percent_set:1;
 	bool low_wm_percent_set:1;
 	bool max_writeback_jobs_set:1;
@@ -161,6 +162,10 @@ struct dm_writecache {
 	bool writeback_fua_set:1;
 	bool flush_on_suspend:1;
 
+	unsigned high_wm_percent_value;
+	unsigned low_wm_percent_value;
+	unsigned autocommit_time_value;
+
 	unsigned writeback_all;
 	struct workqueue_struct *writeback_wq;
 	struct work_struct writeback_work;
@@ -2045,6 +2050,7 @@ static int writecache_ctr(struct dm_target *ti, unsigned argc, char **argv)
 			if (sscanf(string, "%llu%c", &start_sector, &dummy) != 1)
 				goto invalid_optional;
 			wc->start_sector = start_sector;
+			wc->start_sector_set = true;
 			if (wc->start_sector != start_sector ||
 			    wc->start_sector >= wc->memory_map_size >> SECTOR_SHIFT)
 				goto invalid_optional;
@@ -2054,6 +2060,7 @@ static int writecache_ctr(struct dm_target *ti, unsigned argc, char **argv)
 				goto invalid_optional;
 			if (high_wm_percent < 0 || high_wm_percent > 100)
 				goto invalid_optional;
+			wc->high_wm_percent_value = high_wm_percent;
 			wc->high_wm_percent_set = true;
 		} else if (!strcasecmp(string, "low_watermark") && opt_params >= 1) {
 			string = dm_shift_arg(&as), opt_params--;
@@ -2061,6 +2068,7 @@ static int writecache_ctr(struct dm_target *ti, unsigned argc, char **argv)
 				goto invalid_optional;
 			if (low_wm_percent < 0 || low_wm_percent > 100)
 				goto invalid_optional;
+			wc->low_wm_percent_value = low_wm_percent;
 			wc->low_wm_percent_set = true;
 		} else if (!strcasecmp(string, "writeback_jobs") && opt_params >= 1) {
 			string = dm_shift_arg(&as), opt_params--;
@@ -2080,6 +2088,7 @@ static int writecache_ctr(struct dm_target *ti, unsigned argc, char **argv)
 			if (autocommit_msecs > 3600000)
 				goto invalid_optional;
 			wc->autocommit_jiffies = msecs_to_jiffies(autocommit_msecs);
+			wc->autocommit_time_value = autocommit_msecs;
 			wc->autocommit_time_set = true;
 		} else if (!strcasecmp(string, "fua")) {
 			if (WC_MODE_PMEM(wc)) {
@@ -2275,7 +2284,6 @@ static void writecache_status(struct dm_target *ti, status_type_t type,
 	struct dm_writecache *wc = ti->private;
 	unsigned extra_args;
 	unsigned sz = 0;
-	uint64_t x;
 
 	switch (type) {
 	case STATUSTYPE_INFO:
@@ -2287,7 +2295,7 @@ static void writecache_status(struct dm_target *ti, status_type_t type,
 		DMEMIT("%c %s %s %u ", WC_MODE_PMEM(wc) ? 'p' : 's',
 				wc->dev->name, wc->ssd_dev->name, wc->block_size);
 		extra_args = 0;
-		if (wc->start_sector)
+		if (wc->start_sector_set)
 			extra_args += 2;
 		if (wc->high_wm_percent_set)
 			extra_args += 2;
@@ -2303,26 +2311,18 @@ static void writecache_status(struct dm_target *ti, status_type_t type,
 			extra_args++;
 
 		DMEMIT("%u", extra_args);
-		if (wc->start_sector)
+		if (wc->start_sector_set)
 			DMEMIT(" start_sector %llu", (unsigned long long)wc->start_sector);
-		if (wc->high_wm_percent_set) {
-			x = (uint64_t)wc->freelist_high_watermark * 100;
-			x += wc->n_blocks / 2;
-			do_div(x, (size_t)wc->n_blocks);
-			DMEMIT(" high_watermark %u", 100 - (unsigned)x);
-		}
-		if (wc->low_wm_percent_set) {
-			x = (uint64_t)wc->freelist_low_watermark * 100;
-			x += wc->n_blocks / 2;
-			do_div(x, (size_t)wc->n_blocks);
-			DMEMIT(" low_watermark %u", 100 - (unsigned)x);
-		}
+		if (wc->high_wm_percent_set)
+			DMEMIT(" high_watermark %u", wc->high_wm_percent_value);
+		if (wc->low_wm_percent_set)
+			DMEMIT(" low_watermark %u", wc->low_wm_percent_value);
 		if (wc->max_writeback_jobs_set)
 			DMEMIT(" writeback_jobs %u", wc->max_writeback_jobs);
 		if (wc->autocommit_blocks_set)
 			DMEMIT(" autocommit_blocks %u", wc->autocommit_blocks);
 		if (wc->autocommit_time_set)
-			DMEMIT(" autocommit_time %u", jiffies_to_msecs(wc->autocommit_jiffies));
+			DMEMIT(" autocommit_time %u", wc->autocommit_time_value);
 		if (wc->writeback_fua_set)
 			DMEMIT(" %sfua", wc->writeback_fua ? "" : "no");
 		break;

commit bb7dd800a5bef544683f16cdec96a450dbd7238e
Author: Nanyong Sun <sunnanyong@huawei.com>
Date:   Tue Jul 20 16:20:48 2021 +0800

    mm: slab: fix kmem_cache_create failed when sysfs node not destroyed
    
    The commit d38a2b7a9c93 ("mm: memcg/slab: fix memory leak at non-root
    kmem_cache destroy") introduced a problem: If one thread destroy a
    kmem_cache A and another thread concurrently create a kmem_cache B,
    which is mergeable with A and has same size with A, the B may fail to
    create due to the duplicate sysfs node.
    The scenario in detail:
    1) Thread 1 uses kmem_cache_destroy() to destroy kmem_cache A which is
    mergeable, it decreases A's refcount and if refcount is 0, then call
    memcg_set_kmem_cache_dying() which set A->memcg_params.dying = true,
    then unlock the slab_mutex and call flush_memcg_workqueue(), it may cost
    a while.
    Note: now the sysfs node(like '/kernel/slab/:0000248') of A is still
    present, it will be deleted in shutdown_cache() which will be called
    after flush_memcg_workqueue() is done and lock the slab_mutex again.
    2) Now if thread 2 is coming, it use kmem_cache_create() to create B, which
    is mergeable with A(their size is same), it gain the lock of slab_mutex,
    then call __kmem_cache_alias() trying to find a mergeable node, because
    of the below added code in commit d38a2b7a9c93 ("mm: memcg/slab: fix
    memory leak at non-root kmem_cache destroy"), B is not mergeable with
    A whose memcg_params.dying is true.
    
    int slab_unmergeable(struct kmem_cache *s)
            if (s->refcount < 0)
                    return 1;
    
            /*
             * Skip the dying kmem_cache.
             */
            if (s->memcg_params.dying)
                    return 1;
    
            return 0;
     }
    
    So B has to create its own sysfs node by calling:
     create_cache->
            __kmem_cache_create->
                    sysfs_slab_add->
                            kobject_init_and_add
    Because B is mergeable itself, its filename of sysfs node is based on its size,
    like '/kernel/slab/:0000248', which is duplicate with A, and the sysfs
    node of A is still present now, so kobject_init_and_add() will return
    fail and result in kmem_cache_create() fail.
    
    Concurrently modprobe and rmmod the two modules below can reproduce the issue
    quickly: nf_conntrack_expect, se_sess_cache. See call trace in the end.
    
    LTS versions of v4.19.y and v5.4.y have this problem, whereas linux versions after
    v5.9 do not have this problem because the patchset: ("The new cgroup slab memory
    controller") almost refactored memcg slab.
    
    A potential solution(this patch belongs): Just let the dying kmem_cache be mergeable,
    the slab_mutex lock can prevent the race between alias kmem_cache creating thread
    and root kmem_cache destroying thread. In the destroying thread, after
    flush_memcg_workqueue() is done, judge the refcount again, if someone
    reference it again during un-lock time, we don't need to destroy the kmem_cache
    completely, we can reuse it.
    
    Another potential solution: revert the commit d38a2b7a9c93 ("mm: memcg/slab:
    fix memory leak at non-root kmem_cache destroy"), compare to the fail of
    kmem_cache_create, the memory leak in special scenario seems less harmful.
    
    Call trace:
     sysfs: cannot create duplicate filename '/kernel/slab/:0000248'
     Hardware name: QEMU KVM Virtual Machine, BIOS 0.0.0 02/06/2015
     Call trace:
      dump_backtrace+0x0/0x198
      show_stack+0x24/0x30
      dump_stack+0xb0/0x100
      sysfs_warn_dup+0x6c/0x88
      sysfs_create_dir_ns+0x104/0x120
      kobject_add_internal+0xd0/0x378
      kobject_init_and_add+0x90/0xd8
      sysfs_slab_add+0x16c/0x2d0
      __kmem_cache_create+0x16c/0x1d8
      create_cache+0xbc/0x1f8
      kmem_cache_create_usercopy+0x1a0/0x230
      kmem_cache_create+0x50/0x68
      init_se_kmem_caches+0x38/0x258 [target_core_mod]
      target_core_init_configfs+0x8c/0x390 [target_core_mod]
      do_one_initcall+0x54/0x230
      do_init_module+0x64/0x1ec
      load_module+0x150c/0x16f0
      __se_sys_finit_module+0xf0/0x108
      __arm64_sys_finit_module+0x24/0x30
      el0_svc_common+0x80/0x1c0
      el0_svc_handler+0x78/0xe0
      el0_svc+0x10/0x260
     kobject_add_internal failed for :0000248 with -EEXIST, don't try to register things with the same name in the same directory.
     kmem_cache_create(se_sess_cache) failed with error -17
     Hardware name: QEMU KVM Virtual Machine, BIOS 0.0.0 02/06/2015
     Call trace:
      dump_backtrace+0x0/0x198
      show_stack+0x24/0x30
      dump_stack+0xb0/0x100
      kmem_cache_create_usercopy+0xa8/0x230
      kmem_cache_create+0x50/0x68
      init_se_kmem_caches+0x38/0x258 [target_core_mod]
      target_core_init_configfs+0x8c/0x390 [target_core_mod]
      do_one_initcall+0x54/0x230
      do_init_module+0x64/0x1ec
      load_module+0x150c/0x16f0
      __se_sys_finit_module+0xf0/0x108
      __arm64_sys_finit_module+0x24/0x30
      el0_svc_common+0x80/0x1c0
      el0_svc_handler+0x78/0xe0
      el0_svc+0x10/0x260
    
    Fixes: d38a2b7a9c93 ("mm: memcg/slab: fix memory leak at non-root kmem_cache destroy")
    Signed-off-by: Nanyong Sun <sunnanyong@huawei.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/mm/slab_common.c b/mm/slab_common.c
index a94b9981eb17..282ac40c5070 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -311,14 +311,6 @@ int slab_unmergeable(struct kmem_cache *s)
 	if (s->refcount < 0)
 		return 1;
 
-#ifdef CONFIG_MEMCG_KMEM
-	/*
-	 * Skip the dying kmem_cache.
-	 */
-	if (s->memcg_params.dying)
-		return 1;
-#endif
-
 	return 0;
 }
 
@@ -918,6 +910,16 @@ void kmem_cache_destroy(struct kmem_cache *s)
 	get_online_mems();
 
 	mutex_lock(&slab_mutex);
+
+	/*
+	 * Another thread referenced it again
+	 */
+	if (READ_ONCE(s->refcount)) {
+		spin_lock_irq(&memcg_kmem_wq_lock);
+		s->memcg_params.dying = false;
+		spin_unlock_irq(&memcg_kmem_wq_lock);
+		goto out_unlock;
+	}
 #endif
 
 	err = shutdown_memcg_caches(s);

commit aa36bd8fc187f513af2d250b82a3c913053ceaf1
Author: Odin Ugedal <odin@uged.al>
Date:   Tue Jun 29 14:14:52 2021 +0200

    sched/fair: Fix CFS bandwidth hrtimer expiry type
    
    [ Upstream commit 72d0ad7cb5bad265adb2014dbe46c4ccb11afaba ]
    
    The time remaining until expiry of the refresh_timer can be negative.
    Casting the type to an unsigned 64-bit value will cause integer
    underflow, making the runtime_refresh_within return false instead of
    true. These situations are rare, but they do happen.
    
    This does not cause user-facing issues or errors; other than
    possibly unthrottling cfs_rq's using runtime from the previous period(s),
    making the CFS bandwidth enforcement less strict in those (special)
    situations.
    
    Signed-off-by: Odin Ugedal <odin@uged.al>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Ben Segall <bsegall@google.com>
    Link: https://lore.kernel.org/r/20210629121452.18429-1-odin@uged.al
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 9cdbc07bb70f..84e7efda98da 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -4714,7 +4714,7 @@ static const u64 cfs_bandwidth_slack_period = 5 * NSEC_PER_MSEC;
 static int runtime_refresh_within(struct cfs_bandwidth *cfs_b, u64 min_expire)
 {
 	struct hrtimer *refresh_timer = &cfs_b->period_timer;
-	u64 remaining;
+	s64 remaining;
 
 	/* if the call-back is running a quota refresh is already occurring */
 	if (hrtimer_callback_running(refresh_timer))
@@ -4722,7 +4722,7 @@ static int runtime_refresh_within(struct cfs_bandwidth *cfs_b, u64 min_expire)
 
 	/* is a quota refresh about to occur? */
 	remaining = ktime_to_ns(hrtimer_expires_remaining(refresh_timer));
-	if (remaining < min_expire)
+	if (remaining < (s64)min_expire)
 		return 1;
 
 	return 0;

commit 4921b1618045ffab71b1050bf0014df3313a2289
Author: Javed Hasan <jhasan@marvell.com>
Date:   Tue Jun 15 09:59:39 2021 -0700

    scsi: libfc: Fix array index out of bound exception
    
    [ Upstream commit b27c4577557045f1ab3cdfeabfc7f3cd24aca1fe ]
    
    Fix array index out of bound exception in fc_rport_prli_resp().
    
    Link: https://lore.kernel.org/r/20210615165939.24327-1-jhasan@marvell.com
    Signed-off-by: Javed Hasan <jhasan@marvell.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/libfc/fc_rport.c b/drivers/scsi/libfc/fc_rport.c
index 2b3239765c24..afe79d4415e8 100644
--- a/drivers/scsi/libfc/fc_rport.c
+++ b/drivers/scsi/libfc/fc_rport.c
@@ -1169,6 +1169,7 @@ static void fc_rport_prli_resp(struct fc_seq *sp, struct fc_frame *fp,
 		resp_code = (pp->spp.spp_flags & FC_SPP_RESP_MASK);
 		FC_RPORT_DBG(rdata, "PRLI spp_flags = 0x%x spp_type 0x%x\n",
 			     pp->spp.spp_flags, pp->spp.spp_type);
+
 		rdata->spp_type = pp->spp.spp_type;
 		if (resp_code != FC_SPP_RESP_ACK) {
 			if (resp_code == FC_SPP_RESP_CONF)
@@ -1189,11 +1190,13 @@ static void fc_rport_prli_resp(struct fc_seq *sp, struct fc_frame *fp,
 		/*
 		 * Call prli provider if we should act as a target
 		 */
-		prov = fc_passive_prov[rdata->spp_type];
-		if (prov) {
-			memset(&temp_spp, 0, sizeof(temp_spp));
-			prov->prli(rdata, pp->prli.prli_spp_len,
-				   &pp->spp, &temp_spp);
+		if (rdata->spp_type < FC_FC4_PROV_SIZE) {
+			prov = fc_passive_prov[rdata->spp_type];
+			if (prov) {
+				memset(&temp_spp, 0, sizeof(temp_spp));
+				prov->prli(rdata, pp->prli.prli_spp_len,
+					   &pp->spp, &temp_spp);
+			}
 		}
 		/*
 		 * Check if the image pair could be established

commit 23db13b25fbbb06d0ec6eeaedfa728f010795c7e
Author: Yufen Yu <yuyufen@huawei.com>
Date:   Tue Jun 22 11:40:37 2021 +0800

    scsi: libsas: Add LUN number check in .slave_alloc callback
    
    [ Upstream commit 49da96d77938db21864dae6b7736b71e96c1d203 ]
    
    Offlining a SATA device connected to a hisi SAS controller and then
    scanning the host will result in detecting 255 non-existent devices:
    
      # lsscsi
      [2:0:0:0]    disk    ATA      Samsung SSD 860  2B6Q  /dev/sda
      [2:0:1:0]    disk    ATA      WDC WD2003FYYS-3 1D01  /dev/sdb
      [2:0:2:0]    disk    SEAGATE  ST600MM0006      B001  /dev/sdc
      # echo "offline" > /sys/block/sdb/device/state
      # echo "- - -" > /sys/class/scsi_host/host2/scan
      # lsscsi
      [2:0:0:0]    disk    ATA      Samsung SSD 860  2B6Q  /dev/sda
      [2:0:1:0]    disk    ATA      WDC WD2003FYYS-3 1D01  /dev/sdb
      [2:0:1:1]    disk    ATA      WDC WD2003FYYS-3 1D01  /dev/sdh
      ...
      [2:0:1:255]  disk    ATA      WDC WD2003FYYS-3 1D01  /dev/sdjb
    
    After a REPORT LUN command issued to the offline device fails, the SCSI
    midlayer tries to do a sequential scan of all devices whose LUN number is
    not 0. However, SATA does not support LUN numbers at all.
    
    Introduce a generic sas_slave_alloc() handler which will return -ENXIO for
    SATA devices if the requested LUN number is larger than 0 and make libsas
    drivers use this function as their .slave_alloc callback.
    
    Link: https://lore.kernel.org/r/20210622034037.1467088-1-yuyufen@huawei.com
    Reported-by: Wu Bo <wubo40@huawei.com>
    Suggested-by: John Garry <john.garry@huawei.com>
    Reviewed-by: John Garry <john.garry@huawei.com>
    Reviewed-by: Jason Yan <yanaijie@huawei.com>
    Signed-off-by: Yufen Yu <yuyufen@huawei.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/aic94xx/aic94xx_init.c b/drivers/scsi/aic94xx/aic94xx_init.c
index 702da909cee5..ad8a65ab489c 100644
--- a/drivers/scsi/aic94xx/aic94xx_init.c
+++ b/drivers/scsi/aic94xx/aic94xx_init.c
@@ -71,6 +71,7 @@ static struct scsi_host_template aic94xx_sht = {
 	.use_clustering		= ENABLE_CLUSTERING,
 	.eh_device_reset_handler	= sas_eh_device_reset_handler,
 	.eh_target_reset_handler	= sas_eh_target_reset_handler,
+	.slave_alloc		= sas_slave_alloc,
 	.target_destroy		= sas_target_destroy,
 	.ioctl			= sas_ioctl,
 	.track_queue_depth	= 1,
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
index 8aa3222fe486..fea26edd505e 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
@@ -1814,6 +1814,7 @@ static struct scsi_host_template sht_v1_hw = {
 	.use_clustering		= ENABLE_CLUSTERING,
 	.eh_device_reset_handler = sas_eh_device_reset_handler,
 	.eh_target_reset_handler = sas_eh_target_reset_handler,
+	.slave_alloc		= sas_slave_alloc,
 	.target_destroy		= sas_target_destroy,
 	.ioctl			= sas_ioctl,
 	.shost_attrs		= host_attrs,
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
index ebc984ffe6a2..7be943197604 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
@@ -3565,6 +3565,7 @@ static struct scsi_host_template sht_v2_hw = {
 	.use_clustering		= ENABLE_CLUSTERING,
 	.eh_device_reset_handler = sas_eh_device_reset_handler,
 	.eh_target_reset_handler = sas_eh_target_reset_handler,
+	.slave_alloc		= sas_slave_alloc,
 	.target_destroy		= sas_target_destroy,
 	.ioctl			= sas_ioctl,
 	.shost_attrs		= host_attrs,
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
index ce2f232b3df3..16b7ea556118 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
@@ -2115,6 +2115,7 @@ static struct scsi_host_template sht_v3_hw = {
 	.use_clustering		= ENABLE_CLUSTERING,
 	.eh_device_reset_handler = sas_eh_device_reset_handler,
 	.eh_target_reset_handler = sas_eh_target_reset_handler,
+	.slave_alloc		= sas_slave_alloc,
 	.target_destroy		= sas_target_destroy,
 	.ioctl			= sas_ioctl,
 	.shost_attrs		= host_attrs,
diff --git a/drivers/scsi/isci/init.c b/drivers/scsi/isci/init.c
index dde84f744313..07de94ea3819 100644
--- a/drivers/scsi/isci/init.c
+++ b/drivers/scsi/isci/init.c
@@ -167,6 +167,7 @@ static struct scsi_host_template isci_sht = {
 	.eh_abort_handler		= sas_eh_abort_handler,
 	.eh_device_reset_handler        = sas_eh_device_reset_handler,
 	.eh_target_reset_handler        = sas_eh_target_reset_handler,
+	.slave_alloc			= sas_slave_alloc,
 	.target_destroy			= sas_target_destroy,
 	.ioctl				= sas_ioctl,
 	.shost_attrs			= isci_host_attrs,
diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c
index 33229348dcb6..316a11183555 100644
--- a/drivers/scsi/libsas/sas_scsi_host.c
+++ b/drivers/scsi/libsas/sas_scsi_host.c
@@ -942,6 +942,14 @@ void sas_task_abort(struct sas_task *task)
 	}
 }
 
+int sas_slave_alloc(struct scsi_device *sdev)
+{
+	if (dev_is_sata(sdev_to_domain_dev(sdev)) && sdev->lun)
+		return -ENXIO;
+
+	return 0;
+}
+
 void sas_target_destroy(struct scsi_target *starget)
 {
 	struct domain_device *found_dev = starget->hostdata;
@@ -988,5 +996,6 @@ EXPORT_SYMBOL_GPL(sas_task_abort);
 EXPORT_SYMBOL_GPL(sas_phy_reset);
 EXPORT_SYMBOL_GPL(sas_eh_device_reset_handler);
 EXPORT_SYMBOL_GPL(sas_eh_target_reset_handler);
+EXPORT_SYMBOL_GPL(sas_slave_alloc);
 EXPORT_SYMBOL_GPL(sas_target_destroy);
 EXPORT_SYMBOL_GPL(sas_ioctl);
diff --git a/drivers/scsi/mvsas/mv_init.c b/drivers/scsi/mvsas/mv_init.c
index 8c91637cd598..98d6608068ab 100644
--- a/drivers/scsi/mvsas/mv_init.c
+++ b/drivers/scsi/mvsas/mv_init.c
@@ -62,6 +62,7 @@ static struct scsi_host_template mvs_sht = {
 	.use_clustering		= ENABLE_CLUSTERING,
 	.eh_device_reset_handler = sas_eh_device_reset_handler,
 	.eh_target_reset_handler = sas_eh_target_reset_handler,
+	.slave_alloc		= sas_slave_alloc,
 	.target_destroy		= sas_target_destroy,
 	.ioctl			= sas_ioctl,
 	.shost_attrs		= mvst_host_attrs,
diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001_init.c
index 1d59d7447a1c..9547cf516d39 100644
--- a/drivers/scsi/pm8001/pm8001_init.c
+++ b/drivers/scsi/pm8001/pm8001_init.c
@@ -87,6 +87,7 @@ static struct scsi_host_template pm8001_sht = {
 	.use_clustering		= ENABLE_CLUSTERING,
 	.eh_device_reset_handler = sas_eh_device_reset_handler,
 	.eh_target_reset_handler = sas_eh_target_reset_handler,
+	.slave_alloc		= sas_slave_alloc,
 	.target_destroy		= sas_target_destroy,
 	.ioctl			= sas_ioctl,
 	.shost_attrs		= pm8001_host_attrs,

commit 3157c6f82a8afdb5a1afd659c8d3295f6ab5df0d
Author: Colin Ian King <colin.king@canonical.com>
Date:   Mon Jun 21 16:17:27 2021 +0100

    scsi: aic7xxx: Fix unintentional sign extension issue on left shift of u8
    
    [ Upstream commit 332a9dd1d86f1e7203fc7f0fd7e82f0b304200fe ]
    
    The shifting of the u8 integer returned fom ahc_inb(ahc, port+3) by 24 bits
    to the left will be promoted to a 32 bit signed int and then sign-extended
    to a u64. In the event that the top bit of the u8 is set then all then all
    the upper 32 bits of the u64 end up as also being set because of the
    sign-extension. Fix this by casting the u8 values to a u64 before the 24
    bit left shift.
    
    [ This dates back to 2002, I found the offending commit from the git
    history git://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git,
    commit f58eb66c0b0a ("Update aic7xxx driver to 6.2.10...") ]
    
    Link: https://lore.kernel.org/r/20210621151727.20667-1-colin.king@canonical.com
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Addresses-Coverity: ("Unintended sign extension")
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/aic7xxx/aic7xxx_core.c b/drivers/scsi/aic7xxx/aic7xxx_core.c
index 49e02e874553..fe15746af520 100644
--- a/drivers/scsi/aic7xxx/aic7xxx_core.c
+++ b/drivers/scsi/aic7xxx/aic7xxx_core.c
@@ -500,7 +500,7 @@ ahc_inq(struct ahc_softc *ahc, u_int port)
 	return ((ahc_inb(ahc, port))
 	      | (ahc_inb(ahc, port+1) << 8)
 	      | (ahc_inb(ahc, port+2) << 16)
-	      | (ahc_inb(ahc, port+3) << 24)
+	      | (((uint64_t)ahc_inb(ahc, port+3)) << 24)
 	      | (((uint64_t)ahc_inb(ahc, port+4)) << 32)
 	      | (((uint64_t)ahc_inb(ahc, port+5)) << 40)
 	      | (((uint64_t)ahc_inb(ahc, port+6)) << 48)

commit d960ac78b85d65c492e3f7698a7fb9cb86d52376
Author: Krzysztof Kozlowski <krzk@kernel.org>
Date:   Wed May 26 13:20:34 2021 -0400

    rtc: max77686: Do not enforce (incorrect) interrupt trigger type
    
    [ Upstream commit 742b0d7e15c333303daad4856de0764f4bc83601 ]
    
    Interrupt line can be configured on different hardware in different way,
    even inverted.  Therefore driver should not enforce specific trigger
    type - edge falling - but instead rely on Devicetree to configure it.
    
    The Maxim 77686 datasheet describes the interrupt line as active low
    with a requirement of acknowledge from the CPU therefore the edge
    falling is not correct.
    
    The interrupt line is shared between PMIC and RTC driver, so using level
    sensitive interrupt is here especially important to avoid races.  With
    an edge configuration in case if first PMIC signals interrupt followed
    shortly after by the RTC, the interrupt might not be yet cleared/acked
    thus the second one would not be noticed.
    
    Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
    Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
    Link: https://lore.kernel.org/r/20210526172036.183223-6-krzysztof.kozlowski@canonical.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/rtc/rtc-max77686.c b/drivers/rtc/rtc-max77686.c
index 4aff349ae301..8e09450d11a6 100644
--- a/drivers/rtc/rtc-max77686.c
+++ b/drivers/rtc/rtc-max77686.c
@@ -710,8 +710,8 @@ static int max77686_init_rtc_regmap(struct max77686_rtc_info *info)
 
 add_rtc_irq:
 	ret = regmap_add_irq_chip(info->rtc_regmap, info->rtc_irq,
-				  IRQF_TRIGGER_FALLING | IRQF_ONESHOT |
-				  IRQF_SHARED, 0, info->drv_data->rtc_irq_chip,
+				  IRQF_ONESHOT | IRQF_SHARED,
+				  0, info->drv_data->rtc_irq_chip,
 				  &info->rtc_irq_data);
 	if (ret < 0) {
 		dev_err(info->dev, "Failed to add RTC irq chip: %d\n", ret);

commit d47487c52d7d497232a7f42bb067fe4d0fd26a98
Author: Matthias Maennich <maennich@google.com>
Date:   Sat Jun 12 15:18:38 2021 +0100

    kbuild: mkcompile_h: consider timestamp if KBUILD_BUILD_TIMESTAMP is set
    
    [ Upstream commit a979522a1a88556e42a22ce61bccc58e304cb361 ]
    
    To avoid unnecessary recompilations, mkcompile_h does not regenerate
    compile.h if just the timestamp changed.
    Though, if KBUILD_BUILD_TIMESTAMP is set, an explicit timestamp for the
    build was requested, in which case we should not ignore it.
    
    If a user follows the documentation for reproducible builds [1] and
    defines KBUILD_BUILD_TIMESTAMP as the git commit timestamp, a clean
    build will have the correct timestamp. A subsequent cherry-pick (or
    amend) changes the commit timestamp and if an incremental build is done
    with a different KBUILD_BUILD_TIMESTAMP now, that new value is not taken
    into consideration. But it should for reproducibility.
    
    Hence, whenever KBUILD_BUILD_TIMESTAMP is explicitly set, do not ignore
    UTS_VERSION when making a decision about whether the regenerated version
    of compile.h should be moved into place.
    
    [1] https://www.kernel.org/doc/html/latest/kbuild/reproducible-builds.html
    
    Signed-off-by: Matthias Maennich <maennich@google.com>
    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/scripts/mkcompile_h b/scripts/mkcompile_h
index 87f1fc9801d7..662fe19da990 100755
--- a/scripts/mkcompile_h
+++ b/scripts/mkcompile_h
@@ -78,15 +78,23 @@ UTS_TRUNCATE="cut -b -$UTS_LEN"
 # Only replace the real compile.h if the new one is different,
 # in order to preserve the timestamp and avoid unnecessary
 # recompilations.
-# We don't consider the file changed if only the date/time changed.
+# We don't consider the file changed if only the date/time changed,
+# unless KBUILD_BUILD_TIMESTAMP was explicitly set (e.g. for
+# reproducible builds with that value referring to a commit timestamp).
 # A kernel config change will increase the generation number, thus
 # causing compile.h to be updated (including date/time) due to the
 # changed comment in the
 # first line.
 
+if [ -z "$KBUILD_BUILD_TIMESTAMP" ]; then
+   IGNORE_PATTERN="UTS_VERSION"
+else
+   IGNORE_PATTERN="NOT_A_PATTERN_TO_BE_MATCHED"
+fi
+
 if [ -r $TARGET ] && \
-      grep -v 'UTS_VERSION' $TARGET > .tmpver.1 && \
-      grep -v 'UTS_VERSION' .tmpcompile > .tmpver.2 && \
+      grep -v $IGNORE_PATTERN $TARGET > .tmpver.1 && \
+      grep -v $IGNORE_PATTERN .tmpcompile > .tmpver.2 && \
       cmp -s .tmpver.1 .tmpver.2; then
    rm -f .tmpcompile
 else

commit 6ddd334ff267a2174042e5ba8dc41dbcc3d8c4e7
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Mon May 17 13:10:20 2021 +0800

    thermal/core: Correct function name thermal_zone_device_unregister()
    
    [ Upstream commit a052b5118f13febac1bd901fe0b7a807b9d6b51c ]
    
    Fix the following make W=1 kernel build warning:
    
      drivers/thermal/thermal_core.c:1376: warning: expecting prototype for thermal_device_unregister(). Prototype was for thermal_zone_device_unregister() instead
    
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
    Link: https://lore.kernel.org/r/20210517051020.3463536-1-yangyingliang@huawei.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index 7b0ffc1c0ea9..a24296d68f3e 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -1303,7 +1303,7 @@ thermal_zone_device_register(const char *type, int trips, int mask,
 EXPORT_SYMBOL_GPL(thermal_zone_device_register);
 
 /**
- * thermal_device_unregister - removes the registered thermal zone device
+ * thermal_zone_device_unregister - removes the registered thermal zone device
  * @tz: the thermal zone device to remove
  */
 void thermal_zone_device_unregister(struct thermal_zone_device *tz)

commit 6f343d7689b7020a1a57eee7e8eab01471fdffb8
Author: Mian Yousaf Kaukab <ykaukab@suse.de>
Date:   Wed Apr 28 14:58:07 2021 +0200

    arm64: dts: ls208xa: remove bus-num from dspi node
    
    [ Upstream commit 8240c972c1798ea013cbb407722295fc826b3584 ]
    
    On LS2088A-RDB board, if the spi-fsl-dspi driver is built as module
    then its probe fails with the following warning:
    
    [   10.471363] couldn't get idr
    [   10.471381] WARNING: CPU: 4 PID: 488 at drivers/spi/spi.c:2689 spi_register_controller+0x73c/0x8d0
    ...
    [   10.471651] fsl-dspi 2100000.spi: Problem registering DSPI ctlr
    [   10.471708] fsl-dspi: probe of 2100000.spi failed with error -16
    
    Reason for the failure is that bus-num property is set for dspi node.
    However, bus-num property is not set for the qspi node. If probe for
    spi-fsl-qspi happens first then id 0 is dynamically allocated to it.
    Call to spi_register_controller() from spi-fsl-dspi driver then fails.
    Since commit 29d2daf2c33c ("spi: spi-fsl-dspi: Make bus-num property
    optional") bus-num property is optional. Remove bus-num property from
    dspi node to fix the issue.
    
    Signed-off-by: Mian Yousaf Kaukab <ykaukab@suse.de>
    Signed-off-by: Shawn Guo <shawnguo@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
index ebe0cd4bf2b7..8c22ce904e65 100644
--- a/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
+++ b/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
@@ -479,7 +479,6 @@
 			clocks = <&clockgen 4 3>;
 			clock-names = "dspi";
 			spi-num-chipselects = <5>;
-			bus-num = <0>;
 		};
 
 		esdhc: esdhc@2140000 {

commit aa86a2e432466893f8b3c7f47c723b8c1d77773f
Author: Thierry Reding <treding@nvidia.com>
Date:   Tue Apr 13 14:20:57 2021 +0200

    soc/tegra: fuse: Fix Tegra234-only builds
    
    [ Upstream commit e2d0ee225e49a5553986f3138dd2803852a31fd5 ]
    
    The tegra30_fuse_read() symbol is used on Tegra234, so make sure it's
    available.
    
    Signed-off-by: Thierry Reding <treding@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/soc/tegra/fuse/fuse-tegra30.c b/drivers/soc/tegra/fuse/fuse-tegra30.c
index 0ec6385eb15e..7c47a0cebf3b 100644
--- a/drivers/soc/tegra/fuse/fuse-tegra30.c
+++ b/drivers/soc/tegra/fuse/fuse-tegra30.c
@@ -48,7 +48,8 @@
     defined(CONFIG_ARCH_TEGRA_132_SOC) || \
     defined(CONFIG_ARCH_TEGRA_210_SOC) || \
     defined(CONFIG_ARCH_TEGRA_186_SOC) || \
-    defined(CONFIG_ARCH_TEGRA_194_SOC)
+    defined(CONFIG_ARCH_TEGRA_194_SOC) || \
+    defined(CONFIG_ARCH_TEGRA_234_SOC)
 static u32 tegra30_fuse_read_early(struct tegra_fuse *fuse, unsigned int offset)
 {
 	if (WARN_ON(!fuse->base))

commit 4a57bb775c23335484d83420ffff998ff3e3d0d9
Author: Alexandre Torgue <alexandre.torgue@foss.st.com>
Date:   Thu Apr 15 12:10:31 2021 +0200

    ARM: dts: stm32: move stmmac axi config in ethernet node on stm32mp15
    
    [ Upstream commit fb1406335c067be074eab38206cf9abfdce2fb0b ]
    
    It fixes the following warning seen running "make dtbs_check W=1"
    
    Warning (simple_bus_reg): /soc/stmmac-axi-config: missing or empty
    reg/ranges property
    
    Signed-off-by: Alexandre Torgue <alexandre.torgue@foss.st.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/stm32mp157c.dtsi b/arch/arm/boot/dts/stm32mp157c.dtsi
index c50c36baba75..4278a4b22860 100644
--- a/arch/arm/boot/dts/stm32mp157c.dtsi
+++ b/arch/arm/boot/dts/stm32mp157c.dtsi
@@ -964,12 +964,6 @@
 			status = "disabled";
 		};
 
-		stmmac_axi_config_0: stmmac-axi-config {
-			snps,wr_osr_lmt = <0x7>;
-			snps,rd_osr_lmt = <0x7>;
-			snps,blen = <0 0 0 0 16 8 4>;
-		};
-
 		ethernet0: ethernet@5800a000 {
 			compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a";
 			reg = <0x5800a000 0x2000>;
@@ -992,6 +986,12 @@
 			snps,axi-config = <&stmmac_axi_config_0>;
 			snps,tso;
 			status = "disabled";
+
+			stmmac_axi_config_0: stmmac-axi-config {
+				snps,wr_osr_lmt = <0x7>;
+				snps,rd_osr_lmt = <0x7>;
+				snps,blen = <0 0 0 0 16 8 4>;
+			};
 		};
 
 		usbh_ohci: usbh-ohci@5800c000 {

commit 8fdbb45cf80953df7d53aa505603095a5a0d52e8
Author: Alexandre Torgue <alexandre.torgue@foss.st.com>
Date:   Thu Apr 15 12:10:30 2021 +0200

    ARM: dts: stm32: fix i2c node name on stm32f746 to prevent warnings
    
    [ Upstream commit ad0ed10ba5792064fc3accbf8f0341152a57eecb ]
    
    Replace upper case by lower case in i2c nodes name.
    
    Signed-off-by: Alexandre Torgue <alexandre.torgue@foss.st.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/stm32f746.dtsi b/arch/arm/boot/dts/stm32f746.dtsi
index ccd87e833049..be62d9091e03 100644
--- a/arch/arm/boot/dts/stm32f746.dtsi
+++ b/arch/arm/boot/dts/stm32f746.dtsi
@@ -353,9 +353,9 @@
 			status = "disabled";
 		};
 
-		i2c3: i2c@40005C00 {
+		i2c3: i2c@40005c00 {
 			compatible = "st,stm32f7-i2c";
-			reg = <0x40005C00 0x400>;
+			reg = <0x40005c00 0x400>;
 			interrupts = <72>,
 				     <73>;
 			resets = <&rcc STM32F7_APB1_RESET(I2C3)>;

commit 1b441393979ca34b63790ad7a7bacb12cecf04db
Author: Johan Jonker <jbx6244@gmail.com>
Date:   Sun Jun 6 20:16:32 2021 +0200

    ARM: dts: rockchip: fix supply properties in io-domains nodes
    
    [ Upstream commit f07edc41220b14ce057a4e6d7161b30688ddb8a2 ]
    
    A test with rockchip-io-domain.yaml gives notifications
    for supply properties in io-domains nodes.
    Fix them all into ".*-supply$" format.
    
    Signed-off-by: Johan Jonker <jbx6244@gmail.com>
    Link: https://lore.kernel.org/r/20210606181632.13371-1-jbx6244@gmail.com
    Signed-off-by: Heiko Stuebner <heiko@sntech.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/rk3288-rock2-som.dtsi b/arch/arm/boot/dts/rk3288-rock2-som.dtsi
index 32e1ab336662..8c3fa4749de6 100644
--- a/arch/arm/boot/dts/rk3288-rock2-som.dtsi
+++ b/arch/arm/boot/dts/rk3288-rock2-som.dtsi
@@ -218,7 +218,7 @@
 	flash0-supply = <&vcc_flash>;
 	flash1-supply = <&vccio_pmu>;
 	gpio30-supply = <&vccio_pmu>;
-	gpio1830 = <&vcc_io>;
+	gpio1830-supply = <&vcc_io>;
 	lcdc-supply = <&vcc_io>;
 	sdcard-supply = <&vccio_sd>;
 	wifi-supply = <&vcc_18>;
diff --git a/arch/arm/boot/dts/rk3288-vyasa.dts b/arch/arm/boot/dts/rk3288-vyasa.dts
index 4856a9fc0aea..0be70dc8281c 100644
--- a/arch/arm/boot/dts/rk3288-vyasa.dts
+++ b/arch/arm/boot/dts/rk3288-vyasa.dts
@@ -358,10 +358,10 @@
 	audio-supply = <&vcc_18>;
 	bb-supply = <&vcc_io>;
 	dvp-supply = <&vcc_io>;
-	flash0-suuply = <&vcc_18>;
+	flash0-supply = <&vcc_18>;
 	flash1-supply = <&vcc_lan>;
 	gpio30-supply = <&vcc_io>;
-	gpio1830 = <&vcc_io>;
+	gpio1830-supply = <&vcc_io>;
 	lcdc-supply = <&vcc_io>;
 	sdcard-supply = <&vccio_sd>;
 	wifi-supply = <&vcc_18>;

commit f37e79b4d3eda048e866d082992a0335d593b9ff
Author: Sudeep Holla <sudeep.holla@arm.com>
Date:   Tue Jun 8 15:51:33 2021 +0100

    arm64: dts: juno: Update SCPI nodes as per the YAML schema
    
    [ Upstream commit 70010556b158a0fefe43415fb0c58347dcce7da0 ]
    
    The SCPI YAML schema expects standard node names for clocks and
    power domain controllers. Fix those as per the schema for Juno
    platforms.
    
    Link: https://lore.kernel.org/r/20210608145133.2088631-1-sudeep.holla@arm.com
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm64/boot/dts/arm/juno-base.dtsi b/arch/arm64/boot/dts/arm/juno-base.dtsi
index b6f486737589..331862504dc3 100644
--- a/arch/arm64/boot/dts/arm/juno-base.dtsi
+++ b/arch/arm64/boot/dts/arm/juno-base.dtsi
@@ -533,13 +533,13 @@
 		clocks {
 			compatible = "arm,scpi-clocks";
 
-			scpi_dvfs: scpi-dvfs {
+			scpi_dvfs: clocks-0 {
 				compatible = "arm,scpi-dvfs-clocks";
 				#clock-cells = <1>;
 				clock-indices = <0>, <1>, <2>;
 				clock-output-names = "atlclk", "aplclk","gpuclk";
 			};
-			scpi_clk: scpi-clk {
+			scpi_clk: clocks-1 {
 				compatible = "arm,scpi-variable-clocks";
 				#clock-cells = <1>;
 				clock-indices = <3>;
@@ -547,7 +547,7 @@
 			};
 		};
 
-		scpi_devpd: scpi-power-domains {
+		scpi_devpd: power-controller {
 			compatible = "arm,scpi-power-domains";
 			num-domains = <2>;
 			#power-domain-cells = <1>;

commit 62fee02260acd8495575fe5ed0a1bbf1cc273bec
Author: Alexandre Torgue <alexandre.torgue@foss.st.com>
Date:   Thu Apr 15 12:10:27 2021 +0200

    ARM: dts: stm32: fix timer nodes on STM32 MCU to prevent warnings
    
    [ Upstream commit 2388f14d8747f8304e26ee870790e188c9431efd ]
    
    Prevent warning seen with "make dtbs_check W=1" command:
    
    Warning (avoid_unnecessary_addr_size): /soc/timers@40001c00: unnecessary
    address-cells/size-cells without "ranges" or child "reg" property
    
    Reviewed-by: Fabrice Gasnier <fabrice.gasnier@foss.st.com>
    Signed-off-by: Alexandre Torgue <alexandre.torgue@foss.st.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/stm32f429.dtsi b/arch/arm/boot/dts/stm32f429.dtsi
index b16bf00977d5..fdaf43290006 100644
--- a/arch/arm/boot/dts/stm32f429.dtsi
+++ b/arch/arm/boot/dts/stm32f429.dtsi
@@ -263,8 +263,6 @@
 		};
 
 		timers13: timers@40001c00 {
-			#address-cells = <1>;
-			#size-cells = <0>;
 			compatible = "st,stm32-timers";
 			reg = <0x40001C00 0x400>;
 			clocks = <&rcc 0 STM32F4_APB1_CLOCK(TIM13)>;
@@ -278,8 +276,6 @@
 		};
 
 		timers14: timers@40002000 {
-			#address-cells = <1>;
-			#size-cells = <0>;
 			compatible = "st,stm32-timers";
 			reg = <0x40002000 0x400>;
 			clocks = <&rcc 0 STM32F4_APB1_CLOCK(TIM14)>;
@@ -558,8 +554,6 @@
 		};
 
 		timers10: timers@40014400 {
-			#address-cells = <1>;
-			#size-cells = <0>;
 			compatible = "st,stm32-timers";
 			reg = <0x40014400 0x400>;
 			clocks = <&rcc 0 STM32F4_APB2_CLOCK(TIM10)>;
@@ -573,8 +567,6 @@
 		};
 
 		timers11: timers@40014800 {
-			#address-cells = <1>;
-			#size-cells = <0>;
 			compatible = "st,stm32-timers";
 			reg = <0x40014800 0x400>;
 			clocks = <&rcc 0 STM32F4_APB2_CLOCK(TIM11)>;
diff --git a/arch/arm/boot/dts/stm32f746.dtsi b/arch/arm/boot/dts/stm32f746.dtsi
index f48d06a80d1d..ccd87e833049 100644
--- a/arch/arm/boot/dts/stm32f746.dtsi
+++ b/arch/arm/boot/dts/stm32f746.dtsi
@@ -258,8 +258,6 @@
 		};
 
 		timers13: timers@40001c00 {
-			#address-cells = <1>;
-			#size-cells = <0>;
 			compatible = "st,stm32-timers";
 			reg = <0x40001C00 0x400>;
 			clocks = <&rcc 0 STM32F7_APB1_CLOCK(TIM13)>;
@@ -273,8 +271,6 @@
 		};
 
 		timers14: timers@40002000 {
-			#address-cells = <1>;
-			#size-cells = <0>;
 			compatible = "st,stm32-timers";
 			reg = <0x40002000 0x400>;
 			clocks = <&rcc 0 STM32F7_APB1_CLOCK(TIM14)>;
@@ -521,8 +517,6 @@
 		};
 
 		timers10: timers@40014400 {
-			#address-cells = <1>;
-			#size-cells = <0>;
 			compatible = "st,stm32-timers";
 			reg = <0x40014400 0x400>;
 			clocks = <&rcc 0 STM32F7_APB2_CLOCK(TIM10)>;
@@ -536,8 +530,6 @@
 		};
 
 		timers11: timers@40014800 {
-			#address-cells = <1>;
-			#size-cells = <0>;
 			compatible = "st,stm32-timers";
 			reg = <0x40014800 0x400>;
 			clocks = <&rcc 0 STM32F7_APB2_CLOCK(TIM11)>;
diff --git a/arch/arm/boot/dts/stm32h743.dtsi b/arch/arm/boot/dts/stm32h743.dtsi
index 637beffe5067..729ff6264776 100644
--- a/arch/arm/boot/dts/stm32h743.dtsi
+++ b/arch/arm/boot/dts/stm32h743.dtsi
@@ -422,8 +422,6 @@
 		};
 
 		lptimer4: timer@58002c00 {
-			#address-cells = <1>;
-			#size-cells = <0>;
 			compatible = "st,stm32-lptimer";
 			reg = <0x58002c00 0x400>;
 			clocks = <&rcc LPTIM4_CK>;
@@ -438,8 +436,6 @@
 		};
 
 		lptimer5: timer@58003000 {
-			#address-cells = <1>;
-			#size-cells = <0>;
 			compatible = "st,stm32-lptimer";
 			reg = <0x58003000 0x400>;
 			clocks = <&rcc LPTIM5_CK>;

commit 18dce464e3bb7134d440f6786ae68fe30ac71c73
Author: Alexandre Torgue <alexandre.torgue@foss.st.com>
Date:   Thu Apr 15 12:10:26 2021 +0200

    ARM: dts: stm32: fix RCC node name on stm32f429 MCU
    
    [ Upstream commit e4b948415a89a219d13e454011cdcf9e63ecc529 ]
    
    This prevent warning observed with "make dtbs_check W=1"
    
    Warning (simple_bus_reg): /soc/rcc@40023810: simple-bus unit address format
    error, expected "40023800"
    
    Signed-off-by: Alexandre Torgue <alexandre.torgue@foss.st.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/stm32f429.dtsi b/arch/arm/boot/dts/stm32f429.dtsi
index e35d782e7e5f..b16bf00977d5 100644
--- a/arch/arm/boot/dts/stm32f429.dtsi
+++ b/arch/arm/boot/dts/stm32f429.dtsi
@@ -609,7 +609,7 @@
 			status = "disabled";
 		};
 
-		rcc: rcc@40023810 {
+		rcc: rcc@40023800 {
 			#reset-cells = <1>;
 			#clock-cells = <2>;
 			compatible = "st,stm32f42xx-rcc", "st,stm32-rcc";

commit 50002b32fc25ed2f5edd9f601bce845d00eabe1b
Author: Alexandre Torgue <alexandre.torgue@foss.st.com>
Date:   Thu Apr 15 12:10:25 2021 +0200

    ARM: dts: stm32: fix gpio-keys node on STM32 MCU boards
    
    [ Upstream commit bf24b91f4baf7e421c770a1d9c7d381b10206ac9 ]
    
    Fix following warning observed with "make dtbs_check W=1" command.
    It concerns f429 eval and disco boards, f769 disco board.
    
    Warning (unit_address_vs_reg): /gpio_keys/button@0: node has a unit name,
    but no reg or ranges property
    
    Signed-off-by: Alexandre Torgue <alexandre.torgue@foss.st.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/stm32429i-eval.dts b/arch/arm/boot/dts/stm32429i-eval.dts
index 7eb786a2d624..f5429e495024 100644
--- a/arch/arm/boot/dts/stm32429i-eval.dts
+++ b/arch/arm/boot/dts/stm32429i-eval.dts
@@ -111,17 +111,15 @@
 		};
 	};
 
-	gpio_keys {
+	gpio-keys {
 		compatible = "gpio-keys";
-		#address-cells = <1>;
-		#size-cells = <0>;
 		autorepeat;
-		button@0 {
+		button-0 {
 			label = "Wake up";
 			linux,code = <KEY_WAKEUP>;
 			gpios = <&gpioa 0 0>;
 		};
-		button@1 {
+		button-1 {
 			label = "Tamper";
 			linux,code = <KEY_RESTART>;
 			gpios = <&gpioc 13 0>;
diff --git a/arch/arm/boot/dts/stm32746g-eval.dts b/arch/arm/boot/dts/stm32746g-eval.dts
index 8c081eaf20fe..f99b5df4c12f 100644
--- a/arch/arm/boot/dts/stm32746g-eval.dts
+++ b/arch/arm/boot/dts/stm32746g-eval.dts
@@ -73,12 +73,10 @@
 		};
 	};
 
-	gpio_keys {
+	gpio-keys {
 		compatible = "gpio-keys";
-		#address-cells = <1>;
-		#size-cells = <0>;
 		autorepeat;
-		button@0 {
+		button-0 {
 			label = "Wake up";
 			linux,code = <KEY_WAKEUP>;
 			gpios = <&gpioc 13 0>;
diff --git a/arch/arm/boot/dts/stm32f429-disco.dts b/arch/arm/boot/dts/stm32f429-disco.dts
index 5ceb2cf3777f..bcf2a5cfd6b2 100644
--- a/arch/arm/boot/dts/stm32f429-disco.dts
+++ b/arch/arm/boot/dts/stm32f429-disco.dts
@@ -78,12 +78,10 @@
 		};
 	};
 
-	gpio_keys {
+	gpio-keys {
 		compatible = "gpio-keys";
-		#address-cells = <1>;
-		#size-cells = <0>;
 		autorepeat;
-		button@0 {
+		button-0 {
 			label = "User";
 			linux,code = <KEY_HOME>;
 			gpios = <&gpioa 0 0>;
diff --git a/arch/arm/boot/dts/stm32f469-disco.dts b/arch/arm/boot/dts/stm32f469-disco.dts
index eea979ef5512..881210d820bb 100644
--- a/arch/arm/boot/dts/stm32f469-disco.dts
+++ b/arch/arm/boot/dts/stm32f469-disco.dts
@@ -103,12 +103,10 @@
 		};
 	};
 
-	gpio_keys {
+	gpio-keys {
 		compatible = "gpio-keys";
-		#address-cells = <1>;
-		#size-cells = <0>;
 		autorepeat;
-		button@0 {
+		button-0 {
 			label = "User";
 			linux,code = <KEY_WAKEUP>;
 			gpios = <&gpioa 0 GPIO_ACTIVE_HIGH>;
diff --git a/arch/arm/boot/dts/stm32f769-disco.dts b/arch/arm/boot/dts/stm32f769-disco.dts
index 677276ba4dbe..80516f44bb19 100644
--- a/arch/arm/boot/dts/stm32f769-disco.dts
+++ b/arch/arm/boot/dts/stm32f769-disco.dts
@@ -74,12 +74,10 @@
 		};
 	};
 
-	gpio_keys {
+	gpio-keys {
 		compatible = "gpio-keys";
-		#address-cells = <1>;
-		#size-cells = <0>;
 		autorepeat;
-		button@0 {
+		button-0 {
 			label = "User";
 			linux,code = <KEY_HOME>;
 			gpios = <&gpioa 0 GPIO_ACTIVE_HIGH>;

commit 6dee36f4339f38985b882f1cd8728901b477b4c8
Author: Bixuan Cui <cuibixuan@huawei.com>
Date:   Sat May 8 11:15:09 2021 +0800

    rtc: mxc_v2: add missing MODULE_DEVICE_TABLE
    
    [ Upstream commit 206e04ec7539e7bfdde9aa79a7cde656c9eb308e ]
    
    This patch adds missing MODULE_DEVICE_TABLE definition which generates
    correct modalias for automatic loading of this driver when it is built
    as an external module.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Bixuan Cui <cuibixuan@huawei.com>
    Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
    Link: https://lore.kernel.org/r/20210508031509.53735-1-cuibixuan@huawei.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/rtc/rtc-mxc_v2.c b/drivers/rtc/rtc-mxc_v2.c
index 007879a5042d..45c7366b7286 100644
--- a/drivers/rtc/rtc-mxc_v2.c
+++ b/drivers/rtc/rtc-mxc_v2.c
@@ -395,6 +395,7 @@ static const struct of_device_id mxc_ids[] = {
 	{ .compatible = "fsl,imx53-rtc", },
 	{}
 };
+MODULE_DEVICE_TABLE(of, mxc_ids);
 
 static struct platform_driver mxc_rtc_driver = {
 	.driver = {

commit 3c6ac249db5eb12a463515478f31b71e8e81a37a
Author: Jonathan Neuschäfer <j.neuschaefer@gmx.net>
Date:   Sat Apr 24 14:37:28 2021 +0200

    ARM: imx: pm-imx5: Fix references to imx5_cpu_suspend_info
    
    [ Upstream commit 89b759469d525f4d5f9c29cd3b1f490311c67f85 ]
    
    The name of the struct, as defined in arch/arm/mach-imx/pm-imx5.c,
    is imx5_cpu_suspend_info.
    
    Signed-off-by: Jonathan Neuschäfer <j.neuschaefer@gmx.net>
    Reviewed-by: Fabio Estevam <festevam@gmail.com>
    Signed-off-by: Shawn Guo <shawnguo@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/mach-imx/suspend-imx53.S b/arch/arm/mach-imx/suspend-imx53.S
index 5ed078ad110a..f12d24104075 100644
--- a/arch/arm/mach-imx/suspend-imx53.S
+++ b/arch/arm/mach-imx/suspend-imx53.S
@@ -33,11 +33,11 @@
  *                              ^
  *                              ^
  *                      imx53_suspend code
- *              PM_INFO structure(imx53_suspend_info)
+ *              PM_INFO structure(imx5_cpu_suspend_info)
  * ======================== low address =======================
  */
 
-/* Offsets of members of struct imx53_suspend_info */
+/* Offsets of members of struct imx5_cpu_suspend_info */
 #define SUSPEND_INFO_MX53_M4IF_V_OFFSET		0x0
 #define SUSPEND_INFO_MX53_IOMUXC_V_OFFSET	0x4
 #define SUSPEND_INFO_MX53_IO_COUNT_OFFSET	0x8

commit 467e2517a9f8d5c2236a5f310c437157bc0718b2
Author: Primoz Fiser <primoz.fiser@norik.com>
Date:   Mon Apr 12 08:24:50 2021 +0200

    ARM: dts: imx6: phyFLEX: Fix UART hardware flow control
    
    [ Upstream commit 14cdc1f243d79e0b46be150502b7dba9c5a6bdfd ]
    
    Serial interface uart3 on phyFLEX board is capable of 5-wire connection
    including signals RTS and CTS for hardware flow control.
    
    Fix signals UART3_CTS_B and UART3_RTS_B padmux assignments and add
    missing property "uart-has-rtscts" to allow serial interface to be
    configured and used with the hardware flow control.
    
    Signed-off-by: Primoz Fiser <primoz.fiser@norik.com>
    Signed-off-by: Shawn Guo <shawnguo@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/imx6qdl-phytec-pfla02.dtsi b/arch/arm/boot/dts/imx6qdl-phytec-pfla02.dtsi
index 9499d113b139..25462f778994 100644
--- a/arch/arm/boot/dts/imx6qdl-phytec-pfla02.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-phytec-pfla02.dtsi
@@ -306,8 +306,8 @@
 			fsl,pins = <
 				MX6QDL_PAD_EIM_D24__UART3_TX_DATA	0x1b0b1
 				MX6QDL_PAD_EIM_D25__UART3_RX_DATA	0x1b0b1
-				MX6QDL_PAD_EIM_D30__UART3_RTS_B		0x1b0b1
-				MX6QDL_PAD_EIM_D31__UART3_CTS_B		0x1b0b1
+				MX6QDL_PAD_EIM_D31__UART3_RTS_B		0x1b0b1
+				MX6QDL_PAD_EIM_D30__UART3_CTS_B		0x1b0b1
 			>;
 		};
 
@@ -394,6 +394,7 @@
 &uart3 {
 	pinctrl-names = "default";
 	pinctrl-0 = <&pinctrl_uart3>;
+	uart-has-rtscts;
 	status = "disabled";
 };
 

commit bc20256db4d966f786e109c7c47bd1239b68b63c
Author: Rafa? Mi?ecki <rafal@milecki.pl>
Date:   Fri Apr 16 15:37:53 2021 +0200

    ARM: dts: Hurricane 2: Fix NAND nodes names
    
    [ Upstream commit a4528d9029e2eda16e4fc9b9da1de1fbec10ab26 ]
    
    This matches nand-controller.yaml requirements.
    
    Signed-off-by: Rafa? Mi?ecki <rafal@milecki.pl>
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/bcm-hr2.dtsi b/arch/arm/boot/dts/bcm-hr2.dtsi
index dd71ab08136b..30574101471a 100644
--- a/arch/arm/boot/dts/bcm-hr2.dtsi
+++ b/arch/arm/boot/dts/bcm-hr2.dtsi
@@ -179,7 +179,7 @@
 			status = "disabled";
 		};
 
-		nand: nand@26000 {
+		nand_controller: nand-controller@26000 {
 			compatible = "brcm,nand-iproc", "brcm,brcmnand-v6.1";
 			reg = <0x26000 0x600>,
 			      <0x11b408 0x600>,

commit 26f4e3fe1f1a01a6d229580f692bbbeb99a3d300
Author: Rafa? Mi?ecki <rafal@milecki.pl>
Date:   Fri Apr 16 15:37:52 2021 +0200

    ARM: dts: BCM63xx: Fix NAND nodes names
    
    [ Upstream commit 75e2f012f6e34b93124d1d86eaa8f27df48e9ea0 ]
    
    This matches nand-controller.yaml requirements.
    
    Signed-off-by: Rafa? Mi?ecki <rafal@milecki.pl>
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/bcm63138.dtsi b/arch/arm/boot/dts/bcm63138.dtsi
index 6df61518776f..557098f5c8d5 100644
--- a/arch/arm/boot/dts/bcm63138.dtsi
+++ b/arch/arm/boot/dts/bcm63138.dtsi
@@ -175,7 +175,7 @@
 			status = "disabled";
 		};
 
-		nand: nand@2000 {
+		nand_controller: nand-controller@2000 {
 			#address-cells = <1>;
 			#size-cells = <0>;
 			compatible = "brcm,nand-bcm63138", "brcm,brcmnand-v7.0", "brcm,brcmnand";
diff --git a/arch/arm/boot/dts/bcm963138dvt.dts b/arch/arm/boot/dts/bcm963138dvt.dts
index c61673638fa8..5445fccec5a5 100644
--- a/arch/arm/boot/dts/bcm963138dvt.dts
+++ b/arch/arm/boot/dts/bcm963138dvt.dts
@@ -30,10 +30,10 @@
 	status = "okay";
 };
 
-&nand {
+&nand_controller {
 	status = "okay";
 
-	nandcs@0 {
+	nand@0 {
 		compatible = "brcm,nandcs";
 		reg = <0>;
 		nand-ecc-strength = <4>;

commit 9ce201b572a77e2bd3cf22a1f55ff4a437a13a2a
Author: Rafa? Mi?ecki <rafal@milecki.pl>
Date:   Fri Apr 16 15:37:51 2021 +0200

    ARM: NSP: dts: fix NAND nodes names
    
    [ Upstream commit 0484594be733d5cdf976f55a2d4e8d887f351b69 ]
    
    This matches nand-controller.yaml requirements.
    
    Signed-off-by: Rafa? Mi?ecki <rafal@milecki.pl>
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/bcm-nsp.dtsi b/arch/arm/boot/dts/bcm-nsp.dtsi
index b395cb195db2..71918d208fb3 100644
--- a/arch/arm/boot/dts/bcm-nsp.dtsi
+++ b/arch/arm/boot/dts/bcm-nsp.dtsi
@@ -259,7 +259,7 @@
 			dma-coherent;
 		};
 
-		nand: nand@26000 {
+		nand_controller: nand-controller@26000 {
 			compatible = "brcm,nand-iproc", "brcm,brcmnand-v6.1";
 			reg = <0x026000 0x600>,
 			      <0x11b408 0x600>,
diff --git a/arch/arm/boot/dts/bcm958522er.dts b/arch/arm/boot/dts/bcm958522er.dts
index f9dd342cc2ae..56f9181975b1 100644
--- a/arch/arm/boot/dts/bcm958522er.dts
+++ b/arch/arm/boot/dts/bcm958522er.dts
@@ -74,8 +74,8 @@
 	status = "okay";
 };
 
-&nand {
-	nandcs@0 {
+&nand_controller {
+	nand@0 {
 		compatible = "brcm,nandcs";
 		reg = <0>;
 		nand-on-flash-bbt;
diff --git a/arch/arm/boot/dts/bcm958525er.dts b/arch/arm/boot/dts/bcm958525er.dts
index 374508a9cfbf..93a3e23ec7ae 100644
--- a/arch/arm/boot/dts/bcm958525er.dts
+++ b/arch/arm/boot/dts/bcm958525er.dts
@@ -74,8 +74,8 @@
 	status = "okay";
 };
 
-&nand {
-	nandcs@0 {
+&nand_controller {
+	nand@0 {
 		compatible = "brcm,nandcs";
 		reg = <0>;
 		nand-on-flash-bbt;
diff --git a/arch/arm/boot/dts/bcm958525xmc.dts b/arch/arm/boot/dts/bcm958525xmc.dts
index 403250c5ad8e..fad974212d8a 100644
--- a/arch/arm/boot/dts/bcm958525xmc.dts
+++ b/arch/arm/boot/dts/bcm958525xmc.dts
@@ -90,8 +90,8 @@
 	};
 };
 
-&nand {
-	nandcs@0 {
+&nand_controller {
+	nand@0 {
 		compatible = "brcm,nandcs";
 		reg = <0>;
 		nand-on-flash-bbt;
diff --git a/arch/arm/boot/dts/bcm958622hr.dts b/arch/arm/boot/dts/bcm958622hr.dts
index ecd05e26c262..76ff9c50f62c 100644
--- a/arch/arm/boot/dts/bcm958622hr.dts
+++ b/arch/arm/boot/dts/bcm958622hr.dts
@@ -78,8 +78,8 @@
 	status = "okay";
 };
 
-&nand {
-	nandcs@0 {
+&nand_controller {
+	nand@0 {
 		compatible = "brcm,nandcs";
 		reg = <0>;
 		nand-on-flash-bbt;
diff --git a/arch/arm/boot/dts/bcm958623hr.dts b/arch/arm/boot/dts/bcm958623hr.dts
index f5e85b301497..c2c90ea328a1 100644
--- a/arch/arm/boot/dts/bcm958623hr.dts
+++ b/arch/arm/boot/dts/bcm958623hr.dts
@@ -78,8 +78,8 @@
 	status = "okay";
 };
 
-&nand {
-	nandcs@0 {
+&nand_controller {
+	nand@0 {
 		compatible = "brcm,nandcs";
 		reg = <0>;
 		nand-on-flash-bbt;
diff --git a/arch/arm/boot/dts/bcm958625hr.dts b/arch/arm/boot/dts/bcm958625hr.dts
index ea3fc194f8f3..6d0179acab38 100644
--- a/arch/arm/boot/dts/bcm958625hr.dts
+++ b/arch/arm/boot/dts/bcm958625hr.dts
@@ -76,8 +76,8 @@
 	status = "okay";
 };
 
-&nand {
-	nandcs@0 {
+&nand_controller {
+	nand@0 {
 		compatible = "brcm,nandcs";
 		reg = <0>;
 		nand-on-flash-bbt;
diff --git a/arch/arm/boot/dts/bcm958625k.dts b/arch/arm/boot/dts/bcm958625k.dts
index 3ea5f739e90b..579a88ce5b7f 100644
--- a/arch/arm/boot/dts/bcm958625k.dts
+++ b/arch/arm/boot/dts/bcm958625k.dts
@@ -69,8 +69,8 @@
 	status = "okay";
 };
 
-&nand {
-	nandcs@0 {
+&nand_controller {
+	nand@0 {
 		compatible = "brcm,nandcs";
 		reg = <0>;
 		nand-on-flash-bbt;
diff --git a/arch/arm/boot/dts/bcm988312hr.dts b/arch/arm/boot/dts/bcm988312hr.dts
index ea9a0806b446..a03224c54bbb 100644
--- a/arch/arm/boot/dts/bcm988312hr.dts
+++ b/arch/arm/boot/dts/bcm988312hr.dts
@@ -78,8 +78,8 @@
 	status = "okay";
 };
 
-&nand {
-	nandcs@0 {
+&nand_controller {
+	nand@0 {
 		compatible = "brcm,nandcs";
 		reg = <0>;
 		nand-on-flash-bbt;

commit 5ffb8eaf12d66b3b73d521ed0d542d0fe65185e2
Author: Rafa? Mi?ecki <rafal@milecki.pl>
Date:   Fri Apr 16 15:37:50 2021 +0200

    ARM: Cygnus: dts: fix NAND nodes names
    
    [ Upstream commit e256b48a3b07ee1ae4bfa60abbf509ba8e386862 ]
    
    This matches nand-controller.yaml requirements.
    
    Signed-off-by: Rafa? Mi?ecki <rafal@milecki.pl>
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/bcm-cygnus.dtsi b/arch/arm/boot/dts/bcm-cygnus.dtsi
index 887a60c317e9..56f43a9f603d 100644
--- a/arch/arm/boot/dts/bcm-cygnus.dtsi
+++ b/arch/arm/boot/dts/bcm-cygnus.dtsi
@@ -455,7 +455,7 @@
 			status = "disabled";
 		};
 
-		nand: nand@18046000 {
+		nand_controller: nand-controller@18046000 {
 			compatible = "brcm,nand-iproc", "brcm,brcmnand-v6.1";
 			reg = <0x18046000 0x600>, <0xf8105408 0x600>,
 			      <0x18046f00 0x20>;
diff --git a/arch/arm/boot/dts/bcm911360_entphn.dts b/arch/arm/boot/dts/bcm911360_entphn.dts
index 53f990defd6a..423a29a46b77 100644
--- a/arch/arm/boot/dts/bcm911360_entphn.dts
+++ b/arch/arm/boot/dts/bcm911360_entphn.dts
@@ -84,8 +84,8 @@
 	status = "okay";
 };
 
-&nand {
-	nandcs@1 {
+&nand_controller {
+	nand@1 {
 		compatible = "brcm,nandcs";
 		reg = <0>;
 		nand-on-flash-bbt;
diff --git a/arch/arm/boot/dts/bcm958300k.dts b/arch/arm/boot/dts/bcm958300k.dts
index b4a1392bd5a6..dda3e11b711f 100644
--- a/arch/arm/boot/dts/bcm958300k.dts
+++ b/arch/arm/boot/dts/bcm958300k.dts
@@ -60,8 +60,8 @@
 	status = "okay";
 };
 
-&nand {
-	nandcs@1 {
+&nand_controller {
+	nand@1 {
 		compatible = "brcm,nandcs";
 		reg = <0>;
 		nand-on-flash-bbt;
diff --git a/arch/arm/boot/dts/bcm958305k.dts b/arch/arm/boot/dts/bcm958305k.dts
index 3378683321d3..ea3c6b88b313 100644
--- a/arch/arm/boot/dts/bcm958305k.dts
+++ b/arch/arm/boot/dts/bcm958305k.dts
@@ -68,8 +68,8 @@
 	status = "okay";
 };
 
-&nand {
-	nandcs@1 {
+&nand_controller {
+	nand@1 {
 		compatible = "brcm,nandcs";
 		reg = <0>;
 		nand-on-flash-bbt;

commit 5f55b883387ed79af5abead6feddfa4e7b9eba56
Author: Rafa? Mi?ecki <rafal@milecki.pl>
Date:   Fri Apr 16 15:37:49 2021 +0200

    ARM: brcmstb: dts: fix NAND nodes names
    
    [ Upstream commit 9a800ce1aada6e0f56b78e4713f4858c8990c1f7 ]
    
    This matches nand-controller.yaml requirements.
    
    Signed-off-by: Rafa? Mi?ecki <rafal@milecki.pl>
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/bcm7445-bcm97445svmb.dts b/arch/arm/boot/dts/bcm7445-bcm97445svmb.dts
index 8006c69a3fdf..5931c0288283 100644
--- a/arch/arm/boot/dts/bcm7445-bcm97445svmb.dts
+++ b/arch/arm/boot/dts/bcm7445-bcm97445svmb.dts
@@ -14,10 +14,10 @@
 	};
 };
 
-&nand {
+&nand_controller {
 	status = "okay";
 
-	nandcs@1 {
+	nand@1 {
 		compatible = "brcm,nandcs";
 		reg = <1>;
 		nand-ecc-step-size = <512>;
diff --git a/arch/arm/boot/dts/bcm7445.dtsi b/arch/arm/boot/dts/bcm7445.dtsi
index c859aa6f358c..b06845e92acd 100644
--- a/arch/arm/boot/dts/bcm7445.dtsi
+++ b/arch/arm/boot/dts/bcm7445.dtsi
@@ -150,7 +150,7 @@
 			reg-names = "aon-ctrl", "aon-sram";
 		};
 
-		nand: nand@3e2800 {
+		nand_controller: nand-controller@3e2800 {
 			status = "disabled";
 			#address-cells = <1>;
 			#size-cells = <0>;

commit 71718b00056a723df908c62a398a8ded7f820be7
Author: Philipp Zabel <p.zabel@pengutronix.de>
Date:   Thu Mar 4 17:01:39 2021 +0100

    reset: ti-syscon: fix to_ti_syscon_reset_data macro
    
    [ Upstream commit 05cf8fffcdeb47aef1203c08cbec5224fd3a0e1c ]
    
    The to_ti_syscon_reset_data macro currently only works if the
    parameter passed into it is called 'rcdev'.
    
    Fixes a checkpatch --strict issue:
    
      CHECK: Macro argument reuse 'rcdev' - possible side-effects?
      #53: FILE: drivers/reset/reset-ti-syscon.c:53:
      +#define to_ti_syscon_reset_data(rcdev)       \
      +     container_of(rcdev, struct ti_syscon_reset_data, rcdev)
    
    Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/reset/reset-ti-syscon.c b/drivers/reset/reset-ti-syscon.c
index a2635c21db7f..ecb8873e3a19 100644
--- a/drivers/reset/reset-ti-syscon.c
+++ b/drivers/reset/reset-ti-syscon.c
@@ -58,8 +58,8 @@ struct ti_syscon_reset_data {
 	unsigned int nr_controls;
 };
 
-#define to_ti_syscon_reset_data(rcdev)	\
-	container_of(rcdev, struct ti_syscon_reset_data, rcdev)
+#define to_ti_syscon_reset_data(_rcdev)	\
+	container_of(_rcdev, struct ti_syscon_reset_data, rcdev)
 
 /**
  * ti_syscon_reset_assert() - assert device reset

commit 7744c6f4ccad6a2decce1ed4e641e9e9b219382d
Author: Elaine Zhang <zhangqing@rock-chips.com>
Date:   Sat Apr 17 13:29:43 2021 +0200

    arm64: dts: rockchip: Fix power-controller node names for rk3328
    
    [ Upstream commit 6e6a282b49c6db408d27231e3c709fbdf25e3c1b ]
    
    Use more generic names (as recommended in the device tree specification
    or the binding documentation)
    
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    Reviewed-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
    Signed-off-by: Johan Jonker <jbx6244@gmail.com>
    Link: https://lore.kernel.org/r/20210417112952.8516-7-jbx6244@gmail.com
    Signed-off-by: Heiko Stuebner <heiko@sntech.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
index 6be7c67584ba..05fa0dcb4c69 100644
--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
@@ -255,13 +255,13 @@
 			#address-cells = <1>;
 			#size-cells = <0>;
 
-			pd_hevc@RK3328_PD_HEVC {
+			power-domain@RK3328_PD_HEVC {
 				reg = <RK3328_PD_HEVC>;
 			};
-			pd_video@RK3328_PD_VIDEO {
+			power-domain@RK3328_PD_VIDEO {
 				reg = <RK3328_PD_VIDEO>;
 			};
-			pd_vpu@RK3328_PD_VPU {
+			power-domain@RK3328_PD_VPU {
 				reg = <RK3328_PD_VPU>;
 			};
 		};

commit 253a1a530bcffc6d50ccd67831e5acd720260fa1
Author: Elaine Zhang <zhangqing@rock-chips.com>
Date:   Sat Apr 17 13:29:40 2021 +0200

    ARM: dts: rockchip: Fix power-controller node names for rk3288
    
    [ Upstream commit 970cdc53cb1afa73602028c103dbfb6a230080be ]
    
    Use more generic names (as recommended in the device tree specification
    or the binding documentation)
    
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    Reviewed-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
    Signed-off-by: Johan Jonker <jbx6244@gmail.com>
    Link: https://lore.kernel.org/r/20210417112952.8516-4-jbx6244@gmail.com
    Signed-off-by: Heiko Stuebner <heiko@sntech.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi
index c38c853f5f50..2ff81f3736c8 100644
--- a/arch/arm/boot/dts/rk3288.dtsi
+++ b/arch/arm/boot/dts/rk3288.dtsi
@@ -759,7 +759,7 @@
 			 *	*_HDMI		HDMI
 			 *	*_MIPI_*	MIPI
 			 */
-			pd_vio@RK3288_PD_VIO {
+			power-domain@RK3288_PD_VIO {
 				reg = <RK3288_PD_VIO>;
 				clocks = <&cru ACLK_IEP>,
 					 <&cru ACLK_ISP>,
@@ -801,7 +801,7 @@
 			 * Note: The following 3 are HEVC(H.265) clocks,
 			 * and on the ACLK_HEVC_NIU (NOC).
 			 */
-			pd_hevc@RK3288_PD_HEVC {
+			power-domain@RK3288_PD_HEVC {
 				reg = <RK3288_PD_HEVC>;
 				clocks = <&cru ACLK_HEVC>,
 					 <&cru SCLK_HEVC_CABAC>,
@@ -815,7 +815,7 @@
 			 * (video endecoder & decoder) clocks that on the
 			 * ACLK_VCODEC_NIU and HCLK_VCODEC_NIU (NOC).
 			 */
-			pd_video@RK3288_PD_VIDEO {
+			power-domain@RK3288_PD_VIDEO {
 				reg = <RK3288_PD_VIDEO>;
 				clocks = <&cru ACLK_VCODEC>,
 					 <&cru HCLK_VCODEC>;
@@ -826,7 +826,7 @@
 			 * Note: ACLK_GPU is the GPU clock,
 			 * and on the ACLK_GPU_NIU (NOC).
 			 */
-			pd_gpu@RK3288_PD_GPU {
+			power-domain@RK3288_PD_GPU {
 				reg = <RK3288_PD_GPU>;
 				clocks = <&cru ACLK_GPU>;
 				pm_qos = <&qos_gpu_r>,

commit e27c7121a8a4efaa8542d3074197d1baa45bca75
Author: Benjamin Gaignard <benjamin.gaignard@collabora.com>
Date:   Fri May 7 11:02:29 2021 +0200

    ARM: dts: rockchip: Fix IOMMU nodes properties on rk322x
    
    [ Upstream commit 6b023929666f0be5df75f5e0278d1b70effadf42 ]
    
    Add '#" to iommu-cells properties.
    Remove useless interrupt-names properties
    
    Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>
    Link: https://lore.kernel.org/r/20210507090232.233049-4-benjamin.gaignard@collabora.com
    Signed-off-by: Heiko Stuebner <heiko@sntech.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/rk322x.dtsi b/arch/arm/boot/dts/rk322x.dtsi
index 2aa74267ae51..3fe874cab38c 100644
--- a/arch/arm/boot/dts/rk322x.dtsi
+++ b/arch/arm/boot/dts/rk322x.dtsi
@@ -548,10 +548,9 @@
 		compatible = "rockchip,iommu";
 		reg = <0x20020800 0x100>;
 		interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>;
-		interrupt-names = "vpu_mmu";
 		clocks = <&cru ACLK_VPU>, <&cru HCLK_VPU>;
 		clock-names = "aclk", "iface";
-		iommu-cells = <0>;
+		#iommu-cells = <0>;
 		status = "disabled";
 	};
 
@@ -559,10 +558,9 @@
 		compatible = "rockchip,iommu";
 		reg = <0x20030480 0x40>, <0x200304c0 0x40>;
 		interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
-		interrupt-names = "vdec_mmu";
 		clocks = <&cru ACLK_RKVDEC>, <&cru HCLK_RKVDEC>;
 		clock-names = "aclk", "iface";
-		iommu-cells = <0>;
+		#iommu-cells = <0>;
 		status = "disabled";
 	};
 
@@ -570,7 +568,6 @@
 		compatible = "rockchip,iommu";
 		reg = <0x20053f00 0x100>;
 		interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
-		interrupt-names = "vop_mmu";
 		clocks = <&cru ACLK_VOP>, <&cru HCLK_VOP>;
 		clock-names = "aclk", "iface";
 		iommu-cells = <0>;
@@ -581,10 +578,9 @@
 		compatible = "rockchip,iommu";
 		reg = <0x20070800 0x100>;
 		interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
-		interrupt-names = "iep_mmu";
 		clocks = <&cru ACLK_IEP>, <&cru HCLK_IEP>;
 		clock-names = "aclk", "iface";
-		iommu-cells = <0>;
+		#iommu-cells = <0>;
 		status = "disabled";
 	};
 

commit bd1265cd668d5607281c7bc22ab96544a2d7a98e
Author: Ezequiel Garcia <ezequiel@collabora.com>
Date:   Thu May 6 08:11:35 2021 -0300

    ARM: dts: rockchip: Fix the timer clocks order
    
    [ Upstream commit 7b46d674ac000b101fdad92cf16cc11d90b72f86 ]
    
    Fixed order is the device-tree convention.
    The timer driver currently gets clocks by name,
    so no changes are needed there.
    
    Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
    Link: https://lore.kernel.org/r/20210506111136.3941-3-ezequiel@collabora.com
    Signed-off-by: Heiko Stuebner <heiko@sntech.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/rk3188.dtsi b/arch/arm/boot/dts/rk3188.dtsi
index aa123f93f181..3b7cae6f4127 100644
--- a/arch/arm/boot/dts/rk3188.dtsi
+++ b/arch/arm/boot/dts/rk3188.dtsi
@@ -73,16 +73,16 @@
 		compatible = "rockchip,rk3188-timer", "rockchip,rk3288-timer";
 		reg = <0x2000e000 0x20>;
 		interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
-		clocks = <&cru SCLK_TIMER3>, <&cru PCLK_TIMER3>;
-		clock-names = "timer", "pclk";
+		clocks = <&cru PCLK_TIMER3>, <&cru SCLK_TIMER3>;
+		clock-names = "pclk", "timer";
 	};
 
 	timer6: timer@200380a0 {
 		compatible = "rockchip,rk3188-timer", "rockchip,rk3288-timer";
 		reg = <0x200380a0 0x20>;
 		interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>;
-		clocks = <&cru SCLK_TIMER6>, <&cru PCLK_TIMER0>;
-		clock-names = "timer", "pclk";
+		clocks = <&cru PCLK_TIMER0>, <&cru SCLK_TIMER6>;
+		clock-names = "pclk", "timer";
 	};
 
 	i2s0: i2s@1011a000 {
diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi
index 545f991924fe..c38c853f5f50 100644
--- a/arch/arm/boot/dts/rk3288.dtsi
+++ b/arch/arm/boot/dts/rk3288.dtsi
@@ -234,8 +234,8 @@
 		compatible = "rockchip,rk3288-timer";
 		reg = <0x0 0xff810000 0x0 0x20>;
 		interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
-		clocks = <&xin24m>, <&cru PCLK_TIMER>;
-		clock-names = "timer", "pclk";
+		clocks = <&cru PCLK_TIMER>, <&xin24m>;
+		clock-names = "pclk", "timer";
 	};
 
 	display-subsystem {

commit 33e50273047e0af7a43e6a09c331969c709ade3d
Author: Johan Jonker <jbx6244@gmail.com>
Date:   Tue Jan 26 12:02:21 2021 +0100

    arm64: dts: rockchip: fix pinctrl sleep nodename for rk3399.dtsi
    
    [ Upstream commit a7ecfad495f8af63a5cb332c91f60ab2018897f5 ]
    
    A test with the command below aimed at powerpc generates
    notifications in the Rockchip arm64 tree.
    
    Fix pinctrl "sleep" nodename by renaming it to "suspend"
    for rk3399.dtsi
    
    make ARCH=arm64 dtbs_check
    DT_SCHEMA_FILES=Documentation/devicetree/bindings/powerpc/sleep.yaml
    
    Signed-off-by: Johan Jonker <jbx6244@gmail.com>
    Link: https://lore.kernel.org/r/20210126110221.10815-2-jbx6244@gmail.com
    Signed-off-by: Heiko Stuebner <heiko@sntech.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi
index b1c1a88a1c20..f70c05332686 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi
@@ -2253,7 +2253,7 @@
 			};
 		};
 
-		sleep {
+		suspend {
 			ap_pwroff: ap-pwroff {
 				rockchip,pins = <1 5 RK_FUNC_1 &pcfg_pull_none>;
 			};

commit 7dd0efa5acfe460b89d2c08d88b6e29b88bd3fb3
Author: Johan Jonker <jbx6244@gmail.com>
Date:   Tue Jan 26 12:02:20 2021 +0100

    ARM: dts: rockchip: fix pinctrl sleep nodename for rk3036-kylin and rk3288
    
    [ Upstream commit dfbfb86a43f9a5bbd166d88bca9e07ee4e1bff31 ]
    
    A test with the command below aimed at powerpc generates
    notifications in the Rockchip ARM tree.
    
    Fix pinctrl "sleep" nodename by renaming it to "suspend"
    for rk3036-kylin and rk3288
    
    make ARCH=arm dtbs_check
    DT_SCHEMA_FILES=Documentation/devicetree/bindings/powerpc/sleep.yaml
    
    Signed-off-by: Johan Jonker <jbx6244@gmail.com>
    Link: https://lore.kernel.org/r/20210126110221.10815-1-jbx6244@gmail.com
    Signed-off-by: Heiko Stuebner <heiko@sntech.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/rk3036-kylin.dts b/arch/arm/boot/dts/rk3036-kylin.dts
index 0fd19f9723df..cd109aebb783 100644
--- a/arch/arm/boot/dts/rk3036-kylin.dts
+++ b/arch/arm/boot/dts/rk3036-kylin.dts
@@ -391,7 +391,7 @@
 		};
 	};
 
-	sleep {
+	suspend {
 		global_pwroff: global-pwroff {
 			rockchip,pins = <2 7 RK_FUNC_1 &pcfg_pull_none>;
 		};
diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi
index 440d6783faca..545f991924fe 100644
--- a/arch/arm/boot/dts/rk3288.dtsi
+++ b/arch/arm/boot/dts/rk3288.dtsi
@@ -1541,7 +1541,7 @@
 			drive-strength = <12>;
 		};
 
-		sleep {
+		suspend {
 			global_pwroff: global-pwroff {
 				rockchip,pins = <0 0 RK_FUNC_1 &pcfg_pull_none>;
 			};

commit 3b3e20d3dbd4936f65c8f3d8f529e2038386a951
Author: Corentin Labbe <clabbe@baylibre.com>
Date:   Mon May 3 18:52:28 2021 +0000

    ARM: dts: gemini: add device_type on pci
    
    [ Upstream commit 483f3645b3f7acfd1c78a19d51b80c0656161974 ]
    
    Fixes DT warning on pci node by adding the missing device_type.
    
    Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/gemini.dtsi b/arch/arm/boot/dts/gemini.dtsi
index eb752e9495de..4949951e3597 100644
--- a/arch/arm/boot/dts/gemini.dtsi
+++ b/arch/arm/boot/dts/gemini.dtsi
@@ -286,6 +286,7 @@
 			clock-names = "PCLK", "PCICLK";
 			pinctrl-names = "default";
 			pinctrl-0 = <&pci_default_pins>;
+			device_type = "pci";
 			#address-cells = <3>;
 			#size-cells = <2>;
 			#interrupt-cells = <1>;

commit eff1bed24329d660e87e1c9d9de11b635dfae97c
Author: Corentin Labbe <clabbe@baylibre.com>
Date:   Wed Apr 28 17:48:30 2021 +0000

    ARM: dts: gemini: rename mdio to the right name
    
    [ Upstream commit fc5b59b945b546e27977e99a5ca6fe61179ff0d2 ]
    
    ethernet-phy is not the right name for mdio, fix it.
    
    Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/gemini-dlink-dns-313.dts b/arch/arm/boot/dts/gemini-dlink-dns-313.dts
index 361dccd6c7ee..431c705a7b90 100644
--- a/arch/arm/boot/dts/gemini-dlink-dns-313.dts
+++ b/arch/arm/boot/dts/gemini-dlink-dns-313.dts
@@ -140,7 +140,7 @@
 		};
 	};
 
-	mdio0: ethernet-phy {
+	mdio0: mdio {
 		compatible = "virtual,mdio-gpio";
 		/* Uses MDC and MDIO */
 		gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>, /* MDC */
diff --git a/arch/arm/boot/dts/gemini-nas4220b.dts b/arch/arm/boot/dts/gemini-nas4220b.dts
index 963ea890c87f..1c5f7f9e7be3 100644
--- a/arch/arm/boot/dts/gemini-nas4220b.dts
+++ b/arch/arm/boot/dts/gemini-nas4220b.dts
@@ -62,7 +62,7 @@
 		};
 	};
 
-	mdio0: ethernet-phy {
+	mdio0: mdio {
 		compatible = "virtual,mdio-gpio";
 		gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>, /* MDC */
 			<&gpio0 21 GPIO_ACTIVE_HIGH>; /* MDIO */
diff --git a/arch/arm/boot/dts/gemini-rut1xx.dts b/arch/arm/boot/dts/gemini-rut1xx.dts
index eb4f0bf074da..c067c3778f1d 100644
--- a/arch/arm/boot/dts/gemini-rut1xx.dts
+++ b/arch/arm/boot/dts/gemini-rut1xx.dts
@@ -56,7 +56,7 @@
 		};
 	};
 
-	mdio0: ethernet-phy {
+	mdio0: mdio {
 		compatible = "virtual,mdio-gpio";
 		gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>, /* MDC */
 			<&gpio0 21 GPIO_ACTIVE_HIGH>; /* MDIO */
diff --git a/arch/arm/boot/dts/gemini-wbd111.dts b/arch/arm/boot/dts/gemini-wbd111.dts
index 29af86cd10f7..52c10ec0dc72 100644
--- a/arch/arm/boot/dts/gemini-wbd111.dts
+++ b/arch/arm/boot/dts/gemini-wbd111.dts
@@ -68,7 +68,7 @@
 		};
 	};
 
-	mdio0: ethernet-phy {
+	mdio0: mdio {
 		compatible = "virtual,mdio-gpio";
 		gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>, /* MDC */
 			<&gpio0 21 GPIO_ACTIVE_HIGH>; /* MDIO */
diff --git a/arch/arm/boot/dts/gemini-wbd222.dts b/arch/arm/boot/dts/gemini-wbd222.dts
index 24e6ae3616f7..73de5cfa01f8 100644
--- a/arch/arm/boot/dts/gemini-wbd222.dts
+++ b/arch/arm/boot/dts/gemini-wbd222.dts
@@ -67,7 +67,7 @@
 		};
 	};
 
-	mdio0: ethernet-phy {
+	mdio0: mdio {
 		compatible = "virtual,mdio-gpio";
 		gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>, /* MDC */
 			<&gpio0 21 GPIO_ACTIVE_HIGH>; /* MDIO */

commit 7751fcdc185fc49740597807b2f820861fca34c2
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Fri Jul 23 10:21:50 2021 +0800

    drm/rockchip: vop: Deal with display area out of display mode
    
    Some linux display framework will set display area out of display mode,
    this is incorrect config and will lead vop iommu pagefault, we add this
    commit to avoid vop pagefault and output error info.
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: I50f9c93d807858b8939038aae9915b4895fe35e2

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index 6b84508a5339..a0d0cd4c1c1b 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -1767,10 +1767,11 @@ static void vop_plane_atomic_update(struct drm_plane *plane,
 	struct drm_display_mode *mode = NULL;
 	struct vop_win *win = to_vop_win(plane);
 	struct vop_plane_state *vop_plane_state = to_vop_plane_state(state);
+	struct drm_display_mode *adjusted_mode = &crtc->state->adjusted_mode;
 	struct rockchip_crtc_state *s;
 	struct vop *vop = to_vop(state->crtc);
 	struct drm_framebuffer *fb = state->fb;
-	unsigned int actual_w, actual_h;
+	unsigned int actual_w, actual_h, dsp_w, dsp_h;
 	unsigned int dsp_stx, dsp_sty;
 	uint32_t act_info, dsp_info, dsp_st;
 	struct drm_rect *src = &vop_plane_state->src;
@@ -1823,10 +1824,30 @@ static void vop_plane_atomic_update(struct drm_plane *plane,
 	mode = &crtc->state->adjusted_mode;
 	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) {
+		DRM_ERROR("%s win%d dest->x1[%d] + dsp_w[%d] exceed mode hdisplay[%d]\n",
+			  crtc->name, win->win_id, dest->x1, dsp_w, adjusted_mode->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) {
+		DRM_ERROR("%s win%d dest->y1[%d] + dsp_h[%d] exceed mode vdisplay[%d]\n",
+			  crtc->name, win->win_id, dest->y1, dsp_h, adjusted_mode->vdisplay);
+		dsp_h = adjusted_mode->vdisplay - dest->y1;
+		if (dsp_h < 4)
+			dsp_h = 4;
+		actual_h = dsp_h * actual_h / drm_rect_height(dest);
+	}
+
 	act_info = (actual_h - 1) << 16 | ((actual_w - 1) & 0xffff);
 
-	dsp_info = (drm_rect_height(dest) - 1) << 16;
-	dsp_info |= (drm_rect_width(dest) - 1) & 0xffff;
+	dsp_info = (dsp_h - 1) << 16;
+	dsp_info |= (dsp_w - 1) & 0xffff;
 
 	dsp_stx = dest->x1 + mode->crtc_htotal - mode->crtc_hsync_start;
 	dsp_sty = dest->y1 + mode->crtc_vtotal - mode->crtc_vsync_start;

commit 3e74187d7385f373566636e011ed4b2ee0fc7dc0
Author: William Wu <william.wu@rock-chips.com>
Date:   Thu Jul 22 21:15:24 2021 +0800

    phy: rockchip: inno-usb2: support usb wakeup for rk3568
    
    RK3568 usb phy0 and phy1 linestate irq can be set as
    wakeup source, but the default linestate filter time
    is based on the usb phy grf pclk 100MHz. So it needs
    to reconfigure the linestate filter time base on 32KHz
    clk when enter deep sleep.
    
    In addition, it needs to enable the host port (usb3
    host1 and usb2 host1) wakeup irq because of legacy
    reason.
    
    Signed-off-by: William Wu <william.wu@rock-chips.com>
    Change-Id: I9151d49721e8e9d917fdb51228f3ca2627090156

diff --git a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
index 26e8346fe38d..bbdcf3f58e63 100644
--- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
+++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
@@ -196,6 +196,7 @@ struct rockchip_usb2phy_port_cfg {
  * @phy_tuning: phy default parameters tunning.
  * @vbus_detect: vbus voltage level detection function.
  * @clkout_ctl: keep on/turn off output clk of phy.
+ * @ls_filter_con: set linestate filter time.
  * @chg_det: charger detection registers.
  */
 struct rockchip_usb2phy_cfg {
@@ -204,6 +205,7 @@ struct rockchip_usb2phy_cfg {
 	int (*phy_tuning)(struct rockchip_usb2phy *);
 	int (*vbus_detect)(struct rockchip_usb2phy *rphy, bool en);
 	struct usb2phy_reg	clkout_ctl;
+	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;
 };
@@ -2273,6 +2275,9 @@ static int rk3568_usb2phy_tuning(struct rockchip_usb2phy *rphy)
 		ret |= regmap_write(rphy->grf, 0x004c, FILTER_COUNTER);
 	}
 
+	/* Enable host port (usb3 host1 and usb2 host1) wakeup irq */
+	ret |= regmap_write(rphy->grf, 0x000c, 0x80008000);
+
 	return ret;
 }
 
@@ -2297,6 +2302,7 @@ static int rk3568_vbus_detect_control(struct rockchip_usb2phy *rphy, bool en)
 static int rockchip_usb2phy_pm_suspend(struct device *dev)
 {
 	struct rockchip_usb2phy *rphy = dev_get_drvdata(dev);
+	const struct rockchip_usb2phy_cfg *phy_cfg = rphy->phy_cfg;
 	struct rockchip_usb2phy_port *rport;
 	unsigned int index;
 	int ret = 0;
@@ -2305,7 +2311,18 @@ static int rockchip_usb2phy_pm_suspend(struct device *dev)
 	if (device_may_wakeup(rphy->dev))
 		wakeup_enable = true;
 
-	for (index = 0; index < rphy->phy_cfg->num_ports; index++) {
+	/*
+	 * Set the linestate filter time to 1ms based
+	 * on the usb2 phy grf pclk 32KHz on suspend.
+	 */
+	if (phy_cfg->ls_filter_con.enable) {
+		ret = regmap_write(rphy->grf, phy_cfg->ls_filter_con.offset,
+				   phy_cfg->ls_filter_con.enable);
+		if (ret)
+			dev_err(rphy->dev, "failed to set ls filter %d\n", ret);
+	}
+
+	for (index = 0; index < phy_cfg->num_ports; index++) {
 		rport = &rphy->ports[index];
 		if (!rport->phy)
 			continue;
@@ -2345,12 +2362,16 @@ static int rockchip_usb2phy_pm_suspend(struct device *dev)
 		rockchip_usb2phy_low_power_enable(rphy, rport, true);
 	}
 
+	if (wakeup_enable && rphy->irq > 0)
+		enable_irq_wake(rphy->irq);
+
 	return ret;
 }
 
 static int rockchip_usb2phy_pm_resume(struct device *dev)
 {
 	struct rockchip_usb2phy *rphy = dev_get_drvdata(dev);
+	const struct rockchip_usb2phy_cfg *phy_cfg = rphy->phy_cfg;
 	struct rockchip_usb2phy_port *rport;
 	unsigned int index;
 	bool iddig;
@@ -2360,10 +2381,17 @@ static int rockchip_usb2phy_pm_resume(struct device *dev)
 	if (device_may_wakeup(rphy->dev))
 		wakeup_enable = true;
 
-	if (rphy->phy_cfg->phy_tuning)
-		ret = rphy->phy_cfg->phy_tuning(rphy);
+	if (phy_cfg->phy_tuning)
+		ret = phy_cfg->phy_tuning(rphy);
 
-	for (index = 0; index < rphy->phy_cfg->num_ports; index++) {
+	if (phy_cfg->ls_filter_con.disable) {
+		ret = regmap_write(rphy->grf, phy_cfg->ls_filter_con.offset,
+				   phy_cfg->ls_filter_con.disable);
+		if (ret)
+			dev_err(rphy->dev, "failed to set ls filter %d\n", ret);
+	}
+
+	for (index = 0; index < phy_cfg->num_ports; index++) {
 		rport = &rphy->ports[index];
 		if (!rport->phy)
 			continue;
@@ -2409,6 +2437,9 @@ static int rockchip_usb2phy_pm_resume(struct device *dev)
 		rockchip_usb2phy_low_power_enable(rphy, rport, false);
 	}
 
+	if (wakeup_enable && rphy->irq > 0)
+		disable_irq_wake(rphy->irq);
+
 	return ret;
 }
 
@@ -2893,6 +2924,7 @@ static const struct rockchip_usb2phy_cfg rk3568_phy_cfgs[] = {
 		.phy_tuning	= rk3568_usb2phy_tuning,
 		.vbus_detect	= rk3568_vbus_detect_control,
 		.clkout_ctl	= { 0x0008, 4, 4, 1, 0 },
+		.ls_filter_con	= { 0x0040, 19, 0, 0x30100, 0x00020 },
 		.port_cfgs	= {
 			[USB2PHY_PORT_OTG] = {
 				.phy_sus	= { 0x0000, 8, 0, 0, 0x1d1 },
@@ -2946,6 +2978,7 @@ static const struct rockchip_usb2phy_cfg rk3568_phy_cfgs[] = {
 		.num_ports	= 2,
 		.phy_tuning	= rk3568_usb2phy_tuning,
 		.clkout_ctl	= { 0x0008, 4, 4, 1, 0 },
+		.ls_filter_con	= { 0x0040, 19, 0, 0x30100, 0x00020 },
 		.port_cfgs	= {
 			[USB2PHY_PORT_OTG] = {
 				.phy_sus	= { 0x0000, 8, 0, 0x1d2, 0x1d1 },

commit d83146c2162b2c4d5ad6e01f8d40b496f61c4979
Author: Guochun Huang <hero.huang@rock-chips.com>
Date:   Thu Jul 22 11:29:28 2021 +0800

    drm/rockchip/rk628: combtxphy: reducing DUAL LVDS power consumption
    
    Signed-off-by: Guochun Huang <hero.huang@rock-chips.com>
    Change-Id: I831dc7879f8f4656e9db63c629c37cc5709d3e35

diff --git a/drivers/gpu/drm/rockchip/rk628/rk628_combtxphy.c b/drivers/gpu/drm/rockchip/rk628/rk628_combtxphy.c
index 42131f0455f2..efcbda8219c3 100644
--- a/drivers/gpu/drm/rockchip/rk628/rk628_combtxphy.c
+++ b/drivers/gpu/drm/rockchip/rk628/rk628_combtxphy.c
@@ -59,6 +59,10 @@
 #define SW_TX_CTL_CON5(x)	UPDATE(x, 10, 10)
 #define SW_TX_CTL_CON4_MASK	GENMASK(9, 8)
 #define SW_TX_CTL_CON4(x)	UPDATE(x, 9, 8)
+#define BYPASS_095V_LDO_MASK	BIT(3)
+#define BYPASS_095V_LDO(x)	UPDATE(x, 3, 3)
+#define TX_COM_VOLT_ADJ_MASK	GENMASK(2, 0)
+#define TX_COM_VOLT_ADJ(x)	UPDATE(x, 2, 0)
 #define COMBTXPHY_CON8		REG(0x0020)
 #define COMBTXPHY_CON9		REG(0x0024)
 #define SW_DSI_FSET_EN_MASK	BIT(29)
@@ -143,8 +147,13 @@ static int rk628_combtxphy_lvds_power_on(struct rk628_combtxphy *combtxphy)
 	u32 val;
 	int ret;
 
+	/* Adjust terminal resistance 133 ohm, bypass 0.95v ldo for driver. */
 	regmap_update_bits(combtxphy->regmap, COMBTXPHY_CON7,
-			   SW_TX_MODE_MASK, SW_TX_MODE(3));
+			   SW_TX_RTERM_MASK | SW_TX_MODE_MASK |
+			   BYPASS_095V_LDO_MASK | TX_COM_VOLT_ADJ_MASK,
+			   SW_TX_RTERM(6) | SW_TX_MODE(3) |
+			   BYPASS_095V_LDO(1) | TX_COM_VOLT_ADJ(0));
+
 	regmap_write(combtxphy->regmap, COMBTXPHY_CON10,
 		     TX7_CKDRV_EN | TX2_CKDRV_EN);
 	regmap_update_bits(combtxphy->regmap, COMBTXPHY_CON0,

commit 2e7a96b5d0687f972120cca67b979a70328026d4
Author: Xu Hongfei <xuhf@rock-chips.com>
Date:   Tue Jul 20 19:29:37 2021 +0800

    media: rockchip: ispp: fix bug that ispp register isn't included in SEI
    
    Signed-off-by: Xu Hongfei <xuhf@rock-chips.com>
    Change-Id: Icfc0e722c2ea4734c863b0ea478df312ddbb826f

diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c
index 7922eea70ef9..451d268b9f8e 100644
--- a/drivers/media/platform/rockchip/ispp/stream.c
+++ b/drivers/media/platform/rockchip/ispp/stream.c
@@ -2426,7 +2426,7 @@ static void fec_work_event(struct rkispp_device *dev,
 				complete(&monitor->fec.cmpl);
 		}
 
-		if (stream->is_reg_withstream)
+		if (rkispp_is_reg_withstream_global())
 			rkispp_find_regbuf_by_id(dev, &reg_buf, dev->dev_id, seq);
 		if (reg_buf && (rkispp_debug_reg & ISPP_MODULE_FEC)) {
 			u32 offset, size;
@@ -2661,7 +2661,7 @@ static void nr_work_event(struct rkispp_device *dev,
 				complete(&monitor->nr.cmpl);
 		}
 
-		if (stream->is_reg_withstream)
+		if (rkispp_is_reg_withstream_global())
 			rkispp_find_regbuf_by_id(dev, &reg_buf, dev->dev_id, seq);
 		if (reg_buf && (rkispp_debug_reg & ISPP_MODULE_NR)) {
 			u32 offset, size;
@@ -2959,7 +2959,7 @@ static void tnr_work_event(struct rkispp_device *dev,
 				complete(&monitor->tnr.cmpl);
 		}
 
-		if (stream->is_reg_withstream)
+		if (rkispp_is_reg_withstream_global())
 			rkispp_find_regbuf_by_id(dev, &reg_buf, dev->dev_id, seq);
 		if (reg_buf && (rkispp_debug_reg & ISPP_MODULE_TNR)) {
 			u32 offset, size;

commit 4dd2e70089dfc8e89429466227782c9f33eaee36
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Thu Jul 22 16:39:25 2021 +0800

    mmc: sdhci-of-dwcmshc: Adjust DLL_TXCLK_TAPNUM_DEFAULT to 0x10
    
    This value is better to be 0x10 instead of 0x16 by new test report
    to keep all RK356x work consistently.
    
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: I87a22f6e02a6206981fe484db353613ac9a3ede6

diff --git a/drivers/mmc/host/sdhci-of-dwcmshc.c b/drivers/mmc/host/sdhci-of-dwcmshc.c
index dd45dcecdac6..aa18b6605ba2 100644
--- a/drivers/mmc/host/sdhci-of-dwcmshc.c
+++ b/drivers/mmc/host/sdhci-of-dwcmshc.c
@@ -41,7 +41,7 @@
 #define DWCMSHC_EMMC_DLL_START_POINT	16
 #define DWCMSHC_EMMC_DLL_INC		8
 #define DWCMSHC_EMMC_DLL_DLYENA		BIT(27)
-#define DLL_TXCLK_TAPNUM_DEFAULT	0x16
+#define DLL_TXCLK_TAPNUM_DEFAULT	0x10
 #define DLL_STRBIN_TAPNUM_DEFAULT	0x8
 #define DLL_TXCLK_TAPNUM_FROM_SW	BIT(24)
 #define DLL_STRBIN_TAPNUM_FROM_SW	BIT(24)

commit cc56c4b78f79949517787d85a663038fc1d6ef20
Author: Yu Qiaowei <cerf.yu@rock-chips.com>
Date:   Fri Jul 23 09:53:16 2021 +0800

    video/rockchip: rga2: Fix MMU base not shift forward.
    
    Since the MMU base is not shifted forward, when the sync/async mode
    is called together, the same memory is used to store the page table,
    resulting in data errors.
    
    Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
    Change-Id: If4807da8159e98a8d807cc24b4d6533793eeefa8

diff --git a/drivers/video/rockchip/rga2/rga2_mmu_info.c b/drivers/video/rockchip/rga2/rga2_mmu_info.c
index e58ad53c0042..a9ab495a63a5 100644
--- a/drivers/video/rockchip/rga2/rga2_mmu_info.c
+++ b/drivers/video/rockchip/rga2/rga2_mmu_info.c
@@ -731,14 +731,18 @@ static int rga2_mmu_info_BitBlt_mode(struct rga2_reg *reg, struct rga2_req *req)
 		status = RGA2_MALLOC_ERROR;
 		goto out;
 	}
+
 	pages = rga2_mmu_buf.pages;
+	if(pages == NULL) {
+		pr_err("RGA MMU malloc pages mem failed\n");
+		return -EINVAL;
+	}
+
 	mutex_lock(&rga2_service.lock);
-        MMU_Base = rga2_mmu_buf.buf_virtual +
-				(rga2_mmu_buf.front & (rga2_mmu_buf.size - 1));
-        MMU_Base_phys = rga2_mmu_buf.buf +
-				(rga2_mmu_buf.front & (rga2_mmu_buf.size - 1));
+	MMU_Base = rga2_mmu_buf.buf_virtual + rga2_mmu_buf.front;
+	MMU_Base_phys = rga2_mmu_buf.buf + rga2_mmu_buf.front;
+	mutex_unlock(&rga2_service.lock);
 
-        mutex_unlock(&rga2_service.lock);
         if (Src0MemSize) {
 		if (req->sg_src0) {
 			ret = rga2_MapION(req->sg_src0,
@@ -947,8 +951,8 @@ static int rga2_mmu_info_color_palette_mode(struct rga2_reg *reg, struct rga2_re
         }
 
         mutex_lock(&rga2_service.lock);
-        MMU_Base = rga2_mmu_buf.buf_virtual + (rga2_mmu_buf.front & (rga2_mmu_buf.size - 1));
-        MMU_Base_phys = rga2_mmu_buf.buf + (rga2_mmu_buf.front & (rga2_mmu_buf.size - 1));
+        MMU_Base = rga2_mmu_buf.buf_virtual + rga2_mmu_buf.front;
+        MMU_Base_phys = rga2_mmu_buf.buf + rga2_mmu_buf.front;
         mutex_unlock(&rga2_service.lock);
 
         if(SrcMemSize) {
@@ -1039,6 +1043,7 @@ static int rga2_mmu_info_color_fill_mode(struct rga2_reg *reg, struct rga2_req *
 
     DstMemSize = 0;
     DstPageCount = 0;
+    DstStart = 0;
     MMU_Base = NULL;
 
     do {
@@ -1054,17 +1059,21 @@ static int rga2_mmu_info_color_fill_mode(struct rga2_reg *reg, struct rga2_req *
         DstMemSize = (DstPageCount + 15) & (~15);
 	AllSize = DstMemSize;
 
-        pages = rga2_mmu_buf.pages;
-
         if(rga2_mmu_buf_get_try(&rga2_mmu_buf, AllSize)) {
            pr_err("RGA2 Get MMU mem failed\n");
            status = RGA2_MALLOC_ERROR;
            break;
         }
 
+        pages = rga2_mmu_buf.pages;
+        if(pages == NULL) {
+            pr_err("RGA MMU malloc pages mem failed\n");
+            return -EINVAL;
+        }
+
         mutex_lock(&rga2_service.lock);
-        MMU_Base_phys = rga2_mmu_buf.buf + (rga2_mmu_buf.front & (rga2_mmu_buf.size - 1));
-        MMU_Base = rga2_mmu_buf.buf_virtual + (rga2_mmu_buf.front & (rga2_mmu_buf.size - 1));
+        MMU_Base_phys = rga2_mmu_buf.buf + rga2_mmu_buf.front;
+        MMU_Base = rga2_mmu_buf.buf_virtual + rga2_mmu_buf.front;
         mutex_unlock(&rga2_service.lock);
 
         if (DstMemSize) {
@@ -1156,8 +1165,8 @@ static int rga2_mmu_info_update_palette_table_mode(struct rga2_reg *reg, struct
         }
 
         mutex_lock(&rga2_service.lock);
-        MMU_Base = rga2_mmu_buf.buf_virtual + (rga2_mmu_buf.front & (rga2_mmu_buf.size - 1));
-        MMU_Base_phys = rga2_mmu_buf.buf + (rga2_mmu_buf.front & (rga2_mmu_buf.size - 1));
+        MMU_Base = rga2_mmu_buf.buf_virtual + rga2_mmu_buf.front;
+        MMU_Base_phys = rga2_mmu_buf.buf + rga2_mmu_buf.front;
         mutex_unlock(&rga2_service.lock);
 
         if (LutMemSize) {

commit 557096465c77e096d19815c3d56495c55063deac
Author: Yu Qiaowei <cerf.yu@rock-chips.com>
Date:   Wed Jul 21 19:20:19 2021 +0800

    video/rockchip: rga2: adapt to kernel 5.10
    
    Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
    Change-Id: Id7854aaa8bf39c272d9e29f721e38d49d2222727

diff --git a/drivers/video/rockchip/rga2/rga2_mmu_info.c b/drivers/video/rockchip/rga2/rga2_mmu_info.c
index 24c777f521c1..e58ad53c0042 100644
--- a/drivers/video/rockchip/rga2/rga2_mmu_info.c
+++ b/drivers/video/rockchip/rga2/rga2_mmu_info.c
@@ -424,12 +424,21 @@ static int rga2_MapUserMemory(struct page **pages, uint32_t *pageTable,
 	spinlock_t * ptl;
 	pte_t * pte;
 	pgd_t * pgd;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)
+	p4d_t * p4d;
+#endif
 	pud_t * pud;
 	pmd_t * pmd;
 
 	status = 0;
 	Address = 0;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)
+	mmap_read_lock(current->mm);
+#else
 	down_read(&current->mm->mmap_sem);
+#endif
+
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 168) && LINUX_VERSION_CODE < KERNEL_VERSION(4, 5, 0)
 	result = get_user_pages(current, current->mm, Memory << PAGE_SHIFT,
 				pageCount, writeFlag ? FOLL_WRITE : 0,
@@ -437,11 +446,15 @@ static int rga2_MapUserMemory(struct page **pages, uint32_t *pageTable,
 #elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0)
 	result = get_user_pages(current, current->mm, Memory << PAGE_SHIFT,
 				pageCount, writeFlag, 0, pages, NULL);
-#else
+#elif LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0)
 	result = get_user_pages_remote(current, current->mm,
 				       Memory << PAGE_SHIFT,
 				       pageCount, writeFlag, pages, NULL, NULL);
+#else
+	result = get_user_pages_remote(current->mm, Memory << PAGE_SHIFT,
+				       pageCount, writeFlag, pages, NULL, NULL);
 #endif
+
 	if (result > 0 && result >= pageCount) {
 		/* Fill the page table. */
 		for (i = 0; i < pageCount; i++) {
@@ -451,7 +464,11 @@ static int rga2_MapUserMemory(struct page **pages, uint32_t *pageTable,
 
 		for (i = 0; i < result; i++)
 			put_page(pages[i]);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)
+		mmap_read_unlock(current->mm);
+#else
 		up_read(&current->mm->mmap_sem);
+#endif
 		return 0;
 	}
 	if (result > 0) {
@@ -473,7 +490,20 @@ static int rga2_MapUserMemory(struct page **pages, uint32_t *pageTable,
 			status = RGA2_OUT_OF_RESOURCES;
 			break;
 		}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)
+		/* In the four-level page table, it will do nothing and return pgd. */
+		p4d = p4d_offset(pgd, (Memory + i) << PAGE_SHIFT);
+		if (p4d_none(*p4d) || unlikely(p4d_bad(*p4d))) {
+			pr_err("RGA2 failed to get p4d, result = %d, pageCount = %d\n",
+			       result, pageCount);
+			status = RGA2_OUT_OF_RESOURCES;
+			break;
+		}
+
+		pud = pud_offset(p4d, (Memory + i) << PAGE_SHIFT);
+#else
 		pud = pud_offset(pgd, (Memory + i) << PAGE_SHIFT);
+#endif
 		if (pud_none(*pud) || unlikely(pud_bad(*pud))) {
 			pr_err("RGA2 failed to get pud, result = %d, pageCount = %d\n",
 			       result, pageCount);
@@ -505,7 +535,11 @@ static int rga2_MapUserMemory(struct page **pages, uint32_t *pageTable,
 
 		pte_unmap_unlock(pte, ptl);
 	}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)
+	mmap_read_unlock(current->mm);
+#else
 	up_read(&current->mm->mmap_sem);
+#endif
 	return status;
 }
 

commit a6cf6aca12c002da7d736ea35324ae77023cdece
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Thu Jul 22 14:22:32 2021 +0800

    drivers: rkflash: Ajudst the dll strategy
    
    1.max_dll_cells is 0x1FF when sfc_ver_4
    2.sfc_set_delay_lines to zero means disable dll
    3.bypass dll training when there is no device
    4.Adjust the dll_value to from the middle of the dll window to
    the better one
    5.Change RKSFC_DLL_THRESHOLD_RATE to ">50MHz"
    
    Change-Id: Ibd669420899925272c74e190fee8c62c09db8d14
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/rkflash/rksfc_base.c b/drivers/rkflash/rksfc_base.c
index 027b5c723939..ec557c27d282 100644
--- a/drivers/rkflash/rksfc_base.c
+++ b/drivers/rkflash/rksfc_base.c
@@ -24,7 +24,7 @@
 
 #define RKSFC_VERSION_AND_DATE		"rksfc_base v1.1 2016-01-08"
 #define RKSFC_CLK_MAX_RATE		(150 * 1000 * 1000)
-#define RKSFC_DLL_THRESHOLD_RATE	(100 * 1000 * 1000)
+#define RKSFC_DLL_THRESHOLD_RATE	(50 * 1000 * 1000)
 
 struct rksfc_info {
 	void __iomem	*reg_base;
@@ -107,40 +107,75 @@ static int rksfc_irq_deinit(void)
 static void rksfc_delay_lines_tuning(void)
 {
 	u8 id[3], id_temp[3];
-	int right, left = -1;
 	struct rk_sfc_op op;
-	u16 cell_max = SCLK_SMP_SEL_MAX_V4;
+	u16 cell_max = (u16)sfc_get_max_dll_cells();
+	u16 right, left = 0;
+	u16 step = SFC_DLL_TRANING_STEP;
+	bool dll_valid = false;
 
-	if (sfc_get_version() >= SFC_VER_5)
-		cell_max = SCLK_SMP_SEL_MAX_V5;
 	op.sfcmd.d32 = 0;
 	op.sfcmd.b.cmd = 0x9F;
 	op.sfctrl.d32 = 0;
 
 	clk_set_rate(g_sfc_info.clk, RKSFC_DLL_THRESHOLD_RATE);
 	sfc_request(&op, 0, id, 3);
+	if ((0xFF == id[0] && 0xFF == id[1]) ||
+	    (0x00 == id[0] && 0x00 == id[1])) {
+		dev_dbg(g_sfc_dev, "no dev, dll by pass\n");
+		clk_set_rate(g_sfc_info.clk, g_sfc_info.clk_rate);
+
+		return;
+	}
 
 	clk_set_rate(g_sfc_info.clk, g_sfc_info.clk_rate);
-	for (right = 10; right <= cell_max; right += 10) {
-		sfc_set_delay_lines((u16)right);
+	for (right = 0; right <= cell_max; right += step) {
+		int ret;
+
+		sfc_set_delay_lines(right);
 		sfc_request(&op, 0, id_temp, 3);
-		if (left == -1 && !memcmp(&id, &id_temp, 3))
+		dev_dbg(g_sfc_dev, "dll read flash id:%x %x %x\n",
+			id_temp[0], id_temp[1], id_temp[2]);
+
+		ret = memcmp(&id, &id_temp, 3);
+		if (dll_valid && ret) {
+			right -= step;
+
+			break;
+		}
+		if (!dll_valid && !ret)
 			left = right;
-		else if (left >= 0 && memcmp(&id, &id_temp, 3))
+
+		if (!ret)
+			dll_valid = true;
+
+		/* Add cell_max to loop */
+		if (right == cell_max)
 			break;
+		if (right + step > cell_max)
+			right = cell_max - step;
 	}
 
-	if (left >= 0 && (right - left > 50)) {
-		g_sfc_info.dll_cells = (u16)(right + left) / 2;
-		sfc_set_delay_lines(g_sfc_info.dll_cells);
+	if (dll_valid && (right - left) >= SFC_DLL_TRANING_VALID_WINDOW) {
+		if (left == 0 && right < cell_max)
+			g_sfc_info.dll_cells = left + (right - left) * 2 / 5;
+		else
+			g_sfc_info.dll_cells = left + (right - left) / 2;
 	} else {
 		g_sfc_info.dll_cells = 0;
-		sfc_disable_delay_lines();
+	}
+
+	if (g_sfc_info.dll_cells) {
+		dev_dbg(g_sfc_dev, "%d %d %d dll training success in %dMHz max_cells=%u sfc_ver=%d\n",
+			left, right, g_sfc_info.dll_cells, g_sfc_info.clk_rate,
+			sfc_get_max_dll_cells(), sfc_get_version());
+		sfc_set_delay_lines((u16)g_sfc_info.dll_cells);
+	} else {
+		dev_err(g_sfc_dev, "%d %d dll training failed in %dMHz, reduce the frequency\n",
+			left, right, g_sfc_info.clk_rate);
+		sfc_set_delay_lines(0);
 		clk_set_rate(g_sfc_info.clk, RKSFC_DLL_THRESHOLD_RATE);
 		g_sfc_info.clk_rate = clk_get_rate(g_sfc_info.clk);
 	}
-
-	pr_info("%s clk rate = %d\n", __func__, g_sfc_info.clk_rate);
 }
 
 static int rksfc_probe(struct platform_device *pdev)
@@ -196,11 +231,10 @@ static int rksfc_probe(struct platform_device *pdev)
 #endif
 
 	sfc_init(g_sfc_info.reg_base);
-	if (sfc_get_version() >= SFC_VER_4 &&
-	    g_sfc_info.clk_rate > RKSFC_DLL_THRESHOLD_RATE)
+	if (sfc_get_version() >= SFC_VER_4 && g_sfc_info.clk_rate > RKSFC_DLL_THRESHOLD_RATE)
 		rksfc_delay_lines_tuning();
 	else if (sfc_get_version() >= SFC_VER_4)
-		sfc_disable_delay_lines();
+		sfc_set_delay_lines(0);
 
 #ifdef CONFIG_RK_SFC_NOR
 	dev_result = rkflash_dev_init(g_sfc_info.reg_base, FLASH_TYPE_SFC_NOR, &sfc_nor_ops);
diff --git a/drivers/rkflash/sfc.c b/drivers/rkflash/sfc.c
index 9ee5d6a97f13..8237e765cdf8 100644
--- a/drivers/rkflash/sfc.c
+++ b/drivers/rkflash/sfc.c
@@ -40,22 +40,28 @@ u32 sfc_get_max_iosize(void)
 		return SFC_MAX_IOSIZE_VER3;
 }
 
-void sfc_set_delay_lines(u16 cells)
+u32 sfc_get_max_dll_cells(void)
 {
-	u16 cell_max = SCLK_SMP_SEL_MAX_V4;
+	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;
+	else
+		return 0;
+}
 
-	if (sfc_get_version() >= SFC_VER_5)
-		cell_max = SCLK_SMP_SEL_MAX_V5;
+void sfc_set_delay_lines(u16 cells)
+{
+	u16 cell_max = (u16)sfc_get_max_dll_cells();
+	u32 val = 0;
 
 	if (cells > cell_max)
 		cells = cell_max;
 
-	writel(SCLK_SMP_SEL_EN | cells, g_sfc_reg + SFC_DLL_CTRL0);
-}
+	if (cells)
+		val = SCLK_SMP_SEL_EN | cells;
 
-void sfc_disable_delay_lines(void)
-{
-	writel(0, g_sfc_reg + SFC_DLL_CTRL0);
+	writel(val, g_sfc_reg + SFC_DLL_CTRL0);
 }
 
 int sfc_init(void __iomem *reg_addr)
diff --git a/drivers/rkflash/sfc.h b/drivers/rkflash/sfc.h
index 355cd26170c6..703072d52086 100644
--- a/drivers/rkflash/sfc.h
+++ b/drivers/rkflash/sfc.h
@@ -68,8 +68,11 @@
 
 /* SFC_DLL_CTRL Register */
 #define SCLK_SMP_SEL_EN		BIT(15)	/* SCLK Sampling Selection */
-#define SCLK_SMP_SEL_MAX_V4	0xFF	/* SCLK Sampling Selection */
-#define SCLK_SMP_SEL_MAX_V5	0x1FF	/* SCLK Sampling Selection */
+#define SCLK_SMP_SEL_MAX_V4	0x1FF
+#define SCLK_SMP_SEL_MAX_V5	0xFF
+
+#define SFC_DLL_TRANING_STEP		10	/* Training step */
+#define SFC_DLL_TRANING_VALID_WINDOW	80	/* Valid DLL winbow */
 
 /* SFC_SR Register */
 /* sfc busy flag. When busy, don't try to set the control register */
@@ -215,10 +218,10 @@ u16 sfc_get_version(void);
 void sfc_clean_irq(void);
 u32 sfc_get_max_iosize(void);
 void sfc_set_delay_lines(u16 cells);
-void sfc_disable_delay_lines(void);
 void sfc_handle_irq(void);
 unsigned long rksfc_dma_map_single(unsigned long ptr, int size, int dir);
 void rksfc_dma_unmap_single(unsigned long ptr, int size, int dir);
 void rksfc_irq_flag_init(void);
 void rksfc_wait_for_irq_completed(void);
+u32 sfc_get_max_dll_cells(void);
 #endif

commit e6f64a043b8f2947387b0b24daabfe716d4b1ee3
Author: Nathan Chancellor <nathan@kernel.org>
Date:   Wed Jul 21 20:39:33 2021 -0700

    ANDROID: generate_initcall_order.pl: Use two dash long options for llvm-nm
    
    Commit 96e9bc424475 ("[llvm-nm] Remove one-dash long options except
    -arch") in LLVM removed the one dash long options, which causes this
    script to fail and initcalls not to get ordered properly, which
    manifests as kernels crashing durin boot.
    
    Use the two dash long options as the LLVM commit mentions that the
    documentation and help text have always shown them over the one dash
    long versions. This is not an issue with the mainline LTO series as it
    used two dash long options.
    
    Change-Id: Iaef9f96af1d75b54eabc4bba38d2a3a58c3c2209
    Fixes: 93185a915514 ("ANDROID: init: ensure initcall ordering with LTO")
    Link: https://github.com/llvm/llvm-project/commit/96e9bc42447531a20569e0a680c029837a4868d8
    Link: https://github.com/ClangBuiltLinux/continuous-integration2/runs/3129736977?check_suite_focus=true
    Link: https://github.com/ClangBuiltLinux/continuous-integration2/runs/3129775494?check_suite_focus=true
    Link: https://github.com/ClangBuiltLinux/continuous-integration2/runs/3129863440?check_suite_focus=true
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>

diff --git a/scripts/generate_initcall_order.pl b/scripts/generate_initcall_order.pl
index f772b4a01caa..bbae9398bca8 100755
--- a/scripts/generate_initcall_order.pl
+++ b/scripts/generate_initcall_order.pl
@@ -41,7 +41,7 @@ sub find_initcalls {
 
 	die "$0: object file $object doesn't exist?" if (! -f $object);
 
-	open(my $fh, "\"$nm\" -just-symbol-name -defined-only \"$object\" 2>/dev/null |")
+	open(my $fh, "\"$nm\" --just-symbol-name --defined-only \"$object\" 2>/dev/null |")
 		or die "$0: failed to execute \"$nm\": $!";
 
 	my $initcalls = {};

commit 81633ee29189250076b5e2df52ee4744d60206c5
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Wed Jul 21 16:58:30 2021 +0800

    drm/rockchip: vop2: enable dither up when input rgb565
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: I554924b979735e2377b1e9d06b22b2d9b35450a4

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
index 456027acb831..0a9b5b1c31be 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
@@ -531,6 +531,7 @@ struct vop2_win_regs {
 	struct vop_reg global_alpha_val;
 	struct vop_reg color_key;
 	struct vop_reg color_key_en;
+	struct vop_reg dither_up;
 };
 
 struct vop2_video_port_regs {
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 95e4628174e2..72ebfee6c856 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -1298,6 +1298,17 @@ static bool vop2_win_uv_swap(uint32_t format)
 	}
 }
 
+static bool vop2_win_dither_up(uint32_t format)
+{
+	switch (format) {
+	case DRM_FORMAT_BGR565:
+	case DRM_FORMAT_RGB565:
+		return true;
+	default:
+		return false;
+	}
+}
+
 static bool vop2_output_uv_swap(uint32_t bus_format, uint32_t output_mode)
 {
 	/*
@@ -2991,6 +3002,7 @@ static void vop2_plane_atomic_update(struct drm_plane *plane, struct drm_plane_s
 	uint32_t stride;
 	uint32_t transform_offset;
 	struct drm_format_name_buf format_name;
+	bool dither_up;
 
 #if defined(CONFIG_ROCKCHIP_DRM_DEBUG)
 	bool AFBC_flag = false;
@@ -3186,6 +3198,9 @@ static void vop2_plane_atomic_update(struct drm_plane *plane, struct drm_plane_s
 	VOP_WIN_SET(vop2, win, r2y_en, vpstate->r2y_en);
 	VOP_WIN_SET(vop2, win, csc_mode, vpstate->csc_mode);
 
+	dither_up = vop2_win_dither_up(fb->format->format);
+	VOP_WIN_SET(vop2, win, dither_up, dither_up);
+
 	VOP_WIN_SET(vop2, win, enable, 1);
 	if (vop2_cluster_window(win)) {
 		lb_mode = vop2_get_cluster_lb_mode(win, vpstate);
diff --git a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
index c0ef4b43b5d3..20d58d386504 100644
--- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
+++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
@@ -928,6 +928,7 @@ static const struct vop2_win_regs rk3568_cluster0_win_data = {
 	.enable = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 0),
 	.format = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1f, 1),
 	.rb_swap = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 14),
+	.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),
@@ -948,6 +949,7 @@ static const struct vop2_win_regs rk3568_cluster1_win_data = {
 	.enable = VOP_REG(RK3568_CLUSTER1_WIN0_CTRL0, 0x1, 0),
 	.format = VOP_REG(RK3568_CLUSTER1_WIN0_CTRL0, 0x1f, 1),
 	.rb_swap = VOP_REG(RK3568_CLUSTER1_WIN0_CTRL0, 0x1, 14),
+	.dither_up = VOP_REG(RK3568_CLUSTER1_WIN0_CTRL0, 0x1, 18),
 	.act_info = VOP_REG(RK3568_CLUSTER1_WIN0_ACT_INFO, 0x1fff1fff, 0),
 	.dsp_info = VOP_REG(RK3568_CLUSTER1_WIN0_DSP_INFO, 0x0fff0fff, 0),
 	.dsp_st = VOP_REG(RK3568_CLUSTER1_WIN0_DSP_ST, 0x1fff1fff, 0),
@@ -965,6 +967,7 @@ static const struct vop2_win_regs rk3568_esmart_win_data = {
 	.scl = &rk3568_esmart_win_scl,
 	.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),
 	.rb_swap = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 14),
 	.uv_swap = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 16),
 	.act_info = VOP_REG(RK3568_ESMART0_REGION0_ACT_INFO, 0x1fff1fff, 0),

commit f5d4d3c2897ffa3a2f51a78ee9337b09acd01b36
Author: Ziyuan Xu <xzy.xu@rock-chips.com>
Date:   Tue Jul 20 22:23:59 2021 +0800

    ARM: configs: add rv1126-snapshot.config
    
    Change-Id: If17c72edc26526c4d4e697b09b9db971827c760a
    Signed-off-by: Ziyuan Xu <xzy.xu@rock-chips.com>

diff --git a/arch/arm/configs/rv1126-snapshot.config b/arch/arm/configs/rv1126-snapshot.config
new file mode 100644
index 000000000000..0347da223faf
--- /dev/null
+++ b/arch/arm/configs/rv1126-snapshot.config
@@ -0,0 +1,42 @@
+# CONFIG_ARM_ROCKCHIP_DMC_DEBUG is not set
+# CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ is not set
+CONFIG_BATTERY_CW2015=y
+# CONFIG_BLK_DEV is not set
+# CONFIG_BT is not set
+# CONFIG_DEBUG_GPIO is not set
+# CONFIG_IIO is not set
+# CONFIG_INPUT is not set
+# CONFIG_MAILBOX is not set
+# CONFIG_MFD_RK808 is not set
+# CONFIG_MODULE_UNLOAD is not set
+# CONFIG_MTD_UBI is not set
+# CONFIG_NETDEVICES is not set
+# CONFIG_NEW_LEDS is not set
+# CONFIG_NTFS_FS is not set
+# CONFIG_OVERLAY_FS is not set
+# CONFIG_PM_DEBUG is not set
+# CONFIG_PM_DEVFREQ_EVENT is not set
+# CONFIG_PPS is not set
+CONFIG_PSTORE_MCU_LOG=y
+# CONFIG_PTP_1588_CLOCK is not set
+# CONFIG_PWRSEQ_EMMC is not set
+# CONFIG_PWRSEQ_SIMPLE is not set
+# CONFIG_RFKILL is not set
+CONFIG_ROCKCHIP_LOW_PERFORMANCE=y
+# CONFIG_ROCKCHIP_MPP_RKVDEC is not set
+# CONFIG_ROCKCHIP_MPP_VDPU2 is not set
+# CONFIG_ROCKCHIP_SUSPEND_MODE is not set
+CONFIG_RTC_DRV_HYM8563=y
+# CONFIG_SCSI is not set
+CONFIG_SCSI_MOD=y
+# CONFIG_SOUND is not set
+# CONFIG_SPI is not set
+# CONFIG_SQUASHFS is not set
+# CONFIG_USB is not set
+CONFIG_USB_DWC3_GADGET=y
+# CONFIG_VIDEO_OS04A10 is not set
+CONFIG_VIDEO_OS04C10=y
+# CONFIG_VIDEO_OV2718 is not set
+# CONFIG_VIDEO_ROCKCHIP_CIF is not set
+# CONFIG_WIRELESS is not set
+# CONFIG_XZ_DEC is not set

commit 1e4601090a545ada8d6661b2a225b326822ed627
Author: Ziyuan Xu <xzy.xu@rock-chips.com>
Date:   Tue Jul 20 22:20:22 2021 +0800

    ARM: dts: rockchip: add rv1126-snapshot.dts
    
    The rv1126-snapshot products aim to capture the camera frames as soon
    as possible, that use RISC-V to get the camera frames after 'fastae'.
    
    Change-Id: I62fc197279e9188c87616f0cbbaa747b05042e1b
    Signed-off-by: Ziyuan Xu <xzy.xu@rock-chips.com>

diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
index 6727aab58f67..c0e8d0b58efb 100644
--- a/arch/arm/boot/dts/Makefile
+++ b/arch/arm/boot/dts/Makefile
@@ -873,6 +873,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += \
 	rv1126-iotest-v10.dtb \
 	rv1126-ipc2-ddr3-v10.dtb \
 	rv1126-rmsl-ddr3-v1.dtb \
+	rv1126-snapshot.dtb \
 	rv1126-sphericalipc-ddr3-v10.dtb \
 	rk3036-evb.dtb \
 	rk3036-kylin.dtb \
diff --git a/arch/arm/boot/dts/rv1126-snapshot.dts b/arch/arm/boot/dts/rv1126-snapshot.dts
new file mode 100644
index 000000000000..2325091f9762
--- /dev/null
+++ b/arch/arm/boot/dts/rv1126-snapshot.dts
@@ -0,0 +1,38 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
+ */
+
+/dts-v1/;
+#include "rv1126-bat-evb-v10.dtsi"
+
+/ {
+	model = "Rockchip RV1126 BAT EVB V10 with snapshot Board";
+	compatible = "rockchip,rv1126-tb-snapshot", "rockchip,rv1126";
+};
+
+&thunderboot_ramoops {
+	reg = <0x00280000 0x00010000>;
+	record-size = <0x0000>;
+	console-size = <0x00000>;
+	ftrace-size = <0x00000>;
+	pmsg-size = <0x00000>;
+	mcu-log-size = <0x10000>;
+	mcu-log-count = <0x1>;
+};
+
+&rkisp_thunderboot {
+	reg = <0x08000000 (64 * 0x00100000)>;
+};
+
+&rkisp_vir1 {
+	status = "okay";
+};
+
+&rkispp_vir1 {
+	status = "okay";
+};
+
+&sdio {
+	status = "disabled";
+};
diff --git a/arch/arm/boot/dts/rv1126-thunder-boot.dtsi b/arch/arm/boot/dts/rv1126-thunder-boot.dtsi
index 023b0ad80944..79f702d19fd6 100644
--- a/arch/arm/boot/dts/rv1126-thunder-boot.dtsi
+++ b/arch/arm/boot/dts/rv1126-thunder-boot.dtsi
@@ -24,7 +24,7 @@
 			reg = <0x00200000 0x00008000>;
 		};
 
-		ramoops@210000 {
+		thunderboot_ramoops: ramoops@210000 {
 			compatible = "ramoops";
 			reg = <0x00210000 0x000f0000>;
 			record-size = <0x20000>;

commit 410876acbd915ffb5adab6e84df1661050ccee87
Author: Ziyuan Xu <xzy.xu@rock-chips.com>
Date:   Tue Jul 20 22:01:46 2021 +0800

    ARM: dts: rockchip: separate common device node to rv1126-bat-evb-v10.dtsi
    
    Change-Id: I50b0e7f69f2b03bbb3c9987fdc10b0c2c19376d6
    Signed-off-by: Ziyuan Xu <xzy.xu@rock-chips.com>

diff --git a/arch/arm/boot/dts/rv1126-bat-evb-v10.dts b/arch/arm/boot/dts/rv1126-bat-evb-v10.dts
index a15cbb7d3da4..5b52809622c7 100644
--- a/arch/arm/boot/dts/rv1126-bat-evb-v10.dts
+++ b/arch/arm/boot/dts/rv1126-bat-evb-v10.dts
@@ -1,420 +1,12 @@
 // SPDX-License-Identifier: (GPL-2.0+ OR MIT)
 /*
- * Copyright (c) 2020 Rockchip Electronics Co., Ltd.
+ * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
  */
 
 /dts-v1/;
-#include "rv1126.dtsi"
-#include "rv1126-bat-ipc.dtsi"
-#include "rv1126-thunder-boot-emmc.dtsi"
-#include <dt-bindings/input/input.h>
+#include "rv1126-bat-evb-v10.dtsi"
 
 / {
 	model = "Rockchip RV1126 BAT EVB V10 Board";
 	compatible = "rockchip,rv1126-bat-evb-v10", "rockchip,rv1126";
-
-	adc-keys {
-		compatible = "adc-keys";
-		io-channels = <&saradc 0>;
-		io-channel-names = "buttons";
-		poll-interval = <100>;
-		keyup-threshold-microvolt = <1800000>;
-
-		recovery {
-			label = "Volum_up";
-			linux,code = <KEY_VOLUMEUP>;
-			press-threshold-microvolt = <0>;
-		};
-	};
-
-	cam_ircut0: cam_ircut {
-		status = "okay";
-		compatible = "ap1511a,ircut";
-		pinctrl-names = "default";
-		pinctrl-0 = <&ir_cut_en>;
-		ircut-open-gpios = <&gpio2 RK_PD5 GPIO_ACTIVE_HIGH>;
-		led-gpios = <&gpio2 RK_PB2 GPIO_ACTIVE_HIGH>;
-		rockchip,camera-module-index = <1>;
-		rockchip,camera-module-facing = "front";
-	};
-
-	i2s0_sound: i2s0-sound {
-		status = "okay";
-		compatible = "simple-audio-card";
-		simple-audio-card,format = "i2s";
-		simple-audio-card,mclk-fs = <256>;
-		simple-audio-card,name = "rockchip,i2s0-sound";
-		simple-audio-card,cpu {
-			sound-dai = <&i2s0_8ch>;
-		};
-		simple-audio-card,codec {
-			sound-dai = <&es8311>;
-		};
-	};
-
-	leds {
-		compatible = "pwm-leds";
-
-		white {
-			label = "white";
-			pwms = <&pwm2 0 50000 0>;
-			max-brightness = <255>;
-		};
-	};
-
-	vcc1v2_dvdd: vcc1v8_dovdd: vcc2v8_avdd: vcc-camera {
-		compatible = "regulator-fixed";
-		regulator-name = "vcc_camera";
-		regulator-always-on;
-		regulator-boot-on;
-		gpio = <&gpio0 RK_PA7 GPIO_ACTIVE_HIGH>;
-		enable-active-high;
-	};
-
-	vcc_1v8: vcc-1v8 {
-		compatible = "regulator-fixed";
-		regulator-name = "vcc_1v8";
-		regulator-always-on;
-		regulator-boot-on;
-		regulator-min-microvolt = <1800000>;
-		regulator-max-microvolt = <1800000>;
-	};
-
-	vccio_flash: vccio-flash {
-		compatible = "regulator-fixed";
-		regulator-name = "vccio_flash";
-		regulator-always-on;
-		regulator-boot-on;
-		regulator-min-microvolt = <1800000>;
-		regulator-max-microvolt = <1800000>;
-		vin-supply = <&vcc_1v8>;
-	};
-
-	vccio_sd: vccio-sd {
-		compatible = "regulator-gpio";
-		regulator-name = "vccio_sd";
-		regulator-min-microvolt = <1800000>;
-		regulator-max-microvolt = <3300000>;
-		gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_HIGH>;
-		states = <3300000 1
-			  1800000 0>;
-	};
-
-	vdd_npu_vepu: vdd-npu-vepu {
-		compatible = "pwm-regulator";
-		pwms = <&pwm1 0 5000 1>;
-		regulator-name = "vdd_npu_vepu";
-		regulator-min-microvolt = <720000>;
-		regulator-max-microvolt = <1000000>;
-		regulator-init-microvolt = <824000>;
-		regulator-always-on;
-		regulator-boot-on;
-		regulator-settling-time-up-us = <250>;
-		pwm-supply = <&vcc_3v3>;
-	};
-
-	wireless-wlan {
-		compatible = "wlan-platdata";
-		rockchip,grf = <&grf>;
-		pinctrl-names = "default";
-		pinctrl-0 = <&wifi_wake_host>;
-		wifi_chip_type = "cy43438";
-		WIFI,poweren_gpio = <&gpio1 RK_PC7 GPIO_ACTIVE_LOW>;
-		WIFI,host_wake_irq = <&gpio1 RK_PD1 GPIO_ACTIVE_HIGH>;
-		status = "okay";
-	};
-};
-
-&csi_dphy0 {
-	status = "okay";
-
-	ports {
-		#address-cells = <1>;
-		#size-cells = <0>;
-		port@0 {
-			reg = <0>;
-			#address-cells = <1>;
-			#size-cells = <0>;
-
-			mipi_in_ucam0: endpoint@1 {
-				reg = <1>;
-				remote-endpoint = <&ucam_out0>;
-				data-lanes = <1 2 3 4>;
-			};
-		};
-		port@1 {
-			reg = <1>;
-			#address-cells = <1>;
-			#size-cells = <0>;
-
-			csidphy0_out: endpoint@0 {
-				reg = <0>;
-				remote-endpoint = <&isp_in>;
-			};
-		};
-	};
-};
-
-&emmc {
-	bus-width = <8>;
-	cap-mmc-highspeed;
-	non-removable;
-	mmc-hs200-1_8v;
-	rockchip,default-sample-phase = <90>;
-	supports-emmc;
-	/delete-property/ pinctrl-names;
-	/delete-property/ pinctrl-0;
-	status = "okay";
-};
-
-&i2c0 {
-	status = "okay";
-
-	hym8563: hym8563@51 {
-		compatible = "haoyu,hym8563";
-		reg = <0x51>;
-		#clock-cells = <0>;
-	};
-};
-
-&i2c1 {
-	status = "okay";
-
-	os04c10: os04c10@36 {
-		compatible = "ovti,os04c10";
-		reg = <0x36>;
-		clocks = <&cru CLK_MIPICSI_OUT>;
-		clock-names = "xvclk";
-		power-domains = <&power RV1126_PD_VI>;
-		avdd-supply = <&vcc2v8_avdd>;
-		dovdd-supply = <&vcc1v8_dovdd>;
-		dvdd-supply = <&vcc1v2_dvdd>;
-		pwdn-gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_HIGH>;
-		reset-gpios = <&gpio1 RK_PD5 GPIO_ACTIVE_LOW>;
-		rockchip,camera-module-index = <1>;
-		rockchip,camera-module-facing = "front";
-		rockchip,camera-module-name = "default";
-		rockchip,camera-module-lens-name = "default";
-		ir-cut = <&cam_ircut0>;
-
-		port {
-			ucam_out0: endpoint {
-				remote-endpoint = <&mipi_in_ucam0>;
-				data-lanes = <1 2 3 4>;
-			};
-		};
-	};
-};
-
-&i2c2 {
-	status = "okay";
-	clock-frequency = <400000>;
-
-	opt3001: opt3001@44 {
-		compatible = "ti,opt3001";
-		reg = <0x44>;
-	};
-};
-
-&i2c4 {
-	status = "okay";
-	clock-frequency = <400000>;
-	pinctrl-0 = <&i2c4m1_xfer>;
-
-	es8311: es8311@18 {
-		compatible = "everest,es8311";
-		reg = <0x18>;
-		clocks = <&cru MCLK_I2S0_TX_OUT2IO>;
-		clock-names = "mclk";
-		adc-pga-gain = <6>;  /* 18dB */
-		adc-volume = <0xbf>;  /* 0dB */
-		dac-volume = <0xbf>;  /* 0dB */
-		aec-mode = "dac left, adc right";
-		pinctrl-names = "default";
-		pinctrl-0 = <&i2s0m0_mclk &spk_ctl>;
-		assigned-clocks = <&cru MCLK_I2S0_TX_OUT2IO>;
-		assigned-clock-parents = <&cru MCLK_I2S0_TX>;
-		spk-ctl-gpios = <&gpio2 RK_PA4 GPIO_ACTIVE_HIGH>;
-		#sound-dai-cells = <0>;
-	};
-};
-
-&i2c5 {
-	status = "okay";
-	pinctrl-0 = <&i2c5m0_xfer>;
-
-	CW2015@62 {
-		compatible = "cw201x";
-		reg = <0x62>;
-		bat_config_info = <0x15 0x7E 0x7A 0x6E 0x6A 0x67 0x63 0x62 0x62 0x61 0x5E
-				   0x59 0x56 0x57 0x51 0x3C 0x30 0x27 0x29 0x29 0x2E 0x3A
-				   0x49 0x57 0x64 0x57 0x0B 0x85 0x30 0x50 0x60 0x67 0x6A
-				   0x6C 0x6A 0x6C 0x39 0x14 0x64 0x0E 0x04 0x2A 0x4E 0x81
-				   0x8E 0x90 0x90 0x43 0x64 0x83 0x96 0xA5 0x80 0x86 0xAC
-				   0xCB 0x2F 0x00 0x64 0xA5 0xB5 0x00 0xF8 0x31>;
-		monitor_sec = <5>;
-		virtual_power = <0>;
-	};
-};
-
-&i2s0_8ch {
-	status = "okay";
-	#sound-dai-cells = <0>;
-	rockchip,clk-trcm = <1>;
-	rockchip,i2s-rx-route = <0 1 2 3>;
-	pinctrl-0 = <&i2s0m0_sclk_tx
-		     &i2s0m0_lrck_tx
-		     &i2s0m0_sdo0
-		     &i2s0m0_sdi0>;
-};
-
-&isp_reserved {
-	size = <0x02400000>;
-};
-
-&npu {
-	npu-supply = <&vdd_npu_vepu>;
-};
-
-&pinctrl {
-	es8311 {
-		spk_ctl: spk-ctl {
-			rockchip,pins = <2 RK_PA4 0 &pcfg_pull_none>;
-		};
-	};
-	ir-cut {
-		/omit-if-no-ref/
-		ir_cut_en: ir-cut-en {
-			rockchip,pins = <2 RK_PD4 RK_FUNC_GPIO &pcfg_output_low>;
-		};
-	};
-	wireless-wlan {
-		/omit-if-no-ref/
-		wifi_wake_host: wifi-wake-host {
-			rockchip,pins = <1 RK_PD1 RK_FUNC_GPIO &pcfg_pull_down>;
-		};
-	};
-};
-
-&pmu_io_domains {
-	status = "okay";
-
-	pmuio0-supply = <&vcc_3v3>;
-	pmuio1-supply = <&vcc_3v3>;
-	vccio2-supply = <&vccio_sd>;
-	vccio3-supply = <&vcc_1v8>;
-	vccio4-supply = <&vcc_1v8>;
-	vccio5-supply = <&vcc_3v3>;
-	vccio7-supply = <&vcc_3v3>;
-};
-
-&pwm1 {
-	status = "okay";
-	pinctrl-names = "active";
-	pinctrl-0 = <&pwm1m0_pins_pull_down>;
-};
-
-&pwm2 {
-	status = "okay";
-	pinctrl-names = "active";
-	pinctrl-0 = <&pwm2m1_pins_pull_down>;
-};
-
-&pwm3 {
-	status = "okay";
-	pinctrl-names = "active";
-	pinctrl-0 = <&pwm3m1_pins_pull_down>;
-};
-
-&rkisp_thunderboot {
-	reg = <0x08000000 (32 * 0x00100000)>;
-};
-
-&rkisp_vir0 {
-	ports {
-		port@0 {
-			reg = <0>;
-			#address-cells = <1>;
-			#size-cells = <0>;
-
-			isp_in: endpoint@0 {
-				reg = <0>;
-				remote-endpoint = <&csidphy0_out>;
-			};
-		};
-	};
-};
-
-&rkisp_vir1 {
-	status = "okay";
-};
-
-&rkispp_vir1 {
-	status = "okay";
-};
-
-&rkvenc {
-	venc-supply = <&vdd_npu_vepu>;
-};
-
-&rkvenc_mmu {
-	status = "okay";
-};
-
-&mpp_srv {
-	status = "okay";
-};
-
-&rockchip_suspend {
-	status = "okay";
-	rockchip,sleep-debug-en = <1>;
-	rockchip,sleep-mode-config = <
-		(0
-		| RKPM_SLP_ARMOFF
-		| RKPM_SLP_PMU_PMUALIVE_32K
-		| RKPM_SLP_PMU_DIS_OSC
-		)
-	>;
-};
-
-&saradc {
-	status = "okay";
-	vref-supply = <&vcc_1v8>;
-};
-
-&sdio {
-	max-frequency = <50000000>;
-	bus-width = <4>;
-	cap-sd-highspeed;
-	cap-sdio-irq;
-	keep-power-in-suspend;
-	rockchip,default-sample-phase = <90>;
-	supports-sdio;
-	supports-chip-alive;
-	logic-remove-card;
-	status = "okay";
-};
-
-&sdmmc {
-	bus-width = <4>;
-	cap-mmc-highspeed;
-	cap-sd-highspeed;
-	card-detect-delay = <200>;
-	rockchip,default-sample-phase = <90>;
-	supports-sd;
-	sd-uhs-sdr12;
-	sd-uhs-sdr25;
-	sd-uhs-sdr104;
-	vqmmc-supply = <&vccio_sd>;
-	status = "okay";
-};
-
-&u2phy0 {
-	vup-gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_LOW>;
-};
-
-&uart5 {
-	pinctrl-names = "default";
-	pinctrl-0 = <&uart5m2_xfer>;
-	status = "okay";
 };
diff --git a/arch/arm/boot/dts/rv1126-bat-evb-v10.dtsi b/arch/arm/boot/dts/rv1126-bat-evb-v10.dtsi
new file mode 100644
index 000000000000..9156332059bc
--- /dev/null
+++ b/arch/arm/boot/dts/rv1126-bat-evb-v10.dtsi
@@ -0,0 +1,770 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
+ */
+
+#include "rv1126.dtsi"
+#include "rv1126-bat-ipc.dtsi"
+#include "rv1126-thunder-boot-emmc.dtsi"
+#include <dt-bindings/display/drm_mipi_dsi.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+	adc-keys {
+		compatible = "adc-keys";
+		io-channels = <&saradc 0>;
+		io-channel-names = "buttons";
+		poll-interval = <100>;
+		keyup-threshold-microvolt = <1800000>;
+
+		recovery {
+			label = "Volum_up";
+			linux,code = <KEY_VOLUMEUP>;
+			press-threshold-microvolt = <60000>;
+		};
+	};
+
+	backlight: backlight {
+		compatible = "pwm-backlight";
+		pwms = <&pwm6 0 25000 0>;
+		brightness-levels = <
+			  0   1   2   3   4   5   6   7
+			  8   9  10  11  12  13  14  15
+			 16  17  18  19  20  21  22  23
+			 24  25  26  27  28  29  30  31
+			 32  33  34  35  36  37  38  39
+			 40  41  42  43  44  45  46  47
+			 48  49  50  51  52  53  54  55
+			 56  57  58  59  60  61  62  63
+			 64  65  66  67  68  69  70  71
+			 72  73  74  75  76  77  78  79
+			 80  81  82  83  84  85  86  87
+			 88  89  90  91  92  93  94  95
+			 96  97  98  99 100 101 102 103
+			104 105 106 107 108 109 110 111
+			112 113 114 115 116 117 118 119
+			120 121 122 123 124 125 126 127
+			128 129 130 131 132 133 134 135
+			136 137 138 139 140 141 142 143
+			144 145 146 147 148 149 150 151
+			152 153 154 155 156 157 158 159
+			160 161 162 163 164 165 166 167
+			168 169 170 171 172 173 174 175
+			176 177 178 179 180 181 182 183
+			184 185 186 187 188 189 190 191
+			192 193 194 195 196 197 198 199
+			200 201 202 203 204 205 206 207
+			208 209 210 211 212 213 214 215
+			216 217 218 219 220 221 222 223
+			224 225 226 227 228 229 230 231
+			232 233 234 235 236 237 238 239
+			240 241 242 243 244 245 246 247
+			248 249 250 251 252 253 254 255>;
+		default-brightness-level = <200>;
+	};
+
+	cam_ircut0: cam_ircut {
+		status = "okay";
+		compatible = "rockchip,ircut";
+		ircut-open-gpios = <&gpio2 RK_PD4 GPIO_ACTIVE_HIGH>;
+		ircut-close-gpios = <&gpio2 RK_PD5 GPIO_ACTIVE_HIGH>;
+		rockchip,camera-module-index = <1>;
+		rockchip,camera-module-facing = "front";
+	};
+
+	i2s0_sound: i2s0-sound {
+		status = "okay";
+		compatible = "simple-audio-card";
+		simple-audio-card,format = "i2s";
+		simple-audio-card,mclk-fs = <256>;
+		simple-audio-card,name = "rockchip,i2s0-sound";
+		simple-audio-card,cpu {
+			sound-dai = <&i2s0_8ch>;
+		};
+		simple-audio-card,codec {
+			sound-dai = <&es8311>;
+		};
+	};
+
+	leds {
+		compatible = "gpio-leds";
+
+		ir {
+			label = "ir";
+			gpios = <&gpio2 RK_PB2 GPIO_ACTIVE_HIGH>;
+		};
+
+		white {
+			label = "white";
+			gpios = <&gpio2 RK_PB1 GPIO_ACTIVE_HIGH>;
+		};
+	};
+
+	vcc1v2_dvdd: vcc1v8_dovdd: vcc2v8_avdd: vcc-camera {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc_camera";
+		regulator-always-on;
+		regulator-boot-on;
+		gpio = <&gpio0 RK_PA7 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+	};
+
+	vcc_1v8: vcc-1v8 {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc_1v8";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <1800000>;
+		regulator-max-microvolt = <1800000>;
+	};
+
+	vccio_flash: vccio-flash {
+		compatible = "regulator-fixed";
+		regulator-name = "vccio_flash";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <1800000>;
+		regulator-max-microvolt = <1800000>;
+		vin-supply = <&vcc_1v8>;
+	};
+
+	vccio_sd: vccio-sd {
+		compatible = "regulator-gpio";
+		regulator-name = "vccio_sd";
+		regulator-min-microvolt = <1800000>;
+		regulator-max-microvolt = <3300000>;
+		gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>;
+		states = <3300000 1
+			  1800000 0>;
+	};
+
+	vcc_sd: vcc-sd {
+		compatible = "regulator-fixed";
+		pinctrl-names = "default";
+		pinctrl-0 = <&vccsd_en>;
+		regulator-name = "vcc_sd";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		gpio = <&gpio0 RK_PA4 GPIO_ACTIVE_LOW>;
+	};
+
+	vdd_npu: vdd-npu {
+		compatible = "pwm-regulator";
+		pwms = <&pwm1 0 5000 1>;
+		regulator-name = "vdd_npu";
+		regulator-min-microvolt = <718000>;
+		regulator-max-microvolt = <975000>;
+		regulator-init-microvolt = <813000>;
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-settling-time-up-us = <250>;
+	};
+
+	vdd_vepu: vdd-vepu {
+		compatible = "pwm-regulator";
+		pwms = <&pwm2 0 5000 1>;
+		regulator-name = "vdd_vepu";
+		regulator-min-microvolt = <720000>;
+		regulator-max-microvolt = <880000>;
+		regulator-init-microvolt = <818000>;
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-settling-time-up-us = <250>;
+	};
+
+	vcc18_lcd_n: vcc18-lcd-n {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc18_lcd_n";
+		gpio = <&gpio0 RK_PB1 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+		regulator-boot-on;
+	};
+
+	wireless-wlan {
+		compatible = "wlan-platdata";
+		rockchip,grf = <&grf>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&wifi_wake_host>;
+		wifi_chip_type = "cy43438";
+		WIFI,poweren_gpio = <&gpio1 RK_PC7 GPIO_ACTIVE_LOW>;
+		WIFI,host_wake_irq = <&gpio1 RK_PD1 GPIO_ACTIVE_HIGH>;
+		status = "okay";
+	};
+};
+
+&csi_dphy0 {
+	status = "okay";
+
+	ports {
+		#address-cells = <1>;
+		#size-cells = <0>;
+		port@0 {
+			reg = <0>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			mipi_in_ucam0: endpoint@1 {
+				reg = <1>;
+				remote-endpoint = <&ucam_out0>;
+				data-lanes = <1 2 3 4>;
+			};
+		};
+		port@1 {
+			reg = <1>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			csidphy0_out: endpoint@0 {
+				reg = <0>;
+				remote-endpoint = <&isp_in>;
+			};
+		};
+	};
+};
+
+&emmc {
+	bus-width = <8>;
+	cap-mmc-highspeed;
+	non-removable;
+	mmc-hs200-1_8v;
+	rockchip,default-sample-phase = <90>;
+	supports-emmc;
+	status = "okay";
+};
+
+&i2c0 {
+	status = "okay";
+	clock-frequency = <400000>;
+
+	hym8563: hym8563@51 {
+		compatible = "haoyu,hym8563";
+		reg = <0x51>;
+		#clock-cells = <0>;
+	};
+};
+
+&i2c1 {
+	status = "okay";
+	clock-frequency = <400000>;
+
+	os04c10: os04c10@36 {
+		compatible = "ovti,os04c10";
+		reg = <0x36>;
+		clocks = <&cru CLK_MIPICSI_OUT>;
+		clock-names = "xvclk";
+		power-domains = <&power RV1126_PD_VI>;
+		avdd-supply = <&vcc2v8_avdd>;
+		dovdd-supply = <&vcc1v8_dovdd>;
+		dvdd-supply = <&vcc1v2_dvdd>;
+		pwdn-gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_HIGH>;
+		reset-gpios = <&gpio1 RK_PD5 GPIO_ACTIVE_LOW>;
+		rockchip,camera-module-index = <1>;
+		rockchip,camera-module-facing = "front";
+		rockchip,camera-module-name = "DW-RV04C";
+		rockchip,camera-module-lens-name = "2G2P650IR-F21";
+		ir-cut = <&cam_ircut0>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&mipicsi_clk0>;
+
+		port {
+			ucam_out0: endpoint {
+				remote-endpoint = <&mipi_in_ucam0>;
+				data-lanes = <1 2 3 4>;
+			};
+		};
+	};
+};
+
+&i2c2 {
+	status = "okay";
+	clock-frequency = <400000>;
+
+	opt3001: opt3001@44 {
+		compatible = "ti,opt3001";
+		reg = <0x44>;
+	};
+};
+
+&i2c4 {
+	status = "okay";
+	clock-frequency = <400000>;
+	pinctrl-0 = <&i2c4m1_xfer>;
+
+	es8311: es8311@18 {
+		compatible = "everest,es8311";
+		reg = <0x18>;
+		clocks = <&cru MCLK_I2S0_TX_OUT2IO>;
+		clock-names = "mclk";
+		adc-pga-gain = <6>;  /* 18dB */
+		adc-volume = <0xbf>;  /* 0dB */
+		dac-volume = <0x9f>;  /* -16dB */
+		aec-mode = "dac left, adc right";
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2s0m0_mclk &spk_ctl>;
+		assigned-clocks = <&cru MCLK_I2S0_TX_OUT2IO>;
+		assigned-clock-parents = <&cru MCLK_I2S0_TX>;
+		spk-ctl-gpios = <&gpio2 RK_PA4 GPIO_ACTIVE_HIGH>;
+		#sound-dai-cells = <0>;
+	};
+};
+
+&i2c5 {
+	status = "okay";
+	clock-frequency = <400000>;
+	pinctrl-0 = <&i2c5m0_xfer>;
+
+	CW2015@62 {
+		compatible = "cw201x";
+		reg = <0x62>;
+		bat_config_info = <0x15 0x7E 0x7A 0x6E 0x6A 0x67 0x63 0x62 0x62 0x61 0x5E
+				   0x59 0x56 0x57 0x51 0x3C 0x30 0x27 0x29 0x29 0x2E 0x3A
+				   0x49 0x57 0x64 0x57 0x0B 0x85 0x30 0x50 0x60 0x67 0x6A
+				   0x6C 0x6A 0x6C 0x39 0x14 0x64 0x0E 0x04 0x2A 0x4E 0x81
+				   0x8E 0x90 0x90 0x43 0x64 0x83 0x96 0xA5 0x80 0x86 0xAC
+				   0xCB 0x2F 0x00 0x64 0xA5 0xB5 0x00 0xF8 0x31>;
+		monitor_sec = <5>;
+		virtual_power = <0>;
+	};
+};
+
+&i2s0_8ch {
+	status = "okay";
+	#sound-dai-cells = <0>;
+	rockchip,clk-trcm = <1>;
+	rockchip,i2s-rx-route = <0 1 2 3>;
+	pinctrl-0 = <&i2s0m0_sclk_tx
+		     &i2s0m0_lrck_tx
+		     &i2s0m0_sdo0
+		     &i2s0m0_sdi0>;
+};
+
+&isp_reserved {
+	size = <0x03c00000>;
+};
+
+&npu {
+	npu-supply = <&vdd_npu>;
+};
+
+&pinctrl {
+	es8311 {
+		/omit-if-no-ref/
+		spk_ctl: spk-ctl {
+			rockchip,pins = <2 RK_PA4 0 &pcfg_pull_none>;
+		};
+	};
+	sd {
+		/omit-if-no-ref/
+		vccsd_en: vccsd-en {
+			rockchip,pins = <0 RK_PA4 0 &pcfg_pull_none>;
+		};
+		/omit-if-no-ref/
+		sdmmc_clk: sdmmc-clk {
+			rockchip,pins =
+				/* sdmmc0_clk */
+				<1 RK_PB0 1 &pcfg_pull_up_drv_level_3>;
+		};
+	};
+	wireless-wlan {
+		/omit-if-no-ref/
+		wifi_wake_host: wifi-wake-host {
+			rockchip,pins = <1 RK_PD1 RK_FUNC_GPIO &pcfg_pull_down>;
+		};
+	};
+};
+
+&pmu_io_domains {
+	status = "okay";
+
+	pmuio0-supply = <&vcc_3v3>;
+	pmuio1-supply = <&vcc_3v3>;
+	vccio2-supply = <&vccio_sd>;
+	vccio3-supply = <&vcc_1v8>;
+	vccio4-supply = <&vcc_1v8>;
+	vccio5-supply = <&vcc_3v3>;
+	vccio6-supply = <&vcc_3v3>;
+	vccio7-supply = <&vcc_3v3>;
+};
+
+&pwm1 {
+	status = "okay";
+	pinctrl-names = "active";
+	pinctrl-0 = <&pwm1m0_pins_pull_down>;
+};
+
+&pwm2 {
+	status = "okay";
+	pinctrl-names = "active";
+	pinctrl-0 = <&pwm2m0_pins_pull_down>;
+};
+
+&pwm6 {
+	status = "okay";
+	pinctrl-names = "active";
+	pinctrl-0 = <&pwm6m0_pins_pull_down>;
+};
+
+&rkisp_thunderboot {
+	reg = <0x08000000 (32 * 0x00100000)>;
+};
+
+&rkisp_vir0 {
+	ports {
+		port@0 {
+			reg = <0>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			isp_in: endpoint@0 {
+				reg = <0>;
+				remote-endpoint = <&csidphy0_out>;
+			};
+		};
+	};
+};
+
+&rkisp_vir1 {
+	status = "okay";
+};
+
+&rkispp_vir1 {
+	status = "okay";
+};
+
+&rkvenc {
+	venc-supply = <&vdd_vepu>;
+};
+
+&rkvenc_mmu {
+	status = "okay";
+};
+
+&mpp_srv {
+	status = "okay";
+};
+
+&saradc {
+	status = "okay";
+	vref-supply = <&vcc_1v8>;
+};
+
+&sdio {
+	max-frequency = <50000000>;
+	bus-width = <4>;
+	cap-sd-highspeed;
+	cap-sdio-irq;
+	keep-power-in-suspend;
+	rockchip,default-sample-phase = <90>;
+	supports-sdio;
+	supports-chip-alive;
+	logic-remove-card;
+	status = "okay";
+};
+
+&sdmmc {
+	bus-width = <4>;
+	cap-mmc-highspeed;
+	cap-sd-highspeed;
+	card-detect-delay = <200>;
+	rockchip,default-sample-phase = <90>;
+	supports-sd;
+	sd-uhs-sdr12;
+	sd-uhs-sdr25;
+	sd-uhs-sdr104;
+	vqmmc-supply = <&vccio_sd>;
+	vmmc-supply = <&vcc_sd>;
+	status = "okay";
+};
+
+&u2phy0 {
+	vup-gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_LOW>;
+};
+
+&uart5 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&uart5m2_xfer>;
+	status = "okay";
+};
+
+&dsi {
+	status = "okay";
+
+	rockchip,lane-rate = <480>;
+	panel@0 {
+		compatible = "ilitek,ili9881d", "simple-panel-dsi";
+		reg = <0>;
+		backlight = <&backlight>;
+		power-supply = <&vcc18_lcd_n>;
+		prepare-delay-ms = <1>;
+		reset-delay-ms = <1>;
+		init-delay-ms = <5>;
+		disable-delay-ms = <10>;
+		unprepare-delay-ms = <5>;
+
+		width-mm = <68>;
+		height-mm = <121>;
+
+		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 = [
+			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 53
+			15 00 02 05 13
+			15 00 02 06 04
+			15 00 02 07 02
+			15 00 02 08 02
+			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 00
+			15 00 02 10 00
+			15 00 02 11 00
+			15 00 02 12 00
+			15 00 02 13 00
+			15 00 02 14 00
+			15 00 02 15 08
+			15 00 02 16 10
+			15 00 02 17 00
+			15 00 02 18 08
+			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 c0
+			15 00 02 1f 80
+			15 00 02 20 02
+			15 00 02 21 09
+			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 55
+			15 00 02 29 03
+			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 04
+			15 00 02 35 05
+			15 00 02 36 05
+			15 00 02 37 00
+			15 00 02 38 3c
+			15 00 02 39 35
+			15 00 02 3a 00
+			15 00 02 3b 40
+			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 88
+			15 00 02 42 00
+			15 00 02 43 00
+			15 00 02 44 1f
+			15 00 02 50 01
+			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 03
+			15 00 02 5f 14
+			15 00 02 60 15
+			15 00 02 61 0c
+			15 00 02 62 0d
+			15 00 02 63 0e
+			15 00 02 64 0f
+			15 00 02 65 10
+			15 00 02 66 11
+			15 00 02 67 08
+			15 00 02 68 02
+			15 00 02 69 0a
+			15 00 02 6a 02
+			15 00 02 6b 02
+			15 00 02 6c 02
+			15 00 02 6d 02
+			15 00 02 6e 02
+			15 00 02 6f 02
+			15 00 02 70 02
+			15 00 02 71 02
+			15 00 02 72 06
+			15 00 02 73 02
+			15 00 02 74 02
+			15 00 02 75 14
+			15 00 02 76 15
+			15 00 02 77 0f
+			15 00 02 78 0e
+			15 00 02 79 0d
+			15 00 02 7a 0c
+			15 00 02 7b 11
+			15 00 02 7c 10
+			15 00 02 7d 06
+			15 00 02 7e 02
+			15 00 02 7f 0a
+			15 00 02 80 02
+			15 00 02 81 02
+			15 00 02 82 02
+			15 00 02 83 02
+			15 00 02 84 02
+			15 00 02 85 02
+			15 00 02 86 02
+			15 00 02 87 02
+			15 00 02 88 08
+			15 00 02 89 02
+			15 00 02 8a 02
+			39 00 04 ff 98 81 04
+			15 00 02 00 80
+			15 00 02 70 00
+			15 00 02 71 00
+			15 00 02 66 fe
+			15 00 02 82 15
+			15 00 02 84 15
+			15 00 02 85 15
+			15 00 02 3a 24
+			15 00 02 32 ac
+			15 00 02 8c 80
+			15 00 02 3c f5
+			15 00 02 88 33
+			39 00 04 ff 98 81 01
+			15 00 02 22 0a
+			15 00 02 31 00
+			15 00 02 53 78
+			15 00 02 55 7b
+			15 00 02 60 20
+			15 00 02 61 00
+			15 00 02 62 0d
+			15 00 02 63 00
+			15 00 02 a0 00
+			15 00 02 a1 10
+			15 00 02 a2 1c
+			15 00 02 a3 13
+			15 00 02 a4 15
+			15 00 02 a5 26
+			15 00 02 a6 1a
+			15 00 02 a7 1d
+			15 00 02 a8 67
+			15 00 02 a9 1c
+			15 00 02 aa 29
+			15 00 02 ab 5b
+			15 00 02 ac 26
+			15 00 02 ad 28
+			15 00 02 ae 5c
+			15 00 02 af 30
+			15 00 02 b0 31
+			15 00 02 b1 32
+			15 00 02 b2 00
+			15 00 02 b1 2e
+			15 00 02 b2 32
+			15 00 02 b3 00
+			15 00 02 c0 00
+			15 00 02 c1 10
+			15 00 02 c2 1c
+			15 00 02 c3 13
+			15 00 02 c4 15
+			15 00 02 c5 26
+			15 00 02 c6 1a
+			15 00 02 c7 1d
+			15 00 02 c8 67
+			15 00 02 c9 1c
+			15 00 02 ca 29
+			15 00 02 cb 5b
+			15 00 02 cc 26
+			15 00 02 cd 28
+			15 00 02 ce 5c
+			15 00 02 cf 30
+			15 00 02 d0 31
+			15 00 02 d1 2e
+			15 00 02 d2 32
+			15 00 02 d3 00
+			39 00 04 ff 98 81 00
+			05 00 01 11
+			05 01 01 29
+		];
+
+		display-timings {
+			native-mode = <&timing0>;
+
+			timing0: timing0 {
+				clock-frequency = <65000000>;
+				hactive = <720>;
+				vactive = <1280>;
+				hfront-porch = <48>;
+				hsync-len = <8>;
+				hback-porch = <52>;
+				vfront-porch = <16>;
+				vsync-len = <6>;
+				vback-porch = <15>;
+				hsync-active = <0>;
+				vsync-active = <0>;
+				de-active = <0>;
+				pixelclk-active = <0>;
+			};
+		};
+
+		ports {
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			port@0 {
+				reg = <0>;
+				panel_in_dsi: endpoint {
+					remote-endpoint = <&dsi_out_panel>;
+				};
+			};
+		};
+	};
+
+	ports {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		port@1 {
+			reg = <1>;
+			dsi_out_panel: endpoint {
+				remote-endpoint = <&panel_in_dsi>;
+			};
+		};
+	};
+};
+
+&mipi_dphy {
+	status = "okay";
+};
+
+&display_subsystem {
+	status = "okay";
+};
+
+&vop {
+	status = "okay";
+};
+
+&vop_mmu {
+	status = "okay";
+};

commit 1dd8f442b855de0fd909e764d9e12f8894482c0e
Author: Algea Cao <algea.cao@rock-chips.com>
Date:   Wed Jul 21 16:15:38 2021 +0800

    drm/bridge: synopsys: dw-hdmi: Remove dw_hdmi_setup when atomic_check
    
    There is no need to call dw_hdmi_setup() when atomic_check.
    dw_hdmi_color_changed() will check if color format changed and
    call a mode_set.
    If call dw_hdmi_setup() to enable hdmi when the first plug in
    atomic_check, HPLL has not been configured in rk356x, there will
    be display err in some monitor.
    
    Signed-off-by: Algea Cao <algea.cao@rock-chips.com>
    Change-Id: I83f3d1d3ff45e3e07910449d8d03f94b82fc0abe

diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index df2d6856f977..0df9ddfcaf55 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -2859,8 +2859,6 @@ static int dw_hdmi_connector_atomic_check(struct drm_connector *connector,
 	struct drm_display_mode *mode = NULL;
 	void *data = hdmi->plat_data->phy_data;
 	struct hdmi_vmode *vmode = &hdmi->hdmi_data.video_mode;
-	unsigned int in_bus_format = hdmi->hdmi_data.enc_in_bus_format;
-	unsigned int out_bus_format = hdmi->hdmi_data.enc_out_bus_format;
 
 	if (!crtc)
 		return 0;
@@ -2893,10 +2891,6 @@ static int dw_hdmi_connector_atomic_check(struct drm_connector *connector,
 						       vmode->mpixelclock);
 		if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format))
 			vmode->mtmdsclock /= 2;
-
-		if (in_bus_format != hdmi->hdmi_data.enc_in_bus_format ||
-		    out_bus_format != hdmi->hdmi_data.enc_out_bus_format)
-			dw_hdmi_setup(hdmi, &hdmi->previous_mode);
 	}
 
 	if (!hdr_metadata_equal(old_state, new_state) ||

commit 293999cf8f8df1c451d864b8fb789109c4725a2c
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Thu Jul 22 08:50:10 2021 +0800

    media: rockchip: isp1: add 150m isp clk for rk3326
    
    Change-Id: Ia87c9274f1dce6667b0c3aba3d009cf99191a353
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp1/dev.c b/drivers/media/platform/rockchip/isp1/dev.c
index 4e548f0ae81b..a14540df844a 100644
--- a/drivers/media/platform/rockchip/isp1/dev.c
+++ b/drivers/media/platform/rockchip/isp1/dev.c
@@ -747,7 +747,7 @@ static const unsigned int rk3288_isp_clk_rate[] = {
 
 /* isp clock adjustment table (MHz) */
 static const unsigned int rk3326_isp_clk_rate[] = {
-	300, 347, 400, 520, 600
+	150, 300, 347, 400, 520, 600
 };
 
 /* isp clock adjustment table (MHz) */

commit 404b75f3b2dfa53ea6124ec574f5375ea18603f5
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Wed Jul 21 14:11:23 2021 +0800

    media: rockchip: isp1: fix buf done state
    
    Change-Id: Idc2fc19c3972935d6991bd6d6af10e1f9cdbd7e7
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp1/capture.c b/drivers/media/platform/rockchip/isp1/capture.c
index 1938ed86b86c..eb8d8277fa85 100644
--- a/drivers/media/platform/rockchip/isp1/capture.c
+++ b/drivers/media/platform/rockchip/isp1/capture.c
@@ -1433,7 +1433,7 @@ static void destroy_buf_queue(struct rkisp1_stream *stream,
 		buf = list_first_entry(&stream->buf_queue,
 				       struct rkisp1_buffer, queue);
 		list_del(&buf->queue);
-		vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
+		vb2_buffer_done(&buf->vb.vb2_buf, state);
 	}
 	spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
 }

commit 93b6df5c15d8ab5eb9c029ca8efa4f50d4f92744
Author: Binyuan Lan <lby@rock-chips.com>
Date:   Thu Jul 8 21:24:39 2021 +0800

    ASoC: rockchip: rk817-codec: Solve pop problems
    
    DIGEN_CLKE can only be controlled when the amplifier is turned off
    
    Signed-off-by: Binyuan Lan <lby@rock-chips.com>
    Change-Id: I5758cab8f20bd2ede008d1ad138cdadcaa55e39d

diff --git a/sound/soc/codecs/rk817_codec.c b/sound/soc/codecs/rk817_codec.c
index 1ca796247c9a..bc0032ece2ce 100644
--- a/sound/soc/codecs/rk817_codec.c
+++ b/sound/soc/codecs/rk817_codec.c
@@ -909,26 +909,27 @@ static int rk817_digital_mute(struct snd_soc_dai *dai, int mute)
 	struct rk817_codec_priv *rk817 = snd_soc_component_get_drvdata(component);
 
 	DBG("%s %d\n", __func__, mute);
+
 	if (mute) {
+		rk817_codec_ctl_gpio(rk817, CODEC_SET_SPK, 0);
+		rk817_codec_ctl_gpio(rk817, CODEC_SET_HP, 0);
+
 		snd_soc_component_update_bits(component,
 					      RK817_CODEC_DDAC_MUTE_MIXCTL,
 					      DACMT_ENABLE, DACMT_ENABLE);
+		snd_soc_component_write(component, RK817_CODEC_ADAC_CFG1,
+					PWD_DACBIAS_DOWN | PWD_DACD_DOWN |
+					PWD_DACL_DOWN | PWD_DACR_DOWN);
 		/* Reset DAC DTOP_DIGEN_CLKE for playback stopped */
 		snd_soc_component_update_bits(component, RK817_CODEC_DTOP_DIGEN_CLKE,
 					      DAC_DIG_CLK_EN, DAC_DIG_CLK_DIS);
 		snd_soc_component_update_bits(component, RK817_CODEC_DTOP_DIGEN_CLKE,
 					      DAC_DIG_CLK_EN, DAC_DIG_CLK_EN);
-
 	} else {
 		snd_soc_component_update_bits(component,
 					      RK817_CODEC_DDAC_MUTE_MIXCTL,
 					      DACMT_ENABLE, DACMT_DISABLE);
-	}
 
-	if (mute) {
-		rk817_codec_ctl_gpio(rk817, CODEC_SET_SPK, 0);
-		rk817_codec_ctl_gpio(rk817, CODEC_SET_HP, 0);
-	} else {
 		switch (rk817->playback_path) {
 		case SPK_PATH:
 		case RING_SPK:

commit f26aeace6701e1a7a508cd61388f14470c15e1d3
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Wed Jul 21 11:32:12 2021 +0800

    Revert "drm/rockchip: gem: fix dma_free_attrs() parameter error"
    
    This reverts commit 42256c1a8f6b612aeee9b456fe605ef3570dd6ae will lead to
    DMA buffer + IOMMU free buffer error:
    
    when we use DMA continue buffer, we have the following two use case:
    case 1: DMA + IOMMU, we have two addr
        alloc:
            dma_handle = dma_alloc_attrs()
            dma_addr = rockchip_gem_iommu_map() --> config to vop register
        free:
            rockchip_gem_iommu_unmap(dma_addr)
            dma_free_attrs(dma_handle)
    
    case 2: DMA + no IOMMU, we have one addr
        alloc:
            dma_handle = dma_alloc_attrs()
            dma_addr = dma_handle  --> config to vop register
        free:
            dma_free_attrs(dma_handle)
    
    After convert this commit, we still fix the dma_free_attrs() parameter
    error at rockchip_gem_alloc_dma(), detail:
    ...
            dma_free_attrs(drm->dev, obj->size, rk_obj->kvaddr,
    old:                      rk_obj->dma_addr, rk_obj->dma_attrs);
    new:                      rk_obj->dma_handle, rk_obj->dma_attrs);
    
    ...
    
    Change-Id: I3c05d632b42e09b082d7e378dc7510548a794727
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
index 01fb23a4ed87..f0850bf319c6 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
@@ -258,7 +258,7 @@ static int rockchip_gem_alloc_dma(struct rockchip_gem_object *rk_obj,
 		rk_obj->dma_attrs |= DMA_ATTR_NO_KERNEL_MAPPING;
 
 	rk_obj->kvaddr = dma_alloc_attrs(drm->dev, obj->size,
-					 &rk_obj->dma_addr, GFP_KERNEL,
+					 &rk_obj->dma_handle, GFP_KERNEL,
 					 rk_obj->dma_attrs);
 	if (!rk_obj->kvaddr) {
 		DRM_ERROR("failed to allocate %zu byte dma buffer", obj->size);
@@ -272,7 +272,7 @@ static int rockchip_gem_alloc_dma(struct rockchip_gem_object *rk_obj,
 	}
 
 	ret = dma_get_sgtable_attrs(drm->dev, sgt, rk_obj->kvaddr,
-				    rk_obj->dma_addr, obj->size,
+				    rk_obj->dma_handle, obj->size,
 				    rk_obj->dma_attrs);
 	if (ret) {
 		DRM_ERROR("failed to allocate sgt, %d\n", ret);
@@ -310,7 +310,7 @@ static int rockchip_gem_alloc_dma(struct rockchip_gem_object *rk_obj,
 	kfree(sgt);
 err_dma_free:
 	dma_free_attrs(drm->dev, obj->size, rk_obj->kvaddr,
-		       rk_obj->dma_addr, rk_obj->dma_attrs);
+		       rk_obj->dma_handle, rk_obj->dma_attrs);
 
 	return ret;
 }
@@ -352,7 +352,7 @@ static int rockchip_gem_alloc_secure(struct rockchip_gem_object *rk_obj)
 		return -ENOMEM;
 	}
 
-	rk_obj->dma_addr = paddr;
+	rk_obj->dma_handle = paddr;
 	rk_obj->num_pages = rk_obj->base.size >> PAGE_SHIFT;
 
 	rk_obj->pages = drm_calloc_large(rk_obj->num_pages,
@@ -396,7 +396,7 @@ static void rockchip_gem_free_secure(struct rockchip_gem_object *rk_obj)
 	drm_free_large(rk_obj->pages);
 	sg_free_table(rk_obj->sgt);
 	kfree(rk_obj->sgt);
-	gen_pool_free(private->secure_buffer_pool, rk_obj->dma_addr,
+	gen_pool_free(private->secure_buffer_pool, rk_obj->dma_handle,
 		      rk_obj->base.size);
 }
 
@@ -449,7 +449,8 @@ static int rockchip_gem_alloc_buf(struct rockchip_gem_object *rk_obj,
 		if (ret < 0)
 			goto err_free;
 	} else {
-		WARN_ON(!rk_obj->dma_addr);
+		WARN_ON(!rk_obj->dma_handle);
+		rk_obj->dma_addr = rk_obj->dma_handle;
 	}
 
 	return 0;
@@ -476,7 +477,7 @@ static void rockchip_gem_free_dma(struct rockchip_gem_object *rk_obj)
 	sg_free_table(rk_obj->sgt);
 	kfree(rk_obj->sgt);
 	dma_free_attrs(drm->dev, obj->size, rk_obj->kvaddr,
-		       rk_obj->dma_addr, rk_obj->dma_attrs);
+		       rk_obj->dma_handle, rk_obj->dma_attrs);
 }
 
 static void rockchip_gem_free_buf(struct rockchip_gem_object *rk_obj)
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h
index 7469cbe62922..eb392ee8e315 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h
@@ -30,7 +30,8 @@ struct rockchip_gem_object {
 
 	void *kvaddr;
 	void *cookie;
-	dma_addr_t dma_addr;
+	dma_addr_t dma_addr;	/* iova if iommu enable, otherwise physical address */
+	dma_addr_t dma_handle;	/* physical address */
 
 	/* Used when IOMMU is disabled */
 	unsigned long dma_attrs;

commit f24479d84cacaae7e81ad53cfe1c22eec5edf14c
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Wed Jul 21 09:01:56 2021 +0200

    Revert "media: subdev: disallow ioctl for saa6588/davinci"
    
    This reverts commit 79666b99401652b696b64faecc8dc78b0abe36c4.  It breaks
    the ABI and we do not need this in Android devices at this point in
    time.
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: Ic9ce7d87c32c313d91a95bcdb21ebb26e81655f0

diff --git a/drivers/media/i2c/saa6588.c b/drivers/media/i2c/saa6588.c
index c074e51834e9..33d2987f9555 100644
--- a/drivers/media/i2c/saa6588.c
+++ b/drivers/media/i2c/saa6588.c
@@ -392,7 +392,7 @@ static void saa6588_configure(struct saa6588 *s)
 
 /* ---------------------------------------------------------------------- */
 
-static long saa6588_command(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+static long saa6588_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 {
 	struct saa6588 *s = to_saa6588(sd);
 	struct saa6588_command *a = arg;
@@ -445,7 +445,7 @@ static int saa6588_s_tuner(struct v4l2_subdev *sd, const struct v4l2_tuner *vt)
 /* ----------------------------------------------------------------------- */
 
 static const struct v4l2_subdev_core_ops saa6588_core_ops = {
-	.command = saa6588_command,
+	.ioctl = saa6588_ioctl,
 };
 
 static const struct v4l2_subdev_tuner_ops saa6588_tuner_ops = {
diff --git a/drivers/media/pci/bt8xx/bttv-driver.c b/drivers/media/pci/bt8xx/bttv-driver.c
index 2a9d25431d73..4c042ba6de91 100644
--- a/drivers/media/pci/bt8xx/bttv-driver.c
+++ b/drivers/media/pci/bt8xx/bttv-driver.c
@@ -3243,7 +3243,7 @@ static int radio_release(struct file *file)
 
 	btv->radio_user--;
 
-	bttv_call_all(btv, core, command, SAA6588_CMD_CLOSE, &cmd);
+	bttv_call_all(btv, core, ioctl, SAA6588_CMD_CLOSE, &cmd);
 
 	if (btv->radio_user == 0)
 		btv->has_radio_tuner = 0;
@@ -3324,7 +3324,7 @@ static ssize_t radio_read(struct file *file, char __user *data,
 	cmd.result = -ENODEV;
 	radio_enable(btv);
 
-	bttv_call_all(btv, core, command, SAA6588_CMD_READ, &cmd);
+	bttv_call_all(btv, core, ioctl, SAA6588_CMD_READ, &cmd);
 
 	return cmd.result;
 }
@@ -3345,7 +3345,7 @@ static __poll_t radio_poll(struct file *file, poll_table *wait)
 	cmd.instance = file;
 	cmd.event_list = wait;
 	cmd.poll_mask = res;
-	bttv_call_all(btv, core, command, SAA6588_CMD_POLL, &cmd);
+	bttv_call_all(btv, core, ioctl, SAA6588_CMD_POLL, &cmd);
 
 	return cmd.poll_mask;
 }
diff --git a/drivers/media/pci/saa7134/saa7134-video.c b/drivers/media/pci/saa7134/saa7134-video.c
index 079219288af7..1a50ec9d084f 100644
--- a/drivers/media/pci/saa7134/saa7134-video.c
+++ b/drivers/media/pci/saa7134/saa7134-video.c
@@ -1202,7 +1202,7 @@ static int video_release(struct file *file)
 
 	saa_call_all(dev, tuner, standby);
 	if (vdev->vfl_type == VFL_TYPE_RADIO)
-		saa_call_all(dev, core, command, SAA6588_CMD_CLOSE, &cmd);
+		saa_call_all(dev, core, ioctl, SAA6588_CMD_CLOSE, &cmd);
 	mutex_unlock(&dev->lock);
 
 	return 0;
@@ -1221,7 +1221,7 @@ static ssize_t radio_read(struct file *file, char __user *data,
 	cmd.result = -ENODEV;
 
 	mutex_lock(&dev->lock);
-	saa_call_all(dev, core, command, SAA6588_CMD_READ, &cmd);
+	saa_call_all(dev, core, ioctl, SAA6588_CMD_READ, &cmd);
 	mutex_unlock(&dev->lock);
 
 	return cmd.result;
@@ -1237,7 +1237,7 @@ static __poll_t radio_poll(struct file *file, poll_table *wait)
 	cmd.event_list = wait;
 	cmd.poll_mask = 0;
 	mutex_lock(&dev->lock);
-	saa_call_all(dev, core, command, SAA6588_CMD_POLL, &cmd);
+	saa_call_all(dev, core, ioctl, SAA6588_CMD_POLL, &cmd);
 	mutex_unlock(&dev->lock);
 
 	return rc | cmd.poll_mask;
diff --git a/drivers/media/platform/davinci/vpbe_display.c b/drivers/media/platform/davinci/vpbe_display.c
index 2a073a6d83e3..6f8269352433 100644
--- a/drivers/media/platform/davinci/vpbe_display.c
+++ b/drivers/media/platform/davinci/vpbe_display.c
@@ -60,7 +60,7 @@ static int venc_is_second_field(struct vpbe_display *disp_dev)
 
 	ret = v4l2_subdev_call(vpbe_dev->venc,
 			       core,
-			       command,
+			       ioctl,
 			       VENC_GET_FLD,
 			       &val);
 	if (ret < 0) {
diff --git a/drivers/media/platform/davinci/vpbe_venc.c b/drivers/media/platform/davinci/vpbe_venc.c
index c2cfaa9c6957..ddcad7b3e76c 100644
--- a/drivers/media/platform/davinci/vpbe_venc.c
+++ b/drivers/media/platform/davinci/vpbe_venc.c
@@ -534,7 +534,9 @@ static int venc_s_routing(struct v4l2_subdev *sd, u32 input, u32 output,
 	return ret;
 }
 
-static long venc_command(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+static long venc_ioctl(struct v4l2_subdev *sd,
+			unsigned int cmd,
+			void *arg)
 {
 	u32 val;
 
@@ -553,7 +555,7 @@ static long venc_command(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 }
 
 static const struct v4l2_subdev_core_ops venc_core_ops = {
-	.command      = venc_command,
+	.ioctl      = venc_ioctl,
 };
 
 static const struct v4l2_subdev_video_ops venc_video_ops = {
diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h
index eac37dd3e3ba..9102d6ca566e 100644
--- a/include/media/v4l2-subdev.h
+++ b/include/media/v4l2-subdev.h
@@ -171,9 +171,6 @@ struct v4l2_subdev_io_pin_config {
  * @s_gpio: set GPIO pins. Very simple right now, might need to be extended with
  *	a direction argument if needed.
  *
- * @command: called by in-kernel drivers in order to call functions internal
- *	   to subdev drivers driver that have a separate callback.
- *
  * @ioctl: called at the end of ioctl() syscall handler at the V4L2 core.
  *	   used to provide support for private ioctls used on the driver.
  *
@@ -205,7 +202,6 @@ struct v4l2_subdev_core_ops {
 	int (*load_fw)(struct v4l2_subdev *sd);
 	int (*reset)(struct v4l2_subdev *sd, u32 val);
 	int (*s_gpio)(struct v4l2_subdev *sd, u32 val);
-	long (*command)(struct v4l2_subdev *sd, unsigned int cmd, void *arg);
 	long (*ioctl)(struct v4l2_subdev *sd, unsigned int cmd, void *arg);
 #ifdef CONFIG_COMPAT
 	long (*compat_ioctl32)(struct v4l2_subdev *sd, unsigned int cmd,

commit 7884aefdda22210aa10674e40e8a70aa0b1c6a58
Author: Ziyuan Xu <xzy.xu@rock-chips.com>
Date:   Tue Jul 20 22:00:41 2021 +0800

    media: rockchip: isp/ispp: declare slab.h for kmalloc/kfree
    
    Change-Id: I515dfc032819df9c4dfb235a413403567392d9d0
    Signed-off-by: Ziyuan Xu <xzy.xu@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/bridge.c b/drivers/media/platform/rockchip/isp/bridge.c
index f4e38f996e9a..61ced4505cb4 100644
--- a/drivers/media/platform/rockchip/isp/bridge.c
+++ b/drivers/media/platform/rockchip/isp/bridge.c
@@ -3,6 +3,7 @@
 
 #include <linux/delay.h>
 #include <linux/pm_runtime.h>
+#include <linux/slab.h>
 #include <media/v4l2-common.h>
 #include <media/v4l2-event.h>
 #include <media/v4l2-fh.h>
diff --git a/drivers/media/platform/rockchip/isp/common.c b/drivers/media/platform/rockchip/isp/common.c
index a890fb4480ef..e677eda7b0da 100644
--- a/drivers/media/platform/rockchip/isp/common.c
+++ b/drivers/media/platform/rockchip/isp/common.c
@@ -4,6 +4,7 @@
 #include <media/videobuf2-dma-contig.h>
 #include <media/videobuf2-dma-sg.h>
 #include <linux/of_platform.h>
+#include <linux/slab.h>
 #include "dev.h"
 #include "isp_ispp.h"
 #include "regs.h"
diff --git a/drivers/media/platform/rockchip/isp/isp_params_v21.c b/drivers/media/platform/rockchip/isp/isp_params_v21.c
index e955e80ca4b9..520237e81c2e 100644
--- a/drivers/media/platform/rockchip/isp/isp_params_v21.c
+++ b/drivers/media/platform/rockchip/isp/isp_params_v21.c
@@ -6,6 +6,7 @@
 #include <media/videobuf2-core.h>
 #include <media/videobuf2-vmalloc.h>	/* for ISP params */
 #include <linux/rk-preisp.h>
+#include <linux/slab.h>
 #include "dev.h"
 #include "regs.h"
 #include "regs_v2x.h"
diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.c b/drivers/media/platform/rockchip/isp/isp_params_v2x.c
index 9902d0c42db5..181d3efd70a3 100644
--- a/drivers/media/platform/rockchip/isp/isp_params_v2x.c
+++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.c
@@ -7,6 +7,7 @@
 #include <media/videobuf2-vmalloc.h>   /* for ISP params */
 #include <linux/delay.h>
 #include <linux/rk-preisp.h>
+#include <linux/slab.h>
 #include "dev.h"
 #include "regs.h"
 #include "regs_v2x.h"
diff --git a/drivers/media/platform/rockchip/ispp/common.c b/drivers/media/platform/rockchip/ispp/common.c
index efa25aadd66f..14adef4b2c44 100644
--- a/drivers/media/platform/rockchip/ispp/common.c
+++ b/drivers/media/platform/rockchip/ispp/common.c
@@ -4,6 +4,7 @@
 #include <media/videobuf2-dma-contig.h>
 #include <linux/delay.h>
 #include <linux/of_platform.h>
+#include <linux/slab.h>
 #include "dev.h"
 #include "regs.h"
 
diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c
index b589c46d3103..7922eea70ef9 100644
--- a/drivers/media/platform/rockchip/ispp/stream.c
+++ b/drivers/media/platform/rockchip/ispp/stream.c
@@ -4,6 +4,7 @@
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/pm_runtime.h>
+#include <linux/slab.h>
 #include <media/v4l2-common.h>
 #include <media/v4l2-event.h>
 #include <media/v4l2-fh.h>

commit 3045aa892206e8704965ffecf6e24c349b16a2f1
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Fri Jul 16 15:44:50 2021 +0800

    media: rockchip: isp: dmarx support yuv format
    
    Change-Id: I0375e0defa96bb3d3b1573170b203ecfce33219e
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/dmarx.c b/drivers/media/platform/rockchip/isp/dmarx.c
index 5e7166bc30ac..3e2749a7613d 100644
--- a/drivers/media/platform/rockchip/isp/dmarx.c
+++ b/drivers/media/platform/rockchip/isp/dmarx.c
@@ -177,6 +177,26 @@ static const struct capture_fmt rawrd_fmts[] = {
 		.fmt_type = FMT_BAYER,
 		.bpp = { 12 },
 		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_YUYV,
+		.fmt_type = FMT_YUV,
+		.bpp = { 16 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_YVYU,
+		.fmt_type = FMT_YUV,
+		.bpp = { 16 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_UYVY,
+		.fmt_type = FMT_YUV,
+		.bpp = { 16 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4L2_PIX_FMT_VYUY,
+		.fmt_type = FMT_YUV,
+		.bpp = { 16 },
+		.mplanes = 1,
 	}
 };
 
@@ -317,6 +337,12 @@ static int rawrd_config_mi(struct rkisp_stream *stream)
 	case V4L2_PIX_FMT_Y10:
 		val |= CIF_CSI2_DT_RAW10;
 		break;
+	case V4L2_PIX_FMT_YUYV:
+	case V4L2_PIX_FMT_YVYU:
+	case V4L2_PIX_FMT_UYVY:
+	case V4L2_PIX_FMT_VYUY:
+		val |= CIF_CSI2_DT_YUV422_8b;
+		break;
 	default:
 		val |= CIF_CSI2_DT_RAW12;
 	}
@@ -342,6 +368,21 @@ static void update_rawrd(struct rkisp_stream *stream)
 			    stream->curr_buf->buff_addr[RKISP_PLANE_Y],
 			    false);
 		stream->frame_end = false;
+		if (stream->id == RKISP_STREAM_RAWRD2 &&
+		    stream->out_isp_fmt.fmt_type == FMT_YUV) {
+			struct vb2_v4l2_buffer *vbuf = &stream->curr_buf->vb;
+			struct isp2x_csi_trigger trigger = {
+				.frame_timestamp = vbuf->vb2_buf.timestamp,
+				.sof_timestamp = vbuf->vb2_buf.timestamp,
+				.frame_id = vbuf->sequence,
+				.mode = T_START_X1,
+				.times = 0,
+			};
+
+			if (!vbuf->sequence)
+				trigger.frame_id = atomic_inc_return(&dev->isp_sdev.frm_sync_seq);
+			rkisp_rdbk_trigger_event(dev, T_CMD_QUEUE, &trigger);
+		}
 	} else if (dev->dmarx_dev.trigger == T_AUTO) {
 		/* internal raw wr/rd buf rotate */
 		struct rkisp_dummy_buffer *buf;
@@ -399,9 +440,10 @@ static int dmarx_frame_end(struct rkisp_stream *stream)
 					queue);
 		list_del(&stream->curr_buf->queue);
 	}
-	spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
 
-	stream->ops->update_mi(stream);
+	if (stream->streaming)
+		stream->ops->update_mi(stream);
+	spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
 	return 0;
 }
 
@@ -439,8 +481,8 @@ static int dmarx_start(struct rkisp_stream *stream)
 		return ret;
 
 	stream->curr_buf = NULL;
-	dmarx_frame_end(stream);
 	stream->streaming = true;
+	dmarx_frame_end(stream);
 	return 0;
 }
 
@@ -615,7 +657,7 @@ static int rkisp_init_vb2_queue(struct vb2_queue *q,
 	q->mem_ops = stream->ispdev->hw_dev->mem_ops;
 	q->buf_struct_size = sizeof(struct rkisp_buffer);
 	q->min_buffers_needed = CIF_ISP_REQ_BUFS_MIN;
-	q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
+	q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
 	q->lock = &stream->apilock;
 	q->dev = stream->ispdev->hw_dev->dev;
 	q->allow_cache_hints = 1;
@@ -967,6 +1009,7 @@ void rkisp_rawrd_set_pic_size(struct rkisp_device *dev,
 			      u32 width, u32 height)
 {
 	struct rkisp_isp_subdev *sdev = &dev->isp_sdev;
+	u8 mult = sdev->in_fmt.fmt_type == FMT_YUV ? 2 : 1;
 
 	/* rx height should equal to isp height + offset for read back mode */
 	height = sdev->in_crop.top + sdev->in_crop.height;
@@ -978,7 +1021,7 @@ void rkisp_rawrd_set_pic_size(struct rkisp_device *dev,
 	    dev->rd_mode == HDR_RDBK_FRAME1)
 		height += RKMODULE_EXTEND_LINE;
 
-	rkisp_write(dev, CSI2RX_RAW_RD_PIC_SIZE, height << 16 | width, false);
+	rkisp_write(dev, CSI2RX_RAW_RD_PIC_SIZE, height << 16 | width * mult, false);
 }
 
 void rkisp_dmarx_get_frame(struct rkisp_device *dev, u32 *id,
diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c
index 08cfeab7db28..ba77e7886816 100644
--- a/drivers/media/platform/rockchip/isp/rkisp.c
+++ b/drivers/media/platform/rockchip/isp/rkisp.c
@@ -81,8 +81,6 @@
  * +---------------------------------------------------------+
  */
 
-static int rkisp_rdbk_trigger_event(struct rkisp_device *dev, u32 cmd, void *arg);
-
 struct backup_reg {
 	const u32 base;
 	const u32 shd;
@@ -666,7 +664,7 @@ static void rkisp_rdbk_trigger_handle(struct rkisp_device *dev, u32 cmd)
 		rkisp_trigger_read_back(isp, times, mode, false);
 }
 
-static int rkisp_rdbk_trigger_event(struct rkisp_device *dev, u32 cmd, void *arg)
+int rkisp_rdbk_trigger_event(struct rkisp_device *dev, u32 cmd, void *arg)
 {
 	struct kfifo *fifo = &dev->rdbk_kfifo;
 	struct isp2x_csi_trigger *trigger = NULL;
diff --git a/drivers/media/platform/rockchip/isp/rkisp.h b/drivers/media/platform/rockchip/isp/rkisp.h
index 39266569e14c..bb1239829835 100644
--- a/drivers/media/platform/rockchip/isp/rkisp.h
+++ b/drivers/media/platform/rockchip/isp/rkisp.h
@@ -168,6 +168,8 @@ void rkisp_check_idle(struct rkisp_device *dev, u32 irq);
 
 void rkisp_trigger_read_back(struct rkisp_device *dev, u8 dma2frm, u32 mode, bool is_try);
 
+int rkisp_rdbk_trigger_event(struct rkisp_device *dev, u32 cmd, void *arg);
+
 static inline
 struct ispsd_out_fmt *rkisp_get_ispsd_out_fmt(struct rkisp_isp_subdev *isp_sdev)
 {

commit 05ef3436f7a98b528dbc9149f134789819bb3a6f
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Fri Jul 16 15:37:20 2021 +0800

    media: videobuf2-v4l2: copy user image sequence for output video
    
    Video output device is images from user space to the driver,
    Sequence set to 0 default when fill vb2 buffer. For driver maybe
    need image sequence information.
    
    Change-Id: I34f39a98c6fa8dfa1ea2c45cfa7e6b20114236a3
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c b/drivers/media/common/videobuf2/videobuf2-v4l2.c
index a7d60a7b1c8b..4b1ac1a6a8e9 100644
--- a/drivers/media/common/videobuf2/videobuf2-v4l2.c
+++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c
@@ -479,6 +479,8 @@ static int __fill_vb2_buffer(struct vb2_buffer *vb,
 		 */
 		vbuf->flags &= ~V4L2_BUF_FLAG_TIMECODE;
 		vbuf->field = b->field;
+		/* get image sequence from user space */
+		vbuf->sequence = b->sequence;
 	} else {
 		/* Zero any output buffer flags as this is a capture buffer */
 		vbuf->flags &= ~V4L2_BUFFER_OUT_FLAGS;

commit 48d73c60c270d42146dba7c094e3a58576bb893c
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Wed Jul 21 09:51:20 2021 +0800

    media: rockchip: isp1: clean list when stream failed
    
    Change-Id: Ib9ebf27d7b3e7e3952f95e37dcaea90faf1411f8
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp1/capture.c b/drivers/media/platform/rockchip/isp1/capture.c
index e61d59a4000a..1938ed86b86c 100644
--- a/drivers/media/platform/rockchip/isp1/capture.c
+++ b/drivers/media/platform/rockchip/isp1/capture.c
@@ -1412,25 +1412,12 @@ static void rkisp1_destroy_dummy_buf(struct rkisp1_stream *stream)
 			  dummy_buf->vaddr, dummy_buf->dma_addr);
 }
 
-static void rkisp1_stop_streaming(struct vb2_queue *queue)
+static void destroy_buf_queue(struct rkisp1_stream *stream,
+			      enum vb2_buffer_state state)
 {
-	struct rkisp1_stream *stream = queue->drv_priv;
-	struct rkisp1_vdev_node *node = &stream->vnode;
-	struct rkisp1_device *dev = stream->ispdev;
-	struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
 	struct rkisp1_buffer *buf;
 	unsigned long lock_flags = 0;
-	int ret;
-
-	rkisp1_stream_stop(stream);
-	/* 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 error:%d\n",
-			 ret);
 
-	/* release buffers */
 	spin_lock_irqsave(&stream->vbq_lock, lock_flags);
 	if (stream->curr_buf) {
 		list_add_tail(&stream->curr_buf->queue, &stream->buf_queue);
@@ -1449,6 +1436,26 @@ static void rkisp1_stop_streaming(struct vb2_queue *queue)
 		vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
 	}
 	spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
+}
+
+static void rkisp1_stop_streaming(struct vb2_queue *queue)
+{
+	struct rkisp1_stream *stream = queue->drv_priv;
+	struct rkisp1_vdev_node *node = &stream->vnode;
+	struct rkisp1_device *dev = stream->ispdev;
+	struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
+	int ret;
+
+	rkisp1_stream_stop(stream);
+	/* 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 error:%d\n",
+			 ret);
+
+	/* release buffers */
+	destroy_buf_queue(stream, VB2_BUF_STATE_ERROR);
 
 	ret = dev->pipe.close(&dev->pipe);
 	if (ret < 0)
@@ -1499,7 +1506,6 @@ rkisp1_start_streaming(struct vb2_queue *queue, unsigned int count)
 	struct rkisp1_device *dev = stream->ispdev;
 	struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
 	int ret;
-	unsigned int i;
 
 	if (WARN_ON(stream->streaming))
 		return -EBUSY;
@@ -1569,14 +1575,8 @@ rkisp1_start_streaming(struct vb2_queue *queue, unsigned int count)
 destroy_dummy_buf:
 	rkisp1_destroy_dummy_buf(stream);
 buffer_done:
-	for (i = 0; i < queue->num_buffers; ++i) {
-		struct vb2_buffer *vb;
-
-		vb = queue->bufs[i];
-		if (vb->state == VB2_BUF_STATE_ACTIVE)
-			vb2_buffer_done(vb, VB2_BUF_STATE_QUEUED);
-	}
-
+	destroy_buf_queue(stream, VB2_BUF_STATE_QUEUED);
+	stream->streaming = false;
 	return ret;
 }
 

commit 186c8cf22d96447080b4b0a5e7ce0da42cba1b98
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Wed Jul 14 20:15:43 2021 +0200

    ANDROID: GKI: fix up crc change in ip.h
    
    Commit 92071a2b8f7f ("net: lwtunnel: handle MTU calculation in
    forwading") was backported to 5.4.132 and it caused a crc change in
    include/net/ip.h due to a new .h file being included.
    
    No real abi change happened here, so just #ifdef the .h file out when
    doing the crc check.
    
    Bug: 161946584
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I1bad0458bc0f9130239fc94ca982e800681cd443

diff --git a/include/net/ip.h b/include/net/ip.h
index e8fa25280cbf..3c45d8f2cfc9 100644
--- a/include/net/ip.h
+++ b/include/net/ip.h
@@ -34,7 +34,9 @@
 #include <net/flow.h>
 #include <net/flow_dissector.h>
 #include <net/netns/hash.h>
+#ifndef __GENKSYMS__
 #include <net/lwtunnel.h>
+#endif
 
 #define IPV4_MAX_PMTU		65535U		/* RFC 2675, Section 5.1 */
 #define IPV4_MIN_MTU		68			/* RFC 791 */

commit 97fd50773c53b968141bc2a95a47348792f52da2
Merge: 95492b1e348d 4938296e03bd
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Tue Jul 20 16:38:59 2021 +0200

    Merge 4.19.198 into android-4.19-stable
    
    Changes in 4.19.198
            scsi: core: Retry I/O for Notify (Enable Spinup) Required error
            ALSA: usb-audio: fix rate on Ozone Z90 USB headset
            ALSA: usb-audio: Fix OOB access at proc output
            media: dvb-usb: fix wrong definition
            Input: usbtouchscreen - fix control-request directions
            net: can: ems_usb: fix use-after-free in ems_usb_disconnect()
            usb: gadget: eem: fix echo command packet response issue
            USB: cdc-acm: blacklist Heimann USB Appset device
            usb: dwc3: Fix debugfs creation flow
            usb: typec: Add the missed altmode_id_remove() in typec_register_altmode()
            xhci: solve a double free problem while doing s4
            ntfs: fix validity check for file name attribute
            iov_iter_fault_in_readable() should do nothing in xarray case
            Input: joydev - prevent use of not validated data in JSIOCSBTNMAP ioctl
            arm_pmu: Fix write counter incorrect in ARMv7 big-endian mode
            ARM: dts: at91: sama5d4: fix pinctrl muxing
            btrfs: send: fix invalid path for unlink operations after parent orphanization
            btrfs: clear defrag status of a root if starting transaction fails
            ext4: cleanup in-core orphan list if ext4_truncate() failed to get a transaction handle
            ext4: fix kernel infoleak via ext4_extent_header
            ext4: return error code when ext4_fill_flex_info() fails
            ext4: correct the cache_nr in tracepoint ext4_es_shrink_exit
            ext4: remove check for zero nr_to_scan in ext4_es_scan()
            ext4: fix avefreec in find_group_orlov
            ext4: use ext4_grp_locked_error in mb_find_extent
            can: bcm: delay release of struct bcm_op after synchronize_rcu()
            can: gw: synchronize rcu operations before removing gw job entry
            can: peak_pciefd: pucan_handle_status(): fix a potential starvation issue in TX path
            SUNRPC: Fix the batch tasks count wraparound.
            SUNRPC: Should wake up the privileged task firstly.
            s390/cio: dont call css_wait_for_slow_path() inside a lock
            rtc: stm32: Fix unbalanced clk_disable_unprepare() on probe error path
            iio: light: tcs3472: do not free unallocated IRQ
            iio: ltr501: mark register holding upper 8 bits of ALS_DATA{0,1} and PS_DATA as volatile, too
            iio: ltr501: ltr559: fix initialization of LTR501_ALS_CONTR
            iio: ltr501: ltr501_read_ps(): add missing endianness conversion
            serial: sh-sci: Stop dmaengine transfer in sci_stop_tx()
            serial_cs: Add Option International GSM-Ready 56K/ISDN modem
            serial_cs: remove wrong GLOBETROTTER.cis entry
            ath9k: Fix kernel NULL pointer dereference during ath_reset_internal()
            ssb: sdio: Don't overwrite const buffer if block_write fails
            rsi: Assign beacon rate settings to the correct rate_info descriptor field
            rsi: fix AP mode with WPA failure due to encrypted EAPOL
            tracing/histograms: Fix parsing of "sym-offset" modifier
            tracepoint: Add tracepoint_probe_register_may_exist() for BPF tracing
            seq_buf: Make trace_seq_putmem_hex() support data longer than 8
            powerpc/stacktrace: Fix spurious "stale" traces in raise_backtrace_ipi()
            evm: Execute evm_inode_init_security() only when an HMAC key is loaded
            evm: Refuse EVM_ALLOW_METADATA_WRITES only if an HMAC key is loaded
            fuse: check connected before queueing on fpq->io
            spi: Make of_register_spi_device also set the fwnode
            spi: spi-loopback-test: Fix 'tx_buf' might be 'rx_buf'
            spi: spi-topcliff-pch: Fix potential double free in pch_spi_process_messages()
            spi: omap-100k: Fix the length judgment problem
            regulator: uniphier: Add missing MODULE_DEVICE_TABLE
            crypto: nx - add missing MODULE_DEVICE_TABLE
            media: cpia2: fix memory leak in cpia2_usb_probe
            media: cobalt: fix race condition in setting HPD
            media: pvrusb2: fix warning in pvr2_i2c_core_done
            crypto: qat - check return code of qat_hal_rd_rel_reg()
            crypto: qat - remove unused macro in FW loader
            sched/fair: Fix ascii art by relpacing tabs
            media: em28xx: Fix possible memory leak of em28xx struct
            media: v4l2-core: Avoid the dangling pointer in v4l2_fh_release
            media: bt8xx: Fix a missing check bug in bt878_probe
            media: st-hva: Fix potential NULL pointer dereferences
            media: dvd_usb: memory leak in cinergyt2_fe_attach
            mmc: via-sdmmc: add a check against NULL pointer dereference
            crypto: shash - avoid comparing pointers to exported functions under CFI
            media: dvb_net: avoid speculation from net slot
            media: siano: fix device register error path
            media: imx-csi: Skip first few frames from a BT.656 source
            btrfs: fix error handling in __btrfs_update_delayed_inode
            btrfs: abort transaction if we fail to update the delayed inode
            btrfs: disable build on platforms having page size 256K
            regulator: da9052: Ensure enough delay time for .set_voltage_time_sel
            HID: do not use down_interruptible() when unbinding devices
            EDAC/ti: Add missing MODULE_DEVICE_TABLE
            ACPI: processor idle: Fix up C-state latency if not ordered
            hv_utils: Fix passing zero to 'PTR_ERR' warning
            lib: vsprintf: Fix handling of number field widths in vsscanf
            ACPI: EC: Make more Asus laptops use ECDT _GPE
            block_dump: remove block_dump feature in mark_inode_dirty()
            fs: dlm: cancel work sync othercon
            random32: Fix implicit truncation warning in prandom_seed_state()
            fs: dlm: fix memory leak when fenced
            ACPICA: Fix memory leak caused by _CID repair function
            ACPI: bus: Call kobject_put() in acpi_init() error path
            platform/x86: toshiba_acpi: Fix missing error code in toshiba_acpi_setup_keyboard()
            clocksource: Retry clock read if long delays detected
            ACPI: tables: Add custom DSDT file as makefile prerequisite
            HID: wacom: Correct base usage for capacitive ExpressKey status bits
            ia64: mca_drv: fix incorrect array size calculation
            media: s5p_cec: decrement usage count if disabled
            crypto: ixp4xx - dma_unmap the correct address
            crypto: ux500 - Fix error return code in hash_hw_final()
            sata_highbank: fix deferred probing
            pata_rb532_cf: fix deferred probing
            media: I2C: change 'RST' to "RSET" to fix multiple build errors
            pata_octeon_cf: avoid WARN_ON() in ata_host_activate()
            evm: fix writing <securityfs>/evm overflow
            crypto: ccp - Fix a resource leak in an error handling path
            media: rc: i2c: Fix an error message
            pata_ep93xx: fix deferred probing
            media: exynos4-is: Fix a use after free in isp_video_release
            media: tc358743: Fix error return code in tc358743_probe_of()
            media: gspca/gl860: fix zero-length control requests
            media: siano: Fix out-of-bounds warnings in smscore_load_firmware_family2()
            mmc: usdhi6rol0: fix error return code in usdhi6_probe()
            media: s5p-g2d: Fix a memory leak on ctx->fh.m2m_ctx
            hwmon: (max31722) Remove non-standard ACPI device IDs
            hwmon: (max31790) Fix fan speed reporting for fan7..12
            btrfs: clear log tree recovering status if starting transaction fails
            spi: spi-sun6i: Fix chipselect/clock bug
            crypto: nx - Fix RCU warning in nx842_OF_upd_status
            ACPI: sysfs: Fix a buffer overrun problem with description_show()
            blk-wbt: introduce a new disable state to prevent false positive by rwb_enabled()
            blk-wbt: make sure throttle is enabled properly
            ocfs2: fix snprintf() checking
            net: mvpp2: Put fwnode in error case during ->probe()
            net: pch_gbe: Propagate error from devm_gpio_request_one()
            drm/rockchip: cdn-dp-core: add missing clk_disable_unprepare() on error in cdn_dp_grf_write()
            ehea: fix error return code in ehea_restart_qps()
            RDMA/rxe: Fix failure during driver load
            drm: qxl: ensure surf.data is ininitialized
            tools/bpftool: Fix error return code in do_batch()
            wireless: carl9170: fix LEDS build errors & warnings
            ieee802154: hwsim: Fix possible memory leak in hwsim_subscribe_all_others
            wcn36xx: Move hal_buf allocation to devm_kmalloc in probe
            ssb: Fix error return code in ssb_bus_scan()
            brcmfmac: fix setting of station info chains bitmask
            brcmfmac: correctly report average RSSI in station info
            brcmsmac: mac80211_if: Fix a resource leak in an error handling path
            ath10k: Fix an error code in ath10k_add_interface()
            netlabel: Fix memory leak in netlbl_mgmt_add_common
            RDMA/mlx5: Don't add slave port to unaffiliated list
            netfilter: nft_exthdr: check for IPv6 packet before further processing
            netfilter: nft_osf: check for TCP packet before further processing
            netfilter: nft_tproxy: restrict support to TCP and UDP transport protocols
            RDMA/rxe: Fix qp reference counting for atomic ops
            samples/bpf: Fix the error return code of xdp_redirect's main()
            net: ethernet: aeroflex: fix UAF in greth_of_remove
            net: ethernet: ezchip: fix UAF in nps_enet_remove
            net: ethernet: ezchip: fix error handling
            pkt_sched: sch_qfq: fix qfq_change_class() error path
            vxlan: add missing rcu_read_lock() in neigh_reduce()
            net/ipv4: swap flow ports when validating source
            ieee802154: hwsim: Fix memory leak in hwsim_add_one
            ieee802154: hwsim: avoid possible crash in hwsim_del_edge_nl()
            mac80211: remove iwlwifi specific workaround NDPs of null_response
            net: bcmgenet: Fix attaching to PYH failed on RPi 4B
            ipv6: exthdrs: do not blindly use init_net
            bpf: Do not change gso_size during bpf_skb_change_proto()
            i40e: Fix error handling in i40e_vsi_open
            i40e: Fix autoneg disabling for non-10GBaseT links
            Revert "ibmvnic: remove duplicate napi_schedule call in open function"
            ibmvnic: free tx_pool if tso_pool alloc fails
            ipv6: fix out-of-bound access in ip6_parse_tlv()
            Bluetooth: mgmt: Fix slab-out-of-bounds in tlv_data_is_valid
            Bluetooth: Fix handling of HCI_LE_Advertising_Set_Terminated event
            writeback: fix obtain a reference to a freeing memcg css
            net: lwtunnel: handle MTU calculation in forwading
            net: sched: fix warning in tcindex_alloc_perfect_hash
            RDMA/mlx5: Don't access NULL-cleared mpi pointer
            tty: nozomi: Fix a resource leak in an error handling function
            mwifiex: re-fix for unaligned accesses
            iio: adis_buffer: do not return ints in irq handlers
            iio: accel: bma180: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
            iio: accel: bma220: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
            iio: accel: hid: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
            iio: accel: kxcjk-1013: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
            iio: accel: stk8312: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
            iio: accel: stk8ba50: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
            iio: adc: ti-ads1015: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
            iio: adc: vf610: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
            iio: gyro: bmg160: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
            iio: humidity: am2315: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
            iio: prox: srf08: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
            iio: prox: pulsed-light: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
            iio: prox: as3935: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
            iio: light: isl29125: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
            iio: light: tcs3414: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
            iio: light: tcs3472: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
            iio: potentiostat: lmp91000: Fix alignment of buffer in iio_push_to_buffers_with_timestamp()
            ASoC: hisilicon: fix missing clk_disable_unprepare() on error in hi6210_i2s_startup()
            ASoC: rsnd: tidyup loop on rsnd_adg_clk_query()
            Input: hil_kbd - fix error return code in hil_dev_connect()
            char: pcmcia: error out if 'num_bytes_read' is greater than 4 in set_protocol()
            tty: nozomi: Fix the error handling path of 'nozomi_card_init()'
            scsi: FlashPoint: Rename si_flags field
            fsi: core: Fix return of error values on failures
            fsi: scom: Reset the FSI2PIB engine for any error
            fsi/sbefifo: Clean up correct FIFO when receiving reset request from SBE
            fsi/sbefifo: Fix reset timeout
            visorbus: fix error return code in visorchipset_init()
            s390: appldata depends on PROC_SYSCTL
            eeprom: idt_89hpesx: Put fwnode in matching case during ->probe()
            eeprom: idt_89hpesx: Restore printing the unsupported fwnode name
            iio: adc: hx711: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
            iio: adc: mxs-lradc: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
            iio: adc: ti-ads8688: Fix alignment of buffer in iio_push_to_buffers_with_timestamp()
            staging: gdm724x: check for buffer overflow in gdm_lte_multi_sdu_pkt()
            staging: gdm724x: check for overflow in gdm_lte_netif_rx()
            staging: mt7621-dts: fix pci address for PCI memory range
            serial: 8250: Actually allow UPF_MAGIC_MULTIPLIER baud rates
            iio: prox: isl29501: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
            ASoC: cs42l42: Correct definition of CS42L42_ADC_PDN_MASK
            of: Fix truncation of memory sizes on 32-bit platforms
            mtd: rawnand: marvell: add missing clk_disable_unprepare() on error in marvell_nfc_resume()
            scsi: mpt3sas: Fix error return value in _scsih_expander_add()
            phy: ti: dm816x: Fix the error handling path in 'dm816x_usb_phy_probe()
            extcon: sm5502: Drop invalid register write in sm5502_reg_data
            extcon: max8997: Add missing modalias string
            ASoC: atmel-i2s: Fix usage of capture and playback at the same time
            configfs: fix memleak in configfs_release_bin_file
            leds: as3645a: Fix error return code in as3645a_parse_node()
            leds: ktd2692: Fix an error handling path
            powerpc: Offline CPU in stop_this_cpu()
            serial: mvebu-uart: correctly calculate minimal possible baudrate
            arm64: dts: marvell: armada-37xx: Fix reg for standard variant of UART
            vfio/pci: Handle concurrent vma faults
            mm/huge_memory.c: don't discard hugepage if other processes are mapping it
            selftests/vm/pkeys: fix alloc_random_pkey() to make it really, really random
            perf llvm: Return -ENOMEM when asprintf() fails
            mmc: block: Disable CMDQ on the ioctl path
            mmc: vub3000: fix control-request direction
            drm/mxsfb: Don't select DRM_KMS_FB_HELPER
            drm/zte: Don't select DRM_KMS_FB_HELPER
            drm/amd/amdgpu/sriov disable all ip hw status by default
            net: pch_gbe: Use proper accessors to BE data in pch_ptp_match()
            drm/amd/display: fix use_max_lb flag for 420 pixel formats
            hugetlb: clear huge pte during flush function on mips platform
            atm: iphase: fix possible use-after-free in ia_module_exit()
            mISDN: fix possible use-after-free in HFC_cleanup()
            atm: nicstar: Fix possible use-after-free in nicstar_cleanup()
            net: Treat __napi_schedule_irqoff() as __napi_schedule() on PREEMPT_RT
            reiserfs: add check for invalid 1st journal block
            drm/virtio: Fix double free on probe failure
            udf: Fix NULL pointer dereference in udf_symlink function
            e100: handle eeprom as little endian
            clk: renesas: r8a77995: Add ZA2 clock
            clk: tegra: Ensure that PLLU configuration is applied properly
            ipv6: use prandom_u32() for ID generation
            RDMA/cxgb4: Fix missing error code in create_qp()
            dm space maps: don't reset space map allocation cursor when committing
            pinctrl: mcp23s08: fix race condition in irq handler
            ice: set the value of global config lock timeout longer
            virtio_net: Remove BUG() to avoid machine dead
            net: bcmgenet: check return value after calling platform_get_resource()
            net: mvpp2: check return value after calling platform_get_resource()
            net: micrel: check return value after calling platform_get_resource()
            fjes: check return value after calling platform_get_resource()
            selinux: use __GFP_NOWARN with GFP_NOWAIT in the AVC
            xfrm: Fix error reporting in xfrm_state_construct.
            wlcore/wl12xx: Fix wl12xx get_mac error if device is in ELP
            wl1251: Fix possible buffer overflow in wl1251_cmd_scan
            cw1200: add missing MODULE_DEVICE_TABLE
            net: fix mistake path for netdev_features_strings
            rtl8xxxu: Fix device info for RTL8192EU devices
            MIPS: add PMD table accounting into MIPS'pmd_alloc_one
            atm: nicstar: use 'dma_free_coherent' instead of 'kfree'
            atm: nicstar: register the interrupt handler in the right place
            vsock: notify server to shutdown when client has pending signal
            RDMA/rxe: Don't overwrite errno from ib_umem_get()
            iwlwifi: mvm: don't change band on bound PHY contexts
            iwlwifi: pcie: free IML DMA memory allocation
            sfc: avoid double pci_remove of VFs
            sfc: error code if SRIOV cannot be disabled
            wireless: wext-spy: Fix out-of-bounds warning
            media, bpf: Do not copy more entries than user space requested
            net: ip: avoid OOM kills with large UDP sends over loopback
            RDMA/cma: Fix rdma_resolve_route() memory leak
            Bluetooth: Fix the HCI to MGMT status conversion table
            Bluetooth: Shutdown controller after workqueues are flushed or cancelled
            Bluetooth: btusb: fix bt fiwmare downloading failure issue for qca btsoc.
            sctp: validate from_addr_param return
            sctp: add size validation when walking chunks
            MIPS: set mips32r5 for virt extensions
            fscrypt: don't ignore minor_hash when hash is 0
            bdi: Do not use freezable workqueue
            serial: mvebu-uart: clarify the baud rate derivation
            serial: mvebu-uart: fix calculation of clock divisor
            fuse: reject internal errno
            powerpc/barrier: Avoid collision with clang's __lwsync macro
            usb: gadget: f_fs: Fix setting of device and driver data cross-references
            drm/radeon: Add the missed drm_gem_object_put() in radeon_user_framebuffer_create()
            drm/amd/display: fix incorrrect valid irq check
            pinctrl/amd: Add device HID for new AMD GPIO controller
            drm/msm/mdp4: Fix modifier support enabling
            mmc: sdhci: Fix warning message when accessing RPMB in HS400 mode
            mmc: core: clear flags before allowing to retune
            mmc: core: Allow UHS-I voltage switch for SDSC cards if supported
            ata: ahci_sunxi: Disable DIPM
            cpu/hotplug: Cure the cpusets trainwreck
            clocksource/arm_arch_timer: Improve Allwinner A64 timer workaround
            ASoC: tegra: Set driver_name=tegra for all machine drivers
            qemu_fw_cfg: Make fw_cfg_rev_attr a proper kobj_attribute
            ipmi/watchdog: Stop watchdog timer when the current action is 'none'
            power: supply: ab8500: Fix an old bug
            seq_buf: Fix overflow in seq_buf_putmem_hex()
            tracing: Simplify & fix saved_tgids logic
            tracing: Resize tgid_map to pid_max, not PID_MAX_DEFAULT
            ipack/carriers/tpci200: Fix a double free in tpci200_pci_probe
            coresight: tmc-etf: Fix global-out-of-bounds in tmc_update_etf_buffer()
            dm btree remove: assign new_root only when removal succeeds
            PCI: Leave Apple Thunderbolt controllers on for s2idle or standby
            PCI: aardvark: Fix checking for PIO Non-posted Request
            media: subdev: disallow ioctl for saa6588/davinci
            media: dtv5100: fix control-request directions
            media: zr364xx: fix memory leak in zr364xx_start_readpipe
            media: gspca/sq905: fix control-request direction
            media: gspca/sunplus: fix zero-length control requests
            media: uvcvideo: Fix pixel format change for Elgato Cam Link 4K
            pinctrl: mcp23s08: Fix missing unlock on error in mcp23s08_irq()
            jfs: fix GPF in diFree
            smackfs: restrict bytes count in smk_set_cipso()
            KVM: x86: Use guest MAXPHYADDR from CPUID.0x8000_0008 iff TDP is enabled
            KVM: X86: Disable hardware breakpoints unconditionally before kvm_x86->run()
            scsi: core: Fix bad pointer dereference when ehandler kthread is invalid
            tracing: Do not reference char * as a string in histograms
            PCI: aardvark: Don't rely on jiffies while holding spinlock
            PCI: aardvark: Fix kernel panic during PIO transfer
            tty: serial: fsl_lpuart: fix the potential risk of division or modulo by zero
            misc/libmasm/module: Fix two use after free in ibmasm_init_one
            Revert "ALSA: bebob/oxfw: fix Kconfig entry for Mackie d.2 Pro"
            w1: ds2438: fixing bug that would always get page0
            scsi: lpfc: Fix "Unexpected timeout" error in direct attach topology
            scsi: lpfc: Fix crash when lpfc_sli4_hba_setup() fails to initialize the SGLs
            scsi: core: Cap scsi_host cmd_per_lun at can_queue
            ALSA: ac97: fix PM reference leak in ac97_bus_remove()
            tty: serial: 8250: serial_cs: Fix a memory leak in error handling path
            scsi: scsi_dh_alua: Check for negative result value
            fs/jfs: Fix missing error code in lmLogInit()
            scsi: iscsi: Add iscsi_cls_conn refcount helpers
            scsi: iscsi: Fix conn use after free during resets
            scsi: iscsi: Fix shost->max_id use
            scsi: qedi: Fix null ref during abort handling
            mfd: da9052/stmpe: Add and modify MODULE_DEVICE_TABLE
            s390/sclp_vt220: fix console name to match device
            selftests: timers: rtcpie: skip test if default RTC device does not exist
            ALSA: sb: Fix potential double-free of CSP mixer elements
            powerpc/ps3: Add dma_mask to ps3_dma_region
            gpio: zynq: Check return value of pm_runtime_get_sync
            ALSA: ppc: fix error return code in snd_pmac_probe()
            selftests/powerpc: Fix "no_handler" EBB selftest
            gpio: pca953x: Add support for the On Semi pca9655
            ASoC: soc-core: Fix the error return code in snd_soc_of_parse_audio_routing()
            Input: hideep - fix the uninitialized use in hideep_nvm_unlock()
            ALSA: bebob: add support for ToneWeal FW66
            usb: gadget: f_hid: fix endianness issue with descriptors
            usb: gadget: hid: fix error return code in hid_bind()
            powerpc/boot: Fixup device-tree on little endian
            backlight: lm3630a: Fix return code of .update_status() callback
            ALSA: hda: Add IRQ check for platform_get_irq()
            staging: rtl8723bs: fix macro value for 2.4Ghz only device
            intel_th: Wait until port is in reset before programming it
            i2c: core: Disable client irq on reboot/shutdown
            lib/decompress_unlz4.c: correctly handle zero-padding around initrds.
            pwm: spear: Don't modify HW state in .remove callback
            power: supply: ab8500: Avoid NULL pointers
            power: supply: max17042: Do not enforce (incorrect) interrupt trigger type
            power: reset: gpio-poweroff: add missing MODULE_DEVICE_TABLE
            ARM: 9087/1: kprobes: test-thumb: fix for LLVM_IAS=1
            watchdog: Fix possible use-after-free in wdt_startup()
            watchdog: sc520_wdt: Fix possible use-after-free in wdt_turnoff()
            watchdog: Fix possible use-after-free by calling del_timer_sync()
            watchdog: iTCO_wdt: Account for rebooting on second timeout
            x86/fpu: Return proper error codes from user access functions
            PCI: tegra: Add missing MODULE_DEVICE_TABLE
            orangefs: fix orangefs df output.
            ceph: remove bogus checks and WARN_ONs from ceph_set_page_dirty
            NFS: nfs_find_open_context() may only select open files
            power: supply: charger-manager: add missing MODULE_DEVICE_TABLE
            power: supply: ab8500: add missing MODULE_DEVICE_TABLE
            pwm: tegra: Don't modify HW state in .remove callback
            ACPI: AMBA: Fix resource name in /proc/iomem
            ACPI: video: Add quirk for the Dell Vostro 3350
            virtio-blk: Fix memory leak among suspend/resume procedure
            virtio_net: Fix error handling in virtnet_restore()
            virtio_console: Assure used length from device is limited
            f2fs: add MODULE_SOFTDEP to ensure crc32 is included in the initramfs
            PCI/sysfs: Fix dsm_label_utf16s_to_utf8s() buffer overrun
            power: supply: rt5033_battery: Fix device tree enumeration
            NFSv4: Initialise connection to the server in nfs4_alloc_client()
            um: fix error return code in slip_open()
            um: fix error return code in winch_tramp()
            watchdog: aspeed: fix hardware timeout calculation
            nfs: fix acl memory leak of posix_acl_create()
            ubifs: Set/Clear I_LINKABLE under i_lock for whiteout inode
            PCI: iproc: Fix multi-MSI base vector number allocation
            PCI: iproc: Support multi-MSI only on uniprocessor kernel
            x86/fpu: Limit xstate copy size in xstateregs_set()
            virtio_net: move tx vq operation under tx queue lock
            ALSA: isa: Fix error return code in snd_cmi8330_probe()
            NFSv4/pNFS: Don't call _nfs4_pnfs_v3_ds_connect multiple times
            hexagon: use common DISCARDS macro
            reset: a10sr: add missing of_match_table reference
            ARM: dts: exynos: fix PWM LED max brightness on Odroid XU/XU3
            ARM: dts: exynos: fix PWM LED max brightness on Odroid HC1
            ARM: dts: exynos: fix PWM LED max brightness on Odroid XU4
            memory: atmel-ebi: add missing of_node_put for loop iteration
            rtc: fix snprintf() checking in is_rtc_hctosys()
            arm64: dts: renesas: v3msk: Fix memory size
            ARM: dts: r8a7779, marzen: Fix DU clock names
            ARM: dts: BCM5301X: Fixup SPI binding
            reset: bail if try_module_get() fails
            memory: fsl_ifc: fix leak of IO mapping on probe failure
            memory: fsl_ifc: fix leak of private memory on probe failure
            ARM: dts: am335x: align ti,pindir-d0-out-d1-in property with dt-shema
            ARM: dts: am437x: align ti,pindir-d0-out-d1-in property with dt-shema
            ARM: dts: imx6q-dhcom: Fix ethernet reset time properties
            ARM: dts: imx6q-dhcom: Fix ethernet plugin detection problems
            ARM: dts: imx6q-dhcom: Add gpios pinctrl for i2c bus recovery
            scsi: be2iscsi: Fix an error handling path in beiscsi_dev_probe()
            mips: always link byteswap helpers into decompressor
            mips: disable branch profiling in boot/decompress.o
            MIPS: vdso: Invalid GIC access through VDSO
            net: bridge: multicast: fix PIM hello router port marking race
            scsi: scsi_dh_alua: Fix signedness bug in alua_rtpg()
            seq_file: disallow extremely large seq buffer allocations
            Linux 4.19.198
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: Iaa8a95c4d30ca85021bae6c60b4818038797e04e

commit 4938296e03bd227e5020d63d418956fe52baf97c
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Tue Jul 20 16:16:16 2021 +0200

    Linux 4.19.198
    
    Link: https://lore.kernel.org/r/20210719144946.310399455@linuxfoundation.org
    Link: https://lore.kernel.org/r/20210719184335.198051502@linuxfoundation.org
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Hulk Robot <hulkrobot@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index 42073a4c6e2e..09688ffc3f00 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 197
+SUBLEVEL = 198
 EXTRAVERSION =
 NAME = "People's Front"
 

commit 6de9f0bf7cacc772a618699f9ed5c9f6fca58a1d
Author: Eric Sandeen <sandeen@redhat.com>
Date:   Tue Jul 13 17:49:23 2021 +0200

    seq_file: disallow extremely large seq buffer allocations
    
    commit 8cae8cd89f05f6de223d63e6d15e31c8ba9cf53b upstream.
    
    There is no reasonable need for a buffer larger than this, and it avoids
    int overflow pitfalls.
    
    Fixes: 058504edd026 ("fs/seq_file: fallback to vmalloc allocation")
    Suggested-by: Al Viro <viro@zeniv.linux.org.uk>
    Reported-by: Qualys Security Advisory <qsa@qualys.com>
    Signed-off-by: Eric Sandeen <sandeen@redhat.com>
    Cc: stable@kernel.org
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/seq_file.c b/fs/seq_file.c
index 05e58b56f620..e11f62b29be8 100644
--- a/fs/seq_file.c
+++ b/fs/seq_file.c
@@ -29,6 +29,9 @@ static void seq_set_overflow(struct seq_file *m)
 
 static void *seq_buf_alloc(unsigned long size)
 {
+	if (unlikely(size > MAX_RW_COUNT))
+		return NULL;
+
 	return kvmalloc(size, GFP_KERNEL_ACCOUNT);
 }
 

commit c021be62bbcbf5435ec89713ed542040196f5b89
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Thu Jun 3 15:33:20 2021 +0300

    scsi: scsi_dh_alua: Fix signedness bug in alua_rtpg()
    
    commit 80927822e8b6be46f488524cd7d5fe683de97fc4 upstream.
    
    The "retval" variable needs to be signed for the error handling to work.
    
    Link: https://lore.kernel.org/r/YLjMEAFNxOas1mIp@mwanda
    Fixes: 7e26e3ea0287 ("scsi: scsi_dh_alua: Check for negative result value")
    Reviewed-by: Martin Wilck <mwilck@suse.com>
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/scsi/device_handler/scsi_dh_alua.c b/drivers/scsi/device_handler/scsi_dh_alua.c
index 41e8c9e68878..4cf7c3348bff 100644
--- a/drivers/scsi/device_handler/scsi_dh_alua.c
+++ b/drivers/scsi/device_handler/scsi_dh_alua.c
@@ -522,7 +522,8 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_port_group *pg)
 	struct alua_port_group *tmp_pg;
 	int len, k, off, bufflen = ALUA_RTPG_SIZE;
 	unsigned char *desc, *buff;
-	unsigned err, retval;
+	unsigned err;
+	int retval;
 	unsigned int tpg_desc_tbl_off;
 	unsigned char orig_transition_tmo;
 	unsigned long flags;

commit 2e70bf39b1a96b40ab13044729613a913b46cddd
Author: Nikolay Aleksandrov <nikolay@nvidia.com>
Date:   Sun Jul 11 12:56:28 2021 +0300

    net: bridge: multicast: fix PIM hello router port marking race
    
    commit 04bef83a3358946bfc98a5ecebd1b0003d83d882 upstream.
    
    When a PIM hello packet is received on a bridge port with multicast
    snooping enabled, we mark it as a router port automatically, that
    includes adding that port the router port list. The multicast lock
    protects that list, but it is not acquired in the PIM message case
    leading to a race condition, we need to take it to fix the race.
    
    Cc: stable@vger.kernel.org
    Fixes: 91b02d3d133b ("bridge: mcast: add router port on PIM hello message")
    Signed-off-by: Nikolay Aleksandrov <nikolay@nvidia.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
index 6a362da211e1..3504c3acd38f 100644
--- a/net/bridge/br_multicast.c
+++ b/net/bridge/br_multicast.c
@@ -1791,7 +1791,9 @@ static void br_multicast_pim(struct net_bridge *br,
 	    pim_hdr_type(pimhdr) != PIM_TYPE_HELLO)
 		return;
 
+	spin_lock(&br->multicast_lock);
 	br_multicast_mark_router(br, port);
+	spin_unlock(&br->multicast_lock);
 }
 
 static int br_multicast_ipv4_rcv(struct net_bridge *br,

commit 8553099bdbe95a717e974552b6e6dbb8c4dac70b
Author: Martin Fäcknitz <faecknitz@hotsplots.de>
Date:   Mon Jul 5 02:03:54 2021 +0200

    MIPS: vdso: Invalid GIC access through VDSO
    
    [ Upstream commit 47ce8527fbba145a7723685bc9a27d9855e06491 ]
    
    Accessing raw timers (currently only CLOCK_MONOTONIC_RAW) through VDSO
    doesn't return the correct time when using the GIC as clock source.
    The address of the GIC mapped page is in this case not calculated
    correctly. The GIC mapped page is calculated from the VDSO data by
    subtracting PAGE_SIZE:
    
      void *get_gic(const struct vdso_data *data) {
        return (void __iomem *)data - PAGE_SIZE;
      }
    
    However, the data pointer is not page aligned for raw clock sources.
    This is because the VDSO data for raw clock sources (CS_RAW = 1) is
    stored after the VDSO data for coarse clock sources (CS_HRES_COARSE = 0).
    Therefore, only the VDSO data for CS_HRES_COARSE is page aligned:
    
      +--------------------+
      |                    |
      | vd[CS_RAW]         | ---+
      | vd[CS_HRES_COARSE] |    |
      +--------------------+    | -PAGE_SIZE
      |                    |    |
      |  GIC mapped page   | <--+
      |                    |
      +--------------------+
    
    When __arch_get_hw_counter() is called with &vd[CS_RAW], get_gic returns
    the wrong address (somewhere inside the GIC mapped page). The GIC counter
    values are not returned which results in an invalid time.
    
    Fixes: a7f4df4e21dd ("MIPS: VDSO: Add implementations of gettimeofday() and clock_gettime()")
    Signed-off-by: Martin Fäcknitz <faecknitz@hotsplots.de>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/vdso/vdso.h b/arch/mips/vdso/vdso.h
index cfb1be441dec..921589b45bc2 100644
--- a/arch/mips/vdso/vdso.h
+++ b/arch/mips/vdso/vdso.h
@@ -81,7 +81,7 @@ static inline const union mips_vdso_data *get_vdso_data(void)
 
 static inline void __iomem *get_gic(const union mips_vdso_data *data)
 {
-	return (void __iomem *)data - PAGE_SIZE;
+	return (void __iomem *)((unsigned long)data & PAGE_MASK) - PAGE_SIZE;
 }
 
 #endif /* CONFIG_CLKSRC_MIPS_GIC */

commit d822ebccccf11c10b488a8b13fff8e7fdbce97b7
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Sun Jul 4 16:02:11 2021 -0700

    mips: disable branch profiling in boot/decompress.o
    
    [ Upstream commit 97e488073cfca0eea84450169ca4cbfcc64e33e3 ]
    
    Use DISABLE_BRANCH_PROFILING for arch/mips/boot/compressed/decompress.o
    to prevent linkage errors.
    
    mips64-linux-ld: arch/mips/boot/compressed/decompress.o: in function `LZ4_decompress_fast_extDict':
    decompress.c:(.text+0x8c): undefined reference to `ftrace_likely_update'
    mips64-linux-ld: decompress.c:(.text+0xf4): undefined reference to `ftrace_likely_update'
    mips64-linux-ld: decompress.c:(.text+0x200): undefined reference to `ftrace_likely_update'
    mips64-linux-ld: decompress.c:(.text+0x230): undefined reference to `ftrace_likely_update'
    mips64-linux-ld: decompress.c:(.text+0x320): undefined reference to `ftrace_likely_update'
    mips64-linux-ld: arch/mips/boot/compressed/decompress.o:decompress.c:(.text+0x3f4): more undefined references to `ftrace_likely_update' follow
    
    Fixes: e76e1fdfa8f8 ("lib: add support for LZ4-compressed kernel")
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Cc: linux-mips@vger.kernel.org
    Cc: Kyungsik Lee <kyungsik.lee@lge.com>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/boot/compressed/decompress.c b/arch/mips/boot/compressed/decompress.c
index 40218be0b7ce..6403a65f30b9 100644
--- a/arch/mips/boot/compressed/decompress.c
+++ b/arch/mips/boot/compressed/decompress.c
@@ -11,6 +11,8 @@
  * option) any later version.
  */
 
+#define DISABLE_BRANCH_PROFILING
+
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/string.h>

commit 7c5bc66b33f6ab5f8792920beb821e1041586b44
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Fri Jul 2 16:28:37 2021 +0200

    mips: always link byteswap helpers into decompressor
    
    [ Upstream commit cddc40f5617e53f97ef019d5b29c1bd6cbb031ec ]
    
    My series to clean up the unaligned access implementation
    across architectures caused some mips randconfig builds to
    fail with:
    
       mips64-linux-ld: arch/mips/boot/compressed/decompress.o: in function `decompress_kernel':
       decompress.c:(.text.decompress_kernel+0x54): undefined reference to `__bswapsi2'
    
    It turns out that this problem has already been fixed for the XZ
    decompressor but now it also shows up in (at least) LZO and LZ4.  From my
    analysis I concluded that the compiler could always have emitted those
    calls, but the different implementation allowed it to make otherwise
    better decisions about not inlining the byteswap, which results in the
    link error when the out-of-line code is missing.
    
    While it could be addressed by adding it to the two decompressor
    implementations that are known to be affected, but as this only adds
    112 bytes to the kernel, the safer choice is to always add them.
    
    Fixes: c50ec6787536 ("MIPS: zboot: Fix the build with XZ compression on older GCC versions")
    Fixes: 0652035a5794 ("asm-generic: unaligned: remove byteshift helpers")
    Link: https://lore.kernel.org/linux-mm/202106301304.gz2wVY9w-lkp@intel.com/
    Link: https://lore.kernel.org/linux-mm/202106260659.TyMe8mjr-lkp@intel.com/
    Link: https://lore.kernel.org/linux-mm/202106172016.onWT6Tza-lkp@intel.com/
    Link: https://lore.kernel.org/linux-mm/202105231743.JJcALnhS-lkp@intel.com/
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/boot/compressed/Makefile b/arch/mips/boot/compressed/Makefile
index 378cbfb31ee7..1d6ebbc2a5d0 100644
--- a/arch/mips/boot/compressed/Makefile
+++ b/arch/mips/boot/compressed/Makefile
@@ -33,7 +33,7 @@ KBUILD_AFLAGS := $(KBUILD_AFLAGS) -D__ASSEMBLY__ \
 KCOV_INSTRUMENT		:= n
 
 # decompressor objects (linked with vmlinuz)
-vmlinuzobjs-y := $(obj)/head.o $(obj)/decompress.o $(obj)/string.o
+vmlinuzobjs-y := $(obj)/head.o $(obj)/decompress.o $(obj)/string.o $(obj)/bswapsi.o
 
 ifdef CONFIG_DEBUG_ZBOOT
 vmlinuzobjs-$(CONFIG_DEBUG_ZBOOT)		   += $(obj)/dbg.o
@@ -47,7 +47,7 @@ extra-y += uart-ath79.c
 $(obj)/uart-ath79.c: $(srctree)/arch/mips/ath79/early_printk.c
 	$(call cmd,shipped)
 
-vmlinuzobjs-$(CONFIG_KERNEL_XZ) += $(obj)/ashldi3.o $(obj)/bswapsi.o
+vmlinuzobjs-$(CONFIG_KERNEL_XZ) += $(obj)/ashldi3.o
 
 extra-y += ashldi3.c
 $(obj)/ashldi3.c: $(obj)/%.c: $(srctree)/lib/%.c FORCE

commit 5b02f5892657f385502c93ab42289ea4fbf05cf1
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Sat Jun 12 09:18:34 2021 +0200

    scsi: be2iscsi: Fix an error handling path in beiscsi_dev_probe()
    
    [ Upstream commit 030e4138d11fced3b831c2761e4cecf347bae99c ]
    
    If an error occurs after a pci_enable_pcie_error_reporting() call, it must
    be undone by a corresponding pci_disable_pcie_error_reporting() call, as
    already done in the remove function.
    
    Link: https://lore.kernel.org/r/77adb02cfea7f1364e5603ecf3930d8597ae356e.1623482155.git.christophe.jaillet@wanadoo.fr
    Fixes: 3567f36a09d1 ("[SCSI] be2iscsi: Fix AER handling in driver")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c
index a5b807c676fc..50e9b4b68357 100644
--- a/drivers/scsi/be2iscsi/be_main.c
+++ b/drivers/scsi/be2iscsi/be_main.c
@@ -5764,6 +5764,7 @@ static int beiscsi_dev_probe(struct pci_dev *pcidev,
 	pci_disable_msix(phba->pcidev);
 	pci_dev_put(phba->pcidev);
 	iscsi_host_free(phba->shost);
+	pci_disable_pcie_error_reporting(pcidev);
 	pci_set_drvdata(pcidev, NULL);
 disable_pci:
 	pci_release_regions(pcidev);

commit 83723802bdb17310228a1414ea4ec4bd78720d8b
Author: Christoph Niedermaier <cniedermaier@dh-electronics.com>
Date:   Wed May 26 12:54:00 2021 +0200

    ARM: dts: imx6q-dhcom: Add gpios pinctrl for i2c bus recovery
    
    [ Upstream commit ddc873cd3c0af4faad6a00bffda21c3f775126dd ]
    
    The i2c bus can freeze at the end of transaction so the bus can no longer work.
    This scenario is improved by adding scl/sda gpios definitions to implement the
    i2c bus recovery mechanism.
    
    Fixes: 52c7a088badd ("ARM: dts: imx6q: Add support for the DHCOM iMX6 SoM and PDK2")
    Signed-off-by: Christoph Niedermaier <cniedermaier@dh-electronics.com>
    Cc: Shawn Guo <shawnguo@kernel.org>
    Cc: Fabio Estevam <festevam@gmail.com>
    Cc: Marek Vasut <marex@denx.de>
    Cc: NXP Linux Team <linux-imx@nxp.com>
    Cc: kernel@dh-electronics.com
    To: linux-arm-kernel@lists.infradead.org
    Signed-off-by: Shawn Guo <shawnguo@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/imx6q-dhcom-som.dtsi b/arch/arm/boot/dts/imx6q-dhcom-som.dtsi
index 6c08ef354a39..d5161c34a4b1 100644
--- a/arch/arm/boot/dts/imx6q-dhcom-som.dtsi
+++ b/arch/arm/boot/dts/imx6q-dhcom-som.dtsi
@@ -106,22 +106,31 @@
 
 &i2c1 {
 	clock-frequency = <100000>;
-	pinctrl-names = "default";
+	pinctrl-names = "default", "gpio";
 	pinctrl-0 = <&pinctrl_i2c1>;
+	pinctrl-1 = <&pinctrl_i2c1_gpio>;
+	scl-gpios = <&gpio3 21 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+	sda-gpios = <&gpio3 28 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
 	status = "okay";
 };
 
 &i2c2 {
 	clock-frequency = <100000>;
-	pinctrl-names = "default";
+	pinctrl-names = "default", "gpio";
 	pinctrl-0 = <&pinctrl_i2c2>;
+	pinctrl-1 = <&pinctrl_i2c2_gpio>;
+	scl-gpios = <&gpio4 12 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+	sda-gpios = <&gpio4 13 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
 	status = "okay";
 };
 
 &i2c3 {
 	clock-frequency = <100000>;
-	pinctrl-names = "default";
+	pinctrl-names = "default", "gpio";
 	pinctrl-0 = <&pinctrl_i2c3>;
+	pinctrl-1 = <&pinctrl_i2c3_gpio>;
+	scl-gpios = <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+	sda-gpios = <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
 	status = "okay";
 
 	ltc3676: pmic@3c {
@@ -287,6 +296,13 @@
 		>;
 	};
 
+	pinctrl_i2c1_gpio: i2c1-gpio-grp {
+		fsl,pins = <
+			MX6QDL_PAD_EIM_D21__GPIO3_IO21		0x4001b8b1
+			MX6QDL_PAD_EIM_D28__GPIO3_IO28		0x4001b8b1
+		>;
+	};
+
 	pinctrl_i2c2: i2c2-grp {
 		fsl,pins = <
 			MX6QDL_PAD_KEY_COL3__I2C2_SCL		0x4001b8b1
@@ -294,6 +310,13 @@
 		>;
 	};
 
+	pinctrl_i2c2_gpio: i2c2-gpio-grp {
+		fsl,pins = <
+			MX6QDL_PAD_KEY_COL3__GPIO4_IO12		0x4001b8b1
+			MX6QDL_PAD_KEY_ROW3__GPIO4_IO13		0x4001b8b1
+		>;
+	};
+
 	pinctrl_i2c3: i2c3-grp {
 		fsl,pins = <
 			MX6QDL_PAD_GPIO_3__I2C3_SCL		0x4001b8b1
@@ -301,6 +324,13 @@
 		>;
 	};
 
+	pinctrl_i2c3_gpio: i2c3-gpio-grp {
+		fsl,pins = <
+			MX6QDL_PAD_GPIO_3__GPIO1_IO03		0x4001b8b1
+			MX6QDL_PAD_GPIO_6__GPIO1_IO06		0x4001b8b1
+		>;
+	};
+
 	pinctrl_pmic_hw300: pmic-hw300-grp {
 		fsl,pins = <
 			MX6QDL_PAD_EIM_A25__GPIO5_IO02		0x1B0B0

commit 2b230a965c9b2eab0cca13f84aa54df022b11dc7
Author: Christoph Niedermaier <cniedermaier@dh-electronics.com>
Date:   Wed May 26 12:53:59 2021 +0200

    ARM: dts: imx6q-dhcom: Fix ethernet plugin detection problems
    
    [ Upstream commit e2bdd3484890441b9cc2560413a86e8f2aa04157 ]
    
    To make the ethernet cable plugin detection reliable the
    power detection of the smsc phy has been disabled.
    
    Fixes: 52c7a088badd ("ARM: dts: imx6q: Add support for the DHCOM iMX6 SoM and PDK2")
    Signed-off-by: Christoph Niedermaier <cniedermaier@dh-electronics.com>
    Cc: Shawn Guo <shawnguo@kernel.org>
    Cc: Fabio Estevam <festevam@gmail.com>
    Cc: Marek Vasut <marex@denx.de>
    Cc: NXP Linux Team <linux-imx@nxp.com>
    Cc: kernel@dh-electronics.com
    To: linux-arm-kernel@lists.infradead.org
    Signed-off-by: Shawn Guo <shawnguo@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/imx6q-dhcom-som.dtsi b/arch/arm/boot/dts/imx6q-dhcom-som.dtsi
index b158e530a796..6c08ef354a39 100644
--- a/arch/arm/boot/dts/imx6q-dhcom-som.dtsi
+++ b/arch/arm/boot/dts/imx6q-dhcom-som.dtsi
@@ -99,6 +99,7 @@
 			reset-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;
 			reset-assert-us = <1000>;
 			reset-deassert-us = <1000>;
+			smsc,disable-energy-detect; /* Make plugin detection reliable */
 		};
 	};
 };

commit 63a9a35c848bc66955ffad8874011aed354722ad
Author: Christoph Niedermaier <cniedermaier@dh-electronics.com>
Date:   Wed May 26 12:53:58 2021 +0200

    ARM: dts: imx6q-dhcom: Fix ethernet reset time properties
    
    [ Upstream commit c016c26c1631f539c652b5d82242a3ca402545c1 ]
    
    Fix ethernet reset time properties as described in
    Documentation/devicetree/bindings/net/ethernet-phy.yaml
    
    Fixes: 52c7a088badd ("ARM: dts: imx6q: Add support for the DHCOM iMX6 SoM and PDK2")
    Signed-off-by: Christoph Niedermaier <cniedermaier@dh-electronics.com>
    Cc: Shawn Guo <shawnguo@kernel.org>
    Cc: Fabio Estevam <festevam@gmail.com>
    Cc: Marek Vasut <marex@denx.de>
    Cc: NXP Linux Team <linux-imx@nxp.com>
    Cc: kernel@dh-electronics.com
    To: linux-arm-kernel@lists.infradead.org
    Signed-off-by: Shawn Guo <shawnguo@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/imx6q-dhcom-som.dtsi b/arch/arm/boot/dts/imx6q-dhcom-som.dtsi
index 8d4a4cd01e07..b158e530a796 100644
--- a/arch/arm/boot/dts/imx6q-dhcom-som.dtsi
+++ b/arch/arm/boot/dts/imx6q-dhcom-som.dtsi
@@ -97,8 +97,8 @@
 			reg = <0>;
 			max-speed = <100>;
 			reset-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;
-			reset-delay-us = <1000>;
-			reset-post-delay-us = <1000>;
+			reset-assert-us = <1000>;
+			reset-deassert-us = <1000>;
 		};
 	};
 };

commit caef06c17f64e351dc1eb91b5341e445bceab1d5
Author: Aswath Govindraju <a-govindraju@ti.com>
Date:   Tue Jun 8 10:39:52 2021 +0530

    ARM: dts: am437x: align ti,pindir-d0-out-d1-in property with dt-shema
    
    [ Upstream commit 9b11fec7345f21995f4ea4bafb0e108b9a620238 ]
    
    ti,pindir-d0-out-d1-in property is expected to be of type boolean.
    Therefore, fix the property accordingly.
    
    Fixes: b0b039515445 ("ARM: dts: am43x-epos-evm: set data pin directions for spi0 and spi1")
    Signed-off-by: Aswath Govindraju <a-govindraju@ti.com>
    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/am43x-epos-evm.dts b/arch/arm/boot/dts/am43x-epos-evm.dts
index b6950eee550b..02bbdfb3f258 100644
--- a/arch/arm/boot/dts/am43x-epos-evm.dts
+++ b/arch/arm/boot/dts/am43x-epos-evm.dts
@@ -839,7 +839,7 @@
 	pinctrl-names = "default", "sleep";
 	pinctrl-0 = <&spi0_pins_default>;
 	pinctrl-1 = <&spi0_pins_sleep>;
-	ti,pindir-d0-out-d1-in = <1>;
+	ti,pindir-d0-out-d1-in;
 };
 
 &spi1 {
@@ -847,7 +847,7 @@
 	pinctrl-names = "default", "sleep";
 	pinctrl-0 = <&spi1_pins_default>;
 	pinctrl-1 = <&spi1_pins_sleep>;
-	ti,pindir-d0-out-d1-in = <1>;
+	ti,pindir-d0-out-d1-in;
 };
 
 &usb2_phy1 {

commit 306e7bdd55083d1b2c471f6f3d88bac9ca72ec90
Author: Aswath Govindraju <a-govindraju@ti.com>
Date:   Tue Jun 8 10:39:51 2021 +0530

    ARM: dts: am335x: align ti,pindir-d0-out-d1-in property with dt-shema
    
    [ Upstream commit 414bfe1d26b60ef20b58e36efd5363188a694bab ]
    
    ti,pindir-d0-out-d1-in property is expected to be of type boolean.
    Therefore, fix the property accordingly.
    
    Fixes: 444d66fafab8 ("ARM: dts: add spi wifi support to cm-t335")
    Signed-off-by: Aswath Govindraju <a-govindraju@ti.com>
    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/am335x-cm-t335.dts b/arch/arm/boot/dts/am335x-cm-t335.dts
index 947c81b7aaaf..56a04d3086c3 100644
--- a/arch/arm/boot/dts/am335x-cm-t335.dts
+++ b/arch/arm/boot/dts/am335x-cm-t335.dts
@@ -552,7 +552,7 @@ status = "okay";
 	status = "okay";
 	pinctrl-names = "default";
 	pinctrl-0 = <&spi0_pins>;
-	ti,pindir-d0-out-d1-in = <1>;
+	ti,pindir-d0-out-d1-in;
 	/* WLS1271 WiFi */
 	wlcore: wlcore@1 {
 		compatible = "ti,wl1271";

commit ee1aa737ba0b75ab8af3444c4ae5bdba36aed6e6
Author: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Date:   Thu May 27 11:43:22 2021 -0400

    memory: fsl_ifc: fix leak of private memory on probe failure
    
    [ Upstream commit 8e0d09b1232d0538066c40ed4c13086faccbdff6 ]
    
    On probe error the driver should free the memory allocated for private
    structure.  Fix this by using resource-managed allocation.
    
    Fixes: a20cbdeffce2 ("powerpc/fsl: Add support for Integrated Flash Controller")
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Link: https://lore.kernel.org/r/20210527154322.81253-2-krzysztof.kozlowski@canonical.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/memory/fsl_ifc.c b/drivers/memory/fsl_ifc.c
index 74bbbdc584f4..38b945eb410f 100644
--- a/drivers/memory/fsl_ifc.c
+++ b/drivers/memory/fsl_ifc.c
@@ -109,7 +109,6 @@ static int fsl_ifc_ctrl_remove(struct platform_device *dev)
 	iounmap(ctrl->gregs);
 
 	dev_set_drvdata(&dev->dev, NULL);
-	kfree(ctrl);
 
 	return 0;
 }
@@ -221,7 +220,8 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
 
 	dev_info(&dev->dev, "Freescale Integrated Flash Controller\n");
 
-	fsl_ifc_ctrl_dev = kzalloc(sizeof(*fsl_ifc_ctrl_dev), GFP_KERNEL);
+	fsl_ifc_ctrl_dev = devm_kzalloc(&dev->dev, sizeof(*fsl_ifc_ctrl_dev),
+					GFP_KERNEL);
 	if (!fsl_ifc_ctrl_dev)
 		return -ENOMEM;
 

commit 94bc2fe46102d1e060fc749c0c19511e76c9995f
Author: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Date:   Thu May 27 11:43:21 2021 -0400

    memory: fsl_ifc: fix leak of IO mapping on probe failure
    
    [ Upstream commit 3b132ab67fc7a358fff35e808fa65d4bea452521 ]
    
    On probe error the driver should unmap the IO memory.  Smatch reports:
    
      drivers/memory/fsl_ifc.c:298 fsl_ifc_ctrl_probe() warn: 'fsl_ifc_ctrl_dev->gregs' not released on lines: 298.
    
    Fixes: a20cbdeffce2 ("powerpc/fsl: Add support for Integrated Flash Controller")
    Reported-by: kernel test robot <lkp@intel.com>
    Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Link: https://lore.kernel.org/r/20210527154322.81253-1-krzysztof.kozlowski@canonical.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/memory/fsl_ifc.c b/drivers/memory/fsl_ifc.c
index 1b182b117f9c..74bbbdc584f4 100644
--- a/drivers/memory/fsl_ifc.c
+++ b/drivers/memory/fsl_ifc.c
@@ -231,8 +231,7 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
 	fsl_ifc_ctrl_dev->gregs = of_iomap(dev->dev.of_node, 0);
 	if (!fsl_ifc_ctrl_dev->gregs) {
 		dev_err(&dev->dev, "failed to get memory region\n");
-		ret = -ENODEV;
-		goto err;
+		return -ENODEV;
 	}
 
 	if (of_property_read_bool(dev->dev.of_node, "little-endian")) {
@@ -308,6 +307,7 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev)
 	free_irq(fsl_ifc_ctrl_dev->irq, fsl_ifc_ctrl_dev);
 	irq_dispose_mapping(fsl_ifc_ctrl_dev->irq);
 err:
+	iounmap(fsl_ifc_ctrl_dev->gregs);
 	return ret;
 }
 

commit 4bb145e596e9308d086b336a61794f0c331c4f34
Author: Philipp Zabel <p.zabel@pengutronix.de>
Date:   Mon Jun 7 10:26:15 2021 +0200

    reset: bail if try_module_get() fails
    
    [ Upstream commit 4fb26fb83f0def3d39c14e268bcd4003aae8fade ]
    
    Abort instead of returning a new reset control for a reset controller
    device that is going to have its module unloaded.
    
    Reported-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
    Fixes: 61fc41317666 ("reset: Add reset controller API")
    Acked-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
    Link: https://lore.kernel.org/r/20210607082615.15160-1-p.zabel@pengutronix.de
    Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/reset/core.c b/drivers/reset/core.c
index f7bf20493f23..ccb97f4e31c3 100644
--- a/drivers/reset/core.c
+++ b/drivers/reset/core.c
@@ -428,7 +428,10 @@ static struct reset_control *__reset_control_get_internal(
 	if (!rstc)
 		return ERR_PTR(-ENOMEM);
 
-	try_module_get(rcdev->owner);
+	if (!try_module_get(rcdev->owner)) {
+		kfree(rstc);
+		return ERR_PTR(-ENODEV);
+	}
 
 	rstc->rcdev = rcdev;
 	list_add(&rstc->list, &rcdev->reset_control_head);

commit 8cb5a0522b5f6a15e9223d3a315c2e0041e02550
Author: Rafa? Mi?ecki <rafal@milecki.pl>
Date:   Wed May 12 15:07:09 2021 +0200

    ARM: dts: BCM5301X: Fixup SPI binding
    
    [ Upstream commit d5aede3e6dd1b8ca574600a1ecafe1e580c53f2f ]
    
    1. Reorder interrupts
    2. Fix typo: s/spi_lr_overhead/spi_lr_overread/
    3. Rename node: s/spi-nor@0/flash@0/
    
    This fixes:
    arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dt.yaml: spi@18029200: interrupt-names: 'oneOf' conditional failed, one must be fixed:
            ['spi_lr_fullness_reached', 'spi_lr_session_aborted', 'spi_lr_impatient', 'spi_lr_session_done', 'spi_lr_overhead', 'mspi_done', 'mspi_halted'] is too long
            Additional items are not allowed ('spi_lr_session_aborted', 'spi_lr_impatient', 'spi_lr_session_done', 'spi_lr_overhead', 'mspi_done', 'mspi_halted' were unexpected)
            'mspi_done' was expected
            'spi_l1_intr' was expected
            'mspi_halted' was expected
            'spi_lr_fullness_reached' was expected
            'spi_lr_session_aborted' was expected
            'spi_lr_impatient' was expected
            'spi_lr_session_done' was expected
            'spi_lr_overread' was expected
            From schema: Documentation/devicetree/bindings/spi/brcm,spi-bcm-qspi.yaml
    arch/arm/boot/dts/bcm4709-buffalo-wxr-1900dhp.dt.yaml: spi-nor@0: $nodename:0: 'spi-nor@0' does not match '^flash(@.*)?$'
            From schema: Documentation/devicetree/bindings/mtd/jedec,spi-nor.yaml
    
    Signed-off-by: Rafa? Mi?ecki <rafal@milecki.pl>
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/bcm5301x.dtsi b/arch/arm/boot/dts/bcm5301x.dtsi
index c91716d5980c..fa3422c4caec 100644
--- a/arch/arm/boot/dts/bcm5301x.dtsi
+++ b/arch/arm/boot/dts/bcm5301x.dtsi
@@ -451,27 +451,27 @@
 		      <0x1811b408 0x004>,
 		      <0x180293a0 0x01c>;
 		reg-names = "mspi", "bspi", "intr_regs", "intr_status_reg";
-		interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>,
+		interrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>,
 			     <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>,
 			     <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>,
 			     <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>,
-			     <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;
-		interrupt-names = "spi_lr_fullness_reached",
+			     <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "mspi_done",
+				  "mspi_halted",
+				  "spi_lr_fullness_reached",
 				  "spi_lr_session_aborted",
 				  "spi_lr_impatient",
 				  "spi_lr_session_done",
-				  "spi_lr_overhead",
-				  "mspi_done",
-				  "mspi_halted";
+				  "spi_lr_overread";
 		clocks = <&iprocmed>;
 		clock-names = "iprocmed";
 		num-cs = <2>;
 		#address-cells = <1>;
 		#size-cells = <0>;
 
-		spi_nor: spi-nor@0 {
+		spi_nor: flash@0 {
 			compatible = "jedec,spi-nor";
 			reg = <0>;
 			spi-max-frequency = <20000000>;

commit 7d307d042247110ed675ca607f32b2957e190cec
Author: Geert Uytterhoeven <geert+renesas@glider.be>
Date:   Thu Apr 29 14:41:15 2021 +0200

    ARM: dts: r8a7779, marzen: Fix DU clock names
    
    [ Upstream commit 6ab8c23096a29b69044209a5925758a6f88bd450 ]
    
    "make dtbs_check" complains:
    
        arch/arm/boot/dts/r8a7779-marzen.dt.yaml: display@fff80000: clock-names:0: 'du.0' was expected
    
    Change the first clock name to match the DT bindings.
    This has no effect on actual operation, as the Display Unit driver in
    Linux does not use the first clock name on R-Car H1, but just grabs the
    first clock.
    
    Fixes: 665d79aa47cb3983 ("ARM: shmobile: marzen: Add DU external pixel clock to DT")
    Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
    Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
    Link: https://lore.kernel.org/r/9d5e1b371121883b3b3e10a3df43802a29c6a9da.1619699965.git.geert+renesas@glider.be
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/r8a7779-marzen.dts b/arch/arm/boot/dts/r8a7779-marzen.dts
index a4d0038363f0..84e30ed235b5 100644
--- a/arch/arm/boot/dts/r8a7779-marzen.dts
+++ b/arch/arm/boot/dts/r8a7779-marzen.dts
@@ -146,7 +146,7 @@
 	status = "okay";
 
 	clocks = <&mstp1_clks R8A7779_CLK_DU>, <&x3_clk>;
-	clock-names = "du", "dclkin.0";
+	clock-names = "du.0", "dclkin.0";
 
 	ports {
 		port@0 {
diff --git a/arch/arm/boot/dts/r8a7779.dtsi b/arch/arm/boot/dts/r8a7779.dtsi
index f1c9b2bc542c..c9695f31002a 100644
--- a/arch/arm/boot/dts/r8a7779.dtsi
+++ b/arch/arm/boot/dts/r8a7779.dtsi
@@ -437,6 +437,7 @@
 		reg = <0xfff80000 0x40000>;
 		interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
 		clocks = <&mstp1_clks R8A7779_CLK_DU>;
+		clock-names = "du.0";
 		power-domains = <&sysc R8A7779_PD_ALWAYS_ON>;
 		status = "disabled";
 

commit 52d479b28e44971039c2c7463a6a81463d4fd486
Author: Valentine Barshak <valentine.barshak@cogentembedded.com>
Date:   Fri Mar 26 13:10:50 2021 +0100

    arm64: dts: renesas: v3msk: Fix memory size
    
    [ Upstream commit a422ec20caef6a50cf3c1efa93538888ebd576a6 ]
    
    The V3MSK board has 2 GiB RAM according to the datasheet and schematics.
    
    Signed-off-by: Valentine Barshak <valentine.barshak@cogentembedded.com>
    [geert: Verified schematics]
    Fixes: cc3e267e9bb0ce7f ("arm64: dts: renesas: initial V3MSK board device tree")
    Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
    Link: https://lore.kernel.org/r/20210326121050.1578460-1-geert+renesas@glider.be
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm64/boot/dts/renesas/r8a77970-v3msk.dts b/arch/arm64/boot/dts/renesas/r8a77970-v3msk.dts
index 8eac8ca6550b..d8768c6bdfee 100644
--- a/arch/arm64/boot/dts/renesas/r8a77970-v3msk.dts
+++ b/arch/arm64/boot/dts/renesas/r8a77970-v3msk.dts
@@ -24,7 +24,7 @@
 	memory@48000000 {
 		device_type = "memory";
 		/* first 128MB is reserved for secure area. */
-		reg = <0x0 0x48000000 0x0 0x38000000>;
+		reg = <0x0 0x48000000 0x0 0x78000000>;
 	};
 
 	osc5_clk: osc5-clock {

commit 1cae2aece5bc508d4a9fc29764669930528fefbc
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Tue May 11 10:19:26 2021 +0300

    rtc: fix snprintf() checking in is_rtc_hctosys()
    
    [ Upstream commit 54b909436ede47e0ee07f1765da27ec2efa41e84 ]
    
    The scnprintf() function silently truncates the printf() and returns
    the number bytes that it was able to copy (not counting the NUL
    terminator).  Thus, the highest value it can return here is
    "NAME_SIZE - 1" and the overflow check is dead code.  Fix this by
    using the snprintf() function which returns the number of bytes that
    would have been copied if there was enough space and changing the
    condition from "> NAME_SIZE" to ">= NAME_SIZE".
    
    Fixes: 92589c986b33 ("rtc-proc: permit the /proc/driver/rtc device to use other devices")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
    Link: https://lore.kernel.org/r/YJov/pcGmhLi2pEl@mwanda
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/rtc/rtc-proc.c b/drivers/rtc/rtc-proc.c
index a9dd9218fae2..b8c5b93102ce 100644
--- a/drivers/rtc/rtc-proc.c
+++ b/drivers/rtc/rtc-proc.c
@@ -26,8 +26,8 @@ static bool is_rtc_hctosys(struct rtc_device *rtc)
 	int size;
 	char name[NAME_SIZE];
 
-	size = scnprintf(name, NAME_SIZE, "rtc%d", rtc->id);
-	if (size > NAME_SIZE)
+	size = snprintf(name, NAME_SIZE, "rtc%d", rtc->id);
+	if (size >= NAME_SIZE)
 		return false;
 
 	return !strncmp(name, CONFIG_RTC_HCTOSYS_DEVICE, NAME_SIZE);

commit a2d713c0f74582354f1f1768b368cebb5dca190e
Author: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Date:   Fri Apr 23 12:18:15 2021 +0200

    memory: atmel-ebi: add missing of_node_put for loop iteration
    
    [ Upstream commit 907c5bbb514a4676160e79764522fff56ce3448e ]
    
    Early exits from for_each_available_child_of_node() should decrement the
    node reference counter.  Reported by Coccinelle:
    
      drivers/memory/atmel-ebi.c:593:1-33: WARNING:
        Function "for_each_available_child_of_node" should have of_node_put() before return around line 604.
    
    Fixes: 6a4ec4cd0888 ("memory: add Atmel EBI (External Bus Interface) driver")
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Link: https://lore.kernel.org/r/20210423101815.119341-2-krzysztof.kozlowski@canonical.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/memory/atmel-ebi.c b/drivers/memory/atmel-ebi.c
index b907865d4664..2b9283d4fcb1 100644
--- a/drivers/memory/atmel-ebi.c
+++ b/drivers/memory/atmel-ebi.c
@@ -579,8 +579,10 @@ static int atmel_ebi_probe(struct platform_device *pdev)
 				child);
 
 			ret = atmel_ebi_dev_disable(ebi, child);
-			if (ret)
+			if (ret) {
+				of_node_put(child);
 				return ret;
+			}
 		}
 	}
 

commit 2408a5e8d7f1f2f0a2daddf502ef8572df784e22
Author: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Date:   Wed May 5 09:59:41 2021 -0400

    ARM: dts: exynos: fix PWM LED max brightness on Odroid XU4
    
    [ Upstream commit fd2f1717966535b7d0b6fe45cf0d79e94330da5f ]
    
    There is no "max_brightness" property as pointed out by dtschema:
    
      arch/arm/boot/dts/exynos5422-odroidxu4.dt.yaml: led-controller: led-1: 'max-brightness' is a required property
    
    Fixes: 6658356014cb ("ARM: dts: Add support Odroid XU4 board for exynos5422-odroidxu4")
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Link: https://lore.kernel.org/r/20210505135941.59898-5-krzysztof.kozlowski@canonical.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/exynos5422-odroidxu4.dts b/arch/arm/boot/dts/exynos5422-odroidxu4.dts
index 122174ea9e0a..cb00513b9dd7 100644
--- a/arch/arm/boot/dts/exynos5422-odroidxu4.dts
+++ b/arch/arm/boot/dts/exynos5422-odroidxu4.dts
@@ -24,7 +24,7 @@
 			label = "blue:heartbeat";
 			pwms = <&pwm 2 2000000 0>;
 			pwm-names = "pwm2";
-			max_brightness = <255>;
+			max-brightness = <255>;
 			linux,default-trigger = "heartbeat";
 		};
 	};

commit 88d7b6aeec87d64a39407aa411caf4ac744a2421
Author: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Date:   Wed May 5 09:59:40 2021 -0400

    ARM: dts: exynos: fix PWM LED max brightness on Odroid HC1
    
    [ Upstream commit a7e59c84cf2055a1894f45855c8319191f2fa59e ]
    
    There is no "max_brightness" property as pointed out by dtschema:
    
      arch/arm/boot/dts/exynos5422-odroidhc1.dt.yaml: led-controller: led-1: 'max-brightness' is a required property
    
    Fixes: 1ac49427b566 ("ARM: dts: exynos: Add support for Hardkernel's Odroid HC1 board")
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Link: https://lore.kernel.org/r/20210505135941.59898-4-krzysztof.kozlowski@canonical.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/exynos5422-odroidhc1.dts b/arch/arm/boot/dts/exynos5422-odroidhc1.dts
index 8f332be143f7..abc6fb7d2725 100644
--- a/arch/arm/boot/dts/exynos5422-odroidhc1.dts
+++ b/arch/arm/boot/dts/exynos5422-odroidhc1.dts
@@ -22,7 +22,7 @@
 			label = "blue:heartbeat";
 			pwms = <&pwm 2 2000000 0>;
 			pwm-names = "pwm2";
-			max_brightness = <255>;
+			max-brightness = <255>;
 			linux,default-trigger = "heartbeat";
 		};
 	};

commit 2a4b928b0339b0ecbb40c9e408fe9350c57a6e44
Author: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Date:   Wed May 5 09:59:39 2021 -0400

    ARM: dts: exynos: fix PWM LED max brightness on Odroid XU/XU3
    
    [ Upstream commit 75121e1dc9fe4def41e63d57f6a53749b88006ed ]
    
    There is no "max_brightness" property.  This brings the intentional
    brightness reduce of green LED and dtschema checks as well:
    
      arch/arm/boot/dts/exynos5410-odroidxu.dt.yaml: led-controller-1: led-1: 'max-brightness' is a required property
    
    Fixes: 719f39fec586 ("ARM: dts: exynos5422-odroidxu3: Hook up PWM and use it for LEDs")
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Link: https://lore.kernel.org/r/20210505135941.59898-3-krzysztof.kozlowski@canonical.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/exynos54xx-odroidxu-leds.dtsi b/arch/arm/boot/dts/exynos54xx-odroidxu-leds.dtsi
index 56acd832f0b3..16e1087ec717 100644
--- a/arch/arm/boot/dts/exynos54xx-odroidxu-leds.dtsi
+++ b/arch/arm/boot/dts/exynos54xx-odroidxu-leds.dtsi
@@ -22,7 +22,7 @@
 			 * Green LED is much brighter than the others
 			 * so limit its max brightness
 			 */
-			max_brightness = <127>;
+			max-brightness = <127>;
 			linux,default-trigger = "mmc0";
 		};
 
@@ -30,7 +30,7 @@
 			label = "blue:heartbeat";
 			pwms = <&pwm 2 2000000 0>;
 			pwm-names = "pwm2";
-			max_brightness = <255>;
+			max-brightness = <255>;
 			linux,default-trigger = "heartbeat";
 		};
 	};

commit 2e98a83f55b461a20dcaca5f6e0a7104eaf5008d
Author: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Date:   Fri May 7 07:28:03 2021 -0400

    reset: a10sr: add missing of_match_table reference
    
    [ Upstream commit 466ba3c8ff4fae39e455ff8d080b3d5503302765 ]
    
    The driver defined of_device_id table but did not use it with
    of_match_table.  This prevents usual matching via devicetree and causes
    a W=1 warning:
    
      drivers/reset/reset-a10sr.c:111:34: warning:
        ?a10sr_reset_of_match??defined but not used [-Wunused-const-variable=]
    
    Reported-by: kernel test robot <lkp@intel.com>
    Fixes: 627006820268 ("reset: Add Altera Arria10 SR Reset Controller")
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Link: https://lore.kernel.org/r/20210507112803.20012-1-krzysztof.kozlowski@canonical.com
    Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/reset/reset-a10sr.c b/drivers/reset/reset-a10sr.c
index 37496bd27fa2..306fba5b3519 100644
--- a/drivers/reset/reset-a10sr.c
+++ b/drivers/reset/reset-a10sr.c
@@ -129,6 +129,7 @@ static struct platform_driver a10sr_reset_driver = {
 	.probe	= a10sr_reset_probe,
 	.driver = {
 		.name		= "altr_a10sr_reset",
+		.of_match_table	= a10sr_reset_of_match,
 	},
 };
 module_platform_driver(a10sr_reset_driver);

commit 86c9c442c04084814f0ab14abccb16dae22d62fe
Author: Nathan Chancellor <nathan@kernel.org>
Date:   Wed Jul 7 18:07:41 2021 -0700

    hexagon: use common DISCARDS macro
    
    [ Upstream commit 681ba73c72302214686401e707e2087ed11a6556 ]
    
    ld.lld warns that the '.modinfo' section is not currently handled:
    
    ld.lld: warning: kernel/built-in.a(workqueue.o):(.modinfo) is being placed in '.modinfo'
    ld.lld: warning: kernel/built-in.a(printk/printk.o):(.modinfo) is being placed in '.modinfo'
    ld.lld: warning: kernel/built-in.a(irq/spurious.o):(.modinfo) is being placed in '.modinfo'
    ld.lld: warning: kernel/built-in.a(rcu/update.o):(.modinfo) is being placed in '.modinfo'
    
    The '.modinfo' section was added in commit 898490c010b5 ("moduleparam:
    Save information about built-in modules in separate file") to the DISCARDS
    macro but Hexagon has never used that macro.  The unification of DISCARDS
    happened in commit 023bf6f1b8bf ("linker script: unify usage of discard
    definition") in 2009, prior to Hexagon being added in 2011.
    
    Switch Hexagon over to the DISCARDS macro so that anything that is
    expected to be discarded gets discarded.
    
    Link: https://lkml.kernel.org/r/20210521011239.1332345-3-nathan@kernel.org
    Fixes: e95bf452a9e2 ("Hexagon: Add configuration and makefiles for the Hexagon architecture.")
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
    Acked-by: Brian Cain <bcain@codeaurora.org>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Oliver Glitta <glittao@gmail.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/hexagon/kernel/vmlinux.lds.S b/arch/hexagon/kernel/vmlinux.lds.S
index ad69d181c939..757f9554118e 100644
--- a/arch/hexagon/kernel/vmlinux.lds.S
+++ b/arch/hexagon/kernel/vmlinux.lds.S
@@ -73,13 +73,8 @@ SECTIONS
 
 	_end = .;
 
-	/DISCARD/ : {
-		EXIT_TEXT
-		EXIT_DATA
-		EXIT_CALL
-	}
-
 	STABS_DEBUG
 	DWARF_DEBUG
 
+	DISCARDS
 }

commit e3eeeaed0a54f664b025f290a819897af8a1eccc
Author: Trond Myklebust <trond.myklebust@hammerspace.com>
Date:   Sat Jul 3 14:34:20 2021 -0400

    NFSv4/pNFS: Don't call _nfs4_pnfs_v3_ds_connect multiple times
    
    [ Upstream commit f46f84931a0aa344678efe412d4b071d84d8a805 ]
    
    After we grab the lock in nfs4_pnfs_ds_connect(), there is no check for
    whether or not ds->ds_clp has already been initialised, so we can end up
    adding the same transports multiple times.
    
    Fixes: fc821d59209d ("pnfs/NFSv4.1: Add multipath capabilities to pNFS flexfiles servers over NFSv3")
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/nfs/pnfs_nfs.c b/fs/nfs/pnfs_nfs.c
index acfb52bc0007..3f0c2436254a 100644
--- a/fs/nfs/pnfs_nfs.c
+++ b/fs/nfs/pnfs_nfs.c
@@ -555,19 +555,16 @@ nfs4_pnfs_ds_add(struct list_head *dsaddrs, gfp_t gfp_flags)
 }
 EXPORT_SYMBOL_GPL(nfs4_pnfs_ds_add);
 
-static void nfs4_wait_ds_connect(struct nfs4_pnfs_ds *ds)
+static int nfs4_wait_ds_connect(struct nfs4_pnfs_ds *ds)
 {
 	might_sleep();
-	wait_on_bit(&ds->ds_state, NFS4DS_CONNECTING,
-			TASK_KILLABLE);
+	return wait_on_bit(&ds->ds_state, NFS4DS_CONNECTING, TASK_KILLABLE);
 }
 
 static void nfs4_clear_ds_conn_bit(struct nfs4_pnfs_ds *ds)
 {
 	smp_mb__before_atomic();
-	clear_bit(NFS4DS_CONNECTING, &ds->ds_state);
-	smp_mb__after_atomic();
-	wake_up_bit(&ds->ds_state, NFS4DS_CONNECTING);
+	clear_and_wake_up_bit(NFS4DS_CONNECTING, &ds->ds_state);
 }
 
 static struct nfs_client *(*get_v3_ds_connect)(
@@ -728,30 +725,33 @@ int nfs4_pnfs_ds_connect(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds,
 {
 	int err;
 
-again:
-	err = 0;
-	if (test_and_set_bit(NFS4DS_CONNECTING, &ds->ds_state) == 0) {
-		if (version == 3) {
-			err = _nfs4_pnfs_v3_ds_connect(mds_srv, ds, timeo,
-						       retrans);
-		} else if (version == 4) {
-			err = _nfs4_pnfs_v4_ds_connect(mds_srv, ds, timeo,
-						       retrans, minor_version);
-		} else {
-			dprintk("%s: unsupported DS version %d\n", __func__,
-				version);
-			err = -EPROTONOSUPPORT;
-		}
+	do {
+		err = nfs4_wait_ds_connect(ds);
+		if (err || ds->ds_clp)
+			goto out;
+		if (nfs4_test_deviceid_unavailable(devid))
+			return -ENODEV;
+	} while (test_and_set_bit(NFS4DS_CONNECTING, &ds->ds_state) != 0);
 
-		nfs4_clear_ds_conn_bit(ds);
-	} else {
-		nfs4_wait_ds_connect(ds);
+	if (ds->ds_clp)
+		goto connect_done;
 
-		/* what was waited on didn't connect AND didn't mark unavail */
-		if (!ds->ds_clp && !nfs4_test_deviceid_unavailable(devid))
-			goto again;
+	switch (version) {
+	case 3:
+		err = _nfs4_pnfs_v3_ds_connect(mds_srv, ds, timeo, retrans);
+		break;
+	case 4:
+		err = _nfs4_pnfs_v4_ds_connect(mds_srv, ds, timeo, retrans,
+					       minor_version);
+		break;
+	default:
+		dprintk("%s: unsupported DS version %d\n", __func__, version);
+		err = -EPROTONOSUPPORT;
 	}
 
+connect_done:
+	nfs4_clear_ds_conn_bit(ds);
+out:
 	/*
 	 * At this point the ds->ds_clp should be ready, but it might have
 	 * hit an error.

commit 8f7d42d54aa5b5d6965675a7202ccc7813c43265
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Wed Jul 7 15:40:51 2021 +0800

    ALSA: isa: Fix error return code in snd_cmi8330_probe()
    
    [ Upstream commit 31028cbed26a8afa25533a10425ffa2ab794c76c ]
    
    When 'SB_HW_16' check fails, the error code -ENODEV instead of 0 should be
    returned, which is the same as that returned when 'WSS_HW_CMI8330' check
    fails.
    
    Fixes: 43bcd973d6d0 ("[ALSA] Add snd_card_set_generic_dev() call to ISA drivers")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Link: https://lore.kernel.org/r/20210707074051.2663-1-thunder.leizhen@huawei.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/isa/cmi8330.c b/sound/isa/cmi8330.c
index 6b8c46942efb..75b3d76eb852 100644
--- a/sound/isa/cmi8330.c
+++ b/sound/isa/cmi8330.c
@@ -564,7 +564,7 @@ static int snd_cmi8330_probe(struct snd_card *card, int dev)
 	}
 	if (acard->sb->hardware != SB_HW_16) {
 		snd_printk(KERN_ERR PFX "SB16 not found during probe\n");
-		return err;
+		return -ENODEV;
 	}
 
 	snd_wss_out(acard->wss, CS4231_MISC_INFO, 0x40); /* switch on MODE2 */

commit eede0a76a4adb097d0b4e0e0b678c4297b5c1cef
Author: Michael S. Tsirkin <mst@redhat.com>
Date:   Tue Apr 13 01:35:26 2021 -0400

    virtio_net: move tx vq operation under tx queue lock
    
    [ Upstream commit 5a2f966d0f3fa0ef6dada7ab9eda74cacee96b8a ]
    
    It's unsafe to operate a vq from multiple threads.
    Unfortunately this is exactly what we do when invoking
    clean tx poll from rx napi.
    Same happens with napi-tx even without the
    opportunistic cleaning from the receive interrupt: that races
    with processing the vq in start_xmit.
    
    As a fix move everything that deals with the vq to under tx lock.
    
    Fixes: b92f1e6751a6 ("virtio-net: transmit napi")
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index bb11a1e30646..5e8b40630286 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -1506,6 +1506,8 @@ static int virtnet_poll_tx(struct napi_struct *napi, int budget)
 	struct virtnet_info *vi = sq->vq->vdev->priv;
 	unsigned int index = vq2txq(sq->vq);
 	struct netdev_queue *txq;
+	int opaque;
+	bool done;
 
 	if (unlikely(is_xdp_raw_buffer_queue(vi, index))) {
 		/* We don't need to enable cb for XDP */
@@ -1515,10 +1517,28 @@ static int virtnet_poll_tx(struct napi_struct *napi, int budget)
 
 	txq = netdev_get_tx_queue(vi->dev, index);
 	__netif_tx_lock(txq, raw_smp_processor_id());
+	virtqueue_disable_cb(sq->vq);
 	free_old_xmit_skbs(sq, true);
+
+	opaque = virtqueue_enable_cb_prepare(sq->vq);
+
+	done = napi_complete_done(napi, 0);
+
+	if (!done)
+		virtqueue_disable_cb(sq->vq);
+
 	__netif_tx_unlock(txq);
 
-	virtqueue_napi_complete(napi, sq->vq, 0);
+	if (done) {
+		if (unlikely(virtqueue_poll(sq->vq, opaque))) {
+			if (napi_schedule_prep(napi)) {
+				__netif_tx_lock(txq, raw_smp_processor_id());
+				virtqueue_disable_cb(sq->vq);
+				__netif_tx_unlock(txq);
+				__napi_schedule(napi);
+			}
+		}
+	}
 
 	if (sq->vq->num_free >= 2 + MAX_SKB_FRAGS)
 		netif_tx_wake_queue(txq);

commit fecb9b7b06ee288103f0f687b57cb033c96c54ca
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Wed Jun 23 14:01:35 2021 +0200

    x86/fpu: Limit xstate copy size in xstateregs_set()
    
    [ Upstream commit 07d6688b22e09be465652cf2da0da6bf86154df6 ]
    
    If the count argument is larger than the xstate size, this will happily
    copy beyond the end of xstate.
    
    Fixes: 91c3dba7dbc1 ("x86/fpu/xstate: Fix PTRACE frames for XSAVES")
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Reviewed-by: Andy Lutomirski <luto@kernel.org>
    Reviewed-by: Borislav Petkov <bp@suse.de>
    Link: https://lkml.kernel.org/r/20210623121452.120741557@linutronix.de
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/x86/kernel/fpu/regset.c b/arch/x86/kernel/fpu/regset.c
index bc02f5144b95..621d249ded0b 100644
--- a/arch/x86/kernel/fpu/regset.c
+++ b/arch/x86/kernel/fpu/regset.c
@@ -128,7 +128,7 @@ int xstateregs_set(struct task_struct *target, const struct user_regset *regset,
 	/*
 	 * A whole standard-format XSAVE buffer is needed:
 	 */
-	if ((pos != 0) || (count < fpu_user_xstate_size))
+	if (pos != 0 || count != fpu_user_xstate_size)
 		return -EFAULT;
 
 	xsave = &fpu->state.xsave;

commit 778beee03794ee5990dbc9ba14ad1d492f3df8c1
Author: Sandor Bodo-Merle <sbodomerle@gmail.com>
Date:   Tue Jun 22 17:26:30 2021 +0200

    PCI: iproc: Support multi-MSI only on uniprocessor kernel
    
    [ Upstream commit 2dc0a201d0f59e6818ef443609f0850a32910844 ]
    
    The interrupt affinity scheme used by this driver is incompatible with
    multi-MSI as it implies moving the doorbell address to that of another MSI
    group.  This isn't possible for multi-MSI, as all the MSIs must have the
    same doorbell address. As such it is restricted to systems with a single
    CPU.
    
    Link: https://lore.kernel.org/r/20210622152630.40842-2-sbodomerle@gmail.com
    Fixes: fc54bae28818 ("PCI: iproc: Allow allocation of multiple MSIs")
    Reported-by: Marc Zyngier <maz@kernel.org>
    Signed-off-by: Sandor Bodo-Merle <sbodomerle@gmail.com>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Acked-by: Pali Rohár <pali@kernel.org>
    Acked-by: Ray Jui <ray.jui@broadcom.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pci/controller/pcie-iproc-msi.c b/drivers/pci/controller/pcie-iproc-msi.c
index b43ae4c06f30..dc4d5a590795 100644
--- a/drivers/pci/controller/pcie-iproc-msi.c
+++ b/drivers/pci/controller/pcie-iproc-msi.c
@@ -171,7 +171,7 @@ static struct irq_chip iproc_msi_irq_chip = {
 
 static struct msi_domain_info iproc_msi_domain_info = {
 	.flags = MSI_FLAG_USE_DEF_DOM_OPS | MSI_FLAG_USE_DEF_CHIP_OPS |
-		MSI_FLAG_MULTI_PCI_MSI | MSI_FLAG_PCI_MSIX,
+		MSI_FLAG_PCI_MSIX,
 	.chip = &iproc_msi_irq_chip,
 };
 
@@ -250,6 +250,9 @@ static int iproc_msi_irq_domain_alloc(struct irq_domain *domain,
 	struct iproc_msi *msi = domain->host_data;
 	int hwirq, i;
 
+	if (msi->nr_cpus > 1 && nr_irqs > 1)
+		return -EINVAL;
+
 	mutex_lock(&msi->bitmap_lock);
 
 	/*
@@ -539,6 +542,9 @@ int iproc_msi_init(struct iproc_pcie *pcie, struct device_node *node)
 	mutex_init(&msi->bitmap_lock);
 	msi->nr_cpus = num_possible_cpus();
 
+	if (msi->nr_cpus == 1)
+		iproc_msi_domain_info.flags |=  MSI_FLAG_MULTI_PCI_MSI;
+
 	msi->nr_irqs = of_irq_count(node);
 	if (!msi->nr_irqs) {
 		dev_err(pcie->dev, "found no MSI GIC interrupt\n");

commit 99f8eae65c82d7f947349a45e866510e65109d79
Author: Sandor Bodo-Merle <sbodomerle@gmail.com>
Date:   Tue Jun 22 17:26:29 2021 +0200

    PCI: iproc: Fix multi-MSI base vector number allocation
    
    [ Upstream commit e673d697b9a234fc3544ac240e173cef8c82b349 ]
    
    Commit fc54bae28818 ("PCI: iproc: Allow allocation of multiple MSIs")
    introduced multi-MSI support with a broken allocation mechanism (it failed
    to reserve the proper number of bits from the inner domain).  Natural
    alignment of the base vector number was also not guaranteed.
    
    Link: https://lore.kernel.org/r/20210622152630.40842-1-sbodomerle@gmail.com
    Fixes: fc54bae28818 ("PCI: iproc: Allow allocation of multiple MSIs")
    Reported-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Sandor Bodo-Merle <sbodomerle@gmail.com>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Acked-by: Pali Rohár <pali@kernel.org>
    Acked-by: Ray Jui <ray.jui@broadcom.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pci/controller/pcie-iproc-msi.c b/drivers/pci/controller/pcie-iproc-msi.c
index dc953c73cb56..b43ae4c06f30 100644
--- a/drivers/pci/controller/pcie-iproc-msi.c
+++ b/drivers/pci/controller/pcie-iproc-msi.c
@@ -252,18 +252,18 @@ static int iproc_msi_irq_domain_alloc(struct irq_domain *domain,
 
 	mutex_lock(&msi->bitmap_lock);
 
-	/* Allocate 'nr_cpus' number of MSI vectors each time */
-	hwirq = bitmap_find_next_zero_area(msi->bitmap, msi->nr_msi_vecs, 0,
-					   msi->nr_cpus, 0);
-	if (hwirq < msi->nr_msi_vecs) {
-		bitmap_set(msi->bitmap, hwirq, msi->nr_cpus);
-	} else {
-		mutex_unlock(&msi->bitmap_lock);
-		return -ENOSPC;
-	}
+	/*
+	 * Allocate 'nr_irqs' multiplied by 'nr_cpus' number of MSI vectors
+	 * each time
+	 */
+	hwirq = bitmap_find_free_region(msi->bitmap, msi->nr_msi_vecs,
+					order_base_2(msi->nr_cpus * nr_irqs));
 
 	mutex_unlock(&msi->bitmap_lock);
 
+	if (hwirq < 0)
+		return -ENOSPC;
+
 	for (i = 0; i < nr_irqs; i++) {
 		irq_domain_set_info(domain, virq + i, hwirq + i,
 				    &iproc_msi_bottom_irq_chip,
@@ -284,7 +284,8 @@ static void iproc_msi_irq_domain_free(struct irq_domain *domain,
 	mutex_lock(&msi->bitmap_lock);
 
 	hwirq = hwirq_to_canonical_hwirq(msi, data->hwirq);
-	bitmap_clear(msi->bitmap, hwirq, msi->nr_cpus);
+	bitmap_release_region(msi->bitmap, hwirq,
+			      order_base_2(msi->nr_cpus * nr_irqs));
 
 	mutex_unlock(&msi->bitmap_lock);
 

commit e6afff12ac74a5e5eef4b6656a07de24080b712a
Author: Zhihao Cheng <chengzhihao1@huawei.com>
Date:   Fri Jun 18 16:11:03 2021 +0800

    ubifs: Set/Clear I_LINKABLE under i_lock for whiteout inode
    
    [ Upstream commit a801fcfeef96702fa3f9b22ad56c5eb1989d9221 ]
    
    xfstests-generic/476 reports a warning message as below:
    
    WARNING: CPU: 2 PID: 30347 at fs/inode.c:361 inc_nlink+0x52/0x70
    Call Trace:
      do_rename+0x502/0xd40 [ubifs]
      ubifs_rename+0x8b/0x180 [ubifs]
      vfs_rename+0x476/0x1080
      do_renameat2+0x67c/0x7b0
      __x64_sys_renameat2+0x6e/0x90
      do_syscall_64+0x66/0xe0
      entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Following race case can cause this:
             rename_whiteout(Thread 1)             wb_workfn(Thread 2)
    ubifs_rename
      do_rename
                                              __writeback_single_inode
                                                spin_lock(&inode->i_lock)
        whiteout->i_state |= I_LINKABLE
                                                inode->i_state &= ~dirty;
    ---- How race happens on i_state:
        (tmp = whiteout->i_state | I_LINKABLE)
                                               (tmp = inode->i_state & ~dirty)
        (whiteout->i_state = tmp)
                                               (inode->i_state = tmp)
    ----
                                                spin_unlock(&inode->i_lock)
        inc_nlink(whiteout)
        WARN_ON(!(inode->i_state & I_LINKABLE)) !!!
    
    Fix to add i_lock to avoid i_state update race condition.
    
    Fixes: 9e0a1fff8db56ea ("ubifs: Implement RENAME_WHITEOUT")
    Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
    Signed-off-by: Richard Weinberger <richard@nod.at>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/ubifs/dir.c b/fs/ubifs/dir.c
index 8fe2ee5462a0..dbdf6a4230fb 100644
--- a/fs/ubifs/dir.c
+++ b/fs/ubifs/dir.c
@@ -1354,7 +1354,10 @@ static int do_rename(struct inode *old_dir, struct dentry *old_dentry,
 			goto out_release;
 		}
 
+		spin_lock(&whiteout->i_lock);
 		whiteout->i_state |= I_LINKABLE;
+		spin_unlock(&whiteout->i_lock);
+
 		whiteout_ui = ubifs_inode(whiteout);
 		whiteout_ui->data = dev;
 		whiteout_ui->data_len = ubifs_encode_dev(dev, MKDEV(0, 0));
@@ -1447,7 +1450,11 @@ static int do_rename(struct inode *old_dir, struct dentry *old_dentry,
 
 		inc_nlink(whiteout);
 		mark_inode_dirty(whiteout);
+
+		spin_lock(&whiteout->i_lock);
 		whiteout->i_state &= ~I_LINKABLE;
+		spin_unlock(&whiteout->i_lock);
+
 		iput(whiteout);
 	}
 

commit 0704f617040c397ae73c1f88f3956787ec5d6529
Author: Gao Xiang <hsiangkao@linux.alibaba.com>
Date:   Fri Jun 18 12:20:55 2021 +0800

    nfs: fix acl memory leak of posix_acl_create()
    
    [ Upstream commit 1fcb6fcd74a222d9ead54d405842fc763bb86262 ]
    
    When looking into another nfs xfstests report, I found acl and
    default_acl in nfs3_proc_create() and nfs3_proc_mknod() error
    paths are possibly leaked. Fix them in advance.
    
    Fixes: 013cdf1088d7 ("nfs: use generic posix ACL infrastructure for v3 Posix ACLs")
    Cc: Trond Myklebust <trond.myklebust@hammerspace.com>
    Cc: Anna Schumaker <anna.schumaker@netapp.com>
    Cc: Christoph Hellwig <hch@infradead.org>
    Cc: Joseph Qi <joseph.qi@linux.alibaba.com>
    Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c
index ec8a9efa268f..e302f8370b9b 100644
--- a/fs/nfs/nfs3proc.c
+++ b/fs/nfs/nfs3proc.c
@@ -346,7 +346,7 @@ nfs3_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
 				break;
 
 			case NFS3_CREATE_UNCHECKED:
-				goto out;
+				goto out_release_acls;
 		}
 		nfs_fattr_init(data->res.dir_attr);
 		nfs_fattr_init(data->res.fattr);
@@ -695,7 +695,7 @@ nfs3_proc_mknod(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
 		break;
 	default:
 		status = -EINVAL;
-		goto out;
+		goto out_release_acls;
 	}
 
 	status = nfs3_do_create(dir, dentry, data);

commit 14150b631675f3f4b2a1853ff07ebe594c0aa6a6
Author: Tao Ren <rentao.bupt@gmail.com>
Date:   Fri Apr 16 20:42:49 2021 -0700

    watchdog: aspeed: fix hardware timeout calculation
    
    [ Upstream commit e7dc481c92060f9ce872878b0b7a08c24713a7e5 ]
    
    Fix hardware timeout calculation in aspeed_wdt_set_timeout function to
    ensure the reload value does not exceed the hardware limit.
    
    Fixes: efa859f7d786 ("watchdog: Add Aspeed watchdog driver")
    Reported-by: Amithash Prasad <amithash@fb.com>
    Signed-off-by: Tao Ren <rentao.bupt@gmail.com>
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    Link: https://lore.kernel.org/r/20210417034249.5978-1-rentao.bupt@gmail.com
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/watchdog/aspeed_wdt.c b/drivers/watchdog/aspeed_wdt.c
index d84d6cbd9697..814041d4e287 100644
--- a/drivers/watchdog/aspeed_wdt.c
+++ b/drivers/watchdog/aspeed_wdt.c
@@ -149,7 +149,7 @@ static int aspeed_wdt_set_timeout(struct watchdog_device *wdd,
 
 	wdd->timeout = timeout;
 
-	actual = min(timeout, wdd->max_hw_heartbeat_ms * 1000);
+	actual = min(timeout, wdd->max_hw_heartbeat_ms / 1000);
 
 	writel(actual * WDT_RATE_1MHZ, wdt->base + WDT_RELOAD_VALUE);
 	writel(WDT_RESTART_MAGIC, wdt->base + WDT_RESTART);

commit cc91a4549be87e82cf3174508fedd564e265c151
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Sat May 8 11:22:39 2021 +0800

    um: fix error return code in winch_tramp()
    
    [ Upstream commit ccf1236ecac476d9d2704866d9a476c86e387971 ]
    
    Fix to return a negative error code from the error handling case instead
    of 0, as done elsewhere in this function.
    
    Fixes: 89df6bfc0405 ("uml: DEBUG_SHIRQ fixes")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Acked-By: anton.ivanov@cambridgegreys.com
    Signed-off-by: Richard Weinberger <richard@nod.at>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/um/drivers/chan_user.c b/arch/um/drivers/chan_user.c
index 9cffbbb15c56..669124d5290b 100644
--- a/arch/um/drivers/chan_user.c
+++ b/arch/um/drivers/chan_user.c
@@ -256,7 +256,8 @@ static int winch_tramp(int fd, struct tty_port *port, int *fd_out,
 		goto out_close;
 	}
 
-	if (os_set_fd_block(*fd_out, 0)) {
+	err = os_set_fd_block(*fd_out, 0);
+	if (err) {
 		printk(UM_KERN_ERR "winch_tramp: failed to set thread_fd "
 		       "non-blocking.\n");
 		goto out_close;

commit 33a260142e15159b7cb4591000abe5e7d667a8c1
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Sat May 8 11:13:54 2021 +0800

    um: fix error return code in slip_open()
    
    [ Upstream commit b77e81fbe5f5fb4ad9a61ec80f6d1e30b6da093a ]
    
    Fix to return a negative error code from the error handling case instead
    of 0, as done elsewhere in this function.
    
    Fixes: a3c77c67a443 ("[PATCH] uml: slirp and slip driver cleanups and fixes")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Acked-By: anton.ivanov@cambridgegreys.com
    Signed-off-by: Richard Weinberger <richard@nod.at>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/um/drivers/slip_user.c b/arch/um/drivers/slip_user.c
index 0d6b66c64a81..76d155631c5d 100644
--- a/arch/um/drivers/slip_user.c
+++ b/arch/um/drivers/slip_user.c
@@ -145,7 +145,8 @@ static int slip_open(void *data)
 	}
 	sfd = err;
 
-	if (set_up_tty(sfd))
+	err = set_up_tty(sfd);
+	if (err)
 		goto out_close2;
 
 	pri->slave = sfd;

commit 743f6b973c8ba8a0a5ed15ab11e1d07fa00d5368
Author: Trond Myklebust <trond.myklebust@hammerspace.com>
Date:   Wed Jun 9 10:04:46 2021 -0400

    NFSv4: Initialise connection to the server in nfs4_alloc_client()
    
    [ Upstream commit dd99e9f98fbf423ff6d365b37a98e8879170f17c ]
    
    Set up the connection to the NFSv4 server in nfs4_alloc_client(), before
    we've added the struct nfs_client to the net-namespace's nfs_client_list
    so that a downed server won't cause other mounts to hang in the trunking
    detection code.
    
    Reported-by: Michael Wakabayashi <mwakabayashi@vmware.com>
    Fixes: 5c6e5b60aae4 ("NFS: Fix an Oops in the pNFS files and flexfiles connection setup to the DS")
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c
index b5ce70c4ec87..43659326b519 100644
--- a/fs/nfs/nfs4client.c
+++ b/fs/nfs/nfs4client.c
@@ -191,8 +191,11 @@ void nfs40_shutdown_client(struct nfs_client *clp)
 
 struct nfs_client *nfs4_alloc_client(const struct nfs_client_initdata *cl_init)
 {
-	int err;
+	char buf[INET6_ADDRSTRLEN + 1];
+	const char *ip_addr = cl_init->ip_addr;
 	struct nfs_client *clp = nfs_alloc_client(cl_init);
+	int err;
+
 	if (IS_ERR(clp))
 		return clp;
 
@@ -216,6 +219,44 @@ struct nfs_client *nfs4_alloc_client(const struct nfs_client_initdata *cl_init)
 	init_waitqueue_head(&clp->cl_lock_waitq);
 #endif
 	INIT_LIST_HEAD(&clp->pending_cb_stateids);
+
+	if (cl_init->minorversion != 0)
+		__set_bit(NFS_CS_INFINITE_SLOTS, &clp->cl_flags);
+	__set_bit(NFS_CS_DISCRTRY, &clp->cl_flags);
+	__set_bit(NFS_CS_NO_RETRANS_TIMEOUT, &clp->cl_flags);
+
+	/*
+	 * Set up the connection to the server before we add add to the
+	 * global list.
+	 */
+	err = nfs_create_rpc_client(clp, cl_init, RPC_AUTH_GSS_KRB5I);
+	if (err == -EINVAL)
+		err = nfs_create_rpc_client(clp, cl_init, RPC_AUTH_UNIX);
+	if (err < 0)
+		goto error;
+
+	/* If no clientaddr= option was specified, find a usable cb address */
+	if (ip_addr == NULL) {
+		struct sockaddr_storage cb_addr;
+		struct sockaddr *sap = (struct sockaddr *)&cb_addr;
+
+		err = rpc_localaddr(clp->cl_rpcclient, sap, sizeof(cb_addr));
+		if (err < 0)
+			goto error;
+		err = rpc_ntop(sap, buf, sizeof(buf));
+		if (err < 0)
+			goto error;
+		ip_addr = (const char *)buf;
+	}
+	strlcpy(clp->cl_ipaddr, ip_addr, sizeof(clp->cl_ipaddr));
+
+	err = nfs_idmap_new(clp);
+	if (err < 0) {
+		dprintk("%s: failed to create idmapper. Error = %d\n",
+			__func__, err);
+		goto error;
+	}
+	__set_bit(NFS_CS_IDMAP, &clp->cl_res_state);
 	return clp;
 
 error:
@@ -368,8 +409,6 @@ static int nfs4_init_client_minor_version(struct nfs_client *clp)
 struct nfs_client *nfs4_init_client(struct nfs_client *clp,
 				    const struct nfs_client_initdata *cl_init)
 {
-	char buf[INET6_ADDRSTRLEN + 1];
-	const char *ip_addr = cl_init->ip_addr;
 	struct nfs_client *old;
 	int error;
 
@@ -377,43 +416,6 @@ struct nfs_client *nfs4_init_client(struct nfs_client *clp,
 		/* the client is initialised already */
 		return clp;
 
-	/* Check NFS protocol revision and initialize RPC op vector */
-	clp->rpc_ops = &nfs_v4_clientops;
-
-	if (clp->cl_minorversion != 0)
-		__set_bit(NFS_CS_INFINITE_SLOTS, &clp->cl_flags);
-	__set_bit(NFS_CS_DISCRTRY, &clp->cl_flags);
-	__set_bit(NFS_CS_NO_RETRANS_TIMEOUT, &clp->cl_flags);
-
-	error = nfs_create_rpc_client(clp, cl_init, RPC_AUTH_GSS_KRB5I);
-	if (error == -EINVAL)
-		error = nfs_create_rpc_client(clp, cl_init, RPC_AUTH_UNIX);
-	if (error < 0)
-		goto error;
-
-	/* If no clientaddr= option was specified, find a usable cb address */
-	if (ip_addr == NULL) {
-		struct sockaddr_storage cb_addr;
-		struct sockaddr *sap = (struct sockaddr *)&cb_addr;
-
-		error = rpc_localaddr(clp->cl_rpcclient, sap, sizeof(cb_addr));
-		if (error < 0)
-			goto error;
-		error = rpc_ntop(sap, buf, sizeof(buf));
-		if (error < 0)
-			goto error;
-		ip_addr = (const char *)buf;
-	}
-	strlcpy(clp->cl_ipaddr, ip_addr, sizeof(clp->cl_ipaddr));
-
-	error = nfs_idmap_new(clp);
-	if (error < 0) {
-		dprintk("%s: failed to create idmapper. Error = %d\n",
-			__func__, error);
-		goto error;
-	}
-	__set_bit(NFS_CS_IDMAP, &clp->cl_res_state);
-
 	error = nfs4_init_client_minor_version(clp);
 	if (error < 0)
 		goto error;

commit da7680aab76835d2deeee2edc301d0f9a227cc31
Author: Stephan Gerhold <stephan@gerhold.net>
Date:   Mon May 17 12:51:12 2021 +0200

    power: supply: rt5033_battery: Fix device tree enumeration
    
    [ Upstream commit f3076cd8d1d5fa64b5e1fa5affc045c2fc123baa ]
    
    The fuel gauge in the RT5033 PMIC has its own I2C bus and interrupt
    line. Therefore, it is not actually part of the RT5033 MFD and needs
    its own of_match_table to probe properly.
    
    Also, given that it's independent of the MFD, there is actually
    no need to make the Kconfig depend on MFD_RT5033. Although the driver
    uses the shared <linux/mfd/rt5033.h> header, there is no compile
    or runtime dependency on the RT5033 MFD driver.
    
    Cc: Beomho Seo <beomho.seo@samsung.com>
    Cc: Chanwoo Choi <cw00.choi@samsung.com>
    Fixes: b847dd96e659 ("power: rt5033_battery: Add RT5033 Fuel gauge device driver")
    Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig
index 76c699b5abda..1d656aa2c6d6 100644
--- a/drivers/power/supply/Kconfig
+++ b/drivers/power/supply/Kconfig
@@ -621,7 +621,8 @@ config BATTERY_GOLDFISH
 
 config BATTERY_RT5033
 	tristate "RT5033 fuel gauge support"
-	depends on MFD_RT5033
+	depends on I2C
+	select REGMAP_I2C
 	help
 	  This adds support for battery fuel gauge in Richtek RT5033 PMIC.
 	  The fuelgauge calculates and determines the battery state of charge
diff --git a/drivers/power/supply/rt5033_battery.c b/drivers/power/supply/rt5033_battery.c
index bcdd83048492..9310b85f3405 100644
--- a/drivers/power/supply/rt5033_battery.c
+++ b/drivers/power/supply/rt5033_battery.c
@@ -167,9 +167,16 @@ static const struct i2c_device_id rt5033_battery_id[] = {
 };
 MODULE_DEVICE_TABLE(i2c, rt5033_battery_id);
 
+static const struct of_device_id rt5033_battery_of_match[] = {
+	{ .compatible = "richtek,rt5033-battery", },
+	{ }
+};
+MODULE_DEVICE_TABLE(of, rt5033_battery_of_match);
+
 static struct i2c_driver rt5033_battery_driver = {
 	.driver = {
 		.name = "rt5033-battery",
+		.of_match_table = rt5033_battery_of_match,
 	},
 	.probe = rt5033_battery_probe,
 	.remove = rt5033_battery_remove,

commit 1b78ad07da08ca15c47af0669d5a4e4f896cbb3c
Author: Krzysztof Wilczy?ski <kw@linux.com>
Date:   Thu Jun 3 00:01:12 2021 +0000

    PCI/sysfs: Fix dsm_label_utf16s_to_utf8s() buffer overrun
    
    [ Upstream commit bdcdaa13ad96f1a530711c29e6d4b8311eff767c ]
    
    "utf16s_to_utf8s(..., buf, PAGE_SIZE)" puts up to PAGE_SIZE bytes into
    "buf" and returns the number of bytes it actually put there.  If it wrote
    PAGE_SIZE bytes, the newline added by dsm_label_utf16s_to_utf8s() would
    overrun "buf".
    
    Reduce the size available for utf16s_to_utf8s() to use so there is always
    space for the newline.
    
    [bhelgaas: reorder patch in series, commit log]
    Fixes: 6058989bad05 ("PCI: Export ACPI _DSM provided firmware instance number and string name to sysfs")
    Link: https://lore.kernel.org/r/20210603000112.703037-7-kw@linux.com
    Reported-by: Joe Perches <joe@perches.com>
    Signed-off-by: Krzysztof Wilczy?ski <kw@linux.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pci/pci-label.c b/drivers/pci/pci-label.c
index a5910f942857..9fb4ef568f40 100644
--- a/drivers/pci/pci-label.c
+++ b/drivers/pci/pci-label.c
@@ -162,7 +162,7 @@ static void dsm_label_utf16s_to_utf8s(union acpi_object *obj, char *buf)
 	len = utf16s_to_utf8s((const wchar_t *)obj->buffer.pointer,
 			      obj->buffer.length,
 			      UTF16_LITTLE_ENDIAN,
-			      buf, PAGE_SIZE);
+			      buf, PAGE_SIZE - 1);
 	buf[len] = '\n';
 }
 

commit 6f8ab706a62e2e2cf3c390b0c46f0bedbb8b1028
Author: Chao Yu <yuchao0@huawei.com>
Date:   Tue May 18 09:57:54 2021 +0800

    f2fs: add MODULE_SOFTDEP to ensure crc32 is included in the initramfs
    
    [ Upstream commit 0dd571785d61528d62cdd8aa49d76bc6085152fe ]
    
    As marcosfrm reported in bugzilla:
    
    https://bugzilla.kernel.org/show_bug.cgi?id=213089
    
    Initramfs generators rely on "pre" softdeps (and "depends") to include
    additional required modules.
    
    F2FS does not declare "pre: crc32" softdep. Then every generator (dracut,
    mkinitcpio...) has to maintain a hardcoded list for this purpose.
    
    Hence let's use MODULE_SOFTDEP("pre: crc32") in f2fs code.
    
    Fixes: 43b6573bac95 ("f2fs: use cryptoapi crc32 functions")
    Reported-by: marcosfrm <marcosfrm@gmail.com>
    Signed-off-by: Chao Yu <yuchao0@huawei.com>
    Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index 161ce0eb8891..89fc8a4ce149 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -3373,4 +3373,5 @@ module_exit(exit_f2fs_fs)
 MODULE_AUTHOR("Samsung Electronics's Praesto Team");
 MODULE_DESCRIPTION("Flash Friendly File System");
 MODULE_LICENSE("GPL");
+MODULE_SOFTDEP("pre: crc32");
 

commit b5fba782ccd3d12a14f884cd20f255fc9c0eec0c
Author: Xie Yongji <xieyongji@bytedance.com>
Date:   Tue May 25 20:56:22 2021 +0800

    virtio_console: Assure used length from device is limited
    
    [ Upstream commit d00d8da5869a2608e97cfede094dfc5e11462a46 ]
    
    The buf->len might come from an untrusted device. This
    ensures the value would not exceed the size of the buffer
    to avoid data corruption or loss.
    
    Signed-off-by: Xie Yongji <xieyongji@bytedance.com>
    Acked-by: Jason Wang <jasowang@redhat.com>
    Link: https://lore.kernel.org/r/20210525125622.1203-1-xieyongji@bytedance.com
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index ca71ee939533..cdf441942bae 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -488,7 +488,7 @@ static struct port_buffer *get_inbuf(struct port *port)
 
 	buf = virtqueue_get_buf(port->in_vq, &len);
 	if (buf) {
-		buf->len = len;
+		buf->len = min_t(size_t, len, buf->size);
 		buf->offset = 0;
 		port->stats.bytes_received += len;
 	}
@@ -1738,7 +1738,7 @@ static void control_work_handler(struct work_struct *work)
 	while ((buf = virtqueue_get_buf(vq, &len))) {
 		spin_unlock(&portdev->c_ivq_lock);
 
-		buf->len = len;
+		buf->len = min_t(size_t, len, buf->size);
 		buf->offset = 0;
 
 		handle_control_message(vq->vdev, portdev, buf);

commit 845ae8523f5a9ecfdbed48b485cb4ffae71df95b
Author: Xie Yongji <xieyongji@bytedance.com>
Date:   Mon May 17 16:45:16 2021 +0800

    virtio_net: Fix error handling in virtnet_restore()
    
    [ Upstream commit 3f2869cace829fb4b80fc53b3ddaa7f4ba9acbf1 ]
    
    Do some cleanups in virtnet_restore() when virtnet_cpu_notif_add() failed.
    
    Signed-off-by: Xie Yongji <xieyongji@bytedance.com>
    Link: https://lore.kernel.org/r/20210517084516.332-1-xieyongji@bytedance.com
    Acked-by: Jason Wang <jasowang@redhat.com>
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 84a82c4a9535..bb11a1e30646 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -3199,8 +3199,11 @@ static __maybe_unused int virtnet_restore(struct virtio_device *vdev)
 	virtnet_set_queues(vi, vi->curr_queue_pairs);
 
 	err = virtnet_cpu_notif_add(vi);
-	if (err)
+	if (err) {
+		virtnet_freeze_down(vdev);
+		remove_vq_common(vi);
 		return err;
+	}
 
 	return 0;
 }

commit 600942d2fd49b90e44857d20c774b20d16f3130f
Author: Xie Yongji <xieyongji@bytedance.com>
Date:   Mon May 17 16:43:32 2021 +0800

    virtio-blk: Fix memory leak among suspend/resume procedure
    
    [ Upstream commit b71ba22e7c6c6b279c66f53ee7818709774efa1f ]
    
    The vblk->vqs should be freed before we call init_vqs()
    in virtblk_restore().
    
    Signed-off-by: Xie Yongji <xieyongji@bytedance.com>
    Link: https://lore.kernel.org/r/20210517084332.280-1-xieyongji@bytedance.com
    Acked-by: Jason Wang <jasowang@redhat.com>
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index c2d9459ec5d1..dac1769146d7 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -944,6 +944,8 @@ static int virtblk_freeze(struct virtio_device *vdev)
 	blk_mq_quiesce_queue(vblk->disk->queue);
 
 	vdev->config->del_vqs(vdev);
+	kfree(vblk->vqs);
+
 	return 0;
 }
 

commit 6b820a378a2084f50826db3fcfa62102e1dafbbe
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Wed Jun 30 17:23:16 2021 +0200

    ACPI: video: Add quirk for the Dell Vostro 3350
    
    [ Upstream commit 9249c32ec9197e8d34fe5179c9e31668a205db04 ]
    
    The Dell Vostro 3350 ACPI video-bus device reports spurious
    ACPI_VIDEO_NOTIFY_CYCLE events resulting in spurious KEY_SWITCHVIDEOMODE
    events being reported to userspace (and causing trouble there).
    
    Add a quirk setting the report_key_events mask to
    REPORT_BRIGHTNESS_KEY_EVENTS so that the ACPI_VIDEO_NOTIFY_CYCLE
    events will be ignored, while still reporting brightness up/down
    hotkey-presses to userspace normally.
    
    BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1911763
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/acpi/acpi_video.c b/drivers/acpi/acpi_video.c
index 1a23e7aa74df..ac54fc03cf81 100644
--- a/drivers/acpi/acpi_video.c
+++ b/drivers/acpi/acpi_video.c
@@ -556,6 +556,15 @@ static const struct dmi_system_id video_dmi_table[] = {
 		DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V131"),
 		},
 	},
+	{
+	 .callback = video_set_report_key_events,
+	 .driver_data = (void *)((uintptr_t)REPORT_BRIGHTNESS_KEY_EVENTS),
+	 .ident = "Dell Vostro 3350",
+	 .matches = {
+		DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+		DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 3350"),
+		},
+	},
 	/*
 	 * Some machines change the brightness themselves when a brightness
 	 * hotkey gets pressed, despite us telling them not to. In this case

commit 6a8a25196a818096f02c187233812c312359c1c9
Author: Liguang Zhang <zhangliguang@linux.alibaba.com>
Date:   Tue Jun 29 19:27:48 2021 +0800

    ACPI: AMBA: Fix resource name in /proc/iomem
    
    [ Upstream commit 7718629432676b5ebd9a32940782fe297a0abf8d ]
    
    In function amba_handler_attach(), dev->res.name is initialized by
    amba_device_alloc. But when address_found is false, dev->res.name is
    assigned to null value, which leads to wrong resource name display in
    /proc/iomem, "<BAD>" is seen for those resources.
    
    Signed-off-by: Liguang Zhang <zhangliguang@linux.alibaba.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/acpi/acpi_amba.c b/drivers/acpi/acpi_amba.c
index 7f77c071709a..eb09ee71ceb2 100644
--- a/drivers/acpi/acpi_amba.c
+++ b/drivers/acpi/acpi_amba.c
@@ -70,6 +70,7 @@ static int amba_handler_attach(struct acpi_device *adev,
 		case IORESOURCE_MEM:
 			if (!address_found) {
 				dev->res = *rentry->res;
+				dev->res.name = dev_name(&dev->dev);
 				address_found = true;
 			}
 			break;

commit 8c55de0f1995f194eed1ee36c0a6d87c12f97d34
Author: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Date:   Thu Jun 17 11:51:41 2021 +0200

    pwm: tegra: Don't modify HW state in .remove callback
    
    [ Upstream commit 86f7fa71cd830d18d7ebcaf719dffd5ddfe1acdd ]
    
    A consumer is expected to disable a PWM before calling pwm_put(). And if
    they didn't there is hopefully a good reason (or the consumer needs
    fixing). Also if disabling an enabled PWM was the right thing to do,
    this should better be done in the framework instead of in each low level
    driver.
    
    So drop the hardware modification from the .remove() callback.
    
    Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
    Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pwm/pwm-tegra.c b/drivers/pwm/pwm-tegra.c
index f8ebbece57b7..6be14e0f1dc3 100644
--- a/drivers/pwm/pwm-tegra.c
+++ b/drivers/pwm/pwm-tegra.c
@@ -245,7 +245,6 @@ static int tegra_pwm_probe(struct platform_device *pdev)
 static int tegra_pwm_remove(struct platform_device *pdev)
 {
 	struct tegra_pwm_chip *pc = platform_get_drvdata(pdev);
-	unsigned int i;
 	int err;
 
 	if (WARN_ON(!pc))
@@ -255,18 +254,6 @@ static int tegra_pwm_remove(struct platform_device *pdev)
 	if (err < 0)
 		return err;
 
-	for (i = 0; i < pc->chip.npwm; i++) {
-		struct pwm_device *pwm = &pc->chip.pwms[i];
-
-		if (!pwm_is_enabled(pwm))
-			if (clk_prepare_enable(pc->clk) < 0)
-				continue;
-
-		pwm_writel(pc, i, 0);
-
-		clk_disable_unprepare(pc->clk);
-	}
-
 	reset_control_assert(pc->rst);
 	clk_disable_unprepare(pc->clk);
 

commit 6e4199c16686badb074b1e38355a65c534c2bb6c
Author: Zou Wei <zou_wei@huawei.com>
Date:   Sat Jun 5 09:21:41 2021 +0800

    power: supply: ab8500: add missing MODULE_DEVICE_TABLE
    
    [ Upstream commit dfe52db13ab8d24857a9840ec7ca75eef800c26c ]
    
    This patch adds missing MODULE_DEVICE_TABLE definition which generates
    correct modalias for automatic loading of this driver when it is built
    as an external module.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zou Wei <zou_wei@huawei.com>
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/power/supply/ab8500_btemp.c b/drivers/power/supply/ab8500_btemp.c
index 708fd58cd62b..0fd24577112e 100644
--- a/drivers/power/supply/ab8500_btemp.c
+++ b/drivers/power/supply/ab8500_btemp.c
@@ -1120,6 +1120,7 @@ static const struct of_device_id ab8500_btemp_match[] = {
 	{ .compatible = "stericsson,ab8500-btemp", },
 	{ },
 };
+MODULE_DEVICE_TABLE(of, ab8500_btemp_match);
 
 static struct platform_driver ab8500_btemp_driver = {
 	.probe = ab8500_btemp_probe,
diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
index 76b6c60cde80..0f379fa3385e 100644
--- a/drivers/power/supply/ab8500_charger.c
+++ b/drivers/power/supply/ab8500_charger.c
@@ -3639,6 +3639,7 @@ static const struct of_device_id ab8500_charger_match[] = {
 	{ .compatible = "stericsson,ab8500-charger", },
 	{ },
 };
+MODULE_DEVICE_TABLE(of, ab8500_charger_match);
 
 static struct platform_driver ab8500_charger_driver = {
 	.probe = ab8500_charger_probe,
diff --git a/drivers/power/supply/ab8500_fg.c b/drivers/power/supply/ab8500_fg.c
index 8bb89c697c1e..b0e77324b016 100644
--- a/drivers/power/supply/ab8500_fg.c
+++ b/drivers/power/supply/ab8500_fg.c
@@ -3221,6 +3221,7 @@ static const struct of_device_id ab8500_fg_match[] = {
 	{ .compatible = "stericsson,ab8500-fg", },
 	{ },
 };
+MODULE_DEVICE_TABLE(of, ab8500_fg_match);
 
 static struct platform_driver ab8500_fg_driver = {
 	.probe = ab8500_fg_probe,

commit 87d03711db617565f54e63648fd7713774605529
Author: Zou Wei <zou_wei@huawei.com>
Date:   Sat Jun 5 09:21:54 2021 +0800

    power: supply: charger-manager: add missing MODULE_DEVICE_TABLE
    
    [ Upstream commit 073b5d5b1f9cc94a3eea25279fbafee3f4f5f097 ]
    
    This patch adds missing MODULE_DEVICE_TABLE definition which generates
    correct modalias for automatic loading of this driver when it is built
    as an external module.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zou Wei <zou_wei@huawei.com>
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/power/supply/charger-manager.c b/drivers/power/supply/charger-manager.c
index 7ae983e37f64..eec79db9b750 100644
--- a/drivers/power/supply/charger-manager.c
+++ b/drivers/power/supply/charger-manager.c
@@ -1484,6 +1484,7 @@ static const struct of_device_id charger_manager_match[] = {
 	},
 	{},
 };
+MODULE_DEVICE_TABLE(of, charger_manager_match);
 
 static struct charger_desc *of_cm_parse_desc(struct device *dev)
 {

commit e409580b19ec7923082e90c1ec9505aa0867f21d
Author: Trond Myklebust <trond.myklebust@hammerspace.com>
Date:   Tue May 11 23:41:10 2021 -0400

    NFS: nfs_find_open_context() may only select open files
    
    [ Upstream commit e97bc66377bca097e1f3349ca18ca17f202ff659 ]
    
    If a file has already been closed, then it should not be selected to
    support further I/O.
    
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    [Trond: Fix an invalid pointer deref reported by Colin Ian King]
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index dc55ecc3bec4..2cdd8883b7c5 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -1038,6 +1038,7 @@ EXPORT_SYMBOL_GPL(nfs_inode_attach_open_context);
 void nfs_file_set_open_context(struct file *filp, struct nfs_open_context *ctx)
 {
 	filp->private_data = get_nfs_open_context(ctx);
+	set_bit(NFS_CONTEXT_FILE_OPEN, &ctx->flags);
 	if (list_empty(&ctx->list))
 		nfs_inode_attach_open_context(ctx);
 }
@@ -1057,6 +1058,8 @@ struct nfs_open_context *nfs_find_open_context(struct inode *inode, struct rpc_c
 			continue;
 		if ((pos->mode & (FMODE_READ|FMODE_WRITE)) != mode)
 			continue;
+		if (!test_bit(NFS_CONTEXT_FILE_OPEN, &pos->flags))
+			continue;
 		ctx = get_nfs_open_context(pos);
 		break;
 	}
@@ -1071,6 +1074,7 @@ void nfs_file_clear_open_context(struct file *filp)
 	if (ctx) {
 		struct inode *inode = d_inode(ctx->dentry);
 
+		clear_bit(NFS_CONTEXT_FILE_OPEN, &ctx->flags);
 		/*
 		 * We fatal error on write before. Try to writeback
 		 * every page again.
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h
index a0831e9d19c9..0ff7dd2bf8a4 100644
--- a/include/linux/nfs_fs.h
+++ b/include/linux/nfs_fs.h
@@ -78,6 +78,7 @@ struct nfs_open_context {
 #define NFS_CONTEXT_RESEND_WRITES	(1)
 #define NFS_CONTEXT_BAD			(2)
 #define NFS_CONTEXT_UNLOCK	(3)
+#define NFS_CONTEXT_FILE_OPEN		(4)
 	int error;
 
 	struct list_head list;

commit 291ddd4e9c5352a4aace1dfb4f3100c743cd87c7
Author: Jeff Layton <jlayton@kernel.org>
Date:   Tue May 4 10:08:30 2021 -0400

    ceph: remove bogus checks and WARN_ONs from ceph_set_page_dirty
    
    [ Upstream commit 22d41cdcd3cfd467a4af074165357fcbea1c37f5 ]
    
    The checks for page->mapping are odd, as set_page_dirty is an
    address_space operation, and I don't see where it would be called on a
    non-pagecache page.
    
    The warning about the page lock also seems bogus.  The comment over
    set_page_dirty() says that it can be called without the page lock in
    some rare cases. I don't think we want to warn if that's the case.
    
    Reported-by: Matthew Wilcox <willy@infradead.org>
    Signed-off-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index e59b2f53a81f..de10899da837 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -75,10 +75,6 @@ static int ceph_set_page_dirty(struct page *page)
 	struct inode *inode;
 	struct ceph_inode_info *ci;
 	struct ceph_snap_context *snapc;
-	int ret;
-
-	if (unlikely(!mapping))
-		return !TestSetPageDirty(page);
 
 	if (PageDirty(page)) {
 		dout("%p set_page_dirty %p idx %lu -- already dirty\n",
@@ -124,11 +120,7 @@ static int ceph_set_page_dirty(struct page *page)
 	page->private = (unsigned long)snapc;
 	SetPagePrivate(page);
 
-	ret = __set_page_dirty_nobuffers(page);
-	WARN_ON(!PageLocked(page));
-	WARN_ON(!page->mapping);
-
-	return ret;
+	return __set_page_dirty_nobuffers(page);
 }
 
 /*

commit f0ab6d809cfeffb75c181c29df2235d12b3de844
Author: Mike Marshall <hubcap@omnibond.com>
Date:   Tue May 18 08:09:13 2021 -0400

    orangefs: fix orangefs df output.
    
    [ Upstream commit 0fdec1b3c9fbb5e856a40db5993c9eaf91c74a83 ]
    
    Orangefs df output is whacky. Walt Ligon suggested this might fix it.
    It seems way more in line with reality now...
    
    Signed-off-by: Mike Marshall <hubcap@omnibond.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/orangefs/super.c b/fs/orangefs/super.c
index dfaee90d30bd..524fd95173b3 100644
--- a/fs/orangefs/super.c
+++ b/fs/orangefs/super.c
@@ -195,7 +195,7 @@ static int orangefs_statfs(struct dentry *dentry, struct kstatfs *buf)
 	buf->f_bavail = (sector_t) new_op->downcall.resp.statfs.blocks_avail;
 	buf->f_files = (sector_t) new_op->downcall.resp.statfs.files_total;
 	buf->f_ffree = (sector_t) new_op->downcall.resp.statfs.files_avail;
-	buf->f_frsize = sb->s_blocksize;
+	buf->f_frsize = 0;
 
 out_op_release:
 	op_release(new_op);

commit ef50bb9ea1f1370d2cc1c54184c773a9b0644bc8
Author: Zou Wei <zou_wei@huawei.com>
Date:   Wed May 12 12:07:02 2021 +0800

    PCI: tegra: Add missing MODULE_DEVICE_TABLE
    
    [ Upstream commit 7bf475a4614a9722b9b989e53184a02596cf16d1 ]
    
    Add missing MODULE_DEVICE_TABLE definition so we generate correct modalias
    for automatic loading of this driver when it is built as a module.
    
    Link: https://lore.kernel.org/r/1620792422-16535-1-git-send-email-zou_wei@huawei.com
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zou Wei <zou_wei@huawei.com>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Vidya Sagar <vidyas@nvidia.com>
    Acked-by: Thierry Reding <treding@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pci/controller/pci-tegra.c b/drivers/pci/controller/pci-tegra.c
index 097c02197ec8..1f8dd5ca02a9 100644
--- a/drivers/pci/controller/pci-tegra.c
+++ b/drivers/pci/controller/pci-tegra.c
@@ -2245,6 +2245,7 @@ static const struct of_device_id tegra_pcie_of_match[] = {
 	{ .compatible = "nvidia,tegra20-pcie", .data = &tegra20_pcie },
 	{ },
 };
+MODULE_DEVICE_TABLE(of, tegra_pcie_of_match);
 
 static void *tegra_pcie_ports_seq_start(struct seq_file *s, loff_t *pos)
 {

commit 9311a0c9d36caf95555fa2af2e8fc84ec1a81645
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Wed Jun 23 14:02:30 2021 +0200

    x86/fpu: Return proper error codes from user access functions
    
    [ Upstream commit aee8c67a4faa40a8df4e79316dbfc92d123989c1 ]
    
    When *RSTOR from user memory raises an exception, there is no way to
    differentiate them. That's bad because it forces the slow path even when
    the failure was not a fault. If the operation raised eg. #GP then going
    through the slow path is pointless.
    
    Use _ASM_EXTABLE_FAULT() which stores the trap number and let the exception
    fixup return the negated trap number as error.
    
    This allows to separate the fast path and let it handle faults directly and
    avoid the slow path for all other exceptions.
    
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Link: https://lkml.kernel.org/r/20210623121457.601480369@linutronix.de
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/x86/include/asm/fpu/internal.h b/arch/x86/include/asm/fpu/internal.h
index fa2c93cb42a2..b8c935033d21 100644
--- a/arch/x86/include/asm/fpu/internal.h
+++ b/arch/x86/include/asm/fpu/internal.h
@@ -103,6 +103,7 @@ static inline void fpstate_init_fxstate(struct fxregs_state *fx)
 }
 extern void fpstate_sanitize_xstate(struct fpu *fpu);
 
+/* Returns 0 or the negated trap number, which results in -EFAULT for #PF */
 #define user_insn(insn, output, input...)				\
 ({									\
 	int err;							\
@@ -110,14 +111,14 @@ extern void fpstate_sanitize_xstate(struct fpu *fpu);
 	might_fault();							\
 									\
 	asm volatile(ASM_STAC "\n"					\
-		     "1:" #insn "\n\t"					\
+		     "1: " #insn "\n"					\
 		     "2: " ASM_CLAC "\n"				\
 		     ".section .fixup,\"ax\"\n"				\
-		     "3:  movl $-1,%[err]\n"				\
+		     "3:  negl %%eax\n"					\
 		     "    jmp  2b\n"					\
 		     ".previous\n"					\
-		     _ASM_EXTABLE(1b, 3b)				\
-		     : [err] "=r" (err), output				\
+		     _ASM_EXTABLE_FAULT(1b, 3b)				\
+		     : [err] "=a" (err), output				\
 		     : "0"(0), input);					\
 	err;								\
 })
@@ -221,16 +222,20 @@ static inline void copy_fxregs_to_kernel(struct fpu *fpu)
 #define XRSTOR		".byte " REX_PREFIX "0x0f,0xae,0x2f"
 #define XRSTORS		".byte " REX_PREFIX "0x0f,0xc7,0x1f"
 
+/*
+ * After this @err contains 0 on success or the negated trap number when
+ * the operation raises an exception. For faults this results in -EFAULT.
+ */
 #define XSTATE_OP(op, st, lmask, hmask, err)				\
 	asm volatile("1:" op "\n\t"					\
 		     "xor %[err], %[err]\n"				\
 		     "2:\n\t"						\
 		     ".pushsection .fixup,\"ax\"\n\t"			\
-		     "3: movl $-2,%[err]\n\t"				\
+		     "3: negl %%eax\n\t"				\
 		     "jmp 2b\n\t"					\
 		     ".popsection\n\t"					\
-		     _ASM_EXTABLE(1b, 3b)				\
-		     : [err] "=r" (err)					\
+		     _ASM_EXTABLE_FAULT(1b, 3b)				\
+		     : [err] "=a" (err)					\
 		     : "D" (st), "m" (*st), "a" (lmask), "d" (hmask)	\
 		     : "memory")
 

commit 5bfbacfeadf864cb23dfe66c610ed036d5e48879
Author: Jan Kiszka <jan.kiszka@siemens.com>
Date:   Sun May 30 13:24:23 2021 +0200

    watchdog: iTCO_wdt: Account for rebooting on second timeout
    
    [ Upstream commit cb011044e34c293e139570ce5c01aed66a34345c ]
    
    This was already attempted to fix via 1fccb73011ea: If the BIOS did not
    enable TCO SMIs, the timer definitely needs to trigger twice in order to
    cause a reboot. If TCO SMIs are on, as well as SMIs in general, we can
    continue to assume that the BIOS will perform a reboot on the first
    timeout.
    
    QEMU with its ICH9 and related BIOS falls into the former category,
    currently taking twice the configured timeout in order to reboot the
    machine. For iTCO version that fall under turn_SMI_watchdog_clear_off,
    this is also true and was currently only addressed for v1, irrespective
    of the turn_SMI_watchdog_clear_off value.
    
    Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    Link: https://lore.kernel.org/r/0b8bb307-d08b-41b5-696c-305cdac6789c@siemens.com
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/watchdog/iTCO_wdt.c b/drivers/watchdog/iTCO_wdt.c
index 347f0389b089..059c9eddb546 100644
--- a/drivers/watchdog/iTCO_wdt.c
+++ b/drivers/watchdog/iTCO_wdt.c
@@ -75,6 +75,8 @@
 #define TCOBASE(p)	((p)->tco_res->start)
 /* SMI Control and Enable Register */
 #define SMI_EN(p)	((p)->smi_res->start)
+#define TCO_EN		(1 << 13)
+#define GBL_SMI_EN	(1 << 0)
 
 #define TCO_RLD(p)	(TCOBASE(p) + 0x00) /* TCO Timer Reload/Curr. Value */
 #define TCOv1_TMR(p)	(TCOBASE(p) + 0x01) /* TCOv1 Timer Initial Value*/
@@ -330,8 +332,12 @@ static int iTCO_wdt_set_timeout(struct watchdog_device *wd_dev, unsigned int t)
 
 	tmrval = seconds_to_ticks(p, t);
 
-	/* For TCO v1 the timer counts down twice before rebooting */
-	if (p->iTCO_version == 1)
+	/*
+	 * If TCO SMIs are off, the timer counts down twice before rebooting.
+	 * Otherwise, the BIOS generally reboots when the SMI triggers.
+	 */
+	if (p->smi_res &&
+	    (SMI_EN(p) & (TCO_EN | GBL_SMI_EN)) != (TCO_EN | GBL_SMI_EN))
 		tmrval /= 2;
 
 	/* from the specs: */
@@ -493,7 +499,7 @@ static int iTCO_wdt_probe(struct platform_device *pdev)
 		 * Disables TCO logic generating an SMI#
 		 */
 		val32 = inl(SMI_EN(p));
-		val32 &= 0xffffdfff;	/* Turn off SMI clearing watchdog */
+		val32 &= ~TCO_EN;	/* Turn off SMI clearing watchdog */
 		outl(val32, SMI_EN(p));
 	}
 

commit ecd620e0fb1ff7f78fdb593379b2e6938c99707a
Author: Zou Wei <zou_wei@huawei.com>
Date:   Wed May 12 14:57:56 2021 +0800

    watchdog: Fix possible use-after-free by calling del_timer_sync()
    
    [ Upstream commit d0212f095ab56672f6f36aabc605bda205e1e0bf ]
    
    This driver's remove path calls del_timer(). However, that function
    does not wait until the timer handler finishes. This means that the
    timer handler may still be running after the driver's remove function
    has finished, which would result in a use-after-free.
    
    Fix by calling del_timer_sync(), which makes sure the timer handler
    has finished, and unable to re-schedule itself.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zou Wei <zou_wei@huawei.com>
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    Acked-by: Vladimir Zapolskiy <vz@mleia.com>
    Link: https://lore.kernel.org/r/1620802676-19701-1-git-send-email-zou_wei@huawei.com
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/watchdog/lpc18xx_wdt.c b/drivers/watchdog/lpc18xx_wdt.c
index 331cadb459ac..48580b6406c2 100644
--- a/drivers/watchdog/lpc18xx_wdt.c
+++ b/drivers/watchdog/lpc18xx_wdt.c
@@ -301,7 +301,7 @@ static int lpc18xx_wdt_remove(struct platform_device *pdev)
 	struct lpc18xx_wdt_dev *lpc18xx_wdt = platform_get_drvdata(pdev);
 
 	dev_warn(&pdev->dev, "I quit now, hardware will probably reboot!\n");
-	del_timer(&lpc18xx_wdt->timer);
+	del_timer_sync(&lpc18xx_wdt->timer);
 
 	watchdog_unregister_device(&lpc18xx_wdt->wdt_dev);
 	clk_disable_unprepare(lpc18xx_wdt->wdt_clk);
diff --git a/drivers/watchdog/w83877f_wdt.c b/drivers/watchdog/w83877f_wdt.c
index 05658ecc0aa4..ec4641fc2d21 100644
--- a/drivers/watchdog/w83877f_wdt.c
+++ b/drivers/watchdog/w83877f_wdt.c
@@ -170,7 +170,7 @@ static void wdt_startup(void)
 static void wdt_turnoff(void)
 {
 	/* Stop the timer */
-	del_timer(&timer);
+	del_timer_sync(&timer);
 
 	wdt_change(WDT_DISABLE);
 

commit 522e75ed63f67e815d4ec0deace67df22d9ce78e
Author: Zou Wei <zou_wei@huawei.com>
Date:   Tue May 11 15:04:51 2021 +0800

    watchdog: sc520_wdt: Fix possible use-after-free in wdt_turnoff()
    
    [ Upstream commit 90b7c141132244e8e49a34a4c1e445cce33e07f4 ]
    
    This module's remove path calls del_timer(). However, that function
    does not wait until the timer handler finishes. This means that the
    timer handler may still be running after the driver's remove function
    has finished, which would result in a use-after-free.
    
    Fix by calling del_timer_sync(), which makes sure the timer handler
    has finished, and unable to re-schedule itself.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zou Wei <zou_wei@huawei.com>
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    Link: https://lore.kernel.org/r/1620716691-108460-1-git-send-email-zou_wei@huawei.com
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/watchdog/sc520_wdt.c b/drivers/watchdog/sc520_wdt.c
index 6aadb56e7faa..809ebcaef51d 100644
--- a/drivers/watchdog/sc520_wdt.c
+++ b/drivers/watchdog/sc520_wdt.c
@@ -190,7 +190,7 @@ static int wdt_startup(void)
 static int wdt_turnoff(void)
 {
 	/* Stop the timer */
-	del_timer(&timer);
+	del_timer_sync(&timer);
 
 	/* Stop the watchdog */
 	wdt_config(0);

commit dc9403097be52d57a5c9c35efa9be79d166a78af
Author: Zou Wei <zou_wei@huawei.com>
Date:   Tue May 11 15:01:35 2021 +0800

    watchdog: Fix possible use-after-free in wdt_startup()
    
    [ Upstream commit c08a6b31e4917034f0ed0cb457c3bb209576f542 ]
    
    This module's remove path calls del_timer(). However, that function
    does not wait until the timer handler finishes. This means that the
    timer handler may still be running after the driver's remove function
    has finished, which would result in a use-after-free.
    
    Fix by calling del_timer_sync(), which makes sure the timer handler
    has finished, and unable to re-schedule itself.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zou Wei <zou_wei@huawei.com>
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    Link: https://lore.kernel.org/r/1620716495-108352-1-git-send-email-zou_wei@huawei.com
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/watchdog/sbc60xxwdt.c b/drivers/watchdog/sbc60xxwdt.c
index 87333a41f753..1702df7f8c38 100644
--- a/drivers/watchdog/sbc60xxwdt.c
+++ b/drivers/watchdog/sbc60xxwdt.c
@@ -152,7 +152,7 @@ static void wdt_startup(void)
 static void wdt_turnoff(void)
 {
 	/* Stop the timer */
-	del_timer(&timer);
+	del_timer_sync(&timer);
 	inb_p(wdt_stop);
 	pr_info("Watchdog timer is now disabled...\n");
 }

commit fbc5a04b93788fcb0c05e72a24f170f9c23f3403
Author: Nick Desaulniers <ndesaulniers@google.com>
Date:   Tue Jun 1 20:29:26 2021 +0100

    ARM: 9087/1: kprobes: test-thumb: fix for LLVM_IAS=1
    
    [ Upstream commit 8b95a7d90ce8160ac5cffd5bace6e2eba01a871e ]
    
    There's a few instructions that GAS infers operands but Clang doesn't;
    from what I can tell the Arm ARM doesn't say these are optional.
    
    F5.1.257 TBB, TBH T1 Halfword variant
    F5.1.238 STREXD T1 variant
    F5.1.84 LDREXD T1 variant
    
    Link: https://github.com/ClangBuiltLinux/linux/issues/1309
    
    Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
    Reviewed-by: Jian Cai <jiancai@google.com>
    Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/probes/kprobes/test-thumb.c b/arch/arm/probes/kprobes/test-thumb.c
index b683b4517458..4254391f3906 100644
--- a/arch/arm/probes/kprobes/test-thumb.c
+++ b/arch/arm/probes/kprobes/test-thumb.c
@@ -444,21 +444,21 @@ void kprobe_thumb32_test_cases(void)
 		"3:	mvn	r0, r0	\n\t"
 		"2:	nop		\n\t")
 
-	TEST_RX("tbh	[pc, r",7, (9f-(1f+4))>>1,"]",
+	TEST_RX("tbh	[pc, r",7, (9f-(1f+4))>>1,", lsl #1]",
 		"9:			\n\t"
 		".short	(2f-1b-4)>>1	\n\t"
 		".short	(3f-1b-4)>>1	\n\t"
 		"3:	mvn	r0, r0	\n\t"
 		"2:	nop		\n\t")
 
-	TEST_RX("tbh	[pc, r",12, ((9f-(1f+4))>>1)+1,"]",
+	TEST_RX("tbh	[pc, r",12, ((9f-(1f+4))>>1)+1,", lsl #1]",
 		"9:			\n\t"
 		".short	(2f-1b-4)>>1	\n\t"
 		".short	(3f-1b-4)>>1	\n\t"
 		"3:	mvn	r0, r0	\n\t"
 		"2:	nop		\n\t")
 
-	TEST_RRX("tbh	[r",1,9f, ", r",14,1,"]",
+	TEST_RRX("tbh	[r",1,9f, ", r",14,1,", lsl #1]",
 		"9:			\n\t"
 		".short	(2f-1b-4)>>1	\n\t"
 		".short	(3f-1b-4)>>1	\n\t"
@@ -471,10 +471,10 @@ void kprobe_thumb32_test_cases(void)
 
 	TEST_UNSUPPORTED("strexb	r0, r1, [r2]")
 	TEST_UNSUPPORTED("strexh	r0, r1, [r2]")
-	TEST_UNSUPPORTED("strexd	r0, r1, [r2]")
+	TEST_UNSUPPORTED("strexd	r0, r1, r2, [r2]")
 	TEST_UNSUPPORTED("ldrexb	r0, [r1]")
 	TEST_UNSUPPORTED("ldrexh	r0, [r1]")
-	TEST_UNSUPPORTED("ldrexd	r0, [r1]")
+	TEST_UNSUPPORTED("ldrexd	r0, r1, [r1]")
 
 	TEST_GROUP("Data-processing (shifted register) and (modified immediate)")
 

commit 4c8ea9f317b095b559b73cb148a706c9f483b66f
Author: Bixuan Cui <cuibixuan@huawei.com>
Date:   Sat May 8 11:14:59 2021 +0800

    power: reset: gpio-poweroff: add missing MODULE_DEVICE_TABLE
    
    [ Upstream commit ed3443fb4df4e140a22f65144546c8a8e1e27f4e ]
    
    This patch adds missing MODULE_DEVICE_TABLE definition which generates
    correct modalias for automatic loading of this driver when it is built
    as an external module.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Bixuan Cui <cuibixuan@huawei.com>
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/power/reset/gpio-poweroff.c b/drivers/power/reset/gpio-poweroff.c
index 38206c39b3bf..5f2fa9c0f526 100644
--- a/drivers/power/reset/gpio-poweroff.c
+++ b/drivers/power/reset/gpio-poweroff.c
@@ -88,6 +88,7 @@ static const struct of_device_id of_gpio_poweroff_match[] = {
 	{ .compatible = "gpio-poweroff", },
 	{},
 };
+MODULE_DEVICE_TABLE(of, of_gpio_poweroff_match);
 
 static struct platform_driver gpio_poweroff_driver = {
 	.probe = gpio_poweroff_probe,

commit 92dae3d4ba35e86ce36c852a1f2df04b3a4eaff4
Author: Krzysztof Kozlowski <krzk@kernel.org>
Date:   Wed May 26 13:20:35 2021 -0400

    power: supply: max17042: Do not enforce (incorrect) interrupt trigger type
    
    [ Upstream commit 7fbf6b731bca347700e460d94b130f9d734b33e9 ]
    
    Interrupt line can be configured on different hardware in different way,
    even inverted.  Therefore driver should not enforce specific trigger
    type - edge falling - but instead rely on Devicetree to configure it.
    
    The Maxim 17047/77693 datasheets describe the interrupt line as active
    low with a requirement of acknowledge from the CPU therefore the edge
    falling is not correct.
    
    The interrupt line is shared between PMIC and RTC driver, so using level
    sensitive interrupt is here especially important to avoid races.  With
    an edge configuration in case if first PMIC signals interrupt followed
    shortly after by the RTC, the interrupt might not be yet cleared/acked
    thus the second one would not be noticed.
    
    Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply/max17042_battery.c
index 1a568df383db..00a3a581e079 100644
--- a/drivers/power/supply/max17042_battery.c
+++ b/drivers/power/supply/max17042_battery.c
@@ -1083,7 +1083,7 @@ static int max17042_probe(struct i2c_client *client,
 	}
 
 	if (client->irq) {
-		unsigned int flags = IRQF_TRIGGER_FALLING | IRQF_ONESHOT;
+		unsigned int flags = IRQF_ONESHOT;
 
 		/*
 		 * On ACPI systems the IRQ may be handled by ACPI-event code,

commit 3c9c6a45e067a5b0eab56ea4882465731f5f6d0e
Author: Linus Walleij <linus.walleij@linaro.org>
Date:   Sun May 23 00:50:41 2021 +0200

    power: supply: ab8500: Avoid NULL pointers
    
    [ Upstream commit 5bcb5087c9dd3dca1ff0ebd8002c5313c9332b56 ]
    
    Sometimes the code will crash because we haven't enabled
    AC or USB charging and thus not created the corresponding
    psy device. Fix it by checking that it is there before
    notifying.
    
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
index 98b335042ba6..76b6c60cde80 100644
--- a/drivers/power/supply/ab8500_charger.c
+++ b/drivers/power/supply/ab8500_charger.c
@@ -407,6 +407,14 @@ static void ab8500_enable_disable_sw_fallback(struct ab8500_charger *di,
 static void ab8500_power_supply_changed(struct ab8500_charger *di,
 					struct power_supply *psy)
 {
+	/*
+	 * This happens if we get notifications or interrupts and
+	 * the platform has been configured not to support one or
+	 * other type of charging.
+	 */
+	if (!psy)
+		return;
+
 	if (di->autopower_cfg) {
 		if (!di->usb.charger_connected &&
 		    !di->ac.charger_connected &&
@@ -433,7 +441,15 @@ static void ab8500_charger_set_usb_connected(struct ab8500_charger *di,
 		if (!connected)
 			di->flags.vbus_drop_end = false;
 
-		sysfs_notify(&di->usb_chg.psy->dev.kobj, NULL, "present");
+		/*
+		 * Sometimes the platform is configured not to support
+		 * USB charging and no psy has been created, but we still
+		 * will get these notifications.
+		 */
+		if (di->usb_chg.psy) {
+			sysfs_notify(&di->usb_chg.psy->dev.kobj, NULL,
+				     "present");
+		}
 
 		if (connected) {
 			mutex_lock(&di->charger_attached_mutex);

commit 54913394d67e7aea1e1834640cae284f2658f8b7
Author: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Date:   Wed Apr 28 11:05:24 2021 +0200

    pwm: spear: Don't modify HW state in .remove callback
    
    [ Upstream commit b601a18f12383001e7a8da238de7ca1559ebc450 ]
    
    A consumer is expected to disable a PWM before calling pwm_put(). And if
    they didn't there is hopefully a good reason (or the consumer needs
    fixing). Also if disabling an enabled PWM was the right thing to do,
    this should better be done in the framework instead of in each low level
    driver.
    
    So drop the hardware modification from the .remove() callback.
    
    Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
    Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pwm/pwm-spear.c b/drivers/pwm/pwm-spear.c
index 6c6b44fd3f43..2d11ac277de8 100644
--- a/drivers/pwm/pwm-spear.c
+++ b/drivers/pwm/pwm-spear.c
@@ -231,10 +231,6 @@ static int spear_pwm_probe(struct platform_device *pdev)
 static int spear_pwm_remove(struct platform_device *pdev)
 {
 	struct spear_pwm_chip *pc = platform_get_drvdata(pdev);
-	int i;
-
-	for (i = 0; i < NUM_PWM; i++)
-		pwm_disable(&pc->chip.pwms[i]);
 
 	/* clk was prepared in probe, hence unprepare it here */
 	clk_unprepare(pc->clk);

commit a12a6a2d7cd2dd24663942499f40efab96e8d369
Author: Dimitri John Ledkov <dimitri.ledkov@canonical.com>
Date:   Wed Jun 30 18:56:16 2021 -0700

    lib/decompress_unlz4.c: correctly handle zero-padding around initrds.
    
    [ Upstream commit 2c484419efc09e7234c667aa72698cb79ba8d8ed ]
    
    lz4 compatible decompressor is simple.  The format is underspecified and
    relies on EOF notification to determine when to stop.  Initramfs buffer
    format[1] explicitly states that it can have arbitrary number of zero
    padding.  Thus when operating without a fill function, be extra careful to
    ensure that sizes less than 4, or apperantly empty chunksizes are treated
    as EOF.
    
    To test this I have created two cpio initrds, first a normal one,
    main.cpio.  And second one with just a single /test-file with content
    "second" second.cpio.  Then i compressed both of them with gzip, and with
    lz4 -l.  Then I created a padding of 4 bytes (dd if=/dev/zero of=pad4 bs=1
    count=4).  To create four testcase initrds:
    
     1) main.cpio.gzip + extra.cpio.gzip = pad0.gzip
     2) main.cpio.lz4  + extra.cpio.lz4 = pad0.lz4
     3) main.cpio.gzip + pad4 + extra.cpio.gzip = pad4.gzip
     4) main.cpio.lz4  + pad4 + extra.cpio.lz4 = pad4.lz4
    
    The pad4 test-cases replicate the initrd load by grub, as it pads and
    aligns every initrd it loads.
    
    All of the above boot, however /test-file was not accessible in the initrd
    for the testcase #4, as decoding in lz4 decompressor failed.  Also an
    error message printed which usually is harmless.
    
    Whith a patched kernel, all of the above testcases now pass, and
    /test-file is accessible.
    
    This fixes lz4 initrd decompress warning on every boot with grub.  And
    more importantly this fixes inability to load multiple lz4 compressed
    initrds with grub.  This patch has been shipping in Ubuntu kernels since
    January 2021.
    
    [1] ./Documentation/driver-api/early-userspace/buffer-format.rst
    
    BugLink: https://bugs.launchpad.net/bugs/1835660
    Link: https://lore.kernel.org/lkml/20210114200256.196589-1-xnox@ubuntu.com/ # v0
    Link: https://lkml.kernel.org/r/20210513104831.432975-1-dimitri.ledkov@canonical.com
    Signed-off-by: Dimitri John Ledkov <dimitri.ledkov@canonical.com>
    Cc: Kyungsik Lee <kyungsik.lee@lge.com>
    Cc: Yinghai Lu <yinghai@kernel.org>
    Cc: Bongkyu Kim <bongkyu.kim@lge.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Sven Schmidt <4sschmid@informatik.uni-hamburg.de>
    Cc: Rajat Asthana <thisisrast7@gmail.com>
    Cc: Nick Terrell <terrelln@fb.com>
    Cc: Gao Xiang <hsiangkao@redhat.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/lib/decompress_unlz4.c b/lib/decompress_unlz4.c
index 1b0baf3008ea..b202aa864c48 100644
--- a/lib/decompress_unlz4.c
+++ b/lib/decompress_unlz4.c
@@ -115,6 +115,9 @@ STATIC inline int INIT unlz4(u8 *input, long in_len,
 				error("data corrupted");
 				goto exit_2;
 			}
+		} else if (size < 4) {
+			/* empty or end-of-file */
+			goto exit_3;
 		}
 
 		chunksize = get_unaligned_le32(inp);
@@ -128,6 +131,10 @@ STATIC inline int INIT unlz4(u8 *input, long in_len,
 			continue;
 		}
 
+		if (!fill && chunksize == 0) {
+			/* empty or end-of-file */
+			goto exit_3;
+		}
 
 		if (posp)
 			*posp += 4;
@@ -187,6 +194,7 @@ STATIC inline int INIT unlz4(u8 *input, long in_len,
 		}
 	}
 
+exit_3:
 	ret = 0;
 exit_2:
 	if (!input)

commit 7c0bb53d48244b10782deea07d57e0a4c0fb4262
Author: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Date:   Fri Jun 4 16:27:44 2021 -0700

    i2c: core: Disable client irq on reboot/shutdown
    
    [ Upstream commit b64210f2f7c11c757432ba3701d88241b2b98fb1 ]
    
    If an i2c client receives an interrupt during reboot or shutdown it may
    be too late to service it by making an i2c transaction on the bus
    because the i2c controller has already been shutdown. This can lead to
    system hangs if the i2c controller tries to make a transfer that is
    doomed to fail because the access to the i2c pins is already shut down,
    or an iommu translation has been torn down so i2c controller register
    access doesn't work.
    
    Let's simply disable the irq if there isn't a shutdown callback for an
    i2c client when there is an irq associated with the device. This will
    make sure that irqs don't come in later than the time that we can handle
    it. We don't do this if the i2c client device already has a shutdown
    callback because presumably they're doing the right thing and quieting
    the device so irqs don't come in after the shutdown callback returns.
    
    Reported-by: kernel test robot <lkp@intel.com>
    [swboyd@chromium.org: Dropped newline, added commit text, added
    interrupt.h for robot build error]
    Signed-off-by: Stephen Boyd <swboyd@chromium.org>
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
index 39be53b6f983..2a43f4e46af0 100644
--- a/drivers/i2c/i2c-core-base.c
+++ b/drivers/i2c/i2c-core-base.c
@@ -32,6 +32,7 @@
 #include <linux/i2c-smbus.h>
 #include <linux/idr.h>
 #include <linux/init.h>
+#include <linux/interrupt.h>
 #include <linux/irqflags.h>
 #include <linux/jump_label.h>
 #include <linux/kernel.h>
@@ -457,6 +458,8 @@ static void i2c_device_shutdown(struct device *dev)
 	driver = to_i2c_driver(dev->driver);
 	if (driver->shutdown)
 		driver->shutdown(client);
+	else if (client->irq > 0)
+		disable_irq(client->irq);
 }
 
 static void i2c_client_dev_release(struct device *dev)

commit c79fef7357e5930648d7d5991bdfedaca3eb89ad
Author: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Date:   Mon Jun 21 18:12:46 2021 +0300

    intel_th: Wait until port is in reset before programming it
    
    [ Upstream commit ab1afed701d2db7eb35c1a2526a29067a38e93d1 ]
    
    Some devices don't drain their pipelines if we don't make sure that
    the corresponding output port is in reset before programming it for
    a new trace capture, resulting in bits of old trace appearing in the
    new trace capture. Fix that by explicitly making sure the reset is
    asserted before programming new trace capture.
    
    Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Link: https://lore.kernel.org/r/20210621151246.31891-5-alexander.shishkin@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hwtracing/intel_th/core.c b/drivers/hwtracing/intel_th/core.c
index 6c723b57dfc0..be2f02e35067 100644
--- a/drivers/hwtracing/intel_th/core.c
+++ b/drivers/hwtracing/intel_th/core.c
@@ -215,6 +215,22 @@ static ssize_t port_show(struct device *dev, struct device_attribute *attr,
 
 static DEVICE_ATTR_RO(port);
 
+static void intel_th_trace_prepare(struct intel_th_device *thdev)
+{
+	struct intel_th_device *hub = to_intel_th_hub(thdev);
+	struct intel_th_driver *hubdrv = to_intel_th_driver(hub->dev.driver);
+
+	if (hub->type != INTEL_TH_SWITCH)
+		return;
+
+	if (thdev->type != INTEL_TH_OUTPUT)
+		return;
+
+	pm_runtime_get_sync(&thdev->dev);
+	hubdrv->prepare(hub, &thdev->output);
+	pm_runtime_put(&thdev->dev);
+}
+
 static int intel_th_output_activate(struct intel_th_device *thdev)
 {
 	struct intel_th_driver *thdrv =
@@ -235,6 +251,7 @@ static int intel_th_output_activate(struct intel_th_device *thdev)
 	if (ret)
 		goto fail_put;
 
+	intel_th_trace_prepare(thdev);
 	if (thdrv->activate)
 		ret = thdrv->activate(thdev);
 	else
diff --git a/drivers/hwtracing/intel_th/gth.c b/drivers/hwtracing/intel_th/gth.c
index 5041fe7fee9e..ef2751556fd7 100644
--- a/drivers/hwtracing/intel_th/gth.c
+++ b/drivers/hwtracing/intel_th/gth.c
@@ -513,6 +513,21 @@ static void gth_tscu_resync(struct gth_device *gth)
 	iowrite32(reg, gth->base + REG_TSCU_TSUCTRL);
 }
 
+static void intel_th_gth_prepare(struct intel_th_device *thdev,
+				 struct intel_th_output *output)
+{
+	struct gth_device *gth = dev_get_drvdata(&thdev->dev);
+	int count;
+
+	/*
+	 * Wait until the output port is in reset before we start
+	 * programming it.
+	 */
+	for (count = GTH_PLE_WAITLOOP_DEPTH;
+	     count && !(gth_output_get(gth, output->port) & BIT(5)); count--)
+		cpu_relax();
+}
+
 /**
  * intel_th_gth_enable() - enable tracing to an output device
  * @thdev:	GTH device
@@ -734,6 +749,7 @@ static struct intel_th_driver intel_th_gth_driver = {
 	.assign		= intel_th_gth_assign,
 	.unassign	= intel_th_gth_unassign,
 	.set_output	= intel_th_gth_set_output,
+	.prepare	= intel_th_gth_prepare,
 	.enable		= intel_th_gth_enable,
 	.disable	= intel_th_gth_disable,
 	.driver	= {
diff --git a/drivers/hwtracing/intel_th/intel_th.h b/drivers/hwtracing/intel_th/intel_th.h
index 780206dc9012..6b5473f3c16f 100644
--- a/drivers/hwtracing/intel_th/intel_th.h
+++ b/drivers/hwtracing/intel_th/intel_th.h
@@ -134,6 +134,7 @@ intel_th_output_assigned(struct intel_th_device *thdev)
  * @remove:	remove method
  * @assign:	match a given output type device against available outputs
  * @unassign:	deassociate an output type device from an output port
+ * @prepare:	prepare output port for tracing
  * @enable:	enable tracing for a given output device
  * @disable:	disable tracing for a given output device
  * @irq:	interrupt callback
@@ -155,6 +156,8 @@ struct intel_th_driver {
 					  struct intel_th_device *othdev);
 	void			(*unassign)(struct intel_th_device *thdev,
 					    struct intel_th_device *othdev);
+	void			(*prepare)(struct intel_th_device *thdev,
+					   struct intel_th_output *output);
 	void			(*enable)(struct intel_th_device *thdev,
 					  struct intel_th_output *output);
 	void			(*disable)(struct intel_th_device *thdev,

commit 838f545936c0214b19bc16ba39057c4e6959d89d
Author: Fabio Aiuto <fabioaiuto83@gmail.com>
Date:   Tue Jun 22 15:09:58 2021 +0200

    staging: rtl8723bs: fix macro value for 2.4Ghz only device
    
    [ Upstream commit 6d490a27e23c5fb79b766530016ab8665169498e ]
    
    fix IQK_Matrix_Settings_NUM macro value to 14 which is
    the max channel number value allowed in a 2.4Ghz device.
    
    Acked-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Fabio Aiuto <fabioaiuto83@gmail.com>
    Link: https://lore.kernel.org/r/0b4a876929949248aa18cb919da3583c65e4ee4e.1624367072.git.fabioaiuto83@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/staging/rtl8723bs/hal/odm.h b/drivers/staging/rtl8723bs/hal/odm.h
index 23ab160ac2c8..ff8e22d70d4c 100644
--- a/drivers/staging/rtl8723bs/hal/odm.h
+++ b/drivers/staging/rtl8723bs/hal/odm.h
@@ -197,10 +197,7 @@ typedef struct _ODM_RATE_ADAPTIVE {
 
 #define AVG_THERMAL_NUM		8
 #define IQK_Matrix_REG_NUM	8
-#define IQK_Matrix_Settings_NUM	(14 + 24 + 21) /*   Channels_2_4G_NUM
-						* + Channels_5G_20M_NUM
-						* + Channels_5G
-						*/
+#define IQK_Matrix_Settings_NUM	14 /* Channels_2_4G_NUM */
 
 #define		DM_Type_ByFW			0
 #define		DM_Type_ByDriver		1

commit a7970a03e3995e45f01a7dcc090a80f3a7968274
Author: Jiajun Cao <jjcao20@fudan.edu.cn>
Date:   Tue Jun 22 21:19:42 2021 +0800

    ALSA: hda: Add IRQ check for platform_get_irq()
    
    [ Upstream commit 8c13212443230d03ff25014514ec0d53498c0912 ]
    
    The function hda_tegra_first_init() neglects to check the return
    value after executing platform_get_irq().
    
    hda_tegra_first_init() should check the return value (if negative
    error number) for errors so as to not pass a negative value to
    the devm_request_irq().
    
    Fix it by adding a check for the return value irq_id.
    
    Signed-off-by: Jiajun Cao <jjcao20@fudan.edu.cn>
    Signed-off-by: Xin Tan <tanxin.ctf@gmail.com>
    Reviewed-by: Thierry Reding <treding@nvidia.com>
    Link: https://lore.kernel.org/r/20210622131947.94346-1-jjcao20@fudan.edu.cn
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/pci/hda/hda_tegra.c b/sound/pci/hda/hda_tegra.c
index e85fb04ec7be..b567c4bdae00 100644
--- a/sound/pci/hda/hda_tegra.c
+++ b/sound/pci/hda/hda_tegra.c
@@ -363,6 +363,9 @@ static int hda_tegra_first_init(struct azx *chip, struct platform_device *pdev)
 	unsigned short gcap;
 	int irq_id = platform_get_irq(pdev, 0);
 
+	if (irq_id < 0)
+		return irq_id;
+
 	err = hda_tegra_init_chip(chip, pdev);
 	if (err)
 		return err;

commit 22ecd1ef4f644881ee75023696d0e442adbe26eb
Author: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Date:   Mon Jun 21 14:21:47 2021 +0200

    backlight: lm3630a: Fix return code of .update_status() callback
    
    [ Upstream commit b9481a667a90ec739995e85f91f3672ca44d6ffa ]
    
    According to <linux/backlight.h> .update_status() is supposed to
    return 0 on success and a negative error code otherwise. Adapt
    lm3630a_bank_a_update_status() and lm3630a_bank_b_update_status() to
    actually do it.
    
    While touching that also add the error code to the failure message.
    
    Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
    Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org>
    Signed-off-by: Lee Jones <lee.jones@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/video/backlight/lm3630a_bl.c b/drivers/video/backlight/lm3630a_bl.c
index ef2553f452ca..f17e5a8860fa 100644
--- a/drivers/video/backlight/lm3630a_bl.c
+++ b/drivers/video/backlight/lm3630a_bl.c
@@ -184,7 +184,7 @@ static int lm3630a_bank_a_update_status(struct backlight_device *bl)
 	if ((pwm_ctrl & LM3630A_PWM_BANK_A) != 0) {
 		lm3630a_pwm_ctrl(pchip, bl->props.brightness,
 				 bl->props.max_brightness);
-		return bl->props.brightness;
+		return 0;
 	}
 
 	/* disable sleep */
@@ -204,8 +204,8 @@ static int lm3630a_bank_a_update_status(struct backlight_device *bl)
 	return 0;
 
 out_i2c_err:
-	dev_err(pchip->dev, "i2c failed to access\n");
-	return bl->props.brightness;
+	dev_err(pchip->dev, "i2c failed to access (%pe)\n", ERR_PTR(ret));
+	return ret;
 }
 
 static int lm3630a_bank_a_get_brightness(struct backlight_device *bl)
@@ -261,7 +261,7 @@ static int lm3630a_bank_b_update_status(struct backlight_device *bl)
 	if ((pwm_ctrl & LM3630A_PWM_BANK_B) != 0) {
 		lm3630a_pwm_ctrl(pchip, bl->props.brightness,
 				 bl->props.max_brightness);
-		return bl->props.brightness;
+		return 0;
 	}
 
 	/* disable sleep */
@@ -281,8 +281,8 @@ static int lm3630a_bank_b_update_status(struct backlight_device *bl)
 	return 0;
 
 out_i2c_err:
-	dev_err(pchip->dev, "i2c failed to access REG_CTRL\n");
-	return bl->props.brightness;
+	dev_err(pchip->dev, "i2c failed to access (%pe)\n", ERR_PTR(ret));
+	return ret;
 }
 
 static int lm3630a_bank_b_get_brightness(struct backlight_device *bl)

commit b15f3cad6f3637b482701066db3ba31c7af2633e
Author: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Date:   Fri Jun 18 13:49:00 2021 +1000

    powerpc/boot: Fixup device-tree on little endian
    
    [ Upstream commit c93f80849bdd9b45d834053ae1336e28f0026c84 ]
    
    This fixes the core devtree.c functions and the ns16550 UART backend.
    
    Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
    Reviewed-by: Segher Boessenkool <segher@kernel.crashing.org>
    Acked-by: Nicholas Piggin <npiggin@gmail.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/YMwXrPT8nc4YUdJ9@thinks.paulus.ozlabs.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/powerpc/boot/devtree.c b/arch/powerpc/boot/devtree.c
index a7e21a35c03a..27c84b82b588 100644
--- a/arch/powerpc/boot/devtree.c
+++ b/arch/powerpc/boot/devtree.c
@@ -17,6 +17,7 @@
 #include "string.h"
 #include "stdio.h"
 #include "ops.h"
+#include "of.h"
 
 void dt_fixup_memory(u64 start, u64 size)
 {
@@ -27,21 +28,25 @@ void dt_fixup_memory(u64 start, u64 size)
 	root = finddevice("/");
 	if (getprop(root, "#address-cells", &naddr, sizeof(naddr)) < 0)
 		naddr = 2;
+	else
+		naddr = be32_to_cpu(naddr);
 	if (naddr < 1 || naddr > 2)
 		fatal("Can't cope with #address-cells == %d in /\n\r", naddr);
 
 	if (getprop(root, "#size-cells", &nsize, sizeof(nsize)) < 0)
 		nsize = 1;
+	else
+		nsize = be32_to_cpu(nsize);
 	if (nsize < 1 || nsize > 2)
 		fatal("Can't cope with #size-cells == %d in /\n\r", nsize);
 
 	i = 0;
 	if (naddr == 2)
-		memreg[i++] = start >> 32;
-	memreg[i++] = start & 0xffffffff;
+		memreg[i++] = cpu_to_be32(start >> 32);
+	memreg[i++] = cpu_to_be32(start & 0xffffffff);
 	if (nsize == 2)
-		memreg[i++] = size >> 32;
-	memreg[i++] = size & 0xffffffff;
+		memreg[i++] = cpu_to_be32(size >> 32);
+	memreg[i++] = cpu_to_be32(size & 0xffffffff);
 
 	memory = finddevice("/memory");
 	if (! memory) {
@@ -49,9 +54,9 @@ void dt_fixup_memory(u64 start, u64 size)
 		setprop_str(memory, "device_type", "memory");
 	}
 
-	printf("Memory <- <0x%x", memreg[0]);
+	printf("Memory <- <0x%x", be32_to_cpu(memreg[0]));
 	for (i = 1; i < (naddr + nsize); i++)
-		printf(" 0x%x", memreg[i]);
+		printf(" 0x%x", be32_to_cpu(memreg[i]));
 	printf("> (%ldMB)\n\r", (unsigned long)(size >> 20));
 
 	setprop(memory, "reg", memreg, (naddr + nsize)*sizeof(u32));
@@ -69,10 +74,10 @@ void dt_fixup_cpu_clocks(u32 cpu, u32 tb, u32 bus)
 		printf("CPU bus-frequency <- 0x%x (%dMHz)\n\r", bus, MHZ(bus));
 
 	while ((devp = find_node_by_devtype(devp, "cpu"))) {
-		setprop_val(devp, "clock-frequency", cpu);
-		setprop_val(devp, "timebase-frequency", tb);
+		setprop_val(devp, "clock-frequency", cpu_to_be32(cpu));
+		setprop_val(devp, "timebase-frequency", cpu_to_be32(tb));
 		if (bus > 0)
-			setprop_val(devp, "bus-frequency", bus);
+			setprop_val(devp, "bus-frequency", cpu_to_be32(bus));
 	}
 
 	timebase_period_ns = 1000000000 / tb;
@@ -84,7 +89,7 @@ void dt_fixup_clock(const char *path, u32 freq)
 
 	if (devp) {
 		printf("%s: clock-frequency <- %x (%dMHz)\n\r", path, freq, MHZ(freq));
-		setprop_val(devp, "clock-frequency", freq);
+		setprop_val(devp, "clock-frequency", cpu_to_be32(freq));
 	}
 }
 
@@ -137,8 +142,12 @@ void dt_get_reg_format(void *node, u32 *naddr, u32 *nsize)
 {
 	if (getprop(node, "#address-cells", naddr, 4) != 4)
 		*naddr = 2;
+	else
+		*naddr = be32_to_cpu(*naddr);
 	if (getprop(node, "#size-cells", nsize, 4) != 4)
 		*nsize = 1;
+	else
+		*nsize = be32_to_cpu(*nsize);
 }
 
 static void copy_val(u32 *dest, u32 *src, int naddr)
@@ -167,9 +176,9 @@ static int add_reg(u32 *reg, u32 *add, int naddr)
 	int i, carry = 0;
 
 	for (i = MAX_ADDR_CELLS - 1; i >= MAX_ADDR_CELLS - naddr; i--) {
-		u64 tmp = (u64)reg[i] + add[i] + carry;
+		u64 tmp = (u64)be32_to_cpu(reg[i]) + be32_to_cpu(add[i]) + carry;
 		carry = tmp >> 32;
-		reg[i] = (u32)tmp;
+		reg[i] = cpu_to_be32((u32)tmp);
 	}
 
 	return !carry;
@@ -184,18 +193,18 @@ static int compare_reg(u32 *reg, u32 *range, u32 *rangesize)
 	u32 end;
 
 	for (i = 0; i < MAX_ADDR_CELLS; i++) {
-		if (reg[i] < range[i])
+		if (be32_to_cpu(reg[i]) < be32_to_cpu(range[i]))
 			return 0;
-		if (reg[i] > range[i])
+		if (be32_to_cpu(reg[i]) > be32_to_cpu(range[i]))
 			break;
 	}
 
 	for (i = 0; i < MAX_ADDR_CELLS; i++) {
-		end = range[i] + rangesize[i];
+		end = be32_to_cpu(range[i]) + be32_to_cpu(rangesize[i]);
 
-		if (reg[i] < end)
+		if (be32_to_cpu(reg[i]) < end)
 			break;
-		if (reg[i] > end)
+		if (be32_to_cpu(reg[i]) > end)
 			return 0;
 	}
 
@@ -244,7 +253,6 @@ static int dt_xlate(void *node, int res, int reglen, unsigned long *addr,
 		return 0;
 
 	dt_get_reg_format(parent, &naddr, &nsize);
-
 	if (nsize > 2)
 		return 0;
 
@@ -256,10 +264,10 @@ static int dt_xlate(void *node, int res, int reglen, unsigned long *addr,
 
 	copy_val(last_addr, prop_buf + offset, naddr);
 
-	ret_size = prop_buf[offset + naddr];
+	ret_size = be32_to_cpu(prop_buf[offset + naddr]);
 	if (nsize == 2) {
 		ret_size <<= 32;
-		ret_size |= prop_buf[offset + naddr + 1];
+		ret_size |= be32_to_cpu(prop_buf[offset + naddr + 1]);
 	}
 
 	for (;;) {
@@ -282,7 +290,6 @@ static int dt_xlate(void *node, int res, int reglen, unsigned long *addr,
 
 		offset = find_range(last_addr, prop_buf, prev_naddr,
 		                    naddr, prev_nsize, buflen / 4);
-
 		if (offset < 0)
 			return 0;
 
@@ -300,8 +307,7 @@ static int dt_xlate(void *node, int res, int reglen, unsigned long *addr,
 	if (naddr > 2)
 		return 0;
 
-	ret_addr = ((u64)last_addr[2] << 32) | last_addr[3];
-
+	ret_addr = ((u64)be32_to_cpu(last_addr[2]) << 32) | be32_to_cpu(last_addr[3]);
 	if (sizeof(void *) == 4 &&
 	    (ret_addr >= 0x100000000ULL || ret_size > 0x100000000ULL ||
 	     ret_addr + ret_size > 0x100000000ULL))
@@ -354,11 +360,14 @@ int dt_is_compatible(void *node, const char *compat)
 int dt_get_virtual_reg(void *node, void **addr, int nres)
 {
 	unsigned long xaddr;
-	int n;
+	int n, i;
 
 	n = getprop(node, "virtual-reg", addr, nres * 4);
-	if (n > 0)
+	if (n > 0) {
+		for (i = 0; i < n/4; i ++)
+			((u32 *)addr)[i] = be32_to_cpu(((u32 *)addr)[i]);
 		return n / 4;
+	}
 
 	for (n = 0; n < nres; n++) {
 		if (!dt_xlate_reg(node, n, &xaddr, NULL))
diff --git a/arch/powerpc/boot/ns16550.c b/arch/powerpc/boot/ns16550.c
index b0da4466d419..f16d2be1d0f3 100644
--- a/arch/powerpc/boot/ns16550.c
+++ b/arch/powerpc/boot/ns16550.c
@@ -15,6 +15,7 @@
 #include "stdio.h"
 #include "io.h"
 #include "ops.h"
+#include "of.h"
 
 #define UART_DLL	0	/* Out: Divisor Latch Low */
 #define UART_DLM	1	/* Out: Divisor Latch High */
@@ -58,16 +59,20 @@ int ns16550_console_init(void *devp, struct serial_console_data *scdp)
 	int n;
 	u32 reg_offset;
 
-	if (dt_get_virtual_reg(devp, (void **)&reg_base, 1) < 1)
+	if (dt_get_virtual_reg(devp, (void **)&reg_base, 1) < 1) {
+		printf("virt reg parse fail...\r\n");
 		return -1;
+	}
 
 	n = getprop(devp, "reg-offset", &reg_offset, sizeof(reg_offset));
 	if (n == sizeof(reg_offset))
-		reg_base += reg_offset;
+		reg_base += be32_to_cpu(reg_offset);
 
 	n = getprop(devp, "reg-shift", &reg_shift, sizeof(reg_shift));
 	if (n != sizeof(reg_shift))
 		reg_shift = 0;
+	else
+		reg_shift = be32_to_cpu(reg_shift);
 
 	scdp->open = ns16550_open;
 	scdp->putc = ns16550_putc;

commit acf41bb73852e5bcf0bae4033ad72ab671885955
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Fri Jun 18 12:38:35 2021 +0800

    usb: gadget: hid: fix error return code in hid_bind()
    
    [ Upstream commit 88693f770bb09c196b1eb5f06a484a254ecb9924 ]
    
    Fix to return a negative error code from the error handling
    case instead of 0.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Link: https://lore.kernel.org/r/20210618043835.2641360-1-yangyingliang@huawei.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/legacy/hid.c b/drivers/usb/gadget/legacy/hid.c
index c4eda7fe7ab4..5b27d289443f 100644
--- a/drivers/usb/gadget/legacy/hid.c
+++ b/drivers/usb/gadget/legacy/hid.c
@@ -171,8 +171,10 @@ static int hid_bind(struct usb_composite_dev *cdev)
 		struct usb_descriptor_header *usb_desc;
 
 		usb_desc = usb_otg_descriptor_alloc(gadget);
-		if (!usb_desc)
+		if (!usb_desc) {
+			status = -ENOMEM;
 			goto put;
+		}
 		usb_otg_descriptor_init(gadget, usb_desc);
 		otg_desc[0] = usb_desc;
 		otg_desc[1] = NULL;

commit 141fff551c2c0d8f98270d2e3e1c8730e00c24a1
Author: Ruslan Bilovol <ruslan.bilovol@gmail.com>
Date:   Thu Jun 17 19:27:55 2021 +0300

    usb: gadget: f_hid: fix endianness issue with descriptors
    
    [ Upstream commit 33cb46c4676d01956811b68a29157ea969a5df70 ]
    
    Running sparse checker it shows warning message about
    incorrect endianness used for descriptor initialization:
    
    | f_hid.c:91:43: warning: incorrect type in initializer (different base types)
    | f_hid.c:91:43:    expected restricted __le16 [usertype] bcdHID
    | f_hid.c:91:43:    got int
    
    Fixing issue with cpu_to_le16() macro, however this is not a real issue
    as the value is the same both endians.
    
    Cc: Fabien Chouteau <fabien.chouteau@barco.com>
    Cc: Segiy Stetsyuk <serg_stetsuk@ukr.net>
    Signed-off-by: Ruslan Bilovol <ruslan.bilovol@gmail.com>
    Link: https://lore.kernel.org/r/20210617162755.29676-1-ruslan.bilovol@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/function/f_hid.c b/drivers/usb/gadget/function/f_hid.c
index bc0a693c3260..fa8a8e04008a 100644
--- a/drivers/usb/gadget/function/f_hid.c
+++ b/drivers/usb/gadget/function/f_hid.c
@@ -88,7 +88,7 @@ static struct usb_interface_descriptor hidg_interface_desc = {
 static struct hid_descriptor hidg_desc = {
 	.bLength			= sizeof hidg_desc,
 	.bDescriptorType		= HID_DT_HID,
-	.bcdHID				= 0x0101,
+	.bcdHID				= cpu_to_le16(0x0101),
 	.bCountryCode			= 0x00,
 	.bNumDescriptors		= 0x1,
 	/*.desc[0].bDescriptorType	= DYNAMIC */

commit 903e2d4526c511dc1d324615058b00ce07961cad
Author: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Date:   Sat Jun 19 17:39:22 2021 +0900

    ALSA: bebob: add support for ToneWeal FW66
    
    [ Upstream commit 50ebe56222bfa0911a932930f9229ee5995508d9 ]
    
    A user of FFADO project reported the issue of ToneWeal FW66. As a result,
    the device is identified as one of applications of BeBoB solution.
    
    I note that in the report the device returns contradictory result in plug
    discovery process for audio subunit. Fortunately ALSA BeBoB driver doesn't
    perform it thus it's likely to handle the device without issues.
    
    I receive no reaction to test request for this patch yet, however it would
    be worth to add support for it.
    
    daniel@gibbonmoon:/sys/bus/firewire/devices/fw1$ grep -r . *
    Binary file config_rom matches
    dev:244:1
    guid:0x0023270002000000
    hardware_version:0x000002
    is_local:0
    model:0x020002
    model_name:FW66
    power/runtime_active_time:0
    power/runtime_active_kids:0
    power/runtime_usage:0
    power/runtime_status:unsupported
    power/async:disabled
    power/runtime_suspended_time:0
    power/runtime_enabled:disabled
    power/control:auto
    subsystem/drivers_autoprobe:1
    uevent:MAJOR=244
    uevent:MINOR=1
    uevent:DEVNAME=fw1
    units:0x00a02d:0x010001
    vendor:0x002327
    vendor_name:ToneWeal
    fw1.0/uevent:MODALIAS=ieee1394:ven00002327mo00020002sp0000A02Dver00010001
    fw1.0/power/runtime_active_time:0
    fw1.0/power/runtime_active_kids:0
    fw1.0/power/runtime_usage:0
    fw1.0/power/runtime_status:unsupported
    fw1.0/power/async:disabled
    fw1.0/power/runtime_suspended_time:0
    fw1.0/power/runtime_enabled:disabled
    fw1.0/power/control:auto
    fw1.0/model:0x020002
    fw1.0/rom_index:15
    fw1.0/specifier_id:0x00a02d
    fw1.0/model_name:FW66
    fw1.0/version:0x010001
    fw1.0/modalias:ieee1394:ven00002327mo00020002sp0000A02Dver00010001
    
    Cc: Daniel Jozsef <daniel.jozsef@gmail.com>
    Reference: https://lore.kernel.org/alsa-devel/20200119164335.GA11974@workstation/
    Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
    Link: https://lore.kernel.org/r/20210619083922.16060-1-o-takashi@sakamocchi.jp
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/firewire/Kconfig b/sound/firewire/Kconfig
index 4e0e320b77d8..f7b26b1d7084 100644
--- a/sound/firewire/Kconfig
+++ b/sound/firewire/Kconfig
@@ -109,6 +109,7 @@ config SND_BEBOB
 	  * M-Audio Ozonic/NRV10/ProfireLightBridge
 	  * M-Audio FireWire 1814/ProjectMix IO
 	  * Digidesign Mbox 2 Pro
+	  * ToneWeal FW66
 
           To compile this driver as a module, choose M here: the module
           will be called snd-bebob.
diff --git a/sound/firewire/bebob/bebob.c b/sound/firewire/bebob/bebob.c
index 8073360581f4..eac3ff24e55d 100644
--- a/sound/firewire/bebob/bebob.c
+++ b/sound/firewire/bebob/bebob.c
@@ -60,6 +60,7 @@ static DECLARE_BITMAP(devices_used, SNDRV_CARDS);
 #define VEN_MAUDIO1	0x00000d6c
 #define VEN_MAUDIO2	0x000007f5
 #define VEN_DIGIDESIGN	0x00a07e
+#define OUI_SHOUYO	0x002327
 
 #define MODEL_FOCUSRITE_SAFFIRE_BOTH	0x00000000
 #define MODEL_MAUDIO_AUDIOPHILE_BOTH	0x00010060
@@ -513,6 +514,8 @@ static const struct ieee1394_device_id bebob_id_table[] = {
 			    &maudio_special_spec),
 	/* Digidesign Mbox 2 Pro */
 	SND_BEBOB_DEV_ENTRY(VEN_DIGIDESIGN, 0x0000a9, &spec_normal),
+	// Toneweal FW66.
+	SND_BEBOB_DEV_ENTRY(OUI_SHOUYO, 0x020002, &spec_normal),
 	/* IDs are unknown but able to be supported */
 	/*  Apogee, Mini-ME Firewire */
 	/*  Apogee, Mini-DAC Firewire */

commit c71a120d34dcda696664c1ee74868f217d4fc4b6
Author: Yizhuo Zhai <yzhai003@ucr.edu>
Date:   Sat Jun 19 22:26:50 2021 -0700

    Input: hideep - fix the uninitialized use in hideep_nvm_unlock()
    
    [ Upstream commit cac7100d4c51c04979dacdfe6c9a5e400d3f0a27 ]
    
    Inside function hideep_nvm_unlock(), variable "unmask_code" could
    be uninitialized if hideep_pgm_r_reg() returns error, however, it
    is used in the later if statement after an "and" operation, which
    is potentially unsafe.
    
    Signed-off-by: Yizhuo <yzhai003@ucr.edu>
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/input/touchscreen/hideep.c b/drivers/input/touchscreen/hideep.c
index f1cd4dd9a4a3..d7775db0b711 100644
--- a/drivers/input/touchscreen/hideep.c
+++ b/drivers/input/touchscreen/hideep.c
@@ -364,13 +364,16 @@ static int hideep_enter_pgm(struct hideep_ts *ts)
 	return -EIO;
 }
 
-static void hideep_nvm_unlock(struct hideep_ts *ts)
+static int hideep_nvm_unlock(struct hideep_ts *ts)
 {
 	u32 unmask_code;
+	int error;
 
 	hideep_pgm_w_reg(ts, HIDEEP_FLASH_CFG, HIDEEP_NVM_SFR_RPAGE);
-	hideep_pgm_r_reg(ts, 0x0000000C, &unmask_code);
+	error = hideep_pgm_r_reg(ts, 0x0000000C, &unmask_code);
 	hideep_pgm_w_reg(ts, HIDEEP_FLASH_CFG, HIDEEP_NVM_DEFAULT_PAGE);
+	if (error)
+		return error;
 
 	/* make it unprotected code */
 	unmask_code &= ~HIDEEP_PROT_MODE;
@@ -387,6 +390,8 @@ static void hideep_nvm_unlock(struct hideep_ts *ts)
 	NVM_W_SFR(HIDEEP_NVM_MASK_OFS, ts->nvm_mask);
 	SET_FLASH_HWCONTROL();
 	hideep_pgm_w_reg(ts, HIDEEP_FLASH_CFG, HIDEEP_NVM_DEFAULT_PAGE);
+
+	return 0;
 }
 
 static int hideep_check_status(struct hideep_ts *ts)
@@ -465,7 +470,9 @@ static int hideep_program_nvm(struct hideep_ts *ts,
 	u32 addr = 0;
 	int error;
 
-	hideep_nvm_unlock(ts);
+       error = hideep_nvm_unlock(ts);
+       if (error)
+               return error;
 
 	while (ucode_len > 0) {
 		xfer_len = min_t(size_t, ucode_len, HIDEEP_NVM_PAGE_SIZE);

commit b638d66d2980346713f5bc5d4637481520143bc0
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Thu Jun 17 18:37:29 2021 +0800

    ASoC: soc-core: Fix the error return code in snd_soc_of_parse_audio_routing()
    
    [ Upstream commit 7d3865a10b9ff2669c531d5ddd60bf46b3d48f1e ]
    
    When devm_kcalloc() fails, the error code -ENOMEM should be returned
    instead of -EINVAL.
    
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Link: https://lore.kernel.org/r/20210617103729.1918-1-thunder.leizhen@huawei.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 595fe20bbc6d..8531b490f6f6 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -3510,7 +3510,7 @@ int snd_soc_of_parse_audio_routing(struct snd_soc_card *card,
 	if (!routes) {
 		dev_err(card->dev,
 			"ASoC: Could not allocate DAPM route table\n");
-		return -EINVAL;
+		return -ENOMEM;
 	}
 
 	for (i = 0; i < num_routes; i++) {

commit b65f7b435e022a74d6777f67b3ae12f960ea26d3
Author: Peter Robinson <pbrobinson@gmail.com>
Date:   Sun Jun 13 23:03:26 2021 +0100

    gpio: pca953x: Add support for the On Semi pca9655
    
    [ Upstream commit 6d49b3a0f351925b5ea5047166c112b7590b918a ]
    
    The On Semi pca9655 is a 16 bit variant of the On Semi pca9654 GPIO
    expander, with 16 GPIOs and interrupt functionality.
    
    Signed-off-by: Peter Robinson <pbrobinson@gmail.com>
    [Bartosz: fixed indentation as noted by Andy]
    Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
index 0232c25a1586..dc4088a47ab2 100644
--- a/drivers/gpio/gpio-pca953x.c
+++ b/drivers/gpio/gpio-pca953x.c
@@ -980,6 +980,7 @@ static const struct of_device_id pca953x_dt_ids[] = {
 	{ .compatible = "ti,tca6424", .data = OF_953X(24, PCA_INT), },
 
 	{ .compatible = "onnn,pca9654", .data = OF_953X( 8, PCA_INT), },
+	{ .compatible = "onnn,pca9655", .data = OF_953X(16, PCA_INT), },
 
 	{ .compatible = "exar,xra1202", .data = OF_953X( 8, 0), },
 	{ }

commit 1b0912599f13e3bb477853d4d1ae9f8df5566c99
Author: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Date:   Tue May 25 09:51:42 2021 -0400

    selftests/powerpc: Fix "no_handler" EBB selftest
    
    [ Upstream commit 45677c9aebe926192e59475b35a1ff35ff2d4217 ]
    
    The "no_handler_test" in ebb selftests attempts to read the PMU
    registers twice via helper function "dump_ebb_state". First dump is
    just before closing of event and the second invocation is done after
    closing of the event. The original intention of second
    dump_ebb_state was to dump the state of registers at the end of
    the test when the counters are frozen. But this will be achieved
    with the first call itself since sample period is set to low value
    and PMU will be frozen by then. Hence patch removes the
    dump which was done before closing of the event.
    
    Reported-by: Shirisha Ganta <shirisha.ganta1@ibm.com>
    Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
    Tested-by: Nageswara R Sastry <rnsastry@linux.ibm.com <mailto:rnsastry@linux.ibm.com>>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/1621950703-1532-2-git-send-email-atrajeev@linux.vnet.ibm.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/tools/testing/selftests/powerpc/pmu/ebb/no_handler_test.c b/tools/testing/selftests/powerpc/pmu/ebb/no_handler_test.c
index 8341d7778d5e..87630d44fb4c 100644
--- a/tools/testing/selftests/powerpc/pmu/ebb/no_handler_test.c
+++ b/tools/testing/selftests/powerpc/pmu/ebb/no_handler_test.c
@@ -50,8 +50,6 @@ static int no_handler_test(void)
 
 	event_close(&event);
 
-	dump_ebb_state();
-
 	/* The real test is that we never took an EBB at 0x0 */
 
 	return 0;

commit 477448b31d10e6080be66b34f19efb24affad228
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Wed Jun 16 10:11:21 2021 +0800

    ALSA: ppc: fix error return code in snd_pmac_probe()
    
    [ Upstream commit 80b9c1be567c3c6bbe0d4b290af578e630485b5d ]
    
    If snd_pmac_tumbler_init() or snd_pmac_tumbler_post_init() fails,
    snd_pmac_probe() need return error code.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Link: https://lore.kernel.org/r/20210616021121.1991502-1-yangyingliang@huawei.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/ppc/powermac.c b/sound/ppc/powermac.c
index 33c6be9fb388..7c70ba5e2540 100644
--- a/sound/ppc/powermac.c
+++ b/sound/ppc/powermac.c
@@ -90,7 +90,11 @@ static int snd_pmac_probe(struct platform_device *devptr)
 		sprintf(card->shortname, "PowerMac %s", name_ext);
 		sprintf(card->longname, "%s (Dev %d) Sub-frame %d",
 			card->shortname, chip->device_id, chip->subframe);
-		if ( snd_pmac_tumbler_init(chip) < 0 || snd_pmac_tumbler_post_init() < 0)
+		err = snd_pmac_tumbler_init(chip);
+		if (err < 0)
+			goto __error;
+		err = snd_pmac_tumbler_post_init();
+		if (err < 0)
 			goto __error;
 		break;
 	case PMAC_AWACS:

commit c7a13cbc42793ae74a2dff3fd7f543425830258f
Author: Srinivas Neeli <srinivas.neeli@xilinx.com>
Date:   Fri Apr 9 19:38:05 2021 +0530

    gpio: zynq: Check return value of pm_runtime_get_sync
    
    [ Upstream commit a51b2fb94b04ab71e53a71b9fad03fa826941254 ]
    
    Return value of "pm_runtime_get_sync" API was neither captured nor checked.
    Fixed it by capturing the return value and then checking for any warning.
    
    Addresses-Coverity: "check_return"
    Signed-off-by: Srinivas Neeli <srinivas.neeli@xilinx.com>
    Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpio/gpio-zynq.c b/drivers/gpio/gpio-zynq.c
index 5dec96155814..c2279b28bcb9 100644
--- a/drivers/gpio/gpio-zynq.c
+++ b/drivers/gpio/gpio-zynq.c
@@ -919,8 +919,11 @@ static int zynq_gpio_probe(struct platform_device *pdev)
 static int zynq_gpio_remove(struct platform_device *pdev)
 {
 	struct zynq_gpio *gpio = platform_get_drvdata(pdev);
+	int ret;
 
-	pm_runtime_get_sync(&pdev->dev);
+	ret = pm_runtime_get_sync(&pdev->dev);
+	if (ret < 0)
+		dev_warn(&pdev->dev, "pm_runtime_get_sync() Failed\n");
 	gpiochip_remove(&gpio->chip);
 	clk_disable_unprepare(gpio->clk);
 	device_set_wakeup_capable(&pdev->dev, 0);

commit c58022e95bd62435cb05a3a61c24905e3aa6280c
Author: Geoff Levand <geoff@infradead.org>
Date:   Thu Jun 3 19:17:02 2021 +0000

    powerpc/ps3: Add dma_mask to ps3_dma_region
    
    [ Upstream commit 9733862e50fdba55e7f1554e4286fcc5302ff28e ]
    
    Commit f959dcd6ddfd29235030e8026471ac1b022ad2b0 (dma-direct: Fix
    potential NULL pointer dereference) added a null check on the
    dma_mask pointer of the kernel's device structure.
    
    Add a dma_mask variable to the ps3_dma_region structure and set
    the device structure's dma_mask pointer to point to this new variable.
    
    Fixes runtime errors like these:
    # WARNING: Fixes tag on line 10 doesn't match correct format
    # WARNING: Fixes tag on line 10 doesn't match correct format
    
      ps3_system_bus_match:349: dev=8.0(sb_01), drv=8.0(ps3flash): match
      WARNING: CPU: 0 PID: 1 at kernel/dma/mapping.c:151 .dma_map_page_attrs+0x34/0x1e0
      ps3flash sb_01: ps3stor_setup:193: map DMA region failed
    
    Signed-off-by: Geoff Levand <geoff@infradead.org>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/562d0c9ea0100a30c3b186bcc7adb34b0bbd2cd7.1622746428.git.geoff@infradead.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/powerpc/include/asm/ps3.h b/arch/powerpc/include/asm/ps3.h
index 17ee719e799f..013d24d246d6 100644
--- a/arch/powerpc/include/asm/ps3.h
+++ b/arch/powerpc/include/asm/ps3.h
@@ -83,6 +83,7 @@ struct ps3_dma_region_ops;
  * @bus_addr: The 'translated' bus address of the region.
  * @len: The length in bytes of the region.
  * @offset: The offset from the start of memory of the region.
+ * @dma_mask: Device dma_mask.
  * @ioid: The IOID of the device who owns this region
  * @chunk_list: Opaque variable used by the ioc page manager.
  * @region_ops: struct ps3_dma_region_ops - dma region operations
@@ -97,6 +98,7 @@ struct ps3_dma_region {
 	enum ps3_dma_region_type region_type;
 	unsigned long len;
 	unsigned long offset;
+	u64 dma_mask;
 
 	/* driver variables  (set by ps3_dma_region_create) */
 	unsigned long bus_addr;
diff --git a/arch/powerpc/platforms/ps3/mm.c b/arch/powerpc/platforms/ps3/mm.c
index 894f62d77a77..12ed80850a43 100644
--- a/arch/powerpc/platforms/ps3/mm.c
+++ b/arch/powerpc/platforms/ps3/mm.c
@@ -18,6 +18,7 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
+#include <linux/dma-mapping.h>
 #include <linux/kernel.h>
 #include <linux/export.h>
 #include <linux/memblock.h>
@@ -1130,6 +1131,7 @@ int ps3_dma_region_init(struct ps3_system_bus_device *dev,
 	enum ps3_dma_region_type region_type, void *addr, unsigned long len)
 {
 	unsigned long lpar_addr;
+	int result;
 
 	lpar_addr = addr ? ps3_mm_phys_to_lpar(__pa(addr)) : 0;
 
@@ -1141,6 +1143,16 @@ int ps3_dma_region_init(struct ps3_system_bus_device *dev,
 		r->offset -= map.r1.offset;
 	r->len = len ? len : _ALIGN_UP(map.total, 1 << r->page_size);
 
+	dev->core.dma_mask = &r->dma_mask;
+
+	result = dma_set_mask_and_coherent(&dev->core, DMA_BIT_MASK(32));
+
+	if (result < 0) {
+		dev_err(&dev->core, "%s:%d: dma_set_mask_and_coherent failed: %d\n",
+			__func__, __LINE__, result);
+		return result;
+	}
+
 	switch (dev->dev_type) {
 	case PS3_DEVICE_TYPE_SB:
 		r->region_ops =  (USE_DYNAMIC_DMA)

commit 9ec6184908c650f261eb09fdb18a513150ea1ce7
Author: Takashi Iwai <tiwai@suse.de>
Date:   Tue Jun 8 16:04:37 2021 +0200

    ALSA: sb: Fix potential double-free of CSP mixer elements
    
    [ Upstream commit c305366a37441c2ac90b08711cb6f032b43672f2 ]
    
    snd_sb_qsound_destroy() contains the calls of removing the previously
    created mixer controls, but it doesn't clear the pointers.  As
    snd_sb_qsound_destroy() itself may be repeatedly called via ioctl,
    this could lead to double-free potentially.
    
    Fix it by clearing the struct fields properly afterwards.
    
    Link: https://lore.kernel.org/r/20210608140540.17885-4-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/isa/sb/sb16_csp.c b/sound/isa/sb/sb16_csp.c
index 2e00b64ef13b..b3eecde0b612 100644
--- a/sound/isa/sb/sb16_csp.c
+++ b/sound/isa/sb/sb16_csp.c
@@ -1086,10 +1086,14 @@ static void snd_sb_qsound_destroy(struct snd_sb_csp * p)
 	card = p->chip->card;	
 	
 	down_write(&card->controls_rwsem);
-	if (p->qsound_switch)
+	if (p->qsound_switch) {
 		snd_ctl_remove(card, p->qsound_switch);
-	if (p->qsound_space)
+		p->qsound_switch = NULL;
+	}
+	if (p->qsound_space) {
 		snd_ctl_remove(card, p->qsound_space);
+		p->qsound_space = NULL;
+	}
 	up_write(&card->controls_rwsem);
 
 	/* cancel pending transfer of QSound parameters */

commit e4bb007af559066d8f93dc63c9d137b03372b81e
Author: Po-Hsu Lin <po-hsu.lin@canonical.com>
Date:   Tue May 25 10:36:14 2021 +0800

    selftests: timers: rtcpie: skip test if default RTC device does not exist
    
    [ Upstream commit 0d3e5a057992bdc66e4dca2ca50b77fa4a7bd90e ]
    
    This test will require /dev/rtc0, the default RTC device, or one
    specified by user to run. Since this default RTC is not guaranteed to
    exist on all of the devices, so check its existence first, otherwise
    skip this test with the kselftest skip code 4.
    
    Without this patch this test will fail like this on a s390x zVM:
    $ selftests: timers: rtcpie
    $ /dev/rtc0: No such file or directory
    not ok 1 selftests: timers: rtcpie # exit=22
    
    With this patch:
    $ selftests: timers: rtcpie
    $ Default RTC /dev/rtc0 does not exist. Test Skipped!
    not ok 9 selftests: timers: rtcpie # SKIP
    
    Fixed up change log so "With this patch" text doesn't get dropped.
    Shuah Khan <skhan@linuxfoundation.org>
    
    Signed-off-by: Po-Hsu Lin <po-hsu.lin@canonical.com>
    Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/tools/testing/selftests/timers/rtcpie.c b/tools/testing/selftests/timers/rtcpie.c
index 47b5bad1b393..4ef2184f1558 100644
--- a/tools/testing/selftests/timers/rtcpie.c
+++ b/tools/testing/selftests/timers/rtcpie.c
@@ -18,6 +18,8 @@
 #include <stdlib.h>
 #include <errno.h>
 
+#include "../kselftest.h"
+
 /*
  * This expects the new RTC class driver framework, working with
  * clocks that will often not be clones of what the PC-AT had.
@@ -35,8 +37,14 @@ int main(int argc, char **argv)
 	switch (argc) {
 	case 2:
 		rtc = argv[1];
-		/* FALLTHROUGH */
+		break;
 	case 1:
+		fd = open(default_rtc, O_RDONLY);
+		if (fd == -1) {
+			printf("Default RTC %s does not exist. Test Skipped!\n", default_rtc);
+			exit(KSFT_SKIP);
+		}
+		close(fd);
 		break;
 	default:
 		fprintf(stderr, "usage:  rtctest [rtcdev] [d]\n");

commit b2936c01a51cf344e2b17cbd66ded8b809976667
Author: Valentin Vidic <vvidic@valentin-vidic.from.hr>
Date:   Tue Apr 27 21:40:10 2021 +0200

    s390/sclp_vt220: fix console name to match device
    
    [ Upstream commit b7d91d230a119fdcc334d10c9889ce9c5e15118b ]
    
    Console name reported in /proc/consoles:
    
      ttyS1                -W- (EC p  )    4:65
    
    does not match the char device name:
    
      crw--w----    1 root     root        4,  65 May 17 12:18 /dev/ttysclp0
    
    so debian-installer inside a QEMU s390x instance gets confused and fails
    to start with the following error:
    
      steal-ctty: No such file or directory
    
    Signed-off-by: Valentin Vidic <vvidic@valentin-vidic.from.hr>
    Link: https://lore.kernel.org/r/20210427194010.9330-1-vvidic@valentin-vidic.from.hr
    Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
    Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c
index 4bda9055daef..e8bfd29bb1f9 100644
--- a/arch/s390/kernel/setup.c
+++ b/arch/s390/kernel/setup.c
@@ -141,7 +141,7 @@ static void __init set_preferred_console(void)
 	else if (CONSOLE_IS_3270)
 		add_preferred_console("tty3270", 0, NULL);
 	else if (CONSOLE_IS_VT220)
-		add_preferred_console("ttyS", 1, NULL);
+		add_preferred_console("ttysclp", 0, NULL);
 	else if (CONSOLE_IS_HVC)
 		add_preferred_console("hvc", 0, NULL);
 }
diff --git a/drivers/s390/char/sclp_vt220.c b/drivers/s390/char/sclp_vt220.c
index 3f9a6ef650fa..3c2ed6d01387 100644
--- a/drivers/s390/char/sclp_vt220.c
+++ b/drivers/s390/char/sclp_vt220.c
@@ -35,8 +35,8 @@
 #define SCLP_VT220_MINOR		65
 #define SCLP_VT220_DRIVER_NAME		"sclp_vt220"
 #define SCLP_VT220_DEVICE_NAME		"ttysclp"
-#define SCLP_VT220_CONSOLE_NAME		"ttyS"
-#define SCLP_VT220_CONSOLE_INDEX	1	/* console=ttyS1 */
+#define SCLP_VT220_CONSOLE_NAME		"ttysclp"
+#define SCLP_VT220_CONSOLE_INDEX	0	/* console=ttysclp0 */
 
 /* Representation of a single write request */
 struct sclp_vt220_request {

commit 2296b9c244cdd93cbb28c3e48e33be45447d11f3
Author: Zou Wei <zou_wei@huawei.com>
Date:   Wed May 12 14:33:46 2021 +0800

    mfd: da9052/stmpe: Add and modify MODULE_DEVICE_TABLE
    
    [ Upstream commit 4700ef326556ed74aba188f12396740a8c1c21dd ]
    
    This patch adds/modifies MODULE_DEVICE_TABLE definition which generates
    correct modalias for automatic loading of this driver when it is built
    as an external module.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zou Wei <zou_wei@huawei.com>
    Signed-off-by: Lee Jones <lee.jones@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mfd/da9052-i2c.c b/drivers/mfd/da9052-i2c.c
index 578e881067a5..4094f97ec7dc 100644
--- a/drivers/mfd/da9052-i2c.c
+++ b/drivers/mfd/da9052-i2c.c
@@ -118,6 +118,7 @@ static const struct i2c_device_id da9052_i2c_id[] = {
 	{"da9053-bc", DA9053_BC},
 	{}
 };
+MODULE_DEVICE_TABLE(i2c, da9052_i2c_id);
 
 #ifdef CONFIG_OF
 static const struct of_device_id dialog_dt_ids[] = {
diff --git a/drivers/mfd/stmpe-i2c.c b/drivers/mfd/stmpe-i2c.c
index 863c39a3353c..d284df25c76b 100644
--- a/drivers/mfd/stmpe-i2c.c
+++ b/drivers/mfd/stmpe-i2c.c
@@ -109,7 +109,7 @@ static const struct i2c_device_id stmpe_i2c_id[] = {
 	{ "stmpe2403", STMPE2403 },
 	{ }
 };
-MODULE_DEVICE_TABLE(i2c, stmpe_id);
+MODULE_DEVICE_TABLE(i2c, stmpe_i2c_id);
 
 static struct i2c_driver stmpe_i2c_driver = {
 	.driver = {

commit 545de233de7d8ae2655d679d9e2a9e22497629f1
Author: Mike Christie <michael.christie@oracle.com>
Date:   Tue May 25 13:18:12 2021 -0500

    scsi: qedi: Fix null ref during abort handling
    
    [ Upstream commit 5777b7f0f03ce49372203b6521631f62f2810c8f ]
    
    If qedi_process_cmd_cleanup_resp finds the cmd it frees the work and sets
    list_tmf_work to NULL, so qedi_tmf_work should check if list_tmf_work is
    non-NULL when it wants to force cleanup.
    
    Link: https://lore.kernel.org/r/20210525181821.7617-20-michael.christie@oracle.com
    Reviewed-by: Manish Rangankar <mrangankar@marvell.com>
    Signed-off-by: Mike Christie <michael.christie@oracle.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/qedi/qedi_fw.c b/drivers/scsi/qedi/qedi_fw.c
index 357a0acc5ed2..b60b48f3b984 100644
--- a/drivers/scsi/qedi/qedi_fw.c
+++ b/drivers/scsi/qedi/qedi_fw.c
@@ -1466,7 +1466,7 @@ static void qedi_tmf_work(struct work_struct *work)
 
 ldel_exit:
 	spin_lock_bh(&qedi_conn->tmf_work_lock);
-	if (!qedi_cmd->list_tmf_work) {
+	if (qedi_cmd->list_tmf_work) {
 		list_del_init(&list_work->list);
 		qedi_cmd->list_tmf_work = NULL;
 		kfree(list_work);

commit 693e09c3be3cc130320036861c0d249da03bf1be
Author: Mike Christie <michael.christie@oracle.com>
Date:   Tue May 25 13:18:07 2021 -0500

    scsi: iscsi: Fix shost->max_id use
    
    [ Upstream commit bdd4aad7ff92ae39c2e93c415bb6761cb8b584da ]
    
    The iscsi offload drivers are setting the shost->max_id to the max number
    of sessions they support. The problem is that max_id is not the max number
    of targets but the highest identifier the targets can have. To use it to
    limit the number of targets we need to set it to max sessions - 1, or we
    can end up with a session we might not have preallocated resources for.
    
    Link: https://lore.kernel.org/r/20210525181821.7617-15-michael.christie@oracle.com
    Reviewed-by: Lee Duncan <lduncan@suse.com>
    Signed-off-by: Mike Christie <michael.christie@oracle.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c
index 3660059784f7..a5b807c676fc 100644
--- a/drivers/scsi/be2iscsi/be_main.c
+++ b/drivers/scsi/be2iscsi/be_main.c
@@ -423,7 +423,7 @@ static struct beiscsi_hba *beiscsi_hba_alloc(struct pci_dev *pcidev)
 			"beiscsi_hba_alloc - iscsi_host_alloc failed\n");
 		return NULL;
 	}
-	shost->max_id = BE2_MAX_SESSIONS;
+	shost->max_id = BE2_MAX_SESSIONS - 1;
 	shost->max_channel = 0;
 	shost->max_cmd_len = BEISCSI_MAX_CMD_LEN;
 	shost->max_lun = BEISCSI_NUM_MAX_LUN;
@@ -5336,7 +5336,7 @@ static int beiscsi_enable_port(struct beiscsi_hba *phba)
 	/* Re-enable UER. If different TPE occurs then it is recoverable. */
 	beiscsi_set_uer_feature(phba);
 
-	phba->shost->max_id = phba->params.cxns_per_ctrl;
+	phba->shost->max_id = phba->params.cxns_per_ctrl - 1;
 	phba->shost->can_queue = phba->params.ios_per_ctrl;
 	ret = beiscsi_init_port(phba);
 	if (ret < 0) {
diff --git a/drivers/scsi/bnx2i/bnx2i_iscsi.c b/drivers/scsi/bnx2i/bnx2i_iscsi.c
index 718a0335cfbb..9a5795d5a347 100644
--- a/drivers/scsi/bnx2i/bnx2i_iscsi.c
+++ b/drivers/scsi/bnx2i/bnx2i_iscsi.c
@@ -793,7 +793,7 @@ struct bnx2i_hba *bnx2i_alloc_hba(struct cnic_dev *cnic)
 		return NULL;
 	shost->dma_boundary = cnic->pcidev->dma_mask;
 	shost->transportt = bnx2i_scsi_xport_template;
-	shost->max_id = ISCSI_MAX_CONNS_PER_HBA;
+	shost->max_id = ISCSI_MAX_CONNS_PER_HBA - 1;
 	shost->max_channel = 0;
 	shost->max_lun = 512;
 	shost->max_cmd_len = 16;
diff --git a/drivers/scsi/cxgbi/libcxgbi.c b/drivers/scsi/cxgbi/libcxgbi.c
index 559d8bda4cca..01f5ebee3229 100644
--- a/drivers/scsi/cxgbi/libcxgbi.c
+++ b/drivers/scsi/cxgbi/libcxgbi.c
@@ -339,7 +339,7 @@ void cxgbi_hbas_remove(struct cxgbi_device *cdev)
 EXPORT_SYMBOL_GPL(cxgbi_hbas_remove);
 
 int cxgbi_hbas_add(struct cxgbi_device *cdev, u64 max_lun,
-		unsigned int max_id, struct scsi_host_template *sht,
+		unsigned int max_conns, struct scsi_host_template *sht,
 		struct scsi_transport_template *stt)
 {
 	struct cxgbi_hba *chba;
@@ -359,7 +359,7 @@ int cxgbi_hbas_add(struct cxgbi_device *cdev, u64 max_lun,
 
 		shost->transportt = stt;
 		shost->max_lun = max_lun;
-		shost->max_id = max_id;
+		shost->max_id = max_conns - 1;
 		shost->max_channel = 0;
 		shost->max_cmd_len = 16;
 
diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index fe26144d390a..7665fd641886 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -629,7 +629,7 @@ static struct qedi_ctx *qedi_host_alloc(struct pci_dev *pdev)
 		goto exit_setup_shost;
 	}
 
-	shost->max_id = QEDI_MAX_ISCSI_CONNS_PER_HBA;
+	shost->max_id = QEDI_MAX_ISCSI_CONNS_PER_HBA - 1;
 	shost->max_channel = 0;
 	shost->max_lun = ~0;
 	shost->max_cmd_len = 16;

commit bf20d85a88384574fabb3d53ad62a8af57e7ab11
Author: Mike Christie <michael.christie@oracle.com>
Date:   Tue May 25 13:18:06 2021 -0500

    scsi: iscsi: Fix conn use after free during resets
    
    [ Upstream commit ec29d0ac29be366450a7faffbcf8cba3a6a3b506 ]
    
    If we haven't done a unbind target call we can race where
    iscsi_conn_teardown wakes up the EH thread and then frees the conn while
    those threads are still accessing the conn ehwait.
    
    We can only do one TMF per session so this just moves the TMF fields from
    the conn to the session. We can then rely on the
    iscsi_session_teardown->iscsi_remove_session->__iscsi_unbind_session call
    to remove the target and it's devices, and know after that point there is
    no device or scsi-ml callout trying to access the session.
    
    Link: https://lore.kernel.org/r/20210525181821.7617-14-michael.christie@oracle.com
    Reviewed-by: Lee Duncan <lduncan@suse.com>
    Signed-off-by: Mike Christie <michael.christie@oracle.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
index 52521b68f0a7..5607fe8541c3 100644
--- a/drivers/scsi/libiscsi.c
+++ b/drivers/scsi/libiscsi.c
@@ -259,11 +259,11 @@ static int iscsi_prep_bidi_ahs(struct iscsi_task *task)
  */
 static int iscsi_check_tmf_restrictions(struct iscsi_task *task, int opcode)
 {
-	struct iscsi_conn *conn = task->conn;
-	struct iscsi_tm *tmf = &conn->tmhdr;
+	struct iscsi_session *session = task->conn->session;
+	struct iscsi_tm *tmf = &session->tmhdr;
 	u64 hdr_lun;
 
-	if (conn->tmf_state == TMF_INITIAL)
+	if (session->tmf_state == TMF_INITIAL)
 		return 0;
 
 	if ((tmf->opcode & ISCSI_OPCODE_MASK) != ISCSI_OP_SCSI_TMFUNC)
@@ -283,24 +283,19 @@ static int iscsi_check_tmf_restrictions(struct iscsi_task *task, int opcode)
 		 * Fail all SCSI cmd PDUs
 		 */
 		if (opcode != ISCSI_OP_SCSI_DATA_OUT) {
-			iscsi_conn_printk(KERN_INFO, conn,
-					  "task [op %x itt "
-					  "0x%x/0x%x] "
-					  "rejected.\n",
-					  opcode, task->itt,
-					  task->hdr_itt);
+			iscsi_session_printk(KERN_INFO, session,
+					     "task [op %x itt 0x%x/0x%x] rejected.\n",
+					     opcode, task->itt, task->hdr_itt);
 			return -EACCES;
 		}
 		/*
 		 * And also all data-out PDUs in response to R2T
 		 * if fast_abort is set.
 		 */
-		if (conn->session->fast_abort) {
-			iscsi_conn_printk(KERN_INFO, conn,
-					  "task [op %x itt "
-					  "0x%x/0x%x] fast abort.\n",
-					  opcode, task->itt,
-					  task->hdr_itt);
+		if (session->fast_abort) {
+			iscsi_session_printk(KERN_INFO, session,
+					     "task [op %x itt 0x%x/0x%x] fast abort.\n",
+					     opcode, task->itt, task->hdr_itt);
 			return -EACCES;
 		}
 		break;
@@ -313,7 +308,7 @@ static int iscsi_check_tmf_restrictions(struct iscsi_task *task, int opcode)
 		 */
 		if (opcode == ISCSI_OP_SCSI_DATA_OUT &&
 		    task->hdr_itt == tmf->rtt) {
-			ISCSI_DBG_SESSION(conn->session,
+			ISCSI_DBG_SESSION(session,
 					  "Preventing task %x/%x from sending "
 					  "data-out due to abort task in "
 					  "progress\n", task->itt,
@@ -970,20 +965,21 @@ iscsi_data_in_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
 static void iscsi_tmf_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr)
 {
 	struct iscsi_tm_rsp *tmf = (struct iscsi_tm_rsp *)hdr;
+	struct iscsi_session *session = conn->session;
 
 	conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1;
 	conn->tmfrsp_pdus_cnt++;
 
-	if (conn->tmf_state != TMF_QUEUED)
+	if (session->tmf_state != TMF_QUEUED)
 		return;
 
 	if (tmf->response == ISCSI_TMF_RSP_COMPLETE)
-		conn->tmf_state = TMF_SUCCESS;
+		session->tmf_state = TMF_SUCCESS;
 	else if (tmf->response == ISCSI_TMF_RSP_NO_TASK)
-		conn->tmf_state = TMF_NOT_FOUND;
+		session->tmf_state = TMF_NOT_FOUND;
 	else
-		conn->tmf_state = TMF_FAILED;
-	wake_up(&conn->ehwait);
+		session->tmf_state = TMF_FAILED;
+	wake_up(&session->ehwait);
 }
 
 static int iscsi_send_nopout(struct iscsi_conn *conn, struct iscsi_nopin *rhdr)
@@ -1822,15 +1818,14 @@ EXPORT_SYMBOL_GPL(iscsi_target_alloc);
 
 static void iscsi_tmf_timedout(struct timer_list *t)
 {
-	struct iscsi_conn *conn = from_timer(conn, t, tmf_timer);
-	struct iscsi_session *session = conn->session;
+	struct iscsi_session *session = from_timer(session, t, tmf_timer);
 
 	spin_lock(&session->frwd_lock);
-	if (conn->tmf_state == TMF_QUEUED) {
-		conn->tmf_state = TMF_TIMEDOUT;
+	if (session->tmf_state == TMF_QUEUED) {
+		session->tmf_state = TMF_TIMEDOUT;
 		ISCSI_DBG_EH(session, "tmf timedout\n");
 		/* unblock eh_abort() */
-		wake_up(&conn->ehwait);
+		wake_up(&session->ehwait);
 	}
 	spin_unlock(&session->frwd_lock);
 }
@@ -1853,8 +1848,8 @@ static int iscsi_exec_task_mgmt_fn(struct iscsi_conn *conn,
 		return -EPERM;
 	}
 	conn->tmfcmd_pdus_cnt++;
-	conn->tmf_timer.expires = timeout * HZ + jiffies;
-	add_timer(&conn->tmf_timer);
+	session->tmf_timer.expires = timeout * HZ + jiffies;
+	add_timer(&session->tmf_timer);
 	ISCSI_DBG_EH(session, "tmf set timeout\n");
 
 	spin_unlock_bh(&session->frwd_lock);
@@ -1868,12 +1863,12 @@ static int iscsi_exec_task_mgmt_fn(struct iscsi_conn *conn,
 	 * 3) session is terminated or restarted or userspace has
 	 * given up on recovery
 	 */
-	wait_event_interruptible(conn->ehwait, age != session->age ||
+	wait_event_interruptible(session->ehwait, age != session->age ||
 				 session->state != ISCSI_STATE_LOGGED_IN ||
-				 conn->tmf_state != TMF_QUEUED);
+				 session->tmf_state != TMF_QUEUED);
 	if (signal_pending(current))
 		flush_signals(current);
-	del_timer_sync(&conn->tmf_timer);
+	del_timer_sync(&session->tmf_timer);
 
 	mutex_lock(&session->eh_mutex);
 	spin_lock_bh(&session->frwd_lock);
@@ -2233,17 +2228,17 @@ int iscsi_eh_abort(struct scsi_cmnd *sc)
 	}
 
 	/* only have one tmf outstanding at a time */
-	if (conn->tmf_state != TMF_INITIAL)
+	if (session->tmf_state != TMF_INITIAL)
 		goto failed;
-	conn->tmf_state = TMF_QUEUED;
+	session->tmf_state = TMF_QUEUED;
 
-	hdr = &conn->tmhdr;
+	hdr = &session->tmhdr;
 	iscsi_prep_abort_task_pdu(task, hdr);
 
 	if (iscsi_exec_task_mgmt_fn(conn, hdr, age, session->abort_timeout))
 		goto failed;
 
-	switch (conn->tmf_state) {
+	switch (session->tmf_state) {
 	case TMF_SUCCESS:
 		spin_unlock_bh(&session->frwd_lock);
 		/*
@@ -2258,7 +2253,7 @@ int iscsi_eh_abort(struct scsi_cmnd *sc)
 		 */
 		spin_lock_bh(&session->frwd_lock);
 		fail_scsi_task(task, DID_ABORT);
-		conn->tmf_state = TMF_INITIAL;
+		session->tmf_state = TMF_INITIAL;
 		memset(hdr, 0, sizeof(*hdr));
 		spin_unlock_bh(&session->frwd_lock);
 		iscsi_start_tx(conn);
@@ -2269,7 +2264,7 @@ int iscsi_eh_abort(struct scsi_cmnd *sc)
 		goto failed_unlocked;
 	case TMF_NOT_FOUND:
 		if (!sc->SCp.ptr) {
-			conn->tmf_state = TMF_INITIAL;
+			session->tmf_state = TMF_INITIAL;
 			memset(hdr, 0, sizeof(*hdr));
 			/* task completed before tmf abort response */
 			ISCSI_DBG_EH(session, "sc completed while abort	in "
@@ -2278,7 +2273,7 @@ int iscsi_eh_abort(struct scsi_cmnd *sc)
 		}
 		/* fall through */
 	default:
-		conn->tmf_state = TMF_INITIAL;
+		session->tmf_state = TMF_INITIAL;
 		goto failed;
 	}
 
@@ -2335,11 +2330,11 @@ int iscsi_eh_device_reset(struct scsi_cmnd *sc)
 	conn = session->leadconn;
 
 	/* only have one tmf outstanding at a time */
-	if (conn->tmf_state != TMF_INITIAL)
+	if (session->tmf_state != TMF_INITIAL)
 		goto unlock;
-	conn->tmf_state = TMF_QUEUED;
+	session->tmf_state = TMF_QUEUED;
 
-	hdr = &conn->tmhdr;
+	hdr = &session->tmhdr;
 	iscsi_prep_lun_reset_pdu(sc, hdr);
 
 	if (iscsi_exec_task_mgmt_fn(conn, hdr, session->age,
@@ -2348,7 +2343,7 @@ int iscsi_eh_device_reset(struct scsi_cmnd *sc)
 		goto unlock;
 	}
 
-	switch (conn->tmf_state) {
+	switch (session->tmf_state) {
 	case TMF_SUCCESS:
 		break;
 	case TMF_TIMEDOUT:
@@ -2356,7 +2351,7 @@ int iscsi_eh_device_reset(struct scsi_cmnd *sc)
 		iscsi_conn_failure(conn, ISCSI_ERR_SCSI_EH_SESSION_RST);
 		goto done;
 	default:
-		conn->tmf_state = TMF_INITIAL;
+		session->tmf_state = TMF_INITIAL;
 		goto unlock;
 	}
 
@@ -2368,7 +2363,7 @@ int iscsi_eh_device_reset(struct scsi_cmnd *sc)
 	spin_lock_bh(&session->frwd_lock);
 	memset(hdr, 0, sizeof(*hdr));
 	fail_scsi_tasks(conn, sc->device->lun, DID_ERROR);
-	conn->tmf_state = TMF_INITIAL;
+	session->tmf_state = TMF_INITIAL;
 	spin_unlock_bh(&session->frwd_lock);
 
 	iscsi_start_tx(conn);
@@ -2391,8 +2386,7 @@ void iscsi_session_recovery_timedout(struct iscsi_cls_session *cls_session)
 	spin_lock_bh(&session->frwd_lock);
 	if (session->state != ISCSI_STATE_LOGGED_IN) {
 		session->state = ISCSI_STATE_RECOVERY_FAILED;
-		if (session->leadconn)
-			wake_up(&session->leadconn->ehwait);
+		wake_up(&session->ehwait);
 	}
 	spin_unlock_bh(&session->frwd_lock);
 }
@@ -2437,7 +2431,7 @@ int iscsi_eh_session_reset(struct scsi_cmnd *sc)
 	iscsi_conn_failure(conn, ISCSI_ERR_SCSI_EH_SESSION_RST);
 
 	ISCSI_DBG_EH(session, "wait for relogin\n");
-	wait_event_interruptible(conn->ehwait,
+	wait_event_interruptible(session->ehwait,
 				 session->state == ISCSI_STATE_TERMINATE ||
 				 session->state == ISCSI_STATE_LOGGED_IN ||
 				 session->state == ISCSI_STATE_RECOVERY_FAILED);
@@ -2498,11 +2492,11 @@ static int iscsi_eh_target_reset(struct scsi_cmnd *sc)
 	conn = session->leadconn;
 
 	/* only have one tmf outstanding at a time */
-	if (conn->tmf_state != TMF_INITIAL)
+	if (session->tmf_state != TMF_INITIAL)
 		goto unlock;
-	conn->tmf_state = TMF_QUEUED;
+	session->tmf_state = TMF_QUEUED;
 
-	hdr = &conn->tmhdr;
+	hdr = &session->tmhdr;
 	iscsi_prep_tgt_reset_pdu(sc, hdr);
 
 	if (iscsi_exec_task_mgmt_fn(conn, hdr, session->age,
@@ -2511,7 +2505,7 @@ static int iscsi_eh_target_reset(struct scsi_cmnd *sc)
 		goto unlock;
 	}
 
-	switch (conn->tmf_state) {
+	switch (session->tmf_state) {
 	case TMF_SUCCESS:
 		break;
 	case TMF_TIMEDOUT:
@@ -2519,7 +2513,7 @@ static int iscsi_eh_target_reset(struct scsi_cmnd *sc)
 		iscsi_conn_failure(conn, ISCSI_ERR_SCSI_EH_SESSION_RST);
 		goto done;
 	default:
-		conn->tmf_state = TMF_INITIAL;
+		session->tmf_state = TMF_INITIAL;
 		goto unlock;
 	}
 
@@ -2531,7 +2525,7 @@ static int iscsi_eh_target_reset(struct scsi_cmnd *sc)
 	spin_lock_bh(&session->frwd_lock);
 	memset(hdr, 0, sizeof(*hdr));
 	fail_scsi_tasks(conn, -1, DID_ERROR);
-	conn->tmf_state = TMF_INITIAL;
+	session->tmf_state = TMF_INITIAL;
 	spin_unlock_bh(&session->frwd_lock);
 
 	iscsi_start_tx(conn);
@@ -2836,7 +2830,10 @@ iscsi_session_setup(struct iscsi_transport *iscsit, struct Scsi_Host *shost,
 	session->tt = iscsit;
 	session->dd_data = cls_session->dd_data + sizeof(*session);
 
+	session->tmf_state = TMF_INITIAL;
+	timer_setup(&session->tmf_timer, iscsi_tmf_timedout, 0);
 	mutex_init(&session->eh_mutex);
+
 	spin_lock_init(&session->frwd_lock);
 	spin_lock_init(&session->back_lock);
 
@@ -2940,7 +2937,6 @@ iscsi_conn_setup(struct iscsi_cls_session *cls_session, int dd_size,
 	conn->c_stage = ISCSI_CONN_INITIAL_STAGE;
 	conn->id = conn_idx;
 	conn->exp_statsn = 0;
-	conn->tmf_state = TMF_INITIAL;
 
 	timer_setup(&conn->transport_timer, iscsi_check_transport_timeouts, 0);
 
@@ -2966,8 +2962,7 @@ iscsi_conn_setup(struct iscsi_cls_session *cls_session, int dd_size,
 		goto login_task_data_alloc_fail;
 	conn->login_task->data = conn->data = data;
 
-	timer_setup(&conn->tmf_timer, iscsi_tmf_timedout, 0);
-	init_waitqueue_head(&conn->ehwait);
+	init_waitqueue_head(&session->ehwait);
 
 	return cls_conn;
 
@@ -3002,7 +2997,7 @@ void iscsi_conn_teardown(struct iscsi_cls_conn *cls_conn)
 		 * leading connection? then give up on recovery.
 		 */
 		session->state = ISCSI_STATE_TERMINATE;
-		wake_up(&conn->ehwait);
+		wake_up(&session->ehwait);
 	}
 	spin_unlock_bh(&session->frwd_lock);
 
@@ -3077,7 +3072,7 @@ int iscsi_conn_start(struct iscsi_cls_conn *cls_conn)
 		 * commands after successful recovery
 		 */
 		conn->stop_stage = 0;
-		conn->tmf_state = TMF_INITIAL;
+		session->tmf_state = TMF_INITIAL;
 		session->age++;
 		if (session->age == 16)
 			session->age = 0;
@@ -3091,7 +3086,7 @@ int iscsi_conn_start(struct iscsi_cls_conn *cls_conn)
 	spin_unlock_bh(&session->frwd_lock);
 
 	iscsi_unblock_session(session->cls_session);
-	wake_up(&conn->ehwait);
+	wake_up(&session->ehwait);
 	return 0;
 }
 EXPORT_SYMBOL_GPL(iscsi_conn_start);
@@ -3177,7 +3172,7 @@ static void iscsi_start_session_recovery(struct iscsi_session *session,
 	spin_lock_bh(&session->frwd_lock);
 	fail_scsi_tasks(conn, -1, DID_TRANSPORT_DISRUPTED);
 	fail_mgmt_tasks(session, conn);
-	memset(&conn->tmhdr, 0, sizeof(conn->tmhdr));
+	memset(&session->tmhdr, 0, sizeof(session->tmhdr));
 	spin_unlock_bh(&session->frwd_lock);
 	mutex_unlock(&session->eh_mutex);
 }
diff --git a/include/scsi/libiscsi.h b/include/scsi/libiscsi.h
index 1ee0f30ae190..647f1e0e726c 100644
--- a/include/scsi/libiscsi.h
+++ b/include/scsi/libiscsi.h
@@ -208,12 +208,6 @@ struct iscsi_conn {
 	unsigned long		suspend_tx;	/* suspend Tx */
 	unsigned long		suspend_rx;	/* suspend Rx */
 
-	/* abort */
-	wait_queue_head_t	ehwait;		/* used in eh_abort() */
-	struct iscsi_tm		tmhdr;
-	struct timer_list	tmf_timer;
-	int			tmf_state;	/* see TMF_INITIAL, etc.*/
-
 	/* negotiated params */
 	unsigned		max_recv_dlength; /* initiator_max_recv_dsl*/
 	unsigned		max_xmit_dlength; /* target_max_recv_dsl */
@@ -283,6 +277,11 @@ struct iscsi_session {
 	 * and recv lock.
 	 */
 	struct mutex		eh_mutex;
+	/* abort */
+	wait_queue_head_t	ehwait;		/* used in eh_abort() */
+	struct iscsi_tm		tmhdr;
+	struct timer_list	tmf_timer;
+	int			tmf_state;	/* see TMF_INITIAL, etc.*/
 
 	/* iSCSI session-wide sequencing */
 	uint32_t		cmdsn;

commit 8d3f5e3b4ebe1e4cdc9f6d79dd24e77aa8007efb
Author: Mike Christie <michael.christie@oracle.com>
Date:   Tue May 25 13:18:03 2021 -0500

    scsi: iscsi: Add iscsi_cls_conn refcount helpers
    
    [ Upstream commit b1d19e8c92cfb0ded180ef3376c20e130414e067 ]
    
    There are a couple places where we could free the iscsi_cls_conn while it's
    still in use. This adds some helpers to get/put a refcount on the struct
    and converts an exiting user. Subsequent commits will then use the helpers
    to fix 2 bugs in the eh code.
    
    Link: https://lore.kernel.org/r/20210525181821.7617-11-michael.christie@oracle.com
    Reviewed-by: Lee Duncan <lduncan@suse.com>
    Signed-off-by: Mike Christie <michael.christie@oracle.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
index 81471c304991..52521b68f0a7 100644
--- a/drivers/scsi/libiscsi.c
+++ b/drivers/scsi/libiscsi.c
@@ -1385,7 +1385,6 @@ void iscsi_session_failure(struct iscsi_session *session,
 			   enum iscsi_err err)
 {
 	struct iscsi_conn *conn;
-	struct device *dev;
 
 	spin_lock_bh(&session->frwd_lock);
 	conn = session->leadconn;
@@ -1394,10 +1393,8 @@ void iscsi_session_failure(struct iscsi_session *session,
 		return;
 	}
 
-	dev = get_device(&conn->cls_conn->dev);
+	iscsi_get_conn(conn->cls_conn);
 	spin_unlock_bh(&session->frwd_lock);
-	if (!dev)
-	        return;
 	/*
 	 * if the host is being removed bypass the connection
 	 * recovery initialization because we are going to kill
@@ -1407,7 +1404,7 @@ void iscsi_session_failure(struct iscsi_session *session,
 		iscsi_conn_error_event(conn->cls_conn, err);
 	else
 		iscsi_conn_failure(conn, err);
-	put_device(dev);
+	iscsi_put_conn(conn->cls_conn);
 }
 EXPORT_SYMBOL_GPL(iscsi_session_failure);
 
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
index e340b05278b6..2aaa5a2bd613 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -2306,6 +2306,18 @@ int iscsi_destroy_conn(struct iscsi_cls_conn *conn)
 }
 EXPORT_SYMBOL_GPL(iscsi_destroy_conn);
 
+void iscsi_put_conn(struct iscsi_cls_conn *conn)
+{
+	put_device(&conn->dev);
+}
+EXPORT_SYMBOL_GPL(iscsi_put_conn);
+
+void iscsi_get_conn(struct iscsi_cls_conn *conn)
+{
+	get_device(&conn->dev);
+}
+EXPORT_SYMBOL_GPL(iscsi_get_conn);
+
 /*
  * iscsi interface functions
  */
diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h
index b266d2a3bcb1..484e9787d817 100644
--- a/include/scsi/scsi_transport_iscsi.h
+++ b/include/scsi/scsi_transport_iscsi.h
@@ -436,6 +436,8 @@ extern void iscsi_remove_session(struct iscsi_cls_session *session);
 extern void iscsi_free_session(struct iscsi_cls_session *session);
 extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess,
 						int dd_size, uint32_t cid);
+extern void iscsi_put_conn(struct iscsi_cls_conn *conn);
+extern void iscsi_get_conn(struct iscsi_cls_conn *conn);
 extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn);
 extern void iscsi_unblock_session(struct iscsi_cls_session *session);
 extern void iscsi_block_session(struct iscsi_cls_session *session);

commit 8a63ff46c2196bb9cd2a7afbfe7aa4cb3388f5b8
Author: Jiapeng Chong <jiapeng.chong@linux.alibaba.com>
Date:   Tue Jun 1 19:07:10 2021 +0800

    fs/jfs: Fix missing error code in lmLogInit()
    
    [ Upstream commit 492109333c29e1bb16d8732e1d597b02e8e0bf2e ]
    
    The error code is missing in this code scenario, add the error code
    '-EINVAL' to the return value 'rc.
    
    Eliminate the follow smatch warning:
    
    fs/jfs/jfs_logmgr.c:1327 lmLogInit() warn: missing error code 'rc'.
    
    Reported-by: Abaci Robot <abaci@linux.alibaba.com>
    Signed-off-by: Jiapeng Chong <jiapeng.chong@linux.alibaba.com>
    Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c
index 6b68df395892..356d1fcf7119 100644
--- a/fs/jfs/jfs_logmgr.c
+++ b/fs/jfs/jfs_logmgr.c
@@ -1338,6 +1338,7 @@ int lmLogInit(struct jfs_log * log)
 		} else {
 			if (memcmp(logsuper->uuid, log->uuid, 16)) {
 				jfs_warn("wrong uuid on JFS log device");
+				rc = -EINVAL;
 				goto errout20;
 			}
 			log->size = le32_to_cpu(logsuper->size);

commit f4bde1d1bf905590c55acb02104c60d1c281a24f
Author: Hannes Reinecke <hare@suse.de>
Date:   Tue Apr 27 10:30:11 2021 +0200

    scsi: scsi_dh_alua: Check for negative result value
    
    [ Upstream commit 7e26e3ea028740f934477ec01ba586ab033c35aa ]
    
    scsi_execute() will now return a negative error if there was an error prior
    to command submission; evaluate that instead if checking for DRIVER_ERROR.
    
    [mkp: build fix]
    
    Link: https://lore.kernel.org/r/20210427083046.31620-6-hare@suse.de
    Signed-off-by: Hannes Reinecke <hare@suse.de>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/device_handler/scsi_dh_alua.c b/drivers/scsi/device_handler/scsi_dh_alua.c
index efd2b4312528..41e8c9e68878 100644
--- a/drivers/scsi/device_handler/scsi_dh_alua.c
+++ b/drivers/scsi/device_handler/scsi_dh_alua.c
@@ -562,12 +562,12 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_port_group *pg)
 			kfree(buff);
 			return SCSI_DH_OK;
 		}
-		if (!scsi_sense_valid(&sense_hdr)) {
+		if (retval < 0 || !scsi_sense_valid(&sense_hdr)) {
 			sdev_printk(KERN_INFO, sdev,
 				    "%s: rtpg failed, result %d\n",
 				    ALUA_DH_NAME, retval);
 			kfree(buff);
-			if (driver_byte(retval) == DRIVER_ERROR)
+			if (retval < 0)
 				return SCSI_DH_DEV_TEMP_BUSY;
 			return SCSI_DH_IO;
 		}
@@ -789,11 +789,11 @@ static unsigned alua_stpg(struct scsi_device *sdev, struct alua_port_group *pg)
 	retval = submit_stpg(sdev, pg->group_id, &sense_hdr);
 
 	if (retval) {
-		if (!scsi_sense_valid(&sense_hdr)) {
+		if (retval < 0 || !scsi_sense_valid(&sense_hdr)) {
 			sdev_printk(KERN_INFO, sdev,
 				    "%s: stpg failed, result %d",
 				    ALUA_DH_NAME, retval);
-			if (driver_byte(retval) == DRIVER_ERROR)
+			if (retval < 0)
 				return SCSI_DH_DEV_TEMP_BUSY;
 		} else {
 			sdev_printk(KERN_INFO, sdev, "%s: stpg failed\n",

commit cddee5c287e26f6b2ba5c0ffdfc3a846f2f10461
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Tue May 25 21:44:04 2021 +0200

    tty: serial: 8250: serial_cs: Fix a memory leak in error handling path
    
    [ Upstream commit fad92b11047a748c996ebd6cfb164a63814eeb2e ]
    
    In the probe function, if the final 'serial_config()' fails, 'info' is
    leaking.
    
    Add a resource handling path to free this memory.
    
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Link: https://lore.kernel.org/r/dc25f96b7faebf42e60fe8d02963c941cf4d8124.1621971720.git.christophe.jaillet@wanadoo.fr
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/serial/8250/serial_cs.c b/drivers/tty/serial/8250/serial_cs.c
index ccd1a615305b..a05c2b652040 100644
--- a/drivers/tty/serial/8250/serial_cs.c
+++ b/drivers/tty/serial/8250/serial_cs.c
@@ -306,6 +306,7 @@ static int serial_resume(struct pcmcia_device *link)
 static int serial_probe(struct pcmcia_device *link)
 {
 	struct serial_info *info;
+	int ret;
 
 	dev_dbg(&link->dev, "serial_attach()\n");
 
@@ -320,7 +321,15 @@ static int serial_probe(struct pcmcia_device *link)
 	if (do_sound)
 		link->config_flags |= CONF_ENABLE_SPKR;
 
-	return serial_config(link);
+	ret = serial_config(link);
+	if (ret)
+		goto free_info;
+
+	return 0;
+
+free_info:
+	kfree(info);
+	return ret;
 }
 
 static void serial_detach(struct pcmcia_device *link)

commit 7c3a170279bf2cd870d30a97344e91db5dccf1d2
Author: Yufen Yu <yuyufen@huawei.com>
Date:   Mon May 24 05:38:11 2021 -0400

    ALSA: ac97: fix PM reference leak in ac97_bus_remove()
    
    [ Upstream commit a38e93302ee25b2ca6f4ee76c6c974cf3637985e ]
    
    pm_runtime_get_sync will increment pm usage counter even it failed.
    Forgetting to putting operation will result in reference leak here.
    Fix it by replacing it with pm_runtime_resume_and_get to keep usage
    counter balanced.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yufen Yu <yuyufen@huawei.com>
    Link: https://lore.kernel.org/r/20210524093811.612302-1-yuyufen@huawei.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/ac97/bus.c b/sound/ac97/bus.c
index ca50ff444796..d8b227e6d4cf 100644
--- a/sound/ac97/bus.c
+++ b/sound/ac97/bus.c
@@ -523,7 +523,7 @@ static int ac97_bus_remove(struct device *dev)
 	struct ac97_codec_driver *adrv = to_ac97_driver(dev->driver);
 	int ret;
 
-	ret = pm_runtime_get_sync(dev);
+	ret = pm_runtime_resume_and_get(dev);
 	if (ret < 0)
 		return ret;
 

commit 029028f4e90be206950c31fb2adadcbb1f0b32c0
Author: John Garry <john.garry@huawei.com>
Date:   Wed May 19 22:31:02 2021 +0800

    scsi: core: Cap scsi_host cmd_per_lun at can_queue
    
    [ Upstream commit ea2f0f77538c50739b9fb4de4700cee5535e1f77 ]
    
    The sysfs handling function sdev_store_queue_depth() enforces that the sdev
    queue depth cannot exceed shost can_queue. The initial sdev queue depth
    comes from shost cmd_per_lun. However, the LLDD may manually set
    cmd_per_lun to be larger than can_queue, which leads to an initial sdev
    queue depth greater than can_queue.
    
    Such an issue was reported in [0], which caused a hang. That has since been
    fixed in commit fc09acb7de31 ("scsi: scsi_debug: Fix cmd_per_lun, set to
    max_queue").
    
    Stop this possibly happening for other drivers by capping shost cmd_per_lun
    at shost can_queue.
    
    [0] https://lore.kernel.org/linux-scsi/YHaez6iN2HHYxYOh@T590/
    
    Link: https://lore.kernel.org/r/1621434662-173079-1-git-send-email-john.garry@huawei.com
    Reviewed-by: Ming Lei <ming.lei@redhat.com>
    Reviewed-by: Bart Van Assche <bvanassche@acm.org>
    Signed-off-by: John Garry <john.garry@huawei.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index 2c085e463243..f3194d634f7f 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -218,6 +218,9 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev,
 		goto fail;
 	}
 
+	shost->cmd_per_lun = min_t(short, shost->cmd_per_lun,
+				   shost->can_queue);
+
 	error = scsi_init_sense_cache(shost);
 	if (error)
 		goto fail;

commit 7813fa911ca35df50fe792a49d4579afb83d0fcb
Author: James Smart <jsmart2021@gmail.com>
Date:   Fri May 14 12:55:56 2021 -0700

    scsi: lpfc: Fix crash when lpfc_sli4_hba_setup() fails to initialize the SGLs
    
    [ Upstream commit 5aa615d195f1e142c662cb2253f057c9baec7531 ]
    
    The driver is encountering a crash in lpfc_free_iocb_list() while
    performing initial attachment.
    
    Code review found this to be an errant failure path that was taken, jumping
    to a tag that then referenced structures that were uninitialized.
    
    Fix the failure path.
    
    Link: https://lore.kernel.org/r/20210514195559.119853-9-jsmart2021@gmail.com
    Co-developed-by: Justin Tee <justin.tee@broadcom.com>
    Signed-off-by: Justin Tee <justin.tee@broadcom.com>
    Signed-off-by: James Smart <jsmart2021@gmail.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
index f4633c9f8183..40d6537e64dd 100644
--- a/drivers/scsi/lpfc/lpfc_sli.c
+++ b/drivers/scsi/lpfc/lpfc_sli.c
@@ -7281,7 +7281,7 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
 				"0393 Error %d during rpi post operation\n",
 				rc);
 		rc = -ENODEV;
-		goto out_destroy_queue;
+		goto out_free_iocblist;
 	}
 	lpfc_sli4_node_prep(phba);
 
@@ -7406,8 +7406,9 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
 out_unset_queue:
 	/* Unset all the queues set up in this routine when error out */
 	lpfc_sli4_queue_unset(phba);
-out_destroy_queue:
+out_free_iocblist:
 	lpfc_free_iocb_list(phba);
+out_destroy_queue:
 	lpfc_sli4_queue_destroy(phba);
 out_stop_timers:
 	lpfc_stop_hba_timers(phba);

commit ec9999dc550eb263a1a782ae31aaf7c7b59716cf
Author: James Smart <jsmart2021@gmail.com>
Date:   Fri May 14 12:55:51 2021 -0700

    scsi: lpfc: Fix "Unexpected timeout" error in direct attach topology
    
    [ Upstream commit e30d55137edef47434c40d7570276a0846fe922c ]
    
    An 'unexpected timeout' message may be seen in a point-2-point topology.
    The message occurs when a PLOGI is received before the driver is notified
    of FLOGI completion. The FLOGI completion failure causes discovery to be
    triggered for a second time. The discovery timer is restarted but no new
    discovery activity is initiated, thus the timeout message eventually
    appears.
    
    In point-2-point, when discovery has progressed before the FLOGI completion
    is processed, it is not a failure. Add code to FLOGI completion to detect
    that discovery has progressed and exit the FLOGI handling (noop'ing it).
    
    Link: https://lore.kernel.org/r/20210514195559.119853-4-jsmart2021@gmail.com
    Co-developed-by: Justin Tee <justin.tee@broadcom.com>
    Signed-off-by: Justin Tee <justin.tee@broadcom.com>
    Signed-off-by: James Smart <jsmart2021@gmail.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
index 6a4b496081e4..c4428249d3d7 100644
--- a/drivers/scsi/lpfc/lpfc_els.c
+++ b/drivers/scsi/lpfc/lpfc_els.c
@@ -1176,6 +1176,15 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
 			phba->fcf.fcf_redisc_attempted = 0; /* reset */
 			goto out;
 		}
+	} else if (vport->port_state > LPFC_FLOGI &&
+		   vport->fc_flag & FC_PT2PT) {
+		/*
+		 * In a p2p topology, it is possible that discovery has
+		 * already progressed, and this completion can be ignored.
+		 * Recheck the indicated topology.
+		 */
+		if (!sp->cmn.fPort)
+			goto out;
 	}
 
 flogifail:

commit 36164ba715d8325124789d3ce9e8bafd52856412
Author: Luiz Sampaio <sampaio.ime@gmail.com>
Date:   Wed May 19 19:30:44 2021 -0300

    w1: ds2438: fixing bug that would always get page0
    
    [ Upstream commit 1f5e7518f063728aee0679c5086b92d8ea429e11 ]
    
    The purpose of the w1_ds2438_get_page function is to get the register
    values at the page passed as the pageno parameter. However, the page0 was
    hardcoded, such that the function always returned the page0 contents. Fixed
    so that the function can retrieve any page.
    
    Signed-off-by: Luiz Sampaio <sampaio.ime@gmail.com>
    Link: https://lore.kernel.org/r/20210519223046.13798-5-sampaio.ime@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/w1/slaves/w1_ds2438.c b/drivers/w1/slaves/w1_ds2438.c
index 7c4e33dbee4d..b005dda9c697 100644
--- a/drivers/w1/slaves/w1_ds2438.c
+++ b/drivers/w1/slaves/w1_ds2438.c
@@ -64,13 +64,13 @@ static int w1_ds2438_get_page(struct w1_slave *sl, int pageno, u8 *buf)
 		if (w1_reset_select_slave(sl))
 			continue;
 		w1_buf[0] = W1_DS2438_RECALL_MEMORY;
-		w1_buf[1] = 0x00;
+		w1_buf[1] = (u8)pageno;
 		w1_write_block(sl->master, w1_buf, 2);
 
 		if (w1_reset_select_slave(sl))
 			continue;
 		w1_buf[0] = W1_DS2438_READ_SCRATCH;
-		w1_buf[1] = 0x00;
+		w1_buf[1] = (u8)pageno;
 		w1_write_block(sl->master, w1_buf, 2);
 
 		count = w1_read_block(sl->master, buf, DS2438_PAGE_SIZE + 1);

commit 1a89fdc49f8729be08e86a225598a36a9a6d5cff
Author: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Date:   Tue May 18 17:45:47 2021 +0900

    Revert "ALSA: bebob/oxfw: fix Kconfig entry for Mackie d.2 Pro"
    
    [ Upstream commit 5d6fb80a142b5994355ce675c517baba6089d199 ]
    
    This reverts commit 0edabdfe89581669609eaac5f6a8d0ae6fe95e7f.
    
    I've explained that optional FireWire card for d.2 is also built-in to
    d.2 Pro, however it's wrong. The optional card uses DM1000 ASIC and has
    'Mackie DJ Mixer' in its model name of configuration ROM. On the other
    hand, built-in FireWire card for d.2 Pro and d.4 Pro uses OXFW971 ASIC
    and has 'd.Pro' in its model name according to manuals and user
    experiences. The former card is not the card for d.2 Pro. They are similar
    in appearance but different internally.
    
    Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
    Link: https://lore.kernel.org/r/20210518084557.102681-2-o-takashi@sakamocchi.jp
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/firewire/Kconfig b/sound/firewire/Kconfig
index a2ed164d80b4..4e0e320b77d8 100644
--- a/sound/firewire/Kconfig
+++ b/sound/firewire/Kconfig
@@ -37,7 +37,7 @@ config SND_OXFW
 	   * Mackie(Loud) Onyx 1640i (former model)
 	   * Mackie(Loud) Onyx Satellite
 	   * Mackie(Loud) Tapco Link.Firewire
-	   * Mackie(Loud) d.4 pro
+	   * Mackie(Loud) d.2 pro/d.4 pro (built-in FireWire card with OXFW971 ASIC)
 	   * Mackie(Loud) U.420/U.420d
 	   * TASCAM FireOne
 	   * Stanton Controllers & Systems 1 Deck/Mixer
@@ -83,7 +83,7 @@ config SND_BEBOB
 	  * PreSonus FIREBOX/FIREPOD/FP10/Inspire1394
 	  * BridgeCo RDAudio1/Audio5
 	  * Mackie Onyx 1220/1620/1640 (FireWire I/O Card)
-	  * Mackie d.2 (FireWire Option) and d.2 Pro
+	  * Mackie d.2 (optional FireWire card with DM1000 ASIC)
 	  * Stanton FinalScratch 2 (ScratchAmp)
 	  * Tascam IF-FW/DM
 	  * Behringer XENIX UFX 1204/1604
diff --git a/sound/firewire/bebob/bebob.c b/sound/firewire/bebob/bebob.c
index 2bcfeee75853..8073360581f4 100644
--- a/sound/firewire/bebob/bebob.c
+++ b/sound/firewire/bebob/bebob.c
@@ -414,7 +414,7 @@ static const struct ieee1394_device_id bebob_id_table[] = {
 	SND_BEBOB_DEV_ENTRY(VEN_BRIDGECO, 0x00010049, &spec_normal),
 	/* Mackie, Onyx 1220/1620/1640 (Firewire I/O Card) */
 	SND_BEBOB_DEV_ENTRY(VEN_MACKIE2, 0x00010065, &spec_normal),
-	// Mackie, d.2 (Firewire option card) and d.2 Pro (the card is built-in).
+	// Mackie, d.2 (optional Firewire card with DM1000).
 	SND_BEBOB_DEV_ENTRY(VEN_MACKIE1, 0x00010067, &spec_normal),
 	/* Stanton, ScratchAmp */
 	SND_BEBOB_DEV_ENTRY(VEN_STANTON, 0x00000001, &spec_normal),
diff --git a/sound/firewire/oxfw/oxfw.c b/sound/firewire/oxfw/oxfw.c
index 3c9aa797747b..59c05c5dc1cb 100644
--- a/sound/firewire/oxfw/oxfw.c
+++ b/sound/firewire/oxfw/oxfw.c
@@ -400,7 +400,7 @@ static const struct ieee1394_device_id oxfw_id_table[] = {
 	 *  Onyx-i series (former models):	0x081216
 	 *  Mackie Onyx Satellite:		0x00200f
 	 *  Tapco LINK.firewire 4x6:		0x000460
-	 *  d.4 pro:				Unknown
+	 *  d.2 pro/d.4 pro (built-in card):	Unknown
 	 *  U.420:				Unknown
 	 *  U.420d:				Unknown
 	 */

commit 481a76d4749ee3a27f902ba213fdcbb4bb39720e
Author: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
Date:   Mon Apr 26 10:06:20 2021 -0700

    misc/libmasm/module: Fix two use after free in ibmasm_init_one
    
    [ Upstream commit 7272b591c4cb9327c43443f67b8fbae7657dd9ae ]
    
    In ibmasm_init_one, it calls ibmasm_init_remote_input_dev().
    Inside ibmasm_init_remote_input_dev, mouse_dev and keybd_dev are
    allocated by input_allocate_device(), and assigned to
    sp->remote.mouse_dev and sp->remote.keybd_dev respectively.
    
    In the err_free_devices error branch of ibmasm_init_one,
    mouse_dev and keybd_dev are freed by input_free_device(), and return
    error. Then the execution runs into error_send_message error branch
    of ibmasm_init_one, where ibmasm_free_remote_input_dev(sp) is called
    to unregister the freed sp->remote.mouse_dev and sp->remote.keybd_dev.
    
    My patch add a "error_init_remote" label to handle the error of
    ibmasm_init_remote_input_dev(), to avoid the uaf bugs.
    
    Signed-off-by: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
    Link: https://lore.kernel.org/r/20210426170620.10546-1-lyl2019@mail.ustc.edu.cn
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/misc/ibmasm/module.c b/drivers/misc/ibmasm/module.c
index e914b8c80943..9f8344169845 100644
--- a/drivers/misc/ibmasm/module.c
+++ b/drivers/misc/ibmasm/module.c
@@ -125,7 +125,7 @@ static int ibmasm_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
 	result = ibmasm_init_remote_input_dev(sp);
 	if (result) {
 		dev_err(sp->dev, "Failed to initialize remote queue\n");
-		goto error_send_message;
+		goto error_init_remote;
 	}
 
 	result = ibmasm_send_driver_vpd(sp);
@@ -145,8 +145,9 @@ static int ibmasm_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
 	return 0;
 
 error_send_message:
-	disable_sp_interrupts(sp->base_address);
 	ibmasm_free_remote_input_dev(sp);
+error_init_remote:
+	disable_sp_interrupts(sp->base_address);
 	free_irq(sp->irq, (void *)sp);
 error_request_irq:
 	iounmap(sp->base_address);

commit 4d8421902085c0c373146417088f5ee6a15ad70a
Author: Sherry Sun <sherry.sun@nxp.com>
Date:   Tue Apr 27 10:12:26 2021 +0800

    tty: serial: fsl_lpuart: fix the potential risk of division or modulo by zero
    
    [ Upstream commit fcb10ee27fb91b25b68d7745db9817ecea9f1038 ]
    
    We should be very careful about the register values that will be used
    for division or modulo operations, althrough the possibility that the
    UARTBAUD register value is zero is very low, but we had better to deal
    with the "bad data" of hardware in advance to avoid division or modulo
    by zero leading to undefined kernel behavior.
    
    Signed-off-by: Sherry Sun <sherry.sun@nxp.com>
    Link: https://lore.kernel.org/r/20210427021226.27468-1-sherry.sun@nxp.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c
index 4b9f42269477..deb9d4fa9cb0 100644
--- a/drivers/tty/serial/fsl_lpuart.c
+++ b/drivers/tty/serial/fsl_lpuart.c
@@ -1992,6 +1992,9 @@ lpuart32_console_get_options(struct lpuart_port *sport, int *baud,
 
 	bd = lpuart32_read(&sport->port, UARTBAUD);
 	bd &= UARTBAUD_SBR_MASK;
+	if (!bd)
+		return;
+
 	sbr = bd;
 	uartclk = clk_get_rate(sport->clk);
 	/*

commit b00a9aaa4be20ad6e3311fb78a485eae0899e89a
Author: Pali Rohár <pali@kernel.org>
Date:   Tue Jun 8 22:36:55 2021 +0200

    PCI: aardvark: Fix kernel panic during PIO transfer
    
    commit f18139966d072dab8e4398c95ce955a9742e04f7 upstream.
    
    Trying to start a new PIO transfer by writing value 0 in PIO_START register
    when previous transfer has not yet completed (which is indicated by value 1
    in PIO_START) causes an External Abort on CPU, which results in kernel
    panic:
    
        SError Interrupt on CPU0, code 0xbf000002 -- SError
        Kernel panic - not syncing: Asynchronous SError Interrupt
    
    To prevent kernel panic, it is required to reject a new PIO transfer when
    previous one has not finished yet.
    
    If previous PIO transfer is not finished yet, the kernel may issue a new
    PIO request only if the previous PIO transfer timed out.
    
    In the past the root cause of this issue was incorrectly identified (as it
    often happens during link retraining or after link down event) and special
    hack was implemented in Trusted Firmware to catch all SError events in EL3,
    to ignore errors with code 0xbf000002 and not forwarding any other errors
    to kernel and instead throw panic from EL3 Trusted Firmware handler.
    
    Links to discussion and patches about this issue:
    https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/commit/?id=3c7dcdac5c50
    https://lore.kernel.org/linux-pci/20190316161243.29517-1-repk@triplefau.lt/
    https://lore.kernel.org/linux-pci/971be151d24312cc533989a64bd454b4@www.loen.fr/
    https://review.trustedfirmware.org/c/TF-A/trusted-firmware-a/+/1541
    
    But the real cause was the fact that during link retraining or after link
    down event the PIO transfer may take longer time, up to the 1.44s until it
    times out. This increased probability that a new PIO transfer would be
    issued by kernel while previous one has not finished yet.
    
    After applying this change into the kernel, it is possible to revert the
    mentioned TF-A hack and SError events do not have to be caught in TF-A EL3.
    
    Link: https://lore.kernel.org/r/20210608203655.31228-1-pali@kernel.org
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Marek Behún <kabel@kernel.org>
    Cc: stable@vger.kernel.org # 7fbcb5da811b ("PCI: aardvark: Don't rely on jiffies while holding spinlock")
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index 379ed3684bc2..74aa9da85aa2 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -382,7 +382,7 @@ static int advk_pcie_wait_pio(struct advk_pcie *pcie)
 		udelay(PIO_RETRY_DELAY);
 	}
 
-	dev_err(dev, "config read/write timed out\n");
+	dev_err(dev, "PIO read/write transfer time out\n");
 	return -ETIMEDOUT;
 }
 
@@ -395,6 +395,35 @@ static bool advk_pcie_valid_device(struct advk_pcie *pcie, struct pci_bus *bus,
 	return true;
 }
 
+static bool advk_pcie_pio_is_running(struct advk_pcie *pcie)
+{
+	struct device *dev = &pcie->pdev->dev;
+
+	/*
+	 * Trying to start a new PIO transfer when previous has not completed
+	 * cause External Abort on CPU which results in kernel panic:
+	 *
+	 *     SError Interrupt on CPU0, code 0xbf000002 -- SError
+	 *     Kernel panic - not syncing: Asynchronous SError Interrupt
+	 *
+	 * Functions advk_pcie_rd_conf() and advk_pcie_wr_conf() are protected
+	 * by raw_spin_lock_irqsave() at pci_lock_config() level to prevent
+	 * concurrent calls at the same time. But because PIO transfer may take
+	 * about 1.5s when link is down or card is disconnected, it means that
+	 * advk_pcie_wait_pio() does not always have to wait for completion.
+	 *
+	 * Some versions of ARM Trusted Firmware handles this External Abort at
+	 * EL3 level and mask it to prevent kernel panic. Relevant TF-A commit:
+	 * https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/commit/?id=3c7dcdac5c50
+	 */
+	if (advk_readl(pcie, PIO_START)) {
+		dev_err(dev, "Previous PIO read/write transfer is still running\n");
+		return true;
+	}
+
+	return false;
+}
+
 static int advk_pcie_rd_conf(struct pci_bus *bus, u32 devfn,
 			     int where, int size, u32 *val)
 {
@@ -407,9 +436,10 @@ static int advk_pcie_rd_conf(struct pci_bus *bus, u32 devfn,
 		return PCIBIOS_DEVICE_NOT_FOUND;
 	}
 
-	/* Start PIO */
-	advk_writel(pcie, 0, PIO_START);
-	advk_writel(pcie, 1, PIO_ISR);
+	if (advk_pcie_pio_is_running(pcie)) {
+		*val = 0xffffffff;
+		return PCIBIOS_SET_FAILED;
+	}
 
 	/* Program the control register */
 	reg = advk_readl(pcie, PIO_CTRL);
@@ -428,7 +458,8 @@ static int advk_pcie_rd_conf(struct pci_bus *bus, u32 devfn,
 	/* Program the data strobe */
 	advk_writel(pcie, 0xf, PIO_WR_DATA_STRB);
 
-	/* Start the transfer */
+	/* Clear PIO DONE ISR and start the transfer */
+	advk_writel(pcie, 1, PIO_ISR);
 	advk_writel(pcie, 1, PIO_START);
 
 	ret = advk_pcie_wait_pio(pcie);
@@ -462,9 +493,8 @@ static int advk_pcie_wr_conf(struct pci_bus *bus, u32 devfn,
 	if (where % size)
 		return PCIBIOS_SET_FAILED;
 
-	/* Start PIO */
-	advk_writel(pcie, 0, PIO_START);
-	advk_writel(pcie, 1, PIO_ISR);
+	if (advk_pcie_pio_is_running(pcie))
+		return PCIBIOS_SET_FAILED;
 
 	/* Program the control register */
 	reg = advk_readl(pcie, PIO_CTRL);
@@ -491,7 +521,8 @@ static int advk_pcie_wr_conf(struct pci_bus *bus, u32 devfn,
 	/* Program the data strobe */
 	advk_writel(pcie, data_strobe, PIO_WR_DATA_STRB);
 
-	/* Start the transfer */
+	/* Clear PIO DONE ISR and start the transfer */
+	advk_writel(pcie, 1, PIO_ISR);
 	advk_writel(pcie, 1, PIO_START);
 
 	ret = advk_pcie_wait_pio(pcie);

commit 6571c80330ac43f2487403f04efcdbbcf796cf7b
Author: Remi Pommarel <repk@triplefau.lt>
Date:   Fri Sep 27 10:55:02 2019 +0200

    PCI: aardvark: Don't rely on jiffies while holding spinlock
    
    commit 7fbcb5da811be7d47468417c7795405058abb3da upstream.
    
    advk_pcie_wait_pio() can be called while holding a spinlock (from
    pci_bus_read_config_dword()), then depends on jiffies in order to
    timeout while polling on PIO state registers. In the case the PIO
    transaction failed, the timeout will never happen and will also cause
    the cpu to stall.
    
    This decrements a variable and wait instead of using jiffies.
    
    Signed-off-by: Remi Pommarel <repk@triplefau.lt>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Reviewed-by: Andrew Murray <andrew.murray@arm.com>
    Acked-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index 4490e7072e95..379ed3684bc2 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -166,7 +166,8 @@
 	(PCIE_CONF_BUS(bus) | PCIE_CONF_DEV(PCI_SLOT(devfn))	| \
 	 PCIE_CONF_FUNC(PCI_FUNC(devfn)) | PCIE_CONF_REG(where))
 
-#define PIO_TIMEOUT_MS			1
+#define PIO_RETRY_CNT			500
+#define PIO_RETRY_DELAY			2 /* 2 us*/
 
 #define LINK_WAIT_MAX_RETRIES		10
 #define LINK_WAIT_USLEEP_MIN		90000
@@ -369,17 +370,16 @@ static void advk_pcie_check_pio_status(struct advk_pcie *pcie)
 static int advk_pcie_wait_pio(struct advk_pcie *pcie)
 {
 	struct device *dev = &pcie->pdev->dev;
-	unsigned long timeout;
+	int i;
 
-	timeout = jiffies + msecs_to_jiffies(PIO_TIMEOUT_MS);
-
-	while (time_before(jiffies, timeout)) {
+	for (i = 0; i < PIO_RETRY_CNT; i++) {
 		u32 start, isr;
 
 		start = advk_readl(pcie, PIO_START);
 		isr = advk_readl(pcie, PIO_ISR);
 		if (!start && isr)
 			return 0;
+		udelay(PIO_RETRY_DELAY);
 	}
 
 	dev_err(dev, "config read/write timed out\n");

commit 1834fbbd664ca9aa51258c617bc8aa0206cd28b6
Author: Steven Rostedt (VMware) <rostedt@goodmis.org>
Date:   Thu Jul 15 00:02:06 2021 -0400

    tracing: Do not reference char * as a string in histograms
    
    commit 704adfb5a9978462cd861f170201ae2b5e3d3a80 upstream.
    
    The histogram logic was allowing events with char * pointers to be used as
    normal strings. But it was easy to crash the kernel with:
    
     # echo 'hist:keys=filename' > events/syscalls/sys_enter_openat/trigger
    
    And open some files, and boom!
    
     BUG: unable to handle page fault for address: 00007f2ced0c3280
     #PF: supervisor read access in kernel mode
     #PF: error_code(0x0000) - not-present page
     PGD 1173fa067 P4D 1173fa067 PUD 1171b6067 PMD 1171dd067 PTE 0
     Oops: 0000 [#1] PREEMPT SMP
     CPU: 6 PID: 1810 Comm: cat Not tainted 5.13.0-rc5-test+ #61
     Hardware name: Hewlett-Packard HP Compaq Pro 6300 SFF/339A, BIOS K01
    v03.03 07/14/2016
     RIP: 0010:strlen+0x0/0x20
     Code: f6 82 80 2a 0b a9 20 74 11 0f b6 50 01 48 83 c0 01 f6 82 80 2a 0b
    a9 20 75 ef c3 66 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 <80> 3f 00 74
    10 48 89 f8 48 83 c0 01 80 38 00 75 f7 48 29 f8 c3
    
     RSP: 0018:ffffbdbf81567b50 EFLAGS: 00010246
     RAX: 0000000000000003 RBX: ffff93815cdb3800 RCX: ffff9382401a22d0
     RDX: 0000000000000100 RSI: 0000000000000000 RDI: 00007f2ced0c3280
     RBP: 0000000000000100 R08: ffff9382409ff074 R09: ffffbdbf81567c98
     R10: ffff9382409ff074 R11: 0000000000000000 R12: ffff9382409ff074
     R13: 0000000000000001 R14: ffff93815a744f00 R15: 00007f2ced0c3280
     FS:  00007f2ced0f8580(0000) GS:ffff93825a800000(0000)
    knlGS:0000000000000000
     CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
     CR2: 00007f2ced0c3280 CR3: 0000000107069005 CR4: 00000000001706e0
     Call Trace:
      event_hist_trigger+0x463/0x5f0
      ? find_held_lock+0x32/0x90
      ? sched_clock_cpu+0xe/0xd0
      ? lock_release+0x155/0x440
      ? kernel_init_free_pages+0x6d/0x90
      ? preempt_count_sub+0x9b/0xd0
      ? kernel_init_free_pages+0x6d/0x90
      ? get_page_from_freelist+0x12c4/0x1680
      ? __rb_reserve_next+0xe5/0x460
      ? ring_buffer_lock_reserve+0x12a/0x3f0
      event_triggers_call+0x52/0xe0
      ftrace_syscall_enter+0x264/0x2c0
      syscall_trace_enter.constprop.0+0x1ee/0x210
      do_syscall_64+0x1c/0x80
      entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Where it triggered a fault on strlen(key) where key was the filename.
    
    The reason is that filename is a char * to user space, and the histogram
    code just blindly dereferenced it, with obvious bad results.
    
    I originally tried to use strncpy_from_user/kernel_nofault() but found
    that there's other places that its dereferenced and not worth the effort.
    
    Just do not allow "char *" to act like strings.
    
    Link: https://lkml.kernel.org/r/20210715000206.025df9d2@rorschach.local.home
    
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: Tzvetomir Stoyanov <tz.stoyanov@gmail.com>
    Cc: stable@vger.kernel.org
    Acked-by: Namhyung Kim <namhyung@kernel.org>
    Acked-by: Tom Zanussi <zanussi@kernel.org>
    Fixes: 79e577cbce4c4 ("tracing: Support string type key properly")
    Fixes: 5967bd5c4239 ("tracing: Let filter_assign_type() detect FILTER_PTR_STRING")
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
index 7a9d45a88afe..28e4ff45cb4c 100644
--- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c
@@ -2342,7 +2342,9 @@ static struct hist_field *create_hist_field(struct hist_trigger_data *hist_data,
 	if (WARN_ON_ONCE(!field))
 		goto out;
 
-	if (is_string_field(field)) {
+	/* Pointers to strings are just pointers and dangerous to dereference */
+	if (is_string_field(field) &&
+	    (field->filter_type != FILTER_PTR_STRING)) {
 		flags |= HIST_FIELD_FL_STRING;
 
 		hist_field->size = MAX_FILTER_STR_VAL;
@@ -4742,8 +4744,6 @@ static inline void add_to_key(char *compound_key, void *key,
 		field = key_field->field;
 		if (field->filter_type == FILTER_DYN_STRING)
 			size = *(u32 *)(rec + field->offset) >> 16;
-		else if (field->filter_type == FILTER_PTR_STRING)
-			size = strlen(key);
 		else if (field->filter_type == FILTER_STATIC_STRING)
 			size = field->size;
 

commit e1bd3fac2baa3d5c04375980c1d5263a3335af92
Author: Tyrel Datwyler <tyreld@linux.ibm.com>
Date:   Thu Jul 1 13:56:59 2021 -0600

    scsi: core: Fix bad pointer dereference when ehandler kthread is invalid
    
    commit 93aa71ad7379900e61c8adff6a710a4c18c7c99b upstream.
    
    Commit 66a834d09293 ("scsi: core: Fix error handling of scsi_host_alloc()")
    changed the allocation logic to call put_device() to perform host cleanup
    with the assumption that IDA removal and stopping the kthread would
    properly be performed in scsi_host_dev_release(). However, in the unlikely
    case that the error handler thread fails to spawn, shost->ehandler is set
    to ERR_PTR(-ENOMEM).
    
    The error handler cleanup code in scsi_host_dev_release() will call
    kthread_stop() if shost->ehandler != NULL which will always be the case
    whether the kthread was successfully spawned or not. In the case that it
    failed to spawn this has the nasty side effect of trying to dereference an
    invalid pointer when kthread_stop() is called. The following splat provides
    an example of this behavior in the wild:
    
    scsi host11: error handler thread failed to spawn, error = -4
    Kernel attempted to read user page (10c) - exploit attempt? (uid: 0)
    BUG: Kernel NULL pointer dereference on read at 0x0000010c
    Faulting instruction address: 0xc00000000818e9a8
    Oops: Kernel access of bad area, sig: 11 [#1]
    LE PAGE_SIZE=64K MMU=Hash SMP NR_CPUS=2048 NUMA pSeries
    Modules linked in: ibmvscsi(+) scsi_transport_srp dm_multipath dm_mirror dm_region
     hash dm_log dm_mod fuse overlay squashfs loop
    CPU: 12 PID: 274 Comm: systemd-udevd Not tainted 5.13.0-rc7 #1
    NIP:  c00000000818e9a8 LR: c0000000089846e8 CTR: 0000000000007ee8
    REGS: c000000037d12ea0 TRAP: 0300   Not tainted  (5.13.0-rc7)
    MSR:  800000000280b033 &lt;SF,VEC,VSX,EE,FP,ME,IR,DR,RI,LE&gt;  CR: 28228228
    XER: 20040001
    CFAR: c0000000089846e4 DAR: 000000000000010c DSISR: 40000000 IRQMASK: 0
    GPR00: c0000000089846e8 c000000037d13140 c000000009cc1100 fffffffffffffffc
    GPR04: 0000000000000001 0000000000000000 0000000000000000 c000000037dc0000
    GPR08: 0000000000000000 c000000037dc0000 0000000000000001 00000000fffff7ff
    GPR12: 0000000000008000 c00000000a049000 c000000037d13d00 000000011134d5a0
    GPR16: 0000000000001740 c0080000190d0000 c0080000190d1740 c000000009129288
    GPR20: c000000037d13bc0 0000000000000001 c000000037d13bc0 c0080000190b7898
    GPR24: c0080000190b7708 0000000000000000 c000000033bb2c48 0000000000000000
    GPR28: c000000046b28280 0000000000000000 000000000000010c fffffffffffffffc
    NIP [c00000000818e9a8] kthread_stop+0x38/0x230
    LR [c0000000089846e8] scsi_host_dev_release+0x98/0x160
    Call Trace:
    [c000000033bb2c48] 0xc000000033bb2c48 (unreliable)
    [c0000000089846e8] scsi_host_dev_release+0x98/0x160
    [c00000000891e960] device_release+0x60/0x100
    [c0000000087e55c4] kobject_release+0x84/0x210
    [c00000000891ec78] put_device+0x28/0x40
    [c000000008984ea4] scsi_host_alloc+0x314/0x430
    [c0080000190b38bc] ibmvscsi_probe+0x54/0xad0 [ibmvscsi]
    [c000000008110104] vio_bus_probe+0xa4/0x4b0
    [c00000000892a860] really_probe+0x140/0x680
    [c00000000892aefc] driver_probe_device+0x15c/0x200
    [c00000000892b63c] device_driver_attach+0xcc/0xe0
    [c00000000892b740] __driver_attach+0xf0/0x200
    [c000000008926f28] bus_for_each_dev+0xa8/0x130
    [c000000008929ce4] driver_attach+0x34/0x50
    [c000000008928fc0] bus_add_driver+0x1b0/0x300
    [c00000000892c798] driver_register+0x98/0x1a0
    [c00000000810eb60] __vio_register_driver+0x80/0xe0
    [c0080000190b4a30] ibmvscsi_module_init+0x9c/0xdc [ibmvscsi]
    [c0000000080121d0] do_one_initcall+0x60/0x2d0
    [c000000008261abc] do_init_module+0x7c/0x320
    [c000000008265700] load_module+0x2350/0x25b0
    [c000000008265cb4] __do_sys_finit_module+0xd4/0x160
    [c000000008031110] system_call_exception+0x150/0x2d0
    [c00000000800d35c] system_call_common+0xec/0x278
    
    Fix this be nulling shost->ehandler when the kthread fails to spawn.
    
    Link: https://lore.kernel.org/r/20210701195659.3185475-1-tyreld@linux.ibm.com
    Fixes: 66a834d09293 ("scsi: core: Fix error handling of scsi_host_alloc()")
    Cc: stable@vger.kernel.org
    Reviewed-by: Ming Lei <ming.lei@redhat.com>
    Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index fa03be813f2c..2c085e463243 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -497,6 +497,7 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
 		shost_printk(KERN_WARNING, shost,
 			"error handler thread failed to spawn, error = %ld\n",
 			PTR_ERR(shost->ehandler));
+		shost->ehandler = NULL;
 		goto fail;
 	}
 

commit 3e6d27d667571831fdb88cfc09b277951f06aa37
Author: Lai Jiangshan <laijs@linux.alibaba.com>
Date:   Tue Jun 29 01:26:32 2021 +0800

    KVM: X86: Disable hardware breakpoints unconditionally before kvm_x86->run()
    
    commit f85d40160691881a17a397c448d799dfc90987ba upstream.
    
    When the host is using debug registers but the guest is not using them
    nor is the guest in guest-debug state, the kvm code does not reset
    the host debug registers before kvm_x86->run().  Rather, it relies on
    the hardware vmentry instruction to automatically reset the dr7 registers
    which ensures that the host breakpoints do not affect the guest.
    
    This however violates the non-instrumentable nature around VM entry
    and exit; for example, when a host breakpoint is set on vcpu->arch.cr2,
    
    Another issue is consistency.  When the guest debug registers are active,
    the host breakpoints are reset before kvm_x86->run(). But when the
    guest debug registers are inactive, the host breakpoints are delayed to
    be disabled.  The host tracing tools may see different results depending
    on what the guest is doing.
    
    To fix the problems, we clear %db7 unconditionally before kvm_x86->run()
    if the host has set any breakpoints, no matter if the guest is using
    them or not.
    
    Signed-off-by: Lai Jiangshan <laijs@linux.alibaba.com>
    Message-Id: <20210628172632.81029-1-jiangshanlai@gmail.com>
    Cc: stable@vger.kernel.org
    [Only clear %db7 instead of reloading all debug registers. - Paolo]
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 435e74e1f2e5..43fb4e296d8d 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -7772,6 +7772,8 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
 		set_debugreg(vcpu->arch.eff_db[3], 3);
 		set_debugreg(vcpu->arch.dr6, 6);
 		vcpu->arch.switch_db_regs &= ~KVM_DEBUGREG_RELOAD;
+	} else if (unlikely(hw_breakpoint_active())) {
+		set_debugreg(0, 7);
 	}
 
 	kvm_x86_ops->run(vcpu);

commit af9045cf57680ea38af578d333e6fc466e656996
Author: Sean Christopherson <seanjc@google.com>
Date:   Wed Jun 23 16:05:46 2021 -0700

    KVM: x86: Use guest MAXPHYADDR from CPUID.0x8000_0008 iff TDP is enabled
    
    commit 4bf48e3c0aafd32b960d341c4925b48f416f14a5 upstream.
    
    Ignore the guest MAXPHYADDR reported by CPUID.0x8000_0008 if TDP, i.e.
    NPT, is disabled, and instead use the host's MAXPHYADDR.  Per AMD'S APM:
    
      Maximum guest physical address size in bits. This number applies only
      to guests using nested paging. When this field is zero, refer to the
      PhysAddrSize field for the maximum guest physical address size.
    
    Fixes: 24c82e576b78 ("KVM: Sanitize cpuid")
    Cc: stable@vger.kernel.org
    Signed-off-by: Sean Christopherson <seanjc@google.com>
    Message-Id: <20210623230552.4027702-2-seanjc@google.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index 1fe9ccabc082..097eef712cdc 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -666,8 +666,14 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
 		unsigned virt_as = max((entry->eax >> 8) & 0xff, 48U);
 		unsigned phys_as = entry->eax & 0xff;
 
-		if (!g_phys_as)
+		/*
+		 * Use bare metal's MAXPHADDR if the CPU doesn't report guest
+		 * MAXPHYADDR separately, or if TDP (NPT) is disabled, as the
+		 * guest version "applies only to guests using nested paging".
+		 */
+		if (!g_phys_as || !tdp_enabled)
 			g_phys_as = phys_as;
+
 		entry->eax = g_phys_as | (virt_as << 8);
 		entry->edx = 0;
 		/*

commit cbd87ba6a13891acf6180783f8234a8b7a3e3d4d
Author: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Date:   Mon Apr 12 22:45:50 2021 +0900

    smackfs: restrict bytes count in smk_set_cipso()
    
    commit 49ec114a6e62d8d320037ce71c1aaf9650b3cafd upstream.
    
    Oops, I failed to update subject line.
    
    From 07571157c91b98ce1a4aa70967531e64b78e8346 Mon Sep 17 00:00:00 2001
    From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Date: Mon, 12 Apr 2021 22:25:06 +0900
    Subject: smackfs: restrict bytes count in smk_set_cipso()
    
    Commit 7ef4c19d245f3dc2 ("smackfs: restrict bytes count in smackfs write
    functions") missed that count > SMK_CIPSOMAX check applies to only
    format == SMK_FIXED24_FMT case.
    
    Reported-by: syzbot <syzbot+77c53db50c9fff774e8e@syzkaller.appspotmail.com>
    Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c
index 4f8c1a272df0..009e83ee2d00 100644
--- a/security/smack/smackfs.c
+++ b/security/smack/smackfs.c
@@ -883,6 +883,8 @@ static ssize_t smk_set_cipso(struct file *file, const char __user *buf,
 	if (format == SMK_FIXED24_FMT &&
 	    (count < SMK_CIPSOMIN || count > SMK_CIPSOMAX))
 		return -EINVAL;
+	if (count > PAGE_SIZE)
+		return -EINVAL;
 
 	data = memdup_user_nul(buf, count);
 	if (IS_ERR(data))

commit aff8d95b69051d0cf4acc3d91f22299fdbb9dfb3
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Sun Jun 6 17:24:05 2021 +0300

    jfs: fix GPF in diFree
    
    commit 9d574f985fe33efd6911f4d752de6f485a1ea732 upstream.
    
    Avoid passing inode with
    JFS_SBI(inode->i_sb)->ipimap == NULL to
    diFree()[1]. GFP will appear:
    
            struct inode *ipimap = JFS_SBI(ip->i_sb)->ipimap;
            struct inomap *imap = JFS_IP(ipimap)->i_imap;
    
    JFS_IP() will return invalid pointer when ipimap == NULL
    
    Call Trace:
     diFree+0x13d/0x2dc0 fs/jfs/jfs_imap.c:853 [1]
     jfs_evict_inode+0x2c9/0x370 fs/jfs/inode.c:154
     evict+0x2ed/0x750 fs/inode.c:578
     iput_final fs/inode.c:1654 [inline]
     iput.part.0+0x3fe/0x820 fs/inode.c:1680
     iput+0x58/0x70 fs/inode.c:1670
    
    Reported-and-tested-by: syzbot+0a89a7b56db04c21a656@syzkaller.appspotmail.com
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c
index 054cc761b426..87b41edc800d 100644
--- a/fs/jfs/inode.c
+++ b/fs/jfs/inode.c
@@ -161,7 +161,8 @@ void jfs_evict_inode(struct inode *inode)
 			if (test_cflag(COMMIT_Freewmap, inode))
 				jfs_free_zero_link(inode);
 
-			diFree(inode);
+			if (JFS_SBI(inode->i_sb)->ipimap)
+				diFree(inode);
 
 			/*
 			 * Free the inode from the quota allocation.

commit c592ce0bced05b54c088da30dd0d50b6598eb86f
Author: Zou Wei <zou_wei@huawei.com>
Date:   Tue Jun 8 14:34:08 2021 +0800

    pinctrl: mcp23s08: Fix missing unlock on error in mcp23s08_irq()
    
    commit 884af72c90016cfccd5717439c86b48702cbf184 upstream.
    
    Add the missing unlock before return from function mcp23s08_irq()
    in the error handling case.
    
    v1-->v2:
       remove the "return IRQ_HANDLED" line
    
    Fixes: 897120d41e7a ("pinctrl: mcp23s08: fix race condition in irq handler")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zou Wei <zou_wei@huawei.com>
    Link: https://lore.kernel.org/r/1623134048-56051-1-git-send-email-zou_wei@huawei.com
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pinctrl/pinctrl-mcp23s08.c b/drivers/pinctrl/pinctrl-mcp23s08.c
index f22999129269..76d8a6099c7b 100644
--- a/drivers/pinctrl/pinctrl-mcp23s08.c
+++ b/drivers/pinctrl/pinctrl-mcp23s08.c
@@ -460,7 +460,7 @@ static irqreturn_t mcp23s08_irq(int irq, void *data)
 
 	if (intf == 0) {
 		/* There is no interrupt pending */
-		return IRQ_HANDLED;
+		goto unlock;
 	}
 
 	if (mcp_read(mcp, MCP_INTCAP, &intcap))

commit 324626f594fdd1d94c0a7919e2808866477c11b8
Author: Benjamin Drung <bdrung@posteo.de>
Date:   Sat Jun 5 22:15:36 2021 +0200

    media: uvcvideo: Fix pixel format change for Elgato Cam Link 4K
    
    commit 4c6e0976295add7f0ed94d276c04a3d6f1ea8f83 upstream.
    
    The Elgato Cam Link 4K HDMI video capture card reports to support three
    different pixel formats, where the first format depends on the connected
    HDMI device.
    
    ```
    $ v4l2-ctl -d /dev/video0 --list-formats-ext
    ioctl: VIDIOC_ENUM_FMT
            Type: Video Capture
    
            [0]: 'NV12' (Y/CbCr 4:2:0)
                    Size: Discrete 3840x2160
                            Interval: Discrete 0.033s (29.970 fps)
            [1]: 'NV12' (Y/CbCr 4:2:0)
                    Size: Discrete 3840x2160
                            Interval: Discrete 0.033s (29.970 fps)
            [2]: 'YU12' (Planar YUV 4:2:0)
                    Size: Discrete 3840x2160
                            Interval: Discrete 0.033s (29.970 fps)
    ```
    
    Changing the pixel format to anything besides the first pixel format
    does not work:
    
    ```
    $ v4l2-ctl -d /dev/video0 --try-fmt-video pixelformat=YU12
    Format Video Capture:
            Width/Height      : 3840/2160
            Pixel Format      : 'NV12' (Y/CbCr 4:2:0)
            Field             : None
            Bytes per Line    : 3840
            Size Image        : 12441600
            Colorspace        : sRGB
            Transfer Function : Rec. 709
            YCbCr/HSV Encoding: Rec. 709
            Quantization      : Default (maps to Limited Range)
            Flags             :
    ```
    
    User space applications like VLC might show an error message on the
    terminal in that case:
    
    ```
    libv4l2: error set_fmt gave us a different result than try_fmt!
    ```
    
    Depending on the error handling of the user space applications, they
    might display a distorted video, because they use the wrong pixel format
    for decoding the stream.
    
    The Elgato Cam Link 4K responds to the USB video probe
    VS_PROBE_CONTROL/VS_COMMIT_CONTROL with a malformed data structure: The
    second byte contains bFormatIndex (instead of being the second byte of
    bmHint). The first byte is always zero. The third byte is always 1.
    
    The firmware bug was reported to Elgato on 2020-12-01 and it was
    forwarded by the support team to the developers as feature request.
    There is no firmware update available since then. The latest firmware
    for Elgato Cam Link 4K as of 2021-03-23 has MCU 20.02.19 and FPGA 67.
    
    Therefore correct the malformed data structure for this device. The
    change was successfully tested with VLC, OBS, and Chromium using
    different pixel formats (YUYV, NV12, YU12), resolutions (3840x2160,
    1920x1080), and frame rates (29.970 and 59.940 fps).
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Benjamin Drung <bdrung@posteo.de>
    Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c
index ffffb66d51a0..56b058d60a0d 100644
--- a/drivers/media/usb/uvc/uvc_video.c
+++ b/drivers/media/usb/uvc/uvc_video.c
@@ -129,10 +129,37 @@ int uvc_query_ctrl(struct uvc_device *dev, u8 query, u8 unit,
 static void uvc_fixup_video_ctrl(struct uvc_streaming *stream,
 	struct uvc_streaming_control *ctrl)
 {
+	static const struct usb_device_id elgato_cam_link_4k = {
+		USB_DEVICE(0x0fd9, 0x0066)
+	};
 	struct uvc_format *format = NULL;
 	struct uvc_frame *frame = NULL;
 	unsigned int i;
 
+	/*
+	 * The response of the Elgato Cam Link 4K is incorrect: The second byte
+	 * contains bFormatIndex (instead of being the second byte of bmHint).
+	 * The first byte is always zero. The third byte is always 1.
+	 *
+	 * The UVC 1.5 class specification defines the first five bits in the
+	 * bmHint bitfield. The remaining bits are reserved and should be zero.
+	 * Therefore a valid bmHint will be less than 32.
+	 *
+	 * Latest Elgato Cam Link 4K firmware as of 2021-03-23 needs this fix.
+	 * MCU: 20.02.19, FPGA: 67
+	 */
+	if (usb_match_one_id(stream->dev->intf, &elgato_cam_link_4k) &&
+	    ctrl->bmHint > 255) {
+		u8 corrected_format_index = ctrl->bmHint >> 8;
+
+		/* uvc_dbg(stream->dev, VIDEO,
+			"Correct USB video probe response from {bmHint: 0x%04x, bFormatIndex: %u} to {bmHint: 0x%04x, bFormatIndex: %u}\n",
+			ctrl->bmHint, ctrl->bFormatIndex,
+			1, corrected_format_index); */
+		ctrl->bmHint = 1;
+		ctrl->bFormatIndex = corrected_format_index;
+	}
+
 	for (i = 0; i < stream->nformats; ++i) {
 		if (stream->format[i].index == ctrl->bFormatIndex) {
 			format = &stream->format[i];

commit 6a181ec5fcf6cdcff54cd1e3013d6394c6d888b7
Author: Johan Hovold <johan@kernel.org>
Date:   Mon May 24 13:09:19 2021 +0200

    media: gspca/sunplus: fix zero-length control requests
    
    commit b4bb4d425b7b02424afea2dfdcd77b3b4794175e upstream.
    
    The direction of the pipe argument must match the request-type direction
    bit or control requests may fail depending on the host-controller-driver
    implementation.
    
    Control transfers without a data stage are treated as OUT requests by
    the USB stack and should be using usb_sndctrlpipe(). Failing to do so
    will now trigger a warning.
    
    Fix the single zero-length control request which was using the
    read-register helper, and update the helper so that zero-length reads
    fail with an error message instead.
    
    Fixes: 6a7eba24e4f0 ("V4L/DVB (8157): gspca: all subdrivers")
    Cc: stable@vger.kernel.org      # 2.6.27
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/media/usb/gspca/sunplus.c b/drivers/media/usb/gspca/sunplus.c
index 26eae69a2562..15e9d0de4208 100644
--- a/drivers/media/usb/gspca/sunplus.c
+++ b/drivers/media/usb/gspca/sunplus.c
@@ -251,6 +251,10 @@ static void reg_r(struct gspca_dev *gspca_dev,
 		gspca_err(gspca_dev, "reg_r: buffer overflow\n");
 		return;
 	}
+	if (len == 0) {
+		gspca_err(gspca_dev, "reg_r: zero-length read\n");
+		return;
+	}
 	if (gspca_dev->usb_err < 0)
 		return;
 	ret = usb_control_msg(gspca_dev->dev,
@@ -259,7 +263,7 @@ static void reg_r(struct gspca_dev *gspca_dev,
 			USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 			0,		/* value */
 			index,
-			len ? gspca_dev->usb_buf : NULL, len,
+			gspca_dev->usb_buf, len,
 			500);
 	if (ret < 0) {
 		pr_err("reg_r err %d\n", ret);
@@ -736,7 +740,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
 		case MegaImageVI:
 			reg_w_riv(gspca_dev, 0xf0, 0, 0);
 			spca504B_WaitCmdStatus(gspca_dev);
-			reg_r(gspca_dev, 0xf0, 4, 0);
+			reg_w_riv(gspca_dev, 0xf0, 4, 0);
 			spca504B_WaitCmdStatus(gspca_dev);
 			break;
 		default:

commit 4ddc5afe922790d3c4a156abefb235e08b5f4393
Author: Johan Hovold <johan@kernel.org>
Date:   Fri May 21 15:28:39 2021 +0200

    media: gspca/sq905: fix control-request direction
    
    commit 53ae298fde7adcc4b1432bce2dbdf8dac54dfa72 upstream.
    
    The direction of the pipe argument must match the request-type direction
    bit or control requests may fail depending on the host-controller-driver
    implementation.
    
    Fix the USB_REQ_SYNCH_FRAME request which erroneously used
    usb_sndctrlpipe().
    
    Fixes: 27d35fc3fb06 ("V4L/DVB (10639): gspca - sq905: New subdriver.")
    Cc: stable@vger.kernel.org      # 2.6.30
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/media/usb/gspca/sq905.c b/drivers/media/usb/gspca/sq905.c
index 13676af42cfc..dc3caf1b36e7 100644
--- a/drivers/media/usb/gspca/sq905.c
+++ b/drivers/media/usb/gspca/sq905.c
@@ -125,7 +125,7 @@ static int sq905_command(struct gspca_dev *gspca_dev, u16 index)
 	}
 
 	ret = usb_control_msg(gspca_dev->dev,
-			      usb_sndctrlpipe(gspca_dev->dev, 0),
+			      usb_rcvctrlpipe(gspca_dev->dev, 0),
 			      USB_REQ_SYNCH_FRAME,                /* request */
 			      USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 			      SQ905_PING, 0, gspca_dev->usb_buf, 1,

commit 021c294dff030f3ba38eb81e400ba123db32ecbc
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Mon May 17 21:18:14 2021 +0200

    media: zr364xx: fix memory leak in zr364xx_start_readpipe
    
    commit 0a045eac8d0427b64577a24d74bb8347c905ac65 upstream.
    
    syzbot reported memory leak in zr364xx driver.
    The problem was in non-freed urb in case of
    usb_submit_urb() fail.
    
    backtrace:
      [<ffffffff82baedf6>] kmalloc include/linux/slab.h:561 [inline]
      [<ffffffff82baedf6>] usb_alloc_urb+0x66/0xe0 drivers/usb/core/urb.c:74
      [<ffffffff82f7cce8>] zr364xx_start_readpipe+0x78/0x130 drivers/media/usb/zr364xx/zr364xx.c:1022
      [<ffffffff84251dfc>] zr364xx_board_init drivers/media/usb/zr364xx/zr364xx.c:1383 [inline]
      [<ffffffff84251dfc>] zr364xx_probe+0x6a3/0x851 drivers/media/usb/zr364xx/zr364xx.c:1516
      [<ffffffff82bb6507>] usb_probe_interface+0x177/0x370 drivers/usb/core/driver.c:396
      [<ffffffff826018a9>] really_probe+0x159/0x500 drivers/base/dd.c:576
    
    Fixes: ccbf035ae5de ("V4L/DVB (12278): zr364xx: implement V4L2_CAP_STREAMING")
    Cc: stable@vger.kernel.org
    Reported-by: syzbot+af4fa391ef18efdd5f69@syzkaller.appspotmail.com
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/media/usb/zr364xx/zr364xx.c b/drivers/media/usb/zr364xx/zr364xx.c
index 501030bb2e7d..f92d7688b07a 100644
--- a/drivers/media/usb/zr364xx/zr364xx.c
+++ b/drivers/media/usb/zr364xx/zr364xx.c
@@ -1058,6 +1058,7 @@ static int zr364xx_start_readpipe(struct zr364xx_camera *cam)
 	DBG("submitting URB %p\n", pipe_info->stream_urb);
 	retval = usb_submit_urb(pipe_info->stream_urb, GFP_KERNEL);
 	if (retval) {
+		usb_free_urb(pipe_info->stream_urb);
 		printk(KERN_ERR KBUILD_MODNAME ": start read pipe failed\n");
 		return retval;
 	}

commit 17dc6ca47864362a5c7be163024aae112a7e4913
Author: Johan Hovold <johan@kernel.org>
Date:   Fri May 21 15:28:38 2021 +0200

    media: dtv5100: fix control-request directions
    
    commit 8c8b9a9be2afa8bd6a72ad1130532baab9fab89d upstream.
    
    The direction of the pipe argument must match the request-type direction
    bit or control requests may fail depending on the host-controller-driver
    implementation.
    
    Fix the control requests which erroneously used usb_rcvctrlpipe().
    
    Fixes: 8466028be792 ("V4L/DVB (8734): Initial support for AME DTV-5100 USB2.0 DVB-T")
    Cc: stable@vger.kernel.org      # 2.6.28
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/media/usb/dvb-usb/dtv5100.c b/drivers/media/usb/dvb-usb/dtv5100.c
index 2fa2abd3e726..07fd0bbf9b80 100644
--- a/drivers/media/usb/dvb-usb/dtv5100.c
+++ b/drivers/media/usb/dvb-usb/dtv5100.c
@@ -35,6 +35,7 @@ static int dtv5100_i2c_msg(struct dvb_usb_device *d, u8 addr,
 			   u8 *wbuf, u16 wlen, u8 *rbuf, u16 rlen)
 {
 	struct dtv5100_state *st = d->priv;
+	unsigned int pipe;
 	u8 request;
 	u8 type;
 	u16 value;
@@ -43,6 +44,7 @@ static int dtv5100_i2c_msg(struct dvb_usb_device *d, u8 addr,
 	switch (wlen) {
 	case 1:
 		/* write { reg }, read { value } */
+		pipe = usb_rcvctrlpipe(d->udev, 0);
 		request = (addr == DTV5100_DEMOD_ADDR ? DTV5100_DEMOD_READ :
 							DTV5100_TUNER_READ);
 		type = USB_TYPE_VENDOR | USB_DIR_IN;
@@ -50,6 +52,7 @@ static int dtv5100_i2c_msg(struct dvb_usb_device *d, u8 addr,
 		break;
 	case 2:
 		/* write { reg, value } */
+		pipe = usb_sndctrlpipe(d->udev, 0);
 		request = (addr == DTV5100_DEMOD_ADDR ? DTV5100_DEMOD_WRITE :
 							DTV5100_TUNER_WRITE);
 		type = USB_TYPE_VENDOR | USB_DIR_OUT;
@@ -63,7 +66,7 @@ static int dtv5100_i2c_msg(struct dvb_usb_device *d, u8 addr,
 
 	memcpy(st->data, rbuf, rlen);
 	msleep(1); /* avoid I2C errors */
-	return usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), request,
+	return usb_control_msg(d->udev, pipe, request,
 			       type, value, index, st->data, rlen,
 			       DTV5100_USB_TIMEOUT);
 }
@@ -150,7 +153,7 @@ static int dtv5100_probe(struct usb_interface *intf,
 
 	/* initialize non qt1010/zl10353 part? */
 	for (i = 0; dtv5100_init[i].request; i++) {
-		ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
+		ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
 				      dtv5100_init[i].request,
 				      USB_TYPE_VENDOR | USB_DIR_OUT,
 				      dtv5100_init[i].value,

commit 79666b99401652b696b64faecc8dc78b0abe36c4
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Mon Jun 14 12:34:09 2021 +0200

    media: subdev: disallow ioctl for saa6588/davinci
    
    commit 0a7790be182d32b9b332a37cb4206e24fe94b728 upstream.
    
    The saa6588_ioctl() function expects to get called from other kernel
    functions with a 'saa6588_command' pointer, but I found nothing stops it
    from getting called from user space instead, which seems rather dangerous.
    
    The same thing happens in the davinci vpbe driver with its VENC_GET_FLD
    command.
    
    As a quick fix, add a separate .command() callback pointer for this
    driver and change the two callers over to that.  This change can easily
    get backported to stable kernels if necessary, but since there are only
    two drivers, we may want to eventually replace this with a set of more
    specialized callbacks in the long run.
    
    Fixes: c3fda7f835b0 ("V4L/DVB (10537): saa6588: convert to v4l2_subdev.")
    Cc: stable@vger.kernel.org
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/media/i2c/saa6588.c b/drivers/media/i2c/saa6588.c
index 33d2987f9555..c074e51834e9 100644
--- a/drivers/media/i2c/saa6588.c
+++ b/drivers/media/i2c/saa6588.c
@@ -392,7 +392,7 @@ static void saa6588_configure(struct saa6588 *s)
 
 /* ---------------------------------------------------------------------- */
 
-static long saa6588_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+static long saa6588_command(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 {
 	struct saa6588 *s = to_saa6588(sd);
 	struct saa6588_command *a = arg;
@@ -445,7 +445,7 @@ static int saa6588_s_tuner(struct v4l2_subdev *sd, const struct v4l2_tuner *vt)
 /* ----------------------------------------------------------------------- */
 
 static const struct v4l2_subdev_core_ops saa6588_core_ops = {
-	.ioctl = saa6588_ioctl,
+	.command = saa6588_command,
 };
 
 static const struct v4l2_subdev_tuner_ops saa6588_tuner_ops = {
diff --git a/drivers/media/pci/bt8xx/bttv-driver.c b/drivers/media/pci/bt8xx/bttv-driver.c
index 4c042ba6de91..2a9d25431d73 100644
--- a/drivers/media/pci/bt8xx/bttv-driver.c
+++ b/drivers/media/pci/bt8xx/bttv-driver.c
@@ -3243,7 +3243,7 @@ static int radio_release(struct file *file)
 
 	btv->radio_user--;
 
-	bttv_call_all(btv, core, ioctl, SAA6588_CMD_CLOSE, &cmd);
+	bttv_call_all(btv, core, command, SAA6588_CMD_CLOSE, &cmd);
 
 	if (btv->radio_user == 0)
 		btv->has_radio_tuner = 0;
@@ -3324,7 +3324,7 @@ static ssize_t radio_read(struct file *file, char __user *data,
 	cmd.result = -ENODEV;
 	radio_enable(btv);
 
-	bttv_call_all(btv, core, ioctl, SAA6588_CMD_READ, &cmd);
+	bttv_call_all(btv, core, command, SAA6588_CMD_READ, &cmd);
 
 	return cmd.result;
 }
@@ -3345,7 +3345,7 @@ static __poll_t radio_poll(struct file *file, poll_table *wait)
 	cmd.instance = file;
 	cmd.event_list = wait;
 	cmd.poll_mask = res;
-	bttv_call_all(btv, core, ioctl, SAA6588_CMD_POLL, &cmd);
+	bttv_call_all(btv, core, command, SAA6588_CMD_POLL, &cmd);
 
 	return cmd.poll_mask;
 }
diff --git a/drivers/media/pci/saa7134/saa7134-video.c b/drivers/media/pci/saa7134/saa7134-video.c
index 1a50ec9d084f..079219288af7 100644
--- a/drivers/media/pci/saa7134/saa7134-video.c
+++ b/drivers/media/pci/saa7134/saa7134-video.c
@@ -1202,7 +1202,7 @@ static int video_release(struct file *file)
 
 	saa_call_all(dev, tuner, standby);
 	if (vdev->vfl_type == VFL_TYPE_RADIO)
-		saa_call_all(dev, core, ioctl, SAA6588_CMD_CLOSE, &cmd);
+		saa_call_all(dev, core, command, SAA6588_CMD_CLOSE, &cmd);
 	mutex_unlock(&dev->lock);
 
 	return 0;
@@ -1221,7 +1221,7 @@ static ssize_t radio_read(struct file *file, char __user *data,
 	cmd.result = -ENODEV;
 
 	mutex_lock(&dev->lock);
-	saa_call_all(dev, core, ioctl, SAA6588_CMD_READ, &cmd);
+	saa_call_all(dev, core, command, SAA6588_CMD_READ, &cmd);
 	mutex_unlock(&dev->lock);
 
 	return cmd.result;
@@ -1237,7 +1237,7 @@ static __poll_t radio_poll(struct file *file, poll_table *wait)
 	cmd.event_list = wait;
 	cmd.poll_mask = 0;
 	mutex_lock(&dev->lock);
-	saa_call_all(dev, core, ioctl, SAA6588_CMD_POLL, &cmd);
+	saa_call_all(dev, core, command, SAA6588_CMD_POLL, &cmd);
 	mutex_unlock(&dev->lock);
 
 	return rc | cmd.poll_mask;
diff --git a/drivers/media/platform/davinci/vpbe_display.c b/drivers/media/platform/davinci/vpbe_display.c
index 6f8269352433..2a073a6d83e3 100644
--- a/drivers/media/platform/davinci/vpbe_display.c
+++ b/drivers/media/platform/davinci/vpbe_display.c
@@ -60,7 +60,7 @@ static int venc_is_second_field(struct vpbe_display *disp_dev)
 
 	ret = v4l2_subdev_call(vpbe_dev->venc,
 			       core,
-			       ioctl,
+			       command,
 			       VENC_GET_FLD,
 			       &val);
 	if (ret < 0) {
diff --git a/drivers/media/platform/davinci/vpbe_venc.c b/drivers/media/platform/davinci/vpbe_venc.c
index ddcad7b3e76c..c2cfaa9c6957 100644
--- a/drivers/media/platform/davinci/vpbe_venc.c
+++ b/drivers/media/platform/davinci/vpbe_venc.c
@@ -534,9 +534,7 @@ static int venc_s_routing(struct v4l2_subdev *sd, u32 input, u32 output,
 	return ret;
 }
 
-static long venc_ioctl(struct v4l2_subdev *sd,
-			unsigned int cmd,
-			void *arg)
+static long venc_command(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 {
 	u32 val;
 
@@ -555,7 +553,7 @@ static long venc_ioctl(struct v4l2_subdev *sd,
 }
 
 static const struct v4l2_subdev_core_ops venc_core_ops = {
-	.ioctl      = venc_ioctl,
+	.command      = venc_command,
 };
 
 static const struct v4l2_subdev_video_ops venc_video_ops = {
diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h
index 9102d6ca566e..eac37dd3e3ba 100644
--- a/include/media/v4l2-subdev.h
+++ b/include/media/v4l2-subdev.h
@@ -171,6 +171,9 @@ struct v4l2_subdev_io_pin_config {
  * @s_gpio: set GPIO pins. Very simple right now, might need to be extended with
  *	a direction argument if needed.
  *
+ * @command: called by in-kernel drivers in order to call functions internal
+ *	   to subdev drivers driver that have a separate callback.
+ *
  * @ioctl: called at the end of ioctl() syscall handler at the V4L2 core.
  *	   used to provide support for private ioctls used on the driver.
  *
@@ -202,6 +205,7 @@ struct v4l2_subdev_core_ops {
 	int (*load_fw)(struct v4l2_subdev *sd);
 	int (*reset)(struct v4l2_subdev *sd, u32 val);
 	int (*s_gpio)(struct v4l2_subdev *sd, u32 val);
+	long (*command)(struct v4l2_subdev *sd, unsigned int cmd, void *arg);
 	long (*ioctl)(struct v4l2_subdev *sd, unsigned int cmd, void *arg);
 #ifdef CONFIG_COMPAT
 	long (*compat_ioctl32)(struct v4l2_subdev *sd, unsigned int cmd,

commit 2e0b80a74fc14af6aaf2b567f36a8ddbbc573d8b
Author: Pali Rohár <pali@kernel.org>
Date:   Thu Jun 24 23:33:43 2021 +0200

    PCI: aardvark: Fix checking for PIO Non-posted Request
    
    commit 8ceeac307a79f68c0d0c72d6e48b82fa424204ec upstream.
    
    PIO_NON_POSTED_REQ for PIO_STAT register is incorrectly defined. Bit 10 in
    register PIO_STAT indicates the response is to a non-posted request.
    
    Link: https://lore.kernel.org/r/20210624213345.3617-2-pali@kernel.org
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Reviewed-by: Marek Behún <kabel@kernel.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
index 0235b6e7dcd1..4490e7072e95 100644
--- a/drivers/pci/controller/pci-aardvark.c
+++ b/drivers/pci/controller/pci-aardvark.c
@@ -54,7 +54,7 @@
 #define   PIO_COMPLETION_STATUS_UR		1
 #define   PIO_COMPLETION_STATUS_CRS		2
 #define   PIO_COMPLETION_STATUS_CA		4
-#define   PIO_NON_POSTED_REQ			BIT(0)
+#define   PIO_NON_POSTED_REQ			BIT(10)
 #define PIO_ADDR_LS				(PIO_BASE_ADDR + 0x8)
 #define PIO_ADDR_MS				(PIO_BASE_ADDR + 0xc)
 #define PIO_WR_DATA				(PIO_BASE_ADDR + 0x10)

commit 7d2c0c0516e63b71a3476d3b4b6d38406d237486
Author: Konstantin Kharlamov <Hi-Angel@yandex.ru>
Date:   Fri May 21 02:55:01 2021 +0300

    PCI: Leave Apple Thunderbolt controllers on for s2idle or standby
    
    commit 4694ae373dc2114f9a82f6ae15737e65af0c6dea upstream.
    
    On Macbook 2013, resuming from suspend-to-idle or standby resulted in the
    external monitor no longer being detected, a stacktrace, and errors like
    this in dmesg:
    
      pcieport 0000:06:00.0: can't change power state from D3hot to D0 (config space inaccessible)
    
    The reason is that we know how to turn power to the Thunderbolt controller
    *off* via the SXIO/SXFP/SXLF methods, but we don't know how to turn power
    back on.  We have to rely on firmware to turn the power back on.
    
    When going to the "suspend-to-idle" or "standby" system sleep states,
    firmware is not involved either on the suspend side or the resume side, so
    we can't use SXIO/SXFP/SXLF to turn the power off.
    
    Skip SXIO/SXFP/SXLF when firmware isn't involved in suspend, e.g., when
    we're going to the "suspend-to-idle" or "standby" system sleep states.
    
    Fixes: 1df5172c5c25 ("PCI: Suspend/resume quirks for Apple thunderbolt")
    Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=212767
    Link: https://lore.kernel.org/r/20210520235501.917397-1-Hi-Angel@yandex.ru
    Signed-off-by: Konstantin Kharlamov <Hi-Angel@yandex.ru>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Lukas Wunner <lukas@wunner.de>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 576b5bb6b95f..bfb22de693eb 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -28,6 +28,7 @@
 #include <linux/nvme.h>
 #include <linux/platform_data/x86/apple.h>
 #include <linux/pm_runtime.h>
+#include <linux/suspend.h>
 #include <linux/switchtec.h>
 #include <asm/dma.h>	/* isa_dma_bridge_buggy */
 #include "pci.h"
@@ -3573,6 +3574,16 @@ static void quirk_apple_poweroff_thunderbolt(struct pci_dev *dev)
 		return;
 	if (pci_pcie_type(dev) != PCI_EXP_TYPE_UPSTREAM)
 		return;
+
+	/*
+	 * SXIO/SXFP/SXLF turns off power to the Thunderbolt controller.
+	 * We don't know how to turn it back on again, but firmware does,
+	 * so we can only use SXIO/SXFP/SXLF if we're suspending via
+	 * firmware.
+	 */
+	if (!pm_suspend_via_firmware())
+		return;
+
 	bridge = ACPI_HANDLE(&dev->dev);
 	if (!bridge)
 		return;

commit 8fbae4a1bdb5b889490cdee929e68540151536e5
Author: Hou Tao <houtao1@huawei.com>
Date:   Thu Jun 17 15:45:47 2021 +0800

    dm btree remove: assign new_root only when removal succeeds
    
    commit b6e58b5466b2959f83034bead2e2e1395cca8aeb upstream.
    
    remove_raw() in dm_btree_remove() may fail due to IO read error
    (e.g. read the content of origin block fails during shadowing),
    and the value of shadow_spine::root is uninitialized, but
    the uninitialized value is still assign to new_root in the
    end of dm_btree_remove().
    
    For dm-thin, the value of pmd->details_root or pmd->root will become
    an uninitialized value, so if trying to read details_info tree again
    out-of-bound memory may occur as showed below:
    
      general protection fault, probably for non-canonical address 0x3fdcb14c8d7520
      CPU: 4 PID: 515 Comm: dmsetup Not tainted 5.13.0-rc6
      Hardware name: QEMU Standard PC
      RIP: 0010:metadata_ll_load_ie+0x14/0x30
      Call Trace:
       sm_metadata_count_is_more_than_one+0xb9/0xe0
       dm_tm_shadow_block+0x52/0x1c0
       shadow_step+0x59/0xf0
       remove_raw+0xb2/0x170
       dm_btree_remove+0xf4/0x1c0
       dm_pool_delete_thin_device+0xc3/0x140
       pool_message+0x218/0x2b0
       target_message+0x251/0x290
       ctl_ioctl+0x1c4/0x4d0
       dm_ctl_ioctl+0xe/0x20
       __x64_sys_ioctl+0x7b/0xb0
       do_syscall_64+0x40/0xb0
       entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Fixing it by only assign new_root when removal succeeds
    
    Signed-off-by: Hou Tao <houtao1@huawei.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Mike Snitzer <snitzer@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/md/persistent-data/dm-btree-remove.c b/drivers/md/persistent-data/dm-btree-remove.c
index eff04fa23dfa..9e4d1212f4c1 100644
--- a/drivers/md/persistent-data/dm-btree-remove.c
+++ b/drivers/md/persistent-data/dm-btree-remove.c
@@ -549,7 +549,8 @@ int dm_btree_remove(struct dm_btree_info *info, dm_block_t root,
 		delete_at(n, index);
 	}
 
-	*new_root = shadow_root(&spine);
+	if (!r)
+		*new_root = shadow_root(&spine);
 	exit_shadow_spine(&spine);
 
 	return r;

commit 04bd77ef4f4d9fc6102023b85f4590fc2130aac5
Author: Sai Prakash Ranjan <saiprakash.ranjan@codeaurora.org>
Date:   Mon Jun 14 11:59:00 2021 -0600

    coresight: tmc-etf: Fix global-out-of-bounds in tmc_update_etf_buffer()
    
    commit 5fae8a946ac2df879caf3f79a193d4766d00239b upstream.
    
    commit 6f755e85c332 ("coresight: Add helper for inserting synchronization
    packets") removed trailing '\0' from barrier_pkt array and updated the
    call sites like etb_update_buffer() to have proper checks for barrier_pkt
    size before read but missed updating tmc_update_etf_buffer() which still
    reads barrier_pkt past the array size resulting in KASAN out-of-bounds
    bug. Fix this by adding a check for barrier_pkt size before accessing
    like it is done in etb_update_buffer().
    
     BUG: KASAN: global-out-of-bounds in tmc_update_etf_buffer+0x4b8/0x698
     Read of size 4 at addr ffffffd05b7d1030 by task perf/2629
    
     Call trace:
      dump_backtrace+0x0/0x27c
      show_stack+0x20/0x2c
      dump_stack+0x11c/0x188
      print_address_description+0x3c/0x4a4
      __kasan_report+0x140/0x164
      kasan_report+0x10/0x18
      __asan_report_load4_noabort+0x1c/0x24
      tmc_update_etf_buffer+0x4b8/0x698
      etm_event_stop+0x248/0x2d8
      etm_event_del+0x20/0x2c
      event_sched_out+0x214/0x6f0
      group_sched_out+0xd0/0x270
      ctx_sched_out+0x2ec/0x518
      __perf_event_task_sched_out+0x4fc/0xe6c
      __schedule+0x1094/0x16a0
      preempt_schedule_irq+0x88/0x170
      arm64_preempt_schedule_irq+0xf0/0x18c
      el1_irq+0xe8/0x180
      perf_event_exec+0x4d8/0x56c
      setup_new_exec+0x204/0x400
      load_elf_binary+0x72c/0x18c0
      search_binary_handler+0x13c/0x420
      load_script+0x500/0x6c4
      search_binary_handler+0x13c/0x420
      exec_binprm+0x118/0x654
      __do_execve_file+0x77c/0xba4
      __arm64_compat_sys_execve+0x98/0xac
      el0_svc_common+0x1f8/0x5e0
      el0_svc_compat_handler+0x84/0xb0
      el0_svc_compat+0x10/0x50
    
     The buggy address belongs to the variable:
      barrier_pkt+0x10/0x40
    
     Memory state around the buggy address:
      ffffffd05b7d0f00: fa fa fa fa 04 fa fa fa fa fa fa fa 00 00 00 00
      ffffffd05b7d0f80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
     >ffffffd05b7d1000: 00 00 00 00 00 00 fa fa fa fa fa fa 00 00 00 03
                                          ^
      ffffffd05b7d1080: fa fa fa fa 00 02 fa fa fa fa fa fa 03 fa fa fa
      ffffffd05b7d1100: fa fa fa fa 00 00 00 00 05 fa fa fa fa fa fa fa
     ==================================================================
    
    Link: https://lore.kernel.org/r/20210505093430.18445-1-saiprakash.ranjan@codeaurora.org
    Fixes: 0c3fc4d5fa26 ("coresight: Add barrier packet for synchronisation")
    Cc: stable@vger.kernel.org
    Signed-off-by: Sai Prakash Ranjan <saiprakash.ranjan@codeaurora.org>
    Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
    Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
    Link: https://lore.kernel.org/r/20210614175901.532683-6-mathieu.poirier@linaro.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/hwtracing/coresight/coresight-tmc-etf.c b/drivers/hwtracing/coresight/coresight-tmc-etf.c
index 29dc2eac5b06..7f87e2c3b482 100644
--- a/drivers/hwtracing/coresight/coresight-tmc-etf.c
+++ b/drivers/hwtracing/coresight/coresight-tmc-etf.c
@@ -470,7 +470,7 @@ static void tmc_update_etf_buffer(struct coresight_device *csdev,
 		buf_ptr = buf->data_pages[cur] + offset;
 		*buf_ptr = readl_relaxed(drvdata->base + TMC_RRD);
 
-		if (lost && *barrier) {
+		if (lost && i < CORESIGHT_BARRIER_PKT_SIZE) {
 			*buf_ptr = *barrier;
 			barrier++;
 		}

commit a84f140380cc45b249f01b2cb856dbdd23e446a1
Author: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
Date:   Mon May 24 02:32:05 2021 -0700

    ipack/carriers/tpci200: Fix a double free in tpci200_pci_probe
    
    commit 9272e5d0028d45a3b45b58c9255e6e0df53f7ad9 upstream.
    
    In the out_err_bus_register error branch of tpci200_pci_probe,
    tpci200->info->cfg_regs is freed by tpci200_uninstall()->
    tpci200_unregister()->pci_iounmap(..,tpci200->info->cfg_regs)
    in the first time.
    
    But later, iounmap() is called to free tpci200->info->cfg_regs
    again.
    
    My patch sets tpci200->info->cfg_regs to NULL after tpci200_uninstall()
    to avoid the double free.
    
    Fixes: cea2f7cdff2af ("Staging: ipack/bridges/tpci200: Use the TPCI200 in big endian mode")
    Cc: stable <stable@vger.kernel.org>
    Acked-by: Samuel Iglesias Gonsalvez <siglesias@igalia.com>
    Signed-off-by: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
    Link: https://lore.kernel.org/r/20210524093205.8333-1-lyl2019@mail.ustc.edu.cn
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/ipack/carriers/tpci200.c b/drivers/ipack/carriers/tpci200.c
index b5eec18ad59a..7895320e50c1 100644
--- a/drivers/ipack/carriers/tpci200.c
+++ b/drivers/ipack/carriers/tpci200.c
@@ -599,8 +599,11 @@ static int tpci200_pci_probe(struct pci_dev *pdev,
 
 out_err_bus_register:
 	tpci200_uninstall(tpci200);
+	/* tpci200->info->cfg_regs is unmapped in tpci200_uninstall */
+	tpci200->info->cfg_regs = NULL;
 out_err_install:
-	iounmap(tpci200->info->cfg_regs);
+	if (tpci200->info->cfg_regs)
+		iounmap(tpci200->info->cfg_regs);
 out_err_ioremap:
 	pci_release_region(pdev, TPCI200_CFG_MEM_BAR);
 out_err_pci_request:

commit e1105c6465e3a8f1616139caac6f299ae0a8082e
Author: Paul Burton <paulburton@google.com>
Date:   Thu Jul 1 10:24:07 2021 -0700

    tracing: Resize tgid_map to pid_max, not PID_MAX_DEFAULT
    
    commit 4030a6e6a6a4a42ff8c18414c9e0c93e24cc70b8 upstream.
    
    Currently tgid_map is sized at PID_MAX_DEFAULT entries, which means that
    on systems where pid_max is configured higher than PID_MAX_DEFAULT the
    ftrace record-tgid option doesn't work so well. Any tasks with PIDs
    higher than PID_MAX_DEFAULT are simply not recorded in tgid_map, and
    don't show up in the saved_tgids file.
    
    In particular since systemd v243 & above configure pid_max to its
    highest possible 1<<22 value by default on 64 bit systems this renders
    the record-tgids option of little use.
    
    Increase the size of tgid_map to the configured pid_max instead,
    allowing it to cover the full range of PIDs up to the maximum value of
    PID_MAX_LIMIT if the system is configured that way.
    
    On 64 bit systems with pid_max == PID_MAX_LIMIT this will increase the
    size of tgid_map from 256KiB to 16MiB. Whilst this 64x increase in
    memory overhead sounds significant 64 bit systems are presumably best
    placed to accommodate it, and since tgid_map is only allocated when the
    record-tgid option is actually used presumably the user would rather it
    spends sufficient memory to actually record the tgids they expect.
    
    The size of tgid_map could also increase for CONFIG_BASE_SMALL=y
    configurations, but these seem unlikely to be systems upon which people
    are both configuring a large pid_max and running ftrace with record-tgid
    anyway.
    
    Of note is that we only allocate tgid_map once, the first time that the
    record-tgid option is enabled. Therefore its size is only set once, to
    the value of pid_max at the time the record-tgid option is first
    enabled. If a user increases pid_max after that point, the saved_tgids
    file will not contain entries for any tasks with pids beyond the earlier
    value of pid_max.
    
    Link: https://lkml.kernel.org/r/20210701172407.889626-2-paulburton@google.com
    
    Fixes: d914ba37d714 ("tracing: Add support for recording tgid of tasks")
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Joel Fernandes <joelaf@google.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Paul Burton <paulburton@google.com>
    [ Fixed comment coding style ]
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 2358f5b70d85..895026ccfea2 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -1729,8 +1729,15 @@ void tracing_reset_all_online_cpus(void)
 	}
 }
 
+/*
+ * The tgid_map array maps from pid to tgid; i.e. the value stored at index i
+ * is the tgid last observed corresponding to pid=i.
+ */
 static int *tgid_map;
 
+/* The maximum valid index into tgid_map. */
+static size_t tgid_map_max;
+
 #define SAVED_CMDLINES_DEFAULT 128
 #define NO_CMDLINE_MAP UINT_MAX
 static arch_spinlock_t trace_cmdline_lock = __ARCH_SPIN_LOCK_UNLOCKED;
@@ -2003,24 +2010,41 @@ void trace_find_cmdline(int pid, char comm[])
 	preempt_enable();
 }
 
+static int *trace_find_tgid_ptr(int pid)
+{
+	/*
+	 * Pairs with the smp_store_release in set_tracer_flag() to ensure that
+	 * if we observe a non-NULL tgid_map then we also observe the correct
+	 * tgid_map_max.
+	 */
+	int *map = smp_load_acquire(&tgid_map);
+
+	if (unlikely(!map || pid > tgid_map_max))
+		return NULL;
+
+	return &map[pid];
+}
+
 int trace_find_tgid(int pid)
 {
-	if (unlikely(!tgid_map || !pid || pid > PID_MAX_DEFAULT))
-		return 0;
+	int *ptr = trace_find_tgid_ptr(pid);
 
-	return tgid_map[pid];
+	return ptr ? *ptr : 0;
 }
 
 static int trace_save_tgid(struct task_struct *tsk)
 {
+	int *ptr;
+
 	/* treat recording of idle task as a success */
 	if (!tsk->pid)
 		return 1;
 
-	if (unlikely(!tgid_map || tsk->pid > PID_MAX_DEFAULT))
+	ptr = trace_find_tgid_ptr(tsk->pid);
+	if (!ptr)
 		return 0;
 
-	tgid_map[tsk->pid] = tsk->tgid;
+	*ptr = tsk->tgid;
 	return 1;
 }
 
@@ -4355,6 +4379,8 @@ int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set)
 
 int set_tracer_flag(struct trace_array *tr, unsigned int mask, int enabled)
 {
+	int *map;
+
 	if ((mask == TRACE_ITER_RECORD_TGID) ||
 	    (mask == TRACE_ITER_RECORD_CMD))
 		lockdep_assert_held(&event_mutex);
@@ -4377,10 +4403,19 @@ int set_tracer_flag(struct trace_array *tr, unsigned int mask, int enabled)
 		trace_event_enable_cmd_record(enabled);
 
 	if (mask == TRACE_ITER_RECORD_TGID) {
-		if (!tgid_map)
-			tgid_map = kvcalloc(PID_MAX_DEFAULT + 1,
-					   sizeof(*tgid_map),
-					   GFP_KERNEL);
+		if (!tgid_map) {
+			tgid_map_max = pid_max;
+			map = kvcalloc(tgid_map_max + 1, sizeof(*tgid_map),
+				       GFP_KERNEL);
+
+			/*
+			 * Pairs with smp_load_acquire() in
+			 * trace_find_tgid_ptr() to ensure that if it observes
+			 * the tgid_map we just allocated then it also observes
+			 * the corresponding tgid_map_max value.
+			 */
+			smp_store_release(&tgid_map, map);
+		}
 		if (!tgid_map) {
 			tr->trace_flags &= ~TRACE_ITER_RECORD_TGID;
 			return -ENOMEM;
@@ -4754,18 +4789,14 @@ static void *saved_tgids_next(struct seq_file *m, void *v, loff_t *pos)
 {
 	int pid = ++(*pos);
 
-	if (pid > PID_MAX_DEFAULT)
-		return NULL;
-
-	return &tgid_map[pid];
+	return trace_find_tgid_ptr(pid);
 }
 
 static void *saved_tgids_start(struct seq_file *m, loff_t *pos)
 {
-	if (!tgid_map || *pos > PID_MAX_DEFAULT)
-		return NULL;
+	int pid = *pos;
 
-	return &tgid_map[*pos];
+	return trace_find_tgid_ptr(pid);
 }
 
 static void saved_tgids_stop(struct seq_file *m, void *v)

commit 44896b31b19c7012d1fd8548f3dd82f272c03063
Author: Paul Burton <paulburton@google.com>
Date:   Tue Jun 29 17:34:05 2021 -0700

    tracing: Simplify & fix saved_tgids logic
    
    commit b81b3e959adb107cd5b36c7dc5ba1364bbd31eb2 upstream.
    
    The tgid_map array records a mapping from pid to tgid, where the index
    of an entry within the array is the pid & the value stored at that index
    is the tgid.
    
    The saved_tgids_next() function iterates over pointers into the tgid_map
    array & dereferences the pointers which results in the tgid, but then it
    passes that dereferenced value to trace_find_tgid() which treats it as a
    pid & does a further lookup within the tgid_map array. It seems likely
    that the intent here was to skip over entries in tgid_map for which the
    recorded tgid is zero, but instead we end up skipping over entries for
    which the thread group leader hasn't yet had its own tgid recorded in
    tgid_map.
    
    A minimal fix would be to remove the call to trace_find_tgid, turning:
    
      if (trace_find_tgid(*ptr))
    
    into:
    
      if (*ptr)
    
    ..but it seems like this logic can be much simpler if we simply let
    seq_read() iterate over the whole tgid_map array & filter out empty
    entries by returning SEQ_SKIP from saved_tgids_show(). Here we take that
    approach, removing the incorrect logic here entirely.
    
    Link: https://lkml.kernel.org/r/20210630003406.4013668-1-paulburton@google.com
    
    Fixes: d914ba37d714 ("tracing: Add support for recording tgid of tasks")
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Joel Fernandes <joelaf@google.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Paul Burton <paulburton@google.com>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 71bc808fe03a..2358f5b70d85 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -4752,37 +4752,20 @@ static const struct file_operations tracing_readme_fops = {
 
 static void *saved_tgids_next(struct seq_file *m, void *v, loff_t *pos)
 {
-	int *ptr = v;
+	int pid = ++(*pos);
 
-	if (*pos || m->count)
-		ptr++;
-
-	(*pos)++;
-
-	for (; ptr <= &tgid_map[PID_MAX_DEFAULT]; ptr++) {
-		if (trace_find_tgid(*ptr))
-			return ptr;
-	}
+	if (pid > PID_MAX_DEFAULT)
+		return NULL;
 
-	return NULL;
+	return &tgid_map[pid];
 }
 
 static void *saved_tgids_start(struct seq_file *m, loff_t *pos)
 {
-	void *v;
-	loff_t l = 0;
-
-	if (!tgid_map)
+	if (!tgid_map || *pos > PID_MAX_DEFAULT)
 		return NULL;
 
-	v = &tgid_map[0];
-	while (l <= *pos) {
-		v = saved_tgids_next(m, v, &l);
-		if (!v)
-			return NULL;
-	}
-
-	return v;
+	return &tgid_map[*pos];
 }
 
 static void saved_tgids_stop(struct seq_file *m, void *v)
@@ -4791,9 +4774,14 @@ static void saved_tgids_stop(struct seq_file *m, void *v)
 
 static int saved_tgids_show(struct seq_file *m, void *v)
 {
-	int pid = (int *)v - tgid_map;
+	int *entry = (int *)v;
+	int pid = entry - tgid_map;
+	int tgid = *entry;
+
+	if (tgid == 0)
+		return SEQ_SKIP;
 
-	seq_printf(m, "%d %d\n", pid, trace_find_tgid(pid));
+	seq_printf(m, "%d %d\n", pid, tgid);
 	return 0;
 }
 

commit 1f4c6061fccee64b2072b28dfa3e93cf859c4c0a
Author: Yun Zhou <yun.zhou@windriver.com>
Date:   Sat Jun 26 11:21:55 2021 +0800

    seq_buf: Fix overflow in seq_buf_putmem_hex()
    
    commit d3b16034a24a112bb83aeb669ac5b9b01f744bb7 upstream.
    
    There's two variables being increased in that loop (i and j), and i
    follows the raw data, and j follows what is being written into the buffer.
    We should compare 'i' to MAX_MEMHEX_BYTES or compare 'j' to HEX_CHARS.
    Otherwise, if 'j' goes bigger than HEX_CHARS, it will overflow the
    destination buffer.
    
    Link: https://lore.kernel.org/lkml/20210625122453.5e2fe304@oasis.local.home/
    Link: https://lkml.kernel.org/r/20210626032156.47889-1-yun.zhou@windriver.com
    
    Cc: stable@vger.kernel.org
    Fixes: 5e3ca0ec76fce ("ftrace: introduce the "hex" output method")
    Signed-off-by: Yun Zhou <yun.zhou@windriver.com>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/lib/seq_buf.c b/lib/seq_buf.c
index 97de70872c9e..562e53c93b7b 100644
--- a/lib/seq_buf.c
+++ b/lib/seq_buf.c
@@ -228,8 +228,10 @@ int seq_buf_putmem_hex(struct seq_buf *s, const void *mem,
 
 	WARN_ON(s->size == 0);
 
+	BUILD_BUG_ON(MAX_MEMHEX_BYTES * 2 >= HEX_CHARS);
+
 	while (len) {
-		start_len = min(len, HEX_CHARS - 1);
+		start_len = min(len, MAX_MEMHEX_BYTES);
 #ifdef __BIG_ENDIAN
 		for (i = 0, j = 0; i < start_len; i++) {
 #else

commit b35bd56fcfcecad8f2b90e4cf13053a04b7ef058
Author: Linus Walleij <linus.walleij@linaro.org>
Date:   Sun Jun 27 01:47:49 2021 +0200

    power: supply: ab8500: Fix an old bug
    
    commit f1c74a6c07e76fcb31a4bcc1f437c4361a2674ce upstream.
    
    Trying to get the AB8500 charging driver working I ran into a bit
    of bitrot: we haven't used the driver for a while so errors in
    refactorings won't be noticed.
    
    This one is pretty self evident: use argument to the macro or we
    end up with a random pointer to something else.
    
    Cc: stable@vger.kernel.org
    Cc: Krzysztof Kozlowski <krzk@kernel.org>
    Cc: Marcus Cooper <codekipper@gmail.com>
    Fixes: 297d716f6260 ("power_supply: Change ownership from driver to core")
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/mfd/abx500/ux500_chargalg.h b/include/linux/mfd/abx500/ux500_chargalg.h
index 669894f434f5..12c38054f7d1 100644
--- a/include/linux/mfd/abx500/ux500_chargalg.h
+++ b/include/linux/mfd/abx500/ux500_chargalg.h
@@ -15,7 +15,7 @@
  * - POWER_SUPPLY_TYPE_USB,
  * because only them store as drv_data pointer to struct ux500_charger.
  */
-#define psy_to_ux500_charger(x) power_supply_get_drvdata(psy)
+#define psy_to_ux500_charger(x) power_supply_get_drvdata(x)
 
 /* Forward declaration */
 struct ux500_charger;

commit ba7f895082ab3a89a5e9da2730474dbae7f79988
Author: Petr Pavlu <petr.pavlu@suse.com>
Date:   Thu May 13 14:26:36 2021 +0200

    ipmi/watchdog: Stop watchdog timer when the current action is 'none'
    
    commit 2253042d86f57d90a621ac2513a7a7a13afcf809 upstream.
    
    When an IPMI watchdog timer is being stopped in ipmi_close() or
    ipmi_ioctl(WDIOS_DISABLECARD), the current watchdog action is updated to
    WDOG_TIMEOUT_NONE and _ipmi_set_timeout(IPMI_SET_TIMEOUT_NO_HB) is called
    to install this action. The latter function ends up invoking
    __ipmi_set_timeout() which makes the actual 'Set Watchdog Timer' IPMI
    request.
    
    For IPMI 1.0, this operation results in fully stopping the watchdog timer.
    For IPMI >= 1.5, function __ipmi_set_timeout() always specifies the "don't
    stop" flag in the prepared 'Set Watchdog Timer' IPMI request. This causes
    that the watchdog timer has its action correctly updated to 'none' but the
    timer continues to run. A problem is that IPMI firmware can then still log
    an expiration event when the configured timeout is reached, which is
    unexpected because the watchdog timer was requested to be stopped.
    
    The patch fixes this problem by not setting the "don't stop" flag in
    __ipmi_set_timeout() when the current action is WDOG_TIMEOUT_NONE which
    results in stopping the watchdog timer. This makes the behaviour for
    IPMI >= 1.5 consistent with IPMI 1.0. It also matches the logic in
    __ipmi_heartbeat() which does not allow to reset the watchdog if the
    current action is WDOG_TIMEOUT_NONE as that would start the timer.
    
    Signed-off-by: Petr Pavlu <petr.pavlu@suse.com>
    Message-Id: <10a41bdc-9c99-089c-8d89-fa98ce5ea080@suse.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Corey Minyard <cminyard@mvista.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/char/ipmi/ipmi_watchdog.c b/drivers/char/ipmi/ipmi_watchdog.c
index ca1c5c5109f0..f016d54b2592 100644
--- a/drivers/char/ipmi/ipmi_watchdog.c
+++ b/drivers/char/ipmi/ipmi_watchdog.c
@@ -366,16 +366,18 @@ static int __ipmi_set_timeout(struct ipmi_smi_msg  *smi_msg,
 	data[0] = 0;
 	WDOG_SET_TIMER_USE(data[0], WDOG_TIMER_USE_SMS_OS);
 
-	if ((ipmi_version_major > 1)
-	    || ((ipmi_version_major == 1) && (ipmi_version_minor >= 5))) {
-		/* This is an IPMI 1.5-only feature. */
-		data[0] |= WDOG_DONT_STOP_ON_SET;
-	} else if (ipmi_watchdog_state != WDOG_TIMEOUT_NONE) {
-		/*
-		 * In ipmi 1.0, setting the timer stops the watchdog, we
-		 * need to start it back up again.
-		 */
-		hbnow = 1;
+	if (ipmi_watchdog_state != WDOG_TIMEOUT_NONE) {
+		if ((ipmi_version_major > 1) ||
+		    ((ipmi_version_major == 1) && (ipmi_version_minor >= 5))) {
+			/* This is an IPMI 1.5-only feature. */
+			data[0] |= WDOG_DONT_STOP_ON_SET;
+		} else {
+			/*
+			 * In ipmi 1.0, setting the timer stops the watchdog, we
+			 * need to start it back up again.
+			 */
+			hbnow = 1;
+		}
 	}
 
 	data[1] = 0;

commit 19f862a7f53ac2f84413dc7ebcb3819d889670d4
Author: Nathan Chancellor <nathan@kernel.org>
Date:   Thu Feb 11 12:42:58 2021 -0700

    qemu_fw_cfg: Make fw_cfg_rev_attr a proper kobj_attribute
    
    commit fca41af18e10318e4de090db47d9fa7169e1bf2f upstream.
    
    fw_cfg_showrev() is called by an indirect call in kobj_attr_show(),
    which violates clang's CFI checking because fw_cfg_showrev()'s second
    parameter is 'struct attribute', whereas the ->show() member of 'struct
    kobj_structure' expects the second parameter to be of type 'struct
    kobj_attribute'.
    
    $ cat /sys/firmware/qemu_fw_cfg/rev
    3
    
    $ dmesg | grep "CFI failure"
    [   26.016832] CFI failure (target: fw_cfg_showrev+0x0/0x8):
    
    Fix this by converting fw_cfg_rev_attr to 'struct kobj_attribute' where
    this would have been caught automatically by the incompatible pointer
    types compiler warning. Update fw_cfg_showrev() accordingly.
    
    Fixes: 75f3e8e47f38 ("firmware: introduce sysfs driver for QEMU's fw_cfg device")
    Link: https://github.com/ClangBuiltLinux/linux/issues/1299
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Reviewed-by: Sami Tolvanen <samitolvanen@google.com>
    Tested-by: Sedat Dilek <sedat.dilek@gmail.com>
    Reviewed-by: Sami Tolvanen <samitolvanen@google.com>
    Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210211194258.4137998-1-nathan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/firmware/qemu_fw_cfg.c b/drivers/firmware/qemu_fw_cfg.c
index 6945c3c96637..59db70fb4561 100644
--- a/drivers/firmware/qemu_fw_cfg.c
+++ b/drivers/firmware/qemu_fw_cfg.c
@@ -296,15 +296,13 @@ static int fw_cfg_do_platform_probe(struct platform_device *pdev)
 	return 0;
 }
 
-static ssize_t fw_cfg_showrev(struct kobject *k, struct attribute *a, char *buf)
+static ssize_t fw_cfg_showrev(struct kobject *k, struct kobj_attribute *a,
+			      char *buf)
 {
 	return sprintf(buf, "%u\n", fw_cfg_rev);
 }
 
-static const struct {
-	struct attribute attr;
-	ssize_t (*show)(struct kobject *k, struct attribute *a, char *buf);
-} fw_cfg_rev_attr = {
+static const struct kobj_attribute fw_cfg_rev_attr = {
 	.attr = { .name = "rev", .mode = S_IRUSR },
 	.show = fw_cfg_showrev,
 };

commit 4587b665988ff6b3de070508fbcfb9b4615f3414
Author: Dmitry Osipenko <digetx@gmail.com>
Date:   Sat May 29 18:46:46 2021 +0300

    ASoC: tegra: Set driver_name=tegra for all machine drivers
    
    commit f6eb84fa596abf28959fc7e0b626f925eb1196c7 upstream.
    
    The driver_name="tegra" is now required by the newer ALSA UCMs, otherwise
    Tegra UCMs don't match by the path/name.
    
    All Tegra machine drivers are specifying the card's name, but it has no
    effect if model name is specified in the device-tree since it overrides
    the card's name. We need to set the driver_name to "tegra" in order to
    get a usable lookup path for the updated ALSA UCMs. The new UCM lookup
    path has a form of driver_name/card_name.
    
    The old lookup paths that are based on driver module name continue to
    work as before. Note that UCM matching never worked for Tegra ASoC drivers
    if they were compiled as built-in, this is fixed by supporting the new
    naming scheme.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
    Link: https://lore.kernel.org/r/20210529154649.25936-2-digetx@gmail.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/soc/tegra/tegra_alc5632.c b/sound/soc/tegra/tegra_alc5632.c
index 98d87801d57a..6fea7417332e 100644
--- a/sound/soc/tegra/tegra_alc5632.c
+++ b/sound/soc/tegra/tegra_alc5632.c
@@ -137,6 +137,7 @@ static struct snd_soc_dai_link tegra_alc5632_dai = {
 
 static struct snd_soc_card snd_soc_tegra_alc5632 = {
 	.name = "tegra-alc5632",
+	.driver_name = "tegra",
 	.owner = THIS_MODULE,
 	.dai_link = &tegra_alc5632_dai,
 	.num_links = 1,
diff --git a/sound/soc/tegra/tegra_max98090.c b/sound/soc/tegra/tegra_max98090.c
index cf142e2c7bd7..10998d703dcd 100644
--- a/sound/soc/tegra/tegra_max98090.c
+++ b/sound/soc/tegra/tegra_max98090.c
@@ -188,6 +188,7 @@ static struct snd_soc_dai_link tegra_max98090_dai = {
 
 static struct snd_soc_card snd_soc_tegra_max98090 = {
 	.name = "tegra-max98090",
+	.driver_name = "tegra",
 	.owner = THIS_MODULE,
 	.dai_link = &tegra_max98090_dai,
 	.num_links = 1,
diff --git a/sound/soc/tegra/tegra_rt5640.c b/sound/soc/tegra/tegra_rt5640.c
index fc81b48aa9d6..e0cbe85b6d46 100644
--- a/sound/soc/tegra/tegra_rt5640.c
+++ b/sound/soc/tegra/tegra_rt5640.c
@@ -138,6 +138,7 @@ static struct snd_soc_dai_link tegra_rt5640_dai = {
 
 static struct snd_soc_card snd_soc_tegra_rt5640 = {
 	.name = "tegra-rt5640",
+	.driver_name = "tegra",
 	.owner = THIS_MODULE,
 	.dai_link = &tegra_rt5640_dai,
 	.num_links = 1,
diff --git a/sound/soc/tegra/tegra_rt5677.c b/sound/soc/tegra/tegra_rt5677.c
index 7081f15302cc..e285793d2b1c 100644
--- a/sound/soc/tegra/tegra_rt5677.c
+++ b/sound/soc/tegra/tegra_rt5677.c
@@ -181,6 +181,7 @@ static struct snd_soc_dai_link tegra_rt5677_dai = {
 
 static struct snd_soc_card snd_soc_tegra_rt5677 = {
 	.name = "tegra-rt5677",
+	.driver_name = "tegra",
 	.owner = THIS_MODULE,
 	.dai_link = &tegra_rt5677_dai,
 	.num_links = 1,
diff --git a/sound/soc/tegra/tegra_sgtl5000.c b/sound/soc/tegra/tegra_sgtl5000.c
index 901457da25ec..e6cbc89eaa92 100644
--- a/sound/soc/tegra/tegra_sgtl5000.c
+++ b/sound/soc/tegra/tegra_sgtl5000.c
@@ -103,6 +103,7 @@ static struct snd_soc_dai_link tegra_sgtl5000_dai = {
 
 static struct snd_soc_card snd_soc_tegra_sgtl5000 = {
 	.name = "tegra-sgtl5000",
+	.driver_name = "tegra",
 	.owner = THIS_MODULE,
 	.dai_link = &tegra_sgtl5000_dai,
 	.num_links = 1,
diff --git a/sound/soc/tegra/tegra_wm8753.c b/sound/soc/tegra/tegra_wm8753.c
index 23a810e3bacc..3fa0e991308a 100644
--- a/sound/soc/tegra/tegra_wm8753.c
+++ b/sound/soc/tegra/tegra_wm8753.c
@@ -110,6 +110,7 @@ static struct snd_soc_dai_link tegra_wm8753_dai = {
 
 static struct snd_soc_card snd_soc_tegra_wm8753 = {
 	.name = "tegra-wm8753",
+	.driver_name = "tegra",
 	.owner = THIS_MODULE,
 	.dai_link = &tegra_wm8753_dai,
 	.num_links = 1,
diff --git a/sound/soc/tegra/tegra_wm8903.c b/sound/soc/tegra/tegra_wm8903.c
index 301850df368d..8edcd82038d8 100644
--- a/sound/soc/tegra/tegra_wm8903.c
+++ b/sound/soc/tegra/tegra_wm8903.c
@@ -226,6 +226,7 @@ static struct snd_soc_dai_link tegra_wm8903_dai = {
 
 static struct snd_soc_card snd_soc_tegra_wm8903 = {
 	.name = "tegra-wm8903",
+	.driver_name = "tegra",
 	.owner = THIS_MODULE,
 	.dai_link = &tegra_wm8903_dai,
 	.num_links = 1,
diff --git a/sound/soc/tegra/tegra_wm9712.c b/sound/soc/tegra/tegra_wm9712.c
index 864a3345972e..7175e6eea911 100644
--- a/sound/soc/tegra/tegra_wm9712.c
+++ b/sound/soc/tegra/tegra_wm9712.c
@@ -59,6 +59,7 @@ static struct snd_soc_dai_link tegra_wm9712_dai = {
 
 static struct snd_soc_card snd_soc_tegra_wm9712 = {
 	.name = "tegra-wm9712",
+	.driver_name = "tegra",
 	.owner = THIS_MODULE,
 	.dai_link = &tegra_wm9712_dai,
 	.num_links = 1,
diff --git a/sound/soc/tegra/trimslice.c b/sound/soc/tegra/trimslice.c
index 99bcdd979eb2..47ef6d6f4ae1 100644
--- a/sound/soc/tegra/trimslice.c
+++ b/sound/soc/tegra/trimslice.c
@@ -103,6 +103,7 @@ static struct snd_soc_dai_link trimslice_tlv320aic23_dai = {
 
 static struct snd_soc_card snd_soc_trimslice = {
 	.name = "tegra-trimslice",
+	.driver_name = "tegra",
 	.owner = THIS_MODULE,
 	.dai_link = &trimslice_tlv320aic23_dai,
 	.num_links = 1,

commit 24493605bd1c9e56cb0229c8e006e3add2f0b706
Author: Samuel Holland <samuel@sholland.org>
Date:   Fri May 14 21:14:39 2021 -0500

    clocksource/arm_arch_timer: Improve Allwinner A64 timer workaround
    
    commit 8b33dfe0ba1c84c1aab2456590b38195837f1e6e upstream.
    
    Bad counter reads are experienced sometimes when bit 10 or greater rolls
    over. Originally, testing showed that at least 10 lower bits would be
    set to the same value during these bad reads. However, some users still
    reported time skips.
    
    Wider testing revealed that on some chips, occasionally only the lowest
    9 bits would read as the anomalous value. During these reads (which
    still happen only when bit 10), bit 9 would read as the correct value.
    
    Reduce the mask by one bit to cover these cases as well.
    
    Cc: stable@vger.kernel.org
    Fixes: c950ca8c35ee ("clocksource/drivers/arch_timer: Workaround for Allwinner A64 timer instability")
    Reported-by: Roman Stratiienko <r.stratiienko@gmail.com>
    Signed-off-by: Samuel Holland <samuel@sholland.org>
    Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
    Link: https://lore.kernel.org/r/20210515021439.55316-1-samuel@sholland.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c
index e67ab217eef4..8642504b7e51 100644
--- a/drivers/clocksource/arm_arch_timer.c
+++ b/drivers/clocksource/arm_arch_timer.c
@@ -334,7 +334,7 @@ static u64 notrace arm64_858921_read_cntvct_el0(void)
 	do {								\
 		_val = read_sysreg(reg);				\
 		_retries--;						\
-	} while (((_val + 1) & GENMASK(9, 0)) <= 1 && _retries);	\
+	} while (((_val + 1) & GENMASK(8, 0)) <= 1 && _retries);	\
 									\
 	WARN_ON_ONCE(!_retries);					\
 	_val;								\

commit 7cb77faedaf57ebb8b5c80e99264998ac977a257
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Sat Mar 27 22:01:36 2021 +0100

    cpu/hotplug: Cure the cpusets trainwreck
    
    commit b22afcdf04c96ca58327784e280e10288cfd3303 upstream.
    
    Alexey and Joshua tried to solve a cpusets related hotplug problem which is
    user space visible and results in unexpected behaviour for some time after
    a CPU has been plugged in and the corresponding uevent was delivered.
    
    cpusets delegate the hotplug work (rebuilding cpumasks etc.) to a
    workqueue. This is done because the cpusets code has already a lock
    nesting of cgroups_mutex -> cpu_hotplug_lock. A synchronous callback or
    waiting for the work to finish with cpu_hotplug_lock held can and will
    deadlock because that results in the reverse lock order.
    
    As a consequence the uevent can be delivered before cpusets have consistent
    state which means that a user space invocation of sched_setaffinity() to
    move a task to the plugged CPU fails up to the point where the scheduled
    work has been processed.
    
    The same is true for CPU unplug, but that does not create user observable
    failure (yet).
    
    It's still inconsistent to claim that an operation is finished before it
    actually is and that's the real issue at hand. uevents just make it
    reliably observable.
    
    Obviously the problem should be fixed in cpusets/cgroups, but untangling
    that is pretty much impossible because according to the changelog of the
    commit which introduced this 8 years ago:
    
     3a5a6d0c2b03("cpuset: don't nest cgroup_mutex inside get_online_cpus()")
    
    the lock order cgroups_mutex -> cpu_hotplug_lock is a design decision and
    the whole code is built around that.
    
    So bite the bullet and invoke the relevant cpuset function, which waits for
    the work to finish, in _cpu_up/down() after dropping cpu_hotplug_lock and
    only when tasks are not frozen by suspend/hibernate because that would
    obviously wait forever.
    
    Waiting there with cpu_add_remove_lock, which is protecting the present
    and possible CPU maps, held is not a problem at all because neither work
    queues nor cpusets/cgroups have any lockchains related to that lock.
    
    Waiting in the hotplug machinery is not problematic either because there
    are already state callbacks which wait for hardware queues to drain. It
    makes the operations slightly slower, but hotplug is slow anyway.
    
    This ensures that state is consistent before returning from a hotplug
    up/down operation. It's still inconsistent during the operation, but that's
    a different story.
    
    Add a large comment which explains why this is done and why this is not a
    dump ground for the hack of the day to work around half thought out locking
    schemes. Document also the implications vs. hotplug operations and
    serialization or the lack of it.
    
    Thanks to Alexy and Joshua for analyzing why this temporary
    sched_setaffinity() failure happened.
    
    Fixes: 3a5a6d0c2b03("cpuset: don't nest cgroup_mutex inside get_online_cpus()")
    Reported-by: Alexey Klimov <aklimov@redhat.com>
    Reported-by: Joshua Baker <jobaker@redhat.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Alexey Klimov <aklimov@redhat.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/87tuowcnv3.ffs@nanos.tec.linutronix.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/cpu.c b/kernel/cpu.c
index 9a39a24f6025..d6fd362afc81 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -31,6 +31,7 @@
 #include <linux/relay.h>
 #include <linux/slab.h>
 #include <linux/percpu-rwsem.h>
+#include <linux/cpuset.h>
 
 #include <trace/events/power.h>
 #define CREATE_TRACE_POINTS
@@ -775,6 +776,52 @@ void __init cpuhp_threads_init(void)
 	kthread_unpark(this_cpu_read(cpuhp_state.thread));
 }
 
+/*
+ *
+ * Serialize hotplug trainwrecks outside of the cpu_hotplug_lock
+ * protected region.
+ *
+ * The operation is still serialized against concurrent CPU hotplug via
+ * cpu_add_remove_lock, i.e. CPU map protection.  But it is _not_
+ * serialized against other hotplug related activity like adding or
+ * removing of state callbacks and state instances, which invoke either the
+ * startup or the teardown callback of the affected state.
+ *
+ * This is required for subsystems which are unfixable vs. CPU hotplug and
+ * evade lock inversion problems by scheduling work which has to be
+ * completed _before_ cpu_up()/_cpu_down() returns.
+ *
+ * Don't even think about adding anything to this for any new code or even
+ * drivers. It's only purpose is to keep existing lock order trainwrecks
+ * working.
+ *
+ * For cpu_down() there might be valid reasons to finish cleanups which are
+ * not required to be done under cpu_hotplug_lock, but that's a different
+ * story and would be not invoked via this.
+ */
+static void cpu_up_down_serialize_trainwrecks(bool tasks_frozen)
+{
+	/*
+	 * cpusets delegate hotplug operations to a worker to "solve" the
+	 * lock order problems. Wait for the worker, but only if tasks are
+	 * _not_ frozen (suspend, hibernate) as that would wait forever.
+	 *
+	 * The wait is required because otherwise the hotplug operation
+	 * returns with inconsistent state, which could even be observed in
+	 * user space when a new CPU is brought up. The CPU plug uevent
+	 * would be delivered and user space reacting on it would fail to
+	 * move tasks to the newly plugged CPU up to the point where the
+	 * work has finished because up to that point the newly plugged CPU
+	 * is not assignable in cpusets/cgroups. On unplug that's not
+	 * necessarily a visible issue, but it is still inconsistent state,
+	 * which is the real problem which needs to be "fixed". This can't
+	 * prevent the transient state between scheduling the work and
+	 * returning from waiting for it.
+	 */
+	if (!tasks_frozen)
+		cpuset_wait_for_hotplug();
+}
+
 #ifdef CONFIG_HOTPLUG_CPU
 #ifndef arch_clear_mm_cpumask_cpu
 #define arch_clear_mm_cpumask_cpu(cpu, mm) cpumask_clear_cpu(cpu, mm_cpumask(mm))
@@ -1010,6 +1057,7 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen,
 	 */
 	lockup_detector_cleanup();
 	arch_smt_update();
+	cpu_up_down_serialize_trainwrecks(tasks_frozen);
 	return ret;
 }
 
@@ -1145,6 +1193,7 @@ static int _cpu_up(unsigned int cpu, int tasks_frozen, enum cpuhp_state target)
 out:
 	cpus_write_unlock();
 	arch_smt_update();
+	cpu_up_down_serialize_trainwrecks(tasks_frozen);
 	return ret;
 }
 

commit 999daeb164e252d5f2378f03cb996ee4241cb61d
Author: Timo Sigurdsson <public_timo.s@silentcreek.de>
Date:   Mon Jun 14 09:25:39 2021 +0200

    ata: ahci_sunxi: Disable DIPM
    
    commit f6bca4d91b2ea052e917cca3f9d866b5cc1d500a upstream.
    
    DIPM is unsupported or broken on sunxi. Trying to enable the power
    management policy med_power_with_dipm on an Allwinner A20 SoC based board
    leads to immediate I/O errors and the attached SATA disk disappears from
    the /dev filesystem. A reset (power cycle) is required to make the SATA
    controller or disk work again. The A10 and A20 SoC data sheets and manuals
    don't mention DIPM at all [1], so it's fair to assume that it's simply not
    supported. But even if it was, it should be considered broken and best be
    disabled in the ahci_sunxi driver.
    
    [1] https://github.com/allwinner-zh/documents/tree/master/
    
    Fixes: c5754b5220f0 ("ARM: sunxi: Add support for Allwinner SUNXi SoCs sata to ahci_platform")
    Cc: stable@vger.kernel.org
    Signed-off-by: Timo Sigurdsson <public_timo.s@silentcreek.de>
    Tested-by: Timo Sigurdsson <public_timo.s@silentcreek.de>
    Link: https://lore.kernel.org/r/20210614072539.3307-1-public_timo.s@silentcreek.de
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/ata/ahci_sunxi.c b/drivers/ata/ahci_sunxi.c
index 631610b72aa5..64141d10e07f 100644
--- a/drivers/ata/ahci_sunxi.c
+++ b/drivers/ata/ahci_sunxi.c
@@ -165,7 +165,7 @@ static void ahci_sunxi_start_engine(struct ata_port *ap)
 }
 
 static const struct ata_port_info ahci_sunxi_port_info = {
-	.flags		= AHCI_FLAG_COMMON | ATA_FLAG_NCQ,
+	.flags		= AHCI_FLAG_COMMON | ATA_FLAG_NCQ | ATA_FLAG_NO_DIPM,
 	.pio_mask	= ATA_PIO4,
 	.udma_mask	= ATA_UDMA6,
 	.port_ops	= &ahci_platform_ops,

commit f7589b0224e46cdc5fe8f03d7aec08e023b491a9
Author: Christian Löhle <CLoehle@hyperstone.com>
Date:   Wed May 12 16:03:24 2021 +0000

    mmc: core: Allow UHS-I voltage switch for SDSC cards if supported
    
    commit 09247e110b2efce3a104e57e887c373e0a57a412 upstream.
    
    While initializing an UHS-I SD card, the mmc core first tries to switch to
    1.8V I/O voltage, before it continues to change the settings for the bus
    speed mode.
    
    However, the current behaviour in the mmc core is inconsistent and doesn't
    conform to the SD spec. More precisely, an SD card that supports UHS-I must
    set both the SD_OCR_CCS bit and the SD_OCR_S18R bit in the OCR register
    response. When switching to 1.8V I/O the mmc core correctly checks both of
    the bits, but only the SD_OCR_S18R bit when changing the settings for bus
    speed mode.
    
    Rather than actually fixing the code to confirm to the SD spec, let's
    deliberately deviate from it by requiring only the SD_OCR_S18R bit for both
    parts. This enables us to support UHS-I for SDSC cards (outside spec),
    which is actually being supported by some existing SDSC cards. Moreover,
    this fixes the inconsistent behaviour.
    
    Signed-off-by: Christian Loehle <cloehle@hyperstone.com>
    Link: https://lore.kernel.org/r/CWXP265MB26803AE79E0AD5ED083BF2A6C4529@CWXP265MB2680.GBRP265.PROD.OUTLOOK.COM
    Cc: stable@vger.kernel.org
    [Ulf: Rewrote commit message and comments to clarify the changes]
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
index aa3de584b90c..c179c4984e31 100644
--- a/drivers/mmc/core/sd.c
+++ b/drivers/mmc/core/sd.c
@@ -781,11 +781,13 @@ int mmc_sd_get_cid(struct mmc_host *host, u32 ocr, u32 *cid, u32 *rocr)
 		return err;
 
 	/*
-	 * In case CCS and S18A in the response is set, start Signal Voltage
-	 * Switch procedure. SPI mode doesn't support CMD11.
+	 * In case the S18A bit is set in the response, let's start the signal
+	 * voltage switch procedure. SPI mode doesn't support CMD11.
+	 * Note that, according to the spec, the S18A bit is not valid unless
+	 * the CCS bit is set as well. We deliberately deviate from the spec in
+	 * regards to this, which allows UHS-I to be supported for SDSC cards.
 	 */
-	if (!mmc_host_is_spi(host) && rocr &&
-	   ((*rocr & 0x41000000) == 0x41000000)) {
+	if (!mmc_host_is_spi(host) && rocr && (*rocr & 0x01000000)) {
 		err = mmc_set_uhs_voltage(host, pocr);
 		if (err == -EAGAIN) {
 			retries--;

commit fdfa7b1008d9f7258818221d7500da9e0f848f50
Author: Wolfram Sang <wsa+renesas@sang-engineering.com>
Date:   Thu Jun 24 17:16:14 2021 +0200

    mmc: core: clear flags before allowing to retune
    
    commit 77347eda64ed5c9383961d1de9165f9d0b7d8df6 upstream.
    
    It might be that something goes wrong during tuning so the MMC core will
    immediately trigger a retune. In our case it was:
    
     - we sent a tuning block
     - there was an error so we need to send an abort cmd to the eMMC
     - the abort cmd had a CRC error
     - retune was set by the MMC core
    
    This lead to a vicious circle causing a performance regression of 75%.
    So, clear retuning flags before we enable retuning to start with a known
    cleared state.
    
    Reported-by Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
    Suggested-by: Adrian Hunter <adrian.hunter@intel.com>
    Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
    Acked-by: Adrian Hunter <adrian.hunter@intel.com>
    Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
    Tested-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
    Fixes: bd11e8bd03ca ("mmc: core: Flag re-tuning is needed on CRC errors")
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210624151616.38770-2-wsa+renesas@sang-engineering.com
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index 798bcb65b4df..e340791a8eab 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -980,11 +980,14 @@ int mmc_execute_tuning(struct mmc_card *card)
 
 	err = host->ops->execute_tuning(host, opcode);
 
-	if (err)
+	if (err) {
 		pr_err("%s: tuning execution failed: %d\n",
 			mmc_hostname(host), err);
-	else
+	} else {
+		host->retune_now = 0;
+		host->need_retune = 0;
 		mmc_retune_enable(host);
+	}
 
 	return err;
 }

commit 357251e565560e014acb9180ec9093fc2156241f
Author: Al Cooper <alcooperx@gmail.com>
Date:   Thu Jun 24 12:30:45 2021 -0400

    mmc: sdhci: Fix warning message when accessing RPMB in HS400 mode
    
    commit d0244847f9fc5e20df8b7483c8a4717fe0432d38 upstream.
    
    When an eMMC device is being run in HS400 mode, any access to the
    RPMB device will cause the error message "mmc1: Invalid UHS-I mode
    selected". This happens as a result of tuning being disabled before
    RPMB access and then re-enabled after the RPMB access is complete.
    When tuning is re-enabled, the system has to switch from HS400
    to HS200 to do the tuning and then back to HS400. As part of
    sequence to switch from HS400 to HS200 the system is temporarily
    put into HS mode. When switching to HS mode, sdhci_get_preset_value()
    is called and does not have support for HS mode and prints the warning
    message and returns the preset for SDR12. The fix is to add support
    for MMC and SD HS modes to sdhci_get_preset_value().
    
    This can be reproduced on any system running eMMC in HS400 mode
    (not HS400ES) by using the "mmc" utility to run the following
    command: "mmc rpmb read-counter /dev/mmcblk0rpmb".
    
    Signed-off-by: Al Cooper <alcooperx@gmail.com>
    Acked-by: Adrian Hunter <adrian.hunter@intel.com>
    Fixes: 52983382c74f ("mmc: sdhci: enhance preset value function")
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210624163045.33651-1-alcooperx@gmail.com
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 499a3d2a8e31..5cb7c2cc501a 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1371,6 +1371,10 @@ static u16 sdhci_get_preset_value(struct sdhci_host *host)
 	u16 preset = 0;
 
 	switch (host->timing) {
+	case MMC_TIMING_MMC_HS:
+	case MMC_TIMING_SD_HS:
+		preset = sdhci_readw(host, SDHCI_PRESET_FOR_HIGH_SPEED);
+		break;
 	case MMC_TIMING_UHS_SDR12:
 		preset = sdhci_readw(host, SDHCI_PRESET_FOR_SDR12);
 		break;
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
index c0372e3443fd..2959fed39a38 100644
--- a/drivers/mmc/host/sdhci.h
+++ b/drivers/mmc/host/sdhci.h
@@ -252,6 +252,7 @@
 
 /* 60-FB reserved */
 
+#define SDHCI_PRESET_FOR_HIGH_SPEED	0x64
 #define SDHCI_PRESET_FOR_SDR12 0x66
 #define SDHCI_PRESET_FOR_SDR25 0x68
 #define SDHCI_PRESET_FOR_SDR50 0x6A

commit 5792b74025cd4a80377057b55bc27c3f68c15a7d
Author: Daniel Vetter <daniel.vetter@ffwll.ch>
Date:   Tue Apr 27 11:20:15 2021 +0200

    drm/msm/mdp4: Fix modifier support enabling
    
    commit 35cbb8c91e9cf310277d3dfb4d046df8edf2df33 upstream.
    
    Setting the cap without the modifier list is very confusing to
    userspace. Fix that by listing the ones we support explicitly.
    
    Stable backport so that userspace can rely on this working in a
    reasonable way, i.e. that the cap set implies IN_FORMATS is available.
    
    Acked-by: Pekka Paalanen <pekka.paalanen@collabora.com>
    Reviewed-by: Lyude Paul <lyude@redhat.com>
    Cc: stable@vger.kernel.org
    Cc: Pekka Paalanen <pekka.paalanen@collabora.com>
    Cc: Rob Clark <robdclark@chromium.org>
    Cc: Jordan Crouse <jordan@cosmicpenguin.net>
    Cc: Emil Velikov <emil.velikov@collabora.com>
    Cc: Sam Ravnborg <sam@ravnborg.org>
    Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20210427092018.832258-5-daniel.vetter@ffwll.ch
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
index 44d1cda56974..9b2b8fa76f94 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
@@ -96,8 +96,6 @@ static int mdp4_hw_init(struct msm_kms *kms)
 	if (mdp4_kms->rev > 1)
 		mdp4_write(mdp4_kms, REG_MDP4_RESET_STATUS, 1);
 
-	dev->mode_config.allow_fb_modifiers = true;
-
 out:
 	pm_runtime_put_sync(dev->dev);
 
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_plane.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_plane.c
index 79ff653d8081..f4dacd3b4311 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_plane.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_plane.c
@@ -356,6 +356,12 @@ enum mdp4_pipe mdp4_plane_pipe(struct drm_plane *plane)
 	return mdp4_plane->pipe;
 }
 
+static const uint64_t supported_format_modifiers[] = {
+	DRM_FORMAT_MOD_SAMSUNG_64_32_TILE,
+	DRM_FORMAT_MOD_LINEAR,
+	DRM_FORMAT_MOD_INVALID
+};
+
 /* initialize plane */
 struct drm_plane *mdp4_plane_init(struct drm_device *dev,
 		enum mdp4_pipe pipe_id, bool private_plane)
@@ -384,7 +390,7 @@ struct drm_plane *mdp4_plane_init(struct drm_device *dev,
 	type = private_plane ? DRM_PLANE_TYPE_PRIMARY : DRM_PLANE_TYPE_OVERLAY;
 	ret = drm_universal_plane_init(dev, plane, 0xff, &mdp4_plane_funcs,
 				 mdp4_plane->formats, mdp4_plane->nformats,
-				 NULL, type, NULL);
+				 supported_format_modifiers, type, NULL);
 	if (ret)
 		goto fail;
 

commit 3b52ba58f14032cc649396994c1236587c9da400
Author: Maximilian Luz <luzmaximilian@gmail.com>
Date:   Wed May 12 23:03:16 2021 +0200

    pinctrl/amd: Add device HID for new AMD GPIO controller
    
    commit 1ca46d3e43569186bd1decfb02a6b4c4ddb4304b upstream.
    
    Add device HID AMDI0031 to the AMD GPIO controller driver match table.
    This controller can be found on Microsoft Surface Laptop 4 devices and
    seems similar enough that we can just copy the existing AMDI0030 entry.
    
    Cc: <stable@vger.kernel.org> # 5.10+
    Tested-by: Sachi King <nakato@nakato.io>
    Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com>
    Link: https://lore.kernel.org/r/20210512210316.1982416-1-luzmaximilian@gmail.com
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pinctrl/pinctrl-amd.c b/drivers/pinctrl/pinctrl-amd.c
index d9b9c11c7f8f..8d2dbf607bd1 100644
--- a/drivers/pinctrl/pinctrl-amd.c
+++ b/drivers/pinctrl/pinctrl-amd.c
@@ -966,6 +966,7 @@ static int amd_gpio_remove(struct platform_device *pdev)
 static const struct acpi_device_id amd_gpio_acpi_match[] = {
 	{ "AMD0030", 0 },
 	{ "AMDI0030", 0},
+	{ "AMDI0031", 0},
 	{ },
 };
 MODULE_DEVICE_TABLE(acpi, amd_gpio_acpi_match);

commit 39f93baead1e8af115b4be180031162d09f77e32
Author: Guchun Chen <guchun.chen@amd.com>
Date:   Mon Jun 28 17:03:48 2021 +0800

    drm/amd/display: fix incorrrect valid irq check
    
    commit e38ca7e422791a4d1c01e56dbf7f9982db0ed365 upstream.
    
    valid DAL irq should be < DAL_IRQ_SOURCES_NUMBER.
    
    Signed-off-by: Guchun Chen <guchun.chen@amd.com>
    Reviewed-and-tested-by: Evan Quan <evan.quan@amd.com>
    Reviewed-by: Harry Wentland <harry.wentland@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/amd/display/dc/irq_types.h b/drivers/gpu/drm/amd/display/dc/irq_types.h
index 0b5f3a278c22..24c38dac597b 100644
--- a/drivers/gpu/drm/amd/display/dc/irq_types.h
+++ b/drivers/gpu/drm/amd/display/dc/irq_types.h
@@ -155,7 +155,7 @@ enum irq_type
 };
 
 #define DAL_VALID_IRQ_SRC_NUM(src) \
-	((src) <= DAL_IRQ_SOURCES_NUMBER && (src) > DC_IRQ_SOURCE_INVALID)
+	((src) < DAL_IRQ_SOURCES_NUMBER && (src) > DC_IRQ_SOURCE_INVALID)
 
 /* Number of Page Flip IRQ Sources. */
 #define DAL_PFLIP_IRQ_SRC_NUM \

commit bde0f98f32bee955c4f83ae6683459244abff7e6
Author: Jing Xiangfeng <jingxiangfeng@huawei.com>
Date:   Tue Jun 29 19:44:55 2021 +0800

    drm/radeon: Add the missed drm_gem_object_put() in radeon_user_framebuffer_create()
    
    commit 9ba85914c36c8fed9bf3e8b69c0782908c1247b7 upstream.
    
    radeon_user_framebuffer_create() misses to call drm_gem_object_put() in
    an error path. Add the missed function call to fix it.
    
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Jing Xiangfeng <jingxiangfeng@huawei.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
index 3f0f3a578ddf..5985efc5a1f3 100644
--- a/drivers/gpu/drm/radeon/radeon_display.c
+++ b/drivers/gpu/drm/radeon/radeon_display.c
@@ -1327,6 +1327,7 @@ radeon_user_framebuffer_create(struct drm_device *dev,
 	/* Handle is imported dma-buf, so cannot be migrated to VRAM for scanout */
 	if (obj->import_attach) {
 		DRM_DEBUG_KMS("Cannot create framebuffer from imported dma_buf\n");
+		drm_gem_object_put(obj);
 		return ERR_PTR(-EINVAL);
 	}
 

commit 86f8b0e62ac7cac4423d48ca3d3ba38f2dc5c80d
Author: Andrew Gabbasov <andrew_gabbasov@mentor.com>
Date:   Thu Jun 3 12:15:07 2021 -0500

    usb: gadget: f_fs: Fix setting of device and driver data cross-references
    
    commit ecfbd7b9054bddb12cea07fda41bb3a79a7b0149 upstream.
    
    FunctionFS device structure 'struct ffs_dev' and driver data structure
    'struct ffs_data' are bound to each other with cross-reference pointers
    'ffs_data->private_data' and 'ffs_dev->ffs_data'. While the first one
    is supposed to be valid through the whole life of 'struct ffs_data'
    (and while 'struct ffs_dev' exists non-freed), the second one is cleared
    in 'ffs_closed()' (called from 'ffs_data_reset()' or the last
    'ffs_data_put()'). This can be called several times, alternating in
    different order with 'ffs_free_inst()', that, if possible, clears
    the other cross-reference.
    
    As a result, different cases of these calls order may leave stale
    cross-reference pointers, used when the pointed structure is already
    freed. Even if it occasionally doesn't cause kernel crash, this error
    is reported by KASAN-enabled kernel configuration.
    
    For example, the case [last 'ffs_data_put()' - 'ffs_free_inst()'] was
    fixed by commit cdafb6d8b8da ("usb: gadget: f_fs: Fix use-after-free in
    ffs_free_inst").
    
    The other case ['ffs_data_reset()' - 'ffs_free_inst()' - 'ffs_data_put()']
    now causes KASAN reported error [1], when 'ffs_data_reset()' clears
    'ffs_dev->ffs_data', then 'ffs_free_inst()' frees the 'struct ffs_dev',
    but can't clear 'ffs_data->private_data', which is then accessed
    in 'ffs_closed()' called from 'ffs_data_put()'. This happens since
    'ffs_dev->ffs_data' reference is cleared too early.
    
    Moreover, one more use case, when 'ffs_free_inst()' is called immediately
    after mounting FunctionFS device (that is before the descriptors are
    written and 'ffs_ready()' is called), and then 'ffs_data_reset()'
    or 'ffs_data_put()' is called from accessing "ep0" file or unmounting
    the device. This causes KASAN error report like [2], since
    'ffs_dev->ffs_data' is not yet set when 'ffs_free_inst()' can't properly
    clear 'ffs_data->private_data', that is later accessed to freed structure.
    
    Fix these (and may be other) cases of stale pointers access by moving
    setting and clearing of the mentioned cross-references to the single
    places, setting both of them when 'struct ffs_data' is created and
    bound to 'struct ffs_dev', and clearing both of them when one of the
    structures is destroyed. It seems convenient to make this pointer
    initialization and structures binding in 'ffs_acquire_dev()' and
    make pointers clearing in 'ffs_release_dev()'. This required some
    changes in these functions parameters and return types.
    
    Also, 'ffs_release_dev()' calling requires some cleanup, fixing minor
    issues, like (1) 'ffs_release_dev()' is not called if 'ffs_free_inst()'
    is called without unmounting the device, and "release_dev" callback
    is not called at all, or (2) "release_dev" callback is called before
    "ffs_closed" callback on unmounting, which seems to be not correctly
    nested with "acquire_dev" and "ffs_ready" callbacks.
    Make this cleanup togther with other mentioned 'ffs_release_dev()' changes.
    
    [1]
    ==================================================================
    root@rcar-gen3:~# mkdir /dev/cfs
    root@rcar-gen3:~# mkdir /dev/ffs
    root@rcar-gen3:~# modprobe libcomposite
    root@rcar-gen3:~# mount -t configfs none /dev/cfs
    root@rcar-gen3:~# mkdir /dev/cfs/usb_gadget/g1
    root@rcar-gen3:~# mkdir /dev/cfs/usb_gadget/g1/functions/ffs.ffs
    [   64.340664] file system registered
    root@rcar-gen3:~# mount -t functionfs ffs /dev/ffs
    root@rcar-gen3:~# cd /dev/ffs
    root@rcar-gen3:/dev/ffs# /home/root/ffs-test
    ffs-test: info: ep0: writing descriptors (in v2 format)
    [   83.181442] read descriptors
    [   83.186085] read strings
    ffs-test: info: ep0: writing strings
    ffs-test: dbg:  ep1: starting
    ffs-test: dbg:  ep2: starting
    ffs-test: info: ep1: starts
    ffs-test: info: ep2: starts
    ffs-test: info: ep0: starts
    
    ^C
    root@rcar-gen3:/dev/ffs# cd /home/root/
    root@rcar-gen3:~# rmdir /dev/cfs/usb_gadget/g1/functions/ffs.ffs
    [   98.935061] unloading
    root@rcar-gen3:~# umount /dev/ffs
    [  102.734301] ==================================================================
    [  102.742059] BUG: KASAN: use-after-free in ffs_release_dev+0x64/0xa8 [usb_f_fs]
    [  102.749683] Write of size 1 at addr ffff0004d46ff549 by task umount/2997
    [  102.756709]
    [  102.758311] CPU: 0 PID: 2997 Comm: umount Not tainted 5.13.0-rc4+ #8
    [  102.764971] Hardware name: Renesas Salvator-X board based on r8a77951 (DT)
    [  102.772179] Call trace:
    [  102.774779]  dump_backtrace+0x0/0x330
    [  102.778653]  show_stack+0x20/0x2c
    [  102.782152]  dump_stack+0x11c/0x1ac
    [  102.785833]  print_address_description.constprop.0+0x30/0x274
    [  102.791862]  kasan_report+0x14c/0x1c8
    [  102.795719]  __asan_report_store1_noabort+0x34/0x58
    [  102.800840]  ffs_release_dev+0x64/0xa8 [usb_f_fs]
    [  102.805801]  ffs_fs_kill_sb+0x50/0x84 [usb_f_fs]
    [  102.810663]  deactivate_locked_super+0xa0/0xf0
    [  102.815339]  deactivate_super+0x98/0xac
    [  102.819378]  cleanup_mnt+0xd0/0x1b0
    [  102.823057]  __cleanup_mnt+0x1c/0x28
    [  102.826823]  task_work_run+0x104/0x180
    [  102.830774]  do_notify_resume+0x458/0x14e0
    [  102.835083]  work_pending+0xc/0x5f8
    [  102.838762]
    [  102.840357] Allocated by task 2988:
    [  102.844032]  kasan_save_stack+0x28/0x58
    [  102.848071]  kasan_set_track+0x28/0x3c
    [  102.852016]  ____kasan_kmalloc+0x84/0x9c
    [  102.856142]  __kasan_kmalloc+0x10/0x1c
    [  102.860088]  __kmalloc+0x214/0x2f8
    [  102.863678]  kzalloc.constprop.0+0x14/0x20 [usb_f_fs]
    [  102.868990]  ffs_alloc_inst+0x8c/0x208 [usb_f_fs]
    [  102.873942]  try_get_usb_function_instance+0xf0/0x164 [libcomposite]
    [  102.880629]  usb_get_function_instance+0x64/0x68 [libcomposite]
    [  102.886858]  function_make+0x128/0x1ec [libcomposite]
    [  102.892185]  configfs_mkdir+0x330/0x590 [configfs]
    [  102.897245]  vfs_mkdir+0x12c/0x1bc
    [  102.900835]  do_mkdirat+0x180/0x1d0
    [  102.904513]  __arm64_sys_mkdirat+0x80/0x94
    [  102.908822]  invoke_syscall+0xf8/0x25c
    [  102.912772]  el0_svc_common.constprop.0+0x150/0x1a0
    [  102.917891]  do_el0_svc+0xa0/0xd4
    [  102.921386]  el0_svc+0x24/0x34
    [  102.924613]  el0_sync_handler+0xcc/0x154
    [  102.928743]  el0_sync+0x198/0x1c0
    [  102.932238]
    [  102.933832] Freed by task 2996:
    [  102.937144]  kasan_save_stack+0x28/0x58
    [  102.941181]  kasan_set_track+0x28/0x3c
    [  102.945128]  kasan_set_free_info+0x28/0x4c
    [  102.949435]  ____kasan_slab_free+0x104/0x118
    [  102.953921]  __kasan_slab_free+0x18/0x24
    [  102.958047]  slab_free_freelist_hook+0x148/0x1f0
    [  102.962897]  kfree+0x318/0x440
    [  102.966123]  ffs_free_inst+0x164/0x2d8 [usb_f_fs]
    [  102.971075]  usb_put_function_instance+0x84/0xa4 [libcomposite]
    [  102.977302]  ffs_attr_release+0x18/0x24 [usb_f_fs]
    [  102.982344]  config_item_put+0x140/0x1a4 [configfs]
    [  102.987486]  configfs_rmdir+0x3fc/0x518 [configfs]
    [  102.992535]  vfs_rmdir+0x114/0x234
    [  102.996122]  do_rmdir+0x274/0x2b0
    [  102.999617]  __arm64_sys_unlinkat+0x94/0xc8
    [  103.004015]  invoke_syscall+0xf8/0x25c
    [  103.007961]  el0_svc_common.constprop.0+0x150/0x1a0
    [  103.013080]  do_el0_svc+0xa0/0xd4
    [  103.016575]  el0_svc+0x24/0x34
    [  103.019801]  el0_sync_handler+0xcc/0x154
    [  103.023930]  el0_sync+0x198/0x1c0
    [  103.027426]
    [  103.029020] The buggy address belongs to the object at ffff0004d46ff500
    [  103.029020]  which belongs to the cache kmalloc-128 of size 128
    [  103.042079] The buggy address is located 73 bytes inside of
    [  103.042079]  128-byte region [ffff0004d46ff500, ffff0004d46ff580)
    [  103.054236] The buggy address belongs to the page:
    [  103.059262] page:0000000021aa849b refcount:1 mapcount:0 mapping:0000000000000000 index:0xffff0004d46fee00 pfn:0x5146fe
    [  103.070437] head:0000000021aa849b order:1 compound_mapcount:0
    [  103.076456] flags: 0x8000000000010200(slab|head|zone=2)
    [  103.081948] raw: 8000000000010200 fffffc0013521a80 0000000d0000000d ffff0004c0002300
    [  103.090052] raw: ffff0004d46fee00 000000008020001e 00000001ffffffff 0000000000000000
    [  103.098150] page dumped because: kasan: bad access detected
    [  103.103985]
    [  103.105578] Memory state around the buggy address:
    [  103.110602]  ffff0004d46ff400: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [  103.118161]  ffff0004d46ff480: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    [  103.125726] >ffff0004d46ff500: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [  103.133284]                                               ^
    [  103.139120]  ffff0004d46ff580: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    [  103.146679]  ffff0004d46ff600: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [  103.154238] ==================================================================
    [  103.161792] Disabling lock debugging due to kernel taint
    [  103.167319] Unable to handle kernel paging request at virtual address 0037801d6000018e
    [  103.175406] Mem abort info:
    [  103.178457]   ESR = 0x96000004
    [  103.181609]   EC = 0x25: DABT (current EL), IL = 32 bits
    [  103.187020]   SET = 0, FnV = 0
    [  103.190185]   EA = 0, S1PTW = 0
    [  103.193417] Data abort info:
    [  103.196385]   ISV = 0, ISS = 0x00000004
    [  103.200315]   CM = 0, WnR = 0
    [  103.203366] [0037801d6000018e] address between user and kernel address ranges
    [  103.210611] Internal error: Oops: 96000004 [#1] PREEMPT SMP
    [  103.216231] Modules linked in: usb_f_fs libcomposite configfs ath9k_htc led_class mac80211 libarc4 ath9k_common ath9k_hw ath cfg80211 aes_ce_blk sata_rc4
    [  103.259233] CPU: 0 PID: 2997 Comm: umount Tainted: G    B             5.13.0-rc4+ #8
    [  103.267031] Hardware name: Renesas Salvator-X board based on r8a77951 (DT)
    [  103.273951] pstate: 00000005 (nzcv daif -PAN -UAO -TCO BTYPE=--)
    [  103.280001] pc : ffs_data_clear+0x138/0x370 [usb_f_fs]
    [  103.285197] lr : ffs_data_clear+0x124/0x370 [usb_f_fs]
    [  103.290385] sp : ffff800014777a80
    [  103.293725] x29: ffff800014777a80 x28: ffff0004d7649c80 x27: 0000000000000000
    [  103.300931] x26: ffff800014777fb0 x25: ffff60009aec9394 x24: ffff0004d7649ca4
    [  103.308136] x23: 1fffe0009a3d063a x22: dfff800000000000 x21: ffff0004d1e831d0
    [  103.315340] x20: e1c000eb00000bb4 x19: ffff0004d1e83000 x18: 0000000000000000
    [  103.322545] x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000000
    [  103.329748] x14: 0720072007200720 x13: 0720072007200720 x12: 1ffff000012ef658
    [  103.336952] x11: ffff7000012ef658 x10: 0720072007200720 x9 : ffff800011322648
    [  103.344157] x8 : ffff800014777818 x7 : ffff80000977b2c7 x6 : 0000000000000000
    [  103.351359] x5 : 0000000000000001 x4 : ffff7000012ef659 x3 : 0000000000000001
    [  103.358562] x2 : 0000000000000000 x1 : 1c38001d6000018e x0 : e1c000eb00000c70
    [  103.365766] Call trace:
    [  103.368235]  ffs_data_clear+0x138/0x370 [usb_f_fs]
    [  103.373076]  ffs_data_reset+0x20/0x304 [usb_f_fs]
    [  103.377829]  ffs_data_closed+0x1ec/0x244 [usb_f_fs]
    [  103.382755]  ffs_fs_kill_sb+0x70/0x84 [usb_f_fs]
    [  103.387420]  deactivate_locked_super+0xa0/0xf0
    [  103.391905]  deactivate_super+0x98/0xac
    [  103.395776]  cleanup_mnt+0xd0/0x1b0
    [  103.399299]  __cleanup_mnt+0x1c/0x28
    [  103.402906]  task_work_run+0x104/0x180
    [  103.406691]  do_notify_resume+0x458/0x14e0
    [  103.410823]  work_pending+0xc/0x5f8
    [  103.414351] Code: b4000a54 9102f280 12000802 d343fc01 (38f66821)
    [  103.420490] ---[ end trace 57b43a50e8244f57 ]---
    Segmentation fault
    root@rcar-gen3:~#
    ==================================================================
    
    [2]
    ==================================================================
    root@rcar-gen3:~# mkdir /dev/ffs
    root@rcar-gen3:~# modprobe libcomposite
    root@rcar-gen3:~#
    root@rcar-gen3:~# mount -t configfs none /dev/cfs
    root@rcar-gen3:~# mkdir /dev/cfs/usb_gadget/g1
    root@rcar-gen3:~# mkdir /dev/cfs/usb_gadget/g1/functions/ffs.ffs
    [   54.766480] file system registered
    root@rcar-gen3:~# mount -t functionfs ffs /dev/ffs
    root@rcar-gen3:~# rmdir /dev/cfs/usb_gadget/g1/functions/ffs.ffs
    [   63.197597] unloading
    root@rcar-gen3:~# cat /dev/ffs/ep0
    cat: read error:[   67.213506] ==================================================================
    [   67.222095] BUG: KASAN: use-after-free in ffs_data_clear+0x70/0x370 [usb_f_fs]
    [   67.229699] Write of size 1 at addr ffff0004c26e974a by task cat/2994
    [   67.236446]
    [   67.238045] CPU: 0 PID: 2994 Comm: cat Not tainted 5.13.0-rc4+ #8
    [   67.244431] Hardware name: Renesas Salvator-X board based on r8a77951 (DT)
    [   67.251624] Call trace:
    [   67.254212]  dump_backtrace+0x0/0x330
    [   67.258081]  show_stack+0x20/0x2c
    [   67.261579]  dump_stack+0x11c/0x1ac
    [   67.265260]  print_address_description.constprop.0+0x30/0x274
    [   67.271286]  kasan_report+0x14c/0x1c8
    [   67.275143]  __asan_report_store1_noabort+0x34/0x58
    [   67.280265]  ffs_data_clear+0x70/0x370 [usb_f_fs]
    [   67.285220]  ffs_data_reset+0x20/0x304 [usb_f_fs]
    [   67.290172]  ffs_data_closed+0x240/0x244 [usb_f_fs]
    [   67.295305]  ffs_ep0_release+0x40/0x54 [usb_f_fs]
    [   67.300256]  __fput+0x304/0x580
    [   67.303576]  ____fput+0x18/0x24
    [   67.306893]  task_work_run+0x104/0x180
    [   67.310846]  do_notify_resume+0x458/0x14e0
    [   67.315154]  work_pending+0xc/0x5f8
    [   67.318834]
    [   67.320429] Allocated by task 2988:
    [   67.324105]  kasan_save_stack+0x28/0x58
    [   67.328144]  kasan_set_track+0x28/0x3c
    [   67.332090]  ____kasan_kmalloc+0x84/0x9c
    [   67.336217]  __kasan_kmalloc+0x10/0x1c
    [   67.340163]  __kmalloc+0x214/0x2f8
    [   67.343754]  kzalloc.constprop.0+0x14/0x20 [usb_f_fs]
    [   67.349066]  ffs_alloc_inst+0x8c/0x208 [usb_f_fs]
    [   67.354017]  try_get_usb_function_instance+0xf0/0x164 [libcomposite]
    [   67.360705]  usb_get_function_instance+0x64/0x68 [libcomposite]
    [   67.366934]  function_make+0x128/0x1ec [libcomposite]
    [   67.372260]  configfs_mkdir+0x330/0x590 [configfs]
    [   67.377320]  vfs_mkdir+0x12c/0x1bc
    [   67.380911]  do_mkdirat+0x180/0x1d0
    [   67.384589]  __arm64_sys_mkdirat+0x80/0x94
    [   67.388899]  invoke_syscall+0xf8/0x25c
    [   67.392850]  el0_svc_common.constprop.0+0x150/0x1a0
    [   67.397969]  do_el0_svc+0xa0/0xd4
    [   67.401464]  el0_svc+0x24/0x34
    [   67.404691]  el0_sync_handler+0xcc/0x154
    [   67.408819]  el0_sync+0x198/0x1c0
    [   67.412315]
    [   67.413909] Freed by task 2993:
    [   67.417220]  kasan_save_stack+0x28/0x58
    [   67.421257]  kasan_set_track+0x28/0x3c
    [   67.425204]  kasan_set_free_info+0x28/0x4c
    [   67.429513]  ____kasan_slab_free+0x104/0x118
    [   67.434001]  __kasan_slab_free+0x18/0x24
    [   67.438128]  slab_free_freelist_hook+0x148/0x1f0
    [   67.442978]  kfree+0x318/0x440
    [   67.446205]  ffs_free_inst+0x164/0x2d8 [usb_f_fs]
    [   67.451156]  usb_put_function_instance+0x84/0xa4 [libcomposite]
    [   67.457385]  ffs_attr_release+0x18/0x24 [usb_f_fs]
    [   67.462428]  config_item_put+0x140/0x1a4 [configfs]
    [   67.467570]  configfs_rmdir+0x3fc/0x518 [configfs]
    [   67.472626]  vfs_rmdir+0x114/0x234
    [   67.476215]  do_rmdir+0x274/0x2b0
    [   67.479710]  __arm64_sys_unlinkat+0x94/0xc8
    [   67.484108]  invoke_syscall+0xf8/0x25c
    [   67.488055]  el0_svc_common.constprop.0+0x150/0x1a0
    [   67.493175]  do_el0_svc+0xa0/0xd4
    [   67.496671]  el0_svc+0x24/0x34
    [   67.499896]  el0_sync_handler+0xcc/0x154
    [   67.504024]  el0_sync+0x198/0x1c0
    [   67.507520]
    [   67.509114] The buggy address belongs to the object at ffff0004c26e9700
    [   67.509114]  which belongs to the cache kmalloc-128 of size 128
    [   67.522171] The buggy address is located 74 bytes inside of
    [   67.522171]  128-byte region [ffff0004c26e9700, ffff0004c26e9780)
    [   67.534328] The buggy address belongs to the page:
    [   67.539355] page:000000003177a217 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x5026e8
    [   67.549175] head:000000003177a217 order:1 compound_mapcount:0
    [   67.555195] flags: 0x8000000000010200(slab|head|zone=2)
    [   67.560687] raw: 8000000000010200 fffffc0013037100 0000000c00000002 ffff0004c0002300
    [   67.568791] raw: 0000000000000000 0000000080200020 00000001ffffffff 0000000000000000
    [   67.576890] page dumped because: kasan: bad access detected
    [   67.582725]
    [   67.584318] Memory state around the buggy address:
    [   67.589343]  ffff0004c26e9600: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [   67.596903]  ffff0004c26e9680: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    [   67.604463] >ffff0004c26e9700: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [   67.612022]                                               ^
    [   67.617860]  ffff0004c26e9780: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    [   67.625421]  ffff0004c26e9800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    [   67.632981] ==================================================================
    [   67.640535] Disabling lock debugging due to kernel taint
     File descriptor[   67.646100] Unable to handle kernel paging request at virtual address fabb801d4000018d
     in bad state
    [   67.655456] Mem abort info:
    [   67.659619]   ESR = 0x96000004
    [   67.662801]   EC = 0x25: DABT (current EL), IL = 32 bits
    [   67.668225]   SET = 0, FnV = 0
    [   67.671375]   EA = 0, S1PTW = 0
    [   67.674613] Data abort info:
    [   67.677587]   ISV = 0, ISS = 0x00000004
    [   67.681522]   CM = 0, WnR = 0
    [   67.684588] [fabb801d4000018d] address between user and kernel address ranges
    [   67.691849] Internal error: Oops: 96000004 [#1] PREEMPT SMP
    [   67.697470] Modules linked in: usb_f_fs libcomposite configfs ath9k_htc led_class mac80211 libarc4 ath9k_common ath9k_hw ath cfg80211 aes_ce_blk crypto_simd cryptd aes_ce_cipher ghash_ce gf128mul sha2_ce sha1_ce evdev sata_rcar libata xhci_plat_hcd scsi_mod xhci_hcd rene4
    [   67.740467] CPU: 0 PID: 2994 Comm: cat Tainted: G    B             5.13.0-rc4+ #8
    [   67.748005] Hardware name: Renesas Salvator-X board based on r8a77951 (DT)
    [   67.754924] pstate: 00000005 (nzcv daif -PAN -UAO -TCO BTYPE=--)
    [   67.760974] pc : ffs_data_clear+0x138/0x370 [usb_f_fs]
    [   67.766178] lr : ffs_data_clear+0x124/0x370 [usb_f_fs]
    [   67.771365] sp : ffff800014767ad0
    [   67.774706] x29: ffff800014767ad0 x28: ffff800009cf91c0 x27: ffff0004c54861a0
    [   67.781913] x26: ffff0004dc90b288 x25: 1fffe00099ec10f5 x24: 00000000000a801d
    [   67.789118] x23: 1fffe00099f6953a x22: dfff800000000000 x21: ffff0004cfb4a9d0
    [   67.796322] x20: d5e000ea00000bb1 x19: ffff0004cfb4a800 x18: 0000000000000000
    [   67.803526] x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000000
    [   67.810730] x14: 0720072007200720 x13: 0720072007200720 x12: 1ffff000028ecefa
    [   67.817934] x11: ffff7000028ecefa x10: 0720072007200720 x9 : ffff80001132c014
    [   67.825137] x8 : ffff8000147677d8 x7 : ffff8000147677d7 x6 : 0000000000000000
    [   67.832341] x5 : 0000000000000001 x4 : ffff7000028ecefb x3 : 0000000000000001
    [   67.839544] x2 : 0000000000000005 x1 : 1abc001d4000018d x0 : d5e000ea00000c6d
    [   67.846748] Call trace:
    [   67.849218]  ffs_data_clear+0x138/0x370 [usb_f_fs]
    [   67.854058]  ffs_data_reset+0x20/0x304 [usb_f_fs]
    [   67.858810]  ffs_data_closed+0x240/0x244 [usb_f_fs]
    [   67.863736]  ffs_ep0_release+0x40/0x54 [usb_f_fs]
    [   67.868488]  __fput+0x304/0x580
    [   67.871665]  ____fput+0x18/0x24
    [   67.874837]  task_work_run+0x104/0x180
    [   67.878622]  do_notify_resume+0x458/0x14e0
    [   67.882754]  work_pending+0xc/0x5f8
    [   67.886282] Code: b4000a54 9102f280 12000802 d343fc01 (38f66821)
    [   67.892422] ---[ end trace 6d7cedf53d7abbea ]---
    Segmentation fault
    root@rcar-gen3:~#
    ==================================================================
    
    Fixes: 4b187fceec3c ("usb: gadget: FunctionFS: add devices management code")
    Fixes: 3262ad824307 ("usb: gadget: f_fs: Stop ffs_closed NULL pointer dereference")
    Fixes: cdafb6d8b8da ("usb: gadget: f_fs: Fix use-after-free in ffs_free_inst")
    Reported-by: Bhuvanesh Surachari <bhuvanesh_surachari@mentor.com>
    Tested-by: Eugeniu Rosca <erosca@de.adit-jv.com>
    Reviewed-by: Eugeniu Rosca <erosca@de.adit-jv.com>
    Signed-off-by: Andrew Gabbasov <andrew_gabbasov@mentor.com>
    Link: https://lore.kernel.org/r/20210603171507.22514-1-andrew_gabbasov@mentor.com
    [agabbasov: Backported to earlier mount API, resolved context conflicts]
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c
index f13ec86371e7..e6805492409f 100644
--- a/drivers/usb/gadget/function/f_fs.c
+++ b/drivers/usb/gadget/function/f_fs.c
@@ -243,8 +243,8 @@ EXPORT_SYMBOL_GPL(ffs_lock);
 static struct ffs_dev *_ffs_find_dev(const char *name);
 static struct ffs_dev *_ffs_alloc_dev(void);
 static void _ffs_free_dev(struct ffs_dev *dev);
-static void *ffs_acquire_dev(const char *dev_name);
-static void ffs_release_dev(struct ffs_data *ffs_data);
+static int ffs_acquire_dev(const char *dev_name, struct ffs_data *ffs_data);
+static void ffs_release_dev(struct ffs_dev *ffs_dev);
 static int ffs_ready(struct ffs_data *ffs);
 static void ffs_closed(struct ffs_data *ffs);
 
@@ -1515,7 +1515,6 @@ ffs_fs_mount(struct file_system_type *t, int flags,
 	};
 	struct dentry *rv;
 	int ret;
-	void *ffs_dev;
 	struct ffs_data	*ffs;
 
 	ENTER();
@@ -1536,19 +1535,16 @@ ffs_fs_mount(struct file_system_type *t, int flags,
 		return ERR_PTR(-ENOMEM);
 	}
 
-	ffs_dev = ffs_acquire_dev(dev_name);
-	if (IS_ERR(ffs_dev)) {
+	ret = ffs_acquire_dev(dev_name, ffs);
+	if (ret) {
 		ffs_data_put(ffs);
-		return ERR_CAST(ffs_dev);
+		return ERR_PTR(ret);
 	}
-	ffs->private_data = ffs_dev;
 	data.ffs_data = ffs;
 
 	rv = mount_nodev(t, flags, &data, ffs_sb_fill);
-	if (IS_ERR(rv) && data.ffs_data) {
-		ffs_release_dev(data.ffs_data);
+	if (IS_ERR(rv) && data.ffs_data)
 		ffs_data_put(data.ffs_data);
-	}
 	return rv;
 }
 
@@ -1558,10 +1554,8 @@ ffs_fs_kill_sb(struct super_block *sb)
 	ENTER();
 
 	kill_litter_super(sb);
-	if (sb->s_fs_info) {
-		ffs_release_dev(sb->s_fs_info);
+	if (sb->s_fs_info)
 		ffs_data_closed(sb->s_fs_info);
-	}
 }
 
 static struct file_system_type ffs_fs_type = {
@@ -1630,6 +1624,7 @@ static void ffs_data_put(struct ffs_data *ffs)
 	if (unlikely(refcount_dec_and_test(&ffs->ref))) {
 		pr_info("%s(): freeing\n", __func__);
 		ffs_data_clear(ffs);
+		ffs_release_dev(ffs->private_data);
 		BUG_ON(waitqueue_active(&ffs->ev.waitq) ||
 		       waitqueue_active(&ffs->ep0req_completion.wait) ||
 		       waitqueue_active(&ffs->wait));
@@ -2934,6 +2929,7 @@ static inline struct f_fs_opts *ffs_do_functionfs_bind(struct usb_function *f,
 	struct ffs_function *func = ffs_func_from_usb(f);
 	struct f_fs_opts *ffs_opts =
 		container_of(f->fi, struct f_fs_opts, func_inst);
+	struct ffs_data *ffs_data;
 	int ret;
 
 	ENTER();
@@ -2948,12 +2944,13 @@ static inline struct f_fs_opts *ffs_do_functionfs_bind(struct usb_function *f,
 	if (!ffs_opts->no_configfs)
 		ffs_dev_lock();
 	ret = ffs_opts->dev->desc_ready ? 0 : -ENODEV;
-	func->ffs = ffs_opts->dev->ffs_data;
+	ffs_data = ffs_opts->dev->ffs_data;
 	if (!ffs_opts->no_configfs)
 		ffs_dev_unlock();
 	if (ret)
 		return ERR_PTR(ret);
 
+	func->ffs = ffs_data;
 	func->conf = c;
 	func->gadget = c->cdev->gadget;
 
@@ -3408,6 +3405,7 @@ static void ffs_free_inst(struct usb_function_instance *f)
 	struct f_fs_opts *opts;
 
 	opts = to_f_fs_opts(f);
+	ffs_release_dev(opts->dev);
 	ffs_dev_lock();
 	_ffs_free_dev(opts->dev);
 	ffs_dev_unlock();
@@ -3595,47 +3593,48 @@ static void _ffs_free_dev(struct ffs_dev *dev)
 {
 	list_del(&dev->entry);
 
-	/* Clear the private_data pointer to stop incorrect dev access */
-	if (dev->ffs_data)
-		dev->ffs_data->private_data = NULL;
-
 	kfree(dev);
 	if (list_empty(&ffs_devices))
 		functionfs_cleanup();
 }
 
-static void *ffs_acquire_dev(const char *dev_name)
+static int ffs_acquire_dev(const char *dev_name, struct ffs_data *ffs_data)
 {
+	int ret = 0;
 	struct ffs_dev *ffs_dev;
 
 	ENTER();
 	ffs_dev_lock();
 
 	ffs_dev = _ffs_find_dev(dev_name);
-	if (!ffs_dev)
-		ffs_dev = ERR_PTR(-ENOENT);
-	else if (ffs_dev->mounted)
-		ffs_dev = ERR_PTR(-EBUSY);
-	else if (ffs_dev->ffs_acquire_dev_callback &&
-	    ffs_dev->ffs_acquire_dev_callback(ffs_dev))
-		ffs_dev = ERR_PTR(-ENOENT);
-	else
+	if (!ffs_dev) {
+		ret = -ENOENT;
+	} else if (ffs_dev->mounted) {
+		ret = -EBUSY;
+	} else if (ffs_dev->ffs_acquire_dev_callback &&
+		   ffs_dev->ffs_acquire_dev_callback(ffs_dev)) {
+		ret = -ENOENT;
+	} else {
 		ffs_dev->mounted = true;
+		ffs_dev->ffs_data = ffs_data;
+		ffs_data->private_data = ffs_dev;
+	}
 
 	ffs_dev_unlock();
-	return ffs_dev;
+	return ret;
 }
 
-static void ffs_release_dev(struct ffs_data *ffs_data)
+static void ffs_release_dev(struct ffs_dev *ffs_dev)
 {
-	struct ffs_dev *ffs_dev;
-
 	ENTER();
 	ffs_dev_lock();
 
-	ffs_dev = ffs_data->private_data;
-	if (ffs_dev) {
+	if (ffs_dev && ffs_dev->mounted) {
 		ffs_dev->mounted = false;
+		if (ffs_dev->ffs_data) {
+			ffs_dev->ffs_data->private_data = NULL;
+			ffs_dev->ffs_data = NULL;
+		}
 
 		if (ffs_dev->ffs_release_dev_callback)
 			ffs_dev->ffs_release_dev_callback(ffs_dev);
@@ -3663,7 +3662,6 @@ static int ffs_ready(struct ffs_data *ffs)
 	}
 
 	ffs_obj->desc_ready = true;
-	ffs_obj->ffs_data = ffs;
 
 	if (ffs_obj->ffs_ready_callback) {
 		ret = ffs_obj->ffs_ready_callback(ffs);
@@ -3691,7 +3689,6 @@ static void ffs_closed(struct ffs_data *ffs)
 		goto done;
 
 	ffs_obj->desc_ready = false;
-	ffs_obj->ffs_data = NULL;
 
 	if (test_and_clear_bit(FFS_FL_CALL_CLOSED_CALLBACK, &ffs->flags) &&
 	    ffs_obj->ffs_closed_callback)

commit 1525e3556731df38b57d06afc6e7c4e5cb29596b
Author: Nathan Chancellor <nathan@kernel.org>
Date:   Fri May 28 11:27:52 2021 -0700

    powerpc/barrier: Avoid collision with clang's __lwsync macro
    
    commit 015d98149b326e0f1f02e44413112ca8b4330543 upstream.
    
    A change in clang 13 results in the __lwsync macro being defined as
    __builtin_ppc_lwsync, which emits 'lwsync' or 'msync' depending on what
    the target supports. This breaks the build because of -Werror in
    arch/powerpc, along with thousands of warnings:
    
     In file included from arch/powerpc/kernel/pmc.c:12:
     In file included from include/linux/bug.h:5:
     In file included from arch/powerpc/include/asm/bug.h:109:
     In file included from include/asm-generic/bug.h:20:
     In file included from include/linux/kernel.h:12:
     In file included from include/linux/bitops.h:32:
     In file included from arch/powerpc/include/asm/bitops.h:62:
     arch/powerpc/include/asm/barrier.h:49:9: error: '__lwsync' macro redefined [-Werror,-Wmacro-redefined]
     #define __lwsync()      __asm__ __volatile__ (stringify_in_c(LWSYNC) : : :"memory")
            ^
     <built-in>:308:9: note: previous definition is here
     #define __lwsync __builtin_ppc_lwsync
            ^
     1 error generated.
    
    Undefine this macro so that the runtime patching introduced by
    commit 2d1b2027626d ("powerpc: Fixup lwsync at runtime") continues to
    work properly with clang and the build no longer breaks.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://github.com/ClangBuiltLinux/linux/issues/1386
    Link: https://github.com/llvm/llvm-project/commit/62b5df7fe2b3fda1772befeda15598fbef96a614
    Link: https://lore.kernel.org/r/20210528182752.1852002-1-nathan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/powerpc/include/asm/barrier.h b/arch/powerpc/include/asm/barrier.h
index fbe8df433019..dc953d22e3c6 100644
--- a/arch/powerpc/include/asm/barrier.h
+++ b/arch/powerpc/include/asm/barrier.h
@@ -44,6 +44,8 @@
 #    define SMPWMB      eieio
 #endif
 
+/* clang defines this macro for a builtin, which will not work with runtime patching */
+#undef __lwsync
 #define __lwsync()	__asm__ __volatile__ (stringify_in_c(LWSYNC) : : :"memory")
 #define dma_rmb()	__lwsync()
 #define dma_wmb()	__asm__ __volatile__ (stringify_in_c(SMPWMB) : : :"memory")

commit e7779b7470ef229b895c45e19d299cfa4902157b
Author: Miklos Szeredi <mszeredi@redhat.com>
Date:   Tue Jun 22 09:15:35 2021 +0200

    fuse: reject internal errno
    
    commit 49221cf86d18bb66fe95d3338cb33bd4b9880ca5 upstream.
    
    Don't allow userspace to report errors that could be kernel-internal.
    
    Reported-by: Anatoly Trosinenko <anatoly.trosinenko@gmail.com>
    Fixes: 334f485df85a ("[PATCH] FUSE - device functions")
    Cc: <stable@vger.kernel.org> # v2.6.14
    Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index 498a4fab4080..8b22f8705dd4 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -1896,7 +1896,7 @@ static ssize_t fuse_dev_do_write(struct fuse_dev *fud,
 	}
 
 	err = -EINVAL;
-	if (oh.error <= -1000 || oh.error > 0)
+	if (oh.error <= -512 || oh.error > 0)
 		goto err_finish;
 
 	spin_lock(&fpq->lock);

commit 3941cf9b4b28fb787f98bbdae953ae433c19900e
Author: Pali Rohár <pali@kernel.org>
Date:   Fri Jun 25 00:49:00 2021 +0200

    serial: mvebu-uart: fix calculation of clock divisor
    
    commit 9078204ca5c33ba20443a8623a41a68a9995a70d upstream.
    
    The clock divisor should be rounded to the closest value.
    
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Fixes: 68a0db1d7da2 ("serial: mvebu-uart: add function to change baudrate")
    Cc: stable@vger.kernel.org # 0e4cf69ede87 ("serial: mvebu-uart: clarify the baud rate derivation")
    Link: https://lore.kernel.org/r/20210624224909.6350-2-pali@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/tty/serial/mvebu-uart.c b/drivers/tty/serial/mvebu-uart.c
index 87ec05fef480..f0107d5df99e 100644
--- a/drivers/tty/serial/mvebu-uart.c
+++ b/drivers/tty/serial/mvebu-uart.c
@@ -462,7 +462,7 @@ static int mvebu_uart_baud_rate_set(struct uart_port *port, unsigned int baud)
 	 * makes use of D to configure the desired baudrate.
 	 */
 	m_divisor = OSAMP_DEFAULT_DIVISOR;
-	d_divisor = DIV_ROUND_UP(port->uartclk, baud * m_divisor);
+	d_divisor = DIV_ROUND_CLOSEST(port->uartclk, baud * m_divisor);
 
 	brdv = readl(port->membase + UART_BRDV);
 	brdv &= ~BRDV_BAUD_MASK;

commit 424f497d9bdc24185bcaebc1f3f458a8d85e9d87
Author: Miquel Raynal <miquel.raynal@bootlin.com>
Date:   Fri Nov 23 16:45:29 2018 +0100

    serial: mvebu-uart: clarify the baud rate derivation
    
    commit 0e4cf69ede8751d25f733cd7a6f954c5b505fa03 upstream.
    
    The current comment in ->set_baud_rate() is rather incomplete as it
    fails to describe what are the actual stages for the baudrate
    derivation. Replace this comment with something more explicit and
    close to the functional specification. Also adapt the variable names
    to it.
    
    Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/tty/serial/mvebu-uart.c b/drivers/tty/serial/mvebu-uart.c
index 9369b4d42d24..87ec05fef480 100644
--- a/drivers/tty/serial/mvebu-uart.c
+++ b/drivers/tty/serial/mvebu-uart.c
@@ -72,6 +72,7 @@
 #define  BRDV_BAUD_MASK         0x3FF
 
 #define UART_OSAMP		0x14
+#define  OSAMP_DEFAULT_DIVISOR	16
 
 #define MVEBU_NR_UARTS		2
 
@@ -444,23 +445,28 @@ static void mvebu_uart_shutdown(struct uart_port *port)
 static int mvebu_uart_baud_rate_set(struct uart_port *port, unsigned int baud)
 {
 	struct mvebu_uart *mvuart = to_mvuart(port);
-	unsigned int baud_rate_div;
+	unsigned int d_divisor, m_divisor;
 	u32 brdv;
 
 	if (IS_ERR(mvuart->clk))
 		return -PTR_ERR(mvuart->clk);
 
 	/*
-	 * The UART clock is divided by the value of the divisor to generate
-	 * UCLK_OUT clock, which is 16 times faster than the baudrate.
-	 * This prescaler can achieve all standard baudrates until 230400.
-	 * Higher baudrates could be achieved for the extended UART by using the
-	 * programmable oversampling stack (also called fractional divisor).
+	 * The baudrate is derived from the UART clock thanks to two divisors:
+	 *   > D ("baud generator"): can divide the clock from 2 to 2^10 - 1.
+	 *   > M ("fractional divisor"): allows a better accuracy for
+	 *     baudrates higher than 230400.
+	 *
+	 * As the derivation of M is rather complicated, the code sticks to its
+	 * default value (x16) when all the prescalers are zeroed, and only
+	 * makes use of D to configure the desired baudrate.
 	 */
-	baud_rate_div = DIV_ROUND_UP(port->uartclk, baud * 16);
+	m_divisor = OSAMP_DEFAULT_DIVISOR;
+	d_divisor = DIV_ROUND_UP(port->uartclk, baud * m_divisor);
+
 	brdv = readl(port->membase + UART_BRDV);
 	brdv &= ~BRDV_BAUD_MASK;
-	brdv |= baud_rate_div;
+	brdv |= d_divisor;
 	writel(brdv, port->membase + UART_BRDV);
 
 	return 0;

commit b30af520403b56d123098f9569bf0ec110534709
Author: Mika Westerberg <mika.westerberg@linux.intel.com>
Date:   Fri Oct 4 13:00:24 2019 +0300

    bdi: Do not use freezable workqueue
    
    commit a2b90f11217790ec0964ba9c93a4abb369758c26 upstream.
    
    A removable block device, such as NVMe or SSD connected over Thunderbolt
    can be hot-removed any time including when the system is suspended. When
    device is hot-removed during suspend and the system gets resumed, kernel
    first resumes devices and then thaws the userspace including freezable
    workqueues. What happens in that case is that the NVMe driver notices
    that the device is unplugged and removes it from the system. This ends
    up calling bdi_unregister() for the gendisk which then schedules
    wb_workfn() to be run one more time.
    
    However, since the bdi_wq is still frozen flush_delayed_work() call in
    wb_shutdown() blocks forever halting system resume process. User sees
    this as hang as nothing is happening anymore.
    
    Triggering sysrq-w reveals this:
    
      Workqueue: nvme-wq nvme_remove_dead_ctrl_work [nvme]
      Call Trace:
       ? __schedule+0x2c5/0x630
       ? wait_for_completion+0xa4/0x120
       schedule+0x3e/0xc0
       schedule_timeout+0x1c9/0x320
       ? resched_curr+0x1f/0xd0
       ? wait_for_completion+0xa4/0x120
       wait_for_completion+0xc3/0x120
       ? wake_up_q+0x60/0x60
       __flush_work+0x131/0x1e0
       ? flush_workqueue_prep_pwqs+0x130/0x130
       bdi_unregister+0xb9/0x130
       del_gendisk+0x2d2/0x2e0
       nvme_ns_remove+0xed/0x110 [nvme_core]
       nvme_remove_namespaces+0x96/0xd0 [nvme_core]
       nvme_remove+0x5b/0x160 [nvme]
       pci_device_remove+0x36/0x90
       device_release_driver_internal+0xdf/0x1c0
       nvme_remove_dead_ctrl_work+0x14/0x30 [nvme]
       process_one_work+0x1c2/0x3f0
       worker_thread+0x48/0x3e0
       kthread+0x100/0x140
       ? current_work+0x30/0x30
       ? kthread_park+0x80/0x80
       ret_from_fork+0x35/0x40
    
    This is not limited to NVMes so exactly same issue can be reproduced by
    hot-removing SSD (over Thunderbolt) while the system is suspended.
    
    Prevent this from happening by removing WQ_FREEZABLE from bdi_wq.
    
    Reported-by: AceLan Kao <acelan.kao@canonical.com>
    Link: https://marc.info/?l=linux-kernel&m=138695698516487
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=204385
    Link: https://lore.kernel.org/lkml/20191002122136.GD2819@lahna.fi.intel.com/#t
    Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Cc: Macpaul Lin <macpaul.lin@mediatek.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/mm/backing-dev.c b/mm/backing-dev.c
index 0a970be24a28..2152e85891d1 100644
--- a/mm/backing-dev.c
+++ b/mm/backing-dev.c
@@ -250,8 +250,8 @@ static int __init default_bdi_init(void)
 {
 	int err;
 
-	bdi_wq = alloc_workqueue("writeback", WQ_MEM_RECLAIM | WQ_FREEZABLE |
-					      WQ_UNBOUND | WQ_SYSFS, 0);
+	bdi_wq = alloc_workqueue("writeback", WQ_MEM_RECLAIM | WQ_UNBOUND |
+				 WQ_SYSFS, 0);
 	if (!bdi_wq)
 		return -ENOMEM;
 

commit aabde3a07a7900c5114c352103b8e9cd30302ee6
Author: Eric Biggers <ebiggers@google.com>
Date:   Thu May 27 16:52:36 2021 -0700

    fscrypt: don't ignore minor_hash when hash is 0
    
    commit 77f30bfcfcf484da7208affd6a9e63406420bf91 upstream.
    
    When initializing a no-key name, fscrypt_fname_disk_to_usr() sets the
    minor_hash to 0 if the (major) hash is 0.
    
    This doesn't make sense because 0 is a valid hash code, so we shouldn't
    ignore the filesystem-provided minor_hash in that case.  Fix this by
    removing the special case for 'hash == 0'.
    
    This is an old bug that appears to have originated when the encryption
    code in ext4 and f2fs was moved into fs/crypto/.  The original ext4 and
    f2fs code passed the hash by pointer instead of by value.  So
    'if (hash)' actually made sense then, as it was checking whether a
    pointer was NULL.  But now the hashes are passed by value, and
    filesystems just pass 0 for any hashes they don't have.  There is no
    need to handle this any differently from the hashes actually being 0.
    
    It is difficult to reproduce this bug, as it only made a difference in
    the case where a filename's 32-bit major hash happened to be 0.
    However, it probably had the largest chance of causing problems on
    ubifs, since ubifs uses minor_hash to do lookups of no-key names, in
    addition to using it as a readdir cookie.  ext4 only uses minor_hash as
    a readdir cookie, and f2fs doesn't use minor_hash at all.
    
    Fixes: 0b81d0779072 ("fs crypto: move per-file encryption from f2fs tree to fs/crypto")
    Cc: <stable@vger.kernel.org> # v4.6+
    Link: https://lore.kernel.org/r/20210527235236.2376556-1-ebiggers@kernel.org
    Signed-off-by: Eric Biggers <ebiggers@google.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/crypto/fname.c b/fs/crypto/fname.c
index 17bb9a3fc0b0..052c137f1e70 100644
--- a/fs/crypto/fname.c
+++ b/fs/crypto/fname.c
@@ -275,13 +275,8 @@ int fscrypt_fname_disk_to_usr(struct inode *inode,
 					   oname->name);
 		return 0;
 	}
-	if (hash) {
-		digested_name.hash = hash;
-		digested_name.minor_hash = minor_hash;
-	} else {
-		digested_name.hash = 0;
-		digested_name.minor_hash = 0;
-	}
+	digested_name.hash = hash;
+	digested_name.minor_hash = minor_hash;
 	memcpy(digested_name.digest,
 	       FSCRYPT_FNAME_DIGEST(iname->name, iname->len),
 	       FSCRYPT_FNAME_DIGEST_SIZE);

commit ebfe50a690080e7fcccff503f4fdc8af120d3368
Author: Nick Desaulniers <ndesaulniers@google.com>
Date:   Mon Jun 28 14:50:26 2021 -0700

    MIPS: set mips32r5 for virt extensions
    
    [ Upstream commit c994a3ec7ecc8bd2a837b2061e8a76eb8efc082b ]
    
    Clang's integrated assembler only accepts these instructions when the
    cpu is set to mips32r5. With this change, we can assemble
    malta_defconfig with Clang via `make LLVM_IAS=1`.
    
    Link: https://github.com/ClangBuiltLinux/linux/issues/763
    Reported-by: Dmitry Golovin <dima@golovin.in>
    Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h
index f9a7c137be9f..c8333782a670 100644
--- a/arch/mips/include/asm/mipsregs.h
+++ b/arch/mips/include/asm/mipsregs.h
@@ -1986,7 +1986,7 @@ _ASM_MACRO_0(tlbginvf, _ASM_INSN_IF_MIPS(0x4200000c)
 ({ int __res;								\
 	__asm__ __volatile__(						\
 		".set\tpush\n\t"					\
-		".set\tmips32r2\n\t"					\
+		".set\tmips32r5\n\t"					\
 		_ASM_SET_VIRT						\
 		"mfgc0\t%0, " #source ", %1\n\t"			\
 		".set\tpop"						\
@@ -1999,7 +1999,7 @@ _ASM_MACRO_0(tlbginvf, _ASM_INSN_IF_MIPS(0x4200000c)
 ({ unsigned long long __res;						\
 	__asm__ __volatile__(						\
 		".set\tpush\n\t"					\
-		".set\tmips64r2\n\t"					\
+		".set\tmips64r5\n\t"					\
 		_ASM_SET_VIRT						\
 		"dmfgc0\t%0, " #source ", %1\n\t"			\
 		".set\tpop"						\
@@ -2012,7 +2012,7 @@ _ASM_MACRO_0(tlbginvf, _ASM_INSN_IF_MIPS(0x4200000c)
 do {									\
 	__asm__ __volatile__(						\
 		".set\tpush\n\t"					\
-		".set\tmips32r2\n\t"					\
+		".set\tmips32r5\n\t"					\
 		_ASM_SET_VIRT						\
 		"mtgc0\t%z0, " #register ", %1\n\t"			\
 		".set\tpop"						\
@@ -2024,7 +2024,7 @@ do {									\
 do {									\
 	__asm__ __volatile__(						\
 		".set\tpush\n\t"					\
-		".set\tmips64r2\n\t"					\
+		".set\tmips64r5\n\t"					\
 		_ASM_SET_VIRT						\
 		"dmtgc0\t%z0, " #register ", %1\n\t"			\
 		".set\tpop"						\

commit dd16e38e1531258d332b0fc7c247367f60c6c381
Author: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Date:   Mon Jun 28 16:13:42 2021 -0300

    sctp: add size validation when walking chunks
    
    [ Upstream commit 50619dbf8db77e98d821d615af4f634d08e22698 ]
    
    The first chunk in a packet is ensured to be present at the beginning of
    sctp_rcv(), as a packet needs to have at least 1 chunk. But the second
    one, may not be completely available and ch->length can be over
    uninitialized memory.
    
    Fix here is by only trying to walk on the next chunk if there is enough to
    hold at least the header, and then proceed with the ch->length validation
    that is already there.
    
    Reported-by: Ilja Van Sprundel <ivansprundel@ioactive.com>
    Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sctp/input.c b/net/sctp/input.c
index e17c8359571c..203aaefd8d04 100644
--- a/net/sctp/input.c
+++ b/net/sctp/input.c
@@ -1204,7 +1204,7 @@ static struct sctp_association *__sctp_rcv_walk_lookup(struct net *net,
 
 		ch = (struct sctp_chunkhdr *)ch_end;
 		chunk_num++;
-	} while (ch_end < skb_tail_pointer(skb));
+	} while (ch_end + sizeof(*ch) < skb_tail_pointer(skb));
 
 	return asoc;
 }

commit c7a03ebace4f9cd40d9cd9dd5fb2af558025583c
Author: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Date:   Mon Jun 28 16:13:41 2021 -0300

    sctp: validate from_addr_param return
    
    [ Upstream commit 0c5dc070ff3d6246d22ddd931f23a6266249e3db ]
    
    Ilja reported that, simply putting it, nothing was validating that
    from_addr_param functions were operating on initialized memory. That is,
    the parameter itself was being validated by sctp_walk_params, but it
    doesn't check for types and their specific sizes and it could be a 0-length
    one, causing from_addr_param to potentially work over the next parameter or
    even uninitialized memory.
    
    The fix here is to, in all calls to from_addr_param, check if enough space
    is there for the wanted IP address type.
    
    Reported-by: Ilja Van Sprundel <ivansprundel@ioactive.com>
    Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h
index 19f8d5881b08..2882bc7a5b4b 100644
--- a/include/net/sctp/structs.h
+++ b/include/net/sctp/structs.h
@@ -474,7 +474,7 @@ struct sctp_af {
 					 int saddr);
 	void		(*from_sk)	(union sctp_addr *,
 					 struct sock *sk);
-	void		(*from_addr_param) (union sctp_addr *,
+	bool		(*from_addr_param) (union sctp_addr *,
 					    union sctp_addr_param *,
 					    __be16 port, int iif);
 	int		(*to_addr_param) (const union sctp_addr *,
diff --git a/net/sctp/bind_addr.c b/net/sctp/bind_addr.c
index 38d01cfb313e..f8a283245672 100644
--- a/net/sctp/bind_addr.c
+++ b/net/sctp/bind_addr.c
@@ -285,22 +285,19 @@ int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw_addr_list,
 		rawaddr = (union sctp_addr_param *)raw_addr_list;
 
 		af = sctp_get_af_specific(param_type2af(param->type));
-		if (unlikely(!af)) {
+		if (unlikely(!af) ||
+		    !af->from_addr_param(&addr, rawaddr, htons(port), 0)) {
 			retval = -EINVAL;
-			sctp_bind_addr_clean(bp);
-			break;
+			goto out_err;
 		}
 
-		af->from_addr_param(&addr, rawaddr, htons(port), 0);
 		if (sctp_bind_addr_state(bp, &addr) != -1)
 			goto next;
 		retval = sctp_add_bind_addr(bp, &addr, sizeof(addr),
 					    SCTP_ADDR_SRC, gfp);
-		if (retval) {
+		if (retval)
 			/* Can't finish building the list, clean up. */
-			sctp_bind_addr_clean(bp);
-			break;
-		}
+			goto out_err;
 
 next:
 		len = ntohs(param->length);
@@ -309,6 +306,12 @@ int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw_addr_list,
 	}
 
 	return retval;
+
+out_err:
+	if (retval)
+		sctp_bind_addr_clean(bp);
+
+	return retval;
 }
 
 /********************************************************************
diff --git a/net/sctp/input.c b/net/sctp/input.c
index 3dd900e42b85..e17c8359571c 100644
--- a/net/sctp/input.c
+++ b/net/sctp/input.c
@@ -1088,7 +1088,8 @@ static struct sctp_association *__sctp_rcv_init_lookup(struct net *net,
 		if (!af)
 			continue;
 
-		af->from_addr_param(paddr, params.addr, sh->source, 0);
+		if (!af->from_addr_param(paddr, params.addr, sh->source, 0))
+			continue;
 
 		asoc = __sctp_lookup_association(net, laddr, paddr, transportp);
 		if (asoc)
@@ -1131,7 +1132,8 @@ static struct sctp_association *__sctp_rcv_asconf_lookup(
 	if (unlikely(!af))
 		return NULL;
 
-	af->from_addr_param(&paddr, param, peer_port, 0);
+	if (af->from_addr_param(&paddr, param, peer_port, 0))
+		return NULL;
 
 	return __sctp_lookup_association(net, laddr, &paddr, transportp);
 }
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c
index 4cc573924493..fc82617b6076 100644
--- a/net/sctp/ipv6.c
+++ b/net/sctp/ipv6.c
@@ -542,15 +542,20 @@ static void sctp_v6_to_sk_daddr(union sctp_addr *addr, struct sock *sk)
 }
 
 /* Initialize a sctp_addr from an address parameter. */
-static void sctp_v6_from_addr_param(union sctp_addr *addr,
+static bool sctp_v6_from_addr_param(union sctp_addr *addr,
 				    union sctp_addr_param *param,
 				    __be16 port, int iif)
 {
+	if (ntohs(param->v6.param_hdr.length) < sizeof(struct sctp_ipv6addr_param))
+		return false;
+
 	addr->v6.sin6_family = AF_INET6;
 	addr->v6.sin6_port = port;
 	addr->v6.sin6_flowinfo = 0; /* BUG */
 	addr->v6.sin6_addr = param->v6.addr;
 	addr->v6.sin6_scope_id = iif;
+
+	return true;
 }
 
 /* Initialize an address parameter from a sctp_addr and return the length
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c
index af054f38341b..dd5125658255 100644
--- a/net/sctp/protocol.c
+++ b/net/sctp/protocol.c
@@ -268,14 +268,19 @@ static void sctp_v4_to_sk_daddr(union sctp_addr *addr, struct sock *sk)
 }
 
 /* Initialize a sctp_addr from an address parameter. */
-static void sctp_v4_from_addr_param(union sctp_addr *addr,
+static bool sctp_v4_from_addr_param(union sctp_addr *addr,
 				    union sctp_addr_param *param,
 				    __be16 port, int iif)
 {
+	if (ntohs(param->v4.param_hdr.length) < sizeof(struct sctp_ipv4addr_param))
+		return false;
+
 	addr->v4.sin_family = AF_INET;
 	addr->v4.sin_port = port;
 	addr->v4.sin_addr.s_addr = param->v4.addr.s_addr;
 	memset(addr->v4.sin_zero, 0, sizeof(addr->v4.sin_zero));
+
+	return true;
 }
 
 /* Initialize an address parameter from a sctp_addr and return the length
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
index dc51e14f568e..a1ca070e36b0 100644
--- a/net/sctp/sm_make_chunk.c
+++ b/net/sctp/sm_make_chunk.c
@@ -2352,11 +2352,13 @@ int sctp_process_init(struct sctp_association *asoc, struct sctp_chunk *chunk,
 
 	/* Process the initialization parameters.  */
 	sctp_walk_params(param, peer_init, init_hdr.params) {
-		if (!src_match && (param.p->type == SCTP_PARAM_IPV4_ADDRESS ||
-		    param.p->type == SCTP_PARAM_IPV6_ADDRESS)) {
+		if (!src_match &&
+		    (param.p->type == SCTP_PARAM_IPV4_ADDRESS ||
+		     param.p->type == SCTP_PARAM_IPV6_ADDRESS)) {
 			af = sctp_get_af_specific(param_type2af(param.p->type));
-			af->from_addr_param(&addr, param.addr,
-					    chunk->sctp_hdr->source, 0);
+			if (!af->from_addr_param(&addr, param.addr,
+						 chunk->sctp_hdr->source, 0))
+				continue;
 			if (sctp_cmp_addr_exact(sctp_source(chunk), &addr))
 				src_match = 1;
 		}
@@ -2537,7 +2539,8 @@ static int sctp_process_param(struct sctp_association *asoc,
 			break;
 do_addr_param:
 		af = sctp_get_af_specific(param_type2af(param.p->type));
-		af->from_addr_param(&addr, param.addr, htons(asoc->peer.port), 0);
+		if (!af->from_addr_param(&addr, param.addr, htons(asoc->peer.port), 0))
+			break;
 		scope = sctp_scope(peer_addr);
 		if (sctp_in_scope(net, &addr, scope))
 			if (!sctp_assoc_add_peer(asoc, &addr, gfp, SCTP_UNCONFIRMED))
@@ -2634,15 +2637,13 @@ static int sctp_process_param(struct sctp_association *asoc,
 		addr_param = param.v + sizeof(struct sctp_addip_param);
 
 		af = sctp_get_af_specific(param_type2af(addr_param->p.type));
-		if (af == NULL)
+		if (!af)
 			break;
 
-		af->from_addr_param(&addr, addr_param,
-				    htons(asoc->peer.port), 0);
+		if (!af->from_addr_param(&addr, addr_param,
+					 htons(asoc->peer.port), 0))
+			break;
 
-		/* if the address is invalid, we can't process it.
-		 * XXX: see spec for what to do.
-		 */
 		if (!af->addr_valid(&addr, NULL, NULL))
 			break;
 
@@ -3059,7 +3060,8 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc,
 	if (unlikely(!af))
 		return SCTP_ERROR_DNS_FAILED;
 
-	af->from_addr_param(&addr, addr_param, htons(asoc->peer.port), 0);
+	if (!af->from_addr_param(&addr, addr_param, htons(asoc->peer.port), 0))
+		return SCTP_ERROR_DNS_FAILED;
 
 	/* ADDIP 4.2.1  This parameter MUST NOT contain a broadcast
 	 * or multicast address.
@@ -3336,7 +3338,8 @@ static void sctp_asconf_param_success(struct sctp_association *asoc,
 
 	/* We have checked the packet before, so we do not check again.	*/
 	af = sctp_get_af_specific(param_type2af(addr_param->p.type));
-	af->from_addr_param(&addr, addr_param, htons(bp->port), 0);
+	if (!af->from_addr_param(&addr, addr_param, htons(bp->port), 0))
+		return;
 
 	switch (asconf_param->param_hdr.type) {
 	case SCTP_PARAM_ADD_IP:

commit 012a3944008fc774b1eae42be7e8dfc4ee2ab521
Author: Tim Jiang <tjiang@codeaurora.org>
Date:   Tue Jun 1 17:57:10 2021 +0800

    Bluetooth: btusb: fix bt fiwmare downloading failure issue for qca btsoc.
    
    [ Upstream commit 4f00bfb372674d586c4a261bfc595cbce101fbb6 ]
    
    This is btsoc timing issue, after host start to downloading bt firmware,
    ep2 need time to switch from function acl to function dfu, so host add
    20ms delay as workaround.
    
    Signed-off-by: Tim Jiang <tjiang@codeaurora.org>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 1b0adf5c2376..7188f0fb2e05 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -2595,6 +2595,11 @@ static int btusb_setup_qca_download_fw(struct hci_dev *hdev,
 	sent += size;
 	count -= size;
 
+	/* ep2 need time to switch from function acl to function dfu,
+	 * so we add 20ms delay here.
+	 */
+	msleep(20);
+
 	while (count) {
 		size = min_t(size_t, count, QCA_DFU_PACKET_LEN);
 

commit 78b03389d2773255ceaf051f2dca134b816d96f2
Author: Kai-Heng Feng <kai.heng.feng@canonical.com>
Date:   Fri May 14 15:14:52 2021 +0800

    Bluetooth: Shutdown controller after workqueues are flushed or cancelled
    
    [ Upstream commit 0ea9fd001a14ebc294f112b0361a4e601551d508 ]
    
    Rfkill block and unblock Intel USB Bluetooth [8087:0026] may make it
    stops working:
    [  509.691509] Bluetooth: hci0: HCI reset during shutdown failed
    [  514.897584] Bluetooth: hci0: MSFT filter_enable is already on
    [  530.044751] usb 3-10: reset full-speed USB device number 5 using xhci_hcd
    [  545.660350] usb 3-10: device descriptor read/64, error -110
    [  561.283530] usb 3-10: device descriptor read/64, error -110
    [  561.519682] usb 3-10: reset full-speed USB device number 5 using xhci_hcd
    [  566.686650] Bluetooth: hci0: unexpected event for opcode 0x0500
    [  568.752452] Bluetooth: hci0: urb 0000000096cd309b failed to resubmit (113)
    [  578.797955] Bluetooth: hci0: Failed to read MSFT supported features (-110)
    [  586.286565] Bluetooth: hci0: urb 00000000c522f633 failed to resubmit (113)
    [  596.215302] Bluetooth: hci0: Failed to read MSFT supported features (-110)
    
    Or kernel panics because other workqueues already freed skb:
    [ 2048.663763] BUG: kernel NULL pointer dereference, address: 0000000000000000
    [ 2048.663775] #PF: supervisor read access in kernel mode
    [ 2048.663779] #PF: error_code(0x0000) - not-present page
    [ 2048.663782] PGD 0 P4D 0
    [ 2048.663787] Oops: 0000 [#1] SMP NOPTI
    [ 2048.663793] CPU: 3 PID: 4491 Comm: rfkill Tainted: G        W         5.13.0-rc1-next-20210510+ #20
    [ 2048.663799] Hardware name: HP HP EliteBook 850 G8 Notebook PC/8846, BIOS T76 Ver. 01.01.04 12/02/2020
    [ 2048.663801] RIP: 0010:__skb_ext_put+0x6/0x50
    [ 2048.663814] Code: 8b 1b 48 85 db 75 db 5b 41 5c 5d c3 be 01 00 00 00 e8 de 13 c0 ff eb e7 be 02 00 00 00 e8 d2 13 c0 ff eb db 0f 1f 44 00 00 55 <8b> 07 48 89 e5 83 f8 01 74 14 b8 ff ff ff ff f0 0f c1
    07 83 f8 01
    [ 2048.663819] RSP: 0018:ffffc1d105b6fd80 EFLAGS: 00010286
    [ 2048.663824] RAX: 0000000000000000 RBX: ffff9d9ac5649000 RCX: 0000000000000000
    [ 2048.663827] RDX: ffffffffc0d1daf6 RSI: 0000000000000206 RDI: 0000000000000000
    [ 2048.663830] RBP: ffffc1d105b6fd98 R08: 0000000000000001 R09: ffff9d9ace8ceac0
    [ 2048.663834] R10: ffff9d9ace8ceac0 R11: 0000000000000001 R12: ffff9d9ac5649000
    [ 2048.663838] R13: 0000000000000000 R14: 00007ffe0354d650 R15: 0000000000000000
    [ 2048.663843] FS:  00007fe02ab19740(0000) GS:ffff9d9e5f8c0000(0000) knlGS:0000000000000000
    [ 2048.663849] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 2048.663853] CR2: 0000000000000000 CR3: 0000000111a52004 CR4: 0000000000770ee0
    [ 2048.663856] PKRU: 55555554
    [ 2048.663859] Call Trace:
    [ 2048.663865]  ? skb_release_head_state+0x5e/0x80
    [ 2048.663873]  kfree_skb+0x2f/0xb0
    [ 2048.663881]  btusb_shutdown_intel_new+0x36/0x60 [btusb]
    [ 2048.663905]  hci_dev_do_close+0x48c/0x5e0 [bluetooth]
    [ 2048.663954]  ? __cond_resched+0x1a/0x50
    [ 2048.663962]  hci_rfkill_set_block+0x56/0xa0 [bluetooth]
    [ 2048.664007]  rfkill_set_block+0x98/0x170
    [ 2048.664016]  rfkill_fop_write+0x136/0x1e0
    [ 2048.664022]  vfs_write+0xc7/0x260
    [ 2048.664030]  ksys_write+0xb1/0xe0
    [ 2048.664035]  ? exit_to_user_mode_prepare+0x37/0x1c0
    [ 2048.664042]  __x64_sys_write+0x1a/0x20
    [ 2048.664048]  do_syscall_64+0x40/0xb0
    [ 2048.664055]  entry_SYSCALL_64_after_hwframe+0x44/0xae
    [ 2048.664060] RIP: 0033:0x7fe02ac23c27
    [ 2048.664066] Code: 0d 00 f7 d8 64 89 02 48 c7 c0 ff ff ff ff eb b7 0f 1f 00 f3 0f 1e fa 64 8b 04 25 18 00 00 00 85 c0 75 10 b8 01 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 51 c3 48 83 ec 28 48 89 54 24 18 48 89 74 24
    [ 2048.664070] RSP: 002b:00007ffe0354d638 EFLAGS: 00000246 ORIG_RAX: 0000000000000001
    [ 2048.664075] RAX: ffffffffffffffda RBX: 0000000000000001 RCX: 00007fe02ac23c27
    [ 2048.664078] RDX: 0000000000000008 RSI: 00007ffe0354d650 RDI: 0000000000000003
    [ 2048.664081] RBP: 0000000000000000 R08: 0000559b05998440 R09: 0000559b05998440
    [ 2048.664084] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000003
    [ 2048.664086] R13: 0000000000000000 R14: ffffffff00000000 R15: 00000000ffffffff
    
    So move the shutdown callback to a place where workqueues are either
    flushed or cancelled to resolve the issue.
    
    Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 219cdbb476fb..e9902bf0f137 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -1609,14 +1609,6 @@ int hci_dev_do_close(struct hci_dev *hdev)
 
 	BT_DBG("%s %p", hdev->name, hdev);
 
-	if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) &&
-	    !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
-	    test_bit(HCI_UP, &hdev->flags)) {
-		/* Execute vendor specific shutdown routine */
-		if (hdev->shutdown)
-			hdev->shutdown(hdev);
-	}
-
 	cancel_delayed_work(&hdev->power_off);
 
 	hci_request_cancel_all(hdev);
@@ -1690,6 +1682,14 @@ int hci_dev_do_close(struct hci_dev *hdev)
 		clear_bit(HCI_INIT, &hdev->flags);
 	}
 
+	if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) &&
+	    !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
+	    test_bit(HCI_UP, &hdev->flags)) {
+		/* Execute vendor specific shutdown routine */
+		if (hdev->shutdown)
+			hdev->shutdown(hdev);
+	}
+
 	/* flush cmd  work */
 	flush_work(&hdev->cmd_work);
 

commit 06de654ddcbfcd5e486dc7f44f9478b66d6e7a5b
Author: Yu Liu <yudiliu@google.com>
Date:   Mon Apr 19 16:53:30 2021 -0700

    Bluetooth: Fix the HCI to MGMT status conversion table
    
    [ Upstream commit 4ef36a52b0e47c80bbfd69c0cce61c7ae9f541ed ]
    
    0x2B, 0x31 and 0x33 are reserved for future use but were not present in
    the HCI to MGMT conversion table, this caused the conversion to be
    incorrect for the HCI status code greater than 0x2A.
    
    Reviewed-by: Miao-chen Chou <mcchou@chromium.org>
    Signed-off-by: Yu Liu <yudiliu@google.com>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index e9a4f11278d9..d0ec0e336909 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -219,12 +219,15 @@ static u8 mgmt_status_table[] = {
 	MGMT_STATUS_TIMEOUT,		/* Instant Passed */
 	MGMT_STATUS_NOT_SUPPORTED,	/* Pairing Not Supported */
 	MGMT_STATUS_FAILED,		/* Transaction Collision */
+	MGMT_STATUS_FAILED,		/* Reserved for future use */
 	MGMT_STATUS_INVALID_PARAMS,	/* Unacceptable Parameter */
 	MGMT_STATUS_REJECTED,		/* QoS Rejected */
 	MGMT_STATUS_NOT_SUPPORTED,	/* Classification Not Supported */
 	MGMT_STATUS_REJECTED,		/* Insufficient Security */
 	MGMT_STATUS_INVALID_PARAMS,	/* Parameter Out Of Range */
+	MGMT_STATUS_FAILED,		/* Reserved for future use */
 	MGMT_STATUS_BUSY,		/* Role Switch Pending */
+	MGMT_STATUS_FAILED,		/* Reserved for future use */
 	MGMT_STATUS_FAILED,		/* Slot Violation */
 	MGMT_STATUS_FAILED,		/* Role Switch Failed */
 	MGMT_STATUS_INVALID_PARAMS,	/* EIR Too Large */

commit 4893c938f2a140a74be91779e45e4a7fa111198f
Author: Gerd Rausch <gerd.rausch@oracle.com>
Date:   Thu Jun 24 11:55:31 2021 -0700

    RDMA/cma: Fix rdma_resolve_route() memory leak
    
    [ Upstream commit 74f160ead74bfe5f2b38afb4fcf86189f9ff40c9 ]
    
    Fix a memory leak when "mda_resolve_route() is called more than once on
    the same "rdma_cm_id".
    
    This is possible if cma_query_handler() triggers the
    RDMA_CM_EVENT_ROUTE_ERROR flow which puts the state machine back and
    allows rdma_resolve_route() to be called again.
    
    Link: https://lore.kernel.org/r/f6662b7b-bdb7-2706-1e12-47c61d3474b6@oracle.com
    Signed-off-by: Gerd Rausch <gerd.rausch@oracle.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index 8cdf933310d1..842a30947bdc 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -2558,7 +2558,8 @@ static int cma_resolve_ib_route(struct rdma_id_private *id_priv, int timeout_ms)
 
 	cma_init_resolve_route_work(work, id_priv);
 
-	route->path_rec = kmalloc(sizeof *route->path_rec, GFP_KERNEL);
+	if (!route->path_rec)
+		route->path_rec = kmalloc(sizeof *route->path_rec, GFP_KERNEL);
 	if (!route->path_rec) {
 		ret = -ENOMEM;
 		goto err1;

commit a847a5e25692a8d4637881f00d0453221ca086ef
Author: Jakub Kicinski <kuba@kernel.org>
Date:   Wed Jun 23 14:44:38 2021 -0700

    net: ip: avoid OOM kills with large UDP sends over loopback
    
    [ Upstream commit 6d123b81ac615072a8525c13c6c41b695270a15d ]
    
    Dave observed number of machines hitting OOM on the UDP send
    path. The workload seems to be sending large UDP packets over
    loopback. Since loopback has MTU of 64k kernel will try to
    allocate an skb with up to 64k of head space. This has a good
    chance of failing under memory pressure. What's worse if
    the message length is <32k the allocation may trigger an
    OOM killer.
    
    This is entirely avoidable, we can use an skb with page frags.
    
    af_unix solves a similar problem by limiting the head
    length to SKB_MAX_ALLOC. This seems like a good and simple
    approach. It means that UDP messages > 16kB will now
    use fragments if underlying device supports SG, if extra
    allocator pressure causes regressions in real workloads
    we can switch to trying the large allocation first and
    falling back.
    
    v4: pre-calculate all the additions to alloclen so
        we can be sure it won't go over order-2
    
    Reported-by: Dave Jones <dsj@fb.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index e411c42d8428..e63905f7f6f9 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -940,7 +940,7 @@ static int __ip_append_data(struct sock *sk,
 			unsigned int datalen;
 			unsigned int fraglen;
 			unsigned int fraggap;
-			unsigned int alloclen;
+			unsigned int alloclen, alloc_extra;
 			unsigned int pagedlen;
 			struct sk_buff *skb_prev;
 alloc_new_skb:
@@ -960,35 +960,39 @@ static int __ip_append_data(struct sock *sk,
 			fraglen = datalen + fragheaderlen;
 			pagedlen = 0;
 
+			alloc_extra = hh_len + 15;
+			alloc_extra += exthdrlen;
+
+			/* The last fragment gets additional space at tail.
+			 * Note, with MSG_MORE we overallocate on fragments,
+			 * because we have no idea what fragment will be
+			 * the last.
+			 */
+			if (datalen == length + fraggap)
+				alloc_extra += rt->dst.trailer_len;
+
 			if ((flags & MSG_MORE) &&
 			    !(rt->dst.dev->features&NETIF_F_SG))
 				alloclen = mtu;
-			else if (!paged)
+			else if (!paged &&
+				 (fraglen + alloc_extra < SKB_MAX_ALLOC ||
+				  !(rt->dst.dev->features & NETIF_F_SG)))
 				alloclen = fraglen;
 			else {
 				alloclen = min_t(int, fraglen, MAX_HEADER);
 				pagedlen = fraglen - alloclen;
 			}
 
-			alloclen += exthdrlen;
-
-			/* The last fragment gets additional space at tail.
-			 * Note, with MSG_MORE we overallocate on fragments,
-			 * because we have no idea what fragment will be
-			 * the last.
-			 */
-			if (datalen == length + fraggap)
-				alloclen += rt->dst.trailer_len;
+			alloclen += alloc_extra;
 
 			if (transhdrlen) {
-				skb = sock_alloc_send_skb(sk,
-						alloclen + hh_len + 15,
+				skb = sock_alloc_send_skb(sk, alloclen,
 						(flags & MSG_DONTWAIT), &err);
 			} else {
 				skb = NULL;
 				if (refcount_read(&sk->sk_wmem_alloc) + wmem_alloc_delta <=
 				    2 * sk->sk_sndbuf)
-					skb = alloc_skb(alloclen + hh_len + 15,
+					skb = alloc_skb(alloclen,
 							sk->sk_allocation);
 				if (unlikely(!skb))
 					err = -ENOBUFS;
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index e1bb7db88483..aa8f19f852cc 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -1394,7 +1394,7 @@ static int __ip6_append_data(struct sock *sk,
 			unsigned int datalen;
 			unsigned int fraglen;
 			unsigned int fraggap;
-			unsigned int alloclen;
+			unsigned int alloclen, alloc_extra;
 			unsigned int pagedlen;
 alloc_new_skb:
 			/* There's no room in the current skb */
@@ -1421,17 +1421,28 @@ static int __ip6_append_data(struct sock *sk,
 			fraglen = datalen + fragheaderlen;
 			pagedlen = 0;
 
+			alloc_extra = hh_len;
+			alloc_extra += dst_exthdrlen;
+			alloc_extra += rt->dst.trailer_len;
+
+			/* We just reserve space for fragment header.
+			 * Note: this may be overallocation if the message
+			 * (without MSG_MORE) fits into the MTU.
+			 */
+			alloc_extra += sizeof(struct frag_hdr);
+
 			if ((flags & MSG_MORE) &&
 			    !(rt->dst.dev->features&NETIF_F_SG))
 				alloclen = mtu;
-			else if (!paged)
+			else if (!paged &&
+				 (fraglen + alloc_extra < SKB_MAX_ALLOC ||
+				  !(rt->dst.dev->features & NETIF_F_SG)))
 				alloclen = fraglen;
 			else {
 				alloclen = min_t(int, fraglen, MAX_HEADER);
 				pagedlen = fraglen - alloclen;
 			}
-
-			alloclen += dst_exthdrlen;
+			alloclen += alloc_extra;
 
 			if (datalen != length + fraggap) {
 				/*
@@ -1441,30 +1452,21 @@ static int __ip6_append_data(struct sock *sk,
 				datalen += rt->dst.trailer_len;
 			}
 
-			alloclen += rt->dst.trailer_len;
 			fraglen = datalen + fragheaderlen;
 
-			/*
-			 * We just reserve space for fragment header.
-			 * Note: this may be overallocation if the message
-			 * (without MSG_MORE) fits into the MTU.
-			 */
-			alloclen += sizeof(struct frag_hdr);
-
 			copy = datalen - transhdrlen - fraggap - pagedlen;
 			if (copy < 0) {
 				err = -EINVAL;
 				goto error;
 			}
 			if (transhdrlen) {
-				skb = sock_alloc_send_skb(sk,
-						alloclen + hh_len,
+				skb = sock_alloc_send_skb(sk, alloclen,
 						(flags & MSG_DONTWAIT), &err);
 			} else {
 				skb = NULL;
 				if (refcount_read(&sk->sk_wmem_alloc) + wmem_alloc_delta <=
 				    2 * sk->sk_sndbuf)
-					skb = alloc_skb(alloclen + hh_len,
+					skb = alloc_skb(alloclen,
 							sk->sk_allocation);
 				if (unlikely(!skb))
 					err = -ENOBUFS;

commit 6cd352fc2db99c186276c8291850de75de6dbadc
Author: Sean Young <sean@mess.org>
Date:   Wed Jun 23 22:37:54 2021 +0100

    media, bpf: Do not copy more entries than user space requested
    
    [ Upstream commit 647d446d66e493d23ca1047fa8492b0269674530 ]
    
    The syscall bpf(BPF_PROG_QUERY, &attr) should use the prog_cnt field to
    see how many entries user space provided and return ENOSPC if there are
    more programs than that. Before this patch, this is not checked and
    ENOSPC is never returned.
    
    Note that one lirc device is limited to 64 bpf programs, and user space
    I'm aware of -- ir-keytable -- always gives enough space for 64 entries
    already. However, we should not copy program ids than are requested.
    
    Signed-off-by: Sean Young <sean@mess.org>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Link: https://lore.kernel.org/bpf/20210623213754.632-1-sean@mess.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/rc/bpf-lirc.c b/drivers/media/rc/bpf-lirc.c
index 8b97fd1f0cea..5a0e26e47f59 100644
--- a/drivers/media/rc/bpf-lirc.c
+++ b/drivers/media/rc/bpf-lirc.c
@@ -295,7 +295,8 @@ int lirc_prog_query(const union bpf_attr *attr, union bpf_attr __user *uattr)
 	}
 
 	if (attr->query.prog_cnt != 0 && prog_ids && cnt)
-		ret = bpf_prog_array_copy_to_user(progs, prog_ids, cnt);
+		ret = bpf_prog_array_copy_to_user(progs, prog_ids,
+						  attr->query.prog_cnt);
 
 unlock:
 	mutex_unlock(&ir_raw_handler_lock);

commit 99594d19177d95fc865b3ddc5bcb1c29df118933
Author: Gustavo A. R. Silva <gustavoars@kernel.org>
Date:   Thu Apr 22 15:00:32 2021 -0500

    wireless: wext-spy: Fix out-of-bounds warning
    
    [ Upstream commit e93bdd78406da9ed01554c51e38b2a02c8ef8025 ]
    
    Fix the following out-of-bounds warning:
    
    net/wireless/wext-spy.c:178:2: warning: 'memcpy' offset [25, 28] from the object at 'threshold' is out of the bounds of referenced subobject 'low' with type 'struct iw_quality' at offset 20 [-Warray-bounds]
    
    The problem is that the original code is trying to copy data into a
    couple of struct members adjacent to each other in a single call to
    memcpy(). This causes a legitimate compiler warning because memcpy()
    overruns the length of &threshold.low and &spydata->spy_thr_low. As
    these are just a couple of struct members, fix this by using direct
    assignments, instead of memcpy().
    
    This helps with the ongoing efforts to globally enable -Warray-bounds
    and get us closer to being able to tighten the FORTIFY_SOURCE routines
    on memcpy().
    
    Link: https://github.com/KSPP/linux/issues/109
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Link: https://lore.kernel.org/r/20210422200032.GA168995@embeddedor
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/wireless/wext-spy.c b/net/wireless/wext-spy.c
index 33bef22e44e9..b379a0371653 100644
--- a/net/wireless/wext-spy.c
+++ b/net/wireless/wext-spy.c
@@ -120,8 +120,8 @@ int iw_handler_set_thrspy(struct net_device *	dev,
 		return -EOPNOTSUPP;
 
 	/* Just do it */
-	memcpy(&(spydata->spy_thr_low), &(threshold->low),
-	       2 * sizeof(struct iw_quality));
+	spydata->spy_thr_low = threshold->low;
+	spydata->spy_thr_high = threshold->high;
 
 	/* Clear flag */
 	memset(spydata->spy_thr_under, '\0', sizeof(spydata->spy_thr_under));
@@ -147,8 +147,8 @@ int iw_handler_get_thrspy(struct net_device *	dev,
 		return -EOPNOTSUPP;
 
 	/* Just do it */
-	memcpy(&(threshold->low), &(spydata->spy_thr_low),
-	       2 * sizeof(struct iw_quality));
+	threshold->low = spydata->spy_thr_low;
+	threshold->high = spydata->spy_thr_high;
 
 	return 0;
 }
@@ -173,10 +173,10 @@ static void iw_send_thrspy_event(struct net_device *	dev,
 	memcpy(threshold.addr.sa_data, address, ETH_ALEN);
 	threshold.addr.sa_family = ARPHRD_ETHER;
 	/* Copy stats */
-	memcpy(&(threshold.qual), wstats, sizeof(struct iw_quality));
+	threshold.qual = *wstats;
 	/* Copy also thresholds */
-	memcpy(&(threshold.low), &(spydata->spy_thr_low),
-	       2 * sizeof(struct iw_quality));
+	threshold.low = spydata->spy_thr_low;
+	threshold.high = spydata->spy_thr_high;
 
 	/* Send event to user space */
 	wireless_send_event(dev, SIOCGIWTHRSPY, &wrqu, (char *) &threshold);

commit 6a722d24bec1f50df07c9f83ee11d06c7bd1b8a8
Author: ?ñigo Huguet <ihuguet@redhat.com>
Date:   Mon Jun 21 17:32:36 2021 +0200

    sfc: error code if SRIOV cannot be disabled
    
    [ Upstream commit 1ebe4feb8b442884f5a28d2437040096723dd1ea ]
    
    If SRIOV cannot be disabled during device removal or module unloading,
    return error code so it can be logged properly in the calling function.
    
    Note that this can only happen if any VF is currently attached to a
    guest using Xen, but not with vfio/KVM. Despite that in that case the
    VFs won't work properly with PF removed and/or the module unloaded, I
    have let it as is because I don't know what side effects may have
    changing it, and also it seems to be the same that other drivers are
    doing in this situation.
    
    In the case of being called during SRIOV reconfiguration, the behavior
    hasn't changed because the function is called with force=false.
    
    Signed-off-by: ?ñigo Huguet <ihuguet@redhat.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/sfc/ef10_sriov.c b/drivers/net/ethernet/sfc/ef10_sriov.c
index edd5ae855886..f074986a13b1 100644
--- a/drivers/net/ethernet/sfc/ef10_sriov.c
+++ b/drivers/net/ethernet/sfc/ef10_sriov.c
@@ -406,12 +406,17 @@ static int efx_ef10_pci_sriov_enable(struct efx_nic *efx, int num_vfs)
 	return rc;
 }
 
+/* Disable SRIOV and remove VFs
+ * If some VFs are attached to a guest (using Xen, only) nothing is
+ * done if force=false, and vports are freed if force=true (for the non
+ * attachedc ones, only) but SRIOV is not disabled and VFs are not
+ * removed in either case.
+ */
 static int efx_ef10_pci_sriov_disable(struct efx_nic *efx, bool force)
 {
 	struct pci_dev *dev = efx->pci_dev;
-	unsigned int vfs_assigned = 0;
-
-	vfs_assigned = pci_vfs_assigned(dev);
+	unsigned int vfs_assigned = pci_vfs_assigned(dev);
+	int rc = 0;
 
 	if (vfs_assigned && !force) {
 		netif_info(efx, drv, efx->net_dev, "VFs are assigned to guests; "
@@ -421,10 +426,12 @@ static int efx_ef10_pci_sriov_disable(struct efx_nic *efx, bool force)
 
 	if (!vfs_assigned)
 		pci_disable_sriov(dev);
+	else
+		rc = -EBUSY;
 
 	efx_ef10_sriov_free_vf_vswitching(efx);
 	efx->vf_count = 0;
-	return 0;
+	return rc;
 }
 
 int efx_ef10_sriov_configure(struct efx_nic *efx, int num_vfs)

commit 4f734b8de9848ef1f3a43270c3538730409682c8
Author: ?ñigo Huguet <ihuguet@redhat.com>
Date:   Mon Jun 21 17:32:35 2021 +0200

    sfc: avoid double pci_remove of VFs
    
    [ Upstream commit 45423cff1db66cf0993e8a9bd0ac93e740149e49 ]
    
    If pci_remove was called for a PF with VFs, the removal of the VFs was
    called twice from efx_ef10_sriov_fini: one directly with pci_driver->remove
    and another implicit by calling pci_disable_sriov, which also perform
    the VFs remove. This was leading to crashing the kernel on the second
    attempt.
    
    Given that pci_disable_sriov already calls to pci remove function, get
    rid of the direct call to pci_driver->remove from the driver.
    
    2 different ways to trigger the bug:
    - Create one or more VFs, then attach the PF to a virtual machine (at
      least with qemu/KVM)
    - Create one or more VFs, then remove the PF with:
      echo 1 > /sys/bus/pci/devices/PF_PCI_ID/remove
    
    Removing sfc module does not trigger the error, at least for me, because
    it removes the VF first, and then the PF.
    
    Example of a log with the error:
        list_del corruption, ffff967fd20a8ad0->next is LIST_POISON1 (dead000000000100)
        ------------[ cut here ]------------
        kernel BUG at lib/list_debug.c:47!
        [...trimmed...]
        RIP: 0010:__list_del_entry_valid.cold.1+0x12/0x4c
        [...trimmed...]
        Call Trace:
        efx_dissociate+0x1f/0x140 [sfc]
        efx_pci_remove+0x27/0x150 [sfc]
        pci_device_remove+0x3b/0xc0
        device_release_driver_internal+0x103/0x1f0
        pci_stop_bus_device+0x69/0x90
        pci_stop_and_remove_bus_device+0xe/0x20
        pci_iov_remove_virtfn+0xba/0x120
        sriov_disable+0x2f/0xe0
        efx_ef10_pci_sriov_disable+0x52/0x80 [sfc]
        ? pcie_aer_is_native+0x12/0x40
        efx_ef10_sriov_fini+0x72/0x110 [sfc]
        efx_pci_remove+0x62/0x150 [sfc]
        pci_device_remove+0x3b/0xc0
        device_release_driver_internal+0x103/0x1f0
        unbind_store+0xf6/0x130
        kernfs_fop_write+0x116/0x190
        vfs_write+0xa5/0x1a0
        ksys_write+0x4f/0xb0
        do_syscall_64+0x5b/0x1a0
        entry_SYSCALL_64_after_hwframe+0x65/0xca
    
    Signed-off-by: ?ñigo Huguet <ihuguet@redhat.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/sfc/ef10_sriov.c b/drivers/net/ethernet/sfc/ef10_sriov.c
index 3d76fd1504c2..edd5ae855886 100644
--- a/drivers/net/ethernet/sfc/ef10_sriov.c
+++ b/drivers/net/ethernet/sfc/ef10_sriov.c
@@ -443,7 +443,6 @@ int efx_ef10_sriov_init(struct efx_nic *efx)
 void efx_ef10_sriov_fini(struct efx_nic *efx)
 {
 	struct efx_ef10_nic_data *nic_data = efx->nic_data;
-	unsigned int i;
 	int rc;
 
 	if (!nic_data->vf) {
@@ -453,14 +452,7 @@ void efx_ef10_sriov_fini(struct efx_nic *efx)
 		return;
 	}
 
-	/* Remove any VFs in the host */
-	for (i = 0; i < efx->vf_count; ++i) {
-		struct efx_nic *vf_efx = nic_data->vf[i].efx;
-
-		if (vf_efx)
-			vf_efx->pci_dev->driver->remove(vf_efx->pci_dev);
-	}
-
+	/* Disable SRIOV and remove any VFs in the host */
 	rc = efx_ef10_pci_sriov_disable(efx, true);
 	if (rc)
 		netif_dbg(efx, drv, efx->net_dev,

commit 7b1abc4e97cf14d14c30fcd2055663af53d92e2d
Author: Johannes Berg <johannes.berg@intel.com>
Date:   Fri Jun 18 11:01:16 2021 +0300

    iwlwifi: pcie: free IML DMA memory allocation
    
    [ Upstream commit 310f60f53a86eba680d9bc20a371e13b06a5f903 ]
    
    In the case of gen3 devices with image loader (IML) support,
    we were leaking the IML DMA allocation and never freeing it.
    Fix that.
    
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
    Link: https://lore.kernel.org/r/iwlwifi.20210618105614.07e117dbedb7.I7bb9ebbe0617656986c2a598ea5e827b533bd3b9@changeid
    Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c b/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c
index a1cecf4a0e82..addf786fbcaf 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c
@@ -63,7 +63,6 @@ int iwl_pcie_ctxt_info_gen3_init(struct iwl_trans *trans,
 	struct iwl_prph_scratch *prph_scratch;
 	struct iwl_prph_scratch_ctrl_cfg *prph_sc_ctrl;
 	struct iwl_prph_info *prph_info;
-	void *iml_img;
 	u32 control_flags = 0;
 	int ret;
 
@@ -157,14 +156,15 @@ int iwl_pcie_ctxt_info_gen3_init(struct iwl_trans *trans,
 	trans_pcie->prph_scratch = prph_scratch;
 
 	/* Allocate IML */
-	iml_img = dma_alloc_coherent(trans->dev, trans->iml_len,
-				     &trans_pcie->iml_dma_addr, GFP_KERNEL);
-	if (!iml_img) {
+	trans_pcie->iml = dma_alloc_coherent(trans->dev, trans->iml_len,
+					     &trans_pcie->iml_dma_addr,
+					     GFP_KERNEL);
+	if (!trans_pcie->iml) {
 		ret = -ENOMEM;
 		goto err_free_ctxt_info;
 	}
 
-	memcpy(iml_img, trans->iml, trans->iml_len);
+	memcpy(trans_pcie->iml, trans->iml, trans->iml_len);
 
 	iwl_enable_fw_load_int_ctx_info(trans);
 
@@ -212,6 +212,11 @@ void iwl_pcie_ctxt_info_gen3_free(struct iwl_trans *trans)
 	trans_pcie->ctxt_info_dma_addr = 0;
 	trans_pcie->ctxt_info_gen3 = NULL;
 
+	dma_free_coherent(trans->dev, trans->iml_len, trans_pcie->iml,
+			  trans_pcie->iml_dma_addr);
+	trans_pcie->iml_dma_addr = 0;
+	trans_pcie->iml = NULL;
+
 	iwl_pcie_ctxt_info_free_fw_img(trans);
 
 	dma_free_coherent(trans->dev, sizeof(*trans_pcie->prph_scratch),
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
index e9d67ba3e56d..f581822b2a7d 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
@@ -447,6 +447,8 @@ struct iwl_self_init_dram {
  *	Context information addresses will be taken from here.
  *	This is driver's local copy for keeping track of size and
  *	count for allocating and freeing the memory.
+ * @iml: image loader image virtual address
+ * @iml_dma_addr: image loader image DMA address
  * @trans: pointer to the generic transport area
  * @scd_base_addr: scheduler sram base address in SRAM
  * @scd_bc_tbls: pointer to the byte count table of the scheduler
@@ -492,6 +494,7 @@ struct iwl_trans_pcie {
 	};
 	struct iwl_prph_info *prph_info;
 	struct iwl_prph_scratch *prph_scratch;
+	void *iml;
 	dma_addr_t ctxt_info_dma_addr;
 	dma_addr_t prph_info_dma_addr;
 	dma_addr_t prph_scratch_dma_addr;

commit 6c536e805fe4771ea4bf098e23e0364af5badc46
Author: Johannes Berg <johannes.berg@intel.com>
Date:   Sat Jun 12 14:32:38 2021 +0300

    iwlwifi: mvm: don't change band on bound PHY contexts
    
    [ Upstream commit 8835a64f74c46baebfc946cd5a2c861b866ebcee ]
    
    When we have a P2P Device active, we attempt to only change the
    PHY context it uses when we get a new remain-on-channel, if the
    P2P Device is the only user of the PHY context.
    
    This is fine if we're switching within a band, but if we're
    switching bands then the switch implies a removal and re-add
    of the PHY context, which isn't permitted by the firmware while
    it's bound to an interface.
    
    Fix the code to skip the unbind/release/... cycle only if the
    band doesn't change (or we have old devices that can switch the
    band on the fly as well.)
    
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
    Link: https://lore.kernel.org/r/iwlwifi.20210612142637.e9ac313f70f3.I713b9d109957df7e7d9ed0861d5377ce3f8fccd3@changeid
    Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index 2fad20c845b4..697a66acba9c 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -3496,6 +3496,7 @@ static int iwl_mvm_roc(struct ieee80211_hw *hw,
 	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
 	struct cfg80211_chan_def chandef;
 	struct iwl_mvm_phy_ctxt *phy_ctxt;
+	bool band_change_removal;
 	int ret, i;
 
 	IWL_DEBUG_MAC80211(mvm, "enter (%d, %d, %d)\n", channel->hw_value,
@@ -3565,19 +3566,30 @@ static int iwl_mvm_roc(struct ieee80211_hw *hw,
 	cfg80211_chandef_create(&chandef, channel, NL80211_CHAN_NO_HT);
 
 	/*
-	 * Change the PHY context configuration as it is currently referenced
-	 * only by the P2P Device MAC
+	 * Check if the remain-on-channel is on a different band and that
+	 * requires context removal, see iwl_mvm_phy_ctxt_changed(). If
+	 * so, we'll need to release and then re-configure here, since we
+	 * must not remove a PHY context that's part of a binding.
 	 */
-	if (mvmvif->phy_ctxt->ref == 1) {
+	band_change_removal =
+		fw_has_capa(&mvm->fw->ucode_capa,
+			    IWL_UCODE_TLV_CAPA_BINDING_CDB_SUPPORT) &&
+		mvmvif->phy_ctxt->channel->band != chandef.chan->band;
+
+	if (mvmvif->phy_ctxt->ref == 1 && !band_change_removal) {
+		/*
+		 * Change the PHY context configuration as it is currently
+		 * referenced only by the P2P Device MAC (and we can modify it)
+		 */
 		ret = iwl_mvm_phy_ctxt_changed(mvm, mvmvif->phy_ctxt,
 					       &chandef, 1, 1);
 		if (ret)
 			goto out_unlock;
 	} else {
 		/*
-		 * The PHY context is shared with other MACs. Need to remove the
-		 * P2P Device from the binding, allocate an new PHY context and
-		 * create a new binding
+		 * The PHY context is shared with other MACs (or we're trying to
+		 * switch bands), so remove the P2P Device from the binding,
+		 * allocate an new PHY context and create a new binding.
 		 */
 		phy_ctxt = iwl_mvm_get_free_phy_ctxt(mvm);
 		if (!phy_ctxt) {

commit 92aa20a768b4a1b30242801c39d61b51c6127ffe
Author: Xiao Yang <yangx.jy@fujitsu.com>
Date:   Mon Jun 21 15:14:56 2021 +0800

    RDMA/rxe: Don't overwrite errno from ib_umem_get()
    
    [ Upstream commit 20ec0a6d6016aa28b9b3299be18baef1a0f91cd2 ]
    
    rxe_mr_init_user() always returns the fixed -EINVAL when ib_umem_get()
    fails so it's hard for user to know which actual error happens in
    ib_umem_get(). For example, ib_umem_get() will return -EOPNOTSUPP when
    trying to pin pages on a DAX file.
    
    Return actual error as mlx4/mlx5 does.
    
    Link: https://lore.kernel.org/r/20210621071456.4259-1-ice_yangxiao@163.com
    Signed-off-by: Xiao Yang <yangx.jy@fujitsu.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/infiniband/sw/rxe/rxe_mr.c b/drivers/infiniband/sw/rxe/rxe_mr.c
index 2cca89ca08cd..375e5520865e 100644
--- a/drivers/infiniband/sw/rxe/rxe_mr.c
+++ b/drivers/infiniband/sw/rxe/rxe_mr.c
@@ -175,7 +175,7 @@ int rxe_mem_init_user(struct rxe_pd *pd, u64 start,
 	if (IS_ERR(umem)) {
 		pr_warn("err %d from rxe_umem_get\n",
 			(int)PTR_ERR(umem));
-		err = -EINVAL;
+		err = PTR_ERR(umem);
 		goto err1;
 	}
 

commit 0ea3919ffdb946390669b89e2437e0a70e8581be
Author: Longpeng(Mike) <longpeng2@huawei.com>
Date:   Mon Jun 21 14:26:01 2021 +0800

    vsock: notify server to shutdown when client has pending signal
    
    [ Upstream commit c7ff9cff70601ea19245d997bb977344663434c7 ]
    
    The client's sk_state will be set to TCP_ESTABLISHED if the server
    replay the client's connect request.
    
    However, if the client has pending signal, its sk_state will be set
    to TCP_CLOSE without notify the server, so the server will hold the
    corrupt connection.
    
                client                        server
    
    1. sk_state=TCP_SYN_SENT         |
    2. call ->connect()              |
    3. wait reply                    |
                                     | 4. sk_state=TCP_ESTABLISHED
                                     | 5. insert to connected list
                                     | 6. reply to the client
    7. sk_state=TCP_ESTABLISHED      |
    8. insert to connected list      |
    9. *signal pending* <--------------------- the user kill client
    10. sk_state=TCP_CLOSE           |
    client is exiting...             |
    11. call ->release()             |
         virtio_transport_close
          if (!(sk->sk_state == TCP_ESTABLISHED ||
                  sk->sk_state == TCP_CLOSING))
                    return true; *return at here, the server cannot notice the connection is corrupt*
    
    So the client should notify the peer in this case.
    
    Cc: David S. Miller <davem@davemloft.net>
    Cc: Jakub Kicinski <kuba@kernel.org>
    Cc: Jorgen Hansen <jhansen@vmware.com>
    Cc: Norbert Slusarek <nslusarek@gmx.net>
    Cc: Andra Paraschiv <andraprs@amazon.com>
    Cc: Colin Ian King <colin.king@canonical.com>
    Cc: David Brazdil <dbrazdil@google.com>
    Cc: Alexander Popov <alex.popov@linux.com>
    Suggested-by: Stefano Garzarella <sgarzare@redhat.com>
    Link: https://lkml.org/lkml/2021/5/17/418
    Signed-off-by: lixianming <lixianming5@huawei.com>
    Signed-off-by: Longpeng(Mike) <longpeng2@huawei.com>
    Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
index aceafec612a8..2d31fce5c218 100644
--- a/net/vmw_vsock/af_vsock.c
+++ b/net/vmw_vsock/af_vsock.c
@@ -1225,7 +1225,7 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr,
 
 		if (signal_pending(current)) {
 			err = sock_intr_errno(timeout);
-			sk->sk_state = TCP_CLOSE;
+			sk->sk_state = sk->sk_state == TCP_ESTABLISHED ? TCP_CLOSING : TCP_CLOSE;
 			sock->state = SS_UNCONNECTED;
 			vsock_transport_cancel_pkt(vsk);
 			goto out_wait;

commit e34c635cf0344be10aca8a104ba509c00704d03c
Author: Zheyu Ma <zheyuma97@gmail.com>
Date:   Sun Jun 20 15:24:15 2021 +0000

    atm: nicstar: register the interrupt handler in the right place
    
    [ Upstream commit 70b639dc41ad499384e41e106fce72e36805c9f2 ]
    
    Because the error handling is sequential, the application of resources
    should be carried out in the order of error handling, so the operation
    of registering the interrupt handler should be put in front, so as not
    to free the unregistered interrupt handler during error handling.
    
    This log reveals it:
    
    [    3.438724] Trying to free already-free IRQ 23
    [    3.439060] WARNING: CPU: 5 PID: 1 at kernel/irq/manage.c:1825 free_irq+0xfb/0x480
    [    3.440039] Modules linked in:
    [    3.440257] CPU: 5 PID: 1 Comm: swapper/0 Not tainted 5.12.4-g70e7f0549188-dirty #142
    [    3.440793] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.12.0-59-gc9ba5276e321-prebuilt.qemu.org 04/01/2014
    [    3.441561] RIP: 0010:free_irq+0xfb/0x480
    [    3.441845] Code: 6e 08 74 6f 4d 89 f4 e8 c3 78 09 00 4d 8b 74 24 18 4d 85 f6 75 e3 e8 b4 78 09 00 8b 75 c8 48 c7 c7 a0 ac d5 85 e8 95 d7 f5 ff <0f> 0b 48 8b 75 c0 4c 89 ff e8 87 c5 90 03 48 8b 43 40 4c 8b a0 80
    [    3.443121] RSP: 0000:ffffc90000017b50 EFLAGS: 00010086
    [    3.443483] RAX: 0000000000000000 RBX: ffff888107c6f000 RCX: 0000000000000000
    [    3.443972] RDX: 0000000000000000 RSI: ffffffff8123f301 RDI: 00000000ffffffff
    [    3.444462] RBP: ffffc90000017b90 R08: 0000000000000001 R09: 0000000000000003
    [    3.444950] R10: 0000000000000000 R11: 0000000000000001 R12: 0000000000000000
    [    3.444994] R13: ffff888107dc0000 R14: ffff888104f6bf00 R15: ffff888107c6f0a8
    [    3.444994] FS:  0000000000000000(0000) GS:ffff88817bd40000(0000) knlGS:0000000000000000
    [    3.444994] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [    3.444994] CR2: 0000000000000000 CR3: 000000000642e000 CR4: 00000000000006e0
    [    3.444994] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    [    3.444994] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    [    3.444994] Call Trace:
    [    3.444994]  ns_init_card_error+0x18e/0x250
    [    3.444994]  nicstar_init_one+0x10d2/0x1130
    [    3.444994]  local_pci_probe+0x4a/0xb0
    [    3.444994]  pci_device_probe+0x126/0x1d0
    [    3.444994]  ? pci_device_remove+0x100/0x100
    [    3.444994]  really_probe+0x27e/0x650
    [    3.444994]  driver_probe_device+0x84/0x1d0
    [    3.444994]  ? mutex_lock_nested+0x16/0x20
    [    3.444994]  device_driver_attach+0x63/0x70
    [    3.444994]  __driver_attach+0x117/0x1a0
    [    3.444994]  ? device_driver_attach+0x70/0x70
    [    3.444994]  bus_for_each_dev+0xb6/0x110
    [    3.444994]  ? rdinit_setup+0x40/0x40
    [    3.444994]  driver_attach+0x22/0x30
    [    3.444994]  bus_add_driver+0x1e6/0x2a0
    [    3.444994]  driver_register+0xa4/0x180
    [    3.444994]  __pci_register_driver+0x77/0x80
    [    3.444994]  ? uPD98402_module_init+0xd/0xd
    [    3.444994]  nicstar_init+0x1f/0x75
    [    3.444994]  do_one_initcall+0x7a/0x3d0
    [    3.444994]  ? rdinit_setup+0x40/0x40
    [    3.444994]  ? rcu_read_lock_sched_held+0x4a/0x70
    [    3.444994]  kernel_init_freeable+0x2a7/0x2f9
    [    3.444994]  ? rest_init+0x2c0/0x2c0
    [    3.444994]  kernel_init+0x13/0x180
    [    3.444994]  ? rest_init+0x2c0/0x2c0
    [    3.444994]  ? rest_init+0x2c0/0x2c0
    [    3.444994]  ret_from_fork+0x1f/0x30
    [    3.444994] Kernel panic - not syncing: panic_on_warn set ...
    [    3.444994] CPU: 5 PID: 1 Comm: swapper/0 Not tainted 5.12.4-g70e7f0549188-dirty #142
    [    3.444994] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.12.0-59-gc9ba5276e321-prebuilt.qemu.org 04/01/2014
    [    3.444994] Call Trace:
    [    3.444994]  dump_stack+0xba/0xf5
    [    3.444994]  ? free_irq+0xfb/0x480
    [    3.444994]  panic+0x155/0x3ed
    [    3.444994]  ? __warn+0xed/0x150
    [    3.444994]  ? free_irq+0xfb/0x480
    [    3.444994]  __warn+0x103/0x150
    [    3.444994]  ? free_irq+0xfb/0x480
    [    3.444994]  report_bug+0x119/0x1c0
    [    3.444994]  handle_bug+0x3b/0x80
    [    3.444994]  exc_invalid_op+0x18/0x70
    [    3.444994]  asm_exc_invalid_op+0x12/0x20
    [    3.444994] RIP: 0010:free_irq+0xfb/0x480
    [    3.444994] Code: 6e 08 74 6f 4d 89 f4 e8 c3 78 09 00 4d 8b 74 24 18 4d 85 f6 75 e3 e8 b4 78 09 00 8b 75 c8 48 c7 c7 a0 ac d5 85 e8 95 d7 f5 ff <0f> 0b 48 8b 75 c0 4c 89 ff e8 87 c5 90 03 48 8b 43 40 4c 8b a0 80
    [    3.444994] RSP: 0000:ffffc90000017b50 EFLAGS: 00010086
    [    3.444994] RAX: 0000000000000000 RBX: ffff888107c6f000 RCX: 0000000000000000
    [    3.444994] RDX: 0000000000000000 RSI: ffffffff8123f301 RDI: 00000000ffffffff
    [    3.444994] RBP: ffffc90000017b90 R08: 0000000000000001 R09: 0000000000000003
    [    3.444994] R10: 0000000000000000 R11: 0000000000000001 R12: 0000000000000000
    [    3.444994] R13: ffff888107dc0000 R14: ffff888104f6bf00 R15: ffff888107c6f0a8
    [    3.444994]  ? vprintk_func+0x71/0x110
    [    3.444994]  ns_init_card_error+0x18e/0x250
    [    3.444994]  nicstar_init_one+0x10d2/0x1130
    [    3.444994]  local_pci_probe+0x4a/0xb0
    [    3.444994]  pci_device_probe+0x126/0x1d0
    [    3.444994]  ? pci_device_remove+0x100/0x100
    [    3.444994]  really_probe+0x27e/0x650
    [    3.444994]  driver_probe_device+0x84/0x1d0
    [    3.444994]  ? mutex_lock_nested+0x16/0x20
    [    3.444994]  device_driver_attach+0x63/0x70
    [    3.444994]  __driver_attach+0x117/0x1a0
    [    3.444994]  ? device_driver_attach+0x70/0x70
    [    3.444994]  bus_for_each_dev+0xb6/0x110
    [    3.444994]  ? rdinit_setup+0x40/0x40
    [    3.444994]  driver_attach+0x22/0x30
    [    3.444994]  bus_add_driver+0x1e6/0x2a0
    [    3.444994]  driver_register+0xa4/0x180
    [    3.444994]  __pci_register_driver+0x77/0x80
    [    3.444994]  ? uPD98402_module_init+0xd/0xd
    [    3.444994]  nicstar_init+0x1f/0x75
    [    3.444994]  do_one_initcall+0x7a/0x3d0
    [    3.444994]  ? rdinit_setup+0x40/0x40
    [    3.444994]  ? rcu_read_lock_sched_held+0x4a/0x70
    [    3.444994]  kernel_init_freeable+0x2a7/0x2f9
    [    3.444994]  ? rest_init+0x2c0/0x2c0
    [    3.444994]  kernel_init+0x13/0x180
    [    3.444994]  ? rest_init+0x2c0/0x2c0
    [    3.444994]  ? rest_init+0x2c0/0x2c0
    [    3.444994]  ret_from_fork+0x1f/0x30
    [    3.444994] Dumping ftrace buffer:
    [    3.444994]    (ftrace buffer empty)
    [    3.444994] Kernel Offset: disabled
    [    3.444994] Rebooting in 1 seconds..
    
    Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/atm/nicstar.c b/drivers/atm/nicstar.c
index 85ca859b7f0f..78e72b86dc04 100644
--- a/drivers/atm/nicstar.c
+++ b/drivers/atm/nicstar.c
@@ -524,6 +524,15 @@ static int ns_init_card(int i, struct pci_dev *pcidev)
 	/* Set the VPI/VCI MSb mask to zero so we can receive OAM cells */
 	writel(0x00000000, card->membase + VPM);
 
+	card->intcnt = 0;
+	if (request_irq
+	    (pcidev->irq, &ns_irq_handler, IRQF_SHARED, "nicstar", card) != 0) {
+		pr_err("nicstar%d: can't allocate IRQ %d.\n", i, pcidev->irq);
+		error = 9;
+		ns_init_card_error(card, error);
+		return error;
+	}
+
 	/* Initialize TSQ */
 	card->tsq.org = dma_alloc_coherent(&card->pcidev->dev,
 					   NS_TSQSIZE + NS_TSQ_ALIGNMENT,
@@ -750,15 +759,6 @@ static int ns_init_card(int i, struct pci_dev *pcidev)
 
 	card->efbie = 1;
 
-	card->intcnt = 0;
-	if (request_irq
-	    (pcidev->irq, &ns_irq_handler, IRQF_SHARED, "nicstar", card) != 0) {
-		printk("nicstar%d: can't allocate IRQ %d.\n", i, pcidev->irq);
-		error = 9;
-		ns_init_card_error(card, error);
-		return error;
-	}
-
 	/* Register device */
 	card->atmdev = atm_dev_register("nicstar", &card->pcidev->dev, &atm_ops,
 					-1, NULL);

commit a618f815f36252d07170cbbc15a0115399dd9998
Author: Zheyu Ma <zheyuma97@gmail.com>
Date:   Sun Jun 20 15:24:14 2021 +0000

    atm: nicstar: use 'dma_free_coherent' instead of 'kfree'
    
    [ Upstream commit 6a1e5a4af17e440dd82a58a2c5f40ff17a82b722 ]
    
    When 'nicstar_init_one' fails, 'ns_init_card_error' will be executed for
    error handling, but the correct memory free function should be used,
    otherwise it will cause an error. Since 'card->rsq.org' and
    'card->tsq.org' are allocated using 'dma_alloc_coherent' function, they
    should be freed using 'dma_free_coherent'.
    
    Fix this by using 'dma_free_coherent' instead of 'kfree'
    
    This log reveals it:
    
    [    3.440294] kernel BUG at mm/slub.c:4206!
    [    3.441059] invalid opcode: 0000 [#1] PREEMPT SMP PTI
    [    3.441430] CPU: 2 PID: 1 Comm: swapper/0 Not tainted 5.12.4-g70e7f0549188-dirty #141
    [    3.441986] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.12.0-59-gc9ba5276e321-prebuilt.qemu.org 04/01/2014
    [    3.442780] RIP: 0010:kfree+0x26a/0x300
    [    3.443065] Code: e8 3a c3 b9 ff e9 d6 fd ff ff 49 8b 45 00 31 db a9 00 00 01 00 75 4d 49 8b 45 00 a9 00 00 01 00 75 0a 49 8b 45 08 a8 01 75 02 <0f> 0b 89 d9 b8 00 10 00 00 be 06 00 00 00 48 d3 e0 f7 d8 48 63 d0
    [    3.443396] RSP: 0000:ffffc90000017b70 EFLAGS: 00010246
    [    3.443396] RAX: dead000000000100 RBX: 0000000000000000 RCX: 0000000000000000
    [    3.443396] RDX: 0000000000000000 RSI: ffffffff85d3df94 RDI: ffffffff85df38e6
    [    3.443396] RBP: ffffc90000017b90 R08: 0000000000000001 R09: 0000000000000001
    [    3.443396] R10: 0000000000000000 R11: 0000000000000001 R12: ffff888107dc0000
    [    3.443396] R13: ffffea00001f0100 R14: ffff888101a8bf00 R15: ffff888107dc0160
    [    3.443396] FS:  0000000000000000(0000) GS:ffff88817bc80000(0000) knlGS:0000000000000000
    [    3.443396] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [    3.443396] CR2: 0000000000000000 CR3: 000000000642e000 CR4: 00000000000006e0
    [    3.443396] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    [    3.443396] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    [    3.443396] Call Trace:
    [    3.443396]  ns_init_card_error+0x12c/0x220
    [    3.443396]  nicstar_init_one+0x10d2/0x1130
    [    3.443396]  local_pci_probe+0x4a/0xb0
    [    3.443396]  pci_device_probe+0x126/0x1d0
    [    3.443396]  ? pci_device_remove+0x100/0x100
    [    3.443396]  really_probe+0x27e/0x650
    [    3.443396]  driver_probe_device+0x84/0x1d0
    [    3.443396]  ? mutex_lock_nested+0x16/0x20
    [    3.443396]  device_driver_attach+0x63/0x70
    [    3.443396]  __driver_attach+0x117/0x1a0
    [    3.443396]  ? device_driver_attach+0x70/0x70
    [    3.443396]  bus_for_each_dev+0xb6/0x110
    [    3.443396]  ? rdinit_setup+0x40/0x40
    [    3.443396]  driver_attach+0x22/0x30
    [    3.443396]  bus_add_driver+0x1e6/0x2a0
    [    3.443396]  driver_register+0xa4/0x180
    [    3.443396]  __pci_register_driver+0x77/0x80
    [    3.443396]  ? uPD98402_module_init+0xd/0xd
    [    3.443396]  nicstar_init+0x1f/0x75
    [    3.443396]  do_one_initcall+0x7a/0x3d0
    [    3.443396]  ? rdinit_setup+0x40/0x40
    [    3.443396]  ? rcu_read_lock_sched_held+0x4a/0x70
    [    3.443396]  kernel_init_freeable+0x2a7/0x2f9
    [    3.443396]  ? rest_init+0x2c0/0x2c0
    [    3.443396]  kernel_init+0x13/0x180
    [    3.443396]  ? rest_init+0x2c0/0x2c0
    [    3.443396]  ? rest_init+0x2c0/0x2c0
    [    3.443396]  ret_from_fork+0x1f/0x30
    [    3.443396] Modules linked in:
    [    3.443396] Dumping ftrace buffer:
    [    3.443396]    (ftrace buffer empty)
    [    3.458593] ---[ end trace 3c6f8f0d8ef59bcd ]---
    [    3.458922] RIP: 0010:kfree+0x26a/0x300
    [    3.459198] Code: e8 3a c3 b9 ff e9 d6 fd ff ff 49 8b 45 00 31 db a9 00 00 01 00 75 4d 49 8b 45 00 a9 00 00 01 00 75 0a 49 8b 45 08 a8 01 75 02 <0f> 0b 89 d9 b8 00 10 00 00 be 06 00 00 00 48 d3 e0 f7 d8 48 63 d0
    [    3.460499] RSP: 0000:ffffc90000017b70 EFLAGS: 00010246
    [    3.460870] RAX: dead000000000100 RBX: 0000000000000000 RCX: 0000000000000000
    [    3.461371] RDX: 0000000000000000 RSI: ffffffff85d3df94 RDI: ffffffff85df38e6
    [    3.461873] RBP: ffffc90000017b90 R08: 0000000000000001 R09: 0000000000000001
    [    3.462372] R10: 0000000000000000 R11: 0000000000000001 R12: ffff888107dc0000
    [    3.462871] R13: ffffea00001f0100 R14: ffff888101a8bf00 R15: ffff888107dc0160
    [    3.463368] FS:  0000000000000000(0000) GS:ffff88817bc80000(0000) knlGS:0000000000000000
    [    3.463949] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [    3.464356] CR2: 0000000000000000 CR3: 000000000642e000 CR4: 00000000000006e0
    [    3.464856] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    [    3.465356] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    [    3.465860] Kernel panic - not syncing: Fatal exception
    [    3.466370] Dumping ftrace buffer:
    [    3.466616]    (ftrace buffer empty)
    [    3.466871] Kernel Offset: disabled
    [    3.467122] Rebooting in 1 seconds..
    
    Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/atm/nicstar.c b/drivers/atm/nicstar.c
index 5281db3d6783..85ca859b7f0f 100644
--- a/drivers/atm/nicstar.c
+++ b/drivers/atm/nicstar.c
@@ -836,10 +836,12 @@ static void ns_init_card_error(ns_dev *card, int error)
 			dev_kfree_skb_any(hb);
 	}
 	if (error >= 12) {
-		kfree(card->rsq.org);
+		dma_free_coherent(&card->pcidev->dev, NS_RSQSIZE + NS_RSQ_ALIGNMENT,
+				card->rsq.org, card->rsq.dma);
 	}
 	if (error >= 11) {
-		kfree(card->tsq.org);
+		dma_free_coherent(&card->pcidev->dev, NS_TSQSIZE + NS_TSQ_ALIGNMENT,
+				card->tsq.org, card->tsq.dma);
 	}
 	if (error >= 10) {
 		free_irq(card->pcidev->irq, card);

commit 68046cc531577b8f0ebe67ccf18b9c70106d7937
Author: Huang Pei <huangpei@loongson.cn>
Date:   Fri Jun 11 15:09:46 2021 +0800

    MIPS: add PMD table accounting into MIPS'pmd_alloc_one
    
    [ Upstream commit ed914d48b6a1040d1039d371b56273d422c0081e ]
    
    This fixes Page Table accounting bug.
    
    MIPS is the ONLY arch just defining __HAVE_ARCH_PMD_ALLOC_ONE alone.
    Since commit b2b29d6d011944 (mm: account PMD tables like PTE tables),
    "pmd_free" in asm-generic with PMD table accounting and "pmd_alloc_one"
    in MIPS without PMD table accounting causes PageTable accounting number
    negative, which read by global_zone_page_state(), always returns 0.
    
    Signed-off-by: Huang Pei <huangpei@loongson.cn>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/include/asm/pgalloc.h b/arch/mips/include/asm/pgalloc.h
index 39b9f311c4ef..f800872f867b 100644
--- a/arch/mips/include/asm/pgalloc.h
+++ b/arch/mips/include/asm/pgalloc.h
@@ -93,11 +93,15 @@ do {							\
 
 static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
 {
-	pmd_t *pmd;
+	pmd_t *pmd = NULL;
+	struct page *pg;
 
-	pmd = (pmd_t *) __get_free_pages(GFP_KERNEL, PMD_ORDER);
-	if (pmd)
+	pg = alloc_pages(GFP_KERNEL | __GFP_ACCOUNT, PMD_ORDER);
+	if (pg) {
+		pgtable_pmd_page_ctor(pg);
+		pmd = (pmd_t *)page_address(pg);
 		pmd_init((unsigned long)pmd, (unsigned long)invalid_pte_table);
+	}
 	return pmd;
 }
 

commit d1b71f247486c73b3afc747d31f97c2159ec3f2e
Author: Pascal Terjan <pterjan@google.com>
Date:   Sat Apr 24 18:29:59 2021 +0100

    rtl8xxxu: Fix device info for RTL8192EU devices
    
    [ Upstream commit c240b044edefa3c3af4014a4030e017dd95b59a1 ]
    
    Based on 2001:3319 and 2357:0109 which I used to test the fix and
    0bda:818b and 2357:0108 for which I found efuse dumps online.
    
    == 2357:0109 ==
    === Before ===
    Vendor: Realtek
    Product: \x03802.11n NI
    Serial:
    === After ===
    Vendor: Realtek
    Product: 802.11n NIC
    Serial not available.
    
    == 2001:3319 ==
    === Before ===
    Vendor: Realtek
    Product: Wireless N
    Serial: no USB Adap
    === After ===
    Vendor: Realtek
    Product: Wireless N Nano USB Adapter
    Serial not available.
    
    Signed-off-by: Pascal Terjan <pterjan@google.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210424172959.1559890-1-pterjan@google.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index 47c2bfe06d03..bd28deff9b8c 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -861,15 +861,10 @@ struct rtl8192eu_efuse {
 	u8 usb_optional_function;
 	u8 res9[2];
 	u8 mac_addr[ETH_ALEN];		/* 0xd7 */
-	u8 res10[2];
-	u8 vendor_name[7];
-	u8 res11[2];
-	u8 device_name[0x0b];		/* 0xe8 */
-	u8 res12[2];
-	u8 serial[0x0b];		/* 0xf5 */
-	u8 res13[0x30];
+	u8 device_info[80];
+	u8 res11[3];
 	u8 unknown[0x0d];		/* 0x130 */
-	u8 res14[0xc3];
+	u8 res12[0xc3];
 };
 
 struct rtl8xxxu_reg8val {
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192e.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192e.c
index 380e86f9e00b..837a1b9d189d 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192e.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192e.c
@@ -562,9 +562,43 @@ rtl8192e_set_tx_power(struct rtl8xxxu_priv *priv, int channel, bool ht40)
 	}
 }
 
+static void rtl8192eu_log_next_device_info(struct rtl8xxxu_priv *priv,
+					   char *record_name,
+					   char *device_info,
+					   unsigned int *record_offset)
+{
+	char *record = device_info + *record_offset;
+
+	/* A record is [ total length | 0x03 | value ] */
+	unsigned char l = record[0];
+
+	/*
+	 * The whole device info section seems to be 80 characters, make sure
+	 * we don't read further.
+	 */
+	if (*record_offset + l > 80) {
+		dev_warn(&priv->udev->dev,
+			 "invalid record length %d while parsing \"%s\" at offset %u.\n",
+			 l, record_name, *record_offset);
+		return;
+	}
+
+	if (l >= 2) {
+		char value[80];
+
+		memcpy(value, &record[2], l - 2);
+		value[l - 2] = '\0';
+		dev_info(&priv->udev->dev, "%s: %s\n", record_name, value);
+		*record_offset = *record_offset + l;
+	} else {
+		dev_info(&priv->udev->dev, "%s not available.\n", record_name);
+	}
+}
+
 static int rtl8192eu_parse_efuse(struct rtl8xxxu_priv *priv)
 {
 	struct rtl8192eu_efuse *efuse = &priv->efuse_wifi.efuse8192eu;
+	unsigned int record_offset;
 	int i;
 
 	if (efuse->rtl_id != cpu_to_le16(0x8129))
@@ -612,12 +646,25 @@ static int rtl8192eu_parse_efuse(struct rtl8xxxu_priv *priv)
 	priv->has_xtalk = 1;
 	priv->xtalk = priv->efuse_wifi.efuse8192eu.xtal_k & 0x3f;
 
-	dev_info(&priv->udev->dev, "Vendor: %.7s\n", efuse->vendor_name);
-	dev_info(&priv->udev->dev, "Product: %.11s\n", efuse->device_name);
-	if (memchr_inv(efuse->serial, 0xff, 11))
-		dev_info(&priv->udev->dev, "Serial: %.11s\n", efuse->serial);
-	else
-		dev_info(&priv->udev->dev, "Serial not available.\n");
+	/*
+	 * device_info section seems to be laid out as records
+	 * [ total length | 0x03 | value ] so:
+	 * - vendor length + 2
+	 * - 0x03
+	 * - vendor string (not null terminated)
+	 * - product length + 2
+	 * - 0x03
+	 * - product string (not null terminated)
+	 * Then there is one or 2 0x00 on all the 4 devices I own or found
+	 * dumped online.
+	 * As previous version of the code handled an optional serial
+	 * string, I now assume there may be a third record if the
+	 * length is not 0.
+	 */
+	record_offset = 0;
+	rtl8192eu_log_next_device_info(priv, "Vendor", efuse->device_info, &record_offset);
+	rtl8192eu_log_next_device_info(priv, "Product", efuse->device_info, &record_offset);
+	rtl8192eu_log_next_device_info(priv, "Serial", efuse->device_info, &record_offset);
 
 	if (rtl8xxxu_debug & RTL8XXXU_DEBUG_EFUSE) {
 		unsigned char *raw = priv->efuse_wifi.raw;

commit cba5008c8581a5cdebf62b1d4699148c606ab423
Author: Jian Shen <shenjian15@huawei.com>
Date:   Thu Jun 17 11:37:11 2021 +0800

    net: fix mistake path for netdev_features_strings
    
    [ Upstream commit 2d8ea148e553e1dd4e80a87741abdfb229e2b323 ]
    
    Th_strings arrays netdev_features_strings, tunable_strings, and
    phy_tunable_strings has been moved to file net/ethtool/common.c.
    So fixes the comment.
    
    Signed-off-by: Jian Shen <shenjian15@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/netdev_features.h b/include/linux/netdev_features.h
index 4c76fe2c8488..2a8105d204a9 100644
--- a/include/linux/netdev_features.h
+++ b/include/linux/netdev_features.h
@@ -88,7 +88,7 @@ enum {
 
 	/*
 	 * Add your fresh new feature above and remember to update
-	 * netdev_features_strings[] in net/core/ethtool.c and maybe
+	 * netdev_features_strings[] in net/ethtool/common.c and maybe
 	 * some feature mask #defines below. Please also describe it
 	 * in Documentation/networking/netdev-features.txt.
 	 */
diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h
index fc21d3726b59..35b11c246aeb 100644
--- a/include/uapi/linux/ethtool.h
+++ b/include/uapi/linux/ethtool.h
@@ -227,7 +227,7 @@ enum tunable_id {
 	ETHTOOL_PFC_PREVENTION_TOUT, /* timeout in msecs */
 	/*
 	 * Add your fresh new tunable attribute above and remember to update
-	 * tunable_strings[] in net/core/ethtool.c
+	 * tunable_strings[] in net/ethtool/common.c
 	 */
 	__ETHTOOL_TUNABLE_COUNT,
 };
@@ -261,7 +261,7 @@ enum phy_tunable_id {
 	ETHTOOL_PHY_DOWNSHIFT,
 	/*
 	 * Add your fresh new phy tunable attribute above and remember to update
-	 * phy_tunable_strings[] in net/core/ethtool.c
+	 * phy_tunable_strings[] in net/ethtool/common.c
 	 */
 	__ETHTOOL_PHY_TUNABLE_COUNT,
 };

commit c1ee7d54b08150ed5035071c60d8425ca60815db
Author: Zou Wei <zou_wei@huawei.com>
Date:   Wed May 12 11:05:14 2021 +0800

    cw1200: add missing MODULE_DEVICE_TABLE
    
    [ Upstream commit dd778f89225cd258e8f0fed2b7256124982c8bb5 ]
    
    This patch adds missing MODULE_DEVICE_TABLE definition which generates
    correct modalias for automatic loading of this driver when it is built
    as an external module.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zou Wei <zou_wei@huawei.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/1620788714-14300-1-git-send-email-zou_wei@huawei.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/st/cw1200/cw1200_sdio.c b/drivers/net/wireless/st/cw1200/cw1200_sdio.c
index 1037ec62659d..ee86436bf152 100644
--- a/drivers/net/wireless/st/cw1200/cw1200_sdio.c
+++ b/drivers/net/wireless/st/cw1200/cw1200_sdio.c
@@ -63,6 +63,7 @@ static const struct sdio_device_id cw1200_sdio_ids[] = {
 	{ SDIO_DEVICE(SDIO_VENDOR_ID_STE, SDIO_DEVICE_ID_STE_CW1200) },
 	{ /* end: all zeroes */			},
 };
+MODULE_DEVICE_TABLE(sdio, cw1200_sdio_ids);
 
 /* hwbus_ops implemetation */
 

commit 115103f6e3f1c26c473766c16439c7c8b235529a
Author: Lee Gibson <leegib@gmail.com>
Date:   Wed Apr 28 12:55:08 2021 +0100

    wl1251: Fix possible buffer overflow in wl1251_cmd_scan
    
    [ Upstream commit d10a87a3535cce2b890897914f5d0d83df669c63 ]
    
    Function wl1251_cmd_scan calls memcpy without checking the length.
    Harden by checking the length is within the maximum allowed size.
    
    Signed-off-by: Lee Gibson <leegib@gmail.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210428115508.25624-1-leegib@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/ti/wl1251/cmd.c b/drivers/net/wireless/ti/wl1251/cmd.c
index 9547aea01b0f..ea0215246c5c 100644
--- a/drivers/net/wireless/ti/wl1251/cmd.c
+++ b/drivers/net/wireless/ti/wl1251/cmd.c
@@ -466,9 +466,12 @@ int wl1251_cmd_scan(struct wl1251 *wl, u8 *ssid, size_t ssid_len,
 		cmd->channels[i].channel = channels[i]->hw_value;
 	}
 
-	cmd->params.ssid_len = ssid_len;
-	if (ssid)
-		memcpy(cmd->params.ssid, ssid, ssid_len);
+	if (ssid) {
+		int len = clamp_val(ssid_len, 0, IEEE80211_MAX_SSID_LEN);
+
+		cmd->params.ssid_len = len;
+		memcpy(cmd->params.ssid, ssid, len);
+	}
 
 	ret = wl1251_cmd_send(wl, CMD_SCAN, cmd, sizeof(*cmd));
 	if (ret < 0) {

commit 5ad41656f8e27c1547bbb7cb9230eef8a80ba2aa
Author: Tony Lindgren <tony@atomide.com>
Date:   Thu Jun 3 09:28:14 2021 +0300

    wlcore/wl12xx: Fix wl12xx get_mac error if device is in ELP
    
    [ Upstream commit 11ef6bc846dcdce838f0b00c5f6a562c57e5d43b ]
    
    At least on wl12xx, reading the MAC after boot can fail with a warning
    at drivers/net/wireless/ti/wlcore/sdio.c:78 wl12xx_sdio_raw_read.
    The failed call comes from wl12xx_get_mac() that wlcore_nvs_cb() calls
    after request_firmware_work_func().
    
    After the error, no wireless interface is created. Reloading the wl12xx
    module makes the interface work.
    
    Turns out the wlan controller can be in a low-power ELP state after the
    boot from the bootloader or kexec, and needs to be woken up first.
    
    Let's wake the hardware and add a sleep after that similar to
    wl12xx_pre_boot() is already doing.
    
    Note that a similar issue could exist for wl18xx, but I have not seen it
    so far. And a search for wl18xx_get_mac and wl12xx_sdio_raw_read did not
    produce similar errors.
    
    Cc: Carl Philipp Klemm <philipp@uvos.xyz>
    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210603062814.19464-1-tony@atomide.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/ti/wl12xx/main.c b/drivers/net/wireless/ti/wl12xx/main.c
index e10fff42751e..b88c413f96ac 100644
--- a/drivers/net/wireless/ti/wl12xx/main.c
+++ b/drivers/net/wireless/ti/wl12xx/main.c
@@ -1517,6 +1517,13 @@ static int wl12xx_get_fuse_mac(struct wl1271 *wl)
 	u32 mac1, mac2;
 	int ret;
 
+	/* Device may be in ELP from the bootloader or kexec */
+	ret = wlcore_write32(wl, WL12XX_WELP_ARM_COMMAND, WELP_ARM_COMMAND_VAL);
+	if (ret < 0)
+		goto out;
+
+	usleep_range(500000, 700000);
+
 	ret = wlcore_set_partition(wl, &wl->ptable[PART_DRPW]);
 	if (ret < 0)
 		goto out;

commit b559f417a1aa8715fe040322b1efcb164aea9851
Author: Steffen Klassert <steffen.klassert@secunet.com>
Date:   Mon Jun 7 15:21:49 2021 +0200

    xfrm: Fix error reporting in xfrm_state_construct.
    
    [ Upstream commit 6fd06963fa74197103cdbb4b494763127b3f2f34 ]
    
    When memory allocation for XFRMA_ENCAP or XFRMA_COADDR fails,
    the error will not be reported because the -ENOMEM assignment
    to the err variable is overwritten before. Fix this by moving
    these two in front of the function so that memory allocation
    failures will be reported.
    
    Reported-by: Tobias Brunner <tobias@strongswan.org>
    Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
index 0b80c7907715..f94abe1fdd58 100644
--- a/net/xfrm/xfrm_user.c
+++ b/net/xfrm/xfrm_user.c
@@ -579,6 +579,20 @@ static struct xfrm_state *xfrm_state_construct(struct net *net,
 
 	copy_from_user_state(x, p);
 
+	if (attrs[XFRMA_ENCAP]) {
+		x->encap = kmemdup(nla_data(attrs[XFRMA_ENCAP]),
+				   sizeof(*x->encap), GFP_KERNEL);
+		if (x->encap == NULL)
+			goto error;
+	}
+
+	if (attrs[XFRMA_COADDR]) {
+		x->coaddr = kmemdup(nla_data(attrs[XFRMA_COADDR]),
+				    sizeof(*x->coaddr), GFP_KERNEL);
+		if (x->coaddr == NULL)
+			goto error;
+	}
+
 	if (attrs[XFRMA_SA_EXTRA_FLAGS])
 		x->props.extra_flags = nla_get_u32(attrs[XFRMA_SA_EXTRA_FLAGS]);
 
@@ -599,23 +613,9 @@ static struct xfrm_state *xfrm_state_construct(struct net *net,
 				   attrs[XFRMA_ALG_COMP])))
 		goto error;
 
-	if (attrs[XFRMA_ENCAP]) {
-		x->encap = kmemdup(nla_data(attrs[XFRMA_ENCAP]),
-				   sizeof(*x->encap), GFP_KERNEL);
-		if (x->encap == NULL)
-			goto error;
-	}
-
 	if (attrs[XFRMA_TFCPAD])
 		x->tfcpad = nla_get_u32(attrs[XFRMA_TFCPAD]);
 
-	if (attrs[XFRMA_COADDR]) {
-		x->coaddr = kmemdup(nla_data(attrs[XFRMA_COADDR]),
-				    sizeof(*x->coaddr), GFP_KERNEL);
-		if (x->coaddr == NULL)
-			goto error;
-	}
-
 	xfrm_mark_get(attrs, &x->mark);
 
 	xfrm_smark_init(attrs, &x->props.smark);

commit 0881aaa1bca6c228871f141b52500fe738f1909a
Author: Minchan Kim <minchan@kernel.org>
Date:   Wed Jun 9 09:37:17 2021 -0700

    selinux: use __GFP_NOWARN with GFP_NOWAIT in the AVC
    
    [ Upstream commit 648f2c6100cfa18e7dfe43bc0b9c3b73560d623c ]
    
    In the field, we have seen lots of allocation failure from the call
    path below.
    
    06-03 13:29:12.999 1010315 31557 31557 W Binder  : 31542_2: page allocation failure: order:0, mode:0x800(GFP_NOWAIT), nodemask=(null),cpuset=background,mems_allowed=0
    ...
    ...
    06-03 13:29:12.999 1010315 31557 31557 W Call trace:
    06-03 13:29:12.999 1010315 31557 31557 W         : dump_backtrace.cfi_jt+0x0/0x8
    06-03 13:29:12.999 1010315 31557 31557 W         : dump_stack+0xc8/0x14c
    06-03 13:29:12.999 1010315 31557 31557 W         : warn_alloc+0x158/0x1c8
    06-03 13:29:12.999 1010315 31557 31557 W         : __alloc_pages_slowpath+0x9d8/0xb80
    06-03 13:29:12.999 1010315 31557 31557 W         : __alloc_pages_nodemask+0x1c4/0x430
    06-03 13:29:12.999 1010315 31557 31557 W         : allocate_slab+0xb4/0x390
    06-03 13:29:12.999 1010315 31557 31557 W         : ___slab_alloc+0x12c/0x3a4
    06-03 13:29:12.999 1010315 31557 31557 W         : kmem_cache_alloc+0x358/0x5e4
    06-03 13:29:12.999 1010315 31557 31557 W         : avc_alloc_node+0x30/0x184
    06-03 13:29:12.999 1010315 31557 31557 W         : avc_update_node+0x54/0x4f0
    06-03 13:29:12.999 1010315 31557 31557 W         : avc_has_extended_perms+0x1a4/0x460
    06-03 13:29:12.999 1010315 31557 31557 W         : selinux_file_ioctl+0x320/0x3d0
    06-03 13:29:12.999 1010315 31557 31557 W         : __arm64_sys_ioctl+0xec/0x1fc
    06-03 13:29:12.999 1010315 31557 31557 W         : el0_svc_common+0xc0/0x24c
    06-03 13:29:12.999 1010315 31557 31557 W         : el0_svc+0x28/0x88
    06-03 13:29:12.999 1010315 31557 31557 W         : el0_sync_handler+0x8c/0xf0
    06-03 13:29:12.999 1010315 31557 31557 W         : el0_sync+0x1a4/0x1c0
    ..
    ..
    06-03 13:29:12.999 1010315 31557 31557 W SLUB    : Unable to allocate memory on node -1, gfp=0x900(GFP_NOWAIT|__GFP_ZERO)
    06-03 13:29:12.999 1010315 31557 31557 W cache   : avc_node, object size: 72, buffer size: 80, default order: 0, min order: 0
    06-03 13:29:12.999 1010315 31557 31557 W node 0  : slabs: 57, objs: 2907, free: 0
    06-03 13:29:12.999 1010161 10686 10686 W SLUB    : Unable to allocate memory on node -1, gfp=0x900(GFP_NOWAIT|__GFP_ZERO)
    06-03 13:29:12.999 1010161 10686 10686 W cache   : avc_node, object size: 72, buffer size: 80, default order: 0, min order: 0
    06-03 13:29:12.999 1010161 10686 10686 W node 0  : slabs: 57, objs: 2907, free: 0
    06-03 13:29:12.999 1010161 10686 10686 W SLUB    : Unable to allocate memory on node -1, gfp=0x900(GFP_NOWAIT|__GFP_ZERO)
    06-03 13:29:12.999 1010161 10686 10686 W cache   : avc_node, object size: 72, buffer size: 80, default order: 0, min order: 0
    06-03 13:29:12.999 1010161 10686 10686 W node 0  : slabs: 57, objs: 2907, free: 0
    06-03 13:29:12.999 1010161 10686 10686 W SLUB    : Unable to allocate memory on node -1, gfp=0x900(GFP_NOWAIT|__GFP_ZERO)
    06-03 13:29:12.999 1010161 10686 10686 W cache   : avc_node, object size: 72, buffer size: 80, default order: 0, min order: 0
    06-03 13:29:12.999 1010161 10686 10686 W node 0  : slabs: 57, objs: 2907, free: 0
    06-03 13:29:13.000 1010161 10686 10686 W SLUB    : Unable to allocate memory on node -1, gfp=0x900(GFP_NOWAIT|__GFP_ZERO)
    06-03 13:29:13.000 1010161 10686 10686 W cache   : avc_node, object size: 72, buffer size: 80, default order: 0, min order: 0
    06-03 13:29:13.000 1010161 10686 10686 W node 0  : slabs: 57, objs: 2907, free: 0
    06-03 13:29:13.000 1010161 10686 10686 W SLUB    : Unable to allocate memory on node -1, gfp=0x900(GFP_NOWAIT|__GFP_ZERO)
    06-03 13:29:13.000 1010161 10686 10686 W cache   : avc_node, object size: 72, buffer size: 80, default order: 0, min order: 0
    06-03 13:29:13.000 1010161 10686 10686 W node 0  : slabs: 57, objs: 2907, free: 0
    06-03 13:29:13.000 1010161 10686 10686 W SLUB    : Unable to allocate memory on node -1, gfp=0x900(GFP_NOWAIT|__GFP_ZERO)
    06-03 13:29:13.000 1010161 10686 10686 W cache   : avc_node, object size: 72, buffer size: 80, default order: 0, min order: 0
    06-03 13:29:13.000 1010161 10686 10686 W node 0  : slabs: 57, objs: 2907, free: 0
    06-03 13:29:13.000 10230 30892 30892 W SLUB    : Unable to allocate memory on node -1, gfp=0x900(GFP_NOWAIT|__GFP_ZERO)
    06-03 13:29:13.000 10230 30892 30892 W cache   : avc_node, object size: 72, buffer size: 80, default order: 0, min order: 0
    06-03 13:29:13.000 10230 30892 30892 W node 0  : slabs: 57, objs: 2907, free: 0
    06-03 13:29:13.000 10230 30892 30892 W SLUB    : Unable to allocate memory on node -1, gfp=0x900(GFP_NOWAIT|__GFP_ZERO)
    06-03 13:29:13.000 10230 30892 30892 W cache   : avc_node, object size: 72, buffer size: 80, default order: 0, min order: 0
    
    Based on [1], selinux is tolerate for failure of memory allocation.
    Then, use __GFP_NOWARN together.
    
    [1] 476accbe2f6e ("selinux: use GFP_NOWAIT in the AVC kmem_caches")
    
    Signed-off-by: Minchan Kim <minchan@kernel.org>
    [PM: subj fix, line wraps, normalized commit refs]
    Signed-off-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/security/selinux/avc.c b/security/selinux/avc.c
index d52be7b9f08c..717a4be771ab 100644
--- a/security/selinux/avc.c
+++ b/security/selinux/avc.c
@@ -366,26 +366,27 @@ static struct avc_xperms_decision_node
 	struct avc_xperms_decision_node *xpd_node;
 	struct extended_perms_decision *xpd;
 
-	xpd_node = kmem_cache_zalloc(avc_xperms_decision_cachep, GFP_NOWAIT);
+	xpd_node = kmem_cache_zalloc(avc_xperms_decision_cachep,
+				     GFP_NOWAIT | __GFP_NOWARN);
 	if (!xpd_node)
 		return NULL;
 
 	xpd = &xpd_node->xpd;
 	if (which & XPERMS_ALLOWED) {
 		xpd->allowed = kmem_cache_zalloc(avc_xperms_data_cachep,
-						GFP_NOWAIT);
+						GFP_NOWAIT | __GFP_NOWARN);
 		if (!xpd->allowed)
 			goto error;
 	}
 	if (which & XPERMS_AUDITALLOW) {
 		xpd->auditallow = kmem_cache_zalloc(avc_xperms_data_cachep,
-						GFP_NOWAIT);
+						GFP_NOWAIT | __GFP_NOWARN);
 		if (!xpd->auditallow)
 			goto error;
 	}
 	if (which & XPERMS_DONTAUDIT) {
 		xpd->dontaudit = kmem_cache_zalloc(avc_xperms_data_cachep,
-						GFP_NOWAIT);
+						GFP_NOWAIT | __GFP_NOWARN);
 		if (!xpd->dontaudit)
 			goto error;
 	}
@@ -413,7 +414,7 @@ static struct avc_xperms_node *avc_xperms_alloc(void)
 {
 	struct avc_xperms_node *xp_node;
 
-	xp_node = kmem_cache_zalloc(avc_xperms_cachep, GFP_NOWAIT);
+	xp_node = kmem_cache_zalloc(avc_xperms_cachep, GFP_NOWAIT | __GFP_NOWARN);
 	if (!xp_node)
 		return xp_node;
 	INIT_LIST_HEAD(&xp_node->xpd_head);
@@ -569,7 +570,7 @@ static struct avc_node *avc_alloc_node(struct selinux_avc *avc)
 {
 	struct avc_node *node;
 
-	node = kmem_cache_zalloc(avc_node_cachep, GFP_NOWAIT);
+	node = kmem_cache_zalloc(avc_node_cachep, GFP_NOWAIT | __GFP_NOWARN);
 	if (!node)
 		goto out;
 

commit ad9a63eb8ac0c0d8b7b13bb8d1c516e72e58eb3b
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Thu Jun 10 16:02:43 2021 +0800

    fjes: check return value after calling platform_get_resource()
    
    [ Upstream commit f18c11812c949553d2b2481ecaa274dd51bed1e7 ]
    
    It will cause null-ptr-deref if platform_get_resource() returns NULL,
    we need check the return value.
    
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/fjes/fjes_main.c b/drivers/net/fjes/fjes_main.c
index 1979f8f8dac7..778d3729f460 100644
--- a/drivers/net/fjes/fjes_main.c
+++ b/drivers/net/fjes/fjes_main.c
@@ -1277,6 +1277,10 @@ static int fjes_probe(struct platform_device *plat_dev)
 	adapter->interrupt_watch_enable = false;
 
 	res = platform_get_resource(plat_dev, IORESOURCE_MEM, 0);
+	if (!res) {
+		err = -EINVAL;
+		goto err_free_control_wq;
+	}
 	hw->hw_res.start = res->start;
 	hw->hw_res.size = resource_size(res);
 	hw->hw_res.irq = platform_get_irq(plat_dev, 0);

commit 3d4ba2600616a7c5e6b44f2319a808c465475c0f
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Mon Jun 7 22:55:21 2021 +0800

    net: micrel: check return value after calling platform_get_resource()
    
    [ Upstream commit 20f1932e2282c58cb5ac59517585206cf5b385ae ]
    
    It will cause null-ptr-deref if platform_get_resource() returns NULL,
    we need check the return value.
    
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/micrel/ks8842.c b/drivers/net/ethernet/micrel/ks8842.c
index e3d7c74d47bb..5282c5754ac1 100644
--- a/drivers/net/ethernet/micrel/ks8842.c
+++ b/drivers/net/ethernet/micrel/ks8842.c
@@ -1150,6 +1150,10 @@ static int ks8842_probe(struct platform_device *pdev)
 	unsigned i;
 
 	iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!iomem) {
+		dev_err(&pdev->dev, "Invalid resource\n");
+		return -EINVAL;
+	}
 	if (!request_mem_region(iomem->start, resource_size(iomem), DRV_NAME))
 		goto err_mem_region;
 

commit 662bfdea9200dddad5ab0d2042265cfe42a3baa1
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Mon Jun 7 22:36:02 2021 +0800

    net: mvpp2: check return value after calling platform_get_resource()
    
    [ Upstream commit 0bb51a3a385790a4be20085494cf78f70dadf646 ]
    
    It will cause null-ptr-deref if platform_get_resource() returns NULL,
    we need check the return value.
    
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
index e65750b3c44f..52fdb200a0c7 100644
--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
@@ -5157,6 +5157,10 @@ static int mvpp2_probe(struct platform_device *pdev)
 			return PTR_ERR(priv->lms_base);
 	} else {
 		res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+		if (!res) {
+			dev_err(&pdev->dev, "Invalid resource\n");
+			return -EINVAL;
+		}
 		if (has_acpi_companion(&pdev->dev)) {
 			/* In case the MDIO memory region is declared in
 			 * the ACPI, it can already appear as 'in-use'

commit 09846c2990d91736566395e6b01674b2258cd702
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Mon Jun 7 21:38:37 2021 +0800

    net: bcmgenet: check return value after calling platform_get_resource()
    
    [ Upstream commit 74325bf0104573c6dfce42837139aeef3f34be76 ]
    
    It will cause null-ptr-deref if platform_get_resource() returns NULL,
    we need check the return value.
    
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Acked-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c
index a5049d637791..494601c39b84 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
@@ -428,6 +428,10 @@ static int bcmgenet_mii_register(struct bcmgenet_priv *priv)
 	int id, ret;
 
 	pres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!pres) {
+		dev_err(&pdev->dev, "Invalid resource\n");
+		return -EINVAL;
+	}
 	memset(&res, 0, sizeof(res));
 	memset(&ppd, 0, sizeof(ppd));
 

commit 34218ccb387c1e5e94b2baa6e337fb0367edede0
Author: Xianting Tian <xianting.tian@linux.alibaba.com>
Date:   Sat Jun 5 11:31:00 2021 -0400

    virtio_net: Remove BUG() to avoid machine dead
    
    [ Upstream commit 85eb1389458d134bdb75dad502cc026c3753a619 ]
    
    We should not directly BUG() when there is hdr error, it is
    better to output a print when such error happens. Currently,
    the caller of xmit_skb() already did it.
    
    Signed-off-by: Xianting Tian <xianting.tian@linux.alibaba.com>
    Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 0b1c6a8906b9..84a82c4a9535 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -1550,7 +1550,7 @@ static int xmit_skb(struct send_queue *sq, struct sk_buff *skb)
 	if (virtio_net_hdr_from_skb(skb, &hdr->hdr,
 				    virtio_is_little_endian(vi->vdev), false,
 				    0))
-		BUG();
+		return -EPROTO;
 
 	if (vi->mergeable_rx_bufs)
 		hdr->num_buffers = 0;

commit c9a064cf60d759df96f009ab97a0cfea31e31d70
Author: Liwei Song <liwei.song@windriver.com>
Date:   Mon Apr 19 17:31:06 2021 +0800

    ice: set the value of global config lock timeout longer
    
    [ Upstream commit fb3612840d4f587a0af9511a11d7989d1fa48206 ]
    
    It may need hold Global Config Lock a longer time when download DDP
    package file, extend the timeout value to 5000ms to ensure that
    download can be finished before other AQ command got time to run,
    this will fix the issue below when probe the device, 5000ms is a test
    value that work with both Backplane and BreakoutCable NVM image:
    
    ice 0000:f4:00.0: VSI 12 failed lan queue config, error ICE_ERR_CFG
    ice 0000:f4:00.0: Failed to delete VSI 12 in FW - error: ICE_ERR_AQ_TIMEOUT
    ice 0000:f4:00.0: probe failed due to setup PF switch: -12
    ice: probe of 0000:f4:00.0 failed with error -12
    
    Signed-off-by: Liwei Song <liwei.song@windriver.com>
    Tested-by: Tony Brelinski <tonyx.brelinski@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/ice/ice_type.h b/drivers/net/ethernet/intel/ice/ice_type.h
index 5ca9d684429d..8105f11f0199 100644
--- a/drivers/net/ethernet/intel/ice/ice_type.h
+++ b/drivers/net/ethernet/intel/ice/ice_type.h
@@ -41,7 +41,7 @@ enum ice_aq_res_ids {
 /* FW update timeout definitions are in milliseconds */
 #define ICE_NVM_TIMEOUT			180000
 #define ICE_CHANGE_LOCK_TIMEOUT		1000
-#define ICE_GLOBAL_CFG_LOCK_TIMEOUT	3000
+#define ICE_GLOBAL_CFG_LOCK_TIMEOUT	5000
 
 enum ice_aq_res_access_type {
 	ICE_RES_READ = 1,

commit 2f738b0028b5cc3c42ca63da0547b6ec612bc0c5
Author: Radim Pavlik <radim.pavlik@tbs-biometrics.com>
Date:   Tue Jun 1 10:48:18 2021 +0000

    pinctrl: mcp23s08: fix race condition in irq handler
    
    [ Upstream commit 897120d41e7afd9da435cb00041a142aeeb53c07 ]
    
    Checking value of MCP_INTF in mcp23s08_irq suggests that the handler may be
    called even when there is no interrupt pending.
    
    But the actual interrupt could happened between reading MCP_INTF and MCP_GPIO.
    In this situation we got nothing from MCP_INTF, but the event gets acknowledged
    on the expander by reading MCP_GPIO. This leads to losing events.
    
    Fix the problem by not reading any register until we see something in MCP_INTF.
    
    The error was reproduced and fix tested on MCP23017.
    
    Signed-off-by: Radim Pavlik <radim.pavlik@tbs-biometrics.com>
    Link: https://lore.kernel.org/r/AM7PR06MB6769E1183F68DEBB252F665ABA3E9@AM7PR06MB6769.eurprd06.prod.outlook.com
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pinctrl/pinctrl-mcp23s08.c b/drivers/pinctrl/pinctrl-mcp23s08.c
index 5b5a4323ae63..f22999129269 100644
--- a/drivers/pinctrl/pinctrl-mcp23s08.c
+++ b/drivers/pinctrl/pinctrl-mcp23s08.c
@@ -458,6 +458,11 @@ static irqreturn_t mcp23s08_irq(int irq, void *data)
 	if (mcp_read(mcp, MCP_INTF, &intf))
 		goto unlock;
 
+	if (intf == 0) {
+		/* There is no interrupt pending */
+		return IRQ_HANDLED;
+	}
+
 	if (mcp_read(mcp, MCP_INTCAP, &intcap))
 		goto unlock;
 
@@ -475,11 +480,6 @@ static irqreturn_t mcp23s08_irq(int irq, void *data)
 	mcp->cached_gpio = gpio;
 	mutex_unlock(&mcp->lock);
 
-	if (intf == 0) {
-		/* There is no interrupt pending */
-		return IRQ_HANDLED;
-	}
-
 	dev_dbg(mcp->chip.parent,
 		"intcap 0x%04X intf 0x%04X gpio_orig 0x%04X gpio 0x%04X\n",
 		intcap, intf, gpio_orig, gpio);

commit e20d40538987b78cdaadcfa2a88344bf97608eb1
Author: Joe Thornber <ejt@redhat.com>
Date:   Tue Apr 13 09:03:49 2021 +0100

    dm space maps: don't reset space map allocation cursor when committing
    
    [ Upstream commit 5faafc77f7de69147d1e818026b9a0cbf036a7b2 ]
    
    Current commit code resets the place where the search for free blocks
    will begin back to the start of the metadata device.  There are a couple
    of repercussions to this:
    
    - The first allocation after the commit is likely to take longer than
      normal as it searches for a free block in an area that is likely to
      have very few free blocks (if any).
    
    - Any free blocks it finds will have been recently freed.  Reusing them
      means we have fewer old copies of the metadata to aid recovery from
      hardware error.
    
    Fix these issues by leaving the cursor alone, only resetting when the
    search hits the end of the metadata device.
    
    Signed-off-by: Joe Thornber <ejt@redhat.com>
    Signed-off-by: Mike Snitzer <snitzer@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/md/persistent-data/dm-space-map-disk.c b/drivers/md/persistent-data/dm-space-map-disk.c
index bf4c5e2ccb6f..e0acae7a3815 100644
--- a/drivers/md/persistent-data/dm-space-map-disk.c
+++ b/drivers/md/persistent-data/dm-space-map-disk.c
@@ -171,6 +171,14 @@ static int sm_disk_new_block(struct dm_space_map *sm, dm_block_t *b)
 	 * Any block we allocate has to be free in both the old and current ll.
 	 */
 	r = sm_ll_find_common_free_block(&smd->old_ll, &smd->ll, smd->begin, smd->ll.nr_blocks, b);
+	if (r == -ENOSPC) {
+		/*
+		 * There's no free block between smd->begin and the end of the metadata device.
+		 * We search before smd->begin in case something has been freed.
+		 */
+		r = sm_ll_find_common_free_block(&smd->old_ll, &smd->ll, 0, smd->begin, b);
+	}
+
 	if (r)
 		return r;
 
@@ -199,7 +207,6 @@ static int sm_disk_commit(struct dm_space_map *sm)
 		return r;
 
 	memcpy(&smd->old_ll, &smd->ll, sizeof(smd->old_ll));
-	smd->begin = 0;
 	smd->nr_allocated_this_transaction = 0;
 
 	r = sm_disk_get_nr_free(sm, &nr_free);
diff --git a/drivers/md/persistent-data/dm-space-map-metadata.c b/drivers/md/persistent-data/dm-space-map-metadata.c
index 9e3c64ec2026..da439ac85796 100644
--- a/drivers/md/persistent-data/dm-space-map-metadata.c
+++ b/drivers/md/persistent-data/dm-space-map-metadata.c
@@ -452,6 +452,14 @@ static int sm_metadata_new_block_(struct dm_space_map *sm, dm_block_t *b)
 	 * Any block we allocate has to be free in both the old and current ll.
 	 */
 	r = sm_ll_find_common_free_block(&smm->old_ll, &smm->ll, smm->begin, smm->ll.nr_blocks, b);
+	if (r == -ENOSPC) {
+		/*
+		 * There's no free block between smm->begin and the end of the metadata device.
+		 * We search before smm->begin in case something has been freed.
+		 */
+		r = sm_ll_find_common_free_block(&smm->old_ll, &smm->ll, 0, smm->begin, b);
+	}
+
 	if (r)
 		return r;
 
@@ -503,7 +511,6 @@ static int sm_metadata_commit(struct dm_space_map *sm)
 		return r;
 
 	memcpy(&smm->old_ll, &smm->ll, sizeof(smm->old_ll));
-	smm->begin = 0;
 	smm->allocated_this_transaction = 0;
 
 	return 0;

commit 54e433742cae8668b43d361f1bd48ec234b4e3a6
Author: Jiapeng Chong <jiapeng.chong@linux.alibaba.com>
Date:   Tue Jun 1 19:07:49 2021 +0800

    RDMA/cxgb4: Fix missing error code in create_qp()
    
    [ Upstream commit aeb27bb76ad8197eb47890b1ff470d5faf8ec9a5 ]
    
    The error code is missing in this code scenario so 0 will be returned. Add
    the error code '-EINVAL' to the return value 'ret'.
    
    Eliminates the follow smatch warning:
    
    drivers/infiniband/hw/cxgb4/qp.c:298 create_qp() warn: missing error code 'ret'.
    
    Link: https://lore.kernel.org/r/1622545669-20625-1-git-send-email-jiapeng.chong@linux.alibaba.com
    Reported-by: Abaci Robot <abaci@linux.alibaba.com>
    Signed-off-by: Jiapeng Chong <jiapeng.chong@linux.alibaba.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/infiniband/hw/cxgb4/qp.c b/drivers/infiniband/hw/cxgb4/qp.c
index caa6a502c37e..20e3128f59b1 100644
--- a/drivers/infiniband/hw/cxgb4/qp.c
+++ b/drivers/infiniband/hw/cxgb4/qp.c
@@ -295,6 +295,7 @@ static int create_qp(struct c4iw_rdev *rdev, struct t4_wq *wq,
 	if (user && (!wq->sq.bar2_pa || (need_rq && !wq->rq.bar2_pa))) {
 		pr_warn("%s: sqid %u or rqid %u not in BAR2 range\n",
 			pci_name(rdev->lldi.pdev), wq->sq.qid, wq->rq.qid);
+		ret = -EINVAL;
 		goto free_dma;
 	}
 

commit f0be58ec9931907e980cf21737e51d369808eb95
Author: Willy Tarreau <w@1wt.eu>
Date:   Sat May 29 13:07:46 2021 +0200

    ipv6: use prandom_u32() for ID generation
    
    [ Upstream commit 62f20e068ccc50d6ab66fdb72ba90da2b9418c99 ]
    
    This is a complement to commit aa6dd211e4b1 ("inet: use bigger hash
    table for IP ID generation"), but focusing on some specific aspects
    of IPv6.
    
    Contary to IPv4, IPv6 only uses packet IDs with fragments, and with a
    minimum MTU of 1280, it's much less easy to force a remote peer to
    produce many fragments to explore its ID sequence. In addition packet
    IDs are 32-bit in IPv6, which further complicates their analysis. On
    the other hand, it is often easier to choose among plenty of possible
    source addresses and partially work around the bigger hash table the
    commit above permits, which leaves IPv6 partially exposed to some
    possibilities of remote analysis at the risk of weakening some
    protocols like DNS if some IDs can be predicted with a good enough
    probability.
    
    Given the wide range of permitted IDs, the risk of collision is extremely
    low so there's no need to rely on the positive increment algorithm that
    is shared with the IPv4 code via ip_idents_reserve(). We have a fast
    PRNG, so let's simply call prandom_u32() and be done with it.
    
    Performance measurements at 10 Gbps couldn't show any difference with
    the previous code, even when using a single core, because due to the
    large fragments, we're limited to only ~930 kpps at 10 Gbps and the cost
    of the random generation is completely offset by other operations and by
    the network transfer time. In addition, this change removes the need to
    update a shared entry in the idents table so it may even end up being
    slightly faster on large scale systems where this matters.
    
    The risk of at least one collision here is about 1/80 million among
    10 IDs, 1/850k among 100 IDs, and still only 1/8.5k among 1000 IDs,
    which remains very low compared to IPv4 where all IDs are reused
    every 4 to 80ms on a 10 Gbps flow depending on packet sizes.
    
    Reported-by: Amit Klein <aksecurity@gmail.com>
    Signed-off-by: Willy Tarreau <w@1wt.eu>
    Reviewed-by: Eric Dumazet <edumazet@google.com>
    Link: https://lore.kernel.org/r/20210529110746.6796-1-w@1wt.eu
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv6/output_core.c b/net/ipv6/output_core.c
index 868ae23dbae1..3829b565c645 100644
--- a/net/ipv6/output_core.c
+++ b/net/ipv6/output_core.c
@@ -14,29 +14,11 @@ static u32 __ipv6_select_ident(struct net *net,
 			       const struct in6_addr *dst,
 			       const struct in6_addr *src)
 {
-	const struct {
-		struct in6_addr dst;
-		struct in6_addr src;
-	} __aligned(SIPHASH_ALIGNMENT) combined = {
-		.dst = *dst,
-		.src = *src,
-	};
-	u32 hash, id;
-
-	/* Note the following code is not safe, but this is okay. */
-	if (unlikely(siphash_key_is_zero(&net->ipv4.ip_id_key)))
-		get_random_bytes(&net->ipv4.ip_id_key,
-				 sizeof(net->ipv4.ip_id_key));
-
-	hash = siphash(&combined, sizeof(combined), &net->ipv4.ip_id_key);
-
-	/* Treat id of 0 as unset and if we get 0 back from ip_idents_reserve,
-	 * set the hight order instead thus minimizing possible future
-	 * collisions.
-	 */
-	id = ip_idents_reserve(hash, 1);
-	if (unlikely(!id))
-		id = 1 << 31;
+	u32 id;
+
+	do {
+		id = prandom_u32();
+	} while (!id);
 
 	return id;
 }

commit d80baef871d1678acef4779444c5aec1fc035e44
Author: Dmitry Osipenko <digetx@gmail.com>
Date:   Sun May 16 19:30:35 2021 +0300

    clk: tegra: Ensure that PLLU configuration is applied properly
    
    [ Upstream commit a7196048cd5168096c2c4f44a3939d7a6dcd06b9 ]
    
    The PLLU (USB) consists of the PLL configuration itself and configuration
    of the PLLU outputs. The PLLU programming is inconsistent on T30 vs T114,
    where T114 immediately bails out if PLLU is enabled and T30 re-enables
    a potentially already enabled PLL (left after bootloader) and then fully
    reprograms it, which could be unsafe to do. The correct way should be to
    skip enabling of the PLL if it's already enabled and then apply
    configuration to the outputs. This patch doesn't fix any known problems,
    it's a minor improvement.
    
    Acked-by: Thierry Reding <treding@nvidia.com>
    Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
    Signed-off-by: Thierry Reding <treding@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/clk/tegra/clk-pll.c b/drivers/clk/tegra/clk-pll.c
index dc87866233b9..ed3b725ff102 100644
--- a/drivers/clk/tegra/clk-pll.c
+++ b/drivers/clk/tegra/clk-pll.c
@@ -1091,7 +1091,8 @@ static int clk_pllu_enable(struct clk_hw *hw)
 	if (pll->lock)
 		spin_lock_irqsave(pll->lock, flags);
 
-	_clk_pll_enable(hw);
+	if (!clk_pll_is_enabled(hw))
+		_clk_pll_enable(hw);
 
 	ret = clk_pll_wait_for_lock(pll);
 	if (ret < 0)
@@ -1708,7 +1709,8 @@ static int clk_pllu_tegra114_enable(struct clk_hw *hw)
 	if (pll->lock)
 		spin_lock_irqsave(pll->lock, flags);
 
-	_clk_pll_enable(hw);
+	if (!clk_pll_is_enabled(hw))
+		_clk_pll_enable(hw);
 
 	ret = clk_pll_wait_for_lock(pll);
 	if (ret < 0)

commit a5ef472a70978ad51c29871515d6185de397acae
Author: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Date:   Thu May 27 13:36:38 2021 +0900

    clk: renesas: r8a77995: Add ZA2 clock
    
    [ Upstream commit 790c06cc5df263cdaff748670cc65958c81b0951 ]
    
    R-Car D3 ZA2 clock is from PLL0D3 or S0,
    and it can be controlled by ZA2CKCR.
    It is needed for R-Car Sound, but is not used so far.
    Using default settings is very enough at this point.
    This patch adds it by DEF_FIXED().
    
    Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
    Link: https://lore.kernel.org/r/87pmxclrmy.wl-kuninori.morimoto.gx@renesas.com
    Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/clk/renesas/r8a77995-cpg-mssr.c b/drivers/clk/renesas/r8a77995-cpg-mssr.c
index 9e16931e6f28..e0011db4f201 100644
--- a/drivers/clk/renesas/r8a77995-cpg-mssr.c
+++ b/drivers/clk/renesas/r8a77995-cpg-mssr.c
@@ -73,6 +73,7 @@ static const struct cpg_core_clk r8a77995_core_clks[] __initconst = {
 	DEF_FIXED(".sdsrc",    CLK_SDSRC,          CLK_PLL1,       2, 1),
 
 	/* Core Clock Outputs */
+	DEF_FIXED("za2",       R8A77995_CLK_ZA2,   CLK_PLL0D3,     2, 1),
 	DEF_FIXED("z2",        R8A77995_CLK_Z2,    CLK_PLL0D3,     1, 1),
 	DEF_FIXED("ztr",       R8A77995_CLK_ZTR,   CLK_PLL1,       6, 1),
 	DEF_FIXED("zt",        R8A77995_CLK_ZT,    CLK_PLL1,       4, 1),

commit 395c2fd5e5b496139130104667e81a558e5ada74
Author: Jesse Brandeburg <jesse.brandeburg@intel.com>
Date:   Thu Mar 25 17:38:24 2021 -0700

    e100: handle eeprom as little endian
    
    [ Upstream commit d4ef55288aa2e1b76033717242728ac98ddc4721 ]
    
    Sparse tool was warning on some implicit conversions from
    little endian data read from the EEPROM on the e100 cards.
    
    Fix these by being explicit about the conversions using
    le16_to_cpu().
    
    Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/e100.c b/drivers/net/ethernet/intel/e100.c
index 78b44d787638..bf64fab38385 100644
--- a/drivers/net/ethernet/intel/e100.c
+++ b/drivers/net/ethernet/intel/e100.c
@@ -1398,7 +1398,7 @@ static int e100_phy_check_without_mii(struct nic *nic)
 	u8 phy_type;
 	int without_mii;
 
-	phy_type = (nic->eeprom[eeprom_phy_iface] >> 8) & 0x0f;
+	phy_type = (le16_to_cpu(nic->eeprom[eeprom_phy_iface]) >> 8) & 0x0f;
 
 	switch (phy_type) {
 	case NoSuchPhy: /* Non-MII PHY; UNTESTED! */
@@ -1518,7 +1518,7 @@ static int e100_phy_init(struct nic *nic)
 		mdio_write(netdev, nic->mii.phy_id, MII_BMCR, bmcr);
 	} else if ((nic->mac >= mac_82550_D102) || ((nic->flags & ich) &&
 	   (mdio_read(netdev, nic->mii.phy_id, MII_TPISTATUS) & 0x8000) &&
-		(nic->eeprom[eeprom_cnfg_mdix] & eeprom_mdix_enabled))) {
+	   (le16_to_cpu(nic->eeprom[eeprom_cnfg_mdix]) & eeprom_mdix_enabled))) {
 		/* enable/disable MDI/MDI-X auto-switching. */
 		mdio_write(netdev, nic->mii.phy_id, MII_NCONFIG,
 				nic->mii.force_media ? 0 : NCONFIG_AUTO_SWITCH);
@@ -2264,9 +2264,9 @@ static int e100_asf(struct nic *nic)
 {
 	/* ASF can be enabled from eeprom */
 	return (nic->pdev->device >= 0x1050) && (nic->pdev->device <= 0x1057) &&
-	   (nic->eeprom[eeprom_config_asf] & eeprom_asf) &&
-	   !(nic->eeprom[eeprom_config_asf] & eeprom_gcl) &&
-	   ((nic->eeprom[eeprom_smbus_addr] & 0xFF) != 0xFE);
+	   (le16_to_cpu(nic->eeprom[eeprom_config_asf]) & eeprom_asf) &&
+	   !(le16_to_cpu(nic->eeprom[eeprom_config_asf]) & eeprom_gcl) &&
+	   ((le16_to_cpu(nic->eeprom[eeprom_smbus_addr]) & 0xFF) != 0xFE);
 }
 
 static int e100_up(struct nic *nic)
@@ -2922,7 +2922,7 @@ static int e100_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
 	/* Wol magic packet can be enabled from eeprom */
 	if ((nic->mac >= mac_82558_D101_A4) &&
-	   (nic->eeprom[eeprom_id] & eeprom_id_wol)) {
+	   (le16_to_cpu(nic->eeprom[eeprom_id]) & eeprom_id_wol)) {
 		nic->flags |= wol_magic;
 		device_set_wakeup_enable(&pdev->dev, true);
 	}

commit 3638705ecd5ad2785e996f820121c0ad15ce64b5
Author: Arturo Giusti <koredump@protonmail.com>
Date:   Tue May 18 12:34:57 2021 +0200

    udf: Fix NULL pointer dereference in udf_symlink function
    
    [ Upstream commit fa236c2b2d4436d9f19ee4e5d5924e90ffd7bb43 ]
    
    In function udf_symlink, epos.bh is assigned with the value returned
    by udf_tgetblk. The function udf_tgetblk is defined in udf/misc.c
    and returns the value of sb_getblk function that could be NULL.
    Then, epos.bh is used without any check, causing a possible
    NULL pointer dereference when sb_getblk fails.
    
    This fix adds a check to validate the value of epos.bh.
    
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=213083
    Signed-off-by: Arturo Giusti <koredump@protonmail.com>
    Signed-off-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/udf/namei.c b/fs/udf/namei.c
index 58cc2414992b..9cfb555db1ad 100644
--- a/fs/udf/namei.c
+++ b/fs/udf/namei.c
@@ -948,6 +948,10 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry,
 				iinfo->i_location.partitionReferenceNum,
 				0);
 		epos.bh = udf_tgetblk(sb, block);
+		if (unlikely(!epos.bh)) {
+			err = -ENOMEM;
+			goto out_no_entry;
+		}
 		lock_buffer(epos.bh);
 		memset(epos.bh->b_data, 0x00, bsize);
 		set_buffer_uptodate(epos.bh);

commit 2fda4ff855d8be14338cc383fad3f2fa2f7d30aa
Author: Xie Yongji <xieyongji@bytedance.com>
Date:   Mon May 17 16:49:12 2021 +0800

    drm/virtio: Fix double free on probe failure
    
    [ Upstream commit cec7f1774605a5ef47c134af62afe7c75c30b0ee ]
    
    The virtio_gpu_init() will free vgdev and vgdev->vbufs on failure.
    But such failure will be caught by virtio_gpu_probe() and then
    virtio_gpu_release() will be called to do some cleanup which
    will free vgdev and vgdev->vbufs again. So let's set dev->dev_private
    to NULL to avoid double free.
    
    Signed-off-by: Xie Yongji <xieyongji@bytedance.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/20210517084913.403-2-xieyongji@bytedance.com
    Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c
index 22397a23780c..d7555991d1af 100644
--- a/drivers/gpu/drm/virtio/virtgpu_kms.c
+++ b/drivers/gpu/drm/virtio/virtgpu_kms.c
@@ -237,6 +237,7 @@ int virtio_gpu_driver_load(struct drm_device *dev, unsigned long flags)
 err_vbufs:
 	vgdev->vdev->config->del_vqs(vgdev->vdev);
 err_vqs:
+	dev->dev_private = NULL;
 	kfree(vgdev);
 	return ret;
 }

commit 47b4b8f0d3780959a15e0118da83c42c688d14e6
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Mon May 17 15:15:45 2021 +0300

    reiserfs: add check for invalid 1st journal block
    
    [ Upstream commit a149127be52fa7eaf5b3681a0317a2bbb772d5a9 ]
    
    syzbot reported divide error in reiserfs.
    The problem was in incorrect journal 1st block.
    
    Syzbot's reproducer manualy generated wrong superblock
    with incorrect 1st block. In journal_init() wasn't
    any checks about this particular case.
    
    For example, if 1st journal block is before superblock
    1st block, it can cause zeroing important superblock members
    in do_journal_end().
    
    Link: https://lore.kernel.org/r/20210517121545.29645-1-paskripkin@gmail.com
    Reported-by: syzbot+0ba9909df31c6a36974d@syzkaller.appspotmail.com
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c
index 8a76f9d14bc6..78be6dbcd762 100644
--- a/fs/reiserfs/journal.c
+++ b/fs/reiserfs/journal.c
@@ -2772,6 +2772,20 @@ int journal_init(struct super_block *sb, const char *j_dev_name,
 		goto free_and_return;
 	}
 
+	/*
+	 * Sanity check to see if journal first block is correct.
+	 * If journal first block is invalid it can cause
+	 * zeroing important superblock members.
+	 */
+	if (!SB_ONDISK_JOURNAL_DEVICE(sb) &&
+	    SB_ONDISK_JOURNAL_1st_BLOCK(sb) < SB_JOURNAL_1st_RESERVED_BLOCK(sb)) {
+		reiserfs_warning(sb, "journal-1393",
+				 "journal 1st super block is invalid: 1st reserved block %d, but actual 1st block is %d",
+				 SB_JOURNAL_1st_RESERVED_BLOCK(sb),
+				 SB_ONDISK_JOURNAL_1st_BLOCK(sb));
+		goto free_and_return;
+	}
+
 	if (journal_init_dev(sb, journal, j_dev_name) != 0) {
 		reiserfs_warning(sb, "sh-462",
 				 "unable to initialize journal device");

commit e626b6f873f2cce6d4c5ed555df64f0c9fc3a3db
Author: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Date:   Wed May 12 23:43:24 2021 +0200

    net: Treat __napi_schedule_irqoff() as __napi_schedule() on PREEMPT_RT
    
    [ Upstream commit 8380c81d5c4fced6f4397795a5ae65758272bbfd ]
    
    __napi_schedule_irqoff() is an optimized version of __napi_schedule()
    which can be used where it is known that interrupts are disabled,
    e.g. in interrupt-handlers, spin_lock_irq() sections or hrtimer
    callbacks.
    
    On PREEMPT_RT enabled kernels this assumptions is not true. Force-
    threaded interrupt handlers and spinlocks are not disabling interrupts
    and the NAPI hrtimer callback is forced into softirq context which runs
    with interrupts enabled as well.
    
    Chasing all usage sites of __napi_schedule_irqoff() is a whack-a-mole
    game so make __napi_schedule_irqoff() invoke __napi_schedule() for
    PREEMPT_RT kernels.
    
    The callers of ____napi_schedule() in the networking core have been
    audited and are correct on PREEMPT_RT kernels as well.
    
    Reported-by: Juri Lelli <juri.lelli@redhat.com>
    Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Juri Lelli <juri.lelli@redhat.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/core/dev.c b/net/core/dev.c
index 7803bd9628dc..722ae0b57f3f 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -5931,11 +5931,18 @@ EXPORT_SYMBOL(napi_schedule_prep);
  * __napi_schedule_irqoff - schedule for receive
  * @n: entry to schedule
  *
- * Variant of __napi_schedule() assuming hard irqs are masked
+ * Variant of __napi_schedule() assuming hard irqs are masked.
+ *
+ * On PREEMPT_RT enabled kernels this maps to __napi_schedule()
+ * because the interrupt disabled assumption might not be true
+ * due to force-threaded interrupts and spinlock substitution.
  */
 void __napi_schedule_irqoff(struct napi_struct *n)
 {
-	____napi_schedule(this_cpu_ptr(&softnet_data), n);
+	if (!IS_ENABLED(CONFIG_PREEMPT_RT))
+		____napi_schedule(this_cpu_ptr(&softnet_data), n);
+	else
+		__napi_schedule(n);
 }
 EXPORT_SYMBOL(__napi_schedule_irqoff);
 

commit a7a7b2848312cc4c3a42b6e42a8ab2e441857aba
Author: Zou Wei <zou_wei@huawei.com>
Date:   Wed May 12 15:00:24 2021 +0800

    atm: nicstar: Fix possible use-after-free in nicstar_cleanup()
    
    [ Upstream commit 34e7434ba4e97f4b85c1423a59b2922ba7dff2ea ]
    
    This module's remove path calls del_timer(). However, that function
    does not wait until the timer handler finishes. This means that the
    timer handler may still be running after the driver's remove function
    has finished, which would result in a use-after-free.
    
    Fix by calling del_timer_sync(), which makes sure the timer handler
    has finished, and unable to re-schedule itself.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zou Wei <zou_wei@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/atm/nicstar.c b/drivers/atm/nicstar.c
index 0d3754a4ac20..5281db3d6783 100644
--- a/drivers/atm/nicstar.c
+++ b/drivers/atm/nicstar.c
@@ -296,7 +296,7 @@ static void __exit nicstar_cleanup(void)
 {
 	XPRINTK("nicstar: nicstar_cleanup() called.\n");
 
-	del_timer(&ns_timer);
+	del_timer_sync(&ns_timer);
 
 	pci_unregister_driver(&nicstar_driver);
 

commit 5f2818185da0fe82a932f0856633038b66faf124
Author: Zou Wei <zou_wei@huawei.com>
Date:   Tue May 11 14:58:53 2021 +0800

    mISDN: fix possible use-after-free in HFC_cleanup()
    
    [ Upstream commit 009fc857c5f6fda81f2f7dd851b2d54193a8e733 ]
    
    This module's remove path calls del_timer(). However, that function
    does not wait until the timer handler finishes. This means that the
    timer handler may still be running after the driver's remove function
    has finished, which would result in a use-after-free.
    
    Fix by calling del_timer_sync(), which makes sure the timer handler
    has finished, and unable to re-schedule itself.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zou Wei <zou_wei@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/isdn/hardware/mISDN/hfcpci.c b/drivers/isdn/hardware/mISDN/hfcpci.c
index ebb3fa2e1d00..53349850f866 100644
--- a/drivers/isdn/hardware/mISDN/hfcpci.c
+++ b/drivers/isdn/hardware/mISDN/hfcpci.c
@@ -2348,7 +2348,7 @@ static void __exit
 HFC_cleanup(void)
 {
 	if (timer_pending(&hfc_tl))
-		del_timer(&hfc_tl);
+		del_timer_sync(&hfc_tl);
 
 	pci_unregister_driver(&hfc_driver);
 }

commit 89ce0b0747f319eb70f85bc820dcc43cebbd5417
Author: Zou Wei <zou_wei@huawei.com>
Date:   Tue May 11 14:53:36 2021 +0800

    atm: iphase: fix possible use-after-free in ia_module_exit()
    
    [ Upstream commit 1c72e6ab66b9598cac741ed397438a52065a8f1f ]
    
    This module's remove path calls del_timer(). However, that function
    does not wait until the timer handler finishes. This means that the
    timer handler may still be running after the driver's remove function
    has finished, which would result in a use-after-free.
    
    Fix by calling del_timer_sync(), which makes sure the timer handler
    has finished, and unable to re-schedule itself.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zou Wei <zou_wei@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/atm/iphase.c b/drivers/atm/iphase.c
index 008905d4152a..827c6d5e6177 100644
--- a/drivers/atm/iphase.c
+++ b/drivers/atm/iphase.c
@@ -3301,7 +3301,7 @@ static void __exit ia_module_exit(void)
 {
 	pci_unregister_driver(&ia_driver);
 
-        del_timer(&ia_timer);
+	del_timer_sync(&ia_timer);
 }
 
 module_init(ia_module_init);

commit 909bfdecf39843d1e42a9480a9c3ed49f7579707
Author: Bibo Mao <maobibo@loongson.cn>
Date:   Mon Jun 29 21:15:32 2020 +0800

    hugetlb: clear huge pte during flush function on mips platform
    
    [ Upstream commit 33ae8f801ad8bec48e886d368739feb2816478f2 ]
    
    If multiple threads are accessing the same huge page at the same
    time, hugetlb_cow will be called if one thread write the COW huge
    page. And function huge_ptep_clear_flush is called to notify other
    threads to clear the huge pte tlb entry. The other threads clear
    the huge pte tlb entry and reload it from page table, the reload
    huge pte entry may be old.
    
    This patch fixes this issue on mips platform, and it clears huge
    pte entry before notifying other threads to flush current huge
    page entry, it is similar with other architectures.
    
    Signed-off-by: Bibo Mao <maobibo@loongson.cn>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/include/asm/hugetlb.h b/arch/mips/include/asm/hugetlb.h
index 982bc0685330..4747a4694669 100644
--- a/arch/mips/include/asm/hugetlb.h
+++ b/arch/mips/include/asm/hugetlb.h
@@ -67,7 +67,13 @@ static inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm,
 static inline void huge_ptep_clear_flush(struct vm_area_struct *vma,
 					 unsigned long addr, pte_t *ptep)
 {
-	flush_tlb_page(vma, addr & huge_page_mask(hstate_vma(vma)));
+	/*
+	 * clear the huge pte entry firstly, so that the other smp threads will
+	 * not get old pte entry after finishing flush_tlb_page and before
+	 * setting new huge pte entry
+	 */
+	huge_ptep_get_and_clear(vma->vm_mm, addr, ptep);
+	flush_tlb_page(vma, addr);
 }
 
 static inline int huge_pte_none(pte_t pte)

commit 15f4e53d2e6ace8eb0a64dea56907164cdb245e4
Author: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Date:   Mon Apr 19 17:50:53 2021 -0400

    drm/amd/display: fix use_max_lb flag for 420 pixel formats
    
    [ Upstream commit 8809a7a4afe90ad9ffb42f72154d27e7c47551ae ]
    
    Right now the flag simply selects memory config 0 when flag is true
    however 420 modes benefit more from memory config 3.
    
    Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
    Reviewed-by: Aric Cyr <Aric.Cyr@amd.com>
    Acked-by: Stylon Wang <stylon.wang@amd.com>
    Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c
index 321af9af95e8..8f5246308d26 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c
@@ -476,10 +476,13 @@ static enum lb_memory_config dpp1_dscl_find_lb_memory_config(struct dcn10_dpp *d
 	int vtaps_c = scl_data->taps.v_taps_c;
 	int ceil_vratio = dc_fixpt_ceil(scl_data->ratios.vert);
 	int ceil_vratio_c = dc_fixpt_ceil(scl_data->ratios.vert_c);
-	enum lb_memory_config mem_cfg = LB_MEMORY_CONFIG_0;
 
-	if (dpp->base.ctx->dc->debug.use_max_lb)
-		return mem_cfg;
+	if (dpp->base.ctx->dc->debug.use_max_lb) {
+		if (scl_data->format == PIXEL_FORMAT_420BPP8
+				|| scl_data->format == PIXEL_FORMAT_420BPP10)
+			return LB_MEMORY_CONFIG_3;
+		return LB_MEMORY_CONFIG_0;
+	}
 
 	dpp->base.caps->dscl_calc_lb_num_partitions(
 			scl_data, LB_MEMORY_CONFIG_1, &num_part_y, &num_part_c);

commit 06805760433f4787d7975d8817f657265c9fe567
Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date:   Mon May 10 19:39:30 2021 +0300

    net: pch_gbe: Use proper accessors to BE data in pch_ptp_match()
    
    [ Upstream commit 443ef39b499cc9c6635f83238101f1bb923e9326 ]
    
    Sparse is not happy about handling of strict types in pch_ptp_match():
    
      .../pch_gbe_main.c:158:33: warning: incorrect type in argument 2 (different base types)
      .../pch_gbe_main.c:158:33:    expected unsigned short [usertype] uid_hi
      .../pch_gbe_main.c:158:33:    got restricted __be16 [usertype]
      .../pch_gbe_main.c:158:45: warning: incorrect type in argument 3 (different base types)
      .../pch_gbe_main.c:158:45:    expected unsigned int [usertype] uid_lo
      .../pch_gbe_main.c:158:45:    got restricted __be32 [usertype]
      .../pch_gbe_main.c:158:56: warning: incorrect type in argument 4 (different base types)
      .../pch_gbe_main.c:158:56:    expected unsigned short [usertype] seqid
      .../pch_gbe_main.c:158:56:    got restricted __be16 [usertype]
    
    Fix that by switching to use proper accessors to BE data.
    
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Tested-by: Flavio Suligoi <f.suligoi@asem.it>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
index 70f3276539c4..5a45648e3124 100644
--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
+++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
@@ -118,7 +118,7 @@ static int pch_ptp_match(struct sk_buff *skb, u16 uid_hi, u32 uid_lo, u16 seqid)
 {
 	u8 *data = skb->data;
 	unsigned int offset;
-	u16 *hi, *id;
+	u16 hi, id;
 	u32 lo;
 
 	if (ptp_classify_raw(skb) == PTP_CLASS_NONE)
@@ -129,14 +129,11 @@ static int pch_ptp_match(struct sk_buff *skb, u16 uid_hi, u32 uid_lo, u16 seqid)
 	if (skb->len < offset + OFF_PTP_SEQUENCE_ID + sizeof(seqid))
 		return 0;
 
-	hi = (u16 *)(data + offset + OFF_PTP_SOURCE_UUID);
-	id = (u16 *)(data + offset + OFF_PTP_SEQUENCE_ID);
+	hi = get_unaligned_be16(data + offset + OFF_PTP_SOURCE_UUID + 0);
+	lo = get_unaligned_be32(data + offset + OFF_PTP_SOURCE_UUID + 2);
+	id = get_unaligned_be16(data + offset + OFF_PTP_SEQUENCE_ID);
 
-	memcpy(&lo, &hi[1], sizeof(lo));
-
-	return (uid_hi == *hi &&
-		uid_lo == lo &&
-		seqid  == *id);
+	return (uid_hi == hi && uid_lo == lo && seqid == id);
 }
 
 static void
@@ -146,7 +143,6 @@ pch_rx_timestamp(struct pch_gbe_adapter *adapter, struct sk_buff *skb)
 	struct pci_dev *pdev;
 	u64 ns;
 	u32 hi, lo, val;
-	u16 uid, seq;
 
 	if (!adapter->hwts_rx_en)
 		return;
@@ -162,10 +158,7 @@ pch_rx_timestamp(struct pch_gbe_adapter *adapter, struct sk_buff *skb)
 	lo = pch_src_uuid_lo_read(pdev);
 	hi = pch_src_uuid_hi_read(pdev);
 
-	uid = hi & 0xffff;
-	seq = (hi >> 16) & 0xffff;
-
-	if (!pch_ptp_match(skb, htons(uid), htonl(lo), htons(seq)))
+	if (!pch_ptp_match(skb, hi, lo, hi >> 16))
 		goto out;
 
 	ns = pch_rx_snap_read(pdev);

commit 38fe84738c50b248414de3c9163a217f7270cf20
Author: Jack Zhang <Jack.Zhang1@amd.com>
Date:   Tue Apr 27 17:08:47 2021 +0800

    drm/amd/amdgpu/sriov disable all ip hw status by default
    
    [ Upstream commit 95ea3dbc4e9548d35ab6fbf67675cef8c293e2f5 ]
    
    Disable all ip's hw status to false before any hw_init.
    Only set it to true until its hw_init is executed.
    
    The old 5.9 branch has this change but somehow the 5.11 kernrel does
    not have this fix.
    
    Without this change, sriov tdr have gfx IB test fail.
    
    Signed-off-by: Jack Zhang <Jack.Zhang1@amd.com>
    Review-by: Emily Deng <Emily.Deng@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 7f6af421d3e9..102b05b8f0c2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -2069,7 +2069,7 @@ static int amdgpu_device_ip_reinit_early_sriov(struct amdgpu_device *adev)
 		AMD_IP_BLOCK_TYPE_IH,
 	};
 
-	for (i = 0; i < ARRAY_SIZE(ip_order); i++) {
+	for (i = 0; i < adev->num_ip_blocks; i++) {
 		int j;
 		struct amdgpu_ip_block *block;
 

commit 6c7a586e6634f1118032a249ec03740ba9fe1fa6
Author: Thomas Zimmermann <tzimmermann@suse.de>
Date:   Thu Apr 15 13:00:39 2021 +0200

    drm/zte: Don't select DRM_KMS_FB_HELPER
    
    [ Upstream commit a50e74bec1d17e95275909660c6b43ffe11ebcf0 ]
    
    Selecting DRM_FBDEV_EMULATION will include the correct settings for
    fbdev emulation. Drivers should not override this.
    
    Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
    Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
    Link: https://patchwork.freedesktop.org/patch/msgid/20210415110040.23525-4-tzimmermann@suse.de
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/zte/Kconfig b/drivers/gpu/drm/zte/Kconfig
index 5b36421ef3e5..75b70126d2d3 100644
--- a/drivers/gpu/drm/zte/Kconfig
+++ b/drivers/gpu/drm/zte/Kconfig
@@ -2,7 +2,6 @@ config DRM_ZTE
 	tristate "DRM Support for ZTE SoCs"
 	depends on DRM && ARCH_ZX
 	select DRM_KMS_CMA_HELPER
-	select DRM_KMS_FB_HELPER
 	select DRM_KMS_HELPER
 	select SND_SOC_HDMI_CODEC if SND_SOC
 	select VIDEOMODE_HELPERS

commit 2c3a3c3714efc6dfad686b9549f033bf52576835
Author: Thomas Zimmermann <tzimmermann@suse.de>
Date:   Thu Apr 15 13:00:38 2021 +0200

    drm/mxsfb: Don't select DRM_KMS_FB_HELPER
    
    [ Upstream commit 13b29cc3a722c2c0bc9ab9f72f9047d55d08a2f9 ]
    
    Selecting DRM_FBDEV_EMULATION will include the correct settings for
    fbdev emulation. Drivers should not override this.
    
    Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
    Acked-by: Stefan Agner <stefan@agner.ch>
    Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
    Link: https://patchwork.freedesktop.org/patch/msgid/20210415110040.23525-3-tzimmermann@suse.de
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/mxsfb/Kconfig b/drivers/gpu/drm/mxsfb/Kconfig
index e9a8d90e6723..3ed6849d63cb 100644
--- a/drivers/gpu/drm/mxsfb/Kconfig
+++ b/drivers/gpu/drm/mxsfb/Kconfig
@@ -9,7 +9,6 @@ config DRM_MXSFB
 	depends on COMMON_CLK
 	select DRM_MXS
 	select DRM_KMS_HELPER
-	select DRM_KMS_FB_HELPER
 	select DRM_KMS_CMA_HELPER
 	select DRM_PANEL
 	help

commit eaa21859bd74124ec87e813dd81c9df81c8a20cd
Author: Johan Hovold <johan@kernel.org>
Date:   Fri May 21 15:30:26 2021 +0200

    mmc: vub3000: fix control-request direction
    
    commit 3c0bb3107703d2c58f7a0a7a2060bb57bc120326 upstream.
    
    The direction of the pipe argument must match the request-type direction
    bit or control requests may fail depending on the host-controller-driver
    implementation.
    
    Fix the SET_ROM_WAIT_STATES request which erroneously used
    usb_rcvctrlpipe().
    
    Fixes: 88095e7b473a ("mmc: Add new VUB300 USB-to-SD/SDIO/MMC driver")
    Cc: stable@vger.kernel.org      # 3.0
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20210521133026.17296-1-johan@kernel.org
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/mmc/host/vub300.c b/drivers/mmc/host/vub300.c
index 1fe68137a30f..a004f2ee15b1 100644
--- a/drivers/mmc/host/vub300.c
+++ b/drivers/mmc/host/vub300.c
@@ -2289,7 +2289,7 @@ static int vub300_probe(struct usb_interface *interface,
 	if (retval < 0)
 		goto error5;
 	retval =
-		usb_control_msg(vub300->udev, usb_rcvctrlpipe(vub300->udev, 0),
+		usb_control_msg(vub300->udev, usb_sndctrlpipe(vub300->udev, 0),
 				SET_ROM_WAIT_STATES,
 				USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 				firmware_rom_wait_states, 0x0000, NULL, 0, HZ);

commit c1f9f514b764f70e79debbfda61d198bdc8e7f09
Author: Bean Huo <beanhuo@micron.com>
Date:   Tue May 4 22:32:09 2021 +0200

    mmc: block: Disable CMDQ on the ioctl path
    
    commit 70b52f09080565030a530a784f1c9948a7f48ca3 upstream.
    
    According to the eMMC Spec:
    "When command queuing is enabled (CMDQ Mode En bit in CMDQ_MODE_EN
    field is set to ???? class 11 commands are the only method through
    which data transfer tasks can be issued. Existing data transfer
    commands, namely CMD18/CMD17 and CMD25/CMD24, are not supported when
    command queuing is enabled."
    which means if CMDQ is enabled, the FFU commands will not be supported.
    To fix this issue, just simply disable CMDQ on the ioctl path, and
    re-enable CMDQ once ioctl request is completed.
    
    Tested-by: Michael Brunner <Michael.Brunner@kontron.com>
    Signed-off-by: Bean Huo <beanhuo@micron.com>
    Acked-by: Adrian Hunter <adrian.hunter@intel.com>
    Fixes: 1e8e55b67030 (mmc: block: Add CQE support)
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210504203209.361597-1-huobean@gmail.com
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
index c2c45c148ae7..7b2bb32e3555 100644
--- a/drivers/mmc/core/block.c
+++ b/drivers/mmc/core/block.c
@@ -1054,6 +1054,12 @@ static void mmc_blk_issue_drv_op(struct mmc_queue *mq, struct request *req)
 
 	switch (mq_rq->drv_op) {
 	case MMC_DRV_OP_IOCTL:
+		if (card->ext_csd.cmdq_en) {
+			ret = mmc_cmdq_disable(card);
+			if (ret)
+				break;
+		}
+		/* fallthrough */
 	case MMC_DRV_OP_IOCTL_RPMB:
 		idata = mq_rq->drv_op_data;
 		for (i = 0, ret = 0; i < mq_rq->ioc_count; i++) {
@@ -1064,6 +1070,8 @@ static void mmc_blk_issue_drv_op(struct mmc_queue *mq, struct request *req)
 		/* Always switch back to main area after RPMB access */
 		if (rpmb_ioctl)
 			mmc_blk_part_switch(card, 0);
+		else if (card->reenable_cmdq && !card->ext_csd.cmdq_en)
+			mmc_cmdq_enable(card);
 		break;
 	case MMC_DRV_OP_BOOT_WP:
 		ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_WP,

commit e3bed778ac53a494415eb98263b969b941aacb96
Author: Arnaldo Carvalho de Melo <acme@redhat.com>
Date:   Thu Jul 1 14:20:58 2021 -0300

    perf llvm: Return -ENOMEM when asprintf() fails
    
    [ Upstream commit c435c166dcf526ac827bc964d82cc0d5e7a1fd0b ]
    
    Zhihao sent a patch but it made llvm__compile_bpf() return what
    asprintf() returns on error, which is just -1, but since this function
    returns -errno, fix it by returning -ENOMEM for this case instead.
    
    Fixes: cb76371441d098 ("perf llvm: Allow passing options to llc ...")
    Fixes: 5eab5a7ee032ac ("perf llvm: Display eBPF compiling command ...")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Reported-by: Zhihao Cheng <chengzhihao1@huawei.com>
    Cc: Alexei Starovoitov <ast@kernel.org>
    Cc: Andrii Nakryiko <andrii@kernel.org>
    Cc: Daniel Borkmann <daniel@iogearbox.net>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Nathan Chancellor <nathan@kernel.org>
    Cc: Nick Desaulniers <ndesaulniers@google.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Yu Kuai <yukuai3@huawei.com>
    Cc: clang-built-linux@googlegroups.com
    Link: http://lore.kernel.org/lkml/20210609115945.2193194-1-chengzhihao1@huawei.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/tools/perf/util/llvm-utils.c b/tools/perf/util/llvm-utils.c
index 2344d86cd778..46ec9a1bb94c 100644
--- a/tools/perf/util/llvm-utils.c
+++ b/tools/perf/util/llvm-utils.c
@@ -500,6 +500,7 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf,
 			goto errout;
 		}
 
+		err = -ENOMEM;
 		if (asprintf(&pipe_template, "%s -emit-llvm | %s -march=bpf %s -filetype=obj -o -",
 			      template, llc_path, opts) < 0) {
 			pr_err("ERROR:\tnot enough memory to setup command line\n");
@@ -520,6 +521,7 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf,
 
 	pr_debug("llvm compiling command template: %s\n", template);
 
+	err = -ENOMEM;
 	if (asprintf(&command_echo, "echo -n \"%s\"", template) < 0)
 		goto errout;
 

commit 8ceeafb911cc056bb8d4b804b04b54a214a0a684
Author: Dave Hansen <dave.hansen@linux.intel.com>
Date:   Wed Jun 30 18:56:53 2021 -0700

    selftests/vm/pkeys: fix alloc_random_pkey() to make it really, really random
    
    [ Upstream commit f36ef407628835a7d7fb3d235b1f1aac7022d9a3 ]
    
    Patch series "selftests/vm/pkeys: Bug fixes and a new test".
    
    There has been a lot of activity on the x86 front around the XSAVE
    architecture which is used to context-switch processor state (among other
    things).  In addition, AMD has recently joined the protection keys club by
    adding processor support for PKU.
    
    The AMD implementation helped uncover a kernel bug around the PKRU "init
    state", which actually applied to Intel's implementation but was just
    harder to hit.  This series adds a test which is expected to help find
    this class of bug both on AMD and Intel.  All the work around pkeys on x86
    also uncovered a few bugs in the selftest.
    
    This patch (of 4):
    
    The "random" pkey allocation code currently does the good old:
    
            srand((unsigned int)time(NULL));
    
    *But*, it unfortunately does this on every random pkey allocation.
    
    There may be thousands of these a second.  time() has a one second
    resolution.  So, each time alloc_random_pkey() is called, the PRNG is
    *RESET* to time().  This is nasty.  Normally, if you do:
    
            srand(<ANYTHING>);
            foo = rand();
            bar = rand();
    
    You'll be quite guaranteed that 'foo' and 'bar' are different.  But, if
    you do:
    
            srand(1);
            foo = rand();
            srand(1);
            bar = rand();
    
    You are quite guaranteed that 'foo' and 'bar' are the *SAME*.  The recent
    "fix" effectively forced the test case to use the same "random" pkey for
    the whole test, unless the test run crossed a second boundary.
    
    Only run srand() once at program startup.
    
    This explains some very odd and persistent test failures I've been seeing.
    
    Link: https://lkml.kernel.org/r/20210611164153.91B76FB8@viggo.jf.intel.com
    Link: https://lkml.kernel.org/r/20210611164155.192D00FF@viggo.jf.intel.com
    Fixes: 6e373263ce07 ("selftests/vm/pkeys: fix alloc_random_pkey() to make it really random")
    Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
    Cc: Ram Pai <linuxram@us.ibm.com>
    Cc: Sandipan Das <sandipan@linux.ibm.com>
    Cc: Florian Weimer <fweimer@redhat.com>
    Cc: "Desnes A. Nunes do Rosario" <desnesn@linux.vnet.ibm.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Thiago Jung Bauermann <bauerman@linux.ibm.com>
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: Michal Suchanek <msuchanek@suse.de>
    Cc: Shuah Khan <shuah@kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/tools/testing/selftests/x86/protection_keys.c b/tools/testing/selftests/x86/protection_keys.c
index b8778960da10..27661302a698 100644
--- a/tools/testing/selftests/x86/protection_keys.c
+++ b/tools/testing/selftests/x86/protection_keys.c
@@ -613,7 +613,6 @@ int alloc_random_pkey(void)
 	int nr_alloced = 0;
 	int random_index;
 	memset(alloced_pkeys, 0, sizeof(alloced_pkeys));
-	srand((unsigned int)time(NULL));
 
 	/* allocate every possible key and make a note of which ones we got */
 	max_nr_pkey_allocs = NR_PKEYS;
@@ -1479,6 +1478,8 @@ int main(void)
 {
 	int nr_iterations = 22;
 
+	srand((unsigned int)time(NULL));
+
 	setup_handlers();
 
 	printf("has pku: %d\n", cpu_has_pku());

commit c4e4a6f1c976aba407fa45fd95e4564291324eb9
Author: Miaohe Lin <linmiaohe@huawei.com>
Date:   Wed Jun 30 18:47:57 2021 -0700

    mm/huge_memory.c: don't discard hugepage if other processes are mapping it
    
    [ Upstream commit babbbdd08af98a59089334eb3effbed5a7a0cf7f ]
    
    If other processes are mapping any other subpages of the hugepage, i.e.
    in pte-mapped thp case, page_mapcount() will return 1 incorrectly.  Then
    we would discard the page while other processes are still mapping it.  Fix
    it by using total_mapcount() which can tell whether other processes are
    still mapping it.
    
    Link: https://lkml.kernel.org/r/20210511134857.1581273-6-linmiaohe@huawei.com
    Fixes: b8d3c4c3009d ("mm/huge_memory.c: don't split THP page when MADV_FREE syscall is called")
    Reviewed-by: Yang Shi <shy828301@gmail.com>
    Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
    Cc: Alexey Dobriyan <adobriyan@gmail.com>
    Cc: "Aneesh Kumar K . V" <aneesh.kumar@linux.ibm.com>
    Cc: Anshuman Khandual <anshuman.khandual@arm.com>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Rik van Riel <riel@surriel.com>
    Cc: Song Liu <songliubraving@fb.com>
    Cc: William Kucharski <william.kucharski@oracle.com>
    Cc: Zi Yan <ziy@nvidia.com>
    Cc: Mike Kravetz <mike.kravetz@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 4400957d8e4e..800d7de32af8 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -1692,7 +1692,7 @@ bool madvise_free_huge_pmd(struct mmu_gather *tlb, struct vm_area_struct *vma,
 	 * If other processes are mapping this page, we couldn't discard
 	 * the page unless they all do MADV_FREE so let's skip the page.
 	 */
-	if (page_mapcount(page) != 1)
+	if (total_mapcount(page) != 1)
 		goto out;
 
 	if (!trylock_page(page))

commit d067a6b62b430f7bedef9d4a2f600b7edf58e417
Author: Alex Williamson <alex.williamson@redhat.com>
Date:   Mon Jun 28 14:08:12 2021 -0600

    vfio/pci: Handle concurrent vma faults
    
    [ Upstream commit 6a45ece4c9af473555f01f0f8b97eba56e3c7d0d ]
    
    io_remap_pfn_range() will trigger a BUG_ON if it encounters a
    populated pte within the mapping range.  This can occur because we map
    the entire vma on fault and multiple faults can be blocked behind the
    vma_lock.  This leads to traces like the one reported below.
    
    We can use our vma_list to test whether a given vma is mapped to avoid
    this issue.
    
    [ 1591.733256] kernel BUG at mm/memory.c:2177!
    [ 1591.739515] Internal error: Oops - BUG: 0 [#1] PREEMPT SMP
    [ 1591.747381] Modules linked in: vfio_iommu_type1 vfio_pci vfio_virqfd vfio pv680_mii(O)
    [ 1591.760536] CPU: 2 PID: 227 Comm: lcore-worker-2 Tainted: G O 5.11.0-rc3+ #1
    [ 1591.770735] Hardware name:  , BIOS HixxxxFPGA 1P B600 V121-1
    [ 1591.778872] pstate: 40400009 (nZcv daif +PAN -UAO -TCO BTYPE=--)
    [ 1591.786134] pc : remap_pfn_range+0x214/0x340
    [ 1591.793564] lr : remap_pfn_range+0x1b8/0x340
    [ 1591.799117] sp : ffff80001068bbd0
    [ 1591.803476] x29: ffff80001068bbd0 x28: 0000042eff6f0000
    [ 1591.810404] x27: 0000001100910000 x26: 0000001300910000
    [ 1591.817457] x25: 0068000000000fd3 x24: ffffa92f1338e358
    [ 1591.825144] x23: 0000001140000000 x22: 0000000000000041
    [ 1591.832506] x21: 0000001300910000 x20: ffffa92f141a4000
    [ 1591.839520] x19: 0000001100a00000 x18: 0000000000000000
    [ 1591.846108] x17: 0000000000000000 x16: ffffa92f11844540
    [ 1591.853570] x15: 0000000000000000 x14: 0000000000000000
    [ 1591.860768] x13: fffffc0000000000 x12: 0000000000000880
    [ 1591.868053] x11: ffff0821bf3d01d0 x10: ffff5ef2abd89000
    [ 1591.875932] x9 : ffffa92f12ab0064 x8 : ffffa92f136471c0
    [ 1591.883208] x7 : 0000001140910000 x6 : 0000000200000000
    [ 1591.890177] x5 : 0000000000000001 x4 : 0000000000000001
    [ 1591.896656] x3 : 0000000000000000 x2 : 0168044000000fd3
    [ 1591.903215] x1 : ffff082126261880 x0 : fffffc2084989868
    [ 1591.910234] Call trace:
    [ 1591.914837]  remap_pfn_range+0x214/0x340
    [ 1591.921765]  vfio_pci_mmap_fault+0xac/0x130 [vfio_pci]
    [ 1591.931200]  __do_fault+0x44/0x12c
    [ 1591.937031]  handle_mm_fault+0xcc8/0x1230
    [ 1591.942475]  do_page_fault+0x16c/0x484
    [ 1591.948635]  do_translation_fault+0xbc/0xd8
    [ 1591.954171]  do_mem_abort+0x4c/0xc0
    [ 1591.960316]  el0_da+0x40/0x80
    [ 1591.965585]  el0_sync_handler+0x168/0x1b0
    [ 1591.971608]  el0_sync+0x174/0x180
    [ 1591.978312] Code: eb1b027f 540000c0 f9400022 b4fffe02 (d4210000)
    
    Fixes: 11c4cd07ba11 ("vfio-pci: Fault mmaps to enable vma tracking")
    Reported-by: Zeng Tao <prime.zeng@hisilicon.com>
    Suggested-by: Zeng Tao <prime.zeng@hisilicon.com>
    Link: https://lore.kernel.org/r/162497742783.3883260.3282953006487785034.stgit@omen
    Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c
index c48e1d84efb6..51b791c750f1 100644
--- a/drivers/vfio/pci/vfio_pci.c
+++ b/drivers/vfio/pci/vfio_pci.c
@@ -1359,6 +1359,7 @@ static vm_fault_t vfio_pci_mmap_fault(struct vm_fault *vmf)
 {
 	struct vm_area_struct *vma = vmf->vma;
 	struct vfio_pci_device *vdev = vma->vm_private_data;
+	struct vfio_pci_mmap_vma *mmap_vma;
 	vm_fault_t ret = VM_FAULT_NOPAGE;
 
 	mutex_lock(&vdev->vma_lock);
@@ -1366,24 +1367,36 @@ static vm_fault_t vfio_pci_mmap_fault(struct vm_fault *vmf)
 
 	if (!__vfio_pci_memory_enabled(vdev)) {
 		ret = VM_FAULT_SIGBUS;
-		mutex_unlock(&vdev->vma_lock);
 		goto up_out;
 	}
 
-	if (__vfio_pci_add_vma(vdev, vma)) {
-		ret = VM_FAULT_OOM;
-		mutex_unlock(&vdev->vma_lock);
-		goto up_out;
+	/*
+	 * We populate the whole vma on fault, so we need to test whether
+	 * the vma has already been mapped, such as for concurrent faults
+	 * to the same vma.  io_remap_pfn_range() will trigger a BUG_ON if
+	 * we ask it to fill the same range again.
+	 */
+	list_for_each_entry(mmap_vma, &vdev->vma_list, vma_next) {
+		if (mmap_vma->vma == vma)
+			goto up_out;
 	}
 
-	mutex_unlock(&vdev->vma_lock);
-
 	if (io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
-			       vma->vm_end - vma->vm_start, vma->vm_page_prot))
+			       vma->vm_end - vma->vm_start,
+			       vma->vm_page_prot)) {
 		ret = VM_FAULT_SIGBUS;
+		zap_vma_ptes(vma, vma->vm_start, vma->vm_end - vma->vm_start);
+		goto up_out;
+	}
+
+	if (__vfio_pci_add_vma(vdev, vma)) {
+		ret = VM_FAULT_OOM;
+		zap_vma_ptes(vma, vma->vm_start, vma->vm_end - vma->vm_start);
+	}
 
 up_out:
 	up_read(&vdev->memory_lock);
+	mutex_unlock(&vdev->vma_lock);
 	return ret;
 }
 

commit 0dc3e70a576d93da91f46d8fc6f23cbc5fa41e59
Author: Pali Rohár <pali@kernel.org>
Date:   Fri Jun 25 00:49:04 2021 +0200

    arm64: dts: marvell: armada-37xx: Fix reg for standard variant of UART
    
    [ Upstream commit 2cbfdedef39fb5994b8f1e1df068eb8440165975 ]
    
    UART1 (standard variant with DT node name 'uart0') has register space
    0x12000-0x12018 and not whole size 0x200. So fix also this in example.
    
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Fixes: c737abc193d1 ("arm64: dts: marvell: Fix A37xx UART0 register size")
    Link: https://lore.kernel.org/r/20210624224909.6350-6-pali@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
index 3a611250f598..1844fb8605f0 100644
--- a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
+++ b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
@@ -121,7 +121,7 @@
 
 			uart0: serial@12000 {
 				compatible = "marvell,armada-3700-uart";
-				reg = <0x12000 0x200>;
+				reg = <0x12000 0x18>;
 				clocks = <&xtalclk>;
 				interrupts =
 				<GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>,

commit 0e3b7b2e7843ca31c512fa458f72bc7839dea7d1
Author: Pali Rohár <pali@kernel.org>
Date:   Fri Jun 25 00:49:02 2021 +0200

    serial: mvebu-uart: correctly calculate minimal possible baudrate
    
    [ Upstream commit deeaf963569a0d9d1b08babb771f61bb501a5704 ]
    
    For default (x16) scheme which is currently used by mvebu-uart.c driver,
    maximal divisor of UART base clock is 1023*16. Therefore there is limit for
    minimal supported baudrate. This change calculate it correctly and prevents
    setting invalid divisor 0 into hardware registers.
    
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Fixes: 68a0db1d7da2 ("serial: mvebu-uart: add function to change baudrate")
    Link: https://lore.kernel.org/r/20210624224909.6350-4-pali@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/serial/mvebu-uart.c b/drivers/tty/serial/mvebu-uart.c
index 0515b5e6326d..9369b4d42d24 100644
--- a/drivers/tty/serial/mvebu-uart.c
+++ b/drivers/tty/serial/mvebu-uart.c
@@ -471,7 +471,7 @@ static void mvebu_uart_set_termios(struct uart_port *port,
 				   struct ktermios *old)
 {
 	unsigned long flags;
-	unsigned int baud;
+	unsigned int baud, min_baud, max_baud;
 
 	spin_lock_irqsave(&port->lock, flags);
 
@@ -490,16 +490,21 @@ static void mvebu_uart_set_termios(struct uart_port *port,
 		port->ignore_status_mask |= STAT_RX_RDY(port) | STAT_BRK_ERR;
 
 	/*
+	 * Maximal divisor is 1023 * 16 when using default (x16) scheme.
 	 * Maximum achievable frequency with simple baudrate divisor is 230400.
 	 * Since the error per bit frame would be of more than 15%, achieving
 	 * higher frequencies would require to implement the fractional divisor
 	 * feature.
 	 */
-	baud = uart_get_baud_rate(port, termios, old, 0, 230400);
+	min_baud = DIV_ROUND_UP(port->uartclk, 1023 * 16);
+	max_baud = 230400;
+
+	baud = uart_get_baud_rate(port, termios, old, min_baud, max_baud);
 	if (mvebu_uart_baud_rate_set(port, baud)) {
 		/* No clock available, baudrate cannot be changed */
 		if (old)
-			baud = uart_get_baud_rate(port, old, NULL, 0, 230400);
+			baud = uart_get_baud_rate(port, old, NULL,
+						  min_baud, max_baud);
 	} else {
 		tty_termios_encode_baud_rate(termios, baud, baud);
 		uart_update_timeout(port, termios->c_cflag, baud);

commit 3d1e4f17838c3e5d2b541a4bdb8e623773c96367
Author: Nicholas Piggin <npiggin@gmail.com>
Date:   Wed Jun 23 14:12:45 2021 +1000

    powerpc: Offline CPU in stop_this_cpu()
    
    [ Upstream commit bab26238bbd44d5a4687c0a64fd2c7f2755ea937 ]
    
    printk_safe_flush_on_panic() has special lock breaking code for the case
    where we panic()ed with the console lock held. It relies on panic IPI
    causing other CPUs to mark themselves offline.
    
    Do as most other architectures do.
    
    This effectively reverts commit de6e5d38417e ("powerpc: smp_send_stop do
    not offline stopped CPUs"), unfortunately it may result in some false
    positive warnings, but the alternative is more situations where we can
    crash without getting messages out.
    
    Fixes: de6e5d38417e ("powerpc: smp_send_stop do not offline stopped CPUs")
    Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210623041245.865134-1-npiggin@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
index a9ec4467705c..14adfeacfa46 100644
--- a/arch/powerpc/kernel/smp.c
+++ b/arch/powerpc/kernel/smp.c
@@ -570,6 +570,8 @@ static void nmi_stop_this_cpu(struct pt_regs *regs)
 	/*
 	 * IRQs are already hard disabled by the smp_handle_nmi_ipi.
 	 */
+	set_cpu_online(smp_processor_id(), false);
+
 	spin_begin();
 	while (1)
 		spin_cpu_relax();
@@ -585,6 +587,15 @@ void smp_send_stop(void)
 static void stop_this_cpu(void *dummy)
 {
 	hard_irq_disable();
+
+	/*
+	 * Offlining CPUs in stop_this_cpu can result in scheduler warnings,
+	 * (see commit de6e5d38417e), but printk_safe_flush_on_panic() wants
+	 * to know other CPUs are offline before it breaks locks to flush
+	 * printk buffers, in case we panic()ed while holding the lock.
+	 */
+	set_cpu_online(smp_processor_id(), false);
+
 	spin_begin();
 	while (1)
 		spin_cpu_relax();

commit 09f064fcadc7dad2ffc69232d58c8a29b2e5e430
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Fri May 21 13:21:01 2021 +0200

    leds: ktd2692: Fix an error handling path
    
    [ Upstream commit ee78b9360e14c276f5ceaa4a0d06f790f04ccdad ]
    
    In 'ktd2692_parse_dt()', if an error occurs after a successful
    'regulator_enable()' call, we should call 'regulator_enable()'.
    
    This is the same in 'ktd2692_probe()', if an error occurs after a
    successful 'ktd2692_parse_dt()' call.
    
    Instead of adding 'regulator_enable()' in several places, implement a
    resource managed solution and simplify the remove function accordingly.
    
    Fixes: b7da8c5c725c ("leds: Add ktd2692 flash LED driver")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Signed-off-by: Pavel Machek <pavel@ucw.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/leds/leds-ktd2692.c b/drivers/leds/leds-ktd2692.c
index 45296aaca9da..02738b5b1dbf 100644
--- a/drivers/leds/leds-ktd2692.c
+++ b/drivers/leds/leds-ktd2692.c
@@ -259,6 +259,17 @@ static void ktd2692_setup(struct ktd2692_context *led)
 				 | KTD2692_REG_FLASH_CURRENT_BASE);
 }
 
+static void regulator_disable_action(void *_data)
+{
+	struct device *dev = _data;
+	struct ktd2692_context *led = dev_get_drvdata(dev);
+	int ret;
+
+	ret = regulator_disable(led->regulator);
+	if (ret)
+		dev_err(dev, "Failed to disable supply: %d\n", ret);
+}
+
 static int ktd2692_parse_dt(struct ktd2692_context *led, struct device *dev,
 			    struct ktd2692_led_config_data *cfg)
 {
@@ -289,8 +300,14 @@ static int ktd2692_parse_dt(struct ktd2692_context *led, struct device *dev,
 
 	if (led->regulator) {
 		ret = regulator_enable(led->regulator);
-		if (ret)
+		if (ret) {
 			dev_err(dev, "Failed to enable supply: %d\n", ret);
+		} else {
+			ret = devm_add_action_or_reset(dev,
+						regulator_disable_action, dev);
+			if (ret)
+				return ret;
+		}
 	}
 
 	child_node = of_get_next_available_child(np, NULL);
@@ -380,17 +397,9 @@ static int ktd2692_probe(struct platform_device *pdev)
 static int ktd2692_remove(struct platform_device *pdev)
 {
 	struct ktd2692_context *led = platform_get_drvdata(pdev);
-	int ret;
 
 	led_classdev_flash_unregister(&led->fled_cdev);
 
-	if (led->regulator) {
-		ret = regulator_disable(led->regulator);
-		if (ret)
-			dev_err(&pdev->dev,
-				"Failed to disable supply: %d\n", ret);
-	}
-
 	mutex_destroy(&led->lock);
 
 	return 0;

commit 21da01972675769d2908652e7785f5ce20254a7a
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Sat May 15 11:06:46 2021 +0800

    leds: as3645a: Fix error return code in as3645a_parse_node()
    
    [ Upstream commit 96a30960a2c5246c8ffebe8a3c9031f9df094d97 ]
    
    Return error code -ENODEV rather than '0' when the indicator node can not
    be found.
    
    Fixes: a56ba8fbcb55 ("media: leds: as3645a: Add LED flash class driver")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Signed-off-by: Pavel Machek <pavel@ucw.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/leds/leds-as3645a.c b/drivers/leds/leds-as3645a.c
index f883616d9e60..821944379f2c 100644
--- a/drivers/leds/leds-as3645a.c
+++ b/drivers/leds/leds-as3645a.c
@@ -565,6 +565,7 @@ static int as3645a_parse_node(struct as3645a *flash,
 	if (!flash->indicator_node) {
 		dev_warn(&flash->client->dev,
 			 "can't find indicator node\n");
+		rval = -ENODEV;
 		goto out_err;
 	}
 

commit 01b00e46253151d58a7db8ca3e1502ec1945a8d0
Author: Chung-Chiang Cheng <shepjeng@gmail.com>
Date:   Fri Jun 18 15:59:25 2021 +0800

    configfs: fix memleak in configfs_release_bin_file
    
    [ Upstream commit 3c252b087de08d3cb32468b54a158bd7ad0ae2f7 ]
    
    When reading binary attributes in progress, buffer->bin_buffer is setup in
    configfs_read_bin_file() but never freed.
    
    Fixes: 03607ace807b4 ("configfs: implement binary attributes")
    Signed-off-by: Chung-Chiang Cheng <cccheng@synology.com>
    [hch: move the vfree rather than duplicating it]
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/configfs/file.c b/fs/configfs/file.c
index 50b7c4c4310e..38eb80e29715 100644
--- a/fs/configfs/file.c
+++ b/fs/configfs/file.c
@@ -496,13 +496,13 @@ static int configfs_release_bin_file(struct inode *inode, struct file *file)
 					buffer->bin_buffer_size);
 		}
 		up_read(&frag->frag_sem);
-		/* vfree on NULL is safe */
-		vfree(buffer->bin_buffer);
-		buffer->bin_buffer = NULL;
-		buffer->bin_buffer_size = 0;
-		buffer->needs_read_fill = 1;
 	}
 
+	vfree(buffer->bin_buffer);
+	buffer->bin_buffer = NULL;
+	buffer->bin_buffer_size = 0;
+	buffer->needs_read_fill = 1;
+
 	configfs_release(inode, file);
 	return 0;
 }

commit e462d5387ef2f542d8d2e7a55c169f98d28fd302
Author: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
Date:   Fri Jun 18 18:07:41 2021 +0300

    ASoC: atmel-i2s: Fix usage of capture and playback at the same time
    
    [ Upstream commit 3b7961a326f8a7e03f54a19f02fedae8d488b80f ]
    
    For both capture and playback streams to work at the same time, only the
    needed values from a register need to be updated. Also, clocks should be
    enabled only when the first stream is started and stopped when there is no
    running stream.
    
    Fixes: b543e467d1a9 ("ASoC: atmel-i2s: add driver for the new Atmel I2S controller")
    Signed-off-by: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
    Link: https://lore.kernel.org/r/20210618150741.401739-2-codrin.ciubotariu@microchip.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/atmel/atmel-i2s.c b/sound/soc/atmel/atmel-i2s.c
index d88c1d995036..99cc73150576 100644
--- a/sound/soc/atmel/atmel-i2s.c
+++ b/sound/soc/atmel/atmel-i2s.c
@@ -211,6 +211,7 @@ struct atmel_i2s_dev {
 	unsigned int				fmt;
 	const struct atmel_i2s_gck_param	*gck_param;
 	const struct atmel_i2s_caps		*caps;
+	int					clk_use_no;
 };
 
 static irqreturn_t atmel_i2s_interrupt(int irq, void *dev_id)
@@ -332,9 +333,16 @@ static int atmel_i2s_hw_params(struct snd_pcm_substream *substream,
 {
 	struct atmel_i2s_dev *dev = snd_soc_dai_get_drvdata(dai);
 	bool is_playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
-	unsigned int mr = 0;
+	unsigned int mr = 0, mr_mask;
 	int ret;
 
+	mr_mask = ATMEL_I2SC_MR_FORMAT_MASK | ATMEL_I2SC_MR_MODE_MASK |
+		ATMEL_I2SC_MR_DATALENGTH_MASK;
+	if (is_playback)
+		mr_mask |= ATMEL_I2SC_MR_TXMONO;
+	else
+		mr_mask |= ATMEL_I2SC_MR_RXMONO;
+
 	switch (dev->fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
 	case SND_SOC_DAIFMT_I2S:
 		mr |= ATMEL_I2SC_MR_FORMAT_I2S;
@@ -413,7 +421,7 @@ static int atmel_i2s_hw_params(struct snd_pcm_substream *substream,
 		return -EINVAL;
 	}
 
-	return regmap_write(dev->regmap, ATMEL_I2SC_MR, mr);
+	return regmap_update_bits(dev->regmap, ATMEL_I2SC_MR, mr_mask, mr);
 }
 
 static int atmel_i2s_switch_mck_generator(struct atmel_i2s_dev *dev,
@@ -506,18 +514,28 @@ static int atmel_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
 	is_master = (mr & ATMEL_I2SC_MR_MODE_MASK) == ATMEL_I2SC_MR_MODE_MASTER;
 
 	/* If master starts, enable the audio clock. */
-	if (is_master && mck_enabled)
-		err = atmel_i2s_switch_mck_generator(dev, true);
-	if (err)
-		return err;
+	if (is_master && mck_enabled) {
+		if (!dev->clk_use_no) {
+			err = atmel_i2s_switch_mck_generator(dev, true);
+			if (err)
+				return err;
+		}
+		dev->clk_use_no++;
+	}
 
 	err = regmap_write(dev->regmap, ATMEL_I2SC_CR, cr);
 	if (err)
 		return err;
 
 	/* If master stops, disable the audio clock. */
-	if (is_master && !mck_enabled)
-		err = atmel_i2s_switch_mck_generator(dev, false);
+	if (is_master && !mck_enabled) {
+		if (dev->clk_use_no == 1) {
+			err = atmel_i2s_switch_mck_generator(dev, false);
+			if (err)
+				return err;
+		}
+		dev->clk_use_no--;
+	}
 
 	return err;
 }

commit 3df5960043203c68d8d1ca08c23c49903140f442
Author: Marek Szyprowski <m.szyprowski@samsung.com>
Date:   Fri Apr 23 22:46:24 2021 +0200

    extcon: max8997: Add missing modalias string
    
    [ Upstream commit dc11fc2991e9efbceef93912b83e333d2835fb19 ]
    
    The platform device driver name is "max8997-muic", so advertise it
    properly in the modalias string. This fixes automated module loading when
    this driver is compiled as a module.
    
    Fixes: b76668ba8a77 ("Extcon: add MAX8997 extcon driver")
    Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
    Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/extcon/extcon-max8997.c b/drivers/extcon/extcon-max8997.c
index 7a767b66dd86..98285eb8dd79 100644
--- a/drivers/extcon/extcon-max8997.c
+++ b/drivers/extcon/extcon-max8997.c
@@ -783,3 +783,4 @@ module_platform_driver(max8997_muic_driver);
 MODULE_DESCRIPTION("Maxim MAX8997 Extcon driver");
 MODULE_AUTHOR("Donggeun Kim <dg77.kim@samsung.com>");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:max8997-muic");

commit 06a65c0d8aaf2c010d6dab7f8358e4d6692dcc35
Author: Stephan Gerhold <stephan@gerhold.net>
Date:   Mon May 31 15:34:35 2021 +0200

    extcon: sm5502: Drop invalid register write in sm5502_reg_data
    
    [ Upstream commit d25b224f8e5507879b36a769a6d1324cf163466c ]
    
    When sm5502_init_dev_type() iterates over sm5502_reg_data to
    initialize the registers it is limited by ARRAY_SIZE(sm5502_reg_data).
    There is no need to add another empty element to sm5502_reg_data.
    
    Having the additional empty element in sm5502_reg_data will just
    result in writing 0xff to register 0x00, which does not really
    make sense.
    
    Fixes: 914b881f9452 ("extcon: sm5502: Add support new SM5502 extcon device driver")
    Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
    Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/extcon/extcon-sm5502.c b/drivers/extcon/extcon-sm5502.c
index 2efcd94f74fc..59ec4c3e7c4d 100644
--- a/drivers/extcon/extcon-sm5502.c
+++ b/drivers/extcon/extcon-sm5502.c
@@ -92,7 +92,6 @@ static struct reg_data sm5502_reg_data[] = {
 			| SM5502_REG_INTM2_MHL_MASK,
 		.invert = true,
 	},
-	{ }
 };
 
 /* List of detectable cables */

commit d731d20c066c9ef334bfa617fe64031bb2acf3ce
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Sat Jun 5 15:17:43 2021 +0200

    phy: ti: dm816x: Fix the error handling path in 'dm816x_usb_phy_probe()
    
    [ Upstream commit f7eedcb8539ddcbb6fe7791f1b4ccf43f905c72f ]
    
    Add an error handling path in the probe to release some resources, as
    already done in the remove function.
    
    Fixes: 609adde838f4 ("phy: Add a driver for dm816x USB PHY")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Link: https://lore.kernel.org/r/ac5136881f6bdec50be19b3bf73b3bc1b15ef1f1.1622898974.git.christophe.jaillet@wanadoo.fr
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/phy/ti/phy-dm816x-usb.c b/drivers/phy/ti/phy-dm816x-usb.c
index cbcce7cf0028..2ed5fe20d779 100644
--- a/drivers/phy/ti/phy-dm816x-usb.c
+++ b/drivers/phy/ti/phy-dm816x-usb.c
@@ -246,19 +246,28 @@ static int dm816x_usb_phy_probe(struct platform_device *pdev)
 
 	pm_runtime_enable(phy->dev);
 	generic_phy = devm_phy_create(phy->dev, NULL, &ops);
-	if (IS_ERR(generic_phy))
-		return PTR_ERR(generic_phy);
+	if (IS_ERR(generic_phy)) {
+		error = PTR_ERR(generic_phy);
+		goto clk_unprepare;
+	}
 
 	phy_set_drvdata(generic_phy, phy);
 
 	phy_provider = devm_of_phy_provider_register(phy->dev,
 						     of_phy_simple_xlate);
-	if (IS_ERR(phy_provider))
-		return PTR_ERR(phy_provider);
+	if (IS_ERR(phy_provider)) {
+		error = PTR_ERR(phy_provider);
+		goto clk_unprepare;
+	}
 
 	usb_add_phy_dev(&phy->phy);
 
 	return 0;
+
+clk_unprepare:
+	pm_runtime_disable(phy->dev);
+	clk_unprepare(phy->refclk);
+	return error;
 }
 
 static int dm816x_usb_phy_remove(struct platform_device *pdev)

commit a2ec9ab0b241e82aeedf353a678ad8655a4c271a
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Fri May 14 16:13:00 2021 +0800

    scsi: mpt3sas: Fix error return value in _scsih_expander_add()
    
    [ Upstream commit d6c2ce435ffe23ef7f395ae76ec747414589db46 ]
    
    When an expander does not contain any 'phys', an appropriate error code -1
    should be returned, as done elsewhere in this function. However, we
    currently do not explicitly assign this error code to 'rc'. As a result, 0
    was incorrectly returned.
    
    Link: https://lore.kernel.org/r/20210514081300.6650-1-thunder.leizhen@huawei.com
    Fixes: f92363d12359 ("[SCSI] mpt3sas: add new driver supporting 12GB SAS")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
index 5a5e5c3da657..add699b01836 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
@@ -5745,8 +5745,10 @@ _scsih_expander_add(struct MPT3SAS_ADAPTER *ioc, u16 handle)
 	    handle, parent_handle, (unsigned long long)
 	    sas_expander->sas_address, sas_expander->num_phys);
 
-	if (!sas_expander->num_phys)
+	if (!sas_expander->num_phys) {
+		rc = -1;
 		goto out_fail;
+	}
 	sas_expander->phy = kcalloc(sas_expander->num_phys,
 	    sizeof(struct _sas_phy), GFP_KERNEL);
 	if (!sas_expander->phy) {

commit 7a4498d0a460b80f797841ad39ec1506aeaedfae
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Tue Jun 1 20:58:14 2021 +0800

    mtd: rawnand: marvell: add missing clk_disable_unprepare() on error in marvell_nfc_resume()
    
    [ Upstream commit ae94c49527aa9bd3b563349adc4b5617747ca6bd ]
    
    Add clk_disable_unprepare() on error path in marvell_nfc_resume().
    
    Fixes: bd9c3f9b3c00 ("mtd: rawnand: marvell: add suspend and resume hooks")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20210601125814.3260364-1-yangyingliang@huawei.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mtd/nand/raw/marvell_nand.c b/drivers/mtd/nand/raw/marvell_nand.c
index 00b1adcfad86..07bd41dd4356 100644
--- a/drivers/mtd/nand/raw/marvell_nand.c
+++ b/drivers/mtd/nand/raw/marvell_nand.c
@@ -2880,8 +2880,10 @@ static int __maybe_unused marvell_nfc_resume(struct device *dev)
 		return ret;
 
 	ret = clk_prepare_enable(nfc->reg_clk);
-	if (ret < 0)
+	if (ret < 0) {
+		clk_disable_unprepare(nfc->core_clk);
 		return ret;
+	}
 
 	/*
 	 * Reset nfc->selected_chip so the next command will cause the timing

commit 193dc4417956ce56413ff1d57b5f26541eedba34
Author: Geert Uytterhoeven <geert+renesas@glider.be>
Date:   Wed Jun 16 11:27:44 2021 +0200

    of: Fix truncation of memory sizes on 32-bit platforms
    
    [ Upstream commit 2892d8a00d23d511a0591ac4b2ff3f050ae1f004 ]
    
    Variable "size" has type "phys_addr_t", which can be either 32-bit or
    64-bit on 32-bit systems, while "unsigned long" is always 32-bit on
    32-bit systems.  Hence the cast in
    
        (unsigned long)size / SZ_1M
    
    may truncate a 64-bit size to 32-bit, as casts have a higher operator
    precedence than divisions.
    
    Fix this by inverting the order of the cast and division, which should
    be safe for memory blocks smaller than 4 PiB.  Note that the division is
    actually a shift, as SZ_1M is a power-of-two constant, hence there is no
    need to use div_u64().
    
    While at it, use "%lu" to format "unsigned long".
    
    Fixes: e8d9d1f5485b52ec ("drivers: of: add initialization code for static reserved memory")
    Fixes: 3f0c8206644836e4 ("drivers: of: add initialization code for dynamic reserved memory")
    Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
    Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>
    Link: https://lore.kernel.org/r/4a1117e72d13d26126f57be034c20dac02f1e915.1623835273.git.geert+renesas@glider.be
    Signed-off-by: Rob Herring <robh@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index 800ad252cf9c..1eb6af6439ad 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -576,11 +576,11 @@ static int __init __reserved_mem_reserve_reg(unsigned long node,
 
 		if (size &&
 		    early_init_dt_reserve_memory_arch(base, size, nomap) == 0)
-			pr_debug("Reserved memory: reserved region for node '%s': base %pa, size %ld MiB\n",
-				uname, &base, (unsigned long)size / SZ_1M);
+			pr_debug("Reserved memory: reserved region for node '%s': base %pa, size %lu MiB\n",
+				uname, &base, (unsigned long)(size / SZ_1M));
 		else
-			pr_info("Reserved memory: failed to reserve memory for node '%s': base %pa, size %ld MiB\n",
-				uname, &base, (unsigned long)size / SZ_1M);
+			pr_info("Reserved memory: failed to reserve memory for node '%s': base %pa, size %lu MiB\n",
+				uname, &base, (unsigned long)(size / SZ_1M));
 
 		len -= t_len;
 		if (first) {
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
index 19f95552da4d..ff230ee2423f 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -154,9 +154,9 @@ static int __init __reserved_mem_alloc_size(unsigned long node,
 			ret = early_init_dt_alloc_reserved_memory_arch(size,
 					align, start, end, nomap, &base);
 			if (ret == 0) {
-				pr_debug("allocated memory for '%s' node: base %pa, size %ld MiB\n",
+				pr_debug("allocated memory for '%s' node: base %pa, size %lu MiB\n",
 					uname, &base,
-					(unsigned long)size / SZ_1M);
+					(unsigned long)(size / SZ_1M));
 				break;
 			}
 			len -= t_len;
@@ -166,8 +166,8 @@ static int __init __reserved_mem_alloc_size(unsigned long node,
 		ret = early_init_dt_alloc_reserved_memory_arch(size, align,
 							0, 0, nomap, &base);
 		if (ret == 0)
-			pr_debug("allocated memory for '%s' node: base %pa, size %ld MiB\n",
-				uname, &base, (unsigned long)size / SZ_1M);
+			pr_debug("allocated memory for '%s' node: base %pa, size %lu MiB\n",
+				uname, &base, (unsigned long)(size / SZ_1M));
 	}
 
 	if (base == 0) {

commit 9a305239bd781ae29cb17be747619a5c521b0c7f
Author: Richard Fitzgerald <rf@opensource.cirrus.com>
Date:   Wed Jun 16 14:56:04 2021 +0100

    ASoC: cs42l42: Correct definition of CS42L42_ADC_PDN_MASK
    
    [ Upstream commit fac165f22ac947b55407cd3a60a2a9824f905235 ]
    
    The definition of CS42L42_ADC_PDN_MASK was incorrectly defined
    as the HP_PDN bit.
    
    Fixes: 2c394ca79604 ("ASoC: Add support for CS42L42 codec")
    Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
    Link: https://lore.kernel.org/r/20210616135604.19363-1-rf@opensource.cirrus.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/codecs/cs42l42.h b/sound/soc/codecs/cs42l42.h
index bcaf4f22408d..5a46e7d4f9a3 100644
--- a/sound/soc/codecs/cs42l42.h
+++ b/sound/soc/codecs/cs42l42.h
@@ -81,7 +81,7 @@
 #define CS42L42_HP_PDN_SHIFT		3
 #define CS42L42_HP_PDN_MASK		(1 << CS42L42_HP_PDN_SHIFT)
 #define CS42L42_ADC_PDN_SHIFT		2
-#define CS42L42_ADC_PDN_MASK		(1 << CS42L42_HP_PDN_SHIFT)
+#define CS42L42_ADC_PDN_MASK		(1 << CS42L42_ADC_PDN_SHIFT)
 #define CS42L42_PDN_ALL_SHIFT		0
 #define CS42L42_PDN_ALL_MASK		(1 << CS42L42_PDN_ALL_SHIFT)
 

commit 7cd3fd394f6581e992c5879bd4bddc18a3d543fb
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sun Jun 13 16:23:01 2021 +0100

    iio: prox: isl29501: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
    
    [ Upstream commit 92babc9938ebbf4050f2fba774836f7edc16a570 ]
    
    Add __aligned(8) to ensure the buffer passed to
    iio_push_to_buffers_with_timestamp() is suitable for the naturally
    aligned timestamp that will be inserted.
    
    Here an explicit structure is not used, because the holes would
    necessitate the addition of an explict memset(), to avoid a kernel
    data leak, making for a less minimal fix.
    
    Fixes: 1c28799257bc ("iio: light: isl29501: Add support for the ISL29501 ToF sensor.")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Cc: Mathieu Othacehe <m.othacehe@gmail.com>
    Reviewed-by: Nuno Sá <nuno.sa@analog.com>
    Link: https://lore.kernel.org/r/20210613152301.571002-9-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/proximity/isl29501.c b/drivers/iio/proximity/isl29501.c
index e5e94540f404..a99d26023ef7 100644
--- a/drivers/iio/proximity/isl29501.c
+++ b/drivers/iio/proximity/isl29501.c
@@ -946,7 +946,7 @@ static irqreturn_t isl29501_trigger_handler(int irq, void *p)
 	struct iio_dev *indio_dev = pf->indio_dev;
 	struct isl29501_private *isl29501 = iio_priv(indio_dev);
 	const unsigned long *active_mask = indio_dev->active_scan_mask;
-	u32 buffer[4] = {}; /* 1x16-bit + ts */
+	u32 buffer[4] __aligned(8) = {}; /* 1x16-bit + naturally aligned ts */
 
 	if (test_bit(ISL29501_DISTANCE_SCAN_INDEX, active_mask))
 		isl29501_register_read(isl29501, REG_DISTANCE, buffer);

commit 494c06f1c7ab6d52382b0a77c8c29abb9b7cb08a
Author: Maciej W. Rozycki <macro@orcam.me.uk>
Date:   Thu Jun 10 20:38:34 2021 +0200

    serial: 8250: Actually allow UPF_MAGIC_MULTIPLIER baud rates
    
    [ Upstream commit 78bcae8616ac277d6cb7f38e211493948ed73e30 ]
    
    Support for magic baud rate divisors of 32770 and 32769 used with SMSC
    Super I/O chips for extra baud rates of 230400 and 460800 respectively
    where base rate is 115200[1] has been added around Linux 2.5.64, which
    predates our repo history, but the origin could be identified as commit
    2a717aad772f ("Merge with Linux 2.5.64.") with the old MIPS/Linux repo
    also at: <git://git.kernel.org/pub/scm/linux/kernel/git/ralf/linux.git>.
    
    Code that is now in `serial8250_do_get_divisor' was added back then to
    `serial8250_get_divisor', but that code would only ever trigger if one
    of the higher baud rates was actually requested, and that cannot ever
    happen, because the earlier call to `serial8250_get_baud_rate' never
    returns them.  This is because it calls `uart_get_baud_rate' with the
    maximum requested being the base rate, that is clk/16 or 115200 for SMSC
    chips at their nominal clock rate.
    
    Fix it then and allow UPF_MAGIC_MULTIPLIER baud rates to be selected, by
    requesting the maximum baud rate of clk/4 rather than clk/16 if the flag
    has been set.  Also correct the minimum baud rate, observing that these
    ports only support actual (non-magic) divisors of up to 32767 only.
    
    References:
    
    [1] "FDC37M81x, PC98/99 Compliant Enhanced Super I/O Controller with
        Keyboard/Mouse Wake-Up", Standard Microsystems Corporation, Rev.
        03/27/2000, Table 31 - "Baud Rates", p. 77
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk>
    Link: https://lore.kernel.org/r/alpine.DEB.2.21.2105190412280.29169@angie.orcam.me.uk
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c
index 60ca19eca1f6..56693dfe0f5b 100644
--- a/drivers/tty/serial/8250/8250_port.c
+++ b/drivers/tty/serial/8250/8250_port.c
@@ -2646,6 +2646,21 @@ static unsigned int serial8250_get_baud_rate(struct uart_port *port,
 					     struct ktermios *old)
 {
 	unsigned int tolerance = port->uartclk / 100;
+	unsigned int min;
+	unsigned int max;
+
+	/*
+	 * Handle magic divisors for baud rates above baud_base on SMSC
+	 * Super I/O chips.  Enable custom rates of clk/4 and clk/8, but
+	 * disable divisor values beyond 32767, which are unavailable.
+	 */
+	if (port->flags & UPF_MAGIC_MULTIPLIER) {
+		min = port->uartclk / 16 / UART_DIV_MAX >> 1;
+		max = (port->uartclk + tolerance) / 4;
+	} else {
+		min = port->uartclk / 16 / UART_DIV_MAX;
+		max = (port->uartclk + tolerance) / 16;
+	}
 
 	/*
 	 * Ask the core to calculate the divisor for us.
@@ -2653,9 +2668,7 @@ static unsigned int serial8250_get_baud_rate(struct uart_port *port,
 	 * slower than nominal still match standard baud rates without
 	 * causing transmission errors.
 	 */
-	return uart_get_baud_rate(port, termios, old,
-				  port->uartclk / 16 / UART_DIV_MAX,
-				  (port->uartclk + tolerance) / 16);
+	return uart_get_baud_rate(port, termios, old, min, max);
 }
 
 void

commit 3f1d21f2dc7774bebba14d985e39cc913480f150
Author: Sergio Paracuellos <sergio.paracuellos@gmail.com>
Date:   Mon Jun 14 12:06:17 2021 +0200

    staging: mt7621-dts: fix pci address for PCI memory range
    
    [ Upstream commit 5b4f167ef3555ec4c334a8dc89c1b44bb2c6bff5 ]
    
    Driver code call 'devm_of_pci_get_host_bridge_resources'
    to get resources and properly fill 'bridge->windows' and
    'bridge->dma_ranges'. After parsing the ranges and store
    as resources, at the end it makes a call to pci function
    'pci_add_resource_offset' to set the offset for the
    memory resource. To calculate offset, resource start address
    subtracts pci address of the range. MT7621 does not need
    any offset for the memory resource. Moreover, setting an
    offset got into 'WARN_ON' calls from pci devices driver code.
    Until now memory range pci_addr was being '0x00000000' and
    res->start is '0x60000000' but becase pci controller driver
    was manually setting resources and adding them using pci function
    'pci_add_resource' where a zero is passed as offset, things
    was properly working. Since PCI_IOBASE is defined now for
    ralink we don't set nothing manually anymore so we have to
    properly fix PCI address for this range to make things work
    and the new pci address must be set to '0x60000000'. Doing
    in this way the subtract result obtain zero as offset
    and pci device driver code properly works.
    
    Fixes: d59578da2bb8 ("staging: mt7621-dts: add dts files")
    Signed-off-by: Sergio Paracuellos <sergio.paracuellos@gmail.com>
    Link: https://lore.kernel.org/r/20210614100617.28753-4-sergio.paracuellos@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/staging/mt7621-dts/mt7621.dtsi b/drivers/staging/mt7621-dts/mt7621.dtsi
index 2e837e60663a..9891e53e7895 100644
--- a/drivers/staging/mt7621-dts/mt7621.dtsi
+++ b/drivers/staging/mt7621-dts/mt7621.dtsi
@@ -409,7 +409,7 @@
 
 		bus-range = <0 255>;
 		ranges = <
-			0x02000000 0 0x00000000 0x60000000 0 0x10000000 /* pci memory */
+			0x02000000 0 0x60000000 0x60000000 0 0x10000000 /* pci memory */
 			0x01000000 0 0x00000000 0x1e160000 0 0x00010000 /* io space */
 		>;
 

commit 58f26f9463b86903018483205d5367016faac6bd
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Mon Jun 14 12:58:36 2021 +0300

    staging: gdm724x: check for overflow in gdm_lte_netif_rx()
    
    [ Upstream commit 7002b526f4ff1f6da34356e67085caafa6be383a ]
    
    This code assumes that "len" is at least 62 bytes, but we need a check
    to prevent a read overflow.
    
    Fixes: 61e121047645 ("staging: gdm7240: adding LTE USB driver")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Link: https://lore.kernel.org/r/YMcoTPsCYlhh2TQo@mwanda
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/staging/gdm724x/gdm_lte.c b/drivers/staging/gdm724x/gdm_lte.c
index 25135980349a..3c537807f4d1 100644
--- a/drivers/staging/gdm724x/gdm_lte.c
+++ b/drivers/staging/gdm724x/gdm_lte.c
@@ -611,10 +611,12 @@ static void gdm_lte_netif_rx(struct net_device *dev, char *buf,
 						  * bytes (99,130,83,99 dec)
 						  */
 			} __packed;
-			void *addr = buf + sizeof(struct iphdr) +
-				sizeof(struct udphdr) +
-				offsetof(struct dhcp_packet, chaddr);
-			ether_addr_copy(nic->dest_mac_addr, addr);
+			int offset = sizeof(struct iphdr) +
+				     sizeof(struct udphdr) +
+				     offsetof(struct dhcp_packet, chaddr);
+			if (offset + ETH_ALEN > len)
+				return;
+			ether_addr_copy(nic->dest_mac_addr, buf + offset);
 		}
 	}
 

commit 3ceb830e50c0ca144c3c3d087182a807538e8e22
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Mon Jun 14 12:55:35 2021 +0300

    staging: gdm724x: check for buffer overflow in gdm_lte_multi_sdu_pkt()
    
    [ Upstream commit 4a36e160856db8a8ddd6a3d2e5db5a850ab87f82 ]
    
    There needs to be a check to verify that we don't read beyond the end
    of "buf".  This function is called from do_rx().  The "buf" is the USB
    transfer_buffer and "len" is "urb->actual_length".
    
    Fixes: 61e121047645 ("staging: gdm7240: adding LTE USB driver")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Link: https://lore.kernel.org/r/YMcnl4zCwGWGDVMG@mwanda
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/staging/gdm724x/gdm_lte.c b/drivers/staging/gdm724x/gdm_lte.c
index 3c2aab7a921e..25135980349a 100644
--- a/drivers/staging/gdm724x/gdm_lte.c
+++ b/drivers/staging/gdm724x/gdm_lte.c
@@ -677,6 +677,7 @@ static void gdm_lte_multi_sdu_pkt(struct phy_dev *phy_dev, char *buf, int len)
 	struct sdu *sdu = NULL;
 	u8 endian = phy_dev->get_endian(phy_dev->priv_dev);
 	u8 *data = (u8 *)multi_sdu->data;
+	int copied;
 	u16 i = 0;
 	u16 num_packet;
 	u16 hci_len;
@@ -688,6 +689,12 @@ static void gdm_lte_multi_sdu_pkt(struct phy_dev *phy_dev, char *buf, int len)
 	num_packet = gdm_dev16_to_cpu(endian, multi_sdu->num_packet);
 
 	for (i = 0; i < num_packet; i++) {
+		copied = data - multi_sdu->data;
+		if (len < copied + sizeof(*sdu)) {
+			pr_err("rx prevent buffer overflow");
+			return;
+		}
+
 		sdu = (struct sdu *)data;
 
 		cmd_evt  = gdm_dev16_to_cpu(endian, sdu->cmd_evt);
@@ -698,7 +705,8 @@ static void gdm_lte_multi_sdu_pkt(struct phy_dev *phy_dev, char *buf, int len)
 			pr_err("rx sdu wrong hci %04x\n", cmd_evt);
 			return;
 		}
-		if (hci_len < 12) {
+		if (hci_len < 12 ||
+		    len < copied + sizeof(*sdu) + (hci_len - 12)) {
 			pr_err("rx sdu invalid len %d\n", hci_len);
 			return;
 		}

commit 91664385e6c49f1e961e822f2d024776ac22102a
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sun Jun 13 16:22:57 2021 +0100

    iio: adc: ti-ads8688: Fix alignment of buffer in iio_push_to_buffers_with_timestamp()
    
    [ Upstream commit 61fa5dfa5f52806f5ce37a0ba5712c271eb22f98 ]
    
    Add __aligned(8) to ensure the buffer passed to
    iio_push_to_buffers_with_timestamp() is suitable for the naturally
    aligned timestamp that will be inserted.
    
    Fixes: f214ff521fb1 ("iio: ti-ads8688: Update buffer allocation for timestamps")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Reviewed-by: Nuno Sá <nuno.sa@analog.com>
    Link: https://lore.kernel.org/r/20210613152301.571002-5-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/adc/ti-ads8688.c b/drivers/iio/adc/ti-ads8688.c
index 7f16c77b99fb..9bcb05897c9d 100644
--- a/drivers/iio/adc/ti-ads8688.c
+++ b/drivers/iio/adc/ti-ads8688.c
@@ -386,7 +386,8 @@ static irqreturn_t ads8688_trigger_handler(int irq, void *p)
 {
 	struct iio_poll_func *pf = p;
 	struct iio_dev *indio_dev = pf->indio_dev;
-	u16 buffer[ADS8688_MAX_CHANNELS + sizeof(s64)/sizeof(u16)];
+	/* Ensure naturally aligned timestamp */
+	u16 buffer[ADS8688_MAX_CHANNELS + sizeof(s64)/sizeof(u16)] __aligned(8);
 	int i, j = 0;
 
 	for (i = 0; i < indio_dev->masklength; i++) {

commit 3e8164ccaebee06b6df3c7ad776bb69edd60ec4d
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sun Jun 13 16:22:56 2021 +0100

    iio: adc: mxs-lradc: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
    
    [ Upstream commit 6a6be221b8bd561b053f0701ec752a5ed9007f69 ]
    
    To make code more readable, use a structure to express the channel
    layout and ensure the timestamp is 8 byte aligned.
    Add a comment on why the buffer is the size it is as not immediately
    obvious.
    
    Found during an audit of all calls of this function.
    
    Fixes: 6dd112b9f85e ("iio: adc: mxs-lradc: Add support for ADC driver")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Cc: Andreas Klinger <ak@it-klinger.de>
    Reviewed-by: Nuno Sá <nuno.sa@analog.com>
    Link: https://lore.kernel.org/r/20210613152301.571002-4-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/adc/mxs-lradc-adc.c b/drivers/iio/adc/mxs-lradc-adc.c
index c627513d9f0f..fc8b70d8d64c 100644
--- a/drivers/iio/adc/mxs-lradc-adc.c
+++ b/drivers/iio/adc/mxs-lradc-adc.c
@@ -124,7 +124,8 @@ struct mxs_lradc_adc {
 	struct device		*dev;
 
 	void __iomem		*base;
-	u32			buffer[10];
+	/* Maximum of 8 channels + 8 byte ts */
+	u32			buffer[10] __aligned(8);
 	struct iio_trigger	*trig;
 	struct completion	completion;
 	spinlock_t		lock;

commit 3ce7cd150ef7821508c142f4755fe4c327f79df2
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sun Jun 13 16:22:55 2021 +0100

    iio: adc: hx711: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
    
    [ Upstream commit afe2a789fbf7acd1a05407fc7839cc08d23825e3 ]
    
    To make code more readable, use a structure to express the channel
    layout and ensure the timestamp is 8 byte aligned.
    
    Found during an audit of all calls of this function.
    
    Fixes: d3bf60450d47 ("iio: hx711: add triggered buffer support")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Cc: Andreas Klinger <ak@it-klinger.de>
    Reviewed-by: Nuno Sá <nuno.sa@analog.com>
    Link: https://lore.kernel.org/r/20210613152301.571002-3-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/adc/hx711.c b/drivers/iio/adc/hx711.c
index 6c5d81a89aec..0dc487dd1674 100644
--- a/drivers/iio/adc/hx711.c
+++ b/drivers/iio/adc/hx711.c
@@ -94,9 +94,9 @@ struct hx711_data {
 	struct mutex		lock;
 	/*
 	 * triggered buffer
-	 * 2x32-bit channel + 64-bit timestamp
+	 * 2x32-bit channel + 64-bit naturally aligned timestamp
 	 */
-	u32			buffer[4];
+	u32			buffer[4] __aligned(8);
 	/*
 	 * delay after a rising edge on SCK until the data is ready DOUT
 	 * this is dependent on the hx711 where the datasheet tells a

commit 45c923bd692dc8280dbf79332b2cb6854365c41a
Author: Andy Shevchenko <andy.shevchenko@gmail.com>
Date:   Tue Jun 8 01:17:56 2021 +0300

    eeprom: idt_89hpesx: Restore printing the unsupported fwnode name
    
    [ Upstream commit e0db3deea73ba418bf5dc21f5a4e32ca87d16dde ]
    
    When iterating over child firmware nodes restore printing the name of ones
    that are not supported.
    
    While at it, refactor loop body to clearly show that we stop at the first match.
    
    Fixes: db15d73e5f0e ("eeprom: idt_89hpesx: Support both ACPI and OF probing")
    Cc: Huy Duong <qhuyduong@hotmail.com>
    Signed-off-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Link: https://lore.kernel.org/r/20210607221757.81465-2-andy.shevchenko@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/misc/eeprom/idt_89hpesx.c b/drivers/misc/eeprom/idt_89hpesx.c
index b93b83fc3e3e..5879ba82c718 100644
--- a/drivers/misc/eeprom/idt_89hpesx.c
+++ b/drivers/misc/eeprom/idt_89hpesx.c
@@ -1128,11 +1128,10 @@ static void idt_get_fw_data(struct idt_89hpesx_dev *pdev)
 
 	device_for_each_child_node(dev, fwnode) {
 		ee_id = idt_ee_match_id(fwnode);
-		if (!ee_id) {
-			dev_warn(dev, "Skip unsupported EEPROM device");
-			continue;
-		} else
+		if (ee_id)
 			break;
+
+		dev_warn(dev, "Skip unsupported EEPROM device %pfw\n", fwnode);
 	}
 
 	/* If there is no fwnode EEPROM device, then set zero size */

commit 286679fe8de3ccc8e6c56bdefec935767871e4d6
Author: Andy Shevchenko <andy.shevchenko@gmail.com>
Date:   Tue Jun 8 01:17:55 2021 +0300

    eeprom: idt_89hpesx: Put fwnode in matching case during ->probe()
    
    [ Upstream commit 3f6ee1c095156a74ab2df605af13020f1ce3e600 ]
    
    device_get_next_child_node() bumps a reference counting of a returned variable.
    We have to balance it whenever we return to the caller.
    
    Fixes: db15d73e5f0e ("eeprom: idt_89hpesx: Support both ACPI and OF probing")
    Cc: Huy Duong <qhuyduong@hotmail.com>
    Signed-off-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Link: https://lore.kernel.org/r/20210607221757.81465-1-andy.shevchenko@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/misc/eeprom/idt_89hpesx.c b/drivers/misc/eeprom/idt_89hpesx.c
index 8a4659518c33..b93b83fc3e3e 100644
--- a/drivers/misc/eeprom/idt_89hpesx.c
+++ b/drivers/misc/eeprom/idt_89hpesx.c
@@ -1163,6 +1163,7 @@ static void idt_get_fw_data(struct idt_89hpesx_dev *pdev)
 	else /* if (!fwnode_property_read_bool(node, "read-only")) */
 		pdev->eero = false;
 
+	fwnode_handle_put(fwnode);
 	dev_info(dev, "EEPROM of %d bytes found by 0x%x",
 		pdev->eesize, pdev->eeaddr);
 }

commit 3842ed3642f3835d78a466232d07e25a0c6b42f1
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Thu May 27 17:24:20 2021 -0700

    s390: appldata depends on PROC_SYSCTL
    
    [ Upstream commit 5d3516b3647621d5a1180672ea9e0817fb718ada ]
    
    APPLDATA_BASE should depend on PROC_SYSCTL instead of PROC_FS.
    Building with PROC_FS but not PROC_SYSCTL causes a build error,
    since appldata_base.c uses data and APIs from fs/proc/proc_sysctl.c.
    
    arch/s390/appldata/appldata_base.o: in function `appldata_generic_handler':
    appldata_base.c:(.text+0x192): undefined reference to `sysctl_vals'
    
    Fixes: c185b783b099 ("[S390] Remove config options.")
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Cc: Heiko Carstens <hca@linux.ibm.com>
    Cc: Vasily Gorbik <gor@linux.ibm.com>
    Cc: Christian Borntraeger <borntraeger@de.ibm.com>
    Cc: linux-s390@vger.kernel.org
    Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
    Link: https://lore.kernel.org/r/20210528002420.17634-1-rdunlap@infradead.org
    Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
index 9a9c7a6fe925..ce4c3b659f70 100644
--- a/arch/s390/Kconfig
+++ b/arch/s390/Kconfig
@@ -867,7 +867,7 @@ config CMM_IUCV
 config APPLDATA_BASE
 	def_bool n
 	prompt "Linux - VM Monitor Stream, base infrastructure"
-	depends on PROC_FS
+	depends on PROC_SYSCTL
 	help
 	  This provides a kernel interface for creating and updating z/VM APPLDATA
 	  monitor records. The monitor records are updated at certain time

commit 52147ba428ac4af703fe07b011f37f520a601c8d
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Fri May 28 16:26:14 2021 +0800

    visorbus: fix error return code in visorchipset_init()
    
    [ Upstream commit ce52ec5beecc1079c251f60e3973b3758f60eb59 ]
    
    Commit 1366a3db3dcf ("staging: unisys: visorbus: visorchipset_init clean
    up gotos") assigns the initial value -ENODEV to the local variable 'err',
    and the first several error branches will return this value after "goto
    error". But commit f1f537c2e7f5 ("staging: unisys: visorbus: Consolidate
    controlvm channel creation.") overwrites 'err' in the middle of the way.
    As a result, some error branches do not successfully return the initial
    value -ENODEV of 'err', but return 0.
    
    In addition, when kzalloc() fails, -ENOMEM should be returned instead of
    -ENODEV.
    
    Fixes: f1f537c2e7f5 ("staging: unisys: visorbus: Consolidate controlvm channel creation.")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Link: https://lore.kernel.org/r/20210528082614.9337-1-thunder.leizhen@huawei.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/visorbus/visorchipset.c b/drivers/visorbus/visorchipset.c
index cb1eb7e05f87..5668cad86e37 100644
--- a/drivers/visorbus/visorchipset.c
+++ b/drivers/visorbus/visorchipset.c
@@ -1561,7 +1561,7 @@ static void controlvm_periodic_work(struct work_struct *work)
 
 static int visorchipset_init(struct acpi_device *acpi_device)
 {
-	int err = -ENODEV;
+	int err = -ENOMEM;
 	struct visorchannel *controlvm_channel;
 
 	chipset_dev = kzalloc(sizeof(*chipset_dev), GFP_KERNEL);
@@ -1584,8 +1584,10 @@ static int visorchipset_init(struct acpi_device *acpi_device)
 				 "controlvm",
 				 sizeof(struct visor_controlvm_channel),
 				 VISOR_CONTROLVM_CHANNEL_VERSIONID,
-				 VISOR_CHANNEL_SIGNATURE))
+				 VISOR_CHANNEL_SIGNATURE)) {
+		err = -ENODEV;
 		goto error_delete_groups;
+	}
 	/* if booting in a crash kernel */
 	if (is_kdump_kernel())
 		INIT_DELAYED_WORK(&chipset_dev->periodic_controlvm_work,

commit d815623864fa979a76eab47deb245ebdaf234b65
Author: Joachim Fenkes <FENKES@de.ibm.com>
Date:   Fri Jul 24 16:45:18 2020 +0930

    fsi/sbefifo: Fix reset timeout
    
    [ Upstream commit 9ab1428dfe2c66b51e0b41337cd0164da0ab6080 ]
    
    On BMCs with lower timer resolution than 1ms, msleep(1) will take
    way longer than 1ms, so looping 10k times won't wait for 10s but
    significantly longer.
    
    Fix this by using jiffies like the rest of the code.
    
    Fixes: 9f4a8a2d7f9d ("fsi/sbefifo: Add driver for the SBE FIFO")
    Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com>
    Link: https://lore.kernel.org/r/20200724071518.430515-3-joel@jms.id.au
    Signed-off-by: Joel Stanley <joel@jms.id.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/fsi/fsi-sbefifo.c b/drivers/fsi/fsi-sbefifo.c
index b43c2d424d00..ace42cd2915e 100644
--- a/drivers/fsi/fsi-sbefifo.c
+++ b/drivers/fsi/fsi-sbefifo.c
@@ -325,7 +325,8 @@ static int sbefifo_up_write(struct sbefifo *sbefifo, __be32 word)
 static int sbefifo_request_reset(struct sbefifo *sbefifo)
 {
 	struct device *dev = &sbefifo->fsi_dev->dev;
-	u32 status, timeout;
+	unsigned long end_time;
+	u32 status;
 	int rc;
 
 	dev_dbg(dev, "Requesting FIFO reset\n");
@@ -341,7 +342,8 @@ static int sbefifo_request_reset(struct sbefifo *sbefifo)
 	}
 
 	/* Wait for it to complete */
-	for (timeout = 0; timeout < SBEFIFO_RESET_TIMEOUT; timeout++) {
+	end_time = jiffies + msecs_to_jiffies(SBEFIFO_RESET_TIMEOUT);
+	while (!time_after(jiffies, end_time)) {
 		rc = sbefifo_regr(sbefifo, SBEFIFO_UP | SBEFIFO_STS, &status);
 		if (rc) {
 			dev_err(dev, "Failed to read UP fifo status during reset"
@@ -355,7 +357,7 @@ static int sbefifo_request_reset(struct sbefifo *sbefifo)
 			return 0;
 		}
 
-		msleep(1);
+		cond_resched();
 	}
 	dev_err(dev, "FIFO reset timed out\n");
 

commit 170674a2bead4c3e5148e6b5d0741262c3f5d028
Author: Joachim Fenkes <FENKES@de.ibm.com>
Date:   Fri Jul 24 16:45:17 2020 +0930

    fsi/sbefifo: Clean up correct FIFO when receiving reset request from SBE
    
    [ Upstream commit 95152433e46fdb36652ebdbea442356a16ae1fa6 ]
    
    When the SBE requests a reset via the down FIFO, that is also the
    FIFO we should go and reset ;)
    
    Fixes: 9f4a8a2d7f9d ("fsi/sbefifo: Add driver for the SBE FIFO")
    Signed-off-by: Joachim Fenkes <FENKES@de.ibm.com>
    Signed-off-by: Joel Stanley <joel@jms.id.au>
    Link: https://lore.kernel.org/r/20200724071518.430515-2-joel@jms.id.au
    Signed-off-by: Joel Stanley <joel@jms.id.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/fsi/fsi-sbefifo.c b/drivers/fsi/fsi-sbefifo.c
index 9fa3959e0855..b43c2d424d00 100644
--- a/drivers/fsi/fsi-sbefifo.c
+++ b/drivers/fsi/fsi-sbefifo.c
@@ -400,7 +400,7 @@ static int sbefifo_cleanup_hw(struct sbefifo *sbefifo)
 	/* The FIFO already contains a reset request from the SBE ? */
 	if (down_status & SBEFIFO_STS_RESET_REQ) {
 		dev_info(dev, "Cleanup: FIFO reset request set, resetting\n");
-		rc = sbefifo_regw(sbefifo, SBEFIFO_UP, SBEFIFO_PERFORM_RESET);
+		rc = sbefifo_regw(sbefifo, SBEFIFO_DOWN, SBEFIFO_PERFORM_RESET);
 		if (rc) {
 			sbefifo->broken = true;
 			dev_err(dev, "Cleanup: Reset reg write failed, rc=%d\n", rc);

commit 9dda322a4c6b5f2f26af72f3da8d8c31b137b88b
Author: Eddie James <eajames@linux.ibm.com>
Date:   Mon Mar 29 10:13:44 2021 -0500

    fsi: scom: Reset the FSI2PIB engine for any error
    
    [ Upstream commit a5c317dac5567206ca7b6bc9d008dd6890c8bced ]
    
    The error bits in the FSI2PIB status are only cleared by a reset. So
    the driver needs to perform a reset after seeing any of the FSI2PIB
    errors, otherwise subsequent operations will also look like failures.
    
    Fixes: 6b293258cded ("fsi: scom: Major overhaul")
    Signed-off-by: Eddie James <eajames@linux.ibm.com>
    Reviewed-by: Joel Stanley <joel@jms.id.au>
    Link: https://lore.kernel.org/r/20210329151344.14246-1-eajames@linux.ibm.com
    Signed-off-by: Joel Stanley <joel@jms.id.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/fsi/fsi-scom.c b/drivers/fsi/fsi-scom.c
index fdc0e458dbaa..6a48b3144410 100644
--- a/drivers/fsi/fsi-scom.c
+++ b/drivers/fsi/fsi-scom.c
@@ -47,9 +47,10 @@
 #define SCOM_STATUS_PIB_RESP_MASK	0x00007000
 #define SCOM_STATUS_PIB_RESP_SHIFT	12
 
-#define SCOM_STATUS_ANY_ERR		(SCOM_STATUS_PROTECTION | \
-					 SCOM_STATUS_PARITY |	  \
-					 SCOM_STATUS_PIB_ABORT | \
+#define SCOM_STATUS_FSI2PIB_ERROR	(SCOM_STATUS_PROTECTION |	\
+					 SCOM_STATUS_PARITY |		\
+					 SCOM_STATUS_PIB_ABORT)
+#define SCOM_STATUS_ANY_ERR		(SCOM_STATUS_FSI2PIB_ERROR |	\
 					 SCOM_STATUS_PIB_RESP_MASK)
 /* SCOM address encodings */
 #define XSCOM_ADDR_IND_FLAG		BIT_ULL(63)
@@ -249,13 +250,14 @@ static int handle_fsi2pib_status(struct scom_device *scom, uint32_t status)
 {
 	uint32_t dummy = -1;
 
-	if (status & SCOM_STATUS_PROTECTION)
-		return -EPERM;
-	if (status & SCOM_STATUS_PARITY) {
+	if (status & SCOM_STATUS_FSI2PIB_ERROR)
 		fsi_device_write(scom->fsi_dev, SCOM_FSI2PIB_RESET_REG, &dummy,
 				 sizeof(uint32_t));
+
+	if (status & SCOM_STATUS_PROTECTION)
+		return -EPERM;
+	if (status & SCOM_STATUS_PARITY)
 		return -EIO;
-	}
 	/* Return -EBUSY on PIB abort to force a retry */
 	if (status & SCOM_STATUS_PIB_ABORT)
 		return -EBUSY;

commit d2937821a8ea8b78ea57693e50f7cf78333657d4
Author: Colin Ian King <colin.king@canonical.com>
Date:   Thu Jun 3 13:28:12 2021 +0100

    fsi: core: Fix return of error values on failures
    
    [ Upstream commit 910810945707fe9877ca86a0dca4e585fd05e37b ]
    
    Currently the cfam_read and cfam_write functions return the provided
    number of bytes given in the count parameter and not the error return
    code in variable rc, hence all failures of read/writes are being
    silently ignored. Fix this by returning the error code in rc.
    
    Addresses-Coverity: ("Unused value")
    Fixes: d1dcd6782576 ("fsi: Add cfam char devices")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Reviewed-by: Jeremy Kerr <jk@ozlabs.org>
    Link: https://lore.kernel.org/r/20210603122812.83587-1-colin.king@canonical.com
    Signed-off-by: Joel Stanley <joel@jms.id.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/fsi/fsi-core.c b/drivers/fsi/fsi-core.c
index bd62236d3f97..5b4ca6142270 100644
--- a/drivers/fsi/fsi-core.c
+++ b/drivers/fsi/fsi-core.c
@@ -726,7 +726,7 @@ static ssize_t cfam_read(struct file *filep, char __user *buf, size_t count,
 	rc = count;
  fail:
 	*offset = off;
-	return count;
+	return rc;
 }
 
 static ssize_t cfam_write(struct file *filep, const char __user *buf,
@@ -763,7 +763,7 @@ static ssize_t cfam_write(struct file *filep, const char __user *buf,
 	rc = count;
  fail:
 	*offset = off;
-	return count;
+	return rc;
 }
 
 static loff_t cfam_llseek(struct file *file, loff_t offset, int whence)

commit b71c5f0c2f21676d13c19a737c8423d764df4ab1
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Sat May 29 16:48:57 2021 -0700

    scsi: FlashPoint: Rename si_flags field
    
    [ Upstream commit 4d431153e751caa93f3b7e6f6313446974e92253 ]
    
    The BusLogic driver has build errors on ia64 due to a name collision (in
    the #included FlashPoint.c file). Rename the struct field in struct
    sccb_mgr_info from si_flags to si_mflags (manager flags) to mend the build.
    
    This is the first problem. There are 50+ others after this one:
    
    In file included from ../include/uapi/linux/signal.h:6,
                     from ../include/linux/signal_types.h:10,
                     from ../include/linux/sched.h:29,
                     from ../include/linux/hardirq.h:9,
                     from ../include/linux/interrupt.h:11,
                     from ../drivers/scsi/BusLogic.c:27:
    ../arch/ia64/include/uapi/asm/siginfo.h:15:27: error: expected ':', ',', ';', '}' or '__attribute__' before '.' token
       15 | #define si_flags _sifields._sigfault._flags
          |                           ^
    ../drivers/scsi/FlashPoint.c:43:6: note: in expansion of macro 'si_flags'
       43 |  u16 si_flags;
          |      ^~~~~~~~
    In file included from ../drivers/scsi/BusLogic.c:51:
    ../drivers/scsi/FlashPoint.c: In function 'FlashPoint_ProbeHostAdapter':
    ../drivers/scsi/FlashPoint.c:1076:11: error: 'struct sccb_mgr_info' has no member named '_sifields'
     1076 |  pCardInfo->si_flags = 0x0000;
          |           ^~
    ../drivers/scsi/FlashPoint.c:1079:12: error: 'struct sccb_mgr_info' has no member named '_sifields'
    
    Link: https://lore.kernel.org/r/20210529234857.6870-1-rdunlap@infradead.org
    Fixes: 391e2f25601e ("[SCSI] BusLogic: Port driver to 64-bit.")
    Cc: "James E.J. Bottomley" <jejb@linux.ibm.com>
    Cc: "Martin K. Petersen" <martin.petersen@oracle.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: Hannes Reinecke <hare@suse.de>
    Cc: Khalid Aziz <khalid.aziz@oracle.com>
    Cc: Khalid Aziz <khalid@gonehiking.org>
    Reported-by: kernel test robot <lkp@intel.com>
    Reviewed-by: Hannes Reinecke <hare@suse.de>
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/FlashPoint.c b/drivers/scsi/FlashPoint.c
index 867b864f5047..4bca37d52bad 100644
--- a/drivers/scsi/FlashPoint.c
+++ b/drivers/scsi/FlashPoint.c
@@ -40,7 +40,7 @@ struct sccb_mgr_info {
 	u16 si_per_targ_ultra_nego;
 	u16 si_per_targ_no_disc;
 	u16 si_per_targ_wide_nego;
-	u16 si_flags;
+	u16 si_mflags;
 	unsigned char si_card_family;
 	unsigned char si_bustype;
 	unsigned char si_card_model[3];
@@ -1070,22 +1070,22 @@ static int FlashPoint_ProbeHostAdapter(struct sccb_mgr_info *pCardInfo)
 		ScamFlg =
 		    (unsigned char)FPT_utilEERead(ioport, SCAM_CONFIG / 2);
 
-	pCardInfo->si_flags = 0x0000;
+	pCardInfo->si_mflags = 0x0000;
 
 	if (i & 0x01)
-		pCardInfo->si_flags |= SCSI_PARITY_ENA;
+		pCardInfo->si_mflags |= SCSI_PARITY_ENA;
 
 	if (!(i & 0x02))
-		pCardInfo->si_flags |= SOFT_RESET;
+		pCardInfo->si_mflags |= SOFT_RESET;
 
 	if (i & 0x10)
-		pCardInfo->si_flags |= EXTENDED_TRANSLATION;
+		pCardInfo->si_mflags |= EXTENDED_TRANSLATION;
 
 	if (ScamFlg & SCAM_ENABLED)
-		pCardInfo->si_flags |= FLAG_SCAM_ENABLED;
+		pCardInfo->si_mflags |= FLAG_SCAM_ENABLED;
 
 	if (ScamFlg & SCAM_LEVEL2)
-		pCardInfo->si_flags |= FLAG_SCAM_LEVEL2;
+		pCardInfo->si_mflags |= FLAG_SCAM_LEVEL2;
 
 	j = (RD_HARPOON(ioport + hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
 	if (i & 0x04) {
@@ -1101,7 +1101,7 @@ static int FlashPoint_ProbeHostAdapter(struct sccb_mgr_info *pCardInfo)
 
 	if (!(RD_HARPOON(ioport + hp_page_ctrl) & NARROW_SCSI_CARD))
 
-		pCardInfo->si_flags |= SUPPORT_16TAR_32LUN;
+		pCardInfo->si_mflags |= SUPPORT_16TAR_32LUN;
 
 	pCardInfo->si_card_family = HARPOON_FAMILY;
 	pCardInfo->si_bustype = BUSTYPE_PCI;
@@ -1137,15 +1137,15 @@ static int FlashPoint_ProbeHostAdapter(struct sccb_mgr_info *pCardInfo)
 
 	if (pCardInfo->si_card_model[1] == '3') {
 		if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))
-			pCardInfo->si_flags |= LOW_BYTE_TERM;
+			pCardInfo->si_mflags |= LOW_BYTE_TERM;
 	} else if (pCardInfo->si_card_model[2] == '0') {
 		temp = RD_HARPOON(ioport + hp_xfer_pad);
 		WR_HARPOON(ioport + hp_xfer_pad, (temp & ~BIT(4)));
 		if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))
-			pCardInfo->si_flags |= LOW_BYTE_TERM;
+			pCardInfo->si_mflags |= LOW_BYTE_TERM;
 		WR_HARPOON(ioport + hp_xfer_pad, (temp | BIT(4)));
 		if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))
-			pCardInfo->si_flags |= HIGH_BYTE_TERM;
+			pCardInfo->si_mflags |= HIGH_BYTE_TERM;
 		WR_HARPOON(ioport + hp_xfer_pad, temp);
 	} else {
 		temp = RD_HARPOON(ioport + hp_ee_ctrl);
@@ -1163,9 +1163,9 @@ static int FlashPoint_ProbeHostAdapter(struct sccb_mgr_info *pCardInfo)
 		WR_HARPOON(ioport + hp_ee_ctrl, temp);
 		WR_HARPOON(ioport + hp_xfer_pad, temp2);
 		if (!(temp3 & BIT(7)))
-			pCardInfo->si_flags |= LOW_BYTE_TERM;
+			pCardInfo->si_mflags |= LOW_BYTE_TERM;
 		if (!(temp3 & BIT(6)))
-			pCardInfo->si_flags |= HIGH_BYTE_TERM;
+			pCardInfo->si_mflags |= HIGH_BYTE_TERM;
 	}
 
 	ARAM_ACCESS(ioport);
@@ -1272,7 +1272,7 @@ static void *FlashPoint_HardwareResetHostAdapter(struct sccb_mgr_info
 	WR_HARPOON(ioport + hp_arb_id, pCardInfo->si_id);
 	CurrCard->ourId = pCardInfo->si_id;
 
-	i = (unsigned char)pCardInfo->si_flags;
+	i = (unsigned char)pCardInfo->si_mflags;
 	if (i & SCSI_PARITY_ENA)
 		WR_HARPOON(ioport + hp_portctrl_1, (HOST_MODE8 | CHK_SCSI_P));
 
@@ -1286,14 +1286,14 @@ static void *FlashPoint_HardwareResetHostAdapter(struct sccb_mgr_info
 		j |= SCSI_TERM_ENA_H;
 	WR_HARPOON(ioport + hp_ee_ctrl, j);
 
-	if (!(pCardInfo->si_flags & SOFT_RESET)) {
+	if (!(pCardInfo->si_mflags & SOFT_RESET)) {
 
 		FPT_sresb(ioport, thisCard);
 
 		FPT_scini(thisCard, pCardInfo->si_id, 0);
 	}
 
-	if (pCardInfo->si_flags & POST_ALL_UNDERRRUNS)
+	if (pCardInfo->si_mflags & POST_ALL_UNDERRRUNS)
 		CurrCard->globalFlags |= F_NO_FILTER;
 
 	if (pCurrNvRam) {

commit ffcdf486f380f4e4a7152294c0c9c4fb5fe53d0b
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Tue May 25 20:51:57 2021 +0200

    tty: nozomi: Fix the error handling path of 'nozomi_card_init()'
    
    [ Upstream commit 6ae7d0f5a92b9619f6e3c307ce56b2cefff3f0e9 ]
    
    The error handling path is broken and we may un-register things that have
    never been registered.
    
    Update the loops index accordingly.
    
    Fixes: 9842c38e9176 ("kfifo: fix warn_unused_result")
    Suggested-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Link: https://lore.kernel.org/r/e28c2e92c7475da25b03d022ea2d6dcf1ba807a2.1621968629.git.christophe.jaillet@wanadoo.fr
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/nozomi.c b/drivers/tty/nozomi.c
index 8dde9412a1aa..f291f4b06b68 100644
--- a/drivers/tty/nozomi.c
+++ b/drivers/tty/nozomi.c
@@ -1403,7 +1403,7 @@ static int nozomi_card_init(struct pci_dev *pdev,
 			NOZOMI_NAME, dc);
 	if (unlikely(ret)) {
 		dev_err(&pdev->dev, "can't request irq %d\n", pdev->irq);
-		goto err_free_kfifo;
+		goto err_free_all_kfifo;
 	}
 
 	DBG1("base_addr: %p", dc->base_addr);
@@ -1441,13 +1441,15 @@ static int nozomi_card_init(struct pci_dev *pdev,
 	return 0;
 
 err_free_tty:
-	for (i = 0; i < MAX_PORT; ++i) {
+	for (i--; i >= 0; i--) {
 		tty_unregister_device(ntty_driver, dc->index_start + i);
 		tty_port_destroy(&dc->port[i].port);
 	}
 	free_irq(pdev->irq, dc);
+err_free_all_kfifo:
+	i = MAX_PORT;
 err_free_kfifo:
-	for (i = 0; i < MAX_PORT; i++)
+	for (i--; i >= PORT_MDM; i--)
 		kfifo_free(&dc->port[i].fifo_ul);
 err_free_sbuf:
 	kfree(dc->send_buf);

commit 813790e3d2a0eaa00e0617325b1b670ac6ac39ef
Author: Yu Kuai <yukuai3@huawei.com>
Date:   Fri May 21 20:06:17 2021 +0800

    char: pcmcia: error out if 'num_bytes_read' is greater than 4 in set_protocol()
    
    [ Upstream commit 37188559c610f1b7eec83c8e448936c361c578de ]
    
    Theoretically, it will cause index out of bounds error if
    'num_bytes_read' is greater than 4. As we expect it(and was tested)
    never to be greater than 4, error out if it happens.
    
    Fixes: c1986ee9bea3 ("[PATCH] New Omnikey Cardman 4000 driver")
    Signed-off-by: Yu Kuai <yukuai3@huawei.com>
    Link: https://lore.kernel.org/r/20210521120617.138396-1-yukuai3@huawei.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/char/pcmcia/cm4000_cs.c b/drivers/char/pcmcia/cm4000_cs.c
index a219964cb770..cdc72db29ae0 100644
--- a/drivers/char/pcmcia/cm4000_cs.c
+++ b/drivers/char/pcmcia/cm4000_cs.c
@@ -544,6 +544,10 @@ static int set_protocol(struct cm4000_dev *dev, struct ptsreq *ptsreq)
 		io_read_num_rec_bytes(iobase, &num_bytes_read);
 		if (num_bytes_read >= 4) {
 			DEBUGP(2, dev, "NumRecBytes = %i\n", num_bytes_read);
+			if (num_bytes_read > 4) {
+				rc = -EIO;
+				goto exit_setprotocol;
+			}
 			break;
 		}
 		mdelay(10);

commit 61375cb1115948165697945ab2dd290caf72be8e
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Mon May 24 11:52:42 2021 -0700

    Input: hil_kbd - fix error return code in hil_dev_connect()
    
    [ Upstream commit d9b576917a1d0efa293801a264150a1b37691617 ]
    
    Return error code -EINVAL rather than '0' when the combo devices are not
    supported.
    
    Fixes: fa71c605c2bb ("Input: combine hil_kbd and hil_ptr drivers")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Link: https://lore.kernel.org/r/20210515030053.6824-1-thunder.leizhen@huawei.com
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/input/keyboard/hil_kbd.c b/drivers/input/keyboard/hil_kbd.c
index bb29a7c9a1c0..54afb38601b9 100644
--- a/drivers/input/keyboard/hil_kbd.c
+++ b/drivers/input/keyboard/hil_kbd.c
@@ -512,6 +512,7 @@ static int hil_dev_connect(struct serio *serio, struct serio_driver *drv)
 		    HIL_IDD_NUM_AXES_PER_SET(*idd)) {
 			printk(KERN_INFO PREFIX
 				"combo devices are not supported.\n");
+			error = -EINVAL;
 			goto bail1;
 		}
 

commit b52a9dec111c2416278a445785b98974aa55fabe
Author: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Date:   Mon May 24 15:12:09 2021 +0900

    ASoC: rsnd: tidyup loop on rsnd_adg_clk_query()
    
    [ Upstream commit cf9d5c6619fadfc41cf8f5154cb990cc38e3da85 ]
    
    commit 06e8f5c842f2d ("ASoC: rsnd: don't call clk_get_rate() under
    atomic context") used saved clk_rate, thus for_each_rsnd_clk()
    is no longer needed. This patch fixes it.
    
    Fixes: 06e8f5c842f2d ("ASoC: rsnd: don't call clk_get_rate() under atomic context")
    Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
    Link: https://lore.kernel.org/r/87v978oe2u.wl-kuninori.morimoto.gx@renesas.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c
index 549a137878a6..dc08260031ee 100644
--- a/sound/soc/sh/rcar/adg.c
+++ b/sound/soc/sh/rcar/adg.c
@@ -318,7 +318,6 @@ static void rsnd_adg_set_ssi_clk(struct rsnd_mod *ssi_mod, u32 val)
 int rsnd_adg_clk_query(struct rsnd_priv *priv, unsigned int rate)
 {
 	struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
-	struct clk *clk;
 	int i;
 	int sel_table[] = {
 		[CLKA] = 0x1,
@@ -331,10 +330,9 @@ int rsnd_adg_clk_query(struct rsnd_priv *priv, unsigned int rate)
 	 * find suitable clock from
 	 * AUDIO_CLKA/AUDIO_CLKB/AUDIO_CLKC/AUDIO_CLKI.
 	 */
-	for_each_rsnd_clk(clk, adg, i) {
+	for (i = 0; i < CLKMAX; i++)
 		if (rate == adg->clk_rate[i])
 			return sel_table[i];
-	}
 
 	/*
 	 * find divided clock from BRGA/BRGB

commit e784b66299dd9fa764d4969ca987493e14597534
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Tue May 18 12:45:14 2021 +0800

    ASoC: hisilicon: fix missing clk_disable_unprepare() on error in hi6210_i2s_startup()
    
    [ Upstream commit 375904e3931955fcf0a847f029b2492a117efc43 ]
    
    After calling clk_prepare_enable(), clk_disable_unprepare() need
    be called when calling clk_set_rate() failed.
    
    Fixes: 0bf750f4cbe1 ("ASoC: hisilicon: Add hi6210 i2s audio driver")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Link: https://lore.kernel.org/r/20210518044514.607010-1-yangyingliang@huawei.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/hisilicon/hi6210-i2s.c b/sound/soc/hisilicon/hi6210-i2s.c
index 53344a3b7a60..864718ef874f 100644
--- a/sound/soc/hisilicon/hi6210-i2s.c
+++ b/sound/soc/hisilicon/hi6210-i2s.c
@@ -110,18 +110,15 @@ static int hi6210_i2s_startup(struct snd_pcm_substream *substream,
 
 	for (n = 0; n < i2s->clocks; n++) {
 		ret = clk_prepare_enable(i2s->clk[n]);
-		if (ret) {
-			while (n--)
-				clk_disable_unprepare(i2s->clk[n]);
-			return ret;
-		}
+		if (ret)
+			goto err_unprepare_clk;
 	}
 
 	ret = clk_set_rate(i2s->clk[CLK_I2S_BASE], 49152000);
 	if (ret) {
 		dev_err(i2s->dev, "%s: setting 49.152MHz base rate failed %d\n",
 			__func__, ret);
-		return ret;
+		goto err_unprepare_clk;
 	}
 
 	/* enable clock before frequency division */
@@ -173,6 +170,11 @@ static int hi6210_i2s_startup(struct snd_pcm_substream *substream,
 	hi6210_write_reg(i2s, HII2S_SW_RST_N, val);
 
 	return 0;
+
+err_unprepare_clk:
+	while (n--)
+		clk_disable_unprepare(i2s->clk[n]);
+	return ret;
 }
 
 static void hi6210_i2s_shutdown(struct snd_pcm_substream *substream,

commit 51ef21934d1cc8e8af434a3d8429baeb41a4a91f
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sat May 1 18:13:48 2021 +0100

    iio: potentiostat: lmp91000: Fix alignment of buffer in iio_push_to_buffers_with_timestamp()
    
    [ Upstream commit 8979b67ec61abc232636400ee8c758a16a73c95f ]
    
    Add __aligned(8) to ensure the buffer passed to
    iio_push_to_buffers_with_timestamp() is suitable for the naturally
    aligned timestamp that will be inserted.
    
    Here structure is not used, because this buffer is also used
    elsewhere in the driver.
    
    Fixes: 67e17300dc1d ("iio: potentiostat: add LMP91000 support")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Cc: Matt Ranostay <matt.ranostay@konsulko.com>
    Acked-by: Matt Ranostay <matt.ranostay@konsulko.com>
    Link: https://lore.kernel.org/r/20210501171352.512953-8-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/potentiostat/lmp91000.c b/drivers/iio/potentiostat/lmp91000.c
index 90e895adf997..68f4f6fa27da 100644
--- a/drivers/iio/potentiostat/lmp91000.c
+++ b/drivers/iio/potentiostat/lmp91000.c
@@ -71,8 +71,8 @@ struct lmp91000_data {
 
 	struct completion completion;
 	u8 chan_select;
-
-	u32 buffer[4]; /* 64-bit data + 64-bit timestamp */
+	/* 64-bit data + 64-bit naturally aligned timestamp */
+	u32 buffer[4] __aligned(8);
 };
 
 static const struct iio_chan_spec lmp91000_channels[] = {

commit f3a5bf2b0bf9062b8ac35de522776da85e6a5622
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sat May 1 18:01:21 2021 +0100

    iio: light: tcs3472: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
    
    [ Upstream commit df2f37cffd6ed486d613e7ee22aadc8e49ae2dd3 ]
    
    To make code more readable, use a structure to express the channel
    layout and ensure the timestamp is 8 byte aligned.
    
    Found during an audit of all calls of uses of
    iio_push_to_buffers_with_timestamp().
    
    Fixes tag is not strictly accurate as prior to that patch there was
    potentially an unaligned write.  However, any backport past there will
    need to be done manually.
    
    Fixes: 0624bf847dd0 ("iio:tcs3472: Use iio_push_to_buffers_with_timestamp()")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Link: https://lore.kernel.org/r/20210501170121.512209-20-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/light/tcs3472.c b/drivers/iio/light/tcs3472.c
index 1995cc5cd732..82204414c7a1 100644
--- a/drivers/iio/light/tcs3472.c
+++ b/drivers/iio/light/tcs3472.c
@@ -67,7 +67,11 @@ struct tcs3472_data {
 	u8 control;
 	u8 atime;
 	u8 apers;
-	u16 buffer[8]; /* 4 16-bit channels + 64-bit timestamp */
+	/* Ensure timestamp is naturally aligned */
+	struct {
+		u16 chans[4];
+		s64 timestamp __aligned(8);
+	} scan;
 };
 
 static const struct iio_event_spec tcs3472_events[] = {
@@ -389,10 +393,10 @@ static irqreturn_t tcs3472_trigger_handler(int irq, void *p)
 		if (ret < 0)
 			goto done;
 
-		data->buffer[j++] = ret;
+		data->scan.chans[j++] = ret;
 	}
 
-	iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
+	iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
 		iio_get_time_ns(indio_dev));
 
 done:

commit 2a11f9d098e92eb34144eba62aeead67ba47849b
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sat May 1 18:01:20 2021 +0100

    iio: light: tcs3414: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
    
    [ Upstream commit ff08fbc22ab32ccc6690c21b0e5e1d402dcc076f ]
    
    To make code more readable, use a structure to express the channel
    layout and ensure the timestamp is 8 byte aligned.
    
    Found during an audit of all calls of uses of
    iio_push_to_buffers_with_timestamp()
    
    Fixes: a244e7b57f0f ("iio: Add driver for AMS/TAOS tcs3414 digital color sensor")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Link: https://lore.kernel.org/r/20210501170121.512209-19-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/light/tcs3414.c b/drivers/iio/light/tcs3414.c
index 205e5659ce6b..c525420e7c62 100644
--- a/drivers/iio/light/tcs3414.c
+++ b/drivers/iio/light/tcs3414.c
@@ -56,7 +56,11 @@ struct tcs3414_data {
 	u8 control;
 	u8 gain;
 	u8 timing;
-	u16 buffer[8]; /* 4x 16-bit + 8 bytes timestamp */
+	/* Ensure timestamp is naturally aligned */
+	struct {
+		u16 chans[4];
+		s64 timestamp __aligned(8);
+	} scan;
 };
 
 #define TCS3414_CHANNEL(_color, _si, _addr) { \
@@ -212,10 +216,10 @@ static irqreturn_t tcs3414_trigger_handler(int irq, void *p)
 		if (ret < 0)
 			goto done;
 
-		data->buffer[j++] = ret;
+		data->scan.chans[j++] = ret;
 	}
 
-	iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
+	iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
 		iio_get_time_ns(indio_dev));
 
 done:

commit 8111e6295f59e9d58fc4ae03b1156b30438296cc
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sat May 1 18:01:19 2021 +0100

    iio: light: isl29125: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
    
    [ Upstream commit 3d4725194de6935dba2ad7c9cc075c885008f747 ]
    
    To make code more readable, use a structure to express the channel
    layout and ensure the timestamp is 8 byte aligned.
    
    Found during an audit of all calls of uses of
    iio_push_to_buffers_with_timestamp()
    
    Fixes: 6c25539cbc46 ("iio: Add Intersil isl29125 digital color light sensor driver")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Link: https://lore.kernel.org/r/20210501170121.512209-18-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/light/isl29125.c b/drivers/iio/light/isl29125.c
index ed38edcd5efe..d0f5fd42c0ec 100644
--- a/drivers/iio/light/isl29125.c
+++ b/drivers/iio/light/isl29125.c
@@ -54,7 +54,11 @@
 struct isl29125_data {
 	struct i2c_client *client;
 	u8 conf1;
-	u16 buffer[8]; /* 3x 16-bit, padding, 8 bytes timestamp */
+	/* Ensure timestamp is naturally aligned */
+	struct {
+		u16 chans[3];
+		s64 timestamp __aligned(8);
+	} scan;
 };
 
 #define ISL29125_CHANNEL(_color, _si) { \
@@ -187,10 +191,10 @@ static irqreturn_t isl29125_trigger_handler(int irq, void *p)
 		if (ret < 0)
 			goto done;
 
-		data->buffer[j++] = ret;
+		data->scan.chans[j++] = ret;
 	}
 
-	iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
+	iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
 		iio_get_time_ns(indio_dev));
 
 done:

commit b27970a4e01803ab76181d7dd0069148d55469fa
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sat May 1 18:01:16 2021 +0100

    iio: prox: as3935: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
    
    [ Upstream commit 37eb8d8c64f2ecb3a5521ba1cc1fad973adfae41 ]
    
    To make code more readable, use a structure to express the channel
    layout and ensure the timestamp is 8 byte aligned.
    
    Found during an audit of all calls of uses of
    iio_push_to_buffers_with_timestamp()
    
    Fixes: 37b1ba2c68cf ("iio: proximity: as3935: fix buffer stack trashing")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Cc: Matt Ranostay <matt.ranostay@konsulko.com>
    Acked-by: Matt Ranostay <matt.ranostay@konsulko.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Link: https://lore.kernel.org/r/20210501170121.512209-15-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/proximity/as3935.c b/drivers/iio/proximity/as3935.c
index f130388a16a0..9069eec46093 100644
--- a/drivers/iio/proximity/as3935.c
+++ b/drivers/iio/proximity/as3935.c
@@ -61,7 +61,11 @@ struct as3935_state {
 	unsigned long noise_tripped;
 	u32 tune_cap;
 	u32 nflwdth_reg;
-	u8 buffer[16]; /* 8-bit data + 56-bit padding + 64-bit timestamp */
+	/* Ensure timestamp is naturally aligned */
+	struct {
+		u8 chan;
+		s64 timestamp __aligned(8);
+	} scan;
 	u8 buf[2] ____cacheline_aligned;
 };
 
@@ -227,8 +231,8 @@ static irqreturn_t as3935_trigger_handler(int irq, void *private)
 	if (ret)
 		goto err_read;
 
-	st->buffer[0] = val & AS3935_DATA_MASK;
-	iio_push_to_buffers_with_timestamp(indio_dev, &st->buffer,
+	st->scan.chan = val & AS3935_DATA_MASK;
+	iio_push_to_buffers_with_timestamp(indio_dev, &st->scan,
 					   iio_get_time_ns(indio_dev));
 err_read:
 	iio_trigger_notify_done(indio_dev->trig);

commit 9f98de0e407699ad9b7c7ee733525c787800ae5b
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sat May 1 18:01:15 2021 +0100

    iio: prox: pulsed-light: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
    
    [ Upstream commit 679cc377a03ff1944491eafc7355c1eb1fad4109 ]
    
    To make code more readable, use a structure to express the channel
    layout and ensure the timestamp is 8 byte aligned.
    
    Found during an audit of all calls of uses of
    iio_push_to_buffers_with_timestamp()
    
    Fixes: cb119d535083 ("iio: proximity: add support for PulsedLight LIDAR")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Cc: Matt Ranostay <matt.ranostay@konsulko.com>
    Acked-by: Matt Ranostay <matt.ranostay@konsulko.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Link: https://lore.kernel.org/r/20210501170121.512209-14-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c b/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
index 67f85268b63d..0c7617022407 100644
--- a/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
+++ b/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
@@ -43,7 +43,11 @@ struct lidar_data {
 	int (*xfer)(struct lidar_data *data, u8 reg, u8 *val, int len);
 	int i2c_enabled;
 
-	u16 buffer[8]; /* 2 byte distance + 8 byte timestamp */
+	/* Ensure timestamp is naturally aligned */
+	struct {
+		u16 chan;
+		s64 timestamp __aligned(8);
+	} scan;
 };
 
 static const struct iio_chan_spec lidar_channels[] = {
@@ -228,9 +232,9 @@ static irqreturn_t lidar_trigger_handler(int irq, void *private)
 	struct lidar_data *data = iio_priv(indio_dev);
 	int ret;
 
-	ret = lidar_get_measurement(data, data->buffer);
+	ret = lidar_get_measurement(data, &data->scan.chan);
 	if (!ret) {
-		iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
+		iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
 						   iio_get_time_ns(indio_dev));
 	} else if (ret != -EINVAL) {
 		dev_err(&data->client->dev, "cannot read LIDAR measurement");

commit 0fc539968b28b956df24bc209cdabac00886d46c
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sat May 1 18:01:14 2021 +0100

    iio: prox: srf08: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
    
    [ Upstream commit 19f1a254fe4949fff1e67db386409f48cf438bd7 ]
    
    To make code more readable, use a structure to express the channel
    layout and ensure the timestamp is 8 byte aligned.
    
    Found during an audit of all calls of uses of
    iio_push_to_buffers_with_timestamp()
    
    Fixes: 78f839029e1d ("iio: distance: srf08: add IIO driver for us ranger")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Cc: Andreas Klinger <ak@it-klinger.de>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Link: https://lore.kernel.org/r/20210501170121.512209-13-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/proximity/srf08.c b/drivers/iio/proximity/srf08.c
index f2bf783f829a..5e8d3707738b 100644
--- a/drivers/iio/proximity/srf08.c
+++ b/drivers/iio/proximity/srf08.c
@@ -66,11 +66,11 @@ struct srf08_data {
 	int			range_mm;
 	struct mutex		lock;
 
-	/*
-	 * triggered buffer
-	 * 1x16-bit channel + 3x16 padding + 4x16 timestamp
-	 */
-	s16			buffer[8];
+	/* Ensure timestamp is naturally aligned */
+	struct {
+		s16 chan;
+		s64 timestamp __aligned(8);
+	} scan;
 
 	/* Sensor-Type */
 	enum srf08_sensor_type	sensor_type;
@@ -193,9 +193,9 @@ static irqreturn_t srf08_trigger_handler(int irq, void *p)
 
 	mutex_lock(&data->lock);
 
-	data->buffer[0] = sensor_data;
+	data->scan.chan = sensor_data;
 	iio_push_to_buffers_with_timestamp(indio_dev,
-						data->buffer, pf->timestamp);
+					   &data->scan, pf->timestamp);
 
 	mutex_unlock(&data->lock);
 err:

commit 578a2530ef2b2bf3e98ae0bfcabf2dd7b59913c6
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sat May 1 18:01:13 2021 +0100

    iio: humidity: am2315: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
    
    [ Upstream commit f4ca2e2595d9fee65d5ce0d218b22ce00e5b2915 ]
    
    To make code more readable, use a structure to express the channel
    layout and ensure the timestamp is 8 byte aligned.
    
    Found during an audit of all calls of uses of
    iio_push_to_buffers_with_timestamp()
    
    Fixes: 0d96d5ead3f7 ("iio: humidity: Add triggered buffer support for AM2315")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Link: https://lore.kernel.org/r/20210501170121.512209-12-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/humidity/am2315.c b/drivers/iio/humidity/am2315.c
index 7d8669dc6547..b09bd0b39c9c 100644
--- a/drivers/iio/humidity/am2315.c
+++ b/drivers/iio/humidity/am2315.c
@@ -36,7 +36,11 @@
 struct am2315_data {
 	struct i2c_client *client;
 	struct mutex lock;
-	s16 buffer[8]; /* 2x16-bit channels + 2x16 padding + 4x16 timestamp */
+	/* Ensure timestamp is naturally aligned */
+	struct {
+		s16 chans[2];
+		s64 timestamp __aligned(8);
+	} scan;
 };
 
 struct am2315_sensor_data {
@@ -170,20 +174,20 @@ static irqreturn_t am2315_trigger_handler(int irq, void *p)
 
 	mutex_lock(&data->lock);
 	if (*(indio_dev->active_scan_mask) == AM2315_ALL_CHANNEL_MASK) {
-		data->buffer[0] = sensor_data.hum_data;
-		data->buffer[1] = sensor_data.temp_data;
+		data->scan.chans[0] = sensor_data.hum_data;
+		data->scan.chans[1] = sensor_data.temp_data;
 	} else {
 		i = 0;
 		for_each_set_bit(bit, indio_dev->active_scan_mask,
 				 indio_dev->masklength) {
-			data->buffer[i] = (bit ? sensor_data.temp_data :
-						 sensor_data.hum_data);
+			data->scan.chans[i] = (bit ? sensor_data.temp_data :
+					       sensor_data.hum_data);
 			i++;
 		}
 	}
 	mutex_unlock(&data->lock);
 
-	iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
+	iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
 					   pf->timestamp);
 err:
 	iio_trigger_notify_done(indio_dev->trig);

commit f7db658caefcf92270c834db7b2126c22ae54109
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sat May 1 18:01:12 2021 +0100

    iio: gyro: bmg160: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
    
    [ Upstream commit 06778d881f3798ce93ffbbbf801234292250b598 ]
    
    To make code more readable, use a structure to express the channel
    layout and ensure the timestamp is 8 byte aligned.
    
    Found during an audit of all calls of uses of
    iio_push_to_buffers_with_timestamp()
    
    Fixes: 13426454b649 ("iio: bmg160: Separate i2c and core driver")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Cc: Stephan Gerhold <stephan@gerhold.net>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Link: https://lore.kernel.org/r/20210501170121.512209-11-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/gyro/bmg160_core.c b/drivers/iio/gyro/bmg160_core.c
index 92c07ab826eb..ef8ef96201f6 100644
--- a/drivers/iio/gyro/bmg160_core.c
+++ b/drivers/iio/gyro/bmg160_core.c
@@ -103,7 +103,11 @@ struct bmg160_data {
 	struct iio_trigger *dready_trig;
 	struct iio_trigger *motion_trig;
 	struct mutex mutex;
-	s16 buffer[8];
+	/* Ensure naturally aligned timestamp */
+	struct {
+		s16 chans[3];
+		s64 timestamp __aligned(8);
+	} scan;
 	u32 dps_range;
 	int ev_enable_state;
 	int slope_thres;
@@ -872,12 +876,12 @@ static irqreturn_t bmg160_trigger_handler(int irq, void *p)
 
 	mutex_lock(&data->mutex);
 	ret = regmap_bulk_read(data->regmap, BMG160_REG_XOUT_L,
-			       data->buffer, AXIS_MAX * 2);
+			       data->scan.chans, AXIS_MAX * 2);
 	mutex_unlock(&data->mutex);
 	if (ret < 0)
 		goto err;
 
-	iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
+	iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
 					   pf->timestamp);
 err:
 	iio_trigger_notify_done(indio_dev->trig);

commit df848efb61dd2a2886d1c03269e2205d269cee72
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sat May 1 18:01:11 2021 +0100

    iio: adc: vf610: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
    
    [ Upstream commit 7765dfaa22ea08abf0c175e7553826ba2a939632 ]
    
    To make code more readable, use a structure to express the channel
    layout and ensure the timestamp is 8 byte aligned.
    
    Found during an audit of all calls of uses of
    iio_push_to_buffers_with_timestamp()
    
    Fixes: 0010d6b44406 ("iio: adc: vf610: Add IIO buffer support for Vybrid ADC")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Cc: Stefan-Gabriel Mirea <stefan-gabriel.mirea@nxp.com>
    Cc: Sanchayan Maity <maitysanchayan@gmail.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Link: https://lore.kernel.org/r/20210501170121.512209-10-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/adc/vf610_adc.c b/drivers/iio/adc/vf610_adc.c
index bbcb7a4d7edf..3e480244ad9a 100644
--- a/drivers/iio/adc/vf610_adc.c
+++ b/drivers/iio/adc/vf610_adc.c
@@ -180,7 +180,11 @@ struct vf610_adc {
 	u32 sample_freq_avail[5];
 
 	struct completion completion;
-	u16 buffer[8];
+	/* Ensure the timestamp is naturally aligned */
+	struct {
+		u16 chan;
+		s64 timestamp __aligned(8);
+	} scan;
 };
 
 static const u32 vf610_hw_avgs[] = { 1, 4, 8, 16, 32 };
@@ -592,9 +596,9 @@ static irqreturn_t vf610_adc_isr(int irq, void *dev_id)
 	if (coco & VF610_ADC_HS_COCO0) {
 		info->value = vf610_adc_read_data(info);
 		if (iio_buffer_enabled(indio_dev)) {
-			info->buffer[0] = info->value;
+			info->scan.chan = info->value;
 			iio_push_to_buffers_with_timestamp(indio_dev,
-					info->buffer,
+					&info->scan,
 					iio_get_time_ns(indio_dev));
 			iio_trigger_notify_done(indio_dev->trig);
 		} else

commit b0d27f41be7bd2b9ffd775cec91aff906bfbfcb8
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sat May 1 18:01:10 2021 +0100

    iio: adc: ti-ads1015: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
    
    [ Upstream commit d85d71dd1ab67eaa7351f69fec512d8f09d164e1 ]
    
    To make code more readable, use a structure to express the channel
    layout and ensure the timestamp is 8 byte aligned.
    
    Found during an audit of all calls of this function.
    
    Fixes: ecc24e72f437 ("iio: adc: Add TI ADS1015 ADC driver support")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Cc: Daniel Baluta <daniel.baluta@nxp.com>
    Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Link: https://lore.kernel.org/r/20210501170121.512209-9-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
index dc8d859e4b92..b1cccc3eeea6 100644
--- a/drivers/iio/adc/ti-ads1015.c
+++ b/drivers/iio/adc/ti-ads1015.c
@@ -391,10 +391,14 @@ static irqreturn_t ads1015_trigger_handler(int irq, void *p)
 	struct iio_poll_func *pf = p;
 	struct iio_dev *indio_dev = pf->indio_dev;
 	struct ads1015_data *data = iio_priv(indio_dev);
-	s16 buf[8]; /* 1x s16 ADC val + 3x s16 padding +  4x s16 timestamp */
+	/* Ensure natural alignment of timestamp */
+	struct {
+		s16 chan;
+		s64 timestamp __aligned(8);
+	} scan;
 	int chan, ret, res;
 
-	memset(buf, 0, sizeof(buf));
+	memset(&scan, 0, sizeof(scan));
 
 	mutex_lock(&data->lock);
 	chan = find_first_bit(indio_dev->active_scan_mask,
@@ -405,10 +409,10 @@ static irqreturn_t ads1015_trigger_handler(int irq, void *p)
 		goto err;
 	}
 
-	buf[0] = res;
+	scan.chan = res;
 	mutex_unlock(&data->lock);
 
-	iio_push_to_buffers_with_timestamp(indio_dev, buf,
+	iio_push_to_buffers_with_timestamp(indio_dev, &scan,
 					   iio_get_time_ns(indio_dev));
 
 err:

commit 3ffec10f9bd0c91a3c5dbbe2ad3b371c8013dfd3
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sat May 1 18:01:09 2021 +0100

    iio: accel: stk8ba50: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
    
    [ Upstream commit 334883894bc1e145a1e0f5de1b0d1b6a1133f0e6 ]
    
    To make code more readable, use a structure to express the channel
    layout and ensure the timestamp is 8 byte aligned.
    
    Found during an audit of all calls of this function.
    
    Fixes: db6a19b8251f ("iio: accel: Add trigger support for STK8BA50")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Link: https://lore.kernel.org/r/20210501170121.512209-8-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/accel/stk8ba50.c b/drivers/iio/accel/stk8ba50.c
index 576b6b140f08..0d9067d3ccc4 100644
--- a/drivers/iio/accel/stk8ba50.c
+++ b/drivers/iio/accel/stk8ba50.c
@@ -94,12 +94,11 @@ struct stk8ba50_data {
 	u8 sample_rate_idx;
 	struct iio_trigger *dready_trig;
 	bool dready_trigger_on;
-	/*
-	 * 3 x 16-bit channels (10-bit data, 6-bit padding) +
-	 * 1 x 16 padding +
-	 * 4 x 16 64-bit timestamp
-	 */
-	s16 buffer[8];
+	/* Ensure timestamp is naturally aligned */
+	struct {
+		s16 chans[3];
+		s64 timetamp __aligned(8);
+	} scan;
 };
 
 #define STK8BA50_ACCEL_CHANNEL(index, reg, axis) {			\
@@ -327,7 +326,7 @@ static irqreturn_t stk8ba50_trigger_handler(int irq, void *p)
 		ret = i2c_smbus_read_i2c_block_data(data->client,
 						    STK8BA50_REG_XOUT,
 						    STK8BA50_ALL_CHANNEL_SIZE,
-						    (u8 *)data->buffer);
+						    (u8 *)data->scan.chans);
 		if (ret < STK8BA50_ALL_CHANNEL_SIZE) {
 			dev_err(&data->client->dev, "register read failed\n");
 			goto err;
@@ -340,10 +339,10 @@ static irqreturn_t stk8ba50_trigger_handler(int irq, void *p)
 			if (ret < 0)
 				goto err;
 
-			data->buffer[i++] = ret;
+			data->scan.chans[i++] = ret;
 		}
 	}
-	iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
+	iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
 					   pf->timestamp);
 err:
 	mutex_unlock(&data->lock);

commit d3e25a6561653cab351d20f285e3e4fb2bf517c4
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sat May 1 18:01:08 2021 +0100

    iio: accel: stk8312: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
    
    [ Upstream commit f40a71ffec808e7e51848f63f0c0d3c32d65081b ]
    
    To make code more readable, use a structure to express the channel
    layout and ensure the timestamp is 8 byte aligned.
    
    Found during an audit of all calls of this function.
    
    Fixes: 95c12bba51c3 ("iio: accel: Add buffer mode for Sensortek STK8312")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Link: https://lore.kernel.org/r/20210501170121.512209-7-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/accel/stk8312.c b/drivers/iio/accel/stk8312.c
index cacc0da2f874..52c33addf47b 100644
--- a/drivers/iio/accel/stk8312.c
+++ b/drivers/iio/accel/stk8312.c
@@ -106,7 +106,11 @@ struct stk8312_data {
 	u8 mode;
 	struct iio_trigger *dready_trig;
 	bool dready_trigger_on;
-	s8 buffer[16]; /* 3x8-bit channels + 5x8 padding + 64-bit timestamp */
+	/* Ensure timestamp is naturally aligned */
+	struct {
+		s8 chans[3];
+		s64 timestamp __aligned(8);
+	} scan;
 };
 
 static IIO_CONST_ATTR(in_accel_scale_available, STK8312_SCALE_AVAIL);
@@ -441,7 +445,7 @@ static irqreturn_t stk8312_trigger_handler(int irq, void *p)
 		ret = i2c_smbus_read_i2c_block_data(data->client,
 						    STK8312_REG_XOUT,
 						    STK8312_ALL_CHANNEL_SIZE,
-						    data->buffer);
+						    data->scan.chans);
 		if (ret < STK8312_ALL_CHANNEL_SIZE) {
 			dev_err(&data->client->dev, "register read failed\n");
 			mutex_unlock(&data->lock);
@@ -455,12 +459,12 @@ static irqreturn_t stk8312_trigger_handler(int irq, void *p)
 				mutex_unlock(&data->lock);
 				goto err;
 			}
-			data->buffer[i++] = ret;
+			data->scan.chans[i++] = ret;
 		}
 	}
 	mutex_unlock(&data->lock);
 
-	iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
+	iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
 					   pf->timestamp);
 err:
 	iio_trigger_notify_done(indio_dev->trig);

commit aaf8b88d3f34651122c88e1c9d9a7cd8d6895ebc
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sat May 1 18:01:06 2021 +0100

    iio: accel: kxcjk-1013: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
    
    [ Upstream commit 3ab3aa2e7bd57497f9a7c6275c00dce237d2c9ba ]
    
    To make code more readable, use a structure to express the channel
    layout and ensure the timestamp is 8 byte aligned.
    
    Found during an audit of all calls of this function.
    
    Fixes: 1a4fbf6a9286 ("iio: accel: kxcjk1013 3-axis accelerometer driver")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Cc: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Link: https://lore.kernel.org/r/20210501170121.512209-5-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c
index c22afc979206..0ca6f9de5192 100644
--- a/drivers/iio/accel/kxcjk-1013.c
+++ b/drivers/iio/accel/kxcjk-1013.c
@@ -140,12 +140,23 @@ enum kx_acpi_type {
 	ACPI_KIOX010A,
 };
 
+enum kxcjk1013_axis {
+	AXIS_X,
+	AXIS_Y,
+	AXIS_Z,
+	AXIS_MAX
+};
+
 struct kxcjk1013_data {
 	struct i2c_client *client;
 	struct iio_trigger *dready_trig;
 	struct iio_trigger *motion_trig;
 	struct mutex mutex;
-	s16 buffer[8];
+	/* Ensure timestamp naturally aligned */
+	struct {
+		s16 chans[AXIS_MAX];
+		s64 timestamp __aligned(8);
+	} scan;
 	u8 odr_bits;
 	u8 range;
 	int wake_thres;
@@ -159,13 +170,6 @@ struct kxcjk1013_data {
 	enum kx_acpi_type acpi_type;
 };
 
-enum kxcjk1013_axis {
-	AXIS_X,
-	AXIS_Y,
-	AXIS_Z,
-	AXIS_MAX,
-};
-
 enum kxcjk1013_mode {
 	STANDBY,
 	OPERATION,
@@ -1086,12 +1090,12 @@ static irqreturn_t kxcjk1013_trigger_handler(int irq, void *p)
 	ret = i2c_smbus_read_i2c_block_data_or_emulated(data->client,
 							KXCJK1013_REG_XOUT_L,
 							AXIS_MAX * 2,
-							(u8 *)data->buffer);
+							(u8 *)data->scan.chans);
 	mutex_unlock(&data->mutex);
 	if (ret < 0)
 		goto err;
 
-	iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
+	iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
 					   data->timestamp);
 err:
 	iio_trigger_notify_done(indio_dev->trig);

commit ede0436891bfa39711bb0488a28d9cc3db0c14d2
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sat May 1 18:01:05 2021 +0100

    iio: accel: hid: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
    
    [ Upstream commit c6559bf796ccdb3a0c79db846af96c8f7046880b ]
    
    To make code more readable, use a structure to express the channel
    layout and ensure the timestamp is 8 byte aligned.
    Note this matches what was done in all the other hid sensor drivers.
    This one was missed previously due to an extra level of indirection.
    
    Found during an audit of all calls of this function.
    
    Fixes: a96cd0f901ee ("iio: accel: hid-sensor-accel-3d: Add timestamp")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Cc: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Link: https://lore.kernel.org/r/20210501170121.512209-4-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/accel/hid-sensor-accel-3d.c b/drivers/iio/accel/hid-sensor-accel-3d.c
index 38ff374a3ca4..32d5438d4519 100644
--- a/drivers/iio/accel/hid-sensor-accel-3d.c
+++ b/drivers/iio/accel/hid-sensor-accel-3d.c
@@ -42,8 +42,11 @@ struct accel_3d_state {
 	struct hid_sensor_hub_callbacks callbacks;
 	struct hid_sensor_common common_attributes;
 	struct hid_sensor_hub_attribute_info accel[ACCEL_3D_CHANNEL_MAX];
-	/* Reserve for 3 channels + padding + timestamp */
-	u32 accel_val[ACCEL_3D_CHANNEL_MAX + 3];
+	/* Ensure timestamp is naturally aligned */
+	struct {
+		u32 accel_val[3];
+		s64 timestamp __aligned(8);
+	} scan;
 	int scale_pre_decml;
 	int scale_post_decml;
 	int scale_precision;
@@ -254,8 +257,8 @@ static int accel_3d_proc_event(struct hid_sensor_hub_device *hsdev,
 			accel_state->timestamp = iio_get_time_ns(indio_dev);
 
 		hid_sensor_push_data(indio_dev,
-				     accel_state->accel_val,
-				     sizeof(accel_state->accel_val),
+				     &accel_state->scan,
+				     sizeof(accel_state->scan),
 				     accel_state->timestamp);
 
 		accel_state->timestamp = 0;
@@ -280,7 +283,7 @@ static int accel_3d_capture_sample(struct hid_sensor_hub_device *hsdev,
 	case HID_USAGE_SENSOR_ACCEL_Y_AXIS:
 	case HID_USAGE_SENSOR_ACCEL_Z_AXIS:
 		offset = usage_id - HID_USAGE_SENSOR_ACCEL_X_AXIS;
-		accel_state->accel_val[CHANNEL_SCAN_INDEX_X + offset] =
+		accel_state->scan.accel_val[CHANNEL_SCAN_INDEX_X + offset] =
 						*(u32 *)raw_data;
 		ret = 0;
 	break;

commit 64e79e553e5200e077222db8cdb5272440a7d48d
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sat May 1 18:01:04 2021 +0100

    iio: accel: bma220: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
    
    [ Upstream commit 151dbf0078da98206817ee0b87d499035479ef11 ]
    
    To make code more readable, use a structure to express the channel
    layout and ensure the timestamp is 8 byte aligned.
    
    Found during an audit of all calls of this function.
    
    Fixes: 194dc4c71413 ("iio: accel: Add triggered buffer support for BMA220")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Link: https://lore.kernel.org/r/20210501170121.512209-3-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/accel/bma220_spi.c b/drivers/iio/accel/bma220_spi.c
index e25d91c017ed..a548dc11e7c7 100644
--- a/drivers/iio/accel/bma220_spi.c
+++ b/drivers/iio/accel/bma220_spi.c
@@ -76,7 +76,11 @@ static const int bma220_scale_table[][4] = {
 struct bma220_data {
 	struct spi_device *spi_device;
 	struct mutex lock;
-	s8 buffer[16]; /* 3x8-bit channels + 5x8 padding + 8x8 timestamp */
+	struct {
+		s8 chans[3];
+		/* Ensure timestamp is naturally aligned. */
+		s64 timestamp __aligned(8);
+	} scan;
 	u8 tx_buf[2] ____cacheline_aligned;
 };
 
@@ -107,12 +111,12 @@ static irqreturn_t bma220_trigger_handler(int irq, void *p)
 
 	mutex_lock(&data->lock);
 	data->tx_buf[0] = BMA220_REG_ACCEL_X | BMA220_READ_MASK;
-	ret = spi_write_then_read(spi, data->tx_buf, 1, data->buffer,
+	ret = spi_write_then_read(spi, data->tx_buf, 1, &data->scan.chans,
 				  ARRAY_SIZE(bma220_channels) - 1);
 	if (ret < 0)
 		goto err;
 
-	iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
+	iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
 					   pf->timestamp);
 err:
 	mutex_unlock(&data->lock);

commit 86a5292e0c50076146c21db3c4c9fb8bd24b5d96
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sat May 1 18:01:03 2021 +0100

    iio: accel: bma180: Fix buffer alignment in iio_push_to_buffers_with_timestamp()
    
    [ Upstream commit fc36da3131a747a9367a05caf06de19be1bcc972 ]
    
    To make code more readable, use a structure to express the channel
    layout and ensure the timestamp is 8 byte aligned.
    
    Found during an audit of all calls of this function.
    
    Fixes: b9a6a237ffc9 ("iio:bma180: Drop _update_scan_mode()")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Cc: Peter Meerwald <pmeerw@pmeerw.net>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Link: https://lore.kernel.org/r/20210501170121.512209-2-jic23@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/accel/bma180.c b/drivers/iio/accel/bma180.c
index cb9765a3de60..4bedf48d662a 100644
--- a/drivers/iio/accel/bma180.c
+++ b/drivers/iio/accel/bma180.c
@@ -121,7 +121,11 @@ struct bma180_data {
 	int scale;
 	int bw;
 	bool pmode;
-	u8 buff[16]; /* 3x 16-bit + 8-bit + padding + timestamp */
+	/* Ensure timestamp is naturally aligned */
+	struct {
+		s16 chan[4];
+		s64 timestamp __aligned(8);
+	} scan;
 };
 
 enum bma180_chan {
@@ -667,12 +671,12 @@ static irqreturn_t bma180_trigger_handler(int irq, void *p)
 			mutex_unlock(&data->mutex);
 			goto err;
 		}
-		((s16 *)data->buff)[i++] = ret;
+		data->scan.chan[i++] = ret;
 	}
 
 	mutex_unlock(&data->mutex);
 
-	iio_push_to_buffers_with_timestamp(indio_dev, data->buff, time_ns);
+	iio_push_to_buffers_with_timestamp(indio_dev, &data->scan, time_ns);
 err:
 	iio_trigger_notify_done(indio_dev->trig);
 

commit bf349ef02dad548b93e050e90da616b7ed7a59bd
Author: Nuno Sa <nuno.sa@analog.com>
Date:   Thu Apr 22 12:19:03 2021 +0200

    iio: adis_buffer: do not return ints in irq handlers
    
    [ Upstream commit d877539ad8e8fdde9af69887055fec6402be1a13 ]
    
    On an IRQ handler we should not return normal error codes as 'irqreturn_t'
    is expected.
    
    Not necessarily stable material as the old check cannot fail, so it's a bug
    we can not hit.
    
    Fixes: ccd2b52f4ac69 ("staging:iio: Add common ADIS library")
    Reviewed-by: Alexandru Ardelean <ardeleanalex@gmail.com>
    Signed-off-by: Nuno Sa <nuno.sa@analog.com>
    Link: https://lore.kernel.org/r/20210422101911.135630-2-nuno.sa@analog.com
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/imu/adis_buffer.c b/drivers/iio/imu/adis_buffer.c
index e59d0438de73..bde68462b5ed 100644
--- a/drivers/iio/imu/adis_buffer.c
+++ b/drivers/iio/imu/adis_buffer.c
@@ -83,9 +83,6 @@ static irqreturn_t adis_trigger_handler(int irq, void *p)
 	struct adis *adis = iio_device_get_drvdata(indio_dev);
 	int ret;
 
-	if (!adis->buffer)
-		return -ENOMEM;
-
 	if (adis->data->has_paging) {
 		mutex_lock(&adis->txrx_lock);
 		if (adis->current_page != 0) {

commit 0d8a385de3749c77767cd0d9fc8a4427dc87fffa
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Sat May 8 00:07:55 2021 +0200

    mwifiex: re-fix for unaligned accesses
    
    [ Upstream commit 8f4e3d48bb50765ab27ae5bebed2595b20de80a1 ]
    
    A patch from 2017 changed some accesses to DMA memory to use
    get_unaligned_le32() and similar interfaces, to avoid problems
    with doing unaligned accesson uncached memory.
    
    However, the change in the mwifiex_pcie_alloc_sleep_cookie_buf()
    function ended up changing the size of the access instead,
    as it operates on a pointer to u8.
    
    Change this function back to actually access the entire 32 bits.
    Note that the pointer is aligned by definition because it came
    from dma_alloc_coherent().
    
    Fixes: 92c70a958b0b ("mwifiex: fix for unaligned reads")
    Acked-by: Kalle Valo <kvalo@codeaurora.org>
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c
index 5907b34037c2..2f0141c964e2 100644
--- a/drivers/net/wireless/marvell/mwifiex/pcie.c
+++ b/drivers/net/wireless/marvell/mwifiex/pcie.c
@@ -1084,7 +1084,7 @@ static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
 static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
 {
 	struct pcie_service_card *card = adapter->card;
-	u32 tmp;
+	u32 *cookie;
 
 	card->sleep_cookie_vbase = pci_alloc_consistent(card->dev, sizeof(u32),
 						     &card->sleep_cookie_pbase);
@@ -1093,13 +1093,11 @@ static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
 			    "pci_alloc_consistent failed!\n");
 		return -ENOMEM;
 	}
+	cookie = (u32 *)card->sleep_cookie_vbase;
 	/* Init val of Sleep Cookie */
-	tmp = FW_AWAKE_COOKIE;
-	put_unaligned(tmp, card->sleep_cookie_vbase);
+	*cookie = FW_AWAKE_COOKIE;
 
-	mwifiex_dbg(adapter, INFO,
-		    "alloc_scook: sleep cookie=0x%x\n",
-		    get_unaligned(card->sleep_cookie_vbase));
+	mwifiex_dbg(adapter, INFO, "alloc_scook: sleep cookie=0x%x\n", *cookie);
 
 	return 0;
 }

commit 23e431f7f36cb2744be7f1a1fffe6a3608b21b0c
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Sun May 9 19:22:33 2021 +0200

    tty: nozomi: Fix a resource leak in an error handling function
    
    [ Upstream commit 31a9a318255960d32ae183e95d0999daf2418608 ]
    
    A 'request_irq()' call is not balanced by a corresponding 'free_irq()' in
    the error handling path, as already done in the remove function.
    
    Add it.
    
    Fixes: 9842c38e9176 ("kfifo: fix warn_unused_result")
    Reviewed-by: Jiri Slaby <jirislaby@kernel.org>
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Link: https://lore.kernel.org/r/4f0d2b3038e82f081d370ccb0cade3ad88463fe7.1620580838.git.christophe.jaillet@wanadoo.fr
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/nozomi.c b/drivers/tty/nozomi.c
index fed820e9ab9d..8dde9412a1aa 100644
--- a/drivers/tty/nozomi.c
+++ b/drivers/tty/nozomi.c
@@ -1445,6 +1445,7 @@ static int nozomi_card_init(struct pci_dev *pdev,
 		tty_unregister_device(ntty_driver, dc->index_start + i);
 		tty_port_destroy(&dc->port[i].port);
 	}
+	free_irq(pdev->irq, dc);
 err_free_kfifo:
 	for (i = 0; i < MAX_PORT; i++)
 		kfifo_free(&dc->port[i].fifo_ul);

commit ccc59418ad81e6fa24ee50f4adc763f12972ce2c
Author: Leon Romanovsky <leonro@nvidia.com>
Date:   Tue Jun 29 11:51:38 2021 +0300

    RDMA/mlx5: Don't access NULL-cleared mpi pointer
    
    [ Upstream commit 4a754d7637026b42b0c9ba5787ad5ee3bc2ff77f ]
    
    The "dev->port[i].mp.mpi" is set to NULL during mlx5_ib_unbind_slave_port()
    execution, however that field is needed to add device to unaffiliated list.
    
    Such flow causes to the following kernel panic while unloading mlx5_ib
    module in multi-port mode, hence the device should be added to the list
    prior to unbind call.
    
     RPC: Unregistered rdma transport module.
     RPC: Unregistered rdma backchannel transport module.
     BUG: kernel NULL pointer dereference, address: 0000000000000000
     #PF: supervisor write access in kernel mode
     #PF: error_code(0x0002) - not-present page
     PGD 0 P4D 0
     Oops: 0002 [#1] SMP NOPTI
     CPU: 4 PID: 1904 Comm: modprobe Not tainted 5.13.0-rc7_for_upstream_min_debug_2021_06_24_12_08 #1
     Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014
     RIP: 0010:mlx5_ib_cleanup_multiport_master+0x18b/0x2d0 [mlx5_ib]
     Code: 00 04 0f 85 c4 00 00 00 48 89 df e8 ef fa ff ff 48 8b 83 40 0d 00 00 48 8b 15 b9 e8 05 00 4a 8b 44 28 20 48 89 05 ad e8 05 00 <48> c7 00 d0 57 c5 a0 48 89 50 08 48 89 02 39 ab 88 0a 00 00 0f 86
     RSP: 0018:ffff888116ee3df8 EFLAGS: 00010296
     RAX: 0000000000000000 RBX: ffff8881154f6000 RCX: 0000000000000080
     RDX: ffffffffa0c557d0 RSI: ffff88810b69d200 RDI: 000000000002d8a0
     RBP: 0000000000000002 R08: ffff888110780408 R09: 0000000000000000
     R10: ffff88812452e1c0 R11: fffffffffff7e028 R12: 0000000000000000
     R13: 0000000000000080 R14: ffff888102c58000 R15: 0000000000000000
     FS:  00007f884393a740(0000) GS:ffff8882f5a00000(0000) knlGS:0000000000000000
     CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
     CR2: 0000000000000000 CR3: 00000001249f6004 CR4: 0000000000370ea0
     DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
     DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
     Call Trace:
      mlx5_ib_stage_init_cleanup+0x16/0xd0 [mlx5_ib]
      __mlx5_ib_remove+0x33/0x90 [mlx5_ib]
      mlx5r_remove+0x22/0x30 [mlx5_ib]
      auxiliary_bus_remove+0x18/0x30
      __device_release_driver+0x177/0x220
      driver_detach+0xc4/0x100
      bus_remove_driver+0x58/0xd0
      auxiliary_driver_unregister+0x12/0x20
      mlx5_ib_cleanup+0x13/0x897 [mlx5_ib]
      __x64_sys_delete_module+0x154/0x230
      ? exit_to_user_mode_prepare+0x104/0x140
      do_syscall_64+0x3f/0x80
      entry_SYSCALL_64_after_hwframe+0x44/0xae
     RIP: 0033:0x7f8842e095c7
     Code: 73 01 c3 48 8b 0d d9 48 2c 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 b8 b0 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d a9 48 2c 00 f7 d8 64 89 01 48
     RSP: 002b:00007ffc68f6e758 EFLAGS: 00000206 ORIG_RAX: 00000000000000b0
     RAX: ffffffffffffffda RBX: 00005638207929c0 RCX: 00007f8842e095c7
     RDX: 0000000000000000 RSI: 0000000000000800 RDI: 0000563820792a28
     RBP: 00005638207929c0 R08: 00007ffc68f6d701 R09: 0000000000000000
     R10: 00007f8842e82880 R11: 0000000000000206 R12: 0000563820792a28
     R13: 0000000000000001 R14: 0000563820792a28 R15: 00007ffc68f6fb40
     Modules linked in: xt_MASQUERADE nf_conntrack_netlink nfnetlink iptable_nat xt_addrtype xt_conntrack nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 br_netfilter overlay rdma_ucm ib_iser libiscsi scsi_transport_iscsi rdma_cm iw_cm ib_ipoib ib_cm ib_umad mlx5_ib(-) mlx4_ib ib_uverbs ib_core mlx4_en mlx4_core mlx5_core ptp pps_core [last unloaded: rpcrdma]
     CR2: 0000000000000000
     ---[ end trace a0bb7e20804e9e9b ]---
    
    Fixes: 7ce6095e3bff ("RDMA/mlx5: Don't add slave port to unaffiliated list")
    Link: https://lore.kernel.org/r/899ac1b33a995be5ec0e16a4765c4e43c2b1ba5b.1624956444.git.leonro@nvidia.com
    Reviewed-by: Itay Aveksis <itayav@nvidia.com>
    Reviewed-by: Maor Gottlieb <maorg@nvidia.com>
    Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index eaf9de421f8d..1688c06d5c3c 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -5522,9 +5522,9 @@ static void mlx5_ib_cleanup_multiport_master(struct mlx5_ib_dev *dev)
 				dev->port[i].mp.mpi = NULL;
 			} else {
 				mlx5_ib_dbg(dev, "unbinding port_num: %d\n", i + 1);
-				mlx5_ib_unbind_slave_port(dev, dev->port[i].mp.mpi);
 				list_add_tail(&dev->port[i].mp.mpi->list,
 					      &mlx5_ib_unaffiliated_port_list);
+				mlx5_ib_unbind_slave_port(dev, dev->port[i].mp.mpi);
 			}
 		}
 	}

commit cc18600633edcbce901f8eae82fa0d237aee4b42
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Fri Jun 25 23:23:48 2021 +0300

    net: sched: fix warning in tcindex_alloc_perfect_hash
    
    [ Upstream commit 3f2db250099f46988088800052cdf2332c7aba61 ]
    
    Syzbot reported warning in tcindex_alloc_perfect_hash. The problem
    was in too big cp->hash, which triggers warning in kmalloc. Since
    cp->hash comes from userspace, there is no need to warn if value
    is not correct
    
    Fixes: b9a24bb76bf6 ("net_sched: properly handle failure case of tcf_exts_init()")
    Reported-and-tested-by: syzbot+1071ad60cd7df39fdadb@syzkaller.appspotmail.com
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Acked-by: Cong Wang <cong.wang@bytedance.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sched/cls_tcindex.c b/net/sched/cls_tcindex.c
index e41bc5ecaa09..4070197f9543 100644
--- a/net/sched/cls_tcindex.c
+++ b/net/sched/cls_tcindex.c
@@ -276,7 +276,7 @@ static int tcindex_alloc_perfect_hash(struct net *net, struct tcindex_data *cp)
 	int i, err = 0;
 
 	cp->perfect = kcalloc(cp->hash, sizeof(struct tcindex_filter_result),
-			      GFP_KERNEL);
+			      GFP_KERNEL | __GFP_NOWARN);
 	if (!cp->perfect)
 		return -ENOMEM;
 

commit d76613a914b1950604bdcec2a44f4557ff42c65d
Author: Vadim Fedorenko <vfedorenko@novek.ru>
Date:   Fri Jun 25 19:21:39 2021 +0300

    net: lwtunnel: handle MTU calculation in forwading
    
    [ Upstream commit fade56410c22cacafb1be9f911a0afd3701d8366 ]
    
    Commit 14972cbd34ff ("net: lwtunnel: Handle fragmentation") moved
    fragmentation logic away from lwtunnel by carry encap headroom and
    use it in output MTU calculation. But the forwarding part was not
    covered and created difference in MTU for output and forwarding and
    further to silent drops on ipv4 forwarding path. Fix it by taking
    into account lwtunnel encap headroom.
    
    The same commit also introduced difference in how to treat RTAX_MTU
    in IPv4 and IPv6 where latter explicitly removes lwtunnel encap
    headroom from route MTU. Make IPv4 version do the same.
    
    Fixes: 14972cbd34ff ("net: lwtunnel: Handle fragmentation")
    Suggested-by: David Ahern <dsahern@gmail.com>
    Signed-off-by: Vadim Fedorenko <vfedorenko@novek.ru>
    Reviewed-by: David Ahern <dsahern@kernel.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/net/ip.h b/include/net/ip.h
index aad003685c31..e8fa25280cbf 100644
--- a/include/net/ip.h
+++ b/include/net/ip.h
@@ -34,6 +34,7 @@
 #include <net/flow.h>
 #include <net/flow_dissector.h>
 #include <net/netns/hash.h>
+#include <net/lwtunnel.h>
 
 #define IPV4_MAX_PMTU		65535U		/* RFC 2675, Section 5.1 */
 #define IPV4_MIN_MTU		68			/* RFC 791 */
@@ -408,22 +409,25 @@ static inline unsigned int ip_dst_mtu_maybe_forward(const struct dst_entry *dst,
 
 	/* 'forwarding = true' case should always honour route mtu */
 	mtu = dst_metric_raw(dst, RTAX_MTU);
-	if (mtu)
-		return mtu;
+	if (!mtu)
+		mtu = min(READ_ONCE(dst->dev->mtu), IP_MAX_MTU);
 
-	return min(READ_ONCE(dst->dev->mtu), IP_MAX_MTU);
+	return mtu - lwtunnel_headroom(dst->lwtstate, mtu);
 }
 
 static inline unsigned int ip_skb_dst_mtu(struct sock *sk,
 					  const struct sk_buff *skb)
 {
+	unsigned int mtu;
+
 	if (!sk || !sk_fullsock(sk) || ip_sk_use_pmtu(sk)) {
 		bool forwarding = IPCB(skb)->flags & IPSKB_FORWARDED;
 
 		return ip_dst_mtu_maybe_forward(skb_dst(skb), forwarding);
 	}
 
-	return min(READ_ONCE(skb_dst(skb)->dev->mtu), IP_MAX_MTU);
+	mtu = min(READ_ONCE(skb_dst(skb)->dev->mtu), IP_MAX_MTU);
+	return mtu - lwtunnel_headroom(skb_dst(skb)->lwtstate, mtu);
 }
 
 int ip_metrics_convert(struct net *net, struct nlattr *fc_mx, int fc_mx_len,
diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h
index 5e26d61867b2..5c38a80cee3a 100644
--- a/include/net/ip6_route.h
+++ b/include/net/ip6_route.h
@@ -243,11 +243,18 @@ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
 
 static inline int ip6_skb_dst_mtu(struct sk_buff *skb)
 {
+	int mtu;
+
 	struct ipv6_pinfo *np = skb->sk && !dev_recursion_level() ?
 				inet6_sk(skb->sk) : NULL;
 
-	return (np && np->pmtudisc >= IPV6_PMTUDISC_PROBE) ?
-	       skb_dst(skb)->dev->mtu : dst_mtu(skb_dst(skb));
+	if (np && np->pmtudisc >= IPV6_PMTUDISC_PROBE) {
+		mtu = READ_ONCE(skb_dst(skb)->dev->mtu);
+		mtu -= lwtunnel_headroom(skb_dst(skb)->lwtstate, mtu);
+	} else
+		mtu = dst_mtu(skb_dst(skb));
+
+	return mtu;
 }
 
 static inline bool ip6_sk_accept_pmtu(const struct sock *sk)
@@ -288,7 +295,7 @@ static inline unsigned int ip6_dst_mtu_forward(const struct dst_entry *dst)
 	if (dst_metric_locked(dst, RTAX_MTU)) {
 		mtu = dst_metric_raw(dst, RTAX_MTU);
 		if (mtu)
-			return mtu;
+			goto out;
 	}
 
 	mtu = IPV6_MIN_MTU;
@@ -298,7 +305,8 @@ static inline unsigned int ip6_dst_mtu_forward(const struct dst_entry *dst)
 		mtu = idev->cnf.mtu6;
 	rcu_read_unlock();
 
-	return mtu;
+out:
+	return mtu - lwtunnel_headroom(dst->lwtstate, mtu);
 }
 
 u32 ip6_mtu_from_fib6(struct fib6_info *f6i, struct in6_addr *daddr,
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 484bd646df5f..1491d239385e 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -1318,7 +1318,7 @@ static unsigned int ipv4_mtu(const struct dst_entry *dst)
 		mtu = dst_metric_raw(dst, RTAX_MTU);
 
 	if (mtu)
-		return mtu;
+		goto out;
 
 	mtu = READ_ONCE(dst->dev->mtu);
 
@@ -1327,6 +1327,7 @@ static unsigned int ipv4_mtu(const struct dst_entry *dst)
 			mtu = 576;
 	}
 
+out:
 	mtu = min_t(unsigned int, mtu, IP_MAX_MTU);
 
 	return mtu - lwtunnel_headroom(dst->lwtstate, mtu);

commit fdf3ef3f66cb88f30fbf9396f876937b29506d9b
Author: Muchun Song <songmuchun@bytedance.com>
Date:   Fri Apr 2 17:11:45 2021 +0800

    writeback: fix obtain a reference to a freeing memcg css
    
    [ Upstream commit 8b0ed8443ae6458786580d36b7d5f8125535c5d4 ]
    
    The caller of wb_get_create() should pin the memcg, because
    wb_get_create() relies on this guarantee. The rcu read lock
    only can guarantee that the memcg css returned by css_from_id()
    cannot be released, but the reference of the memcg can be zero.
    
      rcu_read_lock()
      memcg_css = css_from_id()
      wb_get_create(memcg_css)
          cgwb_create(memcg_css)
              // css_get can change the ref counter from 0 back to 1
              css_get(memcg_css)
      rcu_read_unlock()
    
    Fix it by holding a reference to the css before calling
    wb_get_create(). This is not a problem I encountered in the
    real world. Just the result of a code review.
    
    Fixes: 682aa8e1a6a1 ("writeback: implement unlocked_inode_to_wb transaction and use it for stat updates")
    Link: https://lore.kernel.org/r/20210402091145.80635-1-songmuchun@bytedance.com
    Signed-off-by: Muchun Song <songmuchun@bytedance.com>
    Acked-by: Michal Hocko <mhocko@suse.com>
    Acked-by: Tejun Heo <tj@kernel.org>
    Signed-off-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
index fc9167e65287..869a34a48958 100644
--- a/fs/fs-writeback.c
+++ b/fs/fs-writeback.c
@@ -512,9 +512,14 @@ static void inode_switch_wbs(struct inode *inode, int new_wb_id)
 	/* find and pin the new wb */
 	rcu_read_lock();
 	memcg_css = css_from_id(new_wb_id, &memory_cgrp_subsys);
-	if (memcg_css)
-		isw->new_wb = wb_get_create(bdi, memcg_css, GFP_ATOMIC);
+	if (memcg_css && !css_tryget(memcg_css))
+		memcg_css = NULL;
 	rcu_read_unlock();
+	if (!memcg_css)
+		goto out_free;
+
+	isw->new_wb = wb_get_create(bdi, memcg_css, GFP_ATOMIC);
+	css_put(memcg_css);
 	if (!isw->new_wb)
 		goto out_free;
 

commit 4a808634e5a6eb74eb7423cb999c1892a5c7b547
Author: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Date:   Tue Jun 22 20:59:02 2021 -0700

    Bluetooth: Fix handling of HCI_LE_Advertising_Set_Terminated event
    
    [ Upstream commit 23837a6d7a1a61818ed94a6b8af552d6cf7d32d5 ]
    
    Error status of this event means that it has ended due reasons other
    than a connection:
    
     'If advertising has terminated as a result of the advertising duration
     elapsing, the Status parameter shall be set to the error code
     Advertising Timeout (0x3C).'
    
     'If advertising has terminated because the
     Max_Extended_Advertising_Events was reached, the Status parameter
     shall be set to the error code Limit Reached (0x43).'
    
    Fixes: acf0aeae431a0 ("Bluetooth: Handle ADv set terminated event")
    Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 2e2cad58b6cc..45cc864cf2b3 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -4986,8 +4986,19 @@ static void hci_le_ext_adv_term_evt(struct hci_dev *hdev, struct sk_buff *skb)
 
 	BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
 
-	if (ev->status)
+	if (ev->status) {
+		struct adv_info *adv;
+
+		adv = hci_find_adv_instance(hdev, ev->handle);
+		if (!adv)
+			return;
+
+		/* Remove advertising as it has been terminated */
+		hci_remove_adv_instance(hdev, ev->handle);
+		mgmt_advertising_removed(NULL, hdev, ev->handle);
+
 		return;
+	}
 
 	conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->conn_handle));
 	if (conn) {

commit 40a7196f31caec156c7a8346850eaf3614289a69
Author: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Date:   Fri May 28 11:45:02 2021 -0700

    Bluetooth: mgmt: Fix slab-out-of-bounds in tlv_data_is_valid
    
    [ Upstream commit 799acb9347915bfe4eac0ff2345b468f0a1ca207 ]
    
    This fixes parsing of LTV entries when the length is 0.
    
    Found with:
    
    tools/mgmt-tester -s "Add Advertising - Success (ScRsp only)"
    
    Add Advertising - Success (ScRsp only) - run
      Sending Add Advertising (0x003e)
      Test condition added, total 1
    [   11.004577] ==================================================================
    [   11.005292] BUG: KASAN: slab-out-of-bounds in tlv_data_is_valid+0x87/0xe0
    [   11.005984] Read of size 1 at addr ffff888002c695b0 by task mgmt-tester/87
    [   11.006711]
    [   11.007176]
    [   11.007429] Allocated by task 87:
    [   11.008151]
    [   11.008438] The buggy address belongs to the object at ffff888002c69580
    [   11.008438]  which belongs to the cache kmalloc-64 of size 64
    [   11.010526] The buggy address is located 48 bytes inside of
    [   11.010526]  64-byte region [ffff888002c69580, ffff888002c695c0)
    [   11.012423] The buggy address belongs to the page:
    [   11.013291]
    [   11.013544] Memory state around the buggy address:
    [   11.014359]  ffff888002c69480: fa fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
    [   11.015453]  ffff888002c69500: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
    [   11.016232] >ffff888002c69580: 00 00 00 00 00 00 fc fc fc fc fc fc fc fc fc fc
    [   11.017010]                                      ^
    [   11.017547]  ffff888002c69600: 00 00 00 00 00 00 fc fc fc fc fc fc fc fc fc fc
    [   11.018296]  ffff888002c69680: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
    [   11.019116] ==================================================================
    
    Fixes: 2bb36870e8cb2 ("Bluetooth: Unify advertising instance flags check")
    Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 5340b1097afb..e9a4f11278d9 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -6468,6 +6468,9 @@ static bool tlv_data_is_valid(struct hci_dev *hdev, u32 adv_flags, u8 *data,
 	for (i = 0, cur_len = 0; i < len; i += (cur_len + 1)) {
 		cur_len = data[i];
 
+		if (!cur_len)
+			continue;
+
 		if (data[i + 1] == EIR_FLAGS &&
 		    (!is_adv_data || flags_managed(adv_flags)))
 			return false;

commit 6c7a0c308b3ac149ab6e4a86c7b9bc9ffce6154e
Author: Eric Dumazet <edumazet@google.com>
Date:   Thu Jun 24 03:07:20 2021 -0700

    ipv6: fix out-of-bound access in ip6_parse_tlv()
    
    [ Upstream commit 624085a31c1ad6a80b1e53f686bf6ee92abbf6e8 ]
    
    First problem is that optlen is fetched without checking
    there is more than one byte to parse.
    
    Fix this by taking care of IPV6_TLV_PAD1 before
    fetching optlen (under appropriate sanity checks against len)
    
    Second problem is that IPV6_TLV_PADN checks of zero
    padding are performed before the check of remaining length.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Fixes: c1412fce7ecc ("net/ipv6/exthdrs.c: Strict PadN option checking")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Cc: Paolo Abeni <pabeni@redhat.com>
    Cc: Tom Herbert <tom@herbertland.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c
index 68b8084da83a..fe2497ae4523 100644
--- a/net/ipv6/exthdrs.c
+++ b/net/ipv6/exthdrs.c
@@ -138,18 +138,23 @@ static bool ip6_parse_tlv(const struct tlvtype_proc *procs,
 	len -= 2;
 
 	while (len > 0) {
-		int optlen = nh[off + 1] + 2;
-		int i;
+		int optlen, i;
 
-		switch (nh[off]) {
-		case IPV6_TLV_PAD1:
-			optlen = 1;
+		if (nh[off] == IPV6_TLV_PAD1) {
 			padlen++;
 			if (padlen > 7)
 				goto bad;
-			break;
+			off++;
+			len--;
+			continue;
+		}
+		if (len < 2)
+			goto bad;
+		optlen = nh[off + 1] + 2;
+		if (optlen > len)
+			goto bad;
 
-		case IPV6_TLV_PADN:
+		if (nh[off] == IPV6_TLV_PADN) {
 			/* RFC 2460 states that the purpose of PadN is
 			 * to align the containing header to multiples
 			 * of 8. 7 is therefore the highest valid value.
@@ -166,12 +171,7 @@ static bool ip6_parse_tlv(const struct tlvtype_proc *procs,
 				if (nh[off + i] != 0)
 					goto bad;
 			}
-			break;
-
-		default: /* Other TLV code so scan list */
-			if (optlen > len)
-				goto bad;
-
+		} else {
 			tlv_count++;
 			if (tlv_count > max_count)
 				goto bad;
@@ -191,7 +191,6 @@ static bool ip6_parse_tlv(const struct tlvtype_proc *procs,
 				return false;
 
 			padlen = 0;
-			break;
 		}
 		off += optlen;
 		len -= optlen;

commit 4194876ced7c141d03791a0a1b57e575cf218c3b
Author: Sukadev Bhattiprolu <sukadev@linux.ibm.com>
Date:   Wed Jun 23 21:13:15 2021 -0700

    ibmvnic: free tx_pool if tso_pool alloc fails
    
    [ Upstream commit f6ebca8efa52e4ae770f0325d618e7bcf08ada0c ]
    
    Free tx_pool and clear it, if allocation of tso_pool fails.
    
    release_tx_pools() assumes we have both tx and tso_pools if ->tx_pool is
    non-NULL. If allocation of tso_pool fails in init_tx_pools(), the assumption
    will not be true and we would end up dereferencing ->tx_buff, ->free_map
    fields from a NULL pointer.
    
    Fixes: 3205306c6b8d ("ibmvnic: Update TX pool initialization routine")
    Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.ibm.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 0eb06750a5d6..4008007c2e34 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -698,8 +698,11 @@ static int init_tx_pools(struct net_device *netdev)
 
 	adapter->tso_pool = kcalloc(tx_subcrqs,
 				    sizeof(struct ibmvnic_tx_pool), GFP_KERNEL);
-	if (!adapter->tso_pool)
+	if (!adapter->tso_pool) {
+		kfree(adapter->tx_pool);
+		adapter->tx_pool = NULL;
 		return -1;
+	}
 
 	adapter->num_active_tx_pools = tx_subcrqs;
 

commit 83098421509eba10ab8f0dc62761e4a70887079b
Author: Dany Madden <drt@linux.ibm.com>
Date:   Wed Jun 23 21:13:11 2021 -0700

    Revert "ibmvnic: remove duplicate napi_schedule call in open function"
    
    [ Upstream commit 2ca220f92878470c6ba03f9946e412323093cc94 ]
    
    This reverts commit 7c451f3ef676c805a4b77a743a01a5c21a250a73.
    
    When a vnic interface is taken down and then up, connectivity is not
    restored. We bisected it to this commit. Reverting this commit until
    we can fully investigate the issue/benefit of the change.
    
    Fixes: 7c451f3ef676 ("ibmvnic: remove duplicate napi_schedule call in open function")
    Reported-by: Cristobal Forno <cforno12@linux.ibm.com>
    Reported-by: Abdul Haleem <abdhalee@in.ibm.com>
    Signed-off-by: Dany Madden <drt@linux.ibm.com>
    Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.ibm.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 9f72cd3b1d24..0eb06750a5d6 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -1099,6 +1099,11 @@ static int __ibmvnic_open(struct net_device *netdev)
 
 	netif_tx_start_all_queues(netdev);
 
+	if (prev_state == VNIC_CLOSED) {
+		for (i = 0; i < adapter->req_rx_queues; i++)
+			napi_schedule(&adapter->napi[i]);
+	}
+
 	adapter->state = VNIC_OPEN;
 	return rc;
 }

commit ac2abd4eec77810b28a77ede662cca7e10dd73cd
Author: Mateusz Palczewski <mateusz.palczewski@intel.com>
Date:   Wed Mar 10 11:12:54 2021 +0000

    i40e: Fix autoneg disabling for non-10GBaseT links
    
    [ Upstream commit 9262793e59f0423437166a879a73d056b1fe6f9a ]
    
    Disabling autonegotiation was allowed only for 10GBaseT PHY.
    The condition was changed to check if link media type is BaseT.
    
    Fixes: 3ce12ee9d8f9 ("i40e: Fix order of checks when enabling/disabling autoneg in ethtool")
    Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
    Reviewed-by: Karen Sornek <karen.sornek@intel.com>
    Signed-off-by: Dawid Lukwinski <dawid.lukwinski@intel.com>
    Signed-off-by: Mateusz Palczewski <mateusz.palczewski@intel.com>
    Tested-by: Tony Brelinski <tonyx.brelinski@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index 9148d93c5c63..4c7c1998f358 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -948,8 +948,7 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
 			if (ethtool_link_ksettings_test_link_mode(&safe_ks,
 								  supported,
 								  Autoneg) &&
-			    hw->phy.link_info.phy_type !=
-			    I40E_PHY_TYPE_10GBASE_T) {
+			    hw->phy.media_type != I40E_MEDIA_TYPE_BASET) {
 				netdev_info(netdev, "Autoneg cannot be disabled on this phy\n");
 				err = -EINVAL;
 				goto done;

commit fdb69fdf4fe8ffcaad0ba0ad3608526ba798f6dd
Author: Dinghao Liu <dinghao.liu@zju.edu.cn>
Date:   Sun Feb 28 19:50:58 2021 +0800

    i40e: Fix error handling in i40e_vsi_open
    
    [ Upstream commit 9c04cfcd4aad232e36306cdc5c74cd9fc9148a7e ]
    
    When vsi->type == I40E_VSI_FDIR, we have caught the return value of
    i40e_vsi_request_irq() but without further handling. Check and execute
    memory clean on failure just like the other i40e_vsi_request_irq().
    
    Fixes: 8a9eb7d3cbcab ("i40e: rework fdir setup and teardown")
    Signed-off-by: Dinghao Liu <dinghao.liu@zju.edu.cn>
    Tested-by: Tony Brelinski <tonyx.brelinski@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index fa0e7582159f..1b101b526ed3 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -7743,6 +7743,8 @@ int i40e_vsi_open(struct i40e_vsi *vsi)
 			 dev_driver_string(&pf->pdev->dev),
 			 dev_name(&pf->pdev->dev));
 		err = i40e_vsi_request_irq(vsi, int_name);
+		if (err)
+			goto err_setup_rx;
 
 	} else {
 		err = -EINVAL;

commit 7c557d06b420b08e380e2875f04aff8624fb8dcc
Author: Maciej Żenczykowski <maze@google.com>
Date:   Wed Jun 16 17:09:51 2021 -0700

    bpf: Do not change gso_size during bpf_skb_change_proto()
    
    [ Upstream commit 364745fbe981a4370f50274475da4675661104df ]
    
    This is technically a backwards incompatible change in behaviour, but I'm
    going to argue that it is very unlikely to break things, and likely to fix
    *far* more then it breaks.
    
    In no particular order, various reasons follow:
    
    (a) I've long had a bug assigned to myself to debug a super rare kernel crash
    on Android Pixel phones which can (per stacktrace) be traced back to BPF clat
    IPv6 to IPv4 protocol conversion causing some sort of ugly failure much later
    on during transmit deep in the GSO engine, AFAICT precisely because of this
    change to gso_size, though I've never been able to manually reproduce it. I
    believe it may be related to the particular network offload support of attached
    USB ethernet dongle being used for tethering off of an IPv6-only cellular
    connection. The reason might be we end up with more segments than max permitted,
    or with a GSO packet with only one segment... (either way we break some
    assumption and hit a BUG_ON)
    
    (b) There is no check that the gso_size is > 20 when reducing it by 20, so we
    might end up with a negative (or underflowing) gso_size or a gso_size of 0.
    This can't possibly be good. Indeed this is probably somehow exploitable (or
    at least can result in a kernel crash) by delivering crafted packets and perhaps
    triggering an infinite loop or a divide by zero... As a reminder: gso_size (MSS)
    is related to MTU, but not directly derived from it: gso_size/MSS may be
    significantly smaller then one would get by deriving from local MTU. And on
    some NICs (which do loose MTU checking on receive, it may even potentially be
    larger, for example my work pc with 1500 MTU can receive 1520 byte frames [and
    sometimes does due to bugs in a vendor plat46 implementation]). Indeed even just
    going from 21 to 1 is potentially problematic because it increases the number
    of segments by a factor of 21 (think DoS, or some other crash due to too many
    segments).
    
    (c) It's always safe to not increase the gso_size, because it doesn't result in
    the max packet size increasing.  So the skb_increase_gso_size() call was always
    unnecessary for correctness (and outright undesirable, see later). As such the
    only part which is potentially dangerous (ie. could cause backwards compatibility
    issues) is the removal of the skb_decrease_gso_size() call.
    
    (d) If the packets are ultimately destined to the local device, then there is
    absolutely no benefit to playing around with gso_size. It only matters if the
    packets will egress the device. ie. we're either forwarding, or transmitting
    from the device.
    
    (e) This logic only triggers for packets which are GSO. It does not trigger for
    skbs which are not GSO. It will not convert a non-GSO MTU sized packet into a
    GSO packet (and you don't even know what the MTU is, so you can't even fix it).
    As such your transmit path must *already* be able to handle an MTU 20 bytes
    larger then your receive path (for IPv4 to IPv6 translation) - and indeed 28
    bytes larger due to IPv4 fragments. Thus removing the skb_decrease_gso_size()
    call doesn't actually increase the size of the packets your transmit side must
    be able to handle. ie. to handle non-GSO max-MTU packets, the IPv4/IPv6 device/
    route MTUs must already be set correctly. Since for example with an IPv4 egress
    MTU of 1500, IPv4 to IPv6 translation will already build 1520 byte IPv6 frames,
    so you need a 1520 byte device MTU. This means if your IPv6 device's egress
    MTU is 1280, your IPv4 route must be 1260 (and actually 1252, because of the
    need to handle fragments). This is to handle normal non-GSO packets. Thus the
    reduction is simply not needed for GSO packets, because when they're correctly
    built, they will already be the right size.
    
    (f) TSO/GSO should be able to exactly undo GRO: the number of packets (TCP
    segments) should not be modified, so that TCP's MSS counting works correctly
    (this matters for congestion control). If protocol conversion changes the
    gso_size, then the number of TCP segments may increase or decrease. Packet loss
    after protocol conversion can result in partial loss of MSS segments that the
    sender sent. How's the sending TCP stack going to react to receiving ACKs/SACKs
    in the middle of the segments it sent?
    
    (g) skb_{decrease,increase}_gso_size() are already no-ops for GSO_BY_FRAGS
    case (besides triggering WARN_ON_ONCE). This means you already cannot guarantee
    that gso_size (and thus resulting packet MTU) is changed. ie. you must assume
    it won't be changed.
    
    (h) changing gso_size is outright buggy for UDP GSO packets, where framing
    matters (I believe that's also the case for SCTP, but it's already excluded
    by [g]).  So the only remaining case is TCP, which also doesn't want it
    (see [f]).
    
    (i) see also the reasoning on the previous attempt at fixing this
    (commit fa7b83bf3b156c767f3e4a25bbf3817b08f3ff8e) which shows that the current
    behaviour causes TCP packet loss:
    
      In the forwarding path GRO -> BPF 6 to 4 -> GSO for TCP traffic, the
      coalesced packet payload can be > MSS, but < MSS + 20.
    
      bpf_skb_proto_6_to_4() will upgrade the MSS and it can be > the payload
      length. After then tcp_gso_segment checks for the payload length if it
      is <= MSS. The condition is causing the packet to be dropped.
    
      tcp_gso_segment():
        [...]
        mss = skb_shinfo(skb)->gso_size;
        if (unlikely(skb->len <= mss)) goto out;
        [...]
    
    Thus changing the gso_size is simply a very bad idea. Increasing is unnecessary
    and buggy, and decreasing can go negative.
    
    Fixes: 6578171a7ff0 ("bpf: add bpf_skb_change_proto helper")
    Signed-off-by: Maciej Żenczykowski <maze@google.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Cc: Dongseok Yi <dseok.yi@samsung.com>
    Cc: Willem de Bruijn <willemb@google.com>
    Link: https://lore.kernel.org/bpf/CANP3RGfjLikQ6dg=YpBU0OeHvyv7JOki7CyOUS9modaXAi-9vQ@mail.gmail.com
    Link: https://lore.kernel.org/bpf/20210617000953.2787453-2-zenczykowski@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/core/filter.c b/net/core/filter.c
index 01561268d216..01496c7cb42d 100644
--- a/net/core/filter.c
+++ b/net/core/filter.c
@@ -2639,8 +2639,6 @@ static int bpf_skb_proto_4_to_6(struct sk_buff *skb)
 			shinfo->gso_type |=  SKB_GSO_TCPV6;
 		}
 
-		/* Due to IPv6 header, MSS needs to be downgraded. */
-		skb_decrease_gso_size(shinfo, len_diff);
 		/* Header must be checked, and gso_segs recomputed. */
 		shinfo->gso_type |= SKB_GSO_DODGY;
 		shinfo->gso_segs = 0;
@@ -2680,8 +2678,6 @@ static int bpf_skb_proto_6_to_4(struct sk_buff *skb)
 			shinfo->gso_type |=  SKB_GSO_TCPV4;
 		}
 
-		/* Due to IPv4 header, MSS can be upgraded. */
-		skb_increase_gso_size(shinfo, len_diff);
 		/* Header must be checked, and gso_segs recomputed. */
 		shinfo->gso_type |= SKB_GSO_DODGY;
 		shinfo->gso_segs = 0;

commit d317a20a84c434ae0a2011e551e6f400b995c32e
Author: Eric Dumazet <edumazet@google.com>
Date:   Wed Jun 23 08:27:00 2021 -0700

    ipv6: exthdrs: do not blindly use init_net
    
    [ Upstream commit bcc3f2a829b9edbe3da5fb117ee5a63686d31834 ]
    
    I see no reason why max_dst_opts_cnt and max_hbh_opts_cnt
    are fetched from the initial net namespace.
    
    The other sysctls (max_dst_opts_len & max_hbh_opts_len)
    are in fact already using the current ns.
    
    Note: it is not clear why ipv6_destopt_rcv() use two ways to
    get to the netns :
    
     1) dev_net(dst->dev)
        Originally used to increment IPSTATS_MIB_INHDRERRORS
    
     2) dev_net(skb->dev)
         Tom used this variant in his patch.
    
    Maybe this calls to use ipv6_skb_net() instead ?
    
    Fixes: 47d3d7ac656a ("ipv6: Implement limits on Hop-by-Hop and Destination options")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Cc: Tom Herbert <tom@quantonium.net>
    Cc: Coco Li <lixiaoyan@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c
index 20291c2036fc..68b8084da83a 100644
--- a/net/ipv6/exthdrs.c
+++ b/net/ipv6/exthdrs.c
@@ -309,7 +309,7 @@ static int ipv6_destopt_rcv(struct sk_buff *skb)
 #endif
 
 	if (ip6_parse_tlv(tlvprocdestopt_lst, skb,
-			  init_net.ipv6.sysctl.max_dst_opts_cnt)) {
+			  net->ipv6.sysctl.max_dst_opts_cnt)) {
 		skb->transport_header += extlen;
 		opt = IP6CB(skb);
 #if IS_ENABLED(CONFIG_IPV6_MIP6)
@@ -848,7 +848,7 @@ int ipv6_parse_hopopts(struct sk_buff *skb)
 
 	opt->flags |= IP6SKB_HOPBYHOP;
 	if (ip6_parse_tlv(tlvprochopopt_lst, skb,
-			  init_net.ipv6.sysctl.max_hbh_opts_cnt)) {
+			  net->ipv6.sysctl.max_hbh_opts_cnt)) {
 		skb->transport_header += extlen;
 		opt = IP6CB(skb);
 		opt->nhoff = sizeof(struct ipv6hdr);

commit 8d4032690ae961cf8a8ce7b8da7a5fdb84f5e470
Author: Jian-Hong Pan <jhp@endlessos.org>
Date:   Wed Jun 23 11:28:03 2021 +0800

    net: bcmgenet: Fix attaching to PYH failed on RPi 4B
    
    [ Upstream commit b2ac9800cfe0f8da16abc4e74e003440361c112e ]
    
    The Broadcom UniMAC MDIO bus from mdio-bcm-unimac module comes too late.
    So, GENET cannot find the ethernet PHY on UniMAC MDIO bus. This leads
    GENET fail to attach the PHY as following log:
    
    bcmgenet fd580000.ethernet: GENET 5.0 EPHY: 0x0000
    ...
    could not attach to PHY
    bcmgenet fd580000.ethernet eth0: failed to connect to PHY
    uart-pl011 fe201000.serial: no DMA platform data
    libphy: bcmgenet MII bus: probed
    ...
    unimac-mdio unimac-mdio.-19: Broadcom UniMAC MDIO bus
    
    This patch adds the soft dependency to load mdio-bcm-unimac module
    before genet module to avoid the issue.
    
    Fixes: 9a4e79697009 ("net: bcmgenet: utilize generic Broadcom UniMAC MDIO controller driver")
    Buglink: https://bugzilla.kernel.org/show_bug.cgi?id=213485
    Signed-off-by: Jian-Hong Pan <jhp@endlessos.org>
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index c3e824f5e50e..1546a9bd9203 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -3750,3 +3750,4 @@ MODULE_AUTHOR("Broadcom Corporation");
 MODULE_DESCRIPTION("Broadcom GENET Ethernet controller driver");
 MODULE_ALIAS("platform:bcmgenet");
 MODULE_LICENSE("GPL");
+MODULE_SOFTDEP("pre: mdio-bcm-unimac");

commit 2f001552df5e3e183ed80e1fc60fcbd7698b0904
Author: Ping-Ke Shih <pkshih@realtek.com>
Date:   Wed Jun 23 21:48:25 2021 +0800

    mac80211: remove iwlwifi specific workaround NDPs of null_response
    
    [ Upstream commit 744757e46bf13ec3a7b3507d17ab3faab9516d43 ]
    
    Remove the remaining workaround that is not removed by the
    commit e41eb3e408de ("mac80211: remove iwlwifi specific workaround
    that broke sta NDP tx")
    
    Fixes: 41cbb0f5a295 ("mac80211: add support for HE")
    Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
    Link: https://lore.kernel.org/r/20210623134826.10318-1-pkshih@realtek.com
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
index 71c6a462277f..3a907ba7f763 100644
--- a/net/mac80211/sta_info.c
+++ b/net/mac80211/sta_info.c
@@ -1344,11 +1344,6 @@ static void ieee80211_send_null_response(struct sta_info *sta, int tid,
 	struct ieee80211_tx_info *info;
 	struct ieee80211_chanctx_conf *chanctx_conf;
 
-	/* Don't send NDPs when STA is connected HE */
-	if (sdata->vif.type == NL80211_IFTYPE_STATION &&
-	    !(sdata->u.mgd.flags & IEEE80211_STA_DISABLE_HE))
-		return;
-
 	if (qos) {
 		fc = cpu_to_le16(IEEE80211_FTYPE_DATA |
 				 IEEE80211_STYPE_QOS_NULLFUNC |

commit 567001688c862158318557a9bd03b6c077c3392a
Author: Eric Dumazet <edumazet@google.com>
Date:   Mon Jun 21 11:02:44 2021 -0700

    ieee802154: hwsim: avoid possible crash in hwsim_del_edge_nl()
    
    [ Upstream commit 0303b30375dff5351a79cc2c3c87dfa4fda29bed ]
    
    Both MAC802154_HWSIM_ATTR_RADIO_ID and MAC802154_HWSIM_ATTR_RADIO_EDGE
    must be present to avoid a crash.
    
    Fixes: f25da51fdc38 ("ieee802154: hwsim: add replacement for fakelb")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Cc: Alexander Aring <alex.aring@gmail.com>
    Cc: Stefan Schmidt <stefan@datenfreihafen.org>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Acked-by: Alexander Aring <aahringo@redhat.com>
    Link: https://lore.kernel.org/r/20210621180244.882076-1-eric.dumazet@gmail.com
    Signed-off-by: Stefan Schmidt <stefan@datenfreihafen.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ieee802154/mac802154_hwsim.c b/drivers/net/ieee802154/mac802154_hwsim.c
index 6cda4aa4f680..06aadebc2d5b 100644
--- a/drivers/net/ieee802154/mac802154_hwsim.c
+++ b/drivers/net/ieee802154/mac802154_hwsim.c
@@ -496,7 +496,7 @@ static int hwsim_del_edge_nl(struct sk_buff *msg, struct genl_info *info)
 	struct hwsim_edge *e;
 	u32 v0, v1;
 
-	if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID] &&
+	if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID] ||
 	    !info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE])
 		return -EINVAL;
 

commit 6d8dcd49ddd9665580237a639266be63c8567f26
Author: Dongliang Mu <mudongliangabcd@gmail.com>
Date:   Wed Jun 16 10:09:01 2021 +0800

    ieee802154: hwsim: Fix memory leak in hwsim_add_one
    
    [ Upstream commit 28a5501c3383f0e6643012c187b7c2027ef42aea ]
    
    No matter from hwsim_remove or hwsim_del_radio_nl, hwsim_del fails to
    remove the entry in the edges list. Take the example below, phy0, phy1
    and e0 will be deleted, resulting in e1 not freed and accessed in the
    future.
    
                  hwsim_phys
                      |
        ------------------------------
        |                            |
    phy0 (edges)                 phy1 (edges)
       ----> e1 (idx = 1)             ----> e0 (idx = 0)
    
    Fix this by deleting and freeing all the entries in the edges list
    between hwsim_edge_unsubscribe_me and list_del(&phy->list).
    
    Reported-by: syzbot+b80c9959009a9325cdff@syzkaller.appspotmail.com
    Fixes: 1c9f4a3fce77 ("ieee802154: hwsim: fix rcu handling")
    Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Acked-by: Alexander Aring <aahringo@redhat.com>
    Link: https://lore.kernel.org/r/20210616020901.2759466-1-mudongliangabcd@gmail.com
    Signed-off-by: Stefan Schmidt <stefan@datenfreihafen.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ieee802154/mac802154_hwsim.c b/drivers/net/ieee802154/mac802154_hwsim.c
index c66a010650e0..6cda4aa4f680 100644
--- a/drivers/net/ieee802154/mac802154_hwsim.c
+++ b/drivers/net/ieee802154/mac802154_hwsim.c
@@ -843,12 +843,17 @@ static int hwsim_add_one(struct genl_info *info, struct device *dev,
 static void hwsim_del(struct hwsim_phy *phy)
 {
 	struct hwsim_pib *pib;
+	struct hwsim_edge *e;
 
 	hwsim_edge_unsubscribe_me(phy);
 
 	list_del(&phy->list);
 
 	rcu_read_lock();
+	list_for_each_entry_rcu(e, &phy->edges, list) {
+		list_del_rcu(&e->list);
+		hwsim_free_edge(e);
+	}
 	pib = rcu_dereference(phy->pib);
 	rcu_read_unlock();
 

commit 0cb6b100b869164dcd4b48e8c236e0a9f1c8c0ad
Author: Miao Wang <shankerwangmiao@gmail.com>
Date:   Tue Jun 22 12:24:50 2021 +0800

    net/ipv4: swap flow ports when validating source
    
    [ Upstream commit c69f114d09891adfa3e301a35d9e872b8b7b5a50 ]
    
    When doing source address validation, the flowi4 struct used for
    fib_lookup should be in the reverse direction to the given skb.
    fl4_dport and fl4_sport returned by fib4_rules_early_flow_dissect
    should thus be swapped.
    
    Fixes: 5a847a6e1477 ("net/ipv4: Initialize proto and ports in flow struct")
    Signed-off-by: Miao Wang <shankerwangmiao@gmail.com>
    Reviewed-by: David Ahern <dsahern@kernel.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
index b96aa88087be..70e5e9e5d835 100644
--- a/net/ipv4/fib_frontend.c
+++ b/net/ipv4/fib_frontend.c
@@ -353,6 +353,8 @@ static int __fib_validate_source(struct sk_buff *skb, __be32 src, __be32 dst,
 		fl4.flowi4_proto = 0;
 		fl4.fl4_sport = 0;
 		fl4.fl4_dport = 0;
+	} else {
+		swap(fl4.fl4_sport, fl4.fl4_dport);
 	}
 
 	if (fib_lookup(net, &fl4, &res, 0))

commit f80201ff7937fddb039716ba5948775b485d7646
Author: Eric Dumazet <edumazet@google.com>
Date:   Mon Jun 21 07:44:17 2021 -0700

    vxlan: add missing rcu_read_lock() in neigh_reduce()
    
    [ Upstream commit 85e8b032d6ebb0f698a34dd22c2f13443d905888 ]
    
    syzbot complained in neigh_reduce(), because rcu_read_lock_bh()
    is treated differently than rcu_read_lock()
    
    WARNING: suspicious RCU usage
    5.13.0-rc6-syzkaller #0 Not tainted
    -----------------------------
    include/net/addrconf.h:313 suspicious rcu_dereference_check() usage!
    
    other info that might help us debug this:
    
    rcu_scheduler_active = 2, debug_locks = 1
    3 locks held by kworker/0:0/5:
     #0: ffff888011064d38 ((wq_completion)events){+.+.}-{0:0}, at: arch_atomic64_set arch/x86/include/asm/atomic64_64.h:34 [inline]
     #0: ffff888011064d38 ((wq_completion)events){+.+.}-{0:0}, at: atomic64_set include/asm-generic/atomic-instrumented.h:856 [inline]
     #0: ffff888011064d38 ((wq_completion)events){+.+.}-{0:0}, at: atomic_long_set include/asm-generic/atomic-long.h:41 [inline]
     #0: ffff888011064d38 ((wq_completion)events){+.+.}-{0:0}, at: set_work_data kernel/workqueue.c:617 [inline]
     #0: ffff888011064d38 ((wq_completion)events){+.+.}-{0:0}, at: set_work_pool_and_clear_pending kernel/workqueue.c:644 [inline]
     #0: ffff888011064d38 ((wq_completion)events){+.+.}-{0:0}, at: process_one_work+0x871/0x1600 kernel/workqueue.c:2247
     #1: ffffc90000ca7da8 ((work_completion)(&port->wq)){+.+.}-{0:0}, at: process_one_work+0x8a5/0x1600 kernel/workqueue.c:2251
     #2: ffffffff8bf795c0 (rcu_read_lock_bh){....}-{1:2}, at: __dev_queue_xmit+0x1da/0x3130 net/core/dev.c:4180
    
    stack backtrace:
    CPU: 0 PID: 5 Comm: kworker/0:0 Not tainted 5.13.0-rc6-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    Workqueue: events ipvlan_process_multicast
    Call Trace:
     __dump_stack lib/dump_stack.c:79 [inline]
     dump_stack+0x141/0x1d7 lib/dump_stack.c:120
     __in6_dev_get include/net/addrconf.h:313 [inline]
     __in6_dev_get include/net/addrconf.h:311 [inline]
     neigh_reduce drivers/net/vxlan.c:2167 [inline]
     vxlan_xmit+0x34d5/0x4c30 drivers/net/vxlan.c:2919
     __netdev_start_xmit include/linux/netdevice.h:4944 [inline]
     netdev_start_xmit include/linux/netdevice.h:4958 [inline]
     xmit_one net/core/dev.c:3654 [inline]
     dev_hard_start_xmit+0x1eb/0x920 net/core/dev.c:3670
     __dev_queue_xmit+0x2133/0x3130 net/core/dev.c:4246
     ipvlan_process_multicast+0xa99/0xd70 drivers/net/ipvlan/ipvlan_core.c:287
     process_one_work+0x98d/0x1600 kernel/workqueue.c:2276
     worker_thread+0x64c/0x1120 kernel/workqueue.c:2422
     kthread+0x3b1/0x4a0 kernel/kthread.c:313
     ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:294
    
    Fixes: f564f45c4518 ("vxlan: add ipv6 proxy support")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
index 49e8c6d42cda..eacc1e32d547 100644
--- a/drivers/net/vxlan.c
+++ b/drivers/net/vxlan.c
@@ -1682,6 +1682,7 @@ static int neigh_reduce(struct net_device *dev, struct sk_buff *skb, __be32 vni)
 	struct neighbour *n;
 	struct nd_msg *msg;
 
+	rcu_read_lock();
 	in6_dev = __in6_dev_get(dev);
 	if (!in6_dev)
 		goto out;
@@ -1733,6 +1734,7 @@ static int neigh_reduce(struct net_device *dev, struct sk_buff *skb, __be32 vni)
 	}
 
 out:
+	rcu_read_unlock();
 	consume_skb(skb);
 	return NETDEV_TX_OK;
 }

commit 98fd088c325429327fc5ddb0b12c6a203ebf7f30
Author: Eric Dumazet <edumazet@google.com>
Date:   Mon Jun 21 10:54:49 2021 -0700

    pkt_sched: sch_qfq: fix qfq_change_class() error path
    
    [ Upstream commit 0cd58e5c53babb9237b741dbef711f0a9eb6d3fd ]
    
    If qfq_change_class() is unable to allocate memory for qfq_aggregate,
    it frees the class that has been inserted in the class hash table,
    but does not unhash it.
    
    Defer the insertion after the problematic allocation.
    
    BUG: KASAN: use-after-free in hlist_add_head include/linux/list.h:884 [inline]
    BUG: KASAN: use-after-free in qdisc_class_hash_insert+0x200/0x210 net/sched/sch_api.c:731
    Write of size 8 at addr ffff88814a534f10 by task syz-executor.4/31478
    
    CPU: 0 PID: 31478 Comm: syz-executor.4 Not tainted 5.13.0-rc6-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    Call Trace:
     __dump_stack lib/dump_stack.c:79 [inline]
     dump_stack+0x141/0x1d7 lib/dump_stack.c:120
     print_address_description.constprop.0.cold+0x5b/0x2f8 mm/kasan/report.c:233
     __kasan_report mm/kasan/report.c:419 [inline]
     kasan_report.cold+0x7c/0xd8 mm/kasan/report.c:436
     hlist_add_head include/linux/list.h:884 [inline]
     qdisc_class_hash_insert+0x200/0x210 net/sched/sch_api.c:731
     qfq_change_class+0x96c/0x1990 net/sched/sch_qfq.c:489
     tc_ctl_tclass+0x514/0xe50 net/sched/sch_api.c:2113
     rtnetlink_rcv_msg+0x44e/0xad0 net/core/rtnetlink.c:5564
     netlink_rcv_skb+0x153/0x420 net/netlink/af_netlink.c:2504
     netlink_unicast_kernel net/netlink/af_netlink.c:1314 [inline]
     netlink_unicast+0x533/0x7d0 net/netlink/af_netlink.c:1340
     netlink_sendmsg+0x856/0xd90 net/netlink/af_netlink.c:1929
     sock_sendmsg_nosec net/socket.c:654 [inline]
     sock_sendmsg+0xcf/0x120 net/socket.c:674
     ____sys_sendmsg+0x6e8/0x810 net/socket.c:2350
     ___sys_sendmsg+0xf3/0x170 net/socket.c:2404
     __sys_sendmsg+0xe5/0x1b0 net/socket.c:2433
     do_syscall_64+0x3a/0xb0 arch/x86/entry/common.c:47
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    RIP: 0033:0x4665d9
    Code: ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 bc ff ff ff f7 d8 64 89 01 48
    RSP: 002b:00007fdc7b5f0188 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
    RAX: ffffffffffffffda RBX: 000000000056bf80 RCX: 00000000004665d9
    RDX: 0000000000000000 RSI: 00000000200001c0 RDI: 0000000000000003
    RBP: 00007fdc7b5f01d0 R08: 0000000000000000 R09: 0000000000000000
    R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000002
    R13: 00007ffcf7310b3f R14: 00007fdc7b5f0300 R15: 0000000000022000
    
    Allocated by task 31445:
     kasan_save_stack+0x1b/0x40 mm/kasan/common.c:38
     kasan_set_track mm/kasan/common.c:46 [inline]
     set_alloc_info mm/kasan/common.c:428 [inline]
     ____kasan_kmalloc mm/kasan/common.c:507 [inline]
     ____kasan_kmalloc mm/kasan/common.c:466 [inline]
     __kasan_kmalloc+0x9b/0xd0 mm/kasan/common.c:516
     kmalloc include/linux/slab.h:556 [inline]
     kzalloc include/linux/slab.h:686 [inline]
     qfq_change_class+0x705/0x1990 net/sched/sch_qfq.c:464
     tc_ctl_tclass+0x514/0xe50 net/sched/sch_api.c:2113
     rtnetlink_rcv_msg+0x44e/0xad0 net/core/rtnetlink.c:5564
     netlink_rcv_skb+0x153/0x420 net/netlink/af_netlink.c:2504
     netlink_unicast_kernel net/netlink/af_netlink.c:1314 [inline]
     netlink_unicast+0x533/0x7d0 net/netlink/af_netlink.c:1340
     netlink_sendmsg+0x856/0xd90 net/netlink/af_netlink.c:1929
     sock_sendmsg_nosec net/socket.c:654 [inline]
     sock_sendmsg+0xcf/0x120 net/socket.c:674
     ____sys_sendmsg+0x6e8/0x810 net/socket.c:2350
     ___sys_sendmsg+0xf3/0x170 net/socket.c:2404
     __sys_sendmsg+0xe5/0x1b0 net/socket.c:2433
     do_syscall_64+0x3a/0xb0 arch/x86/entry/common.c:47
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Freed by task 31445:
     kasan_save_stack+0x1b/0x40 mm/kasan/common.c:38
     kasan_set_track+0x1c/0x30 mm/kasan/common.c:46
     kasan_set_free_info+0x20/0x30 mm/kasan/generic.c:357
     ____kasan_slab_free mm/kasan/common.c:360 [inline]
     ____kasan_slab_free mm/kasan/common.c:325 [inline]
     __kasan_slab_free+0xfb/0x130 mm/kasan/common.c:368
     kasan_slab_free include/linux/kasan.h:212 [inline]
     slab_free_hook mm/slub.c:1583 [inline]
     slab_free_freelist_hook+0xdf/0x240 mm/slub.c:1608
     slab_free mm/slub.c:3168 [inline]
     kfree+0xe5/0x7f0 mm/slub.c:4212
     qfq_change_class+0x10fb/0x1990 net/sched/sch_qfq.c:518
     tc_ctl_tclass+0x514/0xe50 net/sched/sch_api.c:2113
     rtnetlink_rcv_msg+0x44e/0xad0 net/core/rtnetlink.c:5564
     netlink_rcv_skb+0x153/0x420 net/netlink/af_netlink.c:2504
     netlink_unicast_kernel net/netlink/af_netlink.c:1314 [inline]
     netlink_unicast+0x533/0x7d0 net/netlink/af_netlink.c:1340
     netlink_sendmsg+0x856/0xd90 net/netlink/af_netlink.c:1929
     sock_sendmsg_nosec net/socket.c:654 [inline]
     sock_sendmsg+0xcf/0x120 net/socket.c:674
     ____sys_sendmsg+0x6e8/0x810 net/socket.c:2350
     ___sys_sendmsg+0xf3/0x170 net/socket.c:2404
     __sys_sendmsg+0xe5/0x1b0 net/socket.c:2433
     do_syscall_64+0x3a/0xb0 arch/x86/entry/common.c:47
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    The buggy address belongs to the object at ffff88814a534f00
     which belongs to the cache kmalloc-128 of size 128
    The buggy address is located 16 bytes inside of
     128-byte region [ffff88814a534f00, ffff88814a534f80)
    The buggy address belongs to the page:
    page:ffffea0005294d00 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x14a534
    flags: 0x57ff00000000200(slab|node=1|zone=2|lastcpupid=0x7ff)
    raw: 057ff00000000200 ffffea00004fee00 0000000600000006 ffff8880110418c0
    raw: 0000000000000000 0000000000100010 00000001ffffffff 0000000000000000
    page dumped because: kasan: bad access detected
    page_owner tracks the page as allocated
    page last allocated via order 0, migratetype Unmovable, gfp_mask 0x12cc0(GFP_KERNEL|__GFP_NOWARN|__GFP_NORETRY), pid 29797, ts 604817765317, free_ts 604810151744
     prep_new_page mm/page_alloc.c:2358 [inline]
     get_page_from_freelist+0x1033/0x2b60 mm/page_alloc.c:3994
     __alloc_pages+0x1b2/0x500 mm/page_alloc.c:5200
     alloc_pages+0x18c/0x2a0 mm/mempolicy.c:2272
     alloc_slab_page mm/slub.c:1646 [inline]
     allocate_slab+0x2c5/0x4c0 mm/slub.c:1786
     new_slab mm/slub.c:1849 [inline]
     new_slab_objects mm/slub.c:2595 [inline]
     ___slab_alloc+0x4a1/0x810 mm/slub.c:2758
     __slab_alloc.constprop.0+0xa7/0xf0 mm/slub.c:2798
     slab_alloc_node mm/slub.c:2880 [inline]
     slab_alloc mm/slub.c:2922 [inline]
     __kmalloc+0x315/0x330 mm/slub.c:4050
     kmalloc include/linux/slab.h:561 [inline]
     kzalloc include/linux/slab.h:686 [inline]
     __register_sysctl_table+0x112/0x1090 fs/proc/proc_sysctl.c:1318
     mpls_dev_sysctl_register+0x1b7/0x2d0 net/mpls/af_mpls.c:1421
     mpls_add_dev net/mpls/af_mpls.c:1472 [inline]
     mpls_dev_notify+0x214/0x8b0 net/mpls/af_mpls.c:1588
     notifier_call_chain+0xb5/0x200 kernel/notifier.c:83
     call_netdevice_notifiers_info+0xb5/0x130 net/core/dev.c:2121
     call_netdevice_notifiers_extack net/core/dev.c:2133 [inline]
     call_netdevice_notifiers net/core/dev.c:2147 [inline]
     register_netdevice+0x106b/0x1500 net/core/dev.c:10312
     veth_newlink+0x585/0xac0 drivers/net/veth.c:1547
     __rtnl_newlink+0x1062/0x1710 net/core/rtnetlink.c:3452
     rtnl_newlink+0x64/0xa0 net/core/rtnetlink.c:3500
    page last free stack trace:
     reset_page_owner include/linux/page_owner.h:24 [inline]
     free_pages_prepare mm/page_alloc.c:1298 [inline]
     free_pcp_prepare+0x223/0x300 mm/page_alloc.c:1342
     free_unref_page_prepare mm/page_alloc.c:3250 [inline]
     free_unref_page+0x12/0x1d0 mm/page_alloc.c:3298
     __vunmap+0x783/0xb60 mm/vmalloc.c:2566
     free_work+0x58/0x70 mm/vmalloc.c:80
     process_one_work+0x98d/0x1600 kernel/workqueue.c:2276
     worker_thread+0x64c/0x1120 kernel/workqueue.c:2422
     kthread+0x3b1/0x4a0 kernel/kthread.c:313
     ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:294
    
    Memory state around the buggy address:
     ffff88814a534e00: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
     ffff88814a534e80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    >ffff88814a534f00: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
                             ^
     ffff88814a534f80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
     ffff88814a535000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    
    Fixes: 462dbc9101acd ("pkt_sched: QFQ Plus: fair-queueing service at DRR cost")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sched/sch_qfq.c b/net/sched/sch_qfq.c
index bb1a9c11fc54..a93402fe1a9f 100644
--- a/net/sched/sch_qfq.c
+++ b/net/sched/sch_qfq.c
@@ -497,11 +497,6 @@ static int qfq_change_class(struct Qdisc *sch, u32 classid, u32 parentid,
 
 	if (cl->qdisc != &noop_qdisc)
 		qdisc_hash_add(cl->qdisc, true);
-	sch_tree_lock(sch);
-	qdisc_class_hash_insert(&q->clhash, &cl->common);
-	sch_tree_unlock(sch);
-
-	qdisc_class_hash_grow(sch, &q->clhash);
 
 set_change_agg:
 	sch_tree_lock(sch);
@@ -519,8 +514,11 @@ static int qfq_change_class(struct Qdisc *sch, u32 classid, u32 parentid,
 	}
 	if (existing)
 		qfq_deact_rm_from_agg(q, cl);
+	else
+		qdisc_class_hash_insert(&q->clhash, &cl->common);
 	qfq_add_to_agg(q, new_agg, cl);
 	sch_tree_unlock(sch);
+	qdisc_class_hash_grow(sch, &q->clhash);
 
 	*arg = (unsigned long)cl;
 	return 0;

commit fb9107d4fa7dddc351bd6ce77fefacd360ad1f66
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Fri Jun 18 19:14:47 2021 +0300

    net: ethernet: ezchip: fix error handling
    
    [ Upstream commit 0de449d599594f5472e00267d651615c7f2c6c1d ]
    
    As documented at drivers/base/platform.c for platform_get_irq:
    
     * Gets an IRQ for a platform device and prints an error message if finding the
     * IRQ fails. Device drivers should check the return value for errors so as to
     * not pass a negative integer value to the request_irq() APIs.
    
    So, the driver should check that platform_get_irq() return value
    is _negative_, not that it's equal to zero, because -ENXIO (return
    value from request_irq() if irq was not found) will
    pass this check and it leads to passing negative irq to request_irq()
    
    Fixes: 0dd077093636 ("NET: Add ezchip ethernet driver")
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/ezchip/nps_enet.c b/drivers/net/ethernet/ezchip/nps_enet.c
index fbadf08b7c5d..70ccbd11b9e7 100644
--- a/drivers/net/ethernet/ezchip/nps_enet.c
+++ b/drivers/net/ethernet/ezchip/nps_enet.c
@@ -623,7 +623,7 @@ static s32 nps_enet_probe(struct platform_device *pdev)
 
 	/* Get IRQ number */
 	priv->irq = platform_get_irq(pdev, 0);
-	if (!priv->irq) {
+	if (priv->irq < 0) {
 		dev_err(dev, "failed to retrieve <irq Rx-Tx> value from device tree\n");
 		err = -ENODEV;
 		goto out_netdev;

commit e85822aada6f2cf80397c48ef31ab2c856724ac3
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Fri Jun 18 19:14:31 2021 +0300

    net: ethernet: ezchip: fix UAF in nps_enet_remove
    
    [ Upstream commit e4b8700e07a86e8eab6916aa5c5ba99042c34089 ]
    
    priv is netdev private data, but it is used
    after free_netdev(). It can cause use-after-free when accessing priv
    pointer. So, fix it by moving free_netdev() after netif_napi_del()
    call.
    
    Fixes: 0dd077093636 ("NET: Add ezchip ethernet driver")
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/ezchip/nps_enet.c b/drivers/net/ethernet/ezchip/nps_enet.c
index 659f1ad37e96..fbadf08b7c5d 100644
--- a/drivers/net/ethernet/ezchip/nps_enet.c
+++ b/drivers/net/ethernet/ezchip/nps_enet.c
@@ -658,8 +658,8 @@ static s32 nps_enet_remove(struct platform_device *pdev)
 	struct nps_enet_priv *priv = netdev_priv(ndev);
 
 	unregister_netdev(ndev);
-	free_netdev(ndev);
 	netif_napi_del(&priv->napi);
+	free_netdev(ndev);
 
 	return 0;
 }

commit c8212ca64ef9df4c1c29552b3667d32f4754f6f7
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Fri Jun 18 17:57:31 2021 +0300

    net: ethernet: aeroflex: fix UAF in greth_of_remove
    
    [ Upstream commit e3a5de6d81d8b2199935c7eb3f7d17a50a7075b7 ]
    
    static int greth_of_remove(struct platform_device *of_dev)
    {
    ...
            struct greth_private *greth = netdev_priv(ndev);
    ...
            unregister_netdev(ndev);
            free_netdev(ndev);
    
            of_iounmap(&of_dev->resource[0], greth->regs, resource_size(&of_dev->resource[0]));
    ...
    }
    
    greth is netdev private data, but it is used
    after free_netdev(). It can cause use-after-free when accessing greth
    pointer. So, fix it by moving free_netdev() after of_iounmap()
    call.
    
    Fixes: d4c41139df6e ("net: Add Aeroflex Gaisler 10/100/1G Ethernet MAC driver")
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/aeroflex/greth.c b/drivers/net/ethernet/aeroflex/greth.c
index 4309be3724ad..a20e95b39cf7 100644
--- a/drivers/net/ethernet/aeroflex/greth.c
+++ b/drivers/net/ethernet/aeroflex/greth.c
@@ -1546,10 +1546,11 @@ static int greth_of_remove(struct platform_device *of_dev)
 	mdiobus_unregister(greth->mdio);
 
 	unregister_netdev(ndev);
-	free_netdev(ndev);
 
 	of_iounmap(&of_dev->resource[0], greth->regs, resource_size(&of_dev->resource[0]));
 
+	free_netdev(ndev);
+
 	return 0;
 }
 

commit b86fdd413e4296e1e3b282b405e32d2da8f1ea23
Author: Wang Hai <wanghai38@huawei.com>
Date:   Wed Jun 16 12:25:34 2021 +0800

    samples/bpf: Fix the error return code of xdp_redirect's main()
    
    [ Upstream commit 7c6090ee2a7b3315410cfc83a94c3eb057407b25 ]
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    If bpf_map_update_elem() failed, main() should return a negative error.
    
    Fixes: 832622e6bd18 ("xdp: sample program for new bpf_redirect helper")
    Signed-off-by: Wang Hai <wanghai38@huawei.com>
    Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/bpf/20210616042534.315097-1-wanghai38@huawei.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/samples/bpf/xdp_redirect_user.c b/samples/bpf/xdp_redirect_user.c
index 81a69e36cb78..0f96a26b6ec5 100644
--- a/samples/bpf/xdp_redirect_user.c
+++ b/samples/bpf/xdp_redirect_user.c
@@ -146,5 +146,5 @@ int main(int argc, char **argv)
 	poll_stats(2, ifindex_out);
 
 out:
-	return 0;
+	return ret;
 }

commit 1853dabfd1516682192cd40595feaa86e69a3bba
Author: Bob Pearson <rpearsonhpe@gmail.com>
Date:   Fri Jun 4 18:05:59 2021 -0500

    RDMA/rxe: Fix qp reference counting for atomic ops
    
    [ Upstream commit 15ae1375ea91ae2dee6f12d71a79d8c0a10a30bf ]
    
    Currently the rdma_rxe driver attempts to protect atomic responder
    resources by taking a reference to the qp which is only freed when the
    resource is recycled for a new read or atomic operation. This means that
    in normal circumstances there is almost always an extra qp reference once
    an atomic operation has been executed which prevents cleaning up the qp
    and associated pd and cqs when the qp is destroyed.
    
    This patch removes the call to rxe_add_ref() in send_atomic_ack() and the
    call to rxe_drop_ref() in free_rd_atomic_resource(). If the qp is
    destroyed while a peer is retrying an atomic op it will cause the
    operation to fail which is acceptable.
    
    Link: https://lore.kernel.org/r/20210604230558.4812-1-rpearsonhpe@gmail.com
    Reported-by: Zhu Yanjun <zyjzyj2000@gmail.com>
    Fixes: 86af61764151 ("IB/rxe: remove unnecessary skb_clone")
    Signed-off-by: Bob Pearson <rpearsonhpe@gmail.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c b/drivers/infiniband/sw/rxe/rxe_qp.c
index 41c9ede98c26..4798b718b085 100644
--- a/drivers/infiniband/sw/rxe/rxe_qp.c
+++ b/drivers/infiniband/sw/rxe/rxe_qp.c
@@ -151,7 +151,6 @@ static void free_rd_atomic_resources(struct rxe_qp *qp)
 void free_rd_atomic_resource(struct rxe_qp *qp, struct resp_res *res)
 {
 	if (res->type == RXE_ATOMIC_MASK) {
-		rxe_drop_ref(qp);
 		kfree_skb(res->atomic.skb);
 	} else if (res->type == RXE_READ_MASK) {
 		if (res->read.mr)
diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c b/drivers/infiniband/sw/rxe/rxe_resp.c
index 9078cfd3b8bd..b36d364f0fb5 100644
--- a/drivers/infiniband/sw/rxe/rxe_resp.c
+++ b/drivers/infiniband/sw/rxe/rxe_resp.c
@@ -999,8 +999,6 @@ static int send_atomic_ack(struct rxe_qp *qp, struct rxe_pkt_info *pkt,
 		goto out;
 	}
 
-	rxe_add_ref(qp);
-
 	res = &qp->resp.resources[qp->resp.res_head];
 	free_rd_atomic_resource(qp, res);
 	rxe_advance_resp_resource(qp);

commit 6b97694d0a76c7b5f5e374dab2a3b1ef54899dc7
Author: Pablo Neira Ayuso <pablo@netfilter.org>
Date:   Fri Jun 11 19:26:56 2021 +0200

    netfilter: nft_tproxy: restrict support to TCP and UDP transport protocols
    
    [ Upstream commit 52f0f4e178c757b3d356087376aad8bd77271828 ]
    
    Add unfront check for TCP and UDP packets before performing further
    processing.
    
    Fixes: 4ed8eb6570a4 ("netfilter: nf_tables: Add native tproxy support")
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netfilter/nft_tproxy.c b/net/netfilter/nft_tproxy.c
index 95980154ef02..b97ab1198b03 100644
--- a/net/netfilter/nft_tproxy.c
+++ b/net/netfilter/nft_tproxy.c
@@ -30,6 +30,12 @@ static void nft_tproxy_eval_v4(const struct nft_expr *expr,
 	__be16 tport = 0;
 	struct sock *sk;
 
+	if (pkt->tprot != IPPROTO_TCP &&
+	    pkt->tprot != IPPROTO_UDP) {
+		regs->verdict.code = NFT_BREAK;
+		return;
+	}
+
 	hp = skb_header_pointer(skb, ip_hdrlen(skb), sizeof(_hdr), &_hdr);
 	if (!hp) {
 		regs->verdict.code = NFT_BREAK;
@@ -91,7 +97,8 @@ static void nft_tproxy_eval_v6(const struct nft_expr *expr,
 
 	memset(&taddr, 0, sizeof(taddr));
 
-	if (!pkt->tprot_set) {
+	if (pkt->tprot != IPPROTO_TCP &&
+	    pkt->tprot != IPPROTO_UDP) {
 		regs->verdict.code = NFT_BREAK;
 		return;
 	}

commit 3225cd78880a15928f8930e3de698a6edca63f42
Author: Pablo Neira Ayuso <pablo@netfilter.org>
Date:   Thu Jun 10 20:20:31 2021 +0200

    netfilter: nft_osf: check for TCP packet before further processing
    
    [ Upstream commit 8f518d43f89ae00b9cf5460e10b91694944ca1a8 ]
    
    The osf expression only supports for TCP packets, add a upfront sanity
    check to skip packet parsing if this is not a TCP packet.
    
    Fixes: b96af92d6eaf ("netfilter: nf_tables: implement Passive OS fingerprint module in nft_osf")
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netfilter/nft_osf.c b/net/netfilter/nft_osf.c
index a003533ff4d9..e259454b6a64 100644
--- a/net/netfilter/nft_osf.c
+++ b/net/netfilter/nft_osf.c
@@ -22,6 +22,11 @@ static void nft_osf_eval(const struct nft_expr *expr, struct nft_regs *regs,
 	struct tcphdr _tcph;
 	const char *os_name;
 
+	if (pkt->tprot != IPPROTO_TCP) {
+		regs->verdict.code = NFT_BREAK;
+		return;
+	}
+
 	tcp = skb_header_pointer(skb, ip_hdrlen(skb),
 				 sizeof(struct tcphdr), &_tcph);
 	if (!tcp) {

commit 0cb785dd9e42be71ec92fee8ef984c0a1e64dab3
Author: Pablo Neira Ayuso <pablo@netfilter.org>
Date:   Thu Jun 10 20:20:30 2021 +0200

    netfilter: nft_exthdr: check for IPv6 packet before further processing
    
    [ Upstream commit cdd73cc545c0fb9b1a1f7b209f4f536e7990cff4 ]
    
    ipv6_find_hdr() does not validate that this is an IPv6 packet. Add a
    sanity check for calling ipv6_find_hdr() to make sure an IPv6 packet
    is passed for parsing.
    
    Fixes: 96518518cc41 ("netfilter: add nftables")
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netfilter/nft_exthdr.c b/net/netfilter/nft_exthdr.c
index a940c9fd9045..64e69d6683ca 100644
--- a/net/netfilter/nft_exthdr.c
+++ b/net/netfilter/nft_exthdr.c
@@ -45,6 +45,9 @@ static void nft_exthdr_ipv6_eval(const struct nft_expr *expr,
 	unsigned int offset = 0;
 	int err;
 
+	if (pkt->skb->protocol != htons(ETH_P_IPV6))
+		goto err;
+
 	err = ipv6_find_hdr(pkt->skb, &offset, priv->type, NULL, NULL);
 	if (priv->flags & NFT_EXTHDR_F_PRESENT) {
 		*dest = (err >= 0);

commit 6c9629af44238a87f1283fbe20b671f741c17c55
Author: Leon Romanovsky <leonro@nvidia.com>
Date:   Mon May 31 19:04:44 2021 +0300

    RDMA/mlx5: Don't add slave port to unaffiliated list
    
    [ Upstream commit 7ce6095e3bff8e20ce018b050960b527e298f7df ]
    
    The mlx5_ib_bind_slave_port() doesn't remove multiport device from the
    unaffiliated list, but mlx5_ib_unbind_slave_port() did it. This unbalanced
    flow caused to the situation where mlx5_ib_unaffiliated_port_list was
    changed during iteration.
    
    Fixes: 32f69e4be269 ("{net, IB}/mlx5: Manage port association for multiport RoCE")
    Link: https://lore.kernel.org/r/2726e6603b1e6ecfe76aa5a12a063af72173bcf7.1622477058.git.leonro@nvidia.com
    Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index 13513466df01..eaf9de421f8d 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -5374,8 +5374,6 @@ static void mlx5_ib_unbind_slave_port(struct mlx5_ib_dev *ibdev,
 
 	port->mp.mpi = NULL;
 
-	list_add_tail(&mpi->list, &mlx5_ib_unaffiliated_port_list);
-
 	spin_unlock(&port->mp.mpi_lock);
 
 	err = mlx5_nic_vport_unaffiliate_multiport(mpi->mdev);
@@ -5525,6 +5523,8 @@ static void mlx5_ib_cleanup_multiport_master(struct mlx5_ib_dev *dev)
 			} else {
 				mlx5_ib_dbg(dev, "unbinding port_num: %d\n", i + 1);
 				mlx5_ib_unbind_slave_port(dev, dev->port[i].mp.mpi);
+				list_add_tail(&dev->port[i].mp.mpi->list,
+					      &mlx5_ib_unaffiliated_port_list);
 			}
 		}
 	}

commit 0b6201184892db5c055ae6a02069460b61c3b62a
Author: Liu Shixin <liushixin2@huawei.com>
Date:   Tue Jun 15 10:14:44 2021 +0800

    netlabel: Fix memory leak in netlbl_mgmt_add_common
    
    [ Upstream commit b8f6b0522c298ae9267bd6584e19b942a0636910 ]
    
    Hulk Robot reported memory leak in netlbl_mgmt_add_common.
    The problem is non-freed map in case of netlbl_domhsh_add() failed.
    
    BUG: memory leak
    unreferenced object 0xffff888100ab7080 (size 96):
      comm "syz-executor537", pid 360, jiffies 4294862456 (age 22.678s)
      hex dump (first 32 bytes):
        05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        fe 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01  ................
      backtrace:
        [<0000000008b40026>] netlbl_mgmt_add_common.isra.0+0xb2a/0x1b40
        [<000000003be10950>] netlbl_mgmt_add+0x271/0x3c0
        [<00000000c70487ed>] genl_family_rcv_msg_doit.isra.0+0x20e/0x320
        [<000000001f2ff614>] genl_rcv_msg+0x2bf/0x4f0
        [<0000000089045792>] netlink_rcv_skb+0x134/0x3d0
        [<0000000020e96fdd>] genl_rcv+0x24/0x40
        [<0000000042810c66>] netlink_unicast+0x4a0/0x6a0
        [<000000002e1659f0>] netlink_sendmsg+0x789/0xc70
        [<000000006e43415f>] sock_sendmsg+0x139/0x170
        [<00000000680a73d7>] ____sys_sendmsg+0x658/0x7d0
        [<0000000065cbb8af>] ___sys_sendmsg+0xf8/0x170
        [<0000000019932b6c>] __sys_sendmsg+0xd3/0x190
        [<00000000643ac172>] do_syscall_64+0x37/0x90
        [<000000009b79d6dc>] entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Fixes: 63c416887437 ("netlabel: Add network address selectors to the NetLabel/LSM domain mapping")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Liu Shixin <liushixin2@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netlabel/netlabel_mgmt.c b/net/netlabel/netlabel_mgmt.c
index 21e0095b1d14..71ba69cb50c9 100644
--- a/net/netlabel/netlabel_mgmt.c
+++ b/net/netlabel/netlabel_mgmt.c
@@ -90,6 +90,7 @@ static const struct nla_policy netlbl_mgmt_genl_policy[NLBL_MGMT_A_MAX + 1] = {
 static int netlbl_mgmt_add_common(struct genl_info *info,
 				  struct netlbl_audit *audit_info)
 {
+	void *pmap = NULL;
 	int ret_val = -EINVAL;
 	struct netlbl_domaddr_map *addrmap = NULL;
 	struct cipso_v4_doi *cipsov4 = NULL;
@@ -189,6 +190,7 @@ static int netlbl_mgmt_add_common(struct genl_info *info,
 			ret_val = -ENOMEM;
 			goto add_free_addrmap;
 		}
+		pmap = map;
 		map->list.addr = addr->s_addr & mask->s_addr;
 		map->list.mask = mask->s_addr;
 		map->list.valid = 1;
@@ -197,10 +199,8 @@ static int netlbl_mgmt_add_common(struct genl_info *info,
 			map->def.cipso = cipsov4;
 
 		ret_val = netlbl_af4list_add(&map->list, &addrmap->list4);
-		if (ret_val != 0) {
-			kfree(map);
-			goto add_free_addrmap;
-		}
+		if (ret_val != 0)
+			goto add_free_map;
 
 		entry->family = AF_INET;
 		entry->def.type = NETLBL_NLTYPE_ADDRSELECT;
@@ -237,6 +237,7 @@ static int netlbl_mgmt_add_common(struct genl_info *info,
 			ret_val = -ENOMEM;
 			goto add_free_addrmap;
 		}
+		pmap = map;
 		map->list.addr = *addr;
 		map->list.addr.s6_addr32[0] &= mask->s6_addr32[0];
 		map->list.addr.s6_addr32[1] &= mask->s6_addr32[1];
@@ -249,10 +250,8 @@ static int netlbl_mgmt_add_common(struct genl_info *info,
 			map->def.calipso = calipso;
 
 		ret_val = netlbl_af6list_add(&map->list, &addrmap->list6);
-		if (ret_val != 0) {
-			kfree(map);
-			goto add_free_addrmap;
-		}
+		if (ret_val != 0)
+			goto add_free_map;
 
 		entry->family = AF_INET6;
 		entry->def.type = NETLBL_NLTYPE_ADDRSELECT;
@@ -262,10 +261,12 @@ static int netlbl_mgmt_add_common(struct genl_info *info,
 
 	ret_val = netlbl_domhsh_add(entry, audit_info);
 	if (ret_val != 0)
-		goto add_free_addrmap;
+		goto add_free_map;
 
 	return 0;
 
+add_free_map:
+	kfree(pmap);
 add_free_addrmap:
 	kfree(addrmap);
 add_doi_put_def:

commit 5fbf4772fce975c381294a519a7d65b4df174e28
Author: Yang Li <yang.lee@linux.alibaba.com>
Date:   Tue May 25 18:46:17 2021 +0800

    ath10k: Fix an error code in ath10k_add_interface()
    
    [ Upstream commit e9ca70c735ce66fc6a0e02c8b6958434f74ef8de ]
    
    When the code execute this if statement, the value of ret is 0.
    However, we can see from the ath10k_warn() log that the value of
    ret should be -EINVAL.
    
    Clean up smatch warning:
    
    drivers/net/wireless/ath/ath10k/mac.c:5596 ath10k_add_interface() warn:
    missing error code 'ret'
    
    Reported-by: Abaci Robot <abaci@linux.alibaba.com>
    Fixes: ccec9038c721 ("ath10k: enable raw encap mode and software crypto engine")
    Signed-off-by: Yang Li <yang.lee@linux.alibaba.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/1621939577-62218-1-git-send-email-yang.lee@linux.alibaba.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index f32d35e03708..8102d684be59 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -5125,6 +5125,7 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
 
 	if (arvif->nohwcrypt &&
 	    !test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
+		ret = -EINVAL;
 		ath10k_warn(ar, "cryptmode module param needed for sw crypto\n");
 		goto err;
 	}

commit 50ada21768e26c5de136e84457bf893953a1dd97
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Wed May 12 22:58:30 2021 +0200

    brcmsmac: mac80211_if: Fix a resource leak in an error handling path
    
    [ Upstream commit 9a25344d5177c2b9285532236dc3d10a091f39a8 ]
    
    If 'brcms_attach()' fails, we must undo the previous 'ieee80211_alloc_hw()'
    as already done in the remove function.
    
    Fixes: 5b435de0d786 ("net: wireless: add brcm80211 drivers")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/8fbc171a1a493b38db5a6f0873c6021fca026a6c.1620852921.git.christophe.jaillet@wanadoo.fr
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
index 6188275b17e5..288d4d4d4454 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
@@ -1223,6 +1223,7 @@ static int brcms_bcma_probe(struct bcma_device *pdev)
 {
 	struct brcms_info *wl;
 	struct ieee80211_hw *hw;
+	int ret;
 
 	dev_info(&pdev->dev, "mfg %x core %x rev %d class %d irq %d\n",
 		 pdev->id.manuf, pdev->id.id, pdev->id.rev, pdev->id.class,
@@ -1247,11 +1248,16 @@ static int brcms_bcma_probe(struct bcma_device *pdev)
 	wl = brcms_attach(pdev);
 	if (!wl) {
 		pr_err("%s: brcms_attach failed!\n", __func__);
-		return -ENODEV;
+		ret = -ENODEV;
+		goto err_free_ieee80211;
 	}
 	brcms_led_register(wl);
 
 	return 0;
+
+err_free_ieee80211:
+	ieee80211_free_hw(hw);
+	return ret;
 }
 
 static int brcms_suspend(struct bcma_device *pdev)

commit bb33ddef99caa291283cf51b6bc917013da3c6f6
Author: Alvin ?ipraga <ALSI@bang-olufsen.dk>
Date:   Thu May 6 13:20:12 2021 +0000

    brcmfmac: correctly report average RSSI in station info
    
    [ Upstream commit 9a1590934d9a02e570636432b93052c0c035f31f ]
    
    The rx_lastpkt_rssi field provided by the firmware is suitable for
    NL80211_STA_INFO_{SIGNAL,CHAIN_SIGNAL}, while the rssi field is an
    average. Fix up the assignments and set the correct STA_INFO bits. This
    lets userspace know that the average RSSI is part of the station info.
    
    Fixes: cae355dc90db ("brcmfmac: Add RSSI information to get_station.")
    Signed-off-by: Alvin ?ipraga <alsi@bang-olufsen.dk>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210506132010.3964484-2-alsi@bang-olufsen.dk
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
index de8fd5780932..75790b13c962 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
@@ -2543,8 +2543,9 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
 	struct brcmf_sta_info_le sta_info_le;
 	u32 sta_flags;
 	u32 is_tdls_peer;
-	s32 total_rssi;
-	s32 count_rssi;
+	s32 total_rssi_avg = 0;
+	s32 total_rssi = 0;
+	s32 count_rssi = 0;
 	int rssi;
 	u32 i;
 
@@ -2610,24 +2611,27 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES);
 			sinfo->rx_bytes = le64_to_cpu(sta_info_le.rx_tot_bytes);
 		}
-		total_rssi = 0;
-		count_rssi = 0;
 		for (i = 0; i < BRCMF_ANT_MAX; i++) {
-			if (sta_info_le.rssi[i]) {
-				sinfo->chains |= BIT(count_rssi);
-				sinfo->chain_signal_avg[count_rssi] =
-					sta_info_le.rssi[i];
-				sinfo->chain_signal[count_rssi] =
-					sta_info_le.rssi[i];
-				total_rssi += sta_info_le.rssi[i];
-				count_rssi++;
-			}
+			if (sta_info_le.rssi[i] == 0 ||
+			    sta_info_le.rx_lastpkt_rssi[i] == 0)
+				continue;
+			sinfo->chains |= BIT(count_rssi);
+			sinfo->chain_signal[count_rssi] =
+				sta_info_le.rx_lastpkt_rssi[i];
+			sinfo->chain_signal_avg[count_rssi] =
+				sta_info_le.rssi[i];
+			total_rssi += sta_info_le.rx_lastpkt_rssi[i];
+			total_rssi_avg += sta_info_le.rssi[i];
+			count_rssi++;
 		}
 		if (count_rssi) {
-			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
-			total_rssi /= count_rssi;
-			sinfo->signal = total_rssi;
+			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
+			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
+			sinfo->filled |=
+				BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG);
+			sinfo->signal = total_rssi / count_rssi;
+			sinfo->signal_avg = total_rssi_avg / count_rssi;
 		} else if (test_bit(BRCMF_VIF_STATUS_CONNECTED,
 			&ifp->vif->sme_state)) {
 			memset(&scb_val, 0, sizeof(scb_val));

commit f5c8dbcb2a08aa2ccf7c94e26e2aa67ac0a4f399
Author: Alvin ?ipraga <ALSI@bang-olufsen.dk>
Date:   Thu May 6 13:20:12 2021 +0000

    brcmfmac: fix setting of station info chains bitmask
    
    [ Upstream commit feb45643762172110cb3a44f99dd54304f33b711 ]
    
    The sinfo->chains field is a bitmask for filled values in chain_signal
    and chain_signal_avg, not a count. Treat it as such so that the driver
    can properly report per-chain RSSI information.
    
    Before (MIMO mode):
    
      $ iw dev wlan0 station dump
          ...
          signal: -51 [-51] dBm
    
    After (MIMO mode):
    
      $ iw dev wlan0 station dump
          ...
          signal: -53 [-53, -54] dBm
    
    Fixes: cae355dc90db ("brcmfmac: Add RSSI information to get_station.")
    Signed-off-by: Alvin ?ipraga <alsi@bang-olufsen.dk>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210506132010.3964484-1-alsi@bang-olufsen.dk
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
index 96dc9e5ab23f..de8fd5780932 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
@@ -2614,6 +2614,7 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
 		count_rssi = 0;
 		for (i = 0; i < BRCMF_ANT_MAX; i++) {
 			if (sta_info_le.rssi[i]) {
+				sinfo->chains |= BIT(count_rssi);
 				sinfo->chain_signal_avg[count_rssi] =
 					sta_info_le.rssi[i];
 				sinfo->chain_signal[count_rssi] =
@@ -2624,8 +2625,6 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
 		}
 		if (count_rssi) {
 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
-			sinfo->chains = count_rssi;
-
 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
 			total_rssi /= count_rssi;
 			sinfo->signal = total_rssi;

commit a05091c9b2ef89c7d8c891dd420bd133fcd29176
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Sat May 15 15:29:49 2021 +0800

    ssb: Fix error return code in ssb_bus_scan()
    
    [ Upstream commit 77a0989baa427dbd242c5784d05a53ca3d197d43 ]
    
    Fix to return -EINVAL from the error handling case instead of 0, as done
    elsewhere in this function.
    
    Fixes: 61e115a56d1a ("[SSB]: add Sonics Silicon Backplane bus support")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Acked-by: Michael Büsch <m@bues.ch>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210515072949.7151-1-thunder.leizhen@huawei.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/ssb/scan.c b/drivers/ssb/scan.c
index 6ceee98ed6ff..5c7e61cafd19 100644
--- a/drivers/ssb/scan.c
+++ b/drivers/ssb/scan.c
@@ -325,6 +325,7 @@ int ssb_bus_scan(struct ssb_bus *bus,
 	if (bus->nr_devices > ARRAY_SIZE(bus->devices)) {
 		pr_err("More than %d ssb cores found (%d)\n",
 		       SSB_MAX_NR_CORES, bus->nr_devices);
+		err = -EINVAL;
 		goto err_unmap;
 	}
 	if (bus->bustype == SSB_BUSTYPE_SSB) {

commit 0418cb6b7fe3eb1bd18e9eda5e1f401e8faad838
Author: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Date:   Sat Jun 5 18:33:47 2021 +0100

    wcn36xx: Move hal_buf allocation to devm_kmalloc in probe
    
    [ Upstream commit ef48667557c53d4b51a1ee3090eab7699324c9de ]
    
    Right now wcn->hal_buf is allocated in wcn36xx_start(). This is a problem
    since we should have setup all of the buffers we required by the time
    ieee80211_register_hw() is called.
    
    struct ieee80211_ops callbacks may run prior to mac_start() and therefore
    wcn->hal_buf must be initialized.
    
    This is easily remediated by moving the allocation to probe() taking the
    opportunity to tidy up freeing memory by using devm_kmalloc().
    
    Fixes: 8e84c2582169 ("wcn36xx: mac80211 driver for Qualcomm WCN3660/WCN3680 hardware")
    Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210605173347.2266003-1-bryan.odonoghue@linaro.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c
index 46ae4ec4ad47..556ba3c6c5d8 100644
--- a/drivers/net/wireless/ath/wcn36xx/main.c
+++ b/drivers/net/wireless/ath/wcn36xx/main.c
@@ -293,23 +293,16 @@ static int wcn36xx_start(struct ieee80211_hw *hw)
 		goto out_free_dxe_pool;
 	}
 
-	wcn->hal_buf = kmalloc(WCN36XX_HAL_BUF_SIZE, GFP_KERNEL);
-	if (!wcn->hal_buf) {
-		wcn36xx_err("Failed to allocate smd buf\n");
-		ret = -ENOMEM;
-		goto out_free_dxe_ctl;
-	}
-
 	ret = wcn36xx_smd_load_nv(wcn);
 	if (ret) {
 		wcn36xx_err("Failed to push NV to chip\n");
-		goto out_free_smd_buf;
+		goto out_free_dxe_ctl;
 	}
 
 	ret = wcn36xx_smd_start(wcn);
 	if (ret) {
 		wcn36xx_err("Failed to start chip\n");
-		goto out_free_smd_buf;
+		goto out_free_dxe_ctl;
 	}
 
 	if (!wcn36xx_is_fw_version(wcn, 1, 2, 2, 24)) {
@@ -336,8 +329,6 @@ static int wcn36xx_start(struct ieee80211_hw *hw)
 
 out_smd_stop:
 	wcn36xx_smd_stop(wcn);
-out_free_smd_buf:
-	kfree(wcn->hal_buf);
 out_free_dxe_ctl:
 	wcn36xx_dxe_free_ctl_blks(wcn);
 out_free_dxe_pool:
@@ -374,8 +365,6 @@ static void wcn36xx_stop(struct ieee80211_hw *hw)
 
 	wcn36xx_dxe_free_mem_pools(wcn);
 	wcn36xx_dxe_free_ctl_blks(wcn);
-
-	kfree(wcn->hal_buf);
 }
 
 static int wcn36xx_config(struct ieee80211_hw *hw, u32 changed)
@@ -1322,6 +1311,12 @@ static int wcn36xx_probe(struct platform_device *pdev)
 	mutex_init(&wcn->hal_mutex);
 	mutex_init(&wcn->scan_lock);
 
+	wcn->hal_buf = devm_kmalloc(wcn->dev, WCN36XX_HAL_BUF_SIZE, GFP_KERNEL);
+	if (!wcn->hal_buf) {
+		ret = -ENOMEM;
+		goto out_wq;
+	}
+
 	ret = dma_set_mask_and_coherent(wcn->dev, DMA_BIT_MASK(32));
 	if (ret < 0) {
 		wcn36xx_err("failed to set DMA mask: %d\n", ret);

commit 82edefd4a3cc3abddfb63cbe55df23eeb2291245
Author: Dongliang Mu <mudongliangabcd@gmail.com>
Date:   Fri Jun 11 09:58:12 2021 +0800

    ieee802154: hwsim: Fix possible memory leak in hwsim_subscribe_all_others
    
    [ Upstream commit ab372c2293f5d0b279f31c8d768566ea37602dc9 ]
    
    In hwsim_subscribe_all_others, the error handling code performs
    incorrectly if the second hwsim_alloc_edge fails. When this issue occurs,
    it goes to sub_fail, without cleaning the edges allocated before.
    
    Fixes: f25da51fdc38 ("ieee802154: hwsim: add replacement for fakelb")
    Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Acked-by: Alexander Aring <aahringo@redhat.com>
    Link: https://lore.kernel.org/r/20210611015812.1626999-1-mudongliangabcd@gmail.com
    Signed-off-by: Stefan Schmidt <stefan@datenfreihafen.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ieee802154/mac802154_hwsim.c b/drivers/net/ieee802154/mac802154_hwsim.c
index be1f1a86bcd6..c66a010650e0 100644
--- a/drivers/net/ieee802154/mac802154_hwsim.c
+++ b/drivers/net/ieee802154/mac802154_hwsim.c
@@ -734,6 +734,8 @@ static int hwsim_subscribe_all_others(struct hwsim_phy *phy)
 
 	return 0;
 
+sub_fail:
+	hwsim_edge_unsubscribe_me(phy);
 me_fail:
 	rcu_read_lock();
 	list_for_each_entry_rcu(e, &phy->edges, list) {
@@ -741,8 +743,6 @@ static int hwsim_subscribe_all_others(struct hwsim_phy *phy)
 		hwsim_free_edge(e);
 	}
 	rcu_read_unlock();
-sub_fail:
-	hwsim_edge_unsubscribe_me(phy);
 	return -ENOMEM;
 }
 

commit c957e3244fabdbfe3fbdd4e083f993d4dc7fcea1
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Mon May 31 17:41:28 2021 +0300

    wireless: carl9170: fix LEDS build errors & warnings
    
    [ Upstream commit 272fdc0c4542fad173b44965be02a16d6db95499 ]
    
    kernel test robot reports over 200 build errors and warnings
    that are due to this Kconfig problem when CARL9170=m,
    MAC80211=y, and LEDS_CLASS=m.
    
    WARNING: unmet direct dependencies detected for MAC80211_LEDS
      Depends on [n]: NET [=y] && WIRELESS [=y] && MAC80211 [=y] && (LEDS_CLASS [=m]=y || LEDS_CLASS [=m]=MAC80211 [=y])
      Selected by [m]:
      - CARL9170_LEDS [=y] && NETDEVICES [=y] && WLAN [=y] && WLAN_VENDOR_ATH [=y] && CARL9170 [=m]
    
    CARL9170_LEDS selects MAC80211_LEDS even though its kconfig
    dependencies are not met. This happens because 'select' does not follow
    any Kconfig dependency chains.
    
    Fix this by making CARL9170_LEDS depend on MAC80211_LEDS, where
    the latter supplies any needed dependencies on LEDS_CLASS.
    
    Fixes: 1d7e1e6b1b8ed ("carl9170: Makefile, Kconfig files and MAINTAINERS")
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Reported-by: kernel test robot <lkp@intel.com>
    Cc: Kalle Valo <kvalo@codeaurora.org>
    Cc: Christian Lamparter <chunkeey@googlemail.com>
    Cc: linux-wireless@vger.kernel.org
    Cc: Arnd Bergmann <arnd@arndb.de>
    Suggested-by: Christian Lamparter <chunkeey@googlemail.com>
    Acked-by: Arnd Bergmann <arnd@arndb.de>
    Acked-by: Christian Lamparter <chunkeey@gmail.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210530031134.23274-1-rdunlap@infradead.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/ath/carl9170/Kconfig b/drivers/net/wireless/ath/carl9170/Kconfig
index 2e34baeaf764..2b782db20fde 100644
--- a/drivers/net/wireless/ath/carl9170/Kconfig
+++ b/drivers/net/wireless/ath/carl9170/Kconfig
@@ -15,13 +15,11 @@ config CARL9170
 
 config CARL9170_LEDS
 	bool "SoftLED Support"
-	depends on CARL9170
-	select MAC80211_LEDS
-	select LEDS_CLASS
-	select NEW_LEDS
 	default y
+	depends on CARL9170
+	depends on MAC80211_LEDS
 	help
-	  This option is necessary, if you want your device' LEDs to blink
+	  This option is necessary, if you want your device's LEDs to blink.
 
 	  Say Y, unless you need the LEDs for firmware debugging.
 

commit 80680f3b1316fa4a39328b04756ea76e4ca8c389
Author: Zhihao Cheng <chengzhihao1@huawei.com>
Date:   Wed Jun 9 19:59:16 2021 +0800

    tools/bpftool: Fix error return code in do_batch()
    
    [ Upstream commit ca16b429f39b4ce013bfa7e197f25681e65a2a42 ]
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: 668da745af3c2 ("tools: bpftool: add support for quotations ...")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
    Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
    Reviewed-by: Quentin Monnet <quentin@isovalent.com>
    Link: https://lore.kernel.org/bpf/20210609115916.2186872-1-chengzhihao1@huawei.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/tools/bpf/bpftool/main.c b/tools/bpf/bpftool/main.c
index d15a62be6cf0..37610144f6b0 100644
--- a/tools/bpf/bpftool/main.c
+++ b/tools/bpf/bpftool/main.c
@@ -291,8 +291,10 @@ static int do_batch(int argc, char **argv)
 		n_argc = make_args(buf, n_argv, BATCH_ARG_NB_MAX, lines);
 		if (!n_argc)
 			continue;
-		if (n_argc < 0)
+		if (n_argc < 0) {
+			err = n_argc;
 			goto err_close;
+		}
 
 		if (json_output) {
 			jsonw_start_object(json_wtr);

commit 8dc74a8bbc05b3a1ee2765b547d9ca5d39cae687
Author: Colin Ian King <colin.king@canonical.com>
Date:   Tue Jun 8 17:13:13 2021 +0100

    drm: qxl: ensure surf.data is ininitialized
    
    [ Upstream commit fbbf23ddb2a1cc0c12c9f78237d1561c24006f50 ]
    
    The object surf is not fully initialized and the uninitialized
    field surf.data is being copied by the call to qxl_bo_create
    via the call to qxl_gem_object_create. Set surf.data to zero
    to ensure garbage data from the stack is not being copied.
    
    Addresses-Coverity: ("Uninitialized scalar variable")
    Fixes: f64122c1f6ad ("drm: add new QXL driver. (v1.4)")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/20210608161313.161922-1-colin.king@canonical.com
    Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/qxl/qxl_dumb.c b/drivers/gpu/drm/qxl/qxl_dumb.c
index c666b89eed5d..e89491b5155f 100644
--- a/drivers/gpu/drm/qxl/qxl_dumb.c
+++ b/drivers/gpu/drm/qxl/qxl_dumb.c
@@ -57,6 +57,8 @@ int qxl_mode_dumb_create(struct drm_file *file_priv,
 	surf.height = args->height;
 	surf.stride = pitch;
 	surf.format = format;
+	surf.data = 0;
+
 	r = qxl_gem_object_create_with_handle(qdev, file_priv,
 					      QXL_GEM_DOMAIN_VRAM,
 					      args->size, &surf, &qobj,

commit c92357b336e3f1344e0230f08a50a6112331161c
Author: Kamal Heib <kamalheib1@gmail.com>
Date:   Thu Jun 3 12:01:12 2021 +0300

    RDMA/rxe: Fix failure during driver load
    
    [ Upstream commit 32a25f2ea690dfaace19f7a3a916f5d7e1ddafe8 ]
    
    To avoid the following failure when trying to load the rdma_rxe module
    while IPv6 is disabled, add a check for EAFNOSUPPORT and ignore the
    failure, also delete the needless debug print from rxe_setup_udp_tunnel().
    
    $ modprobe rdma_rxe
    modprobe: ERROR: could not insert 'rdma_rxe': Operation not permitted
    
    Fixes: dfdd6158ca2c ("IB/rxe: Fix kernel panic in udp_setup_tunnel")
    Link: https://lore.kernel.org/r/20210603090112.36341-1-kamalheib1@gmail.com
    Reported-by: Yi Zhang <yi.zhang@redhat.com>
    Signed-off-by: Kamal Heib <kamalheib1@gmail.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c
index 04bfc36cc8d7..5874e8e8253d 100644
--- a/drivers/infiniband/sw/rxe/rxe_net.c
+++ b/drivers/infiniband/sw/rxe/rxe_net.c
@@ -290,10 +290,8 @@ static struct socket *rxe_setup_udp_tunnel(struct net *net, __be16 port,
 
 	/* Create UDP socket */
 	err = udp_sock_create(net, &udp_cfg, &sock);
-	if (err < 0) {
-		pr_err("failed to create udp socket. err = %d\n", err);
+	if (err < 0)
 		return ERR_PTR(err);
-	}
 
 	tnl_cfg.encap_type = 1;
 	tnl_cfg.encap_rcv = rxe_udp_encap_recv;
@@ -717,6 +715,12 @@ static int rxe_net_ipv6_init(void)
 
 	recv_sockets.sk6 = rxe_setup_udp_tunnel(&init_net,
 						htons(ROCE_V2_UDP_DPORT), true);
+	if (PTR_ERR(recv_sockets.sk6) == -EAFNOSUPPORT) {
+		recv_sockets.sk6 = NULL;
+		pr_warn("IPv6 is not supported, can not create a UDPv6 socket\n");
+		return 0;
+	}
+
 	if (IS_ERR(recv_sockets.sk6)) {
 		recv_sockets.sk6 = NULL;
 		pr_err("Failed to create IPv6 UDP tunnel\n");

commit 22d663bf6fcc43f67acead300884f1d98332822f
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Fri May 28 16:55:55 2021 +0800

    ehea: fix error return code in ehea_restart_qps()
    
    [ Upstream commit 015dbf5662fd689d581c0bc980711b073ca09a1a ]
    
    Fix to return -EFAULT from the error handling case instead of 0, as done
    elsewhere in this function.
    
    By the way, when get_zeroed_page() fails, directly return -ENOMEM to
    simplify code.
    
    Fixes: 2c69448bbced ("ehea: DLPAR memory add fix")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Link: https://lore.kernel.org/r/20210528085555.9390-1-thunder.leizhen@huawei.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/ibm/ehea/ehea_main.c b/drivers/net/ethernet/ibm/ehea/ehea_main.c
index 0f799e8e093c..5a1fe49030b1 100644
--- a/drivers/net/ethernet/ibm/ehea/ehea_main.c
+++ b/drivers/net/ethernet/ibm/ehea/ehea_main.c
@@ -2636,10 +2636,8 @@ static int ehea_restart_qps(struct net_device *dev)
 	u16 dummy16 = 0;
 
 	cb0 = (void *)get_zeroed_page(GFP_KERNEL);
-	if (!cb0) {
-		ret = -ENOMEM;
-		goto out;
-	}
+	if (!cb0)
+		return -ENOMEM;
 
 	for (i = 0; i < (port->num_def_qps); i++) {
 		struct ehea_port_res *pr =  &port->port_res[i];
@@ -2659,6 +2657,7 @@ static int ehea_restart_qps(struct net_device *dev)
 					    cb0);
 		if (hret != H_SUCCESS) {
 			netdev_err(dev, "query_ehea_qp failed (1)\n");
+			ret = -EFAULT;
 			goto out;
 		}
 
@@ -2671,6 +2670,7 @@ static int ehea_restart_qps(struct net_device *dev)
 					     &dummy64, &dummy16, &dummy16);
 		if (hret != H_SUCCESS) {
 			netdev_err(dev, "modify_ehea_qp failed (1)\n");
+			ret = -EFAULT;
 			goto out;
 		}
 
@@ -2679,6 +2679,7 @@ static int ehea_restart_qps(struct net_device *dev)
 					    cb0);
 		if (hret != H_SUCCESS) {
 			netdev_err(dev, "query_ehea_qp failed (2)\n");
+			ret = -EFAULT;
 			goto out;
 		}
 

commit 0715ea013f6e7beb183535933ee9fbbb051285e0
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Wed May 19 21:49:28 2021 +0800

    drm/rockchip: cdn-dp-core: add missing clk_disable_unprepare() on error in cdn_dp_grf_write()
    
    [ Upstream commit ae41d925c75b53798f289c69ee8d9f7d36432f6d ]
    
    After calling clk_prepare_enable(), clk_disable_unprepare() need
    be called when calling regmap_write() failed.
    
    Fixes: 1a0f7ed3abe2 ("drm/rockchip: cdn-dp: add cdn DP support for rk3399")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Signed-off-by: Heiko Stuebner <heiko@sntech.de>
    Link: https://patchwork.freedesktop.org/patch/msgid/20210519134928.2696617-1-yangyingliang@huawei.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c b/drivers/gpu/drm/rockchip/cdn-dp-core.c
index 8ad0d773dc33..3feab563e50a 100644
--- a/drivers/gpu/drm/rockchip/cdn-dp-core.c
+++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c
@@ -81,6 +81,7 @@ static int cdn_dp_grf_write(struct cdn_dp_device *dp,
 	ret = regmap_write(dp->grf, reg, val);
 	if (ret) {
 		DRM_DEV_ERROR(dp->dev, "Could not write to GRF: %d\n", ret);
+		clk_disable_unprepare(dp->grf_clk);
 		return ret;
 	}
 

commit 4de95ea6e064f0e519e4899d14705406e105f1bd
Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date:   Mon May 10 19:39:27 2021 +0300

    net: pch_gbe: Propagate error from devm_gpio_request_one()
    
    [ Upstream commit 9e3617a7b84512bf96c04f9cf82d1a7257d33794 ]
    
    If GPIO controller is not available yet we need to defer
    the probe of GBE until provider will become available.
    
    While here, drop GPIOF_EXPORT because it's deprecated and
    may not be available.
    
    Fixes: f1a26fdf5944 ("pch_gbe: Add MinnowBoard support")
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Tested-by: Flavio Suligoi <f.suligoi@asem.it>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
index 3a4225837049..70f3276539c4 100644
--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
+++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
@@ -2546,9 +2546,13 @@ static int pch_gbe_probe(struct pci_dev *pdev,
 	adapter->pdev = pdev;
 	adapter->hw.back = adapter;
 	adapter->hw.reg = pcim_iomap_table(pdev)[PCH_GBE_PCI_BAR];
+
 	adapter->pdata = (struct pch_gbe_privdata *)pci_id->driver_data;
-	if (adapter->pdata && adapter->pdata->platform_init)
-		adapter->pdata->platform_init(pdev);
+	if (adapter->pdata && adapter->pdata->platform_init) {
+		ret = adapter->pdata->platform_init(pdev);
+		if (ret)
+			goto err_free_netdev;
+	}
 
 	adapter->ptp_pdev =
 		pci_get_domain_bus_and_slot(pci_domain_nr(adapter->pdev->bus),
@@ -2643,7 +2647,7 @@ static int pch_gbe_probe(struct pci_dev *pdev,
  */
 static int pch_gbe_minnow_platform_init(struct pci_dev *pdev)
 {
-	unsigned long flags = GPIOF_DIR_OUT | GPIOF_INIT_HIGH | GPIOF_EXPORT;
+	unsigned long flags = GPIOF_OUT_INIT_HIGH;
 	unsigned gpio = MINNOW_PHY_RESET_GPIO;
 	int ret;
 

commit b4bbd7605fe1e7aa47de7ee6619ae5c84e653adc
Author: Andy Shevchenko <andy.shevchenko@gmail.com>
Date:   Mon May 10 12:58:05 2021 +0300

    net: mvpp2: Put fwnode in error case during ->probe()
    
    [ Upstream commit 71f0891c84dfdc448736082ab0a00acd29853896 ]
    
    In each iteration fwnode_for_each_available_child_node() bumps a reference
    counting of a loop variable followed by dropping in on a next iteration,
    
    Since in error case the loop is broken, we have to drop a reference count
    by ourselves. Do it for port_fwnode in error case during ->probe().
    
    Fixes: 248122212f68 ("net: mvpp2: use device_*/fwnode_* APIs instead of of_*")
    Cc: Marcin Wojtas <mw@semihalf.com>
    Signed-off-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
index bc5cfe062b10..e65750b3c44f 100644
--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
@@ -5314,6 +5314,8 @@ static int mvpp2_probe(struct platform_device *pdev)
 	return 0;
 
 err_port_probe:
+	fwnode_handle_put(port_fwnode);
+
 	i = 0;
 	fwnode_for_each_available_child_node(fwnode, port_fwnode) {
 		if (priv->port_list[i])

commit bbf4fff7b4e35472ca324ad6f57baf08b03aec63
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Mon Jun 28 19:34:01 2021 -0700

    ocfs2: fix snprintf() checking
    
    [ Upstream commit 54e948c60cc843b6e84dc44496edc91f51d2a28e ]
    
    The snprintf() function returns the number of bytes which would have been
    printed if the buffer was large enough.  In other words it can return ">=
    remain" but this code assumes it returns "== remain".
    
    The run time impact of this bug is not very severe.  The next iteration
    through the loop would trigger a WARN() when we pass a negative limit to
    snprintf().  We would then return success instead of -E2BIG.
    
    The kernel implementation of snprintf() will never return negatives so
    there is no need to check and I have deleted that dead code.
    
    Link: https://lkml.kernel.org/r/20210511135350.GV1955@kadam
    Fixes: a860f6eb4c6a ("ocfs2: sysfile interfaces for online file check")
    Fixes: 74ae4e104dfc ("ocfs2: Create stack glue sysfs files.")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
    Cc: Mark Fasheh <mark@fasheh.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Cc: Junxiao Bi <junxiao.bi@oracle.com>
    Cc: Changwei Ge <gechangwei@live.cn>
    Cc: Gang He <ghe@suse.com>
    Cc: Jun Piao <piaojun@huawei.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/ocfs2/filecheck.c b/fs/ocfs2/filecheck.c
index 1906cc962c4d..345ca9e14028 100644
--- a/fs/ocfs2/filecheck.c
+++ b/fs/ocfs2/filecheck.c
@@ -336,11 +336,7 @@ static ssize_t ocfs2_filecheck_attr_show(struct kobject *kobj,
 		ret = snprintf(buf + total, remain, "%lu\t\t%u\t%s\n",
 			       p->fe_ino, p->fe_done,
 			       ocfs2_filecheck_error(p->fe_status));
-		if (ret < 0) {
-			total = ret;
-			break;
-		}
-		if (ret == remain) {
+		if (ret >= remain) {
 			/* snprintf() didn't fit */
 			total = -E2BIG;
 			break;
diff --git a/fs/ocfs2/stackglue.c b/fs/ocfs2/stackglue.c
index c4b029c43464..e7eb08ac4215 100644
--- a/fs/ocfs2/stackglue.c
+++ b/fs/ocfs2/stackglue.c
@@ -510,11 +510,7 @@ static ssize_t ocfs2_loaded_cluster_plugins_show(struct kobject *kobj,
 	list_for_each_entry(p, &ocfs2_stack_list, sp_list) {
 		ret = snprintf(buf, remain, "%s\n",
 			       p->sp_name);
-		if (ret < 0) {
-			total = ret;
-			break;
-		}
-		if (ret == remain) {
+		if (ret >= remain) {
 			/* snprintf() didn't fit */
 			total = -E2BIG;
 			break;
@@ -541,7 +537,7 @@ static ssize_t ocfs2_active_cluster_plugin_show(struct kobject *kobj,
 	if (active_stack) {
 		ret = snprintf(buf, PAGE_SIZE, "%s\n",
 			       active_stack->sp_name);
-		if (ret == PAGE_SIZE)
+		if (ret >= PAGE_SIZE)
 			ret = -E2BIG;
 	}
 	spin_unlock(&ocfs2_stack_lock);

commit 30cfe6a081b701c34a7427e9044f0d62c2bd08a9
Author: Zhang Yi <yi.zhang@huawei.com>
Date:   Sat Jun 19 17:37:00 2021 +0800

    blk-wbt: make sure throttle is enabled properly
    
    [ Upstream commit 76a8040817b4b9c69b53f9b326987fa891b4082a ]
    
    After commit a79050434b45 ("blk-rq-qos: refactor out common elements of
    blk-wbt"), if throttle was disabled by wbt_disable_default(), we could
    not enable again, fix this by set enable_state back to
    WBT_STATE_ON_DEFAULT.
    
    Fixes: a79050434b45 ("blk-rq-qos: refactor out common elements of blk-wbt")
    Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
    Link: https://lore.kernel.org/r/20210619093700.920393-3-yi.zhang@huawei.com
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/block/blk-wbt.c b/block/blk-wbt.c
index 08623f37617f..880a41adde8f 100644
--- a/block/blk-wbt.c
+++ b/block/blk-wbt.c
@@ -704,9 +704,13 @@ void wbt_set_write_cache(struct request_queue *q, bool write_cache_on)
 void wbt_enable_default(struct request_queue *q)
 {
 	struct rq_qos *rqos = wbt_rq_qos(q);
+
 	/* Throttling already enabled? */
-	if (rqos)
+	if (rqos) {
+		if (RQWB(rqos)->enable_state == WBT_STATE_OFF_DEFAULT)
+			RQWB(rqos)->enable_state = WBT_STATE_ON_DEFAULT;
 		return;
+	}
 
 	/* Queue not registered? Maybe shutting down... */
 	if (!blk_queue_registered(q))

commit 327e0b2c0c4281cb9bc1c5814e4e999d0af1b1c7
Author: Zhang Yi <yi.zhang@huawei.com>
Date:   Sat Jun 19 17:36:59 2021 +0800

    blk-wbt: introduce a new disable state to prevent false positive by rwb_enabled()
    
    [ Upstream commit 1d0903d61e9645c6330b94247b96dd873dfc11c8 ]
    
    Now that we disable wbt by simply zero out rwb->wb_normal in
    wbt_disable_default() when switch elevator to bfq, but it's not safe
    because it will become false positive if we change queue depth. If it
    become false positive between wbt_wait() and wbt_track() when submit
    write request, it will lead to drop rqw->inflight to -1 in wbt_done(),
    which will end up trigger IO hung. Fix this issue by introduce a new
    state which mean the wbt was disabled.
    
    Fixes: a79050434b45 ("blk-rq-qos: refactor out common elements of blk-wbt")
    Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
    Link: https://lore.kernel.org/r/20210619093700.920393-2-yi.zhang@huawei.com
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/block/blk-wbt.c b/block/blk-wbt.c
index 50f2abfa1a60..08623f37617f 100644
--- a/block/blk-wbt.c
+++ b/block/blk-wbt.c
@@ -76,7 +76,8 @@ enum {
 
 static inline bool rwb_enabled(struct rq_wb *rwb)
 {
-	return rwb && rwb->wb_normal != 0;
+	return rwb && rwb->enable_state != WBT_STATE_OFF_DEFAULT &&
+		      rwb->wb_normal != 0;
 }
 
 static void wb_timestamp(struct rq_wb *rwb, unsigned long *var)
@@ -764,7 +765,7 @@ void wbt_disable_default(struct request_queue *q)
 	rwb = RQWB(rqos);
 	if (rwb->enable_state == WBT_STATE_ON_DEFAULT) {
 		blk_stat_deactivate(rwb->cb);
-		rwb->wb_normal = 0;
+		rwb->enable_state = WBT_STATE_OFF_DEFAULT;
 	}
 }
 EXPORT_SYMBOL_GPL(wbt_disable_default);
diff --git a/block/blk-wbt.h b/block/blk-wbt.h
index f47218d5b3b2..dd0d0f297d1e 100644
--- a/block/blk-wbt.h
+++ b/block/blk-wbt.h
@@ -34,6 +34,7 @@ enum {
 enum {
 	WBT_STATE_ON_DEFAULT	= 1,
 	WBT_STATE_ON_MANUAL	= 2,
+	WBT_STATE_OFF_DEFAULT
 };
 
 struct rq_wb {

commit 32afb981e38c0f68185eac93a673d9d9a7e260ca
Author: Krzysztof Wilczy?ski <kw@linux.com>
Date:   Thu Jun 3 17:12:01 2021 +0000

    ACPI: sysfs: Fix a buffer overrun problem with description_show()
    
    [ Upstream commit 888be6067b97132c3992866bbcf647572253ab3f ]
    
    Currently, a device description can be obtained using ACPI, if the _STR
    method exists for a particular device, and then exposed to the userspace
    via a sysfs object as a string value.
    
    If the _STR method is available for a given device then the data
    (usually a Unicode string) is read and stored in a buffer (of the
    ACPI_TYPE_BUFFER type) with a pointer to said buffer cached in the
    struct acpi_device_pnp for later access.
    
    The description_show() function is responsible for exposing the device
    description to the userspace via a corresponding sysfs object and
    internally calls the utf16s_to_utf8s() function with a pointer to the
    buffer that contains the Unicode string so that it can be converted from
    UTF16 encoding to UTF8 and thus allowing for the value to be safely
    stored and later displayed.
    
    When invoking the utf16s_to_utf8s() function, the description_show()
    function also sets a limit of the data that can be saved into a provided
    buffer as a result of the character conversion to be a total of
    PAGE_SIZE, and upon completion, the utf16s_to_utf8s() function returns
    an integer value denoting the number of bytes that have been written
    into the provided buffer.
    
    Following the execution of the utf16s_to_utf8s() a newline character
    will be added at the end of the resulting buffer so that when the value
    is read in the userspace through the sysfs object then it would include
    newline making it more accessible when working with the sysfs file
    system in the shell, etc.  Normally, this wouldn't be a problem, but if
    the function utf16s_to_utf8s() happens to return the number of bytes
    written to be precisely PAGE_SIZE, then we would overrun the buffer and
    write the newline character outside the allotted space which can have
    undefined consequences or result in a failure.
    
    To fix this buffer overrun, ensure that there always is enough space
    left for the newline character to be safely appended.
    
    Fixes: d1efe3c324ea ("ACPI: Add new sysfs interface to export device description")
    Signed-off-by: Krzysztof Wilczy?ski <kw@linux.com>
    Reviewed-by: Bjorn Helgaas <bhelgaas@google.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/acpi/device_sysfs.c b/drivers/acpi/device_sysfs.c
index b3b92c54cba8..f792b149a574 100644
--- a/drivers/acpi/device_sysfs.c
+++ b/drivers/acpi/device_sysfs.c
@@ -452,7 +452,7 @@ static ssize_t description_show(struct device *dev,
 		(wchar_t *)acpi_dev->pnp.str_obj->buffer.pointer,
 		acpi_dev->pnp.str_obj->buffer.length,
 		UTF16_LITTLE_ENDIAN, buf,
-		PAGE_SIZE);
+		PAGE_SIZE - 1);
 
 	buf[result++] = '\n';
 

commit f85e7b202aa2e664ce6f58ad5817f8cc39ae8eeb
Author: Herbert Xu <herbert@gondor.apana.org.au>
Date:   Thu Jun 17 15:57:12 2021 +0800

    crypto: nx - Fix RCU warning in nx842_OF_upd_status
    
    [ Upstream commit 2a96726bd0ccde4f12b9b9a9f61f7b1ac5af7e10 ]
    
    The function nx842_OF_upd_status triggers a sparse RCU warning when
    it directly dereferences the RCU-protected devdata.  This appears
    to be an accident as there was another variable of the same name
    that was passed in from the caller.
    
    After it was removed (because the main purpose of using it, to
    update the status member was itself removed) the global variable
    unintenionally stood in as its replacement.
    
    This patch restores the devdata parameter.
    
    Fixes: 90fd73f912f0 ("crypto: nx - remove pSeries NX 'status' field")
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/nx/nx-842-pseries.c b/drivers/crypto/nx/nx-842-pseries.c
index fa40edae231e..41f4950c9fc6 100644
--- a/drivers/crypto/nx/nx-842-pseries.c
+++ b/drivers/crypto/nx/nx-842-pseries.c
@@ -553,13 +553,15 @@ static int nx842_OF_set_defaults(struct nx842_devdata *devdata)
  * The status field indicates if the device is enabled when the status
  * is 'okay'.  Otherwise the device driver will be disabled.
  *
- * @prop - struct property point containing the maxsyncop for the update
+ * @devdata: struct nx842_devdata to use for dev_info
+ * @prop: struct property point containing the maxsyncop for the update
  *
  * Returns:
  *  0 - Device is available
  *  -ENODEV - Device is not available
  */
-static int nx842_OF_upd_status(struct property *prop)
+static int nx842_OF_upd_status(struct nx842_devdata *devdata,
+			       struct property *prop)
 {
 	const char *status = (const char *)prop->value;
 
@@ -773,7 +775,7 @@ static int nx842_OF_upd(struct property *new_prop)
 		goto out;
 
 	/* Perform property updates */
-	ret = nx842_OF_upd_status(status);
+	ret = nx842_OF_upd_status(new_devdata, status);
 	if (ret)
 		goto error_out;
 

commit ed556eef5fedd69219dfa8e0e3864347eff8e76e
Author: Mirko Vogt <mirko-dev|linux@nanl.de>
Date:   Mon Jun 14 16:45:07 2021 +0200

    spi: spi-sun6i: Fix chipselect/clock bug
    
    [ Upstream commit 0d7993b234c9fad8cb6bec6adfaa74694ba85ecb ]
    
    The current sun6i SPI implementation initializes the transfer too early,
    resulting in SCK going high before the transfer. When using an additional
    (gpio) chipselect with sun6i, the chipselect is asserted at a time when
    clock is high, making the SPI transfer fail.
    
    This is due to SUN6I_GBL_CTL_BUS_ENABLE being written into
    SUN6I_GBL_CTL_REG at an early stage. Moving that to the transfer
    function, hence, right before the transfer starts, mitigates that
    problem.
    
    Fixes: 3558fe900e8af (spi: sunxi: Add Allwinner A31 SPI controller driver)
    Signed-off-by: Mirko Vogt <mirko-dev|linux@nanl.de>
    Signed-off-by: Ralf Schlatterbeck <rsc@runtux.com>
    Link: https://lore.kernel.org/r/20210614144507.y3udezjfbko7eavv@runtux.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/spi/spi-sun6i.c b/drivers/spi/spi-sun6i.c
index 21a22d42818c..ef62366899ad 100644
--- a/drivers/spi/spi-sun6i.c
+++ b/drivers/spi/spi-sun6i.c
@@ -301,6 +301,10 @@ static int sun6i_spi_transfer_one(struct spi_master *master,
 	}
 
 	sun6i_spi_write(sspi, SUN6I_CLK_CTL_REG, reg);
+	/* Finally enable the bus - doing so before might raise SCK to HIGH */
+	reg = sun6i_spi_read(sspi, SUN6I_GBL_CTL_REG);
+	reg |= SUN6I_GBL_CTL_BUS_ENABLE;
+	sun6i_spi_write(sspi, SUN6I_GBL_CTL_REG, reg);
 
 	/* Setup the transfer now... */
 	if (sspi->tx_buf)
@@ -409,7 +413,7 @@ static int sun6i_spi_runtime_resume(struct device *dev)
 	}
 
 	sun6i_spi_write(sspi, SUN6I_GBL_CTL_REG,
-			SUN6I_GBL_CTL_BUS_ENABLE | SUN6I_GBL_CTL_MASTER | SUN6I_GBL_CTL_TP);
+			SUN6I_GBL_CTL_MASTER | SUN6I_GBL_CTL_TP);
 
 	return 0;
 

commit ea61234a1c593b2542fdd829212109f5067032e0
Author: David Sterba <dsterba@suse.com>
Date:   Tue Jul 7 18:38:05 2020 +0200

    btrfs: clear log tree recovering status if starting transaction fails
    
    [ Upstream commit 1aeb6b563aea18cd55c73cf666d1d3245a00f08c ]
    
    When a log recovery is in progress, lots of operations have to take that
    into account, so we keep this status per tree during the operation. Long
    time ago error handling revamp patch 79787eaab461 ("btrfs: replace many
    BUG_ONs with proper error handling") removed clearing of the status in
    an error branch. Add it back as was intended in e02119d5a7b4 ("Btrfs:
    Add a write ahead tree log to optimize synchronous operations").
    
    There are probably no visible effects, log replay is done only during
    mount and if it fails all structures are cleared so the stale status
    won't be kept.
    
    Fixes: 79787eaab461 ("btrfs: replace many BUG_ONs with proper error handling")
    Reviewed-by: Qu Wenruo <wqu@suse.com>
    Reviewed-by: Anand Jain <anand.jain@oracle.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index 93e59ce00174..3a7b7e9cb889 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -5970,6 +5970,7 @@ int btrfs_recover_log_trees(struct btrfs_root *log_root_tree)
 error:
 	if (wc.trans)
 		btrfs_end_transaction(wc.trans);
+	clear_bit(BTRFS_FS_LOG_RECOVERING, &fs_info->flags);
 	btrfs_free_path(path);
 	return ret;
 }

commit 96d87260d3e1878c3d48f57d84493d3c1a9f7b89
Author: Guenter Roeck <linux@roeck-us.net>
Date:   Wed May 26 08:40:16 2021 -0700

    hwmon: (max31790) Fix fan speed reporting for fan7..12
    
    [ Upstream commit cbbf244f0515af3472084f22b6213121b4a63835 ]
    
    Fans 7..12 do not have their own set of configuration registers.
    So far the code ignored that and read beyond the end of the configuration
    register range to get the tachometer period. This resulted in more or less
    random fan speed values for those fans.
    
    The datasheet is quite vague when it comes to defining the tachometer
    period for fans 7..12. Experiments confirm that the period is the same
    for both fans associated with a given set of configuration registers.
    
    Fixes: 54187ff9d766 ("hwmon: (max31790) Convert to use new hwmon registration API")
    Fixes: 195a4b4298a7 ("hwmon: Driver for Maxim MAX31790")
    Cc: Jan Kundrát <jan.kundrat@cesnet.cz>
    Reviewed-by: Jan Kundrát <jan.kundrat@cesnet.cz>
    Cc: Václav Kubernát <kubernat@cesnet.cz>
    Reviewed-by: Jan Kundrát <jan.kundrat@cesnet.cz>
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Link: https://lore.kernel.org/r/20210526154022.3223012-2-linux@roeck-us.net
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hwmon/max31790.c b/drivers/hwmon/max31790.c
index 281491cca510..66cf772de7d2 100644
--- a/drivers/hwmon/max31790.c
+++ b/drivers/hwmon/max31790.c
@@ -179,7 +179,7 @@ static int max31790_read_fan(struct device *dev, u32 attr, int channel,
 
 	switch (attr) {
 	case hwmon_fan_input:
-		sr = get_tach_period(data->fan_dynamics[channel]);
+		sr = get_tach_period(data->fan_dynamics[channel % NR_CHANNEL]);
 		rpm = RPM_FROM_REG(data->tach[channel], sr);
 		*val = rpm;
 		return 0;

commit 18604ddea7fb510930c78685c5dec7a16f6c8e70
Author: Guenter Roeck <linux@roeck-us.net>
Date:   Sat May 8 09:50:25 2021 -0700

    hwmon: (max31722) Remove non-standard ACPI device IDs
    
    [ Upstream commit 97387c2f06bcfd79d04a848d35517b32ee6dca7c ]
    
    Valid Maxim Integrated ACPI device IDs would start with MXIM,
    not with MAX1. On top of that, ACPI device IDs reflecting chip names
    are almost always invalid.
    
    Remove the invalid ACPI IDs.
    
    Fixes: 04e1e70afec6 ("hwmon: (max31722) Add support for MAX31722/MAX31723 temperature sensors")
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hwmon/max31722.c b/drivers/hwmon/max31722.c
index 30a100e70a0d..877c3d7dca01 100644
--- a/drivers/hwmon/max31722.c
+++ b/drivers/hwmon/max31722.c
@@ -9,7 +9,6 @@
  * directory of this archive for more details.
  */
 
-#include <linux/acpi.h>
 #include <linux/hwmon.h>
 #include <linux/hwmon-sysfs.h>
 #include <linux/kernel.h>
@@ -138,20 +137,12 @@ static const struct spi_device_id max31722_spi_id[] = {
 	{"max31723", 0},
 	{}
 };
-
-static const struct acpi_device_id __maybe_unused max31722_acpi_id[] = {
-	{"MAX31722", 0},
-	{"MAX31723", 0},
-	{}
-};
-
 MODULE_DEVICE_TABLE(spi, max31722_spi_id);
 
 static struct spi_driver max31722_driver = {
 	.driver = {
 		.name = "max31722",
 		.pm = &max31722_pm_ops,
-		.acpi_match_table = ACPI_PTR(max31722_acpi_id),
 	},
 	.probe =            max31722_probe,
 	.remove =           max31722_remove,

commit 4980ea4797249b179a2732170e58f579d08fa5b2
Author: Dillon Min <dillon.minfei@gmail.com>
Date:   Wed May 26 17:18:32 2021 +0200

    media: s5p-g2d: Fix a memory leak on ctx->fh.m2m_ctx
    
    [ Upstream commit 5d11e6aad1811ea293ee2996cec9124f7fccb661 ]
    
    The m2m_ctx resources was allocated by v4l2_m2m_ctx_init() in g2d_open()
    should be freed from g2d_release() when it's not used.
    
    Fix it
    
    Fixes: 918847341af0 ("[media] v4l: add G2D driver for s5p device family")
    Signed-off-by: Dillon Min <dillon.minfei@gmail.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/platform/s5p-g2d/g2d.c b/drivers/media/platform/s5p-g2d/g2d.c
index 1f58574d0b96..4cf5b559420f 100644
--- a/drivers/media/platform/s5p-g2d/g2d.c
+++ b/drivers/media/platform/s5p-g2d/g2d.c
@@ -285,6 +285,9 @@ static int g2d_release(struct file *file)
 	struct g2d_dev *dev = video_drvdata(file);
 	struct g2d_ctx *ctx = fh2ctx(file->private_data);
 
+	mutex_lock(&dev->mutex);
+	v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
+	mutex_unlock(&dev->mutex);
 	v4l2_ctrl_handler_free(&ctx->ctrl_handler);
 	v4l2_fh_del(&ctx->fh);
 	v4l2_fh_exit(&ctx->fh);

commit 841664338b920641a9289b75264a7f87f391baeb
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Sat May 8 10:03:21 2021 +0800

    mmc: usdhi6rol0: fix error return code in usdhi6_probe()
    
    [ Upstream commit 2f9ae69e5267f53e89e296fccee291975a85f0eb ]
    
    Fix to return a negative error code from the error handling case instead
    of 0, as done elsewhere in this function.
    
    Fixes: 75fa9ea6e3c0 ("mmc: add a driver for the Renesas usdhi6rol0 SD/SDIO host controller")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Link: https://lore.kernel.org/r/20210508020321.1677-1-thunder.leizhen@huawei.com
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mmc/host/usdhi6rol0.c b/drivers/mmc/host/usdhi6rol0.c
index ef3aa8b52078..b88728b686e8 100644
--- a/drivers/mmc/host/usdhi6rol0.c
+++ b/drivers/mmc/host/usdhi6rol0.c
@@ -1809,6 +1809,7 @@ static int usdhi6_probe(struct platform_device *pdev)
 
 	version = usdhi6_read(host, USDHI6_VERSION);
 	if ((version & 0xfff) != 0xa0d) {
+		ret = -EPERM;
 		dev_err(dev, "Version not recognized %x\n", version);
 		goto e_clk_off;
 	}

commit 278d1d2cfd56598a15c48356bfca28c1b5f421ba
Author: Gustavo A. R. Silva <gustavoars@kernel.org>
Date:   Wed Mar 10 19:40:43 2021 -0600

    media: siano: Fix out-of-bounds warnings in smscore_load_firmware_family2()
    
    [ Upstream commit 13dfead49db07225335d4f587a560a2210391a1a ]
    
    Rename struct sms_msg_data4 to sms_msg_data5 and increase the size of
    its msg_data array from 4 to 5 elements. Notice that at some point
    the 5th element of msg_data is being accessed in function
    smscore_load_firmware_family2():
    
    1006                 trigger_msg->msg_data[4] = 4; /* Task ID */
    
    Also, there is no need for the object _trigger_msg_ of type struct
    sms_msg_data *, when _msg_ can be used, directly. Notice that msg_data
    in struct sms_msg_data is a one-element array, which causes multiple
    out-of-bounds warnings when accessing beyond its first element
    in function smscore_load_firmware_family2():
    
     992                 struct sms_msg_data *trigger_msg =
     993                         (struct sms_msg_data *) msg;
     994
     995                 pr_debug("sending MSG_SMS_SWDOWNLOAD_TRIGGER_REQ\n");
     996                 SMS_INIT_MSG(&msg->x_msg_header,
     997                                 MSG_SMS_SWDOWNLOAD_TRIGGER_REQ,
     998                                 sizeof(struct sms_msg_hdr) +
     999                                 sizeof(u32) * 5);
    1000
    1001                 trigger_msg->msg_data[0] = firmware->start_address;
    1002                                         /* Entry point */
    1003                 trigger_msg->msg_data[1] = 6; /* Priority */
    1004                 trigger_msg->msg_data[2] = 0x200; /* Stack size */
    1005                 trigger_msg->msg_data[3] = 0; /* Parameter */
    1006                 trigger_msg->msg_data[4] = 4; /* Task ID */
    
    even when enough dynamic memory is allocated for _msg_:
    
     929         /* PAGE_SIZE buffer shall be enough and dma aligned */
     930         msg = kmalloc(PAGE_SIZE, GFP_KERNEL | coredev->gfp_buf_flags);
    
    but as _msg_ is casted to (struct sms_msg_data *):
    
     992                 struct sms_msg_data *trigger_msg =
     993                         (struct sms_msg_data *) msg;
    
    the out-of-bounds warnings are actually valid and should be addressed.
    
    Fix this by declaring object _msg_ of type struct sms_msg_data5 *,
    which contains a 5-elements array, instead of just 4. And use
    _msg_ directly, instead of creating object trigger_msg.
    
    This helps with the ongoing efforts to enable -Warray-bounds by fixing
    the following warnings:
    
      CC [M]  drivers/media/common/siano/smscoreapi.o
    drivers/media/common/siano/smscoreapi.c: In function ?smscore_load_firmware_family2??
    drivers/media/common/siano/smscoreapi.c:1003:24: warning: array subscript 1 is above array bounds of ?u32[1]??{aka ?unsigned int[1]?} [-Warray-bounds]
     1003 |   trigger_msg->msg_data[1] = 6; /* Priority */
          |   ~~~~~~~~~~~~~~~~~~~~~^~~
    In file included from drivers/media/common/siano/smscoreapi.c:12:
    drivers/media/common/siano/smscoreapi.h:619:6: note: while referencing ?msg_data??      619 |  u32 msg_data[1];
          |      ^~~~~~~~
    drivers/media/common/siano/smscoreapi.c:1004:24: warning: array subscript 2 is above array bounds of ?u32[1]??{aka ?unsigned int[1]?} [-Warray-bounds]
     1004 |   trigger_msg->msg_data[2] = 0x200; /* Stack size */
          |   ~~~~~~~~~~~~~~~~~~~~~^~~
    In file included from drivers/media/common/siano/smscoreapi.c:12:
    drivers/media/common/siano/smscoreapi.h:619:6: note: while referencing ?msg_data??      619 |  u32 msg_data[1];
          |      ^~~~~~~~
    drivers/media/common/siano/smscoreapi.c:1005:24: warning: array subscript 3 is above array bounds of ?u32[1]??{aka ?unsigned int[1]?} [-Warray-bounds]
     1005 |   trigger_msg->msg_data[3] = 0; /* Parameter */
          |   ~~~~~~~~~~~~~~~~~~~~~^~~
    In file included from drivers/media/common/siano/smscoreapi.c:12:
    drivers/media/common/siano/smscoreapi.h:619:6: note: while referencing ?msg_data??      619 |  u32 msg_data[1];
          |      ^~~~~~~~
    drivers/media/common/siano/smscoreapi.c:1006:24: warning: array subscript 4 is above array bounds of ?u32[1]??{aka ?unsigned int[1]?} [-Warray-bounds]
     1006 |   trigger_msg->msg_data[4] = 4; /* Task ID */
          |   ~~~~~~~~~~~~~~~~~~~~~^~~
    In file included from drivers/media/common/siano/smscoreapi.c:12:
    drivers/media/common/siano/smscoreapi.h:619:6: note: while referencing ?msg_data??      619 |  u32 msg_data[1];
          |      ^~~~~~~~
    
    Fixes: 018b0c6f8acb ("[media] siano: make load firmware logic to work with newer firmwares")
    Co-developed-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/common/siano/smscoreapi.c b/drivers/media/common/siano/smscoreapi.c
index 3b02cb570a6e..661920dd84d1 100644
--- a/drivers/media/common/siano/smscoreapi.c
+++ b/drivers/media/common/siano/smscoreapi.c
@@ -916,7 +916,7 @@ static int smscore_load_firmware_family2(struct smscore_device_t *coredev,
 					 void *buffer, size_t size)
 {
 	struct sms_firmware *firmware = (struct sms_firmware *) buffer;
-	struct sms_msg_data4 *msg;
+	struct sms_msg_data5 *msg;
 	u32 mem_address,  calc_checksum = 0;
 	u32 i, *ptr;
 	u8 *payload = firmware->payload;
@@ -997,24 +997,20 @@ static int smscore_load_firmware_family2(struct smscore_device_t *coredev,
 		goto exit_fw_download;
 
 	if (coredev->mode == DEVICE_MODE_NONE) {
-		struct sms_msg_data *trigger_msg =
-			(struct sms_msg_data *) msg;
-
 		pr_debug("sending MSG_SMS_SWDOWNLOAD_TRIGGER_REQ\n");
 		SMS_INIT_MSG(&msg->x_msg_header,
 				MSG_SMS_SWDOWNLOAD_TRIGGER_REQ,
-				sizeof(struct sms_msg_hdr) +
-				sizeof(u32) * 5);
+				sizeof(*msg));
 
-		trigger_msg->msg_data[0] = firmware->start_address;
+		msg->msg_data[0] = firmware->start_address;
 					/* Entry point */
-		trigger_msg->msg_data[1] = 6; /* Priority */
-		trigger_msg->msg_data[2] = 0x200; /* Stack size */
-		trigger_msg->msg_data[3] = 0; /* Parameter */
-		trigger_msg->msg_data[4] = 4; /* Task ID */
+		msg->msg_data[1] = 6; /* Priority */
+		msg->msg_data[2] = 0x200; /* Stack size */
+		msg->msg_data[3] = 0; /* Parameter */
+		msg->msg_data[4] = 4; /* Task ID */
 
-		rc = smscore_sendrequest_and_wait(coredev, trigger_msg,
-					trigger_msg->x_msg_header.msg_length,
+		rc = smscore_sendrequest_and_wait(coredev, msg,
+					msg->x_msg_header.msg_length,
 					&coredev->trigger_done);
 	} else {
 		SMS_INIT_MSG(&msg->x_msg_header, MSG_SW_RELOAD_EXEC_REQ,
diff --git a/drivers/media/common/siano/smscoreapi.h b/drivers/media/common/siano/smscoreapi.h
index eb58853008c9..4de4d257c6b6 100644
--- a/drivers/media/common/siano/smscoreapi.h
+++ b/drivers/media/common/siano/smscoreapi.h
@@ -640,9 +640,9 @@ struct sms_msg_data2 {
 	u32 msg_data[2];
 };
 
-struct sms_msg_data4 {
+struct sms_msg_data5 {
 	struct sms_msg_hdr x_msg_header;
-	u32 msg_data[4];
+	u32 msg_data[5];
 };
 
 struct sms_data_download {

commit ee59cafe5de910a429f44cc48b245847b6edd0fe
Author: Johan Hovold <johan@kernel.org>
Date:   Mon May 24 13:09:18 2021 +0200

    media: gspca/gl860: fix zero-length control requests
    
    [ Upstream commit 8ed339f23d41e21660a389adf2e7b2966d457ff6 ]
    
    The direction of the pipe argument must match the request-type direction
    bit or control requests may fail depending on the host-controller-driver
    implementation.
    
    Control transfers without a data stage are treated as OUT requests by
    the USB stack and should be using usb_sndctrlpipe(). Failing to do so
    will now trigger a warning.
    
    Fix the gl860_RTx() helper so that zero-length control reads fail with
    an error message instead. Note that there are no current callers that
    would trigger this.
    
    Fixes: 4f7cb8837cec ("V4L/DVB (12954): gspca - gl860: Addition of GL860 based webcams")
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/usb/gspca/gl860/gl860.c b/drivers/media/usb/gspca/gl860/gl860.c
index 262200af76a3..7da437e7785f 100644
--- a/drivers/media/usb/gspca/gl860/gl860.c
+++ b/drivers/media/usb/gspca/gl860/gl860.c
@@ -573,8 +573,8 @@ int gl860_RTx(struct gspca_dev *gspca_dev,
 					len, 400 + 200 * (len > 1));
 			memcpy(pdata, gspca_dev->usb_buf, len);
 		} else {
-			r = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
-					req, pref, val, index, NULL, len, 400);
+			gspca_err(gspca_dev, "zero-length read request\n");
+			r = -EINVAL;
 		}
 	}
 

commit f8985454809f165a29961c434bb523bbf110acb3
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Sat May 15 08:58:30 2021 +0200

    media: tc358743: Fix error return code in tc358743_probe_of()
    
    [ Upstream commit a6b1e7093f0a099571fc8836ab4a589633f956a8 ]
    
    When the CSI bps per lane is not in the valid range, an appropriate error
    code -EINVAL should be returned. However, we currently do not explicitly
    assign this error code to 'ret'. As a result, 0 was incorrectly returned.
    
    Fixes: 256148246852 ("[media] tc358743: support probe from device tree")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/i2c/tc358743.c b/drivers/media/i2c/tc358743.c
index 041b16965b96..079b8db4bc48 100644
--- a/drivers/media/i2c/tc358743.c
+++ b/drivers/media/i2c/tc358743.c
@@ -1972,6 +1972,7 @@ static int tc358743_probe_of(struct tc358743_state *state)
 	bps_pr_lane = 2 * endpoint->link_frequencies[0];
 	if (bps_pr_lane < 62500000U || bps_pr_lane > 1000000000U) {
 		dev_err(dev, "unsupported bps per lane: %u bps\n", bps_pr_lane);
+		ret = -EINVAL;
 		goto disable_clk;
 	}
 

commit b334329a212ffd9dee8429d2bef2fcfc8d701f9d
Author: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
Date:   Sun May 9 10:12:31 2021 +0200

    media: exynos4-is: Fix a use after free in isp_video_release
    
    [ Upstream commit 01fe904c9afd26e79c1f73aa0ca2e3d785e5e319 ]
    
    In isp_video_release, file->private_data is freed via
    _vb2_fop_release()->v4l2_fh_release(). But the freed
    file->private_data is still used in v4l2_fh_is_singular_file()
    ->v4l2_fh_is_singular(file->private_data), which is a use
    after free bug.
    
    My patch uses a variable 'is_singular_file' to avoid the uaf.
    v3: https://lore.kernel.org/patchwork/patch/1419058/
    
    Fixes: 34947b8aebe3f ("[media] exynos4-is: Add the FIMC-IS ISP capture DMA driver")
    Signed-off-by: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/platform/exynos4-is/fimc-isp-video.c b/drivers/media/platform/exynos4-is/fimc-isp-video.c
index 39340abefd14..c9ef74ee476a 100644
--- a/drivers/media/platform/exynos4-is/fimc-isp-video.c
+++ b/drivers/media/platform/exynos4-is/fimc-isp-video.c
@@ -308,17 +308,20 @@ static int isp_video_release(struct file *file)
 	struct fimc_is_video *ivc = &isp->video_capture;
 	struct media_entity *entity = &ivc->ve.vdev.entity;
 	struct media_device *mdev = entity->graph_obj.mdev;
+	bool is_singular_file;
 
 	mutex_lock(&isp->video_lock);
 
-	if (v4l2_fh_is_singular_file(file) && ivc->streaming) {
+	is_singular_file = v4l2_fh_is_singular_file(file);
+
+	if (is_singular_file && ivc->streaming) {
 		media_pipeline_stop(entity);
 		ivc->streaming = 0;
 	}
 
 	_vb2_fop_release(file, NULL);
 
-	if (v4l2_fh_is_singular_file(file)) {
+	if (is_singular_file) {
 		fimc_pipeline_call(&ivc->ve, close);
 
 		mutex_lock(&mdev->graph_mutex);

commit 65bff47cd80db4260cda82673e907079600404da
Author: Sergey Shtylyov <s.shtylyov@omprussia.ru>
Date:   Sat Mar 20 23:32:38 2021 +0300

    pata_ep93xx: fix deferred probing
    
    [ Upstream commit 5c8121262484d99bffb598f39a0df445cecd8efb ]
    
    The driver overrides the error codes returned by platform_get_irq() to
    -ENXIO, so if it returns -EPROBE_DEFER, the driver would fail the probe
    permanently instead of the deferred probing.  Propagate the error code
    upstream, as it should have been done from the start...
    
    Fixes: 2fff27512600 ("PATA host controller driver for ep93xx")
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omprussia.ru>
    Link: https://lore.kernel.org/r/509fda88-2e0d-2cc7-f411-695d7e94b136@omprussia.ru
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/ata/pata_ep93xx.c b/drivers/ata/pata_ep93xx.c
index cc6d06c1b2c7..7ce62cdb63a5 100644
--- a/drivers/ata/pata_ep93xx.c
+++ b/drivers/ata/pata_ep93xx.c
@@ -927,7 +927,7 @@ static int ep93xx_pata_probe(struct platform_device *pdev)
 	/* INT[3] (IRQ_EP93XX_EXT3) line connected as pull down */
 	irq = platform_get_irq(pdev, 0);
 	if (irq < 0) {
-		err = -ENXIO;
+		err = irq;
 		goto err_rel_gpio;
 	}
 

commit 16c3ce907e9801dd2f2c35a56d924f679323be22
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Thu May 6 07:38:56 2021 +0200

    media: rc: i2c: Fix an error message
    
    [ Upstream commit 9c87ae1a0dbeb5794957421157fd266d38a869b4 ]
    
    'ret' is known to be 1 here. In fact 'i' is expected instead.
    Store the return value of 'i2c_master_recv()' in 'ret' so that the error
    message print the correct error code.
    
    Fixes: acaa34bf06e9 ("media: rc: implement zilog transmitter")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Signed-off-by: Sean Young <sean@mess.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/i2c/ir-kbd-i2c.c b/drivers/media/i2c/ir-kbd-i2c.c
index a14a74e6b986..19ff9cb08e88 100644
--- a/drivers/media/i2c/ir-kbd-i2c.c
+++ b/drivers/media/i2c/ir-kbd-i2c.c
@@ -688,8 +688,8 @@ static int zilog_tx(struct rc_dev *rcdev, unsigned int *txbuf,
 		goto out_unlock;
 	}
 
-	i = i2c_master_recv(ir->tx_c, buf, 1);
-	if (i != 1) {
+	ret = i2c_master_recv(ir->tx_c, buf, 1);
+	if (ret != 1) {
 		dev_err(&ir->rc->dev, "i2c_master_recv failed with %d\n", ret);
 		ret = -EIO;
 		goto out_unlock;

commit d6cd8cef18c0db5566728fbfe0ad2f7a5a204d58
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Sun May 16 08:58:04 2021 +0200

    crypto: ccp - Fix a resource leak in an error handling path
    
    [ Upstream commit a6f8e68e238a15bb15f1726b35c695136c64eaba ]
    
    If an error occurs after calling 'sp_get_irqs()', 'sp_free_irqs()' must be
    called as already done in the error handling path.
    
    Fixes: f4d18d656f88 ("crypto: ccp - Abstract interrupt registeration")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Acked-by: John Allen <john.allen@amd.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/ccp/sp-pci.c b/drivers/crypto/ccp/sp-pci.c
index 7da93e9bebed..9b2742212ea8 100644
--- a/drivers/crypto/ccp/sp-pci.c
+++ b/drivers/crypto/ccp/sp-pci.c
@@ -216,7 +216,7 @@ static int sp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 		if (ret) {
 			dev_err(dev, "dma_set_mask_and_coherent failed (%d)\n",
 				ret);
-			goto e_err;
+			goto free_irqs;
 		}
 	}
 
@@ -224,12 +224,14 @@ static int sp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 
 	ret = sp_init(sp);
 	if (ret)
-		goto e_err;
+		goto free_irqs;
 
 	dev_notice(dev, "enabled\n");
 
 	return 0;
 
+free_irqs:
+	sp_free_irqs(sp);
 e_err:
 	dev_notice(dev, "initialization failed\n");
 	return ret;

commit 8657d0d57d6df9d6d04277c18889da2804164ca3
Author: Mimi Zohar <zohar@linux.ibm.com>
Date:   Mon Apr 26 18:13:45 2021 -0400

    evm: fix writing <securityfs>/evm overflow
    
    [ Upstream commit 49219d9b8785ba712575c40e48ce0f7461254626 ]
    
    EVM_SETUP_COMPLETE is defined as 0x80000000, which is larger than INT_MAX.
    The "-fno-strict-overflow" compiler option properly prevents signaling
    EVM that the EVM policy setup is complete.  Define and read an unsigned
    int.
    
    Fixes: f00d79750712 ("EVM: Allow userspace to signal an RSA key has been loaded")
    Signed-off-by: Mimi Zohar <zohar@linux.ibm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/security/integrity/evm/evm_secfs.c b/security/integrity/evm/evm_secfs.c
index 7024b14831e3..c5c44203a59c 100644
--- a/security/integrity/evm/evm_secfs.c
+++ b/security/integrity/evm/evm_secfs.c
@@ -71,12 +71,13 @@ static ssize_t evm_read_key(struct file *filp, char __user *buf,
 static ssize_t evm_write_key(struct file *file, const char __user *buf,
 			     size_t count, loff_t *ppos)
 {
-	int i, ret;
+	unsigned int i;
+	int ret;
 
 	if (!capable(CAP_SYS_ADMIN) || (evm_initialized & EVM_SETUP_COMPLETE))
 		return -EPERM;
 
-	ret = kstrtoint_from_user(buf, count, 0, &i);
+	ret = kstrtouint_from_user(buf, count, 0, &i);
 
 	if (ret)
 		return ret;

commit c7dbb2a67b9f8e5e508ee37acc1b86a233930526
Author: Sergey Shtylyov <s.shtylyov@omp.ru>
Date:   Tue May 18 23:38:54 2021 +0300

    pata_octeon_cf: avoid WARN_ON() in ata_host_activate()
    
    [ Upstream commit bfc1f378c8953e68ccdbfe0a8c20748427488b80 ]
    
    Iff platform_get_irq() fails (or returns IRQ0) and thus the polling mode
    has to be used, ata_host_activate() hits the WARN_ON() due to 'irq_handler'
    parameter being non-NULL if the polling mode is selected.  Let's only set
    the pointer to the driver's IRQ handler if platform_get_irq() returns a
    valid IRQ # -- this should avoid the unnecessary WARN_ON()...
    
    Fixes: 43f01da0f279 ("MIPS/OCTEON/ata: Convert pata_octeon_cf.c to use device tree.")
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru>
    Link: https://lore.kernel.org/r/3a241167-f84d-1d25-5b9b-be910afbe666@omp.ru
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/ata/pata_octeon_cf.c b/drivers/ata/pata_octeon_cf.c
index d3d851b014a3..ac3b1fda820f 100644
--- a/drivers/ata/pata_octeon_cf.c
+++ b/drivers/ata/pata_octeon_cf.c
@@ -898,10 +898,11 @@ static int octeon_cf_probe(struct platform_device *pdev)
 					return -EINVAL;
 				}
 
-				irq_handler = octeon_cf_interrupt;
 				i = platform_get_irq(dma_dev, 0);
-				if (i > 0)
+				if (i > 0) {
 					irq = i;
+					irq_handler = octeon_cf_interrupt;
+				}
 			}
 			of_node_put(dma_node);
 		}

commit 709d077bbcf4249f6c760355a676565f60de1d59
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Fri Apr 30 22:19:55 2021 +0200

    media: I2C: change 'RST' to "RSET" to fix multiple build errors
    
    [ Upstream commit 8edcb5049ac29aa3c8acc5ef15dd4036543d747e ]
    
    The use of an enum named 'RST' conflicts with a #define macro
    named 'RST' in arch/mips/include/asm/mach-rc32434/rb.h.
    
    The MIPS use of RST was there first (AFAICT), so change the
    media/i2c/ uses of RST to be named 'RSET'.
    'git grep -w RSET' does not report any naming conflicts with the
    new name.
    
    This fixes multiple build errors:
    
    arch/mips/include/asm/mach-rc32434/rb.h:15:14: error: expected identifier before '(' token
       15 | #define RST  (1 << 15)
          |              ^
    drivers/media/i2c/s5c73m3/s5c73m3.h:356:2: note: in expansion of macro 'RST'
      356 |  RST,
          |  ^~~
    
    ../arch/mips/include/asm/mach-rc32434/rb.h:15:14: error: expected identifier before '(' token
       15 | #define RST  (1 << 15)
          |              ^
    ../drivers/media/i2c/s5k6aa.c:180:2: note: in expansion of macro 'RST'
      180 |  RST,
          |  ^~~
    
    ../arch/mips/include/asm/mach-rc32434/rb.h:15:14: error: expected identifier before '(' token
       15 | #define RST  (1 << 15)
          |              ^
    ../drivers/media/i2c/s5k5baf.c:238:2: note: in expansion of macro 'RST'
      238 |  RST,
          |  ^~~
    
    and some others that I have trimmed.
    
    Fixes: cac47f1822fc ("[media] V4L: Add S5C73M3 camera driver")
    Fixes: 8b99312b7214 ("[media] Add v4l2 subdev driver for S5K4ECGX sensor")
    Fixes: 7d459937dc09 ("[media] Add driver for Samsung S5K5BAF camera sensor")
    Fixes: bfa8dd3a0524 ("[media] v4l: Add v4l2 subdev driver for S5K6AAFX sensor")
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Reported-by: kernel test robot <lkp@intel.com>
    Cc: Shawn Guo <shawnguo@kernel.org>
    Cc: Sascha Hauer <s.hauer@pengutronix.de>
    Cc: Pengutronix Kernel Team <kernel@pengutronix.de>
    Cc: Fabio Estevam <festevam@gmail.com>
    Cc: NXP Linux Team <linux-imx@nxp.com>
    Cc: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
    Cc: Andrzej Hajda <a.hajda@samsung.com>
    Cc: Sylwester Nawrocki <s.nawrocki@samsung.com>
    Cc: Sangwook Lee <sangwook.lee@linaro.org>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/i2c/s5c73m3/s5c73m3-core.c b/drivers/media/i2c/s5c73m3/s5c73m3-core.c
index ce196b60f917..37cb2f82c36b 100644
--- a/drivers/media/i2c/s5c73m3/s5c73m3-core.c
+++ b/drivers/media/i2c/s5c73m3/s5c73m3-core.c
@@ -1394,7 +1394,7 @@ static int __s5c73m3_power_on(struct s5c73m3 *state)
 	s5c73m3_gpio_deassert(state, STBY);
 	usleep_range(100, 200);
 
-	s5c73m3_gpio_deassert(state, RST);
+	s5c73m3_gpio_deassert(state, RSET);
 	usleep_range(50, 100);
 
 	return 0;
@@ -1409,7 +1409,7 @@ static int __s5c73m3_power_off(struct s5c73m3 *state)
 {
 	int i, ret;
 
-	if (s5c73m3_gpio_assert(state, RST))
+	if (s5c73m3_gpio_assert(state, RSET))
 		usleep_range(10, 50);
 
 	if (s5c73m3_gpio_assert(state, STBY))
@@ -1614,7 +1614,7 @@ static int s5c73m3_get_platform_data(struct s5c73m3 *state)
 
 		state->mclk_frequency = pdata->mclk_frequency;
 		state->gpio[STBY] = pdata->gpio_stby;
-		state->gpio[RST] = pdata->gpio_reset;
+		state->gpio[RSET] = pdata->gpio_reset;
 		return 0;
 	}
 
diff --git a/drivers/media/i2c/s5c73m3/s5c73m3.h b/drivers/media/i2c/s5c73m3/s5c73m3.h
index 653f68e7ea07..e267b2522149 100644
--- a/drivers/media/i2c/s5c73m3/s5c73m3.h
+++ b/drivers/media/i2c/s5c73m3/s5c73m3.h
@@ -361,7 +361,7 @@ struct s5c73m3_ctrls {
 
 enum s5c73m3_gpio_id {
 	STBY,
-	RST,
+	RSET,
 	GPIO_NUM,
 };
 
diff --git a/drivers/media/i2c/s5k4ecgx.c b/drivers/media/i2c/s5k4ecgx.c
index 6ebcf254989a..75fb13a33eab 100644
--- a/drivers/media/i2c/s5k4ecgx.c
+++ b/drivers/media/i2c/s5k4ecgx.c
@@ -177,7 +177,7 @@ static const char * const s5k4ecgx_supply_names[] = {
 
 enum s5k4ecgx_gpio_id {
 	STBY,
-	RST,
+	RSET,
 	GPIO_NUM,
 };
 
@@ -482,7 +482,7 @@ static int __s5k4ecgx_power_on(struct s5k4ecgx *priv)
 	if (s5k4ecgx_gpio_set_value(priv, STBY, priv->gpio[STBY].level))
 		usleep_range(30, 50);
 
-	if (s5k4ecgx_gpio_set_value(priv, RST, priv->gpio[RST].level))
+	if (s5k4ecgx_gpio_set_value(priv, RSET, priv->gpio[RSET].level))
 		usleep_range(30, 50);
 
 	return 0;
@@ -490,7 +490,7 @@ static int __s5k4ecgx_power_on(struct s5k4ecgx *priv)
 
 static int __s5k4ecgx_power_off(struct s5k4ecgx *priv)
 {
-	if (s5k4ecgx_gpio_set_value(priv, RST, !priv->gpio[RST].level))
+	if (s5k4ecgx_gpio_set_value(priv, RSET, !priv->gpio[RSET].level))
 		usleep_range(30, 50);
 
 	if (s5k4ecgx_gpio_set_value(priv, STBY, !priv->gpio[STBY].level))
@@ -878,7 +878,7 @@ static int s5k4ecgx_config_gpios(struct s5k4ecgx *priv,
 	int ret;
 
 	priv->gpio[STBY].gpio = -EINVAL;
-	priv->gpio[RST].gpio  = -EINVAL;
+	priv->gpio[RSET].gpio  = -EINVAL;
 
 	ret = s5k4ecgx_config_gpio(gpio->gpio, gpio->level, "S5K4ECGX_STBY");
 
@@ -897,7 +897,7 @@ static int s5k4ecgx_config_gpios(struct s5k4ecgx *priv,
 		s5k4ecgx_free_gpios(priv);
 		return ret;
 	}
-	priv->gpio[RST] = *gpio;
+	priv->gpio[RSET] = *gpio;
 	if (gpio_is_valid(gpio->gpio))
 		gpio_set_value(gpio->gpio, 0);
 
diff --git a/drivers/media/i2c/s5k5baf.c b/drivers/media/i2c/s5k5baf.c
index 5007c9659342..de3329f04fdf 100644
--- a/drivers/media/i2c/s5k5baf.c
+++ b/drivers/media/i2c/s5k5baf.c
@@ -238,7 +238,7 @@ struct s5k5baf_gpio {
 
 enum s5k5baf_gpio_id {
 	STBY,
-	RST,
+	RSET,
 	NUM_GPIOS,
 };
 
@@ -973,7 +973,7 @@ static int s5k5baf_power_on(struct s5k5baf *state)
 
 	s5k5baf_gpio_deassert(state, STBY);
 	usleep_range(50, 100);
-	s5k5baf_gpio_deassert(state, RST);
+	s5k5baf_gpio_deassert(state, RSET);
 	return 0;
 
 err_reg_dis:
@@ -991,7 +991,7 @@ static int s5k5baf_power_off(struct s5k5baf *state)
 	state->apply_cfg = 0;
 	state->apply_crop = 0;
 
-	s5k5baf_gpio_assert(state, RST);
+	s5k5baf_gpio_assert(state, RSET);
 	s5k5baf_gpio_assert(state, STBY);
 
 	if (!IS_ERR(state->clock))
diff --git a/drivers/media/i2c/s5k6aa.c b/drivers/media/i2c/s5k6aa.c
index 13c10b5e2b45..e9c6e41cd44d 100644
--- a/drivers/media/i2c/s5k6aa.c
+++ b/drivers/media/i2c/s5k6aa.c
@@ -181,7 +181,7 @@ static const char * const s5k6aa_supply_names[] = {
 
 enum s5k6aa_gpio_id {
 	STBY,
-	RST,
+	RSET,
 	GPIO_NUM,
 };
 
@@ -845,7 +845,7 @@ static int __s5k6aa_power_on(struct s5k6aa *s5k6aa)
 		ret = s5k6aa->s_power(1);
 	usleep_range(4000, 5000);
 
-	if (s5k6aa_gpio_deassert(s5k6aa, RST))
+	if (s5k6aa_gpio_deassert(s5k6aa, RSET))
 		msleep(20);
 
 	return ret;
@@ -855,7 +855,7 @@ static int __s5k6aa_power_off(struct s5k6aa *s5k6aa)
 {
 	int ret;
 
-	if (s5k6aa_gpio_assert(s5k6aa, RST))
+	if (s5k6aa_gpio_assert(s5k6aa, RSET))
 		usleep_range(100, 150);
 
 	if (s5k6aa->s_power) {
@@ -1514,7 +1514,7 @@ static int s5k6aa_configure_gpios(struct s5k6aa *s5k6aa,
 	int ret;
 
 	s5k6aa->gpio[STBY].gpio = -EINVAL;
-	s5k6aa->gpio[RST].gpio  = -EINVAL;
+	s5k6aa->gpio[RSET].gpio  = -EINVAL;
 
 	gpio = &pdata->gpio_stby;
 	if (gpio_is_valid(gpio->gpio)) {
@@ -1537,7 +1537,7 @@ static int s5k6aa_configure_gpios(struct s5k6aa *s5k6aa,
 		if (ret < 0)
 			return ret;
 
-		s5k6aa->gpio[RST] = *gpio;
+		s5k6aa->gpio[RSET] = *gpio;
 	}
 
 	return 0;

commit 97c9919de33b7b100800a513016842720bbb2822
Author: Sergey Shtylyov <s.shtylyov@omprussia.ru>
Date:   Mon Mar 15 14:46:53 2021 +0300

    pata_rb532_cf: fix deferred probing
    
    [ Upstream commit 2d3a62fbae8e5badc2342388f65ab2191c209cc0 ]
    
    The driver overrides the error codes returned by platform_get_irq() to
    -ENOENT, so if it returns -EPROBE_DEFER, the driver would fail the probe
    permanently instead of the deferred probing. Switch to propagating the
    error code upstream, still checking/overriding IRQ0 as libata regards it
    as "no IRQ" (thus polling) anyway...
    
    Fixes: 9ec36cafe43b ("of/irq: do irq resolution in platform_get_irq")
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omprussia.ru>
    Link: https://lore.kernel.org/r/771ced55-3efb-21f5-f21c-b99920aae611@omprussia.ru
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/ata/pata_rb532_cf.c b/drivers/ata/pata_rb532_cf.c
index 653b9a0bf727..0416a390b94c 100644
--- a/drivers/ata/pata_rb532_cf.c
+++ b/drivers/ata/pata_rb532_cf.c
@@ -120,10 +120,12 @@ static int rb532_pata_driver_probe(struct platform_device *pdev)
 	}
 
 	irq = platform_get_irq(pdev, 0);
-	if (irq <= 0) {
+	if (irq < 0) {
 		dev_err(&pdev->dev, "no IRQ resource found\n");
-		return -ENOENT;
+		return irq;
 	}
+	if (!irq)
+		return -EINVAL;
 
 	pdata = dev_get_platdata(&pdev->dev);
 	if (!pdata) {

commit 48715b7f8560f6a5e3fff0c4f2b7c413ee999c15
Author: Sergey Shtylyov <s.shtylyov@omprussia.ru>
Date:   Sun Mar 14 23:34:27 2021 +0300

    sata_highbank: fix deferred probing
    
    [ Upstream commit 4a24efa16e7db02306fb5db84518bb0a7ada5a46 ]
    
    The driver overrides the error codes returned by platform_get_irq() to
    -EINVAL, so if it returns -EPROBE_DEFER, the driver would fail the probe
    permanently instead of the deferred probing. Switch to propagating the
    error code upstream, still checking/overriding IRQ0 as libata regards it
    as "no IRQ" (thus polling) anyway...
    
    Fixes: 9ec36cafe43b ("of/irq: do irq resolution in platform_get_irq")
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omprussia.ru>
    Link: https://lore.kernel.org/r/105b456d-1199-f6e9-ceb7-ffc5ba551d1a@omprussia.ru
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/ata/sata_highbank.c b/drivers/ata/sata_highbank.c
index e67815b896fc..1dd47a05b34b 100644
--- a/drivers/ata/sata_highbank.c
+++ b/drivers/ata/sata_highbank.c
@@ -483,10 +483,12 @@ static int ahci_highbank_probe(struct platform_device *pdev)
 	}
 
 	irq = platform_get_irq(pdev, 0);
-	if (irq <= 0) {
+	if (irq < 0) {
 		dev_err(dev, "no irq\n");
-		return -EINVAL;
+		return irq;
 	}
+	if (!irq)
+		return -EINVAL;
 
 	hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
 	if (!hpriv) {

commit 0d574e45410b8769853e040ec1e3e6040ea39e71
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Sat May 8 15:00:49 2021 +0800

    crypto: ux500 - Fix error return code in hash_hw_final()
    
    [ Upstream commit b01360384009ab066940b45f34880991ea7ccbfb ]
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: 8a63b1994c50 ("crypto: ux500 - Add driver for HASH hardware")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/ux500/hash/hash_core.c b/drivers/crypto/ux500/hash/hash_core.c
index a0bb8a6eec3f..18ef5b8cc18a 100644
--- a/drivers/crypto/ux500/hash/hash_core.c
+++ b/drivers/crypto/ux500/hash/hash_core.c
@@ -1007,6 +1007,7 @@ static int hash_hw_final(struct ahash_request *req)
 			goto out;
 		}
 	} else if (req->nbytes == 0 && ctx->keylen > 0) {
+		ret = -EPERM;
 		dev_err(device_data->dev, "%s: Empty message with keylength > 0, NOT supported\n",
 			__func__);
 		goto out;

commit 70bc9a0178b346d331f97ac6694f672aaa8862a5
Author: Corentin Labbe <clabbe@baylibre.com>
Date:   Wed May 5 20:26:08 2021 +0000

    crypto: ixp4xx - dma_unmap the correct address
    
    [ Upstream commit 9395c58fdddd79cdd3882132cdd04e8ac7ad525f ]
    
    Testing ixp4xx_crypto with CONFIG_DMA_API_DEBUG lead to the following error:
    DMA-API: platform ixp4xx_crypto.0: device driver tries to free DMA memory it has not allocated [device address=0x0000000000000000] [size=24 bytes]
    
    This is due to dma_unmap using the wrong address.
    
    Fixes: 0d44dc59b2b4 ("crypto: ixp4xx - Fix handling of chained sg buffers")
    Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/ixp4xx_crypto.c b/drivers/crypto/ixp4xx_crypto.c
index 9b7b8558db31..abb84996f2ca 100644
--- a/drivers/crypto/ixp4xx_crypto.c
+++ b/drivers/crypto/ixp4xx_crypto.c
@@ -332,7 +332,7 @@ static void free_buf_chain(struct device *dev, struct buffer_desc *buf,u32 phys)
 
 		buf1 = buf->next;
 		phys1 = buf->phys_next;
-		dma_unmap_single(dev, buf->phys_next, buf->buf_len, buf->dir);
+		dma_unmap_single(dev, buf->phys_addr, buf->buf_len, buf->dir);
 		dma_pool_free(buffer_pool, buf, phys);
 		buf = buf1;
 		phys = phys1;

commit b29ef99d9e4a0ce7b25a5e67536cf191c6eabc34
Author: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Date:   Wed Apr 28 09:38:56 2021 +0200

    media: s5p_cec: decrement usage count if disabled
    
    [ Upstream commit 747bad54a677d8633ec14b39dfbeb859c821d7f2 ]
    
    There's a bug at s5p_cec_adap_enable(): if called to
    disable the device, it should call pm_runtime_put()
    instead of pm_runtime_disable(), as the goal here is to
    decrement the usage_count and not to disable PM runtime.
    
    Reported-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
    Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Fixes: 1bcbf6f4b6b0 ("[media] cec: s5p-cec: Add s5p-cec driver")
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/platform/s5p-cec/s5p_cec.c b/drivers/media/platform/s5p-cec/s5p_cec.c
index 8837e2678bde..3032247c63a5 100644
--- a/drivers/media/platform/s5p-cec/s5p_cec.c
+++ b/drivers/media/platform/s5p-cec/s5p_cec.c
@@ -55,7 +55,7 @@ static int s5p_cec_adap_enable(struct cec_adapter *adap, bool enable)
 	} else {
 		s5p_cec_mask_tx_interrupts(cec);
 		s5p_cec_mask_rx_interrupts(cec);
-		pm_runtime_disable(cec->dev);
+		pm_runtime_put(cec->dev);
 	}
 
 	return 0;

commit fd7b9a5a4b440df24d349128e5afcce7ca9c6f25
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Mon Jun 28 19:33:41 2021 -0700

    ia64: mca_drv: fix incorrect array size calculation
    
    [ Upstream commit c5f320ff8a79501bb59338278336ec43acb9d7e2 ]
    
    gcc points out a mistake in the mca driver that goes back to before the
    git history:
    
    arch/ia64/kernel/mca_drv.c: In function 'init_record_index_pools':
    arch/ia64/kernel/mca_drv.c:346:54: error: expression does not compute the number of elements in this array; element typ
    e is 'int', not 'size_t' {aka 'long unsigned int'} [-Werror=sizeof-array-div]
      346 |         for (i = 1; i < sizeof sal_log_sect_min_sizes/sizeof(size_t); i++)
          |                                                      ^
    
    This is the same as sizeof(size_t), which is two shorter than the actual
    array.  Use the ARRAY_SIZE() macro to get the correct calculation instead.
    
    Link: https://lkml.kernel.org/r/20210514214123.875971-1-arnd@kernel.org
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Cc: Masahiro Yamada <masahiroy@kernel.org>
    Cc: Randy Dunlap <rdunlap@infradead.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/ia64/kernel/mca_drv.c b/arch/ia64/kernel/mca_drv.c
index dfe40cbdf3b3..06419a95af30 100644
--- a/arch/ia64/kernel/mca_drv.c
+++ b/arch/ia64/kernel/mca_drv.c
@@ -343,7 +343,7 @@ init_record_index_pools(void)
 
 	/* - 2 - */
 	sect_min_size = sal_log_sect_min_sizes[0];
-	for (i = 1; i < sizeof sal_log_sect_min_sizes/sizeof(size_t); i++)
+	for (i = 1; i < ARRAY_SIZE(sal_log_sect_min_sizes); i++)
 		if (sect_min_size > sal_log_sect_min_sizes[i])
 			sect_min_size = sal_log_sect_min_sizes[i];
 

commit 075b291c5d2152af1557ca3fc9f8b3f144608249
Author: Jason Gerecke <killertofu@gmail.com>
Date:   Wed Jun 23 09:58:09 2021 -0700

    HID: wacom: Correct base usage for capacitive ExpressKey status bits
    
    [ Upstream commit 424d8237945c6c448c8b3f23885d464fb5685c97 ]
    
    The capacitive status of ExpressKeys is reported with usages beginning
    at 0x940, not 0x950. Bring our driver into alignment with reality.
    
    Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h
index 46da97162ef4..0abed1e5b526 100644
--- a/drivers/hid/wacom_wac.h
+++ b/drivers/hid/wacom_wac.h
@@ -126,7 +126,7 @@
 #define WACOM_HID_WD_TOUCHONOFF         (WACOM_HID_UP_WACOMDIGITIZER | 0x0454)
 #define WACOM_HID_WD_BATTERY_LEVEL      (WACOM_HID_UP_WACOMDIGITIZER | 0x043b)
 #define WACOM_HID_WD_EXPRESSKEY00       (WACOM_HID_UP_WACOMDIGITIZER | 0x0910)
-#define WACOM_HID_WD_EXPRESSKEYCAP00    (WACOM_HID_UP_WACOMDIGITIZER | 0x0950)
+#define WACOM_HID_WD_EXPRESSKEYCAP00    (WACOM_HID_UP_WACOMDIGITIZER | 0x0940)
 #define WACOM_HID_WD_MODE_CHANGE        (WACOM_HID_UP_WACOMDIGITIZER | 0x0980)
 #define WACOM_HID_WD_MUTE_DEVICE        (WACOM_HID_UP_WACOMDIGITIZER | 0x0981)
 #define WACOM_HID_WD_CONTROLPANEL       (WACOM_HID_UP_WACOMDIGITIZER | 0x0982)

commit cdf94d8d75c4cd935a4ee37671241c7366045715
Author: Richard Fitzgerald <rf@opensource.cirrus.com>
Date:   Mon Jun 21 16:24:33 2021 +0100

    ACPI: tables: Add custom DSDT file as makefile prerequisite
    
    [ Upstream commit d1059c1b1146870c52f3dac12cb7b6cbf39ed27f ]
    
    A custom DSDT file is mostly used during development or debugging,
    and in that case it is quite likely to want to rebuild the kernel
    after changing ONLY the content of the DSDT.
    
    This patch adds the custom DSDT as a prerequisite to tables.o
    to ensure a rebuild if the DSDT file is updated. Make will merge
    the prerequisites from multiple rules for the same target.
    
    Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
index 6d59aa109a91..93f667140d8a 100644
--- a/drivers/acpi/Makefile
+++ b/drivers/acpi/Makefile
@@ -8,6 +8,11 @@ ccflags-$(CONFIG_ACPI_DEBUG)	+= -DACPI_DEBUG_OUTPUT
 #
 # ACPI Boot-Time Table Parsing
 #
+ifeq ($(CONFIG_ACPI_CUSTOM_DSDT),y)
+tables.o: $(src)/../../include/$(subst $\",,$(CONFIG_ACPI_CUSTOM_DSDT_FILE)) ;
+
+endif
+
 obj-$(CONFIG_ACPI)		+= tables.o
 obj-$(CONFIG_X86)		+= blacklist.o
 

commit 73af8425a57f69d00b0954a15f099355bb9783d5
Author: Paul E. McKenney <paulmck@kernel.org>
Date:   Thu May 27 12:01:19 2021 -0700

    clocksource: Retry clock read if long delays detected
    
    [ Upstream commit db3a34e17433de2390eb80d436970edcebd0ca3e ]
    
    When the clocksource watchdog marks a clock as unstable, this might be due
    to that clock being unstable or it might be due to delays that happen to
    occur between the reads of the two clocks.  Yes, interrupts are disabled
    across those two reads, but there are no shortage of things that can delay
    interrupts-disabled regions of code ranging from SMI handlers to vCPU
    preemption.  It would be good to have some indication as to why the clock
    was marked unstable.
    
    Therefore, re-read the watchdog clock on either side of the read from the
    clock under test.  If the watchdog clock shows an excessive time delta
    between its pair of reads, the reads are retried.
    
    The maximum number of retries is specified by a new kernel boot parameter
    clocksource.max_cswd_read_retries, which defaults to three, that is, up to
    four reads, one initial and up to three retries.  If more than one retry
    was required, a message is printed on the console (the occasional single
    retry is expected behavior, especially in guest OSes).  If the maximum
    number of retries is exceeded, the clock under test will be marked
    unstable.  However, the probability of this happening due to various sorts
    of delays is quite small.  In addition, the reason (clock-read delays) for
    the unstable marking will be apparent.
    
    Reported-by: Chris Mason <clm@fb.com>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Acked-by: Feng Tang <feng.tang@intel.com>
    Link: https://lore.kernel.org/r/20210527190124.440372-1-paulmck@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 558332df02a8..6795e9d187d0 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -558,6 +558,12 @@
 			loops can be debugged more effectively on production
 			systems.
 
+	clocksource.max_cswd_read_retries= [KNL]
+			Number of clocksource_watchdog() retries due to
+			external delays before the clock will be marked
+			unstable.  Defaults to three retries, that is,
+			four attempts to read the clock under test.
+
 	clearcpuid=BITNUM[,BITNUM...] [X86]
 			Disable CPUID feature X for the kernel. See
 			arch/x86/include/asm/cpufeatures.h for the valid bit
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c
index f80bb104c41a..221f8e7464c5 100644
--- a/kernel/time/clocksource.c
+++ b/kernel/time/clocksource.c
@@ -142,6 +142,13 @@ static void __clocksource_change_rating(struct clocksource *cs, int rating);
 #define WATCHDOG_INTERVAL (HZ >> 1)
 #define WATCHDOG_THRESHOLD (NSEC_PER_SEC >> 4)
 
+/*
+ * Maximum permissible delay between two readouts of the watchdog
+ * clocksource surrounding a read of the clocksource being validated.
+ * This delay could be due to SMIs, NMIs, or to VCPU preemptions.
+ */
+#define WATCHDOG_MAX_SKEW (100 * NSEC_PER_USEC)
+
 static void clocksource_watchdog_work(struct work_struct *work)
 {
 	/*
@@ -202,12 +209,45 @@ void clocksource_mark_unstable(struct clocksource *cs)
 	spin_unlock_irqrestore(&watchdog_lock, flags);
 }
 
+static ulong max_cswd_read_retries = 3;
+module_param(max_cswd_read_retries, ulong, 0644);
+
+static bool cs_watchdog_read(struct clocksource *cs, u64 *csnow, u64 *wdnow)
+{
+	unsigned int nretries;
+	u64 wd_end, wd_delta;
+	int64_t wd_delay;
+
+	for (nretries = 0; nretries <= max_cswd_read_retries; nretries++) {
+		local_irq_disable();
+		*wdnow = watchdog->read(watchdog);
+		*csnow = cs->read(cs);
+		wd_end = watchdog->read(watchdog);
+		local_irq_enable();
+
+		wd_delta = clocksource_delta(wd_end, *wdnow, watchdog->mask);
+		wd_delay = clocksource_cyc2ns(wd_delta, watchdog->mult,
+					      watchdog->shift);
+		if (wd_delay <= WATCHDOG_MAX_SKEW) {
+			if (nretries > 1 || nretries >= max_cswd_read_retries) {
+				pr_warn("timekeeping watchdog on CPU%d: %s retried %d times before success\n",
+					smp_processor_id(), watchdog->name, nretries);
+			}
+			return true;
+		}
+	}
+
+	pr_warn("timekeeping watchdog on CPU%d: %s read-back delay of %lldns, attempt %d, marking unstable\n",
+		smp_processor_id(), watchdog->name, wd_delay, nretries);
+	return false;
+}
+
 static void clocksource_watchdog(struct timer_list *unused)
 {
-	struct clocksource *cs;
 	u64 csnow, wdnow, cslast, wdlast, delta;
-	int64_t wd_nsec, cs_nsec;
 	int next_cpu, reset_pending;
+	int64_t wd_nsec, cs_nsec;
+	struct clocksource *cs;
 
 	spin_lock(&watchdog_lock);
 	if (!watchdog_running)
@@ -224,10 +264,11 @@ static void clocksource_watchdog(struct timer_list *unused)
 			continue;
 		}
 
-		local_irq_disable();
-		csnow = cs->read(cs);
-		wdnow = watchdog->read(watchdog);
-		local_irq_enable();
+		if (!cs_watchdog_read(cs, &csnow, &wdnow)) {
+			/* Clock readout unreliable, so give it up. */
+			__clocksource_unstable(cs);
+			continue;
+		}
 
 		/* Clocksource initialized ? */
 		if (!(cs->flags & CLOCK_SOURCE_WATCHDOG) ||

commit 8e889b3d35541dd8f4926efa22b7f8cf16320fa2
Author: Jiapeng Chong <jiapeng.chong@linux.alibaba.com>
Date:   Wed Jun 2 18:05:48 2021 +0800

    platform/x86: toshiba_acpi: Fix missing error code in toshiba_acpi_setup_keyboard()
    
    [ Upstream commit 28e367127718a9cb85d615a71e152f7acee41bfc ]
    
    The error code is missing in this code scenario, add the error code
    '-EINVAL' to the return value 'error'.
    
    Eliminate the follow smatch warning:
    
    drivers/platform/x86/toshiba_acpi.c:2834 toshiba_acpi_setup_keyboard()
    warn: missing error code 'error'.
    
    Reported-by: Abaci Robot <abaci@linux.alibaba.com>
    Signed-off-by: Jiapeng Chong <jiapeng.chong@linux.alibaba.com>
    Link: https://lore.kernel.org/r/1622628348-87035-1-git-send-email-jiapeng.chong@linux.alibaba.com
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/platform/x86/toshiba_acpi.c b/drivers/platform/x86/toshiba_acpi.c
index 8c3e9bac4754..bed2fd56a6d0 100644
--- a/drivers/platform/x86/toshiba_acpi.c
+++ b/drivers/platform/x86/toshiba_acpi.c
@@ -2853,6 +2853,7 @@ static int toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev)
 
 	if (!dev->info_supported && !dev->system_event_supported) {
 		pr_warn("No hotkey query interface found\n");
+		error = -EINVAL;
 		goto err_remove_filter;
 	}
 

commit b020044bee32c599b3e25f0b110b6e25e7f789d7
Author: Hanjun Guo <guohanjun@huawei.com>
Date:   Wed Jun 2 17:36:50 2021 +0800

    ACPI: bus: Call kobject_put() in acpi_init() error path
    
    [ Upstream commit 4ac7a817f1992103d4e68e9837304f860b5e7300 ]
    
    Although the system will not be in a good condition or it will not
    boot if acpi_bus_init() fails, it is still necessary to put the
    kobject in the error path before returning to avoid leaking memory.
    
    Signed-off-by: Hanjun Guo <guohanjun@huawei.com>
    [ rjw: Subject and changelog edits ]
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
index d60e57d14c85..d9dc9d2f38d5 100644
--- a/drivers/acpi/bus.c
+++ b/drivers/acpi/bus.c
@@ -1240,6 +1240,7 @@ static int __init acpi_init(void)
 	init_acpi_device_notify();
 	result = acpi_bus_init();
 	if (result) {
+		kobject_put(acpi_kobj);
 		disable_acpi();
 		return result;
 	}

commit cc346f84e15189ab3b0453d8aad8471fdb9ad28e
Author: Erik Kaneda <erik.kaneda@intel.com>
Date:   Fri Jun 4 14:25:57 2021 -0700

    ACPICA: Fix memory leak caused by _CID repair function
    
    [ Upstream commit c27bac0314131b11bccd735f7e8415ac6444b667 ]
    
    ACPICA commit 180cb53963aa876c782a6f52cc155d951b26051a
    
    According to the ACPI spec, _CID returns a package containing
    hardware ID's. Each element of an ASL package contains a reference
    count from the parent package as well as the element itself.
    
    Name (TEST, Package() {
        "String object" // this package element has a reference count of 2
    })
    
    A memory leak was caused in the _CID repair function because it did
    not decrement the reference count created by the package. Fix the
    memory leak by calling acpi_ut_remove_reference on _CID package elements
    that represent a hardware ID (_HID).
    
    Link: https://github.com/acpica/acpica/commit/180cb539
    Tested-by: Shawn Guo <shawn.guo@linaro.org>
    Signed-off-by: Erik Kaneda <erik.kaneda@intel.com>
    Signed-off-by: Bob Moore <robert.moore@intel.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/acpi/acpica/nsrepair2.c b/drivers/acpi/acpica/nsrepair2.c
index a3bd6280882c..4c8ce483805d 100644
--- a/drivers/acpi/acpica/nsrepair2.c
+++ b/drivers/acpi/acpica/nsrepair2.c
@@ -375,6 +375,13 @@ acpi_ns_repair_CID(struct acpi_evaluate_info *info,
 
 			(*element_ptr)->common.reference_count =
 			    original_ref_count;
+
+			/*
+			 * The original_element holds a reference from the package object
+			 * that represents _HID. Since a new element was created by _HID,
+			 * remove the reference from the _CID package.
+			 */
+			acpi_ut_remove_reference(original_element);
 		}
 
 		element_ptr++;

commit af02ec6cf6142bff7a2497c7fee83d0386379953
Author: Alexander Aring <aahringo@redhat.com>
Date:   Wed Jun 2 09:45:16 2021 -0400

    fs: dlm: fix memory leak when fenced
    
    [ Upstream commit 700ab1c363c7b54c9ea3222379b33fc00ab02f7b ]
    
    I got some kmemleak report when a node was fenced. The user space tool
    dlm_controld will therefore run some rmdir() in dlm configfs which was
    triggering some memleaks. This patch stores the sps and cms attributes
    which stores some handling for subdirectories of the configfs cluster
    entry and free them if they get released as the parent directory gets
    freed.
    
    unreferenced object 0xffff88810d9e3e00 (size 192):
      comm "dlm_controld", pid 342, jiffies 4294698126 (age 55438.801s)
      hex dump (first 32 bytes):
        00 00 00 00 00 00 00 00 73 70 61 63 65 73 00 00  ........spaces..
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<00000000db8b640b>] make_cluster+0x5d/0x360
        [<000000006a571db4>] configfs_mkdir+0x274/0x730
        [<00000000b094501c>] vfs_mkdir+0x27e/0x340
        [<0000000058b0adaf>] do_mkdirat+0xff/0x1b0
        [<00000000d1ffd156>] do_syscall_64+0x40/0x80
        [<00000000ab1408c8>] entry_SYSCALL_64_after_hwframe+0x44/0xae
    unreferenced object 0xffff88810d9e3a00 (size 192):
      comm "dlm_controld", pid 342, jiffies 4294698126 (age 55438.801s)
      hex dump (first 32 bytes):
        00 00 00 00 00 00 00 00 63 6f 6d 6d 73 00 00 00  ........comms...
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<00000000a7ef6ad2>] make_cluster+0x82/0x360
        [<000000006a571db4>] configfs_mkdir+0x274/0x730
        [<00000000b094501c>] vfs_mkdir+0x27e/0x340
        [<0000000058b0adaf>] do_mkdirat+0xff/0x1b0
        [<00000000d1ffd156>] do_syscall_64+0x40/0x80
        [<00000000ab1408c8>] entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Signed-off-by: Alexander Aring <aahringo@redhat.com>
    Signed-off-by: David Teigland <teigland@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/dlm/config.c b/fs/dlm/config.c
index f13d86524450..42b53e2a4e96 100644
--- a/fs/dlm/config.c
+++ b/fs/dlm/config.c
@@ -80,6 +80,9 @@ struct dlm_cluster {
 	unsigned int cl_new_rsb_count;
 	unsigned int cl_recover_callbacks;
 	char cl_cluster_name[DLM_LOCKSPACE_LEN];
+
+	struct dlm_spaces *sps;
+	struct dlm_comms *cms;
 };
 
 static struct dlm_cluster *config_item_to_cluster(struct config_item *i)
@@ -356,6 +359,9 @@ static struct config_group *make_cluster(struct config_group *g,
 	if (!cl || !sps || !cms)
 		goto fail;
 
+	cl->sps = sps;
+	cl->cms = cms;
+
 	config_group_init_type_name(&cl->group, name, &cluster_type);
 	config_group_init_type_name(&sps->ss_group, "spaces", &spaces_type);
 	config_group_init_type_name(&cms->cs_group, "comms", &comms_type);
@@ -405,6 +411,9 @@ static void drop_cluster(struct config_group *g, struct config_item *i)
 static void release_cluster(struct config_item *i)
 {
 	struct dlm_cluster *cl = config_item_to_cluster(i);
+
+	kfree(cl->sps);
+	kfree(cl->cms);
 	kfree(cl);
 }
 

commit 7fb82d7854198d15ee3f87c255e10ec8c9fe0347
Author: Richard Fitzgerald <rf@opensource.cirrus.com>
Date:   Tue May 25 13:20:12 2021 +0100

    random32: Fix implicit truncation warning in prandom_seed_state()
    
    [ Upstream commit d327ea15a305024ef0085252fa3657bbb1ce25f5 ]
    
    sparse generates the following warning:
    
     include/linux/prandom.h:114:45: sparse: sparse: cast truncates bits from
     constant value
    
    This is because the 64-bit seed value is manipulated and then placed in a
    u32, causing an implicit cast and truncation. A forced cast to u32 doesn't
    prevent this warning, which is reasonable because a typecast doesn't prove
    that truncation was expected.
    
    Logical-AND the value with 0xffffffff to make explicit that truncation to
    32-bit is intended.
    
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
    Reviewed-by: Petr Mladek <pmladek@suse.com>
    Signed-off-by: Petr Mladek <pmladek@suse.com>
    Link: https://lore.kernel.org/r/20210525122012.6336-3-rf@opensource.cirrus.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/prandom.h b/include/linux/prandom.h
index cc1e71334e53..e20339c78a84 100644
--- a/include/linux/prandom.h
+++ b/include/linux/prandom.h
@@ -93,7 +93,7 @@ static inline u32 __seed(u32 x, u32 m)
  */
 static inline void prandom_seed_state(struct rnd_state *state, u64 seed)
 {
-	u32 i = (seed >> 32) ^ (seed << 10) ^ seed;
+	u32 i = ((seed >> 32) ^ (seed << 10) ^ seed) & 0xffffffffUL;
 
 	state->s1 = __seed(i,   2U);
 	state->s2 = __seed(i,   8U);

commit d5473f43e4fb27550512bebf62d029f4850b4b3d
Author: Alexander Aring <aahringo@redhat.com>
Date:   Fri May 21 15:08:38 2021 -0400

    fs: dlm: cancel work sync othercon
    
    [ Upstream commit c6aa00e3d20c2767ba3f57b64eb862572b9744b3 ]
    
    These rx tx flags arguments are for signaling close_connection() from
    which worker they are called. Obviously the receive worker cannot cancel
    itself and vice versa for swork. For the othercon the receive worker
    should only be used, however to avoid deadlocks we should pass the same
    flags as the original close_connection() was called.
    
    Signed-off-by: Alexander Aring <aahringo@redhat.com>
    Signed-off-by: David Teigland <teigland@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
index a93ebffe84b3..f476a90e8aae 100644
--- a/fs/dlm/lowcomms.c
+++ b/fs/dlm/lowcomms.c
@@ -609,7 +609,7 @@ static void close_connection(struct connection *con, bool and_other,
 	}
 	if (con->othercon && and_other) {
 		/* Will only re-enter once. */
-		close_connection(con->othercon, false, true, true);
+		close_connection(con->othercon, false, tx, rx);
 	}
 	if (con->rx_page) {
 		__free_page(con->rx_page);

commit 96a6185a9f0966347d7133268d824c8cf09ebbf3
Author: zhangyi (F) <yi.zhang@huawei.com>
Date:   Sat Mar 13 11:01:44 2021 +0800

    block_dump: remove block_dump feature in mark_inode_dirty()
    
    [ Upstream commit 12e0613715e1cf305fffafaf0e89d810d9a85cc0 ]
    
    block_dump is an old debugging interface, one of it's functions is used
    to print the information about who write which file on disk. If we
    enable block_dump through /proc/sys/vm/block_dump and turn on debug log
    level, we can gather information about write process name, target file
    name and disk from kernel message. This feature is realized in
    block_dump___mark_inode_dirty(), it print above information into kernel
    message directly when marking inode dirty, so it is noisy and can easily
    trigger log storm. At the same time, get the dentry refcount is also not
    safe, we found it will lead to deadlock on ext4 file system with
    data=journal mode.
    
    After tracepoints has been introduced into the kernel, we got a
    tracepoint in __mark_inode_dirty(), which is a better replacement of
    block_dump___mark_inode_dirty(). The only downside is that it only trace
    the inode number and not a file name, but it probably doesn't matter
    because the original printed file name in block_dump is not accurate in
    some cases, and we can still find it through the inode number and device
    id. So this patch delete the dirting inode part of block_dump feature.
    
    Signed-off-by: zhangyi (F) <yi.zhang@huawei.com>
    Reviewed-by: Jan Kara <jack@suse.cz>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Link: https://lore.kernel.org/r/20210313030146.2882027-2-yi.zhang@huawei.com
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
index a247cb4b00e2..fc9167e65287 100644
--- a/fs/fs-writeback.c
+++ b/fs/fs-writeback.c
@@ -2115,28 +2115,6 @@ int dirtytime_interval_handler(struct ctl_table *table, int write,
 	return ret;
 }
 
-static noinline void block_dump___mark_inode_dirty(struct inode *inode)
-{
-	if (inode->i_ino || strcmp(inode->i_sb->s_id, "bdev")) {
-		struct dentry *dentry;
-		const char *name = "?";
-
-		dentry = d_find_alias(inode);
-		if (dentry) {
-			spin_lock(&dentry->d_lock);
-			name = (const char *) dentry->d_name.name;
-		}
-		printk(KERN_DEBUG
-		       "%s(%d): dirtied inode %lu (%s) on %s\n",
-		       current->comm, task_pid_nr(current), inode->i_ino,
-		       name, inode->i_sb->s_id);
-		if (dentry) {
-			spin_unlock(&dentry->d_lock);
-			dput(dentry);
-		}
-	}
-}
-
 /**
  * __mark_inode_dirty -	internal function
  *
@@ -2196,9 +2174,6 @@ void __mark_inode_dirty(struct inode *inode, int flags)
 	    (dirtytime && (inode->i_state & I_DIRTY_INODE)))
 		return;
 
-	if (unlikely(block_dump))
-		block_dump___mark_inode_dirty(inode);
-
 	spin_lock(&inode->i_lock);
 	if (dirtytime && (inode->i_state & I_DIRTY_INODE))
 		goto out_unlock_inode;

commit 4a5cdb908e425335641f795eb3e88f601b0d7be5
Author: Chris Chiu <chris.chiu@canonical.com>
Date:   Thu May 20 11:09:50 2021 +0800

    ACPI: EC: Make more Asus laptops use ECDT _GPE
    
    [ Upstream commit 6306f0431914beaf220634ad36c08234006571d5 ]
    
    More ASUS laptops have the _GPE define in the DSDT table with a
    different value than the _GPE number in the ECDT.
    
    This is causing media keys not working on ASUS X505BA/BP, X542BA/BP
    
    Add model info to the quirks list.
    
    Signed-off-by: Chris Chiu <chris.chiu@canonical.com>
    Signed-off-by: Jian-Hong Pan <jhp@endlessos.org>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
index 9415a0041aaf..e3df3dda0332 100644
--- a/drivers/acpi/ec.c
+++ b/drivers/acpi/ec.c
@@ -1904,6 +1904,22 @@ static const struct dmi_system_id ec_dmi_table[] __initconst = {
 	DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
 	DMI_MATCH(DMI_PRODUCT_NAME, "GL702VMK"),}, NULL},
 	{
+	ec_honor_ecdt_gpe, "ASUSTeK COMPUTER INC. X505BA", {
+	DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
+	DMI_MATCH(DMI_PRODUCT_NAME, "X505BA"),}, NULL},
+	{
+	ec_honor_ecdt_gpe, "ASUSTeK COMPUTER INC. X505BP", {
+	DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
+	DMI_MATCH(DMI_PRODUCT_NAME, "X505BP"),}, NULL},
+	{
+	ec_honor_ecdt_gpe, "ASUSTeK COMPUTER INC. X542BA", {
+	DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
+	DMI_MATCH(DMI_PRODUCT_NAME, "X542BA"),}, NULL},
+	{
+	ec_honor_ecdt_gpe, "ASUSTeK COMPUTER INC. X542BP", {
+	DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
+	DMI_MATCH(DMI_PRODUCT_NAME, "X542BP"),}, NULL},
+	{
 	ec_honor_ecdt_gpe, "ASUS X550VXK", {
 	DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
 	DMI_MATCH(DMI_PRODUCT_NAME, "X550VXK"),}, NULL},

commit 8278bf4874aac63527e32f010d411e05a66d1953
Author: Richard Fitzgerald <rf@opensource.cirrus.com>
Date:   Fri May 14 17:12:04 2021 +0100

    lib: vsprintf: Fix handling of number field widths in vsscanf
    
    [ Upstream commit 900fdc4573766dd43b847b4f54bd4a1ee2bc7360 ]
    
    The existing code attempted to handle numbers by doing a strto[u]l(),
    ignoring the field width, and then repeatedly dividing to extract the
    field out of the full converted value. If the string contains a run of
    valid digits longer than will fit in a long or long long, this would
    overflow and no amount of dividing can recover the correct value.
    
    This patch fixes vsscanf() to obey number field widths when parsing
    the number.
    
    A new _parse_integer_limit() is added that takes a limit for the number
    of characters to parse. The number field conversion in vsscanf is changed
    to use this new function.
    
    If a number starts with a radix prefix, the field width  must be long
    enough for at last one digit after the prefix. If not, it will be handled
    like this:
    
     sscanf("0x4", "%1i", &i): i=0, scanning continues with the 'x'
     sscanf("0x4", "%2i", &i): i=0, scanning continues with the '4'
    
    This is consistent with the observed behaviour of userland sscanf.
    
    Note that this patch does NOT fix the problem of a single field value
    overflowing the target type. So for example:
    
      sscanf("123456789abcdef", "%x", &i);
    
    Will not produce the correct result because the value obviously overflows
    INT_MAX. But sscanf will report a successful conversion.
    
    Note that where a very large number is used to mean "unlimited", the value
    INT_MAX is used for consistency with the behaviour of vsnprintf().
    
    Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
    Reviewed-by: Petr Mladek <pmladek@suse.com>
    Signed-off-by: Petr Mladek <pmladek@suse.com>
    Link: https://lore.kernel.org/r/20210514161206.30821-2-rf@opensource.cirrus.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/lib/kstrtox.c b/lib/kstrtox.c
index 661a1e807bd1..1a02b87b19c7 100644
--- a/lib/kstrtox.c
+++ b/lib/kstrtox.c
@@ -39,20 +39,22 @@ const char *_parse_integer_fixup_radix(const char *s, unsigned int *base)
 
 /*
  * Convert non-negative integer string representation in explicitly given radix
- * to an integer.
+ * to an integer. A maximum of max_chars characters will be converted.
+ *
  * Return number of characters consumed maybe or-ed with overflow bit.
  * If overflow occurs, result integer (incorrect) is still returned.
  *
  * Don't you dare use this function.
  */
-unsigned int _parse_integer(const char *s, unsigned int base, unsigned long long *p)
+unsigned int _parse_integer_limit(const char *s, unsigned int base, unsigned long long *p,
+				  size_t max_chars)
 {
 	unsigned long long res;
 	unsigned int rv;
 
 	res = 0;
 	rv = 0;
-	while (1) {
+	while (max_chars--) {
 		unsigned int c = *s;
 		unsigned int lc = c | 0x20; /* don't tolower() this line */
 		unsigned int val;
@@ -82,6 +84,11 @@ unsigned int _parse_integer(const char *s, unsigned int base, unsigned long long
 	return rv;
 }
 
+unsigned int _parse_integer(const char *s, unsigned int base, unsigned long long *p)
+{
+	return _parse_integer_limit(s, base, p, INT_MAX);
+}
+
 static int _kstrtoull(const char *s, unsigned int base, unsigned long long *res)
 {
 	unsigned long long _res;
diff --git a/lib/kstrtox.h b/lib/kstrtox.h
index 3b4637bcd254..158c400ca865 100644
--- a/lib/kstrtox.h
+++ b/lib/kstrtox.h
@@ -4,6 +4,8 @@
 
 #define KSTRTOX_OVERFLOW	(1U << 31)
 const char *_parse_integer_fixup_radix(const char *s, unsigned int *base);
+unsigned int _parse_integer_limit(const char *s, unsigned int base, unsigned long long *res,
+				  size_t max_chars);
 unsigned int _parse_integer(const char *s, unsigned int base, unsigned long long *res);
 
 #endif
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index 812e59e13fe6..c2619510636e 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -47,6 +47,31 @@
 #include <linux/string_helpers.h>
 #include "kstrtox.h"
 
+static unsigned long long simple_strntoull(const char *startp, size_t max_chars,
+					   char **endp, unsigned int base)
+{
+	const char *cp;
+	unsigned long long result = 0ULL;
+	size_t prefix_chars;
+	unsigned int rv;
+
+	cp = _parse_integer_fixup_radix(startp, &base);
+	prefix_chars = cp - startp;
+	if (prefix_chars < max_chars) {
+		rv = _parse_integer_limit(cp, base, &result, max_chars - prefix_chars);
+		/* FIXME */
+		cp += (rv & ~KSTRTOX_OVERFLOW);
+	} else {
+		/* Field too short for prefix + digit, skip over without converting */
+		cp = startp + max_chars;
+	}
+
+	if (endp)
+		*endp = (char *)cp;
+
+	return result;
+}
+
 /**
  * simple_strtoull - convert a string to an unsigned long long
  * @cp: The start of the string
@@ -57,18 +82,7 @@
  */
 unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base)
 {
-	unsigned long long result;
-	unsigned int rv;
-
-	cp = _parse_integer_fixup_radix(cp, &base);
-	rv = _parse_integer(cp, base, &result);
-	/* FIXME */
-	cp += (rv & ~KSTRTOX_OVERFLOW);
-
-	if (endp)
-		*endp = (char *)cp;
-
-	return result;
+	return simple_strntoull(cp, INT_MAX, endp, base);
 }
 EXPORT_SYMBOL(simple_strtoull);
 
@@ -103,6 +117,21 @@ long simple_strtol(const char *cp, char **endp, unsigned int base)
 }
 EXPORT_SYMBOL(simple_strtol);
 
+static long long simple_strntoll(const char *cp, size_t max_chars, char **endp,
+				 unsigned int base)
+{
+	/*
+	 * simple_strntoull() safely handles receiving max_chars==0 in the
+	 * case cp[0] == '-' && max_chars == 1.
+	 * If max_chars == 0 we can drop through and pass it to simple_strntoull()
+	 * and the content of *cp is irrelevant.
+	 */
+	if (*cp == '-' && max_chars > 0)
+		return -simple_strntoull(cp + 1, max_chars - 1, endp, base);
+
+	return simple_strntoull(cp, max_chars, endp, base);
+}
+
 /**
  * simple_strtoll - convert a string to a signed long long
  * @cp: The start of the string
@@ -113,10 +142,7 @@ EXPORT_SYMBOL(simple_strtol);
  */
 long long simple_strtoll(const char *cp, char **endp, unsigned int base)
 {
-	if (*cp == '-')
-		return -simple_strtoull(cp + 1, endp, base);
-
-	return simple_strtoull(cp, endp, base);
+	return simple_strntoll(cp, INT_MAX, endp, base);
 }
 EXPORT_SYMBOL(simple_strtoll);
 
@@ -3117,25 +3143,13 @@ int vsscanf(const char *buf, const char *fmt, va_list args)
 			break;
 
 		if (is_sign)
-			val.s = qualifier != 'L' ?
-				simple_strtol(str, &next, base) :
-				simple_strtoll(str, &next, base);
+			val.s = simple_strntoll(str,
+						field_width >= 0 ? field_width : INT_MAX,
+						&next, base);
 		else
-			val.u = qualifier != 'L' ?
-				simple_strtoul(str, &next, base) :
-				simple_strtoull(str, &next, base);
-
-		if (field_width > 0 && next - str > field_width) {
-			if (base == 0)
-				_parse_integer_fixup_radix(str, &base);
-			while (next - str > field_width) {
-				if (is_sign)
-					val.s = div_s64(val.s, base);
-				else
-					val.u = div_u64(val.u, base);
-				--next;
-			}
-		}
+			val.u = simple_strntoull(str,
+						 field_width >= 0 ? field_width : INT_MAX,
+						 &next, base);
 
 		switch (qualifier) {
 		case 'H':	/* that's 'hh' in format */

commit f1aa9139dd73bfa60135207a50ac17b2ddc2b999
Author: YueHaibing <yuehaibing@huawei.com>
Date:   Fri May 14 15:01:16 2021 +0800

    hv_utils: Fix passing zero to 'PTR_ERR' warning
    
    [ Upstream commit c6a8625fa4c6b0a97860d053271660ccedc3d1b3 ]
    
    Sparse warn this:
    
    drivers/hv/hv_util.c:753 hv_timesync_init() warn:
     passing zero to 'PTR_ERR'
    
    Use PTR_ERR_OR_ZERO instead of PTR_ERR to fix this.
    
    Signed-off-by: YueHaibing <yuehaibing@huawei.com>
    Link: https://lore.kernel.org/r/20210514070116.16800-1-yuehaibing@huawei.com
    [ wei: change %ld to %d ]
    Signed-off-by: Wei Liu <wei.liu@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hv/hv_util.c b/drivers/hv/hv_util.c
index 423205077bf6..2003314dcfbe 100644
--- a/drivers/hv/hv_util.c
+++ b/drivers/hv/hv_util.c
@@ -548,8 +548,8 @@ static int hv_timesync_init(struct hv_util_service *srv)
 	 */
 	hv_ptp_clock = ptp_clock_register(&ptp_hyperv_info, NULL);
 	if (IS_ERR_OR_NULL(hv_ptp_clock)) {
-		pr_err("cannot register PTP clock: %ld\n",
-		       PTR_ERR(hv_ptp_clock));
+		pr_err("cannot register PTP clock: %d\n",
+		       PTR_ERR_OR_ZERO(hv_ptp_clock));
 		hv_ptp_clock = NULL;
 	}
 

commit 33f09d202e851ded5d1d9db1b059388da33f2361
Author: Mario Limonciello <mario.limonciello@amd.com>
Date:   Wed May 12 17:15:14 2021 -0500

    ACPI: processor idle: Fix up C-state latency if not ordered
    
    [ Upstream commit 65ea8f2c6e230bdf71fed0137cf9e9d1b307db32 ]
    
    Generally, the C-state latency is provided by the _CST method or
    FADT, but some OEM platforms using AMD Picasso, Renoir, Van Gogh,
    and Cezanne set the C2 latency greater than C3's which causes the
    C2 state to be skipped.
    
    That will block the core entering PC6, which prevents S0ix working
    properly on Linux systems.
    
    In other operating systems, the latency values are not validated and
    this does not cause problems by skipping states.
    
    To avoid this issue on Linux, detect when latencies are not an
    arithmetic progression and sort them.
    
    Link: https://gitlab.freedesktop.org/agd5f/linux/-/commit/026d186e4592c1ee9c1cb44295912d0294508725
    Link: https://gitlab.freedesktop.org/drm/amd/-/issues/1230#note_712174
    Suggested-by: Prike Liang <Prike.Liang@amd.com>
    Suggested-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
    [ rjw: Subject and changelog edits ]
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
index abb559cd28d7..d80010ac2a43 100644
--- a/drivers/acpi/processor_idle.c
+++ b/drivers/acpi/processor_idle.c
@@ -29,6 +29,7 @@
 #include <linux/acpi.h>
 #include <linux/dmi.h>
 #include <linux/sched.h>       /* need_resched() */
+#include <linux/sort.h>
 #include <linux/tick.h>
 #include <linux/cpuidle.h>
 #include <linux/cpu.h>
@@ -544,10 +545,37 @@ static void acpi_processor_power_verify_c3(struct acpi_processor *pr,
 	return;
 }
 
+static int acpi_cst_latency_cmp(const void *a, const void *b)
+{
+	const struct acpi_processor_cx *x = a, *y = b;
+
+	if (!(x->valid && y->valid))
+		return 0;
+	if (x->latency > y->latency)
+		return 1;
+	if (x->latency < y->latency)
+		return -1;
+	return 0;
+}
+static void acpi_cst_latency_swap(void *a, void *b, int n)
+{
+	struct acpi_processor_cx *x = a, *y = b;
+	u32 tmp;
+
+	if (!(x->valid && y->valid))
+		return;
+	tmp = x->latency;
+	x->latency = y->latency;
+	y->latency = tmp;
+}
+
 static int acpi_processor_power_verify(struct acpi_processor *pr)
 {
 	unsigned int i;
 	unsigned int working = 0;
+	unsigned int last_latency = 0;
+	unsigned int last_type = 0;
+	bool buggy_latency = false;
 
 	pr->power.timer_broadcast_on_state = INT_MAX;
 
@@ -571,12 +599,24 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)
 		}
 		if (!cx->valid)
 			continue;
+		if (cx->type >= last_type && cx->latency < last_latency)
+			buggy_latency = true;
+		last_latency = cx->latency;
+		last_type = cx->type;
 
 		lapic_timer_check_state(i, pr, cx);
 		tsc_check_state(cx->type);
 		working++;
 	}
 
+	if (buggy_latency) {
+		pr_notice("FW issue: working around C-state latencies out of order\n");
+		sort(&pr->power.states[1], max_cstate,
+		     sizeof(struct acpi_processor_cx),
+		     acpi_cst_latency_cmp,
+		     acpi_cst_latency_swap);
+	}
+
 	lapic_timer_propagate_broadcast(pr);
 
 	return (working);

commit 413d1eadc3c069c0687ba03cd30425798ef29a26
Author: Bixuan Cui <cuibixuan@huawei.com>
Date:   Wed May 12 11:37:27 2021 +0800

    EDAC/ti: Add missing MODULE_DEVICE_TABLE
    
    [ Upstream commit 0a37f32ba5272b2d4ec8c8d0f6b212b81b578f7e ]
    
    The module misses MODULE_DEVICE_TABLE() for of_device_id tables and thus
    never autoloads on ID matches.
    
    Add the missing declaration.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Bixuan Cui <cuibixuan@huawei.com>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Cc: Tero Kristo <kristo@kernel.org>
    Link: https://lkml.kernel.org/r/20210512033727.26701-1-cuibixuan@huawei.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/edac/ti_edac.c b/drivers/edac/ti_edac.c
index 324768946743..9ab9fa0a911b 100644
--- a/drivers/edac/ti_edac.c
+++ b/drivers/edac/ti_edac.c
@@ -197,6 +197,7 @@ static const struct of_device_id ti_edac_of_match[] = {
 	{ .compatible = "ti,emif-dra7xx", .data = (void *)EMIF_TYPE_DRA7 },
 	{},
 };
+MODULE_DEVICE_TABLE(of, ti_edac_of_match);
 
 static int _emif_get_id(struct device_node *node)
 {

commit eb38cd3037d00267297f3f5635dd19dc54353ad1
Author: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Date:   Fri Mar 19 17:27:16 2021 -0700

    HID: do not use down_interruptible() when unbinding devices
    
    [ Upstream commit f2145f8dc566c4f3b5a8deb58dcd12bed4e20194 ]
    
    Action of unbinding driver from a device is not cancellable and should not
    fail, and driver core does not pay attention to the result of "remove"
    method, therefore using down_interruptible() in hid_device_remove() does
    not make sense.
    
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index acbbc21e6233..4549fbb74156 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -2124,12 +2124,8 @@ static int hid_device_remove(struct device *dev)
 {
 	struct hid_device *hdev = to_hid_device(dev);
 	struct hid_driver *hdrv;
-	int ret = 0;
 
-	if (down_interruptible(&hdev->driver_input_lock)) {
-		ret = -EINTR;
-		goto end;
-	}
+	down(&hdev->driver_input_lock);
 	hdev->io_started = false;
 
 	hdrv = hdev->driver;
@@ -2144,8 +2140,8 @@ static int hid_device_remove(struct device *dev)
 
 	if (!hdev->io_started)
 		up(&hdev->driver_input_lock);
-end:
-	return ret;
+
+	return 0;
 }
 
 static ssize_t modalias_show(struct device *dev, struct device_attribute *a,

commit 0644482130a6bb2e9e7ccbfc93563e7f04c99693
Author: Axel Lin <axel.lin@ingics.com>
Date:   Fri Jun 18 22:14:11 2021 +0800

    regulator: da9052: Ensure enough delay time for .set_voltage_time_sel
    
    [ Upstream commit a336dc8f683e5be794186b5643cd34cb28dd2c53 ]
    
    Use DIV_ROUND_UP to prevent truncation by integer division issue.
    This ensures we return enough delay time.
    
    Also fix returning negative value when new_sel < old_sel.
    
    Signed-off-by: Axel Lin <axel.lin@ingics.com>
    Link: https://lore.kernel.org/r/20210618141412.4014912-1-axel.lin@ingics.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/regulator/da9052-regulator.c b/drivers/regulator/da9052-regulator.c
index 9ececfef42d6..bd91c95f73e0 100644
--- a/drivers/regulator/da9052-regulator.c
+++ b/drivers/regulator/da9052-regulator.c
@@ -258,7 +258,8 @@ static int da9052_regulator_set_voltage_time_sel(struct regulator_dev *rdev,
 	case DA9052_ID_BUCK3:
 	case DA9052_ID_LDO2:
 	case DA9052_ID_LDO3:
-		ret = (new_sel - old_sel) * info->step_uV / 6250;
+		ret = DIV_ROUND_UP(abs(new_sel - old_sel) * info->step_uV,
+				   6250);
 		break;
 	}
 

commit 7333841bae6e58e32e76f49541785e872dcc0ee0
Author: Christophe Leroy <christophe.leroy@csgroup.eu>
Date:   Thu Jun 10 05:23:02 2021 +0000

    btrfs: disable build on platforms having page size 256K
    
    [ Upstream commit b05fbcc36be1f8597a1febef4892053a0b2f3f60 ]
    
    With a config having PAGE_SIZE set to 256K, BTRFS build fails
    with the following message
    
      include/linux/compiler_types.h:326:38: error: call to
      '__compiletime_assert_791' declared with attribute error:
      BUILD_BUG_ON failed: (BTRFS_MAX_COMPRESSED % PAGE_SIZE) != 0
    
    BTRFS_MAX_COMPRESSED being 128K, BTRFS cannot support platforms with
    256K pages at the time being.
    
    There are two platforms that can select 256K pages:
     - hexagon
     - powerpc
    
    Disable BTRFS when 256K page size is selected. Supporting this would
    require changes to the subpage mode that's currently being developed.
    Given that 256K is many times larger than page sizes commonly used and
    for what the algorithms and structures have been tuned, it's out of
    scope and disabling build is a reasonable option.
    
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
    [ update changelog ]
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/btrfs/Kconfig b/fs/btrfs/Kconfig
index 23537bc8c827..7233127bb93a 100644
--- a/fs/btrfs/Kconfig
+++ b/fs/btrfs/Kconfig
@@ -12,6 +12,8 @@ config BTRFS_FS
 	select RAID6_PQ
 	select XOR_BLOCKS
 	select SRCU
+	depends on !PPC_256K_PAGES	# powerpc
+	depends on !PAGE_SIZE_256KB	# hexagon
 
 	help
 	  Btrfs is a general purpose copy-on-write filesystem with extents,

commit 41a5f2820aaa24281818143d9f1fafd6b438f944
Author: Josef Bacik <josef@toxicpanda.com>
Date:   Fri May 21 16:44:09 2021 -0400

    btrfs: abort transaction if we fail to update the delayed inode
    
    [ Upstream commit 04587ad9bef6ce9d510325b4ba9852b6129eebdb ]
    
    If we fail to update the delayed inode we need to abort the transaction,
    because we could leave an inode with the improper counts or some other
    such corruption behind.
    
    Signed-off-by: Josef Bacik <josef@toxicpanda.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c
index f3994ee1a6e6..1fbe2dee1e70 100644
--- a/fs/btrfs/delayed-inode.c
+++ b/fs/btrfs/delayed-inode.c
@@ -1071,6 +1071,14 @@ static int __btrfs_update_delayed_inode(struct btrfs_trans_handle *trans,
 	btrfs_delayed_inode_release_metadata(fs_info, node, (ret < 0));
 	btrfs_release_delayed_inode(node);
 
+	/*
+	 * If we fail to update the delayed inode we need to abort the
+	 * transaction, because we could leave the inode with the improper
+	 * counts behind.
+	 */
+	if (ret && ret != -ENOENT)
+		btrfs_abort_transaction(trans, ret);
+
 	return ret;
 
 search:

commit 5a9e95173b9ebe9943ac6858e0143f96dc02b16b
Author: Josef Bacik <josef@toxicpanda.com>
Date:   Fri May 21 16:44:08 2021 -0400

    btrfs: fix error handling in __btrfs_update_delayed_inode
    
    [ Upstream commit bb385bedded3ccbd794559600de4a09448810f4a ]
    
    If we get an error while looking up the inode item we'll simply bail
    without cleaning up the delayed node.  This results in this style of
    warning happening on commit:
    
      WARNING: CPU: 0 PID: 76403 at fs/btrfs/delayed-inode.c:1365 btrfs_assert_delayed_root_empty+0x5b/0x90
      CPU: 0 PID: 76403 Comm: fsstress Tainted: G        W         5.13.0-rc1+ #373
      Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.13.0-2.fc32 04/01/2014
      RIP: 0010:btrfs_assert_delayed_root_empty+0x5b/0x90
      RSP: 0018:ffffb8bb815a7e50 EFLAGS: 00010286
      RAX: 0000000000000000 RBX: ffff95d6d07e1888 RCX: ffff95d6c0fa3000
      RDX: 0000000000000002 RSI: 000000000029e91c RDI: ffff95d6c0fc8060
      RBP: ffff95d6c0fc8060 R08: 00008d6d701a2c1d R09: 0000000000000000
      R10: ffff95d6d1760ea0 R11: 0000000000000001 R12: ffff95d6c15a4d00
      R13: ffff95d6c0fa3000 R14: 0000000000000000 R15: ffffb8bb815a7e90
      FS:  00007f490e8dbb80(0000) GS:ffff95d73bc00000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 00007f6e75555cb0 CR3: 00000001101ce001 CR4: 0000000000370ef0
      Call Trace:
       btrfs_commit_transaction+0x43c/0xb00
       ? finish_wait+0x80/0x80
       ? vfs_fsync_range+0x90/0x90
       iterate_supers+0x8c/0x100
       ksys_sync+0x50/0x90
       __do_sys_sync+0xa/0x10
       do_syscall_64+0x3d/0x80
       entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Because the iref isn't dropped and this leaves an elevated node->count,
    so any release just re-queues it onto the delayed inodes list.  Fix this
    by going to the out label to handle the proper cleanup of the delayed
    node.
    
    Signed-off-by: Josef Bacik <josef@toxicpanda.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c
index fea5ccfade5c..f3994ee1a6e6 100644
--- a/fs/btrfs/delayed-inode.c
+++ b/fs/btrfs/delayed-inode.c
@@ -1030,12 +1030,10 @@ static int __btrfs_update_delayed_inode(struct btrfs_trans_handle *trans,
 	nofs_flag = memalloc_nofs_save();
 	ret = btrfs_lookup_inode(trans, root, path, &key, mod);
 	memalloc_nofs_restore(nofs_flag);
-	if (ret > 0) {
-		btrfs_release_path(path);
-		return -ENOENT;
-	} else if (ret < 0) {
-		return ret;
-	}
+	if (ret > 0)
+		ret = -ENOENT;
+	if (ret < 0)
+		goto out;
 
 	leaf = path->nodes[0];
 	inode_item = btrfs_item_ptr(leaf, path->slots[0],

commit 279dccd556cd780d0ad23ea0d25c9ed231bc187c
Author: Steve Longerbeam <slongerbeam@gmail.com>
Date:   Mon May 17 16:29:23 2021 +0200

    media: imx-csi: Skip first few frames from a BT.656 source
    
    [ Upstream commit e198be37e52551bb863d07d2edc535d0932a3c4f ]
    
    Some BT.656 sensors (e.g. ADV718x) transmit frames with unstable BT.656
    sync codes after initial power on. This confuses the imx CSI,resulting
    in vertical and/or horizontal sync issues. Skip the first 20 frames
    to avoid the unstable sync codes.
    
    [fabio: fixed checkpatch warning and increased the frame skipping to 20]
    
    Signed-off-by: Steve Longerbeam <slongerbeam@gmail.com>
    Signed-off-by: Fabio Estevam <festevam@gmail.com>
    Reviewed-by: Tim Harvey <tharvey@gateworks.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/staging/media/imx/imx-media-csi.c b/drivers/staging/media/imx/imx-media-csi.c
index 0f8fdc347091..c7df0ffb3510 100644
--- a/drivers/staging/media/imx/imx-media-csi.c
+++ b/drivers/staging/media/imx/imx-media-csi.c
@@ -730,9 +730,10 @@ static int csi_setup(struct csi_priv *priv)
 
 static int csi_start(struct csi_priv *priv)
 {
-	struct v4l2_fract *output_fi;
+	struct v4l2_fract *input_fi, *output_fi;
 	int ret;
 
+	input_fi = &priv->frame_interval[CSI_SINK_PAD];
 	output_fi = &priv->frame_interval[priv->active_output_pad];
 
 	/* start upstream */
@@ -741,6 +742,17 @@ static int csi_start(struct csi_priv *priv)
 	if (ret)
 		return ret;
 
+	/* Skip first few frames from a BT.656 source */
+	if (priv->upstream_ep.bus_type == V4L2_MBUS_BT656) {
+		u32 delay_usec, bad_frames = 20;
+
+		delay_usec = DIV_ROUND_UP_ULL((u64)USEC_PER_SEC *
+			input_fi->numerator * bad_frames,
+			input_fi->denominator);
+
+		usleep_range(delay_usec, delay_usec + 1000);
+	}
+
 	if (priv->dest == IPU_CSI_DEST_IDMAC) {
 		ret = csi_idmac_start(priv);
 		if (ret)

commit 2f6d707fab64ddfebfb65cc4dacfee9d19ad03a8
Author: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Date:   Thu Jun 10 08:57:02 2021 +0200

    media: siano: fix device register error path
    
    [ Upstream commit 5368b1ee2939961a16e74972b69088433fc52195 ]
    
    As reported by smatch:
            drivers/media/common/siano/smsdvb-main.c:1231 smsdvb_hotplug() warn: '&client->entry' not removed from list
    
    If an error occur at the end of the registration logic, it won't
    drop the device from the list.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/common/siano/smsdvb-main.c b/drivers/media/common/siano/smsdvb-main.c
index afca47b97c2a..637ace7a2b5c 100644
--- a/drivers/media/common/siano/smsdvb-main.c
+++ b/drivers/media/common/siano/smsdvb-main.c
@@ -1187,6 +1187,10 @@ static int smsdvb_hotplug(struct smscore_device_t *coredev,
 	return 0;
 
 media_graph_error:
+	mutex_lock(&g_smsdvb_clientslock);
+	list_del(&client->entry);
+	mutex_unlock(&g_smsdvb_clientslock);
+
 	smsdvb_debugfs_release(client);
 
 client_error:

commit 5f6f52d667c7fcfd36f534e542b2c3bdaea1b5ff
Author: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Date:   Wed Jun 16 13:13:54 2021 +0200

    media: dvb_net: avoid speculation from net slot
    
    [ Upstream commit abc0226df64dc137b48b911c1fe4319aec5891bb ]
    
    The risk of especulation is actually almost-non-existing here,
    as there are very few users of TCP/IP using the DVB stack,
    as, this is mainly used with DVB-S/S2 cards, and only by people
    that receives TCP/IP from satellite connections, which limits
    a lot the number of users of such feature(*).
    
    (*) In thesis, DVB-C cards could also benefit from it, but I'm
    yet to see a hardware that supports it.
    
    Yet, fixing it is trivial.
    
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/dvb-core/dvb_net.c b/drivers/media/dvb-core/dvb_net.c
index 10f78109bb3f..3f154755bbc6 100644
--- a/drivers/media/dvb-core/dvb_net.c
+++ b/drivers/media/dvb-core/dvb_net.c
@@ -56,6 +56,7 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/netdevice.h>
+#include <linux/nospec.h>
 #include <linux/etherdevice.h>
 #include <linux/dvb/net.h>
 #include <linux/uio.h>
@@ -1473,14 +1474,20 @@ static int dvb_net_do_ioctl(struct file *file,
 		struct net_device *netdev;
 		struct dvb_net_priv *priv_data;
 		struct dvb_net_if *dvbnetif = parg;
+		int if_num = dvbnetif->if_num;
 
-		if (dvbnetif->if_num >= DVB_NET_DEVICES_MAX ||
-		    !dvbnet->state[dvbnetif->if_num]) {
+		if (if_num >= DVB_NET_DEVICES_MAX) {
 			ret = -EINVAL;
 			goto ioctl_error;
 		}
+		if_num = array_index_nospec(if_num, DVB_NET_DEVICES_MAX);
 
-		netdev = dvbnet->device[dvbnetif->if_num];
+		if (!dvbnet->state[if_num]) {
+			ret = -EINVAL;
+			goto ioctl_error;
+		}
+
+		netdev = dvbnet->device[if_num];
 
 		priv_data = netdev_priv(netdev);
 		dvbnetif->pid=priv_data->pid;
@@ -1533,14 +1540,20 @@ static int dvb_net_do_ioctl(struct file *file,
 		struct net_device *netdev;
 		struct dvb_net_priv *priv_data;
 		struct __dvb_net_if_old *dvbnetif = parg;
+		int if_num = dvbnetif->if_num;
+
+		if (if_num >= DVB_NET_DEVICES_MAX) {
+			ret = -EINVAL;
+			goto ioctl_error;
+		}
+		if_num = array_index_nospec(if_num, DVB_NET_DEVICES_MAX);
 
-		if (dvbnetif->if_num >= DVB_NET_DEVICES_MAX ||
-		    !dvbnet->state[dvbnetif->if_num]) {
+		if (!dvbnet->state[if_num]) {
 			ret = -EINVAL;
 			goto ioctl_error;
 		}
 
-		netdev = dvbnet->device[dvbnetif->if_num];
+		netdev = dvbnet->device[if_num];
 
 		priv_data = netdev_priv(netdev);
 		dvbnetif->pid=priv_data->pid;

commit 0c4c098c0405b364310d4021ac1f59f611c59538
Author: Ard Biesheuvel <ardb@kernel.org>
Date:   Thu Jun 10 08:21:50 2021 +0200

    crypto: shash - avoid comparing pointers to exported functions under CFI
    
    [ Upstream commit 22ca9f4aaf431a9413dcc115dd590123307f274f ]
    
    crypto_shash_alg_has_setkey() is implemented by testing whether the
    .setkey() member of a struct shash_alg points to the default version,
    called shash_no_setkey(). As crypto_shash_alg_has_setkey() is a static
    inline, this requires shash_no_setkey() to be exported to modules.
    
    Unfortunately, when building with CFI, function pointers are routed
    via CFI stubs which are private to each module (or to the kernel proper)
    and so this function pointer comparison may fail spuriously.
    
    Let's fix this by turning crypto_shash_alg_has_setkey() into an out of
    line function.
    
    Cc: Sami Tolvanen <samitolvanen@google.com>
    Cc: Eric Biggers <ebiggers@kernel.org>
    Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
    Reviewed-by: Eric Biggers <ebiggers@google.com>
    Reviewed-by: Sami Tolvanen <samitolvanen@google.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/crypto/shash.c b/crypto/shash.c
index a04145e5306a..55e7a2f63b34 100644
--- a/crypto/shash.c
+++ b/crypto/shash.c
@@ -25,12 +25,24 @@
 
 static const struct crypto_type crypto_shash_type;
 
-int shash_no_setkey(struct crypto_shash *tfm, const u8 *key,
-		    unsigned int keylen)
+static int shash_no_setkey(struct crypto_shash *tfm, const u8 *key,
+			   unsigned int keylen)
 {
 	return -ENOSYS;
 }
-EXPORT_SYMBOL_GPL(shash_no_setkey);
+
+/*
+ * Check whether an shash algorithm has a setkey function.
+ *
+ * For CFI compatibility, this must not be an inline function.  This is because
+ * when CFI is enabled, modules won't get the same address for shash_no_setkey
+ * (if it were exported, which inlining would require) as the core kernel will.
+ */
+bool crypto_shash_alg_has_setkey(struct shash_alg *alg)
+{
+	return alg->setkey != shash_no_setkey;
+}
+EXPORT_SYMBOL_GPL(crypto_shash_alg_has_setkey);
 
 static int shash_setkey_unaligned(struct crypto_shash *tfm, const u8 *key,
 				  unsigned int keylen)
diff --git a/include/crypto/internal/hash.h b/include/crypto/internal/hash.h
index a0b0ad9d585e..64283c22f1ee 100644
--- a/include/crypto/internal/hash.h
+++ b/include/crypto/internal/hash.h
@@ -82,13 +82,7 @@ int ahash_register_instance(struct crypto_template *tmpl,
 			    struct ahash_instance *inst);
 void ahash_free_instance(struct crypto_instance *inst);
 
-int shash_no_setkey(struct crypto_shash *tfm, const u8 *key,
-		    unsigned int keylen);
-
-static inline bool crypto_shash_alg_has_setkey(struct shash_alg *alg)
-{
-	return alg->setkey != shash_no_setkey;
-}
+bool crypto_shash_alg_has_setkey(struct shash_alg *alg);
 
 bool crypto_hash_alg_has_setkey(struct hash_alg_common *halg);
 

commit f7000d0d10af58cbd71269912da558b57d0442c0
Author: Zheyu Ma <zheyuma97@gmail.com>
Date:   Thu Jun 3 13:33:20 2021 +0000

    mmc: via-sdmmc: add a check against NULL pointer dereference
    
    [ Upstream commit 45c8ddd06c4b729c56a6083ab311bfbd9643f4a6 ]
    
    Before referencing 'host->data', the driver needs to check whether it is
    null pointer, otherwise it will cause a null pointer reference.
    
    This log reveals it:
    
    [   29.355199] BUG: kernel NULL pointer dereference, address:
    0000000000000014
    [   29.357323] #PF: supervisor write access in kernel mode
    [   29.357706] #PF: error_code(0x0002) - not-present page
    [   29.358088] PGD 0 P4D 0
    [   29.358280] Oops: 0002 [#1] PREEMPT SMP PTI
    [   29.358595] CPU: 2 PID: 0 Comm: swapper/2 Not tainted 5.12.4-
    g70e7f0549188-dirty #102
    [   29.359164] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009),
    BIOS rel-1.12.0-59-gc9ba5276e321-prebuilt.qemu.org 04/01/2014
    [   29.359978] RIP: 0010:via_sdc_isr+0x21f/0x410
    [   29.360314] Code: ff ff e8 84 aa d0 fd 66 45 89 7e 28 66 41 f7 c4 00
    10 75 56 e8 72 aa d0 fd 66 41 f7 c4 00 c0 74 10 e8 65 aa d0 fd 48 8b 43
    18 <c7> 40 14 ac ff ff ff e8 55 aa d0 fd 48 89 df e8 ad fb ff ff e9 77
    [   29.361661] RSP: 0018:ffffc90000118e98 EFLAGS: 00010046
    [   29.362042] RAX: 0000000000000000 RBX: ffff888107d77880
    RCX: 0000000000000000
    [   29.362564] RDX: 0000000000000000 RSI: ffffffff835d20bb
    RDI: 00000000ffffffff
    [   29.363085] RBP: ffffc90000118ed8 R08: 0000000000000001
    R09: 0000000000000001
    [   29.363604] R10: 0000000000000000 R11: 0000000000000001
    R12: 0000000000008600
    [   29.364128] R13: ffff888107d779c8 R14: ffffc90009c00200
    R15: 0000000000008000
    [   29.364651] FS:  0000000000000000(0000) GS:ffff88817bc80000(0000)
    knlGS:0000000000000000
    [   29.365235] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [   29.365655] CR2: 0000000000000014 CR3: 0000000005a2e000
    CR4: 00000000000006e0
    [   29.366170] DR0: 0000000000000000 DR1: 0000000000000000
    DR2: 0000000000000000
    [   29.366683] DR3: 0000000000000000 DR6: 00000000fffe0ff0
    DR7: 0000000000000400
    [   29.367197] Call Trace:
    [   29.367381]  <IRQ>
    [   29.367537]  __handle_irq_event_percpu+0x53/0x3e0
    [   29.367916]  handle_irq_event_percpu+0x35/0x90
    [   29.368247]  handle_irq_event+0x39/0x60
    [   29.368632]  handle_fasteoi_irq+0xc2/0x1d0
    [   29.368950]  __common_interrupt+0x7f/0x150
    [   29.369254]  common_interrupt+0xb4/0xd0
    [   29.369547]  </IRQ>
    [   29.369708]  asm_common_interrupt+0x1e/0x40
    [   29.370016] RIP: 0010:native_safe_halt+0x17/0x20
    [   29.370360] Code: 07 0f 00 2d db 80 43 00 f4 5d c3 0f 1f 84 00 00 00
    00 00 8b 05 c2 37 e5 01 55 48 89 e5 85 c0 7e 07 0f 00 2d bb 80 43 00 fb
    f4 <5d> c3 cc cc cc cc cc cc cc 55 48 89 e5 e8 67 53 ff ff 8b 0d f9 91
    [   29.371696] RSP: 0018:ffffc9000008fe90 EFLAGS: 00000246
    [   29.372079] RAX: 0000000000000000 RBX: 0000000000000002
    RCX: 0000000000000000
    [   29.372595] RDX: 0000000000000000 RSI: ffffffff854f67a4
    RDI: ffffffff85403406
    [   29.373122] RBP: ffffc9000008fe90 R08: 0000000000000001
    R09: 0000000000000001
    [   29.373646] R10: 0000000000000000 R11: 0000000000000001
    R12: ffffffff86009188
    [   29.374160] R13: 0000000000000000 R14: 0000000000000000
    R15: ffff888100258000
    [   29.374690]  default_idle+0x9/0x10
    [   29.374944]  arch_cpu_idle+0xa/0x10
    [   29.375198]  default_idle_call+0x6e/0x250
    [   29.375491]  do_idle+0x1f0/0x2d0
    [   29.375740]  cpu_startup_entry+0x18/0x20
    [   29.376034]  start_secondary+0x11f/0x160
    [   29.376328]  secondary_startup_64_no_verify+0xb0/0xbb
    [   29.376705] Modules linked in:
    [   29.376939] Dumping ftrace buffer:
    [   29.377187]    (ftrace buffer empty)
    [   29.377460] CR2: 0000000000000014
    [   29.377712] ---[ end trace 51a473dffb618c47 ]---
    [   29.378056] RIP: 0010:via_sdc_isr+0x21f/0x410
    [   29.378380] Code: ff ff e8 84 aa d0 fd 66 45 89 7e 28 66 41 f7 c4 00
    10 75 56 e8 72 aa d0 fd 66 41 f7 c4 00 c0 74 10 e8 65 aa d0 fd 48 8b 43
    18 <c7> 40 14 ac ff ff ff e8 55 aa d0 fd 48 89 df e8 ad fb ff ff e9 77
    [   29.379714] RSP: 0018:ffffc90000118e98 EFLAGS: 00010046
    [   29.380098] RAX: 0000000000000000 RBX: ffff888107d77880
    RCX: 0000000000000000
    [   29.380614] RDX: 0000000000000000 RSI: ffffffff835d20bb
    RDI: 00000000ffffffff
    [   29.381134] RBP: ffffc90000118ed8 R08: 0000000000000001
    R09: 0000000000000001
    [   29.381653] R10: 0000000000000000 R11: 0000000000000001
    R12: 0000000000008600
    [   29.382176] R13: ffff888107d779c8 R14: ffffc90009c00200
    R15: 0000000000008000
    [   29.382697] FS:  0000000000000000(0000) GS:ffff88817bc80000(0000)
    knlGS:0000000000000000
    [   29.383277] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [   29.383697] CR2: 0000000000000014 CR3: 0000000005a2e000
    CR4: 00000000000006e0
    [   29.384223] DR0: 0000000000000000 DR1: 0000000000000000
    DR2: 0000000000000000
    [   29.384736] DR3: 0000000000000000 DR6: 00000000fffe0ff0
    DR7: 0000000000000400
    [   29.385260] Kernel panic - not syncing: Fatal exception in interrupt
    [   29.385882] Dumping ftrace buffer:
    [   29.386135]    (ftrace buffer empty)
    [   29.386401] Kernel Offset: disabled
    [   29.386656] Rebooting in 1 seconds..
    
    Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
    Link: https://lore.kernel.org/r/1622727200-15808-1-git-send-email-zheyuma97@gmail.com
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mmc/host/via-sdmmc.c b/drivers/mmc/host/via-sdmmc.c
index 9fdb92729c28..1b66466d2ed4 100644
--- a/drivers/mmc/host/via-sdmmc.c
+++ b/drivers/mmc/host/via-sdmmc.c
@@ -865,6 +865,9 @@ static void via_sdc_data_isr(struct via_crdr_mmc_host *host, u16 intmask)
 {
 	BUG_ON(intmask == 0);
 
+	if (!host->data)
+		return;
+
 	if (intmask & VIA_CRDR_SDSTS_DT)
 		host->data->error = -ETIMEDOUT;
 	else if (intmask & (VIA_CRDR_SDSTS_RC | VIA_CRDR_SDSTS_WC))

commit a3c67e5a5266d29fe269c16c88433f55d8e5b80b
Author: Dongliang Mu <mudongliangabcd@gmail.com>
Date:   Tue May 25 15:06:52 2021 +0200

    media: dvd_usb: memory leak in cinergyt2_fe_attach
    
    [ Upstream commit 9ad1efee086e0e913914fa2b2173efb830bad68c ]
    
    When the driver fails to talk with the hardware with dvb_usb_generic_rw,
    it will return an error to dvb_usb_adapter_frontend_init. However, the
    driver forgets to free the resource (e.g., struct cinergyt2_fe_state),
    which leads to a memory leak.
    
    Fix this by freeing struct cinergyt2_fe_state when dvb_usb_generic_rw
    fails in cinergyt2_frontend_attach.
    
    backtrace:
      [<0000000056e17b1a>] kmalloc include/linux/slab.h:552 [inline]
      [<0000000056e17b1a>] kzalloc include/linux/slab.h:682 [inline]
      [<0000000056e17b1a>] cinergyt2_fe_attach+0x21/0x80 drivers/media/usb/dvb-usb/cinergyT2-fe.c:271
      [<00000000ae0b1711>] cinergyt2_frontend_attach+0x21/0x70 drivers/media/usb/dvb-usb/cinergyT2-core.c:74
      [<00000000d0254861>] dvb_usb_adapter_frontend_init+0x11b/0x1b0 drivers/media/usb/dvb-usb/dvb-usb-dvb.c:290
      [<0000000002e08ac6>] dvb_usb_adapter_init drivers/media/usb/dvb-usb/dvb-usb-init.c:84 [inline]
      [<0000000002e08ac6>] dvb_usb_init drivers/media/usb/dvb-usb/dvb-usb-init.c:173 [inline]
      [<0000000002e08ac6>] dvb_usb_device_init.cold+0x4d0/0x6ae drivers/media/usb/dvb-usb/dvb-usb-init.c:287
    
    Reported-by: syzbot+e1de8986786b3722050e@syzkaller.appspotmail.com
    Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Signed-off-by: Sean Young <sean@mess.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/usb/dvb-usb/cinergyT2-core.c b/drivers/media/usb/dvb-usb/cinergyT2-core.c
index 6131aa7914a9..fb59dda7547a 100644
--- a/drivers/media/usb/dvb-usb/cinergyT2-core.c
+++ b/drivers/media/usb/dvb-usb/cinergyT2-core.c
@@ -88,6 +88,8 @@ static int cinergyt2_frontend_attach(struct dvb_usb_adapter *adap)
 
 	ret = dvb_usb_generic_rw(d, st->data, 1, st->data, 3, 0);
 	if (ret < 0) {
+		if (adap->fe_adap[0].fe)
+			adap->fe_adap[0].fe->ops.release(adap->fe_adap[0].fe);
 		deb_rc("cinergyt2_power_ctrl() Failed to retrieve sleep state info\n");
 	}
 	mutex_unlock(&d->data_mutex);

commit 83dd29dad7da5b7b54429f89624556e368d1891f
Author: Evgeny Novikov <novikov@ispras.ru>
Date:   Wed May 19 14:04:49 2021 +0200

    media: st-hva: Fix potential NULL pointer dereferences
    
    [ Upstream commit b7fdd208687ba59ebfb09b2199596471c63b69e3 ]
    
    When ctx_id >= HVA_MAX_INSTANCES in hva_hw_its_irq_thread() it tries to
    access fields of ctx that is NULL at that point. The patch gets rid of
    these accesses.
    
    Found by Linux Driver Verification project (linuxtesting.org).
    
    Signed-off-by: Evgeny Novikov <novikov@ispras.ru>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/platform/sti/hva/hva-hw.c b/drivers/media/platform/sti/hva/hva-hw.c
index d826c011c095..6b852b0bb15a 100644
--- a/drivers/media/platform/sti/hva/hva-hw.c
+++ b/drivers/media/platform/sti/hva/hva-hw.c
@@ -130,8 +130,7 @@ static irqreturn_t hva_hw_its_irq_thread(int irq, void *arg)
 	ctx_id = (hva->sts_reg & 0xFF00) >> 8;
 	if (ctx_id >= HVA_MAX_INSTANCES) {
 		dev_err(dev, "%s     %s: bad context identifier: %d\n",
-			ctx->name, __func__, ctx_id);
-		ctx->hw_err = true;
+			HVA_PREFIX, __func__, ctx_id);
 		goto out;
 	}
 

commit fcf6b8f56302d3882b3b76b1b97ccf68ad573c38
Author: Zheyu Ma <zheyuma97@gmail.com>
Date:   Wed May 12 17:18:36 2021 +0200

    media: bt8xx: Fix a missing check bug in bt878_probe
    
    [ Upstream commit 1a4520090681853e6b850cbe54b27247a013e0e5 ]
    
    In 'bt878_irq', the driver calls 'tasklet_schedule', but this tasklet is
    set in 'dvb_bt8xx_load_card' of another driver 'dvb-bt8xx'.
    However, this two drivers are separate. The user may not load the
    'dvb-bt8xx' driver when loading the 'bt8xx' driver, that is, the tasklet
    has not been initialized when 'tasklet_schedule' is called, so it is
    necessary to check whether the tasklet is initialized in 'bt878_probe'.
    
    Fix this by adding a check at the end of bt878_probe.
    
    The KASAN's report reveals it:
    
    BUG: unable to handle kernel NULL pointer dereference at 0000000000000000
    PGD 800000006aab2067 P4D 800000006aab2067 PUD 6b2ea067 PMD 0
    Oops: 0010 [#1] PREEMPT SMP KASAN PTI
    CPU: 2 PID: 8724 Comm: syz-executor.0 Not tainted 4.19.177-
    gdba4159c14ef-dirty #40
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.0-59-
    gc9ba5276e321-prebuilt.qemu.org 04/01/2014
    RIP: 0010:          (null)
    Code: Bad RIP value.
    RSP: 0018:ffff88806c287ea0 EFLAGS: 00010246
    RAX: fffffbfff1b01774 RBX: dffffc0000000000 RCX: 0000000000000000
    RDX: 0000000000000000 RSI: 1ffffffff1b01775 RDI: 0000000000000000
    RBP: ffff88806c287f00 R08: fffffbfff1b01774 R09: fffffbfff1b01774
    R10: 0000000000000001 R11: fffffbfff1b01773 R12: 0000000000000000
    R13: ffff88806c29f530 R14: ffffffff8d80bb88 R15: ffffffff8d80bb90
    FS:  00007f6b550e6700(0000) GS:ffff88806c280000(0000) knlGS:
    0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: ffffffffffffffd6 CR3: 000000005ec98000 CR4: 00000000000006e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
     <IRQ>
     tasklet_action_common.isra.17+0x141/0x420 kernel/softirq.c:522
     tasklet_action+0x50/0x70 kernel/softirq.c:540
     __do_softirq+0x224/0x92c kernel/softirq.c:292
     invoke_softirq kernel/softirq.c:372 [inline]
     irq_exit+0x15a/0x180 kernel/softirq.c:412
     exiting_irq arch/x86/include/asm/apic.h:535 [inline]
     do_IRQ+0x123/0x1e0 arch/x86/kernel/irq.c:260
     common_interrupt+0xf/0xf arch/x86/entry/entry_64.S:670
     </IRQ>
    RIP: 0010:__do_sys_interrupt kernel/sys.c:2593 [inline]
    RIP: 0010:__se_sys_interrupt kernel/sys.c:2584 [inline]
    RIP: 0010:__x64_sys_interrupt+0x5b/0x80 kernel/sys.c:2584
    Code: ba 00 04 00 00 48 c7 c7 c0 99 31 8c e8 ae 76 5e 01 48 85 c0 75 21 e8
    14 ae 24 00 48 c7 c3 c0 99 31 8c b8 0c 00 00 00 0f 01 c1 <31> db e8 fe ad
    24 00 48 89 d8 5b 5d c3 48 c7 c3 ea ff ff ff eb ec
    RSP: 0018:ffff888054167f10 EFLAGS: 00000212 ORIG_RAX: ffffffffffffffde
    RAX: 000000000000000c RBX: ffffffff8c3199c0 RCX: ffffc90001ca6000
    RDX: 000000000000001a RSI: ffffffff813478fc RDI: ffffffff8c319dc0
    RBP: ffff888054167f18 R08: 0000000000000000 R09: 0000000000000000
    R10: 0000000000000080 R11: fffffbfff18633b7 R12: ffff888054167f58
    R13: ffff88805f638000 R14: 0000000000000000 R15: 0000000000000000
     do_syscall_64+0xb0/0x4e0 arch/x86/entry/common.c:293
     entry_SYSCALL_64_after_hwframe+0x49/0xbe
    RIP: 0033:0x4692a9
    Code: f7 d8 64 89 02 b8 ff ff ff ff c3 66 0f 1f 44 00 00 48 89 f8 48 89 f7
    48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff
    ff 73 01 c3 48 c7 c1 bc ff ff ff f7 d8 64 89 01 48
    RSP: 002b:00007f6b550e5c48 EFLAGS: 00000246 ORIG_RAX: 000000000000014f
    RAX: ffffffffffffffda RBX: 000000000077bf60 RCX: 00000000004692a9
    RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000020000140
    RBP: 00000000004cf7eb R08: 0000000000000000 R09: 0000000000000000
    R10: 0000000000000000 R11: 0000000000000246 R12: 000000000077bf60
    R13: 0000000000000000 R14: 000000000077bf60 R15: 00007fff55a1dca0
    Modules linked in:
    Dumping ftrace buffer:
       (ftrace buffer empty)
    CR2: 0000000000000000
    ---[ end trace 68e5849c3f77cbb6 ]---
    RIP: 0010:          (null)
    Code: Bad RIP value.
    RSP: 0018:ffff88806c287ea0 EFLAGS: 00010246
    RAX: fffffbfff1b01774 RBX: dffffc0000000000 RCX: 0000000000000000
    RDX: 0000000000000000 RSI: 1ffffffff1b01775 RDI: 0000000000000000
    RBP: ffff88806c287f00 R08: fffffbfff1b01774 R09: fffffbfff1b01774
    R10: 0000000000000001 R11: fffffbfff1b01773 R12: 0000000000000000
    R13: ffff88806c29f530 R14: ffffffff8d80bb88 R15: ffffffff8d80bb90
    FS:  00007f6b550e6700(0000) GS:ffff88806c280000(0000) knlGS:
    0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: ffffffffffffffd6 CR3: 000000005ec98000 CR4: 00000000000006e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    
    Reported-by: Zheyu Ma <zheyuma97@gmail.com>
    Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/pci/bt8xx/bt878.c b/drivers/media/pci/bt8xx/bt878.c
index f5f87e03f94b..855f8dc2a4ee 100644
--- a/drivers/media/pci/bt8xx/bt878.c
+++ b/drivers/media/pci/bt8xx/bt878.c
@@ -494,6 +494,9 @@ static int bt878_probe(struct pci_dev *dev, const struct pci_device_id *pci_id)
 	btwrite(0, BT878_AINT_MASK);
 	bt878_num++;
 
+	if (!bt->tasklet.func)
+		tasklet_disable(&bt->tasklet);
+
 	return 0;
 
       fail2:

commit c7c1d06ec164d1e05635eafddf1594eda86d6b9a
Author: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
Date:   Sun May 9 10:24:02 2021 +0200

    media: v4l2-core: Avoid the dangling pointer in v4l2_fh_release
    
    [ Upstream commit 7dd0c9e547b6924e18712b6b51aa3cba1896ee2c ]
    
    A use after free bug caused by the dangling pointer
    filp->privitate_data in v4l2_fh_release.
    See https://lore.kernel.org/patchwork/patch/1419058/.
    
    My patch sets the dangling pointer to NULL to provide
    robust.
    
    Signed-off-by: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/v4l2-core/v4l2-fh.c b/drivers/media/v4l2-core/v4l2-fh.c
index c91a7bd3ecfc..ac8282d059fc 100644
--- a/drivers/media/v4l2-core/v4l2-fh.c
+++ b/drivers/media/v4l2-core/v4l2-fh.c
@@ -104,6 +104,7 @@ int v4l2_fh_release(struct file *filp)
 		v4l2_fh_del(fh);
 		v4l2_fh_exit(fh);
 		kfree(fh);
+		filp->private_data = NULL;
 	}
 	return 0;
 }

commit cd16b8a5536dfdd7f190592e7eee9c0a68743100
Author: Igor Matheus Andrade Torrente <igormtorrente@gmail.com>
Date:   Tue May 4 20:32:49 2021 +0200

    media: em28xx: Fix possible memory leak of em28xx struct
    
    [ Upstream commit ac5688637144644f06ed1f3c6d4dd8bb7db96020 ]
    
    The em28xx struct kref isn't being decreased after an error in the
    em28xx_ir_init, leading to a possible memory leak.
    
    A kref_put and em28xx_shutdown_buttons is added to the error handler code.
    
    Signed-off-by: Igor Matheus Andrade Torrente <igormtorrente@gmail.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/usb/em28xx/em28xx-input.c b/drivers/media/usb/em28xx/em28xx-input.c
index f84a1208d5d3..3612f0d730dd 100644
--- a/drivers/media/usb/em28xx/em28xx-input.c
+++ b/drivers/media/usb/em28xx/em28xx-input.c
@@ -736,7 +736,8 @@ static int em28xx_ir_init(struct em28xx *dev)
 			dev->board.has_ir_i2c = 0;
 			dev_warn(&dev->intf->dev,
 				 "No i2c IR remote control device found.\n");
-			return -ENODEV;
+			err = -ENODEV;
+			goto ref_put;
 		}
 	}
 
@@ -751,7 +752,7 @@ static int em28xx_ir_init(struct em28xx *dev)
 
 	ir = kzalloc(sizeof(*ir), GFP_KERNEL);
 	if (!ir)
-		return -ENOMEM;
+		goto ref_put;
 	rc = rc_allocate_device(RC_DRIVER_SCANCODE);
 	if (!rc)
 		goto error;
@@ -862,6 +863,9 @@ static int em28xx_ir_init(struct em28xx *dev)
 	dev->ir = NULL;
 	rc_free_device(rc);
 	kfree(ir);
+ref_put:
+	em28xx_shutdown_buttons(dev);
+	kref_put(&dev->ref, em28xx_free_device);
 	return err;
 }
 

commit 9b808bdcc936be3503e5141879beb1cbd693d984
Author: Odin Ugedal <odin@uged.al>
Date:   Tue May 18 14:52:02 2021 +0200

    sched/fair: Fix ascii art by relpacing tabs
    
    [ Upstream commit 08f7c2f4d0e9f4283f5796b8168044c034a1bfcb ]
    
    When using something other than 8 spaces per tab, this ascii art
    makes not sense, and the reader might end up wondering what this
    advanced equation "is".
    
    Signed-off-by: Odin Ugedal <odin@uged.al>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Acked-by: Vincent Guittot <vincent.guittot@linaro.org>
    Link: https://lkml.kernel.org/r/20210518125202.78658-4-odin@uged.al
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index acb34e9df551..9cdbc07bb70f 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -2940,7 +2940,7 @@ void reweight_task(struct task_struct *p, int prio)
  *
  *                     tg->weight * grq->load.weight
  *   ge->load.weight = -----------------------------               (1)
- *			  \Sum grq->load.weight
+ *                       \Sum grq->load.weight
  *
  * Now, because computing that sum is prohibitively expensive to compute (been
  * there, done that) we approximate it with this average stuff. The average
@@ -2954,7 +2954,7 @@ void reweight_task(struct task_struct *p, int prio)
  *
  *                     tg->weight * grq->avg.load_avg
  *   ge->load.weight = ------------------------------              (3)
- *				tg->load_avg
+ *                             tg->load_avg
  *
  * Where: tg->load_avg ~= \Sum grq->avg.load_avg
  *
@@ -2970,7 +2970,7 @@ void reweight_task(struct task_struct *p, int prio)
  *
  *                     tg->weight * grq->load.weight
  *   ge->load.weight = ----------------------------- = tg->weight   (4)
- *			    grp->load.weight
+ *                         grp->load.weight
  *
  * That is, the sum collapses because all other CPUs are idle; the UP scenario.
  *
@@ -2989,7 +2989,7 @@ void reweight_task(struct task_struct *p, int prio)
  *
  *                     tg->weight * grq->load.weight
  *   ge->load.weight = -----------------------------		   (6)
- *				tg_load_avg'
+ *                             tg_load_avg'
  *
  * Where:
  *

commit e6663c59b0563a2377dbfef9b2a0d85172baa34e
Author: Jack Xu <jack.xu@intel.com>
Date:   Mon May 17 05:13:16 2021 -0400

    crypto: qat - remove unused macro in FW loader
    
    [ Upstream commit 9afe77cf25d9670e61b489fd52cc6f75fd7f6803 ]
    
    Remove the unused macro ICP_DH895XCC_PESRAM_BAR_SIZE in the firmware
    loader.
    
    This is to fix the following warning when compiling the driver using the
    clang compiler with CC=clang W=2:
    
        drivers/crypto/qat/qat_common/qat_uclo.c:345:9: warning: macro is not used [-Wunused-macros]
    
    Signed-off-by: Jack Xu <jack.xu@intel.com>
    Co-developed-by: Zhehui Xiang <zhehui.xiang@intel.com>
    Signed-off-by: Zhehui Xiang <zhehui.xiang@intel.com>
    Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/qat/qat_common/qat_uclo.c b/drivers/crypto/qat/qat_common/qat_uclo.c
index aeb03081415c..9542423bb7ca 100644
--- a/drivers/crypto/qat/qat_common/qat_uclo.c
+++ b/drivers/crypto/qat/qat_common/qat_uclo.c
@@ -385,7 +385,6 @@ static int qat_uclo_init_umem_seg(struct icp_qat_fw_loader_handle *handle,
 	return 0;
 }
 
-#define ICP_DH895XCC_PESRAM_BAR_SIZE 0x80000
 static int qat_uclo_init_ae_memory(struct icp_qat_fw_loader_handle *handle,
 				   struct icp_qat_uof_initmem *init_mem)
 {

commit 536b11e382d888eaf2009f10171e986e37352d14
Author: Jack Xu <jack.xu@intel.com>
Date:   Mon May 17 05:13:15 2021 -0400

    crypto: qat - check return code of qat_hal_rd_rel_reg()
    
    [ Upstream commit 96b57229209490c8bca4335b01a426a96173dc56 ]
    
    Check the return code of the function qat_hal_rd_rel_reg() and return it
    to the caller.
    
    This is to fix the following warning when compiling the driver with
    clang scan-build:
    
        drivers/crypto/qat/qat_common/qat_hal.c:1436:2: warning: 6th function call argument is an uninitialized value
    
    Signed-off-by: Jack Xu <jack.xu@intel.com>
    Co-developed-by: Zhehui Xiang <zhehui.xiang@intel.com>
    Signed-off-by: Zhehui Xiang <zhehui.xiang@intel.com>
    Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/qat/qat_common/qat_hal.c b/drivers/crypto/qat/qat_common/qat_hal.c
index dac130bb807a..eda692271f0c 100644
--- a/drivers/crypto/qat/qat_common/qat_hal.c
+++ b/drivers/crypto/qat/qat_common/qat_hal.c
@@ -1256,7 +1256,11 @@ static int qat_hal_put_rel_wr_xfer(struct icp_qat_fw_loader_handle *handle,
 		pr_err("QAT: bad xfrAddr=0x%x\n", xfr_addr);
 		return -EINVAL;
 	}
-	qat_hal_rd_rel_reg(handle, ae, ctx, ICP_GPB_REL, gprnum, &gprval);
+	status = qat_hal_rd_rel_reg(handle, ae, ctx, ICP_GPB_REL, gprnum, &gprval);
+	if (status) {
+		pr_err("QAT: failed to read register");
+		return status;
+	}
 	gpr_addr = qat_hal_get_reg_addr(ICP_GPB_REL, gprnum);
 	data16low = 0xffff & data;
 	data16hi = 0xffff & (data >> 0x10);

commit 0983e01de0ec33b7f2e63ad866d68090b003701c
Author: Anirudh Rayabharam <mail@anirudhrb.com>
Date:   Tue May 4 19:08:58 2021 +0200

    media: pvrusb2: fix warning in pvr2_i2c_core_done
    
    [ Upstream commit f8194e5e63fdcb349e8da9eef9e574d5b1d687cb ]
    
    syzbot has reported the following warning in pvr2_i2c_done:
    
            sysfs group 'power' not found for kobject '1-0043'
    
    When the device is disconnected (pvr_hdw_disconnect), the i2c adapter is
    not unregistered along with the USB and v4l2 teardown. As part of the USB
    device disconnect, the sysfs files of the subdevices are also deleted.
    So, by the time pvr_i2c_core_done is called by pvr_context_destroy, the
    sysfs files have been deleted.
    
    To fix this, unregister the i2c adapter too in pvr_hdw_disconnect. Make
    the device deregistration code shared by calling pvr_hdw_disconnect from
    pvr2_hdw_destroy.
    
    Reported-by: syzbot+e74a998ca8f1df9cc332@syzkaller.appspotmail.com
    Tested-by: syzbot+e74a998ca8f1df9cc332@syzkaller.appspotmail.com
    Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Anirudh Rayabharam <mail@anirudhrb.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/usb/pvrusb2/pvrusb2-hdw.c b/drivers/media/usb/pvrusb2/pvrusb2-hdw.c
index fcb201a40920..d1bbfe4000dd 100644
--- a/drivers/media/usb/pvrusb2/pvrusb2-hdw.c
+++ b/drivers/media/usb/pvrusb2/pvrusb2-hdw.c
@@ -2668,9 +2668,8 @@ void pvr2_hdw_destroy(struct pvr2_hdw *hdw)
 		pvr2_stream_destroy(hdw->vid_stream);
 		hdw->vid_stream = NULL;
 	}
-	pvr2_i2c_core_done(hdw);
 	v4l2_device_unregister(&hdw->v4l2_dev);
-	pvr2_hdw_remove_usb_stuff(hdw);
+	pvr2_hdw_disconnect(hdw);
 	mutex_lock(&pvr2_unit_mtx);
 	do {
 		if ((hdw->unit_number >= 0) &&
@@ -2697,6 +2696,7 @@ void pvr2_hdw_disconnect(struct pvr2_hdw *hdw)
 {
 	pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_disconnect(hdw=%p)",hdw);
 	LOCK_TAKE(hdw->big_lock);
+	pvr2_i2c_core_done(hdw);
 	LOCK_TAKE(hdw->ctl_lock);
 	pvr2_hdw_remove_usb_stuff(hdw);
 	LOCK_GIVE(hdw->ctl_lock);

commit c93a0890e9551698f24553381c44dafd6c90275b
Author: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Date:   Fri Apr 23 10:00:49 2021 +0200

    media: cobalt: fix race condition in setting HPD
    
    [ Upstream commit 3d37ef41bed0854805ab9af22c422267510e1344 ]
    
    The cobalt_s_bit_sysctrl reads the old register value over PCI,
    then changes a bit and sets writes the new value to the register.
    
    This is used among other things for setting the HPD output pin.
    
    But if the HPD is changed for multiple inputs at the same time,
    then this causes a race condition where a stale value is read.
    
    Serialize this function with a mutex.
    
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/pci/cobalt/cobalt-driver.c b/drivers/media/pci/cobalt/cobalt-driver.c
index 4885e833c052..f422558e6392 100644
--- a/drivers/media/pci/cobalt/cobalt-driver.c
+++ b/drivers/media/pci/cobalt/cobalt-driver.c
@@ -675,6 +675,7 @@ static int cobalt_probe(struct pci_dev *pci_dev,
 		return -ENOMEM;
 	cobalt->pci_dev = pci_dev;
 	cobalt->instance = i;
+	mutex_init(&cobalt->pci_lock);
 
 	retval = v4l2_device_register(&pci_dev->dev, &cobalt->v4l2_dev);
 	if (retval) {
diff --git a/drivers/media/pci/cobalt/cobalt-driver.h b/drivers/media/pci/cobalt/cobalt-driver.h
index 429bee4ef79c..883093e5adea 100644
--- a/drivers/media/pci/cobalt/cobalt-driver.h
+++ b/drivers/media/pci/cobalt/cobalt-driver.h
@@ -250,6 +250,8 @@ struct cobalt {
 	int instance;
 	struct pci_dev *pci_dev;
 	struct v4l2_device v4l2_dev;
+	/* serialize PCI access in cobalt_s_bit_sysctrl() */
+	struct mutex pci_lock;
 
 	void __iomem *bar0, *bar1;
 
@@ -319,10 +321,13 @@ static inline u32 cobalt_g_sysctrl(struct cobalt *cobalt)
 static inline void cobalt_s_bit_sysctrl(struct cobalt *cobalt,
 					int bit, int val)
 {
-	u32 ctrl = cobalt_read_bar1(cobalt, COBALT_SYS_CTRL_BASE);
+	u32 ctrl;
 
+	mutex_lock(&cobalt->pci_lock);
+	ctrl = cobalt_read_bar1(cobalt, COBALT_SYS_CTRL_BASE);
 	cobalt_write_bar1(cobalt, COBALT_SYS_CTRL_BASE,
 			(ctrl & ~(1UL << bit)) | (val << bit));
+	mutex_unlock(&cobalt->pci_lock);
 }
 
 static inline u32 cobalt_g_sysstat(struct cobalt *cobalt)

commit 0f56cbfad6e68ecfaec3b15098b0a1cf6e22c239
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Wed Apr 21 21:43:45 2021 +0200

    media: cpia2: fix memory leak in cpia2_usb_probe
    
    [ Upstream commit be8656e62e9e791837b606a027802b504a945c97 ]
    
    syzbot reported leak in cpia2 usb driver. The problem was
    in invalid error handling.
    
    v4l2_device_register() is called in cpia2_init_camera_struct(), but
    all error cases after cpia2_init_camera_struct() did not call the
    v4l2_device_unregister()
    
    Reported-by: syzbot+d1e69c888f0d3866ead4@syzkaller.appspotmail.com
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/usb/cpia2/cpia2.h b/drivers/media/usb/cpia2/cpia2.h
index ab238ac8bfc0..50c952250dc9 100644
--- a/drivers/media/usb/cpia2/cpia2.h
+++ b/drivers/media/usb/cpia2/cpia2.h
@@ -438,6 +438,7 @@ int cpia2_send_command(struct camera_data *cam, struct cpia2_command *cmd);
 int cpia2_do_command(struct camera_data *cam,
 		     unsigned int command,
 		     unsigned char direction, unsigned char param);
+void cpia2_deinit_camera_struct(struct camera_data *cam, struct usb_interface *intf);
 struct camera_data *cpia2_init_camera_struct(struct usb_interface *intf);
 int cpia2_init_camera(struct camera_data *cam);
 int cpia2_allocate_buffers(struct camera_data *cam);
diff --git a/drivers/media/usb/cpia2/cpia2_core.c b/drivers/media/usb/cpia2/cpia2_core.c
index 3dfbb545c0e3..42cce7e94101 100644
--- a/drivers/media/usb/cpia2/cpia2_core.c
+++ b/drivers/media/usb/cpia2/cpia2_core.c
@@ -2172,6 +2172,18 @@ static void reset_camera_struct(struct camera_data *cam)
 	cam->height = cam->params.roi.height;
 }
 
+/******************************************************************************
+ *
+ *  cpia2_init_camera_struct
+ *
+ *  Deinitialize camera struct
+ *****************************************************************************/
+void cpia2_deinit_camera_struct(struct camera_data *cam, struct usb_interface *intf)
+{
+	v4l2_device_unregister(&cam->v4l2_dev);
+	kfree(cam);
+}
+
 /******************************************************************************
  *
  *  cpia2_init_camera_struct
diff --git a/drivers/media/usb/cpia2/cpia2_usb.c b/drivers/media/usb/cpia2/cpia2_usb.c
index 4c191fcd3a7f..839217574069 100644
--- a/drivers/media/usb/cpia2/cpia2_usb.c
+++ b/drivers/media/usb/cpia2/cpia2_usb.c
@@ -853,15 +853,13 @@ static int cpia2_usb_probe(struct usb_interface *intf,
 	ret = set_alternate(cam, USBIF_CMDONLY);
 	if (ret < 0) {
 		ERR("%s: usb_set_interface error (ret = %d)\n", __func__, ret);
-		kfree(cam);
-		return ret;
+		goto alt_err;
 	}
 
 
 	if((ret = cpia2_init_camera(cam)) < 0) {
 		ERR("%s: failed to initialize cpia2 camera (ret = %d)\n", __func__, ret);
-		kfree(cam);
-		return ret;
+		goto alt_err;
 	}
 	LOG("  CPiA Version: %d.%02d (%d.%d)\n",
 	       cam->params.version.firmware_revision_hi,
@@ -881,11 +879,14 @@ static int cpia2_usb_probe(struct usb_interface *intf,
 	ret = cpia2_register_camera(cam);
 	if (ret < 0) {
 		ERR("%s: Failed to register cpia2 camera (ret = %d)\n", __func__, ret);
-		kfree(cam);
-		return ret;
+		goto alt_err;
 	}
 
 	return 0;
+
+alt_err:
+	cpia2_deinit_camera_struct(cam, intf);
+	return ret;
 }
 
 /******************************************************************************

commit 21f19e32e797981128fee8318641be7b031d681e
Author: Bixuan Cui <cuibixuan@huawei.com>
Date:   Sat May 8 11:14:55 2021 +0800

    crypto: nx - add missing MODULE_DEVICE_TABLE
    
    [ Upstream commit 06676aa1f455c74e3ad1624cea3acb9ed2ef71ae ]
    
    This patch adds missing MODULE_DEVICE_TABLE definition which generates
    correct modalias for automatic loading of this driver when it is built
    as an external module.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Bixuan Cui <cuibixuan@huawei.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/nx/nx-842-pseries.c b/drivers/crypto/nx/nx-842-pseries.c
index 66869976cfa2..fa40edae231e 100644
--- a/drivers/crypto/nx/nx-842-pseries.c
+++ b/drivers/crypto/nx/nx-842-pseries.c
@@ -1086,6 +1086,7 @@ static const struct vio_device_id nx842_vio_driver_ids[] = {
 	{"ibm,compression-v1", "ibm,compression"},
 	{"", ""},
 };
+MODULE_DEVICE_TABLE(vio, nx842_vio_driver_ids);
 
 static struct vio_driver nx842_vio_driver = {
 	.name = KBUILD_MODNAME,

commit 7b4c8073fb05e0f0320359b74ffc5218b2b5ea6d
Author: Zou Wei <zou_wei@huawei.com>
Date:   Tue May 11 11:53:18 2021 +0800

    regulator: uniphier: Add missing MODULE_DEVICE_TABLE
    
    [ Upstream commit d019f38a1af3c6015cde6a47951a3ec43beeed80 ]
    
    This patch adds missing MODULE_DEVICE_TABLE definition which generates
    correct modalias for automatic loading of this driver when it is built
    as an external module.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zou Wei <zou_wei@huawei.com>
    Link: https://lore.kernel.org/r/1620705198-104566-1-git-send-email-zou_wei@huawei.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/regulator/uniphier-regulator.c b/drivers/regulator/uniphier-regulator.c
index abf22acbd13e..a2e3654b6332 100644
--- a/drivers/regulator/uniphier-regulator.c
+++ b/drivers/regulator/uniphier-regulator.c
@@ -197,6 +197,7 @@ static const struct of_device_id uniphier_regulator_match[] = {
 	},
 	{ /* Sentinel */ },
 };
+MODULE_DEVICE_TABLE(of, uniphier_regulator_match);
 
 static struct platform_driver uniphier_regulator_driver = {
 	.probe = uniphier_regulator_probe,

commit a741b1bd7068ed8a750f9240d4e17c93f1b22a25
Author: Tian Tao <tiantao6@hisilicon.com>
Date:   Thu Apr 29 19:20:48 2021 +0800

    spi: omap-100k: Fix the length judgment problem
    
    [ Upstream commit e7a1a3abea373e41ba7dfe0fbc93cb79b6a3a529 ]
    
    word_len should be checked in the omap1_spi100k_setup_transfer
    function to see if it exceeds 32.
    
    Signed-off-by: Tian Tao <tiantao6@hisilicon.com>
    Link: https://lore.kernel.org/r/1619695248-39045-1-git-send-email-tiantao6@hisilicon.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/spi/spi-omap-100k.c b/drivers/spi/spi-omap-100k.c
index 1eccdc4a4581..2eeb0fe2eed2 100644
--- a/drivers/spi/spi-omap-100k.c
+++ b/drivers/spi/spi-omap-100k.c
@@ -251,7 +251,7 @@ static int omap1_spi100k_setup_transfer(struct spi_device *spi,
 	else
 		word_len = spi->bits_per_word;
 
-	if (spi->bits_per_word > 32)
+	if (word_len > 32)
 		return -EINVAL;
 	cs->word_len = word_len;
 

commit 880ec021ed3b665014b74784311cb8b5bc736854
Author: Jay Fang <f.fangjian@huawei.com>
Date:   Thu May 6 15:08:08 2021 +0800

    spi: spi-topcliff-pch: Fix potential double free in pch_spi_process_messages()
    
    [ Upstream commit 026a1dc1af52742c5897e64a3431445371a71871 ]
    
    pch_spi_set_tx() frees data->pkt_tx_buff on failure of kzalloc() for
    data->pkt_rx_buff, but its caller, pch_spi_process_messages(), will
    free data->pkt_tx_buff again. Set data->pkt_tx_buff to NULL after
    kfree() to avoid double free.
    
    Signed-off-by: Jay Fang <f.fangjian@huawei.com>
    Link: https://lore.kernel.org/r/1620284888-65215-1-git-send-email-f.fangjian@huawei.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/spi/spi-topcliff-pch.c b/drivers/spi/spi-topcliff-pch.c
index 8a5966963834..ef19e050612c 100644
--- a/drivers/spi/spi-topcliff-pch.c
+++ b/drivers/spi/spi-topcliff-pch.c
@@ -584,8 +584,10 @@ static void pch_spi_set_tx(struct pch_spi_data *data, int *bpw)
 	data->pkt_tx_buff = kzalloc(size, GFP_KERNEL);
 	if (data->pkt_tx_buff != NULL) {
 		data->pkt_rx_buff = kzalloc(size, GFP_KERNEL);
-		if (!data->pkt_rx_buff)
+		if (!data->pkt_rx_buff) {
 			kfree(data->pkt_tx_buff);
+			data->pkt_tx_buff = NULL;
+		}
 	}
 
 	if (!data->pkt_rx_buff) {

commit ffd424a94a44418714dfedeb5fc091e63e4ae1ad
Author: Jay Fang <f.fangjian@huawei.com>
Date:   Mon May 10 14:58:23 2021 +0800

    spi: spi-loopback-test: Fix 'tx_buf' might be 'rx_buf'
    
    [ Upstream commit 9e37a3ab0627011fb63875e9a93094b6fc8ddf48 ]
    
    In function 'spi_test_run_iter': Value 'tx_buf' might be 'rx_buf'.
    
    Signed-off-by: Jay Fang <f.fangjian@huawei.com>
    Link: https://lore.kernel.org/r/1620629903-15493-5-git-send-email-f.fangjian@huawei.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/spi/spi-loopback-test.c b/drivers/spi/spi-loopback-test.c
index b9a7117b6dce..85d3475915dd 100644
--- a/drivers/spi/spi-loopback-test.c
+++ b/drivers/spi/spi-loopback-test.c
@@ -877,7 +877,7 @@ static int spi_test_run_iter(struct spi_device *spi,
 		test.transfers[i].len = len;
 		if (test.transfers[i].tx_buf)
 			test.transfers[i].tx_buf += tx_off;
-		if (test.transfers[i].tx_buf)
+		if (test.transfers[i].rx_buf)
 			test.transfers[i].rx_buf += rx_off;
 	}
 

commit 878c5d126b8e2c4b7b3b1a69288c0866d38774a8
Author: Charles Keepax <ckeepax@opensource.cirrus.com>
Date:   Wed Apr 21 11:14:02 2021 +0100

    spi: Make of_register_spi_device also set the fwnode
    
    [ Upstream commit 0e793ba77c18382f08e440260fe72bc6fce2a3cb ]
    
    Currently, the SPI core doesn't set the struct device fwnode pointer
    when it creates a new SPI device. This means when the device is
    registered the fwnode is NULL and the check in device_add which sets
    the fwnode->dev pointer is skipped. This wasn't previously an issue,
    however these two patches:
    
    commit 4731210c09f5 ("gpiolib: Bind gpio_device to a driver to enable
    fw_devlink=on by default")
    commit ced2af419528 ("gpiolib: Don't probe gpio_device if it's not the
    primary device")
    
    Added some code to the GPIO core which relies on using that
    fwnode->dev pointer to determine if a driver is bound to the fwnode
    and if not bind a stub GPIO driver. This means the GPIO providers
    behind SPI will get both the expected driver and this stub driver
    causing the stub driver to fail if it attempts to request any pin
    configuration. For example on my system:
    
    madera-pinctrl madera-pinctrl: pin gpio5 already requested by madera-pinctrl; cannot claim for gpiochip3
    madera-pinctrl madera-pinctrl: pin-4 (gpiochip3) status -22
    madera-pinctrl madera-pinctrl: could not request pin 4 (gpio5) from group aif1  on device madera-pinctrl
    gpio_stub_drv gpiochip3: Error applying setting, reverse things back
    gpio_stub_drv: probe of gpiochip3 failed with error -22
    
    The firmware node on the device created by the GPIO framework is set
    through the of_node pointer hence things generally actually work,
    however that fwnode->dev is never set, as the check was skipped at
    device_add time. This fix appears to match how the I2C subsystem
    handles the same situation.
    
    Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
    Link: https://lore.kernel.org/r/20210421101402.8468-1-ckeepax@opensource.cirrus.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index bbe33016d371..49f592e433a8 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -1678,6 +1678,7 @@ of_register_spi_device(struct spi_controller *ctlr, struct device_node *nc)
 	/* Store a pointer to the node in the device structure */
 	of_node_get(nc);
 	spi->dev.of_node = nc;
+	spi->dev.fwnode = of_fwnode_handle(nc);
 
 	/* Register the new device */
 	rc = spi_add_device(spi);

commit 1c37784a00edfb88be67b24f7e776cda9eb803fd
Author: Miklos Szeredi <mszeredi@redhat.com>
Date:   Tue Jun 22 09:15:35 2021 +0200

    fuse: check connected before queueing on fpq->io
    
    commit 80ef08670d4c28a06a3de954bd350368780bcfef upstream.
    
    A request could end up on the fpq->io list after fuse_abort_conn() has
    reset fpq->connected and aborted requests on that list:
    
    Thread-1                          Thread-2
    ========                          ========
    ->fuse_simple_request()           ->shutdown
      ->__fuse_request_send()
        ->queue_request()           ->fuse_abort_conn()
    ->fuse_dev_do_read()                ->acquire(fpq->lock)
      ->wait_for(fpq->lock)           ->set err to all req's in fpq->io
                                      ->release(fpq->lock)
      ->acquire(fpq->lock)
      ->add req to fpq->io
    
    After the userspace copy is done the request will be ended, but
    req->out.h.error will remain uninitialized.  Also the copy might block
    despite being already aborted.
    
    Fix both issues by not allowing the request to be queued on the fpq->io
    list after fuse_abort_conn() has processed this list.
    
    Reported-by: Pradeep P V K <pragalla@codeaurora.org>
    Fixes: fd22d62ed0c3 ("fuse: no fc->lock for iqueue parts")
    Cc: <stable@vger.kernel.org> # v4.2
    Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index 1ff5a6b21db0..498a4fab4080 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -1310,6 +1310,15 @@ static ssize_t fuse_dev_do_read(struct fuse_dev *fud, struct file *file,
 		goto restart;
 	}
 	spin_lock(&fpq->lock);
+	/*
+	 *  Must not put request on fpq->io queue after having been shut down by
+	 *  fuse_abort_conn()
+	 */
+	if (!fpq->connected) {
+		req->out.h.error = err = -ECONNABORTED;
+		goto out_end;
+
+	}
 	list_add(&req->list, &fpq->io);
 	spin_unlock(&fpq->lock);
 	cs->req = req;

commit 77c94b2a1deea733e2796a2da7b637c1afd0cdb8
Author: Roberto Sassu <roberto.sassu@huawei.com>
Date:   Fri May 14 17:27:44 2021 +0200

    evm: Refuse EVM_ALLOW_METADATA_WRITES only if an HMAC key is loaded
    
    commit 9acc89d31f0c94c8e573ed61f3e4340bbd526d0c upstream.
    
    EVM_ALLOW_METADATA_WRITES is an EVM initialization flag that can be set to
    temporarily disable metadata verification until all xattrs/attrs necessary
    to verify an EVM portable signature are copied to the file. This flag is
    cleared when EVM is initialized with an HMAC key, to avoid that the HMAC is
    calculated on unverified xattrs/attrs.
    
    Currently EVM unnecessarily denies setting this flag if EVM is initialized
    with a public key, which is not a concern as it cannot be used to trust
    xattrs/attrs updates. This patch removes this limitation.
    
    Fixes: ae1ba1676b88e ("EVM: Allow userland to permit modification of EVM-protected metadata")
    Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com>
    Cc: stable@vger.kernel.org # 4.16.x
    Signed-off-by: Mimi Zohar <zohar@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Documentation/ABI/testing/evm b/Documentation/ABI/testing/evm
index 201d10319fa1..1df1177df68a 100644
--- a/Documentation/ABI/testing/evm
+++ b/Documentation/ABI/testing/evm
@@ -42,8 +42,30 @@ Description:
 		modification of EVM-protected metadata and
 		disable all further modification of policy
 
-		Note that once a key has been loaded, it will no longer be
-		possible to enable metadata modification.
+		Echoing a value is additive, the new value is added to the
+		existing initialization flags.
+
+		For example, after::
+
+		  echo 2 ><securityfs>/evm
+
+		another echo can be performed::
+
+		  echo 1 ><securityfs>/evm
+
+		and the resulting value will be 3.
+
+		Note that once an HMAC key has been loaded, it will no longer
+		be possible to enable metadata modification. Signaling that an
+		HMAC key has been loaded will clear the corresponding flag.
+		For example, if the current value is 6 (2 and 4 set)::
+
+		  echo 1 ><securityfs>/evm
+
+		will set the new value to 3 (4 cleared).
+
+		Loading an HMAC key is the only way to disable metadata
+		modification.
 
 		Until key loading has been signaled EVM can not create
 		or validate the 'security.evm' xattr, but returns
diff --git a/security/integrity/evm/evm_secfs.c b/security/integrity/evm/evm_secfs.c
index f112ca593adc..7024b14831e3 100644
--- a/security/integrity/evm/evm_secfs.c
+++ b/security/integrity/evm/evm_secfs.c
@@ -85,12 +85,12 @@ static ssize_t evm_write_key(struct file *file, const char __user *buf,
 	if (!i || (i & ~EVM_INIT_MASK) != 0)
 		return -EINVAL;
 
-	/* Don't allow a request to freshly enable metadata writes if
-	 * keys are loaded.
+	/*
+	 * Don't allow a request to enable metadata writes if
+	 * an HMAC key is loaded.
 	 */
 	if ((i & EVM_ALLOW_METADATA_WRITES) &&
-	    ((evm_initialized & EVM_KEY_MASK) != 0) &&
-	    !(evm_initialized & EVM_ALLOW_METADATA_WRITES))
+	    (evm_initialized & EVM_INIT_HMAC) != 0)
 		return -EPERM;
 
 	if (i & EVM_INIT_HMAC) {

commit 2c6b7016754559b1ead8d61e8ac67728d960fbbd
Author: Roberto Sassu <roberto.sassu@huawei.com>
Date:   Fri May 14 17:27:42 2021 +0200

    evm: Execute evm_inode_init_security() only when an HMAC key is loaded
    
    commit 9eea2904292c2d8fa98df141d3bf7c41ec9dc1b5 upstream.
    
    evm_inode_init_security() requires an HMAC key to calculate the HMAC on
    initial xattrs provided by LSMs. However, it checks generically whether a
    key has been loaded, including also public keys, which is not correct as
    public keys are not suitable to calculate the HMAC.
    
    Originally, support for signature verification was introduced to verify a
    possibly immutable initial ram disk, when no new files are created, and to
    switch to HMAC for the root filesystem. By that time, an HMAC key should
    have been loaded and usable to calculate HMACs for new files.
    
    More recently support for requiring an HMAC key was removed from the
    kernel, so that signature verification can be used alone. Since this is a
    legitimate use case, evm_inode_init_security() should not return an error
    when no HMAC key has been loaded.
    
    This patch fixes this problem by replacing the evm_key_loaded() check with
    a check of the EVM_INIT_HMAC flag in evm_initialized.
    
    Fixes: 26ddabfe96b ("evm: enable EVM when X509 certificate is loaded")
    Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com>
    Cc: stable@vger.kernel.org # 4.5.x
    Signed-off-by: Mimi Zohar <zohar@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/security/integrity/evm/evm_main.c b/security/integrity/evm/evm_main.c
index 651c0127c00d..d11a61f7b200 100644
--- a/security/integrity/evm/evm_main.c
+++ b/security/integrity/evm/evm_main.c
@@ -523,7 +523,7 @@ void evm_inode_post_setattr(struct dentry *dentry, int ia_valid)
 }
 
 /*
- * evm_inode_init_security - initializes security.evm
+ * evm_inode_init_security - initializes security.evm HMAC value
  */
 int evm_inode_init_security(struct inode *inode,
 				 const struct xattr *lsm_xattr,
@@ -532,7 +532,8 @@ int evm_inode_init_security(struct inode *inode,
 	struct evm_ima_xattr_data *xattr_data;
 	int rc;
 
-	if (!evm_key_loaded() || !evm_protected_xattr(lsm_xattr->name))
+	if (!(evm_initialized & EVM_INIT_HMAC) ||
+	    !evm_protected_xattr(lsm_xattr->name))
 		return 0;
 
 	xattr_data = kzalloc(sizeof(*xattr_data), GFP_NOFS);

commit 1ad332936f9825be2621ce4097ae2ea5622b1675
Author: Michael Ellerman <mpe@ellerman.id.au>
Date:   Fri Jun 25 16:28:41 2021 +1000

    powerpc/stacktrace: Fix spurious "stale" traces in raise_backtrace_ipi()
    
    commit 7c6986ade69e3c81bac831645bc72109cd798a80 upstream.
    
    In raise_backtrace_ipi() we iterate through the cpumask of CPUs, sending
    each an IPI asking them to do a backtrace, but we don't wait for the
    backtrace to happen.
    
    We then iterate through the CPU mask again, and if any CPU hasn't done
    the backtrace and cleared itself from the mask, we print a trace on its
    behalf, noting that the trace may be "stale".
    
    This works well enough when a CPU is not responding, because in that
    case it doesn't receive the IPI and the sending CPU is left to print the
    trace. But when all CPUs are responding we are left with a race between
    the sending and receiving CPUs, if the sending CPU wins the race then it
    will erroneously print a trace.
    
    This leads to spurious "stale" traces from the sending CPU, which can
    then be interleaved messily with the receiving CPU, note the CPU
    numbers, eg:
    
      [ 1658.929157][    C7] rcu: Stack dump where RCU GP kthread last ran:
      [ 1658.929223][    C7] Sending NMI from CPU 7 to CPUs 1:
      [ 1658.929303][    C1] NMI backtrace for cpu 1
      [ 1658.929303][    C7] CPU 1 didn't respond to backtrace IPI, inspecting paca.
      [ 1658.929362][    C1] CPU: 1 PID: 325 Comm: kworker/1:1H Tainted: G        W   E     5.13.0-rc2+ #46
      [ 1658.929405][    C7] irq_soft_mask: 0x01 in_mce: 0 in_nmi: 0 current: 325 (kworker/1:1H)
      [ 1658.929465][    C1] Workqueue: events_highpri test_work_fn [test_lockup]
      [ 1658.929549][    C7] Back trace of paca->saved_r1 (0xc0000000057fb400) (possibly stale):
      [ 1658.929592][    C1] NIP:  c00000000002cf50 LR: c008000000820178 CTR: c00000000002cfa0
    
    To fix it, change the logic so that the sending CPU waits 5s for the
    receiving CPU to print its trace. If the receiving CPU prints its trace
    successfully then the sending CPU just continues, avoiding any spurious
    "stale" trace.
    
    This has the added benefit of allowing all CPUs to print their traces in
    order and avoids any interleaving of their output.
    
    Fixes: 5cc05910f26e ("powerpc/64s: Wire up arch_trigger_cpumask_backtrace()")
    Cc: stable@vger.kernel.org # v4.18+
    Reported-by: Nathan Lynch <nathanl@linux.ibm.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210625140408.3351173-1-mpe@ellerman.id.au
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/powerpc/kernel/stacktrace.c b/arch/powerpc/kernel/stacktrace.c
index e2c50b55138f..23b5f755e419 100644
--- a/arch/powerpc/kernel/stacktrace.c
+++ b/arch/powerpc/kernel/stacktrace.c
@@ -19,6 +19,7 @@
 #include <asm/ptrace.h>
 #include <asm/processor.h>
 #include <linux/ftrace.h>
+#include <linux/delay.h>
 #include <asm/kprobes.h>
 
 #include <asm/paca.h>
@@ -204,17 +205,31 @@ static void handle_backtrace_ipi(struct pt_regs *regs)
 
 static void raise_backtrace_ipi(cpumask_t *mask)
 {
+	struct paca_struct *p;
 	unsigned int cpu;
+	u64 delay_us;
 
 	for_each_cpu(cpu, mask) {
-		if (cpu == smp_processor_id())
+		if (cpu == smp_processor_id()) {
 			handle_backtrace_ipi(NULL);
-		else
-			smp_send_safe_nmi_ipi(cpu, handle_backtrace_ipi, 5 * USEC_PER_SEC);
-	}
+			continue;
+		}
 
-	for_each_cpu(cpu, mask) {
-		struct paca_struct *p = paca_ptrs[cpu];
+		delay_us = 5 * USEC_PER_SEC;
+
+		if (smp_send_safe_nmi_ipi(cpu, handle_backtrace_ipi, delay_us)) {
+			// Now wait up to 5s for the other CPU to do its backtrace
+			while (cpumask_test_cpu(cpu, mask) && delay_us) {
+				udelay(1);
+				delay_us--;
+			}
+
+			// Other CPU cleared itself from the mask
+			if (delay_us)
+				continue;
+		}
+
+		p = paca_ptrs[cpu];
 
 		cpumask_clear_cpu(cpu, mask);
 

commit c2e99a8d37b90b35d7d904c86fd125375ebec2b4
Author: Yun Zhou <yun.zhou@windriver.com>
Date:   Sat Jun 26 11:21:56 2021 +0800

    seq_buf: Make trace_seq_putmem_hex() support data longer than 8
    
    commit 6a2cbc58d6c9d90cd74288cc497c2b45815bc064 upstream.
    
    Since the raw memory 'data' does not go forward, it will dump repeated
    data if the data length is more than 8. If we want to dump longer data
    blocks, we need to repeatedly call macro SEQ_PUT_HEX_FIELD. I think it
    is a bit redundant, and multiple function calls also affect the performance.
    
    Link: https://lore.kernel.org/lkml/20210625122453.5e2fe304@oasis.local.home/
    Link: https://lkml.kernel.org/r/20210626032156.47889-2-yun.zhou@windriver.com
    
    Cc: stable@vger.kernel.org
    Fixes: 6d2289f3faa7 ("tracing: Make trace_seq_putmem_hex() more robust")
    Signed-off-by: Yun Zhou <yun.zhou@windriver.com>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/lib/seq_buf.c b/lib/seq_buf.c
index 6aabb609dd87..97de70872c9e 100644
--- a/lib/seq_buf.c
+++ b/lib/seq_buf.c
@@ -242,12 +242,14 @@ int seq_buf_putmem_hex(struct seq_buf *s, const void *mem,
 			break;
 
 		/* j increments twice per loop */
-		len -= j / 2;
 		hex[j++] = ' ';
 
 		seq_buf_putmem(s, hex, j);
 		if (seq_buf_has_overflowed(s))
 			return -1;
+
+		len -= start_len;
+		data += start_len;
 	}
 	return 0;
 }

commit 47ab2c74132cc926b9a6099aa985efcb721f4d00
Author: Steven Rostedt (VMware) <rostedt@goodmis.org>
Date:   Tue Jun 29 09:40:10 2021 -0400

    tracepoint: Add tracepoint_probe_register_may_exist() for BPF tracing
    
    commit 9913d5745bd720c4266805c8d29952a3702e4eca upstream.
    
    All internal use cases for tracepoint_probe_register() is set to not ever
    be called with the same function and data. If it is, it is considered a
    bug, as that means the accounting of handling tracepoints is corrupted.
    If the function and data for a tracepoint is already registered when
    tracepoint_probe_register() is called, it will call WARN_ON_ONCE() and
    return with EEXISTS.
    
    The BPF system call can end up calling tracepoint_probe_register() with
    the same data, which now means that this can trigger the warning because
    of a user space process. As WARN_ON_ONCE() should not be called because
    user space called a system call with bad data, there needs to be a way to
    register a tracepoint without triggering a warning.
    
    Enter tracepoint_probe_register_may_exist(), which can be called, but will
    not cause a WARN_ON() if the probe already exists. It will still error out
    with EEXIST, which will then be sent to the user space that performed the
    BPF system call.
    
    This keeps the previous testing for issues with other users of the
    tracepoint code, while letting BPF call it with duplicated data and not
    warn about it.
    
    Link: https://lore.kernel.org/lkml/20210626135845.4080-1-penguin-kernel@I-love.SAKURA.ne.jp/
    Link: https://syzkaller.appspot.com/bug?id=41f4318cf01762389f4d1c1c459da4f542fe5153
    
    Cc: stable@vger.kernel.org
    Fixes: c4f6699dfcb85 ("bpf: introduce BPF_RAW_TRACEPOINT")
    Reported-by: syzbot <syzbot+721aa903751db87aa244@syzkaller.appspotmail.com>
    Reported-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Tested-by: syzbot+721aa903751db87aa244@syzkaller.appspotmail.com
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
index 444aa73037f1..4251cbfdb3c8 100644
--- a/include/linux/tracepoint.h
+++ b/include/linux/tracepoint.h
@@ -42,7 +42,17 @@ extern int
 tracepoint_probe_register_prio(struct tracepoint *tp, void *probe, void *data,
 			       int prio);
 extern int
+tracepoint_probe_register_prio_may_exist(struct tracepoint *tp, void *probe, void *data,
+					 int prio);
+extern int
 tracepoint_probe_unregister(struct tracepoint *tp, void *probe, void *data);
+static inline int
+tracepoint_probe_register_may_exist(struct tracepoint *tp, void *probe,
+				    void *data)
+{
+	return tracepoint_probe_register_prio_may_exist(tp, probe, data,
+							TRACEPOINT_DEFAULT_PRIO);
+}
 extern void
 for_each_kernel_tracepoint(void (*fct)(struct tracepoint *tp, void *priv),
 		void *priv);
diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
index 83c4e76f513a..1cb13d6368f3 100644
--- a/kernel/trace/bpf_trace.c
+++ b/kernel/trace/bpf_trace.c
@@ -1221,7 +1221,8 @@ static int __bpf_probe_register(struct bpf_raw_event_map *btp, struct bpf_prog *
 	if (prog->aux->max_ctx_offset > btp->num_args * sizeof(u64))
 		return -EINVAL;
 
-	return tracepoint_probe_register(tp, (void *)btp->bpf_func, prog);
+	return tracepoint_probe_register_may_exist(tp, (void *)btp->bpf_func,
+						   prog);
 }
 
 int bpf_probe_register(struct bpf_raw_event_map *btp, struct bpf_prog *prog)
diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c
index d5ce69231912..625297a9cae2 100644
--- a/kernel/tracepoint.c
+++ b/kernel/tracepoint.c
@@ -284,7 +284,8 @@ static void *func_remove(struct tracepoint_func **funcs,
  * Add the probe function to a tracepoint.
  */
 static int tracepoint_add_func(struct tracepoint *tp,
-			       struct tracepoint_func *func, int prio)
+			       struct tracepoint_func *func, int prio,
+			       bool warn)
 {
 	struct tracepoint_func *old, *tp_funcs;
 	int ret;
@@ -299,7 +300,7 @@ static int tracepoint_add_func(struct tracepoint *tp,
 			lockdep_is_held(&tracepoints_mutex));
 	old = func_add(&tp_funcs, func, prio);
 	if (IS_ERR(old)) {
-		WARN_ON_ONCE(PTR_ERR(old) != -ENOMEM);
+		WARN_ON_ONCE(warn && PTR_ERR(old) != -ENOMEM);
 		return PTR_ERR(old);
 	}
 
@@ -350,6 +351,32 @@ static int tracepoint_remove_func(struct tracepoint *tp,
 	return 0;
 }
 
+/**
+ * tracepoint_probe_register_prio_may_exist -  Connect a probe to a tracepoint with priority
+ * @tp: tracepoint
+ * @probe: probe handler
+ * @data: tracepoint data
+ * @prio: priority of this function over other registered functions
+ *
+ * Same as tracepoint_probe_register_prio() except that it will not warn
+ * if the tracepoint is already registered.
+ */
+int tracepoint_probe_register_prio_may_exist(struct tracepoint *tp, void *probe,
+					     void *data, int prio)
+{
+	struct tracepoint_func tp_func;
+	int ret;
+
+	mutex_lock(&tracepoints_mutex);
+	tp_func.func = probe;
+	tp_func.data = data;
+	tp_func.prio = prio;
+	ret = tracepoint_add_func(tp, &tp_func, prio, false);
+	mutex_unlock(&tracepoints_mutex);
+	return ret;
+}
+EXPORT_SYMBOL_GPL(tracepoint_probe_register_prio_may_exist);
+
 /**
  * tracepoint_probe_register_prio -  Connect a probe to a tracepoint with priority
  * @tp: tracepoint
@@ -373,7 +400,7 @@ int tracepoint_probe_register_prio(struct tracepoint *tp, void *probe,
 	tp_func.func = probe;
 	tp_func.data = data;
 	tp_func.prio = prio;
-	ret = tracepoint_add_func(tp, &tp_func, prio);
+	ret = tracepoint_add_func(tp, &tp_func, prio, true);
 	mutex_unlock(&tracepoints_mutex);
 	return ret;
 }

commit b05195282f437f7b7391837bf5afbae06ca12d0a
Author: Steven Rostedt (VMware) <rostedt@goodmis.org>
Date:   Wed Jul 7 11:08:21 2021 -0400

    tracing/histograms: Fix parsing of "sym-offset" modifier
    
    commit 26c563731056c3ee66f91106c3078a8c36bb7a9e upstream.
    
    With the addition of simple mathematical operations (plus and minus), the
    parsing of the "sym-offset" modifier broke, as it took the '-' part of the
    "sym-offset" as a minus, and tried to break it up into a mathematical
    operation of "field.sym - offset", in which case it failed to parse
    (unless the event had a field called "offset").
    
    Both .sym and .sym-offset modifiers should not be entered into
    mathematical calculations anyway. If ".sym-offset" is found in the
    modifier, then simply make it not an operation that can be calculated on.
    
    Link: https://lkml.kernel.org/r/20210707110821.188ae255@oasis.local.home
    
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Daniel Bristot de Oliveira <bristot@redhat.com>
    Cc: stable@vger.kernel.org
    Fixes: 100719dcef447 ("tracing: Add simple expression support to hist triggers")
    Reviewed-by: Tom Zanussi <zanussi@kernel.org>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
index 3ed2d7f7e571..7a9d45a88afe 100644
--- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c
@@ -2211,6 +2211,13 @@ static int contains_operator(char *str)
 
 	switch (*op) {
 	case '-':
+		/*
+		 * Unfortunately, the modifier ".sym-offset"
+		 * can confuse things.
+		 */
+		if (op - str >= 4 && !strncmp(op - 4, ".sym-offset", 11))
+			return FIELD_OP_NONE;
+
 		if (*str == '-')
 			field_op = FIELD_OP_UNARY_MINUS;
 		else

commit 651c8f620e140910fb204052bb0b886bcd8a04ee
Author: Martin Fuzzey <martin.fuzzey@flowbird.group>
Date:   Tue Jun 1 18:19:53 2021 +0200

    rsi: fix AP mode with WPA failure due to encrypted EAPOL
    
    commit 314538041b5632ffaf64798faaeabaf2793fe029 upstream.
    
    In AP mode WPA2-PSK connections were not established.
    
    The reason was that the AP was sending the first message
    of the 4 way handshake encrypted, even though no pairwise
    key had (correctly) yet been set.
    
    Encryption was enabled if the "security_enable" driver flag
    was set and encryption was not explicitly disabled by
    IEEE80211_TX_INTFL_DONT_ENCRYPT.
    
    However security_enable was set when *any* key, including
    the AP GTK key, had been set which was causing unwanted
    encryption even if no key was avaialble for the unicast
    packet to be sent.
    
    Fix this by adding a check that we have a key and drop
    the old security_enable driver flag which is insufficient
    and redundant.
    
    The Redpine downstream out of tree driver does it this way too.
    
    Regarding the Fixes tag the actual code being modified was
    introduced earlier, with the original driver submission, in
    dad0d04fa7ba ("rsi: Add RS9113 wireless driver"), however
    at that time AP mode was not yet supported so there was
    no bug at that point.
    
    So I have tagged the introduction of AP support instead
    which was part of the patch set "rsi: support for AP mode" [1]
    
    It is not clear whether AP WPA has ever worked, I can see nothing
    on the kernel side that broke it afterwards yet the AP support
    patch series says "Tests are performed to confirm aggregation,
    connections in WEP and WPA/WPA2 security."
    
    One possibility is that the initial tests were done with a modified
    userspace (hostapd).
    
    [1] https://www.spinics.net/lists/linux-wireless/msg165302.html
    
    Signed-off-by: Martin Fuzzey <martin.fuzzey@flowbird.group>
    Fixes: 38ef62353acb ("rsi: security enhancements for AP mode")
    CC: stable@vger.kernel.org
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/1622564459-24430-1-git-send-email-martin.fuzzey@flowbird.group
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c b/drivers/net/wireless/rsi/rsi_91x_hal.c
index 5397d95833c3..c0301cd10209 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -193,7 +193,7 @@ int rsi_prepare_data_desc(struct rsi_common *common, struct sk_buff *skb)
 		wh->frame_control |= cpu_to_le16(RSI_SET_PS_ENABLE);
 
 	if ((!(info->flags & IEEE80211_TX_INTFL_DONT_ENCRYPT)) &&
-	    (common->secinfo.security_enable)) {
+	    info->control.hw_key) {
 		if (rsi_is_cipher_wep(common))
 			ieee80211_size += 4;
 		else
diff --git a/drivers/net/wireless/rsi/rsi_91x_mac80211.c b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
index be59d66585d6..bf52091b7918 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mac80211.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
@@ -959,7 +959,6 @@ static int rsi_mac80211_set_key(struct ieee80211_hw *hw,
 	mutex_lock(&common->mutex);
 	switch (cmd) {
 	case SET_KEY:
-		secinfo->security_enable = true;
 		status = rsi_hal_key_config(hw, vif, key, sta);
 		if (status) {
 			mutex_unlock(&common->mutex);
@@ -978,8 +977,6 @@ static int rsi_mac80211_set_key(struct ieee80211_hw *hw,
 		break;
 
 	case DISABLE_KEY:
-		if (vif->type == NL80211_IFTYPE_STATION)
-			secinfo->security_enable = false;
 		rsi_dbg(ERR_ZONE, "%s: RSI del key\n", __func__);
 		memset(key, 0, sizeof(struct ieee80211_key_conf));
 		status = rsi_hal_key_config(hw, vif, key, sta);
diff --git a/drivers/net/wireless/rsi/rsi_91x_mgmt.c b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
index 1a3a5235cfb8..934550a66732 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mgmt.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
@@ -1615,8 +1615,7 @@ int rsi_send_wowlan_request(struct rsi_common *common, u16 flags,
 			RSI_WIFI_MGMT_Q);
 	cmd_frame->desc.desc_dword0.frame_type = WOWLAN_CONFIG_PARAMS;
 	cmd_frame->host_sleep_status = sleep_status;
-	if (common->secinfo.security_enable &&
-	    common->secinfo.gtk_cipher)
+	if (common->secinfo.gtk_cipher)
 		flags |= RSI_WOW_GTK_REKEY;
 	if (sleep_status)
 		cmd_frame->wow_flags = flags;
diff --git a/drivers/net/wireless/rsi/rsi_main.h b/drivers/net/wireless/rsi/rsi_main.h
index a084f224bb03..a245559abe7c 100644
--- a/drivers/net/wireless/rsi/rsi_main.h
+++ b/drivers/net/wireless/rsi/rsi_main.h
@@ -147,7 +147,6 @@ enum edca_queue {
 };
 
 struct security_info {
-	bool security_enable;
 	u32 ptk_cipher;
 	u32 gtk_cipher;
 };

commit fc9d17deb8008272ff71a40069f977edb0111a0c
Author: Marek Vasut <marex@denx.de>
Date:   Fri May 7 23:31:05 2021 +0200

    rsi: Assign beacon rate settings to the correct rate_info descriptor field
    
    commit b1c3a24897bd528f2f4fda9fea7da08a84ae25b6 upstream.
    
    The RSI_RATE_x bits must be assigned to struct rsi_data_desc rate_info
    field. The rest of the driver does it correctly, except this one place,
    so fix it. This is also aligned with the RSI downstream vendor driver.
    Without this patch, an AP operating at 5 GHz does not transmit any
    beacons at all, this patch fixes that.
    
    Fixes: d26a9559403c ("rsi: add beacon changes for AP mode")
    Signed-off-by: Marek Vasut <marex@denx.de>
    Cc: Amitkumar Karwar <amit.karwar@redpinesignals.com>
    Cc: Angus Ainslie <angus@akkea.ca>
    Cc: David S. Miller <davem@davemloft.net>
    Cc: Jakub Kicinski <kuba@kernel.org>
    Cc: Kalle Valo <kvalo@codeaurora.org>
    Cc: Karun Eagalapati <karun256@gmail.com>
    Cc: Martin Kepplinger <martink@posteo.de>
    Cc: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
    Cc: Sebastian Krzyszkowiak <sebastian.krzyszkowiak@puri.sm>
    Cc: Siva Rebbagondla <siva8118@gmail.com>
    Cc: netdev@vger.kernel.org
    Cc: stable@vger.kernel.org
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210507213105.140138-1-marex@denx.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c b/drivers/net/wireless/rsi/rsi_91x_hal.c
index 0da95777f1c1..5397d95833c3 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -464,9 +464,9 @@ int rsi_prepare_beacon(struct rsi_common *common, struct sk_buff *skb)
 	}
 
 	if (common->band == NL80211_BAND_2GHZ)
-		bcn_frm->bbp_info |= cpu_to_le16(RSI_RATE_1);
+		bcn_frm->rate_info |= cpu_to_le16(RSI_RATE_1);
 	else
-		bcn_frm->bbp_info |= cpu_to_le16(RSI_RATE_6);
+		bcn_frm->rate_info |= cpu_to_le16(RSI_RATE_6);
 
 	if (mac_bcn->data[tim_offset + 2] == 0)
 		bcn_frm->frame_info |= cpu_to_le16(RSI_DATA_DESC_DTIM_BEACON);

commit 0036a22e5ed52cc9ff101b21db7b235b99586325
Author: Michael Buesch <m@bues.ch>
Date:   Sat May 15 21:02:52 2021 +0200

    ssb: sdio: Don't overwrite const buffer if block_write fails
    
    commit 47ec636f7a25aa2549e198c48ecb6b1c25d05456 upstream.
    
    It doesn't make sense to clobber the const driver-side buffer, if a
    write-to-device attempt failed. All other SSB variants (PCI, PCMCIA and SoC)
    also don't corrupt the buffer on any failure in block_write.
    Therefore, remove this memset from the SDIO variant.
    
    Signed-off-by: Michael Büsch <m@bues.ch>
    Cc: stable@vger.kernel.org
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210515210252.318be2ba@wiggum
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/ssb/sdio.c b/drivers/ssb/sdio.c
index 7fe0afb42234..66c5c2169704 100644
--- a/drivers/ssb/sdio.c
+++ b/drivers/ssb/sdio.c
@@ -411,7 +411,6 @@ static void ssb_sdio_block_write(struct ssb_device *dev, const void *buffer,
 	sdio_claim_host(bus->host_sdio);
 	if (unlikely(ssb_sdio_switch_core(bus, dev))) {
 		error = -EIO;
-		memset((void *)buffer, 0xff, count);
 		goto err_out;
 	}
 	offset |= bus->sdio_sbaddr & 0xffff;

commit 15e84bbbea55c977db1524122d4c0272bf732f3c
Author: Pali Rohár <pali@kernel.org>
Date:   Mon May 31 17:41:27 2021 +0300

    ath9k: Fix kernel NULL pointer dereference during ath_reset_internal()
    
    commit fb312ac5ccb007e843f982b38d4d6886ba4b32f2 upstream.
    
    I got this crash more times during debugging of PCIe controller and crash
    happens somehow at the time when PCIe kernel code started link retraining (as
    part of ASPM code) when at the same time PCIe link went down and ath9k probably
    executed hw reset procedure.
    
    Currently I'm not able to reproduce this issue as it looks like to be
    some race condition between link training, ASPM, link down and reset
    path. And as always, race conditions which depends on more input
    parameters are hard to reproduce as it depends on precise timings.
    
    But it is clear that pointers are zero in this case and should be
    properly filled as same code pattern is used in ath9k_stop() function.
    Anyway I was able to reproduce this crash by manually triggering ath
    reset worker prior putting card up. I created simple patch to export
    reset functionality via debugfs and use it to "simulate" of triggering
    reset.    s proved that NULL-pointer dereference issue is there.
    
    Function ath9k_hw_reset() is dereferencing chan structure pointer, so it
    needs to be non-NULL pointer.
    
    Function ath9k_stop() already contains code which sets ah->curchan to valid
    non-NULL pointer prior calling ath9k_hw_reset() function.
    
    Add same code pattern also into ath_reset_internal() function to prevent
    kernel NULL pointer dereference in ath9k_hw_reset() function.
    
    This change fixes kernel NULL pointer dereference in ath9k_hw_reset() which
    is caused by calling ath9k_hw_reset() from ath_reset_internal() with NULL
    chan structure.
    
        [   45.334305] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000008
        [   45.344417] Mem abort info:
        [   45.347301]   ESR = 0x96000005
        [   45.350448]   EC = 0x25: DABT (current EL), IL = 32 bits
        [   45.356166]   SET = 0, FnV = 0
        [   45.359350]   EA = 0, S1PTW = 0
        [   45.362596] Data abort info:
        [   45.365756]   ISV = 0, ISS = 0x00000005
        [   45.369735]   CM = 0, WnR = 0
        [   45.372814] user pgtable: 4k pages, 39-bit VAs, pgdp=000000000685d000
        [   45.379663] [0000000000000008] pgd=0000000000000000, p4d=0000000000000000, pud=0000000000000000
        [   45.388856] Internal error: Oops: 96000005 [#1] SMP
        [   45.393897] Modules linked in: ath9k ath9k_common ath9k_hw
        [   45.399574] CPU: 1 PID: 309 Comm: kworker/u4:2 Not tainted 5.12.0-rc2-dirty #785
        [   45.414746] Workqueue: phy0 ath_reset_work [ath9k]
        [   45.419713] pstate: 40000005 (nZcv daif -PAN -UAO -TCO BTYPE=--)
        [   45.425910] pc : ath9k_hw_reset+0xc4/0x1c48 [ath9k_hw]
        [   45.431234] lr : ath9k_hw_reset+0xc0/0x1c48 [ath9k_hw]
        [   45.436548] sp : ffffffc0118dbca0
        [   45.439961] x29: ffffffc0118dbca0 x28: 0000000000000000
        [   45.445442] x27: ffffff800dee4080 x26: 0000000000000000
        [   45.450923] x25: ffffff800df9b9d8 x24: 0000000000000000
        [   45.456404] x23: ffffffc0115f6000 x22: ffffffc008d0d408
        [   45.461885] x21: ffffff800dee5080 x20: ffffff800df9b9d8
        [   45.467366] x19: 0000000000000000 x18: 0000000000000000
        [   45.472846] x17: 0000000000000000 x16: 0000000000000000
        [   45.478326] x15: 0000000000000010 x14: ffffffffffffffff
        [   45.483807] x13: ffffffc0918db94f x12: ffffffc011498720
        [   45.489289] x11: 0000000000000003 x10: ffffffc0114806e0
        [   45.494770] x9 : ffffffc01014b2ec x8 : 0000000000017fe8
        [   45.500251] x7 : c0000000ffffefff x6 : 0000000000000001
        [   45.505733] x5 : 0000000000000000 x4 : 0000000000000000
        [   45.511213] x3 : 0000000000000000 x2 : ffffff801fece870
        [   45.516693] x1 : ffffffc00eded000 x0 : 000000000000003f
        [   45.522174] Call trace:
        [   45.524695]  ath9k_hw_reset+0xc4/0x1c48 [ath9k_hw]
        [   45.529653]  ath_reset_internal+0x1a8/0x2b8 [ath9k]
        [   45.534696]  ath_reset_work+0x2c/0x40 [ath9k]
        [   45.539198]  process_one_work+0x210/0x480
        [   45.543339]  worker_thread+0x5c/0x510
        [   45.547115]  kthread+0x12c/0x130
        [   45.550445]  ret_from_fork+0x10/0x1c
        [   45.554138] Code: 910922c2 9117e021 95ff0398 b4000294 (b9400a61)
        [   45.560430] ---[ end trace 566410ba90b50e8b ]---
        [   45.565193] Kernel panic - not syncing: Oops: Fatal exception in interrupt
        [   45.572282] SMP: stopping secondary CPUs
        [   45.576331] Kernel Offset: disabled
        [   45.579924] CPU features: 0x00040002,0000200c
        [   45.584416] Memory Limit: none
        [   45.587564] Rebooting in 3 seconds..
    
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210402122653.24014-1-pali@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 3e92b88045a5..e929020d7c9c 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -304,6 +304,11 @@ static int ath_reset_internal(struct ath_softc *sc, struct ath9k_channel *hchan)
 		hchan = ah->curchan;
 	}
 
+	if (!hchan) {
+		fastcc = false;
+		hchan = ath9k_cmn_get_channel(sc->hw, ah, &sc->cur_chan->chandef);
+	}
+
 	if (!ath_prepare_reset(sc))
 		fastcc = false;
 

commit 3343d0192ed7cce9744ab973400f0a12916f466c
Author: Ondrej Zary <linux@zary.sk>
Date:   Fri Jun 11 22:19:39 2021 +0200

    serial_cs: remove wrong GLOBETROTTER.cis entry
    
    commit 11b1d881a90fc184cc7d06e9804eb288c24a2a0d upstream.
    
    The GLOBETROTTER.cis entry in serial_cs matches more devices than
    intended and breaks them. Remove it.
    
    Example: # pccardctl info
    PRODID_1="Option International
    "
    PRODID_2="GSM-Ready 56K/ISDN
    "
    PRODID_3="021
    "
    PRODID_4="A
    "
    MANFID=0013,0000
    FUNCID=0
    
    result:
    pcmcia 0.0: Direct firmware load for cis/GLOBETROTTER.cis failed with error -2
    
    The GLOBETROTTER.cis is nowhere to be found. There's GLOBETROTTER.cis.ihex at
    https://netdev.vger.kernel.narkive.com/h4inqdxM/patch-axnet-cs-fix-phy-id-detection-for-bogus-asix-chip#post41
    It's from completely diffetent card:
    vers_1 4.1, "Option International", "GSM/GPRS GlobeTrotter", "001", "A"
    
    Signed-off-by: Ondrej Zary <linux@zary.sk>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210611201940.23898-1-linux@zary.sk
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/tty/serial/8250/serial_cs.c b/drivers/tty/serial/8250/serial_cs.c
index 144683c80892..ccd1a615305b 100644
--- a/drivers/tty/serial/8250/serial_cs.c
+++ b/drivers/tty/serial/8250/serial_cs.c
@@ -808,7 +808,6 @@ static const struct pcmcia_device_id serial_ids[] = {
 	PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "cis/COMpad4.cis"),
 	PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "cis/COMpad2.cis"),
 	PCMCIA_DEVICE_CIS_PROD_ID2("RS-COM 2P", 0xad20b156, "cis/RS-COM-2P.cis"),
-	PCMCIA_DEVICE_CIS_MANF_CARD(0x0013, 0x0000, "cis/GLOBETROTTER.cis"),
 	PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.", "SERIAL CARD: SL100  1.00.", 0x19ca78af, 0xf964f42b),
 	PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.", "SERIAL CARD: SL100", 0x19ca78af, 0x71d98e83),
 	PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.", "SERIAL CARD: SL232  1.00.", 0x19ca78af, 0x69fb7490),

commit 3474a9b57b67349977f31ff355f35863ed742010
Author: Ondrej Zary <linux@zary.sk>
Date:   Fri Jun 11 22:19:40 2021 +0200

    serial_cs: Add Option International GSM-Ready 56K/ISDN modem
    
    commit d495dd743d5ecd47288156e25c4d9163294a0992 upstream.
    
    Add support for Option International GSM-Ready 56K/ISDN PCMCIA modem
    card.
    
    Signed-off-by: Ondrej Zary <linux@zary.sk>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210611201940.23898-2-linux@zary.sk
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/tty/serial/8250/serial_cs.c b/drivers/tty/serial/8250/serial_cs.c
index c8186a05a453..144683c80892 100644
--- a/drivers/tty/serial/8250/serial_cs.c
+++ b/drivers/tty/serial/8250/serial_cs.c
@@ -780,6 +780,7 @@ static const struct pcmcia_device_id serial_ids[] = {
 	PCMCIA_DEVICE_PROD_ID12("Multi-Tech", "MT2834LT", 0x5f73be51, 0x4cd7c09e),
 	PCMCIA_DEVICE_PROD_ID12("OEM      ", "C288MX     ", 0xb572d360, 0xd2385b7a),
 	PCMCIA_DEVICE_PROD_ID12("Option International", "V34bis GSM/PSTN Data/Fax Modem", 0x9d7cd6f5, 0x5cb8bf41),
+	PCMCIA_DEVICE_PROD_ID12("Option International", "GSM-Ready 56K/ISDN", 0x9d7cd6f5, 0xb23844aa),
 	PCMCIA_DEVICE_PROD_ID12("PCMCIA   ", "C336MX     ", 0x99bcafe9, 0xaa25bcab),
 	PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "PCMCIA Dual RS-232 Serial Port Card", 0xc4420b35, 0x92abc92f),
 	PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "Dual RS-232 Serial Port PC Card", 0xc4420b35, 0x031a380d),

commit 06e64e9b9d9394cdbafbd269473cc2371e27a8f8
Author: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Date:   Thu Jun 10 20:08:06 2021 +0900

    serial: sh-sci: Stop dmaengine transfer in sci_stop_tx()
    
    commit 08a84410a04f05c7c1b8e833f552416d8eb9f6fe upstream.
    
    Stop dmaengine transfer in sci_stop_tx(). Otherwise, the following
    message is possible output when system enters suspend and while
    transferring data, because clearing TIE bit in SCSCR is not able to
    stop any dmaengine transfer.
    
        sh-sci e6550000.serial: ttySC1: Unable to drain transmitter
    
    Note that this driver has already used some #ifdef in the .c file
    so that this patch also uses #ifdef to fix the issue. Otherwise,
    build errors happens if the CONFIG_SERIAL_SH_SCI_DMA is disabled.
    
    Fixes: 73a19e4c0301 ("serial: sh-sci: Add DMA support.")
    Cc: <stable@vger.kernel.org> # v4.9+
    Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
    Link: https://lore.kernel.org/r/20210610110806.277932-1-yoshihiro.shimoda.uh@renesas.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
index bfbfe0d68d82..db5b11879910 100644
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@ -613,6 +613,14 @@ static void sci_stop_tx(struct uart_port *port)
 	ctrl &= ~SCSCR_TIE;
 
 	serial_port_out(port, SCSCR, ctrl);
+
+#ifdef CONFIG_SERIAL_SH_SCI_DMA
+	if (to_sci_port(port)->chan_tx &&
+	    !dma_submit_error(to_sci_port(port)->cookie_tx)) {
+		dmaengine_terminate_async(to_sci_port(port)->chan_tx);
+		to_sci_port(port)->cookie_tx = -EINVAL;
+	}
+#endif
 }
 
 static void sci_start_rx(struct uart_port *port)

commit 59ea111143ec1591e746d37e9d8d0727f04516b2
Author: Oliver Lang <Oliver.Lang@gossenmetrawatt.com>
Date:   Thu Jun 10 15:46:18 2021 +0200

    iio: ltr501: ltr501_read_ps(): add missing endianness conversion
    
    commit 71b33f6f93ef9462c84560e2236ed22209d26a58 upstream.
    
    The PS ADC Channel data is spread over 2 registers in little-endian
    form. This patch adds the missing endianness conversion.
    
    Fixes: 2690be905123 ("iio: Add Lite-On ltr501 ambient light / proximity sensor driver")
    Signed-off-by: Oliver Lang <Oliver.Lang@gossenmetrawatt.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Tested-by: Nikita Travkin <nikita@trvn.ru> # ltr559
    Link: https://lore.kernel.org/r/20210610134619.2101372-4-mkl@pengutronix.de
    Cc: <Stable@vger.kernel.org>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iio/light/ltr501.c b/drivers/iio/light/ltr501.c
index 67f5b2a8dccc..f3fb79c231be 100644
--- a/drivers/iio/light/ltr501.c
+++ b/drivers/iio/light/ltr501.c
@@ -411,18 +411,19 @@ static int ltr501_read_als(struct ltr501_data *data, __le16 buf[2])
 
 static int ltr501_read_ps(struct ltr501_data *data)
 {
-	int ret, status;
+	__le16 status;
+	int ret;
 
 	ret = ltr501_drdy(data, LTR501_STATUS_PS_RDY);
 	if (ret < 0)
 		return ret;
 
 	ret = regmap_bulk_read(data->regmap, LTR501_PS_DATA,
-			       &status, 2);
+			       &status, sizeof(status));
 	if (ret < 0)
 		return ret;
 
-	return status;
+	return le16_to_cpu(status);
 }
 
 static int ltr501_read_intr_prst(struct ltr501_data *data,

commit 049fb271acf9816a19e3ed4bb0785d9876a6f702
Author: Oliver Lang <Oliver.Lang@gossenmetrawatt.com>
Date:   Thu Jun 10 15:46:17 2021 +0200

    iio: ltr501: ltr559: fix initialization of LTR501_ALS_CONTR
    
    commit 421a26f3d7a7c3ca43f3a9dc0f3cb0f562d5bd95 upstream.
    
    The ltr559 chip uses only the lowest bit of the ALS_CONTR register to
    configure between active and stand-by mode. In the original driver
    BIT(1) is used, which does a software reset instead.
    
    This patch fixes the problem by using BIT(0) as als_mode_active for
    the ltr559 chip.
    
    Fixes: 8592a7eefa54 ("iio: ltr501: Add support for ltr559 chip")
    Signed-off-by: Oliver Lang <Oliver.Lang@gossenmetrawatt.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Tested-by: Nikita Travkin <nikita@trvn.ru> # ltr559
    Link: https://lore.kernel.org/r/20210610134619.2101372-3-mkl@pengutronix.de
    Cc: <Stable@vger.kernel.org>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iio/light/ltr501.c b/drivers/iio/light/ltr501.c
index 4445c0d16c30..67f5b2a8dccc 100644
--- a/drivers/iio/light/ltr501.c
+++ b/drivers/iio/light/ltr501.c
@@ -1210,7 +1210,7 @@ static struct ltr501_chip_info ltr501_chip_info_tbl[] = {
 		.als_gain_tbl_size = ARRAY_SIZE(ltr559_als_gain_tbl),
 		.ps_gain = ltr559_ps_gain_tbl,
 		.ps_gain_tbl_size = ARRAY_SIZE(ltr559_ps_gain_tbl),
-		.als_mode_active = BIT(1),
+		.als_mode_active = BIT(0),
 		.als_gain_mask = BIT(2) | BIT(3) | BIT(4),
 		.als_gain_shift = 2,
 		.info = &ltr501_info,

commit 56161cf5c3c982351a5f2b27cc97b3f7e339562f
Author: Marc Kleine-Budde <mkl@pengutronix.de>
Date:   Thu Jun 10 15:46:16 2021 +0200

    iio: ltr501: mark register holding upper 8 bits of ALS_DATA{0,1} and PS_DATA as volatile, too
    
    commit 2ac0b029a04b673ce83b5089368f467c5dca720c upstream.
    
    The regmap is configured for 8 bit registers, uses a RB-Tree cache and
    marks several registers as volatile (i.e. do not cache).
    
    The ALS and PS data registers in the chip are 16 bit wide and spans
    two regmap registers. In the current driver only the base register is
    marked as volatile, resulting in the upper register only read once.
    
    Further the data sheet notes:
    
    | When the I2C read operation starts, all four ALS data registers are
    | locked until the I2C read operation of register 0x8B is completed.
    
    Which results in the registers never update after the 2nd read.
    
    This patch fixes the problem by marking the upper 8 bits of the ALS
    and PS registers as volatile, too.
    
    Fixes: 2f2c96338afc ("iio: ltr501: Add regmap support.")
    Reported-by: Oliver Lang <Oliver.Lang@gossenmetrawatt.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Tested-by: Nikita Travkin <nikita@trvn.ru> # ltr559
    Link: https://lore.kernel.org/r/20210610134619.2101372-2-mkl@pengutronix.de
    Cc: <Stable@vger.kernel.org>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iio/light/ltr501.c b/drivers/iio/light/ltr501.c
index 947f17588024..4445c0d16c30 100644
--- a/drivers/iio/light/ltr501.c
+++ b/drivers/iio/light/ltr501.c
@@ -35,9 +35,12 @@
 #define LTR501_PART_ID 0x86
 #define LTR501_MANUFAC_ID 0x87
 #define LTR501_ALS_DATA1 0x88 /* 16-bit, little endian */
+#define LTR501_ALS_DATA1_UPPER 0x89 /* upper 8 bits of LTR501_ALS_DATA1 */
 #define LTR501_ALS_DATA0 0x8a /* 16-bit, little endian */
+#define LTR501_ALS_DATA0_UPPER 0x8b /* upper 8 bits of LTR501_ALS_DATA0 */
 #define LTR501_ALS_PS_STATUS 0x8c
 #define LTR501_PS_DATA 0x8d /* 16-bit, little endian */
+#define LTR501_PS_DATA_UPPER 0x8e /* upper 8 bits of LTR501_PS_DATA */
 #define LTR501_INTR 0x8f /* output mode, polarity, mode */
 #define LTR501_PS_THRESH_UP 0x90 /* 11 bit, ps upper threshold */
 #define LTR501_PS_THRESH_LOW 0x92 /* 11 bit, ps lower threshold */
@@ -1356,9 +1359,12 @@ static bool ltr501_is_volatile_reg(struct device *dev, unsigned int reg)
 {
 	switch (reg) {
 	case LTR501_ALS_DATA1:
+	case LTR501_ALS_DATA1_UPPER:
 	case LTR501_ALS_DATA0:
+	case LTR501_ALS_DATA0_UPPER:
 	case LTR501_ALS_PS_STATUS:
 	case LTR501_PS_DATA:
+	case LTR501_PS_DATA_UPPER:
 		return true;
 	default:
 		return false;

commit e2326cefd2ed110a43a0903cfaa99333512cf420
Author: frank zago <frank@zago.net>
Date:   Mon Apr 26 21:20:17 2021 -0500

    iio: light: tcs3472: do not free unallocated IRQ
    
    commit 7cd04c863f9e1655d607705455e7714f24451984 upstream.
    
    Allocating an IRQ is conditional to the IRQ existence, but freeing it
    was not. If no IRQ was allocate, the driver would still try to free
    IRQ 0. Add the missing checks.
    
    This fixes the following trace when the driver is removed:
    
    [  100.667788] Trying to free already-free IRQ 0
    [  100.667793] WARNING: CPU: 0 PID: 2315 at kernel/irq/manage.c:1826 free_irq+0x1fd/0x370
    ...
    [  100.667914] Call Trace:
    [  100.667920]  tcs3472_remove+0x3a/0x90 [tcs3472]
    [  100.667927]  i2c_device_remove+0x2b/0xa0
    
    Signed-off-by: frank zago <frank@zago.net>
    Link: https://lore.kernel.org/r/20210427022017.19314-2-frank@zago.net
    Fixes: 9d2f715d592e ("iio: light: tcs3472: support out-of-threshold events")
    Cc: <Stable@vger.kernel.org>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iio/light/tcs3472.c b/drivers/iio/light/tcs3472.c
index e7923b514d7a..1995cc5cd732 100644
--- a/drivers/iio/light/tcs3472.c
+++ b/drivers/iio/light/tcs3472.c
@@ -535,7 +535,8 @@ static int tcs3472_probe(struct i2c_client *client,
 	return 0;
 
 free_irq:
-	free_irq(client->irq, indio_dev);
+	if (client->irq)
+		free_irq(client->irq, indio_dev);
 buffer_cleanup:
 	iio_triggered_buffer_cleanup(indio_dev);
 	return ret;
@@ -563,7 +564,8 @@ static int tcs3472_remove(struct i2c_client *client)
 	struct iio_dev *indio_dev = i2c_get_clientdata(client);
 
 	iio_device_unregister(indio_dev);
-	free_irq(client->irq, indio_dev);
+	if (client->irq)
+		free_irq(client->irq, indio_dev);
 	iio_triggered_buffer_cleanup(indio_dev);
 	tcs3472_powerdown(iio_priv(indio_dev));
 

commit 3f1aab2fa0c20a209618c2c6187d2362e828f3fc
Author: Martin Fuzzey <martin.fuzzey@flowbird.group>
Date:   Mon Jun 7 19:36:40 2021 +0200

    rtc: stm32: Fix unbalanced clk_disable_unprepare() on probe error path
    
    commit 950ac33dbe6ff656a623d862022f0762ec061ba7 upstream.
    
    The STM32MP1 RTC may have 2 clocks, the pclk and the rtc_ck.
    
    If clk_prepare_enable() fails for the second clock (rtc_ck) we must only
    call clk_disable_unprepare() for the first clock (pclk) but currently we
    call it on both leading to a WARN:
    
    [   15.629568] WARNING: CPU: 0 PID: 146 at drivers/clk/clk.c:958 clk_core_disable+0xb0/0xc8
    [   15.637620] ck_rtc already disabled
    [   15.663322] CPU: 0 PID: 146 Comm: systemd-udevd Not tainted 5.4.77-pknbsp-svn5759-atag-v5.4.77-204-gea4235203137-dirty #2413
    [   15.674510] Hardware name: STM32 (Device Tree Support)
    [   15.679658] [<c0111148>] (unwind_backtrace) from [<c010c0b8>] (show_stack+0x10/0x14)
    [   15.687371] [<c010c0b8>] (show_stack) from [<c0ab3d28>] (dump_stack+0xc0/0xe0)
    [   15.694574] [<c0ab3d28>] (dump_stack) from [<c012360c>] (__warn+0xc8/0xf0)
    [   15.701428] [<c012360c>] (__warn) from [<c0123694>] (warn_slowpath_fmt+0x60/0x94)
    [   15.708894] [<c0123694>] (warn_slowpath_fmt) from [<c053b518>] (clk_core_disable+0xb0/0xc8)
    [   15.717230] [<c053b518>] (clk_core_disable) from [<c053c190>] (clk_core_disable_lock+0x18/0x24)
    [   15.725924] [<c053c190>] (clk_core_disable_lock) from [<bf0adc44>] (stm32_rtc_probe+0x124/0x5e4 [rtc_stm32])
    [   15.735739] [<bf0adc44>] (stm32_rtc_probe [rtc_stm32]) from [<c05f7d4c>] (platform_drv_probe+0x48/0x98)
    [   15.745095] [<c05f7d4c>] (platform_drv_probe) from [<c05f5cec>] (really_probe+0x1f0/0x458)
    [   15.753338] [<c05f5cec>] (really_probe) from [<c05f61c4>] (driver_probe_device+0x70/0x1c4)
    [   15.761584] [<c05f61c4>] (driver_probe_device) from [<c05f6580>] (device_driver_attach+0x58/0x60)
    [   15.770439] [<c05f6580>] (device_driver_attach) from [<c05f6654>] (__driver_attach+0xcc/0x170)
    [   15.779032] [<c05f6654>] (__driver_attach) from [<c05f40d8>] (bus_for_each_dev+0x58/0x7c)
    [   15.787191] [<c05f40d8>] (bus_for_each_dev) from [<c05f4ffc>] (bus_add_driver+0xdc/0x1f8)
    [   15.795352] [<c05f4ffc>] (bus_add_driver) from [<c05f6ed8>] (driver_register+0x7c/0x110)
    [   15.803425] [<c05f6ed8>] (driver_register) from [<c01027bc>] (do_one_initcall+0x70/0x1b8)
    [   15.811588] [<c01027bc>] (do_one_initcall) from [<c01a1094>] (do_init_module+0x58/0x1f8)
    [   15.819660] [<c01a1094>] (do_init_module) from [<c01a0074>] (load_module+0x1e58/0x23c8)
    [   15.827646] [<c01a0074>] (load_module) from [<c01a0860>] (sys_finit_module+0xa0/0xd4)
    [   15.835459] [<c01a0860>] (sys_finit_module) from [<c01011e0>] (__sys_trace_return+0x0/0x20)
    
    Signed-off-by: Martin Fuzzey <martin.fuzzey@flowbird.group>
    Fixes: 4e64350f42e2 ("rtc: add STM32 RTC driver")
    Cc: stable@vger.kernel.org
    Reviewed-by: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
    Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
    Link: https://lore.kernel.org/r/1623087421-19722-1-git-send-email-martin.fuzzey@flowbird.group
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/rtc/rtc-stm32.c b/drivers/rtc/rtc-stm32.c
index 8e6c9b3bcc29..04bffc913ba1 100644
--- a/drivers/rtc/rtc-stm32.c
+++ b/drivers/rtc/rtc-stm32.c
@@ -760,7 +760,7 @@ static int stm32_rtc_probe(struct platform_device *pdev)
 
 	ret = clk_prepare_enable(rtc->rtc_ck);
 	if (ret)
-		goto err;
+		goto err_no_rtc_ck;
 
 	if (rtc->data->need_dbp)
 		regmap_update_bits(rtc->dbp, rtc->dbp_reg,
@@ -837,10 +837,12 @@ static int stm32_rtc_probe(struct platform_device *pdev)
 	}
 
 	return 0;
+
 err:
+	clk_disable_unprepare(rtc->rtc_ck);
+err_no_rtc_ck:
 	if (rtc->data->has_pclk)
 		clk_disable_unprepare(rtc->pclk);
-	clk_disable_unprepare(rtc->rtc_ck);
 
 	if (rtc->data->need_dbp)
 		regmap_update_bits(rtc->dbp, rtc->dbp_reg, rtc->dbp_mask, 0);

commit 050b80f9d3fddd3688be3c16c4f94397ae795826
Author: Vineeth Vijayan <vneethv@linux.ibm.com>
Date:   Wed Jun 9 09:21:08 2021 +0200

    s390/cio: dont call css_wait_for_slow_path() inside a lock
    
    commit c749d8c018daf5fba6dfac7b6c5c78b27efd7d65 upstream.
    
    Currently css_wait_for_slow_path() gets called inside the chp->lock.
    The path-verification-loop of slowpath inside this lock could lead to
    deadlock as reported by the lockdep validator.
    
    The ccw_device_get_chp_desc() during the instance of a device-set-online
    would try to acquire the same 'chp->lock' to read the chp->desc.
    The instance of this function can get called from multiple scenario,
    like probing or setting-device online manually. This could, in some
    corner-cases lead to the deadlock.
    
    lockdep validator reported this as,
    
            CPU0                    CPU1
            ----                    ----
       lock(&chp->lock);
                                    lock(kn->active#43);
                                    lock(&chp->lock);
       lock((wq_completion)cio);
    
    The chp->lock was introduced to serialize the access of struct
    channel_path. This lock is not needed for the css_wait_for_slow_path()
    function, so invoke the slow-path function outside this lock.
    
    Fixes: b730f3a93395 ("[S390] cio: add lock to struct channel_path")
    Cc: <stable@vger.kernel.org>
    Reviewed-by: Peter Oberparleiter <oberpar@linux.ibm.com>
    Signed-off-by: Vineeth Vijayan <vneethv@linux.ibm.com>
    Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/s390/cio/chp.c b/drivers/s390/cio/chp.c
index 51038ec309c1..1fd982b4d64b 100644
--- a/drivers/s390/cio/chp.c
+++ b/drivers/s390/cio/chp.c
@@ -255,6 +255,9 @@ static ssize_t chp_status_write(struct device *dev,
 	if (!num_args)
 		return count;
 
+	/* Wait until previous actions have settled. */
+	css_wait_for_slow_path();
+
 	if (!strncasecmp(cmd, "on", 2) || !strcmp(cmd, "1")) {
 		mutex_lock(&cp->lock);
 		error = s390_vary_chpid(cp->chpid, 1);
diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c
index a0baee25134c..3f03163c7a58 100644
--- a/drivers/s390/cio/chsc.c
+++ b/drivers/s390/cio/chsc.c
@@ -770,8 +770,6 @@ int chsc_chp_vary(struct chp_id chpid, int on)
 {
 	struct channel_path *chp = chpid_to_chp(chpid);
 
-	/* Wait until previous actions have settled. */
-	css_wait_for_slow_path();
 	/*
 	 * Redo PathVerification on the devices the chpid connects to
 	 */

commit ba124fdcd12bf471b6974fb3662e80c168634c93
Author: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>
Date:   Sat Jun 26 15:50:42 2021 +0800

    SUNRPC: Should wake up the privileged task firstly.
    
    commit 5483b904bf336948826594610af4c9bbb0d9e3aa upstream.
    
    When find a task from wait queue to wake up, a non-privileged task may
    be found out, rather than the privileged. This maybe lead a deadlock
    same as commit dfe1fe75e00e ("NFSv4: Fix deadlock between nfs4_evict_inode()
    and nfs4_opendata_get_inode()"):
    
    Privileged delegreturn task is queued to privileged list because all
    the slots are assigned. If there has no enough slot to wake up the
    non-privileged batch tasks(session less than 8 slot), then the privileged
    delegreturn task maybe lost waked up because the found out task can't
    get slot since the session is on draining.
    
    So we should treate the privileged task as the emergency task, and
    execute it as for as we can.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Fixes: 5fcdfacc01f3 ("NFSv4: Return delegations synchronously in evict_inode")
    Cc: stable@vger.kernel.org
    Signed-off-by: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c
index 35a707e59d9d..e339f8da1b0a 100644
--- a/net/sunrpc/sched.c
+++ b/net/sunrpc/sched.c
@@ -498,6 +498,15 @@ static struct rpc_task *__rpc_find_next_queued_priority(struct rpc_wait_queue *q
 	struct list_head *q;
 	struct rpc_task *task;
 
+	/*
+	 * Service the privileged queue.
+	 */
+	q = &queue->tasks[RPC_NR_PRIORITY - 1];
+	if (queue->maxpriority > RPC_PRIORITY_PRIVILEGED && !list_empty(q)) {
+		task = list_first_entry(q, struct rpc_task, u.tk_wait.list);
+		goto out;
+	}
+
 	/*
 	 * Service a batch of tasks from a single owner.
 	 */

commit acc7947439436ce78d37c906d9f27d2d886d4308
Author: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>
Date:   Sat Jun 26 15:50:41 2021 +0800

    SUNRPC: Fix the batch tasks count wraparound.
    
    commit fcb170a9d825d7db4a3fb870b0300f5a40a8d096 upstream.
    
    The 'queue->nr' will wraparound from 0 to 255 when only current
    priority queue has tasks. This maybe lead a deadlock same as commit
    dfe1fe75e00e ("NFSv4: Fix deadlock between nfs4_evict_inode()
    and nfs4_opendata_get_inode()"):
    
    Privileged delegreturn task is queued to privileged list because all
    the slots are assigned. When non-privileged task complete and release
    the slot, a non-privileged maybe picked out. It maybe allocate slot
    failed when the session on draining.
    
    If the 'queue->nr' has wraparound to 255, and no enough slot to
    service it, then the privileged delegreturn will lost to wake up.
    
    So we should avoid the wraparound on 'queue->nr'.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Fixes: 5fcdfacc01f3 ("NFSv4: Return delegations synchronously in evict_inode")
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: stable@vger.kernel.org
    Signed-off-by: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c
index e2808586c9e6..35a707e59d9d 100644
--- a/net/sunrpc/sched.c
+++ b/net/sunrpc/sched.c
@@ -502,7 +502,8 @@ static struct rpc_task *__rpc_find_next_queued_priority(struct rpc_wait_queue *q
 	 * Service a batch of tasks from a single owner.
 	 */
 	q = &queue->tasks[queue->priority];
-	if (!list_empty(q) && --queue->nr) {
+	if (!list_empty(q) && queue->nr) {
+		queue->nr--;
 		task = list_first_entry(q, struct rpc_task, u.tk_wait.list);
 		goto out;
 	}

commit c38e5045af01dfe6a244b3d042aa7d38b0db2f6e
Author: Stephane Grosjean <s.grosjean@peak-system.com>
Date:   Wed Jun 23 16:26:00 2021 +0200

    can: peak_pciefd: pucan_handle_status(): fix a potential starvation issue in TX path
    
    commit b17233d385d0b6b43ecf81d43008cb1bbb008166 upstream.
    
    Rather than just indicating that transmission can start, this patch
    requires the explicit flushing of the network TX queue when the driver
    is informed by the device that it can transmit, next to its
    configuration.
    
    In this way, if frames have already been written by the application,
    they will actually be transmitted.
    
    Fixes: ffd137f7043c ("can: peak/pcie_fd: remove useless code when interface starts")
    Link: https://lore.kernel.org/r/20210623142600.149904-1-s.grosjean@peak-system.com
    Cc: linux-stable <stable@vger.kernel.org>
    Signed-off-by: Stephane Grosjean <s.grosjean@peak-system.com>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/can/peak_canfd/peak_canfd.c b/drivers/net/can/peak_canfd/peak_canfd.c
index 4bc5d522c74b..2d73667ea259 100644
--- a/drivers/net/can/peak_canfd/peak_canfd.c
+++ b/drivers/net/can/peak_canfd/peak_canfd.c
@@ -346,8 +346,8 @@ static int pucan_handle_status(struct peak_canfd_priv *priv,
 				return err;
 		}
 
-		/* start network queue (echo_skb array is empty) */
-		netif_start_queue(ndev);
+		/* wake network queue up (echo_skb array is empty) */
+		netif_wake_queue(ndev);
 
 		return 0;
 	}

commit 2ca519986d38096597556b03674f8c75ff859669
Author: Oliver Hartkopp <socketcan@hartkopp.net>
Date:   Fri Jun 18 19:36:45 2021 +0200

    can: gw: synchronize rcu operations before removing gw job entry
    
    commit fb8696ab14adadb2e3f6c17c18ed26b3ecd96691 upstream.
    
    can_can_gw_rcv() is called under RCU protection, so after calling
    can_rx_unregister(), we have to call synchronize_rcu in order to wait
    for any RCU read-side critical sections to finish before removing the
    kmem_cache entry with the referenced gw job entry.
    
    Link: https://lore.kernel.org/r/20210618173645.2238-1-socketcan@hartkopp.net
    Fixes: c1aabdf379bc ("can-gw: add netlink based CAN routing")
    Cc: linux-stable <stable@vger.kernel.org>
    Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/can/gw.c b/net/can/gw.c
index bd2161470e45..9c2066323529 100644
--- a/net/can/gw.c
+++ b/net/can/gw.c
@@ -494,6 +494,7 @@ static int cgw_notifier(struct notifier_block *nb,
 			if (gwj->src.dev == dev || gwj->dst.dev == dev) {
 				hlist_del(&gwj->list);
 				cgw_unregister_filter(net, gwj);
+				synchronize_rcu();
 				kmem_cache_free(cgw_cache, gwj);
 			}
 		}
@@ -941,6 +942,7 @@ static void cgw_remove_all_jobs(struct net *net)
 	hlist_for_each_entry_safe(gwj, nx, &net->can.cgw_list, list) {
 		hlist_del(&gwj->list);
 		cgw_unregister_filter(net, gwj);
+		synchronize_rcu();
 		kmem_cache_free(cgw_cache, gwj);
 	}
 }
@@ -1010,6 +1012,7 @@ static int cgw_remove_job(struct sk_buff *skb, struct nlmsghdr *nlh,
 
 		hlist_del(&gwj->list);
 		cgw_unregister_filter(net, gwj);
+		synchronize_rcu();
 		kmem_cache_free(cgw_cache, gwj);
 		err = 0;
 		break;

commit eabe65197876e4a0906eab784f5766c4c76098c7
Author: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
Date:   Sat Jun 19 13:18:13 2021 -0300

    can: bcm: delay release of struct bcm_op after synchronize_rcu()
    
    commit d5f9023fa61ee8b94f37a93f08e94b136cf1e463 upstream.
    
    can_rx_register() callbacks may be called concurrently to the call to
    can_rx_unregister(). The callbacks and callback data, though, are
    protected by RCU and the struct sock reference count.
    
    So the callback data is really attached to the life of sk, meaning
    that it should be released on sk_destruct. However, bcm_remove_op()
    calls tasklet_kill(), and RCU callbacks may be called under RCU
    softirq, so that cannot be used on kernels before the introduction of
    HRTIMER_MODE_SOFT.
    
    However, bcm_rx_handler() is called under RCU protection, so after
    calling can_rx_unregister(), we may call synchronize_rcu() in order to
    wait for any RCU read-side critical sections to finish. That is,
    bcm_rx_handler() won't be called anymore for those ops. So, we only
    free them, after we do that synchronize_rcu().
    
    Fixes: ffd980f976e7 ("[CAN]: Add broadcast manager (bcm) protocol")
    Link: https://lore.kernel.org/r/20210619161813.2098382-1-cascardo@canonical.com
    Cc: linux-stable <stable@vger.kernel.org>
    Reported-by: syzbot+0f7e7e5e2f4f40fa89c0@syzkaller.appspotmail.com
    Reported-by: Norbert Slusarek <nslusarek@gmx.net>
    Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
    Acked-by: Oliver Hartkopp <socketcan@hartkopp.net>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/can/bcm.c b/net/can/bcm.c
index 9f30d7b4389a..e75d3fd7da4f 100644
--- a/net/can/bcm.c
+++ b/net/can/bcm.c
@@ -828,6 +828,7 @@ static int bcm_delete_rx_op(struct list_head *ops, struct bcm_msg_head *mh,
 						  bcm_rx_handler, op);
 
 			list_del(&op->list);
+			synchronize_rcu();
 			bcm_remove_op(op);
 			return 1; /* done */
 		}
@@ -1584,9 +1585,13 @@ static int bcm_release(struct socket *sock)
 					  REGMASK(op->can_id),
 					  bcm_rx_handler, op);
 
-		bcm_remove_op(op);
 	}
 
+	synchronize_rcu();
+
+	list_for_each_entry_safe(op, next, &bo->rx_ops, list)
+		bcm_remove_op(op);
+
 #if IS_ENABLED(CONFIG_PROC_FS)
 	/* remove procfs entry */
 	if (net->can.bcmproc_dir && bo->bcm_proc_read)

commit 80f566c013ba357bc6e14fc2c55d2793e494d07c
Author: Stephen Brennan <stephen.s.brennan@oracle.com>
Date:   Wed Jun 23 16:21:14 2021 -0700

    ext4: use ext4_grp_locked_error in mb_find_extent
    
    commit cd84bbbac12a173a381a64c6ec8b76a5277b87b5 upstream.
    
    Commit 5d1b1b3f492f ("ext4: fix BUG when calling ext4_error with locked
    block group") introduces ext4_grp_locked_error to handle unlocking a
    group in error cases. Otherwise, there is a possibility of a sleep while
    atomic. However, since 43c73221b3b1 ("ext4: replace BUG_ON with WARN_ON
    in mb_find_extent()"), mb_find_extent() has contained a ext4_error()
    call while a group spinlock is held. Replace this with
    ext4_grp_locked_error.
    
    Fixes: 43c73221b3b1 ("ext4: replace BUG_ON with WARN_ON in mb_find_extent()")
    Cc: <stable@vger.kernel.org> # 4.14+
    Signed-off-by: Stephen Brennan <stephen.s.brennan@oracle.com>
    Reviewed-by: Lukas Czerner <lczerner@redhat.com>
    Reviewed-by: Junxiao Bi <junxiao.bi@oracle.com>
    Link: https://lore.kernel.org/r/20210623232114.34457-1-stephen.s.brennan@oracle.com
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
index db47a06cfb74..447aa17c804e 100644
--- a/fs/ext4/mballoc.c
+++ b/fs/ext4/mballoc.c
@@ -1542,10 +1542,11 @@ static int mb_find_extent(struct ext4_buddy *e4b, int block,
 	if (ex->fe_start + ex->fe_len > EXT4_CLUSTERS_PER_GROUP(e4b->bd_sb)) {
 		/* Should never happen! (but apparently sometimes does?!?) */
 		WARN_ON(1);
-		ext4_error(e4b->bd_sb, "corruption or bug in mb_find_extent "
-			   "block=%d, order=%d needed=%d ex=%u/%d/%d@%u",
-			   block, order, needed, ex->fe_group, ex->fe_start,
-			   ex->fe_len, ex->fe_logical);
+		ext4_grp_locked_error(e4b->bd_sb, e4b->bd_group, 0, 0,
+			"corruption or bug in mb_find_extent "
+			"block=%d, order=%d needed=%d ex=%u/%d/%d@%u",
+			block, order, needed, ex->fe_group, ex->fe_start,
+			ex->fe_len, ex->fe_logical);
 		ex->fe_len = 0;
 		ex->fe_start = 0;
 		ex->fe_group = 0;

commit fdb1e064f2cc38f99e4ccf6890f03b1ae3c52729
Author: Pan Dong <pandong.peter@bytedance.com>
Date:   Tue May 25 15:36:56 2021 +0800

    ext4: fix avefreec in find_group_orlov
    
    commit c89849cc0259f3d33624cc3bd127685c3c0fa25d upstream.
    
    The avefreec should be average free clusters instead
    of average free blocks, otherwize Orlov's allocator
    will not work properly when bigalloc enabled.
    
    Cc: stable@kernel.org
    Signed-off-by: Pan Dong <pandong.peter@bytedance.com>
    Link: https://lore.kernel.org/r/20210525073656.31594-1-pandong.peter@bytedance.com
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
index 16abe23b1417..5cb19fdf6450 100644
--- a/fs/ext4/ialloc.c
+++ b/fs/ext4/ialloc.c
@@ -399,7 +399,7 @@ static void get_orlov_stats(struct super_block *sb, ext4_group_t g,
  *
  * We always try to spread first-level directories.
  *
- * If there are blockgroups with both free inodes and free blocks counts
+ * If there are blockgroups with both free inodes and free clusters counts
  * not worse than average we return one with smallest directory count.
  * Otherwise we simply return a random group.
  *
@@ -408,7 +408,7 @@ static void get_orlov_stats(struct super_block *sb, ext4_group_t g,
  * It's OK to put directory into a group unless
  * it has too many directories already (max_dirs) or
  * it has too few free inodes left (min_inodes) or
- * it has too few free blocks left (min_blocks) or
+ * it has too few free clusters left (min_clusters) or
  * Parent's group is preferred, if it doesn't satisfy these
  * conditions we search cyclically through the rest. If none
  * of the groups look good we just look for a group with more
@@ -424,7 +424,7 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent,
 	ext4_group_t real_ngroups = ext4_get_groups_count(sb);
 	int inodes_per_group = EXT4_INODES_PER_GROUP(sb);
 	unsigned int freei, avefreei, grp_free;
-	ext4_fsblk_t freeb, avefreec;
+	ext4_fsblk_t freec, avefreec;
 	unsigned int ndirs;
 	int max_dirs, min_inodes;
 	ext4_grpblk_t min_clusters;
@@ -443,9 +443,8 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent,
 
 	freei = percpu_counter_read_positive(&sbi->s_freeinodes_counter);
 	avefreei = freei / ngroups;
-	freeb = EXT4_C2B(sbi,
-		percpu_counter_read_positive(&sbi->s_freeclusters_counter));
-	avefreec = freeb;
+	freec = percpu_counter_read_positive(&sbi->s_freeclusters_counter);
+	avefreec = freec;
 	do_div(avefreec, ngroups);
 	ndirs = percpu_counter_read_positive(&sbi->s_dirs_counter);
 

commit cc0458bcd213f544edefe8b38d6ef23eedd568ee
Author: Zhang Yi <yi.zhang@huawei.com>
Date:   Sat May 22 18:30:44 2021 +0800

    ext4: remove check for zero nr_to_scan in ext4_es_scan()
    
    commit e5e7010e5444d923e4091cafff61d05f2d19cada upstream.
    
    After converting fs shrinkers to new scan/count API, we are no longer
    pass zero nr_to_scan parameter to detect the number of objects to free,
    just remove this check.
    
    Fixes: 1ab6c4997e04 ("fs: convert fs shrinkers to new scan/count API")
    Cc: stable@vger.kernel.org # 3.12+
    Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
    Reviewed-by: Jan Kara <jack@suse.cz>
    Link: https://lore.kernel.org/r/20210522103045.690103-2-yi.zhang@huawei.com
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c
index ad3675cb640b..027c3e1b9f61 100644
--- a/fs/ext4/extents_status.c
+++ b/fs/ext4/extents_status.c
@@ -1080,9 +1080,6 @@ static unsigned long ext4_es_scan(struct shrinker *shrink,
 	ret = percpu_counter_read_positive(&sbi->s_es_stats.es_stats_shk_cnt);
 	trace_ext4_es_shrink_scan_enter(sbi->s_sb, nr_to_scan, ret);
 
-	if (!nr_to_scan)
-		return ret;
-
 	nr_shrunk = __es_shrink(sbi, nr_to_scan, NULL);
 
 	ret = percpu_counter_read_positive(&sbi->s_es_stats.es_stats_shk_cnt);

commit 2338dc5d32636d26d6a99e022ca0cb1dc6e37741
Author: Zhang Yi <yi.zhang@huawei.com>
Date:   Sat May 22 18:30:45 2021 +0800

    ext4: correct the cache_nr in tracepoint ext4_es_shrink_exit
    
    commit 4fb7c70a889ead2e91e184895ac6e5354b759135 upstream.
    
    The cache_cnt parameter of tracepoint ext4_es_shrink_exit means the
    remaining cache count after shrink, but now it is the cache count before
    shrink, fix it by read sbi->s_extent_cache_cnt again.
    
    Fixes: 1ab6c4997e04 ("fs: convert fs shrinkers to new scan/count API")
    Cc: stable@vger.kernel.org # 3.12+
    Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
    Reviewed-by: Jan Kara <jack@suse.cz>
    Link: https://lore.kernel.org/r/20210522103045.690103-3-yi.zhang@huawei.com
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c
index c4e6fb15101b..ad3675cb640b 100644
--- a/fs/ext4/extents_status.c
+++ b/fs/ext4/extents_status.c
@@ -1085,6 +1085,7 @@ static unsigned long ext4_es_scan(struct shrinker *shrink,
 
 	nr_shrunk = __es_shrink(sbi, nr_to_scan, NULL);
 
+	ret = percpu_counter_read_positive(&sbi->s_es_stats.es_stats_shk_cnt);
 	trace_ext4_es_shrink_scan_exit(sbi->s_sb, nr_shrunk, ret);
 	return nr_shrunk;
 }

commit 5485fe228f9771190de24f8936c43879fa52fc25
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Mon May 10 19:10:51 2021 +0800

    ext4: return error code when ext4_fill_flex_info() fails
    
    commit 8f6840c4fd1e7bd715e403074fb161c1a04cda73 upstream.
    
    After commit c89128a00838 ("ext4: handle errors on
    ext4_commit_super"), 'ret' may be set to 0 before calling
    ext4_fill_flex_info(), if ext4_fill_flex_info() fails ext4_mount()
    doesn't return error code, it makes 'root' is null which causes crash
    in legacy_get_tree().
    
    Fixes: c89128a00838 ("ext4: handle errors on ext4_commit_super")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Cc: <stable@vger.kernel.org> # v4.18+
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Link: https://lore.kernel.org/r/20210510111051.55650-1-yangyingliang@huawei.com
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index fe71ffecba68..9ae3b6dd72fe 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -4524,6 +4524,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
 			ext4_msg(sb, KERN_ERR,
 			       "unable to initialize "
 			       "flex_bg meta info!");
+			ret = -ENOMEM;
 			goto failed_mount6;
 		}
 

commit 9ed3a3d3a8d2cbe99d9e4386a98856491f0eade0
Author: Anirudh Rayabharam <mail@anirudhrb.com>
Date:   Fri May 7 00:26:54 2021 +0530

    ext4: fix kernel infoleak via ext4_extent_header
    
    commit ce3aba43599f0b50adbebff133df8d08a3d5fffe upstream.
    
    Initialize eh_generation of struct ext4_extent_header to prevent leaking
    info to userspace. Fixes KMSAN kernel-infoleak bug reported by syzbot at:
    http://syzkaller.appspot.com/bug?id=78e9ad0e6952a3ca16e8234724b2fa92d041b9b8
    
    Cc: stable@kernel.org
    Reported-by: syzbot+2dcfeaf8cb49b05e8f1a@syzkaller.appspotmail.com
    Fixes: a86c61812637 ("[PATCH] ext3: add extent map support")
    Signed-off-by: Anirudh Rayabharam <mail@anirudhrb.com>
    Link: https://lore.kernel.org/r/20210506185655.7118-1-mail@anirudhrb.com
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index 093cb675841b..2a45e0d3e593 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -858,6 +858,7 @@ int ext4_ext_tree_init(handle_t *handle, struct inode *inode)
 	eh->eh_entries = 0;
 	eh->eh_magic = EXT4_EXT_MAGIC;
 	eh->eh_max = cpu_to_le16(ext4_ext_space_root(inode, 0));
+	eh->eh_generation = 0;
 	ext4_mark_inode_dirty(handle, inode);
 	return 0;
 }
@@ -1114,6 +1115,7 @@ static int ext4_ext_split(handle_t *handle, struct inode *inode,
 	neh->eh_max = cpu_to_le16(ext4_ext_space_block(inode, 0));
 	neh->eh_magic = EXT4_EXT_MAGIC;
 	neh->eh_depth = 0;
+	neh->eh_generation = 0;
 
 	/* move remainder of path[depth] to the new leaf */
 	if (unlikely(path[depth].p_hdr->eh_entries !=
@@ -1191,6 +1193,7 @@ static int ext4_ext_split(handle_t *handle, struct inode *inode,
 		neh->eh_magic = EXT4_EXT_MAGIC;
 		neh->eh_max = cpu_to_le16(ext4_ext_space_block_idx(inode, 0));
 		neh->eh_depth = cpu_to_le16(depth - i);
+		neh->eh_generation = 0;
 		fidx = EXT_FIRST_INDEX(neh);
 		fidx->ei_block = border;
 		ext4_idx_store_pblock(fidx, oldblock);

commit 97df16a8fa4d19849a2b0cad0241dfdfc0acea4e
Author: Zhang Yi <yi.zhang@huawei.com>
Date:   Fri May 7 15:19:04 2021 +0800

    ext4: cleanup in-core orphan list if ext4_truncate() failed to get a transaction handle
    
    commit b9a037b7f3c401d3c63e0423e56aef606b1ffaaf upstream.
    
    In ext4_orphan_cleanup(), if ext4_truncate() failed to get a transaction
    handle, it didn't remove the inode from the in-core orphan list, which
    may probably trigger below error dump in ext4_destroy_inode() during the
    final iput() and could lead to memory corruption on the later orphan
    list changes.
    
     EXT4-fs (sda): Inode 6291467 (00000000b8247c67): orphan list check failed!
     00000000b8247c67: 0001f30a 00000004 00000000 00000023  ............#...
     00000000e24cde71: 00000006 014082a3 00000000 00000000  ......@.........
     0000000072c6a5ee: 00000000 00000000 00000000 00000000  ................
     ...
    
    This patch fix this by cleanup in-core orphan list manually if
    ext4_truncate() return error.
    
    Cc: stable@kernel.org
    Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
    Reviewed-by: Jan Kara <jack@suse.cz>
    Link: https://lore.kernel.org/r/20210507071904.160808-1-yi.zhang@huawei.com
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 535ab6713732..fe71ffecba68 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -2689,8 +2689,15 @@ static void ext4_orphan_cleanup(struct super_block *sb,
 			inode_lock(inode);
 			truncate_inode_pages(inode->i_mapping, inode->i_size);
 			ret = ext4_truncate(inode);
-			if (ret)
+			if (ret) {
+				/*
+				 * We need to clean up the in-core orphan list
+				 * manually if ext4_truncate() failed to get a
+				 * transaction handle.
+				 */
+				ext4_orphan_del(NULL, inode);
 				ext4_std_error(inode->i_sb, ret);
+			}
 			inode_unlock(inode);
 			nr_truncates++;
 		} else {

commit e00c01b74add2dfa6947c1cefc74760e560dbf55
Author: David Sterba <dsterba@suse.com>
Date:   Tue Jul 7 18:30:06 2020 +0200

    btrfs: clear defrag status of a root if starting transaction fails
    
    commit 6819703f5a365c95488b07066a8744841bf14231 upstream.
    
    The defrag loop processes leaves in batches and starting transaction for
    each. The whole defragmentation on a given root is protected by a bit
    but in case the transaction fails, the bit is not cleared
    
    In case the transaction fails the bit would prevent starting
    defragmentation again, so make sure it's cleared.
    
    CC: stable@vger.kernel.org # 4.4+
    Reviewed-by: Qu Wenruo <wqu@suse.com>
    Reviewed-by: Anand Jain <anand.jain@oracle.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
index 1b52c960682d..049535115c9d 100644
--- a/fs/btrfs/transaction.c
+++ b/fs/btrfs/transaction.c
@@ -1311,8 +1311,10 @@ int btrfs_defrag_root(struct btrfs_root *root)
 
 	while (1) {
 		trans = btrfs_start_transaction(root, 0);
-		if (IS_ERR(trans))
-			return PTR_ERR(trans);
+		if (IS_ERR(trans)) {
+			ret = PTR_ERR(trans);
+			break;
+		}
 
 		ret = btrfs_defrag_leaves(trans, root);
 

commit ce3986380a1084e78f0831610b8d587d57642e43
Author: Filipe Manana <fdmanana@suse.com>
Date:   Wed Jun 9 11:25:03 2021 +0100

    btrfs: send: fix invalid path for unlink operations after parent orphanization
    
    commit d8ac76cdd1755b21e8c008c28d0b7251c0b14986 upstream.
    
    During an incremental send operation, when processing the new references
    for the current inode, we might send an unlink operation for another inode
    that has a conflicting path and has more than one hard link. However this
    path was computed and cached before we processed previous new references
    for the current inode. We may have orphanized a directory of that path
    while processing a previous new reference, in which case the path will
    be invalid and cause the receiver process to fail.
    
    The following reproducer triggers the problem and explains how/why it
    happens in its comments:
    
      $ cat test-send-unlink.sh
      #!/bin/bash
    
      DEV=/dev/sdi
      MNT=/mnt/sdi
    
      mkfs.btrfs -f $DEV >/dev/null
      mount $DEV $MNT
    
      # Create our test files and directory. Inode 259 (file3) has two hard
      # links.
      touch $MNT/file1
      touch $MNT/file2
      touch $MNT/file3
    
      mkdir $MNT/A
      ln $MNT/file3 $MNT/A/hard_link
    
      # Filesystem looks like:
      #
      # .                                     (ino 256)
      # |----- file1                          (ino 257)
      # |----- file2                          (ino 258)
      # |----- file3                          (ino 259)
      # |----- A/                             (ino 260)
      #        |---- hard_link                (ino 259)
      #
    
      # Now create the base snapshot, which is going to be the parent snapshot
      # for a later incremental send.
      btrfs subvolume snapshot -r $MNT $MNT/snap1
      btrfs send -f /tmp/snap1.send $MNT/snap1
    
      # Move inode 257 into directory inode 260. This results in computing the
      # path for inode 260 as "/A" and caching it.
      mv $MNT/file1 $MNT/A/file1
    
      # Move inode 258 (file2) into directory inode 260, with a name of
      # "hard_link", moving first inode 259 away since it currently has that
      # location and name.
      mv $MNT/A/hard_link $MNT/tmp
      mv $MNT/file2 $MNT/A/hard_link
    
      # Now rename inode 260 to something else (B for example) and then create
      # a hard link for inode 258 that has the old name and location of inode
      # 260 ("/A").
      mv $MNT/A $MNT/B
      ln $MNT/B/hard_link $MNT/A
    
      # Filesystem now looks like:
      #
      # .                                     (ino 256)
      # |----- tmp                            (ino 259)
      # |----- file3                          (ino 259)
      # |----- B/                             (ino 260)
      # |      |---- file1                    (ino 257)
      # |      |---- hard_link                (ino 258)
      # |
      # |----- A                              (ino 258)
    
      # Create another snapshot of our subvolume and use it for an incremental
      # send.
      btrfs subvolume snapshot -r $MNT $MNT/snap2
      btrfs send -f /tmp/snap2.send -p $MNT/snap1 $MNT/snap2
    
      # Now unmount the filesystem, create a new one, mount it and try to
      # apply both send streams to recreate both snapshots.
      umount $DEV
    
      mkfs.btrfs -f $DEV >/dev/null
    
      mount $DEV $MNT
    
      # First add the first snapshot to the new filesystem by applying the
      # first send stream.
      btrfs receive -f /tmp/snap1.send $MNT
    
      # The incremental receive operation below used to fail with the
      # following error:
      #
      #    ERROR: unlink A/hard_link failed: No such file or directory
      #
      # This is because when send is processing inode 257, it generates the
      # path for inode 260 as "/A", since that inode is its parent in the send
      # snapshot, and caches that path.
      #
      # Later when processing inode 258, it first processes its new reference
      # that has the path of "/A", which results in orphanizing inode 260
      # because there is a a path collision. This results in issuing a rename
      # operation from "/A" to "/o260-6-0".
      #
      # Finally when processing the new reference "B/hard_link" for inode 258,
      # it notices that it collides with inode 259 (not yet processed, because
      # it has a higher inode number), since that inode has the name
      # "hard_link" under the directory inode 260. It also checks that inode
      # 259 has two hardlinks, so it decides to issue a unlink operation for
      # the name "hard_link" for inode 259. However the path passed to the
      # unlink operation is "/A/hard_link", which is incorrect since currently
      # "/A" does not exists, due to the orphanization of inode 260 mentioned
      # before. The path is incorrect because it was computed and cached
      # before the orphanization. This results in the receiver to fail with
      # the above error.
      btrfs receive -f /tmp/snap2.send $MNT
    
      umount $MNT
    
    When running the test, it fails like this:
    
      $ ./test-send-unlink.sh
      Create a readonly snapshot of '/mnt/sdi' in '/mnt/sdi/snap1'
      At subvol /mnt/sdi/snap1
      Create a readonly snapshot of '/mnt/sdi' in '/mnt/sdi/snap2'
      At subvol /mnt/sdi/snap2
      At subvol snap1
      At snapshot snap2
      ERROR: unlink A/hard_link failed: No such file or directory
    
    Fix this by recomputing a path before issuing an unlink operation when
    processing the new references for the current inode if we previously
    have orphanized a directory.
    
    A test case for fstests will follow soon.
    
    CC: stable@vger.kernel.org # 4.4+
    Signed-off-by: Filipe Manana <fdmanana@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c
index 128398dde081..1967d5fa681a 100644
--- a/fs/btrfs/send.c
+++ b/fs/btrfs/send.c
@@ -4081,6 +4081,17 @@ static int process_recorded_refs(struct send_ctx *sctx, int *pending_move)
 				if (ret < 0)
 					goto out;
 			} else {
+				/*
+				 * If we previously orphanized a directory that
+				 * collided with a new reference that we already
+				 * processed, recompute the current path because
+				 * that directory may be part of the path.
+				 */
+				if (orphanized_dir) {
+					ret = refresh_ref_path(sctx, cur);
+					if (ret < 0)
+						goto out;
+				}
 				ret = send_unlink(sctx, cur->full_path);
 				if (ret < 0)
 					goto out;

commit fe0c1aa932321556442e1647f617170ff03e48e9
Author: Ludovic Desroches <ludovic.desroches@microchip.com>
Date:   Fri Oct 25 10:42:10 2019 +0200

    ARM: dts: at91: sama5d4: fix pinctrl muxing
    
    commit 253adffb0e98eaf6da2e7cf73ae68695e21f2f3c upstream.
    
    Fix pinctrl muxing, PD28, PD29 and PD31 can be muxed to peripheral A. It
    allows to use SCK0, SCK1 and SPI0_NPCS2 signals.
    
    Signed-off-by: Ludovic Desroches <ludovic.desroches@microchip.com>
    Fixes: 679f8d92bb01 ("ARM: at91/dt: sama5d4: add pioD pin mux mask and enable pioD")
    Cc: stable@vger.kernel.org # v4.4+
    Reviewed-by: Claudiu Beznea <claudiu.beznea@microchip.com>
    Signed-off-by: Nicolas Ferre <nicolas.ferre@microchip.com>
    Link: https://lore.kernel.org/r/20191025084210.14726-1-ludovic.desroches@microchip.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/boot/dts/sama5d4.dtsi b/arch/arm/boot/dts/sama5d4.dtsi
index 92a35a1942b6..1f1d5c0559c1 100644
--- a/arch/arm/boot/dts/sama5d4.dtsi
+++ b/arch/arm/boot/dts/sama5d4.dtsi
@@ -1388,7 +1388,7 @@
 					0xffffffff 0x3ffcfe7c 0x1c010101	/* pioA */
 					0x7fffffff 0xfffccc3a 0x3f00cc3a	/* pioB */
 					0xffffffff 0x3ff83fff 0xff00ffff	/* pioC */
-					0x0003ff00 0x8002a800 0x00000000	/* pioD */
+					0xb003ff00 0x8002a800 0x00000000	/* pioD */
 					0xffffffff 0x7fffffff 0x76fff1bf	/* pioE */
 					>;
 

commit 90639a0e19a916de955bdab3c56d7eda668b32ae
Author: Yang Jihong <yangjihong1@huawei.com>
Date:   Fri Apr 30 09:26:59 2021 +0800

    arm_pmu: Fix write counter incorrect in ARMv7 big-endian mode
    
    commit fdbef8c4e68ad423416aa6cc93d1616d6f8ac5b3 upstream.
    
    Commit 3a95200d3f89 ("arm_pmu: Change API to support 64bit counter values")
    changes the input "value" type from 32-bit to 64-bit, which introduces the
    following problem: ARMv7 PMU counters is 32-bit width, in big-endian mode,
    write counter uses high 32-bit, which writes an incorrect value.
    
    Before:
    
     Performance counter stats for 'ls':
    
                  2.22 msec task-clock                #    0.675 CPUs utilized
                     0      context-switches          #    0.000 K/sec
                     0      cpu-migrations            #    0.000 K/sec
                    49      page-faults               #    0.022 M/sec
            2150476593      cycles                    #  966.663 GHz
            2148588788      instructions              #    1.00  insn per cycle
            2147745484      branches                  # 965435.074 M/sec
            2147508540      branch-misses             #   99.99% of all branches
    
    None of the above hw event counters are correct.
    
    Solution:
    
    "value" forcibly converted to 32-bit type before being written to PMU register.
    
    After:
    
     Performance counter stats for 'ls':
    
                  2.09 msec task-clock                #    0.681 CPUs utilized
                     0      context-switches          #    0.000 K/sec
                     0      cpu-migrations            #    0.000 K/sec
                    46      page-faults               #    0.022 M/sec
               2807301      cycles                    #    1.344 GHz
               1060159      instructions              #    0.38  insn per cycle
                250496      branches                  #  119.914 M/sec
                 23192      branch-misses             #    9.26% of all branches
    
    Fixes: 3a95200d3f89 ("arm_pmu: Change API to support 64bit counter values")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Yang Jihong <yangjihong1@huawei.com>
    Acked-by: Mark Rutland <mark.rutland@arm.com>
    Link: https://lore.kernel.org/r/20210430012659.232110-1-yangjihong1@huawei.com
    Signed-off-by: Will Deacon <will@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c
index a4fb0f8b8f84..443f7aed29f7 100644
--- a/arch/arm/kernel/perf_event_v7.c
+++ b/arch/arm/kernel/perf_event_v7.c
@@ -773,10 +773,10 @@ static inline void armv7pmu_write_counter(struct perf_event *event, u64 value)
 		pr_err("CPU%u writing wrong counter %d\n",
 			smp_processor_id(), idx);
 	} else if (idx == ARMV7_IDX_CYCLE_COUNTER) {
-		asm volatile("mcr p15, 0, %0, c9, c13, 0" : : "r" (value));
+		asm volatile("mcr p15, 0, %0, c9, c13, 0" : : "r" ((u32)value));
 	} else {
 		armv7_pmnc_select_counter(idx);
-		asm volatile("mcr p15, 0, %0, c9, c13, 2" : : "r" (value));
+		asm volatile("mcr p15, 0, %0, c9, c13, 2" : : "r" ((u32)value));
 	}
 }
 

commit b62ce8e3f7fbd81ea7c9341ac5e0d445f685f6af
Author: Alexander Larkin <avlarkin82@gmail.com>
Date:   Sun Jul 4 22:39:36 2021 -0700

    Input: joydev - prevent use of not validated data in JSIOCSBTNMAP ioctl
    
    commit f8f84af5da9ee04ef1d271528656dac42a090d00 upstream.
    
    Even though we validate user-provided inputs we then traverse past
    validated data when applying the new map. The issue was originally
    discovered by Murray McAllister with this simple POC (if the following
    is executed by an unprivileged user it will instantly panic the system):
    
    int main(void) {
            int fd, ret;
            unsigned int buffer[10000];
    
            fd = open("/dev/input/js0", O_RDONLY);
            if (fd == -1)
                    printf("Error opening file\n");
    
            ret = ioctl(fd, JSIOCSBTNMAP & ~IOCSIZE_MASK, &buffer);
            printf("%d\n", ret);
    }
    
    The solution is to traverse internal buffer which is guaranteed to only
    contain valid date when constructing the map.
    
    Fixes: 182d679b2298 ("Input: joydev - prevent potential read overflow in ioctl")
    Fixes: 999b874f4aa3 ("Input: joydev - validate axis/button maps before clobbering current ones")
    Reported-by: Murray McAllister <murray.mcallister@gmail.com>
    Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Alexander Larkin <avlarkin82@gmail.com>
    Link: https://lore.kernel.org/r/20210620120030.1513655-1-avlarkin82@gmail.com
    Cc: stable@vger.kernel.org
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/input/joydev.c b/drivers/input/joydev.c
index 7ef6e1c165e3..9123799365e6 100644
--- a/drivers/input/joydev.c
+++ b/drivers/input/joydev.c
@@ -504,7 +504,7 @@ static int joydev_handle_JSIOCSBTNMAP(struct joydev *joydev,
 	memcpy(joydev->keypam, keypam, len);
 
 	for (i = 0; i < joydev->nkey; i++)
-		joydev->keymap[keypam[i] - BTN_MISC] = i;
+		joydev->keymap[joydev->keypam[i] - BTN_MISC] = i;
 
  out:
 	kfree(keypam);

commit faf8ab4355ec527f7fd1a4bab8c66f596c8490a8
Author: Al Viro <viro@zeniv.linux.org.uk>
Date:   Wed Jun 2 14:48:21 2021 -0400

    iov_iter_fault_in_readable() should do nothing in xarray case
    
    commit 0e8f0d67401589a141950856902c7d0ec8d9c985 upstream.
    
    ... and actually should just check it's given an iovec-backed iterator
    in the first place.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/lib/iov_iter.c b/lib/iov_iter.c
index acd7b97c16f2..39e6e978029c 100644
--- a/lib/iov_iter.c
+++ b/lib/iov_iter.c
@@ -417,7 +417,7 @@ int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes)
 	int err;
 	struct iovec v;
 
-	if (!(i->type & (ITER_BVEC|ITER_KVEC))) {
+	if (iter_is_iovec(i)) {
 		iterate_iovec(i, bytes, v, iov, skip, ({
 			err = fault_in_pages_readable(v.iov_base, v.iov_len);
 			if (unlikely(err))

commit 00f00f5db888e9f8dfaaa2e6b8d6cf5a6c28753b
Author: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
Date:   Mon Jun 28 19:33:52 2021 -0700

    ntfs: fix validity check for file name attribute
    
    commit d98e4d95411bbde2220a7afa38dcc9c14d71acbe upstream.
    
    When checking the file name attribute, we want to ensure that it fits
    within the bounds of ATTR_RECORD.  To do this, we should check that (attr
    record + file name offset + file name length) < (attr record + attr record
    length).
    
    However, the original check did not include the file name offset in the
    calculation.  This means that corrupted on-disk metadata might not caught
    by the incorrect file name check, and lead to an invalid memory access.
    
    An example can be seen in the crash report of a memory corruption error
    found by Syzbot:
    https://syzkaller.appspot.com/bug?id=a1a1e379b225812688566745c3e2f7242bffc246
    
    Adding the file name offset to the validity check fixes this error and
    passes the Syzbot reproducer test.
    
    Link: https://lkml.kernel.org/r/20210614050540.289494-1-desmondcheongzx@gmail.com
    Signed-off-by: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
    Reported-by: syzbot+213ac8bb98f7f4420840@syzkaller.appspotmail.com
    Tested-by: syzbot+213ac8bb98f7f4420840@syzkaller.appspotmail.com
    Acked-by: Anton Altaparmakov <anton@tuxera.com>
    Cc: Shuah Khan <skhan@linuxfoundation.org>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c
index a2fb866ff76e..e844b43f2eac 100644
--- a/fs/ntfs/inode.c
+++ b/fs/ntfs/inode.c
@@ -502,7 +502,7 @@ static int ntfs_is_extended_system_file(ntfs_attr_search_ctx *ctx)
 		}
 		file_name_attr = (FILE_NAME_ATTR*)((u8*)attr +
 				le16_to_cpu(attr->data.resident.value_offset));
-		p2 = (u8*)attr + le32_to_cpu(attr->data.resident.value_length);
+		p2 = (u8 *)file_name_attr + le32_to_cpu(attr->data.resident.value_length);
 		if (p2 < (u8*)attr || p2 > p)
 			goto err_corrupt_attr;
 		/* This attribute is ok, but is it in the $Extend directory? */

commit 6f26f2e79dcc8b2698960cf73f38bf100c250ba8
Author: Zhangjiantao (Kirin, nanjing) <water.zhangjiantao@huawei.com>
Date:   Thu Jun 17 18:03:54 2021 +0300

    xhci: solve a double free problem while doing s4
    
    commit b31d9d6d7abbf6483b871b6370bc31c930d53f54 upstream.
    
    when system is doing s4, the process of xhci_resume may be as below:
    1?xhci_mem_cleanup
    2?xhci_init->xhci_mem_init->xhci_mem_cleanup(when memory is not enough).
    xhci_mem_cleanup will be executed twice when system is out of memory.
    xhci->port_caps is freed in xhci_mem_cleanup,but it isn't set to NULL.
    It will be freed twice when xhci_mem_cleanup is called the second time.
    
    We got following bug when system resumes from s4:
    
    kernel BUG at mm/slub.c:309!
    Internal error: Oops - BUG: 0 [#1] PREEMPT SMP
    CPU: 0 PID: 5929 Tainted: G S   W   5.4.96-arm64-desktop #1
    pc : __slab_free+0x5c/0x424
    lr : kfree+0x30c/0x32c
    
    Call trace:
     __slab_free+0x5c/0x424
     kfree+0x30c/0x32c
     xhci_mem_cleanup+0x394/0x3cc
     xhci_mem_init+0x9ac/0x1070
     xhci_init+0x8c/0x1d0
     xhci_resume+0x1cc/0x5fc
     xhci_plat_resume+0x64/0x70
     platform_pm_thaw+0x28/0x60
     dpm_run_callback+0x54/0x24c
     device_resume+0xd0/0x200
     async_resume+0x24/0x60
     async_run_entry_fn+0x44/0x110
     process_one_work+0x1f0/0x490
     worker_thread+0x5c/0x450
     kthread+0x158/0x160
     ret_from_fork+0x10/0x24
    
    Original patch that caused this issue was backported to 4.4 stable,
    so this should be backported to 4.4 stabe as well.
    
    Fixes: cf0ee7c60c89 ("xhci: Fix memory leak when caching protocol extended capability PSI tables - take 2")
    Cc: stable@vger.kernel.org # v4.4+
    Signed-off-by: Jiantao Zhang <water.zhangjiantao@huawei.com>
    Signed-off-by: Tao Xue <xuetao09@huawei.com>
    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Link: https://lore.kernel.org/r/20210617150354.1512157-5-mathias.nyman@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
index 2461be2a8748..fb47caf929de 100644
--- a/drivers/usb/host/xhci-mem.c
+++ b/drivers/usb/host/xhci-mem.c
@@ -1929,6 +1929,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
 	xhci->hw_ports = NULL;
 	xhci->rh_bw = NULL;
 	xhci->ext_caps = NULL;
+	xhci->port_caps = NULL;
 
 	xhci->page_size = 0;
 	xhci->page_shift = 0;

commit 9c7de678190ac6d48e51633584075d045901b580
Author: Jing Xiangfeng <jingxiangfeng@huawei.com>
Date:   Thu Jun 17 15:32:26 2021 +0800

    usb: typec: Add the missed altmode_id_remove() in typec_register_altmode()
    
    commit 03026197bb657d784220b040c6173267a0375741 upstream.
    
    typec_register_altmode() misses to call altmode_id_remove() in an error
    path. Add the missed function call to fix it.
    
    Fixes: 8a37d87d72f0 ("usb: typec: Bus type for alternate modes")
    Cc: stable <stable@vger.kernel.org>
    Acked-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
    Signed-off-by: Jing Xiangfeng <jingxiangfeng@huawei.com>
    Link: https://lore.kernel.org/r/20210617073226.47599-1-jingxiangfeng@huawei.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c
index 1916ee1600b4..8dae6ff2377c 100644
--- a/drivers/usb/typec/class.c
+++ b/drivers/usb/typec/class.c
@@ -481,8 +481,10 @@ typec_register_altmode(struct device *parent,
 	int ret;
 
 	alt = kzalloc(sizeof(*alt), GFP_KERNEL);
-	if (!alt)
+	if (!alt) {
+		altmode_id_remove(parent, id);
 		return ERR_PTR(-ENOMEM);
+	}
 
 	alt->adev.svid = desc->svid;
 	alt->adev.mode = desc->mode;

commit 309970bf56ed469eef1d59d20be5d37693845076
Author: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
Date:   Thu Jun 17 09:55:24 2021 -0700

    usb: dwc3: Fix debugfs creation flow
    
    commit 84524d1232ecca7cf8678e851b254f05cff4040a upstream.
    
    Creation EP's debugfs called earlier than debugfs folder for dwc3
    device created. As result EP's debugfs are created in '/sys/kernel/debug'
    instead of '/sys/kernel/debug/usb/dwc3.1.auto'.
    
    Moved dwc3_debugfs_init() function call before calling
    dwc3_core_init_mode() to allow create dwc3 debugfs parent before
    creating EP's debugfs's.
    
    Fixes: 8d396bb0a5b6 ("usb: dwc3: debugfs: Add and remove endpoint dirs dynamically")
    Cc: stable <stable@vger.kernel.org>
    Reviewed-by: Jack Pham <jackp@codeaurora.org>
    Signed-off-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
    Link: https://lore.kernel.org/r/01fafb5b2d8335e98e6eadbac61fc796bdf3ec1a.1623948457.git.Minas.Harutyunyan@synopsys.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index e223502eafca..87e38a753458 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -1495,17 +1495,18 @@ static int dwc3_probe(struct platform_device *pdev)
 	}
 
 	dwc3_check_params(dwc);
+	dwc3_debugfs_init(dwc);
 
 	ret = dwc3_core_init_mode(dwc);
 	if (ret)
 		goto err5;
 
-	dwc3_debugfs_init(dwc);
 	pm_runtime_put(dev);
 
 	return 0;
 
 err5:
+	dwc3_debugfs_exit(dwc);
 	dwc3_event_buffers_cleanup(dwc);
 
 	usb_phy_shutdown(dwc->usb2_phy);

commit c984eaeb01ce7c15d757b214ab90a7aabe4a72a8
Author: Hannu Hartikainen <hannu@hrtk.in>
Date:   Tue Jun 22 17:14:54 2021 +0300

    USB: cdc-acm: blacklist Heimann USB Appset device
    
    commit 4897807753e078655a78de39ed76044d784f3e63 upstream.
    
    The device (32a7:0000 Heimann Sensor GmbH USB appset demo) claims to be
    a CDC-ACM device in its descriptors but in fact is not. If it is run
    with echo disabled it returns garbled data, probably due to something
    that happens in the TTY layer. And when run with echo enabled (the
    default), it will mess up the calibration data of the sensor the first
    time any data is sent to the device.
    
    In short, I had a bad time after connecting the sensor and trying to get
    it to work. I hope blacklisting it in the cdc-acm driver will save
    someone else a bit of trouble.
    
    Signed-off-by: Hannu Hartikainen <hannu@hrtk.in>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210622141454.337948-1-hannu@hrtk.in
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index 738de8c9c354..371aae41ed65 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -2000,6 +2000,11 @@ static const struct usb_device_id acm_ids[] = {
 	.driver_info = IGNORE_DEVICE,
 	},
 
+	/* Exclude Heimann Sensor GmbH USB appset demo */
+	{ USB_DEVICE(0x32a7, 0x0000),
+	.driver_info = IGNORE_DEVICE,
+	},
+
 	/* control interfaces without any protocol set */
 	{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
 		USB_CDC_PROTO_NONE) },

commit d654be97e1b679616e3337b871a9ec8f31a88841
Author: Linyu Yuan <linyyuan@codeaurora.com>
Date:   Wed Jun 16 19:51:42 2021 +0800

    usb: gadget: eem: fix echo command packet response issue
    
    commit 4249d6fbc10fd997abdf8a1ea49c0389a0edf706 upstream.
    
    when receive eem echo command, it will send a response,
    but queue this response to the usb request which allocate
    from gadget device endpoint zero,
    and transmit the request to IN endpoint of eem interface.
    
    on dwc3 gadget, it will trigger following warning in function
    __dwc3_gadget_ep_queue(),
    
            if (WARN(req->dep != dep, "request %pK belongs to '%s'\n",
                                    &req->request, req->dep->name))
                    return -EINVAL;
    
    fix it by allocating a usb request from IN endpoint of eem interface,
    and transmit the usb request to same IN endpoint of eem interface.
    
    Signed-off-by: Linyu Yuan <linyyuan@codeaurora.com>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210616115142.34075-1-linyyuan@codeaurora.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/gadget/function/f_eem.c b/drivers/usb/gadget/function/f_eem.c
index bdd964ac9fa9..dbfaebec2488 100644
--- a/drivers/usb/gadget/function/f_eem.c
+++ b/drivers/usb/gadget/function/f_eem.c
@@ -30,6 +30,11 @@ struct f_eem {
 	u8				ctrl_id;
 };
 
+struct in_context {
+	struct sk_buff	*skb;
+	struct usb_ep	*ep;
+};
+
 static inline struct f_eem *func_to_eem(struct usb_function *f)
 {
 	return container_of(f, struct f_eem, port.func);
@@ -323,9 +328,12 @@ static int eem_bind(struct usb_configuration *c, struct usb_function *f)
 
 static void eem_cmd_complete(struct usb_ep *ep, struct usb_request *req)
 {
-	struct sk_buff *skb = (struct sk_buff *)req->context;
+	struct in_context *ctx = req->context;
 
-	dev_kfree_skb_any(skb);
+	dev_kfree_skb_any(ctx->skb);
+	kfree(req->buf);
+	usb_ep_free_request(ctx->ep, req);
+	kfree(ctx);
 }
 
 /*
@@ -413,7 +421,9 @@ static int eem_unwrap(struct gether *port,
 		 * b15:		bmType (0 == data, 1 == command)
 		 */
 		if (header & BIT(15)) {
-			struct usb_request	*req = cdev->req;
+			struct usb_request	*req;
+			struct in_context	*ctx;
+			struct usb_ep		*ep;
 			u16			bmEEMCmd;
 
 			/* EEM command packet format:
@@ -442,11 +452,36 @@ static int eem_unwrap(struct gether *port,
 				skb_trim(skb2, len);
 				put_unaligned_le16(BIT(15) | BIT(11) | len,
 							skb_push(skb2, 2));
+
+				ep = port->in_ep;
+				req = usb_ep_alloc_request(ep, GFP_ATOMIC);
+				if (!req) {
+					dev_kfree_skb_any(skb2);
+					goto next;
+				}
+
+				req->buf = kmalloc(skb2->len, GFP_KERNEL);
+				if (!req->buf) {
+					usb_ep_free_request(ep, req);
+					dev_kfree_skb_any(skb2);
+					goto next;
+				}
+
+				ctx = kmalloc(sizeof(*ctx), GFP_KERNEL);
+				if (!ctx) {
+					kfree(req->buf);
+					usb_ep_free_request(ep, req);
+					dev_kfree_skb_any(skb2);
+					goto next;
+				}
+				ctx->skb = skb2;
+				ctx->ep = ep;
+
 				skb_copy_bits(skb2, 0, req->buf, skb2->len);
 				req->length = skb2->len;
 				req->complete = eem_cmd_complete;
 				req->zero = 1;
-				req->context = skb2;
+				req->context = ctx;
 				if (usb_ep_queue(port->in_ep, req, GFP_ATOMIC))
 					DBG(cdev, "echo response queue fail\n");
 				break;

commit 16151f468e8a7122bca0ee92732bd9ed09735f49
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Thu Jun 17 21:51:30 2021 +0300

    net: can: ems_usb: fix use-after-free in ems_usb_disconnect()
    
    commit ab4a0b8fcb9a95c02909b62049811bd2e586aaa4 upstream.
    
    In ems_usb_disconnect() dev pointer, which is netdev private data, is
    used after free_candev() call:
    |       if (dev) {
    |               unregister_netdev(dev->netdev);
    |               free_candev(dev->netdev);
    |
    |               unlink_all_urbs(dev);
    |
    |               usb_free_urb(dev->intr_urb);
    |
    |               kfree(dev->intr_in_buffer);
    |               kfree(dev->tx_msg_buffer);
    |       }
    
    Fix it by simply moving free_candev() at the end of the block.
    
    Fail log:
    | BUG: KASAN: use-after-free in ems_usb_disconnect
    | Read of size 8 at addr ffff88804e041008 by task kworker/1:2/2895
    |
    | CPU: 1 PID: 2895 Comm: kworker/1:2 Not tainted 5.13.0-rc5+ #164
    | Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.14.0-0-g155821a-rebuilt.opensuse.4
    | Workqueue: usb_hub_wq hub_event
    | Call Trace:
    |     dump_stack (lib/dump_stack.c:122)
    |     print_address_description.constprop.0.cold (mm/kasan/report.c:234)
    |     kasan_report.cold (mm/kasan/report.c:420 mm/kasan/report.c:436)
    |     ems_usb_disconnect (drivers/net/can/usb/ems_usb.c:683 drivers/net/can/usb/ems_usb.c:1058)
    
    Fixes: 702171adeed3 ("ems_usb: Added support for EMS CPC-USB/ARM7 CAN/USB interface")
    Link: https://lore.kernel.org/r/20210617185130.5834-1-paskripkin@gmail.com
    Cc: linux-stable <stable@vger.kernel.org>
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/can/usb/ems_usb.c b/drivers/net/can/usb/ems_usb.c
index b7dfd4109d24..16b96f978aae 100644
--- a/drivers/net/can/usb/ems_usb.c
+++ b/drivers/net/can/usb/ems_usb.c
@@ -1065,7 +1065,6 @@ static void ems_usb_disconnect(struct usb_interface *intf)
 
 	if (dev) {
 		unregister_netdev(dev->netdev);
-		free_candev(dev->netdev);
 
 		unlink_all_urbs(dev);
 
@@ -1073,6 +1072,8 @@ static void ems_usb_disconnect(struct usb_interface *intf)
 
 		kfree(dev->intr_in_buffer);
 		kfree(dev->tx_msg_buffer);
+
+		free_candev(dev->netdev);
 	}
 }
 

commit bfa8fce9c16596643939bacdf72fa6a4dc84a706
Author: Johan Hovold <johan@kernel.org>
Date:   Mon May 24 10:02:59 2021 -0700

    Input: usbtouchscreen - fix control-request directions
    
    commit 41e81022a04a0294c55cfa7e366bc14b9634c66e upstream.
    
    The direction of the pipe argument must match the request-type direction
    bit or control requests may fail depending on the host-controller-driver
    implementation.
    
    Fix the four control requests which erroneously used usb_rcvctrlpipe().
    
    Fixes: 1d3e20236d7a ("[PATCH] USB: usbtouchscreen: unified USB touchscreen driver")
    Fixes: 24ced062a296 ("usbtouchscreen: add support for DMC TSC-10/25 devices")
    Fixes: 9e3b25837a20 ("Input: usbtouchscreen - add support for e2i touchscreen controller")
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Cc: stable@vger.kernel.org      # 2.6.17
    Link: https://lore.kernel.org/r/20210524092048.4443-1-johan@kernel.org
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c
index d939c1798518..3f556af80bc5 100644
--- a/drivers/input/touchscreen/usbtouchscreen.c
+++ b/drivers/input/touchscreen/usbtouchscreen.c
@@ -264,7 +264,7 @@ static int e2i_init(struct usbtouch_usb *usbtouch)
 	int ret;
 	struct usb_device *udev = interface_to_usbdev(usbtouch->interface);
 
-	ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
+	ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
 	                      0x01, 0x02, 0x0000, 0x0081,
 	                      NULL, 0, USB_CTRL_SET_TIMEOUT);
 
@@ -544,7 +544,7 @@ static int mtouch_init(struct usbtouch_usb *usbtouch)
 	if (ret)
 		return ret;
 
-	ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
+	ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
 	                      MTOUCHUSB_RESET,
 	                      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 	                      1, 0, NULL, 0, USB_CTRL_SET_TIMEOUT);
@@ -556,7 +556,7 @@ static int mtouch_init(struct usbtouch_usb *usbtouch)
 	msleep(150);
 
 	for (i = 0; i < 3; i++) {
-		ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
+		ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
 				      MTOUCHUSB_ASYNC_REPORT,
 				      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 				      1, 1, NULL, 0, USB_CTRL_SET_TIMEOUT);
@@ -735,7 +735,7 @@ static int dmc_tsc10_init(struct usbtouch_usb *usbtouch)
 	}
 
 	/* start sending data */
-	ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0),
+	ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
 	                      TSC10_CMD_DATA1,
 	                      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 	                      0, 0, NULL, 0, USB_CTRL_SET_TIMEOUT);

commit b39d5fee82017382474834bba6999dfd73944bb3
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Fri May 7 14:50:43 2021 +0200

    media: dvb-usb: fix wrong definition
    
    commit c680ed46e418e9c785d76cf44eb33bfd1e8cf3f6 upstream.
    
    syzbot reported WARNING in vmalloc. The problem
    was in zero size passed to vmalloc.
    
    The root case was in wrong cxusb_bluebird_lgz201_properties
    definition. adapter array has only 1 entry, but num_adapters was
    2.
    
    Call Trace:
     __vmalloc_node mm/vmalloc.c:2963 [inline]
     vmalloc+0x67/0x80 mm/vmalloc.c:2996
     dvb_dmx_init+0xe4/0xb90 drivers/media/dvb-core/dvb_demux.c:1251
     dvb_usb_adapter_dvb_init+0x564/0x860 drivers/media/usb/dvb-usb/dvb-usb-dvb.c:184
     dvb_usb_adapter_init drivers/media/usb/dvb-usb/dvb-usb-init.c:86 [inline]
     dvb_usb_init drivers/media/usb/dvb-usb/dvb-usb-init.c:184 [inline]
     dvb_usb_device_init.cold+0xc94/0x146e drivers/media/usb/dvb-usb/dvb-usb-init.c:308
     cxusb_probe+0x159/0x5e0 drivers/media/usb/dvb-usb/cxusb.c:1634
    
    Fixes: 4d43e13f723e ("V4L/DVB (4643): Multi-input patch for DVB-USB device")
    Cc: stable@vger.kernel.org
    Reported-by: syzbot+7336195c02c1bd2f64e1@syzkaller.appspotmail.com
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: Sean Young <sean@mess.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/media/usb/dvb-usb/cxusb.c b/drivers/media/usb/dvb-usb/cxusb.c
index 5400ec99986f..0c9f12d4ac28 100644
--- a/drivers/media/usb/dvb-usb/cxusb.c
+++ b/drivers/media/usb/dvb-usb/cxusb.c
@@ -1659,7 +1659,7 @@ static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties = {
 
 	.size_of_priv     = sizeof(struct cxusb_state),
 
-	.num_adapters = 2,
+	.num_adapters = 1,
 	.adapter = {
 		{
 		.num_frontends = 1,

commit becc612df69efcde7a0236ea2b3297134224bc38
Author: Takashi Iwai <tiwai@suse.de>
Date:   Tue Jun 22 11:06:47 2021 +0200

    ALSA: usb-audio: Fix OOB access at proc output
    
    commit 362372ceb6556f338e230f2d90af27b47f82365a upstream.
    
    At extending the available mixer values for 32bit types, we forgot to
    add the corresponding entries for the format dump in the proc output.
    This may result in OOB access.  Here adds the missing entries.
    
    Fixes: bc18e31c3042 ("ALSA: usb-audio: Fix parameter block size for UAC2 control requests")
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210622090647.14021-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
index 4ad6eeb43476..6c8cdce8156b 100644
--- a/sound/usb/mixer.c
+++ b/sound/usb/mixer.c
@@ -3260,8 +3260,9 @@ static void snd_usb_mixer_dump_cval(struct snd_info_buffer *buffer,
 				    struct usb_mixer_elem_list *list)
 {
 	struct usb_mixer_elem_info *cval = mixer_elem_list_to_info(list);
-	static const char * const val_types[] = {"BOOLEAN", "INV_BOOLEAN",
-				    "S8", "U8", "S16", "U16"};
+	static const char * const val_types[] = {
+		"BOOLEAN", "INV_BOOLEAN", "S8", "U8", "S16", "U16", "S32", "U32",
+	};
 	snd_iprintf(buffer, "    Info: id=%i, control=%i, cmask=0x%x, "
 			    "channels=%i, type=\"%s\"\n", cval->head.id,
 			    cval->control, cval->cmask, cval->channels,

commit 007a59cb7502e2989bbd69c11e478260b759bceb
Author: Daehwan Jung <dh10.jung@samsung.com>
Date:   Wed Jun 16 18:34:55 2021 +0900

    ALSA: usb-audio: fix rate on Ozone Z90 USB headset
    
    commit aecc19ec404bdc745c781058ac97a373731c3089 upstream.
    
    It mislabels its 96 kHz altsetting and that's why it causes some noise
    
    Signed-off-by: Daehwan Jung <dh10.jung@samsung.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/1623836097-61918-1-git-send-email-dh10.jung@samsung.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/usb/format.c b/sound/usb/format.c
index a3daf93c565a..01ba7a939ac4 100644
--- a/sound/usb/format.c
+++ b/sound/usb/format.c
@@ -206,9 +206,11 @@ static int parse_audio_format_rates_v1(struct snd_usb_audio *chip, struct audiof
 				continue;
 			/* C-Media CM6501 mislabels its 96 kHz altsetting */
 			/* Terratec Aureon 7.1 USB C-Media 6206, too */
+			/* Ozone Z90 USB C-Media, too */
 			if (rate == 48000 && nr_rates == 1 &&
 			    (chip->usb_id == USB_ID(0x0d8c, 0x0201) ||
 			     chip->usb_id == USB_ID(0x0d8c, 0x0102) ||
+			     chip->usb_id == USB_ID(0x0d8c, 0x0078) ||
 			     chip->usb_id == USB_ID(0x0ccd, 0x00b1)) &&
 			    fp->altsetting == 5 && fp->maxpacksize == 392)
 				rate = 96000;

commit 04e385f5eb2dedb074fe8d5ac6befb7c6e8f1a9d
Author: Quat Le <quat.le@oracle.com>
Date:   Tue Jun 29 08:58:26 2021 -0700

    scsi: core: Retry I/O for Notify (Enable Spinup) Required error
    
    commit 104739aca4488909175e9e31d5cd7d75b82a2046 upstream.
    
    If the device is power-cycled, it takes time for the initiator to transmit
    the periodic NOTIFY (ENABLE SPINUP) SAS primitive, and for the device to
    respond to the primitive to become ACTIVE. Retry the I/O request to allow
    the device time to become ACTIVE.
    
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210629155826.48441-1-quat.le@oracle.com
    Reviewed-by: Bart Van Assche <bvanassche@acm.org>
    Signed-off-by: Quat Le <quat.le@oracle.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index fe5ae2b221c1..0191708c9dd4 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -872,6 +872,7 @@ static void scsi_io_completion_action(struct scsi_cmnd *cmd, int result)
 				case 0x07: /* operation in progress */
 				case 0x08: /* Long write in progress */
 				case 0x09: /* self test in progress */
+				case 0x11: /* notify (enable spinup) required */
 				case 0x14: /* space allocation in progress */
 				case 0x1a: /* start stop unit in progress */
 				case 0x1b: /* sanitize in progress */

commit aff7f97251e533111ee8abe775465f073c0d9aed
Author: Ziyuan Xu <xzy.xu@rock-chips.com>
Date:   Tue Jul 20 15:52:56 2021 +0800

    ARM: dts: rv1126-thunder-boot: remove mipi_csi_mclk iomux declaration
    
    The mclk iomux operation should be done on RISC-V stage.
    
    Change-Id: I392ef059bae44e3432ac97dd40c644c43766a1ba
    Signed-off-by: Ziyuan Xu <xzy.xu@rock-chips.com>

diff --git a/arch/arm/boot/dts/rv1126-thunder-boot.dtsi b/arch/arm/boot/dts/rv1126-thunder-boot.dtsi
index 1ae3c39cfada..023b0ad80944 100644
--- a/arch/arm/boot/dts/rv1126-thunder-boot.dtsi
+++ b/arch/arm/boot/dts/rv1126-thunder-boot.dtsi
@@ -66,9 +66,6 @@
 			      "clk_scr1_rtc", "clk_scr1_jtag",
 			      "csiphy0_pclk";
 		power-domains = <&power RV1126_PD_VI>;
-
-		pinctrl-names = "default";
-		pinctrl-0 = <&mipicsi_clk0>;
 		status = "okay";
 	};
 };

commit e81fbbdddee567abeb10d1b2940e6c27c5bd39fd
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Tue Jul 20 09:09:35 2021 +0800

    arm64: dts: rockchip: rk356x-evb: fix pcie supply to regulator-fixed
    
    Commit 6de4caa7df ("arm64: dts: rockchip: rk356x-evb: fix pcie supply
    to regulator-fixed") cleanup these stuff but we still have some left.
    
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: I29ebb92cc3dd0eaccfa610c7d526e46a0c33f320

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi
index dc847d0ab9ed..ead78e0077a2 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi
@@ -62,15 +62,14 @@
 		vin-supply = <&vcc3v3_sys>;
 	};
 
-	pcie30_3v3: gpio-regulator {
-		compatible = "regulator-gpio";
-		regulator-name = "pcie30_3v3";
-		regulator-min-microvolt = <100000>;
+	vcc3v3_pcie: gpio-regulator {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc3v3_pcie";
+		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
+		enable-active-high;
 		gpios = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;
-		gpios-states = <0x1>;
-		states = <100000 0x0
-			  3300000 0x1>;
+		vin-supply = <&dc_12v>;
 	};
 
 	vcc3v3_bu: vcc3v3-bu {
@@ -368,7 +367,7 @@
 
 &pcie3x2 {
 	reset-gpios = <&gpio2 RK_PD6 GPIO_ACTIVE_HIGH>;
-	vpcie3v3-supply = <&pcie30_3v3>;
+	vpcie3v3-supply = <&vcc3v3_pcie>;
 	status = "okay";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi
index 1385dbd0c6d4..1df326259635 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi
@@ -52,15 +52,13 @@
 		vin-supply = <&vcc3v3_sys>;
 	};
 
-	pcie30_3v3: gpio-regulator {
-		compatible = "regulator-gpio";
-		regulator-name = "pcie30_3v3";
-		regulator-min-microvolt = <100000>;
+	vcc3v3_pcie: gpio-regulator {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc3v3_pcie";
+		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		gpios = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;
-		gpios-states = <0x1>;
-		states = <100000 0x0
-			  3300000 0x1>;
+		vin-supply = <&dc_12v>;
 	};
 
 	vcc3v3_bu: vcc3v3-bu {
@@ -389,7 +387,7 @@
 
 &pcie3x2 {
 	reset-gpios = <&gpio2 RK_PD6 GPIO_ACTIVE_HIGH>;
-	vpcie3v3-supply = <&pcie30_3v3>;
+	vpcie3v3-supply = <&vcc3v3_pcie>;
 	status = "okay";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10.dtsi
index 238a4823b004..e711e0fd960a 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10.dtsi
@@ -54,15 +54,13 @@
 		vin-supply = <&vcc3v3_sys>;
 	};
 
-	pcie30_3v3: gpio-regulator {
-		compatible = "regulator-gpio";
-		regulator-name = "pcie30_3v3";
-		regulator-min-microvolt = <100000>;
+	vcc3v3_pcie: gpio-regulator {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc3v3_pcie";
+		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		gpios = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;
-		gpios-states = <0x1>;
-		states = <100000 0x0
-			  3300000 0x1>;
+		vin-supply = <&dc_12v>;
 	};
 
 	pcie30_avdd0v9: pcie30-avdd0v9 {
@@ -276,13 +274,13 @@
 
 &pcie3x1 {
 	reset-gpios = <&gpio0 RK_PC3 GPIO_ACTIVE_HIGH>;
-	vpcie3v3-supply = <&pcie30_3v3>;
+	vpcie3v3-supply = <&vcc3v3_pcie>;
 	status = "okay";
 };
 
 &pcie3x2 {
 	reset-gpios = <&gpio0 RK_PC6 GPIO_ACTIVE_HIGH>;
-	vpcie3v3-supply = <&pcie30_3v3>;
+	vpcie3v3-supply = <&vcc3v3_pcie>;
 	status = "okay";
 };
 

commit c0cb36f806dd2d9d4d666d12c27ddf695cc90714
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Wed Jun 30 21:10:20 2021 +0800

    ASoC: rockchip: i2s-tdm: Add support for 16ch tdm mode
    
    TDM_I2S_ONE_FRAME:
    support: [4, 8, 12, 16] channels
    
    TDM_I2S_HALF_FRAME:
    support: [2, 4, 6, 8] channels
    
    TDM_PCM_XXX:
    support: [2, 4, 6, 8] channels
    
    Change-Id: If9d4205977ee09b993d32759353794c101dc281e
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/sound/soc/rockchip/rockchip_i2s_tdm.c b/sound/soc/rockchip/rockchip_i2s_tdm.c
index 080bcb756bdc..60019a497d24 100644
--- a/sound/soc/rockchip/rockchip_i2s_tdm.c
+++ b/sound/soc/rockchip/rockchip_i2s_tdm.c
@@ -601,6 +601,16 @@ static int rockchip_i2s_tdm_set_fmt(struct snd_soc_dai *cpu_dai,
 				   mask, tdm_val);
 		regmap_update_bits(i2s_tdm->regmap, I2S_TDM_RXCR,
 				   mask, tdm_val);
+
+		if (val == I2S_TXCR_TFS_TDM_I2S && !i2s_tdm->tdm_fsync_half_frame) {
+			/* refine frame width for TDM_I2S_ONE_FRAME */
+			mask = TDM_FRAME_WIDTH_MSK;
+			tdm_val = TDM_FRAME_WIDTH(i2s_tdm->bclk_fs >> 1);
+			regmap_update_bits(i2s_tdm->regmap, I2S_TDM_TXCR,
+					   mask, tdm_val);
+			regmap_update_bits(i2s_tdm->regmap, I2S_TDM_RXCR,
+					   mask, tdm_val);
+		}
 	}
 
 err_pm_put:
@@ -961,6 +971,63 @@ static int rockchip_i2s_trcm_mode(struct snd_pcm_substream *substream,
 	return 0;
 }
 
+static int rockchip_i2s_tdm_params_channels(struct snd_pcm_substream *substream,
+					    struct snd_pcm_hw_params *params,
+					    struct snd_soc_dai *dai)
+{
+	struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai);
+	unsigned int reg_fmt, fmt;
+	int ret = 0;
+
+	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+		reg_fmt = I2S_TXCR;
+	else
+		reg_fmt = I2S_RXCR;
+
+	regmap_read(i2s_tdm->regmap, reg_fmt, &fmt);
+	fmt &= I2S_TXCR_TFS_MASK;
+
+	if (fmt == I2S_TXCR_TFS_TDM_I2S && !i2s_tdm->tdm_fsync_half_frame) {
+		switch (params_channels(params)) {
+		case 16:
+			ret = I2S_CHN_8;
+			break;
+		case 12:
+			ret = I2S_CHN_6;
+			break;
+		case 8:
+			ret = I2S_CHN_4;
+			break;
+		case 4:
+			ret = I2S_CHN_2;
+			break;
+		default:
+			ret = -EINVAL;
+			break;
+		}
+	} else {
+		switch (params_channels(params)) {
+		case 8:
+			ret = I2S_CHN_8;
+			break;
+		case 6:
+			ret = I2S_CHN_6;
+			break;
+		case 4:
+			ret = I2S_CHN_4;
+			break;
+		case 2:
+			ret = I2S_CHN_2;
+			break;
+		default:
+			ret = -EINVAL;
+			break;
+		}
+	}
+
+	return ret;
+}
+
 static int rockchip_i2s_tdm_hw_params(struct snd_pcm_substream *substream,
 				      struct snd_pcm_hw_params *params,
 				      struct snd_soc_dai *dai)
@@ -1011,24 +1078,11 @@ static int rockchip_i2s_tdm_hw_params(struct snd_pcm_substream *substream,
 		goto err;
 	}
 
-	switch (params_channels(params)) {
-	case 8:
-		val |= I2S_CHN_8;
-		break;
-	case 6:
-		val |= I2S_CHN_6;
-		break;
-	case 4:
-		val |= I2S_CHN_4;
-		break;
-	case 2:
-		val |= I2S_CHN_2;
-		break;
-	default:
-		ret = -EINVAL;
+	ret = rockchip_i2s_tdm_params_channels(substream, params, dai);
+	if (ret < 0)
 		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) {
@@ -1440,7 +1494,7 @@ static int rockchip_i2s_tdm_dai_prepare(struct platform_device *pdev,
 		.playback = {
 			.stream_name = "Playback",
 			.channels_min = 2,
-			.channels_max = 8,
+			.channels_max = 16,
 			.rates = SNDRV_PCM_RATE_8000_192000,
 			.formats = (SNDRV_PCM_FMTBIT_S8 |
 				    SNDRV_PCM_FMTBIT_S16_LE |
@@ -1451,7 +1505,7 @@ static int rockchip_i2s_tdm_dai_prepare(struct platform_device *pdev,
 		.capture = {
 			.stream_name = "Capture",
 			.channels_min = 2,
-			.channels_max = 8,
+			.channels_max = 16,
 			.rates = SNDRV_PCM_RATE_8000_192000,
 			.formats = (SNDRV_PCM_FMTBIT_S8 |
 				    SNDRV_PCM_FMTBIT_S16_LE |

commit b45d9660146a181011314607c4e52c17a1e0ad51
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Mon Jul 19 10:23:22 2021 +0800

    ASoC: rockchip: i2s-tdm: Silence warning by adding parentheses
    
    This patch place parentheses around 'x' to silence potential warning.
    
    Change-Id: I7c6cd70c03f71e85bd39faa092f2d0eb61409431
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/sound/soc/rockchip/rockchip_i2s_tdm.h b/sound/soc/rockchip/rockchip_i2s_tdm.h
index be8fb93e8b34..fa41f81429f5 100644
--- a/sound/soc/rockchip/rockchip_i2s_tdm.h
+++ b/sound/soc/rockchip/rockchip_i2s_tdm.h
@@ -24,7 +24,7 @@
 #define I2S_TXCR_RCNT_SHIFT	17
 #define I2S_TXCR_RCNT_MASK	(0x3f << I2S_TXCR_RCNT_SHIFT)
 #define I2S_TXCR_CSR_SHIFT	15
-#define I2S_TXCR_CSR(x)		(x << I2S_TXCR_CSR_SHIFT)
+#define I2S_TXCR_CSR(x)		((x) << I2S_TXCR_CSR_SHIFT)
 #define I2S_TXCR_CSR_MASK	(3 << I2S_TXCR_CSR_SHIFT)
 #define I2S_TXCR_HWT		BIT(14)
 #define I2S_TXCR_SJM_SHIFT	12
@@ -39,7 +39,7 @@
 #define I2S_TXCR_IBM_RSJM	(2 << I2S_TXCR_IBM_SHIFT)
 #define I2S_TXCR_IBM_MASK	(3 << I2S_TXCR_IBM_SHIFT)
 #define I2S_TXCR_PBM_SHIFT	7
-#define I2S_TXCR_PBM_MODE(x)	(x << I2S_TXCR_PBM_SHIFT)
+#define I2S_TXCR_PBM_MODE(x)	((x) << I2S_TXCR_PBM_SHIFT)
 #define I2S_TXCR_PBM_MASK	(3 << I2S_TXCR_PBM_SHIFT)
 #define I2S_TXCR_TFS_SHIFT	5
 #define I2S_TXCR_TFS_I2S	(0 << I2S_TXCR_TFS_SHIFT)
@@ -48,7 +48,7 @@
 #define I2S_TXCR_TFS_TDM_I2S	(3 << I2S_TXCR_TFS_SHIFT)
 #define I2S_TXCR_TFS_MASK	(3 << I2S_TXCR_TFS_SHIFT)
 #define I2S_TXCR_VDW_SHIFT	0
-#define I2S_TXCR_VDW(x)		((x - 1) << I2S_TXCR_VDW_SHIFT)
+#define I2S_TXCR_VDW(x)		(((x) - 1) << I2S_TXCR_VDW_SHIFT)
 #define I2S_TXCR_VDW_MASK	(0x1f << I2S_TXCR_VDW_SHIFT)
 
 /*
@@ -59,7 +59,7 @@
 #define I2S_RXCR_PATH_MASK(x)	(0x3 << I2S_RXCR_PATH_SHIFT(x))
 #define I2S_RXCR_PATH(x, v)	((v) << I2S_RXCR_PATH_SHIFT(x))
 #define I2S_RXCR_CSR_SHIFT	15
-#define I2S_RXCR_CSR(x)		(x << I2S_RXCR_CSR_SHIFT)
+#define I2S_RXCR_CSR(x)		((x) << I2S_RXCR_CSR_SHIFT)
 #define I2S_RXCR_CSR_MASK	(3 << I2S_RXCR_CSR_SHIFT)
 #define I2S_RXCR_HWT		BIT(14)
 #define I2S_RXCR_SJM_SHIFT	12
@@ -74,7 +74,7 @@
 #define I2S_RXCR_IBM_RSJM	(2 << I2S_RXCR_IBM_SHIFT)
 #define I2S_RXCR_IBM_MASK	(3 << I2S_RXCR_IBM_SHIFT)
 #define I2S_RXCR_PBM_SHIFT	7
-#define I2S_RXCR_PBM_MODE(x)	(x << I2S_RXCR_PBM_SHIFT)
+#define I2S_RXCR_PBM_MODE(x)	((x) << I2S_RXCR_PBM_SHIFT)
 #define I2S_RXCR_PBM_MASK	(3 << I2S_RXCR_PBM_SHIFT)
 #define I2S_RXCR_TFS_SHIFT	5
 #define I2S_RXCR_TFS_I2S	(0 << I2S_RXCR_TFS_SHIFT)
@@ -83,7 +83,7 @@
 #define I2S_RXCR_TFS_TDM_I2S	(3 << I2S_RXCR_TFS_SHIFT)
 #define I2S_RXCR_TFS_MASK	(3 << I2S_RXCR_TFS_SHIFT)
 #define I2S_RXCR_VDW_SHIFT	0
-#define I2S_RXCR_VDW(x)		((x - 1) << I2S_RXCR_VDW_SHIFT)
+#define I2S_RXCR_VDW(x)		(((x) - 1) << I2S_RXCR_VDW_SHIFT)
 #define I2S_RXCR_VDW_MASK	(0x1f << I2S_RXCR_VDW_SHIFT)
 
 /*
@@ -91,7 +91,7 @@
  * clock generation register
  */
 #define I2S_CKR_TRCM_SHIFT	28
-#define I2S_CKR_TRCM(x)	(x << I2S_CKR_TRCM_SHIFT)
+#define I2S_CKR_TRCM(x)	((x) << I2S_CKR_TRCM_SHIFT)
 #define I2S_CKR_TRCM_TXRX	(0 << I2S_CKR_TRCM_SHIFT)
 #define I2S_CKR_TRCM_TXONLY	(1 << I2S_CKR_TRCM_SHIFT)
 #define I2S_CKR_TRCM_RXONLY	(2 << I2S_CKR_TRCM_SHIFT)
@@ -113,13 +113,13 @@
 #define I2S_CKR_TLP_INVERTED	(1 << I2S_CKR_TLP_SHIFT)
 #define I2S_CKR_TLP_MASK	(1 << I2S_CKR_TLP_SHIFT)
 #define I2S_CKR_MDIV_SHIFT	16
-#define I2S_CKR_MDIV(x)		((x - 1) << I2S_CKR_MDIV_SHIFT)
+#define I2S_CKR_MDIV(x)		(((x) - 1) << I2S_CKR_MDIV_SHIFT)
 #define I2S_CKR_MDIV_MASK	(0xff << I2S_CKR_MDIV_SHIFT)
 #define I2S_CKR_RSD_SHIFT	8
-#define I2S_CKR_RSD(x)		((x - 1) << I2S_CKR_RSD_SHIFT)
+#define I2S_CKR_RSD(x)		(((x) - 1) << I2S_CKR_RSD_SHIFT)
 #define I2S_CKR_RSD_MASK	(0xff << I2S_CKR_RSD_SHIFT)
 #define I2S_CKR_TSD_SHIFT	0
-#define I2S_CKR_TSD(x)		((x - 1) << I2S_CKR_TSD_SHIFT)
+#define I2S_CKR_TSD(x)		(((x) - 1) << I2S_CKR_TSD_SHIFT)
 #define I2S_CKR_TSD_MASK	(0xff << I2S_CKR_TSD_SHIFT)
 
 /*
@@ -145,7 +145,7 @@
 #define I2S_DMACR_RDE_DISABLE	(0 << I2S_DMACR_RDE_SHIFT)
 #define I2S_DMACR_RDE_ENABLE	(1 << 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(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)
@@ -159,7 +159,7 @@
  * interrupt control register
  */
 #define I2S_INTCR_RFT_SHIFT	20
-#define I2S_INTCR_RFT(x)	((x - 1) << I2S_INTCR_RFT_SHIFT)
+#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)
@@ -168,7 +168,7 @@
 #define I2S_INTCR_RXFIE_DISABLE	(0 << I2S_INTCR_RXFIE_SHIFT)
 #define I2S_INTCR_RXFIE_ENABLE	(1 << I2S_INTCR_RXFIE_SHIFT)
 #define I2S_INTCR_TFT_SHIFT	4
-#define I2S_INTCR_TFT(x)	((x - 1) << I2S_INTCR_TFT_SHIFT)
+#define I2S_INTCR_TFT(x)	(((x) - 1) << I2S_INTCR_TFT_SHIFT)
 #define I2S_INTCR_TFT_MASK	(0x1f << I2S_INTCR_TFT_SHIFT)
 #define I2S_INTCR_TXUIC		BIT(2)
 #define I2S_INTCR_TXUIE_SHIFT	1
@@ -230,26 +230,26 @@
  * TDM ctrl register
  */
 #define TDM_FSYNC_WIDTH_SEL1_MSK	GENMASK(20, 18)
-#define TDM_FSYNC_WIDTH_SEL1(x)		((x - 1) << 18)
+#define TDM_FSYNC_WIDTH_SEL1(x)		(((x) - 1) << 18)
 #define TDM_FSYNC_WIDTH_SEL0_MSK	BIT(17)
 #define TDM_FSYNC_WIDTH_HALF_FRAME	0
 #define TDM_FSYNC_WIDTH_ONE_FRAME	BIT(17)
 #define TDM_SHIFT_CTRL_MSK		GENMASK(16, 14)
 #define TDM_SHIFT_CTRL(x)		((x) << 14)
 #define TDM_SLOT_BIT_WIDTH_MSK		GENMASK(13, 9)
-#define TDM_SLOT_BIT_WIDTH(x)		((x - 1) << 9)
+#define TDM_SLOT_BIT_WIDTH(x)		(((x) - 1) << 9)
 #define TDM_FRAME_WIDTH_MSK		GENMASK(8, 0)
-#define TDM_FRAME_WIDTH(x)		((x - 1) << 0)
+#define TDM_FRAME_WIDTH(x)		(((x) - 1) << 0)
 
 /*
  * CLKDIV
  * Mclk div register
  */
 #define I2S_CLKDIV_TXM_SHIFT	0
-#define I2S_CLKDIV_TXM(x)		((x - 1) << I2S_CLKDIV_TXM_SHIFT)
+#define I2S_CLKDIV_TXM(x)		(((x) - 1) << I2S_CLKDIV_TXM_SHIFT)
 #define I2S_CLKDIV_TXM_MASK	(0xff << I2S_CLKDIV_TXM_SHIFT)
 #define I2S_CLKDIV_RXM_SHIFT	8
-#define I2S_CLKDIV_RXM(x)		((x - 1) << I2S_CLKDIV_RXM_SHIFT)
+#define I2S_CLKDIV_RXM(x)		(((x) - 1) << I2S_CLKDIV_RXM_SHIFT)
 #define I2S_CLKDIV_RXM_MASK	(0xff << I2S_CLKDIV_RXM_SHIFT)
 
 /* Clock divider id */

commit 016b6c5734af191cda98571d7e8974de5e9dafd9
Author: William Wu <william.wu@rock-chips.com>
Date:   Mon Jul 19 12:08:32 2021 +0800

    phy: rockchip-naneng-usb2: keep utmi clk on during charge detection
    
    When do charge detection, the phy specification suggests that
    it needs to holds the phy in reset state to avoid USB data
    communication. However, the utmi clk60_30 will be disabled at
    the same time, that's causing a synchronization issue between
    the phy and the USB controller.
    
    I test on RV1126 EVB Linux SDK, do usb device hot plug test
    quickly. The USB dwc3 controller may fail to enable ep0 because
    of no clk60_30 is supplied by the phy.
    
    This patch sets the phy utmi in normal mode by GRF to keeps the
    utmi clk on for USB controller.
    
    Signed-off-by: William Wu <william.wu@rock-chips.com>
    Change-Id: I8958a491130faeb9ac361b8639e4c3d3190fad1b

diff --git a/drivers/phy/rockchip/phy-rockchip-naneng-usb2.c b/drivers/phy/rockchip/phy-rockchip-naneng-usb2.c
index 7580e5cc85b7..924b316ef6d2 100644
--- a/drivers/phy/rockchip/phy-rockchip-naneng-usb2.c
+++ b/drivers/phy/rockchip/phy-rockchip-naneng-usb2.c
@@ -109,6 +109,7 @@ struct rockchip_chg_det_reg {
  * @ls_det_en: linestate detection enable register.
  * @ls_det_st: linestate detection state register.
  * @ls_det_clr: linestate detection clear register.
+ * @phy_chg_mode: set phy in charge detection mode.
  * @phy_sus: phy suspend register.
  * @utmi_bvalid: utmi vbus bvalid status register.
  * @utmi_iddig: otg port id pin status register.
@@ -140,6 +141,7 @@ struct rockchip_usb2phy_port_cfg {
 	struct usb2phy_reg	ls_det_en;
 	struct usb2phy_reg	ls_det_st;
 	struct usb2phy_reg	ls_det_clr;
+	struct usb2phy_reg	phy_chg_mode;
 	struct usb2phy_reg	phy_sus;
 	struct usb2phy_reg	utmi_bvalid;
 	struct usb2phy_reg	utmi_iddig;
@@ -796,12 +798,45 @@ static void rockchip_chg_detect(struct rockchip_usb2phy *rphy,
 				struct rockchip_usb2phy_port *rport)
 {
 	bool chg_valid, phy_connect;
-	int result;
-	int cnt;
+	const struct usb2phy_reg *phy_sus_reg;
+	unsigned int phy_sus_cfg, mask;
+	int result, cnt, ret;
 
 	mutex_lock(&rport->mutex);
 
-	reset_control_assert(rphy->reset);
+	/*
+	 * We are violating what the phy specification says about
+	 * the charge detection process. Ideally we need to hold
+	 * the phy in the reset state during the charge detection
+	 * process, but that's causing trouble synchronizing between
+	 * the phy and usb controller because CLK60_30 is disabled
+	 * while phy in reset.
+	 *
+	 * We have discussed this with the phy IP Provider, and
+	 * it was suggested to keep the CLK60_30 while do charging
+	 * detection.
+	 *
+	 * Set the phy in charge mode (keep the CLK60_30):
+	 * Enable the DP/DM pulldown resistor;
+	 * Set the opmode to non-driving mode;
+	 * Set the phy controlled by GRF utmi interface, and set
+	 * the utmi in normal mode to keep the CLK60_30.
+	 */
+	phy_sus_reg = &rport->port_cfg->phy_sus;
+	ret = regmap_read(rphy->grf, phy_sus_reg->offset, &phy_sus_cfg);
+	if (ret) {
+		dev_err(&rport->phy->dev,
+			"Fail to read phy_sus reg offset 0x%x, ret %d\n",
+			phy_sus_reg->offset, ret);
+		goto unlock;
+	}
+
+	ret = property_enable(rphy->grf, &rport->port_cfg->phy_chg_mode, true);
+	if (ret) {
+		dev_err(&rport->phy->dev,
+			"Fail to set phy_chg_mode reg, ret %d\n", ret);
+		goto unlock;
+	}
 
 	/* CHG_RST is set to 1'b0 to start charge detection */
 	property_enable(rphy->grf, &rphy->phy_cfg->chg_det.chg_en, true);
@@ -841,15 +876,21 @@ static void rockchip_chg_detect(struct rockchip_usb2phy *rphy,
 	dev_info(&rport->phy->dev, "charger = %s\n",
 		 chg_to_string(rphy->chg_type));
 
-	usleep_range(1000, 1100);
-	reset_control_deassert(rphy->reset);
-	/* waiting for the utmi_clk to become stable */
-	usleep_range(2500, 3000);
-
 	/* disable the chg detection module */
 	property_enable(rphy->grf, &rphy->phy_cfg->chg_det.chg_rst, true);
 	property_enable(rphy->grf, &rphy->phy_cfg->chg_det.chg_en, false);
 
+	mask = GENMASK(phy_sus_reg->bitend, phy_sus_reg->bitstart);
+	/* Restore the phy suspend configuration */
+	ret = regmap_write(rphy->grf, phy_sus_reg->offset,
+			   ((phy_sus_cfg << phy_sus_reg->bitstart) |
+			    (mask << BIT_WRITEABLE_SHIFT)));
+	if (ret)
+		dev_err(&rport->phy->dev,
+			"Fail to set phy_sus reg offset 0x%x, ret %d\n",
+			phy_sus_reg->offset, ret);
+
+unlock:
 	mutex_unlock(&rport->mutex);
 }
 
@@ -1860,6 +1901,7 @@ static const struct rockchip_usb2phy_cfg rv1126_phy_cfgs[] = {
 				.ls_det_en = { 0x10300, 0, 0, 0, 1 },
 				.ls_det_st = { 0x10304, 0, 0, 0, 1 },
 				.ls_det_clr = { 0x10308, 0, 0, 0, 1 },
+				.phy_chg_mode = { 0x10230, 8, 0, 0x052, 0x1d7 },
 				.phy_sus = { 0x10230, 8, 0, 0x052, 0x1d5 },
 				.utmi_bvalid = { 0x10248, 9, 9, 0, 1 },
 				.utmi_iddig = { 0x10248, 6, 6, 0, 1 },

commit f6569d395b22eaf95e2507c19906fa6ec228cf6e
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Wed Jul 14 16:03:34 2021 +0800

    media: rockchip: isp: disable params when it stream off
    
    Change-Id: I534c6052217e3bec01d1abb9efd1eaf1c97a1f7b
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/isp_params.c b/drivers/media/platform/rockchip/isp/isp_params.c
index 4d3690f0484a..9d3cad3fd490 100644
--- a/drivers/media/platform/rockchip/isp/isp_params.c
+++ b/drivers/media/platform/rockchip/isp/isp_params.c
@@ -197,6 +197,7 @@ static void rkisp_params_vb2_stop_streaming(struct vb2_queue *vq)
 		params_vdev->cur_buf = NULL;
 	}
 
+	rkisp_params_disable_isp(params_vdev);
 	/* clean module params */
 	params_vdev->ops->clear_first_param(params_vdev);
 	params_vdev->rdbk_times = 0;

commit 29db17b8254b53e133e545d7f942b9636489b632
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Wed Jul 14 16:01:54 2021 +0800

    media: rockchip: isp: add lock for isp stream
    
    Change-Id: I25f128a59eaf953d8b8c42313ea8afd82e7229ae
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c
index c5ea7b434af9..08cfeab7db28 100644
--- a/drivers/media/platform/rockchip/isp/rkisp.c
+++ b/drivers/media/platform/rockchip/isp/rkisp.c
@@ -1581,8 +1581,6 @@ static int rkisp_isp_stop(struct rkisp_device *dev)
 	if (dev->hdr.sensor)
 		dev->hdr.sensor = NULL;
 
-	rkisp_params_stream_stop(&dev->params_vdev);
-
 	return 0;
 }
 
@@ -1645,7 +1643,6 @@ static int rkisp_isp_start(struct rkisp_device *dev)
 		dev->hw_dev->monitor.state = ISP_FRAME_END;
 		schedule_work(&dev->hw_dev->monitor.work);
 	}
-	rkisp_rdbk_trigger_event(dev, T_CMD_QUEUE, NULL);
 	return 0;
 }
 
@@ -2214,30 +2211,30 @@ static void rkisp_isp_read_add_fifo_data(struct rkisp_device *dev)
 static int rkisp_isp_sd_s_stream(struct v4l2_subdev *sd, int on)
 {
 	struct rkisp_device *isp_dev = sd_to_isp_dev(sd);
-	int ret = 0;
 
 	if (!on) {
 		rkisp_stop_3a_run(isp_dev);
-		atomic_dec(&isp_dev->hw_dev->refcnt);
 		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) ||
 			 isp_dev->isp_state & ISP_STOP), msecs_to_jiffies(5));
-		return rkisp_isp_stop(isp_dev);
+		mutex_lock(&isp_dev->hw_dev->dev_lock);
+		rkisp_isp_stop(isp_dev);
+		atomic_dec(&isp_dev->hw_dev->refcnt);
+		mutex_unlock(&isp_dev->hw_dev->dev_lock);
+		rkisp_params_stream_stop(&isp_dev->params_vdev);
+		return 0;
 	}
 
 	rkisp_start_3a_run(isp_dev);
+	mutex_lock(&isp_dev->hw_dev->dev_lock);
 	atomic_inc(&isp_dev->hw_dev->refcnt);
 	atomic_set(&isp_dev->isp_sdev.frm_sync_seq, 0);
-	ret = rkisp_config_cif(isp_dev);
-	if (ret < 0)
-		goto out;
-
-	ret = rkisp_isp_start(isp_dev);
-out:
-	if (ret < 0)
-		atomic_dec(&isp_dev->hw_dev->refcnt);
-	return ret;
+	rkisp_config_cif(isp_dev);
+	rkisp_isp_start(isp_dev);
+	mutex_unlock(&isp_dev->hw_dev->dev_lock);
+	rkisp_rdbk_trigger_event(isp_dev, T_CMD_QUEUE, NULL);
+	return 0;
 }
 
 static int rkisp_isp_sd_s_power(struct v4l2_subdev *sd, int on)

commit ffb0dcfe50690120f07ba7a784671ec2ed6f790c
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Mon Jul 19 11:20:25 2021 +0800

    iommu: remove unused rk-iommu/iovmm driver
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: Ieca1544f10c294303d0d40c6b4c5e1a797e577a2

diff --git a/drivers/iommu/rk-iommu.c b/drivers/iommu/rk-iommu.c
deleted file mode 100644
index 3dcb5aad5ce6..000000000000
--- a/drivers/iommu/rk-iommu.c
+++ /dev/null
@@ -1,1270 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifdef CONFIG_ROCKCHIP_IOMMU_DEBUG
-#define DEBUG
-#endif
-
-#include <linux/io.h>
-#include <linux/interrupt.h>
-#include <linux/slab.h>
-#include <linux/clk.h>
-#include <linux/err.h>
-#include <linux/mm.h>
-#include <linux/errno.h>
-#include <linux/memblock.h>
-#include <linux/export.h>
-#include <linux/module.h>
-
-#include <asm/cacheflush.h>
-#include <asm/pgtable.h>
-#include <linux/of.h>
-#include <linux/rockchip-iovmm.h>
-#include <linux/rockchip/cpu.h>
-#include <linux/device.h>
-#include "rk-iommu.h"
-
-/* We does not consider super section mapping (16MB) */
-#define SPAGE_ORDER 12
-#define SPAGE_SIZE (1 << SPAGE_ORDER)
-#define SPAGE_MASK (~(SPAGE_SIZE - 1))
-
-static void __iomem *rk312x_vop_mmu_base;
-
-enum iommu_entry_flags {
-	IOMMU_FLAGS_PRESENT = 0x01,
-	IOMMU_FLAGS_READ_PERMISSION = 0x02,
-	IOMMU_FLAGS_WRITE_PERMISSION = 0x04,
-	IOMMU_FLAGS_OVERRIDE_CACHE = 0x8,
-	IOMMU_FLAGS_WRITE_CACHEABLE = 0x10,
-	IOMMU_FLAGS_WRITE_ALLOCATE = 0x20,
-	IOMMU_FLAGS_WRITE_BUFFERABLE = 0x40,
-	IOMMU_FLAGS_READ_CACHEABLE = 0x80,
-	IOMMU_FLAGS_READ_ALLOCATE = 0x100,
-	IOMMU_FLAGS_MASK = 0x1FF,
-};
-
-#define rockchip_lv1ent_fault(sent) ((*(sent) & IOMMU_FLAGS_PRESENT) == 0)
-#define rockchip_lv1ent_page(sent) ((*(sent) & IOMMU_FLAGS_PRESENT) == 1)
-#define rockchip_lv2ent_fault(pent) ((*(pent) & IOMMU_FLAGS_PRESENT) == 0)
-#define rockchip_spage_phys(pent) (*(pent) & SPAGE_MASK)
-#define rockchip_spage_offs(iova) ((iova) & 0x0FFF)
-
-#define rockchip_lv1ent_offset(iova) (((iova)>>22) & 0x03FF)
-#define rockchip_lv2ent_offset(iova) (((iova)>>12) & 0x03FF)
-
-#define NUM_LV1ENTRIES 1024
-#define NUM_LV2ENTRIES 1024
-
-#define LV2TABLE_SIZE (NUM_LV2ENTRIES * sizeof(long))
-
-#define rockchip_lv2table_base(sent) (*(sent) & 0xFFFFFFFE)
-
-#define rockchip_mk_lv1ent_page(pa) ((pa) | IOMMU_FLAGS_PRESENT)
-/*write and read permission for level2 page default*/
-#define rockchip_mk_lv2ent_spage(pa) ((pa) | IOMMU_FLAGS_PRESENT | \
-			     IOMMU_FLAGS_READ_PERMISSION | \
-			     IOMMU_FLAGS_WRITE_PERMISSION)
-
-#define IOMMU_REG_POLL_COUNT_FAST 1000
-
-/**
- * MMU register numbers
- * Used in the register read/write routines.
- * See the hardware documentation for more information about each register
- */
-enum iommu_register {
-	/**< Current Page Directory Pointer */
-	IOMMU_REGISTER_DTE_ADDR = 0x0000,
-	/**< Status of the MMU */
-	IOMMU_REGISTER_STATUS = 0x0004,
-	/**< Command register, used to control the MMU */
-	IOMMU_REGISTER_COMMAND = 0x0008,
-	/**< Logical address of the last page fault */
-	IOMMU_REGISTER_PAGE_FAULT_ADDR = 0x000C,
-	/**< Used to invalidate the mapping of a single page from the MMU */
-	IOMMU_REGISTER_ZAP_ONE_LINE = 0x010,
-	/**< Raw interrupt status, all interrupts visible */
-	IOMMU_REGISTER_INT_RAWSTAT = 0x0014,
-	/**< Indicate to the MMU that the interrupt has been received */
-	IOMMU_REGISTER_INT_CLEAR = 0x0018,
-	/**< Enable/disable types of interrupts */
-	IOMMU_REGISTER_INT_MASK = 0x001C,
-	/**< Interrupt status based on the mask */
-	IOMMU_REGISTER_INT_STATUS = 0x0020,
-	IOMMU_REGISTER_AUTO_GATING = 0x0024
-};
-
-enum iommu_command {
-	/**< Enable paging (memory translation) */
-	IOMMU_COMMAND_ENABLE_PAGING = 0x00,
-	/**< Disable paging (memory translation) */
-	IOMMU_COMMAND_DISABLE_PAGING = 0x01,
-	/**<  Enable stall on page fault */
-	IOMMU_COMMAND_ENABLE_STALL = 0x02,
-	/**< Disable stall on page fault */
-	IOMMU_COMMAND_DISABLE_STALL = 0x03,
-	/**< Zap the entire page table cache */
-	IOMMU_COMMAND_ZAP_CACHE = 0x04,
-	/**< Page fault processed */
-	IOMMU_COMMAND_PAGE_FAULT_DONE = 0x05,
-	/**< Reset the MMU back to power-on settings */
-	IOMMU_COMMAND_HARD_RESET = 0x06
-};
-
-/**
- * MMU interrupt register bits
- * Each cause of the interrupt is reported
- * through the (raw) interrupt status registers.
- * Multiple interrupts can be pending, so multiple bits
- * can be set at once.
- */
-enum iommu_interrupt {
-	IOMMU_INTERRUPT_PAGE_FAULT = 0x01, /**< A page fault occured */
-	IOMMU_INTERRUPT_READ_BUS_ERROR = 0x02 /**< A bus read error occured */
-};
-
-enum iommu_status_bits {
-	IOMMU_STATUS_BIT_PAGING_ENABLED      = 1 << 0,
-	IOMMU_STATUS_BIT_PAGE_FAULT_ACTIVE   = 1 << 1,
-	IOMMU_STATUS_BIT_STALL_ACTIVE        = 1 << 2,
-	IOMMU_STATUS_BIT_IDLE                = 1 << 3,
-	IOMMU_STATUS_BIT_REPLAY_BUFFER_EMPTY = 1 << 4,
-	IOMMU_STATUS_BIT_PAGE_FAULT_IS_WRITE = 1 << 5,
-	IOMMU_STATUS_BIT_STALL_NOT_ACTIVE    = 1 << 31,
-};
-
-/**
- * Size of an MMU page in bytes
- */
-#define IOMMU_PAGE_SIZE 0x1000
-
-/*
- * Size of the address space referenced by a page table page
- */
-#define IOMMU_VIRTUAL_PAGE_SIZE 0x400000 /* 4 MiB */
-
-/**
- * Page directory index from address
- * Calculates the page directory index from the given address
- */
-#define IOMMU_PDE_ENTRY(address) (((address)>>22) & 0x03FF)
-
-/**
- * Page table index from address
- * Calculates the page table index from the given address
- */
-#define IOMMU_PTE_ENTRY(address) (((address)>>12) & 0x03FF)
-
-/**
- * Extract the memory address from an PDE/PTE entry
- */
-#define IOMMU_ENTRY_ADDRESS(value) ((value) & 0xFFFFFC00)
-
-#define INVALID_PAGE ((u32)(~0))
-
-static struct kmem_cache *lv2table_kmem_cache;
-
-static unsigned int *rockchip_section_entry(unsigned int *pgtable, unsigned long iova)
-{
-	return pgtable + rockchip_lv1ent_offset(iova);
-}
-
-static unsigned int *rockchip_page_entry(unsigned int *sent, unsigned long iova)
-{
-	return (unsigned int *)phys_to_virt(rockchip_lv2table_base(sent)) +
-		rockchip_lv2ent_offset(iova);
-}
-
-struct rk_iommu_domain {
-	struct list_head clients; /* list of iommu_drvdata.node */
-	unsigned int *pgtable; /* lv1 page table, 4KB */
-	short *lv2entcnt; /* free lv2 entry counter for each section */
-	spinlock_t lock; /* lock for this structure */
-	spinlock_t pgtablelock; /* lock for modifying page table @ pgtable */
-	struct iommu_domain domain;
-};
-
-static struct rk_iommu_domain *to_rk_domain(struct iommu_domain *dom)
-{
-	return container_of(dom, struct rk_iommu_domain, domain);
-}
-
-static bool rockchip_set_iommu_active(struct iommu_drvdata *data)
-{
-	/* return true if the IOMMU was not active previously
-	   and it needs to be initialized */
-	return ++data->activations == 1;
-}
-
-static bool rockchip_set_iommu_inactive(struct iommu_drvdata *data)
-{
-	/* return true if the IOMMU is needed to be disabled */
-	BUG_ON(data->activations < 1);
-	return --data->activations == 0;
-}
-
-static bool rockchip_is_iommu_active(struct iommu_drvdata *data)
-{
-	return data->activations > 0;
-}
-
-static void rockchip_iommu_disable_stall(void __iomem *base)
-{
-	int i;
-	u32 mmu_status;
-
-	if (base != rk312x_vop_mmu_base) {
-		mmu_status = __raw_readl(base + IOMMU_REGISTER_STATUS);
-	} else {
-		goto skip_vop_mmu_disable;
-	}
-
-	if (0 == (mmu_status & IOMMU_STATUS_BIT_PAGING_ENABLED)) {
-		return;
-	}
-
-	if (mmu_status & IOMMU_STATUS_BIT_PAGE_FAULT_ACTIVE) {
-		pr_info("Aborting MMU disable stall request since it is in pagefault state.\n");
-		return;
-	}
-
-	if (!(mmu_status & IOMMU_STATUS_BIT_STALL_ACTIVE)) {
-		return;
-	}
-
-	__raw_writel(IOMMU_COMMAND_DISABLE_STALL, base + IOMMU_REGISTER_COMMAND);
-
-	skip_vop_mmu_disable:
-
-	for (i = 0; i < IOMMU_REG_POLL_COUNT_FAST; ++i) {
-		u32 status;
-		
-		if (base != rk312x_vop_mmu_base) {
-			status = __raw_readl(base + IOMMU_REGISTER_STATUS);
-		} else {
-			int j;
-			while (j < 5)
-				j++;
-			return;	
-		}
-
-		if (0 == (status & IOMMU_STATUS_BIT_STALL_ACTIVE))
-			break;
-
-		if (status & IOMMU_STATUS_BIT_PAGE_FAULT_ACTIVE)
-			break;
-
-		if (0 == (mmu_status & IOMMU_STATUS_BIT_PAGING_ENABLED))
-			break;
-	}
-
-	if (IOMMU_REG_POLL_COUNT_FAST == i) {
-		pr_info("Disable stall request failed, MMU status is 0x%08X\n",
-		      __raw_readl(base + IOMMU_REGISTER_STATUS));
-	}
-}
-
-static bool rockchip_iommu_enable_stall(void __iomem *base)
-{
-	int i;
-
-	u32 mmu_status;
-	
-	if (base != rk312x_vop_mmu_base) {
-		mmu_status = __raw_readl(base + IOMMU_REGISTER_STATUS);
-	} else {
-		goto skip_vop_mmu_enable;
-	}
-
-	if (0 == (mmu_status & IOMMU_STATUS_BIT_PAGING_ENABLED)) {
-		return true;
-	}
-
-	if (mmu_status & IOMMU_STATUS_BIT_STALL_ACTIVE){
-		pr_info("MMU stall already enabled\n");
-		return true;
-	}
-
-	if (mmu_status & IOMMU_STATUS_BIT_PAGE_FAULT_ACTIVE) {
-		pr_info("Aborting MMU stall request since it is in pagefault state. mmu status is 0x%08x\n",
-			mmu_status);
-		return false;
-	}
-
-	__raw_writel(IOMMU_COMMAND_ENABLE_STALL, base + IOMMU_REGISTER_COMMAND);
-
-	skip_vop_mmu_enable:
-
-	for (i = 0; i < IOMMU_REG_POLL_COUNT_FAST; ++i) {
-		if (base != rk312x_vop_mmu_base) {
-			mmu_status = __raw_readl(base + IOMMU_REGISTER_STATUS);
-		} else {
-			int j;
-			while (j < 5)
-				j++;
-			return true;
-		}
-
-		if (mmu_status & IOMMU_STATUS_BIT_PAGE_FAULT_ACTIVE)
-			break;
-
-		if ((mmu_status & IOMMU_STATUS_BIT_STALL_ACTIVE) &&
-		    (0 == (mmu_status & IOMMU_STATUS_BIT_STALL_NOT_ACTIVE)))
-			break;
-
-		if (0 == (mmu_status & (IOMMU_STATUS_BIT_PAGING_ENABLED)))
-			break;
-	}
-
-	if (IOMMU_REG_POLL_COUNT_FAST == i) {
-		pr_info("Enable stall request failed, MMU status is 0x%08X\n",
-		       __raw_readl(base + IOMMU_REGISTER_STATUS));
-		return false;
-	}
-
-	if (mmu_status & IOMMU_STATUS_BIT_PAGE_FAULT_ACTIVE) {
-		pr_info("Aborting MMU stall request since it has a pagefault.\n");
-		return false;
-	}
-
-	return true;
-}
-
-static bool rockchip_iommu_enable_paging(void __iomem *base)
-{
-	int i;
-
-	__raw_writel(IOMMU_COMMAND_ENABLE_PAGING,
-		     base + IOMMU_REGISTER_COMMAND);
-
-	for (i = 0; i < IOMMU_REG_POLL_COUNT_FAST; ++i) {
-		if (base != rk312x_vop_mmu_base) {
-			if (__raw_readl(base + IOMMU_REGISTER_STATUS) &
-				IOMMU_STATUS_BIT_PAGING_ENABLED)
-			break;
-		} else {
-			int j;
-			while (j < 5)
-				j++;
-			return true;
-		}
-	}
-
-	if (IOMMU_REG_POLL_COUNT_FAST == i) {
-		pr_info("Enable paging request failed, MMU status is 0x%08X\n",
-		       __raw_readl(base + IOMMU_REGISTER_STATUS));
-		return false;
-	}
-
-	return true;
-}
-
-static bool rockchip_iommu_disable_paging(void __iomem *base)
-{
-	int i;
-
-	__raw_writel(IOMMU_COMMAND_DISABLE_PAGING,
-		     base + IOMMU_REGISTER_COMMAND);
-
-	for (i = 0; i < IOMMU_REG_POLL_COUNT_FAST; ++i) {
-		if (base != rk312x_vop_mmu_base) {
-			if (!(__raw_readl(base + IOMMU_REGISTER_STATUS) &
-				  IOMMU_STATUS_BIT_PAGING_ENABLED))
-				break;
-		} else {
-			int j;
-			while (j < 5)
-				j++;
-			return true;
-		}
-	}
-
-	if (IOMMU_REG_POLL_COUNT_FAST == i) {
-		pr_info("Disable paging request failed, MMU status is 0x%08X\n",
-		       __raw_readl(base + IOMMU_REGISTER_STATUS));
-		return false;
-	}
-
-	return true;
-}
-
-static void rockchip_iommu_page_fault_done(void __iomem *base, const char *dbgname)
-{
-	pr_info("MMU: %s: Leaving page fault mode\n",
-		dbgname);
-	__raw_writel(IOMMU_COMMAND_PAGE_FAULT_DONE,
-		     base + IOMMU_REGISTER_COMMAND);
-}
-
-static int rockchip_iommu_zap_tlb_without_stall (void __iomem *base)
-{
-	__raw_writel(IOMMU_COMMAND_ZAP_CACHE, base + IOMMU_REGISTER_COMMAND);
-
-	return 0;
-}
-
-static int rockchip_iommu_zap_tlb(void __iomem *base)
-{
-	if (!rockchip_iommu_enable_stall(base)) {
-		pr_err("%s failed\n", __func__);
-		return -1;
-	}
-
-	__raw_writel(IOMMU_COMMAND_ZAP_CACHE, base + IOMMU_REGISTER_COMMAND);
-
-	rockchip_iommu_disable_stall(base);
-
-	return 0;
-}
-
-static inline bool rockchip_iommu_raw_reset(void __iomem *base)
-{
-	int i;
-	unsigned int ret;
-
-	__raw_writel(0xCAFEBABE, base + IOMMU_REGISTER_DTE_ADDR);
-
-	if (base != rk312x_vop_mmu_base) {
-		ret = __raw_readl(base + IOMMU_REGISTER_DTE_ADDR);
-		if (ret != 0xCAFEB000)
-			return false;
-	}
-	__raw_writel(IOMMU_COMMAND_HARD_RESET,
-		     base + IOMMU_REGISTER_COMMAND);
-
-	for (i = 0; i < IOMMU_REG_POLL_COUNT_FAST; ++i) {
-		if (base != rk312x_vop_mmu_base) {
-			if (__raw_readl(base + IOMMU_REGISTER_DTE_ADDR) == 0)
-				break;
-		} else {
-			int j;
-			while (j < 5)
-				j++;
-			return true;
-		}
-	}
-
-	if (IOMMU_REG_POLL_COUNT_FAST == i) {
-		pr_info("%s,Reset request failed, MMU status is 0x%08X\n",
-		       __func__, __raw_readl(base + IOMMU_REGISTER_DTE_ADDR));
-		return false;
-	}
-	return true;
-}
-
-static void rockchip_iommu_set_ptbase(void __iomem *base, unsigned int pgd)
-{
-	__raw_writel(pgd, base + IOMMU_REGISTER_DTE_ADDR);
-}
-
-static bool rockchip_iommu_reset(void __iomem *base, const char *dbgname)
-{
-	bool ret = true;
-
-	ret = rockchip_iommu_raw_reset(base);
-	if (!ret) {
-		pr_info("(%s), %s failed\n", dbgname, __func__);
-		return ret;
-	}
-
-	if (base != rk312x_vop_mmu_base)
-		__raw_writel(IOMMU_INTERRUPT_PAGE_FAULT |
-			     IOMMU_INTERRUPT_READ_BUS_ERROR,
-			     base + IOMMU_REGISTER_INT_MASK);
-	else
-		__raw_writel(0x00, base + IOMMU_REGISTER_INT_MASK);
-
-	return ret;
-}
-
-static inline void rockchip_pgtable_flush(void *vastart, void *vaend)
-{
-#ifdef CONFIG_ARM
-	dmac_flush_range(vastart, vaend);
-	outer_flush_range(virt_to_phys(vastart), virt_to_phys(vaend));
-#elif defined(CONFIG_ARM64)
-	__dma_flush_range(vastart, vaend);
-	//flush_cache_all();
-#endif
-}
-
-static void dump_pagetbl(dma_addr_t fault_address, u32 addr_dte)
-{
-	u32 dte_index, pte_index, page_offset;
-	u32 mmu_dte_addr;
-	phys_addr_t mmu_dte_addr_phys, dte_addr_phys;
-	u32 *dte_addr;
-	u32 dte;
-	phys_addr_t pte_addr_phys = 0;
-	u32 *pte_addr = NULL;
-	u32 pte = 0;
-	phys_addr_t page_addr_phys = 0;
-	u32 page_flags = 0;
-
-	dte_index = rockchip_lv1ent_offset(fault_address);
-	pte_index = rockchip_lv2ent_offset(fault_address);
-	page_offset = (u32)(fault_address & 0x00000fff);
-
-	mmu_dte_addr = addr_dte;
-	mmu_dte_addr_phys = (phys_addr_t)mmu_dte_addr;
-
-	dte_addr_phys = mmu_dte_addr_phys + (4 * dte_index);
-	dte_addr = phys_to_virt(dte_addr_phys);
-	dte = *dte_addr;
-
-	if (!(IOMMU_FLAGS_PRESENT & dte))
-		goto print_it;
-
-	pte_addr_phys = ((phys_addr_t)dte & 0xfffff000) + (pte_index * 4);
-	pte_addr = phys_to_virt(pte_addr_phys);
-	pte = *pte_addr;
-
-	if (!(IOMMU_FLAGS_PRESENT & pte))
-		goto print_it;
-
-	page_addr_phys = ((phys_addr_t)pte & 0xfffff000) + page_offset;
-	page_flags = pte & 0x000001fe;
-
-print_it:
-	pr_err("iova = %pad: dte_index: 0x%03x pte_index: 0x%03x page_offset: 0x%03x\n",
-		&fault_address, dte_index, pte_index, page_offset);
-	pr_err("mmu_dte_addr: %pa dte@%pa: %#08x valid: %u pte@%pa: %#08x valid: %u page@%pa flags: %#03x\n",
-		&mmu_dte_addr_phys, &dte_addr_phys, dte,
-		(dte & IOMMU_FLAGS_PRESENT), &pte_addr_phys, pte,
-		(pte & IOMMU_FLAGS_PRESENT), &page_addr_phys, page_flags);
-}
-
-static irqreturn_t rockchip_iommu_irq(int irq, void *dev_id)
-{
-	/* SYSMMU is in blocked when interrupt occurred. */
-	struct iommu_drvdata *data = dev_id;
-	u32 status;
-	u32 rawstat;
-	dma_addr_t fault_address;
-	int i;
-	unsigned long flags;
-	int ret;
-	u32 reg_status;
-
-	spin_lock_irqsave(&data->data_lock, flags);
-
-	if (!rockchip_is_iommu_active(data)) {
-		spin_unlock_irqrestore(&data->data_lock, flags);
-		return IRQ_HANDLED;
-	}
-
-	for (i = 0; i < data->num_res_mem; i++) {
-		status = __raw_readl(data->res_bases[i] +
-				     IOMMU_REGISTER_INT_STATUS);
-		if (status == 0)
-			continue;
-
-		rawstat = __raw_readl(data->res_bases[i] +
-				      IOMMU_REGISTER_INT_RAWSTAT);
-
-		reg_status = __raw_readl(data->res_bases[i] +
-				      	 IOMMU_REGISTER_STATUS);
-
-		dev_info(data->iommu, "1.rawstat = 0x%08x,status = 0x%08x,reg_status = 0x%08x\n",
-			 rawstat, status, reg_status);
-
-		if (rawstat & IOMMU_INTERRUPT_PAGE_FAULT) {
-			u32 dte;
-			int flags;
-
-			fault_address = __raw_readl(data->res_bases[i] +
-				   	    IOMMU_REGISTER_PAGE_FAULT_ADDR);
-
-			dte = __raw_readl(data->res_bases[i] +
-					  IOMMU_REGISTER_DTE_ADDR);
-
-			flags = (status & 32) ? 1 : 0;
-
-			dev_err(data->iommu, "Page fault detected at %pad from bus id %d of type %s on %s\n",
-				&fault_address, (status >> 6) & 0x1F,
-				(flags == 1) ? "write" : "read", data->dbgname);
-
-			dump_pagetbl(fault_address, dte);
-
-			if (data->domain)
-				report_iommu_fault(data->domain, data->iommu,
-						   fault_address, flags);
-			if (data->fault_handler)
-				data->fault_handler(data->master, IOMMU_PAGEFAULT, dte, fault_address, 1);
-
-			rockchip_iommu_page_fault_done(data->res_bases[i],
-					               data->dbgname);
-		}
-
-		if (rawstat & IOMMU_INTERRUPT_READ_BUS_ERROR) {
-			dev_err(data->iommu, "bus error occured at %pad\n",
-				&fault_address);
-		}
-
-		if (rawstat & ~(IOMMU_INTERRUPT_READ_BUS_ERROR |
-		    IOMMU_INTERRUPT_PAGE_FAULT)) {
-	    		dev_err(data->iommu, "unexpected int_status: %#08x\n\n",
-	    			rawstat);
-		}
-
-		__raw_writel(rawstat, data->res_bases[i] +
-			     IOMMU_REGISTER_INT_CLEAR);
-
-		status = __raw_readl(data->res_bases[i] +
-				     IOMMU_REGISTER_INT_STATUS);
-
-		rawstat = __raw_readl(data->res_bases[i] +
-				      IOMMU_REGISTER_INT_RAWSTAT);
-
-		reg_status = __raw_readl(data->res_bases[i] +
-				      	 IOMMU_REGISTER_STATUS);
-
-		dev_info(data->iommu, "2.rawstat = 0x%08x,status = 0x%08x,reg_status = 0x%08x\n",
-			 rawstat, status, reg_status);
-
-		ret = rockchip_iommu_zap_tlb_without_stall(data->res_bases[i]);
-		if (ret)
-			dev_err(data->iommu, "(%s) %s failed\n", data->dbgname,
-				__func__);
-	}
-
-	spin_unlock_irqrestore(&data->data_lock, flags);
-	return IRQ_HANDLED;
-}
-
-static bool rockchip_iommu_disable(struct iommu_drvdata *data)
-{
-	unsigned long flags;
-	int i;
-	bool ret = false;
-
-	spin_lock_irqsave(&data->data_lock, flags);
-
-	if (!rockchip_set_iommu_inactive(data)) {
-		spin_unlock_irqrestore(&data->data_lock, flags);
-		dev_info(data->iommu,"(%s) %d times left to be disabled\n",
-			 data->dbgname, data->activations);
-		return ret;
-	}
-
-	for (i = 0; i < data->num_res_mem; i++) {
-		ret = rockchip_iommu_enable_stall(data->res_bases[i]);
-		if (!ret) {
-			dev_info(data->iommu, "(%s), %s failed\n",
-				 data->dbgname, __func__);
-			spin_unlock_irqrestore(&data->data_lock, flags);
-			return false;
-		}
-
-		__raw_writel(0, data->res_bases[i] + IOMMU_REGISTER_INT_MASK);
-
-		ret = rockchip_iommu_disable_paging(data->res_bases[i]);
-		if (!ret) {
-			rockchip_iommu_disable_stall(data->res_bases[i]);
-			spin_unlock_irqrestore(&data->data_lock, flags);
-			dev_info(data->iommu, "%s error\n", __func__);
-			return ret;
-		}
-		rockchip_iommu_disable_stall(data->res_bases[i]);
-	}
-
-	data->pgtable = 0;
-
-	spin_unlock_irqrestore(&data->data_lock, flags);
-
-	dev_dbg(data->iommu,"(%s) Disabled\n", data->dbgname);
-
-	return ret;
-}
-
-/* __rk_sysmmu_enable: Enables System MMU
- *
- * returns -error if an error occurred and System MMU is not enabled,
- * 0 if the System MMU has been just enabled and 1 if System MMU was already
- * enabled before.
- */
-static int rockchip_iommu_enable(struct iommu_drvdata *data, unsigned int pgtable)
-{
-	int i, ret = 0;
-	unsigned long flags;
-
-	spin_lock_irqsave(&data->data_lock, flags);
-
-	if (!rockchip_set_iommu_active(data)) {
-		if (WARN_ON(pgtable != data->pgtable))
-			ret = -EBUSY;
-		else
-			ret = 1;
-
-		dev_info(data->iommu, "(%s) Already enabled\n", data->dbgname);
-
-		goto enable_out;
-	}
-
-	for (i = 0; i < data->num_res_mem; i++) {
-		ret = rockchip_iommu_enable_stall(data->res_bases[i]);
-		if (!ret) {
-			dev_info(data->iommu, "(%s), %s failed\n",
-				 data->dbgname, __func__);
-			ret = -EBUSY;
-			goto enable_out;
-		}
-
-		if (!strstr(data->dbgname, "isp")) {
-			if (!rockchip_iommu_reset(data->res_bases[i],
-			     data->dbgname)) {
-				rockchip_iommu_disable_stall(data->res_bases[i]);
-				ret = -ENOENT;
-				goto enable_out;
-			}
-		}
-
-		rockchip_iommu_set_ptbase(data->res_bases[i], pgtable);
-
-		__raw_writel(IOMMU_COMMAND_ZAP_CACHE, data->res_bases[i] +
-			     IOMMU_REGISTER_COMMAND);
-
-		if (strstr(data->dbgname, "isp")) {
-			__raw_writel(IOMMU_INTERRUPT_PAGE_FAULT |
-				IOMMU_INTERRUPT_READ_BUS_ERROR,
-			     data->res_bases[i] + IOMMU_REGISTER_INT_MASK);
-		}
-
-		ret = rockchip_iommu_enable_paging(data->res_bases[i]);
-		if (!ret) {
-			dev_info(data->iommu, "(%s), %s failed\n",
-				 data->dbgname, __func__);
-			rockchip_iommu_disable_stall(data->res_bases[i]);
-			ret = -EBUSY;
-			goto enable_out;
-		}
-
-		rockchip_iommu_disable_stall(data->res_bases[i]);
-	}
-
-	data->pgtable = pgtable;
-	spin_unlock_irqrestore(&data->data_lock, flags);
-
-	dev_dbg(data->iommu,"(%s) Enabled\n", data->dbgname);
-
-	return 0;
-
-enable_out:
-	rockchip_set_iommu_inactive(data);
-	spin_unlock_irqrestore(&data->data_lock, flags);
-
-	return ret;
-}
-
-int rockchip_iommu_tlb_invalidate_global(struct device *dev)
-{
-	unsigned long flags;
-	struct iommu_drvdata *data = dev_get_drvdata(dev->archdata.iommu);
-	int ret = 0;
-
-	spin_lock_irqsave(&data->data_lock, flags);
-
-	if (rockchip_is_iommu_active(data)) {
-		int i;
-
-		for (i = 0; i < data->num_res_mem; i++) {
-			ret = rockchip_iommu_zap_tlb(data->res_bases[i]);
-			if (ret)
-				dev_err(dev->archdata.iommu, "(%s) %s failed\n",
-					data->dbgname, __func__);
-		}
-	} else {
-		dev_dbg(dev->archdata.iommu, "(%s) Disabled. Skipping invalidating TLB.\n",
-			data->dbgname);
-		ret = -1;
-	}
-
-	spin_unlock_irqrestore(&data->data_lock, flags);
-
-	return ret;
-}
-
-int rockchip_iommu_tlb_invalidate(struct device *dev)
-{
-	unsigned long flags;
-	struct iommu_drvdata *data = dev_get_drvdata(dev->archdata.iommu);
-
-	if (strstr(data->dbgname, "vpu") || strstr(data->dbgname, "hevc"))
-			return 0;
-
-	spin_lock_irqsave(&data->data_lock, flags);
-
-	if (rockchip_is_iommu_active(data)) {
-		int i;
-		int ret;
-
-		for (i = 0; i < data->num_res_mem; i++) {
-			ret = rockchip_iommu_zap_tlb(data->res_bases[i]);
-			if (ret) {
-				dev_err(dev->archdata.iommu, "(%s) %s failed\n",
-					data->dbgname, __func__);
-				spin_unlock_irqrestore(&data->data_lock, flags);
-				return ret;
-			}
-				
-		}
-	} else {
-		dev_dbg(dev->archdata.iommu, "(%s) Disabled. Skipping invalidating TLB.\n",
-			data->dbgname);
-	}
-
-	spin_unlock_irqrestore(&data->data_lock, flags);
-
-	return 0;
-}
-
-static phys_addr_t rockchip_iommu_iova_to_phys(struct iommu_domain *domain,
-					       dma_addr_t iova)
-{
-	struct rk_iommu_domain *priv = to_rk_domain(domain);
-	unsigned int *entry;
-	unsigned long flags;
-	phys_addr_t phys = 0;
-
-	spin_lock_irqsave(&priv->pgtablelock, flags);
-
-	entry = rockchip_section_entry(priv->pgtable, iova);
-	entry = rockchip_page_entry(entry, iova);
-	phys = rockchip_spage_phys(entry) + rockchip_spage_offs(iova);
-
-	spin_unlock_irqrestore(&priv->pgtablelock, flags);
-
-	return phys;
-}
-
-static int rockchip_lv2set_page(unsigned int *pent, phys_addr_t paddr,
-		       size_t size, short *pgcnt)
-{
-	if (!rockchip_lv2ent_fault(pent))
-		return -EADDRINUSE;
-
-	*pent = rockchip_mk_lv2ent_spage(paddr);
-	rockchip_pgtable_flush(pent, pent + 1);
-	*pgcnt -= 1;
-	return 0;
-}
-
-static unsigned int *rockchip_alloc_lv2entry(unsigned int *sent,
-				     unsigned long iova, short *pgcounter)
-{
-	if (rockchip_lv1ent_fault(sent)) {
-		unsigned int *pent;
-
-		pent = kmem_cache_zalloc(lv2table_kmem_cache, GFP_ATOMIC);
-		BUG_ON((unsigned long)pent & (LV2TABLE_SIZE - 1));
-		if (!pent)
-			return NULL;
-
-		*sent = rockchip_mk_lv1ent_page(virt_to_phys(pent));
-		kmemleak_ignore(pent);
-		*pgcounter = NUM_LV2ENTRIES;
-		rockchip_pgtable_flush(pent, pent + NUM_LV2ENTRIES);
-		rockchip_pgtable_flush(sent, sent + 1);
-	}
-	return rockchip_page_entry(sent, iova);
-}
-
-static size_t rockchip_iommu_unmap(struct iommu_domain *domain,
-				   unsigned long iova, size_t size)
-{
-	struct rk_iommu_domain *priv = to_rk_domain(domain);
-	unsigned long flags;
-	unsigned int *ent;
-
-	BUG_ON(priv->pgtable == NULL);
-
-	spin_lock_irqsave(&priv->pgtablelock, flags);
-
-	ent = rockchip_section_entry(priv->pgtable, iova);
-
-	if (unlikely(rockchip_lv1ent_fault(ent))) {
-		if (size > SPAGE_SIZE)
-			size = SPAGE_SIZE;
-		goto done;
-	}
-
-	/* lv1ent_page(sent) == true here */
-
-	ent = rockchip_page_entry(ent, iova);
-
-	if (unlikely(rockchip_lv2ent_fault(ent))) {
-		size = SPAGE_SIZE;
-		goto done;
-	}
-
-	*ent = 0;
-	size = SPAGE_SIZE;
-	priv->lv2entcnt[rockchip_lv1ent_offset(iova)] += 1;
-	goto done;
-
-done:
-	pr_debug("%s:unmap iova 0x%lx/%zx bytes\n",
-		  __func__, iova,size);
-	spin_unlock_irqrestore(&priv->pgtablelock, flags);
-
-	return size;
-}
-
-static int rockchip_iommu_map(struct iommu_domain *domain, unsigned long iova,
-			      phys_addr_t paddr, size_t size, int prot)
-{
-	struct rk_iommu_domain *priv = to_rk_domain(domain);
-	unsigned int *entry;
-	unsigned long flags;
-	int ret = -ENOMEM;
-	unsigned int *pent;
-
-	BUG_ON(priv->pgtable == NULL);
-
-	spin_lock_irqsave(&priv->pgtablelock, flags);
-
-	entry = rockchip_section_entry(priv->pgtable, iova);
-
-	pent = rockchip_alloc_lv2entry(entry, iova,
-			      &priv->lv2entcnt[rockchip_lv1ent_offset(iova)]);
-	if (!pent)
-		ret = -ENOMEM;
-	else
-		ret = rockchip_lv2set_page(pent, paddr, size,
-				&priv->lv2entcnt[rockchip_lv1ent_offset(iova)]);
-
-	if (ret) {
-		pr_info("%s: Failed to map iova 0x%lx/%zx bytes\n", __func__,
-		       iova, size);
-	}
-	spin_unlock_irqrestore(&priv->pgtablelock, flags);
-
-	return ret;
-}
-
-static void rockchip_iommu_detach_device(struct iommu_domain *domain, struct device *dev)
-{
-	struct iommu_drvdata *data = dev_get_drvdata(dev->archdata.iommu);
-	struct rk_iommu_domain *priv = to_rk_domain(domain);
-	struct list_head *pos;
-	unsigned long flags;
-	bool found = false;
-
-	spin_lock_irqsave(&priv->lock, flags);
-
-	list_for_each(pos, &priv->clients) {
-		if (list_entry(pos, struct iommu_drvdata, node) == data) {
-			found = true;
-			break;
-		}
-	}
-
-	if (!found) {
-		spin_unlock_irqrestore(&priv->lock, flags);
-		return;
-	}
-
-	if (rockchip_iommu_disable(data)) {
-		if (!(strstr(data->dbgname, "vpu") || strstr(data->dbgname, "hevc")))
-			dev_dbg(dev->archdata.iommu,"%s: Detached IOMMU with pgtable %08lx\n",
-				__func__, (unsigned long)virt_to_phys(priv->pgtable));
-		data->domain = NULL;
-		list_del_init(&data->node);
-
-	} else
-		dev_err(dev->archdata.iommu,"%s: Detaching IOMMU with pgtable %08lx delayed",
-			__func__, (unsigned long)virt_to_phys(priv->pgtable));
-
-	spin_unlock_irqrestore(&priv->lock, flags);
-}
-
-static int rockchip_iommu_attach_device(struct iommu_domain *domain, struct device *dev)
-{
-	struct iommu_drvdata *data = dev_get_drvdata(dev->archdata.iommu);
-	struct rk_iommu_domain *priv = to_rk_domain(domain);
-	unsigned long flags;
-	int ret;
-
-	spin_lock_irqsave(&priv->lock, flags);
-
-	ret = rockchip_iommu_enable(data, virt_to_phys(priv->pgtable));
-
-	if (ret == 0) {
-		/* 'data->node' must not be appeared in priv->clients */
-		BUG_ON(!list_empty(&data->node));
-		list_add_tail(&data->node, &priv->clients);
-		data->domain = domain;
-		data->master = dev;
-	}
-
-	spin_unlock_irqrestore(&priv->lock, flags);
-
-	if (ret < 0) {
-		dev_err(dev->archdata.iommu,"%s: Failed to attach IOMMU with pgtable %x\n",
-		       __func__, (unsigned int)virt_to_phys(priv->pgtable));
-	} else if (ret > 0) {
-		dev_dbg(dev->archdata.iommu,"%s: IOMMU with pgtable 0x%x already attached\n",
-			__func__, (unsigned int)virt_to_phys(priv->pgtable));
-	} else {
-		if (!(strstr(data->dbgname, "vpu") ||
-		      strstr(data->dbgname, "hevc") ||
-		      strstr(data->dbgname, "vdec")))
-			dev_info(dev->archdata.iommu,"%s: Attached new IOMMU with pgtable 0x%x\n",
-				__func__, (unsigned int)virt_to_phys(priv->pgtable));
-	}
-
-	return ret;
-}
-
-static void rockchip_iommu_domain_free(struct iommu_domain *domain)
-{
-	struct rk_iommu_domain *priv = to_rk_domain(domain);
-	int i;
-
-	WARN_ON(!list_empty(&priv->clients));
-
-	for (i = 0; i < NUM_LV1ENTRIES; i++)
-		if (rockchip_lv1ent_page(priv->pgtable + i))
-			kmem_cache_free(lv2table_kmem_cache,
-					phys_to_virt(rockchip_lv2table_base(priv->pgtable + i)));
-
-	free_pages((unsigned long)priv->pgtable, 0);
-	free_pages((unsigned long)priv->lv2entcnt, 0);
-	kfree(priv);
-}
-
-static struct iommu_domain *rockchip_iommu_domain_alloc(unsigned type)
-{
-	struct rk_iommu_domain *priv;
-
-	if (type != IOMMU_DOMAIN_UNMANAGED)
-		return NULL;
-
-	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
-	if (!priv)
-		return NULL;
-
-/*rk32xx iommu use 2 level pagetable,
-   level1 and leve2 both have 1024 entries,each entry  occupy 4 bytes,
-   so alloc a page size for each page table
-*/
-	priv->pgtable = (unsigned int *)__get_free_pages(GFP_KERNEL |
-							  __GFP_ZERO, 0);
-	if (!priv->pgtable)
-		goto err_pgtable;
-
-	priv->lv2entcnt = (short *)__get_free_pages(GFP_KERNEL |
-						    __GFP_ZERO, 0);
-	if (!priv->lv2entcnt)
-		goto err_counter;
-
-	rockchip_pgtable_flush(priv->pgtable, priv->pgtable + NUM_LV1ENTRIES);
-
-	spin_lock_init(&priv->lock);
-	spin_lock_init(&priv->pgtablelock);
-	INIT_LIST_HEAD(&priv->clients);
-
-	return &priv->domain;
-
-err_counter:
-	free_pages((unsigned long)priv->pgtable, 0);
-err_pgtable:
-	kfree(priv);
-	return NULL;
-}
-
-static struct iommu_ops rk_iommu_ops = {
-	.domain_alloc = rockchip_iommu_domain_alloc,
-	.domain_free = rockchip_iommu_domain_free,
-	.attach_dev = rockchip_iommu_attach_device,
-	.detach_dev = rockchip_iommu_detach_device,
-	.map = rockchip_iommu_map,
-	.unmap = rockchip_iommu_unmap,
-	.iova_to_phys = rockchip_iommu_iova_to_phys,
-	.pgsize_bitmap = SPAGE_SIZE,
-};
-
-static int  rockchip_get_iommu_resource_num(struct platform_device *pdev,
-					     unsigned int type)
-{
-	int num = 0;
-	int i;
-
-	for (i = 0; i < pdev->num_resources; i++) {
-		struct resource *r = &pdev->resource[i];
-		if (type == resource_type(r))
-			num++;
-	}
-
-	return num;
-}
-
-static int rockchip_iommu_probe(struct platform_device *pdev)
-{
-	int i, ret;
-	struct device *dev;
-	struct iommu_drvdata *data;
-	
-	dev = &pdev->dev;
-
-	data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
-	if (!data) {
-		dev_dbg(dev, "Not enough memory\n");
-		return -ENOMEM;
-	}
-
-	dev_set_drvdata(dev, data);
-
-	if (pdev->dev.of_node)
-		of_property_read_string(pdev->dev.of_node, "dbgname",
-					&(data->dbgname));
-	else
-		dev_dbg(dev, "dbgname not assigned in device tree or device node not exist\r\n");
-
-	dev_info(dev,"(%s) Enter\n", data->dbgname);
-	
-	data->num_res_mem = rockchip_get_iommu_resource_num(pdev,
-				IORESOURCE_MEM);
-	if (0 == data->num_res_mem) {
-		dev_err(dev,"can't find iommu memory resource \r\n");
-		return -ENOMEM;
-	}
-	dev_dbg(dev,"data->num_res_mem=%d\n", data->num_res_mem);
-
-	data->num_res_irq = rockchip_get_iommu_resource_num(pdev,
-				IORESOURCE_IRQ);
-	if (0 == data->num_res_irq) {
-		dev_err(dev,"can't find iommu irq resource \r\n");
-		return -ENOMEM;
-	}
-	dev_dbg(dev,"data->num_res_irq=%d\n", data->num_res_irq);
-
-	data->res_bases = devm_kmalloc_array(dev, data->num_res_mem,
-				sizeof(*data->res_bases), GFP_KERNEL);
-	if (data->res_bases == NULL) {
-		dev_err(dev, "Not enough memory\n");
-		return -ENOMEM;
-	}
-
-	for (i = 0; i < data->num_res_mem; i++) {
-		struct resource *res;
-
-		res = platform_get_resource(pdev, IORESOURCE_MEM, i);
-		if (!res) {
-			dev_err(dev,"Unable to find IOMEM region\n");
-			return -ENOENT;
-		}
-
-		data->res_bases[i] = devm_ioremap(dev,res->start,
-						  resource_size(res));
-		if (!data->res_bases[i]) {
-			dev_err(dev, "Unable to map IOMEM @ PA:%pa\n",
-				&res->start);
-			return -ENOMEM;
-		}
-
-		dev_dbg(dev,"res->start = 0x%pa ioremap to data->res_bases[%d] = %p\n",
-			&res->start, i, data->res_bases[i]);
-
-		if (strstr(data->dbgname, "vop") &&
-		    (soc_is_rk3128() || soc_is_rk3126())) {
-			rk312x_vop_mmu_base = data->res_bases[0];
-			dev_dbg(dev, "rk312x_vop_mmu_base = %p\n",
-				rk312x_vop_mmu_base);
-		}
-	}
-
-	for (i = 0; i < data->num_res_irq; i++) {
-		if ((soc_is_rk3128() || soc_is_rk3126()) &&
-		    strstr(data->dbgname, "vop")) {
-			dev_info(dev, "skip request vop mmu irq\n");
-			continue;
-		}
-
-		ret = platform_get_irq(pdev, i);
-		if (ret <= 0) {
-			dev_err(dev,"Unable to find IRQ resource\n");
-			return -ENOENT;
-		}
-
-		ret = devm_request_irq(dev, ret, rockchip_iommu_irq,
-				  IRQF_SHARED, dev_name(dev), data);
-		if (ret) {
-			dev_err(dev, "Unabled to register interrupt handler\n");
-			return -ENOENT;
-		}
-	}
-
-	ret = rockchip_init_iovmm(dev, &data->vmm);
-	if (ret)
-		return ret;
-
-	data->iommu = dev;
-	spin_lock_init(&data->data_lock);
-	INIT_LIST_HEAD(&data->node);
-
-	dev_info(dev,"(%s) Initialized\n", data->dbgname);
-
-	return 0;
-}
-
-#ifdef CONFIG_OF
-static const struct of_device_id iommu_dt_ids[] = {
-	{ .compatible = IEP_IOMMU_COMPATIBLE_NAME},
-	{ .compatible = VIP_IOMMU_COMPATIBLE_NAME},
-	{ .compatible = VOPB_IOMMU_COMPATIBLE_NAME},
-	{ .compatible = VOPL_IOMMU_COMPATIBLE_NAME},
-	{ .compatible = HEVC_IOMMU_COMPATIBLE_NAME},
-	{ .compatible = VPU_IOMMU_COMPATIBLE_NAME},
-	{ .compatible = ISP_IOMMU_COMPATIBLE_NAME},
-	{ .compatible = ISP0_IOMMU_COMPATIBLE_NAME},
-	{ .compatible = ISP1_IOMMU_COMPATIBLE_NAME},
-	{ .compatible = VOP_IOMMU_COMPATIBLE_NAME},
-	{ .compatible = VDEC_IOMMU_COMPATIBLE_NAME},
-	{ /* end */ }
-};
-
-MODULE_DEVICE_TABLE(of, iommu_dt_ids);
-#endif
-
-static struct platform_driver rk_iommu_driver = {
-	.probe = rockchip_iommu_probe,
-	.remove = NULL,
-	.driver = {
-		   .name = "rk_iommu",
-		   .owner = THIS_MODULE,
-		   .of_match_table = of_match_ptr(iommu_dt_ids),
-	},
-};
-
-static int __init rockchip_iommu_init_driver(void)
-{
-	struct device_node *np;
-	int ret;
-
-	np = of_find_matching_node(NULL, iommu_dt_ids);
-	if (!np) {
-		pr_err("Failed to find legacy iommu devices\n");
-		return -ENODEV;
-	}
-
-	lv2table_kmem_cache = kmem_cache_create("rk-iommu-lv2table",
-						LV2TABLE_SIZE, LV2TABLE_SIZE,
-						0, NULL);
-	if (!lv2table_kmem_cache) {
-		pr_info("%s: failed to create kmem cache\n", __func__);
-		return -ENOMEM;
-	}
-
-	ret = bus_set_iommu(&platform_bus_type, &rk_iommu_ops);
-	if (ret)
-		return ret;
-
-	return platform_driver_register(&rk_iommu_driver);
-}
-
-core_initcall(rockchip_iommu_init_driver);
diff --git a/drivers/iommu/rk-iommu.h b/drivers/iommu/rk-iommu.h
deleted file mode 100644
index 80e6f6fb3e39..000000000000
--- a/drivers/iommu/rk-iommu.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Data structure definition for Rockchip IOMMU driver
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-#ifndef __ASM_PLAT_IOMMU_H
-#define __ASM_PLAT_IOMMU_H
-
-#include <linux/kernel.h>
-#include <linux/spinlock.h>
-#include <linux/list.h>
-#include <linux/device.h>
-#include <linux/platform_device.h>
-#include <linux/genalloc.h>
-#include <linux/iommu.h>
-
-#include <linux/rockchip-iovmm.h>
-
-
-struct rk_iovmm {
-	struct iommu_domain *domain; /* iommu domain for this iovmm */
-	struct gen_pool *vmm_pool;
-	struct list_head regions_list;	/* list of rk_vm_region */
-	spinlock_t lock; /* lock for updating regions_list */
-};
-
-struct iommu_drvdata {
-	struct list_head node; /* entry of rk_iommu_domain.clients */
-	struct device *iommu;	/*  IOMMU's device descriptor */
-	struct device *master; /* IOMMU's master device descriptor */
-	int num_res_mem;
-	int num_res_irq;
-	const char *dbgname;
-	void __iomem **res_bases;
-	int activations;
-	spinlock_t data_lock;
-	struct iommu_domain *domain; /* domain given to iommu_attach_device() */
-	unsigned int pgtable;
-	struct rk_iovmm vmm;
-	rockchip_iommu_fault_handler_t fault_handler;
-};
-
-#ifdef CONFIG_RK_IOVMM
-
-#define IOVA_START 0x10000000
-#define IOVM_SIZE (SZ_1G - SZ_4K) /* last 4K is for error values */
-
-struct rk_vm_region {
-	struct list_head node;
-	unsigned int start;
-	unsigned int size;
-};
-
-static inline struct rk_iovmm *rockchip_get_iovmm(struct device *dev)
-{
-	struct iommu_drvdata *data = dev_get_drvdata(dev->archdata.iommu);
-
-	BUG_ON(!dev->archdata.iommu || !data);
-
-	return &data->vmm;
-}
-
-int rockchip_init_iovmm(struct device *iommu, struct rk_iovmm *vmm);
-#else
-static inline int rockchip_init_iovmm(struct device *iommu,
-				struct rk_iovmm *vmm)
-{
-	return -ENOSYS;
-}
-#endif
-
-
-#ifdef CONFIG_RK_IOMMU
-
-/**
- * rockchip_iommu_tlb_invalidate() - flush all TLB entry in iommu
- * @owner: The device whose IOMMU.
- *
- * This function flush all TLB entry in iommu
- */
-int rockchip_iommu_tlb_invalidate(struct device *owner);
-int rockchip_iommu_tlb_invalidate_global(struct device *owner);
-
-#else /* CONFIG_RK_IOMMU */
-static inline int rockchip_iommu_tlb_invalidate(struct device *owner)
-{
-	return -1;
-}
-static int rockchip_iommu_tlb_invalidate_global(struct device *owner)
-{
-	return -1;
-}
-
-#endif
-
-#endif	/*__ASM_PLAT_IOMMU_H*/
diff --git a/drivers/iommu/rk-iovmm.c b/drivers/iommu/rk-iovmm.c
deleted file mode 100644
index 087ccf60fe77..000000000000
--- a/drivers/iommu/rk-iovmm.c
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifdef CONFIG_ROCKCHIP_IOMMU_DEBUG
-#define DEBUG
-#endif
-
-#include <linux/kernel.h>
-#include <linux/hardirq.h>
-#include <linux/slab.h>
-#include <linux/scatterlist.h>
-#include <linux/err.h>
-
-#include <linux/of.h>
-#include <linux/of_platform.h>
-
-#include "rk-iommu.h"
-
-#define IOMMU_REGION_GUARD		(2<<PAGE_SHIFT)
-
-static struct rk_vm_region *find_region(struct rk_iovmm *vmm, dma_addr_t iova)
-{
-	struct rk_vm_region *region;
-
-	list_for_each_entry(region, &vmm->regions_list, node)
-		if (region->start == iova)
-			return region;
-
-	return NULL;
-}
-
-int rockchip_iovmm_invalidate_tlb(struct device *dev)
-{
-	int ret = rockchip_iommu_tlb_invalidate_global(dev);
-
-	return ret;
-}
-EXPORT_SYMBOL(rockchip_iovmm_invalidate_tlb);
-
-void rockchip_iovmm_set_fault_handler(struct device *dev,
-				       rockchip_iommu_fault_handler_t handler)
-{
-	struct iommu_drvdata *data = dev_get_drvdata(dev->archdata.iommu);
-
-	data->fault_handler = handler;
-}
-EXPORT_SYMBOL(rockchip_iovmm_set_fault_handler);
-
-int rockchip_iovmm_activate(struct device *dev)
-{
-	struct rk_iovmm *vmm = rockchip_get_iovmm(dev);
-
-	return iommu_attach_device(vmm->domain, dev);
-}
-EXPORT_SYMBOL(rockchip_iovmm_activate);
-
-void rockchip_iovmm_deactivate(struct device *dev)
-{
-	struct rk_iovmm *vmm = rockchip_get_iovmm(dev);
-
-	iommu_detach_device(vmm->domain, dev);
-}
-EXPORT_SYMBOL(rockchip_iovmm_deactivate);
-
-dma_addr_t rockchip_iovmm_map(struct device *dev,
-	struct scatterlist *sg, off_t offset, size_t size)
-{
-	off_t start_off;
-	dma_addr_t addr, start = 0;
-	size_t mapped_size = 0;
-	struct rk_vm_region *region;
-	struct rk_iovmm *vmm = rockchip_get_iovmm(dev);
-	int order;
-	int ret;
-
-	for (; sg->length < offset; sg = sg_next(sg))
-		offset -= sg->length;
-
-	start_off = offset_in_page(sg_phys(sg) + offset);
-	size = PAGE_ALIGN(size + start_off);
-
-	order = __fls(min_t(size_t, size, SZ_1M));
-
-	region = kmalloc(sizeof(*region), GFP_KERNEL);
-	if (!region) {
-		ret = -ENOMEM;
-		goto err_map_nomem;
-	}
-
-	start = (dma_addr_t)gen_pool_alloc(vmm->vmm_pool,
-					   size+IOMMU_REGION_GUARD);
-	if (!start) {
-		ret = -ENOMEM;
-		goto err_map_noiomem;
-	}
-
-	pr_debug("%s: size = %zx\n", __func__, size);
-
-	addr = start;
-	do {
-		phys_addr_t phys;
-		size_t len;
-
-		phys = sg_phys(sg);
-		len = sg->length;
-
-		/* if back to back sg entries are contiguous consolidate them */
-		while (sg_next(sg) && sg_phys(sg) + sg->length == sg_phys(sg_next(sg))) {
-			sg = sg_next(sg);
-			len += sg->length;
-		}
-
-		if (offset > 0) {
-			len -= offset;
-			phys += offset;
-			offset = 0;
-		}
-
-		if (offset_in_page(phys)) {
-			len += offset_in_page(phys);
-			phys = round_down(phys, PAGE_SIZE);
-		}
-
-		len = PAGE_ALIGN(len);
-
-		if (len > (size - mapped_size))
-			len = size - mapped_size;
-		pr_debug("addr = %pad, phys = %pa, len = %zx\n", &addr, &phys, len);
-		ret = iommu_map(vmm->domain, addr, phys, len, 0);
-		if (ret)
-			break;
-
-		addr += len;
-		mapped_size += len;
-	} while ((sg = sg_next(sg)) && (mapped_size < size));
-
-	BUG_ON(mapped_size > size);
-
-	if (mapped_size < size)
-		goto err_map_map;
-
-	region->start = start + start_off;
-	region->size = size;
-
-	INIT_LIST_HEAD(&region->node);
-
-	spin_lock(&vmm->lock);
-
-	list_add(&region->node, &vmm->regions_list);
-
-	spin_unlock(&vmm->lock);
-
-	ret = rockchip_iommu_tlb_invalidate(dev);
-	if (ret) {
-		spin_lock(&vmm->lock);
-		list_del(&region->node);
-		spin_unlock(&vmm->lock);
-		goto err_map_map;
-	}
-	dev_dbg(dev->archdata.iommu, "IOVMM: Allocated VM region @ %p/%#X bytes.\n",
-	&region->start, region->size);
-
-	return region->start;
-
-err_map_map:
-	iommu_unmap(vmm->domain, start, mapped_size);
-	gen_pool_free(vmm->vmm_pool, start, size);
-err_map_noiomem:
-	kfree(region);
-err_map_nomem:
-	dev_err(dev->archdata.iommu, "IOVMM: Failed to allocated VM region for %zx bytes.\n", size);
-	return (dma_addr_t)ret;
-}
-
-void rockchip_iovmm_unmap(struct device *dev, dma_addr_t iova)
-{
-	struct rk_vm_region *region;
-	struct rk_iovmm *vmm = rockchip_get_iovmm(dev);
-	size_t unmapped_size;
-
-	/* This function must not be called in IRQ handlers */
-	BUG_ON(in_irq());
-
-	spin_lock(&vmm->lock);
-
-	region = find_region(vmm, iova);
-	if (WARN_ON(!region)) {
-		spin_unlock(&vmm->lock);
-		return;
-	}
-
-	list_del(&region->node);
-
-	spin_unlock(&vmm->lock);
-
-	region->start = round_down(region->start, PAGE_SIZE);
-
-	unmapped_size = iommu_unmap(vmm->domain,
-				    region->start, region->size);
-	/*
-	rockchip_iommu_tlb_invalidate(dev);
-	*/
-	gen_pool_free(vmm->vmm_pool, region->start,
-		      region->size+IOMMU_REGION_GUARD);
-
-	WARN_ON(unmapped_size != region->size);
-
-	dev_dbg(dev->archdata.iommu, "IOVMM: Unmapped %zx bytes from %pad.\n",
-		unmapped_size, &region->start);
-
-	kfree(region);
-}
-
-int rockchip_iovmm_map_oto(struct device *dev, phys_addr_t phys, size_t size)
-{
-	struct rk_vm_region *region;
-	struct rk_iovmm *vmm = rockchip_get_iovmm(dev);
-	int ret;
-
-	if (WARN_ON((phys + size) >= IOVA_START)) {
-		dev_err(dev->archdata.iommu, "Unable to create one to one mapping for %zx @ %pa\n",
-		       size, &phys);
-		return -EINVAL;
-	}
-
-	region = kmalloc(sizeof(*region), GFP_KERNEL);
-	if (!region)
-		return -ENOMEM;
-
-	if (WARN_ON(phys & ~PAGE_MASK))
-		phys = round_down(phys, PAGE_SIZE);
-
-
-	ret = iommu_map(vmm->domain, (dma_addr_t)phys, phys, size, 0);
-	if (ret < 0) {
-		kfree(region);
-		return ret;
-	}
-
-	region->start = (dma_addr_t)phys;
-	region->size = size;
-	INIT_LIST_HEAD(&region->node);
-
-	spin_lock(&vmm->lock);
-
-	list_add(&region->node, &vmm->regions_list);
-
-	spin_unlock(&vmm->lock);
-
-	ret = rockchip_iommu_tlb_invalidate(dev);
-	if (ret)
-		return ret;
-
-	return 0;
-}
-
-void rockchip_iovmm_unmap_oto(struct device *dev, phys_addr_t phys)
-{
-	struct rk_vm_region *region;
-	struct rk_iovmm *vmm = rockchip_get_iovmm(dev);
-	size_t unmapped_size;
-
-	/* This function must not be called in IRQ handlers */
-	BUG_ON(in_irq());
-
-	if (WARN_ON(phys & ~PAGE_MASK))
-		phys = round_down(phys, PAGE_SIZE);
-
-	spin_lock(&vmm->lock);
-
-	region = find_region(vmm, (dma_addr_t)phys);
-	if (WARN_ON(!region)) {
-		spin_unlock(&vmm->lock);
-		return;
-	}
-
-	list_del(&region->node);
-
-	spin_unlock(&vmm->lock);
-
-	unmapped_size = iommu_unmap(vmm->domain, region->start, region->size);
-	WARN_ON(unmapped_size != region->size);
-	dev_dbg(dev->archdata.iommu, "IOVMM: Unmapped %zx bytes from %pad.\n",
-	       unmapped_size, &region->start);
-
-	kfree(region);
-}
-
-int rockchip_init_iovmm(struct device *iommu, struct rk_iovmm *vmm)
-{
-	int ret = 0;
-
-	vmm->vmm_pool = gen_pool_create(PAGE_SHIFT, -1);
-	if (!vmm->vmm_pool) {
-		ret = -ENOMEM;
-		goto err_setup_genalloc;
-	}
-
-	/* (1GB - 4KB) addr space from 0x10000000 */
-	ret = gen_pool_add(vmm->vmm_pool, IOVA_START, IOVM_SIZE, -1);
-	if (ret)
-		goto err_setup_domain;
-
-	vmm->domain = iommu_domain_alloc(&platform_bus_type);
-	if (!vmm->domain) {
-		ret = -ENOMEM;
-		goto err_setup_domain;
-	}
-
-	spin_lock_init(&vmm->lock);
-
-	INIT_LIST_HEAD(&vmm->regions_list);
-
-	dev_info(iommu, "IOVMM: Created %#x B IOVMM from %#x.\n",
-		IOVM_SIZE, IOVA_START);
-	return 0;
-err_setup_domain:
-	gen_pool_destroy(vmm->vmm_pool);
-err_setup_genalloc:
-	dev_err(iommu, "IOVMM: Failed to create IOVMM (%d)\n", ret);
-
-	return ret;
-}
diff --git a/include/linux/rockchip-iovmm.h b/include/linux/rockchip-iovmm.h
index 73e2ff159e86..3005c745e5b8 100644
--- a/include/linux/rockchip-iovmm.h
+++ b/include/linux/rockchip-iovmm.h
@@ -50,69 +50,6 @@ typedef int (*rockchip_iommu_fault_handler_t)(struct device *dev,
 struct scatterlist;
 struct device;
 
-#ifdef CONFIG_RK_IOVMM
-
-int rockchip_iovmm_activate(struct device *dev);
-void rockchip_iovmm_deactivate(struct device *dev);
-
-/* rockchip_iovmm_map() - Maps a list of physical memory chunks
- * @dev: the owner of the IO address space where the mapping is created
- * @sg: list of physical memory chunks to map
- * @offset: length in bytes where the mapping starts
- * @size: how much memory to map in bytes. @offset + @size must not exceed
- *        total size of @sg
- *
- * This function returns mapped IO address in the address space of @dev.
- * Returns minus error number if mapping fails.
- * Caller must check its return code with IS_ERROR_VALUE() if the function
- * succeeded.
- *
- * The caller of this function must ensure that iovmm_cleanup() is not called
- * while this function is called.
- *
- */
-dma_addr_t rockchip_iovmm_map(struct device *dev, struct scatterlist *sg,
-		     off_t offset, size_t size);
-
-/* rockchip_iovmm_unmap() - unmaps the given IO address
- * @dev: the owner of the IO address space where @iova belongs
- * @iova: IO address that needs to be unmapped and freed.
- *
- * The caller of this function must ensure that iovmm_cleanup() is not called
- * while this function is called.
- */
-void rockchip_iovmm_unmap(struct device *dev, dma_addr_t iova);
-
-/* rockchip_iovmm_map_oto - create one to one mapping for the given physical address
- * @dev: the owner of the IO address space to map
- * @phys: physical address to map
- * @size: size of the mapping to create
- *
- * This function return 0 if mapping is successful. Otherwise, minus error
- * value.
- */
-int rockchip_iovmm_map_oto(struct device *dev, phys_addr_t phys, size_t size);
-
-/* rockchip_iovmm_unmap_oto - remove one to one mapping
- * @dev: the owner ofthe IO address space
- * @phys: physical address to remove mapping
- */
-void rockchip_iovmm_unmap_oto(struct device *dev, phys_addr_t phys);
-
-void rockchip_iovmm_set_fault_handler(struct device *dev,
-				       rockchip_iommu_fault_handler_t handler);
-/** rockchip_iovmm_set_fault_handler() - Fault handler for IOMMUs
- * Called when interrupt occurred by the IOMMUs
- * The device drivers of peripheral devices that has a IOMMU can implement
- * a fault handler to resolve address translation fault by IOMMU.
- * The meanings of return value and parameters are described below.
- *
- * return value: non-zero if the fault is correctly resolved.
- *		   zero if the fault is not handled.
- */
-
-int rockchip_iovmm_invalidate_tlb(struct device *dev);
-#else
 static inline int rockchip_iovmm_activate(struct device *dev)
 {
 	return -ENOSYS;
@@ -151,6 +88,4 @@ static inline int rockchip_iovmm_invalidate_tlb(struct device *dev)
 	return -ENOSYS;
 }
 
-#endif /* CONFIG_RK_IOVMM */
-
 #endif /*__ASM_PLAT_IOVMM_H*/

commit e867387ca22579c7b1cc35d9ae36f560836b06eb
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Mon Jul 12 20:29:43 2021 +0800

    drivers: rkflash: Notice it when the storage device is not support
    
    When the related print appears, it means that the SDK is too old
    and the storage driver needs to be updated.
    
    Change-Id: I63f45fba4cf52108c628f225ee23aa0819ca256f
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/rkflash/flash.c b/drivers/rkflash/flash.c
index 52be15969cda..276d18a08bd2 100644
--- a/drivers/rkflash/flash.c
+++ b/drivers/rkflash/flash.c
@@ -2,6 +2,8 @@
 
 /* Copyright (c) 2018 Rockchip Electronics Co. Ltd. */
 
+#define pr_fmt(fmt) "nandc: " fmt
+
 #include <linux/delay.h>
 #include <linux/kernel.h>
 #include <linux/slab.h>
@@ -450,8 +452,11 @@ u32 nandc_flash_init(void __iomem *nandc_addr)
 			    id_byte[0][1] != 0xA1 &&
 			    id_byte[0][1] != 0xAA &&
 			    id_byte[0][1] != 0xAC &&
-			    id_byte[0][1] != 0x6A)
+			    id_byte[0][1] != 0x6A) {
+				pr_err("The device not support yet!\n");
+
 				return FTL_UNSUPPORTED_FLASH;
+			}
 		}
 	}
 	if (id_byte[0][0] == 0x98 && (id_byte[0][4] & 0x80))
diff --git a/drivers/rkflash/sfc_nand.c b/drivers/rkflash/sfc_nand.c
index 7a94d97f99fe..08e12a9e7736 100644
--- a/drivers/rkflash/sfc_nand.c
+++ b/drivers/rkflash/sfc_nand.c
@@ -2,6 +2,8 @@
 
 /* Copyright (c) 2018 Rockchip Electronics Co. Ltd. */
 
+#define pr_fmt(fmt) "sfc_nand: " fmt
+
 #include <linux/bug.h>
 #include <linux/delay.h>
 #include <linux/kernel.h>
@@ -1037,8 +1039,11 @@ u32 sfc_nand_init(void)
 
 	p_nand_info = sfc_nand_get_info(id_byte);
 
-	if (!p_nand_info)
+	if (!p_nand_info) {
+		pr_err("The device not support yet!\n");
+
 		return (u32)FTL_UNSUPPORTED_FLASH;
+	}
 
 	sfc_nand_dev.manufacturer = id_byte[0];
 	sfc_nand_dev.mem_type = id_byte[1];
diff --git a/drivers/rkflash/sfc_nor.c b/drivers/rkflash/sfc_nor.c
index f7abe75a5b09..11cb4f31cbac 100644
--- a/drivers/rkflash/sfc_nor.c
+++ b/drivers/rkflash/sfc_nor.c
@@ -2,6 +2,8 @@
 
 /* Copyright (c) 2018 Rockchip Electronics Co. Ltd. */
 
+#define pr_fmt(fmt) "sfc_nor: " fmt
+
 #include <linux/bug.h>
 #include <linux/delay.h>
 #include <linux/kernel.h>
@@ -718,6 +720,8 @@ int snor_init(struct SFNOR_DEV *p_dev)
 	if (g_spi_flash_info) {
 		snor_parse_flash_table(p_dev, g_spi_flash_info);
 	} else {
+		pr_err("The device not support yet!\n");
+
 		p_dev->manufacturer = id_byte[0];
 		p_dev->mem_type = id_byte[1];
 		p_dev->capacity = 1 << (id_byte[2] - 9);

commit 12df382a944411046c9a1e17b08121d2be05ad00
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Fri Jul 16 16:49:05 2021 +0800

    staging: android: ion: fix error return for ion_sgl_sync_range
    
    Fixes: 975372e2cb6c ("staging: android: ion: support partial cpu access")
    Change-Id: I0517c42ec552d584d6961baa5ac0965d5f5c5650
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c
index 3bc132ee21d5..afe389ed3084 100644
--- a/drivers/staging/android/ion/ion.c
+++ b/drivers/staging/android/ion/ion.c
@@ -434,18 +434,6 @@ static int ion_sgl_sync_range(struct device *dev, struct scatterlist *sgl,
 	unsigned int len = 0;
 	dma_addr_t sg_dma_addr;
 
-	for_each_sg(sgl, sg, nents, i) {
-		if (sg_dma_len(sg) == 0)
-			break;
-
-		if (i > 0) {
-			pr_warn_ratelimited("Partial cmo only supported with 1 segment\n"
-				"is dma_set_max_seg_size being set on dev:%s\n",
-				dev_name(dev));
-			return -EINVAL;
-		}
-	}
-
 	for_each_sg(sgl, sg, nents, i) {
 		unsigned int sg_offset, sg_left, size = 0;
 

commit e2b7ae56ad9454fdd0dcef0a34cd2217f322490b
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Fri Jul 16 17:05:03 2021 +0800

    drm/rockchip: fix error return for rockchip_gem_prime_sgl_sync_range
    
    Fixes: e68e6d1a35b7 ("drm/rockchip: add dmabuf sync partial to dma_buf_ops")
    Change-Id: Iaeb2ec6ad605ed06c5f6cbad0705b7977a3f7cfa
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
index aa2ab2b97c27..01fb23a4ed87 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
@@ -1038,18 +1038,6 @@ static int rockchip_gem_prime_sgl_sync_range(struct device *dev,
 	unsigned int len = 0;
 	dma_addr_t sg_dma_addr;
 
-	for_each_sg(sgl, sg, nents, i) {
-		if (sg_dma_len(sg) == 0)
-			break;
-
-		if (i > 0) {
-			pr_warn_ratelimited("Partial cmo only supported with 1 segment\n"
-				"is dma_set_max_seg_size being set on dev:%s\n",
-				dev_name(dev));
-			return -EINVAL;
-		}
-	}
-
 	for_each_sg(sgl, sg, nents, i) {
 		unsigned int sg_offset, sg_left, size = 0;
 

commit 04725d0283f647fe99c185ddfcf514ed4bde9da9
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Fri Jun 18 15:59:59 2021 +0800

    drm/rockchip: drv: enable power before direct close crtc
    
    make sure vop power is enabled before use priv function crtc_close() to
    close current crtc plane.
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: I928e5f0f38692fbb8a134e6938ec28f8c1f41285

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index a9ca58b0e8ac..80ab47b65555 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -1023,8 +1023,15 @@ static void show_loader_logo(struct drm_device *drm_dev)
 			struct rockchip_drm_private *priv =
 							drm_dev->dev_private;
 
-			if (unset->hdisplay && unset->vdisplay)
+			if (unset->hdisplay && unset->vdisplay) {
+				if (priv->crtc_funcs[pipe] &&
+				    priv->crtc_funcs[pipe]->loader_protect)
+					priv->crtc_funcs[pipe]->loader_protect(crtc, true);
 				priv->crtc_funcs[pipe]->crtc_close(crtc);
+				if (priv->crtc_funcs[pipe] &&
+				    priv->crtc_funcs[pipe]->loader_protect)
+					priv->crtc_funcs[pipe]->loader_protect(crtc, false);
+			}
 		}
 
 		list_del(&unset->head);

commit bfbc1155ac37c73c0d509949ceede731059f21c6
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Thu Jul 15 16:08:06 2021 +0800

    drm/rockchip: ebc_dev: release version v2.08
    
    add EPD_A2_DITHER different from EPD_A2
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: I49954553452df6dbbf2b5fa885957c22053710bd

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
index 79f9b4739b18..aa31f0463e56 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
@@ -70,14 +70,15 @@ enum panel_refresh_mode {
 	EPD_PART_GLD16		= 10,
 	EPD_PART_GCC16		= 11,
 	EPD_A2			= 12,
-	EPD_DU			= 13,
-	EPD_DU4			= 14,
-	EPD_A2_ENTER		= 15,
-	EPD_RESET		= 16,
-	EPD_SUSPEND		= 17,
-	EPD_RESUME		= 18,
-	EPD_POWER_OFF		= 19,
-	EPD_FORCE_FULL		= 20,
+	EPD_A2_DITHER	        = 13,
+	EPD_DU			= 14,
+	EPD_DU4			= 15,
+	EPD_A2_ENTER		= 16,
+	EPD_RESET		= 17,
+	EPD_SUSPEND		= 18,
+	EPD_RESUME		= 19,
+	EPD_POWER_OFF		= 20,
+	EPD_FORCE_FULL		= 21,
 };
 
 /*
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index 948af1dd397b..bdc4e186657a 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -1119,15 +1119,15 @@ get_overlay_image:
 	.type	ebc_open, %function
 ebc_open:
 .LFB2833:
-	.loc 1 1938 0
+	.loc 1 1942 0
 	.cfi_startproc
 .LVL62:
-	.loc 1 1942 0
+	.loc 1 1946 0
 	mov	w0, 0
 .LVL63:
-	.loc 1 1939 0
+	.loc 1 1943 0
 	str	xzr, [x1, 104]
-	.loc 1 1942 0
+	.loc 1 1946 0
 	ret
 	.cfi_endproc
 .LFE2833:
@@ -1137,22 +1137,22 @@ ebc_open:
 	.type	ebc_exit, %function
 ebc_exit:
 .LFB2853:
-	.loc 1 2495 0
+	.loc 1 2499 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2496 0
+	.loc 1 2500 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2495 0
+	.loc 1 2499 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2496 0
+	.loc 1 2500 0
 	bl	platform_driver_unregister
 .LVL64:
-	.loc 1 2497 0
+	.loc 1 2501 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1167,7 +1167,7 @@ ebc_exit:
 	.type	ebc_resume, %function
 ebc_resume:
 .LFB2851:
-	.loc 1 2457 0
+	.loc 1 2461 0
 	.cfi_startproc
 .LVL65:
 	stp	x29, x30, [sp, -32]!
@@ -1185,7 +1185,7 @@ ebc_resume:
 	ldr	x19, [x0, 184]
 .LBE929:
 .LBE928:
-	.loc 1 2461 0
+	.loc 1 2465 0
 	ldr	x1, [x19, 16]
 .LBB930:
 .LBB931:
@@ -1198,15 +1198,15 @@ ebc_resume:
 .LVL67:
 .LBE931:
 .LBE930:
-	.loc 1 2462 0
+	.loc 1 2466 0
 	str	wzr, [x19, 780]
-	.loc 1 2463 0
+	.loc 1 2467 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
 .LVL68:
-	.loc 1 2466 0
+	.loc 1 2470 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -1223,20 +1223,20 @@ ebc_resume:
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
 .LFB2828:
-	.loc 1 1637 0
+	.loc 1 1641 0
 	.cfi_startproc
 .LVL69:
-	.loc 1 1638 0
+	.loc 1 1642 0
 	adrp	x0, .LANCHOR0
 .LVL70:
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1640 0
+	.loc 1 1644 0
 	ldr	w2, [x0, 608]
 	cbnz	w2, .L165
 	ret
 	.p2align 3
 .L165:
-	.loc 1 1637 0
+	.loc 1 1641 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -1248,10 +1248,10 @@ ebc_vdd_power_timeout:
 	add	x0, x0, 400
 .LBE933:
 .LBE932:
-	.loc 1 1637 0
+	.loc 1 1641 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1641 0
+	.loc 1 1645 0
 	str	wzr, [x0, 208]
 .LBB935:
 .LBB934:
@@ -1260,7 +1260,7 @@ ebc_vdd_power_timeout:
 .LVL71:
 .LBE934:
 .LBE935:
-	.loc 1 1646 0
+	.loc 1 1650 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1274,27 +1274,27 @@ ebc_vdd_power_timeout:
 	.type	ebc_remove, %function
 ebc_remove:
 .LFB2849:
-	.loc 1 2433 0
+	.loc 1 2437 0
 	.cfi_startproc
 .LVL72:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2434 0
+	.loc 1 2438 0
 	adrp	x0, .LANCHOR1
 .LVL73:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2433 0
+	.loc 1 2437 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2434 0
+	.loc 1 2438 0
 	add	x0, x0, 224
-	.loc 1 2433 0
-	.loc 1 2434 0
+	.loc 1 2437 0
+	.loc 1 2438 0
 	bl	misc_deregister
 .LVL74:
-	.loc 1 2437 0
+	.loc 1 2441 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -1309,7 +1309,7 @@ ebc_remove:
 	.type	ebc_mmap, %function
 ebc_mmap:
 .LFB2832:
-	.loc 1 1923 0
+	.loc 1 1927 0
 	.cfi_startproc
 .LVL75:
 	stp	x29, x30, [sp, -32]!
@@ -1320,33 +1320,33 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1923 0
+	.loc 1 1927 0
 	mov	x19, x1
-	.loc 1 1926 0
+	.loc 1 1930 0
 	bl	ebc_phy_buf_base_get
 .LVL76:
-	.loc 1 1929 0
+	.loc 1 1933 0
 	lsr	x2, x0, 12
-	.loc 1 1927 0
+	.loc 1 1931 0
 	mov	x6, 16384
-	.loc 1 1929 0
+	.loc 1 1933 0
 	mov	x0, x19
-	.loc 1 1927 0
+	.loc 1 1931 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 1929 0
+	.loc 1 1933 0
 	ldp	x1, x3, [x19]
-	.loc 1 1927 0
+	.loc 1 1931 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 1929 0
+	.loc 1 1933 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
 .LVL77:
-	.loc 1 1932 0
+	.loc 1 1936 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 1935 0
+	.loc 1 1939 0
 	ldr	x19, [sp, 16]
 .LVL78:
 	csel	w0, w0, w1, eq
@@ -1364,16 +1364,16 @@ ebc_mmap:
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
 .LFB2831:
-	.loc 1 1722 0
+	.loc 1 1726 0
 	.cfi_startproc
 .LVL79:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 1732 0
+	.loc 1 1736 0
 	cmp	w1, 28672
-	.loc 1 1722 0
+	.loc 1 1726 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -1387,15 +1387,15 @@ ebc_io_ctl:
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
 	.cfi_offset 23, -112
-	.loc 1 1722 0
+	.loc 1 1726 0
 	mov	x21, x2
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 1724 0
+	.loc 1 1728 0
 	adrp	x0, .LANCHOR0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1732 0
+	.loc 1 1736 0
 	bcc	.L173
 	mov	w0, 28675
 	cmp	w1, w0
@@ -1405,7 +1405,7 @@ ebc_io_ctl:
 	cmp	w0, 1
 	bls	.L174
 .L173:
-	.loc 1 1748 0
+	.loc 1 1752 0
 	mov	w0, 28677
 	cmp	w1, w0
 	beq	.L177
@@ -1421,13 +1421,13 @@ ebc_io_ctl:
 	mov	w0, 28683
 	cmp	w1, w0
 	bne	.L176
-	.loc 1 1900 0
+	.loc 1 1904 0
 	bl	ebc_empty_buf_get
 .LVL81:
 	mov	x23, x0
-	.loc 1 1901 0
+	.loc 1 1905 0
 	cbz	x0, .L197
-	.loc 1 1903 0
+	.loc 1 1907 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 392]
@@ -1438,7 +1438,7 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL82:
-	.loc 1 1904 0
+	.loc 1 1908 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL83:
@@ -1468,11 +1468,11 @@ ebc_io_ctl:
 .LBE938:
 .LBE937:
 .LBE936:
-	.loc 1 1906 0
+	.loc 1 1910 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 1905 0
+	.loc 1 1909 0
 	str	w0, [x29, 104]
-	.loc 1 1907 0
+	.loc 1 1911 0
 	stp	w4, w1, [x29, 112]
 .LBB967:
 .LBB964:
@@ -1501,7 +1501,7 @@ ebc_io_ctl:
 .LBE961:
 .LBE964:
 .LBE967:
-	.loc 1 1723 0
+	.loc 1 1727 0
 	mov	x0, x21
 .LVL88:
 .LBB968:
@@ -1549,36 +1549,36 @@ ebc_io_ctl:
 .LBE962:
 .LBE965:
 .LBE968:
-	.loc 1 1909 0
+	.loc 1 1913 0
 	mov	x0, x23
 .LVL93:
 	bl	ebc_buf_release
 .LVL94:
-	.loc 1 1910 0
+	.loc 1 1914 0
 	b	.L172
 .LVL95:
 	.p2align 3
 .L174:
-	.loc 1 1739 0
+	.loc 1 1743 0
 	cbnz	x21, .L173
-	.loc 1 1740 0
+	.loc 1 1744 0
 	ldr	x0, [x20, 272]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
 .LVL96:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC1
-	.loc 1 1741 0
+	.loc 1 1745 0
 	mov	x22, -14
-	.loc 1 1740 0
+	.loc 1 1744 0
 	bl	_dev_err
 .LVL97:
-	.loc 1 1741 0
+	.loc 1 1745 0
 	b	.L172
 .LVL98:
 	.p2align 3
 .L306:
-	.loc 1 1748 0
+	.loc 1 1752 0
 	mov	w0, 28674
 	cmp	w1, w0
 	beq	.L179
@@ -1589,23 +1589,23 @@ ebc_io_ctl:
 	mov	w0, 28676
 	cmp	w1, w0
 	bne	.L176
-	.loc 1 1832 0
+	.loc 1 1836 0
 	ldr	x0, [x20, 272]
-	.loc 1 1831 0
+	.loc 1 1835 0
 	mov	w2, 1
 	str	w2, [x20, 788]
-	.loc 1 1832 0
+	.loc 1 1836 0
 	adrp	x1, .LC2
 .LVL99:
-	.loc 1 1833 0
+	.loc 1 1837 0
 	mov	x22, 0
-	.loc 1 1832 0
+	.loc 1 1836 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
 .LVL100:
 	.p2align 2
 .L172:
-	.loc 1 1920 0
+	.loc 1 1924 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
 .LVL101:
@@ -1633,7 +1633,7 @@ ebc_io_ctl:
 	.p2align 3
 .L309:
 	.cfi_restore_state
-	.loc 1 1748 0
+	.loc 1 1752 0
 	cmp	w1, 28672
 	beq	.L181
 	mov	w0, 28673
@@ -1747,53 +1747,53 @@ ebc_io_ctl:
 .LBE971:
 .LBE970:
 .LBE969:
-	.loc 1 1786 0
+	.loc 1 1790 0
 	bl	ebc_phy_buf_base_get
 .LVL117:
 	ldrsw	x1, [x29, 104]
-	.loc 1 1787 0
+	.loc 1 1791 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
 .LVL118:
 	mov	x21, x0
 .LVL119:
-	.loc 1 1788 0
+	.loc 1 1792 0
 	cbz	x0, .L212
-	.loc 1 1789 0
+	.loc 1 1793 0
 	ldr	w5, [x29, 108]
-	.loc 1 1798 0
+	.loc 1 1802 0
 	add	x20, x20, 184
-	.loc 1 1793 0
+	.loc 1 1797 0
 	ldp	w4, w2, [x29, 124]
-	.loc 1 1789 0
+	.loc 1 1793 0
 	str	w5, [x21, 40]
-	.loc 1 1794 0
+	.loc 1 1798 0
 	ldp	w3, w1, [x29, 132]
-	.loc 1 1793 0
+	.loc 1 1797 0
 	stp	w4, w2, [x21, 48]
-	.loc 1 1794 0
+	.loc 1 1798 0
 	stp	w3, w1, [x21, 56]
-	.loc 1 1796 0
+	.loc 1 1800 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL120:
-	.loc 1 1798 0
+	.loc 1 1802 0
 	ldr	w0, [x20, 80]
 	cbz	w0, .L312
 .L207:
-	.loc 1 1802 0
+	.loc 1 1806 0
 	ldr	w0, [x21, 40]
-	cmp	w0, 17
+	cmp	w0, 18
 	beq	.L313
-	.loc 1 1802 0 is_stmt 0 discriminator 3
-	cmp	w0, 19
+	.loc 1 1806 0 is_stmt 0 discriminator 3
+	cmp	w0, 20
 	bne	.L212
 .L209:
-	.loc 1 1803 0 is_stmt 1
+	.loc 1 1807 0 is_stmt 1
 	mov	w0, 1
 	str	w0, [x20, 188]
 .LBB998:
 .LBB999:
-	.loc 1 1804 0
+	.loc 1 1808 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
@@ -1806,13 +1806,13 @@ ebc_io_ctl:
 	.p2align 3
 .L314:
 .LVL122:
-	.loc 1 1804 0 is_stmt 0 discriminator 5
+	.loc 1 1808 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L212
-	.loc 1 1804 0 discriminator 7
+	.loc 1 1808 0 discriminator 7
 	bl	schedule
 .LVL123:
 .L213:
-	.loc 1 1804 0 discriminator 9
+	.loc 1 1808 0 discriminator 9
 	add	x1, x29, 64
 	mov	w2, 1
 	mov	x0, x21
@@ -1821,7 +1821,7 @@ ebc_io_ctl:
 	ldr	w1, [x20, 188]
 	cbnz	w1, .L314
 .LBE1000:
-	.loc 1 1804 0 discriminator 4
+	.loc 1 1808 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
 	bl	finish_wait
@@ -1835,13 +1835,13 @@ ebc_io_ctl:
 .L189:
 .LBE999:
 .LBE998:
-	.loc 1 1887 0 is_stmt 1
+	.loc 1 1891 0 is_stmt 1
 	bl	ebc_empty_buf_get
 .LVL127:
 	mov	x23, x0
-	.loc 1 1888 0
+	.loc 1 1892 0
 	cbz	x0, .L197
-	.loc 1 1890 0
+	.loc 1 1894 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 328]
@@ -1851,7 +1851,7 @@ ebc_io_ctl:
 .LVL128:
 	.p2align 3
 .L307:
-	.loc 1 1748 0
+	.loc 1 1752 0
 	mov	w0, 28678
 	cmp	w1, w0
 	beq	.L187
@@ -1966,36 +1966,36 @@ ebc_io_ctl:
 .LBE1006:
 .LBE1005:
 .LBE1004:
-	.loc 1 1813 0
+	.loc 1 1817 0
 	bl	ebc_osd_buf_clone
 .LVL141:
 	mov	x1, x0
-	.loc 1 1814 0
+	.loc 1 1818 0
 	cbz	x0, .L212
-	.loc 1 1815 0
+	.loc 1 1819 0
 	ldr	w6, [x29, 108]
-	.loc 1 1824 0
+	.loc 1 1828 0
 	add	x20, x20, 184
-	.loc 1 1819 0
+	.loc 1 1823 0
 	ldp	w5, w3, [x29, 124]
-	.loc 1 1815 0
+	.loc 1 1819 0
 	str	w6, [x1, 40]
-	.loc 1 1820 0
+	.loc 1 1824 0
 	ldp	w4, w2, [x29, 132]
-	.loc 1 1819 0
+	.loc 1 1823 0
 	stp	w5, w3, [x1, 48]
-	.loc 1 1820 0
+	.loc 1 1824 0
 	stp	w4, w2, [x1, 56]
-	.loc 1 1822 0
+	.loc 1 1826 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL142:
-	.loc 1 1824 0
+	.loc 1 1828 0
 	ldr	w0, [x20, 80]
 	cbnz	w0, .L212
-	.loc 1 1825 0
+	.loc 1 1829 0
 	mov	w2, 1
 	str	w2, [x20, 80]
-	.loc 1 1826 0
+	.loc 1 1830 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -2068,12 +2068,12 @@ ebc_io_ctl:
 .LBE963:
 .LBE966:
 .LBE1033:
-	.loc 1 1750 0
+	.loc 1 1754 0
 	bl	ebc_osd_buf_get
 .LVL153:
-	.loc 1 1751 0
+	.loc 1 1755 0
 	cbz	x0, .L197
-	.loc 1 1754 0
+	.loc 1 1758 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL154:
@@ -2100,17 +2100,17 @@ ebc_io_ctl:
 .LBE1036:
 .LBE1035:
 .LBE1034:
-	.loc 1 1754 0
+	.loc 1 1758 0
 	sub	w0, w22, w0
-	.loc 1 1759 0
+	.loc 1 1763 0
 	ldr	w1, [x20, 176]
-	.loc 1 1758 0
+	.loc 1 1762 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1757 0
+	.loc 1 1761 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1759 0
+	.loc 1 1763 0
 	str	w1, [x29, 120]
-	.loc 1 1756 0
+	.loc 1 1760 0
 	str	w0, [x29, 104]
 .LBB1067:
 .LBB1064:
@@ -2235,7 +2235,7 @@ ebc_io_ctl:
 .LBE1070:
 .LBE1069:
 .LBE1068:
-	.loc 1 1840 0
+	.loc 1 1844 0
 	add	x22, x20, 232
 .LBB1103:
 .LBB1099:
@@ -2332,49 +2332,49 @@ ebc_io_ctl:
 .LBE1095:
 .LBE1099:
 .LBE1103:
-	.loc 1 1844 0
+	.loc 1 1848 0
 	add	x20, x20, 184
 	ldr	w2, [x20, 48]
 	ldr	x0, [x20, 88]
 .LVL180:
-	.loc 1 1845 0
+	.loc 1 1849 0
 	mov	x22, 0
-	.loc 1 1844 0
+	.loc 1 1848 0
 	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	_dev_info
 .LVL181:
-	.loc 1 1845 0
+	.loc 1 1849 0
 	b	.L172
 .LVL182:
 	.p2align 3
 .L177:
-	.loc 1 1837 0
+	.loc 1 1841 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC3
 .LVL183:
-	.loc 1 1835 0
+	.loc 1 1839 0
 	str	wzr, [x20, 788]
-	.loc 1 1838 0
+	.loc 1 1842 0
 	mov	x22, 0
-	.loc 1 1836 0
+	.loc 1 1840 0
 	str	wzr, [x20, 792]
-	.loc 1 1837 0
+	.loc 1 1841 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
 .LVL184:
-	.loc 1 1838 0
+	.loc 1 1842 0
 	b	.L172
 .LVL185:
 	.p2align 3
 .L185:
-	.loc 1 1874 0
+	.loc 1 1878 0
 	bl	ebc_empty_buf_get
 .LVL186:
 	mov	x23, x0
-	.loc 1 1875 0
+	.loc 1 1879 0
 	cbz	x0, .L197
-	.loc 1 1877 0
+	.loc 1 1881 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 320]
@@ -2384,13 +2384,13 @@ ebc_io_ctl:
 .LVL187:
 	.p2align 3
 .L190:
-	.loc 1 1861 0
+	.loc 1 1865 0
 	bl	ebc_empty_buf_get
 .LVL188:
 	mov	x23, x0
-	.loc 1 1862 0
+	.loc 1 1866 0
 	cbz	x0, .L197
-	.loc 1 1864 0
+	.loc 1 1868 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 312]
@@ -2399,7 +2399,7 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL189:
-	.loc 1 1865 0
+	.loc 1 1869 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL190:
@@ -2427,11 +2427,11 @@ ebc_io_ctl:
 .LBE1106:
 .LBE1105:
 .LBE1104:
-	.loc 1 1868 0
+	.loc 1 1872 0
 	ldp	w4, w1, [x22, 84]
-	.loc 1 1866 0
+	.loc 1 1870 0
 	str	w0, [x29, 104]
-	.loc 1 1867 0
+	.loc 1 1871 0
 	stp	w1, w4, [x29, 112]
 .LBB1115:
 .LBB1114:
@@ -2475,15 +2475,15 @@ ebc_io_ctl:
 .LBE1118:
 .LBE1117:
 .LBE1116:
-	.loc 1 1851 0
+	.loc 1 1855 0
 	ldp	w1, w0, [x20, 116]
 .LVL195:
 	stp	w1, w0, [x29, 140]
-	.loc 1 1848 0
+	.loc 1 1852 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 1847 0
+	.loc 1 1851 0
 	stp	w5, w6, [x29, 112]
-	.loc 1 1849 0
+	.loc 1 1853 0
 	ldr	w4, [x20, 176]
 	str	w4, [x29, 120]
 .LBB1151:
@@ -2531,46 +2531,46 @@ ebc_io_ctl:
 .LBE1143:
 .LBE1147:
 .LBE1151:
-	.loc 1 1854 0
+	.loc 1 1858 0
 	ldr	x0, [x20, 272]
 .LVL201:
 	adrp	x1, .LC5
 .LVL202:
-	.loc 1 1855 0
+	.loc 1 1859 0
 	mov	x22, -14
-	.loc 1 1854 0
+	.loc 1 1858 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
 .LVL203:
-	.loc 1 1855 0
+	.loc 1 1859 0
 	b	.L172
 .LVL204:
 	.p2align 3
 .L176:
-	.loc 1 1915 0
+	.loc 1 1919 0
 	ldr	x0, [x20, 272]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
 .LVL205:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
-	.loc 1 1916 0
+	.loc 1 1920 0
 	mov	x22, 0
-	.loc 1 1915 0
+	.loc 1 1919 0
 	bl	_dev_err
 .LVL206:
-	.loc 1 1919 0
+	.loc 1 1923 0
 	b	.L172
 .LVL207:
 	.p2align 3
 .L181:
-	.loc 1 1764 0
+	.loc 1 1768 0
 	bl	ebc_empty_buf_get
 .LVL208:
 	mov	x23, x0
-	.loc 1 1765 0
+	.loc 1 1769 0
 	cbz	x0, .L197
-	.loc 1 1768 0
+	.loc 1 1772 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL209:
@@ -2597,17 +2597,17 @@ ebc_io_ctl:
 .LBE1154:
 .LBE1153:
 .LBE1152:
-	.loc 1 1768 0
+	.loc 1 1772 0
 	sub	w0, w22, w0
-	.loc 1 1773 0
+	.loc 1 1777 0
 	ldr	w1, [x20, 176]
-	.loc 1 1772 0
+	.loc 1 1776 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1771 0
+	.loc 1 1775 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1773 0
+	.loc 1 1777 0
 	str	w1, [x29, 120]
-	.loc 1 1770 0
+	.loc 1 1774 0
 	str	w0, [x29, 104]
 .LBB1187:
 .LBB1183:
@@ -2654,15 +2654,15 @@ ebc_io_ctl:
 .LBE1179:
 .LBE1183:
 .LBE1187:
-	.loc 1 1777 0
+	.loc 1 1781 0
 	mov	x0, x23
 .LVL216:
-	.loc 1 1778 0
+	.loc 1 1782 0
 	mov	x22, -14
-	.loc 1 1777 0
+	.loc 1 1781 0
 	bl	ebc_buf_release
 .LVL217:
-	.loc 1 1778 0
+	.loc 1 1782 0
 	b	.L172
 .LVL218:
 	.p2align 3
@@ -2685,7 +2685,7 @@ ebc_io_ctl:
 .LBE1029:
 .LBE1031:
 .LBE1188:
-	.loc 1 1723 0
+	.loc 1 1727 0
 	mov	x0, x21
 .LVL219:
 .LBB1189:
@@ -2722,7 +2722,7 @@ ebc_io_ctl:
 .LBE994:
 .LBE996:
 .LBE1190:
-	.loc 1 1723 0
+	.loc 1 1727 0
 	mov	x0, x21
 .LVL221:
 .LBB1191:
@@ -2760,7 +2760,7 @@ ebc_io_ctl:
 .LBE1144:
 .LBE1148:
 .LBE1192:
-	.loc 1 1723 0
+	.loc 1 1727 0
 	mov	x0, x21
 .LVL224:
 .LBB1193:
@@ -2797,7 +2797,7 @@ ebc_io_ctl:
 .LBE1096:
 .LBE1100:
 .LBE1194:
-	.loc 1 1723 0
+	.loc 1 1727 0
 	mov	x0, x21
 .LVL226:
 .LBB1195:
@@ -2835,7 +2835,7 @@ ebc_io_ctl:
 .LBE1180:
 .LBE1184:
 .LBE1196:
-	.loc 1 1723 0
+	.loc 1 1727 0
 	mov	x0, x21
 .LVL229:
 .LBB1197:
@@ -2873,7 +2873,7 @@ ebc_io_ctl:
 .LBE1062:
 .LBE1065:
 .LBE1198:
-	.loc 1 1723 0
+	.loc 1 1727 0
 	mov	x0, x21
 .LVL232:
 .LBB1199:
@@ -2948,7 +2948,7 @@ ebc_io_ctl:
 .LBE1146:
 .LBE1150:
 .LBE1200:
-	.loc 1 1853 0
+	.loc 1 1857 0
 	cbnz	x0, .L224
 .LBB1201:
 .LBB1001:
@@ -3015,7 +3015,7 @@ ebc_io_ctl:
 .LBE1182:
 .LBE1186:
 .LBE1202:
-	.loc 1 1776 0
+	.loc 1 1780 0
 	cbnz	w0, .L201
 .LBB1203:
 .LBB1002:
@@ -3026,16 +3026,16 @@ ebc_io_ctl:
 .L205:
 .LBE1002:
 .LBE1203:
-	.loc 1 1784 0
+	.loc 1 1788 0
 	mov	x22, -14
 	b	.L172
 .LVL250:
 	.p2align 3
 .L312:
-	.loc 1 1799 0
+	.loc 1 1803 0
 	mov	w2, 1
 	str	w2, [x20, 80]
-	.loc 1 1800 0
+	.loc 1 1804 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -3045,7 +3045,7 @@ ebc_io_ctl:
 	b	.L207
 	.p2align 3
 .L313:
-	.loc 1 1802 0 discriminator 1
+	.loc 1 1806 0 discriminator 1
 	ldr	w0, [x20, 592]
 	cbz	w0, .L209
 .LBB1204:
@@ -3056,7 +3056,7 @@ ebc_io_ctl:
 .L197:
 .LBE1003:
 .LBE1204:
-	.loc 1 1752 0
+	.loc 1 1756 0
 	mov	x22, -1
 	b	.L172
 .LVL253:
@@ -3079,19 +3079,19 @@ ebc_io_ctl:
 .LBE1098:
 .LBE1102:
 .LBE1205:
-	.loc 1 1841 0
+	.loc 1 1845 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC4
-	.loc 1 1842 0
+	.loc 1 1846 0
 	mov	x22, -14
-	.loc 1 1841 0
+	.loc 1 1845 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
 .LVL258:
-	.loc 1 1842 0
+	.loc 1 1846 0
 	b	.L172
 .L310:
-	.loc 1 1920 0
+	.loc 1 1924 0
 	bl	__stack_chk_fail
 .LVL259:
 .L318:
@@ -3107,40 +3107,40 @@ ebc_io_ctl:
 	.type	frame_done_callback, %function
 frame_done_callback:
 .LFB2823:
-	.loc 1 1171 0
+	.loc 1 1173 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 1172 0
+	.loc 1 1174 0
 	adrp	x0, .LANCHOR0
 	add	x1, x0, :lo12:.LANCHOR0
-	.loc 1 1171 0
+	.loc 1 1173 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 1172 0
+	.loc 1 1174 0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1171 0
+	.loc 1 1173 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 1175 0
+	.loc 1 1177 0
 	add	x19, x20, 184
 	ldr	x0, [x19, 208]
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
 	bhi	.L322
-	.loc 1 1178 0
+	.loc 1 1180 0
 	ldr	w0, [x19, 36]
 	cbz	w0, .L324
-	.loc 1 1179 0
+	.loc 1 1181 0
 	ldr	x0, [x1, 8]
 	bl	wake_up_process
 .LVL261:
-	.loc 1 1205 0
+	.loc 1 1207 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -3155,40 +3155,40 @@ frame_done_callback:
 	.p2align 3
 .L322:
 	.cfi_restore_state
-	.loc 1 1193 0
+	.loc 1 1195 0
 	ldr	w0, [x19, 40]
 	cbnz	w0, .L328
-	.loc 1 1199 0
+	.loc 1 1201 0
 	ldr	x0, [x19, 88]
-	.loc 1 1198 0
+	.loc 1 1200 0
 	mov	w20, 1
-	.loc 1 1197 0
-	str	wzr, [x19, 28]
 	.loc 1 1199 0
+	str	wzr, [x19, 28]
+	.loc 1 1201 0
 	adrp	x1, .LC9
-	.loc 1 1198 0
+	.loc 1 1200 0
 	str	w20, [x19, 76]
-	.loc 1 1199 0
+	.loc 1 1201 0
 	add	x1, x1, :lo12:.LC9
-	.loc 1 1200 0
+	.loc 1 1202 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
-	.loc 1 1199 0
+	.loc 1 1201 0
 	bl	_dev_info
 .LVL262:
-	.loc 1 1200 0
+	.loc 1 1202 0
 	mov	w2, w20
 	add	x0, x19, 352
 	mov	w1, w20
 	bl	__wake_up_sync
 .LVL263:
-	.loc 1 1201 0
+	.loc 1 1203 0
 	mov	w2, w20
 	mov	w1, w20
 	add	x0, x19, 304
 	bl	__wake_up_sync
 .LVL264:
-	.loc 1 1205 0
+	.loc 1 1207 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -3203,23 +3203,23 @@ frame_done_callback:
 	.p2align 3
 .L324:
 	.cfi_restore_state
-	.loc 1 1182 0
+	.loc 1 1184 0
 	ldr	x0, [x19, 88]
 	adrp	x1, .LC8
 	add	x1, x1, :lo12:.LC8
-	.loc 1 1187 0
+	.loc 1 1189 0
 	mov	w21, 1
-	.loc 1 1182 0
+	.loc 1 1184 0
 	bl	_dev_info
 .LVL265:
-	.loc 1 1184 0
+	.loc 1 1186 0
 	ldp	w3, w2, [x20, 108]
 	mov	w1, 0
 	ldr	x0, [x19, 152]
 	mul	w2, w3, w2
 	bl	memset
 .LVL266:
-	.loc 1 1185 0
+	.loc 1 1187 0
 	adrp	x2, jiffies
 	add	x0, x20, 672
 	mov	x1, 402653184
@@ -3227,11 +3227,11 @@ frame_done_callback:
 	add	x1, x2, x1
 	bl	mod_timer
 .LVL267:
-	.loc 1 1187 0
+	.loc 1 1189 0
 	str	w21, [x19, 76]
-	.loc 1 1186 0
-	str	wzr, [x19, 28]
 	.loc 1 1188 0
+	str	wzr, [x19, 28]
+	.loc 1 1190 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
 	mov	w2, w21
@@ -3239,13 +3239,13 @@ frame_done_callback:
 	add	x0, x19, 352
 	bl	__wake_up_sync
 .LVL268:
-	.loc 1 1189 0
+	.loc 1 1191 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x19, 304
 	bl	__wake_up_sync
 .LVL269:
-	.loc 1 1205 0
+	.loc 1 1207 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -3260,15 +3260,15 @@ frame_done_callback:
 	.p2align 3
 .L328:
 	.cfi_restore_state
-	.loc 1 1195 0
+	.loc 1 1197 0
 	ldr	x0, [x1, 8]
-	.loc 1 1194 0
+	.loc 1 1196 0
 	mov	w1, 1
 	str	w1, [x19, 28]
-	.loc 1 1195 0
+	.loc 1 1197 0
 	bl	wake_up_process
 .LVL270:
-	.loc 1 1205 0
+	.loc 1 1207 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -3287,7 +3287,7 @@ frame_done_callback:
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
 .LFB2829:
-	.loc 1 1649 0
+	.loc 1 1653 0
 	.cfi_startproc
 .LVL271:
 	stp	x29, x30, [sp, -16]!
@@ -3296,10 +3296,10 @@ ebc_frame_timeout:
 	.cfi_offset 30, -8
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1650 0
+	.loc 1 1654 0
 	bl	frame_done_callback
 .LVL272:
-	.loc 1 1652 0
+	.loc 1 1656 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3313,16 +3313,16 @@ ebc_frame_timeout:
 	.type	ebc_lut_update, %function
 ebc_lut_update:
 .LFB2824:
-	.loc 1 1208 0
+	.loc 1 1210 0
 	.cfi_startproc
 .LVL273:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 1210 0
+	.loc 1 1212 0
 	mov	w3, 25
-	.loc 1 1208 0
+	.loc 1 1210 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x21, x22, [sp, 32]
@@ -3332,18 +3332,18 @@ ebc_lut_update:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -48
 	.cfi_offset 20, -40
-	.loc 1 1210 0
+	.loc 1 1212 0
 	add	x1, x29, 64
-	.loc 1 1208 0
+	.loc 1 1210 0
 	adrp	x19, __stack_chk_guard
 	add	x0, x19, :lo12:__stack_chk_guard
 .LVL274:
-	.loc 1 1214 0
+	.loc 1 1216 0
 	ldr	x2, [x21, 16]
-	.loc 1 1210 0
+	.loc 1 1212 0
 	str	w3, [x1, -12]!
 .LVL275:
-	.loc 1 1208 0
+	.loc 1 1210 0
 	ldr	x3, [x0]
 	str	x3, [x29, 56]
 	mov	x3,0
@@ -3357,31 +3357,31 @@ ebc_lut_update:
 	mov	w20, w0
 .LBE1207:
 .LBE1206:
-	.loc 1 1215 0
+	.loc 1 1217 0
 	cbnz	w0, .L332
 .LVL277:
-	.loc 1 1216 0
+	.loc 1 1218 0
 	ldr	w2, [x29, 52]
-	.loc 1 1217 0
+	.loc 1 1219 0
 	add	x22, x21, 184
-	.loc 1 1216 0
+	.loc 1 1218 0
 	tbnz	w2, #31, .L356
-	.loc 1 1220 0
+	.loc 1 1222 0
 	cmp	w2, 50
 	bgt	.L357
 .L334:
-	.loc 1 1228 0
+	.loc 1 1230 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC13
 	add	x1, x1, :lo12:.LC13
 	bl	_dev_info
 .LVL278:
-	.loc 1 1231 0
+	.loc 1 1233 0
 	ldr	x0, [x22, 208]
 	ldr	w0, [x0, 40]
-	cmp	w0, 20
+	cmp	w0, 21
 	bls	.L358
-	.loc 1 1284 0
+	.loc 1 1287 0
 	ldr	w2, [x29, 52]
 .L355:
 	mov	w1, 7
@@ -3391,10 +3391,10 @@ ebc_lut_update:
 	cbnz	w0, .L347
 	.p2align 2
 .L350:
-	.loc 1 1289 0
+	.loc 1 1292 0
 	cbnz	w20, .L348
 .L331:
-	.loc 1 1295 0
+	.loc 1 1298 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	w0, w20
 	ldr	x2, [x29, 56]
@@ -3418,11 +3418,11 @@ ebc_lut_update:
 	.p2align 3
 .L358:
 	.cfi_restore_state
-	.loc 1 1231 0
-	adrp	x1, .L337
 	.loc 1 1233 0
+	adrp	x1, .L337
+	.loc 1 1235 0
 	ldr	w2, [x29, 52]
-	.loc 1 1231 0
+	.loc 1 1233 0
 	add	x1, x1, :lo12:.L337
 	ldrb	w0, [x1,w0,uxtw]
 	adr	x1, .Lrtx337
@@ -3446,6 +3446,7 @@ ebc_lut_update:
 	.byte	(.L341 - .Lrtx337) / 4
 	.byte	(.L342 - .Lrtx337) / 4
 	.byte	(.L343 - .Lrtx337) / 4
+	.byte	(.L343 - .Lrtx337) / 4
 	.byte	(.L344 - .Lrtx337) / 4
 	.byte	(.L345 - .Lrtx337) / 4
 	.byte	(.L344 - .Lrtx337) / 4
@@ -3458,7 +3459,7 @@ ebc_lut_update:
 .LVL282:
 	.p2align 3
 .L332:
-	.loc 1 1226 0
+	.loc 1 1228 0
 	add	x22, x21, 184
 	mov	w2, w0
 	adrp	x1, .LC12
@@ -3470,20 +3471,20 @@ ebc_lut_update:
 	b	.L334
 	.p2align 3
 .L357:
-	.loc 1 1221 0
+	.loc 1 1223 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC11
 	add	x1, x1, :lo12:.LC11
 	bl	_dev_info
 .LVL284:
-	.loc 1 1222 0
+	.loc 1 1224 0
 	mov	w2, 50
 	str	w2, [x29, 52]
 .LVL285:
 	b	.L334
 	.p2align 3
 .L346:
-	.loc 1 1233 0
+	.loc 1 1235 0
 	mov	w1, 1
 	add	x0, x21, 280
 	bl	epd_lut_get
@@ -3491,20 +3492,20 @@ ebc_lut_update:
 	cbz	w0, .L350
 	.p2align 2
 .L347:
-	.loc 1 1222 0
+	.loc 1 1224 0
 	mov	w20, -1
 .L348:
-	.loc 1 1290 0
+	.loc 1 1293 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC14
 	add	x1, x1, :lo12:.LC14
 	bl	_dev_err
 .LVL287:
-	.loc 1 1291 0
+	.loc 1 1294 0
 	b	.L331
 	.p2align 3
 .L340:
-	.loc 1 1270 0
+	.loc 1 1273 0
 	mov	w1, 9
 	add	x0, x21, 280
 	bl	epd_lut_get
@@ -3513,7 +3514,7 @@ ebc_lut_update:
 	b	.L350
 	.p2align 3
 .L341:
-	.loc 1 1275 0
+	.loc 1 1278 0
 	mov	w1, 10
 	add	x0, x21, 280
 	bl	epd_lut_get
@@ -3522,7 +3523,7 @@ ebc_lut_update:
 	b	.L350
 	.p2align 3
 .L338:
-	.loc 1 1247 0
+	.loc 1 1249 0
 	mov	w1, 5
 	add	x0, x21, 280
 	bl	epd_lut_get
@@ -3531,7 +3532,7 @@ ebc_lut_update:
 	b	.L350
 	.p2align 3
 .L339:
-	.loc 1 1265 0
+	.loc 1 1268 0
 	mov	w1, 8
 	add	x0, x21, 280
 	bl	epd_lut_get
@@ -3540,7 +3541,7 @@ ebc_lut_update:
 	b	.L350
 	.p2align 3
 .L342:
-	.loc 1 1280 0
+	.loc 1 1283 0
 	mov	w1, 11
 	add	x0, x21, 280
 	bl	epd_lut_get
@@ -3549,7 +3550,7 @@ ebc_lut_update:
 	b	.L350
 	.p2align 3
 .L343:
-	.loc 1 1251 0
+	.loc 1 1254 0
 	mov	w1, 6
 	add	x0, x21, 280
 	bl	epd_lut_get
@@ -3558,7 +3559,7 @@ ebc_lut_update:
 	b	.L350
 	.p2align 3
 .L344:
-	.loc 1 1256 0
+	.loc 1 1259 0
 	mov	w1, 4
 	add	x0, x21, 280
 	bl	epd_lut_get
@@ -3567,7 +3568,7 @@ ebc_lut_update:
 	b	.L350
 	.p2align 3
 .L345:
-	.loc 1 1260 0
+	.loc 1 1263 0
 	mov	w1, 3
 	add	x0, x21, 280
 	bl	epd_lut_get
@@ -3576,18 +3577,18 @@ ebc_lut_update:
 	b	.L350
 	.p2align 3
 .L356:
-	.loc 1 1217 0
+	.loc 1 1219 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC10
 	add	x1, x1, :lo12:.LC10
 	bl	_dev_info
 .LVL296:
-	.loc 1 1218 0
+	.loc 1 1220 0
 	str	wzr, [x29, 52]
 	mov	w2, 0
 	b	.L334
 .L359:
-	.loc 1 1295 0
+	.loc 1 1298 0
 	bl	__stack_chk_fail
 .LVL297:
 	.cfi_endproc
@@ -3598,23 +3599,23 @@ ebc_lut_update:
 	.type	ebc_buf_state_read, %function
 ebc_buf_state_read:
 .LFB2841:
-	.loc 1 2053 0
+	.loc 1 2057 0
 	.cfi_startproc
 .LVL298:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2054 0
+	.loc 1 2058 0
 	mov	x0, x2
 .LVL299:
-	.loc 1 2053 0
+	.loc 1 2057 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2054 0
+	.loc 1 2058 0
 	bl	ebc_buf_state_show
 .LVL300:
-	.loc 1 2055 0
+	.loc 1 2059 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3629,32 +3630,32 @@ ebc_buf_state_read:
 	.type	ebc_state_read, %function
 ebc_state_read:
 .LFB2840:
-	.loc 1 2044 0
+	.loc 1 2048 0
 	.cfi_startproc
 .LVL301:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2045 0
+	.loc 1 2049 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2044 0
+	.loc 1 2048 0
 	mov	x0, x2
 .LVL302:
-	.loc 1 2045 0
+	.loc 1 2049 0
 	adrp	x1, .LC15
 .LVL303:
-	.loc 1 2044 0
+	.loc 1 2048 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2045 0
+	.loc 1 2049 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL304:
 	add	x1, x1, :lo12:.LC15
 	ldr	w2, [x2, 608]
 	bl	sprintf
 .LVL305:
-	.loc 1 2046 0
+	.loc 1 2050 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3669,7 +3670,7 @@ ebc_state_read:
 	.type	ebc_version_read, %function
 ebc_version_read:
 .LFB2839:
-	.loc 1 2035 0
+	.loc 1 2039 0
 	.cfi_startproc
 .LVL306:
 	stp	x29, x30, [sp, -16]!
@@ -3678,22 +3679,22 @@ ebc_version_read:
 	.cfi_offset 30, -8
 	mov	x0, x2
 .LVL307:
-	.loc 1 2036 0
+	.loc 1 2040 0
 	adrp	x1, .LC17
 .LVL308:
 	adrp	x2, .LC16
 .LVL309:
-	.loc 1 2035 0
+	.loc 1 2039 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2036 0
+	.loc 1 2040 0
 	add	x2, x2, :lo12:.LC16
-	.loc 1 2035 0
-	.loc 1 2036 0
+	.loc 1 2039 0
+	.loc 1 2040 0
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
 .LVL310:
-	.loc 1 2037 0
+	.loc 1 2041 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3708,27 +3709,27 @@ ebc_version_read:
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
 .LFB2837:
-	.loc 1 1999 0
+	.loc 1 2003 0
 	.cfi_startproc
 .LVL311:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 2000 0
+	.loc 1 2004 0
 	adrp	x0, .LANCHOR0
 .LVL312:
-	.loc 1 1999 0
+	.loc 1 2003 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2003 0
+	.loc 1 2007 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1999 0
+	.loc 1 2003 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1999 0
-	mov	x19, x2
 	.loc 1 2003 0
+	mov	x19, x2
+	.loc 1 2007 0
 	ldr	x1, [x0, 16]
 .LVL313:
 .LBB1208:
@@ -3740,14 +3741,14 @@ pmic_vcom_read:
 .LVL314:
 .LBE1209:
 .LBE1208:
-	.loc 1 2005 0
+	.loc 1 2009 0
 	mov	w2, w0
 	adrp	x1, .LC15
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
 .LVL315:
-	.loc 1 2006 0
+	.loc 1 2010 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL316:
@@ -3765,20 +3766,20 @@ pmic_vcom_read:
 	.type	pmic_temp_read, %function
 pmic_temp_read:
 .LFB2836:
-	.loc 1 1985 0
+	.loc 1 1989 0
 	.cfi_startproc
 .LVL317:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 1986 0
+	.loc 1 1990 0
 	adrp	x0, .LANCHOR0
 .LVL318:
-	.loc 1 1985 0
+	.loc 1 1989 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1989 0
+	.loc 1 1993 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
 .LBB1210:
 .LBB1211:
@@ -3787,11 +3788,11 @@ pmic_temp_read:
 .LVL319:
 .LBE1211:
 .LBE1210:
-	.loc 1 1985 0
+	.loc 1 1989 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 1985 0
+	.loc 1 1989 0
 	adrp	x19, __stack_chk_guard
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x20, x2
@@ -3799,7 +3800,7 @@ pmic_temp_read:
 	str	x2, [x29, 40]
 	mov	x2,0
 .LVL320:
-	.loc 1 1989 0
+	.loc 1 1993 0
 	ldr	x2, [x0, 16]
 .LBB1213:
 .LBB1212:
@@ -3810,14 +3811,14 @@ pmic_temp_read:
 .LVL321:
 .LBE1212:
 .LBE1213:
-	.loc 1 1991 0
+	.loc 1 1995 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC15
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
 .LVL322:
-	.loc 1 1992 0
+	.loc 1 1996 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
@@ -3846,25 +3847,25 @@ pmic_temp_read:
 	.type	pmic_name_read, %function
 pmic_name_read:
 .LFB2835:
-	.loc 1 1974 0
+	.loc 1 1978 0
 	.cfi_startproc
 .LVL326:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1975 0
+	.loc 1 1979 0
 	adrp	x3, .LANCHOR0
-	.loc 1 1974 0
+	.loc 1 1978 0
 	mov	x0, x2
 .LVL327:
-	.loc 1 1977 0
+	.loc 1 1981 0
 	adrp	x1, .LC17
 .LVL328:
-	.loc 1 1974 0
+	.loc 1 1978 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1977 0
+	.loc 1 1981 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL329:
 	add	x1, x1, :lo12:.LC17
@@ -3872,7 +3873,7 @@ pmic_name_read:
 	add	x2, x2, 8
 	bl	sprintf
 .LVL330:
-	.loc 1 1978 0
+	.loc 1 1982 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3887,17 +3888,17 @@ pmic_name_read:
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
 .LFB2838:
-	.loc 1 2011 0
+	.loc 1 2015 0
 	.cfi_startproc
 .LVL331:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 2012 0
+	.loc 1 2016 0
 	adrp	x0, .LANCHOR0
 .LVL332:
-	.loc 1 2011 0
+	.loc 1 2015 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -3907,37 +3908,37 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 2011 0
+	.loc 1 2015 0
 	add	x1, x19, :lo12:__stack_chk_guard
 .LVL333:
 	mov	x21, x2
-	.loc 1 2012 0
+	.loc 1 2016 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
 .LVL334:
-	.loc 1 2011 0
+	.loc 1 2015 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
 .LVL335:
 	mov	x20, x3
-	.loc 1 2015 0
+	.loc 1 2019 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
 .LVL336:
-	.loc 1 2016 0
+	.loc 1 2020 0
 	cbnz	w0, .L381
 .LVL337:
-	.loc 1 2020 0
+	.loc 1 2024 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
 .LVL338:
-	.loc 1 2021 0
+	.loc 1 2025 0
 	cbnz	w0, .L382
 .L374:
-	.loc 1 2027 0
+	.loc 1 2031 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
 .LVL339:
@@ -3962,36 +3963,36 @@ pmic_vcom_write:
 	.p2align 3
 .L381:
 	.cfi_restore_state
-	.loc 1 2017 0
+	.loc 1 2021 0
 	ldr	x0, [x22]
 	adrp	x1, .LC18
 	mov	x2, x21
 	add	x1, x1, :lo12:.LC18
-	.loc 1 2018 0
+	.loc 1 2022 0
 	mov	x20, -1
 .LVL342:
-	.loc 1 2017 0
+	.loc 1 2021 0
 	bl	_dev_err
 .LVL343:
-	.loc 1 2018 0
+	.loc 1 2022 0
 	b	.L374
 .LVL344:
 	.p2align 3
 .L382:
-	.loc 1 2022 0
+	.loc 1 2026 0
 	ldr	x0, [x22]
 	adrp	x1, .LC19
-	.loc 1 2023 0
+	.loc 1 2027 0
 	mov	x20, -1
 .LVL345:
-	.loc 1 2022 0
+	.loc 1 2026 0
 	add	x1, x1, :lo12:.LC19
 	bl	_dev_err
 .LVL346:
-	.loc 1 2023 0
+	.loc 1 2027 0
 	b	.L374
 .L383:
-	.loc 1 2027 0
+	.loc 1 2031 0
 	bl	__stack_chk_fail
 .LVL347:
 	.cfi_endproc
@@ -4002,7 +4003,7 @@ pmic_vcom_write:
 	.type	waveform_version_read, %function
 waveform_version_read:
 .LFB2834:
-	.loc 1 1963 0
+	.loc 1 1967 0
 	.cfi_startproc
 .LVL348:
 	stp	x29, x30, [sp, -32]!
@@ -4013,19 +4014,19 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1963 0
+	.loc 1 1967 0
 	mov	x19, x2
-	.loc 1 1964 0
+	.loc 1 1968 0
 	bl	epd_lut_get_wf_version
 .LVL349:
-	.loc 1 1966 0
+	.loc 1 1970 0
 	mov	x2, x0
 	adrp	x1, .LC17
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
 .LVL350:
-	.loc 1 1967 0
+	.loc 1 1971 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL351:
@@ -4043,23 +4044,23 @@ waveform_version_read:
 	.type	ebc_init, %function
 ebc_init:
 .LFB2852:
-	.loc 1 2490 0
+	.loc 1 2494 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2491 0
+	.loc 1 2495 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2490 0
+	.loc 1 2494 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2491 0
+	.loc 1 2495 0
 	bl	__platform_driver_register
 .LVL352:
-	.loc 1 2492 0
+	.loc 1 2496 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -5424,16 +5425,16 @@ ebc_frame_start:
 	beq	.L544
 	ble	.L553
 	sub	w0, w0, #7
-	cmp	w0, 8
+	cmp	w0, 9
 	bhi	.L543
-	.loc 1 1072 0
+	.loc 1 1073 0
 	ldr	x2, [x19, 200]
-	.loc 1 1070 0
+	.loc 1 1071 0
 	mov	x3, x19
-	.loc 1 1069 0
+	.loc 1 1070 0
 	ldrb	w0, [x19, 32]
 	str	w0, [x19, 40]
-	.loc 1 1070 0
+	.loc 1 1071 0
 	ldr	x0, [x19, 168]
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
@@ -5450,22 +5451,22 @@ ebc_frame_start:
 .LVL460:
 .LBE1382:
 .LBE1381:
-	.loc 1 1075 0
-	ldr	w0, [x19, 40]
 	.loc 1 1076 0
-	mov	x3, x19
+	ldr	w0, [x19, 40]
 	.loc 1 1077 0
+	mov	x3, x19
+	.loc 1 1078 0
 	ldp	x2, x1, [x19, 200]
-	.loc 1 1075 0
+	.loc 1 1076 0
 	sub	w0, w0, #1
 	str	w0, [x19, 40]
-	.loc 1 1076 0
+	.loc 1 1077 0
 	ldr	x0, [x19, 176]
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part
 .LVL461:
-	.loc 1 1097 0
+	.loc 1 1098 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 .LVL462:
@@ -5512,7 +5513,7 @@ ebc_frame_start:
 	ldr	x0, [x19, 176]
 	bl	get_auto_image
 .LVL466:
-	.loc 1 1097 0
+	.loc 1 1098 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 .LVL467:
@@ -5557,7 +5558,7 @@ ebc_frame_start:
 	ldr	x0, [x19, 176]
 	bl	get_overlay_image
 .LVL471:
-	.loc 1 1097 0
+	.loc 1 1098 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 .LVL472:
@@ -5574,14 +5575,14 @@ ebc_frame_start:
 	.p2align 3
 .L543:
 	.cfi_restore_state
-	.loc 1 1085 0
+	.loc 1 1086 0
 	ldr	x2, [x19, 200]
-	.loc 1 1083 0
+	.loc 1 1084 0
 	mov	x3, x19
-	.loc 1 1082 0
+	.loc 1 1083 0
 	ldrb	w0, [x19, 32]
 	str	w0, [x19, 40]
-	.loc 1 1083 0
+	.loc 1 1084 0
 	ldr	x0, [x19, 168]
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
@@ -5598,22 +5599,22 @@ ebc_frame_start:
 .LVL475:
 .LBE1388:
 .LBE1387:
-	.loc 1 1088 0
-	ldr	w0, [x19, 40]
 	.loc 1 1089 0
-	mov	x3, x19
+	ldr	w0, [x19, 40]
 	.loc 1 1090 0
+	mov	x3, x19
+	.loc 1 1091 0
 	ldp	x2, x1, [x19, 200]
-	.loc 1 1088 0
+	.loc 1 1089 0
 	sub	w0, w0, #1
 	str	w0, [x19, 40]
-	.loc 1 1089 0
+	.loc 1 1090 0
 	ldr	x0, [x19, 176]
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
 .LVL476:
-	.loc 1 1097 0
+	.loc 1 1098 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 .LVL477:
@@ -5640,7 +5641,7 @@ ebc_frame_start:
 .LVL479:
 	.loc 1 1039 0
 	str	wzr, [x19, 28]
-	.loc 1 1097 0
+	.loc 1 1098 0
 	ldp	x19, x20, [sp, 16]
 .LVL480:
 	ldr	x21, [sp, 32]
@@ -5667,7 +5668,7 @@ ebc_frame_start:
 .LVL482:
 	.loc 1 1057 0
 	str	wzr, [x19, 28]
-	.loc 1 1097 0
+	.loc 1 1098 0
 	ldp	x19, x20, [sp, 16]
 .LVL483:
 	ldr	x21, [sp, 32]
@@ -5687,16 +5688,16 @@ ebc_frame_start:
 	.type	ebc_auto_tast_function, %function
 ebc_auto_tast_function:
 .LFB2822:
-	.loc 1 1100 0
+	.loc 1 1101 0
 	.cfi_startproc
 .LVL484:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
 	.cfi_offset 30, -88
-	.loc 1 1101 0
+	.loc 1 1102 0
 	adrp	x1, .LANCHOR0
-	.loc 1 1100 0
+	.loc 1 1101 0
 	adrp	x0, __stack_chk_guard
 .LVL485:
 	add	x0, x0, :lo12:__stack_chk_guard
@@ -5707,16 +5708,16 @@ ebc_auto_tast_function:
 	.cfi_offset 20, -72
 	adrp	x20, .LANCHOR1
 	stp	x21, x22, [sp, 32]
-	.loc 1 1106 0
+	.loc 1 1107 0
 	add	x20, x20, :lo12:.LANCHOR1
 	.cfi_offset 21, -64
 	.cfi_offset 22, -56
-	.loc 1 1101 0
+	.loc 1 1102 0
 	ldr	x22, [x1, #:lo12:.LANCHOR0]
 .LVL486:
-	.loc 1 1106 0
+	.loc 1 1107 0
 	add	x20, x20, 376
-	.loc 1 1100 0
+	.loc 1 1101 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
@@ -5729,16 +5730,16 @@ ebc_auto_tast_function:
 .LBE1391:
 .LBE1390:
 .LBE1389:
-	.loc 1 1100 0
+	.loc 1 1101 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -32
 	.cfi_offset 26, -24
-	.loc 1 1102 0
-	add	x21, x22, 24
 	.loc 1 1103 0
+	add	x21, x22, 24
+	.loc 1 1104 0
 	add	x19, x22, 184
 	add	x26, x22, 728
-	.loc 1 1100 0
+	.loc 1 1101 0
 	ldr	x1, [x0]
 	str	x1, [x29, 88]
 	mov	x1,0
@@ -5759,14 +5760,14 @@ ebc_auto_tast_function:
 .LBE1394:
 .LBE1393:
 .LBE1396:
-	.loc 1 1111 0
+	.loc 1 1112 0
 	cbnz	w0, .L555
-	.loc 1 1121 0
+	.loc 1 1122 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
 	bl	flip.isra.7
 .LVL488:
-	.loc 1 1122 0
+	.loc 1 1123 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 128]
@@ -5776,24 +5777,24 @@ ebc_auto_tast_function:
 	bl	get_auto_image
 .LVL489:
 .L560:
-	.loc 1 1159 0
+	.loc 1 1161 0
 	ldr	x0, [x19, 208]
 	ldr	w0, [x0, 40]
 	cbz	w0, .L563
 .L583:
-	.loc 1 1160 0
+	.loc 1 1162 0
 	cmp	w0, 1
 	beq	.L581
 .L564:
-	.loc 1 1163 0
+	.loc 1 1165 0
 	mov	x0, x20
 	bl	up
 .LVL490:
-	.loc 1 1164 0
+	.loc 1 1166 0
 	bl	schedule
 .LVL491:
 .L565:
-	.loc 1 1106 0
+	.loc 1 1107 0
 	mov	x0, x20
 	bl	down
 .LVL492:
@@ -5805,12 +5806,12 @@ ebc_auto_tast_function:
 .LBE1392:
 .LBE1395:
 .LBE1397:
-	.loc 1 1110 0
+	.loc 1 1111 0
 #APP
-// 1110 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
+// 1111 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
 	dmb ish
 // 0 "" 2
-	.loc 1 1111 0
+	.loc 1 1112 0
 #NO_APP
 	ldr	x0, [x19, 208]
 	ldr	w0, [x0, 40]
@@ -5818,35 +5819,35 @@ ebc_auto_tast_function:
 	beq	.L556
 	ble	.L582
 	sub	w0, w0, #7
-	cmp	w0, 8
+	cmp	w0, 9
 	bhi	.L555
-	.loc 1 1137 0
+	.loc 1 1139 0
 	ldr	w1, [x19, 40]
-	.loc 1 1138 0
+	.loc 1 1140 0
 	mov	x0, x21
-	.loc 1 1137 0
+	.loc 1 1139 0
 	sub	w1, w1, #1
 	str	w1, [x19, 40]
-	.loc 1 1138 0
+	.loc 1 1140 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.7
 .LVL493:
-	.loc 1 1139 0
+	.loc 1 1141 0
 	ldr	w0, [x19, 40]
 	cbz	w0, .L560
-	.loc 1 1141 0
+	.loc 1 1143 0
 	ldrsw	x0, [x21, 72]
 	mov	x3, x19
-	.loc 1 1142 0
+	.loc 1 1144 0
 	ldp	x2, x1, [x19, 200]
-	.loc 1 1141 0
+	.loc 1 1143 0
 	add	x0, x19, x0, lsl 3
 	ldr	x1, [x1, 16]
 	ldr	x0, [x0, 168]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part
 .LVL494:
-	.loc 1 1159 0
+	.loc 1 1161 0
 	ldr	x0, [x19, 208]
 	ldr	w0, [x0, 40]
 	cbnz	w0, .L583
@@ -5870,42 +5871,42 @@ ebc_auto_tast_function:
 .LBE1400:
 .LBE1399:
 .LBE1398:
-	.loc 1 1147 0
+	.loc 1 1149 0
 	ldr	w1, [x19, 40]
-	.loc 1 1148 0
+	.loc 1 1150 0
 	mov	x0, x21
-	.loc 1 1147 0
+	.loc 1 1149 0
 	sub	w1, w1, #1
 	str	w1, [x19, 40]
-	.loc 1 1148 0
+	.loc 1 1150 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.7
 .LVL496:
-	.loc 1 1149 0
+	.loc 1 1151 0
 	ldr	w0, [x19, 40]
 	cbz	w0, .L560
-	.loc 1 1151 0
+	.loc 1 1153 0
 	ldrsw	x0, [x21, 72]
 	mov	x3, x19
-	.loc 1 1152 0
+	.loc 1 1154 0
 	ldp	x2, x1, [x19, 200]
-	.loc 1 1151 0
+	.loc 1 1153 0
 	add	x0, x19, x0, lsl 3
 	ldr	x1, [x1, 16]
 	ldr	x0, [x0, 168]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
 .LVL497:
-	.loc 1 1155 0
+	.loc 1 1157 0
 	b	.L560
 	.p2align 3
 .L556:
-	.loc 1 1113 0
+	.loc 1 1114 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
 	bl	flip.isra.7
 .LVL498:
-	.loc 1 1114 0
+	.loc 1 1115 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 128]
@@ -5914,14 +5915,14 @@ ebc_auto_tast_function:
 	ldr	x0, [x0, 168]
 	bl	get_overlay_image
 .LVL499:
-	.loc 1 1119 0
+	.loc 1 1120 0
 	b	.L560
 	.p2align 3
 .L581:
-	.loc 1 1160 0 discriminator 1
+	.loc 1 1162 0 discriminator 1
 	ldr	w0, [x19, 604]
 	cbz	w0, .L564
-	.loc 1 1160 0 is_stmt 0 discriminator 2
+	.loc 1 1162 0 is_stmt 0 discriminator 2
 	ldr	w0, [x19, 608]
 	cbz	w0, .L564
 .LBB1405:
@@ -6046,7 +6047,7 @@ ebc_power_set.part.8:
 	.type	ebc_suspend, %function
 ebc_suspend:
 .LFB2850:
-	.loc 1 2440 0
+	.loc 1 2444 0
 	.cfi_startproc
 .LVL512:
 	stp	x29, x30, [sp, -32]!
@@ -6064,17 +6065,17 @@ ebc_suspend:
 	ldr	x20, [x0, 184]
 .LBE1413:
 .LBE1412:
-	.loc 1 2444 0
+	.loc 1 2448 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 184]
 .LVL513:
 	cmp	w0, 1
 	beq	.L594
 .L592:
-	.loc 1 2448 0
+	.loc 1 2452 0
 	mov	w0, 1
 	str	w0, [x19, 596]
-	.loc 1 2450 0
+	.loc 1 2454 0
 	ldr	x1, [x20, 16]
 .LBB1414:
 .LBB1415:
@@ -6085,13 +6086,13 @@ ebc_suspend:
 .LVL514:
 .LBE1415:
 .LBE1414:
-	.loc 1 2451 0
+	.loc 1 2455 0
 	ldr	x0, [x19, 88]
 	adrp	x1, .LC24
 	add	x1, x1, :lo12:.LC24
 	bl	_dev_info
 .LVL515:
-	.loc 1 2454 0
+	.loc 1 2458 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -6105,7 +6106,7 @@ ebc_suspend:
 	.p2align 3
 .L594:
 	.cfi_restore_state
-	.loc 1 2445 0
+	.loc 1 2449 0
 	ldr	x0, [x19, 88]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
@@ -6131,7 +6132,7 @@ ebc_suspend:
 	.type	ebc_probe, %function
 ebc_probe:
 .LFB2848:
-	.loc 1 2324 0
+	.loc 1 2328 0
 	.cfi_startproc
 .LVL518:
 	stp	x29, x30, [sp, -208]!
@@ -6145,15 +6146,15 @@ ebc_probe:
 	movk	w2, 0x60, lsl 16
 .LBE1564:
 .LBE1563:
-	.loc 1 2324 0
+	.loc 1 2328 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -192
 	.cfi_offset 20, -184
-	.loc 1 2325 0
+	.loc 1 2329 0
 	add	x20, x0, 16
-	.loc 1 2324 0
+	.loc 1 2328 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -160
 	.cfi_offset 24, -152
@@ -6169,7 +6170,7 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 2324 0
+	.loc 1 2328 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
@@ -6182,30 +6183,30 @@ ebc_probe:
 .LVL520:
 .LBE1565:
 .LBE1566:
-	.loc 1 2336 0
-	cbz	x0, .L640
 	.loc 1 2340 0
+	cbz	x0, .L640
+	.loc 1 2344 0
 	adrp	x25, .LANCHOR0
 	mov	x19, x0
-	.loc 1 2342 0
+	.loc 1 2346 0
 	adrp	x1, .LC25
 	mov	w2, 0
-	.loc 1 2340 0
+	.loc 1 2344 0
 	str	x0, [x25, #:lo12:.LANCHOR0]
-	.loc 1 2342 0
+	.loc 1 2346 0
 	add	x1, x1, :lo12:.LC25
 	ldr	x0, [x20, 752]
-	.loc 1 2339 0
+	.loc 1 2343 0
 	str	x20, [x19]
-	.loc 1 2342 0
+	.loc 1 2346 0
 	bl	of_parse_phandle
 .LVL521:
-	.loc 1 2343 0
+	.loc 1 2347 0
 	cbz	x0, .L680
-	.loc 1 2348 0
+	.loc 1 2352 0
 	bl	of_find_device_by_node
 .LVL522:
-	.loc 1 2350 0
+	.loc 1 2354 0
 	cbz	x0, .L599
 .LBB1567:
 .LBB1568:
@@ -6216,27 +6217,27 @@ ebc_probe:
 .LBE1569:
 .LBE1568:
 .LBE1567:
-	.loc 1 2353 0
+	.loc 1 2357 0
 	str	x0, [x19, 8]
-	.loc 1 2354 0
+	.loc 1 2358 0
 	cbz	x0, .L599
-	.loc 1 2356 0
+	.loc 1 2360 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 2358 0
+	.loc 1 2362 0
 	mov	w2, 0
 	adrp	x1, .LC27
 	add	x1, x1, :lo12:.LC27
 	ldr	x0, [x20, 752]
 	bl	of_parse_phandle
 .LVL524:
-	.loc 1 2359 0
+	.loc 1 2363 0
 	cbz	x0, .L681
-	.loc 1 2364 0
+	.loc 1 2368 0
 	bl	of_find_i2c_device_by_node
 .LVL525:
-	.loc 1 2366 0
+	.loc 1 2370 0
 	cbz	x0, .L682
 .LBB1570:
 .LBB1571:
@@ -6247,16 +6248,16 @@ ebc_probe:
 .LBE1572:
 .LBE1571:
 .LBE1570:
-	.loc 1 2370 0
+	.loc 1 2374 0
 	str	x0, [x19, 16]
-	.loc 1 2371 0
+	.loc 1 2375 0
 	cbz	x0, .L683
-	.loc 1 2377 0
+	.loc 1 2381 0
 	add	x21, x19, 184
 .LVL527:
-	.loc 1 2379 0
+	.loc 1 2383 0
 	add	x22, x19, 24
-	.loc 1 2377 0
+	.loc 1 2381 0
 	str	x20, [x21, 88]
 .LBB1573:
 .LBB1574:
@@ -6271,7 +6272,7 @@ ebc_probe:
 .LBE1575:
 .LBE1574:
 .LBE1573:
-	.loc 1 2379 0
+	.loc 1 2383 0
 	str	x20, [x19, 24]
 .LBB1672:
 .LBB1668:
@@ -6285,7 +6286,7 @@ ebc_probe:
 .LBE1584:
 .LBE1668:
 .LBE1672:
-	.loc 1 2380 0
+	.loc 1 2384 0
 	ldr	x2, [x19, 8]
 .LBB1673:
 .LBB1669:
@@ -6299,7 +6300,7 @@ ebc_probe:
 .LBE1585:
 .LBE1669:
 .LBE1673:
-	.loc 1 2381 0
+	.loc 1 2385 0
 	stp	x2, x0, [x22, 8]
 .LBB1674:
 .LBB1670:
@@ -6646,56 +6647,56 @@ ebc_probe:
 .LBE1653:
 .LBE1670:
 .LBE1674:
-	.loc 1 2389 0
+	.loc 1 2393 0
 	ldr	w0, [x22, 88]
 .LBB1675:
 .LBB1676:
-	.loc 1 2126 0
+	.loc 1 2130 0
 	mov	w2, 0
 .LBE1676:
 .LBE1675:
-	.loc 1 2389 0
+	.loc 1 2393 0
 	str	w0, [x21, 52]
-	.loc 1 2390 0
+	.loc 1 2394 0
 	ldr	w1, [x22, 84]
 	str	w1, [x21, 56]
-	.loc 1 2393 0
+	.loc 1 2397 0
 	tst	x1, 15
-	.loc 1 2391 0
+	.loc 1 2395 0
 	mul	w0, w0, w1
-	.loc 1 2393 0
+	.loc 1 2397 0
 	cset	w1, eq
 	str	w1, [x21, 72]
 .LBB1700:
 .LBB1695:
-	.loc 1 2126 0
+	.loc 1 2130 0
 	adrp	x1, .LC36
 	add	x1, x1, :lo12:.LC36
 .LBE1695:
 .LBE1700:
-	.loc 1 2391 0
+	.loc 1 2395 0
 	lsr	w3, w0, 1
-	.loc 1 2392 0
+	.loc 1 2396 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x21, 20]
 .LBB1701:
 .LBB1696:
-	.loc 1 2117 0
+	.loc 1 2121 0
 	ldr	x26, [x19]
 .LVL548:
-	.loc 1 2126 0
+	.loc 1 2130 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL549:
-	.loc 1 2127 0
+	.loc 1 2131 0
 	cbz	x0, .L641
-	.loc 1 2130 0
+	.loc 1 2134 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL550:
 	mov	w24, w0
-	.loc 1 2132 0
+	.loc 1 2136 0
 	cbnz	w0, .L685
 .LBB1677:
 .LBB1678:
@@ -6704,9 +6705,9 @@ ebc_probe:
 	ldp	x1, x2, [x29, 104]
 .LBE1678:
 .LBE1677:
-	.loc 1 2137 0
+	.loc 1 2141 0
 	str	x1, [x19, 184]
-	.loc 1 2140 0
+	.loc 1 2144 0
 	mov	x3, 1
 	mov	x0, x26
 .LBB1680:
@@ -6716,16 +6717,16 @@ ebc_probe:
 	sub	x2, x2, x1
 .LBE1679:
 .LBE1680:
-	.loc 1 2138 0
+	.loc 1 2142 0
 	str	w2, [x21, 16]
-	.loc 1 2140 0
+	.loc 1 2144 0
 	sxtw	x2, w2
 	bl	devm_memremap
 .LVL551:
 	str	x0, [x21, 8]
-	.loc 1 2142 0
+	.loc 1 2146 0
 	cbz	x0, .L612
-	.loc 1 2150 0
+	.loc 1 2154 0
 	mov	x1, x0
 	ldr	w2, [x21, 16]
 	ldr	x0, [x19, 184]
@@ -6733,11 +6734,11 @@ ebc_probe:
 	mov	w3, 2097152
 	bl	ebc_buf_init
 .LVL552:
-	.loc 1 2151 0
+	.loc 1 2155 0
 	cbnz	w0, .L612
-	.loc 1 2156 0
+	.loc 1 2160 0
 	ldr	x0, [x21, 8]
-	.loc 1 2157 0
+	.loc 1 2161 0
 	mov	x5, 1048576
 	str	x5, [x22, 40]
 .LBB1681:
@@ -6746,13 +6747,13 @@ ebc_probe:
 	mov	w2, 32960
 .LBE1682:
 .LBE1681:
-	.loc 1 2156 0
+	.loc 1 2160 0
 	add	x6, x0, 10485760
 	str	x6, [x22, 24]
 	add	x4, x0, 11534336
-	.loc 1 2162 0
+	.loc 1 2166 0
 	add	x1, x0, 12582912
-	.loc 1 2158 0
+	.loc 1 2162 0
 	ldr	x3, [x19, 184]
 .LBB1686:
 .LBB1683:
@@ -6761,18 +6762,18 @@ ebc_probe:
 	mov	x0, x26
 .LBE1683:
 .LBE1686:
-	.loc 1 2158 0
+	.loc 1 2162 0
 	add	x7, x3, 10485760
 	str	x7, [x22, 32]
-	.loc 1 2159 0
+	.loc 1 2163 0
 	str	x6, [x21, 168]
-	.loc 1 2158 0
+	.loc 1 2162 0
 	add	x3, x3, 11534336
-	.loc 1 2157 0
+	.loc 1 2161 0
 	str	x5, [x22, 64]
-	.loc 1 2158 0
-	stp	x4, x3, [x22, 48]
 	.loc 1 2162 0
+	stp	x4, x3, [x22, 48]
+	.loc 1 2166 0
 	str	x1, [x21, 112]
 .LBB1687:
 .LBB1684:
@@ -6780,7 +6781,7 @@ ebc_probe:
 	ldrsw	x1, [x21, 20]
 .LBE1684:
 .LBE1687:
-	.loc 1 2159 0
+	.loc 1 2163 0
 	str	x4, [x21, 176]
 .LBB1688:
 .LBB1685:
@@ -6789,9 +6790,9 @@ ebc_probe:
 .LVL553:
 .LBE1685:
 .LBE1688:
-	.loc 1 2165 0
+	.loc 1 2169 0
 	str	x0, [x21, 128]
-	.loc 1 2166 0
+	.loc 1 2170 0
 	cbz	x0, .L612
 .LBB1689:
 .LBB1690:
@@ -6804,9 +6805,9 @@ ebc_probe:
 .LVL554:
 .LBE1690:
 .LBE1689:
-	.loc 1 2168 0
+	.loc 1 2172 0
 	str	x0, [x21, 136]
-	.loc 1 2169 0
+	.loc 1 2173 0
 	cbz	x0, .L612
 .LBB1691:
 .LBB1692:
@@ -6819,11 +6820,11 @@ ebc_probe:
 .LVL555:
 .LBE1692:
 .LBE1691:
-	.loc 1 2171 0
+	.loc 1 2175 0
 	str	x0, [x21, 144]
-	.loc 1 2172 0
+	.loc 1 2176 0
 	cbz	x0, .L612
-	.loc 1 2179 0
+	.loc 1 2183 0
 	ldp	w1, w0, [x22, 84]
 .LBB1693:
 .LBB1694:
@@ -6836,17 +6837,17 @@ ebc_probe:
 .LVL556:
 .LBE1694:
 .LBE1693:
-	.loc 1 2179 0
+	.loc 1 2183 0
 	str	x0, [x21, 152]
-	.loc 1 2180 0
+	.loc 1 2184 0
 	cbz	x0, .L612
-	.loc 1 2182 0
+	.loc 1 2186 0
 	ldp	w2, w1, [x22, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
 .LVL557:
-	.loc 1 2183 0
+	.loc 1 2187 0
 	ldrsw	x2, [x21, 20]
 	mov	w1, 255
 	ldr	x0, [x21, 144]
@@ -6856,43 +6857,43 @@ ebc_probe:
 .LBE1701:
 .LBB1702:
 .LBB1703:
-	.loc 1 2077 0
+	.loc 1 2081 0
 	ldr	x26, [x19, 272]
 .LVL559:
-	.loc 1 2083 0
+	.loc 1 2087 0
 	adrp	x1, .LC38
 	mov	w2, 0
 	add	x1, x1, :lo12:.LC38
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL560:
-	.loc 1 2084 0
+	.loc 1 2088 0
 	cbz	x0, .L642
-	.loc 1 2087 0
+	.loc 1 2091 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL561:
 	mov	w24, w0
-	.loc 1 2089 0
+	.loc 1 2093 0
 	cbz	w0, .L686
 .L613:
 .LBE1703:
 .LBE1702:
-	.loc 1 2405 0
+	.loc 1 2409 0
 	adrp	x1, .LC71
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC71
 	bl	_dev_err
 .LVL562:
-	.loc 1 2406 0
+	.loc 1 2410 0
 	b	.L595
 .LVL563:
 	.p2align 3
 .L604:
-	.loc 1 2387 0
+	.loc 1 2391 0
 	mov	w24, -22
-	.loc 1 2386 0
+	.loc 1 2390 0
 	adrp	x1, .LC75
 	mov	w2, w24
 	add	x1, x1, :lo12:.LC75
@@ -6900,7 +6901,7 @@ ebc_probe:
 	bl	_dev_err
 .LVL564:
 .L595:
-	.loc 1 2430 0
+	.loc 1 2434 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w24
 .LVL565:
@@ -6938,7 +6939,7 @@ ebc_probe:
 	.cfi_restore_state
 .LBB1710:
 .LBB1697:
-	.loc 1 2133 0
+	.loc 1 2137 0
 	adrp	x1, .LC37
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC37
@@ -6947,20 +6948,20 @@ ebc_probe:
 .L609:
 .LBE1697:
 .LBE1710:
-	.loc 1 2398 0
+	.loc 1 2402 0
 	adrp	x1, .LC70
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC70
 	bl	_dev_err
 .LVL571:
-	.loc 1 2399 0
+	.loc 1 2403 0
 	b	.L595
 .LVL572:
 	.p2align 3
 .L608:
 .LBB1711:
 .LBB1671:
-	.loc 1 1716 0
+	.loc 1 1720 0
 	str	wzr, [x22, 96]
 	b	.L634
 	.p2align 3
@@ -6974,7 +6975,7 @@ ebc_probe:
 .LBE1656:
 .LBE1658:
 .LBE1660:
-	.loc 1 1713 0
+	.loc 1 1717 0
 	str	wzr, [x22, 92]
 .LBB1661:
 .LBB1659:
@@ -7003,7 +7004,7 @@ ebc_probe:
 .LBE1649:
 .LBE1651:
 .LBE1662:
-	.loc 1 1710 0
+	.loc 1 1714 0
 	str	wzr, [x22, 156]
 .LBB1663:
 .LBB1652:
@@ -7032,7 +7033,7 @@ ebc_probe:
 .LBE1642:
 .LBE1644:
 .LBE1664:
-	.loc 1 1707 0
+	.loc 1 1711 0
 	str	wzr, [x22, 152]
 .LBB1665:
 .LBB1645:
@@ -7061,7 +7062,7 @@ ebc_probe:
 .LBE1635:
 .LBE1637:
 .LBE1666:
-	.loc 1 1704 0
+	.loc 1 1708 0
 	str	wzr, [x22, 148]
 .LBB1667:
 .LBB1638:
@@ -7086,7 +7087,7 @@ ebc_probe:
 .LBE1711:
 .LBB1712:
 .LBB1706:
-	.loc 1 2095 0
+	.loc 1 2099 0
 	mov	x0, x26
 	mov	x3, 1
 .LBB1704:
@@ -7098,28 +7099,28 @@ ebc_probe:
 	sub	x26, x26, x1
 .LBE1705:
 .LBE1704:
-	.loc 1 2095 0
+	.loc 1 2099 0
 	sxtw	x2, w26
 	bl	devm_memremap
 .LVL579:
 	str	x0, [x19, 376]
-	.loc 1 2097 0
+	.loc 1 2101 0
 	cbz	x0, .L688
-	.loc 1 2102 0
+	.loc 1 2106 0
 	bl	epd_lut_from_mem_init
 .LVL580:
-	.loc 1 2103 0
+	.loc 1 2107 0
 	tbnz	w0, #31, .L689
 .L615:
 .LBE1706:
 .LBE1712:
 .LBB1713:
 .LBB1714:
-	.loc 1 2192 0
+	.loc 1 2196 0
 	add	x0, x19, 736
 	mov	x1, 68719476704
 	str	x1, [x21, 544]
-	.loc 1 2194 0
+	.loc 1 2198 0
 	add	x25, x25, :lo12:.LANCHOR0
 .LBB1715:
 .LBB1716:
@@ -7133,7 +7134,7 @@ ebc_probe:
 .LBE1717:
 .LBE1716:
 .LBE1715:
-	.loc 1 2190 0
+	.loc 1 2194 0
 	mov	w26, 99
 .LBB1721:
 .LBB1720:
@@ -7142,32 +7143,32 @@ ebc_probe:
 	str	x0, [x0, 8]
 .LBE1720:
 .LBE1721:
-	.loc 1 2192 0
+	.loc 1 2196 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x21, 568]
-	.loc 1 2194 0
+	.loc 1 2198 0
 	adrp	x3, .LC72
 	mov	w2, -1
 	add	x3, x3, :lo12:.LC72
 	mov	x1, x21
 	adrp	x0, ebc_auto_tast_function
-	.loc 1 2190 0
-	str	w26, [x29, 104]
 	.loc 1 2194 0
+	str	w26, [x29, 104]
+	.loc 1 2198 0
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
 .LVL581:
 	str	x0, [x25, 8]
-	.loc 1 2195 0
+	.loc 1 2199 0
 	cmn	x0, #4096
 	bhi	.L690
-	.loc 1 2199 0
+	.loc 1 2203 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
 .LVL582:
-	.loc 1 2200 0
+	.loc 1 2204 0
 	ldr	x2, [x25, 8]
 .LBB1722:
 .LBB1723:
@@ -7209,7 +7210,7 @@ ebc_probe:
 .LBE1723:
 .LBE1722:
 .LBB1724:
-	.loc 1 2203 0
+	.loc 1 2207 0
 	adrp	x3, .LC43
 	adrp	x0, ebc_thread
 .LVL586:
@@ -7218,10 +7219,10 @@ ebc_probe:
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x21
 .LBE1724:
-	.loc 1 2202 0
+	.loc 1 2206 0
 	str	w26, [x29, 104]
 .LBB1725:
-	.loc 1 2203 0
+	.loc 1 2207 0
 	bl	kthread_create_on_node
 .LVL587:
 	mov	x25, x0
@@ -7232,13 +7233,13 @@ ebc_probe:
 .LVL589:
 .LBE1725:
 	str	x25, [x21, 120]
-	.loc 1 2208 0
+	.loc 1 2212 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x25
 	bl	sched_setscheduler_nocheck
 .LVL590:
-	.loc 1 2209 0
+	.loc 1 2213 0
 	ldr	x2, [x21, 120]
 .LBB1726:
 .LBB1727:
@@ -7282,7 +7283,7 @@ ebc_probe:
 .LBE1713:
 .LBB1730:
 .LBB1731:
-	.loc 1 2218 0
+	.loc 1 2222 0
 	mov	w0, -1
 .LVL594:
 	str	w0, [x21, 48]
@@ -7293,9 +7294,9 @@ ebc_probe:
 .LVL595:
 .LBE1733:
 .LBE1732:
-	.loc 1 2222 0
+	.loc 1 2226 0
 	str	wzr, [x21, 28]
-	.loc 1 2221 0
+	.loc 1 2225 0
 	str	wzr, [x21, 80]
 .LBB1738:
 .LBB1734:
@@ -7303,7 +7304,7 @@ ebc_probe:
 	adrp	x1, .LC44
 .LBE1734:
 .LBE1738:
-	.loc 1 2217 0
+	.loc 1 2221 0
 	str	wzr, [x21, 184]
 .LBB1739:
 .LBB1735:
@@ -7311,14 +7312,14 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC44
 .LBE1735:
 .LBE1739:
-	.loc 1 2219 0
+	.loc 1 2223 0
 	str	wzr, [x21, 592]
-	.loc 1 2229 0
+	.loc 1 2233 0
 	add	x25, x19, 616
 .LVL596:
-	.loc 1 2220 0
+	.loc 1 2224 0
 	str	wzr, [x21, 596]
-	.loc 1 2230 0
+	.loc 1 2234 0
 	adrp	x26, jiffies
 .LBB1740:
 .LBB1736:
@@ -7326,7 +7327,7 @@ ebc_probe:
 	stp	xzr, xzr, [x0]
 .LBE1736:
 .LBE1740:
-	.loc 1 2230 0
+	.loc 1 2234 0
 	mov	x27, 268435455
 .LBB1741:
 .LBB1737:
@@ -7350,9 +7351,9 @@ ebc_probe:
 .LVL597:
 .LBE1737:
 .LBE1741:
-	.loc 1 2226 0
+	.loc 1 2230 0
 	str	wzr, [x21, 424]
-	.loc 1 2229 0
+	.loc 1 2233 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -7361,16 +7362,16 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
 .LVL598:
-	.loc 1 2230 0
+	.loc 1 2234 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
-	.loc 1 2233 0
+	.loc 1 2237 0
 	add	x25, x19, 672
-	.loc 1 2230 0
+	.loc 1 2234 0
 	add	x1, x1, x27
 	bl	mod_timer
 .LVL599:
-	.loc 1 2233 0
+	.loc 1 2237 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -7379,7 +7380,7 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
 .LVL600:
-	.loc 1 2234 0
+	.loc 1 2238 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
 	add	x1, x1, x27
@@ -7389,99 +7390,99 @@ ebc_probe:
 .LBE1730:
 .LBB1742:
 .LBB1743:
-	.loc 1 2244 0
+	.loc 1 2248 0
 	adrp	x0, saved_command_line
 	adrp	x1, .LC45
-	.loc 1 2241 0
+	.loc 1 2245 0
 	stp	wzr, wzr, [x29, 100]
 .LVL602:
-	.loc 1 2244 0
+	.loc 1 2248 0
 	add	x1, x1, :lo12:.LC45
 	ldr	x25, [x0, #:lo12:saved_command_line]
 	mov	x0, x25
 	bl	strstr
 .LVL603:
-	.loc 1 2245 0
+	.loc 1 2249 0
 	adrp	x1, .LC46
-	.loc 1 2244 0
+	.loc 1 2248 0
 	mov	x26, x0
 .LVL604:
-	.loc 1 2245 0
+	.loc 1 2249 0
 	add	x1, x1, :lo12:.LC46
 	mov	x0, x25
 	bl	strstr
 .LVL605:
 	mov	x28, x0
 .LVL606:
-	.loc 1 2250 0
+	.loc 1 2254 0
 	cbz	x26, .L618
-	.loc 1 2251 0
+	.loc 1 2255 0
 	add	x2, x29, 100
 	adrp	x1, .LC47
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC47
 	bl	sscanf
 .LVL607:
-	.loc 1 2252 0
+	.loc 1 2256 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
 	bls	.L691
 .L618:
-	.loc 1 2264 0
+	.loc 1 2268 0
 	mov	w25, 0
 .LVL608:
 	mov	x27, 0
 .LVL609:
-	.loc 1 2248 0
+	.loc 1 2252 0
 	mov	x26, 0
 .LVL610:
-	.loc 1 2264 0
+	.loc 1 2268 0
 	cbz	x28, .L638
 .LVL611:
 .L637:
-	.loc 1 2265 0
+	.loc 1 2269 0
 	add	x2, x29, 104
 	mov	x0, x28
 	adrp	x1, .LC50
 	add	x1, x1, :lo12:.LC50
 	bl	sscanf
 .LVL612:
-	.loc 1 2243 0
+	.loc 1 2247 0
 	mov	w28, 0
 .LVL613:
-	.loc 1 2266 0
+	.loc 1 2270 0
 	ldr	w2, [x29, 104]
-	.loc 1 2248 0
+	.loc 1 2252 0
 	mov	x26, 0
 .LVL614:
-	.loc 1 2266 0
+	.loc 1 2270 0
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
 	bls	.L692
 .L622:
-	.loc 1 2278 0
+	.loc 1 2282 0
 	cbnz	w25, .L621
 .LVL615:
 .L638:
-	.loc 1 2279 0
+	.loc 1 2283 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC53
 	add	x1, x1, :lo12:.LC53
 	bl	_dev_info
 .LVL616:
-	.loc 1 2280 0
+	.loc 1 2284 0
 	ldr	x0, [x19, 16]
 	bl	ebc_pmic_verity_vcom
 .LVL617:
 .LBB1744:
 .LBB1745:
-	.loc 1 1624 0
+	.loc 1 1628 0
 	bl	ebc_empty_buf_get
 .LVL618:
 	mov	x25, x0
 .LVL619:
-	.loc 1 1625 0
+	.loc 1 1629 0
 	ldp	w2, w0, [x19, 108]
 	mov	w1, 255
 	mul	w2, w2, w0
@@ -7489,43 +7490,43 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memset
 .LVL620:
-	.loc 1 1628 0
+	.loc 1 1632 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1626 0
-	mov	w0, 16
+	.loc 1 1630 0
+	mov	w0, 17
 	str	w0, [x25, 40]
-	.loc 1 1631 0
+	.loc 1 1635 0
 	mov	x0, x25
-	.loc 1 1629 0
+	.loc 1 1633 0
 	ldr	w1, [x19, 108]
 	str	w1, [x25, 56]
-	.loc 1 1630 0
+	.loc 1 1634 0
 	ldr	w1, [x19, 112]
 	str	w1, [x25, 60]
-	.loc 1 1631 0
+	.loc 1 1635 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL621:
 .L624:
 .LBE1745:
 .LBE1744:
-	.loc 1 2297 0
+	.loc 1 2301 0
 	cbnz	w28, .L693
 .L626:
-	.loc 1 2310 0
+	.loc 1 2314 0
 	ldr	w0, [x21, 80]
 	adrp	x22, .LANCHOR1
 	cbz	w0, .L694
 .L628:
-	.loc 1 2315 0
+	.loc 1 2319 0
 	cbz	x27, .L629
-	.loc 1 2316 0
+	.loc 1 2320 0
 	mov	x0, x27
 	bl	kfree
 .LVL622:
 .L629:
-	.loc 1 2317 0
+	.loc 1 2321 0
 	cbz	x26, .L620
-	.loc 1 2318 0
+	.loc 1 2322 0
 	mov	x0, x26
 	bl	kfree
 .LVL623:
@@ -7542,49 +7543,49 @@ ebc_probe:
 .LBE1755:
 .LBB1758:
 .LBB1759:
-	.loc 1 2061 0
+	.loc 1 2065 0
 	add	x22, x22, :lo12:.LANCHOR1
 	add	x0, x22, 224
 	bl	misc_register
 .LVL624:
-	.loc 1 2063 0
+	.loc 1 2067 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 400
 	bl	device_create_file
 .LVL625:
-	.loc 1 2064 0
+	.loc 1 2068 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 432
 	bl	device_create_file
 .LVL626:
-	.loc 1 2065 0
+	.loc 1 2069 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 464
 	bl	device_create_file
 .LVL627:
-	.loc 1 2066 0
+	.loc 1 2070 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 496
 	bl	device_create_file
 .LVL628:
-	.loc 1 2067 0
+	.loc 1 2071 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 528
 	bl	device_create_file
 .LVL629:
-	.loc 1 2068 0
+	.loc 1 2072 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 560
 	bl	device_create_file
 .LVL630:
-	.loc 1 2069 0
+	.loc 1 2073 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 592
 	bl	device_create_file
 .LVL631:
 .LBE1759:
 .LBE1758:
-	.loc 1 2427 0
+	.loc 1 2431 0
 	ldr	x0, [x21, 88]
 	adrp	x2, .LC16
 	adrp	x1, .LC54
@@ -7592,20 +7593,20 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC54
 	bl	_dev_info
 .LVL632:
-	.loc 1 2429 0
+	.loc 1 2433 0
 	b	.L595
 .LVL633:
 	.p2align 3
 .L691:
 .LBB1760:
 .LBB1752:
-	.loc 1 2254 0
+	.loc 1 2258 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC48
 	add	x1, x1, :lo12:.LC48
 	bl	_dev_info
 .LVL634:
-	.loc 1 2255 0
+	.loc 1 2259 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
 .LBB1746:
@@ -7623,9 +7624,9 @@ ebc_probe:
 .LBE1748:
 .LBE1747:
 .LBE1746:
-	.loc 1 2256 0
-	cbz	x0, .L695
 	.loc 1 2260 0
+	cbz	x0, .L695
+	.loc 1 2264 0
 	ldp	w2, w1, [x22, 84]
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
@@ -7638,23 +7639,23 @@ ebc_probe:
 	add	x1, x3, x1
 	bl	memcpy
 .LVL639:
-	.loc 1 2264 0
+	.loc 1 2268 0
 	cbnz	x28, .L696
-	.loc 1 2243 0
+	.loc 1 2247 0
 	mov	w28, 0
 .LVL640:
-	.loc 1 2248 0
+	.loc 1 2252 0
 	mov	x26, 0
 .LVL641:
 .L621:
-	.loc 1 2285 0
+	.loc 1 2289 0
 	bl	ebc_empty_buf_get
 .LVL642:
 	mov	x25, x0
 .LVL643:
-	.loc 1 2286 0
+	.loc 1 2290 0
 	cbz	x0, .L624
-	.loc 1 2287 0
+	.loc 1 2291 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
@@ -7662,30 +7663,30 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL644:
-	.loc 1 2290 0
+	.loc 1 2294 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 2288 0
+	.loc 1 2292 0
 	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 2293 0
+	.loc 1 2297 0
 	mov	x0, x25
-	.loc 1 2291 0
+	.loc 1 2295 0
 	ldr	w1, [x22, 84]
 	str	w1, [x25, 56]
-	.loc 1 2292 0
+	.loc 1 2296 0
 	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 2293 0
+	.loc 1 2297 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL645:
 	b	.L624
 .LVL646:
 	.p2align 3
 .L694:
-	.loc 1 2311 0
+	.loc 1 2315 0
 	mov	w2, 1
 	str	w2, [x21, 80]
-	.loc 1 2312 0
+	.loc 1 2316 0
 	add	x0, x22, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
@@ -7695,13 +7696,13 @@ ebc_probe:
 .LVL648:
 	.p2align 3
 .L692:
-	.loc 1 2268 0
+	.loc 1 2272 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC51
 	add	x1, x1, :lo12:.LC51
 	bl	_dev_info
 .LVL649:
-	.loc 1 2269 0
+	.loc 1 2273 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
 .LBB1749:
@@ -7717,13 +7718,13 @@ ebc_probe:
 .LBE1751:
 .LBE1750:
 .LBE1749:
-	.loc 1 2270 0
-	cbz	x0, .L697
 	.loc 1 2274 0
+	cbz	x0, .L697
+	.loc 1 2278 0
 	ldp	w2, w1, [x22, 84]
-	.loc 1 2267 0
+	.loc 1 2271 0
 	mov	w28, 1
-	.loc 1 2274 0
+	.loc 1 2278 0
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
@@ -7743,7 +7744,7 @@ ebc_probe:
 .LBE1760:
 .LBB1761:
 .LBB1698:
-	.loc 1 2143 0
+	.loc 1 2147 0
 	mov	w24, -12
 	b	.L609
 .LVL655:
@@ -7753,14 +7754,14 @@ ebc_probe:
 .LBE1761:
 .LBB1762:
 .LBB1753:
-	.loc 1 2298 0
+	.loc 1 2302 0
 	bl	ebc_empty_buf_get
 .LVL656:
 	mov	x25, x0
 .LVL657:
-	.loc 1 2299 0
+	.loc 1 2303 0
 	cbz	x0, .L626
-	.loc 1 2300 0
+	.loc 1 2304 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
@@ -7768,20 +7769,20 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL658:
-	.loc 1 2303 0
+	.loc 1 2307 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 2301 0
+	.loc 1 2305 0
 	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 2304 0
+	.loc 1 2308 0
 	ldr	w0, [x22, 84]
 	str	w0, [x25, 56]
-	.loc 1 2306 0
+	.loc 1 2310 0
 	mov	x0, x25
-	.loc 1 2305 0
+	.loc 1 2309 0
 	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 2306 0
+	.loc 1 2310 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL659:
 	b	.L626
@@ -7792,26 +7793,26 @@ ebc_probe:
 .LBE1762:
 .LBB1763:
 .LBB1707:
-	.loc 1 2104 0
+	.loc 1 2108 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC40
 	add	x1, x1, :lo12:.LC40
 	bl	_dev_err
 .LVL661:
-	.loc 1 2105 0
+	.loc 1 2109 0
 	ldr	x0, [x19, 272]
 	mov	w2, w26
 	ldr	x1, [x19, 376]
 	bl	epd_lut_from_file_init
 .LVL662:
-	.loc 1 2106 0
+	.loc 1 2110 0
 	tbz	w0, #31, .L615
-	.loc 1 2107 0
+	.loc 1 2111 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC41
-	.loc 1 2108 0
+	.loc 1 2112 0
 	mov	w24, -1
-	.loc 1 2107 0
+	.loc 1 2111 0
 	add	x1, x1, :lo12:.LC41
 	bl	_dev_err
 .LVL663:
@@ -7821,7 +7822,7 @@ ebc_probe:
 .L599:
 .LBE1707:
 .LBE1763:
-	.loc 1 2351 0
+	.loc 1 2355 0
 	mov	w24, -517
 	b	.L595
 .LVL665:
@@ -7829,7 +7830,7 @@ ebc_probe:
 .L690:
 .LBB1764:
 .LBB1728:
-	.loc 1 2196 0
+	.loc 1 2200 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC42
 	add	x1, x1, :lo12:.LC42
@@ -7838,29 +7839,29 @@ ebc_probe:
 .L616:
 .LBE1728:
 .LBE1764:
-	.loc 1 2412 0
+	.loc 1 2416 0
 	adrp	x1, .LC74
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC74
-	.loc 1 2413 0
+	.loc 1 2417 0
 	mov	w24, -1
-	.loc 1 2412 0
+	.loc 1 2416 0
 	bl	_dev_err
 .LVL667:
-	.loc 1 2413 0
+	.loc 1 2417 0
 	b	.L595
 .LVL668:
 	.p2align 3
 .L617:
 .LBB1765:
 .LBB1729:
-	.loc 1 2205 0
+	.loc 1 2209 0
 	ldr	x0, [x21, 88]
 .LVL669:
 	adrp	x1, .LC73
-	.loc 1 2203 0
+	.loc 1 2207 0
 	str	x25, [x21, 120]
-	.loc 1 2205 0
+	.loc 1 2209 0
 	add	x1, x1, :lo12:.LC73
 	bl	_dev_err
 .LVL670:
@@ -7870,7 +7871,7 @@ ebc_probe:
 .L640:
 .LBE1729:
 .LBE1765:
-	.loc 1 2337 0
+	.loc 1 2341 0
 	mov	w24, -12
 	b	.L595
 .LVL672:
@@ -7878,86 +7879,86 @@ ebc_probe:
 .L641:
 .LBB1766:
 .LBB1699:
-	.loc 1 2128 0
+	.loc 1 2132 0
 	mov	w24, -19
 	b	.L609
 .LVL673:
 .L680:
 .LBE1699:
 .LBE1766:
-	.loc 1 2344 0
+	.loc 1 2348 0
 	adrp	x1, .LC26
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC26
-	.loc 1 2345 0
+	.loc 1 2349 0
 	mov	w24, -19
-	.loc 1 2344 0
+	.loc 1 2348 0
 	bl	_dev_err
 .LVL674:
-	.loc 1 2345 0
+	.loc 1 2349 0
 	b	.L595
 .L683:
-	.loc 1 2372 0
+	.loc 1 2376 0
 	adrp	x1, .LC30
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC30
-	.loc 1 2373 0
+	.loc 1 2377 0
 	mov	w24, -517
-	.loc 1 2372 0
+	.loc 1 2376 0
 	bl	_dev_err
 .LVL675:
-	.loc 1 2373 0
+	.loc 1 2377 0
 	b	.L595
 .L681:
-	.loc 1 2360 0
+	.loc 1 2364 0
 	adrp	x1, .LC28
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC28
-	.loc 1 2361 0
+	.loc 1 2365 0
 	mov	w24, -19
-	.loc 1 2360 0
+	.loc 1 2364 0
 	bl	_dev_err
 .LVL676:
-	.loc 1 2361 0
+	.loc 1 2365 0
 	b	.L595
 .LVL677:
 .L642:
 .LBB1767:
 .LBB1708:
-	.loc 1 2085 0
+	.loc 1 2089 0
 	mov	w24, -19
 	b	.L613
 .LVL678:
 .L682:
 .LBE1708:
 .LBE1767:
-	.loc 1 2367 0
+	.loc 1 2371 0
 	adrp	x1, .LC29
 	mov	x0, x20
 .LVL679:
 	add	x1, x1, :lo12:.LC29
-	.loc 1 2368 0
+	.loc 1 2372 0
 	mov	w24, -517
-	.loc 1 2367 0
+	.loc 1 2371 0
 	bl	_dev_err
 .LVL680:
-	.loc 1 2368 0
+	.loc 1 2372 0
 	b	.L595
 .LVL681:
 .L688:
 .LBB1768:
 .LBB1709:
-	.loc 1 2098 0
+	.loc 1 2102 0
 	ldr	x0, [x19, 272]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
 	adrp	x1, .LC39
-	mov	w3, 2098
+	mov	w3, 2102
 	add	x2, x2, 32
 	add	x1, x1, :lo12:.LC39
-	.loc 1 2099 0
+	.loc 1 2103 0
 	mov	w24, -12
-	.loc 1 2098 0
+	.loc 1 2102 0
 	bl	_dev_err
 .LVL682:
 	b	.L613
@@ -7965,13 +7966,13 @@ ebc_probe:
 .L687:
 .LBE1709:
 .LBE1768:
-	.loc 1 2430 0
+	.loc 1 2434 0
 	bl	__stack_chk_fail
 .LVL684:
 .L697:
 .LBB1769:
 .LBB1754:
-	.loc 1 2271 0
+	.loc 1 2275 0
 	ldr	x0, [x21, 88]
 .LVL685:
 	adrp	x1, .LC52
@@ -7982,7 +7983,7 @@ ebc_probe:
 	b	.L620
 .LVL687:
 .L695:
-	.loc 1 2257 0
+	.loc 1 2261 0
 	ldr	x0, [x21, 88]
 .LVL688:
 	adrp	x1, .LC49
@@ -7993,7 +7994,7 @@ ebc_probe:
 	b	.L620
 .LVL690:
 .L696:
-	.loc 1 2253 0
+	.loc 1 2257 0
 	mov	w25, 1
 .LVL691:
 	b	.L637
@@ -8522,16 +8523,16 @@ new_buffer_refresh:
 	.type	ebc_thread, %function
 ebc_thread:
 .LFB2826:
-	.loc 1 1321 0
+	.loc 1 1324 0
 	.cfi_startproc
 .LVL745:
 	stp	x29, x30, [sp, -224]!
 	.cfi_def_cfa_offset 224
 	.cfi_offset 29, -224
 	.cfi_offset 30, -216
-	.loc 1 1322 0
+	.loc 1 1325 0
 	adrp	x1, .LANCHOR0
-	.loc 1 1321 0
+	.loc 1 1324 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -8543,22 +8544,22 @@ ebc_thread:
 	adrp	x22, __stack_chk_guard
 	stp	x23, x24, [sp, 48]
 	adrp	x21, .LANCHOR1
-	.loc 1 1322 0
+	.loc 1 1325 0
 	ldr	x20, [x1, #:lo12:.LANCHOR0]
 .LVL746:
-	.loc 1 1321 0
+	.loc 1 1324 0
 	add	x0, x22, :lo12:__stack_chk_guard
 .LVL747:
 	stp	x25, x26, [sp, 64]
 .LBB1798:
 .LBB1799:
 .LBB1800:
-	.loc 1 1612 0
+	.loc 1 1616 0
 	add	x21, x21, :lo12:.LANCHOR1
 .LBE1800:
 .LBE1799:
 .LBE1798:
-	.loc 1 1321 0
+	.loc 1 1324 0
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 23, -176
 	.cfi_offset 24, -168
@@ -8566,69 +8567,69 @@ ebc_thread:
 	.cfi_offset 26, -152
 	.cfi_offset 27, -144
 	.cfi_offset 28, -136
-	.loc 1 1323 0
+	.loc 1 1326 0
 	add	x24, x20, 184
 .LBB1805:
 .LBB1803:
 .LBB1801:
-	.loc 1 1612 0
+	.loc 1 1616 0
 	add	x19, x21, 304
 .LBE1801:
 .LBE1803:
 .LBE1805:
-	.loc 1 1326 0
+	.loc 1 1329 0
 	mov	w23, 0
 .LVL748:
-	.loc 1 1321 0
+	.loc 1 1324 0
 	ldr	x1, [x0]
 	str	x1, [x29, 216]
 	mov	x1,0
 .LVL749:
 	.p2align 2
 .L758:
-	.loc 1 1331 0
+	.loc 1 1334 0
 	ldr	w0, [x24, 600]
 .LVL750:
 	cbnz	w0, .L886
 .L759:
-	.loc 1 1337 0
+	.loc 1 1340 0
 	bl	ebc_dsp_buf_get
 .LVL751:
 	mov	x28, x0
-	.loc 1 1339 0
+	.loc 1 1342 0
 	cbz	x0, .L761
-	.loc 1 1339 0 is_stmt 0 discriminator 1
+	.loc 1 1342 0 is_stmt 0 discriminator 1
 	ldr	x1, [x0, 8]
 	cbz	x1, .L761
-	.loc 1 1340 0 is_stmt 1
+	.loc 1 1343 0 is_stmt 1
 	ldr	w1, [x0, 40]
-	cmp	w1, 19
+	cmp	w1, 20
 	beq	.L887
-	.loc 1 1344 0
+	.loc 1 1347 0
 	ldr	x2, [x24, 592]
 	cbz	x2, .L764
-	.loc 1 1345 0
-	cmp	w1, 18
+	.loc 1 1348 0
+	cmp	w1, 19
 	beq	.L888
 .L879:
-	.loc 1 1402 0
+	.loc 1 1405 0
 	bl	ebc_remove_from_dsp_buf_list
 .LVL752:
-	.loc 1 1403 0
+	.loc 1 1406 0
 	mov	x0, x28
 	bl	ebc_buf_release
 .LVL753:
-	.loc 1 1331 0
+	.loc 1 1334 0
 	ldr	w0, [x24, 600]
 	cbz	w0, .L759
 	.p2align 2
 .L886:
-	.loc 1 1332 0
+	.loc 1 1335 0
 	ldr	w0, [x24, 184]
 	cmp	w0, 1
 	beq	.L889
 .L760:
-	.loc 1 1618 0
+	.loc 1 1622 0
 	add	x22, x22, :lo12:__stack_chk_guard
 	mov	w0, 0
 	ldr	x2, [x29, 216]
@@ -8664,12 +8665,12 @@ ebc_thread:
 	.p2align 3
 .L761:
 	.cfi_restore_state
-	.loc 1 1599 0
+	.loc 1 1603 0
 	ldr	w0, [x24, 28]
 .LVL759:
 	cmp	w0, 1
 	beq	.L891
-	.loc 1 1608 0
+	.loc 1 1612 0
 	ldr	w0, [x24, 184]
 	cmp	w0, 1
 	beq	.L892
@@ -8677,12 +8678,12 @@ ebc_thread:
 .L882:
 	ldr	w0, [x24, 80]
 .LVL761:
-	.loc 1 1611 0
+	.loc 1 1615 0
 	cbz	w0, .L893
 .L845:
 .LVL762:
 .L835:
-	.loc 1 1613 0
+	.loc 1 1617 0
 	str	wzr, [x24, 80]
 	b	.L758
 .LVL763:
@@ -8690,7 +8691,7 @@ ebc_thread:
 .L893:
 .LBB1806:
 .LBB1804:
-	.loc 1 1612 0 discriminator 1
+	.loc 1 1616 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
@@ -8700,13 +8701,13 @@ ebc_thread:
 .L894:
 .LVL765:
 .LBB1802:
-	.loc 1 1612 0 is_stmt 0 discriminator 5
+	.loc 1 1616 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L835
-	.loc 1 1612 0 discriminator 7
+	.loc 1 1616 0 discriminator 7
 	bl	schedule
 .LVL766:
 .L846:
-	.loc 1 1612 0 discriminator 9
+	.loc 1 1616 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
@@ -8715,27 +8716,27 @@ ebc_thread:
 	ldr	w1, [x24, 80]
 	cbz	w1, .L894
 .LBE1802:
-	.loc 1 1612 0 discriminator 4
+	.loc 1 1616 0 discriminator 4
 	add	x1, x29, 112
 	mov	x0, x19
 	bl	finish_wait
 .LVL768:
 .LBE1804:
 .LBE1806:
-	.loc 1 1613 0 is_stmt 1 discriminator 4
+	.loc 1 1617 0 is_stmt 1 discriminator 4
 	str	wzr, [x24, 80]
 	b	.L758
 .LVL769:
 	.p2align 3
 .L764:
-	.loc 1 1357 0
-	cmp	w1, 17
-	ccmp	w1, 20, 4, ne
+	.loc 1 1360 0
+	cmp	w1, 18
+	ccmp	w1, 21, 4, ne
 	bne	.L767
-	.loc 1 1358 0
+	.loc 1 1361 0
 	str	wzr, [x24, 608]
 .L763:
-	.loc 1 1381 0
+	.loc 1 1384 0
 	adrp	x25, jiffies
 .LVL770:
 	mov	x1, 402653184
@@ -8744,30 +8745,30 @@ ebc_thread:
 	add	x1, x2, x1
 	bl	mod_timer
 .LVL771:
-	.loc 1 1383 0
+	.loc 1 1386 0
 	ldr	w0, [x24, 428]
 	cbz	w0, .L769
 	ldr	x0, [x24, 200]
 .L770:
-	.loc 1 1386 0
+	.loc 1 1389 0
 	ldr	w2, [x0, 40]
 	ldr	w3, [x28, 40]
 	cmp	w3, w2
 	beq	.L771
-	.loc 1 1387 0
+	.loc 1 1390 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC79
 	add	x1, x1, :lo12:.LC79
 	bl	_dev_info
 .LVL772:
-	.loc 1 1388 0
+	.loc 1 1391 0
 	ldr	w0, [x24, 28]
 	cmp	w0, 1
 	beq	.L895
 .L880:
 	ldr	w2, [x28, 40]
 .L771:
-	.loc 1 1395 0
+	.loc 1 1398 0
 	cmp	w2, 11
 	bgt	.L778
 	cmp	w2, 7
@@ -8776,25 +8777,25 @@ ebc_thread:
 	beq	.L780
 	bgt	.L850
 	cbnz	w2, .L777
-	.loc 1 1440 0
+	.loc 1 1443 0
 	add	x0, x21, 624
 	bl	down_write
 .LVL773:
-	.loc 1 1446 0
+	.loc 1 1449 0
 	ldr	x0, [x24, 200]
-	.loc 1 1441 0
+	.loc 1 1444 0
 	str	x28, [x24, 208]
-	.loc 1 1446 0
+	.loc 1 1449 0
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
 	bls	.L814
-	.loc 1 1448 0
+	.loc 1 1451 0
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x28, 16]
 	ldr	x0, [x24, 128]
 	bl	memcpy
 .LVL774:
-	.loc 1 1449 0
+	.loc 1 1452 0
 	ldr	x0, [x24, 200]
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x0, 16]
@@ -8802,91 +8803,91 @@ ebc_thread:
 	bl	memcpy
 .LVL775:
 .L815:
-	.loc 1 1455 0
+	.loc 1 1458 0
 	add	x0, x21, 624
 	bl	up_write
 .LVL776:
-	.loc 1 1457 0
+	.loc 1 1460 0
 	ldr	w0, [x24, 28]
 	cbnz	w0, .L792
-	.loc 1 1458 0
+	.loc 1 1461 0
 	mov	w0, 1
 	str	w0, [x24, 28]
-	.loc 1 1460 0
+	.loc 1 1463 0
 	ldr	w0, [x24, 184]
-	.loc 1 1459 0
+	.loc 1 1462 0
 	str	wzr, [x24, 76]
-	.loc 1 1460 0
+	.loc 1 1463 0
 	cbz	w0, .L896
 .L816:
-	.loc 1 1462 0
+	.loc 1 1465 0
 	mov	x0, x20
 	bl	ebc_lut_update
 .LVL777:
 	cmn	w0, #1
 	beq	.L897
-	.loc 1 1470 0
+	.loc 1 1473 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC85
-	.loc 1 1467 0
-	ldr	w3, [x24, 96]
 	.loc 1 1470 0
+	ldr	w3, [x24, 96]
+	.loc 1 1473 0
 	add	x1, x1, :lo12:.LC85
-	.loc 1 1467 0
+	.loc 1 1470 0
 	strb	w3, [x24, 32]
 .LVL778:
 .L881:
-	.loc 1 1470 0
+	.loc 1 1473 0
 	and	w2, w3, 255
-	.loc 1 1468 0
+	.loc 1 1471 0
 	lsr	w3, w3, 8
 	strb	w3, [x24, 33]
-	.loc 1 1470 0
+	.loc 1 1473 0
 	bl	_dev_info
 .LVL779:
-	.loc 1 1471 0
+	.loc 1 1474 0
 	mov	x0, x20
 	bl	ebc_frame_start
 .LVL780:
-	.loc 1 1573 0
+	.loc 1 1577 0
 	ldr	x0, [x24, 208]
 	ldr	w0, [x0, 40]
-	cmp	w0, 19
+	cmp	w0, 20
 	bne	.L831
 .LVL781:
 .L902:
-	.loc 1 1576 0
+	.loc 1 1580 0
 	ldr	x0, [x24, 88]
-	.loc 1 1574 0
+	.loc 1 1578 0
 	mov	w25, 1
 .LVL782:
-	.loc 1 1575 0
+	.loc 1 1579 0
 	str	wzr, [x24, 188]
-	.loc 1 1576 0
+	.loc 1 1580 0
 	adrp	x1, .LC88
-	.loc 1 1574 0
+	.loc 1 1578 0
 	str	w25, [x24, 600]
-	.loc 1 1576 0
+	.loc 1 1580 0
 	add	x1, x1, :lo12:.LC88
 	bl	_dev_info
 .LVL783:
-	.loc 1 1577 0
+	.loc 1 1581 0
 	mov	w2, w25
 	mov	w1, w25
 	add	x0, x21, 328
 	bl	__wake_up_sync
 .LVL784:
-	.loc 1 1588 0
+	.loc 1 1592 0
 	mov	x0, x28
 	bl	ebc_remove_from_dsp_buf_list
 .LVL785:
-	.loc 1 1590 0
+	.loc 1 1594 0
 	ldr	w0, [x24, 428]
 	cbz	w0, .L833
 .LVL786:
 	.p2align 2
 .L904:
-	.loc 1 1591 0
+	.loc 1 1595 0
 	ldr	x0, [x24, 200]
 	bl	ebc_buf_release
 .LVL787:
@@ -8894,75 +8895,75 @@ ebc_thread:
 .LVL788:
 	.p2align 3
 .L769:
-	.loc 1 1384 0
+	.loc 1 1387 0
 	mov	x0, x28
 	str	x28, [x24, 200]
 	b	.L770
 .LVL789:
 	.p2align 3
 .L887:
-	.loc 1 1342 0
+	.loc 1 1345 0
 	str	wzr, [x24, 604]
-	.loc 1 1341 0
+	.loc 1 1344 0
 	str	wzr, [x24, 608]
 	b	.L763
 .LVL790:
 	.p2align 3
 .L778:
-	.loc 1 1395 0
-	cmp	w2, 14
+	.loc 1 1398 0
+	cmp	w2, 15
 	bgt	.L783
-	cmp	w2, 13
+	cmp	w2, 14
 	bge	.L779
 .L850:
-	.loc 1 1495 0
+	.loc 1 1499 0
 	ldr	x26, [x24, 200]
-	.loc 1 1486 0
+	.loc 1 1490 0
 	mov	w7, 1
 .LVL791:
-	.loc 1 1496 0
+	.loc 1 1500 0
 	ldr	w0, [x26, 40]
 	cmp	w0, 1
 	bls	.L898
 .L818:
-	.loc 1 1507 0
+	.loc 1 1511 0
 	str	wzr, [x24, 76]
-	.loc 1 1508 0
+	.loc 1 1512 0
 	str	x28, [x24, 208]
-	.loc 1 1511 0
+	.loc 1 1515 0
 	ldr	w0, [x28, 40]
 	sub	w0, w0, #2
-	.loc 1 1510 0
-	cmp	w0, 13
+	.loc 1 1514 0
+	cmp	w0, 14
 	bhi	.L819
 .L899:
-	.loc 1 1513 0
+	.loc 1 1517 0
 	ldr	x0, [x24, 200]
 .LBB1807:
 .LBB1808:
-	.loc 1 1306 0
+	.loc 1 1309 0
 	ldr	w1, [x24, 20]
 .LBE1808:
 .LBE1807:
-	.loc 1 1512 0
+	.loc 1 1516 0
 	ldr	x4, [x28, 16]
 .LBB1811:
 .LBB1809:
-	.loc 1 1306 0
+	.loc 1 1309 0
 	cmp	w1, 0
 .LBE1809:
 .LBE1811:
-	.loc 1 1513 0
+	.loc 1 1517 0
 	ldr	x5, [x0, 16]
 .LBB1812:
 .LBB1810:
-	.loc 1 1306 0
+	.loc 1 1309 0
 	add	w0, w1, 7
 	csel	w0, w0, w1, lt
 	asr	w0, w0, 3
 	cmp	w0, 0
 	ble	.L820
-	.loc 1 1310 0
+	.loc 1 1313 0
 	ldr	x1, [x4]
 	ldr	x2, [x5]
 	cmp	x2, x1
@@ -8974,130 +8975,130 @@ ebc_thread:
 	b	.L822
 	.p2align 3
 .L823:
-	.loc 1 1307 0
+	.loc 1 1310 0
 	ldr	x3, [x4, x0]
 	add	x0, x0, 8
-	.loc 1 1308 0
+	.loc 1 1311 0
 	add	x2, x5, x0
-	.loc 1 1310 0
+	.loc 1 1313 0
 	ldr	x2, [x2, -8]
 	cmp	x3, x2
 	bne	.L819
 .L822:
-	.loc 1 1306 0
+	.loc 1 1309 0
 	cmp	x1, x0
 	bne	.L823
 .L820:
 .LBE1810:
 .LBE1812:
-	.loc 1 1515 0
+	.loc 1 1519 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC90
 	add	x1, x1, :lo12:.LC90
 	bl	_dev_info
 .LVL792:
-	.loc 1 1517 0
+	.loc 1 1521 0
 	str	x26, [x24, 200]
-	.loc 1 1519 0
+	.loc 1 1523 0
 	b	.L792
 	.p2align 3
 .L779:
-	.loc 1 1495 0
+	.loc 1 1499 0
 	ldr	x26, [x24, 200]
-	.loc 1 1395 0
+	.loc 1 1398 0
 	mov	w7, 0
 .LVL793:
-	.loc 1 1496 0
+	.loc 1 1500 0
 	ldr	w0, [x26, 40]
 	cmp	w0, 1
 	bhi	.L818
 .L898:
-	.loc 1 1501 0
+	.loc 1 1505 0
 	add	x0, x29, 152
-	.loc 1 1507 0
+	.loc 1 1511 0
 	str	wzr, [x24, 76]
-	.loc 1 1501 0
+	.loc 1 1505 0
 	str	x0, [x24, 200]
-	.loc 1 1508 0
+	.loc 1 1512 0
 	str	x28, [x24, 208]
-	.loc 1 1502 0
+	.loc 1 1506 0
 	ldr	x0, [x24, 136]
 	str	x0, [x29, 168]
-	.loc 1 1511 0
+	.loc 1 1515 0
 	ldr	w0, [x28, 40]
 	sub	w0, w0, #2
-	.loc 1 1510 0
-	cmp	w0, 13
+	.loc 1 1514 0
+	cmp	w0, 14
 	bls	.L899
 	.p2align 2
 .L819:
-	.loc 1 1523 0
-	cbnz	w7, .L854
 	.loc 1 1527 0
+	cbnz	w7, .L854
+	.loc 1 1531 0
 	ldr	w0, [x24, 48]
 	cmp	w0, 0
 	ble	.L824
-	.loc 1 1528 0
+	.loc 1 1532 0
 	add	w23, w23, 1
-	.loc 1 1529 0
+	.loc 1 1533 0
 	cmp	w0, w23
 	ble	.L900
 .L824:
-	.loc 1 1535 0
+	.loc 1 1539 0
 	ldr	w0, [x24, 184]
 	cbz	w0, .L901
 .L825:
-	.loc 1 1538 0
+	.loc 1 1542 0
 	mov	x0, x20
 	bl	ebc_lut_update
 .LVL794:
 	cbz	w0, .L826
-	.loc 1 1539 0
+	.loc 1 1543 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC84
 	add	x1, x1, :lo12:.LC84
 	bl	_dev_err
 .LVL795:
-	.loc 1 1541 0
+	.loc 1 1545 0
 	str	x26, [x24, 200]
 .LVL796:
 	.p2align 2
 .L792:
-	.loc 1 1573 0
+	.loc 1 1577 0
 	ldr	x0, [x24, 208]
 	ldr	w0, [x0, 40]
-	cmp	w0, 19
+	cmp	w0, 20
 	beq	.L902
 .L831:
-	.loc 1 1579 0
-	cmp	w0, 17
+	.loc 1 1583 0
+	cmp	w0, 18
 	beq	.L903
 .L832:
-	.loc 1 1588 0
+	.loc 1 1592 0
 	mov	x0, x28
 	bl	ebc_remove_from_dsp_buf_list
 .LVL797:
-	.loc 1 1590 0
+	.loc 1 1594 0
 	ldr	w0, [x24, 428]
 	cbnz	w0, .L904
 .L833:
-	.loc 1 1593 0
+	.loc 1 1597 0
 	mov	w0, 1
 	str	w0, [x24, 428]
 .L834:
-	.loc 1 1595 0
+	.loc 1 1599 0
 	ldr	x0, [x24, 208]
 	str	x0, [x24, 200]
-	.loc 1 1596 0
+	.loc 1 1600 0
 	b	.L758
 	.p2align 3
 .L891:
 .LBB1813:
-	.loc 1 1600 0 discriminator 1
+	.loc 1 1604 0 discriminator 1
 	ldr	w0, [x24, 80]
 	cbnz	w0, .L835
 .LBB1814:
-	.loc 1 1600 0 is_stmt 0 discriminator 3
+	.loc 1 1604 0 is_stmt 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
@@ -9106,17 +9107,17 @@ ebc_thread:
 	.p2align 3
 .L905:
 .LBB1815:
-	.loc 1 1600 0 discriminator 7
+	.loc 1 1604 0 discriminator 7
 	ldr	w1, [x24, 80]
 	cbnz	w1, .L836
 .LVL799:
-	.loc 1 1600 0 discriminator 9
+	.loc 1 1604 0 discriminator 9
 	cbnz	x0, .L882
-	.loc 1 1600 0 discriminator 11
+	.loc 1 1604 0 discriminator 11
 	bl	schedule
 .LVL800:
 .L839:
-	.loc 1 1600 0 discriminator 13
+	.loc 1 1604 0 discriminator 13
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
@@ -9126,7 +9127,7 @@ ebc_thread:
 	cbnz	w1, .L905
 .L836:
 .LBE1815:
-	.loc 1 1600 0 discriminator 8
+	.loc 1 1604 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 112
 	bl	finish_wait
@@ -9134,9 +9135,9 @@ ebc_thread:
 	ldr	w0, [x24, 28]
 .LBE1814:
 .LBE1813:
-	.loc 1 1603 0 is_stmt 1 discriminator 8
+	.loc 1 1607 0 is_stmt 1 discriminator 8
 	cbnz	w0, .L882
-	.loc 1 1608 0
+	.loc 1 1612 0
 	ldr	w0, [x24, 184]
 	cmp	w0, 1
 	bne	.L882
@@ -9154,33 +9155,33 @@ ebc_thread:
 .L767:
 .LBE1817:
 .LBE1816:
-	.loc 1 1360 0
+	.loc 1 1363 0
 	ldr	w0, [x24, 608]
 .LVL805:
 	cmp	w0, 0
 	ccmp	w1, 1, 4, ne
 	beq	.L763
-	.loc 1 1361 0
+	.loc 1 1364 0
 	add	x25, x21, 624
 .LVL806:
 	mov	x0, x25
 	bl	down_write
 .LVL807:
-	.loc 1 1362 0
+	.loc 1 1365 0
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x28, 16]
 	ldr	x0, [x24, 144]
 	bl	memcpy
 .LVL808:
-	.loc 1 1363 0
+	.loc 1 1366 0
 	mov	x0, x28
 	bl	ebc_remove_from_dsp_buf_list
 .LVL809:
-	.loc 1 1364 0
+	.loc 1 1367 0
 	mov	x0, x28
 	bl	ebc_buf_release
 .LVL810:
-	.loc 1 1366 0
+	.loc 1 1369 0
 	ldr	x1, [x24, 208]
 	mov	x4, x24
 	ldr	x0, [x24, 128]
@@ -9189,66 +9190,66 @@ ebc_thread:
 	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
 .LVL811:
-	.loc 1 1369 0
+	.loc 1 1372 0
 	mov	x0, x25
 	bl	up_write
 .LVL812:
-	.loc 1 1370 0
+	.loc 1 1373 0
 	ldr	w0, [x24, 28]
 	cbnz	w0, .L758
-	.loc 1 1373 0
+	.loc 1 1376 0
 	ldr	w0, [x24, 184]
-	.loc 1 1371 0
+	.loc 1 1374 0
 	mov	w1, 1
-	.loc 1 1372 0
+	.loc 1 1375 0
 	str	wzr, [x24, 76]
-	.loc 1 1371 0
+	.loc 1 1374 0
 	str	w1, [x24, 28]
-	.loc 1 1373 0
+	.loc 1 1376 0
 	cbz	w0, .L906
 .L768:
-	.loc 1 1375 0
+	.loc 1 1378 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC78
 	ldrb	w2, [x24, 32]
 	add	x1, x1, :lo12:.LC78
 	bl	_dev_info
 .LVL813:
-	.loc 1 1376 0
+	.loc 1 1379 0
 	mov	x0, x20
 	bl	ebc_frame_start
 .LVL814:
 	b	.L758
 .L783:
-	.loc 1 1395 0
-	cmp	w2, 20
+	.loc 1 1398 0
+	cmp	w2, 21
 	ble	.L850
 .L777:
-	.loc 1 1565 0
+	.loc 1 1569 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC87
 	add	x1, x1, :lo12:.LC87
 	bl	_dev_err
 .LVL815:
-	.loc 1 1566 0
+	.loc 1 1570 0
 	b	.L792
 	.p2align 3
 .L780:
-	.loc 1 1397 0
+	.loc 1 1400 0
 	ldr	w0, [x24, 604]
 	cbz	w0, .L784
-	.loc 1 1410 0
+	.loc 1 1413 0
 	ldr	x0, [x24, 200]
-	.loc 1 1408 0
+	.loc 1 1411 0
 	str	x28, [x24, 208]
-	.loc 1 1398 0
+	.loc 1 1401 0
 	str	w2, [x24, 608]
-	.loc 1 1410 0
+	.loc 1 1413 0
 	ldr	w1, [x0, 40]
 	cmp	w1, 1
 	bhi	.L785
 	mov	x0, x28
-	.loc 1 1415 0
+	.loc 1 1418 0
 	cbz	w1, .L907
 .L787:
 .LBB1818:
@@ -9289,7 +9290,7 @@ ebc_thread:
 	cmp	w8, w16
 .LBE1819:
 .LBE1818:
-	.loc 1 1419 0
+	.loc 1 1422 0
 	ldr	x11, [x0, 16]
 .LBB1824:
 .LBB1820:
@@ -9312,9 +9313,9 @@ ebc_thread:
 	cmp	w14, w17
 .LBE1820:
 .LBE1824:
-	.loc 1 1419 0
+	.loc 1 1422 0
 	ldr	x7, [x24, 128]
-	.loc 1 1420 0
+	.loc 1 1423 0
 	ldp	x10, x9, [x24, 144]
 .LBB1825:
 .LBB1821:
@@ -9465,29 +9466,29 @@ ebc_thread:
 .L826:
 .LBE1821:
 .LBE1825:
-	.loc 1 1550 0
+	.loc 1 1554 0
 	ldr	x0, [x24, 208]
 	adrp	x1, .LC86
-	.loc 1 1547 0
+	.loc 1 1551 0
 	ldr	w3, [x24, 96]
-	.loc 1 1550 0
+	.loc 1 1554 0
 	add	x1, x1, :lo12:.LC86
-	.loc 1 1547 0
+	.loc 1 1551 0
 	strb	w3, [x24, 32]
-	.loc 1 1550 0
+	.loc 1 1554 0
 	and	w3, w3, 255
 	ldr	w2, [x0, 40]
 	ldr	x0, [x24, 88]
 	bl	_dev_info
 .LVL834:
-	.loc 1 1551 0
+	.loc 1 1555 0
 	mov	w0, 1
 	str	w0, [x24, 28]
-	.loc 1 1552 0
+	.loc 1 1556 0
 	mov	x0, x20
 	bl	ebc_frame_start
 .LVL835:
-	.loc 1 1554 0
+	.loc 1 1558 0
 	ldr	x1, [x25, #:lo12:jiffies]
 	add	x0, x20, 672
 	str	x0, [x29, 104]
@@ -9495,14 +9496,14 @@ ebc_thread:
 	bl	mod_timer
 .LVL836:
 .LBB1826:
-	.loc 1 1555 0
+	.loc 1 1559 0
 	ldr	w0, [x24, 76]
 	cbz	w0, .L915
 .L829:
 .LVL837:
 .L827:
 .LBE1826:
-	.loc 1 1557 0 discriminator 11
+	.loc 1 1561 0 discriminator 11
 	ldr	x2, [x25, #:lo12:jiffies]
 	mov	x1, 402653184
 	ldr	x0, [x29, 104]
@@ -9510,43 +9511,43 @@ ebc_thread:
 	add	x1, x2, x1
 	bl	mod_timer
 .LVL839:
-	.loc 1 1558 0 discriminator 11
+	.loc 1 1562 0 discriminator 11
 	str	wzr, [x24, 76]
-	.loc 1 1560 0 discriminator 11
+	.loc 1 1564 0 discriminator 11
 	str	x26, [x24, 200]
-	.loc 1 1562 0 discriminator 11
+	.loc 1 1566 0 discriminator 11
 	b	.L792
 .LVL840:
 	.p2align 3
 .L854:
-	.loc 1 1535 0
+	.loc 1 1539 0
 	ldr	w0, [x24, 184]
-	.loc 1 1524 0
+	.loc 1 1528 0
 	mov	w23, 0
-	.loc 1 1535 0
+	.loc 1 1539 0
 	cbnz	w0, .L825
 .L901:
-	.loc 1 1536 0
+	.loc 1 1540 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.12
 .LVL841:
 	b	.L825
 .L895:
-	.loc 1 1389 0
+	.loc 1 1392 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC80
 	add	x1, x1, :lo12:.LC80
 	bl	_dev_info
 .LVL842:
 .LBB1830:
-	.loc 1 1390 0
+	.loc 1 1393 0
 	ldr	w0, [x24, 76]
 	cbz	w0, .L916
 .L775:
 .LVL843:
 .L773:
 .LBE1830:
-	.loc 1 1391 0 discriminator 11
+	.loc 1 1394 0 discriminator 11
 	ldr	x0, [x24, 88]
 .LVL844:
 	adrp	x1, .LC81
@@ -9604,32 +9605,32 @@ ebc_thread:
 .L795:
 .LBE1822:
 .LBE1834:
-	.loc 1 1423 0
+	.loc 1 1426 0
 	ldr	w0, [x24, 28]
 	cbnz	w0, .L792
-	.loc 1 1424 0
+	.loc 1 1427 0
 	mov	w0, 1
 	str	w0, [x24, 28]
-	.loc 1 1426 0
+	.loc 1 1429 0
 	ldr	w0, [x24, 184]
-	.loc 1 1425 0
+	.loc 1 1428 0
 	str	wzr, [x24, 76]
-	.loc 1 1426 0
+	.loc 1 1429 0
 	cbz	w0, .L917
 .L813:
-	.loc 1 1428 0
+	.loc 1 1431 0
 	mov	x0, x20
 	bl	ebc_lut_update
 .LVL852:
 	cmn	w0, #1
 	beq	.L792
-	.loc 1 1432 0
-	ldr	w3, [x24, 96]
 	.loc 1 1435 0
+	ldr	w3, [x24, 96]
+	.loc 1 1438 0
 	adrp	x1, .LC83
-	.loc 1 1432 0
-	strb	w3, [x24, 32]
 	.loc 1 1435 0
+	strb	w3, [x24, 32]
+	.loc 1 1438 0
 	add	x1, x1, :lo12:.LC83
 	ldr	x0, [x24, 88]
 	b	.L881
@@ -9655,14 +9656,14 @@ ebc_thread:
 .L888:
 .LBE1823:
 .LBE1835:
-	.loc 1 1346 0
+	.loc 1 1349 0
 	str	wzr, [x24, 592]
-	.loc 1 1347 0
+	.loc 1 1350 0
 	mov	x0, 3
 .LVL855:
 	bl	ebc_notify
 .LVL856:
-	.loc 1 1348 0
+	.loc 1 1351 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC77
 	add	x1, x1, :lo12:.LC77
@@ -9671,29 +9672,29 @@ ebc_thread:
 	b	.L763
 .LVL858:
 .L903:
-	.loc 1 1583 0
+	.loc 1 1587 0
 	ldr	x0, [x24, 88]
-	.loc 1 1581 0
+	.loc 1 1585 0
 	mov	w25, 1
 .LVL859:
-	.loc 1 1580 0
+	.loc 1 1584 0
 	str	wzr, [x24, 188]
-	.loc 1 1583 0
+	.loc 1 1587 0
 	adrp	x1, .LC89
-	.loc 1 1581 0
+	.loc 1 1585 0
 	str	w25, [x24, 592]
-	.loc 1 1583 0
+	.loc 1 1587 0
 	add	x1, x1, :lo12:.LC89
-	.loc 1 1582 0
+	.loc 1 1586 0
 	str	wzr, [x24, 608]
-	.loc 1 1583 0
+	.loc 1 1587 0
 	bl	_dev_info
 .LVL860:
-	.loc 1 1584 0
+	.loc 1 1588 0
 	mov	x0, 2
 	bl	ebc_notify
 .LVL861:
-	.loc 1 1585 0
+	.loc 1 1589 0
 	mov	w2, w25
 	mov	w1, w25
 	add	x0, x21, 328
@@ -9701,20 +9702,20 @@ ebc_thread:
 .LVL862:
 	b	.L832
 .L785:
-	.loc 1 1412 0
+	.loc 1 1415 0
 	ldr	x1, [x0, 16]
 	ldrsw	x2, [x24, 20]
 	ldr	x0, [x24, 128]
 	bl	memcpy
 .LVL863:
-	.loc 1 1413 0
+	.loc 1 1416 0
 	ldr	x0, [x24, 200]
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x24, 136]
 	bl	memcpy
 .LVL864:
-	.loc 1 1414 0
+	.loc 1 1417 0
 	ldr	x0, [x24, 200]
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x0, 16]
@@ -9725,26 +9726,26 @@ ebc_thread:
 	b	.L787
 .LVL866:
 .L900:
-	.loc 1 1530 0
+	.loc 1 1534 0
 	mov	w0, 2
-	.loc 1 1531 0
+	.loc 1 1535 0
 	mov	w23, 0
-	.loc 1 1530 0
+	.loc 1 1534 0
 	str	w0, [x28, 40]
 	b	.L824
 .LVL867:
 .L784:
-	.loc 1 1401 0
+	.loc 1 1404 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC82
 	add	x1, x1, :lo12:.LC82
 	bl	_dev_info
 .LVL868:
-	.loc 1 1402 0
+	.loc 1 1405 0
 	mov	x0, x28
 	b	.L879
 .L814:
-	.loc 1 1452 0
+	.loc 1 1455 0
 	ldr	x0, [x24, 128]
 	mov	x3, x24
 	ldr	x2, [x24, 152]
@@ -9756,7 +9757,7 @@ ebc_thread:
 .LBB1836:
 .LBB1827:
 .LBB1828:
-	.loc 1 1555 0 discriminator 1
+	.loc 1 1559 0 discriminator 1
 	add	x27, x21, 352
 .LBE1828:
 	mov	w1, 0
@@ -9768,13 +9769,13 @@ ebc_thread:
 .L918:
 .LVL871:
 .LBB1829:
-	.loc 1 1555 0 is_stmt 0 discriminator 5
+	.loc 1 1559 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L827
-	.loc 1 1555 0 discriminator 7
+	.loc 1 1559 0 discriminator 7
 	bl	schedule
 .LVL872:
 .L830:
-	.loc 1 1555 0 discriminator 9
+	.loc 1 1559 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x27
@@ -9783,7 +9784,7 @@ ebc_thread:
 	ldr	w1, [x24, 76]
 	cbz	w1, .L918
 .LBE1829:
-	.loc 1 1555 0 discriminator 4
+	.loc 1 1559 0 discriminator 4
 	mov	x0, x27
 	add	x1, x29, 112
 	bl	finish_wait
@@ -9793,7 +9794,7 @@ ebc_thread:
 .L917:
 .LBE1827:
 .LBE1836:
-	.loc 1 1427 0 is_stmt 1
+	.loc 1 1430 0 is_stmt 1
 	mov	x0, x20
 	bl	ebc_power_set.constprop.12
 .LVL876:
@@ -9803,7 +9804,7 @@ ebc_thread:
 .LBB1837:
 .LBB1831:
 .LBB1832:
-	.loc 1 1390 0 discriminator 1
+	.loc 1 1393 0 discriminator 1
 	add	x26, x21, 352
 .LVL878:
 .LBE1832:
@@ -9816,13 +9817,13 @@ ebc_thread:
 .L919:
 .LVL880:
 .LBB1833:
-	.loc 1 1390 0 is_stmt 0 discriminator 5
+	.loc 1 1393 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L773
-	.loc 1 1390 0 discriminator 7
+	.loc 1 1393 0 discriminator 7
 	bl	schedule
 .LVL881:
 .L776:
-	.loc 1 1390 0 discriminator 9
+	.loc 1 1393 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x26
@@ -9831,7 +9832,7 @@ ebc_thread:
 	ldr	w1, [x24, 76]
 	cbz	w1, .L919
 .LBE1833:
-	.loc 1 1390 0 discriminator 4
+	.loc 1 1393 0 discriminator 4
 	mov	x0, x26
 	add	x1, x29, 112
 	bl	finish_wait
@@ -9841,7 +9842,7 @@ ebc_thread:
 .L907:
 .LBE1831:
 .LBE1837:
-	.loc 1 1416 0 is_stmt 1
+	.loc 1 1419 0 is_stmt 1
 	ldrsw	x2, [x24, 20]
 	ldp	x1, x0, [x24, 136]
 	bl	memcpy
@@ -9861,29 +9862,29 @@ ebc_thread:
 .L897:
 .LBE1839:
 .LBE1838:
-	.loc 1 1463 0
+	.loc 1 1466 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC84
 	add	x1, x1, :lo12:.LC84
 	bl	_dev_err
 .LVL889:
-	.loc 1 1464 0
+	.loc 1 1467 0
 	b	.L792
 .L896:
-	.loc 1 1461 0
+	.loc 1 1464 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.12
 .LVL890:
 	b	.L816
 .L906:
-	.loc 1 1374 0
+	.loc 1 1377 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.12
 .LVL891:
 	b	.L768
 .LVL892:
 .L890:
-	.loc 1 1618 0
+	.loc 1 1622 0
 	bl	__stack_chk_fail
 .LVL893:
 	.cfi_endproc
@@ -10021,24 +10022,24 @@ ebc_auto_task:
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.34971, %object
-	.size	__func__.34971, 11
-__func__.34971:
+	.type	__func__.34976, %object
+	.size	__func__.34976, 11
+__func__.34976:
 	.string	"ebc_io_ctl"
 	.align	3
 	.set	.LANCHOR3,. + 0
-	.type	__func__.34773, %object
-	.size	__func__.34773, 16
-__func__.34773:
+	.type	__func__.34774, %object
+	.size	__func__.34774, 16
+__func__.34774:
 	.string	"ebc_frame_start"
-	.type	__func__.35262, %object
-	.size	__func__.35262, 12
-__func__.35262:
+	.type	__func__.35267, %object
+	.size	__func__.35267, 12
+__func__.35267:
 	.string	"ebc_suspend"
 	.zero	4
-	.type	__func__.35203, %object
-	.size	__func__.35203, 19
-__func__.35203:
+	.type	__func__.35208, %object
+	.size	__func__.35208, 19
+__func__.35208:
 	.string	"ebc_lut_table_init"
 	.zero	5
 	.type	ebc_match, %object
@@ -10069,9 +10070,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init2499, %object
-	.size	__addressable_ebc_init2499, 8
-__addressable_ebc_init2499:
+	.type	__addressable_ebc_init2503, %object
+	.size	__addressable_ebc_init2503, 8
+__addressable_ebc_init2503:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -10129,7 +10130,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC16:
-	.string	"2.07"
+	.string	"2.08"
 	.zero	3
 .LC17:
 	.string	"%s\n"
@@ -10565,15 +10566,15 @@ __exitcall_ebc_exit:
 	.file 212 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x144d0
+	.4byte	0x144d6
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF3286
-	.byte	0x1
 	.4byte	.LASF3287
+	.byte	0x1
 	.4byte	.LASF3288
+	.4byte	.LASF3289
 	.4byte	.Ldebug_ranges0+0x1260
 	.8byte	0
 	.4byte	.Ldebug_line0
@@ -28115,7 +28116,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x3
 	.4byte	0x920f
 	.uleb128 0x46
-	.4byte	.LASF3022
+	.4byte	.LASF3023
 	.byte	0x1f
 	.2byte	0xba2
 	.4byte	0x921f
@@ -32584,121 +32585,121 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2398
 	.byte	0xa
 	.byte	0x85
-	.4byte	0xdc37
+	.4byte	0xdc3d
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF2399
 	.byte	0xa
 	.byte	0x88
-	.4byte	0xdc5c
+	.4byte	0xdc62
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF108
 	.byte	0xa
 	.byte	0x8b
-	.4byte	0xdc8a
+	.4byte	0xdc90
 	.byte	0x10
 	.uleb128 0xe
 	.4byte	.LASF2400
 	.byte	0xa
 	.byte	0x8f
-	.4byte	0xdcbe
+	.4byte	0xdcc4
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF2401
 	.byte	0xa
 	.byte	0x92
-	.4byte	0xdcec
+	.4byte	0xdcf2
 	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF2402
 	.byte	0xa
 	.byte	0x96
-	.4byte	0xdd11
+	.4byte	0xdd17
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF2403
 	.byte	0xa
 	.byte	0x9d
-	.4byte	0xdd3a
+	.4byte	0xdd40
 	.byte	0x30
 	.uleb128 0xe
 	.4byte	.LASF2404
 	.byte	0xa
 	.byte	0xa0
-	.4byte	0xdd5f
+	.4byte	0xdd65
 	.byte	0x38
 	.uleb128 0xe
 	.4byte	.LASF2405
 	.byte	0xa
 	.byte	0xa4
-	.4byte	0xdd88
+	.4byte	0xdd8e
 	.byte	0x40
 	.uleb128 0xe
 	.4byte	.LASF2406
 	.byte	0xa
 	.byte	0xa7
-	.4byte	0xdd11
+	.4byte	0xdd17
 	.byte	0x48
 	.uleb128 0xe
 	.4byte	.LASF2407
 	.byte	0xa
 	.byte	0xaa
-	.4byte	0xdda8
+	.4byte	0xddae
 	.byte	0x50
 	.uleb128 0xe
 	.4byte	.LASF2408
 	.byte	0xa
 	.byte	0xad
-	.4byte	0xdda8
+	.4byte	0xddae
 	.byte	0x58
 	.uleb128 0xe
 	.4byte	.LASF2409
 	.byte	0xa
 	.byte	0xb0
-	.4byte	0xddc8
+	.4byte	0xddce
 	.byte	0x60
 	.uleb128 0xe
 	.4byte	.LASF2410
 	.byte	0xa
 	.byte	0xb3
-	.4byte	0xddc8
+	.4byte	0xddce
 	.byte	0x68
 	.uleb128 0xe
 	.4byte	.LASF2411
 	.byte	0xa
 	.byte	0xb6
-	.4byte	0xdde8
+	.4byte	0xddee
 	.byte	0x70
 	.uleb128 0xe
 	.4byte	.LASF2412
 	.byte	0xa
 	.byte	0xb8
-	.4byte	0xde02
+	.4byte	0xde08
 	.byte	0x78
 	.uleb128 0xe
 	.4byte	.LASF2413
 	.byte	0xa
 	.byte	0xb9
-	.4byte	0xde1c
+	.4byte	0xde22
 	.byte	0x80
 	.uleb128 0xe
 	.4byte	.LASF2414
 	.byte	0xa
 	.byte	0xba
-	.4byte	0xde1c
+	.4byte	0xde22
 	.byte	0x88
 	.uleb128 0xe
 	.4byte	.LASF2415
 	.byte	0xa
 	.byte	0xbb
-	.4byte	0xde45
+	.4byte	0xde4b
 	.byte	0x90
 	.uleb128 0xe
 	.4byte	.LASF2416
 	.byte	0xa
 	.byte	0xbd
-	.4byte	0xde60
+	.4byte	0xde66
 	.byte	0x98
 	.uleb128 0xe
 	.4byte	.LASF129
@@ -36784,7 +36785,7 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0xc4
 	.byte	0x3b
-	.4byte	0xd9e5
+	.4byte	0xd9eb
 	.uleb128 0xc
 	.4byte	.LASF2873
 	.byte	0
@@ -36848,86 +36849,89 @@ __exitcall_ebc_exit:
 	.uleb128 0xc
 	.4byte	.LASF2893
 	.byte	0x14
+	.uleb128 0xc
+	.4byte	.LASF2894
+	.byte	0x15
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2894
+	.4byte	.LASF2895
 	.byte	0x2c
 	.byte	0xc4
-	.byte	0x56
-	.4byte	0xda76
+	.byte	0x57
+	.4byte	0xda7c
 	.uleb128 0xe
 	.4byte	.LASF883
 	.byte	0xc4
-	.byte	0x57
+	.byte	0x58
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2895
+	.4byte	.LASF2896
 	.byte	0xc4
-	.byte	0x58
+	.byte	0x59
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF2896
+	.4byte	.LASF2897
 	.byte	0xc4
-	.byte	0x59
+	.byte	0x5a
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF261
 	.byte	0xc4
-	.byte	0x5a
+	.byte	0x5b
 	.4byte	0xc6
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF2897
+	.4byte	.LASF2898
 	.byte	0xc4
-	.byte	0x5b
+	.byte	0x5c
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
 	.4byte	.LASF2868
 	.byte	0xc4
-	.byte	0x5c
+	.byte	0x5d
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
 	.4byte	.LASF2869
 	.byte	0xc4
-	.byte	0x5d
+	.byte	0x5e
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF2870
 	.byte	0xc4
-	.byte	0x5e
+	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x1c
 	.uleb128 0xe
 	.4byte	.LASF2871
 	.byte	0xc4
-	.byte	0x5f
+	.byte	0x60
 	.4byte	0xc6
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2898
+	.4byte	.LASF2899
 	.byte	0xc4
-	.byte	0x60
+	.byte	0x61
 	.4byte	0xc6
 	.byte	0x24
 	.uleb128 0xe
-	.4byte	.LASF2899
+	.4byte	.LASF2900
 	.byte	0xc4
-	.byte	0x61
+	.byte	0x62
 	.4byte	0xc6
 	.byte	0x28
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2900
+	.4byte	.LASF2901
 	.byte	0x50
 	.byte	0x3
 	.byte	0x10
-	.4byte	0xdaef
+	.4byte	0xdaf5
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x3
@@ -36935,134 +36939,134 @@ __exitcall_ebc_exit:
 	.4byte	0xa55b
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2901
+	.4byte	.LASF2902
 	.byte	0x3
 	.byte	0x12
 	.4byte	0x47c3
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2902
+	.4byte	.LASF2903
 	.byte	0x3
 	.byte	0x13
 	.4byte	0x443
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2903
+	.4byte	.LASF2904
 	.byte	0x3
 	.byte	0x14
-	.4byte	0xdb05
+	.4byte	0xdb0b
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2904
+	.4byte	.LASF2905
 	.byte	0x3
 	.byte	0x15
-	.4byte	0xdb16
+	.4byte	0xdb1c
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2905
+	.4byte	.LASF2906
 	.byte	0x3
 	.byte	0x16
-	.4byte	0xdb16
+	.4byte	0xdb1c
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2906
+	.4byte	.LASF2907
 	.byte	0x3
 	.byte	0x17
-	.4byte	0xdb30
+	.4byte	0xdb36
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2907
+	.4byte	.LASF2908
 	.byte	0x3
 	.byte	0x18
-	.4byte	0xdb45
+	.4byte	0xdb4b
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2908
+	.4byte	.LASF2909
 	.byte	0x3
 	.byte	0x19
-	.4byte	0xdb5f
+	.4byte	0xdb65
 	.byte	0x48
 	.byte	0
 	.uleb128 0x10
-	.4byte	0xdaff
+	.4byte	0xdb05
 	.uleb128 0x11
-	.4byte	0xdaff
+	.4byte	0xdb05
 	.uleb128 0x11
 	.4byte	0x29b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xda76
+	.4byte	0xda7c
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdaef
+	.4byte	0xdaf5
 	.uleb128 0x10
-	.4byte	0xdb16
+	.4byte	0xdb1c
 	.uleb128 0x11
-	.4byte	0xdaff
+	.4byte	0xdb05
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb0b
+	.4byte	0xdb11
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdb30
+	.4byte	0xdb36
 	.uleb128 0x11
-	.4byte	0xdaff
+	.4byte	0xdb05
 	.uleb128 0x11
 	.4byte	0x4669
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb1c
+	.4byte	0xdb22
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdb45
+	.4byte	0xdb4b
 	.uleb128 0x11
-	.4byte	0xdaff
+	.4byte	0xdb05
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb36
+	.4byte	0xdb3c
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdb5f
+	.4byte	0xdb65
 	.uleb128 0x11
-	.4byte	0xdaff
+	.4byte	0xdb05
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb4b
+	.4byte	0xdb51
 	.uleb128 0x1f
-	.4byte	.LASF2909
+	.4byte	.LASF2910
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc5
 	.byte	0x5
-	.4byte	0xdb8e
+	.4byte	0xdb94
 	.uleb128 0xc
-	.4byte	.LASF2910
+	.4byte	.LASF2911
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2911
+	.4byte	.LASF2912
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2912
+	.4byte	.LASF2913
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2913
+	.4byte	.LASF2914
 	.byte	0x3
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2914
+	.4byte	.LASF2915
 	.byte	0x20
 	.byte	0xc6
 	.byte	0xb
-	.4byte	0xdbd7
+	.4byte	0xdbdd
 	.uleb128 0xe
-	.4byte	.LASF2915
+	.4byte	.LASF2916
 	.byte	0xc6
 	.byte	0xc
 	.4byte	0x29
@@ -37080,38 +37084,38 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF2916
+	.4byte	.LASF2917
 	.byte	0xc6
 	.byte	0xf
 	.4byte	0x310
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2917
+	.4byte	.LASF2918
 	.byte	0xc6
 	.byte	0x11
 	.4byte	0x6d
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2918
+	.4byte	.LASF2919
 	.byte	0x10
 	.byte	0xc6
 	.byte	0x2a
-	.4byte	0xdc08
+	.4byte	0xdc0e
 	.uleb128 0x20
 	.string	"sgl"
 	.byte	0xc6
 	.byte	0x2b
-	.4byte	0xdc08
+	.4byte	0xdc0e
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2919
+	.4byte	.LASF2920
 	.byte	0xc6
 	.byte	0x2c
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2920
+	.4byte	.LASF2921
 	.byte	0xc6
 	.byte	0x2d
 	.4byte	0x6d
@@ -37119,16 +37123,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb8e
+	.4byte	0xdb94
 	.uleb128 0x14
 	.4byte	0x443
-	.4byte	0xdc31
+	.4byte	0xdc37
 	.uleb128 0x11
 	.4byte	0xa55b
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdc31
+	.4byte	0xdc37
 	.uleb128 0x11
 	.4byte	0x31b
 	.uleb128 0x11
@@ -37139,9 +37143,9 @@ __exitcall_ebc_exit:
 	.4byte	0x310
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc0e
+	.4byte	0xdc14
 	.uleb128 0x10
-	.4byte	0xdc5c
+	.4byte	0xdc62
 	.uleb128 0x11
 	.4byte	0xa55b
 	.uleb128 0x11
@@ -37155,10 +37159,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc3d
+	.4byte	0xdc43
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdc8a
+	.4byte	0xdc90
 	.uleb128 0x11
 	.4byte	0xa55b
 	.uleb128 0x11
@@ -37174,14 +37178,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc62
+	.4byte	0xdc68
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdcb8
+	.4byte	0xdcbe
 	.uleb128 0x11
 	.4byte	0xa55b
 	.uleb128 0x11
-	.4byte	0xdcb8
+	.4byte	0xdcbe
 	.uleb128 0x11
 	.4byte	0x443
 	.uleb128 0x11
@@ -37193,13 +37197,13 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdbd7
+	.4byte	0xdbdd
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc90
+	.4byte	0xdc96
 	.uleb128 0x14
 	.4byte	0x310
-	.4byte	0xdcec
+	.4byte	0xdcf2
 	.uleb128 0x11
 	.4byte	0xa55b
 	.uleb128 0x11
@@ -37209,15 +37213,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdb65
+	.4byte	0xdb6b
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdcc4
+	.4byte	0xdcca
 	.uleb128 0x10
-	.4byte	0xdd11
+	.4byte	0xdd17
 	.uleb128 0x11
 	.4byte	0xa55b
 	.uleb128 0x11
@@ -37225,49 +37229,49 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdb65
+	.4byte	0xdb6b
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdcf2
+	.4byte	0xdcf8
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdd3a
+	.4byte	0xdd40
 	.uleb128 0x11
 	.4byte	0xa55b
 	.uleb128 0x11
-	.4byte	0xdc08
+	.4byte	0xdc0e
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdb65
+	.4byte	0xdb6b
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd17
+	.4byte	0xdd1d
 	.uleb128 0x10
-	.4byte	0xdd5f
+	.4byte	0xdd65
 	.uleb128 0x11
 	.4byte	0xa55b
 	.uleb128 0x11
-	.4byte	0xdc08
+	.4byte	0xdc0e
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdb65
+	.4byte	0xdb6b
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd40
+	.4byte	0xdd46
 	.uleb128 0x14
 	.4byte	0x310
-	.4byte	0xdd88
+	.4byte	0xdd8e
 	.uleb128 0x11
 	.4byte	0xa55b
 	.uleb128 0x11
@@ -37275,15 +37279,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdb65
+	.4byte	0xdb6b
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd65
+	.4byte	0xdd6b
 	.uleb128 0x10
-	.4byte	0xdda8
+	.4byte	0xddae
 	.uleb128 0x11
 	.4byte	0xa55b
 	.uleb128 0x11
@@ -37291,27 +37295,27 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdb65
+	.4byte	0xdb6b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd8e
+	.4byte	0xdd94
 	.uleb128 0x10
-	.4byte	0xddc8
+	.4byte	0xddce
 	.uleb128 0x11
 	.4byte	0xa55b
 	.uleb128 0x11
-	.4byte	0xdc08
+	.4byte	0xdc0e
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdb65
+	.4byte	0xdb6b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xddae
+	.4byte	0xddb4
 	.uleb128 0x10
-	.4byte	0xdde8
+	.4byte	0xddee
 	.uleb128 0x11
 	.4byte	0xa55b
 	.uleb128 0x11
@@ -37319,14 +37323,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdb65
+	.4byte	0xdb6b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xddce
+	.4byte	0xddd4
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xde02
+	.4byte	0xde08
 	.uleb128 0x11
 	.4byte	0xa55b
 	.uleb128 0x11
@@ -37334,10 +37338,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xddee
+	.4byte	0xddf4
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xde1c
+	.4byte	0xde22
 	.uleb128 0x11
 	.4byte	0xa55b
 	.uleb128 0x11
@@ -37345,10 +37349,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde08
+	.4byte	0xde0e
 	.uleb128 0x14
 	.4byte	0x443
-	.4byte	0xde45
+	.4byte	0xde4b
 	.uleb128 0x11
 	.4byte	0xa55b
 	.uleb128 0x11
@@ -37362,9 +37366,9 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde22
+	.4byte	0xde28
 	.uleb128 0x10
-	.4byte	0xde60
+	.4byte	0xde66
 	.uleb128 0x11
 	.4byte	0xa55b
 	.uleb128 0x11
@@ -37374,58 +37378,58 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde4b
+	.4byte	0xde51
 	.uleb128 0x19
-	.4byte	.LASF2921
+	.4byte	.LASF2922
 	.byte	0xa
 	.byte	0xc9
 	.4byte	0xb79f
 	.uleb128 0x19
-	.4byte	.LASF2922
+	.4byte	.LASF2923
 	.byte	0xa
 	.byte	0xca
 	.4byte	0xb79f
 	.uleb128 0x19
-	.4byte	.LASF2923
+	.4byte	.LASF2924
 	.byte	0xa
 	.byte	0xcb
 	.4byte	0xb79f
 	.uleb128 0x24
-	.4byte	.LASF2924
-	.uleb128 0x19
 	.4byte	.LASF2925
+	.uleb128 0x19
+	.4byte	.LASF2926
 	.byte	0xc7
 	.byte	0x7
-	.4byte	0xde97
+	.4byte	0xde9d
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde87
+	.4byte	0xde8d
 	.uleb128 0x24
-	.4byte	.LASF2926
-	.uleb128 0x19
 	.4byte	.LASF2927
+	.uleb128 0x19
+	.4byte	.LASF2928
 	.byte	0xc7
 	.byte	0x8
-	.4byte	0xdead
+	.4byte	0xdeb3
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde9d
+	.4byte	0xdea3
 	.uleb128 0x19
-	.4byte	.LASF2928
+	.4byte	.LASF2929
 	.byte	0xc7
 	.byte	0x16
 	.4byte	0xb7a4
 	.uleb128 0x19
-	.4byte	.LASF2929
+	.4byte	.LASF2930
 	.byte	0xc8
 	.byte	0x1b
 	.4byte	0xb79f
 	.uleb128 0xd
-	.4byte	.LASF2930
+	.4byte	.LASF2931
 	.byte	0x18
 	.byte	0xc9
 	.byte	0xf
-	.4byte	0xdefa
+	.4byte	0xdf00
 	.uleb128 0xe
 	.4byte	.LASF2865
 	.byte	0xc9
@@ -37446,11 +37450,11 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2931
+	.4byte	.LASF2932
 	.byte	0xa0
 	.byte	0xc9
 	.byte	0x15
-	.4byte	0xe03e
+	.4byte	0xe044
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xc9
@@ -37458,25 +37462,25 @@ __exitcall_ebc_exit:
 	.4byte	0xa55b
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2932
+	.4byte	.LASF2933
 	.byte	0xc9
 	.byte	0x17
-	.4byte	0xe0ff
+	.4byte	0xe105
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2933
+	.4byte	.LASF2934
 	.byte	0xc9
 	.byte	0x18
-	.4byte	0xdaff
+	.4byte	0xdb05
 	.byte	0x10
 	.uleb128 0x20
 	.string	"fb"
 	.byte	0xc9
 	.byte	0x19
-	.4byte	0xe105
+	.4byte	0xe10b
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2934
+	.4byte	.LASF2935
 	.byte	0xc9
 	.byte	0x1a
 	.4byte	0xc6
@@ -37488,43 +37492,43 @@ __exitcall_ebc_exit:
 	.4byte	0x13a
 	.byte	0x4c
 	.uleb128 0xe
-	.4byte	.LASF2896
+	.4byte	.LASF2897
 	.byte	0xc9
 	.byte	0x1d
 	.4byte	0x13a
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2935
+	.4byte	.LASF2936
 	.byte	0xc9
 	.byte	0x1e
 	.4byte	0x13a
 	.byte	0x54
 	.uleb128 0xe
-	.4byte	.LASF2936
+	.4byte	.LASF2937
 	.byte	0xc9
 	.byte	0x1f
 	.4byte	0x13a
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2898
+	.4byte	.LASF2899
 	.byte	0xc9
 	.byte	0x20
 	.4byte	0x13a
 	.byte	0x5c
 	.uleb128 0xe
-	.4byte	.LASF2899
+	.4byte	.LASF2900
 	.byte	0xc9
 	.byte	0x21
 	.4byte	0x13a
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2937
+	.4byte	.LASF2938
 	.byte	0xc9
 	.byte	0x22
 	.4byte	0x13a
 	.byte	0x64
 	.uleb128 0xe
-	.4byte	.LASF2938
+	.4byte	.LASF2939
 	.byte	0xc9
 	.byte	0x23
 	.4byte	0x13a
@@ -37554,13 +37558,13 @@ __exitcall_ebc_exit:
 	.4byte	0x13a
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2939
+	.4byte	.LASF2940
 	.byte	0xc9
 	.byte	0x28
 	.4byte	0x13a
 	.byte	0x7c
 	.uleb128 0xe
-	.4byte	.LASF2940
+	.4byte	.LASF2941
 	.byte	0xc9
 	.byte	0x29
 	.4byte	0x13a
@@ -37590,30 +37594,30 @@ __exitcall_ebc_exit:
 	.4byte	0x13a
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2941
+	.4byte	.LASF2942
 	.byte	0xc9
 	.byte	0x2e
 	.4byte	0x13a
 	.byte	0x94
 	.uleb128 0xe
-	.4byte	.LASF2897
+	.4byte	.LASF2898
 	.byte	0xc9
 	.byte	0x2f
 	.4byte	0x13a
 	.byte	0x98
 	.uleb128 0xe
-	.4byte	.LASF2942
+	.4byte	.LASF2943
 	.byte	0xc9
 	.byte	0x30
 	.4byte	0x13a
 	.byte	0x9c
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2943
+	.4byte	.LASF2944
 	.byte	0x70
 	.byte	0xb
 	.byte	0x17
-	.4byte	0xe0ff
+	.4byte	0xe105
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xb
@@ -37621,7 +37625,7 @@ __exitcall_ebc_exit:
 	.4byte	0xa55b
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2944
+	.4byte	.LASF2945
 	.byte	0xb
 	.byte	0x19
 	.4byte	0x443
@@ -37639,67 +37643,67 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2945
+	.4byte	.LASF2946
 	.byte	0xb
 	.byte	0x1d
-	.4byte	0xe11a
+	.4byte	0xe120
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2946
+	.4byte	.LASF2947
 	.byte	0xb
 	.byte	0x1e
-	.4byte	0xe11a
+	.4byte	0xe120
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2947
+	.4byte	.LASF2948
 	.byte	0xb
 	.byte	0x1f
-	.4byte	0xe125
+	.4byte	0xe12b
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2948
+	.4byte	.LASF2949
 	.byte	0xb
 	.byte	0x21
-	.4byte	0xe145
+	.4byte	0xe14b
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2949
+	.4byte	.LASF2950
 	.byte	0xb
 	.byte	0x22
-	.4byte	0xe156
+	.4byte	0xe15c
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2950
+	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x23
-	.4byte	0xe17b
+	.4byte	0xe181
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2951
+	.4byte	.LASF2952
 	.byte	0xb
 	.byte	0x24
-	.4byte	0xe196
+	.4byte	0xe19c
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2952
+	.4byte	.LASF2953
 	.byte	0xb
 	.byte	0x25
-	.4byte	0xe1ac
+	.4byte	0xe1b2
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2953
+	.4byte	.LASF2954
 	.byte	0xb
 	.byte	0x26
-	.4byte	0xe1d0
+	.4byte	0xe1d6
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2954
+	.4byte	.LASF2955
 	.byte	0xb
 	.byte	0x27
-	.4byte	0xe1e6
+	.4byte	0xe1ec
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2955
+	.4byte	.LASF2956
 	.byte	0xb
 	.byte	0x29
 	.4byte	0x4a2
@@ -37707,10 +37711,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe03e
+	.4byte	0xe044
 	.uleb128 0x5
-	.4byte	0xdec9
-	.4byte	0xe115
+	.4byte	0xdecf
+	.4byte	0xe11b
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
@@ -37719,38 +37723,38 @@ __exitcall_ebc_exit:
 	.string	"clk"
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe115
+	.4byte	0xe11b
 	.uleb128 0x24
-	.4byte	.LASF2956
+	.4byte	.LASF2957
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe120
+	.4byte	0xe126
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xe13f
+	.4byte	0xe145
 	.uleb128 0x11
-	.4byte	0xe0ff
+	.4byte	0xe105
 	.uleb128 0x11
-	.4byte	0xe13f
+	.4byte	0xe145
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdefa
+	.4byte	0xdf00
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe12b
+	.4byte	0xe131
 	.uleb128 0x10
-	.4byte	0xe156
+	.4byte	0xe15c
 	.uleb128 0x11
-	.4byte	0xe0ff
+	.4byte	0xe105
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe14b
+	.4byte	0xe151
 	.uleb128 0x10
-	.4byte	0xe17b
+	.4byte	0xe181
 	.uleb128 0x11
-	.4byte	0xe0ff
+	.4byte	0xe105
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -37762,11 +37766,11 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe15c
+	.4byte	0xe162
 	.uleb128 0x10
-	.4byte	0xe196
+	.4byte	0xe19c
 	.uleb128 0x11
-	.4byte	0xe0ff
+	.4byte	0xe105
 	.uleb128 0x11
 	.4byte	0x13a
 	.uleb128 0x11
@@ -37774,22 +37778,22 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe181
+	.4byte	0xe187
 	.uleb128 0x10
-	.4byte	0xe1ac
+	.4byte	0xe1b2
 	.uleb128 0x11
-	.4byte	0xe0ff
+	.4byte	0xe105
 	.uleb128 0x11
 	.4byte	0x13a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe19c
+	.4byte	0xe1a2
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xe1d0
+	.4byte	0xe1d6
 	.uleb128 0x11
-	.4byte	0xe0ff
+	.4byte	0xe105
 	.uleb128 0x11
 	.4byte	0x355e
 	.uleb128 0x11
@@ -37799,97 +37803,97 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1b2
+	.4byte	0xe1b8
 	.uleb128 0x10
-	.4byte	0xe1e6
+	.4byte	0xe1ec
 	.uleb128 0x11
-	.4byte	0xe0ff
+	.4byte	0xe105
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1d6
+	.4byte	0xe1dc
 	.uleb128 0x26
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.2byte	0x268
 	.byte	0x1
 	.byte	0x33
-	.4byte	0xe408
+	.4byte	0xe40e
 	.uleb128 0xe
-	.4byte	.LASF2958
+	.4byte	.LASF2959
 	.byte	0x1
 	.byte	0x34
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2959
+	.4byte	.LASF2960
 	.byte	0x1
 	.byte	0x35
 	.4byte	0x219
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2960
+	.4byte	.LASF2961
 	.byte	0x1
 	.byte	0x36
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2961
+	.4byte	.LASF2962
 	.byte	0x1
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2962
+	.4byte	.LASF2963
 	.byte	0x1
 	.byte	0x38
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2963
+	.4byte	.LASF2964
 	.byte	0x1
 	.byte	0x39
 	.4byte	0xc6
 	.byte	0x1c
 	.uleb128 0xe
-	.4byte	.LASF2964
+	.4byte	.LASF2965
 	.byte	0x1
 	.byte	0x3a
 	.4byte	0x61
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2965
+	.4byte	.LASF2966
 	.byte	0x1
 	.byte	0x3b
 	.4byte	0x61
 	.byte	0x21
 	.uleb128 0xe
-	.4byte	.LASF2966
+	.4byte	.LASF2967
 	.byte	0x1
 	.byte	0x3c
 	.4byte	0xc6
 	.byte	0x24
 	.uleb128 0xe
-	.4byte	.LASF2967
+	.4byte	.LASF2968
 	.byte	0x1
 	.byte	0x3d
 	.4byte	0xc6
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2968
+	.4byte	.LASF2969
 	.byte	0x1
 	.byte	0x3e
 	.4byte	0xc6
 	.byte	0x2c
 	.uleb128 0xe
-	.4byte	.LASF2969
+	.4byte	.LASF2970
 	.byte	0x1
 	.byte	0x3f
 	.4byte	0xc6
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2896
+	.4byte	.LASF2897
 	.byte	0x1
 	.byte	0x40
 	.4byte	0xc6
@@ -37901,25 +37905,25 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2970
+	.4byte	.LASF2971
 	.byte	0x1
 	.byte	0x42
 	.4byte	0x4669
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2971
+	.4byte	.LASF2972
 	.byte	0x1
 	.byte	0x43
 	.4byte	0xc6
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2972
+	.4byte	.LASF2973
 	.byte	0x1
 	.byte	0x44
 	.4byte	0xc6
 	.byte	0x4c
 	.uleb128 0xe
-	.4byte	.LASF2973
+	.4byte	.LASF2974
 	.byte	0x1
 	.byte	0x45
 	.4byte	0xc6
@@ -37931,145 +37935,145 @@ __exitcall_ebc_exit:
 	.4byte	0xa55b
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2974
+	.4byte	.LASF2975
 	.byte	0x1
 	.byte	0x47
 	.4byte	0xd871
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2975
+	.4byte	.LASF2976
 	.byte	0x1
 	.byte	0x48
 	.4byte	0x2ef0
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2976
+	.4byte	.LASF2977
 	.byte	0x1
 	.byte	0x4a
 	.4byte	0x4669
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF2977
+	.4byte	.LASF2978
 	.byte	0x1
 	.byte	0x4b
 	.4byte	0x4669
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF2978
+	.4byte	.LASF2979
 	.byte	0x1
 	.byte	0x4c
 	.4byte	0x4669
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2979
+	.4byte	.LASF2980
 	.byte	0x1
 	.byte	0x4e
 	.4byte	0xc0ad
 	.byte	0x98
 	.uleb128 0xe
-	.4byte	.LASF2980
+	.4byte	.LASF2981
 	.byte	0x1
 	.byte	0x4f
 	.4byte	0xc0ad
 	.byte	0xa0
 	.uleb128 0xe
-	.4byte	.LASF2981
+	.4byte	.LASF2982
 	.byte	0x1
 	.byte	0x50
-	.4byte	0xe408
+	.4byte	0xe40e
 	.byte	0xa8
 	.uleb128 0xe
-	.4byte	.LASF2982
+	.4byte	.LASF2983
 	.byte	0x1
 	.byte	0x51
 	.4byte	0xc6
 	.byte	0xb8
 	.uleb128 0xe
-	.4byte	.LASF2983
+	.4byte	.LASF2984
 	.byte	0x1
 	.byte	0x52
 	.4byte	0xc6
 	.byte	0xbc
 	.uleb128 0xe
-	.4byte	.LASF2984
+	.4byte	.LASF2985
 	.byte	0x1
 	.byte	0x53
 	.4byte	0x219
 	.byte	0xc0
 	.uleb128 0xe
-	.4byte	.LASF2985
+	.4byte	.LASF2986
 	.byte	0x1
 	.byte	0x54
-	.4byte	0xe418
+	.4byte	0xe41e
 	.byte	0xc8
 	.uleb128 0xe
-	.4byte	.LASF2986
+	.4byte	.LASF2987
 	.byte	0x1
 	.byte	0x55
-	.4byte	0xe418
+	.4byte	0xe41e
 	.byte	0xd0
 	.uleb128 0xe
-	.4byte	.LASF2987
+	.4byte	.LASF2988
 	.byte	0x1
 	.byte	0x57
 	.4byte	0xd7e7
 	.byte	0xd8
 	.uleb128 0x27
-	.4byte	.LASF2988
+	.4byte	.LASF2989
 	.byte	0x1
 	.byte	0x58
 	.4byte	0xc6
 	.2byte	0x1a8
 	.uleb128 0x27
-	.4byte	.LASF2989
+	.4byte	.LASF2990
 	.byte	0x1
 	.byte	0x5a
 	.4byte	0xc6
 	.2byte	0x1ac
 	.uleb128 0x27
-	.4byte	.LASF2990
+	.4byte	.LASF2991
 	.byte	0x1
 	.byte	0x5c
 	.4byte	0x315d
 	.2byte	0x1b0
 	.uleb128 0x27
-	.4byte	.LASF2991
+	.4byte	.LASF2992
 	.byte	0x1
 	.byte	0x5f
 	.4byte	0x315d
 	.2byte	0x1e8
 	.uleb128 0x27
-	.4byte	.LASF2992
+	.4byte	.LASF2993
 	.byte	0x1
 	.byte	0x62
 	.4byte	0x31f6
 	.2byte	0x220
 	.uleb128 0x27
-	.4byte	.LASF2993
+	.4byte	.LASF2994
 	.byte	0x1
 	.byte	0x65
 	.4byte	0xc6
 	.2byte	0x250
 	.uleb128 0x27
-	.4byte	.LASF2994
+	.4byte	.LASF2995
 	.byte	0x1
 	.byte	0x67
 	.4byte	0xc6
 	.2byte	0x254
 	.uleb128 0x27
-	.4byte	.LASF2995
+	.4byte	.LASF2996
 	.byte	0x1
 	.byte	0x69
 	.4byte	0xc6
 	.2byte	0x258
 	.uleb128 0x27
-	.4byte	.LASF2996
+	.4byte	.LASF2997
 	.byte	0x1
 	.byte	0x6b
 	.4byte	0xc6
 	.2byte	0x25c
 	.uleb128 0x27
-	.4byte	.LASF2997
+	.4byte	.LASF2998
 	.byte	0x1
 	.byte	0x6c
 	.4byte	0xc6
@@ -38077,7 +38081,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x443
-	.4byte	0xe418
+	.4byte	0xe41e
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
@@ -38090,7 +38094,7 @@ __exitcall_ebc_exit:
 	.2byte	0x320
 	.byte	0x1
 	.byte	0x6f
-	.4byte	0xe468
+	.4byte	0xe46e
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x1
@@ -38098,43 +38102,43 @@ __exitcall_ebc_exit:
 	.4byte	0xa55b
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2932
+	.4byte	.LASF2933
 	.byte	0x1
 	.byte	0x71
-	.4byte	0xe0ff
+	.4byte	0xe105
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2933
+	.4byte	.LASF2934
 	.byte	0x1
 	.byte	0x72
-	.4byte	0xdaff
+	.4byte	0xdb05
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2998
+	.4byte	.LASF2999
 	.byte	0x1
 	.byte	0x73
-	.4byte	0xdefa
+	.4byte	0xdf00
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF1773
 	.byte	0x1
 	.byte	0x74
-	.4byte	0xe1ec
+	.4byte	0xe1f2
 	.byte	0xb8
 	.byte	0
 	.uleb128 0x4b
-	.4byte	.LASF2999
+	.4byte	.LASF3000
 	.byte	0x1
 	.byte	0x77
-	.4byte	0xe47d
+	.4byte	0xe483
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	global_ebc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe41e
+	.4byte	0xe424
 	.uleb128 0x4b
-	.4byte	.LASF3000
+	.4byte	.LASF3001
 	.byte	0x1
 	.byte	0x78
 	.4byte	0x2ef0
@@ -38142,7 +38146,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_auto_task
 	.uleb128 0x4b
-	.4byte	.LASF3001
+	.4byte	.LASF3002
 	.byte	0x1
 	.byte	0x79
 	.4byte	0x4e21
@@ -38150,7 +38154,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	auto_buf_sema
 	.uleb128 0x4b
-	.4byte	.LASF3002
+	.4byte	.LASF3003
 	.byte	0x1
 	.byte	0x7b
 	.4byte	0x1585
@@ -38158,7 +38162,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_wq
 	.uleb128 0x4b
-	.4byte	.LASF3003
+	.4byte	.LASF3004
 	.byte	0x1
 	.byte	0x7c
 	.4byte	0x1585
@@ -38166,7 +38170,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_thread_wq
 	.uleb128 0x4b
-	.4byte	.LASF3004
+	.4byte	.LASF3005
 	.byte	0x1
 	.byte	0x7d
 	.4byte	0x1585
@@ -38174,7 +38178,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_poweroff_wq
 	.uleb128 0x4b
-	.4byte	.LASF3005
+	.4byte	.LASF3006
 	.byte	0x1
 	.byte	0x7e
 	.4byte	0x5b5c
@@ -38182,2781 +38186,2781 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_auto_thread_sem
 	.uleb128 0x4c
-	.4byte	.LASF3006
+	.4byte	.LASF3007
 	.byte	0x1
-	.2byte	0x798
+	.2byte	0x79c
 	.4byte	0x7b4
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_ops
 	.uleb128 0x4c
-	.4byte	.LASF3007
+	.4byte	.LASF3008
 	.byte	0x1
-	.2byte	0x7a2
+	.2byte	0x7a6
 	.4byte	0xc5f5
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_misc
 	.uleb128 0x4c
-	.4byte	.LASF3008
+	.4byte	.LASF3009
 	.byte	0x1
-	.2byte	0x7b1
+	.2byte	0x7b5
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_waveform_version
 	.uleb128 0x4c
-	.4byte	.LASF3009
+	.4byte	.LASF3010
 	.byte	0x1
-	.2byte	0x7bc
+	.2byte	0x7c0
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_name
 	.uleb128 0x4c
-	.4byte	.LASF3010
+	.4byte	.LASF3011
 	.byte	0x1
-	.2byte	0x7ca
+	.2byte	0x7ce
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_temp
 	.uleb128 0x4c
-	.4byte	.LASF3011
+	.4byte	.LASF3012
 	.byte	0x1
-	.2byte	0x7ed
+	.2byte	0x7f1
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_vcom
 	.uleb128 0x4c
-	.4byte	.LASF3012
+	.4byte	.LASF3013
 	.byte	0x1
-	.2byte	0x7f7
+	.2byte	0x7fb
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_version
 	.uleb128 0x4c
-	.4byte	.LASF3013
+	.4byte	.LASF3014
 	.byte	0x1
-	.2byte	0x800
+	.2byte	0x804
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_state
 	.uleb128 0x4c
-	.4byte	.LASF3014
+	.4byte	.LASF3015
 	.byte	0x1
-	.2byte	0x809
+	.2byte	0x80d
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_buf_state
 	.uleb128 0x4c
-	.4byte	.LASF3015
+	.4byte	.LASF3016
 	.byte	0x1
-	.2byte	0x9a4
+	.2byte	0x9a8
 	.4byte	0xa547
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_pm
 	.uleb128 0x5
 	.4byte	0xb186
-	.4byte	0xe5ed
+	.4byte	0xe5f3
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe5dd
+	.4byte	0xe5e3
 	.uleb128 0x4c
-	.4byte	.LASF3016
+	.4byte	.LASF3017
 	.byte	0x1
-	.2byte	0x9a9
-	.4byte	0xe5ed
+	.2byte	0x9ad
+	.4byte	0xe5f3
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_match
 	.uleb128 0x4c
-	.4byte	.LASF3017
+	.4byte	.LASF3018
 	.byte	0x1
-	.2byte	0x9af
+	.2byte	0x9b3
 	.4byte	0xd683
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_driver
 	.uleb128 0x4c
-	.4byte	.LASF3018
+	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x9c3
+	.2byte	0x9c7
 	.4byte	0x443
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init2499
+	.8byte	__addressable_ebc_init2503
 	.uleb128 0x4c
-	.4byte	.LASF3019
+	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x9c4
+	.2byte	0x9c8
 	.4byte	0x497
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	__exitcall_ebc_exit
 	.uleb128 0x4d
-	.4byte	.LASF3069
+	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0x9be
+	.2byte	0x9c2
 	.8byte	.LFB2853
 	.8byte	.LFE2853-.LFB2853
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe676
+	.4byte	0xe67c
 	.uleb128 0x4e
 	.8byte	.LVL64
-	.4byte	0x141d4
+	.4byte	0x141da
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3020
+	.4byte	.LASF3021
 	.byte	0x1
-	.2byte	0x9b9
+	.2byte	0x9bd
 	.4byte	0xc6
 	.8byte	.LFB2852
 	.8byte	.LFE2852-.LFB2852
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe6a6
+	.4byte	0xe6ac
 	.uleb128 0x4e
 	.8byte	.LVL352
-	.4byte	0x141e0
+	.4byte	0x141e6
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3021
+	.4byte	.LASF3022
 	.byte	0x1
-	.2byte	0x998
+	.2byte	0x99c
 	.4byte	0xc6
 	.8byte	.LFB2851
 	.8byte	.LFE2851-.LFB2851
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe742
+	.4byte	0xe748
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x998
+	.2byte	0x99c
 	.4byte	0xa55b
 	.4byte	.LLST11
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x99a
-	.4byte	0xe47d
+	.2byte	0x99e
+	.4byte	0xe483
 	.uleb128 0x46
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
-	.2byte	0x99b
-	.4byte	0xe742
+	.2byte	0x99f
+	.4byte	0xe748
 	.uleb128 0x53
-	.4byte	0x135c5
+	.4byte	0x135cb
 	.8byte	.LBB928
 	.8byte	.LBE928-.LBB928
 	.byte	0x1
-	.2byte	0x99a
-	.4byte	0xe712
+	.2byte	0x99e
+	.4byte	0xe718
 	.uleb128 0x54
-	.4byte	0x135d6
+	.4byte	0x135dc
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131b6
+	.4byte	0x131bc
 	.8byte	.LBB930
 	.8byte	.LBE930-.LBB930
 	.byte	0x1
-	.2byte	0x99d
-	.4byte	0xe734
+	.2byte	0x9a1
+	.4byte	0xe73a
 	.uleb128 0x54
-	.4byte	0x131c2
+	.4byte	0x131c8
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL68
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1ec
+	.4byte	0xe1f2
 	.uleb128 0x50
-	.4byte	.LASF3023
+	.4byte	.LASF3024
 	.byte	0x1
-	.2byte	0x987
+	.2byte	0x98b
 	.4byte	0xc6
 	.8byte	.LFB2850
 	.8byte	.LFE2850-.LFB2850
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe84f
+	.4byte	0xe855
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x987
+	.2byte	0x98b
 	.4byte	0xa55b
 	.4byte	.LLST146
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x989
-	.4byte	0xe47d
+	.2byte	0x98d
+	.4byte	0xe483
 	.uleb128 0x46
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
-	.2byte	0x98a
-	.4byte	0xe742
+	.2byte	0x98e
+	.4byte	0xe748
 	.uleb128 0x55
-	.4byte	.LASF3024
-	.4byte	0xe85f
+	.4byte	.LASF3025
+	.4byte	0xe865
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35262
+	.8byte	__func__.35267
 	.uleb128 0x53
-	.4byte	0x135c5
+	.4byte	0x135cb
 	.8byte	.LBB1412
 	.8byte	.LBE1412-.LBB1412
 	.byte	0x1
-	.2byte	0x989
-	.4byte	0xe7c7
+	.2byte	0x98d
+	.4byte	0xe7cd
 	.uleb128 0x54
-	.4byte	0x135d6
+	.4byte	0x135dc
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131ce
+	.4byte	0x131d4
 	.8byte	.LBB1414
 	.8byte	.LBE1414-.LBB1414
 	.byte	0x1
-	.2byte	0x992
-	.4byte	0xe7e9
+	.2byte	0x996
+	.4byte	0xe7ef
 	.uleb128 0x54
-	.4byte	0x131da
+	.4byte	0x131e0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12f1c
+	.4byte	0x12f22
 	.8byte	.LBB1416
 	.8byte	.LBE1416-.LBB1416
 	.byte	0x1
-	.2byte	0x98e
-	.4byte	0xe834
+	.2byte	0x992
+	.4byte	0xe83a
 	.uleb128 0x54
-	.4byte	0x12f37
+	.4byte	0x12f3d
 	.uleb128 0x54
-	.4byte	0x12f2c
+	.4byte	0x12f32
 	.uleb128 0x56
 	.8byte	.LBB1417
 	.8byte	.LBE1417-.LBB1417
 	.uleb128 0x57
-	.4byte	0x12f42
+	.4byte	0x12f48
 	.uleb128 0x4e
 	.8byte	.LVL517
-	.4byte	0x14064
+	.4byte	0x1406a
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL515
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL516
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xe85f
+	.4byte	0xe865
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xb
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe84f
+	.4byte	0xe855
 	.uleb128 0x4f
-	.4byte	.LASF3025
+	.4byte	.LASF3026
 	.byte	0x1
-	.2byte	0x980
+	.2byte	0x984
 	.4byte	0xc6
 	.8byte	.LFB2849
 	.8byte	.LFE2849-.LFB2849
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe8a4
+	.4byte	0xe8aa
 	.uleb128 0x58
-	.4byte	.LASF3026
+	.4byte	.LASF3027
 	.byte	0x1
-	.2byte	0x980
+	.2byte	0x984
 	.4byte	0xd6ff
 	.4byte	.LLST13
 	.uleb128 0x4e
 	.8byte	.LVL74
-	.4byte	0x141f9
+	.4byte	0x141ff
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3027
+	.4byte	.LASF3028
 	.byte	0x1
-	.2byte	0x913
+	.2byte	0x917
 	.4byte	0xc6
 	.8byte	.LFB2848
 	.8byte	.LFE2848-.LFB2848
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfc9e
+	.4byte	0xfca4
 	.uleb128 0x58
-	.4byte	.LASF3026
+	.4byte	.LASF3027
 	.byte	0x1
-	.2byte	0x913
+	.2byte	0x917
 	.4byte	0xd6ff
 	.4byte	.LLST147
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x915
+	.2byte	0x919
 	.4byte	0xa55b
 	.uleb128 0x46
-	.4byte	.LASF3028
+	.4byte	.LASF3029
 	.byte	0x1
-	.2byte	0x916
+	.2byte	0x91a
 	.4byte	0xb87f
 	.uleb128 0x59
-	.4byte	.LASF3029
+	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0x917
+	.2byte	0x91b
 	.4byte	0xd6ff
 	.4byte	.LLST148
 	.uleb128 0x46
-	.4byte	.LASF3030
+	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0x918
+	.2byte	0x91c
 	.4byte	0xb87f
 	.uleb128 0x59
-	.4byte	.LASF3031
+	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0x919
+	.2byte	0x91d
 	.4byte	0xc028
 	.4byte	.LLST149
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x91a
-	.4byte	0xe47d
+	.2byte	0x91e
+	.4byte	0xe483
 	.uleb128 0x59
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
-	.2byte	0x91b
-	.4byte	0xe742
+	.2byte	0x91f
+	.4byte	0xe748
 	.4byte	.LLST150
 	.uleb128 0x46
-	.4byte	.LASF2998
+	.4byte	.LASF2999
 	.byte	0x1
-	.2byte	0x91c
-	.4byte	0xe13f
+	.2byte	0x920
+	.4byte	0xe145
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x91d
+	.2byte	0x921
 	.4byte	0xc6
 	.uleb128 0x5a
-	.4byte	0x135e3
+	.4byte	0x135e9
 	.8byte	.LBB1563
 	.4byte	.Ldebug_ranges0+0xc00
 	.byte	0x1
-	.2byte	0x91f
-	.4byte	0xe983
+	.2byte	0x923
+	.4byte	0xe989
 	.uleb128 0x54
-	.4byte	0x1360c
+	.4byte	0x13612
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x13606
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x135fa
 	.uleb128 0x4e
 	.8byte	.LVL520
-	.4byte	0x14205
+	.4byte	0x1420b
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x134c0
+	.4byte	0x134c6
 	.8byte	.LBB1567
 	.8byte	.LBE1567-.LBB1567
 	.byte	0x1
-	.2byte	0x931
-	.4byte	0xe9c2
+	.2byte	0x935
+	.4byte	0xe9c8
 	.uleb128 0x54
-	.4byte	0x134d0
+	.4byte	0x134d6
 	.uleb128 0x5b
-	.4byte	0x135c5
+	.4byte	0x135cb
 	.8byte	.LBB1568
 	.8byte	.LBE1568-.LBB1568
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x54
-	.4byte	0x135d6
+	.4byte	0x135dc
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x134e2
+	.4byte	0x134e8
 	.8byte	.LBB1570
 	.8byte	.LBE1570-.LBB1570
 	.byte	0x1
-	.2byte	0x942
-	.4byte	0xea02
+	.2byte	0x946
+	.4byte	0xea08
 	.uleb128 0x54
-	.4byte	0x134f3
+	.4byte	0x134f9
 	.uleb128 0x5c
-	.4byte	0x135c5
+	.4byte	0x135cb
 	.8byte	.LBB1571
 	.8byte	.LBE1571-.LBB1571
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x54
-	.4byte	0x135d6
+	.4byte	0x135dc
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x1162f
+	.4byte	0x11635
 	.8byte	.LBB1573
 	.4byte	.Ldebug_ranges0+0xc30
 	.byte	0x1
-	.2byte	0x950
-	.4byte	0xf3bb
+	.2byte	0x954
+	.4byte	0xf3c1
 	.uleb128 0x54
-	.4byte	0x11640
+	.4byte	0x11646
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xc30
 	.uleb128 0x57
-	.4byte	0x1164c
+	.4byte	0x11652
 	.uleb128 0x5a
-	.4byte	0x13506
+	.4byte	0x1350c
 	.8byte	.LBB1575
 	.4byte	.Ldebug_ranges0+0xc90
 	.byte	0x1
-	.2byte	0x67a
-	.4byte	0xea92
+	.2byte	0x67e
+	.4byte	0xea98
 	.uleb128 0x54
-	.4byte	0x1352e
+	.4byte	0x13534
 	.uleb128 0x54
-	.4byte	0x13522
+	.4byte	0x13528
 	.uleb128 0x54
-	.4byte	0x13517
+	.4byte	0x1351d
 	.uleb128 0x5e
-	.4byte	0x1353b
+	.4byte	0x13541
 	.8byte	.LBB1576
 	.4byte	.Ldebug_ranges0+0xc90
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1356f
+	.4byte	0x13575
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13569
 	.uleb128 0x54
-	.4byte	0x13557
+	.4byte	0x1355d
 	.uleb128 0x54
-	.4byte	0x1354c
+	.4byte	0x13552
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xc90
 	.uleb128 0x57
-	.4byte	0x1357a
+	.4byte	0x13580
 	.uleb128 0x4e
 	.8byte	.LVL528
-	.4byte	0x14212
+	.4byte	0x14218
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13506
+	.4byte	0x1350c
 	.8byte	.LBB1587
 	.8byte	.LBE1587-.LBB1587
 	.byte	0x1
-	.2byte	0x67d
-	.4byte	0xeb0f
+	.2byte	0x681
+	.4byte	0xeb15
 	.uleb128 0x54
-	.4byte	0x1352e
+	.4byte	0x13534
 	.uleb128 0x54
-	.4byte	0x13522
+	.4byte	0x13528
 	.uleb128 0x54
-	.4byte	0x13517
+	.4byte	0x1351d
 	.uleb128 0x5c
-	.4byte	0x1353b
+	.4byte	0x13541
 	.8byte	.LBB1588
 	.8byte	.LBE1588-.LBB1588
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1356f
+	.4byte	0x13575
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13569
 	.uleb128 0x54
-	.4byte	0x13557
+	.4byte	0x1355d
 	.uleb128 0x54
-	.4byte	0x1354c
+	.4byte	0x13552
 	.uleb128 0x56
 	.8byte	.LBB1589
 	.8byte	.LBE1589-.LBB1589
 	.uleb128 0x57
-	.4byte	0x1357a
+	.4byte	0x13580
 	.uleb128 0x4e
 	.8byte	.LVL529
-	.4byte	0x14212
+	.4byte	0x14218
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13506
+	.4byte	0x1350c
 	.8byte	.LBB1590
 	.8byte	.LBE1590-.LBB1590
 	.byte	0x1
-	.2byte	0x680
-	.4byte	0xeb8c
+	.2byte	0x684
+	.4byte	0xeb92
 	.uleb128 0x54
-	.4byte	0x1352e
+	.4byte	0x13534
 	.uleb128 0x54
-	.4byte	0x13522
+	.4byte	0x13528
 	.uleb128 0x54
-	.4byte	0x13517
+	.4byte	0x1351d
 	.uleb128 0x5c
-	.4byte	0x1353b
+	.4byte	0x13541
 	.8byte	.LBB1591
 	.8byte	.LBE1591-.LBB1591
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1356f
+	.4byte	0x13575
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13569
 	.uleb128 0x54
-	.4byte	0x13557
+	.4byte	0x1355d
 	.uleb128 0x54
-	.4byte	0x1354c
+	.4byte	0x13552
 	.uleb128 0x56
 	.8byte	.LBB1592
 	.8byte	.LBE1592-.LBB1592
 	.uleb128 0x57
-	.4byte	0x1357a
+	.4byte	0x13580
 	.uleb128 0x4e
 	.8byte	.LVL530
-	.4byte	0x14212
+	.4byte	0x14218
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13506
+	.4byte	0x1350c
 	.8byte	.LBB1593
 	.8byte	.LBE1593-.LBB1593
 	.byte	0x1
-	.2byte	0x683
-	.4byte	0xec09
+	.2byte	0x687
+	.4byte	0xec0f
 	.uleb128 0x54
-	.4byte	0x1352e
+	.4byte	0x13534
 	.uleb128 0x54
-	.4byte	0x13522
+	.4byte	0x13528
 	.uleb128 0x54
-	.4byte	0x13517
+	.4byte	0x1351d
 	.uleb128 0x5c
-	.4byte	0x1353b
+	.4byte	0x13541
 	.8byte	.LBB1594
 	.8byte	.LBE1594-.LBB1594
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1356f
+	.4byte	0x13575
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13569
 	.uleb128 0x54
-	.4byte	0x13557
+	.4byte	0x1355d
 	.uleb128 0x54
-	.4byte	0x1354c
+	.4byte	0x13552
 	.uleb128 0x56
 	.8byte	.LBB1595
 	.8byte	.LBE1595-.LBB1595
 	.uleb128 0x57
-	.4byte	0x1357a
+	.4byte	0x13580
 	.uleb128 0x4e
 	.8byte	.LVL531
-	.4byte	0x14212
+	.4byte	0x14218
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13506
+	.4byte	0x1350c
 	.8byte	.LBB1596
 	.8byte	.LBE1596-.LBB1596
 	.byte	0x1
-	.2byte	0x686
-	.4byte	0xec86
+	.2byte	0x68a
+	.4byte	0xec8c
 	.uleb128 0x54
-	.4byte	0x1352e
+	.4byte	0x13534
 	.uleb128 0x54
-	.4byte	0x13522
+	.4byte	0x13528
 	.uleb128 0x54
-	.4byte	0x13517
+	.4byte	0x1351d
 	.uleb128 0x5c
-	.4byte	0x1353b
+	.4byte	0x13541
 	.8byte	.LBB1597
 	.8byte	.LBE1597-.LBB1597
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1356f
+	.4byte	0x13575
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13569
 	.uleb128 0x54
-	.4byte	0x13557
+	.4byte	0x1355d
 	.uleb128 0x54
-	.4byte	0x1354c
+	.4byte	0x13552
 	.uleb128 0x56
 	.8byte	.LBB1598
 	.8byte	.LBE1598-.LBB1598
 	.uleb128 0x57
-	.4byte	0x1357a
+	.4byte	0x13580
 	.uleb128 0x4e
 	.8byte	.LVL532
-	.4byte	0x14212
+	.4byte	0x14218
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13506
+	.4byte	0x1350c
 	.8byte	.LBB1599
 	.8byte	.LBE1599-.LBB1599
 	.byte	0x1
-	.2byte	0x689
-	.4byte	0xed03
+	.2byte	0x68d
+	.4byte	0xed09
 	.uleb128 0x54
-	.4byte	0x1352e
+	.4byte	0x13534
 	.uleb128 0x54
-	.4byte	0x13522
+	.4byte	0x13528
 	.uleb128 0x54
-	.4byte	0x13517
+	.4byte	0x1351d
 	.uleb128 0x5c
-	.4byte	0x1353b
+	.4byte	0x13541
 	.8byte	.LBB1600
 	.8byte	.LBE1600-.LBB1600
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1356f
+	.4byte	0x13575
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13569
 	.uleb128 0x54
-	.4byte	0x13557
+	.4byte	0x1355d
 	.uleb128 0x54
-	.4byte	0x1354c
+	.4byte	0x13552
 	.uleb128 0x56
 	.8byte	.LBB1601
 	.8byte	.LBE1601-.LBB1601
 	.uleb128 0x57
-	.4byte	0x1357a
+	.4byte	0x13580
 	.uleb128 0x4e
 	.8byte	.LVL533
-	.4byte	0x14212
+	.4byte	0x14218
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13506
+	.4byte	0x1350c
 	.8byte	.LBB1602
 	.8byte	.LBE1602-.LBB1602
 	.byte	0x1
-	.2byte	0x68c
-	.4byte	0xed80
+	.2byte	0x690
+	.4byte	0xed86
 	.uleb128 0x54
-	.4byte	0x1352e
+	.4byte	0x13534
 	.uleb128 0x54
-	.4byte	0x13522
+	.4byte	0x13528
 	.uleb128 0x54
-	.4byte	0x13517
+	.4byte	0x1351d
 	.uleb128 0x5c
-	.4byte	0x1353b
+	.4byte	0x13541
 	.8byte	.LBB1603
 	.8byte	.LBE1603-.LBB1603
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1356f
+	.4byte	0x13575
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13569
 	.uleb128 0x54
-	.4byte	0x13557
+	.4byte	0x1355d
 	.uleb128 0x54
-	.4byte	0x1354c
+	.4byte	0x13552
 	.uleb128 0x56
 	.8byte	.LBB1604
 	.8byte	.LBE1604-.LBB1604
 	.uleb128 0x57
-	.4byte	0x1357a
+	.4byte	0x13580
 	.uleb128 0x4e
 	.8byte	.LVL534
-	.4byte	0x14212
+	.4byte	0x14218
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13506
+	.4byte	0x1350c
 	.8byte	.LBB1605
 	.8byte	.LBE1605-.LBB1605
 	.byte	0x1
-	.2byte	0x68f
-	.4byte	0xedfd
+	.2byte	0x693
+	.4byte	0xee03
 	.uleb128 0x54
-	.4byte	0x1352e
+	.4byte	0x13534
 	.uleb128 0x54
-	.4byte	0x13522
+	.4byte	0x13528
 	.uleb128 0x54
-	.4byte	0x13517
+	.4byte	0x1351d
 	.uleb128 0x5c
-	.4byte	0x1353b
+	.4byte	0x13541
 	.8byte	.LBB1606
 	.8byte	.LBE1606-.LBB1606
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1356f
+	.4byte	0x13575
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13569
 	.uleb128 0x54
-	.4byte	0x13557
+	.4byte	0x1355d
 	.uleb128 0x54
-	.4byte	0x1354c
+	.4byte	0x13552
 	.uleb128 0x56
 	.8byte	.LBB1607
 	.8byte	.LBE1607-.LBB1607
 	.uleb128 0x57
-	.4byte	0x1357a
+	.4byte	0x13580
 	.uleb128 0x4e
 	.8byte	.LVL535
-	.4byte	0x14212
+	.4byte	0x14218
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13506
+	.4byte	0x1350c
 	.8byte	.LBB1608
 	.8byte	.LBE1608-.LBB1608
 	.byte	0x1
-	.2byte	0x692
-	.4byte	0xee7a
+	.2byte	0x696
+	.4byte	0xee80
 	.uleb128 0x54
-	.4byte	0x1352e
+	.4byte	0x13534
 	.uleb128 0x54
-	.4byte	0x13522
+	.4byte	0x13528
 	.uleb128 0x54
-	.4byte	0x13517
+	.4byte	0x1351d
 	.uleb128 0x5c
-	.4byte	0x1353b
+	.4byte	0x13541
 	.8byte	.LBB1609
 	.8byte	.LBE1609-.LBB1609
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1356f
+	.4byte	0x13575
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13569
 	.uleb128 0x54
-	.4byte	0x13557
+	.4byte	0x1355d
 	.uleb128 0x54
-	.4byte	0x1354c
+	.4byte	0x13552
 	.uleb128 0x56
 	.8byte	.LBB1610
 	.8byte	.LBE1610-.LBB1610
 	.uleb128 0x57
-	.4byte	0x1357a
+	.4byte	0x13580
 	.uleb128 0x4e
 	.8byte	.LVL536
-	.4byte	0x14212
+	.4byte	0x14218
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13506
+	.4byte	0x1350c
 	.8byte	.LBB1611
 	.8byte	.LBE1611-.LBB1611
 	.byte	0x1
-	.2byte	0x695
-	.4byte	0xeef7
+	.2byte	0x699
+	.4byte	0xeefd
 	.uleb128 0x54
-	.4byte	0x1352e
+	.4byte	0x13534
 	.uleb128 0x54
-	.4byte	0x13522
+	.4byte	0x13528
 	.uleb128 0x54
-	.4byte	0x13517
+	.4byte	0x1351d
 	.uleb128 0x5c
-	.4byte	0x1353b
+	.4byte	0x13541
 	.8byte	.LBB1612
 	.8byte	.LBE1612-.LBB1612
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1356f
+	.4byte	0x13575
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13569
 	.uleb128 0x54
-	.4byte	0x13557
+	.4byte	0x1355d
 	.uleb128 0x54
-	.4byte	0x1354c
+	.4byte	0x13552
 	.uleb128 0x56
 	.8byte	.LBB1613
 	.8byte	.LBE1613-.LBB1613
 	.uleb128 0x57
-	.4byte	0x1357a
+	.4byte	0x13580
 	.uleb128 0x4e
 	.8byte	.LVL537
-	.4byte	0x14212
+	.4byte	0x14218
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13506
+	.4byte	0x1350c
 	.8byte	.LBB1614
 	.8byte	.LBE1614-.LBB1614
 	.byte	0x1
-	.2byte	0x698
-	.4byte	0xef74
+	.2byte	0x69c
+	.4byte	0xef7a
 	.uleb128 0x54
-	.4byte	0x1352e
+	.4byte	0x13534
 	.uleb128 0x54
-	.4byte	0x13522
+	.4byte	0x13528
 	.uleb128 0x54
-	.4byte	0x13517
+	.4byte	0x1351d
 	.uleb128 0x5c
-	.4byte	0x1353b
+	.4byte	0x13541
 	.8byte	.LBB1615
 	.8byte	.LBE1615-.LBB1615
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1356f
+	.4byte	0x13575
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13569
 	.uleb128 0x54
-	.4byte	0x13557
+	.4byte	0x1355d
 	.uleb128 0x54
-	.4byte	0x1354c
+	.4byte	0x13552
 	.uleb128 0x56
 	.8byte	.LBB1616
 	.8byte	.LBE1616-.LBB1616
 	.uleb128 0x57
-	.4byte	0x1357a
+	.4byte	0x13580
 	.uleb128 0x4e
 	.8byte	.LVL538
-	.4byte	0x14212
+	.4byte	0x14218
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13506
+	.4byte	0x1350c
 	.8byte	.LBB1617
 	.8byte	.LBE1617-.LBB1617
 	.byte	0x1
-	.2byte	0x69b
-	.4byte	0xeff1
+	.2byte	0x69f
+	.4byte	0xeff7
 	.uleb128 0x54
-	.4byte	0x1352e
+	.4byte	0x13534
 	.uleb128 0x54
-	.4byte	0x13522
+	.4byte	0x13528
 	.uleb128 0x54
-	.4byte	0x13517
+	.4byte	0x1351d
 	.uleb128 0x5c
-	.4byte	0x1353b
+	.4byte	0x13541
 	.8byte	.LBB1618
 	.8byte	.LBE1618-.LBB1618
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1356f
+	.4byte	0x13575
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13569
 	.uleb128 0x54
-	.4byte	0x13557
+	.4byte	0x1355d
 	.uleb128 0x54
-	.4byte	0x1354c
+	.4byte	0x13552
 	.uleb128 0x56
 	.8byte	.LBB1619
 	.8byte	.LBE1619-.LBB1619
 	.uleb128 0x57
-	.4byte	0x1357a
+	.4byte	0x13580
 	.uleb128 0x4e
 	.8byte	.LVL539
-	.4byte	0x14212
+	.4byte	0x14218
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13506
+	.4byte	0x1350c
 	.8byte	.LBB1620
 	.8byte	.LBE1620-.LBB1620
 	.byte	0x1
-	.2byte	0x69e
-	.4byte	0xf06e
+	.2byte	0x6a2
+	.4byte	0xf074
 	.uleb128 0x54
-	.4byte	0x1352e
+	.4byte	0x13534
 	.uleb128 0x54
-	.4byte	0x13522
+	.4byte	0x13528
 	.uleb128 0x54
-	.4byte	0x13517
+	.4byte	0x1351d
 	.uleb128 0x5c
-	.4byte	0x1353b
+	.4byte	0x13541
 	.8byte	.LBB1621
 	.8byte	.LBE1621-.LBB1621
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1356f
+	.4byte	0x13575
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13569
 	.uleb128 0x54
-	.4byte	0x13557
+	.4byte	0x1355d
 	.uleb128 0x54
-	.4byte	0x1354c
+	.4byte	0x13552
 	.uleb128 0x56
 	.8byte	.LBB1622
 	.8byte	.LBE1622-.LBB1622
 	.uleb128 0x57
-	.4byte	0x1357a
+	.4byte	0x13580
 	.uleb128 0x4e
 	.8byte	.LVL540
-	.4byte	0x14212
+	.4byte	0x14218
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13506
+	.4byte	0x1350c
 	.8byte	.LBB1623
 	.8byte	.LBE1623-.LBB1623
 	.byte	0x1
-	.2byte	0x6a1
-	.4byte	0xf0eb
+	.2byte	0x6a5
+	.4byte	0xf0f1
 	.uleb128 0x54
-	.4byte	0x1352e
+	.4byte	0x13534
 	.uleb128 0x54
-	.4byte	0x13522
+	.4byte	0x13528
 	.uleb128 0x54
-	.4byte	0x13517
+	.4byte	0x1351d
 	.uleb128 0x5c
-	.4byte	0x1353b
+	.4byte	0x13541
 	.8byte	.LBB1624
 	.8byte	.LBE1624-.LBB1624
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1356f
+	.4byte	0x13575
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13569
 	.uleb128 0x54
-	.4byte	0x13557
+	.4byte	0x1355d
 	.uleb128 0x54
-	.4byte	0x1354c
+	.4byte	0x13552
 	.uleb128 0x56
 	.8byte	.LBB1625
 	.8byte	.LBE1625-.LBB1625
 	.uleb128 0x57
-	.4byte	0x1357a
+	.4byte	0x13580
 	.uleb128 0x4e
 	.8byte	.LVL541
-	.4byte	0x14212
+	.4byte	0x14218
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13506
+	.4byte	0x1350c
 	.8byte	.LBB1626
 	.8byte	.LBE1626-.LBB1626
 	.byte	0x1
-	.2byte	0x6a4
-	.4byte	0xf168
+	.2byte	0x6a8
+	.4byte	0xf16e
 	.uleb128 0x54
-	.4byte	0x1352e
+	.4byte	0x13534
 	.uleb128 0x54
-	.4byte	0x13522
+	.4byte	0x13528
 	.uleb128 0x54
-	.4byte	0x13517
+	.4byte	0x1351d
 	.uleb128 0x5c
-	.4byte	0x1353b
+	.4byte	0x13541
 	.8byte	.LBB1627
 	.8byte	.LBE1627-.LBB1627
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1356f
+	.4byte	0x13575
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13569
 	.uleb128 0x54
-	.4byte	0x13557
+	.4byte	0x1355d
 	.uleb128 0x54
-	.4byte	0x1354c
+	.4byte	0x13552
 	.uleb128 0x56
 	.8byte	.LBB1628
 	.8byte	.LBE1628-.LBB1628
 	.uleb128 0x57
-	.4byte	0x1357a
+	.4byte	0x13580
 	.uleb128 0x4e
 	.8byte	.LVL542
-	.4byte	0x14212
+	.4byte	0x14218
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13506
+	.4byte	0x1350c
 	.8byte	.LBB1629
 	.8byte	.LBE1629-.LBB1629
 	.byte	0x1
-	.2byte	0x6a7
-	.4byte	0xf1e5
+	.2byte	0x6ab
+	.4byte	0xf1eb
 	.uleb128 0x54
-	.4byte	0x1352e
+	.4byte	0x13534
 	.uleb128 0x54
-	.4byte	0x13522
+	.4byte	0x13528
 	.uleb128 0x54
-	.4byte	0x13517
+	.4byte	0x1351d
 	.uleb128 0x5c
-	.4byte	0x1353b
+	.4byte	0x13541
 	.8byte	.LBB1630
 	.8byte	.LBE1630-.LBB1630
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1356f
+	.4byte	0x13575
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13569
 	.uleb128 0x54
-	.4byte	0x13557
+	.4byte	0x1355d
 	.uleb128 0x54
-	.4byte	0x1354c
+	.4byte	0x13552
 	.uleb128 0x56
 	.8byte	.LBB1631
 	.8byte	.LBE1631-.LBB1631
 	.uleb128 0x57
-	.4byte	0x1357a
+	.4byte	0x13580
 	.uleb128 0x4e
 	.8byte	.LVL543
-	.4byte	0x14212
+	.4byte	0x14218
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13506
+	.4byte	0x1350c
 	.8byte	.LBB1632
 	.4byte	.Ldebug_ranges0+0xce0
 	.byte	0x1
-	.2byte	0x6aa
-	.4byte	0xf25b
+	.2byte	0x6ae
+	.4byte	0xf261
 	.uleb128 0x54
-	.4byte	0x1352e
+	.4byte	0x13534
 	.uleb128 0x54
-	.4byte	0x13522
+	.4byte	0x13528
 	.uleb128 0x54
-	.4byte	0x13517
+	.4byte	0x1351d
 	.uleb128 0x5e
-	.4byte	0x1353b
+	.4byte	0x13541
 	.8byte	.LBB1633
 	.4byte	.Ldebug_ranges0+0xce0
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1356f
+	.4byte	0x13575
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13569
 	.uleb128 0x54
-	.4byte	0x13557
+	.4byte	0x1355d
 	.uleb128 0x54
-	.4byte	0x1354c
+	.4byte	0x13552
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xce0
 	.uleb128 0x57
-	.4byte	0x1357a
+	.4byte	0x13580
 	.uleb128 0x4e
 	.8byte	.LVL544
-	.4byte	0x14212
+	.4byte	0x14218
 	.uleb128 0x4e
 	.8byte	.LVL576
-	.4byte	0x14212
+	.4byte	0x14218
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13506
+	.4byte	0x1350c
 	.8byte	.LBB1639
 	.4byte	.Ldebug_ranges0+0xd20
 	.byte	0x1
-	.2byte	0x6ad
-	.4byte	0xf2d1
+	.2byte	0x6b1
+	.4byte	0xf2d7
 	.uleb128 0x54
-	.4byte	0x1352e
+	.4byte	0x13534
 	.uleb128 0x54
-	.4byte	0x13522
+	.4byte	0x13528
 	.uleb128 0x54
-	.4byte	0x13517
+	.4byte	0x1351d
 	.uleb128 0x5e
-	.4byte	0x1353b
+	.4byte	0x13541
 	.8byte	.LBB1640
 	.4byte	.Ldebug_ranges0+0xd20
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1356f
+	.4byte	0x13575
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13569
 	.uleb128 0x54
-	.4byte	0x13557
+	.4byte	0x1355d
 	.uleb128 0x54
-	.4byte	0x1354c
+	.4byte	0x13552
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xd20
 	.uleb128 0x57
-	.4byte	0x1357a
+	.4byte	0x13580
 	.uleb128 0x4e
 	.8byte	.LVL545
-	.4byte	0x14212
+	.4byte	0x14218
 	.uleb128 0x4e
 	.8byte	.LVL575
-	.4byte	0x14212
+	.4byte	0x14218
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13506
+	.4byte	0x1350c
 	.8byte	.LBB1646
 	.4byte	.Ldebug_ranges0+0xd60
 	.byte	0x1
-	.2byte	0x6b0
-	.4byte	0xf347
+	.2byte	0x6b4
+	.4byte	0xf34d
 	.uleb128 0x54
-	.4byte	0x1352e
+	.4byte	0x13534
 	.uleb128 0x54
-	.4byte	0x13522
+	.4byte	0x13528
 	.uleb128 0x54
-	.4byte	0x13517
+	.4byte	0x1351d
 	.uleb128 0x5e
-	.4byte	0x1353b
+	.4byte	0x13541
 	.8byte	.LBB1647
 	.4byte	.Ldebug_ranges0+0xd60
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1356f
+	.4byte	0x13575
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13569
 	.uleb128 0x54
-	.4byte	0x13557
+	.4byte	0x1355d
 	.uleb128 0x54
-	.4byte	0x1354c
+	.4byte	0x13552
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xd60
 	.uleb128 0x57
-	.4byte	0x1357a
+	.4byte	0x13580
 	.uleb128 0x4e
 	.8byte	.LVL546
-	.4byte	0x14212
+	.4byte	0x14218
 	.uleb128 0x4e
 	.8byte	.LVL574
-	.4byte	0x14212
+	.4byte	0x14218
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x13506
+	.4byte	0x1350c
 	.8byte	.LBB1653
 	.4byte	.Ldebug_ranges0+0xda0
 	.byte	0x1
-	.2byte	0x6b3
+	.2byte	0x6b7
 	.uleb128 0x54
-	.4byte	0x1352e
+	.4byte	0x13534
 	.uleb128 0x54
-	.4byte	0x13522
+	.4byte	0x13528
 	.uleb128 0x54
-	.4byte	0x13517
+	.4byte	0x1351d
 	.uleb128 0x5e
-	.4byte	0x1353b
+	.4byte	0x13541
 	.8byte	.LBB1654
 	.4byte	.Ldebug_ranges0+0xda0
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1356f
+	.4byte	0x13575
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13569
 	.uleb128 0x54
-	.4byte	0x13557
+	.4byte	0x1355d
 	.uleb128 0x54
-	.4byte	0x1354c
+	.4byte	0x13552
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xda0
 	.uleb128 0x57
-	.4byte	0x1357a
+	.4byte	0x13580
 	.uleb128 0x4e
 	.8byte	.LVL547
-	.4byte	0x14212
+	.4byte	0x14218
 	.uleb128 0x4e
 	.8byte	.LVL573
-	.4byte	0x14212
+	.4byte	0x14218
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0xfd92
+	.4byte	0xfd98
 	.8byte	.LBB1675
 	.4byte	.Ldebug_ranges0+0xde0
 	.byte	0x1
-	.2byte	0x95c
-	.4byte	0xf568
+	.2byte	0x960
+	.4byte	0xf56e
 	.uleb128 0x54
-	.4byte	0xfda3
+	.4byte	0xfda9
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xde0
 	.uleb128 0x5f
-	.4byte	0xfdaf
+	.4byte	0xfdb5
 	.4byte	.LLST151
 	.uleb128 0x57
-	.4byte	0xfdbb
+	.4byte	0xfdc1
 	.uleb128 0x57
-	.4byte	0xfdc7
+	.4byte	0xfdcd
 	.uleb128 0x57
-	.4byte	0xfdd3
+	.4byte	0xfdd9
 	.uleb128 0x60
-	.4byte	0xfddf
+	.4byte	0xfde5
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x57
-	.4byte	0xfde9
+	.4byte	0xfdef
 	.uleb128 0x57
-	.4byte	0xfdf5
+	.4byte	0xfdfb
 	.uleb128 0x57
-	.4byte	0xfe01
+	.4byte	0xfe07
 	.uleb128 0x5a
-	.4byte	0x13619
+	.4byte	0x1361f
 	.8byte	.LBB1677
 	.4byte	.Ldebug_ranges0+0xe50
 	.byte	0x1
-	.2byte	0x85a
-	.4byte	0xf42b
+	.2byte	0x85e
+	.4byte	0xf431
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x1362f
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x135e3
+	.4byte	0x135e9
 	.8byte	.LBB1681
 	.4byte	.Ldebug_ranges0+0xe80
 	.byte	0x1
-	.2byte	0x875
-	.4byte	0xf460
+	.2byte	0x879
+	.4byte	0xf466
 	.uleb128 0x54
-	.4byte	0x1360c
+	.4byte	0x13612
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x13606
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x135fa
 	.uleb128 0x4e
 	.8byte	.LVL553
-	.4byte	0x14205
+	.4byte	0x1420b
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135e3
+	.4byte	0x135e9
 	.8byte	.LBB1689
 	.8byte	.LBE1689-.LBB1689
 	.byte	0x1
-	.2byte	0x878
-	.4byte	0xf499
+	.2byte	0x87c
+	.4byte	0xf49f
 	.uleb128 0x54
-	.4byte	0x1360c
+	.4byte	0x13612
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x13606
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x135fa
 	.uleb128 0x4e
 	.8byte	.LVL554
-	.4byte	0x14205
+	.4byte	0x1420b
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135e3
+	.4byte	0x135e9
 	.8byte	.LBB1691
 	.8byte	.LBE1691-.LBB1691
 	.byte	0x1
-	.2byte	0x87b
-	.4byte	0xf4d2
+	.2byte	0x87f
+	.4byte	0xf4d8
 	.uleb128 0x54
-	.4byte	0x1360c
+	.4byte	0x13612
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x13606
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x135fa
 	.uleb128 0x4e
 	.8byte	.LVL555
-	.4byte	0x14205
+	.4byte	0x1420b
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x135e3
+	.4byte	0x135e9
 	.8byte	.LBB1693
 	.8byte	.LBE1693-.LBB1693
 	.byte	0x1
-	.2byte	0x883
-	.4byte	0xf50b
+	.2byte	0x887
+	.4byte	0xf511
 	.uleb128 0x54
-	.4byte	0x1360c
+	.4byte	0x13612
 	.uleb128 0x54
-	.4byte	0x13600
+	.4byte	0x13606
 	.uleb128 0x54
-	.4byte	0x135f4
+	.4byte	0x135fa
 	.uleb128 0x4e
 	.8byte	.LVL556
-	.4byte	0x14205
+	.4byte	0x1420b
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL549
-	.4byte	0x1421f
+	.4byte	0x14225
 	.uleb128 0x4e
 	.8byte	.LVL550
-	.4byte	0x1422c
+	.4byte	0x14232
 	.uleb128 0x4e
 	.8byte	.LVL551
-	.4byte	0x14238
+	.4byte	0x1423e
 	.uleb128 0x4e
 	.8byte	.LVL552
-	.4byte	0x14244
+	.4byte	0x1424a
 	.uleb128 0x4e
 	.8byte	.LVL557
-	.4byte	0x14250
+	.4byte	0x14256
 	.uleb128 0x4e
 	.8byte	.LVL558
-	.4byte	0x1425a
+	.4byte	0x14260
 	.uleb128 0x4e
 	.8byte	.LVL570
-	.4byte	0x14266
+	.4byte	0x1426c
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0xfe0c
+	.4byte	0xfe12
 	.8byte	.LBB1702
 	.4byte	.Ldebug_ranges0+0xed0
 	.byte	0x1
-	.2byte	0x963
-	.4byte	0xf64a
+	.2byte	0x967
+	.4byte	0xf650
 	.uleb128 0x54
-	.4byte	0xfe1d
+	.4byte	0xfe23
 	.uleb128 0x54
-	.4byte	0xfe1d
+	.4byte	0xfe23
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xed0
 	.uleb128 0x57
-	.4byte	0xfe29
+	.4byte	0xfe2f
 	.uleb128 0x5f
-	.4byte	0xfe35
+	.4byte	0xfe3b
 	.4byte	.LLST152
 	.uleb128 0x57
-	.4byte	0xfe41
+	.4byte	0xfe47
 	.uleb128 0x60
-	.4byte	0xfe4d
+	.4byte	0xfe53
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5f
-	.4byte	0xfe57
+	.4byte	0xfe5d
 	.4byte	.LLST153
 	.uleb128 0x57
-	.4byte	0xfe63
+	.4byte	0xfe69
 	.uleb128 0x57
-	.4byte	0xfe6f
+	.4byte	0xfe75
 	.uleb128 0x53
-	.4byte	0x13619
+	.4byte	0x1361f
 	.8byte	.LBB1704
 	.8byte	.LBE1704-.LBB1704
 	.byte	0x1
-	.2byte	0x82d
-	.4byte	0xf5e0
+	.2byte	0x831
+	.4byte	0xf5e6
 	.uleb128 0x54
-	.4byte	0x13629
+	.4byte	0x1362f
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL560
-	.4byte	0x1421f
+	.4byte	0x14225
 	.uleb128 0x4e
 	.8byte	.LVL561
-	.4byte	0x1422c
+	.4byte	0x14232
 	.uleb128 0x4e
 	.8byte	.LVL579
-	.4byte	0x14238
+	.4byte	0x1423e
 	.uleb128 0x4e
 	.8byte	.LVL580
-	.4byte	0x14273
+	.4byte	0x14279
 	.uleb128 0x4e
 	.8byte	.LVL661
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL662
-	.4byte	0x1427f
+	.4byte	0x14285
 	.uleb128 0x4e
 	.8byte	.LVL663
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL682
-	.4byte	0x14266
+	.4byte	0x1426c
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0xfd5a
+	.4byte	0xfd60
 	.8byte	.LBB1713
 	.4byte	.Ldebug_ranges0+0xf30
 	.byte	0x1
-	.2byte	0x96a
-	.4byte	0xf7d7
+	.2byte	0x96e
+	.4byte	0xf7dd
 	.uleb128 0x54
-	.4byte	0xfd6b
+	.4byte	0xfd71
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xf30
 	.uleb128 0x60
-	.4byte	0xfd77
+	.4byte	0xfd7d
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5a
-	.4byte	0x137ef
+	.4byte	0x137f5
 	.8byte	.LBB1715
 	.4byte	.Ldebug_ranges0+0xf70
 	.byte	0x1
-	.2byte	0x890
-	.4byte	0xf6d1
+	.2byte	0x894
+	.4byte	0xf6d7
 	.uleb128 0x54
-	.4byte	0x137fb
+	.4byte	0x13801
 	.uleb128 0x56
 	.8byte	.LBB1717
 	.8byte	.LBE1717-.LBB1717
 	.uleb128 0x57
-	.4byte	0x13826
+	.4byte	0x1382c
 	.uleb128 0x5b
-	.4byte	0x13973
+	.4byte	0x13979
 	.8byte	.LBB1718
 	.8byte	.LBE1718-.LBB1718
 	.byte	0x10
 	.byte	0x1c
 	.uleb128 0x54
-	.4byte	0x13996
+	.4byte	0x1399c
 	.uleb128 0x54
-	.4byte	0x1398a
+	.4byte	0x13990
 	.uleb128 0x54
-	.4byte	0x13980
+	.4byte	0x13986
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x138b5
+	.4byte	0x138bb
 	.8byte	.LBB1722
 	.8byte	.LBE1722-.LBB1722
 	.byte	0x1
-	.2byte	0x898
-	.4byte	0xf71c
+	.2byte	0x89c
+	.4byte	0xf722
 	.uleb128 0x54
-	.4byte	0x138ca
+	.4byte	0x138d0
 	.uleb128 0x54
-	.4byte	0x138c1
+	.4byte	0x138c7
 	.uleb128 0x56
 	.8byte	.LBB1723
 	.8byte	.LBE1723-.LBB1723
 	.uleb128 0x5f
-	.4byte	0x138d3
+	.4byte	0x138d9
 	.4byte	.LLST154
 	.uleb128 0x5f
-	.4byte	0x138dd
+	.4byte	0x138e3
 	.4byte	.LLST155
 	.byte	0
 	.byte	0
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xfa0
-	.4byte	0xf749
+	.4byte	0xf74f
 	.uleb128 0x5f
-	.4byte	0xfd84
+	.4byte	0xfd8a
 	.4byte	.LLST156
 	.uleb128 0x4e
 	.8byte	.LVL587
-	.4byte	0x1428b
+	.4byte	0x14291
 	.uleb128 0x4e
 	.8byte	.LVL589
-	.4byte	0x14297
+	.4byte	0x1429d
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x138b5
+	.4byte	0x138bb
 	.8byte	.LBB1726
 	.8byte	.LBE1726-.LBB1726
 	.byte	0x1
-	.2byte	0x8a1
-	.4byte	0xf794
+	.2byte	0x8a5
+	.4byte	0xf79a
 	.uleb128 0x54
-	.4byte	0x138ca
+	.4byte	0x138d0
 	.uleb128 0x54
-	.4byte	0x138c1
+	.4byte	0x138c7
 	.uleb128 0x56
 	.8byte	.LBB1727
 	.8byte	.LBE1727-.LBB1727
 	.uleb128 0x5f
-	.4byte	0x138d3
+	.4byte	0x138d9
 	.4byte	.LLST157
 	.uleb128 0x5f
-	.4byte	0x138dd
+	.4byte	0x138e3
 	.4byte	.LLST158
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL581
-	.4byte	0x1428b
+	.4byte	0x14291
 	.uleb128 0x4e
 	.8byte	.LVL582
-	.4byte	0x142a4
+	.4byte	0x142aa
 	.uleb128 0x4e
 	.8byte	.LVL590
-	.4byte	0x142a4
+	.4byte	0x142aa
 	.uleb128 0x4e
 	.8byte	.LVL666
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL670
-	.4byte	0x14266
+	.4byte	0x1426c
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0xfd40
+	.4byte	0xfd46
 	.8byte	.LBB1730
 	.8byte	.LBE1730-.LBB1730
 	.byte	0x1
-	.2byte	0x971
-	.4byte	0xf871
+	.2byte	0x975
+	.4byte	0xf877
 	.uleb128 0x54
-	.4byte	0xfd4d
+	.4byte	0xfd53
 	.uleb128 0x5a
-	.4byte	0x1324c
+	.4byte	0x13252
 	.8byte	.LBB1732
 	.4byte	.Ldebug_ranges0+0xfd0
 	.byte	0x1
-	.2byte	0x8b1
-	.4byte	0xf83c
+	.2byte	0x8b5
+	.4byte	0xf842
 	.uleb128 0x54
-	.4byte	0x1326e
+	.4byte	0x13274
 	.uleb128 0x54
-	.4byte	0x13263
+	.4byte	0x13269
 	.uleb128 0x54
-	.4byte	0x13258
+	.4byte	0x1325e
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xfd0
 	.uleb128 0x5f
-	.4byte	0x13279
+	.4byte	0x1327f
 	.4byte	.LLST159
 	.uleb128 0x4e
 	.8byte	.LVL597
-	.4byte	0x142b1
+	.4byte	0x142b7
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL598
-	.4byte	0x142bd
+	.4byte	0x142c3
 	.uleb128 0x4e
 	.8byte	.LVL599
-	.4byte	0x142c9
+	.4byte	0x142cf
 	.uleb128 0x4e
 	.8byte	.LVL600
-	.4byte	0x142bd
+	.4byte	0x142c3
 	.uleb128 0x4e
 	.8byte	.LVL601
-	.4byte	0x142c9
+	.4byte	0x142cf
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0xfc9e
+	.4byte	0xfca4
 	.8byte	.LBB1742
 	.4byte	.Ldebug_ranges0+0x1030
 	.byte	0x1
-	.2byte	0x974
-	.4byte	0xfb14
+	.2byte	0x978
+	.4byte	0xfb1a
 	.uleb128 0x54
-	.4byte	0xfcbb
+	.4byte	0xfcc1
 	.uleb128 0x54
-	.4byte	0xfcaf
+	.4byte	0xfcb5
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x1030
 	.uleb128 0x57
-	.4byte	0xfcc7
+	.4byte	0xfccd
 	.uleb128 0x5f
-	.4byte	0xfcd3
+	.4byte	0xfcd9
 	.4byte	.LLST160
 	.uleb128 0x5f
-	.4byte	0xfcdf
+	.4byte	0xfce5
 	.4byte	.LLST161
 	.uleb128 0x5f
-	.4byte	0xfceb
+	.4byte	0xfcf1
 	.4byte	.LLST162
 	.uleb128 0x5f
-	.4byte	0xfcf7
+	.4byte	0xfcfd
 	.4byte	.LLST163
 	.uleb128 0x5f
-	.4byte	0xfd03
+	.4byte	0xfd09
 	.4byte	.LLST164
 	.uleb128 0x5f
-	.4byte	0xfd0f
+	.4byte	0xfd15
 	.4byte	.LLST165
 	.uleb128 0x57
-	.4byte	0xfd1b
+	.4byte	0xfd21
 	.uleb128 0x5f
-	.4byte	0xfd27
+	.4byte	0xfd2d
 	.4byte	.LLST166
 	.uleb128 0x5f
-	.4byte	0xfd33
+	.4byte	0xfd39
 	.4byte	.LLST167
 	.uleb128 0x53
-	.4byte	0x116f3
+	.4byte	0x116f9
 	.8byte	.LBB1744
 	.8byte	.LBE1744-.LBB1744
 	.byte	0x1
-	.2byte	0x8e9
-	.4byte	0xf953
+	.2byte	0x8ed
+	.4byte	0xf959
 	.uleb128 0x54
-	.4byte	0x11704
+	.4byte	0x1170a
 	.uleb128 0x54
-	.4byte	0x11704
+	.4byte	0x1170a
 	.uleb128 0x56
 	.8byte	.LBB1745
 	.8byte	.LBE1745-.LBB1745
 	.uleb128 0x5f
-	.4byte	0x11710
+	.4byte	0x11716
 	.4byte	.LLST168
 	.uleb128 0x4e
 	.8byte	.LVL618
-	.4byte	0x142d5
+	.4byte	0x142db
 	.uleb128 0x4e
 	.8byte	.LVL620
-	.4byte	0x1425a
+	.4byte	0x14260
 	.uleb128 0x4e
 	.8byte	.LVL621
-	.4byte	0x142e1
+	.4byte	0x142e7
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x133c9
+	.4byte	0x133cf
 	.8byte	.LBB1746
 	.8byte	.LBE1746-.LBB1746
 	.byte	0x1
-	.2byte	0x8cf
-	.4byte	0xf9aa
+	.2byte	0x8d3
+	.4byte	0xf9b0
 	.uleb128 0x54
-	.4byte	0x133e6
+	.4byte	0x133ec
 	.uleb128 0x54
-	.4byte	0x133da
+	.4byte	0x133e0
 	.uleb128 0x5c
-	.4byte	0x133f3
+	.4byte	0x133f9
 	.8byte	.LBB1747
 	.8byte	.LBE1747-.LBB1747
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x13410
+	.4byte	0x13416
 	.uleb128 0x54
-	.4byte	0x13404
+	.4byte	0x1340a
 	.uleb128 0x4e
 	.8byte	.LVL635
-	.4byte	0x142ed
+	.4byte	0x142f3
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x133c9
+	.4byte	0x133cf
 	.8byte	.LBB1749
 	.8byte	.LBE1749-.LBB1749
 	.byte	0x1
-	.2byte	0x8dd
-	.4byte	0xfa01
+	.2byte	0x8e1
+	.4byte	0xfa07
 	.uleb128 0x54
-	.4byte	0x133e6
+	.4byte	0x133ec
 	.uleb128 0x54
-	.4byte	0x133da
+	.4byte	0x133e0
 	.uleb128 0x5c
-	.4byte	0x133f3
+	.4byte	0x133f9
 	.8byte	.LBB1750
 	.8byte	.LBE1750-.LBB1750
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x13410
+	.4byte	0x13416
 	.uleb128 0x54
-	.4byte	0x13404
+	.4byte	0x1340a
 	.uleb128 0x4e
 	.8byte	.LVL650
-	.4byte	0x142ed
+	.4byte	0x142f3
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL603
-	.4byte	0x142fa
+	.4byte	0x14300
 	.uleb128 0x4e
 	.8byte	.LVL605
-	.4byte	0x142fa
+	.4byte	0x14300
 	.uleb128 0x4e
 	.8byte	.LVL607
-	.4byte	0x14306
+	.4byte	0x1430c
 	.uleb128 0x4e
 	.8byte	.LVL612
-	.4byte	0x14306
+	.4byte	0x1430c
 	.uleb128 0x4e
 	.8byte	.LVL616
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL617
-	.4byte	0x14313
+	.4byte	0x14319
 	.uleb128 0x4e
 	.8byte	.LVL622
-	.4byte	0x1431f
+	.4byte	0x14325
 	.uleb128 0x4e
 	.8byte	.LVL623
-	.4byte	0x1431f
+	.4byte	0x14325
 	.uleb128 0x4e
 	.8byte	.LVL634
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL639
-	.4byte	0x1432b
+	.4byte	0x14331
 	.uleb128 0x4e
 	.8byte	.LVL642
-	.4byte	0x142d5
+	.4byte	0x142db
 	.uleb128 0x4e
 	.8byte	.LVL644
-	.4byte	0x1432b
+	.4byte	0x14331
 	.uleb128 0x4e
 	.8byte	.LVL645
-	.4byte	0x142e1
+	.4byte	0x142e7
 	.uleb128 0x4e
 	.8byte	.LVL647
-	.4byte	0x14335
+	.4byte	0x1433b
 	.uleb128 0x4e
 	.8byte	.LVL649
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL653
-	.4byte	0x1432b
+	.4byte	0x14331
 	.uleb128 0x4e
 	.8byte	.LVL656
-	.4byte	0x142d5
+	.4byte	0x142db
 	.uleb128 0x4e
 	.8byte	.LVL658
-	.4byte	0x1432b
+	.4byte	0x14331
 	.uleb128 0x4e
 	.8byte	.LVL659
-	.4byte	0x142e1
+	.4byte	0x142e7
 	.uleb128 0x4e
 	.8byte	.LVL686
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL689
-	.4byte	0x14266
+	.4byte	0x1426c
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1349d
+	.4byte	0x134a3
 	.8byte	.LBB1755
 	.8byte	.LBE1755-.LBB1755
 	.byte	0x1
-	.2byte	0x976
-	.4byte	0xfb5d
+	.2byte	0x97a
+	.4byte	0xfb63
 	.uleb128 0x54
-	.4byte	0x134b4
+	.4byte	0x134ba
 	.uleb128 0x54
-	.4byte	0x134a9
+	.4byte	0x134af
 	.uleb128 0x5b
-	.4byte	0x1359f
+	.4byte	0x135a5
 	.8byte	.LBB1756
 	.8byte	.LBE1756-.LBB1756
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x54
-	.4byte	0x135b8
+	.4byte	0x135be
 	.uleb128 0x54
-	.4byte	0x135ac
+	.4byte	0x135b2
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0xfe92
+	.4byte	0xfe98
 	.8byte	.LBB1758
 	.8byte	.LBE1758-.LBB1758
 	.byte	0x1
-	.2byte	0x979
-	.4byte	0xfbe7
+	.2byte	0x97d
+	.4byte	0xfbed
 	.uleb128 0x54
-	.4byte	0xfea3
+	.4byte	0xfea9
 	.uleb128 0x4e
 	.8byte	.LVL624
-	.4byte	0x14341
+	.4byte	0x14347
 	.uleb128 0x4e
 	.8byte	.LVL625
-	.4byte	0x1434d
+	.4byte	0x14353
 	.uleb128 0x4e
 	.8byte	.LVL626
-	.4byte	0x1434d
+	.4byte	0x14353
 	.uleb128 0x4e
 	.8byte	.LVL627
-	.4byte	0x1434d
+	.4byte	0x14353
 	.uleb128 0x4e
 	.8byte	.LVL628
-	.4byte	0x1434d
+	.4byte	0x14353
 	.uleb128 0x4e
 	.8byte	.LVL629
-	.4byte	0x1434d
+	.4byte	0x14353
 	.uleb128 0x4e
 	.8byte	.LVL630
-	.4byte	0x1434d
+	.4byte	0x14353
 	.uleb128 0x4e
 	.8byte	.LVL631
-	.4byte	0x1434d
+	.4byte	0x14353
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL521
-	.4byte	0x1421f
+	.4byte	0x14225
 	.uleb128 0x4e
 	.8byte	.LVL522
-	.4byte	0x1435a
+	.4byte	0x14360
 	.uleb128 0x4e
 	.8byte	.LVL524
-	.4byte	0x1421f
+	.4byte	0x14225
 	.uleb128 0x4e
 	.8byte	.LVL525
-	.4byte	0x14366
+	.4byte	0x1436c
 	.uleb128 0x4e
 	.8byte	.LVL562
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL564
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL571
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL632
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL667
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL674
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL675
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL676
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL680
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL684
-	.4byte	0x14373
+	.4byte	0x14379
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3040
+	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0x8bd
+	.2byte	0x8c1
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfd40
+	.4byte	0xfd46
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x8bd
-	.4byte	0xe47d
+	.2byte	0x8c1
+	.4byte	0xe483
 	.uleb128 0x64
-	.4byte	.LASF2998
-	.byte	0x1
-	.2byte	0x8bd
-	.4byte	0xe13f
-	.uleb128 0x46
-	.4byte	.LASF2957
+	.4byte	.LASF2999
 	.byte	0x1
-	.2byte	0x8bf
-	.4byte	0xe742
+	.2byte	0x8c1
+	.4byte	0xe145
 	.uleb128 0x46
-	.4byte	.LASF3032
+	.4byte	.LASF2958
 	.byte	0x1
-	.2byte	0x8c0
-	.4byte	0x6d
+	.2byte	0x8c3
+	.4byte	0xe748
 	.uleb128 0x46
 	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0x8c1
+	.2byte	0x8c4
 	.4byte	0x6d
 	.uleb128 0x46
 	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0x8c2
-	.4byte	0xc6
+	.2byte	0x8c5
+	.4byte	0x6d
 	.uleb128 0x46
 	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0x8c3
+	.2byte	0x8c6
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0x8c4
-	.4byte	0x219
+	.2byte	0x8c7
+	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0x8c5
+	.2byte	0x8c8
+	.4byte	0x219
+	.uleb128 0x46
+	.4byte	.LASF3038
+	.byte	0x1
+	.2byte	0x8c9
 	.4byte	0x219
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x8c6
-	.4byte	0xe418
+	.2byte	0x8ca
+	.4byte	0xe41e
 	.uleb128 0x46
-	.4byte	.LASF3038
+	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0x8c7
+	.2byte	0x8cb
 	.4byte	0x443
 	.uleb128 0x46
-	.4byte	.LASF3039
+	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0x8c8
+	.2byte	0x8cc
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3095
+	.4byte	.LASF3096
 	.byte	0x1
-	.2byte	0x8a6
+	.2byte	0x8aa
 	.byte	0x1
-	.4byte	0xfd5a
+	.4byte	0xfd60
 	.uleb128 0x64
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
-	.2byte	0x8a6
-	.4byte	0xe742
+	.2byte	0x8aa
+	.4byte	0xe748
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3041
+	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0x88c
+	.2byte	0x890
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfd92
+	.4byte	0xfd98
 	.uleb128 0x64
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
-	.2byte	0x88c
-	.4byte	0xe742
+	.2byte	0x890
+	.4byte	0xe748
 	.uleb128 0x46
 	.4byte	.LASF2465
 	.byte	0x1
-	.2byte	0x88e
+	.2byte	0x892
 	.4byte	0xd7ff
 	.uleb128 0x66
 	.uleb128 0x52
 	.string	"__k"
 	.byte	0x1
-	.2byte	0x89b
+	.2byte	0x89f
 	.4byte	0x2ef0
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3042
+	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0x843
+	.2byte	0x847
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe0c
+	.4byte	0xfe12
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x843
-	.4byte	0xe47d
+	.2byte	0x847
+	.4byte	0xe483
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x845
+	.2byte	0x849
 	.4byte	0xa55b
 	.uleb128 0x46
-	.4byte	.LASF2998
+	.4byte	.LASF2999
 	.byte	0x1
-	.2byte	0x846
-	.4byte	0xe13f
+	.2byte	0x84a
+	.4byte	0xe145
 	.uleb128 0x46
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
-	.2byte	0x847
-	.4byte	0xe742
+	.2byte	0x84b
+	.4byte	0xe748
 	.uleb128 0x46
-	.4byte	.LASF3043
+	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0x848
+	.2byte	0x84c
 	.4byte	0xb87f
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x849
+	.2byte	0x84d
 	.4byte	0x9737
 	.uleb128 0x46
-	.4byte	.LASF3044
+	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0x84a
+	.2byte	0x84e
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x84b
+	.2byte	0x84f
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x84b
+	.2byte	0x84f
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3045
+	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0x81a
+	.2byte	0x81e
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe7d
+	.4byte	0xfe83
 	.uleb128 0x64
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
-	.2byte	0x81a
-	.4byte	0xe742
+	.2byte	0x81e
+	.4byte	0xe748
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x81c
+	.2byte	0x820
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x81d
+	.2byte	0x821
 	.4byte	0xa55b
 	.uleb128 0x46
-	.4byte	.LASF3043
+	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0x81e
+	.2byte	0x822
 	.4byte	0xb87f
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x81f
+	.2byte	0x823
 	.4byte	0x9737
 	.uleb128 0x46
-	.4byte	.LASF3046
+	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0x820
+	.2byte	0x824
 	.4byte	0x29
 	.uleb128 0x46
-	.4byte	.LASF3047
+	.4byte	.LASF3048
 	.byte	0x1
-	.2byte	0x821
+	.2byte	0x825
 	.4byte	0xc6
 	.uleb128 0x67
-	.4byte	.LASF3024
-	.4byte	0xfe8d
-	.4byte	.LASF3045
+	.4byte	.LASF3025
+	.4byte	0xfe93
+	.4byte	.LASF3046
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xfe8d
+	.4byte	0xfe93
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x12
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xfe7d
+	.4byte	0xfe83
 	.uleb128 0x62
-	.4byte	.LASF3048
+	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0x80b
+	.2byte	0x80f
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfeb0
+	.4byte	0xfeb6
 	.uleb128 0x64
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
-	.2byte	0x80b
-	.4byte	0xe742
+	.2byte	0x80f
+	.4byte	0xe748
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3049
+	.4byte	.LASF3050
 	.byte	0x1
-	.2byte	0x802
+	.2byte	0x806
 	.4byte	0x2d9
 	.8byte	.LFB2841
 	.8byte	.LFE2841-.LFB2841
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xff10
+	.4byte	0xff16
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x802
+	.2byte	0x806
 	.4byte	0xa55b
 	.4byte	.LLST75
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x803
+	.2byte	0x807
 	.4byte	0xb3d6
 	.4byte	.LLST76
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x804
+	.2byte	0x808
 	.4byte	0x219
 	.4byte	.LLST77
 	.uleb128 0x4e
 	.8byte	.LVL300
-	.4byte	0x1437d
+	.4byte	0x14383
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3050
+	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0x7f9
+	.2byte	0x7fd
 	.4byte	0x2d9
 	.8byte	.LFB2840
 	.8byte	.LFE2840-.LFB2840
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xff70
+	.4byte	0xff76
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x7f9
+	.2byte	0x7fd
 	.4byte	0xa55b
 	.4byte	.LLST78
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x7fa
+	.2byte	0x7fe
 	.4byte	0xb3d6
 	.4byte	.LLST79
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7fb
+	.2byte	0x7ff
 	.4byte	0x219
 	.4byte	.LLST80
 	.uleb128 0x4e
 	.8byte	.LVL305
-	.4byte	0x14389
+	.4byte	0x1438f
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3051
+	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0x7f0
+	.2byte	0x7f4
 	.4byte	0x2d9
 	.8byte	.LFB2839
 	.8byte	.LFE2839-.LFB2839
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xffd0
+	.4byte	0xffd6
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x7f0
+	.2byte	0x7f4
 	.4byte	0xa55b
 	.4byte	.LLST81
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x7f1
+	.2byte	0x7f5
 	.4byte	0xb3d6
 	.4byte	.LLST82
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7f2
+	.2byte	0x7f6
 	.4byte	0x219
 	.4byte	.LLST83
 	.uleb128 0x4e
 	.8byte	.LVL310
-	.4byte	0x14389
+	.4byte	0x1438f
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3052
+	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0x7d8
+	.2byte	0x7dc
 	.4byte	0x2d9
 	.8byte	.LFB2838
 	.8byte	.LFE2838-.LFB2838
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x100a0
+	.4byte	0x100a6
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x7d8
+	.2byte	0x7dc
 	.4byte	0xa55b
 	.4byte	.LLST93
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x7d9
+	.2byte	0x7dd
 	.4byte	0xb3d6
 	.4byte	.LLST94
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7da
+	.2byte	0x7de
 	.4byte	0x56
 	.4byte	.LLST95
 	.uleb128 0x58
 	.4byte	.LASF382
 	.byte	0x1
-	.2byte	0x7da
+	.2byte	0x7de
 	.4byte	0x2ce
 	.4byte	.LLST96
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x7dc
-	.4byte	0xe47d
+	.2byte	0x7e0
+	.4byte	0xe483
 	.4byte	.LLST97
 	.uleb128 0x59
 	.4byte	.LASF2455
 	.byte	0x1
-	.2byte	0x7dd
+	.2byte	0x7e1
 	.4byte	0xc6
 	.4byte	.LLST98
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x7dd
+	.2byte	0x7e1
 	.4byte	0xc6
 	.uleb128 0x4e
 	.8byte	.LVL336
-	.4byte	0x14396
+	.4byte	0x1439c
 	.uleb128 0x4e
 	.8byte	.LVL338
-	.4byte	0x143a3
+	.4byte	0x143a9
 	.uleb128 0x4e
 	.8byte	.LVL343
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL346
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL347
-	.4byte	0x14373
+	.4byte	0x14379
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3053
+	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0x7cc
+	.2byte	0x7d0
 	.4byte	0x2d9
 	.8byte	.LFB2837
 	.8byte	.LFE2837-.LFB2837
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1013a
+	.4byte	0x10140
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x7cc
+	.2byte	0x7d0
 	.4byte	0xa55b
 	.4byte	.LLST84
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x7cd
+	.2byte	0x7d1
 	.4byte	0xb3d6
 	.4byte	.LLST85
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7ce
+	.2byte	0x7d2
 	.4byte	0x219
 	.4byte	.LLST86
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x7d0
-	.4byte	0xe47d
+	.2byte	0x7d4
+	.4byte	0xe483
 	.uleb128 0x46
 	.4byte	.LASF2455
 	.byte	0x1
-	.2byte	0x7d1
+	.2byte	0x7d5
 	.4byte	0xc6
 	.uleb128 0x53
-	.4byte	0x13175
+	.4byte	0x1317b
 	.8byte	.LBB1208
 	.8byte	.LBE1208-.LBB1208
 	.byte	0x1
-	.2byte	0x7d3
-	.4byte	0x1012c
+	.2byte	0x7d7
+	.4byte	0x10132
 	.uleb128 0x54
-	.4byte	0x13185
+	.4byte	0x1318b
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL315
-	.4byte	0x14389
+	.4byte	0x1438f
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3054
+	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0x7be
+	.2byte	0x7c2
 	.4byte	0x2d9
 	.8byte	.LFB2836
 	.8byte	.LFE2836-.LFB2836
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x101e3
+	.4byte	0x101e9
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x7be
+	.2byte	0x7c2
 	.4byte	0xa55b
 	.4byte	.LLST87
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x7bf
+	.2byte	0x7c3
 	.4byte	0xb3d6
 	.4byte	.LLST88
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7c0
+	.2byte	0x7c4
 	.4byte	0x219
 	.4byte	.LLST89
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x7c2
-	.4byte	0xe47d
+	.2byte	0x7c6
+	.4byte	0xe483
 	.uleb128 0x69
 	.string	"t"
 	.byte	0x1
-	.2byte	0x7c3
+	.2byte	0x7c7
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x5a
-	.4byte	0x13191
+	.4byte	0x13197
 	.8byte	.LBB1210
 	.4byte	.Ldebug_ranges0+0x6a0
 	.byte	0x1
-	.2byte	0x7c5
-	.4byte	0x101c8
+	.2byte	0x7c9
+	.4byte	0x101ce
 	.uleb128 0x54
-	.4byte	0x131ac
+	.4byte	0x131b2
 	.uleb128 0x54
-	.4byte	0x131a1
+	.4byte	0x131a7
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL322
-	.4byte	0x14389
+	.4byte	0x1438f
 	.uleb128 0x4e
 	.8byte	.LVL325
-	.4byte	0x14373
+	.4byte	0x14379
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3055
+	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0x7b3
+	.2byte	0x7b7
 	.4byte	0x2d9
 	.8byte	.LFB2835
 	.8byte	.LFE2835-.LFB2835
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1024f
+	.4byte	0x10255
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x7b3
+	.2byte	0x7b7
 	.4byte	0xa55b
 	.4byte	.LLST90
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x7b4
+	.2byte	0x7b8
 	.4byte	0xb3d6
 	.4byte	.LLST91
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7b5
+	.2byte	0x7b9
 	.4byte	0x219
 	.4byte	.LLST92
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x7b7
-	.4byte	0xe47d
+	.2byte	0x7bb
+	.4byte	0xe483
 	.uleb128 0x4e
 	.8byte	.LVL330
-	.4byte	0x14389
+	.4byte	0x1438f
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3056
+	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0x7a8
+	.2byte	0x7ac
 	.4byte	0x2d9
 	.8byte	.LFB2834
 	.8byte	.LFE2834-.LFB2834
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x102c8
+	.4byte	0x102ce
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x7a8
+	.2byte	0x7ac
 	.4byte	0xa55b
 	.4byte	.LLST99
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x7a9
+	.2byte	0x7ad
 	.4byte	0xb3d6
 	.4byte	.LLST100
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7aa
+	.2byte	0x7ae
 	.4byte	0x219
 	.4byte	.LLST101
 	.uleb128 0x46
-	.4byte	.LASF3057
+	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x7ac
+	.2byte	0x7b0
 	.4byte	0x56
 	.uleb128 0x4e
 	.8byte	.LVL349
-	.4byte	0x143af
+	.4byte	0x143b5
 	.uleb128 0x4e
 	.8byte	.LVL350
-	.4byte	0x14389
+	.4byte	0x1438f
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3058
+	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x791
+	.2byte	0x795
 	.4byte	0xc6
 	.8byte	.LFB2833
 	.8byte	.LFE2833-.LFB2833
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10309
+	.4byte	0x1030f
 	.uleb128 0x58
 	.4byte	.LASF417
 	.byte	0x1
-	.2byte	0x791
+	.2byte	0x795
 	.4byte	0x1c6a
 	.4byte	.LLST10
 	.uleb128 0x6a
 	.4byte	.LASF1272
 	.byte	0x1
-	.2byte	0x791
+	.2byte	0x795
 	.4byte	0x5547
 	.uleb128 0x1
 	.byte	0x51
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3059
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x782
+	.2byte	0x786
 	.4byte	0xc6
 	.8byte	.LFB2832
 	.8byte	.LFE2832-.LFB2832
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10372
+	.4byte	0x10378
 	.uleb128 0x58
 	.4byte	.LASF1272
 	.byte	0x1
-	.2byte	0x782
+	.2byte	0x786
 	.4byte	0x5547
 	.4byte	.LLST14
 	.uleb128 0x51
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x782
+	.2byte	0x786
 	.4byte	0x3ca0
 	.4byte	.LLST15
 	.uleb128 0x46
 	.4byte	.LASF883
 	.byte	0x1
-	.2byte	0x784
+	.2byte	0x788
 	.4byte	0x29
 	.uleb128 0x4e
 	.8byte	.LVL76
-	.4byte	0x143bb
+	.4byte	0x143c1
 	.uleb128 0x4e
 	.8byte	.LVL77
-	.4byte	0x143c7
+	.4byte	0x143cd
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3060
+	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x6b9
+	.2byte	0x6bd
 	.4byte	0x194
 	.8byte	.LFB2831
 	.8byte	.LFE2831-.LFB2831
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1161a
+	.4byte	0x11620
 	.uleb128 0x58
 	.4byte	.LASF1272
 	.byte	0x1
-	.2byte	0x6b9
+	.2byte	0x6bd
 	.4byte	0x5547
 	.4byte	.LLST16
 	.uleb128 0x51
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0x6b9
+	.2byte	0x6bd
 	.4byte	0x6d
 	.4byte	.LLST17
 	.uleb128 0x51
 	.string	"arg"
 	.byte	0x1
-	.2byte	0x6b9
+	.2byte	0x6bd
 	.4byte	0x29
 	.4byte	.LLST18
 	.uleb128 0x46
-	.4byte	.LASF3061
+	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x6bb
+	.2byte	0x6bf
 	.4byte	0x443
 	.uleb128 0x46
-	.4byte	.LASF2998
+	.4byte	.LASF2999
 	.byte	0x1
-	.2byte	0x6bc
-	.4byte	0xe13f
+	.2byte	0x6c0
+	.4byte	0xe145
 	.uleb128 0x46
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
-	.2byte	0x6bd
-	.4byte	0xe742
+	.2byte	0x6c1
+	.4byte	0xe748
 	.uleb128 0x4c
-	.4byte	.LASF3062
+	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x6be
-	.4byte	0xd9e5
+	.2byte	0x6c2
+	.4byte	0xd9eb
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 -56
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6bf
-	.4byte	0xe418
+	.2byte	0x6c3
+	.4byte	0xe41e
 	.uleb128 0x46
-	.4byte	.LASF3063
+	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x6c0
+	.2byte	0x6c4
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3064
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x6c1
+	.2byte	0x6c5
 	.4byte	0x29
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x6c2
+	.2byte	0x6c6
 	.4byte	0xc6
 	.uleb128 0x55
-	.4byte	.LASF3024
-	.4byte	0x1162a
+	.4byte	.LASF3025
+	.4byte	0x11630
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34971
+	.8byte	__func__.34976
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x1a0
-	.4byte	0x104dc
+	.4byte	0x104e2
 	.uleb128 0x46
-	.4byte	.LASF3065
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x70c
+	.2byte	0x710
 	.4byte	0xc6
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x1a0
 	.uleb128 0x6b
-	.4byte	.LASF3077
+	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0x70c
+	.2byte	0x710
 	.8byte	.L212
 	.uleb128 0x4c
-	.4byte	.LASF3066
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x70c
+	.2byte	0x710
 	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -96
 	.uleb128 0x46
-	.4byte	.LASF3065
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x70c
+	.2byte	0x710
 	.4byte	0x194
 	.uleb128 0x6c
 	.8byte	.LBB1000
 	.8byte	.LBE1000-.LBB1000
-	.4byte	0x104c0
+	.4byte	0x104c6
 	.uleb128 0x59
-	.4byte	.LASF3067
+	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x70c
+	.2byte	0x710
 	.4byte	0x194
 	.4byte	.LLST33
 	.uleb128 0x4e
 	.8byte	.LVL123
-	.4byte	0x143d4
+	.4byte	0x143da
 	.uleb128 0x4e
 	.8byte	.LVL124
-	.4byte	0x143e0
+	.4byte	0x143e6
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL121
-	.4byte	0x143ed
+	.4byte	0x143f3
 	.uleb128 0x4e
 	.8byte	.LVL125
-	.4byte	0x143f9
+	.4byte	0x143ff
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13284
+	.4byte	0x1328a
 	.8byte	.LBB936
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x774
-	.4byte	0x106fc
+	.2byte	0x778
+	.4byte	0x10702
 	.uleb128 0x54
-	.4byte	0x132a9
+	.4byte	0x132af
 	.uleb128 0x54
-	.4byte	0x1329e
+	.4byte	0x132a4
 	.uleb128 0x54
-	.4byte	0x13294
+	.4byte	0x1329a
 	.uleb128 0x6d
-	.4byte	0x132e2
+	.4byte	0x132e8
 	.8byte	.LBB937
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x13307
+	.4byte	0x1330d
 	.uleb128 0x54
-	.4byte	0x132fc
+	.4byte	0x13302
 	.uleb128 0x54
-	.4byte	0x132f2
+	.4byte	0x132f8
 	.uleb128 0x6e
-	.4byte	0x1337f
+	.4byte	0x13385
 	.8byte	.LBB939
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10632
+	.4byte	0x10638
 	.uleb128 0x54
-	.4byte	0x1339a
+	.4byte	0x133a0
 	.uleb128 0x6f
-	.4byte	0x1338f
+	.4byte	0x13395
 	.4byte	.LLST19
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x80
 	.uleb128 0x5f
-	.4byte	0x133a5
+	.4byte	0x133ab
 	.4byte	.LLST20
 	.uleb128 0x5f
-	.4byte	0x133b0
+	.4byte	0x133b6
 	.4byte	.LLST21
 	.uleb128 0x70
-	.4byte	0x137d3
+	.4byte	0x137d9
 	.8byte	.LBB941
 	.8byte	.LBE941-.LBB941
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10598
+	.4byte	0x1059e
 	.uleb128 0x56
 	.8byte	.LBB942
 	.8byte	.LBE942-.LBB942
 	.uleb128 0x5f
-	.4byte	0x137e3
+	.4byte	0x137e9
 	.4byte	.LLST22
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x137a7
+	.4byte	0x137ad
 	.8byte	.LBB943
 	.8byte	.LBE943-.LBB943
 	.byte	0x6
 	.byte	0x55
-	.4byte	0x105e0
+	.4byte	0x105e6
 	.uleb128 0x54
-	.4byte	0x137c1
+	.4byte	0x137c7
 	.uleb128 0x54
-	.4byte	0x137b7
+	.4byte	0x137bd
 	.uleb128 0x5b
-	.4byte	0x13889
+	.4byte	0x1388f
 	.8byte	.LBB944
 	.8byte	.LBE944-.LBB944
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x138a3
+	.4byte	0x138a9
 	.uleb128 0x54
-	.4byte	0x13899
+	.4byte	0x1389f
 	.byte	0
 	.byte	0
 	.uleb128 0x56
 	.8byte	.LBB946
 	.8byte	.LBE946-.LBB946
 	.uleb128 0x57
-	.4byte	0x133bc
+	.4byte	0x133c2
 	.uleb128 0x5b
-	.4byte	0x13857
+	.4byte	0x1385d
 	.8byte	.LBB947
 	.8byte	.LBE947-.LBB947
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13872
+	.4byte	0x13878
 	.uleb128 0x54
-	.4byte	0x13867
+	.4byte	0x1386d
 	.uleb128 0x56
 	.8byte	.LBB948
 	.8byte	.LBE948-.LBB948
 	.uleb128 0x57
-	.4byte	0x1387d
+	.4byte	0x13883
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x1334b
+	.4byte	0x13351
 	.8byte	.LBB953
 	.8byte	.LBE953-.LBB953
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x106ed
+	.4byte	0x106f3
 	.uleb128 0x54
-	.4byte	0x1335b
+	.4byte	0x13361
 	.uleb128 0x56
 	.8byte	.LBB954
 	.8byte	.LBE954-.LBB954
 	.uleb128 0x5f
-	.4byte	0x13366
+	.4byte	0x1336c
 	.4byte	.LLST23
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xc0
-	.4byte	0x106b8
+	.4byte	0x106be
 	.uleb128 0x5f
-	.4byte	0x13372
+	.4byte	0x13378
 	.4byte	.LLST24
 	.uleb128 0x5b
-	.4byte	0x13857
+	.4byte	0x1385d
 	.8byte	.LBB956
 	.8byte	.LBE956-.LBB956
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13872
+	.4byte	0x13878
 	.uleb128 0x54
-	.4byte	0x13867
+	.4byte	0x1386d
 	.uleb128 0x56
 	.8byte	.LBB957
 	.8byte	.LBE957-.LBB957
 	.uleb128 0x57
-	.4byte	0x1387d
+	.4byte	0x13883
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x137d3
+	.4byte	0x137d9
 	.8byte	.LBB958
 	.8byte	.LBE958-.LBB958
 	.byte	0x6
@@ -40965,7 +40969,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB959
 	.8byte	.LBE959-.LBB959
 	.uleb128 0x5f
-	.4byte	0x137e3
+	.4byte	0x137e9
 	.4byte	.LLST25
 	.byte	0
 	.byte	0
@@ -40973,162 +40977,162 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL151
-	.4byte	0x14406
+	.4byte	0x1440c
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x132b3
+	.4byte	0x132b9
 	.8byte	.LBB969
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
-	.2byte	0x6f7
-	.4byte	0x10927
+	.2byte	0x6fb
+	.4byte	0x1092d
 	.uleb128 0x54
-	.4byte	0x132d8
+	.4byte	0x132de
 	.uleb128 0x54
-	.4byte	0x132cd
+	.4byte	0x132d3
 	.uleb128 0x54
-	.4byte	0x132c3
+	.4byte	0x132c9
 	.uleb128 0x6d
-	.4byte	0x13311
+	.4byte	0x13317
 	.8byte	.LBB970
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x13336
+	.4byte	0x1333c
 	.uleb128 0x54
-	.4byte	0x1332b
+	.4byte	0x13331
 	.uleb128 0x54
-	.4byte	0x13321
+	.4byte	0x13327
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x57
-	.4byte	0x1333f
+	.4byte	0x13345
 	.uleb128 0x6e
-	.4byte	0x1337f
+	.4byte	0x13385
 	.8byte	.LBB972
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x1085c
+	.4byte	0x10862
 	.uleb128 0x54
-	.4byte	0x1339a
+	.4byte	0x133a0
 	.uleb128 0x6f
-	.4byte	0x1338f
+	.4byte	0x13395
 	.4byte	.LLST26
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x130
 	.uleb128 0x5f
-	.4byte	0x133a5
+	.4byte	0x133ab
 	.4byte	.LLST27
 	.uleb128 0x5f
-	.4byte	0x133b0
+	.4byte	0x133b6
 	.4byte	.LLST28
 	.uleb128 0x70
-	.4byte	0x137d3
+	.4byte	0x137d9
 	.8byte	.LBB974
 	.8byte	.LBE974-.LBB974
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x107c2
+	.4byte	0x107c8
 	.uleb128 0x56
 	.8byte	.LBB975
 	.8byte	.LBE975-.LBB975
 	.uleb128 0x5f
-	.4byte	0x137e3
+	.4byte	0x137e9
 	.4byte	.LLST29
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB976
 	.8byte	.LBE976-.LBB976
-	.4byte	0x10816
+	.4byte	0x1081c
 	.uleb128 0x57
-	.4byte	0x133bc
+	.4byte	0x133c2
 	.uleb128 0x5b
-	.4byte	0x13857
+	.4byte	0x1385d
 	.8byte	.LBB977
 	.8byte	.LBE977-.LBB977
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13872
+	.4byte	0x13878
 	.uleb128 0x54
-	.4byte	0x13867
+	.4byte	0x1386d
 	.uleb128 0x56
 	.8byte	.LBB978
 	.8byte	.LBE978-.LBB978
 	.uleb128 0x57
-	.4byte	0x1387d
+	.4byte	0x13883
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x137a7
+	.4byte	0x137ad
 	.8byte	.LBB979
 	.8byte	.LBE979-.LBB979
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x137c1
+	.4byte	0x137c7
 	.uleb128 0x54
-	.4byte	0x137b7
+	.4byte	0x137bd
 	.uleb128 0x5b
-	.4byte	0x13889
+	.4byte	0x1388f
 	.8byte	.LBB980
 	.8byte	.LBE980-.LBB980
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x138a3
+	.4byte	0x138a9
 	.uleb128 0x54
-	.4byte	0x13899
+	.4byte	0x1389f
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x1334b
+	.4byte	0x13351
 	.8byte	.LBB984
 	.8byte	.LBE984-.LBB984
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10917
+	.4byte	0x1091d
 	.uleb128 0x54
-	.4byte	0x1335b
+	.4byte	0x13361
 	.uleb128 0x56
 	.8byte	.LBB985
 	.8byte	.LBE985-.LBB985
 	.uleb128 0x5f
-	.4byte	0x13366
+	.4byte	0x1336c
 	.4byte	.LLST30
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x170
-	.4byte	0x108e2
+	.4byte	0x108e8
 	.uleb128 0x5f
-	.4byte	0x13372
+	.4byte	0x13378
 	.4byte	.LLST31
 	.uleb128 0x5b
-	.4byte	0x13857
+	.4byte	0x1385d
 	.8byte	.LBB987
 	.8byte	.LBE987-.LBB987
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13872
+	.4byte	0x13878
 	.uleb128 0x54
-	.4byte	0x13867
+	.4byte	0x1386d
 	.uleb128 0x56
 	.8byte	.LBB988
 	.8byte	.LBE988-.LBB988
 	.uleb128 0x57
-	.4byte	0x1387d
+	.4byte	0x13883
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x137d3
+	.4byte	0x137d9
 	.8byte	.LBB989
 	.8byte	.LBE989-.LBB989
 	.byte	0x6
@@ -41137,7 +41141,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB990
 	.8byte	.LBE990-.LBB990
 	.uleb128 0x5f
-	.4byte	0x137e3
+	.4byte	0x137e9
 	.4byte	.LLST32
 	.byte	0
 	.byte	0
@@ -41145,163 +41149,163 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL116
-	.4byte	0x14413
+	.4byte	0x14419
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x132b3
+	.4byte	0x132b9
 	.8byte	.LBB1004
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
-	.2byte	0x713
-	.4byte	0x10b52
+	.2byte	0x717
+	.4byte	0x10b58
 	.uleb128 0x54
-	.4byte	0x132d8
+	.4byte	0x132de
 	.uleb128 0x54
-	.4byte	0x132cd
+	.4byte	0x132d3
 	.uleb128 0x54
-	.4byte	0x132c3
+	.4byte	0x132c9
 	.uleb128 0x6d
-	.4byte	0x13311
+	.4byte	0x13317
 	.8byte	.LBB1005
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x13336
+	.4byte	0x1333c
 	.uleb128 0x54
-	.4byte	0x1332b
+	.4byte	0x13331
 	.uleb128 0x54
-	.4byte	0x13321
+	.4byte	0x13327
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x1f0
 	.uleb128 0x57
-	.4byte	0x1333f
+	.4byte	0x13345
 	.uleb128 0x6e
-	.4byte	0x1337f
+	.4byte	0x13385
 	.8byte	.LBB1007
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x10a87
+	.4byte	0x10a8d
 	.uleb128 0x54
-	.4byte	0x1339a
+	.4byte	0x133a0
 	.uleb128 0x6f
-	.4byte	0x1338f
+	.4byte	0x13395
 	.4byte	.LLST34
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x230
 	.uleb128 0x5f
-	.4byte	0x133a5
+	.4byte	0x133ab
 	.4byte	.LLST35
 	.uleb128 0x5f
-	.4byte	0x133b0
+	.4byte	0x133b6
 	.4byte	.LLST36
 	.uleb128 0x70
-	.4byte	0x137d3
+	.4byte	0x137d9
 	.8byte	.LBB1009
 	.8byte	.LBE1009-.LBB1009
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x109ed
+	.4byte	0x109f3
 	.uleb128 0x56
 	.8byte	.LBB1010
 	.8byte	.LBE1010-.LBB1010
 	.uleb128 0x5f
-	.4byte	0x137e3
+	.4byte	0x137e9
 	.4byte	.LLST37
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1011
 	.8byte	.LBE1011-.LBB1011
-	.4byte	0x10a41
+	.4byte	0x10a47
 	.uleb128 0x57
-	.4byte	0x133bc
+	.4byte	0x133c2
 	.uleb128 0x5b
-	.4byte	0x13857
+	.4byte	0x1385d
 	.8byte	.LBB1012
 	.8byte	.LBE1012-.LBB1012
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13872
+	.4byte	0x13878
 	.uleb128 0x54
-	.4byte	0x13867
+	.4byte	0x1386d
 	.uleb128 0x56
 	.8byte	.LBB1013
 	.8byte	.LBE1013-.LBB1013
 	.uleb128 0x57
-	.4byte	0x1387d
+	.4byte	0x13883
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x137a7
+	.4byte	0x137ad
 	.8byte	.LBB1014
 	.8byte	.LBE1014-.LBB1014
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x137c1
+	.4byte	0x137c7
 	.uleb128 0x54
-	.4byte	0x137b7
+	.4byte	0x137bd
 	.uleb128 0x5b
-	.4byte	0x13889
+	.4byte	0x1388f
 	.8byte	.LBB1015
 	.8byte	.LBE1015-.LBB1015
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x138a3
+	.4byte	0x138a9
 	.uleb128 0x54
-	.4byte	0x13899
+	.4byte	0x1389f
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x1334b
+	.4byte	0x13351
 	.8byte	.LBB1019
 	.8byte	.LBE1019-.LBB1019
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10b42
+	.4byte	0x10b48
 	.uleb128 0x54
-	.4byte	0x1335b
+	.4byte	0x13361
 	.uleb128 0x56
 	.8byte	.LBB1020
 	.8byte	.LBE1020-.LBB1020
 	.uleb128 0x5f
-	.4byte	0x13366
+	.4byte	0x1336c
 	.4byte	.LLST38
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x270
-	.4byte	0x10b0d
+	.4byte	0x10b13
 	.uleb128 0x5f
-	.4byte	0x13372
+	.4byte	0x13378
 	.4byte	.LLST39
 	.uleb128 0x5b
-	.4byte	0x13857
+	.4byte	0x1385d
 	.8byte	.LBB1022
 	.8byte	.LBE1022-.LBB1022
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13872
+	.4byte	0x13878
 	.uleb128 0x54
-	.4byte	0x13867
+	.4byte	0x1386d
 	.uleb128 0x56
 	.8byte	.LBB1023
 	.8byte	.LBE1023-.LBB1023
 	.uleb128 0x57
-	.4byte	0x1387d
+	.4byte	0x13883
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x137d3
+	.4byte	0x137d9
 	.8byte	.LBB1024
 	.8byte	.LBE1024-.LBB1024
 	.byte	0x6
@@ -41310,7 +41314,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1025
 	.8byte	.LBE1025-.LBB1025
 	.uleb128 0x5f
-	.4byte	0x137e3
+	.4byte	0x137e9
 	.4byte	.LLST40
 	.byte	0
 	.byte	0
@@ -41318,159 +41322,159 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL140
-	.4byte	0x14413
+	.4byte	0x14419
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13284
+	.4byte	0x1328a
 	.8byte	.LBB1034
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
-	.2byte	0x6e1
-	.4byte	0x10d72
+	.2byte	0x6e5
+	.4byte	0x10d78
 	.uleb128 0x54
-	.4byte	0x132a9
+	.4byte	0x132af
 	.uleb128 0x54
-	.4byte	0x1329e
+	.4byte	0x132a4
 	.uleb128 0x54
-	.4byte	0x13294
+	.4byte	0x1329a
 	.uleb128 0x6d
-	.4byte	0x132e2
+	.4byte	0x132e8
 	.8byte	.LBB1035
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x13307
+	.4byte	0x1330d
 	.uleb128 0x54
-	.4byte	0x132fc
+	.4byte	0x13302
 	.uleb128 0x54
-	.4byte	0x132f2
+	.4byte	0x132f8
 	.uleb128 0x6e
-	.4byte	0x1337f
+	.4byte	0x13385
 	.8byte	.LBB1037
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10ca8
+	.4byte	0x10cae
 	.uleb128 0x54
-	.4byte	0x1339a
+	.4byte	0x133a0
 	.uleb128 0x6f
-	.4byte	0x1338f
+	.4byte	0x13395
 	.4byte	.LLST41
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x2f0
 	.uleb128 0x5f
-	.4byte	0x133a5
+	.4byte	0x133ab
 	.4byte	.LLST42
 	.uleb128 0x5f
-	.4byte	0x133b0
+	.4byte	0x133b6
 	.4byte	.LLST43
 	.uleb128 0x70
-	.4byte	0x137d3
+	.4byte	0x137d9
 	.8byte	.LBB1039
 	.8byte	.LBE1039-.LBB1039
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10c0e
+	.4byte	0x10c14
 	.uleb128 0x56
 	.8byte	.LBB1040
 	.8byte	.LBE1040-.LBB1040
 	.uleb128 0x5f
-	.4byte	0x137e3
+	.4byte	0x137e9
 	.4byte	.LLST44
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1041
 	.8byte	.LBE1041-.LBB1041
-	.4byte	0x10c62
+	.4byte	0x10c68
 	.uleb128 0x57
-	.4byte	0x133bc
+	.4byte	0x133c2
 	.uleb128 0x5b
-	.4byte	0x13857
+	.4byte	0x1385d
 	.8byte	.LBB1042
 	.8byte	.LBE1042-.LBB1042
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13872
+	.4byte	0x13878
 	.uleb128 0x54
-	.4byte	0x13867
+	.4byte	0x1386d
 	.uleb128 0x56
 	.8byte	.LBB1043
 	.8byte	.LBE1043-.LBB1043
 	.uleb128 0x57
-	.4byte	0x1387d
+	.4byte	0x13883
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x137a7
+	.4byte	0x137ad
 	.8byte	.LBB1044
 	.8byte	.LBE1044-.LBB1044
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x137c1
+	.4byte	0x137c7
 	.uleb128 0x54
-	.4byte	0x137b7
+	.4byte	0x137bd
 	.uleb128 0x5b
-	.4byte	0x13889
+	.4byte	0x1388f
 	.8byte	.LBB1045
 	.8byte	.LBE1045-.LBB1045
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x138a3
+	.4byte	0x138a9
 	.uleb128 0x54
-	.4byte	0x13899
+	.4byte	0x1389f
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x1334b
+	.4byte	0x13351
 	.8byte	.LBB1051
 	.8byte	.LBE1051-.LBB1051
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x10d63
+	.4byte	0x10d69
 	.uleb128 0x54
-	.4byte	0x1335b
+	.4byte	0x13361
 	.uleb128 0x56
 	.8byte	.LBB1052
 	.8byte	.LBE1052-.LBB1052
 	.uleb128 0x5f
-	.4byte	0x13366
+	.4byte	0x1336c
 	.4byte	.LLST45
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x340
-	.4byte	0x10d2e
+	.4byte	0x10d34
 	.uleb128 0x5f
-	.4byte	0x13372
+	.4byte	0x13378
 	.4byte	.LLST46
 	.uleb128 0x5b
-	.4byte	0x13857
+	.4byte	0x1385d
 	.8byte	.LBB1054
 	.8byte	.LBE1054-.LBB1054
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13872
+	.4byte	0x13878
 	.uleb128 0x54
-	.4byte	0x13867
+	.4byte	0x1386d
 	.uleb128 0x56
 	.8byte	.LBB1055
 	.8byte	.LBE1055-.LBB1055
 	.uleb128 0x57
-	.4byte	0x1387d
+	.4byte	0x13883
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x137d3
+	.4byte	0x137d9
 	.8byte	.LBB1056
 	.8byte	.LBE1056-.LBB1056
 	.byte	0x6
@@ -41479,7 +41483,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1057
 	.8byte	.LBE1057-.LBB1057
 	.uleb128 0x5f
-	.4byte	0x137e3
+	.4byte	0x137e9
 	.4byte	.LLST47
 	.byte	0
 	.byte	0
@@ -41487,163 +41491,163 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL167
-	.4byte	0x14406
+	.4byte	0x1440c
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x132b3
+	.4byte	0x132b9
 	.8byte	.LBB1068
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
-	.2byte	0x730
-	.4byte	0x10fae
+	.2byte	0x734
+	.4byte	0x10fb4
 	.uleb128 0x54
-	.4byte	0x132d8
+	.4byte	0x132de
 	.uleb128 0x54
-	.4byte	0x132cd
+	.4byte	0x132d3
 	.uleb128 0x54
-	.4byte	0x132c3
+	.4byte	0x132c9
 	.uleb128 0x6d
-	.4byte	0x13311
+	.4byte	0x13317
 	.8byte	.LBB1069
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x13336
+	.4byte	0x1333c
 	.uleb128 0x54
-	.4byte	0x1332b
+	.4byte	0x13331
 	.uleb128 0x54
-	.4byte	0x13321
+	.4byte	0x13327
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x370
 	.uleb128 0x5f
-	.4byte	0x1333f
+	.4byte	0x13345
 	.4byte	.LLST48
 	.uleb128 0x6e
-	.4byte	0x1337f
+	.4byte	0x13385
 	.8byte	.LBB1071
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x10ed6
+	.4byte	0x10edc
 	.uleb128 0x54
-	.4byte	0x1339a
+	.4byte	0x133a0
 	.uleb128 0x6f
-	.4byte	0x1338f
+	.4byte	0x13395
 	.4byte	.LLST49
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x5f
-	.4byte	0x133a5
+	.4byte	0x133ab
 	.4byte	.LLST50
 	.uleb128 0x5f
-	.4byte	0x133b0
+	.4byte	0x133b6
 	.4byte	.LLST51
 	.uleb128 0x70
-	.4byte	0x137d3
+	.4byte	0x137d9
 	.8byte	.LBB1073
 	.8byte	.LBE1073-.LBB1073
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10e3c
+	.4byte	0x10e42
 	.uleb128 0x56
 	.8byte	.LBB1074
 	.8byte	.LBE1074-.LBB1074
 	.uleb128 0x5f
-	.4byte	0x137e3
+	.4byte	0x137e9
 	.4byte	.LLST52
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1075
 	.8byte	.LBE1075-.LBB1075
-	.4byte	0x10e90
+	.4byte	0x10e96
 	.uleb128 0x57
-	.4byte	0x133bc
+	.4byte	0x133c2
 	.uleb128 0x5b
-	.4byte	0x13857
+	.4byte	0x1385d
 	.8byte	.LBB1076
 	.8byte	.LBE1076-.LBB1076
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13872
+	.4byte	0x13878
 	.uleb128 0x54
-	.4byte	0x13867
+	.4byte	0x1386d
 	.uleb128 0x56
 	.8byte	.LBB1077
 	.8byte	.LBE1077-.LBB1077
 	.uleb128 0x57
-	.4byte	0x1387d
+	.4byte	0x13883
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x137a7
+	.4byte	0x137ad
 	.8byte	.LBB1078
 	.8byte	.LBE1078-.LBB1078
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x137c1
+	.4byte	0x137c7
 	.uleb128 0x54
-	.4byte	0x137b7
+	.4byte	0x137bd
 	.uleb128 0x5b
-	.4byte	0x13889
+	.4byte	0x1388f
 	.8byte	.LBB1079
 	.8byte	.LBE1079-.LBB1079
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x138a3
+	.4byte	0x138a9
 	.uleb128 0x54
-	.4byte	0x13899
+	.4byte	0x1389f
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x1334b
+	.4byte	0x13351
 	.8byte	.LBB1085
 	.8byte	.LBE1085-.LBB1085
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10f91
+	.4byte	0x10f97
 	.uleb128 0x54
-	.4byte	0x1335b
+	.4byte	0x13361
 	.uleb128 0x56
 	.8byte	.LBB1086
 	.8byte	.LBE1086-.LBB1086
 	.uleb128 0x5f
-	.4byte	0x13366
+	.4byte	0x1336c
 	.4byte	.LLST53
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x420
-	.4byte	0x10f5c
+	.4byte	0x10f62
 	.uleb128 0x5f
-	.4byte	0x13372
+	.4byte	0x13378
 	.4byte	.LLST54
 	.uleb128 0x5b
-	.4byte	0x13857
+	.4byte	0x1385d
 	.8byte	.LBB1088
 	.8byte	.LBE1088-.LBB1088
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13872
+	.4byte	0x13878
 	.uleb128 0x54
-	.4byte	0x13867
+	.4byte	0x1386d
 	.uleb128 0x56
 	.8byte	.LBB1089
 	.8byte	.LBE1089-.LBB1089
 	.uleb128 0x57
-	.4byte	0x1387d
+	.4byte	0x13883
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x137d3
+	.4byte	0x137d9
 	.8byte	.LBB1090
 	.8byte	.LBE1090-.LBB1090
 	.byte	0x6
@@ -41652,7 +41656,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1091
 	.8byte	.LBE1091-.LBB1091
 	.uleb128 0x5f
-	.4byte	0x137e3
+	.4byte	0x137e9
 	.4byte	.LLST55
 	.byte	0
 	.byte	0
@@ -41660,59 +41664,59 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL179
-	.4byte	0x14413
+	.4byte	0x14419
 	.uleb128 0x4e
 	.8byte	.LVL257
-	.4byte	0x14250
+	.4byte	0x14256
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13284
+	.4byte	0x1328a
 	.8byte	.LBB1104
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
-	.2byte	0x74d
-	.4byte	0x11060
+	.2byte	0x751
+	.4byte	0x11066
 	.uleb128 0x54
-	.4byte	0x132a9
+	.4byte	0x132af
 	.uleb128 0x54
-	.4byte	0x1329e
+	.4byte	0x132a4
 	.uleb128 0x54
-	.4byte	0x13294
+	.4byte	0x1329a
 	.uleb128 0x6d
-	.4byte	0x132e2
+	.4byte	0x132e8
 	.8byte	.LBB1105
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x13307
+	.4byte	0x1330d
 	.uleb128 0x54
-	.4byte	0x132fc
+	.4byte	0x13302
 	.uleb128 0x54
-	.4byte	0x132f2
+	.4byte	0x132f8
 	.uleb128 0x6d
-	.4byte	0x1337f
+	.4byte	0x13385
 	.8byte	.LBB1107
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x54
-	.4byte	0x1339a
+	.4byte	0x133a0
 	.uleb128 0x71
-	.4byte	0x1338f
+	.4byte	0x13395
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x4b0
 	.uleb128 0x57
-	.4byte	0x133a5
+	.4byte	0x133ab
 	.uleb128 0x5f
-	.4byte	0x133b0
+	.4byte	0x133b6
 	.4byte	.LLST56
 	.uleb128 0x5b
-	.4byte	0x137d3
+	.4byte	0x137d9
 	.8byte	.LBB1109
 	.8byte	.LBE1109-.LBB1109
 	.byte	0x6
@@ -41721,7 +41725,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1110
 	.8byte	.LBE1110-.LBB1110
 	.uleb128 0x5f
-	.4byte	0x137e3
+	.4byte	0x137e9
 	.4byte	.LLST57
 	.byte	0
 	.byte	0
@@ -41730,154 +41734,154 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13284
+	.4byte	0x1328a
 	.8byte	.LBB1116
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
-	.2byte	0x73d
-	.4byte	0x11280
+	.2byte	0x741
+	.4byte	0x11286
 	.uleb128 0x54
-	.4byte	0x132a9
+	.4byte	0x132af
 	.uleb128 0x54
-	.4byte	0x1329e
+	.4byte	0x132a4
 	.uleb128 0x54
-	.4byte	0x13294
+	.4byte	0x1329a
 	.uleb128 0x6d
-	.4byte	0x132e2
+	.4byte	0x132e8
 	.8byte	.LBB1117
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x13307
+	.4byte	0x1330d
 	.uleb128 0x54
-	.4byte	0x132fc
+	.4byte	0x13302
 	.uleb128 0x54
-	.4byte	0x132f2
+	.4byte	0x132f8
 	.uleb128 0x6e
-	.4byte	0x1337f
+	.4byte	0x13385
 	.8byte	.LBB1119
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x111b6
+	.4byte	0x111bc
 	.uleb128 0x54
-	.4byte	0x1339a
+	.4byte	0x133a0
 	.uleb128 0x6f
-	.4byte	0x1338f
+	.4byte	0x13395
 	.4byte	.LLST58
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x540
 	.uleb128 0x5f
-	.4byte	0x133a5
+	.4byte	0x133ab
 	.4byte	.LLST59
 	.uleb128 0x5f
-	.4byte	0x133b0
+	.4byte	0x133b6
 	.4byte	.LLST60
 	.uleb128 0x70
-	.4byte	0x137d3
+	.4byte	0x137d9
 	.8byte	.LBB1121
 	.8byte	.LBE1121-.LBB1121
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x1111c
+	.4byte	0x11122
 	.uleb128 0x56
 	.8byte	.LBB1122
 	.8byte	.LBE1122-.LBB1122
 	.uleb128 0x5f
-	.4byte	0x137e3
+	.4byte	0x137e9
 	.4byte	.LLST61
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1123
 	.8byte	.LBE1123-.LBB1123
-	.4byte	0x11170
+	.4byte	0x11176
 	.uleb128 0x57
-	.4byte	0x133bc
+	.4byte	0x133c2
 	.uleb128 0x5b
-	.4byte	0x13857
+	.4byte	0x1385d
 	.8byte	.LBB1124
 	.8byte	.LBE1124-.LBB1124
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13872
+	.4byte	0x13878
 	.uleb128 0x54
-	.4byte	0x13867
+	.4byte	0x1386d
 	.uleb128 0x56
 	.8byte	.LBB1125
 	.8byte	.LBE1125-.LBB1125
 	.uleb128 0x57
-	.4byte	0x1387d
+	.4byte	0x13883
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x137a7
+	.4byte	0x137ad
 	.8byte	.LBB1126
 	.8byte	.LBE1126-.LBB1126
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x137c1
+	.4byte	0x137c7
 	.uleb128 0x54
-	.4byte	0x137b7
+	.4byte	0x137bd
 	.uleb128 0x5b
-	.4byte	0x13889
+	.4byte	0x1388f
 	.8byte	.LBB1127
 	.8byte	.LBE1127-.LBB1127
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x138a3
+	.4byte	0x138a9
 	.uleb128 0x54
-	.4byte	0x13899
+	.4byte	0x1389f
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x1334b
+	.4byte	0x13351
 	.8byte	.LBB1135
 	.8byte	.LBE1135-.LBB1135
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x11271
+	.4byte	0x11277
 	.uleb128 0x54
-	.4byte	0x1335b
+	.4byte	0x13361
 	.uleb128 0x56
 	.8byte	.LBB1136
 	.8byte	.LBE1136-.LBB1136
 	.uleb128 0x5f
-	.4byte	0x13366
+	.4byte	0x1336c
 	.4byte	.LLST62
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x590
-	.4byte	0x1123c
+	.4byte	0x11242
 	.uleb128 0x5f
-	.4byte	0x13372
+	.4byte	0x13378
 	.4byte	.LLST63
 	.uleb128 0x5b
-	.4byte	0x13857
+	.4byte	0x1385d
 	.8byte	.LBB1138
 	.8byte	.LBE1138-.LBB1138
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13872
+	.4byte	0x13878
 	.uleb128 0x54
-	.4byte	0x13867
+	.4byte	0x1386d
 	.uleb128 0x56
 	.8byte	.LBB1139
 	.8byte	.LBE1139-.LBB1139
 	.uleb128 0x57
-	.4byte	0x1387d
+	.4byte	0x13883
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x137d3
+	.4byte	0x137d9
 	.8byte	.LBB1140
 	.8byte	.LBE1140-.LBB1140
 	.byte	0x6
@@ -41886,7 +41890,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1141
 	.8byte	.LBE1141-.LBB1141
 	.uleb128 0x5f
-	.4byte	0x137e3
+	.4byte	0x137e9
 	.4byte	.LLST64
 	.byte	0
 	.byte	0
@@ -41894,158 +41898,158 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL240
-	.4byte	0x14406
+	.4byte	0x1440c
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13284
+	.4byte	0x1328a
 	.8byte	.LBB1152
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
-	.2byte	0x6ef
-	.4byte	0x114a0
+	.2byte	0x6f3
+	.4byte	0x114a6
 	.uleb128 0x54
-	.4byte	0x132a9
+	.4byte	0x132af
 	.uleb128 0x54
-	.4byte	0x1329e
+	.4byte	0x132a4
 	.uleb128 0x54
-	.4byte	0x13294
+	.4byte	0x1329a
 	.uleb128 0x6d
-	.4byte	0x132e2
+	.4byte	0x132e8
 	.8byte	.LBB1153
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x13307
+	.4byte	0x1330d
 	.uleb128 0x54
-	.4byte	0x132fc
+	.4byte	0x13302
 	.uleb128 0x54
-	.4byte	0x132f2
+	.4byte	0x132f8
 	.uleb128 0x6e
-	.4byte	0x1337f
+	.4byte	0x13385
 	.8byte	.LBB1155
 	.4byte	.Ldebug_ranges0+0x620
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x113d6
+	.4byte	0x113dc
 	.uleb128 0x54
-	.4byte	0x1339a
+	.4byte	0x133a0
 	.uleb128 0x6f
-	.4byte	0x1338f
+	.4byte	0x13395
 	.4byte	.LLST65
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x620
 	.uleb128 0x5f
-	.4byte	0x133a5
+	.4byte	0x133ab
 	.4byte	.LLST66
 	.uleb128 0x5f
-	.4byte	0x133b0
+	.4byte	0x133b6
 	.4byte	.LLST67
 	.uleb128 0x70
-	.4byte	0x137d3
+	.4byte	0x137d9
 	.8byte	.LBB1157
 	.8byte	.LBE1157-.LBB1157
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x1133c
+	.4byte	0x11342
 	.uleb128 0x56
 	.8byte	.LBB1158
 	.8byte	.LBE1158-.LBB1158
 	.uleb128 0x5f
-	.4byte	0x137e3
+	.4byte	0x137e9
 	.4byte	.LLST68
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1159
 	.8byte	.LBE1159-.LBB1159
-	.4byte	0x11390
+	.4byte	0x11396
 	.uleb128 0x57
-	.4byte	0x133bc
+	.4byte	0x133c2
 	.uleb128 0x5b
-	.4byte	0x13857
+	.4byte	0x1385d
 	.8byte	.LBB1160
 	.8byte	.LBE1160-.LBB1160
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13872
+	.4byte	0x13878
 	.uleb128 0x54
-	.4byte	0x13867
+	.4byte	0x1386d
 	.uleb128 0x56
 	.8byte	.LBB1161
 	.8byte	.LBE1161-.LBB1161
 	.uleb128 0x57
-	.4byte	0x1387d
+	.4byte	0x13883
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x137a7
+	.4byte	0x137ad
 	.8byte	.LBB1162
 	.8byte	.LBE1162-.LBB1162
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x137c1
+	.4byte	0x137c7
 	.uleb128 0x54
-	.4byte	0x137b7
+	.4byte	0x137bd
 	.uleb128 0x5b
-	.4byte	0x13889
+	.4byte	0x1388f
 	.8byte	.LBB1163
 	.8byte	.LBE1163-.LBB1163
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x138a3
+	.4byte	0x138a9
 	.uleb128 0x54
-	.4byte	0x13899
+	.4byte	0x1389f
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x1334b
+	.4byte	0x13351
 	.8byte	.LBB1171
 	.8byte	.LBE1171-.LBB1171
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x11491
+	.4byte	0x11497
 	.uleb128 0x54
-	.4byte	0x1335b
+	.4byte	0x13361
 	.uleb128 0x56
 	.8byte	.LBB1172
 	.8byte	.LBE1172-.LBB1172
 	.uleb128 0x5f
-	.4byte	0x13366
+	.4byte	0x1336c
 	.4byte	.LLST69
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x670
-	.4byte	0x1145c
+	.4byte	0x11462
 	.uleb128 0x5f
-	.4byte	0x13372
+	.4byte	0x13378
 	.4byte	.LLST70
 	.uleb128 0x5b
-	.4byte	0x13857
+	.4byte	0x1385d
 	.8byte	.LBB1174
 	.8byte	.LBE1174-.LBB1174
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13872
+	.4byte	0x13878
 	.uleb128 0x54
-	.4byte	0x13867
+	.4byte	0x1386d
 	.uleb128 0x56
 	.8byte	.LBB1175
 	.8byte	.LBE1175-.LBB1175
 	.uleb128 0x57
-	.4byte	0x1387d
+	.4byte	0x13883
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x137d3
+	.4byte	0x137d9
 	.8byte	.LBB1176
 	.8byte	.LBE1176-.LBB1176
 	.byte	0x6
@@ -42054,7 +42058,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1177
 	.8byte	.LBE1177-.LBB1177
 	.uleb128 0x5f
-	.4byte	0x137e3
+	.4byte	0x137e9
 	.4byte	.LLST71
 	.byte	0
 	.byte	0
@@ -42062,1382 +42066,1382 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL248
-	.4byte	0x14406
+	.4byte	0x1440c
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL81
-	.4byte	0x142d5
+	.4byte	0x142db
 	.uleb128 0x4e
 	.8byte	.LVL82
-	.4byte	0x1432b
+	.4byte	0x14331
 	.uleb128 0x4e
 	.8byte	.LVL83
-	.4byte	0x143bb
+	.4byte	0x143c1
 	.uleb128 0x4e
 	.8byte	.LVL94
-	.4byte	0x14420
+	.4byte	0x14426
 	.uleb128 0x4e
 	.8byte	.LVL97
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL100
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL117
-	.4byte	0x143bb
+	.4byte	0x143c1
 	.uleb128 0x4e
 	.8byte	.LVL118
-	.4byte	0x1442c
+	.4byte	0x14432
 	.uleb128 0x4e
 	.8byte	.LVL120
-	.4byte	0x142e1
+	.4byte	0x142e7
 	.uleb128 0x4e
 	.8byte	.LVL127
-	.4byte	0x142d5
+	.4byte	0x142db
 	.uleb128 0x4e
 	.8byte	.LVL141
-	.4byte	0x14438
+	.4byte	0x1443e
 	.uleb128 0x4e
 	.8byte	.LVL142
-	.4byte	0x142e1
+	.4byte	0x142e7
 	.uleb128 0x4e
 	.8byte	.LVL143
-	.4byte	0x14335
+	.4byte	0x1433b
 	.uleb128 0x4e
 	.8byte	.LVL153
-	.4byte	0x14444
+	.4byte	0x1444a
 	.uleb128 0x4e
 	.8byte	.LVL154
-	.4byte	0x143bb
+	.4byte	0x143c1
 	.uleb128 0x4e
 	.8byte	.LVL181
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL184
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL186
-	.4byte	0x142d5
+	.4byte	0x142db
 	.uleb128 0x4e
 	.8byte	.LVL188
-	.4byte	0x142d5
+	.4byte	0x142db
 	.uleb128 0x4e
 	.8byte	.LVL189
-	.4byte	0x1432b
+	.4byte	0x14331
 	.uleb128 0x4e
 	.8byte	.LVL190
-	.4byte	0x143bb
+	.4byte	0x143c1
 	.uleb128 0x4e
 	.8byte	.LVL203
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL206
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL208
-	.4byte	0x142d5
+	.4byte	0x142db
 	.uleb128 0x4e
 	.8byte	.LVL209
-	.4byte	0x143bb
+	.4byte	0x143c1
 	.uleb128 0x4e
 	.8byte	.LVL217
-	.4byte	0x14420
+	.4byte	0x14426
 	.uleb128 0x4e
 	.8byte	.LVL251
-	.4byte	0x14335
+	.4byte	0x1433b
 	.uleb128 0x4e
 	.8byte	.LVL258
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL259
-	.4byte	0x14373
+	.4byte	0x14379
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0x1162a
+	.4byte	0x11630
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xa
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x1161a
+	.4byte	0x11620
 	.uleb128 0x62
-	.4byte	.LASF3068
+	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0x676
+	.2byte	0x67a
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11659
+	.4byte	0x1165f
 	.uleb128 0x64
-	.4byte	.LASF2998
+	.4byte	.LASF2999
 	.byte	0x1
-	.2byte	0x676
-	.4byte	0xe13f
+	.2byte	0x67a
+	.4byte	0xe145
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x678
+	.2byte	0x67c
 	.4byte	0xa55b
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3070
+	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0x670
+	.2byte	0x674
 	.8byte	.LFB2829
 	.8byte	.LFE2829-.LFB2829
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11693
+	.4byte	0x11699
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x670
+	.2byte	0x674
 	.4byte	0x31bd
 	.4byte	.LLST72
 	.uleb128 0x4e
 	.8byte	.LVL272
-	.4byte	0x1208e
+	.4byte	0x12094
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3071
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x664
+	.2byte	0x668
 	.8byte	.LFB2828
 	.8byte	.LFE2828-.LFB2828
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x116f3
+	.4byte	0x116f9
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x664
+	.2byte	0x668
 	.4byte	0x31bd
 	.4byte	.LLST12
 	.uleb128 0x46
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
-	.2byte	0x666
-	.4byte	0xe742
+	.2byte	0x66a
+	.4byte	0xe748
 	.uleb128 0x5e
-	.4byte	0x13216
+	.4byte	0x1321c
 	.8byte	.LBB932
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.2byte	0x66a
+	.2byte	0x66e
 	.uleb128 0x54
-	.4byte	0x13222
+	.4byte	0x13228
 	.uleb128 0x4e
 	.8byte	.LVL71
-	.4byte	0x14450
+	.4byte	0x14456
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3072
+	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0x654
+	.2byte	0x658
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1171d
+	.4byte	0x11723
 	.uleb128 0x64
-	.4byte	.LASF2998
+	.4byte	.LASF2999
 	.byte	0x1
-	.2byte	0x654
-	.4byte	0xe13f
+	.2byte	0x658
+	.4byte	0xe145
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x656
-	.4byte	0xe418
+	.2byte	0x65a
+	.4byte	0xe41e
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3073
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x528
+	.2byte	0x52b
 	.4byte	0xc6
 	.8byte	.LFB2826
 	.8byte	.LFE2826-.LFB2826
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11eb6
+	.4byte	0x11ebc
 	.uleb128 0x51
 	.string	"ptr"
 	.byte	0x1
-	.2byte	0x528
+	.2byte	0x52b
 	.4byte	0x443
 	.4byte	.LLST183
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x52a
-	.4byte	0xe47d
+	.2byte	0x52d
+	.4byte	0xe483
 	.4byte	.LLST184
 	.uleb128 0x46
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
-	.2byte	0x52b
-	.4byte	0xe742
+	.2byte	0x52e
+	.4byte	0xe748
 	.uleb128 0x68
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x52c
-	.4byte	0xe418
+	.2byte	0x52f
+	.4byte	0xe41e
 	.4byte	.LLST185
 	.uleb128 0x59
-	.4byte	.LASF3074
+	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x52d
+	.2byte	0x530
 	.4byte	0xc6
 	.4byte	.LLST186
 	.uleb128 0x59
-	.4byte	.LASF2968
+	.4byte	.LASF2969
 	.byte	0x1
-	.2byte	0x52e
+	.2byte	0x531
 	.4byte	0xc6
 	.4byte	.LLST187
 	.uleb128 0x4c
-	.4byte	.LASF3075
+	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0x52f
+	.2byte	0x532
 	.4byte	0xd8d1
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -72
 	.uleb128 0x59
-	.4byte	.LASF3076
+	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x530
-	.4byte	0xe418
+	.2byte	0x533
+	.4byte	0xe41e
 	.4byte	.LLST188
 	.uleb128 0x6b
-	.4byte	.LASF3078
+	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0x624
+	.2byte	0x628
 	.8byte	.L792
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x1200
-	.4byte	0x1186d
+	.4byte	0x11873
 	.uleb128 0x46
-	.4byte	.LASF3065
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x56e
+	.2byte	0x571
 	.4byte	0xc6
 	.uleb128 0x56
 	.8byte	.LBB1831
 	.8byte	.LBE1831-.LBB1831
 	.uleb128 0x6b
-	.4byte	.LASF3077
+	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0x56e
+	.2byte	0x571
 	.8byte	.L775
 	.uleb128 0x4c
-	.4byte	.LASF3066
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x56e
+	.2byte	0x571
 	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3065
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x56e
+	.2byte	0x571
 	.4byte	0x194
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x1230
-	.4byte	0x11851
+	.4byte	0x11857
 	.uleb128 0x59
-	.4byte	.LASF3067
+	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x56e
+	.2byte	0x571
 	.4byte	0x194
 	.4byte	.LLST202
 	.uleb128 0x4e
 	.8byte	.LVL881
-	.4byte	0x143d4
+	.4byte	0x143da
 	.uleb128 0x4e
 	.8byte	.LVL882
-	.4byte	0x143e0
+	.4byte	0x143e6
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL879
-	.4byte	0x143ed
+	.4byte	0x143f3
 	.uleb128 0x4e
 	.8byte	.LVL883
-	.4byte	0x143f9
+	.4byte	0x143ff
 	.byte	0
 	.byte	0
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x11a0
-	.4byte	0x1190f
+	.4byte	0x11915
 	.uleb128 0x46
-	.4byte	.LASF3065
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x613
+	.2byte	0x617
 	.4byte	0xc6
 	.uleb128 0x56
 	.8byte	.LBB1827
 	.8byte	.LBE1827-.LBB1827
 	.uleb128 0x6b
-	.4byte	.LASF3077
+	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0x613
+	.2byte	0x617
 	.8byte	.L829
 	.uleb128 0x4c
-	.4byte	.LASF3066
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x613
+	.2byte	0x617
 	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3065
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x613
+	.2byte	0x617
 	.4byte	0x194
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x11d0
-	.4byte	0x118f3
+	.4byte	0x118f9
 	.uleb128 0x59
-	.4byte	.LASF3067
+	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x613
+	.2byte	0x617
 	.4byte	0x194
 	.4byte	.LLST201
 	.uleb128 0x4e
 	.8byte	.LVL872
-	.4byte	0x143d4
+	.4byte	0x143da
 	.uleb128 0x4e
 	.8byte	.LVL873
-	.4byte	0x143e0
+	.4byte	0x143e6
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL870
-	.4byte	0x143ed
+	.4byte	0x143f3
 	.uleb128 0x4e
 	.8byte	.LVL874
-	.4byte	0x143f9
+	.4byte	0x143ff
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1813
 	.8byte	.LBE1813-.LBB1813
-	.4byte	0x119c1
+	.4byte	0x119c7
 	.uleb128 0x46
-	.4byte	.LASF3065
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x640
+	.2byte	0x644
 	.4byte	0xc6
 	.uleb128 0x56
 	.8byte	.LBB1814
 	.8byte	.LBE1814-.LBB1814
 	.uleb128 0x72
-	.4byte	.LASF3077
+	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0x640
+	.2byte	0x644
 	.uleb128 0x4c
-	.4byte	.LASF3066
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x640
+	.2byte	0x644
 	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3065
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x640
+	.2byte	0x644
 	.4byte	0x194
 	.uleb128 0x6c
 	.8byte	.LBB1815
 	.8byte	.LBE1815-.LBB1815
-	.4byte	0x119a5
+	.4byte	0x119ab
 	.uleb128 0x59
-	.4byte	.LASF3067
+	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x640
+	.2byte	0x644
 	.4byte	0x194
 	.4byte	.LLST190
 	.uleb128 0x4e
 	.8byte	.LVL800
-	.4byte	0x143d4
+	.4byte	0x143da
 	.uleb128 0x4e
 	.8byte	.LVL801
-	.4byte	0x143e0
+	.4byte	0x143e6
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL798
-	.4byte	0x143ed
+	.4byte	0x143f3
 	.uleb128 0x4e
 	.8byte	.LVL802
-	.4byte	0x143f9
+	.4byte	0x143ff
 	.byte	0
 	.byte	0
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x1080
-	.4byte	0x11a57
+	.4byte	0x11a5d
 	.uleb128 0x46
-	.4byte	.LASF3065
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x64c
+	.2byte	0x650
 	.4byte	0xc6
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x1080
 	.uleb128 0x6b
-	.4byte	.LASF3077
+	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0x64c
+	.2byte	0x650
 	.8byte	.L845
 	.uleb128 0x4c
-	.4byte	.LASF3066
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x64c
+	.2byte	0x650
 	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3065
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x64c
+	.2byte	0x650
 	.4byte	0x194
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x10c0
-	.4byte	0x11a3b
+	.4byte	0x11a41
 	.uleb128 0x59
-	.4byte	.LASF3067
+	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x64c
+	.2byte	0x650
 	.4byte	0x194
 	.4byte	.LLST189
 	.uleb128 0x4e
 	.8byte	.LVL766
-	.4byte	0x143d4
+	.4byte	0x143da
 	.uleb128 0x4e
 	.8byte	.LVL767
-	.4byte	0x143e0
+	.4byte	0x143e6
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL764
-	.4byte	0x143ed
+	.4byte	0x143f3
 	.uleb128 0x4e
 	.8byte	.LVL768
-	.4byte	0x143f9
+	.4byte	0x143ff
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x11eb6
+	.4byte	0x11ebc
 	.8byte	.LBB1807
 	.4byte	.Ldebug_ranges0+0x1100
 	.byte	0x1
-	.2byte	0x5e8
-	.4byte	0x11aa8
+	.2byte	0x5ec
+	.4byte	0x11aae
 	.uleb128 0x54
-	.4byte	0x11edf
+	.4byte	0x11ee5
 	.uleb128 0x54
-	.4byte	0x11ed3
+	.4byte	0x11ed9
 	.uleb128 0x54
-	.4byte	0x11ec7
+	.4byte	0x11ecd
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x1100
 	.uleb128 0x57
-	.4byte	0x11eeb
+	.4byte	0x11ef1
 	.uleb128 0x57
-	.4byte	0x11ef5
+	.4byte	0x11efb
 	.uleb128 0x57
-	.4byte	0x11f01
+	.4byte	0x11f07
 	.uleb128 0x57
-	.4byte	0x11f0d
+	.4byte	0x11f13
 	.uleb128 0x57
-	.4byte	0x11f19
+	.4byte	0x11f1f
 	.uleb128 0x57
-	.4byte	0x11f25
+	.4byte	0x11f2b
 	.uleb128 0x73
-	.4byte	0x11f31
+	.4byte	0x11f37
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12f1c
+	.4byte	0x12f22
 	.8byte	.LBB1816
 	.8byte	.LBE1816-.LBB1816
 	.byte	0x1
-	.2byte	0x649
-	.4byte	0x11af3
+	.2byte	0x64d
+	.4byte	0x11af9
 	.uleb128 0x54
-	.4byte	0x12f37
+	.4byte	0x12f3d
 	.uleb128 0x54
-	.4byte	0x12f2c
+	.4byte	0x12f32
 	.uleb128 0x56
 	.8byte	.LBB1817
 	.8byte	.LBE1817-.LBB1817
 	.uleb128 0x57
-	.4byte	0x12f42
+	.4byte	0x12f48
 	.uleb128 0x4e
 	.8byte	.LVL803
-	.4byte	0x14064
+	.4byte	0x1406a
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12bc2
+	.4byte	0x12bc8
 	.8byte	.LBB1818
 	.4byte	.Ldebug_ranges0+0x1140
 	.byte	0x1
-	.2byte	0x58b
-	.4byte	0x11bb9
+	.2byte	0x58e
+	.4byte	0x11bbf
 	.uleb128 0x54
-	.4byte	0x12bff
+	.4byte	0x12c05
 	.uleb128 0x54
-	.4byte	0x12bff
+	.4byte	0x12c05
 	.uleb128 0x54
-	.4byte	0x12bff
+	.4byte	0x12c05
 	.uleb128 0x54
-	.4byte	0x12c0b
+	.4byte	0x12c11
 	.uleb128 0x54
-	.4byte	0x12bf3
+	.4byte	0x12bf9
 	.uleb128 0x54
-	.4byte	0x12be7
+	.4byte	0x12bed
 	.uleb128 0x54
-	.4byte	0x12bdb
+	.4byte	0x12be1
 	.uleb128 0x54
-	.4byte	0x12bcf
+	.4byte	0x12bd5
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x1140
 	.uleb128 0x57
-	.4byte	0x12c17
+	.4byte	0x12c1d
 	.uleb128 0x5f
-	.4byte	0x12c23
+	.4byte	0x12c29
 	.4byte	.LLST191
 	.uleb128 0x57
-	.4byte	0x12c2f
+	.4byte	0x12c35
 	.uleb128 0x5f
-	.4byte	0x12c3b
+	.4byte	0x12c41
 	.4byte	.LLST192
 	.uleb128 0x5f
-	.4byte	0x12c47
+	.4byte	0x12c4d
 	.4byte	.LLST193
 	.uleb128 0x57
-	.4byte	0x12c53
+	.4byte	0x12c59
 	.uleb128 0x57
-	.4byte	0x12c5f
+	.4byte	0x12c65
 	.uleb128 0x57
-	.4byte	0x12c6b
+	.4byte	0x12c71
 	.uleb128 0x5f
-	.4byte	0x12c77
+	.4byte	0x12c7d
 	.4byte	.LLST194
 	.uleb128 0x57
-	.4byte	0x12c83
+	.4byte	0x12c89
 	.uleb128 0x5f
-	.4byte	0x12c8f
+	.4byte	0x12c95
 	.4byte	.LLST195
 	.uleb128 0x60
-	.4byte	0x12c9b
+	.4byte	0x12ca1
 	.uleb128 0x1
 	.byte	0x5e
 	.uleb128 0x5f
-	.4byte	0x12ca5
+	.4byte	0x12cab
 	.4byte	.LLST196
 	.uleb128 0x5f
-	.4byte	0x12caf
+	.4byte	0x12cb5
 	.4byte	.LLST197
 	.uleb128 0x5f
-	.4byte	0x12cbb
+	.4byte	0x12cc1
 	.4byte	.LLST198
 	.uleb128 0x5f
-	.4byte	0x12cc7
+	.4byte	0x12ccd
 	.4byte	.LLST199
 	.uleb128 0x5f
-	.4byte	0x12cd3
+	.4byte	0x12cd9
 	.4byte	.LLST200
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12f1c
+	.4byte	0x12f22
 	.8byte	.LBB1838
 	.8byte	.LBE1838-.LBB1838
 	.byte	0x1
-	.2byte	0x535
-	.4byte	0x11c04
+	.2byte	0x538
+	.4byte	0x11c0a
 	.uleb128 0x54
-	.4byte	0x12f37
+	.4byte	0x12f3d
 	.uleb128 0x54
-	.4byte	0x12f2c
+	.4byte	0x12f32
 	.uleb128 0x56
 	.8byte	.LBB1839
 	.8byte	.LBE1839-.LBB1839
 	.uleb128 0x57
-	.4byte	0x12f42
+	.4byte	0x12f48
 	.uleb128 0x4e
 	.8byte	.LVL887
-	.4byte	0x14064
+	.4byte	0x1406a
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL751
-	.4byte	0x1445c
+	.4byte	0x14462
 	.uleb128 0x4e
 	.8byte	.LVL752
-	.4byte	0x14468
+	.4byte	0x1446e
 	.uleb128 0x4e
 	.8byte	.LVL753
-	.4byte	0x14420
+	.4byte	0x14426
 	.uleb128 0x4e
 	.8byte	.LVL771
-	.4byte	0x142c9
+	.4byte	0x142cf
 	.uleb128 0x4e
 	.8byte	.LVL772
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL773
-	.4byte	0x14474
+	.4byte	0x1447a
 	.uleb128 0x4e
 	.8byte	.LVL774
-	.4byte	0x1432b
+	.4byte	0x14331
 	.uleb128 0x4e
 	.8byte	.LVL775
-	.4byte	0x1432b
+	.4byte	0x14331
 	.uleb128 0x4e
 	.8byte	.LVL776
-	.4byte	0x14480
+	.4byte	0x14486
 	.uleb128 0x4e
 	.8byte	.LVL777
-	.4byte	0x11f3a
+	.4byte	0x11f40
 	.uleb128 0x4e
 	.8byte	.LVL779
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL780
-	.4byte	0x12328
+	.4byte	0x1232e
 	.uleb128 0x4e
 	.8byte	.LVL783
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL784
-	.4byte	0x14335
+	.4byte	0x1433b
 	.uleb128 0x4e
 	.8byte	.LVL785
-	.4byte	0x14468
+	.4byte	0x1446e
 	.uleb128 0x4e
 	.8byte	.LVL787
-	.4byte	0x14420
+	.4byte	0x14426
 	.uleb128 0x4e
 	.8byte	.LVL792
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL794
-	.4byte	0x11f3a
+	.4byte	0x11f40
 	.uleb128 0x4e
 	.8byte	.LVL795
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL797
-	.4byte	0x14468
+	.4byte	0x1446e
 	.uleb128 0x4e
 	.8byte	.LVL807
-	.4byte	0x14474
+	.4byte	0x1447a
 	.uleb128 0x4e
 	.8byte	.LVL808
-	.4byte	0x1432b
+	.4byte	0x14331
 	.uleb128 0x4e
 	.8byte	.LVL809
-	.4byte	0x14468
+	.4byte	0x1446e
 	.uleb128 0x4e
 	.8byte	.LVL810
-	.4byte	0x14420
+	.4byte	0x14426
 	.uleb128 0x4e
 	.8byte	.LVL811
-	.4byte	0x12e37
+	.4byte	0x12e3d
 	.uleb128 0x4e
 	.8byte	.LVL812
-	.4byte	0x14480
+	.4byte	0x14486
 	.uleb128 0x4e
 	.8byte	.LVL813
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL814
-	.4byte	0x12328
+	.4byte	0x1232e
 	.uleb128 0x4e
 	.8byte	.LVL815
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL834
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL835
-	.4byte	0x12328
+	.4byte	0x1232e
 	.uleb128 0x4e
 	.8byte	.LVL836
-	.4byte	0x142c9
+	.4byte	0x142cf
 	.uleb128 0x4e
 	.8byte	.LVL839
-	.4byte	0x142c9
+	.4byte	0x142cf
 	.uleb128 0x4e
 	.8byte	.LVL841
-	.4byte	0x14122
+	.4byte	0x14128
 	.uleb128 0x4e
 	.8byte	.LVL842
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL845
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL852
-	.4byte	0x11f3a
+	.4byte	0x11f40
 	.uleb128 0x4e
 	.8byte	.LVL856
-	.4byte	0x1448c
+	.4byte	0x14492
 	.uleb128 0x4e
 	.8byte	.LVL857
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL860
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL861
-	.4byte	0x1448c
+	.4byte	0x14492
 	.uleb128 0x4e
 	.8byte	.LVL862
-	.4byte	0x14335
+	.4byte	0x1433b
 	.uleb128 0x4e
 	.8byte	.LVL863
-	.4byte	0x1432b
+	.4byte	0x14331
 	.uleb128 0x4e
 	.8byte	.LVL864
-	.4byte	0x1432b
+	.4byte	0x14331
 	.uleb128 0x4e
 	.8byte	.LVL865
-	.4byte	0x1432b
+	.4byte	0x14331
 	.uleb128 0x4e
 	.8byte	.LVL868
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL869
-	.4byte	0x12d70
+	.4byte	0x12d76
 	.uleb128 0x4e
 	.8byte	.LVL876
-	.4byte	0x14122
+	.4byte	0x14128
 	.uleb128 0x4e
 	.8byte	.LVL885
-	.4byte	0x1432b
+	.4byte	0x14331
 	.uleb128 0x4e
 	.8byte	.LVL889
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL890
-	.4byte	0x14122
+	.4byte	0x14128
 	.uleb128 0x4e
 	.8byte	.LVL891
-	.4byte	0x14122
+	.4byte	0x14128
 	.uleb128 0x4e
 	.8byte	.LVL893
-	.4byte	0x14373
+	.4byte	0x14379
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3079
+	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0x511
+	.2byte	0x514
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11f3a
+	.4byte	0x11f40
 	.uleb128 0x64
-	.4byte	.LASF3080
+	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0x511
+	.2byte	0x514
 	.4byte	0x4669
 	.uleb128 0x64
-	.4byte	.LASF3081
+	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0x511
+	.2byte	0x514
 	.4byte	0x4669
 	.uleb128 0x64
-	.4byte	.LASF3082
+	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0x511
+	.2byte	0x514
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x513
+	.2byte	0x516
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3083
+	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0x514
+	.2byte	0x517
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3084
+	.4byte	.LASF3085
 	.byte	0x1
-	.2byte	0x514
+	.2byte	0x517
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3085
+	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0x515
+	.2byte	0x518
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3086
+	.4byte	.LASF3087
 	.byte	0x1
-	.2byte	0x516
+	.2byte	0x519
 	.4byte	0x466f
 	.uleb128 0x46
-	.4byte	.LASF3087
+	.4byte	.LASF3088
 	.byte	0x1
-	.2byte	0x517
+	.2byte	0x51a
 	.4byte	0x466f
 	.uleb128 0x72
-	.4byte	.LASF3088
+	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x524
+	.2byte	0x527
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3089
+	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x4b7
+	.2byte	0x4b9
 	.4byte	0xc6
 	.8byte	.LFB2824
 	.8byte	.LFE2824-.LFB2824
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1208e
+	.4byte	0x12094
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x4b7
-	.4byte	0xe47d
+	.2byte	0x4b9
+	.4byte	0xe483
 	.4byte	.LLST73
 	.uleb128 0x46
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
-	.2byte	0x4b9
-	.4byte	0xe742
+	.2byte	0x4bb
+	.4byte	0xe748
 	.uleb128 0x59
-	.4byte	.LASF3090
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x4ba
+	.2byte	0x4bc
 	.4byte	0xc6
 	.4byte	.LLST74
 	.uleb128 0x69
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x4bb
+	.2byte	0x4bd
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x64
 	.uleb128 0x53
-	.4byte	0x13191
+	.4byte	0x13197
 	.8byte	.LBB1206
 	.8byte	.LBE1206-.LBB1206
 	.byte	0x1
-	.2byte	0x4be
-	.4byte	0x11fbd
+	.2byte	0x4c0
+	.4byte	0x11fc3
 	.uleb128 0x54
-	.4byte	0x131ac
+	.4byte	0x131b2
 	.uleb128 0x54
-	.4byte	0x131a1
+	.4byte	0x131a7
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL278
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL279
-	.4byte	0x14498
+	.4byte	0x1449e
 	.uleb128 0x4e
 	.8byte	.LVL283
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL284
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL286
-	.4byte	0x14498
+	.4byte	0x1449e
 	.uleb128 0x4e
 	.8byte	.LVL287
-	.4byte	0x14266
+	.4byte	0x1426c
 	.uleb128 0x4e
 	.8byte	.LVL288
-	.4byte	0x14498
+	.4byte	0x1449e
 	.uleb128 0x4e
 	.8byte	.LVL289
-	.4byte	0x14498
+	.4byte	0x1449e
 	.uleb128 0x4e
 	.8byte	.LVL290
-	.4byte	0x14498
+	.4byte	0x1449e
 	.uleb128 0x4e
 	.8byte	.LVL291
-	.4byte	0x14498
+	.4byte	0x1449e
 	.uleb128 0x4e
 	.8byte	.LVL292
-	.4byte	0x14498
+	.4byte	0x1449e
 	.uleb128 0x4e
 	.8byte	.LVL293
-	.4byte	0x14498
+	.4byte	0x1449e
 	.uleb128 0x4e
 	.8byte	.LVL294
-	.4byte	0x14498
+	.4byte	0x1449e
 	.uleb128 0x4e
 	.8byte	.LVL295
-	.4byte	0x14498
+	.4byte	0x1449e
 	.uleb128 0x4e
 	.8byte	.LVL296
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL297
-	.4byte	0x14373
+	.4byte	0x14379
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3091
+	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x492
+	.2byte	0x494
 	.8byte	.LFB2823
 	.8byte	.LFE2823-.LFB2823
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12147
+	.4byte	0x1214d
 	.uleb128 0x46
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
-	.2byte	0x494
-	.4byte	0xe742
+	.2byte	0x496
+	.4byte	0xe748
 	.uleb128 0x46
-	.4byte	.LASF2998
+	.4byte	.LASF2999
 	.byte	0x1
-	.2byte	0x495
-	.4byte	0xe13f
+	.2byte	0x497
+	.4byte	0xe145
 	.uleb128 0x4e
 	.8byte	.LVL261
-	.4byte	0x14297
+	.4byte	0x1429d
 	.uleb128 0x4e
 	.8byte	.LVL262
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL263
-	.4byte	0x14335
+	.4byte	0x1433b
 	.uleb128 0x4e
 	.8byte	.LVL264
-	.4byte	0x14335
+	.4byte	0x1433b
 	.uleb128 0x4e
 	.8byte	.LVL265
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL266
-	.4byte	0x14250
+	.4byte	0x14256
 	.uleb128 0x4e
 	.8byte	.LVL267
-	.4byte	0x142c9
+	.4byte	0x142cf
 	.uleb128 0x4e
 	.8byte	.LVL268
-	.4byte	0x14335
+	.4byte	0x1433b
 	.uleb128 0x4e
 	.8byte	.LVL269
-	.4byte	0x14335
+	.4byte	0x1433b
 	.uleb128 0x4e
 	.8byte	.LVL270
-	.4byte	0x14297
+	.4byte	0x1429d
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3092
+	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x44b
+	.2byte	0x44c
 	.4byte	0xc6
 	.8byte	.LFB2822
 	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12318
+	.4byte	0x1231e
 	.uleb128 0x58
 	.4byte	.LASF793
 	.byte	0x1
-	.2byte	0x44b
+	.2byte	0x44c
 	.4byte	0x443
 	.4byte	.LLST143
 	.uleb128 0x69
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x44d
-	.4byte	0xe47d
+	.2byte	0x44e
+	.4byte	0xe483
 	.uleb128 0x1
 	.byte	0x66
 	.uleb128 0x46
-	.4byte	.LASF2998
+	.4byte	.LASF2999
 	.byte	0x1
-	.2byte	0x44e
-	.4byte	0xe13f
+	.2byte	0x44f
+	.4byte	0xe145
 	.uleb128 0x46
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
-	.2byte	0x44f
-	.4byte	0xe742
+	.2byte	0x450
+	.4byte	0xe748
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xb30
-	.4byte	0x12231
+	.4byte	0x12237
 	.uleb128 0x3f
 	.byte	0x8
 	.byte	0x1
-	.2byte	0x456
-	.4byte	0x121ca
+	.2byte	0x457
+	.4byte	0x121d0
 	.uleb128 0x41
-	.4byte	.LASF3093
+	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x456
+	.2byte	0x457
 	.4byte	0x19b
 	.uleb128 0x3d
 	.string	"__c"
 	.byte	0x1
-	.2byte	0x456
-	.4byte	0x12318
+	.2byte	0x457
+	.4byte	0x1231e
 	.byte	0
 	.uleb128 0x52
 	.string	"__u"
 	.byte	0x1
-	.2byte	0x456
-	.4byte	0x121a8
+	.2byte	0x457
+	.4byte	0x121ae
 	.uleb128 0x5a
-	.4byte	0x13973
+	.4byte	0x13979
 	.8byte	.LBB1390
 	.4byte	.Ldebug_ranges0+0xb70
 	.byte	0x1
-	.2byte	0x456
-	.4byte	0x121fe
+	.2byte	0x457
+	.4byte	0x12204
 	.uleb128 0x54
-	.4byte	0x13996
+	.4byte	0x1399c
 	.uleb128 0x54
-	.4byte	0x1398a
+	.4byte	0x13990
 	.uleb128 0x54
-	.4byte	0x13980
+	.4byte	0x13986
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x137d3
+	.4byte	0x137d9
 	.8byte	.LBB1393
 	.8byte	.LBE1393-.LBB1393
 	.byte	0x1
-	.2byte	0x456
+	.2byte	0x457
 	.uleb128 0x56
 	.8byte	.LBB1394
 	.8byte	.LBE1394-.LBB1394
 	.uleb128 0x60
-	.4byte	0x137e3
+	.4byte	0x137e9
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x1366d
+	.4byte	0x13673
 	.8byte	.LBB1398
 	.4byte	.Ldebug_ranges0+0xba0
 	.byte	0x1
-	.2byte	0x489
-	.4byte	0x12288
+	.2byte	0x48b
+	.4byte	0x1228e
 	.uleb128 0x54
-	.4byte	0x1367e
+	.4byte	0x13684
 	.uleb128 0x5e
-	.4byte	0x1368b
+	.4byte	0x13691
 	.8byte	.LBB1400
 	.4byte	.Ldebug_ranges0+0xbd0
 	.byte	0xd
 	.2byte	0x240
 	.uleb128 0x54
-	.4byte	0x136a7
+	.4byte	0x136ad
 	.uleb128 0x54
-	.4byte	0x1369c
+	.4byte	0x136a2
 	.uleb128 0x4e
 	.8byte	.LVL495
-	.4byte	0x144a4
+	.4byte	0x144aa
 	.uleb128 0x4e
 	.8byte	.LVL500
-	.4byte	0x144a4
+	.4byte	0x144aa
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL488
-	.4byte	0x13f61
+	.4byte	0x13f67
 	.uleb128 0x4e
 	.8byte	.LVL489
-	.4byte	0x12a67
+	.4byte	0x12a6d
 	.uleb128 0x4e
 	.8byte	.LVL490
-	.4byte	0x144b1
+	.4byte	0x144b7
 	.uleb128 0x4e
 	.8byte	.LVL491
-	.4byte	0x143d4
+	.4byte	0x143da
 	.uleb128 0x4e
 	.8byte	.LVL492
-	.4byte	0x144bb
+	.4byte	0x144c1
 	.uleb128 0x4e
 	.8byte	.LVL493
-	.4byte	0x13f61
+	.4byte	0x13f67
 	.uleb128 0x4e
 	.8byte	.LVL494
-	.4byte	0x12532
+	.4byte	0x12538
 	.uleb128 0x4e
 	.8byte	.LVL496
-	.4byte	0x13f61
+	.4byte	0x13f67
 	.uleb128 0x4e
 	.8byte	.LVL497
-	.4byte	0x1271c
+	.4byte	0x12722
 	.uleb128 0x4e
 	.8byte	.LVL498
-	.4byte	0x13f61
+	.4byte	0x13f67
 	.uleb128 0x4e
 	.8byte	.LVL499
-	.4byte	0x12906
+	.4byte	0x1290c
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x12328
+	.4byte	0x1232e
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3094
+	.4byte	.LASF3095
 	.byte	0x1
 	.2byte	0x3fa
 	.8byte	.LFB2821
 	.8byte	.LFE2821-.LFB2821
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x124d4
+	.4byte	0x124da
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x3fa
-	.4byte	0xe47d
+	.4byte	0xe483
 	.4byte	.LLST142
 	.uleb128 0x46
-	.4byte	.LASF2998
+	.4byte	.LASF2999
 	.byte	0x1
 	.2byte	0x3fc
-	.4byte	0xe13f
+	.4byte	0xe145
 	.uleb128 0x46
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
 	.2byte	0x3fd
-	.4byte	0xe742
+	.4byte	0xe748
 	.uleb128 0x55
-	.4byte	.LASF3024
+	.4byte	.LASF3025
 	.4byte	0xb92b
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34773
+	.8byte	__func__.34774
 	.uleb128 0x53
-	.4byte	0x124d4
+	.4byte	0x124da
 	.8byte	.LBB1381
 	.8byte	.LBE1381-.LBB1381
 	.byte	0x1
-	.2byte	0x432
-	.4byte	0x123b5
+	.2byte	0x433
+	.4byte	0x123bb
 	.uleb128 0x54
-	.4byte	0x124ed
+	.4byte	0x124f3
 	.uleb128 0x54
-	.4byte	0x124e1
+	.4byte	0x124e7
 	.uleb128 0x4e
 	.8byte	.LVL460
-	.4byte	0x13f61
+	.4byte	0x13f67
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x124d4
+	.4byte	0x124da
 	.8byte	.LBB1383
 	.8byte	.LBE1383-.LBB1383
 	.byte	0x1
 	.2byte	0x419
-	.4byte	0x123e9
+	.4byte	0x123ef
 	.uleb128 0x54
-	.4byte	0x124ed
+	.4byte	0x124f3
 	.uleb128 0x54
-	.4byte	0x124e1
+	.4byte	0x124e7
 	.uleb128 0x4e
 	.8byte	.LVL465
-	.4byte	0x13f61
+	.4byte	0x13f67
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x124d4
+	.4byte	0x124da
 	.8byte	.LBB1385
 	.8byte	.LBE1385-.LBB1385
 	.byte	0x1
 	.2byte	0x407
-	.4byte	0x1241d
+	.4byte	0x12423
 	.uleb128 0x54
-	.4byte	0x124ed
+	.4byte	0x124f3
 	.uleb128 0x54
-	.4byte	0x124e1
+	.4byte	0x124e7
 	.uleb128 0x4e
 	.8byte	.LVL470
-	.4byte	0x13f61
+	.4byte	0x13f67
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x124d4
+	.4byte	0x124da
 	.8byte	.LBB1387
 	.8byte	.LBE1387-.LBB1387
 	.byte	0x1
-	.2byte	0x43f
-	.4byte	0x12451
+	.2byte	0x440
+	.4byte	0x12457
 	.uleb128 0x54
-	.4byte	0x124ed
+	.4byte	0x124f3
 	.uleb128 0x54
-	.4byte	0x124e1
+	.4byte	0x124e7
 	.uleb128 0x4e
 	.8byte	.LVL475
-	.4byte	0x13f61
+	.4byte	0x13f67
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL459
-	.4byte	0x12532
+	.4byte	0x12538
 	.uleb128 0x4e
 	.8byte	.LVL461
-	.4byte	0x12532
+	.4byte	0x12538
 	.uleb128 0x4e
 	.8byte	.LVL464
-	.4byte	0x12a67
+	.4byte	0x12a6d
 	.uleb128 0x4e
 	.8byte	.LVL466
-	.4byte	0x12a67
+	.4byte	0x12a6d
 	.uleb128 0x4e
 	.8byte	.LVL469
-	.4byte	0x12906
+	.4byte	0x1290c
 	.uleb128 0x4e
 	.8byte	.LVL471
-	.4byte	0x12906
+	.4byte	0x1290c
 	.uleb128 0x4e
 	.8byte	.LVL474
-	.4byte	0x1271c
+	.4byte	0x12722
 	.uleb128 0x4e
 	.8byte	.LVL476
-	.4byte	0x1271c
+	.4byte	0x12722
 	.uleb128 0x4e
 	.8byte	.LVL479
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL482
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3096
+	.4byte	.LASF3097
 	.byte	0x1
 	.2byte	0x3f4
 	.byte	0x1
-	.4byte	0x124fa
+	.4byte	0x12500
 	.uleb128 0x64
-	.4byte	.LASF2998
+	.4byte	.LASF2999
 	.byte	0x1
 	.2byte	0x3f4
-	.4byte	0xe13f
+	.4byte	0xe145
 	.uleb128 0x64
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
 	.2byte	0x3f4
-	.4byte	0xe742
+	.4byte	0xe748
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3097
+	.4byte	.LASF3098
 	.byte	0x1
 	.2byte	0x3e9
 	.byte	0x1
-	.4byte	0x1252c
+	.4byte	0x12532
 	.uleb128 0x64
-	.4byte	.LASF2998
+	.4byte	.LASF2999
 	.byte	0x1
 	.2byte	0x3e9
-	.4byte	0xe13f
+	.4byte	0xe145
 	.uleb128 0x64
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
 	.2byte	0x3e9
-	.4byte	0xe742
+	.4byte	0xe748
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
 	.2byte	0x3eb
-	.4byte	0x1252c
+	.4byte	0x12532
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdec9
+	.4byte	0xdecf
 	.uleb128 0x65
-	.4byte	.LASF3098
+	.4byte	.LASF3099
 	.byte	0x1
 	.2byte	0x3df
 	.byte	0x1
-	.4byte	0x12570
+	.4byte	0x12576
 	.uleb128 0x64
-	.4byte	.LASF3099
+	.4byte	.LASF3100
 	.byte	0x1
 	.2byte	0x3df
 	.4byte	0xc0ad
 	.uleb128 0x64
-	.4byte	.LASF3100
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x3e0
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3101
+	.4byte	.LASF3102
 	.byte	0x1
 	.2byte	0x3e0
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
 	.2byte	0x3e1
-	.4byte	0xe742
+	.4byte	0xe748
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3102
+	.4byte	.LASF3103
 	.byte	0x1
 	.2byte	0x3b5
 	.byte	0x1
-	.4byte	0x12646
+	.4byte	0x1264c
 	.uleb128 0x64
-	.4byte	.LASF3099
+	.4byte	.LASF3100
 	.byte	0x1
 	.2byte	0x3b5
 	.4byte	0xc0ad
 	.uleb128 0x64
-	.4byte	.LASF3100
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x3b6
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3101
+	.4byte	.LASF3102
 	.byte	0x1
 	.2byte	0x3b6
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
 	.2byte	0x3b7
-	.4byte	0xe742
+	.4byte	0xe748
 	.uleb128 0x46
-	.4byte	.LASF2998
+	.4byte	.LASF2999
 	.byte	0x1
 	.2byte	0x3b9
-	.4byte	0xe13f
+	.4byte	0xe145
 	.uleb128 0x46
-	.4byte	.LASF3103
+	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x3ba
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3104
+	.4byte	.LASF3105
 	.byte	0x1
 	.2byte	0x3ba
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3105
+	.4byte	.LASF3106
 	.byte	0x1
 	.2byte	0x3ba
 	.4byte	0x466f
 	.uleb128 0x46
-	.4byte	.LASF3106
+	.4byte	.LASF3107
 	.byte	0x1
 	.2byte	0x3ba
 	.4byte	0x466f
 	.uleb128 0x46
-	.4byte	.LASF3107
+	.4byte	.LASF3108
 	.byte	0x1
 	.2byte	0x3bb
 	.4byte	0xc0ad
 	.uleb128 0x46
-	.4byte	.LASF2896
+	.4byte	.LASF2897
 	.byte	0x1
 	.2byte	0x3bc
 	.4byte	0xc6
@@ -43457,7 +43461,7 @@ __exitcall_ebc_exit:
 	.2byte	0x3bd
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3108
+	.4byte	.LASF3109
 	.byte	0x1
 	.2byte	0x3be
 	.4byte	0xc6
@@ -43467,69 +43471,69 @@ __exitcall_ebc_exit:
 	.2byte	0x3bf
 	.4byte	0xc0ad
 	.uleb128 0x46
-	.4byte	.LASF2942
+	.4byte	.LASF2943
 	.byte	0x1
 	.2byte	0x3c0
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3109
+	.4byte	.LASF3110
 	.byte	0x1
 	.2byte	0x38c
 	.byte	0x1
-	.4byte	0x1271c
+	.4byte	0x12722
 	.uleb128 0x64
-	.4byte	.LASF3099
+	.4byte	.LASF3100
 	.byte	0x1
 	.2byte	0x38c
 	.4byte	0xc0ad
 	.uleb128 0x64
-	.4byte	.LASF3100
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x38d
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3101
+	.4byte	.LASF3102
 	.byte	0x1
 	.2byte	0x38d
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
 	.2byte	0x38e
-	.4byte	0xe742
+	.4byte	0xe748
 	.uleb128 0x46
-	.4byte	.LASF2998
+	.4byte	.LASF2999
 	.byte	0x1
 	.2byte	0x390
-	.4byte	0xe13f
+	.4byte	0xe145
 	.uleb128 0x46
-	.4byte	.LASF3103
+	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x391
 	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3104
+	.4byte	.LASF3105
 	.byte	0x1
 	.2byte	0x391
 	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3105
+	.4byte	.LASF3106
 	.byte	0x1
 	.2byte	0x391
 	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3106
+	.4byte	.LASF3107
 	.byte	0x1
 	.2byte	0x391
 	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3107
+	.4byte	.LASF3108
 	.byte	0x1
 	.2byte	0x392
 	.4byte	0xc0ad
 	.uleb128 0x46
-	.4byte	.LASF2896
+	.4byte	.LASF2897
 	.byte	0x1
 	.2byte	0x393
 	.4byte	0xc6
@@ -43549,7 +43553,7 @@ __exitcall_ebc_exit:
 	.2byte	0x394
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3108
+	.4byte	.LASF3109
 	.byte	0x1
 	.2byte	0x395
 	.4byte	0xc6
@@ -43559,69 +43563,69 @@ __exitcall_ebc_exit:
 	.2byte	0x396
 	.4byte	0xc0ad
 	.uleb128 0x46
-	.4byte	.LASF2942
+	.4byte	.LASF2943
 	.byte	0x1
 	.2byte	0x397
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3110
+	.4byte	.LASF3111
 	.byte	0x1
 	.2byte	0x381
 	.byte	0x1
-	.4byte	0x1275a
+	.4byte	0x12760
 	.uleb128 0x64
-	.4byte	.LASF3099
+	.4byte	.LASF3100
 	.byte	0x1
 	.2byte	0x381
 	.4byte	0xc0ad
 	.uleb128 0x64
-	.4byte	.LASF3100
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x382
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3101
+	.4byte	.LASF3102
 	.byte	0x1
 	.2byte	0x382
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
 	.2byte	0x383
-	.4byte	0xe742
+	.4byte	0xe748
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3111
+	.4byte	.LASF3112
 	.byte	0x1
 	.2byte	0x35d
 	.byte	0x1
-	.4byte	0x12830
+	.4byte	0x12836
 	.uleb128 0x64
-	.4byte	.LASF3099
+	.4byte	.LASF3100
 	.byte	0x1
 	.2byte	0x35d
 	.4byte	0xc0ad
 	.uleb128 0x64
-	.4byte	.LASF3100
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x35e
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3101
+	.4byte	.LASF3102
 	.byte	0x1
 	.2byte	0x35e
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
 	.2byte	0x35f
-	.4byte	0xe742
+	.4byte	0xe748
 	.uleb128 0x46
-	.4byte	.LASF2998
+	.4byte	.LASF2999
 	.byte	0x1
 	.2byte	0x361
-	.4byte	0xe13f
+	.4byte	0xe145
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
@@ -43633,7 +43637,7 @@ __exitcall_ebc_exit:
 	.2byte	0x362
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2896
+	.4byte	.LASF2897
 	.byte	0x1
 	.2byte	0x363
 	.4byte	0xc6
@@ -43643,32 +43647,32 @@ __exitcall_ebc_exit:
 	.2byte	0x364
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3103
+	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x365
 	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3104
+	.4byte	.LASF3105
 	.byte	0x1
 	.2byte	0x365
 	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3105
+	.4byte	.LASF3106
 	.byte	0x1
 	.2byte	0x365
 	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3106
+	.4byte	.LASF3107
 	.byte	0x1
 	.2byte	0x365
 	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3107
+	.4byte	.LASF3108
 	.byte	0x1
 	.2byte	0x366
 	.4byte	0xc0ad
 	.uleb128 0x46
-	.4byte	.LASF3108
+	.4byte	.LASF3109
 	.byte	0x1
 	.2byte	0x367
 	.4byte	0xc6
@@ -43678,42 +43682,42 @@ __exitcall_ebc_exit:
 	.2byte	0x368
 	.4byte	0xc0ad
 	.uleb128 0x46
-	.4byte	.LASF2942
+	.4byte	.LASF2943
 	.byte	0x1
 	.2byte	0x369
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3112
+	.4byte	.LASF3113
 	.byte	0x1
 	.2byte	0x336
 	.byte	0x1
-	.4byte	0x12906
+	.4byte	0x1290c
 	.uleb128 0x64
-	.4byte	.LASF3099
+	.4byte	.LASF3100
 	.byte	0x1
 	.2byte	0x336
 	.4byte	0xc0ad
 	.uleb128 0x64
-	.4byte	.LASF3100
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x337
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3101
+	.4byte	.LASF3102
 	.byte	0x1
 	.2byte	0x337
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
 	.2byte	0x338
-	.4byte	0xe742
+	.4byte	0xe748
 	.uleb128 0x46
-	.4byte	.LASF2998
+	.4byte	.LASF2999
 	.byte	0x1
 	.2byte	0x33a
-	.4byte	0xe13f
+	.4byte	0xe145
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
@@ -43725,7 +43729,7 @@ __exitcall_ebc_exit:
 	.2byte	0x33b
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2896
+	.4byte	.LASF2897
 	.byte	0x1
 	.2byte	0x33c
 	.4byte	0xc6
@@ -43735,32 +43739,32 @@ __exitcall_ebc_exit:
 	.2byte	0x33d
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3103
+	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x33e
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3104
+	.4byte	.LASF3105
 	.byte	0x1
 	.2byte	0x33e
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3105
+	.4byte	.LASF3106
 	.byte	0x1
 	.2byte	0x33e
 	.4byte	0x466f
 	.uleb128 0x46
-	.4byte	.LASF3106
+	.4byte	.LASF3107
 	.byte	0x1
 	.2byte	0x33e
 	.4byte	0x466f
 	.uleb128 0x46
-	.4byte	.LASF3107
+	.4byte	.LASF3108
 	.byte	0x1
 	.2byte	0x33f
 	.4byte	0xc0ad
 	.uleb128 0x46
-	.4byte	.LASF3108
+	.4byte	.LASF3109
 	.byte	0x1
 	.2byte	0x340
 	.4byte	0xc6
@@ -43770,60 +43774,60 @@ __exitcall_ebc_exit:
 	.2byte	0x341
 	.4byte	0xc0ad
 	.uleb128 0x46
-	.4byte	.LASF2942
+	.4byte	.LASF2943
 	.byte	0x1
 	.2byte	0x342
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3113
+	.4byte	.LASF3114
 	.byte	0x1
 	.2byte	0x268
 	.8byte	.LFB2812
 	.8byte	.LFE2812-.LFB2812
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12a67
+	.4byte	0x12a6d
 	.uleb128 0x6a
-	.4byte	.LASF3099
+	.4byte	.LASF3100
 	.byte	0x1
 	.2byte	0x268
 	.4byte	0xc0ad
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6a
-	.4byte	.LASF3100
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x268
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x6a
-	.4byte	.LASF3101
+	.4byte	.LASF3102
 	.byte	0x1
 	.2byte	0x268
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x6a
-	.4byte	.LASF3114
+	.4byte	.LASF3115
 	.byte	0x1
 	.2byte	0x269
 	.4byte	0xc0ad
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x6a
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
 	.2byte	0x269
-	.4byte	0xe742
+	.4byte	0xe748
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x46
-	.4byte	.LASF2998
+	.4byte	.LASF2999
 	.byte	0x1
 	.2byte	0x26b
-	.4byte	0xe13f
+	.4byte	0xe145
 	.uleb128 0x69
 	.string	"i"
 	.byte	0x1
@@ -43837,7 +43841,7 @@ __exitcall_ebc_exit:
 	.2byte	0x26d
 	.4byte	0xc6
 	.uleb128 0x4c
-	.4byte	.LASF2896
+	.4byte	.LASF2897
 	.byte	0x1
 	.2byte	0x26e
 	.4byte	0xc6
@@ -43851,56 +43855,56 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x59
-	.4byte	.LASF3103
+	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x270
 	.4byte	0x13a
 	.4byte	.LLST6
 	.uleb128 0x59
-	.4byte	.LASF3104
+	.4byte	.LASF3105
 	.byte	0x1
 	.2byte	0x270
 	.4byte	0x13a
 	.4byte	.LLST7
 	.uleb128 0x46
-	.4byte	.LASF3115
+	.4byte	.LASF3116
 	.byte	0x1
 	.2byte	0x270
 	.4byte	0x13a
 	.uleb128 0x4c
-	.4byte	.LASF3105
+	.4byte	.LASF3106
 	.byte	0x1
 	.2byte	0x271
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4c
-	.4byte	.LASF3106
+	.4byte	.LASF3107
 	.byte	0x1
 	.2byte	0x271
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x59
-	.4byte	.LASF3107
+	.4byte	.LASF3108
 	.byte	0x1
 	.2byte	0x272
 	.4byte	0xc0ad
 	.4byte	.LLST8
 	.uleb128 0x46
-	.4byte	.LASF2964
+	.4byte	.LASF2965
 	.byte	0x1
 	.2byte	0x273
 	.4byte	0x10b
 	.uleb128 0x4c
-	.4byte	.LASF3116
+	.4byte	.LASF3117
 	.byte	0x1
 	.2byte	0x274
 	.4byte	0xc0ad
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x46
-	.4byte	.LASF3117
+	.4byte	.LASF3118
 	.byte	0x1
 	.2byte	0x275
 	.4byte	0x10b
@@ -43910,76 +43914,76 @@ __exitcall_ebc_exit:
 	.2byte	0x276
 	.4byte	0xc0ad
 	.uleb128 0x46
-	.4byte	.LASF2942
+	.4byte	.LASF2943
 	.byte	0x1
 	.2byte	0x277
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3118
+	.4byte	.LASF3119
 	.byte	0x1
 	.2byte	0x278
 	.4byte	0x10b
 	.uleb128 0x46
-	.4byte	.LASF3119
+	.4byte	.LASF3120
 	.byte	0x1
 	.2byte	0x278
 	.4byte	0x10b
 	.uleb128 0x59
-	.4byte	.LASF3120
+	.4byte	.LASF3121
 	.byte	0x1
 	.2byte	0x279
 	.4byte	0x13a
 	.4byte	.LLST9
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3121
+	.4byte	.LASF3122
 	.byte	0x1
 	.2byte	0x1c3
 	.8byte	.LFB2811
 	.8byte	.LFE2811-.LFB2811
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12bc2
+	.4byte	0x12bc8
 	.uleb128 0x6a
-	.4byte	.LASF3099
+	.4byte	.LASF3100
 	.byte	0x1
 	.2byte	0x1c3
 	.4byte	0xc0ad
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6a
-	.4byte	.LASF3100
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x1c3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x6a
-	.4byte	.LASF3101
+	.4byte	.LASF3102
 	.byte	0x1
 	.2byte	0x1c3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x6a
-	.4byte	.LASF3114
+	.4byte	.LASF3115
 	.byte	0x1
 	.2byte	0x1c4
 	.4byte	0xc0ad
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x6a
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
 	.2byte	0x1c4
-	.4byte	0xe742
+	.4byte	0xe748
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x46
-	.4byte	.LASF2998
+	.4byte	.LASF2999
 	.byte	0x1
 	.2byte	0x1c6
-	.4byte	0xe13f
+	.4byte	0xe145
 	.uleb128 0x68
 	.string	"i"
 	.byte	0x1
@@ -43992,7 +43996,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1c8
 	.4byte	0xc6
 	.uleb128 0x4c
-	.4byte	.LASF2896
+	.4byte	.LASF2897
 	.byte	0x1
 	.2byte	0x1c9
 	.4byte	0xc6
@@ -44005,53 +44009,53 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.4byte	.LLST1
 	.uleb128 0x59
-	.4byte	.LASF3103
+	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x1cb
 	.4byte	0x13a
 	.4byte	.LLST2
 	.uleb128 0x59
-	.4byte	.LASF3104
+	.4byte	.LASF3105
 	.byte	0x1
 	.2byte	0x1cb
 	.4byte	0x13a
 	.4byte	.LLST3
 	.uleb128 0x4c
-	.4byte	.LASF3105
+	.4byte	.LASF3106
 	.byte	0x1
 	.2byte	0x1cc
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4c
-	.4byte	.LASF3106
+	.4byte	.LASF3107
 	.byte	0x1
 	.2byte	0x1cc
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x59
-	.4byte	.LASF3107
+	.4byte	.LASF3108
 	.byte	0x1
 	.2byte	0x1cd
 	.4byte	0xc0ad
 	.4byte	.LLST4
 	.uleb128 0x4c
-	.4byte	.LASF2964
+	.4byte	.LASF2965
 	.byte	0x1
 	.2byte	0x1ce
 	.4byte	0x10b
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x4c
-	.4byte	.LASF3116
+	.4byte	.LASF3117
 	.byte	0x1
 	.2byte	0x1cf
 	.4byte	0xc0ad
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x46
-	.4byte	.LASF3117
+	.4byte	.LASF3118
 	.byte	0x1
 	.2byte	0x1d0
 	.4byte	0x10b
@@ -44061,65 +44065,65 @@ __exitcall_ebc_exit:
 	.2byte	0x1d1
 	.4byte	0xc0ad
 	.uleb128 0x46
-	.4byte	.LASF2942
+	.4byte	.LASF2943
 	.byte	0x1
 	.2byte	0x1d2
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3118
+	.4byte	.LASF3119
 	.byte	0x1
 	.2byte	0x1d3
 	.4byte	0x10b
 	.uleb128 0x46
-	.4byte	.LASF3119
+	.4byte	.LASF3120
 	.byte	0x1
 	.2byte	0x1d3
 	.4byte	0x10b
 	.uleb128 0x59
-	.4byte	.LASF3120
+	.4byte	.LASF3121
 	.byte	0x1
 	.2byte	0x1d4
 	.4byte	0x13a
 	.4byte	.LLST5
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3122
+	.4byte	.LASF3123
 	.byte	0x1
 	.2byte	0x164
 	.byte	0x1
-	.4byte	0x12ce0
+	.4byte	0x12ce6
 	.uleb128 0x64
-	.4byte	.LASF3123
+	.4byte	.LASF3124
 	.byte	0x1
 	.2byte	0x164
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3124
+	.4byte	.LASF3125
 	.byte	0x1
 	.2byte	0x164
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3125
+	.4byte	.LASF3126
 	.byte	0x1
 	.2byte	0x164
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3114
+	.4byte	.LASF3115
 	.byte	0x1
 	.2byte	0x164
 	.4byte	0x466f
 	.uleb128 0x64
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
 	.2byte	0x165
-	.4byte	0xe742
+	.4byte	0xe748
 	.uleb128 0x64
 	.4byte	.LASF2867
 	.byte	0x1
 	.2byte	0x165
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2896
+	.4byte	.LASF2897
 	.byte	0x1
 	.2byte	0x167
 	.4byte	0xc6
@@ -44129,47 +44133,47 @@ __exitcall_ebc_exit:
 	.2byte	0x167
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3126
+	.4byte	.LASF3127
 	.byte	0x1
 	.2byte	0x168
 	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3127
+	.4byte	.LASF3128
 	.byte	0x1
 	.2byte	0x168
 	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3128
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x168
 	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3129
+	.4byte	.LASF3130
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3130
+	.4byte	.LASF3131
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3131
+	.4byte	.LASF3132
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3117
+	.4byte	.LASF3118
 	.byte	0x1
 	.2byte	0x16a
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3116
+	.4byte	.LASF3117
 	.byte	0x1
 	.2byte	0x16b
 	.4byte	0x466f
 	.uleb128 0x46
-	.4byte	.LASF3132
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x16c
 	.4byte	0x13a
@@ -44205,14 +44209,14 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x74
-	.4byte	.LASF3133
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x14f
 	.8byte	.LFB2809
 	.8byte	.LFE2809-.LFB2809
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12d70
+	.4byte	0x12d76
 	.uleb128 0x58
 	.4byte	.LASF2273
 	.byte	0x1
@@ -44223,68 +44227,68 @@ __exitcall_ebc_exit:
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x151
-	.4byte	0xe47d
+	.4byte	0xe483
 	.4byte	.LLST181
 	.uleb128 0x59
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
 	.2byte	0x152
-	.4byte	0xe742
+	.4byte	0xe748
 	.4byte	.LLST182
 	.uleb128 0x4e
 	.8byte	.LVL736
-	.4byte	0x14474
+	.4byte	0x1447a
 	.uleb128 0x4e
 	.8byte	.LVL738
-	.4byte	0x12e37
+	.4byte	0x12e3d
 	.uleb128 0x4e
 	.8byte	.LVL739
-	.4byte	0x14480
+	.4byte	0x14486
 	.uleb128 0x4e
 	.8byte	.LVL742
-	.4byte	0x12d70
+	.4byte	0x12d76
 	.uleb128 0x4e
 	.8byte	.LVL743
-	.4byte	0x14480
+	.4byte	0x14486
 	.byte	0
 	.uleb128 0x74
-	.4byte	.LASF3134
+	.4byte	.LASF3135
 	.byte	0x1
 	.2byte	0x11e
 	.8byte	.LFB2808
 	.8byte	.LFE2808-.LFB2808
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12e37
+	.4byte	0x12e3d
 	.uleb128 0x6a
-	.4byte	.LASF3123
+	.4byte	.LASF3124
 	.byte	0x1
 	.2byte	0x11e
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6a
-	.4byte	.LASF3124
+	.4byte	.LASF3125
 	.byte	0x1
 	.2byte	0x11e
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x6a
-	.4byte	.LASF3114
+	.4byte	.LASF3115
 	.byte	0x1
 	.2byte	0x11e
 	.4byte	0x466f
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x58
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
 	.2byte	0x11f
-	.4byte	0xe742
+	.4byte	0xe748
 	.4byte	.LLST176
 	.uleb128 0x4c
-	.4byte	.LASF2896
+	.4byte	.LASF2897
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0xc6
@@ -44298,18 +44302,18 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x59
 	.uleb128 0x46
-	.4byte	.LASF3126
+	.4byte	.LASF3127
 	.byte	0x1
 	.2byte	0x122
 	.4byte	0x13a
 	.uleb128 0x59
-	.4byte	.LASF3127
+	.4byte	.LASF3128
 	.byte	0x1
 	.2byte	0x122
 	.4byte	0x13a
 	.4byte	.LLST177
 	.uleb128 0x59
-	.4byte	.LASF3117
+	.4byte	.LASF3118
 	.byte	0x1
 	.2byte	0x123
 	.4byte	0x155
@@ -44327,54 +44331,54 @@ __exitcall_ebc_exit:
 	.2byte	0x124
 	.4byte	0xc6
 	.uleb128 0x59
-	.4byte	.LASF3132
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x125
 	.4byte	0x13a
 	.4byte	.LLST179
 	.byte	0
 	.uleb128 0x75
-	.4byte	.LASF3135
+	.4byte	.LASF3136
 	.byte	0x1
 	.byte	0xd3
 	.8byte	.LFB2807
 	.8byte	.LFE2807-.LFB2807
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12f1c
+	.4byte	0x12f22
 	.uleb128 0x76
-	.4byte	.LASF3123
+	.4byte	.LASF3124
 	.byte	0x1
 	.byte	0xd3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x76
-	.4byte	.LASF3124
+	.4byte	.LASF3125
 	.byte	0x1
 	.byte	0xd3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x76
-	.4byte	.LASF3125
+	.4byte	.LASF3126
 	.byte	0x1
 	.byte	0xd3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x76
-	.4byte	.LASF3114
+	.4byte	.LASF3115
 	.byte	0x1
 	.byte	0xd3
 	.4byte	0x466f
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x77
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
 	.byte	0xd4
-	.4byte	0xe742
+	.4byte	0xe748
 	.4byte	.LLST170
 	.uleb128 0x77
 	.4byte	.LASF2867
@@ -44383,7 +44387,7 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.4byte	.LLST171
 	.uleb128 0x4b
-	.4byte	.LASF2896
+	.4byte	.LASF2897
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0xc6
@@ -44397,24 +44401,24 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x78
-	.4byte	.LASF3126
+	.4byte	.LASF3127
 	.byte	0x1
 	.byte	0xd7
 	.4byte	0x13a
 	.uleb128 0x79
-	.4byte	.LASF3127
+	.4byte	.LASF3128
 	.byte	0x1
 	.byte	0xd7
 	.4byte	0x13a
 	.4byte	.LLST172
 	.uleb128 0x79
-	.4byte	.LASF3128
+	.4byte	.LASF3129
 	.byte	0x1
 	.byte	0xd7
 	.4byte	0x13a
 	.4byte	.LLST173
 	.uleb128 0x79
-	.4byte	.LASF3117
+	.4byte	.LASF3118
 	.byte	0x1
 	.byte	0xd8
 	.4byte	0x155
@@ -44432,198 +44436,198 @@ __exitcall_ebc_exit:
 	.byte	0xd9
 	.4byte	0xc6
 	.uleb128 0x79
-	.4byte	.LASF3132
+	.4byte	.LASF3133
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x13a
 	.4byte	.LLST175
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3136
+	.4byte	.LASF3137
 	.byte	0x1
 	.byte	0xb4
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x12f4e
+	.4byte	0x12f54
 	.uleb128 0x7d
 	.string	"ebc"
 	.byte	0x1
 	.byte	0xb4
-	.4byte	0xe47d
+	.4byte	0xe483
 	.uleb128 0x7e
-	.4byte	.LASF3137
+	.4byte	.LASF3138
 	.byte	0x1
 	.byte	0xb4
 	.4byte	0xc6
 	.uleb128 0x78
-	.4byte	.LASF2957
+	.4byte	.LASF2958
 	.byte	0x1
 	.byte	0xb6
-	.4byte	0xe742
+	.4byte	0xe748
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3138
+	.4byte	.LASF3139
 	.byte	0x1
 	.byte	0x86
 	.4byte	0x10b
 	.byte	0x3
-	.4byte	0x12f96
+	.4byte	0x12f9c
 	.uleb128 0x7e
 	.4byte	.LASF2856
 	.byte	0x1
 	.byte	0x86
 	.4byte	0xc0ad
 	.uleb128 0x7e
-	.4byte	.LASF3103
+	.4byte	.LASF3104
 	.byte	0x1
 	.byte	0x86
 	.4byte	0x11a
 	.uleb128 0x7e
-	.4byte	.LASF3104
+	.4byte	.LASF3105
 	.byte	0x1
 	.byte	0x86
 	.4byte	0x11a
 	.uleb128 0x78
-	.4byte	.LASF3139
+	.4byte	.LASF3140
 	.byte	0x1
 	.byte	0x88
 	.4byte	0x10b
 	.uleb128 0x78
-	.4byte	.LASF3120
+	.4byte	.LASF3121
 	.byte	0x1
 	.byte	0x89
 	.4byte	0x11a
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3140
+	.4byte	.LASF3141
 	.byte	0x1
 	.byte	0x80
 	.4byte	0x10b
 	.byte	0x3
-	.4byte	0x12fc8
+	.4byte	0x12fce
 	.uleb128 0x7e
 	.4byte	.LASF2856
 	.byte	0x1
 	.byte	0x80
 	.4byte	0xc0ad
 	.uleb128 0x7e
-	.4byte	.LASF3103
+	.4byte	.LASF3104
 	.byte	0x1
 	.byte	0x80
 	.4byte	0x11a
 	.uleb128 0x7e
-	.4byte	.LASF3104
+	.4byte	.LASF3105
 	.byte	0x1
 	.byte	0x80
 	.4byte	0x11a
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3141
+	.4byte	.LASF3142
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x12feb
+	.4byte	0x12ff1
 	.uleb128 0x7e
-	.4byte	.LASF2932
+	.4byte	.LASF2933
 	.byte	0xb
 	.byte	0x4b
-	.4byte	0xe0ff
+	.4byte	0xe105
 	.uleb128 0x7e
-	.4byte	.LASF2964
+	.4byte	.LASF2965
 	.byte	0xb
 	.byte	0x4b
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3142
+	.4byte	.LASF3143
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x13019
+	.4byte	0x1301f
 	.uleb128 0x7e
-	.4byte	.LASF2932
+	.4byte	.LASF2933
 	.byte	0xb
 	.byte	0x3c
-	.4byte	0xe0ff
+	.4byte	0xe105
 	.uleb128 0x7e
-	.4byte	.LASF3143
+	.4byte	.LASF3144
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13a
 	.uleb128 0x7e
-	.4byte	.LASF3144
+	.4byte	.LASF3145
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13a
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3145
+	.4byte	.LASF3146
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x1305d
+	.4byte	0x13063
 	.uleb128 0x7e
-	.4byte	.LASF2932
+	.4byte	.LASF2933
 	.byte	0xb
 	.byte	0x36
-	.4byte	0xe0ff
+	.4byte	0xe105
 	.uleb128 0x7e
-	.4byte	.LASF3146
+	.4byte	.LASF3147
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF3147
+	.4byte	.LASF3148
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF3148
+	.4byte	.LASF3149
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF3149
+	.4byte	.LASF3150
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3150
+	.4byte	.LASF3151
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x13075
+	.4byte	0x1307b
 	.uleb128 0x7e
-	.4byte	.LASF2932
+	.4byte	.LASF2933
 	.byte	0xb
 	.byte	0x31
-	.4byte	0xe0ff
+	.4byte	0xe105
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3151
+	.4byte	.LASF3152
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1309c
+	.4byte	0x130a2
 	.uleb128 0x7e
-	.4byte	.LASF2932
+	.4byte	.LASF2933
 	.byte	0xb
 	.byte	0x2c
-	.4byte	0xe0ff
+	.4byte	0xe105
 	.uleb128 0x7e
-	.4byte	.LASF2998
+	.4byte	.LASF2999
 	.byte	0xb
 	.byte	0x2c
-	.4byte	0xe13f
+	.4byte	0xe145
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3152
+	.4byte	.LASF3153
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x130e6
+	.4byte	0x130ec
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa
@@ -44643,7 +44647,7 @@ __exitcall_ebc_exit:
 	.string	"dir"
 	.byte	0xa
 	.2byte	0x1ad
-	.4byte	0xdb65
+	.4byte	0xdb6b
 	.uleb128 0x52
 	.string	"ops"
 	.byte	0xa
@@ -44651,12 +44655,12 @@ __exitcall_ebc_exit:
 	.4byte	0xb7a4
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3153
+	.4byte	.LASF3154
 	.byte	0xa
 	.2byte	0x108
 	.4byte	0xb7a4
 	.byte	0x3
-	.4byte	0x13104
+	.4byte	0x1310a
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa
@@ -44664,12 +44668,12 @@ __exitcall_ebc_exit:
 	.4byte	0xa55b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3154
+	.4byte	.LASF3155
 	.byte	0xc8
 	.byte	0x1d
 	.4byte	0xb7a4
 	.byte	0x3
-	.4byte	0x13120
+	.4byte	0x13126
 	.uleb128 0x7d
 	.string	"bus"
 	.byte	0xc8
@@ -44677,31 +44681,31 @@ __exitcall_ebc_exit:
 	.4byte	0xadc2
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3155
+	.4byte	.LASF3156
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1313c
+	.4byte	0x13142
 	.uleb128 0x7e
-	.4byte	.LASF3156
+	.4byte	.LASF3157
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3157
+	.4byte	.LASF3158
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x13175
+	.4byte	0x1317b
 	.uleb128 0x7d
 	.string	"dev"
 	.byte	0xcb
 	.byte	0xa3
 	.4byte	0xa55b
 	.uleb128 0x7e
-	.4byte	.LASF3158
+	.4byte	.LASF3159
 	.byte	0xcb
 	.byte	0xa4
 	.4byte	0x310
@@ -44711,36 +44715,36 @@ __exitcall_ebc_exit:
 	.byte	0xa5
 	.4byte	0x2ce
 	.uleb128 0x7e
-	.4byte	.LASF3159
+	.4byte	.LASF3160
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3160
+	.4byte	.LASF3161
 	.byte	0x3
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13191
+	.4byte	0x13197
 	.uleb128 0x7e
-	.4byte	.LASF2933
+	.4byte	.LASF2934
 	.byte	0x3
 	.byte	0x35
-	.4byte	0xdaff
+	.4byte	0xdb05
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3161
+	.4byte	.LASF3162
 	.byte	0x3
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x131b6
+	.4byte	0x131bc
 	.uleb128 0x7e
-	.4byte	.LASF2933
+	.4byte	.LASF2934
 	.byte	0x3
 	.byte	0x30
-	.4byte	0xdaff
+	.4byte	0xdb05
 	.uleb128 0x7d
 	.string	"t"
 	.byte	0x3
@@ -44748,64 +44752,64 @@ __exitcall_ebc_exit:
 	.4byte	0x4669
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3162
+	.4byte	.LASF3163
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x131ce
+	.4byte	0x131d4
 	.uleb128 0x7e
-	.4byte	.LASF2933
+	.4byte	.LASF2934
 	.byte	0x3
 	.byte	0x2b
-	.4byte	0xdaff
+	.4byte	0xdb05
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3163
+	.4byte	.LASF3164
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x131e6
+	.4byte	0x131ec
 	.uleb128 0x7e
-	.4byte	.LASF2933
+	.4byte	.LASF2934
 	.byte	0x3
 	.byte	0x26
-	.4byte	0xdaff
+	.4byte	0xdb05
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3164
+	.4byte	.LASF3165
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x131fe
+	.4byte	0x13204
 	.uleb128 0x7e
-	.4byte	.LASF2933
+	.4byte	.LASF2934
 	.byte	0x3
 	.byte	0x21
-	.4byte	0xdaff
+	.4byte	0xdb05
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3165
+	.4byte	.LASF3166
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x13216
+	.4byte	0x1321c
 	.uleb128 0x7e
-	.4byte	.LASF2933
+	.4byte	.LASF2934
 	.byte	0x3
 	.byte	0x1c
-	.4byte	0xdaff
+	.4byte	0xdb05
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3166
+	.4byte	.LASF3167
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x1322e
+	.4byte	0x13234
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x1322e
+	.4byte	0x13234
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -44815,24 +44819,24 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x1324c
+	.4byte	0x13252
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x1322e
+	.4byte	0x13234
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3167
+	.4byte	.LASF3168
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x13284
+	.4byte	0x1328a
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x1322e
+	.4byte	0x13234
 	.uleb128 0x7e
 	.4byte	.LASF192
 	.byte	0x4
@@ -44850,12 +44854,12 @@ __exitcall_ebc_exit:
 	.4byte	0xacf8
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3168
+	.4byte	.LASF3169
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x132b3
+	.4byte	0x132b9
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -44873,12 +44877,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3169
+	.4byte	.LASF3170
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x132e2
+	.4byte	0x132e8
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -44896,12 +44900,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3170
+	.4byte	.LASF3171
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13311
+	.4byte	0x13317
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -44919,12 +44923,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3171
+	.4byte	.LASF3172
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1334b
+	.4byte	0x13351
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -44947,37 +44951,37 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3172
+	.4byte	.LASF3173
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x1337f
+	.4byte	0x13385
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x30a7
 	.uleb128 0x78
-	.4byte	.LASF3173
+	.4byte	.LASF3174
 	.byte	0x6
 	.byte	0xf7
 	.4byte	0x443
 	.uleb128 0x66
 	.uleb128 0x78
-	.4byte	.LASF3174
+	.4byte	.LASF3175
 	.byte	0x6
 	.byte	0xfe
 	.4byte	0x155
 	.byte	0
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3175
+	.4byte	.LASF3176
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x133c9
+	.4byte	0x133cf
 	.uleb128 0x7e
 	.4byte	.LASF1149
 	.byte	0x6
@@ -44994,25 +44998,25 @@ __exitcall_ebc_exit:
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x78
-	.4byte	.LASF3176
+	.4byte	.LASF3177
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x66
 	.uleb128 0x78
-	.4byte	.LASF3174
+	.4byte	.LASF3175
 	.byte	0x6
 	.byte	0x56
 	.4byte	0x155
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3177
+	.4byte	.LASF3178
 	.byte	0x12
 	.2byte	0x2e5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x133f3
+	.4byte	0x133f9
 	.uleb128 0x64
 	.4byte	.LASF986
 	.byte	0x12
@@ -45025,12 +45029,12 @@ __exitcall_ebc_exit:
 	.4byte	0x31b
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3178
+	.4byte	.LASF3179
 	.byte	0x12
 	.2byte	0x216
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x1342b
+	.4byte	0x13431
 	.uleb128 0x64
 	.4byte	.LASF986
 	.byte	0x12
@@ -45050,12 +45054,12 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3179
+	.4byte	.LASF3180
 	.byte	0x12
 	.2byte	0x1dd
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13461
+	.4byte	0x13467
 	.uleb128 0x64
 	.4byte	.LASF986
 	.byte	0x12
@@ -45067,18 +45071,18 @@ __exitcall_ebc_exit:
 	.2byte	0x1dd
 	.4byte	0x31b
 	.uleb128 0x46
-	.4byte	.LASF3180
+	.4byte	.LASF3181
 	.byte	0x12
 	.2byte	0x1df
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3181
+	.4byte	.LASF3182
 	.byte	0x12
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x1347f
+	.4byte	0x13485
 	.uleb128 0x64
 	.4byte	.LASF986
 	.byte	0x12
@@ -45086,12 +45090,12 @@ __exitcall_ebc_exit:
 	.4byte	0x2ce
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3182
+	.4byte	.LASF3183
 	.byte	0x12
 	.2byte	0x13d
 	.4byte	0xd788
 	.byte	0x3
-	.4byte	0x1349d
+	.4byte	0x134a3
 	.uleb128 0x64
 	.4byte	.LASF170
 	.byte	0x12
@@ -45099,13 +45103,13 @@ __exitcall_ebc_exit:
 	.4byte	0x31b
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3183
+	.4byte	.LASF3184
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x134c0
+	.4byte	0x134c6
 	.uleb128 0x7e
-	.4byte	.LASF3026
+	.4byte	.LASF3027
 	.byte	0xbe
 	.byte	0xdb
 	.4byte	0xd6ff
@@ -45116,79 +45120,79 @@ __exitcall_ebc_exit:
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3184
+	.4byte	.LASF3185
 	.byte	0xbe
 	.byte	0xd6
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x134dc
+	.4byte	0x134e2
 	.uleb128 0x7e
-	.4byte	.LASF3026
+	.4byte	.LASF3027
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x134dc
+	.4byte	0x134e2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xd657
 	.uleb128 0x62
-	.4byte	.LASF3185
+	.4byte	.LASF3186
 	.byte	0xa3
 	.2byte	0x164
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13500
+	.4byte	0x13506
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x13500
+	.4byte	0x13506
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc0a8
 	.uleb128 0x62
-	.4byte	.LASF3186
+	.4byte	.LASF3187
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1353b
+	.4byte	0x13541
 	.uleb128 0x63
 	.string	"np"
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xbca5
 	.uleb128 0x64
-	.4byte	.LASF3187
+	.4byte	.LASF3188
 	.byte	0xe
 	.2byte	0x499
 	.4byte	0x56
 	.uleb128 0x64
-	.4byte	.LASF3188
+	.4byte	.LASF3189
 	.byte	0xe
 	.2byte	0x49a
 	.4byte	0xaab
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3189
+	.4byte	.LASF3190
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13587
+	.4byte	0x1358d
 	.uleb128 0x63
 	.string	"np"
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xbca5
 	.uleb128 0x64
-	.4byte	.LASF3187
+	.4byte	.LASF3188
 	.byte	0xe
 	.2byte	0x1f0
 	.4byte	0x56
 	.uleb128 0x64
-	.4byte	.LASF3190
+	.4byte	.LASF3191
 	.byte	0xe
 	.2byte	0x1f1
 	.4byte	0xaab
@@ -45204,11 +45208,11 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3191
+	.4byte	.LASF3192
 	.byte	0xe
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x1359f
+	.4byte	0x135a5
 	.uleb128 0x7e
 	.4byte	.LASF867
 	.byte	0xe
@@ -45216,11 +45220,11 @@ __exitcall_ebc_exit:
 	.4byte	0xb87f
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3192
+	.4byte	.LASF3193
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x135c5
+	.4byte	0x135cb
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -45233,12 +45237,12 @@ __exitcall_ebc_exit:
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3193
+	.4byte	.LASF3194
 	.byte	0x2
 	.2byte	0x49b
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x135e3
+	.4byte	0x135e9
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -45246,12 +45250,12 @@ __exitcall_ebc_exit:
 	.4byte	0xbb15
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3194
+	.4byte	.LASF3195
 	.byte	0x2
 	.2byte	0x2c5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13619
+	.4byte	0x1361f
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -45269,12 +45273,12 @@ __exitcall_ebc_exit:
 	.4byte	0x31b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3195
+	.4byte	.LASF3196
 	.byte	0xf
 	.byte	0xca
 	.4byte	0x33c
 	.byte	0x3
-	.4byte	0x13635
+	.4byte	0x1363b
 	.uleb128 0x7d
 	.string	"res"
 	.byte	0xf
@@ -45282,12 +45286,12 @@ __exitcall_ebc_exit:
 	.4byte	0xc1b9
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3196
+	.4byte	.LASF3197
 	.byte	0xcc
 	.byte	0x22
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x13651
+	.4byte	0x13657
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xcc
@@ -45295,12 +45299,12 @@ __exitcall_ebc_exit:
 	.4byte	0x30a7
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3197
+	.4byte	.LASF3198
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1366d
+	.4byte	0x13673
 	.uleb128 0x7e
 	.4byte	.LASF986
 	.byte	0xcd
@@ -45308,12 +45312,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3198
+	.4byte	.LASF3199
 	.byte	0xd
 	.2byte	0x23e
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x1368b
+	.4byte	0x13691
 	.uleb128 0x64
 	.4byte	.LASF2273
 	.byte	0xd
@@ -45321,12 +45325,12 @@ __exitcall_ebc_exit:
 	.4byte	0x31f0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3199
+	.4byte	.LASF3200
 	.byte	0xd
 	.2byte	0x203
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x136b4
+	.4byte	0x136ba
 	.uleb128 0x63
 	.string	"wq"
 	.byte	0xd
@@ -45339,29 +45343,29 @@ __exitcall_ebc_exit:
 	.4byte	0x31f0
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3200
+	.4byte	.LASF3201
 	.byte	0xd
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x136d7
+	.4byte	0x136dd
 	.uleb128 0x7e
 	.4byte	.LASF2273
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0x31f0
 	.uleb128 0x7e
-	.4byte	.LASF3201
+	.4byte	.LASF3202
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3202
+	.4byte	.LASF3203
 	.byte	0x51
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x136f3
+	.4byte	0x136f9
 	.uleb128 0x63
 	.string	"m"
 	.byte	0x51
@@ -45369,12 +45373,12 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3203
+	.4byte	.LASF3204
 	.byte	0x51
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1370f
+	.4byte	0x13715
 	.uleb128 0x63
 	.string	"m"
 	.byte	0x51
@@ -45382,24 +45386,24 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3204
+	.4byte	.LASF3205
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x1374b
+	.4byte	0x13751
 	.uleb128 0x7e
 	.4byte	.LASF1149
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x30a7
 	.uleb128 0x7e
-	.4byte	.LASF3205
+	.4byte	.LASF3206
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2ce
 	.uleb128 0x7e
-	.4byte	.LASF3206
+	.4byte	.LASF3207
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x29b
@@ -45410,11 +45414,11 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3207
+	.4byte	.LASF3208
 	.byte	0xca
 	.byte	0x91
 	.byte	0x3
-	.4byte	0x1377b
+	.4byte	0x13781
 	.uleb128 0x7e
 	.4byte	.LASF986
 	.byte	0xca
@@ -45427,18 +45431,18 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.uleb128 0x66
 	.uleb128 0x78
-	.4byte	.LASF3208
+	.4byte	.LASF3209
 	.byte	0xca
 	.byte	0x93
 	.4byte	0xc6
 	.byte	0
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3209
+	.4byte	.LASF3210
 	.byte	0xca
 	.byte	0x80
 	.byte	0x3
-	.4byte	0x137a7
+	.4byte	0x137ad
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xca
@@ -45450,25 +45454,25 @@ __exitcall_ebc_exit:
 	.byte	0x80
 	.4byte	0x29
 	.uleb128 0x7e
-	.4byte	.LASF3210
+	.4byte	.LASF3211
 	.byte	0xca
 	.byte	0x81
 	.4byte	0x29b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3211
+	.4byte	.LASF3212
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x137cd
+	.4byte	0x137d3
 	.uleb128 0x7d
 	.string	"ti"
 	.byte	0xca
 	.byte	0x5f
-	.4byte	0x137cd
+	.4byte	0x137d3
 	.uleb128 0x7e
-	.4byte	.LASF3212
+	.4byte	.LASF3213
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
@@ -45477,24 +45481,24 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.4byte	0xc1e
 	.uleb128 0x7c
-	.4byte	.LASF3213
+	.4byte	.LASF3214
 	.byte	0x5
 	.byte	0xf
 	.4byte	0x2ef0
 	.byte	0x3
-	.4byte	0x137ef
+	.4byte	0x137f5
 	.uleb128 0x78
-	.4byte	.LASF3214
+	.4byte	.LASF3215
 	.byte	0x5
 	.byte	0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3215
+	.4byte	.LASF3216
 	.byte	0x10
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x13833
+	.4byte	0x13839
 	.uleb128 0x7e
 	.4byte	.LASF961
 	.byte	0x10
@@ -45505,9 +45509,9 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x13826
+	.4byte	0x1382c
 	.uleb128 0x22
-	.4byte	.LASF3093
+	.4byte	.LASF3094
 	.byte	0x10
 	.byte	0x1c
 	.4byte	0x3b7
@@ -45515,27 +45519,27 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x12318
+	.4byte	0x1231e
 	.byte	0
 	.uleb128 0x7b
 	.string	"__u"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x13807
+	.4byte	0x1380d
 	.byte	0
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3289
+	.4byte	.LASF3290
 	.byte	0x20
 	.2byte	0x126
 	.byte	0x3
 	.uleb128 0x7c
-	.4byte	.LASF3216
+	.4byte	.LASF3217
 	.byte	0xce
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13857
+	.4byte	0x1385d
 	.uleb128 0x7d
 	.string	"n"
 	.byte	0xce
@@ -45543,12 +45547,12 @@ __exitcall_ebc_exit:
 	.4byte	0x155
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3217
+	.4byte	.LASF3218
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xdd
 	.byte	0x3
-	.4byte	0x13889
+	.4byte	0x1388f
 	.uleb128 0x7e
 	.4byte	.LASF2455
 	.byte	0x8
@@ -45566,12 +45570,12 @@ __exitcall_ebc_exit:
 	.4byte	0x8b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3218
+	.4byte	.LASF3219
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x138af
+	.4byte	0x138b5
 	.uleb128 0x7d
 	.string	"nr"
 	.byte	0x7
@@ -45581,17 +45585,17 @@ __exitcall_ebc_exit:
 	.4byte	.LASF1149
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x138af
+	.4byte	0x138b5
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x3a
 	.uleb128 0x7f
-	.4byte	.LASF3219
+	.4byte	.LASF3220
 	.byte	0x11
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x138e8
+	.4byte	0x138ee
 	.uleb128 0x7d
 	.string	"i"
 	.byte	0x11
@@ -45601,7 +45605,7 @@ __exitcall_ebc_exit:
 	.string	"v"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x138e8
+	.4byte	0x138ee
 	.uleb128 0x7b
 	.string	"w0"
 	.byte	0x11
@@ -45611,18 +45615,18 @@ __exitcall_ebc_exit:
 	.string	"x1"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x138e8
+	.4byte	0x138ee
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x367
 	.uleb128 0x7c
-	.4byte	.LASF3220
+	.4byte	.LASF3221
 	.byte	0xcf
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13908
+	.4byte	0x1390e
 	.uleb128 0x7d
 	.string	"x"
 	.byte	0xcf
@@ -45630,12 +45634,12 @@ __exitcall_ebc_exit:
 	.4byte	0xef
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3221
+	.4byte	.LASF3222
 	.byte	0xd0
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13924
+	.4byte	0x1392a
 	.uleb128 0x7e
 	.4byte	.LASF2488
 	.byte	0xd0
@@ -45643,16 +45647,16 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3222
+	.4byte	.LASF3223
 	.byte	0xd1
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x13945
+	.4byte	0x1394b
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd1
 	.byte	0xb
-	.4byte	0x13945
+	.4byte	0x1394b
 	.uleb128 0x7e
 	.4byte	.LASF986
 	.byte	0xd1
@@ -45661,21 +45665,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1394d
+	.4byte	0x13953
 	.uleb128 0x81
 	.uleb128 0x3
-	.4byte	0x1394b
+	.4byte	0x13951
 	.uleb128 0x7f
-	.4byte	.LASF3223
+	.4byte	.LASF3224
 	.byte	0xd1
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x13973
+	.4byte	0x13979
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd1
 	.byte	0x9
-	.4byte	0x13945
+	.4byte	0x1394b
 	.uleb128 0x7e
 	.4byte	.LASF986
 	.byte	0xd1
@@ -45683,16 +45687,16 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3224
+	.4byte	.LASF3225
 	.byte	0xc
 	.2byte	0x11a
 	.byte	0x3
-	.4byte	0x139a3
+	.4byte	0x139a9
 	.uleb128 0x63
 	.string	"p"
 	.byte	0xc
 	.2byte	0x11a
-	.4byte	0x139a3
+	.4byte	0x139a9
 	.uleb128 0x63
 	.string	"res"
 	.byte	0xc
@@ -45706,418 +45710,418 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1394b
+	.4byte	0x13951
 	.uleb128 0x82
-	.4byte	0x1271c
+	.4byte	0x12722
 	.8byte	.LFB2815
 	.8byte	.LFE2815-.LFB2815
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13c2c
+	.4byte	0x13c32
 	.uleb128 0x71
-	.4byte	0x12729
+	.4byte	0x1272f
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x12735
+	.4byte	0x1273b
 	.4byte	.LLST102
 	.uleb128 0x6f
-	.4byte	0x12741
+	.4byte	0x12747
 	.4byte	.LLST103
 	.uleb128 0x6f
-	.4byte	0x1274d
+	.4byte	0x12753
 	.4byte	.LLST104
 	.uleb128 0x53
-	.4byte	0x1275a
+	.4byte	0x12760
 	.8byte	.LBB1232
 	.8byte	.LBE1232-.LBB1232
 	.byte	0x1
 	.2byte	0x388
-	.4byte	0x13ae1
+	.4byte	0x13ae7
 	.uleb128 0x54
-	.4byte	0x1278b
+	.4byte	0x12791
 	.uleb128 0x54
-	.4byte	0x1278b
+	.4byte	0x12791
 	.uleb128 0x54
-	.4byte	0x1278b
+	.4byte	0x12791
 	.uleb128 0x54
-	.4byte	0x1277f
+	.4byte	0x12785
 	.uleb128 0x54
-	.4byte	0x12773
+	.4byte	0x12779
 	.uleb128 0x54
-	.4byte	0x12767
+	.4byte	0x1276d
 	.uleb128 0x56
 	.8byte	.LBB1233
 	.8byte	.LBE1233-.LBB1233
 	.uleb128 0x57
-	.4byte	0x12797
+	.4byte	0x1279d
 	.uleb128 0x5f
-	.4byte	0x127a3
+	.4byte	0x127a9
 	.4byte	.LLST105
 	.uleb128 0x57
-	.4byte	0x127ad
+	.4byte	0x127b3
 	.uleb128 0x5f
-	.4byte	0x127b7
+	.4byte	0x127bd
 	.4byte	.LLST106
 	.uleb128 0x5f
-	.4byte	0x127c3
+	.4byte	0x127c9
 	.4byte	.LLST107
 	.uleb128 0x5f
-	.4byte	0x127cf
+	.4byte	0x127d5
 	.4byte	.LLST108
 	.uleb128 0x57
-	.4byte	0x127db
+	.4byte	0x127e1
 	.uleb128 0x60
-	.4byte	0x127e7
+	.4byte	0x127ed
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x60
-	.4byte	0x127f3
+	.4byte	0x127f9
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5f
-	.4byte	0x127ff
+	.4byte	0x12805
 	.4byte	.LLST109
 	.uleb128 0x5f
-	.4byte	0x1280b
+	.4byte	0x12811
 	.4byte	.LLST110
 	.uleb128 0x5f
-	.4byte	0x12817
+	.4byte	0x1281d
 	.4byte	.LLST111
 	.uleb128 0x57
-	.4byte	0x12823
+	.4byte	0x12829
 	.uleb128 0x5a
-	.4byte	0x12f96
+	.4byte	0x12f9c
 	.8byte	.LBB1234
 	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
 	.2byte	0x37b
-	.4byte	0x13abb
+	.4byte	0x13ac1
 	.uleb128 0x54
-	.4byte	0x12fbc
+	.4byte	0x12fc2
 	.uleb128 0x54
-	.4byte	0x12fb1
+	.4byte	0x12fb7
 	.uleb128 0x54
-	.4byte	0x12fa6
+	.4byte	0x12fac
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x12f96
+	.4byte	0x12f9c
 	.8byte	.LBB1241
 	.4byte	.Ldebug_ranges0+0x730
 	.byte	0x1
 	.2byte	0x37c
 	.uleb128 0x54
-	.4byte	0x12fbc
+	.4byte	0x12fc2
 	.uleb128 0x54
-	.4byte	0x12fb1
+	.4byte	0x12fb7
 	.uleb128 0x54
-	.4byte	0x12fa6
+	.4byte	0x12fac
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x780
 	.uleb128 0x54
-	.4byte	0x1274d
+	.4byte	0x12753
 	.uleb128 0x54
-	.4byte	0x12741
+	.4byte	0x12747
 	.uleb128 0x54
-	.4byte	0x12735
+	.4byte	0x1273b
 	.uleb128 0x54
-	.4byte	0x12729
+	.4byte	0x1272f
 	.uleb128 0x5e
-	.4byte	0x12830
+	.4byte	0x12836
 	.8byte	.LBB1253
 	.4byte	.Ldebug_ranges0+0x780
 	.byte	0x1
 	.2byte	0x386
 	.uleb128 0x54
-	.4byte	0x12861
+	.4byte	0x12867
 	.uleb128 0x54
-	.4byte	0x12861
+	.4byte	0x12867
 	.uleb128 0x54
-	.4byte	0x12861
+	.4byte	0x12867
 	.uleb128 0x54
-	.4byte	0x12855
+	.4byte	0x1285b
 	.uleb128 0x54
-	.4byte	0x12849
+	.4byte	0x1284f
 	.uleb128 0x54
-	.4byte	0x1283d
+	.4byte	0x12843
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x780
 	.uleb128 0x57
-	.4byte	0x1286d
+	.4byte	0x12873
 	.uleb128 0x60
-	.4byte	0x12879
+	.4byte	0x1287f
 	.uleb128 0x1
 	.byte	0x5c
 	.uleb128 0x57
-	.4byte	0x12883
+	.4byte	0x12889
 	.uleb128 0x60
-	.4byte	0x1288d
+	.4byte	0x12893
 	.uleb128 0x1
 	.byte	0x5f
 	.uleb128 0x57
-	.4byte	0x12899
+	.4byte	0x1289f
 	.uleb128 0x5f
-	.4byte	0x128a5
+	.4byte	0x128ab
 	.4byte	.LLST112
 	.uleb128 0x5f
-	.4byte	0x128b1
+	.4byte	0x128b7
 	.4byte	.LLST113
 	.uleb128 0x60
-	.4byte	0x128bd
+	.4byte	0x128c3
 	.uleb128 0x1
 	.byte	0x59
 	.uleb128 0x60
-	.4byte	0x128c9
+	.4byte	0x128cf
 	.uleb128 0x1
 	.byte	0x5a
 	.uleb128 0x5f
-	.4byte	0x128d5
+	.4byte	0x128db
 	.4byte	.LLST114
 	.uleb128 0x5f
-	.4byte	0x128e1
+	.4byte	0x128e7
 	.4byte	.LLST115
 	.uleb128 0x60
-	.4byte	0x128ed
+	.4byte	0x128f3
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x57
-	.4byte	0x128f9
+	.4byte	0x128ff
 	.uleb128 0x5a
-	.4byte	0x12f96
+	.4byte	0x12f9c
 	.8byte	.LBB1255
 	.4byte	.Ldebug_ranges0+0x7c0
 	.byte	0x1
 	.2byte	0x354
-	.4byte	0x13bb4
+	.4byte	0x13bba
 	.uleb128 0x54
-	.4byte	0x12fbc
+	.4byte	0x12fc2
 	.uleb128 0x54
-	.4byte	0x12fb1
+	.4byte	0x12fb7
 	.uleb128 0x54
-	.4byte	0x12fa6
+	.4byte	0x12fac
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12f96
+	.4byte	0x12f9c
 	.8byte	.LBB1260
 	.4byte	.Ldebug_ranges0+0x810
 	.byte	0x1
 	.2byte	0x355
-	.4byte	0x13bdc
+	.4byte	0x13be2
 	.uleb128 0x54
-	.4byte	0x12fbc
+	.4byte	0x12fc2
 	.uleb128 0x54
-	.4byte	0x12fb1
+	.4byte	0x12fb7
 	.uleb128 0x54
-	.4byte	0x12fa6
+	.4byte	0x12fac
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12f96
+	.4byte	0x12f9c
 	.8byte	.LBB1272
 	.4byte	.Ldebug_ranges0+0x880
 	.byte	0x1
 	.2byte	0x356
-	.4byte	0x13c04
+	.4byte	0x13c0a
 	.uleb128 0x54
-	.4byte	0x12fbc
+	.4byte	0x12fc2
 	.uleb128 0x54
-	.4byte	0x12fb1
+	.4byte	0x12fb7
 	.uleb128 0x54
-	.4byte	0x12fa6
+	.4byte	0x12fac
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x12f96
+	.4byte	0x12f9c
 	.8byte	.LBB1284
 	.4byte	.Ldebug_ranges0+0x8f0
 	.byte	0x1
 	.2byte	0x357
 	.uleb128 0x54
-	.4byte	0x12fbc
+	.4byte	0x12fc2
 	.uleb128 0x54
-	.4byte	0x12fb1
+	.4byte	0x12fb7
 	.uleb128 0x54
-	.4byte	0x12fa6
+	.4byte	0x12fac
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x82
-	.4byte	0x12532
+	.4byte	0x12538
 	.8byte	.LFB2818
 	.8byte	.LFE2818-.LFB2818
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13f61
+	.4byte	0x13f67
 	.uleb128 0x71
-	.4byte	0x1253f
+	.4byte	0x12545
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x1254b
+	.4byte	0x12551
 	.4byte	.LLST116
 	.uleb128 0x6f
-	.4byte	0x12557
+	.4byte	0x1255d
 	.4byte	.LLST117
 	.uleb128 0x6f
-	.4byte	0x12563
+	.4byte	0x12569
 	.4byte	.LLST118
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x940
-	.4byte	0x13e46
+	.4byte	0x13e4c
 	.uleb128 0x54
-	.4byte	0x12563
+	.4byte	0x12569
 	.uleb128 0x54
-	.4byte	0x12557
+	.4byte	0x1255d
 	.uleb128 0x54
-	.4byte	0x1254b
+	.4byte	0x12551
 	.uleb128 0x54
-	.4byte	0x1253f
+	.4byte	0x12545
 	.uleb128 0x5e
-	.4byte	0x12570
+	.4byte	0x12576
 	.8byte	.LBB1320
 	.4byte	.Ldebug_ranges0+0x940
 	.byte	0x1
 	.2byte	0x3e4
 	.uleb128 0x54
-	.4byte	0x125a1
+	.4byte	0x125a7
 	.uleb128 0x54
-	.4byte	0x125a1
+	.4byte	0x125a7
 	.uleb128 0x54
-	.4byte	0x125a1
+	.4byte	0x125a7
 	.uleb128 0x54
-	.4byte	0x12595
+	.4byte	0x1259b
 	.uleb128 0x54
-	.4byte	0x12589
+	.4byte	0x1258f
 	.uleb128 0x54
-	.4byte	0x1257d
+	.4byte	0x12583
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x940
 	.uleb128 0x57
-	.4byte	0x125ad
+	.4byte	0x125b3
 	.uleb128 0x5f
-	.4byte	0x125b9
+	.4byte	0x125bf
 	.4byte	.LLST119
 	.uleb128 0x5f
-	.4byte	0x125c5
+	.4byte	0x125cb
 	.4byte	.LLST120
 	.uleb128 0x5f
-	.4byte	0x125d1
+	.4byte	0x125d7
 	.4byte	.LLST121
 	.uleb128 0x5f
-	.4byte	0x125dd
+	.4byte	0x125e3
 	.4byte	.LLST122
 	.uleb128 0x5f
-	.4byte	0x125e9
+	.4byte	0x125ef
 	.4byte	.LLST123
 	.uleb128 0x5f
-	.4byte	0x125f5
+	.4byte	0x125fb
 	.4byte	.LLST124
 	.uleb128 0x5f
-	.4byte	0x12601
+	.4byte	0x12607
 	.4byte	.LLST125
 	.uleb128 0x5f
-	.4byte	0x1260d
+	.4byte	0x12613
 	.4byte	.LLST126
 	.uleb128 0x57
-	.4byte	0x12617
+	.4byte	0x1261d
 	.uleb128 0x5f
-	.4byte	0x12621
+	.4byte	0x12627
 	.4byte	.LLST127
 	.uleb128 0x5f
-	.4byte	0x1262d
+	.4byte	0x12633
 	.4byte	.LLST128
 	.uleb128 0x57
-	.4byte	0x12639
+	.4byte	0x1263f
 	.uleb128 0x5a
-	.4byte	0x12f4e
+	.4byte	0x12f54
 	.8byte	.LBB1322
 	.4byte	.Ldebug_ranges0+0x970
 	.byte	0x1
 	.2byte	0x3d5
-	.4byte	0x13d63
+	.4byte	0x13d69
 	.uleb128 0x54
-	.4byte	0x12f74
+	.4byte	0x12f7a
 	.uleb128 0x54
-	.4byte	0x12f69
+	.4byte	0x12f6f
 	.uleb128 0x54
-	.4byte	0x12f5e
+	.4byte	0x12f64
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x970
 	.uleb128 0x57
-	.4byte	0x12f7f
+	.4byte	0x12f85
 	.uleb128 0x5f
-	.4byte	0x12f8a
+	.4byte	0x12f90
 	.4byte	.LLST129
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12f4e
+	.4byte	0x12f54
 	.8byte	.LBB1325
 	.8byte	.LBE1325-.LBB1325
 	.byte	0x1
 	.2byte	0x3d2
-	.4byte	0x13daf
+	.4byte	0x13db5
 	.uleb128 0x54
-	.4byte	0x12f74
+	.4byte	0x12f7a
 	.uleb128 0x54
-	.4byte	0x12f69
+	.4byte	0x12f6f
 	.uleb128 0x54
-	.4byte	0x12f5e
+	.4byte	0x12f64
 	.uleb128 0x56
 	.8byte	.LBB1326
 	.8byte	.LBE1326-.LBB1326
 	.uleb128 0x57
-	.4byte	0x12f7f
+	.4byte	0x12f85
 	.uleb128 0x5f
-	.4byte	0x12f8a
+	.4byte	0x12f90
 	.4byte	.LLST130
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12f4e
+	.4byte	0x12f54
 	.8byte	.LBB1327
 	.8byte	.LBE1327-.LBB1327
 	.byte	0x1
 	.2byte	0x3d3
-	.4byte	0x13dfb
+	.4byte	0x13e01
 	.uleb128 0x54
-	.4byte	0x12f74
+	.4byte	0x12f7a
 	.uleb128 0x54
-	.4byte	0x12f69
+	.4byte	0x12f6f
 	.uleb128 0x54
-	.4byte	0x12f5e
+	.4byte	0x12f64
 	.uleb128 0x56
 	.8byte	.LBB1328
 	.8byte	.LBE1328-.LBB1328
 	.uleb128 0x57
-	.4byte	0x12f7f
+	.4byte	0x12f85
 	.uleb128 0x5f
-	.4byte	0x12f8a
+	.4byte	0x12f90
 	.4byte	.LLST131
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12f4e
+	.4byte	0x12f54
 	.8byte	.LBB1329
 	.8byte	.LBE1329-.LBB1329
 	.byte	0x1
 	.2byte	0x3d4
 	.uleb128 0x54
-	.4byte	0x12f74
+	.4byte	0x12f7a
 	.uleb128 0x54
-	.4byte	0x12f69
+	.4byte	0x12f6f
 	.uleb128 0x54
-	.4byte	0x12f5e
+	.4byte	0x12f64
 	.uleb128 0x56
 	.8byte	.LBB1330
 	.8byte	.LBE1330-.LBB1330
 	.uleb128 0x57
-	.4byte	0x12f7f
+	.4byte	0x12f85
 	.uleb128 0x5f
-	.4byte	0x12f8a
+	.4byte	0x12f90
 	.4byte	.LLST132
 	.byte	0
 	.byte	0
@@ -46125,102 +46129,102 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12646
+	.4byte	0x1264c
 	.8byte	.LBB1334
 	.8byte	.LBE1334-.LBB1334
 	.byte	0x1
 	.2byte	0x3e6
 	.uleb128 0x54
-	.4byte	0x12677
+	.4byte	0x1267d
 	.uleb128 0x54
-	.4byte	0x12677
+	.4byte	0x1267d
 	.uleb128 0x54
-	.4byte	0x12677
+	.4byte	0x1267d
 	.uleb128 0x54
-	.4byte	0x1266b
+	.4byte	0x12671
 	.uleb128 0x54
-	.4byte	0x1265f
+	.4byte	0x12665
 	.uleb128 0x54
-	.4byte	0x12653
+	.4byte	0x12659
 	.uleb128 0x56
 	.8byte	.LBB1335
 	.8byte	.LBE1335-.LBB1335
 	.uleb128 0x57
-	.4byte	0x12683
+	.4byte	0x12689
 	.uleb128 0x57
-	.4byte	0x1268f
+	.4byte	0x12695
 	.uleb128 0x57
-	.4byte	0x1269b
+	.4byte	0x126a1
 	.uleb128 0x60
-	.4byte	0x126a7
+	.4byte	0x126ad
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x60
-	.4byte	0x126b3
+	.4byte	0x126b9
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5f
-	.4byte	0x126bf
+	.4byte	0x126c5
 	.4byte	.LLST133
 	.uleb128 0x5f
-	.4byte	0x126cb
+	.4byte	0x126d1
 	.4byte	.LLST134
 	.uleb128 0x5f
-	.4byte	0x126d7
+	.4byte	0x126dd
 	.4byte	.LLST135
 	.uleb128 0x5f
-	.4byte	0x126e3
+	.4byte	0x126e9
 	.4byte	.LLST136
 	.uleb128 0x57
-	.4byte	0x126ed
+	.4byte	0x126f3
 	.uleb128 0x5f
-	.4byte	0x126f7
+	.4byte	0x126fd
 	.4byte	.LLST137
 	.uleb128 0x5f
-	.4byte	0x12703
+	.4byte	0x12709
 	.4byte	.LLST138
 	.uleb128 0x57
-	.4byte	0x1270f
+	.4byte	0x12715
 	.uleb128 0x5a
-	.4byte	0x12f4e
+	.4byte	0x12f54
 	.8byte	.LBB1336
 	.4byte	.Ldebug_ranges0+0x9a0
 	.byte	0x1
 	.2byte	0x3aa
-	.4byte	0x13f26
+	.4byte	0x13f2c
 	.uleb128 0x54
-	.4byte	0x12f74
+	.4byte	0x12f7a
 	.uleb128 0x54
-	.4byte	0x12f69
+	.4byte	0x12f6f
 	.uleb128 0x54
-	.4byte	0x12f5e
+	.4byte	0x12f64
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x9a0
 	.uleb128 0x57
-	.4byte	0x12f7f
+	.4byte	0x12f85
 	.uleb128 0x5f
-	.4byte	0x12f8a
+	.4byte	0x12f90
 	.4byte	.LLST139
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x12f4e
+	.4byte	0x12f54
 	.8byte	.LBB1343
 	.4byte	.Ldebug_ranges0+0xa10
 	.byte	0x1
 	.2byte	0x3a9
 	.uleb128 0x54
-	.4byte	0x12f74
+	.4byte	0x12f7a
 	.uleb128 0x54
-	.4byte	0x12f69
+	.4byte	0x12f6f
 	.uleb128 0x54
-	.4byte	0x12f5e
+	.4byte	0x12f64
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xa10
 	.uleb128 0x57
-	.4byte	0x12f7f
+	.4byte	0x12f85
 	.uleb128 0x5f
-	.4byte	0x12f8a
+	.4byte	0x12f90
 	.4byte	.LLST140
 	.byte	0
 	.byte	0
@@ -46228,493 +46232,493 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x124fa
+	.4byte	0x12500
 	.8byte	.LFB2861
 	.8byte	.LFE2861-.LFB2861
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14064
+	.4byte	0x1406a
 	.uleb128 0x6f
-	.4byte	0x12507
+	.4byte	0x1250d
 	.4byte	.LLST141
 	.uleb128 0x54
-	.4byte	0x12513
+	.4byte	0x12519
 	.uleb128 0x57
-	.4byte	0x1251f
+	.4byte	0x12525
 	.uleb128 0x5a
-	.4byte	0x1309c
+	.4byte	0x130a2
 	.8byte	.LBB1359
 	.4byte	.Ldebug_ranges0+0xa70
 	.byte	0x1
 	.2byte	0x3ed
-	.4byte	0x13fe2
+	.4byte	0x13fe8
 	.uleb128 0x54
-	.4byte	0x130cd
+	.4byte	0x130d3
 	.uleb128 0x54
-	.4byte	0x130c1
+	.4byte	0x130c7
 	.uleb128 0x54
-	.4byte	0x130b5
+	.4byte	0x130bb
 	.uleb128 0x54
-	.4byte	0x130a9
+	.4byte	0x130af
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xa70
 	.uleb128 0x57
-	.4byte	0x130d9
+	.4byte	0x130df
 	.uleb128 0x5e
-	.4byte	0x130e6
+	.4byte	0x130ec
 	.8byte	.LBB1361
 	.4byte	.Ldebug_ranges0+0xac0
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x54
-	.4byte	0x130f7
+	.4byte	0x130fd
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13019
+	.4byte	0x1301f
 	.8byte	.LBB1370
 	.4byte	.Ldebug_ranges0+0xaf0
 	.byte	0x1
 	.2byte	0x3ee
-	.4byte	0x14014
+	.4byte	0x1401a
 	.uleb128 0x54
-	.4byte	0x13051
+	.4byte	0x13057
 	.uleb128 0x54
-	.4byte	0x13046
+	.4byte	0x1304c
 	.uleb128 0x54
-	.4byte	0x1303b
+	.4byte	0x13041
 	.uleb128 0x54
-	.4byte	0x13030
+	.4byte	0x13036
 	.uleb128 0x54
-	.4byte	0x13025
+	.4byte	0x1302b
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12feb
+	.4byte	0x12ff1
 	.8byte	.LBB1376
 	.8byte	.LBE1376-.LBB1376
 	.byte	0x1
 	.2byte	0x3ef
-	.4byte	0x14040
+	.4byte	0x14046
 	.uleb128 0x54
-	.4byte	0x1300d
+	.4byte	0x13013
 	.uleb128 0x54
-	.4byte	0x13002
+	.4byte	0x13008
 	.uleb128 0x54
-	.4byte	0x12ff7
+	.4byte	0x12ffd
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12fc8
+	.4byte	0x12fce
 	.8byte	.LBB1378
 	.8byte	.LBE1378-.LBB1378
 	.byte	0x1
 	.2byte	0x3f0
 	.uleb128 0x54
-	.4byte	0x12fdf
+	.4byte	0x12fe5
 	.uleb128 0x54
-	.4byte	0x12fd4
+	.4byte	0x12fda
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12f1c
+	.4byte	0x12f22
 	.8byte	.LFB2862
 	.8byte	.LFE2862-.LFB2862
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14122
+	.4byte	0x14128
 	.uleb128 0x6f
-	.4byte	0x12f2c
+	.4byte	0x12f32
 	.4byte	.LLST144
 	.uleb128 0x6f
-	.4byte	0x12f37
+	.4byte	0x12f3d
 	.4byte	.LLST145
 	.uleb128 0x57
-	.4byte	0x12f42
+	.4byte	0x12f48
 	.uleb128 0x70
-	.4byte	0x1305d
+	.4byte	0x13063
 	.8byte	.LBB1406
 	.8byte	.LBE1406-.LBB1406
 	.byte	0x1
 	.byte	0xc6
-	.4byte	0x140b8
+	.4byte	0x140be
 	.uleb128 0x54
-	.4byte	0x13069
+	.4byte	0x1306f
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x131e6
+	.4byte	0x131ec
 	.8byte	.LBB1408
 	.8byte	.LBE1408-.LBB1408
 	.byte	0x1
 	.byte	0xc7
-	.4byte	0x140d9
+	.4byte	0x140df
 	.uleb128 0x54
-	.4byte	0x131f2
+	.4byte	0x131f8
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13216
+	.4byte	0x1321c
 	.8byte	.LBB1410
 	.8byte	.LBE1410-.LBB1410
 	.byte	0x1
 	.byte	0xca
-	.4byte	0x14107
+	.4byte	0x1410d
 	.uleb128 0x54
-	.4byte	0x13222
+	.4byte	0x13228
 	.uleb128 0x4e
 	.8byte	.LVL509
-	.4byte	0x14450
+	.4byte	0x14456
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL506
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL510
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12f1c
+	.4byte	0x12f22
 	.8byte	.LFB2866
 	.8byte	.LFE2866-.LFB2866
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x141d4
+	.4byte	0x141da
 	.uleb128 0x6f
-	.4byte	0x12f2c
+	.4byte	0x12f32
 	.4byte	.LLST169
 	.uleb128 0x57
-	.4byte	0x12f42
+	.4byte	0x12f48
 	.uleb128 0x54
-	.4byte	0x12f37
+	.4byte	0x12f3d
 	.uleb128 0x70
-	.4byte	0x131fe
+	.4byte	0x13204
 	.8byte	.LBB1770
 	.8byte	.LBE1770-.LBB1770
 	.byte	0x1
 	.byte	0xbf
-	.4byte	0x14172
+	.4byte	0x14178
 	.uleb128 0x54
-	.4byte	0x1320a
+	.4byte	0x13210
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13075
+	.4byte	0x1307b
 	.8byte	.LBB1772
 	.8byte	.LBE1772-.LBB1772
 	.byte	0x1
 	.byte	0xc0
-	.4byte	0x14198
+	.4byte	0x1419e
 	.uleb128 0x54
-	.4byte	0x13090
+	.4byte	0x13096
 	.uleb128 0x54
-	.4byte	0x13085
+	.4byte	0x1308b
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13234
+	.4byte	0x1323a
 	.8byte	.LBB1774
 	.8byte	.LBE1774-.LBB1774
 	.byte	0x1
 	.byte	0xbc
-	.4byte	0x141c6
+	.4byte	0x141cc
 	.uleb128 0x54
-	.4byte	0x13240
+	.4byte	0x13246
 	.uleb128 0x4e
 	.8byte	.LVL699
-	.4byte	0x144c7
+	.4byte	0x144cd
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL696
-	.4byte	0x141ec
+	.4byte	0x141f2
 	.byte	0
 	.uleb128 0x84
-	.4byte	.LASF3225
-	.4byte	.LASF3225
+	.4byte	.LASF3226
+	.4byte	.LASF3226
 	.byte	0xbe
 	.byte	0xcc
 	.uleb128 0x84
-	.4byte	.LASF3226
-	.4byte	.LASF3226
+	.4byte	.LASF3227
+	.4byte	.LASF3227
 	.byte	0xbe
 	.byte	0xca
 	.uleb128 0x85
-	.4byte	.LASF3227
-	.4byte	.LASF3227
+	.4byte	.LASF3228
+	.4byte	.LASF3228
 	.byte	0x2
 	.2byte	0x5d1
 	.uleb128 0x84
-	.4byte	.LASF3228
-	.4byte	.LASF3228
+	.4byte	.LASF3229
+	.4byte	.LASF3229
 	.byte	0xac
 	.byte	0x4f
 	.uleb128 0x85
-	.4byte	.LASF3229
-	.4byte	.LASF3229
+	.4byte	.LASF3230
+	.4byte	.LASF3230
 	.byte	0x2
 	.2byte	0x2bf
 	.uleb128 0x85
-	.4byte	.LASF3230
-	.4byte	.LASF3230
+	.4byte	.LASF3231
+	.4byte	.LASF3231
 	.byte	0xe
 	.2byte	0x149
 	.uleb128 0x85
-	.4byte	.LASF3231
-	.4byte	.LASF3231
+	.4byte	.LASF3232
+	.4byte	.LASF3232
 	.byte	0xe
 	.2byte	0x172
 	.uleb128 0x84
-	.4byte	.LASF3232
-	.4byte	.LASF3232
+	.4byte	.LASF3233
+	.4byte	.LASF3233
 	.byte	0xd2
 	.byte	0x78
 	.uleb128 0x84
-	.4byte	.LASF3233
-	.4byte	.LASF3233
+	.4byte	.LASF3234
+	.4byte	.LASF3234
 	.byte	0xaa
 	.byte	0x59
 	.uleb128 0x84
-	.4byte	.LASF3234
-	.4byte	.LASF3234
+	.4byte	.LASF3235
+	.4byte	.LASF3235
 	.byte	0xc3
 	.byte	0x30
 	.uleb128 0x86
-	.4byte	.LASF3235
-	.4byte	.LASF3235
+	.4byte	.LASF3236
+	.4byte	.LASF3236
 	.uleb128 0x84
-	.4byte	.LASF3235
-	.4byte	.LASF3235
+	.4byte	.LASF3236
+	.4byte	.LASF3236
 	.byte	0xd3
 	.byte	0x36
 	.uleb128 0x85
-	.4byte	.LASF3236
-	.4byte	.LASF3236
-	.byte	0x2
-	.2byte	0x5cb
-	.uleb128 0x84
 	.4byte	.LASF3237
 	.4byte	.LASF3237
-	.byte	0xc2
-	.byte	0x30
+	.byte	0x2
+	.2byte	0x5cb
 	.uleb128 0x84
 	.4byte	.LASF3238
 	.4byte	.LASF3238
 	.byte	0xc2
-	.byte	0x31
+	.byte	0x30
 	.uleb128 0x84
 	.4byte	.LASF3239
 	.4byte	.LASF3239
-	.byte	0xab
-	.byte	0x9
-	.uleb128 0x85
+	.byte	0xc2
+	.byte	0x31
+	.uleb128 0x84
 	.4byte	.LASF3240
 	.4byte	.LASF3240
-	.byte	0x48
-	.2byte	0x6b8
+	.byte	0xab
+	.byte	0x9
 	.uleb128 0x85
 	.4byte	.LASF3241
 	.4byte	.LASF3241
 	.byte	0x48
-	.2byte	0x676
-	.uleb128 0x84
+	.2byte	0x6b8
+	.uleb128 0x85
 	.4byte	.LASF3242
 	.4byte	.LASF3242
-	.byte	0x9c
-	.byte	0x67
+	.byte	0x48
+	.2byte	0x676
 	.uleb128 0x84
 	.4byte	.LASF3243
 	.4byte	.LASF3243
-	.byte	0x54
-	.byte	0x53
+	.byte	0x9c
+	.byte	0x67
 	.uleb128 0x84
 	.4byte	.LASF3244
 	.4byte	.LASF3244
 	.byte	0x54
-	.byte	0xa5
+	.byte	0x53
 	.uleb128 0x84
 	.4byte	.LASF3245
 	.4byte	.LASF3245
-	.byte	0xc3
-	.byte	0x2b
+	.byte	0x54
+	.byte	0xa5
 	.uleb128 0x84
 	.4byte	.LASF3246
 	.4byte	.LASF3246
 	.byte	0xc3
-	.byte	0x27
-	.uleb128 0x85
+	.byte	0x2b
+	.uleb128 0x84
 	.4byte	.LASF3247
 	.4byte	.LASF3247
+	.byte	0xc3
+	.byte	0x27
+	.uleb128 0x85
+	.4byte	.LASF3248
+	.4byte	.LASF3248
 	.byte	0x12
 	.2byte	0x184
 	.uleb128 0x84
-	.4byte	.LASF3248
-	.4byte	.LASF3248
+	.4byte	.LASF3249
+	.4byte	.LASF3249
 	.byte	0xd4
 	.byte	0x51
 	.uleb128 0x85
-	.4byte	.LASF3249
-	.4byte	.LASF3249
+	.4byte	.LASF3250
+	.4byte	.LASF3250
 	.byte	0x20
 	.2byte	0x1d9
 	.uleb128 0x84
-	.4byte	.LASF3250
-	.4byte	.LASF3250
+	.4byte	.LASF3251
+	.4byte	.LASF3251
 	.byte	0x3
 	.byte	0x3b
 	.uleb128 0x84
-	.4byte	.LASF3251
-	.4byte	.LASF3251
+	.4byte	.LASF3252
+	.4byte	.LASF3252
 	.byte	0x12
 	.byte	0xb9
 	.uleb128 0x86
-	.4byte	.LASF3252
-	.4byte	.LASF3252
-	.uleb128 0x84
 	.4byte	.LASF3253
 	.4byte	.LASF3253
-	.byte	0x3a
-	.byte	0xc2
 	.uleb128 0x84
 	.4byte	.LASF3254
 	.4byte	.LASF3254
+	.byte	0x3a
+	.byte	0xc2
+	.uleb128 0x84
+	.4byte	.LASF3255
+	.4byte	.LASF3255
 	.byte	0xac
 	.byte	0x4e
 	.uleb128 0x85
-	.4byte	.LASF3255
-	.4byte	.LASF3255
+	.4byte	.LASF3256
+	.4byte	.LASF3256
 	.byte	0x2
 	.2byte	0x287
 	.uleb128 0x84
-	.4byte	.LASF3256
-	.4byte	.LASF3256
+	.4byte	.LASF3257
+	.4byte	.LASF3257
 	.byte	0xbf
 	.byte	0x38
 	.uleb128 0x85
-	.4byte	.LASF3257
-	.4byte	.LASF3257
+	.4byte	.LASF3258
+	.4byte	.LASF3258
 	.byte	0xa3
 	.2byte	0x37b
 	.uleb128 0x86
-	.4byte	.LASF3258
-	.4byte	.LASF3258
-	.uleb128 0x84
 	.4byte	.LASF3259
 	.4byte	.LASF3259
+	.uleb128 0x84
+	.4byte	.LASF3260
+	.4byte	.LASF3260
 	.byte	0xc3
 	.byte	0x2e
 	.uleb128 0x85
-	.4byte	.LASF3260
-	.4byte	.LASF3260
+	.4byte	.LASF3261
+	.4byte	.LASF3261
 	.byte	0x20
 	.2byte	0x1c7
 	.uleb128 0x85
-	.4byte	.LASF3261
-	.4byte	.LASF3261
+	.4byte	.LASF3262
+	.4byte	.LASF3262
 	.byte	0x20
 	.2byte	0x17e
 	.uleb128 0x84
-	.4byte	.LASF3262
-	.4byte	.LASF3262
+	.4byte	.LASF3263
+	.4byte	.LASF3263
 	.byte	0x3
 	.byte	0x3a
 	.uleb128 0x84
-	.4byte	.LASF3263
-	.4byte	.LASF3263
+	.4byte	.LASF3264
+	.4byte	.LASF3264
 	.byte	0xc2
 	.byte	0x32
 	.uleb128 0x84
-	.4byte	.LASF3264
-	.4byte	.LASF3264
+	.4byte	.LASF3265
+	.4byte	.LASF3265
 	.byte	0xc3
 	.byte	0x2c
 	.uleb128 0x85
-	.4byte	.LASF3265
-	.4byte	.LASF3265
+	.4byte	.LASF3266
+	.4byte	.LASF3266
 	.byte	0x76
 	.2byte	0xa07
 	.uleb128 0x84
-	.4byte	.LASF3266
-	.4byte	.LASF3266
+	.4byte	.LASF3267
+	.4byte	.LASF3267
 	.byte	0x48
 	.byte	0xdc
 	.uleb128 0x85
-	.4byte	.LASF3267
-	.4byte	.LASF3267
-	.byte	0x3a
-	.2byte	0x459
-	.uleb128 0x84
 	.4byte	.LASF3268
 	.4byte	.LASF3268
 	.byte	0x3a
-	.byte	0xe9
-	.uleb128 0x85
+	.2byte	0x459
+	.uleb128 0x84
 	.4byte	.LASF3269
 	.4byte	.LASF3269
 	.byte	0x3a
-	.2byte	0x45a
+	.byte	0xe9
 	.uleb128 0x85
 	.4byte	.LASF3270
 	.4byte	.LASF3270
-	.byte	0x6
-	.2byte	0x19f
+	.byte	0x3a
+	.2byte	0x45a
 	.uleb128 0x85
 	.4byte	.LASF3271
 	.4byte	.LASF3271
 	.byte	0x6
-	.2byte	0x199
-	.uleb128 0x84
+	.2byte	0x19f
+	.uleb128 0x85
 	.4byte	.LASF3272
 	.4byte	.LASF3272
-	.byte	0xc3
-	.byte	0x25
+	.byte	0x6
+	.2byte	0x199
 	.uleb128 0x84
 	.4byte	.LASF3273
 	.4byte	.LASF3273
 	.byte	0xc3
-	.byte	0x2a
+	.byte	0x25
 	.uleb128 0x84
 	.4byte	.LASF3274
 	.4byte	.LASF3274
 	.byte	0xc3
-	.byte	0x24
+	.byte	0x2a
 	.uleb128 0x84
 	.4byte	.LASF3275
 	.4byte	.LASF3275
 	.byte	0xc3
-	.byte	0x23
+	.byte	0x24
 	.uleb128 0x84
 	.4byte	.LASF3276
 	.4byte	.LASF3276
-	.byte	0x9c
-	.byte	0x73
+	.byte	0xc3
+	.byte	0x23
 	.uleb128 0x84
 	.4byte	.LASF3277
 	.4byte	.LASF3277
-	.byte	0xc3
-	.byte	0x29
+	.byte	0x9c
+	.byte	0x73
 	.uleb128 0x84
 	.4byte	.LASF3278
 	.4byte	.LASF3278
 	.byte	0xc3
-	.byte	0x26
+	.byte	0x29
 	.uleb128 0x84
 	.4byte	.LASF3279
 	.4byte	.LASF3279
-	.byte	0x72
-	.byte	0x88
+	.byte	0xc3
+	.byte	0x26
 	.uleb128 0x84
 	.4byte	.LASF3280
 	.4byte	.LASF3280
 	.byte	0x72
-	.byte	0x98
+	.byte	0x88
 	.uleb128 0x84
 	.4byte	.LASF3281
 	.4byte	.LASF3281
-	.byte	0xc4
-	.byte	0x67
+	.byte	0x72
+	.byte	0x98
 	.uleb128 0x84
 	.4byte	.LASF3282
 	.4byte	.LASF3282
+	.byte	0xc4
+	.byte	0x68
+	.uleb128 0x84
+	.4byte	.LASF3283
+	.4byte	.LASF3283
 	.byte	0xc2
 	.byte	0x33
 	.uleb128 0x85
-	.4byte	.LASF3283
-	.4byte	.LASF3283
+	.4byte	.LASF3284
+	.4byte	.LASF3284
 	.byte	0xd
 	.2byte	0x1d6
 	.uleb128 0x87
@@ -46723,13 +46727,13 @@ __exitcall_ebc_exit:
 	.byte	0x78
 	.byte	0x2c
 	.uleb128 0x84
-	.4byte	.LASF3284
-	.4byte	.LASF3284
+	.4byte	.LASF3285
+	.4byte	.LASF3285
 	.byte	0x78
 	.byte	0x27
 	.uleb128 0x84
-	.4byte	.LASF3285
-	.4byte	.LASF3285
+	.4byte	.LASF3286
+	.4byte	.LASF3286
 	.byte	0x9c
 	.byte	0x71
 	.byte	0
@@ -52034,7 +52038,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_REQ_IDLE"
 .LASF2380:
 	.string	"suppliers"
-.LASF3042:
+.LASF3043:
 	.string	"ebc_buffer_manage_init"
 .LASF2879:
 	.string	"EPD_FULL_GCC16"
@@ -52046,7 +52050,7 @@ __exitcall_ebc_exit:
 	.string	"PE_SIZE_PUD"
 .LASF2590:
 	.string	"__tracepoint_page_ref_mod"
-.LASF2969:
+.LASF2970:
 	.string	"full_mode_num"
 .LASF1042:
 	.string	"nr_wakeups"
@@ -52092,7 +52096,7 @@ __exitcall_ebc_exit:
 	.string	"dev_kobj"
 .LASF474:
 	.string	"d_release"
-.LASF3154:
+.LASF3155:
 	.string	"get_arch_dma_ops"
 .LASF304:
 	.string	"__ctors_start"
@@ -52100,11 +52104,11 @@ __exitcall_ebc_exit:
 	.string	"state"
 .LASF523:
 	.string	"s_d_op"
-.LASF2959:
+.LASF2960:
 	.string	"ebc_buffer_vir"
 .LASF908:
 	.string	"node_states"
-.LASF2903:
+.LASF2904:
 	.string	"pmic_power_req"
 .LASF900:
 	.string	"hrtimer_resolution"
@@ -52126,7 +52130,7 @@ __exitcall_ebc_exit:
 	.string	"si_code"
 .LASF648:
 	.string	"thread_node"
-.LASF3090:
+.LASF3091:
 	.string	"temperature"
 .LASF1301:
 	.string	"map_pages"
@@ -52160,15 +52164,15 @@ __exitcall_ebc_exit:
 	.string	"system_wq"
 .LASF603:
 	.string	"rcu_read_lock_nesting"
-.LASF2987:
+.LASF2988:
 	.string	"suspend_lock"
 .LASF2529:
 	.string	"gpio_desc"
 .LASF961:
 	.string	"list"
-.LASF3171:
+.LASF3172:
 	.string	"_copy_from_user"
-.LASF3197:
+.LASF3198:
 	.string	"get_order"
 .LASF944:
 	.string	"si_errno"
@@ -52192,7 +52196,7 @@ __exitcall_ebc_exit:
 	.string	"trace_events"
 .LASF1342:
 	.string	"env_start"
-.LASF2912:
+.LASF2913:
 	.string	"DMA_FROM_DEVICE"
 .LASF755:
 	.string	"cpu_number"
@@ -52202,7 +52206,7 @@ __exitcall_ebc_exit:
 	.string	"mm_rb"
 .LASF2186:
 	.string	"freeze_late"
-.LASF3062:
+.LASF3063:
 	.string	"buf_info"
 .LASF408:
 	.string	"d_inode"
@@ -52216,7 +52220,7 @@ __exitcall_ebc_exit:
 	.string	"locked"
 .LASF72:
 	.string	"exitcall_t"
-.LASF2944:
+.LASF2945:
 	.string	"regs"
 .LASF1036:
 	.string	"slice_max"
@@ -52226,7 +52230,7 @@ __exitcall_ebc_exit:
 	.string	"n_node"
 .LASF1623:
 	.string	"qsize_t"
-.LASF3194:
+.LASF3195:
 	.string	"devm_kzalloc"
 .LASF379:
 	.string	"sequence"
@@ -52242,7 +52246,7 @@ __exitcall_ebc_exit:
 	.string	"s_state"
 .LASF1065:
 	.string	"run_list"
-.LASF3111:
+.LASF3112:
 	.string	"clac_full_data_align8"
 .LASF2552:
 	.string	"SCHED_SOFTIRQ"
@@ -52264,7 +52268,7 @@ __exitcall_ebc_exit:
 	.string	"param_ops_uint"
 .LASF890:
 	.string	"softirq_activated"
-.LASF3026:
+.LASF3027:
 	.string	"pdev"
 .LASF826:
 	.string	"system_long_wq"
@@ -52288,7 +52292,7 @@ __exitcall_ebc_exit:
 	.string	"c_true"
 .LASF1577:
 	.string	"notifier_call"
-.LASF3069:
+.LASF3070:
 	.string	"ebc_exit"
 .LASF1832:
 	.string	"gendisk"
@@ -52314,7 +52318,7 @@ __exitcall_ebc_exit:
 	.string	"size_t"
 .LASF208:
 	.string	"compat_elf_hwcap"
-.LASF3267:
+.LASF3268:
 	.string	"prepare_to_wait_event"
 .LASF1109:
 	.string	"cap_permitted"
@@ -52356,7 +52360,7 @@ __exitcall_ebc_exit:
 	.string	"__reserved"
 .LASF939:
 	.string	"_sigfault"
-.LASF3125:
+.LASF3126:
 	.string	"image_bg"
 .LASF2857:
 	.string	"ebc_buf_status"
@@ -52396,7 +52400,7 @@ __exitcall_ebc_exit:
 	.string	"delayed_call"
 .LASF919:
 	.string	"_status"
-.LASF2901:
+.LASF2902:
 	.string	"pmic_name"
 .LASF1463:
 	.string	"NR_FREE_CMA_PAGES"
@@ -52408,11 +52412,11 @@ __exitcall_ebc_exit:
 	.string	"bin_attribute"
 .LASF1602:
 	.string	"percpu_counter"
-.LASF2989:
+.LASF2990:
 	.string	"first_in"
 .LASF2328:
 	.string	"dev_groups"
-.LASF2951:
+.LASF2952:
 	.string	"image_addr_set"
 .LASF300:
 	.string	"__softirqentry_text_start"
@@ -52446,9 +52450,9 @@ __exitcall_ebc_exit:
 	.string	"irqchip_fwnode_ops"
 .LASF1613:
 	.string	"dq_id"
-.LASF3116:
+.LASF3117:
 	.string	"frame_count_tmp"
-.LASF3124:
+.LASF3125:
 	.string	"image_fb"
 .LASF1788:
 	.string	"write_end"
@@ -52456,7 +52460,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ION_HEAP_POOL"
 .LASF1423:
 	.string	"sysctl_protected_hardlinks"
-.LASF3271:
+.LASF3272:
 	.string	"__arch_copy_from_user"
 .LASF1176:
 	.string	"scan_objects"
@@ -52464,7 +52468,7 @@ __exitcall_ebc_exit:
 	.string	"pageset"
 .LASF1237:
 	.string	"wb_err"
-.LASF3168:
+.LASF3169:
 	.string	"copy_to_user"
 .LASF734:
 	.string	"trace_recursion"
@@ -52478,7 +52482,7 @@ __exitcall_ebc_exit:
 	.string	"jit_keyring"
 .LASF168:
 	.string	"file_disp"
-.LASF2966:
+.LASF2967:
 	.string	"auto_need_refresh"
 .LASF2845:
 	.string	"WF_TYPE_GRAY2"
@@ -52556,11 +52560,11 @@ __exitcall_ebc_exit:
 	.string	"latch_tree_node"
 .LASF1154:
 	.string	"cad_pid"
-.LASF2940:
+.LASF2941:
 	.string	"lgonl"
 .LASF534:
 	.string	"destroy_work"
-.LASF3078:
+.LASF3079:
 	.string	"one_buffer_end"
 .LASF253:
 	.string	"FTR_LOWER_SAFE"
@@ -52576,7 +52580,7 @@ __exitcall_ebc_exit:
 	.string	"pcpu_chosen_fc"
 .LASF390:
 	.string	"dentry_stat_t"
-.LASF3219:
+.LASF3220:
 	.string	"atomic_add"
 .LASF1642:
 	.string	"dqi_bgrace"
@@ -52594,7 +52598,7 @@ __exitcall_ebc_exit:
 	.string	"ctl_table"
 .LASF43:
 	.string	"uid_t"
-.LASF3248:
+.LASF3249:
 	.string	"strstr"
 .LASF2847:
 	.string	"WF_TYPE_A2"
@@ -52614,7 +52618,7 @@ __exitcall_ebc_exit:
 	.string	"write"
 .LASF2594:
 	.string	"__tracepoint_page_ref_freeze"
-.LASF2930:
+.LASF2931:
 	.string	"panel_buffer"
 .LASF316:
 	.string	"__exception_text_end"
@@ -52656,7 +52660,7 @@ __exitcall_ebc_exit:
 	.string	"pteval_t"
 .LASF429:
 	.string	"i_ino"
-.LASF3289:
+.LASF3290:
 	.string	"might_fault"
 .LASF1561:
 	.string	"compact_cached_free_pfn"
@@ -52664,7 +52668,7 @@ __exitcall_ebc_exit:
 	.string	"index"
 .LASF2203:
 	.string	"driver_data"
-.LASF2938:
+.LASF2939:
 	.string	"sdck"
 .LASF2808:
 	.string	"module_kset"
@@ -52682,7 +52686,7 @@ __exitcall_ebc_exit:
 	.string	"randomize_va_space"
 .LASF2579:
 	.string	"confirm_switch"
-.LASF2890:
+.LASF2891:
 	.string	"EPD_SUSPEND"
 .LASF380:
 	.string	"seqcount_t"
@@ -52774,7 +52778,7 @@ __exitcall_ebc_exit:
 	.string	"pidfd_fops"
 .LASF1916:
 	.string	"lm_put_owner"
-.LASF3250:
+.LASF3251:
 	.string	"ebc_pmic_verity_vcom"
 .LASF2523:
 	.string	"set_sda"
@@ -52840,7 +52844,7 @@ __exitcall_ebc_exit:
 	.string	"func"
 .LASF1140:
 	.string	"perf_event_context"
-.LASF3000:
+.LASF3001:
 	.string	"ebc_auto_task"
 .LASF93:
 	.string	"printk_delay_msec"
@@ -52872,7 +52876,7 @@ __exitcall_ebc_exit:
 	.string	"request_key_auth"
 .LASF1953:
 	.string	"destroy_inode"
-.LASF2963:
+.LASF2964:
 	.string	"is_busy_now"
 .LASF57:
 	.string	"irq_hw_number_t"
@@ -52880,11 +52884,11 @@ __exitcall_ebc_exit:
 	.string	"sysfs_dev_block_kobj"
 .LASF554:
 	.string	"upid"
-.LASF3279:
+.LASF3280:
 	.string	"down_write"
 .LASF1098:
 	.string	"completion"
-.LASF3076:
+.LASF3077:
 	.string	"old_prev_buf"
 .LASF1499:
 	.string	"NR_GPU_HEAP"
@@ -52898,13 +52902,13 @@ __exitcall_ebc_exit:
 	.string	"__con_initcall_end"
 .LASF1145:
 	.string	"active_uprobe"
-.LASF3004:
+.LASF3005:
 	.string	"ebc_poweroff_wq"
 .LASF1971:
 	.string	"show_options"
 .LASF2142:
 	.string	"uevent_helper"
-.LASF3046:
+.LASF3047:
 	.string	"lut_buffer_phy"
 .LASF109:
 	.string	"mmap_supported_flags"
@@ -52984,13 +52988,13 @@ __exitcall_ebc_exit:
 	.string	"RPM_SUSPENDED"
 .LASF697:
 	.string	"reclaim_state"
-.LASF3288:
+.LASF3289:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF137:
 	.string	"vendor_panic_cb"
-.LASF3071:
+.LASF3072:
 	.string	"ebc_vdd_power_timeout"
-.LASF3140:
+.LASF3141:
 	.string	"ebc_get_4pix_wf"
 .LASF2798:
 	.string	"num_symtab"
@@ -53018,13 +53022,13 @@ __exitcall_ebc_exit:
 	.string	"module_alloc_base"
 .LASF1751:
 	.string	"core_kallsyms"
-.LASF3252:
+.LASF3253:
 	.string	"memcpy"
-.LASF2893:
+.LASF2894:
 	.string	"EPD_FORCE_FULL"
 .LASF2400:
 	.string	"get_sgtable"
-.LASF3120:
+.LASF3121:
 	.string	"xor_val"
 .LASF2155:
 	.string	"envp_idx"
@@ -53036,11 +53040,11 @@ __exitcall_ebc_exit:
 	.string	"OOM_KILL"
 .LASF444:
 	.string	"i_hash"
-.LASF3103:
+.LASF3104:
 	.string	"gray_old"
 .LASF67:
 	.string	"hlist_node"
-.LASF3260:
+.LASF3261:
 	.string	"sprintf"
 .LASF1908:
 	.string	"fl_ops"
@@ -53050,7 +53054,7 @@ __exitcall_ebc_exit:
 	.string	"debug_guardpage_ops"
 .LASF2673:
 	.string	"COMPACTISOLATED"
-.LASF3230:
+.LASF3231:
 	.string	"of_property_read_variable_u32_array"
 .LASF327:
 	.string	"__inittext_begin"
@@ -53086,7 +53090,7 @@ __exitcall_ebc_exit:
 	.string	"DOMAIN_BUS_WAKEUP"
 .LASF1222:
 	.string	"arm64_el2_vector_last_slot"
-.LASF3283:
+.LASF3284:
 	.string	"queue_work_on"
 .LASF2335:
 	.string	"online"
@@ -53094,17 +53098,17 @@ __exitcall_ebc_exit:
 	.string	"runtime_resume"
 .LASF1207:
 	.string	"dup_xol_work"
-.LASF3161:
+.LASF3162:
 	.string	"ebc_pmic_read_temp"
 .LASF2875:
 	.string	"EPD_FULL_GC16"
-.LASF3013:
+.LASF3014:
 	.string	"dev_attr_ebc_state"
 .LASF2161:
 	.string	"kernel_kobj"
 .LASF2587:
 	.string	"funcs"
-.LASF2996:
+.LASF2997:
 	.string	"overlay_enable"
 .LASF1107:
 	.string	"securebits"
@@ -53124,7 +53128,7 @@ __exitcall_ebc_exit:
 	.string	"DOMAIN_BUS_NEXUS"
 .LASF2038:
 	.string	"sysctl_mount_point"
-.LASF2992:
+.LASF2993:
 	.string	"auto_buffer_work"
 .LASF266:
 	.string	"user_mask"
@@ -53168,7 +53172,7 @@ __exitcall_ebc_exit:
 	.string	"UNEVICTABLE_PGMLOCKED"
 .LASF836:
 	.string	"pgdval_t"
-.LASF2915:
+.LASF2916:
 	.string	"page_link"
 .LASF1859:
 	.string	"setattr"
@@ -53180,7 +53184,7 @@ __exitcall_ebc_exit:
 	.string	"prepare"
 .LASF2138:
 	.string	"bin_attrs"
-.LASF2925:
+.LASF2926:
 	.string	"HYPERVISOR_shared_info"
 .LASF682:
 	.string	"sas_ss_flags"
@@ -53188,7 +53192,7 @@ __exitcall_ebc_exit:
 	.string	"f_mode"
 .LASF1429:
 	.string	"ki_complete"
-.LASF3029:
+.LASF3030:
 	.string	"ebc_tcon_pdev"
 .LASF1755:
 	.string	"percpu"
@@ -53208,13 +53212,13 @@ __exitcall_ebc_exit:
 	.string	"driver"
 .LASF1544:
 	.string	"ZONE_NORMAL"
-.LASF3126:
+.LASF3127:
 	.string	"image_new_data"
 .LASF425:
 	.string	"i_op"
 .LASF1686:
 	.string	"d_rt_spc_hardlimit"
-.LASF2975:
+.LASF2976:
 	.string	"ebc_task"
 .LASF2126:
 	.string	"kobj_ns_type_operations"
@@ -53256,13 +53260,13 @@ __exitcall_ebc_exit:
 	.string	"trace_bprintk_fmt_start"
 .LASF665:
 	.string	"cpu_timers"
-.LASF2949:
+.LASF2950:
 	.string	"disable"
 .LASF1300:
 	.string	"huge_fault"
 .LASF2008:
 	.string	"kstatfs"
-.LASF3164:
+.LASF3165:
 	.string	"ebc_pmic_power_off"
 .LASF2634:
 	.string	"PGPGOUTCLEAN"
@@ -53280,7 +53284,7 @@ __exitcall_ebc_exit:
 	.string	"i_dentry"
 .LASF2128:
 	.string	"grab_current_ns"
-.LASF3044:
+.LASF3045:
 	.string	"fb_size"
 .LASF883:
 	.string	"offset"
@@ -53290,7 +53294,7 @@ __exitcall_ebc_exit:
 	.string	"fsnotify_mark_connector"
 .LASF941:
 	.string	"_sigsys"
-.LASF3089:
+.LASF3090:
 	.string	"ebc_lut_update"
 .LASF1921:
 	.string	"lm_setup"
@@ -53324,7 +53328,7 @@ __exitcall_ebc_exit:
 	.string	"idmap_pg_dir"
 .LASF2518:
 	.string	"i2c_bus_recovery_info"
-.LASF3047:
+.LASF3048:
 	.string	"lut_buffer_size"
 .LASF483:
 	.string	"s_dev"
@@ -53334,7 +53338,7 @@ __exitcall_ebc_exit:
 	.string	"get_next_id"
 .LASF237:
 	.string	"rwlock_t"
-.LASF3287:
+.LASF3288:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
 .LASF840:
 	.string	"pgprot"
@@ -53350,7 +53354,7 @@ __exitcall_ebc_exit:
 	.string	"PIDTYPE_TGID"
 .LASF1915:
 	.string	"lm_get_owner"
-.LASF2902:
+.LASF2903:
 	.string	"drvpar"
 .LASF2631:
 	.string	"vm_event_item"
@@ -53362,7 +53366,7 @@ __exitcall_ebc_exit:
 	.string	"__icache_flags"
 .LASF147:
 	.string	"crash_kexec_post_notifiers"
-.LASF3149:
+.LASF3150:
 	.string	"eink_mode"
 .LASF1697:
 	.string	"rt_spc_warnlimit"
@@ -53384,7 +53388,7 @@ __exitcall_ebc_exit:
 	.string	"_pid"
 .LASF1156:
 	.string	"init_stack"
-.LASF3132:
+.LASF3133:
 	.string	"dmask"
 .LASF1225:
 	.string	"address_space"
@@ -53396,15 +53400,15 @@ __exitcall_ebc_exit:
 	.string	"sysctl_nr_open"
 .LASF81:
 	.string	"reset_devices"
-.LASF2978:
+.LASF2979:
 	.string	"auto_image_bg"
 .LASF446:
 	.string	"i_wb"
 .LASF2086:
 	.string	"idr_next"
-.LASF3117:
+.LASF3118:
 	.string	"frame_count_data"
-.LASF2954:
+.LASF2955:
 	.string	"frame_start"
 .LASF1250:
 	.string	"compound_order"
@@ -53452,7 +53456,7 @@ __exitcall_ebc_exit:
 	.string	"normal_prio"
 .LASF1288:
 	.string	"f_ep_links"
-.LASF3130:
+.LASF3131:
 	.string	"image_fb_tmp"
 .LASF2294:
 	.string	"last_busy"
@@ -53464,7 +53468,7 @@ __exitcall_ebc_exit:
 	.string	"host"
 .LASF184:
 	.string	"uaddr"
-.LASF3278:
+.LASF3279:
 	.string	"ebc_remove_from_dsp_buf_list"
 .LASF661:
 	.string	"real_start_time"
@@ -53500,11 +53504,11 @@ __exitcall_ebc_exit:
 	.string	"devres_head"
 .LASF427:
 	.string	"i_mapping"
-.LASF3254:
+.LASF3255:
 	.string	"misc_register"
 .LASF722:
 	.string	"rseq_sig"
-.LASF3183:
+.LASF3184:
 	.string	"platform_set_drvdata"
 .LASF342:
 	.string	"cpu_context"
@@ -53512,7 +53516,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pm_domain"
 .LASF1513:
 	.string	"nr_zones"
-.LASF3206:
+.LASF3207:
 	.string	"is_source"
 .LASF1375:
 	.string	"migrate_mode"
@@ -53534,11 +53538,11 @@ __exitcall_ebc_exit:
 	.string	"d_hash"
 .LASF1075:
 	.string	"dl_bw"
-.LASF3176:
+.LASF3177:
 	.string	"limit"
 .LASF2145:
 	.string	"kobj"
-.LASF3261:
+.LASF3262:
 	.string	"kstrtouint"
 .LASF113:
 	.string	"fsync"
@@ -53546,15 +53550,15 @@ __exitcall_ebc_exit:
 	.string	"mtd_info"
 .LASF422:
 	.string	"i_flags"
-.LASF2891:
+.LASF2892:
 	.string	"EPD_RESUME"
-.LASF3249:
+.LASF3250:
 	.string	"sscanf"
-.LASF3245:
+.LASF3246:
 	.string	"ebc_empty_buf_get"
 .LASF1474:
 	.string	"NR_ISOLATED_ANON"
-.LASF3045:
+.LASF3046:
 	.string	"ebc_lut_table_init"
 .LASF1213:
 	.string	"uprobes_state"
@@ -53564,7 +53568,7 @@ __exitcall_ebc_exit:
 	.string	"rb_node"
 .LASF613:
 	.string	"pushable_tasks"
-.LASF3131:
+.LASF3132:
 	.string	"image_bg_tmp"
 .LASF2202:
 	.string	"platform_data"
@@ -53594,7 +53598,7 @@ __exitcall_ebc_exit:
 	.string	"last_update_time"
 .LASF1137:
 	.string	"robust_list_head"
-.LASF3243:
+.LASF3244:
 	.string	"init_timer_key"
 .LASF1480:
 	.string	"NR_ANON_MAPPED"
@@ -53608,9 +53612,9 @@ __exitcall_ebc_exit:
 	.string	"srcversion"
 .LASF858:
 	.string	"pcpu_unit_offsets"
-.LASF3152:
+.LASF3153:
 	.string	"dma_sync_single_for_device"
-.LASF2955:
+.LASF2956:
 	.string	"dsp_end_callback"
 .LASF460:
 	.string	"i_data"
@@ -53634,7 +53638,7 @@ __exitcall_ebc_exit:
 	.string	"usage_count"
 .LASF2077:
 	.string	"show"
-.LASF3010:
+.LASF3011:
 	.string	"dev_attr_pmic_temp"
 .LASF7:
 	.string	"unsigned char"
@@ -53650,7 +53654,7 @@ __exitcall_ebc_exit:
 	.string	"task_rss_stat"
 .LASF1141:
 	.string	"pipe_inode_info"
-.LASF2982:
+.LASF2983:
 	.string	"ebc_power_status"
 .LASF960:
 	.string	"ratelimit"
@@ -53666,7 +53670,7 @@ __exitcall_ebc_exit:
 	.string	"uevent_ops"
 .LASF545:
 	.string	"rename_lock"
-.LASF3077:
+.LASF3078:
 	.string	"__out"
 .LASF680:
 	.string	"sas_ss_sp"
@@ -53674,7 +53678,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_INACTIVE_ANON"
 .LASF728:
 	.string	"nr_dirtied"
-.LASF3193:
+.LASF3194:
 	.string	"dev_get_drvdata"
 .LASF2395:
 	.string	"linear_revmap"
@@ -53718,11 +53722,11 @@ __exitcall_ebc_exit:
 	.string	"sysctl_memory_failure_early_kill"
 .LASF2760:
 	.string	"param_ops_bool_enable_only"
-.LASF3137:
+.LASF3138:
 	.string	"power_status"
 .LASF306:
 	.string	"__start_opd"
-.LASF3257:
+.LASF3258:
 	.string	"of_find_i2c_device_by_node"
 .LASF153:
 	.string	"SYSTEM_RUNNING"
@@ -53740,7 +53744,7 @@ __exitcall_ebc_exit:
 	.string	"icq_hint"
 .LASF1994:
 	.string	"fiemap_extent_info"
-.LASF2911:
+.LASF2912:
 	.string	"DMA_TO_DEVICE"
 .LASF2729:
 	.string	"elf64_shdr"
@@ -53758,11 +53762,11 @@ __exitcall_ebc_exit:
 	.string	"sigval_t"
 .LASF1933:
 	.string	"fa_file"
-.LASF2998:
+.LASF2999:
 	.string	"panel"
 .LASF2432:
 	.string	"irq_data"
-.LASF3084:
+.LASF3085:
 	.string	"old_buffer_temp"
 .LASF2705:
 	.string	"sysctl_memory_failure_recovery"
@@ -53780,7 +53784,7 @@ __exitcall_ebc_exit:
 	.string	"st_shndx"
 .LASF2399:
 	.string	"free"
-.LASF3052:
+.LASF3053:
 	.string	"pmic_vcom_write"
 .LASF2133:
 	.string	"attribute"
@@ -53796,7 +53800,7 @@ __exitcall_ebc_exit:
 	.string	"taint_flags"
 .LASF1347:
 	.string	"membarrier_state"
-.LASF3143:
+.LASF3144:
 	.string	"pre_image_addr"
 .LASF2178:
 	.string	"suspend"
@@ -53850,7 +53854,7 @@ __exitcall_ebc_exit:
 	.string	"path"
 .LASF2727:
 	.string	"st_size"
-.LASF3014:
+.LASF3015:
 	.string	"dev_attr_ebc_buf_state"
 .LASF188:
 	.string	"rmtp"
@@ -53882,11 +53886,13 @@ __exitcall_ebc_exit:
 	.string	"arch_uprobe_task"
 .LASF458:
 	.string	"i_fop"
+.LASF2886:
+	.string	"EPD_A2_DITHER"
 .LASF1853:
 	.string	"unlink"
 .LASF2717:
 	.string	"d_ptr"
-.LASF3054:
+.LASF3055:
 	.string	"pmic_temp_read"
 .LASF1652:
 	.string	"dqstats"
@@ -53908,11 +53914,11 @@ __exitcall_ebc_exit:
 	.string	"mmap_rnd_bits"
 .LASF2461:
 	.string	"of_stdout"
-.LASF3075:
+.LASF3076:
 	.string	"new_prev_buf"
 .LASF976:
 	.string	"vm_ops"
-.LASF2931:
+.LASF2932:
 	.string	"ebc_panel"
 .LASF1302:
 	.string	"pagesize"
@@ -53924,9 +53930,9 @@ __exitcall_ebc_exit:
 	.string	"timer"
 .LASF2462:
 	.string	"devtree_lock"
-.LASF3134:
+.LASF3135:
 	.string	"refresh_new_image_auto"
-.LASF3065:
+.LASF3066:
 	.string	"__ret"
 .LASF1864:
 	.string	"update_time"
@@ -53948,17 +53954,17 @@ __exitcall_ebc_exit:
 	.string	"expiry"
 .LASF571:
 	.string	"optimistic_spin_queue"
-.LASF2960:
+.LASF2961:
 	.string	"ebc_buffer_size"
-.LASF3262:
+.LASF3263:
 	.string	"ebc_pmic_set_vcom"
 .LASF2641:
 	.string	"ALLOCSTALL_NORMAL"
-.LASF3107:
+.LASF3108:
 	.string	"data_buf_tmp"
 .LASF325:
 	.string	"__initdata_begin"
-.LASF2905:
+.LASF2906:
 	.string	"pmic_pm_resume"
 .LASF224:
 	.string	"__lstate"
@@ -54032,7 +54038,7 @@ __exitcall_ebc_exit:
 	.string	"algo_data"
 .LASF1511:
 	.string	"node_zones"
-.LASF3011:
+.LASF3012:
 	.string	"dev_attr_pmic_vcom"
 .LASF1559:
 	.string	"initialized"
@@ -54046,7 +54052,7 @@ __exitcall_ebc_exit:
 	.string	"mod_plt_sec"
 .LASF636:
 	.string	"tgid"
-.LASF2895:
+.LASF2896:
 	.string	"epd_mode"
 .LASF1138:
 	.string	"compat_robust_list_head"
@@ -54122,7 +54128,7 @@ __exitcall_ebc_exit:
 	.string	"seq_show"
 .LASF766:
 	.string	"ate_match_dt"
-.LASF3191:
+.LASF3192:
 	.string	"of_node_put"
 .LASF1360:
 	.string	"cow_page"
@@ -54144,11 +54150,11 @@ __exitcall_ebc_exit:
 	.string	"param_ops_ushort"
 .LASF525:
 	.string	"s_shrink"
-.LASF3115:
+.LASF3116:
 	.string	"gray_new_temp"
 .LASF1525:
 	.string	"kcompactd_classzone_idx"
-.LASF3181:
+.LASF3182:
 	.string	"kmalloc_index"
 .LASF869:
 	.string	"hrtimer_restart"
@@ -54156,7 +54162,7 @@ __exitcall_ebc_exit:
 	.string	"totalram_pages"
 .LASF2486:
 	.string	"i2c_smbus_data"
-.LASF2986:
+.LASF2987:
 	.string	"curr_dsp_buf"
 .LASF1068:
 	.string	"time_slice"
@@ -54196,7 +54202,7 @@ __exitcall_ebc_exit:
 	.string	"wake_lock"
 .LASF2270:
 	.string	"may_skip_resume"
-.LASF2994:
+.LASF2995:
 	.string	"is_deep_sleep"
 .LASF1174:
 	.string	"shrinker"
@@ -54228,7 +54234,7 @@ __exitcall_ebc_exit:
 	.string	"ate_match_local_cap_id"
 .LASF2453:
 	.string	"property"
-.LASF3048:
+.LASF3049:
 	.string	"ebc_sysfs_init"
 .LASF991:
 	.string	"wchar"
@@ -54238,7 +54244,7 @@ __exitcall_ebc_exit:
 	.string	"platform_notify"
 .LASF61:
 	.string	"kernel_symbol"
-.LASF2923:
+.LASF2924:
 	.string	"dma_virt_ops"
 .LASF2298:
 	.string	"subsys_data"
@@ -54258,7 +54264,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_DELAYED_BIT"
 .LASF1038:
 	.string	"nr_failed_migrations_affine"
-.LASF3196:
+.LASF3197:
 	.string	"IS_ERR"
 .LASF861:
 	.string	"PCPU_FC_EMBED"
@@ -54272,7 +54278,7 @@ __exitcall_ebc_exit:
 	.string	"pi_top_task"
 .LASF805:
 	.string	"WORK_NR_COLORS"
-.LASF3135:
+.LASF3136:
 	.string	"refresh_new_image2"
 .LASF527:
 	.string	"s_fsnotify_inode_refs"
@@ -54284,7 +54290,7 @@ __exitcall_ebc_exit:
 	.string	"uprobe"
 .LASF528:
 	.string	"s_readonly_remount"
-.LASF3222:
+.LASF3223:
 	.string	"kasan_check_write"
 .LASF377:
 	.string	"hlist_bl_node"
@@ -54310,7 +54316,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_FLAG_MASK"
 .LASF1271:
 	.string	"units"
-.LASF3237:
+.LASF3238:
 	.string	"epd_lut_from_mem_init"
 .LASF311:
 	.string	"__nosave_begin"
@@ -54330,7 +54336,7 @@ __exitcall_ebc_exit:
 	.string	"user_namespace"
 .LASF2756:
 	.string	"param_ops_ulong"
-.LASF3213:
+.LASF3214:
 	.string	"get_current"
 .LASF231:
 	.string	"raw_spinlock"
@@ -54354,7 +54360,7 @@ __exitcall_ebc_exit:
 	.string	"fault_address"
 .LASF1606:
 	.string	"dq_inuse"
-.LASF3098:
+.LASF3099:
 	.string	"direct_mode_data_change_part"
 .LASF1641:
 	.string	"dqi_flags"
@@ -54362,13 +54368,13 @@ __exitcall_ebc_exit:
 	.string	"PGREFILL"
 .LASF2762:
 	.string	"param_ops_bint"
-.LASF3246:
+.LASF3247:
 	.string	"ebc_add_to_dsp_buf_list"
-.LASF3251:
+.LASF3252:
 	.string	"kfree"
 .LASF1802:
 	.string	"swap_deactivate"
-.LASF2939:
+.LASF2940:
 	.string	"gdck_sta"
 .LASF1143:
 	.string	"request_queue"
@@ -54376,7 +54382,7 @@ __exitcall_ebc_exit:
 	.string	"WORKINGSET_REFAULT"
 .LASF1640:
 	.string	"dqi_dirty_list"
-.LASF3049:
+.LASF3050:
 	.string	"ebc_buf_state_read"
 .LASF229:
 	.string	"prove_locking"
@@ -54390,7 +54396,7 @@ __exitcall_ebc_exit:
 	.string	"gtime"
 .LASF572:
 	.string	"debug_locks"
-.LASF3001:
+.LASF3002:
 	.string	"auto_buf_sema"
 .LASF1783:
 	.string	"readpage"
@@ -54410,7 +54416,7 @@ __exitcall_ebc_exit:
 	.string	"perm"
 .LASF714:
 	.string	"compat_robust_list"
-.LASF2958:
+.LASF2959:
 	.string	"ebc_buffer_phy"
 .LASF2477:
 	.string	"unmap"
@@ -54432,9 +54438,9 @@ __exitcall_ebc_exit:
 	.string	"alternatives_applied"
 .LASF597:
 	.string	"boost_expires"
-.LASF2910:
+.LASF2911:
 	.string	"DMA_BIDIRECTIONAL"
-.LASF3270:
+.LASF3271:
 	.string	"__arch_copy_to_user"
 .LASF235:
 	.string	"spinlock"
@@ -54452,13 +54458,13 @@ __exitcall_ebc_exit:
 	.string	"d_compare"
 .LASF971:
 	.string	"vm_mm"
-.LASF3085:
+.LASF3086:
 	.string	"need_refresh"
 .LASF2820:
 	.string	"platform_bus_type"
-.LASF3099:
+.LASF3100:
 	.string	"data_buf"
-.LASF3038:
+.LASF3039:
 	.string	"ulogo_buf"
 .LASF1637:
 	.string	"mem_dqinfo"
@@ -54476,15 +54482,15 @@ __exitcall_ebc_exit:
 	.string	"WORK_OFFQ_POOL_BITS"
 .LASF1905:
 	.string	"fl_fasync"
-.LASF3146:
+.LASF3147:
 	.string	"update_mode"
-.LASF2937:
+.LASF2938:
 	.string	"direct_mode"
 .LASF2411:
 	.string	"cache_sync"
 .LASF435:
 	.string	"i_lock"
-.LASF2973:
+.LASF2974:
 	.string	"ebc_dsp_buf_status"
 .LASF407:
 	.string	"d_name"
@@ -54518,7 +54524,7 @@ __exitcall_ebc_exit:
 	.string	"last_switch_time"
 .LASF565:
 	.string	"fs_overflowuid"
-.LASF2926:
+.LASF2927:
 	.string	"start_info"
 .LASF2693:
 	.string	"vm_zone_stat"
@@ -54548,15 +54554,15 @@ __exitcall_ebc_exit:
 	.string	"page_ext_operations"
 .LASF2663:
 	.string	"KSWAPD_HIGH_WMARK_HIT_QUICKLY"
-.LASF3050:
+.LASF3051:
 	.string	"ebc_state_read"
-.LASF3258:
+.LASF3259:
 	.string	"__stack_chk_fail"
-.LASF2908:
+.LASF2909:
 	.string	"pmic_set_vcom"
 .LASF2699:
 	.string	"stack_guard_gap"
-.LASF3205:
+.LASF3206:
 	.string	"bytes"
 .LASF1738:
 	.string	"gpl_future_crcs"
@@ -54588,7 +54594,7 @@ __exitcall_ebc_exit:
 	.string	"thaw_noirq"
 .LASF969:
 	.string	"vm_rb"
-.LASF3022:
+.LASF3023:
 	.string	"kernel_read_file_str"
 .LASF568:
 	.string	"init_user_ns"
@@ -54596,7 +54602,7 @@ __exitcall_ebc_exit:
 	.string	"add_links"
 .LASF2174:
 	.string	"pm_message_t"
-.LASF2928:
+.LASF2929:
 	.string	"xen_dma_ops"
 .LASF1444:
 	.string	"page_group_by_mobility_disabled"
@@ -54630,9 +54636,9 @@ __exitcall_ebc_exit:
 	.string	"payload"
 .LASF1389:
 	.string	"cb_state"
-.LASF2920:
+.LASF2921:
 	.string	"orig_nents"
-.LASF3064:
+.LASF3065:
 	.string	"buf_addr"
 .LASF412:
 	.string	"d_sb"
@@ -54660,7 +54666,7 @@ __exitcall_ebc_exit:
 	.string	"i_mtime"
 .LASF2604:
 	.string	"dev_page_fault_t"
-.LASF3092:
+.LASF3093:
 	.string	"ebc_auto_tast_function"
 .LASF24:
 	.string	"__kernel_gid32_t"
@@ -54672,7 +54678,7 @@ __exitcall_ebc_exit:
 	.string	"MODULE_STATE_COMING"
 .LASF2231:
 	.string	"offline_disabled"
-.LASF3189:
+.LASF3190:
 	.string	"of_property_read_u32_array"
 .LASF2476:
 	.string	"select"
@@ -54696,7 +54702,7 @@ __exitcall_ebc_exit:
 	.string	"async_put_work"
 .LASF2116:
 	.string	"kernfs_syscall_ops"
-.LASF2983:
+.LASF2984:
 	.string	"ebc_last_display"
 .LASF1857:
 	.string	"mknod"
@@ -54704,7 +54710,7 @@ __exitcall_ebc_exit:
 	.string	"SYSTEM_BOOTING"
 .LASF1600:
 	.string	"max_freq_scale"
-.LASF2921:
+.LASF2922:
 	.string	"dma_direct_ops"
 .LASF2252:
 	.string	"dev_pm_info"
@@ -54718,7 +54724,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pagemap"
 .LASF2648:
 	.string	"PGDEACTIVATE"
-.LASF3106:
+.LASF3107:
 	.string	"buffer_old_tmp"
 .LASF1784:
 	.string	"writepages"
@@ -54738,13 +54744,13 @@ __exitcall_ebc_exit:
 	.string	"writeback_control"
 .LASF1904:
 	.string	"fl_end"
-.LASF3273:
+.LASF3274:
 	.string	"ebc_find_buf_by_phy_addr"
 .LASF1951:
 	.string	"super_operations"
 .LASF394:
 	.string	"want_pages"
-.LASF2947:
+.LASF2948:
 	.string	"regmap_base"
 .LASF338:
 	.string	"wps_disabled"
@@ -54770,7 +54776,7 @@ __exitcall_ebc_exit:
 	.string	"i_security"
 .LASF2644:
 	.string	"PGSCAN_SKIP_NORMAL"
-.LASF2919:
+.LASF2920:
 	.string	"nents"
 .LASF756:
 	.string	"__smp_cross_call"
@@ -54778,13 +54784,13 @@ __exitcall_ebc_exit:
 	.string	"core"
 .LASF1815:
 	.string	"bd_holders"
-.LASF3096:
+.LASF3097:
 	.string	"reset_and_flip"
-.LASF2948:
+.LASF2949:
 	.string	"enable"
 .LASF955:
 	.string	"pipe_bufs"
-.LASF3210:
+.LASF3211:
 	.string	"to_user"
 .LASF2124:
 	.string	"KOBJ_NS_TYPE_NET"
@@ -54804,7 +54810,7 @@ __exitcall_ebc_exit:
 	.string	"__rb_parent_color"
 .LASF2224:
 	.string	"devres_lock"
-.LASF3133:
+.LASF3134:
 	.string	"new_buffer_refresh"
 .LASF365:
 	.string	"bits"
@@ -54820,17 +54826,17 @@ __exitcall_ebc_exit:
 	.string	"lookup"
 .LASF1590:
 	.string	"cpu_topology"
-.LASF3214:
+.LASF3215:
 	.string	"sp_el0"
-.LASF3277:
+.LASF3278:
 	.string	"ebc_dsp_buf_get"
-.LASF2897:
+.LASF2898:
 	.string	"panel_color"
 .LASF1896:
 	.string	"fl_owner"
 .LASF2851:
 	.string	"WF_TYPE_GLD16"
-.LASF2995:
+.LASF2996:
 	.string	"is_power_off"
 .LASF979:
 	.string	"vm_private_data"
@@ -54844,7 +54850,7 @@ __exitcall_ebc_exit:
 	.string	"kobj_type"
 .LASF2622:
 	.string	"sysctl_overcommit_kbytes"
-.LASF2967:
+.LASF2968:
 	.string	"frame_left"
 .LASF2479:
 	.string	"deactivate"
@@ -54852,7 +54858,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_AUTO"
 .LASF1227:
 	.string	"i_pages"
-.LASF3173:
+.LASF3174:
 	.string	"safe_ptr"
 .LASF376:
 	.string	"hlist_bl_head"
@@ -54882,9 +54888,9 @@ __exitcall_ebc_exit:
 	.string	"unix_inflight"
 .LASF1726:
 	.string	"holders_dir"
-.LASF3066:
+.LASF3067:
 	.string	"__wq_entry"
-.LASF3080:
+.LASF3081:
 	.string	"new_buffer"
 .LASF463:
 	.string	"i_fsnotify_mask"
@@ -54892,7 +54898,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_LOW_WMARK_HIT_QUICKLY"
 .LASF994:
 	.string	"syscfs"
-.LASF3166:
+.LASF3167:
 	.string	"wake_unlock"
 .LASF2445:
 	.string	"graph_get_port_parent"
@@ -54900,7 +54906,7 @@ __exitcall_ebc_exit:
 	.string	"UNEVICTABLE_PGRESCUED"
 .LASF2209:
 	.string	"msi_list"
-.LASF3216:
+.LASF3217:
 	.string	"__ilog2_u64"
 .LASF547:
 	.string	"compat_time_t"
@@ -54924,7 +54930,7 @@ __exitcall_ebc_exit:
 	.string	"cap_effective"
 .LASF1746:
 	.string	"taints"
-.LASF3232:
+.LASF3233:
 	.string	"of_address_to_resource"
 .LASF1012:
 	.string	"enqueued"
@@ -54934,7 +54940,7 @@ __exitcall_ebc_exit:
 	.string	"hex_asc_upper"
 .LASF506:
 	.string	"s_roots"
-.LASF2909:
+.LASF2910:
 	.string	"dma_data_direction"
 .LASF1689:
 	.string	"d_rt_spc_timer"
@@ -54952,7 +54958,7 @@ __exitcall_ebc_exit:
 	.string	"bd_private"
 .LASF1903:
 	.string	"fl_start"
-.LASF3188:
+.LASF3189:
 	.string	"out_value"
 .LASF1961:
 	.string	"freeze_fs"
@@ -54960,7 +54966,7 @@ __exitcall_ebc_exit:
 	.string	"sigset_t"
 .LASF1917:
 	.string	"lm_notify"
-.LASF3145:
+.LASF3146:
 	.string	"ebc_tcon_dsp_mode_set"
 .LASF880:
 	.string	"running"
@@ -54986,7 +54992,7 @@ __exitcall_ebc_exit:
 	.string	"d_automount"
 .LASF1265:
 	.string	"page_free"
-.LASF3093:
+.LASF3094:
 	.string	"__val"
 .LASF1481:
 	.string	"NR_FILE_MAPPED"
@@ -54998,19 +55004,19 @@ __exitcall_ebc_exit:
 	.string	"copy_file_range"
 .LASF2685:
 	.string	"UNEVICTABLE_PGCLEARED"
-.LASF3263:
+.LASF3264:
 	.string	"epd_lut_get_wf_version"
 .LASF2047:
 	.string	"key_type"
 .LASF797:
 	.string	"WORK_STRUCT_LINKED_BIT"
-.LASF3207:
+.LASF3208:
 	.string	"copy_overflow"
 .LASF2441:
 	.string	"get_named_child_node"
 .LASF2258:
 	.string	"is_suspended"
-.LASF2917:
+.LASF2918:
 	.string	"dma_length"
 .LASF2066:
 	.string	"burst"
@@ -55018,15 +55024,15 @@ __exitcall_ebc_exit:
 	.string	"clone_mnt_data"
 .LASF2777:
 	.string	"module_kobject"
-.LASF3043:
+.LASF3044:
 	.string	"memory"
-.LASF3180:
+.LASF3181:
 	.string	"order"
 .LASF739:
 	.string	"active_memcg"
 .LASF1332:
 	.string	"def_flags"
-.LASF2999:
+.LASF3000:
 	.string	"global_ebc"
 .LASF1473:
 	.string	"NR_SLAB_UNRECLAIMABLE"
@@ -55034,7 +55040,7 @@ __exitcall_ebc_exit:
 	.string	"refcount"
 .LASF1790:
 	.string	"invalidatepage"
-.LASF3070:
+.LASF3071:
 	.string	"ebc_frame_timeout"
 .LASF363:
 	.string	"wait_queue_head_t"
@@ -55056,7 +55062,7 @@ __exitcall_ebc_exit:
 	.string	"EPD_A2"
 .LASF2102:
 	.string	"kernfs_elem_attr"
-.LASF3083:
+.LASF3084:
 	.string	"new_buffer_temp"
 .LASF2299:
 	.string	"set_latency_tolerance"
@@ -55070,7 +55076,7 @@ __exitcall_ebc_exit:
 	.string	"arm64_ftr_reg_ctrel0"
 .LASF1244:
 	.string	"counters"
-.LASF3223:
+.LASF3224:
 	.string	"kasan_check_read"
 .LASF2059:
 	.string	"name_link"
@@ -55090,9 +55096,9 @@ __exitcall_ebc_exit:
 	.string	"policy"
 .LASF1293:
 	.string	"shared"
-.LASF3016:
+.LASF3017:
 	.string	"ebc_match"
-.LASF2946:
+.LASF2947:
 	.string	"dclk"
 .LASF2217:
 	.string	"dma_mem"
@@ -55112,7 +55118,7 @@ __exitcall_ebc_exit:
 	.string	"module_sysfs_initialized"
 .LASF1002:
 	.string	"task_cputime"
-.LASF2970:
+.LASF2971:
 	.string	"lut_addr"
 .LASF1196:
 	.string	"rnode"
@@ -55122,7 +55128,7 @@ __exitcall_ebc_exit:
 	.string	"__con_initcall_start"
 .LASF1717:
 	.string	"get_dqblk"
-.LASF3028:
+.LASF3029:
 	.string	"ebc_tcon_node"
 .LASF2817:
 	.string	"id_entry"
@@ -55132,7 +55138,7 @@ __exitcall_ebc_exit:
 	.string	"nr_irqs"
 .LASF894:
 	.string	"max_hang_time"
-.LASF3169:
+.LASF3170:
 	.string	"copy_from_user"
 .LASF2467:
 	.string	"DOMAIN_BUS_ANY"
@@ -55140,15 +55146,15 @@ __exitcall_ebc_exit:
 	.string	"root_user"
 .LASF2090:
 	.string	"subdirs"
-.LASF2886:
+.LASF2887:
 	.string	"EPD_DU"
 .LASF1883:
 	.string	"mmap_miss"
 .LASF1654:
 	.string	"quota_format_ops"
-.LASF3275:
+.LASF3276:
 	.string	"ebc_osd_buf_get"
-.LASF3061:
+.LASF3062:
 	.string	"argp"
 .LASF1754:
 	.string	"args"
@@ -55160,13 +55166,13 @@ __exitcall_ebc_exit:
 	.string	"run_delay"
 .LASF1998:
 	.string	"fi_extents_start"
-.LASF2929:
+.LASF2930:
 	.string	"dummy_dma_ops"
 .LASF238:
 	.string	"static_key_initialized"
 .LASF2784:
 	.string	"module_uevent"
-.LASF3074:
+.LASF3075:
 	.string	"is_full_mode"
 .LASF2597:
 	.string	"base_pfn"
@@ -55174,29 +55180,29 @@ __exitcall_ebc_exit:
 	.string	"width"
 .LASF929:
 	.string	"_addr_pkey"
-.LASF3057:
+.LASF3058:
 	.string	"waveform_buffer"
 .LASF296:
 	.string	"__start_rodata"
 .LASF1468:
 	.string	"NR_ACTIVE_ANON"
-.LASF2932:
+.LASF2933:
 	.string	"tcon"
 .LASF1115:
 	.string	"thread_keyring"
 .LASF2745:
 	.string	"kparam_array"
-.LASF3225:
+.LASF3226:
 	.string	"platform_driver_unregister"
 .LASF652:
 	.string	"utime"
 .LASF1334:
 	.string	"start_code"
-.LASF3017:
+.LASF3018:
 	.string	"ebc_driver"
 .LASF2605:
 	.string	"dev_page_free_t"
-.LASF3186:
+.LASF3187:
 	.string	"of_property_read_u32"
 .LASF1398:
 	.string	"guid_t"
@@ -55216,7 +55222,7 @@ __exitcall_ebc_exit:
 	.string	"tz_minuteswest"
 .LASF2459:
 	.string	"of_chosen"
-.LASF3094:
+.LASF3095:
 	.string	"ebc_frame_start"
 .LASF348:
 	.string	"sve_state"
@@ -55226,7 +55232,7 @@ __exitcall_ebc_exit:
 	.string	"cpumask_t"
 .LASF133:
 	.string	"kmsg_fops"
-.LASF3272:
+.LASF3273:
 	.string	"ebc_buf_release"
 .LASF819:
 	.string	"WORK_STRUCT_NO_POOL"
@@ -55248,7 +55254,7 @@ __exitcall_ebc_exit:
 	.string	"sched_rt_entity"
 .LASF116:
 	.string	"sendpage"
-.LASF3139:
+.LASF3140:
 	.string	"ret_val"
 .LASF866:
 	.string	"timerqueue_node"
@@ -55258,7 +55264,7 @@ __exitcall_ebc_exit:
 	.string	"mem_dqblk"
 .LASF2772:
 	.string	"plt_entry"
-.LASF3147:
+.LASF3148:
 	.string	"display_mode"
 .LASF1980:
 	.string	"nr_cached_objects"
@@ -55290,11 +55296,11 @@ __exitcall_ebc_exit:
 	.string	"fops"
 .LASF1273:
 	.string	"f_path"
-.LASF3239:
+.LASF3240:
 	.string	"kthread_create_on_node"
 .LASF711:
 	.string	"cgroups"
-.LASF3172:
+.LASF3173:
 	.string	"__uaccess_mask_ptr"
 .LASF2344:
 	.string	"probe_type"
@@ -55314,9 +55320,9 @@ __exitcall_ebc_exit:
 	.string	"userspace_clients"
 .LASF2143:
 	.string	"uevent_seqnum"
-.LASF3235:
+.LASF3236:
 	.string	"memset"
-.LASF3144:
+.LASF3145:
 	.string	"cur_image_addr"
 .LASF2144:
 	.string	"list_lock"
@@ -55350,7 +55356,7 @@ __exitcall_ebc_exit:
 	.string	"file_lock_operations"
 .LASF343:
 	.string	"tp_value"
-.LASF3025:
+.LASF3026:
 	.string	"ebc_remove"
 .LASF1893:
 	.string	"fl_list"
@@ -55364,7 +55370,7 @@ __exitcall_ebc_exit:
 	.string	"qf_fmt_id"
 .LASF1050:
 	.string	"nr_wakeups_idle"
-.LASF3280:
+.LASF3281:
 	.string	"up_write"
 .LASF1458:
 	.string	"NR_MLOCK"
@@ -55380,11 +55386,11 @@ __exitcall_ebc_exit:
 	.string	"sysctl_drop_caches"
 .LASF1973:
 	.string	"show_devname"
-.LASF2941:
+.LASF2942:
 	.string	"panel_16bit"
 .LASF1322:
 	.string	"page_table_lock"
-.LASF3015:
+.LASF3016:
 	.string	"ebc_pm"
 .LASF2840:
 	.string	"sched_priority"
@@ -55400,7 +55406,7 @@ __exitcall_ebc_exit:
 	.string	"console_printk"
 .LASF702:
 	.string	"ioac"
-.LASF3200:
+.LASF3201:
 	.string	"__init_work"
 .LASF1171:
 	.string	"nr_to_scan"
@@ -55412,7 +55418,7 @@ __exitcall_ebc_exit:
 	.string	"exec_max"
 .LASF1403:
 	.string	"uuid_index"
-.LASF3201:
+.LASF3202:
 	.string	"onstack"
 .LASF189:
 	.string	"compat_rmtp"
@@ -55440,7 +55446,7 @@ __exitcall_ebc_exit:
 	.string	"__i_nlink"
 .LASF144:
 	.string	"panic_on_warn"
-.LASF3068:
+.LASF3069:
 	.string	"ebc_panel_probe"
 .LASF79:
 	.string	"boot_command_line"
@@ -55458,13 +55464,13 @@ __exitcall_ebc_exit:
 	.string	"d_spc_warns"
 .LASF1040:
 	.string	"nr_failed_migrations_hot"
-.LASF2933:
+.LASF2934:
 	.string	"pmic"
 .LASF1136:
 	.string	"css_set"
 .LASF1402:
 	.string	"guid_index"
-.LASF2972:
+.LASF2973:
 	.string	"ebc_irq_status"
 .LASF2544:
 	.string	"force_irqthreads"
@@ -55506,13 +55512,13 @@ __exitcall_ebc_exit:
 	.string	"d_rt_space"
 .LASF264:
 	.string	"name"
-.LASF3244:
+.LASF3245:
 	.string	"mod_timer"
 .LASF150:
 	.string	"early_boot_irqs_disabled"
 .LASF658:
 	.string	"nvcsw"
-.LASF3041:
+.LASF3042:
 	.string	"ebc_task_init"
 .LASF2832:
 	.string	"KMALLOC_NORMAL"
@@ -55532,7 +55538,7 @@ __exitcall_ebc_exit:
 	.string	"i_gid"
 .LASF1619:
 	.string	"quota_type"
-.LASF3101:
+.LASF3102:
 	.string	"buffer_old"
 .LASF1536:
 	.string	"high"
@@ -55548,11 +55554,11 @@ __exitcall_ebc_exit:
 	.string	"self_exec_id"
 .LASF1907:
 	.string	"fl_downgrade_time"
-.LASF2979:
+.LASF2980:
 	.string	"auto_frame_count"
 .LASF2104:
 	.string	"kernfs_ops"
-.LASF2976:
+.LASF2977:
 	.string	"auto_image_new"
 .LASF807:
 	.string	"WORK_CPU_UNBOUND"
@@ -55576,25 +55582,25 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_WRITE_PENDING"
 .LASF1296:
 	.string	"close"
-.LASF3127:
+.LASF3128:
 	.string	"image_fb_data"
-.LASF3039:
+.LASF3040:
 	.string	"klogo_buf"
-.LASF2892:
+.LASF2893:
 	.string	"EPD_POWER_OFF"
 .LASF1501:
 	.string	"zone_reclaim_stat"
-.LASF3002:
+.LASF3003:
 	.string	"ebc_wq"
 .LASF736:
 	.string	"memcg_oom_gfp_mask"
-.LASF3203:
+.LASF3204:
 	.string	"_msecs_to_jiffies"
 .LASF1683:
 	.string	"d_spc_timer"
 .LASF1759:
 	.string	"jump_entries"
-.LASF3211:
+.LASF3212:
 	.string	"test_ti_thread_flag"
 .LASF2255:
 	.string	"async_suspend"
@@ -55604,7 +55610,7 @@ __exitcall_ebc_exit:
 	.string	"read_pos"
 .LASF481:
 	.string	"super_block"
-.LASF3174:
+.LASF3175:
 	.string	"__addr"
 .LASF2322:
 	.string	"dma_coherent"
@@ -55642,7 +55648,7 @@ __exitcall_ebc_exit:
 	.string	"map_sg"
 .LASF1159:
 	.string	"nlink"
-.LASF3034:
+.LASF3035:
 	.string	"ulogo_addr_valid"
 .LASF2577:
 	.string	"percpu_ref"
@@ -55650,11 +55656,11 @@ __exitcall_ebc_exit:
 	.string	"devkmsg_log_str"
 .LASF254:
 	.string	"FTR_HIGHER_SAFE"
-.LASF3185:
+.LASF3186:
 	.string	"i2c_get_clientdata"
-.LASF3170:
+.LASF3171:
 	.string	"_copy_to_user"
-.LASF3218:
+.LASF3219:
 	.string	"test_bit"
 .LASF248:
 	.string	"__start___jump_table"
@@ -55670,7 +55676,7 @@ __exitcall_ebc_exit:
 	.string	"mems_allowed_seq"
 .LASF1770:
 	.string	"refcnt"
-.LASF3086:
+.LASF3087:
 	.string	"pbuf_new"
 .LASF2181:
 	.string	"thaw"
@@ -55686,9 +55692,9 @@ __exitcall_ebc_exit:
 	.string	"futex"
 .LASF1025:
 	.string	"wait_max"
-.LASF3242:
+.LASF3243:
 	.string	"wakeup_source_add"
-.LASF3163:
+.LASF3164:
 	.string	"ebc_pmic_suspend"
 .LASF1158:
 	.string	"result_mask"
@@ -55700,15 +55706,15 @@ __exitcall_ebc_exit:
 	.string	"dquot_operations"
 .LASF1224:
 	.string	"mapping"
-.LASF3195:
+.LASF3196:
 	.string	"resource_size"
-.LASF3240:
+.LASF3241:
 	.string	"wake_up_process"
 .LASF1354:
 	.string	"kioctx_table"
 .LASF852:
 	.string	"rb_right"
-.LASF3105:
+.LASF3106:
 	.string	"buffer_new_tmp"
 .LASF978:
 	.string	"vm_file"
@@ -55734,11 +55740,11 @@ __exitcall_ebc_exit:
 	.string	"__initdata_end"
 .LASF2501:
 	.string	"bus_lock"
-.LASF3182:
+.LASF3183:
 	.string	"kmalloc_type"
 .LASF387:
 	.string	"qstr"
-.LASF3104:
+.LASF3105:
 	.string	"gray_new"
 .LASF1092:
 	.string	"futex_state"
@@ -55746,7 +55752,7 @@ __exitcall_ebc_exit:
 	.string	"WORKINGSET_RESTORE"
 .LASF628:
 	.string	"sched_psi_wake_requeue"
-.LASF3204:
+.LASF3205:
 	.string	"check_copy_size"
 .LASF737:
 	.string	"memcg_oom_order"
@@ -55802,17 +55808,17 @@ __exitcall_ebc_exit:
 	.string	"core_state"
 .LASF868:
 	.string	"timerqueue_head"
-.LASF3241:
+.LASF3242:
 	.string	"sched_setscheduler_nocheck"
 .LASF1291:
 	.string	"f_wb_err"
-.LASF3198:
+.LASF3199:
 	.string	"schedule_work"
 .LASF2430:
 	.string	"rt_mutex"
 .LASF990:
 	.string	"rchar"
-.LASF3155:
+.LASF3156:
 	.string	"valid_dma_direction"
 .LASF1818:
 	.string	"bd_contains"
@@ -55834,7 +55840,7 @@ __exitcall_ebc_exit:
 	.string	"_pt_pad_1"
 .LASF1259:
 	.string	"_pt_pad_2"
-.LASF2971:
+.LASF2972:
 	.string	"buf_align16"
 .LASF2812:
 	.string	"cpuhp_tasks_frozen"
@@ -55848,13 +55854,13 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_FLAG_BITS"
 .LASF2448:
 	.string	"fwnode_endpoint"
-.LASF3067:
+.LASF3068:
 	.string	"__int"
 .LASF952:
 	.string	"epoll_watches"
 .LASF2677:
 	.string	"KCOMPACTD_WAKE"
-.LASF3122:
+.LASF3123:
 	.string	"refresh_new_image"
 .LASF2074:
 	.string	"non_rcu"
@@ -55888,7 +55894,7 @@ __exitcall_ebc_exit:
 	.string	"_uid"
 .LASF339:
 	.string	"hbp_break"
-.LASF3030:
+.LASF3031:
 	.string	"pmic_node"
 .LASF138:
 	.string	"panic_blink"
@@ -55928,13 +55934,13 @@ __exitcall_ebc_exit:
 	.string	"need"
 .LASF504:
 	.string	"s_encoding"
-.LASF3199:
+.LASF3200:
 	.string	"queue_work"
 .LASF1734:
 	.string	"gpl_crcs"
 .LASF1720:
 	.string	"get_state"
-.LASF3158:
+.LASF3159:
 	.string	"dma_handle"
 .LASF1359:
 	.string	"orig_pte"
@@ -55952,7 +55958,7 @@ __exitcall_ebc_exit:
 	.string	"__s8"
 .LASF352:
 	.string	"fault_code"
-.LASF3008:
+.LASF3009:
 	.string	"dev_attr_waveform_version"
 .LASF2211:
 	.string	"dma_mask"
@@ -55986,9 +55992,9 @@ __exitcall_ebc_exit:
 	.string	"__kernel_ulong_t"
 .LASF2606:
 	.string	"max_mapnr"
-.LASF2956:
+.LASF2957:
 	.string	"regmap"
-.LASF2924:
+.LASF2925:
 	.string	"shared_info"
 .LASF772:
 	.string	"read_cntp_tval_el0"
@@ -56002,13 +56008,13 @@ __exitcall_ebc_exit:
 	.string	"NR_WRITEBACK_TEMP"
 .LASF2513:
 	.string	"functionality"
-.LASF3109:
+.LASF3110:
 	.string	"clac_part_data_align8"
 .LASF305:
 	.string	"__ctors_end"
 .LASF2266:
 	.string	"wakeup_path"
-.LASF3259:
+.LASF3260:
 	.string	"ebc_buf_state_show"
 .LASF968:
 	.string	"vm_prev"
@@ -56024,7 +56030,7 @@ __exitcall_ebc_exit:
 	.string	"__u8"
 .LASF115:
 	.string	"lock"
-.LASF3162:
+.LASF3163:
 	.string	"ebc_pmic_resume"
 .LASF1562:
 	.string	"compact_cached_migrate_pfn"
@@ -56032,9 +56038,9 @@ __exitcall_ebc_exit:
 	.string	"PGALLOC_DMA32"
 .LASF2755:
 	.string	"param_ops_long"
-.LASF2997:
+.LASF2998:
 	.string	"overlay_start"
-.LASF2952:
+.LASF2953:
 	.string	"frame_addr_set"
 .LASF1077:
 	.string	"runtime"
@@ -56060,13 +56066,13 @@ __exitcall_ebc_exit:
 	.string	"xattr_handler"
 .LASF1426:
 	.string	"kiocb"
-.LASF2898:
+.LASF2899:
 	.string	"width_mm"
 .LASF1565:
 	.string	"compact_order_failed"
 .LASF1105:
 	.string	"fsuid"
-.LASF3212:
+.LASF3213:
 	.string	"flag"
 .LASF1475:
 	.string	"NR_ISOLATED_FILE"
@@ -56078,9 +56084,9 @@ __exitcall_ebc_exit:
 	.string	"managed_pages"
 .LASF2589:
 	.string	"__tracepoint_page_ref_set"
-.LASF3151:
+.LASF3152:
 	.string	"ebc_tcon_enable"
-.LASF3286:
+.LASF3287:
 	.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"
@@ -56106,8 +56112,6 @@ __exitcall_ebc_exit:
 	.string	"oom_reaper_list"
 .LASF353:
 	.string	"debug"
-.LASF3018:
-	.string	"__addressable_ebc_init2499"
 .LASF1549:
 	.string	"nr_reserved_highatomic"
 .LASF2364:
@@ -56130,13 +56134,13 @@ __exitcall_ebc_exit:
 	.string	"s_vop"
 .LASF1650:
 	.string	"qf_owner"
-.LASF3224:
+.LASF3225:
 	.string	"__write_once_size"
 .LASF2831:
 	.string	"kmalloc_cache_type"
 .LASF574:
 	.string	"mutex"
-.LASF3190:
+.LASF3191:
 	.string	"out_values"
 .LASF839:
 	.string	"pgd_t"
@@ -56148,9 +56152,9 @@ __exitcall_ebc_exit:
 	.string	"NR_VM_NODE_STAT_ITEMS"
 .LASF233:
 	.string	"raw_spinlock_t"
-.LASF2935:
+.LASF2936:
 	.string	"vir_width"
-.LASF3215:
+.LASF3216:
 	.string	"INIT_LIST_HEAD"
 .LASF1938:
 	.string	"fs_flags"
@@ -56166,11 +56170,11 @@ __exitcall_ebc_exit:
 	.string	"dma_pfn_offset"
 .LASF1189:
 	.string	"radix_tree_node"
-.LASF3217:
+.LASF3218:
 	.string	"sign_extend64"
 .LASF2313:
 	.string	"wake_irq"
-.LASF3032:
+.LASF3033:
 	.string	"ulogo_addr"
 .LASF859:
 	.string	"pcpu_fc"
@@ -56188,7 +56192,7 @@ __exitcall_ebc_exit:
 	.string	"ptraced"
 .LASF2751:
 	.string	"param_ops_short"
-.LASF3256:
+.LASF3257:
 	.string	"of_find_device_by_node"
 .LASF2553:
 	.string	"HRTIMER_SOFTIRQ"
@@ -56208,13 +56212,13 @@ __exitcall_ebc_exit:
 	.string	"d_lockref"
 .LASF2242:
 	.string	"rpm_request"
-.LASF3060:
+.LASF3061:
 	.string	"ebc_io_ctl"
 .LASF1149:
 	.string	"addr"
 .LASF2385:
 	.string	"device_private"
-.LASF3153:
+.LASF3154:
 	.string	"get_dma_ops"
 .LASF2697:
 	.string	"watermark_scale_factor"
@@ -56228,9 +56232,9 @@ __exitcall_ebc_exit:
 	.string	"mm_rss_stat"
 .LASF1722:
 	.string	"mkobj"
-.LASF2962:
+.LASF2963:
 	.string	"direct_buf_real_size"
-.LASF3276:
+.LASF3277:
 	.string	"__pm_relax"
 .LASF472:
 	.string	"d_delete"
@@ -56240,7 +56244,7 @@ __exitcall_ebc_exit:
 	.string	"begin"
 .LASF2736:
 	.string	"sh_link"
-.LASF3023:
+.LASF3024:
 	.string	"ebc_suspend"
 .LASF2357:
 	.string	"cls_msk"
@@ -56262,19 +56266,19 @@ __exitcall_ebc_exit:
 	.string	"num_resources"
 .LASF1575:
 	.string	"notifier_fn_t"
-.LASF3031:
+.LASF3032:
 	.string	"pmic_client"
 .LASF2571:
 	.string	"miscdevice"
 .LASF655:
 	.string	"time_in_state"
-.LASF3040:
+.LASF3041:
 	.string	"ebc_logo_init"
 .LASF1268:
 	.string	"kill"
 .LASF1029:
 	.string	"iowait_sum"
-.LASF3123:
+.LASF3124:
 	.string	"image_new"
 .LASF15:
 	.string	"__u64"
@@ -56300,13 +56304,13 @@ __exitcall_ebc_exit:
 	.string	"i_blkbits"
 .LASF2455:
 	.string	"value"
-.LASF2991:
+.LASF2992:
 	.string	"frame_timer"
 .LASF1032:
 	.string	"sum_sleep_runtime"
-.LASF3036:
+.LASF3037:
 	.string	"ulogo_addr_str"
-.LASF3097:
+.LASF3098:
 	.string	"flip"
 .LASF1078:
 	.string	"deadline"
@@ -56348,11 +56352,11 @@ __exitcall_ebc_exit:
 	.string	"read_dqblk"
 .LASF1615:
 	.string	"dq_flags"
-.LASF3100:
+.LASF3101:
 	.string	"buffer_new"
 .LASF212:
 	.string	"user_fpsimd_state"
-.LASF3255:
+.LASF3256:
 	.string	"device_create_file"
 .LASF520:
 	.string	"s_time_gran"
@@ -56376,15 +56380,15 @@ __exitcall_ebc_exit:
 	.string	"s_bdi"
 .LASF2856:
 	.string	"wf_table"
-.LASF3129:
+.LASF3130:
 	.string	"image_new_tmp"
 .LASF1731:
 	.string	"num_kp"
-.LASF3285:
+.LASF3286:
 	.string	"__pm_stay_awake"
 .LASF2564:
 	.string	"vmap_area_list"
-.LASF3005:
+.LASF3006:
 	.string	"ebc_auto_thread_sem"
 .LASF629:
 	.string	"in_execve"
@@ -56434,7 +56438,7 @@ __exitcall_ebc_exit:
 	.string	"names_cachep"
 .LASF784:
 	.string	"preset_lpj"
-.LASF2990:
+.LASF2991:
 	.string	"vdd_timer"
 .LASF2220:
 	.string	"archdata"
@@ -56486,7 +56490,7 @@ __exitcall_ebc_exit:
 	.string	"seeks"
 .LASF576:
 	.string	"task_struct"
-.LASF2899:
+.LASF2900:
 	.string	"height_mm"
 .LASF2639:
 	.string	"PGALLOC_MOVABLE"
@@ -56524,7 +56528,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_RESUMING"
 .LASF470:
 	.string	"d_weak_revalidate"
-.LASF2985:
+.LASF2986:
 	.string	"prev_dsp_buf"
 .LASF1492:
 	.string	"NR_VMSCAN_IMMEDIATE"
@@ -56540,7 +56544,7 @@ __exitcall_ebc_exit:
 	.string	"setup_max_cpus"
 .LASF1833:
 	.string	"i_nlink"
-.LASF2942:
+.LASF2943:
 	.string	"mirror"
 .LASF1787:
 	.string	"write_begin"
@@ -56548,11 +56552,11 @@ __exitcall_ebc_exit:
 	.string	"groups"
 .LASF693:
 	.string	"pi_blocked_on"
-.LASF3027:
+.LASF3028:
 	.string	"ebc_probe"
 .LASF500:
 	.string	"s_xattr"
-.LASF3037:
+.LASF3038:
 	.string	"klogo_addr_str"
 .LASF992:
 	.string	"syscr"
@@ -56586,7 +56590,7 @@ __exitcall_ebc_exit:
 	.string	"s_inode_list_lock"
 .LASF2599:
 	.string	"align"
-.LASF3108:
+.LASF3109:
 	.string	"frame_idx"
 .LASF203:
 	.string	"mm_segment_t"
@@ -56608,13 +56612,13 @@ __exitcall_ebc_exit:
 	.string	"maj_flt"
 .LASF228:
 	.string	"arch_rwlock_t"
-.LASF3274:
+.LASF3275:
 	.string	"ebc_osd_buf_clone"
 .LASF161:
 	.string	"c_false"
 .LASF899:
 	.string	"clock_base"
-.LASF2906:
+.LASF2907:
 	.string	"pmic_read_temperature"
 .LASF1797:
 	.string	"launder_page"
@@ -56634,7 +56638,7 @@ __exitcall_ebc_exit:
 	.string	"minor"
 .LASF1698:
 	.string	"nextents"
-.LASF3156:
+.LASF3157:
 	.string	"dma_direction"
 .LASF1:
 	.string	"sizetype"
@@ -56644,13 +56648,13 @@ __exitcall_ebc_exit:
 	.string	"arg_lock"
 .LASF1740:
 	.string	"num_exentries"
-.LASF3088:
+.LASF3089:
 	.string	"check_out"
 .LASF2608:
 	.string	"high_memory"
 .LASF48:
 	.string	"int32_t"
-.LASF3019:
+.LASF3020:
 	.string	"__exitcall_ebc_exit"
 .LASF1039:
 	.string	"nr_failed_migrations_running"
@@ -56658,7 +56662,7 @@ __exitcall_ebc_exit:
 	.string	"next_timer"
 .LASF740:
 	.string	"throttle_queue"
-.LASF3269:
+.LASF3270:
 	.string	"finish_wait"
 .LASF1479:
 	.string	"WORKINGSET_NODERECLAIM"
@@ -56668,7 +56672,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_REQ_RESUME"
 .LASF2044:
 	.string	"keyring_index_key"
-.LASF3150:
+.LASF3151:
 	.string	"ebc_tcon_disable"
 .LASF1420:
 	.string	"leases_enable"
@@ -56684,7 +56688,7 @@ __exitcall_ebc_exit:
 	.string	"user_struct"
 .LASF2365:
 	.string	"ns_type"
-.LASF2887:
+.LASF2888:
 	.string	"EPD_DU4"
 .LASF588:
 	.string	"on_rq"
@@ -56692,7 +56696,7 @@ __exitcall_ebc_exit:
 	.string	"lock_key"
 .LASF2562:
 	.string	"tramp_pg_dir"
-.LASF3012:
+.LASF3013:
 	.string	"dev_attr_ebc_version"
 .LASF863:
 	.string	"PCPU_FC_NR"
@@ -56710,7 +56714,7 @@ __exitcall_ebc_exit:
 	.string	"num_vf"
 .LASF1534:
 	.string	"isolate_mode_t"
-.LASF3157:
+.LASF3158:
 	.string	"debug_dma_sync_single_for_device"
 .LASF98:
 	.string	"llseek"
@@ -56744,7 +56748,7 @@ __exitcall_ebc_exit:
 	.string	"file_lock"
 .LASF324:
 	.string	"__idmap_text_end"
-.LASF2964:
+.LASF2965:
 	.string	"frame_total"
 .LASF775:
 	.string	"read_cntvct_el0"
@@ -56752,9 +56756,9 @@ __exitcall_ebc_exit:
 	.string	"target"
 .LASF2545:
 	.string	"HI_SOFTIRQ"
-.LASF3159:
+.LASF3160:
 	.string	"direction"
-.LASF3128:
+.LASF3129:
 	.string	"image_bg_data"
 .LASF957:
 	.string	"session_keyring"
@@ -56764,7 +56768,7 @@ __exitcall_ebc_exit:
 	.string	"key_restrict_link_func_t"
 .LASF1484:
 	.string	"NR_WRITEBACK"
-.LASF3114:
+.LASF3115:
 	.string	"frame_count"
 .LASF486:
 	.string	"s_maxbytes"
@@ -56778,7 +56782,7 @@ __exitcall_ebc_exit:
 	.string	"i2c_bus_type"
 .LASF884:
 	.string	"hrtimer_cpu_base"
-.LASF3281:
+.LASF3282:
 	.string	"ebc_notify"
 .LASF1390:
 	.string	"cb_head"
@@ -56806,7 +56810,7 @@ __exitcall_ebc_exit:
 	.string	"cpus_requested"
 .LASF2593:
 	.string	"__tracepoint_page_ref_mod_unless"
-.LASF3167:
+.LASF3168:
 	.string	"wake_lock_init"
 .LASF1185:
 	.string	"list_lru"
@@ -56830,7 +56834,7 @@ __exitcall_ebc_exit:
 	.string	"d_iput"
 .LASF107:
 	.string	"compat_ioctl"
-.LASF3175:
+.LASF3176:
 	.string	"__range_ok"
 .LASF286:
 	.string	"__start_ro_after_init"
@@ -56838,9 +56842,9 @@ __exitcall_ebc_exit:
 	.string	"num_poisoned_pages"
 .LASF904:
 	.string	"filter"
-.LASF3160:
+.LASF3161:
 	.string	"ebc_pmic_get_vcom"
-.LASF2943:
+.LASF2944:
 	.string	"ebc_tcon"
 .LASF2610:
 	.string	"sysctl_legacy_va_layout"
@@ -56924,13 +56928,13 @@ __exitcall_ebc_exit:
 	.string	"saved_sigmask"
 .LASF413:
 	.string	"d_time"
-.LASF2957:
+.LASF2958:
 	.string	"ebc_info"
 .LASF239:
 	.string	"entries"
 .LASF1000:
 	.string	"cpu_id"
-.LASF2950:
+.LASF2951:
 	.string	"dsp_mode_set"
 .LASF2651:
 	.string	"PGMAJFAULT"
@@ -56948,11 +56952,11 @@ __exitcall_ebc_exit:
 	.string	"power"
 .LASF265:
 	.string	"strict_mask"
-.LASF3268:
+.LASF3269:
 	.string	"init_wait_entry"
 .LASF2786:
 	.string	"module_state"
-.LASF3227:
+.LASF3228:
 	.string	"_dev_info"
 .LASF416:
 	.string	"d_subdirs"
@@ -56974,7 +56978,7 @@ __exitcall_ebc_exit:
 	.string	"wait_pidfd"
 .LASF1945:
 	.string	"s_umount_key"
-.LASF2927:
+.LASF2928:
 	.string	"xen_start_info"
 .LASF2457:
 	.string	"of_fwnode_ops"
@@ -56998,13 +57002,13 @@ __exitcall_ebc_exit:
 	.string	"removed_mem"
 .LASF247:
 	.string	"jump_label_t"
-.LASF3141:
+.LASF3142:
 	.string	"ebc_tcon_frame_start"
 .LASF2711:
 	.string	"Elf64_Half"
 .LASF2286:
 	.string	"use_autosuspend"
-.LASF3020:
+.LASF3021:
 	.string	"ebc_init"
 .LASF674:
 	.string	"nsproxy"
@@ -57012,7 +57016,7 @@ __exitcall_ebc_exit:
 	.string	"can_wakeup"
 .LASF2546:
 	.string	"TIMER_SOFTIRQ"
-.LASF3119:
+.LASF3120:
 	.string	"temp_data"
 .LASF1214:
 	.string	"xol_area"
@@ -57038,15 +57042,15 @@ __exitcall_ebc_exit:
 	.string	"init_on_free"
 .LASF1151:
 	.string	"nr_pages"
-.LASF3136:
+.LASF3137:
 	.string	"ebc_power_set"
 .LASF1761:
 	.string	"num_trace_bprintk_fmt"
-.LASF3221:
+.LASF3222:
 	.string	"__fls"
 .LASF1129:
 	.string	"ioprio"
-.LASF2993:
+.LASF2994:
 	.string	"is_early_suspend"
 .LASF1163:
 	.string	"rdev"
@@ -57068,9 +57072,9 @@ __exitcall_ebc_exit:
 	.string	"persistent_clock_is_local"
 .LASF2413:
 	.string	"dma_supported"
-.LASF3192:
+.LASF3193:
 	.string	"dev_set_drvdata"
-.LASF3282:
+.LASF3283:
 	.string	"epd_lut_get"
 .LASF1535:
 	.string	"per_cpu_pages"
@@ -57106,7 +57110,7 @@ __exitcall_ebc_exit:
 	.string	"BLOCK_SOFTIRQ"
 .LASF1411:
 	.string	"files_stat_struct"
-.LASF3233:
+.LASF3234:
 	.string	"devm_memremap"
 .LASF843:
 	.string	"pgtable_t"
@@ -57118,13 +57122,13 @@ __exitcall_ebc_exit:
 	.string	"symlink"
 .LASF1574:
 	.string	"mem_map"
-.LASF3081:
+.LASF3082:
 	.string	"old_buffer"
-.LASF2953:
+.LASF2954:
 	.string	"lut_data_set"
 .LASF790:
 	.string	"sysctl_timer_migration"
-.LASF2913:
+.LASF2914:
 	.string	"DMA_NONE"
 .LASF1898:
 	.string	"fl_type"
@@ -57174,7 +57178,7 @@ __exitcall_ebc_exit:
 	.string	"rm_xquota"
 .LASF1084:
 	.string	"dl_timer"
-.LASF3265:
+.LASF3266:
 	.string	"remap_pfn_range"
 .LASF2375:
 	.string	"DL_DEV_NO_DRIVER"
@@ -57188,7 +57192,7 @@ __exitcall_ebc_exit:
 	.string	"watermark"
 .LASF2423:
 	.string	"deadprops"
-.LASF3229:
+.LASF3230:
 	.string	"devm_kmalloc"
 .LASF16:
 	.string	"long long unsigned int"
@@ -57218,7 +57222,7 @@ __exitcall_ebc_exit:
 	.string	"flc_lease"
 .LASF2406:
 	.string	"unmap_resource"
-.LASF2988:
+.LASF2989:
 	.string	"wake_lock_is_set"
 .LASF2358:
 	.string	"driver_private"
@@ -57240,7 +57244,7 @@ __exitcall_ebc_exit:
 	.string	"__security_initcall_end"
 .LASF2160:
 	.string	"kobj_sysfs_ops"
-.LASF2889:
+.LASF2890:
 	.string	"EPD_RESET"
 .LASF2369:
 	.string	"device_dma_parameters"
@@ -57264,7 +57268,7 @@ __exitcall_ebc_exit:
 	.string	"pstate_check_t"
 .LASF830:
 	.string	"system_freezable_power_efficient_wq"
-.LASF3024:
+.LASF3025:
 	.string	"__func__"
 .LASF56:
 	.string	"resource_size_t"
@@ -57294,7 +57298,7 @@ __exitcall_ebc_exit:
 	.string	"__kernel_clock_t"
 .LASF392:
 	.string	"nr_unused"
-.LASF2916:
+.LASF2917:
 	.string	"dma_address"
 .LASF2615:
 	.string	"mmap_rnd_compat_bits_max"
@@ -57314,15 +57318,15 @@ __exitcall_ebc_exit:
 	.string	"vregs"
 .LASF2624:
 	.string	"page_entry_size"
-.LASF2974:
+.LASF2975:
 	.string	"lut_data"
-.LASF3095:
+.LASF3096:
 	.string	"ebc_other_init"
 .LASF1446:
 	.string	"free_list"
 .LASF589:
 	.string	"prio"
-.LASF3184:
+.LASF3185:
 	.string	"platform_get_drvdata"
 .LASF2555:
 	.string	"NR_SOFTIRQS"
@@ -57344,7 +57348,7 @@ __exitcall_ebc_exit:
 	.string	"atomic_t"
 .LASF812:
 	.string	"WORK_OFFQ_FLAG_BITS"
-.LASF3142:
+.LASF3143:
 	.string	"ebc_tcon_image_addr_set"
 .LASF2531:
 	.string	"max_num_msgs"
@@ -57360,11 +57364,11 @@ __exitcall_ebc_exit:
 	.string	"short int"
 .LASF2354:
 	.string	"of_device_id"
-.LASF2914:
+.LASF2915:
 	.string	"scatterlist"
 .LASF1267:
 	.string	"altmap_valid"
-.LASF3284:
+.LASF3285:
 	.string	"down"
 .LASF101:
 	.string	"read_iter"
@@ -57402,7 +57406,7 @@ __exitcall_ebc_exit:
 	.string	"pm_domain_data"
 .LASF2487:
 	.string	"byte"
-.LASF3253:
+.LASF3254:
 	.string	"__wake_up_sync"
 .LASF2002:
 	.string	"poll_table_struct"
@@ -57412,11 +57416,11 @@ __exitcall_ebc_exit:
 	.string	"current_may_mount"
 .LASF381:
 	.string	"seqlock_t"
-.LASF2945:
+.LASF2946:
 	.string	"hclk"
 .LASF2115:
 	.string	"kernfs_iattrs"
-.LASF2907:
+.LASF2908:
 	.string	"pmic_get_vcom"
 .LASF626:
 	.string	"sched_migrated"
@@ -57428,7 +57432,7 @@ __exitcall_ebc_exit:
 	.string	"page_fault"
 .LASF1469:
 	.string	"NR_INACTIVE_FILE"
-.LASF3208:
+.LASF3209:
 	.string	"__ret_warn_on"
 .LASF1625:
 	.string	"kqid"
@@ -57508,7 +57512,7 @@ __exitcall_ebc_exit:
 	.string	"__irqentry_text_end"
 .LASF1346:
 	.string	"context"
-.LASF3113:
+.LASF3114:
 	.string	"get_overlay_image"
 .LASF1540:
 	.string	"per_cpu_nodestat"
@@ -57520,7 +57524,7 @@ __exitcall_ebc_exit:
 	.string	"thread_id"
 .LASF732:
 	.string	"default_timer_slack_ns"
-.LASF3056:
+.LASF3057:
 	.string	"waveform_version_read"
 .LASF1767:
 	.string	"source_list"
@@ -57550,7 +57554,7 @@ __exitcall_ebc_exit:
 	.string	"of_match_table"
 .LASF2578:
 	.string	"percpu_count_ptr"
-.LASF3264:
+.LASF3265:
 	.string	"ebc_phy_buf_base_get"
 .LASF2079:
 	.string	"loops_per_jiffy"
@@ -57562,7 +57566,7 @@ __exitcall_ebc_exit:
 	.string	"uuid_t"
 .LASF2437:
 	.string	"property_read_int_array"
-.LASF2977:
+.LASF2978:
 	.string	"auto_image_old"
 .LASF1860:
 	.string	"setattr2"
@@ -57572,7 +57576,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_INODESTEAL"
 .LASF1175:
 	.string	"count_objects"
-.LASF3220:
+.LASF3221:
 	.string	"fls64"
 .LASF921:
 	.string	"_stime"
@@ -57590,9 +57594,9 @@ __exitcall_ebc_exit:
 	.string	"atomic_notifier_head"
 .LASF1060:
 	.string	"statistics"
-.LASF2934:
+.LASF2935:
 	.string	"current_buffer"
-.LASF3110:
+.LASF3111:
 	.string	"direct_mode_data_change"
 .LASF1618:
 	.string	"kprojid_t"
@@ -57608,15 +57612,15 @@ __exitcall_ebc_exit:
 	.string	"sync_sg_for_device"
 .LASF1964:
 	.string	"statfs"
-.LASF3247:
+.LASF3248:
 	.string	"__kmalloc"
-.LASF3236:
+.LASF3237:
 	.string	"_dev_err"
-.LASF3226:
+.LASF3227:
 	.string	"__platform_driver_register"
-.LASF2961:
+.LASF2962:
 	.string	"ebc_buf_real_size"
-.LASF3003:
+.LASF3004:
 	.string	"ebc_thread_wq"
 .LASF1794:
 	.string	"migratepage"
@@ -57624,7 +57628,7 @@ __exitcall_ebc_exit:
 	.string	"DROP_PAGECACHE"
 .LASF792:
 	.string	"work_struct"
-.LASF2896:
+.LASF2897:
 	.string	"height"
 .LASF1094:
 	.string	"task_group"
@@ -57642,6 +57646,8 @@ __exitcall_ebc_exit:
 	.string	"drop_ns"
 .LASF1422:
 	.string	"sysctl_protected_symlinks"
+.LASF3019:
+	.string	"__addressable_ebc_init2503"
 .LASF2623:
 	.string	"protection_map"
 .LASF2764:
@@ -57666,7 +57672,7 @@ __exitcall_ebc_exit:
 	.string	"max_comb_1st_msg_len"
 .LASF1545:
 	.string	"ZONE_MOVABLE"
-.LASF3007:
+.LASF3008:
 	.string	"ebc_misc"
 .LASF2392:
 	.string	"revmap_size"
@@ -57698,7 +57704,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_PENDING_BIT"
 .LASF720:
 	.string	"rseq"
-.LASF3121:
+.LASF3122:
 	.string	"get_auto_image"
 .LASF195:
 	.string	"nfds"
@@ -57712,17 +57718,17 @@ __exitcall_ebc_exit:
 	.string	"i_acl"
 .LASF1789:
 	.string	"bmap"
-.LASF3234:
+.LASF3235:
 	.string	"ebc_buf_init"
 .LASF2048:
 	.string	"key_payload"
-.LASF2980:
+.LASF2981:
 	.string	"auto_image_osd"
 .LASF480:
 	.string	"d_real"
 .LASF2560:
 	.string	"swapper_pg_end"
-.LASF3009:
+.LASF3010:
 	.string	"dev_attr_pmic_name"
 .LASF631:
 	.string	"in_user_fault"
@@ -57752,7 +57758,7 @@ __exitcall_ebc_exit:
 	.string	"fallocate"
 .LASF1707:
 	.string	"i_spc_warnlimit"
-.LASF3209:
+.LASF3210:
 	.string	"check_object_size"
 .LASF1515:
 	.string	"node_present_pages"
@@ -57802,7 +57808,7 @@ __exitcall_ebc_exit:
 	.string	"__idmap_text_start"
 .LASF1716:
 	.string	"set_info"
-.LASF3059:
+.LASF3060:
 	.string	"ebc_mmap"
 .LASF2619:
 	.string	"sysctl_admin_reserve_kbytes"
@@ -57814,9 +57820,9 @@ __exitcall_ebc_exit:
 	.string	"lock_ops"
 .LASF1326:
 	.string	"hiwater_vm"
-.LASF3053:
+.LASF3054:
 	.string	"pmic_vcom_read"
-.LASF3228:
+.LASF3229:
 	.string	"misc_deregister"
 .LASF1248:
 	.string	"compound_head"
@@ -57836,7 +57842,7 @@ __exitcall_ebc_exit:
 	.string	"bd_write_holder"
 .LASF2194:
 	.string	"poweroff_noirq"
-.LASF3231:
+.LASF3232:
 	.string	"of_parse_phandle"
 .LASF1858:
 	.string	"rename"
@@ -57856,9 +57862,9 @@ __exitcall_ebc_exit:
 	.string	"i_rt_spc_timelimit"
 .LASF139:
 	.string	"oops_in_progress"
-.LASF3006:
+.LASF3007:
 	.string	"ebc_ops"
-.LASF3033:
+.LASF3034:
 	.string	"klogo_addr"
 .LASF1651:
 	.string	"qf_next"
@@ -57866,9 +57872,9 @@ __exitcall_ebc_exit:
 	.string	"sync_single_for_cpu"
 .LASF793:
 	.string	"data"
-.LASF3177:
+.LASF3178:
 	.string	"kzalloc"
-.LASF3202:
+.LASF3203:
 	.string	"msecs_to_jiffies"
 .LASF1919:
 	.string	"lm_break"
@@ -57882,7 +57888,7 @@ __exitcall_ebc_exit:
 	.string	"personality"
 .LASF1825:
 	.string	"bd_queue"
-.LASF3021:
+.LASF3022:
 	.string	"ebc_resume"
 .LASF2829:
 	.string	"init_task"
@@ -57904,7 +57910,7 @@ __exitcall_ebc_exit:
 	.string	"signed char"
 .LASF375:
 	.string	"rcu_scheduler_active"
-.LASF3187:
+.LASF3188:
 	.string	"propname"
 .LASF2101:
 	.string	"priv"
@@ -57958,7 +57964,7 @@ __exitcall_ebc_exit:
 	.string	"arch"
 .LASF2261:
 	.string	"no_pm"
-.LASF2894:
+.LASF2895:
 	.string	"ebc_buf_info"
 .LASF936:
 	.string	"_kill"
@@ -57984,7 +57990,7 @@ __exitcall_ebc_exit:
 	.string	"sve_vl"
 .LASF2654:
 	.string	"PGSTEAL_KSWAPD"
-.LASF3035:
+.LASF3036:
 	.string	"klogo_addr_valid"
 .LASF2602:
 	.string	"MEMORY_DEVICE_PUBLIC"
@@ -58030,7 +58036,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_GCC16"
 .LASF2514:
 	.string	"i2c_lock_operations"
-.LASF3138:
+.LASF3139:
 	.string	"ebc_get_4pix_wf_part"
 .LASF1620:
 	.string	"USRQUOTA"
@@ -58038,7 +58044,7 @@ __exitcall_ebc_exit:
 	.string	"description"
 .LASF2797:
 	.string	"symtab"
-.LASF2918:
+.LASF2919:
 	.string	"sg_table"
 .LASF1124:
 	.string	"rt_mutex_waiter"
@@ -58052,7 +58058,7 @@ __exitcall_ebc_exit:
 	.string	"in_iowait"
 .LASF2586:
 	.string	"unregfunc"
-.LASF2904:
+.LASF2905:
 	.string	"pmic_pm_suspend"
 .LASF1104:
 	.string	"egid"
@@ -58076,9 +58082,9 @@ __exitcall_ebc_exit:
 	.string	"f_inode"
 .LASF2031:
 	.string	"procname"
-.LASF3118:
+.LASF3119:
 	.string	"point_data"
-.LASF3238:
+.LASF3239:
 	.string	"epd_lut_from_file_init"
 .LASF1669:
 	.string	"mark_dirty"
@@ -58102,21 +58108,21 @@ __exitcall_ebc_exit:
 	.string	"__kernel_clockid_t"
 .LASF685:
 	.string	"seccomp"
-.LASF3072:
+.LASF3073:
 	.string	"ebc_rst_panel"
 .LASF1791:
 	.string	"releasepage"
 .LASF1702:
 	.string	"qc_info"
-.LASF3073:
+.LASF3074:
 	.string	"ebc_thread"
-.LASF3087:
+.LASF3088:
 	.string	"pbuf_old"
-.LASF2888:
+.LASF2889:
 	.string	"EPD_A2_ENTER"
 .LASF1503:
 	.string	"recent_scanned"
-.LASF2936:
+.LASF2937:
 	.string	"vir_height"
 .LASF1743:
 	.string	"core_layout"
@@ -58128,7 +58134,7 @@ __exitcall_ebc_exit:
 	.string	"win_y1"
 .LASF2871:
 	.string	"win_y2"
-.LASF3082:
+.LASF3083:
 	.string	"buf_size"
 .LASF2088:
 	.string	"bitmap"
@@ -58168,11 +58174,11 @@ __exitcall_ebc_exit:
 	.string	"MIGRATE_SYNC_LIGHT"
 .LASF1037:
 	.string	"nr_migrations_cold"
-.LASF3051:
+.LASF3052:
 	.string	"ebc_version_read"
 .LASF303:
 	.string	"__end_once"
-.LASF2922:
+.LASF2923:
 	.string	"dma_noncoherent_ops"
 .LASF1505:
 	.string	"lists"
@@ -58188,7 +58194,7 @@ __exitcall_ebc_exit:
 	.string	"inactive_age"
 .LASF2603:
 	.string	"MEMORY_DEVICE_FS_DAX"
-.LASF2965:
+.LASF2966:
 	.string	"frame_bw_total"
 .LASF2795:
 	.string	"ro_after_init_size"
@@ -58232,7 +58238,7 @@ __exitcall_ebc_exit:
 	.string	"percpu_size"
 .LASF1323:
 	.string	"mmap_sem"
-.LASF3266:
+.LASF3267:
 	.string	"schedule"
 .LASF2442:
 	.string	"get_reference_args"
@@ -58292,7 +58298,7 @@ __exitcall_ebc_exit:
 	.string	"ki_flags"
 .LASF1391:
 	.string	"gp_type"
-.LASF2968:
+.LASF2969:
 	.string	"part_mode_count"
 .LASF400:
 	.string	"d_in_lookup_hash"
@@ -58318,7 +58324,7 @@ __exitcall_ebc_exit:
 	.string	"lock_stat"
 .LASF2394:
 	.string	"revmap_tree_mutex"
-.LASF3055:
+.LASF3056:
 	.string	"pmic_name_read"
 .LASF1079:
 	.string	"dl_throttled"
@@ -58338,7 +58344,7 @@ __exitcall_ebc_exit:
 	.string	"restore_noirq"
 .LASF1427:
 	.string	"ki_filp"
-.LASF3112:
+.LASF3113:
 	.string	"clac_full_data_align16"
 .LASF1112:
 	.string	"cap_ambient"
@@ -58346,7 +58352,7 @@ __exitcall_ebc_exit:
 	.string	"dma_configure"
 .LASF2292:
 	.string	"runtime_error"
-.LASF3063:
+.LASF3064:
 	.string	"temp_offset"
 .LASF949:
 	.string	"__count"
@@ -58360,7 +58366,7 @@ __exitcall_ebc_exit:
 	.string	"PROBE_DEFAULT_STRATEGY"
 .LASF2746:
 	.string	"elemsize"
-.LASF3102:
+.LASF3103:
 	.string	"clac_part_data_align16"
 .LASF891:
 	.string	"nr_events"
@@ -58374,7 +58380,7 @@ __exitcall_ebc_exit:
 	.string	"text_size"
 .LASF1653:
 	.string	"stat"
-.LASF2984:
+.LASF2985:
 	.string	"lut_ddr_vir"
 .LASF1321:
 	.string	"map_count"
@@ -58388,7 +58394,7 @@ __exitcall_ebc_exit:
 	.string	"uid_keyring"
 .LASF725:
 	.string	"splice_pipe"
-.LASF3091:
+.LASF3092:
 	.string	"frame_done_callback"
 .LASF1800:
 	.string	"error_remove_page"
@@ -58432,7 +58438,7 @@ __exitcall_ebc_exit:
 	.string	"compound_mapcount"
 .LASF1449:
 	.string	"zone_stat_item"
-.LASF3179:
+.LASF3180:
 	.string	"kmalloc_large"
 .LASF2626:
 	.string	"PE_SIZE_PMD"
@@ -58470,7 +58476,7 @@ __exitcall_ebc_exit:
 	.string	"gp_count"
 .LASF2051:
 	.string	"key_restriction"
-.LASF3079:
+.LASF3080:
 	.string	"check_part_mode"
 .LASF618:
 	.string	"exit_state"
@@ -58502,9 +58508,9 @@ __exitcall_ebc_exit:
 	.string	"fs_supers"
 .LASF1131:
 	.string	"last_waited"
-.LASF3058:
+.LASF3059:
 	.string	"ebc_open"
-.LASF3148:
+.LASF3149:
 	.string	"three_win_mode"
 .LASF2874:
 	.string	"EPD_OVERLAY"
@@ -58512,7 +58518,7 @@ __exitcall_ebc_exit:
 	.string	"dqb_bsoftlimit"
 .LASF218:
 	.string	"pending"
-.LASF2981:
+.LASF2982:
 	.string	"direct_buffer"
 .LASF2492:
 	.string	"i2c_client_type"
@@ -58538,7 +58544,7 @@ __exitcall_ebc_exit:
 	.string	"pt_mm"
 .LASF1504:
 	.string	"lruvec"
-.LASF2900:
+.LASF2901:
 	.string	"ebc_pmic"
 .LASF14:
 	.string	"long long int"
@@ -58556,7 +58562,7 @@ __exitcall_ebc_exit:
 	.string	"timer_expires"
 .LASF2827:
 	.string	"mmlist_lock"
-.LASF3165:
+.LASF3166:
 	.string	"ebc_pmic_power_on"
 .LASF1765:
 	.string	"trace_evals"
@@ -58598,7 +58604,7 @@ __exitcall_ebc_exit:
 	.string	"relax_count"
 .LASF1413:
 	.string	"nr_free_files"
-.LASF3178:
+.LASF3179:
 	.string	"kmalloc"
 	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
 	.section	.note.GNU-stack,"",@progbits

commit 61050cb9e452f5d0f1195d8f485219c5a500c38b
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Thu Jul 15 10:23:55 2021 +0800

    arm64: dts: rockchip: rk3566-eink: change dmc freq level
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: I8b06eff47c6a7e07a375d818c9f4c1833dd77cd5

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi
index 09791eb16abf..0a696c426dff 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi
@@ -48,6 +48,12 @@
 &dmc {
 	center-supply = <&vdd_logic>;
 	auto-freq-en = <0>;
+	system-status-level = <
+		/*system status         freq level*/
+		SYS_STATUS_NORMAL       DMC_FREQ_LEVEL_HIGH
+		SYS_STATUS_REBOOT       DMC_FREQ_LEVEL_HIGH
+		SYS_STATUS_SUSPEND      DMC_FREQ_LEVEL_LOW
+	>;
 	status = "okay";
 };
 

commit 87c011cb829c935fce477bb230a1a49348a3047c
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Thu Jul 15 09:27:39 2021 +0800

    drm/rockchip: ebc_dev: release version v2.07
    
    overlay mode: black and white use du framecount,
    to fix trailing smear when draw line on grey background
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: If02bd8edb0c02a159a5359a231b487b09dfd26d2

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index 19825f6518fd..948af1dd397b 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -527,60 +527,649 @@ get_auto_image:
 	.size	get_auto_image, .-get_auto_image
 	.align	2
 	.p2align 3,,7
+	.type	get_overlay_image, %function
+get_overlay_image:
+.LFB2812:
+	.loc 1 618 0
+	.cfi_startproc
+.LVL32:
+	stp	x29, x30, [sp, -96]!
+	.cfi_def_cfa_offset 96
+	.cfi_offset 29, -96
+	.cfi_offset 30, -88
+	.loc 1 619 0
+	adrp	x5, .LANCHOR0
+	.loc 1 618 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 619 0
+	ldr	x17, [x5, #:lo12:.LANCHOR0]
+	.loc 1 618 0
+	stp	x19, x20, [sp, 16]
+	.loc 1 631 0
+	add	x17, x17, 24
+	.loc 1 618 0
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	str	x27, [sp, 80]
+	.cfi_offset 19, -80
+	.cfi_offset 20, -72
+	.cfi_offset 21, -64
+	.cfi_offset 22, -56
+	.cfi_offset 23, -48
+	.cfi_offset 24, -40
+	.cfi_offset 25, -32
+	.cfi_offset 26, -24
+	.cfi_offset 27, -16
+	.loc 1 637 0
+	ldp	w11, w18, [x17, 84]
+	.loc 1 631 0
+	ldr	w30, [x17, 156]
+	.loc 1 639 0
+	str	wzr, [x4, 36]
+.LVL33:
+	.loc 1 645 0
+	cmp	w18, 0
+	ble	.L66
+	lsr	w11, w11, 3
+.LVL34:
+	mov	w13, 0
+.LVL35:
+	sub	w16, w11, #1
+	.loc 1 657 0
+	mov	w12, 1
+	add	x16, x16, 1
+	.loc 1 795 0
+	mov	w15, -268435456
+	lsl	x19, x16, 3
+	lsl	x16, x16, 2
+	.loc 1 777 0
+	mov	w14, 251658240
+.LVL36:
+	.p2align 2
+.L99:
+	.loc 1 646 0
+	cbz	w30, .L68
+	.loc 1 647 0
+	ldp	w5, w10, [x17, 84]
+.LVL37:
+	sub	w10, w10, #1
+	sub	w10, w10, w13
+	mul	w10, w10, w5
+	lsr	w10, w10, 2
+	add	x10, x0, x10
+.LVL38:
+.L71:
+	add	x10, x10, 2
+.LVL39:
+	add	x7, x3, 8
+	.loc 1 651 0 discriminator 1
+	mov	x9, 0
+	cbz	w11, .L70
+	.p2align 2
+.L131:
+	.loc 1 654 0
+	ldr	w5, [x1, x9, lsl 2]
+.LVL40:
+	.loc 1 655 0
+	ldr	w6, [x2, x9, lsl 2]
+.LVL41:
+	.loc 1 656 0
+	cmp	w5, w6
+	beq	.L72
+	.loc 1 658 0
+	eor	w8, w5, w6
+	.loc 1 657 0
+	str	w12, [x4, 36]
+	.loc 1 653 0
+	mov	w20, 0
+	.loc 1 659 0
+	tst	x8, 15
+	beq	.L73
+	.loc 1 661 0
+	ldrb	w21, [x7, -8]
+	.loc 1 663 0
+	ubfiz	w20, w6, 8, 8
+	ldr	x23, [x4, 112]
+	add	w20, w20, w5, uxtb
+	.loc 1 669 0
+	ldrb	w22, [x4, 32]
+	.loc 1 662 0
+	lsl	w25, w21, 16
+	.loc 1 663 0
+	add	x20, x23, x20
+	.loc 1 667 0
+	ldrb	w24, [x4, 33]
+	.loc 1 666 0
+	ands	w23, w5, 15
+	.loc 1 667 0
+	ccmp	w23, 15, 4, ne
+	.loc 1 665 0
+	add	w21, w21, 1
+	.loc 1 663 0
+	ldrb	w20, [x20, w25, sxtw]
+	.loc 1 665 0
+	and	w21, w21, 255
+	.loc 1 667 0
+	csel	w22, w22, w24, ne
+	.loc 1 663 0
+	and	w20, w20, 3
+	.loc 1 670 0
+	cmp	w22, w21
+	beq	.L143
+.L75:
+	.loc 1 674 0
+	strb	w21, [x7, -8]
+.L73:
+	.loc 1 677 0
+	tst	w8, 240
+	beq	.L76
+	.loc 1 679 0
+	ldrb	w22, [x7, -7]
+	.loc 1 681 0
+	lsr	w21, w6, 4
+	ubfx	x23, x5, 4, 8
+	ubfiz	w21, w21, 8, 8
+	ldr	x24, [x4, 112]
+	add	w21, w21, w23
+	.loc 1 680 0
+	lsl	w27, w22, 16
+	.loc 1 678 0
+	and	w25, w5, 240
+	.loc 1 681 0
+	add	x24, x24, x21
+	.loc 1 683 0
+	add	w21, w22, 1
+	.loc 1 687 0
+	ldrb	w23, [x4, 32]
+	.loc 1 684 0
+	cmp	w25, 240
+	.loc 1 685 0
+	ldrb	w26, [x4, 33]
+	ccmp	w25, 0, 4, ne
+	.loc 1 681 0
+	ldrb	w22, [x24, w27, sxtw]
+	.loc 1 683 0
+	and	w21, w21, 255
+	.loc 1 685 0
+	csel	w23, w23, w26, ne
+	.loc 1 688 0
+	cmp	w23, w21
+	.loc 1 682 0
+	ubfiz	w22, w22, 2, 2
+	orr	w20, w22, w20
+	.loc 1 688 0
+	beq	.L144
+.L78:
+	.loc 1 692 0
+	strb	w21, [x7, -7]
+.L76:
+	.loc 1 695 0
+	tst	w8, 3840
+	beq	.L79
+	.loc 1 697 0
+	ldrb	w21, [x7, -6]
+	.loc 1 699 0
+	and	w23, w6, 65280
+	ldr	x24, [x4, 112]
+	ubfx	x22, x5, 8, 8
+	orr	w22, w22, w23
+	.loc 1 696 0
+	and	w23, w5, 3840
+	.loc 1 698 0
+	lsl	w26, w21, 16
+	.loc 1 703 0
+	ldrb	w25, [x4, 33]
+	.loc 1 699 0
+	add	x22, x24, x22, uxth
+	.loc 1 702 0
+	cmp	w23, 3840
+	.loc 1 705 0
+	ldrb	w24, [x4, 32]
+	.loc 1 703 0
+	ccmp	w23, 0, 4, ne
+	.loc 1 701 0
+	add	w21, w21, 1
+	.loc 1 699 0
+	ldrb	w22, [x22, w26, sxtw]
+	.loc 1 701 0
+	and	w21, w21, 255
+	.loc 1 703 0
+	csel	w24, w24, w25, ne
+	.loc 1 706 0
+	cmp	w24, w21
+	.loc 1 700 0
+	ubfiz	w22, w22, 4, 2
+	orr	w20, w22, w20
+	.loc 1 706 0
+	beq	.L145
+.L81:
+	.loc 1 710 0
+	strb	w21, [x7, -6]
+.L79:
+	.loc 1 713 0
+	tst	w8, 61440
+	beq	.L82
+	.loc 1 715 0
+	ldrb	w22, [x7, -5]
+	.loc 1 717 0
+	lsr	w21, w6, 12
+	ubfx	x23, x5, 12, 8
+	ubfiz	w21, w21, 8, 8
+	ldr	x24, [x4, 112]
+	add	w21, w21, w23
+	.loc 1 716 0
+	lsl	w27, w22, 16
+	.loc 1 714 0
+	and	w25, w5, 61440
+	.loc 1 717 0
+	add	x24, x24, x21
+	.loc 1 719 0
+	add	w21, w22, 1
+	.loc 1 723 0
+	ldrb	w23, [x4, 32]
+	.loc 1 720 0
+	cmp	w25, 61440
+	.loc 1 721 0
+	ldrb	w26, [x4, 33]
+	ccmp	w25, 0, 4, ne
+	.loc 1 717 0
+	ldrb	w22, [x24, w27, sxtw]
+	.loc 1 719 0
+	and	w21, w21, 255
+	.loc 1 721 0
+	csel	w23, w23, w26, ne
+	.loc 1 724 0
+	cmp	w23, w21
+	.loc 1 718 0
+	ubfiz	w22, w22, 6, 2
+	orr	w20, w22, w20
+	.loc 1 724 0
+	beq	.L146
+.L84:
+	.loc 1 728 0
+	strb	w21, [x7, -5]
+.L82:
+	.loc 1 731 0
+	strb	w20, [x10, -2]
+	.loc 1 734 0
+	tst	w8, 983040
+	.loc 1 733 0
+	mov	w20, 0
+	.loc 1 734 0
+	beq	.L85
+	.loc 1 738 0
+	lsr	w20, w6, 16
+	.loc 1 736 0
+	ldrb	w21, [x7, -4]
+	.loc 1 738 0
+	ubfx	x22, x5, 16, 8
+	ubfiz	w20, w20, 8, 8
+	add	w20, w20, w22
+	ldr	x22, [x4, 112]
+	.loc 1 737 0
+	lsl	w25, w21, 16
+	.loc 1 735 0
+	and	w23, w5, 983040
+	.loc 1 738 0
+	add	x20, x22, x20
+	.loc 1 742 0
+	ldrb	w24, [x4, 33]
+	.loc 1 741 0
+	cmp	w23, 983040
+	.loc 1 744 0
+	ldrb	w22, [x4, 32]
+	.loc 1 742 0
+	ccmp	w23, 0, 4, ne
+	.loc 1 740 0
+	add	w21, w21, 1
+	.loc 1 738 0
+	ldrb	w20, [x20, w25, sxtw]
+	.loc 1 740 0
+	and	w21, w21, 255
+	.loc 1 742 0
+	csel	w22, w22, w24, ne
+	.loc 1 738 0
+	and	w20, w20, 3
+	.loc 1 745 0
+	cmp	w22, w21
+	beq	.L147
+.L87:
+	.loc 1 749 0
+	strb	w21, [x7, -4]
+.L85:
+	.loc 1 752 0
+	tst	w8, 15728640
+	beq	.L88
+	.loc 1 754 0
+	ldrb	w22, [x7, -3]
+	.loc 1 756 0
+	lsr	w21, w6, 20
+	ubfx	x23, x5, 20, 8
+	ubfiz	w21, w21, 8, 8
+	ldr	x24, [x4, 112]
+	add	w21, w21, w23
+	.loc 1 755 0
+	lsl	w27, w22, 16
+	.loc 1 753 0
+	and	w25, w5, 15728640
+	.loc 1 756 0
+	add	x24, x24, x21
+	.loc 1 758 0
+	add	w21, w22, 1
+	.loc 1 762 0
+	ldrb	w23, [x4, 32]
+	.loc 1 759 0
+	cmp	w25, 15728640
+	.loc 1 760 0
+	ldrb	w26, [x4, 33]
+	ccmp	w25, 0, 4, ne
+	.loc 1 756 0
+	ldrb	w22, [x24, w27, sxtw]
+	.loc 1 758 0
+	and	w21, w21, 255
+	.loc 1 760 0
+	csel	w23, w23, w26, ne
+	.loc 1 763 0
+	cmp	w23, w21
+	.loc 1 757 0
+	ubfiz	w22, w22, 2, 2
+	orr	w20, w22, w20
+	.loc 1 763 0
+	beq	.L148
+.L90:
+	.loc 1 767 0
+	strb	w21, [x7, -3]
+.L88:
+	.loc 1 770 0
+	tst	w8, 251658240
+	beq	.L91
+	.loc 1 772 0
+	ldrb	w21, [x7, -2]
+	.loc 1 774 0
+	lsr	w22, w6, 24
+	lsr	w25, w5, 24
+	mov	w23, w22
+	ldr	x24, [x4, 112]
+	add	w22, w25, w23, lsl 8
+	.loc 1 773 0
+	lsl	w26, w21, 16
+	.loc 1 780 0
+	ldrb	w23, [x4, 32]
+	.loc 1 774 0
+	add	x22, x24, x22
+	.loc 1 778 0
+	ldrb	w25, [x4, 33]
+	.loc 1 777 0
+	ands	w24, w5, 251658240
+	.loc 1 776 0
+	add	w21, w21, 1
+	.loc 1 778 0
+	ccmp	w24, w14, 4, ne
+	.loc 1 776 0
+	and	w21, w21, 255
+	.loc 1 774 0
+	ldrb	w22, [x22, w26, sxtw]
+	.loc 1 778 0
+	csel	w23, w23, w25, ne
+	.loc 1 781 0
+	cmp	w23, w21
+	.loc 1 775 0
+	ubfiz	w22, w22, 4, 2
+	orr	w20, w22, w20
+	.loc 1 781 0
+	beq	.L149
+.L93:
+	.loc 1 785 0
+	strb	w21, [x7, -2]
+.L91:
+	.loc 1 788 0
+	tst	w8, -268435456
+	beq	.L94
+	.loc 1 790 0
+	ldrb	w8, [x7, -1]
+.LVL42:
+	.loc 1 792 0
+	lsr	w22, w5, 28
+	ldr	x23, [x4, 112]
+	lsr	w21, w6, 28
+	add	w21, w22, w21, lsl 8
+	.loc 1 795 0
+	ands	w5, w5, -268435456
+.LVL43:
+	.loc 1 791 0
+	lsl	w24, w8, 16
+	.loc 1 792 0
+	add	x21, x23, x21
+	.loc 1 798 0
+	ldrb	w22, [x4, 32]
+	.loc 1 796 0
+	ccmp	w5, w15, 4, ne
+	ldrb	w23, [x4, 33]
+	.loc 1 794 0
+	add	w8, w8, 1
+	.loc 1 792 0
+	ldrb	w21, [x21, w24, sxtw]
+	.loc 1 794 0
+	and	w8, w8, 255
+	.loc 1 796 0
+	csel	w22, w22, w23, ne
+	.loc 1 799 0
+	cmp	w22, w8
+	.loc 1 793 0
+	ubfiz	w21, w21, 6, 2
+	orr	w20, w21, w20
+	.loc 1 799 0
+	beq	.L150
+.L96:
+	.loc 1 803 0
+	strb	w8, [x7, -1]
+.LVL44:
+.L94:
+	.loc 1 806 0
+	str	w6, [x2, x9, lsl 2]
+	.loc 1 807 0
+	strb	w20, [x10, -1]
+.L97:
+	add	x9, x9, 1
+	add	x10, x10, 2
+	add	x7, x7, 8
+	.loc 1 651 0 discriminator 2
+	cmp	w11, w9
+	bgt	.L131
+	add	x3, x3, x19
+	add	x2, x2, x16
+	add	x1, x1, x16
+.L70:
+	.loc 1 645 0 discriminator 2
+	add	w13, w13, 1
+	cmp	w18, w13
+	bne	.L99
+.L66:
+	.loc 1 819 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldr	x27, [sp, 80]
+	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
+	.p2align 3
+.L149:
+	.cfi_restore_state
+	.loc 1 783 0
+	and	w6, w6, -251658241
+.LVL45:
+	.loc 1 782 0
+	mov	w21, 0
+	.loc 1 783 0
+	orr	w6, w24, w6
+.LVL46:
+	b	.L93
+.LVL47:
+	.p2align 3
+.L150:
+	.loc 1 801 0
+	and	w6, w6, 268435455
+.LVL48:
+	.loc 1 800 0
+	mov	w8, 0
+	.loc 1 801 0
+	orr	w6, w5, w6
+.LVL49:
+	b	.L96
+.LVL50:
+	.p2align 3
+.L148:
+	.loc 1 765 0
+	and	w6, w6, -15728641
+.LVL51:
+	.loc 1 764 0
+	mov	w21, 0
+	.loc 1 765 0
+	orr	w6, w25, w6
+.LVL52:
+	b	.L90
+	.p2align 3
+.L146:
+	.loc 1 726 0
+	and	w6, w6, -61441
+.LVL53:
+	.loc 1 725 0
+	mov	w21, 0
+	.loc 1 726 0
+	orr	w6, w25, w6
+.LVL54:
+	b	.L84
+	.p2align 3
+.L147:
+	.loc 1 747 0
+	and	w6, w6, -983041
+.LVL55:
+	.loc 1 746 0
+	mov	w21, 0
+	.loc 1 747 0
+	orr	w6, w23, w6
+.LVL56:
+	b	.L87
+	.p2align 3
+.L145:
+	.loc 1 708 0
+	and	w6, w6, -3841
+.LVL57:
+	.loc 1 707 0
+	mov	w21, 0
+	.loc 1 708 0
+	orr	w6, w23, w6
+.LVL58:
+	b	.L81
+	.p2align 3
+.L143:
+	.loc 1 672 0
+	bfi	w6, w23, 0, 4
+	.loc 1 671 0
+	mov	w21, 0
+	b	.L75
+	.p2align 3
+.L144:
+	.loc 1 690 0
+	and	w6, w6, -241
+.LVL59:
+	.loc 1 689 0
+	mov	w21, 0
+	.loc 1 690 0
+	orr	w6, w25, w6
+.LVL60:
+	b	.L78
+	.p2align 3
+.L72:
+	.loc 1 810 0
+	strb	wzr, [x10, -2]
+	.loc 1 811 0
+	strb	wzr, [x10, -1]
+	b	.L97
+	.p2align 3
+.L68:
+	.loc 1 649 0
+	ldr	w10, [x17, 84]
+	mul	w10, w13, w10
+	lsr	w10, w10, 2
+	add	x10, x0, x10
+.LVL61:
+	b	.L71
+	.cfi_endproc
+.LFE2812:
+	.size	get_overlay_image, .-get_overlay_image
+	.align	2
+	.p2align 3,,7
 	.type	ebc_open, %function
 ebc_open:
-.LFB2832:
-	.loc 1 1709 0
+.LFB2833:
+	.loc 1 1938 0
 	.cfi_startproc
-.LVL32:
-	.loc 1 1713 0
+.LVL62:
+	.loc 1 1942 0
 	mov	w0, 0
-.LVL33:
-	.loc 1 1710 0
+.LVL63:
+	.loc 1 1939 0
 	str	xzr, [x1, 104]
-	.loc 1 1713 0
+	.loc 1 1942 0
 	ret
 	.cfi_endproc
-.LFE2832:
+.LFE2833:
 	.size	ebc_open, .-ebc_open
 	.section	.exit.text,"ax",@progbits
 	.align	2
 	.type	ebc_exit, %function
 ebc_exit:
-.LFB2852:
-	.loc 1 2266 0
+.LFB2853:
+	.loc 1 2495 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2267 0
+	.loc 1 2496 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2266 0
+	.loc 1 2495 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2267 0
+	.loc 1 2496 0
 	bl	platform_driver_unregister
-.LVL34:
-	.loc 1 2268 0
+.LVL64:
+	.loc 1 2497 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2852:
+.LFE2853:
 	.size	ebc_exit, .-ebc_exit
 	.text
 	.align	2
 	.p2align 3,,7
 	.type	ebc_resume, %function
 ebc_resume:
-.LFB2850:
-	.loc 1 2228 0
+.LFB2851:
+	.loc 1 2457 0
 	.cfi_startproc
-.LVL35:
+.LVL65:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -589,35 +1178,35 @@ ebc_resume:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-.LBB926:
-.LBB927:
+.LBB928:
+.LBB929:
 	.file 2 "./include/linux/device.h"
 	.loc 2 1181 0
 	ldr	x19, [x0, 184]
-.LBE927:
-.LBE926:
-	.loc 1 2232 0
+.LBE929:
+.LBE928:
+	.loc 1 2461 0
 	ldr	x1, [x19, 16]
-.LBB928:
-.LBB929:
+.LBB930:
+.LBB931:
 	.file 3 "drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic.h"
 	.loc 3 45 0
 	mov	x0, x1
-.LVL36:
+.LVL66:
 	ldr	x1, [x1, 48]
 	blr	x1
-.LVL37:
-.LBE929:
-.LBE928:
-	.loc 1 2233 0
+.LVL67:
+.LBE931:
+.LBE930:
+	.loc 1 2462 0
 	str	wzr, [x19, 780]
-	.loc 1 2234 0
+	.loc 1 2463 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
-.LVL38:
-	.loc 1 2237 0
+.LVL68:
+	.loc 1 2466 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -627,85 +1216,85 @@ ebc_resume:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2850:
+.LFE2851:
 	.size	ebc_resume, .-ebc_resume
 	.align	2
 	.p2align 3,,7
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
-.LFB2827:
-	.loc 1 1408 0
+.LFB2828:
+	.loc 1 1637 0
 	.cfi_startproc
-.LVL39:
-	.loc 1 1409 0
+.LVL69:
+	.loc 1 1638 0
 	adrp	x0, .LANCHOR0
-.LVL40:
+.LVL70:
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1411 0
+	.loc 1 1640 0
 	ldr	w2, [x0, 608]
-	cbnz	w2, .L80
+	cbnz	w2, .L165
 	ret
 	.p2align 3
-.L80:
-	.loc 1 1408 0
+.L165:
+	.loc 1 1637 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-.LBB930:
-.LBB931:
+.LBB932:
+.LBB933:
 	.file 4 "./include/linux/wakelock.h"
 	.loc 4 68 0
 	add	x0, x0, 400
-.LBE931:
-.LBE930:
-	.loc 1 1408 0
+.LBE933:
+.LBE932:
+	.loc 1 1637 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1412 0
+	.loc 1 1641 0
 	str	wzr, [x0, 208]
-.LBB933:
-.LBB932:
+.LBB935:
+.LBB934:
 	.loc 4 68 0
 	bl	__pm_relax
-.LVL41:
-.LBE932:
-.LBE933:
-	.loc 1 1417 0
+.LVL71:
+.LBE934:
+.LBE935:
+	.loc 1 1646 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2827:
+.LFE2828:
 	.size	ebc_vdd_power_timeout, .-ebc_vdd_power_timeout
 	.align	2
 	.p2align 3,,7
 	.type	ebc_remove, %function
 ebc_remove:
-.LFB2848:
-	.loc 1 2204 0
+.LFB2849:
+	.loc 1 2433 0
 	.cfi_startproc
-.LVL42:
+.LVL72:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2205 0
+	.loc 1 2434 0
 	adrp	x0, .LANCHOR1
-.LVL43:
+.LVL73:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2204 0
+	.loc 1 2433 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2205 0
+	.loc 1 2434 0
 	add	x0, x0, 224
-	.loc 1 2204 0
-	.loc 1 2205 0
+	.loc 1 2433 0
+	.loc 1 2434 0
 	bl	misc_deregister
-.LVL44:
-	.loc 1 2208 0
+.LVL74:
+	.loc 1 2437 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -713,16 +1302,16 @@ ebc_remove:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2848:
+.LFE2849:
 	.size	ebc_remove, .-ebc_remove
 	.align	2
 	.p2align 3,,7
 	.type	ebc_mmap, %function
 ebc_mmap:
-.LFB2831:
-	.loc 1 1694 0
+.LFB2832:
+	.loc 1 1923 0
 	.cfi_startproc
-.LVL45:
+.LVL75:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -731,35 +1320,35 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1694 0
+	.loc 1 1923 0
 	mov	x19, x1
-	.loc 1 1697 0
+	.loc 1 1926 0
 	bl	ebc_phy_buf_base_get
-.LVL46:
-	.loc 1 1700 0
+.LVL76:
+	.loc 1 1929 0
 	lsr	x2, x0, 12
-	.loc 1 1698 0
+	.loc 1 1927 0
 	mov	x6, 16384
-	.loc 1 1700 0
+	.loc 1 1929 0
 	mov	x0, x19
-	.loc 1 1698 0
+	.loc 1 1927 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 1700 0
+	.loc 1 1929 0
 	ldp	x1, x3, [x19]
-	.loc 1 1698 0
+	.loc 1 1927 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 1700 0
+	.loc 1 1929 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
-.LVL47:
-	.loc 1 1703 0
+.LVL77:
+	.loc 1 1932 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 1706 0
+	.loc 1 1935 0
 	ldr	x19, [sp, 16]
-.LVL48:
+.LVL78:
 	csel	w0, w0, w1, eq
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
@@ -768,23 +1357,23 @@ ebc_mmap:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2831:
+.LFE2832:
 	.size	ebc_mmap, .-ebc_mmap
 	.align	2
 	.p2align 3,,7
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
-.LFB2830:
-	.loc 1 1493 0
+.LFB2831:
+	.loc 1 1722 0
 	.cfi_startproc
-.LVL49:
+.LVL79:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 1503 0
+	.loc 1 1732 0
 	cmp	w1, 28672
-	.loc 1 1493 0
+	.loc 1 1722 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -793,151 +1382,151 @@ ebc_io_ctl:
 	adrp	x19, __stack_chk_guard
 	stp	x21, x22, [sp, 32]
 	add	x0, x19, :lo12:__stack_chk_guard
-.LVL50:
+.LVL80:
 	str	x23, [sp, 48]
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
 	.cfi_offset 23, -112
-	.loc 1 1493 0
+	.loc 1 1722 0
 	mov	x21, x2
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 1495 0
+	.loc 1 1724 0
 	adrp	x0, .LANCHOR0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1503 0
-	bcc	.L88
+	.loc 1 1732 0
+	bcc	.L173
 	mov	w0, 28675
 	cmp	w1, w0
-	bls	.L89
+	bls	.L174
 	mov	w0, -28678
 	add	w0, w1, w0
 	cmp	w0, 1
-	bls	.L89
-.L88:
-	.loc 1 1519 0
+	bls	.L174
+.L173:
+	.loc 1 1748 0
 	mov	w0, 28677
 	cmp	w1, w0
-	beq	.L92
-	bls	.L221
+	beq	.L177
+	bls	.L306
 	mov	w0, 28680
 	cmp	w1, w0
-	beq	.L100
-	bls	.L222
+	beq	.L185
+	bls	.L307
 	mov	w0, 28682
 	cmp	w1, w0
-	beq	.L104
-	bcc	.L105
+	beq	.L189
+	bcc	.L190
 	mov	w0, 28683
 	cmp	w1, w0
-	bne	.L91
-	.loc 1 1671 0
+	bne	.L176
+	.loc 1 1900 0
 	bl	ebc_empty_buf_get
-.LVL51:
+.LVL81:
 	mov	x23, x0
-	.loc 1 1672 0
-	cbz	x0, .L112
-	.loc 1 1674 0
+	.loc 1 1901 0
+	cbz	x0, .L197
+	.loc 1 1903 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 392]
 	ldr	x0, [x0, 16]
 	mul	w2, w2, w3
 	ldr	x1, [x1, 16]
-.L218:
+.L303:
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL52:
-	.loc 1 1675 0
+.LVL82:
+	.loc 1 1904 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
-.LVL53:
+.LVL83:
 	sub	w0, w20, w0
-.LBB934:
-.LBB935:
 .LBB936:
 .LBB937:
 .LBB938:
 .LBB939:
 .LBB940:
+.LBB941:
+.LBB942:
 	.file 5 "./arch/arm64/include/asm/current.h"
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL54:
+.LVL84:
 #NO_APP
-.LBE940:
-.LBE939:
+.LBE942:
+.LBE941:
 	.file 6 "./arch/arm64/include/asm/uaccess.h"
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
+.LBE940:
+.LBE939:
 .LBE938:
 .LBE937:
 .LBE936:
-.LBE935:
-.LBE934:
-	.loc 1 1677 0
+	.loc 1 1906 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 1676 0
+	.loc 1 1905 0
 	str	w0, [x29, 104]
-	.loc 1 1678 0
+	.loc 1 1907 0
 	stp	w4, w1, [x29, 112]
-.LBB965:
-.LBB962:
-.LBB959:
+.LBB967:
+.LBB964:
+.LBB961:
+.LBB951:
 .LBB949:
-.LBB947:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL55:
+.LVL85:
 	.loc 6 84 0
-	tbnz	x3, 21, .L149
-.LVL56:
-.L215:
-.LBB941:
-.LBB942:
+	tbnz	x3, 21, .L234
+.LVL86:
+.L300:
 .LBB943:
+.LBB944:
+.LBB945:
 	.file 7 "./include/asm-generic/bitops/non-atomic.h"
 	.loc 7 106 0
 	ldr	x2, [x2]
-.LVL57:
+.LVL87:
+.LBE945:
+.LBE944:
 .LBE943:
-.LBE942:
-.LBE941:
-.LBE947:
 .LBE949:
-.LBE959:
-.LBE962:
-.LBE965:
-	.loc 1 1494 0
+.LBE951:
+.LBE961:
+.LBE964:
+.LBE967:
+	.loc 1 1723 0
 	mov	x0, x21
-.LVL58:
-.LBB966:
-.LBB963:
-.LBB960:
+.LVL88:
+.LBB968:
+.LBB965:
+.LBB962:
+.LBB952:
 .LBB950:
-.LBB948:
 	.loc 6 84 0
-	tbz	x2, 26, .L150
-.LVL59:
-.L149:
-.LBB944:
-.LBB945:
+	tbz	x2, 26, .L235
+.LVL89:
+.L234:
 .LBB946:
+.LBB947:
+.LBB948:
 	.file 8 "./include/linux/bitops.h"
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL60:
-.LBE946:
-.LBE945:
+.LVL90:
+.LBE948:
+.LBE947:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL61:
-.L150:
-.LBE944:
+.LVL91:
+.L235:
+.LBE946:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -948,86 +1537,86 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL62:
+.LVL92:
 #NO_APP
-.LBE948:
 .LBE950:
+.LBE952:
 	.file 9 "./include/linux/uaccess.h"
 	.loc 9 132 0
 	mov	x22, 44
-	cbnz	x0, .L223
-.L151:
-.LBE960:
-.LBE963:
-.LBE966:
-	.loc 1 1680 0
+	cbnz	x0, .L308
+.L236:
+.LBE962:
+.LBE965:
+.LBE968:
+	.loc 1 1909 0
 	mov	x0, x23
-.LVL63:
+.LVL93:
 	bl	ebc_buf_release
-.LVL64:
-	.loc 1 1681 0
-	b	.L87
-.LVL65:
+.LVL94:
+	.loc 1 1910 0
+	b	.L172
+.LVL95:
 	.p2align 3
-.L89:
-	.loc 1 1510 0
-	cbnz	x21, .L88
-	.loc 1 1511 0
+.L174:
+	.loc 1 1739 0
+	cbnz	x21, .L173
+	.loc 1 1740 0
 	ldr	x0, [x20, 272]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
-.LVL66:
+.LVL96:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC1
-	.loc 1 1512 0
+	.loc 1 1741 0
 	mov	x22, -14
-	.loc 1 1511 0
+	.loc 1 1740 0
 	bl	_dev_err
-.LVL67:
-	.loc 1 1512 0
-	b	.L87
-.LVL68:
+.LVL97:
+	.loc 1 1741 0
+	b	.L172
+.LVL98:
 	.p2align 3
-.L221:
-	.loc 1 1519 0
+.L306:
+	.loc 1 1748 0
 	mov	w0, 28674
 	cmp	w1, w0
-	beq	.L94
-	bls	.L224
+	beq	.L179
+	bls	.L309
 	mov	w0, 28675
 	cmp	w1, w0
-	beq	.L98
+	beq	.L183
 	mov	w0, 28676
 	cmp	w1, w0
-	bne	.L91
-	.loc 1 1603 0
+	bne	.L176
+	.loc 1 1832 0
 	ldr	x0, [x20, 272]
-	.loc 1 1602 0
+	.loc 1 1831 0
 	mov	w2, 1
 	str	w2, [x20, 788]
-	.loc 1 1603 0
+	.loc 1 1832 0
 	adrp	x1, .LC2
-.LVL69:
-	.loc 1 1604 0
+.LVL99:
+	.loc 1 1833 0
 	mov	x22, 0
-	.loc 1 1603 0
+	.loc 1 1832 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
-.LVL70:
+.LVL100:
 	.p2align 2
-.L87:
-	.loc 1 1691 0
+.L172:
+	.loc 1 1920 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
-.LVL71:
+.LVL101:
 	ldr	x2, [x29, 152]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-.LVL72:
-	cbnz	x1, .L225
+.LVL102:
+	cbnz	x1, .L310
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL73:
+.LVL103:
 	ldr	x23, [sp, 48]
 	ldp	x29, x30, [sp], 160
 	.cfi_remember_state
@@ -1040,54 +1629,54 @@ ebc_io_ctl:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL74:
+.LVL104:
 	.p2align 3
-.L224:
+.L309:
 	.cfi_restore_state
-	.loc 1 1519 0
+	.loc 1 1748 0
 	cmp	w1, 28672
-	beq	.L96
+	beq	.L181
 	mov	w0, 28673
 	cmp	w1, w0
-	bne	.L91
-.LBB967:
-.LBB968:
+	bne	.L176
 .LBB969:
 .LBB970:
 .LBB971:
 .LBB972:
 .LBB973:
+.LBB974:
+.LBB975:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL75:
+.LVL105:
 #NO_APP
-.LBE973:
-.LBE972:
+.LBE975:
+.LBE974:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
-.LVL76:
+.LVL106:
 	.loc 6 84 0
-	tbz	x2, 21, .L226
-.LVL77:
-.L117:
-.LBB974:
-.LBB975:
+	tbz	x2, 21, .L311
+.LVL107:
+.L202:
 .LBB976:
+.LBB977:
+.LBB978:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL78:
-.LBE976:
-.LBE975:
+.LVL108:
+.LBE978:
+.LBE977:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL79:
-.L118:
-.LBE974:
+.LVL109:
+.L203:
+.LBE976:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1098,39 +1687,39 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL80:
+.LVL110:
 #NO_APP
-.LBE971:
-.LBE970:
+.LBE973:
+.LBE972:
 	.loc 9 114 0
-	cbz	x0, .L120
-.LBB982:
-.LBB983:
+	cbz	x0, .L205
 .LBB984:
 .LBB985:
 .LBB986:
+.LBB987:
+.LBB988:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL81:
+.LVL111:
+.LBE988:
+.LBE987:
 .LBE986:
-.LBE985:
-.LBE984:
-.LBB987:
-.LBB988:
+.LBB989:
+.LBB990:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL82:
+.LVL112:
 #NO_APP
-.LBE988:
-.LBE987:
-.LBB989:
+.LBE990:
+.LBE989:
+.LBB991:
 	.loc 6 254 0
 	and	x0, x0, x21
-.LVL83:
-.LBE989:
+.LVL113:
+.LBE991:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1139,174 +1728,174 @@ ebc_io_ctl:
 	csel	x1, x21, xzr, eq
 
 // 0 "" 2
-.LVL84:
+.LVL114:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE983:
-.LBE982:
+.LBE985:
+.LBE984:
 	.loc 9 116 0
 	mov	x2, 44
 	add	x0, x29, 104
-.LVL85:
+.LVL115:
 	bl	__arch_copy_from_user
-.LVL86:
+.LVL116:
 	.loc 9 118 0
-	cbnz	x0, .L120
+	cbnz	x0, .L205
+.LBE971:
+.LBE970:
 .LBE969:
-.LBE968:
-.LBE967:
-	.loc 1 1557 0
+	.loc 1 1786 0
 	bl	ebc_phy_buf_base_get
-.LVL87:
+.LVL117:
 	ldrsw	x1, [x29, 104]
-	.loc 1 1558 0
+	.loc 1 1787 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
-.LVL88:
+.LVL118:
 	mov	x21, x0
-.LVL89:
-	.loc 1 1559 0
-	cbz	x0, .L127
-	.loc 1 1560 0
+.LVL119:
+	.loc 1 1788 0
+	cbz	x0, .L212
+	.loc 1 1789 0
 	ldr	w5, [x29, 108]
-	.loc 1 1569 0
+	.loc 1 1798 0
 	add	x20, x20, 184
-	.loc 1 1564 0
+	.loc 1 1793 0
 	ldp	w4, w2, [x29, 124]
-	.loc 1 1560 0
+	.loc 1 1789 0
 	str	w5, [x21, 40]
-	.loc 1 1565 0
+	.loc 1 1794 0
 	ldp	w3, w1, [x29, 132]
-	.loc 1 1564 0
+	.loc 1 1793 0
 	stp	w4, w2, [x21, 48]
-	.loc 1 1565 0
+	.loc 1 1794 0
 	stp	w3, w1, [x21, 56]
-	.loc 1 1567 0
+	.loc 1 1796 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL90:
-	.loc 1 1569 0
+.LVL120:
+	.loc 1 1798 0
 	ldr	w0, [x20, 80]
-	cbz	w0, .L227
-.L122:
-	.loc 1 1573 0
+	cbz	w0, .L312
+.L207:
+	.loc 1 1802 0
 	ldr	w0, [x21, 40]
 	cmp	w0, 17
-	beq	.L228
-	.loc 1 1573 0 is_stmt 0 discriminator 3
+	beq	.L313
+	.loc 1 1802 0 is_stmt 0 discriminator 3
 	cmp	w0, 19
-	bne	.L127
-.L124:
-	.loc 1 1574 0 is_stmt 1
+	bne	.L212
+.L209:
+	.loc 1 1803 0 is_stmt 1
 	mov	w0, 1
 	str	w0, [x20, 188]
-.LBB996:
-.LBB997:
-	.loc 1 1575 0
+.LBB998:
+.LBB999:
+	.loc 1 1804 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
-.LVL91:
+.LVL121:
 	adrp	x0, .LANCHOR1
-.LBB998:
+.LBB1000:
 	add	x0, x0, :lo12:.LANCHOR1
 	add	x21, x0, 328
-	b	.L128
+	b	.L213
 	.p2align 3
-.L229:
-.LVL92:
-	.loc 1 1575 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L127
-	.loc 1 1575 0 discriminator 7
+.L314:
+.LVL122:
+	.loc 1 1804 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L212
+	.loc 1 1804 0 discriminator 7
 	bl	schedule
-.LVL93:
-.L128:
-	.loc 1 1575 0 discriminator 9
+.LVL123:
+.L213:
+	.loc 1 1804 0 discriminator 9
 	add	x1, x29, 64
 	mov	w2, 1
 	mov	x0, x21
 	bl	prepare_to_wait_event
-.LVL94:
+.LVL124:
 	ldr	w1, [x20, 188]
-	cbnz	w1, .L229
-.LBE998:
-	.loc 1 1575 0 discriminator 4
+	cbnz	w1, .L314
+.LBE1000:
+	.loc 1 1804 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
 	bl	finish_wait
-.LVL95:
+.LVL125:
 	.p2align 2
-.L127:
+.L212:
 	mov	x22, 0
-	b	.L87
-.LVL96:
+	b	.L172
+.LVL126:
 	.p2align 3
-.L104:
-.LBE997:
-.LBE996:
-	.loc 1 1658 0 is_stmt 1
+.L189:
+.LBE999:
+.LBE998:
+	.loc 1 1887 0 is_stmt 1
 	bl	ebc_empty_buf_get
-.LVL97:
+.LVL127:
 	mov	x23, x0
-	.loc 1 1659 0
-	cbz	x0, .L112
-	.loc 1 1661 0
+	.loc 1 1888 0
+	cbz	x0, .L197
+	.loc 1 1890 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 328]
 	ldr	x0, [x0, 16]
 	mul	w2, w2, w3
-	b	.L218
-.LVL98:
+	b	.L303
+.LVL128:
 	.p2align 3
-.L222:
-	.loc 1 1519 0
+.L307:
+	.loc 1 1748 0
 	mov	w0, 28678
 	cmp	w1, w0
-	beq	.L102
+	beq	.L187
 	mov	w0, 28679
 	cmp	w1, w0
-	bne	.L91
-.LBB1002:
-.LBB1003:
+	bne	.L176
 .LBB1004:
 .LBB1005:
 .LBB1006:
 .LBB1007:
 .LBB1008:
+.LBB1009:
+.LBB1010:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL99:
+.LVL129:
 #NO_APP
-.LBE1008:
-.LBE1007:
+.LBE1010:
+.LBE1009:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
-.LVL100:
+.LVL130:
 	.loc 6 84 0
-	tbz	x2, 21, .L230
-.LVL101:
-.L129:
-.LBB1009:
-.LBB1010:
+	tbz	x2, 21, .L315
+.LVL131:
+.L214:
 .LBB1011:
+.LBB1012:
+.LBB1013:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL102:
-.LBE1011:
-.LBE1010:
+.LVL132:
+.LBE1013:
+.LBE1012:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL103:
-.L130:
-.LBE1009:
+.LVL133:
+.L215:
+.LBE1011:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1317,39 +1906,39 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL104:
+.LVL134:
 #NO_APP
-.LBE1006:
-.LBE1005:
+.LBE1008:
+.LBE1007:
 	.loc 9 114 0
-	cbz	x0, .L120
-.LBB1017:
-.LBB1018:
+	cbz	x0, .L205
 .LBB1019:
 .LBB1020:
 .LBB1021:
+.LBB1022:
+.LBB1023:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL105:
+.LVL135:
+.LBE1023:
+.LBE1022:
 .LBE1021:
-.LBE1020:
-.LBE1019:
-.LBB1022:
-.LBB1023:
+.LBB1024:
+.LBB1025:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL106:
+.LVL136:
 #NO_APP
-.LBE1023:
-.LBE1022:
-.LBB1024:
+.LBE1025:
+.LBE1024:
+.LBB1026:
 	.loc 6 254 0
 	and	x0, x0, x21
-.LVL107:
-.LBE1024:
+.LVL137:
+.LBE1026:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1358,196 +1947,196 @@ ebc_io_ctl:
 	csel	x1, x21, xzr, eq
 
 // 0 "" 2
-.LVL108:
+.LVL138:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1018:
-.LBE1017:
+.LBE1020:
+.LBE1019:
 	.loc 9 116 0
 	mov	x2, 44
 	add	x0, x29, 104
-.LVL109:
+.LVL139:
 	bl	__arch_copy_from_user
-.LVL110:
+.LVL140:
 	.loc 9 118 0
-	cbnz	x0, .L120
+	cbnz	x0, .L205
+.LBE1006:
+.LBE1005:
 .LBE1004:
-.LBE1003:
-.LBE1002:
-	.loc 1 1584 0
+	.loc 1 1813 0
 	bl	ebc_osd_buf_clone
-.LVL111:
+.LVL141:
 	mov	x1, x0
-	.loc 1 1585 0
-	cbz	x0, .L127
-	.loc 1 1586 0
+	.loc 1 1814 0
+	cbz	x0, .L212
+	.loc 1 1815 0
 	ldr	w6, [x29, 108]
-	.loc 1 1595 0
+	.loc 1 1824 0
 	add	x20, x20, 184
-	.loc 1 1590 0
+	.loc 1 1819 0
 	ldp	w5, w3, [x29, 124]
-	.loc 1 1586 0
+	.loc 1 1815 0
 	str	w6, [x1, 40]
-	.loc 1 1591 0
+	.loc 1 1820 0
 	ldp	w4, w2, [x29, 132]
-	.loc 1 1590 0
+	.loc 1 1819 0
 	stp	w5, w3, [x1, 48]
-	.loc 1 1591 0
+	.loc 1 1820 0
 	stp	w4, w2, [x1, 56]
-	.loc 1 1593 0
+	.loc 1 1822 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL112:
-	.loc 1 1595 0
+.LVL142:
+	.loc 1 1824 0
 	ldr	w0, [x20, 80]
-	cbnz	w0, .L127
-	.loc 1 1596 0
+	cbnz	w0, .L212
+	.loc 1 1825 0
 	mov	w2, 1
 	str	w2, [x20, 80]
-	.loc 1 1597 0
+	.loc 1 1826 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	mov	x22, 0
 	bl	__wake_up_sync
-.LVL113:
-	b	.L87
-.LVL114:
+.LVL143:
+	b	.L172
+.LVL144:
 	.p2align 3
-.L223:
-.LBB1031:
-.LBB964:
-.LBB961:
-.LBB951:
-.LBB952:
+.L308:
+.LBB1033:
+.LBB966:
+.LBB963:
 .LBB953:
 .LBB954:
 .LBB955:
+.LBB956:
+.LBB957:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL115:
+.LVL145:
+.LBE957:
+.LBE956:
 .LBE955:
-.LBE954:
-.LBE953:
-.LBB956:
-.LBB957:
+.LBB958:
+.LBB959:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL116:
+.LVL146:
 #NO_APP
-.LBE957:
-.LBE956:
-.LBB958:
+.LBE959:
+.LBE958:
+.LBB960:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL117:
-.LBE958:
+.LVL147:
+.LBE960:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL118:
+.LVL148:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL119:
+.LVL149:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE952:
-.LBE951:
+.LBE954:
+.LBE953:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
-.LVL120:
+.LVL150:
 	bl	__arch_copy_to_user
-.LVL121:
+.LVL151:
 	sxtw	x22, w0
-	b	.L151
-.LVL122:
+	b	.L236
+.LVL152:
 	.p2align 3
-.L102:
-.LBE961:
-.LBE964:
-.LBE1031:
-	.loc 1 1521 0
+.L187:
+.LBE963:
+.LBE966:
+.LBE1033:
+	.loc 1 1750 0
 	bl	ebc_osd_buf_get
-.LVL123:
-	.loc 1 1522 0
-	cbz	x0, .L112
-	.loc 1 1525 0
+.LVL153:
+	.loc 1 1751 0
+	cbz	x0, .L197
+	.loc 1 1754 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
-.LVL124:
-.LBB1032:
-.LBB1033:
+.LVL154:
 .LBB1034:
 .LBB1035:
 .LBB1036:
 .LBB1037:
 .LBB1038:
+.LBB1039:
+.LBB1040:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL125:
+.LVL155:
 #NO_APP
-.LBE1038:
-.LBE1037:
+.LBE1040:
+.LBE1039:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
+.LBE1038:
+.LBE1037:
 .LBE1036:
 .LBE1035:
 .LBE1034:
-.LBE1033:
-.LBE1032:
-	.loc 1 1525 0
+	.loc 1 1754 0
 	sub	w0, w22, w0
-	.loc 1 1530 0
+	.loc 1 1759 0
 	ldr	w1, [x20, 176]
-	.loc 1 1529 0
+	.loc 1 1758 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1528 0
+	.loc 1 1757 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1530 0
+	.loc 1 1759 0
 	str	w1, [x29, 120]
-	.loc 1 1527 0
+	.loc 1 1756 0
 	str	w0, [x29, 104]
-.LBB1065:
-.LBB1062:
-.LBB1059:
-.LBB1048:
-.LBB1045:
+.LBB1067:
+.LBB1064:
+.LBB1061:
+.LBB1050:
+.LBB1047:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL126:
+.LVL156:
 	.loc 6 84 0
-	tbz	x3, 21, .L231
-.LVL127:
-.L108:
-.LBB1039:
-.LBB1040:
+	tbz	x3, 21, .L316
+.LVL157:
+.L193:
 .LBB1041:
+.LBB1042:
+.LBB1043:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL128:
-.LBE1041:
-.LBE1040:
+.LVL158:
+.LBE1043:
+.LBE1042:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL129:
-.L109:
-.LBE1039:
+.LVL159:
+.L194:
+.LBE1041:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1558,121 +2147,121 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL130:
+.LVL160:
 #NO_APP
-.LBE1045:
-.LBE1048:
+.LBE1047:
+.LBE1050:
 	.loc 9 132 0
 	mov	x22, 44
-	cbz	x0, .L87
-.LBB1049:
-.LBB1050:
+	cbz	x0, .L172
 .LBB1051:
 .LBB1052:
 .LBB1053:
+.LBB1054:
+.LBB1055:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL131:
+.LVL161:
+.LBE1055:
+.LBE1054:
 .LBE1053:
-.LBE1052:
-.LBE1051:
-.LBB1054:
-.LBB1055:
+.LBB1056:
+.LBB1057:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL132:
+.LVL162:
 #NO_APP
-.LBE1055:
-.LBE1054:
-.LBB1056:
+.LBE1057:
+.LBE1056:
+.LBB1058:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL133:
-.LBE1056:
+.LVL163:
+.LBE1058:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL134:
+.LVL164:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL135:
+.LVL165:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1050:
-.LBE1049:
+.LBE1052:
+.LBE1051:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
-.LVL136:
+.LVL166:
 	bl	__arch_copy_to_user
-.LVL137:
+.LVL167:
 	sxtw	x22, w0
-	b	.L87
-.LVL138:
+	b	.L172
+.LVL168:
 	.p2align 3
-.L98:
-.LBE1059:
-.LBE1062:
-.LBE1065:
-.LBB1066:
-.LBB1067:
+.L183:
+.LBE1061:
+.LBE1064:
+.LBE1067:
 .LBB1068:
 .LBB1069:
 .LBB1070:
 .LBB1071:
 .LBB1072:
+.LBB1073:
+.LBB1074:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL139:
+.LVL169:
 #NO_APP
-.LBE1072:
-.LBE1071:
+.LBE1074:
+.LBE1073:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
+.LBE1072:
+.LBE1071:
 .LBE1070:
 .LBE1069:
 .LBE1068:
-.LBE1067:
-.LBE1066:
-	.loc 1 1611 0
+	.loc 1 1840 0
 	add	x22, x20, 232
-.LBB1101:
-.LBB1097:
-.LBB1093:
-.LBB1082:
-.LBB1079:
+.LBB1103:
+.LBB1099:
+.LBB1095:
+.LBB1084:
+.LBB1081:
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
-.LVL140:
+.LVL170:
 	.loc 6 84 0
-	tbz	x2, 21, .L232
-.LVL141:
-.L132:
-.LBB1073:
-.LBB1074:
+	tbz	x2, 21, .L317
+.LVL171:
+.L217:
 .LBB1075:
+.LBB1076:
+.LBB1077:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL142:
-.LBE1075:
-.LBE1074:
+.LVL172:
+.LBE1077:
+.LBE1076:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL143:
-.L133:
-.LBE1073:
+.LVL173:
+.L218:
+.LBE1075:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1683,39 +2272,39 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL144:
+.LVL174:
 #NO_APP
 	mov	x3, x0
-.LBE1079:
-.LBE1082:
+.LBE1081:
+.LBE1084:
 	.loc 9 114 0
-	cbz	x0, .L161
-.LBB1083:
-.LBB1084:
+	cbz	x0, .L246
 .LBB1085:
 .LBB1086:
 .LBB1087:
+.LBB1088:
+.LBB1089:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
+.LBE1089:
+.LBE1088:
 .LBE1087:
-.LBE1086:
-.LBE1085:
-.LBB1088:
-.LBB1089:
+.LBB1090:
+.LBB1091:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL145:
+.LVL175:
 #NO_APP
-.LBE1089:
-.LBE1088:
-.LBB1090:
+.LBE1091:
+.LBE1090:
+.LBB1092:
 	.loc 6 254 0
 	and	x0, x0, x21
-.LVL146:
-.LBE1090:
+.LVL176:
+.LBE1092:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1724,84 +2313,84 @@ ebc_io_ctl:
 	csel	x1, x21, xzr, eq
 
 // 0 "" 2
-.LVL147:
+.LVL177:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1084:
-.LBE1083:
+.LBE1086:
+.LBE1085:
 	.loc 9 116 0
 	mov	x2, 4
 	mov	x0, x22
-.LVL148:
+.LVL178:
 	bl	__arch_copy_from_user
-.LVL149:
+.LVL179:
 	.loc 9 118 0
-	cbnz	x0, .L233
-.LBE1093:
-.LBE1097:
-.LBE1101:
-	.loc 1 1615 0
+	cbnz	x0, .L318
+.LBE1095:
+.LBE1099:
+.LBE1103:
+	.loc 1 1844 0
 	add	x20, x20, 184
 	ldr	w2, [x20, 48]
 	ldr	x0, [x20, 88]
-.LVL150:
-	.loc 1 1616 0
+.LVL180:
+	.loc 1 1845 0
 	mov	x22, 0
-	.loc 1 1615 0
+	.loc 1 1844 0
 	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	_dev_info
-.LVL151:
-	.loc 1 1616 0
-	b	.L87
-.LVL152:
+.LVL181:
+	.loc 1 1845 0
+	b	.L172
+.LVL182:
 	.p2align 3
-.L92:
-	.loc 1 1608 0
+.L177:
+	.loc 1 1837 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC3
-.LVL153:
-	.loc 1 1606 0
+.LVL183:
+	.loc 1 1835 0
 	str	wzr, [x20, 788]
-	.loc 1 1609 0
+	.loc 1 1838 0
 	mov	x22, 0
-	.loc 1 1607 0
+	.loc 1 1836 0
 	str	wzr, [x20, 792]
-	.loc 1 1608 0
+	.loc 1 1837 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
-.LVL154:
-	.loc 1 1609 0
-	b	.L87
-.LVL155:
+.LVL184:
+	.loc 1 1838 0
+	b	.L172
+.LVL185:
 	.p2align 3
-.L100:
-	.loc 1 1645 0
+.L185:
+	.loc 1 1874 0
 	bl	ebc_empty_buf_get
-.LVL156:
+.LVL186:
 	mov	x23, x0
-	.loc 1 1646 0
-	cbz	x0, .L112
-	.loc 1 1648 0
+	.loc 1 1875 0
+	cbz	x0, .L197
+	.loc 1 1877 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 320]
 	ldr	x0, [x0, 16]
 	mul	w2, w2, w3
-	b	.L218
-.LVL157:
+	b	.L303
+.LVL187:
 	.p2align 3
-.L105:
-	.loc 1 1632 0
+.L190:
+	.loc 1 1861 0
 	bl	ebc_empty_buf_get
-.LVL158:
+.LVL188:
 	mov	x23, x0
-	.loc 1 1633 0
-	cbz	x0, .L112
-	.loc 1 1635 0
+	.loc 1 1862 0
+	cbz	x0, .L197
+	.loc 1 1864 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 312]
@@ -1809,119 +2398,119 @@ ebc_io_ctl:
 	mul	w2, w2, w3
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL159:
-	.loc 1 1636 0
+.LVL189:
+	.loc 1 1865 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
-.LVL160:
+.LVL190:
 	sub	w0, w20, w0
-.LBB1102:
-.LBB1103:
 .LBB1104:
 .LBB1105:
 .LBB1106:
 .LBB1107:
 .LBB1108:
+.LBB1109:
+.LBB1110:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL161:
+.LVL191:
 #NO_APP
-.LBE1108:
-.LBE1107:
+.LBE1110:
+.LBE1109:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
+.LBE1108:
+.LBE1107:
 .LBE1106:
 .LBE1105:
 .LBE1104:
-.LBE1103:
-.LBE1102:
-	.loc 1 1639 0
+	.loc 1 1868 0
 	ldp	w4, w1, [x22, 84]
-	.loc 1 1637 0
+	.loc 1 1866 0
 	str	w0, [x29, 104]
-	.loc 1 1638 0
+	.loc 1 1867 0
 	stp	w1, w4, [x29, 112]
+.LBB1115:
+.LBB1114:
 .LBB1113:
 .LBB1112:
 .LBB1111:
-.LBB1110:
-.LBB1109:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL162:
+.LVL192:
 	.loc 6 84 0
-	tbnz	x3, 21, .L149
-	b	.L215
-.LVL163:
+	tbnz	x3, 21, .L234
+	b	.L300
+.LVL193:
 	.p2align 3
-.L94:
-.LBE1109:
-.LBE1110:
+.L179:
 .LBE1111:
 .LBE1112:
 .LBE1113:
-.LBB1114:
-.LBB1115:
+.LBE1114:
+.LBE1115:
 .LBB1116:
 .LBB1117:
 .LBB1118:
 .LBB1119:
 .LBB1120:
+.LBB1121:
+.LBB1122:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL164:
+.LVL194:
 #NO_APP
-.LBE1120:
-.LBE1119:
+.LBE1122:
+.LBE1121:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
+.LBE1120:
+.LBE1119:
 .LBE1118:
 .LBE1117:
 .LBE1116:
-.LBE1115:
-.LBE1114:
-	.loc 1 1622 0
+	.loc 1 1851 0
 	ldp	w1, w0, [x20, 116]
-.LVL165:
+.LVL195:
 	stp	w1, w0, [x29, 140]
-	.loc 1 1619 0
+	.loc 1 1848 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 1618 0
+	.loc 1 1847 0
 	stp	w5, w6, [x29, 112]
-	.loc 1 1620 0
+	.loc 1 1849 0
 	ldr	w4, [x20, 176]
 	str	w4, [x29, 120]
-.LBB1149:
-.LBB1145:
-.LBB1141:
-.LBB1130:
-.LBB1127:
+.LBB1151:
+.LBB1147:
+.LBB1143:
+.LBB1132:
+.LBB1129:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL166:
+.LVL196:
 	.loc 6 84 0
-	tbz	x3, 21, .L234
-.LVL167:
-.L136:
-.LBB1121:
-.LBB1122:
+	tbz	x3, 21, .L319
+.LVL197:
+.L221:
 .LBB1123:
+.LBB1124:
+.LBB1125:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL168:
-.LBE1123:
-.LBE1122:
+.LVL198:
+.LBE1125:
+.LBE1124:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL169:
-.L137:
-.LBE1121:
+.LVL199:
+.L222:
+.LBE1123:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1932,119 +2521,119 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL170:
+.LVL200:
 #NO_APP
-.LBE1127:
-.LBE1130:
+.LBE1129:
+.LBE1132:
 	.loc 9 132 0
-	cbnz	x0, .L138
-.L139:
-.LBE1141:
-.LBE1145:
-.LBE1149:
-	.loc 1 1625 0
+	cbnz	x0, .L223
+.L224:
+.LBE1143:
+.LBE1147:
+.LBE1151:
+	.loc 1 1854 0
 	ldr	x0, [x20, 272]
-.LVL171:
+.LVL201:
 	adrp	x1, .LC5
-.LVL172:
-	.loc 1 1626 0
+.LVL202:
+	.loc 1 1855 0
 	mov	x22, -14
-	.loc 1 1625 0
+	.loc 1 1854 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
-.LVL173:
-	.loc 1 1626 0
-	b	.L87
-.LVL174:
+.LVL203:
+	.loc 1 1855 0
+	b	.L172
+.LVL204:
 	.p2align 3
-.L91:
-	.loc 1 1686 0
+.L176:
+	.loc 1 1915 0
 	ldr	x0, [x20, 272]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
-.LVL175:
+.LVL205:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
-	.loc 1 1687 0
+	.loc 1 1916 0
 	mov	x22, 0
-	.loc 1 1686 0
+	.loc 1 1915 0
 	bl	_dev_err
-.LVL176:
-	.loc 1 1690 0
-	b	.L87
-.LVL177:
+.LVL206:
+	.loc 1 1919 0
+	b	.L172
+.LVL207:
 	.p2align 3
-.L96:
-	.loc 1 1535 0
+.L181:
+	.loc 1 1764 0
 	bl	ebc_empty_buf_get
-.LVL178:
+.LVL208:
 	mov	x23, x0
-	.loc 1 1536 0
-	cbz	x0, .L112
-	.loc 1 1539 0
+	.loc 1 1765 0
+	cbz	x0, .L197
+	.loc 1 1768 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
-.LVL179:
-.LBB1150:
-.LBB1151:
+.LVL209:
 .LBB1152:
 .LBB1153:
 .LBB1154:
 .LBB1155:
 .LBB1156:
+.LBB1157:
+.LBB1158:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL180:
+.LVL210:
 #NO_APP
-.LBE1156:
-.LBE1155:
+.LBE1158:
+.LBE1157:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
+.LBE1156:
+.LBE1155:
 .LBE1154:
 .LBE1153:
 .LBE1152:
-.LBE1151:
-.LBE1150:
-	.loc 1 1539 0
+	.loc 1 1768 0
 	sub	w0, w22, w0
-	.loc 1 1544 0
+	.loc 1 1773 0
 	ldr	w1, [x20, 176]
-	.loc 1 1543 0
+	.loc 1 1772 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1542 0
+	.loc 1 1771 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1544 0
+	.loc 1 1773 0
 	str	w1, [x29, 120]
-	.loc 1 1541 0
+	.loc 1 1770 0
 	str	w0, [x29, 104]
-.LBB1185:
-.LBB1181:
-.LBB1177:
-.LBB1166:
-.LBB1163:
+.LBB1187:
+.LBB1183:
+.LBB1179:
+.LBB1168:
+.LBB1165:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL181:
+.LVL211:
 	.loc 6 84 0
-	tbz	x3, 21, .L235
-.LVL182:
-.L113:
-.LBB1157:
-.LBB1158:
+	tbz	x3, 21, .L320
+.LVL212:
+.L198:
 .LBB1159:
+.LBB1160:
+.LBB1161:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL183:
-.LBE1159:
-.LBE1158:
+.LVL213:
+.LBE1161:
+.LBE1160:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL184:
-.L114:
-.LBE1157:
+.LVL214:
+.L199:
+.LBE1159:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2055,503 +2644,503 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL185:
+.LVL215:
 #NO_APP
-.LBE1163:
-.LBE1166:
+.LBE1165:
+.LBE1168:
 	.loc 9 132 0
-	cbnz	x0, .L115
-.L116:
-.LBE1177:
-.LBE1181:
-.LBE1185:
-	.loc 1 1548 0
+	cbnz	x0, .L200
+.L201:
+.LBE1179:
+.LBE1183:
+.LBE1187:
+	.loc 1 1777 0
 	mov	x0, x23
-.LVL186:
-	.loc 1 1549 0
+.LVL216:
+	.loc 1 1778 0
 	mov	x22, -14
-	.loc 1 1548 0
+	.loc 1 1777 0
 	bl	ebc_buf_release
-.LVL187:
-	.loc 1 1549 0
-	b	.L87
-.LVL188:
+.LVL217:
+	.loc 1 1778 0
+	b	.L172
+.LVL218:
 	.p2align 3
-.L230:
-.LBB1186:
+.L315:
+.LBB1188:
+.LBB1031:
 .LBB1029:
 .LBB1027:
-.LBB1025:
-.LBB1015:
-.LBB1012:
-.LBB1013:
+.LBB1017:
 .LBB1014:
+.LBB1015:
+.LBB1016:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1014:
-.LBE1013:
-.LBE1012:
+.LBE1016:
 .LBE1015:
-.LBE1025:
+.LBE1014:
+.LBE1017:
 .LBE1027:
 .LBE1029:
-.LBE1186:
-	.loc 1 1494 0
+.LBE1031:
+.LBE1188:
+	.loc 1 1723 0
 	mov	x0, x21
-.LVL189:
-.LBB1187:
+.LVL219:
+.LBB1189:
+.LBB1032:
 .LBB1030:
 .LBB1028:
-.LBB1026:
-.LBB1016:
+.LBB1018:
 	.loc 6 84 0
-	tbz	x2, 26, .L130
-	b	.L129
-.LVL190:
+	tbz	x2, 26, .L215
+	b	.L214
+.LVL220:
 	.p2align 3
-.L226:
-.LBE1016:
-.LBE1026:
+.L311:
+.LBE1018:
 .LBE1028:
 .LBE1030:
-.LBE1187:
-.LBB1188:
+.LBE1032:
+.LBE1189:
+.LBB1190:
+.LBB996:
 .LBB994:
 .LBB992:
-.LBB990:
-.LBB980:
-.LBB977:
-.LBB978:
+.LBB982:
 .LBB979:
+.LBB980:
+.LBB981:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE979:
-.LBE978:
-.LBE977:
+.LBE981:
 .LBE980:
-.LBE990:
+.LBE979:
+.LBE982:
 .LBE992:
 .LBE994:
-.LBE1188:
-	.loc 1 1494 0
+.LBE996:
+.LBE1190:
+	.loc 1 1723 0
 	mov	x0, x21
-.LVL191:
-.LBB1189:
+.LVL221:
+.LBB1191:
+.LBB997:
 .LBB995:
 .LBB993:
-.LBB991:
-.LBB981:
+.LBB983:
 	.loc 6 84 0
-	tbz	x2, 26, .L118
-	b	.L117
-.LVL192:
+	tbz	x2, 26, .L203
+	b	.L202
+.LVL222:
 	.p2align 3
-.L234:
-.LBE981:
-.LBE991:
+.L319:
+.LBE983:
 .LBE993:
 .LBE995:
-.LBE1189:
-.LBB1190:
-.LBB1146:
-.LBB1142:
-.LBB1131:
-.LBB1128:
-.LBB1124:
-.LBB1125:
+.LBE997:
+.LBE1191:
+.LBB1192:
+.LBB1148:
+.LBB1144:
+.LBB1133:
+.LBB1130:
 .LBB1126:
+.LBB1127:
+.LBB1128:
 	.loc 7 106 0
 	ldr	x2, [x2]
-.LVL193:
-.LBE1126:
-.LBE1125:
-.LBE1124:
+.LVL223:
 .LBE1128:
-.LBE1131:
-.LBE1142:
-.LBE1146:
-.LBE1190:
-	.loc 1 1494 0
-	mov	x0, x21
-.LVL194:
-.LBB1191:
-.LBB1147:
-.LBB1143:
-.LBB1132:
-.LBB1129:
-	.loc 6 84 0
-	tbz	x2, 26, .L137
-	b	.L136
-.LVL195:
-	.p2align 3
-.L232:
-.LBE1129:
-.LBE1132:
-.LBE1143:
-.LBE1147:
-.LBE1191:
-.LBB1192:
-.LBB1098:
-.LBB1094:
-.LBB1091:
-.LBB1080:
-.LBB1076:
-.LBB1077:
-.LBB1078:
-	.loc 7 106 0
-	ldr	x2, [x0]
-.LBE1078:
-.LBE1077:
-.LBE1076:
-.LBE1080:
-.LBE1091:
-.LBE1094:
-.LBE1098:
+.LBE1127:
+.LBE1126:
+.LBE1130:
+.LBE1133:
+.LBE1144:
+.LBE1148:
 .LBE1192:
-	.loc 1 1494 0
+	.loc 1 1723 0
 	mov	x0, x21
-.LVL196:
+.LVL224:
 .LBB1193:
-.LBB1099:
-.LBB1095:
-.LBB1092:
-.LBB1081:
+.LBB1149:
+.LBB1145:
+.LBB1134:
+.LBB1131:
 	.loc 6 84 0
-	tbz	x2, 26, .L133
-	b	.L132
-.LVL197:
+	tbz	x2, 26, .L222
+	b	.L221
+.LVL225:
 	.p2align 3
-.L235:
-.LBE1081:
-.LBE1092:
-.LBE1095:
-.LBE1099:
+.L317:
+.LBE1131:
+.LBE1134:
+.LBE1145:
+.LBE1149:
 .LBE1193:
 .LBB1194:
-.LBB1182:
-.LBB1178:
-.LBB1167:
-.LBB1164:
-.LBB1160:
-.LBB1161:
-.LBB1162:
+.LBB1100:
+.LBB1096:
+.LBB1093:
+.LBB1082:
+.LBB1078:
+.LBB1079:
+.LBB1080:
 	.loc 7 106 0
-	ldr	x2, [x2]
-.LVL198:
-.LBE1162:
-.LBE1161:
-.LBE1160:
-.LBE1164:
-.LBE1167:
-.LBE1178:
-.LBE1182:
+	ldr	x2, [x0]
+.LBE1080:
+.LBE1079:
+.LBE1078:
+.LBE1082:
+.LBE1093:
+.LBE1096:
+.LBE1100:
 .LBE1194:
-	.loc 1 1494 0
+	.loc 1 1723 0
 	mov	x0, x21
-.LVL199:
+.LVL226:
 .LBB1195:
-.LBB1183:
-.LBB1179:
-.LBB1168:
-.LBB1165:
+.LBB1101:
+.LBB1097:
+.LBB1094:
+.LBB1083:
 	.loc 6 84 0
-	tbz	x2, 26, .L114
-	b	.L113
-.LVL200:
+	tbz	x2, 26, .L218
+	b	.L217
+.LVL227:
 	.p2align 3
-.L231:
-.LBE1165:
-.LBE1168:
-.LBE1179:
-.LBE1183:
+.L320:
+.LBE1083:
+.LBE1094:
+.LBE1097:
+.LBE1101:
 .LBE1195:
 .LBB1196:
-.LBB1063:
-.LBB1060:
-.LBB1057:
-.LBB1046:
-.LBB1042:
-.LBB1043:
-.LBB1044:
+.LBB1184:
+.LBB1180:
+.LBB1169:
+.LBB1166:
+.LBB1162:
+.LBB1163:
+.LBB1164:
 	.loc 7 106 0
 	ldr	x2, [x2]
-.LVL201:
-.LBE1044:
-.LBE1043:
-.LBE1042:
-.LBE1046:
-.LBE1057:
-.LBE1060:
-.LBE1063:
+.LVL228:
+.LBE1164:
+.LBE1163:
+.LBE1162:
+.LBE1166:
+.LBE1169:
+.LBE1180:
+.LBE1184:
 .LBE1196:
-	.loc 1 1494 0
+	.loc 1 1723 0
 	mov	x0, x21
-.LVL202:
+.LVL229:
 .LBB1197:
-.LBB1064:
-.LBB1061:
-.LBB1058:
-.LBB1047:
+.LBB1185:
+.LBB1181:
+.LBB1170:
+.LBB1167:
 	.loc 6 84 0
-	tbz	x2, 26, .L109
-	b	.L108
-.LVL203:
+	tbz	x2, 26, .L199
+	b	.L198
+.LVL230:
 	.p2align 3
-.L138:
-.LBE1047:
-.LBE1058:
-.LBE1061:
-.LBE1064:
+.L316:
+.LBE1167:
+.LBE1170:
+.LBE1181:
+.LBE1185:
 .LBE1197:
 .LBB1198:
-.LBB1148:
-.LBB1144:
-.LBB1133:
-.LBB1134:
+.LBB1065:
+.LBB1062:
+.LBB1059:
+.LBB1048:
+.LBB1044:
+.LBB1045:
+.LBB1046:
+	.loc 7 106 0
+	ldr	x2, [x2]
+.LVL231:
+.LBE1046:
+.LBE1045:
+.LBE1044:
+.LBE1048:
+.LBE1059:
+.LBE1062:
+.LBE1065:
+.LBE1198:
+	.loc 1 1723 0
+	mov	x0, x21
+.LVL232:
+.LBB1199:
+.LBB1066:
+.LBB1063:
+.LBB1060:
+.LBB1049:
+	.loc 6 84 0
+	tbz	x2, 26, .L194
+	b	.L193
+.LVL233:
+	.p2align 3
+.L223:
+.LBE1049:
+.LBE1060:
+.LBE1063:
+.LBE1066:
+.LBE1199:
+.LBB1200:
+.LBB1150:
+.LBB1146:
 .LBB1135:
 .LBB1136:
 .LBB1137:
+.LBB1138:
+.LBB1139:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL204:
+.LVL234:
+.LBE1139:
+.LBE1138:
 .LBE1137:
-.LBE1136:
-.LBE1135:
-.LBB1138:
-.LBB1139:
+.LBB1140:
+.LBB1141:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL205:
+.LVL235:
 #NO_APP
-.LBE1139:
-.LBE1138:
-.LBB1140:
+.LBE1141:
+.LBE1140:
+.LBB1142:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL206:
-.LBE1140:
+.LVL236:
+.LBE1142:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL207:
+.LVL237:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL208:
+.LVL238:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1134:
-.LBE1133:
+.LBE1136:
+.LBE1135:
 	.loc 9 134 0
 	mov	x2, 44
 	add	x1, x29, 104
-.LVL209:
+.LVL239:
 	bl	__arch_copy_to_user
-.LVL210:
-.LBE1144:
-.LBE1148:
-.LBE1198:
-	.loc 1 1624 0
-	cbnz	x0, .L139
-.LBB1199:
-.LBB999:
+.LVL240:
+.LBE1146:
+.LBE1150:
+.LBE1200:
+	.loc 1 1853 0
+	cbnz	x0, .L224
+.LBB1201:
+.LBB1001:
 	mov	x22, 0
-	b	.L87
-.LVL211:
+	b	.L172
+.LVL241:
 	.p2align 3
-.L115:
-.LBE999:
-.LBE1199:
-.LBB1200:
-.LBB1184:
-.LBB1180:
-.LBB1169:
-.LBB1170:
+.L200:
+.LBE1001:
+.LBE1201:
+.LBB1202:
+.LBB1186:
+.LBB1182:
 .LBB1171:
 .LBB1172:
 .LBB1173:
+.LBB1174:
+.LBB1175:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL212:
+.LVL242:
+.LBE1175:
+.LBE1174:
 .LBE1173:
-.LBE1172:
-.LBE1171:
-.LBB1174:
-.LBB1175:
+.LBB1176:
+.LBB1177:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL213:
+.LVL243:
 #NO_APP
-.LBE1175:
-.LBE1174:
-.LBB1176:
+.LBE1177:
+.LBE1176:
+.LBB1178:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL214:
-.LBE1176:
+.LVL244:
+.LBE1178:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL215:
+.LVL245:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL216:
+.LVL246:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1170:
-.LBE1169:
+.LBE1172:
+.LBE1171:
 	.loc 9 134 0
 	mov	x2, 44
 	add	x1, x29, 104
-.LVL217:
+.LVL247:
 	bl	__arch_copy_to_user
-.LVL218:
-.LBE1180:
-.LBE1184:
-.LBE1200:
-	.loc 1 1547 0
-	cbnz	w0, .L116
-.LBB1201:
-.LBB1000:
+.LVL248:
+.LBE1182:
+.LBE1186:
+.LBE1202:
+	.loc 1 1776 0
+	cbnz	w0, .L201
+.LBB1203:
+.LBB1002:
 	mov	x22, 0
-	b	.L87
-.LVL219:
+	b	.L172
+.LVL249:
 	.p2align 3
-.L120:
-.LBE1000:
-.LBE1201:
-	.loc 1 1555 0
+.L205:
+.LBE1002:
+.LBE1203:
+	.loc 1 1784 0
 	mov	x22, -14
-	b	.L87
-.LVL220:
+	b	.L172
+.LVL250:
 	.p2align 3
-.L227:
-	.loc 1 1570 0
+.L312:
+	.loc 1 1799 0
 	mov	w2, 1
 	str	w2, [x20, 80]
-	.loc 1 1571 0
+	.loc 1 1800 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL221:
-	b	.L122
+.LVL251:
+	b	.L207
 	.p2align 3
-.L228:
-	.loc 1 1573 0 discriminator 1
+.L313:
+	.loc 1 1802 0 discriminator 1
 	ldr	w0, [x20, 592]
-	cbz	w0, .L124
-.LBB1202:
-.LBB1001:
+	cbz	w0, .L209
+.LBB1204:
+.LBB1003:
 	mov	x22, 0
-	b	.L87
-.LVL222:
-.L112:
-.LBE1001:
-.LBE1202:
-	.loc 1 1523 0
+	b	.L172
+.LVL252:
+.L197:
+.LBE1003:
+.LBE1204:
+	.loc 1 1752 0
 	mov	x22, -1
-	b	.L87
-.LVL223:
-.L161:
-.LBB1203:
-.LBB1100:
-.LBB1096:
+	b	.L172
+.LVL253:
+.L246:
+.LBB1205:
+.LBB1102:
+.LBB1098:
 	.loc 9 112 0
 	mov	x0, 4
-.LVL224:
-.L134:
+.LVL254:
+.L219:
 	.loc 9 119 0
 	mov	x2, x0
 	mov	w1, 0
-.LVL225:
+.LVL255:
 	add	x0, x22, x3
-.LVL226:
+.LVL256:
 	bl	memset
-.LVL227:
-.LBE1096:
-.LBE1100:
-.LBE1203:
-	.loc 1 1612 0
+.LVL257:
+.LBE1098:
+.LBE1102:
+.LBE1205:
+	.loc 1 1841 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC4
-	.loc 1 1613 0
+	.loc 1 1842 0
 	mov	x22, -14
-	.loc 1 1612 0
+	.loc 1 1841 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
-.LVL228:
-	.loc 1 1613 0
-	b	.L87
-.L225:
-	.loc 1 1691 0
+.LVL258:
+	.loc 1 1842 0
+	b	.L172
+.L310:
+	.loc 1 1920 0
 	bl	__stack_chk_fail
-.LVL229:
-.L233:
+.LVL259:
+.L318:
 	mov	x3, 4
 	sub	x3, x3, x0
-.LVL230:
-	b	.L134
+.LVL260:
+	b	.L219
 	.cfi_endproc
-.LFE2830:
+.LFE2831:
 	.size	ebc_io_ctl, .-ebc_io_ctl
 	.align	2
 	.p2align 3,,7
 	.type	frame_done_callback, %function
 frame_done_callback:
-.LFB2822:
-	.loc 1 942 0
+.LFB2823:
+	.loc 1 1171 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 943 0
+	.loc 1 1172 0
 	adrp	x0, .LANCHOR0
 	add	x1, x0, :lo12:.LANCHOR0
-	.loc 1 942 0
+	.loc 1 1171 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 943 0
+	.loc 1 1172 0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 942 0
+	.loc 1 1171 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 946 0
+	.loc 1 1175 0
 	add	x19, x20, 184
 	ldr	x0, [x19, 208]
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
-	bhi	.L237
-	.loc 1 949 0
+	bhi	.L322
+	.loc 1 1178 0
 	ldr	w0, [x19, 36]
-	cbz	w0, .L239
-	.loc 1 950 0
+	cbz	w0, .L324
+	.loc 1 1179 0
 	ldr	x0, [x1, 8]
 	bl	wake_up_process
-.LVL231:
-	.loc 1 976 0
+.LVL261:
+	.loc 1 1205 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -2564,42 +3153,42 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L237:
+.L322:
 	.cfi_restore_state
-	.loc 1 964 0
+	.loc 1 1193 0
 	ldr	w0, [x19, 40]
-	cbnz	w0, .L243
-	.loc 1 970 0
+	cbnz	w0, .L328
+	.loc 1 1199 0
 	ldr	x0, [x19, 88]
-	.loc 1 969 0
+	.loc 1 1198 0
 	mov	w20, 1
-	.loc 1 968 0
+	.loc 1 1197 0
 	str	wzr, [x19, 28]
-	.loc 1 970 0
+	.loc 1 1199 0
 	adrp	x1, .LC9
-	.loc 1 969 0
+	.loc 1 1198 0
 	str	w20, [x19, 76]
-	.loc 1 970 0
+	.loc 1 1199 0
 	add	x1, x1, :lo12:.LC9
-	.loc 1 971 0
+	.loc 1 1200 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
-	.loc 1 970 0
+	.loc 1 1199 0
 	bl	_dev_info
-.LVL232:
-	.loc 1 971 0
+.LVL262:
+	.loc 1 1200 0
 	mov	w2, w20
 	add	x0, x19, 352
 	mov	w1, w20
 	bl	__wake_up_sync
-.LVL233:
-	.loc 1 972 0
+.LVL263:
+	.loc 1 1201 0
 	mov	w2, w20
 	mov	w1, w20
 	add	x0, x19, 304
 	bl	__wake_up_sync
-.LVL234:
-	.loc 1 976 0
+.LVL264:
+	.loc 1 1205 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -2612,51 +3201,51 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L239:
+.L324:
 	.cfi_restore_state
-	.loc 1 953 0
+	.loc 1 1182 0
 	ldr	x0, [x19, 88]
 	adrp	x1, .LC8
 	add	x1, x1, :lo12:.LC8
-	.loc 1 958 0
+	.loc 1 1187 0
 	mov	w21, 1
-	.loc 1 953 0
+	.loc 1 1182 0
 	bl	_dev_info
-.LVL235:
-	.loc 1 955 0
+.LVL265:
+	.loc 1 1184 0
 	ldp	w3, w2, [x20, 108]
 	mov	w1, 0
 	ldr	x0, [x19, 152]
 	mul	w2, w3, w2
 	bl	memset
-.LVL236:
-	.loc 1 956 0
+.LVL266:
+	.loc 1 1185 0
 	adrp	x2, jiffies
 	add	x0, x20, 672
 	mov	x1, 402653184
 	ldr	x2, [x2, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL237:
-	.loc 1 958 0
+.LVL267:
+	.loc 1 1187 0
 	str	w21, [x19, 76]
-	.loc 1 957 0
+	.loc 1 1186 0
 	str	wzr, [x19, 28]
-	.loc 1 959 0
+	.loc 1 1188 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x19, 352
 	bl	__wake_up_sync
-.LVL238:
-	.loc 1 960 0
+.LVL268:
+	.loc 1 1189 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x19, 304
 	bl	__wake_up_sync
-.LVL239:
-	.loc 1 976 0
+.LVL269:
+	.loc 1 1205 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -2669,17 +3258,17 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L243:
+.L328:
 	.cfi_restore_state
-	.loc 1 966 0
+	.loc 1 1195 0
 	ldr	x0, [x1, 8]
-	.loc 1 965 0
+	.loc 1 1194 0
 	mov	w1, 1
 	str	w1, [x19, 28]
-	.loc 1 966 0
+	.loc 1 1195 0
 	bl	wake_up_process
-.LVL240:
-	.loc 1 976 0
+.LVL270:
+	.loc 1 1205 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -2691,49 +3280,49 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2822:
+.LFE2823:
 	.size	frame_done_callback, .-frame_done_callback
 	.align	2
 	.p2align 3,,7
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
-.LFB2828:
-	.loc 1 1420 0
+.LFB2829:
+	.loc 1 1649 0
 	.cfi_startproc
-.LVL241:
+.LVL271:
 	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 1421 0
+	.loc 1 1650 0
 	bl	frame_done_callback
-.LVL242:
-	.loc 1 1423 0
+.LVL272:
+	.loc 1 1652 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2828:
+.LFE2829:
 	.size	ebc_frame_timeout, .-ebc_frame_timeout
 	.align	2
 	.p2align 3,,7
 	.type	ebc_lut_update, %function
 ebc_lut_update:
-.LFB2823:
-	.loc 1 979 0
+.LFB2824:
+	.loc 1 1208 0
 	.cfi_startproc
-.LVL243:
+.LVL273:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 981 0
+	.loc 1 1210 0
 	mov	w3, 25
-	.loc 1 979 0
+	.loc 1 1208 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x21, x22, [sp, 32]
@@ -2743,78 +3332,78 @@ ebc_lut_update:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -48
 	.cfi_offset 20, -40
-	.loc 1 981 0
+	.loc 1 1210 0
 	add	x1, x29, 64
-	.loc 1 979 0
+	.loc 1 1208 0
 	adrp	x19, __stack_chk_guard
 	add	x0, x19, :lo12:__stack_chk_guard
-.LVL244:
-	.loc 1 985 0
+.LVL274:
+	.loc 1 1214 0
 	ldr	x2, [x21, 16]
-	.loc 1 981 0
+	.loc 1 1210 0
 	str	w3, [x1, -12]!
-.LVL245:
-	.loc 1 979 0
+.LVL275:
+	.loc 1 1208 0
 	ldr	x3, [x0]
 	str	x3, [x29, 56]
 	mov	x3,0
-.LBB1204:
-.LBB1205:
+.LBB1206:
+.LBB1207:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL246:
+.LVL276:
 	mov	w20, w0
-.LBE1205:
-.LBE1204:
-	.loc 1 986 0
-	cbnz	w0, .L247
-.LVL247:
-	.loc 1 987 0
+.LBE1207:
+.LBE1206:
+	.loc 1 1215 0
+	cbnz	w0, .L332
+.LVL277:
+	.loc 1 1216 0
 	ldr	w2, [x29, 52]
-	.loc 1 988 0
+	.loc 1 1217 0
 	add	x22, x21, 184
-	.loc 1 987 0
-	tbnz	w2, #31, .L271
-	.loc 1 991 0
+	.loc 1 1216 0
+	tbnz	w2, #31, .L356
+	.loc 1 1220 0
 	cmp	w2, 50
-	bgt	.L272
-.L249:
-	.loc 1 999 0
+	bgt	.L357
+.L334:
+	.loc 1 1228 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC13
 	add	x1, x1, :lo12:.LC13
 	bl	_dev_info
-.LVL248:
-	.loc 1 1002 0
+.LVL278:
+	.loc 1 1231 0
 	ldr	x0, [x22, 208]
 	ldr	w0, [x0, 40]
 	cmp	w0, 20
-	bls	.L273
-	.loc 1 1055 0
+	bls	.L358
+	.loc 1 1284 0
 	ldr	w2, [x29, 52]
-.L270:
+.L355:
 	mov	w1, 7
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL249:
-	cbnz	w0, .L262
+.LVL279:
+	cbnz	w0, .L347
 	.p2align 2
-.L265:
-	.loc 1 1060 0
-	cbnz	w20, .L263
-.L246:
-	.loc 1 1066 0
+.L350:
+	.loc 1 1289 0
+	cbnz	w20, .L348
+.L331:
+	.loc 1 1295 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	w0, w20
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L274
+	cbnz	x1, .L359
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL250:
+.LVL280:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -2825,207 +3414,207 @@ ebc_lut_update:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL251:
+.LVL281:
 	.p2align 3
-.L273:
+.L358:
 	.cfi_restore_state
-	.loc 1 1002 0
-	adrp	x1, .L252
-	.loc 1 1004 0
+	.loc 1 1231 0
+	adrp	x1, .L337
+	.loc 1 1233 0
 	ldr	w2, [x29, 52]
-	.loc 1 1002 0
-	add	x1, x1, :lo12:.L252
+	.loc 1 1231 0
+	add	x1, x1, :lo12:.L337
 	ldrb	w0, [x1,w0,uxtw]
-	adr	x1, .Lrtx252
+	adr	x1, .Lrtx337
 	add	x0, x1, w0, sxtb #2
 	br	x0
-.Lrtx252:
+.Lrtx337:
 	.section	.rodata
 	.align	0
 	.align	2
-.L252:
-	.byte	(.L270 - .Lrtx252) / 4
-	.byte	(.L253 - .Lrtx252) / 4
-	.byte	(.L270 - .Lrtx252) / 4
-	.byte	(.L254 - .Lrtx252) / 4
-	.byte	(.L255 - .Lrtx252) / 4
-	.byte	(.L256 - .Lrtx252) / 4
-	.byte	(.L257 - .Lrtx252) / 4
-	.byte	(.L270 - .Lrtx252) / 4
-	.byte	(.L254 - .Lrtx252) / 4
-	.byte	(.L255 - .Lrtx252) / 4
-	.byte	(.L256 - .Lrtx252) / 4
-	.byte	(.L257 - .Lrtx252) / 4
-	.byte	(.L258 - .Lrtx252) / 4
-	.byte	(.L259 - .Lrtx252) / 4
-	.byte	(.L260 - .Lrtx252) / 4
-	.byte	(.L259 - .Lrtx252) / 4
-	.byte	(.L261 - .Lrtx252) / 4
-	.byte	(.L270 - .Lrtx252) / 4
-	.byte	(.L270 - .Lrtx252) / 4
-	.byte	(.L270 - .Lrtx252) / 4
-	.byte	(.L270 - .Lrtx252) / 4
+.L337:
+	.byte	(.L355 - .Lrtx337) / 4
+	.byte	(.L338 - .Lrtx337) / 4
+	.byte	(.L355 - .Lrtx337) / 4
+	.byte	(.L339 - .Lrtx337) / 4
+	.byte	(.L340 - .Lrtx337) / 4
+	.byte	(.L341 - .Lrtx337) / 4
+	.byte	(.L342 - .Lrtx337) / 4
+	.byte	(.L355 - .Lrtx337) / 4
+	.byte	(.L339 - .Lrtx337) / 4
+	.byte	(.L340 - .Lrtx337) / 4
+	.byte	(.L341 - .Lrtx337) / 4
+	.byte	(.L342 - .Lrtx337) / 4
+	.byte	(.L343 - .Lrtx337) / 4
+	.byte	(.L344 - .Lrtx337) / 4
+	.byte	(.L345 - .Lrtx337) / 4
+	.byte	(.L344 - .Lrtx337) / 4
+	.byte	(.L346 - .Lrtx337) / 4
+	.byte	(.L355 - .Lrtx337) / 4
+	.byte	(.L355 - .Lrtx337) / 4
+	.byte	(.L355 - .Lrtx337) / 4
+	.byte	(.L355 - .Lrtx337) / 4
 	.text
-.LVL252:
+.LVL282:
 	.p2align 3
-.L247:
-	.loc 1 997 0
+.L332:
+	.loc 1 1226 0
 	add	x22, x21, 184
 	mov	w2, w0
 	adrp	x1, .LC12
 	add	x1, x1, :lo12:.LC12
 	ldr	x0, [x22, 88]
 	bl	_dev_err
-.LVL253:
+.LVL283:
 	ldr	w2, [x29, 52]
-	b	.L249
+	b	.L334
 	.p2align 3
-.L272:
-	.loc 1 992 0
+.L357:
+	.loc 1 1221 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC11
 	add	x1, x1, :lo12:.LC11
 	bl	_dev_info
-.LVL254:
-	.loc 1 993 0
+.LVL284:
+	.loc 1 1222 0
 	mov	w2, 50
 	str	w2, [x29, 52]
-.LVL255:
-	b	.L249
+.LVL285:
+	b	.L334
 	.p2align 3
-.L261:
-	.loc 1 1004 0
+.L346:
+	.loc 1 1233 0
 	mov	w1, 1
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL256:
-	cbz	w0, .L265
+.LVL286:
+	cbz	w0, .L350
 	.p2align 2
-.L262:
-	.loc 1 993 0
+.L347:
+	.loc 1 1222 0
 	mov	w20, -1
-.L263:
-	.loc 1 1061 0
+.L348:
+	.loc 1 1290 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC14
 	add	x1, x1, :lo12:.LC14
 	bl	_dev_err
-.LVL257:
-	.loc 1 1062 0
-	b	.L246
+.LVL287:
+	.loc 1 1291 0
+	b	.L331
 	.p2align 3
-.L255:
-	.loc 1 1041 0
+.L340:
+	.loc 1 1270 0
 	mov	w1, 9
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL258:
-	cbnz	w0, .L262
-	b	.L265
+.LVL288:
+	cbnz	w0, .L347
+	b	.L350
 	.p2align 3
-.L256:
-	.loc 1 1046 0
+.L341:
+	.loc 1 1275 0
 	mov	w1, 10
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL259:
-	cbnz	w0, .L262
-	b	.L265
+.LVL289:
+	cbnz	w0, .L347
+	b	.L350
 	.p2align 3
-.L253:
-	.loc 1 1018 0
+.L338:
+	.loc 1 1247 0
 	mov	w1, 5
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL260:
-	cbnz	w0, .L262
-	b	.L265
+.LVL290:
+	cbnz	w0, .L347
+	b	.L350
 	.p2align 3
-.L254:
-	.loc 1 1036 0
+.L339:
+	.loc 1 1265 0
 	mov	w1, 8
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL261:
-	cbnz	w0, .L262
-	b	.L265
+.LVL291:
+	cbnz	w0, .L347
+	b	.L350
 	.p2align 3
-.L257:
-	.loc 1 1051 0
+.L342:
+	.loc 1 1280 0
 	mov	w1, 11
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL262:
-	cbnz	w0, .L262
-	b	.L265
+.LVL292:
+	cbnz	w0, .L347
+	b	.L350
 	.p2align 3
-.L258:
-	.loc 1 1022 0
+.L343:
+	.loc 1 1251 0
 	mov	w1, 6
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL263:
-	cbnz	w0, .L262
-	b	.L265
+.LVL293:
+	cbnz	w0, .L347
+	b	.L350
 	.p2align 3
-.L259:
-	.loc 1 1027 0
+.L344:
+	.loc 1 1256 0
 	mov	w1, 4
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL264:
-	cbnz	w0, .L262
-	b	.L265
+.LVL294:
+	cbnz	w0, .L347
+	b	.L350
 	.p2align 3
-.L260:
-	.loc 1 1031 0
+.L345:
+	.loc 1 1260 0
 	mov	w1, 3
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL265:
-	cbnz	w0, .L262
-	b	.L265
+.LVL295:
+	cbnz	w0, .L347
+	b	.L350
 	.p2align 3
-.L271:
-	.loc 1 988 0
+.L356:
+	.loc 1 1217 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC10
 	add	x1, x1, :lo12:.LC10
 	bl	_dev_info
-.LVL266:
-	.loc 1 989 0
+.LVL296:
+	.loc 1 1218 0
 	str	wzr, [x29, 52]
 	mov	w2, 0
-	b	.L249
-.L274:
-	.loc 1 1066 0
+	b	.L334
+.L359:
+	.loc 1 1295 0
 	bl	__stack_chk_fail
-.LVL267:
+.LVL297:
 	.cfi_endproc
-.LFE2823:
+.LFE2824:
 	.size	ebc_lut_update, .-ebc_lut_update
 	.align	2
 	.p2align 3,,7
 	.type	ebc_buf_state_read, %function
 ebc_buf_state_read:
-.LFB2840:
-	.loc 1 1824 0
+.LFB2841:
+	.loc 1 2053 0
 	.cfi_startproc
-.LVL268:
+.LVL298:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1825 0
+	.loc 1 2054 0
 	mov	x0, x2
-.LVL269:
-	.loc 1 1824 0
+.LVL299:
+	.loc 1 2053 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1825 0
+	.loc 1 2054 0
 	bl	ebc_buf_state_show
-.LVL270:
-	.loc 1 1826 0
+.LVL300:
+	.loc 1 2055 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3033,39 +3622,39 @@ ebc_buf_state_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2840:
+.LFE2841:
 	.size	ebc_buf_state_read, .-ebc_buf_state_read
 	.align	2
 	.p2align 3,,7
 	.type	ebc_state_read, %function
 ebc_state_read:
-.LFB2839:
-	.loc 1 1815 0
+.LFB2840:
+	.loc 1 2044 0
 	.cfi_startproc
-.LVL271:
+.LVL301:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1816 0
+	.loc 1 2045 0
 	adrp	x3, .LANCHOR0
-	.loc 1 1815 0
+	.loc 1 2044 0
 	mov	x0, x2
-.LVL272:
-	.loc 1 1816 0
+.LVL302:
+	.loc 1 2045 0
 	adrp	x1, .LC15
-.LVL273:
-	.loc 1 1815 0
+.LVL303:
+	.loc 1 2044 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1816 0
+	.loc 1 2045 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL274:
+.LVL304:
 	add	x1, x1, :lo12:.LC15
 	ldr	w2, [x2, 608]
 	bl	sprintf
-.LVL275:
-	.loc 1 1817 0
+.LVL305:
+	.loc 1 2046 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3073,38 +3662,38 @@ ebc_state_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2839:
+.LFE2840:
 	.size	ebc_state_read, .-ebc_state_read
 	.align	2
 	.p2align 3,,7
 	.type	ebc_version_read, %function
 ebc_version_read:
-.LFB2838:
-	.loc 1 1806 0
+.LFB2839:
+	.loc 1 2035 0
 	.cfi_startproc
-.LVL276:
+.LVL306:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mov	x0, x2
-.LVL277:
-	.loc 1 1807 0
+.LVL307:
+	.loc 1 2036 0
 	adrp	x1, .LC17
-.LVL278:
+.LVL308:
 	adrp	x2, .LC16
-.LVL279:
-	.loc 1 1806 0
+.LVL309:
+	.loc 1 2035 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1807 0
+	.loc 1 2036 0
 	add	x2, x2, :lo12:.LC16
-	.loc 1 1806 0
-	.loc 1 1807 0
+	.loc 1 2035 0
+	.loc 1 2036 0
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
-.LVL280:
-	.loc 1 1808 0
+.LVL310:
+	.loc 1 2037 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3112,56 +3701,56 @@ ebc_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2838:
+.LFE2839:
 	.size	ebc_version_read, .-ebc_version_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
-.LFB2836:
-	.loc 1 1770 0
+.LFB2837:
+	.loc 1 1999 0
 	.cfi_startproc
-.LVL281:
+.LVL311:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 1771 0
+	.loc 1 2000 0
 	adrp	x0, .LANCHOR0
-.LVL282:
-	.loc 1 1770 0
+.LVL312:
+	.loc 1 1999 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1774 0
+	.loc 1 2003 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1770 0
+	.loc 1 1999 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1770 0
+	.loc 1 1999 0
 	mov	x19, x2
-	.loc 1 1774 0
+	.loc 1 2003 0
 	ldr	x1, [x0, 16]
-.LVL283:
-.LBB1206:
-.LBB1207:
+.LVL313:
+.LBB1208:
+.LBB1209:
 	.loc 3 55 0
 	mov	x0, x1
 	ldr	x1, [x1, 64]
 	blr	x1
-.LVL284:
-.LBE1207:
-.LBE1206:
-	.loc 1 1776 0
+.LVL314:
+.LBE1209:
+.LBE1208:
+	.loc 1 2005 0
 	mov	w2, w0
 	adrp	x1, .LC15
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
-.LVL285:
-	.loc 1 1777 0
+.LVL315:
+	.loc 1 2006 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL286:
+.LVL316:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3169,72 +3758,72 @@ pmic_vcom_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2836:
+.LFE2837:
 	.size	pmic_vcom_read, .-pmic_vcom_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_temp_read, %function
 pmic_temp_read:
-.LFB2835:
-	.loc 1 1756 0
+.LFB2836:
+	.loc 1 1985 0
 	.cfi_startproc
-.LVL287:
+.LVL317:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 1757 0
+	.loc 1 1986 0
 	adrp	x0, .LANCHOR0
-.LVL288:
-	.loc 1 1756 0
+.LVL318:
+	.loc 1 1985 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1760 0
+	.loc 1 1989 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-.LBB1208:
-.LBB1209:
+.LBB1210:
+.LBB1211:
 	.loc 3 50 0
 	add	x1, x29, 36
-.LVL289:
-.LBE1209:
-.LBE1208:
-	.loc 1 1756 0
+.LVL319:
+.LBE1211:
+.LBE1210:
+	.loc 1 1985 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 1756 0
+	.loc 1 1985 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
-.LVL290:
-	.loc 1 1760 0
+.LVL320:
+	.loc 1 1989 0
 	ldr	x2, [x0, 16]
-.LBB1211:
-.LBB1210:
+.LBB1213:
+.LBB1212:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL291:
-.LBE1210:
-.LBE1211:
-	.loc 1 1762 0
+.LVL321:
+.LBE1212:
+.LBE1213:
+	.loc 1 1991 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC15
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
-.LVL292:
-	.loc 1 1763 0
+.LVL322:
+	.loc 1 1992 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L286
+	cbnz	x1, .L371
 	ldp	x19, x20, [sp, 16]
-.LVL293:
+.LVL323:
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -3244,46 +3833,46 @@ pmic_temp_read:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL294:
-.L286:
+.LVL324:
+.L371:
 	.cfi_restore_state
 	bl	__stack_chk_fail
-.LVL295:
+.LVL325:
 	.cfi_endproc
-.LFE2835:
+.LFE2836:
 	.size	pmic_temp_read, .-pmic_temp_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_name_read, %function
 pmic_name_read:
-.LFB2834:
-	.loc 1 1745 0
+.LFB2835:
+	.loc 1 1974 0
 	.cfi_startproc
-.LVL296:
+.LVL326:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1746 0
+	.loc 1 1975 0
 	adrp	x3, .LANCHOR0
-	.loc 1 1745 0
+	.loc 1 1974 0
 	mov	x0, x2
-.LVL297:
-	.loc 1 1748 0
+.LVL327:
+	.loc 1 1977 0
 	adrp	x1, .LC17
-.LVL298:
-	.loc 1 1745 0
+.LVL328:
+	.loc 1 1974 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1748 0
+	.loc 1 1977 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL299:
+.LVL329:
 	add	x1, x1, :lo12:.LC17
 	ldr	x2, [x2, 16]
 	add	x2, x2, 8
 	bl	sprintf
-.LVL300:
-	.loc 1 1749 0
+.LVL330:
+	.loc 1 1978 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3291,24 +3880,24 @@ pmic_name_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2834:
+.LFE2835:
 	.size	pmic_name_read, .-pmic_name_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
-.LFB2837:
-	.loc 1 1782 0
+.LFB2838:
+	.loc 1 2011 0
 	.cfi_startproc
-.LVL301:
+.LVL331:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 1783 0
+	.loc 1 2012 0
 	adrp	x0, .LANCHOR0
-.LVL302:
-	.loc 1 1782 0
+.LVL332:
+	.loc 1 2011 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -3318,47 +3907,47 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 1782 0
+	.loc 1 2011 0
 	add	x1, x19, :lo12:__stack_chk_guard
-.LVL303:
+.LVL333:
 	mov	x21, x2
-	.loc 1 1783 0
+	.loc 1 2012 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
-.LVL304:
-	.loc 1 1782 0
+.LVL334:
+	.loc 1 2011 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
-.LVL305:
+.LVL335:
 	mov	x20, x3
-	.loc 1 1786 0
+	.loc 1 2015 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
-.LVL306:
-	.loc 1 1787 0
-	cbnz	w0, .L296
-.LVL307:
-	.loc 1 1791 0
+.LVL336:
+	.loc 1 2016 0
+	cbnz	w0, .L381
+.LVL337:
+	.loc 1 2020 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
-.LVL308:
-	.loc 1 1792 0
-	cbnz	w0, .L297
-.L289:
-	.loc 1 1798 0
+.LVL338:
+	.loc 1 2021 0
+	cbnz	w0, .L382
+.L374:
+	.loc 1 2027 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
-.LVL309:
+.LVL339:
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L298
+	cbnz	x1, .L383
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL310:
+.LVL340:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -3369,53 +3958,53 @@ pmic_vcom_write:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL311:
+.LVL341:
 	.p2align 3
-.L296:
+.L381:
 	.cfi_restore_state
-	.loc 1 1788 0
+	.loc 1 2017 0
 	ldr	x0, [x22]
 	adrp	x1, .LC18
 	mov	x2, x21
 	add	x1, x1, :lo12:.LC18
-	.loc 1 1789 0
+	.loc 1 2018 0
 	mov	x20, -1
-.LVL312:
-	.loc 1 1788 0
+.LVL342:
+	.loc 1 2017 0
 	bl	_dev_err
-.LVL313:
-	.loc 1 1789 0
-	b	.L289
-.LVL314:
+.LVL343:
+	.loc 1 2018 0
+	b	.L374
+.LVL344:
 	.p2align 3
-.L297:
-	.loc 1 1793 0
+.L382:
+	.loc 1 2022 0
 	ldr	x0, [x22]
 	adrp	x1, .LC19
-	.loc 1 1794 0
+	.loc 1 2023 0
 	mov	x20, -1
-.LVL315:
-	.loc 1 1793 0
+.LVL345:
+	.loc 1 2022 0
 	add	x1, x1, :lo12:.LC19
 	bl	_dev_err
-.LVL316:
-	.loc 1 1794 0
-	b	.L289
-.L298:
-	.loc 1 1798 0
+.LVL346:
+	.loc 1 2023 0
+	b	.L374
+.L383:
+	.loc 1 2027 0
 	bl	__stack_chk_fail
-.LVL317:
+.LVL347:
 	.cfi_endproc
-.LFE2837:
+.LFE2838:
 	.size	pmic_vcom_write, .-pmic_vcom_write
 	.align	2
 	.p2align 3,,7
 	.type	waveform_version_read, %function
 waveform_version_read:
-.LFB2833:
-	.loc 1 1734 0
+.LFB2834:
+	.loc 1 1963 0
 	.cfi_startproc
-.LVL318:
+.LVL348:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -3424,22 +4013,22 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1734 0
+	.loc 1 1963 0
 	mov	x19, x2
-	.loc 1 1735 0
+	.loc 1 1964 0
 	bl	epd_lut_get_wf_version
-.LVL319:
-	.loc 1 1737 0
+.LVL349:
+	.loc 1 1966 0
 	mov	x2, x0
 	adrp	x1, .LC17
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
-.LVL320:
-	.loc 1 1738 0
+.LVL350:
+	.loc 1 1967 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL321:
+.LVL351:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3447,279 +4036,279 @@ waveform_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2833:
+.LFE2834:
 	.size	waveform_version_read, .-waveform_version_read
 	.section	.init.text,"ax",@progbits
 	.align	2
 	.type	ebc_init, %function
 ebc_init:
-.LFB2851:
-	.loc 1 2261 0
+.LFB2852:
+	.loc 1 2490 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2262 0
+	.loc 1 2491 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2261 0
+	.loc 1 2490 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2262 0
+	.loc 1 2491 0
 	bl	__platform_driver_register
-.LVL322:
-	.loc 1 2263 0
+.LVL352:
+	.loc 1 2492 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2851:
+.LFE2852:
 	.size	ebc_init, .-ebc_init
 	.text
 	.align	2
 	.p2align 3,,7
 	.type	direct_mode_data_change, %function
 direct_mode_data_change:
-.LFB2814:
-	.loc 1 695 0
+.LFB2815:
+	.loc 1 900 0
 	.cfi_startproc
-.LVL323:
-	.loc 1 696 0
+.LVL353:
+	.loc 1 901 0
 	ldr	w13, [x3, 72]
-.LVL324:
-	cbnz	w13, .L337
-.LBB1230:
-.LBB1231:
-	.loc 1 660 0
+.LVL354:
+	cbnz	w13, .L422
+.LBB1232:
+.LBB1233:
+	.loc 1 865 0
 	adrp	x5, .LANCHOR0
-	.loc 1 666 0
+	.loc 1 871 0
 	ldrb	w7, [x3, 32]
 	ldr	w4, [x3, 40]
-	.loc 1 660 0
+	.loc 1 865 0
 	ldr	x15, [x5, #:lo12:.LANCHOR0]
-	.loc 1 667 0
+	.loc 1 872 0
 	ldr	x3, [x3, 112]
-.LVL325:
-	.loc 1 666 0
+.LVL355:
+	.loc 1 871 0
 	sub	w7, w7, w4
-.LVL326:
-	.loc 1 668 0
+.LVL356:
+	.loc 1 873 0
 	add	x15, x15, 24
-	.loc 1 667 0
+	.loc 1 872 0
 	lsl	w7, w7, 16
-.LVL327:
+.LVL357:
 	add	x7, x3, x7, sxtw
-.LVL328:
-	.loc 1 671 0
+.LVL358:
+	.loc 1 876 0
 	ldr	w16, [x15, 88]
-	.loc 1 670 0
+	.loc 1 875 0
 	ldr	w3, [x15, 84]
-	.loc 1 668 0
+	.loc 1 873 0
 	ldr	w17, [x15, 156]
-.LVL329:
-	.loc 1 676 0
+.LVL359:
+	.loc 1 881 0
 	cmp	w16, 0
-	.loc 1 670 0
+	.loc 1 875 0
 	lsr	w12, w3, 3
-.LVL330:
-	.loc 1 676 0
-	ble	.L325
+.LVL360:
+	.loc 1 881 0
+	ble	.L410
 	sub	w14, w12, #1
 	add	x14, x14, 1
 	lsl	x14, x14, 2
-	.loc 1 677 0
-	cbz	w17, .L311
-.LVL331:
+	.loc 1 882 0
+	cbz	w17, .L396
+.LVL361:
 	.p2align 2
-.L338:
-	.loc 1 678 0
+.L423:
+	.loc 1 883 0
 	ldr	w10, [x15, 88]
-.LVL332:
+.LVL362:
 	sub	w10, w10, #1
 	sub	w10, w10, w13
 	mul	w10, w10, w3
 	lsr	w10, w10, 2
 	add	x10, x0, x10
-.LVL333:
-.L312:
-	.loc 1 682 0
-	cbz	w12, .L313
+.LVL363:
+.L397:
+	.loc 1 887 0
+	cbz	w12, .L398
 	mov	x5, 0
 	.p2align 2
-.L314:
-	.loc 1 684 0
+.L399:
+	.loc 1 889 0
 	ldr	w3, [x2, x5, lsl 2]
-	.loc 1 683 0
+	.loc 1 888 0
 	ldr	w4, [x1, x5, lsl 2]
 	add	x5, x5, 1
-.LVL334:
-.LBB1232:
-.LBB1233:
+.LVL364:
+.LBB1234:
+.LBB1235:
 	.loc 1 131 0
 	and	w9, w3, 65280
-.LBE1233:
-.LBE1232:
-	.loc 1 682 0
+.LBE1235:
+.LBE1234:
+	.loc 1 887 0
 	cmp	w12, w5
-.LVL335:
-	.loc 1 686 0
+.LVL365:
+	.loc 1 891 0
 	and	w6, w4, 65535
-.LBB1238:
-.LBB1234:
+.LBB1240:
+.LBB1236:
 	.loc 1 130 0
 	ubfiz	w8, w3, 8, 8
 	.loc 1 131 0
 	add	w9, w9, w6, lsr 8
-	.loc 1 130 0
-	add	w6, w8, w6, uxtb
-.LBE1234:
-.LBE1238:
-	.loc 1 687 0
+	.loc 1 130 0
+	add	w6, w8, w6, uxtb
+.LBE1236:
+.LBE1240:
+	.loc 1 892 0
 	lsr	w3, w3, 16
-.LVL336:
+.LVL366:
 	lsr	w4, w4, 16
-.LBB1239:
-.LBB1240:
+.LBB1241:
+.LBB1242:
 	.loc 1 130 0
 	ubfiz	w8, w3, 8, 8
 	.loc 1 131 0
 	and	w3, w3, 65280
-.LBE1240:
-.LBE1239:
-.LBB1244:
-.LBB1235:
+.LBE1242:
+.LBE1241:
+.LBB1246:
+.LBB1237:
 	.loc 1 130 0
 	ldrb	w11, [x7, w6, sxtw]
-.LBE1235:
-.LBE1244:
-.LBB1245:
-.LBB1241:
+.LBE1237:
+.LBE1246:
+.LBB1247:
+.LBB1243:
 	.loc 1 131 0
 	add	w3, w3, w4, lsr 8
-.LBE1241:
-.LBE1245:
-.LBB1246:
-.LBB1236:
+.LBE1243:
+.LBE1247:
+.LBB1248:
+.LBB1238:
 	ldrb	w9, [x7, w9, sxtw]
-.LBE1236:
-.LBE1246:
-.LBB1247:
-.LBB1242:
+.LBE1238:
+.LBE1248:
+.LBB1249:
+.LBB1244:
 	.loc 1 130 0
 	add	w6, w8, w4, uxtb
-.LBE1242:
-.LBE1247:
-.LBB1248:
-.LBB1237:
+.LBE1244:
+.LBE1249:
+.LBB1250:
+.LBB1239:
 	orr	w4, w11, w9, lsl 4
-.LBE1237:
-.LBE1248:
-	.loc 1 686 0
+.LBE1239:
+.LBE1250:
+	.loc 1 891 0
 	strb	w4, [x10], 2
-.LBB1249:
-.LBB1243:
+.LBB1251:
+.LBB1245:
 	.loc 1 131 0
 	ldrb	w3, [x7, w3, sxtw]
 	.loc 1 130 0
 	ldrb	w4, [x7, w6, sxtw]
 	orr	w3, w4, w3, lsl 4
-.LBE1243:
-.LBE1249:
-	.loc 1 687 0
+.LBE1245:
+.LBE1251:
+	.loc 1 892 0
 	strb	w3, [x10, -1]
-	.loc 1 682 0
-	bgt	.L314
+	.loc 1 887 0
+	bgt	.L399
 	add	x1, x1, x14
 	add	x2, x2, x14
-.L313:
-	.loc 1 676 0
+.L398:
+	.loc 1 881 0
 	add	w13, w13, 1
 	cmp	w16, w13
-	beq	.L325
+	beq	.L410
 	ldr	w3, [x15, 84]
-	.loc 1 677 0
-	cbnz	w17, .L338
-.L311:
-	.loc 1 680 0
+	.loc 1 882 0
+	cbnz	w17, .L423
+.L396:
+	.loc 1 885 0
 	mul	w10, w13, w3
-.LVL337:
+.LVL367:
 	lsr	w10, w10, 2
 	add	x10, x0, x10
-.LVL338:
-	b	.L312
-.LVL339:
-.L337:
-.LBE1231:
-.LBE1230:
-.LBB1250:
-.LBB1251:
+.LVL368:
+	b	.L397
+.LVL369:
+.L422:
+.LBE1233:
+.LBE1232:
 .LBB1252:
-	.loc 1 621 0
+.LBB1253:
+.LBB1254:
+	.loc 1 826 0
 	adrp	x7, .LANCHOR0
-	.loc 1 627 0
+	.loc 1 832 0
 	ldrb	w4, [x3, 32]
 	ldr	w6, [x3, 40]
-	.loc 1 621 0
+	.loc 1 826 0
 	ldr	x13, [x7, #:lo12:.LANCHOR0]
-.LVL340:
-	.loc 1 628 0
+.LVL370:
+	.loc 1 833 0
 	ldr	x5, [x3, 112]
-	.loc 1 627 0
+	.loc 1 832 0
 	sub	w3, w4, w6
-.LVL341:
-	.loc 1 629 0
+.LVL371:
+	.loc 1 834 0
 	add	x13, x13, 24
-	.loc 1 628 0
+	.loc 1 833 0
 	lsl	w3, w3, 16
-.LVL342:
+.LVL372:
 	add	x3, x5, x3, sxtw
-.LVL343:
-	.loc 1 632 0
+.LVL373:
+	.loc 1 837 0
 	ldr	w15, [x13, 88]
-	.loc 1 631 0
+	.loc 1 836 0
 	ldr	w5, [x13, 84]
-	.loc 1 629 0
+	.loc 1 834 0
 	ldr	w16, [x13, 156]
-.LVL344:
-	.loc 1 637 0
+.LVL374:
+	.loc 1 842 0
 	cmp	w15, 0
-	.loc 1 631 0
+	.loc 1 836 0
 	lsr	w14, w5, 4
-	.loc 1 637 0
-	ble	.L325
+	.loc 1 842 0
+	ble	.L410
 	sub	w11, w14, #1
 	mov	x10, x2
-.LVL345:
+.LVL375:
 	add	x11, x11, 1
 	mov	x9, x1
-.LVL346:
+.LVL376:
 	lsl	x11, x11, 3
 	mov	w12, 0
-.LVL347:
-	.loc 1 638 0
-	cbz	w16, .L328
-.LVL348:
-.L341:
-	.loc 1 639 0
+.LVL377:
+	.loc 1 843 0
+	cbz	w16, .L413
+.LVL378:
+.L426:
+	.loc 1 844 0
 	ldr	w4, [x13, 88]
-.LVL349:
+.LVL379:
 	sub	w4, w4, #1
 	sub	w4, w4, w12
 	mul	w4, w4, w5
 	lsr	w4, w4, 2
 	add	x4, x0, x4
-.LVL350:
-.L329:
-	.loc 1 643 0
-	cbz	w14, .L339
+.LVL380:
+.L414:
+	.loc 1 848 0
+	cbz	w14, .L424
+.LBE1254:
+.LBE1253:
 .LBE1252:
-.LBE1251:
-.LBE1250:
-	.loc 1 695 0
+	.loc 1 900 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -3727,30 +4316,30 @@ direct_mode_data_change:
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	.p2align 2
-.L330:
+.L415:
+.LBB1299:
 .LBB1297:
 .LBB1295:
-.LBB1293:
-	.loc 1 643 0
+	.loc 1 848 0
 	mov	x5, 0
 	.p2align 2
-.L310:
-	.loc 1 645 0
+.L395:
+	.loc 1 850 0
 	ldr	x2, [x10, x5]
-.LVL351:
+.LVL381:
 	add	x4, x4, 4
-	.loc 1 644 0
+	.loc 1 849 0
 	ldr	x1, [x9, x5]
-.LVL352:
+.LVL382:
 	add	x5, x5, 8
-	.loc 1 647 0
+	.loc 1 852 0
 	and	w7, w2, 65535
-	.loc 1 643 0
+	.loc 1 848 0
 	cmp	x11, x5
-	.loc 1 647 0
+	.loc 1 852 0
 	and	w6, w1, 65535
-.LBB1253:
-.LBB1254:
+.LBB1255:
+.LBB1256:
 	.loc 1 130 0
 	ubfiz	w30, w7, 8, 8
 	.loc 1 131 0
@@ -3759,253 +4348,253 @@ direct_mode_data_change:
 	add	w30, w30, w6, uxtb
 	.loc 1 131 0
 	add	w7, w7, w6, lsr 8
-.LBE1254:
-.LBE1253:
-	.loc 1 648 0
+.LBE1256:
+.LBE1255:
+	.loc 1 853 0
 	lsr	w8, w2, 16
 	lsr	w6, w1, 16
-.LBB1258:
-.LBB1259:
+.LBB1260:
+.LBB1261:
 	.loc 1 130 0
 	ubfiz	w18, w8, 8, 8
-.LBE1259:
-.LBE1258:
-.LBB1265:
-.LBB1255:
-	ldrb	w30, [x3, w30, sxtw]
-.LBE1255:
-.LBE1265:
-.LBB1266:
-.LBB1260:
-	.loc 1 131 0
-	and	w8, w8, 65280
+.LBE1261:
 .LBE1260:
-.LBE1266:
 .LBB1267:
-.LBB1256:
-	ldrb	w17, [x3, w7, sxtw]
-.LBE1256:
+.LBB1257:
+	ldrb	w30, [x3, w30, sxtw]
+.LBE1257:
 .LBE1267:
 .LBB1268:
-.LBB1261:
+.LBB1262:
+	.loc 1 131 0
+	and	w8, w8, 65280
+.LBE1262:
+.LBE1268:
+.LBB1269:
+.LBB1258:
+	ldrb	w17, [x3, w7, sxtw]
+.LBE1258:
+.LBE1269:
+.LBB1270:
+.LBB1263:
 	.loc 1 130 0
 	add	w18, w18, w6, uxtb
 	.loc 1 131 0
 	add	w8, w8, w6, lsr 8
-.LBE1261:
-.LBE1268:
-	.loc 1 649 0
+.LBE1263:
+.LBE1270:
+	.loc 1 854 0
 	ubfx	x7, x2, 32, 16
 	ubfx	x6, x1, 32, 16
-	.loc 1 650 0
+	.loc 1 855 0
 	lsr	x2, x2, 48
-.LVL353:
-.LBB1269:
-.LBB1257:
+.LVL383:
+.LBB1271:
+.LBB1259:
 	.loc 1 130 0
 	orr	w17, w30, w17, lsl 4
-.LBE1257:
-.LBE1269:
-	.loc 1 647 0
+.LBE1259:
+.LBE1271:
+	.loc 1 852 0
 	strb	w17, [x4, -4]
-.LBB1270:
-.LBB1271:
+.LBB1272:
+.LBB1273:
 	.loc 1 130 0
 	ubfiz	w17, w7, 8, 8
 	.loc 1 131 0
 	and	w7, w7, 65280
-.LBE1271:
-.LBE1270:
-.LBB1277:
-.LBB1262:
-	ldrb	w8, [x3, w8, sxtw]
-.LBE1262:
-.LBE1277:
-.LBB1278:
-.LBB1272:
-	.loc 1 130 0
-	add	w17, w17, w6, uxtb
+.LBE1273:
 .LBE1272:
-.LBE1278:
 .LBB1279:
-.LBB1263:
-	ldrb	w18, [x3, w18, sxtw]
-.LBE1263:
+.LBB1264:
+	ldrb	w8, [x3, w8, sxtw]
+.LBE1264:
 .LBE1279:
 .LBB1280:
-.LBB1273:
+.LBB1274:
+	.loc 1 130 0
+	add	w17, w17, w6, uxtb
+.LBE1274:
+.LBE1280:
+.LBB1281:
+.LBB1265:
+	ldrb	w18, [x3, w18, sxtw]
+.LBE1265:
+.LBE1281:
+.LBB1282:
+.LBB1275:
 	.loc 1 131 0
 	add	w6, w7, w6, lsr 8
-.LBE1273:
-.LBE1280:
-	.loc 1 650 0
+.LBE1275:
+.LBE1282:
+	.loc 1 855 0
 	lsr	x1, x1, 48
-.LVL354:
-.LBB1281:
-.LBB1264:
+.LVL384:
+.LBB1283:
+.LBB1266:
 	.loc 1 130 0
 	orr	w7, w18, w8, lsl 4
-.LBE1264:
-.LBE1281:
-	.loc 1 648 0
+.LBE1266:
+.LBE1283:
+	.loc 1 853 0
 	strb	w7, [x4, -3]
-.LBB1282:
-.LBB1283:
+.LBB1284:
+.LBB1285:
 	.loc 1 130 0
 	ubfiz	w7, w2, 8, 8
 	.loc 1 131 0
 	and	w2, w2, 65280
-.LBE1283:
-.LBE1282:
-.LBB1287:
-.LBB1274:
-	ldrb	w8, [x3, w6, sxtw]
-.LBE1274:
-.LBE1287:
-.LBB1288:
-.LBB1284:
-	.loc 1 130 0
-	add	w6, w7, w1, uxtb
+.LBE1285:
 .LBE1284:
-.LBE1288:
 .LBB1289:
-.LBB1275:
-	ldrb	w17, [x3, w17, sxtw]
-.LBE1275:
+.LBB1276:
+	ldrb	w8, [x3, w6, sxtw]
+.LBE1276:
 .LBE1289:
 .LBB1290:
-.LBB1285:
-	.loc 1 131 0
-	add	w1, w2, w1, lsr 8
-.LBE1285:
+.LBB1286:
+	.loc 1 130 0
+	add	w6, w7, w1, uxtb
+.LBE1286:
 .LBE1290:
 .LBB1291:
-.LBB1276:
+.LBB1277:
+	ldrb	w17, [x3, w17, sxtw]
+.LBE1277:
+.LBE1291:
+.LBB1292:
+.LBB1287:
+	.loc 1 131 0
+	add	w1, w2, w1, lsr 8
+.LBE1287:
+.LBE1292:
+.LBB1293:
+.LBB1278:
 	.loc 1 130 0
 	orr	w2, w17, w8, lsl 4
-.LBE1276:
-.LBE1291:
-	.loc 1 649 0
+.LBE1278:
+.LBE1293:
+	.loc 1 854 0
 	strb	w2, [x4, -2]
-.LBB1292:
-.LBB1286:
+.LBB1294:
+.LBB1288:
 	.loc 1 131 0
 	ldrb	w1, [x3, w1, sxtw]
 	.loc 1 130 0
 	ldrb	w2, [x3, w6, sxtw]
 	orr	w1, w2, w1, lsl 4
-.LBE1286:
-.LBE1292:
-	.loc 1 650 0
+.LBE1288:
+.LBE1294:
+	.loc 1 855 0
 	strb	w1, [x4, -1]
-	.loc 1 643 0
-	bne	.L310
-	.loc 1 637 0
+	.loc 1 848 0
+	bne	.L395
+	.loc 1 842 0
 	add	w12, w12, 1
 	add	x9, x9, x11
 	add	x10, x10, x11
 	cmp	w15, w12
-	beq	.L303
-.L340:
+	beq	.L388
+.L425:
 	ldr	w5, [x13, 84]
-	.loc 1 638 0
-	cbz	w16, .L307
-	.loc 1 639 0
+	.loc 1 843 0
+	cbz	w16, .L392
+	.loc 1 844 0
 	ldr	w4, [x13, 88]
-.LVL355:
+.LVL385:
 	sub	w4, w4, #1
 	sub	w4, w4, w12
 	mul	w4, w4, w5
 	lsr	w4, w4, 2
 	add	x4, x0, x4
-.LVL356:
-	.loc 1 643 0
-	cbnz	w14, .L330
-.L336:
-	.loc 1 637 0
+.LVL386:
+	.loc 1 848 0
+	cbnz	w14, .L415
+.L421:
+	.loc 1 842 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	bne	.L340
-.L303:
-.LBE1293:
+	bne	.L425
+.L388:
 .LBE1295:
 .LBE1297:
-	.loc 1 700 0
+.LBE1299:
+	.loc 1 905 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
-.LVL357:
-.L328:
+.LVL387:
+.L413:
+.LBB1300:
 .LBB1298:
 .LBB1296:
-.LBB1294:
-	.loc 1 641 0
+	.loc 1 846 0
 	mul	w4, w12, w5
-.LVL358:
+.LVL388:
 	lsr	w4, w4, 2
 	add	x4, x0, x4
-.LVL359:
-	b	.L329
-.LVL360:
+.LVL389:
+	b	.L414
+.LVL390:
 	.p2align 3
-.L307:
+.L392:
 	.cfi_def_cfa 29, 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mul	w4, w12, w5
-.LVL361:
+.LVL391:
 	lsr	w4, w4, 2
 	add	x4, x0, x4
-.LVL362:
-	.loc 1 643 0
-	cbnz	w14, .L330
-	b	.L336
-.LVL363:
-.L339:
+.LVL392:
+	.loc 1 848 0
+	cbnz	w14, .L415
+	b	.L421
+.LVL393:
+.L424:
 	.cfi_def_cfa 31, 0
 	.cfi_restore 29
 	.cfi_restore 30
-	.loc 1 637 0
+	.loc 1 842 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L325
+	beq	.L410
 	ldr	w5, [x13, 84]
-	.loc 1 638 0
-	cbz	w16, .L328
-	b	.L341
-.LVL364:
+	.loc 1 843 0
+	cbz	w16, .L413
+	b	.L426
+.LVL394:
 	.p2align 3
-.L325:
+.L410:
 	ret
-.LBE1294:
 .LBE1296:
 .LBE1298:
+.LBE1300:
 	.cfi_endproc
-.LFE2814:
+.LFE2815:
 	.size	direct_mode_data_change, .-direct_mode_data_change
 	.align	2
 	.p2align 3,,7
 	.type	direct_mode_data_change_part, %function
 direct_mode_data_change_part:
-.LFB2817:
-	.loc 1 789 0
+.LFB2818:
+	.loc 1 994 0
 	.cfi_startproc
-.LVL365:
+.LVL395:
 	stp	x29, x30, [sp, -80]!
 	.cfi_def_cfa_offset 80
 	.cfi_offset 29, -80
 	.cfi_offset 30, -72
-.LBB1317:
-.LBB1318:
 .LBB1319:
-	.loc 1 748 0
+.LBB1320:
+.LBB1321:
+	.loc 1 953 0
 	adrp	x5, .LANCHOR0
+.LBE1321:
+.LBE1320:
 .LBE1319:
-.LBE1318:
-.LBE1317:
-	.loc 1 789 0
+	.loc 1 994 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -4019,150 +4608,150 @@ direct_mode_data_change_part:
 	.cfi_offset 23, -32
 	.cfi_offset 24, -24
 	.cfi_offset 25, -16
-	.loc 1 790 0
+	.loc 1 995 0
 	ldr	w16, [x3, 72]
-.LVL366:
-	cbnz	w16, .L446
-.LBB1332:
-.LBB1333:
-	.loc 1 707 0
+.LVL396:
+	cbnz	w16, .L531
+.LBB1334:
+.LBB1335:
+	.loc 1 912 0
 	ldr	x18, [x5, #:lo12:.LANCHOR0]
-	.loc 1 712 0
+	.loc 1 917 0
 	ldrb	w14, [x3, 32]
 	ldr	w4, [x3, 40]
-	.loc 1 714 0
+	.loc 1 919 0
 	add	x18, x18, 24
-	.loc 1 713 0
+	.loc 1 918 0
 	ldr	x3, [x3, 112]
-.LVL367:
-	.loc 1 712 0
+.LVL397:
+	.loc 1 917 0
 	sub	w14, w14, w4
-.LVL368:
-	.loc 1 717 0
+.LVL398:
+	.loc 1 922 0
 	ldr	w30, [x18, 88]
-	.loc 1 713 0
+	.loc 1 918 0
 	lsl	w14, w14, 16
-.LVL369:
-	.loc 1 714 0
+.LVL399:
+	.loc 1 919 0
 	ldr	w19, [x18, 156]
-	.loc 1 713 0
+	.loc 1 918 0
 	add	x14, x3, x14, sxtw
-.LVL370:
-	.loc 1 716 0
+.LVL400:
+	.loc 1 921 0
 	ldr	w3, [x18, 84]
-.LVL371:
-	.loc 1 722 0
+.LVL401:
+	.loc 1 927 0
 	cmp	w30, 0
-	.loc 1 716 0
+	.loc 1 921 0
 	lsr	w9, w3, 3
-.LVL372:
-	.loc 1 722 0
-	ble	.L342
+.LVL402:
+	.loc 1 927 0
+	ble	.L427
 	sub	w17, w9, #1
-.LBB1334:
-.LBB1335:
+.LBB1336:
+.LBB1337:
 	.loc 1 136 0
 	mov	w15, 3
 	add	x17, x17, 1
 	lsl	x17, x17, 2
-.LBE1335:
-.LBE1334:
-	.loc 1 723 0
-	cbz	w19, .L372
-.LVL373:
+.LBE1337:
+.LBE1336:
+	.loc 1 928 0
+	cbz	w19, .L457
+.LVL403:
 	.p2align 2
-.L447:
-	.loc 1 724 0
+.L532:
+	.loc 1 929 0
 	ldr	w13, [x18, 88]
-.LVL374:
+.LVL404:
 	sub	w13, w13, #1
 	sub	w13, w13, w16
 	mul	w13, w13, w3
 	lsr	w13, w13, 2
 	add	x13, x0, x13
-.LVL375:
-.L373:
-	.loc 1 728 0
-	cbz	w9, .L374
+.LVL405:
+.L458:
+	.loc 1 933 0
+	cbz	w9, .L459
 	add	x13, x13, 2
-.LVL376:
+.LVL406:
 	mov	x10, 0
 	.p2align 2
-.L387:
-	.loc 1 730 0
+.L472:
+	.loc 1 935 0
 	ldr	w6, [x2, x10, lsl 2]
-.LBB1341:
-.LBB1342:
+.LBB1343:
+.LBB1344:
 	.loc 1 140 0
 	mov	w4, 0
-.LBE1342:
-.LBE1341:
-	.loc 1 729 0
+.LBE1344:
+.LBE1343:
+	.loc 1 934 0
 	ldr	w7, [x1, x10, lsl 2]
-.LBB1347:
-.LBB1336:
+.LBB1349:
+.LBB1338:
 	.loc 1 140 0
 	mov	w5, 0
-.LBE1336:
-.LBE1347:
-	.loc 1 732 0
+.LBE1338:
+.LBE1349:
+	.loc 1 937 0
 	and	w20, w6, 65535
 	and	w12, w7, 65535
-.LBB1348:
-.LBB1343:
+.LBB1350:
+.LBB1345:
 	.loc 1 151 0
 	and	w3, w20, 65280
 	add	w8, w3, w12, lsr 8
-.LBE1343:
-.LBE1348:
-	.loc 1 733 0
+.LBE1345:
+.LBE1350:
+	.loc 1 938 0
 	lsr	w3, w6, 16
-.LBB1349:
-.LBB1337:
+.LBB1351:
+.LBB1339:
 	.loc 1 150 0
 	ubfiz	w23, w3, 8, 8
-.LBE1337:
-.LBE1349:
-	.loc 1 733 0
+.LBE1339:
+.LBE1351:
+	.loc 1 938 0
 	and	w3, w3, 65535
 	lsr	w11, w7, 16
-.LBB1350:
-.LBB1344:
+.LBB1352:
+.LBB1346:
 	.loc 1 150 0
 	ubfiz	w24, w6, 8, 8
-.LBE1344:
-.LBE1350:
-.LBB1351:
-.LBB1338:
+.LBE1346:
+.LBE1352:
+.LBB1353:
+.LBB1340:
 	.loc 1 151 0
 	and	w21, w3, 65280
-.LBE1338:
-.LBE1351:
-.LBB1352:
-.LBB1345:
+.LBE1340:
+.LBE1353:
+.LBB1354:
+.LBB1347:
 	.loc 1 137 0
 	eor	w25, w20, w12
 	.loc 1 150 0
 	add	w24, w24, w12, uxtb
-.LBE1345:
-.LBE1352:
-.LBB1353:
-.LBB1339:
+.LBE1347:
+.LBE1354:
+.LBB1355:
+.LBB1341:
 	add	w23, w23, w11, uxtb
 	.loc 1 137 0
 	eor	w22, w3, w11
 	.loc 1 151 0
 	add	w21, w21, w11, lsr 8
-.LBE1339:
-.LBE1353:
-	.loc 1 731 0
+.LBE1341:
+.LBE1355:
+	.loc 1 936 0
 	cmp	w7, w6
-	beq	.L375
-.LBB1354:
-.LBB1346:
+	beq	.L460
+.LBB1356:
+.LBB1348:
 	.loc 1 139 0
 	cmp	w20, w12
-	beq	.L376
+	beq	.L461
 	.loc 1 136 0
 	tst	x25, 15
 	.loc 1 151 0
@@ -4191,16 +4780,16 @@ direct_mode_data_change_part:
 	.loc 1 150 0
 	and	w4, w6, w4
 	and	w4, w4, 255
-.L376:
-.LBE1346:
-.LBE1354:
-	.loc 1 732 0
+.L461:
+.LBE1348:
+.LBE1356:
+	.loc 1 937 0
 	strb	w4, [x13, -2]
-.LBB1355:
-.LBB1340:
+.LBB1357:
+.LBB1342:
 	.loc 1 139 0
 	cmp	w3, w11
-	beq	.L381
+	beq	.L466
 	.loc 1 136 0
 	tst	x22, 15
 	.loc 1 150 0
@@ -4229,54 +4818,54 @@ direct_mode_data_change_part:
 	.loc 1 150 0
 	and	w3, w5, w3
 	and	w5, w3, 255
-.L381:
-.LBE1340:
-.LBE1355:
-	.loc 1 733 0
+.L466:
+.LBE1342:
+.LBE1357:
+	.loc 1 938 0
 	strb	w5, [x13, -1]
-.L386:
+.L471:
 	add	x10, x10, 1
 	add	x13, x13, 2
-	.loc 1 728 0
+	.loc 1 933 0
 	cmp	w9, w10
-	bgt	.L387
+	bgt	.L472
 	add	x1, x1, x17
 	add	x2, x2, x17
-.LVL377:
-.L374:
-	.loc 1 722 0
+.LVL407:
+.L459:
+	.loc 1 927 0
 	add	w16, w16, 1
 	cmp	w30, w16
-	beq	.L342
+	beq	.L427
 	ldr	w3, [x18, 84]
-	.loc 1 723 0
-	cbnz	w19, .L447
-.L372:
-	.loc 1 726 0
+	.loc 1 928 0
+	cbnz	w19, .L532
+.L457:
+	.loc 1 931 0
 	mul	w13, w16, w3
-.LVL378:
+.LVL408:
 	lsr	w13, w13, 2
 	add	x13, x0, x13
-.LVL379:
-	b	.L373
-.LVL380:
+.LVL409:
+	b	.L458
+.LVL410:
 	.p2align 3
-.L375:
-	.loc 1 736 0
+.L460:
+	.loc 1 941 0
 	strh	wzr, [x13, -2]
-	b	.L386
-.LVL381:
+	b	.L471
+.LVL411:
 	.p2align 3
-.L342:
-.LBE1333:
-.LBE1332:
-	.loc 1 794 0
+.L427:
+.LBE1335:
+.LBE1334:
+	.loc 1 999 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL382:
+.LVL412:
 	ldp	x23, x24, [sp, 48]
 	ldr	x25, [sp, 64]
-.LVL383:
+.LVL413:
 	ldp	x29, x30, [sp], 80
 	.cfi_remember_state
 	.cfi_restore 30
@@ -4289,108 +4878,108 @@ direct_mode_data_change_part:
 	.cfi_restore 19
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
-.LVL384:
+.LVL414:
 	ret
-.LVL385:
-.L446:
+.LVL415:
+.L531:
 	.cfi_restore_state
-.LBB1356:
-.LBB1331:
-.LBB1330:
-	.loc 1 748 0
+.LBB1358:
+.LBB1333:
+.LBB1332:
+	.loc 1 953 0
 	ldr	x14, [x5, #:lo12:.LANCHOR0]
-	.loc 1 753 0
+	.loc 1 958 0
 	ldrb	w7, [x3, 32]
 	ldr	w4, [x3, 40]
-	.loc 1 755 0
+	.loc 1 960 0
 	add	x14, x14, 24
-	.loc 1 754 0
+	.loc 1 959 0
 	ldr	x3, [x3, 112]
-.LVL386:
-	.loc 1 753 0
+.LVL416:
+	.loc 1 958 0
 	sub	w7, w7, w4
-.LVL387:
-	.loc 1 758 0
+.LVL417:
+	.loc 1 963 0
 	ldr	w15, [x14, 88]
-	.loc 1 754 0
+	.loc 1 959 0
 	lsl	w7, w7, 16
-.LVL388:
-	.loc 1 755 0
+.LVL418:
+	.loc 1 960 0
 	ldr	w16, [x14, 156]
-.LVL389:
-	.loc 1 754 0
+.LVL419:
+	.loc 1 959 0
 	add	x7, x3, x7, sxtw
-.LVL390:
-	.loc 1 757 0
+.LVL420:
+	.loc 1 962 0
 	ldr	w3, [x14, 84]
-.LVL391:
-	.loc 1 763 0
+.LVL421:
+	.loc 1 968 0
 	cmp	w15, 0
-	.loc 1 757 0
+	.loc 1 962 0
 	lsr	w11, w3, 4
-.LVL392:
-	.loc 1 763 0
-	ble	.L342
+.LVL422:
+	.loc 1 968 0
+	ble	.L427
 	sub	w13, w11, #1
 	mov	x9, x2
-.LVL393:
+.LVL423:
 	add	x13, x13, 1
 	mov	x8, x1
-.LVL394:
+.LVL424:
 	lsl	x13, x13, 3
 	mov	w12, 0
-.LVL395:
-.LBB1320:
-.LBB1321:
+.LVL425:
+.LBB1322:
+.LBB1323:
 	.loc 1 136 0
 	mov	w10, 3
-.LBE1321:
-.LBE1320:
-	.loc 1 764 0
-	cbz	w16, .L346
-.LVL396:
+.LBE1323:
+.LBE1322:
+	.loc 1 969 0
+	cbz	w16, .L431
+.LVL426:
 	.p2align 2
-.L448:
-	.loc 1 765 0
+.L533:
+	.loc 1 970 0
 	ldr	w1, [x14, 88]
-.LVL397:
+.LVL427:
 	sub	w1, w1, #1
 	sub	w1, w1, w12
 	mul	w3, w1, w3
 	lsr	w3, w3, 2
 	add	x3, x0, x3
-.LVL398:
-.L347:
-	.loc 1 769 0
-	cbz	w11, .L348
+.LVL428:
+.L432:
+	.loc 1 974 0
+	cbz	w11, .L433
 	add	x3, x3, 4
-.LVL399:
+.LVL429:
 	mov	x5, 0
 	.p2align 2
-.L371:
-	.loc 1 770 0
+.L456:
+	.loc 1 975 0
 	ldr	x1, [x8, x5, lsl 3]
-.LVL400:
-	.loc 1 771 0
+.LVL430:
+	.loc 1 976 0
 	ldr	x2, [x9, x5, lsl 3]
-.LVL401:
-	.loc 1 772 0
+.LVL431:
+	.loc 1 977 0
 	cmp	x1, x2
-	beq	.L349
-	.loc 1 773 0
+	beq	.L434
+	.loc 1 978 0
 	and	w17, w2, 65535
 	and	w6, w1, 65535
-.LVL402:
-.LBB1323:
-.LBB1324:
+.LVL432:
+.LBB1325:
+.LBB1326:
 	.loc 1 140 0
 	mov	w4, 0
 	.loc 1 139 0
 	cmp	w17, w6
-	beq	.L350
+	beq	.L435
 	.loc 1 137 0
 	eor	w18, w17, w6
-.LVL403:
+.LVL433:
 	.loc 1 150 0
 	ubfiz	w19, w17, 8, 8
 	.loc 1 151 0
@@ -4428,25 +5017,25 @@ direct_mode_data_change_part:
 	.loc 1 150 0
 	and	w4, w6, w4
 	and	w4, w4, 255
-.LVL404:
-.L350:
-.LBE1324:
-.LBE1323:
-	.loc 1 773 0
+.LVL434:
+.L435:
+.LBE1326:
+.LBE1325:
+	.loc 1 978 0
 	strb	w4, [x3, -4]
-	.loc 1 774 0
+	.loc 1 979 0
 	lsr	w17, w2, 16
 	lsr	w6, w1, 16
-.LBB1325:
-.LBB1326:
+.LBB1327:
+.LBB1328:
 	.loc 1 140 0
 	mov	w4, 0
 	.loc 1 139 0
 	cmp	w17, w6
-	beq	.L355
+	beq	.L440
 	.loc 1 137 0
 	eor	w18, w17, w6
-.LVL405:
+.LVL435:
 	.loc 1 150 0
 	ubfiz	w19, w17, 8, 8
 	.loc 1 151 0
@@ -4484,25 +5073,25 @@ direct_mode_data_change_part:
 	.loc 1 150 0
 	and	w4, w6, w4
 	and	w4, w4, 255
-.LVL406:
-.L355:
-.LBE1326:
-.LBE1325:
-	.loc 1 774 0
+.LVL436:
+.L440:
+.LBE1328:
+.LBE1327:
+	.loc 1 979 0
 	strb	w4, [x3, -3]
-	.loc 1 775 0
+	.loc 1 980 0
 	ubfx	x17, x2, 32, 16
 	ubfx	x6, x1, 32, 16
-.LBB1327:
-.LBB1328:
+.LBB1329:
+.LBB1330:
 	.loc 1 140 0
 	mov	w4, 0
 	.loc 1 139 0
 	cmp	w17, w6
-	beq	.L360
+	beq	.L445
 	.loc 1 137 0
 	eor	w18, w17, w6
-.LVL407:
+.LVL437:
 	.loc 1 150 0
 	ubfiz	w19, w17, 8, 8
 	.loc 1 151 0
@@ -4540,27 +5129,27 @@ direct_mode_data_change_part:
 	.loc 1 150 0
 	and	w4, w6, w4
 	and	w4, w4, 255
-.LVL408:
-.L360:
-.LBE1328:
-.LBE1327:
-	.loc 1 775 0
+.LVL438:
+.L445:
+.LBE1330:
+.LBE1329:
+	.loc 1 980 0
 	strb	w4, [x3, -2]
-	.loc 1 776 0
+	.loc 1 981 0
 	lsr	x2, x2, 48
-.LVL409:
+.LVL439:
 	lsr	x1, x1, 48
-.LVL410:
-.LBB1329:
-.LBB1322:
+.LVL440:
+.LBB1331:
+.LBB1324:
 	.loc 1 140 0
 	mov	w4, 0
 	.loc 1 139 0
 	cmp	w2, w1
-	beq	.L365
+	beq	.L450
 	.loc 1 137 0
 	eor	w6, w2, w1
-.LVL411:
+.LVL441:
 	.loc 1 150 0
 	ubfiz	w4, w2, 8, 8
 	.loc 1 151 0
@@ -4576,7 +5165,7 @@ direct_mode_data_change_part:
 	.loc 1 144 0
 	tst	w6, 240
 	orr	w18, w2, 12
-.LVL412:
+.LVL442:
 	.loc 1 150 0
 	ldrb	w17, [x7, w4, sxtw]
 	.loc 1 144 0
@@ -4599,122 +5188,122 @@ direct_mode_data_change_part:
 	.loc 1 150 0
 	and	w2, w4, w2
 	and	w4, w2, 255
-.LVL413:
-.L365:
-.LBE1322:
-.LBE1329:
-	.loc 1 776 0
+.LVL443:
+.L450:
+.LBE1324:
+.LBE1331:
+	.loc 1 981 0
 	strb	w4, [x3, -1]
-.LVL414:
-.L370:
+.LVL444:
+.L455:
 	add	x5, x5, 1
 	add	x3, x3, 4
-	.loc 1 769 0
+	.loc 1 974 0
 	cmp	w11, w5
-	bgt	.L371
+	bgt	.L456
 	add	x8, x8, x13
 	add	x9, x9, x13
-.LVL415:
-.L348:
-	.loc 1 763 0
+.LVL445:
+.L433:
+	.loc 1 968 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L342
+	beq	.L427
 	ldr	w3, [x14, 84]
-.LVL416:
-	.loc 1 764 0
-	cbnz	w16, .L448
-.L346:
-	.loc 1 767 0
+.LVL446:
+	.loc 1 969 0
+	cbnz	w16, .L533
+.L431:
+	.loc 1 972 0
 	mul	w3, w12, w3
 	lsr	w3, w3, 2
 	add	x3, x0, x3
-.LVL417:
-	b	.L347
-.LVL418:
+.LVL447:
+	b	.L432
+.LVL448:
 	.p2align 3
-.L349:
-	.loc 1 779 0
+.L434:
+	.loc 1 984 0
 	str	wzr, [x3, -4]
-	b	.L370
-.LBE1330:
-.LBE1331:
-.LBE1356:
+	b	.L455
+.LBE1332:
+.LBE1333:
+.LBE1358:
 	.cfi_endproc
-.LFE2817:
+.LFE2818:
 	.size	direct_mode_data_change_part, .-direct_mode_data_change_part
 	.align	2
 	.p2align 3,,7
 	.type	flip.isra.7, %function
 flip.isra.7:
-.LFB2860:
-	.loc 1 796 0
+.LFB2861:
+	.loc 1 1001 0
 	.cfi_startproc
-.LVL419:
+.LVL449:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 800 0
+	.loc 1 1005 0
 	sxtw	x2, w1
-	.loc 1 796 0
+	.loc 1 1001 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 796 0
+	.loc 1 1001 0
 	mov	x20, x0
-	.loc 1 798 0
+	.loc 1 1003 0
 	ldr	w19, [x0, 72]
-	.loc 1 800 0
+	.loc 1 1005 0
 	ldr	x0, [x0]
-.LVL420:
-.LBB1357:
-.LBB1358:
+.LVL450:
 .LBB1359:
 .LBB1360:
+.LBB1361:
+.LBB1362:
 	.file 10 "./include/linux/dma-mapping.h"
 	.loc 10 266 0
-	cbz	x0, .L452
+	cbz	x0, .L537
 	ldr	x3, [x0, 648]
 	.loc 10 268 0
 	adrp	x4, dummy_dma_ops
 	add	x4, x4, :lo12:dummy_dma_ops
 	cmp	x3, 0
 	csel	x3, x4, x3, eq
-.L450:
-.LBE1360:
-.LBE1359:
+.L535:
+.LBE1362:
+.LBE1361:
 	.loc 10 434 0
 	ldr	x5, [x3, 88]
 	sxtw	x19, w19
-	cbz	x5, .L451
-.LBE1358:
-.LBE1357:
-	.loc 1 800 0
+	cbz	x5, .L536
+.LBE1360:
+.LBE1359:
+	.loc 1 1005 0
 	add	x4, x19, x19, lsl 1
-.LBB1366:
-.LBB1363:
+.LBB1368:
+.LBB1365:
 	.loc 10 435 0
 	mov	w3, 1
-.LBE1363:
-.LBE1366:
-	.loc 1 800 0
+.LBE1365:
+.LBE1368:
+	.loc 1 1005 0
 	add	x4, x20, x4, lsl 3
-.LBB1367:
-.LBB1364:
+.LBB1369:
+.LBB1366:
 	.loc 10 435 0
 	ldr	x1, [x4, 32]
 	blr	x5
-.LVL421:
-.L451:
-.LBE1364:
-.LBE1367:
-	.loc 1 801 0
+.LVL451:
+.L536:
+.LBE1366:
+.LBE1369:
+	.loc 1 1006 0
 	ldr	x5, [x20, 8]
-.LBB1368:
-.LBB1369:
+.LBB1370:
+.LBB1371:
 	.file 11 "drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.h"
 	.loc 11 57 0
 	mov	w4, 0
@@ -4722,58 +5311,58 @@ flip.isra.7:
 	mov	w2, 0
 	mov	x0, x5
 	mov	w1, 0
-.LBE1369:
-.LBE1368:
-	.loc 1 802 0
+.LBE1371:
+.LBE1370:
+	.loc 1 1007 0
 	add	x19, x19, x19, lsl 1
+.LBB1374:
 .LBB1372:
-.LBB1370:
 	.loc 11 57 0
 	ldr	x5, [x5, 64]
-.LBE1370:
 .LBE1372:
-	.loc 1 802 0
+.LBE1374:
+	.loc 1 1007 0
 	add	x19, x20, x19, lsl 3
+.LBB1375:
 .LBB1373:
-.LBB1371:
 	.loc 11 57 0
 	blr	x5
-.LVL422:
-.LBE1371:
+.LVL452:
 .LBE1373:
-	.loc 1 802 0
+.LBE1375:
+	.loc 1 1007 0
 	ldr	x1, [x20, 8]
-.LBB1374:
-.LBB1375:
+.LBB1376:
+.LBB1377:
 	.loc 11 62 0
 	mov	w2, 0
 	mov	x0, x1
 	ldr	x3, [x1, 72]
 	ldr	w1, [x19, 32]
 	blr	x3
-.LVL423:
-.LBE1375:
-.LBE1374:
-	.loc 1 803 0
+.LVL453:
+.LBE1377:
+.LBE1376:
+	.loc 1 1008 0
 	ldr	x2, [x20, 8]
-.LBB1376:
-.LBB1377:
+.LBB1378:
+.LBB1379:
 	.loc 11 77 0
 	mov	w1, 1
 	mov	x0, x2
 	ldr	x2, [x2, 96]
 	blr	x2
-.LVL424:
-.LBE1377:
-.LBE1376:
-	.loc 1 804 0
+.LVL454:
+.LBE1379:
+.LBE1378:
+	.loc 1 1009 0
 	ldr	w1, [x20, 72]
 	mov	w0, 1
 	sub	w0, w0, w1
 	str	w0, [x20, 72]
-	.loc 1 805 0
+	.loc 1 1010 0
 	ldp	x19, x20, [sp, 16]
-.LVL425:
+.LVL455:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -4782,33 +5371,33 @@ flip.isra.7:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL426:
+.LVL456:
 	.p2align 3
-.L452:
+.L537:
 	.cfi_restore_state
-.LBB1378:
-.LBB1365:
-.LBB1362:
-.LBB1361:
+.LBB1380:
+.LBB1367:
+.LBB1364:
+.LBB1363:
 	.loc 10 268 0
 	adrp	x3, dummy_dma_ops
 	add	x3, x3, :lo12:dummy_dma_ops
-	b	.L450
-.LBE1361:
-.LBE1362:
-.LBE1365:
-.LBE1378:
+	b	.L535
+.LBE1363:
+.LBE1364:
+.LBE1367:
+.LBE1380:
 	.cfi_endproc
-.LFE2860:
+.LFE2861:
 	.size	flip.isra.7, .-flip.isra.7
 	.align	2
 	.p2align 3,,7
 	.type	ebc_frame_start, %function
 ebc_frame_start:
-.LFB2820:
-	.loc 1 814 0
+.LFB2821:
+	.loc 1 1019 0
 	.cfi_startproc
-.LVL427:
+.LVL457:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
@@ -4818,69 +5407,68 @@ ebc_frame_start:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 816 0
+	.loc 1 1021 0
 	add	x19, x0, 184
-	.loc 1 814 0
+	.loc 1 1019 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 814 0
+	.loc 1 1019 0
 	mov	x20, x0
-	.loc 1 815 0
+	.loc 1 1020 0
 	add	x21, x0, 24
-	.loc 1 818 0
+	.loc 1 1023 0
 	ldr	x1, [x19, 208]
 	ldr	w0, [x1, 40]
-.LVL428:
-	tbnz	w0, #31, .L458
+.LVL458:
 	cmp	w0, 1
-	ble	.L459
+	beq	.L544
+	ble	.L553
 	sub	w0, w0, #7
 	cmp	w0, 8
-	bhi	.L458
-	.loc 1 850 0
+	bhi	.L543
+	.loc 1 1072 0
 	ldr	x2, [x19, 200]
-	.loc 1 848 0
+	.loc 1 1070 0
 	mov	x3, x19
-	.loc 1 847 0
+	.loc 1 1069 0
 	ldrb	w0, [x19, 32]
 	str	w0, [x19, 40]
-	.loc 1 848 0
+	.loc 1 1070 0
 	ldr	x0, [x19, 168]
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change_part
-.LVL429:
-.LBB1379:
-.LBB1380:
-	.loc 1 809 0
+.LVL459:
+.LBB1381:
+.LBB1382:
+	.loc 1 1014 0
 	str	wzr, [x21, 72]
-	.loc 1 810 0
+	.loc 1 1015 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
-.LVL430:
-.LBE1380:
-.LBE1379:
-	.loc 1 853 0
+.LVL460:
+.LBE1382:
+.LBE1381:
+	.loc 1 1075 0
 	ldr	w0, [x19, 40]
-	.loc 1 854 0
+	.loc 1 1076 0
 	mov	x3, x19
-	.loc 1 855 0
+	.loc 1 1077 0
 	ldp	x2, x1, [x19, 200]
-	.loc 1 853 0
+	.loc 1 1075 0
 	sub	w0, w0, #1
 	str	w0, [x19, 40]
-	.loc 1 854 0
+	.loc 1 1076 0
 	ldr	x0, [x19, 176]
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part
-.LVL431:
-.L457:
-	.loc 1 875 0
-	ldp	x19, x20, [sp, 16]
-.LVL432:
+.LVL461:
+	.loc 1 1097 0
 	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
+.LVL462:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 30
@@ -4890,53 +5478,145 @@ ebc_frame_start:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL433:
+.LVL463:
 	.p2align 3
-.L458:
+.L553:
+	.cfi_restore_state
+	.loc 1 1023 0
+	cbnz	w0, .L543
+	.loc 1 1043 0
+	ldr	x0, [x19, 168]
+	mov	x4, x19
+	ldp	x1, x2, [x19, 128]
+	ldr	x3, [x19, 152]
+	bl	get_auto_image
+.LVL464:
+	.loc 1 1048 0
+	ldr	w0, [x19, 36]
+	cbz	w0, .L550
+.LBB1383:
+.LBB1384:
+	.loc 1 1014 0
+	str	wzr, [x21, 72]
+	.loc 1 1015 0
+	mov	x0, x21
+	ldr	w1, [x20, 208]
+	bl	flip.isra.7
+.LVL465:
+.LBE1384:
+.LBE1383:
+	.loc 1 1050 0
+	ldp	x1, x2, [x19, 128]
+	mov	x4, x19
+	ldr	x3, [x19, 152]
+	ldr	x0, [x19, 176]
+	bl	get_auto_image
+.LVL466:
+	.loc 1 1097 0
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
+.LVL467:
+	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
+.LVL468:
+	.p2align 3
+.L544:
+	.cfi_restore_state
+	.loc 1 1025 0
+	ldr	x0, [x19, 168]
+	mov	x4, x19
+	ldp	x1, x2, [x19, 128]
+	ldr	x3, [x19, 152]
+	bl	get_overlay_image
+.LVL469:
+	.loc 1 1030 0
+	ldr	w0, [x19, 36]
+	cbz	w0, .L548
+.LBB1385:
+.LBB1386:
+	.loc 1 1014 0
+	str	wzr, [x21, 72]
+	.loc 1 1015 0
+	mov	x0, x21
+	ldr	w1, [x20, 208]
+	bl	flip.isra.7
+.LVL470:
+.LBE1386:
+.LBE1385:
+	.loc 1 1032 0
+	ldp	x1, x2, [x19, 128]
+	mov	x4, x19
+	ldr	x3, [x19, 152]
+	ldr	x0, [x19, 176]
+	bl	get_overlay_image
+.LVL471:
+	.loc 1 1097 0
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
+.LVL472:
+	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
+.LVL473:
+	.p2align 3
+.L543:
 	.cfi_restore_state
-	.loc 1 863 0
+	.loc 1 1085 0
 	ldr	x2, [x19, 200]
-	.loc 1 861 0
+	.loc 1 1083 0
 	mov	x3, x19
-	.loc 1 860 0
+	.loc 1 1082 0
 	ldrb	w0, [x19, 32]
 	str	w0, [x19, 40]
-	.loc 1 861 0
+	.loc 1 1083 0
 	ldr	x0, [x19, 168]
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change
-.LVL434:
-.LBB1381:
-.LBB1382:
-	.loc 1 809 0
+.LVL474:
+.LBB1387:
+.LBB1388:
+	.loc 1 1014 0
 	str	wzr, [x21, 72]
-	.loc 1 810 0
+	.loc 1 1015 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
-.LVL435:
-.LBE1382:
-.LBE1381:
-	.loc 1 866 0
+.LVL475:
+.LBE1388:
+.LBE1387:
+	.loc 1 1088 0
 	ldr	w0, [x19, 40]
-	.loc 1 867 0
+	.loc 1 1089 0
 	mov	x3, x19
-	.loc 1 868 0
+	.loc 1 1090 0
 	ldp	x2, x1, [x19, 200]
-	.loc 1 866 0
+	.loc 1 1088 0
 	sub	w0, w0, #1
 	str	w0, [x19, 40]
-	.loc 1 867 0
+	.loc 1 1089 0
 	ldr	x0, [x19, 176]
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
-.LVL436:
-	.loc 1 875 0
+.LVL476:
+	.loc 1 1097 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL437:
+.LVL477:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -4946,42 +5626,24 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL438:
+.LVL478:
 	.p2align 3
-.L459:
+.L548:
 	.cfi_restore_state
-	.loc 1 821 0
-	ldr	x0, [x19, 168]
-	mov	x4, x19
-	ldp	x1, x2, [x19, 128]
-	ldr	x3, [x19, 152]
-	bl	get_auto_image
-.LVL439:
-	.loc 1 826 0
-	ldr	w0, [x19, 36]
-	cbz	w0, .L461
-.LBB1383:
-.LBB1384:
-	.loc 1 809 0
-	str	wzr, [x21, 72]
-	.loc 1 810 0
-	mov	x0, x21
-	ldr	w1, [x20, 208]
-	bl	flip.isra.7
-.LVL440:
-.LBE1384:
-.LBE1383:
-	.loc 1 828 0
-	ldp	x1, x2, [x19, 128]
-	mov	x4, x19
-	ldr	x3, [x19, 152]
-	ldr	x0, [x19, 176]
-	bl	get_auto_image
-.LVL441:
-	.loc 1 875 0
-	ldr	x21, [sp, 32]
+	.loc 1 1038 0
+	ldr	x0, [x19, 88]
+	adrp	x2, .LANCHOR3
+	adrp	x1, .LC20
+	add	x2, x2, :lo12:.LANCHOR3
+	add	x1, x1, :lo12:.LC20
+	bl	_dev_info
+.LVL479:
+	.loc 1 1039 0
+	str	wzr, [x19, 28]
+	.loc 1 1097 0
 	ldp	x19, x20, [sp, 16]
-.LVL442:
+.LVL480:
+	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -4991,39 +5653,52 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL443:
-.L461:
+.LVL481:
+	.p2align 3
+.L550:
 	.cfi_restore_state
-	.loc 1 834 0
-	adrp	x1, .LANCHOR3
-	adrp	x0, .LC20
-	add	x1, x1, :lo12:.LANCHOR3
-	add	x0, x0, :lo12:.LC20
-	bl	printk
-.LVL444:
-	.loc 1 835 0
+	.loc 1 1056 0
+	ldr	x0, [x19, 88]
+	adrp	x2, .LANCHOR3
+	adrp	x1, .LC21
+	add	x2, x2, :lo12:.LANCHOR3
+	add	x1, x1, :lo12:.LC21
+	bl	_dev_info
+.LVL482:
+	.loc 1 1057 0
 	str	wzr, [x19, 28]
-	b	.L457
+	.loc 1 1097 0
+	ldp	x19, x20, [sp, 16]
+.LVL483:
+	ldr	x21, [sp, 32]
+	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
-.LFE2820:
+.LFE2821:
 	.size	ebc_frame_start, .-ebc_frame_start
 	.align	2
 	.p2align 3,,7
 	.type	ebc_auto_tast_function, %function
 ebc_auto_tast_function:
-.LFB2821:
-	.loc 1 878 0
+.LFB2822:
+	.loc 1 1100 0
 	.cfi_startproc
-.LVL445:
+.LVL484:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
 	.cfi_offset 30, -88
-	.loc 1 879 0
+	.loc 1 1101 0
 	adrp	x1, .LANCHOR0
-	.loc 1 878 0
+	.loc 1 1100 0
 	adrp	x0, __stack_chk_guard
-.LVL446:
+.LVL485:
 	add	x0, x0, :lo12:__stack_chk_guard
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -5032,233 +5707,249 @@ ebc_auto_tast_function:
 	.cfi_offset 20, -72
 	adrp	x20, .LANCHOR1
 	stp	x21, x22, [sp, 32]
-	.loc 1 884 0
+	.loc 1 1106 0
 	add	x20, x20, :lo12:.LANCHOR1
 	.cfi_offset 21, -64
 	.cfi_offset 22, -56
-	.loc 1 879 0
+	.loc 1 1101 0
 	ldr	x22, [x1, #:lo12:.LANCHOR0]
-.LVL447:
-	.loc 1 884 0
+.LVL486:
+	.loc 1 1106 0
 	add	x20, x20, 376
-	.loc 1 878 0
+	.loc 1 1100 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
-.LBB1385:
-.LBB1386:
-.LBB1387:
+.LBB1389:
+.LBB1390:
+.LBB1391:
 	.file 12 "./include/linux/compiler.h"
 	.loc 12 288 0
 	mov	x24, 2
-.LBE1387:
-.LBE1386:
-.LBE1385:
-	.loc 1 878 0
+.LBE1391:
+.LBE1390:
+.LBE1389:
+	.loc 1 1100 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -32
 	.cfi_offset 26, -24
-	.loc 1 880 0
+	.loc 1 1102 0
 	add	x21, x22, 24
-	.loc 1 881 0
+	.loc 1 1103 0
 	add	x19, x22, 184
 	add	x26, x22, 728
-	.loc 1 878 0
+	.loc 1 1100 0
 	ldr	x1, [x0]
 	str	x1, [x29, 88]
 	mov	x1,0
 	adrp	x25, system_wq
-.LBB1392:
-.LBB1389:
-.LBB1390:
+.LBB1396:
+.LBB1393:
+.LBB1394:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x23, sp_el0
 // 0 "" 2
-.LVL448:
+.LVL487:
 #NO_APP
-	b	.L474
+	b	.L565
 	.p2align 3
-.L492:
-.LBE1390:
-.LBE1389:
-.LBE1392:
-	.loc 1 889 0
-	sub	w0, w0, #7
-	cmp	w0, 8
-	bhi	.L466
-	.loc 1 908 0
-	ldr	w1, [x19, 40]
-	.loc 1 909 0
-	mov	x0, x21
-	.loc 1 908 0
-	sub	w1, w1, #1
-	str	w1, [x19, 40]
-	.loc 1 909 0
+.L582:
+.LBE1394:
+.LBE1393:
+.LBE1396:
+	.loc 1 1111 0
+	cbnz	w0, .L555
+	.loc 1 1121 0
 	ldr	w1, [x22, 208]
+	mov	x0, x21
 	bl	flip.isra.7
-.LVL449:
-	.loc 1 910 0
-	ldr	w0, [x19, 40]
-	cbnz	w0, .L490
-.L469:
-	.loc 1 930 0
+.LVL488:
+	.loc 1 1122 0
+	ldrsw	x0, [x21, 72]
+	mov	x4, x19
+	ldp	x1, x2, [x19, 128]
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 152]
+	ldr	x0, [x0, 168]
+	bl	get_auto_image
+.LVL489:
+.L560:
+	.loc 1 1159 0
 	ldr	x0, [x19, 208]
 	ldr	w0, [x0, 40]
-	cbz	w0, .L472
-.L493:
-	.loc 1 931 0
+	cbz	w0, .L563
+.L583:
+	.loc 1 1160 0
 	cmp	w0, 1
-	beq	.L491
-.L473:
-	.loc 1 934 0
+	beq	.L581
+.L564:
+	.loc 1 1163 0
 	mov	x0, x20
 	bl	up
-.LVL450:
-	.loc 1 935 0
+.LVL490:
+	.loc 1 1164 0
 	bl	schedule
-.LVL451:
-.L474:
-	.loc 1 884 0
+.LVL491:
+.L565:
+	.loc 1 1106 0
 	mov	x0, x20
 	bl	down
-.LVL452:
-.LBB1393:
-.LBB1391:
-.LBB1388:
+.LVL492:
+.LBB1397:
+.LBB1395:
+.LBB1392:
 	.loc 12 288 0
 	str	x24, [x23, 32]
-.LBE1388:
-.LBE1391:
-.LBE1393:
-	.loc 1 888 0
+.LBE1392:
+.LBE1395:
+.LBE1397:
+	.loc 1 1110 0
 #APP
-// 888 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
+// 1110 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
 	dmb ish
 // 0 "" 2
-	.loc 1 889 0
+	.loc 1 1111 0
 #NO_APP
 	ldr	x0, [x19, 208]
 	ldr	w0, [x0, 40]
-	tbnz	w0, #31, .L466
 	cmp	w0, 1
-	bgt	.L492
-	.loc 1 892 0
-	ldr	w1, [x22, 208]
+	beq	.L556
+	ble	.L582
+	sub	w0, w0, #7
+	cmp	w0, 8
+	bhi	.L555
+	.loc 1 1137 0
+	ldr	w1, [x19, 40]
+	.loc 1 1138 0
 	mov	x0, x21
+	.loc 1 1137 0
+	sub	w1, w1, #1
+	str	w1, [x19, 40]
+	.loc 1 1138 0
+	ldr	w1, [x22, 208]
 	bl	flip.isra.7
-.LVL453:
-	.loc 1 893 0
+.LVL493:
+	.loc 1 1139 0
+	ldr	w0, [x19, 40]
+	cbz	w0, .L560
+	.loc 1 1141 0
 	ldrsw	x0, [x21, 72]
-	mov	x4, x19
-	ldp	x1, x2, [x19, 128]
+	mov	x3, x19
+	.loc 1 1142 0
+	ldp	x2, x1, [x19, 200]
+	.loc 1 1141 0
 	add	x0, x19, x0, lsl 3
-	ldr	x3, [x19, 152]
+	ldr	x1, [x1, 16]
 	ldr	x0, [x0, 168]
-	bl	get_auto_image
-.LVL454:
-	.loc 1 930 0
+	ldr	x2, [x2, 16]
+	bl	direct_mode_data_change_part
+.LVL494:
+	.loc 1 1159 0
 	ldr	x0, [x19, 208]
 	ldr	w0, [x0, 40]
-	cbnz	w0, .L493
-.L472:
-.LBB1394:
-.LBB1395:
-.LBB1396:
-.LBB1397:
+	cbnz	w0, .L583
+	.p2align 2
+.L563:
+.LBB1398:
+.LBB1399:
+.LBB1400:
+.LBB1401:
 	.file 13 "./include/linux/workqueue.h"
 	.loc 13 518 0
 	ldr	x1, [x25, #:lo12:system_wq]
 	mov	x2, x26
 	mov	w0, 8
 	bl	queue_work_on
-.LVL455:
-	b	.L473
+.LVL495:
+	b	.L564
 	.p2align 3
-.L466:
-.LBE1397:
-.LBE1396:
-.LBE1395:
-.LBE1394:
-	.loc 1 918 0
+.L555:
+.LBE1401:
+.LBE1400:
+.LBE1399:
+.LBE1398:
+	.loc 1 1147 0
 	ldr	w1, [x19, 40]
-	.loc 1 919 0
+	.loc 1 1148 0
 	mov	x0, x21
-	.loc 1 918 0
+	.loc 1 1147 0
 	sub	w1, w1, #1
 	str	w1, [x19, 40]
-	.loc 1 919 0
+	.loc 1 1148 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.7
-.LVL456:
-	.loc 1 920 0
+.LVL496:
+	.loc 1 1149 0
 	ldr	w0, [x19, 40]
-	cbz	w0, .L469
-	.loc 1 922 0
+	cbz	w0, .L560
+	.loc 1 1151 0
 	ldrsw	x0, [x21, 72]
 	mov	x3, x19
-	.loc 1 923 0
+	.loc 1 1152 0
 	ldp	x2, x1, [x19, 200]
-	.loc 1 922 0
+	.loc 1 1151 0
 	add	x0, x19, x0, lsl 3
 	ldr	x1, [x1, 16]
 	ldr	x0, [x0, 168]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
-.LVL457:
-	.loc 1 926 0
-	b	.L469
+.LVL497:
+	.loc 1 1155 0
+	b	.L560
+	.p2align 3
+.L556:
+	.loc 1 1113 0
+	ldr	w1, [x22, 208]
+	mov	x0, x21
+	bl	flip.isra.7
+.LVL498:
+	.loc 1 1114 0
+	ldrsw	x0, [x21, 72]
+	mov	x4, x19
+	ldp	x1, x2, [x19, 128]
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 152]
+	ldr	x0, [x0, 168]
+	bl	get_overlay_image
+.LVL499:
+	.loc 1 1119 0
+	b	.L560
 	.p2align 3
-.L491:
-	.loc 1 931 0 discriminator 1
+.L581:
+	.loc 1 1160 0 discriminator 1
 	ldr	w0, [x19, 604]
-	cbz	w0, .L473
-	.loc 1 931 0 is_stmt 0 discriminator 2
+	cbz	w0, .L564
+	.loc 1 1160 0 is_stmt 0 discriminator 2
 	ldr	w0, [x19, 608]
-	cbz	w0, .L473
-.LBB1401:
-.LBB1400:
-.LBB1399:
-.LBB1398:
+	cbz	w0, .L564
+.LBB1405:
+.LBB1404:
+.LBB1403:
+.LBB1402:
 	.loc 13 518 0 is_stmt 1
 	ldr	x1, [x25, #:lo12:system_wq]
 	mov	x2, x26
 	mov	w0, 8
 	bl	queue_work_on
-.LVL458:
-	b	.L473
-	.p2align 3
-.L490:
-.LBE1398:
-.LBE1399:
-.LBE1400:
-.LBE1401:
-	.loc 1 912 0
-	ldrsw	x0, [x21, 72]
-	mov	x3, x19
-	.loc 1 913 0
-	ldp	x2, x1, [x19, 200]
-	.loc 1 912 0
-	add	x0, x19, x0, lsl 3
-	ldr	x1, [x1, 16]
-	ldr	x0, [x0, 168]
-	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change_part
-.LVL459:
-	.loc 1 916 0
-	b	.L469
+.LVL500:
+	b	.L564
+.LBE1402:
+.LBE1403:
+.LBE1404:
+.LBE1405:
 	.cfi_endproc
-.LFE2821:
+.LFE2822:
 	.size	ebc_auto_tast_function, .-ebc_auto_tast_function
 	.align	2
 	.p2align 3,,7
 	.type	ebc_power_set.part.8, %function
 ebc_power_set.part.8:
-.LFB2861:
+.LFB2862:
 	.loc 1 180 0
 	.cfi_startproc
-.LVL460:
+.LVL501:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -5274,41 +5965,41 @@ ebc_power_set.part.8:
 	str	w1, [x0, 368]
 	.loc 1 198 0
 	ldr	x1, [x0, 8]
-.LVL461:
-.LBB1402:
-.LBB1403:
+.LVL502:
+.LBB1406:
+.LBB1407:
 	.loc 11 51 0
 	mov	x0, x1
-.LVL462:
+.LVL503:
 	ldr	x1, [x1, 56]
 	blr	x1
-.LVL463:
-.LBE1403:
-.LBE1402:
+.LVL504:
+.LBE1407:
+.LBE1406:
 	.loc 1 199 0
 	ldr	x2, [x19, 16]
-.LBB1404:
-.LBB1405:
+.LBB1408:
+.LBB1409:
 	.loc 3 35 0
 	mov	w1, 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL464:
-.LBE1405:
-.LBE1404:
+.LVL505:
+.LBE1409:
+.LBE1408:
 	.loc 1 200 0
 	ldr	w0, [x19, 608]
-	cbnz	w0, .L500
+	cbnz	w0, .L590
 	.loc 1 204 0
 	ldr	x0, [x19]
-	adrp	x1, .LC21
-	add	x1, x1, :lo12:.LC21
+	adrp	x1, .LC22
+	add	x1, x1, :lo12:.LC22
 	bl	_dev_info
-.LVL465:
+.LVL506:
 	.loc 1 208 0
 	ldp	x19, x20, [sp, 16]
-.LVL466:
+.LVL507:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -5317,29 +6008,29 @@ ebc_power_set.part.8:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL467:
+.LVL508:
 	.p2align 3
-.L500:
+.L590:
 	.cfi_restore_state
 	.loc 1 201 0
 	str	wzr, [x19, 608]
-.LBB1406:
-.LBB1407:
+.LBB1410:
+.LBB1411:
 	.loc 4 68 0
 	add	x0, x19, 400
 	bl	__pm_relax
-.LVL468:
-.LBE1407:
-.LBE1406:
+.LVL509:
+.LBE1411:
+.LBE1410:
 	.loc 1 204 0
 	ldr	x0, [x19]
-	adrp	x1, .LC21
-	add	x1, x1, :lo12:.LC21
+	adrp	x1, .LC22
+	add	x1, x1, :lo12:.LC22
 	bl	_dev_info
-.LVL469:
+.LVL510:
 	.loc 1 208 0
 	ldp	x19, x20, [sp, 16]
-.LVL470:
+.LVL511:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -5348,16 +6039,16 @@ ebc_power_set.part.8:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2861:
+.LFE2862:
 	.size	ebc_power_set.part.8, .-ebc_power_set.part.8
 	.align	2
 	.p2align 3,,7
 	.type	ebc_suspend, %function
 ebc_suspend:
-.LFB2849:
-	.loc 1 2211 0
+.LFB2850:
+	.loc 1 2440 0
 	.cfi_startproc
-.LVL471:
+.LVL512:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -5367,40 +6058,40 @@ ebc_suspend:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-.LBB1408:
-.LBB1409:
+.LBB1412:
+.LBB1413:
 	.loc 2 1181 0
 	ldr	x20, [x0, 184]
-.LBE1409:
-.LBE1408:
-	.loc 1 2215 0
+.LBE1413:
+.LBE1412:
+	.loc 1 2444 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 184]
-.LVL472:
+.LVL513:
 	cmp	w0, 1
-	beq	.L504
-.L502:
-	.loc 1 2219 0
+	beq	.L594
+.L592:
+	.loc 1 2448 0
 	mov	w0, 1
 	str	w0, [x19, 596]
-	.loc 1 2221 0
+	.loc 1 2450 0
 	ldr	x1, [x20, 16]
-.LBB1410:
-.LBB1411:
+.LBB1414:
+.LBB1415:
 	.loc 3 40 0
 	mov	x0, x1
 	ldr	x1, [x1, 40]
 	blr	x1
-.LVL473:
-.LBE1411:
-.LBE1410:
-	.loc 1 2222 0
+.LVL514:
+.LBE1415:
+.LBE1414:
+	.loc 1 2451 0
 	ldr	x0, [x19, 88]
-	adrp	x1, .LC23
-	add	x1, x1, :lo12:.LC23
+	adrp	x1, .LC24
+	add	x1, x1, :lo12:.LC24
 	bl	_dev_info
-.LVL474:
-	.loc 1 2225 0
+.LVL515:
+	.loc 1 2454 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -5412,64 +6103,64 @@ ebc_suspend:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L504:
+.L594:
 	.cfi_restore_state
-	.loc 1 2216 0
+	.loc 1 2445 0
 	ldr	x0, [x19, 88]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
-	adrp	x1, .LC22
+	adrp	x1, .LC23
 	add	x2, x2, 16
-	add	x1, x1, :lo12:.LC22
+	add	x1, x1, :lo12:.LC23
 	bl	_dev_info
-.LVL475:
-.LBB1412:
-.LBB1413:
+.LVL516:
+.LBB1416:
+.LBB1417:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
-.LVL476:
-	b	.L502
-.LBE1413:
-.LBE1412:
+.LVL517:
+	b	.L592
+.LBE1417:
+.LBE1416:
 	.cfi_endproc
-.LFE2849:
+.LFE2850:
 	.size	ebc_suspend, .-ebc_suspend
 	.align	2
 	.p2align 3,,7
 	.type	ebc_probe, %function
 ebc_probe:
-.LFB2847:
-	.loc 1 2095 0
+.LFB2848:
+	.loc 1 2324 0
 	.cfi_startproc
-.LVL477:
+.LVL518:
 	stp	x29, x30, [sp, -208]!
 	.cfi_def_cfa_offset 208
 	.cfi_offset 29, -208
 	.cfi_offset 30, -200
-.LBB1559:
-.LBB1560:
+.LBB1563:
+.LBB1564:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
-.LBE1560:
-.LBE1559:
-	.loc 1 2095 0
+.LBE1564:
+.LBE1563:
+	.loc 1 2324 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -192
 	.cfi_offset 20, -184
-	.loc 1 2096 0
+	.loc 1 2325 0
 	add	x20, x0, 16
-	.loc 1 2095 0
+	.loc 1 2324 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -160
 	.cfi_offset 24, -152
 	adrp	x23, __stack_chk_guard
 	stp	x21, x22, [sp, 32]
 	add	x0, x23, :lo12:__stack_chk_guard
-.LVL478:
+.LVL519:
 	stp	x25, x26, [sp, 64]
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 21, -176
@@ -5478,753 +6169,753 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 2095 0
+	.loc 1 2324 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
-.LBB1562:
-.LBB1561:
+.LBB1566:
+.LBB1565:
 	.loc 2 711 0
 	mov	x0, x20
 	mov	x1, 800
 	bl	devm_kmalloc
-.LVL479:
-.LBE1561:
-.LBE1562:
-	.loc 1 2107 0
-	cbz	x0, .L550
-	.loc 1 2111 0
+.LVL520:
+.LBE1565:
+.LBE1566:
+	.loc 1 2336 0
+	cbz	x0, .L640
+	.loc 1 2340 0
 	adrp	x25, .LANCHOR0
 	mov	x19, x0
-	.loc 1 2113 0
-	adrp	x1, .LC24
+	.loc 1 2342 0
+	adrp	x1, .LC25
 	mov	w2, 0
-	.loc 1 2111 0
+	.loc 1 2340 0
 	str	x0, [x25, #:lo12:.LANCHOR0]
-	.loc 1 2113 0
-	add	x1, x1, :lo12:.LC24
+	.loc 1 2342 0
+	add	x1, x1, :lo12:.LC25
 	ldr	x0, [x20, 752]
-	.loc 1 2110 0
+	.loc 1 2339 0
 	str	x20, [x19]
-	.loc 1 2113 0
+	.loc 1 2342 0
 	bl	of_parse_phandle
-.LVL480:
-	.loc 1 2114 0
-	cbz	x0, .L590
-	.loc 1 2119 0
+.LVL521:
+	.loc 1 2343 0
+	cbz	x0, .L680
+	.loc 1 2348 0
 	bl	of_find_device_by_node
-.LVL481:
-	.loc 1 2121 0
-	cbz	x0, .L509
-.LBB1563:
-.LBB1564:
-.LBB1565:
+.LVL522:
+	.loc 1 2350 0
+	cbz	x0, .L599
+.LBB1567:
+.LBB1568:
+.LBB1569:
 	.loc 2 1181 0
 	ldr	x0, [x0, 200]
-.LVL482:
-.LBE1565:
-.LBE1564:
-.LBE1563:
-	.loc 1 2124 0
+.LVL523:
+.LBE1569:
+.LBE1568:
+.LBE1567:
+	.loc 1 2353 0
 	str	x0, [x19, 8]
-	.loc 1 2125 0
-	cbz	x0, .L509
-	.loc 1 2127 0
+	.loc 1 2354 0
+	cbz	x0, .L599
+	.loc 1 2356 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 2129 0
+	.loc 1 2358 0
 	mov	w2, 0
-	adrp	x1, .LC26
-	add	x1, x1, :lo12:.LC26
+	adrp	x1, .LC27
+	add	x1, x1, :lo12:.LC27
 	ldr	x0, [x20, 752]
 	bl	of_parse_phandle
-.LVL483:
-	.loc 1 2130 0
-	cbz	x0, .L591
-	.loc 1 2135 0
+.LVL524:
+	.loc 1 2359 0
+	cbz	x0, .L681
+	.loc 1 2364 0
 	bl	of_find_i2c_device_by_node
-.LVL484:
-	.loc 1 2137 0
-	cbz	x0, .L592
-.LBB1566:
-.LBB1567:
-.LBB1568:
+.LVL525:
+	.loc 1 2366 0
+	cbz	x0, .L682
+.LBB1570:
+.LBB1571:
+.LBB1572:
 	.loc 2 1181 0
 	ldr	x0, [x0, 216]
-.LVL485:
-.LBE1568:
-.LBE1567:
-.LBE1566:
-	.loc 1 2141 0
+.LVL526:
+.LBE1572:
+.LBE1571:
+.LBE1570:
+	.loc 1 2370 0
 	str	x0, [x19, 16]
-	.loc 1 2142 0
-	cbz	x0, .L593
-	.loc 1 2148 0
+	.loc 1 2371 0
+	cbz	x0, .L683
+	.loc 1 2377 0
 	add	x21, x19, 184
-.LVL486:
-	.loc 1 2150 0
+.LVL527:
+	.loc 1 2379 0
 	add	x22, x19, 24
-	.loc 1 2148 0
+	.loc 1 2377 0
 	str	x20, [x21, 88]
-.LBB1569:
-.LBB1570:
-.LBB1571:
-.LBB1572:
 .LBB1573:
+.LBB1574:
+.LBB1575:
+.LBB1576:
+.LBB1577:
 	.file 14 "./include/linux/of.h"
 	.loc 14 499 0
-	adrp	x1, .LC30
+	adrp	x1, .LC31
+.LBE1577:
+.LBE1576:
+.LBE1575:
+.LBE1574:
 .LBE1573:
-.LBE1572:
-.LBE1571:
-.LBE1570:
-.LBE1569:
-	.loc 1 2150 0
+	.loc 1 2379 0
 	str	x20, [x19, 24]
+.LBB1672:
 .LBB1668:
-.LBB1664:
-.LBB1580:
-.LBB1577:
-.LBB1574:
-	.loc 14 499 0
-	mov	x4, 0
-.LBE1574:
-.LBE1577:
-.LBE1580:
-.LBE1664:
-.LBE1668:
-	.loc 1 2151 0
-	ldr	x2, [x19, 8]
-.LBB1669:
-.LBB1665:
+.LBB1584:
 .LBB1581:
 .LBB1578:
-.LBB1575:
 	.loc 14 499 0
-	add	x1, x1, :lo12:.LC30
-.LBE1575:
+	mov	x4, 0
 .LBE1578:
 .LBE1581:
-.LBE1665:
-.LBE1669:
-	.loc 1 2152 0
-	stp	x2, x0, [x22, 8]
-.LBB1670:
-.LBB1666:
+.LBE1584:
+.LBE1668:
+.LBE1672:
+	.loc 1 2380 0
+	ldr	x2, [x19, 8]
+.LBB1673:
+.LBB1669:
+.LBB1585:
 .LBB1582:
 .LBB1579:
-.LBB1576:
 	.loc 14 499 0
-	mov	x3, 1
-	ldr	x0, [x20, 752]
-	add	x2, x19, 100
-	bl	of_property_read_variable_u32_array
-.LVL487:
-	.loc 14 501 0
-	tbnz	w0, #31, .L514
-.LBE1576:
+	add	x1, x1, :lo12:.LC31
 .LBE1579:
 .LBE1582:
+.LBE1585:
+.LBE1669:
+.LBE1673:
+	.loc 1 2381 0
+	stp	x2, x0, [x22, 8]
+.LBB1674:
+.LBB1670:
+.LBB1586:
 .LBB1583:
-.LBB1584:
-.LBB1585:
+.LBB1580:
 	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC54
-	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 104
-	add	x1, x1, :lo12:.LC54
+	ldr	x0, [x20, 752]
+	add	x2, x19, 100
 	bl	of_property_read_variable_u32_array
-.LVL488:
+.LVL528:
 	.loc 14 501 0
-	tbnz	w0, #31, .L514
-.LBE1585:
-.LBE1584:
+	tbnz	w0, #31, .L604
+.LBE1580:
 .LBE1583:
-.LBB1586:
+.LBE1586:
 .LBB1587:
 .LBB1588:
+.LBB1589:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC55
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 108
+	add	x2, x19, 104
 	add	x1, x1, :lo12:.LC55
 	bl	of_property_read_variable_u32_array
-.LVL489:
+.LVL529:
 	.loc 14 501 0
-	tbnz	w0, #31, .L514
+	tbnz	w0, #31, .L604
+.LBE1589:
 .LBE1588:
 .LBE1587:
-.LBE1586:
-.LBB1589:
 .LBB1590:
 .LBB1591:
+.LBB1592:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC56
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 112
+	add	x2, x19, 108
 	add	x1, x1, :lo12:.LC56
 	bl	of_property_read_variable_u32_array
-.LVL490:
+.LVL530:
 	.loc 14 501 0
-	tbnz	w0, #31, .L514
+	tbnz	w0, #31, .L604
+.LBE1592:
 .LBE1591:
 .LBE1590:
-.LBE1589:
-.LBB1592:
 .LBB1593:
 .LBB1594:
+.LBB1595:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC57
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 128
+	add	x2, x19, 112
 	add	x1, x1, :lo12:.LC57
 	bl	of_property_read_variable_u32_array
-.LVL491:
+.LVL531:
 	.loc 14 501 0
-	tbnz	w0, #31, .L514
+	tbnz	w0, #31, .L604
+.LBE1595:
 .LBE1594:
 .LBE1593:
-.LBE1592:
-.LBB1595:
 .LBB1596:
 .LBB1597:
+.LBB1598:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC58
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 132
+	add	x2, x19, 128
 	add	x1, x1, :lo12:.LC58
 	bl	of_property_read_variable_u32_array
-.LVL492:
+.LVL532:
 	.loc 14 501 0
-	tbnz	w0, #31, .L514
+	tbnz	w0, #31, .L604
+.LBE1598:
 .LBE1597:
 .LBE1596:
-.LBE1595:
-.LBB1598:
 .LBB1599:
 .LBB1600:
+.LBB1601:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC59
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 136
+	add	x2, x19, 132
 	add	x1, x1, :lo12:.LC59
 	bl	of_property_read_variable_u32_array
-.LVL493:
+.LVL533:
 	.loc 14 501 0
-	tbnz	w0, #31, .L514
+	tbnz	w0, #31, .L604
+.LBE1601:
 .LBE1600:
 .LBE1599:
-.LBE1598:
-.LBB1601:
 .LBB1602:
 .LBB1603:
+.LBB1604:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC60
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 140
+	add	x2, x19, 136
 	add	x1, x1, :lo12:.LC60
 	bl	of_property_read_variable_u32_array
-.LVL494:
+.LVL534:
 	.loc 14 501 0
-	tbnz	w0, #31, .L514
+	tbnz	w0, #31, .L604
+.LBE1604:
 .LBE1603:
 .LBE1602:
-.LBE1601:
-.LBB1604:
 .LBB1605:
 .LBB1606:
+.LBB1607:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC61
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 144
+	add	x2, x19, 140
 	add	x1, x1, :lo12:.LC61
 	bl	of_property_read_variable_u32_array
-.LVL495:
+.LVL535:
 	.loc 14 501 0
-	tbnz	w0, #31, .L514
+	tbnz	w0, #31, .L604
+.LBE1607:
 .LBE1606:
 .LBE1605:
-.LBE1604:
-.LBB1607:
 .LBB1608:
 .LBB1609:
+.LBB1610:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC62
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 148
+	add	x2, x19, 144
 	add	x1, x1, :lo12:.LC62
 	bl	of_property_read_variable_u32_array
-.LVL496:
+.LVL536:
 	.loc 14 501 0
-	tbnz	w0, #31, .L514
+	tbnz	w0, #31, .L604
+.LBE1610:
 .LBE1609:
 .LBE1608:
-.LBE1607:
-.LBB1610:
 .LBB1611:
 .LBB1612:
+.LBB1613:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC63
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 152
+	add	x2, x19, 148
 	add	x1, x1, :lo12:.LC63
 	bl	of_property_read_variable_u32_array
-.LVL497:
+.LVL537:
 	.loc 14 501 0
-	tbnz	w0, #31, .L514
+	tbnz	w0, #31, .L604
+.LBE1613:
 .LBE1612:
 .LBE1611:
-.LBE1610:
-.LBB1613:
 .LBB1614:
 .LBB1615:
+.LBB1616:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC64
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 156
+	add	x2, x19, 152
 	add	x1, x1, :lo12:.LC64
 	bl	of_property_read_variable_u32_array
-.LVL498:
+.LVL538:
 	.loc 14 501 0
-	tbnz	w0, #31, .L514
+	tbnz	w0, #31, .L604
+.LBE1616:
 .LBE1615:
 .LBE1614:
-.LBE1613:
-.LBB1616:
 .LBB1617:
 .LBB1618:
+.LBB1619:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC65
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 160
+	add	x2, x19, 156
 	add	x1, x1, :lo12:.LC65
 	bl	of_property_read_variable_u32_array
-.LVL499:
+.LVL539:
 	.loc 14 501 0
-	tbnz	w0, #31, .L514
+	tbnz	w0, #31, .L604
+.LBE1619:
 .LBE1618:
 .LBE1617:
-.LBE1616:
-.LBB1619:
 .LBB1620:
 .LBB1621:
+.LBB1622:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC66
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 164
+	add	x2, x19, 160
 	add	x1, x1, :lo12:.LC66
 	bl	of_property_read_variable_u32_array
-.LVL500:
+.LVL540:
 	.loc 14 501 0
-	tbnz	w0, #31, .L514
+	tbnz	w0, #31, .L604
+.LBE1622:
 .LBE1621:
 .LBE1620:
-.LBE1619:
-.LBB1622:
 .LBB1623:
 .LBB1624:
+.LBB1625:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC67
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 168
+	add	x2, x19, 164
 	add	x1, x1, :lo12:.LC67
 	bl	of_property_read_variable_u32_array
-.LVL501:
+.LVL541:
 	.loc 14 501 0
-	tbnz	w0, #31, .L514
+	tbnz	w0, #31, .L604
+.LBE1625:
 .LBE1624:
 .LBE1623:
-.LBE1622:
-.LBB1625:
 .LBB1626:
 .LBB1627:
+.LBB1628:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC68
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 172
+	add	x2, x19, 168
 	add	x1, x1, :lo12:.LC68
 	bl	of_property_read_variable_u32_array
-.LVL502:
+.LVL542:
 	.loc 14 501 0
-	tbnz	w0, #31, .L594
+	tbnz	w0, #31, .L604
+.LBE1628:
 .LBE1627:
 .LBE1626:
-.LBE1625:
-.LBB1628:
 .LBB1629:
 .LBB1630:
+.LBB1631:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC31
+	adrp	x1, .LC69
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 176
-	add	x1, x1, :lo12:.LC31
+	add	x2, x19, 172
+	add	x1, x1, :lo12:.LC69
 	bl	of_property_read_variable_u32_array
-.LVL503:
+.LVL543:
 	.loc 14 501 0
-	tbnz	w0, #31, .L515
-.L541:
+	tbnz	w0, #31, .L684
+.LBE1631:
 .LBE1630:
 .LBE1629:
-.LBE1628:
-.LBB1635:
-.LBB1636:
-.LBB1637:
+.LBB1632:
+.LBB1633:
+.LBB1634:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC32
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 180
+	add	x2, x19, 176
 	add	x1, x1, :lo12:.LC32
 	bl	of_property_read_variable_u32_array
-.LVL504:
+.LVL544:
 	.loc 14 501 0
-	tbnz	w0, #31, .L516
-.L542:
-.LBE1637:
-.LBE1636:
-.LBE1635:
-.LBB1642:
-.LBB1643:
-.LBB1644:
+	tbnz	w0, #31, .L605
+.L631:
+.LBE1634:
+.LBE1633:
+.LBE1632:
+.LBB1639:
+.LBB1640:
+.LBB1641:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC33
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 116
+	add	x2, x19, 180
 	add	x1, x1, :lo12:.LC33
 	bl	of_property_read_variable_u32_array
-.LVL505:
+.LVL545:
 	.loc 14 501 0
-	tbnz	w0, #31, .L517
-.L543:
-.LBE1644:
-.LBE1643:
-.LBE1642:
-.LBB1649:
-.LBB1650:
-.LBB1651:
+	tbnz	w0, #31, .L606
+.L632:
+.LBE1641:
+.LBE1640:
+.LBE1639:
+.LBB1646:
+.LBB1647:
+.LBB1648:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC34
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 120
+	add	x2, x19, 116
 	add	x1, x1, :lo12:.LC34
 	bl	of_property_read_variable_u32_array
-.LVL506:
+.LVL546:
 	.loc 14 501 0
-	tbnz	w0, #31, .L518
-.L544:
-.LBE1651:
-.LBE1650:
-.LBE1649:
-.LBE1666:
+	tbnz	w0, #31, .L607
+.L633:
+.LBE1648:
+.LBE1647:
+.LBE1646:
+.LBB1653:
+.LBB1654:
+.LBB1655:
+	.loc 14 499 0
+	ldr	x0, [x20, 752]
+	adrp	x1, .LC35
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x19, 120
+	add	x1, x1, :lo12:.LC35
+	bl	of_property_read_variable_u32_array
+.LVL547:
+	.loc 14 501 0
+	tbnz	w0, #31, .L608
+.L634:
+.LBE1655:
+.LBE1654:
+.LBE1653:
 .LBE1670:
-	.loc 1 2160 0
+.LBE1674:
+	.loc 1 2389 0
 	ldr	w0, [x22, 88]
-.LBB1671:
-.LBB1672:
-	.loc 1 1897 0
+.LBB1675:
+.LBB1676:
+	.loc 1 2126 0
 	mov	w2, 0
-.LBE1672:
-.LBE1671:
-	.loc 1 2160 0
+.LBE1676:
+.LBE1675:
+	.loc 1 2389 0
 	str	w0, [x21, 52]
-	.loc 1 2161 0
+	.loc 1 2390 0
 	ldr	w1, [x22, 84]
 	str	w1, [x21, 56]
-	.loc 1 2164 0
+	.loc 1 2393 0
 	tst	x1, 15
-	.loc 1 2162 0
+	.loc 1 2391 0
 	mul	w0, w0, w1
-	.loc 1 2164 0
+	.loc 1 2393 0
 	cset	w1, eq
 	str	w1, [x21, 72]
-.LBB1696:
-.LBB1691:
-	.loc 1 1897 0
-	adrp	x1, .LC35
-	add	x1, x1, :lo12:.LC35
-.LBE1691:
-.LBE1696:
-	.loc 1 2162 0
+.LBB1700:
+.LBB1695:
+	.loc 1 2126 0
+	adrp	x1, .LC36
+	add	x1, x1, :lo12:.LC36
+.LBE1695:
+.LBE1700:
+	.loc 1 2391 0
 	lsr	w3, w0, 1
-	.loc 1 2163 0
+	.loc 1 2392 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x21, 20]
-.LBB1697:
-.LBB1692:
-	.loc 1 1888 0
+.LBB1701:
+.LBB1696:
+	.loc 1 2117 0
 	ldr	x26, [x19]
-.LVL507:
-	.loc 1 1897 0
+.LVL548:
+	.loc 1 2126 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL508:
-	.loc 1 1898 0
-	cbz	x0, .L551
-	.loc 1 1901 0
+.LVL549:
+	.loc 1 2127 0
+	cbz	x0, .L641
+	.loc 1 2130 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL509:
+.LVL550:
 	mov	w24, w0
-	.loc 1 1903 0
-	cbnz	w0, .L595
-.LBB1673:
-.LBB1674:
+	.loc 1 2132 0
+	cbnz	w0, .L685
+.LBB1677:
+.LBB1678:
 	.file 15 "./include/linux/ioport.h"
 	.loc 15 204 0
 	ldp	x1, x2, [x29, 104]
-.LBE1674:
-.LBE1673:
-	.loc 1 1908 0
+.LBE1678:
+.LBE1677:
+	.loc 1 2137 0
 	str	x1, [x19, 184]
-	.loc 1 1911 0
+	.loc 1 2140 0
 	mov	x3, 1
 	mov	x0, x26
-.LBB1676:
-.LBB1675:
+.LBB1680:
+.LBB1679:
 	.loc 15 204 0
 	add	x2, x2, 1
 	sub	x2, x2, x1
-.LBE1675:
-.LBE1676:
-	.loc 1 1909 0
+.LBE1679:
+.LBE1680:
+	.loc 1 2138 0
 	str	w2, [x21, 16]
-	.loc 1 1911 0
+	.loc 1 2140 0
 	sxtw	x2, w2
 	bl	devm_memremap
-.LVL510:
+.LVL551:
 	str	x0, [x21, 8]
-	.loc 1 1913 0
-	cbz	x0, .L522
-	.loc 1 1921 0
+	.loc 1 2142 0
+	cbz	x0, .L612
+	.loc 1 2150 0
 	mov	x1, x0
 	ldr	w2, [x21, 16]
 	ldr	x0, [x19, 184]
 	mov	w4, 4
 	mov	w3, 2097152
 	bl	ebc_buf_init
-.LVL511:
-	.loc 1 1922 0
-	cbnz	w0, .L522
-	.loc 1 1927 0
+.LVL552:
+	.loc 1 2151 0
+	cbnz	w0, .L612
+	.loc 1 2156 0
 	ldr	x0, [x21, 8]
-	.loc 1 1928 0
+	.loc 1 2157 0
 	mov	x5, 1048576
 	str	x5, [x22, 40]
-.LBB1677:
-.LBB1678:
+.LBB1681:
+.LBB1682:
 	.loc 2 711 0
 	mov	w2, 32960
-.LBE1678:
-.LBE1677:
-	.loc 1 1927 0
+.LBE1682:
+.LBE1681:
+	.loc 1 2156 0
 	add	x6, x0, 10485760
 	str	x6, [x22, 24]
 	add	x4, x0, 11534336
-	.loc 1 1933 0
+	.loc 1 2162 0
 	add	x1, x0, 12582912
-	.loc 1 1929 0
+	.loc 1 2158 0
 	ldr	x3, [x19, 184]
-.LBB1682:
-.LBB1679:
+.LBB1686:
+.LBB1683:
 	.loc 2 711 0
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
-.LBE1679:
-.LBE1682:
-	.loc 1 1929 0
+.LBE1683:
+.LBE1686:
+	.loc 1 2158 0
 	add	x7, x3, 10485760
 	str	x7, [x22, 32]
-	.loc 1 1930 0
+	.loc 1 2159 0
 	str	x6, [x21, 168]
-	.loc 1 1929 0
+	.loc 1 2158 0
 	add	x3, x3, 11534336
-	.loc 1 1928 0
+	.loc 1 2157 0
 	str	x5, [x22, 64]
-	.loc 1 1929 0
+	.loc 1 2158 0
 	stp	x4, x3, [x22, 48]
-	.loc 1 1933 0
+	.loc 1 2162 0
 	str	x1, [x21, 112]
-.LBB1683:
-.LBB1680:
+.LBB1687:
+.LBB1684:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
-.LBE1680:
-.LBE1683:
-	.loc 1 1930 0
+.LBE1684:
+.LBE1687:
+	.loc 1 2159 0
 	str	x4, [x21, 176]
-.LBB1684:
-.LBB1681:
+.LBB1688:
+.LBB1685:
 	.loc 2 711 0
 	bl	devm_kmalloc
-.LVL512:
-.LBE1681:
-.LBE1684:
-	.loc 1 1936 0
+.LVL553:
+.LBE1685:
+.LBE1688:
+	.loc 1 2165 0
 	str	x0, [x21, 128]
-	.loc 1 1937 0
-	cbz	x0, .L522
-.LBB1685:
-.LBB1686:
+	.loc 1 2166 0
+	cbz	x0, .L612
+.LBB1689:
+.LBB1690:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL513:
-.LBE1686:
-.LBE1685:
-	.loc 1 1939 0
+.LVL554:
+.LBE1690:
+.LBE1689:
+	.loc 1 2168 0
 	str	x0, [x21, 136]
-	.loc 1 1940 0
-	cbz	x0, .L522
-.LBB1687:
-.LBB1688:
+	.loc 1 2169 0
+	cbz	x0, .L612
+.LBB1691:
+.LBB1692:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL514:
-.LBE1688:
-.LBE1687:
-	.loc 1 1942 0
+.LVL555:
+.LBE1692:
+.LBE1691:
+	.loc 1 2171 0
 	str	x0, [x21, 144]
-	.loc 1 1943 0
-	cbz	x0, .L522
-	.loc 1 1950 0
+	.loc 1 2172 0
+	cbz	x0, .L612
+	.loc 1 2179 0
 	ldp	w1, w0, [x22, 84]
-.LBB1689:
-.LBB1690:
+.LBB1693:
+.LBB1694:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	mul	w1, w1, w0
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL515:
-.LBE1690:
-.LBE1689:
-	.loc 1 1950 0
+.LVL556:
+.LBE1694:
+.LBE1693:
+	.loc 1 2179 0
 	str	x0, [x21, 152]
-	.loc 1 1951 0
-	cbz	x0, .L522
-	.loc 1 1953 0
+	.loc 1 2180 0
+	cbz	x0, .L612
+	.loc 1 2182 0
 	ldp	w2, w1, [x22, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
-.LVL516:
-	.loc 1 1954 0
+.LVL557:
+	.loc 1 2183 0
 	ldrsw	x2, [x21, 20]
 	mov	w1, 255
 	ldr	x0, [x21, 144]
 	bl	memset
-.LVL517:
-.LBE1692:
-.LBE1697:
-.LBB1698:
-.LBB1699:
-	.loc 1 1848 0
+.LVL558:
+.LBE1696:
+.LBE1701:
+.LBB1702:
+.LBB1703:
+	.loc 1 2077 0
 	ldr	x26, [x19, 272]
-.LVL518:
-	.loc 1 1854 0
-	adrp	x1, .LC37
+.LVL559:
+	.loc 1 2083 0
+	adrp	x1, .LC38
 	mov	w2, 0
-	add	x1, x1, :lo12:.LC37
+	add	x1, x1, :lo12:.LC38
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL519:
-	.loc 1 1855 0
-	cbz	x0, .L552
-	.loc 1 1858 0
+.LVL560:
+	.loc 1 2084 0
+	cbz	x0, .L642
+	.loc 1 2087 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL520:
+.LVL561:
 	mov	w24, w0
-	.loc 1 1860 0
-	cbz	w0, .L596
-.L523:
-.LBE1699:
-.LBE1698:
-	.loc 1 2176 0
-	adrp	x1, .LC70
+	.loc 1 2089 0
+	cbz	w0, .L686
+.L613:
+.LBE1703:
+.LBE1702:
+	.loc 1 2405 0
+	adrp	x1, .LC71
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC70
+	add	x1, x1, :lo12:.LC71
 	bl	_dev_err
-.LVL521:
-	.loc 1 2177 0
-	b	.L505
-.LVL522:
+.LVL562:
+	.loc 1 2406 0
+	b	.L595
+.LVL563:
 	.p2align 3
-.L514:
-	.loc 1 2158 0
+.L604:
+	.loc 1 2387 0
 	mov	w24, -22
-	.loc 1 2157 0
-	adrp	x1, .LC74
+	.loc 1 2386 0
+	adrp	x1, .LC75
 	mov	w2, w24
-	add	x1, x1, :lo12:.LC74
+	add	x1, x1, :lo12:.LC75
 	mov	x0, x20
 	bl	_dev_err
-.LVL523:
-.L505:
-	.loc 1 2201 0
+.LVL564:
+.L595:
+	.loc 1 2430 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w24
-.LVL524:
+.LVL565:
 	ldr	x2, [x29, 200]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L597
+	cbnz	x1, .L687
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL525:
+.LVL566:
 	ldp	x23, x24, [sp, 48]
 	ldp	x25, x26, [sp, 64]
-.LVL526:
+.LVL567:
 	ldp	x27, x28, [sp, 80]
-.LVL527:
+.LVL568:
 	ldp	x29, x30, [sp], 208
 	.cfi_remember_state
 	.cfi_restore 30
@@ -6241,251 +6932,251 @@ ebc_probe:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL528:
+.LVL569:
 	.p2align 3
-.L595:
+.L685:
 	.cfi_restore_state
-.LBB1706:
-.LBB1693:
-	.loc 1 1904 0
-	adrp	x1, .LC36
+.LBB1710:
+.LBB1697:
+	.loc 1 2133 0
+	adrp	x1, .LC37
 	mov	x0, x26
-	add	x1, x1, :lo12:.LC36
+	add	x1, x1, :lo12:.LC37
 	bl	_dev_err
-.LVL529:
-.L519:
-.LBE1693:
-.LBE1706:
-	.loc 1 2169 0
-	adrp	x1, .LC69
+.LVL570:
+.L609:
+.LBE1697:
+.LBE1710:
+	.loc 1 2398 0
+	adrp	x1, .LC70
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC69
+	add	x1, x1, :lo12:.LC70
 	bl	_dev_err
-.LVL530:
-	.loc 1 2170 0
-	b	.L505
-.LVL531:
+.LVL571:
+	.loc 1 2399 0
+	b	.L595
+.LVL572:
 	.p2align 3
-.L518:
-.LBB1707:
-.LBB1667:
-	.loc 1 1487 0
+.L608:
+.LBB1711:
+.LBB1671:
+	.loc 1 1716 0
 	str	wzr, [x22, 96]
-	b	.L544
+	b	.L634
 	.p2align 3
-.L517:
+.L607:
+.LBB1660:
+.LBB1658:
 .LBB1656:
-.LBB1654:
-.LBB1652:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC34
-.LBE1652:
-.LBE1654:
+	adrp	x1, .LC35
 .LBE1656:
-	.loc 1 1484 0
+.LBE1658:
+.LBE1660:
+	.loc 1 1713 0
 	str	wzr, [x22, 92]
+.LBB1661:
+.LBB1659:
 .LBB1657:
-.LBB1655:
-.LBB1653:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 120
-	add	x1, x1, :lo12:.LC34
+	add	x1, x1, :lo12:.LC35
 	bl	of_property_read_variable_u32_array
-.LVL532:
+.LVL573:
 	.loc 14 501 0
-	tbz	w0, #31, .L544
-	b	.L518
+	tbz	w0, #31, .L634
+	b	.L608
 	.p2align 3
-.L516:
-.LBE1653:
-.LBE1655:
+.L606:
 .LBE1657:
-.LBB1658:
-.LBB1647:
-.LBB1645:
+.LBE1659:
+.LBE1661:
+.LBB1662:
+.LBB1651:
+.LBB1649:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC33
-.LBE1645:
-.LBE1647:
-.LBE1658:
-	.loc 1 1481 0
+	adrp	x1, .LC34
+.LBE1649:
+.LBE1651:
+.LBE1662:
+	.loc 1 1710 0
 	str	wzr, [x22, 156]
-.LBB1659:
-.LBB1648:
-.LBB1646:
+.LBB1663:
+.LBB1652:
+.LBB1650:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 116
-	add	x1, x1, :lo12:.LC33
+	add	x1, x1, :lo12:.LC34
 	bl	of_property_read_variable_u32_array
-.LVL533:
+.LVL574:
 	.loc 14 501 0
-	tbz	w0, #31, .L543
-	b	.L517
+	tbz	w0, #31, .L633
+	b	.L607
 	.p2align 3
-.L515:
-.LBE1646:
-.LBE1648:
-.LBE1659:
-.LBB1660:
-.LBB1640:
-.LBB1638:
+.L605:
+.LBE1650:
+.LBE1652:
+.LBE1663:
+.LBB1664:
+.LBB1644:
+.LBB1642:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC32
-.LBE1638:
-.LBE1640:
-.LBE1660:
-	.loc 1 1478 0
+	adrp	x1, .LC33
+.LBE1642:
+.LBE1644:
+.LBE1664:
+	.loc 1 1707 0
 	str	wzr, [x22, 152]
-.LBB1661:
-.LBB1641:
-.LBB1639:
+.LBB1665:
+.LBB1645:
+.LBB1643:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 180
-	add	x1, x1, :lo12:.LC32
+	add	x1, x1, :lo12:.LC33
 	bl	of_property_read_variable_u32_array
-.LVL534:
+.LVL575:
 	.loc 14 501 0
-	tbz	w0, #31, .L542
-	b	.L516
+	tbz	w0, #31, .L632
+	b	.L606
 	.p2align 3
-.L594:
-.LBE1639:
-.LBE1641:
-.LBE1661:
-.LBB1662:
-.LBB1633:
-.LBB1631:
+.L684:
+.LBE1643:
+.LBE1645:
+.LBE1665:
+.LBB1666:
+.LBB1637:
+.LBB1635:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC31
-.LBE1631:
-.LBE1633:
-.LBE1662:
-	.loc 1 1475 0
+	adrp	x1, .LC32
+.LBE1635:
+.LBE1637:
+.LBE1666:
+	.loc 1 1704 0
 	str	wzr, [x22, 148]
-.LBB1663:
-.LBB1634:
-.LBB1632:
+.LBB1667:
+.LBB1638:
+.LBB1636:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 176
-	add	x1, x1, :lo12:.LC31
+	add	x1, x1, :lo12:.LC32
 	bl	of_property_read_variable_u32_array
-.LVL535:
+.LVL576:
 	.loc 14 501 0
-	tbz	w0, #31, .L541
-	b	.L515
-.LVL536:
+	tbz	w0, #31, .L631
+	b	.L605
+.LVL577:
 	.p2align 3
-.L596:
-.LBE1632:
-.LBE1634:
-.LBE1663:
+.L686:
+.LBE1636:
+.LBE1638:
 .LBE1667:
-.LBE1707:
-.LBB1708:
-.LBB1702:
-	.loc 1 1866 0
+.LBE1671:
+.LBE1711:
+.LBB1712:
+.LBB1706:
+	.loc 1 2095 0
 	mov	x0, x26
 	mov	x3, 1
-.LBB1700:
-.LBB1701:
+.LBB1704:
+.LBB1705:
 	.loc 15 204 0
 	ldp	x1, x26, [x29, 104]
-.LVL537:
+.LVL578:
 	add	x26, x26, 1
 	sub	x26, x26, x1
-.LBE1701:
-.LBE1700:
-	.loc 1 1866 0
+.LBE1705:
+.LBE1704:
+	.loc 1 2095 0
 	sxtw	x2, w26
 	bl	devm_memremap
-.LVL538:
+.LVL579:
 	str	x0, [x19, 376]
-	.loc 1 1868 0
-	cbz	x0, .L598
-	.loc 1 1873 0
+	.loc 1 2097 0
+	cbz	x0, .L688
+	.loc 1 2102 0
 	bl	epd_lut_from_mem_init
-.LVL539:
-	.loc 1 1874 0
-	tbnz	w0, #31, .L599
-.L525:
-.LBE1702:
-.LBE1708:
-.LBB1709:
-.LBB1710:
-	.loc 1 1963 0
+.LVL580:
+	.loc 1 2103 0
+	tbnz	w0, #31, .L689
+.L615:
+.LBE1706:
+.LBE1712:
+.LBB1713:
+.LBB1714:
+	.loc 1 2192 0
 	add	x0, x19, 736
 	mov	x1, 68719476704
 	str	x1, [x21, 544]
-	.loc 1 1965 0
+	.loc 1 2194 0
 	add	x25, x25, :lo12:.LANCHOR0
-.LBB1711:
-.LBB1712:
-.LBB1713:
-.LBB1714:
 .LBB1715:
+.LBB1716:
+.LBB1717:
+.LBB1718:
+.LBB1719:
 	.loc 12 288 0
 	str	x0, [x19, 736]
+.LBE1719:
+.LBE1718:
+.LBE1717:
+.LBE1716:
 .LBE1715:
-.LBE1714:
-.LBE1713:
-.LBE1712:
-.LBE1711:
-	.loc 1 1961 0
+	.loc 1 2190 0
 	mov	w26, 99
-.LBB1717:
-.LBB1716:
+.LBB1721:
+.LBB1720:
 	.file 16 "./include/linux/list.h"
 	.loc 16 29 0
 	str	x0, [x0, 8]
-.LBE1716:
-.LBE1717:
-	.loc 1 1963 0
+.LBE1720:
+.LBE1721:
+	.loc 1 2192 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x21, 568]
-	.loc 1 1965 0
-	adrp	x3, .LC71
+	.loc 1 2194 0
+	adrp	x3, .LC72
 	mov	w2, -1
-	add	x3, x3, :lo12:.LC71
+	add	x3, x3, :lo12:.LC72
 	mov	x1, x21
 	adrp	x0, ebc_auto_tast_function
-	.loc 1 1961 0
+	.loc 1 2190 0
 	str	w26, [x29, 104]
-	.loc 1 1965 0
+	.loc 1 2194 0
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
-.LVL540:
+.LVL581:
 	str	x0, [x25, 8]
-	.loc 1 1966 0
+	.loc 1 2195 0
 	cmn	x0, #4096
-	bhi	.L600
-	.loc 1 1970 0
+	bhi	.L690
+	.loc 1 2199 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
-.LVL541:
-	.loc 1 1971 0
+.LVL582:
+	.loc 1 2200 0
 	ldr	x2, [x25, 8]
-.LBB1718:
-.LBB1719:
+.LBB1722:
+.LBB1723:
 	.file 17 "./arch/arm64/include/asm/atomic_lse.h"
 	.loc 17 47 0
 	mov	w0, 1
-.LVL542:
+.LVL583:
 	add	x1, x2, 48
-.LVL543:
+.LVL584:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -6513,49 +7204,49 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL544:
+.LVL585:
 #NO_APP
-.LBE1719:
-.LBE1718:
-.LBB1720:
-	.loc 1 1974 0
-	adrp	x3, .LC42
+.LBE1723:
+.LBE1722:
+.LBB1724:
+	.loc 1 2203 0
+	adrp	x3, .LC43
 	adrp	x0, ebc_thread
-.LVL545:
-	add	x3, x3, :lo12:.LC42
+.LVL586:
+	add	x3, x3, :lo12:.LC43
 	mov	w2, -1
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x21
-.LBE1720:
-	.loc 1 1973 0
+.LBE1724:
+	.loc 1 2202 0
 	str	w26, [x29, 104]
-.LBB1721:
-	.loc 1 1974 0
+.LBB1725:
+	.loc 1 2203 0
 	bl	kthread_create_on_node
-.LVL546:
+.LVL587:
 	mov	x25, x0
-.LVL547:
+.LVL588:
 	cmn	x0, #4096
-	bhi	.L527
+	bhi	.L617
 	bl	wake_up_process
-.LVL548:
-.LBE1721:
+.LVL589:
+.LBE1725:
 	str	x25, [x21, 120]
-	.loc 1 1979 0
+	.loc 1 2208 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x25
 	bl	sched_setscheduler_nocheck
-.LVL549:
-	.loc 1 1980 0
+.LVL590:
+	.loc 1 2209 0
 	ldr	x2, [x21, 120]
-.LBB1722:
-.LBB1723:
+.LBB1726:
+.LBB1727:
 	.loc 17 47 0
 	mov	w0, 1
-.LVL550:
+.LVL591:
 	add	x1, x2, 48
-.LVL551:
+.LVL592:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -6583,62 +7274,62 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL552:
+.LVL593:
 #NO_APP
-.LBE1723:
-.LBE1722:
-.LBE1710:
-.LBE1709:
-.LBB1726:
-.LBB1727:
-	.loc 1 1989 0
+.LBE1727:
+.LBE1726:
+.LBE1714:
+.LBE1713:
+.LBB1730:
+.LBB1731:
+	.loc 1 2218 0
 	mov	w0, -1
-.LVL553:
+.LVL594:
 	str	w0, [x21, 48]
-.LBB1728:
-.LBB1729:
+.LBB1732:
+.LBB1733:
 	.loc 4 39 0
 	add	x0, x19, 400
-.LVL554:
-.LBE1729:
-.LBE1728:
-	.loc 1 1993 0
+.LVL595:
+.LBE1733:
+.LBE1732:
+	.loc 1 2222 0
 	str	wzr, [x21, 28]
-	.loc 1 1992 0
+	.loc 1 2221 0
 	str	wzr, [x21, 80]
+.LBB1738:
 .LBB1734:
-.LBB1730:
 	.loc 4 43 0
-	adrp	x1, .LC43
-.LBE1730:
+	adrp	x1, .LC44
 .LBE1734:
-	.loc 1 1988 0
+.LBE1738:
+	.loc 1 2217 0
 	str	wzr, [x21, 184]
+.LBB1739:
 .LBB1735:
-.LBB1731:
 	.loc 4 43 0
-	add	x1, x1, :lo12:.LC43
-.LBE1731:
+	add	x1, x1, :lo12:.LC44
 .LBE1735:
-	.loc 1 1990 0
+.LBE1739:
+	.loc 1 2219 0
 	str	wzr, [x21, 592]
-	.loc 1 2000 0
+	.loc 1 2229 0
 	add	x25, x19, 616
-.LVL555:
-	.loc 1 1991 0
+.LVL596:
+	.loc 1 2220 0
 	str	wzr, [x21, 596]
-	.loc 1 2001 0
+	.loc 1 2230 0
 	adrp	x26, jiffies
+.LBB1740:
 .LBB1736:
-.LBB1732:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0]
-.LBE1732:
 .LBE1736:
-	.loc 1 2001 0
+.LBE1740:
+	.loc 1 2230 0
 	mov	x27, 268435455
+.LBB1741:
 .LBB1737:
-.LBB1733:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0, 16]
 	stp	xzr, xzr, [x0, 32]
@@ -6656,12 +7347,12 @@ ebc_probe:
 	str	x1, [x19, 400]
 	.loc 4 45 0
 	bl	wakeup_source_add
-.LVL556:
-.LBE1733:
+.LVL597:
 .LBE1737:
-	.loc 1 1997 0
+.LBE1741:
+	.loc 1 2226 0
 	str	wzr, [x21, 424]
-	.loc 1 2000 0
+	.loc 1 2229 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -6669,17 +7360,17 @@ ebc_probe:
 	adrp	x1, ebc_vdd_power_timeout
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
-.LVL557:
-	.loc 1 2001 0
+.LVL598:
+	.loc 1 2230 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
-	.loc 1 2004 0
+	.loc 1 2233 0
 	add	x25, x19, 672
-	.loc 1 2001 0
+	.loc 1 2230 0
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL558:
-	.loc 1 2004 0
+.LVL599:
+	.loc 1 2233 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -6687,638 +7378,638 @@ ebc_probe:
 	adrp	x1, ebc_frame_timeout
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
-.LVL559:
-	.loc 1 2005 0
+.LVL600:
+	.loc 1 2234 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL560:
-.LBE1727:
-.LBE1726:
-.LBB1738:
-.LBB1739:
-	.loc 1 2015 0
+.LVL601:
+.LBE1731:
+.LBE1730:
+.LBB1742:
+.LBB1743:
+	.loc 1 2244 0
 	adrp	x0, saved_command_line
-	adrp	x1, .LC44
-	.loc 1 2012 0
+	adrp	x1, .LC45
+	.loc 1 2241 0
 	stp	wzr, wzr, [x29, 100]
-.LVL561:
-	.loc 1 2015 0
-	add	x1, x1, :lo12:.LC44
+.LVL602:
+	.loc 1 2244 0
+	add	x1, x1, :lo12:.LC45
 	ldr	x25, [x0, #:lo12:saved_command_line]
 	mov	x0, x25
 	bl	strstr
-.LVL562:
-	.loc 1 2016 0
-	adrp	x1, .LC45
-	.loc 1 2015 0
+.LVL603:
+	.loc 1 2245 0
+	adrp	x1, .LC46
+	.loc 1 2244 0
 	mov	x26, x0
-.LVL563:
-	.loc 1 2016 0
-	add	x1, x1, :lo12:.LC45
+.LVL604:
+	.loc 1 2245 0
+	add	x1, x1, :lo12:.LC46
 	mov	x0, x25
 	bl	strstr
-.LVL564:
+.LVL605:
 	mov	x28, x0
-.LVL565:
-	.loc 1 2021 0
-	cbz	x26, .L528
-	.loc 1 2022 0
+.LVL606:
+	.loc 1 2250 0
+	cbz	x26, .L618
+	.loc 1 2251 0
 	add	x2, x29, 100
-	adrp	x1, .LC46
+	adrp	x1, .LC47
 	mov	x0, x26
-	add	x1, x1, :lo12:.LC46
+	add	x1, x1, :lo12:.LC47
 	bl	sscanf
-.LVL566:
-	.loc 1 2023 0
+.LVL607:
+	.loc 1 2252 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
-	bls	.L601
-.L528:
-	.loc 1 2035 0
+	bls	.L691
+.L618:
+	.loc 1 2264 0
 	mov	w25, 0
-.LVL567:
+.LVL608:
 	mov	x27, 0
-.LVL568:
-	.loc 1 2019 0
+.LVL609:
+	.loc 1 2248 0
 	mov	x26, 0
-.LVL569:
-	.loc 1 2035 0
-	cbz	x28, .L548
-.LVL570:
-.L547:
-	.loc 1 2036 0
+.LVL610:
+	.loc 1 2264 0
+	cbz	x28, .L638
+.LVL611:
+.L637:
+	.loc 1 2265 0
 	add	x2, x29, 104
 	mov	x0, x28
-	adrp	x1, .LC49
-	add	x1, x1, :lo12:.LC49
+	adrp	x1, .LC50
+	add	x1, x1, :lo12:.LC50
 	bl	sscanf
-.LVL571:
-	.loc 1 2014 0
+.LVL612:
+	.loc 1 2243 0
 	mov	w28, 0
-.LVL572:
-	.loc 1 2037 0
+.LVL613:
+	.loc 1 2266 0
 	ldr	w2, [x29, 104]
-	.loc 1 2019 0
+	.loc 1 2248 0
 	mov	x26, 0
-.LVL573:
-	.loc 1 2037 0
+.LVL614:
+	.loc 1 2266 0
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
-	bls	.L602
-.L532:
-	.loc 1 2049 0
-	cbnz	w25, .L531
-.LVL574:
-.L548:
-	.loc 1 2050 0
+	bls	.L692
+.L622:
+	.loc 1 2278 0
+	cbnz	w25, .L621
+.LVL615:
+.L638:
+	.loc 1 2279 0
 	ldr	x0, [x21, 88]
-	adrp	x1, .LC52
-	add	x1, x1, :lo12:.LC52
+	adrp	x1, .LC53
+	add	x1, x1, :lo12:.LC53
 	bl	_dev_info
-.LVL575:
-	.loc 1 2051 0
+.LVL616:
+	.loc 1 2280 0
 	ldr	x0, [x19, 16]
 	bl	ebc_pmic_verity_vcom
-.LVL576:
-.LBB1740:
-.LBB1741:
-	.loc 1 1395 0
+.LVL617:
+.LBB1744:
+.LBB1745:
+	.loc 1 1624 0
 	bl	ebc_empty_buf_get
-.LVL577:
+.LVL618:
 	mov	x25, x0
-.LVL578:
-	.loc 1 1396 0
+.LVL619:
+	.loc 1 1625 0
 	ldp	w2, w0, [x19, 108]
 	mov	w1, 255
 	mul	w2, w2, w0
 	ldr	x0, [x25, 16]
 	lsr	w2, w2, 1
 	bl	memset
-.LVL579:
-	.loc 1 1399 0
+.LVL620:
+	.loc 1 1628 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1397 0
+	.loc 1 1626 0
 	mov	w0, 16
 	str	w0, [x25, 40]
-	.loc 1 1402 0
+	.loc 1 1631 0
 	mov	x0, x25
-	.loc 1 1400 0
+	.loc 1 1629 0
 	ldr	w1, [x19, 108]
 	str	w1, [x25, 56]
-	.loc 1 1401 0
+	.loc 1 1630 0
 	ldr	w1, [x19, 112]
 	str	w1, [x25, 60]
-	.loc 1 1402 0
+	.loc 1 1631 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL580:
-.L534:
-.LBE1741:
-.LBE1740:
-	.loc 1 2068 0
-	cbnz	w28, .L603
-.L536:
-	.loc 1 2081 0
+.LVL621:
+.L624:
+.LBE1745:
+.LBE1744:
+	.loc 1 2297 0
+	cbnz	w28, .L693
+.L626:
+	.loc 1 2310 0
 	ldr	w0, [x21, 80]
 	adrp	x22, .LANCHOR1
-	cbz	w0, .L604
-.L538:
-	.loc 1 2086 0
-	cbz	x27, .L539
-	.loc 1 2087 0
+	cbz	w0, .L694
+.L628:
+	.loc 1 2315 0
+	cbz	x27, .L629
+	.loc 1 2316 0
 	mov	x0, x27
 	bl	kfree
-.LVL581:
-.L539:
-	.loc 1 2088 0
-	cbz	x26, .L530
-	.loc 1 2089 0
+.LVL622:
+.L629:
+	.loc 1 2317 0
+	cbz	x26, .L620
+	.loc 1 2318 0
 	mov	x0, x26
 	bl	kfree
-.LVL582:
-.L530:
-.LBE1739:
-.LBE1738:
-.LBB1751:
-.LBB1752:
-.LBB1753:
+.LVL623:
+.L620:
+.LBE1743:
+.LBE1742:
+.LBB1755:
+.LBB1756:
+.LBB1757:
 	.loc 2 1186 0
 	str	x19, [x20, 184]
-.LBE1753:
-.LBE1752:
-.LBE1751:
-.LBB1754:
-.LBB1755:
-	.loc 1 1832 0
+.LBE1757:
+.LBE1756:
+.LBE1755:
+.LBB1758:
+.LBB1759:
+	.loc 1 2061 0
 	add	x22, x22, :lo12:.LANCHOR1
 	add	x0, x22, 224
 	bl	misc_register
-.LVL583:
-	.loc 1 1834 0
+.LVL624:
+	.loc 1 2063 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 400
 	bl	device_create_file
-.LVL584:
-	.loc 1 1835 0
+.LVL625:
+	.loc 1 2064 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 432
 	bl	device_create_file
-.LVL585:
-	.loc 1 1836 0
+.LVL626:
+	.loc 1 2065 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 464
 	bl	device_create_file
-.LVL586:
-	.loc 1 1837 0
+.LVL627:
+	.loc 1 2066 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 496
 	bl	device_create_file
-.LVL587:
-	.loc 1 1838 0
+.LVL628:
+	.loc 1 2067 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 528
 	bl	device_create_file
-.LVL588:
-	.loc 1 1839 0
+.LVL629:
+	.loc 1 2068 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 560
 	bl	device_create_file
-.LVL589:
-	.loc 1 1840 0
+.LVL630:
+	.loc 1 2069 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 592
 	bl	device_create_file
-.LVL590:
-.LBE1755:
-.LBE1754:
-	.loc 1 2198 0
+.LVL631:
+.LBE1759:
+.LBE1758:
+	.loc 1 2427 0
 	ldr	x0, [x21, 88]
 	adrp	x2, .LC16
-	adrp	x1, .LC53
+	adrp	x1, .LC54
 	add	x2, x2, :lo12:.LC16
-	add	x1, x1, :lo12:.LC53
+	add	x1, x1, :lo12:.LC54
 	bl	_dev_info
-.LVL591:
-	.loc 1 2200 0
-	b	.L505
-.LVL592:
+.LVL632:
+	.loc 1 2429 0
+	b	.L595
+.LVL633:
 	.p2align 3
-.L601:
-.LBB1756:
-.LBB1748:
-	.loc 1 2025 0
+.L691:
+.LBB1760:
+.LBB1752:
+	.loc 1 2254 0
 	ldr	x0, [x21, 88]
-	adrp	x1, .LC47
-	add	x1, x1, :lo12:.LC47
+	adrp	x1, .LC48
+	add	x1, x1, :lo12:.LC48
 	bl	_dev_info
-.LVL593:
-	.loc 1 2026 0
+.LVL634:
+	.loc 1 2255 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
-.LBB1742:
-.LBB1743:
-.LBB1744:
+.LBB1746:
+.LBB1747:
+.LBB1748:
 	.file 18 "./include/linux/slab.h"
 	.loc 18 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL594:
+.LVL635:
 	mov	x27, x0
-.LVL595:
-.LBE1744:
-.LBE1743:
-.LBE1742:
-	.loc 1 2027 0
-	cbz	x0, .L605
-	.loc 1 2031 0
+.LVL636:
+.LBE1748:
+.LBE1747:
+.LBE1746:
+	.loc 1 2256 0
+	cbz	x0, .L695
+	.loc 1 2260 0
 	ldp	w2, w1, [x22, 84]
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 100]
-.LVL596:
+.LVL637:
 	sub	x1, x1, x3
-.LVL597:
+.LVL638:
 	ldr	x3, [x21, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL598:
-	.loc 1 2035 0
-	cbnz	x28, .L606
-	.loc 1 2014 0
+.LVL639:
+	.loc 1 2264 0
+	cbnz	x28, .L696
+	.loc 1 2243 0
 	mov	w28, 0
-.LVL599:
-	.loc 1 2019 0
+.LVL640:
+	.loc 1 2248 0
 	mov	x26, 0
-.LVL600:
-.L531:
-	.loc 1 2056 0
+.LVL641:
+.L621:
+	.loc 1 2285 0
 	bl	ebc_empty_buf_get
-.LVL601:
+.LVL642:
 	mov	x25, x0
-.LVL602:
-	.loc 1 2057 0
-	cbz	x0, .L534
-	.loc 1 2058 0
+.LVL643:
+	.loc 1 2286 0
+	cbz	x0, .L624
+	.loc 1 2287 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
 	ldr	x0, [x25, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL603:
-	.loc 1 2061 0
+.LVL644:
+	.loc 1 2290 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 2059 0
+	.loc 1 2288 0
 	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 2064 0
+	.loc 1 2293 0
 	mov	x0, x25
-	.loc 1 2062 0
+	.loc 1 2291 0
 	ldr	w1, [x22, 84]
 	str	w1, [x25, 56]
-	.loc 1 2063 0
+	.loc 1 2292 0
 	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 2064 0
+	.loc 1 2293 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL604:
-	b	.L534
-.LVL605:
+.LVL645:
+	b	.L624
+.LVL646:
 	.p2align 3
-.L604:
-	.loc 1 2082 0
+.L694:
+	.loc 1 2311 0
 	mov	w2, 1
 	str	w2, [x21, 80]
-	.loc 1 2083 0
+	.loc 1 2312 0
 	add	x0, x22, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL606:
-	b	.L538
-.LVL607:
+.LVL647:
+	b	.L628
+.LVL648:
 	.p2align 3
-.L602:
-	.loc 1 2039 0
+.L692:
+	.loc 1 2268 0
 	ldr	x0, [x21, 88]
-	adrp	x1, .LC50
-	add	x1, x1, :lo12:.LC50
+	adrp	x1, .LC51
+	add	x1, x1, :lo12:.LC51
 	bl	_dev_info
-.LVL608:
-	.loc 1 2040 0
+.LVL649:
+	.loc 1 2269 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
-.LBB1745:
-.LBB1746:
-.LBB1747:
+.LBB1749:
+.LBB1750:
+.LBB1751:
 	.loc 18 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL609:
+.LVL650:
 	mov	x26, x0
-.LBE1747:
-.LBE1746:
-.LBE1745:
-	.loc 1 2041 0
-	cbz	x0, .L607
-	.loc 1 2045 0
+.LBE1751:
+.LBE1750:
+.LBE1749:
+	.loc 1 2270 0
+	cbz	x0, .L697
+	.loc 1 2274 0
 	ldp	w2, w1, [x22, 84]
-	.loc 1 2038 0
+	.loc 1 2267 0
 	mov	w28, 1
-	.loc 1 2045 0
+	.loc 1 2274 0
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
-.LVL610:
+.LVL651:
 	sub	x1, x1, x3
-.LVL611:
+.LVL652:
 	ldr	x3, [x21, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL612:
-	b	.L532
-.LVL613:
+.LVL653:
+	b	.L622
+.LVL654:
 	.p2align 3
-.L522:
-.LBE1748:
-.LBE1756:
-.LBB1757:
-.LBB1694:
-	.loc 1 1914 0
+.L612:
+.LBE1752:
+.LBE1760:
+.LBB1761:
+.LBB1698:
+	.loc 1 2143 0
 	mov	w24, -12
-	b	.L519
-.LVL614:
+	b	.L609
+.LVL655:
 	.p2align 3
-.L603:
-.LBE1694:
-.LBE1757:
-.LBB1758:
-.LBB1749:
-	.loc 1 2069 0
+.L693:
+.LBE1698:
+.LBE1761:
+.LBB1762:
+.LBB1753:
+	.loc 1 2298 0
 	bl	ebc_empty_buf_get
-.LVL615:
+.LVL656:
 	mov	x25, x0
-.LVL616:
-	.loc 1 2070 0
-	cbz	x0, .L536
-	.loc 1 2071 0
+.LVL657:
+	.loc 1 2299 0
+	cbz	x0, .L626
+	.loc 1 2300 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
 	ldr	x0, [x25, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL617:
-	.loc 1 2074 0
+.LVL658:
+	.loc 1 2303 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 2072 0
+	.loc 1 2301 0
 	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 2075 0
+	.loc 1 2304 0
 	ldr	w0, [x22, 84]
 	str	w0, [x25, 56]
-	.loc 1 2077 0
+	.loc 1 2306 0
 	mov	x0, x25
-	.loc 1 2076 0
+	.loc 1 2305 0
 	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 2077 0
+	.loc 1 2306 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL618:
-	b	.L536
-.LVL619:
+.LVL659:
+	b	.L626
+.LVL660:
 	.p2align 3
-.L599:
-.LBE1749:
-.LBE1758:
-.LBB1759:
-.LBB1703:
-	.loc 1 1875 0
+.L689:
+.LBE1753:
+.LBE1762:
+.LBB1763:
+.LBB1707:
+	.loc 1 2104 0
 	ldr	x0, [x19, 272]
-	adrp	x1, .LC39
-	add	x1, x1, :lo12:.LC39
+	adrp	x1, .LC40
+	add	x1, x1, :lo12:.LC40
 	bl	_dev_err
-.LVL620:
-	.loc 1 1876 0
+.LVL661:
+	.loc 1 2105 0
 	ldr	x0, [x19, 272]
 	mov	w2, w26
 	ldr	x1, [x19, 376]
 	bl	epd_lut_from_file_init
-.LVL621:
-	.loc 1 1877 0
-	tbz	w0, #31, .L525
-	.loc 1 1878 0
+.LVL662:
+	.loc 1 2106 0
+	tbz	w0, #31, .L615
+	.loc 1 2107 0
 	ldr	x0, [x19, 272]
-	adrp	x1, .LC40
-	.loc 1 1879 0
+	adrp	x1, .LC41
+	.loc 1 2108 0
 	mov	w24, -1
-	.loc 1 1878 0
-	add	x1, x1, :lo12:.LC40
+	.loc 1 2107 0
+	add	x1, x1, :lo12:.LC41
 	bl	_dev_err
-.LVL622:
-	b	.L523
-.LVL623:
+.LVL663:
+	b	.L613
+.LVL664:
 	.p2align 3
-.L509:
-.LBE1703:
-.LBE1759:
-	.loc 1 2122 0
+.L599:
+.LBE1707:
+.LBE1763:
+	.loc 1 2351 0
 	mov	w24, -517
-	b	.L505
-.LVL624:
+	b	.L595
+.LVL665:
 	.p2align 3
-.L600:
-.LBB1760:
-.LBB1724:
-	.loc 1 1967 0
+.L690:
+.LBB1764:
+.LBB1728:
+	.loc 1 2196 0
 	ldr	x0, [x21, 88]
-	adrp	x1, .LC41
-	add	x1, x1, :lo12:.LC41
+	adrp	x1, .LC42
+	add	x1, x1, :lo12:.LC42
 	bl	_dev_err
-.LVL625:
-.L526:
-.LBE1724:
-.LBE1760:
-	.loc 1 2183 0
-	adrp	x1, .LC73
+.LVL666:
+.L616:
+.LBE1728:
+.LBE1764:
+	.loc 1 2412 0
+	adrp	x1, .LC74
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC73
-	.loc 1 2184 0
+	add	x1, x1, :lo12:.LC74
+	.loc 1 2413 0
 	mov	w24, -1
-	.loc 1 2183 0
+	.loc 1 2412 0
 	bl	_dev_err
-.LVL626:
-	.loc 1 2184 0
-	b	.L505
-.LVL627:
+.LVL667:
+	.loc 1 2413 0
+	b	.L595
+.LVL668:
 	.p2align 3
-.L527:
-.LBB1761:
-.LBB1725:
-	.loc 1 1976 0
+.L617:
+.LBB1765:
+.LBB1729:
+	.loc 1 2205 0
 	ldr	x0, [x21, 88]
-.LVL628:
-	adrp	x1, .LC72
-	.loc 1 1974 0
+.LVL669:
+	adrp	x1, .LC73
+	.loc 1 2203 0
 	str	x25, [x21, 120]
-	.loc 1 1976 0
-	add	x1, x1, :lo12:.LC72
+	.loc 1 2205 0
+	add	x1, x1, :lo12:.LC73
 	bl	_dev_err
-.LVL629:
-	b	.L526
-.LVL630:
+.LVL670:
+	b	.L616
+.LVL671:
 	.p2align 3
-.L550:
-.LBE1725:
-.LBE1761:
-	.loc 1 2108 0
+.L640:
+.LBE1729:
+.LBE1765:
+	.loc 1 2337 0
 	mov	w24, -12
-	b	.L505
-.LVL631:
+	b	.L595
+.LVL672:
 	.p2align 3
-.L551:
-.LBB1762:
-.LBB1695:
-	.loc 1 1899 0
+.L641:
+.LBB1766:
+.LBB1699:
+	.loc 1 2128 0
 	mov	w24, -19
-	b	.L519
-.LVL632:
-.L590:
-.LBE1695:
-.LBE1762:
-	.loc 1 2115 0
-	adrp	x1, .LC25
+	b	.L609
+.LVL673:
+.L680:
+.LBE1699:
+.LBE1766:
+	.loc 1 2344 0
+	adrp	x1, .LC26
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC25
-	.loc 1 2116 0
+	add	x1, x1, :lo12:.LC26
+	.loc 1 2345 0
 	mov	w24, -19
-	.loc 1 2115 0
+	.loc 1 2344 0
 	bl	_dev_err
-.LVL633:
-	.loc 1 2116 0
-	b	.L505
-.L593:
-	.loc 1 2143 0
-	adrp	x1, .LC29
+.LVL674:
+	.loc 1 2345 0
+	b	.L595
+.L683:
+	.loc 1 2372 0
+	adrp	x1, .LC30
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC29
-	.loc 1 2144 0
+	add	x1, x1, :lo12:.LC30
+	.loc 1 2373 0
 	mov	w24, -517
-	.loc 1 2143 0
+	.loc 1 2372 0
 	bl	_dev_err
-.LVL634:
-	.loc 1 2144 0
-	b	.L505
-.L591:
-	.loc 1 2131 0
-	adrp	x1, .LC27
+.LVL675:
+	.loc 1 2373 0
+	b	.L595
+.L681:
+	.loc 1 2360 0
+	adrp	x1, .LC28
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC27
-	.loc 1 2132 0
+	add	x1, x1, :lo12:.LC28
+	.loc 1 2361 0
 	mov	w24, -19
-	.loc 1 2131 0
+	.loc 1 2360 0
 	bl	_dev_err
-.LVL635:
-	.loc 1 2132 0
-	b	.L505
-.LVL636:
-.L552:
-.LBB1763:
-.LBB1704:
-	.loc 1 1856 0
+.LVL676:
+	.loc 1 2361 0
+	b	.L595
+.LVL677:
+.L642:
+.LBB1767:
+.LBB1708:
+	.loc 1 2085 0
 	mov	w24, -19
-	b	.L523
-.LVL637:
-.L592:
-.LBE1704:
-.LBE1763:
-	.loc 1 2138 0
-	adrp	x1, .LC28
+	b	.L613
+.LVL678:
+.L682:
+.LBE1708:
+.LBE1767:
+	.loc 1 2367 0
+	adrp	x1, .LC29
 	mov	x0, x20
-.LVL638:
-	add	x1, x1, :lo12:.LC28
-	.loc 1 2139 0
+.LVL679:
+	add	x1, x1, :lo12:.LC29
+	.loc 1 2368 0
 	mov	w24, -517
-	.loc 1 2138 0
+	.loc 1 2367 0
 	bl	_dev_err
-.LVL639:
-	.loc 1 2139 0
-	b	.L505
-.LVL640:
-.L598:
-.LBB1764:
-.LBB1705:
-	.loc 1 1869 0
+.LVL680:
+	.loc 1 2368 0
+	b	.L595
+.LVL681:
+.L688:
+.LBB1768:
+.LBB1709:
+	.loc 1 2098 0
 	ldr	x0, [x19, 272]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
-	adrp	x1, .LC38
-	mov	w3, 1869
+	adrp	x1, .LC39
+	mov	w3, 2098
 	add	x2, x2, 32
-	add	x1, x1, :lo12:.LC38
-	.loc 1 1870 0
+	add	x1, x1, :lo12:.LC39
+	.loc 1 2099 0
 	mov	w24, -12
-	.loc 1 1869 0
+	.loc 1 2098 0
 	bl	_dev_err
-.LVL641:
-	b	.L523
-.LVL642:
-.L597:
-.LBE1705:
-.LBE1764:
-	.loc 1 2201 0
+.LVL682:
+	b	.L613
+.LVL683:
+.L687:
+.LBE1709:
+.LBE1768:
+	.loc 1 2430 0
 	bl	__stack_chk_fail
-.LVL643:
-.L607:
-.LBB1765:
-.LBB1750:
-	.loc 1 2042 0
+.LVL684:
+.L697:
+.LBB1769:
+.LBB1754:
+	.loc 1 2271 0
 	ldr	x0, [x21, 88]
-.LVL644:
-	adrp	x1, .LC51
+.LVL685:
+	adrp	x1, .LC52
 	adrp	x22, .LANCHOR1
-	add	x1, x1, :lo12:.LC51
+	add	x1, x1, :lo12:.LC52
 	bl	_dev_err
-.LVL645:
-	b	.L530
-.LVL646:
-.L605:
-	.loc 1 2028 0
+.LVL686:
+	b	.L620
+.LVL687:
+.L695:
+	.loc 1 2257 0
 	ldr	x0, [x21, 88]
-.LVL647:
-	adrp	x1, .LC48
+.LVL688:
+	adrp	x1, .LC49
 	adrp	x22, .LANCHOR1
-	add	x1, x1, :lo12:.LC48
+	add	x1, x1, :lo12:.LC49
 	bl	_dev_err
-.LVL648:
-	b	.L530
-.LVL649:
-.L606:
-	.loc 1 2024 0
+.LVL689:
+	b	.L620
+.LVL690:
+.L696:
+	.loc 1 2253 0
 	mov	w25, 1
-.LVL650:
-	b	.L547
-.LBE1750:
-.LBE1765:
+.LVL691:
+	b	.L637
+.LBE1754:
+.LBE1769:
 	.cfi_endproc
-.LFE2847:
+.LFE2848:
 	.size	ebc_probe, .-ebc_probe
 	.align	2
 	.p2align 3,,7
 	.type	ebc_power_set.constprop.12, %function
 ebc_power_set.constprop.12:
-.LFB2865:
+.LFB2866:
 	.loc 1 180 0
 	.cfi_startproc
-.LVL651:
+.LVL692:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -7334,45 +8025,45 @@ ebc_power_set.constprop.12:
 	mov	x19, x0
 	.loc 1 186 0
 	ldr	w0, [x20, 424]
-.LVL652:
-	cbz	w0, .L611
-.L609:
+.LVL693:
+	cbz	w0, .L701
+.L699:
 	.loc 1 190 0
 	mov	w1, 1
 	str	w1, [x20, 184]
 	.loc 1 191 0
 	ldr	x2, [x19, 16]
-.LBB1766:
-.LBB1767:
+.LBB1770:
+.LBB1771:
 	.loc 3 30 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL653:
-.LBE1767:
-.LBE1766:
+.LVL694:
+.LBE1771:
+.LBE1770:
 	.loc 1 192 0
 	ldr	x2, [x19, 8]
-.LBB1768:
-.LBB1769:
+.LBB1772:
+.LBB1773:
 	.loc 11 46 0
 	add	x1, x19, 24
 	mov	x0, x2
 	ldr	x2, [x2, 48]
 	blr	x2
-.LVL654:
-.LBE1769:
-.LBE1768:
+.LVL695:
+.LBE1773:
+.LBE1772:
 	.loc 1 193 0
 	ldr	x0, [x19]
-	adrp	x1, .LC75
-	add	x1, x1, :lo12:.LC75
+	adrp	x1, .LC76
+	add	x1, x1, :lo12:.LC76
 	bl	_dev_info
-.LVL655:
+.LVL696:
 	.loc 1 208 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
-.LVL656:
+.LVL697:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -7381,24 +8072,24 @@ ebc_power_set.constprop.12:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL657:
+.LVL698:
 	.p2align 3
-.L611:
+.L701:
 	.cfi_restore_state
 	.loc 1 187 0
 	mov	w0, 1
 	str	w0, [x20, 424]
-.LBB1770:
-.LBB1771:
+.LBB1774:
+.LBB1775:
 	.loc 4 58 0
 	add	x0, x19, 400
 	bl	__pm_stay_awake
-.LVL658:
-	b	.L609
-.LBE1771:
-.LBE1770:
+.LVL699:
+	b	.L699
+.LBE1775:
+.LBE1774:
 	.cfi_endproc
-.LFE2865:
+.LFE2866:
 	.size	ebc_power_set.constprop.12, .-ebc_power_set.constprop.12
 	.align	2
 	.p2align 3,,7
@@ -7408,24 +8099,24 @@ refresh_new_image2:
 .LFB2807:
 	.loc 1 213 0
 	.cfi_startproc
-.LVL659:
+.LVL700:
 	.loc 1 220 0
 	ldp	w16, w5, [x4, 52]
-.LVL660:
+.LVL701:
 	cmp	w5, 0
 	add	w11, w5, 7
 	csel	w11, w11, w5, lt
-.LVL661:
+.LVL702:
 	.loc 1 222 0
 	cmp	w16, 0
 	.loc 1 220 0
 	asr	w11, w11, 3
-.LVL662:
+.LVL703:
 	.loc 1 222 0
-	ble	.L612
+	ble	.L702
 	sub	w14, w11, #1
 	mov	w15, 0
-.LVL663:
+.LVL704:
 	add	x14, x14, 1
 	.loc 1 267 0
 	mov	w13, 234881024
@@ -7433,92 +8124,92 @@ refresh_new_image2:
 	lsl	x14, x14, 2
 	.loc 1 273 0
 	mov	w12, -536870912
-.LVL664:
+.LVL705:
 	.p2align 2
-.L614:
+.L704:
 	.loc 1 223 0 discriminator 1
 	mov	x6, 0
 	cmp	w11, 0
-	bgt	.L635
-	b	.L632
-.LVL665:
+	bgt	.L725
+	b	.L722
+.LVL706:
 	.p2align 3
-.L615:
+.L705:
 	.loc 1 236 0
 	tst	x5, 65280
-	bne	.L616
+	bne	.L706
 	.loc 1 237 0
 	and	w10, w4, 240
 	cmp	w10, 224
-	beq	.L637
+	beq	.L727
 	.loc 1 240 0
 	orr	w7, w7, 240
-.L616:
+.L706:
 	.loc 1 242 0
 	tst	x5, 16711680
-	bne	.L618
+	bne	.L708
 	.loc 1 243 0
 	and	w10, w4, 3840
 	cmp	w10, 3584
-	beq	.L638
+	beq	.L728
 	.loc 1 246 0
 	orr	w7, w7, 3840
-.L618:
+.L708:
 	.loc 1 248 0
 	tst	x5, 4278190080
-	bne	.L620
+	bne	.L710
 	.loc 1 249 0
 	and	w10, w4, 61440
 	cmp	w10, 57344
-	beq	.L639
+	beq	.L729
 	.loc 1 252 0
 	orr	w7, w7, 61440
-.L620:
+.L710:
 	.loc 1 254 0
 	tst	x5, 1095216660480
-	bne	.L622
+	bne	.L712
 	.loc 1 255 0
 	and	w10, w4, 983040
 	cmp	w10, 917504
-	beq	.L640
+	beq	.L730
 	.loc 1 258 0
 	orr	w7, w7, 983040
-.L622:
+.L712:
 	.loc 1 260 0
 	tst	x5, 280375465082880
-	bne	.L624
+	bne	.L714
 	.loc 1 261 0
 	and	w10, w4, 15728640
 	cmp	w10, 14680064
-	beq	.L641
+	beq	.L731
 	.loc 1 264 0
 	orr	w7, w7, 15728640
-.L624:
+.L714:
 	.loc 1 266 0
 	tst	x5, 71776119061217280
-	bne	.L626
+	bne	.L716
 	.loc 1 267 0
 	and	w10, w4, 251658240
 	cmp	w10, w13
-	beq	.L642
+	beq	.L732
 	.loc 1 270 0
 	orr	w7, w7, 251658240
-.L626:
+.L716:
 	.loc 1 272 0
 	tst	x5, -72057594037927936
-	bne	.L628
+	bne	.L718
 	.loc 1 273 0
 	and	w5, w4, -268435456
-.LVL666:
+.LVL707:
 	cmp	w5, w12
-	beq	.L643
+	beq	.L733
 	.loc 1 276 0
 	orr	w7, w7, -268435456
-.LVL667:
-.L628:
+.LVL708:
+.L718:
 	.loc 1 280 0 discriminator 2
 	and	w4, w4, w9
-.LVL668:
+.LVL709:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
@@ -7527,54 +8218,54 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 223 0 discriminator 2
 	cmp	w11, w6
-	ble	.L644
-.LVL669:
-.L635:
+	ble	.L734
+.LVL710:
+.L725:
 	.loc 1 224 0
 	ldr	x5, [x3, x6, lsl 3]
 	.loc 1 228 0
 	mov	w7, 0
 	.loc 1 225 0
 	ldr	w4, [x1, x6, lsl 2]
-.LVL670:
+.LVL711:
 	.loc 1 226 0
 	ldr	w8, [x0, x6, lsl 2]
 	.loc 1 230 0
 	and	x10, x5, 255
 	.loc 1 227 0
 	ldr	w9, [x2, x6, lsl 2]
-.LVL671:
+.LVL712:
 	.loc 1 230 0
-	cbnz	x10, .L615
-.LVL672:
+	cbnz	x10, .L705
+.LVL713:
 	.loc 1 231 0
 	and	w10, w4, 15
 	.loc 1 234 0
 	mov	w7, 15
 	.loc 1 231 0
 	cmp	w10, 14
-	bne	.L615
+	bne	.L705
 	.loc 1 232 0
 	orr	w8, w8, w7
-.LVL673:
+.LVL714:
 	.loc 1 228 0
 	mov	w7, 0
-.LVL674:
-	b	.L615
+.LVL715:
+	b	.L705
 	.p2align 3
-.L642:
+.L732:
 	.loc 1 268 0
 	orr	w8, w8, 251658240
-	b	.L626
-.LVL675:
+	b	.L716
+.LVL716:
 	.p2align 3
-.L643:
+.L733:
 	.loc 1 274 0
 	orr	w8, w8, -268435456
-.LVL676:
+.LVL717:
 	.loc 1 280 0
 	and	w4, w4, w9
-.LVL677:
+.LVL718:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
@@ -7583,48 +8274,48 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 223 0
 	cmp	w11, w6
-	bgt	.L635
-.LVL678:
+	bgt	.L725
+.LVL719:
 	.p2align 2
-.L644:
+.L734:
 	add	x3, x3, x17
 	add	x1, x1, x14
 	add	x2, x2, x14
 	add	x0, x0, x14
-.LVL679:
-.L632:
+.LVL720:
+.L722:
 	.loc 1 222 0 discriminator 2
 	add	w15, w15, 1
 	cmp	w16, w15
-	bne	.L614
-.L612:
+	bne	.L704
+.L702:
 	ret
-.LVL680:
+.LVL721:
 	.p2align 3
-.L638:
+.L728:
 	.loc 1 244 0
 	orr	w8, w8, 3840
-	b	.L618
+	b	.L708
 	.p2align 3
-.L639:
+.L729:
 	.loc 1 250 0
 	orr	w8, w8, 61440
-	b	.L620
+	b	.L710
 	.p2align 3
-.L640:
+.L730:
 	.loc 1 256 0
 	orr	w8, w8, 983040
-	b	.L622
+	b	.L712
 	.p2align 3
-.L641:
+.L731:
 	.loc 1 262 0
 	orr	w8, w8, 15728640
-	b	.L624
+	b	.L714
 	.p2align 3
-.L637:
+.L727:
 	.loc 1 238 0
 	orr	w8, w8, 240
-	b	.L616
+	b	.L706
 	.cfi_endproc
 .LFE2807:
 	.size	refresh_new_image2, .-refresh_new_image2
@@ -7636,52 +8327,52 @@ refresh_new_image_auto:
 .LFB2808:
 	.loc 1 288 0
 	.cfi_startproc
-.LVL681:
+.LVL722:
 	.loc 1 295 0
 	ldp	w13, w4, [x3, 52]
 	cmp	w4, 0
 	add	w9, w4, 7
 	csel	w9, w9, w4, lt
-.LVL682:
+.LVL723:
 	.loc 1 297 0
 	cmp	w13, 0
 	.loc 1 295 0
 	asr	w9, w9, 3
-.LVL683:
+.LVL724:
 	.loc 1 297 0
-	ble	.L645
+	ble	.L735
 	sub	w12, w9, #1
 	mov	w11, 0
-.LVL684:
+.LVL725:
 	add	x12, x12, 1
 	.loc 1 305 0
 	mov	w10, 15
 	lsl	x14, x12, 3
 	lsl	x12, x12, 2
 	.p2align 2
-.L647:
+.L737:
 	.loc 1 298 0 discriminator 1
 	mov	x6, 0
 	cmp	w9, 0
-	ble	.L658
+	ble	.L748
 	.p2align 2
-.L660:
+.L750:
 	.loc 1 299 0
 	ldr	x4, [x2, x6, lsl 3]
-.LVL685:
+.LVL726:
 	.loc 1 301 0
 	ldr	w7, [x0, x6, lsl 2]
 	.loc 1 300 0
 	ldr	w3, [x1, x6, lsl 2]
-.LVL686:
+.LVL727:
 	.loc 1 304 0
 	and	x5, x4, 255
 	.loc 1 305 0
 	cmp	x5, 0
-.LVL687:
+.LVL728:
 	eor	w5, w3, w7
 	csel	w3, wzr, w10, ne
-.LVL688:
+.LVL729:
 	.loc 1 308 0
 	orr	w8, w3, 240
 	tst	x4, 65280
@@ -7709,10 +8400,10 @@ refresh_new_image_auto:
 	.loc 1 326 0
 	tst	x4, -72057594037927936
 	orr	w4, w3, -268435456
-.LVL689:
+.LVL730:
 	csel	w3, w4, w3, eq
 	and	w3, w5, w3
-.LVL690:
+.LVL731:
 	.loc 1 329 0
 	eor	w3, w3, w7
 	.loc 1 330 0
@@ -7720,17 +8411,17 @@ refresh_new_image_auto:
 	add	x6, x6, 1
 	.loc 1 298 0
 	cmp	w9, w6
-	bgt	.L660
+	bgt	.L750
 	add	x2, x2, x14
 	add	x1, x1, x12
 	add	x0, x0, x12
-.LVL691:
-.L658:
+.LVL732:
+.L748:
 	.loc 1 297 0 discriminator 2
 	add	w11, w11, 1
 	cmp	w13, w11
-	bne	.L647
-.L645:
+	bne	.L737
+.L735:
 	ret
 	.cfi_endproc
 .LFE2808:
@@ -7743,7 +8434,7 @@ new_buffer_refresh:
 .LFB2809:
 	.loc 1 336 0
 	.cfi_startproc
-.LVL692:
+.LVL733:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -7760,35 +8451,35 @@ new_buffer_refresh:
 	adrp	x20, .LANCHOR1
 	.loc 1 337 0
 	ldr	x19, [x1, #:lo12:.LANCHOR0]
-.LVL693:
+.LVL734:
 	.loc 1 340 0
 	add	x0, x20, :lo12:.LANCHOR1
-.LVL694:
+.LVL735:
 	add	x0, x0, 624
 	bl	down_write
-.LVL695:
+.LVL736:
 	.loc 1 338 0
 	add	x19, x19, 184
-.LVL696:
+.LVL737:
 	.loc 1 341 0
 	ldr	x0, [x19, 208]
 	ldr	w5, [x0, 40]
-	cbz	w5, .L666
+	cbz	w5, .L756
 	.loc 1 347 0
 	ldr	x1, [x0, 16]
 	mov	x4, x19
 	ldp	x2, x3, [x19, 144]
 	ldr	x0, [x19, 128]
 	bl	refresh_new_image2
-.LVL697:
+.LVL738:
 	.loc 1 352 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 624
 	bl	up_write
-.LVL698:
+.LVL739:
 	.loc 1 353 0
 	ldp	x19, x20, [sp, 16]
-.LVL699:
+.LVL740:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -7797,9 +8488,9 @@ new_buffer_refresh:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL700:
+.LVL741:
 	.p2align 3
-.L666:
+.L756:
 	.cfi_restore_state
 	.loc 1 342 0
 	ldr	x1, [x0, 16]
@@ -7807,15 +8498,15 @@ new_buffer_refresh:
 	ldr	x2, [x19, 152]
 	ldr	x0, [x19, 128]
 	bl	refresh_new_image_auto
-.LVL701:
+.LVL742:
 	.loc 1 352 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 624
 	bl	up_write
-.LVL702:
+.LVL743:
 	.loc 1 353 0
 	ldp	x19, x20, [sp, 16]
-.LVL703:
+.LVL744:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -7830,17 +8521,17 @@ new_buffer_refresh:
 	.p2align 3,,7
 	.type	ebc_thread, %function
 ebc_thread:
-.LFB2825:
-	.loc 1 1092 0
+.LFB2826:
+	.loc 1 1321 0
 	.cfi_startproc
-.LVL704:
+.LVL745:
 	stp	x29, x30, [sp, -224]!
 	.cfi_def_cfa_offset 224
 	.cfi_offset 29, -224
 	.cfi_offset 30, -216
-	.loc 1 1093 0
+	.loc 1 1322 0
 	adrp	x1, .LANCHOR0
-	.loc 1 1092 0
+	.loc 1 1321 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -7852,22 +8543,22 @@ ebc_thread:
 	adrp	x22, __stack_chk_guard
 	stp	x23, x24, [sp, 48]
 	adrp	x21, .LANCHOR1
-	.loc 1 1093 0
+	.loc 1 1322 0
 	ldr	x20, [x1, #:lo12:.LANCHOR0]
-.LVL705:
-	.loc 1 1092 0
+.LVL746:
+	.loc 1 1321 0
 	add	x0, x22, :lo12:__stack_chk_guard
-.LVL706:
+.LVL747:
 	stp	x25, x26, [sp, 64]
-.LBB1794:
-.LBB1795:
-.LBB1796:
-	.loc 1 1383 0
+.LBB1798:
+.LBB1799:
+.LBB1800:
+	.loc 1 1612 0
 	add	x21, x21, :lo12:.LANCHOR1
-.LBE1796:
-.LBE1795:
-.LBE1794:
-	.loc 1 1092 0
+.LBE1800:
+.LBE1799:
+.LBE1798:
+	.loc 1 1321 0
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 23, -176
 	.cfi_offset 24, -168
@@ -7875,84 +8566,84 @@ ebc_thread:
 	.cfi_offset 26, -152
 	.cfi_offset 27, -144
 	.cfi_offset 28, -136
-	.loc 1 1094 0
+	.loc 1 1323 0
 	add	x24, x20, 184
+.LBB1805:
+.LBB1803:
 .LBB1801:
-.LBB1799:
-.LBB1797:
-	.loc 1 1383 0
+	.loc 1 1612 0
 	add	x19, x21, 304
-.LBE1797:
-.LBE1799:
 .LBE1801:
-	.loc 1 1097 0
+.LBE1803:
+.LBE1805:
+	.loc 1 1326 0
 	mov	w23, 0
-.LVL707:
-	.loc 1 1092 0
+.LVL748:
+	.loc 1 1321 0
 	ldr	x1, [x0]
 	str	x1, [x29, 216]
 	mov	x1,0
-.LVL708:
+.LVL749:
 	.p2align 2
-.L668:
-	.loc 1 1102 0
+.L758:
+	.loc 1 1331 0
 	ldr	w0, [x24, 600]
-.LVL709:
-	cbnz	w0, .L796
-.L669:
-	.loc 1 1108 0
+.LVL750:
+	cbnz	w0, .L886
+.L759:
+	.loc 1 1337 0
 	bl	ebc_dsp_buf_get
-.LVL710:
+.LVL751:
 	mov	x28, x0
-	.loc 1 1110 0
-	cbz	x0, .L671
-	.loc 1 1110 0 is_stmt 0 discriminator 1
+	.loc 1 1339 0
+	cbz	x0, .L761
+	.loc 1 1339 0 is_stmt 0 discriminator 1
 	ldr	x1, [x0, 8]
-	cbz	x1, .L671
-	.loc 1 1111 0 is_stmt 1
+	cbz	x1, .L761
+	.loc 1 1340 0 is_stmt 1
 	ldr	w1, [x0, 40]
 	cmp	w1, 19
-	beq	.L797
-	.loc 1 1115 0
+	beq	.L887
+	.loc 1 1344 0
 	ldr	x2, [x24, 592]
-	cbz	x2, .L674
-	.loc 1 1116 0
+	cbz	x2, .L764
+	.loc 1 1345 0
 	cmp	w1, 18
-	beq	.L798
-.L789:
-	.loc 1 1173 0
+	beq	.L888
+.L879:
+	.loc 1 1402 0
 	bl	ebc_remove_from_dsp_buf_list
-.LVL711:
-	.loc 1 1174 0
+.LVL752:
+	.loc 1 1403 0
 	mov	x0, x28
 	bl	ebc_buf_release
-.LVL712:
-	.loc 1 1102 0
+.LVL753:
+	.loc 1 1331 0
 	ldr	w0, [x24, 600]
-	cbz	w0, .L669
+	cbz	w0, .L759
 	.p2align 2
-.L796:
-	.loc 1 1103 0
+.L886:
+	.loc 1 1332 0
 	ldr	w0, [x24, 184]
 	cmp	w0, 1
-	beq	.L799
-.L670:
-	.loc 1 1389 0
+	beq	.L889
+.L760:
+	.loc 1 1618 0
 	add	x22, x22, :lo12:__stack_chk_guard
 	mov	w0, 0
 	ldr	x2, [x29, 216]
 	ldr	x1, [x22]
 	eor	x1, x2, x1
-	cbnz	x1, .L800
+	cbnz	x1, .L890
 	ldp	x19, x20, [sp, 16]
-.LVL713:
+.LVL754:
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
-.LVL714:
+.LVL755:
 	ldp	x25, x26, [sp, 64]
-.LVL715:
+.LVL756:
 	ldp	x27, x28, [sp, 80]
-.LVL716:
+.LVL757:
 	ldp	x29, x30, [sp], 224
 	.cfi_remember_state
 	.cfi_restore 30
@@ -7969,527 +8660,527 @@ ebc_thread:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL717:
+.LVL758:
 	.p2align 3
-.L671:
+.L761:
 	.cfi_restore_state
-	.loc 1 1370 0
+	.loc 1 1599 0
 	ldr	w0, [x24, 28]
-.LVL718:
+.LVL759:
 	cmp	w0, 1
-	beq	.L801
-	.loc 1 1379 0
+	beq	.L891
+	.loc 1 1608 0
 	ldr	w0, [x24, 184]
 	cmp	w0, 1
-	beq	.L802
-.LVL719:
-.L792:
+	beq	.L892
+.LVL760:
+.L882:
 	ldr	w0, [x24, 80]
-.LVL720:
-	.loc 1 1382 0
-	cbz	w0, .L803
-.L755:
-.LVL721:
-.L745:
-	.loc 1 1384 0
+.LVL761:
+	.loc 1 1611 0
+	cbz	w0, .L893
+.L845:
+.LVL762:
+.L835:
+	.loc 1 1613 0
 	str	wzr, [x24, 80]
-	b	.L668
-.LVL722:
+	b	.L758
+.LVL763:
 	.p2align 3
-.L803:
-.LBB1802:
-.LBB1800:
-	.loc 1 1383 0 discriminator 1
+.L893:
+.LBB1806:
+.LBB1804:
+	.loc 1 1612 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL723:
-	b	.L756
+.LVL764:
+	b	.L846
 	.p2align 3
-.L804:
-.LVL724:
-.LBB1798:
-	.loc 1 1383 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L745
-	.loc 1 1383 0 discriminator 7
+.L894:
+.LVL765:
+.LBB1802:
+	.loc 1 1612 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L835
+	.loc 1 1612 0 discriminator 7
 	bl	schedule
-.LVL725:
-.L756:
-	.loc 1 1383 0 discriminator 9
+.LVL766:
+.L846:
+	.loc 1 1612 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL726:
+.LVL767:
 	ldr	w1, [x24, 80]
-	cbz	w1, .L804
-.LBE1798:
-	.loc 1 1383 0 discriminator 4
+	cbz	w1, .L894
+.LBE1802:
+	.loc 1 1612 0 discriminator 4
 	add	x1, x29, 112
 	mov	x0, x19
 	bl	finish_wait
-.LVL727:
-.LBE1800:
-.LBE1802:
-	.loc 1 1384 0 is_stmt 1 discriminator 4
+.LVL768:
+.LBE1804:
+.LBE1806:
+	.loc 1 1613 0 is_stmt 1 discriminator 4
 	str	wzr, [x24, 80]
-	b	.L668
-.LVL728:
+	b	.L758
+.LVL769:
 	.p2align 3
-.L674:
-	.loc 1 1128 0
+.L764:
+	.loc 1 1357 0
 	cmp	w1, 17
 	ccmp	w1, 20, 4, ne
-	bne	.L677
-	.loc 1 1129 0
+	bne	.L767
+	.loc 1 1358 0
 	str	wzr, [x24, 608]
-.L673:
-	.loc 1 1152 0
+.L763:
+	.loc 1 1381 0
 	adrp	x25, jiffies
-.LVL729:
+.LVL770:
 	mov	x1, 402653184
 	add	x0, x20, 616
 	ldr	x2, [x25, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL730:
-	.loc 1 1154 0
+.LVL771:
+	.loc 1 1383 0
 	ldr	w0, [x24, 428]
-	cbz	w0, .L679
+	cbz	w0, .L769
 	ldr	x0, [x24, 200]
-.L680:
-	.loc 1 1157 0
+.L770:
+	.loc 1 1386 0
 	ldr	w2, [x0, 40]
 	ldr	w3, [x28, 40]
 	cmp	w3, w2
-	beq	.L681
-	.loc 1 1158 0
+	beq	.L771
+	.loc 1 1387 0
 	ldr	x0, [x24, 88]
-	adrp	x1, .LC78
-	add	x1, x1, :lo12:.LC78
+	adrp	x1, .LC79
+	add	x1, x1, :lo12:.LC79
 	bl	_dev_info
-.LVL731:
-	.loc 1 1159 0
+.LVL772:
+	.loc 1 1388 0
 	ldr	w0, [x24, 28]
 	cmp	w0, 1
-	beq	.L805
-.L790:
+	beq	.L895
+.L880:
 	ldr	w2, [x28, 40]
-.L681:
-	.loc 1 1166 0
+.L771:
+	.loc 1 1395 0
 	cmp	w2, 11
-	bgt	.L688
+	bgt	.L778
 	cmp	w2, 7
-	bge	.L689
+	bge	.L779
 	cmp	w2, 1
-	beq	.L690
-	bgt	.L760
-	cbnz	w2, .L687
-	.loc 1 1211 0
+	beq	.L780
+	bgt	.L850
+	cbnz	w2, .L777
+	.loc 1 1440 0
 	add	x0, x21, 624
 	bl	down_write
-.LVL732:
-	.loc 1 1217 0
+.LVL773:
+	.loc 1 1446 0
 	ldr	x0, [x24, 200]
-	.loc 1 1212 0
+	.loc 1 1441 0
 	str	x28, [x24, 208]
-	.loc 1 1217 0
+	.loc 1 1446 0
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
-	bls	.L724
-	.loc 1 1219 0
+	bls	.L814
+	.loc 1 1448 0
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x28, 16]
 	ldr	x0, [x24, 128]
 	bl	memcpy
-.LVL733:
-	.loc 1 1220 0
+.LVL774:
+	.loc 1 1449 0
 	ldr	x0, [x24, 200]
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x24, 136]
 	bl	memcpy
-.LVL734:
-.L725:
-	.loc 1 1226 0
+.LVL775:
+.L815:
+	.loc 1 1455 0
 	add	x0, x21, 624
 	bl	up_write
-.LVL735:
-	.loc 1 1228 0
+.LVL776:
+	.loc 1 1457 0
 	ldr	w0, [x24, 28]
-	cbnz	w0, .L702
-	.loc 1 1229 0
+	cbnz	w0, .L792
+	.loc 1 1458 0
 	mov	w0, 1
 	str	w0, [x24, 28]
-	.loc 1 1231 0
+	.loc 1 1460 0
 	ldr	w0, [x24, 184]
-	.loc 1 1230 0
+	.loc 1 1459 0
 	str	wzr, [x24, 76]
-	.loc 1 1231 0
-	cbz	w0, .L806
-.L726:
-	.loc 1 1233 0
+	.loc 1 1460 0
+	cbz	w0, .L896
+.L816:
+	.loc 1 1462 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL736:
+.LVL777:
 	cmn	w0, #1
-	beq	.L807
-	.loc 1 1241 0
+	beq	.L897
+	.loc 1 1470 0
 	ldr	x0, [x24, 88]
-	adrp	x1, .LC84
-	.loc 1 1238 0
+	adrp	x1, .LC85
+	.loc 1 1467 0
 	ldr	w3, [x24, 96]
-	.loc 1 1241 0
-	add	x1, x1, :lo12:.LC84
-	.loc 1 1238 0
+	.loc 1 1470 0
+	add	x1, x1, :lo12:.LC85
+	.loc 1 1467 0
 	strb	w3, [x24, 32]
-.LVL737:
-.L791:
-	.loc 1 1241 0
+.LVL778:
+.L881:
+	.loc 1 1470 0
 	and	w2, w3, 255
-	.loc 1 1239 0
+	.loc 1 1468 0
 	lsr	w3, w3, 8
 	strb	w3, [x24, 33]
-	.loc 1 1241 0
+	.loc 1 1470 0
 	bl	_dev_info
-.LVL738:
-	.loc 1 1242 0
+.LVL779:
+	.loc 1 1471 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL739:
-	.loc 1 1344 0
+.LVL780:
+	.loc 1 1573 0
 	ldr	x0, [x24, 208]
 	ldr	w0, [x0, 40]
 	cmp	w0, 19
-	bne	.L741
-.LVL740:
-.L812:
-	.loc 1 1347 0
+	bne	.L831
+.LVL781:
+.L902:
+	.loc 1 1576 0
 	ldr	x0, [x24, 88]
-	.loc 1 1345 0
+	.loc 1 1574 0
 	mov	w25, 1
-.LVL741:
-	.loc 1 1346 0
+.LVL782:
+	.loc 1 1575 0
 	str	wzr, [x24, 188]
-	.loc 1 1347 0
-	adrp	x1, .LC87
-	.loc 1 1345 0
+	.loc 1 1576 0
+	adrp	x1, .LC88
+	.loc 1 1574 0
 	str	w25, [x24, 600]
-	.loc 1 1347 0
-	add	x1, x1, :lo12:.LC87
+	.loc 1 1576 0
+	add	x1, x1, :lo12:.LC88
 	bl	_dev_info
-.LVL742:
-	.loc 1 1348 0
+.LVL783:
+	.loc 1 1577 0
 	mov	w2, w25
 	mov	w1, w25
 	add	x0, x21, 328
 	bl	__wake_up_sync
-.LVL743:
-	.loc 1 1359 0
+.LVL784:
+	.loc 1 1588 0
 	mov	x0, x28
 	bl	ebc_remove_from_dsp_buf_list
-.LVL744:
-	.loc 1 1361 0
+.LVL785:
+	.loc 1 1590 0
 	ldr	w0, [x24, 428]
-	cbz	w0, .L743
-.LVL745:
+	cbz	w0, .L833
+.LVL786:
 	.p2align 2
-.L814:
-	.loc 1 1362 0
+.L904:
+	.loc 1 1591 0
 	ldr	x0, [x24, 200]
 	bl	ebc_buf_release
-.LVL746:
-	b	.L744
-.LVL747:
+.LVL787:
+	b	.L834
+.LVL788:
 	.p2align 3
-.L679:
-	.loc 1 1155 0
+.L769:
+	.loc 1 1384 0
 	mov	x0, x28
 	str	x28, [x24, 200]
-	b	.L680
-.LVL748:
+	b	.L770
+.LVL789:
 	.p2align 3
-.L797:
-	.loc 1 1113 0
+.L887:
+	.loc 1 1342 0
 	str	wzr, [x24, 604]
-	.loc 1 1112 0
+	.loc 1 1341 0
 	str	wzr, [x24, 608]
-	b	.L673
-.LVL749:
+	b	.L763
+.LVL790:
 	.p2align 3
-.L688:
-	.loc 1 1166 0
+.L778:
+	.loc 1 1395 0
 	cmp	w2, 14
-	bgt	.L693
+	bgt	.L783
 	cmp	w2, 13
-	bge	.L689
-.L760:
-	.loc 1 1266 0
+	bge	.L779
+.L850:
+	.loc 1 1495 0
 	ldr	x26, [x24, 200]
-	.loc 1 1257 0
+	.loc 1 1486 0
 	mov	w7, 1
-.LVL750:
-	.loc 1 1267 0
+.LVL791:
+	.loc 1 1496 0
 	ldr	w0, [x26, 40]
 	cmp	w0, 1
-	bls	.L808
-.L728:
-	.loc 1 1278 0
+	bls	.L898
+.L818:
+	.loc 1 1507 0
 	str	wzr, [x24, 76]
-	.loc 1 1279 0
+	.loc 1 1508 0
 	str	x28, [x24, 208]
-	.loc 1 1282 0
+	.loc 1 1511 0
 	ldr	w0, [x28, 40]
 	sub	w0, w0, #2
-	.loc 1 1281 0
+	.loc 1 1510 0
 	cmp	w0, 13
-	bhi	.L729
-.L809:
-	.loc 1 1284 0
+	bhi	.L819
+.L899:
+	.loc 1 1513 0
 	ldr	x0, [x24, 200]
-.LBB1803:
-.LBB1804:
-	.loc 1 1077 0
+.LBB1807:
+.LBB1808:
+	.loc 1 1306 0
 	ldr	w1, [x24, 20]
-.LBE1804:
-.LBE1803:
-	.loc 1 1283 0
+.LBE1808:
+.LBE1807:
+	.loc 1 1512 0
 	ldr	x4, [x28, 16]
-.LBB1807:
-.LBB1805:
-	.loc 1 1077 0
+.LBB1811:
+.LBB1809:
+	.loc 1 1306 0
 	cmp	w1, 0
-.LBE1805:
-.LBE1807:
-	.loc 1 1284 0
+.LBE1809:
+.LBE1811:
+	.loc 1 1513 0
 	ldr	x5, [x0, 16]
-.LBB1808:
-.LBB1806:
-	.loc 1 1077 0
+.LBB1812:
+.LBB1810:
+	.loc 1 1306 0
 	add	w0, w1, 7
 	csel	w0, w0, w1, lt
 	asr	w0, w0, 3
 	cmp	w0, 0
-	ble	.L730
-	.loc 1 1081 0
+	ble	.L820
+	.loc 1 1310 0
 	ldr	x1, [x4]
 	ldr	x2, [x5]
 	cmp	x2, x1
-	bne	.L729
+	bne	.L819
 	sub	w1, w0, #1
 	mov	x0, 8
 	add	x1, x1, 1
 	lsl	x1, x1, 3
-	b	.L732
+	b	.L822
 	.p2align 3
-.L733:
-	.loc 1 1078 0
+.L823:
+	.loc 1 1307 0
 	ldr	x3, [x4, x0]
 	add	x0, x0, 8
-	.loc 1 1079 0
+	.loc 1 1308 0
 	add	x2, x5, x0
-	.loc 1 1081 0
+	.loc 1 1310 0
 	ldr	x2, [x2, -8]
 	cmp	x3, x2
-	bne	.L729
-.L732:
-	.loc 1 1077 0
+	bne	.L819
+.L822:
+	.loc 1 1306 0
 	cmp	x1, x0
-	bne	.L733
-.L730:
-.LBE1806:
-.LBE1808:
-	.loc 1 1286 0
+	bne	.L823
+.L820:
+.LBE1810:
+.LBE1812:
+	.loc 1 1515 0
 	ldr	x0, [x24, 88]
-	adrp	x1, .LC89
-	add	x1, x1, :lo12:.LC89
+	adrp	x1, .LC90
+	add	x1, x1, :lo12:.LC90
 	bl	_dev_info
-.LVL751:
-	.loc 1 1288 0
+.LVL792:
+	.loc 1 1517 0
 	str	x26, [x24, 200]
-	.loc 1 1290 0
-	b	.L702
+	.loc 1 1519 0
+	b	.L792
 	.p2align 3
-.L689:
-	.loc 1 1266 0
+.L779:
+	.loc 1 1495 0
 	ldr	x26, [x24, 200]
-	.loc 1 1166 0
+	.loc 1 1395 0
 	mov	w7, 0
-.LVL752:
-	.loc 1 1267 0
+.LVL793:
+	.loc 1 1496 0
 	ldr	w0, [x26, 40]
 	cmp	w0, 1
-	bhi	.L728
-.L808:
-	.loc 1 1272 0
+	bhi	.L818
+.L898:
+	.loc 1 1501 0
 	add	x0, x29, 152
-	.loc 1 1278 0
+	.loc 1 1507 0
 	str	wzr, [x24, 76]
-	.loc 1 1272 0
+	.loc 1 1501 0
 	str	x0, [x24, 200]
-	.loc 1 1279 0
+	.loc 1 1508 0
 	str	x28, [x24, 208]
-	.loc 1 1273 0
+	.loc 1 1502 0
 	ldr	x0, [x24, 136]
 	str	x0, [x29, 168]
-	.loc 1 1282 0
+	.loc 1 1511 0
 	ldr	w0, [x28, 40]
 	sub	w0, w0, #2
-	.loc 1 1281 0
+	.loc 1 1510 0
 	cmp	w0, 13
-	bls	.L809
+	bls	.L899
 	.p2align 2
-.L729:
-	.loc 1 1294 0
-	cbnz	w7, .L764
-	.loc 1 1298 0
+.L819:
+	.loc 1 1523 0
+	cbnz	w7, .L854
+	.loc 1 1527 0
 	ldr	w0, [x24, 48]
 	cmp	w0, 0
-	ble	.L734
-	.loc 1 1299 0
+	ble	.L824
+	.loc 1 1528 0
 	add	w23, w23, 1
-	.loc 1 1300 0
+	.loc 1 1529 0
 	cmp	w0, w23
-	ble	.L810
-.L734:
-	.loc 1 1306 0
+	ble	.L900
+.L824:
+	.loc 1 1535 0
 	ldr	w0, [x24, 184]
-	cbz	w0, .L811
-.L735:
-	.loc 1 1309 0
+	cbz	w0, .L901
+.L825:
+	.loc 1 1538 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL753:
-	cbz	w0, .L736
-	.loc 1 1310 0
+.LVL794:
+	cbz	w0, .L826
+	.loc 1 1539 0
 	ldr	x0, [x24, 88]
-	adrp	x1, .LC83
-	add	x1, x1, :lo12:.LC83
+	adrp	x1, .LC84
+	add	x1, x1, :lo12:.LC84
 	bl	_dev_err
-.LVL754:
-	.loc 1 1312 0
+.LVL795:
+	.loc 1 1541 0
 	str	x26, [x24, 200]
-.LVL755:
+.LVL796:
 	.p2align 2
-.L702:
-	.loc 1 1344 0
+.L792:
+	.loc 1 1573 0
 	ldr	x0, [x24, 208]
 	ldr	w0, [x0, 40]
 	cmp	w0, 19
-	beq	.L812
-.L741:
-	.loc 1 1350 0
+	beq	.L902
+.L831:
+	.loc 1 1579 0
 	cmp	w0, 17
-	beq	.L813
-.L742:
-	.loc 1 1359 0
+	beq	.L903
+.L832:
+	.loc 1 1588 0
 	mov	x0, x28
 	bl	ebc_remove_from_dsp_buf_list
-.LVL756:
-	.loc 1 1361 0
+.LVL797:
+	.loc 1 1590 0
 	ldr	w0, [x24, 428]
-	cbnz	w0, .L814
-.L743:
-	.loc 1 1364 0
+	cbnz	w0, .L904
+.L833:
+	.loc 1 1593 0
 	mov	w0, 1
 	str	w0, [x24, 428]
-.L744:
-	.loc 1 1366 0
+.L834:
+	.loc 1 1595 0
 	ldr	x0, [x24, 208]
 	str	x0, [x24, 200]
-	.loc 1 1367 0
-	b	.L668
+	.loc 1 1596 0
+	b	.L758
 	.p2align 3
-.L801:
-.LBB1809:
-	.loc 1 1371 0 discriminator 1
+.L891:
+.LBB1813:
+	.loc 1 1600 0 discriminator 1
 	ldr	w0, [x24, 80]
-	cbnz	w0, .L745
-.LBB1810:
-	.loc 1 1371 0 is_stmt 0 discriminator 3
+	cbnz	w0, .L835
+.LBB1814:
+	.loc 1 1600 0 is_stmt 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL757:
-	b	.L749
+.LVL798:
+	b	.L839
 	.p2align 3
-.L815:
-.LBB1811:
-	.loc 1 1371 0 discriminator 7
+.L905:
+.LBB1815:
+	.loc 1 1600 0 discriminator 7
 	ldr	w1, [x24, 80]
-	cbnz	w1, .L746
-.LVL758:
-	.loc 1 1371 0 discriminator 9
-	cbnz	x0, .L792
-	.loc 1 1371 0 discriminator 11
+	cbnz	w1, .L836
+.LVL799:
+	.loc 1 1600 0 discriminator 9
+	cbnz	x0, .L882
+	.loc 1 1600 0 discriminator 11
 	bl	schedule
-.LVL759:
-.L749:
-	.loc 1 1371 0 discriminator 13
+.LVL800:
+.L839:
+	.loc 1 1600 0 discriminator 13
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL760:
+.LVL801:
 	ldr	w1, [x24, 28]
-	cbnz	w1, .L815
-.L746:
-.LBE1811:
-	.loc 1 1371 0 discriminator 8
+	cbnz	w1, .L905
+.L836:
+.LBE1815:
+	.loc 1 1600 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL761:
+.LVL802:
 	ldr	w0, [x24, 28]
-.LBE1810:
-.LBE1809:
-	.loc 1 1374 0 is_stmt 1 discriminator 8
-	cbnz	w0, .L792
-	.loc 1 1379 0
+.LBE1814:
+.LBE1813:
+	.loc 1 1603 0 is_stmt 1 discriminator 8
+	cbnz	w0, .L882
+	.loc 1 1608 0
 	ldr	w0, [x24, 184]
 	cmp	w0, 1
-	bne	.L792
+	bne	.L882
 	.p2align 2
-.L802:
-.LBB1812:
-.LBB1813:
+.L892:
+.LBB1816:
+.LBB1817:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
-.LVL762:
-	b	.L792
-.LVL763:
+.LVL803:
+	b	.L882
+.LVL804:
 	.p2align 3
-.L677:
-.LBE1813:
-.LBE1812:
-	.loc 1 1131 0
+.L767:
+.LBE1817:
+.LBE1816:
+	.loc 1 1360 0
 	ldr	w0, [x24, 608]
-.LVL764:
+.LVL805:
 	cmp	w0, 0
 	ccmp	w1, 1, 4, ne
-	beq	.L673
-	.loc 1 1132 0
+	beq	.L763
+	.loc 1 1361 0
 	add	x25, x21, 624
-.LVL765:
+.LVL806:
 	mov	x0, x25
 	bl	down_write
-.LVL766:
-	.loc 1 1133 0
+.LVL807:
+	.loc 1 1362 0
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x28, 16]
 	ldr	x0, [x24, 144]
 	bl	memcpy
-.LVL767:
-	.loc 1 1134 0
+.LVL808:
+	.loc 1 1363 0
 	mov	x0, x28
 	bl	ebc_remove_from_dsp_buf_list
-.LVL768:
-	.loc 1 1135 0
+.LVL809:
+	.loc 1 1364 0
 	mov	x0, x28
 	bl	ebc_buf_release
-.LVL769:
-	.loc 1 1137 0
+.LVL810:
+	.loc 1 1366 0
 	ldr	x1, [x24, 208]
 	mov	x4, x24
 	ldr	x0, [x24, 128]
@@ -8497,71 +9188,71 @@ ebc_thread:
 	ldr	w5, [x1, 40]
 	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
-.LVL770:
-	.loc 1 1140 0
+.LVL811:
+	.loc 1 1369 0
 	mov	x0, x25
 	bl	up_write
-.LVL771:
-	.loc 1 1141 0
+.LVL812:
+	.loc 1 1370 0
 	ldr	w0, [x24, 28]
-	cbnz	w0, .L668
-	.loc 1 1144 0
+	cbnz	w0, .L758
+	.loc 1 1373 0
 	ldr	w0, [x24, 184]
-	.loc 1 1142 0
+	.loc 1 1371 0
 	mov	w1, 1
-	.loc 1 1143 0
+	.loc 1 1372 0
 	str	wzr, [x24, 76]
-	.loc 1 1142 0
+	.loc 1 1371 0
 	str	w1, [x24, 28]
-	.loc 1 1144 0
-	cbz	w0, .L816
-.L678:
-	.loc 1 1146 0
+	.loc 1 1373 0
+	cbz	w0, .L906
+.L768:
+	.loc 1 1375 0
 	ldr	x0, [x24, 88]
-	adrp	x1, .LC77
+	adrp	x1, .LC78
 	ldrb	w2, [x24, 32]
-	add	x1, x1, :lo12:.LC77
+	add	x1, x1, :lo12:.LC78
 	bl	_dev_info
-.LVL772:
-	.loc 1 1147 0
+.LVL813:
+	.loc 1 1376 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL773:
-	b	.L668
-.L693:
-	.loc 1 1166 0
+.LVL814:
+	b	.L758
+.L783:
+	.loc 1 1395 0
 	cmp	w2, 20
-	ble	.L760
-.L687:
-	.loc 1 1336 0
+	ble	.L850
+.L777:
+	.loc 1 1565 0
 	ldr	x0, [x24, 88]
-	adrp	x1, .LC86
-	add	x1, x1, :lo12:.LC86
+	adrp	x1, .LC87
+	add	x1, x1, :lo12:.LC87
 	bl	_dev_err
-.LVL774:
-	.loc 1 1337 0
-	b	.L702
+.LVL815:
+	.loc 1 1566 0
+	b	.L792
 	.p2align 3
-.L690:
-	.loc 1 1168 0
+.L780:
+	.loc 1 1397 0
 	ldr	w0, [x24, 604]
-	cbz	w0, .L694
-	.loc 1 1181 0
+	cbz	w0, .L784
+	.loc 1 1410 0
 	ldr	x0, [x24, 200]
-	.loc 1 1179 0
+	.loc 1 1408 0
 	str	x28, [x24, 208]
-	.loc 1 1169 0
+	.loc 1 1398 0
 	str	w2, [x24, 608]
-	.loc 1 1181 0
+	.loc 1 1410 0
 	ldr	w1, [x0, 40]
 	cmp	w1, 1
-	bhi	.L695
+	bhi	.L785
 	mov	x0, x28
-	.loc 1 1186 0
-	cbz	w1, .L817
-.L697:
-.LBB1814:
-.LBB1815:
+	.loc 1 1415 0
+	cbz	w1, .L907
+.L787:
+.LBB1818:
+.LBB1819:
 	.loc 1 374 0
 	ldp	w3, w14, [x0, 48]
 	.loc 1 433 0
@@ -8589,23 +9280,23 @@ ebc_thread:
 	asr	w8, w8, 3
 	.loc 1 377 0
 	asr	w16, w16, 3
-.LVL775:
+.LVL816:
 	.loc 1 373 0
 	add	w8, w8, 1
-.LVL776:
+.LVL817:
 	ldr	w1, [x20, 236]
 	.loc 1 380 0
 	cmp	w8, w16
-.LBE1815:
-.LBE1814:
-	.loc 1 1190 0
+.LBE1819:
+.LBE1818:
+	.loc 1 1419 0
 	ldr	x11, [x0, 16]
+.LBB1824:
 .LBB1820:
-.LBB1816:
 	.loc 1 380 0
 	sub	w0, w16, #1
 	csel	w8, w0, w8, ge
-.LVL777:
+.LVL818:
 	.loc 1 382 0
 	cmp	w1, w17
 	sub	w1, w1, #1
@@ -8615,106 +9306,106 @@ ebc_thread:
 	csel	w17, w1, w17, le
 	.loc 1 372 0
 	asr	w15, w15, 3
-.LVL778:
+.LVL819:
 	mul	w5, w14, w16
 	.loc 1 384 0
 	cmp	w14, w17
-.LBE1816:
 .LBE1820:
-	.loc 1 1190 0
+.LBE1824:
+	.loc 1 1419 0
 	ldr	x7, [x24, 128]
-	.loc 1 1191 0
+	.loc 1 1420 0
 	ldp	x10, x9, [x24, 144]
+.LBB1825:
 .LBB1821:
-.LBB1817:
 	.loc 1 384 0
-	bgt	.L705
-.LVL779:
+	bgt	.L795
+.LVL820:
 	.p2align 2
-.L775:
+.L865:
 	.loc 1 389 0
 	mov	w4, w15
 	cmp	w15, w8
-	ble	.L776
-	b	.L722
-.LVL780:
+	ble	.L866
+	b	.L812
+.LVL821:
 	.p2align 3
-.L706:
+.L796:
 	.loc 1 402 0
 	tst	x2, 65280
-	bne	.L707
+	bne	.L797
 	.loc 1 403 0
 	and	w26, w1, 240
 	cmp	w26, 224
-	beq	.L818
+	beq	.L908
 	.loc 1 406 0
 	orr	w18, w18, 240
-.L707:
+.L797:
 	.loc 1 408 0
 	tst	x2, 16711680
-	bne	.L709
+	bne	.L799
 	.loc 1 409 0
 	and	w26, w1, 3840
 	cmp	w26, 3584
-	beq	.L819
+	beq	.L909
 	.loc 1 412 0
 	orr	w18, w18, 3840
-.L709:
+.L799:
 	.loc 1 414 0
 	tst	x2, 4278190080
-	bne	.L711
+	bne	.L801
 	.loc 1 415 0
 	and	w26, w1, 61440
 	cmp	w26, 57344
-	beq	.L820
+	beq	.L910
 	.loc 1 418 0
 	orr	w18, w18, 61440
-.L711:
+.L801:
 	.loc 1 420 0
 	tst	x2, 1095216660480
-	bne	.L713
+	bne	.L803
 	.loc 1 421 0
 	and	w26, w1, 983040
 	cmp	w26, 917504
-	beq	.L821
+	beq	.L911
 	.loc 1 424 0
 	orr	w18, w18, 983040
-.L713:
+.L803:
 	.loc 1 426 0
 	tst	x2, 280375465082880
-	bne	.L715
+	bne	.L805
 	.loc 1 427 0
 	and	w26, w1, 15728640
 	cmp	w26, 14680064
-	beq	.L822
+	beq	.L912
 	.loc 1 430 0
 	orr	w18, w18, 15728640
-.L715:
+.L805:
 	.loc 1 432 0
 	tst	x2, 71776119061217280
-	bne	.L717
+	bne	.L807
 	.loc 1 433 0
 	and	w26, w1, 251658240
 	cmp	w26, w13
-	beq	.L823
+	beq	.L913
 	.loc 1 436 0
 	orr	w18, w18, 251658240
-.L717:
+.L807:
 	.loc 1 438 0
 	tst	x2, -72057594037927936
-	bne	.L719
+	bne	.L809
 	.loc 1 439 0
 	and	w2, w1, -268435456
-.LVL781:
+.LVL822:
 	cmp	w2, w12
-	beq	.L824
+	beq	.L914
 	.loc 1 442 0
 	orr	w18, w18, -268435456
-.LVL782:
-.L719:
+.LVL823:
+.L809:
 	.loc 1 445 0
 	and	w1, w1, w25
-.LVL783:
+.LVL824:
 	.loc 1 389 0
 	add	w4, w4, 1
 	eor	w1, w1, w3
@@ -8725,19 +9416,19 @@ ebc_thread:
 	.loc 1 446 0
 	str	w1, [x7, x0]
 	.loc 1 389 0
-	bgt	.L722
-.LVL784:
-.L776:
+	bgt	.L812
+.LVL825:
+.L866:
 	.loc 1 390 0
 	sxtw	x0, w4
-.LVL785:
+.LVL826:
 	.loc 1 394 0
 	mov	w18, 0
 	.loc 1 393 0
 	lsl	x1, x0, 3
 	.loc 1 390 0
 	lsl	x0, x0, 2
-.LVL786:
+.LVL827:
 	.loc 1 393 0
 	add	x1, x1, x5, sxtw 3
 	add	x0, x0, x5, sxtw 2
@@ -8748,150 +9439,150 @@ ebc_thread:
 	ldr	w1, [x11, x0]
 	.loc 1 396 0
 	and	x26, x2, 255
-.LVL787:
+.LVL828:
 	.loc 1 392 0
 	ldr	w25, [x10, x0]
-.LVL788:
+.LVL829:
 	.loc 1 396 0
-	cbnz	x26, .L706
-.LVL789:
+	cbnz	x26, .L796
+.LVL830:
 	.loc 1 397 0
 	and	w26, w1, 15
 	.loc 1 400 0
 	mov	w18, 15
 	.loc 1 397 0
 	cmp	w26, 14
-	bne	.L706
+	bne	.L796
 	.loc 1 398 0
 	orr	w3, w3, w18
-.LVL790:
+.LVL831:
 	.loc 1 394 0
 	mov	w18, 0
-.LVL791:
-	b	.L706
-.LVL792:
+.LVL832:
+	b	.L796
+.LVL833:
 	.p2align 3
-.L736:
-.LBE1817:
+.L826:
 .LBE1821:
-	.loc 1 1321 0
+.LBE1825:
+	.loc 1 1550 0
 	ldr	x0, [x24, 208]
-	adrp	x1, .LC85
-	.loc 1 1318 0
+	adrp	x1, .LC86
+	.loc 1 1547 0
 	ldr	w3, [x24, 96]
-	.loc 1 1321 0
-	add	x1, x1, :lo12:.LC85
-	.loc 1 1318 0
+	.loc 1 1550 0
+	add	x1, x1, :lo12:.LC86
+	.loc 1 1547 0
 	strb	w3, [x24, 32]
-	.loc 1 1321 0
+	.loc 1 1550 0
 	and	w3, w3, 255
 	ldr	w2, [x0, 40]
 	ldr	x0, [x24, 88]
 	bl	_dev_info
-.LVL793:
-	.loc 1 1322 0
+.LVL834:
+	.loc 1 1551 0
 	mov	w0, 1
 	str	w0, [x24, 28]
-	.loc 1 1323 0
+	.loc 1 1552 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL794:
-	.loc 1 1325 0
+.LVL835:
+	.loc 1 1554 0
 	ldr	x1, [x25, #:lo12:jiffies]
 	add	x0, x20, 672
 	str	x0, [x29, 104]
 	add	x1, x1, 900
 	bl	mod_timer
-.LVL795:
-.LBB1822:
-	.loc 1 1326 0
+.LVL836:
+.LBB1826:
+	.loc 1 1555 0
 	ldr	w0, [x24, 76]
-	cbz	w0, .L825
-.L739:
-.LVL796:
-.L737:
-.LBE1822:
-	.loc 1 1328 0 discriminator 11
+	cbz	w0, .L915
+.L829:
+.LVL837:
+.L827:
+.LBE1826:
+	.loc 1 1557 0 discriminator 11
 	ldr	x2, [x25, #:lo12:jiffies]
 	mov	x1, 402653184
 	ldr	x0, [x29, 104]
-.LVL797:
+.LVL838:
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL798:
-	.loc 1 1329 0 discriminator 11
+.LVL839:
+	.loc 1 1558 0 discriminator 11
 	str	wzr, [x24, 76]
-	.loc 1 1331 0 discriminator 11
+	.loc 1 1560 0 discriminator 11
 	str	x26, [x24, 200]
-	.loc 1 1333 0 discriminator 11
-	b	.L702
-.LVL799:
+	.loc 1 1562 0 discriminator 11
+	b	.L792
+.LVL840:
 	.p2align 3
-.L764:
-	.loc 1 1306 0
+.L854:
+	.loc 1 1535 0
 	ldr	w0, [x24, 184]
-	.loc 1 1295 0
+	.loc 1 1524 0
 	mov	w23, 0
-	.loc 1 1306 0
-	cbnz	w0, .L735
-.L811:
-	.loc 1 1307 0
+	.loc 1 1535 0
+	cbnz	w0, .L825
+.L901:
+	.loc 1 1536 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.12
-.LVL800:
-	b	.L735
-.L805:
-	.loc 1 1160 0
+.LVL841:
+	b	.L825
+.L895:
+	.loc 1 1389 0
 	ldr	x0, [x24, 88]
-	adrp	x1, .LC79
-	add	x1, x1, :lo12:.LC79
+	adrp	x1, .LC80
+	add	x1, x1, :lo12:.LC80
 	bl	_dev_info
-.LVL801:
-.LBB1826:
-	.loc 1 1161 0
+.LVL842:
+.LBB1830:
+	.loc 1 1390 0
 	ldr	w0, [x24, 76]
-	cbz	w0, .L826
-.L685:
-.LVL802:
-.L683:
-.LBE1826:
-	.loc 1 1162 0 discriminator 11
+	cbz	w0, .L916
+.L775:
+.LVL843:
+.L773:
+.LBE1830:
+	.loc 1 1391 0 discriminator 11
 	ldr	x0, [x24, 88]
-.LVL803:
-	adrp	x1, .LC80
-	add	x1, x1, :lo12:.LC80
+.LVL844:
+	adrp	x1, .LC81
+	add	x1, x1, :lo12:.LC81
 	bl	_dev_info
-.LVL804:
-	b	.L790
-.LVL805:
+.LVL845:
+	b	.L880
+.LVL846:
 	.p2align 3
-.L821:
-.LBB1830:
-.LBB1818:
+.L911:
+.LBB1834:
+.LBB1822:
 	.loc 1 422 0
 	orr	w3, w3, 983040
-	b	.L713
+	b	.L803
 	.p2align 3
-.L822:
+.L912:
 	.loc 1 428 0
 	orr	w3, w3, 15728640
-	b	.L715
+	b	.L805
 	.p2align 3
-.L823:
+.L913:
 	.loc 1 434 0
 	orr	w3, w3, 251658240
-	b	.L717
-.LVL806:
+	b	.L807
+.LVL847:
 	.p2align 3
-.L824:
+.L914:
 	.loc 1 440 0
 	orr	w3, w3, -268435456
-.LVL807:
+.LVL848:
 	.loc 1 445 0
 	and	w1, w1, w25
-.LVL808:
+.LVL849:
 	eor	w1, w1, w3
-.LVL809:
+.LVL850:
 	.loc 1 389 0
 	add	w4, w4, 1
 	and	w1, w1, w18
@@ -8901,302 +9592,302 @@ ebc_thread:
 	.loc 1 446 0
 	str	w1, [x7, x0]
 	.loc 1 389 0
-	ble	.L776
-.LVL810:
+	ble	.L866
+.LVL851:
 	.p2align 2
-.L722:
+.L812:
 	.loc 1 384 0
 	add	w14, w14, 1
 	add	w5, w5, w16
 	cmp	w14, w17
-	ble	.L775
-.L705:
-.LBE1818:
-.LBE1830:
-	.loc 1 1194 0
+	ble	.L865
+.L795:
+.LBE1822:
+.LBE1834:
+	.loc 1 1423 0
 	ldr	w0, [x24, 28]
-	cbnz	w0, .L702
-	.loc 1 1195 0
+	cbnz	w0, .L792
+	.loc 1 1424 0
 	mov	w0, 1
 	str	w0, [x24, 28]
-	.loc 1 1197 0
+	.loc 1 1426 0
 	ldr	w0, [x24, 184]
-	.loc 1 1196 0
+	.loc 1 1425 0
 	str	wzr, [x24, 76]
-	.loc 1 1197 0
-	cbz	w0, .L827
-.L723:
-	.loc 1 1199 0
+	.loc 1 1426 0
+	cbz	w0, .L917
+.L813:
+	.loc 1 1428 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL811:
+.LVL852:
 	cmn	w0, #1
-	beq	.L702
-	.loc 1 1203 0
+	beq	.L792
+	.loc 1 1432 0
 	ldr	w3, [x24, 96]
-	.loc 1 1206 0
-	adrp	x1, .LC82
-	.loc 1 1203 0
+	.loc 1 1435 0
+	adrp	x1, .LC83
+	.loc 1 1432 0
 	strb	w3, [x24, 32]
-	.loc 1 1206 0
-	add	x1, x1, :lo12:.LC82
+	.loc 1 1435 0
+	add	x1, x1, :lo12:.LC83
 	ldr	x0, [x24, 88]
-	b	.L791
-.LVL812:
+	b	.L881
+.LVL853:
 	.p2align 3
-.L818:
-.LBB1831:
-.LBB1819:
+.L908:
+.LBB1835:
+.LBB1823:
 	.loc 1 404 0
 	orr	w3, w3, 240
-	b	.L707
+	b	.L797
 	.p2align 3
-.L819:
+.L909:
 	.loc 1 410 0
 	orr	w3, w3, 3840
-	b	.L709
+	b	.L799
 	.p2align 3
-.L820:
+.L910:
 	.loc 1 416 0
 	orr	w3, w3, 61440
-	b	.L711
-.LVL813:
-.L798:
-.LBE1819:
-.LBE1831:
-	.loc 1 1117 0
+	b	.L801
+.LVL854:
+.L888:
+.LBE1823:
+.LBE1835:
+	.loc 1 1346 0
 	str	wzr, [x24, 592]
-	.loc 1 1118 0
+	.loc 1 1347 0
 	mov	x0, 3
-.LVL814:
+.LVL855:
 	bl	ebc_notify
-.LVL815:
-	.loc 1 1119 0
+.LVL856:
+	.loc 1 1348 0
 	ldr	x0, [x24, 88]
-	adrp	x1, .LC76
-	add	x1, x1, :lo12:.LC76
+	adrp	x1, .LC77
+	add	x1, x1, :lo12:.LC77
 	bl	_dev_info
-.LVL816:
-	b	.L673
-.LVL817:
-.L813:
-	.loc 1 1354 0
+.LVL857:
+	b	.L763
+.LVL858:
+.L903:
+	.loc 1 1583 0
 	ldr	x0, [x24, 88]
-	.loc 1 1352 0
+	.loc 1 1581 0
 	mov	w25, 1
-.LVL818:
-	.loc 1 1351 0
+.LVL859:
+	.loc 1 1580 0
 	str	wzr, [x24, 188]
-	.loc 1 1354 0
-	adrp	x1, .LC88
-	.loc 1 1352 0
+	.loc 1 1583 0
+	adrp	x1, .LC89
+	.loc 1 1581 0
 	str	w25, [x24, 592]
-	.loc 1 1354 0
-	add	x1, x1, :lo12:.LC88
-	.loc 1 1353 0
+	.loc 1 1583 0
+	add	x1, x1, :lo12:.LC89
+	.loc 1 1582 0
 	str	wzr, [x24, 608]
-	.loc 1 1354 0
+	.loc 1 1583 0
 	bl	_dev_info
-.LVL819:
-	.loc 1 1355 0
+.LVL860:
+	.loc 1 1584 0
 	mov	x0, 2
 	bl	ebc_notify
-.LVL820:
-	.loc 1 1356 0
+.LVL861:
+	.loc 1 1585 0
 	mov	w2, w25
 	mov	w1, w25
 	add	x0, x21, 328
 	bl	__wake_up_sync
-.LVL821:
-	b	.L742
-.L695:
-	.loc 1 1183 0
+.LVL862:
+	b	.L832
+.L785:
+	.loc 1 1412 0
 	ldr	x1, [x0, 16]
 	ldrsw	x2, [x24, 20]
 	ldr	x0, [x24, 128]
 	bl	memcpy
-.LVL822:
-	.loc 1 1184 0
+.LVL863:
+	.loc 1 1413 0
 	ldr	x0, [x24, 200]
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x24, 136]
 	bl	memcpy
-.LVL823:
-	.loc 1 1185 0
+.LVL864:
+	.loc 1 1414 0
 	ldr	x0, [x24, 200]
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x24, 144]
 	bl	memcpy
-.LVL824:
+.LVL865:
 	ldr	x0, [x24, 208]
-	b	.L697
-.LVL825:
-.L810:
-	.loc 1 1301 0
+	b	.L787
+.LVL866:
+.L900:
+	.loc 1 1530 0
 	mov	w0, 2
-	.loc 1 1302 0
+	.loc 1 1531 0
 	mov	w23, 0
-	.loc 1 1301 0
+	.loc 1 1530 0
 	str	w0, [x28, 40]
-	b	.L734
-.LVL826:
-.L694:
-	.loc 1 1172 0
+	b	.L824
+.LVL867:
+.L784:
+	.loc 1 1401 0
 	ldr	x0, [x24, 88]
-	adrp	x1, .LC81
-	add	x1, x1, :lo12:.LC81
+	adrp	x1, .LC82
+	add	x1, x1, :lo12:.LC82
 	bl	_dev_info
-.LVL827:
-	.loc 1 1173 0
+.LVL868:
+	.loc 1 1402 0
 	mov	x0, x28
-	b	.L789
-.L724:
-	.loc 1 1223 0
+	b	.L879
+.L814:
+	.loc 1 1452 0
 	ldr	x0, [x24, 128]
 	mov	x3, x24
 	ldr	x2, [x24, 152]
 	ldr	x1, [x28, 16]
 	bl	refresh_new_image_auto
-.LVL828:
-	b	.L725
-.L825:
-.LBB1832:
-.LBB1823:
-.LBB1824:
-	.loc 1 1326 0 discriminator 1
+.LVL869:
+	b	.L815
+.L915:
+.LBB1836:
+.LBB1827:
+.LBB1828:
+	.loc 1 1555 0 discriminator 1
 	add	x27, x21, 352
-.LBE1824:
+.LBE1828:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL829:
-	b	.L740
+.LVL870:
+	b	.L830
 	.p2align 3
-.L828:
-.LVL830:
-.LBB1825:
-	.loc 1 1326 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L737
-	.loc 1 1326 0 discriminator 7
+.L918:
+.LVL871:
+.LBB1829:
+	.loc 1 1555 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L827
+	.loc 1 1555 0 discriminator 7
 	bl	schedule
-.LVL831:
-.L740:
-	.loc 1 1326 0 discriminator 9
+.LVL872:
+.L830:
+	.loc 1 1555 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x27
 	bl	prepare_to_wait_event
-.LVL832:
+.LVL873:
 	ldr	w1, [x24, 76]
-	cbz	w1, .L828
-.LBE1825:
-	.loc 1 1326 0 discriminator 4
+	cbz	w1, .L918
+.LBE1829:
+	.loc 1 1555 0 discriminator 4
 	mov	x0, x27
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL833:
-	b	.L737
-.LVL834:
-.L827:
-.LBE1823:
-.LBE1832:
-	.loc 1 1198 0 is_stmt 1
+.LVL874:
+	b	.L827
+.LVL875:
+.L917:
+.LBE1827:
+.LBE1836:
+	.loc 1 1427 0 is_stmt 1
 	mov	x0, x20
 	bl	ebc_power_set.constprop.12
-.LVL835:
-	b	.L723
-.LVL836:
-.L826:
-.LBB1833:
-.LBB1827:
-.LBB1828:
-	.loc 1 1161 0 discriminator 1
+.LVL876:
+	b	.L813
+.LVL877:
+.L916:
+.LBB1837:
+.LBB1831:
+.LBB1832:
+	.loc 1 1390 0 discriminator 1
 	add	x26, x21, 352
-.LVL837:
-.LBE1828:
+.LVL878:
+.LBE1832:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL838:
-	b	.L686
+.LVL879:
+	b	.L776
 	.p2align 3
-.L829:
-.LVL839:
-.LBB1829:
-	.loc 1 1161 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L683
-	.loc 1 1161 0 discriminator 7
+.L919:
+.LVL880:
+.LBB1833:
+	.loc 1 1390 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L773
+	.loc 1 1390 0 discriminator 7
 	bl	schedule
-.LVL840:
-.L686:
-	.loc 1 1161 0 discriminator 9
+.LVL881:
+.L776:
+	.loc 1 1390 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x26
 	bl	prepare_to_wait_event
-.LVL841:
+.LVL882:
 	ldr	w1, [x24, 76]
-	cbz	w1, .L829
-.LBE1829:
-	.loc 1 1161 0 discriminator 4
+	cbz	w1, .L919
+.LBE1833:
+	.loc 1 1390 0 discriminator 4
 	mov	x0, x26
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL842:
-	b	.L683
-.LVL843:
-.L817:
-.LBE1827:
-.LBE1833:
-	.loc 1 1187 0 is_stmt 1
+.LVL883:
+	b	.L773
+.LVL884:
+.L907:
+.LBE1831:
+.LBE1837:
+	.loc 1 1416 0 is_stmt 1
 	ldrsw	x2, [x24, 20]
 	ldp	x1, x0, [x24, 136]
 	bl	memcpy
-.LVL844:
+.LVL885:
 	ldr	x0, [x24, 208]
-	b	.L697
-.LVL845:
-.L799:
-.LBB1834:
-.LBB1835:
+	b	.L787
+.LVL886:
+.L889:
+.LBB1838:
+.LBB1839:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
-.LVL846:
-	b	.L670
-.LVL847:
-.L807:
-.LBE1835:
-.LBE1834:
-	.loc 1 1234 0
+.LVL887:
+	b	.L760
+.LVL888:
+.L897:
+.LBE1839:
+.LBE1838:
+	.loc 1 1463 0
 	ldr	x0, [x24, 88]
-	adrp	x1, .LC83
-	add	x1, x1, :lo12:.LC83
+	adrp	x1, .LC84
+	add	x1, x1, :lo12:.LC84
 	bl	_dev_err
-.LVL848:
-	.loc 1 1235 0
-	b	.L702
-.L806:
-	.loc 1 1232 0
+.LVL889:
+	.loc 1 1464 0
+	b	.L792
+.L896:
+	.loc 1 1461 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.12
-.LVL849:
-	b	.L726
-.L816:
-	.loc 1 1145 0
+.LVL890:
+	b	.L816
+.L906:
+	.loc 1 1374 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.12
-.LVL850:
-	b	.L678
-.LVL851:
-.L800:
-	.loc 1 1389 0
+.LVL891:
+	b	.L768
+.LVL892:
+.L890:
+	.loc 1 1618 0
 	bl	__stack_chk_fail
-.LVL852:
+.LVL893:
 	.cfi_endproc
-.LFE2825:
+.LFE2826:
 	.size	ebc_thread, .-ebc_thread
 	.data
 	.align	3
@@ -9207,7 +9898,7 @@ ebc_driver:
 	.xword	ebc_probe
 	.xword	ebc_remove
 	.zero	24
-	.xword	.LC90
+	.xword	.LC91
 	.zero	32
 	.xword	ebc_match
 	.zero	64
@@ -9219,7 +9910,7 @@ ebc_driver:
 ebc_misc:
 	.word	243
 	.zero	4
-	.xword	.LC43
+	.xword	.LC44
 	.xword	ebc_ops
 	.zero	56
 	.type	ebc_thread_wq, %object
@@ -9253,7 +9944,7 @@ ebc_auto_thread_sem:
 	.type	dev_attr_waveform_version, %object
 	.size	dev_attr_waveform_version, 32
 dev_attr_waveform_version:
-	.xword	.LC97
+	.xword	.LC98
 	.hword	292
 	.zero	6
 	.xword	waveform_version_read
@@ -9261,7 +9952,7 @@ dev_attr_waveform_version:
 	.type	dev_attr_pmic_name, %object
 	.size	dev_attr_pmic_name, 32
 dev_attr_pmic_name:
-	.xword	.LC96
+	.xword	.LC97
 	.hword	292
 	.zero	6
 	.xword	pmic_name_read
@@ -9269,7 +9960,7 @@ dev_attr_pmic_name:
 	.type	dev_attr_pmic_temp, %object
 	.size	dev_attr_pmic_temp, 32
 dev_attr_pmic_temp:
-	.xword	.LC95
+	.xword	.LC96
 	.hword	292
 	.zero	6
 	.xword	pmic_temp_read
@@ -9277,7 +9968,7 @@ dev_attr_pmic_temp:
 	.type	dev_attr_pmic_vcom, %object
 	.size	dev_attr_pmic_vcom, 32
 dev_attr_pmic_vcom:
-	.xword	.LC94
+	.xword	.LC95
 	.hword	420
 	.zero	6
 	.xword	pmic_vcom_read
@@ -9285,7 +9976,7 @@ dev_attr_pmic_vcom:
 	.type	dev_attr_ebc_version, %object
 	.size	dev_attr_ebc_version, 32
 dev_attr_ebc_version:
-	.xword	.LC93
+	.xword	.LC94
 	.hword	292
 	.zero	6
 	.xword	ebc_version_read
@@ -9293,7 +9984,7 @@ dev_attr_ebc_version:
 	.type	dev_attr_ebc_state, %object
 	.size	dev_attr_ebc_state, 32
 dev_attr_ebc_state:
-	.xword	.LC92
+	.xword	.LC93
 	.hword	292
 	.zero	6
 	.xword	ebc_state_read
@@ -9301,7 +9992,7 @@ dev_attr_ebc_state:
 	.type	dev_attr_ebc_buf_state, %object
 	.size	dev_attr_ebc_buf_state, 32
 dev_attr_ebc_buf_state:
-	.xword	.LC91
+	.xword	.LC92
 	.hword	292
 	.zero	6
 	.xword	ebc_buf_state_read
@@ -9330,24 +10021,24 @@ ebc_auto_task:
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.34939, %object
-	.size	__func__.34939, 11
-__func__.34939:
+	.type	__func__.34971, %object
+	.size	__func__.34971, 11
+__func__.34971:
 	.string	"ebc_io_ctl"
 	.align	3
 	.set	.LANCHOR3,. + 0
-	.type	__func__.34742, %object
-	.size	__func__.34742, 16
-__func__.34742:
+	.type	__func__.34773, %object
+	.size	__func__.34773, 16
+__func__.34773:
 	.string	"ebc_frame_start"
-	.type	__func__.35230, %object
-	.size	__func__.35230, 12
-__func__.35230:
+	.type	__func__.35262, %object
+	.size	__func__.35262, 12
+__func__.35262:
 	.string	"ebc_suspend"
 	.zero	4
-	.type	__func__.35171, %object
-	.size	__func__.35171, 19
-__func__.35171:
+	.type	__func__.35203, %object
+	.size	__func__.35203, 19
+__func__.35203:
 	.string	"ebc_lut_table_init"
 	.zero	5
 	.type	ebc_match, %object
@@ -9378,9 +10069,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init2270, %object
-	.size	__addressable_ebc_init2270, 8
-__addressable_ebc_init2270:
+	.type	__addressable_ebc_init2499, %object
+	.size	__addressable_ebc_init2499, 8
+__addressable_ebc_init2499:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -9438,7 +10129,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC16:
-	.string	"2.06"
+	.string	"2.07"
 	.zero	3
 .LC17:
 	.string	"%s\n"
@@ -9450,228 +10141,231 @@ __exitcall_ebc_exit:
 	.string	"set vcom value failed\n"
 	.zero	1
 .LC20:
-	.string	"%s: no need to update\n"
+	.string	"%s: overlay no need to update\n"
 	.zero	1
 .LC21:
+	.string	"%s: auto no need to update\n"
+	.zero	4
+.LC22:
 	.string	"ebc hw power off\n"
 	.zero	6
-.LC22:
+.LC23:
 	.string	"%s: device is busy now...\n"
 	.zero	5
-.LC23:
-	.string	"device suspend\n"
 .LC24:
+	.string	"device suspend\n"
+.LC25:
 	.string	"ebc_tcon"
 	.zero	7
-.LC25:
+.LC26:
 	.string	"not find ebc tcon\n"
 	.zero	5
-.LC26:
+.LC27:
 	.string	"pmic"
 	.zero	3
-.LC27:
+.LC28:
 	.string	"not find pmic node\n"
 	.zero	4
-.LC28:
+.LC29:
 	.string	"not find pmic i2c client\n"
 	.zero	6
-.LC29:
+.LC30:
 	.string	"get drvdata from pmic client failed\n"
 	.zero	3
-.LC30:
+.LC31:
 	.string	"panel,width"
 	.zero	4
-.LC31:
+.LC32:
 	.string	"panel,panel_color"
 	.zero	6
-.LC32:
+.LC33:
 	.string	"panel,mirror"
 	.zero	3
-.LC33:
+.LC34:
 	.string	"panel,width-mm"
 	.zero	1
-.LC34:
-	.string	"panel,height-mm"
 .LC35:
+	.string	"panel,height-mm"
+.LC36:
 	.string	"memory-region"
 	.zero	2
-.LC36:
+.LC37:
 	.string	"Couldn't address to resource for reserved memory\n"
 	.zero	6
-.LC37:
-	.string	"waveform-region"
 .LC38:
-	.string	"%s:%d: failed to get mem from reserved\n"
+	.string	"waveform-region"
 .LC39:
+	.string	"%s:%d: failed to get mem from reserved\n"
+.LC40:
 	.string	"Failed to read waveform from mem, we use waveform file from kernel file instead\n"
 	.zero	7
-.LC40:
+.LC41:
 	.string	"Failed to read waveform file from kernel, no waveform!!!\n"
 	.zero	6
-.LC41:
+.LC42:
 	.string	"failed to create ebc_task thread\n"
 	.zero	6
-.LC42:
+.LC43:
 	.string	"ebc_thread"
 	.zero	5
-.LC43:
+.LC44:
 	.string	"ebc"
 	.zero	4
-.LC44:
+.LC45:
 	.string	"ulogo_addr="
 	.zero	4
-.LC45:
+.LC46:
 	.string	"klogo_addr="
 	.zero	4
-.LC46:
-	.string	"ulogo_addr=0x%x"
 .LC47:
+	.string	"ulogo_addr=0x%x"
+.LC48:
 	.string	"have ulogo display, ulogo addr = 0x%x\n"
 	.zero	1
-.LC48:
+.LC49:
 	.string	"malloc ulogo buffer failed\n"
 	.zero	4
-.LC49:
-	.string	"klogo_addr=0x%x"
 .LC50:
+	.string	"klogo_addr=0x%x"
+.LC51:
 	.string	"need show klogo, klogo addr = 0x%x\n"
 	.zero	4
-.LC51:
+.LC52:
 	.string	"malloc klogo buffer failed\n"
 	.zero	4
-.LC52:
+.LC53:
 	.string	"no uboot logo, panel init\n"
 	.zero	5
-.LC53:
+.LC54:
 	.string	"rockchip ebc driver %s probe success\n"
 	.zero	2
-.LC54:
+.LC55:
 	.string	"panel,height"
 	.zero	3
-.LC55:
-	.string	"panel,vir_width"
 .LC56:
+	.string	"panel,vir_width"
+.LC57:
 	.string	"panel,vir_height"
 	.zero	7
-.LC57:
+.LC58:
 	.string	"panel,sdck"
 	.zero	5
-.LC58:
+.LC59:
 	.string	"panel,lsl"
 	.zero	6
-.LC59:
+.LC60:
 	.string	"panel,lbl"
 	.zero	6
-.LC60:
+.LC61:
 	.string	"panel,ldl"
 	.zero	6
-.LC61:
+.LC62:
 	.string	"panel,lel"
 	.zero	6
-.LC62:
+.LC63:
 	.string	"panel,gdck-sta"
 	.zero	1
-.LC63:
+.LC64:
 	.string	"panel,lgonl"
 	.zero	4
-.LC64:
+.LC65:
 	.string	"panel,fsl"
 	.zero	6
-.LC65:
+.LC66:
 	.string	"panel,fbl"
 	.zero	6
-.LC66:
+.LC67:
 	.string	"panel,fdl"
 	.zero	6
-.LC67:
+.LC68:
 	.string	"panel,fel"
 	.zero	6
-.LC68:
+.LC69:
 	.string	"panel,panel_16bit"
 	.zero	6
-.LC69:
+.LC70:
 	.string	"buffer manage init failed\n"
 	.zero	5
-.LC70:
+.LC71:
 	.string	"lut table init failed\n"
 	.zero	1
-.LC71:
+.LC72:
 	.string	"ebc_task"
 	.zero	7
-.LC72:
+.LC73:
 	.string	"failed to run ebc thread\n"
 	.zero	6
-.LC73:
+.LC74:
 	.string	"task init failed\n"
 	.zero	6
-.LC74:
+.LC75:
 	.string	"failed to probe panel: %d\n"
 	.zero	5
-.LC75:
+.LC76:
 	.string	"ebc hw power on\n"
 	.zero	7
-.LC76:
+.LC77:
 	.string	"early resume\n"
 	.zero	2
-.LC77:
+.LC78:
 	.string	"overlay mode start, update background, frame_total=%d\n"
 	.zero	1
-.LC78:
+.LC79:
 	.string	"change display mode from %d to %d\n"
 	.zero	5
-.LC79:
+.LC80:
 	.string	"ebc is busy now, waiting prev refresh mode end...\n"
 	.zero	5
-.LC80:
+.LC81:
 	.string	"prev refresh mode end\n"
 	.zero	1
-.LC81:
+.LC82:
 	.string	"overlay disabled, drop EPD_OVERLAY frame\n"
 	.zero	6
-.LC82:
+.LC83:
 	.string	"overlay mode start, frame_total=%d\n"
 	.zero	4
-.LC83:
+.LC84:
 	.string	"ebc_lut_update err\n"
 	.zero	4
-.LC84:
+.LC85:
 	.string	"auto mode start, frame_total=%d\n"
 	.zero	7
-.LC85:
+.LC86:
 	.string	"frame start, mode = %d, framecount = %d\n"
 	.zero	7
-.LC86:
-	.string	"ebc buffer mode error!\n"
 .LC87:
+	.string	"ebc buffer mode error!\n"
+.LC88:
 	.string	"power off\n"
 	.zero	5
-.LC88:
+.LC89:
 	.string	"early suspend\n"
 	.zero	1
-.LC89:
+.LC90:
 	.string	"check_part_mode==0, no need refresh\n"
 	.zero	3
-.LC90:
-	.string	"ebc-dev"
 .LC91:
+	.string	"ebc-dev"
+.LC92:
 	.string	"ebc_buf_state"
 	.zero	2
-.LC92:
+.LC93:
 	.string	"ebc_state"
 	.zero	6
-.LC93:
+.LC94:
 	.string	"ebc_version"
 	.zero	4
-.LC94:
+.LC95:
 	.string	"pmic_vcom"
 	.zero	6
-.LC95:
+.LC96:
 	.string	"pmic_temp"
 	.zero	6
-.LC96:
+.LC97:
 	.string	"pmic_name"
 	.zero	6
-.LC97:
+.LC98:
 	.string	"waveform_version"
 	.text
 .Letext0:
@@ -9871,15 +10565,15 @@ __exitcall_ebc_exit:
 	.file 212 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x14306
+	.4byte	0x144d0
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF3285
-	.byte	0x1
 	.4byte	.LASF3286
+	.byte	0x1
 	.4byte	.LASF3287
+	.4byte	.LASF3288
 	.4byte	.Ldebug_ranges0+0x1260
 	.8byte	0
 	.4byte	.Ldebug_line0
@@ -37490,7 +38184,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3006
 	.byte	0x1
-	.2byte	0x6b3
+	.2byte	0x798
 	.4byte	0x7b4
 	.uleb128 0x9
 	.byte	0x3
@@ -37498,7 +38192,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3007
 	.byte	0x1
-	.2byte	0x6bd
+	.2byte	0x7a2
 	.4byte	0xc5f5
 	.uleb128 0x9
 	.byte	0x3
@@ -37506,7 +38200,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3008
 	.byte	0x1
-	.2byte	0x6cc
+	.2byte	0x7b1
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
@@ -37514,7 +38208,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3009
 	.byte	0x1
-	.2byte	0x6d7
+	.2byte	0x7bc
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
@@ -37522,7 +38216,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3010
 	.byte	0x1
-	.2byte	0x6e5
+	.2byte	0x7ca
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
@@ -37530,7 +38224,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3011
 	.byte	0x1
-	.2byte	0x708
+	.2byte	0x7ed
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
@@ -37538,7 +38232,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3012
 	.byte	0x1
-	.2byte	0x712
+	.2byte	0x7f7
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
@@ -37546,7 +38240,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3013
 	.byte	0x1
-	.2byte	0x71b
+	.2byte	0x800
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
@@ -37554,7 +38248,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3014
 	.byte	0x1
-	.2byte	0x724
+	.2byte	0x809
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
@@ -37562,7 +38256,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3015
 	.byte	0x1
-	.2byte	0x8bf
+	.2byte	0x9a4
 	.4byte	0xa547
 	.uleb128 0x9
 	.byte	0x3
@@ -37579,7 +38273,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3016
 	.byte	0x1
-	.2byte	0x8c4
+	.2byte	0x9a9
 	.4byte	0xe5ed
 	.uleb128 0x9
 	.byte	0x3
@@ -37587,7 +38281,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3017
 	.byte	0x1
-	.2byte	0x8ca
+	.2byte	0x9af
 	.4byte	0xd683
 	.uleb128 0x9
 	.byte	0x3
@@ -37595,15 +38289,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3018
 	.byte	0x1
-	.2byte	0x8de
+	.2byte	0x9c3
 	.4byte	0x443
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init2270
+	.8byte	__addressable_ebc_init2499
 	.uleb128 0x4c
 	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x8df
+	.2byte	0x9c4
 	.4byte	0x497
 	.uleb128 0x9
 	.byte	0x3
@@ -37611,79 +38305,79 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0x8d9
-	.8byte	.LFB2852
-	.8byte	.LFE2852-.LFB2852
+	.2byte	0x9be
+	.8byte	.LFB2853
+	.8byte	.LFE2853-.LFB2853
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe676
 	.uleb128 0x4e
-	.8byte	.LVL34
-	.4byte	0x13ffe
+	.8byte	.LVL64
+	.4byte	0x141d4
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x8d4
+	.2byte	0x9b9
 	.4byte	0xc6
-	.8byte	.LFB2851
-	.8byte	.LFE2851-.LFB2851
+	.8byte	.LFB2852
+	.8byte	.LFE2852-.LFB2852
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe6a6
 	.uleb128 0x4e
-	.8byte	.LVL322
-	.4byte	0x1400a
+	.8byte	.LVL352
+	.4byte	0x141e0
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3021
 	.byte	0x1
-	.2byte	0x8b3
+	.2byte	0x998
 	.4byte	0xc6
-	.8byte	.LFB2850
-	.8byte	.LFE2850-.LFB2850
+	.8byte	.LFB2851
+	.8byte	.LFE2851-.LFB2851
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe742
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x8b3
+	.2byte	0x998
 	.4byte	0xa55b
-	.4byte	.LLST7
+	.4byte	.LLST11
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x8b5
+	.2byte	0x99a
 	.4byte	0xe47d
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x8b6
+	.2byte	0x99b
 	.4byte	0xe742
 	.uleb128 0x53
-	.4byte	0x133ef
-	.8byte	.LBB926
-	.8byte	.LBE926-.LBB926
+	.4byte	0x135c5
+	.8byte	.LBB928
+	.8byte	.LBE928-.LBB928
 	.byte	0x1
-	.2byte	0x8b5
+	.2byte	0x99a
 	.4byte	0xe712
 	.uleb128 0x54
-	.4byte	0x13400
+	.4byte	0x135d6
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12fe0
-	.8byte	.LBB928
-	.8byte	.LBE928-.LBB928
+	.4byte	0x131b6
+	.8byte	.LBB930
+	.8byte	.LBE930-.LBB930
 	.byte	0x1
-	.2byte	0x8b8
+	.2byte	0x99d
 	.4byte	0xe734
 	.uleb128 0x54
-	.4byte	0x12fec
+	.4byte	0x131c2
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL38
-	.4byte	0x14016
+	.8byte	.LVL68
+	.4byte	0x141ec
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -37691,82 +38385,82 @@ __exitcall_ebc_exit:
 	.uleb128 0x50
 	.4byte	.LASF3023
 	.byte	0x1
-	.2byte	0x8a2
+	.2byte	0x987
 	.4byte	0xc6
-	.8byte	.LFB2849
-	.8byte	.LFE2849-.LFB2849
+	.8byte	.LFB2850
+	.8byte	.LFE2850-.LFB2850
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe84f
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x8a2
+	.2byte	0x987
 	.4byte	0xa55b
-	.4byte	.LLST142
+	.4byte	.LLST146
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x8a4
+	.2byte	0x989
 	.4byte	0xe47d
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x8a5
+	.2byte	0x98a
 	.4byte	0xe742
 	.uleb128 0x55
 	.4byte	.LASF3024
 	.4byte	0xe85f
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35230
+	.8byte	__func__.35262
 	.uleb128 0x53
-	.4byte	0x133ef
-	.8byte	.LBB1408
-	.8byte	.LBE1408-.LBB1408
+	.4byte	0x135c5
+	.8byte	.LBB1412
+	.8byte	.LBE1412-.LBB1412
 	.byte	0x1
-	.2byte	0x8a4
+	.2byte	0x989
 	.4byte	0xe7c7
 	.uleb128 0x54
-	.4byte	0x13400
+	.4byte	0x135d6
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12ff8
-	.8byte	.LBB1410
-	.8byte	.LBE1410-.LBB1410
+	.4byte	0x131ce
+	.8byte	.LBB1414
+	.8byte	.LBE1414-.LBB1414
 	.byte	0x1
-	.2byte	0x8ad
+	.2byte	0x992
 	.4byte	0xe7e9
 	.uleb128 0x54
-	.4byte	0x13004
+	.4byte	0x131da
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12d46
-	.8byte	.LBB1412
-	.8byte	.LBE1412-.LBB1412
+	.4byte	0x12f1c
+	.8byte	.LBB1416
+	.8byte	.LBE1416-.LBB1416
 	.byte	0x1
-	.2byte	0x8a9
+	.2byte	0x98e
 	.4byte	0xe834
 	.uleb128 0x54
-	.4byte	0x12d61
+	.4byte	0x12f37
 	.uleb128 0x54
-	.4byte	0x12d56
+	.4byte	0x12f2c
 	.uleb128 0x56
-	.8byte	.LBB1413
-	.8byte	.LBE1413-.LBB1413
+	.8byte	.LBB1417
+	.8byte	.LBE1417-.LBB1417
 	.uleb128 0x57
-	.4byte	0x12d6c
+	.4byte	0x12f42
 	.uleb128 0x4e
-	.8byte	.LVL476
-	.4byte	0x13e8e
+	.8byte	.LVL517
+	.4byte	0x14064
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL474
-	.4byte	0x14016
+	.8byte	.LVL515
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL475
-	.4byte	0x14016
+	.8byte	.LVL516
+	.4byte	0x141ec
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
@@ -37780,148 +38474,148 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3025
 	.byte	0x1
-	.2byte	0x89b
+	.2byte	0x980
 	.4byte	0xc6
-	.8byte	.LFB2848
-	.8byte	.LFE2848-.LFB2848
+	.8byte	.LFB2849
+	.8byte	.LFE2849-.LFB2849
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xe8a4
 	.uleb128 0x58
 	.4byte	.LASF3026
 	.byte	0x1
-	.2byte	0x89b
+	.2byte	0x980
 	.4byte	0xd6ff
-	.4byte	.LLST9
+	.4byte	.LLST13
 	.uleb128 0x4e
-	.8byte	.LVL44
-	.4byte	0x14023
+	.8byte	.LVL74
+	.4byte	0x141f9
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3027
 	.byte	0x1
-	.2byte	0x82e
+	.2byte	0x913
 	.4byte	0xc6
-	.8byte	.LFB2847
-	.8byte	.LFE2847-.LFB2847
+	.8byte	.LFB2848
+	.8byte	.LFE2848-.LFB2848
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xfc9e
 	.uleb128 0x58
 	.4byte	.LASF3026
 	.byte	0x1
-	.2byte	0x82e
+	.2byte	0x913
 	.4byte	0xd6ff
-	.4byte	.LLST143
+	.4byte	.LLST147
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x830
+	.2byte	0x915
 	.4byte	0xa55b
 	.uleb128 0x46
 	.4byte	.LASF3028
 	.byte	0x1
-	.2byte	0x831
+	.2byte	0x916
 	.4byte	0xb87f
 	.uleb128 0x59
 	.4byte	.LASF3029
 	.byte	0x1
-	.2byte	0x832
+	.2byte	0x917
 	.4byte	0xd6ff
-	.4byte	.LLST144
+	.4byte	.LLST148
 	.uleb128 0x46
 	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0x833
+	.2byte	0x918
 	.4byte	0xb87f
 	.uleb128 0x59
 	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0x834
+	.2byte	0x919
 	.4byte	0xc028
-	.4byte	.LLST145
+	.4byte	.LLST149
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x835
+	.2byte	0x91a
 	.4byte	0xe47d
 	.uleb128 0x59
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x836
+	.2byte	0x91b
 	.4byte	0xe742
-	.4byte	.LLST146
+	.4byte	.LLST150
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x837
+	.2byte	0x91c
 	.4byte	0xe13f
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x838
+	.2byte	0x91d
 	.4byte	0xc6
 	.uleb128 0x5a
-	.4byte	0x1340d
-	.8byte	.LBB1559
+	.4byte	0x135e3
+	.8byte	.LBB1563
 	.4byte	.Ldebug_ranges0+0xc00
 	.byte	0x1
-	.2byte	0x83a
+	.2byte	0x91f
 	.4byte	0xe983
 	.uleb128 0x54
-	.4byte	0x13436
+	.4byte	0x1360c
 	.uleb128 0x54
-	.4byte	0x1342a
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x1341e
+	.4byte	0x135f4
 	.uleb128 0x4e
-	.8byte	.LVL479
-	.4byte	0x1402f
+	.8byte	.LVL520
+	.4byte	0x14205
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132ea
-	.8byte	.LBB1563
-	.8byte	.LBE1563-.LBB1563
+	.4byte	0x134c0
+	.8byte	.LBB1567
+	.8byte	.LBE1567-.LBB1567
 	.byte	0x1
-	.2byte	0x84c
+	.2byte	0x931
 	.4byte	0xe9c2
 	.uleb128 0x54
-	.4byte	0x132fa
+	.4byte	0x134d0
 	.uleb128 0x5b
-	.4byte	0x133ef
-	.8byte	.LBB1564
-	.8byte	.LBE1564-.LBB1564
+	.4byte	0x135c5
+	.8byte	.LBB1568
+	.8byte	.LBE1568-.LBB1568
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x54
-	.4byte	0x13400
+	.4byte	0x135d6
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1330c
-	.8byte	.LBB1566
-	.8byte	.LBE1566-.LBB1566
+	.4byte	0x134e2
+	.8byte	.LBB1570
+	.8byte	.LBE1570-.LBB1570
 	.byte	0x1
-	.2byte	0x85d
+	.2byte	0x942
 	.4byte	0xea02
 	.uleb128 0x54
-	.4byte	0x1331d
+	.4byte	0x134f3
 	.uleb128 0x5c
-	.4byte	0x133ef
-	.8byte	.LBB1567
-	.8byte	.LBE1567-.LBB1567
+	.4byte	0x135c5
+	.8byte	.LBB1571
+	.8byte	.LBE1571-.LBB1571
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x54
-	.4byte	0x13400
+	.4byte	0x135d6
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
 	.4byte	0x1162f
-	.8byte	.LBB1569
+	.8byte	.LBB1573
 	.4byte	.Ldebug_ranges0+0xc30
 	.byte	0x1
-	.2byte	0x86b
+	.2byte	0x950
 	.4byte	0xf3bb
 	.uleb128 0x54
 	.4byte	0x11640
@@ -37930,768 +38624,768 @@ __exitcall_ebc_exit:
 	.uleb128 0x57
 	.4byte	0x1164c
 	.uleb128 0x5a
-	.4byte	0x13330
-	.8byte	.LBB1571
+	.4byte	0x13506
+	.8byte	.LBB1575
 	.4byte	.Ldebug_ranges0+0xc90
 	.byte	0x1
-	.2byte	0x595
+	.2byte	0x67a
 	.4byte	0xea92
 	.uleb128 0x54
-	.4byte	0x13358
+	.4byte	0x1352e
 	.uleb128 0x54
-	.4byte	0x1334c
+	.4byte	0x13522
 	.uleb128 0x54
-	.4byte	0x13341
+	.4byte	0x13517
 	.uleb128 0x5e
-	.4byte	0x13365
-	.8byte	.LBB1572
+	.4byte	0x1353b
+	.8byte	.LBB1576
 	.4byte	.Ldebug_ranges0+0xc90
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13399
+	.4byte	0x1356f
 	.uleb128 0x54
-	.4byte	0x1338d
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x13381
+	.4byte	0x13557
 	.uleb128 0x54
-	.4byte	0x13376
+	.4byte	0x1354c
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xc90
 	.uleb128 0x57
-	.4byte	0x133a4
+	.4byte	0x1357a
 	.uleb128 0x4e
-	.8byte	.LVL487
-	.4byte	0x1403c
+	.8byte	.LVL528
+	.4byte	0x14212
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13330
-	.8byte	.LBB1583
-	.8byte	.LBE1583-.LBB1583
+	.4byte	0x13506
+	.8byte	.LBB1587
+	.8byte	.LBE1587-.LBB1587
 	.byte	0x1
-	.2byte	0x598
+	.2byte	0x67d
 	.4byte	0xeb0f
 	.uleb128 0x54
-	.4byte	0x13358
+	.4byte	0x1352e
 	.uleb128 0x54
-	.4byte	0x1334c
+	.4byte	0x13522
 	.uleb128 0x54
-	.4byte	0x13341
+	.4byte	0x13517
 	.uleb128 0x5c
-	.4byte	0x13365
-	.8byte	.LBB1584
-	.8byte	.LBE1584-.LBB1584
+	.4byte	0x1353b
+	.8byte	.LBB1588
+	.8byte	.LBE1588-.LBB1588
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13399
+	.4byte	0x1356f
 	.uleb128 0x54
-	.4byte	0x1338d
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x13381
+	.4byte	0x13557
 	.uleb128 0x54
-	.4byte	0x13376
+	.4byte	0x1354c
 	.uleb128 0x56
-	.8byte	.LBB1585
-	.8byte	.LBE1585-.LBB1585
+	.8byte	.LBB1589
+	.8byte	.LBE1589-.LBB1589
 	.uleb128 0x57
-	.4byte	0x133a4
+	.4byte	0x1357a
 	.uleb128 0x4e
-	.8byte	.LVL488
-	.4byte	0x1403c
+	.8byte	.LVL529
+	.4byte	0x14212
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13330
-	.8byte	.LBB1586
-	.8byte	.LBE1586-.LBB1586
+	.4byte	0x13506
+	.8byte	.LBB1590
+	.8byte	.LBE1590-.LBB1590
 	.byte	0x1
-	.2byte	0x59b
+	.2byte	0x680
 	.4byte	0xeb8c
 	.uleb128 0x54
-	.4byte	0x13358
+	.4byte	0x1352e
 	.uleb128 0x54
-	.4byte	0x1334c
+	.4byte	0x13522
 	.uleb128 0x54
-	.4byte	0x13341
+	.4byte	0x13517
 	.uleb128 0x5c
-	.4byte	0x13365
-	.8byte	.LBB1587
-	.8byte	.LBE1587-.LBB1587
+	.4byte	0x1353b
+	.8byte	.LBB1591
+	.8byte	.LBE1591-.LBB1591
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13399
+	.4byte	0x1356f
 	.uleb128 0x54
-	.4byte	0x1338d
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x13381
+	.4byte	0x13557
 	.uleb128 0x54
-	.4byte	0x13376
+	.4byte	0x1354c
 	.uleb128 0x56
-	.8byte	.LBB1588
-	.8byte	.LBE1588-.LBB1588
+	.8byte	.LBB1592
+	.8byte	.LBE1592-.LBB1592
 	.uleb128 0x57
-	.4byte	0x133a4
+	.4byte	0x1357a
 	.uleb128 0x4e
-	.8byte	.LVL489
-	.4byte	0x1403c
+	.8byte	.LVL530
+	.4byte	0x14212
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13330
-	.8byte	.LBB1589
-	.8byte	.LBE1589-.LBB1589
+	.4byte	0x13506
+	.8byte	.LBB1593
+	.8byte	.LBE1593-.LBB1593
 	.byte	0x1
-	.2byte	0x59e
+	.2byte	0x683
 	.4byte	0xec09
 	.uleb128 0x54
-	.4byte	0x13358
+	.4byte	0x1352e
 	.uleb128 0x54
-	.4byte	0x1334c
+	.4byte	0x13522
 	.uleb128 0x54
-	.4byte	0x13341
+	.4byte	0x13517
 	.uleb128 0x5c
-	.4byte	0x13365
-	.8byte	.LBB1590
-	.8byte	.LBE1590-.LBB1590
+	.4byte	0x1353b
+	.8byte	.LBB1594
+	.8byte	.LBE1594-.LBB1594
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13399
+	.4byte	0x1356f
 	.uleb128 0x54
-	.4byte	0x1338d
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x13381
+	.4byte	0x13557
 	.uleb128 0x54
-	.4byte	0x13376
+	.4byte	0x1354c
 	.uleb128 0x56
-	.8byte	.LBB1591
-	.8byte	.LBE1591-.LBB1591
+	.8byte	.LBB1595
+	.8byte	.LBE1595-.LBB1595
 	.uleb128 0x57
-	.4byte	0x133a4
+	.4byte	0x1357a
 	.uleb128 0x4e
-	.8byte	.LVL490
-	.4byte	0x1403c
+	.8byte	.LVL531
+	.4byte	0x14212
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13330
-	.8byte	.LBB1592
-	.8byte	.LBE1592-.LBB1592
+	.4byte	0x13506
+	.8byte	.LBB1596
+	.8byte	.LBE1596-.LBB1596
 	.byte	0x1
-	.2byte	0x5a1
+	.2byte	0x686
 	.4byte	0xec86
 	.uleb128 0x54
-	.4byte	0x13358
+	.4byte	0x1352e
 	.uleb128 0x54
-	.4byte	0x1334c
+	.4byte	0x13522
 	.uleb128 0x54
-	.4byte	0x13341
+	.4byte	0x13517
 	.uleb128 0x5c
-	.4byte	0x13365
-	.8byte	.LBB1593
-	.8byte	.LBE1593-.LBB1593
+	.4byte	0x1353b
+	.8byte	.LBB1597
+	.8byte	.LBE1597-.LBB1597
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13399
+	.4byte	0x1356f
 	.uleb128 0x54
-	.4byte	0x1338d
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x13381
+	.4byte	0x13557
 	.uleb128 0x54
-	.4byte	0x13376
+	.4byte	0x1354c
 	.uleb128 0x56
-	.8byte	.LBB1594
-	.8byte	.LBE1594-.LBB1594
+	.8byte	.LBB1598
+	.8byte	.LBE1598-.LBB1598
 	.uleb128 0x57
-	.4byte	0x133a4
+	.4byte	0x1357a
 	.uleb128 0x4e
-	.8byte	.LVL491
-	.4byte	0x1403c
+	.8byte	.LVL532
+	.4byte	0x14212
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13330
-	.8byte	.LBB1595
-	.8byte	.LBE1595-.LBB1595
+	.4byte	0x13506
+	.8byte	.LBB1599
+	.8byte	.LBE1599-.LBB1599
 	.byte	0x1
-	.2byte	0x5a4
+	.2byte	0x689
 	.4byte	0xed03
 	.uleb128 0x54
-	.4byte	0x13358
+	.4byte	0x1352e
 	.uleb128 0x54
-	.4byte	0x1334c
+	.4byte	0x13522
 	.uleb128 0x54
-	.4byte	0x13341
+	.4byte	0x13517
 	.uleb128 0x5c
-	.4byte	0x13365
-	.8byte	.LBB1596
-	.8byte	.LBE1596-.LBB1596
+	.4byte	0x1353b
+	.8byte	.LBB1600
+	.8byte	.LBE1600-.LBB1600
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13399
+	.4byte	0x1356f
 	.uleb128 0x54
-	.4byte	0x1338d
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x13381
+	.4byte	0x13557
 	.uleb128 0x54
-	.4byte	0x13376
+	.4byte	0x1354c
 	.uleb128 0x56
-	.8byte	.LBB1597
-	.8byte	.LBE1597-.LBB1597
+	.8byte	.LBB1601
+	.8byte	.LBE1601-.LBB1601
 	.uleb128 0x57
-	.4byte	0x133a4
+	.4byte	0x1357a
 	.uleb128 0x4e
-	.8byte	.LVL492
-	.4byte	0x1403c
+	.8byte	.LVL533
+	.4byte	0x14212
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13330
-	.8byte	.LBB1598
-	.8byte	.LBE1598-.LBB1598
+	.4byte	0x13506
+	.8byte	.LBB1602
+	.8byte	.LBE1602-.LBB1602
 	.byte	0x1
-	.2byte	0x5a7
+	.2byte	0x68c
 	.4byte	0xed80
 	.uleb128 0x54
-	.4byte	0x13358
+	.4byte	0x1352e
 	.uleb128 0x54
-	.4byte	0x1334c
+	.4byte	0x13522
 	.uleb128 0x54
-	.4byte	0x13341
+	.4byte	0x13517
 	.uleb128 0x5c
-	.4byte	0x13365
-	.8byte	.LBB1599
-	.8byte	.LBE1599-.LBB1599
+	.4byte	0x1353b
+	.8byte	.LBB1603
+	.8byte	.LBE1603-.LBB1603
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13399
+	.4byte	0x1356f
 	.uleb128 0x54
-	.4byte	0x1338d
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x13381
+	.4byte	0x13557
 	.uleb128 0x54
-	.4byte	0x13376
+	.4byte	0x1354c
 	.uleb128 0x56
-	.8byte	.LBB1600
-	.8byte	.LBE1600-.LBB1600
+	.8byte	.LBB1604
+	.8byte	.LBE1604-.LBB1604
 	.uleb128 0x57
-	.4byte	0x133a4
+	.4byte	0x1357a
 	.uleb128 0x4e
-	.8byte	.LVL493
-	.4byte	0x1403c
+	.8byte	.LVL534
+	.4byte	0x14212
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13330
-	.8byte	.LBB1601
-	.8byte	.LBE1601-.LBB1601
+	.4byte	0x13506
+	.8byte	.LBB1605
+	.8byte	.LBE1605-.LBB1605
 	.byte	0x1
-	.2byte	0x5aa
+	.2byte	0x68f
 	.4byte	0xedfd
 	.uleb128 0x54
-	.4byte	0x13358
+	.4byte	0x1352e
 	.uleb128 0x54
-	.4byte	0x1334c
+	.4byte	0x13522
 	.uleb128 0x54
-	.4byte	0x13341
+	.4byte	0x13517
 	.uleb128 0x5c
-	.4byte	0x13365
-	.8byte	.LBB1602
-	.8byte	.LBE1602-.LBB1602
+	.4byte	0x1353b
+	.8byte	.LBB1606
+	.8byte	.LBE1606-.LBB1606
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13399
+	.4byte	0x1356f
 	.uleb128 0x54
-	.4byte	0x1338d
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x13381
+	.4byte	0x13557
 	.uleb128 0x54
-	.4byte	0x13376
+	.4byte	0x1354c
 	.uleb128 0x56
-	.8byte	.LBB1603
-	.8byte	.LBE1603-.LBB1603
+	.8byte	.LBB1607
+	.8byte	.LBE1607-.LBB1607
 	.uleb128 0x57
-	.4byte	0x133a4
+	.4byte	0x1357a
 	.uleb128 0x4e
-	.8byte	.LVL494
-	.4byte	0x1403c
+	.8byte	.LVL535
+	.4byte	0x14212
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13330
-	.8byte	.LBB1604
-	.8byte	.LBE1604-.LBB1604
+	.4byte	0x13506
+	.8byte	.LBB1608
+	.8byte	.LBE1608-.LBB1608
 	.byte	0x1
-	.2byte	0x5ad
+	.2byte	0x692
 	.4byte	0xee7a
 	.uleb128 0x54
-	.4byte	0x13358
+	.4byte	0x1352e
 	.uleb128 0x54
-	.4byte	0x1334c
+	.4byte	0x13522
 	.uleb128 0x54
-	.4byte	0x13341
+	.4byte	0x13517
 	.uleb128 0x5c
-	.4byte	0x13365
-	.8byte	.LBB1605
-	.8byte	.LBE1605-.LBB1605
+	.4byte	0x1353b
+	.8byte	.LBB1609
+	.8byte	.LBE1609-.LBB1609
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13399
+	.4byte	0x1356f
 	.uleb128 0x54
-	.4byte	0x1338d
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x13381
+	.4byte	0x13557
 	.uleb128 0x54
-	.4byte	0x13376
+	.4byte	0x1354c
 	.uleb128 0x56
-	.8byte	.LBB1606
-	.8byte	.LBE1606-.LBB1606
+	.8byte	.LBB1610
+	.8byte	.LBE1610-.LBB1610
 	.uleb128 0x57
-	.4byte	0x133a4
+	.4byte	0x1357a
 	.uleb128 0x4e
-	.8byte	.LVL495
-	.4byte	0x1403c
+	.8byte	.LVL536
+	.4byte	0x14212
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13330
-	.8byte	.LBB1607
-	.8byte	.LBE1607-.LBB1607
+	.4byte	0x13506
+	.8byte	.LBB1611
+	.8byte	.LBE1611-.LBB1611
 	.byte	0x1
-	.2byte	0x5b0
+	.2byte	0x695
 	.4byte	0xeef7
 	.uleb128 0x54
-	.4byte	0x13358
+	.4byte	0x1352e
 	.uleb128 0x54
-	.4byte	0x1334c
+	.4byte	0x13522
 	.uleb128 0x54
-	.4byte	0x13341
+	.4byte	0x13517
 	.uleb128 0x5c
-	.4byte	0x13365
-	.8byte	.LBB1608
-	.8byte	.LBE1608-.LBB1608
+	.4byte	0x1353b
+	.8byte	.LBB1612
+	.8byte	.LBE1612-.LBB1612
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13399
+	.4byte	0x1356f
 	.uleb128 0x54
-	.4byte	0x1338d
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x13381
+	.4byte	0x13557
 	.uleb128 0x54
-	.4byte	0x13376
+	.4byte	0x1354c
 	.uleb128 0x56
-	.8byte	.LBB1609
-	.8byte	.LBE1609-.LBB1609
+	.8byte	.LBB1613
+	.8byte	.LBE1613-.LBB1613
 	.uleb128 0x57
-	.4byte	0x133a4
+	.4byte	0x1357a
 	.uleb128 0x4e
-	.8byte	.LVL496
-	.4byte	0x1403c
+	.8byte	.LVL537
+	.4byte	0x14212
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13330
-	.8byte	.LBB1610
-	.8byte	.LBE1610-.LBB1610
+	.4byte	0x13506
+	.8byte	.LBB1614
+	.8byte	.LBE1614-.LBB1614
 	.byte	0x1
-	.2byte	0x5b3
+	.2byte	0x698
 	.4byte	0xef74
 	.uleb128 0x54
-	.4byte	0x13358
+	.4byte	0x1352e
 	.uleb128 0x54
-	.4byte	0x1334c
+	.4byte	0x13522
 	.uleb128 0x54
-	.4byte	0x13341
+	.4byte	0x13517
 	.uleb128 0x5c
-	.4byte	0x13365
-	.8byte	.LBB1611
-	.8byte	.LBE1611-.LBB1611
+	.4byte	0x1353b
+	.8byte	.LBB1615
+	.8byte	.LBE1615-.LBB1615
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13399
+	.4byte	0x1356f
 	.uleb128 0x54
-	.4byte	0x1338d
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x13381
+	.4byte	0x13557
 	.uleb128 0x54
-	.4byte	0x13376
+	.4byte	0x1354c
 	.uleb128 0x56
-	.8byte	.LBB1612
-	.8byte	.LBE1612-.LBB1612
+	.8byte	.LBB1616
+	.8byte	.LBE1616-.LBB1616
 	.uleb128 0x57
-	.4byte	0x133a4
+	.4byte	0x1357a
 	.uleb128 0x4e
-	.8byte	.LVL497
-	.4byte	0x1403c
+	.8byte	.LVL538
+	.4byte	0x14212
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13330
-	.8byte	.LBB1613
-	.8byte	.LBE1613-.LBB1613
+	.4byte	0x13506
+	.8byte	.LBB1617
+	.8byte	.LBE1617-.LBB1617
 	.byte	0x1
-	.2byte	0x5b6
+	.2byte	0x69b
 	.4byte	0xeff1
 	.uleb128 0x54
-	.4byte	0x13358
+	.4byte	0x1352e
 	.uleb128 0x54
-	.4byte	0x1334c
+	.4byte	0x13522
 	.uleb128 0x54
-	.4byte	0x13341
+	.4byte	0x13517
 	.uleb128 0x5c
-	.4byte	0x13365
-	.8byte	.LBB1614
-	.8byte	.LBE1614-.LBB1614
+	.4byte	0x1353b
+	.8byte	.LBB1618
+	.8byte	.LBE1618-.LBB1618
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13399
+	.4byte	0x1356f
 	.uleb128 0x54
-	.4byte	0x1338d
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x13381
+	.4byte	0x13557
 	.uleb128 0x54
-	.4byte	0x13376
+	.4byte	0x1354c
 	.uleb128 0x56
-	.8byte	.LBB1615
-	.8byte	.LBE1615-.LBB1615
+	.8byte	.LBB1619
+	.8byte	.LBE1619-.LBB1619
 	.uleb128 0x57
-	.4byte	0x133a4
+	.4byte	0x1357a
 	.uleb128 0x4e
-	.8byte	.LVL498
-	.4byte	0x1403c
+	.8byte	.LVL539
+	.4byte	0x14212
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13330
-	.8byte	.LBB1616
-	.8byte	.LBE1616-.LBB1616
+	.4byte	0x13506
+	.8byte	.LBB1620
+	.8byte	.LBE1620-.LBB1620
 	.byte	0x1
-	.2byte	0x5b9
+	.2byte	0x69e
 	.4byte	0xf06e
 	.uleb128 0x54
-	.4byte	0x13358
+	.4byte	0x1352e
 	.uleb128 0x54
-	.4byte	0x1334c
+	.4byte	0x13522
 	.uleb128 0x54
-	.4byte	0x13341
+	.4byte	0x13517
 	.uleb128 0x5c
-	.4byte	0x13365
-	.8byte	.LBB1617
-	.8byte	.LBE1617-.LBB1617
+	.4byte	0x1353b
+	.8byte	.LBB1621
+	.8byte	.LBE1621-.LBB1621
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13399
+	.4byte	0x1356f
 	.uleb128 0x54
-	.4byte	0x1338d
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x13381
+	.4byte	0x13557
 	.uleb128 0x54
-	.4byte	0x13376
+	.4byte	0x1354c
 	.uleb128 0x56
-	.8byte	.LBB1618
-	.8byte	.LBE1618-.LBB1618
+	.8byte	.LBB1622
+	.8byte	.LBE1622-.LBB1622
 	.uleb128 0x57
-	.4byte	0x133a4
+	.4byte	0x1357a
 	.uleb128 0x4e
-	.8byte	.LVL499
-	.4byte	0x1403c
+	.8byte	.LVL540
+	.4byte	0x14212
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13330
-	.8byte	.LBB1619
-	.8byte	.LBE1619-.LBB1619
+	.4byte	0x13506
+	.8byte	.LBB1623
+	.8byte	.LBE1623-.LBB1623
 	.byte	0x1
-	.2byte	0x5bc
+	.2byte	0x6a1
 	.4byte	0xf0eb
 	.uleb128 0x54
-	.4byte	0x13358
+	.4byte	0x1352e
 	.uleb128 0x54
-	.4byte	0x1334c
+	.4byte	0x13522
 	.uleb128 0x54
-	.4byte	0x13341
+	.4byte	0x13517
 	.uleb128 0x5c
-	.4byte	0x13365
-	.8byte	.LBB1620
-	.8byte	.LBE1620-.LBB1620
+	.4byte	0x1353b
+	.8byte	.LBB1624
+	.8byte	.LBE1624-.LBB1624
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13399
+	.4byte	0x1356f
 	.uleb128 0x54
-	.4byte	0x1338d
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x13381
+	.4byte	0x13557
 	.uleb128 0x54
-	.4byte	0x13376
+	.4byte	0x1354c
 	.uleb128 0x56
-	.8byte	.LBB1621
-	.8byte	.LBE1621-.LBB1621
+	.8byte	.LBB1625
+	.8byte	.LBE1625-.LBB1625
 	.uleb128 0x57
-	.4byte	0x133a4
+	.4byte	0x1357a
 	.uleb128 0x4e
-	.8byte	.LVL500
-	.4byte	0x1403c
+	.8byte	.LVL541
+	.4byte	0x14212
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13330
-	.8byte	.LBB1622
-	.8byte	.LBE1622-.LBB1622
+	.4byte	0x13506
+	.8byte	.LBB1626
+	.8byte	.LBE1626-.LBB1626
 	.byte	0x1
-	.2byte	0x5bf
+	.2byte	0x6a4
 	.4byte	0xf168
 	.uleb128 0x54
-	.4byte	0x13358
+	.4byte	0x1352e
 	.uleb128 0x54
-	.4byte	0x1334c
+	.4byte	0x13522
 	.uleb128 0x54
-	.4byte	0x13341
+	.4byte	0x13517
 	.uleb128 0x5c
-	.4byte	0x13365
-	.8byte	.LBB1623
-	.8byte	.LBE1623-.LBB1623
+	.4byte	0x1353b
+	.8byte	.LBB1627
+	.8byte	.LBE1627-.LBB1627
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13399
+	.4byte	0x1356f
 	.uleb128 0x54
-	.4byte	0x1338d
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x13381
+	.4byte	0x13557
 	.uleb128 0x54
-	.4byte	0x13376
+	.4byte	0x1354c
 	.uleb128 0x56
-	.8byte	.LBB1624
-	.8byte	.LBE1624-.LBB1624
+	.8byte	.LBB1628
+	.8byte	.LBE1628-.LBB1628
 	.uleb128 0x57
-	.4byte	0x133a4
+	.4byte	0x1357a
 	.uleb128 0x4e
-	.8byte	.LVL501
-	.4byte	0x1403c
+	.8byte	.LVL542
+	.4byte	0x14212
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13330
-	.8byte	.LBB1625
-	.8byte	.LBE1625-.LBB1625
+	.4byte	0x13506
+	.8byte	.LBB1629
+	.8byte	.LBE1629-.LBB1629
 	.byte	0x1
-	.2byte	0x5c2
+	.2byte	0x6a7
 	.4byte	0xf1e5
 	.uleb128 0x54
-	.4byte	0x13358
+	.4byte	0x1352e
 	.uleb128 0x54
-	.4byte	0x1334c
+	.4byte	0x13522
 	.uleb128 0x54
-	.4byte	0x13341
+	.4byte	0x13517
 	.uleb128 0x5c
-	.4byte	0x13365
-	.8byte	.LBB1626
-	.8byte	.LBE1626-.LBB1626
+	.4byte	0x1353b
+	.8byte	.LBB1630
+	.8byte	.LBE1630-.LBB1630
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13399
+	.4byte	0x1356f
 	.uleb128 0x54
-	.4byte	0x1338d
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x13381
+	.4byte	0x13557
 	.uleb128 0x54
-	.4byte	0x13376
+	.4byte	0x1354c
 	.uleb128 0x56
-	.8byte	.LBB1627
-	.8byte	.LBE1627-.LBB1627
+	.8byte	.LBB1631
+	.8byte	.LBE1631-.LBB1631
 	.uleb128 0x57
-	.4byte	0x133a4
+	.4byte	0x1357a
 	.uleb128 0x4e
-	.8byte	.LVL502
-	.4byte	0x1403c
+	.8byte	.LVL543
+	.4byte	0x14212
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13330
-	.8byte	.LBB1628
+	.4byte	0x13506
+	.8byte	.LBB1632
 	.4byte	.Ldebug_ranges0+0xce0
 	.byte	0x1
-	.2byte	0x5c5
+	.2byte	0x6aa
 	.4byte	0xf25b
 	.uleb128 0x54
-	.4byte	0x13358
+	.4byte	0x1352e
 	.uleb128 0x54
-	.4byte	0x1334c
+	.4byte	0x13522
 	.uleb128 0x54
-	.4byte	0x13341
+	.4byte	0x13517
 	.uleb128 0x5e
-	.4byte	0x13365
-	.8byte	.LBB1629
+	.4byte	0x1353b
+	.8byte	.LBB1633
 	.4byte	.Ldebug_ranges0+0xce0
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13399
+	.4byte	0x1356f
 	.uleb128 0x54
-	.4byte	0x1338d
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x13381
+	.4byte	0x13557
 	.uleb128 0x54
-	.4byte	0x13376
+	.4byte	0x1354c
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xce0
 	.uleb128 0x57
-	.4byte	0x133a4
+	.4byte	0x1357a
 	.uleb128 0x4e
-	.8byte	.LVL503
-	.4byte	0x1403c
+	.8byte	.LVL544
+	.4byte	0x14212
 	.uleb128 0x4e
-	.8byte	.LVL535
-	.4byte	0x1403c
+	.8byte	.LVL576
+	.4byte	0x14212
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13330
-	.8byte	.LBB1635
+	.4byte	0x13506
+	.8byte	.LBB1639
 	.4byte	.Ldebug_ranges0+0xd20
 	.byte	0x1
-	.2byte	0x5c8
+	.2byte	0x6ad
 	.4byte	0xf2d1
 	.uleb128 0x54
-	.4byte	0x13358
+	.4byte	0x1352e
 	.uleb128 0x54
-	.4byte	0x1334c
+	.4byte	0x13522
 	.uleb128 0x54
-	.4byte	0x13341
+	.4byte	0x13517
 	.uleb128 0x5e
-	.4byte	0x13365
-	.8byte	.LBB1636
+	.4byte	0x1353b
+	.8byte	.LBB1640
 	.4byte	.Ldebug_ranges0+0xd20
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13399
+	.4byte	0x1356f
 	.uleb128 0x54
-	.4byte	0x1338d
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x13381
+	.4byte	0x13557
 	.uleb128 0x54
-	.4byte	0x13376
+	.4byte	0x1354c
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xd20
 	.uleb128 0x57
-	.4byte	0x133a4
+	.4byte	0x1357a
 	.uleb128 0x4e
-	.8byte	.LVL504
-	.4byte	0x1403c
+	.8byte	.LVL545
+	.4byte	0x14212
 	.uleb128 0x4e
-	.8byte	.LVL534
-	.4byte	0x1403c
+	.8byte	.LVL575
+	.4byte	0x14212
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13330
-	.8byte	.LBB1642
+	.4byte	0x13506
+	.8byte	.LBB1646
 	.4byte	.Ldebug_ranges0+0xd60
 	.byte	0x1
-	.2byte	0x5cb
+	.2byte	0x6b0
 	.4byte	0xf347
 	.uleb128 0x54
-	.4byte	0x13358
+	.4byte	0x1352e
 	.uleb128 0x54
-	.4byte	0x1334c
+	.4byte	0x13522
 	.uleb128 0x54
-	.4byte	0x13341
+	.4byte	0x13517
 	.uleb128 0x5e
-	.4byte	0x13365
-	.8byte	.LBB1643
+	.4byte	0x1353b
+	.8byte	.LBB1647
 	.4byte	.Ldebug_ranges0+0xd60
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13399
+	.4byte	0x1356f
 	.uleb128 0x54
-	.4byte	0x1338d
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x13381
+	.4byte	0x13557
 	.uleb128 0x54
-	.4byte	0x13376
+	.4byte	0x1354c
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xd60
 	.uleb128 0x57
-	.4byte	0x133a4
+	.4byte	0x1357a
 	.uleb128 0x4e
-	.8byte	.LVL505
-	.4byte	0x1403c
+	.8byte	.LVL546
+	.4byte	0x14212
 	.uleb128 0x4e
-	.8byte	.LVL533
-	.4byte	0x1403c
+	.8byte	.LVL574
+	.4byte	0x14212
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x13330
-	.8byte	.LBB1649
+	.4byte	0x13506
+	.8byte	.LBB1653
 	.4byte	.Ldebug_ranges0+0xda0
 	.byte	0x1
-	.2byte	0x5ce
+	.2byte	0x6b3
 	.uleb128 0x54
-	.4byte	0x13358
+	.4byte	0x1352e
 	.uleb128 0x54
-	.4byte	0x1334c
+	.4byte	0x13522
 	.uleb128 0x54
-	.4byte	0x13341
+	.4byte	0x13517
 	.uleb128 0x5e
-	.4byte	0x13365
-	.8byte	.LBB1650
+	.4byte	0x1353b
+	.8byte	.LBB1654
 	.4byte	.Ldebug_ranges0+0xda0
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13399
+	.4byte	0x1356f
 	.uleb128 0x54
-	.4byte	0x1338d
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x13381
+	.4byte	0x13557
 	.uleb128 0x54
-	.4byte	0x13376
+	.4byte	0x1354c
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xda0
 	.uleb128 0x57
-	.4byte	0x133a4
+	.4byte	0x1357a
 	.uleb128 0x4e
-	.8byte	.LVL506
-	.4byte	0x1403c
+	.8byte	.LVL547
+	.4byte	0x14212
 	.uleb128 0x4e
-	.8byte	.LVL532
-	.4byte	0x1403c
+	.8byte	.LVL573
+	.4byte	0x14212
 	.byte	0
 	.byte	0
 	.byte	0
@@ -38699,10 +39393,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5a
 	.4byte	0xfd92
-	.8byte	.LBB1671
+	.8byte	.LBB1675
 	.4byte	.Ldebug_ranges0+0xde0
 	.byte	0x1
-	.2byte	0x877
+	.2byte	0x95c
 	.4byte	0xf568
 	.uleb128 0x54
 	.4byte	0xfda3
@@ -38710,7 +39404,7 @@ __exitcall_ebc_exit:
 	.4byte	.Ldebug_ranges0+0xde0
 	.uleb128 0x5f
 	.4byte	0xfdaf
-	.4byte	.LLST147
+	.4byte	.LLST151
 	.uleb128 0x57
 	.4byte	0xfdbb
 	.uleb128 0x57
@@ -38729,112 +39423,112 @@ __exitcall_ebc_exit:
 	.uleb128 0x57
 	.4byte	0xfe01
 	.uleb128 0x5a
-	.4byte	0x13443
-	.8byte	.LBB1673
+	.4byte	0x13619
+	.8byte	.LBB1677
 	.4byte	.Ldebug_ranges0+0xe50
 	.byte	0x1
-	.2byte	0x775
+	.2byte	0x85a
 	.4byte	0xf42b
 	.uleb128 0x54
-	.4byte	0x13453
+	.4byte	0x13629
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x1340d
-	.8byte	.LBB1677
+	.4byte	0x135e3
+	.8byte	.LBB1681
 	.4byte	.Ldebug_ranges0+0xe80
 	.byte	0x1
-	.2byte	0x790
+	.2byte	0x875
 	.4byte	0xf460
 	.uleb128 0x54
-	.4byte	0x13436
+	.4byte	0x1360c
 	.uleb128 0x54
-	.4byte	0x1342a
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x1341e
+	.4byte	0x135f4
 	.uleb128 0x4e
-	.8byte	.LVL512
-	.4byte	0x1402f
+	.8byte	.LVL553
+	.4byte	0x14205
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1340d
-	.8byte	.LBB1685
-	.8byte	.LBE1685-.LBB1685
+	.4byte	0x135e3
+	.8byte	.LBB1689
+	.8byte	.LBE1689-.LBB1689
 	.byte	0x1
-	.2byte	0x793
+	.2byte	0x878
 	.4byte	0xf499
 	.uleb128 0x54
-	.4byte	0x13436
+	.4byte	0x1360c
 	.uleb128 0x54
-	.4byte	0x1342a
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x1341e
+	.4byte	0x135f4
 	.uleb128 0x4e
-	.8byte	.LVL513
-	.4byte	0x1402f
+	.8byte	.LVL554
+	.4byte	0x14205
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1340d
-	.8byte	.LBB1687
-	.8byte	.LBE1687-.LBB1687
+	.4byte	0x135e3
+	.8byte	.LBB1691
+	.8byte	.LBE1691-.LBB1691
 	.byte	0x1
-	.2byte	0x796
+	.2byte	0x87b
 	.4byte	0xf4d2
 	.uleb128 0x54
-	.4byte	0x13436
+	.4byte	0x1360c
 	.uleb128 0x54
-	.4byte	0x1342a
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x1341e
+	.4byte	0x135f4
 	.uleb128 0x4e
-	.8byte	.LVL514
-	.4byte	0x1402f
+	.8byte	.LVL555
+	.4byte	0x14205
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1340d
-	.8byte	.LBB1689
-	.8byte	.LBE1689-.LBB1689
+	.4byte	0x135e3
+	.8byte	.LBB1693
+	.8byte	.LBE1693-.LBB1693
 	.byte	0x1
-	.2byte	0x79e
+	.2byte	0x883
 	.4byte	0xf50b
 	.uleb128 0x54
-	.4byte	0x13436
+	.4byte	0x1360c
 	.uleb128 0x54
-	.4byte	0x1342a
+	.4byte	0x13600
 	.uleb128 0x54
-	.4byte	0x1341e
+	.4byte	0x135f4
 	.uleb128 0x4e
-	.8byte	.LVL515
-	.4byte	0x1402f
+	.8byte	.LVL556
+	.4byte	0x14205
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL508
-	.4byte	0x14049
+	.8byte	.LVL549
+	.4byte	0x1421f
 	.uleb128 0x4e
-	.8byte	.LVL509
-	.4byte	0x14056
+	.8byte	.LVL550
+	.4byte	0x1422c
 	.uleb128 0x4e
-	.8byte	.LVL510
-	.4byte	0x14062
+	.8byte	.LVL551
+	.4byte	0x14238
 	.uleb128 0x4e
-	.8byte	.LVL511
-	.4byte	0x1406e
+	.8byte	.LVL552
+	.4byte	0x14244
 	.uleb128 0x4e
-	.8byte	.LVL516
-	.4byte	0x1407a
+	.8byte	.LVL557
+	.4byte	0x14250
 	.uleb128 0x4e
-	.8byte	.LVL517
-	.4byte	0x14084
+	.8byte	.LVL558
+	.4byte	0x1425a
 	.uleb128 0x4e
-	.8byte	.LVL529
-	.4byte	0x14090
+	.8byte	.LVL570
+	.4byte	0x14266
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
 	.4byte	0xfe0c
-	.8byte	.LBB1698
+	.8byte	.LBB1702
 	.4byte	.Ldebug_ranges0+0xed0
 	.byte	0x1
-	.2byte	0x87e
+	.2byte	0x963
 	.4byte	0xf64a
 	.uleb128 0x54
 	.4byte	0xfe1d
@@ -38846,7 +39540,7 @@ __exitcall_ebc_exit:
 	.4byte	0xfe29
 	.uleb128 0x5f
 	.4byte	0xfe35
-	.4byte	.LLST148
+	.4byte	.LLST152
 	.uleb128 0x57
 	.4byte	0xfe41
 	.uleb128 0x60
@@ -38856,53 +39550,53 @@ __exitcall_ebc_exit:
 	.sleb128 -104
 	.uleb128 0x5f
 	.4byte	0xfe57
-	.4byte	.LLST149
+	.4byte	.LLST153
 	.uleb128 0x57
 	.4byte	0xfe63
 	.uleb128 0x57
 	.4byte	0xfe6f
 	.uleb128 0x53
-	.4byte	0x13443
-	.8byte	.LBB1700
-	.8byte	.LBE1700-.LBB1700
+	.4byte	0x13619
+	.8byte	.LBB1704
+	.8byte	.LBE1704-.LBB1704
 	.byte	0x1
-	.2byte	0x748
+	.2byte	0x82d
 	.4byte	0xf5e0
 	.uleb128 0x54
-	.4byte	0x13453
+	.4byte	0x13629
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL519
-	.4byte	0x14049
+	.8byte	.LVL560
+	.4byte	0x1421f
 	.uleb128 0x4e
-	.8byte	.LVL520
-	.4byte	0x14056
+	.8byte	.LVL561
+	.4byte	0x1422c
 	.uleb128 0x4e
-	.8byte	.LVL538
-	.4byte	0x14062
+	.8byte	.LVL579
+	.4byte	0x14238
 	.uleb128 0x4e
-	.8byte	.LVL539
-	.4byte	0x1409d
+	.8byte	.LVL580
+	.4byte	0x14273
 	.uleb128 0x4e
-	.8byte	.LVL620
-	.4byte	0x14090
+	.8byte	.LVL661
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL621
-	.4byte	0x140a9
+	.8byte	.LVL662
+	.4byte	0x1427f
 	.uleb128 0x4e
-	.8byte	.LVL622
-	.4byte	0x14090
+	.8byte	.LVL663
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL641
-	.4byte	0x14090
+	.8byte	.LVL682
+	.4byte	0x14266
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
 	.4byte	0xfd5a
-	.8byte	.LBB1709
+	.8byte	.LBB1713
 	.4byte	.Ldebug_ranges0+0xf30
 	.byte	0x1
-	.2byte	0x885
+	.2byte	0x96a
 	.4byte	0xf7d7
 	.uleb128 0x54
 	.4byte	0xfd6b
@@ -38914,54 +39608,54 @@ __exitcall_ebc_exit:
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5a
-	.4byte	0x13619
-	.8byte	.LBB1711
+	.4byte	0x137ef
+	.8byte	.LBB1715
 	.4byte	.Ldebug_ranges0+0xf70
 	.byte	0x1
-	.2byte	0x7ab
+	.2byte	0x890
 	.4byte	0xf6d1
 	.uleb128 0x54
-	.4byte	0x13625
+	.4byte	0x137fb
 	.uleb128 0x56
-	.8byte	.LBB1713
-	.8byte	.LBE1713-.LBB1713
+	.8byte	.LBB1717
+	.8byte	.LBE1717-.LBB1717
 	.uleb128 0x57
-	.4byte	0x13650
+	.4byte	0x13826
 	.uleb128 0x5b
-	.4byte	0x1379d
-	.8byte	.LBB1714
-	.8byte	.LBE1714-.LBB1714
+	.4byte	0x13973
+	.8byte	.LBB1718
+	.8byte	.LBE1718-.LBB1718
 	.byte	0x10
 	.byte	0x1c
 	.uleb128 0x54
-	.4byte	0x137c0
+	.4byte	0x13996
 	.uleb128 0x54
-	.4byte	0x137b4
+	.4byte	0x1398a
 	.uleb128 0x54
-	.4byte	0x137aa
+	.4byte	0x13980
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136df
-	.8byte	.LBB1718
-	.8byte	.LBE1718-.LBB1718
+	.4byte	0x138b5
+	.8byte	.LBB1722
+	.8byte	.LBE1722-.LBB1722
 	.byte	0x1
-	.2byte	0x7b3
+	.2byte	0x898
 	.4byte	0xf71c
 	.uleb128 0x54
-	.4byte	0x136f4
+	.4byte	0x138ca
 	.uleb128 0x54
-	.4byte	0x136eb
+	.4byte	0x138c1
 	.uleb128 0x56
-	.8byte	.LBB1719
-	.8byte	.LBE1719-.LBB1719
+	.8byte	.LBB1723
+	.8byte	.LBE1723-.LBB1723
 	.uleb128 0x5f
-	.4byte	0x136fd
-	.4byte	.LLST150
+	.4byte	0x138d3
+	.4byte	.LLST154
 	.uleb128 0x5f
-	.4byte	0x13707
-	.4byte	.LLST151
+	.4byte	0x138dd
+	.4byte	.LLST155
 	.byte	0
 	.byte	0
 	.uleb128 0x61
@@ -38969,104 +39663,104 @@ __exitcall_ebc_exit:
 	.4byte	0xf749
 	.uleb128 0x5f
 	.4byte	0xfd84
-	.4byte	.LLST152
+	.4byte	.LLST156
 	.uleb128 0x4e
-	.8byte	.LVL546
-	.4byte	0x140b5
+	.8byte	.LVL587
+	.4byte	0x1428b
 	.uleb128 0x4e
-	.8byte	.LVL548
-	.4byte	0x140c1
+	.8byte	.LVL589
+	.4byte	0x14297
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x136df
-	.8byte	.LBB1722
-	.8byte	.LBE1722-.LBB1722
+	.4byte	0x138b5
+	.8byte	.LBB1726
+	.8byte	.LBE1726-.LBB1726
 	.byte	0x1
-	.2byte	0x7bc
+	.2byte	0x8a1
 	.4byte	0xf794
 	.uleb128 0x54
-	.4byte	0x136f4
+	.4byte	0x138ca
 	.uleb128 0x54
-	.4byte	0x136eb
+	.4byte	0x138c1
 	.uleb128 0x56
-	.8byte	.LBB1723
-	.8byte	.LBE1723-.LBB1723
+	.8byte	.LBB1727
+	.8byte	.LBE1727-.LBB1727
 	.uleb128 0x5f
-	.4byte	0x136fd
-	.4byte	.LLST153
+	.4byte	0x138d3
+	.4byte	.LLST157
 	.uleb128 0x5f
-	.4byte	0x13707
-	.4byte	.LLST154
+	.4byte	0x138dd
+	.4byte	.LLST158
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL540
-	.4byte	0x140b5
+	.8byte	.LVL581
+	.4byte	0x1428b
 	.uleb128 0x4e
-	.8byte	.LVL541
-	.4byte	0x140ce
+	.8byte	.LVL582
+	.4byte	0x142a4
 	.uleb128 0x4e
-	.8byte	.LVL549
-	.4byte	0x140ce
+	.8byte	.LVL590
+	.4byte	0x142a4
 	.uleb128 0x4e
-	.8byte	.LVL625
-	.4byte	0x14090
+	.8byte	.LVL666
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL629
-	.4byte	0x14090
+	.8byte	.LVL670
+	.4byte	0x14266
 	.byte	0
 	.byte	0
 	.uleb128 0x53
 	.4byte	0xfd40
-	.8byte	.LBB1726
-	.8byte	.LBE1726-.LBB1726
+	.8byte	.LBB1730
+	.8byte	.LBE1730-.LBB1730
 	.byte	0x1
-	.2byte	0x88c
+	.2byte	0x971
 	.4byte	0xf871
 	.uleb128 0x54
 	.4byte	0xfd4d
 	.uleb128 0x5a
-	.4byte	0x13076
-	.8byte	.LBB1728
+	.4byte	0x1324c
+	.8byte	.LBB1732
 	.4byte	.Ldebug_ranges0+0xfd0
 	.byte	0x1
-	.2byte	0x7cc
+	.2byte	0x8b1
 	.4byte	0xf83c
 	.uleb128 0x54
-	.4byte	0x13098
+	.4byte	0x1326e
 	.uleb128 0x54
-	.4byte	0x1308d
+	.4byte	0x13263
 	.uleb128 0x54
-	.4byte	0x13082
+	.4byte	0x13258
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xfd0
 	.uleb128 0x5f
-	.4byte	0x130a3
-	.4byte	.LLST155
+	.4byte	0x13279
+	.4byte	.LLST159
 	.uleb128 0x4e
-	.8byte	.LVL556
-	.4byte	0x140db
+	.8byte	.LVL597
+	.4byte	0x142b1
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL557
-	.4byte	0x140e7
+	.8byte	.LVL598
+	.4byte	0x142bd
 	.uleb128 0x4e
-	.8byte	.LVL558
-	.4byte	0x140f3
+	.8byte	.LVL599
+	.4byte	0x142c9
 	.uleb128 0x4e
-	.8byte	.LVL559
-	.4byte	0x140e7
+	.8byte	.LVL600
+	.4byte	0x142bd
 	.uleb128 0x4e
-	.8byte	.LVL560
-	.4byte	0x140f3
+	.8byte	.LVL601
+	.4byte	0x142c9
 	.byte	0
 	.uleb128 0x5a
 	.4byte	0xfc9e
-	.8byte	.LBB1738
+	.8byte	.LBB1742
 	.4byte	.Ldebug_ranges0+0x1030
 	.byte	0x1
-	.2byte	0x88f
+	.2byte	0x974
 	.4byte	0xfb14
 	.uleb128 0x54
 	.4byte	0xfcbb
@@ -39078,474 +39772,474 @@ __exitcall_ebc_exit:
 	.4byte	0xfcc7
 	.uleb128 0x5f
 	.4byte	0xfcd3
-	.4byte	.LLST156
+	.4byte	.LLST160
 	.uleb128 0x5f
 	.4byte	0xfcdf
-	.4byte	.LLST157
+	.4byte	.LLST161
 	.uleb128 0x5f
 	.4byte	0xfceb
-	.4byte	.LLST158
+	.4byte	.LLST162
 	.uleb128 0x5f
 	.4byte	0xfcf7
-	.4byte	.LLST159
+	.4byte	.LLST163
 	.uleb128 0x5f
 	.4byte	0xfd03
-	.4byte	.LLST160
+	.4byte	.LLST164
 	.uleb128 0x5f
 	.4byte	0xfd0f
-	.4byte	.LLST161
+	.4byte	.LLST165
 	.uleb128 0x57
 	.4byte	0xfd1b
 	.uleb128 0x5f
 	.4byte	0xfd27
-	.4byte	.LLST162
+	.4byte	.LLST166
 	.uleb128 0x5f
 	.4byte	0xfd33
-	.4byte	.LLST163
+	.4byte	.LLST167
 	.uleb128 0x53
 	.4byte	0x116f3
-	.8byte	.LBB1740
-	.8byte	.LBE1740-.LBB1740
+	.8byte	.LBB1744
+	.8byte	.LBE1744-.LBB1744
 	.byte	0x1
-	.2byte	0x804
+	.2byte	0x8e9
 	.4byte	0xf953
 	.uleb128 0x54
 	.4byte	0x11704
 	.uleb128 0x54
 	.4byte	0x11704
 	.uleb128 0x56
-	.8byte	.LBB1741
-	.8byte	.LBE1741-.LBB1741
+	.8byte	.LBB1745
+	.8byte	.LBE1745-.LBB1745
 	.uleb128 0x5f
 	.4byte	0x11710
-	.4byte	.LLST164
+	.4byte	.LLST168
 	.uleb128 0x4e
-	.8byte	.LVL577
-	.4byte	0x140ff
+	.8byte	.LVL618
+	.4byte	0x142d5
 	.uleb128 0x4e
-	.8byte	.LVL579
-	.4byte	0x14084
+	.8byte	.LVL620
+	.4byte	0x1425a
 	.uleb128 0x4e
-	.8byte	.LVL580
-	.4byte	0x1410b
+	.8byte	.LVL621
+	.4byte	0x142e1
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131f3
-	.8byte	.LBB1742
-	.8byte	.LBE1742-.LBB1742
+	.4byte	0x133c9
+	.8byte	.LBB1746
+	.8byte	.LBE1746-.LBB1746
 	.byte	0x1
-	.2byte	0x7ea
+	.2byte	0x8cf
 	.4byte	0xf9aa
 	.uleb128 0x54
-	.4byte	0x13210
+	.4byte	0x133e6
 	.uleb128 0x54
-	.4byte	0x13204
+	.4byte	0x133da
 	.uleb128 0x5c
-	.4byte	0x1321d
-	.8byte	.LBB1743
-	.8byte	.LBE1743-.LBB1743
+	.4byte	0x133f3
+	.8byte	.LBB1747
+	.8byte	.LBE1747-.LBB1747
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x1323a
+	.4byte	0x13410
 	.uleb128 0x54
-	.4byte	0x1322e
+	.4byte	0x13404
 	.uleb128 0x4e
-	.8byte	.LVL594
-	.4byte	0x14117
+	.8byte	.LVL635
+	.4byte	0x142ed
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131f3
-	.8byte	.LBB1745
-	.8byte	.LBE1745-.LBB1745
+	.4byte	0x133c9
+	.8byte	.LBB1749
+	.8byte	.LBE1749-.LBB1749
 	.byte	0x1
-	.2byte	0x7f8
+	.2byte	0x8dd
 	.4byte	0xfa01
 	.uleb128 0x54
-	.4byte	0x13210
+	.4byte	0x133e6
 	.uleb128 0x54
-	.4byte	0x13204
+	.4byte	0x133da
 	.uleb128 0x5c
-	.4byte	0x1321d
-	.8byte	.LBB1746
-	.8byte	.LBE1746-.LBB1746
+	.4byte	0x133f3
+	.8byte	.LBB1750
+	.8byte	.LBE1750-.LBB1750
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x1323a
+	.4byte	0x13410
 	.uleb128 0x54
-	.4byte	0x1322e
+	.4byte	0x13404
 	.uleb128 0x4e
-	.8byte	.LVL609
-	.4byte	0x14117
+	.8byte	.LVL650
+	.4byte	0x142ed
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL562
-	.4byte	0x14124
+	.8byte	.LVL603
+	.4byte	0x142fa
 	.uleb128 0x4e
-	.8byte	.LVL564
-	.4byte	0x14124
+	.8byte	.LVL605
+	.4byte	0x142fa
 	.uleb128 0x4e
-	.8byte	.LVL566
-	.4byte	0x14130
+	.8byte	.LVL607
+	.4byte	0x14306
 	.uleb128 0x4e
-	.8byte	.LVL571
-	.4byte	0x14130
+	.8byte	.LVL612
+	.4byte	0x14306
 	.uleb128 0x4e
-	.8byte	.LVL575
-	.4byte	0x14016
+	.8byte	.LVL616
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL576
-	.4byte	0x1413d
+	.8byte	.LVL617
+	.4byte	0x14313
 	.uleb128 0x4e
-	.8byte	.LVL581
-	.4byte	0x14149
+	.8byte	.LVL622
+	.4byte	0x1431f
 	.uleb128 0x4e
-	.8byte	.LVL582
-	.4byte	0x14149
+	.8byte	.LVL623
+	.4byte	0x1431f
 	.uleb128 0x4e
-	.8byte	.LVL593
-	.4byte	0x14016
+	.8byte	.LVL634
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL598
-	.4byte	0x14155
+	.8byte	.LVL639
+	.4byte	0x1432b
 	.uleb128 0x4e
-	.8byte	.LVL601
-	.4byte	0x140ff
+	.8byte	.LVL642
+	.4byte	0x142d5
 	.uleb128 0x4e
-	.8byte	.LVL603
-	.4byte	0x14155
+	.8byte	.LVL644
+	.4byte	0x1432b
 	.uleb128 0x4e
-	.8byte	.LVL604
-	.4byte	0x1410b
+	.8byte	.LVL645
+	.4byte	0x142e1
 	.uleb128 0x4e
-	.8byte	.LVL606
-	.4byte	0x1415f
+	.8byte	.LVL647
+	.4byte	0x14335
 	.uleb128 0x4e
-	.8byte	.LVL608
-	.4byte	0x14016
+	.8byte	.LVL649
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL612
-	.4byte	0x14155
+	.8byte	.LVL653
+	.4byte	0x1432b
 	.uleb128 0x4e
-	.8byte	.LVL615
-	.4byte	0x140ff
+	.8byte	.LVL656
+	.4byte	0x142d5
 	.uleb128 0x4e
-	.8byte	.LVL617
-	.4byte	0x14155
+	.8byte	.LVL658
+	.4byte	0x1432b
 	.uleb128 0x4e
-	.8byte	.LVL618
-	.4byte	0x1410b
+	.8byte	.LVL659
+	.4byte	0x142e1
 	.uleb128 0x4e
-	.8byte	.LVL645
-	.4byte	0x14090
+	.8byte	.LVL686
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL648
-	.4byte	0x14090
+	.8byte	.LVL689
+	.4byte	0x14266
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132c7
-	.8byte	.LBB1751
-	.8byte	.LBE1751-.LBB1751
+	.4byte	0x1349d
+	.8byte	.LBB1755
+	.8byte	.LBE1755-.LBB1755
 	.byte	0x1
-	.2byte	0x891
+	.2byte	0x976
 	.4byte	0xfb5d
 	.uleb128 0x54
-	.4byte	0x132de
+	.4byte	0x134b4
 	.uleb128 0x54
-	.4byte	0x132d3
+	.4byte	0x134a9
 	.uleb128 0x5b
-	.4byte	0x133c9
-	.8byte	.LBB1752
-	.8byte	.LBE1752-.LBB1752
+	.4byte	0x1359f
+	.8byte	.LBB1756
+	.8byte	.LBE1756-.LBB1756
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x54
-	.4byte	0x133e2
+	.4byte	0x135b8
 	.uleb128 0x54
-	.4byte	0x133d6
+	.4byte	0x135ac
 	.byte	0
 	.byte	0
 	.uleb128 0x53
 	.4byte	0xfe92
-	.8byte	.LBB1754
-	.8byte	.LBE1754-.LBB1754
+	.8byte	.LBB1758
+	.8byte	.LBE1758-.LBB1758
 	.byte	0x1
-	.2byte	0x894
+	.2byte	0x979
 	.4byte	0xfbe7
 	.uleb128 0x54
 	.4byte	0xfea3
 	.uleb128 0x4e
-	.8byte	.LVL583
-	.4byte	0x1416b
+	.8byte	.LVL624
+	.4byte	0x14341
 	.uleb128 0x4e
-	.8byte	.LVL584
-	.4byte	0x14177
+	.8byte	.LVL625
+	.4byte	0x1434d
 	.uleb128 0x4e
-	.8byte	.LVL585
-	.4byte	0x14177
+	.8byte	.LVL626
+	.4byte	0x1434d
 	.uleb128 0x4e
-	.8byte	.LVL586
-	.4byte	0x14177
+	.8byte	.LVL627
+	.4byte	0x1434d
 	.uleb128 0x4e
-	.8byte	.LVL587
-	.4byte	0x14177
+	.8byte	.LVL628
+	.4byte	0x1434d
 	.uleb128 0x4e
-	.8byte	.LVL588
-	.4byte	0x14177
+	.8byte	.LVL629
+	.4byte	0x1434d
 	.uleb128 0x4e
-	.8byte	.LVL589
-	.4byte	0x14177
+	.8byte	.LVL630
+	.4byte	0x1434d
 	.uleb128 0x4e
-	.8byte	.LVL590
-	.4byte	0x14177
+	.8byte	.LVL631
+	.4byte	0x1434d
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL480
-	.4byte	0x14049
+	.8byte	.LVL521
+	.4byte	0x1421f
 	.uleb128 0x4e
-	.8byte	.LVL481
-	.4byte	0x14184
+	.8byte	.LVL522
+	.4byte	0x1435a
 	.uleb128 0x4e
-	.8byte	.LVL483
-	.4byte	0x14049
+	.8byte	.LVL524
+	.4byte	0x1421f
 	.uleb128 0x4e
-	.8byte	.LVL484
-	.4byte	0x14190
+	.8byte	.LVL525
+	.4byte	0x14366
 	.uleb128 0x4e
-	.8byte	.LVL521
-	.4byte	0x14090
+	.8byte	.LVL562
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL523
-	.4byte	0x14090
+	.8byte	.LVL564
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL530
-	.4byte	0x14090
+	.8byte	.LVL571
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL591
-	.4byte	0x14016
+	.8byte	.LVL632
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL626
-	.4byte	0x14090
+	.8byte	.LVL667
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL633
-	.4byte	0x14090
+	.8byte	.LVL674
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL634
-	.4byte	0x14090
+	.8byte	.LVL675
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL635
-	.4byte	0x14090
+	.8byte	.LVL676
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL639
-	.4byte	0x14090
+	.8byte	.LVL680
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL643
-	.4byte	0x1419d
+	.8byte	.LVL684
+	.4byte	0x14373
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0x7d8
+	.2byte	0x8bd
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfd40
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x7d8
+	.2byte	0x8bd
 	.4byte	0xe47d
 	.uleb128 0x64
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x7d8
+	.2byte	0x8bd
 	.4byte	0xe13f
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x7da
+	.2byte	0x8bf
 	.4byte	0xe742
 	.uleb128 0x46
 	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0x7db
+	.2byte	0x8c0
 	.4byte	0x6d
 	.uleb128 0x46
 	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0x7dc
+	.2byte	0x8c1
 	.4byte	0x6d
 	.uleb128 0x46
 	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0x7dd
+	.2byte	0x8c2
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0x7de
+	.2byte	0x8c3
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0x7df
+	.2byte	0x8c4
 	.4byte	0x219
 	.uleb128 0x46
 	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0x7e0
+	.2byte	0x8c5
 	.4byte	0x219
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7e1
+	.2byte	0x8c6
 	.4byte	0xe418
 	.uleb128 0x46
 	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0x7e2
+	.2byte	0x8c7
 	.4byte	0x443
 	.uleb128 0x46
 	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0x7e3
+	.2byte	0x8c8
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x65
 	.4byte	.LASF3095
 	.byte	0x1
-	.2byte	0x7c1
+	.2byte	0x8a6
 	.byte	0x1
 	.4byte	0xfd5a
 	.uleb128 0x64
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x7c1
+	.2byte	0x8a6
 	.4byte	0xe742
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0x7a7
+	.2byte	0x88c
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfd92
 	.uleb128 0x64
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x7a7
+	.2byte	0x88c
 	.4byte	0xe742
 	.uleb128 0x46
 	.4byte	.LASF2465
 	.byte	0x1
-	.2byte	0x7a9
+	.2byte	0x88e
 	.4byte	0xd7ff
 	.uleb128 0x66
 	.uleb128 0x52
 	.string	"__k"
 	.byte	0x1
-	.2byte	0x7b6
+	.2byte	0x89b
 	.4byte	0x2ef0
 	.byte	0
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0x75e
+	.2byte	0x843
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfe0c
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x75e
+	.2byte	0x843
 	.4byte	0xe47d
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x760
+	.2byte	0x845
 	.4byte	0xa55b
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x761
+	.2byte	0x846
 	.4byte	0xe13f
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x762
+	.2byte	0x847
 	.4byte	0xe742
 	.uleb128 0x46
 	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0x763
+	.2byte	0x848
 	.4byte	0xb87f
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x764
+	.2byte	0x849
 	.4byte	0x9737
 	.uleb128 0x46
 	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0x765
+	.2byte	0x84a
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x766
+	.2byte	0x84b
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x766
+	.2byte	0x84b
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0x735
+	.2byte	0x81a
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfe7d
 	.uleb128 0x64
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x735
+	.2byte	0x81a
 	.4byte	0xe742
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x737
+	.2byte	0x81c
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x738
+	.2byte	0x81d
 	.4byte	0xa55b
 	.uleb128 0x46
 	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0x739
+	.2byte	0x81e
 	.4byte	0xb87f
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x73a
+	.2byte	0x81f
 	.4byte	0x9737
 	.uleb128 0x46
 	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0x73b
+	.2byte	0x820
 	.4byte	0x29
 	.uleb128 0x46
 	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0x73c
+	.2byte	0x821
 	.4byte	0xc6
 	.uleb128 0x67
 	.4byte	.LASF3024
@@ -39564,388 +40258,388 @@ __exitcall_ebc_exit:
 	.uleb128 0x62
 	.4byte	.LASF3048
 	.byte	0x1
-	.2byte	0x726
+	.2byte	0x80b
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfeb0
 	.uleb128 0x64
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x726
+	.2byte	0x80b
 	.4byte	0xe742
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0x71d
+	.2byte	0x802
 	.4byte	0x2d9
-	.8byte	.LFB2840
-	.8byte	.LFE2840-.LFB2840
+	.8byte	.LFB2841
+	.8byte	.LFE2841-.LFB2841
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xff10
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x71d
+	.2byte	0x802
 	.4byte	0xa55b
-	.4byte	.LLST71
+	.4byte	.LLST75
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x71e
+	.2byte	0x803
 	.4byte	0xb3d6
-	.4byte	.LLST72
+	.4byte	.LLST76
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x71f
+	.2byte	0x804
 	.4byte	0x219
-	.4byte	.LLST73
+	.4byte	.LLST77
 	.uleb128 0x4e
-	.8byte	.LVL270
-	.4byte	0x141a7
+	.8byte	.LVL300
+	.4byte	0x1437d
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3050
 	.byte	0x1
-	.2byte	0x714
+	.2byte	0x7f9
 	.4byte	0x2d9
-	.8byte	.LFB2839
-	.8byte	.LFE2839-.LFB2839
+	.8byte	.LFB2840
+	.8byte	.LFE2840-.LFB2840
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xff70
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x714
+	.2byte	0x7f9
 	.4byte	0xa55b
-	.4byte	.LLST74
+	.4byte	.LLST78
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x715
+	.2byte	0x7fa
 	.4byte	0xb3d6
-	.4byte	.LLST75
+	.4byte	.LLST79
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x716
+	.2byte	0x7fb
 	.4byte	0x219
-	.4byte	.LLST76
+	.4byte	.LLST80
 	.uleb128 0x4e
-	.8byte	.LVL275
-	.4byte	0x141b3
+	.8byte	.LVL305
+	.4byte	0x14389
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0x70b
+	.2byte	0x7f0
 	.4byte	0x2d9
-	.8byte	.LFB2838
-	.8byte	.LFE2838-.LFB2838
+	.8byte	.LFB2839
+	.8byte	.LFE2839-.LFB2839
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0xffd0
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x70b
+	.2byte	0x7f0
 	.4byte	0xa55b
-	.4byte	.LLST77
+	.4byte	.LLST81
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x70c
+	.2byte	0x7f1
 	.4byte	0xb3d6
-	.4byte	.LLST78
+	.4byte	.LLST82
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x70d
+	.2byte	0x7f2
 	.4byte	0x219
-	.4byte	.LLST79
+	.4byte	.LLST83
 	.uleb128 0x4e
-	.8byte	.LVL280
-	.4byte	0x141b3
+	.8byte	.LVL310
+	.4byte	0x14389
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0x6f3
+	.2byte	0x7d8
 	.4byte	0x2d9
-	.8byte	.LFB2837
-	.8byte	.LFE2837-.LFB2837
+	.8byte	.LFB2838
+	.8byte	.LFE2838-.LFB2838
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x100a0
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x6f3
+	.2byte	0x7d8
 	.4byte	0xa55b
-	.4byte	.LLST89
+	.4byte	.LLST93
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x6f4
+	.2byte	0x7d9
 	.4byte	0xb3d6
-	.4byte	.LLST90
+	.4byte	.LLST94
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6f5
+	.2byte	0x7da
 	.4byte	0x56
-	.4byte	.LLST91
+	.4byte	.LLST95
 	.uleb128 0x58
 	.4byte	.LASF382
 	.byte	0x1
-	.2byte	0x6f5
+	.2byte	0x7da
 	.4byte	0x2ce
-	.4byte	.LLST92
+	.4byte	.LLST96
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x6f7
+	.2byte	0x7dc
 	.4byte	0xe47d
-	.4byte	.LLST93
+	.4byte	.LLST97
 	.uleb128 0x59
 	.4byte	.LASF2455
 	.byte	0x1
-	.2byte	0x6f8
+	.2byte	0x7dd
 	.4byte	0xc6
-	.4byte	.LLST94
+	.4byte	.LLST98
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x6f8
+	.2byte	0x7dd
 	.4byte	0xc6
 	.uleb128 0x4e
-	.8byte	.LVL306
-	.4byte	0x141c0
+	.8byte	.LVL336
+	.4byte	0x14396
 	.uleb128 0x4e
-	.8byte	.LVL308
-	.4byte	0x141cd
+	.8byte	.LVL338
+	.4byte	0x143a3
 	.uleb128 0x4e
-	.8byte	.LVL313
-	.4byte	0x14090
+	.8byte	.LVL343
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL316
-	.4byte	0x14090
+	.8byte	.LVL346
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL317
-	.4byte	0x1419d
+	.8byte	.LVL347
+	.4byte	0x14373
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0x6e7
+	.2byte	0x7cc
 	.4byte	0x2d9
-	.8byte	.LFB2836
-	.8byte	.LFE2836-.LFB2836
+	.8byte	.LFB2837
+	.8byte	.LFE2837-.LFB2837
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x1013a
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x6e7
+	.2byte	0x7cc
 	.4byte	0xa55b
-	.4byte	.LLST80
+	.4byte	.LLST84
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x6e8
+	.2byte	0x7cd
 	.4byte	0xb3d6
-	.4byte	.LLST81
+	.4byte	.LLST85
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6e9
+	.2byte	0x7ce
 	.4byte	0x219
-	.4byte	.LLST82
+	.4byte	.LLST86
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x6eb
+	.2byte	0x7d0
 	.4byte	0xe47d
 	.uleb128 0x46
 	.4byte	.LASF2455
 	.byte	0x1
-	.2byte	0x6ec
+	.2byte	0x7d1
 	.4byte	0xc6
 	.uleb128 0x53
-	.4byte	0x12f9f
-	.8byte	.LBB1206
-	.8byte	.LBE1206-.LBB1206
+	.4byte	0x13175
+	.8byte	.LBB1208
+	.8byte	.LBE1208-.LBB1208
 	.byte	0x1
-	.2byte	0x6ee
+	.2byte	0x7d3
 	.4byte	0x1012c
 	.uleb128 0x54
-	.4byte	0x12faf
+	.4byte	0x13185
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL285
-	.4byte	0x141b3
+	.8byte	.LVL315
+	.4byte	0x14389
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0x6d9
+	.2byte	0x7be
 	.4byte	0x2d9
-	.8byte	.LFB2835
-	.8byte	.LFE2835-.LFB2835
+	.8byte	.LFB2836
+	.8byte	.LFE2836-.LFB2836
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x101e3
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x6d9
+	.2byte	0x7be
 	.4byte	0xa55b
-	.4byte	.LLST83
+	.4byte	.LLST87
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x6da
+	.2byte	0x7bf
 	.4byte	0xb3d6
-	.4byte	.LLST84
+	.4byte	.LLST88
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6db
+	.2byte	0x7c0
 	.4byte	0x219
-	.4byte	.LLST85
+	.4byte	.LLST89
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x6dd
+	.2byte	0x7c2
 	.4byte	0xe47d
 	.uleb128 0x69
 	.string	"t"
 	.byte	0x1
-	.2byte	0x6de
+	.2byte	0x7c3
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x5a
-	.4byte	0x12fbb
-	.8byte	.LBB1208
+	.4byte	0x13191
+	.8byte	.LBB1210
 	.4byte	.Ldebug_ranges0+0x6a0
 	.byte	0x1
-	.2byte	0x6e0
+	.2byte	0x7c5
 	.4byte	0x101c8
 	.uleb128 0x54
-	.4byte	0x12fd6
+	.4byte	0x131ac
 	.uleb128 0x54
-	.4byte	0x12fcb
+	.4byte	0x131a1
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL292
-	.4byte	0x141b3
+	.8byte	.LVL322
+	.4byte	0x14389
 	.uleb128 0x4e
-	.8byte	.LVL295
-	.4byte	0x1419d
+	.8byte	.LVL325
+	.4byte	0x14373
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0x6ce
+	.2byte	0x7b3
 	.4byte	0x2d9
-	.8byte	.LFB2834
-	.8byte	.LFE2834-.LFB2834
+	.8byte	.LFB2835
+	.8byte	.LFE2835-.LFB2835
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x1024f
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x6ce
+	.2byte	0x7b3
 	.4byte	0xa55b
-	.4byte	.LLST86
+	.4byte	.LLST90
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x6cf
+	.2byte	0x7b4
 	.4byte	0xb3d6
-	.4byte	.LLST87
+	.4byte	.LLST91
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6d0
+	.2byte	0x7b5
 	.4byte	0x219
-	.4byte	.LLST88
+	.4byte	.LLST92
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x6d2
+	.2byte	0x7b7
 	.4byte	0xe47d
 	.uleb128 0x4e
-	.8byte	.LVL300
-	.4byte	0x141b3
+	.8byte	.LVL330
+	.4byte	0x14389
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0x6c3
+	.2byte	0x7a8
 	.4byte	0x2d9
-	.8byte	.LFB2833
-	.8byte	.LFE2833-.LFB2833
+	.8byte	.LFB2834
+	.8byte	.LFE2834-.LFB2834
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x102c8
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x6c3
+	.2byte	0x7a8
 	.4byte	0xa55b
-	.4byte	.LLST95
+	.4byte	.LLST99
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x6c4
+	.2byte	0x7a9
 	.4byte	0xb3d6
-	.4byte	.LLST96
+	.4byte	.LLST100
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6c5
+	.2byte	0x7aa
 	.4byte	0x219
-	.4byte	.LLST97
+	.4byte	.LLST101
 	.uleb128 0x46
 	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0x6c7
+	.2byte	0x7ac
 	.4byte	0x56
 	.uleb128 0x4e
-	.8byte	.LVL319
-	.4byte	0x141d9
+	.8byte	.LVL349
+	.4byte	0x143af
 	.uleb128 0x4e
-	.8byte	.LVL320
-	.4byte	0x141b3
+	.8byte	.LVL350
+	.4byte	0x14389
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x6ac
+	.2byte	0x791
 	.4byte	0xc6
-	.8byte	.LFB2832
-	.8byte	.LFE2832-.LFB2832
+	.8byte	.LFB2833
+	.8byte	.LFE2833-.LFB2833
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x10309
 	.uleb128 0x58
 	.4byte	.LASF417
 	.byte	0x1
-	.2byte	0x6ac
+	.2byte	0x791
 	.4byte	0x1c6a
-	.4byte	.LLST6
+	.4byte	.LLST10
 	.uleb128 0x6a
 	.4byte	.LASF1272
 	.byte	0x1
-	.2byte	0x6ac
+	.2byte	0x791
 	.4byte	0x5547
 	.uleb128 0x1
 	.byte	0x51
@@ -39953,84 +40647,84 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x69d
+	.2byte	0x782
 	.4byte	0xc6
-	.8byte	.LFB2831
-	.8byte	.LFE2831-.LFB2831
+	.8byte	.LFB2832
+	.8byte	.LFE2832-.LFB2832
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x10372
 	.uleb128 0x58
 	.4byte	.LASF1272
 	.byte	0x1
-	.2byte	0x69d
+	.2byte	0x782
 	.4byte	0x5547
-	.4byte	.LLST10
+	.4byte	.LLST14
 	.uleb128 0x51
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x69d
+	.2byte	0x782
 	.4byte	0x3ca0
-	.4byte	.LLST11
+	.4byte	.LLST15
 	.uleb128 0x46
 	.4byte	.LASF883
 	.byte	0x1
-	.2byte	0x69f
+	.2byte	0x784
 	.4byte	0x29
 	.uleb128 0x4e
-	.8byte	.LVL46
-	.4byte	0x141e5
+	.8byte	.LVL76
+	.4byte	0x143bb
 	.uleb128 0x4e
-	.8byte	.LVL47
-	.4byte	0x141f1
+	.8byte	.LVL77
+	.4byte	0x143c7
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x5d4
+	.2byte	0x6b9
 	.4byte	0x194
-	.8byte	.LFB2830
-	.8byte	.LFE2830-.LFB2830
+	.8byte	.LFB2831
+	.8byte	.LFE2831-.LFB2831
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x1161a
 	.uleb128 0x58
 	.4byte	.LASF1272
 	.byte	0x1
-	.2byte	0x5d4
+	.2byte	0x6b9
 	.4byte	0x5547
-	.4byte	.LLST12
+	.4byte	.LLST16
 	.uleb128 0x51
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0x5d4
+	.2byte	0x6b9
 	.4byte	0x6d
-	.4byte	.LLST13
+	.4byte	.LLST17
 	.uleb128 0x51
 	.string	"arg"
 	.byte	0x1
-	.2byte	0x5d4
+	.2byte	0x6b9
 	.4byte	0x29
-	.4byte	.LLST14
+	.4byte	.LLST18
 	.uleb128 0x46
 	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x5d6
+	.2byte	0x6bb
 	.4byte	0x443
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x5d7
+	.2byte	0x6bc
 	.4byte	0xe13f
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x5d8
+	.2byte	0x6bd
 	.4byte	0xe742
 	.uleb128 0x4c
 	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x5d9
+	.2byte	0x6be
 	.4byte	0xd9e5
 	.uleb128 0x2
 	.byte	0x91
@@ -40038,48 +40732,48 @@ __exitcall_ebc_exit:
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5da
+	.2byte	0x6bf
 	.4byte	0xe418
 	.uleb128 0x46
 	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x5db
+	.2byte	0x6c0
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x5dc
+	.2byte	0x6c1
 	.4byte	0x29
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x5dd
+	.2byte	0x6c2
 	.4byte	0xc6
 	.uleb128 0x55
 	.4byte	.LASF3024
 	.4byte	0x1162a
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34939
+	.8byte	__func__.34971
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x1a0
 	.4byte	0x104dc
 	.uleb128 0x46
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x627
+	.2byte	0x70c
 	.4byte	0xc6
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x1a0
 	.uleb128 0x6b
 	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x627
-	.8byte	.L127
+	.2byte	0x70c
+	.8byte	.L212
 	.uleb128 0x4c
 	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x627
+	.2byte	0x70c
 	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
@@ -40087,948 +40781,948 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x627
+	.2byte	0x70c
 	.4byte	0x194
 	.uleb128 0x6c
-	.8byte	.LBB998
-	.8byte	.LBE998-.LBB998
+	.8byte	.LBB1000
+	.8byte	.LBE1000-.LBB1000
 	.4byte	0x104c0
 	.uleb128 0x59
 	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x627
+	.2byte	0x70c
 	.4byte	0x194
-	.4byte	.LLST29
+	.4byte	.LLST33
 	.uleb128 0x4e
-	.8byte	.LVL93
-	.4byte	0x141fe
+	.8byte	.LVL123
+	.4byte	0x143d4
 	.uleb128 0x4e
-	.8byte	.LVL94
-	.4byte	0x1420a
+	.8byte	.LVL124
+	.4byte	0x143e0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL91
-	.4byte	0x14217
+	.8byte	.LVL121
+	.4byte	0x143ed
 	.uleb128 0x4e
-	.8byte	.LVL95
-	.4byte	0x14223
+	.8byte	.LVL125
+	.4byte	0x143f9
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x130ae
-	.8byte	.LBB934
+	.4byte	0x13284
+	.8byte	.LBB936
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x68f
+	.2byte	0x774
 	.4byte	0x106fc
 	.uleb128 0x54
-	.4byte	0x130d3
+	.4byte	0x132a9
 	.uleb128 0x54
-	.4byte	0x130c8
+	.4byte	0x1329e
 	.uleb128 0x54
-	.4byte	0x130be
+	.4byte	0x13294
 	.uleb128 0x6d
-	.4byte	0x1310c
-	.8byte	.LBB935
+	.4byte	0x132e2
+	.8byte	.LBB937
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x13131
+	.4byte	0x13307
 	.uleb128 0x54
-	.4byte	0x13126
+	.4byte	0x132fc
 	.uleb128 0x54
-	.4byte	0x1311c
+	.4byte	0x132f2
 	.uleb128 0x6e
-	.4byte	0x131a9
-	.8byte	.LBB937
+	.4byte	0x1337f
+	.8byte	.LBB939
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x10632
 	.uleb128 0x54
-	.4byte	0x131c4
+	.4byte	0x1339a
 	.uleb128 0x6f
-	.4byte	0x131b9
-	.4byte	.LLST15
+	.4byte	0x1338f
+	.4byte	.LLST19
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x80
 	.uleb128 0x5f
-	.4byte	0x131cf
-	.4byte	.LLST16
+	.4byte	0x133a5
+	.4byte	.LLST20
 	.uleb128 0x5f
-	.4byte	0x131da
-	.4byte	.LLST17
+	.4byte	0x133b0
+	.4byte	.LLST21
 	.uleb128 0x70
-	.4byte	0x135fd
-	.8byte	.LBB939
-	.8byte	.LBE939-.LBB939
+	.4byte	0x137d3
+	.8byte	.LBB941
+	.8byte	.LBE941-.LBB941
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10598
 	.uleb128 0x56
-	.8byte	.LBB940
-	.8byte	.LBE940-.LBB940
+	.8byte	.LBB942
+	.8byte	.LBE942-.LBB942
 	.uleb128 0x5f
-	.4byte	0x1360d
-	.4byte	.LLST18
+	.4byte	0x137e3
+	.4byte	.LLST22
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x135d1
-	.8byte	.LBB941
-	.8byte	.LBE941-.LBB941
+	.4byte	0x137a7
+	.8byte	.LBB943
+	.8byte	.LBE943-.LBB943
 	.byte	0x6
 	.byte	0x55
 	.4byte	0x105e0
 	.uleb128 0x54
-	.4byte	0x135eb
+	.4byte	0x137c1
 	.uleb128 0x54
-	.4byte	0x135e1
+	.4byte	0x137b7
 	.uleb128 0x5b
-	.4byte	0x136b3
-	.8byte	.LBB942
-	.8byte	.LBE942-.LBB942
+	.4byte	0x13889
+	.8byte	.LBB944
+	.8byte	.LBE944-.LBB944
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x136cd
+	.4byte	0x138a3
 	.uleb128 0x54
-	.4byte	0x136c3
+	.4byte	0x13899
 	.byte	0
 	.byte	0
 	.uleb128 0x56
-	.8byte	.LBB944
-	.8byte	.LBE944-.LBB944
+	.8byte	.LBB946
+	.8byte	.LBE946-.LBB946
 	.uleb128 0x57
-	.4byte	0x131e6
+	.4byte	0x133bc
 	.uleb128 0x5b
-	.4byte	0x13681
-	.8byte	.LBB945
-	.8byte	.LBE945-.LBB945
+	.4byte	0x13857
+	.8byte	.LBB947
+	.8byte	.LBE947-.LBB947
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x1369c
+	.4byte	0x13872
 	.uleb128 0x54
-	.4byte	0x13691
+	.4byte	0x13867
 	.uleb128 0x56
-	.8byte	.LBB946
-	.8byte	.LBE946-.LBB946
+	.8byte	.LBB948
+	.8byte	.LBE948-.LBB948
 	.uleb128 0x57
-	.4byte	0x136a7
+	.4byte	0x1387d
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13175
-	.8byte	.LBB951
-	.8byte	.LBE951-.LBB951
+	.4byte	0x1334b
+	.8byte	.LBB953
+	.8byte	.LBE953-.LBB953
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x106ed
 	.uleb128 0x54
-	.4byte	0x13185
+	.4byte	0x1335b
 	.uleb128 0x56
-	.8byte	.LBB952
-	.8byte	.LBE952-.LBB952
+	.8byte	.LBB954
+	.8byte	.LBE954-.LBB954
 	.uleb128 0x5f
-	.4byte	0x13190
-	.4byte	.LLST19
+	.4byte	0x13366
+	.4byte	.LLST23
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xc0
 	.4byte	0x106b8
 	.uleb128 0x5f
-	.4byte	0x1319c
-	.4byte	.LLST20
+	.4byte	0x13372
+	.4byte	.LLST24
 	.uleb128 0x5b
-	.4byte	0x13681
-	.8byte	.LBB954
-	.8byte	.LBE954-.LBB954
+	.4byte	0x13857
+	.8byte	.LBB956
+	.8byte	.LBE956-.LBB956
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x1369c
+	.4byte	0x13872
 	.uleb128 0x54
-	.4byte	0x13691
+	.4byte	0x13867
 	.uleb128 0x56
-	.8byte	.LBB955
-	.8byte	.LBE955-.LBB955
+	.8byte	.LBB957
+	.8byte	.LBE957-.LBB957
 	.uleb128 0x57
-	.4byte	0x136a7
+	.4byte	0x1387d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x135fd
-	.8byte	.LBB956
-	.8byte	.LBE956-.LBB956
+	.4byte	0x137d3
+	.8byte	.LBB958
+	.8byte	.LBE958-.LBB958
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB957
-	.8byte	.LBE957-.LBB957
+	.8byte	.LBB959
+	.8byte	.LBE959-.LBB959
 	.uleb128 0x5f
-	.4byte	0x1360d
-	.4byte	.LLST21
+	.4byte	0x137e3
+	.4byte	.LLST25
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL121
-	.4byte	0x14230
+	.8byte	.LVL151
+	.4byte	0x14406
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x130dd
-	.8byte	.LBB967
+	.4byte	0x132b3
+	.8byte	.LBB969
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
-	.2byte	0x612
+	.2byte	0x6f7
 	.4byte	0x10927
 	.uleb128 0x54
-	.4byte	0x13102
+	.4byte	0x132d8
 	.uleb128 0x54
-	.4byte	0x130f7
+	.4byte	0x132cd
 	.uleb128 0x54
-	.4byte	0x130ed
+	.4byte	0x132c3
 	.uleb128 0x6d
-	.4byte	0x1313b
-	.8byte	.LBB968
+	.4byte	0x13311
+	.8byte	.LBB970
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x13160
+	.4byte	0x13336
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x1332b
 	.uleb128 0x54
-	.4byte	0x1314b
+	.4byte	0x13321
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x57
-	.4byte	0x13169
+	.4byte	0x1333f
 	.uleb128 0x6e
-	.4byte	0x131a9
-	.8byte	.LBB970
+	.4byte	0x1337f
+	.8byte	.LBB972
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x1085c
 	.uleb128 0x54
-	.4byte	0x131c4
+	.4byte	0x1339a
 	.uleb128 0x6f
-	.4byte	0x131b9
-	.4byte	.LLST22
+	.4byte	0x1338f
+	.4byte	.LLST26
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x130
 	.uleb128 0x5f
-	.4byte	0x131cf
-	.4byte	.LLST23
+	.4byte	0x133a5
+	.4byte	.LLST27
 	.uleb128 0x5f
-	.4byte	0x131da
-	.4byte	.LLST24
+	.4byte	0x133b0
+	.4byte	.LLST28
 	.uleb128 0x70
-	.4byte	0x135fd
-	.8byte	.LBB972
-	.8byte	.LBE972-.LBB972
+	.4byte	0x137d3
+	.8byte	.LBB974
+	.8byte	.LBE974-.LBB974
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x107c2
 	.uleb128 0x56
-	.8byte	.LBB973
-	.8byte	.LBE973-.LBB973
+	.8byte	.LBB975
+	.8byte	.LBE975-.LBB975
 	.uleb128 0x5f
-	.4byte	0x1360d
-	.4byte	.LLST25
+	.4byte	0x137e3
+	.4byte	.LLST29
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB974
-	.8byte	.LBE974-.LBB974
+	.8byte	.LBB976
+	.8byte	.LBE976-.LBB976
 	.4byte	0x10816
 	.uleb128 0x57
-	.4byte	0x131e6
+	.4byte	0x133bc
 	.uleb128 0x5b
-	.4byte	0x13681
-	.8byte	.LBB975
-	.8byte	.LBE975-.LBB975
+	.4byte	0x13857
+	.8byte	.LBB977
+	.8byte	.LBE977-.LBB977
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x1369c
+	.4byte	0x13872
 	.uleb128 0x54
-	.4byte	0x13691
+	.4byte	0x13867
 	.uleb128 0x56
-	.8byte	.LBB976
-	.8byte	.LBE976-.LBB976
+	.8byte	.LBB978
+	.8byte	.LBE978-.LBB978
 	.uleb128 0x57
-	.4byte	0x136a7
+	.4byte	0x1387d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x135d1
-	.8byte	.LBB977
-	.8byte	.LBE977-.LBB977
+	.4byte	0x137a7
+	.8byte	.LBB979
+	.8byte	.LBE979-.LBB979
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x135eb
+	.4byte	0x137c1
 	.uleb128 0x54
-	.4byte	0x135e1
+	.4byte	0x137b7
 	.uleb128 0x5b
-	.4byte	0x136b3
-	.8byte	.LBB978
-	.8byte	.LBE978-.LBB978
+	.4byte	0x13889
+	.8byte	.LBB980
+	.8byte	.LBE980-.LBB980
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x136cd
+	.4byte	0x138a3
 	.uleb128 0x54
-	.4byte	0x136c3
+	.4byte	0x13899
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13175
-	.8byte	.LBB982
-	.8byte	.LBE982-.LBB982
+	.4byte	0x1334b
+	.8byte	.LBB984
+	.8byte	.LBE984-.LBB984
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x10917
 	.uleb128 0x54
-	.4byte	0x13185
+	.4byte	0x1335b
 	.uleb128 0x56
-	.8byte	.LBB983
-	.8byte	.LBE983-.LBB983
+	.8byte	.LBB985
+	.8byte	.LBE985-.LBB985
 	.uleb128 0x5f
-	.4byte	0x13190
-	.4byte	.LLST26
+	.4byte	0x13366
+	.4byte	.LLST30
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x170
 	.4byte	0x108e2
 	.uleb128 0x5f
-	.4byte	0x1319c
-	.4byte	.LLST27
+	.4byte	0x13372
+	.4byte	.LLST31
 	.uleb128 0x5b
-	.4byte	0x13681
-	.8byte	.LBB985
-	.8byte	.LBE985-.LBB985
+	.4byte	0x13857
+	.8byte	.LBB987
+	.8byte	.LBE987-.LBB987
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x1369c
+	.4byte	0x13872
 	.uleb128 0x54
-	.4byte	0x13691
+	.4byte	0x13867
 	.uleb128 0x56
-	.8byte	.LBB986
-	.8byte	.LBE986-.LBB986
+	.8byte	.LBB988
+	.8byte	.LBE988-.LBB988
 	.uleb128 0x57
-	.4byte	0x136a7
+	.4byte	0x1387d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x135fd
-	.8byte	.LBB987
-	.8byte	.LBE987-.LBB987
+	.4byte	0x137d3
+	.8byte	.LBB989
+	.8byte	.LBE989-.LBB989
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB988
-	.8byte	.LBE988-.LBB988
+	.8byte	.LBB990
+	.8byte	.LBE990-.LBB990
 	.uleb128 0x5f
-	.4byte	0x1360d
-	.4byte	.LLST28
+	.4byte	0x137e3
+	.4byte	.LLST32
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL86
-	.4byte	0x1423d
+	.8byte	.LVL116
+	.4byte	0x14413
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x130dd
-	.8byte	.LBB1002
+	.4byte	0x132b3
+	.8byte	.LBB1004
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
-	.2byte	0x62e
+	.2byte	0x713
 	.4byte	0x10b52
 	.uleb128 0x54
-	.4byte	0x13102
+	.4byte	0x132d8
 	.uleb128 0x54
-	.4byte	0x130f7
+	.4byte	0x132cd
 	.uleb128 0x54
-	.4byte	0x130ed
+	.4byte	0x132c3
 	.uleb128 0x6d
-	.4byte	0x1313b
-	.8byte	.LBB1003
+	.4byte	0x13311
+	.8byte	.LBB1005
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x13160
+	.4byte	0x13336
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x1332b
 	.uleb128 0x54
-	.4byte	0x1314b
+	.4byte	0x13321
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x1f0
 	.uleb128 0x57
-	.4byte	0x13169
+	.4byte	0x1333f
 	.uleb128 0x6e
-	.4byte	0x131a9
-	.8byte	.LBB1005
+	.4byte	0x1337f
+	.8byte	.LBB1007
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x10a87
 	.uleb128 0x54
-	.4byte	0x131c4
+	.4byte	0x1339a
 	.uleb128 0x6f
-	.4byte	0x131b9
-	.4byte	.LLST30
+	.4byte	0x1338f
+	.4byte	.LLST34
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x230
 	.uleb128 0x5f
-	.4byte	0x131cf
-	.4byte	.LLST31
+	.4byte	0x133a5
+	.4byte	.LLST35
 	.uleb128 0x5f
-	.4byte	0x131da
-	.4byte	.LLST32
+	.4byte	0x133b0
+	.4byte	.LLST36
 	.uleb128 0x70
-	.4byte	0x135fd
-	.8byte	.LBB1007
-	.8byte	.LBE1007-.LBB1007
+	.4byte	0x137d3
+	.8byte	.LBB1009
+	.8byte	.LBE1009-.LBB1009
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x109ed
 	.uleb128 0x56
-	.8byte	.LBB1008
-	.8byte	.LBE1008-.LBB1008
+	.8byte	.LBB1010
+	.8byte	.LBE1010-.LBB1010
 	.uleb128 0x5f
-	.4byte	0x1360d
-	.4byte	.LLST33
+	.4byte	0x137e3
+	.4byte	.LLST37
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1009
-	.8byte	.LBE1009-.LBB1009
+	.8byte	.LBB1011
+	.8byte	.LBE1011-.LBB1011
 	.4byte	0x10a41
 	.uleb128 0x57
-	.4byte	0x131e6
+	.4byte	0x133bc
 	.uleb128 0x5b
-	.4byte	0x13681
-	.8byte	.LBB1010
-	.8byte	.LBE1010-.LBB1010
+	.4byte	0x13857
+	.8byte	.LBB1012
+	.8byte	.LBE1012-.LBB1012
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x1369c
+	.4byte	0x13872
 	.uleb128 0x54
-	.4byte	0x13691
+	.4byte	0x13867
 	.uleb128 0x56
-	.8byte	.LBB1011
-	.8byte	.LBE1011-.LBB1011
+	.8byte	.LBB1013
+	.8byte	.LBE1013-.LBB1013
 	.uleb128 0x57
-	.4byte	0x136a7
+	.4byte	0x1387d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x135d1
-	.8byte	.LBB1012
-	.8byte	.LBE1012-.LBB1012
+	.4byte	0x137a7
+	.8byte	.LBB1014
+	.8byte	.LBE1014-.LBB1014
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x135eb
+	.4byte	0x137c1
 	.uleb128 0x54
-	.4byte	0x135e1
+	.4byte	0x137b7
 	.uleb128 0x5b
-	.4byte	0x136b3
-	.8byte	.LBB1013
-	.8byte	.LBE1013-.LBB1013
+	.4byte	0x13889
+	.8byte	.LBB1015
+	.8byte	.LBE1015-.LBB1015
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x136cd
+	.4byte	0x138a3
 	.uleb128 0x54
-	.4byte	0x136c3
+	.4byte	0x13899
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13175
-	.8byte	.LBB1017
-	.8byte	.LBE1017-.LBB1017
+	.4byte	0x1334b
+	.8byte	.LBB1019
+	.8byte	.LBE1019-.LBB1019
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x10b42
 	.uleb128 0x54
-	.4byte	0x13185
+	.4byte	0x1335b
 	.uleb128 0x56
-	.8byte	.LBB1018
-	.8byte	.LBE1018-.LBB1018
+	.8byte	.LBB1020
+	.8byte	.LBE1020-.LBB1020
 	.uleb128 0x5f
-	.4byte	0x13190
-	.4byte	.LLST34
+	.4byte	0x13366
+	.4byte	.LLST38
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x270
 	.4byte	0x10b0d
 	.uleb128 0x5f
-	.4byte	0x1319c
-	.4byte	.LLST35
+	.4byte	0x13372
+	.4byte	.LLST39
 	.uleb128 0x5b
-	.4byte	0x13681
-	.8byte	.LBB1020
-	.8byte	.LBE1020-.LBB1020
+	.4byte	0x13857
+	.8byte	.LBB1022
+	.8byte	.LBE1022-.LBB1022
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x1369c
+	.4byte	0x13872
 	.uleb128 0x54
-	.4byte	0x13691
+	.4byte	0x13867
 	.uleb128 0x56
-	.8byte	.LBB1021
-	.8byte	.LBE1021-.LBB1021
+	.8byte	.LBB1023
+	.8byte	.LBE1023-.LBB1023
 	.uleb128 0x57
-	.4byte	0x136a7
+	.4byte	0x1387d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x135fd
-	.8byte	.LBB1022
-	.8byte	.LBE1022-.LBB1022
+	.4byte	0x137d3
+	.8byte	.LBB1024
+	.8byte	.LBE1024-.LBB1024
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB1023
-	.8byte	.LBE1023-.LBB1023
+	.8byte	.LBB1025
+	.8byte	.LBE1025-.LBB1025
 	.uleb128 0x5f
-	.4byte	0x1360d
-	.4byte	.LLST36
+	.4byte	0x137e3
+	.4byte	.LLST40
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL110
-	.4byte	0x1423d
+	.8byte	.LVL140
+	.4byte	0x14413
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x130ae
-	.8byte	.LBB1032
+	.4byte	0x13284
+	.8byte	.LBB1034
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
-	.2byte	0x5fc
+	.2byte	0x6e1
 	.4byte	0x10d72
 	.uleb128 0x54
-	.4byte	0x130d3
+	.4byte	0x132a9
 	.uleb128 0x54
-	.4byte	0x130c8
+	.4byte	0x1329e
 	.uleb128 0x54
-	.4byte	0x130be
+	.4byte	0x13294
 	.uleb128 0x6d
-	.4byte	0x1310c
-	.8byte	.LBB1033
+	.4byte	0x132e2
+	.8byte	.LBB1035
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x13131
+	.4byte	0x13307
 	.uleb128 0x54
-	.4byte	0x13126
+	.4byte	0x132fc
 	.uleb128 0x54
-	.4byte	0x1311c
+	.4byte	0x132f2
 	.uleb128 0x6e
-	.4byte	0x131a9
-	.8byte	.LBB1035
+	.4byte	0x1337f
+	.8byte	.LBB1037
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x10ca8
 	.uleb128 0x54
-	.4byte	0x131c4
+	.4byte	0x1339a
 	.uleb128 0x6f
-	.4byte	0x131b9
-	.4byte	.LLST37
+	.4byte	0x1338f
+	.4byte	.LLST41
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x2f0
 	.uleb128 0x5f
-	.4byte	0x131cf
-	.4byte	.LLST38
+	.4byte	0x133a5
+	.4byte	.LLST42
 	.uleb128 0x5f
-	.4byte	0x131da
-	.4byte	.LLST39
+	.4byte	0x133b0
+	.4byte	.LLST43
 	.uleb128 0x70
-	.4byte	0x135fd
-	.8byte	.LBB1037
-	.8byte	.LBE1037-.LBB1037
+	.4byte	0x137d3
+	.8byte	.LBB1039
+	.8byte	.LBE1039-.LBB1039
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10c0e
 	.uleb128 0x56
-	.8byte	.LBB1038
-	.8byte	.LBE1038-.LBB1038
+	.8byte	.LBB1040
+	.8byte	.LBE1040-.LBB1040
 	.uleb128 0x5f
-	.4byte	0x1360d
-	.4byte	.LLST40
+	.4byte	0x137e3
+	.4byte	.LLST44
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1039
-	.8byte	.LBE1039-.LBB1039
+	.8byte	.LBB1041
+	.8byte	.LBE1041-.LBB1041
 	.4byte	0x10c62
 	.uleb128 0x57
-	.4byte	0x131e6
+	.4byte	0x133bc
 	.uleb128 0x5b
-	.4byte	0x13681
-	.8byte	.LBB1040
-	.8byte	.LBE1040-.LBB1040
+	.4byte	0x13857
+	.8byte	.LBB1042
+	.8byte	.LBE1042-.LBB1042
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x1369c
+	.4byte	0x13872
 	.uleb128 0x54
-	.4byte	0x13691
+	.4byte	0x13867
 	.uleb128 0x56
-	.8byte	.LBB1041
-	.8byte	.LBE1041-.LBB1041
+	.8byte	.LBB1043
+	.8byte	.LBE1043-.LBB1043
 	.uleb128 0x57
-	.4byte	0x136a7
+	.4byte	0x1387d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x135d1
-	.8byte	.LBB1042
-	.8byte	.LBE1042-.LBB1042
+	.4byte	0x137a7
+	.8byte	.LBB1044
+	.8byte	.LBE1044-.LBB1044
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x135eb
+	.4byte	0x137c1
 	.uleb128 0x54
-	.4byte	0x135e1
+	.4byte	0x137b7
 	.uleb128 0x5b
-	.4byte	0x136b3
-	.8byte	.LBB1043
-	.8byte	.LBE1043-.LBB1043
+	.4byte	0x13889
+	.8byte	.LBB1045
+	.8byte	.LBE1045-.LBB1045
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x136cd
+	.4byte	0x138a3
 	.uleb128 0x54
-	.4byte	0x136c3
+	.4byte	0x13899
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13175
-	.8byte	.LBB1049
-	.8byte	.LBE1049-.LBB1049
+	.4byte	0x1334b
+	.8byte	.LBB1051
+	.8byte	.LBE1051-.LBB1051
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x10d63
 	.uleb128 0x54
-	.4byte	0x13185
+	.4byte	0x1335b
 	.uleb128 0x56
-	.8byte	.LBB1050
-	.8byte	.LBE1050-.LBB1050
+	.8byte	.LBB1052
+	.8byte	.LBE1052-.LBB1052
 	.uleb128 0x5f
-	.4byte	0x13190
-	.4byte	.LLST41
+	.4byte	0x13366
+	.4byte	.LLST45
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x340
 	.4byte	0x10d2e
 	.uleb128 0x5f
-	.4byte	0x1319c
-	.4byte	.LLST42
+	.4byte	0x13372
+	.4byte	.LLST46
 	.uleb128 0x5b
-	.4byte	0x13681
-	.8byte	.LBB1052
-	.8byte	.LBE1052-.LBB1052
+	.4byte	0x13857
+	.8byte	.LBB1054
+	.8byte	.LBE1054-.LBB1054
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x1369c
+	.4byte	0x13872
 	.uleb128 0x54
-	.4byte	0x13691
+	.4byte	0x13867
 	.uleb128 0x56
-	.8byte	.LBB1053
-	.8byte	.LBE1053-.LBB1053
+	.8byte	.LBB1055
+	.8byte	.LBE1055-.LBB1055
 	.uleb128 0x57
-	.4byte	0x136a7
+	.4byte	0x1387d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x135fd
-	.8byte	.LBB1054
-	.8byte	.LBE1054-.LBB1054
+	.4byte	0x137d3
+	.8byte	.LBB1056
+	.8byte	.LBE1056-.LBB1056
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB1055
-	.8byte	.LBE1055-.LBB1055
+	.8byte	.LBB1057
+	.8byte	.LBE1057-.LBB1057
 	.uleb128 0x5f
-	.4byte	0x1360d
-	.4byte	.LLST43
+	.4byte	0x137e3
+	.4byte	.LLST47
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL137
-	.4byte	0x14230
+	.8byte	.LVL167
+	.4byte	0x14406
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x130dd
-	.8byte	.LBB1066
+	.4byte	0x132b3
+	.8byte	.LBB1068
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
-	.2byte	0x64b
+	.2byte	0x730
 	.4byte	0x10fae
 	.uleb128 0x54
-	.4byte	0x13102
+	.4byte	0x132d8
 	.uleb128 0x54
-	.4byte	0x130f7
+	.4byte	0x132cd
 	.uleb128 0x54
-	.4byte	0x130ed
+	.4byte	0x132c3
 	.uleb128 0x6d
-	.4byte	0x1313b
-	.8byte	.LBB1067
+	.4byte	0x13311
+	.8byte	.LBB1069
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x13160
+	.4byte	0x13336
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x1332b
 	.uleb128 0x54
-	.4byte	0x1314b
+	.4byte	0x13321
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x370
 	.uleb128 0x5f
-	.4byte	0x13169
-	.4byte	.LLST44
+	.4byte	0x1333f
+	.4byte	.LLST48
 	.uleb128 0x6e
-	.4byte	0x131a9
-	.8byte	.LBB1069
+	.4byte	0x1337f
+	.8byte	.LBB1071
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x10ed6
 	.uleb128 0x54
-	.4byte	0x131c4
+	.4byte	0x1339a
 	.uleb128 0x6f
-	.4byte	0x131b9
-	.4byte	.LLST45
+	.4byte	0x1338f
+	.4byte	.LLST49
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x5f
-	.4byte	0x131cf
-	.4byte	.LLST46
+	.4byte	0x133a5
+	.4byte	.LLST50
 	.uleb128 0x5f
-	.4byte	0x131da
-	.4byte	.LLST47
+	.4byte	0x133b0
+	.4byte	.LLST51
 	.uleb128 0x70
-	.4byte	0x135fd
-	.8byte	.LBB1071
-	.8byte	.LBE1071-.LBB1071
+	.4byte	0x137d3
+	.8byte	.LBB1073
+	.8byte	.LBE1073-.LBB1073
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x10e3c
 	.uleb128 0x56
-	.8byte	.LBB1072
-	.8byte	.LBE1072-.LBB1072
+	.8byte	.LBB1074
+	.8byte	.LBE1074-.LBB1074
 	.uleb128 0x5f
-	.4byte	0x1360d
-	.4byte	.LLST48
+	.4byte	0x137e3
+	.4byte	.LLST52
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1073
-	.8byte	.LBE1073-.LBB1073
+	.8byte	.LBB1075
+	.8byte	.LBE1075-.LBB1075
 	.4byte	0x10e90
 	.uleb128 0x57
-	.4byte	0x131e6
+	.4byte	0x133bc
 	.uleb128 0x5b
-	.4byte	0x13681
-	.8byte	.LBB1074
-	.8byte	.LBE1074-.LBB1074
+	.4byte	0x13857
+	.8byte	.LBB1076
+	.8byte	.LBE1076-.LBB1076
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x1369c
+	.4byte	0x13872
 	.uleb128 0x54
-	.4byte	0x13691
+	.4byte	0x13867
 	.uleb128 0x56
-	.8byte	.LBB1075
-	.8byte	.LBE1075-.LBB1075
+	.8byte	.LBB1077
+	.8byte	.LBE1077-.LBB1077
 	.uleb128 0x57
-	.4byte	0x136a7
+	.4byte	0x1387d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x135d1
-	.8byte	.LBB1076
-	.8byte	.LBE1076-.LBB1076
+	.4byte	0x137a7
+	.8byte	.LBB1078
+	.8byte	.LBE1078-.LBB1078
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x135eb
+	.4byte	0x137c1
 	.uleb128 0x54
-	.4byte	0x135e1
+	.4byte	0x137b7
 	.uleb128 0x5b
-	.4byte	0x136b3
-	.8byte	.LBB1077
-	.8byte	.LBE1077-.LBB1077
+	.4byte	0x13889
+	.8byte	.LBB1079
+	.8byte	.LBE1079-.LBB1079
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x136cd
+	.4byte	0x138a3
 	.uleb128 0x54
-	.4byte	0x136c3
+	.4byte	0x13899
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13175
-	.8byte	.LBB1083
-	.8byte	.LBE1083-.LBB1083
+	.4byte	0x1334b
+	.8byte	.LBB1085
+	.8byte	.LBE1085-.LBB1085
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x10f91
 	.uleb128 0x54
-	.4byte	0x13185
+	.4byte	0x1335b
 	.uleb128 0x56
-	.8byte	.LBB1084
-	.8byte	.LBE1084-.LBB1084
+	.8byte	.LBB1086
+	.8byte	.LBE1086-.LBB1086
 	.uleb128 0x5f
-	.4byte	0x13190
-	.4byte	.LLST49
+	.4byte	0x13366
+	.4byte	.LLST53
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x420
 	.4byte	0x10f5c
 	.uleb128 0x5f
-	.4byte	0x1319c
-	.4byte	.LLST50
+	.4byte	0x13372
+	.4byte	.LLST54
 	.uleb128 0x5b
-	.4byte	0x13681
-	.8byte	.LBB1086
-	.8byte	.LBE1086-.LBB1086
+	.4byte	0x13857
+	.8byte	.LBB1088
+	.8byte	.LBE1088-.LBB1088
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x1369c
+	.4byte	0x13872
 	.uleb128 0x54
-	.4byte	0x13691
+	.4byte	0x13867
 	.uleb128 0x56
-	.8byte	.LBB1087
-	.8byte	.LBE1087-.LBB1087
+	.8byte	.LBB1089
+	.8byte	.LBE1089-.LBB1089
 	.uleb128 0x57
-	.4byte	0x136a7
+	.4byte	0x1387d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x135fd
-	.8byte	.LBB1088
-	.8byte	.LBE1088-.LBB1088
+	.4byte	0x137d3
+	.8byte	.LBB1090
+	.8byte	.LBE1090-.LBB1090
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB1089
-	.8byte	.LBE1089-.LBB1089
+	.8byte	.LBB1091
+	.8byte	.LBE1091-.LBB1091
 	.uleb128 0x5f
-	.4byte	0x1360d
-	.4byte	.LLST51
+	.4byte	0x137e3
+	.4byte	.LLST55
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL149
-	.4byte	0x1423d
+	.8byte	.LVL179
+	.4byte	0x14413
 	.uleb128 0x4e
-	.8byte	.LVL227
-	.4byte	0x1407a
+	.8byte	.LVL257
+	.4byte	0x14250
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x130ae
-	.8byte	.LBB1102
+	.4byte	0x13284
+	.8byte	.LBB1104
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
-	.2byte	0x668
+	.2byte	0x74d
 	.4byte	0x11060
 	.uleb128 0x54
-	.4byte	0x130d3
+	.4byte	0x132a9
 	.uleb128 0x54
-	.4byte	0x130c8
+	.4byte	0x1329e
 	.uleb128 0x54
-	.4byte	0x130be
+	.4byte	0x13294
 	.uleb128 0x6d
-	.4byte	0x1310c
-	.8byte	.LBB1103
+	.4byte	0x132e2
+	.8byte	.LBB1105
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x13131
+	.4byte	0x13307
 	.uleb128 0x54
-	.4byte	0x13126
+	.4byte	0x132fc
 	.uleb128 0x54
-	.4byte	0x1311c
+	.4byte	0x132f2
 	.uleb128 0x6d
-	.4byte	0x131a9
-	.8byte	.LBB1105
+	.4byte	0x1337f
+	.8byte	.LBB1107
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x54
-	.4byte	0x131c4
+	.4byte	0x1339a
 	.uleb128 0x71
-	.4byte	0x131b9
+	.4byte	0x1338f
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x4b0
 	.uleb128 0x57
-	.4byte	0x131cf
+	.4byte	0x133a5
 	.uleb128 0x5f
-	.4byte	0x131da
-	.4byte	.LLST52
+	.4byte	0x133b0
+	.4byte	.LLST56
 	.uleb128 0x5b
-	.4byte	0x135fd
-	.8byte	.LBB1107
-	.8byte	.LBE1107-.LBB1107
+	.4byte	0x137d3
+	.8byte	.LBB1109
+	.8byte	.LBE1109-.LBB1109
 	.byte	0x6
 	.byte	0x4d
 	.uleb128 0x56
-	.8byte	.LBB1108
-	.8byte	.LBE1108-.LBB1108
+	.8byte	.LBB1110
+	.8byte	.LBE1110-.LBB1110
 	.uleb128 0x5f
-	.4byte	0x1360d
-	.4byte	.LLST53
+	.4byte	0x137e3
+	.4byte	.LLST57
 	.byte	0
 	.byte	0
 	.byte	0
@@ -41036,428 +41730,428 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x130ae
-	.8byte	.LBB1114
+	.4byte	0x13284
+	.8byte	.LBB1116
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
-	.2byte	0x658
+	.2byte	0x73d
 	.4byte	0x11280
 	.uleb128 0x54
-	.4byte	0x130d3
+	.4byte	0x132a9
 	.uleb128 0x54
-	.4byte	0x130c8
+	.4byte	0x1329e
 	.uleb128 0x54
-	.4byte	0x130be
+	.4byte	0x13294
 	.uleb128 0x6d
-	.4byte	0x1310c
-	.8byte	.LBB1115
+	.4byte	0x132e2
+	.8byte	.LBB1117
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x13131
+	.4byte	0x13307
 	.uleb128 0x54
-	.4byte	0x13126
+	.4byte	0x132fc
 	.uleb128 0x54
-	.4byte	0x1311c
+	.4byte	0x132f2
 	.uleb128 0x6e
-	.4byte	0x131a9
-	.8byte	.LBB1117
+	.4byte	0x1337f
+	.8byte	.LBB1119
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x111b6
 	.uleb128 0x54
-	.4byte	0x131c4
+	.4byte	0x1339a
 	.uleb128 0x6f
-	.4byte	0x131b9
-	.4byte	.LLST54
+	.4byte	0x1338f
+	.4byte	.LLST58
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x540
 	.uleb128 0x5f
-	.4byte	0x131cf
-	.4byte	.LLST55
+	.4byte	0x133a5
+	.4byte	.LLST59
 	.uleb128 0x5f
-	.4byte	0x131da
-	.4byte	.LLST56
+	.4byte	0x133b0
+	.4byte	.LLST60
 	.uleb128 0x70
-	.4byte	0x135fd
-	.8byte	.LBB1119
-	.8byte	.LBE1119-.LBB1119
+	.4byte	0x137d3
+	.8byte	.LBB1121
+	.8byte	.LBE1121-.LBB1121
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x1111c
 	.uleb128 0x56
-	.8byte	.LBB1120
-	.8byte	.LBE1120-.LBB1120
+	.8byte	.LBB1122
+	.8byte	.LBE1122-.LBB1122
 	.uleb128 0x5f
-	.4byte	0x1360d
-	.4byte	.LLST57
+	.4byte	0x137e3
+	.4byte	.LLST61
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1121
-	.8byte	.LBE1121-.LBB1121
+	.8byte	.LBB1123
+	.8byte	.LBE1123-.LBB1123
 	.4byte	0x11170
 	.uleb128 0x57
-	.4byte	0x131e6
+	.4byte	0x133bc
 	.uleb128 0x5b
-	.4byte	0x13681
-	.8byte	.LBB1122
-	.8byte	.LBE1122-.LBB1122
+	.4byte	0x13857
+	.8byte	.LBB1124
+	.8byte	.LBE1124-.LBB1124
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x1369c
+	.4byte	0x13872
 	.uleb128 0x54
-	.4byte	0x13691
+	.4byte	0x13867
 	.uleb128 0x56
-	.8byte	.LBB1123
-	.8byte	.LBE1123-.LBB1123
+	.8byte	.LBB1125
+	.8byte	.LBE1125-.LBB1125
 	.uleb128 0x57
-	.4byte	0x136a7
+	.4byte	0x1387d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x135d1
-	.8byte	.LBB1124
-	.8byte	.LBE1124-.LBB1124
+	.4byte	0x137a7
+	.8byte	.LBB1126
+	.8byte	.LBE1126-.LBB1126
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x135eb
+	.4byte	0x137c1
 	.uleb128 0x54
-	.4byte	0x135e1
+	.4byte	0x137b7
 	.uleb128 0x5b
-	.4byte	0x136b3
-	.8byte	.LBB1125
-	.8byte	.LBE1125-.LBB1125
+	.4byte	0x13889
+	.8byte	.LBB1127
+	.8byte	.LBE1127-.LBB1127
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x136cd
+	.4byte	0x138a3
 	.uleb128 0x54
-	.4byte	0x136c3
+	.4byte	0x13899
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13175
-	.8byte	.LBB1133
-	.8byte	.LBE1133-.LBB1133
+	.4byte	0x1334b
+	.8byte	.LBB1135
+	.8byte	.LBE1135-.LBB1135
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x11271
 	.uleb128 0x54
-	.4byte	0x13185
+	.4byte	0x1335b
 	.uleb128 0x56
-	.8byte	.LBB1134
-	.8byte	.LBE1134-.LBB1134
+	.8byte	.LBB1136
+	.8byte	.LBE1136-.LBB1136
 	.uleb128 0x5f
-	.4byte	0x13190
-	.4byte	.LLST58
+	.4byte	0x13366
+	.4byte	.LLST62
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x590
 	.4byte	0x1123c
 	.uleb128 0x5f
-	.4byte	0x1319c
-	.4byte	.LLST59
+	.4byte	0x13372
+	.4byte	.LLST63
 	.uleb128 0x5b
-	.4byte	0x13681
-	.8byte	.LBB1136
-	.8byte	.LBE1136-.LBB1136
+	.4byte	0x13857
+	.8byte	.LBB1138
+	.8byte	.LBE1138-.LBB1138
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x1369c
+	.4byte	0x13872
 	.uleb128 0x54
-	.4byte	0x13691
+	.4byte	0x13867
 	.uleb128 0x56
-	.8byte	.LBB1137
-	.8byte	.LBE1137-.LBB1137
+	.8byte	.LBB1139
+	.8byte	.LBE1139-.LBB1139
 	.uleb128 0x57
-	.4byte	0x136a7
+	.4byte	0x1387d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x135fd
-	.8byte	.LBB1138
-	.8byte	.LBE1138-.LBB1138
+	.4byte	0x137d3
+	.8byte	.LBB1140
+	.8byte	.LBE1140-.LBB1140
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB1139
-	.8byte	.LBE1139-.LBB1139
+	.8byte	.LBB1141
+	.8byte	.LBE1141-.LBB1141
 	.uleb128 0x5f
-	.4byte	0x1360d
-	.4byte	.LLST60
+	.4byte	0x137e3
+	.4byte	.LLST64
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL210
-	.4byte	0x14230
+	.8byte	.LVL240
+	.4byte	0x14406
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x130ae
-	.8byte	.LBB1150
+	.4byte	0x13284
+	.8byte	.LBB1152
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
-	.2byte	0x60a
+	.2byte	0x6ef
 	.4byte	0x114a0
 	.uleb128 0x54
-	.4byte	0x130d3
+	.4byte	0x132a9
 	.uleb128 0x54
-	.4byte	0x130c8
+	.4byte	0x1329e
 	.uleb128 0x54
-	.4byte	0x130be
+	.4byte	0x13294
 	.uleb128 0x6d
-	.4byte	0x1310c
-	.8byte	.LBB1151
+	.4byte	0x132e2
+	.8byte	.LBB1153
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x13131
+	.4byte	0x13307
 	.uleb128 0x54
-	.4byte	0x13126
+	.4byte	0x132fc
 	.uleb128 0x54
-	.4byte	0x1311c
+	.4byte	0x132f2
 	.uleb128 0x6e
-	.4byte	0x131a9
-	.8byte	.LBB1153
+	.4byte	0x1337f
+	.8byte	.LBB1155
 	.4byte	.Ldebug_ranges0+0x620
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x113d6
 	.uleb128 0x54
-	.4byte	0x131c4
+	.4byte	0x1339a
 	.uleb128 0x6f
-	.4byte	0x131b9
-	.4byte	.LLST61
+	.4byte	0x1338f
+	.4byte	.LLST65
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x620
 	.uleb128 0x5f
-	.4byte	0x131cf
-	.4byte	.LLST62
+	.4byte	0x133a5
+	.4byte	.LLST66
 	.uleb128 0x5f
-	.4byte	0x131da
-	.4byte	.LLST63
+	.4byte	0x133b0
+	.4byte	.LLST67
 	.uleb128 0x70
-	.4byte	0x135fd
-	.8byte	.LBB1155
-	.8byte	.LBE1155-.LBB1155
+	.4byte	0x137d3
+	.8byte	.LBB1157
+	.8byte	.LBE1157-.LBB1157
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x1133c
 	.uleb128 0x56
-	.8byte	.LBB1156
-	.8byte	.LBE1156-.LBB1156
+	.8byte	.LBB1158
+	.8byte	.LBE1158-.LBB1158
 	.uleb128 0x5f
-	.4byte	0x1360d
-	.4byte	.LLST64
+	.4byte	0x137e3
+	.4byte	.LLST68
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1157
-	.8byte	.LBE1157-.LBB1157
+	.8byte	.LBB1159
+	.8byte	.LBE1159-.LBB1159
 	.4byte	0x11390
 	.uleb128 0x57
-	.4byte	0x131e6
+	.4byte	0x133bc
 	.uleb128 0x5b
-	.4byte	0x13681
-	.8byte	.LBB1158
-	.8byte	.LBE1158-.LBB1158
+	.4byte	0x13857
+	.8byte	.LBB1160
+	.8byte	.LBE1160-.LBB1160
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x1369c
+	.4byte	0x13872
 	.uleb128 0x54
-	.4byte	0x13691
+	.4byte	0x13867
 	.uleb128 0x56
-	.8byte	.LBB1159
-	.8byte	.LBE1159-.LBB1159
+	.8byte	.LBB1161
+	.8byte	.LBE1161-.LBB1161
 	.uleb128 0x57
-	.4byte	0x136a7
+	.4byte	0x1387d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x135d1
-	.8byte	.LBB1160
-	.8byte	.LBE1160-.LBB1160
+	.4byte	0x137a7
+	.8byte	.LBB1162
+	.8byte	.LBE1162-.LBB1162
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x135eb
+	.4byte	0x137c1
 	.uleb128 0x54
-	.4byte	0x135e1
+	.4byte	0x137b7
 	.uleb128 0x5b
-	.4byte	0x136b3
-	.8byte	.LBB1161
-	.8byte	.LBE1161-.LBB1161
+	.4byte	0x13889
+	.8byte	.LBB1163
+	.8byte	.LBE1163-.LBB1163
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x136cd
+	.4byte	0x138a3
 	.uleb128 0x54
-	.4byte	0x136c3
+	.4byte	0x13899
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13175
-	.8byte	.LBB1169
-	.8byte	.LBE1169-.LBB1169
+	.4byte	0x1334b
+	.8byte	.LBB1171
+	.8byte	.LBE1171-.LBB1171
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x11491
 	.uleb128 0x54
-	.4byte	0x13185
+	.4byte	0x1335b
 	.uleb128 0x56
-	.8byte	.LBB1170
-	.8byte	.LBE1170-.LBB1170
+	.8byte	.LBB1172
+	.8byte	.LBE1172-.LBB1172
 	.uleb128 0x5f
-	.4byte	0x13190
-	.4byte	.LLST65
+	.4byte	0x13366
+	.4byte	.LLST69
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x670
 	.4byte	0x1145c
 	.uleb128 0x5f
-	.4byte	0x1319c
-	.4byte	.LLST66
+	.4byte	0x13372
+	.4byte	.LLST70
 	.uleb128 0x5b
-	.4byte	0x13681
-	.8byte	.LBB1172
-	.8byte	.LBE1172-.LBB1172
+	.4byte	0x13857
+	.8byte	.LBB1174
+	.8byte	.LBE1174-.LBB1174
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x1369c
+	.4byte	0x13872
 	.uleb128 0x54
-	.4byte	0x13691
+	.4byte	0x13867
 	.uleb128 0x56
-	.8byte	.LBB1173
-	.8byte	.LBE1173-.LBB1173
+	.8byte	.LBB1175
+	.8byte	.LBE1175-.LBB1175
 	.uleb128 0x57
-	.4byte	0x136a7
+	.4byte	0x1387d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x135fd
-	.8byte	.LBB1174
-	.8byte	.LBE1174-.LBB1174
+	.4byte	0x137d3
+	.8byte	.LBB1176
+	.8byte	.LBE1176-.LBB1176
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB1175
-	.8byte	.LBE1175-.LBB1175
+	.8byte	.LBB1177
+	.8byte	.LBE1177-.LBB1177
 	.uleb128 0x5f
-	.4byte	0x1360d
-	.4byte	.LLST67
+	.4byte	0x137e3
+	.4byte	.LLST71
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL218
-	.4byte	0x14230
+	.8byte	.LVL248
+	.4byte	0x14406
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL51
-	.4byte	0x140ff
+	.8byte	.LVL81
+	.4byte	0x142d5
 	.uleb128 0x4e
-	.8byte	.LVL52
-	.4byte	0x14155
+	.8byte	.LVL82
+	.4byte	0x1432b
 	.uleb128 0x4e
-	.8byte	.LVL53
-	.4byte	0x141e5
+	.8byte	.LVL83
+	.4byte	0x143bb
 	.uleb128 0x4e
-	.8byte	.LVL64
-	.4byte	0x1424a
+	.8byte	.LVL94
+	.4byte	0x14420
 	.uleb128 0x4e
-	.8byte	.LVL67
-	.4byte	0x14090
+	.8byte	.LVL97
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL70
-	.4byte	0x14016
+	.8byte	.LVL100
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL87
-	.4byte	0x141e5
+	.8byte	.LVL117
+	.4byte	0x143bb
 	.uleb128 0x4e
-	.8byte	.LVL88
-	.4byte	0x14256
+	.8byte	.LVL118
+	.4byte	0x1442c
 	.uleb128 0x4e
-	.8byte	.LVL90
-	.4byte	0x1410b
+	.8byte	.LVL120
+	.4byte	0x142e1
 	.uleb128 0x4e
-	.8byte	.LVL97
-	.4byte	0x140ff
+	.8byte	.LVL127
+	.4byte	0x142d5
 	.uleb128 0x4e
-	.8byte	.LVL111
-	.4byte	0x14262
+	.8byte	.LVL141
+	.4byte	0x14438
 	.uleb128 0x4e
-	.8byte	.LVL112
-	.4byte	0x1410b
+	.8byte	.LVL142
+	.4byte	0x142e1
 	.uleb128 0x4e
-	.8byte	.LVL113
-	.4byte	0x1415f
+	.8byte	.LVL143
+	.4byte	0x14335
 	.uleb128 0x4e
-	.8byte	.LVL123
-	.4byte	0x1426e
+	.8byte	.LVL153
+	.4byte	0x14444
 	.uleb128 0x4e
-	.8byte	.LVL124
-	.4byte	0x141e5
+	.8byte	.LVL154
+	.4byte	0x143bb
 	.uleb128 0x4e
-	.8byte	.LVL151
-	.4byte	0x14016
+	.8byte	.LVL181
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL154
-	.4byte	0x14016
+	.8byte	.LVL184
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL156
-	.4byte	0x140ff
+	.8byte	.LVL186
+	.4byte	0x142d5
 	.uleb128 0x4e
-	.8byte	.LVL158
-	.4byte	0x140ff
+	.8byte	.LVL188
+	.4byte	0x142d5
 	.uleb128 0x4e
-	.8byte	.LVL159
-	.4byte	0x14155
+	.8byte	.LVL189
+	.4byte	0x1432b
 	.uleb128 0x4e
-	.8byte	.LVL160
-	.4byte	0x141e5
+	.8byte	.LVL190
+	.4byte	0x143bb
 	.uleb128 0x4e
-	.8byte	.LVL173
-	.4byte	0x14090
+	.8byte	.LVL203
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL176
-	.4byte	0x14090
+	.8byte	.LVL206
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL178
-	.4byte	0x140ff
+	.8byte	.LVL208
+	.4byte	0x142d5
 	.uleb128 0x4e
-	.8byte	.LVL179
-	.4byte	0x141e5
+	.8byte	.LVL209
+	.4byte	0x143bb
 	.uleb128 0x4e
-	.8byte	.LVL187
-	.4byte	0x1424a
+	.8byte	.LVL217
+	.4byte	0x14420
 	.uleb128 0x4e
-	.8byte	.LVL221
-	.4byte	0x1415f
+	.8byte	.LVL251
+	.4byte	0x14335
 	.uleb128 0x4e
-	.8byte	.LVL228
-	.4byte	0x14090
+	.8byte	.LVL258
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL229
-	.4byte	0x1419d
+	.8byte	.LVL259
+	.4byte	0x14373
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
@@ -41471,140 +42165,140 @@ __exitcall_ebc_exit:
 	.uleb128 0x62
 	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x591
+	.2byte	0x676
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x11659
 	.uleb128 0x64
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x591
+	.2byte	0x676
 	.4byte	0xe13f
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x593
+	.2byte	0x678
 	.4byte	0xa55b
 	.byte	0
 	.uleb128 0x4d
 	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0x58b
-	.8byte	.LFB2828
-	.8byte	.LFE2828-.LFB2828
+	.2byte	0x670
+	.8byte	.LFB2829
+	.8byte	.LFE2829-.LFB2829
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x11693
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x58b
+	.2byte	0x670
 	.4byte	0x31bd
-	.4byte	.LLST68
+	.4byte	.LLST72
 	.uleb128 0x4e
-	.8byte	.LVL242
+	.8byte	.LVL272
 	.4byte	0x1208e
 	.byte	0
 	.uleb128 0x4d
 	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0x57f
-	.8byte	.LFB2827
-	.8byte	.LFE2827-.LFB2827
+	.2byte	0x664
+	.8byte	.LFB2828
+	.8byte	.LFE2828-.LFB2828
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x116f3
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x57f
+	.2byte	0x664
 	.4byte	0x31bd
-	.4byte	.LLST8
+	.4byte	.LLST12
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x581
+	.2byte	0x666
 	.4byte	0xe742
 	.uleb128 0x5e
-	.4byte	0x13040
-	.8byte	.LBB930
+	.4byte	0x13216
+	.8byte	.LBB932
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.2byte	0x585
+	.2byte	0x66a
 	.uleb128 0x54
-	.4byte	0x1304c
+	.4byte	0x13222
 	.uleb128 0x4e
-	.8byte	.LVL41
-	.4byte	0x1427a
+	.8byte	.LVL71
+	.4byte	0x14450
 	.byte	0
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x56f
+	.2byte	0x654
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x1171d
 	.uleb128 0x64
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x56f
+	.2byte	0x654
 	.4byte	0xe13f
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x571
+	.2byte	0x656
 	.4byte	0xe418
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0x443
+	.2byte	0x528
 	.4byte	0xc6
-	.8byte	.LFB2825
-	.8byte	.LFE2825-.LFB2825
+	.8byte	.LFB2826
+	.8byte	.LFE2826-.LFB2826
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x11eb6
 	.uleb128 0x51
 	.string	"ptr"
 	.byte	0x1
-	.2byte	0x443
+	.2byte	0x528
 	.4byte	0x443
-	.4byte	.LLST179
+	.4byte	.LLST183
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x445
+	.2byte	0x52a
 	.4byte	0xe47d
-	.4byte	.LLST180
+	.4byte	.LLST184
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x446
+	.2byte	0x52b
 	.4byte	0xe742
 	.uleb128 0x68
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x447
+	.2byte	0x52c
 	.4byte	0xe418
-	.4byte	.LLST181
+	.4byte	.LLST185
 	.uleb128 0x59
 	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x448
+	.2byte	0x52d
 	.4byte	0xc6
-	.4byte	.LLST182
+	.4byte	.LLST186
 	.uleb128 0x59
 	.4byte	.LASF2968
 	.byte	0x1
-	.2byte	0x449
+	.2byte	0x52e
 	.4byte	0xc6
-	.4byte	.LLST183
+	.4byte	.LLST187
 	.uleb128 0x4c
 	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x44a
+	.2byte	0x52f
 	.4byte	0xd8d1
 	.uleb128 0x3
 	.byte	0x91
@@ -41612,34 +42306,34 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0x44b
+	.2byte	0x530
 	.4byte	0xe418
-	.4byte	.LLST184
+	.4byte	.LLST188
 	.uleb128 0x6b
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0x53f
-	.8byte	.L702
+	.2byte	0x624
+	.8byte	.L792
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x1200
 	.4byte	0x1186d
 	.uleb128 0x46
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x489
+	.2byte	0x56e
 	.4byte	0xc6
 	.uleb128 0x56
-	.8byte	.LBB1827
-	.8byte	.LBE1827-.LBB1827
+	.8byte	.LBB1831
+	.8byte	.LBE1831-.LBB1831
 	.uleb128 0x6b
 	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x489
-	.8byte	.L685
+	.2byte	0x56e
+	.8byte	.L775
 	.uleb128 0x4c
 	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x489
+	.2byte	0x56e
 	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
@@ -41647,7 +42341,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x489
+	.2byte	0x56e
 	.4byte	0x194
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x1230
@@ -41655,22 +42349,22 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x489
+	.2byte	0x56e
 	.4byte	0x194
-	.4byte	.LLST198
+	.4byte	.LLST202
 	.uleb128 0x4e
-	.8byte	.LVL840
-	.4byte	0x141fe
+	.8byte	.LVL881
+	.4byte	0x143d4
 	.uleb128 0x4e
-	.8byte	.LVL841
-	.4byte	0x1420a
+	.8byte	.LVL882
+	.4byte	0x143e0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL838
-	.4byte	0x14217
+	.8byte	.LVL879
+	.4byte	0x143ed
 	.uleb128 0x4e
-	.8byte	.LVL842
-	.4byte	0x14223
+	.8byte	.LVL883
+	.4byte	0x143f9
 	.byte	0
 	.byte	0
 	.uleb128 0x61
@@ -41679,20 +42373,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x52e
+	.2byte	0x613
 	.4byte	0xc6
 	.uleb128 0x56
-	.8byte	.LBB1823
-	.8byte	.LBE1823-.LBB1823
+	.8byte	.LBB1827
+	.8byte	.LBE1827-.LBB1827
 	.uleb128 0x6b
 	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x52e
-	.8byte	.L739
+	.2byte	0x613
+	.8byte	.L829
 	.uleb128 0x4c
 	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x52e
+	.2byte	0x613
 	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
@@ -41700,7 +42394,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x52e
+	.2byte	0x613
 	.4byte	0x194
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x11d0
@@ -41708,44 +42402,44 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x52e
+	.2byte	0x613
 	.4byte	0x194
-	.4byte	.LLST197
+	.4byte	.LLST201
 	.uleb128 0x4e
-	.8byte	.LVL831
-	.4byte	0x141fe
+	.8byte	.LVL872
+	.4byte	0x143d4
 	.uleb128 0x4e
-	.8byte	.LVL832
-	.4byte	0x1420a
+	.8byte	.LVL873
+	.4byte	0x143e0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL829
-	.4byte	0x14217
+	.8byte	.LVL870
+	.4byte	0x143ed
 	.uleb128 0x4e
-	.8byte	.LVL833
-	.4byte	0x14223
+	.8byte	.LVL874
+	.4byte	0x143f9
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1809
-	.8byte	.LBE1809-.LBB1809
+	.8byte	.LBB1813
+	.8byte	.LBE1813-.LBB1813
 	.4byte	0x119c1
 	.uleb128 0x46
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x55b
+	.2byte	0x640
 	.4byte	0xc6
 	.uleb128 0x56
-	.8byte	.LBB1810
-	.8byte	.LBE1810-.LBB1810
+	.8byte	.LBB1814
+	.8byte	.LBE1814-.LBB1814
 	.uleb128 0x72
 	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x55b
+	.2byte	0x640
 	.uleb128 0x4c
 	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x55b
+	.2byte	0x640
 	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
@@ -41753,31 +42447,31 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x55b
+	.2byte	0x640
 	.4byte	0x194
 	.uleb128 0x6c
-	.8byte	.LBB1811
-	.8byte	.LBE1811-.LBB1811
+	.8byte	.LBB1815
+	.8byte	.LBE1815-.LBB1815
 	.4byte	0x119a5
 	.uleb128 0x59
 	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x55b
+	.2byte	0x640
 	.4byte	0x194
-	.4byte	.LLST186
+	.4byte	.LLST190
 	.uleb128 0x4e
-	.8byte	.LVL759
-	.4byte	0x141fe
+	.8byte	.LVL800
+	.4byte	0x143d4
 	.uleb128 0x4e
-	.8byte	.LVL760
-	.4byte	0x1420a
+	.8byte	.LVL801
+	.4byte	0x143e0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL757
-	.4byte	0x14217
+	.8byte	.LVL798
+	.4byte	0x143ed
 	.uleb128 0x4e
-	.8byte	.LVL761
-	.4byte	0x14223
+	.8byte	.LVL802
+	.4byte	0x143f9
 	.byte	0
 	.byte	0
 	.uleb128 0x61
@@ -41786,19 +42480,19 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x567
+	.2byte	0x64c
 	.4byte	0xc6
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x1080
 	.uleb128 0x6b
 	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x567
-	.8byte	.L755
+	.2byte	0x64c
+	.8byte	.L845
 	.uleb128 0x4c
 	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x567
+	.2byte	0x64c
 	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
@@ -41806,7 +42500,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x567
+	.2byte	0x64c
 	.4byte	0x194
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x10c0
@@ -41814,30 +42508,30 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x567
+	.2byte	0x64c
 	.4byte	0x194
-	.4byte	.LLST185
+	.4byte	.LLST189
 	.uleb128 0x4e
-	.8byte	.LVL725
-	.4byte	0x141fe
+	.8byte	.LVL766
+	.4byte	0x143d4
 	.uleb128 0x4e
-	.8byte	.LVL726
-	.4byte	0x1420a
+	.8byte	.LVL767
+	.4byte	0x143e0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL723
-	.4byte	0x14217
+	.8byte	.LVL764
+	.4byte	0x143ed
 	.uleb128 0x4e
-	.8byte	.LVL727
-	.4byte	0x14223
+	.8byte	.LVL768
+	.4byte	0x143f9
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
 	.4byte	0x11eb6
-	.8byte	.LBB1803
+	.8byte	.LBB1807
 	.4byte	.Ldebug_ranges0+0x1100
 	.byte	0x1
-	.2byte	0x503
+	.2byte	0x5e8
 	.4byte	0x11aa8
 	.uleb128 0x54
 	.4byte	0x11edf
@@ -41864,514 +42558,514 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12d46
-	.8byte	.LBB1812
-	.8byte	.LBE1812-.LBB1812
+	.4byte	0x12f1c
+	.8byte	.LBB1816
+	.8byte	.LBE1816-.LBB1816
 	.byte	0x1
-	.2byte	0x564
+	.2byte	0x649
 	.4byte	0x11af3
 	.uleb128 0x54
-	.4byte	0x12d61
+	.4byte	0x12f37
 	.uleb128 0x54
-	.4byte	0x12d56
+	.4byte	0x12f2c
 	.uleb128 0x56
-	.8byte	.LBB1813
-	.8byte	.LBE1813-.LBB1813
+	.8byte	.LBB1817
+	.8byte	.LBE1817-.LBB1817
 	.uleb128 0x57
-	.4byte	0x12d6c
+	.4byte	0x12f42
 	.uleb128 0x4e
-	.8byte	.LVL762
-	.4byte	0x13e8e
+	.8byte	.LVL803
+	.4byte	0x14064
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x129ec
-	.8byte	.LBB1814
+	.4byte	0x12bc2
+	.8byte	.LBB1818
 	.4byte	.Ldebug_ranges0+0x1140
 	.byte	0x1
-	.2byte	0x4a6
+	.2byte	0x58b
 	.4byte	0x11bb9
 	.uleb128 0x54
-	.4byte	0x12a29
+	.4byte	0x12bff
 	.uleb128 0x54
-	.4byte	0x12a29
+	.4byte	0x12bff
 	.uleb128 0x54
-	.4byte	0x12a29
+	.4byte	0x12bff
 	.uleb128 0x54
-	.4byte	0x12a35
+	.4byte	0x12c0b
 	.uleb128 0x54
-	.4byte	0x12a1d
+	.4byte	0x12bf3
 	.uleb128 0x54
-	.4byte	0x12a11
+	.4byte	0x12be7
 	.uleb128 0x54
-	.4byte	0x12a05
+	.4byte	0x12bdb
 	.uleb128 0x54
-	.4byte	0x129f9
+	.4byte	0x12bcf
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x1140
 	.uleb128 0x57
-	.4byte	0x12a41
+	.4byte	0x12c17
 	.uleb128 0x5f
-	.4byte	0x12a4d
-	.4byte	.LLST187
+	.4byte	0x12c23
+	.4byte	.LLST191
 	.uleb128 0x57
-	.4byte	0x12a59
+	.4byte	0x12c2f
 	.uleb128 0x5f
-	.4byte	0x12a65
-	.4byte	.LLST188
+	.4byte	0x12c3b
+	.4byte	.LLST192
 	.uleb128 0x5f
-	.4byte	0x12a71
-	.4byte	.LLST189
+	.4byte	0x12c47
+	.4byte	.LLST193
 	.uleb128 0x57
-	.4byte	0x12a7d
+	.4byte	0x12c53
 	.uleb128 0x57
-	.4byte	0x12a89
+	.4byte	0x12c5f
 	.uleb128 0x57
-	.4byte	0x12a95
+	.4byte	0x12c6b
 	.uleb128 0x5f
-	.4byte	0x12aa1
-	.4byte	.LLST190
+	.4byte	0x12c77
+	.4byte	.LLST194
 	.uleb128 0x57
-	.4byte	0x12aad
+	.4byte	0x12c83
 	.uleb128 0x5f
-	.4byte	0x12ab9
-	.4byte	.LLST191
+	.4byte	0x12c8f
+	.4byte	.LLST195
 	.uleb128 0x60
-	.4byte	0x12ac5
+	.4byte	0x12c9b
 	.uleb128 0x1
 	.byte	0x5e
 	.uleb128 0x5f
-	.4byte	0x12acf
-	.4byte	.LLST192
+	.4byte	0x12ca5
+	.4byte	.LLST196
 	.uleb128 0x5f
-	.4byte	0x12ad9
-	.4byte	.LLST193
+	.4byte	0x12caf
+	.4byte	.LLST197
 	.uleb128 0x5f
-	.4byte	0x12ae5
-	.4byte	.LLST194
+	.4byte	0x12cbb
+	.4byte	.LLST198
 	.uleb128 0x5f
-	.4byte	0x12af1
-	.4byte	.LLST195
+	.4byte	0x12cc7
+	.4byte	.LLST199
 	.uleb128 0x5f
-	.4byte	0x12afd
-	.4byte	.LLST196
+	.4byte	0x12cd3
+	.4byte	.LLST200
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12d46
-	.8byte	.LBB1834
-	.8byte	.LBE1834-.LBB1834
+	.4byte	0x12f1c
+	.8byte	.LBB1838
+	.8byte	.LBE1838-.LBB1838
 	.byte	0x1
-	.2byte	0x450
+	.2byte	0x535
 	.4byte	0x11c04
 	.uleb128 0x54
-	.4byte	0x12d61
+	.4byte	0x12f37
 	.uleb128 0x54
-	.4byte	0x12d56
+	.4byte	0x12f2c
 	.uleb128 0x56
-	.8byte	.LBB1835
-	.8byte	.LBE1835-.LBB1835
+	.8byte	.LBB1839
+	.8byte	.LBE1839-.LBB1839
 	.uleb128 0x57
-	.4byte	0x12d6c
+	.4byte	0x12f42
 	.uleb128 0x4e
-	.8byte	.LVL846
-	.4byte	0x13e8e
+	.8byte	.LVL887
+	.4byte	0x14064
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL710
-	.4byte	0x14286
+	.8byte	.LVL751
+	.4byte	0x1445c
 	.uleb128 0x4e
-	.8byte	.LVL711
-	.4byte	0x14292
+	.8byte	.LVL752
+	.4byte	0x14468
 	.uleb128 0x4e
-	.8byte	.LVL712
-	.4byte	0x1424a
+	.8byte	.LVL753
+	.4byte	0x14420
 	.uleb128 0x4e
-	.8byte	.LVL730
-	.4byte	0x140f3
+	.8byte	.LVL771
+	.4byte	0x142c9
 	.uleb128 0x4e
-	.8byte	.LVL731
-	.4byte	0x14016
+	.8byte	.LVL772
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL732
-	.4byte	0x1429e
+	.8byte	.LVL773
+	.4byte	0x14474
 	.uleb128 0x4e
-	.8byte	.LVL733
-	.4byte	0x14155
+	.8byte	.LVL774
+	.4byte	0x1432b
 	.uleb128 0x4e
-	.8byte	.LVL734
-	.4byte	0x14155
+	.8byte	.LVL775
+	.4byte	0x1432b
 	.uleb128 0x4e
-	.8byte	.LVL735
-	.4byte	0x142aa
+	.8byte	.LVL776
+	.4byte	0x14480
 	.uleb128 0x4e
-	.8byte	.LVL736
+	.8byte	.LVL777
 	.4byte	0x11f3a
 	.uleb128 0x4e
-	.8byte	.LVL738
-	.4byte	0x14016
+	.8byte	.LVL779
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL739
-	.4byte	0x1230e
+	.8byte	.LVL780
+	.4byte	0x12328
 	.uleb128 0x4e
-	.8byte	.LVL742
-	.4byte	0x14016
+	.8byte	.LVL783
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL743
-	.4byte	0x1415f
+	.8byte	.LVL784
+	.4byte	0x14335
 	.uleb128 0x4e
-	.8byte	.LVL744
-	.4byte	0x14292
+	.8byte	.LVL785
+	.4byte	0x14468
 	.uleb128 0x4e
-	.8byte	.LVL746
-	.4byte	0x1424a
+	.8byte	.LVL787
+	.4byte	0x14420
 	.uleb128 0x4e
-	.8byte	.LVL751
-	.4byte	0x14016
+	.8byte	.LVL792
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL753
+	.8byte	.LVL794
 	.4byte	0x11f3a
 	.uleb128 0x4e
-	.8byte	.LVL754
-	.4byte	0x14090
+	.8byte	.LVL795
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL756
-	.4byte	0x14292
+	.8byte	.LVL797
+	.4byte	0x14468
 	.uleb128 0x4e
-	.8byte	.LVL766
-	.4byte	0x1429e
+	.8byte	.LVL807
+	.4byte	0x14474
 	.uleb128 0x4e
-	.8byte	.LVL767
-	.4byte	0x14155
+	.8byte	.LVL808
+	.4byte	0x1432b
 	.uleb128 0x4e
-	.8byte	.LVL768
-	.4byte	0x14292
+	.8byte	.LVL809
+	.4byte	0x14468
 	.uleb128 0x4e
-	.8byte	.LVL769
-	.4byte	0x1424a
+	.8byte	.LVL810
+	.4byte	0x14420
 	.uleb128 0x4e
-	.8byte	.LVL770
-	.4byte	0x12c61
+	.8byte	.LVL811
+	.4byte	0x12e37
 	.uleb128 0x4e
-	.8byte	.LVL771
-	.4byte	0x142aa
+	.8byte	.LVL812
+	.4byte	0x14480
 	.uleb128 0x4e
-	.8byte	.LVL772
-	.4byte	0x14016
+	.8byte	.LVL813
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL773
-	.4byte	0x1230e
+	.8byte	.LVL814
+	.4byte	0x12328
 	.uleb128 0x4e
-	.8byte	.LVL774
-	.4byte	0x14090
+	.8byte	.LVL815
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL793
-	.4byte	0x14016
+	.8byte	.LVL834
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL794
-	.4byte	0x1230e
+	.8byte	.LVL835
+	.4byte	0x12328
 	.uleb128 0x4e
-	.8byte	.LVL795
-	.4byte	0x140f3
+	.8byte	.LVL836
+	.4byte	0x142c9
 	.uleb128 0x4e
-	.8byte	.LVL798
-	.4byte	0x140f3
+	.8byte	.LVL839
+	.4byte	0x142c9
 	.uleb128 0x4e
-	.8byte	.LVL800
-	.4byte	0x13f4c
+	.8byte	.LVL841
+	.4byte	0x14122
 	.uleb128 0x4e
-	.8byte	.LVL801
-	.4byte	0x14016
+	.8byte	.LVL842
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL804
-	.4byte	0x14016
+	.8byte	.LVL845
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL811
+	.8byte	.LVL852
 	.4byte	0x11f3a
 	.uleb128 0x4e
-	.8byte	.LVL815
-	.4byte	0x142b6
+	.8byte	.LVL856
+	.4byte	0x1448c
 	.uleb128 0x4e
-	.8byte	.LVL816
-	.4byte	0x14016
+	.8byte	.LVL857
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL819
-	.4byte	0x14016
+	.8byte	.LVL860
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL820
-	.4byte	0x142b6
+	.8byte	.LVL861
+	.4byte	0x1448c
 	.uleb128 0x4e
-	.8byte	.LVL821
-	.4byte	0x1415f
+	.8byte	.LVL862
+	.4byte	0x14335
 	.uleb128 0x4e
-	.8byte	.LVL822
-	.4byte	0x14155
+	.8byte	.LVL863
+	.4byte	0x1432b
 	.uleb128 0x4e
-	.8byte	.LVL823
-	.4byte	0x14155
+	.8byte	.LVL864
+	.4byte	0x1432b
 	.uleb128 0x4e
-	.8byte	.LVL824
-	.4byte	0x14155
+	.8byte	.LVL865
+	.4byte	0x1432b
 	.uleb128 0x4e
-	.8byte	.LVL827
-	.4byte	0x14016
+	.8byte	.LVL868
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL828
-	.4byte	0x12b9a
+	.8byte	.LVL869
+	.4byte	0x12d70
 	.uleb128 0x4e
-	.8byte	.LVL835
-	.4byte	0x13f4c
+	.8byte	.LVL876
+	.4byte	0x14122
 	.uleb128 0x4e
-	.8byte	.LVL844
-	.4byte	0x14155
+	.8byte	.LVL885
+	.4byte	0x1432b
 	.uleb128 0x4e
-	.8byte	.LVL848
-	.4byte	0x14090
+	.8byte	.LVL889
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL849
-	.4byte	0x13f4c
+	.8byte	.LVL890
+	.4byte	0x14122
 	.uleb128 0x4e
-	.8byte	.LVL850
-	.4byte	0x13f4c
+	.8byte	.LVL891
+	.4byte	0x14122
 	.uleb128 0x4e
-	.8byte	.LVL852
-	.4byte	0x1419d
+	.8byte	.LVL893
+	.4byte	0x14373
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0x42c
+	.2byte	0x511
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x11f3a
 	.uleb128 0x64
 	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0x42c
+	.2byte	0x511
 	.4byte	0x4669
 	.uleb128 0x64
 	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0x42c
+	.2byte	0x511
 	.4byte	0x4669
 	.uleb128 0x64
 	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0x42c
+	.2byte	0x511
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x42e
+	.2byte	0x513
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0x42f
+	.2byte	0x514
 	.4byte	0x155
 	.uleb128 0x46
 	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0x42f
+	.2byte	0x514
 	.4byte	0x155
 	.uleb128 0x46
 	.4byte	.LASF3085
 	.byte	0x1
-	.2byte	0x430
+	.2byte	0x515
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0x431
+	.2byte	0x516
 	.4byte	0x466f
 	.uleb128 0x46
 	.4byte	.LASF3087
 	.byte	0x1
-	.2byte	0x432
+	.2byte	0x517
 	.4byte	0x466f
 	.uleb128 0x72
 	.4byte	.LASF3088
 	.byte	0x1
-	.2byte	0x43f
+	.2byte	0x524
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x3d2
+	.2byte	0x4b7
 	.4byte	0xc6
-	.8byte	.LFB2823
-	.8byte	.LFE2823-.LFB2823
+	.8byte	.LFB2824
+	.8byte	.LFE2824-.LFB2824
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x1208e
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x3d2
+	.2byte	0x4b7
 	.4byte	0xe47d
-	.4byte	.LLST69
+	.4byte	.LLST73
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x3d4
+	.2byte	0x4b9
 	.4byte	0xe742
 	.uleb128 0x59
 	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x3d5
+	.2byte	0x4ba
 	.4byte	0xc6
-	.4byte	.LLST70
+	.4byte	.LLST74
 	.uleb128 0x69
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x3d6
+	.2byte	0x4bb
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x64
 	.uleb128 0x53
-	.4byte	0x12fbb
-	.8byte	.LBB1204
-	.8byte	.LBE1204-.LBB1204
+	.4byte	0x13191
+	.8byte	.LBB1206
+	.8byte	.LBE1206-.LBB1206
 	.byte	0x1
-	.2byte	0x3d9
+	.2byte	0x4be
 	.4byte	0x11fbd
 	.uleb128 0x54
-	.4byte	0x12fd6
+	.4byte	0x131ac
 	.uleb128 0x54
-	.4byte	0x12fcb
+	.4byte	0x131a1
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL248
-	.4byte	0x14016
+	.8byte	.LVL278
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL249
-	.4byte	0x142c2
+	.8byte	.LVL279
+	.4byte	0x14498
 	.uleb128 0x4e
-	.8byte	.LVL253
-	.4byte	0x14090
+	.8byte	.LVL283
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL254
-	.4byte	0x14016
+	.8byte	.LVL284
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL256
-	.4byte	0x142c2
+	.8byte	.LVL286
+	.4byte	0x14498
 	.uleb128 0x4e
-	.8byte	.LVL257
-	.4byte	0x14090
+	.8byte	.LVL287
+	.4byte	0x14266
 	.uleb128 0x4e
-	.8byte	.LVL258
-	.4byte	0x142c2
+	.8byte	.LVL288
+	.4byte	0x14498
 	.uleb128 0x4e
-	.8byte	.LVL259
-	.4byte	0x142c2
+	.8byte	.LVL289
+	.4byte	0x14498
 	.uleb128 0x4e
-	.8byte	.LVL260
-	.4byte	0x142c2
+	.8byte	.LVL290
+	.4byte	0x14498
 	.uleb128 0x4e
-	.8byte	.LVL261
-	.4byte	0x142c2
+	.8byte	.LVL291
+	.4byte	0x14498
 	.uleb128 0x4e
-	.8byte	.LVL262
-	.4byte	0x142c2
+	.8byte	.LVL292
+	.4byte	0x14498
 	.uleb128 0x4e
-	.8byte	.LVL263
-	.4byte	0x142c2
+	.8byte	.LVL293
+	.4byte	0x14498
 	.uleb128 0x4e
-	.8byte	.LVL264
-	.4byte	0x142c2
+	.8byte	.LVL294
+	.4byte	0x14498
 	.uleb128 0x4e
-	.8byte	.LVL265
-	.4byte	0x142c2
+	.8byte	.LVL295
+	.4byte	0x14498
 	.uleb128 0x4e
-	.8byte	.LVL266
-	.4byte	0x14016
+	.8byte	.LVL296
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL267
-	.4byte	0x1419d
+	.8byte	.LVL297
+	.4byte	0x14373
 	.byte	0
 	.uleb128 0x4d
 	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x3ad
-	.8byte	.LFB2822
-	.8byte	.LFE2822-.LFB2822
+	.2byte	0x492
+	.8byte	.LFB2823
+	.8byte	.LFE2823-.LFB2823
 	.uleb128 0x1
 	.byte	0x9c
 	.4byte	0x12147
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x3af
+	.2byte	0x494
 	.4byte	0xe742
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x3b0
+	.2byte	0x495
 	.4byte	0xe13f
 	.uleb128 0x4e
-	.8byte	.LVL231
-	.4byte	0x140c1
+	.8byte	.LVL261
+	.4byte	0x14297
 	.uleb128 0x4e
-	.8byte	.LVL232
-	.4byte	0x14016
+	.8byte	.LVL262
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL233
-	.4byte	0x1415f
+	.8byte	.LVL263
+	.4byte	0x14335
 	.uleb128 0x4e
-	.8byte	.LVL234
-	.4byte	0x1415f
+	.8byte	.LVL264
+	.4byte	0x14335
 	.uleb128 0x4e
-	.8byte	.LVL235
-	.4byte	0x14016
+	.8byte	.LVL265
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL236
-	.4byte	0x1407a
+	.8byte	.LVL266
+	.4byte	0x14250
 	.uleb128 0x4e
-	.8byte	.LVL237
-	.4byte	0x140f3
+	.8byte	.LVL267
+	.4byte	0x142c9
 	.uleb128 0x4e
-	.8byte	.LVL238
-	.4byte	0x1415f
+	.8byte	.LVL268
+	.4byte	0x14335
 	.uleb128 0x4e
-	.8byte	.LVL239
-	.4byte	0x1415f
+	.8byte	.LVL269
+	.4byte	0x14335
 	.uleb128 0x4e
-	.8byte	.LVL240
-	.4byte	0x140c1
+	.8byte	.LVL270
+	.4byte	0x14297
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x36d
+	.2byte	0x44b
 	.4byte	0xc6
-	.8byte	.LFB2821
-	.8byte	.LFE2821-.LFB2821
+	.8byte	.LFB2822
+	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x122fe
+	.4byte	0x12318
 	.uleb128 0x58
 	.4byte	.LASF793
 	.byte	0x1
-	.2byte	0x36d
+	.2byte	0x44b
 	.4byte	0x443
-	.4byte	.LLST139
+	.4byte	.LLST143
 	.uleb128 0x69
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x36f
+	.2byte	0x44d
 	.4byte	0xe47d
 	.uleb128 0x1
 	.byte	0x66
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x370
+	.2byte	0x44e
 	.4byte	0xe13f
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x371
+	.2byte	0x44f
 	.4byte	0xe742
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xb30
@@ -42379,112 +43073,118 @@ __exitcall_ebc_exit:
 	.uleb128 0x3f
 	.byte	0x8
 	.byte	0x1
-	.2byte	0x378
+	.2byte	0x456
 	.4byte	0x121ca
 	.uleb128 0x41
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x378
+	.2byte	0x456
 	.4byte	0x19b
 	.uleb128 0x3d
 	.string	"__c"
 	.byte	0x1
-	.2byte	0x378
-	.4byte	0x122fe
+	.2byte	0x456
+	.4byte	0x12318
 	.byte	0
 	.uleb128 0x52
 	.string	"__u"
 	.byte	0x1
-	.2byte	0x378
+	.2byte	0x456
 	.4byte	0x121a8
 	.uleb128 0x5a
-	.4byte	0x1379d
-	.8byte	.LBB1386
+	.4byte	0x13973
+	.8byte	.LBB1390
 	.4byte	.Ldebug_ranges0+0xb70
 	.byte	0x1
-	.2byte	0x378
+	.2byte	0x456
 	.4byte	0x121fe
 	.uleb128 0x54
-	.4byte	0x137c0
+	.4byte	0x13996
 	.uleb128 0x54
-	.4byte	0x137b4
+	.4byte	0x1398a
 	.uleb128 0x54
-	.4byte	0x137aa
+	.4byte	0x13980
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x135fd
-	.8byte	.LBB1389
-	.8byte	.LBE1389-.LBB1389
+	.4byte	0x137d3
+	.8byte	.LBB1393
+	.8byte	.LBE1393-.LBB1393
 	.byte	0x1
-	.2byte	0x378
+	.2byte	0x456
 	.uleb128 0x56
-	.8byte	.LBB1390
-	.8byte	.LBE1390-.LBB1390
+	.8byte	.LBB1394
+	.8byte	.LBE1394-.LBB1394
 	.uleb128 0x60
-	.4byte	0x1360d
+	.4byte	0x137e3
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13497
-	.8byte	.LBB1394
+	.4byte	0x1366d
+	.8byte	.LBB1398
 	.4byte	.Ldebug_ranges0+0xba0
 	.byte	0x1
-	.2byte	0x3a4
+	.2byte	0x489
 	.4byte	0x12288
 	.uleb128 0x54
-	.4byte	0x134a8
+	.4byte	0x1367e
 	.uleb128 0x5e
-	.4byte	0x134b5
-	.8byte	.LBB1396
+	.4byte	0x1368b
+	.8byte	.LBB1400
 	.4byte	.Ldebug_ranges0+0xbd0
 	.byte	0xd
 	.2byte	0x240
 	.uleb128 0x54
-	.4byte	0x134d1
+	.4byte	0x136a7
 	.uleb128 0x54
-	.4byte	0x134c6
+	.4byte	0x1369c
 	.uleb128 0x4e
-	.8byte	.LVL455
-	.4byte	0x142ce
+	.8byte	.LVL495
+	.4byte	0x144a4
 	.uleb128 0x4e
-	.8byte	.LVL458
-	.4byte	0x142ce
+	.8byte	.LVL500
+	.4byte	0x144a4
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL449
-	.4byte	0x13d8b
+	.8byte	.LVL488
+	.4byte	0x13f61
 	.uleb128 0x4e
-	.8byte	.LVL450
-	.4byte	0x142db
+	.8byte	.LVL489
+	.4byte	0x12a67
 	.uleb128 0x4e
-	.8byte	.LVL451
-	.4byte	0x141fe
+	.8byte	.LVL490
+	.4byte	0x144b1
 	.uleb128 0x4e
-	.8byte	.LVL452
-	.4byte	0x142e5
+	.8byte	.LVL491
+	.4byte	0x143d4
 	.uleb128 0x4e
-	.8byte	.LVL453
-	.4byte	0x13d8b
+	.8byte	.LVL492
+	.4byte	0x144bb
 	.uleb128 0x4e
-	.8byte	.LVL454
-	.4byte	0x12891
+	.8byte	.LVL493
+	.4byte	0x13f61
 	.uleb128 0x4e
-	.8byte	.LVL456
-	.4byte	0x13d8b
+	.8byte	.LVL494
+	.4byte	0x12532
 	.uleb128 0x4e
-	.8byte	.LVL457
-	.4byte	0x126a7
+	.8byte	.LVL496
+	.4byte	0x13f61
 	.uleb128 0x4e
-	.8byte	.LVL459
-	.4byte	0x124bd
+	.8byte	.LVL497
+	.4byte	0x1271c
+	.uleb128 0x4e
+	.8byte	.LVL498
+	.4byte	0x13f61
+	.uleb128 0x4e
+	.8byte	.LVL499
+	.4byte	0x12906
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x1230e
+	.4byte	0x12328
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
@@ -42492,139 +43192,163 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x32d
-	.8byte	.LFB2820
-	.8byte	.LFE2820-.LFB2820
+	.2byte	0x3fa
+	.8byte	.LFB2821
+	.8byte	.LFE2821-.LFB2821
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1245f
+	.4byte	0x124d4
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x32d
+	.2byte	0x3fa
 	.4byte	0xe47d
-	.4byte	.LLST138
+	.4byte	.LLST142
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x32f
+	.2byte	0x3fc
 	.4byte	0xe13f
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x330
+	.2byte	0x3fd
 	.4byte	0xe742
 	.uleb128 0x55
 	.4byte	.LASF3024
 	.4byte	0xb92b
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34742
+	.8byte	__func__.34773
 	.uleb128 0x53
-	.4byte	0x1245f
-	.8byte	.LBB1379
-	.8byte	.LBE1379-.LBB1379
+	.4byte	0x124d4
+	.8byte	.LBB1381
+	.8byte	.LBE1381-.LBB1381
 	.byte	0x1
-	.2byte	0x354
-	.4byte	0x1239b
+	.2byte	0x432
+	.4byte	0x123b5
 	.uleb128 0x54
-	.4byte	0x12478
+	.4byte	0x124ed
 	.uleb128 0x54
-	.4byte	0x1246c
+	.4byte	0x124e1
 	.uleb128 0x4e
-	.8byte	.LVL430
-	.4byte	0x13d8b
+	.8byte	.LVL460
+	.4byte	0x13f61
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1245f
-	.8byte	.LBB1381
-	.8byte	.LBE1381-.LBB1381
+	.4byte	0x124d4
+	.8byte	.LBB1383
+	.8byte	.LBE1383-.LBB1383
 	.byte	0x1
-	.2byte	0x361
-	.4byte	0x123cf
+	.2byte	0x419
+	.4byte	0x123e9
 	.uleb128 0x54
-	.4byte	0x12478
+	.4byte	0x124ed
 	.uleb128 0x54
-	.4byte	0x1246c
+	.4byte	0x124e1
 	.uleb128 0x4e
-	.8byte	.LVL435
-	.4byte	0x13d8b
+	.8byte	.LVL465
+	.4byte	0x13f61
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1245f
-	.8byte	.LBB1383
-	.8byte	.LBE1383-.LBB1383
+	.4byte	0x124d4
+	.8byte	.LBB1385
+	.8byte	.LBE1385-.LBB1385
 	.byte	0x1
-	.2byte	0x33b
-	.4byte	0x12403
+	.2byte	0x407
+	.4byte	0x1241d
 	.uleb128 0x54
-	.4byte	0x12478
+	.4byte	0x124ed
 	.uleb128 0x54
-	.4byte	0x1246c
+	.4byte	0x124e1
 	.uleb128 0x4e
-	.8byte	.LVL440
-	.4byte	0x13d8b
+	.8byte	.LVL470
+	.4byte	0x13f61
 	.byte	0
+	.uleb128 0x53
+	.4byte	0x124d4
+	.8byte	.LBB1387
+	.8byte	.LBE1387-.LBB1387
+	.byte	0x1
+	.2byte	0x43f
+	.4byte	0x12451
+	.uleb128 0x54
+	.4byte	0x124ed
+	.uleb128 0x54
+	.4byte	0x124e1
 	.uleb128 0x4e
-	.8byte	.LVL429
-	.4byte	0x124bd
+	.8byte	.LVL475
+	.4byte	0x13f61
+	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL431
-	.4byte	0x124bd
+	.8byte	.LVL459
+	.4byte	0x12532
 	.uleb128 0x4e
-	.8byte	.LVL434
-	.4byte	0x126a7
+	.8byte	.LVL461
+	.4byte	0x12532
 	.uleb128 0x4e
-	.8byte	.LVL436
-	.4byte	0x126a7
+	.8byte	.LVL464
+	.4byte	0x12a67
 	.uleb128 0x4e
-	.8byte	.LVL439
-	.4byte	0x12891
+	.8byte	.LVL466
+	.4byte	0x12a67
 	.uleb128 0x4e
-	.8byte	.LVL441
-	.4byte	0x12891
+	.8byte	.LVL469
+	.4byte	0x12906
 	.uleb128 0x4e
-	.8byte	.LVL444
-	.4byte	0x142f1
+	.8byte	.LVL471
+	.4byte	0x12906
+	.uleb128 0x4e
+	.8byte	.LVL474
+	.4byte	0x1271c
+	.uleb128 0x4e
+	.8byte	.LVL476
+	.4byte	0x1271c
+	.uleb128 0x4e
+	.8byte	.LVL479
+	.4byte	0x141ec
+	.uleb128 0x4e
+	.8byte	.LVL482
+	.4byte	0x141ec
 	.byte	0
 	.uleb128 0x65
 	.4byte	.LASF3096
 	.byte	0x1
-	.2byte	0x327
+	.2byte	0x3f4
 	.byte	0x1
-	.4byte	0x12485
+	.4byte	0x124fa
 	.uleb128 0x64
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x327
+	.2byte	0x3f4
 	.4byte	0xe13f
 	.uleb128 0x64
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x327
+	.2byte	0x3f4
 	.4byte	0xe742
 	.byte	0
 	.uleb128 0x65
 	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x31c
+	.2byte	0x3e9
 	.byte	0x1
-	.4byte	0x124b7
+	.4byte	0x1252c
 	.uleb128 0x64
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x31c
+	.2byte	0x3e9
 	.4byte	0xe13f
 	.uleb128 0x64
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x31c
+	.2byte	0x3e9
 	.4byte	0xe742
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x31e
-	.4byte	0x124b7
+	.2byte	0x3eb
+	.4byte	0x1252c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -42632,434 +43356,590 @@ __exitcall_ebc_exit:
 	.uleb128 0x65
 	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x312
+	.2byte	0x3df
 	.byte	0x1
-	.4byte	0x124fb
+	.4byte	0x12570
 	.uleb128 0x64
 	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x312
+	.2byte	0x3df
 	.4byte	0xc0ad
 	.uleb128 0x64
 	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x313
+	.2byte	0x3e0
 	.4byte	0xaab
 	.uleb128 0x64
 	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x313
+	.2byte	0x3e0
 	.4byte	0xaab
 	.uleb128 0x64
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x314
+	.2byte	0x3e1
 	.4byte	0xe742
 	.byte	0
 	.uleb128 0x65
 	.4byte	.LASF3102
 	.byte	0x1
-	.2byte	0x2e8
+	.2byte	0x3b5
 	.byte	0x1
-	.4byte	0x125d1
+	.4byte	0x12646
 	.uleb128 0x64
 	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x2e8
+	.2byte	0x3b5
 	.4byte	0xc0ad
 	.uleb128 0x64
 	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x2e9
+	.2byte	0x3b6
 	.4byte	0xaab
 	.uleb128 0x64
 	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x2e9
+	.2byte	0x3b6
 	.4byte	0xaab
 	.uleb128 0x64
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x2ea
+	.2byte	0x3b7
 	.4byte	0xe742
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x2ec
+	.2byte	0x3b9
 	.4byte	0xe13f
 	.uleb128 0x46
 	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x2ed
+	.2byte	0x3ba
 	.4byte	0x155
 	.uleb128 0x46
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x2ed
+	.2byte	0x3ba
 	.4byte	0x155
 	.uleb128 0x46
 	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x2ed
+	.2byte	0x3ba
 	.4byte	0x466f
 	.uleb128 0x46
 	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x2ed
+	.2byte	0x3ba
 	.4byte	0x466f
 	.uleb128 0x46
 	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x2ee
+	.2byte	0x3bb
 	.4byte	0xc0ad
 	.uleb128 0x46
 	.4byte	.LASF2896
 	.byte	0x1
-	.2byte	0x2ef
+	.2byte	0x3bc
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF261
 	.byte	0x1
-	.2byte	0x2ef
+	.2byte	0x3bc
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x2f0
+	.2byte	0x3bd
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x2f0
+	.2byte	0x3bd
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x2f1
+	.2byte	0x3be
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2856
 	.byte	0x1
-	.2byte	0x2f2
+	.2byte	0x3bf
 	.4byte	0xc0ad
 	.uleb128 0x46
 	.4byte	.LASF2942
 	.byte	0x1
-	.2byte	0x2f3
+	.2byte	0x3c0
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x65
 	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x2bf
+	.2byte	0x38c
 	.byte	0x1
-	.4byte	0x126a7
+	.4byte	0x1271c
 	.uleb128 0x64
 	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x2bf
+	.2byte	0x38c
 	.4byte	0xc0ad
 	.uleb128 0x64
 	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x2c0
+	.2byte	0x38d
 	.4byte	0xaab
 	.uleb128 0x64
 	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x2c0
+	.2byte	0x38d
 	.4byte	0xaab
 	.uleb128 0x64
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x2c1
+	.2byte	0x38e
 	.4byte	0xe742
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x2c3
+	.2byte	0x390
 	.4byte	0xe13f
 	.uleb128 0x46
 	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x2c4
+	.2byte	0x391
 	.4byte	0x13a
 	.uleb128 0x46
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x2c4
+	.2byte	0x391
 	.4byte	0x13a
 	.uleb128 0x46
 	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x2c4
+	.2byte	0x391
 	.4byte	0xaab
 	.uleb128 0x46
 	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x2c4
+	.2byte	0x391
 	.4byte	0xaab
 	.uleb128 0x46
 	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x2c5
+	.2byte	0x392
 	.4byte	0xc0ad
 	.uleb128 0x46
 	.4byte	.LASF2896
 	.byte	0x1
-	.2byte	0x2c6
+	.2byte	0x393
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF261
 	.byte	0x1
-	.2byte	0x2c6
+	.2byte	0x393
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x2c7
+	.2byte	0x394
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x2c7
+	.2byte	0x394
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x2c8
+	.2byte	0x395
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2856
 	.byte	0x1
-	.2byte	0x2c9
+	.2byte	0x396
 	.4byte	0xc0ad
 	.uleb128 0x46
 	.4byte	.LASF2942
 	.byte	0x1
-	.2byte	0x2ca
+	.2byte	0x397
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x65
 	.4byte	.LASF3110
 	.byte	0x1
-	.2byte	0x2b4
+	.2byte	0x381
 	.byte	0x1
-	.4byte	0x126e5
+	.4byte	0x1275a
 	.uleb128 0x64
 	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x2b4
+	.2byte	0x381
 	.4byte	0xc0ad
 	.uleb128 0x64
 	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x2b5
+	.2byte	0x382
 	.4byte	0xaab
 	.uleb128 0x64
 	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x2b5
+	.2byte	0x382
 	.4byte	0xaab
 	.uleb128 0x64
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x2b6
+	.2byte	0x383
 	.4byte	0xe742
 	.byte	0
 	.uleb128 0x65
 	.4byte	.LASF3111
 	.byte	0x1
-	.2byte	0x290
+	.2byte	0x35d
 	.byte	0x1
-	.4byte	0x127bb
+	.4byte	0x12830
 	.uleb128 0x64
 	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x290
+	.2byte	0x35d
 	.4byte	0xc0ad
 	.uleb128 0x64
 	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x291
+	.2byte	0x35e
 	.4byte	0xaab
 	.uleb128 0x64
 	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x291
+	.2byte	0x35e
 	.4byte	0xaab
 	.uleb128 0x64
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x292
+	.2byte	0x35f
 	.4byte	0xe742
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x294
+	.2byte	0x361
 	.4byte	0xe13f
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x295
+	.2byte	0x362
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x295
+	.2byte	0x362
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2896
 	.byte	0x1
-	.2byte	0x296
+	.2byte	0x363
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF261
 	.byte	0x1
-	.2byte	0x297
+	.2byte	0x364
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x298
+	.2byte	0x365
 	.4byte	0x13a
 	.uleb128 0x46
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x298
+	.2byte	0x365
 	.4byte	0x13a
 	.uleb128 0x46
 	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x298
+	.2byte	0x365
 	.4byte	0xaab
 	.uleb128 0x46
 	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x298
+	.2byte	0x365
 	.4byte	0xaab
 	.uleb128 0x46
 	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x299
+	.2byte	0x366
 	.4byte	0xc0ad
 	.uleb128 0x46
 	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x29a
+	.2byte	0x367
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2856
 	.byte	0x1
-	.2byte	0x29b
+	.2byte	0x368
 	.4byte	0xc0ad
 	.uleb128 0x46
 	.4byte	.LASF2942
 	.byte	0x1
-	.2byte	0x29c
+	.2byte	0x369
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x65
 	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x269
+	.2byte	0x336
 	.byte	0x1
-	.4byte	0x12891
+	.4byte	0x12906
 	.uleb128 0x64
 	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x269
+	.2byte	0x336
 	.4byte	0xc0ad
 	.uleb128 0x64
 	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x26a
+	.2byte	0x337
 	.4byte	0xaab
 	.uleb128 0x64
 	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x26a
+	.2byte	0x337
 	.4byte	0xaab
 	.uleb128 0x64
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x26b
+	.2byte	0x338
 	.4byte	0xe742
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x26d
+	.2byte	0x33a
 	.4byte	0xe13f
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x26e
+	.2byte	0x33b
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x26e
+	.2byte	0x33b
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2896
 	.byte	0x1
-	.2byte	0x26f
+	.2byte	0x33c
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF261
 	.byte	0x1
-	.2byte	0x270
+	.2byte	0x33d
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x271
+	.2byte	0x33e
 	.4byte	0x155
 	.uleb128 0x46
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x271
+	.2byte	0x33e
 	.4byte	0x155
 	.uleb128 0x46
 	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x271
+	.2byte	0x33e
 	.4byte	0x466f
 	.uleb128 0x46
 	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x271
+	.2byte	0x33e
 	.4byte	0x466f
 	.uleb128 0x46
 	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x272
+	.2byte	0x33f
 	.4byte	0xc0ad
 	.uleb128 0x46
 	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x273
+	.2byte	0x340
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2856
 	.byte	0x1
-	.2byte	0x274
+	.2byte	0x341
 	.4byte	0xc0ad
 	.uleb128 0x46
 	.4byte	.LASF2942
 	.byte	0x1
-	.2byte	0x275
+	.2byte	0x342
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4d
 	.4byte	.LASF3113
 	.byte	0x1
+	.2byte	0x268
+	.8byte	.LFB2812
+	.8byte	.LFE2812-.LFB2812
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x12a67
+	.uleb128 0x6a
+	.4byte	.LASF3099
+	.byte	0x1
+	.2byte	0x268
+	.4byte	0xc0ad
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x6a
+	.4byte	.LASF3100
+	.byte	0x1
+	.2byte	0x268
+	.4byte	0xaab
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x6a
+	.4byte	.LASF3101
+	.byte	0x1
+	.2byte	0x268
+	.4byte	0xaab
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x6a
+	.4byte	.LASF3114
+	.byte	0x1
+	.2byte	0x269
+	.4byte	0xc0ad
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x6a
+	.4byte	.LASF2957
+	.byte	0x1
+	.2byte	0x269
+	.4byte	0xe742
+	.uleb128 0x1
+	.byte	0x54
+	.uleb128 0x46
+	.4byte	.LASF2998
+	.byte	0x1
+	.2byte	0x26b
+	.4byte	0xe13f
+	.uleb128 0x69
+	.string	"i"
+	.byte	0x1
+	.2byte	0x26c
+	.4byte	0xc6
+	.uleb128 0x1
+	.byte	0x5d
+	.uleb128 0x52
+	.string	"j"
+	.byte	0x1
+	.2byte	0x26d
+	.4byte	0xc6
+	.uleb128 0x4c
+	.4byte	.LASF2896
+	.byte	0x1
+	.2byte	0x26e
+	.4byte	0xc6
+	.uleb128 0x1
+	.byte	0x62
+	.uleb128 0x4c
+	.4byte	.LASF261
+	.byte	0x1
+	.2byte	0x26f
+	.4byte	0xc6
+	.uleb128 0x1
+	.byte	0x5b
+	.uleb128 0x59
+	.4byte	.LASF3103
+	.byte	0x1
+	.2byte	0x270
+	.4byte	0x13a
+	.4byte	.LLST6
+	.uleb128 0x59
+	.4byte	.LASF3104
+	.byte	0x1
+	.2byte	0x270
+	.4byte	0x13a
+	.4byte	.LLST7
+	.uleb128 0x46
+	.4byte	.LASF3115
+	.byte	0x1
+	.2byte	0x270
+	.4byte	0x13a
+	.uleb128 0x4c
+	.4byte	.LASF3105
+	.byte	0x1
+	.2byte	0x271
+	.4byte	0xaab
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x4c
+	.4byte	.LASF3106
+	.byte	0x1
+	.2byte	0x271
+	.4byte	0xaab
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x59
+	.4byte	.LASF3107
+	.byte	0x1
+	.2byte	0x272
+	.4byte	0xc0ad
+	.4byte	.LLST8
+	.uleb128 0x46
+	.4byte	.LASF2964
+	.byte	0x1
+	.2byte	0x273
+	.4byte	0x10b
+	.uleb128 0x4c
+	.4byte	.LASF3116
+	.byte	0x1
+	.2byte	0x274
+	.4byte	0xc0ad
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x46
+	.4byte	.LASF3117
+	.byte	0x1
+	.2byte	0x275
+	.4byte	0x10b
+	.uleb128 0x46
+	.4byte	.LASF2856
+	.byte	0x1
+	.2byte	0x276
+	.4byte	0xc0ad
+	.uleb128 0x46
+	.4byte	.LASF2942
+	.byte	0x1
+	.2byte	0x277
+	.4byte	0xc6
+	.uleb128 0x46
+	.4byte	.LASF3118
+	.byte	0x1
+	.2byte	0x278
+	.4byte	0x10b
+	.uleb128 0x46
+	.4byte	.LASF3119
+	.byte	0x1
+	.2byte	0x278
+	.4byte	0x10b
+	.uleb128 0x59
+	.4byte	.LASF3120
+	.byte	0x1
+	.2byte	0x279
+	.4byte	0x13a
+	.4byte	.LLST9
+	.byte	0
+	.uleb128 0x4d
+	.4byte	.LASF3121
+	.byte	0x1
 	.2byte	0x1c3
 	.8byte	.LFB2811
 	.8byte	.LFE2811-.LFB2811
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x129ec
+	.4byte	0x12bc2
 	.uleb128 0x6a
 	.4byte	.LASF3099
 	.byte	0x1
@@ -43164,14 +44044,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x4c
-	.4byte	.LASF3115
+	.4byte	.LASF3116
 	.byte	0x1
 	.2byte	0x1cf
 	.4byte	0xc0ad
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x46
-	.4byte	.LASF3116
+	.4byte	.LASF3117
 	.byte	0x1
 	.2byte	0x1d0
 	.4byte	0x10b
@@ -43186,40 +44066,40 @@ __exitcall_ebc_exit:
 	.2byte	0x1d2
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3117
+	.4byte	.LASF3118
 	.byte	0x1
 	.2byte	0x1d3
 	.4byte	0x10b
 	.uleb128 0x46
-	.4byte	.LASF3118
+	.4byte	.LASF3119
 	.byte	0x1
 	.2byte	0x1d3
 	.4byte	0x10b
 	.uleb128 0x59
-	.4byte	.LASF3119
+	.4byte	.LASF3120
 	.byte	0x1
 	.2byte	0x1d4
 	.4byte	0x13a
 	.4byte	.LLST5
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3120
+	.4byte	.LASF3122
 	.byte	0x1
 	.2byte	0x164
 	.byte	0x1
-	.4byte	0x12b0a
+	.4byte	0x12ce0
 	.uleb128 0x64
-	.4byte	.LASF3121
+	.4byte	.LASF3123
 	.byte	0x1
 	.2byte	0x164
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3122
+	.4byte	.LASF3124
 	.byte	0x1
 	.2byte	0x164
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3123
+	.4byte	.LASF3125
 	.byte	0x1
 	.2byte	0x164
 	.4byte	0xaab
@@ -43249,47 +44129,47 @@ __exitcall_ebc_exit:
 	.2byte	0x167
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3124
+	.4byte	.LASF3126
 	.byte	0x1
 	.2byte	0x168
 	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3125
+	.4byte	.LASF3127
 	.byte	0x1
 	.2byte	0x168
 	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3126
+	.4byte	.LASF3128
 	.byte	0x1
 	.2byte	0x168
 	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3127
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3128
+	.4byte	.LASF3130
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3129
+	.4byte	.LASF3131
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3116
+	.4byte	.LASF3117
 	.byte	0x1
 	.2byte	0x16a
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3115
+	.4byte	.LASF3116
 	.byte	0x1
 	.2byte	0x16b
 	.4byte	0x466f
 	.uleb128 0x46
-	.4byte	.LASF3130
+	.4byte	.LASF3132
 	.byte	0x1
 	.2byte	0x16c
 	.4byte	0x13a
@@ -43325,66 +44205,66 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x74
-	.4byte	.LASF3131
+	.4byte	.LASF3133
 	.byte	0x1
 	.2byte	0x14f
 	.8byte	.LFB2809
 	.8byte	.LFE2809-.LFB2809
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12b9a
+	.4byte	0x12d70
 	.uleb128 0x58
 	.4byte	.LASF2273
 	.byte	0x1
 	.2byte	0x14f
 	.4byte	0x31f0
-	.4byte	.LLST176
+	.4byte	.LLST180
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x151
 	.4byte	0xe47d
-	.4byte	.LLST177
+	.4byte	.LLST181
 	.uleb128 0x59
 	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x152
 	.4byte	0xe742
-	.4byte	.LLST178
+	.4byte	.LLST182
 	.uleb128 0x4e
-	.8byte	.LVL695
-	.4byte	0x1429e
+	.8byte	.LVL736
+	.4byte	0x14474
 	.uleb128 0x4e
-	.8byte	.LVL697
-	.4byte	0x12c61
+	.8byte	.LVL738
+	.4byte	0x12e37
 	.uleb128 0x4e
-	.8byte	.LVL698
-	.4byte	0x142aa
+	.8byte	.LVL739
+	.4byte	0x14480
 	.uleb128 0x4e
-	.8byte	.LVL701
-	.4byte	0x12b9a
+	.8byte	.LVL742
+	.4byte	0x12d70
 	.uleb128 0x4e
-	.8byte	.LVL702
-	.4byte	0x142aa
+	.8byte	.LVL743
+	.4byte	0x14480
 	.byte	0
 	.uleb128 0x74
-	.4byte	.LASF3132
+	.4byte	.LASF3134
 	.byte	0x1
 	.2byte	0x11e
 	.8byte	.LFB2808
 	.8byte	.LFE2808-.LFB2808
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12c61
+	.4byte	0x12e37
 	.uleb128 0x6a
-	.4byte	.LASF3121
+	.4byte	.LASF3123
 	.byte	0x1
 	.2byte	0x11e
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6a
-	.4byte	.LASF3122
+	.4byte	.LASF3124
 	.byte	0x1
 	.2byte	0x11e
 	.4byte	0xaab
@@ -43402,7 +44282,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x11f
 	.4byte	0xe742
-	.4byte	.LLST172
+	.4byte	.LLST176
 	.uleb128 0x4c
 	.4byte	.LASF2896
 	.byte	0x1
@@ -43418,22 +44298,22 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x59
 	.uleb128 0x46
-	.4byte	.LASF3124
+	.4byte	.LASF3126
 	.byte	0x1
 	.2byte	0x122
 	.4byte	0x13a
 	.uleb128 0x59
-	.4byte	.LASF3125
+	.4byte	.LASF3127
 	.byte	0x1
 	.2byte	0x122
 	.4byte	0x13a
-	.4byte	.LLST173
+	.4byte	.LLST177
 	.uleb128 0x59
-	.4byte	.LASF3116
+	.4byte	.LASF3117
 	.byte	0x1
 	.2byte	0x123
 	.4byte	0x155
-	.4byte	.LLST174
+	.4byte	.LLST178
 	.uleb128 0x69
 	.string	"i"
 	.byte	0x1
@@ -43447,37 +44327,37 @@ __exitcall_ebc_exit:
 	.2byte	0x124
 	.4byte	0xc6
 	.uleb128 0x59
-	.4byte	.LASF3130
+	.4byte	.LASF3132
 	.byte	0x1
 	.2byte	0x125
 	.4byte	0x13a
-	.4byte	.LLST175
+	.4byte	.LLST179
 	.byte	0
 	.uleb128 0x75
-	.4byte	.LASF3133
+	.4byte	.LASF3135
 	.byte	0x1
 	.byte	0xd3
 	.8byte	.LFB2807
 	.8byte	.LFE2807-.LFB2807
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12d46
+	.4byte	0x12f1c
 	.uleb128 0x76
-	.4byte	.LASF3121
+	.4byte	.LASF3123
 	.byte	0x1
 	.byte	0xd3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x76
-	.4byte	.LASF3122
+	.4byte	.LASF3124
 	.byte	0x1
 	.byte	0xd3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x76
-	.4byte	.LASF3123
+	.4byte	.LASF3125
 	.byte	0x1
 	.byte	0xd3
 	.4byte	0xaab
@@ -43495,13 +44375,13 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0xd4
 	.4byte	0xe742
-	.4byte	.LLST166
+	.4byte	.LLST170
 	.uleb128 0x77
 	.4byte	.LASF2867
 	.byte	0x1
 	.byte	0xd4
 	.4byte	0xc6
-	.4byte	.LLST167
+	.4byte	.LLST171
 	.uleb128 0x4b
 	.4byte	.LASF2896
 	.byte	0x1
@@ -43517,28 +44397,28 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x78
-	.4byte	.LASF3124
+	.4byte	.LASF3126
 	.byte	0x1
 	.byte	0xd7
 	.4byte	0x13a
 	.uleb128 0x79
-	.4byte	.LASF3125
+	.4byte	.LASF3127
 	.byte	0x1
 	.byte	0xd7
 	.4byte	0x13a
-	.4byte	.LLST168
+	.4byte	.LLST172
 	.uleb128 0x79
-	.4byte	.LASF3126
+	.4byte	.LASF3128
 	.byte	0x1
 	.byte	0xd7
 	.4byte	0x13a
-	.4byte	.LLST169
+	.4byte	.LLST173
 	.uleb128 0x79
-	.4byte	.LASF3116
+	.4byte	.LASF3117
 	.byte	0x1
 	.byte	0xd8
 	.4byte	0x155
-	.4byte	.LLST170
+	.4byte	.LLST174
 	.uleb128 0x7a
 	.string	"i"
 	.byte	0x1
@@ -43552,26 +44432,26 @@ __exitcall_ebc_exit:
 	.byte	0xd9
 	.4byte	0xc6
 	.uleb128 0x79
-	.4byte	.LASF3130
+	.4byte	.LASF3132
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x13a
-	.4byte	.LLST171
+	.4byte	.LLST175
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3134
+	.4byte	.LASF3136
 	.byte	0x1
 	.byte	0xb4
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x12d78
+	.4byte	0x12f4e
 	.uleb128 0x7d
 	.string	"ebc"
 	.byte	0x1
 	.byte	0xb4
 	.4byte	0xe47d
 	.uleb128 0x7e
-	.4byte	.LASF3135
+	.4byte	.LASF3137
 	.byte	0x1
 	.byte	0xb4
 	.4byte	0xc6
@@ -43582,12 +44462,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe742
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3136
+	.4byte	.LASF3138
 	.byte	0x1
 	.byte	0x86
 	.4byte	0x10b
 	.byte	0x3
-	.4byte	0x12dc0
+	.4byte	0x12f96
 	.uleb128 0x7e
 	.4byte	.LASF2856
 	.byte	0x1
@@ -43604,23 +44484,23 @@ __exitcall_ebc_exit:
 	.byte	0x86
 	.4byte	0x11a
 	.uleb128 0x78
-	.4byte	.LASF3137
+	.4byte	.LASF3139
 	.byte	0x1
 	.byte	0x88
 	.4byte	0x10b
 	.uleb128 0x78
-	.4byte	.LASF3119
+	.4byte	.LASF3120
 	.byte	0x1
 	.byte	0x89
 	.4byte	0x11a
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3138
+	.4byte	.LASF3140
 	.byte	0x1
 	.byte	0x80
 	.4byte	0x10b
 	.byte	0x3
-	.4byte	0x12df2
+	.4byte	0x12fc8
 	.uleb128 0x7e
 	.4byte	.LASF2856
 	.byte	0x1
@@ -43638,11 +44518,11 @@ __exitcall_ebc_exit:
 	.4byte	0x11a
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3139
+	.4byte	.LASF3141
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x12e15
+	.4byte	0x12feb
 	.uleb128 0x7e
 	.4byte	.LASF2932
 	.byte	0xb
@@ -43655,65 +44535,65 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3140
+	.4byte	.LASF3142
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x12e43
+	.4byte	0x13019
 	.uleb128 0x7e
 	.4byte	.LASF2932
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0xe0ff
 	.uleb128 0x7e
-	.4byte	.LASF3141
+	.4byte	.LASF3143
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13a
 	.uleb128 0x7e
-	.4byte	.LASF3142
+	.4byte	.LASF3144
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13a
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3143
+	.4byte	.LASF3145
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x12e87
+	.4byte	0x1305d
 	.uleb128 0x7e
 	.4byte	.LASF2932
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xe0ff
 	.uleb128 0x7e
-	.4byte	.LASF3144
+	.4byte	.LASF3146
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF3145
+	.4byte	.LASF3147
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF3146
+	.4byte	.LASF3148
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF3147
+	.4byte	.LASF3149
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3148
+	.4byte	.LASF3150
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x12e9f
+	.4byte	0x13075
 	.uleb128 0x7e
 	.4byte	.LASF2932
 	.byte	0xb
@@ -43721,12 +44601,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe0ff
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3149
+	.4byte	.LASF3151
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12ec6
+	.4byte	0x1309c
 	.uleb128 0x7e
 	.4byte	.LASF2932
 	.byte	0xb
@@ -43739,11 +44619,11 @@ __exitcall_ebc_exit:
 	.4byte	0xe13f
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3150
+	.4byte	.LASF3152
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x12f10
+	.4byte	0x130e6
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa
@@ -43771,12 +44651,12 @@ __exitcall_ebc_exit:
 	.4byte	0xb7a4
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3151
+	.4byte	.LASF3153
 	.byte	0xa
 	.2byte	0x108
 	.4byte	0xb7a4
 	.byte	0x3
-	.4byte	0x12f2e
+	.4byte	0x13104
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa
@@ -43784,12 +44664,12 @@ __exitcall_ebc_exit:
 	.4byte	0xa55b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3152
+	.4byte	.LASF3154
 	.byte	0xc8
 	.byte	0x1d
 	.4byte	0xb7a4
 	.byte	0x3
-	.4byte	0x12f4a
+	.4byte	0x13120
 	.uleb128 0x7d
 	.string	"bus"
 	.byte	0xc8
@@ -43797,31 +44677,31 @@ __exitcall_ebc_exit:
 	.4byte	0xadc2
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3153
+	.4byte	.LASF3155
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12f66
+	.4byte	0x1313c
 	.uleb128 0x7e
-	.4byte	.LASF3154
+	.4byte	.LASF3156
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3155
+	.4byte	.LASF3157
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x12f9f
+	.4byte	0x13175
 	.uleb128 0x7d
 	.string	"dev"
 	.byte	0xcb
 	.byte	0xa3
 	.4byte	0xa55b
 	.uleb128 0x7e
-	.4byte	.LASF3156
+	.4byte	.LASF3158
 	.byte	0xcb
 	.byte	0xa4
 	.4byte	0x310
@@ -43831,18 +44711,18 @@ __exitcall_ebc_exit:
 	.byte	0xa5
 	.4byte	0x2ce
 	.uleb128 0x7e
-	.4byte	.LASF3157
+	.4byte	.LASF3159
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3158
+	.4byte	.LASF3160
 	.byte	0x3
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12fbb
+	.4byte	0x13191
 	.uleb128 0x7e
 	.4byte	.LASF2933
 	.byte	0x3
@@ -43850,12 +44730,12 @@ __exitcall_ebc_exit:
 	.4byte	0xdaff
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3159
+	.4byte	.LASF3161
 	.byte	0x3
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12fe0
+	.4byte	0x131b6
 	.uleb128 0x7e
 	.4byte	.LASF2933
 	.byte	0x3
@@ -43868,11 +44748,11 @@ __exitcall_ebc_exit:
 	.4byte	0x4669
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3160
+	.4byte	.LASF3162
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x12ff8
+	.4byte	0x131ce
 	.uleb128 0x7e
 	.4byte	.LASF2933
 	.byte	0x3
@@ -43880,11 +44760,11 @@ __exitcall_ebc_exit:
 	.4byte	0xdaff
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3161
+	.4byte	.LASF3163
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x13010
+	.4byte	0x131e6
 	.uleb128 0x7e
 	.4byte	.LASF2933
 	.byte	0x3
@@ -43892,11 +44772,11 @@ __exitcall_ebc_exit:
 	.4byte	0xdaff
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3162
+	.4byte	.LASF3164
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x13028
+	.4byte	0x131fe
 	.uleb128 0x7e
 	.4byte	.LASF2933
 	.byte	0x3
@@ -43904,11 +44784,11 @@ __exitcall_ebc_exit:
 	.4byte	0xdaff
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3163
+	.4byte	.LASF3165
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x13040
+	.4byte	0x13216
 	.uleb128 0x7e
 	.4byte	.LASF2933
 	.byte	0x3
@@ -43916,16 +44796,16 @@ __exitcall_ebc_exit:
 	.4byte	0xdaff
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3164
+	.4byte	.LASF3166
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x13058
+	.4byte	0x1322e
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x13058
+	.4byte	0x1322e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -43935,24 +44815,24 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x13076
+	.4byte	0x1324c
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x13058
+	.4byte	0x1322e
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3165
+	.4byte	.LASF3167
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x130ae
+	.4byte	0x13284
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x13058
+	.4byte	0x1322e
 	.uleb128 0x7e
 	.4byte	.LASF192
 	.byte	0x4
@@ -43970,12 +44850,12 @@ __exitcall_ebc_exit:
 	.4byte	0xacf8
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3166
+	.4byte	.LASF3168
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x130dd
+	.4byte	0x132b3
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -43993,12 +44873,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3167
+	.4byte	.LASF3169
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1310c
+	.4byte	0x132e2
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -44016,12 +44896,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3168
+	.4byte	.LASF3170
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1313b
+	.4byte	0x13311
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -44039,12 +44919,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3169
+	.4byte	.LASF3171
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13175
+	.4byte	0x1334b
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -44067,37 +44947,37 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3170
+	.4byte	.LASF3172
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x131a9
+	.4byte	0x1337f
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x30a7
 	.uleb128 0x78
-	.4byte	.LASF3171
+	.4byte	.LASF3173
 	.byte	0x6
 	.byte	0xf7
 	.4byte	0x443
 	.uleb128 0x66
 	.uleb128 0x78
-	.4byte	.LASF3172
+	.4byte	.LASF3174
 	.byte	0x6
 	.byte	0xfe
 	.4byte	0x155
 	.byte	0
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3173
+	.4byte	.LASF3175
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x131f3
+	.4byte	0x133c9
 	.uleb128 0x7e
 	.4byte	.LASF1149
 	.byte	0x6
@@ -44114,25 +44994,25 @@ __exitcall_ebc_exit:
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x78
-	.4byte	.LASF3174
+	.4byte	.LASF3176
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x66
 	.uleb128 0x78
-	.4byte	.LASF3172
+	.4byte	.LASF3174
 	.byte	0x6
 	.byte	0x56
 	.4byte	0x155
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3175
+	.4byte	.LASF3177
 	.byte	0x12
 	.2byte	0x2e5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x1321d
+	.4byte	0x133f3
 	.uleb128 0x64
 	.4byte	.LASF986
 	.byte	0x12
@@ -44145,12 +45025,12 @@ __exitcall_ebc_exit:
 	.4byte	0x31b
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3176
+	.4byte	.LASF3178
 	.byte	0x12
 	.2byte	0x216
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13255
+	.4byte	0x1342b
 	.uleb128 0x64
 	.4byte	.LASF986
 	.byte	0x12
@@ -44170,12 +45050,12 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3177
+	.4byte	.LASF3179
 	.byte	0x12
 	.2byte	0x1dd
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x1328b
+	.4byte	0x13461
 	.uleb128 0x64
 	.4byte	.LASF986
 	.byte	0x12
@@ -44187,18 +45067,18 @@ __exitcall_ebc_exit:
 	.2byte	0x1dd
 	.4byte	0x31b
 	.uleb128 0x46
-	.4byte	.LASF3178
+	.4byte	.LASF3180
 	.byte	0x12
 	.2byte	0x1df
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3179
+	.4byte	.LASF3181
 	.byte	0x12
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x132a9
+	.4byte	0x1347f
 	.uleb128 0x64
 	.4byte	.LASF986
 	.byte	0x12
@@ -44206,12 +45086,12 @@ __exitcall_ebc_exit:
 	.4byte	0x2ce
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3180
+	.4byte	.LASF3182
 	.byte	0x12
 	.2byte	0x13d
 	.4byte	0xd788
 	.byte	0x3
-	.4byte	0x132c7
+	.4byte	0x1349d
 	.uleb128 0x64
 	.4byte	.LASF170
 	.byte	0x12
@@ -44219,11 +45099,11 @@ __exitcall_ebc_exit:
 	.4byte	0x31b
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3181
+	.4byte	.LASF3183
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x132ea
+	.4byte	0x134c0
 	.uleb128 0x7e
 	.4byte	.LASF3026
 	.byte	0xbe
@@ -44236,79 +45116,79 @@ __exitcall_ebc_exit:
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3182
+	.4byte	.LASF3184
 	.byte	0xbe
 	.byte	0xd6
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13306
+	.4byte	0x134dc
 	.uleb128 0x7e
 	.4byte	.LASF3026
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x13306
+	.4byte	0x134dc
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xd657
 	.uleb128 0x62
-	.4byte	.LASF3183
+	.4byte	.LASF3185
 	.byte	0xa3
 	.2byte	0x164
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x1332a
+	.4byte	0x13500
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x1332a
+	.4byte	0x13500
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc0a8
 	.uleb128 0x62
-	.4byte	.LASF3184
+	.4byte	.LASF3186
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13365
+	.4byte	0x1353b
 	.uleb128 0x63
 	.string	"np"
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xbca5
 	.uleb128 0x64
-	.4byte	.LASF3185
+	.4byte	.LASF3187
 	.byte	0xe
 	.2byte	0x499
 	.4byte	0x56
 	.uleb128 0x64
-	.4byte	.LASF3186
+	.4byte	.LASF3188
 	.byte	0xe
 	.2byte	0x49a
 	.4byte	0xaab
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3187
+	.4byte	.LASF3189
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x133b1
+	.4byte	0x13587
 	.uleb128 0x63
 	.string	"np"
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xbca5
 	.uleb128 0x64
-	.4byte	.LASF3185
+	.4byte	.LASF3187
 	.byte	0xe
 	.2byte	0x1f0
 	.4byte	0x56
 	.uleb128 0x64
-	.4byte	.LASF3188
+	.4byte	.LASF3190
 	.byte	0xe
 	.2byte	0x1f1
 	.4byte	0xaab
@@ -44324,11 +45204,11 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3189
+	.4byte	.LASF3191
 	.byte	0xe
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x133c9
+	.4byte	0x1359f
 	.uleb128 0x7e
 	.4byte	.LASF867
 	.byte	0xe
@@ -44336,11 +45216,11 @@ __exitcall_ebc_exit:
 	.4byte	0xb87f
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3190
+	.4byte	.LASF3192
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x133ef
+	.4byte	0x135c5
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -44353,12 +45233,12 @@ __exitcall_ebc_exit:
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3191
+	.4byte	.LASF3193
 	.byte	0x2
 	.2byte	0x49b
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x1340d
+	.4byte	0x135e3
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -44366,12 +45246,12 @@ __exitcall_ebc_exit:
 	.4byte	0xbb15
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3192
+	.4byte	.LASF3194
 	.byte	0x2
 	.2byte	0x2c5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13443
+	.4byte	0x13619
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -44389,12 +45269,12 @@ __exitcall_ebc_exit:
 	.4byte	0x31b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3193
+	.4byte	.LASF3195
 	.byte	0xf
 	.byte	0xca
 	.4byte	0x33c
 	.byte	0x3
-	.4byte	0x1345f
+	.4byte	0x13635
 	.uleb128 0x7d
 	.string	"res"
 	.byte	0xf
@@ -44402,12 +45282,12 @@ __exitcall_ebc_exit:
 	.4byte	0xc1b9
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3194
+	.4byte	.LASF3196
 	.byte	0xcc
 	.byte	0x22
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x1347b
+	.4byte	0x13651
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xcc
@@ -44415,12 +45295,12 @@ __exitcall_ebc_exit:
 	.4byte	0x30a7
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3195
+	.4byte	.LASF3197
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13497
+	.4byte	0x1366d
 	.uleb128 0x7e
 	.4byte	.LASF986
 	.byte	0xcd
@@ -44428,12 +45308,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3196
+	.4byte	.LASF3198
 	.byte	0xd
 	.2byte	0x23e
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x134b5
+	.4byte	0x1368b
 	.uleb128 0x64
 	.4byte	.LASF2273
 	.byte	0xd
@@ -44441,12 +45321,12 @@ __exitcall_ebc_exit:
 	.4byte	0x31f0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3197
+	.4byte	.LASF3199
 	.byte	0xd
 	.2byte	0x203
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x134de
+	.4byte	0x136b4
 	.uleb128 0x63
 	.string	"wq"
 	.byte	0xd
@@ -44459,29 +45339,29 @@ __exitcall_ebc_exit:
 	.4byte	0x31f0
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3198
+	.4byte	.LASF3200
 	.byte	0xd
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x13501
+	.4byte	0x136d7
 	.uleb128 0x7e
 	.4byte	.LASF2273
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0x31f0
 	.uleb128 0x7e
-	.4byte	.LASF3199
+	.4byte	.LASF3201
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3200
+	.4byte	.LASF3202
 	.byte	0x51
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1351d
+	.4byte	0x136f3
 	.uleb128 0x63
 	.string	"m"
 	.byte	0x51
@@ -44489,12 +45369,12 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3201
+	.4byte	.LASF3203
 	.byte	0x51
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13539
+	.4byte	0x1370f
 	.uleb128 0x63
 	.string	"m"
 	.byte	0x51
@@ -44502,24 +45382,24 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3202
+	.4byte	.LASF3204
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x13575
+	.4byte	0x1374b
 	.uleb128 0x7e
 	.4byte	.LASF1149
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x30a7
 	.uleb128 0x7e
-	.4byte	.LASF3203
+	.4byte	.LASF3205
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2ce
 	.uleb128 0x7e
-	.4byte	.LASF3204
+	.4byte	.LASF3206
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x29b
@@ -44530,11 +45410,11 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3205
+	.4byte	.LASF3207
 	.byte	0xca
 	.byte	0x91
 	.byte	0x3
-	.4byte	0x135a5
+	.4byte	0x1377b
 	.uleb128 0x7e
 	.4byte	.LASF986
 	.byte	0xca
@@ -44547,18 +45427,18 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.uleb128 0x66
 	.uleb128 0x78
-	.4byte	.LASF3206
+	.4byte	.LASF3208
 	.byte	0xca
 	.byte	0x93
 	.4byte	0xc6
 	.byte	0
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3207
+	.4byte	.LASF3209
 	.byte	0xca
 	.byte	0x80
 	.byte	0x3
-	.4byte	0x135d1
+	.4byte	0x137a7
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xca
@@ -44570,25 +45450,25 @@ __exitcall_ebc_exit:
 	.byte	0x80
 	.4byte	0x29
 	.uleb128 0x7e
-	.4byte	.LASF3208
+	.4byte	.LASF3210
 	.byte	0xca
 	.byte	0x81
 	.4byte	0x29b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3209
+	.4byte	.LASF3211
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x135f7
+	.4byte	0x137cd
 	.uleb128 0x7d
 	.string	"ti"
 	.byte	0xca
 	.byte	0x5f
-	.4byte	0x135f7
+	.4byte	0x137cd
 	.uleb128 0x7e
-	.4byte	.LASF3210
+	.4byte	.LASF3212
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
@@ -44597,24 +45477,24 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.4byte	0xc1e
 	.uleb128 0x7c
-	.4byte	.LASF3211
+	.4byte	.LASF3213
 	.byte	0x5
 	.byte	0xf
 	.4byte	0x2ef0
 	.byte	0x3
-	.4byte	0x13619
+	.4byte	0x137ef
 	.uleb128 0x78
-	.4byte	.LASF3212
+	.4byte	.LASF3214
 	.byte	0x5
 	.byte	0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3213
+	.4byte	.LASF3215
 	.byte	0x10
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x1365d
+	.4byte	0x13833
 	.uleb128 0x7e
 	.4byte	.LASF961
 	.byte	0x10
@@ -44625,7 +45505,7 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x13650
+	.4byte	0x13826
 	.uleb128 0x22
 	.4byte	.LASF3093
 	.byte	0x10
@@ -44635,27 +45515,27 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x122fe
+	.4byte	0x12318
 	.byte	0
 	.uleb128 0x7b
 	.string	"__u"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x13631
+	.4byte	0x13807
 	.byte	0
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3288
+	.4byte	.LASF3289
 	.byte	0x20
 	.2byte	0x126
 	.byte	0x3
 	.uleb128 0x7c
-	.4byte	.LASF3214
+	.4byte	.LASF3216
 	.byte	0xce
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13681
+	.4byte	0x13857
 	.uleb128 0x7d
 	.string	"n"
 	.byte	0xce
@@ -44663,12 +45543,12 @@ __exitcall_ebc_exit:
 	.4byte	0x155
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3215
+	.4byte	.LASF3217
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xdd
 	.byte	0x3
-	.4byte	0x136b3
+	.4byte	0x13889
 	.uleb128 0x7e
 	.4byte	.LASF2455
 	.byte	0x8
@@ -44686,12 +45566,12 @@ __exitcall_ebc_exit:
 	.4byte	0x8b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3216
+	.4byte	.LASF3218
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x136d9
+	.4byte	0x138af
 	.uleb128 0x7d
 	.string	"nr"
 	.byte	0x7
@@ -44701,17 +45581,17 @@ __exitcall_ebc_exit:
 	.4byte	.LASF1149
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x136d9
+	.4byte	0x138af
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x3a
 	.uleb128 0x7f
-	.4byte	.LASF3217
+	.4byte	.LASF3219
 	.byte	0x11
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x13712
+	.4byte	0x138e8
 	.uleb128 0x7d
 	.string	"i"
 	.byte	0x11
@@ -44721,7 +45601,7 @@ __exitcall_ebc_exit:
 	.string	"v"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13712
+	.4byte	0x138e8
 	.uleb128 0x7b
 	.string	"w0"
 	.byte	0x11
@@ -44731,18 +45611,18 @@ __exitcall_ebc_exit:
 	.string	"x1"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13712
+	.4byte	0x138e8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x367
 	.uleb128 0x7c
-	.4byte	.LASF3218
+	.4byte	.LASF3220
 	.byte	0xcf
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13732
+	.4byte	0x13908
 	.uleb128 0x7d
 	.string	"x"
 	.byte	0xcf
@@ -44750,12 +45630,12 @@ __exitcall_ebc_exit:
 	.4byte	0xef
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3219
+	.4byte	.LASF3221
 	.byte	0xd0
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1374e
+	.4byte	0x13924
 	.uleb128 0x7e
 	.4byte	.LASF2488
 	.byte	0xd0
@@ -44763,16 +45643,16 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3220
+	.4byte	.LASF3222
 	.byte	0xd1
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x1376f
+	.4byte	0x13945
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd1
 	.byte	0xb
-	.4byte	0x1376f
+	.4byte	0x13945
 	.uleb128 0x7e
 	.4byte	.LASF986
 	.byte	0xd1
@@ -44781,21 +45661,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x13777
+	.4byte	0x1394d
 	.uleb128 0x81
 	.uleb128 0x3
-	.4byte	0x13775
+	.4byte	0x1394b
 	.uleb128 0x7f
-	.4byte	.LASF3221
+	.4byte	.LASF3223
 	.byte	0xd1
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x1379d
+	.4byte	0x13973
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd1
 	.byte	0x9
-	.4byte	0x1376f
+	.4byte	0x13945
 	.uleb128 0x7e
 	.4byte	.LASF986
 	.byte	0xd1
@@ -44803,16 +45683,16 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3222
+	.4byte	.LASF3224
 	.byte	0xc
 	.2byte	0x11a
 	.byte	0x3
-	.4byte	0x137cd
+	.4byte	0x139a3
 	.uleb128 0x63
 	.string	"p"
 	.byte	0xc
 	.2byte	0x11a
-	.4byte	0x137cd
+	.4byte	0x139a3
 	.uleb128 0x63
 	.string	"res"
 	.byte	0xc
@@ -44826,1015 +45706,1015 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x13775
+	.4byte	0x1394b
 	.uleb128 0x82
-	.4byte	0x126a7
-	.8byte	.LFB2814
-	.8byte	.LFE2814-.LFB2814
+	.4byte	0x1271c
+	.8byte	.LFB2815
+	.8byte	.LFE2815-.LFB2815
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13a56
+	.4byte	0x13c2c
 	.uleb128 0x71
-	.4byte	0x126b4
+	.4byte	0x12729
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x126c0
-	.4byte	.LLST98
+	.4byte	0x12735
+	.4byte	.LLST102
 	.uleb128 0x6f
-	.4byte	0x126cc
-	.4byte	.LLST99
+	.4byte	0x12741
+	.4byte	.LLST103
 	.uleb128 0x6f
-	.4byte	0x126d8
-	.4byte	.LLST100
+	.4byte	0x1274d
+	.4byte	.LLST104
 	.uleb128 0x53
-	.4byte	0x126e5
-	.8byte	.LBB1230
-	.8byte	.LBE1230-.LBB1230
+	.4byte	0x1275a
+	.8byte	.LBB1232
+	.8byte	.LBE1232-.LBB1232
 	.byte	0x1
-	.2byte	0x2bb
-	.4byte	0x1390b
+	.2byte	0x388
+	.4byte	0x13ae1
 	.uleb128 0x54
-	.4byte	0x12716
+	.4byte	0x1278b
 	.uleb128 0x54
-	.4byte	0x12716
+	.4byte	0x1278b
 	.uleb128 0x54
-	.4byte	0x12716
+	.4byte	0x1278b
 	.uleb128 0x54
-	.4byte	0x1270a
+	.4byte	0x1277f
 	.uleb128 0x54
-	.4byte	0x126fe
+	.4byte	0x12773
 	.uleb128 0x54
-	.4byte	0x126f2
+	.4byte	0x12767
 	.uleb128 0x56
-	.8byte	.LBB1231
-	.8byte	.LBE1231-.LBB1231
+	.8byte	.LBB1233
+	.8byte	.LBE1233-.LBB1233
 	.uleb128 0x57
-	.4byte	0x12722
+	.4byte	0x12797
 	.uleb128 0x5f
-	.4byte	0x1272e
-	.4byte	.LLST101
+	.4byte	0x127a3
+	.4byte	.LLST105
 	.uleb128 0x57
-	.4byte	0x12738
+	.4byte	0x127ad
 	.uleb128 0x5f
-	.4byte	0x12742
-	.4byte	.LLST102
+	.4byte	0x127b7
+	.4byte	.LLST106
 	.uleb128 0x5f
-	.4byte	0x1274e
-	.4byte	.LLST103
+	.4byte	0x127c3
+	.4byte	.LLST107
 	.uleb128 0x5f
-	.4byte	0x1275a
-	.4byte	.LLST104
+	.4byte	0x127cf
+	.4byte	.LLST108
 	.uleb128 0x57
-	.4byte	0x12766
+	.4byte	0x127db
 	.uleb128 0x60
-	.4byte	0x12772
+	.4byte	0x127e7
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x60
-	.4byte	0x1277e
+	.4byte	0x127f3
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5f
-	.4byte	0x1278a
-	.4byte	.LLST105
+	.4byte	0x127ff
+	.4byte	.LLST109
 	.uleb128 0x5f
-	.4byte	0x12796
-	.4byte	.LLST106
+	.4byte	0x1280b
+	.4byte	.LLST110
 	.uleb128 0x5f
-	.4byte	0x127a2
-	.4byte	.LLST107
+	.4byte	0x12817
+	.4byte	.LLST111
 	.uleb128 0x57
-	.4byte	0x127ae
+	.4byte	0x12823
 	.uleb128 0x5a
-	.4byte	0x12dc0
-	.8byte	.LBB1232
+	.4byte	0x12f96
+	.8byte	.LBB1234
 	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
-	.2byte	0x2ae
-	.4byte	0x138e5
+	.2byte	0x37b
+	.4byte	0x13abb
 	.uleb128 0x54
-	.4byte	0x12de6
+	.4byte	0x12fbc
 	.uleb128 0x54
-	.4byte	0x12ddb
+	.4byte	0x12fb1
 	.uleb128 0x54
-	.4byte	0x12dd0
+	.4byte	0x12fa6
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x12dc0
-	.8byte	.LBB1239
+	.4byte	0x12f96
+	.8byte	.LBB1241
 	.4byte	.Ldebug_ranges0+0x730
 	.byte	0x1
-	.2byte	0x2af
+	.2byte	0x37c
 	.uleb128 0x54
-	.4byte	0x12de6
+	.4byte	0x12fbc
 	.uleb128 0x54
-	.4byte	0x12ddb
+	.4byte	0x12fb1
 	.uleb128 0x54
-	.4byte	0x12dd0
+	.4byte	0x12fa6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x780
 	.uleb128 0x54
-	.4byte	0x126d8
+	.4byte	0x1274d
 	.uleb128 0x54
-	.4byte	0x126cc
+	.4byte	0x12741
 	.uleb128 0x54
-	.4byte	0x126c0
+	.4byte	0x12735
 	.uleb128 0x54
-	.4byte	0x126b4
+	.4byte	0x12729
 	.uleb128 0x5e
-	.4byte	0x127bb
-	.8byte	.LBB1251
+	.4byte	0x12830
+	.8byte	.LBB1253
 	.4byte	.Ldebug_ranges0+0x780
 	.byte	0x1
-	.2byte	0x2b9
+	.2byte	0x386
 	.uleb128 0x54
-	.4byte	0x127ec
+	.4byte	0x12861
 	.uleb128 0x54
-	.4byte	0x127ec
+	.4byte	0x12861
 	.uleb128 0x54
-	.4byte	0x127ec
+	.4byte	0x12861
 	.uleb128 0x54
-	.4byte	0x127e0
+	.4byte	0x12855
 	.uleb128 0x54
-	.4byte	0x127d4
+	.4byte	0x12849
 	.uleb128 0x54
-	.4byte	0x127c8
+	.4byte	0x1283d
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x780
 	.uleb128 0x57
-	.4byte	0x127f8
+	.4byte	0x1286d
 	.uleb128 0x60
-	.4byte	0x12804
+	.4byte	0x12879
 	.uleb128 0x1
 	.byte	0x5c
 	.uleb128 0x57
-	.4byte	0x1280e
+	.4byte	0x12883
 	.uleb128 0x60
-	.4byte	0x12818
+	.4byte	0x1288d
 	.uleb128 0x1
 	.byte	0x5f
 	.uleb128 0x57
-	.4byte	0x12824
+	.4byte	0x12899
 	.uleb128 0x5f
-	.4byte	0x12830
-	.4byte	.LLST108
+	.4byte	0x128a5
+	.4byte	.LLST112
 	.uleb128 0x5f
-	.4byte	0x1283c
-	.4byte	.LLST109
+	.4byte	0x128b1
+	.4byte	.LLST113
 	.uleb128 0x60
-	.4byte	0x12848
+	.4byte	0x128bd
 	.uleb128 0x1
 	.byte	0x59
 	.uleb128 0x60
-	.4byte	0x12854
+	.4byte	0x128c9
 	.uleb128 0x1
 	.byte	0x5a
 	.uleb128 0x5f
-	.4byte	0x12860
-	.4byte	.LLST110
+	.4byte	0x128d5
+	.4byte	.LLST114
 	.uleb128 0x5f
-	.4byte	0x1286c
-	.4byte	.LLST111
+	.4byte	0x128e1
+	.4byte	.LLST115
 	.uleb128 0x60
-	.4byte	0x12878
+	.4byte	0x128ed
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x57
-	.4byte	0x12884
+	.4byte	0x128f9
 	.uleb128 0x5a
-	.4byte	0x12dc0
-	.8byte	.LBB1253
+	.4byte	0x12f96
+	.8byte	.LBB1255
 	.4byte	.Ldebug_ranges0+0x7c0
 	.byte	0x1
-	.2byte	0x287
-	.4byte	0x139de
+	.2byte	0x354
+	.4byte	0x13bb4
 	.uleb128 0x54
-	.4byte	0x12de6
+	.4byte	0x12fbc
 	.uleb128 0x54
-	.4byte	0x12ddb
+	.4byte	0x12fb1
 	.uleb128 0x54
-	.4byte	0x12dd0
+	.4byte	0x12fa6
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12dc0
-	.8byte	.LBB1258
+	.4byte	0x12f96
+	.8byte	.LBB1260
 	.4byte	.Ldebug_ranges0+0x810
 	.byte	0x1
-	.2byte	0x288
-	.4byte	0x13a06
+	.2byte	0x355
+	.4byte	0x13bdc
 	.uleb128 0x54
-	.4byte	0x12de6
+	.4byte	0x12fbc
 	.uleb128 0x54
-	.4byte	0x12ddb
+	.4byte	0x12fb1
 	.uleb128 0x54
-	.4byte	0x12dd0
+	.4byte	0x12fa6
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12dc0
-	.8byte	.LBB1270
+	.4byte	0x12f96
+	.8byte	.LBB1272
 	.4byte	.Ldebug_ranges0+0x880
 	.byte	0x1
-	.2byte	0x289
-	.4byte	0x13a2e
+	.2byte	0x356
+	.4byte	0x13c04
 	.uleb128 0x54
-	.4byte	0x12de6
+	.4byte	0x12fbc
 	.uleb128 0x54
-	.4byte	0x12ddb
+	.4byte	0x12fb1
 	.uleb128 0x54
-	.4byte	0x12dd0
+	.4byte	0x12fa6
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x12dc0
-	.8byte	.LBB1282
+	.4byte	0x12f96
+	.8byte	.LBB1284
 	.4byte	.Ldebug_ranges0+0x8f0
 	.byte	0x1
-	.2byte	0x28a
+	.2byte	0x357
 	.uleb128 0x54
-	.4byte	0x12de6
+	.4byte	0x12fbc
 	.uleb128 0x54
-	.4byte	0x12ddb
+	.4byte	0x12fb1
 	.uleb128 0x54
-	.4byte	0x12dd0
+	.4byte	0x12fa6
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x82
-	.4byte	0x124bd
-	.8byte	.LFB2817
-	.8byte	.LFE2817-.LFB2817
+	.4byte	0x12532
+	.8byte	.LFB2818
+	.8byte	.LFE2818-.LFB2818
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13d8b
+	.4byte	0x13f61
 	.uleb128 0x71
-	.4byte	0x124ca
+	.4byte	0x1253f
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x124d6
-	.4byte	.LLST112
+	.4byte	0x1254b
+	.4byte	.LLST116
 	.uleb128 0x6f
-	.4byte	0x124e2
-	.4byte	.LLST113
+	.4byte	0x12557
+	.4byte	.LLST117
 	.uleb128 0x6f
-	.4byte	0x124ee
-	.4byte	.LLST114
+	.4byte	0x12563
+	.4byte	.LLST118
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x940
-	.4byte	0x13c70
+	.4byte	0x13e46
 	.uleb128 0x54
-	.4byte	0x124ee
+	.4byte	0x12563
 	.uleb128 0x54
-	.4byte	0x124e2
+	.4byte	0x12557
 	.uleb128 0x54
-	.4byte	0x124d6
+	.4byte	0x1254b
 	.uleb128 0x54
-	.4byte	0x124ca
+	.4byte	0x1253f
 	.uleb128 0x5e
-	.4byte	0x124fb
-	.8byte	.LBB1318
+	.4byte	0x12570
+	.8byte	.LBB1320
 	.4byte	.Ldebug_ranges0+0x940
 	.byte	0x1
-	.2byte	0x317
+	.2byte	0x3e4
 	.uleb128 0x54
-	.4byte	0x1252c
+	.4byte	0x125a1
 	.uleb128 0x54
-	.4byte	0x1252c
+	.4byte	0x125a1
 	.uleb128 0x54
-	.4byte	0x1252c
+	.4byte	0x125a1
 	.uleb128 0x54
-	.4byte	0x12520
+	.4byte	0x12595
 	.uleb128 0x54
-	.4byte	0x12514
+	.4byte	0x12589
 	.uleb128 0x54
-	.4byte	0x12508
+	.4byte	0x1257d
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x940
 	.uleb128 0x57
-	.4byte	0x12538
-	.uleb128 0x5f
-	.4byte	0x12544
-	.4byte	.LLST115
+	.4byte	0x125ad
 	.uleb128 0x5f
-	.4byte	0x12550
-	.4byte	.LLST116
-	.uleb128 0x5f
-	.4byte	0x1255c
-	.4byte	.LLST117
-	.uleb128 0x5f
-	.4byte	0x12568
-	.4byte	.LLST118
-	.uleb128 0x5f
-	.4byte	0x12574
+	.4byte	0x125b9
 	.4byte	.LLST119
 	.uleb128 0x5f
-	.4byte	0x12580
+	.4byte	0x125c5
 	.4byte	.LLST120
 	.uleb128 0x5f
-	.4byte	0x1258c
+	.4byte	0x125d1
 	.4byte	.LLST121
 	.uleb128 0x5f
-	.4byte	0x12598
+	.4byte	0x125dd
 	.4byte	.LLST122
-	.uleb128 0x57
-	.4byte	0x125a2
 	.uleb128 0x5f
-	.4byte	0x125ac
+	.4byte	0x125e9
 	.4byte	.LLST123
 	.uleb128 0x5f
-	.4byte	0x125b8
+	.4byte	0x125f5
 	.4byte	.LLST124
+	.uleb128 0x5f
+	.4byte	0x12601
+	.4byte	.LLST125
+	.uleb128 0x5f
+	.4byte	0x1260d
+	.4byte	.LLST126
 	.uleb128 0x57
-	.4byte	0x125c4
+	.4byte	0x12617
+	.uleb128 0x5f
+	.4byte	0x12621
+	.4byte	.LLST127
+	.uleb128 0x5f
+	.4byte	0x1262d
+	.4byte	.LLST128
+	.uleb128 0x57
+	.4byte	0x12639
 	.uleb128 0x5a
-	.4byte	0x12d78
-	.8byte	.LBB1320
+	.4byte	0x12f4e
+	.8byte	.LBB1322
 	.4byte	.Ldebug_ranges0+0x970
 	.byte	0x1
-	.2byte	0x308
-	.4byte	0x13b8d
+	.2byte	0x3d5
+	.4byte	0x13d63
 	.uleb128 0x54
-	.4byte	0x12d9e
+	.4byte	0x12f74
 	.uleb128 0x54
-	.4byte	0x12d93
+	.4byte	0x12f69
 	.uleb128 0x54
-	.4byte	0x12d88
+	.4byte	0x12f5e
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x970
 	.uleb128 0x57
-	.4byte	0x12da9
+	.4byte	0x12f7f
 	.uleb128 0x5f
-	.4byte	0x12db4
-	.4byte	.LLST125
+	.4byte	0x12f8a
+	.4byte	.LLST129
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12d78
-	.8byte	.LBB1323
-	.8byte	.LBE1323-.LBB1323
+	.4byte	0x12f4e
+	.8byte	.LBB1325
+	.8byte	.LBE1325-.LBB1325
 	.byte	0x1
-	.2byte	0x305
-	.4byte	0x13bd9
+	.2byte	0x3d2
+	.4byte	0x13daf
 	.uleb128 0x54
-	.4byte	0x12d9e
+	.4byte	0x12f74
 	.uleb128 0x54
-	.4byte	0x12d93
+	.4byte	0x12f69
 	.uleb128 0x54
-	.4byte	0x12d88
+	.4byte	0x12f5e
 	.uleb128 0x56
-	.8byte	.LBB1324
-	.8byte	.LBE1324-.LBB1324
+	.8byte	.LBB1326
+	.8byte	.LBE1326-.LBB1326
 	.uleb128 0x57
-	.4byte	0x12da9
+	.4byte	0x12f7f
 	.uleb128 0x5f
-	.4byte	0x12db4
-	.4byte	.LLST126
+	.4byte	0x12f8a
+	.4byte	.LLST130
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12d78
-	.8byte	.LBB1325
-	.8byte	.LBE1325-.LBB1325
+	.4byte	0x12f4e
+	.8byte	.LBB1327
+	.8byte	.LBE1327-.LBB1327
 	.byte	0x1
-	.2byte	0x306
-	.4byte	0x13c25
+	.2byte	0x3d3
+	.4byte	0x13dfb
 	.uleb128 0x54
-	.4byte	0x12d9e
+	.4byte	0x12f74
 	.uleb128 0x54
-	.4byte	0x12d93
+	.4byte	0x12f69
 	.uleb128 0x54
-	.4byte	0x12d88
+	.4byte	0x12f5e
 	.uleb128 0x56
-	.8byte	.LBB1326
-	.8byte	.LBE1326-.LBB1326
+	.8byte	.LBB1328
+	.8byte	.LBE1328-.LBB1328
 	.uleb128 0x57
-	.4byte	0x12da9
+	.4byte	0x12f7f
 	.uleb128 0x5f
-	.4byte	0x12db4
-	.4byte	.LLST127
+	.4byte	0x12f8a
+	.4byte	.LLST131
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12d78
-	.8byte	.LBB1327
-	.8byte	.LBE1327-.LBB1327
+	.4byte	0x12f4e
+	.8byte	.LBB1329
+	.8byte	.LBE1329-.LBB1329
 	.byte	0x1
-	.2byte	0x307
+	.2byte	0x3d4
 	.uleb128 0x54
-	.4byte	0x12d9e
+	.4byte	0x12f74
 	.uleb128 0x54
-	.4byte	0x12d93
+	.4byte	0x12f69
 	.uleb128 0x54
-	.4byte	0x12d88
+	.4byte	0x12f5e
 	.uleb128 0x56
-	.8byte	.LBB1328
-	.8byte	.LBE1328-.LBB1328
+	.8byte	.LBB1330
+	.8byte	.LBE1330-.LBB1330
 	.uleb128 0x57
-	.4byte	0x12da9
+	.4byte	0x12f7f
 	.uleb128 0x5f
-	.4byte	0x12db4
-	.4byte	.LLST128
+	.4byte	0x12f8a
+	.4byte	.LLST132
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x125d1
-	.8byte	.LBB1332
-	.8byte	.LBE1332-.LBB1332
+	.4byte	0x12646
+	.8byte	.LBB1334
+	.8byte	.LBE1334-.LBB1334
 	.byte	0x1
-	.2byte	0x319
+	.2byte	0x3e6
 	.uleb128 0x54
-	.4byte	0x12602
+	.4byte	0x12677
 	.uleb128 0x54
-	.4byte	0x12602
+	.4byte	0x12677
 	.uleb128 0x54
-	.4byte	0x12602
+	.4byte	0x12677
 	.uleb128 0x54
-	.4byte	0x125f6
+	.4byte	0x1266b
 	.uleb128 0x54
-	.4byte	0x125ea
+	.4byte	0x1265f
 	.uleb128 0x54
-	.4byte	0x125de
+	.4byte	0x12653
 	.uleb128 0x56
-	.8byte	.LBB1333
-	.8byte	.LBE1333-.LBB1333
+	.8byte	.LBB1335
+	.8byte	.LBE1335-.LBB1335
 	.uleb128 0x57
-	.4byte	0x1260e
+	.4byte	0x12683
 	.uleb128 0x57
-	.4byte	0x1261a
+	.4byte	0x1268f
 	.uleb128 0x57
-	.4byte	0x12626
+	.4byte	0x1269b
 	.uleb128 0x60
-	.4byte	0x12632
+	.4byte	0x126a7
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x60
-	.4byte	0x1263e
+	.4byte	0x126b3
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5f
-	.4byte	0x1264a
-	.4byte	.LLST129
+	.4byte	0x126bf
+	.4byte	.LLST133
 	.uleb128 0x5f
-	.4byte	0x12656
-	.4byte	.LLST130
+	.4byte	0x126cb
+	.4byte	.LLST134
 	.uleb128 0x5f
-	.4byte	0x12662
-	.4byte	.LLST131
+	.4byte	0x126d7
+	.4byte	.LLST135
 	.uleb128 0x5f
-	.4byte	0x1266e
-	.4byte	.LLST132
+	.4byte	0x126e3
+	.4byte	.LLST136
 	.uleb128 0x57
-	.4byte	0x12678
+	.4byte	0x126ed
 	.uleb128 0x5f
-	.4byte	0x12682
-	.4byte	.LLST133
+	.4byte	0x126f7
+	.4byte	.LLST137
 	.uleb128 0x5f
-	.4byte	0x1268e
-	.4byte	.LLST134
+	.4byte	0x12703
+	.4byte	.LLST138
 	.uleb128 0x57
-	.4byte	0x1269a
+	.4byte	0x1270f
 	.uleb128 0x5a
-	.4byte	0x12d78
-	.8byte	.LBB1334
+	.4byte	0x12f4e
+	.8byte	.LBB1336
 	.4byte	.Ldebug_ranges0+0x9a0
 	.byte	0x1
-	.2byte	0x2dd
-	.4byte	0x13d50
+	.2byte	0x3aa
+	.4byte	0x13f26
 	.uleb128 0x54
-	.4byte	0x12d9e
+	.4byte	0x12f74
 	.uleb128 0x54
-	.4byte	0x12d93
+	.4byte	0x12f69
 	.uleb128 0x54
-	.4byte	0x12d88
+	.4byte	0x12f5e
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x9a0
 	.uleb128 0x57
-	.4byte	0x12da9
+	.4byte	0x12f7f
 	.uleb128 0x5f
-	.4byte	0x12db4
-	.4byte	.LLST135
+	.4byte	0x12f8a
+	.4byte	.LLST139
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x12d78
-	.8byte	.LBB1341
+	.4byte	0x12f4e
+	.8byte	.LBB1343
 	.4byte	.Ldebug_ranges0+0xa10
 	.byte	0x1
-	.2byte	0x2dc
+	.2byte	0x3a9
 	.uleb128 0x54
-	.4byte	0x12d9e
+	.4byte	0x12f74
 	.uleb128 0x54
-	.4byte	0x12d93
+	.4byte	0x12f69
 	.uleb128 0x54
-	.4byte	0x12d88
+	.4byte	0x12f5e
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xa10
 	.uleb128 0x57
-	.4byte	0x12da9
+	.4byte	0x12f7f
 	.uleb128 0x5f
-	.4byte	0x12db4
-	.4byte	.LLST136
+	.4byte	0x12f8a
+	.4byte	.LLST140
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12485
-	.8byte	.LFB2860
-	.8byte	.LFE2860-.LFB2860
+	.4byte	0x124fa
+	.8byte	.LFB2861
+	.8byte	.LFE2861-.LFB2861
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13e8e
+	.4byte	0x14064
 	.uleb128 0x6f
-	.4byte	0x12492
-	.4byte	.LLST137
+	.4byte	0x12507
+	.4byte	.LLST141
 	.uleb128 0x54
-	.4byte	0x1249e
+	.4byte	0x12513
 	.uleb128 0x57
-	.4byte	0x124aa
+	.4byte	0x1251f
 	.uleb128 0x5a
-	.4byte	0x12ec6
-	.8byte	.LBB1357
+	.4byte	0x1309c
+	.8byte	.LBB1359
 	.4byte	.Ldebug_ranges0+0xa70
 	.byte	0x1
-	.2byte	0x320
-	.4byte	0x13e0c
+	.2byte	0x3ed
+	.4byte	0x13fe2
 	.uleb128 0x54
-	.4byte	0x12ef7
+	.4byte	0x130cd
 	.uleb128 0x54
-	.4byte	0x12eeb
+	.4byte	0x130c1
 	.uleb128 0x54
-	.4byte	0x12edf
+	.4byte	0x130b5
 	.uleb128 0x54
-	.4byte	0x12ed3
+	.4byte	0x130a9
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xa70
 	.uleb128 0x57
-	.4byte	0x12f03
+	.4byte	0x130d9
 	.uleb128 0x5e
-	.4byte	0x12f10
-	.8byte	.LBB1359
+	.4byte	0x130e6
+	.8byte	.LBB1361
 	.4byte	.Ldebug_ranges0+0xac0
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x54
-	.4byte	0x12f21
+	.4byte	0x130f7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12e43
-	.8byte	.LBB1368
+	.4byte	0x13019
+	.8byte	.LBB1370
 	.4byte	.Ldebug_ranges0+0xaf0
 	.byte	0x1
-	.2byte	0x321
-	.4byte	0x13e3e
+	.2byte	0x3ee
+	.4byte	0x14014
 	.uleb128 0x54
-	.4byte	0x12e7b
+	.4byte	0x13051
 	.uleb128 0x54
-	.4byte	0x12e70
+	.4byte	0x13046
 	.uleb128 0x54
-	.4byte	0x12e65
+	.4byte	0x1303b
 	.uleb128 0x54
-	.4byte	0x12e5a
+	.4byte	0x13030
 	.uleb128 0x54
-	.4byte	0x12e4f
+	.4byte	0x13025
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e15
-	.8byte	.LBB1374
-	.8byte	.LBE1374-.LBB1374
+	.4byte	0x12feb
+	.8byte	.LBB1376
+	.8byte	.LBE1376-.LBB1376
 	.byte	0x1
-	.2byte	0x322
-	.4byte	0x13e6a
+	.2byte	0x3ef
+	.4byte	0x14040
 	.uleb128 0x54
-	.4byte	0x12e37
+	.4byte	0x1300d
 	.uleb128 0x54
-	.4byte	0x12e2c
+	.4byte	0x13002
 	.uleb128 0x54
-	.4byte	0x12e21
+	.4byte	0x12ff7
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12df2
-	.8byte	.LBB1376
-	.8byte	.LBE1376-.LBB1376
+	.4byte	0x12fc8
+	.8byte	.LBB1378
+	.8byte	.LBE1378-.LBB1378
 	.byte	0x1
-	.2byte	0x323
+	.2byte	0x3f0
 	.uleb128 0x54
-	.4byte	0x12e09
+	.4byte	0x12fdf
 	.uleb128 0x54
-	.4byte	0x12dfe
+	.4byte	0x12fd4
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12d46
-	.8byte	.LFB2861
-	.8byte	.LFE2861-.LFB2861
+	.4byte	0x12f1c
+	.8byte	.LFB2862
+	.8byte	.LFE2862-.LFB2862
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13f4c
+	.4byte	0x14122
 	.uleb128 0x6f
-	.4byte	0x12d56
-	.4byte	.LLST140
+	.4byte	0x12f2c
+	.4byte	.LLST144
 	.uleb128 0x6f
-	.4byte	0x12d61
-	.4byte	.LLST141
+	.4byte	0x12f37
+	.4byte	.LLST145
 	.uleb128 0x57
-	.4byte	0x12d6c
+	.4byte	0x12f42
 	.uleb128 0x70
-	.4byte	0x12e87
-	.8byte	.LBB1402
-	.8byte	.LBE1402-.LBB1402
+	.4byte	0x1305d
+	.8byte	.LBB1406
+	.8byte	.LBE1406-.LBB1406
 	.byte	0x1
 	.byte	0xc6
-	.4byte	0x13ee2
+	.4byte	0x140b8
 	.uleb128 0x54
-	.4byte	0x12e93
+	.4byte	0x13069
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13010
-	.8byte	.LBB1404
-	.8byte	.LBE1404-.LBB1404
+	.4byte	0x131e6
+	.8byte	.LBB1408
+	.8byte	.LBE1408-.LBB1408
 	.byte	0x1
 	.byte	0xc7
-	.4byte	0x13f03
+	.4byte	0x140d9
 	.uleb128 0x54
-	.4byte	0x1301c
+	.4byte	0x131f2
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13040
-	.8byte	.LBB1406
-	.8byte	.LBE1406-.LBB1406
+	.4byte	0x13216
+	.8byte	.LBB1410
+	.8byte	.LBE1410-.LBB1410
 	.byte	0x1
 	.byte	0xca
-	.4byte	0x13f31
+	.4byte	0x14107
 	.uleb128 0x54
-	.4byte	0x1304c
+	.4byte	0x13222
 	.uleb128 0x4e
-	.8byte	.LVL468
-	.4byte	0x1427a
+	.8byte	.LVL509
+	.4byte	0x14450
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL465
-	.4byte	0x14016
+	.8byte	.LVL506
+	.4byte	0x141ec
 	.uleb128 0x4e
-	.8byte	.LVL469
-	.4byte	0x14016
+	.8byte	.LVL510
+	.4byte	0x141ec
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12d46
-	.8byte	.LFB2865
-	.8byte	.LFE2865-.LFB2865
+	.4byte	0x12f1c
+	.8byte	.LFB2866
+	.8byte	.LFE2866-.LFB2866
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13ffe
+	.4byte	0x141d4
 	.uleb128 0x6f
-	.4byte	0x12d56
-	.4byte	.LLST165
+	.4byte	0x12f2c
+	.4byte	.LLST169
 	.uleb128 0x57
-	.4byte	0x12d6c
+	.4byte	0x12f42
 	.uleb128 0x54
-	.4byte	0x12d61
+	.4byte	0x12f37
 	.uleb128 0x70
-	.4byte	0x13028
-	.8byte	.LBB1766
-	.8byte	.LBE1766-.LBB1766
+	.4byte	0x131fe
+	.8byte	.LBB1770
+	.8byte	.LBE1770-.LBB1770
 	.byte	0x1
 	.byte	0xbf
-	.4byte	0x13f9c
+	.4byte	0x14172
 	.uleb128 0x54
-	.4byte	0x13034
+	.4byte	0x1320a
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12e9f
-	.8byte	.LBB1768
-	.8byte	.LBE1768-.LBB1768
+	.4byte	0x13075
+	.8byte	.LBB1772
+	.8byte	.LBE1772-.LBB1772
 	.byte	0x1
 	.byte	0xc0
-	.4byte	0x13fc2
+	.4byte	0x14198
 	.uleb128 0x54
-	.4byte	0x12eba
+	.4byte	0x13090
 	.uleb128 0x54
-	.4byte	0x12eaf
+	.4byte	0x13085
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x1305e
-	.8byte	.LBB1770
-	.8byte	.LBE1770-.LBB1770
+	.4byte	0x13234
+	.8byte	.LBB1774
+	.8byte	.LBE1774-.LBB1774
 	.byte	0x1
 	.byte	0xbc
-	.4byte	0x13ff0
+	.4byte	0x141c6
 	.uleb128 0x54
-	.4byte	0x1306a
+	.4byte	0x13240
 	.uleb128 0x4e
-	.8byte	.LVL658
-	.4byte	0x142fd
+	.8byte	.LVL699
+	.4byte	0x144c7
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL655
-	.4byte	0x14016
+	.8byte	.LVL696
+	.4byte	0x141ec
 	.byte	0
 	.uleb128 0x84
-	.4byte	.LASF3223
-	.4byte	.LASF3223
+	.4byte	.LASF3225
+	.4byte	.LASF3225
 	.byte	0xbe
 	.byte	0xcc
 	.uleb128 0x84
-	.4byte	.LASF3224
-	.4byte	.LASF3224
+	.4byte	.LASF3226
+	.4byte	.LASF3226
 	.byte	0xbe
 	.byte	0xca
 	.uleb128 0x85
-	.4byte	.LASF3225
-	.4byte	.LASF3225
+	.4byte	.LASF3227
+	.4byte	.LASF3227
 	.byte	0x2
 	.2byte	0x5d1
 	.uleb128 0x84
-	.4byte	.LASF3226
-	.4byte	.LASF3226
+	.4byte	.LASF3228
+	.4byte	.LASF3228
 	.byte	0xac
 	.byte	0x4f
 	.uleb128 0x85
-	.4byte	.LASF3227
-	.4byte	.LASF3227
+	.4byte	.LASF3229
+	.4byte	.LASF3229
 	.byte	0x2
 	.2byte	0x2bf
 	.uleb128 0x85
-	.4byte	.LASF3228
-	.4byte	.LASF3228
+	.4byte	.LASF3230
+	.4byte	.LASF3230
 	.byte	0xe
 	.2byte	0x149
 	.uleb128 0x85
-	.4byte	.LASF3229
-	.4byte	.LASF3229
+	.4byte	.LASF3231
+	.4byte	.LASF3231
 	.byte	0xe
 	.2byte	0x172
 	.uleb128 0x84
-	.4byte	.LASF3230
-	.4byte	.LASF3230
+	.4byte	.LASF3232
+	.4byte	.LASF3232
 	.byte	0xd2
 	.byte	0x78
 	.uleb128 0x84
-	.4byte	.LASF3231
-	.4byte	.LASF3231
+	.4byte	.LASF3233
+	.4byte	.LASF3233
 	.byte	0xaa
 	.byte	0x59
 	.uleb128 0x84
-	.4byte	.LASF3232
-	.4byte	.LASF3232
+	.4byte	.LASF3234
+	.4byte	.LASF3234
 	.byte	0xc3
 	.byte	0x30
 	.uleb128 0x86
-	.4byte	.LASF3233
-	.4byte	.LASF3233
+	.4byte	.LASF3235
+	.4byte	.LASF3235
 	.uleb128 0x84
-	.4byte	.LASF3233
-	.4byte	.LASF3233
+	.4byte	.LASF3235
+	.4byte	.LASF3235
 	.byte	0xd3
 	.byte	0x36
 	.uleb128 0x85
-	.4byte	.LASF3234
-	.4byte	.LASF3234
+	.4byte	.LASF3236
+	.4byte	.LASF3236
 	.byte	0x2
 	.2byte	0x5cb
 	.uleb128 0x84
-	.4byte	.LASF3235
-	.4byte	.LASF3235
+	.4byte	.LASF3237
+	.4byte	.LASF3237
 	.byte	0xc2
 	.byte	0x30
 	.uleb128 0x84
-	.4byte	.LASF3236
-	.4byte	.LASF3236
+	.4byte	.LASF3238
+	.4byte	.LASF3238
 	.byte	0xc2
 	.byte	0x31
 	.uleb128 0x84
-	.4byte	.LASF3237
-	.4byte	.LASF3237
+	.4byte	.LASF3239
+	.4byte	.LASF3239
 	.byte	0xab
 	.byte	0x9
 	.uleb128 0x85
-	.4byte	.LASF3238
-	.4byte	.LASF3238
+	.4byte	.LASF3240
+	.4byte	.LASF3240
 	.byte	0x48
 	.2byte	0x6b8
 	.uleb128 0x85
-	.4byte	.LASF3239
-	.4byte	.LASF3239
+	.4byte	.LASF3241
+	.4byte	.LASF3241
 	.byte	0x48
 	.2byte	0x676
 	.uleb128 0x84
-	.4byte	.LASF3240
-	.4byte	.LASF3240
+	.4byte	.LASF3242
+	.4byte	.LASF3242
 	.byte	0x9c
 	.byte	0x67
 	.uleb128 0x84
-	.4byte	.LASF3241
-	.4byte	.LASF3241
+	.4byte	.LASF3243
+	.4byte	.LASF3243
 	.byte	0x54
 	.byte	0x53
 	.uleb128 0x84
-	.4byte	.LASF3242
-	.4byte	.LASF3242
+	.4byte	.LASF3244
+	.4byte	.LASF3244
 	.byte	0x54
 	.byte	0xa5
 	.uleb128 0x84
-	.4byte	.LASF3243
-	.4byte	.LASF3243
+	.4byte	.LASF3245
+	.4byte	.LASF3245
 	.byte	0xc3
 	.byte	0x2b
 	.uleb128 0x84
-	.4byte	.LASF3244
-	.4byte	.LASF3244
+	.4byte	.LASF3246
+	.4byte	.LASF3246
 	.byte	0xc3
 	.byte	0x27
 	.uleb128 0x85
-	.4byte	.LASF3245
-	.4byte	.LASF3245
+	.4byte	.LASF3247
+	.4byte	.LASF3247
 	.byte	0x12
 	.2byte	0x184
 	.uleb128 0x84
-	.4byte	.LASF3246
-	.4byte	.LASF3246
+	.4byte	.LASF3248
+	.4byte	.LASF3248
 	.byte	0xd4
 	.byte	0x51
 	.uleb128 0x85
-	.4byte	.LASF3247
-	.4byte	.LASF3247
+	.4byte	.LASF3249
+	.4byte	.LASF3249
 	.byte	0x20
 	.2byte	0x1d9
 	.uleb128 0x84
-	.4byte	.LASF3248
-	.4byte	.LASF3248
+	.4byte	.LASF3250
+	.4byte	.LASF3250
 	.byte	0x3
 	.byte	0x3b
 	.uleb128 0x84
-	.4byte	.LASF3249
-	.4byte	.LASF3249
+	.4byte	.LASF3251
+	.4byte	.LASF3251
 	.byte	0x12
 	.byte	0xb9
 	.uleb128 0x86
-	.4byte	.LASF3250
-	.4byte	.LASF3250
+	.4byte	.LASF3252
+	.4byte	.LASF3252
 	.uleb128 0x84
-	.4byte	.LASF3251
-	.4byte	.LASF3251
+	.4byte	.LASF3253
+	.4byte	.LASF3253
 	.byte	0x3a
 	.byte	0xc2
 	.uleb128 0x84
-	.4byte	.LASF3252
-	.4byte	.LASF3252
+	.4byte	.LASF3254
+	.4byte	.LASF3254
 	.byte	0xac
 	.byte	0x4e
 	.uleb128 0x85
-	.4byte	.LASF3253
-	.4byte	.LASF3253
+	.4byte	.LASF3255
+	.4byte	.LASF3255
 	.byte	0x2
 	.2byte	0x287
 	.uleb128 0x84
-	.4byte	.LASF3254
-	.4byte	.LASF3254
+	.4byte	.LASF3256
+	.4byte	.LASF3256
 	.byte	0xbf
 	.byte	0x38
 	.uleb128 0x85
-	.4byte	.LASF3255
-	.4byte	.LASF3255
+	.4byte	.LASF3257
+	.4byte	.LASF3257
 	.byte	0xa3
 	.2byte	0x37b
 	.uleb128 0x86
-	.4byte	.LASF3256
-	.4byte	.LASF3256
+	.4byte	.LASF3258
+	.4byte	.LASF3258
 	.uleb128 0x84
-	.4byte	.LASF3257
-	.4byte	.LASF3257
+	.4byte	.LASF3259
+	.4byte	.LASF3259
 	.byte	0xc3
 	.byte	0x2e
 	.uleb128 0x85
-	.4byte	.LASF3258
-	.4byte	.LASF3258
+	.4byte	.LASF3260
+	.4byte	.LASF3260
 	.byte	0x20
 	.2byte	0x1c7
 	.uleb128 0x85
-	.4byte	.LASF3259
-	.4byte	.LASF3259
+	.4byte	.LASF3261
+	.4byte	.LASF3261
 	.byte	0x20
 	.2byte	0x17e
 	.uleb128 0x84
-	.4byte	.LASF3260
-	.4byte	.LASF3260
+	.4byte	.LASF3262
+	.4byte	.LASF3262
 	.byte	0x3
 	.byte	0x3a
 	.uleb128 0x84
-	.4byte	.LASF3261
-	.4byte	.LASF3261
+	.4byte	.LASF3263
+	.4byte	.LASF3263
 	.byte	0xc2
 	.byte	0x32
 	.uleb128 0x84
-	.4byte	.LASF3262
-	.4byte	.LASF3262
+	.4byte	.LASF3264
+	.4byte	.LASF3264
 	.byte	0xc3
 	.byte	0x2c
 	.uleb128 0x85
-	.4byte	.LASF3263
-	.4byte	.LASF3263
+	.4byte	.LASF3265
+	.4byte	.LASF3265
 	.byte	0x76
 	.2byte	0xa07
 	.uleb128 0x84
-	.4byte	.LASF3264
-	.4byte	.LASF3264
+	.4byte	.LASF3266
+	.4byte	.LASF3266
 	.byte	0x48
 	.byte	0xdc
 	.uleb128 0x85
-	.4byte	.LASF3265
-	.4byte	.LASF3265
+	.4byte	.LASF3267
+	.4byte	.LASF3267
 	.byte	0x3a
 	.2byte	0x459
 	.uleb128 0x84
-	.4byte	.LASF3266
-	.4byte	.LASF3266
+	.4byte	.LASF3268
+	.4byte	.LASF3268
 	.byte	0x3a
 	.byte	0xe9
 	.uleb128 0x85
-	.4byte	.LASF3267
-	.4byte	.LASF3267
+	.4byte	.LASF3269
+	.4byte	.LASF3269
 	.byte	0x3a
 	.2byte	0x45a
 	.uleb128 0x85
-	.4byte	.LASF3268
-	.4byte	.LASF3268
+	.4byte	.LASF3270
+	.4byte	.LASF3270
 	.byte	0x6
 	.2byte	0x19f
 	.uleb128 0x85
-	.4byte	.LASF3269
-	.4byte	.LASF3269
+	.4byte	.LASF3271
+	.4byte	.LASF3271
 	.byte	0x6
 	.2byte	0x199
 	.uleb128 0x84
-	.4byte	.LASF3270
-	.4byte	.LASF3270
+	.4byte	.LASF3272
+	.4byte	.LASF3272
 	.byte	0xc3
 	.byte	0x25
 	.uleb128 0x84
-	.4byte	.LASF3271
-	.4byte	.LASF3271
+	.4byte	.LASF3273
+	.4byte	.LASF3273
 	.byte	0xc3
 	.byte	0x2a
 	.uleb128 0x84
-	.4byte	.LASF3272
-	.4byte	.LASF3272
+	.4byte	.LASF3274
+	.4byte	.LASF3274
 	.byte	0xc3
 	.byte	0x24
 	.uleb128 0x84
-	.4byte	.LASF3273
-	.4byte	.LASF3273
+	.4byte	.LASF3275
+	.4byte	.LASF3275
 	.byte	0xc3
 	.byte	0x23
 	.uleb128 0x84
-	.4byte	.LASF3274
-	.4byte	.LASF3274
+	.4byte	.LASF3276
+	.4byte	.LASF3276
 	.byte	0x9c
 	.byte	0x73
 	.uleb128 0x84
-	.4byte	.LASF3275
-	.4byte	.LASF3275
+	.4byte	.LASF3277
+	.4byte	.LASF3277
 	.byte	0xc3
 	.byte	0x29
 	.uleb128 0x84
-	.4byte	.LASF3276
-	.4byte	.LASF3276
+	.4byte	.LASF3278
+	.4byte	.LASF3278
 	.byte	0xc3
 	.byte	0x26
 	.uleb128 0x84
-	.4byte	.LASF3277
-	.4byte	.LASF3277
+	.4byte	.LASF3279
+	.4byte	.LASF3279
 	.byte	0x72
 	.byte	0x88
 	.uleb128 0x84
-	.4byte	.LASF3278
-	.4byte	.LASF3278
+	.4byte	.LASF3280
+	.4byte	.LASF3280
 	.byte	0x72
 	.byte	0x98
 	.uleb128 0x84
-	.4byte	.LASF3279
-	.4byte	.LASF3279
+	.4byte	.LASF3281
+	.4byte	.LASF3281
 	.byte	0xc4
 	.byte	0x67
 	.uleb128 0x84
-	.4byte	.LASF3280
-	.4byte	.LASF3280
+	.4byte	.LASF3282
+	.4byte	.LASF3282
 	.byte	0xc2
 	.byte	0x33
 	.uleb128 0x85
-	.4byte	.LASF3281
-	.4byte	.LASF3281
+	.4byte	.LASF3283
+	.4byte	.LASF3283
 	.byte	0xd
 	.2byte	0x1d6
 	.uleb128 0x87
@@ -45843,18 +46723,13 @@ __exitcall_ebc_exit:
 	.byte	0x78
 	.byte	0x2c
 	.uleb128 0x84
-	.4byte	.LASF3282
-	.4byte	.LASF3282
+	.4byte	.LASF3284
+	.4byte	.LASF3284
 	.byte	0x78
 	.byte	0x27
 	.uleb128 0x84
-	.4byte	.LASF3283
-	.4byte	.LASF3283
-	.byte	0x1e
-	.byte	0xb0
-	.uleb128 0x84
-	.4byte	.LASF3284
-	.4byte	.LASF3284
+	.4byte	.LASF3285
+	.4byte	.LASF3285
 	.byte	0x9c
 	.byte	0x71
 	.byte	0
@@ -47664,2010 +48539,2102 @@ __exitcall_ebc_exit:
 	.byte	0
 	.section	.debug_loc,"",@progbits
 .Ldebug_loc0:
-.LLST7:
-	.8byte	.LVL35
-	.8byte	.LVL36
+.LLST11:
+	.8byte	.LVL65
+	.8byte	.LVL66
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST142:
-	.8byte	.LVL471
-	.8byte	.LVL472
+.LLST146:
+	.8byte	.LVL512
+	.8byte	.LVL513
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST9:
-	.8byte	.LVL42
-	.8byte	.LVL43
+.LLST13:
+	.8byte	.LVL72
+	.8byte	.LVL73
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST143:
-	.8byte	.LVL477
-	.8byte	.LVL478
+.LLST147:
+	.8byte	.LVL518
+	.8byte	.LVL519
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST144:
-	.8byte	.LVL481
-	.8byte	.LVL482
+.LLST148:
+	.8byte	.LVL522
+	.8byte	.LVL523
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL523
-	.8byte	.LVL524
+	.8byte	.LVL564
+	.8byte	.LVL565
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL623
-	.8byte	.LVL624
+	.8byte	.LVL664
+	.8byte	.LVL665
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST145:
-	.8byte	.LVL484
-	.8byte	.LVL485
+.LLST149:
+	.8byte	.LVL525
+	.8byte	.LVL526
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL637
-	.8byte	.LVL638
+	.byte	0x50
+	.8byte	.LVL678
+	.8byte	.LVL679
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST146:
-	.8byte	.LVL486
-	.8byte	.LVL525
+.LLST150:
+	.8byte	.LVL527
+	.8byte	.LVL566
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL528
-	.8byte	.LVL623
+	.8byte	.LVL569
+	.8byte	.LVL664
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL624
-	.8byte	.LVL630
+	.8byte	.LVL665
+	.8byte	.LVL671
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL631
-	.8byte	.LVL632
+	.8byte	.LVL672
+	.8byte	.LVL673
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL636
-	.8byte	.LVL637
+	.8byte	.LVL677
+	.8byte	.LVL678
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL640
-	.8byte	.LFE2847
+	.8byte	.LVL681
+	.8byte	.LFE2848
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST147:
-	.8byte	.LVL507
-	.8byte	.LVL518
+.LLST151:
+	.8byte	.LVL548
+	.8byte	.LVL559
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL523
-	.8byte	.LVL526
+	.8byte	.LVL564
+	.8byte	.LVL567
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL528
-	.8byte	.LVL531
+	.8byte	.LVL569
+	.8byte	.LVL572
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL613
-	.8byte	.LVL614
+	.8byte	.LVL654
+	.8byte	.LVL655
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL631
-	.8byte	.LVL632
+	.8byte	.LVL672
+	.8byte	.LVL673
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL642
-	.8byte	.LVL643
+	.8byte	.LVL683
+	.8byte	.LVL684
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST148:
-	.8byte	.LVL518
-	.8byte	.LVL522
+.LLST152:
+	.8byte	.LVL559
+	.8byte	.LVL563
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL523
-	.8byte	.LVL526
+	.8byte	.LVL564
+	.8byte	.LVL567
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL536
-	.8byte	.LVL537
+	.8byte	.LVL577
+	.8byte	.LVL578
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL636
-	.8byte	.LVL637
+	.8byte	.LVL677
+	.8byte	.LVL678
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL642
-	.8byte	.LVL643
+	.8byte	.LVL683
+	.8byte	.LVL684
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST149:
-	.8byte	.LVL537
-	.8byte	.LVL538-1
+.LLST153:
+	.8byte	.LVL578
+	.8byte	.LVL579-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST150:
-	.8byte	.LVL542
-	.8byte	.LVL545
+.LLST154:
+	.8byte	.LVL583
+	.8byte	.LVL586
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST151:
-	.8byte	.LVL543
-	.8byte	.LVL544
+.LLST155:
+	.8byte	.LVL584
+	.8byte	.LVL585
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST152:
-	.8byte	.LVL523
-	.8byte	.LVL526
+.LLST156:
+	.8byte	.LVL564
+	.8byte	.LVL567
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL547
-	.8byte	.LVL555
+	.8byte	.LVL588
+	.8byte	.LVL596
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL625
-	.8byte	.LVL627
+	.8byte	.LVL666
+	.8byte	.LVL668
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL627
-	.8byte	.LVL628
+	.8byte	.LVL668
+	.8byte	.LVL669
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL628
-	.8byte	.LVL630
+	.8byte	.LVL669
+	.8byte	.LVL671
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL642
-	.8byte	.LVL643
+	.8byte	.LVL683
+	.8byte	.LVL684
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST153:
-	.8byte	.LVL550
-	.8byte	.LVL553
+.LLST157:
+	.8byte	.LVL591
+	.8byte	.LVL594
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST154:
-	.8byte	.LVL551
-	.8byte	.LVL552
+.LLST158:
+	.8byte	.LVL592
+	.8byte	.LVL593
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST155:
-	.8byte	.LVL554
-	.8byte	.LVL556-1
+.LLST159:
+	.8byte	.LVL595
+	.8byte	.LVL597-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST156:
-	.8byte	.LVL523
-	.8byte	.LVL528
+.LLST160:
+	.8byte	.LVL564
+	.8byte	.LVL569
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL561
-	.8byte	.LVL596
+	.8byte	.LVL602
+	.8byte	.LVL637
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL596
-	.8byte	.LVL597
+	.8byte	.LVL637
+	.8byte	.LVL638
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL600
-	.8byte	.LVL613
+	.8byte	.LVL641
+	.8byte	.LVL654
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL614
-	.8byte	.LVL619
+	.8byte	.LVL655
+	.8byte	.LVL660
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL642
-	.8byte	.LVL649
+	.8byte	.LVL683
+	.8byte	.LVL690
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
 	.8byte	0
 	.8byte	0
-.LLST157:
-	.8byte	.LVL523
-	.8byte	.LVL528
+.LLST161:
+	.8byte	.LVL564
+	.8byte	.LVL569
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL561
-	.8byte	.LVL610
+	.8byte	.LVL602
+	.8byte	.LVL651
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL610
-	.8byte	.LVL611
+	.8byte	.LVL651
+	.8byte	.LVL652
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL614
-	.8byte	.LVL619
+	.8byte	.LVL655
+	.8byte	.LVL660
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL642
-	.8byte	.LFE2847
+	.8byte	.LVL683
+	.8byte	.LFE2848
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
 	.8byte	0
 	.8byte	0
-.LLST158:
-	.8byte	.LVL523
-	.8byte	.LVL526
+.LLST162:
+	.8byte	.LVL564
+	.8byte	.LVL567
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL567
-	.8byte	.LVL578
+	.8byte	.LVL608
+	.8byte	.LVL619
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL582
-	.8byte	.LVL592
+	.8byte	.LVL623
+	.8byte	.LVL633
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL600
-	.8byte	.LVL602
+	.8byte	.LVL641
+	.8byte	.LVL643
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL607
-	.8byte	.LVL613
+	.8byte	.LVL648
+	.8byte	.LVL654
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL642
-	.8byte	.LVL646
+	.8byte	.LVL683
+	.8byte	.LVL687
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL650
-	.8byte	.LFE2847
+	.8byte	.LVL691
+	.8byte	.LFE2848
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST159:
-	.8byte	.LVL523
-	.8byte	.LVL527
+.LLST163:
+	.8byte	.LVL564
+	.8byte	.LVL568
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL572
-	.8byte	.LVL592
+	.8byte	.LVL613
+	.8byte	.LVL633
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL599
-	.8byte	.LVL613
+	.8byte	.LVL640
+	.8byte	.LVL654
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL614
-	.8byte	.LVL619
+	.8byte	.LVL655
+	.8byte	.LVL660
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL642
-	.8byte	.LVL646
+	.8byte	.LVL683
+	.8byte	.LVL687
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST160:
-	.8byte	.LVL523
-	.8byte	.LVL526
+.LLST164:
+	.8byte	.LVL564
+	.8byte	.LVL567
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL563
-	.8byte	.LVL569
+	.8byte	.LVL604
+	.8byte	.LVL610
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL570
-	.8byte	.LVL573
+	.8byte	.LVL611
+	.8byte	.LVL614
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL582
-	.8byte	.LVL600
+	.8byte	.LVL623
+	.8byte	.LVL641
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL642
-	.8byte	.LVL643
+	.8byte	.LVL683
+	.8byte	.LVL684
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL646
-	.8byte	.LFE2847
+	.8byte	.LVL687
+	.8byte	.LFE2848
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST161:
-	.8byte	.LVL523
-	.8byte	.LVL527
+.LLST165:
+	.8byte	.LVL564
+	.8byte	.LVL568
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL565
-	.8byte	.LVL572
+	.8byte	.LVL606
+	.8byte	.LVL613
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL574
-	.8byte	.LVL599
+	.8byte	.LVL615
+	.8byte	.LVL640
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL605
-	.8byte	.LVL607
+	.8byte	.LVL646
+	.8byte	.LVL648
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL614
-	.8byte	.LVL619
+	.8byte	.LVL655
+	.8byte	.LVL660
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL642
-	.8byte	.LVL643
+	.8byte	.LVL683
+	.8byte	.LVL684
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL646
-	.8byte	.LFE2847
+	.8byte	.LVL687
+	.8byte	.LFE2848
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST162:
-	.8byte	.LVL523
-	.8byte	.LVL527
+.LLST166:
+	.8byte	.LVL564
+	.8byte	.LVL568
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL568
-	.8byte	.LVL592
+	.8byte	.LVL609
+	.8byte	.LVL633
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL595
-	.8byte	.LVL613
+	.8byte	.LVL636
+	.8byte	.LVL654
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL614
-	.8byte	.LVL619
+	.8byte	.LVL655
+	.8byte	.LVL660
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL642
-	.8byte	.LVL646
+	.8byte	.LVL683
+	.8byte	.LVL687
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL646
-	.8byte	.LVL647
+	.8byte	.LVL687
+	.8byte	.LVL688
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL647
-	.8byte	.LFE2847
+	.8byte	.LVL688
+	.8byte	.LFE2848
 	.2byte	0x1
 	.byte	0x6b
 	.8byte	0
 	.8byte	0
-.LLST163:
-	.8byte	.LVL523
-	.8byte	.LVL526
+.LLST167:
+	.8byte	.LVL564
+	.8byte	.LVL567
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL569
-	.8byte	.LVL592
+	.8byte	.LVL610
+	.8byte	.LVL633
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL600
-	.8byte	.LVL613
+	.8byte	.LVL641
+	.8byte	.LVL654
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL614
-	.8byte	.LVL619
+	.8byte	.LVL655
+	.8byte	.LVL660
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL642
-	.8byte	.LVL643
+	.8byte	.LVL683
+	.8byte	.LVL684
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL643
-	.8byte	.LVL644
+	.8byte	.LVL684
+	.8byte	.LVL685
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL644
-	.8byte	.LVL646
+	.8byte	.LVL685
+	.8byte	.LVL687
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST164:
-	.8byte	.LVL523
-	.8byte	.LVL526
+.LLST168:
+	.8byte	.LVL564
+	.8byte	.LVL567
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL578
-	.8byte	.LVL592
+	.8byte	.LVL619
+	.8byte	.LVL633
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL605
-	.8byte	.LVL607
+	.8byte	.LVL646
+	.8byte	.LVL648
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL614
-	.8byte	.LVL616
+	.8byte	.LVL655
+	.8byte	.LVL657
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL642
-	.8byte	.LVL643
+	.8byte	.LVL683
+	.8byte	.LVL684
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST71:
-	.8byte	.LVL268
-	.8byte	.LVL269
+.LLST75:
+	.8byte	.LVL298
+	.8byte	.LVL299
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST72:
-	.8byte	.LVL268
-	.8byte	.LVL270-1
+.LLST76:
+	.8byte	.LVL298
+	.8byte	.LVL300-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST73:
-	.8byte	.LVL268
-	.8byte	.LVL270-1
+.LLST77:
+	.8byte	.LVL298
+	.8byte	.LVL300-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST74:
-	.8byte	.LVL271
-	.8byte	.LVL272
+.LLST78:
+	.8byte	.LVL301
+	.8byte	.LVL302
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST75:
-	.8byte	.LVL271
-	.8byte	.LVL273
+.LLST79:
+	.8byte	.LVL301
+	.8byte	.LVL303
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST76:
-	.8byte	.LVL271
-	.8byte	.LVL274
+.LLST80:
+	.8byte	.LVL301
+	.8byte	.LVL304
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL274
-	.8byte	.LVL275-1
+	.8byte	.LVL304
+	.8byte	.LVL305-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST77:
-	.8byte	.LVL276
-	.8byte	.LVL277
+.LLST81:
+	.8byte	.LVL306
+	.8byte	.LVL307
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST78:
-	.8byte	.LVL276
-	.8byte	.LVL278
+.LLST82:
+	.8byte	.LVL306
+	.8byte	.LVL308
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST79:
-	.8byte	.LVL276
-	.8byte	.LVL279
+.LLST83:
+	.8byte	.LVL306
+	.8byte	.LVL309
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL279
-	.8byte	.LVL280-1
+	.8byte	.LVL309
+	.8byte	.LVL310-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST89:
-	.8byte	.LVL301
-	.8byte	.LVL302
+.LLST93:
+	.8byte	.LVL331
+	.8byte	.LVL332
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST90:
-	.8byte	.LVL301
-	.8byte	.LVL303
+.LLST94:
+	.8byte	.LVL331
+	.8byte	.LVL333
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST91:
-	.8byte	.LVL301
-	.8byte	.LVL305
+.LLST95:
+	.8byte	.LVL331
+	.8byte	.LVL335
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL305
-	.8byte	.LVL310
+	.8byte	.LVL335
+	.8byte	.LVL340
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL311
-	.8byte	.LFE2837
+	.8byte	.LVL341
+	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST92:
-	.8byte	.LVL301
-	.8byte	.LVL306-1
+.LLST96:
+	.8byte	.LVL331
+	.8byte	.LVL336-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL306-1
-	.8byte	.LVL309
+	.8byte	.LVL336-1
+	.8byte	.LVL339
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL311
-	.8byte	.LVL312
+	.8byte	.LVL341
+	.8byte	.LVL342
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL314
-	.8byte	.LVL315
+	.8byte	.LVL344
+	.8byte	.LVL345
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST93:
-	.8byte	.LVL304
-	.8byte	.LVL310
+.LLST97:
+	.8byte	.LVL334
+	.8byte	.LVL340
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL311
-	.8byte	.LFE2837
+	.8byte	.LVL341
+	.8byte	.LFE2838
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST94:
-	.8byte	.LVL307
-	.8byte	.LVL311
+.LLST98:
+	.8byte	.LVL337
+	.8byte	.LVL341
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
-	.8byte	.LVL314
-	.8byte	.LFE2837
+	.8byte	.LVL344
+	.8byte	.LFE2838
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
 	.8byte	0
 	.8byte	0
-.LLST80:
-	.8byte	.LVL281
-	.8byte	.LVL282
+.LLST84:
+	.8byte	.LVL311
+	.8byte	.LVL312
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST81:
-	.8byte	.LVL281
-	.8byte	.LVL283
+.LLST85:
+	.8byte	.LVL311
+	.8byte	.LVL313
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST82:
-	.8byte	.LVL281
-	.8byte	.LVL284-1
+.LLST86:
+	.8byte	.LVL311
+	.8byte	.LVL314-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL284-1
-	.8byte	.LVL286
+	.8byte	.LVL314-1
+	.8byte	.LVL316
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST83:
-	.8byte	.LVL287
-	.8byte	.LVL288
+.LLST87:
+	.8byte	.LVL317
+	.8byte	.LVL318
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST84:
-	.8byte	.LVL287
-	.8byte	.LVL289
+.LLST88:
+	.8byte	.LVL317
+	.8byte	.LVL319
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST85:
-	.8byte	.LVL287
-	.8byte	.LVL290
+.LLST89:
+	.8byte	.LVL317
+	.8byte	.LVL320
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL290
-	.8byte	.LVL293
+	.8byte	.LVL320
+	.8byte	.LVL323
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL294
-	.8byte	.LFE2835
+	.8byte	.LVL324
+	.8byte	.LFE2836
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST86:
-	.8byte	.LVL296
-	.8byte	.LVL297
+.LLST90:
+	.8byte	.LVL326
+	.8byte	.LVL327
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST87:
-	.8byte	.LVL296
-	.8byte	.LVL298
+.LLST91:
+	.8byte	.LVL326
+	.8byte	.LVL328
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST88:
-	.8byte	.LVL296
-	.8byte	.LVL299
+.LLST92:
+	.8byte	.LVL326
+	.8byte	.LVL329
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL299
-	.8byte	.LVL300-1
+	.8byte	.LVL329
+	.8byte	.LVL330-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST95:
-	.8byte	.LVL318
-	.8byte	.LVL319-1
+.LLST99:
+	.8byte	.LVL348
+	.8byte	.LVL349-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST96:
-	.8byte	.LVL318
-	.8byte	.LVL319-1
+.LLST100:
+	.8byte	.LVL348
+	.8byte	.LVL349-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST97:
-	.8byte	.LVL318
-	.8byte	.LVL319-1
+.LLST101:
+	.8byte	.LVL348
+	.8byte	.LVL349-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL319-1
-	.8byte	.LVL321
+	.8byte	.LVL349-1
+	.8byte	.LVL351
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST6:
-	.8byte	.LVL32
-	.8byte	.LVL33
+.LLST10:
+	.8byte	.LVL62
+	.8byte	.LVL63
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST10:
-	.8byte	.LVL45
-	.8byte	.LVL46-1
+.LLST14:
+	.8byte	.LVL75
+	.8byte	.LVL76-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST11:
-	.8byte	.LVL45
-	.8byte	.LVL46-1
+.LLST15:
+	.8byte	.LVL75
+	.8byte	.LVL76-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL46-1
-	.8byte	.LVL48
+	.8byte	.LVL76-1
+	.8byte	.LVL78
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST12:
-	.8byte	.LVL49
-	.8byte	.LVL50
+.LLST16:
+	.8byte	.LVL79
+	.8byte	.LVL80
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST13:
-	.8byte	.LVL49
-	.8byte	.LVL51-1
+.LLST17:
+	.8byte	.LVL79
+	.8byte	.LVL81-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL65
-	.8byte	.LVL66
+	.8byte	.LVL95
+	.8byte	.LVL96
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL68
-	.8byte	.LVL69
+	.8byte	.LVL98
+	.8byte	.LVL99
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL74
-	.8byte	.LVL76
+	.8byte	.LVL104
+	.8byte	.LVL106
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL96
-	.8byte	.LVL97-1
+	.8byte	.LVL126
+	.8byte	.LVL127-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL98
-	.8byte	.LVL100
+	.8byte	.LVL128
+	.8byte	.LVL130
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL122
-	.8byte	.LVL123-1
+	.8byte	.LVL152
+	.8byte	.LVL153-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL138
-	.8byte	.LVL140
+	.8byte	.LVL168
+	.8byte	.LVL170
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL152
-	.8byte	.LVL153
+	.8byte	.LVL182
+	.8byte	.LVL183
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL155
-	.8byte	.LVL156-1
+	.8byte	.LVL185
+	.8byte	.LVL186-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL157
-	.8byte	.LVL158-1
+	.8byte	.LVL187
+	.8byte	.LVL188-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL163
-	.8byte	.LVL165
+	.8byte	.LVL193
+	.8byte	.LVL195
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL174
-	.8byte	.LVL175
+	.8byte	.LVL204
+	.8byte	.LVL205
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL177
-	.8byte	.LVL178-1
+	.8byte	.LVL207
+	.8byte	.LVL208-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST14:
-	.8byte	.LVL49
-	.8byte	.LVL65
+.LLST18:
+	.8byte	.LVL79
+	.8byte	.LVL95
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL65
-	.8byte	.LVL73
+	.8byte	.LVL95
+	.8byte	.LVL103
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL74
-	.8byte	.LVL89
+	.8byte	.LVL104
+	.8byte	.LVL119
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL95
-	.8byte	.LVL220
+	.8byte	.LVL125
+	.8byte	.LVL250
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL222
-	.8byte	.LFE2830
+	.8byte	.LVL252
+	.8byte	.LFE2831
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST29:
-	.8byte	.LVL70
-	.8byte	.LVL71
+.LLST33:
+	.8byte	.LVL100
+	.8byte	.LVL101
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL92
-	.8byte	.LVL93-1
+	.8byte	.LVL122
+	.8byte	.LVL123-1
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL95
-	.8byte	.LVL96
+	.8byte	.LVL125
+	.8byte	.LVL126
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST15:
-	.8byte	.LVL58
-	.8byte	.LVL60
+.LLST19:
+	.8byte	.LVL88
+	.8byte	.LVL90
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL61
-	.8byte	.LVL62
+	.8byte	.LVL91
+	.8byte	.LVL92
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST16:
-	.8byte	.LVL61
-	.8byte	.LVL63
+.LLST20:
+	.8byte	.LVL91
+	.8byte	.LVL93
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL114
-	.8byte	.LVL116
+	.8byte	.LVL144
+	.8byte	.LVL146
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST17:
-	.8byte	.LVL55
-	.8byte	.LVL64-1
+.LLST21:
+	.8byte	.LVL85
+	.8byte	.LVL94-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL114
-	.8byte	.LVL115
+	.8byte	.LVL144
+	.8byte	.LVL145
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST18:
-	.8byte	.LVL54
-	.8byte	.LVL57
+.LLST22:
+	.8byte	.LVL84
+	.8byte	.LVL87
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL59
-	.8byte	.LVL64-1
+	.8byte	.LVL89
+	.8byte	.LVL94-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL114
-	.8byte	.LVL118
+	.8byte	.LVL144
+	.8byte	.LVL148
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST19:
-	.8byte	.LVL119
-	.8byte	.LVL121-1
+.LLST23:
+	.8byte	.LVL149
+	.8byte	.LVL151-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST20:
-	.8byte	.LVL117
-	.8byte	.LVL120
+.LLST24:
+	.8byte	.LVL147
+	.8byte	.LVL150
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST21:
-	.8byte	.LVL116
-	.8byte	.LVL119
+.LLST25:
+	.8byte	.LVL146
+	.8byte	.LVL149
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST22:
-	.8byte	.LVL77
-	.8byte	.LVL78
+.LLST26:
+	.8byte	.LVL107
+	.8byte	.LVL108
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL79
-	.8byte	.LVL80
+	.8byte	.LVL109
+	.8byte	.LVL110
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL191
-	.8byte	.LVL192
+	.8byte	.LVL221
+	.8byte	.LVL222
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST23:
-	.8byte	.LVL70
-	.8byte	.LVL71
+.LLST27:
+	.8byte	.LVL100
+	.8byte	.LVL101
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL79
-	.8byte	.LVL81
+	.8byte	.LVL109
+	.8byte	.LVL111
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL219
-	.8byte	.LVL220
+	.8byte	.LVL249
+	.8byte	.LVL250
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST24:
-	.8byte	.LVL70
-	.8byte	.LVL72
+.LLST28:
+	.8byte	.LVL100
+	.8byte	.LVL102
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL76
-	.8byte	.LVL82
+	.8byte	.LVL106
+	.8byte	.LVL112
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL190
-	.8byte	.LVL192
+	.8byte	.LVL220
+	.8byte	.LVL222
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL219
-	.8byte	.LVL220
+	.8byte	.LVL249
+	.8byte	.LVL250
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST25:
-	.8byte	.LVL75
-	.8byte	.LVL78
+.LLST29:
+	.8byte	.LVL105
+	.8byte	.LVL108
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL190
-	.8byte	.LVL191
+	.8byte	.LVL220
+	.8byte	.LVL221
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST26:
-	.8byte	.LVL84
-	.8byte	.LVL86-1
+.LLST30:
+	.8byte	.LVL114
+	.8byte	.LVL116-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST27:
-	.8byte	.LVL83
-	.8byte	.LVL85
+.LLST31:
+	.8byte	.LVL113
+	.8byte	.LVL115
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST28:
-	.8byte	.LVL82
-	.8byte	.LVL84
+.LLST32:
+	.8byte	.LVL112
+	.8byte	.LVL114
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST30:
-	.8byte	.LVL101
-	.8byte	.LVL102
+.LLST34:
+	.8byte	.LVL131
+	.8byte	.LVL132
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL103
-	.8byte	.LVL104
+	.8byte	.LVL133
+	.8byte	.LVL134
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL189
-	.8byte	.LVL190
+	.8byte	.LVL219
+	.8byte	.LVL220
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST31:
-	.8byte	.LVL70
-	.8byte	.LVL71
+.LLST35:
+	.8byte	.LVL100
+	.8byte	.LVL101
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL103
-	.8byte	.LVL105
+	.8byte	.LVL133
+	.8byte	.LVL135
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL219
-	.8byte	.LVL220
+	.8byte	.LVL249
+	.8byte	.LVL250
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST32:
-	.8byte	.LVL70
-	.8byte	.LVL72
-	.2byte	0x1
-	.byte	0x51
+.LLST36:
 	.8byte	.LVL100
-	.8byte	.LVL106
+	.8byte	.LVL102
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL188
-	.8byte	.LVL190
+	.8byte	.LVL130
+	.8byte	.LVL136
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL219
+	.8byte	.LVL218
 	.8byte	.LVL220
 	.2byte	0x1
 	.byte	0x51
+	.8byte	.LVL249
+	.8byte	.LVL250
+	.2byte	0x1
+	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST33:
-	.8byte	.LVL99
-	.8byte	.LVL102
+.LLST37:
+	.8byte	.LVL129
+	.8byte	.LVL132
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL188
-	.8byte	.LVL189
+	.8byte	.LVL218
+	.8byte	.LVL219
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST34:
-	.8byte	.LVL108
-	.8byte	.LVL110-1
+.LLST38:
+	.8byte	.LVL138
+	.8byte	.LVL140-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST35:
-	.8byte	.LVL107
-	.8byte	.LVL109
+.LLST39:
+	.8byte	.LVL137
+	.8byte	.LVL139
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST36:
-	.8byte	.LVL106
-	.8byte	.LVL108
+.LLST40:
+	.8byte	.LVL136
+	.8byte	.LVL138
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST37:
-	.8byte	.LVL127
-	.8byte	.LVL128
+.LLST41:
+	.8byte	.LVL157
+	.8byte	.LVL158
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL129
-	.8byte	.LVL130
+	.8byte	.LVL159
+	.8byte	.LVL160
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL202
-	.8byte	.LVL203
+	.8byte	.LVL232
+	.8byte	.LVL233
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST38:
-	.8byte	.LVL70
-	.8byte	.LVL71
+.LLST42:
+	.8byte	.LVL100
+	.8byte	.LVL101
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL129
-	.8byte	.LVL132
+	.8byte	.LVL159
+	.8byte	.LVL162
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST39:
-	.8byte	.LVL70
-	.8byte	.LVL72
+.LLST43:
+	.8byte	.LVL100
+	.8byte	.LVL102
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL126
-	.8byte	.LVL131
+	.8byte	.LVL156
+	.8byte	.LVL161
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL200
-	.8byte	.LVL203
+	.8byte	.LVL230
+	.8byte	.LVL233
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST40:
-	.8byte	.LVL70
-	.8byte	.LVL72
+.LLST44:
+	.8byte	.LVL100
+	.8byte	.LVL102
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL125
-	.8byte	.LVL134
+	.8byte	.LVL155
+	.8byte	.LVL164
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL200
-	.8byte	.LVL201
+	.8byte	.LVL230
+	.8byte	.LVL231
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST41:
-	.8byte	.LVL135
-	.8byte	.LVL137-1
+.LLST45:
+	.8byte	.LVL165
+	.8byte	.LVL167-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST42:
-	.8byte	.LVL133
-	.8byte	.LVL136
+.LLST46:
+	.8byte	.LVL163
+	.8byte	.LVL166
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST43:
-	.8byte	.LVL132
-	.8byte	.LVL135
+.LLST47:
+	.8byte	.LVL162
+	.8byte	.LVL165
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST44:
-	.8byte	.LVL149
-	.8byte	.LVL150
+.LLST48:
+	.8byte	.LVL179
+	.8byte	.LVL180
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL224
-	.8byte	.LVL226
+	.8byte	.LVL254
+	.8byte	.LVL256
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL229
-	.8byte	.LFE2830
+	.8byte	.LVL259
+	.8byte	.LFE2831
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST45:
-	.8byte	.LVL141
-	.8byte	.LVL142
+.LLST49:
+	.8byte	.LVL171
+	.8byte	.LVL172
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL143
-	.8byte	.LVL144
+	.8byte	.LVL173
+	.8byte	.LVL174
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL196
-	.8byte	.LVL197
+	.8byte	.LVL226
+	.8byte	.LVL227
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST46:
-	.8byte	.LVL143
-	.8byte	.LVL149-1
+.LLST50:
+	.8byte	.LVL173
+	.8byte	.LVL179-1
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL223
-	.8byte	.LVL224
+	.8byte	.LVL253
+	.8byte	.LVL254
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL224
-	.8byte	.LVL227-1
+	.8byte	.LVL254
+	.8byte	.LVL257-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL230
-	.8byte	.LFE2830
+	.8byte	.LVL260
+	.8byte	.LFE2831
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST47:
-	.8byte	.LVL140
-	.8byte	.LVL145
+.LLST51:
+	.8byte	.LVL170
+	.8byte	.LVL175
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL195
-	.8byte	.LVL197
+	.8byte	.LVL225
+	.8byte	.LVL227
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL223
-	.8byte	.LVL225
+	.8byte	.LVL253
+	.8byte	.LVL255
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST48:
-	.8byte	.LVL139
-	.8byte	.LVL142
+.LLST52:
+	.8byte	.LVL169
+	.8byte	.LVL172
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL195
-	.8byte	.LVL196
+	.8byte	.LVL225
+	.8byte	.LVL226
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST49:
-	.8byte	.LVL147
-	.8byte	.LVL149-1
+.LLST53:
+	.8byte	.LVL177
+	.8byte	.LVL179-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST50:
-	.8byte	.LVL146
-	.8byte	.LVL148
+.LLST54:
+	.8byte	.LVL176
+	.8byte	.LVL178
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST51:
-	.8byte	.LVL145
-	.8byte	.LVL147
+.LLST55:
+	.8byte	.LVL175
+	.8byte	.LVL177
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST52:
-	.8byte	.LVL56
-	.8byte	.LVL62
+.LLST56:
+	.8byte	.LVL86
+	.8byte	.LVL92
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL162
-	.8byte	.LVL163
+	.8byte	.LVL192
+	.8byte	.LVL193
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST53:
-	.8byte	.LVL56
-	.8byte	.LVL57
+.LLST57:
+	.8byte	.LVL86
+	.8byte	.LVL87
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL59
-	.8byte	.LVL64-1
+	.8byte	.LVL89
+	.8byte	.LVL94-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL114
-	.8byte	.LVL118
+	.8byte	.LVL144
+	.8byte	.LVL148
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL161
-	.8byte	.LVL163
+	.8byte	.LVL191
+	.8byte	.LVL193
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST54:
-	.8byte	.LVL167
-	.8byte	.LVL168
+.LLST58:
+	.8byte	.LVL197
+	.8byte	.LVL198
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL169
-	.8byte	.LVL170
+	.8byte	.LVL199
+	.8byte	.LVL200
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL194
-	.8byte	.LVL195
+	.8byte	.LVL224
+	.8byte	.LVL225
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST55:
-	.8byte	.LVL169
-	.8byte	.LVL171
+.LLST59:
+	.8byte	.LVL199
+	.8byte	.LVL201
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL203
-	.8byte	.LVL205
+	.8byte	.LVL233
+	.8byte	.LVL235
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST56:
-	.8byte	.LVL166
-	.8byte	.LVL172
+.LLST60:
+	.8byte	.LVL196
+	.8byte	.LVL202
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL192
-	.8byte	.LVL195
+	.8byte	.LVL222
+	.8byte	.LVL225
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL203
-	.8byte	.LVL204
+	.8byte	.LVL233
+	.8byte	.LVL234
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST57:
-	.8byte	.LVL164
-	.8byte	.LVL173-1
+.LLST61:
+	.8byte	.LVL194
+	.8byte	.LVL203-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL192
-	.8byte	.LVL193
+	.8byte	.LVL222
+	.8byte	.LVL223
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL203
-	.8byte	.LVL207
+	.8byte	.LVL233
+	.8byte	.LVL237
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST58:
-	.8byte	.LVL208
-	.8byte	.LVL210-1
+.LLST62:
+	.8byte	.LVL238
+	.8byte	.LVL240-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST59:
-	.8byte	.LVL206
-	.8byte	.LVL209
+.LLST63:
+	.8byte	.LVL236
+	.8byte	.LVL239
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST60:
-	.8byte	.LVL205
-	.8byte	.LVL208
+.LLST64:
+	.8byte	.LVL235
+	.8byte	.LVL238
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST61:
-	.8byte	.LVL182
-	.8byte	.LVL183
+.LLST65:
+	.8byte	.LVL212
+	.8byte	.LVL213
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL184
-	.8byte	.LVL185
+	.8byte	.LVL214
+	.8byte	.LVL215
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL199
-	.8byte	.LVL200
+	.8byte	.LVL229
+	.8byte	.LVL230
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST62:
-	.8byte	.LVL184
-	.8byte	.LVL186
+.LLST66:
+	.8byte	.LVL214
+	.8byte	.LVL216
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL211
-	.8byte	.LVL213
+	.8byte	.LVL241
+	.8byte	.LVL243
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST63:
-	.8byte	.LVL181
-	.8byte	.LVL187-1
+.LLST67:
+	.8byte	.LVL211
+	.8byte	.LVL217-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL197
-	.8byte	.LVL200
+	.8byte	.LVL227
+	.8byte	.LVL230
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL211
-	.8byte	.LVL212
+	.8byte	.LVL241
+	.8byte	.LVL242
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST64:
-	.8byte	.LVL180
-	.8byte	.LVL187-1
+.LLST68:
+	.8byte	.LVL210
+	.8byte	.LVL217-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL197
-	.8byte	.LVL198
+	.8byte	.LVL227
+	.8byte	.LVL228
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL211
-	.8byte	.LVL215
+	.8byte	.LVL241
+	.8byte	.LVL245
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST65:
-	.8byte	.LVL216
-	.8byte	.LVL218-1
+.LLST69:
+	.8byte	.LVL246
+	.8byte	.LVL248-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST66:
-	.8byte	.LVL214
-	.8byte	.LVL217
+.LLST70:
+	.8byte	.LVL244
+	.8byte	.LVL247
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST67:
-	.8byte	.LVL213
-	.8byte	.LVL216
+.LLST71:
+	.8byte	.LVL243
+	.8byte	.LVL246
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST68:
-	.8byte	.LVL241
-	.8byte	.LVL242-1
+.LLST72:
+	.8byte	.LVL271
+	.8byte	.LVL272-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST8:
-	.8byte	.LVL39
-	.8byte	.LVL40
+.LLST12:
+	.8byte	.LVL69
+	.8byte	.LVL70
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST179:
-	.8byte	.LVL704
-	.8byte	.LVL706
+.LLST183:
+	.8byte	.LVL745
+	.8byte	.LVL747
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST180:
-	.8byte	.LVL705
-	.8byte	.LVL713
+.LLST184:
+	.8byte	.LVL746
+	.8byte	.LVL754
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL717
-	.8byte	.LFE2825
+	.8byte	.LVL758
+	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST181:
-	.8byte	.LVL708
-	.8byte	.LVL716
+.LLST185:
+	.8byte	.LVL749
+	.8byte	.LVL757
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL717
-	.8byte	.LVL718
+	.8byte	.LVL758
+	.8byte	.LVL759
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL718
-	.8byte	.LVL728
+	.8byte	.LVL759
+	.8byte	.LVL769
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL728
-	.8byte	.LVL749
+	.8byte	.LVL769
+	.8byte	.LVL790
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL749
-	.8byte	.LVL763
+	.8byte	.LVL790
+	.8byte	.LVL804
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL763
-	.8byte	.LVL764
+	.8byte	.LVL804
+	.8byte	.LVL805
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL764
-	.8byte	.LVL813
+	.8byte	.LVL805
+	.8byte	.LVL854
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL813
-	.8byte	.LVL814
+	.8byte	.LVL854
+	.8byte	.LVL855
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL814
-	.8byte	.LFE2825
+	.8byte	.LVL855
+	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST182:
-	.8byte	.LVL750
-	.8byte	.LVL751-1
+.LLST186:
+	.8byte	.LVL791
+	.8byte	.LVL792-1
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL752
-	.8byte	.LVL753-1
+	.8byte	.LVL793
+	.8byte	.LVL794-1
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL799
-	.8byte	.LVL800-1
+	.8byte	.LVL840
+	.8byte	.LVL841-1
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL825
-	.8byte	.LVL826
+	.8byte	.LVL866
+	.8byte	.LVL867
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST183:
-	.8byte	.LVL707
-	.8byte	.LVL714
+.LLST187:
+	.8byte	.LVL748
+	.8byte	.LVL755
 	.2byte	0x1
 	.byte	0x67
-	.8byte	.LVL717
-	.8byte	.LFE2825
+	.8byte	.LVL758
+	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x67
 	.8byte	0
 	.8byte	0
-.LLST184:
-	.8byte	.LVL708
-	.8byte	.LVL715
+.LLST188:
+	.8byte	.LVL749
+	.8byte	.LVL756
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL717
-	.8byte	.LVL780
+	.8byte	.LVL758
+	.8byte	.LVL821
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL784
-	.8byte	.LVL787
+	.8byte	.LVL825
+	.8byte	.LVL828
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL792
-	.8byte	.LVL805
+	.8byte	.LVL833
+	.8byte	.LVL846
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL810
-	.8byte	.LVL812
+	.8byte	.LVL851
+	.8byte	.LVL853
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL813
-	.8byte	.LVL837
+	.8byte	.LVL854
+	.8byte	.LVL878
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL843
-	.8byte	.LFE2825
+	.8byte	.LVL884
+	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST198:
-	.8byte	.LVL802
-	.8byte	.LVL803
+.LLST202:
+	.8byte	.LVL843
+	.8byte	.LVL844
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL839
-	.8byte	.LVL840-1
+	.8byte	.LVL880
+	.8byte	.LVL881-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST197:
-	.8byte	.LVL796
-	.8byte	.LVL797
+.LLST201:
+	.8byte	.LVL837
+	.8byte	.LVL838
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL830
-	.8byte	.LVL831-1
+	.8byte	.LVL871
+	.8byte	.LVL872-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST186:
-	.8byte	.LVL719
-	.8byte	.LVL720
+.LLST190:
+	.8byte	.LVL760
+	.8byte	.LVL761
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL758
-	.8byte	.LVL759-1
+	.8byte	.LVL799
+	.8byte	.LVL800-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST185:
-	.8byte	.LVL708
-	.8byte	.LVL709
+.LLST189:
+	.8byte	.LVL749
+	.8byte	.LVL750
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL721
-	.8byte	.LVL722
+	.8byte	.LVL762
+	.8byte	.LVL763
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL724
-	.8byte	.LVL725-1
+	.8byte	.LVL765
+	.8byte	.LVL766-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST187:
-	.8byte	.LVL740
-	.8byte	.LVL742-1
+.LLST191:
+	.8byte	.LVL781
+	.8byte	.LVL783-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL755
-	.8byte	.LVL756-1
+	.8byte	.LVL796
+	.8byte	.LVL797-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL775
-	.8byte	.LVL792
+	.8byte	.LVL816
+	.8byte	.LVL833
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL805
-	.8byte	.LVL811-1
+	.8byte	.LVL846
+	.8byte	.LVL852-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL812
-	.8byte	.LVL813
+	.8byte	.LVL853
+	.8byte	.LVL854
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL817
-	.8byte	.LVL819-1
+	.8byte	.LVL858
+	.8byte	.LVL860-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL834
-	.8byte	.LVL835-1
+	.8byte	.LVL875
+	.8byte	.LVL876-1
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST188:
-	.8byte	.LVL780
-	.8byte	.LVL783
+.LLST192:
+	.8byte	.LVL821
+	.8byte	.LVL824
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL789
-	.8byte	.LVL792
+	.8byte	.LVL830
+	.8byte	.LVL833
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL805
-	.8byte	.LVL808
+	.8byte	.LVL846
+	.8byte	.LVL849
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL812
-	.8byte	.LVL813
+	.8byte	.LVL853
+	.8byte	.LVL854
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST189:
-	.8byte	.LVL708
-	.8byte	.LVL715
+.LLST193:
+	.8byte	.LVL749
+	.8byte	.LVL756
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL717
-	.8byte	.LVL729
+	.8byte	.LVL758
+	.8byte	.LVL770
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL737
-	.8byte	.LVL741
+	.8byte	.LVL778
+	.8byte	.LVL782
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL745
-	.8byte	.LVL747
+	.8byte	.LVL786
+	.8byte	.LVL788
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL748
-	.8byte	.LVL749
+	.8byte	.LVL789
+	.8byte	.LVL790
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL755
-	.8byte	.LVL765
+	.8byte	.LVL796
+	.8byte	.LVL806
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL779
-	.8byte	.LVL780
+	.8byte	.LVL820
+	.8byte	.LVL821
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL782
-	.8byte	.LVL788
+	.8byte	.LVL823
+	.8byte	.LVL829
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL807
-	.8byte	.LVL812
+	.8byte	.LVL848
+	.8byte	.LVL853
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL813
-	.8byte	.LVL818
+	.8byte	.LVL854
+	.8byte	.LVL859
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL834
-	.8byte	.LVL836
+	.8byte	.LVL875
+	.8byte	.LVL877
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL845
-	.8byte	.LVL847
+	.8byte	.LVL886
+	.8byte	.LVL888
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL851
-	.8byte	.LFE2825
+	.8byte	.LVL892
+	.8byte	.LFE2826
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST190:
-	.8byte	.LVL740
-	.8byte	.LVL742-1
+.LLST194:
+	.8byte	.LVL781
+	.8byte	.LVL783-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL755
-	.8byte	.LVL756-1
+	.8byte	.LVL796
+	.8byte	.LVL797-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL779
-	.8byte	.LVL781
+	.8byte	.LVL820
+	.8byte	.LVL822
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL782
-	.8byte	.LVL792
+	.8byte	.LVL823
+	.8byte	.LVL833
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL805
-	.8byte	.LVL806
+	.8byte	.LVL846
+	.8byte	.LVL847
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL810
-	.8byte	.LVL811-1
+	.8byte	.LVL851
+	.8byte	.LVL852-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL812
-	.8byte	.LVL813
+	.8byte	.LVL853
+	.8byte	.LVL854
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL817
-	.8byte	.LVL819-1
+	.8byte	.LVL858
+	.8byte	.LVL860-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL834
-	.8byte	.LVL835-1
+	.8byte	.LVL875
+	.8byte	.LVL876-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST191:
-	.8byte	.LVL740
-	.8byte	.LVL742-1
+.LLST195:
+	.8byte	.LVL781
+	.8byte	.LVL783-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL755
-	.8byte	.LVL756-1
+	.8byte	.LVL796
+	.8byte	.LVL797-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL779
-	.8byte	.LVL790
+	.8byte	.LVL820
+	.8byte	.LVL831
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL791
-	.8byte	.LVL792
+	.8byte	.LVL832
+	.8byte	.LVL833
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL805
-	.8byte	.LVL811-1
+	.8byte	.LVL846
+	.8byte	.LVL852-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL812
-	.8byte	.LVL813
+	.8byte	.LVL853
+	.8byte	.LVL854
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL817
-	.8byte	.LVL819-1
+	.8byte	.LVL858
+	.8byte	.LVL860-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL834
-	.8byte	.LVL835-1
+	.8byte	.LVL875
+	.8byte	.LVL876-1
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST192:
-	.8byte	.LVL740
-	.8byte	.LVL742-1
+.LLST196:
+	.8byte	.LVL781
+	.8byte	.LVL783-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL755
-	.8byte	.LVL756-1
+	.8byte	.LVL796
+	.8byte	.LVL797-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL779
-	.8byte	.LVL780
+	.8byte	.LVL820
+	.8byte	.LVL821
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL783
-	.8byte	.LVL785
+	.8byte	.LVL824
+	.8byte	.LVL826
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL785
-	.8byte	.LVL786
+	.8byte	.LVL826
+	.8byte	.LVL827
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL809
-	.8byte	.LVL811-1
+	.8byte	.LVL850
+	.8byte	.LVL852-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL817
-	.8byte	.LVL819-1
+	.8byte	.LVL858
+	.8byte	.LVL860-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL834
-	.8byte	.LVL835-1
+	.8byte	.LVL875
+	.8byte	.LVL876-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST193:
-	.8byte	.LVL740
-	.8byte	.LVL742-1
+.LLST197:
+	.8byte	.LVL781
+	.8byte	.LVL783-1
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL755
-	.8byte	.LVL756-1
+	.8byte	.LVL796
+	.8byte	.LVL797-1
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL778
-	.8byte	.LVL792
+	.8byte	.LVL819
+	.8byte	.LVL833
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL805
-	.8byte	.LVL811-1
+	.8byte	.LVL846
+	.8byte	.LVL852-1
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL812
-	.8byte	.LVL813
+	.8byte	.LVL853
+	.8byte	.LVL854
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL817
-	.8byte	.LVL819-1
+	.8byte	.LVL858
+	.8byte	.LVL860-1
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL834
-	.8byte	.LVL835-1
+	.8byte	.LVL875
+	.8byte	.LVL876-1
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST194:
-	.8byte	.LVL740
-	.8byte	.LVL742-1
+.LLST198:
+	.8byte	.LVL781
+	.8byte	.LVL783-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL755
-	.8byte	.LVL756-1
+	.8byte	.LVL796
+	.8byte	.LVL797-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL776
-	.8byte	.LVL792
+	.8byte	.LVL817
+	.8byte	.LVL833
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL805
-	.8byte	.LVL811-1
+	.8byte	.LVL846
+	.8byte	.LVL852-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL812
-	.8byte	.LVL813
+	.8byte	.LVL853
+	.8byte	.LVL854
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL817
-	.8byte	.LVL819-1
+	.8byte	.LVL858
+	.8byte	.LVL860-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL834
-	.8byte	.LVL835-1
+	.8byte	.LVL875
+	.8byte	.LVL876-1
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST195:
-	.8byte	.LVL740
-	.8byte	.LVL742-1
+.LLST199:
+	.8byte	.LVL781
+	.8byte	.LVL783-1
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL755
-	.8byte	.LVL756-1
+	.8byte	.LVL796
+	.8byte	.LVL797-1
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL778
-	.8byte	.LVL792
+	.8byte	.LVL819
+	.8byte	.LVL833
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL805
-	.8byte	.LVL811-1
+	.8byte	.LVL846
+	.8byte	.LVL852-1
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL812
-	.8byte	.LVL813
+	.8byte	.LVL853
+	.8byte	.LVL854
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL817
-	.8byte	.LVL819-1
+	.8byte	.LVL858
+	.8byte	.LVL860-1
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL834
-	.8byte	.LVL835-1
+	.8byte	.LVL875
+	.8byte	.LVL876-1
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST196:
-	.8byte	.LVL740
-	.8byte	.LVL742-1
+.LLST200:
+	.8byte	.LVL781
+	.8byte	.LVL783-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL755
-	.8byte	.LVL756-1
+	.8byte	.LVL796
+	.8byte	.LVL797-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL777
-	.8byte	.LVL792
+	.8byte	.LVL818
+	.8byte	.LVL833
+	.2byte	0x1
+	.byte	0x61
+	.8byte	.LVL846
+	.8byte	.LVL852-1
+	.2byte	0x1
+	.byte	0x61
+	.8byte	.LVL853
+	.8byte	.LVL854
+	.2byte	0x1
+	.byte	0x61
+	.8byte	.LVL858
+	.8byte	.LVL860-1
+	.2byte	0x1
+	.byte	0x61
+	.8byte	.LVL875
+	.8byte	.LVL876-1
+	.2byte	0x1
+	.byte	0x61
+	.8byte	0
+	.8byte	0
+.LLST73:
+	.8byte	.LVL273
+	.8byte	.LVL274
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL274
+	.8byte	.LVL280
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL281
+	.8byte	.LFE2824
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST74:
+	.8byte	.LVL275
+	.8byte	.LVL277
+	.2byte	0x2
+	.byte	0x71
+	.sleb128 -12
+	.8byte	.LVL277
+	.8byte	.LVL282
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 20
+	.8byte	.LVL282
+	.8byte	.LVL285
+	.2byte	0x2
+	.byte	0x71
+	.sleb128 -12
+	.8byte	.LVL285
+	.8byte	.LFE2824
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 20
+	.8byte	0
+	.8byte	0
+.LLST143:
+	.8byte	.LVL484
+	.8byte	.LVL485
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST142:
+	.8byte	.LVL457
+	.8byte	.LVL458
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL458
+	.8byte	.LVL462
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL463
+	.8byte	.LVL467
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL468
+	.8byte	.LVL472
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL473
+	.8byte	.LVL477
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL478
+	.8byte	.LVL480
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL481
+	.8byte	.LVL483
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST6:
+	.8byte	.LVL36
+	.8byte	.LVL45
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL46
+	.8byte	.LVL48
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL49
+	.8byte	.LVL51
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL52
+	.8byte	.LVL53
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL805
-	.8byte	.LVL811-1
+	.byte	0x56
+	.8byte	.LVL54
+	.8byte	.LVL55
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL812
-	.8byte	.LVL813
+	.byte	0x56
+	.8byte	.LVL56
+	.8byte	.LVL57
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL817
-	.8byte	.LVL819-1
+	.byte	0x56
+	.8byte	.LVL58
+	.8byte	.LVL59
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL834
-	.8byte	.LVL835-1
+	.byte	0x56
+	.8byte	.LVL60
+	.8byte	.LFE2812
 	.2byte	0x1
-	.byte	0x61
+	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST69:
-	.8byte	.LVL243
-	.8byte	.LVL244
+.LLST7:
+	.8byte	.LVL36
+	.8byte	.LVL37
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL244
-	.8byte	.LVL250
+	.byte	0x55
+	.8byte	.LVL38
+	.8byte	.LVL40
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL251
-	.8byte	.LFE2823
+	.byte	0x55
+	.8byte	.LVL41
+	.8byte	.LVL43
 	.2byte	0x1
-	.byte	0x65
-	.8byte	0
-	.8byte	0
-.LLST70:
-	.8byte	.LVL245
-	.8byte	.LVL247
-	.2byte	0x2
-	.byte	0x71
-	.sleb128 -12
-	.8byte	.LVL247
-	.8byte	.LVL252
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 20
-	.8byte	.LVL252
-	.8byte	.LVL255
-	.2byte	0x2
-	.byte	0x71
-	.sleb128 -12
-	.8byte	.LVL255
-	.8byte	.LFE2823
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 20
-	.8byte	0
-	.8byte	0
-.LLST139:
-	.8byte	.LVL445
-	.8byte	.LVL446
+	.byte	0x55
+	.8byte	.LVL44
+	.8byte	.LVL47
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x55
+	.8byte	.LVL50
+	.8byte	.LFE2812
+	.2byte	0x1
+	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST138:
-	.8byte	.LVL427
-	.8byte	.LVL428
+.LLST8:
+	.8byte	.LVL38
+	.8byte	.LVL39
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL428
-	.8byte	.LVL432
+	.byte	0x5a
+	.8byte	.LVL61
+	.8byte	.LFE2812
 	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL433
-	.8byte	.LVL437
+	.byte	0x5a
+	.8byte	0
+	.8byte	0
+.LLST9:
+	.8byte	.LVL36
+	.8byte	.LVL42
 	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL438
-	.8byte	.LVL442
+	.byte	0x58
+	.8byte	.LVL44
+	.8byte	.LVL47
 	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL443
-	.8byte	.LFE2820
+	.byte	0x58
+	.8byte	.LVL50
+	.8byte	.LFE2812
 	.2byte	0x1
-	.byte	0x64
+	.byte	0x58
 	.8byte	0
 	.8byte	0
 .LLST0:
@@ -49764,670 +50731,670 @@ __exitcall_ebc_exit:
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST176:
-	.8byte	.LVL692
-	.8byte	.LVL694
+.LLST180:
+	.8byte	.LVL733
+	.8byte	.LVL735
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST177:
-	.8byte	.LVL693
-	.8byte	.LVL696
+.LLST181:
+	.8byte	.LVL734
+	.8byte	.LVL737
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST178:
-	.8byte	.LVL696
-	.8byte	.LVL699
+.LLST182:
+	.8byte	.LVL737
+	.8byte	.LVL740
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL700
-	.8byte	.LVL703
+	.8byte	.LVL741
+	.8byte	.LVL744
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST172:
-	.8byte	.LVL681
-	.8byte	.LVL686
+.LLST176:
+	.8byte	.LVL722
+	.8byte	.LVL727
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL691
+	.8byte	.LVL732
 	.8byte	.LFE2808
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST173:
-	.8byte	.LVL687
-	.8byte	.LVL688
+.LLST177:
+	.8byte	.LVL728
+	.8byte	.LVL729
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST174:
-	.8byte	.LVL685
-	.8byte	.LVL689
+.LLST178:
+	.8byte	.LVL726
+	.8byte	.LVL730
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST175:
-	.8byte	.LVL688
-	.8byte	.LVL690
+.LLST179:
+	.8byte	.LVL729
+	.8byte	.LVL731
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST166:
-	.8byte	.LVL659
-	.8byte	.LVL665
+.LLST170:
+	.8byte	.LVL700
+	.8byte	.LVL706
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL669
-	.8byte	.LVL670
+	.8byte	.LVL710
+	.8byte	.LVL711
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL679
-	.8byte	.LVL680
+	.8byte	.LVL720
+	.8byte	.LVL721
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST167:
-	.8byte	.LVL659
-	.8byte	.LVL660
+.LLST171:
+	.8byte	.LVL700
+	.8byte	.LVL701
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST168:
-	.8byte	.LVL665
-	.8byte	.LVL668
+.LLST172:
+	.8byte	.LVL706
+	.8byte	.LVL709
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL672
-	.8byte	.LVL677
+	.8byte	.LVL713
+	.8byte	.LVL718
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL680
+	.8byte	.LVL721
 	.8byte	.LFE2807
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST169:
-	.8byte	.LVL664
-	.8byte	.LVL665
+.LLST173:
+	.8byte	.LVL705
+	.8byte	.LVL706
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL667
-	.8byte	.LVL671
+	.8byte	.LVL708
+	.8byte	.LVL712
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL676
-	.8byte	.LVL680
+	.8byte	.LVL717
+	.8byte	.LVL721
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST170:
-	.8byte	.LVL664
-	.8byte	.LVL666
+.LLST174:
+	.8byte	.LVL705
+	.8byte	.LVL707
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL667
-	.8byte	.LVL675
+	.8byte	.LVL708
+	.8byte	.LVL716
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL678
+	.8byte	.LVL719
 	.8byte	.LFE2807
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST171:
-	.8byte	.LVL664
-	.8byte	.LVL673
+.LLST175:
+	.8byte	.LVL705
+	.8byte	.LVL714
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL674
+	.8byte	.LVL715
 	.8byte	.LFE2807
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST98:
-	.8byte	.LVL323
-	.8byte	.LVL352
+.LLST102:
+	.8byte	.LVL353
+	.8byte	.LVL382
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL357
-	.8byte	.LVL360
+	.8byte	.LVL387
+	.8byte	.LVL390
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL363
-	.8byte	.LFE2814
+	.8byte	.LVL393
+	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST99:
-	.8byte	.LVL323
-	.8byte	.LVL351
+.LLST103:
+	.8byte	.LVL353
+	.8byte	.LVL381
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL357
-	.8byte	.LVL360
+	.8byte	.LVL387
+	.8byte	.LVL390
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL363
-	.8byte	.LFE2814
+	.8byte	.LVL393
+	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST100:
-	.8byte	.LVL323
-	.8byte	.LVL325
+.LLST104:
+	.8byte	.LVL353
+	.8byte	.LVL355
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL339
-	.8byte	.LVL341
+	.8byte	.LVL369
+	.8byte	.LVL371
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST101:
-	.8byte	.LVL324
-	.8byte	.LVL340
+.LLST105:
+	.8byte	.LVL354
+	.8byte	.LVL370
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL364
-	.8byte	.LFE2814
+	.8byte	.LVL394
+	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
-.LLST102:
-	.8byte	.LVL329
-	.8byte	.LVL339
+.LLST106:
+	.8byte	.LVL359
+	.8byte	.LVL369
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL364
-	.8byte	.LFE2814
+	.8byte	.LVL394
+	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST103:
-	.8byte	.LVL330
-	.8byte	.LVL339
+.LLST107:
+	.8byte	.LVL360
+	.8byte	.LVL369
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL364
-	.8byte	.LFE2814
+	.8byte	.LVL394
+	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST104:
-	.8byte	.LVL334
-	.8byte	.LVL336
+.LLST108:
+	.8byte	.LVL364
+	.8byte	.LVL366
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST105:
-	.8byte	.LVL331
-	.8byte	.LVL332
+.LLST109:
+	.8byte	.LVL361
+	.8byte	.LVL362
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL333
-	.8byte	.LVL337
+	.8byte	.LVL363
+	.8byte	.LVL367
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL338
-	.8byte	.LVL339
+	.8byte	.LVL368
+	.8byte	.LVL369
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL364
-	.8byte	.LFE2814
+	.8byte	.LVL394
+	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST106:
-	.8byte	.LVL326
-	.8byte	.LVL327
+.LLST110:
+	.8byte	.LVL356
+	.8byte	.LVL357
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST107:
-	.8byte	.LVL328
-	.8byte	.LVL339
+.LLST111:
+	.8byte	.LVL358
+	.8byte	.LVL369
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL364
-	.8byte	.LFE2814
+	.8byte	.LVL394
+	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST108:
-	.8byte	.LVL351
-	.8byte	.LVL353
+.LLST112:
+	.8byte	.LVL381
+	.8byte	.LVL383
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST109:
-	.8byte	.LVL352
-	.8byte	.LVL354
+.LLST113:
+	.8byte	.LVL382
+	.8byte	.LVL384
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST110:
-	.8byte	.LVL348
-	.8byte	.LVL349
+.LLST114:
+	.8byte	.LVL378
+	.8byte	.LVL379
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL350
-	.8byte	.LVL355
+	.8byte	.LVL380
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL356
-	.8byte	.LVL358
+	.8byte	.LVL386
+	.8byte	.LVL388
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL359
-	.8byte	.LVL361
+	.8byte	.LVL389
+	.8byte	.LVL391
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL362
-	.8byte	.LFE2814
+	.8byte	.LVL392
+	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST111:
-	.8byte	.LVL341
-	.8byte	.LVL342
+.LLST115:
+	.8byte	.LVL371
+	.8byte	.LVL372
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST112:
-	.8byte	.LVL365
-	.8byte	.LVL397
+.LLST116:
+	.8byte	.LVL395
+	.8byte	.LVL427
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL398
-	.8byte	.LVL400
+	.8byte	.LVL428
+	.8byte	.LVL430
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL415
-	.8byte	.LVL418
+	.8byte	.LVL445
+	.8byte	.LVL448
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST113:
-	.8byte	.LVL365
-	.8byte	.LVL401
+.LLST117:
+	.8byte	.LVL395
+	.8byte	.LVL431
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL415
-	.8byte	.LVL418
+	.8byte	.LVL445
+	.8byte	.LVL448
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST114:
-	.8byte	.LVL365
-	.8byte	.LVL367
+.LLST118:
+	.8byte	.LVL395
+	.8byte	.LVL397
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL385
-	.8byte	.LVL386
+	.8byte	.LVL415
+	.8byte	.LVL416
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST115:
-	.8byte	.LVL381
-	.8byte	.LVL385
+.LLST119:
+	.8byte	.LVL411
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL396
-	.8byte	.LVL409
+	.8byte	.LVL426
+	.8byte	.LVL439
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL414
-	.8byte	.LFE2817
+	.8byte	.LVL444
+	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST116:
-	.8byte	.LVL381
-	.8byte	.LVL385
+.LLST120:
+	.8byte	.LVL411
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL396
-	.8byte	.LVL397
+	.8byte	.LVL426
+	.8byte	.LVL427
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL398
-	.8byte	.LVL410
+	.8byte	.LVL428
+	.8byte	.LVL440
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL414
-	.8byte	.LFE2817
+	.8byte	.LVL444
+	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST117:
-	.8byte	.LVL381
-	.8byte	.LVL385
+.LLST121:
+	.8byte	.LVL411
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL394
-	.8byte	.LFE2817
+	.8byte	.LVL424
+	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST118:
-	.8byte	.LVL381
-	.8byte	.LVL385
+.LLST122:
+	.8byte	.LVL411
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL393
-	.8byte	.LFE2817
+	.8byte	.LVL423
+	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST119:
-	.8byte	.LVL381
-	.8byte	.LVL385
+.LLST123:
+	.8byte	.LVL411
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL398
-	.8byte	.LVL399
+	.8byte	.LVL428
+	.8byte	.LVL429
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL415
-	.8byte	.LVL416
+	.8byte	.LVL445
+	.8byte	.LVL446
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL417
-	.8byte	.LVL418
+	.8byte	.LVL447
+	.8byte	.LVL448
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST120:
-	.8byte	.LVL381
-	.8byte	.LVL385
+.LLST124:
+	.8byte	.LVL411
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL391
-	.8byte	.LFE2817
+	.8byte	.LVL421
+	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST121:
-	.8byte	.LVL381
-	.8byte	.LVL385
+.LLST125:
+	.8byte	.LVL411
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL392
-	.8byte	.LFE2817
+	.8byte	.LVL422
+	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST122:
-	.8byte	.LVL381
-	.8byte	.LVL385
+.LLST126:
+	.8byte	.LVL411
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL395
-	.8byte	.LFE2817
+	.8byte	.LVL425
+	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST123:
-	.8byte	.LVL387
-	.8byte	.LVL388
+.LLST127:
+	.8byte	.LVL417
+	.8byte	.LVL418
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST124:
-	.8byte	.LVL381
-	.8byte	.LVL385
+.LLST128:
+	.8byte	.LVL411
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL390
-	.8byte	.LFE2817
+	.8byte	.LVL420
+	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST125:
-	.8byte	.LVL381
-	.8byte	.LVL385
+.LLST129:
+	.8byte	.LVL411
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL396
-	.8byte	.LVL402
+	.8byte	.LVL426
+	.8byte	.LVL432
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL411
-	.8byte	.LFE2817
+	.8byte	.LVL441
+	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST126:
-	.8byte	.LVL381
-	.8byte	.LVL385
+.LLST130:
+	.8byte	.LVL411
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL396
-	.8byte	.LVL405
+	.8byte	.LVL426
+	.8byte	.LVL435
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL406
-	.8byte	.LVL407
+	.8byte	.LVL436
+	.8byte	.LVL437
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL408
-	.8byte	.LVL412
+	.8byte	.LVL438
+	.8byte	.LVL442
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL413
-	.8byte	.LFE2817
+	.8byte	.LVL443
+	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST127:
-	.8byte	.LVL381
-	.8byte	.LVL385
+.LLST131:
+	.8byte	.LVL411
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL396
-	.8byte	.LVL403
+	.8byte	.LVL426
+	.8byte	.LVL433
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL404
-	.8byte	.LVL407
+	.8byte	.LVL434
+	.8byte	.LVL437
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL408
-	.8byte	.LVL412
+	.8byte	.LVL438
+	.8byte	.LVL442
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL413
-	.8byte	.LFE2817
+	.8byte	.LVL443
+	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST128:
-	.8byte	.LVL381
-	.8byte	.LVL385
+.LLST132:
+	.8byte	.LVL411
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL396
-	.8byte	.LVL403
+	.8byte	.LVL426
+	.8byte	.LVL433
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL404
-	.8byte	.LVL405
+	.8byte	.LVL434
+	.8byte	.LVL435
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL406
-	.8byte	.LVL412
+	.8byte	.LVL436
+	.8byte	.LVL442
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL413
-	.8byte	.LFE2817
+	.8byte	.LVL443
+	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST129:
-	.8byte	.LVL373
-	.8byte	.LVL374
+.LLST133:
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL375
-	.8byte	.LVL376
+	.8byte	.LVL405
+	.8byte	.LVL406
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL377
-	.8byte	.LVL378
+	.8byte	.LVL407
+	.8byte	.LVL408
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL379
-	.8byte	.LVL380
+	.8byte	.LVL409
+	.8byte	.LVL410
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL381
-	.8byte	.LVL385
+	.8byte	.LVL411
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
-.LLST130:
-	.8byte	.LVL371
-	.8byte	.LVL384
+.LLST134:
+	.8byte	.LVL401
+	.8byte	.LVL414
 	.2byte	0x1
 	.byte	0x6e
 	.8byte	0
 	.8byte	0
-.LLST131:
-	.8byte	.LVL372
-	.8byte	.LVL385
+.LLST135:
+	.8byte	.LVL402
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST132:
-	.8byte	.LVL366
-	.8byte	.LVL389
+.LLST136:
+	.8byte	.LVL396
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST133:
-	.8byte	.LVL368
-	.8byte	.LVL369
+.LLST137:
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST134:
-	.8byte	.LVL370
-	.8byte	.LVL385
+.LLST138:
+	.8byte	.LVL400
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST135:
-	.8byte	.LVL373
-	.8byte	.LVL382
+.LLST139:
+	.8byte	.LVL403
+	.8byte	.LVL412
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST136:
-	.8byte	.LVL373
-	.8byte	.LVL383
+.LLST140:
+	.8byte	.LVL403
+	.8byte	.LVL413
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST137:
-	.8byte	.LVL419
-	.8byte	.LVL420
+.LLST141:
+	.8byte	.LVL449
+	.8byte	.LVL450
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL420
-	.8byte	.LVL425
+	.8byte	.LVL450
+	.8byte	.LVL455
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL426
-	.8byte	.LFE2860
+	.8byte	.LVL456
+	.8byte	.LFE2861
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST140:
-	.8byte	.LVL460
-	.8byte	.LVL462
+.LLST144:
+	.8byte	.LVL501
+	.8byte	.LVL503
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL462
-	.8byte	.LVL466
+	.8byte	.LVL503
+	.8byte	.LVL507
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL467
-	.8byte	.LVL470
+	.8byte	.LVL508
+	.8byte	.LVL511
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST141:
-	.8byte	.LVL460
-	.8byte	.LVL461
+.LLST145:
+	.8byte	.LVL501
+	.8byte	.LVL502
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST165:
-	.8byte	.LVL651
-	.8byte	.LVL652
+.LLST169:
+	.8byte	.LVL692
+	.8byte	.LVL693
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL652
-	.8byte	.LVL656
+	.8byte	.LVL693
+	.8byte	.LVL697
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL657
-	.8byte	.LFE2865
+	.8byte	.LVL698
+	.8byte	.LFE2866
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -50442,326 +51409,324 @@ __exitcall_ebc_exit:
 	.2byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0-.Ltext0
+	.8byte	.LFB2853
+	.8byte	.LFE2853-.LFB2853
 	.8byte	.LFB2852
 	.8byte	.LFE2852-.LFB2852
-	.8byte	.LFB2851
-	.8byte	.LFE2851-.LFB2851
 	.8byte	0
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
 .Ldebug_ranges0:
-	.8byte	.LBB930
-	.8byte	.LBE930
-	.8byte	.LBB933
-	.8byte	.LBE933
+	.8byte	.LBB932
+	.8byte	.LBE932
+	.8byte	.LBB935
+	.8byte	.LBE935
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB934
-	.8byte	.LBE934
-	.8byte	.LBB965
-	.8byte	.LBE965
-	.8byte	.LBB966
-	.8byte	.LBE966
-	.8byte	.LBB1031
-	.8byte	.LBE1031
+	.8byte	.LBB936
+	.8byte	.LBE936
+	.8byte	.LBB967
+	.8byte	.LBE967
+	.8byte	.LBB968
+	.8byte	.LBE968
+	.8byte	.LBB1033
+	.8byte	.LBE1033
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB937
-	.8byte	.LBE937
-	.8byte	.LBB949
-	.8byte	.LBE949
-	.8byte	.LBB950
-	.8byte	.LBE950
+	.8byte	.LBB939
+	.8byte	.LBE939
+	.8byte	.LBB951
+	.8byte	.LBE951
+	.8byte	.LBB952
+	.8byte	.LBE952
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB953
-	.8byte	.LBE953
-	.8byte	.LBB958
-	.8byte	.LBE958
+	.8byte	.LBB955
+	.8byte	.LBE955
+	.8byte	.LBB960
+	.8byte	.LBE960
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB967
-	.8byte	.LBE967
-	.8byte	.LBB1188
-	.8byte	.LBE1188
-	.8byte	.LBB1189
-	.8byte	.LBE1189
+	.8byte	.LBB969
+	.8byte	.LBE969
+	.8byte	.LBB1190
+	.8byte	.LBE1190
+	.8byte	.LBB1191
+	.8byte	.LBE1191
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB970
-	.8byte	.LBE970
-	.8byte	.LBB990
-	.8byte	.LBE990
-	.8byte	.LBB991
-	.8byte	.LBE991
+	.8byte	.LBB972
+	.8byte	.LBE972
+	.8byte	.LBB992
+	.8byte	.LBE992
+	.8byte	.LBB993
+	.8byte	.LBE993
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB984
-	.8byte	.LBE984
-	.8byte	.LBB989
-	.8byte	.LBE989
+	.8byte	.LBB986
+	.8byte	.LBE986
+	.8byte	.LBB991
+	.8byte	.LBE991
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB996
-	.8byte	.LBE996
-	.8byte	.LBB1199
-	.8byte	.LBE1199
+	.8byte	.LBB998
+	.8byte	.LBE998
 	.8byte	.LBB1201
 	.8byte	.LBE1201
-	.8byte	.LBB1202
-	.8byte	.LBE1202
+	.8byte	.LBB1203
+	.8byte	.LBE1203
+	.8byte	.LBB1204
+	.8byte	.LBE1204
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1002
-	.8byte	.LBE1002
-	.8byte	.LBB1186
-	.8byte	.LBE1186
-	.8byte	.LBB1187
-	.8byte	.LBE1187
+	.8byte	.LBB1004
+	.8byte	.LBE1004
+	.8byte	.LBB1188
+	.8byte	.LBE1188
+	.8byte	.LBB1189
+	.8byte	.LBE1189
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1005
-	.8byte	.LBE1005
-	.8byte	.LBB1025
-	.8byte	.LBE1025
+	.8byte	.LBB1007
+	.8byte	.LBE1007
+	.8byte	.LBB1027
+	.8byte	.LBE1027
+	.8byte	.LBB1028
+	.8byte	.LBE1028
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1021
+	.8byte	.LBE1021
 	.8byte	.LBB1026
 	.8byte	.LBE1026
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1019
-	.8byte	.LBE1019
-	.8byte	.LBB1024
-	.8byte	.LBE1024
+	.8byte	.LBB1034
+	.8byte	.LBE1034
+	.8byte	.LBB1067
+	.8byte	.LBE1067
+	.8byte	.LBB1198
+	.8byte	.LBE1198
+	.8byte	.LBB1199
+	.8byte	.LBE1199
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1032
-	.8byte	.LBE1032
-	.8byte	.LBB1065
-	.8byte	.LBE1065
-	.8byte	.LBB1196
-	.8byte	.LBE1196
-	.8byte	.LBB1197
-	.8byte	.LBE1197
+	.8byte	.LBB1037
+	.8byte	.LBE1037
+	.8byte	.LBB1050
+	.8byte	.LBE1050
+	.8byte	.LBB1059
+	.8byte	.LBE1059
+	.8byte	.LBB1060
+	.8byte	.LBE1060
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1035
-	.8byte	.LBE1035
-	.8byte	.LBB1048
-	.8byte	.LBE1048
-	.8byte	.LBB1057
-	.8byte	.LBE1057
+	.8byte	.LBB1053
+	.8byte	.LBE1053
 	.8byte	.LBB1058
 	.8byte	.LBE1058
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1051
-	.8byte	.LBE1051
-	.8byte	.LBB1056
-	.8byte	.LBE1056
+	.8byte	.LBB1068
+	.8byte	.LBE1068
+	.8byte	.LBB1103
+	.8byte	.LBE1103
+	.8byte	.LBB1194
+	.8byte	.LBE1194
+	.8byte	.LBB1195
+	.8byte	.LBE1195
+	.8byte	.LBB1205
+	.8byte	.LBE1205
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1066
-	.8byte	.LBE1066
-	.8byte	.LBB1101
-	.8byte	.LBE1101
-	.8byte	.LBB1192
-	.8byte	.LBE1192
-	.8byte	.LBB1193
-	.8byte	.LBE1193
-	.8byte	.LBB1203
-	.8byte	.LBE1203
+	.8byte	.LBB1071
+	.8byte	.LBE1071
+	.8byte	.LBB1084
+	.8byte	.LBE1084
+	.8byte	.LBB1093
+	.8byte	.LBE1093
+	.8byte	.LBB1094
+	.8byte	.LBE1094
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1069
-	.8byte	.LBE1069
-	.8byte	.LBB1082
-	.8byte	.LBE1082
-	.8byte	.LBB1091
-	.8byte	.LBE1091
+	.8byte	.LBB1087
+	.8byte	.LBE1087
 	.8byte	.LBB1092
 	.8byte	.LBE1092
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1085
-	.8byte	.LBE1085
-	.8byte	.LBB1090
-	.8byte	.LBE1090
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1102
-	.8byte	.LBE1102
-	.8byte	.LBB1113
-	.8byte	.LBE1113
+	.8byte	.LBB1104
+	.8byte	.LBE1104
+	.8byte	.LBB1115
+	.8byte	.LBE1115
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1105
-	.8byte	.LBE1105
-	.8byte	.LBB1110
-	.8byte	.LBE1110
+	.8byte	.LBB1107
+	.8byte	.LBE1107
+	.8byte	.LBB1112
+	.8byte	.LBE1112
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1106
-	.8byte	.LBE1106
-	.8byte	.LBB1109
-	.8byte	.LBE1109
+	.8byte	.LBB1108
+	.8byte	.LBE1108
+	.8byte	.LBB1111
+	.8byte	.LBE1111
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1114
-	.8byte	.LBE1114
-	.8byte	.LBB1149
-	.8byte	.LBE1149
-	.8byte	.LBB1190
-	.8byte	.LBE1190
-	.8byte	.LBB1191
-	.8byte	.LBE1191
-	.8byte	.LBB1198
-	.8byte	.LBE1198
+	.8byte	.LBB1116
+	.8byte	.LBE1116
+	.8byte	.LBB1151
+	.8byte	.LBE1151
+	.8byte	.LBB1192
+	.8byte	.LBE1192
+	.8byte	.LBB1193
+	.8byte	.LBE1193
+	.8byte	.LBB1200
+	.8byte	.LBE1200
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1117
-	.8byte	.LBE1117
-	.8byte	.LBB1130
-	.8byte	.LBE1130
-	.8byte	.LBB1131
-	.8byte	.LBE1131
+	.8byte	.LBB1119
+	.8byte	.LBE1119
 	.8byte	.LBB1132
 	.8byte	.LBE1132
+	.8byte	.LBB1133
+	.8byte	.LBE1133
+	.8byte	.LBB1134
+	.8byte	.LBE1134
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1135
-	.8byte	.LBE1135
-	.8byte	.LBB1140
-	.8byte	.LBE1140
+	.8byte	.LBB1137
+	.8byte	.LBE1137
+	.8byte	.LBB1142
+	.8byte	.LBE1142
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1150
-	.8byte	.LBE1150
-	.8byte	.LBB1185
-	.8byte	.LBE1185
-	.8byte	.LBB1194
-	.8byte	.LBE1194
-	.8byte	.LBB1195
-	.8byte	.LBE1195
-	.8byte	.LBB1200
-	.8byte	.LBE1200
+	.8byte	.LBB1152
+	.8byte	.LBE1152
+	.8byte	.LBB1187
+	.8byte	.LBE1187
+	.8byte	.LBB1196
+	.8byte	.LBE1196
+	.8byte	.LBB1197
+	.8byte	.LBE1197
+	.8byte	.LBB1202
+	.8byte	.LBE1202
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1153
-	.8byte	.LBE1153
-	.8byte	.LBB1166
-	.8byte	.LBE1166
-	.8byte	.LBB1167
-	.8byte	.LBE1167
+	.8byte	.LBB1155
+	.8byte	.LBE1155
 	.8byte	.LBB1168
 	.8byte	.LBE1168
+	.8byte	.LBB1169
+	.8byte	.LBE1169
+	.8byte	.LBB1170
+	.8byte	.LBE1170
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1171
-	.8byte	.LBE1171
-	.8byte	.LBB1176
-	.8byte	.LBE1176
+	.8byte	.LBB1173
+	.8byte	.LBE1173
+	.8byte	.LBB1178
+	.8byte	.LBE1178
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1208
-	.8byte	.LBE1208
-	.8byte	.LBB1211
-	.8byte	.LBE1211
+	.8byte	.LBB1210
+	.8byte	.LBE1210
+	.8byte	.LBB1213
+	.8byte	.LBE1213
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1232
-	.8byte	.LBE1232
-	.8byte	.LBB1238
-	.8byte	.LBE1238
-	.8byte	.LBB1244
-	.8byte	.LBE1244
+	.8byte	.LBB1234
+	.8byte	.LBE1234
+	.8byte	.LBB1240
+	.8byte	.LBE1240
 	.8byte	.LBB1246
 	.8byte	.LBE1246
 	.8byte	.LBB1248
 	.8byte	.LBE1248
+	.8byte	.LBB1250
+	.8byte	.LBE1250
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1239
-	.8byte	.LBE1239
-	.8byte	.LBB1245
-	.8byte	.LBE1245
+	.8byte	.LBB1241
+	.8byte	.LBE1241
 	.8byte	.LBB1247
 	.8byte	.LBE1247
 	.8byte	.LBB1249
 	.8byte	.LBE1249
+	.8byte	.LBB1251
+	.8byte	.LBE1251
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1250
-	.8byte	.LBE1250
-	.8byte	.LBB1297
-	.8byte	.LBE1297
-	.8byte	.LBB1298
-	.8byte	.LBE1298
+	.8byte	.LBB1252
+	.8byte	.LBE1252
+	.8byte	.LBB1299
+	.8byte	.LBE1299
+	.8byte	.LBB1300
+	.8byte	.LBE1300
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1253
-	.8byte	.LBE1253
-	.8byte	.LBB1265
-	.8byte	.LBE1265
+	.8byte	.LBB1255
+	.8byte	.LBE1255
 	.8byte	.LBB1267
 	.8byte	.LBE1267
 	.8byte	.LBB1269
 	.8byte	.LBE1269
+	.8byte	.LBB1271
+	.8byte	.LBE1271
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1258
-	.8byte	.LBE1258
-	.8byte	.LBB1266
-	.8byte	.LBE1266
+	.8byte	.LBB1260
+	.8byte	.LBE1260
 	.8byte	.LBB1268
 	.8byte	.LBE1268
-	.8byte	.LBB1277
-	.8byte	.LBE1277
+	.8byte	.LBB1270
+	.8byte	.LBE1270
 	.8byte	.LBB1279
 	.8byte	.LBE1279
 	.8byte	.LBB1281
 	.8byte	.LBE1281
+	.8byte	.LBB1283
+	.8byte	.LBE1283
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1270
-	.8byte	.LBE1270
-	.8byte	.LBB1278
-	.8byte	.LBE1278
+	.8byte	.LBB1272
+	.8byte	.LBE1272
 	.8byte	.LBB1280
 	.8byte	.LBE1280
-	.8byte	.LBB1287
-	.8byte	.LBE1287
+	.8byte	.LBB1282
+	.8byte	.LBE1282
 	.8byte	.LBB1289
 	.8byte	.LBE1289
 	.8byte	.LBB1291
 	.8byte	.LBE1291
+	.8byte	.LBB1293
+	.8byte	.LBE1293
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1282
-	.8byte	.LBE1282
-	.8byte	.LBB1288
-	.8byte	.LBE1288
+	.8byte	.LBB1284
+	.8byte	.LBE1284
 	.8byte	.LBB1290
 	.8byte	.LBE1290
 	.8byte	.LBB1292
 	.8byte	.LBE1292
+	.8byte	.LBB1294
+	.8byte	.LBE1294
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1317
-	.8byte	.LBE1317
-	.8byte	.LBB1356
-	.8byte	.LBE1356
+	.8byte	.LBB1319
+	.8byte	.LBE1319
+	.8byte	.LBB1358
+	.8byte	.LBE1358
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1320
-	.8byte	.LBE1320
-	.8byte	.LBB1329
-	.8byte	.LBE1329
+	.8byte	.LBB1322
+	.8byte	.LBE1322
+	.8byte	.LBB1331
+	.8byte	.LBE1331
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1334
-	.8byte	.LBE1334
-	.8byte	.LBB1347
-	.8byte	.LBE1347
+	.8byte	.LBB1336
+	.8byte	.LBE1336
 	.8byte	.LBB1349
 	.8byte	.LBE1349
 	.8byte	.LBB1351
@@ -50770,266 +51735,256 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1353
 	.8byte	.LBB1355
 	.8byte	.LBE1355
+	.8byte	.LBB1357
+	.8byte	.LBE1357
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1341
-	.8byte	.LBE1341
-	.8byte	.LBB1348
-	.8byte	.LBE1348
+	.8byte	.LBB1343
+	.8byte	.LBE1343
 	.8byte	.LBB1350
 	.8byte	.LBE1350
 	.8byte	.LBB1352
 	.8byte	.LBE1352
 	.8byte	.LBB1354
 	.8byte	.LBE1354
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1357
-	.8byte	.LBE1357
-	.8byte	.LBB1366
-	.8byte	.LBE1366
-	.8byte	.LBB1367
-	.8byte	.LBE1367
-	.8byte	.LBB1378
-	.8byte	.LBE1378
+	.8byte	.LBB1356
+	.8byte	.LBE1356
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1359
 	.8byte	.LBE1359
-	.8byte	.LBB1362
-	.8byte	.LBE1362
-	.8byte	0
-	.8byte	0
 	.8byte	.LBB1368
 	.8byte	.LBE1368
-	.8byte	.LBB1372
-	.8byte	.LBE1372
-	.8byte	.LBB1373
-	.8byte	.LBE1373
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1385
-	.8byte	.LBE1385
-	.8byte	.LBB1392
-	.8byte	.LBE1392
-	.8byte	.LBB1393
-	.8byte	.LBE1393
+	.8byte	.LBB1369
+	.8byte	.LBE1369
+	.8byte	.LBB1380
+	.8byte	.LBE1380
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1386
-	.8byte	.LBE1386
-	.8byte	.LBB1391
-	.8byte	.LBE1391
+	.8byte	.LBB1361
+	.8byte	.LBE1361
+	.8byte	.LBB1364
+	.8byte	.LBE1364
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1394
-	.8byte	.LBE1394
-	.8byte	.LBB1401
-	.8byte	.LBE1401
+	.8byte	.LBB1370
+	.8byte	.LBE1370
+	.8byte	.LBB1374
+	.8byte	.LBE1374
+	.8byte	.LBB1375
+	.8byte	.LBE1375
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1389
+	.8byte	.LBE1389
 	.8byte	.LBB1396
 	.8byte	.LBE1396
-	.8byte	.LBB1399
-	.8byte	.LBE1399
+	.8byte	.LBB1397
+	.8byte	.LBE1397
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1559
-	.8byte	.LBE1559
-	.8byte	.LBB1562
-	.8byte	.LBE1562
+	.8byte	.LBB1390
+	.8byte	.LBE1390
+	.8byte	.LBB1395
+	.8byte	.LBE1395
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1569
-	.8byte	.LBE1569
-	.8byte	.LBB1668
-	.8byte	.LBE1668
-	.8byte	.LBB1669
-	.8byte	.LBE1669
-	.8byte	.LBB1670
-	.8byte	.LBE1670
-	.8byte	.LBB1707
-	.8byte	.LBE1707
+	.8byte	.LBB1398
+	.8byte	.LBE1398
+	.8byte	.LBB1405
+	.8byte	.LBE1405
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1571
-	.8byte	.LBE1571
-	.8byte	.LBB1580
-	.8byte	.LBE1580
-	.8byte	.LBB1581
-	.8byte	.LBE1581
-	.8byte	.LBB1582
-	.8byte	.LBE1582
+	.8byte	.LBB1400
+	.8byte	.LBE1400
+	.8byte	.LBB1403
+	.8byte	.LBE1403
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1628
-	.8byte	.LBE1628
+	.8byte	.LBB1563
+	.8byte	.LBE1563
+	.8byte	.LBB1566
+	.8byte	.LBE1566
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1573
+	.8byte	.LBE1573
+	.8byte	.LBB1672
+	.8byte	.LBE1672
+	.8byte	.LBB1673
+	.8byte	.LBE1673
+	.8byte	.LBB1674
+	.8byte	.LBE1674
+	.8byte	.LBB1711
+	.8byte	.LBE1711
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1575
+	.8byte	.LBE1575
+	.8byte	.LBB1584
+	.8byte	.LBE1584
+	.8byte	.LBB1585
+	.8byte	.LBE1585
+	.8byte	.LBB1586
+	.8byte	.LBE1586
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1632
+	.8byte	.LBE1632
+	.8byte	.LBB1666
+	.8byte	.LBE1666
+	.8byte	.LBB1667
+	.8byte	.LBE1667
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1639
+	.8byte	.LBE1639
+	.8byte	.LBB1664
+	.8byte	.LBE1664
+	.8byte	.LBB1665
+	.8byte	.LBE1665
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1646
+	.8byte	.LBE1646
 	.8byte	.LBB1662
 	.8byte	.LBE1662
 	.8byte	.LBB1663
 	.8byte	.LBE1663
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1635
-	.8byte	.LBE1635
+	.8byte	.LBB1653
+	.8byte	.LBE1653
 	.8byte	.LBB1660
 	.8byte	.LBE1660
 	.8byte	.LBB1661
 	.8byte	.LBE1661
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1642
-	.8byte	.LBE1642
-	.8byte	.LBB1658
-	.8byte	.LBE1658
-	.8byte	.LBB1659
-	.8byte	.LBE1659
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1649
-	.8byte	.LBE1649
-	.8byte	.LBB1656
-	.8byte	.LBE1656
-	.8byte	.LBB1657
-	.8byte	.LBE1657
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1671
-	.8byte	.LBE1671
-	.8byte	.LBB1696
-	.8byte	.LBE1696
-	.8byte	.LBB1697
-	.8byte	.LBE1697
-	.8byte	.LBB1706
-	.8byte	.LBE1706
-	.8byte	.LBB1757
-	.8byte	.LBE1757
-	.8byte	.LBB1762
-	.8byte	.LBE1762
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1673
-	.8byte	.LBE1673
-	.8byte	.LBB1676
-	.8byte	.LBE1676
+	.8byte	.LBB1675
+	.8byte	.LBE1675
+	.8byte	.LBB1700
+	.8byte	.LBE1700
+	.8byte	.LBB1701
+	.8byte	.LBE1701
+	.8byte	.LBB1710
+	.8byte	.LBE1710
+	.8byte	.LBB1761
+	.8byte	.LBE1761
+	.8byte	.LBB1766
+	.8byte	.LBE1766
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1677
 	.8byte	.LBE1677
-	.8byte	.LBB1682
-	.8byte	.LBE1682
-	.8byte	.LBB1683
-	.8byte	.LBE1683
-	.8byte	.LBB1684
-	.8byte	.LBE1684
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1698
-	.8byte	.LBE1698
-	.8byte	.LBB1708
-	.8byte	.LBE1708
-	.8byte	.LBB1759
-	.8byte	.LBE1759
-	.8byte	.LBB1763
-	.8byte	.LBE1763
-	.8byte	.LBB1764
-	.8byte	.LBE1764
+	.8byte	.LBB1680
+	.8byte	.LBE1680
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1709
-	.8byte	.LBE1709
-	.8byte	.LBB1760
-	.8byte	.LBE1760
-	.8byte	.LBB1761
-	.8byte	.LBE1761
+	.8byte	.LBB1681
+	.8byte	.LBE1681
+	.8byte	.LBB1686
+	.8byte	.LBE1686
+	.8byte	.LBB1687
+	.8byte	.LBE1687
+	.8byte	.LBB1688
+	.8byte	.LBE1688
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1711
-	.8byte	.LBE1711
-	.8byte	.LBB1717
-	.8byte	.LBE1717
+	.8byte	.LBB1702
+	.8byte	.LBE1702
+	.8byte	.LBB1712
+	.8byte	.LBE1712
+	.8byte	.LBB1763
+	.8byte	.LBE1763
+	.8byte	.LBB1767
+	.8byte	.LBE1767
+	.8byte	.LBB1768
+	.8byte	.LBE1768
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1713
+	.8byte	.LBE1713
+	.8byte	.LBB1764
+	.8byte	.LBE1764
+	.8byte	.LBB1765
+	.8byte	.LBE1765
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1720
-	.8byte	.LBE1720
+	.8byte	.LBB1715
+	.8byte	.LBE1715
 	.8byte	.LBB1721
 	.8byte	.LBE1721
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1728
-	.8byte	.LBE1728
-	.8byte	.LBB1734
-	.8byte	.LBE1734
-	.8byte	.LBB1735
-	.8byte	.LBE1735
-	.8byte	.LBB1736
-	.8byte	.LBE1736
-	.8byte	.LBB1737
-	.8byte	.LBE1737
+	.8byte	.LBB1724
+	.8byte	.LBE1724
+	.8byte	.LBB1725
+	.8byte	.LBE1725
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1732
+	.8byte	.LBE1732
 	.8byte	.LBB1738
 	.8byte	.LBE1738
-	.8byte	.LBB1756
-	.8byte	.LBE1756
-	.8byte	.LBB1758
-	.8byte	.LBE1758
-	.8byte	.LBB1765
-	.8byte	.LBE1765
+	.8byte	.LBB1739
+	.8byte	.LBE1739
+	.8byte	.LBB1740
+	.8byte	.LBE1740
+	.8byte	.LBB1741
+	.8byte	.LBE1741
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1794
-	.8byte	.LBE1794
-	.8byte	.LBB1801
-	.8byte	.LBE1801
-	.8byte	.LBB1802
-	.8byte	.LBE1802
+	.8byte	.LBB1742
+	.8byte	.LBE1742
+	.8byte	.LBB1760
+	.8byte	.LBE1760
+	.8byte	.LBB1762
+	.8byte	.LBE1762
+	.8byte	.LBB1769
+	.8byte	.LBE1769
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1796
-	.8byte	.LBE1796
-	.8byte	.LBB1797
-	.8byte	.LBE1797
 	.8byte	.LBB1798
 	.8byte	.LBE1798
+	.8byte	.LBB1805
+	.8byte	.LBE1805
+	.8byte	.LBB1806
+	.8byte	.LBE1806
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1803
-	.8byte	.LBE1803
-	.8byte	.LBB1807
-	.8byte	.LBE1807
-	.8byte	.LBB1808
-	.8byte	.LBE1808
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1814
-	.8byte	.LBE1814
-	.8byte	.LBB1820
-	.8byte	.LBE1820
-	.8byte	.LBB1821
-	.8byte	.LBE1821
-	.8byte	.LBB1830
-	.8byte	.LBE1830
-	.8byte	.LBB1831
-	.8byte	.LBE1831
+	.8byte	.LBB1800
+	.8byte	.LBE1800
+	.8byte	.LBB1801
+	.8byte	.LBE1801
+	.8byte	.LBB1802
+	.8byte	.LBE1802
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1822
-	.8byte	.LBE1822
-	.8byte	.LBB1832
-	.8byte	.LBE1832
+	.8byte	.LBB1807
+	.8byte	.LBE1807
+	.8byte	.LBB1811
+	.8byte	.LBE1811
+	.8byte	.LBB1812
+	.8byte	.LBE1812
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1818
+	.8byte	.LBE1818
 	.8byte	.LBB1824
 	.8byte	.LBE1824
 	.8byte	.LBB1825
 	.8byte	.LBE1825
+	.8byte	.LBB1834
+	.8byte	.LBE1834
+	.8byte	.LBB1835
+	.8byte	.LBE1835
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1826
 	.8byte	.LBE1826
-	.8byte	.LBB1833
-	.8byte	.LBE1833
+	.8byte	.LBB1836
+	.8byte	.LBE1836
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1828
@@ -51038,12 +51993,24 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1829
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1830
+	.8byte	.LBE1830
+	.8byte	.LBB1837
+	.8byte	.LBE1837
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1832
+	.8byte	.LBE1832
+	.8byte	.LBB1833
+	.8byte	.LBE1833
+	.8byte	0
+	.8byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0
+	.8byte	.LFB2853
+	.8byte	.LFE2853
 	.8byte	.LFB2852
 	.8byte	.LFE2852
-	.8byte	.LFB2851
-	.8byte	.LFE2851
 	.8byte	0
 	.8byte	0
 	.section	.debug_line,"",@progbits
@@ -51125,7 +52092,7 @@ __exitcall_ebc_exit:
 	.string	"dev_kobj"
 .LASF474:
 	.string	"d_release"
-.LASF3152:
+.LASF3154:
 	.string	"get_arch_dma_ops"
 .LASF304:
 	.string	"__ctors_start"
@@ -51199,9 +52166,9 @@ __exitcall_ebc_exit:
 	.string	"gpio_desc"
 .LASF961:
 	.string	"list"
-.LASF3169:
+.LASF3171:
 	.string	"_copy_from_user"
-.LASF3195:
+.LASF3197:
 	.string	"get_order"
 .LASF944:
 	.string	"si_errno"
@@ -51259,7 +52226,7 @@ __exitcall_ebc_exit:
 	.string	"n_node"
 .LASF1623:
 	.string	"qsize_t"
-.LASF3192:
+.LASF3194:
 	.string	"devm_kzalloc"
 .LASF379:
 	.string	"sequence"
@@ -51347,7 +52314,7 @@ __exitcall_ebc_exit:
 	.string	"size_t"
 .LASF208:
 	.string	"compat_elf_hwcap"
-.LASF3265:
+.LASF3267:
 	.string	"prepare_to_wait_event"
 .LASF1109:
 	.string	"cap_permitted"
@@ -51389,7 +52356,7 @@ __exitcall_ebc_exit:
 	.string	"__reserved"
 .LASF939:
 	.string	"_sigfault"
-.LASF3123:
+.LASF3125:
 	.string	"image_bg"
 .LASF2857:
 	.string	"ebc_buf_status"
@@ -51421,8 +52388,6 @@ __exitcall_ebc_exit:
 	.string	"fmode_t"
 .LASF2223:
 	.string	"devt"
-.LASF3018:
-	.string	"__addressable_ebc_init2270"
 .LASF947:
 	.string	"siginfo_t"
 .LASF2183:
@@ -51481,9 +52446,9 @@ __exitcall_ebc_exit:
 	.string	"irqchip_fwnode_ops"
 .LASF1613:
 	.string	"dq_id"
-.LASF3115:
+.LASF3116:
 	.string	"frame_count_tmp"
-.LASF3122:
+.LASF3124:
 	.string	"image_fb"
 .LASF1788:
 	.string	"write_end"
@@ -51491,7 +52456,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ION_HEAP_POOL"
 .LASF1423:
 	.string	"sysctl_protected_hardlinks"
-.LASF3269:
+.LASF3271:
 	.string	"__arch_copy_from_user"
 .LASF1176:
 	.string	"scan_objects"
@@ -51499,7 +52464,7 @@ __exitcall_ebc_exit:
 	.string	"pageset"
 .LASF1237:
 	.string	"wb_err"
-.LASF3166:
+.LASF3168:
 	.string	"copy_to_user"
 .LASF734:
 	.string	"trace_recursion"
@@ -51611,7 +52576,7 @@ __exitcall_ebc_exit:
 	.string	"pcpu_chosen_fc"
 .LASF390:
 	.string	"dentry_stat_t"
-.LASF3217:
+.LASF3219:
 	.string	"atomic_add"
 .LASF1642:
 	.string	"dqi_bgrace"
@@ -51629,7 +52594,7 @@ __exitcall_ebc_exit:
 	.string	"ctl_table"
 .LASF43:
 	.string	"uid_t"
-.LASF3246:
+.LASF3248:
 	.string	"strstr"
 .LASF2847:
 	.string	"WF_TYPE_A2"
@@ -51691,7 +52656,7 @@ __exitcall_ebc_exit:
 	.string	"pteval_t"
 .LASF429:
 	.string	"i_ino"
-.LASF3288:
+.LASF3289:
 	.string	"might_fault"
 .LASF1561:
 	.string	"compact_cached_free_pfn"
@@ -51809,7 +52774,7 @@ __exitcall_ebc_exit:
 	.string	"pidfd_fops"
 .LASF1916:
 	.string	"lm_put_owner"
-.LASF3248:
+.LASF3250:
 	.string	"ebc_pmic_verity_vcom"
 .LASF2523:
 	.string	"set_sda"
@@ -51915,7 +52880,7 @@ __exitcall_ebc_exit:
 	.string	"sysfs_dev_block_kobj"
 .LASF554:
 	.string	"upid"
-.LASF3277:
+.LASF3279:
 	.string	"down_write"
 .LASF1098:
 	.string	"completion"
@@ -52019,13 +52984,13 @@ __exitcall_ebc_exit:
 	.string	"RPM_SUSPENDED"
 .LASF697:
 	.string	"reclaim_state"
-.LASF3287:
+.LASF3288:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF137:
 	.string	"vendor_panic_cb"
 .LASF3071:
 	.string	"ebc_vdd_power_timeout"
-.LASF3138:
+.LASF3140:
 	.string	"ebc_get_4pix_wf"
 .LASF2798:
 	.string	"num_symtab"
@@ -52053,13 +53018,13 @@ __exitcall_ebc_exit:
 	.string	"module_alloc_base"
 .LASF1751:
 	.string	"core_kallsyms"
-.LASF3250:
+.LASF3252:
 	.string	"memcpy"
 .LASF2893:
 	.string	"EPD_FORCE_FULL"
 .LASF2400:
 	.string	"get_sgtable"
-.LASF3119:
+.LASF3120:
 	.string	"xor_val"
 .LASF2155:
 	.string	"envp_idx"
@@ -52075,7 +53040,7 @@ __exitcall_ebc_exit:
 	.string	"gray_old"
 .LASF67:
 	.string	"hlist_node"
-.LASF3258:
+.LASF3260:
 	.string	"sprintf"
 .LASF1908:
 	.string	"fl_ops"
@@ -52085,7 +53050,7 @@ __exitcall_ebc_exit:
 	.string	"debug_guardpage_ops"
 .LASF2673:
 	.string	"COMPACTISOLATED"
-.LASF3228:
+.LASF3230:
 	.string	"of_property_read_variable_u32_array"
 .LASF327:
 	.string	"__inittext_begin"
@@ -52121,7 +53086,7 @@ __exitcall_ebc_exit:
 	.string	"DOMAIN_BUS_WAKEUP"
 .LASF1222:
 	.string	"arm64_el2_vector_last_slot"
-.LASF3281:
+.LASF3283:
 	.string	"queue_work_on"
 .LASF2335:
 	.string	"online"
@@ -52129,7 +53094,7 @@ __exitcall_ebc_exit:
 	.string	"runtime_resume"
 .LASF1207:
 	.string	"dup_xol_work"
-.LASF3159:
+.LASF3161:
 	.string	"ebc_pmic_read_temp"
 .LASF2875:
 	.string	"EPD_FULL_GC16"
@@ -52243,7 +53208,7 @@ __exitcall_ebc_exit:
 	.string	"driver"
 .LASF1544:
 	.string	"ZONE_NORMAL"
-.LASF3124:
+.LASF3126:
 	.string	"image_new_data"
 .LASF425:
 	.string	"i_op"
@@ -52297,7 +53262,7 @@ __exitcall_ebc_exit:
 	.string	"huge_fault"
 .LASF2008:
 	.string	"kstatfs"
-.LASF3162:
+.LASF3164:
 	.string	"ebc_pmic_power_off"
 .LASF2634:
 	.string	"PGPGOUTCLEAN"
@@ -52369,7 +53334,7 @@ __exitcall_ebc_exit:
 	.string	"get_next_id"
 .LASF237:
 	.string	"rwlock_t"
-.LASF3286:
+.LASF3287:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
 .LASF840:
 	.string	"pgprot"
@@ -52397,7 +53362,7 @@ __exitcall_ebc_exit:
 	.string	"__icache_flags"
 .LASF147:
 	.string	"crash_kexec_post_notifiers"
-.LASF3147:
+.LASF3149:
 	.string	"eink_mode"
 .LASF1697:
 	.string	"rt_spc_warnlimit"
@@ -52419,7 +53384,7 @@ __exitcall_ebc_exit:
 	.string	"_pid"
 .LASF1156:
 	.string	"init_stack"
-.LASF3130:
+.LASF3132:
 	.string	"dmask"
 .LASF1225:
 	.string	"address_space"
@@ -52437,7 +53402,7 @@ __exitcall_ebc_exit:
 	.string	"i_wb"
 .LASF2086:
 	.string	"idr_next"
-.LASF3116:
+.LASF3117:
 	.string	"frame_count_data"
 .LASF2954:
 	.string	"frame_start"
@@ -52487,7 +53452,7 @@ __exitcall_ebc_exit:
 	.string	"normal_prio"
 .LASF1288:
 	.string	"f_ep_links"
-.LASF3128:
+.LASF3130:
 	.string	"image_fb_tmp"
 .LASF2294:
 	.string	"last_busy"
@@ -52499,7 +53464,7 @@ __exitcall_ebc_exit:
 	.string	"host"
 .LASF184:
 	.string	"uaddr"
-.LASF3276:
+.LASF3278:
 	.string	"ebc_remove_from_dsp_buf_list"
 .LASF661:
 	.string	"real_start_time"
@@ -52535,11 +53500,11 @@ __exitcall_ebc_exit:
 	.string	"devres_head"
 .LASF427:
 	.string	"i_mapping"
-.LASF3252:
+.LASF3254:
 	.string	"misc_register"
 .LASF722:
 	.string	"rseq_sig"
-.LASF3181:
+.LASF3183:
 	.string	"platform_set_drvdata"
 .LASF342:
 	.string	"cpu_context"
@@ -52547,7 +53512,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pm_domain"
 .LASF1513:
 	.string	"nr_zones"
-.LASF3204:
+.LASF3206:
 	.string	"is_source"
 .LASF1375:
 	.string	"migrate_mode"
@@ -52569,11 +53534,11 @@ __exitcall_ebc_exit:
 	.string	"d_hash"
 .LASF1075:
 	.string	"dl_bw"
-.LASF3174:
+.LASF3176:
 	.string	"limit"
 .LASF2145:
 	.string	"kobj"
-.LASF3259:
+.LASF3261:
 	.string	"kstrtouint"
 .LASF113:
 	.string	"fsync"
@@ -52583,9 +53548,9 @@ __exitcall_ebc_exit:
 	.string	"i_flags"
 .LASF2891:
 	.string	"EPD_RESUME"
-.LASF3247:
+.LASF3249:
 	.string	"sscanf"
-.LASF3243:
+.LASF3245:
 	.string	"ebc_empty_buf_get"
 .LASF1474:
 	.string	"NR_ISOLATED_ANON"
@@ -52599,7 +53564,7 @@ __exitcall_ebc_exit:
 	.string	"rb_node"
 .LASF613:
 	.string	"pushable_tasks"
-.LASF3129:
+.LASF3131:
 	.string	"image_bg_tmp"
 .LASF2202:
 	.string	"platform_data"
@@ -52629,7 +53594,7 @@ __exitcall_ebc_exit:
 	.string	"last_update_time"
 .LASF1137:
 	.string	"robust_list_head"
-.LASF3241:
+.LASF3243:
 	.string	"init_timer_key"
 .LASF1480:
 	.string	"NR_ANON_MAPPED"
@@ -52643,7 +53608,7 @@ __exitcall_ebc_exit:
 	.string	"srcversion"
 .LASF858:
 	.string	"pcpu_unit_offsets"
-.LASF3150:
+.LASF3152:
 	.string	"dma_sync_single_for_device"
 .LASF2955:
 	.string	"dsp_end_callback"
@@ -52709,7 +53674,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_INACTIVE_ANON"
 .LASF728:
 	.string	"nr_dirtied"
-.LASF3191:
+.LASF3193:
 	.string	"dev_get_drvdata"
 .LASF2395:
 	.string	"linear_revmap"
@@ -52753,11 +53718,11 @@ __exitcall_ebc_exit:
 	.string	"sysctl_memory_failure_early_kill"
 .LASF2760:
 	.string	"param_ops_bool_enable_only"
-.LASF3135:
+.LASF3137:
 	.string	"power_status"
 .LASF306:
 	.string	"__start_opd"
-.LASF3255:
+.LASF3257:
 	.string	"of_find_i2c_device_by_node"
 .LASF153:
 	.string	"SYSTEM_RUNNING"
@@ -52831,7 +53796,7 @@ __exitcall_ebc_exit:
 	.string	"taint_flags"
 .LASF1347:
 	.string	"membarrier_state"
-.LASF3141:
+.LASF3143:
 	.string	"pre_image_addr"
 .LASF2178:
 	.string	"suspend"
@@ -52899,8 +53864,6 @@ __exitcall_ebc_exit:
 	.string	"exit_code"
 .LASF1056:
 	.string	"exec_start"
-.LASF3283:
-	.string	"printk"
 .LASF2381:
 	.string	"consumers"
 .LASF2098:
@@ -52961,7 +53924,7 @@ __exitcall_ebc_exit:
 	.string	"timer"
 .LASF2462:
 	.string	"devtree_lock"
-.LASF3132:
+.LASF3134:
 	.string	"refresh_new_image_auto"
 .LASF3065:
 	.string	"__ret"
@@ -52987,7 +53950,7 @@ __exitcall_ebc_exit:
 	.string	"optimistic_spin_queue"
 .LASF2960:
 	.string	"ebc_buffer_size"
-.LASF3260:
+.LASF3262:
 	.string	"ebc_pmic_set_vcom"
 .LASF2641:
 	.string	"ALLOCSTALL_NORMAL"
@@ -53159,7 +54122,7 @@ __exitcall_ebc_exit:
 	.string	"seq_show"
 .LASF766:
 	.string	"ate_match_dt"
-.LASF3189:
+.LASF3191:
 	.string	"of_node_put"
 .LASF1360:
 	.string	"cow_page"
@@ -53181,9 +54144,11 @@ __exitcall_ebc_exit:
 	.string	"param_ops_ushort"
 .LASF525:
 	.string	"s_shrink"
+.LASF3115:
+	.string	"gray_new_temp"
 .LASF1525:
 	.string	"kcompactd_classzone_idx"
-.LASF3179:
+.LASF3181:
 	.string	"kmalloc_index"
 .LASF869:
 	.string	"hrtimer_restart"
@@ -53293,7 +54258,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_DELAYED_BIT"
 .LASF1038:
 	.string	"nr_failed_migrations_affine"
-.LASF3194:
+.LASF3196:
 	.string	"IS_ERR"
 .LASF861:
 	.string	"PCPU_FC_EMBED"
@@ -53307,7 +54272,7 @@ __exitcall_ebc_exit:
 	.string	"pi_top_task"
 .LASF805:
 	.string	"WORK_NR_COLORS"
-.LASF3133:
+.LASF3135:
 	.string	"refresh_new_image2"
 .LASF527:
 	.string	"s_fsnotify_inode_refs"
@@ -53319,7 +54284,7 @@ __exitcall_ebc_exit:
 	.string	"uprobe"
 .LASF528:
 	.string	"s_readonly_remount"
-.LASF3220:
+.LASF3222:
 	.string	"kasan_check_write"
 .LASF377:
 	.string	"hlist_bl_node"
@@ -53345,7 +54310,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_FLAG_MASK"
 .LASF1271:
 	.string	"units"
-.LASF3235:
+.LASF3237:
 	.string	"epd_lut_from_mem_init"
 .LASF311:
 	.string	"__nosave_begin"
@@ -53365,7 +54330,7 @@ __exitcall_ebc_exit:
 	.string	"user_namespace"
 .LASF2756:
 	.string	"param_ops_ulong"
-.LASF3211:
+.LASF3213:
 	.string	"get_current"
 .LASF231:
 	.string	"raw_spinlock"
@@ -53397,9 +54362,9 @@ __exitcall_ebc_exit:
 	.string	"PGREFILL"
 .LASF2762:
 	.string	"param_ops_bint"
-.LASF3244:
+.LASF3246:
 	.string	"ebc_add_to_dsp_buf_list"
-.LASF3249:
+.LASF3251:
 	.string	"kfree"
 .LASF1802:
 	.string	"swap_deactivate"
@@ -53469,7 +54434,7 @@ __exitcall_ebc_exit:
 	.string	"boost_expires"
 .LASF2910:
 	.string	"DMA_BIDIRECTIONAL"
-.LASF3268:
+.LASF3270:
 	.string	"__arch_copy_to_user"
 .LASF235:
 	.string	"spinlock"
@@ -53511,7 +54476,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_OFFQ_POOL_BITS"
 .LASF1905:
 	.string	"fl_fasync"
-.LASF3144:
+.LASF3146:
 	.string	"update_mode"
 .LASF2937:
 	.string	"direct_mode"
@@ -53585,13 +54550,13 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_HIGH_WMARK_HIT_QUICKLY"
 .LASF3050:
 	.string	"ebc_state_read"
-.LASF3256:
+.LASF3258:
 	.string	"__stack_chk_fail"
 .LASF2908:
 	.string	"pmic_set_vcom"
 .LASF2699:
 	.string	"stack_guard_gap"
-.LASF3203:
+.LASF3205:
 	.string	"bytes"
 .LASF1738:
 	.string	"gpl_future_crcs"
@@ -53707,7 +54672,7 @@ __exitcall_ebc_exit:
 	.string	"MODULE_STATE_COMING"
 .LASF2231:
 	.string	"offline_disabled"
-.LASF3187:
+.LASF3189:
 	.string	"of_property_read_u32_array"
 .LASF2476:
 	.string	"select"
@@ -53773,7 +54738,7 @@ __exitcall_ebc_exit:
 	.string	"writeback_control"
 .LASF1904:
 	.string	"fl_end"
-.LASF3271:
+.LASF3273:
 	.string	"ebc_find_buf_by_phy_addr"
 .LASF1951:
 	.string	"super_operations"
@@ -53819,7 +54784,7 @@ __exitcall_ebc_exit:
 	.string	"enable"
 .LASF955:
 	.string	"pipe_bufs"
-.LASF3208:
+.LASF3210:
 	.string	"to_user"
 .LASF2124:
 	.string	"KOBJ_NS_TYPE_NET"
@@ -53839,7 +54804,7 @@ __exitcall_ebc_exit:
 	.string	"__rb_parent_color"
 .LASF2224:
 	.string	"devres_lock"
-.LASF3131:
+.LASF3133:
 	.string	"new_buffer_refresh"
 .LASF365:
 	.string	"bits"
@@ -53855,9 +54820,9 @@ __exitcall_ebc_exit:
 	.string	"lookup"
 .LASF1590:
 	.string	"cpu_topology"
-.LASF3212:
+.LASF3214:
 	.string	"sp_el0"
-.LASF3275:
+.LASF3277:
 	.string	"ebc_dsp_buf_get"
 .LASF2897:
 	.string	"panel_color"
@@ -53887,7 +54852,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_AUTO"
 .LASF1227:
 	.string	"i_pages"
-.LASF3171:
+.LASF3173:
 	.string	"safe_ptr"
 .LASF376:
 	.string	"hlist_bl_head"
@@ -53927,7 +54892,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_LOW_WMARK_HIT_QUICKLY"
 .LASF994:
 	.string	"syscfs"
-.LASF3164:
+.LASF3166:
 	.string	"wake_unlock"
 .LASF2445:
 	.string	"graph_get_port_parent"
@@ -53935,7 +54900,7 @@ __exitcall_ebc_exit:
 	.string	"UNEVICTABLE_PGRESCUED"
 .LASF2209:
 	.string	"msi_list"
-.LASF3214:
+.LASF3216:
 	.string	"__ilog2_u64"
 .LASF547:
 	.string	"compat_time_t"
@@ -53959,7 +54924,7 @@ __exitcall_ebc_exit:
 	.string	"cap_effective"
 .LASF1746:
 	.string	"taints"
-.LASF3230:
+.LASF3232:
 	.string	"of_address_to_resource"
 .LASF1012:
 	.string	"enqueued"
@@ -53987,7 +54952,7 @@ __exitcall_ebc_exit:
 	.string	"bd_private"
 .LASF1903:
 	.string	"fl_start"
-.LASF3186:
+.LASF3188:
 	.string	"out_value"
 .LASF1961:
 	.string	"freeze_fs"
@@ -53995,7 +54960,7 @@ __exitcall_ebc_exit:
 	.string	"sigset_t"
 .LASF1917:
 	.string	"lm_notify"
-.LASF3143:
+.LASF3145:
 	.string	"ebc_tcon_dsp_mode_set"
 .LASF880:
 	.string	"running"
@@ -54033,13 +54998,13 @@ __exitcall_ebc_exit:
 	.string	"copy_file_range"
 .LASF2685:
 	.string	"UNEVICTABLE_PGCLEARED"
-.LASF3261:
+.LASF3263:
 	.string	"epd_lut_get_wf_version"
 .LASF2047:
 	.string	"key_type"
 .LASF797:
 	.string	"WORK_STRUCT_LINKED_BIT"
-.LASF3205:
+.LASF3207:
 	.string	"copy_overflow"
 .LASF2441:
 	.string	"get_named_child_node"
@@ -54055,7 +55020,7 @@ __exitcall_ebc_exit:
 	.string	"module_kobject"
 .LASF3043:
 	.string	"memory"
-.LASF3178:
+.LASF3180:
 	.string	"order"
 .LASF739:
 	.string	"active_memcg"
@@ -54105,7 +55070,7 @@ __exitcall_ebc_exit:
 	.string	"arm64_ftr_reg_ctrel0"
 .LASF1244:
 	.string	"counters"
-.LASF3221:
+.LASF3223:
 	.string	"kasan_check_read"
 .LASF2059:
 	.string	"name_link"
@@ -54167,7 +55132,7 @@ __exitcall_ebc_exit:
 	.string	"nr_irqs"
 .LASF894:
 	.string	"max_hang_time"
-.LASF3167:
+.LASF3169:
 	.string	"copy_from_user"
 .LASF2467:
 	.string	"DOMAIN_BUS_ANY"
@@ -54181,7 +55146,7 @@ __exitcall_ebc_exit:
 	.string	"mmap_miss"
 .LASF1654:
 	.string	"quota_format_ops"
-.LASF3273:
+.LASF3275:
 	.string	"ebc_osd_buf_get"
 .LASF3061:
 	.string	"argp"
@@ -54221,7 +55186,7 @@ __exitcall_ebc_exit:
 	.string	"thread_keyring"
 .LASF2745:
 	.string	"kparam_array"
-.LASF3223:
+.LASF3225:
 	.string	"platform_driver_unregister"
 .LASF652:
 	.string	"utime"
@@ -54231,7 +55196,7 @@ __exitcall_ebc_exit:
 	.string	"ebc_driver"
 .LASF2605:
 	.string	"dev_page_free_t"
-.LASF3184:
+.LASF3186:
 	.string	"of_property_read_u32"
 .LASF1398:
 	.string	"guid_t"
@@ -54261,7 +55226,7 @@ __exitcall_ebc_exit:
 	.string	"cpumask_t"
 .LASF133:
 	.string	"kmsg_fops"
-.LASF3270:
+.LASF3272:
 	.string	"ebc_buf_release"
 .LASF819:
 	.string	"WORK_STRUCT_NO_POOL"
@@ -54283,7 +55248,7 @@ __exitcall_ebc_exit:
 	.string	"sched_rt_entity"
 .LASF116:
 	.string	"sendpage"
-.LASF3137:
+.LASF3139:
 	.string	"ret_val"
 .LASF866:
 	.string	"timerqueue_node"
@@ -54293,7 +55258,7 @@ __exitcall_ebc_exit:
 	.string	"mem_dqblk"
 .LASF2772:
 	.string	"plt_entry"
-.LASF3145:
+.LASF3147:
 	.string	"display_mode"
 .LASF1980:
 	.string	"nr_cached_objects"
@@ -54325,11 +55290,11 @@ __exitcall_ebc_exit:
 	.string	"fops"
 .LASF1273:
 	.string	"f_path"
-.LASF3237:
+.LASF3239:
 	.string	"kthread_create_on_node"
 .LASF711:
 	.string	"cgroups"
-.LASF3170:
+.LASF3172:
 	.string	"__uaccess_mask_ptr"
 .LASF2344:
 	.string	"probe_type"
@@ -54349,9 +55314,9 @@ __exitcall_ebc_exit:
 	.string	"userspace_clients"
 .LASF2143:
 	.string	"uevent_seqnum"
-.LASF3233:
+.LASF3235:
 	.string	"memset"
-.LASF3142:
+.LASF3144:
 	.string	"cur_image_addr"
 .LASF2144:
 	.string	"list_lock"
@@ -54399,7 +55364,7 @@ __exitcall_ebc_exit:
 	.string	"qf_fmt_id"
 .LASF1050:
 	.string	"nr_wakeups_idle"
-.LASF3278:
+.LASF3280:
 	.string	"up_write"
 .LASF1458:
 	.string	"NR_MLOCK"
@@ -54435,7 +55400,7 @@ __exitcall_ebc_exit:
 	.string	"console_printk"
 .LASF702:
 	.string	"ioac"
-.LASF3198:
+.LASF3200:
 	.string	"__init_work"
 .LASF1171:
 	.string	"nr_to_scan"
@@ -54447,7 +55412,7 @@ __exitcall_ebc_exit:
 	.string	"exec_max"
 .LASF1403:
 	.string	"uuid_index"
-.LASF3199:
+.LASF3201:
 	.string	"onstack"
 .LASF189:
 	.string	"compat_rmtp"
@@ -54541,7 +55506,7 @@ __exitcall_ebc_exit:
 	.string	"d_rt_space"
 .LASF264:
 	.string	"name"
-.LASF3242:
+.LASF3244:
 	.string	"mod_timer"
 .LASF150:
 	.string	"early_boot_irqs_disabled"
@@ -54611,7 +55576,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_WRITE_PENDING"
 .LASF1296:
 	.string	"close"
-.LASF3125:
+.LASF3127:
 	.string	"image_fb_data"
 .LASF3039:
 	.string	"klogo_buf"
@@ -54623,13 +55588,13 @@ __exitcall_ebc_exit:
 	.string	"ebc_wq"
 .LASF736:
 	.string	"memcg_oom_gfp_mask"
-.LASF3201:
+.LASF3203:
 	.string	"_msecs_to_jiffies"
 .LASF1683:
 	.string	"d_spc_timer"
 .LASF1759:
 	.string	"jump_entries"
-.LASF3209:
+.LASF3211:
 	.string	"test_ti_thread_flag"
 .LASF2255:
 	.string	"async_suspend"
@@ -54639,7 +55604,7 @@ __exitcall_ebc_exit:
 	.string	"read_pos"
 .LASF481:
 	.string	"super_block"
-.LASF3172:
+.LASF3174:
 	.string	"__addr"
 .LASF2322:
 	.string	"dma_coherent"
@@ -54685,11 +55650,11 @@ __exitcall_ebc_exit:
 	.string	"devkmsg_log_str"
 .LASF254:
 	.string	"FTR_HIGHER_SAFE"
-.LASF3183:
+.LASF3185:
 	.string	"i2c_get_clientdata"
-.LASF3168:
+.LASF3170:
 	.string	"_copy_to_user"
-.LASF3216:
+.LASF3218:
 	.string	"test_bit"
 .LASF248:
 	.string	"__start___jump_table"
@@ -54721,9 +55686,9 @@ __exitcall_ebc_exit:
 	.string	"futex"
 .LASF1025:
 	.string	"wait_max"
-.LASF3240:
+.LASF3242:
 	.string	"wakeup_source_add"
-.LASF3161:
+.LASF3163:
 	.string	"ebc_pmic_suspend"
 .LASF1158:
 	.string	"result_mask"
@@ -54735,9 +55700,9 @@ __exitcall_ebc_exit:
 	.string	"dquot_operations"
 .LASF1224:
 	.string	"mapping"
-.LASF3193:
+.LASF3195:
 	.string	"resource_size"
-.LASF3238:
+.LASF3240:
 	.string	"wake_up_process"
 .LASF1354:
 	.string	"kioctx_table"
@@ -54769,7 +55734,7 @@ __exitcall_ebc_exit:
 	.string	"__initdata_end"
 .LASF2501:
 	.string	"bus_lock"
-.LASF3180:
+.LASF3182:
 	.string	"kmalloc_type"
 .LASF387:
 	.string	"qstr"
@@ -54781,7 +55746,7 @@ __exitcall_ebc_exit:
 	.string	"WORKINGSET_RESTORE"
 .LASF628:
 	.string	"sched_psi_wake_requeue"
-.LASF3202:
+.LASF3204:
 	.string	"check_copy_size"
 .LASF737:
 	.string	"memcg_oom_order"
@@ -54837,17 +55802,17 @@ __exitcall_ebc_exit:
 	.string	"core_state"
 .LASF868:
 	.string	"timerqueue_head"
-.LASF3239:
+.LASF3241:
 	.string	"sched_setscheduler_nocheck"
 .LASF1291:
 	.string	"f_wb_err"
-.LASF3196:
+.LASF3198:
 	.string	"schedule_work"
 .LASF2430:
 	.string	"rt_mutex"
 .LASF990:
 	.string	"rchar"
-.LASF3153:
+.LASF3155:
 	.string	"valid_dma_direction"
 .LASF1818:
 	.string	"bd_contains"
@@ -54889,7 +55854,7 @@ __exitcall_ebc_exit:
 	.string	"epoll_watches"
 .LASF2677:
 	.string	"KCOMPACTD_WAKE"
-.LASF3120:
+.LASF3122:
 	.string	"refresh_new_image"
 .LASF2074:
 	.string	"non_rcu"
@@ -54963,13 +55928,13 @@ __exitcall_ebc_exit:
 	.string	"need"
 .LASF504:
 	.string	"s_encoding"
-.LASF3197:
+.LASF3199:
 	.string	"queue_work"
 .LASF1734:
 	.string	"gpl_crcs"
 .LASF1720:
 	.string	"get_state"
-.LASF3156:
+.LASF3158:
 	.string	"dma_handle"
 .LASF1359:
 	.string	"orig_pte"
@@ -55043,7 +56008,7 @@ __exitcall_ebc_exit:
 	.string	"__ctors_end"
 .LASF2266:
 	.string	"wakeup_path"
-.LASF3257:
+.LASF3259:
 	.string	"ebc_buf_state_show"
 .LASF968:
 	.string	"vm_prev"
@@ -55059,7 +56024,7 @@ __exitcall_ebc_exit:
 	.string	"__u8"
 .LASF115:
 	.string	"lock"
-.LASF3160:
+.LASF3162:
 	.string	"ebc_pmic_resume"
 .LASF1562:
 	.string	"compact_cached_migrate_pfn"
@@ -55101,7 +56066,7 @@ __exitcall_ebc_exit:
 	.string	"compact_order_failed"
 .LASF1105:
 	.string	"fsuid"
-.LASF3210:
+.LASF3212:
 	.string	"flag"
 .LASF1475:
 	.string	"NR_ISOLATED_FILE"
@@ -55113,9 +56078,9 @@ __exitcall_ebc_exit:
 	.string	"managed_pages"
 .LASF2589:
 	.string	"__tracepoint_page_ref_set"
-.LASF3149:
+.LASF3151:
 	.string	"ebc_tcon_enable"
-.LASF3285:
+.LASF3286:
 	.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"
@@ -55141,6 +56106,8 @@ __exitcall_ebc_exit:
 	.string	"oom_reaper_list"
 .LASF353:
 	.string	"debug"
+.LASF3018:
+	.string	"__addressable_ebc_init2499"
 .LASF1549:
 	.string	"nr_reserved_highatomic"
 .LASF2364:
@@ -55163,13 +56130,13 @@ __exitcall_ebc_exit:
 	.string	"s_vop"
 .LASF1650:
 	.string	"qf_owner"
-.LASF3222:
+.LASF3224:
 	.string	"__write_once_size"
 .LASF2831:
 	.string	"kmalloc_cache_type"
 .LASF574:
 	.string	"mutex"
-.LASF3188:
+.LASF3190:
 	.string	"out_values"
 .LASF839:
 	.string	"pgd_t"
@@ -55183,7 +56150,7 @@ __exitcall_ebc_exit:
 	.string	"raw_spinlock_t"
 .LASF2935:
 	.string	"vir_width"
-.LASF3213:
+.LASF3215:
 	.string	"INIT_LIST_HEAD"
 .LASF1938:
 	.string	"fs_flags"
@@ -55199,7 +56166,7 @@ __exitcall_ebc_exit:
 	.string	"dma_pfn_offset"
 .LASF1189:
 	.string	"radix_tree_node"
-.LASF3215:
+.LASF3217:
 	.string	"sign_extend64"
 .LASF2313:
 	.string	"wake_irq"
@@ -55221,7 +56188,7 @@ __exitcall_ebc_exit:
 	.string	"ptraced"
 .LASF2751:
 	.string	"param_ops_short"
-.LASF3254:
+.LASF3256:
 	.string	"of_find_device_by_node"
 .LASF2553:
 	.string	"HRTIMER_SOFTIRQ"
@@ -55247,7 +56214,7 @@ __exitcall_ebc_exit:
 	.string	"addr"
 .LASF2385:
 	.string	"device_private"
-.LASF3151:
+.LASF3153:
 	.string	"get_dma_ops"
 .LASF2697:
 	.string	"watermark_scale_factor"
@@ -55263,7 +56230,7 @@ __exitcall_ebc_exit:
 	.string	"mkobj"
 .LASF2962:
 	.string	"direct_buf_real_size"
-.LASF3274:
+.LASF3276:
 	.string	"__pm_relax"
 .LASF472:
 	.string	"d_delete"
@@ -55307,7 +56274,7 @@ __exitcall_ebc_exit:
 	.string	"kill"
 .LASF1029:
 	.string	"iowait_sum"
-.LASF3121:
+.LASF3123:
 	.string	"image_new"
 .LASF15:
 	.string	"__u64"
@@ -55385,7 +56352,7 @@ __exitcall_ebc_exit:
 	.string	"buffer_new"
 .LASF212:
 	.string	"user_fpsimd_state"
-.LASF3253:
+.LASF3255:
 	.string	"device_create_file"
 .LASF520:
 	.string	"s_time_gran"
@@ -55409,11 +56376,11 @@ __exitcall_ebc_exit:
 	.string	"s_bdi"
 .LASF2856:
 	.string	"wf_table"
-.LASF3127:
+.LASF3129:
 	.string	"image_new_tmp"
 .LASF1731:
 	.string	"num_kp"
-.LASF3284:
+.LASF3285:
 	.string	"__pm_stay_awake"
 .LASF2564:
 	.string	"vmap_area_list"
@@ -55641,7 +56608,7 @@ __exitcall_ebc_exit:
 	.string	"maj_flt"
 .LASF228:
 	.string	"arch_rwlock_t"
-.LASF3272:
+.LASF3274:
 	.string	"ebc_osd_buf_clone"
 .LASF161:
 	.string	"c_false"
@@ -55667,7 +56634,7 @@ __exitcall_ebc_exit:
 	.string	"minor"
 .LASF1698:
 	.string	"nextents"
-.LASF3154:
+.LASF3156:
 	.string	"dma_direction"
 .LASF1:
 	.string	"sizetype"
@@ -55691,7 +56658,7 @@ __exitcall_ebc_exit:
 	.string	"next_timer"
 .LASF740:
 	.string	"throttle_queue"
-.LASF3267:
+.LASF3269:
 	.string	"finish_wait"
 .LASF1479:
 	.string	"WORKINGSET_NODERECLAIM"
@@ -55701,7 +56668,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_REQ_RESUME"
 .LASF2044:
 	.string	"keyring_index_key"
-.LASF3148:
+.LASF3150:
 	.string	"ebc_tcon_disable"
 .LASF1420:
 	.string	"leases_enable"
@@ -55743,7 +56710,7 @@ __exitcall_ebc_exit:
 	.string	"num_vf"
 .LASF1534:
 	.string	"isolate_mode_t"
-.LASF3155:
+.LASF3157:
 	.string	"debug_dma_sync_single_for_device"
 .LASF98:
 	.string	"llseek"
@@ -55785,9 +56752,9 @@ __exitcall_ebc_exit:
 	.string	"target"
 .LASF2545:
 	.string	"HI_SOFTIRQ"
-.LASF3157:
+.LASF3159:
 	.string	"direction"
-.LASF3126:
+.LASF3128:
 	.string	"image_bg_data"
 .LASF957:
 	.string	"session_keyring"
@@ -55811,7 +56778,7 @@ __exitcall_ebc_exit:
 	.string	"i2c_bus_type"
 .LASF884:
 	.string	"hrtimer_cpu_base"
-.LASF3279:
+.LASF3281:
 	.string	"ebc_notify"
 .LASF1390:
 	.string	"cb_head"
@@ -55839,7 +56806,7 @@ __exitcall_ebc_exit:
 	.string	"cpus_requested"
 .LASF2593:
 	.string	"__tracepoint_page_ref_mod_unless"
-.LASF3165:
+.LASF3167:
 	.string	"wake_lock_init"
 .LASF1185:
 	.string	"list_lru"
@@ -55863,7 +56830,7 @@ __exitcall_ebc_exit:
 	.string	"d_iput"
 .LASF107:
 	.string	"compat_ioctl"
-.LASF3173:
+.LASF3175:
 	.string	"__range_ok"
 .LASF286:
 	.string	"__start_ro_after_init"
@@ -55871,7 +56838,7 @@ __exitcall_ebc_exit:
 	.string	"num_poisoned_pages"
 .LASF904:
 	.string	"filter"
-.LASF3158:
+.LASF3160:
 	.string	"ebc_pmic_get_vcom"
 .LASF2943:
 	.string	"ebc_tcon"
@@ -55981,11 +56948,11 @@ __exitcall_ebc_exit:
 	.string	"power"
 .LASF265:
 	.string	"strict_mask"
-.LASF3266:
+.LASF3268:
 	.string	"init_wait_entry"
 .LASF2786:
 	.string	"module_state"
-.LASF3225:
+.LASF3227:
 	.string	"_dev_info"
 .LASF416:
 	.string	"d_subdirs"
@@ -56031,7 +56998,7 @@ __exitcall_ebc_exit:
 	.string	"removed_mem"
 .LASF247:
 	.string	"jump_label_t"
-.LASF3139:
+.LASF3141:
 	.string	"ebc_tcon_frame_start"
 .LASF2711:
 	.string	"Elf64_Half"
@@ -56045,7 +57012,7 @@ __exitcall_ebc_exit:
 	.string	"can_wakeup"
 .LASF2546:
 	.string	"TIMER_SOFTIRQ"
-.LASF3118:
+.LASF3119:
 	.string	"temp_data"
 .LASF1214:
 	.string	"xol_area"
@@ -56071,11 +57038,11 @@ __exitcall_ebc_exit:
 	.string	"init_on_free"
 .LASF1151:
 	.string	"nr_pages"
-.LASF3134:
+.LASF3136:
 	.string	"ebc_power_set"
 .LASF1761:
 	.string	"num_trace_bprintk_fmt"
-.LASF3219:
+.LASF3221:
 	.string	"__fls"
 .LASF1129:
 	.string	"ioprio"
@@ -56101,9 +57068,9 @@ __exitcall_ebc_exit:
 	.string	"persistent_clock_is_local"
 .LASF2413:
 	.string	"dma_supported"
-.LASF3190:
+.LASF3192:
 	.string	"dev_set_drvdata"
-.LASF3280:
+.LASF3282:
 	.string	"epd_lut_get"
 .LASF1535:
 	.string	"per_cpu_pages"
@@ -56139,7 +57106,7 @@ __exitcall_ebc_exit:
 	.string	"BLOCK_SOFTIRQ"
 .LASF1411:
 	.string	"files_stat_struct"
-.LASF3231:
+.LASF3233:
 	.string	"devm_memremap"
 .LASF843:
 	.string	"pgtable_t"
@@ -56207,7 +57174,7 @@ __exitcall_ebc_exit:
 	.string	"rm_xquota"
 .LASF1084:
 	.string	"dl_timer"
-.LASF3263:
+.LASF3265:
 	.string	"remap_pfn_range"
 .LASF2375:
 	.string	"DL_DEV_NO_DRIVER"
@@ -56221,7 +57188,7 @@ __exitcall_ebc_exit:
 	.string	"watermark"
 .LASF2423:
 	.string	"deadprops"
-.LASF3227:
+.LASF3229:
 	.string	"devm_kmalloc"
 .LASF16:
 	.string	"long long unsigned int"
@@ -56355,7 +57322,7 @@ __exitcall_ebc_exit:
 	.string	"free_list"
 .LASF589:
 	.string	"prio"
-.LASF3182:
+.LASF3184:
 	.string	"platform_get_drvdata"
 .LASF2555:
 	.string	"NR_SOFTIRQS"
@@ -56377,7 +57344,7 @@ __exitcall_ebc_exit:
 	.string	"atomic_t"
 .LASF812:
 	.string	"WORK_OFFQ_FLAG_BITS"
-.LASF3140:
+.LASF3142:
 	.string	"ebc_tcon_image_addr_set"
 .LASF2531:
 	.string	"max_num_msgs"
@@ -56397,7 +57364,7 @@ __exitcall_ebc_exit:
 	.string	"scatterlist"
 .LASF1267:
 	.string	"altmap_valid"
-.LASF3282:
+.LASF3284:
 	.string	"down"
 .LASF101:
 	.string	"read_iter"
@@ -56435,7 +57402,7 @@ __exitcall_ebc_exit:
 	.string	"pm_domain_data"
 .LASF2487:
 	.string	"byte"
-.LASF3251:
+.LASF3253:
 	.string	"__wake_up_sync"
 .LASF2002:
 	.string	"poll_table_struct"
@@ -56461,7 +57428,7 @@ __exitcall_ebc_exit:
 	.string	"page_fault"
 .LASF1469:
 	.string	"NR_INACTIVE_FILE"
-.LASF3206:
+.LASF3208:
 	.string	"__ret_warn_on"
 .LASF1625:
 	.string	"kqid"
@@ -56541,6 +57508,8 @@ __exitcall_ebc_exit:
 	.string	"__irqentry_text_end"
 .LASF1346:
 	.string	"context"
+.LASF3113:
+	.string	"get_overlay_image"
 .LASF1540:
 	.string	"per_cpu_nodestat"
 .LASF2520:
@@ -56581,7 +57550,7 @@ __exitcall_ebc_exit:
 	.string	"of_match_table"
 .LASF2578:
 	.string	"percpu_count_ptr"
-.LASF3262:
+.LASF3264:
 	.string	"ebc_phy_buf_base_get"
 .LASF2079:
 	.string	"loops_per_jiffy"
@@ -56603,7 +57572,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_INODESTEAL"
 .LASF1175:
 	.string	"count_objects"
-.LASF3218:
+.LASF3220:
 	.string	"fls64"
 .LASF921:
 	.string	"_stime"
@@ -56639,11 +57608,11 @@ __exitcall_ebc_exit:
 	.string	"sync_sg_for_device"
 .LASF1964:
 	.string	"statfs"
-.LASF3245:
+.LASF3247:
 	.string	"__kmalloc"
-.LASF3234:
+.LASF3236:
 	.string	"_dev_err"
-.LASF3224:
+.LASF3226:
 	.string	"__platform_driver_register"
 .LASF2961:
 	.string	"ebc_buf_real_size"
@@ -56729,7 +57698,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_PENDING_BIT"
 .LASF720:
 	.string	"rseq"
-.LASF3113:
+.LASF3121:
 	.string	"get_auto_image"
 .LASF195:
 	.string	"nfds"
@@ -56743,7 +57712,7 @@ __exitcall_ebc_exit:
 	.string	"i_acl"
 .LASF1789:
 	.string	"bmap"
-.LASF3232:
+.LASF3234:
 	.string	"ebc_buf_init"
 .LASF2048:
 	.string	"key_payload"
@@ -56783,7 +57752,7 @@ __exitcall_ebc_exit:
 	.string	"fallocate"
 .LASF1707:
 	.string	"i_spc_warnlimit"
-.LASF3207:
+.LASF3209:
 	.string	"check_object_size"
 .LASF1515:
 	.string	"node_present_pages"
@@ -56847,7 +57816,7 @@ __exitcall_ebc_exit:
 	.string	"hiwater_vm"
 .LASF3053:
 	.string	"pmic_vcom_read"
-.LASF3226:
+.LASF3228:
 	.string	"misc_deregister"
 .LASF1248:
 	.string	"compound_head"
@@ -56867,7 +57836,7 @@ __exitcall_ebc_exit:
 	.string	"bd_write_holder"
 .LASF2194:
 	.string	"poweroff_noirq"
-.LASF3229:
+.LASF3231:
 	.string	"of_parse_phandle"
 .LASF1858:
 	.string	"rename"
@@ -56897,9 +57866,9 @@ __exitcall_ebc_exit:
 	.string	"sync_single_for_cpu"
 .LASF793:
 	.string	"data"
-.LASF3175:
+.LASF3177:
 	.string	"kzalloc"
-.LASF3200:
+.LASF3202:
 	.string	"msecs_to_jiffies"
 .LASF1919:
 	.string	"lm_break"
@@ -56935,7 +57904,7 @@ __exitcall_ebc_exit:
 	.string	"signed char"
 .LASF375:
 	.string	"rcu_scheduler_active"
-.LASF3185:
+.LASF3187:
 	.string	"propname"
 .LASF2101:
 	.string	"priv"
@@ -57061,7 +58030,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_GCC16"
 .LASF2514:
 	.string	"i2c_lock_operations"
-.LASF3136:
+.LASF3138:
 	.string	"ebc_get_4pix_wf_part"
 .LASF1620:
 	.string	"USRQUOTA"
@@ -57107,9 +58076,9 @@ __exitcall_ebc_exit:
 	.string	"f_inode"
 .LASF2031:
 	.string	"procname"
-.LASF3117:
+.LASF3118:
 	.string	"point_data"
-.LASF3236:
+.LASF3238:
 	.string	"epd_lut_from_file_init"
 .LASF1669:
 	.string	"mark_dirty"
@@ -57263,7 +58232,7 @@ __exitcall_ebc_exit:
 	.string	"percpu_size"
 .LASF1323:
 	.string	"mmap_sem"
-.LASF3264:
+.LASF3266:
 	.string	"schedule"
 .LASF2442:
 	.string	"get_reference_args"
@@ -57463,7 +58432,7 @@ __exitcall_ebc_exit:
 	.string	"compound_mapcount"
 .LASF1449:
 	.string	"zone_stat_item"
-.LASF3177:
+.LASF3179:
 	.string	"kmalloc_large"
 .LASF2626:
 	.string	"PE_SIZE_PMD"
@@ -57535,7 +58504,7 @@ __exitcall_ebc_exit:
 	.string	"last_waited"
 .LASF3058:
 	.string	"ebc_open"
-.LASF3146:
+.LASF3148:
 	.string	"three_win_mode"
 .LASF2874:
 	.string	"EPD_OVERLAY"
@@ -57587,7 +58556,7 @@ __exitcall_ebc_exit:
 	.string	"timer_expires"
 .LASF2827:
 	.string	"mmlist_lock"
-.LASF3163:
+.LASF3165:
 	.string	"ebc_pmic_power_on"
 .LASF1765:
 	.string	"trace_evals"
@@ -57629,7 +58598,7 @@ __exitcall_ebc_exit:
 	.string	"relax_count"
 .LASF1413:
 	.string	"nr_free_files"
-.LASF3176:
+.LASF3178:
 	.string	"kmalloc"
 	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
 	.section	.note.GNU-stack,"",@progbits
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S
index 39ca0a73f5ea..947c5e453202 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S
@@ -912,7 +912,7 @@ get_wf_frm_num:
 	.type	pvi_wf_get_lut, %function
 pvi_wf_get_lut:
 .LFB1553:
-	.loc 1 937 0
+	.loc 1 941 0
 	.cfi_startproc
 .LVL58:
 	stp	x29, x30, [sp, -64]!
@@ -923,23 +923,23 @@ pvi_wf_get_lut:
 	.cfi_def_cfa_register 29
 	str	x23, [sp, 48]
 	.cfi_offset 23, -16
-	.loc 1 943 0
+	.loc 1 947 0
 	adrp	x23, .LANCHOR0
 	add	x3, x23, :lo12:.LANCHOR0
-	.loc 1 937 0
+	.loc 1 941 0
 	stp	x19, x20, [sp, 16]
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 19, -48
 	.cfi_offset 20, -40
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 943 0
+	.loc 1 947 0
 	ldr	x5, [x3, 40]
 	cbz	x5, .L132
-	.loc 1 946 0
-	cbz	x0, .L144
+	.loc 1 950 0
+	cbz	x0, .L146
 .L113:
-	.loc 1 951 0
+	.loc 1 955 0
 	adrp	x6, .LANCHOR2
 	mov	w3, 21846
 	movk	w3, 0x5555, lsl 16
@@ -952,9 +952,9 @@ pvi_wf_get_lut:
 	lsr	x3, x3, 32
 	sub	w3, w3, w7, asr 31
 	cmp	w4, w3
-	beq	.L145
+	beq	.L147
 .L114:
-	.loc 1 954 0
+	.loc 1 958 0
 	add	x4, x6, :lo12:.LANCHOR2
 .LBB22:
 .LBB23:
@@ -963,94 +963,97 @@ pvi_wf_get_lut:
 .LVL59:
 .LBE23:
 .LBE22:
-	.loc 1 954 0
+	.loc 1 958 0
 	str	w2, [x6, #:lo12:.LANCHOR2]
-	.loc 1 955 0
+	.loc 1 959 0
 	str	w1, [x4, 4]
-.LBB26:
+.LBB27:
 .LBB24:
 	.loc 1 436 0
 	cbz	w3, .L115
 	.loc 1 437 0
 	ldrb	w4, [x5, 48]
-	.loc 1 436 0
-	mov	w19, 0
-.LVL60:
-	.loc 1 437 0
 	cmp	w2, w4
-	bge	.L117
-	b	.L131
+	blt	.L134
+	mov	w21, 0
+.LVL60:
+	b	.L117
 	.p2align 3
 .L118:
-	ldrb	w4, [x5, w4, sxtw]
-	cmp	w2, w4
+	ldrb	w6, [x5, w6, sxtw]
+	cmp	w2, w6
 	blt	.L131
+	mov	w21, w4
 .L117:
 	.loc 1 436 0
-	add	w19, w19, 1
+	add	w4, w21, 1
 	.loc 1 437 0
-	add	w4, w19, 48
+	add	w6, w21, 49
 	.loc 1 436 0
-	cmp	w3, w19
+	cmp	w3, w4
 	bne	.L118
 .L115:
 	.loc 1 444 0
-	sub	w19, w3, #1
+	sub	w21, w3, #1
 .L131:
-	mov	x21, x0
+	mov	x20, x0
 .LBE24:
-.LBE26:
-	.loc 1 958 0
+.LBE27:
+	.loc 1 962 0
 	add	x0, x23, :lo12:.LANCHOR0
 .LVL61:
-	.loc 1 962 0
+	.loc 1 966 0
 	sub	w2, w1, #1
 .LVL62:
-	mov	w20, w1
+	mov	w19, w1
 	cmp	w2, 10
-	.loc 1 958 0
-	ldr	x1, [x21, 16]
+	.loc 1 962 0
+	ldr	x1, [x20, 16]
 .LVL63:
 	str	x1, [x0, 48]
-	.loc 1 962 0
+	.loc 1 966 0
 	bhi	.L119
-.LBB27:
 .LBB28:
+.LBB29:
 	.loc 1 902 0
-	mov	w0, w20
+	mov	w0, w19
 	bl	get_wf_mode_index
 .LVL64:
 	.loc 1 903 0
-	mov	w1, w19
+	mov	w1, w21
 	bl	get_wf_frm_num
 .LVL65:
 	mov	w22, w0
 .LVL66:
 	.loc 1 904 0
-	tbnz	w0, #31, .L146
+	tbnz	w0, #31, .L148
 	.loc 1 908 0
-	str	w0, [x21]
+	str	w0, [x20]
 	.loc 1 910 0
-	cmp	w20, 5
-	beq	.L147
-.L123:
+	cmp	w19, 5
+	beq	.L149
+	.loc 1 900 0
+	mov	w21, 0
+.LVL67:
 	.loc 1 917 0
-	cbz	w22, .L126
+	cbz	w0, .L128
+.L129:
 	add	x23, x23, :lo12:.LANCHOR0
+	.loc 1 900 0
 	mov	w10, 0
 	mov	w11, 0
-.LVL67:
-	ldr	x4, [x23, 48]
 .LVL68:
-.L130:
+	ldr	x4, [x23, 48]
+.LVL69:
+.L127:
 	mov	w8, w10
 	mov	w9, 0
 	.p2align 2
-.L128:
+.L125:
 	and	w0, w9, 65535
+.LBE29:
 .LBE28:
-.LBE27:
-.LBB33:
+.LBB36:
 .LBB25:
 	.loc 1 437 0
 	mov	w2, 0
@@ -1059,12 +1062,12 @@ pvi_wf_get_lut:
 	add	w7, w7, w10
 	add	w6, w10, w0, lsl 4
 	.p2align 2
-.L127:
+.L124:
 .LBE25:
-.LBE33:
-.LBB34:
-.LBB31:
-.LBB29:
+.LBE36:
+.LBB37:
+.LBB32:
+.LBB30:
 	.loc 1 922 0
 	and	w0, w2, 65535
 	.loc 1 929 0
@@ -1074,11 +1077,11 @@ pvi_wf_get_lut:
 	.loc 1 927 0
 	and	w0, w0, 15
 	add	w0, w0, w7
-.LBE29:
+.LBE30:
 	.loc 1 919 0
 	add	w2, w2, 1
 	cmp	w2, 256
-.LBB30:
+.LBB31:
 	.loc 1 928 0
 	ldrb	w1, [x4, w1, sxtw]
 	.loc 1 927 0
@@ -1090,37 +1093,40 @@ pvi_wf_get_lut:
 	.loc 1 929 0
 	orr	w0, w0, w1
 	strb	w0, [x4, w5, sxtw]
-.LBE30:
+.LBE31:
 	.loc 1 919 0
-	bne	.L127
+	bne	.L124
 	.loc 1 918 0
 	add	w9, w9, 1
 	add	w8, w8, 256
 	cmp	w9, 256
-	bne	.L128
+	bne	.L125
 	.loc 1 917 0
 	add	w11, w11, 1
 	add	w10, w10, 65536
 	cmp	w22, w11
-	bne	.L130
-.LVL69:
-.L126:
-.LBE31:
-.LBE34:
-	.loc 1 952 0
+	bgt	.L127
+	.loc 1 934 0
+	cmp	w19, 5
+	beq	.L130
+.LVL70:
+.L128:
+.LBE32:
+.LBE37:
+	.loc 1 956 0
 	mov	w0, 0
 	b	.L111
-.LVL70:
+.LVL71:
 .L132:
-	.loc 1 944 0
+	.loc 1 948 0
 	mov	w0, -19
-.LVL71:
+.LVL72:
 .L111:
-	.loc 1 984 0
+	.loc 1 988 0
 	ldp	x19, x20, [sp, 16]
-.LVL72:
-	ldp	x21, x22, [sp, 32]
 .LVL73:
+	ldp	x21, x22, [sp, 32]
+.LVL74:
 	ldr	x23, [sp, 48]
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
@@ -1133,67 +1139,100 @@ pvi_wf_get_lut:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL74:
-.L147:
-	.cfi_restore_state
-.LBB35:
-.LBB32:
-	.loc 1 911 0
-	mov	w0, 4
 .LVL75:
-	bl	get_wf_mode_index
+.L134:
+	.cfi_restore_state
+.LBB38:
+.LBB26:
+	.loc 1 437 0
+	mov	w21, -1
 .LVL76:
-	.loc 1 912 0
-	mov	w1, w19
-	bl	get_wf_frm_num
+	b	.L131
 .LVL77:
-	.loc 1 913 0
-	cmp	w0, 0
-	bgt	.L123
-	.loc 1 914 0
-	adrp	x0, .LC6
-	add	x0, x0, :lo12:.LC6
-	bl	printk
+.L147:
+.LBE26:
+.LBE38:
+	.loc 1 955 0 discriminator 1
+	ldr	w3, [x8, 4]
+	cmp	w3, w1
+	bne	.L114
+	b	.L128
+.L146:
+	.loc 1 950 0 discriminator 1
+	ldr	x3, [x0, 16]
+	cbnz	x3, .L113
+	.loc 1 951 0
+	mov	w0, -22
 .LVL78:
-	b	.L123
+	b	.L111
 .LVL79:
-.L146:
+.L148:
+.LBB39:
+.LBB33:
 	.loc 1 905 0
 	adrp	x0, .LC5
 .LVL80:
 	add	x0, x0, :lo12:.LC5
 	bl	printk
 .LVL81:
-.LBE32:
-.LBE35:
-	.loc 1 976 0
+.LBE33:
+.LBE39:
+	.loc 1 980 0
 	mov	w0, -1
 	b	.L111
 .LVL82:
+.L149:
+.LBB40:
+.LBB34:
+	.loc 1 911 0
+	mov	w0, 4
+.LVL83:
+	bl	get_wf_mode_index
+.LVL84:
+	.loc 1 912 0
+	mov	w1, w21
+	bl	get_wf_frm_num
+.LVL85:
+	mov	w21, w0
+.LVL86:
+	.loc 1 913 0
+	cmp	w0, 0
+	bgt	.L123
+	.loc 1 914 0
+	adrp	x0, .LC6
+	add	x0, x0, :lo12:.LC6
+	bl	printk
+.LVL87:
+.L123:
+	.loc 1 917 0
+	cbnz	w22, .L129
+.LVL88:
+.L130:
+	.loc 1 935 0
+	ldr	w1, [x20]
+.LBE34:
+.LBE40:
+	.loc 1 987 0
+	mov	w0, 0
+.LBB41:
+.LBB35:
+	.loc 1 935 0
+	orr	w21, w1, w21, lsl 8
+.LVL89:
+	str	w21, [x20]
+	b	.L111
+.LVL90:
 .L119:
-	.loc 1 979 0
+.LBE35:
+.LBE41:
+	.loc 1 983 0
 	adrp	x0, .LC7
 	add	x0, x0, :lo12:.LC7
 	bl	printk
-.LVL83:
-	.loc 1 980 0
+.LVL91:
+	.loc 1 984 0
 	mov	w0, -1
 	b	.L111
-.LVL84:
-.L145:
-	.loc 1 951 0 discriminator 1
-	ldr	w3, [x8, 4]
-	cmp	w3, w1
-	bne	.L114
-	b	.L126
-.L144:
-	.loc 1 946 0 discriminator 1
-	ldr	x3, [x0, 16]
-	cbnz	x3, .L113
-	.loc 1 947 0
-	mov	w0, -22
-.LVL85:
-	b	.L111
 	.cfi_endproc
 .LFE1553:
 	.size	pvi_wf_get_lut, .-pvi_wf_get_lut
@@ -1203,9 +1242,9 @@ pvi_wf_get_lut:
 	.type	pvi_wf_input, %function
 pvi_wf_input:
 .LFB1554:
-	.loc 1 993 0
+	.loc 1 997 0
 	.cfi_startproc
-.LVL86:
+.LVL92:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -1215,18 +1254,18 @@ pvi_wf_input:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-	.loc 1 996 0
+	.loc 1 1000 0
 	adrp	x19, .LANCHOR0
 	add	x1, x19, :lo12:.LANCHOR0
 	ldr	x1, [x1, 40]
-	cbz	x1, .L177
-	.loc 1 997 0
+	cbz	x1, .L179
+	.loc 1 1001 0
 	mov	w0, -16
-.LVL87:
-.L148:
-	.loc 1 1022 0
+.LVL93:
+.L150:
+	.loc 1 1026 0
 	ldp	x19, x20, [sp, 16]
-.LVL88:
+.LVL94:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -1235,62 +1274,62 @@ pvi_wf_input:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL89:
-.L177:
+.LVL95:
+.L179:
 	.cfi_restore_state
-	.loc 1 999 0
+	.loc 1 1003 0
 	ldrb	w1, [x0, 16]
 	mov	x20, x0
 	adrp	x0, .LC8
-.LVL90:
+.LVL96:
 	add	x0, x0, :lo12:.LC8
 	bl	printk
-.LVL91:
-	.loc 1 1002 0
+.LVL97:
+	.loc 1 1006 0
 	ldrb	w1, [x20, 16]
 	cmp	w1, 25
-	bhi	.L151
+	bhi	.L153
 	cmp	w1, 24
-	bcs	.L152
+	bcs	.L154
 	cmp	w1, 18
-	beq	.L152
+	beq	.L154
 	cmp	w1, 22
-	beq	.L152
+	beq	.L154
 	cmp	w1, 9
-	beq	.L152
-.L150:
-	.loc 1 1014 0
+	beq	.L154
+.L152:
+	.loc 1 1018 0
 	ldrb	w2, [x20, 22]
 	adrp	x0, .LC9
 	add	x0, x0, :lo12:.LC9
 	bl	printk
-.LVL92:
-	.loc 1 1016 0
+.LVL98:
+	.loc 1 1020 0
 	mov	w0, -8
-	b	.L148
-.L151:
-	.loc 1 1002 0
+	b	.L150
+.L153:
+	.loc 1 1006 0
 	cmp	w1, 35
-	beq	.L152
-	bls	.L178
+	beq	.L154
+	bls	.L180
 	cmp	w1, 67
-	beq	.L152
+	beq	.L154
 	cmp	w1, 84
-	bne	.L150
-.L152:
-	.loc 1 1019 0
+	bne	.L152
+.L154:
+	.loc 1 1023 0
 	add	x19, x19, :lo12:.LANCHOR0
-	.loc 1 1021 0
+	.loc 1 1025 0
 	mov	w0, 0
-	.loc 1 1019 0
+	.loc 1 1023 0
 	str	x20, [x19, 40]
-	.loc 1 1021 0
-	b	.L148
-.L178:
-	.loc 1 1002 0
-	cmp	w1, 32
-	beq	.L152
+	.loc 1 1025 0
 	b	.L150
+.L180:
+	.loc 1 1006 0
+	cmp	w1, 32
+	beq	.L154
+	b	.L152
 	.cfi_endproc
 .LFE1554:
 	.size	pvi_wf_input, .-pvi_wf_input
@@ -1300,35 +1339,35 @@ pvi_wf_input:
 	.type	pvi_wf_get_version, %function
 pvi_wf_get_version:
 .LFB1555:
-	.loc 1 1031 0
+	.loc 1 1035 0
 	.cfi_startproc
-	.loc 1 1032 0
+	.loc 1 1036 0
 	adrp	x0, .LANCHOR0
 	add	x0, x0, :lo12:.LANCHOR0
 	ldr	x3, [x0, 40]
-.LVL93:
-	.loc 1 1036 0
-	cbz	x3, .L182
-	.loc 1 1040 0 discriminator 3
+.LVL99:
+	.loc 1 1040 0
+	cbz	x3, .L184
+	.loc 1 1044 0 discriminator 3
 	add	x0, x0, 56
 	mov	x1, 0
 	.p2align 2
-.L181:
+.L183:
 	add	x2, x3, x1
 	ldrb	w2, [x2, 65]
 	strb	w2, [x1, x0]
 	add	x1, x1, 1
-	.loc 1 1039 0 discriminator 3
+	.loc 1 1043 0 discriminator 3
 	cmp	x1, 31
-	bne	.L181
-	.loc 1 1042 0
+	bne	.L183
+	.loc 1 1046 0
 	strb	wzr, [x0, 31]
-	.loc 1 1044 0
+	.loc 1 1048 0
 	ret
-.L182:
-	.loc 1 1037 0
+.L184:
+	.loc 1 1041 0
 	mov	x0, 0
-	.loc 1 1045 0
+	.loc 1 1049 0
 	ret
 	.cfi_endproc
 .LFE1555:
@@ -1497,7 +1536,7 @@ spi_id_buffer.16947:
 	.file 96 "drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x6854
+	.4byte	0x6856
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
@@ -13410,7 +13449,7 @@ spi_id_buffer.16947:
 	.uleb128 0x46
 	.4byte	.LASF1473
 	.byte	0x1
-	.2byte	0x406
+	.2byte	0x40a
 	.4byte	0x55
 	.8byte	.LFB1555
 	.8byte	.LFE1555-.LFB1555
@@ -13420,14 +13459,14 @@ spi_id_buffer.16947:
 	.uleb128 0x47
 	.4byte	.LASF1471
 	.byte	0x1
-	.2byte	0x408
+	.2byte	0x40c
 	.4byte	0x55
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x47
 	.4byte	.LASF1472
 	.byte	0x1
-	.2byte	0x409
+	.2byte	0x40d
 	.4byte	0x626e
 	.uleb128 0x9
 	.byte	0x3
@@ -13435,7 +13474,7 @@ spi_id_buffer.16947:
 	.uleb128 0x48
 	.string	"i"
 	.byte	0x1
-	.2byte	0x40a
+	.2byte	0x40e
 	.4byte	0xbb
 	.byte	0
 	.uleb128 0x5
@@ -13448,7 +13487,7 @@ spi_id_buffer.16947:
 	.uleb128 0x46
 	.4byte	.LASF1474
 	.byte	0x1
-	.2byte	0x3e0
+	.2byte	0x3e4
 	.4byte	0xbb
 	.8byte	.LFB1554
 	.8byte	.LFE1554-.LFB1554
@@ -13458,53 +13497,53 @@ spi_id_buffer.16947:
 	.uleb128 0x49
 	.4byte	.LASF1477
 	.byte	0x1
-	.2byte	0x3e0
+	.2byte	0x3e4
 	.4byte	0x45b
-	.4byte	.LLST19
+	.4byte	.LLST20
 	.uleb128 0x4a
 	.4byte	.LASF1475
 	.byte	0x1
-	.2byte	0x3e2
+	.2byte	0x3e6
 	.4byte	0x6217
 	.uleb128 0x4b
-	.8byte	.LVL91
-	.4byte	0x684c
+	.8byte	.LVL97
+	.4byte	0x684e
 	.uleb128 0x4b
-	.8byte	.LVL92
-	.4byte	0x684c
+	.8byte	.LVL98
+	.4byte	0x684e
 	.byte	0
 	.uleb128 0x46
 	.4byte	.LASF1476
 	.byte	0x1
-	.2byte	0x3a8
+	.2byte	0x3ac
 	.4byte	0xbb
 	.8byte	.LFB1553
 	.8byte	.LFE1553-.LFB1553
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x648f
+	.4byte	0x6491
 	.uleb128 0x49
 	.4byte	.LASF1478
 	.byte	0x1
-	.2byte	0x3a8
-	.4byte	0x648f
+	.2byte	0x3ac
+	.4byte	0x6491
 	.4byte	.LLST10
 	.uleb128 0x49
 	.4byte	.LASF1479
 	.byte	0x1
-	.2byte	0x3a8
+	.2byte	0x3ac
 	.4byte	0x5fdb
 	.4byte	.LLST11
 	.uleb128 0x49
 	.4byte	.LASF1480
 	.byte	0x1
-	.2byte	0x3a8
+	.2byte	0x3ac
 	.4byte	0xbb
 	.4byte	.LLST12
 	.uleb128 0x47
 	.4byte	.LASF1481
 	.byte	0x1
-	.2byte	0x3aa
+	.2byte	0x3ae
 	.4byte	0x5fdb
 	.uleb128 0x9
 	.byte	0x3
@@ -13512,7 +13551,7 @@ spi_id_buffer.16947:
 	.uleb128 0x47
 	.4byte	.LASF1482
 	.byte	0x1
-	.2byte	0x3ab
+	.2byte	0x3af
 	.4byte	0xbb
 	.uleb128 0x9
 	.byte	0x3
@@ -13520,130 +13559,129 @@ spi_id_buffer.16947:
 	.uleb128 0x4a
 	.4byte	.LASF1483
 	.byte	0x1
-	.2byte	0x3ac
+	.2byte	0x3b0
 	.4byte	0xbb
 	.uleb128 0x48
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x3ad
+	.2byte	0x3b1
 	.4byte	0xbb
 	.uleb128 0x4c
-	.4byte	0x6658
+	.4byte	0x665a
 	.8byte	.LBB22
 	.4byte	.Ldebug_ranges0+0x60
 	.byte	0x1
-	.2byte	0x3bd
-	.4byte	0x63af
+	.2byte	0x3c1
+	.4byte	0x63ad
 	.uleb128 0x4d
-	.4byte	0x6669
+	.4byte	0x666b
 	.uleb128 0x4e
 	.4byte	.Ldebug_ranges0+0x60
 	.uleb128 0x4f
-	.4byte	0x6675
+	.4byte	0x6677
 	.uleb128 0x50
-	.4byte	0x6681
+	.4byte	0x6683
 	.4byte	.LLST13
 	.uleb128 0x50
-	.4byte	0x668d
+	.4byte	0x668f
 	.4byte	.LLST14
-	.uleb128 0x51
-	.4byte	0x6699
-	.uleb128 0x1
-	.byte	0x63
+	.uleb128 0x4f
+	.4byte	0x669b
 	.byte	0
 	.byte	0
 	.uleb128 0x4c
-	.4byte	0x6495
-	.8byte	.LBB27
-	.4byte	.Ldebug_ranges0+0xa0
+	.4byte	0x6497
+	.8byte	.LBB28
+	.4byte	.Ldebug_ranges0+0xb0
 	.byte	0x1
-	.2byte	0x3ce
-	.4byte	0x6481
+	.2byte	0x3d2
+	.4byte	0x6483
 	.uleb128 0x4d
-	.4byte	0x64a6
+	.4byte	0x64a8
 	.uleb128 0x4d
-	.4byte	0x64be
+	.4byte	0x64c0
 	.uleb128 0x4d
-	.4byte	0x64b2
+	.4byte	0x64b4
 	.uleb128 0x4e
-	.4byte	.Ldebug_ranges0+0xa0
+	.4byte	.Ldebug_ranges0+0xb0
 	.uleb128 0x4f
-	.4byte	0x64ca
+	.4byte	0x64cc
 	.uleb128 0x50
-	.4byte	0x64d6
+	.4byte	0x64d8
 	.4byte	.LLST15
 	.uleb128 0x50
-	.4byte	0x64e2
+	.4byte	0x64e4
 	.4byte	.LLST16
 	.uleb128 0x50
-	.4byte	0x64ec
+	.4byte	0x64ee
 	.4byte	.LLST17
 	.uleb128 0x50
-	.4byte	0x64f6
+	.4byte	0x64f8
 	.4byte	.LLST18
+	.uleb128 0x50
+	.4byte	0x6504
+	.4byte	.LLST19
+	.uleb128 0x51
+	.4byte	.Ldebug_ranges0+0x110
+	.4byte	0x6433
 	.uleb128 0x4f
-	.4byte	0x6502
-	.uleb128 0x52
-	.4byte	.Ldebug_ranges0+0xe0
-	.4byte	0x6431
-	.uleb128 0x4f
-	.4byte	0x650f
+	.4byte	0x6511
 	.uleb128 0x4f
-	.4byte	0x651b
+	.4byte	0x651d
 	.uleb128 0x4f
-	.4byte	0x6527
+	.4byte	0x6529
 	.uleb128 0x4f
-	.4byte	0x6533
+	.4byte	0x6535
 	.uleb128 0x4f
-	.4byte	0x653f
+	.4byte	0x6541
 	.uleb128 0x4f
-	.4byte	0x654b
+	.4byte	0x654d
 	.byte	0
 	.uleb128 0x4b
 	.8byte	.LVL64
-	.4byte	0x66a4
+	.4byte	0x66a6
 	.uleb128 0x4b
 	.8byte	.LVL65
-	.4byte	0x6559
+	.4byte	0x655b
 	.uleb128 0x4b
-	.8byte	.LVL76
-	.4byte	0x66a4
+	.8byte	.LVL81
+	.4byte	0x684e
 	.uleb128 0x4b
-	.8byte	.LVL77
-	.4byte	0x6559
+	.8byte	.LVL84
+	.4byte	0x66a6
 	.uleb128 0x4b
-	.8byte	.LVL78
-	.4byte	0x684c
+	.8byte	.LVL85
+	.4byte	0x655b
 	.uleb128 0x4b
-	.8byte	.LVL81
-	.4byte	0x684c
+	.8byte	.LVL87
+	.4byte	0x684e
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL83
-	.4byte	0x684c
+	.8byte	.LVL91
+	.4byte	0x684e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x6081
-	.uleb128 0x53
+	.uleb128 0x52
 	.4byte	.LASF1499
 	.byte	0x1
 	.2byte	0x37f
 	.4byte	0xbb
 	.byte	0x1
-	.4byte	0x6559
-	.uleb128 0x54
+	.4byte	0x655b
+	.uleb128 0x53
 	.4byte	.LASF1478
 	.byte	0x1
 	.2byte	0x37f
-	.4byte	0x648f
-	.uleb128 0x54
+	.4byte	0x6491
+	.uleb128 0x53
 	.4byte	.LASF1483
 	.byte	0x1
 	.2byte	0x37f
 	.4byte	0xbb
-	.uleb128 0x54
+	.uleb128 0x53
 	.4byte	.LASF150
 	.byte	0x1
 	.2byte	0x37f
@@ -13678,7 +13716,7 @@ spi_id_buffer.16947:
 	.byte	0x1
 	.2byte	0x384
 	.4byte	0xbb
-	.uleb128 0x55
+	.uleb128 0x54
 	.uleb128 0x4a
 	.4byte	.LASF1487
 	.byte	0x1
@@ -13711,7 +13749,7 @@ spi_id_buffer.16947:
 	.4byte	0x10a
 	.byte	0
 	.byte	0
-	.uleb128 0x56
+	.uleb128 0x55
 	.4byte	.LASF1502
 	.byte	0x1
 	.2byte	0x1c1
@@ -13720,7 +13758,7 @@ spi_id_buffer.16947:
 	.8byte	.LFE1551-.LFB1551
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x663d
+	.4byte	0x663f
 	.uleb128 0x49
 	.4byte	.LASF824
 	.byte	0x1
@@ -13733,11 +13771,11 @@ spi_id_buffer.16947:
 	.2byte	0x1c1
 	.4byte	0xbb
 	.4byte	.LLST8
-	.uleb128 0x57
+	.uleb128 0x56
 	.4byte	.LASF1471
 	.byte	0x1
 	.2byte	0x1c3
-	.4byte	0x663d
+	.4byte	0x663f
 	.4byte	.LLST9
 	.uleb128 0x4a
 	.4byte	.LASF1493
@@ -13771,45 +13809,45 @@ spi_id_buffer.16947:
 	.byte	0x1
 	.2byte	0x1c6
 	.4byte	0xbb
-	.uleb128 0x58
+	.uleb128 0x57
 	.4byte	.LASF1498
-	.4byte	0x6653
+	.4byte	0x6655
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	__func__.16872
 	.uleb128 0x4b
 	.8byte	.LVL48
-	.4byte	0x679b
+	.4byte	0x679d
 	.uleb128 0x4b
 	.8byte	.LVL50
-	.4byte	0x679b
+	.4byte	0x679d
 	.uleb128 0x4b
 	.8byte	.LVL53
-	.4byte	0x684c
+	.4byte	0x684e
 	.uleb128 0x4b
 	.8byte	.LVL57
-	.4byte	0x684c
+	.4byte	0x684e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x90
 	.uleb128 0x5
 	.4byte	0x67
-	.4byte	0x6653
+	.4byte	0x6655
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0xe
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x6643
-	.uleb128 0x53
+	.4byte	0x6645
+	.uleb128 0x52
 	.4byte	.LASF1500
 	.byte	0x1
 	.2byte	0x1ad
 	.4byte	0xbb
 	.byte	0x1
-	.4byte	0x66a4
-	.uleb128 0x54
+	.4byte	0x66a6
+	.uleb128 0x53
 	.4byte	.LASF1480
 	.byte	0x1
 	.2byte	0x1ad
@@ -13818,7 +13856,7 @@ spi_id_buffer.16947:
 	.4byte	.LASF1471
 	.byte	0x1
 	.2byte	0x1af
-	.4byte	0x663d
+	.4byte	0x663f
 	.uleb128 0x4a
 	.4byte	.LASF1501
 	.byte	0x1
@@ -13835,7 +13873,7 @@ spi_id_buffer.16947:
 	.2byte	0x1b2
 	.4byte	0xbb
 	.byte	0
-	.uleb128 0x56
+	.uleb128 0x55
 	.4byte	.LASF1503
 	.byte	0x1
 	.2byte	0x17e
@@ -13844,14 +13882,14 @@ spi_id_buffer.16947:
 	.8byte	.LFE1549-.LFB1549
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6751
+	.4byte	0x6753
 	.uleb128 0x49
 	.4byte	.LASF1479
 	.byte	0x1
 	.2byte	0x17e
 	.4byte	0x5fdb
 	.4byte	.LLST0
-	.uleb128 0x57
+	.uleb128 0x56
 	.4byte	.LASF1471
 	.byte	0x1
 	.2byte	0x180
@@ -13861,50 +13899,50 @@ spi_id_buffer.16947:
 	.4byte	.LASF1504
 	.byte	0x1
 	.2byte	0x181
-	.4byte	0x6751
+	.4byte	0x6753
 	.uleb128 0x4a
 	.4byte	.LASF824
 	.byte	0x1
 	.2byte	0x182
 	.4byte	0xbb
 	.uleb128 0x4c
-	.4byte	0x6757
+	.4byte	0x6759
 	.8byte	.LBB7
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
 	.2byte	0x184
-	.4byte	0x6743
+	.4byte	0x6745
 	.uleb128 0x4d
-	.4byte	0x6768
+	.4byte	0x676a
 	.uleb128 0x4d
-	.4byte	0x6768
+	.4byte	0x676a
 	.uleb128 0x4e
 	.4byte	.Ldebug_ranges0+0
-	.uleb128 0x51
-	.4byte	0x6774
+	.uleb128 0x58
+	.4byte	0x6776
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	pvi_modes.16823
 	.uleb128 0x4b
 	.8byte	.LVL18
-	.4byte	0x684c
+	.4byte	0x684e
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
 	.8byte	.LVL7
-	.4byte	0x684c
+	.4byte	0x684e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc2
-	.uleb128 0x53
+	.uleb128 0x52
 	.4byte	.LASF1505
 	.byte	0x1
 	.2byte	0x118
-	.4byte	0x6751
+	.4byte	0x6753
 	.byte	0x1
-	.4byte	0x678b
-	.uleb128 0x54
+	.4byte	0x678d
+	.uleb128 0x53
 	.4byte	.LASF1471
 	.byte	0x1
 	.2byte	0x118
@@ -13913,14 +13951,14 @@ spi_id_buffer.16947:
 	.4byte	.LASF1504
 	.byte	0x1
 	.2byte	0x11a
-	.4byte	0x678b
+	.4byte	0x678d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	pvi_modes.16823
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xbb
-	.4byte	0x679b
+	.4byte	0x679d
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x8
@@ -13934,12 +13972,12 @@ spi_id_buffer.16947:
 	.8byte	.LFE1547-.LFB1547
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x684c
+	.4byte	0x684e
 	.uleb128 0x5a
 	.4byte	.LASF741
 	.byte	0x1
 	.byte	0x3f
-	.4byte	0x663d
+	.4byte	0x663f
 	.4byte	.LLST2
 	.uleb128 0x5a
 	.4byte	.LASF1507
@@ -13987,10 +14025,10 @@ spi_id_buffer.16947:
 	.4byte	.LLST6
 	.uleb128 0x4b
 	.8byte	.LVL27
-	.4byte	0x684c
+	.4byte	0x684e
 	.uleb128 0x4b
 	.8byte	.LVL43
-	.4byte	0x684c
+	.4byte	0x684e
 	.byte	0
 	.uleb128 0x5e
 	.4byte	.LASF1517
@@ -15011,15 +15049,6 @@ spi_id_buffer.16947:
 	.byte	0
 	.byte	0
 	.uleb128 0x51
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x31
-	.uleb128 0x13
-	.uleb128 0x2
-	.uleb128 0x18
-	.byte	0
-	.byte	0
-	.uleb128 0x52
 	.uleb128 0xb
 	.byte	0x1
 	.uleb128 0x55
@@ -15028,7 +15057,7 @@ spi_id_buffer.16947:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x53
+	.uleb128 0x52
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -15047,7 +15076,7 @@ spi_id_buffer.16947:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x54
+	.uleb128 0x53
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -15060,12 +15089,12 @@ spi_id_buffer.16947:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x55
+	.uleb128 0x54
 	.uleb128 0xb
 	.byte	0x1
 	.byte	0
 	.byte	0
-	.uleb128 0x56
+	.uleb128 0x55
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -15090,7 +15119,7 @@ spi_id_buffer.16947:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x57
+	.uleb128 0x56
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -15105,7 +15134,7 @@ spi_id_buffer.16947:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x58
+	.uleb128 0x57
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -15118,6 +15147,15 @@ spi_id_buffer.16947:
 	.uleb128 0x18
 	.byte	0
 	.byte	0
+	.uleb128 0x58
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
 	.uleb128 0x59
 	.uleb128 0x2e
 	.byte	0x1
@@ -15221,20 +15259,20 @@ spi_id_buffer.16947:
 	.byte	0
 	.section	.debug_loc,"",@progbits
 .Ldebug_loc0:
-.LLST19:
-	.8byte	.LVL86-.Ltext0
-	.8byte	.LVL87-.Ltext0
+.LLST20:
+	.8byte	.LVL92-.Ltext0
+	.8byte	.LVL93-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL87-.Ltext0
-	.8byte	.LVL88-.Ltext0
+	.8byte	.LVL93-.Ltext0
+	.8byte	.LVL94-.Ltext0
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL89-.Ltext0
-	.8byte	.LVL90-.Ltext0
+	.8byte	.LVL95-.Ltext0
+	.8byte	.LVL96-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL90-.Ltext0
+	.8byte	.LVL96-.Ltext0
 	.8byte	.LFE1554-.Ltext0
 	.2byte	0x1
 	.byte	0x64
@@ -15246,25 +15284,25 @@ spi_id_buffer.16947:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL61-.Ltext0
-	.8byte	.LVL70-.Ltext0
+	.8byte	.LVL71-.Ltext0
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL70-.Ltext0
+	.byte	0x64
 	.8byte	.LVL71-.Ltext0
+	.8byte	.LVL72-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL71-.Ltext0
+	.8byte	.LVL72-.Ltext0
 	.8byte	.LVL73-.Ltext0
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL74-.Ltext0
-	.8byte	.LVL84-.Ltext0
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL84-.Ltext0
-	.8byte	.LVL85-.Ltext0
+	.byte	0x64
+	.8byte	.LVL75-.Ltext0
+	.8byte	.LVL78-.Ltext0
 	.2byte	0x1
 	.byte	0x50
+	.8byte	.LVL79-.Ltext0
+	.8byte	.LFE1553-.Ltext0
+	.2byte	0x1
+	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST11:
@@ -15273,21 +15311,25 @@ spi_id_buffer.16947:
 	.2byte	0x1
 	.byte	0x51
 	.8byte	.LVL63-.Ltext0
-	.8byte	.LVL70-.Ltext0
+	.8byte	.LVL71-.Ltext0
 	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL70-.Ltext0
-	.8byte	.LVL74-.Ltext0
+	.byte	0x63
+	.8byte	.LVL71-.Ltext0
+	.8byte	.LVL72-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL74-.Ltext0
-	.8byte	.LVL84-.Ltext0
+	.8byte	.LVL72-.Ltext0
+	.8byte	.LVL73-.Ltext0
 	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL84-.Ltext0
-	.8byte	.LFE1553-.Ltext0
+	.byte	0x63
+	.8byte	.LVL73-.Ltext0
+	.8byte	.LVL79-.Ltext0
 	.2byte	0x1
 	.byte	0x51
+	.8byte	.LVL79-.Ltext0
+	.8byte	.LFE1553-.Ltext0
+	.2byte	0x1
+	.byte	0x63
 	.8byte	0
 	.8byte	0
 .LLST12:
@@ -15295,12 +15337,8 @@ spi_id_buffer.16947:
 	.8byte	.LVL62-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL69-.Ltext0
-	.8byte	.LVL74-.Ltext0
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL84-.Ltext0
-	.8byte	.LFE1553-.Ltext0
+	.8byte	.LVL70-.Ltext0
+	.8byte	.LVL79-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
@@ -15310,42 +15348,46 @@ spi_id_buffer.16947:
 	.8byte	.LVL64-1-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL82-.Ltext0
-	.8byte	.LVL83-1-.Ltext0
+	.8byte	.LVL75-.Ltext0
+	.8byte	.LVL77-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL90-.Ltext0
+	.8byte	.LVL91-1-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST14:
 	.8byte	.LVL60-.Ltext0
-	.8byte	.LVL70-.Ltext0
+	.8byte	.LVL67-.Ltext0
 	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL71-.Ltext0
+	.byte	0x65
 	.8byte	.LVL72-.Ltext0
-	.2byte	0x1
-	.byte	0x63
 	.8byte	.LVL74-.Ltext0
-	.8byte	.LVL84-.Ltext0
 	.2byte	0x1
-	.byte	0x63
+	.byte	0x65
+	.8byte	.LVL76-.Ltext0
+	.8byte	.LVL77-.Ltext0
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL79-.Ltext0
+	.8byte	.LVL86-.Ltext0
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL90-.Ltext0
+	.8byte	.LFE1553-.Ltext0
+	.2byte	0x1
+	.byte	0x65
 	.8byte	0
 	.8byte	0
 .LLST15:
 	.8byte	.LVL66-.Ltext0
-	.8byte	.LVL70-.Ltext0
-	.2byte	0x1
-	.byte	0x66
 	.8byte	.LVL71-.Ltext0
-	.8byte	.LVL73-.Ltext0
 	.2byte	0x1
 	.byte	0x66
+	.8byte	.LVL72-.Ltext0
 	.8byte	.LVL74-.Ltext0
-	.8byte	.LVL75-.Ltext0
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL75-.Ltext0
-	.8byte	.LVL79-.Ltext0
 	.2byte	0x1
 	.byte	0x66
 	.8byte	.LVL79-.Ltext0
@@ -15356,39 +15398,74 @@ spi_id_buffer.16947:
 	.8byte	.LVL82-.Ltext0
 	.2byte	0x1
 	.byte	0x66
+	.8byte	.LVL82-.Ltext0
+	.8byte	.LVL83-.Ltext0
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL83-.Ltext0
+	.8byte	.LVL90-.Ltext0
+	.2byte	0x1
+	.byte	0x66
 	.8byte	0
 	.8byte	0
 .LLST16:
-	.8byte	.LVL68-.Ltext0
-	.8byte	.LVL70-.Ltext0
+	.8byte	.LVL69-.Ltext0
+	.8byte	.LVL71-.Ltext0
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL71-.Ltext0
-	.8byte	.LVL74-.Ltext0
+	.8byte	.LVL72-.Ltext0
+	.8byte	.LVL75-.Ltext0
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL88-.Ltext0
+	.8byte	.LVL90-.Ltext0
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
 .LLST17:
-	.8byte	.LVL68-.Ltext0
-	.8byte	.LVL70-.Ltext0
+	.8byte	.LVL69-.Ltext0
+	.8byte	.LVL71-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL71-.Ltext0
-	.8byte	.LVL74-.Ltext0
+	.8byte	.LVL72-.Ltext0
+	.8byte	.LVL75-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL88-.Ltext0
+	.8byte	.LVL90-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST18:
-	.8byte	.LVL67-.Ltext0
-	.8byte	.LVL70-.Ltext0
+	.8byte	.LVL68-.Ltext0
+	.8byte	.LVL71-.Ltext0
 	.2byte	0x1
 	.byte	0x5b
+	.8byte	.LVL72-.Ltext0
+	.8byte	.LVL75-.Ltext0
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL88-.Ltext0
+	.8byte	.LVL90-.Ltext0
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	0
+	.8byte	0
+.LLST19:
+	.8byte	.LVL67-.Ltext0
 	.8byte	.LVL71-.Ltext0
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL72-.Ltext0
 	.8byte	.LVL74-.Ltext0
 	.2byte	0x1
-	.byte	0x5b
+	.byte	0x65
+	.8byte	.LVL86-.Ltext0
+	.8byte	.LVL89-.Ltext0
+	.2byte	0x1
+	.byte	0x65
 	.8byte	0
 	.8byte	0
 .LLST7:
@@ -15597,24 +15674,30 @@ spi_id_buffer.16947:
 	.8byte	0
 	.8byte	.LBB22-.Ltext0
 	.8byte	.LBE22-.Ltext0
-	.8byte	.LBB26-.Ltext0
-	.8byte	.LBE26-.Ltext0
-	.8byte	.LBB33-.Ltext0
-	.8byte	.LBE33-.Ltext0
-	.8byte	0
-	.8byte	0
 	.8byte	.LBB27-.Ltext0
 	.8byte	.LBE27-.Ltext0
-	.8byte	.LBB34-.Ltext0
-	.8byte	.LBE34-.Ltext0
-	.8byte	.LBB35-.Ltext0
-	.8byte	.LBE35-.Ltext0
+	.8byte	.LBB36-.Ltext0
+	.8byte	.LBE36-.Ltext0
+	.8byte	.LBB38-.Ltext0
+	.8byte	.LBE38-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB28-.Ltext0
+	.8byte	.LBE28-.Ltext0
+	.8byte	.LBB37-.Ltext0
+	.8byte	.LBE37-.Ltext0
+	.8byte	.LBB39-.Ltext0
+	.8byte	.LBE39-.Ltext0
+	.8byte	.LBB40-.Ltext0
+	.8byte	.LBE40-.Ltext0
+	.8byte	.LBB41-.Ltext0
+	.8byte	.LBE41-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB29-.Ltext0
-	.8byte	.LBE29-.Ltext0
 	.8byte	.LBB30-.Ltext0
 	.8byte	.LBE30-.Ltext0
+	.8byte	.LBB31-.Ltext0
+	.8byte	.LBE31-.Ltext0
 	.8byte	0
 	.8byte	0
 	.section	.debug_line,"",@progbits

commit 9310dee775c714f9ac12ceda2e22e25f2152d770
Author: Yu Qiaowei <cerf.yu@rock-chips.com>
Date:   Wed Jul 14 15:03:56 2021 +0800

    video/rockchip: rga2: Add format support
    
    Add BGR565/BGRA5551/BGRA4444.
    
    Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
    Change-Id: I248c739d96afa2ec65a7092c7b584fb4730fb0f3

diff --git a/drivers/video/rockchip/rga2/rga2_drv.c b/drivers/video/rockchip/rga2/rga2_drv.c
index 30c2f22b3d54..f1cbf578eebf 100644
--- a/drivers/video/rockchip/rga2/rga2_drv.c
+++ b/drivers/video/rockchip/rga2/rga2_drv.c
@@ -130,6 +130,7 @@ static void rga2_try_set_reg(void);
 static const char *rga2_get_cmd_mode_str(u32 cmd)
 {
 	switch (cmd) {
+	/* RGA1 */
 	case RGA_BLIT_SYNC:
 		return "RGA_BLIT_SYNC";
 	case RGA_BLIT_ASYNC:
@@ -140,6 +141,17 @@ static const char *rga2_get_cmd_mode_str(u32 cmd)
 		return "RGA_GET_RESULT";
 	case RGA_GET_VERSION:
 		return "RGA_GET_VERSION";
+	/* RGA2 */
+	case RGA2_BLIT_SYNC:
+		return "RGA2_BLIT_SYNC";
+	case RGA2_BLIT_ASYNC:
+		return "RGA2_BLIT_ASYNC";
+	case RGA2_FLUSH:
+		return "RGA2_FLUSH";
+	case RGA2_GET_RESULT:
+		return "RGA2_GET_RESULT";
+	case RGA2_GET_VERSION:
+		return "RGA2_GET_VERSION";
 	default:
 		return "UNF";
 	}
diff --git a/drivers/video/rockchip/rga2/rga2_mmu_info.c b/drivers/video/rockchip/rga2/rga2_mmu_info.c
index 1f1a8e9b9836..24c777f521c1 100644
--- a/drivers/video/rockchip/rga2/rga2_mmu_info.c
+++ b/drivers/video/rockchip/rga2/rga2_mmu_info.c
@@ -181,14 +181,9 @@ static int rga2_buf_size_cal(unsigned long yrgb_addr, unsigned long uv_addr, uns
     switch(format)
     {
         case RGA2_FORMAT_RGBA_8888 :
-            stride = (w * 4 + 3) & (~3);
-            size_yrgb = stride*h;
-            start = yrgb_addr >> PAGE_SHIFT;
-	    end = yrgb_addr + size_yrgb;
-	    end = (end + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
-	    pageCount = end - start;
-            break;
         case RGA2_FORMAT_RGBX_8888 :
+        case RGA2_FORMAT_BGRA_8888 :
+        case RGA2_FORMAT_BGRX_8888 :
             stride = (w * 4 + 3) & (~3);
             size_yrgb = stride*h;
             start = yrgb_addr >> PAGE_SHIFT;
@@ -197,6 +192,7 @@ static int rga2_buf_size_cal(unsigned long yrgb_addr, unsigned long uv_addr, uns
 	    pageCount = end - start;
             break;
         case RGA2_FORMAT_RGB_888 :
+        case RGA2_FORMAT_BGR_888 :
             stride = (w * 3 + 3) & (~3);
             size_yrgb = stride*h;
             start = yrgb_addr >> PAGE_SHIFT;
@@ -204,32 +200,12 @@ static int rga2_buf_size_cal(unsigned long yrgb_addr, unsigned long uv_addr, uns
 	    end = (end + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
 	    pageCount = end - start;
             break;
-        case RGA2_FORMAT_BGRA_8888 :
-	case RGA2_FORMAT_BGRX_8888 :
-            stride = (w * 4 + 3) & (~3);
-            size_yrgb = stride * h;
-            start = yrgb_addr >> PAGE_SHIFT;
-	    end = yrgb_addr + size_yrgb;
-	    end = (end + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
-	    pageCount = end - start;
-            break;
         case RGA2_FORMAT_RGB_565 :
-            stride = (w*2 + 3) & (~3);
-            size_yrgb = stride * h;
-            start = yrgb_addr >> PAGE_SHIFT;
-	    end = yrgb_addr + size_yrgb;
-	    end = (end + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
-	    pageCount = end - start;
-            break;
         case RGA2_FORMAT_RGBA_5551 :
-            stride = (w*2 + 3) & (~3);
-            size_yrgb = stride * h;
-            start = yrgb_addr >> PAGE_SHIFT;
-	    end = yrgb_addr + size_yrgb;
-	    end = (end + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
-	    pageCount = end - start;
-            break;
         case RGA2_FORMAT_RGBA_4444 :
+        case RGA2_FORMAT_BGR_565 :
+        case RGA2_FORMAT_BGRA_5551 :
+        case RGA2_FORMAT_BGRA_4444 :
             stride = (w*2 + 3) & (~3);
             size_yrgb = stride * h;
             start = yrgb_addr >> PAGE_SHIFT;
@@ -237,14 +213,6 @@ static int rga2_buf_size_cal(unsigned long yrgb_addr, unsigned long uv_addr, uns
 	    end = (end + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
 	    pageCount = end - start;
             break;
-        case RGA2_FORMAT_BGR_888 :
-            stride = (w*3 + 3) & (~3);
-            size_yrgb = stride * h;
-            start = yrgb_addr >> PAGE_SHIFT;
-	    end = yrgb_addr + size_yrgb;
-	    end = (end + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
-	    pageCount = end - start;
-            break;
 
         /* YUV FORMAT */
         case RGA2_FORMAT_YCbCr_422_SP :
diff --git a/drivers/video/rockchip/rga2/rga2_reg_info.c b/drivers/video/rockchip/rga2/rga2_reg_info.c
index 697cfab2e3fe..244b2e4c9967 100644
--- a/drivers/video/rockchip/rga2/rga2_reg_info.c
+++ b/drivers/video/rockchip/rga2/rga2_reg_info.c
@@ -1137,6 +1137,10 @@ static void format_name_convert(uint32_t *df, uint32_t sf)
         case 0x21:*df = RGA2_FORMAT_YCrCb_420_SP_10B; break;
         case 0x22:*df = RGA2_FORMAT_YCbCr_422_SP_10B; break;
         case 0x23:*df = RGA2_FORMAT_YCrCb_422_SP_10B; break;
+
+	case 0x24:*df = RGA2_FORMAT_BGR_565; break;
+	case 0x25:*df = RGA2_FORMAT_BGRA_5551; break;
+	case 0x26:*df = RGA2_FORMAT_BGRA_4444; break;
     }
 }
 

commit 97e31ffa5dcbcb11c8d21b57e0709fcdc48aa450
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Wed Jun 23 15:06:11 2021 +0800

    drm/rockchip: vop2: Disable all other multi area when disable area0
    
    When area0 is disabled, all other sub multi area must be
    disabled, or the win may run into unexpected situlation:
    such as post_buf_empty or iommu fault.
    
    Change-Id: I8a92e45849cfc31af029ba0e86562751be92ddbd
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
index e5ee271c0ca8..456027acb831 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
@@ -48,6 +48,7 @@
  * This is a feather on rk3566
  */
 #define WIN_FEATURE_MIRROR		BIT(6)
+#define WIN_FEATURE_MULTI_AREA		BIT(7)
 
 
 #define VOP2_SOC_VARIANT		4
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 9c6649813784..95e4628174e2 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -1101,6 +1101,19 @@ static inline void vop2_wb_cfg_done(struct vop2_video_port *vp)
 
 }
 
+static void vop2_win_multi_area_disable(struct vop2_win *parent)
+{
+	struct vop2 *vop2 = parent->vop2;
+	struct vop2_win *area;
+	int i;
+
+	for (i = 0; i < vop2->registered_num_wins; i++) {
+		area = &vop2->win[i];
+		if (area->parent == parent)
+			VOP_WIN_SET(vop2, area, enable, 0);
+	}
+}
+
 static void vop2_win_disable(struct vop2_win *win)
 {
 	struct vop2 *vop2 = win->vop2;
@@ -1120,6 +1133,12 @@ static void vop2_win_disable(struct vop2_win *win)
 
 		VOP_CLUSTER_SET(vop2, win, enable, 0);
 	}
+
+	/*
+	 * disable all other multi area win if we want disable area0 here
+	 */
+	if (!win->parent && (win->feature & WIN_FEATURE_MULTI_AREA))
+		vop2_win_multi_area_disable(win);
 }
 
 static inline void vop2_write_lut(struct vop2 *vop2, uint32_t offset, uint32_t v)
diff --git a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
index 2fea21461d68..c0ef4b43b5d3 100644
--- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
+++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
@@ -1021,6 +1021,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
 	  .max_upscale_factor = 8,
 	  .max_downscale_factor = 8,
 	  .dly = { 20, 47, 41 },
+	  .feature = WIN_FEATURE_MULTI_AREA,
 	},
 
 	{
@@ -1043,7 +1044,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
 	  .max_upscale_factor = 8,
 	  .max_downscale_factor = 8,
 	  .dly = { 20, 47, 41 },
-	  .feature = WIN_FEATURE_MIRROR,
+	  .feature = WIN_FEATURE_MIRROR | WIN_FEATURE_MULTI_AREA,
 	},
 
 	{
@@ -1066,7 +1067,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
 	  .max_upscale_factor = 8,
 	  .max_downscale_factor = 8,
 	  .dly = { 20, 47, 41 },
-	  .feature = WIN_FEATURE_MIRROR,
+	  .feature = WIN_FEATURE_MIRROR | WIN_FEATURE_MULTI_AREA,
 	},
 
 	{
@@ -1089,6 +1090,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
 	  .max_upscale_factor = 8,
 	  .max_downscale_factor = 8,
 	  .dly = { 20, 47, 41 },
+	  .feature = WIN_FEATURE_MULTI_AREA,
 	},
 
 	{

commit 2c9cf24286e893496c20649c35e35110dd77bf88
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Tue Jul 13 16:58:39 2021 +0800

    drm/rockchip: vop2: fix hdr delay number setting when port_mux is not at last
    
    HDR window is fixed(not move in the overlay path with port_mux change)
    and is the most slow window. And the bg is the fast. So other windows
    and bg need to add delay number to keep align with the most slow window.
    The delay number list in the trm is a relative value for port_mux set at
    last level.
    
    Change-Id: I731b909c0a3f483be081e16610536b4ce5b9b8b0
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index e4cadf0a5277..9c6649813784 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -4960,6 +4960,13 @@ static void vop2_setup_layer_mixer_for_vp(struct vop2_video_port *vp,
 	vop2_setup_port_mux(vp, port_mux_cfg);
 }
 
+/*
+ * HDR window is fixed(not move in the overlay path with port_mux change)
+ * and is the most slow window. And the bg is the fast. So other windows
+ * and bg need to add delay number to keep align with the most slow window.
+ * The delay number list in the trm is a relative value for port_mux set at
+ * last level.
+ */
 static void vop2_setup_dly_for_vp(struct vop2_video_port *vp)
 {
 	struct vop2 *vop2 = vp->vop2;
@@ -4984,7 +4991,8 @@ static void vop2_setup_dly_for_vp(struct vop2_video_port *vp)
 		}
 	}
 
-	bg_dly -= vp->bg_ovl_dly;
+	if (!vp->hdr_in)
+		bg_dly -= vp->bg_ovl_dly;
 
 	pre_scan_dly = bg_dly + (hdisplay >> 1) - 1;
 	pre_scan_dly = (pre_scan_dly << 16) | hsync_len;
@@ -5007,12 +5015,15 @@ static void vop2_setup_dly_for_window(struct vop2_video_port *vp, const struct v
 		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_in && !vp->hdr_out && !vpstate->hdr_in)
+		if (vp->hdr_in && !vp->hdr_out && !vpstate->hdr_in) {
 			dly = win->dly[VOP2_DLY_MODE_HISO_S];
-		else if (vp->hdr_in && vp->hdr_out && vpstate->hdr_in)
+			dly += vp->bg_ovl_dly;
+		} else if (vp->hdr_in && vp->hdr_out && vpstate->hdr_in) {
 			dly = win->dly[VOP2_DLY_MODE_HIHO_H];
-		else
+			dly -= vp->bg_ovl_dly;
+		} else {
 			dly = win->dly[VOP2_DLY_MODE_DEFAULT];
+		}
 		if (vop2_cluster_window(win))
 			dly |= dly << 8;
 

commit 939c0d8b5b6e4373162d5fa9d97054c8c60ee7bc
Author: Wyon Bi <bivvy.bi@rock-chips.com>
Date:   Mon Aug 28 09:33:59 2017 +0800

    drm/bridge: analogix_dp: Add HBR2 support for RK3399
    
    Change-Id: I3999e4fa0b83ede5719f341d1e9a9a8797c7576b
    Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>

diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index c126b60246c0..866bd9ba2fb9 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -509,11 +509,25 @@ static void analogix_dp_get_adjust_training_lane(struct analogix_dp_device *dp,
 	}
 }
 
+static bool analogix_dp_tps3_supported(struct analogix_dp_device *dp)
+{
+	bool source_tps3_supported, sink_tps3_supported;
+	u8 dpcd = 0;
+
+	source_tps3_supported =
+		dp->video_info.max_link_rate == DP_LINK_BW_5_4;
+	drm_dp_dpcd_readb(&dp->aux, DP_MAX_LANE_COUNT, &dpcd);
+	sink_tps3_supported = dpcd & DP_TPS3_SUPPORTED;
+
+	return source_tps3_supported && sink_tps3_supported;
+}
+
 static int analogix_dp_process_clock_recovery(struct analogix_dp_device *dp)
 {
 	int lane, lane_count, retval;
 	u8 voltage_swing, pre_emphasis, training_lane;
 	u8 link_status[2], adjust_request[2];
+	u8 training_pattern = TRAINING_PTN2;
 
 	usleep_range(100, 101);
 
@@ -529,12 +543,16 @@ static int analogix_dp_process_clock_recovery(struct analogix_dp_device *dp)
 		return retval;
 
 	if (analogix_dp_clock_recovery_ok(link_status, lane_count) == 0) {
-		/* set training pattern 2 for EQ */
-		analogix_dp_set_training_pattern(dp, TRAINING_PTN2);
+		if (analogix_dp_tps3_supported(dp))
+			training_pattern = TRAINING_PTN3;
+
+		/* set training pattern for EQ */
+		analogix_dp_set_training_pattern(dp, training_pattern);
 
 		retval = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
 					    DP_LINK_SCRAMBLING_DISABLE |
-						DP_TRAINING_PATTERN_2);
+					    (training_pattern == TRAINING_PTN3 ?
+					     DP_TRAINING_PATTERN_3 : DP_TRAINING_PATTERN_2));
 		if (retval < 0)
 			return retval;
 
@@ -1496,11 +1514,14 @@ static int analogix_dp_dt_parse_pdata(struct analogix_dp_device *dp)
 	switch (dp->plat_data->dev_type) {
 	case RK3288_DP:
 	case RK3368_EDP:
-	case RK3399_EDP:
 	case RK3568_EDP:
 		video_info->max_link_rate = 0x0A;
 		video_info->max_lane_count = 0x04;
 		break;
+	case RK3399_EDP:
+		video_info->max_link_rate = 0x14;
+		video_info->max_lane_count = 0x04;
+		break;
 	case EXYNOS_DP:
 		/*
 		 * NOTE: those property parseing code is used for
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
index b51ab445f0cc..67d6ad1c8447 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
@@ -73,6 +73,7 @@ enum pattern_set {
 	D10_2,
 	TRAINING_PTN1,
 	TRAINING_PTN2,
+	TRAINING_PTN3,
 	DP_NONE
 };
 
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
index d5038fcd3668..42d1cbe28b40 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
@@ -652,12 +652,10 @@ bool analogix_dp_ssc_supported(struct analogix_dp_device *dp)
 
 void analogix_dp_set_link_bandwidth(struct analogix_dp_device *dp, u32 bwtype)
 {
-	u32 reg, status;
+	u32 status;
 	int ret;
 
-	reg = bwtype;
-	if ((bwtype == DP_LINK_BW_2_7) || (bwtype == DP_LINK_BW_1_62))
-		analogix_dp_write(dp, ANALOGIX_DP_LINK_BW_SET, reg);
+	analogix_dp_write(dp, ANALOGIX_DP_LINK_BW_SET, bwtype);
 
 	if (dp->phy) {
 		union phy_configure_opts phy_cfg;
@@ -812,6 +810,10 @@ void analogix_dp_set_training_pattern(struct analogix_dp_device *dp,
 		reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN2;
 		analogix_dp_write(dp, ANALOGIX_DP_TRAINING_PTN_SET, reg);
 		break;
+	case TRAINING_PTN3:
+		reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN3;
+		analogix_dp_write(dp, ANALOGIX_DP_TRAINING_PTN_SET, reg);
+		break;
 	case DP_NONE:
 		reg = SCRAMBLING_ENABLE |
 			LINK_QUAL_PATTERN_SET_DISABLE |
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h
index 1ca8f955b960..28286e31d809 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h
@@ -405,6 +405,7 @@
 #define LINK_QUAL_PATTERN_SET_D10_2		(0x1 << 2)
 #define LINK_QUAL_PATTERN_SET_DISABLE		(0x0 << 2)
 #define SW_TRAINING_PATTERN_SET_MASK		(0x3 << 0)
+#define SW_TRAINING_PATTERN_SET_PTN3		(0x3 << 0)
 #define SW_TRAINING_PATTERN_SET_PTN2		(0x2 << 0)
 #define SW_TRAINING_PATTERN_SET_PTN1		(0x1 << 0)
 #define SW_TRAINING_PATTERN_SET_NORMAL		(0x0 << 0)

commit 10aad71a4dba121e2011dd93bb8f19b0dbdd4df2
Author: Wyon Bi <bivvy.bi@rock-chips.com>
Date:   Wed Jan 9 10:05:25 2019 +0800

    drm/bridge: analogix_dp: Add support for SSC (Spread-Spectrum Clock)
    
    DPTX implements the programmable SSC down-spreading with up to
    0.5% modulation amplitude and 30k/33k modulation frequency.
    
    Change-Id: I2c3eae8f27c84eb1b22eac8973691e0276c1588e
    Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>

diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
index 04195f798316..d5038fcd3668 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
@@ -618,6 +618,32 @@ int analogix_dp_write_byte_to_dpcd(struct analogix_dp_device *dp,
 	return retval;
 }
 
+static void analogix_dp_ssc_enable(struct analogix_dp_device *dp)
+{
+	u32 reg;
+
+	/* 4500ppm */
+	writel(0x19, dp->reg_base + ANALOIGX_DP_SSC_REG);
+	/*
+	 * To apply updated SSC parameters into SSC operation,
+	 * firmware must disable and enable this bit.
+	 */
+	reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
+	reg |= SSC_FUNC_EN_N;
+	writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
+	reg &= ~SSC_FUNC_EN_N;
+	writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
+}
+
+static void analogix_dp_ssc_disable(struct analogix_dp_device *dp)
+{
+	u32 reg;
+
+	reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
+	reg |= SSC_FUNC_EN_N;
+	writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
+}
+
 bool analogix_dp_ssc_supported(struct analogix_dp_device *dp)
 {
 	/* Check if SSC is supported by both sides */
@@ -648,6 +674,11 @@ void analogix_dp_set_link_bandwidth(struct analogix_dp_device *dp, u32 bwtype)
 				__func__, ret);
 			return;
 		}
+	} else {
+		if (analogix_dp_ssc_supported(dp))
+			analogix_dp_ssc_enable(dp);
+		else
+			analogix_dp_ssc_disable(dp);
 	}
 
 	ret = readx_poll_timeout(analogix_dp_get_pll_lock_status, dp, status,
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h
index f7362d7a09a3..1ca8f955b960 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h
@@ -48,6 +48,7 @@
 #define ANALOGIX_DP_PLL_REG_4			0x9ec
 #define ANALOGIX_DP_PLL_REG_5			0xa00
 
+#define ANALOIGX_DP_SSC_REG			0x104
 #define ANALOGIX_DP_PD				0x12c
 
 #define ANALOGIX_DP_IF_TYPE			0x244
diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
index 0d5926dbf947..84a6c3068371 100644
--- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
+++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
@@ -678,10 +678,12 @@ static const struct rockchip_dp_chip_data rk3399_edp = {
 	.lcdsel_big = HIWORD_UPDATE(0, RK3399_EDP_LCDC_SEL),
 	.lcdsel_lit = HIWORD_UPDATE(RK3399_EDP_LCDC_SEL, RK3399_EDP_LCDC_SEL),
 	.chip_type = RK3399_EDP,
+	.ssc = true,
 };
 
 static const struct rockchip_dp_chip_data rk3368_edp = {
 	.chip_type = RK3368_EDP,
+	.ssc = true,
 };
 
 static const struct rockchip_dp_chip_data rk3288_dp = {
@@ -689,6 +691,7 @@ static const struct rockchip_dp_chip_data rk3288_dp = {
 	.lcdsel_big = HIWORD_UPDATE(0, RK3288_EDP_LCDC_SEL),
 	.lcdsel_lit = HIWORD_UPDATE(RK3288_EDP_LCDC_SEL, RK3288_EDP_LCDC_SEL),
 	.chip_type = RK3288_DP,
+	.ssc = true,
 };
 
 static const struct rockchip_dp_chip_data rk3568_edp = {

commit d307d5d0d366f45a9ef314abb0859b12958addc2
Author: YouMin Chen <cym@rock-chips.com>
Date:   Thu Jun 10 20:13:38 2021 +0800

    clk: rockchip: rk3568: remove sclk_ddrc
    
    ddr clk using SCMI that it no longer need sclk_ddrc.
    
    Change-Id: I5cee84896083610d9b1a5bc6bcd23ac628ec5c73
    Signed-off-by: YouMin Chen <cym@rock-chips.com>

diff --git a/drivers/clk/rockchip/clk-rk3568.c b/drivers/clk/rockchip/clk-rk3568.c
index 5afbe2ba5692..242a282d0042 100644
--- a/drivers/clk/rockchip/clk-rk3568.c
+++ b/drivers/clk/rockchip/clk-rk3568.c
@@ -621,9 +621,6 @@ static struct rockchip_clk_branch rk3568_clk_branches[] __initdata = {
 			RK3568_CLKGATE_CON(3), 12, GFLAGS),
 
 	/* PD_DDR */
-	COMPOSITE_DDRCLK(SCLK_DDRCLK, "sclk_ddrc", dpll_gpll_cpll_p,
-			CLK_IGNORE_UNUSED, RK3568_CLKSEL_CON(9), 6, 2, 0, 5,
-			ROCKCHIP_DDRCLK_SIP_V2),
 	COMPOSITE(CLK_DDRPHY1X_SRC, "clk_ddrphy1x_src", dpll_gpll_cpll_p, CLK_IGNORE_UNUSED,
 			RK3568_CLKSEL_CON(9), 6, 2, MFLAGS, 0, 5, DFLAGS,
 			RK3568_CLKGATE_CON(4), 0, GFLAGS),

commit 442c41d343c3a2e910900807163bde876bf7bea8
Author: YouMin Chen <cym@rock-chips.com>
Date:   Thu Jun 10 20:11:25 2021 +0800

    arm64: dts: rockchip: rk3568: modify dmc clk
    
    ddr clk using SCMI, replace <&cru SCLK_DDRCLK> with <&scmi_clk 3>
    
    Change-Id: Ibce1779718c6800d3ce3e334ce0ed5151b9a6eec
    Signed-off-by: YouMin Chen <cym@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index 3d3af7761a7f..bd074644061a 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -2124,7 +2124,7 @@
 		interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>;
 		interrupt-names = "complete";
 		devfreq-events = <&dfi>;
-		clocks = <&cru SCLK_DDRCLK>;
+		clocks = <&scmi_clk 3>;
 		clock-names = "dmc_clk";
 		operating-points-v2 = <&dmc_opp_table>;
 		ddr_timing = <&ddr_timing>;

commit c44c498d084abcb948e2c62f1c012431493926fe
Author: YouMin Chen <cym@rock-chips.com>
Date:   Wed Jun 2 10:20:20 2021 +0800

    PM / devfreq: rockchip_dmc: rk3568: add rockchip_ddr_set_rate
    
    Add rockchip_ddr_set_rate to support ddr frequency switching.
    This function wraps the SMC call and frequency switching is
    implemented in ATF. Afterwards it will call clk_get_rate to
    update the rate in clock framework.
    Set dmcfreq->is_set_rate_in_dmc=true to enable this process.
    
    Change-Id: I9349a2e8413751360bf105a70e46d1453791194c
    Signed-off-by: YouMin Chen <cym@rock-chips.com>

diff --git a/drivers/devfreq/rockchip_dmc.c b/drivers/devfreq/rockchip_dmc.c
index 27635de19143..721237664f37 100644
--- a/drivers/devfreq/rockchip_dmc.c
+++ b/drivers/devfreq/rockchip_dmc.c
@@ -177,6 +177,7 @@ struct rockchip_dmcfreq {
 
 	bool is_fixed;
 	bool is_msch_rl_work_started;
+	bool is_set_rate_direct;
 
 	struct thermal_cooling_device *devfreq_cooling;
 	u32 static_coefficient;
@@ -335,6 +336,70 @@ rk3328_de_skew_setting_2_register(struct rk3328_ddr_de_skew_setting *de_skew,
 	}
 }
 
+static int rk_drm_get_lcdc_type(void)
+{
+	struct drm_device *drm;
+	u32 lcdc_type = 0;
+
+	drm = drm_device_get_by_name("rockchip");
+	if (drm) {
+		struct drm_connector *conn;
+
+		list_for_each_entry(conn, &drm->mode_config.connector_list,
+				    head) {
+			if (conn->encoder) {
+				lcdc_type = conn->connector_type;
+				break;
+			}
+		}
+	}
+	switch (lcdc_type) {
+	case DRM_MODE_CONNECTOR_DPI:
+	case DRM_MODE_CONNECTOR_LVDS:
+		lcdc_type = SCREEN_LVDS;
+		break;
+	case DRM_MODE_CONNECTOR_DisplayPort:
+		lcdc_type = SCREEN_DP;
+		break;
+	case DRM_MODE_CONNECTOR_HDMIA:
+	case DRM_MODE_CONNECTOR_HDMIB:
+		lcdc_type = SCREEN_HDMI;
+		break;
+	case DRM_MODE_CONNECTOR_TV:
+		lcdc_type = SCREEN_TVOUT;
+		break;
+	case DRM_MODE_CONNECTOR_eDP:
+		lcdc_type = SCREEN_EDP;
+		break;
+	case DRM_MODE_CONNECTOR_DSI:
+		lcdc_type = SCREEN_MIPI;
+		break;
+	default:
+		lcdc_type = SCREEN_NULL;
+		break;
+	}
+
+	return lcdc_type;
+}
+
+static int rockchip_ddr_set_rate(unsigned long target_rate)
+{
+	struct arm_smccc_res res;
+
+	ddr_psci_param->hz = target_rate;
+	ddr_psci_param->lcdc_type = rk_drm_get_lcdc_type();
+	ddr_psci_param->wait_flag1 = 1;
+	ddr_psci_param->wait_flag0 = 1;
+
+	res = sip_smc_dram(SHARE_PAGE_TYPE_DDR, 0,
+			   ROCKCHIP_SIP_CONFIG_DRAM_SET_RATE);
+
+	if ((int)res.a1 == SIP_RET_SET_RATE_TIMEOUT)
+		rockchip_dmcfreq_wait_complete();
+
+	return res.a0;
+}
+
 static int rockchip_dmcfreq_target(struct device *dev, unsigned long *freq,
 				   u32 flags)
 {
@@ -355,9 +420,13 @@ static int rockchip_dmcfreq_target(struct device *dev, unsigned long *freq,
 	target_volt = dev_pm_opp_get_voltage(opp);
 	dev_pm_opp_put(opp);
 
-	target_rate = clk_round_rate(dmcfreq->dmc_clk, *freq);
-	if ((long)target_rate <= 0)
+	if (dmcfreq->is_set_rate_direct) {
 		target_rate = *freq;
+	} else {
+		target_rate = clk_round_rate(dmcfreq->dmc_clk, *freq);
+		if ((long)target_rate <= 0)
+			target_rate = *freq;
+	}
 
 	if (dmcfreq->rate == target_rate) {
 		if (dmcfreq->volt == target_volt)
@@ -435,7 +504,12 @@ static int rockchip_dmcfreq_target(struct device *dev, unsigned long *freq,
 	while (!down_write_trylock(&rockchip_dmcfreq_sem))
 		cond_resched();
 	dev_dbg(dev, "%lu-->%lu\n", old_clk_rate, target_rate);
-	err = clk_set_rate(dmcfreq->dmc_clk, target_rate);
+
+	if (dmcfreq->is_set_rate_direct)
+		err = rockchip_ddr_set_rate(target_rate);
+	else
+		err = clk_set_rate(dmcfreq->dmc_clk, target_rate);
+
 	up_write(&rockchip_dmcfreq_sem);
 	if (err) {
 		dev_err(dev, "Cannot set frequency %lu (%d)\n",
@@ -1076,52 +1150,6 @@ static struct rk3399_dram_timing *of_get_rk3399_timings(struct device *dev,
 	return timing;
 }
 
-static int rk_drm_get_lcdc_type(void)
-{
-	struct drm_device *drm;
-	u32 lcdc_type = 0;
-
-	drm = drm_device_get_by_name("rockchip");
-	if (drm) {
-		struct drm_connector *conn;
-
-		list_for_each_entry(conn, &drm->mode_config.connector_list,
-				    head) {
-			if (conn->encoder) {
-				lcdc_type = conn->connector_type;
-				break;
-			}
-		}
-	}
-	switch (lcdc_type) {
-	case DRM_MODE_CONNECTOR_DPI:
-	case DRM_MODE_CONNECTOR_LVDS:
-		lcdc_type = SCREEN_LVDS;
-		break;
-	case DRM_MODE_CONNECTOR_DisplayPort:
-		lcdc_type = SCREEN_DP;
-		break;
-	case DRM_MODE_CONNECTOR_HDMIA:
-	case DRM_MODE_CONNECTOR_HDMIB:
-		lcdc_type = SCREEN_HDMI;
-		break;
-	case DRM_MODE_CONNECTOR_TV:
-		lcdc_type = SCREEN_TVOUT;
-		break;
-	case DRM_MODE_CONNECTOR_eDP:
-		lcdc_type = SCREEN_EDP;
-		break;
-	case DRM_MODE_CONNECTOR_DSI:
-		lcdc_type = SCREEN_MIPI;
-		break;
-	default:
-		lcdc_type = SCREEN_NULL;
-		break;
-	}
-
-	return lcdc_type;
-}
-
 static int rockchip_ddr_set_auto_self_refresh(uint32_t en)
 {
 	struct arm_smccc_res res;
@@ -1848,6 +1876,7 @@ static __maybe_unused int rk3568_dmc_init(struct platform_device *pdev,
 		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;
 

commit 36f9f4c98c92e7d28ad9ba567882eb89ac351c38
Author: YouMin Chen <cym@rock-chips.com>
Date:   Mon May 31 15:54:21 2021 +0800

    arm64: dts: rockchip: rk356x: dmc: Replace system-status-freq by system-status-level
    
    "system-status-level" property define only frequency level, not the
    actual frequency. In dmc driver, it will switch from frequency level
    to actual frequency base on available frequencies table which get
    from ATF.
    
    Change-Id: I489b671da5e56912d4f970d32174bdc8b1f86a08
    Signed-off-by: YouMin Chen <cym@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi
index dac2e9ca1087..09791eb16abf 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi
@@ -46,12 +46,6 @@
 };
 
 &dmc {
-	system-status-freq = <
-		/*system status         freq(KHz)*/
-		SYS_STATUS_NORMAL       528000
-		SYS_STATUS_REBOOT       528000
-		SYS_STATUS_SUSPEND      324000
-	>;
 	center-supply = <&vdd_logic>;
 	auto-freq-en = <0>;
 	status = "okay";
@@ -59,20 +53,13 @@
 
 &dmc_opp_table {
 	opp-324000000 {
+		opp-hz = /bits/ 64 <324000000>;
 		opp-microvolt = <875000>;
 	};
 	opp-528000000 {
+		opp-hz = /bits/ 64 <528000000>;
 		opp-microvolt = <875000>;
 	};
-	opp-780000000 {
-		status = "disabled";
-	};
-	opp-920000000 {
-		status = "disabled";
-	};
-	opp-1056000000 {
-		status = "disabled";
-	};
 };
 
 &ebc {
diff --git a/arch/arm64/boot/dts/rockchip/rk3566.dtsi b/arch/arm64/boot/dts/rockchip/rk3566.dtsi
index 9c221b095208..01b6499b678d 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566.dtsi
@@ -15,31 +15,6 @@
 	/delete-node/ opp-1992000000;
 };
 
-&dmc {
-	system-status-freq = <
-		/*system status         freq(KHz)*/
-		SYS_STATUS_NORMAL       780000
-		SYS_STATUS_REBOOT       1056000
-		SYS_STATUS_SUSPEND      324000
-		SYS_STATUS_VIDEO_4K     780000
-		SYS_STATUS_VIDEO_4K_10B 780000
-		SYS_STATUS_BOOST        1056000
-		SYS_STATUS_ISP          1056000
-		SYS_STATUS_PERFORMANCE  1056000
-		SYS_STATUS_DUALVIEW     1056000
-	>;
-};
-
-&dmc_opp_table {
-	opp-1056000000 {
-		opp-hz = /bits/ 64 <1056000000>;
-		opp-microvolt = <900000>;
-		opp-microvolt-L0 = <900000>;
-		opp-microvolt-L1 = <850000>;
-	};
-	/delete-node/ opp-1560000000;
-};
-
 &power {
 	pd_pipe@RK3568_PD_PIPE {
 		reg = <RK3568_PD_PIPE>;
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi
index 651d4c1fcb5b..1385dbd0c6d4 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi
@@ -142,28 +142,6 @@
 	};
 };
 
-&dmc {
-	system-status-freq = <
-		/*system status         freq(KHz)*/
-		SYS_STATUS_NORMAL       780000
-		SYS_STATUS_REBOOT       1056000
-		SYS_STATUS_SUSPEND      324000
-		SYS_STATUS_VIDEO_4K     780000
-		SYS_STATUS_VIDEO_4K_10B 780000
-		SYS_STATUS_BOOST        1056000
-		SYS_STATUS_ISP          1056000
-		SYS_STATUS_PERFORMANCE  1056000
-	>;
-};
-
-&dmc_opp_table {
-	opp-1056000000 {
-		opp-hz = /bits/ 64 <1056000000>;
-		opp-microvolt = <900000>;
-	};
-	/delete-node/ opp-1560000000;
-};
-
 /*
  * video_phy0 needs to be enabled
  * when dsi0 is enabled
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi
index 9fac596bc732..83c67ddc85ee 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi
@@ -55,27 +55,6 @@
 	status = "okay";
 };
 
-&dmc_opp_table {
-	opp-1056000000 {
-		opp-hz = /bits/ 64 <1056000000>;
-		opp-microvolt = <900000>;
-	};
-	/delete-node/ opp-1560000000;
-};
-
-&dmc {
-	system-status-freq = <
-		/*system status         freq(KHz)*/
-		SYS_STATUS_NORMAL       780000
-		SYS_STATUS_REBOOT       1056000
-		SYS_STATUS_SUSPEND      324000
-		SYS_STATUS_VIDEO_1080P  528000
-		SYS_STATUS_BOOST        1056000
-		SYS_STATUS_ISP          1056000
-		SYS_STATUS_PERFORMANCE  1056000
-	>;
-};
-
 /*
  * video_phy0 needs to be enabled
  * when dsi0 is enabled
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb7-ddr4-v10.dts b/arch/arm64/boot/dts/rockchip/rk3568-evb7-ddr4-v10.dts
index 1c58e7261450..ecb96832c292 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb7-ddr4-v10.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb7-ddr4-v10.dts
@@ -10,25 +10,3 @@
 	model = "Rockchip RK3568 EVB7 DDR4 V10 Board";
 	compatible = "rockchip,rk3568-evb7-ddr4-v10", "rockchip,rk3568";
 };
-
-&dmc {
-	system-status-freq = <
-		/*system status         freq(KHz)*/
-		SYS_STATUS_NORMAL       780000
-		SYS_STATUS_REBOOT       1056000
-		SYS_STATUS_SUSPEND      324000
-		SYS_STATUS_VIDEO_4K     780000
-		SYS_STATUS_VIDEO_4K_10B 780000
-		SYS_STATUS_BOOST        1056000
-		SYS_STATUS_ISP          1056000
-		SYS_STATUS_PERFORMANCE  1056000
-	>;
-};
-
-&dmc_opp_table {
-	opp-1056000000 {
-		opp-hz = /bits/ 64 <1056000000>;
-		opp-microvolt = <900000>;
-	};
-	/delete-node/ opp-1560000000;
-};
diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index 57035f10a0a9..3d3af7761a7f 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -2135,17 +2135,17 @@
 		>;
 		upthreshold = <40>;
 		downdifferential = <20>;
-		system-status-freq = <
-			/*system status         freq(KHz)*/
-			SYS_STATUS_NORMAL       780000
-			SYS_STATUS_REBOOT       1560000
-			SYS_STATUS_SUSPEND      324000
-			SYS_STATUS_VIDEO_4K     780000
-			SYS_STATUS_VIDEO_4K_10B 780000
-			SYS_STATUS_BOOST        1560000
-			SYS_STATUS_ISP          1560000
-			SYS_STATUS_PERFORMANCE  1560000
-			SYS_STATUS_DUALVIEW     1560000
+		system-status-level = <
+			/*system status         freq level*/
+			SYS_STATUS_NORMAL       DMC_FREQ_LEVEL_MID_HIGH
+			SYS_STATUS_REBOOT       DMC_FREQ_LEVEL_HIGH
+			SYS_STATUS_SUSPEND      DMC_FREQ_LEVEL_LOW
+			SYS_STATUS_VIDEO_4K     DMC_FREQ_LEVEL_MID_HIGH
+			SYS_STATUS_VIDEO_4K_10B DMC_FREQ_LEVEL_MID_HIGH
+			SYS_STATUS_BOOST        DMC_FREQ_LEVEL_HIGH
+			SYS_STATUS_ISP          DMC_FREQ_LEVEL_HIGH
+			SYS_STATUS_PERFORMANCE  DMC_FREQ_LEVEL_HIGH
+			SYS_STATUS_DUALVIEW     DMC_FREQ_LEVEL_HIGH
 		>;
 		auto-min-freq = <324000>;
 		auto-freq-en = <1>;
@@ -2170,31 +2170,6 @@
 			81  254   1
 		>;
 
-		opp-324000000 {
-			opp-hz = /bits/ 64 <324000000>;
-			opp-microvolt = <900000>;
-			opp-microvolt-L0 = <900000>;
-			opp-microvolt-L1 = <850000>;
-		};
-		opp-528000000 {
-			opp-hz = /bits/ 64 <528000000>;
-			opp-microvolt = <900000>;
-			opp-microvolt-L0 = <900000>;
-			opp-microvolt-L1 = <850000>;
-		};
-		opp-780000000 {
-			opp-hz = /bits/ 64 <780000000>;
-			opp-microvolt = <900000>;
-			opp-microvolt-L0 = <900000>;
-			opp-microvolt-L1 = <850000>;
-		};
-		opp-920000000 {
-			opp-hz = /bits/ 64 <920000000>;
-			opp-microvolt = <900000>;
-			opp-microvolt-L0 = <900000>;
-			opp-microvolt-L1 = <850000>;
-			status = "disabled";
-		};
 		opp-1560000000 {
 			opp-hz = /bits/ 64 <1560000000>;
 			opp-microvolt = <900000>;

commit 0649d01df70a8b2a8a4f236f5b870f083e8df400
Author: YouMin Chen <cym@rock-chips.com>
Date:   Fri May 28 20:14:46 2021 +0800

    PM / devfreq: rockchip_dmc: rk3568: get available frequencies from ATF
    
    Add the function of rockchip_get_freq_info to get available ddr
    frequencies info via SMC call. The frequency info include available
    frequencies count and frequencies table(sort by rate from low to high).
    Afterwards it will update the dmc_opp_table base on frequencies info.
    
    If have "system-status-level" property in dmc, the function of
    rockchip_get_system_status_level will get the frequency for
    system-status base on frequency level and available frequencies table.
    
    Change-Id: I73d0f999e718ba9426ad75e48ac2a4ec3fe5f496
    Signed-off-by: YouMin Chen <cym@rock-chips.com>

diff --git a/drivers/devfreq/rockchip_dmc.c b/drivers/devfreq/rockchip_dmc.c
index cb2421dea429..27635de19143 100644
--- a/drivers/devfreq/rockchip_dmc.c
+++ b/drivers/devfreq/rockchip_dmc.c
@@ -88,6 +88,11 @@ struct rl_map_table {
 	unsigned int rl; /* readlatency */
 };
 
+struct dmc_freq_table {
+	unsigned long freq;
+	unsigned long volt;
+};
+
 struct share_params {
 	u32 hz;
 	u32 lcdc_type;
@@ -108,6 +113,9 @@ struct share_params {
 	u32 complt_hwirq;
 	u32 update_drv_odt_cfg;
 	u32 update_deskew_cfg;
+
+	u32 freq_count;
+	u32 freq_info_mhz[6];
 	 /* if need, add parameter after */
 };
 
@@ -151,6 +159,13 @@ struct rockchip_dmcfreq {
 	unsigned long low_power_rate;
 	unsigned long vop_req_rate;
 
+	unsigned long freq_count;
+	unsigned long freq_info_rate[6];
+	unsigned long rate_low;
+	unsigned long rate_mid_low;
+	unsigned long rate_mid_high;
+	unsigned long rate_high;
+
 	unsigned int min_cpu_freq;
 	unsigned int auto_freq_en;
 	unsigned int system_status_en;
@@ -1191,6 +1206,85 @@ int rockchip_dmcfreq_wait_complete(void)
 	return 0;
 }
 
+static __maybe_unused int rockchip_get_freq_info(struct rockchip_dmcfreq *dmcfreq)
+{
+	struct arm_smccc_res res;
+	struct dev_pm_opp *opp;
+	struct dmc_freq_table *freq_table;
+	unsigned long rate;
+	int i, j, count, ret = 0;
+
+	res = sip_smc_dram(SHARE_PAGE_TYPE_DDR, 0,
+			   ROCKCHIP_SIP_CONFIG_DRAM_GET_FREQ_INFO);
+	if (res.a0) {
+		dev_err(dmcfreq->dev, "rockchip_sip_config_dram_get_freq_info error:%lx\n",
+			res.a0);
+		return -ENOMEM;
+	}
+
+	if (ddr_psci_param->freq_count == 0 || ddr_psci_param->freq_count > 6) {
+		dev_err(dmcfreq->dev, "it is no available frequencies!\n");
+		return -EPERM;
+	}
+
+	for (i = 0; i < ddr_psci_param->freq_count; i++)
+		dmcfreq->freq_info_rate[i] = ddr_psci_param->freq_info_mhz[i] * 1000000;
+	dmcfreq->freq_count = ddr_psci_param->freq_count;
+
+	/* update dmc_opp_table */
+	count = dev_pm_opp_get_opp_count(dmcfreq->dev);
+	if (count <= 0) {
+		ret = count ? count : -ENODATA;
+		return ret;
+	}
+
+	freq_table = kmalloc(sizeof(struct dmc_freq_table) * count, GFP_KERNEL);
+	for (i = 0, rate = 0; i < count; i++, rate++) {
+		/* find next rate */
+		opp = dev_pm_opp_find_freq_ceil(dmcfreq->dev, &rate);
+		if (IS_ERR(opp)) {
+			ret = PTR_ERR(opp);
+			dev_err(dmcfreq->dev, "failed to find OPP for freq %lu.\n", rate);
+			goto out;
+		}
+		freq_table[i].freq = rate;
+		freq_table[i].volt = dev_pm_opp_get_voltage(opp);
+		dev_pm_opp_put(opp);
+
+		for (j = 0; j < dmcfreq->freq_count; j++) {
+			if (rate == dmcfreq->freq_info_rate[j])
+				break;
+		}
+		if (j == dmcfreq->freq_count)
+			dev_pm_opp_remove(dmcfreq->dev, rate);
+	}
+
+	for (i = 0; i < dmcfreq->freq_count; i++) {
+		for (j = 0; j < count; j++) {
+			if (dmcfreq->freq_info_rate[i] == freq_table[j].freq) {
+				break;
+			} else if (dmcfreq->freq_info_rate[i] < freq_table[j].freq) {
+				dev_pm_opp_add(dmcfreq->dev, dmcfreq->freq_info_rate[i],
+					       freq_table[j].volt);
+				break;
+			}
+		}
+		if (j == count) {
+			dev_err(dmcfreq->dev, "failed to match dmc_opp_table for %ld\n",
+				dmcfreq->freq_info_rate[i]);
+			if (i == 0)
+				ret = -EPERM;
+			else
+				dmcfreq->freq_count = i;
+			goto out;
+		}
+	}
+
+out:
+	kfree(freq_table);
+	return ret;
+}
+
 static __maybe_unused int px30_dmc_init(struct platform_device *pdev,
 					struct rockchip_dmcfreq *dmcfreq)
 {
@@ -1690,9 +1784,8 @@ static __maybe_unused int rk3568_dmc_init(struct platform_device *pdev,
 	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 to update or is invalid!\n");
+	if (res.a0 || res.a1 < 0x101) {
+		dev_err(&pdev->dev, "trusted firmware need update to V1.01 and above.\n");
 		return -ENXIO;
 	}
 
@@ -1750,6 +1843,12 @@ static __maybe_unused int rk3568_dmc_init(struct platform_device *pdev,
 		return -ENOMEM;
 	}
 
+	ret = rockchip_get_freq_info(dmcfreq);
+	if (ret < 0) {
+		dev_err(&pdev->dev, "cannot get frequency info\n");
+		return ret;
+	}
+
 	dmcfreq->set_auto_self_refresh = rockchip_ddr_set_auto_self_refresh;
 
 	return 0;
@@ -2035,6 +2134,156 @@ static int rockchip_get_system_status_rate(struct device_node *np,
 	return 0;
 }
 
+static unsigned long rockchip_freq_level_2_rate(struct rockchip_dmcfreq *dmcfreq,
+						unsigned int level)
+{
+	unsigned long rate = 0;
+
+	switch (level) {
+	case DMC_FREQ_LEVEL_LOW:
+		rate = dmcfreq->rate_low;
+		break;
+	case DMC_FREQ_LEVEL_MID_LOW:
+		rate = dmcfreq->rate_mid_low;
+		break;
+	case DMC_FREQ_LEVEL_MID_HIGH:
+		rate = dmcfreq->rate_mid_high;
+		break;
+	case DMC_FREQ_LEVEL_HIGH:
+		rate = dmcfreq->rate_high;
+		break;
+	default:
+		break;
+	}
+
+	return rate;
+}
+
+static int rockchip_get_system_status_level(struct device_node *np,
+					    char *porp_name,
+					    struct rockchip_dmcfreq *dmcfreq)
+{
+	const struct property *prop;
+	unsigned int status = 0, level = 0;
+	unsigned long temp_rate = 0;
+	int count, i;
+
+	prop = of_find_property(np, porp_name, NULL);
+	if (!prop)
+		return -ENODEV;
+
+	if (!prop->value)
+		return -ENODATA;
+
+	count = of_property_count_u32_elems(np, porp_name);
+	if (count < 0)
+		return -EINVAL;
+
+	if (count % 2)
+		return -EINVAL;
+
+	if (dmcfreq->freq_count == 1) {
+		dmcfreq->rate_low = dmcfreq->freq_info_rate[0];
+		dmcfreq->rate_mid_low = dmcfreq->freq_info_rate[0];
+		dmcfreq->rate_mid_high = dmcfreq->freq_info_rate[0];
+		dmcfreq->rate_high = dmcfreq->freq_info_rate[0];
+	} else if (dmcfreq->freq_count == 2) {
+		dmcfreq->rate_low = dmcfreq->freq_info_rate[0];
+		dmcfreq->rate_mid_low = dmcfreq->freq_info_rate[0];
+		dmcfreq->rate_mid_high = dmcfreq->freq_info_rate[1];
+		dmcfreq->rate_high = dmcfreq->freq_info_rate[1];
+	} else if (dmcfreq->freq_count == 3) {
+		dmcfreq->rate_low = dmcfreq->freq_info_rate[0];
+		dmcfreq->rate_mid_low = dmcfreq->freq_info_rate[1];
+		dmcfreq->rate_mid_high = dmcfreq->freq_info_rate[1];
+		dmcfreq->rate_high = dmcfreq->freq_info_rate[2];
+	} else if (dmcfreq->freq_count == 4) {
+		dmcfreq->rate_low = dmcfreq->freq_info_rate[0];
+		dmcfreq->rate_mid_low = dmcfreq->freq_info_rate[1];
+		dmcfreq->rate_mid_high = dmcfreq->freq_info_rate[2];
+		dmcfreq->rate_high = dmcfreq->freq_info_rate[3];
+	} else if (dmcfreq->freq_count == 5 || dmcfreq->freq_count == 6) {
+		dmcfreq->rate_low = dmcfreq->freq_info_rate[0];
+		dmcfreq->rate_mid_low = dmcfreq->freq_info_rate[1];
+		dmcfreq->rate_mid_high = dmcfreq->freq_info_rate[dmcfreq->freq_count - 2];
+		dmcfreq->rate_high = dmcfreq->freq_info_rate[dmcfreq->freq_count - 1];
+	} else {
+		return -EINVAL;
+	}
+
+	for (i = 0; i < count / 2; i++) {
+		of_property_read_u32_index(np, porp_name, 2 * i,
+					   &status);
+		of_property_read_u32_index(np, porp_name, 2 * i + 1,
+					   &level);
+		switch (status) {
+		case SYS_STATUS_NORMAL:
+			dmcfreq->normal_rate = rockchip_freq_level_2_rate(dmcfreq, level);
+			dev_info(dmcfreq->dev, "normal_rate = %ld\n", dmcfreq->normal_rate);
+			break;
+		case SYS_STATUS_SUSPEND:
+			dmcfreq->suspend_rate = rockchip_freq_level_2_rate(dmcfreq, level);
+			dev_info(dmcfreq->dev, "suspend_rate = %ld\n", dmcfreq->suspend_rate);
+			break;
+		case SYS_STATUS_VIDEO_1080P:
+			dmcfreq->video_1080p_rate = rockchip_freq_level_2_rate(dmcfreq, level);
+			dev_info(dmcfreq->dev, "video_1080p_rate = %ld\n",
+				 dmcfreq->video_1080p_rate);
+			break;
+		case SYS_STATUS_VIDEO_4K:
+			dmcfreq->video_4k_rate = rockchip_freq_level_2_rate(dmcfreq, level);
+			dev_info(dmcfreq->dev, "video_4k_rate = %ld\n", dmcfreq->video_4k_rate);
+			break;
+		case SYS_STATUS_VIDEO_4K_10B:
+			dmcfreq->video_4k_10b_rate = rockchip_freq_level_2_rate(dmcfreq, level);
+			dev_info(dmcfreq->dev, "video_4k_10b_rate = %ld\n",
+				 dmcfreq->video_4k_10b_rate);
+			break;
+		case SYS_STATUS_PERFORMANCE:
+			dmcfreq->performance_rate = rockchip_freq_level_2_rate(dmcfreq, level);
+			dev_info(dmcfreq->dev, "performance_rate = %ld\n",
+				 dmcfreq->performance_rate);
+			break;
+		case SYS_STATUS_HDMI:
+			dmcfreq->hdmi_rate = rockchip_freq_level_2_rate(dmcfreq, level);
+			dev_info(dmcfreq->dev, "hdmi_rate = %ld\n", dmcfreq->hdmi_rate);
+			break;
+		case SYS_STATUS_IDLE:
+			dmcfreq->idle_rate = rockchip_freq_level_2_rate(dmcfreq, level);
+			dev_info(dmcfreq->dev, "idle_rate = %ld\n", dmcfreq->idle_rate);
+			break;
+		case SYS_STATUS_REBOOT:
+			dmcfreq->reboot_rate = rockchip_freq_level_2_rate(dmcfreq, level);
+			dev_info(dmcfreq->dev, "reboot_rate = %ld\n", dmcfreq->reboot_rate);
+			break;
+		case SYS_STATUS_BOOST:
+			dmcfreq->boost_rate = rockchip_freq_level_2_rate(dmcfreq, level);
+			dev_info(dmcfreq->dev, "boost_rate = %ld\n", dmcfreq->boost_rate);
+			break;
+		case SYS_STATUS_ISP:
+		case SYS_STATUS_CIF0:
+		case SYS_STATUS_CIF1:
+		case SYS_STATUS_DUALVIEW:
+			temp_rate = rockchip_freq_level_2_rate(dmcfreq, level);
+			if (dmcfreq->fixed_rate < temp_rate) {
+				dmcfreq->fixed_rate = temp_rate;
+				dev_info(dmcfreq->dev,
+					 "fixed_rate(isp|cif0|cif1|dualview) = %ld\n",
+					 dmcfreq->fixed_rate);
+			}
+			break;
+		case SYS_STATUS_LOW_POWER:
+			dmcfreq->low_power_rate = rockchip_freq_level_2_rate(dmcfreq, level);
+			dev_info(dmcfreq->dev, "low_power_rate = %ld\n", dmcfreq->low_power_rate);
+			break;
+		default:
+			break;
+		}
+	}
+
+	return 0;
+}
+
 static void rockchip_dmcfreq_update_target(struct rockchip_dmcfreq *dmcfreq)
 {
 	struct devfreq *df = dmcfreq->devfreq;
@@ -2535,7 +2784,7 @@ static int rockchip_dmcfreq_power_control(struct rockchip_dmcfreq *dmcfreq)
 
 	dmcfreq->dmc_clk = devm_clk_get(dev, "dmc_clk");
 	if (IS_ERR(dmcfreq->dmc_clk)) {
-		dev_err(dev, "Cannot get the clk dmc_clk\n");
+		dev_err(dev, "Cannot get the clk dmc_clk. If using SCMI, trusted firmware need update to V1.01 and above.\n");
 		return PTR_ERR(dmcfreq->dmc_clk);
 	}
 	dmcfreq->rate = clk_get_rate(dmcfreq->dmc_clk);
@@ -2569,9 +2818,11 @@ static void rockchip_dmcfreq_parse_dt(struct rockchip_dmcfreq *dmcfreq)
 	struct device *dev = dmcfreq->dev;
 	struct device_node *np = dev->of_node;
 
-	if (!rockchip_get_system_status_rate(np, "system-status-freq",
-					     dmcfreq))
+	if (!rockchip_get_system_status_rate(np, "system-status-freq", dmcfreq))
 		dmcfreq->system_status_en = true;
+	else if (!rockchip_get_system_status_level(np, "system-status-level", dmcfreq))
+		dmcfreq->system_status_en = true;
+
 	of_property_read_u32(np, "min-cpu-freq", &dmcfreq->min_cpu_freq);
 
 	of_property_read_u32(np, "upthreshold",
@@ -2939,11 +3190,11 @@ static int rockchip_dmcfreq_probe(struct platform_device *pdev)
 	if (ret)
 		return ret;
 
-	ret = rockchip_dmcfreq_dmc_init(pdev, data);
+	ret = rockchip_init_opp_table(dev, NULL, "ddr_leakage", "center");
 	if (ret)
 		return ret;
 
-	ret = rockchip_init_opp_table(dev, NULL, "ddr_leakage", "center");
+	ret = rockchip_dmcfreq_dmc_init(pdev, data);
 	if (ret)
 		return ret;
 

commit 23302741aa37bd1595fef4e16bacc214ac2b8fce
Author: YouMin Chen <cym@rock-chips.com>
Date:   Mon May 31 16:16:04 2021 +0800

    dt-bindings: soc: rockchip: add dram frequency level support
    
    Change-Id: I57b14a8682f9987327ff83f6c98708abd3ec8d8b
    Signed-off-by: YouMin Chen <cym@rock-chips.com>

diff --git a/include/dt-bindings/soc/rockchip-system-status.h b/include/dt-bindings/soc/rockchip-system-status.h
index fe103a55f222..837a1a969c78 100644
--- a/include/dt-bindings/soc/rockchip-system-status.h
+++ b/include/dt-bindings/soc/rockchip-system-status.h
@@ -40,4 +40,9 @@
 				 SYS_STATUS_VIDEO_4K_10B)
 #define SYS_STATUS_DUALVIEW	(SYS_STATUS_LCDC0 | SYS_STATUS_LCDC1)
 
+#define DMC_FREQ_LEVEL_LOW	(0x1 << 0)
+#define DMC_FREQ_LEVEL_MID_LOW	(0x1 << 1)
+#define DMC_FREQ_LEVEL_MID_HIGH	(0x1 << 2)
+#define DMC_FREQ_LEVEL_HIGH	(0x1 << 3)
+
 #endif

commit d77e94bb004c228d47fb7f726e082dbd0f1b087e
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Tue Jul 13 19:15:57 2021 +0800

    drm/rocckhip: vop2: fix compile warning
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: I15818e57a0f07a37ee4670df3a9fd22ef8970b72

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index d7168d2b8e0c..e4cadf0a5277 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -2489,7 +2489,6 @@ static void vop2_layer_map_initial(struct vop2 *vop2, uint32_t current_vp_id)
 	const struct vop2_data *vop2_data = vop2->data;
 	struct vop2_layer *layer = &vop2->layers[0];
 	struct vop2_video_port *vp = &vop2->vps[0];
-	struct vop2_video_port *last_active_vp;
 	struct vop2_win *win;
 	const struct vop2_win_data *win_data = NULL;
 	uint32_t used_layers = 0;
@@ -2519,8 +2518,6 @@ static void vop2_layer_map_initial(struct vop2 *vop2, uint32_t current_vp_id)
 			active_vp_mask |= BIT(i);
 	}
 
-	last_active_vp = &vop2->vps[fls(active_vp_mask) - 1];
-
 	for (i = 0; i < vop2->data->nr_vps; i++) {
 		vp = &vop2->vps[i];
 		vp->win_mask = 0;
@@ -2552,7 +2549,8 @@ static void vop2_layer_map_initial(struct vop2 *vop2, uint32_t current_vp_id)
 	}
 
 	/* the last VP is fixed */
-	port_mux_cfg |= 7 << (4 * (vop2->data->nr_vps - 1));
+	if (vop2->data->nr_vps >= 1)
+		port_mux_cfg |= 7 << (4 * (vop2->data->nr_vps - 1));
 	vop2->port_mux_cfg = port_mux_cfg;
 	VOP_CTRL_SET(vop2, ovl_port_mux_cfg, port_mux_cfg);
 
@@ -4924,7 +4922,8 @@ static void vop2_setup_layer_mixer_for_vp(struct vop2_video_port *vp,
 			prev_vp->bg_ovl_dly = (vop2_data->nr_mixers - port_mux) << 1;
 	}
 
-	port_mux_cfg |= 7 << (4 * (vop2->data->nr_vps - 1));
+	if (vop2->data->nr_vps >= 1)
+		port_mux_cfg |= 7 << (4 * (vop2->data->nr_vps - 1));
 
 	/*
 	 * Win and layer must map one by one, if a win is selected

commit 4f24751267a28b347766ee8cb91bf85e8dc55857
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Tue Jul 13 09:16:19 2021 +0800

    drm/rockchip: vop2: rk356x three vp share one gamma
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: Iddaf85a902feaa1c2a6004a1b8c2f419135cd039

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
index 30a1a035562e..e5ee271c0ca8 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
@@ -849,6 +849,7 @@ struct vop2_data {
 	uint8_t nr_mixers;
 	uint8_t nr_layers;
 	uint8_t nr_axi_intr;
+	uint8_t nr_gammas;
 	const struct vop_intr *axi_intr;
 	const struct vop2_ctrl *ctrl;
 	const struct vop2_win_data *win;
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index a80f1c352c35..d7168d2b8e0c 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -2257,6 +2257,7 @@ static void vop2_crtc_load_lut(struct drm_crtc *crtc)
 	struct vop2_video_port *vp = to_vop2_video_port(crtc);
 	struct vop2 *vop2 = vp->vop2;
 	int dle = 0, i = 0;
+	u8 vp_enable_gamma_nr = 0;
 
 	if (!vop2->is_enabled || !vp->lut || !vop2->lut_regs)
 		return;
@@ -2264,6 +2265,18 @@ static void vop2_crtc_load_lut(struct drm_crtc *crtc)
 	if (WARN_ON(!drm_modeset_is_locked(&crtc->mutex)))
 		return;
 
+	for (i = 0; i < vop2->data->nr_vps; i++) {
+		struct vop2_video_port *vp = &vop2->vps[i];
+
+		if (vp->gamma_lut_active)
+			vp_enable_gamma_nr++;
+	}
+
+	if (vop2->data->nr_gammas && vp_enable_gamma_nr >= vop2->data->nr_gammas) {
+		DRM_INFO("only support %d gamma\n", vop2->data->nr_gammas);
+		return;
+	}
+
 	spin_lock(&vop2->reg_lock);
 	VOP_MODULE_SET(vop2, vp, dsp_lut_en, 0);
 	vop2_cfg_done(crtc);
diff --git a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
index 7b76e5e6ed0b..2fea21461d68 100644
--- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
+++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
@@ -1249,6 +1249,7 @@ static const struct vop2_data rk3568_vop = {
 	.version = VOP_VERSION(0x40, 0x15),
 	.nr_vps = 3,
 	.nr_mixers = 5,
+	.nr_gammas = 1,
 	.max_input = { 4096, 2304 },
 	.max_output = { 4096, 2304 },
 	.ctrl = &rk3568_vop_ctrl,

commit 714a0e457dab71a4019f20571eeeb4f23b1c3f87
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Tue Jul 6 21:15:20 2021 +0800

    ASoC: rockchip: spdifrx: Replace dmaengine with rockchip pcm
    
    rockchip pcm is a wrapper of snd dmaengine pcm with customize
    config, to achieve flexible config.
    
    Change-Id: I3a4f4571962fb694814173db294891d842749983
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/sound/soc/rockchip/rockchip_spdifrx.c b/sound/soc/rockchip/rockchip_spdifrx.c
index 0e457232116d..2317ba743b3a 100644
--- a/sound/soc/rockchip/rockchip_spdifrx.c
+++ b/sound/soc/rockchip/rockchip_spdifrx.c
@@ -17,6 +17,7 @@
 #include <sound/pcm_params.h>
 #include <sound/dmaengine_pcm.h>
 
+#include "rockchip_pcm.h"
 #include "rockchip_spdifrx.h"
 
 struct rk_spdifrx_dev {
@@ -335,7 +336,7 @@ static int rk_spdifrx_probe(struct platform_device *pdev)
 		goto err_pm_suspend;
 	}
 
-	ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
+	ret = rockchip_pcm_platform_register(&pdev->dev);
 	if (ret) {
 		dev_err(&pdev->dev, "Could not register PCM\n");
 		goto err_pm_suspend;

commit 469895dbd81fc15f6d0a695c1800f6cfe09861df
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Tue Jul 6 21:15:19 2021 +0800

    ASoC: rockchip: spdif: Replace dmaengine with rockchip pcm
    
    rockchip pcm is a wrapper of snd dmaengine pcm with customize
    config, to achieve flexible config.
    
    Change-Id: I35c8058c929c9e23992010655e2f9b7bc49f632d
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/sound/soc/rockchip/rockchip_spdif.c b/sound/soc/rockchip/rockchip_spdif.c
index e8b6a2e0207e..465530d66e1c 100644
--- a/sound/soc/rockchip/rockchip_spdif.c
+++ b/sound/soc/rockchip/rockchip_spdif.c
@@ -22,6 +22,7 @@
 #include <sound/pcm_params.h>
 #include <sound/dmaengine_pcm.h>
 
+#include "rockchip_pcm.h"
 #include "rockchip_spdif.h"
 
 enum rk_spdif_type {
@@ -352,7 +353,7 @@ static int rk_spdif_probe(struct platform_device *pdev)
 		goto err_pm_suspend;
 	}
 
-	ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
+	ret = rockchip_pcm_platform_register(&pdev->dev);
 	if (ret) {
 		dev_err(&pdev->dev, "Could not register PCM\n");
 		goto err_pm_suspend;

commit e2346e901bbcfc314c795659aa8dd770989dbbb9
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Tue Jul 6 21:15:17 2021 +0800

    ASoC: rockchip: audio_pwm: Replace dmaengine with rockchip pcm
    
    rockchip pcm is a wrapper of snd dmaengine pcm with customize
    config, to achieve flexible config.
    
    Change-Id: I01ffe93ed90700cb0634a8b53d5fe044c0415f00
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/sound/soc/rockchip/rockchip_audio_pwm.c b/sound/soc/rockchip/rockchip_audio_pwm.c
index 44ca66f1ed95..4d5006469503 100644
--- a/sound/soc/rockchip/rockchip_audio_pwm.c
+++ b/sound/soc/rockchip/rockchip_audio_pwm.c
@@ -17,6 +17,7 @@
 #include <sound/pcm_params.h>
 
 #include "rockchip_audio_pwm.h"
+#include "rockchip_pcm.h"
 
 #define AUDIO_PWM_DMA_BURST_SIZE	(16) /* size * width: 16*4 = 64 bytes */
 
@@ -324,7 +325,7 @@ static int rockchip_audio_pwm_probe(struct platform_device *pdev)
 		goto err_suspend;
 	}
 
-	ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
+	ret = rockchip_pcm_platform_register(&pdev->dev);
 	if (ret) {
 		dev_err(&pdev->dev, "could not register pcm: %d\n", ret);
 		goto err_suspend;

commit d575667194c300503845fb49e830337c46e40f89
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Tue Jul 6 21:15:16 2021 +0800

    ASoC: rockchip: pdm: Replace dmaengine with rockchip pcm
    
    rockchip pcm is a wrapper of snd dmaengine pcm with customize
    config, to achieve flexible config.
    
    Change-Id: Ie073d9e94c740fec5b0d398ccd3e212af7fba519
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/sound/soc/rockchip/rockchip_pdm.c b/sound/soc/rockchip/rockchip_pdm.c
index 02c8d468b178..a54c8caca291 100644
--- a/sound/soc/rockchip/rockchip_pdm.c
+++ b/sound/soc/rockchip/rockchip_pdm.c
@@ -26,6 +26,7 @@
 #include <sound/dmaengine_pcm.h>
 #include <sound/pcm_params.h>
 
+#include "rockchip_pcm.h"
 #include "rockchip_pdm.h"
 
 #define PDM_DMA_BURST_SIZE	(8) /* size * width: 8*4 = 32 bytes */
@@ -798,7 +799,7 @@ static int rockchip_pdm_probe(struct platform_device *pdev)
 	if (of_property_read_bool(node, "rockchip,no-dmaengine"))
 		return 0;
 
-	ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
+	ret = rockchip_pcm_platform_register(&pdev->dev);
 	if (ret) {
 		dev_err(&pdev->dev, "could not register pcm: %d\n", ret);
 		goto err_suspend;

commit 9e9874fa3922bd403276a2ed7aaaa717ade63c51
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Tue Jul 6 21:15:15 2021 +0800

    ASoC: rockchip: i2s-tdm: Replace dmaengine with rockchip pcm
    
    rockchip pcm is a wrapper of snd dmaengine pcm with customize
    config, to achieve flexible config.
    
    Change-Id: I164e22dc3716075ccd520b74f03f554c075f25ec
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/sound/soc/rockchip/rockchip_i2s_tdm.c b/sound/soc/rockchip/rockchip_i2s_tdm.c
index 57c7f01a7097..080bcb756bdc 100644
--- a/sound/soc/rockchip/rockchip_i2s_tdm.c
+++ b/sound/soc/rockchip/rockchip_i2s_tdm.c
@@ -27,6 +27,7 @@
 #include <sound/dmaengine_pcm.h>
 
 #include "rockchip_i2s_tdm.h"
+#include "rockchip_pcm.h"
 
 #define DRV_NAME "rockchip-i2s-tdm"
 
@@ -1802,7 +1803,7 @@ static int rockchip_i2s_tdm_probe(struct platform_device *pdev)
 
 	if (of_property_read_bool(node, "rockchip,no-dmaengine"))
 		return ret;
-	ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
+	ret = rockchip_pcm_platform_register(&pdev->dev);
 	if (ret) {
 		dev_err(&pdev->dev, "Could not register PCM\n");
 		return ret;

commit 808eed080de4ddf457ec3d3efc9b68f98178eee3
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Tue Jul 6 21:15:13 2021 +0800

    ASoC: rockchip: Make rockchip_pcm depends on SND_SOC_ROCKCHIP
    
    This patch make rockchip_pcm.c compiled depends on SND_SOC_ROCKCHIP,
    because all the dai of rockchip will switch to use it, and we can
    do much more customize, such as minimize the prealloc buffer size.
    
    Change-Id: Ia7a3923db6760273d2291b41c194f28b43de83b2
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/sound/soc/rockchip/Makefile b/sound/soc/rockchip/Makefile
index 82e4157a3828..7541e2a636a3 100644
--- a/sound/soc/rockchip/Makefile
+++ b/sound/soc/rockchip/Makefile
@@ -14,8 +14,9 @@ snd-soc-rockchip-vad-$(CONFIG_ARM64) += vad_preprocess_arm64.o
 snd-soc-rockchip-vad-$(CONFIG_ARM) += vad_preprocess_arm.o
 endif
 
+obj-$(CONFIG_SND_SOC_ROCKCHIP) += snd-soc-rockchip-pcm.o
 obj-$(CONFIG_SND_SOC_ROCKCHIP_AUDIO_PWM) += snd-soc-rockchip-audio-pwm.o
-obj-$(CONFIG_SND_SOC_ROCKCHIP_I2S) += snd-soc-rockchip-i2s.o snd-soc-rockchip-pcm.o
+obj-$(CONFIG_SND_SOC_ROCKCHIP_I2S) += snd-soc-rockchip-i2s.o
 obj-$(CONFIG_SND_SOC_ROCKCHIP_I2S_TDM) += snd-soc-rockchip-i2s-tdm.o
 obj-$(CONFIG_SND_SOC_ROCKCHIP_PDM) += snd-soc-rockchip-pdm.o
 obj-$(CONFIG_SND_SOC_ROCKCHIP_SPDIF) += snd-soc-rockchip-spdif.o

commit b49ce3c9c78f5d7db5b56ae1007b4c82e75eb87c
Author: YouMin Chen <cym@rock-chips.com>
Date:   Mon May 31 16:09:02 2021 +0800

    soc: rockchip: rockchip_sip: add get dram frequency info support
    
    Change-Id: Ib51fba2f3c507ebaa8d6f2f028cda78353b4e9d6
    Signed-off-by: YouMin Chen <cym@rock-chips.com>

diff --git a/include/soc/rockchip/rockchip_sip.h b/include/soc/rockchip/rockchip_sip.h
index b84b3d3fa5c7..f65f9e8f916a 100644
--- a/include/soc/rockchip/rockchip_sip.h
+++ b/include/soc/rockchip/rockchip_sip.h
@@ -28,5 +28,6 @@
 #define ROCKCHIP_SIP_CONFIG_DRAM_SET_MSCH_RL	0x0a
 #define ROCKCHIP_SIP_CONFIG_DRAM_DEBUG		0x0b
 #define ROCKCHIP_SIP_CONFIG_MCU_START		0x0c
+#define ROCKCHIP_SIP_CONFIG_DRAM_GET_FREQ_INFO	0x0e
 
 #endif

commit 54d80797a4f430818f487bcdc3b165268af7570f
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Tue Jul 13 09:50:57 2021 +0800

    media: i2c: gc02m2 fixes the base value of digital gain to avoid purple in the light
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I524ba475291fd6d0e154b9276e099f81c1fae301

diff --git a/drivers/media/i2c/gc02m2.c b/drivers/media/i2c/gc02m2.c
index 6187c3bd2c84..01d02dd55788 100644
--- a/drivers/media/i2c/gc02m2.c
+++ b/drivers/media/i2c/gc02m2.c
@@ -1046,6 +1046,7 @@ static const struct v4l2_subdev_ops gc02m2_subdev_ops = {
 	.pad	= &gc02m2_pad_ops,
 };
 
+#define DIGITAL_GAIN_BASE 1024
 static int gc02m2_set_gain_reg(struct gc02m2 *gc02m2, u32 total_gain)
 {
 	struct device *dev = &gc02m2->client->dev;
@@ -1065,7 +1066,7 @@ static int gc02m2_set_gain_reg(struct gc02m2 *gc02m2, u32 total_gain)
 		GC02M2_PAGE_SELECT,	0x00);
 	ret |= gc02m2_write_reg(gc02m2->client,
 		GC02M2_ANALOG_GAIN_REG, GC02M2_AGC_Param[i][1]);
-	dgain = total_gain * 256 / GC02M2_AGC_Param[i][0];
+	dgain = total_gain * DIGITAL_GAIN_BASE / GC02M2_AGC_Param[i][0];
 
 	dev_dbg(dev, "AGC_Param[%d][0] = %d dgain = 0x%04x!\n",
 		i, GC02M2_AGC_Param[i][0], dgain);

commit 84a4932359e3ef0a6b57b3e971fe3dd50b21012a
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Mon Jul 12 10:15:35 2021 +0800

    drm/rockchip: ebc_dev: release version v2.06
    
    1.improve buf manager to aovid memleak and buf lost
    2.don't refresh overlay image when overlay disabled
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: Ib3ef89752549cf89230827ed91440b831a0544e2

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c b/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
index f0a9624548c5..68bb652b4206 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
+++ b/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
@@ -78,25 +78,36 @@ int ebc_add_to_dsp_buf_list(struct ebc_buf_s *dsp_buf)
 	mutex_lock(&ebc_buf_info.dsp_buf_lock);
 	if (ebc_buf_info.dsp_buf_list) {
 		switch (dsp_buf->buf_mode) {
+		case EPD_OVERLAY:
+			break;
 		case EPD_A2_ENTER:
 		case EPD_SUSPEND:
 		case EPD_RESUME:
 		case EPD_POWER_OFF:
-		case EPD_OVERLAY:
 		case EPD_RESET:
 		case EPD_FORCE_FULL:
-			break;
-
+			/*
+			 * add system display buf to dsp buf list directly when dsp buf list is not full,
+			 * otherwise, we need to remove some bufs from dsp buf list.
+			 */
+			if (ebc_buf_info.dsp_buf_list->nb_elt < ebc_buf_info.dsp_buf_list->maxelements)
+				break;
+			/* fallthrough */
 		default:
 			if (ebc_buf_info.dsp_buf_list->nb_elt > 1) {
 				temp_pos = ebc_buf_info.dsp_buf_list->nb_elt;
 				while (--temp_pos) {
 					temp_buf = (struct ebc_buf_s *)buf_list_get(ebc_buf_info.dsp_buf_list, temp_pos);
-					if ((temp_buf->buf_mode >= EPD_PART_GC16) && (temp_buf->buf_mode <= EPD_DU4)) {
+					if (temp_buf->buf_mode == EPD_OVERLAY) {
+						continue;
+					} else if (((temp_buf->buf_mode >= EPD_FULL_GC16) && (temp_buf->buf_mode <= EPD_DU4))
+						|| (temp_buf->buf_mode == EPD_AUTO)) {
 						buf_list_remove(ebc_buf_info.dsp_buf_list, temp_pos);
 						ebc_buf_release(temp_buf);
-					} else if ((1 == is_full_mode) && (temp_buf->buf_mode >= EPD_FULL_GC16)
-						   && (temp_buf->buf_mode <= EPD_FULL_GCC16)) {
+					} else if ((1 == is_full_mode)
+							&& (temp_buf->buf_mode != EPD_SUSPEND)
+							&& (temp_buf->buf_mode != EPD_RESUME)
+							&& (temp_buf->buf_mode != EPD_POWER_OFF)) {
 						buf_list_remove(ebc_buf_info.dsp_buf_list, temp_pos);
 						ebc_buf_release(temp_buf);
 					} else {
@@ -107,11 +118,15 @@ int ebc_add_to_dsp_buf_list(struct ebc_buf_s *dsp_buf)
 			break;
 		}
 
-		dsp_buf->status = buf_dsp;
 		if (-1 == buf_list_add(ebc_buf_info.dsp_buf_list, (int *)dsp_buf, -1)) {
+			ebc_buf_release(dsp_buf);
 			mutex_unlock(&ebc_buf_info.dsp_buf_lock);
 			return BUF_ERROR;
 		}
+
+		if (dsp_buf->status != buf_osd)
+			dsp_buf->status = buf_dsp;
+
 	}
 	mutex_unlock(&ebc_buf_info.dsp_buf_lock);
 
@@ -198,7 +213,6 @@ struct ebc_buf_s *ebc_empty_buf_get(void)
 			}
 		}
 		ebc_buf_info.use_buf_is_empty = 1;
-
 		wait_event_interruptible(ebc_buf_wq, ebc_buf_info.use_buf_is_empty != 1);
 	}
 
@@ -217,6 +231,23 @@ char *ebc_virt_buf_base_get(void)
 	return ebc_buf_info.virt_mem_base;
 }
 
+int ebc_buf_state_show(char *buf)
+{
+	int i;
+	int ret = 0;
+	struct ebc_buf_s *temp_buf;
+
+	ret += sprintf(buf, "dsp_buf num = %d\n", ebc_buf_info.dsp_buf_list->nb_elt);
+	if (ebc_buf_info.buf_list) {
+		for (i = 0; i < ebc_buf_info.buf_list->nb_elt; i++) {
+			temp_buf = (struct ebc_buf_s *)buf_list_get(ebc_buf_info.buf_list, i);
+			ret += sprintf(buf + ret, "ebc_buf[%d]: s = %d, m = %d\n", i, temp_buf->status, temp_buf->buf_mode);
+		}
+	}
+
+	return ret;
+}
+
 int ebc_buf_uninit(void)
 {
 	struct ebc_buf_s *temp_buf;
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h b/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h
index 745cdbf9cfde..695e64645b76 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h
+++ b/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h
@@ -43,6 +43,7 @@ struct ebc_buf_s *ebc_find_buf_by_phy_addr(unsigned long phy_addr);
 struct ebc_buf_s *ebc_empty_buf_get(void);
 unsigned long ebc_phy_buf_base_get(void);
 char *ebc_virt_buf_base_get(void);
+int ebc_buf_state_show(char *buf);
 int ebc_buf_uninit(void);
 int ebc_buf_init(unsigned long phy_start, char *mem_start, int men_len, int dest_buf_len, int max_buf_num);
 #endif
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index 79bf73229def..19825f6518fd 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -530,15 +530,15 @@ get_auto_image:
 	.type	ebc_open, %function
 ebc_open:
 .LFB2832:
-	.loc 1 1711 0
+	.loc 1 1709 0
 	.cfi_startproc
 .LVL32:
-	.loc 1 1715 0
+	.loc 1 1713 0
 	mov	w0, 0
 .LVL33:
-	.loc 1 1712 0
+	.loc 1 1710 0
 	str	xzr, [x1, 104]
-	.loc 1 1715 0
+	.loc 1 1713 0
 	ret
 	.cfi_endproc
 .LFE2832:
@@ -547,38 +547,38 @@ ebc_open:
 	.align	2
 	.type	ebc_exit, %function
 ebc_exit:
-.LFB2851:
-	.loc 1 2258 0
+.LFB2852:
+	.loc 1 2266 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2259 0
+	.loc 1 2267 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2258 0
+	.loc 1 2266 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2259 0
+	.loc 1 2267 0
 	bl	platform_driver_unregister
 .LVL34:
-	.loc 1 2260 0
+	.loc 1 2268 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2851:
+.LFE2852:
 	.size	ebc_exit, .-ebc_exit
 	.text
 	.align	2
 	.p2align 3,,7
 	.type	ebc_resume, %function
 ebc_resume:
-.LFB2849:
-	.loc 1 2220 0
+.LFB2850:
+	.loc 1 2228 0
 	.cfi_startproc
 .LVL35:
 	stp	x29, x30, [sp, -32]!
@@ -596,7 +596,7 @@ ebc_resume:
 	ldr	x19, [x0, 184]
 .LBE927:
 .LBE926:
-	.loc 1 2224 0
+	.loc 1 2232 0
 	ldr	x1, [x19, 16]
 .LBB928:
 .LBB929:
@@ -609,15 +609,15 @@ ebc_resume:
 .LVL37:
 .LBE929:
 .LBE928:
-	.loc 1 2225 0
+	.loc 1 2233 0
 	str	wzr, [x19, 780]
-	.loc 1 2226 0
+	.loc 1 2234 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
 .LVL38:
-	.loc 1 2229 0
+	.loc 1 2237 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -627,27 +627,27 @@ ebc_resume:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2849:
+.LFE2850:
 	.size	ebc_resume, .-ebc_resume
 	.align	2
 	.p2align 3,,7
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
 .LFB2827:
-	.loc 1 1410 0
+	.loc 1 1408 0
 	.cfi_startproc
 .LVL39:
-	.loc 1 1411 0
+	.loc 1 1409 0
 	adrp	x0, .LANCHOR0
 .LVL40:
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1413 0
+	.loc 1 1411 0
 	ldr	w2, [x0, 608]
 	cbnz	w2, .L80
 	ret
 	.p2align 3
 .L80:
-	.loc 1 1410 0
+	.loc 1 1408 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -659,10 +659,10 @@ ebc_vdd_power_timeout:
 	add	x0, x0, 400
 .LBE931:
 .LBE930:
-	.loc 1 1410 0
+	.loc 1 1408 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1414 0
+	.loc 1 1412 0
 	str	wzr, [x0, 208]
 .LBB933:
 .LBB932:
@@ -671,7 +671,7 @@ ebc_vdd_power_timeout:
 .LVL41:
 .LBE932:
 .LBE933:
-	.loc 1 1419 0
+	.loc 1 1417 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -684,28 +684,28 @@ ebc_vdd_power_timeout:
 	.p2align 3,,7
 	.type	ebc_remove, %function
 ebc_remove:
-.LFB2847:
-	.loc 1 2196 0
+.LFB2848:
+	.loc 1 2204 0
 	.cfi_startproc
 .LVL42:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2197 0
+	.loc 1 2205 0
 	adrp	x0, .LANCHOR1
 .LVL43:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2196 0
+	.loc 1 2204 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2197 0
+	.loc 1 2205 0
 	add	x0, x0, 224
-	.loc 1 2196 0
-	.loc 1 2197 0
+	.loc 1 2204 0
+	.loc 1 2205 0
 	bl	misc_deregister
 .LVL44:
-	.loc 1 2200 0
+	.loc 1 2208 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -713,14 +713,14 @@ ebc_remove:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2847:
+.LFE2848:
 	.size	ebc_remove, .-ebc_remove
 	.align	2
 	.p2align 3,,7
 	.type	ebc_mmap, %function
 ebc_mmap:
 .LFB2831:
-	.loc 1 1696 0
+	.loc 1 1694 0
 	.cfi_startproc
 .LVL45:
 	stp	x29, x30, [sp, -32]!
@@ -731,33 +731,33 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1696 0
+	.loc 1 1694 0
 	mov	x19, x1
-	.loc 1 1699 0
+	.loc 1 1697 0
 	bl	ebc_phy_buf_base_get
 .LVL46:
-	.loc 1 1702 0
-	lsr	x2, x0, 12
 	.loc 1 1700 0
+	lsr	x2, x0, 12
+	.loc 1 1698 0
 	mov	x6, 16384
-	.loc 1 1702 0
-	mov	x0, x19
 	.loc 1 1700 0
+	mov	x0, x19
+	.loc 1 1698 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 1702 0
-	ldp	x1, x3, [x19]
 	.loc 1 1700 0
+	ldp	x1, x3, [x19]
+	.loc 1 1698 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 1702 0
+	.loc 1 1700 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
 .LVL47:
-	.loc 1 1705 0
+	.loc 1 1703 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 1708 0
+	.loc 1 1706 0
 	ldr	x19, [sp, 16]
 .LVL48:
 	csel	w0, w0, w1, eq
@@ -775,16 +775,16 @@ ebc_mmap:
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
 .LFB2830:
-	.loc 1 1495 0
+	.loc 1 1493 0
 	.cfi_startproc
 .LVL49:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 1505 0
+	.loc 1 1503 0
 	cmp	w1, 28672
-	.loc 1 1495 0
+	.loc 1 1493 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -798,15 +798,15 @@ ebc_io_ctl:
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
 	.cfi_offset 23, -112
-	.loc 1 1495 0
+	.loc 1 1493 0
 	mov	x21, x2
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 1497 0
+	.loc 1 1495 0
 	adrp	x0, .LANCHOR0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1505 0
+	.loc 1 1503 0
 	bcc	.L88
 	mov	w0, 28675
 	cmp	w1, w0
@@ -816,7 +816,7 @@ ebc_io_ctl:
 	cmp	w0, 1
 	bls	.L89
 .L88:
-	.loc 1 1521 0
+	.loc 1 1519 0
 	mov	w0, 28677
 	cmp	w1, w0
 	beq	.L92
@@ -832,13 +832,13 @@ ebc_io_ctl:
 	mov	w0, 28683
 	cmp	w1, w0
 	bne	.L91
-	.loc 1 1673 0
+	.loc 1 1671 0
 	bl	ebc_empty_buf_get
 .LVL51:
 	mov	x23, x0
-	.loc 1 1674 0
+	.loc 1 1672 0
 	cbz	x0, .L112
-	.loc 1 1676 0
+	.loc 1 1674 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 392]
@@ -849,7 +849,7 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL52:
-	.loc 1 1677 0
+	.loc 1 1675 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL53:
@@ -879,11 +879,11 @@ ebc_io_ctl:
 .LBE936:
 .LBE935:
 .LBE934:
-	.loc 1 1679 0
+	.loc 1 1677 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 1678 0
+	.loc 1 1676 0
 	str	w0, [x29, 104]
-	.loc 1 1680 0
+	.loc 1 1678 0
 	stp	w4, w1, [x29, 112]
 .LBB965:
 .LBB962:
@@ -912,7 +912,7 @@ ebc_io_ctl:
 .LBE959:
 .LBE962:
 .LBE965:
-	.loc 1 1496 0
+	.loc 1 1494 0
 	mov	x0, x21
 .LVL58:
 .LBB966:
@@ -960,36 +960,36 @@ ebc_io_ctl:
 .LBE960:
 .LBE963:
 .LBE966:
-	.loc 1 1682 0
+	.loc 1 1680 0
 	mov	x0, x23
 .LVL63:
 	bl	ebc_buf_release
 .LVL64:
-	.loc 1 1683 0
+	.loc 1 1681 0
 	b	.L87
 .LVL65:
 	.p2align 3
 .L89:
-	.loc 1 1512 0
+	.loc 1 1510 0
 	cbnz	x21, .L88
-	.loc 1 1513 0
+	.loc 1 1511 0
 	ldr	x0, [x20, 272]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
 .LVL66:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC1
-	.loc 1 1514 0
+	.loc 1 1512 0
 	mov	x22, -14
-	.loc 1 1513 0
+	.loc 1 1511 0
 	bl	_dev_err
 .LVL67:
-	.loc 1 1514 0
+	.loc 1 1512 0
 	b	.L87
 .LVL68:
 	.p2align 3
 .L221:
-	.loc 1 1521 0
+	.loc 1 1519 0
 	mov	w0, 28674
 	cmp	w1, w0
 	beq	.L94
@@ -1000,23 +1000,23 @@ ebc_io_ctl:
 	mov	w0, 28676
 	cmp	w1, w0
 	bne	.L91
-	.loc 1 1605 0
+	.loc 1 1603 0
 	ldr	x0, [x20, 272]
-	.loc 1 1604 0
+	.loc 1 1602 0
 	mov	w2, 1
 	str	w2, [x20, 788]
-	.loc 1 1605 0
+	.loc 1 1603 0
 	adrp	x1, .LC2
 .LVL69:
-	.loc 1 1606 0
+	.loc 1 1604 0
 	mov	x22, 0
-	.loc 1 1605 0
+	.loc 1 1603 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
 .LVL70:
 	.p2align 2
 .L87:
-	.loc 1 1693 0
+	.loc 1 1691 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
 .LVL71:
@@ -1044,7 +1044,7 @@ ebc_io_ctl:
 	.p2align 3
 .L224:
 	.cfi_restore_state
-	.loc 1 1521 0
+	.loc 1 1519 0
 	cmp	w1, 28672
 	beq	.L96
 	mov	w0, 28673
@@ -1158,53 +1158,53 @@ ebc_io_ctl:
 .LBE969:
 .LBE968:
 .LBE967:
-	.loc 1 1559 0
+	.loc 1 1557 0
 	bl	ebc_phy_buf_base_get
 .LVL87:
 	ldrsw	x1, [x29, 104]
-	.loc 1 1560 0
+	.loc 1 1558 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
 .LVL88:
 	mov	x21, x0
 .LVL89:
-	.loc 1 1561 0
+	.loc 1 1559 0
 	cbz	x0, .L127
-	.loc 1 1562 0
+	.loc 1 1560 0
 	ldr	w5, [x29, 108]
-	.loc 1 1571 0
+	.loc 1 1569 0
 	add	x20, x20, 184
-	.loc 1 1566 0
+	.loc 1 1564 0
 	ldp	w4, w2, [x29, 124]
-	.loc 1 1562 0
+	.loc 1 1560 0
 	str	w5, [x21, 40]
-	.loc 1 1567 0
+	.loc 1 1565 0
 	ldp	w3, w1, [x29, 132]
-	.loc 1 1566 0
+	.loc 1 1564 0
 	stp	w4, w2, [x21, 48]
-	.loc 1 1567 0
+	.loc 1 1565 0
 	stp	w3, w1, [x21, 56]
-	.loc 1 1569 0
+	.loc 1 1567 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL90:
-	.loc 1 1571 0
+	.loc 1 1569 0
 	ldr	w0, [x20, 80]
 	cbz	w0, .L227
 .L122:
-	.loc 1 1575 0
+	.loc 1 1573 0
 	ldr	w0, [x21, 40]
 	cmp	w0, 17
 	beq	.L228
-	.loc 1 1575 0 is_stmt 0 discriminator 3
+	.loc 1 1573 0 is_stmt 0 discriminator 3
 	cmp	w0, 19
 	bne	.L127
 .L124:
-	.loc 1 1576 0 is_stmt 1
+	.loc 1 1574 0 is_stmt 1
 	mov	w0, 1
 	str	w0, [x20, 188]
 .LBB996:
 .LBB997:
-	.loc 1 1577 0
+	.loc 1 1575 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
@@ -1217,13 +1217,13 @@ ebc_io_ctl:
 	.p2align 3
 .L229:
 .LVL92:
-	.loc 1 1577 0 is_stmt 0 discriminator 5
+	.loc 1 1575 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L127
-	.loc 1 1577 0 discriminator 7
+	.loc 1 1575 0 discriminator 7
 	bl	schedule
 .LVL93:
 .L128:
-	.loc 1 1577 0 discriminator 9
+	.loc 1 1575 0 discriminator 9
 	add	x1, x29, 64
 	mov	w2, 1
 	mov	x0, x21
@@ -1232,7 +1232,7 @@ ebc_io_ctl:
 	ldr	w1, [x20, 188]
 	cbnz	w1, .L229
 .LBE998:
-	.loc 1 1577 0 discriminator 4
+	.loc 1 1575 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
 	bl	finish_wait
@@ -1246,13 +1246,13 @@ ebc_io_ctl:
 .L104:
 .LBE997:
 .LBE996:
-	.loc 1 1660 0 is_stmt 1
+	.loc 1 1658 0 is_stmt 1
 	bl	ebc_empty_buf_get
 .LVL97:
 	mov	x23, x0
-	.loc 1 1661 0
+	.loc 1 1659 0
 	cbz	x0, .L112
-	.loc 1 1663 0
+	.loc 1 1661 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 328]
@@ -1262,7 +1262,7 @@ ebc_io_ctl:
 .LVL98:
 	.p2align 3
 .L222:
-	.loc 1 1521 0
+	.loc 1 1519 0
 	mov	w0, 28678
 	cmp	w1, w0
 	beq	.L102
@@ -1377,36 +1377,36 @@ ebc_io_ctl:
 .LBE1004:
 .LBE1003:
 .LBE1002:
-	.loc 1 1586 0
+	.loc 1 1584 0
 	bl	ebc_osd_buf_clone
 .LVL111:
 	mov	x1, x0
-	.loc 1 1587 0
+	.loc 1 1585 0
 	cbz	x0, .L127
-	.loc 1 1588 0
+	.loc 1 1586 0
 	ldr	w6, [x29, 108]
-	.loc 1 1597 0
+	.loc 1 1595 0
 	add	x20, x20, 184
-	.loc 1 1592 0
+	.loc 1 1590 0
 	ldp	w5, w3, [x29, 124]
-	.loc 1 1588 0
+	.loc 1 1586 0
 	str	w6, [x1, 40]
-	.loc 1 1593 0
+	.loc 1 1591 0
 	ldp	w4, w2, [x29, 132]
-	.loc 1 1592 0
+	.loc 1 1590 0
 	stp	w5, w3, [x1, 48]
-	.loc 1 1593 0
+	.loc 1 1591 0
 	stp	w4, w2, [x1, 56]
-	.loc 1 1595 0
+	.loc 1 1593 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL112:
-	.loc 1 1597 0
+	.loc 1 1595 0
 	ldr	w0, [x20, 80]
 	cbnz	w0, .L127
-	.loc 1 1598 0
+	.loc 1 1596 0
 	mov	w2, 1
 	str	w2, [x20, 80]
-	.loc 1 1599 0
+	.loc 1 1597 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -1479,12 +1479,12 @@ ebc_io_ctl:
 .LBE961:
 .LBE964:
 .LBE1031:
-	.loc 1 1523 0
+	.loc 1 1521 0
 	bl	ebc_osd_buf_get
 .LVL123:
-	.loc 1 1524 0
+	.loc 1 1522 0
 	cbz	x0, .L112
-	.loc 1 1527 0
+	.loc 1 1525 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL124:
@@ -1511,17 +1511,17 @@ ebc_io_ctl:
 .LBE1034:
 .LBE1033:
 .LBE1032:
-	.loc 1 1527 0
+	.loc 1 1525 0
 	sub	w0, w22, w0
-	.loc 1 1532 0
+	.loc 1 1530 0
 	ldr	w1, [x20, 176]
-	.loc 1 1531 0
+	.loc 1 1529 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1530 0
+	.loc 1 1528 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1532 0
+	.loc 1 1530 0
 	str	w1, [x29, 120]
-	.loc 1 1529 0
+	.loc 1 1527 0
 	str	w0, [x29, 104]
 .LBB1065:
 .LBB1062:
@@ -1646,7 +1646,7 @@ ebc_io_ctl:
 .LBE1068:
 .LBE1067:
 .LBE1066:
-	.loc 1 1613 0
+	.loc 1 1611 0
 	add	x22, x20, 232
 .LBB1101:
 .LBB1097:
@@ -1743,49 +1743,49 @@ ebc_io_ctl:
 .LBE1093:
 .LBE1097:
 .LBE1101:
-	.loc 1 1617 0
+	.loc 1 1615 0
 	add	x20, x20, 184
 	ldr	w2, [x20, 48]
 	ldr	x0, [x20, 88]
 .LVL150:
-	.loc 1 1618 0
+	.loc 1 1616 0
 	mov	x22, 0
-	.loc 1 1617 0
+	.loc 1 1615 0
 	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	_dev_info
 .LVL151:
-	.loc 1 1618 0
+	.loc 1 1616 0
 	b	.L87
 .LVL152:
 	.p2align 3
 .L92:
-	.loc 1 1610 0
+	.loc 1 1608 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC3
 .LVL153:
-	.loc 1 1608 0
+	.loc 1 1606 0
 	str	wzr, [x20, 788]
-	.loc 1 1611 0
-	mov	x22, 0
 	.loc 1 1609 0
+	mov	x22, 0
+	.loc 1 1607 0
 	str	wzr, [x20, 792]
-	.loc 1 1610 0
+	.loc 1 1608 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
 .LVL154:
-	.loc 1 1611 0
+	.loc 1 1609 0
 	b	.L87
 .LVL155:
 	.p2align 3
 .L100:
-	.loc 1 1647 0
+	.loc 1 1645 0
 	bl	ebc_empty_buf_get
 .LVL156:
 	mov	x23, x0
-	.loc 1 1648 0
+	.loc 1 1646 0
 	cbz	x0, .L112
-	.loc 1 1650 0
+	.loc 1 1648 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 320]
@@ -1795,13 +1795,13 @@ ebc_io_ctl:
 .LVL157:
 	.p2align 3
 .L105:
-	.loc 1 1634 0
+	.loc 1 1632 0
 	bl	ebc_empty_buf_get
 .LVL158:
 	mov	x23, x0
-	.loc 1 1635 0
+	.loc 1 1633 0
 	cbz	x0, .L112
-	.loc 1 1637 0
+	.loc 1 1635 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 312]
@@ -1810,7 +1810,7 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL159:
-	.loc 1 1638 0
+	.loc 1 1636 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL160:
@@ -1838,11 +1838,11 @@ ebc_io_ctl:
 .LBE1104:
 .LBE1103:
 .LBE1102:
-	.loc 1 1641 0
-	ldp	w4, w1, [x22, 84]
 	.loc 1 1639 0
+	ldp	w4, w1, [x22, 84]
+	.loc 1 1637 0
 	str	w0, [x29, 104]
-	.loc 1 1640 0
+	.loc 1 1638 0
 	stp	w1, w4, [x29, 112]
 .LBB1113:
 .LBB1112:
@@ -1886,15 +1886,15 @@ ebc_io_ctl:
 .LBE1116:
 .LBE1115:
 .LBE1114:
-	.loc 1 1624 0
+	.loc 1 1622 0
 	ldp	w1, w0, [x20, 116]
 .LVL165:
 	stp	w1, w0, [x29, 140]
-	.loc 1 1621 0
+	.loc 1 1619 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 1620 0
+	.loc 1 1618 0
 	stp	w5, w6, [x29, 112]
-	.loc 1 1622 0
+	.loc 1 1620 0
 	ldr	w4, [x20, 176]
 	str	w4, [x29, 120]
 .LBB1149:
@@ -1942,46 +1942,46 @@ ebc_io_ctl:
 .LBE1141:
 .LBE1145:
 .LBE1149:
-	.loc 1 1627 0
+	.loc 1 1625 0
 	ldr	x0, [x20, 272]
 .LVL171:
 	adrp	x1, .LC5
 .LVL172:
-	.loc 1 1628 0
+	.loc 1 1626 0
 	mov	x22, -14
-	.loc 1 1627 0
+	.loc 1 1625 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
 .LVL173:
-	.loc 1 1628 0
+	.loc 1 1626 0
 	b	.L87
 .LVL174:
 	.p2align 3
 .L91:
-	.loc 1 1688 0
+	.loc 1 1686 0
 	ldr	x0, [x20, 272]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
 .LVL175:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
-	.loc 1 1689 0
+	.loc 1 1687 0
 	mov	x22, 0
-	.loc 1 1688 0
+	.loc 1 1686 0
 	bl	_dev_err
 .LVL176:
-	.loc 1 1692 0
+	.loc 1 1690 0
 	b	.L87
 .LVL177:
 	.p2align 3
 .L96:
-	.loc 1 1537 0
+	.loc 1 1535 0
 	bl	ebc_empty_buf_get
 .LVL178:
 	mov	x23, x0
-	.loc 1 1538 0
+	.loc 1 1536 0
 	cbz	x0, .L112
-	.loc 1 1541 0
+	.loc 1 1539 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL179:
@@ -2008,17 +2008,17 @@ ebc_io_ctl:
 .LBE1152:
 .LBE1151:
 .LBE1150:
-	.loc 1 1541 0
+	.loc 1 1539 0
 	sub	w0, w22, w0
-	.loc 1 1546 0
+	.loc 1 1544 0
 	ldr	w1, [x20, 176]
-	.loc 1 1545 0
+	.loc 1 1543 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1544 0
+	.loc 1 1542 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1546 0
+	.loc 1 1544 0
 	str	w1, [x29, 120]
-	.loc 1 1543 0
+	.loc 1 1541 0
 	str	w0, [x29, 104]
 .LBB1185:
 .LBB1181:
@@ -2065,15 +2065,15 @@ ebc_io_ctl:
 .LBE1177:
 .LBE1181:
 .LBE1185:
-	.loc 1 1550 0
+	.loc 1 1548 0
 	mov	x0, x23
 .LVL186:
-	.loc 1 1551 0
+	.loc 1 1549 0
 	mov	x22, -14
-	.loc 1 1550 0
+	.loc 1 1548 0
 	bl	ebc_buf_release
 .LVL187:
-	.loc 1 1551 0
+	.loc 1 1549 0
 	b	.L87
 .LVL188:
 	.p2align 3
@@ -2096,7 +2096,7 @@ ebc_io_ctl:
 .LBE1027:
 .LBE1029:
 .LBE1186:
-	.loc 1 1496 0
+	.loc 1 1494 0
 	mov	x0, x21
 .LVL189:
 .LBB1187:
@@ -2133,7 +2133,7 @@ ebc_io_ctl:
 .LBE992:
 .LBE994:
 .LBE1188:
-	.loc 1 1496 0
+	.loc 1 1494 0
 	mov	x0, x21
 .LVL191:
 .LBB1189:
@@ -2171,7 +2171,7 @@ ebc_io_ctl:
 .LBE1142:
 .LBE1146:
 .LBE1190:
-	.loc 1 1496 0
+	.loc 1 1494 0
 	mov	x0, x21
 .LVL194:
 .LBB1191:
@@ -2208,7 +2208,7 @@ ebc_io_ctl:
 .LBE1094:
 .LBE1098:
 .LBE1192:
-	.loc 1 1496 0
+	.loc 1 1494 0
 	mov	x0, x21
 .LVL196:
 .LBB1193:
@@ -2246,7 +2246,7 @@ ebc_io_ctl:
 .LBE1178:
 .LBE1182:
 .LBE1194:
-	.loc 1 1496 0
+	.loc 1 1494 0
 	mov	x0, x21
 .LVL199:
 .LBB1195:
@@ -2284,7 +2284,7 @@ ebc_io_ctl:
 .LBE1060:
 .LBE1063:
 .LBE1196:
-	.loc 1 1496 0
+	.loc 1 1494 0
 	mov	x0, x21
 .LVL202:
 .LBB1197:
@@ -2359,7 +2359,7 @@ ebc_io_ctl:
 .LBE1144:
 .LBE1148:
 .LBE1198:
-	.loc 1 1626 0
+	.loc 1 1624 0
 	cbnz	x0, .L139
 .LBB1199:
 .LBB999:
@@ -2426,7 +2426,7 @@ ebc_io_ctl:
 .LBE1180:
 .LBE1184:
 .LBE1200:
-	.loc 1 1549 0
+	.loc 1 1547 0
 	cbnz	w0, .L116
 .LBB1201:
 .LBB1000:
@@ -2437,16 +2437,16 @@ ebc_io_ctl:
 .L120:
 .LBE1000:
 .LBE1201:
-	.loc 1 1557 0
+	.loc 1 1555 0
 	mov	x22, -14
 	b	.L87
 .LVL220:
 	.p2align 3
 .L227:
-	.loc 1 1572 0
+	.loc 1 1570 0
 	mov	w2, 1
 	str	w2, [x20, 80]
-	.loc 1 1573 0
+	.loc 1 1571 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -2456,7 +2456,7 @@ ebc_io_ctl:
 	b	.L122
 	.p2align 3
 .L228:
-	.loc 1 1575 0 discriminator 1
+	.loc 1 1573 0 discriminator 1
 	ldr	w0, [x20, 592]
 	cbz	w0, .L124
 .LBB1202:
@@ -2467,7 +2467,7 @@ ebc_io_ctl:
 .L112:
 .LBE1001:
 .LBE1202:
-	.loc 1 1525 0
+	.loc 1 1523 0
 	mov	x22, -1
 	b	.L87
 .LVL223:
@@ -2490,19 +2490,19 @@ ebc_io_ctl:
 .LBE1096:
 .LBE1100:
 .LBE1203:
-	.loc 1 1614 0
+	.loc 1 1612 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC4
-	.loc 1 1615 0
+	.loc 1 1613 0
 	mov	x22, -14
-	.loc 1 1614 0
+	.loc 1 1612 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
 .LVL228:
-	.loc 1 1615 0
+	.loc 1 1613 0
 	b	.L87
 .L225:
-	.loc 1 1693 0
+	.loc 1 1691 0
 	bl	__stack_chk_fail
 .LVL229:
 .L233:
@@ -2698,7 +2698,7 @@ frame_done_callback:
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
 .LFB2828:
-	.loc 1 1422 0
+	.loc 1 1420 0
 	.cfi_startproc
 .LVL241:
 	stp	x29, x30, [sp, -16]!
@@ -2707,10 +2707,10 @@ ebc_frame_timeout:
 	.cfi_offset 30, -8
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1423 0
+	.loc 1 1421 0
 	bl	frame_done_callback
 .LVL242:
-	.loc 1 1425 0
+	.loc 1 1423 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3006,35 +3006,66 @@ ebc_lut_update:
 	.size	ebc_lut_update, .-ebc_lut_update
 	.align	2
 	.p2align 3,,7
+	.type	ebc_buf_state_read, %function
+ebc_buf_state_read:
+.LFB2840:
+	.loc 1 1824 0
+	.cfi_startproc
+.LVL268:
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	.loc 1 1825 0
+	mov	x0, x2
+.LVL269:
+	.loc 1 1824 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 1825 0
+	bl	ebc_buf_state_show
+.LVL270:
+	.loc 1 1826 0
+	sxtw	x0, w0
+	ldp	x29, x30, [sp], 16
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE2840:
+	.size	ebc_buf_state_read, .-ebc_buf_state_read
+	.align	2
+	.p2align 3,,7
 	.type	ebc_state_read, %function
 ebc_state_read:
 .LFB2839:
-	.loc 1 1817 0
+	.loc 1 1815 0
 	.cfi_startproc
-.LVL268:
+.LVL271:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1818 0
+	.loc 1 1816 0
 	adrp	x3, .LANCHOR0
-	.loc 1 1817 0
+	.loc 1 1815 0
 	mov	x0, x2
-.LVL269:
-	.loc 1 1818 0
+.LVL272:
+	.loc 1 1816 0
 	adrp	x1, .LC15
-.LVL270:
-	.loc 1 1817 0
+.LVL273:
+	.loc 1 1815 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1818 0
+	.loc 1 1816 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL271:
+.LVL274:
 	add	x1, x1, :lo12:.LC15
 	ldr	w2, [x2, 608]
 	bl	sprintf
-.LVL272:
-	.loc 1 1819 0
+.LVL275:
+	.loc 1 1817 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3049,31 +3080,31 @@ ebc_state_read:
 	.type	ebc_version_read, %function
 ebc_version_read:
 .LFB2838:
-	.loc 1 1808 0
+	.loc 1 1806 0
 	.cfi_startproc
-.LVL273:
+.LVL276:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mov	x0, x2
-.LVL274:
-	.loc 1 1809 0
+.LVL277:
+	.loc 1 1807 0
 	adrp	x1, .LC17
-.LVL275:
+.LVL278:
 	adrp	x2, .LC16
-.LVL276:
-	.loc 1 1808 0
+.LVL279:
+	.loc 1 1806 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1809 0
+	.loc 1 1807 0
 	add	x2, x2, :lo12:.LC16
-	.loc 1 1808 0
-	.loc 1 1809 0
+	.loc 1 1806 0
+	.loc 1 1807 0
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
-.LVL277:
-	.loc 1 1810 0
+.LVL280:
+	.loc 1 1808 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3088,49 +3119,49 @@ ebc_version_read:
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
 .LFB2836:
-	.loc 1 1772 0
+	.loc 1 1770 0
 	.cfi_startproc
-.LVL278:
+.LVL281:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 1773 0
+	.loc 1 1771 0
 	adrp	x0, .LANCHOR0
-.LVL279:
-	.loc 1 1772 0
+.LVL282:
+	.loc 1 1770 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1776 0
+	.loc 1 1774 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1772 0
+	.loc 1 1770 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1772 0
+	.loc 1 1770 0
 	mov	x19, x2
-	.loc 1 1776 0
+	.loc 1 1774 0
 	ldr	x1, [x0, 16]
-.LVL280:
+.LVL283:
 .LBB1206:
 .LBB1207:
 	.loc 3 55 0
 	mov	x0, x1
 	ldr	x1, [x1, 64]
 	blr	x1
-.LVL281:
+.LVL284:
 .LBE1207:
 .LBE1206:
-	.loc 1 1778 0
+	.loc 1 1776 0
 	mov	w2, w0
 	adrp	x1, .LC15
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
-.LVL282:
-	.loc 1 1779 0
+.LVL285:
+	.loc 1 1777 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL283:
+.LVL286:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3145,41 +3176,41 @@ pmic_vcom_read:
 	.type	pmic_temp_read, %function
 pmic_temp_read:
 .LFB2835:
-	.loc 1 1758 0
+	.loc 1 1756 0
 	.cfi_startproc
-.LVL284:
+.LVL287:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 1759 0
+	.loc 1 1757 0
 	adrp	x0, .LANCHOR0
-.LVL285:
-	.loc 1 1758 0
+.LVL288:
+	.loc 1 1756 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1762 0
+	.loc 1 1760 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
 .LBB1208:
 .LBB1209:
 	.loc 3 50 0
 	add	x1, x29, 36
-.LVL286:
+.LVL289:
 .LBE1209:
 .LBE1208:
-	.loc 1 1758 0
+	.loc 1 1756 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 1758 0
+	.loc 1 1756 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
-.LVL287:
-	.loc 1 1762 0
+.LVL290:
+	.loc 1 1760 0
 	ldr	x2, [x0, 16]
 .LBB1211:
 .LBB1210:
@@ -3187,23 +3218,23 @@ pmic_temp_read:
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL288:
+.LVL291:
 .LBE1210:
 .LBE1211:
-	.loc 1 1764 0
+	.loc 1 1762 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC15
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
-.LVL289:
-	.loc 1 1765 0
+.LVL292:
+	.loc 1 1763 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L284
+	cbnz	x1, .L286
 	ldp	x19, x20, [sp, 16]
-.LVL290:
+.LVL293:
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -3213,11 +3244,11 @@ pmic_temp_read:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL291:
-.L284:
+.LVL294:
+.L286:
 	.cfi_restore_state
 	bl	__stack_chk_fail
-.LVL292:
+.LVL295:
 	.cfi_endproc
 .LFE2835:
 	.size	pmic_temp_read, .-pmic_temp_read
@@ -3226,33 +3257,33 @@ pmic_temp_read:
 	.type	pmic_name_read, %function
 pmic_name_read:
 .LFB2834:
-	.loc 1 1747 0
+	.loc 1 1745 0
 	.cfi_startproc
-.LVL293:
+.LVL296:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1748 0
+	.loc 1 1746 0
 	adrp	x3, .LANCHOR0
-	.loc 1 1747 0
+	.loc 1 1745 0
 	mov	x0, x2
-.LVL294:
-	.loc 1 1750 0
+.LVL297:
+	.loc 1 1748 0
 	adrp	x1, .LC17
-.LVL295:
-	.loc 1 1747 0
+.LVL298:
+	.loc 1 1745 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1750 0
+	.loc 1 1748 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL296:
+.LVL299:
 	add	x1, x1, :lo12:.LC17
 	ldr	x2, [x2, 16]
 	add	x2, x2, 8
 	bl	sprintf
-.LVL297:
-	.loc 1 1751 0
+.LVL300:
+	.loc 1 1749 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3267,17 +3298,17 @@ pmic_name_read:
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
 .LFB2837:
-	.loc 1 1784 0
+	.loc 1 1782 0
 	.cfi_startproc
-.LVL298:
+.LVL301:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 1785 0
+	.loc 1 1783 0
 	adrp	x0, .LANCHOR0
-.LVL299:
-	.loc 1 1784 0
+.LVL302:
+	.loc 1 1782 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -3287,47 +3318,47 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 1784 0
+	.loc 1 1782 0
 	add	x1, x19, :lo12:__stack_chk_guard
-.LVL300:
+.LVL303:
 	mov	x21, x2
-	.loc 1 1785 0
+	.loc 1 1783 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
-.LVL301:
-	.loc 1 1784 0
+.LVL304:
+	.loc 1 1782 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
-.LVL302:
+.LVL305:
 	mov	x20, x3
-	.loc 1 1788 0
+	.loc 1 1786 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
-.LVL303:
-	.loc 1 1789 0
-	cbnz	w0, .L294
-.LVL304:
-	.loc 1 1793 0
+.LVL306:
+	.loc 1 1787 0
+	cbnz	w0, .L296
+.LVL307:
+	.loc 1 1791 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
-.LVL305:
-	.loc 1 1794 0
-	cbnz	w0, .L295
-.L287:
-	.loc 1 1800 0
+.LVL308:
+	.loc 1 1792 0
+	cbnz	w0, .L297
+.L289:
+	.loc 1 1798 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
-.LVL306:
+.LVL309:
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L296
+	cbnz	x1, .L298
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL307:
+.LVL310:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -3338,42 +3369,42 @@ pmic_vcom_write:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL308:
+.LVL311:
 	.p2align 3
-.L294:
+.L296:
 	.cfi_restore_state
-	.loc 1 1790 0
+	.loc 1 1788 0
 	ldr	x0, [x22]
 	adrp	x1, .LC18
 	mov	x2, x21
 	add	x1, x1, :lo12:.LC18
-	.loc 1 1791 0
+	.loc 1 1789 0
 	mov	x20, -1
-.LVL309:
-	.loc 1 1790 0
+.LVL312:
+	.loc 1 1788 0
 	bl	_dev_err
-.LVL310:
-	.loc 1 1791 0
-	b	.L287
-.LVL311:
+.LVL313:
+	.loc 1 1789 0
+	b	.L289
+.LVL314:
 	.p2align 3
-.L295:
-	.loc 1 1795 0
+.L297:
+	.loc 1 1793 0
 	ldr	x0, [x22]
 	adrp	x1, .LC19
-	.loc 1 1796 0
+	.loc 1 1794 0
 	mov	x20, -1
-.LVL312:
-	.loc 1 1795 0
+.LVL315:
+	.loc 1 1793 0
 	add	x1, x1, :lo12:.LC19
 	bl	_dev_err
-.LVL313:
-	.loc 1 1796 0
-	b	.L287
-.L296:
-	.loc 1 1800 0
+.LVL316:
+	.loc 1 1794 0
+	b	.L289
+.L298:
+	.loc 1 1798 0
 	bl	__stack_chk_fail
-.LVL314:
+.LVL317:
 	.cfi_endproc
 .LFE2837:
 	.size	pmic_vcom_write, .-pmic_vcom_write
@@ -3382,9 +3413,9 @@ pmic_vcom_write:
 	.type	waveform_version_read, %function
 waveform_version_read:
 .LFB2833:
-	.loc 1 1736 0
+	.loc 1 1734 0
 	.cfi_startproc
-.LVL315:
+.LVL318:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -3393,22 +3424,22 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1736 0
+	.loc 1 1734 0
 	mov	x19, x2
-	.loc 1 1737 0
+	.loc 1 1735 0
 	bl	epd_lut_get_wf_version
-.LVL316:
-	.loc 1 1739 0
+.LVL319:
+	.loc 1 1737 0
 	mov	x2, x0
 	adrp	x1, .LC17
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
-.LVL317:
-	.loc 1 1740 0
+.LVL320:
+	.loc 1 1738 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL318:
+.LVL321:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3422,31 +3453,31 @@ waveform_version_read:
 	.align	2
 	.type	ebc_init, %function
 ebc_init:
-.LFB2850:
-	.loc 1 2253 0
+.LFB2851:
+	.loc 1 2261 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2254 0
+	.loc 1 2262 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2253 0
+	.loc 1 2261 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2254 0
+	.loc 1 2262 0
 	bl	__platform_driver_register
-.LVL319:
-	.loc 1 2255 0
+.LVL322:
+	.loc 1 2263 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2850:
+.LFE2851:
 	.size	ebc_init, .-ebc_init
 	.text
 	.align	2
@@ -3456,11 +3487,11 @@ direct_mode_data_change:
 .LFB2814:
 	.loc 1 695 0
 	.cfi_startproc
-.LVL320:
+.LVL323:
 	.loc 1 696 0
 	ldr	w13, [x3, 72]
-.LVL321:
-	cbnz	w13, .L335
+.LVL324:
+	cbnz	w13, .L337
 .LBB1230:
 .LBB1231:
 	.loc 1 660 0
@@ -3472,60 +3503,60 @@ direct_mode_data_change:
 	ldr	x15, [x5, #:lo12:.LANCHOR0]
 	.loc 1 667 0
 	ldr	x3, [x3, 112]
-.LVL322:
+.LVL325:
 	.loc 1 666 0
 	sub	w7, w7, w4
-.LVL323:
+.LVL326:
 	.loc 1 668 0
 	add	x15, x15, 24
 	.loc 1 667 0
 	lsl	w7, w7, 16
-.LVL324:
+.LVL327:
 	add	x7, x3, x7, sxtw
-.LVL325:
+.LVL328:
 	.loc 1 671 0
 	ldr	w16, [x15, 88]
 	.loc 1 670 0
 	ldr	w3, [x15, 84]
 	.loc 1 668 0
 	ldr	w17, [x15, 156]
-.LVL326:
+.LVL329:
 	.loc 1 676 0
 	cmp	w16, 0
 	.loc 1 670 0
 	lsr	w12, w3, 3
-.LVL327:
+.LVL330:
 	.loc 1 676 0
-	ble	.L323
+	ble	.L325
 	sub	w14, w12, #1
 	add	x14, x14, 1
 	lsl	x14, x14, 2
 	.loc 1 677 0
-	cbz	w17, .L309
-.LVL328:
+	cbz	w17, .L311
+.LVL331:
 	.p2align 2
-.L336:
+.L338:
 	.loc 1 678 0
 	ldr	w10, [x15, 88]
-.LVL329:
+.LVL332:
 	sub	w10, w10, #1
 	sub	w10, w10, w13
 	mul	w10, w10, w3
 	lsr	w10, w10, 2
 	add	x10, x0, x10
-.LVL330:
-.L310:
+.LVL333:
+.L312:
 	.loc 1 682 0
-	cbz	w12, .L311
+	cbz	w12, .L313
 	mov	x5, 0
 	.p2align 2
-.L312:
+.L314:
 	.loc 1 684 0
 	ldr	w3, [x2, x5, lsl 2]
 	.loc 1 683 0
 	ldr	w4, [x1, x5, lsl 2]
 	add	x5, x5, 1
-.LVL331:
+.LVL334:
 .LBB1232:
 .LBB1233:
 	.loc 1 131 0
@@ -3534,7 +3565,7 @@ direct_mode_data_change:
 .LBE1232:
 	.loc 1 682 0
 	cmp	w12, w5
-.LVL332:
+.LVL335:
 	.loc 1 686 0
 	and	w6, w4, 65535
 .LBB1238:
@@ -3549,7 +3580,7 @@ direct_mode_data_change:
 .LBE1238:
 	.loc 1 687 0
 	lsr	w3, w3, 16
-.LVL333:
+.LVL336:
 	lsr	w4, w4, 16
 .LBB1239:
 .LBB1240:
@@ -3601,27 +3632,27 @@ direct_mode_data_change:
 	.loc 1 687 0
 	strb	w3, [x10, -1]
 	.loc 1 682 0
-	bgt	.L312
+	bgt	.L314
 	add	x1, x1, x14
 	add	x2, x2, x14
-.L311:
+.L313:
 	.loc 1 676 0
 	add	w13, w13, 1
 	cmp	w16, w13
-	beq	.L323
+	beq	.L325
 	ldr	w3, [x15, 84]
 	.loc 1 677 0
-	cbnz	w17, .L336
-.L309:
+	cbnz	w17, .L338
+.L311:
 	.loc 1 680 0
 	mul	w10, w13, w3
-.LVL334:
+.LVL337:
 	lsr	w10, w10, 2
 	add	x10, x0, x10
-.LVL335:
-	b	.L310
-.LVL336:
-.L335:
+.LVL338:
+	b	.L312
+.LVL339:
+.L337:
 .LBE1231:
 .LBE1230:
 .LBB1250:
@@ -3634,57 +3665,57 @@ direct_mode_data_change:
 	ldr	w6, [x3, 40]
 	.loc 1 621 0
 	ldr	x13, [x7, #:lo12:.LANCHOR0]
-.LVL337:
+.LVL340:
 	.loc 1 628 0
 	ldr	x5, [x3, 112]
 	.loc 1 627 0
 	sub	w3, w4, w6
-.LVL338:
+.LVL341:
 	.loc 1 629 0
 	add	x13, x13, 24
 	.loc 1 628 0
 	lsl	w3, w3, 16
-.LVL339:
+.LVL342:
 	add	x3, x5, x3, sxtw
-.LVL340:
+.LVL343:
 	.loc 1 632 0
 	ldr	w15, [x13, 88]
 	.loc 1 631 0
 	ldr	w5, [x13, 84]
 	.loc 1 629 0
 	ldr	w16, [x13, 156]
-.LVL341:
+.LVL344:
 	.loc 1 637 0
 	cmp	w15, 0
 	.loc 1 631 0
 	lsr	w14, w5, 4
 	.loc 1 637 0
-	ble	.L323
+	ble	.L325
 	sub	w11, w14, #1
 	mov	x10, x2
-.LVL342:
+.LVL345:
 	add	x11, x11, 1
 	mov	x9, x1
-.LVL343:
+.LVL346:
 	lsl	x11, x11, 3
 	mov	w12, 0
-.LVL344:
+.LVL347:
 	.loc 1 638 0
-	cbz	w16, .L326
-.LVL345:
-.L339:
+	cbz	w16, .L328
+.LVL348:
+.L341:
 	.loc 1 639 0
 	ldr	w4, [x13, 88]
-.LVL346:
+.LVL349:
 	sub	w4, w4, #1
 	sub	w4, w4, w12
 	mul	w4, w4, w5
 	lsr	w4, w4, 2
 	add	x4, x0, x4
-.LVL347:
-.L327:
+.LVL350:
+.L329:
 	.loc 1 643 0
-	cbz	w14, .L337
+	cbz	w14, .L339
 .LBE1252:
 .LBE1251:
 .LBE1250:
@@ -3696,21 +3727,21 @@ direct_mode_data_change:
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	.p2align 2
-.L328:
+.L330:
 .LBB1297:
 .LBB1295:
 .LBB1293:
 	.loc 1 643 0
 	mov	x5, 0
 	.p2align 2
-.L308:
+.L310:
 	.loc 1 645 0
 	ldr	x2, [x10, x5]
-.LVL348:
+.LVL351:
 	add	x4, x4, 4
 	.loc 1 644 0
 	ldr	x1, [x9, x5]
-.LVL349:
+.LVL352:
 	add	x5, x5, 8
 	.loc 1 647 0
 	and	w7, w2, 65535
@@ -3768,7 +3799,7 @@ direct_mode_data_change:
 	ubfx	x6, x1, 32, 16
 	.loc 1 650 0
 	lsr	x2, x2, 48
-.LVL350:
+.LVL353:
 .LBB1269:
 .LBB1257:
 	.loc 1 130 0
@@ -3809,7 +3840,7 @@ direct_mode_data_change:
 .LBE1280:
 	.loc 1 650 0
 	lsr	x1, x1, 48
-.LVL351:
+.LVL354:
 .LBB1281:
 .LBB1264:
 	.loc 1 130 0
@@ -3868,34 +3899,34 @@ direct_mode_data_change:
 	.loc 1 650 0
 	strb	w1, [x4, -1]
 	.loc 1 643 0
-	bne	.L308
+	bne	.L310
 	.loc 1 637 0
 	add	w12, w12, 1
 	add	x9, x9, x11
 	add	x10, x10, x11
 	cmp	w15, w12
-	beq	.L301
-.L338:
+	beq	.L303
+.L340:
 	ldr	w5, [x13, 84]
 	.loc 1 638 0
-	cbz	w16, .L305
+	cbz	w16, .L307
 	.loc 1 639 0
 	ldr	w4, [x13, 88]
-.LVL352:
+.LVL355:
 	sub	w4, w4, #1
 	sub	w4, w4, w12
 	mul	w4, w4, w5
 	lsr	w4, w4, 2
 	add	x4, x0, x4
-.LVL353:
+.LVL356:
 	.loc 1 643 0
-	cbnz	w14, .L328
-.L334:
+	cbnz	w14, .L330
+.L336:
 	.loc 1 637 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	bne	.L338
-.L301:
+	bne	.L340
+.L303:
 .LBE1293:
 .LBE1295:
 .LBE1297:
@@ -3905,48 +3936,48 @@ direct_mode_data_change:
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
-.LVL354:
-.L326:
+.LVL357:
+.L328:
 .LBB1298:
 .LBB1296:
 .LBB1294:
 	.loc 1 641 0
 	mul	w4, w12, w5
-.LVL355:
+.LVL358:
 	lsr	w4, w4, 2
 	add	x4, x0, x4
-.LVL356:
-	b	.L327
-.LVL357:
+.LVL359:
+	b	.L329
+.LVL360:
 	.p2align 3
-.L305:
+.L307:
 	.cfi_def_cfa 29, 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mul	w4, w12, w5
-.LVL358:
+.LVL361:
 	lsr	w4, w4, 2
 	add	x4, x0, x4
-.LVL359:
+.LVL362:
 	.loc 1 643 0
-	cbnz	w14, .L328
-	b	.L334
-.LVL360:
-.L337:
+	cbnz	w14, .L330
+	b	.L336
+.LVL363:
+.L339:
 	.cfi_def_cfa 31, 0
 	.cfi_restore 29
 	.cfi_restore 30
 	.loc 1 637 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L323
+	beq	.L325
 	ldr	w5, [x13, 84]
 	.loc 1 638 0
-	cbz	w16, .L326
-	b	.L339
-.LVL361:
+	cbz	w16, .L328
+	b	.L341
+.LVL364:
 	.p2align 3
-.L323:
+.L325:
 	ret
 .LBE1294:
 .LBE1296:
@@ -3961,7 +3992,7 @@ direct_mode_data_change_part:
 .LFB2817:
 	.loc 1 789 0
 	.cfi_startproc
-.LVL362:
+.LVL365:
 	stp	x29, x30, [sp, -80]!
 	.cfi_def_cfa_offset 80
 	.cfi_offset 29, -80
@@ -3990,8 +4021,8 @@ direct_mode_data_change_part:
 	.cfi_offset 25, -16
 	.loc 1 790 0
 	ldr	w16, [x3, 72]
-.LVL363:
-	cbnz	w16, .L444
+.LVL366:
+	cbnz	w16, .L446
 .LBB1332:
 .LBB1333:
 	.loc 1 707 0
@@ -4003,30 +4034,30 @@ direct_mode_data_change_part:
 	add	x18, x18, 24
 	.loc 1 713 0
 	ldr	x3, [x3, 112]
-.LVL364:
+.LVL367:
 	.loc 1 712 0
 	sub	w14, w14, w4
-.LVL365:
+.LVL368:
 	.loc 1 717 0
 	ldr	w30, [x18, 88]
 	.loc 1 713 0
 	lsl	w14, w14, 16
-.LVL366:
+.LVL369:
 	.loc 1 714 0
 	ldr	w19, [x18, 156]
 	.loc 1 713 0
 	add	x14, x3, x14, sxtw
-.LVL367:
+.LVL370:
 	.loc 1 716 0
 	ldr	w3, [x18, 84]
-.LVL368:
+.LVL371:
 	.loc 1 722 0
 	cmp	w30, 0
 	.loc 1 716 0
 	lsr	w9, w3, 3
-.LVL369:
+.LVL372:
 	.loc 1 722 0
-	ble	.L340
+	ble	.L342
 	sub	w17, w9, #1
 .LBB1334:
 .LBB1335:
@@ -4037,27 +4068,27 @@ direct_mode_data_change_part:
 .LBE1335:
 .LBE1334:
 	.loc 1 723 0
-	cbz	w19, .L370
-.LVL370:
+	cbz	w19, .L372
+.LVL373:
 	.p2align 2
-.L445:
+.L447:
 	.loc 1 724 0
 	ldr	w13, [x18, 88]
-.LVL371:
+.LVL374:
 	sub	w13, w13, #1
 	sub	w13, w13, w16
 	mul	w13, w13, w3
 	lsr	w13, w13, 2
 	add	x13, x0, x13
-.LVL372:
-.L371:
+.LVL375:
+.L373:
 	.loc 1 728 0
-	cbz	w9, .L372
+	cbz	w9, .L374
 	add	x13, x13, 2
-.LVL373:
+.LVL376:
 	mov	x10, 0
 	.p2align 2
-.L385:
+.L387:
 	.loc 1 730 0
 	ldr	w6, [x2, x10, lsl 2]
 .LBB1341:
@@ -4126,12 +4157,12 @@ direct_mode_data_change_part:
 .LBE1353:
 	.loc 1 731 0
 	cmp	w7, w6
-	beq	.L373
+	beq	.L375
 .LBB1354:
 .LBB1346:
 	.loc 1 139 0
 	cmp	w20, w12
-	beq	.L374
+	beq	.L376
 	.loc 1 136 0
 	tst	x25, 15
 	.loc 1 151 0
@@ -4160,7 +4191,7 @@ direct_mode_data_change_part:
 	.loc 1 150 0
 	and	w4, w6, w4
 	and	w4, w4, 255
-.L374:
+.L376:
 .LBE1346:
 .LBE1354:
 	.loc 1 732 0
@@ -4169,7 +4200,7 @@ direct_mode_data_change_part:
 .LBB1340:
 	.loc 1 139 0
 	cmp	w3, w11
-	beq	.L379
+	beq	.L381
 	.loc 1 136 0
 	tst	x22, 15
 	.loc 1 150 0
@@ -4198,54 +4229,54 @@ direct_mode_data_change_part:
 	.loc 1 150 0
 	and	w3, w5, w3
 	and	w5, w3, 255
-.L379:
+.L381:
 .LBE1340:
 .LBE1355:
 	.loc 1 733 0
 	strb	w5, [x13, -1]
-.L384:
+.L386:
 	add	x10, x10, 1
 	add	x13, x13, 2
 	.loc 1 728 0
 	cmp	w9, w10
-	bgt	.L385
+	bgt	.L387
 	add	x1, x1, x17
 	add	x2, x2, x17
-.LVL374:
-.L372:
+.LVL377:
+.L374:
 	.loc 1 722 0
 	add	w16, w16, 1
 	cmp	w30, w16
-	beq	.L340
+	beq	.L342
 	ldr	w3, [x18, 84]
 	.loc 1 723 0
-	cbnz	w19, .L445
-.L370:
+	cbnz	w19, .L447
+.L372:
 	.loc 1 726 0
 	mul	w13, w16, w3
-.LVL375:
+.LVL378:
 	lsr	w13, w13, 2
 	add	x13, x0, x13
-.LVL376:
-	b	.L371
-.LVL377:
+.LVL379:
+	b	.L373
+.LVL380:
 	.p2align 3
-.L373:
+.L375:
 	.loc 1 736 0
 	strh	wzr, [x13, -2]
-	b	.L384
-.LVL378:
+	b	.L386
+.LVL381:
 	.p2align 3
-.L340:
+.L342:
 .LBE1333:
 .LBE1332:
 	.loc 1 794 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL379:
+.LVL382:
 	ldp	x23, x24, [sp, 48]
 	ldr	x25, [sp, 64]
-.LVL380:
+.LVL383:
 	ldp	x29, x30, [sp], 80
 	.cfi_remember_state
 	.cfi_restore 30
@@ -4258,10 +4289,10 @@ direct_mode_data_change_part:
 	.cfi_restore 19
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
-.LVL381:
+.LVL384:
 	ret
-.LVL382:
-.L444:
+.LVL385:
+.L446:
 	.cfi_restore_state
 .LBB1356:
 .LBB1331:
@@ -4275,40 +4306,40 @@ direct_mode_data_change_part:
 	add	x14, x14, 24
 	.loc 1 754 0
 	ldr	x3, [x3, 112]
-.LVL383:
+.LVL386:
 	.loc 1 753 0
 	sub	w7, w7, w4
-.LVL384:
+.LVL387:
 	.loc 1 758 0
 	ldr	w15, [x14, 88]
 	.loc 1 754 0
 	lsl	w7, w7, 16
-.LVL385:
+.LVL388:
 	.loc 1 755 0
 	ldr	w16, [x14, 156]
-.LVL386:
+.LVL389:
 	.loc 1 754 0
 	add	x7, x3, x7, sxtw
-.LVL387:
+.LVL390:
 	.loc 1 757 0
 	ldr	w3, [x14, 84]
-.LVL388:
+.LVL391:
 	.loc 1 763 0
 	cmp	w15, 0
 	.loc 1 757 0
 	lsr	w11, w3, 4
-.LVL389:
+.LVL392:
 	.loc 1 763 0
-	ble	.L340
+	ble	.L342
 	sub	w13, w11, #1
 	mov	x9, x2
-.LVL390:
+.LVL393:
 	add	x13, x13, 1
 	mov	x8, x1
-.LVL391:
+.LVL394:
 	lsl	x13, x13, 3
 	mov	w12, 0
-.LVL392:
+.LVL395:
 .LBB1320:
 .LBB1321:
 	.loc 1 136 0
@@ -4316,50 +4347,50 @@ direct_mode_data_change_part:
 .LBE1321:
 .LBE1320:
 	.loc 1 764 0
-	cbz	w16, .L344
-.LVL393:
+	cbz	w16, .L346
+.LVL396:
 	.p2align 2
-.L446:
+.L448:
 	.loc 1 765 0
 	ldr	w1, [x14, 88]
-.LVL394:
+.LVL397:
 	sub	w1, w1, #1
 	sub	w1, w1, w12
 	mul	w3, w1, w3
 	lsr	w3, w3, 2
 	add	x3, x0, x3
-.LVL395:
-.L345:
+.LVL398:
+.L347:
 	.loc 1 769 0
-	cbz	w11, .L346
+	cbz	w11, .L348
 	add	x3, x3, 4
-.LVL396:
+.LVL399:
 	mov	x5, 0
 	.p2align 2
-.L369:
+.L371:
 	.loc 1 770 0
 	ldr	x1, [x8, x5, lsl 3]
-.LVL397:
+.LVL400:
 	.loc 1 771 0
 	ldr	x2, [x9, x5, lsl 3]
-.LVL398:
+.LVL401:
 	.loc 1 772 0
 	cmp	x1, x2
-	beq	.L347
+	beq	.L349
 	.loc 1 773 0
 	and	w17, w2, 65535
 	and	w6, w1, 65535
-.LVL399:
+.LVL402:
 .LBB1323:
 .LBB1324:
 	.loc 1 140 0
 	mov	w4, 0
 	.loc 1 139 0
 	cmp	w17, w6
-	beq	.L348
+	beq	.L350
 	.loc 1 137 0
 	eor	w18, w17, w6
-.LVL400:
+.LVL403:
 	.loc 1 150 0
 	ubfiz	w19, w17, 8, 8
 	.loc 1 151 0
@@ -4397,8 +4428,8 @@ direct_mode_data_change_part:
 	.loc 1 150 0
 	and	w4, w6, w4
 	and	w4, w4, 255
-.LVL401:
-.L348:
+.LVL404:
+.L350:
 .LBE1324:
 .LBE1323:
 	.loc 1 773 0
@@ -4412,10 +4443,10 @@ direct_mode_data_change_part:
 	mov	w4, 0
 	.loc 1 139 0
 	cmp	w17, w6
-	beq	.L353
+	beq	.L355
 	.loc 1 137 0
 	eor	w18, w17, w6
-.LVL402:
+.LVL405:
 	.loc 1 150 0
 	ubfiz	w19, w17, 8, 8
 	.loc 1 151 0
@@ -4453,8 +4484,8 @@ direct_mode_data_change_part:
 	.loc 1 150 0
 	and	w4, w6, w4
 	and	w4, w4, 255
-.LVL403:
-.L353:
+.LVL406:
+.L355:
 .LBE1326:
 .LBE1325:
 	.loc 1 774 0
@@ -4468,10 +4499,10 @@ direct_mode_data_change_part:
 	mov	w4, 0
 	.loc 1 139 0
 	cmp	w17, w6
-	beq	.L358
+	beq	.L360
 	.loc 1 137 0
 	eor	w18, w17, w6
-.LVL404:
+.LVL407:
 	.loc 1 150 0
 	ubfiz	w19, w17, 8, 8
 	.loc 1 151 0
@@ -4509,27 +4540,27 @@ direct_mode_data_change_part:
 	.loc 1 150 0
 	and	w4, w6, w4
 	and	w4, w4, 255
-.LVL405:
-.L358:
+.LVL408:
+.L360:
 .LBE1328:
 .LBE1327:
 	.loc 1 775 0
 	strb	w4, [x3, -2]
 	.loc 1 776 0
 	lsr	x2, x2, 48
-.LVL406:
+.LVL409:
 	lsr	x1, x1, 48
-.LVL407:
+.LVL410:
 .LBB1329:
 .LBB1322:
 	.loc 1 140 0
 	mov	w4, 0
 	.loc 1 139 0
 	cmp	w2, w1
-	beq	.L363
+	beq	.L365
 	.loc 1 137 0
 	eor	w6, w2, w1
-.LVL408:
+.LVL411:
 	.loc 1 150 0
 	ubfiz	w4, w2, 8, 8
 	.loc 1 151 0
@@ -4545,7 +4576,7 @@ direct_mode_data_change_part:
 	.loc 1 144 0
 	tst	w6, 240
 	orr	w18, w2, 12
-.LVL409:
+.LVL412:
 	.loc 1 150 0
 	ldrb	w17, [x7, w4, sxtw]
 	.loc 1 144 0
@@ -4568,44 +4599,44 @@ direct_mode_data_change_part:
 	.loc 1 150 0
 	and	w2, w4, w2
 	and	w4, w2, 255
-.LVL410:
-.L363:
+.LVL413:
+.L365:
 .LBE1322:
 .LBE1329:
 	.loc 1 776 0
 	strb	w4, [x3, -1]
-.LVL411:
-.L368:
+.LVL414:
+.L370:
 	add	x5, x5, 1
 	add	x3, x3, 4
 	.loc 1 769 0
 	cmp	w11, w5
-	bgt	.L369
+	bgt	.L371
 	add	x8, x8, x13
 	add	x9, x9, x13
-.LVL412:
-.L346:
+.LVL415:
+.L348:
 	.loc 1 763 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L340
+	beq	.L342
 	ldr	w3, [x14, 84]
-.LVL413:
+.LVL416:
 	.loc 1 764 0
-	cbnz	w16, .L446
-.L344:
+	cbnz	w16, .L448
+.L346:
 	.loc 1 767 0
 	mul	w3, w12, w3
 	lsr	w3, w3, 2
 	add	x3, x0, x3
-.LVL414:
-	b	.L345
-.LVL415:
+.LVL417:
+	b	.L347
+.LVL418:
 	.p2align 3
-.L347:
+.L349:
 	.loc 1 779 0
 	str	wzr, [x3, -4]
-	b	.L368
+	b	.L370
 .LBE1330:
 .LBE1331:
 .LBE1356:
@@ -4616,10 +4647,10 @@ direct_mode_data_change_part:
 	.p2align 3,,7
 	.type	flip.isra.7, %function
 flip.isra.7:
-.LFB2859:
+.LFB2860:
 	.loc 1 796 0
 	.cfi_startproc
-.LVL416:
+.LVL419:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -4638,27 +4669,27 @@ flip.isra.7:
 	ldr	w19, [x0, 72]
 	.loc 1 800 0
 	ldr	x0, [x0]
-.LVL417:
+.LVL420:
 .LBB1357:
 .LBB1358:
 .LBB1359:
 .LBB1360:
 	.file 10 "./include/linux/dma-mapping.h"
 	.loc 10 266 0
-	cbz	x0, .L450
+	cbz	x0, .L452
 	ldr	x3, [x0, 648]
 	.loc 10 268 0
 	adrp	x4, dummy_dma_ops
 	add	x4, x4, :lo12:dummy_dma_ops
 	cmp	x3, 0
 	csel	x3, x4, x3, eq
-.L448:
+.L450:
 .LBE1360:
 .LBE1359:
 	.loc 10 434 0
 	ldr	x5, [x3, 88]
 	sxtw	x19, w19
-	cbz	x5, .L449
+	cbz	x5, .L451
 .LBE1358:
 .LBE1357:
 	.loc 1 800 0
@@ -4676,8 +4707,8 @@ flip.isra.7:
 	.loc 10 435 0
 	ldr	x1, [x4, 32]
 	blr	x5
-.LVL418:
-.L449:
+.LVL421:
+.L451:
 .LBE1364:
 .LBE1367:
 	.loc 1 801 0
@@ -4707,7 +4738,7 @@ flip.isra.7:
 .LBB1371:
 	.loc 11 57 0
 	blr	x5
-.LVL419:
+.LVL422:
 .LBE1371:
 .LBE1373:
 	.loc 1 802 0
@@ -4720,7 +4751,7 @@ flip.isra.7:
 	ldr	x3, [x1, 72]
 	ldr	w1, [x19, 32]
 	blr	x3
-.LVL420:
+.LVL423:
 .LBE1375:
 .LBE1374:
 	.loc 1 803 0
@@ -4732,7 +4763,7 @@ flip.isra.7:
 	mov	x0, x2
 	ldr	x2, [x2, 96]
 	blr	x2
-.LVL421:
+.LVL424:
 .LBE1377:
 .LBE1376:
 	.loc 1 804 0
@@ -4742,7 +4773,7 @@ flip.isra.7:
 	str	w0, [x20, 72]
 	.loc 1 805 0
 	ldp	x19, x20, [sp, 16]
-.LVL422:
+.LVL425:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -4751,9 +4782,9 @@ flip.isra.7:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL423:
+.LVL426:
 	.p2align 3
-.L450:
+.L452:
 	.cfi_restore_state
 .LBB1378:
 .LBB1365:
@@ -4762,13 +4793,13 @@ flip.isra.7:
 	.loc 10 268 0
 	adrp	x3, dummy_dma_ops
 	add	x3, x3, :lo12:dummy_dma_ops
-	b	.L448
+	b	.L450
 .LBE1361:
 .LBE1362:
 .LBE1365:
 .LBE1378:
 	.cfi_endproc
-.LFE2859:
+.LFE2860:
 	.size	flip.isra.7, .-flip.isra.7
 	.align	2
 	.p2align 3,,7
@@ -4777,7 +4808,7 @@ ebc_frame_start:
 .LFB2820:
 	.loc 1 814 0
 	.cfi_startproc
-.LVL424:
+.LVL427:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
@@ -4799,13 +4830,13 @@ ebc_frame_start:
 	.loc 1 818 0
 	ldr	x1, [x19, 208]
 	ldr	w0, [x1, 40]
-.LVL425:
-	tbnz	w0, #31, .L456
+.LVL428:
+	tbnz	w0, #31, .L458
 	cmp	w0, 1
-	ble	.L457
+	ble	.L459
 	sub	w0, w0, #7
 	cmp	w0, 8
-	bhi	.L456
+	bhi	.L458
 	.loc 1 850 0
 	ldr	x2, [x19, 200]
 	.loc 1 848 0
@@ -4818,7 +4849,7 @@ ebc_frame_start:
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change_part
-.LVL426:
+.LVL429:
 .LBB1379:
 .LBB1380:
 	.loc 1 809 0
@@ -4827,7 +4858,7 @@ ebc_frame_start:
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
-.LVL427:
+.LVL430:
 .LBE1380:
 .LBE1379:
 	.loc 1 853 0
@@ -4844,11 +4875,11 @@ ebc_frame_start:
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part
-.LVL428:
-.L455:
+.LVL431:
+.L457:
 	.loc 1 875 0
 	ldp	x19, x20, [sp, 16]
-.LVL429:
+.LVL432:
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -4859,9 +4890,9 @@ ebc_frame_start:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL430:
+.LVL433:
 	.p2align 3
-.L456:
+.L458:
 	.cfi_restore_state
 	.loc 1 863 0
 	ldr	x2, [x19, 200]
@@ -4875,7 +4906,7 @@ ebc_frame_start:
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change
-.LVL431:
+.LVL434:
 .LBB1381:
 .LBB1382:
 	.loc 1 809 0
@@ -4884,7 +4915,7 @@ ebc_frame_start:
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
-.LVL432:
+.LVL435:
 .LBE1382:
 .LBE1381:
 	.loc 1 866 0
@@ -4901,11 +4932,11 @@ ebc_frame_start:
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
-.LVL433:
+.LVL436:
 	.loc 1 875 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL434:
+.LVL437:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -4915,9 +4946,9 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL435:
+.LVL438:
 	.p2align 3
-.L457:
+.L459:
 	.cfi_restore_state
 	.loc 1 821 0
 	ldr	x0, [x19, 168]
@@ -4925,10 +4956,10 @@ ebc_frame_start:
 	ldp	x1, x2, [x19, 128]
 	ldr	x3, [x19, 152]
 	bl	get_auto_image
-.LVL436:
+.LVL439:
 	.loc 1 826 0
 	ldr	w0, [x19, 36]
-	cbz	w0, .L459
+	cbz	w0, .L461
 .LBB1383:
 .LBB1384:
 	.loc 1 809 0
@@ -4937,7 +4968,7 @@ ebc_frame_start:
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.7
-.LVL437:
+.LVL440:
 .LBE1384:
 .LBE1383:
 	.loc 1 828 0
@@ -4946,11 +4977,11 @@ ebc_frame_start:
 	ldr	x3, [x19, 152]
 	ldr	x0, [x19, 176]
 	bl	get_auto_image
-.LVL438:
+.LVL441:
 	.loc 1 875 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL439:
+.LVL442:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -4960,8 +4991,8 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL440:
-.L459:
+.LVL443:
+.L461:
 	.cfi_restore_state
 	.loc 1 834 0
 	adrp	x1, .LANCHOR3
@@ -4969,10 +5000,10 @@ ebc_frame_start:
 	add	x1, x1, :lo12:.LANCHOR3
 	add	x0, x0, :lo12:.LC20
 	bl	printk
-.LVL441:
+.LVL444:
 	.loc 1 835 0
 	str	wzr, [x19, 28]
-	b	.L455
+	b	.L457
 	.cfi_endproc
 .LFE2820:
 	.size	ebc_frame_start, .-ebc_frame_start
@@ -4983,7 +5014,7 @@ ebc_auto_tast_function:
 .LFB2821:
 	.loc 1 878 0
 	.cfi_startproc
-.LVL442:
+.LVL445:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
@@ -4992,7 +5023,7 @@ ebc_auto_tast_function:
 	adrp	x1, .LANCHOR0
 	.loc 1 878 0
 	adrp	x0, __stack_chk_guard
-.LVL443:
+.LVL446:
 	add	x0, x0, :lo12:__stack_chk_guard
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -5007,7 +5038,7 @@ ebc_auto_tast_function:
 	.cfi_offset 22, -56
 	.loc 1 879 0
 	ldr	x22, [x1, #:lo12:.LANCHOR0]
-.LVL444:
+.LVL447:
 	.loc 1 884 0
 	add	x20, x20, 376
 	.loc 1 878 0
@@ -5045,18 +5076,18 @@ ebc_auto_tast_function:
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x23, sp_el0
 // 0 "" 2
-.LVL445:
+.LVL448:
 #NO_APP
-	b	.L471
+	b	.L474
 	.p2align 3
-.L480:
+.L492:
 .LBE1390:
 .LBE1389:
 .LBE1392:
 	.loc 1 889 0
 	sub	w0, w0, #7
 	cmp	w0, 8
-	bhi	.L464
+	bhi	.L466
 	.loc 1 908 0
 	ldr	w1, [x19, 40]
 	.loc 1 909 0
@@ -5067,29 +5098,32 @@ ebc_auto_tast_function:
 	.loc 1 909 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.7
-.LVL446:
+.LVL449:
 	.loc 1 910 0
 	ldr	w0, [x19, 40]
-	cbnz	w0, .L478
-.L467:
+	cbnz	w0, .L490
+.L469:
 	.loc 1 930 0
 	ldr	x0, [x19, 208]
 	ldr	w0, [x0, 40]
+	cbz	w0, .L472
+.L493:
+	.loc 1 931 0
 	cmp	w0, 1
-	bls	.L479
-.L470:
+	beq	.L491
+.L473:
 	.loc 1 934 0
 	mov	x0, x20
 	bl	up
-.LVL447:
+.LVL450:
 	.loc 1 935 0
 	bl	schedule
-.LVL448:
-.L471:
+.LVL451:
+.L474:
 	.loc 1 884 0
 	mov	x0, x20
 	bl	down
-.LVL449:
+.LVL452:
 .LBB1393:
 .LBB1391:
 .LBB1388:
@@ -5107,14 +5141,14 @@ ebc_auto_tast_function:
 #NO_APP
 	ldr	x0, [x19, 208]
 	ldr	w0, [x0, 40]
-	tbnz	w0, #31, .L464
+	tbnz	w0, #31, .L466
 	cmp	w0, 1
-	bgt	.L480
+	bgt	.L492
 	.loc 1 892 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
 	bl	flip.isra.7
-.LVL450:
+.LVL453:
 	.loc 1 893 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
@@ -5123,13 +5157,12 @@ ebc_auto_tast_function:
 	ldr	x3, [x19, 152]
 	ldr	x0, [x0, 168]
 	bl	get_auto_image
-.LVL451:
+.LVL454:
 	.loc 1 930 0
 	ldr	x0, [x19, 208]
 	ldr	w0, [x0, 40]
-	cmp	w0, 1
-	bhi	.L470
-.L479:
+	cbnz	w0, .L493
+.L472:
 .LBB1394:
 .LBB1395:
 .LBB1396:
@@ -5140,10 +5173,10 @@ ebc_auto_tast_function:
 	mov	x2, x26
 	mov	w0, 8
 	bl	queue_work_on
-.LVL452:
-	b	.L470
+.LVL455:
+	b	.L473
 	.p2align 3
-.L464:
+.L466:
 .LBE1397:
 .LBE1396:
 .LBE1395:
@@ -5158,10 +5191,10 @@ ebc_auto_tast_function:
 	.loc 1 919 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.7
-.LVL453:
+.LVL456:
 	.loc 1 920 0
 	ldr	w0, [x19, 40]
-	cbz	w0, .L467
+	cbz	w0, .L469
 	.loc 1 922 0
 	ldrsw	x0, [x21, 72]
 	mov	x3, x19
@@ -5173,11 +5206,34 @@ ebc_auto_tast_function:
 	ldr	x0, [x0, 168]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change
-.LVL454:
+.LVL457:
 	.loc 1 926 0
-	b	.L467
+	b	.L469
+	.p2align 3
+.L491:
+	.loc 1 931 0 discriminator 1
+	ldr	w0, [x19, 604]
+	cbz	w0, .L473
+	.loc 1 931 0 is_stmt 0 discriminator 2
+	ldr	w0, [x19, 608]
+	cbz	w0, .L473
+.LBB1401:
+.LBB1400:
+.LBB1399:
+.LBB1398:
+	.loc 13 518 0 is_stmt 1
+	ldr	x1, [x25, #:lo12:system_wq]
+	mov	x2, x26
+	mov	w0, 8
+	bl	queue_work_on
+.LVL458:
+	b	.L473
 	.p2align 3
-.L478:
+.L490:
+.LBE1398:
+.LBE1399:
+.LBE1400:
+.LBE1401:
 	.loc 1 912 0
 	ldrsw	x0, [x21, 72]
 	mov	x3, x19
@@ -5189,9 +5245,9 @@ ebc_auto_tast_function:
 	ldr	x0, [x0, 168]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part
-.LVL455:
+.LVL459:
 	.loc 1 916 0
-	b	.L467
+	b	.L469
 	.cfi_endproc
 .LFE2821:
 	.size	ebc_auto_tast_function, .-ebc_auto_tast_function
@@ -5199,10 +5255,10 @@ ebc_auto_tast_function:
 	.p2align 3,,7
 	.type	ebc_power_set.part.8, %function
 ebc_power_set.part.8:
-.LFB2860:
+.LFB2861:
 	.loc 1 180 0
 	.cfi_startproc
-.LVL456:
+.LVL460:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -5218,41 +5274,41 @@ ebc_power_set.part.8:
 	str	w1, [x0, 368]
 	.loc 1 198 0
 	ldr	x1, [x0, 8]
-.LVL457:
-.LBB1398:
-.LBB1399:
+.LVL461:
+.LBB1402:
+.LBB1403:
 	.loc 11 51 0
 	mov	x0, x1
-.LVL458:
+.LVL462:
 	ldr	x1, [x1, 56]
 	blr	x1
-.LVL459:
-.LBE1399:
-.LBE1398:
+.LVL463:
+.LBE1403:
+.LBE1402:
 	.loc 1 199 0
 	ldr	x2, [x19, 16]
-.LBB1400:
-.LBB1401:
+.LBB1404:
+.LBB1405:
 	.loc 3 35 0
 	mov	w1, 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL460:
-.LBE1401:
-.LBE1400:
+.LVL464:
+.LBE1405:
+.LBE1404:
 	.loc 1 200 0
 	ldr	w0, [x19, 608]
-	cbnz	w0, .L487
+	cbnz	w0, .L500
 	.loc 1 204 0
 	ldr	x0, [x19]
 	adrp	x1, .LC21
 	add	x1, x1, :lo12:.LC21
 	bl	_dev_info
-.LVL461:
+.LVL465:
 	.loc 1 208 0
 	ldp	x19, x20, [sp, 16]
-.LVL462:
+.LVL466:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -5261,29 +5317,29 @@ ebc_power_set.part.8:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL463:
+.LVL467:
 	.p2align 3
-.L487:
+.L500:
 	.cfi_restore_state
 	.loc 1 201 0
 	str	wzr, [x19, 608]
-.LBB1402:
-.LBB1403:
+.LBB1406:
+.LBB1407:
 	.loc 4 68 0
 	add	x0, x19, 400
 	bl	__pm_relax
-.LVL464:
-.LBE1403:
-.LBE1402:
+.LVL468:
+.LBE1407:
+.LBE1406:
 	.loc 1 204 0
 	ldr	x0, [x19]
 	adrp	x1, .LC21
 	add	x1, x1, :lo12:.LC21
 	bl	_dev_info
-.LVL465:
+.LVL469:
 	.loc 1 208 0
 	ldp	x19, x20, [sp, 16]
-.LVL466:
+.LVL470:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -5292,16 +5348,16 @@ ebc_power_set.part.8:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2860:
+.LFE2861:
 	.size	ebc_power_set.part.8, .-ebc_power_set.part.8
 	.align	2
 	.p2align 3,,7
 	.type	ebc_suspend, %function
 ebc_suspend:
-.LFB2848:
-	.loc 1 2203 0
+.LFB2849:
+	.loc 1 2211 0
 	.cfi_startproc
-.LVL467:
+.LVL471:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -5311,40 +5367,40 @@ ebc_suspend:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-.LBB1404:
-.LBB1405:
+.LBB1408:
+.LBB1409:
 	.loc 2 1181 0
 	ldr	x20, [x0, 184]
-.LBE1405:
-.LBE1404:
-	.loc 1 2207 0
+.LBE1409:
+.LBE1408:
+	.loc 1 2215 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 184]
-.LVL468:
+.LVL472:
 	cmp	w0, 1
-	beq	.L491
-.L489:
-	.loc 1 2211 0
+	beq	.L504
+.L502:
+	.loc 1 2219 0
 	mov	w0, 1
 	str	w0, [x19, 596]
-	.loc 1 2213 0
+	.loc 1 2221 0
 	ldr	x1, [x20, 16]
-.LBB1406:
-.LBB1407:
+.LBB1410:
+.LBB1411:
 	.loc 3 40 0
 	mov	x0, x1
 	ldr	x1, [x1, 40]
 	blr	x1
-.LVL469:
-.LBE1407:
-.LBE1406:
-	.loc 1 2214 0
+.LVL473:
+.LBE1411:
+.LBE1410:
+	.loc 1 2222 0
 	ldr	x0, [x19, 88]
 	adrp	x1, .LC23
 	add	x1, x1, :lo12:.LC23
 	bl	_dev_info
-.LVL470:
-	.loc 1 2217 0
+.LVL474:
+	.loc 1 2225 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -5356,9 +5412,9 @@ ebc_suspend:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L491:
+.L504:
 	.cfi_restore_state
-	.loc 1 2208 0
+	.loc 1 2216 0
 	ldr	x0, [x19, 88]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
@@ -5366,54 +5422,54 @@ ebc_suspend:
 	add	x2, x2, 16
 	add	x1, x1, :lo12:.LC22
 	bl	_dev_info
-.LVL471:
-.LBB1408:
-.LBB1409:
+.LVL475:
+.LBB1412:
+.LBB1413:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
-.LVL472:
-	b	.L489
-.LBE1409:
-.LBE1408:
+.LVL476:
+	b	.L502
+.LBE1413:
+.LBE1412:
 	.cfi_endproc
-.LFE2848:
+.LFE2849:
 	.size	ebc_suspend, .-ebc_suspend
 	.align	2
 	.p2align 3,,7
 	.type	ebc_probe, %function
 ebc_probe:
-.LFB2846:
-	.loc 1 2087 0
+.LFB2847:
+	.loc 1 2095 0
 	.cfi_startproc
-.LVL473:
+.LVL477:
 	stp	x29, x30, [sp, -208]!
 	.cfi_def_cfa_offset 208
 	.cfi_offset 29, -208
 	.cfi_offset 30, -200
-.LBB1555:
-.LBB1556:
+.LBB1559:
+.LBB1560:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
-.LBE1556:
-.LBE1555:
-	.loc 1 2087 0
+.LBE1560:
+.LBE1559:
+	.loc 1 2095 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -192
 	.cfi_offset 20, -184
-	.loc 1 2088 0
+	.loc 1 2096 0
 	add	x20, x0, 16
-	.loc 1 2087 0
+	.loc 1 2095 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -160
 	.cfi_offset 24, -152
 	adrp	x23, __stack_chk_guard
 	stp	x21, x22, [sp, 32]
 	add	x0, x23, :lo12:__stack_chk_guard
-.LVL474:
+.LVL478:
 	stp	x25, x26, [sp, 64]
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 21, -176
@@ -5422,466 +5478,466 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 2087 0
+	.loc 1 2095 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
-.LBB1558:
-.LBB1557:
+.LBB1562:
+.LBB1561:
 	.loc 2 711 0
 	mov	x0, x20
 	mov	x1, 800
 	bl	devm_kmalloc
-.LVL475:
-.LBE1557:
-.LBE1558:
-	.loc 1 2099 0
-	cbz	x0, .L537
-	.loc 1 2103 0
+.LVL479:
+.LBE1561:
+.LBE1562:
+	.loc 1 2107 0
+	cbz	x0, .L550
+	.loc 1 2111 0
 	adrp	x25, .LANCHOR0
 	mov	x19, x0
-	.loc 1 2105 0
+	.loc 1 2113 0
 	adrp	x1, .LC24
 	mov	w2, 0
-	.loc 1 2103 0
+	.loc 1 2111 0
 	str	x0, [x25, #:lo12:.LANCHOR0]
-	.loc 1 2105 0
+	.loc 1 2113 0
 	add	x1, x1, :lo12:.LC24
 	ldr	x0, [x20, 752]
-	.loc 1 2102 0
+	.loc 1 2110 0
 	str	x20, [x19]
-	.loc 1 2105 0
+	.loc 1 2113 0
 	bl	of_parse_phandle
-.LVL476:
-	.loc 1 2106 0
-	cbz	x0, .L577
-	.loc 1 2111 0
+.LVL480:
+	.loc 1 2114 0
+	cbz	x0, .L590
+	.loc 1 2119 0
 	bl	of_find_device_by_node
-.LVL477:
-	.loc 1 2113 0
-	cbz	x0, .L496
-.LBB1559:
-.LBB1560:
-.LBB1561:
+.LVL481:
+	.loc 1 2121 0
+	cbz	x0, .L509
+.LBB1563:
+.LBB1564:
+.LBB1565:
 	.loc 2 1181 0
 	ldr	x0, [x0, 200]
-.LVL478:
-.LBE1561:
-.LBE1560:
-.LBE1559:
-	.loc 1 2116 0
+.LVL482:
+.LBE1565:
+.LBE1564:
+.LBE1563:
+	.loc 1 2124 0
 	str	x0, [x19, 8]
-	.loc 1 2117 0
-	cbz	x0, .L496
-	.loc 1 2119 0
+	.loc 1 2125 0
+	cbz	x0, .L509
+	.loc 1 2127 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 2121 0
+	.loc 1 2129 0
 	mov	w2, 0
 	adrp	x1, .LC26
 	add	x1, x1, :lo12:.LC26
 	ldr	x0, [x20, 752]
 	bl	of_parse_phandle
-.LVL479:
-	.loc 1 2122 0
-	cbz	x0, .L578
-	.loc 1 2127 0
+.LVL483:
+	.loc 1 2130 0
+	cbz	x0, .L591
+	.loc 1 2135 0
 	bl	of_find_i2c_device_by_node
-.LVL480:
-	.loc 1 2129 0
-	cbz	x0, .L579
-.LBB1562:
-.LBB1563:
-.LBB1564:
+.LVL484:
+	.loc 1 2137 0
+	cbz	x0, .L592
+.LBB1566:
+.LBB1567:
+.LBB1568:
 	.loc 2 1181 0
 	ldr	x0, [x0, 216]
-.LVL481:
-.LBE1564:
-.LBE1563:
-.LBE1562:
-	.loc 1 2133 0
+.LVL485:
+.LBE1568:
+.LBE1567:
+.LBE1566:
+	.loc 1 2141 0
 	str	x0, [x19, 16]
-	.loc 1 2134 0
-	cbz	x0, .L580
-	.loc 1 2140 0
-	add	x21, x19, 184
-.LVL482:
 	.loc 1 2142 0
+	cbz	x0, .L593
+	.loc 1 2148 0
+	add	x21, x19, 184
+.LVL486:
+	.loc 1 2150 0
 	add	x22, x19, 24
-	.loc 1 2140 0
+	.loc 1 2148 0
 	str	x20, [x21, 88]
-.LBB1565:
-.LBB1566:
-.LBB1567:
-.LBB1568:
 .LBB1569:
+.LBB1570:
+.LBB1571:
+.LBB1572:
+.LBB1573:
 	.file 14 "./include/linux/of.h"
 	.loc 14 499 0
 	adrp	x1, .LC30
+.LBE1573:
+.LBE1572:
+.LBE1571:
+.LBE1570:
 .LBE1569:
-.LBE1568:
-.LBE1567:
-.LBE1566:
-.LBE1565:
-	.loc 1 2142 0
+	.loc 1 2150 0
 	str	x20, [x19, 24]
+.LBB1668:
 .LBB1664:
-.LBB1660:
-.LBB1576:
-.LBB1573:
-.LBB1570:
+.LBB1580:
+.LBB1577:
+.LBB1574:
 	.loc 14 499 0
 	mov	x4, 0
-.LBE1570:
-.LBE1573:
-.LBE1576:
-.LBE1660:
+.LBE1574:
+.LBE1577:
+.LBE1580:
 .LBE1664:
-	.loc 1 2143 0
+.LBE1668:
+	.loc 1 2151 0
 	ldr	x2, [x19, 8]
+.LBB1669:
 .LBB1665:
-.LBB1661:
-.LBB1577:
-.LBB1574:
-.LBB1571:
+.LBB1581:
+.LBB1578:
+.LBB1575:
 	.loc 14 499 0
 	add	x1, x1, :lo12:.LC30
-.LBE1571:
-.LBE1574:
-.LBE1577:
-.LBE1661:
+.LBE1575:
+.LBE1578:
+.LBE1581:
 .LBE1665:
-	.loc 1 2144 0
+.LBE1669:
+	.loc 1 2152 0
 	stp	x2, x0, [x22, 8]
+.LBB1670:
 .LBB1666:
-.LBB1662:
-.LBB1578:
-.LBB1575:
-.LBB1572:
+.LBB1582:
+.LBB1579:
+.LBB1576:
 	.loc 14 499 0
 	mov	x3, 1
 	ldr	x0, [x20, 752]
 	add	x2, x19, 100
 	bl	of_property_read_variable_u32_array
-.LVL483:
-	.loc 14 501 0
-	tbnz	w0, #31, .L501
-.LBE1572:
-.LBE1575:
-.LBE1578:
-.LBB1579:
-.LBB1580:
-.LBB1581:
-	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC54
-	mov	x4, 0
-	mov	x3, 1
-	add	x2, x19, 104
-	add	x1, x1, :lo12:.LC54
-	bl	of_property_read_variable_u32_array
-.LVL484:
+.LVL487:
 	.loc 14 501 0
-	tbnz	w0, #31, .L501
-.LBE1581:
-.LBE1580:
+	tbnz	w0, #31, .L514
+.LBE1576:
 .LBE1579:
-.LBB1582:
+.LBE1582:
 .LBB1583:
 .LBB1584:
+.LBB1585:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC55
+	adrp	x1, .LC54
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 108
-	add	x1, x1, :lo12:.LC55
+	add	x2, x19, 104
+	add	x1, x1, :lo12:.LC54
 	bl	of_property_read_variable_u32_array
-.LVL485:
+.LVL488:
 	.loc 14 501 0
-	tbnz	w0, #31, .L501
+	tbnz	w0, #31, .L514
+.LBE1585:
 .LBE1584:
 .LBE1583:
-.LBE1582:
-.LBB1585:
 .LBB1586:
 .LBB1587:
+.LBB1588:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC56
+	adrp	x1, .LC55
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 112
-	add	x1, x1, :lo12:.LC56
+	add	x2, x19, 108
+	add	x1, x1, :lo12:.LC55
 	bl	of_property_read_variable_u32_array
-.LVL486:
+.LVL489:
 	.loc 14 501 0
-	tbnz	w0, #31, .L501
+	tbnz	w0, #31, .L514
+.LBE1588:
 .LBE1587:
 .LBE1586:
-.LBE1585:
-.LBB1588:
 .LBB1589:
 .LBB1590:
+.LBB1591:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC57
+	adrp	x1, .LC56
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 128
-	add	x1, x1, :lo12:.LC57
+	add	x2, x19, 112
+	add	x1, x1, :lo12:.LC56
 	bl	of_property_read_variable_u32_array
-.LVL487:
+.LVL490:
 	.loc 14 501 0
-	tbnz	w0, #31, .L501
+	tbnz	w0, #31, .L514
+.LBE1591:
 .LBE1590:
 .LBE1589:
-.LBE1588:
-.LBB1591:
 .LBB1592:
 .LBB1593:
+.LBB1594:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC58
+	adrp	x1, .LC57
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 132
-	add	x1, x1, :lo12:.LC58
+	add	x2, x19, 128
+	add	x1, x1, :lo12:.LC57
 	bl	of_property_read_variable_u32_array
-.LVL488:
+.LVL491:
 	.loc 14 501 0
-	tbnz	w0, #31, .L501
+	tbnz	w0, #31, .L514
+.LBE1594:
 .LBE1593:
 .LBE1592:
-.LBE1591:
-.LBB1594:
 .LBB1595:
 .LBB1596:
+.LBB1597:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC59
+	adrp	x1, .LC58
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 136
-	add	x1, x1, :lo12:.LC59
+	add	x2, x19, 132
+	add	x1, x1, :lo12:.LC58
 	bl	of_property_read_variable_u32_array
-.LVL489:
+.LVL492:
 	.loc 14 501 0
-	tbnz	w0, #31, .L501
+	tbnz	w0, #31, .L514
+.LBE1597:
 .LBE1596:
 .LBE1595:
-.LBE1594:
-.LBB1597:
 .LBB1598:
 .LBB1599:
+.LBB1600:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC60
+	adrp	x1, .LC59
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 140
-	add	x1, x1, :lo12:.LC60
+	add	x2, x19, 136
+	add	x1, x1, :lo12:.LC59
 	bl	of_property_read_variable_u32_array
-.LVL490:
+.LVL493:
 	.loc 14 501 0
-	tbnz	w0, #31, .L501
+	tbnz	w0, #31, .L514
+.LBE1600:
 .LBE1599:
 .LBE1598:
-.LBE1597:
-.LBB1600:
 .LBB1601:
 .LBB1602:
+.LBB1603:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC61
+	adrp	x1, .LC60
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 144
-	add	x1, x1, :lo12:.LC61
+	add	x2, x19, 140
+	add	x1, x1, :lo12:.LC60
 	bl	of_property_read_variable_u32_array
-.LVL491:
+.LVL494:
 	.loc 14 501 0
-	tbnz	w0, #31, .L501
+	tbnz	w0, #31, .L514
+.LBE1603:
 .LBE1602:
 .LBE1601:
-.LBE1600:
-.LBB1603:
 .LBB1604:
 .LBB1605:
+.LBB1606:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC62
+	adrp	x1, .LC61
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 148
-	add	x1, x1, :lo12:.LC62
+	add	x2, x19, 144
+	add	x1, x1, :lo12:.LC61
 	bl	of_property_read_variable_u32_array
-.LVL492:
+.LVL495:
 	.loc 14 501 0
-	tbnz	w0, #31, .L501
+	tbnz	w0, #31, .L514
+.LBE1606:
 .LBE1605:
 .LBE1604:
-.LBE1603:
-.LBB1606:
 .LBB1607:
 .LBB1608:
+.LBB1609:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC63
+	adrp	x1, .LC62
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 152
-	add	x1, x1, :lo12:.LC63
+	add	x2, x19, 148
+	add	x1, x1, :lo12:.LC62
 	bl	of_property_read_variable_u32_array
-.LVL493:
+.LVL496:
 	.loc 14 501 0
-	tbnz	w0, #31, .L501
+	tbnz	w0, #31, .L514
+.LBE1609:
 .LBE1608:
 .LBE1607:
-.LBE1606:
-.LBB1609:
 .LBB1610:
 .LBB1611:
+.LBB1612:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC64
+	adrp	x1, .LC63
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 156
-	add	x1, x1, :lo12:.LC64
+	add	x2, x19, 152
+	add	x1, x1, :lo12:.LC63
 	bl	of_property_read_variable_u32_array
-.LVL494:
+.LVL497:
 	.loc 14 501 0
-	tbnz	w0, #31, .L501
+	tbnz	w0, #31, .L514
+.LBE1612:
 .LBE1611:
 .LBE1610:
-.LBE1609:
-.LBB1612:
 .LBB1613:
 .LBB1614:
+.LBB1615:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC65
+	adrp	x1, .LC64
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 160
-	add	x1, x1, :lo12:.LC65
+	add	x2, x19, 156
+	add	x1, x1, :lo12:.LC64
 	bl	of_property_read_variable_u32_array
-.LVL495:
+.LVL498:
 	.loc 14 501 0
-	tbnz	w0, #31, .L501
+	tbnz	w0, #31, .L514
+.LBE1615:
 .LBE1614:
 .LBE1613:
-.LBE1612:
-.LBB1615:
 .LBB1616:
 .LBB1617:
+.LBB1618:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC66
+	adrp	x1, .LC65
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 164
-	add	x1, x1, :lo12:.LC66
+	add	x2, x19, 160
+	add	x1, x1, :lo12:.LC65
 	bl	of_property_read_variable_u32_array
-.LVL496:
+.LVL499:
 	.loc 14 501 0
-	tbnz	w0, #31, .L501
+	tbnz	w0, #31, .L514
+.LBE1618:
 .LBE1617:
 .LBE1616:
-.LBE1615:
-.LBB1618:
 .LBB1619:
 .LBB1620:
+.LBB1621:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC67
+	adrp	x1, .LC66
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 168
-	add	x1, x1, :lo12:.LC67
+	add	x2, x19, 164
+	add	x1, x1, :lo12:.LC66
 	bl	of_property_read_variable_u32_array
-.LVL497:
+.LVL500:
 	.loc 14 501 0
-	tbnz	w0, #31, .L501
+	tbnz	w0, #31, .L514
+.LBE1621:
 .LBE1620:
 .LBE1619:
-.LBE1618:
-.LBB1621:
 .LBB1622:
 .LBB1623:
+.LBB1624:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC68
+	adrp	x1, .LC67
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 172
-	add	x1, x1, :lo12:.LC68
+	add	x2, x19, 168
+	add	x1, x1, :lo12:.LC67
 	bl	of_property_read_variable_u32_array
-.LVL498:
+.LVL501:
 	.loc 14 501 0
-	tbnz	w0, #31, .L581
+	tbnz	w0, #31, .L514
+.LBE1624:
 .LBE1623:
 .LBE1622:
-.LBE1621:
-.LBB1624:
 .LBB1625:
 .LBB1626:
+.LBB1627:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC31
+	adrp	x1, .LC68
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 176
-	add	x1, x1, :lo12:.LC31
+	add	x2, x19, 172
+	add	x1, x1, :lo12:.LC68
 	bl	of_property_read_variable_u32_array
-.LVL499:
+.LVL502:
 	.loc 14 501 0
-	tbnz	w0, #31, .L502
-.L528:
+	tbnz	w0, #31, .L594
+.LBE1627:
 .LBE1626:
 .LBE1625:
-.LBE1624:
-.LBB1631:
-.LBB1632:
-.LBB1633:
+.LBB1628:
+.LBB1629:
+.LBB1630:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC32
+	adrp	x1, .LC31
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 180
-	add	x1, x1, :lo12:.LC32
+	add	x2, x19, 176
+	add	x1, x1, :lo12:.LC31
 	bl	of_property_read_variable_u32_array
-.LVL500:
+.LVL503:
 	.loc 14 501 0
-	tbnz	w0, #31, .L503
-.L529:
-.LBE1633:
-.LBE1632:
-.LBE1631:
-.LBB1638:
-.LBB1639:
-.LBB1640:
+	tbnz	w0, #31, .L515
+.L541:
+.LBE1630:
+.LBE1629:
+.LBE1628:
+.LBB1635:
+.LBB1636:
+.LBB1637:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC33
+	adrp	x1, .LC32
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 116
-	add	x1, x1, :lo12:.LC33
+	add	x2, x19, 180
+	add	x1, x1, :lo12:.LC32
 	bl	of_property_read_variable_u32_array
-.LVL501:
+.LVL504:
 	.loc 14 501 0
-	tbnz	w0, #31, .L504
-.L530:
-.LBE1640:
-.LBE1639:
-.LBE1638:
-.LBB1645:
-.LBB1646:
-.LBB1647:
+	tbnz	w0, #31, .L516
+.L542:
+.LBE1637:
+.LBE1636:
+.LBE1635:
+.LBB1642:
+.LBB1643:
+.LBB1644:
+	.loc 14 499 0
+	ldr	x0, [x20, 752]
+	adrp	x1, .LC33
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x19, 116
+	add	x1, x1, :lo12:.LC33
+	bl	of_property_read_variable_u32_array
+.LVL505:
+	.loc 14 501 0
+	tbnz	w0, #31, .L517
+.L543:
+.LBE1644:
+.LBE1643:
+.LBE1642:
+.LBB1649:
+.LBB1650:
+.LBB1651:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC34
@@ -5890,285 +5946,285 @@ ebc_probe:
 	add	x2, x19, 120
 	add	x1, x1, :lo12:.LC34
 	bl	of_property_read_variable_u32_array
-.LVL502:
+.LVL506:
 	.loc 14 501 0
-	tbnz	w0, #31, .L505
-.L531:
-.LBE1647:
-.LBE1646:
-.LBE1645:
-.LBE1662:
+	tbnz	w0, #31, .L518
+.L544:
+.LBE1651:
+.LBE1650:
+.LBE1649:
 .LBE1666:
-	.loc 1 2152 0
+.LBE1670:
+	.loc 1 2160 0
 	ldr	w0, [x22, 88]
-.LBB1667:
-.LBB1668:
-	.loc 1 1889 0
+.LBB1671:
+.LBB1672:
+	.loc 1 1897 0
 	mov	w2, 0
-.LBE1668:
-.LBE1667:
-	.loc 1 2152 0
+.LBE1672:
+.LBE1671:
+	.loc 1 2160 0
 	str	w0, [x21, 52]
-	.loc 1 2153 0
+	.loc 1 2161 0
 	ldr	w1, [x22, 84]
 	str	w1, [x21, 56]
-	.loc 1 2156 0
+	.loc 1 2164 0
 	tst	x1, 15
-	.loc 1 2154 0
+	.loc 1 2162 0
 	mul	w0, w0, w1
-	.loc 1 2156 0
+	.loc 1 2164 0
 	cset	w1, eq
 	str	w1, [x21, 72]
-.LBB1692:
-.LBB1687:
-	.loc 1 1889 0
+.LBB1696:
+.LBB1691:
+	.loc 1 1897 0
 	adrp	x1, .LC35
 	add	x1, x1, :lo12:.LC35
-.LBE1687:
-.LBE1692:
-	.loc 1 2154 0
+.LBE1691:
+.LBE1696:
+	.loc 1 2162 0
 	lsr	w3, w0, 1
-	.loc 1 2155 0
+	.loc 1 2163 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x21, 20]
-.LBB1693:
-.LBB1688:
-	.loc 1 1880 0
+.LBB1697:
+.LBB1692:
+	.loc 1 1888 0
 	ldr	x26, [x19]
-.LVL503:
-	.loc 1 1889 0
+.LVL507:
+	.loc 1 1897 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL504:
-	.loc 1 1890 0
-	cbz	x0, .L538
-	.loc 1 1893 0
+.LVL508:
+	.loc 1 1898 0
+	cbz	x0, .L551
+	.loc 1 1901 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL505:
+.LVL509:
 	mov	w24, w0
-	.loc 1 1895 0
-	cbnz	w0, .L582
-.LBB1669:
-.LBB1670:
+	.loc 1 1903 0
+	cbnz	w0, .L595
+.LBB1673:
+.LBB1674:
 	.file 15 "./include/linux/ioport.h"
 	.loc 15 204 0
 	ldp	x1, x2, [x29, 104]
-.LBE1670:
-.LBE1669:
-	.loc 1 1900 0
+.LBE1674:
+.LBE1673:
+	.loc 1 1908 0
 	str	x1, [x19, 184]
-	.loc 1 1903 0
+	.loc 1 1911 0
 	mov	x3, 1
 	mov	x0, x26
-.LBB1672:
-.LBB1671:
+.LBB1676:
+.LBB1675:
 	.loc 15 204 0
 	add	x2, x2, 1
 	sub	x2, x2, x1
-.LBE1671:
-.LBE1672:
-	.loc 1 1901 0
+.LBE1675:
+.LBE1676:
+	.loc 1 1909 0
 	str	w2, [x21, 16]
-	.loc 1 1903 0
+	.loc 1 1911 0
 	sxtw	x2, w2
 	bl	devm_memremap
-.LVL506:
+.LVL510:
 	str	x0, [x21, 8]
-	.loc 1 1905 0
-	cbz	x0, .L509
 	.loc 1 1913 0
+	cbz	x0, .L522
+	.loc 1 1921 0
 	mov	x1, x0
 	ldr	w2, [x21, 16]
 	ldr	x0, [x19, 184]
 	mov	w4, 4
 	mov	w3, 2097152
 	bl	ebc_buf_init
-.LVL507:
-	.loc 1 1914 0
-	cbnz	w0, .L509
-	.loc 1 1919 0
+.LVL511:
+	.loc 1 1922 0
+	cbnz	w0, .L522
+	.loc 1 1927 0
 	ldr	x0, [x21, 8]
-	.loc 1 1920 0
+	.loc 1 1928 0
 	mov	x5, 1048576
 	str	x5, [x22, 40]
-.LBB1673:
-.LBB1674:
+.LBB1677:
+.LBB1678:
 	.loc 2 711 0
 	mov	w2, 32960
-.LBE1674:
-.LBE1673:
-	.loc 1 1919 0
+.LBE1678:
+.LBE1677:
+	.loc 1 1927 0
 	add	x6, x0, 10485760
 	str	x6, [x22, 24]
 	add	x4, x0, 11534336
-	.loc 1 1925 0
+	.loc 1 1933 0
 	add	x1, x0, 12582912
-	.loc 1 1921 0
+	.loc 1 1929 0
 	ldr	x3, [x19, 184]
-.LBB1678:
-.LBB1675:
+.LBB1682:
+.LBB1679:
 	.loc 2 711 0
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
-.LBE1675:
-.LBE1678:
-	.loc 1 1921 0
+.LBE1679:
+.LBE1682:
+	.loc 1 1929 0
 	add	x7, x3, 10485760
 	str	x7, [x22, 32]
-	.loc 1 1922 0
+	.loc 1 1930 0
 	str	x6, [x21, 168]
-	.loc 1 1921 0
+	.loc 1 1929 0
 	add	x3, x3, 11534336
-	.loc 1 1920 0
+	.loc 1 1928 0
 	str	x5, [x22, 64]
-	.loc 1 1921 0
+	.loc 1 1929 0
 	stp	x4, x3, [x22, 48]
-	.loc 1 1925 0
+	.loc 1 1933 0
 	str	x1, [x21, 112]
-.LBB1679:
-.LBB1676:
+.LBB1683:
+.LBB1680:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
-.LBE1676:
-.LBE1679:
-	.loc 1 1922 0
+.LBE1680:
+.LBE1683:
+	.loc 1 1930 0
 	str	x4, [x21, 176]
-.LBB1680:
-.LBB1677:
+.LBB1684:
+.LBB1681:
 	.loc 2 711 0
 	bl	devm_kmalloc
-.LVL508:
-.LBE1677:
-.LBE1680:
-	.loc 1 1928 0
+.LVL512:
+.LBE1681:
+.LBE1684:
+	.loc 1 1936 0
 	str	x0, [x21, 128]
-	.loc 1 1929 0
-	cbz	x0, .L509
-.LBB1681:
-.LBB1682:
+	.loc 1 1937 0
+	cbz	x0, .L522
+.LBB1685:
+.LBB1686:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL509:
-.LBE1682:
-.LBE1681:
-	.loc 1 1931 0
+.LVL513:
+.LBE1686:
+.LBE1685:
+	.loc 1 1939 0
 	str	x0, [x21, 136]
-	.loc 1 1932 0
-	cbz	x0, .L509
-.LBB1683:
-.LBB1684:
+	.loc 1 1940 0
+	cbz	x0, .L522
+.LBB1687:
+.LBB1688:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL510:
-.LBE1684:
-.LBE1683:
-	.loc 1 1934 0
-	str	x0, [x21, 144]
-	.loc 1 1935 0
-	cbz	x0, .L509
+.LVL514:
+.LBE1688:
+.LBE1687:
 	.loc 1 1942 0
+	str	x0, [x21, 144]
+	.loc 1 1943 0
+	cbz	x0, .L522
+	.loc 1 1950 0
 	ldp	w1, w0, [x22, 84]
-.LBB1685:
-.LBB1686:
+.LBB1689:
+.LBB1690:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	mul	w1, w1, w0
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL511:
-.LBE1686:
-.LBE1685:
-	.loc 1 1942 0
+.LVL515:
+.LBE1690:
+.LBE1689:
+	.loc 1 1950 0
 	str	x0, [x21, 152]
-	.loc 1 1943 0
-	cbz	x0, .L509
-	.loc 1 1945 0
+	.loc 1 1951 0
+	cbz	x0, .L522
+	.loc 1 1953 0
 	ldp	w2, w1, [x22, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
-.LVL512:
-	.loc 1 1946 0
+.LVL516:
+	.loc 1 1954 0
 	ldrsw	x2, [x21, 20]
 	mov	w1, 255
 	ldr	x0, [x21, 144]
 	bl	memset
-.LVL513:
-.LBE1688:
-.LBE1693:
-.LBB1694:
-.LBB1695:
-	.loc 1 1840 0
+.LVL517:
+.LBE1692:
+.LBE1697:
+.LBB1698:
+.LBB1699:
+	.loc 1 1848 0
 	ldr	x26, [x19, 272]
-.LVL514:
-	.loc 1 1846 0
+.LVL518:
+	.loc 1 1854 0
 	adrp	x1, .LC37
 	mov	w2, 0
 	add	x1, x1, :lo12:.LC37
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL515:
-	.loc 1 1847 0
-	cbz	x0, .L539
-	.loc 1 1850 0
+.LVL519:
+	.loc 1 1855 0
+	cbz	x0, .L552
+	.loc 1 1858 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL516:
+.LVL520:
 	mov	w24, w0
-	.loc 1 1852 0
-	cbz	w0, .L583
-.L510:
-.LBE1695:
-.LBE1694:
-	.loc 1 2168 0
+	.loc 1 1860 0
+	cbz	w0, .L596
+.L523:
+.LBE1699:
+.LBE1698:
+	.loc 1 2176 0
 	adrp	x1, .LC70
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC70
 	bl	_dev_err
-.LVL517:
-	.loc 1 2169 0
-	b	.L492
-.LVL518:
+.LVL521:
+	.loc 1 2177 0
+	b	.L505
+.LVL522:
 	.p2align 3
-.L501:
-	.loc 1 2150 0
+.L514:
+	.loc 1 2158 0
 	mov	w24, -22
-	.loc 1 2149 0
+	.loc 1 2157 0
 	adrp	x1, .LC74
 	mov	w2, w24
 	add	x1, x1, :lo12:.LC74
 	mov	x0, x20
 	bl	_dev_err
-.LVL519:
-.L492:
-	.loc 1 2193 0
+.LVL523:
+.L505:
+	.loc 1 2201 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w24
-.LVL520:
+.LVL524:
 	ldr	x2, [x29, 200]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L584
+	cbnz	x1, .L597
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL521:
+.LVL525:
 	ldp	x23, x24, [sp, 48]
 	ldp	x25, x26, [sp, 64]
-.LVL522:
+.LVL526:
 	ldp	x27, x28, [sp, 80]
-.LVL523:
+.LVL527:
 	ldp	x29, x30, [sp], 208
 	.cfi_remember_state
 	.cfi_restore 30
@@ -6185,251 +6241,251 @@ ebc_probe:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL524:
+.LVL528:
 	.p2align 3
-.L582:
+.L595:
 	.cfi_restore_state
-.LBB1702:
-.LBB1689:
-	.loc 1 1896 0
+.LBB1706:
+.LBB1693:
+	.loc 1 1904 0
 	adrp	x1, .LC36
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC36
 	bl	_dev_err
-.LVL525:
-.L506:
-.LBE1689:
-.LBE1702:
-	.loc 1 2161 0
+.LVL529:
+.L519:
+.LBE1693:
+.LBE1706:
+	.loc 1 2169 0
 	adrp	x1, .LC69
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC69
 	bl	_dev_err
-.LVL526:
-	.loc 1 2162 0
-	b	.L492
-.LVL527:
+.LVL530:
+	.loc 1 2170 0
+	b	.L505
+.LVL531:
 	.p2align 3
-.L505:
-.LBB1703:
-.LBB1663:
-	.loc 1 1489 0
+.L518:
+.LBB1707:
+.LBB1667:
+	.loc 1 1487 0
 	str	wzr, [x22, 96]
-	b	.L531
+	b	.L544
 	.p2align 3
-.L504:
+.L517:
+.LBB1656:
+.LBB1654:
 .LBB1652:
-.LBB1650:
-.LBB1648:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC34
-.LBE1648:
-.LBE1650:
 .LBE1652:
-	.loc 1 1486 0
+.LBE1654:
+.LBE1656:
+	.loc 1 1484 0
 	str	wzr, [x22, 92]
+.LBB1657:
+.LBB1655:
 .LBB1653:
-.LBB1651:
-.LBB1649:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 120
 	add	x1, x1, :lo12:.LC34
 	bl	of_property_read_variable_u32_array
-.LVL528:
+.LVL532:
 	.loc 14 501 0
-	tbz	w0, #31, .L531
-	b	.L505
+	tbz	w0, #31, .L544
+	b	.L518
 	.p2align 3
-.L503:
-.LBE1649:
-.LBE1651:
+.L516:
 .LBE1653:
-.LBB1654:
-.LBB1643:
-.LBB1641:
+.LBE1655:
+.LBE1657:
+.LBB1658:
+.LBB1647:
+.LBB1645:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC33
-.LBE1641:
-.LBE1643:
-.LBE1654:
-	.loc 1 1483 0
+.LBE1645:
+.LBE1647:
+.LBE1658:
+	.loc 1 1481 0
 	str	wzr, [x22, 156]
-.LBB1655:
-.LBB1644:
-.LBB1642:
+.LBB1659:
+.LBB1648:
+.LBB1646:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 116
 	add	x1, x1, :lo12:.LC33
 	bl	of_property_read_variable_u32_array
-.LVL529:
+.LVL533:
 	.loc 14 501 0
-	tbz	w0, #31, .L530
-	b	.L504
+	tbz	w0, #31, .L543
+	b	.L517
 	.p2align 3
-.L502:
-.LBE1642:
-.LBE1644:
-.LBE1655:
-.LBB1656:
-.LBB1636:
-.LBB1634:
+.L515:
+.LBE1646:
+.LBE1648:
+.LBE1659:
+.LBB1660:
+.LBB1640:
+.LBB1638:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC32
-.LBE1634:
-.LBE1636:
-.LBE1656:
-	.loc 1 1480 0
+.LBE1638:
+.LBE1640:
+.LBE1660:
+	.loc 1 1478 0
 	str	wzr, [x22, 152]
-.LBB1657:
-.LBB1637:
-.LBB1635:
+.LBB1661:
+.LBB1641:
+.LBB1639:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 180
 	add	x1, x1, :lo12:.LC32
 	bl	of_property_read_variable_u32_array
-.LVL530:
+.LVL534:
 	.loc 14 501 0
-	tbz	w0, #31, .L529
-	b	.L503
+	tbz	w0, #31, .L542
+	b	.L516
 	.p2align 3
-.L581:
-.LBE1635:
-.LBE1637:
-.LBE1657:
-.LBB1658:
-.LBB1629:
-.LBB1627:
+.L594:
+.LBE1639:
+.LBE1641:
+.LBE1661:
+.LBB1662:
+.LBB1633:
+.LBB1631:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC31
-.LBE1627:
-.LBE1629:
-.LBE1658:
-	.loc 1 1477 0
+.LBE1631:
+.LBE1633:
+.LBE1662:
+	.loc 1 1475 0
 	str	wzr, [x22, 148]
-.LBB1659:
-.LBB1630:
-.LBB1628:
+.LBB1663:
+.LBB1634:
+.LBB1632:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 176
 	add	x1, x1, :lo12:.LC31
 	bl	of_property_read_variable_u32_array
-.LVL531:
+.LVL535:
 	.loc 14 501 0
-	tbz	w0, #31, .L528
-	b	.L502
-.LVL532:
+	tbz	w0, #31, .L541
+	b	.L515
+.LVL536:
 	.p2align 3
-.L583:
-.LBE1628:
-.LBE1630:
-.LBE1659:
+.L596:
+.LBE1632:
+.LBE1634:
 .LBE1663:
-.LBE1703:
-.LBB1704:
-.LBB1698:
-	.loc 1 1858 0
+.LBE1667:
+.LBE1707:
+.LBB1708:
+.LBB1702:
+	.loc 1 1866 0
 	mov	x0, x26
 	mov	x3, 1
-.LBB1696:
-.LBB1697:
+.LBB1700:
+.LBB1701:
 	.loc 15 204 0
 	ldp	x1, x26, [x29, 104]
-.LVL533:
+.LVL537:
 	add	x26, x26, 1
 	sub	x26, x26, x1
-.LBE1697:
-.LBE1696:
-	.loc 1 1858 0
+.LBE1701:
+.LBE1700:
+	.loc 1 1866 0
 	sxtw	x2, w26
 	bl	devm_memremap
-.LVL534:
+.LVL538:
 	str	x0, [x19, 376]
-	.loc 1 1860 0
-	cbz	x0, .L585
-	.loc 1 1865 0
+	.loc 1 1868 0
+	cbz	x0, .L598
+	.loc 1 1873 0
 	bl	epd_lut_from_mem_init
-.LVL535:
-	.loc 1 1866 0
-	tbnz	w0, #31, .L586
-.L512:
-.LBE1698:
-.LBE1704:
-.LBB1705:
-.LBB1706:
-	.loc 1 1955 0
+.LVL539:
+	.loc 1 1874 0
+	tbnz	w0, #31, .L599
+.L525:
+.LBE1702:
+.LBE1708:
+.LBB1709:
+.LBB1710:
+	.loc 1 1963 0
 	add	x0, x19, 736
 	mov	x1, 68719476704
 	str	x1, [x21, 544]
-	.loc 1 1957 0
+	.loc 1 1965 0
 	add	x25, x25, :lo12:.LANCHOR0
-.LBB1707:
-.LBB1708:
-.LBB1709:
-.LBB1710:
 .LBB1711:
+.LBB1712:
+.LBB1713:
+.LBB1714:
+.LBB1715:
 	.loc 12 288 0
 	str	x0, [x19, 736]
+.LBE1715:
+.LBE1714:
+.LBE1713:
+.LBE1712:
 .LBE1711:
-.LBE1710:
-.LBE1709:
-.LBE1708:
-.LBE1707:
-	.loc 1 1953 0
+	.loc 1 1961 0
 	mov	w26, 99
-.LBB1713:
-.LBB1712:
+.LBB1717:
+.LBB1716:
 	.file 16 "./include/linux/list.h"
 	.loc 16 29 0
 	str	x0, [x0, 8]
-.LBE1712:
-.LBE1713:
-	.loc 1 1955 0
+.LBE1716:
+.LBE1717:
+	.loc 1 1963 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x21, 568]
-	.loc 1 1957 0
+	.loc 1 1965 0
 	adrp	x3, .LC71
 	mov	w2, -1
 	add	x3, x3, :lo12:.LC71
 	mov	x1, x21
 	adrp	x0, ebc_auto_tast_function
-	.loc 1 1953 0
+	.loc 1 1961 0
 	str	w26, [x29, 104]
-	.loc 1 1957 0
+	.loc 1 1965 0
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
-.LVL536:
+.LVL540:
 	str	x0, [x25, 8]
-	.loc 1 1958 0
+	.loc 1 1966 0
 	cmn	x0, #4096
-	bhi	.L587
-	.loc 1 1962 0
+	bhi	.L600
+	.loc 1 1970 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
-.LVL537:
-	.loc 1 1963 0
+.LVL541:
+	.loc 1 1971 0
 	ldr	x2, [x25, 8]
-.LBB1714:
-.LBB1715:
+.LBB1718:
+.LBB1719:
 	.file 17 "./arch/arm64/include/asm/atomic_lse.h"
 	.loc 17 47 0
 	mov	w0, 1
-.LVL538:
+.LVL542:
 	add	x1, x2, 48
-.LVL539:
+.LVL543:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -6457,49 +6513,49 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL540:
+.LVL544:
 #NO_APP
-.LBE1715:
-.LBE1714:
-.LBB1716:
-	.loc 1 1966 0
+.LBE1719:
+.LBE1718:
+.LBB1720:
+	.loc 1 1974 0
 	adrp	x3, .LC42
 	adrp	x0, ebc_thread
-.LVL541:
+.LVL545:
 	add	x3, x3, :lo12:.LC42
 	mov	w2, -1
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x21
-.LBE1716:
-	.loc 1 1965 0
+.LBE1720:
+	.loc 1 1973 0
 	str	w26, [x29, 104]
-.LBB1717:
-	.loc 1 1966 0
+.LBB1721:
+	.loc 1 1974 0
 	bl	kthread_create_on_node
-.LVL542:
+.LVL546:
 	mov	x25, x0
-.LVL543:
+.LVL547:
 	cmn	x0, #4096
-	bhi	.L514
+	bhi	.L527
 	bl	wake_up_process
-.LVL544:
-.LBE1717:
+.LVL548:
+.LBE1721:
 	str	x25, [x21, 120]
-	.loc 1 1971 0
+	.loc 1 1979 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x25
 	bl	sched_setscheduler_nocheck
-.LVL545:
-	.loc 1 1972 0
+.LVL549:
+	.loc 1 1980 0
 	ldr	x2, [x21, 120]
-.LBB1718:
-.LBB1719:
+.LBB1722:
+.LBB1723:
 	.loc 17 47 0
 	mov	w0, 1
-.LVL546:
+.LVL550:
 	add	x1, x2, 48
-.LVL547:
+.LVL551:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -6527,62 +6583,62 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL548:
+.LVL552:
 #NO_APP
-.LBE1719:
-.LBE1718:
-.LBE1706:
-.LBE1705:
-.LBB1722:
-.LBB1723:
-	.loc 1 1981 0
+.LBE1723:
+.LBE1722:
+.LBE1710:
+.LBE1709:
+.LBB1726:
+.LBB1727:
+	.loc 1 1989 0
 	mov	w0, -1
-.LVL549:
+.LVL553:
 	str	w0, [x21, 48]
-.LBB1724:
-.LBB1725:
+.LBB1728:
+.LBB1729:
 	.loc 4 39 0
 	add	x0, x19, 400
-.LVL550:
-.LBE1725:
-.LBE1724:
-	.loc 1 1985 0
+.LVL554:
+.LBE1729:
+.LBE1728:
+	.loc 1 1993 0
 	str	wzr, [x21, 28]
-	.loc 1 1984 0
+	.loc 1 1992 0
 	str	wzr, [x21, 80]
+.LBB1734:
 .LBB1730:
-.LBB1726:
 	.loc 4 43 0
 	adrp	x1, .LC43
-.LBE1726:
 .LBE1730:
-	.loc 1 1980 0
+.LBE1734:
+	.loc 1 1988 0
 	str	wzr, [x21, 184]
+.LBB1735:
 .LBB1731:
-.LBB1727:
 	.loc 4 43 0
 	add	x1, x1, :lo12:.LC43
-.LBE1727:
 .LBE1731:
-	.loc 1 1982 0
+.LBE1735:
+	.loc 1 1990 0
 	str	wzr, [x21, 592]
-	.loc 1 1992 0
+	.loc 1 2000 0
 	add	x25, x19, 616
-.LVL551:
-	.loc 1 1983 0
+.LVL555:
+	.loc 1 1991 0
 	str	wzr, [x21, 596]
-	.loc 1 1993 0
+	.loc 1 2001 0
 	adrp	x26, jiffies
+.LBB1736:
 .LBB1732:
-.LBB1728:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0]
-.LBE1728:
 .LBE1732:
-	.loc 1 1993 0
+.LBE1736:
+	.loc 1 2001 0
 	mov	x27, 268435455
+.LBB1737:
 .LBB1733:
-.LBB1729:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0, 16]
 	stp	xzr, xzr, [x0, 32]
@@ -6600,12 +6656,12 @@ ebc_probe:
 	str	x1, [x19, 400]
 	.loc 4 45 0
 	bl	wakeup_source_add
-.LVL552:
-.LBE1729:
+.LVL556:
 .LBE1733:
-	.loc 1 1989 0
+.LBE1737:
+	.loc 1 1997 0
 	str	wzr, [x21, 424]
-	.loc 1 1992 0
+	.loc 1 2000 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -6613,17 +6669,17 @@ ebc_probe:
 	adrp	x1, ebc_vdd_power_timeout
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
-.LVL553:
-	.loc 1 1993 0
+.LVL557:
+	.loc 1 2001 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
-	.loc 1 1996 0
+	.loc 1 2004 0
 	add	x25, x19, 672
-	.loc 1 1993 0
+	.loc 1 2001 0
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL554:
-	.loc 1 1996 0
+.LVL558:
+	.loc 1 2004 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -6631,633 +6687,638 @@ ebc_probe:
 	adrp	x1, ebc_frame_timeout
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
-.LVL555:
-	.loc 1 1997 0
+.LVL559:
+	.loc 1 2005 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL556:
-.LBE1723:
-.LBE1722:
-.LBB1734:
-.LBB1735:
-	.loc 1 2007 0
+.LVL560:
+.LBE1727:
+.LBE1726:
+.LBB1738:
+.LBB1739:
+	.loc 1 2015 0
 	adrp	x0, saved_command_line
 	adrp	x1, .LC44
-	.loc 1 2004 0
+	.loc 1 2012 0
 	stp	wzr, wzr, [x29, 100]
-.LVL557:
-	.loc 1 2007 0
+.LVL561:
+	.loc 1 2015 0
 	add	x1, x1, :lo12:.LC44
 	ldr	x25, [x0, #:lo12:saved_command_line]
 	mov	x0, x25
 	bl	strstr
-.LVL558:
-	.loc 1 2008 0
+.LVL562:
+	.loc 1 2016 0
 	adrp	x1, .LC45
-	.loc 1 2007 0
+	.loc 1 2015 0
 	mov	x26, x0
-.LVL559:
-	.loc 1 2008 0
+.LVL563:
+	.loc 1 2016 0
 	add	x1, x1, :lo12:.LC45
 	mov	x0, x25
 	bl	strstr
-.LVL560:
+.LVL564:
 	mov	x28, x0
-.LVL561:
-	.loc 1 2013 0
-	cbz	x26, .L515
-	.loc 1 2014 0
+.LVL565:
+	.loc 1 2021 0
+	cbz	x26, .L528
+	.loc 1 2022 0
 	add	x2, x29, 100
 	adrp	x1, .LC46
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC46
 	bl	sscanf
-.LVL562:
-	.loc 1 2015 0
+.LVL566:
+	.loc 1 2023 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
-	bls	.L588
-.L515:
-	.loc 1 2027 0
+	bls	.L601
+.L528:
+	.loc 1 2035 0
 	mov	w25, 0
-.LVL563:
+.LVL567:
 	mov	x27, 0
-.LVL564:
-	.loc 1 2011 0
+.LVL568:
+	.loc 1 2019 0
 	mov	x26, 0
-.LVL565:
-	.loc 1 2027 0
-	cbz	x28, .L535
-.LVL566:
-.L534:
-	.loc 1 2028 0
+.LVL569:
+	.loc 1 2035 0
+	cbz	x28, .L548
+.LVL570:
+.L547:
+	.loc 1 2036 0
 	add	x2, x29, 104
 	mov	x0, x28
 	adrp	x1, .LC49
 	add	x1, x1, :lo12:.LC49
 	bl	sscanf
-.LVL567:
-	.loc 1 2006 0
+.LVL571:
+	.loc 1 2014 0
 	mov	w28, 0
-.LVL568:
-	.loc 1 2029 0
+.LVL572:
+	.loc 1 2037 0
 	ldr	w2, [x29, 104]
-	.loc 1 2011 0
+	.loc 1 2019 0
 	mov	x26, 0
-.LVL569:
-	.loc 1 2029 0
+.LVL573:
+	.loc 1 2037 0
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
-	bls	.L589
-.L519:
-	.loc 1 2041 0
-	cbnz	w25, .L518
-.LVL570:
-.L535:
-	.loc 1 2042 0
+	bls	.L602
+.L532:
+	.loc 1 2049 0
+	cbnz	w25, .L531
+.LVL574:
+.L548:
+	.loc 1 2050 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC52
 	add	x1, x1, :lo12:.LC52
 	bl	_dev_info
-.LVL571:
-	.loc 1 2043 0
+.LVL575:
+	.loc 1 2051 0
 	ldr	x0, [x19, 16]
 	bl	ebc_pmic_verity_vcom
-.LVL572:
-.LBB1736:
-.LBB1737:
-	.loc 1 1397 0
+.LVL576:
+.LBB1740:
+.LBB1741:
+	.loc 1 1395 0
 	bl	ebc_empty_buf_get
-.LVL573:
+.LVL577:
 	mov	x25, x0
-.LVL574:
-	.loc 1 1398 0
+.LVL578:
+	.loc 1 1396 0
 	ldp	w2, w0, [x19, 108]
 	mov	w1, 255
 	mul	w2, w2, w0
 	ldr	x0, [x25, 16]
 	lsr	w2, w2, 1
 	bl	memset
-.LVL575:
-	.loc 1 1401 0
-	stp	wzr, wzr, [x25, 48]
+.LVL579:
 	.loc 1 1399 0
+	stp	wzr, wzr, [x25, 48]
+	.loc 1 1397 0
 	mov	w0, 16
 	str	w0, [x25, 40]
-	.loc 1 1404 0
-	mov	x0, x25
 	.loc 1 1402 0
+	mov	x0, x25
+	.loc 1 1400 0
 	ldr	w1, [x19, 108]
 	str	w1, [x25, 56]
-	.loc 1 1403 0
+	.loc 1 1401 0
 	ldr	w1, [x19, 112]
 	str	w1, [x25, 60]
-	.loc 1 1404 0
+	.loc 1 1402 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL576:
-.L521:
-.LBE1737:
-.LBE1736:
-	.loc 1 2060 0
-	cbnz	w28, .L590
-.L523:
-	.loc 1 2073 0
+.LVL580:
+.L534:
+.LBE1741:
+.LBE1740:
+	.loc 1 2068 0
+	cbnz	w28, .L603
+.L536:
+	.loc 1 2081 0
 	ldr	w0, [x21, 80]
 	adrp	x22, .LANCHOR1
-	cbz	w0, .L591
-.L525:
-	.loc 1 2078 0
-	cbz	x27, .L526
-	.loc 1 2079 0
+	cbz	w0, .L604
+.L538:
+	.loc 1 2086 0
+	cbz	x27, .L539
+	.loc 1 2087 0
 	mov	x0, x27
 	bl	kfree
-.LVL577:
-.L526:
-	.loc 1 2080 0
-	cbz	x26, .L517
-	.loc 1 2081 0
+.LVL581:
+.L539:
+	.loc 1 2088 0
+	cbz	x26, .L530
+	.loc 1 2089 0
 	mov	x0, x26
 	bl	kfree
-.LVL578:
-.L517:
-.LBE1735:
-.LBE1734:
-.LBB1747:
-.LBB1748:
-.LBB1749:
+.LVL582:
+.L530:
+.LBE1739:
+.LBE1738:
+.LBB1751:
+.LBB1752:
+.LBB1753:
 	.loc 2 1186 0
 	str	x19, [x20, 184]
-.LBE1749:
-.LBE1748:
-.LBE1747:
-.LBB1750:
-.LBB1751:
-	.loc 1 1825 0
+.LBE1753:
+.LBE1752:
+.LBE1751:
+.LBB1754:
+.LBB1755:
+	.loc 1 1832 0
 	add	x22, x22, :lo12:.LANCHOR1
 	add	x0, x22, 224
 	bl	misc_register
-.LVL579:
-	.loc 1 1827 0
+.LVL583:
+	.loc 1 1834 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 400
 	bl	device_create_file
-.LVL580:
-	.loc 1 1828 0
+.LVL584:
+	.loc 1 1835 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 432
 	bl	device_create_file
-.LVL581:
-	.loc 1 1829 0
+.LVL585:
+	.loc 1 1836 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 464
 	bl	device_create_file
-.LVL582:
-	.loc 1 1830 0
+.LVL586:
+	.loc 1 1837 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 496
 	bl	device_create_file
-.LVL583:
-	.loc 1 1831 0
+.LVL587:
+	.loc 1 1838 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 528
 	bl	device_create_file
-.LVL584:
-	.loc 1 1832 0
+.LVL588:
+	.loc 1 1839 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 560
 	bl	device_create_file
-.LVL585:
-.LBE1751:
-.LBE1750:
-	.loc 1 2190 0
+.LVL589:
+	.loc 1 1840 0
+	ldr	x0, [x19, 272]
+	add	x1, x22, 592
+	bl	device_create_file
+.LVL590:
+.LBE1755:
+.LBE1754:
+	.loc 1 2198 0
 	ldr	x0, [x21, 88]
 	adrp	x2, .LC16
 	adrp	x1, .LC53
 	add	x2, x2, :lo12:.LC16
 	add	x1, x1, :lo12:.LC53
 	bl	_dev_info
-.LVL586:
-	.loc 1 2192 0
-	b	.L492
-.LVL587:
+.LVL591:
+	.loc 1 2200 0
+	b	.L505
+.LVL592:
 	.p2align 3
-.L588:
-.LBB1752:
-.LBB1744:
-	.loc 1 2017 0
+.L601:
+.LBB1756:
+.LBB1748:
+	.loc 1 2025 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC47
 	add	x1, x1, :lo12:.LC47
 	bl	_dev_info
-.LVL588:
-	.loc 1 2018 0
+.LVL593:
+	.loc 1 2026 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
-.LBB1738:
-.LBB1739:
-.LBB1740:
+.LBB1742:
+.LBB1743:
+.LBB1744:
 	.file 18 "./include/linux/slab.h"
 	.loc 18 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL589:
+.LVL594:
 	mov	x27, x0
-.LVL590:
-.LBE1740:
-.LBE1739:
-.LBE1738:
-	.loc 1 2019 0
-	cbz	x0, .L592
-	.loc 1 2023 0
+.LVL595:
+.LBE1744:
+.LBE1743:
+.LBE1742:
+	.loc 1 2027 0
+	cbz	x0, .L605
+	.loc 1 2031 0
 	ldp	w2, w1, [x22, 84]
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 100]
-.LVL591:
+.LVL596:
 	sub	x1, x1, x3
-.LVL592:
+.LVL597:
 	ldr	x3, [x21, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL593:
-	.loc 1 2027 0
-	cbnz	x28, .L593
-	.loc 1 2006 0
+.LVL598:
+	.loc 1 2035 0
+	cbnz	x28, .L606
+	.loc 1 2014 0
 	mov	w28, 0
-.LVL594:
-	.loc 1 2011 0
+.LVL599:
+	.loc 1 2019 0
 	mov	x26, 0
-.LVL595:
-.L518:
-	.loc 1 2048 0
+.LVL600:
+.L531:
+	.loc 1 2056 0
 	bl	ebc_empty_buf_get
-.LVL596:
+.LVL601:
 	mov	x25, x0
-.LVL597:
-	.loc 1 2049 0
-	cbz	x0, .L521
-	.loc 1 2050 0
+.LVL602:
+	.loc 1 2057 0
+	cbz	x0, .L534
+	.loc 1 2058 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
 	ldr	x0, [x25, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL598:
-	.loc 1 2053 0
+.LVL603:
+	.loc 1 2061 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 2051 0
+	.loc 1 2059 0
 	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 2056 0
+	.loc 1 2064 0
 	mov	x0, x25
-	.loc 1 2054 0
+	.loc 1 2062 0
 	ldr	w1, [x22, 84]
 	str	w1, [x25, 56]
-	.loc 1 2055 0
+	.loc 1 2063 0
 	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 2056 0
+	.loc 1 2064 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL599:
-	b	.L521
-.LVL600:
+.LVL604:
+	b	.L534
+.LVL605:
 	.p2align 3
-.L591:
-	.loc 1 2074 0
+.L604:
+	.loc 1 2082 0
 	mov	w2, 1
 	str	w2, [x21, 80]
-	.loc 1 2075 0
+	.loc 1 2083 0
 	add	x0, x22, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL601:
-	b	.L525
-.LVL602:
+.LVL606:
+	b	.L538
+.LVL607:
 	.p2align 3
-.L589:
-	.loc 1 2031 0
+.L602:
+	.loc 1 2039 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC50
 	add	x1, x1, :lo12:.LC50
 	bl	_dev_info
-.LVL603:
-	.loc 1 2032 0
+.LVL608:
+	.loc 1 2040 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
-.LBB1741:
-.LBB1742:
-.LBB1743:
+.LBB1745:
+.LBB1746:
+.LBB1747:
 	.loc 18 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL604:
+.LVL609:
 	mov	x26, x0
-.LBE1743:
-.LBE1742:
-.LBE1741:
-	.loc 1 2033 0
-	cbz	x0, .L594
-	.loc 1 2037 0
+.LBE1747:
+.LBE1746:
+.LBE1745:
+	.loc 1 2041 0
+	cbz	x0, .L607
+	.loc 1 2045 0
 	ldp	w2, w1, [x22, 84]
-	.loc 1 2030 0
+	.loc 1 2038 0
 	mov	w28, 1
-	.loc 1 2037 0
+	.loc 1 2045 0
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
-.LVL605:
+.LVL610:
 	sub	x1, x1, x3
-.LVL606:
+.LVL611:
 	ldr	x3, [x21, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL607:
-	b	.L519
-.LVL608:
+.LVL612:
+	b	.L532
+.LVL613:
 	.p2align 3
-.L509:
-.LBE1744:
-.LBE1752:
-.LBB1753:
-.LBB1690:
-	.loc 1 1906 0
+.L522:
+.LBE1748:
+.LBE1756:
+.LBB1757:
+.LBB1694:
+	.loc 1 1914 0
 	mov	w24, -12
-	b	.L506
-.LVL609:
+	b	.L519
+.LVL614:
 	.p2align 3
-.L590:
-.LBE1690:
-.LBE1753:
-.LBB1754:
-.LBB1745:
-	.loc 1 2061 0
+.L603:
+.LBE1694:
+.LBE1757:
+.LBB1758:
+.LBB1749:
+	.loc 1 2069 0
 	bl	ebc_empty_buf_get
-.LVL610:
+.LVL615:
 	mov	x25, x0
-.LVL611:
-	.loc 1 2062 0
-	cbz	x0, .L523
-	.loc 1 2063 0
+.LVL616:
+	.loc 1 2070 0
+	cbz	x0, .L536
+	.loc 1 2071 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
 	ldr	x0, [x25, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL612:
-	.loc 1 2066 0
+.LVL617:
+	.loc 1 2074 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 2064 0
+	.loc 1 2072 0
 	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 2067 0
+	.loc 1 2075 0
 	ldr	w0, [x22, 84]
 	str	w0, [x25, 56]
-	.loc 1 2069 0
+	.loc 1 2077 0
 	mov	x0, x25
-	.loc 1 2068 0
+	.loc 1 2076 0
 	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 2069 0
+	.loc 1 2077 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL613:
-	b	.L523
-.LVL614:
+.LVL618:
+	b	.L536
+.LVL619:
 	.p2align 3
-.L586:
-.LBE1745:
-.LBE1754:
-.LBB1755:
-.LBB1699:
-	.loc 1 1867 0
+.L599:
+.LBE1749:
+.LBE1758:
+.LBB1759:
+.LBB1703:
+	.loc 1 1875 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC39
 	add	x1, x1, :lo12:.LC39
 	bl	_dev_err
-.LVL615:
-	.loc 1 1868 0
+.LVL620:
+	.loc 1 1876 0
 	ldr	x0, [x19, 272]
 	mov	w2, w26
 	ldr	x1, [x19, 376]
 	bl	epd_lut_from_file_init
-.LVL616:
-	.loc 1 1869 0
-	tbz	w0, #31, .L512
-	.loc 1 1870 0
+.LVL621:
+	.loc 1 1877 0
+	tbz	w0, #31, .L525
+	.loc 1 1878 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC40
-	.loc 1 1871 0
+	.loc 1 1879 0
 	mov	w24, -1
-	.loc 1 1870 0
+	.loc 1 1878 0
 	add	x1, x1, :lo12:.LC40
 	bl	_dev_err
-.LVL617:
-	b	.L510
-.LVL618:
+.LVL622:
+	b	.L523
+.LVL623:
 	.p2align 3
-.L496:
-.LBE1699:
-.LBE1755:
-	.loc 1 2114 0
+.L509:
+.LBE1703:
+.LBE1759:
+	.loc 1 2122 0
 	mov	w24, -517
-	b	.L492
-.LVL619:
+	b	.L505
+.LVL624:
 	.p2align 3
-.L587:
-.LBB1756:
-.LBB1720:
-	.loc 1 1959 0
+.L600:
+.LBB1760:
+.LBB1724:
+	.loc 1 1967 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC41
 	add	x1, x1, :lo12:.LC41
 	bl	_dev_err
-.LVL620:
-.L513:
-.LBE1720:
-.LBE1756:
-	.loc 1 2175 0
+.LVL625:
+.L526:
+.LBE1724:
+.LBE1760:
+	.loc 1 2183 0
 	adrp	x1, .LC73
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC73
-	.loc 1 2176 0
+	.loc 1 2184 0
 	mov	w24, -1
-	.loc 1 2175 0
+	.loc 1 2183 0
 	bl	_dev_err
-.LVL621:
-	.loc 1 2176 0
-	b	.L492
-.LVL622:
+.LVL626:
+	.loc 1 2184 0
+	b	.L505
+.LVL627:
 	.p2align 3
-.L514:
-.LBB1757:
-.LBB1721:
-	.loc 1 1968 0
+.L527:
+.LBB1761:
+.LBB1725:
+	.loc 1 1976 0
 	ldr	x0, [x21, 88]
-.LVL623:
+.LVL628:
 	adrp	x1, .LC72
-	.loc 1 1966 0
+	.loc 1 1974 0
 	str	x25, [x21, 120]
-	.loc 1 1968 0
+	.loc 1 1976 0
 	add	x1, x1, :lo12:.LC72
 	bl	_dev_err
-.LVL624:
-	b	.L513
-.LVL625:
+.LVL629:
+	b	.L526
+.LVL630:
 	.p2align 3
-.L537:
-.LBE1721:
-.LBE1757:
-	.loc 1 2100 0
+.L550:
+.LBE1725:
+.LBE1761:
+	.loc 1 2108 0
 	mov	w24, -12
-	b	.L492
-.LVL626:
+	b	.L505
+.LVL631:
 	.p2align 3
-.L538:
-.LBB1758:
-.LBB1691:
-	.loc 1 1891 0
+.L551:
+.LBB1762:
+.LBB1695:
+	.loc 1 1899 0
 	mov	w24, -19
-	b	.L506
-.LVL627:
-.L577:
-.LBE1691:
-.LBE1758:
-	.loc 1 2107 0
+	b	.L519
+.LVL632:
+.L590:
+.LBE1695:
+.LBE1762:
+	.loc 1 2115 0
 	adrp	x1, .LC25
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC25
-	.loc 1 2108 0
+	.loc 1 2116 0
 	mov	w24, -19
-	.loc 1 2107 0
+	.loc 1 2115 0
 	bl	_dev_err
-.LVL628:
-	.loc 1 2108 0
-	b	.L492
-.L580:
-	.loc 1 2135 0
+.LVL633:
+	.loc 1 2116 0
+	b	.L505
+.L593:
+	.loc 1 2143 0
 	adrp	x1, .LC29
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC29
-	.loc 1 2136 0
+	.loc 1 2144 0
 	mov	w24, -517
-	.loc 1 2135 0
+	.loc 1 2143 0
 	bl	_dev_err
-.LVL629:
-	.loc 1 2136 0
-	b	.L492
-.L578:
-	.loc 1 2123 0
+.LVL634:
+	.loc 1 2144 0
+	b	.L505
+.L591:
+	.loc 1 2131 0
 	adrp	x1, .LC27
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC27
-	.loc 1 2124 0
+	.loc 1 2132 0
 	mov	w24, -19
-	.loc 1 2123 0
+	.loc 1 2131 0
 	bl	_dev_err
-.LVL630:
-	.loc 1 2124 0
-	b	.L492
-.LVL631:
-.L539:
-.LBB1759:
-.LBB1700:
-	.loc 1 1848 0
+.LVL635:
+	.loc 1 2132 0
+	b	.L505
+.LVL636:
+.L552:
+.LBB1763:
+.LBB1704:
+	.loc 1 1856 0
 	mov	w24, -19
-	b	.L510
-.LVL632:
-.L579:
-.LBE1700:
-.LBE1759:
-	.loc 1 2130 0
+	b	.L523
+.LVL637:
+.L592:
+.LBE1704:
+.LBE1763:
+	.loc 1 2138 0
 	adrp	x1, .LC28
 	mov	x0, x20
-.LVL633:
+.LVL638:
 	add	x1, x1, :lo12:.LC28
-	.loc 1 2131 0
+	.loc 1 2139 0
 	mov	w24, -517
-	.loc 1 2130 0
+	.loc 1 2138 0
 	bl	_dev_err
-.LVL634:
-	.loc 1 2131 0
-	b	.L492
-.LVL635:
-.L585:
-.LBB1760:
-.LBB1701:
-	.loc 1 1861 0
+.LVL639:
+	.loc 1 2139 0
+	b	.L505
+.LVL640:
+.L598:
+.LBB1764:
+.LBB1705:
+	.loc 1 1869 0
 	ldr	x0, [x19, 272]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
 	adrp	x1, .LC38
-	mov	w3, 1861
+	mov	w3, 1869
 	add	x2, x2, 32
 	add	x1, x1, :lo12:.LC38
-	.loc 1 1862 0
+	.loc 1 1870 0
 	mov	w24, -12
-	.loc 1 1861 0
+	.loc 1 1869 0
 	bl	_dev_err
-.LVL636:
-	b	.L510
-.LVL637:
-.L584:
-.LBE1701:
-.LBE1760:
-	.loc 1 2193 0
+.LVL641:
+	b	.L523
+.LVL642:
+.L597:
+.LBE1705:
+.LBE1764:
+	.loc 1 2201 0
 	bl	__stack_chk_fail
-.LVL638:
-.L594:
-.LBB1761:
-.LBB1746:
-	.loc 1 2034 0
-	ldr	x0, [x21, 88]
-.LVL639:
+.LVL643:
+.L607:
+.LBB1765:
+.LBB1750:
+	.loc 1 2042 0
+	ldr	x0, [x21, 88]
+.LVL644:
 	adrp	x1, .LC51
 	adrp	x22, .LANCHOR1
 	add	x1, x1, :lo12:.LC51
 	bl	_dev_err
-.LVL640:
-	b	.L517
-.LVL641:
-.L592:
-	.loc 1 2020 0
+.LVL645:
+	b	.L530
+.LVL646:
+.L605:
+	.loc 1 2028 0
 	ldr	x0, [x21, 88]
-.LVL642:
+.LVL647:
 	adrp	x1, .LC48
 	adrp	x22, .LANCHOR1
 	add	x1, x1, :lo12:.LC48
 	bl	_dev_err
-.LVL643:
-	b	.L517
-.LVL644:
-.L593:
-	.loc 1 2016 0
+.LVL648:
+	b	.L530
+.LVL649:
+.L606:
+	.loc 1 2024 0
 	mov	w25, 1
-.LVL645:
-	b	.L534
-.LBE1746:
-.LBE1761:
+.LVL650:
+	b	.L547
+.LBE1750:
+.LBE1765:
 	.cfi_endproc
-.LFE2846:
+.LFE2847:
 	.size	ebc_probe, .-ebc_probe
 	.align	2
 	.p2align 3,,7
 	.type	ebc_power_set.constprop.12, %function
 ebc_power_set.constprop.12:
-.LFB2864:
+.LFB2865:
 	.loc 1 180 0
 	.cfi_startproc
-.LVL646:
+.LVL651:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -7273,45 +7334,45 @@ ebc_power_set.constprop.12:
 	mov	x19, x0
 	.loc 1 186 0
 	ldr	w0, [x20, 424]
-.LVL647:
-	cbz	w0, .L598
-.L596:
+.LVL652:
+	cbz	w0, .L611
+.L609:
 	.loc 1 190 0
 	mov	w1, 1
 	str	w1, [x20, 184]
 	.loc 1 191 0
 	ldr	x2, [x19, 16]
-.LBB1762:
-.LBB1763:
+.LBB1766:
+.LBB1767:
 	.loc 3 30 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL648:
-.LBE1763:
-.LBE1762:
+.LVL653:
+.LBE1767:
+.LBE1766:
 	.loc 1 192 0
 	ldr	x2, [x19, 8]
-.LBB1764:
-.LBB1765:
+.LBB1768:
+.LBB1769:
 	.loc 11 46 0
 	add	x1, x19, 24
 	mov	x0, x2
 	ldr	x2, [x2, 48]
 	blr	x2
-.LVL649:
-.LBE1765:
-.LBE1764:
+.LVL654:
+.LBE1769:
+.LBE1768:
 	.loc 1 193 0
 	ldr	x0, [x19]
 	adrp	x1, .LC75
 	add	x1, x1, :lo12:.LC75
 	bl	_dev_info
-.LVL650:
+.LVL655:
 	.loc 1 208 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
-.LVL651:
+.LVL656:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -7320,24 +7381,24 @@ ebc_power_set.constprop.12:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL652:
+.LVL657:
 	.p2align 3
-.L598:
+.L611:
 	.cfi_restore_state
 	.loc 1 187 0
 	mov	w0, 1
 	str	w0, [x20, 424]
-.LBB1766:
-.LBB1767:
+.LBB1770:
+.LBB1771:
 	.loc 4 58 0
 	add	x0, x19, 400
 	bl	__pm_stay_awake
-.LVL653:
-	b	.L596
-.LBE1767:
-.LBE1766:
+.LVL658:
+	b	.L609
+.LBE1771:
+.LBE1770:
 	.cfi_endproc
-.LFE2864:
+.LFE2865:
 	.size	ebc_power_set.constprop.12, .-ebc_power_set.constprop.12
 	.align	2
 	.p2align 3,,7
@@ -7347,24 +7408,24 @@ refresh_new_image2:
 .LFB2807:
 	.loc 1 213 0
 	.cfi_startproc
-.LVL654:
+.LVL659:
 	.loc 1 220 0
 	ldp	w16, w5, [x4, 52]
-.LVL655:
+.LVL660:
 	cmp	w5, 0
 	add	w11, w5, 7
 	csel	w11, w11, w5, lt
-.LVL656:
+.LVL661:
 	.loc 1 222 0
 	cmp	w16, 0
 	.loc 1 220 0
 	asr	w11, w11, 3
-.LVL657:
+.LVL662:
 	.loc 1 222 0
-	ble	.L599
+	ble	.L612
 	sub	w14, w11, #1
 	mov	w15, 0
-.LVL658:
+.LVL663:
 	add	x14, x14, 1
 	.loc 1 267 0
 	mov	w13, 234881024
@@ -7372,92 +7433,92 @@ refresh_new_image2:
 	lsl	x14, x14, 2
 	.loc 1 273 0
 	mov	w12, -536870912
-.LVL659:
+.LVL664:
 	.p2align 2
-.L601:
+.L614:
 	.loc 1 223 0 discriminator 1
 	mov	x6, 0
 	cmp	w11, 0
-	bgt	.L622
-	b	.L619
-.LVL660:
+	bgt	.L635
+	b	.L632
+.LVL665:
 	.p2align 3
-.L602:
+.L615:
 	.loc 1 236 0
 	tst	x5, 65280
-	bne	.L603
+	bne	.L616
 	.loc 1 237 0
 	and	w10, w4, 240
 	cmp	w10, 224
-	beq	.L624
+	beq	.L637
 	.loc 1 240 0
 	orr	w7, w7, 240
-.L603:
+.L616:
 	.loc 1 242 0
 	tst	x5, 16711680
-	bne	.L605
+	bne	.L618
 	.loc 1 243 0
 	and	w10, w4, 3840
 	cmp	w10, 3584
-	beq	.L625
+	beq	.L638
 	.loc 1 246 0
 	orr	w7, w7, 3840
-.L605:
+.L618:
 	.loc 1 248 0
 	tst	x5, 4278190080
-	bne	.L607
+	bne	.L620
 	.loc 1 249 0
 	and	w10, w4, 61440
 	cmp	w10, 57344
-	beq	.L626
+	beq	.L639
 	.loc 1 252 0
 	orr	w7, w7, 61440
-.L607:
+.L620:
 	.loc 1 254 0
 	tst	x5, 1095216660480
-	bne	.L609
+	bne	.L622
 	.loc 1 255 0
 	and	w10, w4, 983040
 	cmp	w10, 917504
-	beq	.L627
+	beq	.L640
 	.loc 1 258 0
 	orr	w7, w7, 983040
-.L609:
+.L622:
 	.loc 1 260 0
 	tst	x5, 280375465082880
-	bne	.L611
+	bne	.L624
 	.loc 1 261 0
 	and	w10, w4, 15728640
 	cmp	w10, 14680064
-	beq	.L628
+	beq	.L641
 	.loc 1 264 0
 	orr	w7, w7, 15728640
-.L611:
+.L624:
 	.loc 1 266 0
 	tst	x5, 71776119061217280
-	bne	.L613
+	bne	.L626
 	.loc 1 267 0
 	and	w10, w4, 251658240
 	cmp	w10, w13
-	beq	.L629
+	beq	.L642
 	.loc 1 270 0
 	orr	w7, w7, 251658240
-.L613:
+.L626:
 	.loc 1 272 0
 	tst	x5, -72057594037927936
-	bne	.L615
+	bne	.L628
 	.loc 1 273 0
 	and	w5, w4, -268435456
-.LVL661:
+.LVL666:
 	cmp	w5, w12
-	beq	.L630
+	beq	.L643
 	.loc 1 276 0
 	orr	w7, w7, -268435456
-.LVL662:
-.L615:
+.LVL667:
+.L628:
 	.loc 1 280 0 discriminator 2
 	and	w4, w4, w9
-.LVL663:
+.LVL668:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
@@ -7466,54 +7527,54 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 223 0 discriminator 2
 	cmp	w11, w6
-	ble	.L631
-.LVL664:
-.L622:
+	ble	.L644
+.LVL669:
+.L635:
 	.loc 1 224 0
 	ldr	x5, [x3, x6, lsl 3]
 	.loc 1 228 0
 	mov	w7, 0
 	.loc 1 225 0
 	ldr	w4, [x1, x6, lsl 2]
-.LVL665:
+.LVL670:
 	.loc 1 226 0
 	ldr	w8, [x0, x6, lsl 2]
 	.loc 1 230 0
 	and	x10, x5, 255
 	.loc 1 227 0
 	ldr	w9, [x2, x6, lsl 2]
-.LVL666:
+.LVL671:
 	.loc 1 230 0
-	cbnz	x10, .L602
-.LVL667:
+	cbnz	x10, .L615
+.LVL672:
 	.loc 1 231 0
 	and	w10, w4, 15
 	.loc 1 234 0
 	mov	w7, 15
 	.loc 1 231 0
 	cmp	w10, 14
-	bne	.L602
+	bne	.L615
 	.loc 1 232 0
 	orr	w8, w8, w7
-.LVL668:
+.LVL673:
 	.loc 1 228 0
 	mov	w7, 0
-.LVL669:
-	b	.L602
+.LVL674:
+	b	.L615
 	.p2align 3
-.L629:
+.L642:
 	.loc 1 268 0
 	orr	w8, w8, 251658240
-	b	.L613
-.LVL670:
+	b	.L626
+.LVL675:
 	.p2align 3
-.L630:
+.L643:
 	.loc 1 274 0
 	orr	w8, w8, -268435456
-.LVL671:
+.LVL676:
 	.loc 1 280 0
 	and	w4, w4, w9
-.LVL672:
+.LVL677:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
@@ -7522,48 +7583,48 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 223 0
 	cmp	w11, w6
-	bgt	.L622
-.LVL673:
+	bgt	.L635
+.LVL678:
 	.p2align 2
-.L631:
+.L644:
 	add	x3, x3, x17
 	add	x1, x1, x14
 	add	x2, x2, x14
 	add	x0, x0, x14
-.LVL674:
-.L619:
+.LVL679:
+.L632:
 	.loc 1 222 0 discriminator 2
 	add	w15, w15, 1
 	cmp	w16, w15
-	bne	.L601
-.L599:
+	bne	.L614
+.L612:
 	ret
-.LVL675:
+.LVL680:
 	.p2align 3
-.L625:
+.L638:
 	.loc 1 244 0
 	orr	w8, w8, 3840
-	b	.L605
+	b	.L618
 	.p2align 3
-.L626:
+.L639:
 	.loc 1 250 0
 	orr	w8, w8, 61440
-	b	.L607
+	b	.L620
 	.p2align 3
-.L627:
+.L640:
 	.loc 1 256 0
 	orr	w8, w8, 983040
-	b	.L609
+	b	.L622
 	.p2align 3
-.L628:
+.L641:
 	.loc 1 262 0
 	orr	w8, w8, 15728640
-	b	.L611
+	b	.L624
 	.p2align 3
-.L624:
+.L637:
 	.loc 1 238 0
 	orr	w8, w8, 240
-	b	.L603
+	b	.L616
 	.cfi_endproc
 .LFE2807:
 	.size	refresh_new_image2, .-refresh_new_image2
@@ -7575,52 +7636,52 @@ refresh_new_image_auto:
 .LFB2808:
 	.loc 1 288 0
 	.cfi_startproc
-.LVL676:
+.LVL681:
 	.loc 1 295 0
 	ldp	w13, w4, [x3, 52]
 	cmp	w4, 0
 	add	w9, w4, 7
 	csel	w9, w9, w4, lt
-.LVL677:
+.LVL682:
 	.loc 1 297 0
 	cmp	w13, 0
 	.loc 1 295 0
 	asr	w9, w9, 3
-.LVL678:
+.LVL683:
 	.loc 1 297 0
-	ble	.L632
+	ble	.L645
 	sub	w12, w9, #1
 	mov	w11, 0
-.LVL679:
+.LVL684:
 	add	x12, x12, 1
 	.loc 1 305 0
 	mov	w10, 15
 	lsl	x14, x12, 3
 	lsl	x12, x12, 2
 	.p2align 2
-.L634:
+.L647:
 	.loc 1 298 0 discriminator 1
 	mov	x6, 0
 	cmp	w9, 0
-	ble	.L645
+	ble	.L658
 	.p2align 2
-.L647:
+.L660:
 	.loc 1 299 0
 	ldr	x4, [x2, x6, lsl 3]
-.LVL680:
+.LVL685:
 	.loc 1 301 0
 	ldr	w7, [x0, x6, lsl 2]
 	.loc 1 300 0
 	ldr	w3, [x1, x6, lsl 2]
-.LVL681:
+.LVL686:
 	.loc 1 304 0
 	and	x5, x4, 255
 	.loc 1 305 0
 	cmp	x5, 0
-.LVL682:
+.LVL687:
 	eor	w5, w3, w7
 	csel	w3, wzr, w10, ne
-.LVL683:
+.LVL688:
 	.loc 1 308 0
 	orr	w8, w3, 240
 	tst	x4, 65280
@@ -7648,10 +7709,10 @@ refresh_new_image_auto:
 	.loc 1 326 0
 	tst	x4, -72057594037927936
 	orr	w4, w3, -268435456
-.LVL684:
+.LVL689:
 	csel	w3, w4, w3, eq
 	and	w3, w5, w3
-.LVL685:
+.LVL690:
 	.loc 1 329 0
 	eor	w3, w3, w7
 	.loc 1 330 0
@@ -7659,17 +7720,17 @@ refresh_new_image_auto:
 	add	x6, x6, 1
 	.loc 1 298 0
 	cmp	w9, w6
-	bgt	.L647
+	bgt	.L660
 	add	x2, x2, x14
 	add	x1, x1, x12
 	add	x0, x0, x12
-.LVL686:
-.L645:
+.LVL691:
+.L658:
 	.loc 1 297 0 discriminator 2
 	add	w11, w11, 1
 	cmp	w13, w11
-	bne	.L634
-.L632:
+	bne	.L647
+.L645:
 	ret
 	.cfi_endproc
 .LFE2808:
@@ -7682,7 +7743,7 @@ new_buffer_refresh:
 .LFB2809:
 	.loc 1 336 0
 	.cfi_startproc
-.LVL687:
+.LVL692:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -7699,35 +7760,35 @@ new_buffer_refresh:
 	adrp	x20, .LANCHOR1
 	.loc 1 337 0
 	ldr	x19, [x1, #:lo12:.LANCHOR0]
-.LVL688:
+.LVL693:
 	.loc 1 340 0
 	add	x0, x20, :lo12:.LANCHOR1
-.LVL689:
-	add	x0, x0, 592
+.LVL694:
+	add	x0, x0, 624
 	bl	down_write
-.LVL690:
+.LVL695:
 	.loc 1 338 0
 	add	x19, x19, 184
-.LVL691:
+.LVL696:
 	.loc 1 341 0
 	ldr	x0, [x19, 208]
 	ldr	w5, [x0, 40]
-	cbz	w5, .L653
+	cbz	w5, .L666
 	.loc 1 347 0
 	ldr	x1, [x0, 16]
 	mov	x4, x19
 	ldp	x2, x3, [x19, 144]
 	ldr	x0, [x19, 128]
 	bl	refresh_new_image2
-.LVL692:
+.LVL697:
 	.loc 1 352 0
 	add	x0, x20, :lo12:.LANCHOR1
-	add	x0, x0, 592
+	add	x0, x0, 624
 	bl	up_write
-.LVL693:
+.LVL698:
 	.loc 1 353 0
 	ldp	x19, x20, [sp, 16]
-.LVL694:
+.LVL699:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -7736,9 +7797,9 @@ new_buffer_refresh:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL695:
+.LVL700:
 	.p2align 3
-.L653:
+.L666:
 	.cfi_restore_state
 	.loc 1 342 0
 	ldr	x1, [x0, 16]
@@ -7746,15 +7807,15 @@ new_buffer_refresh:
 	ldr	x2, [x19, 152]
 	ldr	x0, [x19, 128]
 	bl	refresh_new_image_auto
-.LVL696:
+.LVL701:
 	.loc 1 352 0
 	add	x0, x20, :lo12:.LANCHOR1
-	add	x0, x0, 592
+	add	x0, x0, 624
 	bl	up_write
-.LVL697:
+.LVL702:
 	.loc 1 353 0
 	ldp	x19, x20, [sp, 16]
-.LVL698:
+.LVL703:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -7772,7 +7833,7 @@ ebc_thread:
 .LFB2825:
 	.loc 1 1092 0
 	.cfi_startproc
-.LVL699:
+.LVL704:
 	stp	x29, x30, [sp, -224]!
 	.cfi_def_cfa_offset 224
 	.cfi_offset 29, -224
@@ -7793,19 +7854,19 @@ ebc_thread:
 	adrp	x21, .LANCHOR1
 	.loc 1 1093 0
 	ldr	x20, [x1, #:lo12:.LANCHOR0]
-.LVL700:
+.LVL705:
 	.loc 1 1092 0
 	add	x0, x22, :lo12:__stack_chk_guard
-.LVL701:
+.LVL706:
 	stp	x25, x26, [sp, 64]
-.LBB1790:
-.LBB1791:
-.LBB1792:
-	.loc 1 1385 0
+.LBB1794:
+.LBB1795:
+.LBB1796:
+	.loc 1 1383 0
 	add	x21, x21, :lo12:.LANCHOR1
-.LBE1792:
-.LBE1791:
-.LBE1790:
+.LBE1796:
+.LBE1795:
+.LBE1794:
 	.loc 1 1092 0
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 23, -176
@@ -7816,82 +7877,82 @@ ebc_thread:
 	.cfi_offset 28, -136
 	.loc 1 1094 0
 	add	x24, x20, 184
+.LBB1801:
+.LBB1799:
 .LBB1797:
-.LBB1795:
-.LBB1793:
-	.loc 1 1385 0
+	.loc 1 1383 0
 	add	x19, x21, 304
-.LBE1793:
-.LBE1795:
 .LBE1797:
+.LBE1799:
+.LBE1801:
 	.loc 1 1097 0
 	mov	w23, 0
-.LVL702:
+.LVL707:
 	.loc 1 1092 0
 	ldr	x1, [x0]
 	str	x1, [x29, 216]
 	mov	x1,0
-.LVL703:
+.LVL708:
 	.p2align 2
-.L655:
+.L668:
 	.loc 1 1102 0
 	ldr	w0, [x24, 600]
-.LVL704:
-	cbnz	w0, .L784
-.L656:
+.LVL709:
+	cbnz	w0, .L796
+.L669:
 	.loc 1 1108 0
 	bl	ebc_dsp_buf_get
-.LVL705:
+.LVL710:
 	mov	x28, x0
 	.loc 1 1110 0
-	cbz	x0, .L658
+	cbz	x0, .L671
 	.loc 1 1110 0 is_stmt 0 discriminator 1
 	ldr	x1, [x0, 8]
-	cbz	x1, .L658
+	cbz	x1, .L671
 	.loc 1 1111 0 is_stmt 1
 	ldr	w1, [x0, 40]
 	cmp	w1, 19
-	beq	.L785
+	beq	.L797
 	.loc 1 1115 0
 	ldr	x2, [x24, 592]
-	cbz	x2, .L661
+	cbz	x2, .L674
 	.loc 1 1116 0
 	cmp	w1, 18
-	beq	.L786
-.L777:
-	.loc 1 1174 0
+	beq	.L798
+.L789:
+	.loc 1 1173 0
 	bl	ebc_remove_from_dsp_buf_list
-.LVL706:
-	.loc 1 1175 0
+.LVL711:
+	.loc 1 1174 0
 	mov	x0, x28
 	bl	ebc_buf_release
-.LVL707:
+.LVL712:
 	.loc 1 1102 0
 	ldr	w0, [x24, 600]
-	cbz	w0, .L656
+	cbz	w0, .L669
 	.p2align 2
-.L784:
+.L796:
 	.loc 1 1103 0
 	ldr	w0, [x24, 184]
 	cmp	w0, 1
-	beq	.L787
-.L657:
-	.loc 1 1391 0
+	beq	.L799
+.L670:
+	.loc 1 1389 0
 	add	x22, x22, :lo12:__stack_chk_guard
 	mov	w0, 0
 	ldr	x2, [x29, 216]
 	ldr	x1, [x22]
 	eor	x1, x2, x1
-	cbnz	x1, .L788
+	cbnz	x1, .L800
 	ldp	x19, x20, [sp, 16]
-.LVL708:
+.LVL713:
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
-.LVL709:
+.LVL714:
 	ldp	x25, x26, [sp, 64]
-.LVL710:
+.LVL715:
 	ldp	x27, x28, [sp, 80]
-.LVL711:
+.LVL716:
 	ldp	x29, x30, [sp], 224
 	.cfi_remember_state
 	.cfi_restore 30
@@ -7908,396 +7969,320 @@ ebc_thread:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL712:
+.LVL717:
 	.p2align 3
-.L658:
+.L671:
 	.cfi_restore_state
-	.loc 1 1372 0
+	.loc 1 1370 0
 	ldr	w0, [x24, 28]
-.LVL713:
+.LVL718:
 	cmp	w0, 1
-	beq	.L789
-	.loc 1 1381 0
+	beq	.L801
+	.loc 1 1379 0
 	ldr	w0, [x24, 184]
 	cmp	w0, 1
-	beq	.L790
-.LVL714:
-.L780:
+	beq	.L802
+.LVL719:
+.L792:
 	ldr	w0, [x24, 80]
-.LVL715:
+.LVL720:
+	.loc 1 1382 0
+	cbz	w0, .L803
+.L755:
+.LVL721:
+.L745:
 	.loc 1 1384 0
-	cbz	w0, .L791
-.L743:
-.LVL716:
-.L733:
-	.loc 1 1386 0
 	str	wzr, [x24, 80]
-	b	.L655
-.LVL717:
+	b	.L668
+.LVL722:
 	.p2align 3
-.L791:
-.LBB1798:
-.LBB1796:
-	.loc 1 1385 0 discriminator 1
+.L803:
+.LBB1802:
+.LBB1800:
+	.loc 1 1383 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL718:
-	b	.L744
+.LVL723:
+	b	.L756
 	.p2align 3
-.L792:
-.LVL719:
-.LBB1794:
-	.loc 1 1385 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L733
-	.loc 1 1385 0 discriminator 7
+.L804:
+.LVL724:
+.LBB1798:
+	.loc 1 1383 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L745
+	.loc 1 1383 0 discriminator 7
 	bl	schedule
-.LVL720:
-.L744:
-	.loc 1 1385 0 discriminator 9
+.LVL725:
+.L756:
+	.loc 1 1383 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL721:
+.LVL726:
 	ldr	w1, [x24, 80]
-	cbz	w1, .L792
-.LBE1794:
-	.loc 1 1385 0 discriminator 4
+	cbz	w1, .L804
+.LBE1798:
+	.loc 1 1383 0 discriminator 4
 	add	x1, x29, 112
 	mov	x0, x19
 	bl	finish_wait
-.LVL722:
-.LBE1796:
-.LBE1798:
-	.loc 1 1386 0 is_stmt 1 discriminator 4
+.LVL727:
+.LBE1800:
+.LBE1802:
+	.loc 1 1384 0 is_stmt 1 discriminator 4
 	str	wzr, [x24, 80]
-	b	.L655
-.LVL723:
+	b	.L668
+.LVL728:
 	.p2align 3
-.L661:
+.L674:
 	.loc 1 1128 0
 	cmp	w1, 17
-	beq	.L793
-	.loc 1 1132 0
-	cmp	w1, 20
-	ldr	w0, [x24, 608]
-.LVL724:
-	ccmp	w1, 1, 4, ne
-	ccmp	w0, 0, 4, ne
-	beq	.L660
-	.loc 1 1133 0
-	add	x25, x21, 592
-.LVL725:
-	mov	x0, x25
-	bl	down_write
-.LVL726:
-	.loc 1 1134 0
-	ldrsw	x2, [x24, 20]
-	ldr	x1, [x28, 16]
-	ldr	x0, [x24, 144]
-	bl	memcpy
-.LVL727:
-	.loc 1 1135 0
-	mov	x0, x28
-	bl	ebc_remove_from_dsp_buf_list
-.LVL728:
-	.loc 1 1136 0
-	mov	x0, x28
-	bl	ebc_buf_release
-.LVL729:
-	.loc 1 1138 0
-	ldr	x1, [x24, 208]
-	mov	x4, x24
-	ldr	x0, [x24, 128]
-	ldp	x2, x3, [x24, 144]
-	ldr	w5, [x1, 40]
-	ldr	x1, [x1, 16]
-	bl	refresh_new_image2
-.LVL730:
-	.loc 1 1141 0
-	mov	x0, x25
-	bl	up_write
-.LVL731:
-	.loc 1 1142 0
-	ldr	w0, [x24, 28]
-	cbnz	w0, .L655
-	.loc 1 1145 0
-	ldr	w0, [x24, 184]
-	.loc 1 1143 0
-	mov	w1, 1
-	.loc 1 1144 0
-	str	wzr, [x24, 76]
-	.loc 1 1143 0
-	str	w1, [x24, 28]
-	.loc 1 1145 0
-	cbz	w0, .L794
-.L665:
-	.loc 1 1147 0
-	ldr	x0, [x24, 88]
-	adrp	x1, .LC77
-	ldrb	w2, [x24, 32]
-	add	x1, x1, :lo12:.LC77
-	bl	_dev_info
-.LVL732:
-	.loc 1 1148 0
-	mov	x0, x20
-	bl	ebc_frame_start
-.LVL733:
-	b	.L655
-.LVL734:
-	.p2align 3
-.L786:
-	.loc 1 1117 0
-	str	wzr, [x24, 592]
-	.loc 1 1118 0
-	mov	x0, 3
-.LVL735:
-	bl	ebc_notify
-.LVL736:
-	.loc 1 1119 0
-	ldr	x0, [x24, 88]
-	adrp	x1, .LC76
-	add	x1, x1, :lo12:.LC76
-	bl	_dev_info
-.LVL737:
-	.p2align 2
-.L660:
-	.loc 1 1153 0
+	ccmp	w1, 20, 4, ne
+	bne	.L677
+	.loc 1 1129 0
+	str	wzr, [x24, 608]
+.L673:
+	.loc 1 1152 0
 	adrp	x25, jiffies
-.LVL738:
+.LVL729:
 	mov	x1, 402653184
 	add	x0, x20, 616
 	ldr	x2, [x25, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL739:
-	.loc 1 1155 0
+.LVL730:
+	.loc 1 1154 0
 	ldr	w0, [x24, 428]
-	cbz	w0, .L666
+	cbz	w0, .L679
 	ldr	x0, [x24, 200]
-.L667:
-	.loc 1 1158 0
+.L680:
+	.loc 1 1157 0
 	ldr	w2, [x0, 40]
 	ldr	w3, [x28, 40]
 	cmp	w3, w2
-	beq	.L668
-	.loc 1 1159 0
+	beq	.L681
+	.loc 1 1158 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC78
 	add	x1, x1, :lo12:.LC78
 	bl	_dev_info
-.LVL740:
-	.loc 1 1160 0
+.LVL731:
+	.loc 1 1159 0
 	ldr	w0, [x24, 28]
 	cmp	w0, 1
-	beq	.L795
-.L778:
+	beq	.L805
+.L790:
 	ldr	w2, [x28, 40]
-.L668:
-	.loc 1 1167 0
+.L681:
+	.loc 1 1166 0
 	cmp	w2, 11
-	bgt	.L675
+	bgt	.L688
 	cmp	w2, 7
-	bge	.L676
+	bge	.L689
 	cmp	w2, 1
-	beq	.L677
-	bgt	.L748
-	cbnz	w2, .L674
-	.loc 1 1212 0
-	add	x0, x21, 592
+	beq	.L690
+	bgt	.L760
+	cbnz	w2, .L687
+	.loc 1 1211 0
+	add	x0, x21, 624
 	bl	down_write
-.LVL741:
-	.loc 1 1218 0
+.LVL732:
+	.loc 1 1217 0
 	ldr	x0, [x24, 200]
-	.loc 1 1213 0
+	.loc 1 1212 0
 	str	x28, [x24, 208]
-	.loc 1 1218 0
+	.loc 1 1217 0
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
-	bls	.L712
-	.loc 1 1220 0
+	bls	.L724
+	.loc 1 1219 0
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x28, 16]
 	ldr	x0, [x24, 128]
 	bl	memcpy
-.LVL742:
-	.loc 1 1221 0
+.LVL733:
+	.loc 1 1220 0
 	ldr	x0, [x24, 200]
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x24, 136]
 	bl	memcpy
-.LVL743:
-.L713:
-	.loc 1 1227 0
-	add	x0, x21, 592
+.LVL734:
+.L725:
+	.loc 1 1226 0
+	add	x0, x21, 624
 	bl	up_write
-.LVL744:
-	.loc 1 1229 0
+.LVL735:
+	.loc 1 1228 0
 	ldr	w0, [x24, 28]
-	cbnz	w0, .L690
-	.loc 1 1230 0
+	cbnz	w0, .L702
+	.loc 1 1229 0
 	mov	w0, 1
 	str	w0, [x24, 28]
-	.loc 1 1232 0
-	ldr	w0, [x24, 184]
 	.loc 1 1231 0
+	ldr	w0, [x24, 184]
+	.loc 1 1230 0
 	str	wzr, [x24, 76]
-	.loc 1 1232 0
-	cbz	w0, .L796
-.L714:
-	.loc 1 1234 0
+	.loc 1 1231 0
+	cbz	w0, .L806
+.L726:
+	.loc 1 1233 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL745:
+.LVL736:
 	cmn	w0, #1
-	beq	.L797
-	.loc 1 1242 0
+	beq	.L807
+	.loc 1 1241 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC84
-	.loc 1 1239 0
+	.loc 1 1238 0
 	ldr	w3, [x24, 96]
-	.loc 1 1242 0
+	.loc 1 1241 0
 	add	x1, x1, :lo12:.LC84
-	.loc 1 1239 0
+	.loc 1 1238 0
 	strb	w3, [x24, 32]
-.LVL746:
-.L779:
-	.loc 1 1242 0
+.LVL737:
+.L791:
+	.loc 1 1241 0
 	and	w2, w3, 255
-	.loc 1 1240 0
+	.loc 1 1239 0
 	lsr	w3, w3, 8
 	strb	w3, [x24, 33]
-	.loc 1 1242 0
+	.loc 1 1241 0
 	bl	_dev_info
-.LVL747:
-	.loc 1 1243 0
+.LVL738:
+	.loc 1 1242 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL748:
-	.loc 1 1346 0
+.LVL739:
+	.loc 1 1344 0
 	ldr	x0, [x24, 208]
 	ldr	w0, [x0, 40]
 	cmp	w0, 19
-	bne	.L729
-.LVL749:
-	.p2align 2
-.L800:
-	.loc 1 1349 0
-	ldr	x0, [x24, 88]
+	bne	.L741
+.LVL740:
+.L812:
 	.loc 1 1347 0
+	ldr	x0, [x24, 88]
+	.loc 1 1345 0
 	mov	w25, 1
-.LVL750:
-	.loc 1 1348 0
+.LVL741:
+	.loc 1 1346 0
 	str	wzr, [x24, 188]
-	.loc 1 1349 0
-	adrp	x1, .LC87
 	.loc 1 1347 0
+	adrp	x1, .LC87
+	.loc 1 1345 0
 	str	w25, [x24, 600]
-	.loc 1 1349 0
+	.loc 1 1347 0
 	add	x1, x1, :lo12:.LC87
 	bl	_dev_info
-.LVL751:
-	.loc 1 1350 0
+.LVL742:
+	.loc 1 1348 0
 	mov	w2, w25
 	mov	w1, w25
 	add	x0, x21, 328
 	bl	__wake_up_sync
-.LVL752:
-	.loc 1 1361 0
+.LVL743:
+	.loc 1 1359 0
 	mov	x0, x28
 	bl	ebc_remove_from_dsp_buf_list
-.LVL753:
-	.loc 1 1363 0
+.LVL744:
+	.loc 1 1361 0
 	ldr	w0, [x24, 428]
-	cbz	w0, .L731
-.LVL754:
+	cbz	w0, .L743
+.LVL745:
 	.p2align 2
-.L802:
-	.loc 1 1364 0
+.L814:
+	.loc 1 1362 0
 	ldr	x0, [x24, 200]
 	bl	ebc_buf_release
-.LVL755:
-	b	.L732
-.LVL756:
+.LVL746:
+	b	.L744
+.LVL747:
 	.p2align 3
-.L666:
-	.loc 1 1156 0
+.L679:
+	.loc 1 1155 0
 	mov	x0, x28
 	str	x28, [x24, 200]
-	b	.L667
+	b	.L680
+.LVL748:
 	.p2align 3
-.L675:
-	.loc 1 1167 0
-	cmp	w2, 14
-	ble	.L798
-	cmp	w2, 19
-	ble	.L748
-	cmp	w2, 20
-	bne	.L674
-	.loc 1 1259 0
-	mov	w7, 1
-.LVL757:
-	.loc 1 1247 0
+.L797:
+	.loc 1 1113 0
+	str	wzr, [x24, 604]
+	.loc 1 1112 0
 	str	wzr, [x24, 608]
-.L678:
-	.loc 1 1268 0
+	b	.L673
+.LVL749:
+	.p2align 3
+.L688:
+	.loc 1 1166 0
+	cmp	w2, 14
+	bgt	.L693
+	cmp	w2, 13
+	bge	.L689
+.L760:
+	.loc 1 1266 0
 	ldr	x26, [x24, 200]
-	.loc 1 1269 0
+	.loc 1 1257 0
+	mov	w7, 1
+.LVL750:
+	.loc 1 1267 0
 	ldr	w0, [x26, 40]
 	cmp	w0, 1
-	bls	.L799
-.L716:
-	.loc 1 1280 0
+	bls	.L808
+.L728:
+	.loc 1 1278 0
 	str	wzr, [x24, 76]
-	.loc 1 1281 0
+	.loc 1 1279 0
 	str	x28, [x24, 208]
-	.loc 1 1284 0
+	.loc 1 1282 0
 	ldr	w0, [x28, 40]
 	sub	w0, w0, #2
-	.loc 1 1283 0
+	.loc 1 1281 0
 	cmp	w0, 13
-	bhi	.L717
-.L804:
-	.loc 1 1286 0
+	bhi	.L729
+.L809:
+	.loc 1 1284 0
 	ldr	x0, [x24, 200]
-.LBB1799:
-.LBB1800:
+.LBB1803:
+.LBB1804:
 	.loc 1 1077 0
 	ldr	w1, [x24, 20]
-.LBE1800:
-.LBE1799:
-	.loc 1 1285 0
+.LBE1804:
+.LBE1803:
+	.loc 1 1283 0
 	ldr	x4, [x28, 16]
-.LBB1803:
-.LBB1801:
+.LBB1807:
+.LBB1805:
 	.loc 1 1077 0
 	cmp	w1, 0
-.LBE1801:
-.LBE1803:
-	.loc 1 1286 0
+.LBE1805:
+.LBE1807:
+	.loc 1 1284 0
 	ldr	x5, [x0, 16]
-.LBB1804:
-.LBB1802:
+.LBB1808:
+.LBB1806:
 	.loc 1 1077 0
 	add	w0, w1, 7
 	csel	w0, w0, w1, lt
 	asr	w0, w0, 3
 	cmp	w0, 0
-	ble	.L718
+	ble	.L730
 	.loc 1 1081 0
-	ldr	x2, [x4]
-	ldr	x1, [x5]
+	ldr	x1, [x4]
+	ldr	x2, [x5]
 	cmp	x2, x1
-	bne	.L717
+	bne	.L729
 	sub	w1, w0, #1
 	mov	x0, 8
 	add	x1, x1, 1
 	lsl	x1, x1, 3
-	b	.L720
+	b	.L732
 	.p2align 3
-.L721:
+.L733:
 	.loc 1 1078 0
 	ldr	x3, [x4, x0]
 	add	x0, x0, 8
@@ -8306,343 +8291,277 @@ ebc_thread:
 	.loc 1 1081 0
 	ldr	x2, [x2, -8]
 	cmp	x3, x2
-	bne	.L717
-.L720:
+	bne	.L729
+.L732:
 	.loc 1 1077 0
 	cmp	x1, x0
-	bne	.L721
-.L718:
-.LBE1802:
-.LBE1804:
-	.loc 1 1288 0
+	bne	.L733
+.L730:
+.LBE1806:
+.LBE1808:
+	.loc 1 1286 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC89
 	add	x1, x1, :lo12:.LC89
 	bl	_dev_info
-.LVL758:
+.LVL751:
+	.loc 1 1288 0
+	str	x26, [x24, 200]
 	.loc 1 1290 0
+	b	.L702
+	.p2align 3
+.L689:
+	.loc 1 1266 0
+	ldr	x26, [x24, 200]
+	.loc 1 1166 0
+	mov	w7, 0
+.LVL752:
+	.loc 1 1267 0
+	ldr	w0, [x26, 40]
+	cmp	w0, 1
+	bhi	.L728
+.L808:
+	.loc 1 1272 0
+	add	x0, x29, 152
+	.loc 1 1278 0
+	str	wzr, [x24, 76]
+	.loc 1 1272 0
+	str	x0, [x24, 200]
+	.loc 1 1279 0
+	str	x28, [x24, 208]
+	.loc 1 1273 0
+	ldr	x0, [x24, 136]
+	str	x0, [x29, 168]
+	.loc 1 1282 0
+	ldr	w0, [x28, 40]
+	sub	w0, w0, #2
+	.loc 1 1281 0
+	cmp	w0, 13
+	bls	.L809
+	.p2align 2
+.L729:
+	.loc 1 1294 0
+	cbnz	w7, .L764
+	.loc 1 1298 0
+	ldr	w0, [x24, 48]
+	cmp	w0, 0
+	ble	.L734
+	.loc 1 1299 0
+	add	w23, w23, 1
+	.loc 1 1300 0
+	cmp	w0, w23
+	ble	.L810
+.L734:
+	.loc 1 1306 0
+	ldr	w0, [x24, 184]
+	cbz	w0, .L811
+.L735:
+	.loc 1 1309 0
+	mov	x0, x20
+	bl	ebc_lut_update
+.LVL753:
+	cbz	w0, .L736
+	.loc 1 1310 0
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC83
+	add	x1, x1, :lo12:.LC83
+	bl	_dev_err
+.LVL754:
+	.loc 1 1312 0
 	str	x26, [x24, 200]
-.LVL759:
+.LVL755:
 	.p2align 2
-.L690:
-	.loc 1 1346 0
+.L702:
+	.loc 1 1344 0
 	ldr	x0, [x24, 208]
 	ldr	w0, [x0, 40]
 	cmp	w0, 19
-	beq	.L800
-.L729:
-	.loc 1 1352 0
+	beq	.L812
+.L741:
+	.loc 1 1350 0
 	cmp	w0, 17
-	beq	.L801
-.L730:
-	.loc 1 1361 0
+	beq	.L813
+.L742:
+	.loc 1 1359 0
 	mov	x0, x28
 	bl	ebc_remove_from_dsp_buf_list
-.LVL760:
-	.loc 1 1363 0
+.LVL756:
+	.loc 1 1361 0
 	ldr	w0, [x24, 428]
-	cbnz	w0, .L802
-.L731:
-	.loc 1 1366 0
+	cbnz	w0, .L814
+.L743:
+	.loc 1 1364 0
 	mov	w0, 1
 	str	w0, [x24, 428]
-.L732:
-	.loc 1 1368 0
+.L744:
+	.loc 1 1366 0
 	ldr	x0, [x24, 208]
 	str	x0, [x24, 200]
-	.loc 1 1369 0
-	b	.L655
-.LVL761:
-	.p2align 3
-.L785:
-	.loc 1 1113 0
-	str	wzr, [x24, 604]
-	.loc 1 1112 0
-	str	wzr, [x24, 608]
-	b	.L660
-.LVL762:
+	.loc 1 1367 0
+	b	.L668
 	.p2align 3
-.L789:
-.LBB1805:
-	.loc 1 1373 0 discriminator 1
+.L801:
+.LBB1809:
+	.loc 1 1371 0 discriminator 1
 	ldr	w0, [x24, 80]
-	cbnz	w0, .L733
-.LBB1806:
-	.loc 1 1373 0 is_stmt 0 discriminator 3
+	cbnz	w0, .L745
+.LBB1810:
+	.loc 1 1371 0 is_stmt 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL763:
-	b	.L737
+.LVL757:
+	b	.L749
 	.p2align 3
-.L803:
-.LBB1807:
-	.loc 1 1373 0 discriminator 7
+.L815:
+.LBB1811:
+	.loc 1 1371 0 discriminator 7
 	ldr	w1, [x24, 80]
-	cbnz	w1, .L734
-.LVL764:
-	.loc 1 1373 0 discriminator 9
-	cbnz	x0, .L780
-	.loc 1 1373 0 discriminator 11
+	cbnz	w1, .L746
+.LVL758:
+	.loc 1 1371 0 discriminator 9
+	cbnz	x0, .L792
+	.loc 1 1371 0 discriminator 11
 	bl	schedule
-.LVL765:
-.L737:
-	.loc 1 1373 0 discriminator 13
+.LVL759:
+.L749:
+	.loc 1 1371 0 discriminator 13
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL766:
+.LVL760:
 	ldr	w1, [x24, 28]
-	cbnz	w1, .L803
-.L734:
-.LBE1807:
-	.loc 1 1373 0 discriminator 8
+	cbnz	w1, .L815
+.L746:
+.LBE1811:
+	.loc 1 1371 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL767:
+.LVL761:
 	ldr	w0, [x24, 28]
-.LBE1806:
-.LBE1805:
-	.loc 1 1376 0 is_stmt 1 discriminator 8
-	cbnz	w0, .L780
-	.loc 1 1381 0
+.LBE1810:
+.LBE1809:
+	.loc 1 1374 0 is_stmt 1 discriminator 8
+	cbnz	w0, .L792
+	.loc 1 1379 0
 	ldr	w0, [x24, 184]
 	cmp	w0, 1
-	bne	.L780
+	bne	.L792
 	.p2align 2
-.L790:
-.LBB1808:
-.LBB1809:
+.L802:
+.LBB1812:
+.LBB1813:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
+.LVL762:
+	b	.L792
+.LVL763:
+	.p2align 3
+.L677:
+.LBE1813:
+.LBE1812:
+	.loc 1 1131 0
+	ldr	w0, [x24, 608]
+.LVL764:
+	cmp	w0, 0
+	ccmp	w1, 1, 4, ne
+	beq	.L673
+	.loc 1 1132 0
+	add	x25, x21, 624
+.LVL765:
+	mov	x0, x25
+	bl	down_write
+.LVL766:
+	.loc 1 1133 0
+	ldrsw	x2, [x24, 20]
+	ldr	x1, [x28, 16]
+	ldr	x0, [x24, 144]
+	bl	memcpy
+.LVL767:
+	.loc 1 1134 0
+	mov	x0, x28
+	bl	ebc_remove_from_dsp_buf_list
 .LVL768:
-	b	.L780
+	.loc 1 1135 0
+	mov	x0, x28
+	bl	ebc_buf_release
 .LVL769:
-	.p2align 3
-.L798:
-.LBE1809:
-.LBE1808:
-	.loc 1 1167 0
-	cmp	w2, 13
-	bge	.L676
-.L748:
-	.loc 1 1268 0
-	ldr	x26, [x24, 200]
-	.loc 1 1259 0
-	mov	w7, 1
+	.loc 1 1137 0
+	ldr	x1, [x24, 208]
+	mov	x4, x24
+	ldr	x0, [x24, 128]
+	ldp	x2, x3, [x24, 144]
+	ldr	w5, [x1, 40]
+	ldr	x1, [x1, 16]
+	bl	refresh_new_image2
 .LVL770:
-	.loc 1 1269 0
-	ldr	w0, [x26, 40]
-	cmp	w0, 1
-	bhi	.L716
-.L799:
-	.loc 1 1274 0
-	add	x0, x29, 152
-	.loc 1 1280 0
-	str	wzr, [x24, 76]
-	.loc 1 1274 0
-	str	x0, [x24, 200]
-	.loc 1 1281 0
-	str	x28, [x24, 208]
-	.loc 1 1275 0
-	ldr	x0, [x24, 136]
-	str	x0, [x29, 168]
-	.loc 1 1284 0
-	ldr	w0, [x28, 40]
-	sub	w0, w0, #2
-	.loc 1 1283 0
-	cmp	w0, 13
-	bls	.L804
-	.p2align 2
-.L717:
-	.loc 1 1296 0
-	cbnz	w7, .L752
-	.loc 1 1300 0
-	ldr	w0, [x24, 48]
-	cmp	w0, 0
-	ble	.L722
-	.loc 1 1301 0
-	add	w23, w23, 1
-	.loc 1 1302 0
-	cmp	w0, w23
-	bgt	.L722
-	.loc 1 1303 0
-	mov	w0, 2
-	.loc 1 1304 0
-	mov	w23, 0
-	.loc 1 1303 0
-	str	w0, [x28, 40]
-.L722:
-	.loc 1 1308 0
-	ldr	w0, [x24, 184]
-	cbz	w0, .L805
-.L723:
-	.loc 1 1311 0
-	mov	x0, x20
-	bl	ebc_lut_update
+	.loc 1 1140 0
+	mov	x0, x25
+	bl	up_write
 .LVL771:
-	cbz	w0, .L724
-.L807:
-	.loc 1 1312 0
-	ldr	x0, [x24, 88]
-	adrp	x1, .LC83
-	add	x1, x1, :lo12:.LC83
-	bl	_dev_err
-.LVL772:
-	.loc 1 1314 0
-	str	x26, [x24, 200]
-	.loc 1 1315 0
-	b	.L690
-.L795:
-	.loc 1 1161 0
+	.loc 1 1141 0
+	ldr	w0, [x24, 28]
+	cbnz	w0, .L668
+	.loc 1 1144 0
+	ldr	w0, [x24, 184]
+	.loc 1 1142 0
+	mov	w1, 1
+	.loc 1 1143 0
+	str	wzr, [x24, 76]
+	.loc 1 1142 0
+	str	w1, [x24, 28]
+	.loc 1 1144 0
+	cbz	w0, .L816
+.L678:
+	.loc 1 1146 0
 	ldr	x0, [x24, 88]
-	adrp	x1, .LC79
-	add	x1, x1, :lo12:.LC79
+	adrp	x1, .LC77
+	ldrb	w2, [x24, 32]
+	add	x1, x1, :lo12:.LC77
 	bl	_dev_info
+.LVL772:
+	.loc 1 1147 0
+	mov	x0, x20
+	bl	ebc_frame_start
 .LVL773:
-.LBB1810:
-	.loc 1 1162 0
-	ldr	w0, [x24, 76]
-	cbz	w0, .L806
-.L672:
-.LVL774:
-.L670:
-.LBE1810:
-	.loc 1 1163 0 discriminator 11
-	ldr	x0, [x24, 88]
-.LVL775:
-	adrp	x1, .LC80
-	add	x1, x1, :lo12:.LC80
-	bl	_dev_info
-.LVL776:
-	b	.L778
-	.p2align 3
-.L674:
-	.loc 1 1338 0
+	b	.L668
+.L693:
+	.loc 1 1166 0
+	cmp	w2, 20
+	ble	.L760
+.L687:
+	.loc 1 1336 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC86
 	add	x1, x1, :lo12:.LC86
 	bl	_dev_err
-.LVL777:
-	.loc 1 1339 0
-	b	.L690
-.L676:
-	.loc 1 1167 0
-	mov	w7, 0
-.LVL778:
-	b	.L678
-	.p2align 3
-.L752:
-	.loc 1 1308 0
-	ldr	w0, [x24, 184]
-	.loc 1 1297 0
-	mov	w23, 0
-	.loc 1 1308 0
-	cbnz	w0, .L723
-.L805:
-	.loc 1 1309 0
-	mov	x0, x20
-	bl	ebc_power_set.constprop.12
-.LVL779:
-	.loc 1 1311 0
-	mov	x0, x20
-	bl	ebc_lut_update
-.LVL780:
-	cbnz	w0, .L807
-.L724:
-	.loc 1 1323 0
-	ldr	x0, [x24, 208]
-	adrp	x1, .LC85
-	.loc 1 1320 0
-	ldr	w3, [x24, 96]
-	.loc 1 1323 0
-	add	x1, x1, :lo12:.LC85
-	.loc 1 1320 0
-	strb	w3, [x24, 32]
-	.loc 1 1323 0
-	and	w3, w3, 255
-	ldr	w2, [x0, 40]
-	ldr	x0, [x24, 88]
-	bl	_dev_info
-.LVL781:
-	.loc 1 1324 0
-	mov	w0, 1
-	str	w0, [x24, 28]
-	.loc 1 1325 0
-	mov	x0, x20
-	bl	ebc_frame_start
-.LVL782:
-	.loc 1 1327 0
-	ldr	x1, [x25, #:lo12:jiffies]
-	add	x0, x20, 672
-	str	x0, [x29, 104]
-	add	x1, x1, 900
-	bl	mod_timer
-.LVL783:
-.LBB1814:
-	.loc 1 1328 0
-	ldr	w0, [x24, 76]
-	cbz	w0, .L808
-.L727:
-.LVL784:
-.L725:
-.LBE1814:
-	.loc 1 1330 0 discriminator 11
-	ldr	x2, [x25, #:lo12:jiffies]
-	mov	x1, 402653184
-	ldr	x0, [x29, 104]
-.LVL785:
-	add	x1, x2, x1
-	bl	mod_timer
-.LVL786:
-	.loc 1 1331 0 discriminator 11
-	str	wzr, [x24, 76]
-	.loc 1 1333 0 discriminator 11
-	str	x26, [x24, 200]
-	.loc 1 1335 0 discriminator 11
-	b	.L690
+.LVL774:
+	.loc 1 1337 0
+	b	.L702
 	.p2align 3
-.L677:
-	.loc 1 1169 0
+.L690:
+	.loc 1 1168 0
 	ldr	w0, [x24, 604]
-	cbz	w0, .L682
-	.loc 1 1182 0
+	cbz	w0, .L694
+	.loc 1 1181 0
 	ldr	x0, [x24, 200]
-	.loc 1 1180 0
+	.loc 1 1179 0
 	str	x28, [x24, 208]
-	.loc 1 1170 0
+	.loc 1 1169 0
 	str	w2, [x24, 608]
-	.loc 1 1182 0
+	.loc 1 1181 0
 	ldr	w1, [x0, 40]
 	cmp	w1, 1
-	bls	.L809
-	.loc 1 1184 0
-	ldr	x1, [x0, 16]
-	ldrsw	x2, [x24, 20]
-	ldr	x0, [x24, 128]
-	bl	memcpy
-.LVL787:
-	.loc 1 1185 0
-	ldr	x0, [x24, 200]
-	ldrsw	x2, [x24, 20]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x24, 136]
-	bl	memcpy
-.LVL788:
+	bhi	.L695
+	mov	x0, x28
 	.loc 1 1186 0
-	ldr	x0, [x24, 200]
-	ldrsw	x2, [x24, 20]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x24, 144]
-	bl	memcpy
-.LVL789:
-	ldr	x0, [x24, 208]
-.L685:
-.LBB1818:
-.LBB1819:
+	cbz	w1, .L817
+.L697:
+.LBB1814:
+.LBB1815:
 	.loc 1 374 0
 	ldp	w3, w14, [x0, 48]
 	.loc 1 433 0
@@ -8670,23 +8589,23 @@ ebc_thread:
 	asr	w8, w8, 3
 	.loc 1 377 0
 	asr	w16, w16, 3
-.LVL790:
+.LVL775:
 	.loc 1 373 0
 	add	w8, w8, 1
-.LVL791:
+.LVL776:
 	ldr	w1, [x20, 236]
 	.loc 1 380 0
 	cmp	w8, w16
-.LBE1819:
-.LBE1818:
-	.loc 1 1191 0
+.LBE1815:
+.LBE1814:
+	.loc 1 1190 0
 	ldr	x11, [x0, 16]
-.LBB1824:
 .LBB1820:
+.LBB1816:
 	.loc 1 380 0
 	sub	w0, w16, #1
 	csel	w8, w0, w8, ge
-.LVL792:
+.LVL777:
 	.loc 1 382 0
 	cmp	w1, w17
 	sub	w1, w1, #1
@@ -8696,106 +8615,106 @@ ebc_thread:
 	csel	w17, w1, w17, le
 	.loc 1 372 0
 	asr	w15, w15, 3
-.LVL793:
+.LVL778:
 	mul	w5, w14, w16
 	.loc 1 384 0
 	cmp	w14, w17
+.LBE1816:
 .LBE1820:
-.LBE1824:
-	.loc 1 1191 0
+	.loc 1 1190 0
 	ldr	x7, [x24, 128]
-	.loc 1 1192 0
+	.loc 1 1191 0
 	ldp	x10, x9, [x24, 144]
-.LBB1825:
 .LBB1821:
+.LBB1817:
 	.loc 1 384 0
-	bgt	.L693
-.LVL794:
+	bgt	.L705
+.LVL779:
 	.p2align 2
-.L763:
+.L775:
 	.loc 1 389 0
 	mov	w4, w15
 	cmp	w15, w8
-	ble	.L764
-	b	.L710
-.LVL795:
+	ble	.L776
+	b	.L722
+.LVL780:
 	.p2align 3
-.L694:
+.L706:
 	.loc 1 402 0
 	tst	x2, 65280
-	bne	.L695
+	bne	.L707
 	.loc 1 403 0
 	and	w26, w1, 240
 	cmp	w26, 224
-	beq	.L810
+	beq	.L818
 	.loc 1 406 0
 	orr	w18, w18, 240
-.L695:
+.L707:
 	.loc 1 408 0
 	tst	x2, 16711680
-	bne	.L697
+	bne	.L709
 	.loc 1 409 0
 	and	w26, w1, 3840
 	cmp	w26, 3584
-	beq	.L811
+	beq	.L819
 	.loc 1 412 0
 	orr	w18, w18, 3840
-.L697:
+.L709:
 	.loc 1 414 0
 	tst	x2, 4278190080
-	bne	.L699
+	bne	.L711
 	.loc 1 415 0
 	and	w26, w1, 61440
 	cmp	w26, 57344
-	beq	.L812
+	beq	.L820
 	.loc 1 418 0
 	orr	w18, w18, 61440
-.L699:
+.L711:
 	.loc 1 420 0
 	tst	x2, 1095216660480
-	bne	.L701
+	bne	.L713
 	.loc 1 421 0
 	and	w26, w1, 983040
 	cmp	w26, 917504
-	beq	.L813
+	beq	.L821
 	.loc 1 424 0
 	orr	w18, w18, 983040
-.L701:
+.L713:
 	.loc 1 426 0
 	tst	x2, 280375465082880
-	bne	.L703
+	bne	.L715
 	.loc 1 427 0
 	and	w26, w1, 15728640
 	cmp	w26, 14680064
-	beq	.L814
+	beq	.L822
 	.loc 1 430 0
 	orr	w18, w18, 15728640
-.L703:
+.L715:
 	.loc 1 432 0
 	tst	x2, 71776119061217280
-	bne	.L705
+	bne	.L717
 	.loc 1 433 0
 	and	w26, w1, 251658240
 	cmp	w26, w13
-	beq	.L815
+	beq	.L823
 	.loc 1 436 0
 	orr	w18, w18, 251658240
-.L705:
+.L717:
 	.loc 1 438 0
 	tst	x2, -72057594037927936
-	bne	.L707
+	bne	.L719
 	.loc 1 439 0
 	and	w2, w1, -268435456
-.LVL796:
+.LVL781:
 	cmp	w2, w12
-	beq	.L816
+	beq	.L824
 	.loc 1 442 0
 	orr	w18, w18, -268435456
-.LVL797:
-.L707:
+.LVL782:
+.L719:
 	.loc 1 445 0
 	and	w1, w1, w25
-.LVL798:
+.LVL783:
 	.loc 1 389 0
 	add	w4, w4, 1
 	eor	w1, w1, w3
@@ -8806,19 +8725,19 @@ ebc_thread:
 	.loc 1 446 0
 	str	w1, [x7, x0]
 	.loc 1 389 0
-	bgt	.L710
-.LVL799:
-.L764:
+	bgt	.L722
+.LVL784:
+.L776:
 	.loc 1 390 0
 	sxtw	x0, w4
-.LVL800:
+.LVL785:
 	.loc 1 394 0
 	mov	w18, 0
 	.loc 1 393 0
 	lsl	x1, x0, 3
 	.loc 1 390 0
 	lsl	x0, x0, 2
-.LVL801:
+.LVL786:
 	.loc 1 393 0
 	add	x1, x1, x5, sxtw 3
 	add	x0, x0, x5, sxtw 2
@@ -8829,165 +8748,150 @@ ebc_thread:
 	ldr	w1, [x11, x0]
 	.loc 1 396 0
 	and	x26, x2, 255
-.LVL802:
+.LVL787:
 	.loc 1 392 0
 	ldr	w25, [x10, x0]
-.LVL803:
+.LVL788:
 	.loc 1 396 0
-	cbnz	x26, .L694
-.LVL804:
+	cbnz	x26, .L706
+.LVL789:
 	.loc 1 397 0
 	and	w26, w1, 15
 	.loc 1 400 0
 	mov	w18, 15
 	.loc 1 397 0
 	cmp	w26, 14
-	bne	.L694
+	bne	.L706
 	.loc 1 398 0
 	orr	w3, w3, w18
-.LVL805:
+.LVL790:
 	.loc 1 394 0
 	mov	w18, 0
-.LVL806:
-	b	.L694
-.LVL807:
+.LVL791:
+	b	.L706
+.LVL792:
 	.p2align 3
-.L793:
+.L736:
+.LBE1817:
 .LBE1821:
-.LBE1825:
-	.loc 1 1129 0
-	str	wzr, [x24, 608]
-	b	.L660
-.LVL808:
-.L801:
-	.loc 1 1356 0
+	.loc 1 1321 0
+	ldr	x0, [x24, 208]
+	adrp	x1, .LC85
+	.loc 1 1318 0
+	ldr	w3, [x24, 96]
+	.loc 1 1321 0
+	add	x1, x1, :lo12:.LC85
+	.loc 1 1318 0
+	strb	w3, [x24, 32]
+	.loc 1 1321 0
+	and	w3, w3, 255
+	ldr	w2, [x0, 40]
 	ldr	x0, [x24, 88]
-	.loc 1 1354 0
-	mov	w25, 1
-.LVL809:
-	.loc 1 1353 0
-	str	wzr, [x24, 188]
-	.loc 1 1356 0
-	adrp	x1, .LC88
-	.loc 1 1354 0
-	str	w25, [x24, 592]
-	.loc 1 1356 0
-	add	x1, x1, :lo12:.LC88
-	.loc 1 1355 0
-	str	wzr, [x24, 608]
-	.loc 1 1356 0
 	bl	_dev_info
-.LVL810:
-	.loc 1 1357 0
-	mov	x0, 2
-	bl	ebc_notify
-.LVL811:
-	.loc 1 1358 0
-	mov	w2, w25
-	mov	w1, w25
-	add	x0, x21, 328
-	bl	__wake_up_sync
-.LVL812:
-	b	.L730
-.L809:
-	mov	x0, x28
-	.loc 1 1187 0
-	cbnz	w1, .L685
-	.loc 1 1188 0
-	ldrsw	x2, [x24, 20]
-	ldp	x1, x0, [x24, 136]
-	bl	memcpy
-.LVL813:
-	ldr	x0, [x24, 208]
-	b	.L685
-.L712:
-	.loc 1 1224 0
-	ldr	x0, [x24, 128]
-	mov	x3, x24
-	ldr	x2, [x24, 152]
-	ldr	x1, [x28, 16]
-	bl	refresh_new_image_auto
-.LVL814:
-	b	.L713
-.L796:
-	.loc 1 1233 0
+.LVL793:
+	.loc 1 1322 0
+	mov	w0, 1
+	str	w0, [x24, 28]
+	.loc 1 1323 0
+	mov	x0, x20
+	bl	ebc_frame_start
+.LVL794:
+	.loc 1 1325 0
+	ldr	x1, [x25, #:lo12:jiffies]
+	add	x0, x20, 672
+	str	x0, [x29, 104]
+	add	x1, x1, 900
+	bl	mod_timer
+.LVL795:
+.LBB1822:
+	.loc 1 1326 0
+	ldr	w0, [x24, 76]
+	cbz	w0, .L825
+.L739:
+.LVL796:
+.L737:
+.LBE1822:
+	.loc 1 1328 0 discriminator 11
+	ldr	x2, [x25, #:lo12:jiffies]
+	mov	x1, 402653184
+	ldr	x0, [x29, 104]
+.LVL797:
+	add	x1, x2, x1
+	bl	mod_timer
+.LVL798:
+	.loc 1 1329 0 discriminator 11
+	str	wzr, [x24, 76]
+	.loc 1 1331 0 discriminator 11
+	str	x26, [x24, 200]
+	.loc 1 1333 0 discriminator 11
+	b	.L702
+.LVL799:
+	.p2align 3
+.L764:
+	.loc 1 1306 0
+	ldr	w0, [x24, 184]
+	.loc 1 1295 0
+	mov	w23, 0
+	.loc 1 1306 0
+	cbnz	w0, .L735
+.L811:
+	.loc 1 1307 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.12
-.LVL815:
-	b	.L714
-.L797:
-	.loc 1 1235 0
+.LVL800:
+	b	.L735
+.L805:
+	.loc 1 1160 0
 	ldr	x0, [x24, 88]
-	adrp	x1, .LC83
-	add	x1, x1, :lo12:.LC83
-	bl	_dev_err
-.LVL816:
-	.loc 1 1236 0
-	b	.L690
-.L806:
+	adrp	x1, .LC79
+	add	x1, x1, :lo12:.LC79
+	bl	_dev_info
+.LVL801:
 .LBB1826:
-.LBB1811:
-.LBB1812:
-	.loc 1 1162 0 discriminator 1
-	add	x26, x21, 352
-.LVL817:
-.LBE1812:
-	mov	w1, 0
-	add	x0, x29, 112
-	bl	init_wait_entry
-.LVL818:
-	b	.L673
+	.loc 1 1161 0
+	ldr	w0, [x24, 76]
+	cbz	w0, .L826
+.L685:
+.LVL802:
+.L683:
+.LBE1826:
+	.loc 1 1162 0 discriminator 11
+	ldr	x0, [x24, 88]
+.LVL803:
+	adrp	x1, .LC80
+	add	x1, x1, :lo12:.LC80
+	bl	_dev_info
+.LVL804:
+	b	.L790
+.LVL805:
 	.p2align 3
-.L817:
-.LVL819:
-.LBB1813:
-	.loc 1 1162 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L670
-	.loc 1 1162 0 discriminator 7
-	bl	schedule
-.LVL820:
-.L673:
-	.loc 1 1162 0 discriminator 9
-	add	x1, x29, 112
-	mov	w2, 1
-	mov	x0, x26
-	bl	prepare_to_wait_event
-.LVL821:
-	ldr	w1, [x24, 76]
-	cbz	w1, .L817
-.LBE1813:
-	.loc 1 1162 0 discriminator 4
-	mov	x0, x26
-	add	x1, x29, 112
-	bl	finish_wait
-.LVL822:
-	b	.L670
-.LVL823:
+.L821:
+.LBB1830:
+.LBB1818:
+	.loc 1 422 0
+	orr	w3, w3, 983040
+	b	.L713
 	.p2align 3
-.L810:
-.LBE1811:
-.LBE1826:
-.LBB1827:
-.LBB1822:
-	.loc 1 404 0 is_stmt 1
-	orr	w3, w3, 240
-	b	.L695
+.L822:
+	.loc 1 428 0
+	orr	w3, w3, 15728640
+	b	.L715
 	.p2align 3
-.L811:
-	.loc 1 410 0
-	orr	w3, w3, 3840
-	b	.L697
-.LVL824:
+.L823:
+	.loc 1 434 0
+	orr	w3, w3, 251658240
+	b	.L717
+.LVL806:
 	.p2align 3
-.L816:
+.L824:
 	.loc 1 440 0
 	orr	w3, w3, -268435456
-.LVL825:
+.LVL807:
 	.loc 1 445 0
 	and	w1, w1, w25
-.LVL826:
+.LVL808:
 	eor	w1, w1, w3
-.LVL827:
+.LVL809:
 	.loc 1 389 0
 	add	w4, w4, 1
 	and	w1, w1, w18
@@ -8997,152 +8901,300 @@ ebc_thread:
 	.loc 1 446 0
 	str	w1, [x7, x0]
 	.loc 1 389 0
-	ble	.L764
-.LVL828:
+	ble	.L776
+.LVL810:
 	.p2align 2
-.L710:
+.L722:
 	.loc 1 384 0
 	add	w14, w14, 1
 	add	w5, w5, w16
 	cmp	w14, w17
-	ble	.L763
-.L693:
-.LBE1822:
-.LBE1827:
-	.loc 1 1195 0
+	ble	.L775
+.L705:
+.LBE1818:
+.LBE1830:
+	.loc 1 1194 0
 	ldr	w0, [x24, 28]
-	cbnz	w0, .L690
-	.loc 1 1196 0
+	cbnz	w0, .L702
+	.loc 1 1195 0
 	mov	w0, 1
 	str	w0, [x24, 28]
-	.loc 1 1198 0
-	ldr	w0, [x24, 184]
 	.loc 1 1197 0
+	ldr	w0, [x24, 184]
+	.loc 1 1196 0
 	str	wzr, [x24, 76]
-	.loc 1 1198 0
-	cbz	w0, .L818
-.L711:
-	.loc 1 1200 0
+	.loc 1 1197 0
+	cbz	w0, .L827
+.L723:
+	.loc 1 1199 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL829:
+.LVL811:
 	cmn	w0, #1
-	beq	.L690
-	.loc 1 1204 0
+	beq	.L702
+	.loc 1 1203 0
 	ldr	w3, [x24, 96]
-	.loc 1 1207 0
+	.loc 1 1206 0
 	adrp	x1, .LC82
-	.loc 1 1204 0
+	.loc 1 1203 0
 	strb	w3, [x24, 32]
-	.loc 1 1207 0
+	.loc 1 1206 0
 	add	x1, x1, :lo12:.LC82
 	ldr	x0, [x24, 88]
-	b	.L779
-.LVL830:
+	b	.L791
+.LVL812:
 	.p2align 3
-.L812:
-.LBB1828:
-.LBB1823:
+.L818:
+.LBB1831:
+.LBB1819:
+	.loc 1 404 0
+	orr	w3, w3, 240
+	b	.L707
+	.p2align 3
+.L819:
+	.loc 1 410 0
+	orr	w3, w3, 3840
+	b	.L709
+	.p2align 3
+.L820:
 	.loc 1 416 0
 	orr	w3, w3, 61440
-	b	.L699
-	.p2align 3
+	b	.L711
+.LVL813:
+.L798:
+.LBE1819:
+.LBE1831:
+	.loc 1 1117 0
+	str	wzr, [x24, 592]
+	.loc 1 1118 0
+	mov	x0, 3
+.LVL814:
+	bl	ebc_notify
+.LVL815:
+	.loc 1 1119 0
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC76
+	add	x1, x1, :lo12:.LC76
+	bl	_dev_info
+.LVL816:
+	b	.L673
+.LVL817:
 .L813:
-	.loc 1 422 0
-	orr	w3, w3, 983040
-	b	.L701
-	.p2align 3
-.L814:
-	.loc 1 428 0
-	orr	w3, w3, 15728640
-	b	.L703
-	.p2align 3
-.L815:
-	.loc 1 434 0
-	orr	w3, w3, 251658240
-	b	.L705
-.LVL831:
-.L808:
-.LBE1823:
-.LBE1828:
-.LBB1829:
-.LBB1815:
-.LBB1816:
-	.loc 1 1328 0 discriminator 1
+	.loc 1 1354 0
+	ldr	x0, [x24, 88]
+	.loc 1 1352 0
+	mov	w25, 1
+.LVL818:
+	.loc 1 1351 0
+	str	wzr, [x24, 188]
+	.loc 1 1354 0
+	adrp	x1, .LC88
+	.loc 1 1352 0
+	str	w25, [x24, 592]
+	.loc 1 1354 0
+	add	x1, x1, :lo12:.LC88
+	.loc 1 1353 0
+	str	wzr, [x24, 608]
+	.loc 1 1354 0
+	bl	_dev_info
+.LVL819:
+	.loc 1 1355 0
+	mov	x0, 2
+	bl	ebc_notify
+.LVL820:
+	.loc 1 1356 0
+	mov	w2, w25
+	mov	w1, w25
+	add	x0, x21, 328
+	bl	__wake_up_sync
+.LVL821:
+	b	.L742
+.L695:
+	.loc 1 1183 0
+	ldr	x1, [x0, 16]
+	ldrsw	x2, [x24, 20]
+	ldr	x0, [x24, 128]
+	bl	memcpy
+.LVL822:
+	.loc 1 1184 0
+	ldr	x0, [x24, 200]
+	ldrsw	x2, [x24, 20]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x24, 136]
+	bl	memcpy
+.LVL823:
+	.loc 1 1185 0
+	ldr	x0, [x24, 200]
+	ldrsw	x2, [x24, 20]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x24, 144]
+	bl	memcpy
+.LVL824:
+	ldr	x0, [x24, 208]
+	b	.L697
+.LVL825:
+.L810:
+	.loc 1 1301 0
+	mov	w0, 2
+	.loc 1 1302 0
+	mov	w23, 0
+	.loc 1 1301 0
+	str	w0, [x28, 40]
+	b	.L734
+.LVL826:
+.L694:
+	.loc 1 1172 0
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC81
+	add	x1, x1, :lo12:.LC81
+	bl	_dev_info
+.LVL827:
+	.loc 1 1173 0
+	mov	x0, x28
+	b	.L789
+.L724:
+	.loc 1 1223 0
+	ldr	x0, [x24, 128]
+	mov	x3, x24
+	ldr	x2, [x24, 152]
+	ldr	x1, [x28, 16]
+	bl	refresh_new_image_auto
+.LVL828:
+	b	.L725
+.L825:
+.LBB1832:
+.LBB1823:
+.LBB1824:
+	.loc 1 1326 0 discriminator 1
 	add	x27, x21, 352
-.LBE1816:
+.LBE1824:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL832:
-	b	.L728
+.LVL829:
+	b	.L740
 	.p2align 3
-.L819:
-.LVL833:
-.LBB1817:
-	.loc 1 1328 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L725
-	.loc 1 1328 0 discriminator 7
+.L828:
+.LVL830:
+.LBB1825:
+	.loc 1 1326 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L737
+	.loc 1 1326 0 discriminator 7
 	bl	schedule
-.LVL834:
-.L728:
-	.loc 1 1328 0 discriminator 9
+.LVL831:
+.L740:
+	.loc 1 1326 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x27
 	bl	prepare_to_wait_event
-.LVL835:
+.LVL832:
 	ldr	w1, [x24, 76]
-	cbz	w1, .L819
-.LBE1817:
-	.loc 1 1328 0 discriminator 4
+	cbz	w1, .L828
+.LBE1825:
+	.loc 1 1326 0 discriminator 4
 	mov	x0, x27
 	add	x1, x29, 112
 	bl	finish_wait
+.LVL833:
+	b	.L737
+.LVL834:
+.L827:
+.LBE1823:
+.LBE1832:
+	.loc 1 1198 0 is_stmt 1
+	mov	x0, x20
+	bl	ebc_power_set.constprop.12
+.LVL835:
+	b	.L723
 .LVL836:
-	b	.L725
-.L682:
-.LBE1815:
-.LBE1829:
-	.loc 1 1173 0 is_stmt 1
-	ldr	x0, [x24, 88]
-	adrp	x1, .LC81
-	add	x1, x1, :lo12:.LC81
-	bl	_dev_info
+.L826:
+.LBB1833:
+.LBB1827:
+.LBB1828:
+	.loc 1 1161 0 discriminator 1
+	add	x26, x21, 352
 .LVL837:
-	.loc 1 1174 0
-	mov	x0, x28
-	b	.L777
+.LBE1828:
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
 .LVL838:
-.L787:
-.LBB1830:
-.LBB1831:
+	b	.L686
+	.p2align 3
+.L829:
+.LVL839:
+.LBB1829:
+	.loc 1 1161 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L683
+	.loc 1 1161 0 discriminator 7
+	bl	schedule
+.LVL840:
+.L686:
+	.loc 1 1161 0 discriminator 9
+	add	x1, x29, 112
+	mov	w2, 1
+	mov	x0, x26
+	bl	prepare_to_wait_event
+.LVL841:
+	ldr	w1, [x24, 76]
+	cbz	w1, .L829
+.LBE1829:
+	.loc 1 1161 0 discriminator 4
+	mov	x0, x26
+	add	x1, x29, 112
+	bl	finish_wait
+.LVL842:
+	b	.L683
+.LVL843:
+.L817:
+.LBE1827:
+.LBE1833:
+	.loc 1 1187 0 is_stmt 1
+	ldrsw	x2, [x24, 20]
+	ldp	x1, x0, [x24, 136]
+	bl	memcpy
+.LVL844:
+	ldr	x0, [x24, 208]
+	b	.L697
+.LVL845:
+.L799:
+.LBB1834:
+.LBB1835:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
-.LVL839:
-	b	.L657
-.LVL840:
-.L818:
-.LBE1831:
-.LBE1830:
-	.loc 1 1199 0
+.LVL846:
+	b	.L670
+.LVL847:
+.L807:
+.LBE1835:
+.LBE1834:
+	.loc 1 1234 0
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC83
+	add	x1, x1, :lo12:.LC83
+	bl	_dev_err
+.LVL848:
+	.loc 1 1235 0
+	b	.L702
+.L806:
+	.loc 1 1232 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.12
-.LVL841:
-	b	.L711
-.LVL842:
-.L794:
-	.loc 1 1146 0
+.LVL849:
+	b	.L726
+.L816:
+	.loc 1 1145 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.12
-.LVL843:
-	b	.L665
-.LVL844:
-.L788:
-	.loc 1 1391 0
+.LVL850:
+	b	.L678
+.LVL851:
+.L800:
+	.loc 1 1389 0
 	bl	__stack_chk_fail
-.LVL845:
+.LVL852:
 	.cfi_endproc
 .LFE2825:
 	.size	ebc_thread, .-ebc_thread
@@ -9201,7 +9253,7 @@ ebc_auto_thread_sem:
 	.type	dev_attr_waveform_version, %object
 	.size	dev_attr_waveform_version, 32
 dev_attr_waveform_version:
-	.xword	.LC96
+	.xword	.LC97
 	.hword	292
 	.zero	6
 	.xword	waveform_version_read
@@ -9209,7 +9261,7 @@ dev_attr_waveform_version:
 	.type	dev_attr_pmic_name, %object
 	.size	dev_attr_pmic_name, 32
 dev_attr_pmic_name:
-	.xword	.LC95
+	.xword	.LC96
 	.hword	292
 	.zero	6
 	.xword	pmic_name_read
@@ -9217,7 +9269,7 @@ dev_attr_pmic_name:
 	.type	dev_attr_pmic_temp, %object
 	.size	dev_attr_pmic_temp, 32
 dev_attr_pmic_temp:
-	.xword	.LC94
+	.xword	.LC95
 	.hword	292
 	.zero	6
 	.xword	pmic_temp_read
@@ -9225,7 +9277,7 @@ dev_attr_pmic_temp:
 	.type	dev_attr_pmic_vcom, %object
 	.size	dev_attr_pmic_vcom, 32
 dev_attr_pmic_vcom:
-	.xword	.LC93
+	.xword	.LC94
 	.hword	420
 	.zero	6
 	.xword	pmic_vcom_read
@@ -9233,7 +9285,7 @@ dev_attr_pmic_vcom:
 	.type	dev_attr_ebc_version, %object
 	.size	dev_attr_ebc_version, 32
 dev_attr_ebc_version:
-	.xword	.LC92
+	.xword	.LC93
 	.hword	292
 	.zero	6
 	.xword	ebc_version_read
@@ -9241,11 +9293,19 @@ dev_attr_ebc_version:
 	.type	dev_attr_ebc_state, %object
 	.size	dev_attr_ebc_state, 32
 dev_attr_ebc_state:
-	.xword	.LC91
+	.xword	.LC92
 	.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	.LC91
+	.hword	292
+	.zero	6
+	.xword	ebc_buf_state_read
+	.xword	0
 	.type	auto_buf_sema, %object
 	.size	auto_buf_sema, 48
 auto_buf_sema:
@@ -9270,24 +9330,24 @@ ebc_auto_task:
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.34937, %object
-	.size	__func__.34937, 11
-__func__.34937:
+	.type	__func__.34939, %object
+	.size	__func__.34939, 11
+__func__.34939:
 	.string	"ebc_io_ctl"
 	.align	3
 	.set	.LANCHOR3,. + 0
-	.type	__func__.34740, %object
-	.size	__func__.34740, 16
-__func__.34740:
+	.type	__func__.34742, %object
+	.size	__func__.34742, 16
+__func__.34742:
 	.string	"ebc_frame_start"
-	.type	__func__.35204, %object
-	.size	__func__.35204, 12
-__func__.35204:
+	.type	__func__.35230, %object
+	.size	__func__.35230, 12
+__func__.35230:
 	.string	"ebc_suspend"
 	.zero	4
-	.type	__func__.35145, %object
-	.size	__func__.35145, 19
-__func__.35145:
+	.type	__func__.35171, %object
+	.size	__func__.35171, 19
+__func__.35171:
 	.string	"ebc_lut_table_init"
 	.zero	5
 	.type	ebc_match, %object
@@ -9318,9 +9378,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init2262, %object
-	.size	__addressable_ebc_init2262, 8
-__addressable_ebc_init2262:
+	.type	__addressable_ebc_init2270, %object
+	.size	__addressable_ebc_init2270, 8
+__addressable_ebc_init2270:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -9378,7 +9438,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC16:
-	.string	"2.05"
+	.string	"2.06"
 	.zero	3
 .LC17:
 	.string	"%s\n"
@@ -9594,21 +9654,24 @@ __exitcall_ebc_exit:
 .LC90:
 	.string	"ebc-dev"
 .LC91:
+	.string	"ebc_buf_state"
+	.zero	2
+.LC92:
 	.string	"ebc_state"
 	.zero	6
-.LC92:
+.LC93:
 	.string	"ebc_version"
 	.zero	4
-.LC93:
+.LC94:
 	.string	"pmic_vcom"
 	.zero	6
-.LC94:
+.LC95:
 	.string	"pmic_temp"
 	.zero	6
-.LC95:
+.LC96:
 	.string	"pmic_name"
 	.zero	6
-.LC96:
+.LC97:
 	.string	"waveform_version"
 	.text
 .Letext0:
@@ -9808,16 +9871,16 @@ __exitcall_ebc_exit:
 	.file 212 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x1427f
+	.4byte	0x14306
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF3282
+	.4byte	.LASF3285
 	.byte	0x1
-	.4byte	.LASF3283
-	.4byte	.LASF3284
-	.4byte	.Ldebug_ranges0+0x1200
+	.4byte	.LASF3286
+	.4byte	.LASF3287
+	.4byte	.Ldebug_ranges0+0x1260
 	.8byte	0
 	.4byte	.Ldebug_line0
 	.uleb128 0x2
@@ -27358,7 +27421,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x3
 	.4byte	0x920f
 	.uleb128 0x46
-	.4byte	.LASF3021
+	.4byte	.LASF3022
 	.byte	0x1f
 	.2byte	0xba2
 	.4byte	0x921f
@@ -37427,7 +37490,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3006
 	.byte	0x1
-	.2byte	0x6b5
+	.2byte	0x6b3
 	.4byte	0x7b4
 	.uleb128 0x9
 	.byte	0x3
@@ -37435,7 +37498,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3007
 	.byte	0x1
-	.2byte	0x6bf
+	.2byte	0x6bd
 	.4byte	0xc5f5
 	.uleb128 0x9
 	.byte	0x3
@@ -37443,7 +37506,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3008
 	.byte	0x1
-	.2byte	0x6ce
+	.2byte	0x6cc
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
@@ -37451,7 +37514,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3009
 	.byte	0x1
-	.2byte	0x6d9
+	.2byte	0x6d7
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
@@ -37459,7 +37522,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3010
 	.byte	0x1
-	.2byte	0x6e7
+	.2byte	0x6e5
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
@@ -37467,7 +37530,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3011
 	.byte	0x1
-	.2byte	0x70a
+	.2byte	0x708
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
@@ -37475,7 +37538,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3012
 	.byte	0x1
-	.2byte	0x714
+	.2byte	0x712
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
@@ -37483,7 +37546,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3013
 	.byte	0x1
-	.2byte	0x71d
+	.2byte	0x71b
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
@@ -37491,2440 +37554,2483 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3014
 	.byte	0x1
-	.2byte	0x8b7
+	.2byte	0x724
+	.4byte	0xb388
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	dev_attr_ebc_buf_state
+	.uleb128 0x4c
+	.4byte	.LASF3015
+	.byte	0x1
+	.2byte	0x8bf
 	.4byte	0xa547
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_pm
 	.uleb128 0x5
 	.4byte	0xb186
-	.4byte	0xe5d7
+	.4byte	0xe5ed
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe5c7
+	.4byte	0xe5dd
 	.uleb128 0x4c
-	.4byte	.LASF3015
+	.4byte	.LASF3016
 	.byte	0x1
-	.2byte	0x8bc
-	.4byte	0xe5d7
+	.2byte	0x8c4
+	.4byte	0xe5ed
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_match
 	.uleb128 0x4c
-	.4byte	.LASF3016
+	.4byte	.LASF3017
 	.byte	0x1
-	.2byte	0x8c2
+	.2byte	0x8ca
 	.4byte	0xd683
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_driver
 	.uleb128 0x4c
-	.4byte	.LASF3017
+	.4byte	.LASF3018
 	.byte	0x1
-	.2byte	0x8d6
+	.2byte	0x8de
 	.4byte	0x443
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init2262
+	.8byte	__addressable_ebc_init2270
 	.uleb128 0x4c
-	.4byte	.LASF3018
+	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x8d7
+	.2byte	0x8df
 	.4byte	0x497
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	__exitcall_ebc_exit
 	.uleb128 0x4d
-	.4byte	.LASF3067
+	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0x8d1
-	.8byte	.LFB2851
-	.8byte	.LFE2851-.LFB2851
+	.2byte	0x8d9
+	.8byte	.LFB2852
+	.8byte	.LFE2852-.LFB2852
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe660
+	.4byte	0xe676
 	.uleb128 0x4e
 	.8byte	.LVL34
-	.4byte	0x13f83
+	.4byte	0x13ffe
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3019
+	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x8cc
+	.2byte	0x8d4
 	.4byte	0xc6
-	.8byte	.LFB2850
-	.8byte	.LFE2850-.LFB2850
+	.8byte	.LFB2851
+	.8byte	.LFE2851-.LFB2851
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe690
+	.4byte	0xe6a6
 	.uleb128 0x4e
-	.8byte	.LVL319
-	.4byte	0x13f8f
+	.8byte	.LVL322
+	.4byte	0x1400a
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3020
+	.4byte	.LASF3021
 	.byte	0x1
-	.2byte	0x8ab
+	.2byte	0x8b3
 	.4byte	0xc6
-	.8byte	.LFB2849
-	.8byte	.LFE2849-.LFB2849
+	.8byte	.LFB2850
+	.8byte	.LFE2850-.LFB2850
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe72c
+	.4byte	0xe742
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x8ab
+	.2byte	0x8b3
 	.4byte	0xa55b
 	.4byte	.LLST7
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x8ad
+	.2byte	0x8b5
 	.4byte	0xe47d
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x8ae
-	.4byte	0xe72c
+	.2byte	0x8b6
+	.4byte	0xe742
 	.uleb128 0x53
-	.4byte	0x13374
+	.4byte	0x133ef
 	.8byte	.LBB926
 	.8byte	.LBE926-.LBB926
 	.byte	0x1
-	.2byte	0x8ad
-	.4byte	0xe6fc
+	.2byte	0x8b5
+	.4byte	0xe712
 	.uleb128 0x54
-	.4byte	0x13385
+	.4byte	0x13400
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12f65
+	.4byte	0x12fe0
 	.8byte	.LBB928
 	.8byte	.LBE928-.LBB928
 	.byte	0x1
-	.2byte	0x8b0
-	.4byte	0xe71e
+	.2byte	0x8b8
+	.4byte	0xe734
 	.uleb128 0x54
-	.4byte	0x12f71
+	.4byte	0x12fec
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL38
-	.4byte	0x13f9b
+	.4byte	0x14016
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xe1ec
 	.uleb128 0x50
-	.4byte	.LASF3022
+	.4byte	.LASF3023
 	.byte	0x1
-	.2byte	0x89a
+	.2byte	0x8a2
 	.4byte	0xc6
-	.8byte	.LFB2848
-	.8byte	.LFE2848-.LFB2848
+	.8byte	.LFB2849
+	.8byte	.LFE2849-.LFB2849
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe839
+	.4byte	0xe84f
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x89a
+	.2byte	0x8a2
 	.4byte	0xa55b
-	.4byte	.LLST139
+	.4byte	.LLST142
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x89c
+	.2byte	0x8a4
 	.4byte	0xe47d
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x89d
-	.4byte	0xe72c
+	.2byte	0x8a5
+	.4byte	0xe742
 	.uleb128 0x55
-	.4byte	.LASF3023
-	.4byte	0xe849
+	.4byte	.LASF3024
+	.4byte	0xe85f
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35204
+	.8byte	__func__.35230
 	.uleb128 0x53
-	.4byte	0x13374
-	.8byte	.LBB1404
-	.8byte	.LBE1404-.LBB1404
+	.4byte	0x133ef
+	.8byte	.LBB1408
+	.8byte	.LBE1408-.LBB1408
 	.byte	0x1
-	.2byte	0x89c
-	.4byte	0xe7b1
+	.2byte	0x8a4
+	.4byte	0xe7c7
 	.uleb128 0x54
-	.4byte	0x13385
+	.4byte	0x13400
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12f7d
-	.8byte	.LBB1406
-	.8byte	.LBE1406-.LBB1406
+	.4byte	0x12ff8
+	.8byte	.LBB1410
+	.8byte	.LBE1410-.LBB1410
 	.byte	0x1
-	.2byte	0x8a5
-	.4byte	0xe7d3
+	.2byte	0x8ad
+	.4byte	0xe7e9
 	.uleb128 0x54
-	.4byte	0x12f89
+	.4byte	0x13004
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12ccb
-	.8byte	.LBB1408
-	.8byte	.LBE1408-.LBB1408
+	.4byte	0x12d46
+	.8byte	.LBB1412
+	.8byte	.LBE1412-.LBB1412
 	.byte	0x1
-	.2byte	0x8a1
-	.4byte	0xe81e
+	.2byte	0x8a9
+	.4byte	0xe834
 	.uleb128 0x54
-	.4byte	0x12ce6
+	.4byte	0x12d61
 	.uleb128 0x54
-	.4byte	0x12cdb
+	.4byte	0x12d56
 	.uleb128 0x56
-	.8byte	.LBB1409
-	.8byte	.LBE1409-.LBB1409
+	.8byte	.LBB1413
+	.8byte	.LBE1413-.LBB1413
 	.uleb128 0x57
-	.4byte	0x12cf1
+	.4byte	0x12d6c
 	.uleb128 0x4e
-	.8byte	.LVL472
-	.4byte	0x13e13
+	.8byte	.LVL476
+	.4byte	0x13e8e
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL470
-	.4byte	0x13f9b
+	.8byte	.LVL474
+	.4byte	0x14016
 	.uleb128 0x4e
-	.8byte	.LVL471
-	.4byte	0x13f9b
+	.8byte	.LVL475
+	.4byte	0x14016
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xe849
+	.4byte	0xe85f
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xb
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe839
+	.4byte	0xe84f
 	.uleb128 0x4f
-	.4byte	.LASF3024
+	.4byte	.LASF3025
 	.byte	0x1
-	.2byte	0x893
+	.2byte	0x89b
 	.4byte	0xc6
-	.8byte	.LFB2847
-	.8byte	.LFE2847-.LFB2847
+	.8byte	.LFB2848
+	.8byte	.LFE2848-.LFB2848
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe88e
+	.4byte	0xe8a4
 	.uleb128 0x58
-	.4byte	.LASF3025
+	.4byte	.LASF3026
 	.byte	0x1
-	.2byte	0x893
+	.2byte	0x89b
 	.4byte	0xd6ff
 	.4byte	.LLST9
 	.uleb128 0x4e
 	.8byte	.LVL44
-	.4byte	0x13fa8
+	.4byte	0x14023
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3026
+	.4byte	.LASF3027
 	.byte	0x1
-	.2byte	0x826
+	.2byte	0x82e
 	.4byte	0xc6
-	.8byte	.LFB2846
-	.8byte	.LFE2846-.LFB2846
+	.8byte	.LFB2847
+	.8byte	.LFE2847-.LFB2847
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfc7b
+	.4byte	0xfc9e
 	.uleb128 0x58
-	.4byte	.LASF3025
+	.4byte	.LASF3026
 	.byte	0x1
-	.2byte	0x826
+	.2byte	0x82e
 	.4byte	0xd6ff
-	.4byte	.LLST140
+	.4byte	.LLST143
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x828
+	.2byte	0x830
 	.4byte	0xa55b
 	.uleb128 0x46
-	.4byte	.LASF3027
+	.4byte	.LASF3028
 	.byte	0x1
-	.2byte	0x829
+	.2byte	0x831
 	.4byte	0xb87f
 	.uleb128 0x59
-	.4byte	.LASF3028
+	.4byte	.LASF3029
 	.byte	0x1
-	.2byte	0x82a
+	.2byte	0x832
 	.4byte	0xd6ff
-	.4byte	.LLST141
+	.4byte	.LLST144
 	.uleb128 0x46
-	.4byte	.LASF3029
+	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0x82b
+	.2byte	0x833
 	.4byte	0xb87f
 	.uleb128 0x59
-	.4byte	.LASF3030
+	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0x82c
+	.2byte	0x834
 	.4byte	0xc028
-	.4byte	.LLST142
+	.4byte	.LLST145
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x82d
+	.2byte	0x835
 	.4byte	0xe47d
 	.uleb128 0x59
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x82e
-	.4byte	0xe72c
-	.4byte	.LLST143
+	.2byte	0x836
+	.4byte	0xe742
+	.4byte	.LLST146
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x82f
+	.2byte	0x837
 	.4byte	0xe13f
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x830
+	.2byte	0x838
 	.4byte	0xc6
 	.uleb128 0x5a
-	.4byte	0x13392
-	.8byte	.LBB1555
-	.4byte	.Ldebug_ranges0+0xba0
+	.4byte	0x1340d
+	.8byte	.LBB1559
+	.4byte	.Ldebug_ranges0+0xc00
 	.byte	0x1
-	.2byte	0x832
-	.4byte	0xe96d
+	.2byte	0x83a
+	.4byte	0xe983
 	.uleb128 0x54
-	.4byte	0x133bb
+	.4byte	0x13436
 	.uleb128 0x54
-	.4byte	0x133af
+	.4byte	0x1342a
 	.uleb128 0x54
-	.4byte	0x133a3
+	.4byte	0x1341e
 	.uleb128 0x4e
-	.8byte	.LVL475
-	.4byte	0x13fb4
+	.8byte	.LVL479
+	.4byte	0x1402f
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1326f
-	.8byte	.LBB1559
-	.8byte	.LBE1559-.LBB1559
+	.4byte	0x132ea
+	.8byte	.LBB1563
+	.8byte	.LBE1563-.LBB1563
 	.byte	0x1
-	.2byte	0x844
-	.4byte	0xe9ac
+	.2byte	0x84c
+	.4byte	0xe9c2
 	.uleb128 0x54
-	.4byte	0x1327f
+	.4byte	0x132fa
 	.uleb128 0x5b
-	.4byte	0x13374
-	.8byte	.LBB1560
-	.8byte	.LBE1560-.LBB1560
+	.4byte	0x133ef
+	.8byte	.LBB1564
+	.8byte	.LBE1564-.LBB1564
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x54
-	.4byte	0x13385
+	.4byte	0x13400
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13291
-	.8byte	.LBB1562
-	.8byte	.LBE1562-.LBB1562
+	.4byte	0x1330c
+	.8byte	.LBB1566
+	.8byte	.LBE1566-.LBB1566
 	.byte	0x1
-	.2byte	0x855
-	.4byte	0xe9ec
+	.2byte	0x85d
+	.4byte	0xea02
 	.uleb128 0x54
-	.4byte	0x132a2
+	.4byte	0x1331d
 	.uleb128 0x5c
-	.4byte	0x13374
-	.8byte	.LBB1563
-	.8byte	.LBE1563-.LBB1563
+	.4byte	0x133ef
+	.8byte	.LBB1567
+	.8byte	.LBE1567-.LBB1567
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x54
-	.4byte	0x13385
+	.4byte	0x13400
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x115ac
-	.8byte	.LBB1565
-	.4byte	.Ldebug_ranges0+0xbd0
+	.4byte	0x1162f
+	.8byte	.LBB1569
+	.4byte	.Ldebug_ranges0+0xc30
 	.byte	0x1
-	.2byte	0x863
-	.4byte	0xf3a5
+	.2byte	0x86b
+	.4byte	0xf3bb
 	.uleb128 0x54
-	.4byte	0x115bd
+	.4byte	0x11640
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xbd0
+	.4byte	.Ldebug_ranges0+0xc30
 	.uleb128 0x57
-	.4byte	0x115c9
+	.4byte	0x1164c
 	.uleb128 0x5a
-	.4byte	0x132b5
-	.8byte	.LBB1567
-	.4byte	.Ldebug_ranges0+0xc30
+	.4byte	0x13330
+	.8byte	.LBB1571
+	.4byte	.Ldebug_ranges0+0xc90
 	.byte	0x1
-	.2byte	0x597
-	.4byte	0xea7c
+	.2byte	0x595
+	.4byte	0xea92
 	.uleb128 0x54
-	.4byte	0x132dd
+	.4byte	0x13358
 	.uleb128 0x54
-	.4byte	0x132d1
+	.4byte	0x1334c
 	.uleb128 0x54
-	.4byte	0x132c6
+	.4byte	0x13341
 	.uleb128 0x5e
-	.4byte	0x132ea
-	.8byte	.LBB1568
-	.4byte	.Ldebug_ranges0+0xc30
+	.4byte	0x13365
+	.8byte	.LBB1572
+	.4byte	.Ldebug_ranges0+0xc90
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1331e
+	.4byte	0x13399
 	.uleb128 0x54
-	.4byte	0x13312
+	.4byte	0x1338d
 	.uleb128 0x54
-	.4byte	0x13306
+	.4byte	0x13381
 	.uleb128 0x54
-	.4byte	0x132fb
+	.4byte	0x13376
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xc30
+	.4byte	.Ldebug_ranges0+0xc90
 	.uleb128 0x57
-	.4byte	0x13329
+	.4byte	0x133a4
 	.uleb128 0x4e
-	.8byte	.LVL483
-	.4byte	0x13fc1
+	.8byte	.LVL487
+	.4byte	0x1403c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132b5
-	.8byte	.LBB1579
-	.8byte	.LBE1579-.LBB1579
+	.4byte	0x13330
+	.8byte	.LBB1583
+	.8byte	.LBE1583-.LBB1583
 	.byte	0x1
-	.2byte	0x59a
-	.4byte	0xeaf9
+	.2byte	0x598
+	.4byte	0xeb0f
 	.uleb128 0x54
-	.4byte	0x132dd
+	.4byte	0x13358
 	.uleb128 0x54
-	.4byte	0x132d1
+	.4byte	0x1334c
 	.uleb128 0x54
-	.4byte	0x132c6
+	.4byte	0x13341
 	.uleb128 0x5c
-	.4byte	0x132ea
-	.8byte	.LBB1580
-	.8byte	.LBE1580-.LBB1580
+	.4byte	0x13365
+	.8byte	.LBB1584
+	.8byte	.LBE1584-.LBB1584
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1331e
+	.4byte	0x13399
 	.uleb128 0x54
-	.4byte	0x13312
+	.4byte	0x1338d
 	.uleb128 0x54
-	.4byte	0x13306
+	.4byte	0x13381
 	.uleb128 0x54
-	.4byte	0x132fb
+	.4byte	0x13376
 	.uleb128 0x56
-	.8byte	.LBB1581
-	.8byte	.LBE1581-.LBB1581
+	.8byte	.LBB1585
+	.8byte	.LBE1585-.LBB1585
 	.uleb128 0x57
-	.4byte	0x13329
+	.4byte	0x133a4
 	.uleb128 0x4e
-	.8byte	.LVL484
-	.4byte	0x13fc1
+	.8byte	.LVL488
+	.4byte	0x1403c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132b5
-	.8byte	.LBB1582
-	.8byte	.LBE1582-.LBB1582
+	.4byte	0x13330
+	.8byte	.LBB1586
+	.8byte	.LBE1586-.LBB1586
 	.byte	0x1
-	.2byte	0x59d
-	.4byte	0xeb76
+	.2byte	0x59b
+	.4byte	0xeb8c
 	.uleb128 0x54
-	.4byte	0x132dd
+	.4byte	0x13358
 	.uleb128 0x54
-	.4byte	0x132d1
+	.4byte	0x1334c
 	.uleb128 0x54
-	.4byte	0x132c6
+	.4byte	0x13341
 	.uleb128 0x5c
-	.4byte	0x132ea
-	.8byte	.LBB1583
-	.8byte	.LBE1583-.LBB1583
+	.4byte	0x13365
+	.8byte	.LBB1587
+	.8byte	.LBE1587-.LBB1587
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1331e
+	.4byte	0x13399
 	.uleb128 0x54
-	.4byte	0x13312
+	.4byte	0x1338d
 	.uleb128 0x54
-	.4byte	0x13306
+	.4byte	0x13381
 	.uleb128 0x54
-	.4byte	0x132fb
+	.4byte	0x13376
 	.uleb128 0x56
-	.8byte	.LBB1584
-	.8byte	.LBE1584-.LBB1584
+	.8byte	.LBB1588
+	.8byte	.LBE1588-.LBB1588
 	.uleb128 0x57
-	.4byte	0x13329
+	.4byte	0x133a4
 	.uleb128 0x4e
-	.8byte	.LVL485
-	.4byte	0x13fc1
+	.8byte	.LVL489
+	.4byte	0x1403c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132b5
-	.8byte	.LBB1585
-	.8byte	.LBE1585-.LBB1585
+	.4byte	0x13330
+	.8byte	.LBB1589
+	.8byte	.LBE1589-.LBB1589
 	.byte	0x1
-	.2byte	0x5a0
-	.4byte	0xebf3
+	.2byte	0x59e
+	.4byte	0xec09
 	.uleb128 0x54
-	.4byte	0x132dd
+	.4byte	0x13358
 	.uleb128 0x54
-	.4byte	0x132d1
+	.4byte	0x1334c
 	.uleb128 0x54
-	.4byte	0x132c6
+	.4byte	0x13341
 	.uleb128 0x5c
-	.4byte	0x132ea
-	.8byte	.LBB1586
-	.8byte	.LBE1586-.LBB1586
+	.4byte	0x13365
+	.8byte	.LBB1590
+	.8byte	.LBE1590-.LBB1590
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1331e
+	.4byte	0x13399
 	.uleb128 0x54
-	.4byte	0x13312
+	.4byte	0x1338d
 	.uleb128 0x54
-	.4byte	0x13306
+	.4byte	0x13381
 	.uleb128 0x54
-	.4byte	0x132fb
+	.4byte	0x13376
 	.uleb128 0x56
-	.8byte	.LBB1587
-	.8byte	.LBE1587-.LBB1587
+	.8byte	.LBB1591
+	.8byte	.LBE1591-.LBB1591
 	.uleb128 0x57
-	.4byte	0x13329
+	.4byte	0x133a4
 	.uleb128 0x4e
-	.8byte	.LVL486
-	.4byte	0x13fc1
+	.8byte	.LVL490
+	.4byte	0x1403c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132b5
-	.8byte	.LBB1588
-	.8byte	.LBE1588-.LBB1588
+	.4byte	0x13330
+	.8byte	.LBB1592
+	.8byte	.LBE1592-.LBB1592
 	.byte	0x1
-	.2byte	0x5a3
-	.4byte	0xec70
+	.2byte	0x5a1
+	.4byte	0xec86
 	.uleb128 0x54
-	.4byte	0x132dd
+	.4byte	0x13358
 	.uleb128 0x54
-	.4byte	0x132d1
+	.4byte	0x1334c
 	.uleb128 0x54
-	.4byte	0x132c6
+	.4byte	0x13341
 	.uleb128 0x5c
-	.4byte	0x132ea
-	.8byte	.LBB1589
-	.8byte	.LBE1589-.LBB1589
+	.4byte	0x13365
+	.8byte	.LBB1593
+	.8byte	.LBE1593-.LBB1593
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1331e
+	.4byte	0x13399
 	.uleb128 0x54
-	.4byte	0x13312
+	.4byte	0x1338d
 	.uleb128 0x54
-	.4byte	0x13306
+	.4byte	0x13381
 	.uleb128 0x54
-	.4byte	0x132fb
+	.4byte	0x13376
 	.uleb128 0x56
-	.8byte	.LBB1590
-	.8byte	.LBE1590-.LBB1590
+	.8byte	.LBB1594
+	.8byte	.LBE1594-.LBB1594
 	.uleb128 0x57
-	.4byte	0x13329
+	.4byte	0x133a4
 	.uleb128 0x4e
-	.8byte	.LVL487
-	.4byte	0x13fc1
+	.8byte	.LVL491
+	.4byte	0x1403c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132b5
-	.8byte	.LBB1591
-	.8byte	.LBE1591-.LBB1591
+	.4byte	0x13330
+	.8byte	.LBB1595
+	.8byte	.LBE1595-.LBB1595
 	.byte	0x1
-	.2byte	0x5a6
-	.4byte	0xeced
+	.2byte	0x5a4
+	.4byte	0xed03
 	.uleb128 0x54
-	.4byte	0x132dd
+	.4byte	0x13358
 	.uleb128 0x54
-	.4byte	0x132d1
+	.4byte	0x1334c
 	.uleb128 0x54
-	.4byte	0x132c6
+	.4byte	0x13341
 	.uleb128 0x5c
-	.4byte	0x132ea
-	.8byte	.LBB1592
-	.8byte	.LBE1592-.LBB1592
+	.4byte	0x13365
+	.8byte	.LBB1596
+	.8byte	.LBE1596-.LBB1596
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1331e
+	.4byte	0x13399
 	.uleb128 0x54
-	.4byte	0x13312
+	.4byte	0x1338d
 	.uleb128 0x54
-	.4byte	0x13306
+	.4byte	0x13381
 	.uleb128 0x54
-	.4byte	0x132fb
+	.4byte	0x13376
 	.uleb128 0x56
-	.8byte	.LBB1593
-	.8byte	.LBE1593-.LBB1593
+	.8byte	.LBB1597
+	.8byte	.LBE1597-.LBB1597
 	.uleb128 0x57
-	.4byte	0x13329
+	.4byte	0x133a4
 	.uleb128 0x4e
-	.8byte	.LVL488
-	.4byte	0x13fc1
+	.8byte	.LVL492
+	.4byte	0x1403c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132b5
-	.8byte	.LBB1594
-	.8byte	.LBE1594-.LBB1594
+	.4byte	0x13330
+	.8byte	.LBB1598
+	.8byte	.LBE1598-.LBB1598
 	.byte	0x1
-	.2byte	0x5a9
-	.4byte	0xed6a
+	.2byte	0x5a7
+	.4byte	0xed80
 	.uleb128 0x54
-	.4byte	0x132dd
+	.4byte	0x13358
 	.uleb128 0x54
-	.4byte	0x132d1
+	.4byte	0x1334c
 	.uleb128 0x54
-	.4byte	0x132c6
+	.4byte	0x13341
 	.uleb128 0x5c
-	.4byte	0x132ea
-	.8byte	.LBB1595
-	.8byte	.LBE1595-.LBB1595
+	.4byte	0x13365
+	.8byte	.LBB1599
+	.8byte	.LBE1599-.LBB1599
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1331e
+	.4byte	0x13399
 	.uleb128 0x54
-	.4byte	0x13312
+	.4byte	0x1338d
 	.uleb128 0x54
-	.4byte	0x13306
+	.4byte	0x13381
 	.uleb128 0x54
-	.4byte	0x132fb
+	.4byte	0x13376
 	.uleb128 0x56
-	.8byte	.LBB1596
-	.8byte	.LBE1596-.LBB1596
+	.8byte	.LBB1600
+	.8byte	.LBE1600-.LBB1600
 	.uleb128 0x57
-	.4byte	0x13329
+	.4byte	0x133a4
 	.uleb128 0x4e
-	.8byte	.LVL489
-	.4byte	0x13fc1
+	.8byte	.LVL493
+	.4byte	0x1403c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132b5
-	.8byte	.LBB1597
-	.8byte	.LBE1597-.LBB1597
+	.4byte	0x13330
+	.8byte	.LBB1601
+	.8byte	.LBE1601-.LBB1601
 	.byte	0x1
-	.2byte	0x5ac
-	.4byte	0xede7
+	.2byte	0x5aa
+	.4byte	0xedfd
 	.uleb128 0x54
-	.4byte	0x132dd
+	.4byte	0x13358
 	.uleb128 0x54
-	.4byte	0x132d1
+	.4byte	0x1334c
 	.uleb128 0x54
-	.4byte	0x132c6
+	.4byte	0x13341
 	.uleb128 0x5c
-	.4byte	0x132ea
-	.8byte	.LBB1598
-	.8byte	.LBE1598-.LBB1598
+	.4byte	0x13365
+	.8byte	.LBB1602
+	.8byte	.LBE1602-.LBB1602
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1331e
+	.4byte	0x13399
 	.uleb128 0x54
-	.4byte	0x13312
+	.4byte	0x1338d
 	.uleb128 0x54
-	.4byte	0x13306
+	.4byte	0x13381
 	.uleb128 0x54
-	.4byte	0x132fb
+	.4byte	0x13376
 	.uleb128 0x56
-	.8byte	.LBB1599
-	.8byte	.LBE1599-.LBB1599
+	.8byte	.LBB1603
+	.8byte	.LBE1603-.LBB1603
 	.uleb128 0x57
-	.4byte	0x13329
+	.4byte	0x133a4
 	.uleb128 0x4e
-	.8byte	.LVL490
-	.4byte	0x13fc1
+	.8byte	.LVL494
+	.4byte	0x1403c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132b5
-	.8byte	.LBB1600
-	.8byte	.LBE1600-.LBB1600
+	.4byte	0x13330
+	.8byte	.LBB1604
+	.8byte	.LBE1604-.LBB1604
 	.byte	0x1
-	.2byte	0x5af
-	.4byte	0xee64
+	.2byte	0x5ad
+	.4byte	0xee7a
 	.uleb128 0x54
-	.4byte	0x132dd
+	.4byte	0x13358
 	.uleb128 0x54
-	.4byte	0x132d1
+	.4byte	0x1334c
 	.uleb128 0x54
-	.4byte	0x132c6
+	.4byte	0x13341
 	.uleb128 0x5c
-	.4byte	0x132ea
-	.8byte	.LBB1601
-	.8byte	.LBE1601-.LBB1601
+	.4byte	0x13365
+	.8byte	.LBB1605
+	.8byte	.LBE1605-.LBB1605
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1331e
+	.4byte	0x13399
 	.uleb128 0x54
-	.4byte	0x13312
+	.4byte	0x1338d
 	.uleb128 0x54
-	.4byte	0x13306
+	.4byte	0x13381
 	.uleb128 0x54
-	.4byte	0x132fb
+	.4byte	0x13376
 	.uleb128 0x56
-	.8byte	.LBB1602
-	.8byte	.LBE1602-.LBB1602
+	.8byte	.LBB1606
+	.8byte	.LBE1606-.LBB1606
 	.uleb128 0x57
-	.4byte	0x13329
+	.4byte	0x133a4
 	.uleb128 0x4e
-	.8byte	.LVL491
-	.4byte	0x13fc1
+	.8byte	.LVL495
+	.4byte	0x1403c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132b5
-	.8byte	.LBB1603
-	.8byte	.LBE1603-.LBB1603
+	.4byte	0x13330
+	.8byte	.LBB1607
+	.8byte	.LBE1607-.LBB1607
 	.byte	0x1
-	.2byte	0x5b2
-	.4byte	0xeee1
+	.2byte	0x5b0
+	.4byte	0xeef7
 	.uleb128 0x54
-	.4byte	0x132dd
+	.4byte	0x13358
 	.uleb128 0x54
-	.4byte	0x132d1
+	.4byte	0x1334c
 	.uleb128 0x54
-	.4byte	0x132c6
+	.4byte	0x13341
 	.uleb128 0x5c
-	.4byte	0x132ea
-	.8byte	.LBB1604
-	.8byte	.LBE1604-.LBB1604
+	.4byte	0x13365
+	.8byte	.LBB1608
+	.8byte	.LBE1608-.LBB1608
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1331e
+	.4byte	0x13399
 	.uleb128 0x54
-	.4byte	0x13312
+	.4byte	0x1338d
 	.uleb128 0x54
-	.4byte	0x13306
+	.4byte	0x13381
 	.uleb128 0x54
-	.4byte	0x132fb
+	.4byte	0x13376
 	.uleb128 0x56
-	.8byte	.LBB1605
-	.8byte	.LBE1605-.LBB1605
+	.8byte	.LBB1609
+	.8byte	.LBE1609-.LBB1609
 	.uleb128 0x57
-	.4byte	0x13329
+	.4byte	0x133a4
 	.uleb128 0x4e
-	.8byte	.LVL492
-	.4byte	0x13fc1
+	.8byte	.LVL496
+	.4byte	0x1403c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132b5
-	.8byte	.LBB1606
-	.8byte	.LBE1606-.LBB1606
+	.4byte	0x13330
+	.8byte	.LBB1610
+	.8byte	.LBE1610-.LBB1610
 	.byte	0x1
-	.2byte	0x5b5
-	.4byte	0xef5e
+	.2byte	0x5b3
+	.4byte	0xef74
 	.uleb128 0x54
-	.4byte	0x132dd
+	.4byte	0x13358
 	.uleb128 0x54
-	.4byte	0x132d1
+	.4byte	0x1334c
 	.uleb128 0x54
-	.4byte	0x132c6
+	.4byte	0x13341
 	.uleb128 0x5c
-	.4byte	0x132ea
-	.8byte	.LBB1607
-	.8byte	.LBE1607-.LBB1607
+	.4byte	0x13365
+	.8byte	.LBB1611
+	.8byte	.LBE1611-.LBB1611
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1331e
+	.4byte	0x13399
 	.uleb128 0x54
-	.4byte	0x13312
+	.4byte	0x1338d
 	.uleb128 0x54
-	.4byte	0x13306
+	.4byte	0x13381
 	.uleb128 0x54
-	.4byte	0x132fb
+	.4byte	0x13376
 	.uleb128 0x56
-	.8byte	.LBB1608
-	.8byte	.LBE1608-.LBB1608
+	.8byte	.LBB1612
+	.8byte	.LBE1612-.LBB1612
 	.uleb128 0x57
-	.4byte	0x13329
+	.4byte	0x133a4
 	.uleb128 0x4e
-	.8byte	.LVL493
-	.4byte	0x13fc1
+	.8byte	.LVL497
+	.4byte	0x1403c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132b5
-	.8byte	.LBB1609
-	.8byte	.LBE1609-.LBB1609
+	.4byte	0x13330
+	.8byte	.LBB1613
+	.8byte	.LBE1613-.LBB1613
 	.byte	0x1
-	.2byte	0x5b8
-	.4byte	0xefdb
+	.2byte	0x5b6
+	.4byte	0xeff1
 	.uleb128 0x54
-	.4byte	0x132dd
+	.4byte	0x13358
 	.uleb128 0x54
-	.4byte	0x132d1
+	.4byte	0x1334c
 	.uleb128 0x54
-	.4byte	0x132c6
+	.4byte	0x13341
 	.uleb128 0x5c
-	.4byte	0x132ea
-	.8byte	.LBB1610
-	.8byte	.LBE1610-.LBB1610
+	.4byte	0x13365
+	.8byte	.LBB1614
+	.8byte	.LBE1614-.LBB1614
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1331e
+	.4byte	0x13399
 	.uleb128 0x54
-	.4byte	0x13312
+	.4byte	0x1338d
 	.uleb128 0x54
-	.4byte	0x13306
+	.4byte	0x13381
 	.uleb128 0x54
-	.4byte	0x132fb
+	.4byte	0x13376
 	.uleb128 0x56
-	.8byte	.LBB1611
-	.8byte	.LBE1611-.LBB1611
+	.8byte	.LBB1615
+	.8byte	.LBE1615-.LBB1615
 	.uleb128 0x57
-	.4byte	0x13329
+	.4byte	0x133a4
 	.uleb128 0x4e
-	.8byte	.LVL494
-	.4byte	0x13fc1
+	.8byte	.LVL498
+	.4byte	0x1403c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132b5
-	.8byte	.LBB1612
-	.8byte	.LBE1612-.LBB1612
+	.4byte	0x13330
+	.8byte	.LBB1616
+	.8byte	.LBE1616-.LBB1616
 	.byte	0x1
-	.2byte	0x5bb
-	.4byte	0xf058
+	.2byte	0x5b9
+	.4byte	0xf06e
 	.uleb128 0x54
-	.4byte	0x132dd
+	.4byte	0x13358
 	.uleb128 0x54
-	.4byte	0x132d1
+	.4byte	0x1334c
 	.uleb128 0x54
-	.4byte	0x132c6
+	.4byte	0x13341
 	.uleb128 0x5c
-	.4byte	0x132ea
-	.8byte	.LBB1613
-	.8byte	.LBE1613-.LBB1613
+	.4byte	0x13365
+	.8byte	.LBB1617
+	.8byte	.LBE1617-.LBB1617
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1331e
+	.4byte	0x13399
 	.uleb128 0x54
-	.4byte	0x13312
+	.4byte	0x1338d
 	.uleb128 0x54
-	.4byte	0x13306
+	.4byte	0x13381
 	.uleb128 0x54
-	.4byte	0x132fb
+	.4byte	0x13376
 	.uleb128 0x56
-	.8byte	.LBB1614
-	.8byte	.LBE1614-.LBB1614
+	.8byte	.LBB1618
+	.8byte	.LBE1618-.LBB1618
 	.uleb128 0x57
-	.4byte	0x13329
+	.4byte	0x133a4
 	.uleb128 0x4e
-	.8byte	.LVL495
-	.4byte	0x13fc1
+	.8byte	.LVL499
+	.4byte	0x1403c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132b5
-	.8byte	.LBB1615
-	.8byte	.LBE1615-.LBB1615
+	.4byte	0x13330
+	.8byte	.LBB1619
+	.8byte	.LBE1619-.LBB1619
 	.byte	0x1
-	.2byte	0x5be
-	.4byte	0xf0d5
+	.2byte	0x5bc
+	.4byte	0xf0eb
 	.uleb128 0x54
-	.4byte	0x132dd
+	.4byte	0x13358
 	.uleb128 0x54
-	.4byte	0x132d1
+	.4byte	0x1334c
 	.uleb128 0x54
-	.4byte	0x132c6
+	.4byte	0x13341
 	.uleb128 0x5c
-	.4byte	0x132ea
-	.8byte	.LBB1616
-	.8byte	.LBE1616-.LBB1616
+	.4byte	0x13365
+	.8byte	.LBB1620
+	.8byte	.LBE1620-.LBB1620
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1331e
+	.4byte	0x13399
 	.uleb128 0x54
-	.4byte	0x13312
+	.4byte	0x1338d
 	.uleb128 0x54
-	.4byte	0x13306
+	.4byte	0x13381
 	.uleb128 0x54
-	.4byte	0x132fb
+	.4byte	0x13376
 	.uleb128 0x56
-	.8byte	.LBB1617
-	.8byte	.LBE1617-.LBB1617
+	.8byte	.LBB1621
+	.8byte	.LBE1621-.LBB1621
 	.uleb128 0x57
-	.4byte	0x13329
+	.4byte	0x133a4
 	.uleb128 0x4e
-	.8byte	.LVL496
-	.4byte	0x13fc1
+	.8byte	.LVL500
+	.4byte	0x1403c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132b5
-	.8byte	.LBB1618
-	.8byte	.LBE1618-.LBB1618
+	.4byte	0x13330
+	.8byte	.LBB1622
+	.8byte	.LBE1622-.LBB1622
 	.byte	0x1
-	.2byte	0x5c1
-	.4byte	0xf152
+	.2byte	0x5bf
+	.4byte	0xf168
 	.uleb128 0x54
-	.4byte	0x132dd
+	.4byte	0x13358
 	.uleb128 0x54
-	.4byte	0x132d1
+	.4byte	0x1334c
 	.uleb128 0x54
-	.4byte	0x132c6
+	.4byte	0x13341
 	.uleb128 0x5c
-	.4byte	0x132ea
-	.8byte	.LBB1619
-	.8byte	.LBE1619-.LBB1619
+	.4byte	0x13365
+	.8byte	.LBB1623
+	.8byte	.LBE1623-.LBB1623
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1331e
+	.4byte	0x13399
 	.uleb128 0x54
-	.4byte	0x13312
+	.4byte	0x1338d
 	.uleb128 0x54
-	.4byte	0x13306
+	.4byte	0x13381
 	.uleb128 0x54
-	.4byte	0x132fb
+	.4byte	0x13376
 	.uleb128 0x56
-	.8byte	.LBB1620
-	.8byte	.LBE1620-.LBB1620
+	.8byte	.LBB1624
+	.8byte	.LBE1624-.LBB1624
 	.uleb128 0x57
-	.4byte	0x13329
+	.4byte	0x133a4
 	.uleb128 0x4e
-	.8byte	.LVL497
-	.4byte	0x13fc1
+	.8byte	.LVL501
+	.4byte	0x1403c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132b5
-	.8byte	.LBB1621
-	.8byte	.LBE1621-.LBB1621
+	.4byte	0x13330
+	.8byte	.LBB1625
+	.8byte	.LBE1625-.LBB1625
 	.byte	0x1
-	.2byte	0x5c4
-	.4byte	0xf1cf
+	.2byte	0x5c2
+	.4byte	0xf1e5
 	.uleb128 0x54
-	.4byte	0x132dd
+	.4byte	0x13358
 	.uleb128 0x54
-	.4byte	0x132d1
+	.4byte	0x1334c
 	.uleb128 0x54
-	.4byte	0x132c6
+	.4byte	0x13341
 	.uleb128 0x5c
-	.4byte	0x132ea
-	.8byte	.LBB1622
-	.8byte	.LBE1622-.LBB1622
+	.4byte	0x13365
+	.8byte	.LBB1626
+	.8byte	.LBE1626-.LBB1626
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1331e
+	.4byte	0x13399
 	.uleb128 0x54
-	.4byte	0x13312
+	.4byte	0x1338d
 	.uleb128 0x54
-	.4byte	0x13306
+	.4byte	0x13381
 	.uleb128 0x54
-	.4byte	0x132fb
+	.4byte	0x13376
 	.uleb128 0x56
-	.8byte	.LBB1623
-	.8byte	.LBE1623-.LBB1623
+	.8byte	.LBB1627
+	.8byte	.LBE1627-.LBB1627
 	.uleb128 0x57
-	.4byte	0x13329
+	.4byte	0x133a4
 	.uleb128 0x4e
-	.8byte	.LVL498
-	.4byte	0x13fc1
+	.8byte	.LVL502
+	.4byte	0x1403c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x132b5
-	.8byte	.LBB1624
-	.4byte	.Ldebug_ranges0+0xc80
+	.4byte	0x13330
+	.8byte	.LBB1628
+	.4byte	.Ldebug_ranges0+0xce0
 	.byte	0x1
-	.2byte	0x5c7
-	.4byte	0xf245
+	.2byte	0x5c5
+	.4byte	0xf25b
 	.uleb128 0x54
-	.4byte	0x132dd
+	.4byte	0x13358
 	.uleb128 0x54
-	.4byte	0x132d1
+	.4byte	0x1334c
 	.uleb128 0x54
-	.4byte	0x132c6
+	.4byte	0x13341
 	.uleb128 0x5e
-	.4byte	0x132ea
-	.8byte	.LBB1625
-	.4byte	.Ldebug_ranges0+0xc80
+	.4byte	0x13365
+	.8byte	.LBB1629
+	.4byte	.Ldebug_ranges0+0xce0
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1331e
+	.4byte	0x13399
 	.uleb128 0x54
-	.4byte	0x13312
+	.4byte	0x1338d
 	.uleb128 0x54
-	.4byte	0x13306
+	.4byte	0x13381
 	.uleb128 0x54
-	.4byte	0x132fb
+	.4byte	0x13376
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xc80
+	.4byte	.Ldebug_ranges0+0xce0
 	.uleb128 0x57
-	.4byte	0x13329
+	.4byte	0x133a4
 	.uleb128 0x4e
-	.8byte	.LVL499
-	.4byte	0x13fc1
+	.8byte	.LVL503
+	.4byte	0x1403c
 	.uleb128 0x4e
-	.8byte	.LVL531
-	.4byte	0x13fc1
+	.8byte	.LVL535
+	.4byte	0x1403c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x132b5
-	.8byte	.LBB1631
-	.4byte	.Ldebug_ranges0+0xcc0
+	.4byte	0x13330
+	.8byte	.LBB1635
+	.4byte	.Ldebug_ranges0+0xd20
 	.byte	0x1
-	.2byte	0x5ca
-	.4byte	0xf2bb
+	.2byte	0x5c8
+	.4byte	0xf2d1
 	.uleb128 0x54
-	.4byte	0x132dd
+	.4byte	0x13358
 	.uleb128 0x54
-	.4byte	0x132d1
+	.4byte	0x1334c
 	.uleb128 0x54
-	.4byte	0x132c6
+	.4byte	0x13341
 	.uleb128 0x5e
-	.4byte	0x132ea
-	.8byte	.LBB1632
-	.4byte	.Ldebug_ranges0+0xcc0
+	.4byte	0x13365
+	.8byte	.LBB1636
+	.4byte	.Ldebug_ranges0+0xd20
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1331e
+	.4byte	0x13399
 	.uleb128 0x54
-	.4byte	0x13312
+	.4byte	0x1338d
 	.uleb128 0x54
-	.4byte	0x13306
+	.4byte	0x13381
 	.uleb128 0x54
-	.4byte	0x132fb
+	.4byte	0x13376
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xcc0
+	.4byte	.Ldebug_ranges0+0xd20
 	.uleb128 0x57
-	.4byte	0x13329
+	.4byte	0x133a4
 	.uleb128 0x4e
-	.8byte	.LVL500
-	.4byte	0x13fc1
+	.8byte	.LVL504
+	.4byte	0x1403c
 	.uleb128 0x4e
-	.8byte	.LVL530
-	.4byte	0x13fc1
+	.8byte	.LVL534
+	.4byte	0x1403c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x132b5
-	.8byte	.LBB1638
-	.4byte	.Ldebug_ranges0+0xd00
+	.4byte	0x13330
+	.8byte	.LBB1642
+	.4byte	.Ldebug_ranges0+0xd60
 	.byte	0x1
-	.2byte	0x5cd
-	.4byte	0xf331
+	.2byte	0x5cb
+	.4byte	0xf347
 	.uleb128 0x54
-	.4byte	0x132dd
+	.4byte	0x13358
 	.uleb128 0x54
-	.4byte	0x132d1
+	.4byte	0x1334c
 	.uleb128 0x54
-	.4byte	0x132c6
+	.4byte	0x13341
 	.uleb128 0x5e
-	.4byte	0x132ea
-	.8byte	.LBB1639
-	.4byte	.Ldebug_ranges0+0xd00
+	.4byte	0x13365
+	.8byte	.LBB1643
+	.4byte	.Ldebug_ranges0+0xd60
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1331e
+	.4byte	0x13399
 	.uleb128 0x54
-	.4byte	0x13312
+	.4byte	0x1338d
 	.uleb128 0x54
-	.4byte	0x13306
+	.4byte	0x13381
 	.uleb128 0x54
-	.4byte	0x132fb
+	.4byte	0x13376
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xd00
+	.4byte	.Ldebug_ranges0+0xd60
 	.uleb128 0x57
-	.4byte	0x13329
+	.4byte	0x133a4
 	.uleb128 0x4e
-	.8byte	.LVL501
-	.4byte	0x13fc1
+	.8byte	.LVL505
+	.4byte	0x1403c
 	.uleb128 0x4e
-	.8byte	.LVL529
-	.4byte	0x13fc1
+	.8byte	.LVL533
+	.4byte	0x1403c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x132b5
-	.8byte	.LBB1645
-	.4byte	.Ldebug_ranges0+0xd40
+	.4byte	0x13330
+	.8byte	.LBB1649
+	.4byte	.Ldebug_ranges0+0xda0
 	.byte	0x1
-	.2byte	0x5d0
+	.2byte	0x5ce
 	.uleb128 0x54
-	.4byte	0x132dd
+	.4byte	0x13358
 	.uleb128 0x54
-	.4byte	0x132d1
+	.4byte	0x1334c
 	.uleb128 0x54
-	.4byte	0x132c6
+	.4byte	0x13341
 	.uleb128 0x5e
-	.4byte	0x132ea
-	.8byte	.LBB1646
-	.4byte	.Ldebug_ranges0+0xd40
+	.4byte	0x13365
+	.8byte	.LBB1650
+	.4byte	.Ldebug_ranges0+0xda0
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x1331e
+	.4byte	0x13399
 	.uleb128 0x54
-	.4byte	0x13312
+	.4byte	0x1338d
 	.uleb128 0x54
-	.4byte	0x13306
+	.4byte	0x13381
 	.uleb128 0x54
-	.4byte	0x132fb
+	.4byte	0x13376
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xd40
+	.4byte	.Ldebug_ranges0+0xda0
 	.uleb128 0x57
-	.4byte	0x13329
+	.4byte	0x133a4
 	.uleb128 0x4e
-	.8byte	.LVL502
-	.4byte	0x13fc1
+	.8byte	.LVL506
+	.4byte	0x1403c
 	.uleb128 0x4e
-	.8byte	.LVL528
-	.4byte	0x13fc1
+	.8byte	.LVL532
+	.4byte	0x1403c
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0xfd6f
-	.8byte	.LBB1667
-	.4byte	.Ldebug_ranges0+0xd80
+	.4byte	0xfd92
+	.8byte	.LBB1671
+	.4byte	.Ldebug_ranges0+0xde0
 	.byte	0x1
-	.2byte	0x86f
-	.4byte	0xf552
+	.2byte	0x877
+	.4byte	0xf568
 	.uleb128 0x54
-	.4byte	0xfd80
+	.4byte	0xfda3
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xd80
+	.4byte	.Ldebug_ranges0+0xde0
 	.uleb128 0x5f
-	.4byte	0xfd8c
-	.4byte	.LLST144
+	.4byte	0xfdaf
+	.4byte	.LLST147
 	.uleb128 0x57
-	.4byte	0xfd98
+	.4byte	0xfdbb
 	.uleb128 0x57
-	.4byte	0xfda4
+	.4byte	0xfdc7
 	.uleb128 0x57
-	.4byte	0xfdb0
+	.4byte	0xfdd3
 	.uleb128 0x60
-	.4byte	0xfdbc
+	.4byte	0xfddf
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x57
-	.4byte	0xfdc6
+	.4byte	0xfde9
 	.uleb128 0x57
-	.4byte	0xfdd2
+	.4byte	0xfdf5
 	.uleb128 0x57
-	.4byte	0xfdde
+	.4byte	0xfe01
 	.uleb128 0x5a
-	.4byte	0x133c8
-	.8byte	.LBB1669
-	.4byte	.Ldebug_ranges0+0xdf0
+	.4byte	0x13443
+	.8byte	.LBB1673
+	.4byte	.Ldebug_ranges0+0xe50
 	.byte	0x1
-	.2byte	0x76d
-	.4byte	0xf415
+	.2byte	0x775
+	.4byte	0xf42b
 	.uleb128 0x54
-	.4byte	0x133d8
+	.4byte	0x13453
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13392
-	.8byte	.LBB1673
-	.4byte	.Ldebug_ranges0+0xe20
+	.4byte	0x1340d
+	.8byte	.LBB1677
+	.4byte	.Ldebug_ranges0+0xe80
 	.byte	0x1
-	.2byte	0x788
-	.4byte	0xf44a
+	.2byte	0x790
+	.4byte	0xf460
 	.uleb128 0x54
-	.4byte	0x133bb
+	.4byte	0x13436
 	.uleb128 0x54
-	.4byte	0x133af
+	.4byte	0x1342a
 	.uleb128 0x54
-	.4byte	0x133a3
+	.4byte	0x1341e
 	.uleb128 0x4e
-	.8byte	.LVL508
-	.4byte	0x13fb4
+	.8byte	.LVL512
+	.4byte	0x1402f
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13392
-	.8byte	.LBB1681
-	.8byte	.LBE1681-.LBB1681
+	.4byte	0x1340d
+	.8byte	.LBB1685
+	.8byte	.LBE1685-.LBB1685
 	.byte	0x1
-	.2byte	0x78b
-	.4byte	0xf483
+	.2byte	0x793
+	.4byte	0xf499
 	.uleb128 0x54
-	.4byte	0x133bb
+	.4byte	0x13436
 	.uleb128 0x54
-	.4byte	0x133af
+	.4byte	0x1342a
 	.uleb128 0x54
-	.4byte	0x133a3
+	.4byte	0x1341e
 	.uleb128 0x4e
-	.8byte	.LVL509
-	.4byte	0x13fb4
+	.8byte	.LVL513
+	.4byte	0x1402f
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13392
-	.8byte	.LBB1683
-	.8byte	.LBE1683-.LBB1683
+	.4byte	0x1340d
+	.8byte	.LBB1687
+	.8byte	.LBE1687-.LBB1687
 	.byte	0x1
-	.2byte	0x78e
-	.4byte	0xf4bc
+	.2byte	0x796
+	.4byte	0xf4d2
 	.uleb128 0x54
-	.4byte	0x133bb
+	.4byte	0x13436
 	.uleb128 0x54
-	.4byte	0x133af
+	.4byte	0x1342a
 	.uleb128 0x54
-	.4byte	0x133a3
+	.4byte	0x1341e
 	.uleb128 0x4e
-	.8byte	.LVL510
-	.4byte	0x13fb4
+	.8byte	.LVL514
+	.4byte	0x1402f
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13392
-	.8byte	.LBB1685
-	.8byte	.LBE1685-.LBB1685
+	.4byte	0x1340d
+	.8byte	.LBB1689
+	.8byte	.LBE1689-.LBB1689
 	.byte	0x1
-	.2byte	0x796
-	.4byte	0xf4f5
+	.2byte	0x79e
+	.4byte	0xf50b
 	.uleb128 0x54
-	.4byte	0x133bb
+	.4byte	0x13436
 	.uleb128 0x54
-	.4byte	0x133af
+	.4byte	0x1342a
 	.uleb128 0x54
-	.4byte	0x133a3
+	.4byte	0x1341e
 	.uleb128 0x4e
-	.8byte	.LVL511
-	.4byte	0x13fb4
+	.8byte	.LVL515
+	.4byte	0x1402f
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL504
-	.4byte	0x13fce
+	.8byte	.LVL508
+	.4byte	0x14049
 	.uleb128 0x4e
-	.8byte	.LVL505
-	.4byte	0x13fdb
+	.8byte	.LVL509
+	.4byte	0x14056
 	.uleb128 0x4e
-	.8byte	.LVL506
-	.4byte	0x13fe7
+	.8byte	.LVL510
+	.4byte	0x14062
 	.uleb128 0x4e
-	.8byte	.LVL507
-	.4byte	0x13ff3
+	.8byte	.LVL511
+	.4byte	0x1406e
 	.uleb128 0x4e
-	.8byte	.LVL512
-	.4byte	0x13fff
+	.8byte	.LVL516
+	.4byte	0x1407a
 	.uleb128 0x4e
-	.8byte	.LVL513
-	.4byte	0x14009
+	.8byte	.LVL517
+	.4byte	0x14084
 	.uleb128 0x4e
-	.8byte	.LVL525
-	.4byte	0x14015
+	.8byte	.LVL529
+	.4byte	0x14090
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0xfde9
-	.8byte	.LBB1694
-	.4byte	.Ldebug_ranges0+0xe70
+	.4byte	0xfe0c
+	.8byte	.LBB1698
+	.4byte	.Ldebug_ranges0+0xed0
 	.byte	0x1
-	.2byte	0x876
-	.4byte	0xf634
+	.2byte	0x87e
+	.4byte	0xf64a
 	.uleb128 0x54
-	.4byte	0xfdfa
+	.4byte	0xfe1d
 	.uleb128 0x54
-	.4byte	0xfdfa
+	.4byte	0xfe1d
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xe70
+	.4byte	.Ldebug_ranges0+0xed0
 	.uleb128 0x57
-	.4byte	0xfe06
+	.4byte	0xfe29
 	.uleb128 0x5f
-	.4byte	0xfe12
-	.4byte	.LLST145
+	.4byte	0xfe35
+	.4byte	.LLST148
 	.uleb128 0x57
-	.4byte	0xfe1e
+	.4byte	0xfe41
 	.uleb128 0x60
-	.4byte	0xfe2a
+	.4byte	0xfe4d
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5f
-	.4byte	0xfe34
-	.4byte	.LLST146
+	.4byte	0xfe57
+	.4byte	.LLST149
 	.uleb128 0x57
-	.4byte	0xfe40
+	.4byte	0xfe63
 	.uleb128 0x57
-	.4byte	0xfe4c
+	.4byte	0xfe6f
 	.uleb128 0x53
-	.4byte	0x133c8
-	.8byte	.LBB1696
-	.8byte	.LBE1696-.LBB1696
+	.4byte	0x13443
+	.8byte	.LBB1700
+	.8byte	.LBE1700-.LBB1700
 	.byte	0x1
-	.2byte	0x740
-	.4byte	0xf5ca
+	.2byte	0x748
+	.4byte	0xf5e0
 	.uleb128 0x54
-	.4byte	0x133d8
+	.4byte	0x13453
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL515
-	.4byte	0x13fce
+	.8byte	.LVL519
+	.4byte	0x14049
 	.uleb128 0x4e
-	.8byte	.LVL516
-	.4byte	0x13fdb
+	.8byte	.LVL520
+	.4byte	0x14056
 	.uleb128 0x4e
-	.8byte	.LVL534
-	.4byte	0x13fe7
+	.8byte	.LVL538
+	.4byte	0x14062
 	.uleb128 0x4e
-	.8byte	.LVL535
-	.4byte	0x14022
+	.8byte	.LVL539
+	.4byte	0x1409d
 	.uleb128 0x4e
-	.8byte	.LVL615
-	.4byte	0x14015
+	.8byte	.LVL620
+	.4byte	0x14090
 	.uleb128 0x4e
-	.8byte	.LVL616
-	.4byte	0x1402e
+	.8byte	.LVL621
+	.4byte	0x140a9
 	.uleb128 0x4e
-	.8byte	.LVL617
-	.4byte	0x14015
+	.8byte	.LVL622
+	.4byte	0x14090
 	.uleb128 0x4e
-	.8byte	.LVL636
-	.4byte	0x14015
+	.8byte	.LVL641
+	.4byte	0x14090
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0xfd37
-	.8byte	.LBB1705
-	.4byte	.Ldebug_ranges0+0xed0
+	.4byte	0xfd5a
+	.8byte	.LBB1709
+	.4byte	.Ldebug_ranges0+0xf30
 	.byte	0x1
-	.2byte	0x87d
-	.4byte	0xf7c1
+	.2byte	0x885
+	.4byte	0xf7d7
 	.uleb128 0x54
-	.4byte	0xfd48
+	.4byte	0xfd6b
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xed0
+	.4byte	.Ldebug_ranges0+0xf30
 	.uleb128 0x60
-	.4byte	0xfd54
+	.4byte	0xfd77
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5a
-	.4byte	0x1359e
-	.8byte	.LBB1707
-	.4byte	.Ldebug_ranges0+0xf10
+	.4byte	0x13619
+	.8byte	.LBB1711
+	.4byte	.Ldebug_ranges0+0xf70
 	.byte	0x1
-	.2byte	0x7a3
-	.4byte	0xf6bb
+	.2byte	0x7ab
+	.4byte	0xf6d1
 	.uleb128 0x54
-	.4byte	0x135aa
+	.4byte	0x13625
 	.uleb128 0x56
-	.8byte	.LBB1709
-	.8byte	.LBE1709-.LBB1709
+	.8byte	.LBB1713
+	.8byte	.LBE1713-.LBB1713
 	.uleb128 0x57
-	.4byte	0x135d5
+	.4byte	0x13650
 	.uleb128 0x5b
-	.4byte	0x13722
-	.8byte	.LBB1710
-	.8byte	.LBE1710-.LBB1710
+	.4byte	0x1379d
+	.8byte	.LBB1714
+	.8byte	.LBE1714-.LBB1714
 	.byte	0x10
 	.byte	0x1c
 	.uleb128 0x54
-	.4byte	0x13745
+	.4byte	0x137c0
 	.uleb128 0x54
-	.4byte	0x13739
+	.4byte	0x137b4
 	.uleb128 0x54
-	.4byte	0x1372f
+	.4byte	0x137aa
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13664
-	.8byte	.LBB1714
-	.8byte	.LBE1714-.LBB1714
+	.4byte	0x136df
+	.8byte	.LBB1718
+	.8byte	.LBE1718-.LBB1718
 	.byte	0x1
-	.2byte	0x7ab
-	.4byte	0xf706
+	.2byte	0x7b3
+	.4byte	0xf71c
 	.uleb128 0x54
-	.4byte	0x13679
+	.4byte	0x136f4
 	.uleb128 0x54
-	.4byte	0x13670
+	.4byte	0x136eb
 	.uleb128 0x56
-	.8byte	.LBB1715
-	.8byte	.LBE1715-.LBB1715
+	.8byte	.LBB1719
+	.8byte	.LBE1719-.LBB1719
 	.uleb128 0x5f
-	.4byte	0x13682
-	.4byte	.LLST147
+	.4byte	0x136fd
+	.4byte	.LLST150
 	.uleb128 0x5f
-	.4byte	0x1368c
-	.4byte	.LLST148
+	.4byte	0x13707
+	.4byte	.LLST151
 	.byte	0
 	.byte	0
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xf40
-	.4byte	0xf733
+	.4byte	.Ldebug_ranges0+0xfa0
+	.4byte	0xf749
 	.uleb128 0x5f
-	.4byte	0xfd61
-	.4byte	.LLST149
+	.4byte	0xfd84
+	.4byte	.LLST152
 	.uleb128 0x4e
-	.8byte	.LVL542
-	.4byte	0x1403a
+	.8byte	.LVL546
+	.4byte	0x140b5
 	.uleb128 0x4e
-	.8byte	.LVL544
-	.4byte	0x14046
+	.8byte	.LVL548
+	.4byte	0x140c1
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13664
-	.8byte	.LBB1718
-	.8byte	.LBE1718-.LBB1718
+	.4byte	0x136df
+	.8byte	.LBB1722
+	.8byte	.LBE1722-.LBB1722
 	.byte	0x1
-	.2byte	0x7b4
-	.4byte	0xf77e
+	.2byte	0x7bc
+	.4byte	0xf794
 	.uleb128 0x54
-	.4byte	0x13679
+	.4byte	0x136f4
 	.uleb128 0x54
-	.4byte	0x13670
+	.4byte	0x136eb
 	.uleb128 0x56
-	.8byte	.LBB1719
-	.8byte	.LBE1719-.LBB1719
+	.8byte	.LBB1723
+	.8byte	.LBE1723-.LBB1723
 	.uleb128 0x5f
-	.4byte	0x13682
-	.4byte	.LLST150
+	.4byte	0x136fd
+	.4byte	.LLST153
 	.uleb128 0x5f
-	.4byte	0x1368c
-	.4byte	.LLST151
+	.4byte	0x13707
+	.4byte	.LLST154
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL536
-	.4byte	0x1403a
+	.8byte	.LVL540
+	.4byte	0x140b5
 	.uleb128 0x4e
-	.8byte	.LVL537
-	.4byte	0x14053
+	.8byte	.LVL541
+	.4byte	0x140ce
 	.uleb128 0x4e
-	.8byte	.LVL545
-	.4byte	0x14053
+	.8byte	.LVL549
+	.4byte	0x140ce
 	.uleb128 0x4e
-	.8byte	.LVL620
-	.4byte	0x14015
+	.8byte	.LVL625
+	.4byte	0x14090
 	.uleb128 0x4e
-	.8byte	.LVL624
-	.4byte	0x14015
+	.8byte	.LVL629
+	.4byte	0x14090
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0xfd1d
-	.8byte	.LBB1722
-	.8byte	.LBE1722-.LBB1722
+	.4byte	0xfd40
+	.8byte	.LBB1726
+	.8byte	.LBE1726-.LBB1726
 	.byte	0x1
-	.2byte	0x884
-	.4byte	0xf85b
+	.2byte	0x88c
+	.4byte	0xf871
 	.uleb128 0x54
-	.4byte	0xfd2a
+	.4byte	0xfd4d
 	.uleb128 0x5a
-	.4byte	0x12ffb
-	.8byte	.LBB1724
-	.4byte	.Ldebug_ranges0+0xf70
+	.4byte	0x13076
+	.8byte	.LBB1728
+	.4byte	.Ldebug_ranges0+0xfd0
 	.byte	0x1
-	.2byte	0x7c4
-	.4byte	0xf826
+	.2byte	0x7cc
+	.4byte	0xf83c
 	.uleb128 0x54
-	.4byte	0x1301d
+	.4byte	0x13098
 	.uleb128 0x54
-	.4byte	0x13012
+	.4byte	0x1308d
 	.uleb128 0x54
-	.4byte	0x13007
+	.4byte	0x13082
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xf70
+	.4byte	.Ldebug_ranges0+0xfd0
 	.uleb128 0x5f
-	.4byte	0x13028
-	.4byte	.LLST152
+	.4byte	0x130a3
+	.4byte	.LLST155
 	.uleb128 0x4e
-	.8byte	.LVL552
-	.4byte	0x14060
+	.8byte	.LVL556
+	.4byte	0x140db
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL553
-	.4byte	0x1406c
+	.8byte	.LVL557
+	.4byte	0x140e7
 	.uleb128 0x4e
-	.8byte	.LVL554
-	.4byte	0x14078
+	.8byte	.LVL558
+	.4byte	0x140f3
 	.uleb128 0x4e
-	.8byte	.LVL555
-	.4byte	0x1406c
+	.8byte	.LVL559
+	.4byte	0x140e7
 	.uleb128 0x4e
-	.8byte	.LVL556
-	.4byte	0x14078
+	.8byte	.LVL560
+	.4byte	0x140f3
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0xfc7b
-	.8byte	.LBB1734
-	.4byte	.Ldebug_ranges0+0xfd0
+	.4byte	0xfc9e
+	.8byte	.LBB1738
+	.4byte	.Ldebug_ranges0+0x1030
 	.byte	0x1
-	.2byte	0x887
-	.4byte	0xfafe
+	.2byte	0x88f
+	.4byte	0xfb14
 	.uleb128 0x54
-	.4byte	0xfc98
+	.4byte	0xfcbb
 	.uleb128 0x54
-	.4byte	0xfc8c
+	.4byte	0xfcaf
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xfd0
+	.4byte	.Ldebug_ranges0+0x1030
 	.uleb128 0x57
-	.4byte	0xfca4
-	.uleb128 0x5f
-	.4byte	0xfcb0
-	.4byte	.LLST153
-	.uleb128 0x5f
-	.4byte	0xfcbc
-	.4byte	.LLST154
-	.uleb128 0x5f
-	.4byte	0xfcc8
-	.4byte	.LLST155
+	.4byte	0xfcc7
 	.uleb128 0x5f
-	.4byte	0xfcd4
+	.4byte	0xfcd3
 	.4byte	.LLST156
 	.uleb128 0x5f
-	.4byte	0xfce0
+	.4byte	0xfcdf
 	.4byte	.LLST157
 	.uleb128 0x5f
-	.4byte	0xfcec
+	.4byte	0xfceb
 	.4byte	.LLST158
-	.uleb128 0x57
-	.4byte	0xfcf8
 	.uleb128 0x5f
-	.4byte	0xfd04
+	.4byte	0xfcf7
 	.4byte	.LLST159
 	.uleb128 0x5f
-	.4byte	0xfd10
+	.4byte	0xfd03
 	.4byte	.LLST160
+	.uleb128 0x5f
+	.4byte	0xfd0f
+	.4byte	.LLST161
+	.uleb128 0x57
+	.4byte	0xfd1b
+	.uleb128 0x5f
+	.4byte	0xfd27
+	.4byte	.LLST162
+	.uleb128 0x5f
+	.4byte	0xfd33
+	.4byte	.LLST163
 	.uleb128 0x53
-	.4byte	0x11670
-	.8byte	.LBB1736
-	.8byte	.LBE1736-.LBB1736
+	.4byte	0x116f3
+	.8byte	.LBB1740
+	.8byte	.LBE1740-.LBB1740
 	.byte	0x1
-	.2byte	0x7fc
-	.4byte	0xf93d
+	.2byte	0x804
+	.4byte	0xf953
 	.uleb128 0x54
-	.4byte	0x11681
+	.4byte	0x11704
 	.uleb128 0x54
-	.4byte	0x11681
+	.4byte	0x11704
 	.uleb128 0x56
-	.8byte	.LBB1737
-	.8byte	.LBE1737-.LBB1737
+	.8byte	.LBB1741
+	.8byte	.LBE1741-.LBB1741
 	.uleb128 0x5f
-	.4byte	0x1168d
-	.4byte	.LLST161
+	.4byte	0x11710
+	.4byte	.LLST164
 	.uleb128 0x4e
-	.8byte	.LVL573
-	.4byte	0x14084
+	.8byte	.LVL577
+	.4byte	0x140ff
 	.uleb128 0x4e
-	.8byte	.LVL575
-	.4byte	0x14009
+	.8byte	.LVL579
+	.4byte	0x14084
 	.uleb128 0x4e
-	.8byte	.LVL576
-	.4byte	0x14090
+	.8byte	.LVL580
+	.4byte	0x1410b
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13178
-	.8byte	.LBB1738
-	.8byte	.LBE1738-.LBB1738
+	.4byte	0x131f3
+	.8byte	.LBB1742
+	.8byte	.LBE1742-.LBB1742
 	.byte	0x1
-	.2byte	0x7e2
-	.4byte	0xf994
+	.2byte	0x7ea
+	.4byte	0xf9aa
 	.uleb128 0x54
-	.4byte	0x13195
+	.4byte	0x13210
 	.uleb128 0x54
-	.4byte	0x13189
+	.4byte	0x13204
 	.uleb128 0x5c
-	.4byte	0x131a2
-	.8byte	.LBB1739
-	.8byte	.LBE1739-.LBB1739
+	.4byte	0x1321d
+	.8byte	.LBB1743
+	.8byte	.LBE1743-.LBB1743
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x131bf
+	.4byte	0x1323a
 	.uleb128 0x54
-	.4byte	0x131b3
+	.4byte	0x1322e
 	.uleb128 0x4e
-	.8byte	.LVL589
-	.4byte	0x1409c
+	.8byte	.LVL594
+	.4byte	0x14117
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13178
-	.8byte	.LBB1741
-	.8byte	.LBE1741-.LBB1741
+	.4byte	0x131f3
+	.8byte	.LBB1745
+	.8byte	.LBE1745-.LBB1745
 	.byte	0x1
-	.2byte	0x7f0
-	.4byte	0xf9eb
+	.2byte	0x7f8
+	.4byte	0xfa01
 	.uleb128 0x54
-	.4byte	0x13195
+	.4byte	0x13210
 	.uleb128 0x54
-	.4byte	0x13189
+	.4byte	0x13204
 	.uleb128 0x5c
-	.4byte	0x131a2
-	.8byte	.LBB1742
-	.8byte	.LBE1742-.LBB1742
+	.4byte	0x1321d
+	.8byte	.LBB1746
+	.8byte	.LBE1746-.LBB1746
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x131bf
+	.4byte	0x1323a
 	.uleb128 0x54
-	.4byte	0x131b3
+	.4byte	0x1322e
 	.uleb128 0x4e
-	.8byte	.LVL604
-	.4byte	0x1409c
+	.8byte	.LVL609
+	.4byte	0x14117
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL558
-	.4byte	0x140a9
-	.uleb128 0x4e
-	.8byte	.LVL560
-	.4byte	0x140a9
-	.uleb128 0x4e
 	.8byte	.LVL562
-	.4byte	0x140b5
+	.4byte	0x14124
 	.uleb128 0x4e
-	.8byte	.LVL567
-	.4byte	0x140b5
+	.8byte	.LVL564
+	.4byte	0x14124
+	.uleb128 0x4e
+	.8byte	.LVL566
+	.4byte	0x14130
 	.uleb128 0x4e
 	.8byte	.LVL571
-	.4byte	0x13f9b
+	.4byte	0x14130
 	.uleb128 0x4e
-	.8byte	.LVL572
-	.4byte	0x140c2
+	.8byte	.LVL575
+	.4byte	0x14016
 	.uleb128 0x4e
-	.8byte	.LVL577
-	.4byte	0x140ce
+	.8byte	.LVL576
+	.4byte	0x1413d
 	.uleb128 0x4e
-	.8byte	.LVL578
-	.4byte	0x140ce
+	.8byte	.LVL581
+	.4byte	0x14149
 	.uleb128 0x4e
-	.8byte	.LVL588
-	.4byte	0x13f9b
+	.8byte	.LVL582
+	.4byte	0x14149
 	.uleb128 0x4e
 	.8byte	.LVL593
-	.4byte	0x140da
-	.uleb128 0x4e
-	.8byte	.LVL596
-	.4byte	0x14084
+	.4byte	0x14016
 	.uleb128 0x4e
 	.8byte	.LVL598
-	.4byte	0x140da
-	.uleb128 0x4e
-	.8byte	.LVL599
-	.4byte	0x14090
+	.4byte	0x14155
 	.uleb128 0x4e
 	.8byte	.LVL601
-	.4byte	0x140e4
+	.4byte	0x140ff
 	.uleb128 0x4e
 	.8byte	.LVL603
-	.4byte	0x13f9b
+	.4byte	0x14155
 	.uleb128 0x4e
-	.8byte	.LVL607
-	.4byte	0x140da
+	.8byte	.LVL604
+	.4byte	0x1410b
 	.uleb128 0x4e
-	.8byte	.LVL610
-	.4byte	0x14084
+	.8byte	.LVL606
+	.4byte	0x1415f
+	.uleb128 0x4e
+	.8byte	.LVL608
+	.4byte	0x14016
 	.uleb128 0x4e
 	.8byte	.LVL612
-	.4byte	0x140da
+	.4byte	0x14155
 	.uleb128 0x4e
-	.8byte	.LVL613
-	.4byte	0x14090
+	.8byte	.LVL615
+	.4byte	0x140ff
 	.uleb128 0x4e
-	.8byte	.LVL640
-	.4byte	0x14015
+	.8byte	.LVL617
+	.4byte	0x14155
 	.uleb128 0x4e
-	.8byte	.LVL643
-	.4byte	0x14015
+	.8byte	.LVL618
+	.4byte	0x1410b
+	.uleb128 0x4e
+	.8byte	.LVL645
+	.4byte	0x14090
+	.uleb128 0x4e
+	.8byte	.LVL648
+	.4byte	0x14090
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1324c
-	.8byte	.LBB1747
-	.8byte	.LBE1747-.LBB1747
+	.4byte	0x132c7
+	.8byte	.LBB1751
+	.8byte	.LBE1751-.LBB1751
 	.byte	0x1
-	.2byte	0x889
-	.4byte	0xfb47
+	.2byte	0x891
+	.4byte	0xfb5d
 	.uleb128 0x54
-	.4byte	0x13263
+	.4byte	0x132de
 	.uleb128 0x54
-	.4byte	0x13258
+	.4byte	0x132d3
 	.uleb128 0x5b
-	.4byte	0x1334e
-	.8byte	.LBB1748
-	.8byte	.LBE1748-.LBB1748
+	.4byte	0x133c9
+	.8byte	.LBB1752
+	.8byte	.LBE1752-.LBB1752
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x54
-	.4byte	0x13367
+	.4byte	0x133e2
 	.uleb128 0x54
-	.4byte	0x1335b
+	.4byte	0x133d6
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0xfe6f
-	.8byte	.LBB1750
-	.8byte	.LBE1750-.LBB1750
+	.4byte	0xfe92
+	.8byte	.LBB1754
+	.8byte	.LBE1754-.LBB1754
 	.byte	0x1
-	.2byte	0x88c
-	.4byte	0xfbc4
+	.2byte	0x894
+	.4byte	0xfbe7
 	.uleb128 0x54
-	.4byte	0xfe80
-	.uleb128 0x4e
-	.8byte	.LVL579
-	.4byte	0x140f0
-	.uleb128 0x4e
-	.8byte	.LVL580
-	.4byte	0x140fc
-	.uleb128 0x4e
-	.8byte	.LVL581
-	.4byte	0x140fc
-	.uleb128 0x4e
-	.8byte	.LVL582
-	.4byte	0x140fc
+	.4byte	0xfea3
 	.uleb128 0x4e
 	.8byte	.LVL583
-	.4byte	0x140fc
+	.4byte	0x1416b
 	.uleb128 0x4e
 	.8byte	.LVL584
-	.4byte	0x140fc
+	.4byte	0x14177
 	.uleb128 0x4e
 	.8byte	.LVL585
-	.4byte	0x140fc
-	.byte	0
+	.4byte	0x14177
 	.uleb128 0x4e
-	.8byte	.LVL476
-	.4byte	0x13fce
+	.8byte	.LVL586
+	.4byte	0x14177
 	.uleb128 0x4e
-	.8byte	.LVL477
-	.4byte	0x14109
+	.8byte	.LVL587
+	.4byte	0x14177
 	.uleb128 0x4e
-	.8byte	.LVL479
-	.4byte	0x13fce
+	.8byte	.LVL588
+	.4byte	0x14177
+	.uleb128 0x4e
+	.8byte	.LVL589
+	.4byte	0x14177
+	.uleb128 0x4e
+	.8byte	.LVL590
+	.4byte	0x14177
+	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL480
-	.4byte	0x14115
+	.4byte	0x14049
 	.uleb128 0x4e
-	.8byte	.LVL517
-	.4byte	0x14015
+	.8byte	.LVL481
+	.4byte	0x14184
 	.uleb128 0x4e
-	.8byte	.LVL519
-	.4byte	0x14015
+	.8byte	.LVL483
+	.4byte	0x14049
 	.uleb128 0x4e
-	.8byte	.LVL526
-	.4byte	0x14015
+	.8byte	.LVL484
+	.4byte	0x14190
 	.uleb128 0x4e
-	.8byte	.LVL586
-	.4byte	0x13f9b
+	.8byte	.LVL521
+	.4byte	0x14090
 	.uleb128 0x4e
-	.8byte	.LVL621
-	.4byte	0x14015
+	.8byte	.LVL523
+	.4byte	0x14090
 	.uleb128 0x4e
-	.8byte	.LVL628
-	.4byte	0x14015
+	.8byte	.LVL530
+	.4byte	0x14090
 	.uleb128 0x4e
-	.8byte	.LVL629
-	.4byte	0x14015
+	.8byte	.LVL591
+	.4byte	0x14016
 	.uleb128 0x4e
-	.8byte	.LVL630
-	.4byte	0x14015
+	.8byte	.LVL626
+	.4byte	0x14090
+	.uleb128 0x4e
+	.8byte	.LVL633
+	.4byte	0x14090
 	.uleb128 0x4e
 	.8byte	.LVL634
-	.4byte	0x14015
+	.4byte	0x14090
 	.uleb128 0x4e
-	.8byte	.LVL638
-	.4byte	0x14122
+	.8byte	.LVL635
+	.4byte	0x14090
+	.uleb128 0x4e
+	.8byte	.LVL639
+	.4byte	0x14090
+	.uleb128 0x4e
+	.8byte	.LVL643
+	.4byte	0x1419d
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3039
+	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0x7d0
+	.2byte	0x7d8
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfd1d
+	.4byte	0xfd40
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x7d0
+	.2byte	0x7d8
 	.4byte	0xe47d
 	.uleb128 0x64
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x7d0
+	.2byte	0x7d8
 	.4byte	0xe13f
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x7d2
-	.4byte	0xe72c
-	.uleb128 0x46
-	.4byte	.LASF3031
-	.byte	0x1
-	.2byte	0x7d3
-	.4byte	0x6d
+	.2byte	0x7da
+	.4byte	0xe742
 	.uleb128 0x46
 	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0x7d4
+	.2byte	0x7db
 	.4byte	0x6d
 	.uleb128 0x46
 	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0x7d5
-	.4byte	0xc6
+	.2byte	0x7dc
+	.4byte	0x6d
 	.uleb128 0x46
 	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0x7d6
+	.2byte	0x7dd
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0x7d7
-	.4byte	0x219
+	.2byte	0x7de
+	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0x7d8
+	.2byte	0x7df
+	.4byte	0x219
+	.uleb128 0x46
+	.4byte	.LASF3037
+	.byte	0x1
+	.2byte	0x7e0
 	.4byte	0x219
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7d9
+	.2byte	0x7e1
 	.4byte	0xe418
 	.uleb128 0x46
-	.4byte	.LASF3037
+	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0x7da
+	.2byte	0x7e2
 	.4byte	0x443
 	.uleb128 0x46
-	.4byte	.LASF3038
+	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0x7db
+	.2byte	0x7e3
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3093
+	.4byte	.LASF3095
 	.byte	0x1
-	.2byte	0x7b9
+	.2byte	0x7c1
 	.byte	0x1
-	.4byte	0xfd37
+	.4byte	0xfd5a
 	.uleb128 0x64
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x7b9
-	.4byte	0xe72c
+	.2byte	0x7c1
+	.4byte	0xe742
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3040
+	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0x79f
+	.2byte	0x7a7
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfd6f
+	.4byte	0xfd92
 	.uleb128 0x64
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x79f
-	.4byte	0xe72c
+	.2byte	0x7a7
+	.4byte	0xe742
 	.uleb128 0x46
 	.4byte	.LASF2465
 	.byte	0x1
-	.2byte	0x7a1
+	.2byte	0x7a9
 	.4byte	0xd7ff
 	.uleb128 0x66
 	.uleb128 0x52
 	.string	"__k"
 	.byte	0x1
-	.2byte	0x7ae
+	.2byte	0x7b6
 	.4byte	0x2ef0
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3041
+	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0x756
+	.2byte	0x75e
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfde9
+	.4byte	0xfe0c
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x756
+	.2byte	0x75e
 	.4byte	0xe47d
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x758
+	.2byte	0x760
 	.4byte	0xa55b
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x759
+	.2byte	0x761
 	.4byte	0xe13f
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x75a
-	.4byte	0xe72c
+	.2byte	0x762
+	.4byte	0xe742
 	.uleb128 0x46
-	.4byte	.LASF3042
+	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0x75b
+	.2byte	0x763
 	.4byte	0xb87f
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x75c
+	.2byte	0x764
 	.4byte	0x9737
 	.uleb128 0x46
-	.4byte	.LASF3043
+	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0x75d
+	.2byte	0x765
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x75e
+	.2byte	0x766
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x75e
+	.2byte	0x766
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3044
+	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0x72d
+	.2byte	0x735
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe5a
+	.4byte	0xfe7d
 	.uleb128 0x64
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x72d
-	.4byte	0xe72c
+	.2byte	0x735
+	.4byte	0xe742
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x72f
+	.2byte	0x737
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x730
+	.2byte	0x738
 	.4byte	0xa55b
 	.uleb128 0x46
-	.4byte	.LASF3042
+	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0x731
+	.2byte	0x739
 	.4byte	0xb87f
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x732
+	.2byte	0x73a
 	.4byte	0x9737
 	.uleb128 0x46
-	.4byte	.LASF3045
+	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0x733
+	.2byte	0x73b
 	.4byte	0x29
 	.uleb128 0x46
-	.4byte	.LASF3046
+	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0x734
+	.2byte	0x73c
 	.4byte	0xc6
 	.uleb128 0x67
-	.4byte	.LASF3023
-	.4byte	0xfe6a
-	.4byte	.LASF3044
+	.4byte	.LASF3024
+	.4byte	0xfe8d
+	.4byte	.LASF3045
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xfe6a
+	.4byte	0xfe8d
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x12
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xfe5a
+	.4byte	0xfe7d
 	.uleb128 0x62
-	.4byte	.LASF3047
+	.4byte	.LASF3048
 	.byte	0x1
-	.2byte	0x71f
+	.2byte	0x726
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe8d
+	.4byte	0xfeb0
 	.uleb128 0x64
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x71f
-	.4byte	0xe72c
+	.2byte	0x726
+	.4byte	0xe742
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3048
+	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0x716
+	.2byte	0x71d
 	.4byte	0x2d9
-	.8byte	.LFB2839
-	.8byte	.LFE2839-.LFB2839
+	.8byte	.LFB2840
+	.8byte	.LFE2840-.LFB2840
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfeed
+	.4byte	0xff10
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x716
+	.2byte	0x71d
 	.4byte	0xa55b
 	.4byte	.LLST71
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x717
+	.2byte	0x71e
 	.4byte	0xb3d6
 	.4byte	.LLST72
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x718
+	.2byte	0x71f
 	.4byte	0x219
 	.4byte	.LLST73
 	.uleb128 0x4e
-	.8byte	.LVL272
-	.4byte	0x1412c
+	.8byte	.LVL270
+	.4byte	0x141a7
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3049
+	.4byte	.LASF3050
 	.byte	0x1
-	.2byte	0x70d
+	.2byte	0x714
 	.4byte	0x2d9
-	.8byte	.LFB2838
-	.8byte	.LFE2838-.LFB2838
+	.8byte	.LFB2839
+	.8byte	.LFE2839-.LFB2839
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xff4d
+	.4byte	0xff70
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x70d
+	.2byte	0x714
 	.4byte	0xa55b
 	.4byte	.LLST74
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x70e
+	.2byte	0x715
 	.4byte	0xb3d6
 	.4byte	.LLST75
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x70f
+	.2byte	0x716
 	.4byte	0x219
 	.4byte	.LLST76
 	.uleb128 0x4e
-	.8byte	.LVL277
-	.4byte	0x1412c
+	.8byte	.LVL275
+	.4byte	0x141b3
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3050
+	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0x6f5
+	.2byte	0x70b
+	.4byte	0x2d9
+	.8byte	.LFB2838
+	.8byte	.LFE2838-.LFB2838
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0xffd0
+	.uleb128 0x58
+	.4byte	.LASF2199
+	.byte	0x1
+	.2byte	0x70b
+	.4byte	0xa55b
+	.4byte	.LLST77
+	.uleb128 0x58
+	.4byte	.LASF2114
+	.byte	0x1
+	.2byte	0x70c
+	.4byte	0xb3d6
+	.4byte	.LLST78
+	.uleb128 0x51
+	.string	"buf"
+	.byte	0x1
+	.2byte	0x70d
+	.4byte	0x219
+	.4byte	.LLST79
+	.uleb128 0x4e
+	.8byte	.LVL280
+	.4byte	0x141b3
+	.byte	0
+	.uleb128 0x4f
+	.4byte	.LASF3052
+	.byte	0x1
+	.2byte	0x6f3
 	.4byte	0x2d9
 	.8byte	.LFB2837
 	.8byte	.LFE2837-.LFB2837
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1001d
+	.4byte	0x100a0
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x6f5
+	.2byte	0x6f3
 	.4byte	0xa55b
-	.4byte	.LLST86
+	.4byte	.LLST89
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x6f6
+	.2byte	0x6f4
 	.4byte	0xb3d6
-	.4byte	.LLST87
+	.4byte	.LLST90
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6f7
+	.2byte	0x6f5
 	.4byte	0x56
-	.4byte	.LLST88
+	.4byte	.LLST91
 	.uleb128 0x58
 	.4byte	.LASF382
 	.byte	0x1
-	.2byte	0x6f7
+	.2byte	0x6f5
 	.4byte	0x2ce
-	.4byte	.LLST89
+	.4byte	.LLST92
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x6f9
+	.2byte	0x6f7
 	.4byte	0xe47d
-	.4byte	.LLST90
+	.4byte	.LLST93
 	.uleb128 0x59
 	.4byte	.LASF2455
 	.byte	0x1
-	.2byte	0x6fa
+	.2byte	0x6f8
 	.4byte	0xc6
-	.4byte	.LLST91
+	.4byte	.LLST94
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x6fa
+	.2byte	0x6f8
 	.4byte	0xc6
 	.uleb128 0x4e
-	.8byte	.LVL303
-	.4byte	0x14139
-	.uleb128 0x4e
-	.8byte	.LVL305
-	.4byte	0x14146
+	.8byte	.LVL306
+	.4byte	0x141c0
 	.uleb128 0x4e
-	.8byte	.LVL310
-	.4byte	0x14015
+	.8byte	.LVL308
+	.4byte	0x141cd
 	.uleb128 0x4e
 	.8byte	.LVL313
-	.4byte	0x14015
+	.4byte	0x14090
 	.uleb128 0x4e
-	.8byte	.LVL314
-	.4byte	0x14122
+	.8byte	.LVL316
+	.4byte	0x14090
+	.uleb128 0x4e
+	.8byte	.LVL317
+	.4byte	0x1419d
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3051
+	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0x6e9
+	.2byte	0x6e7
 	.4byte	0x2d9
 	.8byte	.LFB2836
 	.8byte	.LFE2836-.LFB2836
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x100b7
+	.4byte	0x1013a
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x6e9
+	.2byte	0x6e7
 	.4byte	0xa55b
-	.4byte	.LLST77
+	.4byte	.LLST80
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x6ea
+	.2byte	0x6e8
 	.4byte	0xb3d6
-	.4byte	.LLST78
+	.4byte	.LLST81
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6eb
+	.2byte	0x6e9
 	.4byte	0x219
-	.4byte	.LLST79
+	.4byte	.LLST82
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x6ed
+	.2byte	0x6eb
 	.4byte	0xe47d
 	.uleb128 0x46
 	.4byte	.LASF2455
 	.byte	0x1
-	.2byte	0x6ee
+	.2byte	0x6ec
 	.4byte	0xc6
 	.uleb128 0x53
-	.4byte	0x12f24
+	.4byte	0x12f9f
 	.8byte	.LBB1206
 	.8byte	.LBE1206-.LBB1206
 	.byte	0x1
-	.2byte	0x6f0
-	.4byte	0x100a9
+	.2byte	0x6ee
+	.4byte	0x1012c
 	.uleb128 0x54
-	.4byte	0x12f34
+	.4byte	0x12faf
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL282
-	.4byte	0x1412c
+	.8byte	.LVL285
+	.4byte	0x141b3
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3052
+	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0x6db
+	.2byte	0x6d9
 	.4byte	0x2d9
 	.8byte	.LFB2835
 	.8byte	.LFE2835-.LFB2835
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10160
+	.4byte	0x101e3
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x6db
+	.2byte	0x6d9
 	.4byte	0xa55b
-	.4byte	.LLST80
+	.4byte	.LLST83
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x6dc
+	.2byte	0x6da
 	.4byte	0xb3d6
-	.4byte	.LLST81
+	.4byte	.LLST84
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6dd
+	.2byte	0x6db
 	.4byte	0x219
-	.4byte	.LLST82
+	.4byte	.LLST85
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x6df
+	.2byte	0x6dd
 	.4byte	0xe47d
 	.uleb128 0x69
 	.string	"t"
 	.byte	0x1
-	.2byte	0x6e0
+	.2byte	0x6de
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x5a
-	.4byte	0x12f40
+	.4byte	0x12fbb
 	.8byte	.LBB1208
 	.4byte	.Ldebug_ranges0+0x6a0
 	.byte	0x1
-	.2byte	0x6e2
-	.4byte	0x10145
+	.2byte	0x6e0
+	.4byte	0x101c8
 	.uleb128 0x54
-	.4byte	0x12f5b
+	.4byte	0x12fd6
 	.uleb128 0x54
-	.4byte	0x12f50
+	.4byte	0x12fcb
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL289
-	.4byte	0x1412c
-	.uleb128 0x4e
 	.8byte	.LVL292
-	.4byte	0x14122
+	.4byte	0x141b3
+	.uleb128 0x4e
+	.8byte	.LVL295
+	.4byte	0x1419d
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3053
+	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0x6d0
+	.2byte	0x6ce
 	.4byte	0x2d9
 	.8byte	.LFB2834
 	.8byte	.LFE2834-.LFB2834
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x101cc
+	.4byte	0x1024f
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x6d0
+	.2byte	0x6ce
 	.4byte	0xa55b
-	.4byte	.LLST83
+	.4byte	.LLST86
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x6d1
+	.2byte	0x6cf
 	.4byte	0xb3d6
-	.4byte	.LLST84
+	.4byte	.LLST87
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6d2
+	.2byte	0x6d0
 	.4byte	0x219
-	.4byte	.LLST85
+	.4byte	.LLST88
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x6d4
+	.2byte	0x6d2
 	.4byte	0xe47d
 	.uleb128 0x4e
-	.8byte	.LVL297
-	.4byte	0x1412c
+	.8byte	.LVL300
+	.4byte	0x141b3
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3054
+	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0x6c5
+	.2byte	0x6c3
 	.4byte	0x2d9
 	.8byte	.LFB2833
 	.8byte	.LFE2833-.LFB2833
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10245
+	.4byte	0x102c8
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x6c5
+	.2byte	0x6c3
 	.4byte	0xa55b
-	.4byte	.LLST92
+	.4byte	.LLST95
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x6c6
+	.2byte	0x6c4
 	.4byte	0xb3d6
-	.4byte	.LLST93
+	.4byte	.LLST96
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6c7
+	.2byte	0x6c5
 	.4byte	0x219
-	.4byte	.LLST94
+	.4byte	.LLST97
 	.uleb128 0x46
-	.4byte	.LASF3055
+	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0x6c9
+	.2byte	0x6c7
 	.4byte	0x56
 	.uleb128 0x4e
-	.8byte	.LVL316
-	.4byte	0x14152
+	.8byte	.LVL319
+	.4byte	0x141d9
 	.uleb128 0x4e
-	.8byte	.LVL317
-	.4byte	0x1412c
+	.8byte	.LVL320
+	.4byte	0x141b3
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3056
+	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x6ae
+	.2byte	0x6ac
 	.4byte	0xc6
 	.8byte	.LFB2832
 	.8byte	.LFE2832-.LFB2832
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10286
+	.4byte	0x10309
 	.uleb128 0x58
 	.4byte	.LASF417
 	.byte	0x1
-	.2byte	0x6ae
+	.2byte	0x6ac
 	.4byte	0x1c6a
 	.4byte	.LLST6
 	.uleb128 0x6a
 	.4byte	.LASF1272
 	.byte	0x1
-	.2byte	0x6ae
+	.2byte	0x6ac
 	.4byte	0x5547
 	.uleb128 0x1
 	.byte	0x51
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3057
+	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x69f
+	.2byte	0x69d
 	.4byte	0xc6
 	.8byte	.LFB2831
 	.8byte	.LFE2831-.LFB2831
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x102ef
+	.4byte	0x10372
 	.uleb128 0x58
 	.4byte	.LASF1272
 	.byte	0x1
-	.2byte	0x69f
+	.2byte	0x69d
 	.4byte	0x5547
 	.4byte	.LLST10
 	.uleb128 0x51
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x69f
+	.2byte	0x69d
 	.4byte	0x3ca0
 	.4byte	.LLST11
 	.uleb128 0x46
 	.4byte	.LASF883
 	.byte	0x1
-	.2byte	0x6a1
+	.2byte	0x69f
 	.4byte	0x29
 	.uleb128 0x4e
 	.8byte	.LVL46
-	.4byte	0x1415e
+	.4byte	0x141e5
 	.uleb128 0x4e
 	.8byte	.LVL47
-	.4byte	0x1416a
+	.4byte	0x141f1
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3058
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x5d6
+	.2byte	0x5d4
 	.4byte	0x194
 	.8byte	.LFB2830
 	.8byte	.LFE2830-.LFB2830
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11597
+	.4byte	0x1161a
 	.uleb128 0x58
 	.4byte	.LASF1272
 	.byte	0x1
-	.2byte	0x5d6
+	.2byte	0x5d4
 	.4byte	0x5547
 	.4byte	.LLST12
 	.uleb128 0x51
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0x5d6
+	.2byte	0x5d4
 	.4byte	0x6d
 	.4byte	.LLST13
 	.uleb128 0x51
 	.string	"arg"
 	.byte	0x1
-	.2byte	0x5d6
+	.2byte	0x5d4
 	.4byte	0x29
 	.4byte	.LLST14
 	.uleb128 0x46
-	.4byte	.LASF3059
+	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x5d8
+	.2byte	0x5d6
 	.4byte	0x443
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x5d9
+	.2byte	0x5d7
 	.4byte	0xe13f
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x5da
-	.4byte	0xe72c
+	.2byte	0x5d8
+	.4byte	0xe742
 	.uleb128 0x4c
-	.4byte	.LASF3060
+	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x5db
+	.2byte	0x5d9
 	.4byte	0xd9e5
 	.uleb128 0x2
 	.byte	0x91
@@ -39932,231 +40038,231 @@ __exitcall_ebc_exit:
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5dc
+	.2byte	0x5da
 	.4byte	0xe418
 	.uleb128 0x46
-	.4byte	.LASF3061
+	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x5dd
+	.2byte	0x5db
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3062
+	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x5de
+	.2byte	0x5dc
 	.4byte	0x29
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x5df
+	.2byte	0x5dd
 	.4byte	0xc6
 	.uleb128 0x55
-	.4byte	.LASF3023
-	.4byte	0x115a7
+	.4byte	.LASF3024
+	.4byte	0x1162a
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34937
+	.8byte	__func__.34939
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x1a0
-	.4byte	0x10459
+	.4byte	0x104dc
 	.uleb128 0x46
-	.4byte	.LASF3063
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x629
+	.2byte	0x627
 	.4byte	0xc6
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x1a0
 	.uleb128 0x6b
-	.4byte	.LASF3075
+	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x629
+	.2byte	0x627
 	.8byte	.L127
 	.uleb128 0x4c
-	.4byte	.LASF3064
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x629
+	.2byte	0x627
 	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -96
 	.uleb128 0x46
-	.4byte	.LASF3063
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x629
+	.2byte	0x627
 	.4byte	0x194
 	.uleb128 0x6c
 	.8byte	.LBB998
 	.8byte	.LBE998-.LBB998
-	.4byte	0x1043d
+	.4byte	0x104c0
 	.uleb128 0x59
-	.4byte	.LASF3065
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x629
+	.2byte	0x627
 	.4byte	0x194
 	.4byte	.LLST29
 	.uleb128 0x4e
 	.8byte	.LVL93
-	.4byte	0x14177
+	.4byte	0x141fe
 	.uleb128 0x4e
 	.8byte	.LVL94
-	.4byte	0x14183
+	.4byte	0x1420a
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL91
-	.4byte	0x14190
+	.4byte	0x14217
 	.uleb128 0x4e
 	.8byte	.LVL95
-	.4byte	0x1419c
+	.4byte	0x14223
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13033
+	.4byte	0x130ae
 	.8byte	.LBB934
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x691
-	.4byte	0x10679
+	.2byte	0x68f
+	.4byte	0x106fc
 	.uleb128 0x54
-	.4byte	0x13058
+	.4byte	0x130d3
 	.uleb128 0x54
-	.4byte	0x1304d
+	.4byte	0x130c8
 	.uleb128 0x54
-	.4byte	0x13043
+	.4byte	0x130be
 	.uleb128 0x6d
-	.4byte	0x13091
+	.4byte	0x1310c
 	.8byte	.LBB935
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x13131
 	.uleb128 0x54
-	.4byte	0x130ab
+	.4byte	0x13126
 	.uleb128 0x54
-	.4byte	0x130a1
+	.4byte	0x1311c
 	.uleb128 0x6e
-	.4byte	0x1312e
+	.4byte	0x131a9
 	.8byte	.LBB937
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x105af
+	.4byte	0x10632
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x131c4
 	.uleb128 0x6f
-	.4byte	0x1313e
+	.4byte	0x131b9
 	.4byte	.LLST15
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x80
 	.uleb128 0x5f
-	.4byte	0x13154
+	.4byte	0x131cf
 	.4byte	.LLST16
 	.uleb128 0x5f
-	.4byte	0x1315f
+	.4byte	0x131da
 	.4byte	.LLST17
 	.uleb128 0x70
-	.4byte	0x13582
+	.4byte	0x135fd
 	.8byte	.LBB939
 	.8byte	.LBE939-.LBB939
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10515
+	.4byte	0x10598
 	.uleb128 0x56
 	.8byte	.LBB940
 	.8byte	.LBE940-.LBB940
 	.uleb128 0x5f
-	.4byte	0x13592
+	.4byte	0x1360d
 	.4byte	.LLST18
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13556
+	.4byte	0x135d1
 	.8byte	.LBB941
 	.8byte	.LBE941-.LBB941
 	.byte	0x6
 	.byte	0x55
-	.4byte	0x1055d
+	.4byte	0x105e0
 	.uleb128 0x54
-	.4byte	0x13570
+	.4byte	0x135eb
 	.uleb128 0x54
-	.4byte	0x13566
+	.4byte	0x135e1
 	.uleb128 0x5b
-	.4byte	0x13638
+	.4byte	0x136b3
 	.8byte	.LBB942
 	.8byte	.LBE942-.LBB942
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x13652
+	.4byte	0x136cd
 	.uleb128 0x54
-	.4byte	0x13648
+	.4byte	0x136c3
 	.byte	0
 	.byte	0
 	.uleb128 0x56
 	.8byte	.LBB944
 	.8byte	.LBE944-.LBB944
 	.uleb128 0x57
-	.4byte	0x1316b
+	.4byte	0x131e6
 	.uleb128 0x5b
-	.4byte	0x13606
+	.4byte	0x13681
 	.8byte	.LBB945
 	.8byte	.LBE945-.LBB945
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13621
+	.4byte	0x1369c
 	.uleb128 0x54
-	.4byte	0x13616
+	.4byte	0x13691
 	.uleb128 0x56
 	.8byte	.LBB946
 	.8byte	.LBE946-.LBB946
 	.uleb128 0x57
-	.4byte	0x1362c
+	.4byte	0x136a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x130fa
+	.4byte	0x13175
 	.8byte	.LBB951
 	.8byte	.LBE951-.LBB951
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x1066a
+	.4byte	0x106ed
 	.uleb128 0x54
-	.4byte	0x1310a
+	.4byte	0x13185
 	.uleb128 0x56
 	.8byte	.LBB952
 	.8byte	.LBE952-.LBB952
 	.uleb128 0x5f
-	.4byte	0x13115
+	.4byte	0x13190
 	.4byte	.LLST19
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xc0
-	.4byte	0x10635
+	.4byte	0x106b8
 	.uleb128 0x5f
-	.4byte	0x13121
+	.4byte	0x1319c
 	.4byte	.LLST20
 	.uleb128 0x5b
-	.4byte	0x13606
+	.4byte	0x13681
 	.8byte	.LBB954
 	.8byte	.LBE954-.LBB954
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13621
+	.4byte	0x1369c
 	.uleb128 0x54
-	.4byte	0x13616
+	.4byte	0x13691
 	.uleb128 0x56
 	.8byte	.LBB955
 	.8byte	.LBE955-.LBB955
 	.uleb128 0x57
-	.4byte	0x1362c
+	.4byte	0x136a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13582
+	.4byte	0x135fd
 	.8byte	.LBB956
 	.8byte	.LBE956-.LBB956
 	.byte	0x6
@@ -40165,7 +40271,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB957
 	.8byte	.LBE957-.LBB957
 	.uleb128 0x5f
-	.4byte	0x13592
+	.4byte	0x1360d
 	.4byte	.LLST21
 	.byte	0
 	.byte	0
@@ -40173,162 +40279,162 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL121
-	.4byte	0x141a9
+	.4byte	0x14230
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13062
+	.4byte	0x130dd
 	.8byte	.LBB967
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
-	.2byte	0x614
-	.4byte	0x108a4
+	.2byte	0x612
+	.4byte	0x10927
 	.uleb128 0x54
-	.4byte	0x13087
+	.4byte	0x13102
 	.uleb128 0x54
-	.4byte	0x1307c
+	.4byte	0x130f7
 	.uleb128 0x54
-	.4byte	0x13072
+	.4byte	0x130ed
 	.uleb128 0x6d
-	.4byte	0x130c0
+	.4byte	0x1313b
 	.8byte	.LBB968
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x130e5
+	.4byte	0x13160
 	.uleb128 0x54
-	.4byte	0x130da
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x130d0
+	.4byte	0x1314b
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x57
-	.4byte	0x130ee
+	.4byte	0x13169
 	.uleb128 0x6e
-	.4byte	0x1312e
+	.4byte	0x131a9
 	.8byte	.LBB970
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x107d9
+	.4byte	0x1085c
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x131c4
 	.uleb128 0x6f
-	.4byte	0x1313e
+	.4byte	0x131b9
 	.4byte	.LLST22
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x130
 	.uleb128 0x5f
-	.4byte	0x13154
+	.4byte	0x131cf
 	.4byte	.LLST23
 	.uleb128 0x5f
-	.4byte	0x1315f
+	.4byte	0x131da
 	.4byte	.LLST24
 	.uleb128 0x70
-	.4byte	0x13582
+	.4byte	0x135fd
 	.8byte	.LBB972
 	.8byte	.LBE972-.LBB972
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x1073f
+	.4byte	0x107c2
 	.uleb128 0x56
 	.8byte	.LBB973
 	.8byte	.LBE973-.LBB973
 	.uleb128 0x5f
-	.4byte	0x13592
+	.4byte	0x1360d
 	.4byte	.LLST25
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB974
 	.8byte	.LBE974-.LBB974
-	.4byte	0x10793
+	.4byte	0x10816
 	.uleb128 0x57
-	.4byte	0x1316b
+	.4byte	0x131e6
 	.uleb128 0x5b
-	.4byte	0x13606
+	.4byte	0x13681
 	.8byte	.LBB975
 	.8byte	.LBE975-.LBB975
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13621
+	.4byte	0x1369c
 	.uleb128 0x54
-	.4byte	0x13616
+	.4byte	0x13691
 	.uleb128 0x56
 	.8byte	.LBB976
 	.8byte	.LBE976-.LBB976
 	.uleb128 0x57
-	.4byte	0x1362c
+	.4byte	0x136a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13556
+	.4byte	0x135d1
 	.8byte	.LBB977
 	.8byte	.LBE977-.LBB977
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13570
+	.4byte	0x135eb
 	.uleb128 0x54
-	.4byte	0x13566
+	.4byte	0x135e1
 	.uleb128 0x5b
-	.4byte	0x13638
+	.4byte	0x136b3
 	.8byte	.LBB978
 	.8byte	.LBE978-.LBB978
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x13652
+	.4byte	0x136cd
 	.uleb128 0x54
-	.4byte	0x13648
+	.4byte	0x136c3
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x130fa
+	.4byte	0x13175
 	.8byte	.LBB982
 	.8byte	.LBE982-.LBB982
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10894
+	.4byte	0x10917
 	.uleb128 0x54
-	.4byte	0x1310a
+	.4byte	0x13185
 	.uleb128 0x56
 	.8byte	.LBB983
 	.8byte	.LBE983-.LBB983
 	.uleb128 0x5f
-	.4byte	0x13115
+	.4byte	0x13190
 	.4byte	.LLST26
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x170
-	.4byte	0x1085f
+	.4byte	0x108e2
 	.uleb128 0x5f
-	.4byte	0x13121
+	.4byte	0x1319c
 	.4byte	.LLST27
 	.uleb128 0x5b
-	.4byte	0x13606
+	.4byte	0x13681
 	.8byte	.LBB985
 	.8byte	.LBE985-.LBB985
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13621
+	.4byte	0x1369c
 	.uleb128 0x54
-	.4byte	0x13616
+	.4byte	0x13691
 	.uleb128 0x56
 	.8byte	.LBB986
 	.8byte	.LBE986-.LBB986
 	.uleb128 0x57
-	.4byte	0x1362c
+	.4byte	0x136a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13582
+	.4byte	0x135fd
 	.8byte	.LBB987
 	.8byte	.LBE987-.LBB987
 	.byte	0x6
@@ -40337,7 +40443,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB988
 	.8byte	.LBE988-.LBB988
 	.uleb128 0x5f
-	.4byte	0x13592
+	.4byte	0x1360d
 	.4byte	.LLST28
 	.byte	0
 	.byte	0
@@ -40345,163 +40451,163 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL86
-	.4byte	0x141b6
+	.4byte	0x1423d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13062
+	.4byte	0x130dd
 	.8byte	.LBB1002
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
-	.2byte	0x630
-	.4byte	0x10acf
+	.2byte	0x62e
+	.4byte	0x10b52
 	.uleb128 0x54
-	.4byte	0x13087
+	.4byte	0x13102
 	.uleb128 0x54
-	.4byte	0x1307c
+	.4byte	0x130f7
 	.uleb128 0x54
-	.4byte	0x13072
+	.4byte	0x130ed
 	.uleb128 0x6d
-	.4byte	0x130c0
+	.4byte	0x1313b
 	.8byte	.LBB1003
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x130e5
+	.4byte	0x13160
 	.uleb128 0x54
-	.4byte	0x130da
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x130d0
+	.4byte	0x1314b
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x1f0
 	.uleb128 0x57
-	.4byte	0x130ee
+	.4byte	0x13169
 	.uleb128 0x6e
-	.4byte	0x1312e
+	.4byte	0x131a9
 	.8byte	.LBB1005
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x10a04
+	.4byte	0x10a87
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x131c4
 	.uleb128 0x6f
-	.4byte	0x1313e
+	.4byte	0x131b9
 	.4byte	.LLST30
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x230
 	.uleb128 0x5f
-	.4byte	0x13154
+	.4byte	0x131cf
 	.4byte	.LLST31
 	.uleb128 0x5f
-	.4byte	0x1315f
+	.4byte	0x131da
 	.4byte	.LLST32
 	.uleb128 0x70
-	.4byte	0x13582
+	.4byte	0x135fd
 	.8byte	.LBB1007
 	.8byte	.LBE1007-.LBB1007
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x1096a
+	.4byte	0x109ed
 	.uleb128 0x56
 	.8byte	.LBB1008
 	.8byte	.LBE1008-.LBB1008
 	.uleb128 0x5f
-	.4byte	0x13592
+	.4byte	0x1360d
 	.4byte	.LLST33
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1009
 	.8byte	.LBE1009-.LBB1009
-	.4byte	0x109be
+	.4byte	0x10a41
 	.uleb128 0x57
-	.4byte	0x1316b
+	.4byte	0x131e6
 	.uleb128 0x5b
-	.4byte	0x13606
+	.4byte	0x13681
 	.8byte	.LBB1010
 	.8byte	.LBE1010-.LBB1010
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13621
+	.4byte	0x1369c
 	.uleb128 0x54
-	.4byte	0x13616
+	.4byte	0x13691
 	.uleb128 0x56
 	.8byte	.LBB1011
 	.8byte	.LBE1011-.LBB1011
 	.uleb128 0x57
-	.4byte	0x1362c
+	.4byte	0x136a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13556
+	.4byte	0x135d1
 	.8byte	.LBB1012
 	.8byte	.LBE1012-.LBB1012
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13570
+	.4byte	0x135eb
 	.uleb128 0x54
-	.4byte	0x13566
+	.4byte	0x135e1
 	.uleb128 0x5b
-	.4byte	0x13638
+	.4byte	0x136b3
 	.8byte	.LBB1013
 	.8byte	.LBE1013-.LBB1013
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x13652
+	.4byte	0x136cd
 	.uleb128 0x54
-	.4byte	0x13648
+	.4byte	0x136c3
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x130fa
+	.4byte	0x13175
 	.8byte	.LBB1017
 	.8byte	.LBE1017-.LBB1017
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10abf
+	.4byte	0x10b42
 	.uleb128 0x54
-	.4byte	0x1310a
+	.4byte	0x13185
 	.uleb128 0x56
 	.8byte	.LBB1018
 	.8byte	.LBE1018-.LBB1018
 	.uleb128 0x5f
-	.4byte	0x13115
+	.4byte	0x13190
 	.4byte	.LLST34
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x270
-	.4byte	0x10a8a
+	.4byte	0x10b0d
 	.uleb128 0x5f
-	.4byte	0x13121
+	.4byte	0x1319c
 	.4byte	.LLST35
 	.uleb128 0x5b
-	.4byte	0x13606
+	.4byte	0x13681
 	.8byte	.LBB1020
 	.8byte	.LBE1020-.LBB1020
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13621
+	.4byte	0x1369c
 	.uleb128 0x54
-	.4byte	0x13616
+	.4byte	0x13691
 	.uleb128 0x56
 	.8byte	.LBB1021
 	.8byte	.LBE1021-.LBB1021
 	.uleb128 0x57
-	.4byte	0x1362c
+	.4byte	0x136a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13582
+	.4byte	0x135fd
 	.8byte	.LBB1022
 	.8byte	.LBE1022-.LBB1022
 	.byte	0x6
@@ -40510,7 +40616,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1023
 	.8byte	.LBE1023-.LBB1023
 	.uleb128 0x5f
-	.4byte	0x13592
+	.4byte	0x1360d
 	.4byte	.LLST36
 	.byte	0
 	.byte	0
@@ -40518,159 +40624,159 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL110
-	.4byte	0x141b6
+	.4byte	0x1423d
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13033
+	.4byte	0x130ae
 	.8byte	.LBB1032
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
-	.2byte	0x5fe
-	.4byte	0x10cef
+	.2byte	0x5fc
+	.4byte	0x10d72
 	.uleb128 0x54
-	.4byte	0x13058
+	.4byte	0x130d3
 	.uleb128 0x54
-	.4byte	0x1304d
+	.4byte	0x130c8
 	.uleb128 0x54
-	.4byte	0x13043
+	.4byte	0x130be
 	.uleb128 0x6d
-	.4byte	0x13091
+	.4byte	0x1310c
 	.8byte	.LBB1033
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x13131
 	.uleb128 0x54
-	.4byte	0x130ab
+	.4byte	0x13126
 	.uleb128 0x54
-	.4byte	0x130a1
+	.4byte	0x1311c
 	.uleb128 0x6e
-	.4byte	0x1312e
+	.4byte	0x131a9
 	.8byte	.LBB1035
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10c25
+	.4byte	0x10ca8
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x131c4
 	.uleb128 0x6f
-	.4byte	0x1313e
+	.4byte	0x131b9
 	.4byte	.LLST37
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x2f0
 	.uleb128 0x5f
-	.4byte	0x13154
+	.4byte	0x131cf
 	.4byte	.LLST38
 	.uleb128 0x5f
-	.4byte	0x1315f
+	.4byte	0x131da
 	.4byte	.LLST39
 	.uleb128 0x70
-	.4byte	0x13582
+	.4byte	0x135fd
 	.8byte	.LBB1037
 	.8byte	.LBE1037-.LBB1037
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10b8b
+	.4byte	0x10c0e
 	.uleb128 0x56
 	.8byte	.LBB1038
 	.8byte	.LBE1038-.LBB1038
 	.uleb128 0x5f
-	.4byte	0x13592
+	.4byte	0x1360d
 	.4byte	.LLST40
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1039
 	.8byte	.LBE1039-.LBB1039
-	.4byte	0x10bdf
+	.4byte	0x10c62
 	.uleb128 0x57
-	.4byte	0x1316b
+	.4byte	0x131e6
 	.uleb128 0x5b
-	.4byte	0x13606
+	.4byte	0x13681
 	.8byte	.LBB1040
 	.8byte	.LBE1040-.LBB1040
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13621
+	.4byte	0x1369c
 	.uleb128 0x54
-	.4byte	0x13616
+	.4byte	0x13691
 	.uleb128 0x56
 	.8byte	.LBB1041
 	.8byte	.LBE1041-.LBB1041
 	.uleb128 0x57
-	.4byte	0x1362c
+	.4byte	0x136a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13556
+	.4byte	0x135d1
 	.8byte	.LBB1042
 	.8byte	.LBE1042-.LBB1042
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13570
+	.4byte	0x135eb
 	.uleb128 0x54
-	.4byte	0x13566
+	.4byte	0x135e1
 	.uleb128 0x5b
-	.4byte	0x13638
+	.4byte	0x136b3
 	.8byte	.LBB1043
 	.8byte	.LBE1043-.LBB1043
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x13652
+	.4byte	0x136cd
 	.uleb128 0x54
-	.4byte	0x13648
+	.4byte	0x136c3
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x130fa
+	.4byte	0x13175
 	.8byte	.LBB1049
 	.8byte	.LBE1049-.LBB1049
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x10ce0
+	.4byte	0x10d63
 	.uleb128 0x54
-	.4byte	0x1310a
+	.4byte	0x13185
 	.uleb128 0x56
 	.8byte	.LBB1050
 	.8byte	.LBE1050-.LBB1050
 	.uleb128 0x5f
-	.4byte	0x13115
+	.4byte	0x13190
 	.4byte	.LLST41
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x340
-	.4byte	0x10cab
+	.4byte	0x10d2e
 	.uleb128 0x5f
-	.4byte	0x13121
+	.4byte	0x1319c
 	.4byte	.LLST42
 	.uleb128 0x5b
-	.4byte	0x13606
+	.4byte	0x13681
 	.8byte	.LBB1052
 	.8byte	.LBE1052-.LBB1052
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13621
+	.4byte	0x1369c
 	.uleb128 0x54
-	.4byte	0x13616
+	.4byte	0x13691
 	.uleb128 0x56
 	.8byte	.LBB1053
 	.8byte	.LBE1053-.LBB1053
 	.uleb128 0x57
-	.4byte	0x1362c
+	.4byte	0x136a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13582
+	.4byte	0x135fd
 	.8byte	.LBB1054
 	.8byte	.LBE1054-.LBB1054
 	.byte	0x6
@@ -40679,7 +40785,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1055
 	.8byte	.LBE1055-.LBB1055
 	.uleb128 0x5f
-	.4byte	0x13592
+	.4byte	0x1360d
 	.4byte	.LLST43
 	.byte	0
 	.byte	0
@@ -40687,163 +40793,163 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL137
-	.4byte	0x141a9
+	.4byte	0x14230
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13062
+	.4byte	0x130dd
 	.8byte	.LBB1066
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
-	.2byte	0x64d
-	.4byte	0x10f2b
+	.2byte	0x64b
+	.4byte	0x10fae
 	.uleb128 0x54
-	.4byte	0x13087
+	.4byte	0x13102
 	.uleb128 0x54
-	.4byte	0x1307c
+	.4byte	0x130f7
 	.uleb128 0x54
-	.4byte	0x13072
+	.4byte	0x130ed
 	.uleb128 0x6d
-	.4byte	0x130c0
+	.4byte	0x1313b
 	.8byte	.LBB1067
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x130e5
+	.4byte	0x13160
 	.uleb128 0x54
-	.4byte	0x130da
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x130d0
+	.4byte	0x1314b
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x370
 	.uleb128 0x5f
-	.4byte	0x130ee
+	.4byte	0x13169
 	.4byte	.LLST44
 	.uleb128 0x6e
-	.4byte	0x1312e
+	.4byte	0x131a9
 	.8byte	.LBB1069
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x10e53
+	.4byte	0x10ed6
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x131c4
 	.uleb128 0x6f
-	.4byte	0x1313e
+	.4byte	0x131b9
 	.4byte	.LLST45
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x5f
-	.4byte	0x13154
+	.4byte	0x131cf
 	.4byte	.LLST46
 	.uleb128 0x5f
-	.4byte	0x1315f
+	.4byte	0x131da
 	.4byte	.LLST47
 	.uleb128 0x70
-	.4byte	0x13582
+	.4byte	0x135fd
 	.8byte	.LBB1071
 	.8byte	.LBE1071-.LBB1071
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10db9
+	.4byte	0x10e3c
 	.uleb128 0x56
 	.8byte	.LBB1072
 	.8byte	.LBE1072-.LBB1072
 	.uleb128 0x5f
-	.4byte	0x13592
+	.4byte	0x1360d
 	.4byte	.LLST48
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1073
 	.8byte	.LBE1073-.LBB1073
-	.4byte	0x10e0d
+	.4byte	0x10e90
 	.uleb128 0x57
-	.4byte	0x1316b
+	.4byte	0x131e6
 	.uleb128 0x5b
-	.4byte	0x13606
+	.4byte	0x13681
 	.8byte	.LBB1074
 	.8byte	.LBE1074-.LBB1074
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13621
+	.4byte	0x1369c
 	.uleb128 0x54
-	.4byte	0x13616
+	.4byte	0x13691
 	.uleb128 0x56
 	.8byte	.LBB1075
 	.8byte	.LBE1075-.LBB1075
 	.uleb128 0x57
-	.4byte	0x1362c
+	.4byte	0x136a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13556
+	.4byte	0x135d1
 	.8byte	.LBB1076
 	.8byte	.LBE1076-.LBB1076
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13570
+	.4byte	0x135eb
 	.uleb128 0x54
-	.4byte	0x13566
+	.4byte	0x135e1
 	.uleb128 0x5b
-	.4byte	0x13638
+	.4byte	0x136b3
 	.8byte	.LBB1077
 	.8byte	.LBE1077-.LBB1077
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x13652
+	.4byte	0x136cd
 	.uleb128 0x54
-	.4byte	0x13648
+	.4byte	0x136c3
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x130fa
+	.4byte	0x13175
 	.8byte	.LBB1083
 	.8byte	.LBE1083-.LBB1083
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10f0e
+	.4byte	0x10f91
 	.uleb128 0x54
-	.4byte	0x1310a
+	.4byte	0x13185
 	.uleb128 0x56
 	.8byte	.LBB1084
 	.8byte	.LBE1084-.LBB1084
 	.uleb128 0x5f
-	.4byte	0x13115
+	.4byte	0x13190
 	.4byte	.LLST49
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x420
-	.4byte	0x10ed9
+	.4byte	0x10f5c
 	.uleb128 0x5f
-	.4byte	0x13121
+	.4byte	0x1319c
 	.4byte	.LLST50
 	.uleb128 0x5b
-	.4byte	0x13606
+	.4byte	0x13681
 	.8byte	.LBB1086
 	.8byte	.LBE1086-.LBB1086
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13621
+	.4byte	0x1369c
 	.uleb128 0x54
-	.4byte	0x13616
+	.4byte	0x13691
 	.uleb128 0x56
 	.8byte	.LBB1087
 	.8byte	.LBE1087-.LBB1087
 	.uleb128 0x57
-	.4byte	0x1362c
+	.4byte	0x136a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13582
+	.4byte	0x135fd
 	.8byte	.LBB1088
 	.8byte	.LBE1088-.LBB1088
 	.byte	0x6
@@ -40852,7 +40958,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1089
 	.8byte	.LBE1089-.LBB1089
 	.uleb128 0x5f
-	.4byte	0x13592
+	.4byte	0x1360d
 	.4byte	.LLST51
 	.byte	0
 	.byte	0
@@ -40860,59 +40966,59 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL149
-	.4byte	0x141b6
+	.4byte	0x1423d
 	.uleb128 0x4e
 	.8byte	.LVL227
-	.4byte	0x13fff
+	.4byte	0x1407a
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13033
+	.4byte	0x130ae
 	.8byte	.LBB1102
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
-	.2byte	0x66a
-	.4byte	0x10fdd
+	.2byte	0x668
+	.4byte	0x11060
 	.uleb128 0x54
-	.4byte	0x13058
+	.4byte	0x130d3
 	.uleb128 0x54
-	.4byte	0x1304d
+	.4byte	0x130c8
 	.uleb128 0x54
-	.4byte	0x13043
+	.4byte	0x130be
 	.uleb128 0x6d
-	.4byte	0x13091
+	.4byte	0x1310c
 	.8byte	.LBB1103
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x13131
 	.uleb128 0x54
-	.4byte	0x130ab
+	.4byte	0x13126
 	.uleb128 0x54
-	.4byte	0x130a1
+	.4byte	0x1311c
 	.uleb128 0x6d
-	.4byte	0x1312e
+	.4byte	0x131a9
 	.8byte	.LBB1105
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x131c4
 	.uleb128 0x71
-	.4byte	0x1313e
+	.4byte	0x131b9
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x4b0
 	.uleb128 0x57
-	.4byte	0x13154
+	.4byte	0x131cf
 	.uleb128 0x5f
-	.4byte	0x1315f
+	.4byte	0x131da
 	.4byte	.LLST52
 	.uleb128 0x5b
-	.4byte	0x13582
+	.4byte	0x135fd
 	.8byte	.LBB1107
 	.8byte	.LBE1107-.LBB1107
 	.byte	0x6
@@ -40921,7 +41027,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1108
 	.8byte	.LBE1108-.LBB1108
 	.uleb128 0x5f
-	.4byte	0x13592
+	.4byte	0x1360d
 	.4byte	.LLST53
 	.byte	0
 	.byte	0
@@ -40930,154 +41036,154 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13033
+	.4byte	0x130ae
 	.8byte	.LBB1114
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
-	.2byte	0x65a
-	.4byte	0x111fd
+	.2byte	0x658
+	.4byte	0x11280
 	.uleb128 0x54
-	.4byte	0x13058
+	.4byte	0x130d3
 	.uleb128 0x54
-	.4byte	0x1304d
+	.4byte	0x130c8
 	.uleb128 0x54
-	.4byte	0x13043
+	.4byte	0x130be
 	.uleb128 0x6d
-	.4byte	0x13091
+	.4byte	0x1310c
 	.8byte	.LBB1115
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x13131
 	.uleb128 0x54
-	.4byte	0x130ab
+	.4byte	0x13126
 	.uleb128 0x54
-	.4byte	0x130a1
+	.4byte	0x1311c
 	.uleb128 0x6e
-	.4byte	0x1312e
+	.4byte	0x131a9
 	.8byte	.LBB1117
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x11133
+	.4byte	0x111b6
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x131c4
 	.uleb128 0x6f
-	.4byte	0x1313e
+	.4byte	0x131b9
 	.4byte	.LLST54
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x540
 	.uleb128 0x5f
-	.4byte	0x13154
+	.4byte	0x131cf
 	.4byte	.LLST55
 	.uleb128 0x5f
-	.4byte	0x1315f
+	.4byte	0x131da
 	.4byte	.LLST56
 	.uleb128 0x70
-	.4byte	0x13582
+	.4byte	0x135fd
 	.8byte	.LBB1119
 	.8byte	.LBE1119-.LBB1119
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x11099
+	.4byte	0x1111c
 	.uleb128 0x56
 	.8byte	.LBB1120
 	.8byte	.LBE1120-.LBB1120
 	.uleb128 0x5f
-	.4byte	0x13592
+	.4byte	0x1360d
 	.4byte	.LLST57
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1121
 	.8byte	.LBE1121-.LBB1121
-	.4byte	0x110ed
+	.4byte	0x11170
 	.uleb128 0x57
-	.4byte	0x1316b
+	.4byte	0x131e6
 	.uleb128 0x5b
-	.4byte	0x13606
+	.4byte	0x13681
 	.8byte	.LBB1122
 	.8byte	.LBE1122-.LBB1122
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13621
+	.4byte	0x1369c
 	.uleb128 0x54
-	.4byte	0x13616
+	.4byte	0x13691
 	.uleb128 0x56
 	.8byte	.LBB1123
 	.8byte	.LBE1123-.LBB1123
 	.uleb128 0x57
-	.4byte	0x1362c
+	.4byte	0x136a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13556
+	.4byte	0x135d1
 	.8byte	.LBB1124
 	.8byte	.LBE1124-.LBB1124
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13570
+	.4byte	0x135eb
 	.uleb128 0x54
-	.4byte	0x13566
+	.4byte	0x135e1
 	.uleb128 0x5b
-	.4byte	0x13638
+	.4byte	0x136b3
 	.8byte	.LBB1125
 	.8byte	.LBE1125-.LBB1125
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x13652
+	.4byte	0x136cd
 	.uleb128 0x54
-	.4byte	0x13648
+	.4byte	0x136c3
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x130fa
+	.4byte	0x13175
 	.8byte	.LBB1133
 	.8byte	.LBE1133-.LBB1133
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x111ee
+	.4byte	0x11271
 	.uleb128 0x54
-	.4byte	0x1310a
+	.4byte	0x13185
 	.uleb128 0x56
 	.8byte	.LBB1134
 	.8byte	.LBE1134-.LBB1134
 	.uleb128 0x5f
-	.4byte	0x13115
+	.4byte	0x13190
 	.4byte	.LLST58
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x590
-	.4byte	0x111b9
+	.4byte	0x1123c
 	.uleb128 0x5f
-	.4byte	0x13121
+	.4byte	0x1319c
 	.4byte	.LLST59
 	.uleb128 0x5b
-	.4byte	0x13606
+	.4byte	0x13681
 	.8byte	.LBB1136
 	.8byte	.LBE1136-.LBB1136
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13621
+	.4byte	0x1369c
 	.uleb128 0x54
-	.4byte	0x13616
+	.4byte	0x13691
 	.uleb128 0x56
 	.8byte	.LBB1137
 	.8byte	.LBE1137-.LBB1137
 	.uleb128 0x57
-	.4byte	0x1362c
+	.4byte	0x136a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13582
+	.4byte	0x135fd
 	.8byte	.LBB1138
 	.8byte	.LBE1138-.LBB1138
 	.byte	0x6
@@ -41086,7 +41192,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1139
 	.8byte	.LBE1139-.LBB1139
 	.uleb128 0x5f
-	.4byte	0x13592
+	.4byte	0x1360d
 	.4byte	.LLST60
 	.byte	0
 	.byte	0
@@ -41094,158 +41200,158 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL210
-	.4byte	0x141a9
+	.4byte	0x14230
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13033
+	.4byte	0x130ae
 	.8byte	.LBB1150
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
-	.2byte	0x60c
-	.4byte	0x1141d
+	.2byte	0x60a
+	.4byte	0x114a0
 	.uleb128 0x54
-	.4byte	0x13058
+	.4byte	0x130d3
 	.uleb128 0x54
-	.4byte	0x1304d
+	.4byte	0x130c8
 	.uleb128 0x54
-	.4byte	0x13043
+	.4byte	0x130be
 	.uleb128 0x6d
-	.4byte	0x13091
+	.4byte	0x1310c
 	.8byte	.LBB1151
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x13131
 	.uleb128 0x54
-	.4byte	0x130ab
+	.4byte	0x13126
 	.uleb128 0x54
-	.4byte	0x130a1
+	.4byte	0x1311c
 	.uleb128 0x6e
-	.4byte	0x1312e
+	.4byte	0x131a9
 	.8byte	.LBB1153
 	.4byte	.Ldebug_ranges0+0x620
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x11353
+	.4byte	0x113d6
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x131c4
 	.uleb128 0x6f
-	.4byte	0x1313e
+	.4byte	0x131b9
 	.4byte	.LLST61
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x620
 	.uleb128 0x5f
-	.4byte	0x13154
+	.4byte	0x131cf
 	.4byte	.LLST62
 	.uleb128 0x5f
-	.4byte	0x1315f
+	.4byte	0x131da
 	.4byte	.LLST63
 	.uleb128 0x70
-	.4byte	0x13582
+	.4byte	0x135fd
 	.8byte	.LBB1155
 	.8byte	.LBE1155-.LBB1155
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x112b9
+	.4byte	0x1133c
 	.uleb128 0x56
 	.8byte	.LBB1156
 	.8byte	.LBE1156-.LBB1156
 	.uleb128 0x5f
-	.4byte	0x13592
+	.4byte	0x1360d
 	.4byte	.LLST64
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1157
 	.8byte	.LBE1157-.LBB1157
-	.4byte	0x1130d
+	.4byte	0x11390
 	.uleb128 0x57
-	.4byte	0x1316b
+	.4byte	0x131e6
 	.uleb128 0x5b
-	.4byte	0x13606
+	.4byte	0x13681
 	.8byte	.LBB1158
 	.8byte	.LBE1158-.LBB1158
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13621
+	.4byte	0x1369c
 	.uleb128 0x54
-	.4byte	0x13616
+	.4byte	0x13691
 	.uleb128 0x56
 	.8byte	.LBB1159
 	.8byte	.LBE1159-.LBB1159
 	.uleb128 0x57
-	.4byte	0x1362c
+	.4byte	0x136a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13556
+	.4byte	0x135d1
 	.8byte	.LBB1160
 	.8byte	.LBE1160-.LBB1160
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13570
+	.4byte	0x135eb
 	.uleb128 0x54
-	.4byte	0x13566
+	.4byte	0x135e1
 	.uleb128 0x5b
-	.4byte	0x13638
+	.4byte	0x136b3
 	.8byte	.LBB1161
 	.8byte	.LBE1161-.LBB1161
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x13652
+	.4byte	0x136cd
 	.uleb128 0x54
-	.4byte	0x13648
+	.4byte	0x136c3
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x130fa
+	.4byte	0x13175
 	.8byte	.LBB1169
 	.8byte	.LBE1169-.LBB1169
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x1140e
+	.4byte	0x11491
 	.uleb128 0x54
-	.4byte	0x1310a
+	.4byte	0x13185
 	.uleb128 0x56
 	.8byte	.LBB1170
 	.8byte	.LBE1170-.LBB1170
 	.uleb128 0x5f
-	.4byte	0x13115
+	.4byte	0x13190
 	.4byte	.LLST65
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x670
-	.4byte	0x113d9
+	.4byte	0x1145c
 	.uleb128 0x5f
-	.4byte	0x13121
+	.4byte	0x1319c
 	.4byte	.LLST66
 	.uleb128 0x5b
-	.4byte	0x13606
+	.4byte	0x13681
 	.8byte	.LBB1172
 	.8byte	.LBE1172-.LBB1172
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13621
+	.4byte	0x1369c
 	.uleb128 0x54
-	.4byte	0x13616
+	.4byte	0x13691
 	.uleb128 0x56
 	.8byte	.LBB1173
 	.8byte	.LBE1173-.LBB1173
 	.uleb128 0x57
-	.4byte	0x1362c
+	.4byte	0x136a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13582
+	.4byte	0x135fd
 	.8byte	.LBB1174
 	.8byte	.LBE1174-.LBB1174
 	.byte	0x6
@@ -41254,7 +41360,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1175
 	.8byte	.LBE1175-.LBB1175
 	.uleb128 0x5f
-	.4byte	0x13592
+	.4byte	0x1360d
 	.4byte	.LLST67
 	.byte	0
 	.byte	0
@@ -41262,196 +41368,196 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL218
-	.4byte	0x141a9
+	.4byte	0x14230
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL51
-	.4byte	0x14084
+	.4byte	0x140ff
 	.uleb128 0x4e
 	.8byte	.LVL52
-	.4byte	0x140da
+	.4byte	0x14155
 	.uleb128 0x4e
 	.8byte	.LVL53
-	.4byte	0x1415e
+	.4byte	0x141e5
 	.uleb128 0x4e
 	.8byte	.LVL64
-	.4byte	0x141c3
+	.4byte	0x1424a
 	.uleb128 0x4e
 	.8byte	.LVL67
-	.4byte	0x14015
+	.4byte	0x14090
 	.uleb128 0x4e
 	.8byte	.LVL70
-	.4byte	0x13f9b
+	.4byte	0x14016
 	.uleb128 0x4e
 	.8byte	.LVL87
-	.4byte	0x1415e
+	.4byte	0x141e5
 	.uleb128 0x4e
 	.8byte	.LVL88
-	.4byte	0x141cf
+	.4byte	0x14256
 	.uleb128 0x4e
 	.8byte	.LVL90
-	.4byte	0x14090
+	.4byte	0x1410b
 	.uleb128 0x4e
 	.8byte	.LVL97
-	.4byte	0x14084
+	.4byte	0x140ff
 	.uleb128 0x4e
 	.8byte	.LVL111
-	.4byte	0x141db
+	.4byte	0x14262
 	.uleb128 0x4e
 	.8byte	.LVL112
-	.4byte	0x14090
+	.4byte	0x1410b
 	.uleb128 0x4e
 	.8byte	.LVL113
-	.4byte	0x140e4
+	.4byte	0x1415f
 	.uleb128 0x4e
 	.8byte	.LVL123
-	.4byte	0x141e7
+	.4byte	0x1426e
 	.uleb128 0x4e
 	.8byte	.LVL124
-	.4byte	0x1415e
+	.4byte	0x141e5
 	.uleb128 0x4e
 	.8byte	.LVL151
-	.4byte	0x13f9b
+	.4byte	0x14016
 	.uleb128 0x4e
 	.8byte	.LVL154
-	.4byte	0x13f9b
+	.4byte	0x14016
 	.uleb128 0x4e
 	.8byte	.LVL156
-	.4byte	0x14084
+	.4byte	0x140ff
 	.uleb128 0x4e
 	.8byte	.LVL158
-	.4byte	0x14084
+	.4byte	0x140ff
 	.uleb128 0x4e
 	.8byte	.LVL159
-	.4byte	0x140da
+	.4byte	0x14155
 	.uleb128 0x4e
 	.8byte	.LVL160
-	.4byte	0x1415e
+	.4byte	0x141e5
 	.uleb128 0x4e
 	.8byte	.LVL173
-	.4byte	0x14015
+	.4byte	0x14090
 	.uleb128 0x4e
 	.8byte	.LVL176
-	.4byte	0x14015
+	.4byte	0x14090
 	.uleb128 0x4e
 	.8byte	.LVL178
-	.4byte	0x14084
+	.4byte	0x140ff
 	.uleb128 0x4e
 	.8byte	.LVL179
-	.4byte	0x1415e
+	.4byte	0x141e5
 	.uleb128 0x4e
 	.8byte	.LVL187
-	.4byte	0x141c3
+	.4byte	0x1424a
 	.uleb128 0x4e
 	.8byte	.LVL221
-	.4byte	0x140e4
+	.4byte	0x1415f
 	.uleb128 0x4e
 	.8byte	.LVL228
-	.4byte	0x14015
+	.4byte	0x14090
 	.uleb128 0x4e
 	.8byte	.LVL229
-	.4byte	0x14122
+	.4byte	0x1419d
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0x115a7
+	.4byte	0x1162a
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xa
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x11597
+	.4byte	0x1161a
 	.uleb128 0x62
-	.4byte	.LASF3066
+	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x593
+	.2byte	0x591
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x115d6
+	.4byte	0x11659
 	.uleb128 0x64
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x593
+	.2byte	0x591
 	.4byte	0xe13f
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x595
+	.2byte	0x593
 	.4byte	0xa55b
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3068
+	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0x58d
+	.2byte	0x58b
 	.8byte	.LFB2828
 	.8byte	.LFE2828-.LFB2828
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11610
+	.4byte	0x11693
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x58d
+	.2byte	0x58b
 	.4byte	0x31bd
 	.4byte	.LLST68
 	.uleb128 0x4e
 	.8byte	.LVL242
-	.4byte	0x12018
+	.4byte	0x1208e
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3069
+	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0x581
+	.2byte	0x57f
 	.8byte	.LFB2827
 	.8byte	.LFE2827-.LFB2827
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11670
+	.4byte	0x116f3
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x581
+	.2byte	0x57f
 	.4byte	0x31bd
 	.4byte	.LLST8
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x583
-	.4byte	0xe72c
+	.2byte	0x581
+	.4byte	0xe742
 	.uleb128 0x5e
-	.4byte	0x12fc5
+	.4byte	0x13040
 	.8byte	.LBB930
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.2byte	0x587
+	.2byte	0x585
 	.uleb128 0x54
-	.4byte	0x12fd1
+	.4byte	0x1304c
 	.uleb128 0x4e
 	.8byte	.LVL41
-	.4byte	0x141f3
+	.4byte	0x1427a
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3070
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x571
+	.2byte	0x56f
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1169a
+	.4byte	0x1171d
 	.uleb128 0x64
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x571
+	.2byte	0x56f
 	.4byte	0xe13f
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x573
+	.2byte	0x571
 	.4byte	0xe418
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3071
+	.4byte	.LASF3073
 	.byte	0x1
 	.2byte	0x443
 	.4byte	0xc6
@@ -41459,44 +41565,44 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2825-.LFB2825
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11e40
+	.4byte	0x11eb6
 	.uleb128 0x51
 	.string	"ptr"
 	.byte	0x1
 	.2byte	0x443
 	.4byte	0x443
-	.4byte	.LLST176
+	.4byte	.LLST179
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x445
 	.4byte	0xe47d
-	.4byte	.LLST177
+	.4byte	.LLST180
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x446
-	.4byte	0xe72c
+	.4byte	0xe742
 	.uleb128 0x68
 	.string	"buf"
 	.byte	0x1
 	.2byte	0x447
 	.4byte	0xe418
-	.4byte	.LLST178
+	.4byte	.LLST181
 	.uleb128 0x59
-	.4byte	.LASF3072
+	.4byte	.LASF3074
 	.byte	0x1
 	.2byte	0x448
 	.4byte	0xc6
-	.4byte	.LLST179
+	.4byte	.LLST182
 	.uleb128 0x59
 	.4byte	.LASF2968
 	.byte	0x1
 	.2byte	0x449
 	.4byte	0xc6
-	.4byte	.LLST180
+	.4byte	.LLST183
 	.uleb128 0x4c
-	.4byte	.LASF3073
+	.4byte	.LASF3075
 	.byte	0x1
 	.2byte	0x44a
 	.4byte	0xd8d1
@@ -41504,556 +41610,553 @@ __exitcall_ebc_exit:
 	.byte	0x91
 	.sleb128 -72
 	.uleb128 0x59
-	.4byte	.LASF3074
+	.4byte	.LASF3076
 	.byte	0x1
 	.2byte	0x44b
 	.4byte	0xe418
-	.4byte	.LLST181
+	.4byte	.LLST184
 	.uleb128 0x6b
-	.4byte	.LASF3076
+	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0x541
-	.8byte	.L690
+	.2byte	0x53f
+	.8byte	.L702
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x10e0
-	.4byte	0x117ea
+	.4byte	.Ldebug_ranges0+0x1200
+	.4byte	0x1186d
 	.uleb128 0x46
-	.4byte	.LASF3063
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x48a
+	.2byte	0x489
 	.4byte	0xc6
 	.uleb128 0x56
-	.8byte	.LBB1811
-	.8byte	.LBE1811-.LBB1811
+	.8byte	.LBB1827
+	.8byte	.LBE1827-.LBB1827
 	.uleb128 0x6b
-	.4byte	.LASF3075
+	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x48a
-	.8byte	.L672
+	.2byte	0x489
+	.8byte	.L685
 	.uleb128 0x4c
-	.4byte	.LASF3064
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x48a
+	.2byte	0x489
 	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3063
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x48a
+	.2byte	0x489
 	.4byte	0x194
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x1110
-	.4byte	0x117ce
+	.4byte	.Ldebug_ranges0+0x1230
+	.4byte	0x11851
 	.uleb128 0x59
-	.4byte	.LASF3065
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x48a
+	.2byte	0x489
 	.4byte	0x194
-	.4byte	.LLST184
+	.4byte	.LLST198
 	.uleb128 0x4e
-	.8byte	.LVL820
-	.4byte	0x14177
+	.8byte	.LVL840
+	.4byte	0x141fe
 	.uleb128 0x4e
-	.8byte	.LVL821
-	.4byte	0x14183
+	.8byte	.LVL841
+	.4byte	0x1420a
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL818
-	.4byte	0x14190
+	.8byte	.LVL838
+	.4byte	0x14217
 	.uleb128 0x4e
-	.8byte	.LVL822
-	.4byte	0x1419c
+	.8byte	.LVL842
+	.4byte	0x14223
 	.byte	0
 	.byte	0
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x1140
-	.4byte	0x1188c
+	.4byte	.Ldebug_ranges0+0x11a0
+	.4byte	0x1190f
 	.uleb128 0x46
-	.4byte	.LASF3063
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x530
+	.2byte	0x52e
 	.4byte	0xc6
 	.uleb128 0x56
-	.8byte	.LBB1815
-	.8byte	.LBE1815-.LBB1815
+	.8byte	.LBB1823
+	.8byte	.LBE1823-.LBB1823
 	.uleb128 0x6b
-	.4byte	.LASF3075
+	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x530
-	.8byte	.L727
+	.2byte	0x52e
+	.8byte	.L739
 	.uleb128 0x4c
-	.4byte	.LASF3064
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x530
+	.2byte	0x52e
 	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3063
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x530
+	.2byte	0x52e
 	.4byte	0x194
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x1170
-	.4byte	0x11870
+	.4byte	.Ldebug_ranges0+0x11d0
+	.4byte	0x118f3
 	.uleb128 0x59
-	.4byte	.LASF3065
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x530
+	.2byte	0x52e
 	.4byte	0x194
-	.4byte	.LLST185
+	.4byte	.LLST197
 	.uleb128 0x4e
-	.8byte	.LVL834
-	.4byte	0x14177
+	.8byte	.LVL831
+	.4byte	0x141fe
 	.uleb128 0x4e
-	.8byte	.LVL835
-	.4byte	0x14183
+	.8byte	.LVL832
+	.4byte	0x1420a
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL832
-	.4byte	0x14190
+	.8byte	.LVL829
+	.4byte	0x14217
 	.uleb128 0x4e
-	.8byte	.LVL836
-	.4byte	0x1419c
+	.8byte	.LVL833
+	.4byte	0x14223
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1805
-	.8byte	.LBE1805-.LBB1805
-	.4byte	0x1193e
+	.8byte	.LBB1809
+	.8byte	.LBE1809-.LBB1809
+	.4byte	0x119c1
 	.uleb128 0x46
-	.4byte	.LASF3063
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x55d
+	.2byte	0x55b
 	.4byte	0xc6
 	.uleb128 0x56
-	.8byte	.LBB1806
-	.8byte	.LBE1806-.LBB1806
+	.8byte	.LBB1810
+	.8byte	.LBE1810-.LBB1810
 	.uleb128 0x72
-	.4byte	.LASF3075
+	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x55d
+	.2byte	0x55b
 	.uleb128 0x4c
-	.4byte	.LASF3064
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x55d
+	.2byte	0x55b
 	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3063
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x55d
+	.2byte	0x55b
 	.4byte	0x194
 	.uleb128 0x6c
-	.8byte	.LBB1807
-	.8byte	.LBE1807-.LBB1807
-	.4byte	0x11922
+	.8byte	.LBB1811
+	.8byte	.LBE1811-.LBB1811
+	.4byte	0x119a5
 	.uleb128 0x59
-	.4byte	.LASF3065
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x55d
+	.2byte	0x55b
 	.4byte	0x194
-	.4byte	.LLST183
+	.4byte	.LLST186
 	.uleb128 0x4e
-	.8byte	.LVL765
-	.4byte	0x14177
+	.8byte	.LVL759
+	.4byte	0x141fe
 	.uleb128 0x4e
-	.8byte	.LVL766
-	.4byte	0x14183
+	.8byte	.LVL760
+	.4byte	0x1420a
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL763
-	.4byte	0x14190
+	.8byte	.LVL757
+	.4byte	0x14217
 	.uleb128 0x4e
-	.8byte	.LVL767
-	.4byte	0x1419c
+	.8byte	.LVL761
+	.4byte	0x14223
 	.byte	0
 	.byte	0
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x1020
-	.4byte	0x119d4
+	.4byte	.Ldebug_ranges0+0x1080
+	.4byte	0x11a57
 	.uleb128 0x46
-	.4byte	.LASF3063
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x569
+	.2byte	0x567
 	.4byte	0xc6
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0x1020
+	.4byte	.Ldebug_ranges0+0x1080
 	.uleb128 0x6b
-	.4byte	.LASF3075
+	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x569
-	.8byte	.L743
+	.2byte	0x567
+	.8byte	.L755
 	.uleb128 0x4c
-	.4byte	.LASF3064
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x569
+	.2byte	0x567
 	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3063
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x569
+	.2byte	0x567
 	.4byte	0x194
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x1060
-	.4byte	0x119b8
+	.4byte	.Ldebug_ranges0+0x10c0
+	.4byte	0x11a3b
 	.uleb128 0x59
-	.4byte	.LASF3065
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x569
+	.2byte	0x567
 	.4byte	0x194
-	.4byte	.LLST182
+	.4byte	.LLST185
 	.uleb128 0x4e
-	.8byte	.LVL720
-	.4byte	0x14177
+	.8byte	.LVL725
+	.4byte	0x141fe
 	.uleb128 0x4e
-	.8byte	.LVL721
-	.4byte	0x14183
+	.8byte	.LVL726
+	.4byte	0x1420a
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL718
-	.4byte	0x14190
+	.8byte	.LVL723
+	.4byte	0x14217
 	.uleb128 0x4e
-	.8byte	.LVL722
-	.4byte	0x1419c
+	.8byte	.LVL727
+	.4byte	0x14223
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x11e40
-	.8byte	.LBB1799
-	.4byte	.Ldebug_ranges0+0x10a0
+	.4byte	0x11eb6
+	.8byte	.LBB1803
+	.4byte	.Ldebug_ranges0+0x1100
 	.byte	0x1
-	.2byte	0x505
-	.4byte	0x11a25
+	.2byte	0x503
+	.4byte	0x11aa8
 	.uleb128 0x54
-	.4byte	0x11e69
+	.4byte	0x11edf
 	.uleb128 0x54
-	.4byte	0x11e5d
+	.4byte	0x11ed3
 	.uleb128 0x54
-	.4byte	0x11e51
+	.4byte	0x11ec7
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0x10a0
+	.4byte	.Ldebug_ranges0+0x1100
 	.uleb128 0x57
-	.4byte	0x11e75
+	.4byte	0x11eeb
 	.uleb128 0x57
-	.4byte	0x11e7f
+	.4byte	0x11ef5
 	.uleb128 0x57
-	.4byte	0x11e8b
+	.4byte	0x11f01
 	.uleb128 0x57
-	.4byte	0x11e97
+	.4byte	0x11f0d
 	.uleb128 0x57
-	.4byte	0x11ea3
+	.4byte	0x11f19
 	.uleb128 0x57
-	.4byte	0x11eaf
+	.4byte	0x11f25
 	.uleb128 0x73
-	.4byte	0x11ebb
+	.4byte	0x11f31
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12ccb
-	.8byte	.LBB1808
-	.8byte	.LBE1808-.LBB1808
+	.4byte	0x12d46
+	.8byte	.LBB1812
+	.8byte	.LBE1812-.LBB1812
 	.byte	0x1
-	.2byte	0x566
-	.4byte	0x11a70
+	.2byte	0x564
+	.4byte	0x11af3
 	.uleb128 0x54
-	.4byte	0x12ce6
+	.4byte	0x12d61
 	.uleb128 0x54
-	.4byte	0x12cdb
+	.4byte	0x12d56
 	.uleb128 0x56
-	.8byte	.LBB1809
-	.8byte	.LBE1809-.LBB1809
+	.8byte	.LBB1813
+	.8byte	.LBE1813-.LBB1813
 	.uleb128 0x57
-	.4byte	0x12cf1
+	.4byte	0x12d6c
 	.uleb128 0x4e
-	.8byte	.LVL768
-	.4byte	0x13e13
+	.8byte	.LVL762
+	.4byte	0x13e8e
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12971
-	.8byte	.LBB1818
-	.4byte	.Ldebug_ranges0+0x11a0
+	.4byte	0x129ec
+	.8byte	.LBB1814
+	.4byte	.Ldebug_ranges0+0x1140
 	.byte	0x1
-	.2byte	0x4a7
-	.4byte	0x11b36
+	.2byte	0x4a6
+	.4byte	0x11bb9
 	.uleb128 0x54
-	.4byte	0x129ae
+	.4byte	0x12a29
 	.uleb128 0x54
-	.4byte	0x129ae
+	.4byte	0x12a29
 	.uleb128 0x54
-	.4byte	0x129ae
+	.4byte	0x12a29
 	.uleb128 0x54
-	.4byte	0x129ba
+	.4byte	0x12a35
 	.uleb128 0x54
-	.4byte	0x129a2
+	.4byte	0x12a1d
 	.uleb128 0x54
-	.4byte	0x12996
+	.4byte	0x12a11
 	.uleb128 0x54
-	.4byte	0x1298a
+	.4byte	0x12a05
 	.uleb128 0x54
-	.4byte	0x1297e
+	.4byte	0x129f9
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0x11a0
-	.uleb128 0x57
-	.4byte	0x129c6
-	.uleb128 0x5f
-	.4byte	0x129d2
-	.4byte	.LLST186
+	.4byte	.Ldebug_ranges0+0x1140
 	.uleb128 0x57
-	.4byte	0x129de
+	.4byte	0x12a41
 	.uleb128 0x5f
-	.4byte	0x129ea
+	.4byte	0x12a4d
 	.4byte	.LLST187
+	.uleb128 0x57
+	.4byte	0x12a59
 	.uleb128 0x5f
-	.4byte	0x129f6
+	.4byte	0x12a65
 	.4byte	.LLST188
+	.uleb128 0x5f
+	.4byte	0x12a71
+	.4byte	.LLST189
 	.uleb128 0x57
-	.4byte	0x12a02
+	.4byte	0x12a7d
 	.uleb128 0x57
-	.4byte	0x12a0e
+	.4byte	0x12a89
 	.uleb128 0x57
-	.4byte	0x12a1a
+	.4byte	0x12a95
 	.uleb128 0x5f
-	.4byte	0x12a26
-	.4byte	.LLST189
+	.4byte	0x12aa1
+	.4byte	.LLST190
 	.uleb128 0x57
-	.4byte	0x12a32
+	.4byte	0x12aad
 	.uleb128 0x5f
-	.4byte	0x12a3e
-	.4byte	.LLST190
+	.4byte	0x12ab9
+	.4byte	.LLST191
 	.uleb128 0x60
-	.4byte	0x12a4a
+	.4byte	0x12ac5
 	.uleb128 0x1
 	.byte	0x5e
 	.uleb128 0x5f
-	.4byte	0x12a54
-	.4byte	.LLST191
-	.uleb128 0x5f
-	.4byte	0x12a5e
+	.4byte	0x12acf
 	.4byte	.LLST192
 	.uleb128 0x5f
-	.4byte	0x12a6a
+	.4byte	0x12ad9
 	.4byte	.LLST193
 	.uleb128 0x5f
-	.4byte	0x12a76
+	.4byte	0x12ae5
 	.4byte	.LLST194
 	.uleb128 0x5f
-	.4byte	0x12a82
+	.4byte	0x12af1
 	.4byte	.LLST195
+	.uleb128 0x5f
+	.4byte	0x12afd
+	.4byte	.LLST196
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12ccb
-	.8byte	.LBB1830
-	.8byte	.LBE1830-.LBB1830
+	.4byte	0x12d46
+	.8byte	.LBB1834
+	.8byte	.LBE1834-.LBB1834
 	.byte	0x1
 	.2byte	0x450
-	.4byte	0x11b81
+	.4byte	0x11c04
 	.uleb128 0x54
-	.4byte	0x12ce6
+	.4byte	0x12d61
 	.uleb128 0x54
-	.4byte	0x12cdb
+	.4byte	0x12d56
 	.uleb128 0x56
-	.8byte	.LBB1831
-	.8byte	.LBE1831-.LBB1831
+	.8byte	.LBB1835
+	.8byte	.LBE1835-.LBB1835
 	.uleb128 0x57
-	.4byte	0x12cf1
+	.4byte	0x12d6c
 	.uleb128 0x4e
-	.8byte	.LVL839
-	.4byte	0x13e13
+	.8byte	.LVL846
+	.4byte	0x13e8e
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL705
-	.4byte	0x141ff
-	.uleb128 0x4e
-	.8byte	.LVL706
-	.4byte	0x1420b
-	.uleb128 0x4e
-	.8byte	.LVL707
-	.4byte	0x141c3
-	.uleb128 0x4e
-	.8byte	.LVL726
-	.4byte	0x14217
-	.uleb128 0x4e
-	.8byte	.LVL727
-	.4byte	0x140da
+	.8byte	.LVL710
+	.4byte	0x14286
 	.uleb128 0x4e
-	.8byte	.LVL728
-	.4byte	0x1420b
+	.8byte	.LVL711
+	.4byte	0x14292
 	.uleb128 0x4e
-	.8byte	.LVL729
-	.4byte	0x141c3
+	.8byte	.LVL712
+	.4byte	0x1424a
 	.uleb128 0x4e
 	.8byte	.LVL730
-	.4byte	0x12be6
+	.4byte	0x140f3
 	.uleb128 0x4e
 	.8byte	.LVL731
-	.4byte	0x14223
+	.4byte	0x14016
 	.uleb128 0x4e
 	.8byte	.LVL732
-	.4byte	0x13f9b
+	.4byte	0x1429e
 	.uleb128 0x4e
 	.8byte	.LVL733
-	.4byte	0x12293
+	.4byte	0x14155
 	.uleb128 0x4e
-	.8byte	.LVL736
-	.4byte	0x1422f
+	.8byte	.LVL734
+	.4byte	0x14155
 	.uleb128 0x4e
-	.8byte	.LVL737
-	.4byte	0x13f9b
+	.8byte	.LVL735
+	.4byte	0x142aa
 	.uleb128 0x4e
-	.8byte	.LVL739
-	.4byte	0x14078
+	.8byte	.LVL736
+	.4byte	0x11f3a
 	.uleb128 0x4e
-	.8byte	.LVL740
-	.4byte	0x13f9b
+	.8byte	.LVL738
+	.4byte	0x14016
 	.uleb128 0x4e
-	.8byte	.LVL741
-	.4byte	0x14217
+	.8byte	.LVL739
+	.4byte	0x1230e
 	.uleb128 0x4e
 	.8byte	.LVL742
-	.4byte	0x140da
+	.4byte	0x14016
 	.uleb128 0x4e
 	.8byte	.LVL743
-	.4byte	0x140da
+	.4byte	0x1415f
 	.uleb128 0x4e
 	.8byte	.LVL744
-	.4byte	0x14223
+	.4byte	0x14292
 	.uleb128 0x4e
-	.8byte	.LVL745
-	.4byte	0x11ec4
+	.8byte	.LVL746
+	.4byte	0x1424a
 	.uleb128 0x4e
-	.8byte	.LVL747
-	.4byte	0x13f9b
+	.8byte	.LVL751
+	.4byte	0x14016
 	.uleb128 0x4e
-	.8byte	.LVL748
-	.4byte	0x12293
+	.8byte	.LVL753
+	.4byte	0x11f3a
 	.uleb128 0x4e
-	.8byte	.LVL751
-	.4byte	0x13f9b
+	.8byte	.LVL754
+	.4byte	0x14090
 	.uleb128 0x4e
-	.8byte	.LVL752
-	.4byte	0x140e4
+	.8byte	.LVL756
+	.4byte	0x14292
 	.uleb128 0x4e
-	.8byte	.LVL753
-	.4byte	0x1420b
+	.8byte	.LVL766
+	.4byte	0x1429e
 	.uleb128 0x4e
-	.8byte	.LVL755
-	.4byte	0x141c3
+	.8byte	.LVL767
+	.4byte	0x14155
 	.uleb128 0x4e
-	.8byte	.LVL758
-	.4byte	0x13f9b
+	.8byte	.LVL768
+	.4byte	0x14292
 	.uleb128 0x4e
-	.8byte	.LVL760
-	.4byte	0x1420b
+	.8byte	.LVL769
+	.4byte	0x1424a
+	.uleb128 0x4e
+	.8byte	.LVL770
+	.4byte	0x12c61
 	.uleb128 0x4e
 	.8byte	.LVL771
-	.4byte	0x11ec4
+	.4byte	0x142aa
 	.uleb128 0x4e
 	.8byte	.LVL772
-	.4byte	0x14015
+	.4byte	0x14016
 	.uleb128 0x4e
 	.8byte	.LVL773
-	.4byte	0x13f9b
+	.4byte	0x1230e
 	.uleb128 0x4e
-	.8byte	.LVL776
-	.4byte	0x13f9b
+	.8byte	.LVL774
+	.4byte	0x14090
 	.uleb128 0x4e
-	.8byte	.LVL777
-	.4byte	0x14015
+	.8byte	.LVL793
+	.4byte	0x14016
 	.uleb128 0x4e
-	.8byte	.LVL779
-	.4byte	0x13ed1
+	.8byte	.LVL794
+	.4byte	0x1230e
 	.uleb128 0x4e
-	.8byte	.LVL780
-	.4byte	0x11ec4
+	.8byte	.LVL795
+	.4byte	0x140f3
 	.uleb128 0x4e
-	.8byte	.LVL781
-	.4byte	0x13f9b
+	.8byte	.LVL798
+	.4byte	0x140f3
 	.uleb128 0x4e
-	.8byte	.LVL782
-	.4byte	0x12293
+	.8byte	.LVL800
+	.4byte	0x13f4c
 	.uleb128 0x4e
-	.8byte	.LVL783
-	.4byte	0x14078
+	.8byte	.LVL801
+	.4byte	0x14016
 	.uleb128 0x4e
-	.8byte	.LVL786
-	.4byte	0x14078
+	.8byte	.LVL804
+	.4byte	0x14016
 	.uleb128 0x4e
-	.8byte	.LVL787
-	.4byte	0x140da
+	.8byte	.LVL811
+	.4byte	0x11f3a
 	.uleb128 0x4e
-	.8byte	.LVL788
-	.4byte	0x140da
+	.8byte	.LVL815
+	.4byte	0x142b6
 	.uleb128 0x4e
-	.8byte	.LVL789
-	.4byte	0x140da
+	.8byte	.LVL816
+	.4byte	0x14016
 	.uleb128 0x4e
-	.8byte	.LVL810
-	.4byte	0x13f9b
+	.8byte	.LVL819
+	.4byte	0x14016
 	.uleb128 0x4e
-	.8byte	.LVL811
-	.4byte	0x1422f
+	.8byte	.LVL820
+	.4byte	0x142b6
 	.uleb128 0x4e
-	.8byte	.LVL812
-	.4byte	0x140e4
+	.8byte	.LVL821
+	.4byte	0x1415f
 	.uleb128 0x4e
-	.8byte	.LVL813
-	.4byte	0x140da
+	.8byte	.LVL822
+	.4byte	0x14155
 	.uleb128 0x4e
-	.8byte	.LVL814
-	.4byte	0x12b1f
+	.8byte	.LVL823
+	.4byte	0x14155
 	.uleb128 0x4e
-	.8byte	.LVL815
-	.4byte	0x13ed1
+	.8byte	.LVL824
+	.4byte	0x14155
 	.uleb128 0x4e
-	.8byte	.LVL816
-	.4byte	0x14015
+	.8byte	.LVL827
+	.4byte	0x14016
 	.uleb128 0x4e
-	.8byte	.LVL829
-	.4byte	0x11ec4
+	.8byte	.LVL828
+	.4byte	0x12b9a
 	.uleb128 0x4e
-	.8byte	.LVL837
-	.4byte	0x13f9b
+	.8byte	.LVL835
+	.4byte	0x13f4c
 	.uleb128 0x4e
-	.8byte	.LVL841
-	.4byte	0x13ed1
+	.8byte	.LVL844
+	.4byte	0x14155
 	.uleb128 0x4e
-	.8byte	.LVL843
-	.4byte	0x13ed1
+	.8byte	.LVL848
+	.4byte	0x14090
 	.uleb128 0x4e
-	.8byte	.LVL845
-	.4byte	0x14122
+	.8byte	.LVL849
+	.4byte	0x13f4c
+	.uleb128 0x4e
+	.8byte	.LVL850
+	.4byte	0x13f4c
+	.uleb128 0x4e
+	.8byte	.LVL852
+	.4byte	0x1419d
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3077
+	.4byte	.LASF3079
 	.byte	0x1
 	.2byte	0x42c
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11ec4
+	.4byte	0x11f3a
 	.uleb128 0x64
-	.4byte	.LASF3078
+	.4byte	.LASF3080
 	.byte	0x1
 	.2byte	0x42c
 	.4byte	0x4669
 	.uleb128 0x64
-	.4byte	.LASF3079
+	.4byte	.LASF3081
 	.byte	0x1
 	.2byte	0x42c
 	.4byte	0x4669
 	.uleb128 0x64
-	.4byte	.LASF3080
+	.4byte	.LASF3082
 	.byte	0x1
 	.2byte	0x42c
 	.4byte	0xc6
@@ -42063,37 +42166,37 @@ __exitcall_ebc_exit:
 	.2byte	0x42e
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3081
+	.4byte	.LASF3083
 	.byte	0x1
 	.2byte	0x42f
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3082
+	.4byte	.LASF3084
 	.byte	0x1
 	.2byte	0x42f
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3083
+	.4byte	.LASF3085
 	.byte	0x1
 	.2byte	0x430
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3084
+	.4byte	.LASF3086
 	.byte	0x1
 	.2byte	0x431
 	.4byte	0x466f
 	.uleb128 0x46
-	.4byte	.LASF3085
+	.4byte	.LASF3087
 	.byte	0x1
 	.2byte	0x432
 	.4byte	0x466f
 	.uleb128 0x72
-	.4byte	.LASF3086
+	.4byte	.LASF3088
 	.byte	0x1
 	.2byte	0x43f
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3087
+	.4byte	.LASF3089
 	.byte	0x1
 	.2byte	0x3d2
 	.4byte	0xc6
@@ -42101,7 +42204,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2823-.LFB2823
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12018
+	.4byte	0x1208e
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
@@ -42112,9 +42215,9 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x3d4
-	.4byte	0xe72c
+	.4byte	0xe742
 	.uleb128 0x59
-	.4byte	.LASF3088
+	.4byte	.LASF3090
 	.byte	0x1
 	.2byte	0x3d5
 	.4byte	0xc6
@@ -42127,80 +42230,80 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x64
 	.uleb128 0x53
-	.4byte	0x12f40
+	.4byte	0x12fbb
 	.8byte	.LBB1204
 	.8byte	.LBE1204-.LBB1204
 	.byte	0x1
 	.2byte	0x3d9
-	.4byte	0x11f47
+	.4byte	0x11fbd
 	.uleb128 0x54
-	.4byte	0x12f5b
+	.4byte	0x12fd6
 	.uleb128 0x54
-	.4byte	0x12f50
+	.4byte	0x12fcb
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL248
-	.4byte	0x13f9b
+	.4byte	0x14016
 	.uleb128 0x4e
 	.8byte	.LVL249
-	.4byte	0x1423b
+	.4byte	0x142c2
 	.uleb128 0x4e
 	.8byte	.LVL253
-	.4byte	0x14015
+	.4byte	0x14090
 	.uleb128 0x4e
 	.8byte	.LVL254
-	.4byte	0x13f9b
+	.4byte	0x14016
 	.uleb128 0x4e
 	.8byte	.LVL256
-	.4byte	0x1423b
+	.4byte	0x142c2
 	.uleb128 0x4e
 	.8byte	.LVL257
-	.4byte	0x14015
+	.4byte	0x14090
 	.uleb128 0x4e
 	.8byte	.LVL258
-	.4byte	0x1423b
+	.4byte	0x142c2
 	.uleb128 0x4e
 	.8byte	.LVL259
-	.4byte	0x1423b
+	.4byte	0x142c2
 	.uleb128 0x4e
 	.8byte	.LVL260
-	.4byte	0x1423b
+	.4byte	0x142c2
 	.uleb128 0x4e
 	.8byte	.LVL261
-	.4byte	0x1423b
+	.4byte	0x142c2
 	.uleb128 0x4e
 	.8byte	.LVL262
-	.4byte	0x1423b
+	.4byte	0x142c2
 	.uleb128 0x4e
 	.8byte	.LVL263
-	.4byte	0x1423b
+	.4byte	0x142c2
 	.uleb128 0x4e
 	.8byte	.LVL264
-	.4byte	0x1423b
+	.4byte	0x142c2
 	.uleb128 0x4e
 	.8byte	.LVL265
-	.4byte	0x1423b
+	.4byte	0x142c2
 	.uleb128 0x4e
 	.8byte	.LVL266
-	.4byte	0x13f9b
+	.4byte	0x14016
 	.uleb128 0x4e
 	.8byte	.LVL267
-	.4byte	0x14122
+	.4byte	0x1419d
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3089
+	.4byte	.LASF3091
 	.byte	0x1
 	.2byte	0x3ad
 	.8byte	.LFB2822
 	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x120d1
+	.4byte	0x12147
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x3af
-	.4byte	0xe72c
+	.4byte	0xe742
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
@@ -42208,37 +42311,37 @@ __exitcall_ebc_exit:
 	.4byte	0xe13f
 	.uleb128 0x4e
 	.8byte	.LVL231
-	.4byte	0x14046
+	.4byte	0x140c1
 	.uleb128 0x4e
 	.8byte	.LVL232
-	.4byte	0x13f9b
+	.4byte	0x14016
 	.uleb128 0x4e
 	.8byte	.LVL233
-	.4byte	0x140e4
+	.4byte	0x1415f
 	.uleb128 0x4e
 	.8byte	.LVL234
-	.4byte	0x140e4
+	.4byte	0x1415f
 	.uleb128 0x4e
 	.8byte	.LVL235
-	.4byte	0x13f9b
+	.4byte	0x14016
 	.uleb128 0x4e
 	.8byte	.LVL236
-	.4byte	0x13fff
+	.4byte	0x1407a
 	.uleb128 0x4e
 	.8byte	.LVL237
-	.4byte	0x14078
+	.4byte	0x140f3
 	.uleb128 0x4e
 	.8byte	.LVL238
-	.4byte	0x140e4
+	.4byte	0x1415f
 	.uleb128 0x4e
 	.8byte	.LVL239
-	.4byte	0x140e4
+	.4byte	0x1415f
 	.uleb128 0x4e
 	.8byte	.LVL240
-	.4byte	0x14046
+	.4byte	0x140c1
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3090
+	.4byte	.LASF3092
 	.byte	0x1
 	.2byte	0x36d
 	.4byte	0xc6
@@ -42246,13 +42349,13 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2821-.LFB2821
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12283
+	.4byte	0x122fe
 	.uleb128 0x58
 	.4byte	.LASF793
 	.byte	0x1
 	.2byte	0x36d
 	.4byte	0x443
-	.4byte	.LLST136
+	.4byte	.LLST139
 	.uleb128 0x69
 	.string	"ebc"
 	.byte	0x1
@@ -42269,17 +42372,17 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x371
-	.4byte	0xe72c
+	.4byte	0xe742
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xb30
-	.4byte	0x121bb
+	.4byte	0x12231
 	.uleb128 0x3f
 	.byte	0x8
 	.byte	0x1
 	.2byte	0x378
-	.4byte	0x12154
+	.4byte	0x121ca
 	.uleb128 0x41
-	.4byte	.LASF3091
+	.4byte	.LASF3093
 	.byte	0x1
 	.2byte	0x378
 	.4byte	0x19b
@@ -42287,29 +42390,29 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x1
 	.2byte	0x378
-	.4byte	0x12283
+	.4byte	0x122fe
 	.byte	0
 	.uleb128 0x52
 	.string	"__u"
 	.byte	0x1
 	.2byte	0x378
-	.4byte	0x12132
+	.4byte	0x121a8
 	.uleb128 0x5a
-	.4byte	0x13722
+	.4byte	0x1379d
 	.8byte	.LBB1386
 	.4byte	.Ldebug_ranges0+0xb70
 	.byte	0x1
 	.2byte	0x378
-	.4byte	0x12188
+	.4byte	0x121fe
 	.uleb128 0x54
-	.4byte	0x13745
+	.4byte	0x137c0
 	.uleb128 0x54
-	.4byte	0x13739
+	.4byte	0x137b4
 	.uleb128 0x54
-	.4byte	0x1372f
+	.4byte	0x137aa
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13582
+	.4byte	0x135fd
 	.8byte	.LBB1389
 	.8byte	.LBE1389-.LBB1389
 	.byte	0x1
@@ -42318,86 +42421,89 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1390
 	.8byte	.LBE1390-.LBB1390
 	.uleb128 0x60
-	.4byte	0x13592
+	.4byte	0x1360d
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x1341c
+	.uleb128 0x5a
+	.4byte	0x13497
 	.8byte	.LBB1394
-	.8byte	.LBE1394-.LBB1394
+	.4byte	.Ldebug_ranges0+0xba0
 	.byte	0x1
 	.2byte	0x3a4
-	.4byte	0x1220d
+	.4byte	0x12288
 	.uleb128 0x54
-	.4byte	0x1342d
-	.uleb128 0x5c
-	.4byte	0x1343a
+	.4byte	0x134a8
+	.uleb128 0x5e
+	.4byte	0x134b5
 	.8byte	.LBB1396
-	.8byte	.LBE1396-.LBB1396
+	.4byte	.Ldebug_ranges0+0xbd0
 	.byte	0xd
 	.2byte	0x240
 	.uleb128 0x54
-	.4byte	0x13456
+	.4byte	0x134d1
 	.uleb128 0x54
-	.4byte	0x1344b
+	.4byte	0x134c6
 	.uleb128 0x4e
-	.8byte	.LVL452
-	.4byte	0x14247
+	.8byte	.LVL455
+	.4byte	0x142ce
+	.uleb128 0x4e
+	.8byte	.LVL458
+	.4byte	0x142ce
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL446
-	.4byte	0x13d10
-	.uleb128 0x4e
-	.8byte	.LVL447
-	.4byte	0x14254
-	.uleb128 0x4e
-	.8byte	.LVL448
-	.4byte	0x14177
-	.uleb128 0x4e
 	.8byte	.LVL449
-	.4byte	0x1425e
+	.4byte	0x13d8b
 	.uleb128 0x4e
 	.8byte	.LVL450
-	.4byte	0x13d10
+	.4byte	0x142db
 	.uleb128 0x4e
 	.8byte	.LVL451
-	.4byte	0x12816
+	.4byte	0x141fe
+	.uleb128 0x4e
+	.8byte	.LVL452
+	.4byte	0x142e5
 	.uleb128 0x4e
 	.8byte	.LVL453
-	.4byte	0x13d10
+	.4byte	0x13d8b
 	.uleb128 0x4e
 	.8byte	.LVL454
-	.4byte	0x1262c
+	.4byte	0x12891
 	.uleb128 0x4e
-	.8byte	.LVL455
-	.4byte	0x12442
+	.8byte	.LVL456
+	.4byte	0x13d8b
+	.uleb128 0x4e
+	.8byte	.LVL457
+	.4byte	0x126a7
+	.uleb128 0x4e
+	.8byte	.LVL459
+	.4byte	0x124bd
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x12293
+	.4byte	0x1230e
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3092
+	.4byte	.LASF3094
 	.byte	0x1
 	.2byte	0x32d
 	.8byte	.LFB2820
 	.8byte	.LFE2820-.LFB2820
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x123e4
+	.4byte	0x1245f
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x32d
 	.4byte	0xe47d
-	.4byte	.LLST135
+	.4byte	.LLST138
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
@@ -42407,86 +42513,86 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x330
-	.4byte	0xe72c
+	.4byte	0xe742
 	.uleb128 0x55
-	.4byte	.LASF3023
+	.4byte	.LASF3024
 	.4byte	0xb92b
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34740
+	.8byte	__func__.34742
 	.uleb128 0x53
-	.4byte	0x123e4
+	.4byte	0x1245f
 	.8byte	.LBB1379
 	.8byte	.LBE1379-.LBB1379
 	.byte	0x1
 	.2byte	0x354
-	.4byte	0x12320
+	.4byte	0x1239b
 	.uleb128 0x54
-	.4byte	0x123fd
+	.4byte	0x12478
 	.uleb128 0x54
-	.4byte	0x123f1
+	.4byte	0x1246c
 	.uleb128 0x4e
-	.8byte	.LVL427
-	.4byte	0x13d10
+	.8byte	.LVL430
+	.4byte	0x13d8b
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x123e4
+	.4byte	0x1245f
 	.8byte	.LBB1381
 	.8byte	.LBE1381-.LBB1381
 	.byte	0x1
 	.2byte	0x361
-	.4byte	0x12354
+	.4byte	0x123cf
 	.uleb128 0x54
-	.4byte	0x123fd
+	.4byte	0x12478
 	.uleb128 0x54
-	.4byte	0x123f1
+	.4byte	0x1246c
 	.uleb128 0x4e
-	.8byte	.LVL432
-	.4byte	0x13d10
+	.8byte	.LVL435
+	.4byte	0x13d8b
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x123e4
+	.4byte	0x1245f
 	.8byte	.LBB1383
 	.8byte	.LBE1383-.LBB1383
 	.byte	0x1
 	.2byte	0x33b
-	.4byte	0x12388
+	.4byte	0x12403
 	.uleb128 0x54
-	.4byte	0x123fd
+	.4byte	0x12478
 	.uleb128 0x54
-	.4byte	0x123f1
+	.4byte	0x1246c
 	.uleb128 0x4e
-	.8byte	.LVL437
-	.4byte	0x13d10
+	.8byte	.LVL440
+	.4byte	0x13d8b
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL426
-	.4byte	0x12442
-	.uleb128 0x4e
-	.8byte	.LVL428
-	.4byte	0x12442
+	.8byte	.LVL429
+	.4byte	0x124bd
 	.uleb128 0x4e
 	.8byte	.LVL431
-	.4byte	0x1262c
+	.4byte	0x124bd
 	.uleb128 0x4e
-	.8byte	.LVL433
-	.4byte	0x1262c
+	.8byte	.LVL434
+	.4byte	0x126a7
 	.uleb128 0x4e
 	.8byte	.LVL436
-	.4byte	0x12816
+	.4byte	0x126a7
 	.uleb128 0x4e
-	.8byte	.LVL438
-	.4byte	0x12816
+	.8byte	.LVL439
+	.4byte	0x12891
 	.uleb128 0x4e
 	.8byte	.LVL441
-	.4byte	0x1426a
+	.4byte	0x12891
+	.uleb128 0x4e
+	.8byte	.LVL444
+	.4byte	0x142f1
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3094
+	.4byte	.LASF3096
 	.byte	0x1
 	.2byte	0x327
 	.byte	0x1
-	.4byte	0x1240a
+	.4byte	0x12485
 	.uleb128 0x64
 	.4byte	.LASF2998
 	.byte	0x1
@@ -42496,14 +42602,14 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x327
-	.4byte	0xe72c
+	.4byte	0xe742
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3095
+	.4byte	.LASF3097
 	.byte	0x1
 	.2byte	0x31c
 	.byte	0x1
-	.4byte	0x1243c
+	.4byte	0x124b7
 	.uleb128 0x64
 	.4byte	.LASF2998
 	.byte	0x1
@@ -42513,34 +42619,34 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x31c
-	.4byte	0xe72c
+	.4byte	0xe742
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
 	.2byte	0x31e
-	.4byte	0x1243c
+	.4byte	0x124b7
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xdec9
 	.uleb128 0x65
-	.4byte	.LASF3096
+	.4byte	.LASF3098
 	.byte	0x1
 	.2byte	0x312
 	.byte	0x1
-	.4byte	0x12480
+	.4byte	0x124fb
 	.uleb128 0x64
-	.4byte	.LASF3097
+	.4byte	.LASF3099
 	.byte	0x1
 	.2byte	0x312
 	.4byte	0xc0ad
 	.uleb128 0x64
-	.4byte	.LASF3098
+	.4byte	.LASF3100
 	.byte	0x1
 	.2byte	0x313
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3099
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x313
 	.4byte	0xaab
@@ -42548,26 +42654,26 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x314
-	.4byte	0xe72c
+	.4byte	0xe742
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3100
+	.4byte	.LASF3102
 	.byte	0x1
 	.2byte	0x2e8
 	.byte	0x1
-	.4byte	0x12556
+	.4byte	0x125d1
 	.uleb128 0x64
-	.4byte	.LASF3097
+	.4byte	.LASF3099
 	.byte	0x1
 	.2byte	0x2e8
 	.4byte	0xc0ad
 	.uleb128 0x64
-	.4byte	.LASF3098
+	.4byte	.LASF3100
 	.byte	0x1
 	.2byte	0x2e9
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3099
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x2e9
 	.4byte	0xaab
@@ -42575,34 +42681,34 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x2ea
-	.4byte	0xe72c
+	.4byte	0xe742
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
 	.2byte	0x2ec
 	.4byte	0xe13f
 	.uleb128 0x46
-	.4byte	.LASF3101
+	.4byte	.LASF3103
 	.byte	0x1
 	.2byte	0x2ed
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3102
+	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x2ed
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3103
+	.4byte	.LASF3105
 	.byte	0x1
 	.2byte	0x2ed
 	.4byte	0x466f
 	.uleb128 0x46
-	.4byte	.LASF3104
+	.4byte	.LASF3106
 	.byte	0x1
 	.2byte	0x2ed
 	.4byte	0x466f
 	.uleb128 0x46
-	.4byte	.LASF3105
+	.4byte	.LASF3107
 	.byte	0x1
 	.2byte	0x2ee
 	.4byte	0xc0ad
@@ -42627,7 +42733,7 @@ __exitcall_ebc_exit:
 	.2byte	0x2f0
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3106
+	.4byte	.LASF3108
 	.byte	0x1
 	.2byte	0x2f1
 	.4byte	0xc6
@@ -42643,23 +42749,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3107
+	.4byte	.LASF3109
 	.byte	0x1
 	.2byte	0x2bf
 	.byte	0x1
-	.4byte	0x1262c
+	.4byte	0x126a7
 	.uleb128 0x64
-	.4byte	.LASF3097
+	.4byte	.LASF3099
 	.byte	0x1
 	.2byte	0x2bf
 	.4byte	0xc0ad
 	.uleb128 0x64
-	.4byte	.LASF3098
+	.4byte	.LASF3100
 	.byte	0x1
 	.2byte	0x2c0
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3099
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x2c0
 	.4byte	0xaab
@@ -42667,34 +42773,34 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x2c1
-	.4byte	0xe72c
+	.4byte	0xe742
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
 	.2byte	0x2c3
 	.4byte	0xe13f
 	.uleb128 0x46
-	.4byte	.LASF3101
+	.4byte	.LASF3103
 	.byte	0x1
 	.2byte	0x2c4
 	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3102
+	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x2c4
 	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3103
+	.4byte	.LASF3105
 	.byte	0x1
 	.2byte	0x2c4
 	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3104
+	.4byte	.LASF3106
 	.byte	0x1
 	.2byte	0x2c4
 	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3105
+	.4byte	.LASF3107
 	.byte	0x1
 	.2byte	0x2c5
 	.4byte	0xc0ad
@@ -42719,7 +42825,7 @@ __exitcall_ebc_exit:
 	.2byte	0x2c7
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3106
+	.4byte	.LASF3108
 	.byte	0x1
 	.2byte	0x2c8
 	.4byte	0xc6
@@ -42735,23 +42841,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3108
+	.4byte	.LASF3110
 	.byte	0x1
 	.2byte	0x2b4
 	.byte	0x1
-	.4byte	0x1266a
+	.4byte	0x126e5
 	.uleb128 0x64
-	.4byte	.LASF3097
+	.4byte	.LASF3099
 	.byte	0x1
 	.2byte	0x2b4
 	.4byte	0xc0ad
 	.uleb128 0x64
-	.4byte	.LASF3098
+	.4byte	.LASF3100
 	.byte	0x1
 	.2byte	0x2b5
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3099
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x2b5
 	.4byte	0xaab
@@ -42759,26 +42865,26 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x2b6
-	.4byte	0xe72c
+	.4byte	0xe742
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3109
+	.4byte	.LASF3111
 	.byte	0x1
 	.2byte	0x290
 	.byte	0x1
-	.4byte	0x12740
+	.4byte	0x127bb
 	.uleb128 0x64
-	.4byte	.LASF3097
+	.4byte	.LASF3099
 	.byte	0x1
 	.2byte	0x290
 	.4byte	0xc0ad
 	.uleb128 0x64
-	.4byte	.LASF3098
+	.4byte	.LASF3100
 	.byte	0x1
 	.2byte	0x291
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3099
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x291
 	.4byte	0xaab
@@ -42786,7 +42892,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x292
-	.4byte	0xe72c
+	.4byte	0xe742
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
@@ -42813,32 +42919,32 @@ __exitcall_ebc_exit:
 	.2byte	0x297
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3101
+	.4byte	.LASF3103
 	.byte	0x1
 	.2byte	0x298
 	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3102
+	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x298
 	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3103
+	.4byte	.LASF3105
 	.byte	0x1
 	.2byte	0x298
 	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3104
+	.4byte	.LASF3106
 	.byte	0x1
 	.2byte	0x298
 	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3105
+	.4byte	.LASF3107
 	.byte	0x1
 	.2byte	0x299
 	.4byte	0xc0ad
 	.uleb128 0x46
-	.4byte	.LASF3106
+	.4byte	.LASF3108
 	.byte	0x1
 	.2byte	0x29a
 	.4byte	0xc6
@@ -42854,23 +42960,23 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3110
+	.4byte	.LASF3112
 	.byte	0x1
 	.2byte	0x269
 	.byte	0x1
-	.4byte	0x12816
+	.4byte	0x12891
 	.uleb128 0x64
-	.4byte	.LASF3097
+	.4byte	.LASF3099
 	.byte	0x1
 	.2byte	0x269
 	.4byte	0xc0ad
 	.uleb128 0x64
-	.4byte	.LASF3098
+	.4byte	.LASF3100
 	.byte	0x1
 	.2byte	0x26a
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3099
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x26a
 	.4byte	0xaab
@@ -42878,7 +42984,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x26b
-	.4byte	0xe72c
+	.4byte	0xe742
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
@@ -42905,32 +43011,32 @@ __exitcall_ebc_exit:
 	.2byte	0x270
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3101
+	.4byte	.LASF3103
 	.byte	0x1
 	.2byte	0x271
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3102
+	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x271
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3103
+	.4byte	.LASF3105
 	.byte	0x1
 	.2byte	0x271
 	.4byte	0x466f
 	.uleb128 0x46
-	.4byte	.LASF3104
+	.4byte	.LASF3106
 	.byte	0x1
 	.2byte	0x271
 	.4byte	0x466f
 	.uleb128 0x46
-	.4byte	.LASF3105
+	.4byte	.LASF3107
 	.byte	0x1
 	.2byte	0x272
 	.4byte	0xc0ad
 	.uleb128 0x46
-	.4byte	.LASF3106
+	.4byte	.LASF3108
 	.byte	0x1
 	.2byte	0x273
 	.4byte	0xc6
@@ -42946,37 +43052,37 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3111
+	.4byte	.LASF3113
 	.byte	0x1
 	.2byte	0x1c3
 	.8byte	.LFB2811
 	.8byte	.LFE2811-.LFB2811
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12971
+	.4byte	0x129ec
 	.uleb128 0x6a
-	.4byte	.LASF3097
+	.4byte	.LASF3099
 	.byte	0x1
 	.2byte	0x1c3
 	.4byte	0xc0ad
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6a
-	.4byte	.LASF3098
+	.4byte	.LASF3100
 	.byte	0x1
 	.2byte	0x1c3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x6a
-	.4byte	.LASF3099
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x1c3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x6a
-	.4byte	.LASF3112
+	.4byte	.LASF3114
 	.byte	0x1
 	.2byte	0x1c4
 	.4byte	0xc0ad
@@ -42986,7 +43092,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x1c4
-	.4byte	0xe72c
+	.4byte	0xe742
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x46
@@ -43019,33 +43125,33 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.4byte	.LLST1
 	.uleb128 0x59
-	.4byte	.LASF3101
+	.4byte	.LASF3103
 	.byte	0x1
 	.2byte	0x1cb
 	.4byte	0x13a
 	.4byte	.LLST2
 	.uleb128 0x59
-	.4byte	.LASF3102
+	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x1cb
 	.4byte	0x13a
 	.4byte	.LLST3
 	.uleb128 0x4c
-	.4byte	.LASF3103
+	.4byte	.LASF3105
 	.byte	0x1
 	.2byte	0x1cc
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4c
-	.4byte	.LASF3104
+	.4byte	.LASF3106
 	.byte	0x1
 	.2byte	0x1cc
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x59
-	.4byte	.LASF3105
+	.4byte	.LASF3107
 	.byte	0x1
 	.2byte	0x1cd
 	.4byte	0xc0ad
@@ -43058,14 +43164,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x4c
-	.4byte	.LASF3113
+	.4byte	.LASF3115
 	.byte	0x1
 	.2byte	0x1cf
 	.4byte	0xc0ad
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x46
-	.4byte	.LASF3114
+	.4byte	.LASF3116
 	.byte	0x1
 	.2byte	0x1d0
 	.4byte	0x10b
@@ -43080,45 +43186,45 @@ __exitcall_ebc_exit:
 	.2byte	0x1d2
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3115
+	.4byte	.LASF3117
 	.byte	0x1
 	.2byte	0x1d3
 	.4byte	0x10b
 	.uleb128 0x46
-	.4byte	.LASF3116
+	.4byte	.LASF3118
 	.byte	0x1
 	.2byte	0x1d3
 	.4byte	0x10b
 	.uleb128 0x59
-	.4byte	.LASF3117
+	.4byte	.LASF3119
 	.byte	0x1
 	.2byte	0x1d4
 	.4byte	0x13a
 	.4byte	.LLST5
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3118
+	.4byte	.LASF3120
 	.byte	0x1
 	.2byte	0x164
 	.byte	0x1
-	.4byte	0x12a8f
+	.4byte	0x12b0a
 	.uleb128 0x64
-	.4byte	.LASF3119
+	.4byte	.LASF3121
 	.byte	0x1
 	.2byte	0x164
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3120
+	.4byte	.LASF3122
 	.byte	0x1
 	.2byte	0x164
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3121
+	.4byte	.LASF3123
 	.byte	0x1
 	.2byte	0x164
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3112
+	.4byte	.LASF3114
 	.byte	0x1
 	.2byte	0x164
 	.4byte	0x466f
@@ -43126,7 +43232,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x165
-	.4byte	0xe72c
+	.4byte	0xe742
 	.uleb128 0x64
 	.4byte	.LASF2867
 	.byte	0x1
@@ -43143,47 +43249,47 @@ __exitcall_ebc_exit:
 	.2byte	0x167
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3122
+	.4byte	.LASF3124
 	.byte	0x1
 	.2byte	0x168
 	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3123
+	.4byte	.LASF3125
 	.byte	0x1
 	.2byte	0x168
 	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3124
+	.4byte	.LASF3126
 	.byte	0x1
 	.2byte	0x168
 	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3125
+	.4byte	.LASF3127
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3126
+	.4byte	.LASF3128
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3127
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3114
+	.4byte	.LASF3116
 	.byte	0x1
 	.2byte	0x16a
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3113
+	.4byte	.LASF3115
 	.byte	0x1
 	.2byte	0x16b
 	.4byte	0x466f
 	.uleb128 0x46
-	.4byte	.LASF3128
+	.4byte	.LASF3130
 	.byte	0x1
 	.2byte	0x16c
 	.4byte	0x13a
@@ -43219,73 +43325,73 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x74
-	.4byte	.LASF3129
+	.4byte	.LASF3131
 	.byte	0x1
 	.2byte	0x14f
 	.8byte	.LFB2809
 	.8byte	.LFE2809-.LFB2809
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12b1f
+	.4byte	0x12b9a
 	.uleb128 0x58
 	.4byte	.LASF2273
 	.byte	0x1
 	.2byte	0x14f
 	.4byte	0x31f0
-	.4byte	.LLST173
+	.4byte	.LLST176
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x151
 	.4byte	0xe47d
-	.4byte	.LLST174
+	.4byte	.LLST177
 	.uleb128 0x59
 	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x152
-	.4byte	0xe72c
-	.4byte	.LLST175
+	.4byte	0xe742
+	.4byte	.LLST178
 	.uleb128 0x4e
-	.8byte	.LVL690
-	.4byte	0x14217
+	.8byte	.LVL695
+	.4byte	0x1429e
 	.uleb128 0x4e
-	.8byte	.LVL692
-	.4byte	0x12be6
+	.8byte	.LVL697
+	.4byte	0x12c61
 	.uleb128 0x4e
-	.8byte	.LVL693
-	.4byte	0x14223
+	.8byte	.LVL698
+	.4byte	0x142aa
 	.uleb128 0x4e
-	.8byte	.LVL696
-	.4byte	0x12b1f
+	.8byte	.LVL701
+	.4byte	0x12b9a
 	.uleb128 0x4e
-	.8byte	.LVL697
-	.4byte	0x14223
+	.8byte	.LVL702
+	.4byte	0x142aa
 	.byte	0
 	.uleb128 0x74
-	.4byte	.LASF3130
+	.4byte	.LASF3132
 	.byte	0x1
 	.2byte	0x11e
 	.8byte	.LFB2808
 	.8byte	.LFE2808-.LFB2808
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12be6
+	.4byte	0x12c61
 	.uleb128 0x6a
-	.4byte	.LASF3119
+	.4byte	.LASF3121
 	.byte	0x1
 	.2byte	0x11e
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6a
-	.4byte	.LASF3120
+	.4byte	.LASF3122
 	.byte	0x1
 	.2byte	0x11e
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x6a
-	.4byte	.LASF3112
+	.4byte	.LASF3114
 	.byte	0x1
 	.2byte	0x11e
 	.4byte	0x466f
@@ -43295,8 +43401,8 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x11f
-	.4byte	0xe72c
-	.4byte	.LLST169
+	.4byte	0xe742
+	.4byte	.LLST172
 	.uleb128 0x4c
 	.4byte	.LASF2896
 	.byte	0x1
@@ -43312,22 +43418,22 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x59
 	.uleb128 0x46
-	.4byte	.LASF3122
+	.4byte	.LASF3124
 	.byte	0x1
 	.2byte	0x122
 	.4byte	0x13a
 	.uleb128 0x59
-	.4byte	.LASF3123
+	.4byte	.LASF3125
 	.byte	0x1
 	.2byte	0x122
 	.4byte	0x13a
-	.4byte	.LLST170
+	.4byte	.LLST173
 	.uleb128 0x59
-	.4byte	.LASF3114
+	.4byte	.LASF3116
 	.byte	0x1
 	.2byte	0x123
 	.4byte	0x155
-	.4byte	.LLST171
+	.4byte	.LLST174
 	.uleb128 0x69
 	.string	"i"
 	.byte	0x1
@@ -43341,44 +43447,44 @@ __exitcall_ebc_exit:
 	.2byte	0x124
 	.4byte	0xc6
 	.uleb128 0x59
-	.4byte	.LASF3128
+	.4byte	.LASF3130
 	.byte	0x1
 	.2byte	0x125
 	.4byte	0x13a
-	.4byte	.LLST172
+	.4byte	.LLST175
 	.byte	0
 	.uleb128 0x75
-	.4byte	.LASF3131
+	.4byte	.LASF3133
 	.byte	0x1
 	.byte	0xd3
 	.8byte	.LFB2807
 	.8byte	.LFE2807-.LFB2807
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12ccb
+	.4byte	0x12d46
 	.uleb128 0x76
-	.4byte	.LASF3119
+	.4byte	.LASF3121
 	.byte	0x1
 	.byte	0xd3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x76
-	.4byte	.LASF3120
+	.4byte	.LASF3122
 	.byte	0x1
 	.byte	0xd3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x76
-	.4byte	.LASF3121
+	.4byte	.LASF3123
 	.byte	0x1
 	.byte	0xd3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x76
-	.4byte	.LASF3112
+	.4byte	.LASF3114
 	.byte	0x1
 	.byte	0xd3
 	.4byte	0x466f
@@ -43388,14 +43494,14 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2957
 	.byte	0x1
 	.byte	0xd4
-	.4byte	0xe72c
-	.4byte	.LLST163
+	.4byte	0xe742
+	.4byte	.LLST166
 	.uleb128 0x77
 	.4byte	.LASF2867
 	.byte	0x1
 	.byte	0xd4
 	.4byte	0xc6
-	.4byte	.LLST164
+	.4byte	.LLST167
 	.uleb128 0x4b
 	.4byte	.LASF2896
 	.byte	0x1
@@ -43411,28 +43517,28 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x78
-	.4byte	.LASF3122
+	.4byte	.LASF3124
 	.byte	0x1
 	.byte	0xd7
 	.4byte	0x13a
 	.uleb128 0x79
-	.4byte	.LASF3123
+	.4byte	.LASF3125
 	.byte	0x1
 	.byte	0xd7
 	.4byte	0x13a
-	.4byte	.LLST165
+	.4byte	.LLST168
 	.uleb128 0x79
-	.4byte	.LASF3124
+	.4byte	.LASF3126
 	.byte	0x1
 	.byte	0xd7
 	.4byte	0x13a
-	.4byte	.LLST166
+	.4byte	.LLST169
 	.uleb128 0x79
-	.4byte	.LASF3114
+	.4byte	.LASF3116
 	.byte	0x1
 	.byte	0xd8
 	.4byte	0x155
-	.4byte	.LLST167
+	.4byte	.LLST170
 	.uleb128 0x7a
 	.string	"i"
 	.byte	0x1
@@ -43446,26 +43552,26 @@ __exitcall_ebc_exit:
 	.byte	0xd9
 	.4byte	0xc6
 	.uleb128 0x79
-	.4byte	.LASF3128
+	.4byte	.LASF3130
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x13a
-	.4byte	.LLST168
+	.4byte	.LLST171
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3132
+	.4byte	.LASF3134
 	.byte	0x1
 	.byte	0xb4
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x12cfd
+	.4byte	0x12d78
 	.uleb128 0x7d
 	.string	"ebc"
 	.byte	0x1
 	.byte	0xb4
 	.4byte	0xe47d
 	.uleb128 0x7e
-	.4byte	.LASF3133
+	.4byte	.LASF3135
 	.byte	0x1
 	.byte	0xb4
 	.4byte	0xc6
@@ -43473,70 +43579,70 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2957
 	.byte	0x1
 	.byte	0xb6
-	.4byte	0xe72c
+	.4byte	0xe742
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3134
+	.4byte	.LASF3136
 	.byte	0x1
 	.byte	0x86
 	.4byte	0x10b
 	.byte	0x3
-	.4byte	0x12d45
+	.4byte	0x12dc0
 	.uleb128 0x7e
 	.4byte	.LASF2856
 	.byte	0x1
 	.byte	0x86
 	.4byte	0xc0ad
 	.uleb128 0x7e
-	.4byte	.LASF3101
+	.4byte	.LASF3103
 	.byte	0x1
 	.byte	0x86
 	.4byte	0x11a
 	.uleb128 0x7e
-	.4byte	.LASF3102
+	.4byte	.LASF3104
 	.byte	0x1
 	.byte	0x86
 	.4byte	0x11a
 	.uleb128 0x78
-	.4byte	.LASF3135
+	.4byte	.LASF3137
 	.byte	0x1
 	.byte	0x88
 	.4byte	0x10b
 	.uleb128 0x78
-	.4byte	.LASF3117
+	.4byte	.LASF3119
 	.byte	0x1
 	.byte	0x89
 	.4byte	0x11a
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3136
+	.4byte	.LASF3138
 	.byte	0x1
 	.byte	0x80
 	.4byte	0x10b
 	.byte	0x3
-	.4byte	0x12d77
+	.4byte	0x12df2
 	.uleb128 0x7e
 	.4byte	.LASF2856
 	.byte	0x1
 	.byte	0x80
 	.4byte	0xc0ad
 	.uleb128 0x7e
-	.4byte	.LASF3101
+	.4byte	.LASF3103
 	.byte	0x1
 	.byte	0x80
 	.4byte	0x11a
 	.uleb128 0x7e
-	.4byte	.LASF3102
+	.4byte	.LASF3104
 	.byte	0x1
 	.byte	0x80
 	.4byte	0x11a
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3137
+	.4byte	.LASF3139
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x12d9a
+	.4byte	0x12e15
 	.uleb128 0x7e
 	.4byte	.LASF2932
 	.byte	0xb
@@ -43549,65 +43655,65 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3138
+	.4byte	.LASF3140
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x12dc8
+	.4byte	0x12e43
 	.uleb128 0x7e
 	.4byte	.LASF2932
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0xe0ff
 	.uleb128 0x7e
-	.4byte	.LASF3139
+	.4byte	.LASF3141
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13a
 	.uleb128 0x7e
-	.4byte	.LASF3140
+	.4byte	.LASF3142
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13a
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3141
+	.4byte	.LASF3143
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x12e0c
+	.4byte	0x12e87
 	.uleb128 0x7e
 	.4byte	.LASF2932
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xe0ff
 	.uleb128 0x7e
-	.4byte	.LASF3142
+	.4byte	.LASF3144
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF3143
+	.4byte	.LASF3145
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF3144
+	.4byte	.LASF3146
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF3145
+	.4byte	.LASF3147
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3146
+	.4byte	.LASF3148
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x12e24
+	.4byte	0x12e9f
 	.uleb128 0x7e
 	.4byte	.LASF2932
 	.byte	0xb
@@ -43615,12 +43721,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe0ff
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3147
+	.4byte	.LASF3149
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12e4b
+	.4byte	0x12ec6
 	.uleb128 0x7e
 	.4byte	.LASF2932
 	.byte	0xb
@@ -43633,11 +43739,11 @@ __exitcall_ebc_exit:
 	.4byte	0xe13f
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3148
+	.4byte	.LASF3150
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x12e95
+	.4byte	0x12f10
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa
@@ -43665,12 +43771,12 @@ __exitcall_ebc_exit:
 	.4byte	0xb7a4
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3149
+	.4byte	.LASF3151
 	.byte	0xa
 	.2byte	0x108
 	.4byte	0xb7a4
 	.byte	0x3
-	.4byte	0x12eb3
+	.4byte	0x12f2e
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa
@@ -43678,12 +43784,12 @@ __exitcall_ebc_exit:
 	.4byte	0xa55b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3150
+	.4byte	.LASF3152
 	.byte	0xc8
 	.byte	0x1d
 	.4byte	0xb7a4
 	.byte	0x3
-	.4byte	0x12ecf
+	.4byte	0x12f4a
 	.uleb128 0x7d
 	.string	"bus"
 	.byte	0xc8
@@ -43691,31 +43797,31 @@ __exitcall_ebc_exit:
 	.4byte	0xadc2
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3151
+	.4byte	.LASF3153
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12eeb
+	.4byte	0x12f66
 	.uleb128 0x7e
-	.4byte	.LASF3152
+	.4byte	.LASF3154
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3153
+	.4byte	.LASF3155
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x12f24
+	.4byte	0x12f9f
 	.uleb128 0x7d
 	.string	"dev"
 	.byte	0xcb
 	.byte	0xa3
 	.4byte	0xa55b
 	.uleb128 0x7e
-	.4byte	.LASF3154
+	.4byte	.LASF3156
 	.byte	0xcb
 	.byte	0xa4
 	.4byte	0x310
@@ -43725,18 +43831,18 @@ __exitcall_ebc_exit:
 	.byte	0xa5
 	.4byte	0x2ce
 	.uleb128 0x7e
-	.4byte	.LASF3155
+	.4byte	.LASF3157
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3156
+	.4byte	.LASF3158
 	.byte	0x3
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12f40
+	.4byte	0x12fbb
 	.uleb128 0x7e
 	.4byte	.LASF2933
 	.byte	0x3
@@ -43744,12 +43850,12 @@ __exitcall_ebc_exit:
 	.4byte	0xdaff
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3157
+	.4byte	.LASF3159
 	.byte	0x3
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12f65
+	.4byte	0x12fe0
 	.uleb128 0x7e
 	.4byte	.LASF2933
 	.byte	0x3
@@ -43762,11 +43868,11 @@ __exitcall_ebc_exit:
 	.4byte	0x4669
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3158
+	.4byte	.LASF3160
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x12f7d
+	.4byte	0x12ff8
 	.uleb128 0x7e
 	.4byte	.LASF2933
 	.byte	0x3
@@ -43774,11 +43880,11 @@ __exitcall_ebc_exit:
 	.4byte	0xdaff
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3159
+	.4byte	.LASF3161
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x12f95
+	.4byte	0x13010
 	.uleb128 0x7e
 	.4byte	.LASF2933
 	.byte	0x3
@@ -43786,11 +43892,11 @@ __exitcall_ebc_exit:
 	.4byte	0xdaff
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3160
+	.4byte	.LASF3162
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x12fad
+	.4byte	0x13028
 	.uleb128 0x7e
 	.4byte	.LASF2933
 	.byte	0x3
@@ -43798,11 +43904,11 @@ __exitcall_ebc_exit:
 	.4byte	0xdaff
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3161
+	.4byte	.LASF3163
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x12fc5
+	.4byte	0x13040
 	.uleb128 0x7e
 	.4byte	.LASF2933
 	.byte	0x3
@@ -43810,16 +43916,16 @@ __exitcall_ebc_exit:
 	.4byte	0xdaff
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3162
+	.4byte	.LASF3164
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x12fdd
+	.4byte	0x13058
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x12fdd
+	.4byte	0x13058
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -43829,24 +43935,24 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x12ffb
+	.4byte	0x13076
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x12fdd
+	.4byte	0x13058
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3163
+	.4byte	.LASF3165
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x13033
+	.4byte	0x130ae
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x12fdd
+	.4byte	0x13058
 	.uleb128 0x7e
 	.4byte	.LASF192
 	.byte	0x4
@@ -43864,12 +43970,12 @@ __exitcall_ebc_exit:
 	.4byte	0xacf8
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3164
+	.4byte	.LASF3166
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13062
+	.4byte	0x130dd
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -43887,12 +43993,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3165
+	.4byte	.LASF3167
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13091
+	.4byte	0x1310c
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -43910,12 +44016,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3166
+	.4byte	.LASF3168
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x130c0
+	.4byte	0x1313b
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -43933,12 +44039,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3167
+	.4byte	.LASF3169
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x130fa
+	.4byte	0x13175
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -43961,37 +44067,37 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3168
+	.4byte	.LASF3170
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x1312e
+	.4byte	0x131a9
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x30a7
 	.uleb128 0x78
-	.4byte	.LASF3169
+	.4byte	.LASF3171
 	.byte	0x6
 	.byte	0xf7
 	.4byte	0x443
 	.uleb128 0x66
 	.uleb128 0x78
-	.4byte	.LASF3170
+	.4byte	.LASF3172
 	.byte	0x6
 	.byte	0xfe
 	.4byte	0x155
 	.byte	0
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3171
+	.4byte	.LASF3173
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13178
+	.4byte	0x131f3
 	.uleb128 0x7e
 	.4byte	.LASF1149
 	.byte	0x6
@@ -44008,25 +44114,25 @@ __exitcall_ebc_exit:
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x78
-	.4byte	.LASF3172
+	.4byte	.LASF3174
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x66
 	.uleb128 0x78
-	.4byte	.LASF3170
+	.4byte	.LASF3172
 	.byte	0x6
 	.byte	0x56
 	.4byte	0x155
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3173
+	.4byte	.LASF3175
 	.byte	0x12
 	.2byte	0x2e5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x131a2
+	.4byte	0x1321d
 	.uleb128 0x64
 	.4byte	.LASF986
 	.byte	0x12
@@ -44039,12 +44145,12 @@ __exitcall_ebc_exit:
 	.4byte	0x31b
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3174
+	.4byte	.LASF3176
 	.byte	0x12
 	.2byte	0x216
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x131da
+	.4byte	0x13255
 	.uleb128 0x64
 	.4byte	.LASF986
 	.byte	0x12
@@ -44064,12 +44170,12 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3175
+	.4byte	.LASF3177
 	.byte	0x12
 	.2byte	0x1dd
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13210
+	.4byte	0x1328b
 	.uleb128 0x64
 	.4byte	.LASF986
 	.byte	0x12
@@ -44081,18 +44187,18 @@ __exitcall_ebc_exit:
 	.2byte	0x1dd
 	.4byte	0x31b
 	.uleb128 0x46
-	.4byte	.LASF3176
+	.4byte	.LASF3178
 	.byte	0x12
 	.2byte	0x1df
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3177
+	.4byte	.LASF3179
 	.byte	0x12
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x1322e
+	.4byte	0x132a9
 	.uleb128 0x64
 	.4byte	.LASF986
 	.byte	0x12
@@ -44100,12 +44206,12 @@ __exitcall_ebc_exit:
 	.4byte	0x2ce
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3178
+	.4byte	.LASF3180
 	.byte	0x12
 	.2byte	0x13d
 	.4byte	0xd788
 	.byte	0x3
-	.4byte	0x1324c
+	.4byte	0x132c7
 	.uleb128 0x64
 	.4byte	.LASF170
 	.byte	0x12
@@ -44113,13 +44219,13 @@ __exitcall_ebc_exit:
 	.4byte	0x31b
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3179
+	.4byte	.LASF3181
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x1326f
+	.4byte	0x132ea
 	.uleb128 0x7e
-	.4byte	.LASF3025
+	.4byte	.LASF3026
 	.byte	0xbe
 	.byte	0xdb
 	.4byte	0xd6ff
@@ -44130,79 +44236,79 @@ __exitcall_ebc_exit:
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3180
+	.4byte	.LASF3182
 	.byte	0xbe
 	.byte	0xd6
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x1328b
+	.4byte	0x13306
 	.uleb128 0x7e
-	.4byte	.LASF3025
+	.4byte	.LASF3026
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x1328b
+	.4byte	0x13306
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xd657
 	.uleb128 0x62
-	.4byte	.LASF3181
+	.4byte	.LASF3183
 	.byte	0xa3
 	.2byte	0x164
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x132af
+	.4byte	0x1332a
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x132af
+	.4byte	0x1332a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc0a8
 	.uleb128 0x62
-	.4byte	.LASF3182
+	.4byte	.LASF3184
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x132ea
+	.4byte	0x13365
 	.uleb128 0x63
 	.string	"np"
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xbca5
 	.uleb128 0x64
-	.4byte	.LASF3183
+	.4byte	.LASF3185
 	.byte	0xe
 	.2byte	0x499
 	.4byte	0x56
 	.uleb128 0x64
-	.4byte	.LASF3184
+	.4byte	.LASF3186
 	.byte	0xe
 	.2byte	0x49a
 	.4byte	0xaab
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3185
+	.4byte	.LASF3187
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13336
+	.4byte	0x133b1
 	.uleb128 0x63
 	.string	"np"
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xbca5
 	.uleb128 0x64
-	.4byte	.LASF3183
+	.4byte	.LASF3185
 	.byte	0xe
 	.2byte	0x1f0
 	.4byte	0x56
 	.uleb128 0x64
-	.4byte	.LASF3186
+	.4byte	.LASF3188
 	.byte	0xe
 	.2byte	0x1f1
 	.4byte	0xaab
@@ -44218,11 +44324,11 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3187
+	.4byte	.LASF3189
 	.byte	0xe
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x1334e
+	.4byte	0x133c9
 	.uleb128 0x7e
 	.4byte	.LASF867
 	.byte	0xe
@@ -44230,11 +44336,11 @@ __exitcall_ebc_exit:
 	.4byte	0xb87f
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3188
+	.4byte	.LASF3190
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x13374
+	.4byte	0x133ef
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -44247,12 +44353,12 @@ __exitcall_ebc_exit:
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3189
+	.4byte	.LASF3191
 	.byte	0x2
 	.2byte	0x49b
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13392
+	.4byte	0x1340d
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -44260,12 +44366,12 @@ __exitcall_ebc_exit:
 	.4byte	0xbb15
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3190
+	.4byte	.LASF3192
 	.byte	0x2
 	.2byte	0x2c5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x133c8
+	.4byte	0x13443
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -44283,12 +44389,12 @@ __exitcall_ebc_exit:
 	.4byte	0x31b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3191
+	.4byte	.LASF3193
 	.byte	0xf
 	.byte	0xca
 	.4byte	0x33c
 	.byte	0x3
-	.4byte	0x133e4
+	.4byte	0x1345f
 	.uleb128 0x7d
 	.string	"res"
 	.byte	0xf
@@ -44296,12 +44402,12 @@ __exitcall_ebc_exit:
 	.4byte	0xc1b9
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3192
+	.4byte	.LASF3194
 	.byte	0xcc
 	.byte	0x22
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x13400
+	.4byte	0x1347b
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xcc
@@ -44309,12 +44415,12 @@ __exitcall_ebc_exit:
 	.4byte	0x30a7
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3193
+	.4byte	.LASF3195
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1341c
+	.4byte	0x13497
 	.uleb128 0x7e
 	.4byte	.LASF986
 	.byte	0xcd
@@ -44322,12 +44428,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3194
+	.4byte	.LASF3196
 	.byte	0xd
 	.2byte	0x23e
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x1343a
+	.4byte	0x134b5
 	.uleb128 0x64
 	.4byte	.LASF2273
 	.byte	0xd
@@ -44335,12 +44441,12 @@ __exitcall_ebc_exit:
 	.4byte	0x31f0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3195
+	.4byte	.LASF3197
 	.byte	0xd
 	.2byte	0x203
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x13463
+	.4byte	0x134de
 	.uleb128 0x63
 	.string	"wq"
 	.byte	0xd
@@ -44353,29 +44459,29 @@ __exitcall_ebc_exit:
 	.4byte	0x31f0
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3196
+	.4byte	.LASF3198
 	.byte	0xd
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x13486
+	.4byte	0x13501
 	.uleb128 0x7e
 	.4byte	.LASF2273
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0x31f0
 	.uleb128 0x7e
-	.4byte	.LASF3197
+	.4byte	.LASF3199
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3198
+	.4byte	.LASF3200
 	.byte	0x51
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x134a2
+	.4byte	0x1351d
 	.uleb128 0x63
 	.string	"m"
 	.byte	0x51
@@ -44383,12 +44489,12 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3199
+	.4byte	.LASF3201
 	.byte	0x51
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x134be
+	.4byte	0x13539
 	.uleb128 0x63
 	.string	"m"
 	.byte	0x51
@@ -44396,24 +44502,24 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3200
+	.4byte	.LASF3202
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x134fa
+	.4byte	0x13575
 	.uleb128 0x7e
 	.4byte	.LASF1149
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x30a7
 	.uleb128 0x7e
-	.4byte	.LASF3201
+	.4byte	.LASF3203
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x2ce
 	.uleb128 0x7e
-	.4byte	.LASF3202
+	.4byte	.LASF3204
 	.byte	0xca
 	.byte	0x97
 	.4byte	0x29b
@@ -44424,11 +44530,11 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3203
+	.4byte	.LASF3205
 	.byte	0xca
 	.byte	0x91
 	.byte	0x3
-	.4byte	0x1352a
+	.4byte	0x135a5
 	.uleb128 0x7e
 	.4byte	.LASF986
 	.byte	0xca
@@ -44441,18 +44547,18 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.uleb128 0x66
 	.uleb128 0x78
-	.4byte	.LASF3204
+	.4byte	.LASF3206
 	.byte	0xca
 	.byte	0x93
 	.4byte	0xc6
 	.byte	0
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3205
+	.4byte	.LASF3207
 	.byte	0xca
 	.byte	0x80
 	.byte	0x3
-	.4byte	0x13556
+	.4byte	0x135d1
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xca
@@ -44464,25 +44570,25 @@ __exitcall_ebc_exit:
 	.byte	0x80
 	.4byte	0x29
 	.uleb128 0x7e
-	.4byte	.LASF3206
+	.4byte	.LASF3208
 	.byte	0xca
 	.byte	0x81
 	.4byte	0x29b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3207
+	.4byte	.LASF3209
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1357c
+	.4byte	0x135f7
 	.uleb128 0x7d
 	.string	"ti"
 	.byte	0xca
 	.byte	0x5f
-	.4byte	0x1357c
+	.4byte	0x135f7
 	.uleb128 0x7e
-	.4byte	.LASF3208
+	.4byte	.LASF3210
 	.byte	0xca
 	.byte	0x5f
 	.4byte	0xc6
@@ -44491,24 +44597,24 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.4byte	0xc1e
 	.uleb128 0x7c
-	.4byte	.LASF3209
+	.4byte	.LASF3211
 	.byte	0x5
 	.byte	0xf
 	.4byte	0x2ef0
 	.byte	0x3
-	.4byte	0x1359e
+	.4byte	0x13619
 	.uleb128 0x78
-	.4byte	.LASF3210
+	.4byte	.LASF3212
 	.byte	0x5
 	.byte	0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3211
+	.4byte	.LASF3213
 	.byte	0x10
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x135e2
+	.4byte	0x1365d
 	.uleb128 0x7e
 	.4byte	.LASF961
 	.byte	0x10
@@ -44519,9 +44625,9 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x135d5
+	.4byte	0x13650
 	.uleb128 0x22
-	.4byte	.LASF3091
+	.4byte	.LASF3093
 	.byte	0x10
 	.byte	0x1c
 	.4byte	0x3b7
@@ -44529,27 +44635,27 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x12283
+	.4byte	0x122fe
 	.byte	0
 	.uleb128 0x7b
 	.string	"__u"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x135b6
+	.4byte	0x13631
 	.byte	0
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3285
+	.4byte	.LASF3288
 	.byte	0x20
 	.2byte	0x126
 	.byte	0x3
 	.uleb128 0x7c
-	.4byte	.LASF3212
+	.4byte	.LASF3214
 	.byte	0xce
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13606
+	.4byte	0x13681
 	.uleb128 0x7d
 	.string	"n"
 	.byte	0xce
@@ -44557,12 +44663,12 @@ __exitcall_ebc_exit:
 	.4byte	0x155
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3213
+	.4byte	.LASF3215
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xdd
 	.byte	0x3
-	.4byte	0x13638
+	.4byte	0x136b3
 	.uleb128 0x7e
 	.4byte	.LASF2455
 	.byte	0x8
@@ -44580,12 +44686,12 @@ __exitcall_ebc_exit:
 	.4byte	0x8b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3214
+	.4byte	.LASF3216
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1365e
+	.4byte	0x136d9
 	.uleb128 0x7d
 	.string	"nr"
 	.byte	0x7
@@ -44595,17 +44701,17 @@ __exitcall_ebc_exit:
 	.4byte	.LASF1149
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x1365e
+	.4byte	0x136d9
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x3a
 	.uleb128 0x7f
-	.4byte	.LASF3215
+	.4byte	.LASF3217
 	.byte	0x11
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x13697
+	.4byte	0x13712
 	.uleb128 0x7d
 	.string	"i"
 	.byte	0x11
@@ -44615,7 +44721,7 @@ __exitcall_ebc_exit:
 	.string	"v"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13697
+	.4byte	0x13712
 	.uleb128 0x7b
 	.string	"w0"
 	.byte	0x11
@@ -44625,18 +44731,18 @@ __exitcall_ebc_exit:
 	.string	"x1"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13697
+	.4byte	0x13712
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x367
 	.uleb128 0x7c
-	.4byte	.LASF3216
+	.4byte	.LASF3218
 	.byte	0xcf
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x136b7
+	.4byte	0x13732
 	.uleb128 0x7d
 	.string	"x"
 	.byte	0xcf
@@ -44644,12 +44750,12 @@ __exitcall_ebc_exit:
 	.4byte	0xef
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3217
+	.4byte	.LASF3219
 	.byte	0xd0
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x136d3
+	.4byte	0x1374e
 	.uleb128 0x7e
 	.4byte	.LASF2488
 	.byte	0xd0
@@ -44657,16 +44763,16 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3218
+	.4byte	.LASF3220
 	.byte	0xd1
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x136f4
+	.4byte	0x1376f
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd1
 	.byte	0xb
-	.4byte	0x136f4
+	.4byte	0x1376f
 	.uleb128 0x7e
 	.4byte	.LASF986
 	.byte	0xd1
@@ -44675,21 +44781,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x136fc
+	.4byte	0x13777
 	.uleb128 0x81
 	.uleb128 0x3
-	.4byte	0x136fa
+	.4byte	0x13775
 	.uleb128 0x7f
-	.4byte	.LASF3219
+	.4byte	.LASF3221
 	.byte	0xd1
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x13722
+	.4byte	0x1379d
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd1
 	.byte	0x9
-	.4byte	0x136f4
+	.4byte	0x1376f
 	.uleb128 0x7e
 	.4byte	.LASF986
 	.byte	0xd1
@@ -44697,16 +44803,16 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3220
+	.4byte	.LASF3222
 	.byte	0xc
 	.2byte	0x11a
 	.byte	0x3
-	.4byte	0x13752
+	.4byte	0x137cd
 	.uleb128 0x63
 	.string	"p"
 	.byte	0xc
 	.2byte	0x11a
-	.4byte	0x13752
+	.4byte	0x137cd
 	.uleb128 0x63
 	.string	"res"
 	.byte	0xc
@@ -44720,1010 +44826,1015 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x136fa
+	.4byte	0x13775
 	.uleb128 0x82
-	.4byte	0x1262c
+	.4byte	0x126a7
 	.8byte	.LFB2814
 	.8byte	.LFE2814-.LFB2814
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x139db
+	.4byte	0x13a56
 	.uleb128 0x71
-	.4byte	0x12639
+	.4byte	0x126b4
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x12645
-	.4byte	.LLST95
+	.4byte	0x126c0
+	.4byte	.LLST98
 	.uleb128 0x6f
-	.4byte	0x12651
-	.4byte	.LLST96
+	.4byte	0x126cc
+	.4byte	.LLST99
 	.uleb128 0x6f
-	.4byte	0x1265d
-	.4byte	.LLST97
+	.4byte	0x126d8
+	.4byte	.LLST100
 	.uleb128 0x53
-	.4byte	0x1266a
+	.4byte	0x126e5
 	.8byte	.LBB1230
 	.8byte	.LBE1230-.LBB1230
 	.byte	0x1
 	.2byte	0x2bb
-	.4byte	0x13890
+	.4byte	0x1390b
 	.uleb128 0x54
-	.4byte	0x1269b
+	.4byte	0x12716
 	.uleb128 0x54
-	.4byte	0x1269b
+	.4byte	0x12716
 	.uleb128 0x54
-	.4byte	0x1269b
+	.4byte	0x12716
 	.uleb128 0x54
-	.4byte	0x1268f
+	.4byte	0x1270a
 	.uleb128 0x54
-	.4byte	0x12683
+	.4byte	0x126fe
 	.uleb128 0x54
-	.4byte	0x12677
+	.4byte	0x126f2
 	.uleb128 0x56
 	.8byte	.LBB1231
 	.8byte	.LBE1231-.LBB1231
 	.uleb128 0x57
-	.4byte	0x126a7
+	.4byte	0x12722
 	.uleb128 0x5f
-	.4byte	0x126b3
-	.4byte	.LLST98
+	.4byte	0x1272e
+	.4byte	.LLST101
 	.uleb128 0x57
-	.4byte	0x126bd
+	.4byte	0x12738
 	.uleb128 0x5f
-	.4byte	0x126c7
-	.4byte	.LLST99
+	.4byte	0x12742
+	.4byte	.LLST102
 	.uleb128 0x5f
-	.4byte	0x126d3
-	.4byte	.LLST100
+	.4byte	0x1274e
+	.4byte	.LLST103
 	.uleb128 0x5f
-	.4byte	0x126df
-	.4byte	.LLST101
+	.4byte	0x1275a
+	.4byte	.LLST104
 	.uleb128 0x57
-	.4byte	0x126eb
+	.4byte	0x12766
 	.uleb128 0x60
-	.4byte	0x126f7
+	.4byte	0x12772
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x60
-	.4byte	0x12703
+	.4byte	0x1277e
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5f
-	.4byte	0x1270f
-	.4byte	.LLST102
+	.4byte	0x1278a
+	.4byte	.LLST105
 	.uleb128 0x5f
-	.4byte	0x1271b
-	.4byte	.LLST103
+	.4byte	0x12796
+	.4byte	.LLST106
 	.uleb128 0x5f
-	.4byte	0x12727
-	.4byte	.LLST104
+	.4byte	0x127a2
+	.4byte	.LLST107
 	.uleb128 0x57
-	.4byte	0x12733
+	.4byte	0x127ae
 	.uleb128 0x5a
-	.4byte	0x12d45
+	.4byte	0x12dc0
 	.8byte	.LBB1232
 	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
 	.2byte	0x2ae
-	.4byte	0x1386a
+	.4byte	0x138e5
 	.uleb128 0x54
-	.4byte	0x12d6b
+	.4byte	0x12de6
 	.uleb128 0x54
-	.4byte	0x12d60
+	.4byte	0x12ddb
 	.uleb128 0x54
-	.4byte	0x12d55
+	.4byte	0x12dd0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x12d45
+	.4byte	0x12dc0
 	.8byte	.LBB1239
 	.4byte	.Ldebug_ranges0+0x730
 	.byte	0x1
 	.2byte	0x2af
 	.uleb128 0x54
-	.4byte	0x12d6b
+	.4byte	0x12de6
 	.uleb128 0x54
-	.4byte	0x12d60
+	.4byte	0x12ddb
 	.uleb128 0x54
-	.4byte	0x12d55
+	.4byte	0x12dd0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x780
 	.uleb128 0x54
-	.4byte	0x1265d
+	.4byte	0x126d8
 	.uleb128 0x54
-	.4byte	0x12651
+	.4byte	0x126cc
 	.uleb128 0x54
-	.4byte	0x12645
+	.4byte	0x126c0
 	.uleb128 0x54
-	.4byte	0x12639
+	.4byte	0x126b4
 	.uleb128 0x5e
-	.4byte	0x12740
+	.4byte	0x127bb
 	.8byte	.LBB1251
 	.4byte	.Ldebug_ranges0+0x780
 	.byte	0x1
 	.2byte	0x2b9
 	.uleb128 0x54
-	.4byte	0x12771
+	.4byte	0x127ec
 	.uleb128 0x54
-	.4byte	0x12771
+	.4byte	0x127ec
 	.uleb128 0x54
-	.4byte	0x12771
+	.4byte	0x127ec
 	.uleb128 0x54
-	.4byte	0x12765
+	.4byte	0x127e0
 	.uleb128 0x54
-	.4byte	0x12759
+	.4byte	0x127d4
 	.uleb128 0x54
-	.4byte	0x1274d
+	.4byte	0x127c8
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x780
 	.uleb128 0x57
-	.4byte	0x1277d
+	.4byte	0x127f8
 	.uleb128 0x60
-	.4byte	0x12789
+	.4byte	0x12804
 	.uleb128 0x1
 	.byte	0x5c
 	.uleb128 0x57
-	.4byte	0x12793
+	.4byte	0x1280e
 	.uleb128 0x60
-	.4byte	0x1279d
+	.4byte	0x12818
 	.uleb128 0x1
 	.byte	0x5f
 	.uleb128 0x57
-	.4byte	0x127a9
+	.4byte	0x12824
 	.uleb128 0x5f
-	.4byte	0x127b5
-	.4byte	.LLST105
+	.4byte	0x12830
+	.4byte	.LLST108
 	.uleb128 0x5f
-	.4byte	0x127c1
-	.4byte	.LLST106
+	.4byte	0x1283c
+	.4byte	.LLST109
 	.uleb128 0x60
-	.4byte	0x127cd
+	.4byte	0x12848
 	.uleb128 0x1
 	.byte	0x59
 	.uleb128 0x60
-	.4byte	0x127d9
+	.4byte	0x12854
 	.uleb128 0x1
 	.byte	0x5a
 	.uleb128 0x5f
-	.4byte	0x127e5
-	.4byte	.LLST107
+	.4byte	0x12860
+	.4byte	.LLST110
 	.uleb128 0x5f
-	.4byte	0x127f1
-	.4byte	.LLST108
+	.4byte	0x1286c
+	.4byte	.LLST111
 	.uleb128 0x60
-	.4byte	0x127fd
+	.4byte	0x12878
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x57
-	.4byte	0x12809
+	.4byte	0x12884
 	.uleb128 0x5a
-	.4byte	0x12d45
+	.4byte	0x12dc0
 	.8byte	.LBB1253
 	.4byte	.Ldebug_ranges0+0x7c0
 	.byte	0x1
 	.2byte	0x287
-	.4byte	0x13963
+	.4byte	0x139de
 	.uleb128 0x54
-	.4byte	0x12d6b
+	.4byte	0x12de6
 	.uleb128 0x54
-	.4byte	0x12d60
+	.4byte	0x12ddb
 	.uleb128 0x54
-	.4byte	0x12d55
+	.4byte	0x12dd0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12d45
+	.4byte	0x12dc0
 	.8byte	.LBB1258
 	.4byte	.Ldebug_ranges0+0x810
 	.byte	0x1
 	.2byte	0x288
-	.4byte	0x1398b
+	.4byte	0x13a06
 	.uleb128 0x54
-	.4byte	0x12d6b
+	.4byte	0x12de6
 	.uleb128 0x54
-	.4byte	0x12d60
+	.4byte	0x12ddb
 	.uleb128 0x54
-	.4byte	0x12d55
+	.4byte	0x12dd0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12d45
+	.4byte	0x12dc0
 	.8byte	.LBB1270
 	.4byte	.Ldebug_ranges0+0x880
 	.byte	0x1
 	.2byte	0x289
-	.4byte	0x139b3
+	.4byte	0x13a2e
 	.uleb128 0x54
-	.4byte	0x12d6b
+	.4byte	0x12de6
 	.uleb128 0x54
-	.4byte	0x12d60
+	.4byte	0x12ddb
 	.uleb128 0x54
-	.4byte	0x12d55
+	.4byte	0x12dd0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x12d45
+	.4byte	0x12dc0
 	.8byte	.LBB1282
 	.4byte	.Ldebug_ranges0+0x8f0
 	.byte	0x1
 	.2byte	0x28a
 	.uleb128 0x54
-	.4byte	0x12d6b
+	.4byte	0x12de6
 	.uleb128 0x54
-	.4byte	0x12d60
+	.4byte	0x12ddb
 	.uleb128 0x54
-	.4byte	0x12d55
+	.4byte	0x12dd0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x82
-	.4byte	0x12442
+	.4byte	0x124bd
 	.8byte	.LFB2817
 	.8byte	.LFE2817-.LFB2817
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13d10
+	.4byte	0x13d8b
 	.uleb128 0x71
-	.4byte	0x1244f
+	.4byte	0x124ca
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x1245b
-	.4byte	.LLST109
+	.4byte	0x124d6
+	.4byte	.LLST112
 	.uleb128 0x6f
-	.4byte	0x12467
-	.4byte	.LLST110
+	.4byte	0x124e2
+	.4byte	.LLST113
 	.uleb128 0x6f
-	.4byte	0x12473
-	.4byte	.LLST111
+	.4byte	0x124ee
+	.4byte	.LLST114
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x940
-	.4byte	0x13bf5
+	.4byte	0x13c70
 	.uleb128 0x54
-	.4byte	0x12473
+	.4byte	0x124ee
 	.uleb128 0x54
-	.4byte	0x12467
+	.4byte	0x124e2
 	.uleb128 0x54
-	.4byte	0x1245b
+	.4byte	0x124d6
 	.uleb128 0x54
-	.4byte	0x1244f
+	.4byte	0x124ca
 	.uleb128 0x5e
-	.4byte	0x12480
+	.4byte	0x124fb
 	.8byte	.LBB1318
 	.4byte	.Ldebug_ranges0+0x940
 	.byte	0x1
 	.2byte	0x317
 	.uleb128 0x54
-	.4byte	0x124b1
+	.4byte	0x1252c
 	.uleb128 0x54
-	.4byte	0x124b1
+	.4byte	0x1252c
 	.uleb128 0x54
-	.4byte	0x124b1
+	.4byte	0x1252c
 	.uleb128 0x54
-	.4byte	0x124a5
+	.4byte	0x12520
 	.uleb128 0x54
-	.4byte	0x12499
+	.4byte	0x12514
 	.uleb128 0x54
-	.4byte	0x1248d
+	.4byte	0x12508
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x940
 	.uleb128 0x57
-	.4byte	0x124bd
-	.uleb128 0x5f
-	.4byte	0x124c9
-	.4byte	.LLST112
-	.uleb128 0x5f
-	.4byte	0x124d5
-	.4byte	.LLST113
-	.uleb128 0x5f
-	.4byte	0x124e1
-	.4byte	.LLST114
+	.4byte	0x12538
 	.uleb128 0x5f
-	.4byte	0x124ed
+	.4byte	0x12544
 	.4byte	.LLST115
 	.uleb128 0x5f
-	.4byte	0x124f9
+	.4byte	0x12550
 	.4byte	.LLST116
 	.uleb128 0x5f
-	.4byte	0x12505
+	.4byte	0x1255c
 	.4byte	.LLST117
 	.uleb128 0x5f
-	.4byte	0x12511
+	.4byte	0x12568
 	.4byte	.LLST118
 	.uleb128 0x5f
-	.4byte	0x1251d
+	.4byte	0x12574
 	.4byte	.LLST119
-	.uleb128 0x57
-	.4byte	0x12527
 	.uleb128 0x5f
-	.4byte	0x12531
+	.4byte	0x12580
 	.4byte	.LLST120
 	.uleb128 0x5f
-	.4byte	0x1253d
+	.4byte	0x1258c
 	.4byte	.LLST121
+	.uleb128 0x5f
+	.4byte	0x12598
+	.4byte	.LLST122
+	.uleb128 0x57
+	.4byte	0x125a2
+	.uleb128 0x5f
+	.4byte	0x125ac
+	.4byte	.LLST123
+	.uleb128 0x5f
+	.4byte	0x125b8
+	.4byte	.LLST124
 	.uleb128 0x57
-	.4byte	0x12549
+	.4byte	0x125c4
 	.uleb128 0x5a
-	.4byte	0x12cfd
+	.4byte	0x12d78
 	.8byte	.LBB1320
 	.4byte	.Ldebug_ranges0+0x970
 	.byte	0x1
 	.2byte	0x308
-	.4byte	0x13b12
+	.4byte	0x13b8d
 	.uleb128 0x54
-	.4byte	0x12d23
+	.4byte	0x12d9e
 	.uleb128 0x54
-	.4byte	0x12d18
+	.4byte	0x12d93
 	.uleb128 0x54
-	.4byte	0x12d0d
+	.4byte	0x12d88
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x970
 	.uleb128 0x57
-	.4byte	0x12d2e
+	.4byte	0x12da9
 	.uleb128 0x5f
-	.4byte	0x12d39
-	.4byte	.LLST122
+	.4byte	0x12db4
+	.4byte	.LLST125
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12cfd
+	.4byte	0x12d78
 	.8byte	.LBB1323
 	.8byte	.LBE1323-.LBB1323
 	.byte	0x1
 	.2byte	0x305
-	.4byte	0x13b5e
+	.4byte	0x13bd9
 	.uleb128 0x54
-	.4byte	0x12d23
+	.4byte	0x12d9e
 	.uleb128 0x54
-	.4byte	0x12d18
+	.4byte	0x12d93
 	.uleb128 0x54
-	.4byte	0x12d0d
+	.4byte	0x12d88
 	.uleb128 0x56
 	.8byte	.LBB1324
 	.8byte	.LBE1324-.LBB1324
 	.uleb128 0x57
-	.4byte	0x12d2e
+	.4byte	0x12da9
 	.uleb128 0x5f
-	.4byte	0x12d39
-	.4byte	.LLST123
+	.4byte	0x12db4
+	.4byte	.LLST126
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12cfd
+	.4byte	0x12d78
 	.8byte	.LBB1325
 	.8byte	.LBE1325-.LBB1325
 	.byte	0x1
 	.2byte	0x306
-	.4byte	0x13baa
+	.4byte	0x13c25
 	.uleb128 0x54
-	.4byte	0x12d23
+	.4byte	0x12d9e
 	.uleb128 0x54
-	.4byte	0x12d18
+	.4byte	0x12d93
 	.uleb128 0x54
-	.4byte	0x12d0d
+	.4byte	0x12d88
 	.uleb128 0x56
 	.8byte	.LBB1326
 	.8byte	.LBE1326-.LBB1326
 	.uleb128 0x57
-	.4byte	0x12d2e
+	.4byte	0x12da9
 	.uleb128 0x5f
-	.4byte	0x12d39
-	.4byte	.LLST124
+	.4byte	0x12db4
+	.4byte	.LLST127
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12cfd
+	.4byte	0x12d78
 	.8byte	.LBB1327
 	.8byte	.LBE1327-.LBB1327
 	.byte	0x1
 	.2byte	0x307
 	.uleb128 0x54
-	.4byte	0x12d23
+	.4byte	0x12d9e
 	.uleb128 0x54
-	.4byte	0x12d18
+	.4byte	0x12d93
 	.uleb128 0x54
-	.4byte	0x12d0d
+	.4byte	0x12d88
 	.uleb128 0x56
 	.8byte	.LBB1328
 	.8byte	.LBE1328-.LBB1328
 	.uleb128 0x57
-	.4byte	0x12d2e
+	.4byte	0x12da9
 	.uleb128 0x5f
-	.4byte	0x12d39
-	.4byte	.LLST125
+	.4byte	0x12db4
+	.4byte	.LLST128
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12556
+	.4byte	0x125d1
 	.8byte	.LBB1332
 	.8byte	.LBE1332-.LBB1332
 	.byte	0x1
 	.2byte	0x319
 	.uleb128 0x54
-	.4byte	0x12587
+	.4byte	0x12602
 	.uleb128 0x54
-	.4byte	0x12587
+	.4byte	0x12602
 	.uleb128 0x54
-	.4byte	0x12587
+	.4byte	0x12602
 	.uleb128 0x54
-	.4byte	0x1257b
+	.4byte	0x125f6
 	.uleb128 0x54
-	.4byte	0x1256f
+	.4byte	0x125ea
 	.uleb128 0x54
-	.4byte	0x12563
+	.4byte	0x125de
 	.uleb128 0x56
 	.8byte	.LBB1333
 	.8byte	.LBE1333-.LBB1333
 	.uleb128 0x57
-	.4byte	0x12593
+	.4byte	0x1260e
 	.uleb128 0x57
-	.4byte	0x1259f
+	.4byte	0x1261a
 	.uleb128 0x57
-	.4byte	0x125ab
+	.4byte	0x12626
 	.uleb128 0x60
-	.4byte	0x125b7
+	.4byte	0x12632
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x60
-	.4byte	0x125c3
+	.4byte	0x1263e
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5f
-	.4byte	0x125cf
-	.4byte	.LLST126
+	.4byte	0x1264a
+	.4byte	.LLST129
 	.uleb128 0x5f
-	.4byte	0x125db
-	.4byte	.LLST127
+	.4byte	0x12656
+	.4byte	.LLST130
 	.uleb128 0x5f
-	.4byte	0x125e7
-	.4byte	.LLST128
+	.4byte	0x12662
+	.4byte	.LLST131
 	.uleb128 0x5f
-	.4byte	0x125f3
-	.4byte	.LLST129
+	.4byte	0x1266e
+	.4byte	.LLST132
 	.uleb128 0x57
-	.4byte	0x125fd
+	.4byte	0x12678
 	.uleb128 0x5f
-	.4byte	0x12607
-	.4byte	.LLST130
+	.4byte	0x12682
+	.4byte	.LLST133
 	.uleb128 0x5f
-	.4byte	0x12613
-	.4byte	.LLST131
+	.4byte	0x1268e
+	.4byte	.LLST134
 	.uleb128 0x57
-	.4byte	0x1261f
+	.4byte	0x1269a
 	.uleb128 0x5a
-	.4byte	0x12cfd
+	.4byte	0x12d78
 	.8byte	.LBB1334
 	.4byte	.Ldebug_ranges0+0x9a0
 	.byte	0x1
 	.2byte	0x2dd
-	.4byte	0x13cd5
+	.4byte	0x13d50
 	.uleb128 0x54
-	.4byte	0x12d23
+	.4byte	0x12d9e
 	.uleb128 0x54
-	.4byte	0x12d18
+	.4byte	0x12d93
 	.uleb128 0x54
-	.4byte	0x12d0d
+	.4byte	0x12d88
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x9a0
 	.uleb128 0x57
-	.4byte	0x12d2e
+	.4byte	0x12da9
 	.uleb128 0x5f
-	.4byte	0x12d39
-	.4byte	.LLST132
+	.4byte	0x12db4
+	.4byte	.LLST135
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x12cfd
+	.4byte	0x12d78
 	.8byte	.LBB1341
 	.4byte	.Ldebug_ranges0+0xa10
 	.byte	0x1
 	.2byte	0x2dc
 	.uleb128 0x54
-	.4byte	0x12d23
+	.4byte	0x12d9e
 	.uleb128 0x54
-	.4byte	0x12d18
+	.4byte	0x12d93
 	.uleb128 0x54
-	.4byte	0x12d0d
+	.4byte	0x12d88
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xa10
 	.uleb128 0x57
-	.4byte	0x12d2e
+	.4byte	0x12da9
 	.uleb128 0x5f
-	.4byte	0x12d39
-	.4byte	.LLST133
+	.4byte	0x12db4
+	.4byte	.LLST136
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x1240a
-	.8byte	.LFB2859
-	.8byte	.LFE2859-.LFB2859
+	.4byte	0x12485
+	.8byte	.LFB2860
+	.8byte	.LFE2860-.LFB2860
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13e13
+	.4byte	0x13e8e
 	.uleb128 0x6f
-	.4byte	0x12417
-	.4byte	.LLST134
+	.4byte	0x12492
+	.4byte	.LLST137
 	.uleb128 0x54
-	.4byte	0x12423
+	.4byte	0x1249e
 	.uleb128 0x57
-	.4byte	0x1242f
+	.4byte	0x124aa
 	.uleb128 0x5a
-	.4byte	0x12e4b
+	.4byte	0x12ec6
 	.8byte	.LBB1357
 	.4byte	.Ldebug_ranges0+0xa70
 	.byte	0x1
 	.2byte	0x320
-	.4byte	0x13d91
+	.4byte	0x13e0c
 	.uleb128 0x54
-	.4byte	0x12e7c
+	.4byte	0x12ef7
 	.uleb128 0x54
-	.4byte	0x12e70
+	.4byte	0x12eeb
 	.uleb128 0x54
-	.4byte	0x12e64
+	.4byte	0x12edf
 	.uleb128 0x54
-	.4byte	0x12e58
+	.4byte	0x12ed3
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xa70
 	.uleb128 0x57
-	.4byte	0x12e88
+	.4byte	0x12f03
 	.uleb128 0x5e
-	.4byte	0x12e95
+	.4byte	0x12f10
 	.8byte	.LBB1359
 	.4byte	.Ldebug_ranges0+0xac0
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x54
-	.4byte	0x12ea6
+	.4byte	0x12f21
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12dc8
+	.4byte	0x12e43
 	.8byte	.LBB1368
 	.4byte	.Ldebug_ranges0+0xaf0
 	.byte	0x1
 	.2byte	0x321
-	.4byte	0x13dc3
+	.4byte	0x13e3e
 	.uleb128 0x54
-	.4byte	0x12e00
+	.4byte	0x12e7b
 	.uleb128 0x54
-	.4byte	0x12df5
+	.4byte	0x12e70
 	.uleb128 0x54
-	.4byte	0x12dea
+	.4byte	0x12e65
 	.uleb128 0x54
-	.4byte	0x12ddf
+	.4byte	0x12e5a
 	.uleb128 0x54
-	.4byte	0x12dd4
+	.4byte	0x12e4f
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12d9a
+	.4byte	0x12e15
 	.8byte	.LBB1374
 	.8byte	.LBE1374-.LBB1374
 	.byte	0x1
 	.2byte	0x322
-	.4byte	0x13def
+	.4byte	0x13e6a
 	.uleb128 0x54
-	.4byte	0x12dbc
+	.4byte	0x12e37
 	.uleb128 0x54
-	.4byte	0x12db1
+	.4byte	0x12e2c
 	.uleb128 0x54
-	.4byte	0x12da6
+	.4byte	0x12e21
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12d77
+	.4byte	0x12df2
 	.8byte	.LBB1376
 	.8byte	.LBE1376-.LBB1376
 	.byte	0x1
 	.2byte	0x323
 	.uleb128 0x54
-	.4byte	0x12d8e
+	.4byte	0x12e09
 	.uleb128 0x54
-	.4byte	0x12d83
+	.4byte	0x12dfe
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12ccb
-	.8byte	.LFB2860
-	.8byte	.LFE2860-.LFB2860
+	.4byte	0x12d46
+	.8byte	.LFB2861
+	.8byte	.LFE2861-.LFB2861
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13ed1
+	.4byte	0x13f4c
 	.uleb128 0x6f
-	.4byte	0x12cdb
-	.4byte	.LLST137
+	.4byte	0x12d56
+	.4byte	.LLST140
 	.uleb128 0x6f
-	.4byte	0x12ce6
-	.4byte	.LLST138
+	.4byte	0x12d61
+	.4byte	.LLST141
 	.uleb128 0x57
-	.4byte	0x12cf1
+	.4byte	0x12d6c
 	.uleb128 0x70
-	.4byte	0x12e0c
-	.8byte	.LBB1398
-	.8byte	.LBE1398-.LBB1398
+	.4byte	0x12e87
+	.8byte	.LBB1402
+	.8byte	.LBE1402-.LBB1402
 	.byte	0x1
 	.byte	0xc6
-	.4byte	0x13e67
+	.4byte	0x13ee2
 	.uleb128 0x54
-	.4byte	0x12e18
+	.4byte	0x12e93
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12f95
-	.8byte	.LBB1400
-	.8byte	.LBE1400-.LBB1400
+	.4byte	0x13010
+	.8byte	.LBB1404
+	.8byte	.LBE1404-.LBB1404
 	.byte	0x1
 	.byte	0xc7
-	.4byte	0x13e88
+	.4byte	0x13f03
 	.uleb128 0x54
-	.4byte	0x12fa1
+	.4byte	0x1301c
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12fc5
-	.8byte	.LBB1402
-	.8byte	.LBE1402-.LBB1402
+	.4byte	0x13040
+	.8byte	.LBB1406
+	.8byte	.LBE1406-.LBB1406
 	.byte	0x1
 	.byte	0xca
-	.4byte	0x13eb6
+	.4byte	0x13f31
 	.uleb128 0x54
-	.4byte	0x12fd1
+	.4byte	0x1304c
 	.uleb128 0x4e
-	.8byte	.LVL464
-	.4byte	0x141f3
+	.8byte	.LVL468
+	.4byte	0x1427a
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL461
-	.4byte	0x13f9b
-	.uleb128 0x4e
 	.8byte	.LVL465
-	.4byte	0x13f9b
+	.4byte	0x14016
+	.uleb128 0x4e
+	.8byte	.LVL469
+	.4byte	0x14016
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12ccb
-	.8byte	.LFB2864
-	.8byte	.LFE2864-.LFB2864
+	.4byte	0x12d46
+	.8byte	.LFB2865
+	.8byte	.LFE2865-.LFB2865
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13f83
+	.4byte	0x13ffe
 	.uleb128 0x6f
-	.4byte	0x12cdb
-	.4byte	.LLST162
+	.4byte	0x12d56
+	.4byte	.LLST165
 	.uleb128 0x57
-	.4byte	0x12cf1
+	.4byte	0x12d6c
 	.uleb128 0x54
-	.4byte	0x12ce6
+	.4byte	0x12d61
 	.uleb128 0x70
-	.4byte	0x12fad
-	.8byte	.LBB1762
-	.8byte	.LBE1762-.LBB1762
+	.4byte	0x13028
+	.8byte	.LBB1766
+	.8byte	.LBE1766-.LBB1766
 	.byte	0x1
 	.byte	0xbf
-	.4byte	0x13f21
+	.4byte	0x13f9c
 	.uleb128 0x54
-	.4byte	0x12fb9
+	.4byte	0x13034
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12e24
-	.8byte	.LBB1764
-	.8byte	.LBE1764-.LBB1764
+	.4byte	0x12e9f
+	.8byte	.LBB1768
+	.8byte	.LBE1768-.LBB1768
 	.byte	0x1
 	.byte	0xc0
-	.4byte	0x13f47
+	.4byte	0x13fc2
 	.uleb128 0x54
-	.4byte	0x12e3f
+	.4byte	0x12eba
 	.uleb128 0x54
-	.4byte	0x12e34
+	.4byte	0x12eaf
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12fe3
-	.8byte	.LBB1766
-	.8byte	.LBE1766-.LBB1766
+	.4byte	0x1305e
+	.8byte	.LBB1770
+	.8byte	.LBE1770-.LBB1770
 	.byte	0x1
 	.byte	0xbc
-	.4byte	0x13f75
+	.4byte	0x13ff0
 	.uleb128 0x54
-	.4byte	0x12fef
+	.4byte	0x1306a
 	.uleb128 0x4e
-	.8byte	.LVL653
-	.4byte	0x14276
+	.8byte	.LVL658
+	.4byte	0x142fd
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL650
-	.4byte	0x13f9b
+	.8byte	.LVL655
+	.4byte	0x14016
 	.byte	0
 	.uleb128 0x84
-	.4byte	.LASF3221
-	.4byte	.LASF3221
+	.4byte	.LASF3223
+	.4byte	.LASF3223
 	.byte	0xbe
 	.byte	0xcc
 	.uleb128 0x84
-	.4byte	.LASF3222
-	.4byte	.LASF3222
+	.4byte	.LASF3224
+	.4byte	.LASF3224
 	.byte	0xbe
 	.byte	0xca
 	.uleb128 0x85
-	.4byte	.LASF3223
-	.4byte	.LASF3223
+	.4byte	.LASF3225
+	.4byte	.LASF3225
 	.byte	0x2
 	.2byte	0x5d1
 	.uleb128 0x84
-	.4byte	.LASF3224
-	.4byte	.LASF3224
+	.4byte	.LASF3226
+	.4byte	.LASF3226
 	.byte	0xac
 	.byte	0x4f
 	.uleb128 0x85
-	.4byte	.LASF3225
-	.4byte	.LASF3225
+	.4byte	.LASF3227
+	.4byte	.LASF3227
 	.byte	0x2
 	.2byte	0x2bf
 	.uleb128 0x85
-	.4byte	.LASF3226
-	.4byte	.LASF3226
+	.4byte	.LASF3228
+	.4byte	.LASF3228
 	.byte	0xe
 	.2byte	0x149
 	.uleb128 0x85
-	.4byte	.LASF3227
-	.4byte	.LASF3227
+	.4byte	.LASF3229
+	.4byte	.LASF3229
 	.byte	0xe
 	.2byte	0x172
 	.uleb128 0x84
-	.4byte	.LASF3228
-	.4byte	.LASF3228
+	.4byte	.LASF3230
+	.4byte	.LASF3230
 	.byte	0xd2
 	.byte	0x78
 	.uleb128 0x84
-	.4byte	.LASF3229
-	.4byte	.LASF3229
+	.4byte	.LASF3231
+	.4byte	.LASF3231
 	.byte	0xaa
 	.byte	0x59
 	.uleb128 0x84
-	.4byte	.LASF3230
-	.4byte	.LASF3230
+	.4byte	.LASF3232
+	.4byte	.LASF3232
 	.byte	0xc3
-	.byte	0x2f
+	.byte	0x30
 	.uleb128 0x86
-	.4byte	.LASF3231
-	.4byte	.LASF3231
+	.4byte	.LASF3233
+	.4byte	.LASF3233
 	.uleb128 0x84
-	.4byte	.LASF3231
-	.4byte	.LASF3231
+	.4byte	.LASF3233
+	.4byte	.LASF3233
 	.byte	0xd3
 	.byte	0x36
 	.uleb128 0x85
-	.4byte	.LASF3232
-	.4byte	.LASF3232
+	.4byte	.LASF3234
+	.4byte	.LASF3234
 	.byte	0x2
 	.2byte	0x5cb
 	.uleb128 0x84
-	.4byte	.LASF3233
-	.4byte	.LASF3233
+	.4byte	.LASF3235
+	.4byte	.LASF3235
 	.byte	0xc2
 	.byte	0x30
 	.uleb128 0x84
-	.4byte	.LASF3234
-	.4byte	.LASF3234
+	.4byte	.LASF3236
+	.4byte	.LASF3236
 	.byte	0xc2
 	.byte	0x31
 	.uleb128 0x84
-	.4byte	.LASF3235
-	.4byte	.LASF3235
+	.4byte	.LASF3237
+	.4byte	.LASF3237
 	.byte	0xab
 	.byte	0x9
 	.uleb128 0x85
-	.4byte	.LASF3236
-	.4byte	.LASF3236
+	.4byte	.LASF3238
+	.4byte	.LASF3238
 	.byte	0x48
 	.2byte	0x6b8
 	.uleb128 0x85
-	.4byte	.LASF3237
-	.4byte	.LASF3237
+	.4byte	.LASF3239
+	.4byte	.LASF3239
 	.byte	0x48
 	.2byte	0x676
 	.uleb128 0x84
-	.4byte	.LASF3238
-	.4byte	.LASF3238
+	.4byte	.LASF3240
+	.4byte	.LASF3240
 	.byte	0x9c
 	.byte	0x67
 	.uleb128 0x84
-	.4byte	.LASF3239
-	.4byte	.LASF3239
+	.4byte	.LASF3241
+	.4byte	.LASF3241
 	.byte	0x54
 	.byte	0x53
 	.uleb128 0x84
-	.4byte	.LASF3240
-	.4byte	.LASF3240
+	.4byte	.LASF3242
+	.4byte	.LASF3242
 	.byte	0x54
 	.byte	0xa5
 	.uleb128 0x84
-	.4byte	.LASF3241
-	.4byte	.LASF3241
+	.4byte	.LASF3243
+	.4byte	.LASF3243
 	.byte	0xc3
 	.byte	0x2b
 	.uleb128 0x84
-	.4byte	.LASF3242
-	.4byte	.LASF3242
+	.4byte	.LASF3244
+	.4byte	.LASF3244
 	.byte	0xc3
 	.byte	0x27
 	.uleb128 0x85
-	.4byte	.LASF3243
-	.4byte	.LASF3243
+	.4byte	.LASF3245
+	.4byte	.LASF3245
 	.byte	0x12
 	.2byte	0x184
 	.uleb128 0x84
-	.4byte	.LASF3244
-	.4byte	.LASF3244
+	.4byte	.LASF3246
+	.4byte	.LASF3246
 	.byte	0xd4
 	.byte	0x51
 	.uleb128 0x85
-	.4byte	.LASF3245
-	.4byte	.LASF3245
+	.4byte	.LASF3247
+	.4byte	.LASF3247
 	.byte	0x20
 	.2byte	0x1d9
 	.uleb128 0x84
-	.4byte	.LASF3246
-	.4byte	.LASF3246
+	.4byte	.LASF3248
+	.4byte	.LASF3248
 	.byte	0x3
 	.byte	0x3b
 	.uleb128 0x84
-	.4byte	.LASF3247
-	.4byte	.LASF3247
+	.4byte	.LASF3249
+	.4byte	.LASF3249
 	.byte	0x12
 	.byte	0xb9
 	.uleb128 0x86
-	.4byte	.LASF3248
-	.4byte	.LASF3248
+	.4byte	.LASF3250
+	.4byte	.LASF3250
 	.uleb128 0x84
-	.4byte	.LASF3249
-	.4byte	.LASF3249
+	.4byte	.LASF3251
+	.4byte	.LASF3251
 	.byte	0x3a
 	.byte	0xc2
 	.uleb128 0x84
-	.4byte	.LASF3250
-	.4byte	.LASF3250
+	.4byte	.LASF3252
+	.4byte	.LASF3252
 	.byte	0xac
 	.byte	0x4e
 	.uleb128 0x85
-	.4byte	.LASF3251
-	.4byte	.LASF3251
+	.4byte	.LASF3253
+	.4byte	.LASF3253
 	.byte	0x2
 	.2byte	0x287
 	.uleb128 0x84
-	.4byte	.LASF3252
-	.4byte	.LASF3252
+	.4byte	.LASF3254
+	.4byte	.LASF3254
 	.byte	0xbf
 	.byte	0x38
 	.uleb128 0x85
-	.4byte	.LASF3253
-	.4byte	.LASF3253
+	.4byte	.LASF3255
+	.4byte	.LASF3255
 	.byte	0xa3
 	.2byte	0x37b
 	.uleb128 0x86
-	.4byte	.LASF3254
-	.4byte	.LASF3254
+	.4byte	.LASF3256
+	.4byte	.LASF3256
+	.uleb128 0x84
+	.4byte	.LASF3257
+	.4byte	.LASF3257
+	.byte	0xc3
+	.byte	0x2e
 	.uleb128 0x85
-	.4byte	.LASF3255
-	.4byte	.LASF3255
+	.4byte	.LASF3258
+	.4byte	.LASF3258
 	.byte	0x20
 	.2byte	0x1c7
 	.uleb128 0x85
-	.4byte	.LASF3256
-	.4byte	.LASF3256
+	.4byte	.LASF3259
+	.4byte	.LASF3259
 	.byte	0x20
 	.2byte	0x17e
 	.uleb128 0x84
-	.4byte	.LASF3257
-	.4byte	.LASF3257
+	.4byte	.LASF3260
+	.4byte	.LASF3260
 	.byte	0x3
 	.byte	0x3a
 	.uleb128 0x84
-	.4byte	.LASF3258
-	.4byte	.LASF3258
+	.4byte	.LASF3261
+	.4byte	.LASF3261
 	.byte	0xc2
 	.byte	0x32
 	.uleb128 0x84
-	.4byte	.LASF3259
-	.4byte	.LASF3259
+	.4byte	.LASF3262
+	.4byte	.LASF3262
 	.byte	0xc3
 	.byte	0x2c
 	.uleb128 0x85
-	.4byte	.LASF3260
-	.4byte	.LASF3260
+	.4byte	.LASF3263
+	.4byte	.LASF3263
 	.byte	0x76
 	.2byte	0xa07
 	.uleb128 0x84
-	.4byte	.LASF3261
-	.4byte	.LASF3261
+	.4byte	.LASF3264
+	.4byte	.LASF3264
 	.byte	0x48
 	.byte	0xdc
 	.uleb128 0x85
-	.4byte	.LASF3262
-	.4byte	.LASF3262
+	.4byte	.LASF3265
+	.4byte	.LASF3265
 	.byte	0x3a
 	.2byte	0x459
 	.uleb128 0x84
-	.4byte	.LASF3263
-	.4byte	.LASF3263
+	.4byte	.LASF3266
+	.4byte	.LASF3266
 	.byte	0x3a
 	.byte	0xe9
 	.uleb128 0x85
-	.4byte	.LASF3264
-	.4byte	.LASF3264
+	.4byte	.LASF3267
+	.4byte	.LASF3267
 	.byte	0x3a
 	.2byte	0x45a
 	.uleb128 0x85
-	.4byte	.LASF3265
-	.4byte	.LASF3265
+	.4byte	.LASF3268
+	.4byte	.LASF3268
 	.byte	0x6
 	.2byte	0x19f
 	.uleb128 0x85
-	.4byte	.LASF3266
-	.4byte	.LASF3266
+	.4byte	.LASF3269
+	.4byte	.LASF3269
 	.byte	0x6
 	.2byte	0x199
 	.uleb128 0x84
-	.4byte	.LASF3267
-	.4byte	.LASF3267
+	.4byte	.LASF3270
+	.4byte	.LASF3270
 	.byte	0xc3
 	.byte	0x25
 	.uleb128 0x84
-	.4byte	.LASF3268
-	.4byte	.LASF3268
+	.4byte	.LASF3271
+	.4byte	.LASF3271
 	.byte	0xc3
 	.byte	0x2a
 	.uleb128 0x84
-	.4byte	.LASF3269
-	.4byte	.LASF3269
+	.4byte	.LASF3272
+	.4byte	.LASF3272
 	.byte	0xc3
 	.byte	0x24
 	.uleb128 0x84
-	.4byte	.LASF3270
-	.4byte	.LASF3270
+	.4byte	.LASF3273
+	.4byte	.LASF3273
 	.byte	0xc3
 	.byte	0x23
 	.uleb128 0x84
-	.4byte	.LASF3271
-	.4byte	.LASF3271
+	.4byte	.LASF3274
+	.4byte	.LASF3274
 	.byte	0x9c
 	.byte	0x73
 	.uleb128 0x84
-	.4byte	.LASF3272
-	.4byte	.LASF3272
+	.4byte	.LASF3275
+	.4byte	.LASF3275
 	.byte	0xc3
 	.byte	0x29
 	.uleb128 0x84
-	.4byte	.LASF3273
-	.4byte	.LASF3273
+	.4byte	.LASF3276
+	.4byte	.LASF3276
 	.byte	0xc3
 	.byte	0x26
 	.uleb128 0x84
-	.4byte	.LASF3274
-	.4byte	.LASF3274
+	.4byte	.LASF3277
+	.4byte	.LASF3277
 	.byte	0x72
 	.byte	0x88
 	.uleb128 0x84
-	.4byte	.LASF3275
-	.4byte	.LASF3275
+	.4byte	.LASF3278
+	.4byte	.LASF3278
 	.byte	0x72
 	.byte	0x98
 	.uleb128 0x84
-	.4byte	.LASF3276
-	.4byte	.LASF3276
+	.4byte	.LASF3279
+	.4byte	.LASF3279
 	.byte	0xc4
 	.byte	0x67
 	.uleb128 0x84
-	.4byte	.LASF3277
-	.4byte	.LASF3277
+	.4byte	.LASF3280
+	.4byte	.LASF3280
 	.byte	0xc2
 	.byte	0x33
 	.uleb128 0x85
-	.4byte	.LASF3278
-	.4byte	.LASF3278
+	.4byte	.LASF3281
+	.4byte	.LASF3281
 	.byte	0xd
 	.2byte	0x1d6
 	.uleb128 0x87
@@ -45732,18 +45843,18 @@ __exitcall_ebc_exit:
 	.byte	0x78
 	.byte	0x2c
 	.uleb128 0x84
-	.4byte	.LASF3279
-	.4byte	.LASF3279
+	.4byte	.LASF3282
+	.4byte	.LASF3282
 	.byte	0x78
 	.byte	0x27
 	.uleb128 0x84
-	.4byte	.LASF3280
-	.4byte	.LASF3280
+	.4byte	.LASF3283
+	.4byte	.LASF3283
 	.byte	0x1e
 	.byte	0xb0
 	.uleb128 0x84
-	.4byte	.LASF3281
-	.4byte	.LASF3281
+	.4byte	.LASF3284
+	.4byte	.LASF3284
 	.byte	0x9c
 	.byte	0x71
 	.byte	0
@@ -47560,9 +47671,9 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST139:
-	.8byte	.LVL467
-	.8byte	.LVL468
+.LLST142:
+	.8byte	.LVL471
+	.8byte	.LVL472
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -47574,437 +47685,437 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST140:
-	.8byte	.LVL473
-	.8byte	.LVL474
+.LLST143:
+	.8byte	.LVL477
+	.8byte	.LVL478
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST141:
-	.8byte	.LVL477
-	.8byte	.LVL478
+.LLST144:
+	.8byte	.LVL481
+	.8byte	.LVL482
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL519
-	.8byte	.LVL520
+	.8byte	.LVL523
+	.8byte	.LVL524
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL618
-	.8byte	.LVL619
+	.8byte	.LVL623
+	.8byte	.LVL624
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST142:
-	.8byte	.LVL480
-	.8byte	.LVL481
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL632
-	.8byte	.LVL633
+.LLST145:
+	.8byte	.LVL484
+	.8byte	.LVL485
 	.2byte	0x1
 	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST143:
-	.8byte	.LVL482
-	.8byte	.LVL521
+	.8byte	.LVL637
+	.8byte	.LVL638
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL524
-	.8byte	.LVL618
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST146:
+	.8byte	.LVL486
+	.8byte	.LVL525
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL619
-	.8byte	.LVL625
+	.8byte	.LVL528
+	.8byte	.LVL623
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL626
-	.8byte	.LVL627
+	.8byte	.LVL624
+	.8byte	.LVL630
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL631
 	.8byte	.LVL632
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL635
-	.8byte	.LFE2846
+	.8byte	.LVL636
+	.8byte	.LVL637
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL640
+	.8byte	.LFE2847
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST144:
-	.8byte	.LVL503
-	.8byte	.LVL514
+.LLST147:
+	.8byte	.LVL507
+	.8byte	.LVL518
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL519
-	.8byte	.LVL522
+	.8byte	.LVL523
+	.8byte	.LVL526
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL524
-	.8byte	.LVL527
+	.8byte	.LVL528
+	.8byte	.LVL531
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL608
-	.8byte	.LVL609
+	.8byte	.LVL613
+	.8byte	.LVL614
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL626
-	.8byte	.LVL627
+	.8byte	.LVL631
+	.8byte	.LVL632
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL637
-	.8byte	.LVL638
+	.8byte	.LVL642
+	.8byte	.LVL643
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST145:
-	.8byte	.LVL514
+.LLST148:
 	.8byte	.LVL518
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL519
 	.8byte	.LVL522
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL532
-	.8byte	.LVL533
+	.8byte	.LVL523
+	.8byte	.LVL526
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL631
-	.8byte	.LVL632
+	.8byte	.LVL536
+	.8byte	.LVL537
 	.2byte	0x1
 	.byte	0x6a
+	.8byte	.LVL636
 	.8byte	.LVL637
-	.8byte	.LVL638
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL642
+	.8byte	.LVL643
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST146:
-	.8byte	.LVL533
-	.8byte	.LVL534-1
+.LLST149:
+	.8byte	.LVL537
+	.8byte	.LVL538-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST147:
-	.8byte	.LVL538
-	.8byte	.LVL541
+.LLST150:
+	.8byte	.LVL542
+	.8byte	.LVL545
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST148:
-	.8byte	.LVL539
-	.8byte	.LVL540
+.LLST151:
+	.8byte	.LVL543
+	.8byte	.LVL544
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST149:
-	.8byte	.LVL519
-	.8byte	.LVL522
+.LLST152:
+	.8byte	.LVL523
+	.8byte	.LVL526
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL543
-	.8byte	.LVL551
+	.8byte	.LVL547
+	.8byte	.LVL555
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL620
-	.8byte	.LVL622
+	.8byte	.LVL625
+	.8byte	.LVL627
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL622
-	.8byte	.LVL623
+	.8byte	.LVL627
+	.8byte	.LVL628
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL623
-	.8byte	.LVL625
+	.8byte	.LVL628
+	.8byte	.LVL630
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL637
-	.8byte	.LVL638
+	.8byte	.LVL642
+	.8byte	.LVL643
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST150:
-	.8byte	.LVL546
-	.8byte	.LVL549
+.LLST153:
+	.8byte	.LVL550
+	.8byte	.LVL553
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST151:
-	.8byte	.LVL547
-	.8byte	.LVL548
+.LLST154:
+	.8byte	.LVL551
+	.8byte	.LVL552
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST152:
-	.8byte	.LVL550
-	.8byte	.LVL552-1
+.LLST155:
+	.8byte	.LVL554
+	.8byte	.LVL556-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST153:
-	.8byte	.LVL519
-	.8byte	.LVL524
+.LLST156:
+	.8byte	.LVL523
+	.8byte	.LVL528
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL557
-	.8byte	.LVL591
+	.8byte	.LVL561
+	.8byte	.LVL596
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL591
-	.8byte	.LVL592
+	.8byte	.LVL596
+	.8byte	.LVL597
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL595
-	.8byte	.LVL608
+	.8byte	.LVL600
+	.8byte	.LVL613
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL609
 	.8byte	.LVL614
+	.8byte	.LVL619
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL637
-	.8byte	.LVL644
+	.8byte	.LVL642
+	.8byte	.LVL649
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
 	.8byte	0
 	.8byte	0
-.LLST154:
-	.8byte	.LVL519
-	.8byte	.LVL524
+.LLST157:
+	.8byte	.LVL523
+	.8byte	.LVL528
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL557
-	.8byte	.LVL605
+	.8byte	.LVL561
+	.8byte	.LVL610
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL605
-	.8byte	.LVL606
+	.8byte	.LVL610
+	.8byte	.LVL611
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL609
 	.8byte	.LVL614
+	.8byte	.LVL619
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL637
-	.8byte	.LFE2846
+	.8byte	.LVL642
+	.8byte	.LFE2847
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
 	.8byte	0
 	.8byte	0
-.LLST155:
-	.8byte	.LVL519
-	.8byte	.LVL522
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL563
-	.8byte	.LVL574
+.LLST158:
+	.8byte	.LVL523
+	.8byte	.LVL526
 	.2byte	0x1
 	.byte	0x69
+	.8byte	.LVL567
 	.8byte	.LVL578
-	.8byte	.LVL587
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL595
-	.8byte	.LVL597
+	.8byte	.LVL582
+	.8byte	.LVL592
 	.2byte	0x1
 	.byte	0x69
+	.8byte	.LVL600
 	.8byte	.LVL602
-	.8byte	.LVL608
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL637
-	.8byte	.LVL641
+	.8byte	.LVL607
+	.8byte	.LVL613
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL645
-	.8byte	.LFE2846
+	.8byte	.LVL642
+	.8byte	.LVL646
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL650
+	.8byte	.LFE2847
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST156:
-	.8byte	.LVL519
+.LLST159:
 	.8byte	.LVL523
+	.8byte	.LVL527
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL568
-	.8byte	.LVL587
+	.8byte	.LVL572
+	.8byte	.LVL592
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL594
-	.8byte	.LVL608
+	.8byte	.LVL599
+	.8byte	.LVL613
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL609
 	.8byte	.LVL614
+	.8byte	.LVL619
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL637
-	.8byte	.LVL641
+	.8byte	.LVL642
+	.8byte	.LVL646
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST157:
-	.8byte	.LVL519
-	.8byte	.LVL522
+.LLST160:
+	.8byte	.LVL523
+	.8byte	.LVL526
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL559
-	.8byte	.LVL565
+	.8byte	.LVL563
+	.8byte	.LVL569
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL566
-	.8byte	.LVL569
+	.8byte	.LVL570
+	.8byte	.LVL573
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL578
-	.8byte	.LVL595
+	.8byte	.LVL582
+	.8byte	.LVL600
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL637
-	.8byte	.LVL638
+	.8byte	.LVL642
+	.8byte	.LVL643
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL641
-	.8byte	.LFE2846
+	.8byte	.LVL646
+	.8byte	.LFE2847
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST158:
-	.8byte	.LVL519
+.LLST161:
 	.8byte	.LVL523
+	.8byte	.LVL527
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL561
-	.8byte	.LVL568
+	.8byte	.LVL565
+	.8byte	.LVL572
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL570
-	.8byte	.LVL594
+	.8byte	.LVL574
+	.8byte	.LVL599
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL600
-	.8byte	.LVL602
+	.8byte	.LVL605
+	.8byte	.LVL607
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL609
 	.8byte	.LVL614
+	.8byte	.LVL619
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL637
-	.8byte	.LVL638
+	.8byte	.LVL642
+	.8byte	.LVL643
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL641
-	.8byte	.LFE2846
+	.8byte	.LVL646
+	.8byte	.LFE2847
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST159:
-	.8byte	.LVL519
+.LLST162:
 	.8byte	.LVL523
+	.8byte	.LVL527
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL564
-	.8byte	.LVL587
+	.8byte	.LVL568
+	.8byte	.LVL592
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL590
-	.8byte	.LVL608
+	.8byte	.LVL595
+	.8byte	.LVL613
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL609
 	.8byte	.LVL614
+	.8byte	.LVL619
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL637
-	.8byte	.LVL641
+	.8byte	.LVL642
+	.8byte	.LVL646
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL641
-	.8byte	.LVL642
+	.8byte	.LVL646
+	.8byte	.LVL647
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL642
-	.8byte	.LFE2846
+	.8byte	.LVL647
+	.8byte	.LFE2847
 	.2byte	0x1
 	.byte	0x6b
 	.8byte	0
 	.8byte	0
-.LLST160:
-	.8byte	.LVL519
-	.8byte	.LVL522
+.LLST163:
+	.8byte	.LVL523
+	.8byte	.LVL526
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL565
-	.8byte	.LVL587
+	.8byte	.LVL569
+	.8byte	.LVL592
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL595
-	.8byte	.LVL608
+	.8byte	.LVL600
+	.8byte	.LVL613
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL609
 	.8byte	.LVL614
+	.8byte	.LVL619
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL637
-	.8byte	.LVL638
+	.8byte	.LVL642
+	.8byte	.LVL643
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL638
-	.8byte	.LVL639
+	.8byte	.LVL643
+	.8byte	.LVL644
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL639
-	.8byte	.LVL641
+	.8byte	.LVL644
+	.8byte	.LVL646
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST161:
-	.8byte	.LVL519
-	.8byte	.LVL522
+.LLST164:
+	.8byte	.LVL523
+	.8byte	.LVL526
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL574
-	.8byte	.LVL587
+	.8byte	.LVL578
+	.8byte	.LVL592
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL600
-	.8byte	.LVL602
+	.8byte	.LVL605
+	.8byte	.LVL607
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL609
-	.8byte	.LVL611
+	.8byte	.LVL614
+	.8byte	.LVL616
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL637
-	.8byte	.LVL638
+	.8byte	.LVL642
+	.8byte	.LVL643
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
@@ -48018,86 +48129,103 @@ __exitcall_ebc_exit:
 	.8byte	0
 .LLST72:
 	.8byte	.LVL268
-	.8byte	.LVL270
+	.8byte	.LVL270-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST73:
 	.8byte	.LVL268
-	.8byte	.LVL271
+	.8byte	.LVL270-1
 	.2byte	0x1
 	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST74:
 	.8byte	.LVL271
-	.8byte	.LVL272-1
+	.8byte	.LVL272
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST74:
+.LLST75:
+	.8byte	.LVL271
 	.8byte	.LVL273
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST76:
+	.8byte	.LVL271
 	.8byte	.LVL274
 	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL274
+	.8byte	.LVL275-1
+	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST75:
-	.8byte	.LVL273
-	.8byte	.LVL275
+.LLST77:
+	.8byte	.LVL276
+	.8byte	.LVL277
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST78:
+	.8byte	.LVL276
+	.8byte	.LVL278
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST76:
-	.8byte	.LVL273
+.LLST79:
 	.8byte	.LVL276
+	.8byte	.LVL279
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL276
-	.8byte	.LVL277-1
+	.8byte	.LVL279
+	.8byte	.LVL280-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST86:
-	.8byte	.LVL298
-	.8byte	.LVL299
+.LLST89:
+	.8byte	.LVL301
+	.8byte	.LVL302
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST87:
-	.8byte	.LVL298
-	.8byte	.LVL300
+.LLST90:
+	.8byte	.LVL301
+	.8byte	.LVL303
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST88:
-	.8byte	.LVL298
-	.8byte	.LVL302
+.LLST91:
+	.8byte	.LVL301
+	.8byte	.LVL305
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL302
-	.8byte	.LVL307
+	.8byte	.LVL305
+	.8byte	.LVL310
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL308
+	.8byte	.LVL311
 	.8byte	.LFE2837
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST89:
-	.8byte	.LVL298
-	.8byte	.LVL303-1
+.LLST92:
+	.8byte	.LVL301
+	.8byte	.LVL306-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL303-1
-	.8byte	.LVL306
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL308
+	.8byte	.LVL306-1
 	.8byte	.LVL309
 	.2byte	0x1
 	.byte	0x64
@@ -48105,132 +48233,136 @@ __exitcall_ebc_exit:
 	.8byte	.LVL312
 	.2byte	0x1
 	.byte	0x64
+	.8byte	.LVL314
+	.8byte	.LVL315
+	.2byte	0x1
+	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST90:
-	.8byte	.LVL301
-	.8byte	.LVL307
+.LLST93:
+	.8byte	.LVL304
+	.8byte	.LVL310
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL308
+	.8byte	.LVL311
 	.8byte	.LFE2837
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST91:
-	.8byte	.LVL304
-	.8byte	.LVL308
+.LLST94:
+	.8byte	.LVL307
+	.8byte	.LVL311
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
-	.8byte	.LVL311
+	.8byte	.LVL314
 	.8byte	.LFE2837
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
 	.8byte	0
 	.8byte	0
-.LLST77:
-	.8byte	.LVL278
-	.8byte	.LVL279
+.LLST80:
+	.8byte	.LVL281
+	.8byte	.LVL282
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST78:
-	.8byte	.LVL278
-	.8byte	.LVL280
+.LLST81:
+	.8byte	.LVL281
+	.8byte	.LVL283
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST79:
-	.8byte	.LVL278
-	.8byte	.LVL281-1
+.LLST82:
+	.8byte	.LVL281
+	.8byte	.LVL284-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL281-1
-	.8byte	.LVL283
+	.8byte	.LVL284-1
+	.8byte	.LVL286
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST80:
-	.8byte	.LVL284
-	.8byte	.LVL285
+.LLST83:
+	.8byte	.LVL287
+	.8byte	.LVL288
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST81:
-	.8byte	.LVL284
-	.8byte	.LVL286
+.LLST84:
+	.8byte	.LVL287
+	.8byte	.LVL289
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST82:
-	.8byte	.LVL284
+.LLST85:
 	.8byte	.LVL287
+	.8byte	.LVL290
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL287
 	.8byte	.LVL290
+	.8byte	.LVL293
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL291
+	.8byte	.LVL294
 	.8byte	.LFE2835
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST83:
-	.8byte	.LVL293
-	.8byte	.LVL294
+.LLST86:
+	.8byte	.LVL296
+	.8byte	.LVL297
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST84:
-	.8byte	.LVL293
-	.8byte	.LVL295
+.LLST87:
+	.8byte	.LVL296
+	.8byte	.LVL298
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST85:
-	.8byte	.LVL293
+.LLST88:
 	.8byte	.LVL296
+	.8byte	.LVL299
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL296
-	.8byte	.LVL297-1
+	.8byte	.LVL299
+	.8byte	.LVL300-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST92:
-	.8byte	.LVL315
-	.8byte	.LVL316-1
+.LLST95:
+	.8byte	.LVL318
+	.8byte	.LVL319-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST93:
-	.8byte	.LVL315
-	.8byte	.LVL316-1
+.LLST96:
+	.8byte	.LVL318
+	.8byte	.LVL319-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST94:
-	.8byte	.LVL315
-	.8byte	.LVL316-1
+.LLST97:
+	.8byte	.LVL318
+	.8byte	.LVL319-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL316-1
-	.8byte	.LVL318
+	.8byte	.LVL319-1
+	.8byte	.LVL321
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -48966,502 +49098,506 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST176:
-	.8byte	.LVL699
-	.8byte	.LVL701
+.LLST179:
+	.8byte	.LVL704
+	.8byte	.LVL706
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST177:
-	.8byte	.LVL700
-	.8byte	.LVL708
+.LLST180:
+	.8byte	.LVL705
+	.8byte	.LVL713
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL712
+	.8byte	.LVL717
 	.8byte	.LFE2825
 	.2byte	0x1
-	.byte	0x64
-	.8byte	0
-	.8byte	0
-.LLST178:
-	.8byte	.LVL703
-	.8byte	.LVL711
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL712
-	.8byte	.LVL713
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL713
-	.8byte	.LVL723
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST181:
+	.8byte	.LVL708
+	.8byte	.LVL716
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL723
-	.8byte	.LVL724
+	.8byte	.LVL717
+	.8byte	.LVL718
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL724
-	.8byte	.LVL734
+	.8byte	.LVL718
+	.8byte	.LVL728
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL734
-	.8byte	.LVL735
+	.8byte	.LVL728
+	.8byte	.LVL749
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL735
-	.8byte	.LVL761
+	.8byte	.LVL749
+	.8byte	.LVL763
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL761
-	.8byte	.LVL762
+	.8byte	.LVL763
+	.8byte	.LVL764
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL762
-	.8byte	.LVL807
+	.8byte	.LVL764
+	.8byte	.LVL813
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL807
-	.8byte	.LVL808
+	.8byte	.LVL813
+	.8byte	.LVL814
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL808
+	.8byte	.LVL814
 	.8byte	.LFE2825
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST179:
-	.8byte	.LVL757
-	.8byte	.LVL758-1
+.LLST182:
+	.8byte	.LVL750
+	.8byte	.LVL751-1
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL770
-	.8byte	.LVL771-1
+	.8byte	.LVL752
+	.8byte	.LVL753-1
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL778
-	.8byte	.LVL779-1
+	.8byte	.LVL799
+	.8byte	.LVL800-1
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL825
+	.8byte	.LVL826
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST180:
-	.8byte	.LVL702
-	.8byte	.LVL709
+.LLST183:
+	.8byte	.LVL707
+	.8byte	.LVL714
 	.2byte	0x1
 	.byte	0x67
-	.8byte	.LVL712
+	.8byte	.LVL717
 	.8byte	.LFE2825
 	.2byte	0x1
 	.byte	0x67
 	.8byte	0
 	.8byte	0
-.LLST181:
-	.8byte	.LVL703
-	.8byte	.LVL710
+.LLST184:
+	.8byte	.LVL708
+	.8byte	.LVL715
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL712
-	.8byte	.LVL795
+	.8byte	.LVL717
+	.8byte	.LVL780
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL799
-	.8byte	.LVL802
+	.8byte	.LVL784
+	.8byte	.LVL787
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL807
-	.8byte	.LVL817
+	.8byte	.LVL792
+	.8byte	.LVL805
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL828
-	.8byte	.LVL830
+	.8byte	.LVL810
+	.8byte	.LVL812
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL831
+	.8byte	.LVL813
+	.8byte	.LVL837
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL843
 	.8byte	.LFE2825
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST184:
-	.8byte	.LVL774
-	.8byte	.LVL775
+.LLST198:
+	.8byte	.LVL802
+	.8byte	.LVL803
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL819
-	.8byte	.LVL820-1
+	.8byte	.LVL839
+	.8byte	.LVL840-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST185:
-	.8byte	.LVL784
-	.8byte	.LVL785
+.LLST197:
+	.8byte	.LVL796
+	.8byte	.LVL797
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL833
-	.8byte	.LVL834-1
+	.8byte	.LVL830
+	.8byte	.LVL831-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST183:
-	.8byte	.LVL714
-	.8byte	.LVL715
+.LLST186:
+	.8byte	.LVL719
+	.8byte	.LVL720
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL764
-	.8byte	.LVL765-1
+	.8byte	.LVL758
+	.8byte	.LVL759-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST182:
-	.8byte	.LVL703
-	.8byte	.LVL704
+.LLST185:
+	.8byte	.LVL708
+	.8byte	.LVL709
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL716
-	.8byte	.LVL717
+	.8byte	.LVL721
+	.8byte	.LVL722
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL719
-	.8byte	.LVL720-1
+	.8byte	.LVL724
+	.8byte	.LVL725-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST186:
-	.8byte	.LVL749
-	.8byte	.LVL751-1
+.LLST187:
+	.8byte	.LVL740
+	.8byte	.LVL742-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL759
-	.8byte	.LVL760-1
+	.8byte	.LVL755
+	.8byte	.LVL756-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL790
-	.8byte	.LVL807
+	.8byte	.LVL775
+	.8byte	.LVL792
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL808
-	.8byte	.LVL810-1
+	.8byte	.LVL805
+	.8byte	.LVL811-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL823
-	.8byte	.LVL829-1
+	.8byte	.LVL812
+	.8byte	.LVL813
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL830
-	.8byte	.LVL831
+	.8byte	.LVL817
+	.8byte	.LVL819-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL840
-	.8byte	.LVL841-1
+	.8byte	.LVL834
+	.8byte	.LVL835-1
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST187:
-	.8byte	.LVL795
-	.8byte	.LVL798
+.LLST188:
+	.8byte	.LVL780
+	.8byte	.LVL783
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL804
-	.8byte	.LVL807
+	.8byte	.LVL789
+	.8byte	.LVL792
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL823
-	.8byte	.LVL826
+	.8byte	.LVL805
+	.8byte	.LVL808
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL830
-	.8byte	.LVL831
+	.8byte	.LVL812
+	.8byte	.LVL813
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST188:
-	.8byte	.LVL703
-	.8byte	.LVL710
+.LLST189:
+	.8byte	.LVL708
+	.8byte	.LVL715
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL712
-	.8byte	.LVL725
+	.8byte	.LVL717
+	.8byte	.LVL729
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL734
-	.8byte	.LVL738
+	.8byte	.LVL737
+	.8byte	.LVL741
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL746
-	.8byte	.LVL750
+	.8byte	.LVL745
+	.8byte	.LVL747
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL754
-	.8byte	.LVL756
+	.8byte	.LVL748
+	.8byte	.LVL749
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL759
-	.8byte	.LVL769
+	.8byte	.LVL755
+	.8byte	.LVL765
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL794
-	.8byte	.LVL795
+	.8byte	.LVL779
+	.8byte	.LVL780
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL797
-	.8byte	.LVL803
+	.8byte	.LVL782
+	.8byte	.LVL788
 	.2byte	0x1
 	.byte	0x69
 	.8byte	.LVL807
-	.8byte	.LVL809
+	.8byte	.LVL812
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL825
-	.8byte	.LVL830
+	.8byte	.LVL813
+	.8byte	.LVL818
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL838
-	.8byte	.LVL842
+	.8byte	.LVL834
+	.8byte	.LVL836
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL844
+	.8byte	.LVL845
+	.8byte	.LVL847
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL851
 	.8byte	.LFE2825
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST189:
-	.8byte	.LVL749
-	.8byte	.LVL751-1
+.LLST190:
+	.8byte	.LVL740
+	.8byte	.LVL742-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL759
-	.8byte	.LVL760-1
+	.8byte	.LVL755
+	.8byte	.LVL756-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL794
-	.8byte	.LVL796
+	.8byte	.LVL779
+	.8byte	.LVL781
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL797
-	.8byte	.LVL807
+	.8byte	.LVL782
+	.8byte	.LVL792
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL808
-	.8byte	.LVL810-1
+	.8byte	.LVL805
+	.8byte	.LVL806
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL823
-	.8byte	.LVL824
+	.8byte	.LVL810
+	.8byte	.LVL811-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL828
-	.8byte	.LVL829-1
+	.8byte	.LVL812
+	.8byte	.LVL813
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL830
-	.8byte	.LVL831
+	.8byte	.LVL817
+	.8byte	.LVL819-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL840
-	.8byte	.LVL841-1
+	.8byte	.LVL834
+	.8byte	.LVL835-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST190:
-	.8byte	.LVL749
-	.8byte	.LVL751-1
+.LLST191:
+	.8byte	.LVL740
+	.8byte	.LVL742-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL759
-	.8byte	.LVL760-1
+	.8byte	.LVL755
+	.8byte	.LVL756-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL794
-	.8byte	.LVL805
+	.8byte	.LVL779
+	.8byte	.LVL790
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL806
-	.8byte	.LVL807
+	.8byte	.LVL791
+	.8byte	.LVL792
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL808
-	.8byte	.LVL810-1
+	.8byte	.LVL805
+	.8byte	.LVL811-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL823
-	.8byte	.LVL829-1
+	.8byte	.LVL812
+	.8byte	.LVL813
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL830
-	.8byte	.LVL831
+	.8byte	.LVL817
+	.8byte	.LVL819-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL840
-	.8byte	.LVL841-1
+	.8byte	.LVL834
+	.8byte	.LVL835-1
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST191:
-	.8byte	.LVL749
-	.8byte	.LVL751-1
+.LLST192:
+	.8byte	.LVL740
+	.8byte	.LVL742-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL759
-	.8byte	.LVL760-1
+	.8byte	.LVL755
+	.8byte	.LVL756-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL794
-	.8byte	.LVL795
+	.8byte	.LVL779
+	.8byte	.LVL780
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL798
-	.8byte	.LVL800
+	.8byte	.LVL783
+	.8byte	.LVL785
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL800
-	.8byte	.LVL801
+	.8byte	.LVL785
+	.8byte	.LVL786
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL808
-	.8byte	.LVL810-1
+	.8byte	.LVL809
+	.8byte	.LVL811-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL827
-	.8byte	.LVL829-1
+	.8byte	.LVL817
+	.8byte	.LVL819-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL840
-	.8byte	.LVL841-1
+	.8byte	.LVL834
+	.8byte	.LVL835-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST192:
-	.8byte	.LVL749
-	.8byte	.LVL751-1
+.LLST193:
+	.8byte	.LVL740
+	.8byte	.LVL742-1
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL759
-	.8byte	.LVL760-1
+	.8byte	.LVL755
+	.8byte	.LVL756-1
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL793
-	.8byte	.LVL807
+	.8byte	.LVL778
+	.8byte	.LVL792
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL808
-	.8byte	.LVL810-1
+	.8byte	.LVL805
+	.8byte	.LVL811-1
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL823
-	.8byte	.LVL829-1
+	.8byte	.LVL812
+	.8byte	.LVL813
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL830
-	.8byte	.LVL831
+	.8byte	.LVL817
+	.8byte	.LVL819-1
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL840
-	.8byte	.LVL841-1
+	.8byte	.LVL834
+	.8byte	.LVL835-1
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST193:
-	.8byte	.LVL749
-	.8byte	.LVL751-1
+.LLST194:
+	.8byte	.LVL740
+	.8byte	.LVL742-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL759
-	.8byte	.LVL760-1
+	.8byte	.LVL755
+	.8byte	.LVL756-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL791
-	.8byte	.LVL807
+	.8byte	.LVL776
+	.8byte	.LVL792
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL808
-	.8byte	.LVL810-1
+	.8byte	.LVL805
+	.8byte	.LVL811-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL823
-	.8byte	.LVL829-1
+	.8byte	.LVL812
+	.8byte	.LVL813
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL830
-	.8byte	.LVL831
+	.8byte	.LVL817
+	.8byte	.LVL819-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL840
-	.8byte	.LVL841-1
+	.8byte	.LVL834
+	.8byte	.LVL835-1
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST194:
-	.8byte	.LVL749
-	.8byte	.LVL751-1
+.LLST195:
+	.8byte	.LVL740
+	.8byte	.LVL742-1
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL759
-	.8byte	.LVL760-1
+	.8byte	.LVL755
+	.8byte	.LVL756-1
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL793
-	.8byte	.LVL807
+	.8byte	.LVL778
+	.8byte	.LVL792
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL808
-	.8byte	.LVL810-1
+	.8byte	.LVL805
+	.8byte	.LVL811-1
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL823
-	.8byte	.LVL829-1
+	.8byte	.LVL812
+	.8byte	.LVL813
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL830
-	.8byte	.LVL831
+	.8byte	.LVL817
+	.8byte	.LVL819-1
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL840
-	.8byte	.LVL841-1
+	.8byte	.LVL834
+	.8byte	.LVL835-1
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST195:
-	.8byte	.LVL749
-	.8byte	.LVL751-1
+.LLST196:
+	.8byte	.LVL740
+	.8byte	.LVL742-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL759
-	.8byte	.LVL760-1
+	.8byte	.LVL755
+	.8byte	.LVL756-1
 	.2byte	0x1
 	.byte	0x61
+	.8byte	.LVL777
 	.8byte	.LVL792
-	.8byte	.LVL807
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL808
-	.8byte	.LVL810-1
+	.8byte	.LVL805
+	.8byte	.LVL811-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL823
-	.8byte	.LVL829-1
+	.8byte	.LVL812
+	.8byte	.LVL813
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL830
-	.8byte	.LVL831
+	.8byte	.LVL817
+	.8byte	.LVL819-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL840
-	.8byte	.LVL841-1
+	.8byte	.LVL834
+	.8byte	.LVL835-1
 	.2byte	0x1
 	.byte	0x61
 	.8byte	0
@@ -49504,31 +49640,31 @@ __exitcall_ebc_exit:
 	.sleb128 20
 	.8byte	0
 	.8byte	0
-.LLST136:
-	.8byte	.LVL442
-	.8byte	.LVL443
+.LLST139:
+	.8byte	.LVL445
+	.8byte	.LVL446
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST135:
-	.8byte	.LVL424
-	.8byte	.LVL425
+.LLST138:
+	.8byte	.LVL427
+	.8byte	.LVL428
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL425
-	.8byte	.LVL429
+	.8byte	.LVL428
+	.8byte	.LVL432
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL430
-	.8byte	.LVL434
+	.8byte	.LVL433
+	.8byte	.LVL437
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL435
-	.8byte	.LVL439
+	.8byte	.LVL438
+	.8byte	.LVL442
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL440
+	.8byte	.LVL443
 	.8byte	.LFE2820
 	.2byte	0x1
 	.byte	0x64
@@ -49628,283 +49764,279 @@ __exitcall_ebc_exit:
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST173:
-	.8byte	.LVL687
-	.8byte	.LVL689
+.LLST176:
+	.8byte	.LVL692
+	.8byte	.LVL694
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST174:
-	.8byte	.LVL688
-	.8byte	.LVL691
+.LLST177:
+	.8byte	.LVL693
+	.8byte	.LVL696
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST175:
-	.8byte	.LVL691
-	.8byte	.LVL694
+.LLST178:
+	.8byte	.LVL696
+	.8byte	.LVL699
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL695
-	.8byte	.LVL698
+	.8byte	.LVL700
+	.8byte	.LVL703
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST169:
-	.8byte	.LVL676
+.LLST172:
 	.8byte	.LVL681
+	.8byte	.LVL686
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL686
+	.8byte	.LVL691
 	.8byte	.LFE2808
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST170:
-	.8byte	.LVL682
-	.8byte	.LVL683
+.LLST173:
+	.8byte	.LVL687
+	.8byte	.LVL688
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST171:
-	.8byte	.LVL680
-	.8byte	.LVL684
+.LLST174:
+	.8byte	.LVL685
+	.8byte	.LVL689
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST172:
-	.8byte	.LVL683
-	.8byte	.LVL685
+.LLST175:
+	.8byte	.LVL688
+	.8byte	.LVL690
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST163:
-	.8byte	.LVL654
-	.8byte	.LVL660
+.LLST166:
+	.8byte	.LVL659
+	.8byte	.LVL665
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL664
-	.8byte	.LVL665
+	.8byte	.LVL669
+	.8byte	.LVL670
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL674
-	.8byte	.LVL675
+	.8byte	.LVL679
+	.8byte	.LVL680
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST164:
-	.8byte	.LVL654
-	.8byte	.LVL655
+.LLST167:
+	.8byte	.LVL659
+	.8byte	.LVL660
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST165:
-	.8byte	.LVL660
-	.8byte	.LVL663
+.LLST168:
+	.8byte	.LVL665
+	.8byte	.LVL668
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL667
 	.8byte	.LVL672
+	.8byte	.LVL677
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL675
+	.8byte	.LVL680
 	.8byte	.LFE2807
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST166:
-	.8byte	.LVL659
-	.8byte	.LVL660
+.LLST169:
+	.8byte	.LVL664
+	.8byte	.LVL665
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL662
-	.8byte	.LVL666
+	.8byte	.LVL667
+	.8byte	.LVL671
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL671
-	.8byte	.LVL675
+	.8byte	.LVL676
+	.8byte	.LVL680
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST167:
-	.8byte	.LVL659
-	.8byte	.LVL661
+.LLST170:
+	.8byte	.LVL664
+	.8byte	.LVL666
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL662
-	.8byte	.LVL670
+	.8byte	.LVL667
+	.8byte	.LVL675
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL673
+	.8byte	.LVL678
 	.8byte	.LFE2807
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST168:
-	.8byte	.LVL659
-	.8byte	.LVL668
+.LLST171:
+	.8byte	.LVL664
+	.8byte	.LVL673
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL669
+	.8byte	.LVL674
 	.8byte	.LFE2807
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST95:
-	.8byte	.LVL320
-	.8byte	.LVL349
+.LLST98:
+	.8byte	.LVL323
+	.8byte	.LVL352
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL354
 	.8byte	.LVL357
+	.8byte	.LVL360
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL360
+	.8byte	.LVL363
 	.8byte	.LFE2814
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST96:
-	.8byte	.LVL320
-	.8byte	.LVL348
+.LLST99:
+	.8byte	.LVL323
+	.8byte	.LVL351
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL354
 	.8byte	.LVL357
+	.8byte	.LVL360
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL360
+	.8byte	.LVL363
 	.8byte	.LFE2814
 	.2byte	0x1
 	.byte	0x52
-	.8byte	0
-	.8byte	0
-.LLST97:
-	.8byte	.LVL320
-	.8byte	.LVL322
+	.8byte	0
+	.8byte	0
+.LLST100:
+	.8byte	.LVL323
+	.8byte	.LVL325
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL336
-	.8byte	.LVL338
+	.8byte	.LVL339
+	.8byte	.LVL341
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST98:
-	.8byte	.LVL321
-	.8byte	.LVL337
+.LLST101:
+	.8byte	.LVL324
+	.8byte	.LVL340
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL361
+	.8byte	.LVL364
 	.8byte	.LFE2814
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
-.LLST99:
-	.8byte	.LVL326
-	.8byte	.LVL336
+.LLST102:
+	.8byte	.LVL329
+	.8byte	.LVL339
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL361
+	.8byte	.LVL364
 	.8byte	.LFE2814
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST100:
-	.8byte	.LVL327
-	.8byte	.LVL336
+.LLST103:
+	.8byte	.LVL330
+	.8byte	.LVL339
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL361
+	.8byte	.LVL364
 	.8byte	.LFE2814
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST101:
-	.8byte	.LVL331
-	.8byte	.LVL333
+.LLST104:
+	.8byte	.LVL334
+	.8byte	.LVL336
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST102:
-	.8byte	.LVL328
-	.8byte	.LVL329
+.LLST105:
+	.8byte	.LVL331
+	.8byte	.LVL332
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL330
-	.8byte	.LVL334
+	.8byte	.LVL333
+	.8byte	.LVL337
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL335
-	.8byte	.LVL336
+	.8byte	.LVL338
+	.8byte	.LVL339
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL361
+	.8byte	.LVL364
 	.8byte	.LFE2814
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST103:
-	.8byte	.LVL323
-	.8byte	.LVL324
+.LLST106:
+	.8byte	.LVL326
+	.8byte	.LVL327
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST104:
-	.8byte	.LVL325
-	.8byte	.LVL336
+.LLST107:
+	.8byte	.LVL328
+	.8byte	.LVL339
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL361
+	.8byte	.LVL364
 	.8byte	.LFE2814
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST105:
-	.8byte	.LVL348
-	.8byte	.LVL350
+.LLST108:
+	.8byte	.LVL351
+	.8byte	.LVL353
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST106:
-	.8byte	.LVL349
-	.8byte	.LVL351
+.LLST109:
+	.8byte	.LVL352
+	.8byte	.LVL354
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST107:
-	.8byte	.LVL345
-	.8byte	.LVL346
-	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL347
-	.8byte	.LVL352
+.LLST110:
+	.8byte	.LVL348
+	.8byte	.LVL349
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL353
+	.8byte	.LVL350
 	.8byte	.LVL355
 	.2byte	0x1
 	.byte	0x54
@@ -49913,385 +50045,389 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x54
 	.8byte	.LVL359
+	.8byte	.LVL361
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL362
 	.8byte	.LFE2814
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST108:
-	.8byte	.LVL338
-	.8byte	.LVL339
+.LLST111:
+	.8byte	.LVL341
+	.8byte	.LVL342
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST109:
-	.8byte	.LVL362
-	.8byte	.LVL394
+.LLST112:
+	.8byte	.LVL365
+	.8byte	.LVL397
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL395
-	.8byte	.LVL397
+	.8byte	.LVL398
+	.8byte	.LVL400
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL412
 	.8byte	.LVL415
+	.8byte	.LVL418
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST110:
-	.8byte	.LVL362
-	.8byte	.LVL398
+.LLST113:
+	.8byte	.LVL365
+	.8byte	.LVL401
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL412
 	.8byte	.LVL415
+	.8byte	.LVL418
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST111:
-	.8byte	.LVL362
-	.8byte	.LVL364
+.LLST114:
+	.8byte	.LVL365
+	.8byte	.LVL367
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL382
-	.8byte	.LVL383
+	.8byte	.LVL385
+	.8byte	.LVL386
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST112:
-	.8byte	.LVL378
-	.8byte	.LVL382
+.LLST115:
+	.8byte	.LVL381
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL393
-	.8byte	.LVL406
+	.8byte	.LVL396
+	.8byte	.LVL409
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL411
+	.8byte	.LVL414
 	.8byte	.LFE2817
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST113:
-	.8byte	.LVL378
-	.8byte	.LVL382
+.LLST116:
+	.8byte	.LVL381
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL393
-	.8byte	.LVL394
+	.8byte	.LVL396
+	.8byte	.LVL397
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL395
-	.8byte	.LVL407
+	.8byte	.LVL398
+	.8byte	.LVL410
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL411
+	.8byte	.LVL414
 	.8byte	.LFE2817
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST114:
-	.8byte	.LVL378
-	.8byte	.LVL382
+.LLST117:
+	.8byte	.LVL381
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL391
+	.8byte	.LVL394
 	.8byte	.LFE2817
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST115:
-	.8byte	.LVL378
-	.8byte	.LVL382
+.LLST118:
+	.8byte	.LVL381
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL390
+	.8byte	.LVL393
 	.8byte	.LFE2817
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST116:
-	.8byte	.LVL378
-	.8byte	.LVL382
+.LLST119:
+	.8byte	.LVL381
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL395
-	.8byte	.LVL396
+	.8byte	.LVL398
+	.8byte	.LVL399
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL412
-	.8byte	.LVL413
+	.8byte	.LVL415
+	.8byte	.LVL416
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL414
-	.8byte	.LVL415
+	.8byte	.LVL417
+	.8byte	.LVL418
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST117:
-	.8byte	.LVL378
-	.8byte	.LVL382
+.LLST120:
+	.8byte	.LVL381
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL388
+	.8byte	.LVL391
 	.8byte	.LFE2817
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST118:
-	.8byte	.LVL378
-	.8byte	.LVL382
+.LLST121:
+	.8byte	.LVL381
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL389
+	.8byte	.LVL392
 	.8byte	.LFE2817
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST119:
-	.8byte	.LVL378
-	.8byte	.LVL382
+.LLST122:
+	.8byte	.LVL381
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL392
+	.8byte	.LVL395
 	.8byte	.LFE2817
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST120:
-	.8byte	.LVL384
-	.8byte	.LVL385
+.LLST123:
+	.8byte	.LVL387
+	.8byte	.LVL388
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST121:
-	.8byte	.LVL378
-	.8byte	.LVL382
+.LLST124:
+	.8byte	.LVL381
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL387
+	.8byte	.LVL390
 	.8byte	.LFE2817
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST122:
-	.8byte	.LVL378
-	.8byte	.LVL382
+.LLST125:
+	.8byte	.LVL381
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL393
-	.8byte	.LVL399
+	.8byte	.LVL396
+	.8byte	.LVL402
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL408
+	.8byte	.LVL411
 	.8byte	.LFE2817
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST123:
-	.8byte	.LVL378
-	.8byte	.LVL382
+.LLST126:
+	.8byte	.LVL381
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL393
-	.8byte	.LVL402
+	.8byte	.LVL396
+	.8byte	.LVL405
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL403
-	.8byte	.LVL404
+	.8byte	.LVL406
+	.8byte	.LVL407
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL405
-	.8byte	.LVL409
+	.8byte	.LVL408
+	.8byte	.LVL412
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL410
+	.8byte	.LVL413
 	.8byte	.LFE2817
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST124:
-	.8byte	.LVL378
-	.8byte	.LVL382
+.LLST127:
+	.8byte	.LVL381
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL393
-	.8byte	.LVL400
+	.8byte	.LVL396
+	.8byte	.LVL403
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL401
 	.8byte	.LVL404
+	.8byte	.LVL407
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL405
-	.8byte	.LVL409
+	.8byte	.LVL408
+	.8byte	.LVL412
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL410
+	.8byte	.LVL413
 	.8byte	.LFE2817
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST125:
-	.8byte	.LVL378
-	.8byte	.LVL382
+.LLST128:
+	.8byte	.LVL381
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL393
-	.8byte	.LVL400
+	.8byte	.LVL396
+	.8byte	.LVL403
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL401
-	.8byte	.LVL402
+	.8byte	.LVL404
+	.8byte	.LVL405
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL403
-	.8byte	.LVL409
+	.8byte	.LVL406
+	.8byte	.LVL412
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL410
+	.8byte	.LVL413
 	.8byte	.LFE2817
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST126:
-	.8byte	.LVL370
-	.8byte	.LVL371
-	.2byte	0x1
-	.byte	0x5d
-	.8byte	.LVL372
+.LLST129:
 	.8byte	.LVL373
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL374
 	.8byte	.LVL375
+	.8byte	.LVL376
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL376
 	.8byte	.LVL377
+	.8byte	.LVL378
 	.2byte	0x1
 	.byte	0x5d
-	.8byte	.LVL378
-	.8byte	.LVL382
+	.8byte	.LVL379
+	.8byte	.LVL380
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	.LVL381
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
-.LLST127:
-	.8byte	.LVL368
-	.8byte	.LVL381
+.LLST130:
+	.8byte	.LVL371
+	.8byte	.LVL384
 	.2byte	0x1
 	.byte	0x6e
 	.8byte	0
 	.8byte	0
-.LLST128:
-	.8byte	.LVL369
-	.8byte	.LVL382
+.LLST131:
+	.8byte	.LVL372
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST129:
-	.8byte	.LVL363
-	.8byte	.LVL386
+.LLST132:
+	.8byte	.LVL366
+	.8byte	.LVL389
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST130:
-	.8byte	.LVL365
-	.8byte	.LVL366
+.LLST133:
+	.8byte	.LVL368
+	.8byte	.LVL369
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST131:
-	.8byte	.LVL367
-	.8byte	.LVL382
+.LLST134:
+	.8byte	.LVL370
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST132:
-	.8byte	.LVL370
-	.8byte	.LVL379
+.LLST135:
+	.8byte	.LVL373
+	.8byte	.LVL382
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST133:
-	.8byte	.LVL370
-	.8byte	.LVL380
+.LLST136:
+	.8byte	.LVL373
+	.8byte	.LVL383
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST134:
-	.8byte	.LVL416
-	.8byte	.LVL417
+.LLST137:
+	.8byte	.LVL419
+	.8byte	.LVL420
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL417
-	.8byte	.LVL422
+	.8byte	.LVL420
+	.8byte	.LVL425
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL423
-	.8byte	.LFE2859
+	.8byte	.LVL426
+	.8byte	.LFE2860
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST137:
-	.8byte	.LVL456
-	.8byte	.LVL458
+.LLST140:
+	.8byte	.LVL460
+	.8byte	.LVL462
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL458
 	.8byte	.LVL462
+	.8byte	.LVL466
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL463
-	.8byte	.LVL466
+	.8byte	.LVL467
+	.8byte	.LVL470
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST138:
-	.8byte	.LVL456
-	.8byte	.LVL457
+.LLST141:
+	.8byte	.LVL460
+	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST162:
-	.8byte	.LVL646
-	.8byte	.LVL647
+.LLST165:
+	.8byte	.LVL651
+	.8byte	.LVL652
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL647
-	.8byte	.LVL651
+	.8byte	.LVL652
+	.8byte	.LVL656
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL652
-	.8byte	.LFE2864
+	.8byte	.LVL657
+	.8byte	.LFE2865
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -50306,10 +50442,10 @@ __exitcall_ebc_exit:
 	.2byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0-.Ltext0
+	.8byte	.LFB2852
+	.8byte	.LFE2852-.LFB2852
 	.8byte	.LFB2851
 	.8byte	.LFE2851-.LFB2851
-	.8byte	.LFB2850
-	.8byte	.LFE2850-.LFB2850
 	.8byte	0
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
@@ -50686,216 +50822,228 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1391
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1555
-	.8byte	.LBE1555
-	.8byte	.LBB1558
-	.8byte	.LBE1558
+	.8byte	.LBB1394
+	.8byte	.LBE1394
+	.8byte	.LBB1401
+	.8byte	.LBE1401
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1565
-	.8byte	.LBE1565
-	.8byte	.LBB1664
-	.8byte	.LBE1664
-	.8byte	.LBB1665
-	.8byte	.LBE1665
-	.8byte	.LBB1666
-	.8byte	.LBE1666
-	.8byte	.LBB1703
-	.8byte	.LBE1703
+	.8byte	.LBB1396
+	.8byte	.LBE1396
+	.8byte	.LBB1399
+	.8byte	.LBE1399
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1567
-	.8byte	.LBE1567
-	.8byte	.LBB1576
-	.8byte	.LBE1576
-	.8byte	.LBB1577
-	.8byte	.LBE1577
-	.8byte	.LBB1578
-	.8byte	.LBE1578
+	.8byte	.LBB1559
+	.8byte	.LBE1559
+	.8byte	.LBB1562
+	.8byte	.LBE1562
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1624
-	.8byte	.LBE1624
+	.8byte	.LBB1569
+	.8byte	.LBE1569
+	.8byte	.LBB1668
+	.8byte	.LBE1668
+	.8byte	.LBB1669
+	.8byte	.LBE1669
+	.8byte	.LBB1670
+	.8byte	.LBE1670
+	.8byte	.LBB1707
+	.8byte	.LBE1707
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1571
+	.8byte	.LBE1571
+	.8byte	.LBB1580
+	.8byte	.LBE1580
+	.8byte	.LBB1581
+	.8byte	.LBE1581
+	.8byte	.LBB1582
+	.8byte	.LBE1582
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1628
+	.8byte	.LBE1628
+	.8byte	.LBB1662
+	.8byte	.LBE1662
+	.8byte	.LBB1663
+	.8byte	.LBE1663
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1635
+	.8byte	.LBE1635
+	.8byte	.LBB1660
+	.8byte	.LBE1660
+	.8byte	.LBB1661
+	.8byte	.LBE1661
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1642
+	.8byte	.LBE1642
 	.8byte	.LBB1658
 	.8byte	.LBE1658
 	.8byte	.LBB1659
 	.8byte	.LBE1659
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1631
-	.8byte	.LBE1631
+	.8byte	.LBB1649
+	.8byte	.LBE1649
 	.8byte	.LBB1656
 	.8byte	.LBE1656
 	.8byte	.LBB1657
 	.8byte	.LBE1657
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1638
-	.8byte	.LBE1638
-	.8byte	.LBB1654
-	.8byte	.LBE1654
-	.8byte	.LBB1655
-	.8byte	.LBE1655
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1645
-	.8byte	.LBE1645
-	.8byte	.LBB1652
-	.8byte	.LBE1652
-	.8byte	.LBB1653
-	.8byte	.LBE1653
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1667
-	.8byte	.LBE1667
-	.8byte	.LBB1692
-	.8byte	.LBE1692
-	.8byte	.LBB1693
-	.8byte	.LBE1693
-	.8byte	.LBB1702
-	.8byte	.LBE1702
-	.8byte	.LBB1753
-	.8byte	.LBE1753
-	.8byte	.LBB1758
-	.8byte	.LBE1758
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1669
-	.8byte	.LBE1669
-	.8byte	.LBB1672
-	.8byte	.LBE1672
+	.8byte	.LBB1671
+	.8byte	.LBE1671
+	.8byte	.LBB1696
+	.8byte	.LBE1696
+	.8byte	.LBB1697
+	.8byte	.LBE1697
+	.8byte	.LBB1706
+	.8byte	.LBE1706
+	.8byte	.LBB1757
+	.8byte	.LBE1757
+	.8byte	.LBB1762
+	.8byte	.LBE1762
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1673
 	.8byte	.LBE1673
-	.8byte	.LBB1678
-	.8byte	.LBE1678
-	.8byte	.LBB1679
-	.8byte	.LBE1679
-	.8byte	.LBB1680
-	.8byte	.LBE1680
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1694
-	.8byte	.LBE1694
-	.8byte	.LBB1704
-	.8byte	.LBE1704
-	.8byte	.LBB1755
-	.8byte	.LBE1755
-	.8byte	.LBB1759
-	.8byte	.LBE1759
-	.8byte	.LBB1760
-	.8byte	.LBE1760
+	.8byte	.LBB1676
+	.8byte	.LBE1676
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1705
-	.8byte	.LBE1705
-	.8byte	.LBB1756
-	.8byte	.LBE1756
-	.8byte	.LBB1757
-	.8byte	.LBE1757
+	.8byte	.LBB1677
+	.8byte	.LBE1677
+	.8byte	.LBB1682
+	.8byte	.LBE1682
+	.8byte	.LBB1683
+	.8byte	.LBE1683
+	.8byte	.LBB1684
+	.8byte	.LBE1684
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1707
-	.8byte	.LBE1707
-	.8byte	.LBB1713
-	.8byte	.LBE1713
+	.8byte	.LBB1698
+	.8byte	.LBE1698
+	.8byte	.LBB1708
+	.8byte	.LBE1708
+	.8byte	.LBB1759
+	.8byte	.LBE1759
+	.8byte	.LBB1763
+	.8byte	.LBE1763
+	.8byte	.LBB1764
+	.8byte	.LBE1764
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1709
+	.8byte	.LBE1709
+	.8byte	.LBB1760
+	.8byte	.LBE1760
+	.8byte	.LBB1761
+	.8byte	.LBE1761
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1716
-	.8byte	.LBE1716
+	.8byte	.LBB1711
+	.8byte	.LBE1711
 	.8byte	.LBB1717
 	.8byte	.LBE1717
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1724
-	.8byte	.LBE1724
-	.8byte	.LBB1730
-	.8byte	.LBE1730
-	.8byte	.LBB1731
-	.8byte	.LBE1731
-	.8byte	.LBB1732
-	.8byte	.LBE1732
-	.8byte	.LBB1733
-	.8byte	.LBE1733
+	.8byte	.LBB1720
+	.8byte	.LBE1720
+	.8byte	.LBB1721
+	.8byte	.LBE1721
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1728
+	.8byte	.LBE1728
 	.8byte	.LBB1734
 	.8byte	.LBE1734
-	.8byte	.LBB1752
-	.8byte	.LBE1752
-	.8byte	.LBB1754
-	.8byte	.LBE1754
-	.8byte	.LBB1761
-	.8byte	.LBE1761
+	.8byte	.LBB1735
+	.8byte	.LBE1735
+	.8byte	.LBB1736
+	.8byte	.LBE1736
+	.8byte	.LBB1737
+	.8byte	.LBE1737
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1790
-	.8byte	.LBE1790
-	.8byte	.LBB1797
-	.8byte	.LBE1797
-	.8byte	.LBB1798
-	.8byte	.LBE1798
+	.8byte	.LBB1738
+	.8byte	.LBE1738
+	.8byte	.LBB1756
+	.8byte	.LBE1756
+	.8byte	.LBB1758
+	.8byte	.LBE1758
+	.8byte	.LBB1765
+	.8byte	.LBE1765
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1792
-	.8byte	.LBE1792
-	.8byte	.LBB1793
-	.8byte	.LBE1793
 	.8byte	.LBB1794
 	.8byte	.LBE1794
+	.8byte	.LBB1801
+	.8byte	.LBE1801
+	.8byte	.LBB1802
+	.8byte	.LBE1802
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1799
-	.8byte	.LBE1799
-	.8byte	.LBB1803
-	.8byte	.LBE1803
-	.8byte	.LBB1804
-	.8byte	.LBE1804
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1810
-	.8byte	.LBE1810
-	.8byte	.LBB1826
-	.8byte	.LBE1826
+	.8byte	.LBB1796
+	.8byte	.LBE1796
+	.8byte	.LBB1797
+	.8byte	.LBE1797
+	.8byte	.LBB1798
+	.8byte	.LBE1798
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1812
-	.8byte	.LBE1812
-	.8byte	.LBB1813
-	.8byte	.LBE1813
+	.8byte	.LBB1803
+	.8byte	.LBE1803
+	.8byte	.LBB1807
+	.8byte	.LBE1807
+	.8byte	.LBB1808
+	.8byte	.LBE1808
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1814
 	.8byte	.LBE1814
-	.8byte	.LBB1829
-	.8byte	.LBE1829
+	.8byte	.LBB1820
+	.8byte	.LBE1820
+	.8byte	.LBB1821
+	.8byte	.LBE1821
+	.8byte	.LBB1830
+	.8byte	.LBE1830
+	.8byte	.LBB1831
+	.8byte	.LBE1831
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1816
-	.8byte	.LBE1816
-	.8byte	.LBB1817
-	.8byte	.LBE1817
+	.8byte	.LBB1822
+	.8byte	.LBE1822
+	.8byte	.LBB1832
+	.8byte	.LBE1832
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1818
-	.8byte	.LBE1818
 	.8byte	.LBB1824
 	.8byte	.LBE1824
 	.8byte	.LBB1825
 	.8byte	.LBE1825
-	.8byte	.LBB1827
-	.8byte	.LBE1827
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1826
+	.8byte	.LBE1826
+	.8byte	.LBB1833
+	.8byte	.LBE1833
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB1828
 	.8byte	.LBE1828
+	.8byte	.LBB1829
+	.8byte	.LBE1829
 	.8byte	0
 	.8byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0
+	.8byte	.LFB2852
+	.8byte	.LFE2852
 	.8byte	.LFB2851
 	.8byte	.LFE2851
-	.8byte	.LFB2850
-	.8byte	.LFE2850
 	.8byte	0
 	.8byte	0
 	.section	.debug_line,"",@progbits
@@ -50919,7 +51067,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_REQ_IDLE"
 .LASF2380:
 	.string	"suppliers"
-.LASF3041:
+.LASF3042:
 	.string	"ebc_buffer_manage_init"
 .LASF2879:
 	.string	"EPD_FULL_GCC16"
@@ -50977,7 +51125,7 @@ __exitcall_ebc_exit:
 	.string	"dev_kobj"
 .LASF474:
 	.string	"d_release"
-.LASF3150:
+.LASF3152:
 	.string	"get_arch_dma_ops"
 .LASF304:
 	.string	"__ctors_start"
@@ -51011,7 +51159,7 @@ __exitcall_ebc_exit:
 	.string	"si_code"
 .LASF648:
 	.string	"thread_node"
-.LASF3088:
+.LASF3090:
 	.string	"temperature"
 .LASF1301:
 	.string	"map_pages"
@@ -51051,9 +51199,9 @@ __exitcall_ebc_exit:
 	.string	"gpio_desc"
 .LASF961:
 	.string	"list"
-.LASF3167:
+.LASF3169:
 	.string	"_copy_from_user"
-.LASF3193:
+.LASF3195:
 	.string	"get_order"
 .LASF944:
 	.string	"si_errno"
@@ -51087,7 +51235,7 @@ __exitcall_ebc_exit:
 	.string	"mm_rb"
 .LASF2186:
 	.string	"freeze_late"
-.LASF3060:
+.LASF3062:
 	.string	"buf_info"
 .LASF408:
 	.string	"d_inode"
@@ -51111,7 +51259,7 @@ __exitcall_ebc_exit:
 	.string	"n_node"
 .LASF1623:
 	.string	"qsize_t"
-.LASF3190:
+.LASF3192:
 	.string	"devm_kzalloc"
 .LASF379:
 	.string	"sequence"
@@ -51127,7 +51275,7 @@ __exitcall_ebc_exit:
 	.string	"s_state"
 .LASF1065:
 	.string	"run_list"
-.LASF3109:
+.LASF3111:
 	.string	"clac_full_data_align8"
 .LASF2552:
 	.string	"SCHED_SOFTIRQ"
@@ -51149,7 +51297,7 @@ __exitcall_ebc_exit:
 	.string	"param_ops_uint"
 .LASF890:
 	.string	"softirq_activated"
-.LASF3025:
+.LASF3026:
 	.string	"pdev"
 .LASF826:
 	.string	"system_long_wq"
@@ -51173,7 +51321,7 @@ __exitcall_ebc_exit:
 	.string	"c_true"
 .LASF1577:
 	.string	"notifier_call"
-.LASF3067:
+.LASF3069:
 	.string	"ebc_exit"
 .LASF1832:
 	.string	"gendisk"
@@ -51199,7 +51347,7 @@ __exitcall_ebc_exit:
 	.string	"size_t"
 .LASF208:
 	.string	"compat_elf_hwcap"
-.LASF3262:
+.LASF3265:
 	.string	"prepare_to_wait_event"
 .LASF1109:
 	.string	"cap_permitted"
@@ -51241,10 +51389,8 @@ __exitcall_ebc_exit:
 	.string	"__reserved"
 .LASF939:
 	.string	"_sigfault"
-.LASF3121:
+.LASF3123:
 	.string	"image_bg"
-.LASF3017:
-	.string	"__addressable_ebc_init2262"
 .LASF2857:
 	.string	"ebc_buf_status"
 .LASF1806:
@@ -51275,6 +51421,8 @@ __exitcall_ebc_exit:
 	.string	"fmode_t"
 .LASF2223:
 	.string	"devt"
+.LASF3018:
+	.string	"__addressable_ebc_init2270"
 .LASF947:
 	.string	"siginfo_t"
 .LASF2183:
@@ -51333,9 +51481,9 @@ __exitcall_ebc_exit:
 	.string	"irqchip_fwnode_ops"
 .LASF1613:
 	.string	"dq_id"
-.LASF3113:
+.LASF3115:
 	.string	"frame_count_tmp"
-.LASF3120:
+.LASF3122:
 	.string	"image_fb"
 .LASF1788:
 	.string	"write_end"
@@ -51343,7 +51491,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ION_HEAP_POOL"
 .LASF1423:
 	.string	"sysctl_protected_hardlinks"
-.LASF3266:
+.LASF3269:
 	.string	"__arch_copy_from_user"
 .LASF1176:
 	.string	"scan_objects"
@@ -51351,7 +51499,7 @@ __exitcall_ebc_exit:
 	.string	"pageset"
 .LASF1237:
 	.string	"wb_err"
-.LASF3164:
+.LASF3166:
 	.string	"copy_to_user"
 .LASF734:
 	.string	"trace_recursion"
@@ -51447,7 +51595,7 @@ __exitcall_ebc_exit:
 	.string	"lgonl"
 .LASF534:
 	.string	"destroy_work"
-.LASF3076:
+.LASF3078:
 	.string	"one_buffer_end"
 .LASF253:
 	.string	"FTR_LOWER_SAFE"
@@ -51463,7 +51611,7 @@ __exitcall_ebc_exit:
 	.string	"pcpu_chosen_fc"
 .LASF390:
 	.string	"dentry_stat_t"
-.LASF3215:
+.LASF3217:
 	.string	"atomic_add"
 .LASF1642:
 	.string	"dqi_bgrace"
@@ -51481,7 +51629,7 @@ __exitcall_ebc_exit:
 	.string	"ctl_table"
 .LASF43:
 	.string	"uid_t"
-.LASF3244:
+.LASF3246:
 	.string	"strstr"
 .LASF2847:
 	.string	"WF_TYPE_A2"
@@ -51543,7 +51691,7 @@ __exitcall_ebc_exit:
 	.string	"pteval_t"
 .LASF429:
 	.string	"i_ino"
-.LASF3285:
+.LASF3288:
 	.string	"might_fault"
 .LASF1561:
 	.string	"compact_cached_free_pfn"
@@ -51661,7 +51809,7 @@ __exitcall_ebc_exit:
 	.string	"pidfd_fops"
 .LASF1916:
 	.string	"lm_put_owner"
-.LASF3246:
+.LASF3248:
 	.string	"ebc_pmic_verity_vcom"
 .LASF2523:
 	.string	"set_sda"
@@ -51767,11 +51915,11 @@ __exitcall_ebc_exit:
 	.string	"sysfs_dev_block_kobj"
 .LASF554:
 	.string	"upid"
-.LASF3274:
+.LASF3277:
 	.string	"down_write"
 .LASF1098:
 	.string	"completion"
-.LASF3074:
+.LASF3076:
 	.string	"old_prev_buf"
 .LASF1499:
 	.string	"NR_GPU_HEAP"
@@ -51791,7 +51939,7 @@ __exitcall_ebc_exit:
 	.string	"show_options"
 .LASF2142:
 	.string	"uevent_helper"
-.LASF3045:
+.LASF3046:
 	.string	"lut_buffer_phy"
 .LASF109:
 	.string	"mmap_supported_flags"
@@ -51871,13 +52019,13 @@ __exitcall_ebc_exit:
 	.string	"RPM_SUSPENDED"
 .LASF697:
 	.string	"reclaim_state"
-.LASF3284:
+.LASF3287:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF137:
 	.string	"vendor_panic_cb"
-.LASF3069:
+.LASF3071:
 	.string	"ebc_vdd_power_timeout"
-.LASF3136:
+.LASF3138:
 	.string	"ebc_get_4pix_wf"
 .LASF2798:
 	.string	"num_symtab"
@@ -51905,13 +52053,13 @@ __exitcall_ebc_exit:
 	.string	"module_alloc_base"
 .LASF1751:
 	.string	"core_kallsyms"
-.LASF3248:
+.LASF3250:
 	.string	"memcpy"
 .LASF2893:
 	.string	"EPD_FORCE_FULL"
 .LASF2400:
 	.string	"get_sgtable"
-.LASF3117:
+.LASF3119:
 	.string	"xor_val"
 .LASF2155:
 	.string	"envp_idx"
@@ -51923,11 +52071,11 @@ __exitcall_ebc_exit:
 	.string	"OOM_KILL"
 .LASF444:
 	.string	"i_hash"
-.LASF3101:
+.LASF3103:
 	.string	"gray_old"
 .LASF67:
 	.string	"hlist_node"
-.LASF3255:
+.LASF3258:
 	.string	"sprintf"
 .LASF1908:
 	.string	"fl_ops"
@@ -51937,7 +52085,7 @@ __exitcall_ebc_exit:
 	.string	"debug_guardpage_ops"
 .LASF2673:
 	.string	"COMPACTISOLATED"
-.LASF3226:
+.LASF3228:
 	.string	"of_property_read_variable_u32_array"
 .LASF327:
 	.string	"__inittext_begin"
@@ -51973,7 +52121,7 @@ __exitcall_ebc_exit:
 	.string	"DOMAIN_BUS_WAKEUP"
 .LASF1222:
 	.string	"arm64_el2_vector_last_slot"
-.LASF3278:
+.LASF3281:
 	.string	"queue_work_on"
 .LASF2335:
 	.string	"online"
@@ -51981,7 +52129,7 @@ __exitcall_ebc_exit:
 	.string	"runtime_resume"
 .LASF1207:
 	.string	"dup_xol_work"
-.LASF3157:
+.LASF3159:
 	.string	"ebc_pmic_read_temp"
 .LASF2875:
 	.string	"EPD_FULL_GC16"
@@ -52075,7 +52223,7 @@ __exitcall_ebc_exit:
 	.string	"f_mode"
 .LASF1429:
 	.string	"ki_complete"
-.LASF3028:
+.LASF3029:
 	.string	"ebc_tcon_pdev"
 .LASF1755:
 	.string	"percpu"
@@ -52095,7 +52243,7 @@ __exitcall_ebc_exit:
 	.string	"driver"
 .LASF1544:
 	.string	"ZONE_NORMAL"
-.LASF3122:
+.LASF3124:
 	.string	"image_new_data"
 .LASF425:
 	.string	"i_op"
@@ -52149,7 +52297,7 @@ __exitcall_ebc_exit:
 	.string	"huge_fault"
 .LASF2008:
 	.string	"kstatfs"
-.LASF3160:
+.LASF3162:
 	.string	"ebc_pmic_power_off"
 .LASF2634:
 	.string	"PGPGOUTCLEAN"
@@ -52167,7 +52315,7 @@ __exitcall_ebc_exit:
 	.string	"i_dentry"
 .LASF2128:
 	.string	"grab_current_ns"
-.LASF3043:
+.LASF3044:
 	.string	"fb_size"
 .LASF883:
 	.string	"offset"
@@ -52177,7 +52325,7 @@ __exitcall_ebc_exit:
 	.string	"fsnotify_mark_connector"
 .LASF941:
 	.string	"_sigsys"
-.LASF3087:
+.LASF3089:
 	.string	"ebc_lut_update"
 .LASF1921:
 	.string	"lm_setup"
@@ -52211,7 +52359,7 @@ __exitcall_ebc_exit:
 	.string	"idmap_pg_dir"
 .LASF2518:
 	.string	"i2c_bus_recovery_info"
-.LASF3046:
+.LASF3047:
 	.string	"lut_buffer_size"
 .LASF483:
 	.string	"s_dev"
@@ -52221,7 +52369,7 @@ __exitcall_ebc_exit:
 	.string	"get_next_id"
 .LASF237:
 	.string	"rwlock_t"
-.LASF3283:
+.LASF3286:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
 .LASF840:
 	.string	"pgprot"
@@ -52249,7 +52397,7 @@ __exitcall_ebc_exit:
 	.string	"__icache_flags"
 .LASF147:
 	.string	"crash_kexec_post_notifiers"
-.LASF3145:
+.LASF3147:
 	.string	"eink_mode"
 .LASF1697:
 	.string	"rt_spc_warnlimit"
@@ -52271,7 +52419,7 @@ __exitcall_ebc_exit:
 	.string	"_pid"
 .LASF1156:
 	.string	"init_stack"
-.LASF3128:
+.LASF3130:
 	.string	"dmask"
 .LASF1225:
 	.string	"address_space"
@@ -52289,7 +52437,7 @@ __exitcall_ebc_exit:
 	.string	"i_wb"
 .LASF2086:
 	.string	"idr_next"
-.LASF3114:
+.LASF3116:
 	.string	"frame_count_data"
 .LASF2954:
 	.string	"frame_start"
@@ -52339,7 +52487,7 @@ __exitcall_ebc_exit:
 	.string	"normal_prio"
 .LASF1288:
 	.string	"f_ep_links"
-.LASF3126:
+.LASF3128:
 	.string	"image_fb_tmp"
 .LASF2294:
 	.string	"last_busy"
@@ -52351,7 +52499,7 @@ __exitcall_ebc_exit:
 	.string	"host"
 .LASF184:
 	.string	"uaddr"
-.LASF3273:
+.LASF3276:
 	.string	"ebc_remove_from_dsp_buf_list"
 .LASF661:
 	.string	"real_start_time"
@@ -52387,11 +52535,11 @@ __exitcall_ebc_exit:
 	.string	"devres_head"
 .LASF427:
 	.string	"i_mapping"
-.LASF3250:
+.LASF3252:
 	.string	"misc_register"
 .LASF722:
 	.string	"rseq_sig"
-.LASF3179:
+.LASF3181:
 	.string	"platform_set_drvdata"
 .LASF342:
 	.string	"cpu_context"
@@ -52399,7 +52547,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pm_domain"
 .LASF1513:
 	.string	"nr_zones"
-.LASF3202:
+.LASF3204:
 	.string	"is_source"
 .LASF1375:
 	.string	"migrate_mode"
@@ -52421,11 +52569,11 @@ __exitcall_ebc_exit:
 	.string	"d_hash"
 .LASF1075:
 	.string	"dl_bw"
-.LASF3172:
+.LASF3174:
 	.string	"limit"
 .LASF2145:
 	.string	"kobj"
-.LASF3256:
+.LASF3259:
 	.string	"kstrtouint"
 .LASF113:
 	.string	"fsync"
@@ -52435,13 +52583,13 @@ __exitcall_ebc_exit:
 	.string	"i_flags"
 .LASF2891:
 	.string	"EPD_RESUME"
-.LASF3245:
+.LASF3247:
 	.string	"sscanf"
-.LASF3241:
+.LASF3243:
 	.string	"ebc_empty_buf_get"
 .LASF1474:
 	.string	"NR_ISOLATED_ANON"
-.LASF3044:
+.LASF3045:
 	.string	"ebc_lut_table_init"
 .LASF1213:
 	.string	"uprobes_state"
@@ -52451,7 +52599,7 @@ __exitcall_ebc_exit:
 	.string	"rb_node"
 .LASF613:
 	.string	"pushable_tasks"
-.LASF3127:
+.LASF3129:
 	.string	"image_bg_tmp"
 .LASF2202:
 	.string	"platform_data"
@@ -52481,7 +52629,7 @@ __exitcall_ebc_exit:
 	.string	"last_update_time"
 .LASF1137:
 	.string	"robust_list_head"
-.LASF3239:
+.LASF3241:
 	.string	"init_timer_key"
 .LASF1480:
 	.string	"NR_ANON_MAPPED"
@@ -52495,7 +52643,7 @@ __exitcall_ebc_exit:
 	.string	"srcversion"
 .LASF858:
 	.string	"pcpu_unit_offsets"
-.LASF3148:
+.LASF3150:
 	.string	"dma_sync_single_for_device"
 .LASF2955:
 	.string	"dsp_end_callback"
@@ -52553,7 +52701,7 @@ __exitcall_ebc_exit:
 	.string	"uevent_ops"
 .LASF545:
 	.string	"rename_lock"
-.LASF3075:
+.LASF3077:
 	.string	"__out"
 .LASF680:
 	.string	"sas_ss_sp"
@@ -52561,7 +52709,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_INACTIVE_ANON"
 .LASF728:
 	.string	"nr_dirtied"
-.LASF3189:
+.LASF3191:
 	.string	"dev_get_drvdata"
 .LASF2395:
 	.string	"linear_revmap"
@@ -52605,11 +52753,11 @@ __exitcall_ebc_exit:
 	.string	"sysctl_memory_failure_early_kill"
 .LASF2760:
 	.string	"param_ops_bool_enable_only"
-.LASF3133:
+.LASF3135:
 	.string	"power_status"
 .LASF306:
 	.string	"__start_opd"
-.LASF3253:
+.LASF3255:
 	.string	"of_find_i2c_device_by_node"
 .LASF153:
 	.string	"SYSTEM_RUNNING"
@@ -52649,7 +52797,7 @@ __exitcall_ebc_exit:
 	.string	"panel"
 .LASF2432:
 	.string	"irq_data"
-.LASF3082:
+.LASF3084:
 	.string	"old_buffer_temp"
 .LASF2705:
 	.string	"sysctl_memory_failure_recovery"
@@ -52667,7 +52815,7 @@ __exitcall_ebc_exit:
 	.string	"st_shndx"
 .LASF2399:
 	.string	"free"
-.LASF3050:
+.LASF3052:
 	.string	"pmic_vcom_write"
 .LASF2133:
 	.string	"attribute"
@@ -52683,7 +52831,7 @@ __exitcall_ebc_exit:
 	.string	"taint_flags"
 .LASF1347:
 	.string	"membarrier_state"
-.LASF3139:
+.LASF3141:
 	.string	"pre_image_addr"
 .LASF2178:
 	.string	"suspend"
@@ -52737,6 +52885,8 @@ __exitcall_ebc_exit:
 	.string	"path"
 .LASF2727:
 	.string	"st_size"
+.LASF3014:
+	.string	"dev_attr_ebc_buf_state"
 .LASF188:
 	.string	"rmtp"
 .LASF2426:
@@ -52749,7 +52899,7 @@ __exitcall_ebc_exit:
 	.string	"exit_code"
 .LASF1056:
 	.string	"exec_start"
-.LASF3280:
+.LASF3283:
 	.string	"printk"
 .LASF2381:
 	.string	"consumers"
@@ -52773,7 +52923,7 @@ __exitcall_ebc_exit:
 	.string	"unlink"
 .LASF2717:
 	.string	"d_ptr"
-.LASF3052:
+.LASF3054:
 	.string	"pmic_temp_read"
 .LASF1652:
 	.string	"dqstats"
@@ -52795,7 +52945,7 @@ __exitcall_ebc_exit:
 	.string	"mmap_rnd_bits"
 .LASF2461:
 	.string	"of_stdout"
-.LASF3073:
+.LASF3075:
 	.string	"new_prev_buf"
 .LASF976:
 	.string	"vm_ops"
@@ -52811,9 +52961,9 @@ __exitcall_ebc_exit:
 	.string	"timer"
 .LASF2462:
 	.string	"devtree_lock"
-.LASF3130:
+.LASF3132:
 	.string	"refresh_new_image_auto"
-.LASF3063:
+.LASF3065:
 	.string	"__ret"
 .LASF1864:
 	.string	"update_time"
@@ -52837,11 +52987,11 @@ __exitcall_ebc_exit:
 	.string	"optimistic_spin_queue"
 .LASF2960:
 	.string	"ebc_buffer_size"
-.LASF3257:
+.LASF3260:
 	.string	"ebc_pmic_set_vcom"
 .LASF2641:
 	.string	"ALLOCSTALL_NORMAL"
-.LASF3105:
+.LASF3107:
 	.string	"data_buf_tmp"
 .LASF325:
 	.string	"__initdata_begin"
@@ -53009,7 +53159,7 @@ __exitcall_ebc_exit:
 	.string	"seq_show"
 .LASF766:
 	.string	"ate_match_dt"
-.LASF3187:
+.LASF3189:
 	.string	"of_node_put"
 .LASF1360:
 	.string	"cow_page"
@@ -53033,7 +53183,7 @@ __exitcall_ebc_exit:
 	.string	"s_shrink"
 .LASF1525:
 	.string	"kcompactd_classzone_idx"
-.LASF3177:
+.LASF3179:
 	.string	"kmalloc_index"
 .LASF869:
 	.string	"hrtimer_restart"
@@ -53113,7 +53263,7 @@ __exitcall_ebc_exit:
 	.string	"ate_match_local_cap_id"
 .LASF2453:
 	.string	"property"
-.LASF3047:
+.LASF3048:
 	.string	"ebc_sysfs_init"
 .LASF991:
 	.string	"wchar"
@@ -53143,7 +53293,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_DELAYED_BIT"
 .LASF1038:
 	.string	"nr_failed_migrations_affine"
-.LASF3192:
+.LASF3194:
 	.string	"IS_ERR"
 .LASF861:
 	.string	"PCPU_FC_EMBED"
@@ -53157,7 +53307,7 @@ __exitcall_ebc_exit:
 	.string	"pi_top_task"
 .LASF805:
 	.string	"WORK_NR_COLORS"
-.LASF3131:
+.LASF3133:
 	.string	"refresh_new_image2"
 .LASF527:
 	.string	"s_fsnotify_inode_refs"
@@ -53169,7 +53319,7 @@ __exitcall_ebc_exit:
 	.string	"uprobe"
 .LASF528:
 	.string	"s_readonly_remount"
-.LASF3218:
+.LASF3220:
 	.string	"kasan_check_write"
 .LASF377:
 	.string	"hlist_bl_node"
@@ -53195,7 +53345,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_FLAG_MASK"
 .LASF1271:
 	.string	"units"
-.LASF3233:
+.LASF3235:
 	.string	"epd_lut_from_mem_init"
 .LASF311:
 	.string	"__nosave_begin"
@@ -53215,7 +53365,7 @@ __exitcall_ebc_exit:
 	.string	"user_namespace"
 .LASF2756:
 	.string	"param_ops_ulong"
-.LASF3209:
+.LASF3211:
 	.string	"get_current"
 .LASF231:
 	.string	"raw_spinlock"
@@ -53239,7 +53389,7 @@ __exitcall_ebc_exit:
 	.string	"fault_address"
 .LASF1606:
 	.string	"dq_inuse"
-.LASF3096:
+.LASF3098:
 	.string	"direct_mode_data_change_part"
 .LASF1641:
 	.string	"dqi_flags"
@@ -53247,9 +53397,9 @@ __exitcall_ebc_exit:
 	.string	"PGREFILL"
 .LASF2762:
 	.string	"param_ops_bint"
-.LASF3242:
+.LASF3244:
 	.string	"ebc_add_to_dsp_buf_list"
-.LASF3247:
+.LASF3249:
 	.string	"kfree"
 .LASF1802:
 	.string	"swap_deactivate"
@@ -53261,6 +53411,8 @@ __exitcall_ebc_exit:
 	.string	"WORKINGSET_REFAULT"
 .LASF1640:
 	.string	"dqi_dirty_list"
+.LASF3049:
+	.string	"ebc_buf_state_read"
 .LASF229:
 	.string	"prove_locking"
 .LASF2791:
@@ -53317,7 +53469,7 @@ __exitcall_ebc_exit:
 	.string	"boost_expires"
 .LASF2910:
 	.string	"DMA_BIDIRECTIONAL"
-.LASF3265:
+.LASF3268:
 	.string	"__arch_copy_to_user"
 .LASF235:
 	.string	"spinlock"
@@ -53335,13 +53487,13 @@ __exitcall_ebc_exit:
 	.string	"d_compare"
 .LASF971:
 	.string	"vm_mm"
-.LASF3083:
+.LASF3085:
 	.string	"need_refresh"
 .LASF2820:
 	.string	"platform_bus_type"
-.LASF3097:
+.LASF3099:
 	.string	"data_buf"
-.LASF3037:
+.LASF3038:
 	.string	"ulogo_buf"
 .LASF1637:
 	.string	"mem_dqinfo"
@@ -53359,7 +53511,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_OFFQ_POOL_BITS"
 .LASF1905:
 	.string	"fl_fasync"
-.LASF3142:
+.LASF3144:
 	.string	"update_mode"
 .LASF2937:
 	.string	"direct_mode"
@@ -53431,15 +53583,15 @@ __exitcall_ebc_exit:
 	.string	"page_ext_operations"
 .LASF2663:
 	.string	"KSWAPD_HIGH_WMARK_HIT_QUICKLY"
-.LASF3048:
+.LASF3050:
 	.string	"ebc_state_read"
-.LASF3254:
+.LASF3256:
 	.string	"__stack_chk_fail"
 .LASF2908:
 	.string	"pmic_set_vcom"
 .LASF2699:
 	.string	"stack_guard_gap"
-.LASF3201:
+.LASF3203:
 	.string	"bytes"
 .LASF1738:
 	.string	"gpl_future_crcs"
@@ -53471,7 +53623,7 @@ __exitcall_ebc_exit:
 	.string	"thaw_noirq"
 .LASF969:
 	.string	"vm_rb"
-.LASF3021:
+.LASF3022:
 	.string	"kernel_read_file_str"
 .LASF568:
 	.string	"init_user_ns"
@@ -53515,7 +53667,7 @@ __exitcall_ebc_exit:
 	.string	"cb_state"
 .LASF2920:
 	.string	"orig_nents"
-.LASF3062:
+.LASF3064:
 	.string	"buf_addr"
 .LASF412:
 	.string	"d_sb"
@@ -53543,7 +53695,7 @@ __exitcall_ebc_exit:
 	.string	"i_mtime"
 .LASF2604:
 	.string	"dev_page_fault_t"
-.LASF3090:
+.LASF3092:
 	.string	"ebc_auto_tast_function"
 .LASF24:
 	.string	"__kernel_gid32_t"
@@ -53555,7 +53707,7 @@ __exitcall_ebc_exit:
 	.string	"MODULE_STATE_COMING"
 .LASF2231:
 	.string	"offline_disabled"
-.LASF3185:
+.LASF3187:
 	.string	"of_property_read_u32_array"
 .LASF2476:
 	.string	"select"
@@ -53601,7 +53753,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pagemap"
 .LASF2648:
 	.string	"PGDEACTIVATE"
-.LASF3104:
+.LASF3106:
 	.string	"buffer_old_tmp"
 .LASF1784:
 	.string	"writepages"
@@ -53621,7 +53773,7 @@ __exitcall_ebc_exit:
 	.string	"writeback_control"
 .LASF1904:
 	.string	"fl_end"
-.LASF3268:
+.LASF3271:
 	.string	"ebc_find_buf_by_phy_addr"
 .LASF1951:
 	.string	"super_operations"
@@ -53661,13 +53813,13 @@ __exitcall_ebc_exit:
 	.string	"core"
 .LASF1815:
 	.string	"bd_holders"
-.LASF3094:
+.LASF3096:
 	.string	"reset_and_flip"
 .LASF2948:
 	.string	"enable"
 .LASF955:
 	.string	"pipe_bufs"
-.LASF3206:
+.LASF3208:
 	.string	"to_user"
 .LASF2124:
 	.string	"KOBJ_NS_TYPE_NET"
@@ -53687,7 +53839,7 @@ __exitcall_ebc_exit:
 	.string	"__rb_parent_color"
 .LASF2224:
 	.string	"devres_lock"
-.LASF3129:
+.LASF3131:
 	.string	"new_buffer_refresh"
 .LASF365:
 	.string	"bits"
@@ -53703,9 +53855,9 @@ __exitcall_ebc_exit:
 	.string	"lookup"
 .LASF1590:
 	.string	"cpu_topology"
-.LASF3210:
+.LASF3212:
 	.string	"sp_el0"
-.LASF3272:
+.LASF3275:
 	.string	"ebc_dsp_buf_get"
 .LASF2897:
 	.string	"panel_color"
@@ -53735,7 +53887,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_AUTO"
 .LASF1227:
 	.string	"i_pages"
-.LASF3169:
+.LASF3171:
 	.string	"safe_ptr"
 .LASF376:
 	.string	"hlist_bl_head"
@@ -53765,9 +53917,9 @@ __exitcall_ebc_exit:
 	.string	"unix_inflight"
 .LASF1726:
 	.string	"holders_dir"
-.LASF3064:
+.LASF3066:
 	.string	"__wq_entry"
-.LASF3078:
+.LASF3080:
 	.string	"new_buffer"
 .LASF463:
 	.string	"i_fsnotify_mask"
@@ -53775,7 +53927,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_LOW_WMARK_HIT_QUICKLY"
 .LASF994:
 	.string	"syscfs"
-.LASF3162:
+.LASF3164:
 	.string	"wake_unlock"
 .LASF2445:
 	.string	"graph_get_port_parent"
@@ -53783,7 +53935,7 @@ __exitcall_ebc_exit:
 	.string	"UNEVICTABLE_PGRESCUED"
 .LASF2209:
 	.string	"msi_list"
-.LASF3212:
+.LASF3214:
 	.string	"__ilog2_u64"
 .LASF547:
 	.string	"compat_time_t"
@@ -53807,7 +53959,7 @@ __exitcall_ebc_exit:
 	.string	"cap_effective"
 .LASF1746:
 	.string	"taints"
-.LASF3228:
+.LASF3230:
 	.string	"of_address_to_resource"
 .LASF1012:
 	.string	"enqueued"
@@ -53835,7 +53987,7 @@ __exitcall_ebc_exit:
 	.string	"bd_private"
 .LASF1903:
 	.string	"fl_start"
-.LASF3184:
+.LASF3186:
 	.string	"out_value"
 .LASF1961:
 	.string	"freeze_fs"
@@ -53843,7 +53995,7 @@ __exitcall_ebc_exit:
 	.string	"sigset_t"
 .LASF1917:
 	.string	"lm_notify"
-.LASF3141:
+.LASF3143:
 	.string	"ebc_tcon_dsp_mode_set"
 .LASF880:
 	.string	"running"
@@ -53869,7 +54021,7 @@ __exitcall_ebc_exit:
 	.string	"d_automount"
 .LASF1265:
 	.string	"page_free"
-.LASF3091:
+.LASF3093:
 	.string	"__val"
 .LASF1481:
 	.string	"NR_FILE_MAPPED"
@@ -53881,13 +54033,13 @@ __exitcall_ebc_exit:
 	.string	"copy_file_range"
 .LASF2685:
 	.string	"UNEVICTABLE_PGCLEARED"
-.LASF3258:
+.LASF3261:
 	.string	"epd_lut_get_wf_version"
 .LASF2047:
 	.string	"key_type"
 .LASF797:
 	.string	"WORK_STRUCT_LINKED_BIT"
-.LASF3203:
+.LASF3205:
 	.string	"copy_overflow"
 .LASF2441:
 	.string	"get_named_child_node"
@@ -53901,9 +54053,9 @@ __exitcall_ebc_exit:
 	.string	"clone_mnt_data"
 .LASF2777:
 	.string	"module_kobject"
-.LASF3042:
+.LASF3043:
 	.string	"memory"
-.LASF3176:
+.LASF3178:
 	.string	"order"
 .LASF739:
 	.string	"active_memcg"
@@ -53917,7 +54069,7 @@ __exitcall_ebc_exit:
 	.string	"refcount"
 .LASF1790:
 	.string	"invalidatepage"
-.LASF3068:
+.LASF3070:
 	.string	"ebc_frame_timeout"
 .LASF363:
 	.string	"wait_queue_head_t"
@@ -53939,7 +54091,7 @@ __exitcall_ebc_exit:
 	.string	"EPD_A2"
 .LASF2102:
 	.string	"kernfs_elem_attr"
-.LASF3081:
+.LASF3083:
 	.string	"new_buffer_temp"
 .LASF2299:
 	.string	"set_latency_tolerance"
@@ -53953,7 +54105,7 @@ __exitcall_ebc_exit:
 	.string	"arm64_ftr_reg_ctrel0"
 .LASF1244:
 	.string	"counters"
-.LASF3219:
+.LASF3221:
 	.string	"kasan_check_read"
 .LASF2059:
 	.string	"name_link"
@@ -53973,7 +54125,7 @@ __exitcall_ebc_exit:
 	.string	"policy"
 .LASF1293:
 	.string	"shared"
-.LASF3015:
+.LASF3016:
 	.string	"ebc_match"
 .LASF2946:
 	.string	"dclk"
@@ -54005,7 +54157,7 @@ __exitcall_ebc_exit:
 	.string	"__con_initcall_start"
 .LASF1717:
 	.string	"get_dqblk"
-.LASF3027:
+.LASF3028:
 	.string	"ebc_tcon_node"
 .LASF2817:
 	.string	"id_entry"
@@ -54015,7 +54167,7 @@ __exitcall_ebc_exit:
 	.string	"nr_irqs"
 .LASF894:
 	.string	"max_hang_time"
-.LASF3165:
+.LASF3167:
 	.string	"copy_from_user"
 .LASF2467:
 	.string	"DOMAIN_BUS_ANY"
@@ -54029,9 +54181,9 @@ __exitcall_ebc_exit:
 	.string	"mmap_miss"
 .LASF1654:
 	.string	"quota_format_ops"
-.LASF3270:
+.LASF3273:
 	.string	"ebc_osd_buf_get"
-.LASF3059:
+.LASF3061:
 	.string	"argp"
 .LASF1754:
 	.string	"args"
@@ -54049,7 +54201,7 @@ __exitcall_ebc_exit:
 	.string	"static_key_initialized"
 .LASF2784:
 	.string	"module_uevent"
-.LASF3072:
+.LASF3074:
 	.string	"is_full_mode"
 .LASF2597:
 	.string	"base_pfn"
@@ -54057,7 +54209,7 @@ __exitcall_ebc_exit:
 	.string	"width"
 .LASF929:
 	.string	"_addr_pkey"
-.LASF3055:
+.LASF3057:
 	.string	"waveform_buffer"
 .LASF296:
 	.string	"__start_rodata"
@@ -54069,17 +54221,17 @@ __exitcall_ebc_exit:
 	.string	"thread_keyring"
 .LASF2745:
 	.string	"kparam_array"
-.LASF3221:
+.LASF3223:
 	.string	"platform_driver_unregister"
 .LASF652:
 	.string	"utime"
 .LASF1334:
 	.string	"start_code"
-.LASF3016:
+.LASF3017:
 	.string	"ebc_driver"
 .LASF2605:
 	.string	"dev_page_free_t"
-.LASF3182:
+.LASF3184:
 	.string	"of_property_read_u32"
 .LASF1398:
 	.string	"guid_t"
@@ -54099,7 +54251,7 @@ __exitcall_ebc_exit:
 	.string	"tz_minuteswest"
 .LASF2459:
 	.string	"of_chosen"
-.LASF3092:
+.LASF3094:
 	.string	"ebc_frame_start"
 .LASF348:
 	.string	"sve_state"
@@ -54109,7 +54261,7 @@ __exitcall_ebc_exit:
 	.string	"cpumask_t"
 .LASF133:
 	.string	"kmsg_fops"
-.LASF3267:
+.LASF3270:
 	.string	"ebc_buf_release"
 .LASF819:
 	.string	"WORK_STRUCT_NO_POOL"
@@ -54131,7 +54283,7 @@ __exitcall_ebc_exit:
 	.string	"sched_rt_entity"
 .LASF116:
 	.string	"sendpage"
-.LASF3135:
+.LASF3137:
 	.string	"ret_val"
 .LASF866:
 	.string	"timerqueue_node"
@@ -54141,7 +54293,7 @@ __exitcall_ebc_exit:
 	.string	"mem_dqblk"
 .LASF2772:
 	.string	"plt_entry"
-.LASF3143:
+.LASF3145:
 	.string	"display_mode"
 .LASF1980:
 	.string	"nr_cached_objects"
@@ -54173,11 +54325,11 @@ __exitcall_ebc_exit:
 	.string	"fops"
 .LASF1273:
 	.string	"f_path"
-.LASF3235:
+.LASF3237:
 	.string	"kthread_create_on_node"
 .LASF711:
 	.string	"cgroups"
-.LASF3168:
+.LASF3170:
 	.string	"__uaccess_mask_ptr"
 .LASF2344:
 	.string	"probe_type"
@@ -54197,9 +54349,9 @@ __exitcall_ebc_exit:
 	.string	"userspace_clients"
 .LASF2143:
 	.string	"uevent_seqnum"
-.LASF3231:
+.LASF3233:
 	.string	"memset"
-.LASF3140:
+.LASF3142:
 	.string	"cur_image_addr"
 .LASF2144:
 	.string	"list_lock"
@@ -54233,7 +54385,7 @@ __exitcall_ebc_exit:
 	.string	"file_lock_operations"
 .LASF343:
 	.string	"tp_value"
-.LASF3024:
+.LASF3025:
 	.string	"ebc_remove"
 .LASF1893:
 	.string	"fl_list"
@@ -54247,7 +54399,7 @@ __exitcall_ebc_exit:
 	.string	"qf_fmt_id"
 .LASF1050:
 	.string	"nr_wakeups_idle"
-.LASF3275:
+.LASF3278:
 	.string	"up_write"
 .LASF1458:
 	.string	"NR_MLOCK"
@@ -54267,7 +54419,7 @@ __exitcall_ebc_exit:
 	.string	"panel_16bit"
 .LASF1322:
 	.string	"page_table_lock"
-.LASF3014:
+.LASF3015:
 	.string	"ebc_pm"
 .LASF2840:
 	.string	"sched_priority"
@@ -54283,7 +54435,7 @@ __exitcall_ebc_exit:
 	.string	"console_printk"
 .LASF702:
 	.string	"ioac"
-.LASF3196:
+.LASF3198:
 	.string	"__init_work"
 .LASF1171:
 	.string	"nr_to_scan"
@@ -54295,7 +54447,7 @@ __exitcall_ebc_exit:
 	.string	"exec_max"
 .LASF1403:
 	.string	"uuid_index"
-.LASF3197:
+.LASF3199:
 	.string	"onstack"
 .LASF189:
 	.string	"compat_rmtp"
@@ -54323,7 +54475,7 @@ __exitcall_ebc_exit:
 	.string	"__i_nlink"
 .LASF144:
 	.string	"panic_on_warn"
-.LASF3066:
+.LASF3068:
 	.string	"ebc_panel_probe"
 .LASF79:
 	.string	"boot_command_line"
@@ -54389,13 +54541,13 @@ __exitcall_ebc_exit:
 	.string	"d_rt_space"
 .LASF264:
 	.string	"name"
-.LASF3240:
+.LASF3242:
 	.string	"mod_timer"
 .LASF150:
 	.string	"early_boot_irqs_disabled"
 .LASF658:
 	.string	"nvcsw"
-.LASF3040:
+.LASF3041:
 	.string	"ebc_task_init"
 .LASF2832:
 	.string	"KMALLOC_NORMAL"
@@ -54415,7 +54567,7 @@ __exitcall_ebc_exit:
 	.string	"i_gid"
 .LASF1619:
 	.string	"quota_type"
-.LASF3099:
+.LASF3101:
 	.string	"buffer_old"
 .LASF1536:
 	.string	"high"
@@ -54459,9 +54611,9 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_WRITE_PENDING"
 .LASF1296:
 	.string	"close"
-.LASF3123:
+.LASF3125:
 	.string	"image_fb_data"
-.LASF3038:
+.LASF3039:
 	.string	"klogo_buf"
 .LASF2892:
 	.string	"EPD_POWER_OFF"
@@ -54471,13 +54623,13 @@ __exitcall_ebc_exit:
 	.string	"ebc_wq"
 .LASF736:
 	.string	"memcg_oom_gfp_mask"
-.LASF3199:
+.LASF3201:
 	.string	"_msecs_to_jiffies"
 .LASF1683:
 	.string	"d_spc_timer"
 .LASF1759:
 	.string	"jump_entries"
-.LASF3207:
+.LASF3209:
 	.string	"test_ti_thread_flag"
 .LASF2255:
 	.string	"async_suspend"
@@ -54487,7 +54639,7 @@ __exitcall_ebc_exit:
 	.string	"read_pos"
 .LASF481:
 	.string	"super_block"
-.LASF3170:
+.LASF3172:
 	.string	"__addr"
 .LASF2322:
 	.string	"dma_coherent"
@@ -54525,7 +54677,7 @@ __exitcall_ebc_exit:
 	.string	"map_sg"
 .LASF1159:
 	.string	"nlink"
-.LASF3033:
+.LASF3034:
 	.string	"ulogo_addr_valid"
 .LASF2577:
 	.string	"percpu_ref"
@@ -54533,11 +54685,11 @@ __exitcall_ebc_exit:
 	.string	"devkmsg_log_str"
 .LASF254:
 	.string	"FTR_HIGHER_SAFE"
-.LASF3181:
+.LASF3183:
 	.string	"i2c_get_clientdata"
-.LASF3166:
+.LASF3168:
 	.string	"_copy_to_user"
-.LASF3214:
+.LASF3216:
 	.string	"test_bit"
 .LASF248:
 	.string	"__start___jump_table"
@@ -54553,7 +54705,7 @@ __exitcall_ebc_exit:
 	.string	"mems_allowed_seq"
 .LASF1770:
 	.string	"refcnt"
-.LASF3084:
+.LASF3086:
 	.string	"pbuf_new"
 .LASF2181:
 	.string	"thaw"
@@ -54569,9 +54721,9 @@ __exitcall_ebc_exit:
 	.string	"futex"
 .LASF1025:
 	.string	"wait_max"
-.LASF3238:
+.LASF3240:
 	.string	"wakeup_source_add"
-.LASF3159:
+.LASF3161:
 	.string	"ebc_pmic_suspend"
 .LASF1158:
 	.string	"result_mask"
@@ -54583,15 +54735,15 @@ __exitcall_ebc_exit:
 	.string	"dquot_operations"
 .LASF1224:
 	.string	"mapping"
-.LASF3191:
+.LASF3193:
 	.string	"resource_size"
-.LASF3236:
+.LASF3238:
 	.string	"wake_up_process"
 .LASF1354:
 	.string	"kioctx_table"
 .LASF852:
 	.string	"rb_right"
-.LASF3103:
+.LASF3105:
 	.string	"buffer_new_tmp"
 .LASF978:
 	.string	"vm_file"
@@ -54617,11 +54769,11 @@ __exitcall_ebc_exit:
 	.string	"__initdata_end"
 .LASF2501:
 	.string	"bus_lock"
-.LASF3178:
+.LASF3180:
 	.string	"kmalloc_type"
 .LASF387:
 	.string	"qstr"
-.LASF3102:
+.LASF3104:
 	.string	"gray_new"
 .LASF1092:
 	.string	"futex_state"
@@ -54629,7 +54781,7 @@ __exitcall_ebc_exit:
 	.string	"WORKINGSET_RESTORE"
 .LASF628:
 	.string	"sched_psi_wake_requeue"
-.LASF3200:
+.LASF3202:
 	.string	"check_copy_size"
 .LASF737:
 	.string	"memcg_oom_order"
@@ -54685,17 +54837,17 @@ __exitcall_ebc_exit:
 	.string	"core_state"
 .LASF868:
 	.string	"timerqueue_head"
-.LASF3237:
+.LASF3239:
 	.string	"sched_setscheduler_nocheck"
 .LASF1291:
 	.string	"f_wb_err"
-.LASF3194:
+.LASF3196:
 	.string	"schedule_work"
 .LASF2430:
 	.string	"rt_mutex"
 .LASF990:
 	.string	"rchar"
-.LASF3151:
+.LASF3153:
 	.string	"valid_dma_direction"
 .LASF1818:
 	.string	"bd_contains"
@@ -54731,13 +54883,13 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_FLAG_BITS"
 .LASF2448:
 	.string	"fwnode_endpoint"
-.LASF3065:
+.LASF3067:
 	.string	"__int"
 .LASF952:
 	.string	"epoll_watches"
 .LASF2677:
 	.string	"KCOMPACTD_WAKE"
-.LASF3118:
+.LASF3120:
 	.string	"refresh_new_image"
 .LASF2074:
 	.string	"non_rcu"
@@ -54771,7 +54923,7 @@ __exitcall_ebc_exit:
 	.string	"_uid"
 .LASF339:
 	.string	"hbp_break"
-.LASF3029:
+.LASF3030:
 	.string	"pmic_node"
 .LASF138:
 	.string	"panic_blink"
@@ -54811,13 +54963,13 @@ __exitcall_ebc_exit:
 	.string	"need"
 .LASF504:
 	.string	"s_encoding"
-.LASF3195:
+.LASF3197:
 	.string	"queue_work"
 .LASF1734:
 	.string	"gpl_crcs"
 .LASF1720:
 	.string	"get_state"
-.LASF3154:
+.LASF3156:
 	.string	"dma_handle"
 .LASF1359:
 	.string	"orig_pte"
@@ -54885,12 +55037,14 @@ __exitcall_ebc_exit:
 	.string	"NR_WRITEBACK_TEMP"
 .LASF2513:
 	.string	"functionality"
-.LASF3107:
+.LASF3109:
 	.string	"clac_part_data_align8"
 .LASF305:
 	.string	"__ctors_end"
 .LASF2266:
 	.string	"wakeup_path"
+.LASF3257:
+	.string	"ebc_buf_state_show"
 .LASF968:
 	.string	"vm_prev"
 .LASF273:
@@ -54905,7 +55059,7 @@ __exitcall_ebc_exit:
 	.string	"__u8"
 .LASF115:
 	.string	"lock"
-.LASF3158:
+.LASF3160:
 	.string	"ebc_pmic_resume"
 .LASF1562:
 	.string	"compact_cached_migrate_pfn"
@@ -54947,7 +55101,7 @@ __exitcall_ebc_exit:
 	.string	"compact_order_failed"
 .LASF1105:
 	.string	"fsuid"
-.LASF3208:
+.LASF3210:
 	.string	"flag"
 .LASF1475:
 	.string	"NR_ISOLATED_FILE"
@@ -54959,9 +55113,9 @@ __exitcall_ebc_exit:
 	.string	"managed_pages"
 .LASF2589:
 	.string	"__tracepoint_page_ref_set"
-.LASF3147:
+.LASF3149:
 	.string	"ebc_tcon_enable"
-.LASF3282:
+.LASF3285:
 	.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"
@@ -55009,13 +55163,13 @@ __exitcall_ebc_exit:
 	.string	"s_vop"
 .LASF1650:
 	.string	"qf_owner"
-.LASF3220:
+.LASF3222:
 	.string	"__write_once_size"
 .LASF2831:
 	.string	"kmalloc_cache_type"
 .LASF574:
 	.string	"mutex"
-.LASF3186:
+.LASF3188:
 	.string	"out_values"
 .LASF839:
 	.string	"pgd_t"
@@ -55029,7 +55183,7 @@ __exitcall_ebc_exit:
 	.string	"raw_spinlock_t"
 .LASF2935:
 	.string	"vir_width"
-.LASF3211:
+.LASF3213:
 	.string	"INIT_LIST_HEAD"
 .LASF1938:
 	.string	"fs_flags"
@@ -55045,11 +55199,11 @@ __exitcall_ebc_exit:
 	.string	"dma_pfn_offset"
 .LASF1189:
 	.string	"radix_tree_node"
-.LASF3213:
+.LASF3215:
 	.string	"sign_extend64"
 .LASF2313:
 	.string	"wake_irq"
-.LASF3031:
+.LASF3032:
 	.string	"ulogo_addr"
 .LASF859:
 	.string	"pcpu_fc"
@@ -55067,7 +55221,7 @@ __exitcall_ebc_exit:
 	.string	"ptraced"
 .LASF2751:
 	.string	"param_ops_short"
-.LASF3252:
+.LASF3254:
 	.string	"of_find_device_by_node"
 .LASF2553:
 	.string	"HRTIMER_SOFTIRQ"
@@ -55087,13 +55241,13 @@ __exitcall_ebc_exit:
 	.string	"d_lockref"
 .LASF2242:
 	.string	"rpm_request"
-.LASF3058:
+.LASF3060:
 	.string	"ebc_io_ctl"
 .LASF1149:
 	.string	"addr"
 .LASF2385:
 	.string	"device_private"
-.LASF3149:
+.LASF3151:
 	.string	"get_dma_ops"
 .LASF2697:
 	.string	"watermark_scale_factor"
@@ -55109,7 +55263,7 @@ __exitcall_ebc_exit:
 	.string	"mkobj"
 .LASF2962:
 	.string	"direct_buf_real_size"
-.LASF3271:
+.LASF3274:
 	.string	"__pm_relax"
 .LASF472:
 	.string	"d_delete"
@@ -55119,7 +55273,7 @@ __exitcall_ebc_exit:
 	.string	"begin"
 .LASF2736:
 	.string	"sh_link"
-.LASF3022:
+.LASF3023:
 	.string	"ebc_suspend"
 .LASF2357:
 	.string	"cls_msk"
@@ -55141,19 +55295,19 @@ __exitcall_ebc_exit:
 	.string	"num_resources"
 .LASF1575:
 	.string	"notifier_fn_t"
-.LASF3030:
+.LASF3031:
 	.string	"pmic_client"
 .LASF2571:
 	.string	"miscdevice"
 .LASF655:
 	.string	"time_in_state"
-.LASF3039:
+.LASF3040:
 	.string	"ebc_logo_init"
 .LASF1268:
 	.string	"kill"
 .LASF1029:
 	.string	"iowait_sum"
-.LASF3119:
+.LASF3121:
 	.string	"image_new"
 .LASF15:
 	.string	"__u64"
@@ -55183,9 +55337,9 @@ __exitcall_ebc_exit:
 	.string	"frame_timer"
 .LASF1032:
 	.string	"sum_sleep_runtime"
-.LASF3035:
+.LASF3036:
 	.string	"ulogo_addr_str"
-.LASF3095:
+.LASF3097:
 	.string	"flip"
 .LASF1078:
 	.string	"deadline"
@@ -55227,11 +55381,11 @@ __exitcall_ebc_exit:
 	.string	"read_dqblk"
 .LASF1615:
 	.string	"dq_flags"
-.LASF3098:
+.LASF3100:
 	.string	"buffer_new"
 .LASF212:
 	.string	"user_fpsimd_state"
-.LASF3251:
+.LASF3253:
 	.string	"device_create_file"
 .LASF520:
 	.string	"s_time_gran"
@@ -55255,11 +55409,11 @@ __exitcall_ebc_exit:
 	.string	"s_bdi"
 .LASF2856:
 	.string	"wf_table"
-.LASF3125:
+.LASF3127:
 	.string	"image_new_tmp"
 .LASF1731:
 	.string	"num_kp"
-.LASF3281:
+.LASF3284:
 	.string	"__pm_stay_awake"
 .LASF2564:
 	.string	"vmap_area_list"
@@ -55427,11 +55581,11 @@ __exitcall_ebc_exit:
 	.string	"groups"
 .LASF693:
 	.string	"pi_blocked_on"
-.LASF3026:
+.LASF3027:
 	.string	"ebc_probe"
 .LASF500:
 	.string	"s_xattr"
-.LASF3036:
+.LASF3037:
 	.string	"klogo_addr_str"
 .LASF992:
 	.string	"syscr"
@@ -55465,7 +55619,7 @@ __exitcall_ebc_exit:
 	.string	"s_inode_list_lock"
 .LASF2599:
 	.string	"align"
-.LASF3106:
+.LASF3108:
 	.string	"frame_idx"
 .LASF203:
 	.string	"mm_segment_t"
@@ -55487,7 +55641,7 @@ __exitcall_ebc_exit:
 	.string	"maj_flt"
 .LASF228:
 	.string	"arch_rwlock_t"
-.LASF3269:
+.LASF3272:
 	.string	"ebc_osd_buf_clone"
 .LASF161:
 	.string	"c_false"
@@ -55513,7 +55667,7 @@ __exitcall_ebc_exit:
 	.string	"minor"
 .LASF1698:
 	.string	"nextents"
-.LASF3152:
+.LASF3154:
 	.string	"dma_direction"
 .LASF1:
 	.string	"sizetype"
@@ -55523,13 +55677,13 @@ __exitcall_ebc_exit:
 	.string	"arg_lock"
 .LASF1740:
 	.string	"num_exentries"
-.LASF3086:
+.LASF3088:
 	.string	"check_out"
 .LASF2608:
 	.string	"high_memory"
 .LASF48:
 	.string	"int32_t"
-.LASF3018:
+.LASF3019:
 	.string	"__exitcall_ebc_exit"
 .LASF1039:
 	.string	"nr_failed_migrations_running"
@@ -55537,7 +55691,7 @@ __exitcall_ebc_exit:
 	.string	"next_timer"
 .LASF740:
 	.string	"throttle_queue"
-.LASF3264:
+.LASF3267:
 	.string	"finish_wait"
 .LASF1479:
 	.string	"WORKINGSET_NODERECLAIM"
@@ -55547,7 +55701,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_REQ_RESUME"
 .LASF2044:
 	.string	"keyring_index_key"
-.LASF3146:
+.LASF3148:
 	.string	"ebc_tcon_disable"
 .LASF1420:
 	.string	"leases_enable"
@@ -55589,7 +55743,7 @@ __exitcall_ebc_exit:
 	.string	"num_vf"
 .LASF1534:
 	.string	"isolate_mode_t"
-.LASF3153:
+.LASF3155:
 	.string	"debug_dma_sync_single_for_device"
 .LASF98:
 	.string	"llseek"
@@ -55631,9 +55785,9 @@ __exitcall_ebc_exit:
 	.string	"target"
 .LASF2545:
 	.string	"HI_SOFTIRQ"
-.LASF3155:
+.LASF3157:
 	.string	"direction"
-.LASF3124:
+.LASF3126:
 	.string	"image_bg_data"
 .LASF957:
 	.string	"session_keyring"
@@ -55643,7 +55797,7 @@ __exitcall_ebc_exit:
 	.string	"key_restrict_link_func_t"
 .LASF1484:
 	.string	"NR_WRITEBACK"
-.LASF3112:
+.LASF3114:
 	.string	"frame_count"
 .LASF486:
 	.string	"s_maxbytes"
@@ -55657,7 +55811,7 @@ __exitcall_ebc_exit:
 	.string	"i2c_bus_type"
 .LASF884:
 	.string	"hrtimer_cpu_base"
-.LASF3276:
+.LASF3279:
 	.string	"ebc_notify"
 .LASF1390:
 	.string	"cb_head"
@@ -55685,7 +55839,7 @@ __exitcall_ebc_exit:
 	.string	"cpus_requested"
 .LASF2593:
 	.string	"__tracepoint_page_ref_mod_unless"
-.LASF3163:
+.LASF3165:
 	.string	"wake_lock_init"
 .LASF1185:
 	.string	"list_lru"
@@ -55709,7 +55863,7 @@ __exitcall_ebc_exit:
 	.string	"d_iput"
 .LASF107:
 	.string	"compat_ioctl"
-.LASF3171:
+.LASF3173:
 	.string	"__range_ok"
 .LASF286:
 	.string	"__start_ro_after_init"
@@ -55717,7 +55871,7 @@ __exitcall_ebc_exit:
 	.string	"num_poisoned_pages"
 .LASF904:
 	.string	"filter"
-.LASF3156:
+.LASF3158:
 	.string	"ebc_pmic_get_vcom"
 .LASF2943:
 	.string	"ebc_tcon"
@@ -55827,11 +55981,11 @@ __exitcall_ebc_exit:
 	.string	"power"
 .LASF265:
 	.string	"strict_mask"
-.LASF3263:
+.LASF3266:
 	.string	"init_wait_entry"
 .LASF2786:
 	.string	"module_state"
-.LASF3223:
+.LASF3225:
 	.string	"_dev_info"
 .LASF416:
 	.string	"d_subdirs"
@@ -55877,13 +56031,13 @@ __exitcall_ebc_exit:
 	.string	"removed_mem"
 .LASF247:
 	.string	"jump_label_t"
-.LASF3137:
+.LASF3139:
 	.string	"ebc_tcon_frame_start"
 .LASF2711:
 	.string	"Elf64_Half"
 .LASF2286:
 	.string	"use_autosuspend"
-.LASF3019:
+.LASF3020:
 	.string	"ebc_init"
 .LASF674:
 	.string	"nsproxy"
@@ -55891,7 +56045,7 @@ __exitcall_ebc_exit:
 	.string	"can_wakeup"
 .LASF2546:
 	.string	"TIMER_SOFTIRQ"
-.LASF3116:
+.LASF3118:
 	.string	"temp_data"
 .LASF1214:
 	.string	"xol_area"
@@ -55917,11 +56071,11 @@ __exitcall_ebc_exit:
 	.string	"init_on_free"
 .LASF1151:
 	.string	"nr_pages"
-.LASF3132:
+.LASF3134:
 	.string	"ebc_power_set"
 .LASF1761:
 	.string	"num_trace_bprintk_fmt"
-.LASF3217:
+.LASF3219:
 	.string	"__fls"
 .LASF1129:
 	.string	"ioprio"
@@ -55947,9 +56101,9 @@ __exitcall_ebc_exit:
 	.string	"persistent_clock_is_local"
 .LASF2413:
 	.string	"dma_supported"
-.LASF3188:
+.LASF3190:
 	.string	"dev_set_drvdata"
-.LASF3277:
+.LASF3280:
 	.string	"epd_lut_get"
 .LASF1535:
 	.string	"per_cpu_pages"
@@ -55985,7 +56139,7 @@ __exitcall_ebc_exit:
 	.string	"BLOCK_SOFTIRQ"
 .LASF1411:
 	.string	"files_stat_struct"
-.LASF3229:
+.LASF3231:
 	.string	"devm_memremap"
 .LASF843:
 	.string	"pgtable_t"
@@ -55997,7 +56151,7 @@ __exitcall_ebc_exit:
 	.string	"symlink"
 .LASF1574:
 	.string	"mem_map"
-.LASF3079:
+.LASF3081:
 	.string	"old_buffer"
 .LASF2953:
 	.string	"lut_data_set"
@@ -56053,7 +56207,7 @@ __exitcall_ebc_exit:
 	.string	"rm_xquota"
 .LASF1084:
 	.string	"dl_timer"
-.LASF3260:
+.LASF3263:
 	.string	"remap_pfn_range"
 .LASF2375:
 	.string	"DL_DEV_NO_DRIVER"
@@ -56067,7 +56221,7 @@ __exitcall_ebc_exit:
 	.string	"watermark"
 .LASF2423:
 	.string	"deadprops"
-.LASF3225:
+.LASF3227:
 	.string	"devm_kmalloc"
 .LASF16:
 	.string	"long long unsigned int"
@@ -56143,7 +56297,7 @@ __exitcall_ebc_exit:
 	.string	"pstate_check_t"
 .LASF830:
 	.string	"system_freezable_power_efficient_wq"
-.LASF3023:
+.LASF3024:
 	.string	"__func__"
 .LASF56:
 	.string	"resource_size_t"
@@ -56195,13 +56349,13 @@ __exitcall_ebc_exit:
 	.string	"page_entry_size"
 .LASF2974:
 	.string	"lut_data"
-.LASF3093:
+.LASF3095:
 	.string	"ebc_other_init"
 .LASF1446:
 	.string	"free_list"
 .LASF589:
 	.string	"prio"
-.LASF3180:
+.LASF3182:
 	.string	"platform_get_drvdata"
 .LASF2555:
 	.string	"NR_SOFTIRQS"
@@ -56223,7 +56377,7 @@ __exitcall_ebc_exit:
 	.string	"atomic_t"
 .LASF812:
 	.string	"WORK_OFFQ_FLAG_BITS"
-.LASF3138:
+.LASF3140:
 	.string	"ebc_tcon_image_addr_set"
 .LASF2531:
 	.string	"max_num_msgs"
@@ -56243,7 +56397,7 @@ __exitcall_ebc_exit:
 	.string	"scatterlist"
 .LASF1267:
 	.string	"altmap_valid"
-.LASF3279:
+.LASF3282:
 	.string	"down"
 .LASF101:
 	.string	"read_iter"
@@ -56281,7 +56435,7 @@ __exitcall_ebc_exit:
 	.string	"pm_domain_data"
 .LASF2487:
 	.string	"byte"
-.LASF3249:
+.LASF3251:
 	.string	"__wake_up_sync"
 .LASF2002:
 	.string	"poll_table_struct"
@@ -56307,7 +56461,7 @@ __exitcall_ebc_exit:
 	.string	"page_fault"
 .LASF1469:
 	.string	"NR_INACTIVE_FILE"
-.LASF3204:
+.LASF3206:
 	.string	"__ret_warn_on"
 .LASF1625:
 	.string	"kqid"
@@ -56397,7 +56551,7 @@ __exitcall_ebc_exit:
 	.string	"thread_id"
 .LASF732:
 	.string	"default_timer_slack_ns"
-.LASF3054:
+.LASF3056:
 	.string	"waveform_version_read"
 .LASF1767:
 	.string	"source_list"
@@ -56427,7 +56581,7 @@ __exitcall_ebc_exit:
 	.string	"of_match_table"
 .LASF2578:
 	.string	"percpu_count_ptr"
-.LASF3259:
+.LASF3262:
 	.string	"ebc_phy_buf_base_get"
 .LASF2079:
 	.string	"loops_per_jiffy"
@@ -56449,7 +56603,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_INODESTEAL"
 .LASF1175:
 	.string	"count_objects"
-.LASF3216:
+.LASF3218:
 	.string	"fls64"
 .LASF921:
 	.string	"_stime"
@@ -56469,7 +56623,7 @@ __exitcall_ebc_exit:
 	.string	"statistics"
 .LASF2934:
 	.string	"current_buffer"
-.LASF3108:
+.LASF3110:
 	.string	"direct_mode_data_change"
 .LASF1618:
 	.string	"kprojid_t"
@@ -56485,11 +56639,11 @@ __exitcall_ebc_exit:
 	.string	"sync_sg_for_device"
 .LASF1964:
 	.string	"statfs"
-.LASF3243:
+.LASF3245:
 	.string	"__kmalloc"
-.LASF3232:
+.LASF3234:
 	.string	"_dev_err"
-.LASF3222:
+.LASF3224:
 	.string	"__platform_driver_register"
 .LASF2961:
 	.string	"ebc_buf_real_size"
@@ -56575,7 +56729,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_PENDING_BIT"
 .LASF720:
 	.string	"rseq"
-.LASF3111:
+.LASF3113:
 	.string	"get_auto_image"
 .LASF195:
 	.string	"nfds"
@@ -56589,7 +56743,7 @@ __exitcall_ebc_exit:
 	.string	"i_acl"
 .LASF1789:
 	.string	"bmap"
-.LASF3230:
+.LASF3232:
 	.string	"ebc_buf_init"
 .LASF2048:
 	.string	"key_payload"
@@ -56629,7 +56783,7 @@ __exitcall_ebc_exit:
 	.string	"fallocate"
 .LASF1707:
 	.string	"i_spc_warnlimit"
-.LASF3205:
+.LASF3207:
 	.string	"check_object_size"
 .LASF1515:
 	.string	"node_present_pages"
@@ -56679,7 +56833,7 @@ __exitcall_ebc_exit:
 	.string	"__idmap_text_start"
 .LASF1716:
 	.string	"set_info"
-.LASF3057:
+.LASF3059:
 	.string	"ebc_mmap"
 .LASF2619:
 	.string	"sysctl_admin_reserve_kbytes"
@@ -56691,9 +56845,9 @@ __exitcall_ebc_exit:
 	.string	"lock_ops"
 .LASF1326:
 	.string	"hiwater_vm"
-.LASF3051:
+.LASF3053:
 	.string	"pmic_vcom_read"
-.LASF3224:
+.LASF3226:
 	.string	"misc_deregister"
 .LASF1248:
 	.string	"compound_head"
@@ -56713,7 +56867,7 @@ __exitcall_ebc_exit:
 	.string	"bd_write_holder"
 .LASF2194:
 	.string	"poweroff_noirq"
-.LASF3227:
+.LASF3229:
 	.string	"of_parse_phandle"
 .LASF1858:
 	.string	"rename"
@@ -56735,7 +56889,7 @@ __exitcall_ebc_exit:
 	.string	"oops_in_progress"
 .LASF3006:
 	.string	"ebc_ops"
-.LASF3032:
+.LASF3033:
 	.string	"klogo_addr"
 .LASF1651:
 	.string	"qf_next"
@@ -56743,9 +56897,9 @@ __exitcall_ebc_exit:
 	.string	"sync_single_for_cpu"
 .LASF793:
 	.string	"data"
-.LASF3173:
+.LASF3175:
 	.string	"kzalloc"
-.LASF3198:
+.LASF3200:
 	.string	"msecs_to_jiffies"
 .LASF1919:
 	.string	"lm_break"
@@ -56759,7 +56913,7 @@ __exitcall_ebc_exit:
 	.string	"personality"
 .LASF1825:
 	.string	"bd_queue"
-.LASF3020:
+.LASF3021:
 	.string	"ebc_resume"
 .LASF2829:
 	.string	"init_task"
@@ -56781,7 +56935,7 @@ __exitcall_ebc_exit:
 	.string	"signed char"
 .LASF375:
 	.string	"rcu_scheduler_active"
-.LASF3183:
+.LASF3185:
 	.string	"propname"
 .LASF2101:
 	.string	"priv"
@@ -56861,7 +57015,7 @@ __exitcall_ebc_exit:
 	.string	"sve_vl"
 .LASF2654:
 	.string	"PGSTEAL_KSWAPD"
-.LASF3034:
+.LASF3035:
 	.string	"klogo_addr_valid"
 .LASF2602:
 	.string	"MEMORY_DEVICE_PUBLIC"
@@ -56907,7 +57061,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_GCC16"
 .LASF2514:
 	.string	"i2c_lock_operations"
-.LASF3134:
+.LASF3136:
 	.string	"ebc_get_4pix_wf_part"
 .LASF1620:
 	.string	"USRQUOTA"
@@ -56953,9 +57107,9 @@ __exitcall_ebc_exit:
 	.string	"f_inode"
 .LASF2031:
 	.string	"procname"
-.LASF3115:
+.LASF3117:
 	.string	"point_data"
-.LASF3234:
+.LASF3236:
 	.string	"epd_lut_from_file_init"
 .LASF1669:
 	.string	"mark_dirty"
@@ -56979,15 +57133,15 @@ __exitcall_ebc_exit:
 	.string	"__kernel_clockid_t"
 .LASF685:
 	.string	"seccomp"
-.LASF3070:
+.LASF3072:
 	.string	"ebc_rst_panel"
 .LASF1791:
 	.string	"releasepage"
 .LASF1702:
 	.string	"qc_info"
-.LASF3071:
+.LASF3073:
 	.string	"ebc_thread"
-.LASF3085:
+.LASF3087:
 	.string	"pbuf_old"
 .LASF2888:
 	.string	"EPD_A2_ENTER"
@@ -57005,7 +57159,7 @@ __exitcall_ebc_exit:
 	.string	"win_y1"
 .LASF2871:
 	.string	"win_y2"
-.LASF3080:
+.LASF3082:
 	.string	"buf_size"
 .LASF2088:
 	.string	"bitmap"
@@ -57045,7 +57199,7 @@ __exitcall_ebc_exit:
 	.string	"MIGRATE_SYNC_LIGHT"
 .LASF1037:
 	.string	"nr_migrations_cold"
-.LASF3049:
+.LASF3051:
 	.string	"ebc_version_read"
 .LASF303:
 	.string	"__end_once"
@@ -57109,7 +57263,7 @@ __exitcall_ebc_exit:
 	.string	"percpu_size"
 .LASF1323:
 	.string	"mmap_sem"
-.LASF3261:
+.LASF3264:
 	.string	"schedule"
 .LASF2442:
 	.string	"get_reference_args"
@@ -57195,7 +57349,7 @@ __exitcall_ebc_exit:
 	.string	"lock_stat"
 .LASF2394:
 	.string	"revmap_tree_mutex"
-.LASF3053:
+.LASF3055:
 	.string	"pmic_name_read"
 .LASF1079:
 	.string	"dl_throttled"
@@ -57215,7 +57369,7 @@ __exitcall_ebc_exit:
 	.string	"restore_noirq"
 .LASF1427:
 	.string	"ki_filp"
-.LASF3110:
+.LASF3112:
 	.string	"clac_full_data_align16"
 .LASF1112:
 	.string	"cap_ambient"
@@ -57223,7 +57377,7 @@ __exitcall_ebc_exit:
 	.string	"dma_configure"
 .LASF2292:
 	.string	"runtime_error"
-.LASF3061:
+.LASF3063:
 	.string	"temp_offset"
 .LASF949:
 	.string	"__count"
@@ -57237,7 +57391,7 @@ __exitcall_ebc_exit:
 	.string	"PROBE_DEFAULT_STRATEGY"
 .LASF2746:
 	.string	"elemsize"
-.LASF3100:
+.LASF3102:
 	.string	"clac_part_data_align16"
 .LASF891:
 	.string	"nr_events"
@@ -57265,7 +57419,7 @@ __exitcall_ebc_exit:
 	.string	"uid_keyring"
 .LASF725:
 	.string	"splice_pipe"
-.LASF3089:
+.LASF3091:
 	.string	"frame_done_callback"
 .LASF1800:
 	.string	"error_remove_page"
@@ -57309,7 +57463,7 @@ __exitcall_ebc_exit:
 	.string	"compound_mapcount"
 .LASF1449:
 	.string	"zone_stat_item"
-.LASF3175:
+.LASF3177:
 	.string	"kmalloc_large"
 .LASF2626:
 	.string	"PE_SIZE_PMD"
@@ -57347,7 +57501,7 @@ __exitcall_ebc_exit:
 	.string	"gp_count"
 .LASF2051:
 	.string	"key_restriction"
-.LASF3077:
+.LASF3079:
 	.string	"check_part_mode"
 .LASF618:
 	.string	"exit_state"
@@ -57379,9 +57533,9 @@ __exitcall_ebc_exit:
 	.string	"fs_supers"
 .LASF1131:
 	.string	"last_waited"
-.LASF3056:
+.LASF3058:
 	.string	"ebc_open"
-.LASF3144:
+.LASF3146:
 	.string	"three_win_mode"
 .LASF2874:
 	.string	"EPD_OVERLAY"
@@ -57433,7 +57587,7 @@ __exitcall_ebc_exit:
 	.string	"timer_expires"
 .LASF2827:
 	.string	"mmlist_lock"
-.LASF3161:
+.LASF3163:
 	.string	"ebc_pmic_power_on"
 .LASF1765:
 	.string	"trace_evals"
@@ -57475,7 +57629,7 @@ __exitcall_ebc_exit:
 	.string	"relax_count"
 .LASF1413:
 	.string	"nr_free_files"
-.LASF3174:
+.LASF3176:
 	.string	"kmalloc"
 	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
 	.section	.note.GNU-stack,"",@progbits

commit 90ab8d66265a2a411ae49785d87ac0430254845f
Author: Hu Kejun <william.hu@rock-chips.com>
Date:   Mon Jul 12 11:49:06 2021 +0800

    media: spi: ms41908: support focus/zoom reinit run simultaneously
    
    Signed-off-by: Hu Kejun <william.hu@rock-chips.com>
    Change-Id: Ic18db2b2b5ad7f9c12ad80276c4605695711a210

diff --git a/drivers/media/spi/ms41908.c b/drivers/media/spi/ms41908.c
index 1b135b93ec70..c363ba04523f 100644
--- a/drivers/media/spi/ms41908.c
+++ b/drivers/media/spi/ms41908.c
@@ -172,6 +172,7 @@ struct motor_dev {
 	struct dciris_dev *dciris;
 	int id;
 	int wait_cnt;
+	int pi_gpio_usecnt;
 };
 
 struct motor_work_s {
@@ -1581,11 +1582,16 @@ static int motor_reinit_focus(struct motor_dev *motor)
 	int ret = 0;
 
 	if (!IS_ERR(motor->focus->pic_gpio)) {
-		if (!IS_ERR(motor->focus->pia_gpio))
-			gpiod_set_value(motor->focus->pia_gpio, 1);
-		if (!IS_ERR(motor->focus->pie_gpio))
-			gpiod_set_value(motor->focus->pie_gpio, 0);
-		msleep(250);
+		mutex_lock(&motor->mutex);
+		if (motor->pi_gpio_usecnt == 0) {
+			if (!IS_ERR(motor->focus->pia_gpio))
+				gpiod_set_value(motor->focus->pia_gpio, 1);
+			if (!IS_ERR(motor->focus->pie_gpio))
+				gpiod_set_value(motor->focus->pie_gpio, 0);
+			msleep(250);
+		}
+		motor->pi_gpio_usecnt++;
+		mutex_unlock(&motor->mutex);
 		#ifdef PI_TEST
 		motor->focus->last_pos = motor->focus->step_max;
 		ret = set_motor_running_status(motor,
@@ -1610,10 +1616,16 @@ static int motor_reinit_focus(struct motor_dev *motor)
 		motor->focus->min_pos = min;
 		motor->focus->max_pos = max;
 		#endif
-		if (!IS_ERR(motor->focus->pia_gpio))
-			gpiod_set_value(motor->focus->pia_gpio, 0);
-		if (!IS_ERR(motor->focus->pie_gpio))
-			gpiod_set_value(motor->focus->pie_gpio, 0);
+
+		mutex_lock(&motor->mutex);
+		if (motor->pi_gpio_usecnt == 1) {
+			if (!IS_ERR(motor->focus->pia_gpio))
+				gpiod_set_value(motor->focus->pia_gpio, 0);
+			if (!IS_ERR(motor->focus->pie_gpio))
+				gpiod_set_value(motor->focus->pie_gpio, 0);
+		}
+		motor->pi_gpio_usecnt--;
+		mutex_unlock(&motor->mutex);
 	} else {
 		motor->focus->last_pos = motor->focus->step_max;
 		ret = set_motor_running_status(motor,
@@ -1646,11 +1658,17 @@ static int  motor_reinit_zoom(struct motor_dev *motor)
 	int ret = 0;
 
 	if (!IS_ERR(motor->zoom->pic_gpio)) {
-		if (!IS_ERR(motor->focus->pia_gpio))
-			gpiod_set_value(motor->focus->pia_gpio, 1);
-		if (!IS_ERR(motor->focus->pie_gpio))
-			gpiod_set_value(motor->focus->pie_gpio, 0);
-		msleep(250);
+		mutex_lock(&motor->mutex);
+		if (motor->pi_gpio_usecnt == 0) {
+			if (!IS_ERR(motor->focus->pia_gpio))
+				gpiod_set_value(motor->focus->pia_gpio, 1);
+			if (!IS_ERR(motor->focus->pie_gpio))
+				gpiod_set_value(motor->focus->pie_gpio, 0);
+			msleep(250);
+		}
+		motor->pi_gpio_usecnt++;
+		mutex_unlock(&motor->mutex);
+
 		#ifdef PI_TEST
 		motor->zoom->last_pos = motor->zoom->step_max;
 		ret = set_motor_running_status(motor,
@@ -1675,10 +1693,16 @@ static int  motor_reinit_zoom(struct motor_dev *motor)
 		motor->zoom->min_pos = min;
 		motor->zoom->max_pos = max;
 		#endif
-		if (!IS_ERR(motor->focus->pia_gpio))
-			gpiod_set_value(motor->focus->pia_gpio, 0);
-		if (!IS_ERR(motor->focus->pie_gpio))
-			gpiod_set_value(motor->focus->pie_gpio, 0);
+
+		mutex_lock(&motor->mutex);
+		if (motor->pi_gpio_usecnt == 1) {
+			if (!IS_ERR(motor->focus->pia_gpio))
+				gpiod_set_value(motor->focus->pia_gpio, 0);
+			if (!IS_ERR(motor->focus->pie_gpio))
+				gpiod_set_value(motor->focus->pie_gpio, 0);
+		}
+		motor->pi_gpio_usecnt--;
+		mutex_unlock(&motor->mutex);
 	} else {
 		motor->zoom->last_pos = motor->zoom->step_max;
 		ret = set_motor_running_status(motor,
@@ -2562,6 +2586,7 @@ static void dev_param_init(struct motor_dev *motor)
 	motor->is_should_wait = false;
 	motor->is_timer_restart = false;
 	motor->wait_cnt = 0;
+	motor->pi_gpio_usecnt = 0;
 }
 
 static void dev_reg_init(struct motor_dev *motor)

commit 41dbb1d0d429d180a4259a2bcf9ed90e48354b57
Author: Hu Kejun <william.hu@rock-chips.com>
Date:   Tue Jul 6 10:02:24 2021 +0800

    media: i2c: fp5501: set phase index to 0 after reinit zoom/focus
    
    Signed-off-by: Hu Kejun <william.hu@rock-chips.com>
    Change-Id: I13af0263c587ed19f29f5f8f45e4ba9fd0f82204

diff --git a/drivers/media/i2c/fp5501.c b/drivers/media/i2c/fp5501.c
index 773b3db8e5fc..ff803638b0f2 100644
--- a/drivers/media/i2c/fp5501.c
+++ b/drivers/media/i2c/fp5501.c
@@ -386,6 +386,7 @@ static void motor_reinit_focus_pos(struct motor_dev *motor)
 {
 	motor_reinit_focus(motor);
 	motor->focus.last_pos = 0;
+	motor->focus.phase_index = 0;
 	__v4l2_ctrl_modify_range(motor->focus_ctrl, 0,
 				 motor->focus.step_max - motor->focus.reback,
 				 1, 0);
@@ -408,6 +409,7 @@ static void motor_reinit_zoom_pos(struct motor_dev *motor)
 {
 	motor_reinit_zoom(motor);
 	motor->zoom.last_pos = 0;
+	motor->zoom.phase_index = 0;
 	__v4l2_ctrl_modify_range(motor->zoom_ctrl, 0,
 				 motor->zoom.step_max - motor->zoom.reback,
 				 1, 0);

commit 39e7cf8ad3d4ac5f42423fa480c4747d37e77b42
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Thu Jul 8 19:58:22 2021 +0800

    media: i2c: imx335: fixed short exposure calc err in DOL2 mode
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I43ace096af7571b2bc4ef5f2bc2f47d5d0d89163

diff --git a/drivers/media/i2c/imx335.c b/drivers/media/i2c/imx335.c
index 6d5596e43ee9..772a817b9dd4 100644
--- a/drivers/media/i2c/imx335.c
+++ b/drivers/media/i2c/imx335.c
@@ -927,7 +927,7 @@ static int imx335_set_hdrae(struct imx335 *imx335,
 	rhs1_min = (SHR1_MIN + 4u + 7u) / 8 * 8 + 2;
 
 	rhs1 = SHR1_MIN + s_exp_time;
-	rhs1 = (rhs1 & ~0x7) + 2; /* shall be 8n + 2 */
+	rhs1 = (rhs1 + 7u) / 8 * 8 + 2; /* shall be 8n + 2 */
 	if (rhs1 > rhs1_max)
 		rhs1 = rhs1_max;
 	if (rhs1 < rhs1_min)

commit 0328e70fce1ad3acf7163a8e3249b7608e8e3759
Author: Elaine Zhang <zhangqing@rock-chips.com>
Date:   Tue Sep 22 17:30:13 2020 +0800

    clk: rockchip: rk3288: use COMPOSITE_DCLK for dclk_vop1
    
    The CLK_SET_RATE_PARENT flag make the parent clock and the child clk is 1:1.
    If the DCLK frequency is too low, the PLL frequency will be very
    low, which will affect the output waveform quality of PLL, and PLL
    locking may be abnormal, so add a new COMPOSITE_DCLK clock-type to
    handle that.
    
    Change-Id: Id95a14c0fbd0ad2799a77190a5d21dd490c6ede8
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>

diff --git a/drivers/clk/rockchip/clk-rk3288.c b/drivers/clk/rockchip/clk-rk3288.c
index 238b80be230c..541e1ff6238a 100644
--- a/drivers/clk/rockchip/clk-rk3288.c
+++ b/drivers/clk/rockchip/clk-rk3288.c
@@ -26,6 +26,7 @@
 #define RK3288_UART_FRAC_MAX_PRATE	600000000
 #define RK3288_I2S_FRAC_MAX_PRATE	600000000
 #define RK3288_SPDIF_FRAC_MAX_PRATE	600000000
+#define RK3288_DCLK_PARENT_MAX_PRATE	600000000
 
 enum rk3288_plls {
 	apll, dpll, cpll, gpll, npll,
@@ -442,9 +443,9 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = {
 	COMPOSITE(DCLK_VOP0, "dclk_vop0", mux_pll_src_cpll_gpll_npll_p, 0,
 			RK3288_CLKSEL_CON(27), 0, 2, MFLAGS, 8, 8, DFLAGS,
 			RK3288_CLKGATE_CON(3), 1, GFLAGS),
-	COMPOSITE(DCLK_VOP1, "dclk_vop1", mux_pll_src_cpll_gpll_npll_p, 0,
+	COMPOSITE_DCLK(DCLK_VOP1, "dclk_vop1", mux_pll_src_cpll_gpll_npll_p, CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
 			RK3288_CLKSEL_CON(29), 6, 2, MFLAGS, 8, 8, DFLAGS,
-			RK3288_CLKGATE_CON(3), 3, GFLAGS),
+			RK3288_CLKGATE_CON(3), 3, GFLAGS, RK3288_DCLK_PARENT_MAX_PRATE),
 
 	COMPOSITE_NODIV(SCLK_EDP_24M, "sclk_edp_24m", mux_edp_24m_p, 0,
 			RK3288_CLKSEL_CON(28), 15, 1, MFLAGS,

commit 1ceb8de4b1550e09c2b82e2bd17337b7ce53f28f
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Wed Sep 30 10:00:54 2020 +0800

    ARM: dts: rockchip: Add rk3288-evb-rk628-rgb2gvi-avb.dts
    
    Change-Id: I367dbee5502424566d85fd14717e3c4fbf9cf07f
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Signed-off-by: Guochun Huang <hero.huang@rock-chips.com>

diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
index e390a02ae5f4..6727aab58f67 100644
--- a/arch/arm/boot/dts/Makefile
+++ b/arch/arm/boot/dts/Makefile
@@ -900,6 +900,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += \
 	rk3288-evb-rk628-hdmi2csi-avb.dtb \
 	rk3288-evb-rk628-hdmi2gvi-avb.dtb \
 	rk3288-evb-rk628-rgb2dsi-avb.dtb \
+	rk3288-evb-rk628-rgb2gvi-avb.dtb \
 	rk3288-evb-rk628-rgb2hdmi-avb.dtb \
 	rk3288-evb-rk628-rgb2lvds-avb.dtb \
 	rk3288-evb-rk628-rgb2lvds-dual-avb.dtb \
diff --git a/arch/arm/boot/dts/rk3288-evb-rk628-rgb2gvi-avb.dts b/arch/arm/boot/dts/rk3288-evb-rk628-rgb2gvi-avb.dts
new file mode 100644
index 000000000000..0482495ddf4f
--- /dev/null
+++ b/arch/arm/boot/dts/rk3288-evb-rk628-rgb2gvi-avb.dts
@@ -0,0 +1,238 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+// Copyright (c) 2020 Fuzhou Rockchip Electronics Co., Ltd
+
+/dts-v1/;
+#include "rk3288-evb-rk628.dtsi"
+
+/ {
+	model = "Rockchip RK3288 EVB EXT RK628 Board";
+	compatible = "rockchip,rk3288-evb-ext-rk628", "rockchip,rk3288";
+
+	chosen {
+		bootargs = "clk_ignore_unused rootdelay=1 earlycon=uart8250,mmio32,0xff690000 vmalloc=496M swiotlb=1 console=ttyFIQ0 androidboot.baseband=N/A androidboot.veritymode=enforcing androidboot.hardware=rk30board androidboot.console=ttyFIQ0 init=/init kpti=0";
+	};
+
+	vcc_lcd1: vcc-lcd1 {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc_lcd1";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		regulator-boot-on;
+		gpio = <&gpio7 RK_PB0 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+		vin-supply = <&vcc_io>;
+	};
+
+	panel {
+		compatible = "simple-panel";
+		backlight = <&backlight>;
+		power-supply = <&vcc_lcd1>;
+		prepare-delay-ms = <20>;
+		enable-gpios = <&gpio7 21 GPIO_ACTIVE_HIGH>;
+		enable-delay-ms = <200>;
+		disable-delay-ms = <20>;
+		unprepare-delay-ms = <20>;
+		bus-format = <MEDIA_BUS_FMT_RGB888_1X24>;
+		width-mm = <136>;
+		height-mm = <217>;
+		status = "okay";
+
+		display-timings {
+			native-mode = <&timing>;
+
+			timing: timing {
+				clock-frequency = <594000000>;
+				hactive = <3840>;
+				vactive = <2160>;
+				hback-porch = <296>;
+				hfront-porch = <176>;
+				vback-porch = <72>;
+				vfront-porch = <8>;
+				hsync-len = <88>;
+				vsync-len = <12>;
+				hsync-active = <0>;
+				vsync-active = <0>;
+				de-active = <0>;
+				pixelclk-active = <0>;
+			};
+		};
+
+		port {
+			panel_in_gvi: endpoint {
+				remote-endpoint = <&gvi_out_panel>;
+			};
+		};
+	};
+};
+
+&backlight {
+	enable-gpios = <&gpio7 2 GPIO_ACTIVE_HIGH>;
+};
+
+&rk628 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&test_clkout>;
+	assigned-clocks = <&cru SCLK_TESTOUT_SRC>;
+	assigned-clock-parents = <&xin24m>;
+};
+
+&rk628_combtxphy {
+	status = "okay";
+};
+
+&rk628_gvi {
+	status = "okay";
+	rockchip,lane-num = <8>;
+	/* rockchip,division-mode; */
+
+	ports {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		port@0 {
+			reg = <0>;
+
+			gvi_in_process: endpoint {
+				remote-endpoint = <&process_out_gvi>;
+			};
+		};
+
+		port@1 {
+			reg = <1>;
+
+			gvi_out_panel: endpoint {
+				remote-endpoint = <&panel_in_gvi>;
+			};
+		};
+	};
+};
+
+&rk628_combtxphy {
+	status = "okay";
+};
+
+&rk628_post_process {
+	pinctrl-names = "default";
+	pinctrl-0 = <&rk628_vop_pins>, <&rk628_gvi_hpd_pins>, <&rk628_gvi_lock_pins>;
+	status = "okay";
+
+	ports {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		port@0 {
+			reg = <0>;
+
+			post_process_in_rgb: endpoint {
+				remote-endpoint = <&rgb_out_post_process>;
+			};
+		};
+
+		port@1 {
+			reg = <1>;
+
+			process_out_gvi: endpoint {
+				remote-endpoint = <&gvi_in_process>;
+			};
+		};
+	};
+
+	display-timings {
+		native-mode = <&timing0>;
+
+		timing0: timing0 {
+			clock-frequency = <148500000>;
+			hactive = <1920>;
+			vactive = <1080>;
+			hback-porch = <148>;
+			hfront-porch = <88>;
+			vback-porch = <36>;
+			vfront-porch = <4>;
+			hsync-len = <44>;
+			vsync-len = <5>;
+			hsync-active = <0>;
+			vsync-active = <0>;
+			de-active = <0>;
+			pixelclk-active = <0>;
+		};
+#if 0
+		timing1: timing-3840-1080 {
+			clock-frequency = <297000000>;
+			hactive = <3840>;
+			vactive = <1080>;
+			hback-porch = <296>;
+			hfront-porch = <176>;
+			vback-porch = <36>;
+			vfront-porch = <4>;
+			hsync-len = <88>;
+			vsync-len = <4>;
+			hsync-active = <0>;
+			vsync-active = <0>;
+			de-active = <0>;
+			pixelclk-active = <0>;
+		};
+
+		timing2: timing-3840-2160 {
+			clock-frequency = <594000000>;
+			hactive = <3840>;
+			vactive = <2160>;
+			hback-porch = <296>;
+			hfront-porch = <176>;
+			vback-porch = <72>;
+			vfront-porch = <8>;
+			hsync-len = <88>;
+			vsync-len = <10>;
+			hsync-active = <1>;
+			vsync-active = <1>;
+			de-active = <0>;
+			pixelclk-active = <0>;
+		};
+#endif
+	};
+};
+
+&rk628_xin_osc0_func {
+	compatible = "fixed-factor-clock";
+	clocks = <&cru SCLK_TESTOUT>;
+	clock-mult = <1>;
+	clock-div = <1>;
+};
+
+&rgb {
+	status = "okay";
+
+	ports {
+		port@1 {
+			reg = <1>;
+
+			rgb_out_post_process: endpoint {
+				remote-endpoint = <&post_process_in_rgb>;
+			};
+		};
+	};
+};
+
+&video_phy {
+	status = "okay";
+};
+
+&rgb_in_vopl {
+	status = "disabled";
+};
+
+&rgb_in_vopb {
+	status = "okay";
+};
+
+&route_rgb {
+	connect = <&vopl_out_rgb>;
+	status = "disabled";
+};
+
+&pinctrl {
+	test {
+		test_clkout: test-clkout {
+			rockchip,pins = <0 17 RK_FUNC_1 &pcfg_pull_none>;
+		};
+	};
+};

commit 79488760814d37f9a3d7295cb9d70d8154179d58
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Wed Nov 4 15:34:24 2020 +0800

    ARM: dts: rockchip: Add rk3288-evb-rk628-hdmi2gvi-avb.dts
    
    Change-Id: I65b0812ddbc1f19f8f22735b17b8f3f6c6e253ac
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Signed-off-by: Guochun Huang <hero.huang@rock-chips.com>

diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
index 06008b35c35e..e390a02ae5f4 100644
--- a/arch/arm/boot/dts/Makefile
+++ b/arch/arm/boot/dts/Makefile
@@ -898,6 +898,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += \
 	rk3288-evb-rk808.dtb \
 	rk3288-evb-android-rk808-edp-avb.dtb \
 	rk3288-evb-rk628-hdmi2csi-avb.dtb \
+	rk3288-evb-rk628-hdmi2gvi-avb.dtb \
 	rk3288-evb-rk628-rgb2dsi-avb.dtb \
 	rk3288-evb-rk628-rgb2hdmi-avb.dtb \
 	rk3288-evb-rk628-rgb2lvds-avb.dtb \
diff --git a/arch/arm/boot/dts/rk3288-evb-rk628-hdmi2gvi-avb.dts b/arch/arm/boot/dts/rk3288-evb-rk628-hdmi2gvi-avb.dts
new file mode 100644
index 000000000000..fe6513d1a9ac
--- /dev/null
+++ b/arch/arm/boot/dts/rk3288-evb-rk628-hdmi2gvi-avb.dts
@@ -0,0 +1,212 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+// Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
+
+/dts-v1/;
+#include "rk3288-evb-rk628.dtsi"
+
+/ {
+	model = "Rockchip RK3288 EVB RK628 Board";
+	compatible = "rockchip,rk3288-evb-rk628", "rockchip,rk3288";
+
+	chosen {
+		bootargs = "rootwait earlycon=uart8250,mmio32,0xff690000 vmalloc=496M swiotlb=1 console=ttyFIQ0 androidboot.baseband=N/A androidboot.veritymode=enforcing androidboot.hardware=rk30board androidboot.console=ttyFIQ0 init=/init kpti=0";
+	};
+
+	vcc_lcd1: vcc-lcd1 {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc_lcd1";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		regulator-boot-on;
+		gpio = <&gpio7 RK_PB0 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+		vin-supply = <&vcc_io>;
+	};
+
+	panel {
+		compatible = "simple-panel";
+		backlight = <&backlight>;
+		power-supply = <&vcc_lcd1>;
+		prepare-delay-ms = <20>;
+		enable-gpios = <&gpio7 21 GPIO_ACTIVE_HIGH>;
+		enable-delay-ms = <200>;
+		disable-delay-ms = <20>;
+		unprepare-delay-ms = <20>;
+		bus-format = <MEDIA_BUS_FMT_RGB888_1X24>;
+		width-mm = <136>;
+		height-mm = <217>;
+		status = "okay";
+
+		display-timings {
+			native-mode = <&timing>;
+
+			timing: timing {
+				clock-frequency = <594000000>;
+				hactive = <3840>;
+				vactive = <2160>;
+				hback-porch = <296>;
+				hfront-porch = <176>;
+				vback-porch = <72>;
+				vfront-porch = <8>;
+				hsync-len = <88>;
+				vsync-len = <10>;
+				hsync-active = <1>;
+				vsync-active = <1>;
+				de-active = <0>;
+				pixelclk-active = <0>;
+			};
+		};
+
+		port {
+			panel_in_gvi: endpoint {
+				remote-endpoint = <&gvi_out_panel>;
+			};
+		};
+	};
+};
+
+&backlight {
+	enable-gpios = <&gpio7 2 GPIO_ACTIVE_HIGH>;
+};
+
+&rk628 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&test_clkout>;
+	assigned-clocks = <&cru SCLK_TESTOUT_SRC>;
+	assigned-clock-parents = <&xin24m>;
+};
+
+&rk628_combtxphy {
+	status = "okay";
+};
+
+&hdmi {
+	status = "okay";
+
+	ports {
+		#address-cells = <1>;
+		#size-cells = <0>;
+		port@1 {
+			reg = <1>;
+
+			hdmi_out_hdmirx: endpoint {
+				remote-endpoint = <&hdmirx_in_hdmi>;
+			};
+		};
+	};
+};
+
+&rk628_gvi {
+	pinctrl-names = "default";
+	pinctrl-0 = <&rk628_gvi_hpd_pins>, <&rk628_gvi_lock_pins>;
+	status = "okay";
+	rockchip,lane-num = <8>;
+	/* rockchip,division-mode; */
+
+	ports {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		port@0 {
+			reg = <0>;
+
+			gvi_in_post_process: endpoint {
+				remote-endpoint = <&post_process_out_gvi>;
+			};
+		};
+
+		port@1 {
+			reg = <1>;
+
+			gvi_out_panel: endpoint {
+				remote-endpoint = <&panel_in_gvi>;
+			};
+		};
+	};
+};
+
+&rk628_combtxphy {
+	status = "okay";
+};
+
+&rk628_post_process {
+	status = "okay";
+
+	ports {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		port@0 {
+			reg = <0>;
+
+			post_process_in_hdmirx: endpoint {
+				remote-endpoint = <&hdmirx_out_post_process>;
+			};
+		};
+
+
+		port@1 {
+			reg = <1>;
+
+			post_process_out_gvi: endpoint {
+				remote-endpoint = <&gvi_in_post_process>;
+			};
+		};
+	};
+};
+
+&rk628_combrxphy {
+	status = "okay";
+};
+
+&rk628_hdmirx {
+	status = "okay";
+
+	ports {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		port@0 {
+			reg = <0>;
+
+			hdmirx_in_hdmi: endpoint {
+				remote-endpoint = <&hdmi_out_hdmirx>;
+			};
+		};
+		port@1 {
+			reg = <1>;
+
+			hdmirx_out_post_process: endpoint {
+				remote-endpoint = <&post_process_in_hdmirx>;
+			};
+		};
+	};
+};
+
+&rk628_xin_osc0_func {
+	compatible = "fixed-factor-clock";
+	clocks = <&cru SCLK_TESTOUT>;
+	clock-mult = <1>;
+	clock-div = <1>;
+};
+
+&hdmi_in_vopl {
+	status = "disabled";
+};
+
+&hdmi_in_vopb {
+	status = "okay";
+};
+
+&route_hdmi {
+	connect = <&vopb_out_rgb>;
+	status = "disabled";
+};
+
+&pinctrl {
+	test {
+		test_clkout: test-clkout {
+			rockchip,pins = <0 17 RK_FUNC_1 &pcfg_pull_none>;
+		};
+	};
+};

commit 22306fbd2006a2f23a4cc6ebab4538447e8e7694
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Wed Nov 4 15:17:13 2020 +0800

    drm/rockchip/rk628: max input resolution is 4k yuv420
    
    Change-Id: I154b72b9ce3e975e62e9f107346eb57451dbb76d
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rk628/rk628_gvi.c b/drivers/gpu/drm/rockchip/rk628/rk628_gvi.c
index a5fc042dcaee..bad19b781f82 100644
--- a/drivers/gpu/drm/rockchip/rk628/rk628_gvi.c
+++ b/drivers/gpu/drm/rockchip/rk628/rk628_gvi.c
@@ -312,7 +312,8 @@ static int rk628_gvi_connector_get_modes(struct drm_connector *connector)
 	info->edid_hdmi_dc_modes = 0;
 	info->hdmi.y420_dc_modes = 0;
 	info->color_formats = 0;
-	info->max_tmds_clock = 600000;
+	info->max_tmds_clock = 300000;
+	connector->ycbcr_420_allowed = true;
 
 	num_modes += rk628_scaler_add_src_mode(gvi->parent, connector);
 

commit 34f2cb9eaca3dcd5f6074e97eae9e7d78b8223f9
Author: Wyon Bi <bivvy.bi@rock-chips.com>
Date:   Thu Nov 5 16:53:48 2020 +0800

    clk/rockchip: rk3288: Add support for sclk_testout
    
    Change-Id: Ibd521712a6517300984db4199ac0164a499dc0f7
    Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>
    Signed-off-by: Guochun Huang <hero.huang@rock-chips.com>

diff --git a/drivers/clk/rockchip/clk-rk3288.c b/drivers/clk/rockchip/clk-rk3288.c
index e71d71039d65..238b80be230c 100644
--- a/drivers/clk/rockchip/clk-rk3288.c
+++ b/drivers/clk/rockchip/clk-rk3288.c
@@ -205,6 +205,12 @@ PNAME(mux_edp_24m_p)	= { "ext_edp_24m", "xin24m" };
 PNAME(mux_tspout_p)	= { "cpll", "gpll", "npll", "xin27m" };
 
 PNAME(mux_aclk_vcodec_pre_p)	= { "aclk_vdpu", "aclk_vepu" };
+PNAME(mux_testout_src_p) = { "aclk_peri", "armclk", "aclk_vio0", "ddrphy",
+			     "aclk_vcodec", "aclk_gpu", "sclk_rga", "aclk_cpu",
+			     "xin24m", "xin27m", "xin32k", "clk_wifi",
+			     "dclk_vop0", "dclk_vop1", "sclk_isp_jpe",
+			     "sclk_isp" };
+
 PNAME(mux_usbphy480m_p)		= { "sclk_otgphy1_480m", "sclk_otgphy2_480m",
 				    "sclk_otgphy0_480m" };
 PNAME(mux_hsicphy480m_p)	= { "cpll", "gpll", "usbphy480m_src" };
@@ -559,6 +565,12 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = {
 			RK3288_CLKSEL_CON(2), 0, 6, DFLAGS,
 			RK3288_CLKGATE_CON(2), 7, GFLAGS),
 
+	MUX(SCLK_TESTOUT_SRC, "sclk_testout_src", mux_testout_src_p, 0,
+	    RK3288_MISC_CON, 8, 4, MFLAGS),
+	COMPOSITE_NOMUX(SCLK_TESTOUT, "sclk_testout", "sclk_testout_src", 0,
+			RK3288_CLKSEL_CON(2), 8, 5, DFLAGS,
+			RK3288_CLKGATE_CON(4), 15, GFLAGS),
+
 	COMPOSITE_NOMUX(SCLK_SARADC, "sclk_saradc", "xin24m", 0,
 			RK3288_CLKSEL_CON(24), 8, 8, DFLAGS,
 			RK3288_CLKGATE_CON(2), 8, GFLAGS),
diff --git a/include/dt-bindings/clock/rk3288-cru.h b/include/dt-bindings/clock/rk3288-cru.h
index 5d7c3522ee6e..d4988da4b2a0 100644
--- a/include/dt-bindings/clock/rk3288-cru.h
+++ b/include/dt-bindings/clock/rk3288-cru.h
@@ -100,6 +100,8 @@
 #define SCLK_MAC_PLL		150
 #define SCLK_MAC		151
 #define SCLK_MACREF_OUT		152
+#define SCLK_TESTOUT_SRC	153
+#define SCLK_TESTOUT		154
 
 #define DCLK_VOP0		190
 #define DCLK_VOP1		191

commit 49954632049063763130a1cf031075a255270f32
Author: Liang Chen <cl@rock-chips.com>
Date:   Mon Jul 12 09:16:41 2021 +0800

    arm64: dts: rockchip: rk3568: adjust opp-table
    
    Change-Id: Icbae16ac2c077555326c1d44b0df87161e929ea6
    Signed-off-by: Liang Chen <cl@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index 71e531f3f8e9..57035f10a0a9 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -179,12 +179,12 @@
 		};
 		opp-1416000000 {
 			opp-hz = /bits/ 64 <1416000000>;
-			opp-microvolt = <900000 900000 1150000>;
+			opp-microvolt = <925000 925000 1150000>;
 			clock-latency-ns = <40000>;
 		};
 		opp-1608000000 {
 			opp-hz = /bits/ 64 <1608000000>;
-			opp-microvolt = <975000 975000 1150000>;
+			opp-microvolt = <1000000 1000000 1150000>;
 			clock-latency-ns = <40000>;
 		};
 		opp-1800000000 {
@@ -1107,12 +1107,12 @@
 			opp-microvolt = <825000 825000 1000000>;
 		};
 		opp-600000000 {
-			opp-hz = /bits/ 64 <594000000>;
+			opp-hz = /bits/ 64 <600000000>;
 			opp-microvolt = <825000 825000 1000000>;
 		};
 		opp-700000000 {
 			opp-hz = /bits/ 64 <700000000>;
-			opp-microvolt = <825000 825000 1000000>;
+			opp-microvolt = <850000 850000 1000000>;
 		};
 		opp-800000000 {
 			opp-hz = /bits/ 64 <800000000>;
@@ -1235,7 +1235,7 @@
 		};
 		opp-800000000 {
 			opp-hz = /bits/ 64 <800000000>;
-			opp-microvolt = <1000000>;
+			opp-microvolt = <950000>;
 		};
 	};
 
@@ -1457,17 +1457,14 @@
 
 		opp-297000000 {
 			opp-hz = /bits/ 64 <297000000>;
-			opp-microvolt = <900000>;
-			opp-microvolt-L0 = <900000>;
-			opp-microvolt-L1 = <900000>;
-			opp-microvolt-L2 = <850000>;
+			opp-microvolt = <0>;
 		};
 		opp-400000000 {
 			opp-hz = /bits/ 64 <400000000>;
 			opp-microvolt = <950000>;
 			opp-microvolt-L0 = <950000>;
-			opp-microvolt-L1 = <900000>;
-			opp-microvolt-L2 = <850000>;
+			opp-microvolt-L1 = <925000>;
+			opp-microvolt-L2 = <0>;
 		};
 	};
 

commit 95492b1e348de7be19d7cebe76ffe2e1c9eac52e
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Tue Jul 13 14:27:03 2021 +0200

    Revert "clocksource/drivers/timer-ti-dm: Handle dra7 timer wrap errata i940"
    
    This reverts commit 330584716d4b5b9653608edc0adf7251bcd7e506 which is
    commit 25de4ce5ed02994aea8bc111d133308f6fd62566 upstream.
    
    It breaks the build and is not needed in this android branch.
    
    Bug: 161946584
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I409b1d804cc06c189827a82b48e8a95afd9ced01

diff --git a/arch/arm/boot/dts/dra7.dtsi b/arch/arm/boot/dts/dra7.dtsi
index 7f1fe4a72447..0c0781a37c5a 100644
--- a/arch/arm/boot/dts/dra7.dtsi
+++ b/arch/arm/boot/dts/dra7.dtsi
@@ -48,7 +48,6 @@
 
 	timer {
 		compatible = "arm,armv7-timer";
-		status = "disabled";	/* See ARM architected timer wrap erratum i940 */
 		interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
 			     <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
 			     <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
@@ -911,8 +910,6 @@
 			reg = <0x48032000 0x80>;
 			interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "timer2";
-			clock-names = "fck";
-			clocks = <&l4per_clkctrl DRA7_TIMER2_CLKCTRL 24>;
 		};
 
 		timer3: timer@48034000 {
@@ -920,10 +917,6 @@
 			reg = <0x48034000 0x80>;
 			interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "timer3";
-			clock-names = "fck";
-			clocks = <&l4per_clkctrl DRA7_TIMER3_CLKCTRL 24>;
-			assigned-clocks = <&l4per_clkctrl DRA7_TIMER3_CLKCTRL 24>;
-			assigned-clock-parents = <&timer_sys_clk_div>;
 		};
 
 		timer4: timer@48036000 {
@@ -931,10 +924,6 @@
 			reg = <0x48036000 0x80>;
 			interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "timer4";
-			clock-names = "fck";
-			clocks = <&l4per_clkctrl DRA7_TIMER4_CLKCTRL 24>;
-			assigned-clocks = <&l4per_clkctrl DRA7_TIMER4_CLKCTRL 24>;
-			assigned-clock-parents = <&timer_sys_clk_div>;
 		};
 
 		timer5: timer@48820000 {
diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c
index 6e59c11131c4..6b4f4975cf7a 100644
--- a/arch/arm/mach-omap2/board-generic.c
+++ b/arch/arm/mach-omap2/board-generic.c
@@ -330,7 +330,7 @@ DT_MACHINE_START(DRA74X_DT, "Generic DRA74X (Flattened Device Tree)")
 	.init_late	= dra7xx_init_late,
 	.init_irq	= omap_gic_of_init,
 	.init_machine	= omap_generic_init,
-	.init_time	= omap3_gptimer_timer_init,
+	.init_time	= omap5_realtime_timer_init,
 	.dt_compat	= dra74x_boards_compat,
 	.restart	= omap44xx_restart,
 MACHINE_END
@@ -353,7 +353,7 @@ DT_MACHINE_START(DRA72X_DT, "Generic DRA72X (Flattened Device Tree)")
 	.init_late	= dra7xx_init_late,
 	.init_irq	= omap_gic_of_init,
 	.init_machine	= omap_generic_init,
-	.init_time	= omap3_gptimer_timer_init,
+	.init_time	= omap5_realtime_timer_init,
 	.dt_compat	= dra72x_boards_compat,
 	.restart	= omap44xx_restart,
 MACHINE_END
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c
index c4ba848e8af6..f24858d5ac69 100644
--- a/arch/arm/mach-omap2/timer.c
+++ b/arch/arm/mach-omap2/timer.c
@@ -42,7 +42,6 @@
 #include <linux/platform_device.h>
 #include <linux/platform_data/dmtimer-omap.h>
 #include <linux/sched_clock.h>
-#include <linux/cpu.h>
 
 #include <asm/mach/time.h>
 #include <asm/smp_twd.h>
@@ -422,53 +421,6 @@ static void __init dmtimer_clkevt_init_common(struct dmtimer_clockevent *clkevt,
 		timer->rate);
 }
 
-static DEFINE_PER_CPU(struct dmtimer_clockevent, dmtimer_percpu_timer);
-
-static int omap_gptimer_starting_cpu(unsigned int cpu)
-{
-	struct dmtimer_clockevent *clkevt = per_cpu_ptr(&dmtimer_percpu_timer, cpu);
-	struct clock_event_device *dev = &clkevt->dev;
-	struct omap_dm_timer *timer = &clkevt->timer;
-
-	clockevents_config_and_register(dev, timer->rate, 3, ULONG_MAX);
-	irq_force_affinity(dev->irq, cpumask_of(cpu));
-
-	return 0;
-}
-
-static int __init dmtimer_percpu_quirk_init(void)
-{
-	struct dmtimer_clockevent *clkevt;
-	struct clock_event_device *dev;
-	struct device_node *arm_timer;
-	struct omap_dm_timer *timer;
-	int cpu = 0;
-
-	arm_timer = of_find_compatible_node(NULL, NULL, "arm,armv7-timer");
-	if (of_device_is_available(arm_timer)) {
-		pr_warn_once("ARM architected timer wrap issue i940 detected\n");
-		return 0;
-	}
-
-	for_each_possible_cpu(cpu) {
-		clkevt = per_cpu_ptr(&dmtimer_percpu_timer, cpu);
-		dev = &clkevt->dev;
-		timer = &clkevt->timer;
-
-		dmtimer_clkevt_init_common(clkevt, 0, "timer_sys_ck",
-					   CLOCK_EVT_FEAT_ONESHOT,
-					   cpumask_of(cpu),
-					   "assigned-clock-parents",
-					   500, "percpu timer");
-	}
-
-	cpuhp_setup_state(CPUHP_AP_OMAP_DM_TIMER_STARTING,
-			  "clockevents/omap/gptimer:starting",
-			  omap_gptimer_starting_cpu, NULL);
-
-	return 0;
-}
-
 /* Clocksource code */
 static struct omap_dm_timer clksrc;
 static bool use_gptimer_clksrc __initdata;
@@ -613,9 +565,6 @@ static void __init __omap_sync32k_timer_init(int clkev_nr, const char *clkev_src
 					3, /* Timer internal resynch latency */
 					0xffffffff);
 
-	if (soc_is_dra7xx())
-		dmtimer_percpu_quirk_init();
-
 	/* Enable the use of clocksource="gp_timer" kernel parameter */
 	if (use_gptimer_clksrc || gptimer)
 		omap2_gptimer_clocksource_init(clksrc_nr, clksrc_src,
@@ -643,7 +592,7 @@ void __init omap3_secure_sync32k_timer_init(void)
 #endif /* CONFIG_ARCH_OMAP3 */
 
 #if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_SOC_AM33XX) || \
-	defined(CONFIG_SOC_AM43XX) || defined(CONFIG_SOC_DRA7XX)
+	defined(CONFIG_SOC_AM43XX)
 void __init omap3_gptimer_timer_init(void)
 {
 	__omap_sync32k_timer_init(2, "timer_sys_ck", NULL,
diff --git a/drivers/clk/ti/clk-7xx.c b/drivers/clk/ti/clk-7xx.c
index b6d1ec49fa01..71a122b2dc67 100644
--- a/drivers/clk/ti/clk-7xx.c
+++ b/drivers/clk/ti/clk-7xx.c
@@ -733,7 +733,6 @@ const struct omap_clkctrl_data dra7_clkctrl_data[] __initconst = {
 static struct ti_dt_clk dra7xx_clks[] = {
 	DT_CLK(NULL, "timer_32k_ck", "sys_32k_ck"),
 	DT_CLK(NULL, "sys_clkin_ck", "timer_sys_clk_div"),
-	DT_CLK(NULL, "timer_sys_ck", "timer_sys_clk_div"),
 	DT_CLK(NULL, "sys_clkin", "sys_clkin1"),
 	DT_CLK(NULL, "atl_dpll_clk_mux", "atl_cm:0000:24"),
 	DT_CLK(NULL, "atl_gfclk_mux", "atl_cm:0000:26"),
diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h
index 6c5364c1a622..2a7359382954 100644
--- a/include/linux/cpuhotplug.h
+++ b/include/linux/cpuhotplug.h
@@ -122,7 +122,6 @@ enum cpuhp_state {
 	CPUHP_AP_ARM_L2X0_STARTING,
 	CPUHP_AP_EXYNOS4_MCT_TIMER_STARTING,
 	CPUHP_AP_ARM_ARCH_TIMER_STARTING,
-	CPUHP_AP_OMAP_DM_TIMER_STARTING,
 	CPUHP_AP_ARM_GLOBAL_TIMER_STARTING,
 	CPUHP_AP_JCORE_TIMER_STARTING,
 	CPUHP_AP_ARM_TWD_STARTING,

commit ec10e3585812332b83a1a2ec11ec256cf64cdfb8
Merge: 2215bae0d4a2 fcfbdfe9626e
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Sun Jul 11 21:33:34 2021 +0200

    Merge 4.19.197 into android-4.19-stable
    
    Changes in 4.19.197
            mm: add VM_WARN_ON_ONCE_PAGE() macro
            mm/rmap: remove unneeded semicolon in page_not_mapped()
            mm/rmap: use page_not_mapped in try_to_unmap()
            mm/thp: fix __split_huge_pmd_locked() on shmem migration entry
            mm/thp: make is_huge_zero_pmd() safe and quicker
            mm/thp: try_to_unmap() use TTU_SYNC for safe splitting
            mm/thp: fix vma_address() if virtual address below file offset
            mm/thp: fix page_address_in_vma() on file THP tails
            mm/thp: unmap_mapping_page() to fix THP truncate_cleanup_page()
            mm: thp: replace DEBUG_VM BUG with VM_WARN when unmap fails for split
            mm: page_vma_mapped_walk(): use page for pvmw->page
            mm: page_vma_mapped_walk(): settle PageHuge on entry
            mm: page_vma_mapped_walk(): use pmde for *pvmw->pmd
            mm: page_vma_mapped_walk(): prettify PVMW_MIGRATION block
            mm: page_vma_mapped_walk(): crossing page table boundary
            mm: page_vma_mapped_walk(): add a level of indentation
            mm: page_vma_mapped_walk(): use goto instead of while (1)
            mm: page_vma_mapped_walk(): get vma_address_end() earlier
            mm/thp: fix page_vma_mapped_walk() if THP mapped by ptes
            mm/thp: another PVMW_SYNC fix in page_vma_mapped_walk()
            mm, futex: fix shared futex pgoff on shmem huge page
            scsi: sr: Return appropriate error code when disk is ejected
            drm/nouveau: fix dma_address check for CPU/GPU sync
            ext4: eliminate bogus error in ext4_data_block_valid_rcu()
            KVM: SVM: Periodically schedule when unregistering regions on destroy
            ARM: dts: imx6qdl-sabresd: Remove incorrect power supply assignment
            kthread_worker: split code for canceling the delayed work timer
            kthread: prevent deadlock when kthread_mod_delayed_work() races with kthread_cancel_delayed_work_sync()
            xen/events: reset active flag for lateeoi events later
            KVM: SVM: Call SEV Guest Decommission if ASID binding fails
            ARM: OMAP: replace setup_irq() by request_irq()
            clocksource/drivers/timer-ti-dm: Add clockevent and clocksource support
            clocksource/drivers/timer-ti-dm: Prepare to handle dra7 timer wrap issue
            clocksource/drivers/timer-ti-dm: Handle dra7 timer wrap errata i940
            Linux 4.19.197
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I733cdb08e37808851f4ff54a2e333f3c7d4e9257

commit fcfbdfe9626edd5bf00c732e093eed249ecdbfa1
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Sun Jul 11 12:49:32 2021 +0200

    Linux 4.19.197
    
    Link: https://lore.kernel.org/r/20210709131644.969303901@linuxfoundation.org
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index 63b0bc92a0fa..42073a4c6e2e 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 196
+SUBLEVEL = 197
 EXTRAVERSION =
 NAME = "People's Front"
 

commit 330584716d4b5b9653608edc0adf7251bcd7e506
Author: Tony Lindgren <tony@atomide.com>
Date:   Fri Jul 9 10:37:45 2021 +0300

    clocksource/drivers/timer-ti-dm: Handle dra7 timer wrap errata i940
    
    commit 25de4ce5ed02994aea8bc111d133308f6fd62566 upstream.
    
    There is a timer wrap issue on dra7 for the ARM architected timer.
    In a typical clock configuration the timer fails to wrap after 388 days.
    
    To work around the issue, we need to use timer-ti-dm percpu timers instead.
    
    Let's configure dmtimer3 and 4 as percpu timers by default, and warn about
    the issue if the dtb is not configured properly.
    
    For more information, please see the errata for "AM572x Sitara Processors
    Silicon Revisions 1.1, 2.0":
    
    https://www.ti.com/lit/er/sprz429m/sprz429m.pdf
    
    The concept is based on earlier reference patches done by Tero Kristo and
    Keerthy.
    
    Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
    Cc: Keerthy <j-keerthy@ti.com>
    Cc: Tero Kristo <kristo@kernel.org>
    [tony@atomide.com: backported to 4.19.y]
    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/boot/dts/dra7.dtsi b/arch/arm/boot/dts/dra7.dtsi
index 0c0781a37c5a..7f1fe4a72447 100644
--- a/arch/arm/boot/dts/dra7.dtsi
+++ b/arch/arm/boot/dts/dra7.dtsi
@@ -48,6 +48,7 @@
 
 	timer {
 		compatible = "arm,armv7-timer";
+		status = "disabled";	/* See ARM architected timer wrap erratum i940 */
 		interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
 			     <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
 			     <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
@@ -910,6 +911,8 @@
 			reg = <0x48032000 0x80>;
 			interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "timer2";
+			clock-names = "fck";
+			clocks = <&l4per_clkctrl DRA7_TIMER2_CLKCTRL 24>;
 		};
 
 		timer3: timer@48034000 {
@@ -917,6 +920,10 @@
 			reg = <0x48034000 0x80>;
 			interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "timer3";
+			clock-names = "fck";
+			clocks = <&l4per_clkctrl DRA7_TIMER3_CLKCTRL 24>;
+			assigned-clocks = <&l4per_clkctrl DRA7_TIMER3_CLKCTRL 24>;
+			assigned-clock-parents = <&timer_sys_clk_div>;
 		};
 
 		timer4: timer@48036000 {
@@ -924,6 +931,10 @@
 			reg = <0x48036000 0x80>;
 			interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "timer4";
+			clock-names = "fck";
+			clocks = <&l4per_clkctrl DRA7_TIMER4_CLKCTRL 24>;
+			assigned-clocks = <&l4per_clkctrl DRA7_TIMER4_CLKCTRL 24>;
+			assigned-clock-parents = <&timer_sys_clk_div>;
 		};
 
 		timer5: timer@48820000 {
diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c
index 6b4f4975cf7a..6e59c11131c4 100644
--- a/arch/arm/mach-omap2/board-generic.c
+++ b/arch/arm/mach-omap2/board-generic.c
@@ -330,7 +330,7 @@ DT_MACHINE_START(DRA74X_DT, "Generic DRA74X (Flattened Device Tree)")
 	.init_late	= dra7xx_init_late,
 	.init_irq	= omap_gic_of_init,
 	.init_machine	= omap_generic_init,
-	.init_time	= omap5_realtime_timer_init,
+	.init_time	= omap3_gptimer_timer_init,
 	.dt_compat	= dra74x_boards_compat,
 	.restart	= omap44xx_restart,
 MACHINE_END
@@ -353,7 +353,7 @@ DT_MACHINE_START(DRA72X_DT, "Generic DRA72X (Flattened Device Tree)")
 	.init_late	= dra7xx_init_late,
 	.init_irq	= omap_gic_of_init,
 	.init_machine	= omap_generic_init,
-	.init_time	= omap5_realtime_timer_init,
+	.init_time	= omap3_gptimer_timer_init,
 	.dt_compat	= dra72x_boards_compat,
 	.restart	= omap44xx_restart,
 MACHINE_END
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c
index f24858d5ac69..c4ba848e8af6 100644
--- a/arch/arm/mach-omap2/timer.c
+++ b/arch/arm/mach-omap2/timer.c
@@ -42,6 +42,7 @@
 #include <linux/platform_device.h>
 #include <linux/platform_data/dmtimer-omap.h>
 #include <linux/sched_clock.h>
+#include <linux/cpu.h>
 
 #include <asm/mach/time.h>
 #include <asm/smp_twd.h>
@@ -421,6 +422,53 @@ static void __init dmtimer_clkevt_init_common(struct dmtimer_clockevent *clkevt,
 		timer->rate);
 }
 
+static DEFINE_PER_CPU(struct dmtimer_clockevent, dmtimer_percpu_timer);
+
+static int omap_gptimer_starting_cpu(unsigned int cpu)
+{
+	struct dmtimer_clockevent *clkevt = per_cpu_ptr(&dmtimer_percpu_timer, cpu);
+	struct clock_event_device *dev = &clkevt->dev;
+	struct omap_dm_timer *timer = &clkevt->timer;
+
+	clockevents_config_and_register(dev, timer->rate, 3, ULONG_MAX);
+	irq_force_affinity(dev->irq, cpumask_of(cpu));
+
+	return 0;
+}
+
+static int __init dmtimer_percpu_quirk_init(void)
+{
+	struct dmtimer_clockevent *clkevt;
+	struct clock_event_device *dev;
+	struct device_node *arm_timer;
+	struct omap_dm_timer *timer;
+	int cpu = 0;
+
+	arm_timer = of_find_compatible_node(NULL, NULL, "arm,armv7-timer");
+	if (of_device_is_available(arm_timer)) {
+		pr_warn_once("ARM architected timer wrap issue i940 detected\n");
+		return 0;
+	}
+
+	for_each_possible_cpu(cpu) {
+		clkevt = per_cpu_ptr(&dmtimer_percpu_timer, cpu);
+		dev = &clkevt->dev;
+		timer = &clkevt->timer;
+
+		dmtimer_clkevt_init_common(clkevt, 0, "timer_sys_ck",
+					   CLOCK_EVT_FEAT_ONESHOT,
+					   cpumask_of(cpu),
+					   "assigned-clock-parents",
+					   500, "percpu timer");
+	}
+
+	cpuhp_setup_state(CPUHP_AP_OMAP_DM_TIMER_STARTING,
+			  "clockevents/omap/gptimer:starting",
+			  omap_gptimer_starting_cpu, NULL);
+
+	return 0;
+}
+
 /* Clocksource code */
 static struct omap_dm_timer clksrc;
 static bool use_gptimer_clksrc __initdata;
@@ -565,6 +613,9 @@ static void __init __omap_sync32k_timer_init(int clkev_nr, const char *clkev_src
 					3, /* Timer internal resynch latency */
 					0xffffffff);
 
+	if (soc_is_dra7xx())
+		dmtimer_percpu_quirk_init();
+
 	/* Enable the use of clocksource="gp_timer" kernel parameter */
 	if (use_gptimer_clksrc || gptimer)
 		omap2_gptimer_clocksource_init(clksrc_nr, clksrc_src,
@@ -592,7 +643,7 @@ void __init omap3_secure_sync32k_timer_init(void)
 #endif /* CONFIG_ARCH_OMAP3 */
 
 #if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_SOC_AM33XX) || \
-	defined(CONFIG_SOC_AM43XX)
+	defined(CONFIG_SOC_AM43XX) || defined(CONFIG_SOC_DRA7XX)
 void __init omap3_gptimer_timer_init(void)
 {
 	__omap_sync32k_timer_init(2, "timer_sys_ck", NULL,
diff --git a/drivers/clk/ti/clk-7xx.c b/drivers/clk/ti/clk-7xx.c
index 71a122b2dc67..b6d1ec49fa01 100644
--- a/drivers/clk/ti/clk-7xx.c
+++ b/drivers/clk/ti/clk-7xx.c
@@ -733,6 +733,7 @@ const struct omap_clkctrl_data dra7_clkctrl_data[] __initconst = {
 static struct ti_dt_clk dra7xx_clks[] = {
 	DT_CLK(NULL, "timer_32k_ck", "sys_32k_ck"),
 	DT_CLK(NULL, "sys_clkin_ck", "timer_sys_clk_div"),
+	DT_CLK(NULL, "timer_sys_ck", "timer_sys_clk_div"),
 	DT_CLK(NULL, "sys_clkin", "sys_clkin1"),
 	DT_CLK(NULL, "atl_dpll_clk_mux", "atl_cm:0000:24"),
 	DT_CLK(NULL, "atl_gfclk_mux", "atl_cm:0000:26"),
diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h
index d67c0035165c..3d323c6c8526 100644
--- a/include/linux/cpuhotplug.h
+++ b/include/linux/cpuhotplug.h
@@ -118,6 +118,7 @@ enum cpuhp_state {
 	CPUHP_AP_ARM_L2X0_STARTING,
 	CPUHP_AP_EXYNOS4_MCT_TIMER_STARTING,
 	CPUHP_AP_ARM_ARCH_TIMER_STARTING,
+	CPUHP_AP_OMAP_DM_TIMER_STARTING,
 	CPUHP_AP_ARM_GLOBAL_TIMER_STARTING,
 	CPUHP_AP_JCORE_TIMER_STARTING,
 	CPUHP_AP_ARM_TWD_STARTING,

commit 123235223169d1a73e55fcd5d857be676207021f
Author: Tony Lindgren <tony@atomide.com>
Date:   Fri Jul 9 10:37:44 2021 +0300

    clocksource/drivers/timer-ti-dm: Prepare to handle dra7 timer wrap issue
    
    commit 3efe7a878a11c13b5297057bfc1e5639ce1241ce upstream.
    
    There is a timer wrap issue on dra7 for the ARM architected timer.
    In a typical clock configuration the timer fails to wrap after 388 days.
    
    To work around the issue, we need to use timer-ti-dm timers instead.
    
    Let's prepare for adding support for percpu timers by adding a common
    dmtimer_clkevt_init_common() and call it from __omap_sync32k_timer_init().
    This patch makes no intentional functional changes.
    
    Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
    Cc: Keerthy <j-keerthy@ti.com>
    Cc: Tero Kristo <kristo@kernel.org>
    [tony@atomide.com: backported to 4.19.y]
    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c
index 0c0ee29751a8..f24858d5ac69 100644
--- a/arch/arm/mach-omap2/timer.c
+++ b/arch/arm/mach-omap2/timer.c
@@ -368,18 +368,21 @@ void tick_broadcast(const struct cpumask *mask)
 }
 #endif
 
-static void __init omap2_gp_clockevent_init(int gptimer_id,
-						const char *fck_source,
-						const char *property)
+static void __init dmtimer_clkevt_init_common(struct dmtimer_clockevent *clkevt,
+					      int gptimer_id,
+					      const char *fck_source,
+					      unsigned int features,
+					      const struct cpumask *cpumask,
+					      const char *property,
+					      int rating, const char *name)
 {
-	struct dmtimer_clockevent *clkevt = &clockevent;
 	struct omap_dm_timer *timer = &clkevt->timer;
 	int res;
 
 	timer->id = gptimer_id;
 	timer->errata = omap_dm_timer_get_errata();
-	clkevt->dev.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
-	clkevt->dev.rating = 300;
+	clkevt->dev.features = features;
+	clkevt->dev.rating = rating;
 	clkevt->dev.set_next_event = omap2_gp_timer_set_next_event;
 	clkevt->dev.set_state_shutdown = omap2_gp_timer_shutdown;
 	clkevt->dev.set_state_periodic = omap2_gp_timer_set_periodic;
@@ -397,19 +400,15 @@ static void __init omap2_gp_clockevent_init(int gptimer_id,
 				     &clkevt->dev.name, OMAP_TIMER_POSTED);
 	BUG_ON(res);
 
-	clkevt->dev.cpumask = cpu_possible_mask;
+	clkevt->dev.cpumask = cpumask;
 	clkevt->dev.irq = omap_dm_timer_get_irq(timer);
 
-	if (request_irq(timer->irq, omap2_gp_timer_interrupt,
-			IRQF_TIMER | IRQF_IRQPOLL, "gp_timer", clkevt))
-		pr_err("Failed to request irq %d (gp_timer)\n", timer->irq);
+	if (request_irq(clkevt->dev.irq, omap2_gp_timer_interrupt,
+			IRQF_TIMER | IRQF_IRQPOLL, name, clkevt))
+		pr_err("Failed to request irq %d (gp_timer)\n", clkevt->dev.irq);
 
 	__omap_dm_timer_int_enable(timer, OMAP_TIMER_INT_OVERFLOW);
 
-	clockevents_config_and_register(&clkevt->dev, timer->rate,
-					3, /* Timer internal resynch latency */
-					0xffffffff);
-
 	if (soc_is_am33xx() || soc_is_am43xx()) {
 		clkevt->dev.suspend = omap_clkevt_idle;
 		clkevt->dev.resume = omap_clkevt_unidle;
@@ -559,7 +558,12 @@ static void __init __omap_sync32k_timer_init(int clkev_nr, const char *clkev_src
 {
 	omap_clk_init();
 	omap_dmtimer_init();
-	omap2_gp_clockevent_init(clkev_nr, clkev_src, clkev_prop);
+	dmtimer_clkevt_init_common(&clockevent, clkev_nr, clkev_src,
+				   CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
+				   cpu_possible_mask, clkev_prop, 300, "clockevent");
+	clockevents_config_and_register(&clockevent.dev, clockevent.timer.rate,
+					3, /* Timer internal resynch latency */
+					0xffffffff);
 
 	/* Enable the use of clocksource="gp_timer" kernel parameter */
 	if (use_gptimer_clksrc || gptimer)

commit 78130e2e4e405d51f74cfebec47dd43ec6164277
Author: Tony Lindgren <tony@atomide.com>
Date:   Fri Jul 9 10:37:43 2021 +0300

    clocksource/drivers/timer-ti-dm: Add clockevent and clocksource support
    
    commit 52762fbd1c4778ac9b173624ca0faacd22ef4724 upstream.
    
    We can move the TI dmtimer clockevent and clocksource to live under
    drivers/clocksource if we rely only on the clock framework, and handle
    the module configuration directly in the clocksource driver based on the
    device tree data.
    
    This removes the early dependency with system timers to the interconnect
    related code, and we can probe pretty much everything else later on at
    the module_init level.
    
    Let's first add a new driver for timer-ti-dm-systimer based on existing
    arch/arm/mach-omap2/timer.c. Then let's start moving SoCs to probe with
    device tree data while still keeping the old timer.c. And eventually we
    can just drop the old timer.c.
    
    Let's take the opportunity to switch to use readl/writel as pointed out
    by Daniel Lezcano <daniel.lezcano@linaro.org>. This allows further
    clean-up of the timer-ti-dm code the a lot of the shared helpers can
    just become static to the non-syster related code.
    
    Note the boards can optionally configure different timer source clocks
    if needed with assigned-clocks and assigned-clock-parents.
    
    Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
    Cc: Keerthy <j-keerthy@ti.com>
    Cc: Tero Kristo <kristo@kernel.org>
    [tony@atomide.com: backported to 4.19.y]
    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c
index 4fff1079f7c2..0c0ee29751a8 100644
--- a/arch/arm/mach-omap2/timer.c
+++ b/arch/arm/mach-omap2/timer.c
@@ -64,15 +64,28 @@
 
 /* Clockevent code */
 
-static struct omap_dm_timer clkev;
-static struct clock_event_device clockevent_gpt;
-
 /* Clockevent hwmod for am335x and am437x suspend */
 static struct omap_hwmod *clockevent_gpt_hwmod;
 
 /* Clockesource hwmod for am437x suspend */
 static struct omap_hwmod *clocksource_gpt_hwmod;
 
+struct dmtimer_clockevent {
+	struct clock_event_device dev;
+	struct omap_dm_timer timer;
+};
+
+static struct dmtimer_clockevent clockevent;
+
+static struct omap_dm_timer *to_dmtimer(struct clock_event_device *clockevent)
+{
+	struct dmtimer_clockevent *clkevt =
+		container_of(clockevent, struct dmtimer_clockevent, dev);
+	struct omap_dm_timer *timer = &clkevt->timer;
+
+	return timer;
+}
+
 #ifdef CONFIG_SOC_HAS_REALTIME_COUNTER
 static unsigned long arch_timer_freq;
 
@@ -84,10 +97,11 @@ void set_cntfreq(void)
 
 static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id)
 {
-	struct clock_event_device *evt = &clockevent_gpt;
-
-	__omap_dm_timer_write_status(&clkev, OMAP_TIMER_INT_OVERFLOW);
+	struct dmtimer_clockevent *clkevt = dev_id;
+	struct clock_event_device *evt = &clkevt->dev;
+	struct omap_dm_timer *timer = &clkevt->timer;
 
+	__omap_dm_timer_write_status(timer, OMAP_TIMER_INT_OVERFLOW);
 	evt->event_handler(evt);
 	return IRQ_HANDLED;
 }
@@ -95,7 +109,9 @@ static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id)
 static int omap2_gp_timer_set_next_event(unsigned long cycles,
 					 struct clock_event_device *evt)
 {
-	__omap_dm_timer_load_start(&clkev, OMAP_TIMER_CTRL_ST,
+	struct omap_dm_timer *timer = to_dmtimer(evt);
+
+	__omap_dm_timer_load_start(timer, OMAP_TIMER_CTRL_ST,
 				   0xffffffff - cycles, OMAP_TIMER_POSTED);
 
 	return 0;
@@ -103,22 +119,26 @@ static int omap2_gp_timer_set_next_event(unsigned long cycles,
 
 static int omap2_gp_timer_shutdown(struct clock_event_device *evt)
 {
-	__omap_dm_timer_stop(&clkev, OMAP_TIMER_POSTED, clkev.rate);
+	struct omap_dm_timer *timer = to_dmtimer(evt);
+
+	__omap_dm_timer_stop(timer, OMAP_TIMER_POSTED, timer->rate);
+
 	return 0;
 }
 
 static int omap2_gp_timer_set_periodic(struct clock_event_device *evt)
 {
+	struct omap_dm_timer *timer = to_dmtimer(evt);
 	u32 period;
 
-	__omap_dm_timer_stop(&clkev, OMAP_TIMER_POSTED, clkev.rate);
+	__omap_dm_timer_stop(timer, OMAP_TIMER_POSTED, timer->rate);
 
-	period = clkev.rate / HZ;
+	period = timer->rate / HZ;
 	period -= 1;
 	/* Looks like we need to first set the load value separately */
-	__omap_dm_timer_write(&clkev, OMAP_TIMER_LOAD_REG, 0xffffffff - period,
+	__omap_dm_timer_write(timer, OMAP_TIMER_LOAD_REG, 0xffffffff - period,
 			      OMAP_TIMER_POSTED);
-	__omap_dm_timer_load_start(&clkev,
+	__omap_dm_timer_load_start(timer,
 				   OMAP_TIMER_CTRL_AR | OMAP_TIMER_CTRL_ST,
 				   0xffffffff - period, OMAP_TIMER_POSTED);
 	return 0;
@@ -132,26 +152,17 @@ static void omap_clkevt_idle(struct clock_event_device *unused)
 	omap_hwmod_idle(clockevent_gpt_hwmod);
 }
 
-static void omap_clkevt_unidle(struct clock_event_device *unused)
+static void omap_clkevt_unidle(struct clock_event_device *evt)
 {
+	struct omap_dm_timer *timer = to_dmtimer(evt);
+
 	if (!clockevent_gpt_hwmod)
 		return;
 
 	omap_hwmod_enable(clockevent_gpt_hwmod);
-	__omap_dm_timer_int_enable(&clkev, OMAP_TIMER_INT_OVERFLOW);
+	__omap_dm_timer_int_enable(timer, OMAP_TIMER_INT_OVERFLOW);
 }
 
-static struct clock_event_device clockevent_gpt = {
-	.features		= CLOCK_EVT_FEAT_PERIODIC |
-				  CLOCK_EVT_FEAT_ONESHOT,
-	.rating			= 300,
-	.set_next_event		= omap2_gp_timer_set_next_event,
-	.set_state_shutdown	= omap2_gp_timer_shutdown,
-	.set_state_periodic	= omap2_gp_timer_set_periodic,
-	.set_state_oneshot	= omap2_gp_timer_shutdown,
-	.tick_resume		= omap2_gp_timer_shutdown,
-};
-
 static const struct of_device_id omap_timer_match[] __initconst = {
 	{ .compatible = "ti,omap2420-timer", },
 	{ .compatible = "ti,omap3430-timer", },
@@ -361,44 +372,54 @@ static void __init omap2_gp_clockevent_init(int gptimer_id,
 						const char *fck_source,
 						const char *property)
 {
+	struct dmtimer_clockevent *clkevt = &clockevent;
+	struct omap_dm_timer *timer = &clkevt->timer;
 	int res;
 
-	clkev.id = gptimer_id;
-	clkev.errata = omap_dm_timer_get_errata();
+	timer->id = gptimer_id;
+	timer->errata = omap_dm_timer_get_errata();
+	clkevt->dev.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
+	clkevt->dev.rating = 300;
+	clkevt->dev.set_next_event = omap2_gp_timer_set_next_event;
+	clkevt->dev.set_state_shutdown = omap2_gp_timer_shutdown;
+	clkevt->dev.set_state_periodic = omap2_gp_timer_set_periodic;
+	clkevt->dev.set_state_oneshot = omap2_gp_timer_shutdown;
+	clkevt->dev.tick_resume = omap2_gp_timer_shutdown;
 
 	/*
 	 * For clock-event timers we never read the timer counter and
 	 * so we are not impacted by errata i103 and i767. Therefore,
 	 * we can safely ignore this errata for clock-event timers.
 	 */
-	__omap_dm_timer_override_errata(&clkev, OMAP_TIMER_ERRATA_I103_I767);
+	__omap_dm_timer_override_errata(timer, OMAP_TIMER_ERRATA_I103_I767);
 
-	res = omap_dm_timer_init_one(&clkev, fck_source, property,
-				     &clockevent_gpt.name, OMAP_TIMER_POSTED);
+	res = omap_dm_timer_init_one(timer, fck_source, property,
+				     &clkevt->dev.name, OMAP_TIMER_POSTED);
 	BUG_ON(res);
 
-	if (request_irq(clkev.irq, omap2_gp_timer_interrupt,
-			IRQF_TIMER | IRQF_IRQPOLL, "gp_timer", &clkev))
-		pr_err("Failed to request irq %d (gp_timer)\n", clkev.irq);
+	clkevt->dev.cpumask = cpu_possible_mask;
+	clkevt->dev.irq = omap_dm_timer_get_irq(timer);
+
+	if (request_irq(timer->irq, omap2_gp_timer_interrupt,
+			IRQF_TIMER | IRQF_IRQPOLL, "gp_timer", clkevt))
+		pr_err("Failed to request irq %d (gp_timer)\n", timer->irq);
 
-	__omap_dm_timer_int_enable(&clkev, OMAP_TIMER_INT_OVERFLOW);
+	__omap_dm_timer_int_enable(timer, OMAP_TIMER_INT_OVERFLOW);
 
-	clockevent_gpt.cpumask = cpu_possible_mask;
-	clockevent_gpt.irq = omap_dm_timer_get_irq(&clkev);
-	clockevents_config_and_register(&clockevent_gpt, clkev.rate,
+	clockevents_config_and_register(&clkevt->dev, timer->rate,
 					3, /* Timer internal resynch latency */
 					0xffffffff);
 
 	if (soc_is_am33xx() || soc_is_am43xx()) {
-		clockevent_gpt.suspend = omap_clkevt_idle;
-		clockevent_gpt.resume = omap_clkevt_unidle;
+		clkevt->dev.suspend = omap_clkevt_idle;
+		clkevt->dev.resume = omap_clkevt_unidle;
 
 		clockevent_gpt_hwmod =
-			omap_hwmod_lookup(clockevent_gpt.name);
+			omap_hwmod_lookup(clkevt->dev.name);
 	}
 
-	pr_info("OMAP clockevent source: %s at %lu Hz\n", clockevent_gpt.name,
-		clkev.rate);
+	pr_info("OMAP clockevent source: %s at %lu Hz\n", clkevt->dev.name,
+		timer->rate);
 }
 
 /* Clocksource code */

commit c74081df081c306d9d256d9026181b67f595fdf6
Author: afzal mohammed <afzal.mohd.ma@gmail.com>
Date:   Fri Jul 9 10:37:42 2021 +0300

    ARM: OMAP: replace setup_irq() by request_irq()
    
    commit b75ca5217743e4d7076cf65e044e88389e44318d upstream.
    
    request_irq() is preferred over setup_irq(). Invocations of setup_irq()
    occur after memory allocators are ready.
    
    Per tglx[1], setup_irq() existed in olden days when allocators were not
    ready by the time early interrupts were initialized.
    
    Hence replace setup_irq() by request_irq().
    
    [1] https://lkml.kernel.org/r/alpine.DEB.2.20.1710191609480.1971@nanos
    
    Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
    Cc: Keerthy <j-keerthy@ti.com>
    Cc: Tero Kristo <kristo@kernel.org>
    Signed-off-by: afzal mohammed <afzal.mohd.ma@gmail.com>
    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/mach-omap1/pm.c b/arch/arm/mach-omap1/pm.c
index 3e1de14805e4..65b91a8379c9 100644
--- a/arch/arm/mach-omap1/pm.c
+++ b/arch/arm/mach-omap1/pm.c
@@ -610,11 +610,6 @@ static irqreturn_t omap_wakeup_interrupt(int irq, void *dev)
 	return IRQ_HANDLED;
 }
 
-static struct irqaction omap_wakeup_irq = {
-	.name		= "peripheral wakeup",
-	.handler	= omap_wakeup_interrupt
-};
-
 
 
 static const struct platform_suspend_ops omap_pm_ops = {
@@ -627,6 +622,7 @@ static const struct platform_suspend_ops omap_pm_ops = {
 static int __init omap_pm_init(void)
 {
 	int error = 0;
+	int irq;
 
 	if (!cpu_class_is_omap1())
 		return -ENODEV;
@@ -670,9 +666,12 @@ static int __init omap_pm_init(void)
 	arm_pm_idle = omap1_pm_idle;
 
 	if (cpu_is_omap7xx())
-		setup_irq(INT_7XX_WAKE_UP_REQ, &omap_wakeup_irq);
+		irq = INT_7XX_WAKE_UP_REQ;
 	else if (cpu_is_omap16xx())
-		setup_irq(INT_1610_WAKE_UP_REQ, &omap_wakeup_irq);
+		irq = INT_1610_WAKE_UP_REQ;
+	if (request_irq(irq, omap_wakeup_interrupt, 0, "peripheral wakeup",
+			NULL))
+		pr_err("Failed to request irq %d (peripheral wakeup)\n", irq);
 
 	/* Program new power ramp-up time
 	 * (0 for most boards since we don't lower voltage when in deep sleep)
diff --git a/arch/arm/mach-omap1/time.c b/arch/arm/mach-omap1/time.c
index 524977a31a49..de590a85a42b 100644
--- a/arch/arm/mach-omap1/time.c
+++ b/arch/arm/mach-omap1/time.c
@@ -155,15 +155,11 @@ static irqreturn_t omap_mpu_timer1_interrupt(int irq, void *dev_id)
 	return IRQ_HANDLED;
 }
 
-static struct irqaction omap_mpu_timer1_irq = {
-	.name		= "mpu_timer1",
-	.flags		= IRQF_TIMER | IRQF_IRQPOLL,
-	.handler	= omap_mpu_timer1_interrupt,
-};
-
 static __init void omap_init_mpu_timer(unsigned long rate)
 {
-	setup_irq(INT_TIMER1, &omap_mpu_timer1_irq);
+	if (request_irq(INT_TIMER1, omap_mpu_timer1_interrupt,
+			IRQF_TIMER | IRQF_IRQPOLL, "mpu_timer1", NULL))
+		pr_err("Failed to request irq %d (mpu_timer1)\n", INT_TIMER1);
 	omap_mpu_timer_start(0, (rate / HZ) - 1, 1);
 
 	clockevent_mpu_timer1.cpumask = cpumask_of(0);
diff --git a/arch/arm/mach-omap1/timer32k.c b/arch/arm/mach-omap1/timer32k.c
index 0ae6c52a7d70..780fdf03c3ce 100644
--- a/arch/arm/mach-omap1/timer32k.c
+++ b/arch/arm/mach-omap1/timer32k.c
@@ -148,15 +148,11 @@ static irqreturn_t omap_32k_timer_interrupt(int irq, void *dev_id)
 	return IRQ_HANDLED;
 }
 
-static struct irqaction omap_32k_timer_irq = {
-	.name		= "32KHz timer",
-	.flags		= IRQF_TIMER | IRQF_IRQPOLL,
-	.handler	= omap_32k_timer_interrupt,
-};
-
 static __init void omap_init_32k_timer(void)
 {
-	setup_irq(INT_OS_TIMER, &omap_32k_timer_irq);
+	if (request_irq(INT_OS_TIMER, omap_32k_timer_interrupt,
+			IRQF_TIMER | IRQF_IRQPOLL, "32KHz timer", NULL))
+		pr_err("Failed to request irq %d(32KHz timer)\n", INT_OS_TIMER);
 
 	clockevent_32k_timer.cpumask = cpumask_of(0);
 	clockevents_config_and_register(&clockevent_32k_timer,
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c
index 98ed5ac073bc..4fff1079f7c2 100644
--- a/arch/arm/mach-omap2/timer.c
+++ b/arch/arm/mach-omap2/timer.c
@@ -92,12 +92,6 @@ static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id)
 	return IRQ_HANDLED;
 }
 
-static struct irqaction omap2_gp_timer_irq = {
-	.name		= "gp_timer",
-	.flags		= IRQF_TIMER | IRQF_IRQPOLL,
-	.handler	= omap2_gp_timer_interrupt,
-};
-
 static int omap2_gp_timer_set_next_event(unsigned long cycles,
 					 struct clock_event_device *evt)
 {
@@ -383,8 +377,9 @@ static void __init omap2_gp_clockevent_init(int gptimer_id,
 				     &clockevent_gpt.name, OMAP_TIMER_POSTED);
 	BUG_ON(res);
 
-	omap2_gp_timer_irq.dev_id = &clkev;
-	setup_irq(clkev.irq, &omap2_gp_timer_irq);
+	if (request_irq(clkev.irq, omap2_gp_timer_interrupt,
+			IRQF_TIMER | IRQF_IRQPOLL, "gp_timer", &clkev))
+		pr_err("Failed to request irq %d (gp_timer)\n", clkev.irq);
 
 	__omap_dm_timer_int_enable(&clkev, OMAP_TIMER_INT_OVERFLOW);
 

commit 4686e3e4aa78e39721f49d6a2719c61b444c7525
Author: Alper Gun <alpergun@google.com>
Date:   Thu Jun 10 17:46:04 2021 +0000

    KVM: SVM: Call SEV Guest Decommission if ASID binding fails
    
    commit 934002cd660b035b926438244b4294e647507e13 upstream.
    
    Send SEV_CMD_DECOMMISSION command to PSP firmware if ASID binding
    fails. If a failure happens after  a successful LAUNCH_START command,
    a decommission command should be executed. Otherwise, guest context
    will be unfreed inside the AMD SP. After the firmware will not have
    memory to allocate more SEV guest context, LAUNCH_START command will
    begin to fail with SEV_RET_RESOURCE_LIMIT error.
    
    The existing code calls decommission inside sev_unbind_asid, but it is
    not called if a failure happens before guest activation succeeds. If
    sev_bind_asid fails, decommission is never called. PSP firmware has a
    limit for the number of guests. If sev_asid_binding fails many times,
    PSP firmware will not have resources to create another guest context.
    
    Cc: stable@vger.kernel.org
    Fixes: 59414c989220 ("KVM: SVM: Add support for KVM_SEV_LAUNCH_START command")
    Reported-by: Peter Gonda <pgonda@google.com>
    Signed-off-by: Alper Gun <alpergun@google.com>
    Reviewed-by: Marc Orr <marcorr@google.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Message-Id: <20210610174604.2554090-1-alpergun@google.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 78f4ffbfb43a..bd463d684237 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -1791,9 +1791,25 @@ static void sev_asid_free(struct kvm *kvm)
 	__sev_asid_free(sev->asid);
 }
 
-static void sev_unbind_asid(struct kvm *kvm, unsigned int handle)
+static void sev_decommission(unsigned int handle)
 {
 	struct sev_data_decommission *decommission;
+
+	if (!handle)
+		return;
+
+	decommission = kzalloc(sizeof(*decommission), GFP_KERNEL);
+	if (!decommission)
+		return;
+
+	decommission->handle = handle;
+	sev_guest_decommission(decommission, NULL);
+
+	kfree(decommission);
+}
+
+static void sev_unbind_asid(struct kvm *kvm, unsigned int handle)
+{
 	struct sev_data_deactivate *data;
 
 	if (!handle)
@@ -1811,15 +1827,7 @@ static void sev_unbind_asid(struct kvm *kvm, unsigned int handle)
 	sev_guest_df_flush(NULL);
 	kfree(data);
 
-	decommission = kzalloc(sizeof(*decommission), GFP_KERNEL);
-	if (!decommission)
-		return;
-
-	/* decommission handle */
-	decommission->handle = handle;
-	sev_guest_decommission(decommission, NULL);
-
-	kfree(decommission);
+	sev_decommission(handle);
 }
 
 static struct page **sev_pin_memory(struct kvm *kvm, unsigned long uaddr,
@@ -6469,8 +6477,10 @@ static int sev_launch_start(struct kvm *kvm, struct kvm_sev_cmd *argp)
 
 	/* Bind ASID to this guest */
 	ret = sev_bind_asid(kvm, start->handle, error);
-	if (ret)
+	if (ret) {
+		sev_decommission(start->handle);
 		goto e_free_session;
+	}
 
 	/* return handle to userspace */
 	params.handle = start->handle;

commit cda326e5033fc1e7912ca31887b05fa7cd8060f3
Author: Juergen Gross <jgross@suse.com>
Date:   Wed Jun 23 15:09:13 2021 +0200

    xen/events: reset active flag for lateeoi events later
    
    commit 3de218ff39b9e3f0d453fe3154f12a174de44b25 upstream.
    
    In order to avoid a race condition for user events when changing
    cpu affinity reset the active flag only when EOI-ing the event.
    
    This is working fine as all user events are lateeoi events. Note that
    lateeoi_ack_mask_dynirq() is not modified as there is no explicit call
    to xen_irq_lateeoi() expected later.
    
    Cc: stable@vger.kernel.org
    Reported-by: Julien Grall <julien@xen.org>
    Fixes: b6622798bc50b62 ("xen/events: avoid handling the same event on two cpus at the same time")
    Tested-by: Julien Grall <julien@xen.org>
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Reviewed-by: Boris Ostrovsky <boris.ostrvsky@oracle.com>
    Link: https://lore.kernel.org/r/20210623130913.9405-1-jgross@suse.com
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c
index b370144682ed..a2f8130e18fe 100644
--- a/drivers/xen/events/events_base.c
+++ b/drivers/xen/events/events_base.c
@@ -524,6 +524,9 @@ static void xen_irq_lateeoi_locked(struct irq_info *info, bool spurious)
 	}
 
 	info->eoi_time = 0;
+
+	/* is_active hasn't been reset yet, do it now. */
+	smp_store_release(&info->is_active, 0);
 	do_unmask(info, EVT_MASK_REASON_EOI_PENDING);
 }
 
@@ -1780,10 +1783,22 @@ static void lateeoi_ack_dynirq(struct irq_data *data)
 	struct irq_info *info = info_for_irq(data->irq);
 	evtchn_port_t evtchn = info ? info->evtchn : 0;
 
-	if (VALID_EVTCHN(evtchn)) {
-		do_mask(info, EVT_MASK_REASON_EOI_PENDING);
-		ack_dynirq(data);
-	}
+	if (!VALID_EVTCHN(evtchn))
+		return;
+
+	do_mask(info, EVT_MASK_REASON_EOI_PENDING);
+
+	if (unlikely(irqd_is_setaffinity_pending(data)) &&
+	    likely(!irqd_irq_disabled(data))) {
+		do_mask(info, EVT_MASK_REASON_TEMPORARY);
+
+		clear_evtchn(evtchn);
+
+		irq_move_masked_irq(data);
+
+		do_unmask(info, EVT_MASK_REASON_TEMPORARY);
+	} else
+		clear_evtchn(evtchn);
 }
 
 static void lateeoi_mask_ack_dynirq(struct irq_data *data)

commit 6e2a98bc902ce347747fabb133485d7ce2bdd7e4
Author: Petr Mladek <pmladek@suse.com>
Date:   Thu Jun 24 18:39:48 2021 -0700

    kthread: prevent deadlock when kthread_mod_delayed_work() races with kthread_cancel_delayed_work_sync()
    
    commit 5fa54346caf67b4b1b10b1f390316ae466da4d53 upstream.
    
    The system might hang with the following backtrace:
    
            schedule+0x80/0x100
            schedule_timeout+0x48/0x138
            wait_for_common+0xa4/0x134
            wait_for_completion+0x1c/0x2c
            kthread_flush_work+0x114/0x1cc
            kthread_cancel_work_sync.llvm.16514401384283632983+0xe8/0x144
            kthread_cancel_delayed_work_sync+0x18/0x2c
            xxxx_pm_notify+0xb0/0xd8
            blocking_notifier_call_chain_robust+0x80/0x194
            pm_notifier_call_chain_robust+0x28/0x4c
            suspend_prepare+0x40/0x260
            enter_state+0x80/0x3f4
            pm_suspend+0x60/0xdc
            state_store+0x108/0x144
            kobj_attr_store+0x38/0x88
            sysfs_kf_write+0x64/0xc0
            kernfs_fop_write_iter+0x108/0x1d0
            vfs_write+0x2f4/0x368
            ksys_write+0x7c/0xec
    
    It is caused by the following race between kthread_mod_delayed_work()
    and kthread_cancel_delayed_work_sync():
    
    CPU0                            CPU1
    
    Context: Thread A               Context: Thread B
    
    kthread_mod_delayed_work()
      spin_lock()
      __kthread_cancel_work()
         spin_unlock()
         del_timer_sync()
                                    kthread_cancel_delayed_work_sync()
                                      spin_lock()
                                      __kthread_cancel_work()
                                        spin_unlock()
                                        del_timer_sync()
                                        spin_lock()
    
                                      work->canceling++
                                      spin_unlock
         spin_lock()
       queue_delayed_work()
         // dwork is put into the worker->delayed_work_list
    
       spin_unlock()
    
                                      kthread_flush_work()
         // flush_work is put at the tail of the dwork
    
                                        wait_for_completion()
    
    Context: IRQ
    
      kthread_delayed_work_timer_fn()
        spin_lock()
        list_del_init(&work->node);
        spin_unlock()
    
    BANG: flush_work is not longer linked and will never get proceed.
    
    The problem is that kthread_mod_delayed_work() checks work->canceling
    flag before canceling the timer.
    
    A simple solution is to (re)check work->canceling after
    __kthread_cancel_work().  But then it is not clear what should be
    returned when __kthread_cancel_work() removed the work from the queue
    (list) and it can't queue it again with the new @delay.
    
    The return value might be used for reference counting.  The caller has
    to know whether a new work has been queued or an existing one was
    replaced.
    
    The proper solution is that kthread_mod_delayed_work() will remove the
    work from the queue (list) _only_ when work->canceling is not set.  The
    flag must be checked after the timer is stopped and the remaining
    operations can be done under worker->lock.
    
    Note that kthread_mod_delayed_work() could remove the timer and then
    bail out.  It is fine.  The other canceling caller needs to cancel the
    timer as well.  The important thing is that the queue (list)
    manipulation is done atomically under worker->lock.
    
    Link: https://lkml.kernel.org/r/20210610133051.15337-3-pmladek@suse.com
    Fixes: 9a6b06c8d9a220860468a ("kthread: allow to modify delayed kthread work")
    Signed-off-by: Petr Mladek <pmladek@suse.com>
    Reported-by: Martin Liu <liumartin@google.com>
    Cc: <jenhaochen@google.com>
    Cc: Minchan Kim <minchan@google.com>
    Cc: Nathan Chancellor <nathan@kernel.org>
    Cc: Nick Desaulniers <ndesaulniers@google.com>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Tejun Heo <tj@kernel.org>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/kthread.c b/kernel/kthread.c
index b2688c39c6f1..9750f4f7f901 100644
--- a/kernel/kthread.c
+++ b/kernel/kthread.c
@@ -1037,8 +1037,11 @@ static void kthread_cancel_delayed_work_timer(struct kthread_work *work,
 }
 
 /*
- * This function removes the work from the worker queue. Also it makes sure
- * that it won't get queued later via the delayed work's timer.
+ * This function removes the work from the worker queue.
+ *
+ * It is called under worker->lock. The caller must make sure that
+ * the timer used by delayed work is not running, e.g. by calling
+ * kthread_cancel_delayed_work_timer().
  *
  * The work might still be in use when this function finishes. See the
  * current_work proceed by the worker.
@@ -1046,13 +1049,8 @@ static void kthread_cancel_delayed_work_timer(struct kthread_work *work,
  * Return: %true if @work was pending and successfully canceled,
  *	%false if @work was not pending
  */
-static bool __kthread_cancel_work(struct kthread_work *work, bool is_dwork,
-				  unsigned long *flags)
+static bool __kthread_cancel_work(struct kthread_work *work)
 {
-	/* Try to cancel the timer if exists. */
-	if (is_dwork)
-		kthread_cancel_delayed_work_timer(work, flags);
-
 	/*
 	 * Try to remove the work from a worker list. It might either
 	 * be from worker->work_list or from worker->delayed_work_list.
@@ -1105,11 +1103,23 @@ bool kthread_mod_delayed_work(struct kthread_worker *worker,
 	/* Work must not be used with >1 worker, see kthread_queue_work() */
 	WARN_ON_ONCE(work->worker != worker);
 
-	/* Do not fight with another command that is canceling this work. */
+	/*
+	 * Temporary cancel the work but do not fight with another command
+	 * that is canceling the work as well.
+	 *
+	 * It is a bit tricky because of possible races with another
+	 * mod_delayed_work() and cancel_delayed_work() callers.
+	 *
+	 * The timer must be canceled first because worker->lock is released
+	 * when doing so. But the work can be removed from the queue (list)
+	 * only when it can be queued again so that the return value can
+	 * be used for reference counting.
+	 */
+	kthread_cancel_delayed_work_timer(work, &flags);
 	if (work->canceling)
 		goto out;
+	ret = __kthread_cancel_work(work);
 
-	ret = __kthread_cancel_work(work, true, &flags);
 fast_queue:
 	__kthread_queue_delayed_work(worker, dwork, delay);
 out:
@@ -1131,7 +1141,10 @@ static bool __kthread_cancel_work_sync(struct kthread_work *work, bool is_dwork)
 	/* Work must not be used with >1 worker, see kthread_queue_work(). */
 	WARN_ON_ONCE(work->worker != worker);
 
-	ret = __kthread_cancel_work(work, is_dwork, &flags);
+	if (is_dwork)
+		kthread_cancel_delayed_work_timer(work, &flags);
+
+	ret = __kthread_cancel_work(work);
 
 	if (worker->current_work != work)
 		goto out_fast;

commit 13bcf5aeb33caa283c6b03e14b7a254e1223c0d7
Author: Petr Mladek <pmladek@suse.com>
Date:   Thu Jun 24 18:39:45 2021 -0700

    kthread_worker: split code for canceling the delayed work timer
    
    commit 34b3d5344719d14fd2185b2d9459b3abcb8cf9d8 upstream.
    
    Patch series "kthread_worker: Fix race between kthread_mod_delayed_work()
    and kthread_cancel_delayed_work_sync()".
    
    This patchset fixes the race between kthread_mod_delayed_work() and
    kthread_cancel_delayed_work_sync() including proper return value
    handling.
    
    This patch (of 2):
    
    Simple code refactoring as a preparation step for fixing a race between
    kthread_mod_delayed_work() and kthread_cancel_delayed_work_sync().
    
    It does not modify the existing behavior.
    
    Link: https://lkml.kernel.org/r/20210610133051.15337-2-pmladek@suse.com
    Signed-off-by: Petr Mladek <pmladek@suse.com>
    Cc: <jenhaochen@google.com>
    Cc: Martin Liu <liumartin@google.com>
    Cc: Minchan Kim <minchan@google.com>
    Cc: Nathan Chancellor <nathan@kernel.org>
    Cc: Nick Desaulniers <ndesaulniers@google.com>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Tejun Heo <tj@kernel.org>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/kthread.c b/kernel/kthread.c
index 81abfac35127..b2688c39c6f1 100644
--- a/kernel/kthread.c
+++ b/kernel/kthread.c
@@ -1009,6 +1009,33 @@ void kthread_flush_work(struct kthread_work *work)
 }
 EXPORT_SYMBOL_GPL(kthread_flush_work);
 
+/*
+ * Make sure that the timer is neither set nor running and could
+ * not manipulate the work list_head any longer.
+ *
+ * The function is called under worker->lock. The lock is temporary
+ * released but the timer can't be set again in the meantime.
+ */
+static void kthread_cancel_delayed_work_timer(struct kthread_work *work,
+					      unsigned long *flags)
+{
+	struct kthread_delayed_work *dwork =
+		container_of(work, struct kthread_delayed_work, work);
+	struct kthread_worker *worker = work->worker;
+
+	/*
+	 * del_timer_sync() must be called to make sure that the timer
+	 * callback is not running. The lock must be temporary released
+	 * to avoid a deadlock with the callback. In the meantime,
+	 * any queuing is blocked by setting the canceling counter.
+	 */
+	work->canceling++;
+	spin_unlock_irqrestore(&worker->lock, *flags);
+	del_timer_sync(&dwork->timer);
+	spin_lock_irqsave(&worker->lock, *flags);
+	work->canceling--;
+}
+
 /*
  * This function removes the work from the worker queue. Also it makes sure
  * that it won't get queued later via the delayed work's timer.
@@ -1023,23 +1050,8 @@ static bool __kthread_cancel_work(struct kthread_work *work, bool is_dwork,
 				  unsigned long *flags)
 {
 	/* Try to cancel the timer if exists. */
-	if (is_dwork) {
-		struct kthread_delayed_work *dwork =
-			container_of(work, struct kthread_delayed_work, work);
-		struct kthread_worker *worker = work->worker;
-
-		/*
-		 * del_timer_sync() must be called to make sure that the timer
-		 * callback is not running. The lock must be temporary released
-		 * to avoid a deadlock with the callback. In the meantime,
-		 * any queuing is blocked by setting the canceling counter.
-		 */
-		work->canceling++;
-		spin_unlock_irqrestore(&worker->lock, *flags);
-		del_timer_sync(&dwork->timer);
-		spin_lock_irqsave(&worker->lock, *flags);
-		work->canceling--;
-	}
+	if (is_dwork)
+		kthread_cancel_delayed_work_timer(work, flags);
 
 	/*
 	 * Try to remove the work from a worker list. It might either

commit 4ca30ef6257a729fdb9d42a80d72984dd332bfd6
Author: Anson Huang <Anson.Huang@nxp.com>
Date:   Mon Dec 30 09:41:07 2019 +0800

    ARM: dts: imx6qdl-sabresd: Remove incorrect power supply assignment
    
    commit 4521de30fbb3f5be0db58de93582ebce72c9d44f upstream.
    
    The vdd3p0 LDO's input should be from external USB VBUS directly, NOT
    PMIC's power supply, the vdd3p0 LDO's target output voltage can be
    controlled by SW, and it requires input voltage to be high enough, with
    incorrect power supply assigned, if the power supply's voltage is lower
    than the LDO target output voltage, it will return fail and skip the LDO
    voltage adjustment, so remove the power supply assignment for vdd3p0 to
    avoid such scenario.
    
    Fixes: 93385546ba36 ("ARM: dts: imx6qdl-sabresd: Assign corresponding power supply for LDOs")
    Signed-off-by: Anson Huang <Anson.Huang@nxp.com>
    Signed-off-by: Shawn Guo <shawnguo@kernel.org>
    Signed-off-by: Nobuhiro Iwamatsu (CIP) <nobuhiro1.iwamatsu@toshiba.co.jp>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
index 41384bbd2f60..03357d39870e 100644
--- a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
@@ -675,10 +675,6 @@
 	vin-supply = <&vgen5_reg>;
 };
 
-&reg_vdd3p0 {
-	vin-supply = <&sw2_reg>;
-};
-
 &reg_vdd2p5 {
 	vin-supply = <&vgen5_reg>;
 };

commit cadf5bbcefbd9717e51c61d6128b520583ffdf4f
Author: David Rientjes <rientjes@google.com>
Date:   Tue Aug 25 12:56:28 2020 -0700

    KVM: SVM: Periodically schedule when unregistering regions on destroy
    
    commit 7be74942f184fdfba34ddd19a0d995deb34d4a03 upstream.
    
    There may be many encrypted regions that need to be unregistered when a
    SEV VM is destroyed.  This can lead to soft lockups.  For example, on a
    host running 4.15:
    
    watchdog: BUG: soft lockup - CPU#206 stuck for 11s! [t_virtual_machi:194348]
    CPU: 206 PID: 194348 Comm: t_virtual_machi
    RIP: 0010:free_unref_page_list+0x105/0x170
    ...
    Call Trace:
     [<0>] release_pages+0x159/0x3d0
     [<0>] sev_unpin_memory+0x2c/0x50 [kvm_amd]
     [<0>] __unregister_enc_region_locked+0x2f/0x70 [kvm_amd]
     [<0>] svm_vm_destroy+0xa9/0x200 [kvm_amd]
     [<0>] kvm_arch_destroy_vm+0x47/0x200
     [<0>] kvm_put_kvm+0x1a8/0x2f0
     [<0>] kvm_vm_release+0x25/0x30
     [<0>] do_exit+0x335/0xc10
     [<0>] do_group_exit+0x3f/0xa0
     [<0>] get_signal+0x1bc/0x670
     [<0>] do_signal+0x31/0x130
    
    Although the CLFLUSH is no longer issued on every encrypted region to be
    unregistered, there are no other changes that can prevent soft lockups for
    very large SEV VMs in the latest kernel.
    
    Periodically schedule if necessary.  This still holds kvm->lock across the
    resched, but since this only happens when the VM is destroyed this is
    assumed to be acceptable.
    
    Signed-off-by: David Rientjes <rientjes@google.com>
    Message-Id: <alpine.DEB.2.23.453.2008251255240.2987727@chino.kir.corp.google.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    [iwamatsu: adjust filename.]
    Reference: CVE-2020-36311
    Signed-off-by: Nobuhiro Iwamatsu (CIP) <nobuhiro1.iwamatsu@toshiba.co.jp>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index ad24e6777277..78f4ffbfb43a 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -1954,6 +1954,7 @@ static void sev_vm_destroy(struct kvm *kvm)
 		list_for_each_safe(pos, q, head) {
 			__unregister_enc_region_locked(kvm,
 				list_entry(pos, struct enc_region, list));
+			cond_resched();
 		}
 	}
 

commit 6a6e04ce3bafb24a346a64e9766ec37814036245
Author: Tahsin Erdogan <trdgn@amazon.com>
Date:   Sat Jul 3 16:05:55 2021 -0700

    ext4: eliminate bogus error in ext4_data_block_valid_rcu()
    
    Mainline commit ce9f24cccdc0 ("ext4: check journal inode extents more carefully")
    enabled validity checks for journal inode's data blocks. This change got
    ported to stable branches, but the backport for 4.19 has a bug where it will
    flag an error even when system block entry's inode number matches journal
    inode.
    
    The way error is reported is also problematic because it updates the superblock
    without following journaling rules. This may result in superblock checksum
    errors if the superblock is in the process of being committed but has a
    previously calculated checksum that doesn't include the bogus error update.
    
    This patch eliminates the bogus error by trying to match how other backports
    were implemented, which is to flag an error only when inode numbers mismatch.
    
    Fixes: commit a75a5d163857 ("ext4: check journal inode extents more carefully")
    Signed-off-by: Tahsin Erdogan <trdgn@amazon.com>
    Cc: Jan Kara <jack@suse.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ext4/block_validity.c b/fs/ext4/block_validity.c
index 1ea8fc9ff048..1bc65ecd4bd6 100644
--- a/fs/ext4/block_validity.c
+++ b/fs/ext4/block_validity.c
@@ -171,8 +171,10 @@ static int ext4_data_block_valid_rcu(struct ext4_sb_info *sbi,
 		else if (start_blk >= (entry->start_blk + entry->count))
 			n = n->rb_right;
 		else {
+			if (entry->ino == ino)
+				return 1;
 			sbi->s_es->s_last_error_block = cpu_to_le64(start_blk);
-			return entry->ino == ino;
+			return 0;
 		}
 	}
 	return 1;

commit 6dcca74b358a849c55ab2db41ae8f97e08ffb8e0
Author: Christian König <christian.koenig@amd.com>
Date:   Fri Jun 11 14:34:50 2021 +0200

    drm/nouveau: fix dma_address check for CPU/GPU sync
    
    [ Upstream commit d330099115597bbc238d6758a4930e72b49ea9ba ]
    
    AGP for example doesn't have a dma_address array.
    
    Signed-off-by: Christian König <christian.koenig@amd.com>
    Acked-by: Alex Deucher <alexander.deucher@amd.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20210614110517.1624-1-christian.koenig@amd.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
index 7214022dfb91..d230536e7086 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -512,7 +512,7 @@ nouveau_bo_sync_for_device(struct nouveau_bo *nvbo)
 	struct ttm_dma_tt *ttm_dma = (struct ttm_dma_tt *)nvbo->bo.ttm;
 	int i;
 
-	if (!ttm_dma)
+	if (!ttm_dma || !ttm_dma->dma_address)
 		return;
 
 	/* Don't waste time looping if the object is coherent */
@@ -532,7 +532,7 @@ nouveau_bo_sync_for_cpu(struct nouveau_bo *nvbo)
 	struct ttm_dma_tt *ttm_dma = (struct ttm_dma_tt *)nvbo->bo.ttm;
 	int i;
 
-	if (!ttm_dma)
+	if (!ttm_dma || !ttm_dma->dma_address)
 		return;
 
 	/* Don't waste time looping if the object is coherent */

commit b52a404434a93d83b243187c6cf135dd6ba529c8
Author: ManYi Li <limanyi@uniontech.com>
Date:   Fri Jun 11 17:44:02 2021 +0800

    scsi: sr: Return appropriate error code when disk is ejected
    
    [ Upstream commit 7dd753ca59d6c8cc09aa1ed24f7657524803c7f3 ]
    
    Handle a reported media event code of 3. This indicates that the media has
    been removed from the drive and user intervention is required to proceed.
    Return DISK_EVENT_EJECT_REQUEST in that case.
    
    Link: https://lore.kernel.org/r/20210611094402.23884-1-limanyi@uniontech.com
    Signed-off-by: ManYi Li <limanyi@uniontech.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c
index 45c8bf39ad23..acf0c244141f 100644
--- a/drivers/scsi/sr.c
+++ b/drivers/scsi/sr.c
@@ -216,6 +216,8 @@ static unsigned int sr_get_events(struct scsi_device *sdev)
 		return DISK_EVENT_EJECT_REQUEST;
 	else if (med->media_event_code == 2)
 		return DISK_EVENT_MEDIA_CHANGE;
+	else if (med->media_event_code == 3)
+		return DISK_EVENT_EJECT_REQUEST;
 	return 0;
 }
 

commit 2445837e9cd084ba849a7c1c70086a6cdc608f48
Author: Hugh Dickins <hughd@google.com>
Date:   Thu Jun 24 18:39:52 2021 -0700

    mm, futex: fix shared futex pgoff on shmem huge page
    
    [ Upstream commit fe19bd3dae3d15d2fbfdb3de8839a6ea0fe94264 ]
    
    If more than one futex is placed on a shmem huge page, it can happen
    that waking the second wakes the first instead, and leaves the second
    waiting: the key's shared.pgoff is wrong.
    
    When 3.11 commit 13d60f4b6ab5 ("futex: Take hugepages into account when
    generating futex_key"), the only shared huge pages came from hugetlbfs,
    and the code added to deal with its exceptional page->index was put into
    hugetlb source.  Then that was missed when 4.8 added shmem huge pages.
    
    page_to_pgoff() is what others use for this nowadays: except that, as
    currently written, it gives the right answer on hugetlbfs head, but
    nonsense on hugetlbfs tails.  Fix that by calling hugetlbfs-specific
    hugetlb_basepage_index() on PageHuge tails as well as on head.
    
    Yes, it's unconventional to declare hugetlb_basepage_index() there in
    pagemap.h, rather than in hugetlb.h; but I do not expect anything but
    page_to_pgoff() ever to need it.
    
    [akpm@linux-foundation.org: give hugetlb_basepage_index() prototype the correct scope]
    
    Link: https://lkml.kernel.org/r/b17d946b-d09-326e-b42a-52884c36df32@google.com
    Fixes: 800d8c63b2e9 ("shmem: add huge pages support")
    Reported-by: Neel Natu <neelnatu@google.com>
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>
    Acked-by: Thomas Gleixner <tglx@linutronix.de>
    Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
    Cc: Zhang Yi <wetpzy@gmail.com>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Cc: Mike Kravetz <mike.kravetz@oracle.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Darren Hart <dvhart@infradead.org>
    Cc: Davidlohr Bueso <dave@stgolabs.net>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    
    Note on stable backport: leave redundant #include <linux/hugetlb.h>
    in kernel/futex.c, to avoid conflict over the header files included.
    
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
index c129c1c14c5f..2df83a659818 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -477,17 +477,6 @@ static inline int hstate_index(struct hstate *h)
 	return h - hstates;
 }
 
-pgoff_t __basepage_index(struct page *page);
-
-/* Return page->index in PAGE_SIZE units */
-static inline pgoff_t basepage_index(struct page *page)
-{
-	if (!PageCompound(page))
-		return page->index;
-
-	return __basepage_index(page);
-}
-
 extern int dissolve_free_huge_page(struct page *page);
 extern int dissolve_free_huge_pages(unsigned long start_pfn,
 				    unsigned long end_pfn);
@@ -582,11 +571,6 @@ static inline int hstate_index(struct hstate *h)
 	return 0;
 }
 
-static inline pgoff_t basepage_index(struct page *page)
-{
-	return page->index;
-}
-
 static inline int dissolve_free_huge_page(struct page *page)
 {
 	return 0;
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
index b1bd2186e6d2..33b63b2a163f 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -403,7 +403,7 @@ static inline struct page *read_mapping_page(struct address_space *mapping,
 }
 
 /*
- * Get index of the page with in radix-tree
+ * Get index of the page within radix-tree (but not for hugetlb pages).
  * (TODO: remove once hugetlb pages will have ->index in PAGE_SIZE)
  */
 static inline pgoff_t page_to_index(struct page *page)
@@ -422,15 +422,16 @@ static inline pgoff_t page_to_index(struct page *page)
 	return pgoff;
 }
 
+extern pgoff_t hugetlb_basepage_index(struct page *page);
+
 /*
- * Get the offset in PAGE_SIZE.
- * (TODO: hugepage should have ->index in PAGE_SIZE)
+ * Get the offset in PAGE_SIZE (even for hugetlb pages).
+ * (TODO: hugetlb pages should have ->index in PAGE_SIZE)
  */
 static inline pgoff_t page_to_pgoff(struct page *page)
 {
-	if (unlikely(PageHeadHuge(page)))
-		return page->index << compound_order(page);
-
+	if (unlikely(PageHuge(page)))
+		return hugetlb_basepage_index(page);
 	return page_to_index(page);
 }
 
diff --git a/kernel/futex.c b/kernel/futex.c
index 526ebcff5a0a..3c67da9b8408 100644
--- a/kernel/futex.c
+++ b/kernel/futex.c
@@ -719,7 +719,7 @@ get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key, int rw)
 
 		key->both.offset |= FUT_OFF_INODE; /* inode-based key */
 		key->shared.i_seq = get_inode_sequence_number(inode);
-		key->shared.pgoff = basepage_index(tail);
+		key->shared.pgoff = page_to_pgoff(tail);
 		rcu_read_unlock();
 	}
 
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index c69f12e4c149..ebcf26bc4cd4 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -1391,15 +1391,12 @@ int PageHeadHuge(struct page *page_head)
 	return get_compound_page_dtor(page_head) == free_huge_page;
 }
 
-pgoff_t __basepage_index(struct page *page)
+pgoff_t hugetlb_basepage_index(struct page *page)
 {
 	struct page *page_head = compound_head(page);
 	pgoff_t index = page_index(page_head);
 	unsigned long compound_idx;
 
-	if (!PageHuge(page_head))
-		return page_index(page);
-
 	if (compound_order(page_head) >= MAX_ORDER)
 		compound_idx = page_to_pfn(page) - page_to_pfn(page_head);
 	else

commit e943b4373cf706ee8ee433988bc0c4d6e3ea5907
Author: Hugh Dickins <hughd@google.com>
Date:   Thu Jun 24 18:39:30 2021 -0700

    mm/thp: another PVMW_SYNC fix in page_vma_mapped_walk()
    
    [ Upstream commit a7a69d8ba88d8dcee7ef00e91d413a4bd003a814 ]
    
    Aha! Shouldn't that quick scan over pte_none()s make sure that it holds
    ptlock in the PVMW_SYNC case? That too might have been responsible for
    BUGs or WARNs in split_huge_page_to_list() or its unmap_page(), though
    I've never seen any.
    
    Link: https://lkml.kernel.org/r/1bdf384c-8137-a149-2a1e-475a4791c3c@google.com
    Link: https://lore.kernel.org/linux-mm/20210412180659.B9E3.409509F4@e16-tech.com/
    Fixes: ace71a19cec5 ("mm: introduce page_vma_mapped_walk()")
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Tested-by: Wang Yugui <wangyugui@e16-tech.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: Yang Shi <shy828301@gmail.com>
    Cc: Zi Yan <ziy@nvidia.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c
index b7a8009c1549..edca78609318 100644
--- a/mm/page_vma_mapped.c
+++ b/mm/page_vma_mapped.c
@@ -272,6 +272,10 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
 				goto restart;
 			}
 			pvmw->pte++;
+			if ((pvmw->flags & PVMW_SYNC) && !pvmw->ptl) {
+				pvmw->ptl = pte_lockptr(mm, pvmw->pmd);
+				spin_lock(pvmw->ptl);
+			}
 		} while (pte_none(*pvmw->pte));
 
 		if (!pvmw->ptl) {

commit 69784c9d5cb080a57062d944acb34c334758ff0a
Author: Hugh Dickins <hughd@google.com>
Date:   Thu Jun 24 18:39:26 2021 -0700

    mm/thp: fix page_vma_mapped_walk() if THP mapped by ptes
    
    [ Upstream commit a9a7504d9beaf395481faa91e70e2fd08f7a3dde ]
    
    Running certain tests with a DEBUG_VM kernel would crash within hours,
    on the total_mapcount BUG() in split_huge_page_to_list(), while trying
    to free up some memory by punching a hole in a shmem huge page: split's
    try_to_unmap() was unable to find all the mappings of the page (which,
    on a !DEBUG_VM kernel, would then keep the huge page pinned in memory).
    
    Crash dumps showed two tail pages of a shmem huge page remained mapped
    by pte: ptes in a non-huge-aligned vma of a gVisor process, at the end
    of a long unmapped range; and no page table had yet been allocated for
    the head of the huge page to be mapped into.
    
    Although designed to handle these odd misaligned huge-page-mapped-by-pte
    cases, page_vma_mapped_walk() falls short by returning false prematurely
    when !pmd_present or !pud_present or !p4d_present or !pgd_present: there
    are cases when a huge page may span the boundary, with ptes present in
    the next.
    
    Restructure page_vma_mapped_walk() as a loop to continue in these cases,
    while keeping its layout much as before.  Add a step_forward() helper to
    advance pvmw->address across those boundaries: originally I tried to use
    mm's standard p?d_addr_end() macros, but hit the same crash 512 times
    less often: because of the way redundant levels are folded together, but
    folded differently in different configurations, it was just too
    difficult to use them correctly; and step_forward() is simpler anyway.
    
    Link: https://lkml.kernel.org/r/fedb8632-1798-de42-f39e-873551d5bc81@google.com
    Fixes: ace71a19cec5 ("mm: introduce page_vma_mapped_walk()")
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Wang Yugui <wangyugui@e16-tech.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: Yang Shi <shy828301@gmail.com>
    Cc: Zi Yan <ziy@nvidia.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c
index 7239c38e99e2..b7a8009c1549 100644
--- a/mm/page_vma_mapped.c
+++ b/mm/page_vma_mapped.c
@@ -111,6 +111,13 @@ static bool check_pte(struct page_vma_mapped_walk *pvmw)
 	return pfn_in_hpage(pvmw->page, pfn);
 }
 
+static void step_forward(struct page_vma_mapped_walk *pvmw, unsigned long size)
+{
+	pvmw->address = (pvmw->address + size) & ~(size - 1);
+	if (!pvmw->address)
+		pvmw->address = ULONG_MAX;
+}
+
 /**
  * page_vma_mapped_walk - check if @pvmw->page is mapped in @pvmw->vma at
  * @pvmw->address
@@ -179,16 +186,22 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
 	if (pvmw->pte)
 		goto next_pte;
 restart:
-	{
+	do {
 		pgd = pgd_offset(mm, pvmw->address);
-		if (!pgd_present(*pgd))
-			return false;
+		if (!pgd_present(*pgd)) {
+			step_forward(pvmw, PGDIR_SIZE);
+			continue;
+		}
 		p4d = p4d_offset(pgd, pvmw->address);
-		if (!p4d_present(*p4d))
-			return false;
+		if (!p4d_present(*p4d)) {
+			step_forward(pvmw, P4D_SIZE);
+			continue;
+		}
 		pud = pud_offset(p4d, pvmw->address);
-		if (!pud_present(*pud))
-			return false;
+		if (!pud_present(*pud)) {
+			step_forward(pvmw, PUD_SIZE);
+			continue;
+		}
 
 		pvmw->pmd = pmd_offset(pud, pvmw->address);
 		/*
@@ -235,7 +248,8 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
 
 				spin_unlock(ptl);
 			}
-			return false;
+			step_forward(pvmw, PMD_SIZE);
+			continue;
 		}
 		if (!map_pte(pvmw))
 			goto next_pte;
@@ -265,7 +279,9 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
 			spin_lock(pvmw->ptl);
 		}
 		goto this_pte;
-	}
+	} while (pvmw->address < end);
+
+	return false;
 }
 
 /**

commit b114408b1aa2b0957877632113009bdf5efc5da2
Author: Hugh Dickins <hughd@google.com>
Date:   Thu Jun 24 18:39:23 2021 -0700

    mm: page_vma_mapped_walk(): get vma_address_end() earlier
    
    [ Upstream commit a765c417d876cc635f628365ec9aa6f09470069a ]
    
    page_vma_mapped_walk() cleanup: get THP's vma_address_end() at the
    start, rather than later at next_pte.
    
    It's a little unnecessary overhead on the first call, but makes for a
    simpler loop in the following commit.
    
    Link: https://lkml.kernel.org/r/4542b34d-862f-7cb4-bb22-e0df6ce830a2@google.com
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Wang Yugui <wangyugui@e16-tech.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: Yang Shi <shy828301@gmail.com>
    Cc: Zi Yan <ziy@nvidia.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c
index 470f19c917ad..7239c38e99e2 100644
--- a/mm/page_vma_mapped.c
+++ b/mm/page_vma_mapped.c
@@ -167,6 +167,15 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
 		return true;
 	}
 
+	/*
+	 * Seek to next pte only makes sense for THP.
+	 * But more important than that optimization, is to filter out
+	 * any PageKsm page: whose page->index misleads vma_address()
+	 * and vma_address_end() to disaster.
+	 */
+	end = PageTransCompound(page) ?
+		vma_address_end(page, pvmw->vma) :
+		pvmw->address + PAGE_SIZE;
 	if (pvmw->pte)
 		goto next_pte;
 restart:
@@ -234,10 +243,6 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
 		if (check_pte(pvmw))
 			return true;
 next_pte:
-		/* Seek to next pte only makes sense for THP */
-		if (!PageTransHuge(page))
-			return not_found(pvmw);
-		end = vma_address_end(page, pvmw->vma);
 		do {
 			pvmw->address += PAGE_SIZE;
 			if (pvmw->address >= end)

commit 7d82908ba4fb6ae809db8a5d63f85f1acc6d2946
Author: Hugh Dickins <hughd@google.com>
Date:   Thu Jun 24 18:39:20 2021 -0700

    mm: page_vma_mapped_walk(): use goto instead of while (1)
    
    [ Upstream commit 474466301dfd8b39a10c01db740645f3f7ae9a28 ]
    
    page_vma_mapped_walk() cleanup: add a label this_pte, matching next_pte,
    and use "goto this_pte", in place of the "while (1)" loop at the end.
    
    Link: https://lkml.kernel.org/r/a52b234a-851-3616-2525-f42736e8934@google.com
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Wang Yugui <wangyugui@e16-tech.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: Yang Shi <shy828301@gmail.com>
    Cc: Zi Yan <ziy@nvidia.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c
index 819945678264..470f19c917ad 100644
--- a/mm/page_vma_mapped.c
+++ b/mm/page_vma_mapped.c
@@ -139,6 +139,7 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
 {
 	struct mm_struct *mm = pvmw->vma->vm_mm;
 	struct page *page = pvmw->page;
+	unsigned long end;
 	pgd_t *pgd;
 	p4d_t *p4d;
 	pud_t *pud;
@@ -229,10 +230,7 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
 		}
 		if (!map_pte(pvmw))
 			goto next_pte;
-	}
-	while (1) {
-		unsigned long end;
-
+this_pte:
 		if (check_pte(pvmw))
 			return true;
 next_pte:
@@ -261,6 +259,7 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
 			pvmw->ptl = pte_lockptr(mm, pvmw->pmd);
 			spin_lock(pvmw->ptl);
 		}
+		goto this_pte;
 	}
 }
 

commit ac0324b14dae4dd664fd94d9ada161089f4d2b8b
Author: Hugh Dickins <hughd@google.com>
Date:   Thu Jun 24 18:39:17 2021 -0700

    mm: page_vma_mapped_walk(): add a level of indentation
    
    [ Upstream commit b3807a91aca7d21c05d5790612e49969117a72b9 ]
    
    page_vma_mapped_walk() cleanup: add a level of indentation to much of
    the body, making no functional change in this commit, but reducing the
    later diff when this is all converted to a loop.
    
    [hughd@google.com: : page_vma_mapped_walk(): add a level of indentation fix]
      Link: https://lkml.kernel.org/r/7f817555-3ce1-c785-e438-87d8efdcaf26@google.com
    
    Link: https://lkml.kernel.org/r/efde211-f3e2-fe54-977-ef481419e7f3@google.com
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Wang Yugui <wangyugui@e16-tech.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: Yang Shi <shy828301@gmail.com>
    Cc: Zi Yan <ziy@nvidia.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c
index 1fccadd0eb6d..819945678264 100644
--- a/mm/page_vma_mapped.c
+++ b/mm/page_vma_mapped.c
@@ -169,62 +169,67 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
 	if (pvmw->pte)
 		goto next_pte;
 restart:
-	pgd = pgd_offset(mm, pvmw->address);
-	if (!pgd_present(*pgd))
-		return false;
-	p4d = p4d_offset(pgd, pvmw->address);
-	if (!p4d_present(*p4d))
-		return false;
-	pud = pud_offset(p4d, pvmw->address);
-	if (!pud_present(*pud))
-		return false;
-	pvmw->pmd = pmd_offset(pud, pvmw->address);
-	/*
-	 * Make sure the pmd value isn't cached in a register by the
-	 * compiler and used as a stale value after we've observed a
-	 * subsequent update.
-	 */
-	pmde = READ_ONCE(*pvmw->pmd);
-	if (pmd_trans_huge(pmde) || is_pmd_migration_entry(pmde)) {
-		pvmw->ptl = pmd_lock(mm, pvmw->pmd);
-		pmde = *pvmw->pmd;
-		if (likely(pmd_trans_huge(pmde))) {
-			if (pvmw->flags & PVMW_MIGRATION)
-				return not_found(pvmw);
-			if (pmd_page(pmde) != page)
-				return not_found(pvmw);
-			return true;
-		}
-		if (!pmd_present(pmde)) {
-			swp_entry_t entry;
+	{
+		pgd = pgd_offset(mm, pvmw->address);
+		if (!pgd_present(*pgd))
+			return false;
+		p4d = p4d_offset(pgd, pvmw->address);
+		if (!p4d_present(*p4d))
+			return false;
+		pud = pud_offset(p4d, pvmw->address);
+		if (!pud_present(*pud))
+			return false;
 
-			if (!thp_migration_supported() ||
-			    !(pvmw->flags & PVMW_MIGRATION))
-				return not_found(pvmw);
-			entry = pmd_to_swp_entry(pmde);
-			if (!is_migration_entry(entry) ||
-			    migration_entry_to_page(entry) != page)
-				return not_found(pvmw);
-			return true;
-		}
-		/* THP pmd was split under us: handle on pte level */
-		spin_unlock(pvmw->ptl);
-		pvmw->ptl = NULL;
-	} else if (!pmd_present(pmde)) {
+		pvmw->pmd = pmd_offset(pud, pvmw->address);
 		/*
-		 * If PVMW_SYNC, take and drop THP pmd lock so that we
-		 * cannot return prematurely, while zap_huge_pmd() has
-		 * cleared *pmd but not decremented compound_mapcount().
+		 * Make sure the pmd value isn't cached in a register by the
+		 * compiler and used as a stale value after we've observed a
+		 * subsequent update.
 		 */
-		if ((pvmw->flags & PVMW_SYNC) && PageTransCompound(page)) {
-			spinlock_t *ptl = pmd_lock(mm, pvmw->pmd);
+		pmde = READ_ONCE(*pvmw->pmd);
 
-			spin_unlock(ptl);
+		if (pmd_trans_huge(pmde) || is_pmd_migration_entry(pmde)) {
+			pvmw->ptl = pmd_lock(mm, pvmw->pmd);
+			pmde = *pvmw->pmd;
+			if (likely(pmd_trans_huge(pmde))) {
+				if (pvmw->flags & PVMW_MIGRATION)
+					return not_found(pvmw);
+				if (pmd_page(pmde) != page)
+					return not_found(pvmw);
+				return true;
+			}
+			if (!pmd_present(pmde)) {
+				swp_entry_t entry;
+
+				if (!thp_migration_supported() ||
+				    !(pvmw->flags & PVMW_MIGRATION))
+					return not_found(pvmw);
+				entry = pmd_to_swp_entry(pmde);
+				if (!is_migration_entry(entry) ||
+				    migration_entry_to_page(entry) != page)
+					return not_found(pvmw);
+				return true;
+			}
+			/* THP pmd was split under us: handle on pte level */
+			spin_unlock(pvmw->ptl);
+			pvmw->ptl = NULL;
+		} else if (!pmd_present(pmde)) {
+			/*
+			 * If PVMW_SYNC, take and drop THP pmd lock so that we
+			 * cannot return prematurely, while zap_huge_pmd() has
+			 * cleared *pmd but not decremented compound_mapcount().
+			 */
+			if ((pvmw->flags & PVMW_SYNC) &&
+			    PageTransCompound(page)) {
+				spinlock_t *ptl = pmd_lock(mm, pvmw->pmd);
+
+				spin_unlock(ptl);
+			}
+			return false;
 		}
-		return false;
+		if (!map_pte(pvmw))
+			goto next_pte;
 	}
-	if (!map_pte(pvmw))
-		goto next_pte;
 	while (1) {
 		unsigned long end;
 

commit 97a79b7896d6b8c009561f695649b31c1b35437c
Author: Hugh Dickins <hughd@google.com>
Date:   Thu Jun 24 18:39:14 2021 -0700

    mm: page_vma_mapped_walk(): crossing page table boundary
    
    [ Upstream commit 448282487483d6fa5b2eeeafaa0acc681e544a9c ]
    
    page_vma_mapped_walk() cleanup: adjust the test for crossing page table
    boundary - I believe pvmw->address is always page-aligned, but nothing
    else here assumed that; and remember to reset pvmw->pte to NULL after
    unmapping the page table, though I never saw any bug from that.
    
    Link: https://lkml.kernel.org/r/799b3f9c-2a9e-dfef-5d89-26e9f76fd97@google.com
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Wang Yugui <wangyugui@e16-tech.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: Yang Shi <shy828301@gmail.com>
    Cc: Zi Yan <ziy@nvidia.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c
index e32ed7912923..1fccadd0eb6d 100644
--- a/mm/page_vma_mapped.c
+++ b/mm/page_vma_mapped.c
@@ -240,16 +240,16 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
 			if (pvmw->address >= end)
 				return not_found(pvmw);
 			/* Did we cross page table boundary? */
-			if (pvmw->address % PMD_SIZE == 0) {
-				pte_unmap(pvmw->pte);
+			if ((pvmw->address & (PMD_SIZE - PAGE_SIZE)) == 0) {
 				if (pvmw->ptl) {
 					spin_unlock(pvmw->ptl);
 					pvmw->ptl = NULL;
 				}
+				pte_unmap(pvmw->pte);
+				pvmw->pte = NULL;
 				goto restart;
-			} else {
-				pvmw->pte++;
 			}
+			pvmw->pte++;
 		} while (pte_none(*pvmw->pte));
 
 		if (!pvmw->ptl) {

commit d4b99cf445d24089255a49ff927ed8884ca2f7f5
Author: Hugh Dickins <hughd@google.com>
Date:   Thu Jun 24 18:39:10 2021 -0700

    mm: page_vma_mapped_walk(): prettify PVMW_MIGRATION block
    
    [ Upstream commit e2e1d4076c77b3671cf8ce702535ae7dee3acf89 ]
    
    page_vma_mapped_walk() cleanup: rearrange the !pmd_present() block to
    follow the same "return not_found, return not_found, return true"
    pattern as the block above it (note: returning not_found there is never
    premature, since existence or prior existence of huge pmd guarantees
    good alignment).
    
    Link: https://lkml.kernel.org/r/378c8650-1488-2edf-9647-32a53cf2e21@google.com
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Reviewed-by: Peter Xu <peterx@redhat.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Wang Yugui <wangyugui@e16-tech.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: Yang Shi <shy828301@gmail.com>
    Cc: Zi Yan <ziy@nvidia.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c
index 7e1db77b096a..e32ed7912923 100644
--- a/mm/page_vma_mapped.c
+++ b/mm/page_vma_mapped.c
@@ -194,24 +194,22 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
 			if (pmd_page(pmde) != page)
 				return not_found(pvmw);
 			return true;
-		} else if (!pmd_present(pmde)) {
-			if (thp_migration_supported()) {
-				if (!(pvmw->flags & PVMW_MIGRATION))
-					return not_found(pvmw);
-				if (is_migration_entry(pmd_to_swp_entry(pmde))) {
-					swp_entry_t entry = pmd_to_swp_entry(pmde);
+		}
+		if (!pmd_present(pmde)) {
+			swp_entry_t entry;
 
-					if (migration_entry_to_page(entry) != page)
-						return not_found(pvmw);
-					return true;
-				}
-			}
-			return not_found(pvmw);
-		} else {
-			/* THP pmd was split under us: handle on pte level */
-			spin_unlock(pvmw->ptl);
-			pvmw->ptl = NULL;
+			if (!thp_migration_supported() ||
+			    !(pvmw->flags & PVMW_MIGRATION))
+				return not_found(pvmw);
+			entry = pmd_to_swp_entry(pmde);
+			if (!is_migration_entry(entry) ||
+			    migration_entry_to_page(entry) != page)
+				return not_found(pvmw);
+			return true;
 		}
+		/* THP pmd was split under us: handle on pte level */
+		spin_unlock(pvmw->ptl);
+		pvmw->ptl = NULL;
 	} else if (!pmd_present(pmde)) {
 		/*
 		 * If PVMW_SYNC, take and drop THP pmd lock so that we

commit 9fbb45c5d59d8e4c81c90cc418bed167503db227
Author: Hugh Dickins <hughd@google.com>
Date:   Thu Jun 24 18:39:07 2021 -0700

    mm: page_vma_mapped_walk(): use pmde for *pvmw->pmd
    
    [ Upstream commit 3306d3119ceacc43ea8b141a73e21fea68eec30c ]
    
    page_vma_mapped_walk() cleanup: re-evaluate pmde after taking lock, then
    use it in subsequent tests, instead of repeatedly dereferencing pointer.
    
    Link: https://lkml.kernel.org/r/53fbc9d-891e-46b2-cb4b-468c3b19238e@google.com
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Reviewed-by: Peter Xu <peterx@redhat.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Wang Yugui <wangyugui@e16-tech.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: Yang Shi <shy828301@gmail.com>
    Cc: Zi Yan <ziy@nvidia.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c
index 036ce20bb154..7e1db77b096a 100644
--- a/mm/page_vma_mapped.c
+++ b/mm/page_vma_mapped.c
@@ -187,18 +187,19 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
 	pmde = READ_ONCE(*pvmw->pmd);
 	if (pmd_trans_huge(pmde) || is_pmd_migration_entry(pmde)) {
 		pvmw->ptl = pmd_lock(mm, pvmw->pmd);
-		if (likely(pmd_trans_huge(*pvmw->pmd))) {
+		pmde = *pvmw->pmd;
+		if (likely(pmd_trans_huge(pmde))) {
 			if (pvmw->flags & PVMW_MIGRATION)
 				return not_found(pvmw);
-			if (pmd_page(*pvmw->pmd) != page)
+			if (pmd_page(pmde) != page)
 				return not_found(pvmw);
 			return true;
-		} else if (!pmd_present(*pvmw->pmd)) {
+		} else if (!pmd_present(pmde)) {
 			if (thp_migration_supported()) {
 				if (!(pvmw->flags & PVMW_MIGRATION))
 					return not_found(pvmw);
-				if (is_migration_entry(pmd_to_swp_entry(*pvmw->pmd))) {
-					swp_entry_t entry = pmd_to_swp_entry(*pvmw->pmd);
+				if (is_migration_entry(pmd_to_swp_entry(pmde))) {
+					swp_entry_t entry = pmd_to_swp_entry(pmde);
 
 					if (migration_entry_to_page(entry) != page)
 						return not_found(pvmw);

commit a027b699161023c017b816b61be9990e3f9286f4
Author: Hugh Dickins <hughd@google.com>
Date:   Thu Jun 24 18:39:04 2021 -0700

    mm: page_vma_mapped_walk(): settle PageHuge on entry
    
    [ Upstream commit 6d0fd5987657cb0c9756ce684e3a74c0f6351728 ]
    
    page_vma_mapped_walk() cleanup: get the hugetlbfs PageHuge case out of
    the way at the start, so no need to worry about it later.
    
    Link: https://lkml.kernel.org/r/e31a483c-6d73-a6bb-26c5-43c3b880a2@google.com
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Reviewed-by: Peter Xu <peterx@redhat.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Wang Yugui <wangyugui@e16-tech.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: Yang Shi <shy828301@gmail.com>
    Cc: Zi Yan <ziy@nvidia.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c
index d146f6d31a62..036ce20bb154 100644
--- a/mm/page_vma_mapped.c
+++ b/mm/page_vma_mapped.c
@@ -148,10 +148,11 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
 	if (pvmw->pmd && !pvmw->pte)
 		return not_found(pvmw);
 
-	if (pvmw->pte)
-		goto next_pte;
-
 	if (unlikely(PageHuge(page))) {
+		/* The only possible mapping was handled on last iteration */
+		if (pvmw->pte)
+			return not_found(pvmw);
+
 		/* when pud is not present, pte will be NULL */
 		pvmw->pte = huge_pte_offset(mm, pvmw->address,
 					    PAGE_SIZE << compound_order(page));
@@ -164,6 +165,9 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
 			return not_found(pvmw);
 		return true;
 	}
+
+	if (pvmw->pte)
+		goto next_pte;
 restart:
 	pgd = pgd_offset(mm, pvmw->address);
 	if (!pgd_present(*pgd))
@@ -229,7 +233,7 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
 			return true;
 next_pte:
 		/* Seek to next pte only makes sense for THP */
-		if (!PageTransHuge(page) || PageHuge(page))
+		if (!PageTransHuge(page))
 			return not_found(pvmw);
 		end = vma_address_end(page, pvmw->vma);
 		do {

commit be9ab2d00d071f930cc0389a8ce1424fd84d4c6b
Author: Hugh Dickins <hughd@google.com>
Date:   Thu Jun 24 18:39:01 2021 -0700

    mm: page_vma_mapped_walk(): use page for pvmw->page
    
    [ Upstream commit f003c03bd29e6f46fef1b9a8e8d636ac732286d5 ]
    
    Patch series "mm: page_vma_mapped_walk() cleanup and THP fixes".
    
    I've marked all of these for stable: many are merely cleanups, but I
    think they are much better before the main fix than after.
    
    This patch (of 11):
    
    page_vma_mapped_walk() cleanup: sometimes the local copy of pvwm->page
    was used, sometimes pvmw->page itself: use the local copy "page"
    throughout.
    
    Link: https://lkml.kernel.org/r/589b358c-febc-c88e-d4c2-7834b37fa7bf@google.com
    Link: https://lkml.kernel.org/r/88e67645-f467-c279-bf5e-af4b5c6b13eb@google.com
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Reviewed-by: Alistair Popple <apopple@nvidia.com>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Reviewed-by: Peter Xu <peterx@redhat.com>
    Cc: Yang Shi <shy828301@gmail.com>
    Cc: Wang Yugui <wangyugui@e16-tech.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Zi Yan <ziy@nvidia.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c
index bb7488e86bea..d146f6d31a62 100644
--- a/mm/page_vma_mapped.c
+++ b/mm/page_vma_mapped.c
@@ -151,7 +151,7 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
 	if (pvmw->pte)
 		goto next_pte;
 
-	if (unlikely(PageHuge(pvmw->page))) {
+	if (unlikely(PageHuge(page))) {
 		/* when pud is not present, pte will be NULL */
 		pvmw->pte = huge_pte_offset(mm, pvmw->address,
 					    PAGE_SIZE << compound_order(page));
@@ -213,8 +213,7 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
 		 * cannot return prematurely, while zap_huge_pmd() has
 		 * cleared *pmd but not decremented compound_mapcount().
 		 */
-		if ((pvmw->flags & PVMW_SYNC) &&
-		    PageTransCompound(pvmw->page)) {
+		if ((pvmw->flags & PVMW_SYNC) && PageTransCompound(page)) {
 			spinlock_t *ptl = pmd_lock(mm, pvmw->pmd);
 
 			spin_unlock(ptl);
@@ -230,9 +229,9 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
 			return true;
 next_pte:
 		/* Seek to next pte only makes sense for THP */
-		if (!PageTransHuge(pvmw->page) || PageHuge(pvmw->page))
+		if (!PageTransHuge(page) || PageHuge(page))
 			return not_found(pvmw);
-		end = vma_address_end(pvmw->page, pvmw->vma);
+		end = vma_address_end(page, pvmw->vma);
 		do {
 			pvmw->address += PAGE_SIZE;
 			if (pvmw->address >= end)

commit e17afb6d0b7c74f316dbff33588210190600efc7
Author: Yang Shi <shy828301@gmail.com>
Date:   Tue Jun 15 18:24:07 2021 -0700

    mm: thp: replace DEBUG_VM BUG with VM_WARN when unmap fails for split
    
    [ Upstream commit 504e070dc08f757bccaed6d05c0f53ecbfac8a23 ]
    
    When debugging the bug reported by Wang Yugui [1], try_to_unmap() may
    fail, but the first VM_BUG_ON_PAGE() just checks page_mapcount() however
    it may miss the failure when head page is unmapped but other subpage is
    mapped.  Then the second DEBUG_VM BUG() that check total mapcount would
    catch it.  This may incur some confusion.
    
    As this is not a fatal issue, so consolidate the two DEBUG_VM checks
    into one VM_WARN_ON_ONCE_PAGE().
    
    [1] https://lore.kernel.org/linux-mm/20210412180659.B9E3.409509F4@e16-tech.com/
    
    Link: https://lkml.kernel.org/r/d0f0db68-98b8-ebfb-16dc-f29df24cf012@google.com
    Signed-off-by: Yang Shi <shy828301@gmail.com>
    Reviewed-by: Zi Yan <ziy@nvidia.com>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Jue Wang <juew@google.com>
    Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>
    Cc: Miaohe Lin <linmiaohe@huawei.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Naoya Horiguchi <naoya.horiguchi@nec.com>
    Cc: Oscar Salvador <osalvador@suse.de>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Shakeel Butt <shakeelb@google.com>
    Cc: Wang Yugui <wangyugui@e16-tech.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    
    Note on stable backport: fixed up variables and split_queue_lock in
    split_huge_page_to_list(), and conflict on ttu_flags in unmap_page().
    
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 78c1ad5f8109..4400957d8e4e 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -2431,15 +2431,15 @@ static void unmap_page(struct page *page)
 {
 	enum ttu_flags ttu_flags = TTU_IGNORE_MLOCK | TTU_IGNORE_ACCESS |
 		TTU_RMAP_LOCKED | TTU_SPLIT_HUGE_PMD | TTU_SYNC;
-	bool unmap_success;
 
 	VM_BUG_ON_PAGE(!PageHead(page), page);
 
 	if (PageAnon(page))
 		ttu_flags |= TTU_SPLIT_FREEZE;
 
-	unmap_success = try_to_unmap(page, ttu_flags);
-	VM_BUG_ON_PAGE(!unmap_success, page);
+	try_to_unmap(page, ttu_flags);
+
+	VM_WARN_ON_ONCE_PAGE(page_mapped(page), page);
 }
 
 static void remap_page(struct page *page)
@@ -2698,7 +2698,7 @@ int split_huge_page_to_list(struct page *page, struct list_head *list)
 	struct pglist_data *pgdata = NODE_DATA(page_to_nid(head));
 	struct anon_vma *anon_vma = NULL;
 	struct address_space *mapping = NULL;
-	int count, mapcount, extra_pins, ret;
+	int extra_pins, ret;
 	bool mlocked;
 	unsigned long flags;
 	pgoff_t end;
@@ -2760,7 +2760,6 @@ int split_huge_page_to_list(struct page *page, struct list_head *list)
 
 	mlocked = PageMlocked(page);
 	unmap_page(head);
-	VM_BUG_ON_PAGE(compound_mapcount(head), head);
 
 	/* Make sure the page is not on per-CPU pagevec as it takes pin */
 	if (mlocked)
@@ -2786,9 +2785,7 @@ int split_huge_page_to_list(struct page *page, struct list_head *list)
 
 	/* Prevent deferred_split_scan() touching ->_refcount */
 	spin_lock(&pgdata->split_queue_lock);
-	count = page_count(head);
-	mapcount = total_mapcount(head);
-	if (!mapcount && page_ref_freeze(head, 1 + extra_pins)) {
+	if (page_ref_freeze(head, 1 + extra_pins)) {
 		if (!list_empty(page_deferred_list(head))) {
 			pgdata->split_queue_len--;
 			list_del(page_deferred_list(head));
@@ -2804,16 +2801,9 @@ int split_huge_page_to_list(struct page *page, struct list_head *list)
 		} else
 			ret = 0;
 	} else {
-		if (IS_ENABLED(CONFIG_DEBUG_VM) && mapcount) {
-			pr_alert("total_mapcount: %u, page_count(): %u\n",
-					mapcount, count);
-			if (PageTail(page))
-				dump_page(head, NULL);
-			dump_page(page, "total_mapcount(head) > 0");
-			BUG();
-		}
 		spin_unlock(&pgdata->split_queue_lock);
-fail:		if (mapping)
+fail:
+		if (mapping)
 			xa_unlock(&mapping->i_pages);
 		spin_unlock_irqrestore(zone_lru_lock(page_zone(head)), flags);
 		remap_page(head);

commit d5cd96a7880322692d64fbe75d321ccd39392537
Author: Hugh Dickins <hughd@google.com>
Date:   Tue Jun 15 18:24:03 2021 -0700

    mm/thp: unmap_mapping_page() to fix THP truncate_cleanup_page()
    
    [ Upstream commit 22061a1ffabdb9c3385de159c5db7aac3a4df1cc ]
    
    There is a race between THP unmapping and truncation, when truncate sees
    pmd_none() and skips the entry, after munmap's zap_huge_pmd() cleared
    it, but before its page_remove_rmap() gets to decrement
    compound_mapcount: generating false "BUG: Bad page cache" reports that
    the page is still mapped when deleted.  This commit fixes that, but not
    in the way I hoped.
    
    The first attempt used try_to_unmap(page, TTU_SYNC|TTU_IGNORE_MLOCK)
    instead of unmap_mapping_range() in truncate_cleanup_page(): it has
    often been an annoyance that we usually call unmap_mapping_range() with
    no pages locked, but there apply it to a single locked page.
    try_to_unmap() looks more suitable for a single locked page.
    
    However, try_to_unmap_one() contains a VM_BUG_ON_PAGE(!pvmw.pte,page):
    it is used to insert THP migration entries, but not used to unmap THPs.
    Copy zap_huge_pmd() and add THP handling now? Perhaps, but their TLB
    needs are different, I'm too ignorant of the DAX cases, and couldn't
    decide how far to go for anon+swap.  Set that aside.
    
    The second attempt took a different tack: make no change in truncate.c,
    but modify zap_huge_pmd() to insert an invalidated huge pmd instead of
    clearing it initially, then pmd_clear() between page_remove_rmap() and
    unlocking at the end.  Nice.  But powerpc blows that approach out of the
    water, with its serialize_against_pte_lookup(), and interesting pgtable
    usage.  It would need serious help to get working on powerpc (with a
    minor optimization issue on s390 too).  Set that aside.
    
    Just add an "if (page_mapped(page)) synchronize_rcu();" or other such
    delay, after unmapping in truncate_cleanup_page()? Perhaps, but though
    that's likely to reduce or eliminate the number of incidents, it would
    give less assurance of whether we had identified the problem correctly.
    
    This successful iteration introduces "unmap_mapping_page(page)" instead
    of try_to_unmap(), and goes the usual unmap_mapping_range_tree() route,
    with an addition to details.  Then zap_pmd_range() watches for this
    case, and does spin_unlock(pmd_lock) if so - just like
    page_vma_mapped_walk() now does in the PVMW_SYNC case.  Not pretty, but
    safe.
    
    Note that unmap_mapping_page() is doing a VM_BUG_ON(!PageLocked) to
    assert its interface; but currently that's only used to make sure that
    page->mapping is stable, and zap_pmd_range() doesn't care if the page is
    locked or not.  Along these lines, in invalidate_inode_pages2_range()
    move the initial unmap_mapping_range() out from under page lock, before
    then calling unmap_mapping_page() under page lock if still mapped.
    
    Link: https://lkml.kernel.org/r/a2a4a148-cdd8-942c-4ef8-51b77f643dbe@google.com
    Fixes: fc127da085c2 ("truncate: handle file thp")
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Reviewed-by: Yang Shi <shy828301@gmail.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Jue Wang <juew@google.com>
    Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>
    Cc: Miaohe Lin <linmiaohe@huawei.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Naoya Horiguchi <naoya.horiguchi@nec.com>
    Cc: Oscar Salvador <osalvador@suse.de>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Shakeel Butt <shakeelb@google.com>
    Cc: Wang Yugui <wangyugui@e16-tech.com>
    Cc: Zi Yan <ziy@nvidia.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    
    Note on stable backport: fixed up call to truncate_cleanup_page()
    in truncate_inode_pages_range().  Use hpage_nr_pages() in
    unmap_mapping_page().
    
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/mm.h b/include/linux/mm.h
index f6ecf41aea83..c736c677b876 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1338,6 +1338,7 @@ struct zap_details {
 	struct address_space *check_mapping;	/* Check page->mapping if set */
 	pgoff_t	first_index;			/* Lowest page->index to unmap */
 	pgoff_t last_index;			/* Highest page->index to unmap */
+	struct page *single_page;		/* Locked page to be unmapped */
 };
 
 struct page *_vm_normal_page(struct vm_area_struct *vma, unsigned long addr,
@@ -1428,6 +1429,7 @@ extern vm_fault_t handle_mm_fault(struct vm_area_struct *vma,
 extern int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm,
 			    unsigned long address, unsigned int fault_flags,
 			    bool *unlocked);
+void unmap_mapping_page(struct page *page);
 void unmap_mapping_pages(struct address_space *mapping,
 		pgoff_t start, pgoff_t nr, bool even_cows);
 void unmap_mapping_range(struct address_space *mapping,
@@ -1448,6 +1450,7 @@ static inline int fixup_user_fault(struct task_struct *tsk,
 	BUG();
 	return -EFAULT;
 }
+static inline void unmap_mapping_page(struct page *page) { }
 static inline void unmap_mapping_pages(struct address_space *mapping,
 		pgoff_t start, pgoff_t nr, bool even_cows) { }
 static inline void unmap_mapping_range(struct address_space *mapping,
diff --git a/mm/memory.c b/mm/memory.c
index c2011c51f15d..49b546cdce0d 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -1439,7 +1439,18 @@ static inline unsigned long zap_pmd_range(struct mmu_gather *tlb,
 			else if (zap_huge_pmd(tlb, vma, pmd, addr))
 				goto next;
 			/* fall through */
+		} else if (details && details->single_page &&
+			   PageTransCompound(details->single_page) &&
+			   next - addr == HPAGE_PMD_SIZE && pmd_none(*pmd)) {
+			spinlock_t *ptl = pmd_lock(tlb->mm, pmd);
+			/*
+			 * Take and drop THP pmd lock so that we cannot return
+			 * prematurely, while zap_huge_pmd() has cleared *pmd,
+			 * but not yet decremented compound_mapcount().
+			 */
+			spin_unlock(ptl);
 		}
+
 		/*
 		 * Here there can be other concurrent MADV_DONTNEED or
 		 * trans huge page faults running, and if the pmd is
@@ -2924,6 +2935,36 @@ static inline void unmap_mapping_range_tree(struct rb_root_cached *root,
 	}
 }
 
+/**
+ * unmap_mapping_page() - Unmap single page from processes.
+ * @page: The locked page to be unmapped.
+ *
+ * Unmap this page from any userspace process which still has it mmaped.
+ * Typically, for efficiency, the range of nearby pages has already been
+ * unmapped by unmap_mapping_pages() or unmap_mapping_range().  But once
+ * truncation or invalidation holds the lock on a page, it may find that
+ * the page has been remapped again: and then uses unmap_mapping_page()
+ * to unmap it finally.
+ */
+void unmap_mapping_page(struct page *page)
+{
+	struct address_space *mapping = page->mapping;
+	struct zap_details details = { };
+
+	VM_BUG_ON(!PageLocked(page));
+	VM_BUG_ON(PageTail(page));
+
+	details.check_mapping = mapping;
+	details.first_index = page->index;
+	details.last_index = page->index + hpage_nr_pages(page) - 1;
+	details.single_page = page;
+
+	i_mmap_lock_write(mapping);
+	if (unlikely(!RB_EMPTY_ROOT(&mapping->i_mmap.rb_root)))
+		unmap_mapping_range_tree(&mapping->i_mmap, &details);
+	i_mmap_unlock_write(mapping);
+}
+
 /**
  * unmap_mapping_pages() - Unmap pages from processes.
  * @mapping: The address space containing pages to be unmapped.
diff --git a/mm/truncate.c b/mm/truncate.c
index 71b65aab8077..43c73db17a0a 100644
--- a/mm/truncate.c
+++ b/mm/truncate.c
@@ -175,13 +175,10 @@ void do_invalidatepage(struct page *page, unsigned int offset,
  * its lock, b) when a concurrent invalidate_mapping_pages got there first and
  * c) when tmpfs swizzles a page between a tmpfs inode and swapper_space.
  */
-static void
-truncate_cleanup_page(struct address_space *mapping, struct page *page)
+static void truncate_cleanup_page(struct page *page)
 {
-	if (page_mapped(page)) {
-		pgoff_t nr = PageTransHuge(page) ? HPAGE_PMD_NR : 1;
-		unmap_mapping_pages(mapping, page->index, nr, false);
-	}
+	if (page_mapped(page))
+		unmap_mapping_page(page);
 
 	if (page_has_private(page))
 		do_invalidatepage(page, 0, PAGE_SIZE);
@@ -226,7 +223,7 @@ int truncate_inode_page(struct address_space *mapping, struct page *page)
 	if (page->mapping != mapping)
 		return -EIO;
 
-	truncate_cleanup_page(mapping, page);
+	truncate_cleanup_page(page);
 	delete_from_page_cache(page);
 	return 0;
 }
@@ -364,7 +361,7 @@ void truncate_inode_pages_range(struct address_space *mapping,
 			pagevec_add(&locked_pvec, page);
 		}
 		for (i = 0; i < pagevec_count(&locked_pvec); i++)
-			truncate_cleanup_page(mapping, locked_pvec.pages[i]);
+			truncate_cleanup_page(locked_pvec.pages[i]);
 		delete_from_page_cache_batch(mapping, &locked_pvec);
 		for (i = 0; i < pagevec_count(&locked_pvec); i++)
 			unlock_page(locked_pvec.pages[i]);
@@ -703,6 +700,16 @@ int invalidate_inode_pages2_range(struct address_space *mapping,
 				continue;
 			}
 
+			if (!did_range_unmap && page_mapped(page)) {
+				/*
+				 * If page is mapped, before taking its lock,
+				 * zap the rest of the file in one hit.
+				 */
+				unmap_mapping_pages(mapping, index,
+						(1 + end - index), false);
+				did_range_unmap = 1;
+			}
+
 			lock_page(page);
 			WARN_ON(page_to_index(page) != index);
 			if (page->mapping != mapping) {
@@ -710,23 +717,11 @@ int invalidate_inode_pages2_range(struct address_space *mapping,
 				continue;
 			}
 			wait_on_page_writeback(page);
-			if (page_mapped(page)) {
-				if (!did_range_unmap) {
-					/*
-					 * Zap the rest of the file in one hit.
-					 */
-					unmap_mapping_pages(mapping, index,
-						(1 + end - index), false);
-					did_range_unmap = 1;
-				} else {
-					/*
-					 * Just zap this page
-					 */
-					unmap_mapping_pages(mapping, index,
-								1, false);
-				}
-			}
+
+			if (page_mapped(page))
+				unmap_mapping_page(page);
 			BUG_ON(page_mapped(page));
+
 			ret2 = do_launder_page(mapping, page);
 			if (ret2 == 0) {
 				if (!invalidate_complete_page2(mapping, page))

commit 2c595b67fceda4a345ac4dcbd0caa2049fd17cb7
Author: Jue Wang <juew@google.com>
Date:   Tue Jun 15 18:24:00 2021 -0700

    mm/thp: fix page_address_in_vma() on file THP tails
    
    [ Upstream commit 31657170deaf1d8d2f6a1955fbc6fa9d228be036 ]
    
    Anon THP tails were already supported, but memory-failure may need to
    use page_address_in_vma() on file THP tails, which its page->mapping
    check did not permit: fix it.
    
    hughd adds: no current usage is known to hit the issue, but this does
    fix a subtle trap in a general helper: best fixed in stable sooner than
    later.
    
    Link: https://lkml.kernel.org/r/a0d9b53-bf5d-8bab-ac5-759dc61819c1@google.com
    Fixes: 800d8c63b2e9 ("shmem: add huge pages support")
    Signed-off-by: Jue Wang <juew@google.com>
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>
    Reviewed-by: Yang Shi <shy828301@gmail.com>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Miaohe Lin <linmiaohe@huawei.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Naoya Horiguchi <naoya.horiguchi@nec.com>
    Cc: Oscar Salvador <osalvador@suse.de>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Shakeel Butt <shakeelb@google.com>
    Cc: Wang Yugui <wangyugui@e16-tech.com>
    Cc: Zi Yan <ziy@nvidia.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/rmap.c b/mm/rmap.c
index ff56c460af53..699f445e3e78 100644
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -695,11 +695,11 @@ unsigned long page_address_in_vma(struct page *page, struct vm_area_struct *vma)
 		if (!vma->anon_vma || !page__anon_vma ||
 		    vma->anon_vma->root != page__anon_vma->root)
 			return -EFAULT;
-	} else if (page->mapping) {
-		if (!vma->vm_file || vma->vm_file->f_mapping != page->mapping)
-			return -EFAULT;
-	} else
+	} else if (!vma->vm_file) {
+		return -EFAULT;
+	} else if (vma->vm_file->f_mapping != compound_head(page)->mapping) {
 		return -EFAULT;
+	}
 
 	return vma_address(page, vma);
 }

commit f38722557339bd22a5f1e8bae013f81b69309e9a
Author: Hugh Dickins <hughd@google.com>
Date:   Tue Jun 15 18:23:56 2021 -0700

    mm/thp: fix vma_address() if virtual address below file offset
    
    [ Upstream commit 494334e43c16d63b878536a26505397fce6ff3a2 ]
    
    Running certain tests with a DEBUG_VM kernel would crash within hours,
    on the total_mapcount BUG() in split_huge_page_to_list(), while trying
    to free up some memory by punching a hole in a shmem huge page: split's
    try_to_unmap() was unable to find all the mappings of the page (which,
    on a !DEBUG_VM kernel, would then keep the huge page pinned in memory).
    
    When that BUG() was changed to a WARN(), it would later crash on the
    VM_BUG_ON_VMA(end < vma->vm_start || start >= vma->vm_end, vma) in
    mm/internal.h:vma_address(), used by rmap_walk_file() for
    try_to_unmap().
    
    vma_address() is usually correct, but there's a wraparound case when the
    vm_start address is unusually low, but vm_pgoff not so low:
    vma_address() chooses max(start, vma->vm_start), but that decides on the
    wrong address, because start has become almost ULONG_MAX.
    
    Rewrite vma_address() to be more careful about vm_pgoff; move the
    VM_BUG_ON_VMA() out of it, returning -EFAULT for errors, so that it can
    be safely used from page_mapped_in_vma() and page_address_in_vma() too.
    
    Add vma_address_end() to apply similar care to end address calculation,
    in page_vma_mapped_walk() and page_mkclean_one() and try_to_unmap_one();
    though it raises a question of whether callers would do better to supply
    pvmw->end to page_vma_mapped_walk() - I chose not, for a smaller patch.
    
    An irritation is that their apparent generality breaks down on KSM
    pages, which cannot be located by the page->index that page_to_pgoff()
    uses: as commit 4b0ece6fa016 ("mm: migrate: fix remove_migration_pte()
    for ksm pages") once discovered.  I dithered over the best thing to do
    about that, and have ended up with a VM_BUG_ON_PAGE(PageKsm) in both
    vma_address() and vma_address_end(); though the only place in danger of
    using it on them was try_to_unmap_one().
    
    Sidenote: vma_address() and vma_address_end() now use compound_nr() on a
    head page, instead of thp_size(): to make the right calculation on a
    hugetlbfs page, whether or not THPs are configured.  try_to_unmap() is
    used on hugetlbfs pages, but perhaps the wrong calculation never
    mattered.
    
    Link: https://lkml.kernel.org/r/caf1c1a3-7cfb-7f8f-1beb-ba816e932825@google.com
    Fixes: a8fa41ad2f6f ("mm, rmap: check all VMAs that PTE-mapped THP can be part of")
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Jue Wang <juew@google.com>
    Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>
    Cc: Miaohe Lin <linmiaohe@huawei.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Naoya Horiguchi <naoya.horiguchi@nec.com>
    Cc: Oscar Salvador <osalvador@suse.de>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Shakeel Butt <shakeelb@google.com>
    Cc: Wang Yugui <wangyugui@e16-tech.com>
    Cc: Yang Shi <shy828301@gmail.com>
    Cc: Zi Yan <ziy@nvidia.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    
    Note on stable backport: fixed up conflicts on intervening thp_size(),
    and mmu_notifier_range initializations; substitute for compound_nr().
    
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/internal.h b/mm/internal.h
index 397183c8fe47..3a2e973138d3 100644
--- a/mm/internal.h
+++ b/mm/internal.h
@@ -331,27 +331,52 @@ static inline void mlock_migrate_page(struct page *newpage, struct page *page)
 extern pmd_t maybe_pmd_mkwrite(pmd_t pmd, struct vm_area_struct *vma);
 
 /*
- * At what user virtual address is page expected in @vma?
+ * At what user virtual address is page expected in vma?
+ * Returns -EFAULT if all of the page is outside the range of vma.
+ * If page is a compound head, the entire compound page is considered.
  */
 static inline unsigned long
-__vma_address(struct page *page, struct vm_area_struct *vma)
+vma_address(struct page *page, struct vm_area_struct *vma)
 {
-	pgoff_t pgoff = page_to_pgoff(page);
-	return vma->vm_start + ((pgoff - vma->vm_pgoff) << PAGE_SHIFT);
+	pgoff_t pgoff;
+	unsigned long address;
+
+	VM_BUG_ON_PAGE(PageKsm(page), page);	/* KSM page->index unusable */
+	pgoff = page_to_pgoff(page);
+	if (pgoff >= vma->vm_pgoff) {
+		address = vma->vm_start +
+			((pgoff - vma->vm_pgoff) << PAGE_SHIFT);
+		/* Check for address beyond vma (or wrapped through 0?) */
+		if (address < vma->vm_start || address >= vma->vm_end)
+			address = -EFAULT;
+	} else if (PageHead(page) &&
+		   pgoff + (1UL << compound_order(page)) - 1 >= vma->vm_pgoff) {
+		/* Test above avoids possibility of wrap to 0 on 32-bit */
+		address = vma->vm_start;
+	} else {
+		address = -EFAULT;
+	}
+	return address;
 }
 
+/*
+ * Then at what user virtual address will none of the page be found in vma?
+ * Assumes that vma_address() already returned a good starting address.
+ * If page is a compound head, the entire compound page is considered.
+ */
 static inline unsigned long
-vma_address(struct page *page, struct vm_area_struct *vma)
+vma_address_end(struct page *page, struct vm_area_struct *vma)
 {
-	unsigned long start, end;
-
-	start = __vma_address(page, vma);
-	end = start + PAGE_SIZE * (hpage_nr_pages(page) - 1);
-
-	/* page should be within @vma mapping range */
-	VM_BUG_ON_VMA(end < vma->vm_start || start >= vma->vm_end, vma);
-
-	return max(start, vma->vm_start);
+	pgoff_t pgoff;
+	unsigned long address;
+
+	VM_BUG_ON_PAGE(PageKsm(page), page);	/* KSM page->index unusable */
+	pgoff = page_to_pgoff(page) + (1UL << compound_order(page));
+	address = vma->vm_start + ((pgoff - vma->vm_pgoff) << PAGE_SHIFT);
+	/* Check for address beyond vma (or wrapped through 0?) */
+	if (address < vma->vm_start || address > vma->vm_end)
+		address = vma->vm_end;
+	return address;
 }
 
 #else /* !CONFIG_MMU */
diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c
index 08e283ad4660..bb7488e86bea 100644
--- a/mm/page_vma_mapped.c
+++ b/mm/page_vma_mapped.c
@@ -224,18 +224,18 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
 	if (!map_pte(pvmw))
 		goto next_pte;
 	while (1) {
+		unsigned long end;
+
 		if (check_pte(pvmw))
 			return true;
 next_pte:
 		/* Seek to next pte only makes sense for THP */
 		if (!PageTransHuge(pvmw->page) || PageHuge(pvmw->page))
 			return not_found(pvmw);
+		end = vma_address_end(pvmw->page, pvmw->vma);
 		do {
 			pvmw->address += PAGE_SIZE;
-			if (pvmw->address >= pvmw->vma->vm_end ||
-			    pvmw->address >=
-					__vma_address(pvmw->page, pvmw->vma) +
-					hpage_nr_pages(pvmw->page) * PAGE_SIZE)
+			if (pvmw->address >= end)
 				return not_found(pvmw);
 			/* Did we cross page table boundary? */
 			if (pvmw->address % PMD_SIZE == 0) {
@@ -273,14 +273,10 @@ int page_mapped_in_vma(struct page *page, struct vm_area_struct *vma)
 		.vma = vma,
 		.flags = PVMW_SYNC,
 	};
-	unsigned long start, end;
-
-	start = __vma_address(page, vma);
-	end = start + PAGE_SIZE * (hpage_nr_pages(page) - 1);
 
-	if (unlikely(end < vma->vm_start || start >= vma->vm_end))
+	pvmw.address = vma_address(page, vma);
+	if (pvmw.address == -EFAULT)
 		return 0;
-	pvmw.address = max(start, vma->vm_start);
 	if (!page_vma_mapped_walk(&pvmw))
 		return 0;
 	page_vma_mapped_walk_done(&pvmw);
diff --git a/mm/rmap.c b/mm/rmap.c
index 5df055654e63..ff56c460af53 100644
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -686,7 +686,6 @@ static bool should_defer_flush(struct mm_struct *mm, enum ttu_flags flags)
  */
 unsigned long page_address_in_vma(struct page *page, struct vm_area_struct *vma)
 {
-	unsigned long address;
 	if (PageAnon(page)) {
 		struct anon_vma *page__anon_vma = page_anon_vma(page);
 		/*
@@ -701,10 +700,8 @@ unsigned long page_address_in_vma(struct page *page, struct vm_area_struct *vma)
 			return -EFAULT;
 	} else
 		return -EFAULT;
-	address = __vma_address(page, vma);
-	if (unlikely(address < vma->vm_start || address >= vma->vm_end))
-		return -EFAULT;
-	return address;
+
+	return vma_address(page, vma);
 }
 
 pmd_t *mm_find_pmd(struct mm_struct *mm, unsigned long address)
@@ -896,7 +893,7 @@ static bool page_mkclean_one(struct page *page, struct vm_area_struct *vma,
 	 * We have to assume the worse case ie pmd for invalidation. Note that
 	 * the page can not be free from this function.
 	 */
-	end = min(vma->vm_end, start + (PAGE_SIZE << compound_order(page)));
+	end = vma_address_end(page, vma);
 	mmu_notifier_invalidate_range_start(vma->vm_mm, start, end);
 
 	while (page_vma_mapped_walk(&pvmw)) {
@@ -1378,7 +1375,8 @@ static bool try_to_unmap_one(struct page *page, struct vm_area_struct *vma,
 	 * Note that the page can not be free in this function as call of
 	 * try_to_unmap() must hold a reference on the page.
 	 */
-	end = min(vma->vm_end, start + (PAGE_SIZE << compound_order(page)));
+	end = PageKsm(page) ?
+			address + PAGE_SIZE : vma_address_end(page, vma);
 	if (PageHuge(page)) {
 		/*
 		 * If sharing is possible, start and end will be adjusted
@@ -1835,6 +1833,7 @@ static void rmap_walk_anon(struct page *page, struct rmap_walk_control *rwc,
 		struct vm_area_struct *vma = avc->vma;
 		unsigned long address = vma_address(page, vma);
 
+		VM_BUG_ON_VMA(address == -EFAULT, vma);
 		cond_resched();
 
 		if (rwc->invalid_vma && rwc->invalid_vma(vma, rwc->arg))
@@ -1889,6 +1888,7 @@ static void rmap_walk_file(struct page *page, struct rmap_walk_control *rwc,
 			pgoff_start, pgoff_end) {
 		unsigned long address = vma_address(page, vma);
 
+		VM_BUG_ON_VMA(address == -EFAULT, vma);
 		cond_resched();
 
 		if (rwc->invalid_vma && rwc->invalid_vma(vma, rwc->arg))

commit 205899d6be9a1d5494318920a211852a32886e46
Author: Hugh Dickins <hughd@google.com>
Date:   Tue Jun 15 18:23:53 2021 -0700

    mm/thp: try_to_unmap() use TTU_SYNC for safe splitting
    
    [ Upstream commit 732ed55823fc3ad998d43b86bf771887bcc5ec67 ]
    
    Stressing huge tmpfs often crashed on unmap_page()'s VM_BUG_ON_PAGE
    (!unmap_success): with dump_page() showing mapcount:1, but then its raw
    struct page output showing _mapcount ffffffff i.e.  mapcount 0.
    
    And even if that particular VM_BUG_ON_PAGE(!unmap_success) is removed,
    it is immediately followed by a VM_BUG_ON_PAGE(compound_mapcount(head)),
    and further down an IS_ENABLED(CONFIG_DEBUG_VM) total_mapcount BUG():
    all indicative of some mapcount difficulty in development here perhaps.
    But the !CONFIG_DEBUG_VM path handles the failures correctly and
    silently.
    
    I believe the problem is that once a racing unmap has cleared pte or
    pmd, try_to_unmap_one() may skip taking the page table lock, and emerge
    from try_to_unmap() before the racing task has reached decrementing
    mapcount.
    
    Instead of abandoning the unsafe VM_BUG_ON_PAGE(), and the ones that
    follow, use PVMW_SYNC in try_to_unmap_one() in this case: adding
    TTU_SYNC to the options, and passing that from unmap_page().
    
    When CONFIG_DEBUG_VM, or for non-debug too? Consensus is to do the same
    for both: the slight overhead added should rarely matter, except perhaps
    if splitting sparsely-populated multiply-mapped shmem.  Once confident
    that bugs are fixed, TTU_SYNC here can be removed, and the race
    tolerated.
    
    Link: https://lkml.kernel.org/r/c1e95853-8bcd-d8fd-55fa-e7f2488e78f@google.com
    Fixes: fec89c109f3a ("thp: rewrite freeze_page()/unfreeze_page() with generic rmap walkers")
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Jue Wang <juew@google.com>
    Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>
    Cc: Miaohe Lin <linmiaohe@huawei.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Naoya Horiguchi <naoya.horiguchi@nec.com>
    Cc: Oscar Salvador <osalvador@suse.de>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Shakeel Butt <shakeelb@google.com>
    Cc: Wang Yugui <wangyugui@e16-tech.com>
    Cc: Yang Shi <shy828301@gmail.com>
    Cc: Zi Yan <ziy@nvidia.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    
    Note on stable backport: upstream TTU_SYNC 0x10 takes the value which
    5.11 commit 013339df116c ("mm/rmap: always do TTU_IGNORE_ACCESS") freed.
    It is very tempting to backport that commit (as 5.10 already did) and
    make no change here; but on reflection, good as that commit is, I'm
    reluctant to include any possible side-effect of it in this series.
    
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/rmap.h b/include/linux/rmap.h
index d7d6d4eb1794..91ccae946716 100644
--- a/include/linux/rmap.h
+++ b/include/linux/rmap.h
@@ -98,7 +98,8 @@ enum ttu_flags {
 					 * do a final flush if necessary */
 	TTU_RMAP_LOCKED		= 0x80,	/* do not grab rmap lock:
 					 * caller holds it */
-	TTU_SPLIT_FREEZE	= 0x100,		/* freeze pte under splitting thp */
+	TTU_SPLIT_FREEZE	= 0x100, /* freeze pte under splitting thp */
+	TTU_SYNC		= 0x200, /* avoid racy checks with PVMW_SYNC */
 };
 
 #ifdef CONFIG_MMU
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 82ed62775c00..78c1ad5f8109 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -2430,7 +2430,7 @@ void vma_adjust_trans_huge(struct vm_area_struct *vma,
 static void unmap_page(struct page *page)
 {
 	enum ttu_flags ttu_flags = TTU_IGNORE_MLOCK | TTU_IGNORE_ACCESS |
-		TTU_RMAP_LOCKED | TTU_SPLIT_HUGE_PMD;
+		TTU_RMAP_LOCKED | TTU_SPLIT_HUGE_PMD | TTU_SYNC;
 	bool unmap_success;
 
 	VM_BUG_ON_PAGE(!PageHead(page), page);
diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c
index 11df03e71288..08e283ad4660 100644
--- a/mm/page_vma_mapped.c
+++ b/mm/page_vma_mapped.c
@@ -208,6 +208,17 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
 			pvmw->ptl = NULL;
 		}
 	} else if (!pmd_present(pmde)) {
+		/*
+		 * If PVMW_SYNC, take and drop THP pmd lock so that we
+		 * cannot return prematurely, while zap_huge_pmd() has
+		 * cleared *pmd but not decremented compound_mapcount().
+		 */
+		if ((pvmw->flags & PVMW_SYNC) &&
+		    PageTransCompound(pvmw->page)) {
+			spinlock_t *ptl = pmd_lock(mm, pvmw->pmd);
+
+			spin_unlock(ptl);
+		}
 		return false;
 	}
 	if (!map_pte(pvmw))
diff --git a/mm/rmap.c b/mm/rmap.c
index 70872d5b203c..5df055654e63 100644
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -1348,6 +1348,15 @@ static bool try_to_unmap_one(struct page *page, struct vm_area_struct *vma,
 	unsigned long start = address, end;
 	enum ttu_flags flags = (enum ttu_flags)arg;
 
+	/*
+	 * When racing against e.g. zap_pte_range() on another cpu,
+	 * in between its ptep_get_and_clear_full() and page_remove_rmap(),
+	 * try_to_unmap() may return false when it is about to become true,
+	 * if page table locking is skipped: use TTU_SYNC to wait for that.
+	 */
+	if (flags & TTU_SYNC)
+		pvmw.flags = PVMW_SYNC;
+
 	/* munlock has nothing to gain from examining un-locked vmas */
 	if ((flags & TTU_MUNLOCK) && !(vma->vm_flags & VM_LOCKED))
 		return true;
@@ -1723,7 +1732,13 @@ bool try_to_unmap(struct page *page, enum ttu_flags flags)
 	else
 		rmap_walk(page, &rwc);
 
-	return !page_mapcount(page) ? true : false;
+	/*
+	 * When racing against e.g. zap_pte_range() on another cpu,
+	 * in between its ptep_get_and_clear_full() and page_remove_rmap(),
+	 * try_to_unmap() may return false when it is about to become true,
+	 * if page table locking is skipped: use TTU_SYNC to wait for that.
+	 */
+	return !page_mapcount(page);
 }
 
 /**

commit fc1fbc5b017b6f5ef24a4a93f33cd022225e01c8
Author: Hugh Dickins <hughd@google.com>
Date:   Tue Jun 15 18:23:49 2021 -0700

    mm/thp: make is_huge_zero_pmd() safe and quicker
    
    [ Upstream commit 3b77e8c8cde581dadab9a0f1543a347e24315f11 ]
    
    Most callers of is_huge_zero_pmd() supply a pmd already verified
    present; but a few (notably zap_huge_pmd()) do not - it might be a pmd
    migration entry, in which the pfn is encoded differently from a present
    pmd: which might pass the is_huge_zero_pmd() test (though not on x86,
    since L1TF forced us to protect against that); or perhaps even crash in
    pmd_page() applied to a swap-like entry.
    
    Make it safe by adding pmd_present() check into is_huge_zero_pmd()
    itself; and make it quicker by saving huge_zero_pfn, so that
    is_huge_zero_pmd() will not need to do that pmd_page() lookup each time.
    
    __split_huge_pmd_locked() checked pmd_trans_huge() before: that worked,
    but is unnecessary now that is_huge_zero_pmd() checks present.
    
    Link: https://lkml.kernel.org/r/21ea9ca-a1f5-8b90-5e88-95fb1c49bbfa@google.com
    Fixes: e71769ae5260 ("mm: enable thp migration for shmem thp")
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Reviewed-by: Yang Shi <shy828301@gmail.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Jue Wang <juew@google.com>
    Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>
    Cc: Miaohe Lin <linmiaohe@huawei.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Naoya Horiguchi <naoya.horiguchi@nec.com>
    Cc: Oscar Salvador <osalvador@suse.de>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Shakeel Butt <shakeelb@google.com>
    Cc: Wang Yugui <wangyugui@e16-tech.com>
    Cc: Zi Yan <ziy@nvidia.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h
index e375f2249f52..becf9b1eae5a 100644
--- a/include/linux/huge_mm.h
+++ b/include/linux/huge_mm.h
@@ -224,6 +224,7 @@ struct page *follow_devmap_pud(struct vm_area_struct *vma, unsigned long addr,
 extern vm_fault_t do_huge_pmd_numa_page(struct vm_fault *vmf, pmd_t orig_pmd);
 
 extern struct page *huge_zero_page;
+extern unsigned long huge_zero_pfn;
 
 static inline bool is_huge_zero_page(struct page *page)
 {
@@ -232,7 +233,7 @@ static inline bool is_huge_zero_page(struct page *page)
 
 static inline bool is_huge_zero_pmd(pmd_t pmd)
 {
-	return is_huge_zero_page(pmd_page(pmd));
+	return READ_ONCE(huge_zero_pfn) == pmd_pfn(pmd) && pmd_present(pmd);
 }
 
 static inline bool is_huge_zero_pud(pud_t pud)
@@ -342,6 +343,11 @@ static inline bool is_huge_zero_page(struct page *page)
 	return false;
 }
 
+static inline bool is_huge_zero_pmd(pmd_t pmd)
+{
+	return false;
+}
+
 static inline bool is_huge_zero_pud(pud_t pud)
 {
 	return false;
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index ce6ca09840bd..82ed62775c00 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -62,6 +62,7 @@ static struct shrinker deferred_split_shrinker;
 
 static atomic_t huge_zero_refcount;
 struct page *huge_zero_page __read_mostly;
+unsigned long huge_zero_pfn __read_mostly = ~0UL;
 
 bool transparent_hugepage_enabled(struct vm_area_struct *vma)
 {
@@ -93,6 +94,7 @@ static struct page *get_huge_zero_page(void)
 		__free_pages(zero_page, compound_order(zero_page));
 		goto retry;
 	}
+	WRITE_ONCE(huge_zero_pfn, page_to_pfn(zero_page));
 
 	/* We take additional reference here. It will be put back by shrinker */
 	atomic_set(&huge_zero_refcount, 2);
@@ -142,6 +144,7 @@ static unsigned long shrink_huge_zero_page_scan(struct shrinker *shrink,
 	if (atomic_cmpxchg(&huge_zero_refcount, 1, 0) == 1) {
 		struct page *zero_page = xchg(&huge_zero_page, NULL);
 		BUG_ON(zero_page == NULL);
+		WRITE_ONCE(huge_zero_pfn, ~0UL);
 		__free_pages(zero_page, compound_order(zero_page));
 		return HPAGE_PMD_NR;
 	}
@@ -2152,7 +2155,7 @@ static void __split_huge_pmd_locked(struct vm_area_struct *vma, pmd_t *pmd,
 		return;
 	}
 
-	if (pmd_trans_huge(*pmd) && is_huge_zero_pmd(*pmd)) {
+	if (is_huge_zero_pmd(*pmd)) {
 		/*
 		 * FIXME: Do we want to invalidate secondary mmu by calling
 		 * mmu_notifier_invalidate_range() see comments below inside

commit 629ee482e0966c23ddc1abeebf71aa84ff8d3673
Author: Hugh Dickins <hughd@google.com>
Date:   Tue Jun 15 18:23:45 2021 -0700

    mm/thp: fix __split_huge_pmd_locked() on shmem migration entry
    
    [ Upstream commit 99fa8a48203d62b3743d866fc48ef6abaee682be ]
    
    Patch series "mm/thp: fix THP splitting unmap BUGs and related", v10.
    
    Here is v2 batch of long-standing THP bug fixes that I had not got
    around to sending before, but prompted now by Wang Yugui's report
    https://lore.kernel.org/linux-mm/20210412180659.B9E3.409509F4@e16-tech.com/
    
    Wang Yugui has tested a rollup of these fixes applied to 5.10.39, and
    they have done no harm, but have *not* fixed that issue: something more
    is needed and I have no idea of what.
    
    This patch (of 7):
    
    Stressing huge tmpfs page migration racing hole punch often crashed on
    the VM_BUG_ON(!pmd_present) in pmdp_huge_clear_flush(), with DEBUG_VM=y
    kernel; or shortly afterwards, on a bad dereference in
    __split_huge_pmd_locked() when DEBUG_VM=n.  They forgot to allow for pmd
    migration entries in the non-anonymous case.
    
    Full disclosure: those particular experiments were on a kernel with more
    relaxed mmap_lock and i_mmap_rwsem locking, and were not repeated on the
    vanilla kernel: it is conceivable that stricter locking happens to avoid
    those cases, or makes them less likely; but __split_huge_pmd_locked()
    already allowed for pmd migration entries when handling anonymous THPs,
    so this commit brings the shmem and file THP handling into line.
    
    And while there: use old_pmd rather than _pmd, as in the following
    blocks; and make it clearer to the eye that the !vma_is_anonymous()
    block is self-contained, making an early return after accounting for
    unmapping.
    
    Link: https://lkml.kernel.org/r/af88612-1473-2eaa-903-8d1a448b26@google.com
    Link: https://lkml.kernel.org/r/dd221a99-efb3-cd1d-6256-7e646af29314@google.com
    Fixes: e71769ae5260 ("mm: enable thp migration for shmem thp")
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Yang Shi <shy828301@gmail.com>
    Cc: Wang Yugui <wangyugui@e16-tech.com>
    Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>
    Cc: Naoya Horiguchi <naoya.horiguchi@nec.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Zi Yan <ziy@nvidia.com>
    Cc: Miaohe Lin <linmiaohe@huawei.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Jue Wang <juew@google.com>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Shakeel Butt <shakeelb@google.com>
    Cc: Oscar Salvador <osalvador@suse.de>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    
    Note on stable backport: this commit made intervening cleanups in
    pmdp_huge_clear_flush() redundant: here it's rediffed to skip them.
    
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 7c374c0fcf0c..ce6ca09840bd 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -2125,7 +2125,7 @@ static void __split_huge_pmd_locked(struct vm_area_struct *vma, pmd_t *pmd,
 	count_vm_event(THP_SPLIT_PMD);
 
 	if (!vma_is_anonymous(vma)) {
-		_pmd = pmdp_huge_clear_flush_notify(vma, haddr, pmd);
+		old_pmd = pmdp_huge_clear_flush_notify(vma, haddr, pmd);
 		/*
 		 * We are going to unmap this huge page. So
 		 * just go ahead and zap it
@@ -2134,16 +2134,25 @@ static void __split_huge_pmd_locked(struct vm_area_struct *vma, pmd_t *pmd,
 			zap_deposited_table(mm, pmd);
 		if (vma_is_dax(vma))
 			return;
-		page = pmd_page(_pmd);
-		if (!PageDirty(page) && pmd_dirty(_pmd))
-			set_page_dirty(page);
-		if (!PageReferenced(page) && pmd_young(_pmd))
-			SetPageReferenced(page);
-		page_remove_rmap(page, true);
-		put_page(page);
+		if (unlikely(is_pmd_migration_entry(old_pmd))) {
+			swp_entry_t entry;
+
+			entry = pmd_to_swp_entry(old_pmd);
+			page = migration_entry_to_page(entry);
+		} else {
+			page = pmd_page(old_pmd);
+			if (!PageDirty(page) && pmd_dirty(old_pmd))
+				set_page_dirty(page);
+			if (!PageReferenced(page) && pmd_young(old_pmd))
+				SetPageReferenced(page);
+			page_remove_rmap(page, true);
+			put_page(page);
+		}
 		add_mm_counter(mm, mm_counter_file(page), -HPAGE_PMD_NR);
 		return;
-	} else if (pmd_trans_huge(*pmd) && is_huge_zero_pmd(*pmd)) {
+	}
+
+	if (pmd_trans_huge(*pmd) && is_huge_zero_pmd(*pmd)) {
 		/*
 		 * FIXME: Do we want to invalidate secondary mmu by calling
 		 * mmu_notifier_invalidate_range() see comments below inside
diff --git a/mm/pgtable-generic.c b/mm/pgtable-generic.c
index cf2af04b34b9..36770fcdc358 100644
--- a/mm/pgtable-generic.c
+++ b/mm/pgtable-generic.c
@@ -125,8 +125,8 @@ pmd_t pmdp_huge_clear_flush(struct vm_area_struct *vma, unsigned long address,
 {
 	pmd_t pmd;
 	VM_BUG_ON(address & ~HPAGE_PMD_MASK);
-	VM_BUG_ON((pmd_present(*pmdp) && !pmd_trans_huge(*pmdp) &&
-			   !pmd_devmap(*pmdp)) || !pmd_present(*pmdp));
+	VM_BUG_ON(pmd_present(*pmdp) && !pmd_trans_huge(*pmdp) &&
+			   !pmd_devmap(*pmdp));
 	pmd = pmdp_huge_get_and_clear(vma->vm_mm, address, pmdp);
 	flush_pmd_tlb_range(vma, address, address + HPAGE_PMD_SIZE);
 	return pmd;

commit 420afb489a1f6981cbe2fb9ee10007dba878e223
Author: Miaohe Lin <linmiaohe@huawei.com>
Date:   Thu Feb 25 17:18:03 2021 -0800

    mm/rmap: use page_not_mapped in try_to_unmap()
    
    [ Upstream commit b7e188ec98b1644ff70a6d3624ea16aadc39f5e0 ]
    
    page_mapcount_is_zero() calculates accurately how many mappings a hugepage
    has in order to check against 0 only.  This is a waste of cpu time.  We
    can do this via page_not_mapped() to save some possible atomic_read
    cycles.  Remove the function page_mapcount_is_zero() as it's not used
    anymore and move page_not_mapped() above try_to_unmap() to avoid
    identifier undeclared compilation error.
    
    Link: https://lkml.kernel.org/r/20210130084904.35307-1-linmiaohe@huawei.com
    Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/rmap.c b/mm/rmap.c
index 69ce68616cbf..70872d5b203c 100644
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -1682,9 +1682,9 @@ static bool invalid_migration_vma(struct vm_area_struct *vma, void *arg)
 	return is_vma_temporary_stack(vma);
 }
 
-static int page_mapcount_is_zero(struct page *page)
+static int page_not_mapped(struct page *page)
 {
-	return !total_mapcount(page);
+	return !page_mapped(page);
 }
 
 /**
@@ -1702,7 +1702,7 @@ bool try_to_unmap(struct page *page, enum ttu_flags flags)
 	struct rmap_walk_control rwc = {
 		.rmap_one = try_to_unmap_one,
 		.arg = (void *)flags,
-		.done = page_mapcount_is_zero,
+		.done = page_not_mapped,
 		.anon_lock = page_lock_anon_vma_read,
 	};
 
@@ -1726,11 +1726,6 @@ bool try_to_unmap(struct page *page, enum ttu_flags flags)
 	return !page_mapcount(page) ? true : false;
 }
 
-static int page_not_mapped(struct page *page)
-{
-	return !page_mapped(page);
-}
-
 /**
  * try_to_munlock - try to munlock a page
  * @page: the page to be munlocked

commit 784445344c9e7cdef2a2a724fab34243933a91dc
Author: Miaohe Lin <linmiaohe@huawei.com>
Date:   Thu Feb 25 17:17:56 2021 -0800

    mm/rmap: remove unneeded semicolon in page_not_mapped()
    
    [ Upstream commit e0af87ff7afcde2660be44302836d2d5618185af ]
    
    Remove extra semicolon without any functional change intended.
    
    Link: https://lkml.kernel.org/r/20210127093425.39640-1-linmiaohe@huawei.com
    Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/rmap.c b/mm/rmap.c
index 1bd94ea62f7f..69ce68616cbf 100644
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -1729,7 +1729,7 @@ bool try_to_unmap(struct page *page, enum ttu_flags flags)
 static int page_not_mapped(struct page *page)
 {
 	return !page_mapped(page);
-};
+}
 
 /**
  * try_to_munlock - try to munlock a page

commit 131cb7a08c767e2d082ff5de6d384d8d935fb6f1
Author: Alex Shi <alex.shi@linux.alibaba.com>
Date:   Fri Dec 18 14:01:31 2020 -0800

    mm: add VM_WARN_ON_ONCE_PAGE() macro
    
    [ Upstream commit a4055888629bc0467d12d912cd7c90acdf3d9b12 part ]
    
    Add VM_WARN_ON_ONCE_PAGE() macro.
    
    Link: https://lkml.kernel.org/r/1604283436-18880-3-git-send-email-alex.shi@linux.alibaba.com
    Signed-off-by: Alex Shi <alex.shi@linux.alibaba.com>
    Acked-by: Michal Hocko <mhocko@suse.com>
    Acked-by: Hugh Dickins <hughd@google.com>
    Acked-by: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Vladimir Davydov <vdavydov.dev@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    
    Note on stable backport: original commit was titled
    mm/memcg: warning on !memcg after readahead page charged
    which included uses of this macro in mm/memcontrol.c: here omitted.
    
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/mmdebug.h b/include/linux/mmdebug.h
index 2ad72d2c8cc5..5d0767cb424a 100644
--- a/include/linux/mmdebug.h
+++ b/include/linux/mmdebug.h
@@ -37,6 +37,18 @@ void dump_mm(const struct mm_struct *mm);
 			BUG();						\
 		}							\
 	} while (0)
+#define VM_WARN_ON_ONCE_PAGE(cond, page)	({			\
+	static bool __section(".data.once") __warned;			\
+	int __ret_warn_once = !!(cond);					\
+									\
+	if (unlikely(__ret_warn_once && !__warned)) {			\
+		dump_page(page, "VM_WARN_ON_ONCE_PAGE(" __stringify(cond)")");\
+		__warned = true;					\
+		WARN_ON(1);						\
+	}								\
+	unlikely(__ret_warn_once);					\
+})
+
 #define VM_WARN_ON(cond) (void)WARN_ON(cond)
 #define VM_WARN_ON_ONCE(cond) (void)WARN_ON_ONCE(cond)
 #define VM_WARN_ONCE(cond, format...) (void)WARN_ONCE(cond, format)
@@ -48,6 +60,7 @@ void dump_mm(const struct mm_struct *mm);
 #define VM_BUG_ON_MM(cond, mm) VM_BUG_ON(cond)
 #define VM_WARN_ON(cond) BUILD_BUG_ON_INVALID(cond)
 #define VM_WARN_ON_ONCE(cond) BUILD_BUG_ON_INVALID(cond)
+#define VM_WARN_ON_ONCE_PAGE(cond, page)  BUILD_BUG_ON_INVALID(cond)
 #define VM_WARN_ONCE(cond, format...) BUILD_BUG_ON_INVALID(cond)
 #define VM_WARN(cond, format...) BUILD_BUG_ON_INVALID(cond)
 #endif

commit b9ccd4db492bb5505b4356d01c23bf4dbc462c0d
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Fri Jul 9 15:15:38 2021 +0800

    drm/rockchip: ebc_dev: release version v2.05
    
    1.full/a2/du/du4: check part also
    2.auto mode use full gc16 waveform to reduce ghosting
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: I3a2156ccecc5d630b1adb2425d647fb8efb090be

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index e66fcdd41463..79bf73229def 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -530,15 +530,15 @@ get_auto_image:
 	.type	ebc_open, %function
 ebc_open:
 .LFB2832:
-	.loc 1 1710 0
+	.loc 1 1711 0
 	.cfi_startproc
 .LVL32:
-	.loc 1 1714 0
+	.loc 1 1715 0
 	mov	w0, 0
 .LVL33:
-	.loc 1 1711 0
+	.loc 1 1712 0
 	str	xzr, [x1, 104]
-	.loc 1 1714 0
+	.loc 1 1715 0
 	ret
 	.cfi_endproc
 .LFE2832:
@@ -548,22 +548,22 @@ ebc_open:
 	.type	ebc_exit, %function
 ebc_exit:
 .LFB2851:
-	.loc 1 2257 0
+	.loc 1 2258 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2258 0
+	.loc 1 2259 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2257 0
+	.loc 1 2258 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2258 0
+	.loc 1 2259 0
 	bl	platform_driver_unregister
 .LVL34:
-	.loc 1 2259 0
+	.loc 1 2260 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -578,7 +578,7 @@ ebc_exit:
 	.type	ebc_resume, %function
 ebc_resume:
 .LFB2849:
-	.loc 1 2219 0
+	.loc 1 2220 0
 	.cfi_startproc
 .LVL35:
 	stp	x29, x30, [sp, -32]!
@@ -596,7 +596,7 @@ ebc_resume:
 	ldr	x19, [x0, 184]
 .LBE927:
 .LBE926:
-	.loc 1 2223 0
+	.loc 1 2224 0
 	ldr	x1, [x19, 16]
 .LBB928:
 .LBB929:
@@ -609,15 +609,15 @@ ebc_resume:
 .LVL37:
 .LBE929:
 .LBE928:
-	.loc 1 2224 0
-	str	wzr, [x19, 780]
 	.loc 1 2225 0
+	str	wzr, [x19, 780]
+	.loc 1 2226 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
 .LVL38:
-	.loc 1 2228 0
+	.loc 1 2229 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -634,20 +634,20 @@ ebc_resume:
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
 .LFB2827:
-	.loc 1 1409 0
+	.loc 1 1410 0
 	.cfi_startproc
 .LVL39:
-	.loc 1 1410 0
+	.loc 1 1411 0
 	adrp	x0, .LANCHOR0
 .LVL40:
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1412 0
+	.loc 1 1413 0
 	ldr	w2, [x0, 608]
 	cbnz	w2, .L80
 	ret
 	.p2align 3
 .L80:
-	.loc 1 1409 0
+	.loc 1 1410 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -659,10 +659,10 @@ ebc_vdd_power_timeout:
 	add	x0, x0, 400
 .LBE931:
 .LBE930:
-	.loc 1 1409 0
+	.loc 1 1410 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1413 0
+	.loc 1 1414 0
 	str	wzr, [x0, 208]
 .LBB933:
 .LBB932:
@@ -671,7 +671,7 @@ ebc_vdd_power_timeout:
 .LVL41:
 .LBE932:
 .LBE933:
-	.loc 1 1418 0
+	.loc 1 1419 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -685,27 +685,27 @@ ebc_vdd_power_timeout:
 	.type	ebc_remove, %function
 ebc_remove:
 .LFB2847:
-	.loc 1 2195 0
+	.loc 1 2196 0
 	.cfi_startproc
 .LVL42:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2196 0
+	.loc 1 2197 0
 	adrp	x0, .LANCHOR1
 .LVL43:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2195 0
+	.loc 1 2196 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2196 0
+	.loc 1 2197 0
 	add	x0, x0, 224
-	.loc 1 2195 0
 	.loc 1 2196 0
+	.loc 1 2197 0
 	bl	misc_deregister
 .LVL44:
-	.loc 1 2199 0
+	.loc 1 2200 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -720,7 +720,7 @@ ebc_remove:
 	.type	ebc_mmap, %function
 ebc_mmap:
 .LFB2831:
-	.loc 1 1695 0
+	.loc 1 1696 0
 	.cfi_startproc
 .LVL45:
 	stp	x29, x30, [sp, -32]!
@@ -731,33 +731,33 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1695 0
+	.loc 1 1696 0
 	mov	x19, x1
-	.loc 1 1698 0
+	.loc 1 1699 0
 	bl	ebc_phy_buf_base_get
 .LVL46:
-	.loc 1 1701 0
+	.loc 1 1702 0
 	lsr	x2, x0, 12
-	.loc 1 1699 0
+	.loc 1 1700 0
 	mov	x6, 16384
-	.loc 1 1701 0
+	.loc 1 1702 0
 	mov	x0, x19
-	.loc 1 1699 0
+	.loc 1 1700 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 1701 0
+	.loc 1 1702 0
 	ldp	x1, x3, [x19]
-	.loc 1 1699 0
+	.loc 1 1700 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 1701 0
+	.loc 1 1702 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
 .LVL47:
-	.loc 1 1704 0
+	.loc 1 1705 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 1707 0
+	.loc 1 1708 0
 	ldr	x19, [sp, 16]
 .LVL48:
 	csel	w0, w0, w1, eq
@@ -775,16 +775,16 @@ ebc_mmap:
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
 .LFB2830:
-	.loc 1 1494 0
+	.loc 1 1495 0
 	.cfi_startproc
 .LVL49:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 1504 0
+	.loc 1 1505 0
 	cmp	w1, 28672
-	.loc 1 1494 0
+	.loc 1 1495 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -798,15 +798,15 @@ ebc_io_ctl:
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
 	.cfi_offset 23, -112
-	.loc 1 1494 0
+	.loc 1 1495 0
 	mov	x21, x2
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 1496 0
+	.loc 1 1497 0
 	adrp	x0, .LANCHOR0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1504 0
+	.loc 1 1505 0
 	bcc	.L88
 	mov	w0, 28675
 	cmp	w1, w0
@@ -816,7 +816,7 @@ ebc_io_ctl:
 	cmp	w0, 1
 	bls	.L89
 .L88:
-	.loc 1 1520 0
+	.loc 1 1521 0
 	mov	w0, 28677
 	cmp	w1, w0
 	beq	.L92
@@ -832,13 +832,13 @@ ebc_io_ctl:
 	mov	w0, 28683
 	cmp	w1, w0
 	bne	.L91
-	.loc 1 1672 0
+	.loc 1 1673 0
 	bl	ebc_empty_buf_get
 .LVL51:
 	mov	x23, x0
-	.loc 1 1673 0
+	.loc 1 1674 0
 	cbz	x0, .L112
-	.loc 1 1675 0
+	.loc 1 1676 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 392]
@@ -849,7 +849,7 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL52:
-	.loc 1 1676 0
+	.loc 1 1677 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL53:
@@ -879,11 +879,11 @@ ebc_io_ctl:
 .LBE936:
 .LBE935:
 .LBE934:
-	.loc 1 1678 0
+	.loc 1 1679 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 1677 0
+	.loc 1 1678 0
 	str	w0, [x29, 104]
-	.loc 1 1679 0
+	.loc 1 1680 0
 	stp	w4, w1, [x29, 112]
 .LBB965:
 .LBB962:
@@ -912,7 +912,7 @@ ebc_io_ctl:
 .LBE959:
 .LBE962:
 .LBE965:
-	.loc 1 1495 0
+	.loc 1 1496 0
 	mov	x0, x21
 .LVL58:
 .LBB966:
@@ -960,36 +960,36 @@ ebc_io_ctl:
 .LBE960:
 .LBE963:
 .LBE966:
-	.loc 1 1681 0
+	.loc 1 1682 0
 	mov	x0, x23
 .LVL63:
 	bl	ebc_buf_release
 .LVL64:
-	.loc 1 1682 0
+	.loc 1 1683 0
 	b	.L87
 .LVL65:
 	.p2align 3
 .L89:
-	.loc 1 1511 0
-	cbnz	x21, .L88
 	.loc 1 1512 0
+	cbnz	x21, .L88
+	.loc 1 1513 0
 	ldr	x0, [x20, 272]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
 .LVL66:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC1
-	.loc 1 1513 0
+	.loc 1 1514 0
 	mov	x22, -14
-	.loc 1 1512 0
+	.loc 1 1513 0
 	bl	_dev_err
 .LVL67:
-	.loc 1 1513 0
+	.loc 1 1514 0
 	b	.L87
 .LVL68:
 	.p2align 3
 .L221:
-	.loc 1 1520 0
+	.loc 1 1521 0
 	mov	w0, 28674
 	cmp	w1, w0
 	beq	.L94
@@ -1000,23 +1000,23 @@ ebc_io_ctl:
 	mov	w0, 28676
 	cmp	w1, w0
 	bne	.L91
-	.loc 1 1604 0
+	.loc 1 1605 0
 	ldr	x0, [x20, 272]
-	.loc 1 1603 0
+	.loc 1 1604 0
 	mov	w2, 1
 	str	w2, [x20, 788]
-	.loc 1 1604 0
+	.loc 1 1605 0
 	adrp	x1, .LC2
 .LVL69:
-	.loc 1 1605 0
+	.loc 1 1606 0
 	mov	x22, 0
-	.loc 1 1604 0
+	.loc 1 1605 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
 .LVL70:
 	.p2align 2
 .L87:
-	.loc 1 1692 0
+	.loc 1 1693 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
 .LVL71:
@@ -1044,7 +1044,7 @@ ebc_io_ctl:
 	.p2align 3
 .L224:
 	.cfi_restore_state
-	.loc 1 1520 0
+	.loc 1 1521 0
 	cmp	w1, 28672
 	beq	.L96
 	mov	w0, 28673
@@ -1158,53 +1158,53 @@ ebc_io_ctl:
 .LBE969:
 .LBE968:
 .LBE967:
-	.loc 1 1558 0
+	.loc 1 1559 0
 	bl	ebc_phy_buf_base_get
 .LVL87:
 	ldrsw	x1, [x29, 104]
-	.loc 1 1559 0
+	.loc 1 1560 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
 .LVL88:
 	mov	x21, x0
 .LVL89:
-	.loc 1 1560 0
-	cbz	x0, .L127
 	.loc 1 1561 0
+	cbz	x0, .L127
+	.loc 1 1562 0
 	ldr	w5, [x29, 108]
-	.loc 1 1570 0
+	.loc 1 1571 0
 	add	x20, x20, 184
-	.loc 1 1565 0
+	.loc 1 1566 0
 	ldp	w4, w2, [x29, 124]
-	.loc 1 1561 0
+	.loc 1 1562 0
 	str	w5, [x21, 40]
-	.loc 1 1566 0
+	.loc 1 1567 0
 	ldp	w3, w1, [x29, 132]
-	.loc 1 1565 0
-	stp	w4, w2, [x21, 48]
 	.loc 1 1566 0
+	stp	w4, w2, [x21, 48]
+	.loc 1 1567 0
 	stp	w3, w1, [x21, 56]
-	.loc 1 1568 0
+	.loc 1 1569 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL90:
-	.loc 1 1570 0
+	.loc 1 1571 0
 	ldr	w0, [x20, 80]
 	cbz	w0, .L227
 .L122:
-	.loc 1 1574 0
+	.loc 1 1575 0
 	ldr	w0, [x21, 40]
 	cmp	w0, 17
 	beq	.L228
-	.loc 1 1574 0 is_stmt 0 discriminator 3
+	.loc 1 1575 0 is_stmt 0 discriminator 3
 	cmp	w0, 19
 	bne	.L127
 .L124:
-	.loc 1 1575 0 is_stmt 1
+	.loc 1 1576 0 is_stmt 1
 	mov	w0, 1
 	str	w0, [x20, 188]
 .LBB996:
 .LBB997:
-	.loc 1 1576 0
+	.loc 1 1577 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
@@ -1217,13 +1217,13 @@ ebc_io_ctl:
 	.p2align 3
 .L229:
 .LVL92:
-	.loc 1 1576 0 is_stmt 0 discriminator 5
+	.loc 1 1577 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L127
-	.loc 1 1576 0 discriminator 7
+	.loc 1 1577 0 discriminator 7
 	bl	schedule
 .LVL93:
 .L128:
-	.loc 1 1576 0 discriminator 9
+	.loc 1 1577 0 discriminator 9
 	add	x1, x29, 64
 	mov	w2, 1
 	mov	x0, x21
@@ -1232,7 +1232,7 @@ ebc_io_ctl:
 	ldr	w1, [x20, 188]
 	cbnz	w1, .L229
 .LBE998:
-	.loc 1 1576 0 discriminator 4
+	.loc 1 1577 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
 	bl	finish_wait
@@ -1246,13 +1246,13 @@ ebc_io_ctl:
 .L104:
 .LBE997:
 .LBE996:
-	.loc 1 1659 0 is_stmt 1
+	.loc 1 1660 0 is_stmt 1
 	bl	ebc_empty_buf_get
 .LVL97:
 	mov	x23, x0
-	.loc 1 1660 0
+	.loc 1 1661 0
 	cbz	x0, .L112
-	.loc 1 1662 0
+	.loc 1 1663 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 328]
@@ -1262,7 +1262,7 @@ ebc_io_ctl:
 .LVL98:
 	.p2align 3
 .L222:
-	.loc 1 1520 0
+	.loc 1 1521 0
 	mov	w0, 28678
 	cmp	w1, w0
 	beq	.L102
@@ -1377,36 +1377,36 @@ ebc_io_ctl:
 .LBE1004:
 .LBE1003:
 .LBE1002:
-	.loc 1 1585 0
+	.loc 1 1586 0
 	bl	ebc_osd_buf_clone
 .LVL111:
 	mov	x1, x0
-	.loc 1 1586 0
-	cbz	x0, .L127
 	.loc 1 1587 0
+	cbz	x0, .L127
+	.loc 1 1588 0
 	ldr	w6, [x29, 108]
-	.loc 1 1596 0
+	.loc 1 1597 0
 	add	x20, x20, 184
-	.loc 1 1591 0
+	.loc 1 1592 0
 	ldp	w5, w3, [x29, 124]
-	.loc 1 1587 0
+	.loc 1 1588 0
 	str	w6, [x1, 40]
-	.loc 1 1592 0
+	.loc 1 1593 0
 	ldp	w4, w2, [x29, 132]
-	.loc 1 1591 0
-	stp	w5, w3, [x1, 48]
 	.loc 1 1592 0
+	stp	w5, w3, [x1, 48]
+	.loc 1 1593 0
 	stp	w4, w2, [x1, 56]
-	.loc 1 1594 0
+	.loc 1 1595 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL112:
-	.loc 1 1596 0
+	.loc 1 1597 0
 	ldr	w0, [x20, 80]
 	cbnz	w0, .L127
-	.loc 1 1597 0
+	.loc 1 1598 0
 	mov	w2, 1
 	str	w2, [x20, 80]
-	.loc 1 1598 0
+	.loc 1 1599 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -1479,12 +1479,12 @@ ebc_io_ctl:
 .LBE961:
 .LBE964:
 .LBE1031:
-	.loc 1 1522 0
+	.loc 1 1523 0
 	bl	ebc_osd_buf_get
 .LVL123:
-	.loc 1 1523 0
+	.loc 1 1524 0
 	cbz	x0, .L112
-	.loc 1 1526 0
+	.loc 1 1527 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL124:
@@ -1511,17 +1511,17 @@ ebc_io_ctl:
 .LBE1034:
 .LBE1033:
 .LBE1032:
-	.loc 1 1526 0
+	.loc 1 1527 0
 	sub	w0, w22, w0
-	.loc 1 1531 0
+	.loc 1 1532 0
 	ldr	w1, [x20, 176]
-	.loc 1 1530 0
+	.loc 1 1531 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1529 0
+	.loc 1 1530 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1531 0
+	.loc 1 1532 0
 	str	w1, [x29, 120]
-	.loc 1 1528 0
+	.loc 1 1529 0
 	str	w0, [x29, 104]
 .LBB1065:
 .LBB1062:
@@ -1646,7 +1646,7 @@ ebc_io_ctl:
 .LBE1068:
 .LBE1067:
 .LBE1066:
-	.loc 1 1612 0
+	.loc 1 1613 0
 	add	x22, x20, 232
 .LBB1101:
 .LBB1097:
@@ -1743,49 +1743,49 @@ ebc_io_ctl:
 .LBE1093:
 .LBE1097:
 .LBE1101:
-	.loc 1 1616 0
+	.loc 1 1617 0
 	add	x20, x20, 184
 	ldr	w2, [x20, 48]
 	ldr	x0, [x20, 88]
 .LVL150:
-	.loc 1 1617 0
+	.loc 1 1618 0
 	mov	x22, 0
-	.loc 1 1616 0
+	.loc 1 1617 0
 	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	_dev_info
 .LVL151:
-	.loc 1 1617 0
+	.loc 1 1618 0
 	b	.L87
 .LVL152:
 	.p2align 3
 .L92:
-	.loc 1 1609 0
+	.loc 1 1610 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC3
 .LVL153:
-	.loc 1 1607 0
+	.loc 1 1608 0
 	str	wzr, [x20, 788]
-	.loc 1 1610 0
+	.loc 1 1611 0
 	mov	x22, 0
-	.loc 1 1608 0
-	str	wzr, [x20, 792]
 	.loc 1 1609 0
+	str	wzr, [x20, 792]
+	.loc 1 1610 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
 .LVL154:
-	.loc 1 1610 0
+	.loc 1 1611 0
 	b	.L87
 .LVL155:
 	.p2align 3
 .L100:
-	.loc 1 1646 0
+	.loc 1 1647 0
 	bl	ebc_empty_buf_get
 .LVL156:
 	mov	x23, x0
-	.loc 1 1647 0
+	.loc 1 1648 0
 	cbz	x0, .L112
-	.loc 1 1649 0
+	.loc 1 1650 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 320]
@@ -1795,13 +1795,13 @@ ebc_io_ctl:
 .LVL157:
 	.p2align 3
 .L105:
-	.loc 1 1633 0
+	.loc 1 1634 0
 	bl	ebc_empty_buf_get
 .LVL158:
 	mov	x23, x0
-	.loc 1 1634 0
+	.loc 1 1635 0
 	cbz	x0, .L112
-	.loc 1 1636 0
+	.loc 1 1637 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 312]
@@ -1810,7 +1810,7 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL159:
-	.loc 1 1637 0
+	.loc 1 1638 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL160:
@@ -1838,11 +1838,11 @@ ebc_io_ctl:
 .LBE1104:
 .LBE1103:
 .LBE1102:
-	.loc 1 1640 0
+	.loc 1 1641 0
 	ldp	w4, w1, [x22, 84]
-	.loc 1 1638 0
-	str	w0, [x29, 104]
 	.loc 1 1639 0
+	str	w0, [x29, 104]
+	.loc 1 1640 0
 	stp	w1, w4, [x29, 112]
 .LBB1113:
 .LBB1112:
@@ -1886,15 +1886,15 @@ ebc_io_ctl:
 .LBE1116:
 .LBE1115:
 .LBE1114:
-	.loc 1 1623 0
+	.loc 1 1624 0
 	ldp	w1, w0, [x20, 116]
 .LVL165:
 	stp	w1, w0, [x29, 140]
-	.loc 1 1620 0
+	.loc 1 1621 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 1619 0
+	.loc 1 1620 0
 	stp	w5, w6, [x29, 112]
-	.loc 1 1621 0
+	.loc 1 1622 0
 	ldr	w4, [x20, 176]
 	str	w4, [x29, 120]
 .LBB1149:
@@ -1942,46 +1942,46 @@ ebc_io_ctl:
 .LBE1141:
 .LBE1145:
 .LBE1149:
-	.loc 1 1626 0
+	.loc 1 1627 0
 	ldr	x0, [x20, 272]
 .LVL171:
 	adrp	x1, .LC5
 .LVL172:
-	.loc 1 1627 0
+	.loc 1 1628 0
 	mov	x22, -14
-	.loc 1 1626 0
+	.loc 1 1627 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
 .LVL173:
-	.loc 1 1627 0
+	.loc 1 1628 0
 	b	.L87
 .LVL174:
 	.p2align 3
 .L91:
-	.loc 1 1687 0
+	.loc 1 1688 0
 	ldr	x0, [x20, 272]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
 .LVL175:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
-	.loc 1 1688 0
+	.loc 1 1689 0
 	mov	x22, 0
-	.loc 1 1687 0
+	.loc 1 1688 0
 	bl	_dev_err
 .LVL176:
-	.loc 1 1691 0
+	.loc 1 1692 0
 	b	.L87
 .LVL177:
 	.p2align 3
 .L96:
-	.loc 1 1536 0
+	.loc 1 1537 0
 	bl	ebc_empty_buf_get
 .LVL178:
 	mov	x23, x0
-	.loc 1 1537 0
+	.loc 1 1538 0
 	cbz	x0, .L112
-	.loc 1 1540 0
+	.loc 1 1541 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL179:
@@ -2008,17 +2008,17 @@ ebc_io_ctl:
 .LBE1152:
 .LBE1151:
 .LBE1150:
-	.loc 1 1540 0
+	.loc 1 1541 0
 	sub	w0, w22, w0
-	.loc 1 1545 0
+	.loc 1 1546 0
 	ldr	w1, [x20, 176]
-	.loc 1 1544 0
+	.loc 1 1545 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1543 0
+	.loc 1 1544 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1545 0
+	.loc 1 1546 0
 	str	w1, [x29, 120]
-	.loc 1 1542 0
+	.loc 1 1543 0
 	str	w0, [x29, 104]
 .LBB1185:
 .LBB1181:
@@ -2065,15 +2065,15 @@ ebc_io_ctl:
 .LBE1177:
 .LBE1181:
 .LBE1185:
-	.loc 1 1549 0
+	.loc 1 1550 0
 	mov	x0, x23
 .LVL186:
-	.loc 1 1550 0
+	.loc 1 1551 0
 	mov	x22, -14
-	.loc 1 1549 0
+	.loc 1 1550 0
 	bl	ebc_buf_release
 .LVL187:
-	.loc 1 1550 0
+	.loc 1 1551 0
 	b	.L87
 .LVL188:
 	.p2align 3
@@ -2096,7 +2096,7 @@ ebc_io_ctl:
 .LBE1027:
 .LBE1029:
 .LBE1186:
-	.loc 1 1495 0
+	.loc 1 1496 0
 	mov	x0, x21
 .LVL189:
 .LBB1187:
@@ -2133,7 +2133,7 @@ ebc_io_ctl:
 .LBE992:
 .LBE994:
 .LBE1188:
-	.loc 1 1495 0
+	.loc 1 1496 0
 	mov	x0, x21
 .LVL191:
 .LBB1189:
@@ -2171,7 +2171,7 @@ ebc_io_ctl:
 .LBE1142:
 .LBE1146:
 .LBE1190:
-	.loc 1 1495 0
+	.loc 1 1496 0
 	mov	x0, x21
 .LVL194:
 .LBB1191:
@@ -2208,7 +2208,7 @@ ebc_io_ctl:
 .LBE1094:
 .LBE1098:
 .LBE1192:
-	.loc 1 1495 0
+	.loc 1 1496 0
 	mov	x0, x21
 .LVL196:
 .LBB1193:
@@ -2246,7 +2246,7 @@ ebc_io_ctl:
 .LBE1178:
 .LBE1182:
 .LBE1194:
-	.loc 1 1495 0
+	.loc 1 1496 0
 	mov	x0, x21
 .LVL199:
 .LBB1195:
@@ -2284,7 +2284,7 @@ ebc_io_ctl:
 .LBE1060:
 .LBE1063:
 .LBE1196:
-	.loc 1 1495 0
+	.loc 1 1496 0
 	mov	x0, x21
 .LVL202:
 .LBB1197:
@@ -2359,7 +2359,7 @@ ebc_io_ctl:
 .LBE1144:
 .LBE1148:
 .LBE1198:
-	.loc 1 1625 0
+	.loc 1 1626 0
 	cbnz	x0, .L139
 .LBB1199:
 .LBB999:
@@ -2426,7 +2426,7 @@ ebc_io_ctl:
 .LBE1180:
 .LBE1184:
 .LBE1200:
-	.loc 1 1548 0
+	.loc 1 1549 0
 	cbnz	w0, .L116
 .LBB1201:
 .LBB1000:
@@ -2437,16 +2437,16 @@ ebc_io_ctl:
 .L120:
 .LBE1000:
 .LBE1201:
-	.loc 1 1556 0
+	.loc 1 1557 0
 	mov	x22, -14
 	b	.L87
 .LVL220:
 	.p2align 3
 .L227:
-	.loc 1 1571 0
+	.loc 1 1572 0
 	mov	w2, 1
 	str	w2, [x20, 80]
-	.loc 1 1572 0
+	.loc 1 1573 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -2456,7 +2456,7 @@ ebc_io_ctl:
 	b	.L122
 	.p2align 3
 .L228:
-	.loc 1 1574 0 discriminator 1
+	.loc 1 1575 0 discriminator 1
 	ldr	w0, [x20, 592]
 	cbz	w0, .L124
 .LBB1202:
@@ -2467,7 +2467,7 @@ ebc_io_ctl:
 .L112:
 .LBE1001:
 .LBE1202:
-	.loc 1 1524 0
+	.loc 1 1525 0
 	mov	x22, -1
 	b	.L87
 .LVL223:
@@ -2490,19 +2490,19 @@ ebc_io_ctl:
 .LBE1096:
 .LBE1100:
 .LBE1203:
-	.loc 1 1613 0
+	.loc 1 1614 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC4
-	.loc 1 1614 0
+	.loc 1 1615 0
 	mov	x22, -14
-	.loc 1 1613 0
+	.loc 1 1614 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
 .LVL228:
-	.loc 1 1614 0
+	.loc 1 1615 0
 	b	.L87
 .L225:
-	.loc 1 1692 0
+	.loc 1 1693 0
 	bl	__stack_chk_fail
 .LVL229:
 .L233:
@@ -2698,7 +2698,7 @@ frame_done_callback:
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
 .LFB2828:
-	.loc 1 1421 0
+	.loc 1 1422 0
 	.cfi_startproc
 .LVL241:
 	stp	x29, x30, [sp, -16]!
@@ -2707,10 +2707,10 @@ ebc_frame_timeout:
 	.cfi_offset 30, -8
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1422 0
+	.loc 1 1423 0
 	bl	frame_done_callback
 .LVL242:
-	.loc 1 1424 0
+	.loc 1 1425 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -2783,8 +2783,8 @@ ebc_lut_update:
 .L249:
 	.loc 1 999 0
 	ldr	x0, [x22, 88]
-	adrp	x1, .LC12
-	add	x1, x1, :lo12:.LC12
+	adrp	x1, .LC13
+	add	x1, x1, :lo12:.LC13
 	bl	_dev_info
 .LVL248:
 	.loc 1 1002 0
@@ -2844,8 +2844,8 @@ ebc_lut_update:
 	.align	0
 	.align	2
 .L252:
-	.byte	(.L251 - .Lrtx252) / 4
-	.byte	(.L251 - .Lrtx252) / 4
+	.byte	(.L270 - .Lrtx252) / 4
+	.byte	(.L253 - .Lrtx252) / 4
 	.byte	(.L270 - .Lrtx252) / 4
 	.byte	(.L254 - .Lrtx252) / 4
 	.byte	(.L255 - .Lrtx252) / 4
@@ -2872,8 +2872,8 @@ ebc_lut_update:
 	.loc 1 997 0
 	add	x22, x21, 184
 	mov	w2, w0
-	adrp	x1, .LC11
-	add	x1, x1, :lo12:.LC11
+	adrp	x1, .LC12
+	add	x1, x1, :lo12:.LC12
 	ldr	x0, [x22, 88]
 	bl	_dev_err
 .LVL253:
@@ -2883,9 +2883,9 @@ ebc_lut_update:
 .L272:
 	.loc 1 992 0
 	ldr	x0, [x22, 88]
-	adrp	x1, .LC10
-	add	x1, x1, :lo12:.LC10
-	bl	_dev_err
+	adrp	x1, .LC11
+	add	x1, x1, :lo12:.LC11
+	bl	_dev_info
 .LVL254:
 	.loc 1 993 0
 	mov	w2, 50
@@ -2907,8 +2907,8 @@ ebc_lut_update:
 .L263:
 	.loc 1 1061 0
 	ldr	x0, [x22, 88]
-	adrp	x1, .LC13
-	add	x1, x1, :lo12:.LC13
+	adrp	x1, .LC14
+	add	x1, x1, :lo12:.LC14
 	bl	_dev_err
 .LVL257:
 	.loc 1 1062 0
@@ -2932,7 +2932,7 @@ ebc_lut_update:
 	cbnz	w0, .L262
 	b	.L265
 	.p2align 3
-.L251:
+.L253:
 	.loc 1 1018 0
 	mov	w1, 5
 	add	x0, x21, 280
@@ -2991,7 +2991,7 @@ ebc_lut_update:
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC10
 	add	x1, x1, :lo12:.LC10
-	bl	_dev_err
+	bl	_dev_info
 .LVL266:
 	.loc 1 989 0
 	str	wzr, [x29, 52]
@@ -3009,32 +3009,32 @@ ebc_lut_update:
 	.type	ebc_state_read, %function
 ebc_state_read:
 .LFB2839:
-	.loc 1 1816 0
+	.loc 1 1817 0
 	.cfi_startproc
 .LVL268:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1817 0
+	.loc 1 1818 0
 	adrp	x3, .LANCHOR0
-	.loc 1 1816 0
+	.loc 1 1817 0
 	mov	x0, x2
 .LVL269:
-	.loc 1 1817 0
-	adrp	x1, .LC14
+	.loc 1 1818 0
+	adrp	x1, .LC15
 .LVL270:
-	.loc 1 1816 0
+	.loc 1 1817 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1817 0
+	.loc 1 1818 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL271:
-	add	x1, x1, :lo12:.LC14
+	add	x1, x1, :lo12:.LC15
 	ldr	w2, [x2, 608]
 	bl	sprintf
 .LVL272:
-	.loc 1 1818 0
+	.loc 1 1819 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3049,7 +3049,7 @@ ebc_state_read:
 	.type	ebc_version_read, %function
 ebc_version_read:
 .LFB2838:
-	.loc 1 1807 0
+	.loc 1 1808 0
 	.cfi_startproc
 .LVL273:
 	stp	x29, x30, [sp, -16]!
@@ -3058,22 +3058,22 @@ ebc_version_read:
 	.cfi_offset 30, -8
 	mov	x0, x2
 .LVL274:
-	.loc 1 1808 0
-	adrp	x1, .LC16
+	.loc 1 1809 0
+	adrp	x1, .LC17
 .LVL275:
-	adrp	x2, .LC15
+	adrp	x2, .LC16
 .LVL276:
-	.loc 1 1807 0
+	.loc 1 1808 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
+	.loc 1 1809 0
+	add	x2, x2, :lo12:.LC16
 	.loc 1 1808 0
-	add	x2, x2, :lo12:.LC15
-	.loc 1 1807 0
-	.loc 1 1808 0
-	add	x1, x1, :lo12:.LC16
+	.loc 1 1809 0
+	add	x1, x1, :lo12:.LC17
 	bl	sprintf
 .LVL277:
-	.loc 1 1809 0
+	.loc 1 1810 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3088,27 +3088,27 @@ ebc_version_read:
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
 .LFB2836:
-	.loc 1 1771 0
+	.loc 1 1772 0
 	.cfi_startproc
 .LVL278:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 1772 0
+	.loc 1 1773 0
 	adrp	x0, .LANCHOR0
 .LVL279:
-	.loc 1 1771 0
+	.loc 1 1772 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1775 0
+	.loc 1 1776 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1771 0
+	.loc 1 1772 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1771 0
+	.loc 1 1772 0
 	mov	x19, x2
-	.loc 1 1775 0
+	.loc 1 1776 0
 	ldr	x1, [x0, 16]
 .LVL280:
 .LBB1206:
@@ -3120,14 +3120,14 @@ pmic_vcom_read:
 .LVL281:
 .LBE1207:
 .LBE1206:
-	.loc 1 1777 0
+	.loc 1 1778 0
 	mov	w2, w0
-	adrp	x1, .LC14
+	adrp	x1, .LC15
 	mov	x0, x19
-	add	x1, x1, :lo12:.LC14
+	add	x1, x1, :lo12:.LC15
 	bl	sprintf
 .LVL282:
-	.loc 1 1778 0
+	.loc 1 1779 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL283:
@@ -3145,20 +3145,20 @@ pmic_vcom_read:
 	.type	pmic_temp_read, %function
 pmic_temp_read:
 .LFB2835:
-	.loc 1 1757 0
+	.loc 1 1758 0
 	.cfi_startproc
 .LVL284:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 1758 0
+	.loc 1 1759 0
 	adrp	x0, .LANCHOR0
 .LVL285:
-	.loc 1 1757 0
+	.loc 1 1758 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1761 0
+	.loc 1 1762 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
 .LBB1208:
 .LBB1209:
@@ -3167,11 +3167,11 @@ pmic_temp_read:
 .LVL286:
 .LBE1209:
 .LBE1208:
-	.loc 1 1757 0
+	.loc 1 1758 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 1757 0
+	.loc 1 1758 0
 	adrp	x19, __stack_chk_guard
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x20, x2
@@ -3179,7 +3179,7 @@ pmic_temp_read:
 	str	x2, [x29, 40]
 	mov	x2,0
 .LVL287:
-	.loc 1 1761 0
+	.loc 1 1762 0
 	ldr	x2, [x0, 16]
 .LBB1211:
 .LBB1210:
@@ -3190,14 +3190,14 @@ pmic_temp_read:
 .LVL288:
 .LBE1210:
 .LBE1211:
-	.loc 1 1763 0
+	.loc 1 1764 0
 	ldr	w2, [x29, 36]
-	adrp	x1, .LC14
+	adrp	x1, .LC15
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC14
+	add	x1, x1, :lo12:.LC15
 	bl	sprintf
 .LVL289:
-	.loc 1 1764 0
+	.loc 1 1765 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
@@ -3226,33 +3226,33 @@ pmic_temp_read:
 	.type	pmic_name_read, %function
 pmic_name_read:
 .LFB2834:
-	.loc 1 1746 0
+	.loc 1 1747 0
 	.cfi_startproc
 .LVL293:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1747 0
+	.loc 1 1748 0
 	adrp	x3, .LANCHOR0
-	.loc 1 1746 0
+	.loc 1 1747 0
 	mov	x0, x2
 .LVL294:
-	.loc 1 1749 0
-	adrp	x1, .LC16
+	.loc 1 1750 0
+	adrp	x1, .LC17
 .LVL295:
-	.loc 1 1746 0
+	.loc 1 1747 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1749 0
+	.loc 1 1750 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL296:
-	add	x1, x1, :lo12:.LC16
+	add	x1, x1, :lo12:.LC17
 	ldr	x2, [x2, 16]
 	add	x2, x2, 8
 	bl	sprintf
 .LVL297:
-	.loc 1 1750 0
+	.loc 1 1751 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3267,17 +3267,17 @@ pmic_name_read:
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
 .LFB2837:
-	.loc 1 1783 0
+	.loc 1 1784 0
 	.cfi_startproc
 .LVL298:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 1784 0
+	.loc 1 1785 0
 	adrp	x0, .LANCHOR0
 .LVL299:
-	.loc 1 1783 0
+	.loc 1 1784 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -3287,37 +3287,37 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 1783 0
+	.loc 1 1784 0
 	add	x1, x19, :lo12:__stack_chk_guard
 .LVL300:
 	mov	x21, x2
-	.loc 1 1784 0
+	.loc 1 1785 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
 .LVL301:
-	.loc 1 1783 0
+	.loc 1 1784 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
 .LVL302:
 	mov	x20, x3
-	.loc 1 1787 0
+	.loc 1 1788 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
 .LVL303:
-	.loc 1 1788 0
+	.loc 1 1789 0
 	cbnz	w0, .L294
 .LVL304:
-	.loc 1 1792 0
+	.loc 1 1793 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
 .LVL305:
-	.loc 1 1793 0
+	.loc 1 1794 0
 	cbnz	w0, .L295
 .L287:
-	.loc 1 1799 0
+	.loc 1 1800 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
 .LVL306:
@@ -3342,36 +3342,36 @@ pmic_vcom_write:
 	.p2align 3
 .L294:
 	.cfi_restore_state
-	.loc 1 1789 0
+	.loc 1 1790 0
 	ldr	x0, [x22]
-	adrp	x1, .LC17
+	adrp	x1, .LC18
 	mov	x2, x21
-	add	x1, x1, :lo12:.LC17
-	.loc 1 1790 0
+	add	x1, x1, :lo12:.LC18
+	.loc 1 1791 0
 	mov	x20, -1
 .LVL309:
-	.loc 1 1789 0
+	.loc 1 1790 0
 	bl	_dev_err
 .LVL310:
-	.loc 1 1790 0
+	.loc 1 1791 0
 	b	.L287
 .LVL311:
 	.p2align 3
 .L295:
-	.loc 1 1794 0
-	ldr	x0, [x22]
-	adrp	x1, .LC18
 	.loc 1 1795 0
+	ldr	x0, [x22]
+	adrp	x1, .LC19
+	.loc 1 1796 0
 	mov	x20, -1
 .LVL312:
-	.loc 1 1794 0
-	add	x1, x1, :lo12:.LC18
+	.loc 1 1795 0
+	add	x1, x1, :lo12:.LC19
 	bl	_dev_err
 .LVL313:
-	.loc 1 1795 0
+	.loc 1 1796 0
 	b	.L287
 .L296:
-	.loc 1 1799 0
+	.loc 1 1800 0
 	bl	__stack_chk_fail
 .LVL314:
 	.cfi_endproc
@@ -3382,7 +3382,7 @@ pmic_vcom_write:
 	.type	waveform_version_read, %function
 waveform_version_read:
 .LFB2833:
-	.loc 1 1735 0
+	.loc 1 1736 0
 	.cfi_startproc
 .LVL315:
 	stp	x29, x30, [sp, -32]!
@@ -3393,19 +3393,19 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1735 0
-	mov	x19, x2
 	.loc 1 1736 0
+	mov	x19, x2
+	.loc 1 1737 0
 	bl	epd_lut_get_wf_version
 .LVL316:
-	.loc 1 1738 0
+	.loc 1 1739 0
 	mov	x2, x0
-	adrp	x1, .LC16
+	adrp	x1, .LC17
 	mov	x0, x19
-	add	x1, x1, :lo12:.LC16
+	add	x1, x1, :lo12:.LC17
 	bl	sprintf
 .LVL317:
-	.loc 1 1739 0
+	.loc 1 1740 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL318:
@@ -3423,23 +3423,23 @@ waveform_version_read:
 	.type	ebc_init, %function
 ebc_init:
 .LFB2850:
-	.loc 1 2252 0
+	.loc 1 2253 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2253 0
+	.loc 1 2254 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2252 0
+	.loc 1 2253 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2253 0
+	.loc 1 2254 0
 	bl	__platform_driver_register
 .LVL319:
-	.loc 1 2254 0
+	.loc 1 2255 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -4965,9 +4965,9 @@ ebc_frame_start:
 	.cfi_restore_state
 	.loc 1 834 0
 	adrp	x1, .LANCHOR3
-	adrp	x0, .LC19
+	adrp	x0, .LC20
 	add	x1, x1, :lo12:.LANCHOR3
-	add	x0, x0, :lo12:.LC19
+	add	x0, x0, :lo12:.LC20
 	bl	printk
 .LVL441:
 	.loc 1 835 0
@@ -5246,8 +5246,8 @@ ebc_power_set.part.8:
 	cbnz	w0, .L487
 	.loc 1 204 0
 	ldr	x0, [x19]
-	adrp	x1, .LC20
-	add	x1, x1, :lo12:.LC20
+	adrp	x1, .LC21
+	add	x1, x1, :lo12:.LC21
 	bl	_dev_info
 .LVL461:
 	.loc 1 208 0
@@ -5277,8 +5277,8 @@ ebc_power_set.part.8:
 .LBE1402:
 	.loc 1 204 0
 	ldr	x0, [x19]
-	adrp	x1, .LC20
-	add	x1, x1, :lo12:.LC20
+	adrp	x1, .LC21
+	add	x1, x1, :lo12:.LC21
 	bl	_dev_info
 .LVL465:
 	.loc 1 208 0
@@ -5299,7 +5299,7 @@ ebc_power_set.part.8:
 	.type	ebc_suspend, %function
 ebc_suspend:
 .LFB2848:
-	.loc 1 2202 0
+	.loc 1 2203 0
 	.cfi_startproc
 .LVL467:
 	stp	x29, x30, [sp, -32]!
@@ -5317,17 +5317,17 @@ ebc_suspend:
 	ldr	x20, [x0, 184]
 .LBE1405:
 .LBE1404:
-	.loc 1 2206 0
+	.loc 1 2207 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 184]
 .LVL468:
 	cmp	w0, 1
 	beq	.L491
 .L489:
-	.loc 1 2210 0
+	.loc 1 2211 0
 	mov	w0, 1
 	str	w0, [x19, 596]
-	.loc 1 2212 0
+	.loc 1 2213 0
 	ldr	x1, [x20, 16]
 .LBB1406:
 .LBB1407:
@@ -5338,13 +5338,13 @@ ebc_suspend:
 .LVL469:
 .LBE1407:
 .LBE1406:
-	.loc 1 2213 0
+	.loc 1 2214 0
 	ldr	x0, [x19, 88]
-	adrp	x1, .LC22
-	add	x1, x1, :lo12:.LC22
+	adrp	x1, .LC23
+	add	x1, x1, :lo12:.LC23
 	bl	_dev_info
 .LVL470:
-	.loc 1 2216 0
+	.loc 1 2217 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -5358,13 +5358,13 @@ ebc_suspend:
 	.p2align 3
 .L491:
 	.cfi_restore_state
-	.loc 1 2207 0
+	.loc 1 2208 0
 	ldr	x0, [x19, 88]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
-	adrp	x1, .LC21
+	adrp	x1, .LC22
 	add	x2, x2, 16
-	add	x1, x1, :lo12:.LC21
+	add	x1, x1, :lo12:.LC22
 	bl	_dev_info
 .LVL471:
 .LBB1408:
@@ -5384,7 +5384,7 @@ ebc_suspend:
 	.type	ebc_probe, %function
 ebc_probe:
 .LFB2846:
-	.loc 1 2086 0
+	.loc 1 2087 0
 	.cfi_startproc
 .LVL473:
 	stp	x29, x30, [sp, -208]!
@@ -5398,15 +5398,15 @@ ebc_probe:
 	movk	w2, 0x60, lsl 16
 .LBE1556:
 .LBE1555:
-	.loc 1 2086 0
+	.loc 1 2087 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -192
 	.cfi_offset 20, -184
-	.loc 1 2087 0
+	.loc 1 2088 0
 	add	x20, x0, 16
-	.loc 1 2086 0
+	.loc 1 2087 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -160
 	.cfi_offset 24, -152
@@ -5422,7 +5422,7 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 2086 0
+	.loc 1 2087 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
@@ -5435,30 +5435,30 @@ ebc_probe:
 .LVL475:
 .LBE1557:
 .LBE1558:
-	.loc 1 2098 0
+	.loc 1 2099 0
 	cbz	x0, .L537
-	.loc 1 2102 0
+	.loc 1 2103 0
 	adrp	x25, .LANCHOR0
 	mov	x19, x0
-	.loc 1 2104 0
-	adrp	x1, .LC23
+	.loc 1 2105 0
+	adrp	x1, .LC24
 	mov	w2, 0
-	.loc 1 2102 0
+	.loc 1 2103 0
 	str	x0, [x25, #:lo12:.LANCHOR0]
-	.loc 1 2104 0
-	add	x1, x1, :lo12:.LC23
+	.loc 1 2105 0
+	add	x1, x1, :lo12:.LC24
 	ldr	x0, [x20, 752]
-	.loc 1 2101 0
+	.loc 1 2102 0
 	str	x20, [x19]
-	.loc 1 2104 0
+	.loc 1 2105 0
 	bl	of_parse_phandle
 .LVL476:
-	.loc 1 2105 0
+	.loc 1 2106 0
 	cbz	x0, .L577
-	.loc 1 2110 0
+	.loc 1 2111 0
 	bl	of_find_device_by_node
 .LVL477:
-	.loc 1 2112 0
+	.loc 1 2113 0
 	cbz	x0, .L496
 .LBB1559:
 .LBB1560:
@@ -5469,27 +5469,27 @@ ebc_probe:
 .LBE1561:
 .LBE1560:
 .LBE1559:
-	.loc 1 2115 0
-	str	x0, [x19, 8]
 	.loc 1 2116 0
+	str	x0, [x19, 8]
+	.loc 1 2117 0
 	cbz	x0, .L496
-	.loc 1 2118 0
+	.loc 1 2119 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 2120 0
+	.loc 1 2121 0
 	mov	w2, 0
-	adrp	x1, .LC25
-	add	x1, x1, :lo12:.LC25
+	adrp	x1, .LC26
+	add	x1, x1, :lo12:.LC26
 	ldr	x0, [x20, 752]
 	bl	of_parse_phandle
 .LVL479:
-	.loc 1 2121 0
+	.loc 1 2122 0
 	cbz	x0, .L578
-	.loc 1 2126 0
+	.loc 1 2127 0
 	bl	of_find_i2c_device_by_node
 .LVL480:
-	.loc 1 2128 0
+	.loc 1 2129 0
 	cbz	x0, .L579
 .LBB1562:
 .LBB1563:
@@ -5500,16 +5500,16 @@ ebc_probe:
 .LBE1564:
 .LBE1563:
 .LBE1562:
-	.loc 1 2132 0
-	str	x0, [x19, 16]
 	.loc 1 2133 0
+	str	x0, [x19, 16]
+	.loc 1 2134 0
 	cbz	x0, .L580
-	.loc 1 2139 0
+	.loc 1 2140 0
 	add	x21, x19, 184
 .LVL482:
-	.loc 1 2141 0
+	.loc 1 2142 0
 	add	x22, x19, 24
-	.loc 1 2139 0
+	.loc 1 2140 0
 	str	x20, [x21, 88]
 .LBB1565:
 .LBB1566:
@@ -5518,13 +5518,13 @@ ebc_probe:
 .LBB1569:
 	.file 14 "./include/linux/of.h"
 	.loc 14 499 0
-	adrp	x1, .LC29
+	adrp	x1, .LC30
 .LBE1569:
 .LBE1568:
 .LBE1567:
 .LBE1566:
 .LBE1565:
-	.loc 1 2141 0
+	.loc 1 2142 0
 	str	x20, [x19, 24]
 .LBB1664:
 .LBB1660:
@@ -5538,7 +5538,7 @@ ebc_probe:
 .LBE1576:
 .LBE1660:
 .LBE1664:
-	.loc 1 2142 0
+	.loc 1 2143 0
 	ldr	x2, [x19, 8]
 .LBB1665:
 .LBB1661:
@@ -5546,13 +5546,13 @@ ebc_probe:
 .LBB1574:
 .LBB1571:
 	.loc 14 499 0
-	add	x1, x1, :lo12:.LC29
+	add	x1, x1, :lo12:.LC30
 .LBE1571:
 .LBE1574:
 .LBE1577:
 .LBE1661:
 .LBE1665:
-	.loc 1 2143 0
+	.loc 1 2144 0
 	stp	x2, x0, [x22, 8]
 .LBB1666:
 .LBB1662:
@@ -5575,11 +5575,11 @@ ebc_probe:
 .LBB1581:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC53
+	adrp	x1, .LC54
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 104
-	add	x1, x1, :lo12:.LC53
+	add	x1, x1, :lo12:.LC54
 	bl	of_property_read_variable_u32_array
 .LVL484:
 	.loc 14 501 0
@@ -5592,11 +5592,11 @@ ebc_probe:
 .LBB1584:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC54
+	adrp	x1, .LC55
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 108
-	add	x1, x1, :lo12:.LC54
+	add	x1, x1, :lo12:.LC55
 	bl	of_property_read_variable_u32_array
 .LVL485:
 	.loc 14 501 0
@@ -5609,11 +5609,11 @@ ebc_probe:
 .LBB1587:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC55
+	adrp	x1, .LC56
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 112
-	add	x1, x1, :lo12:.LC55
+	add	x1, x1, :lo12:.LC56
 	bl	of_property_read_variable_u32_array
 .LVL486:
 	.loc 14 501 0
@@ -5626,11 +5626,11 @@ ebc_probe:
 .LBB1590:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC56
+	adrp	x1, .LC57
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 128
-	add	x1, x1, :lo12:.LC56
+	add	x1, x1, :lo12:.LC57
 	bl	of_property_read_variable_u32_array
 .LVL487:
 	.loc 14 501 0
@@ -5643,11 +5643,11 @@ ebc_probe:
 .LBB1593:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC57
+	adrp	x1, .LC58
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 132
-	add	x1, x1, :lo12:.LC57
+	add	x1, x1, :lo12:.LC58
 	bl	of_property_read_variable_u32_array
 .LVL488:
 	.loc 14 501 0
@@ -5660,11 +5660,11 @@ ebc_probe:
 .LBB1596:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC58
+	adrp	x1, .LC59
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 136
-	add	x1, x1, :lo12:.LC58
+	add	x1, x1, :lo12:.LC59
 	bl	of_property_read_variable_u32_array
 .LVL489:
 	.loc 14 501 0
@@ -5677,11 +5677,11 @@ ebc_probe:
 .LBB1599:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC59
+	adrp	x1, .LC60
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 140
-	add	x1, x1, :lo12:.LC59
+	add	x1, x1, :lo12:.LC60
 	bl	of_property_read_variable_u32_array
 .LVL490:
 	.loc 14 501 0
@@ -5694,11 +5694,11 @@ ebc_probe:
 .LBB1602:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC60
+	adrp	x1, .LC61
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 144
-	add	x1, x1, :lo12:.LC60
+	add	x1, x1, :lo12:.LC61
 	bl	of_property_read_variable_u32_array
 .LVL491:
 	.loc 14 501 0
@@ -5711,11 +5711,11 @@ ebc_probe:
 .LBB1605:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC61
+	adrp	x1, .LC62
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 148
-	add	x1, x1, :lo12:.LC61
+	add	x1, x1, :lo12:.LC62
 	bl	of_property_read_variable_u32_array
 .LVL492:
 	.loc 14 501 0
@@ -5728,11 +5728,11 @@ ebc_probe:
 .LBB1608:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC62
+	adrp	x1, .LC63
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 152
-	add	x1, x1, :lo12:.LC62
+	add	x1, x1, :lo12:.LC63
 	bl	of_property_read_variable_u32_array
 .LVL493:
 	.loc 14 501 0
@@ -5745,11 +5745,11 @@ ebc_probe:
 .LBB1611:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC63
+	adrp	x1, .LC64
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 156
-	add	x1, x1, :lo12:.LC63
+	add	x1, x1, :lo12:.LC64
 	bl	of_property_read_variable_u32_array
 .LVL494:
 	.loc 14 501 0
@@ -5762,11 +5762,11 @@ ebc_probe:
 .LBB1614:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC64
+	adrp	x1, .LC65
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 160
-	add	x1, x1, :lo12:.LC64
+	add	x1, x1, :lo12:.LC65
 	bl	of_property_read_variable_u32_array
 .LVL495:
 	.loc 14 501 0
@@ -5779,11 +5779,11 @@ ebc_probe:
 .LBB1617:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC65
+	adrp	x1, .LC66
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 164
-	add	x1, x1, :lo12:.LC65
+	add	x1, x1, :lo12:.LC66
 	bl	of_property_read_variable_u32_array
 .LVL496:
 	.loc 14 501 0
@@ -5796,11 +5796,11 @@ ebc_probe:
 .LBB1620:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC66
+	adrp	x1, .LC67
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 168
-	add	x1, x1, :lo12:.LC66
+	add	x1, x1, :lo12:.LC67
 	bl	of_property_read_variable_u32_array
 .LVL497:
 	.loc 14 501 0
@@ -5813,11 +5813,11 @@ ebc_probe:
 .LBB1623:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC67
+	adrp	x1, .LC68
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 172
-	add	x1, x1, :lo12:.LC67
+	add	x1, x1, :lo12:.LC68
 	bl	of_property_read_variable_u32_array
 .LVL498:
 	.loc 14 501 0
@@ -5830,11 +5830,11 @@ ebc_probe:
 .LBB1626:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC30
+	adrp	x1, .LC31
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 176
-	add	x1, x1, :lo12:.LC30
+	add	x1, x1, :lo12:.LC31
 	bl	of_property_read_variable_u32_array
 .LVL499:
 	.loc 14 501 0
@@ -5848,11 +5848,11 @@ ebc_probe:
 .LBB1633:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC31
+	adrp	x1, .LC32
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 180
-	add	x1, x1, :lo12:.LC31
+	add	x1, x1, :lo12:.LC32
 	bl	of_property_read_variable_u32_array
 .LVL500:
 	.loc 14 501 0
@@ -5866,11 +5866,11 @@ ebc_probe:
 .LBB1640:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC32
+	adrp	x1, .LC33
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 116
-	add	x1, x1, :lo12:.LC32
+	add	x1, x1, :lo12:.LC33
 	bl	of_property_read_variable_u32_array
 .LVL501:
 	.loc 14 501 0
@@ -5884,11 +5884,11 @@ ebc_probe:
 .LBB1647:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC33
+	adrp	x1, .LC34
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 120
-	add	x1, x1, :lo12:.LC33
+	add	x1, x1, :lo12:.LC34
 	bl	of_property_read_variable_u32_array
 .LVL502:
 	.loc 14 501 0
@@ -5899,56 +5899,56 @@ ebc_probe:
 .LBE1645:
 .LBE1662:
 .LBE1666:
-	.loc 1 2151 0
+	.loc 1 2152 0
 	ldr	w0, [x22, 88]
 .LBB1667:
 .LBB1668:
-	.loc 1 1888 0
+	.loc 1 1889 0
 	mov	w2, 0
 .LBE1668:
 .LBE1667:
-	.loc 1 2151 0
-	str	w0, [x21, 52]
 	.loc 1 2152 0
+	str	w0, [x21, 52]
+	.loc 1 2153 0
 	ldr	w1, [x22, 84]
 	str	w1, [x21, 56]
-	.loc 1 2155 0
+	.loc 1 2156 0
 	tst	x1, 15
-	.loc 1 2153 0
+	.loc 1 2154 0
 	mul	w0, w0, w1
-	.loc 1 2155 0
+	.loc 1 2156 0
 	cset	w1, eq
 	str	w1, [x21, 72]
 .LBB1692:
 .LBB1687:
-	.loc 1 1888 0
-	adrp	x1, .LC34
-	add	x1, x1, :lo12:.LC34
+	.loc 1 1889 0
+	adrp	x1, .LC35
+	add	x1, x1, :lo12:.LC35
 .LBE1687:
 .LBE1692:
-	.loc 1 2153 0
-	lsr	w3, w0, 1
 	.loc 1 2154 0
+	lsr	w3, w0, 1
+	.loc 1 2155 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x21, 20]
 .LBB1693:
 .LBB1688:
-	.loc 1 1879 0
+	.loc 1 1880 0
 	ldr	x26, [x19]
 .LVL503:
-	.loc 1 1888 0
+	.loc 1 1889 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL504:
-	.loc 1 1889 0
+	.loc 1 1890 0
 	cbz	x0, .L538
-	.loc 1 1892 0
+	.loc 1 1893 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL505:
 	mov	w24, w0
-	.loc 1 1894 0
+	.loc 1 1895 0
 	cbnz	w0, .L582
 .LBB1669:
 .LBB1670:
@@ -5957,9 +5957,9 @@ ebc_probe:
 	ldp	x1, x2, [x29, 104]
 .LBE1670:
 .LBE1669:
-	.loc 1 1899 0
+	.loc 1 1900 0
 	str	x1, [x19, 184]
-	.loc 1 1902 0
+	.loc 1 1903 0
 	mov	x3, 1
 	mov	x0, x26
 .LBB1672:
@@ -5969,16 +5969,16 @@ ebc_probe:
 	sub	x2, x2, x1
 .LBE1671:
 .LBE1672:
-	.loc 1 1900 0
+	.loc 1 1901 0
 	str	w2, [x21, 16]
-	.loc 1 1902 0
+	.loc 1 1903 0
 	sxtw	x2, w2
 	bl	devm_memremap
 .LVL506:
 	str	x0, [x21, 8]
-	.loc 1 1904 0
+	.loc 1 1905 0
 	cbz	x0, .L509
-	.loc 1 1912 0
+	.loc 1 1913 0
 	mov	x1, x0
 	ldr	w2, [x21, 16]
 	ldr	x0, [x19, 184]
@@ -5986,11 +5986,11 @@ ebc_probe:
 	mov	w3, 2097152
 	bl	ebc_buf_init
 .LVL507:
-	.loc 1 1913 0
+	.loc 1 1914 0
 	cbnz	w0, .L509
-	.loc 1 1918 0
-	ldr	x0, [x21, 8]
 	.loc 1 1919 0
+	ldr	x0, [x21, 8]
+	.loc 1 1920 0
 	mov	x5, 1048576
 	str	x5, [x22, 40]
 .LBB1673:
@@ -5999,13 +5999,13 @@ ebc_probe:
 	mov	w2, 32960
 .LBE1674:
 .LBE1673:
-	.loc 1 1918 0
+	.loc 1 1919 0
 	add	x6, x0, 10485760
 	str	x6, [x22, 24]
 	add	x4, x0, 11534336
-	.loc 1 1924 0
+	.loc 1 1925 0
 	add	x1, x0, 12582912
-	.loc 1 1920 0
+	.loc 1 1921 0
 	ldr	x3, [x19, 184]
 .LBB1678:
 .LBB1675:
@@ -6014,18 +6014,18 @@ ebc_probe:
 	mov	x0, x26
 .LBE1675:
 .LBE1678:
-	.loc 1 1920 0
+	.loc 1 1921 0
 	add	x7, x3, 10485760
 	str	x7, [x22, 32]
-	.loc 1 1921 0
+	.loc 1 1922 0
 	str	x6, [x21, 168]
-	.loc 1 1920 0
+	.loc 1 1921 0
 	add	x3, x3, 11534336
-	.loc 1 1919 0
-	str	x5, [x22, 64]
 	.loc 1 1920 0
+	str	x5, [x22, 64]
+	.loc 1 1921 0
 	stp	x4, x3, [x22, 48]
-	.loc 1 1924 0
+	.loc 1 1925 0
 	str	x1, [x21, 112]
 .LBB1679:
 .LBB1676:
@@ -6033,7 +6033,7 @@ ebc_probe:
 	ldrsw	x1, [x21, 20]
 .LBE1676:
 .LBE1679:
-	.loc 1 1921 0
+	.loc 1 1922 0
 	str	x4, [x21, 176]
 .LBB1680:
 .LBB1677:
@@ -6042,9 +6042,9 @@ ebc_probe:
 .LVL508:
 .LBE1677:
 .LBE1680:
-	.loc 1 1927 0
-	str	x0, [x21, 128]
 	.loc 1 1928 0
+	str	x0, [x21, 128]
+	.loc 1 1929 0
 	cbz	x0, .L509
 .LBB1681:
 .LBB1682:
@@ -6057,9 +6057,9 @@ ebc_probe:
 .LVL509:
 .LBE1682:
 .LBE1681:
-	.loc 1 1930 0
-	str	x0, [x21, 136]
 	.loc 1 1931 0
+	str	x0, [x21, 136]
+	.loc 1 1932 0
 	cbz	x0, .L509
 .LBB1683:
 .LBB1684:
@@ -6072,11 +6072,11 @@ ebc_probe:
 .LVL510:
 .LBE1684:
 .LBE1683:
-	.loc 1 1933 0
-	str	x0, [x21, 144]
 	.loc 1 1934 0
+	str	x0, [x21, 144]
+	.loc 1 1935 0
 	cbz	x0, .L509
-	.loc 1 1941 0
+	.loc 1 1942 0
 	ldp	w1, w0, [x22, 84]
 .LBB1685:
 .LBB1686:
@@ -6089,17 +6089,17 @@ ebc_probe:
 .LVL511:
 .LBE1686:
 .LBE1685:
-	.loc 1 1941 0
-	str	x0, [x21, 152]
 	.loc 1 1942 0
+	str	x0, [x21, 152]
+	.loc 1 1943 0
 	cbz	x0, .L509
-	.loc 1 1944 0
+	.loc 1 1945 0
 	ldp	w2, w1, [x22, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
 .LVL512:
-	.loc 1 1945 0
+	.loc 1 1946 0
 	ldrsw	x2, [x21, 20]
 	mov	w1, 255
 	ldr	x0, [x21, 144]
@@ -6109,51 +6109,51 @@ ebc_probe:
 .LBE1693:
 .LBB1694:
 .LBB1695:
-	.loc 1 1839 0
+	.loc 1 1840 0
 	ldr	x26, [x19, 272]
 .LVL514:
-	.loc 1 1845 0
-	adrp	x1, .LC36
+	.loc 1 1846 0
+	adrp	x1, .LC37
 	mov	w2, 0
-	add	x1, x1, :lo12:.LC36
+	add	x1, x1, :lo12:.LC37
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL515:
-	.loc 1 1846 0
+	.loc 1 1847 0
 	cbz	x0, .L539
-	.loc 1 1849 0
+	.loc 1 1850 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL516:
 	mov	w24, w0
-	.loc 1 1851 0
+	.loc 1 1852 0
 	cbz	w0, .L583
 .L510:
 .LBE1695:
 .LBE1694:
-	.loc 1 2167 0
-	adrp	x1, .LC69
+	.loc 1 2168 0
+	adrp	x1, .LC70
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC69
+	add	x1, x1, :lo12:.LC70
 	bl	_dev_err
 .LVL517:
-	.loc 1 2168 0
+	.loc 1 2169 0
 	b	.L492
 .LVL518:
 	.p2align 3
 .L501:
-	.loc 1 2149 0
+	.loc 1 2150 0
 	mov	w24, -22
-	.loc 1 2148 0
-	adrp	x1, .LC73
+	.loc 1 2149 0
+	adrp	x1, .LC74
 	mov	w2, w24
-	add	x1, x1, :lo12:.LC73
+	add	x1, x1, :lo12:.LC74
 	mov	x0, x20
 	bl	_dev_err
 .LVL519:
 .L492:
-	.loc 1 2192 0
+	.loc 1 2193 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w24
 .LVL520:
@@ -6191,29 +6191,29 @@ ebc_probe:
 	.cfi_restore_state
 .LBB1702:
 .LBB1689:
-	.loc 1 1895 0
-	adrp	x1, .LC35
+	.loc 1 1896 0
+	adrp	x1, .LC36
 	mov	x0, x26
-	add	x1, x1, :lo12:.LC35
+	add	x1, x1, :lo12:.LC36
 	bl	_dev_err
 .LVL525:
 .L506:
 .LBE1689:
 .LBE1702:
-	.loc 1 2160 0
-	adrp	x1, .LC68
+	.loc 1 2161 0
+	adrp	x1, .LC69
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC68
+	add	x1, x1, :lo12:.LC69
 	bl	_dev_err
 .LVL526:
-	.loc 1 2161 0
+	.loc 1 2162 0
 	b	.L492
 .LVL527:
 	.p2align 3
 .L505:
 .LBB1703:
 .LBB1663:
-	.loc 1 1488 0
+	.loc 1 1489 0
 	str	wzr, [x22, 96]
 	b	.L531
 	.p2align 3
@@ -6223,11 +6223,11 @@ ebc_probe:
 .LBB1648:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC33
+	adrp	x1, .LC34
 .LBE1648:
 .LBE1650:
 .LBE1652:
-	.loc 1 1485 0
+	.loc 1 1486 0
 	str	wzr, [x22, 92]
 .LBB1653:
 .LBB1651:
@@ -6236,7 +6236,7 @@ ebc_probe:
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 120
-	add	x1, x1, :lo12:.LC33
+	add	x1, x1, :lo12:.LC34
 	bl	of_property_read_variable_u32_array
 .LVL528:
 	.loc 14 501 0
@@ -6252,11 +6252,11 @@ ebc_probe:
 .LBB1641:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC32
+	adrp	x1, .LC33
 .LBE1641:
 .LBE1643:
 .LBE1654:
-	.loc 1 1482 0
+	.loc 1 1483 0
 	str	wzr, [x22, 156]
 .LBB1655:
 .LBB1644:
@@ -6265,7 +6265,7 @@ ebc_probe:
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 116
-	add	x1, x1, :lo12:.LC32
+	add	x1, x1, :lo12:.LC33
 	bl	of_property_read_variable_u32_array
 .LVL529:
 	.loc 14 501 0
@@ -6281,11 +6281,11 @@ ebc_probe:
 .LBB1634:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC31
+	adrp	x1, .LC32
 .LBE1634:
 .LBE1636:
 .LBE1656:
-	.loc 1 1479 0
+	.loc 1 1480 0
 	str	wzr, [x22, 152]
 .LBB1657:
 .LBB1637:
@@ -6294,7 +6294,7 @@ ebc_probe:
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 180
-	add	x1, x1, :lo12:.LC31
+	add	x1, x1, :lo12:.LC32
 	bl	of_property_read_variable_u32_array
 .LVL530:
 	.loc 14 501 0
@@ -6310,11 +6310,11 @@ ebc_probe:
 .LBB1627:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC30
+	adrp	x1, .LC31
 .LBE1627:
 .LBE1629:
 .LBE1658:
-	.loc 1 1476 0
+	.loc 1 1477 0
 	str	wzr, [x22, 148]
 .LBB1659:
 .LBB1630:
@@ -6323,7 +6323,7 @@ ebc_probe:
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 176
-	add	x1, x1, :lo12:.LC30
+	add	x1, x1, :lo12:.LC31
 	bl	of_property_read_variable_u32_array
 .LVL531:
 	.loc 14 501 0
@@ -6339,7 +6339,7 @@ ebc_probe:
 .LBE1703:
 .LBB1704:
 .LBB1698:
-	.loc 1 1857 0
+	.loc 1 1858 0
 	mov	x0, x26
 	mov	x3, 1
 .LBB1696:
@@ -6351,28 +6351,28 @@ ebc_probe:
 	sub	x26, x26, x1
 .LBE1697:
 .LBE1696:
-	.loc 1 1857 0
+	.loc 1 1858 0
 	sxtw	x2, w26
 	bl	devm_memremap
 .LVL534:
 	str	x0, [x19, 376]
-	.loc 1 1859 0
+	.loc 1 1860 0
 	cbz	x0, .L585
-	.loc 1 1864 0
+	.loc 1 1865 0
 	bl	epd_lut_from_mem_init
 .LVL535:
-	.loc 1 1865 0
+	.loc 1 1866 0
 	tbnz	w0, #31, .L586
 .L512:
 .LBE1698:
 .LBE1704:
 .LBB1705:
 .LBB1706:
-	.loc 1 1954 0
+	.loc 1 1955 0
 	add	x0, x19, 736
 	mov	x1, 68719476704
 	str	x1, [x21, 544]
-	.loc 1 1956 0
+	.loc 1 1957 0
 	add	x25, x25, :lo12:.LANCHOR0
 .LBB1707:
 .LBB1708:
@@ -6386,7 +6386,7 @@ ebc_probe:
 .LBE1709:
 .LBE1708:
 .LBE1707:
-	.loc 1 1952 0
+	.loc 1 1953 0
 	mov	w26, 99
 .LBB1713:
 .LBB1712:
@@ -6395,32 +6395,32 @@ ebc_probe:
 	str	x0, [x0, 8]
 .LBE1712:
 .LBE1713:
-	.loc 1 1954 0
+	.loc 1 1955 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x21, 568]
-	.loc 1 1956 0
-	adrp	x3, .LC70
+	.loc 1 1957 0
+	adrp	x3, .LC71
 	mov	w2, -1
-	add	x3, x3, :lo12:.LC70
+	add	x3, x3, :lo12:.LC71
 	mov	x1, x21
 	adrp	x0, ebc_auto_tast_function
-	.loc 1 1952 0
+	.loc 1 1953 0
 	str	w26, [x29, 104]
-	.loc 1 1956 0
+	.loc 1 1957 0
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
 .LVL536:
 	str	x0, [x25, 8]
-	.loc 1 1957 0
+	.loc 1 1958 0
 	cmn	x0, #4096
 	bhi	.L587
-	.loc 1 1961 0
+	.loc 1 1962 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
 .LVL537:
-	.loc 1 1962 0
+	.loc 1 1963 0
 	ldr	x2, [x25, 8]
 .LBB1714:
 .LBB1715:
@@ -6462,19 +6462,19 @@ ebc_probe:
 .LBE1715:
 .LBE1714:
 .LBB1716:
-	.loc 1 1965 0
-	adrp	x3, .LC41
+	.loc 1 1966 0
+	adrp	x3, .LC42
 	adrp	x0, ebc_thread
 .LVL541:
-	add	x3, x3, :lo12:.LC41
+	add	x3, x3, :lo12:.LC42
 	mov	w2, -1
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x21
 .LBE1716:
-	.loc 1 1964 0
+	.loc 1 1965 0
 	str	w26, [x29, 104]
 .LBB1717:
-	.loc 1 1965 0
+	.loc 1 1966 0
 	bl	kthread_create_on_node
 .LVL542:
 	mov	x25, x0
@@ -6485,13 +6485,13 @@ ebc_probe:
 .LVL544:
 .LBE1717:
 	str	x25, [x21, 120]
-	.loc 1 1970 0
+	.loc 1 1971 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x25
 	bl	sched_setscheduler_nocheck
 .LVL545:
-	.loc 1 1971 0
+	.loc 1 1972 0
 	ldr	x2, [x21, 120]
 .LBB1718:
 .LBB1719:
@@ -6535,7 +6535,7 @@ ebc_probe:
 .LBE1705:
 .LBB1722:
 .LBB1723:
-	.loc 1 1980 0
+	.loc 1 1981 0
 	mov	w0, -1
 .LVL549:
 	str	w0, [x21, 48]
@@ -6546,32 +6546,32 @@ ebc_probe:
 .LVL550:
 .LBE1725:
 .LBE1724:
-	.loc 1 1984 0
+	.loc 1 1985 0
 	str	wzr, [x21, 28]
-	.loc 1 1983 0
+	.loc 1 1984 0
 	str	wzr, [x21, 80]
 .LBB1730:
 .LBB1726:
 	.loc 4 43 0
-	adrp	x1, .LC42
+	adrp	x1, .LC43
 .LBE1726:
 .LBE1730:
-	.loc 1 1979 0
+	.loc 1 1980 0
 	str	wzr, [x21, 184]
 .LBB1731:
 .LBB1727:
 	.loc 4 43 0
-	add	x1, x1, :lo12:.LC42
+	add	x1, x1, :lo12:.LC43
 .LBE1727:
 .LBE1731:
-	.loc 1 1981 0
+	.loc 1 1982 0
 	str	wzr, [x21, 592]
-	.loc 1 1991 0
+	.loc 1 1992 0
 	add	x25, x19, 616
 .LVL551:
-	.loc 1 1982 0
+	.loc 1 1983 0
 	str	wzr, [x21, 596]
-	.loc 1 1992 0
+	.loc 1 1993 0
 	adrp	x26, jiffies
 .LBB1732:
 .LBB1728:
@@ -6579,7 +6579,7 @@ ebc_probe:
 	stp	xzr, xzr, [x0]
 .LBE1728:
 .LBE1732:
-	.loc 1 1992 0
+	.loc 1 1993 0
 	mov	x27, 268435455
 .LBB1733:
 .LBB1729:
@@ -6603,9 +6603,9 @@ ebc_probe:
 .LVL552:
 .LBE1729:
 .LBE1733:
-	.loc 1 1988 0
+	.loc 1 1989 0
 	str	wzr, [x21, 424]
-	.loc 1 1991 0
+	.loc 1 1992 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -6614,16 +6614,16 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
 .LVL553:
-	.loc 1 1992 0
+	.loc 1 1993 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
-	.loc 1 1995 0
+	.loc 1 1996 0
 	add	x25, x19, 672
-	.loc 1 1992 0
+	.loc 1 1993 0
 	add	x1, x1, x27
 	bl	mod_timer
 .LVL554:
-	.loc 1 1995 0
+	.loc 1 1996 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -6632,7 +6632,7 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
 .LVL555:
-	.loc 1 1996 0
+	.loc 1 1997 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
 	add	x1, x1, x27
@@ -6642,99 +6642,99 @@ ebc_probe:
 .LBE1722:
 .LBB1734:
 .LBB1735:
-	.loc 1 2006 0
+	.loc 1 2007 0
 	adrp	x0, saved_command_line
-	adrp	x1, .LC43
-	.loc 1 2003 0
+	adrp	x1, .LC44
+	.loc 1 2004 0
 	stp	wzr, wzr, [x29, 100]
 .LVL557:
-	.loc 1 2006 0
-	add	x1, x1, :lo12:.LC43
+	.loc 1 2007 0
+	add	x1, x1, :lo12:.LC44
 	ldr	x25, [x0, #:lo12:saved_command_line]
 	mov	x0, x25
 	bl	strstr
 .LVL558:
+	.loc 1 2008 0
+	adrp	x1, .LC45
 	.loc 1 2007 0
-	adrp	x1, .LC44
-	.loc 1 2006 0
 	mov	x26, x0
 .LVL559:
-	.loc 1 2007 0
-	add	x1, x1, :lo12:.LC44
+	.loc 1 2008 0
+	add	x1, x1, :lo12:.LC45
 	mov	x0, x25
 	bl	strstr
 .LVL560:
 	mov	x28, x0
 .LVL561:
-	.loc 1 2012 0
-	cbz	x26, .L515
 	.loc 1 2013 0
+	cbz	x26, .L515
+	.loc 1 2014 0
 	add	x2, x29, 100
-	adrp	x1, .LC45
+	adrp	x1, .LC46
 	mov	x0, x26
-	add	x1, x1, :lo12:.LC45
+	add	x1, x1, :lo12:.LC46
 	bl	sscanf
 .LVL562:
-	.loc 1 2014 0
+	.loc 1 2015 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
 	bls	.L588
 .L515:
-	.loc 1 2026 0
+	.loc 1 2027 0
 	mov	w25, 0
 .LVL563:
 	mov	x27, 0
 .LVL564:
-	.loc 1 2010 0
+	.loc 1 2011 0
 	mov	x26, 0
 .LVL565:
-	.loc 1 2026 0
+	.loc 1 2027 0
 	cbz	x28, .L535
 .LVL566:
 .L534:
-	.loc 1 2027 0
+	.loc 1 2028 0
 	add	x2, x29, 104
 	mov	x0, x28
-	adrp	x1, .LC48
-	add	x1, x1, :lo12:.LC48
+	adrp	x1, .LC49
+	add	x1, x1, :lo12:.LC49
 	bl	sscanf
 .LVL567:
-	.loc 1 2005 0
+	.loc 1 2006 0
 	mov	w28, 0
 .LVL568:
-	.loc 1 2028 0
+	.loc 1 2029 0
 	ldr	w2, [x29, 104]
-	.loc 1 2010 0
+	.loc 1 2011 0
 	mov	x26, 0
 .LVL569:
-	.loc 1 2028 0
+	.loc 1 2029 0
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
 	bls	.L589
 .L519:
-	.loc 1 2040 0
+	.loc 1 2041 0
 	cbnz	w25, .L518
 .LVL570:
 .L535:
-	.loc 1 2041 0
+	.loc 1 2042 0
 	ldr	x0, [x21, 88]
-	adrp	x1, .LC51
-	add	x1, x1, :lo12:.LC51
+	adrp	x1, .LC52
+	add	x1, x1, :lo12:.LC52
 	bl	_dev_info
 .LVL571:
-	.loc 1 2042 0
+	.loc 1 2043 0
 	ldr	x0, [x19, 16]
 	bl	ebc_pmic_verity_vcom
 .LVL572:
 .LBB1736:
 .LBB1737:
-	.loc 1 1396 0
+	.loc 1 1397 0
 	bl	ebc_empty_buf_get
 .LVL573:
 	mov	x25, x0
 .LVL574:
-	.loc 1 1397 0
+	.loc 1 1398 0
 	ldp	w2, w0, [x19, 108]
 	mov	w1, 255
 	mul	w2, w2, w0
@@ -6742,43 +6742,43 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memset
 .LVL575:
-	.loc 1 1400 0
+	.loc 1 1401 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1398 0
+	.loc 1 1399 0
 	mov	w0, 16
 	str	w0, [x25, 40]
-	.loc 1 1403 0
+	.loc 1 1404 0
 	mov	x0, x25
-	.loc 1 1401 0
+	.loc 1 1402 0
 	ldr	w1, [x19, 108]
 	str	w1, [x25, 56]
-	.loc 1 1402 0
+	.loc 1 1403 0
 	ldr	w1, [x19, 112]
 	str	w1, [x25, 60]
-	.loc 1 1403 0
+	.loc 1 1404 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL576:
 .L521:
 .LBE1737:
 .LBE1736:
-	.loc 1 2059 0
+	.loc 1 2060 0
 	cbnz	w28, .L590
 .L523:
-	.loc 1 2072 0
+	.loc 1 2073 0
 	ldr	w0, [x21, 80]
 	adrp	x22, .LANCHOR1
 	cbz	w0, .L591
 .L525:
-	.loc 1 2077 0
-	cbz	x27, .L526
 	.loc 1 2078 0
+	cbz	x27, .L526
+	.loc 1 2079 0
 	mov	x0, x27
 	bl	kfree
 .LVL577:
 .L526:
-	.loc 1 2079 0
-	cbz	x26, .L517
 	.loc 1 2080 0
+	cbz	x26, .L517
+	.loc 1 2081 0
 	mov	x0, x26
 	bl	kfree
 .LVL578:
@@ -6795,65 +6795,65 @@ ebc_probe:
 .LBE1747:
 .LBB1750:
 .LBB1751:
-	.loc 1 1824 0
+	.loc 1 1825 0
 	add	x22, x22, :lo12:.LANCHOR1
 	add	x0, x22, 224
 	bl	misc_register
 .LVL579:
-	.loc 1 1826 0
+	.loc 1 1827 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 400
 	bl	device_create_file
 .LVL580:
-	.loc 1 1827 0
+	.loc 1 1828 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 432
 	bl	device_create_file
 .LVL581:
-	.loc 1 1828 0
+	.loc 1 1829 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 464
 	bl	device_create_file
 .LVL582:
-	.loc 1 1829 0
+	.loc 1 1830 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 496
 	bl	device_create_file
 .LVL583:
-	.loc 1 1830 0
+	.loc 1 1831 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 528
 	bl	device_create_file
 .LVL584:
-	.loc 1 1831 0
+	.loc 1 1832 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 560
 	bl	device_create_file
 .LVL585:
 .LBE1751:
 .LBE1750:
-	.loc 1 2189 0
+	.loc 1 2190 0
 	ldr	x0, [x21, 88]
-	adrp	x2, .LC15
-	adrp	x1, .LC52
-	add	x2, x2, :lo12:.LC15
-	add	x1, x1, :lo12:.LC52
+	adrp	x2, .LC16
+	adrp	x1, .LC53
+	add	x2, x2, :lo12:.LC16
+	add	x1, x1, :lo12:.LC53
 	bl	_dev_info
 .LVL586:
-	.loc 1 2191 0
+	.loc 1 2192 0
 	b	.L492
 .LVL587:
 	.p2align 3
 .L588:
 .LBB1752:
 .LBB1744:
-	.loc 1 2016 0
+	.loc 1 2017 0
 	ldr	x0, [x21, 88]
-	adrp	x1, .LC46
-	add	x1, x1, :lo12:.LC46
+	adrp	x1, .LC47
+	add	x1, x1, :lo12:.LC47
 	bl	_dev_info
 .LVL588:
-	.loc 1 2017 0
+	.loc 1 2018 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
 .LBB1738:
@@ -6871,9 +6871,9 @@ ebc_probe:
 .LBE1740:
 .LBE1739:
 .LBE1738:
-	.loc 1 2018 0
+	.loc 1 2019 0
 	cbz	x0, .L592
-	.loc 1 2022 0
+	.loc 1 2023 0
 	ldp	w2, w1, [x22, 84]
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
@@ -6886,23 +6886,23 @@ ebc_probe:
 	add	x1, x3, x1
 	bl	memcpy
 .LVL593:
-	.loc 1 2026 0
+	.loc 1 2027 0
 	cbnz	x28, .L593
-	.loc 1 2005 0
+	.loc 1 2006 0
 	mov	w28, 0
 .LVL594:
-	.loc 1 2010 0
+	.loc 1 2011 0
 	mov	x26, 0
 .LVL595:
 .L518:
-	.loc 1 2047 0
+	.loc 1 2048 0
 	bl	ebc_empty_buf_get
 .LVL596:
 	mov	x25, x0
 .LVL597:
-	.loc 1 2048 0
-	cbz	x0, .L521
 	.loc 1 2049 0
+	cbz	x0, .L521
+	.loc 1 2050 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
@@ -6910,30 +6910,30 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL598:
-	.loc 1 2052 0
+	.loc 1 2053 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 2050 0
+	.loc 1 2051 0
 	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 2055 0
+	.loc 1 2056 0
 	mov	x0, x25
-	.loc 1 2053 0
+	.loc 1 2054 0
 	ldr	w1, [x22, 84]
 	str	w1, [x25, 56]
-	.loc 1 2054 0
+	.loc 1 2055 0
 	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 2055 0
+	.loc 1 2056 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL599:
 	b	.L521
 .LVL600:
 	.p2align 3
 .L591:
-	.loc 1 2073 0
+	.loc 1 2074 0
 	mov	w2, 1
 	str	w2, [x21, 80]
-	.loc 1 2074 0
+	.loc 1 2075 0
 	add	x0, x22, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
@@ -6943,13 +6943,13 @@ ebc_probe:
 .LVL602:
 	.p2align 3
 .L589:
-	.loc 1 2030 0
+	.loc 1 2031 0
 	ldr	x0, [x21, 88]
-	adrp	x1, .LC49
-	add	x1, x1, :lo12:.LC49
+	adrp	x1, .LC50
+	add	x1, x1, :lo12:.LC50
 	bl	_dev_info
 .LVL603:
-	.loc 1 2031 0
+	.loc 1 2032 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
 .LBB1741:
@@ -6965,13 +6965,13 @@ ebc_probe:
 .LBE1743:
 .LBE1742:
 .LBE1741:
-	.loc 1 2032 0
+	.loc 1 2033 0
 	cbz	x0, .L594
-	.loc 1 2036 0
+	.loc 1 2037 0
 	ldp	w2, w1, [x22, 84]
-	.loc 1 2029 0
+	.loc 1 2030 0
 	mov	w28, 1
-	.loc 1 2036 0
+	.loc 1 2037 0
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
@@ -6991,7 +6991,7 @@ ebc_probe:
 .LBE1752:
 .LBB1753:
 .LBB1690:
-	.loc 1 1905 0
+	.loc 1 1906 0
 	mov	w24, -12
 	b	.L506
 .LVL609:
@@ -7001,14 +7001,14 @@ ebc_probe:
 .LBE1753:
 .LBB1754:
 .LBB1745:
-	.loc 1 2060 0
+	.loc 1 2061 0
 	bl	ebc_empty_buf_get
 .LVL610:
 	mov	x25, x0
 .LVL611:
-	.loc 1 2061 0
-	cbz	x0, .L523
 	.loc 1 2062 0
+	cbz	x0, .L523
+	.loc 1 2063 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
@@ -7016,20 +7016,20 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL612:
-	.loc 1 2065 0
+	.loc 1 2066 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 2063 0
+	.loc 1 2064 0
 	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 2066 0
+	.loc 1 2067 0
 	ldr	w0, [x22, 84]
 	str	w0, [x25, 56]
-	.loc 1 2068 0
+	.loc 1 2069 0
 	mov	x0, x25
-	.loc 1 2067 0
+	.loc 1 2068 0
 	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 2068 0
+	.loc 1 2069 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL613:
 	b	.L523
@@ -7040,27 +7040,27 @@ ebc_probe:
 .LBE1754:
 .LBB1755:
 .LBB1699:
-	.loc 1 1866 0
+	.loc 1 1867 0
 	ldr	x0, [x19, 272]
-	adrp	x1, .LC38
-	add	x1, x1, :lo12:.LC38
+	adrp	x1, .LC39
+	add	x1, x1, :lo12:.LC39
 	bl	_dev_err
 .LVL615:
-	.loc 1 1867 0
+	.loc 1 1868 0
 	ldr	x0, [x19, 272]
 	mov	w2, w26
 	ldr	x1, [x19, 376]
 	bl	epd_lut_from_file_init
 .LVL616:
-	.loc 1 1868 0
-	tbz	w0, #31, .L512
 	.loc 1 1869 0
-	ldr	x0, [x19, 272]
-	adrp	x1, .LC39
+	tbz	w0, #31, .L512
 	.loc 1 1870 0
+	ldr	x0, [x19, 272]
+	adrp	x1, .LC40
+	.loc 1 1871 0
 	mov	w24, -1
-	.loc 1 1869 0
-	add	x1, x1, :lo12:.LC39
+	.loc 1 1870 0
+	add	x1, x1, :lo12:.LC40
 	bl	_dev_err
 .LVL617:
 	b	.L510
@@ -7069,7 +7069,7 @@ ebc_probe:
 .L496:
 .LBE1699:
 .LBE1755:
-	.loc 1 2113 0
+	.loc 1 2114 0
 	mov	w24, -517
 	b	.L492
 .LVL619:
@@ -7077,39 +7077,39 @@ ebc_probe:
 .L587:
 .LBB1756:
 .LBB1720:
-	.loc 1 1958 0
+	.loc 1 1959 0
 	ldr	x0, [x21, 88]
-	adrp	x1, .LC40
-	add	x1, x1, :lo12:.LC40
+	adrp	x1, .LC41
+	add	x1, x1, :lo12:.LC41
 	bl	_dev_err
 .LVL620:
 .L513:
 .LBE1720:
 .LBE1756:
-	.loc 1 2174 0
-	adrp	x1, .LC72
-	mov	x0, x20
-	add	x1, x1, :lo12:.LC72
 	.loc 1 2175 0
+	adrp	x1, .LC73
+	mov	x0, x20
+	add	x1, x1, :lo12:.LC73
+	.loc 1 2176 0
 	mov	w24, -1
-	.loc 1 2174 0
+	.loc 1 2175 0
 	bl	_dev_err
 .LVL621:
-	.loc 1 2175 0
+	.loc 1 2176 0
 	b	.L492
 .LVL622:
 	.p2align 3
 .L514:
 .LBB1757:
 .LBB1721:
-	.loc 1 1967 0
+	.loc 1 1968 0
 	ldr	x0, [x21, 88]
 .LVL623:
-	adrp	x1, .LC71
-	.loc 1 1965 0
+	adrp	x1, .LC72
+	.loc 1 1966 0
 	str	x25, [x21, 120]
-	.loc 1 1967 0
-	add	x1, x1, :lo12:.LC71
+	.loc 1 1968 0
+	add	x1, x1, :lo12:.LC72
 	bl	_dev_err
 .LVL624:
 	b	.L513
@@ -7118,7 +7118,7 @@ ebc_probe:
 .L537:
 .LBE1721:
 .LBE1757:
-	.loc 1 2099 0
+	.loc 1 2100 0
 	mov	w24, -12
 	b	.L492
 .LVL626:
@@ -7126,86 +7126,86 @@ ebc_probe:
 .L538:
 .LBB1758:
 .LBB1691:
-	.loc 1 1890 0
+	.loc 1 1891 0
 	mov	w24, -19
 	b	.L506
 .LVL627:
 .L577:
 .LBE1691:
 .LBE1758:
-	.loc 1 2106 0
-	adrp	x1, .LC24
-	mov	x0, x20
-	add	x1, x1, :lo12:.LC24
 	.loc 1 2107 0
+	adrp	x1, .LC25
+	mov	x0, x20
+	add	x1, x1, :lo12:.LC25
+	.loc 1 2108 0
 	mov	w24, -19
-	.loc 1 2106 0
+	.loc 1 2107 0
 	bl	_dev_err
 .LVL628:
-	.loc 1 2107 0
+	.loc 1 2108 0
 	b	.L492
 .L580:
-	.loc 1 2134 0
-	adrp	x1, .LC28
-	mov	x0, x20
-	add	x1, x1, :lo12:.LC28
 	.loc 1 2135 0
+	adrp	x1, .LC29
+	mov	x0, x20
+	add	x1, x1, :lo12:.LC29
+	.loc 1 2136 0
 	mov	w24, -517
-	.loc 1 2134 0
+	.loc 1 2135 0
 	bl	_dev_err
 .LVL629:
-	.loc 1 2135 0
+	.loc 1 2136 0
 	b	.L492
 .L578:
-	.loc 1 2122 0
-	adrp	x1, .LC26
-	mov	x0, x20
-	add	x1, x1, :lo12:.LC26
 	.loc 1 2123 0
+	adrp	x1, .LC27
+	mov	x0, x20
+	add	x1, x1, :lo12:.LC27
+	.loc 1 2124 0
 	mov	w24, -19
-	.loc 1 2122 0
+	.loc 1 2123 0
 	bl	_dev_err
 .LVL630:
-	.loc 1 2123 0
+	.loc 1 2124 0
 	b	.L492
 .LVL631:
 .L539:
 .LBB1759:
 .LBB1700:
-	.loc 1 1847 0
+	.loc 1 1848 0
 	mov	w24, -19
 	b	.L510
 .LVL632:
 .L579:
 .LBE1700:
 .LBE1759:
-	.loc 1 2129 0
-	adrp	x1, .LC27
+	.loc 1 2130 0
+	adrp	x1, .LC28
 	mov	x0, x20
 .LVL633:
-	add	x1, x1, :lo12:.LC27
-	.loc 1 2130 0
+	add	x1, x1, :lo12:.LC28
+	.loc 1 2131 0
 	mov	w24, -517
-	.loc 1 2129 0
+	.loc 1 2130 0
 	bl	_dev_err
 .LVL634:
-	.loc 1 2130 0
+	.loc 1 2131 0
 	b	.L492
 .LVL635:
 .L585:
 .LBB1760:
 .LBB1701:
-	.loc 1 1860 0
+	.loc 1 1861 0
 	ldr	x0, [x19, 272]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
-	adrp	x1, .LC37
-	mov	w3, 1860
+	adrp	x1, .LC38
+	mov	w3, 1861
 	add	x2, x2, 32
-	add	x1, x1, :lo12:.LC37
-	.loc 1 1861 0
+	add	x1, x1, :lo12:.LC38
+	.loc 1 1862 0
 	mov	w24, -12
-	.loc 1 1860 0
+	.loc 1 1861 0
 	bl	_dev_err
 .LVL636:
 	b	.L510
@@ -7213,35 +7213,35 @@ ebc_probe:
 .L584:
 .LBE1701:
 .LBE1760:
-	.loc 1 2192 0
+	.loc 1 2193 0
 	bl	__stack_chk_fail
 .LVL638:
 .L594:
 .LBB1761:
 .LBB1746:
-	.loc 1 2033 0
+	.loc 1 2034 0
 	ldr	x0, [x21, 88]
 .LVL639:
-	adrp	x1, .LC50
+	adrp	x1, .LC51
 	adrp	x22, .LANCHOR1
-	add	x1, x1, :lo12:.LC50
+	add	x1, x1, :lo12:.LC51
 	bl	_dev_err
 .LVL640:
 	b	.L517
 .LVL641:
 .L592:
-	.loc 1 2019 0
+	.loc 1 2020 0
 	ldr	x0, [x21, 88]
 .LVL642:
-	adrp	x1, .LC47
+	adrp	x1, .LC48
 	adrp	x22, .LANCHOR1
-	add	x1, x1, :lo12:.LC47
+	add	x1, x1, :lo12:.LC48
 	bl	_dev_err
 .LVL643:
 	b	.L517
 .LVL644:
 .L593:
-	.loc 1 2015 0
+	.loc 1 2016 0
 	mov	w25, 1
 .LVL645:
 	b	.L534
@@ -7304,8 +7304,8 @@ ebc_power_set.constprop.12:
 .LBE1764:
 	.loc 1 193 0
 	ldr	x0, [x19]
-	adrp	x1, .LC74
-	add	x1, x1, :lo12:.LC74
+	adrp	x1, .LC75
+	add	x1, x1, :lo12:.LC75
 	bl	_dev_info
 .LVL650:
 	.loc 1 208 0
@@ -7780,9 +7780,6 @@ ebc_thread:
 	.loc 1 1093 0
 	adrp	x1, .LANCHOR0
 	.loc 1 1092 0
-	adrp	x0, __stack_chk_guard
-.LVL700:
-	add	x0, x0, :lo12:__stack_chk_guard
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -7791,61 +7788,61 @@ ebc_thread:
 	.cfi_offset 20, -200
 	.cfi_offset 21, -192
 	.cfi_offset 22, -184
-	adrp	x22, .LANCHOR1
+	adrp	x22, __stack_chk_guard
 	stp	x23, x24, [sp, 48]
+	adrp	x21, .LANCHOR1
+	.loc 1 1093 0
+	ldr	x20, [x1, #:lo12:.LANCHOR0]
+.LVL700:
+	.loc 1 1092 0
+	add	x0, x22, :lo12:__stack_chk_guard
+.LVL701:
+	stp	x25, x26, [sp, 64]
 .LBB1790:
 .LBB1791:
 .LBB1792:
-	.loc 1 1384 0
-	add	x22, x22, :lo12:.LANCHOR1
+	.loc 1 1385 0
+	add	x21, x21, :lo12:.LANCHOR1
 .LBE1792:
 .LBE1791:
 .LBE1790:
 	.loc 1 1092 0
 	stp	x27, x28, [sp, 80]
+	.cfi_offset 23, -176
+	.cfi_offset 24, -168
+	.cfi_offset 25, -160
+	.cfi_offset 26, -152
+	.cfi_offset 27, -144
+	.cfi_offset 28, -136
+	.loc 1 1094 0
+	add	x24, x20, 184
 .LBB1797:
 .LBB1795:
 .LBB1793:
-	.loc 1 1384 0
-	add	x19, x22, 304
+	.loc 1 1385 0
+	add	x19, x21, 304
 .LBE1793:
 .LBE1795:
 .LBE1797:
-	.loc 1 1093 0
-	ldr	x20, [x1, #:lo12:.LANCHOR0]
-.LVL701:
-	.cfi_offset 23, -176
-	.cfi_offset 24, -168
-	.cfi_offset 27, -144
-	.cfi_offset 28, -136
 	.loc 1 1097 0
-	mov	w24, 0
+	mov	w23, 0
 .LVL702:
-	.loc 1 1092 0
-	stp	x25, x26, [sp, 64]
-	.cfi_offset 25, -160
-	.cfi_offset 26, -152
-	.loc 1 1096 0
-	mov	w21, 0
-.LVL703:
-	.loc 1 1094 0
-	add	x28, x20, 184
 	.loc 1 1092 0
 	ldr	x1, [x0]
 	str	x1, [x29, 216]
 	mov	x1,0
-.LVL704:
+.LVL703:
 	.p2align 2
 .L655:
 	.loc 1 1102 0
-	ldr	w0, [x28, 600]
-.LVL705:
+	ldr	w0, [x24, 600]
+.LVL704:
 	cbnz	w0, .L784
 .L656:
 	.loc 1 1108 0
 	bl	ebc_dsp_buf_get
-.LVL706:
-	mov	x23, x0
+.LVL705:
+	mov	x28, x0
 	.loc 1 1110 0
 	cbz	x0, .L658
 	.loc 1 1110 0 is_stmt 0 discriminator 1
@@ -7856,7 +7853,7 @@ ebc_thread:
 	cmp	w1, 19
 	beq	.L785
 	.loc 1 1115 0
-	ldr	x2, [x28, 592]
+	ldr	x2, [x24, 592]
 	cbz	x2, .L661
 	.loc 1 1116 0
 	cmp	w1, 18
@@ -7864,39 +7861,37 @@ ebc_thread:
 .L777:
 	.loc 1 1174 0
 	bl	ebc_remove_from_dsp_buf_list
-.LVL707:
+.LVL706:
 	.loc 1 1175 0
-	mov	x0, x23
+	mov	x0, x28
 	bl	ebc_buf_release
-.LVL708:
+.LVL707:
 	.loc 1 1102 0
-	ldr	w0, [x28, 600]
+	ldr	w0, [x24, 600]
 	cbz	w0, .L656
 	.p2align 2
 .L784:
 	.loc 1 1103 0
-	ldr	w0, [x28, 184]
+	ldr	w0, [x24, 184]
 	cmp	w0, 1
 	beq	.L787
 .L657:
-	.loc 1 1390 0
-	adrp	x0, __stack_chk_guard
-	add	x23, x0, :lo12:__stack_chk_guard
-.LVL709:
+	.loc 1 1391 0
+	add	x22, x22, :lo12:__stack_chk_guard
+	mov	w0, 0
 	ldr	x2, [x29, 216]
-	ldr	x1, [x23]
+	ldr	x1, [x22]
 	eor	x1, x2, x1
-	mov	w0, 0
 	cbnz	x1, .L788
 	ldp	x19, x20, [sp, 16]
-.LVL710:
+.LVL708:
 	ldp	x21, x22, [sp, 32]
-.LVL711:
 	ldp	x23, x24, [sp, 48]
-.LVL712:
+.LVL709:
 	ldp	x25, x26, [sp, 64]
-.LVL713:
+.LVL710:
 	ldp	x27, x28, [sp, 80]
+.LVL711:
 	ldp	x29, x30, [sp], 224
 	.cfi_remember_state
 	.cfi_restore 30
@@ -7913,72 +7908,72 @@ ebc_thread:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL714:
+.LVL712:
 	.p2align 3
 .L658:
 	.cfi_restore_state
-	.loc 1 1371 0
-	ldr	w0, [x28, 28]
-.LVL715:
+	.loc 1 1372 0
+	ldr	w0, [x24, 28]
+.LVL713:
 	cmp	w0, 1
 	beq	.L789
-	.loc 1 1380 0
-	ldr	w0, [x28, 184]
+	.loc 1 1381 0
+	ldr	w0, [x24, 184]
 	cmp	w0, 1
 	beq	.L790
-.LVL716:
+.LVL714:
 .L780:
-	ldr	w0, [x28, 80]
-.LVL717:
-	.loc 1 1383 0
+	ldr	w0, [x24, 80]
+.LVL715:
+	.loc 1 1384 0
 	cbz	w0, .L791
 .L743:
-.LVL718:
+.LVL716:
 .L733:
-	.loc 1 1385 0
-	str	wzr, [x28, 80]
+	.loc 1 1386 0
+	str	wzr, [x24, 80]
 	b	.L655
-.LVL719:
+.LVL717:
 	.p2align 3
 .L791:
 .LBB1798:
 .LBB1796:
-	.loc 1 1384 0 discriminator 1
+	.loc 1 1385 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL720:
+.LVL718:
 	b	.L744
 	.p2align 3
 .L792:
-.LVL721:
+.LVL719:
 .LBB1794:
-	.loc 1 1384 0 is_stmt 0 discriminator 5
+	.loc 1 1385 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L733
-	.loc 1 1384 0 discriminator 7
+	.loc 1 1385 0 discriminator 7
 	bl	schedule
-.LVL722:
+.LVL720:
 .L744:
-	.loc 1 1384 0 discriminator 9
+	.loc 1 1385 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL723:
-	ldr	w1, [x28, 80]
+.LVL721:
+	ldr	w1, [x24, 80]
 	cbz	w1, .L792
 .LBE1794:
-	.loc 1 1384 0 discriminator 4
+	.loc 1 1385 0 discriminator 4
 	add	x1, x29, 112
 	mov	x0, x19
 	bl	finish_wait
-.LVL724:
+.LVL722:
 .LBE1796:
 .LBE1798:
-	.loc 1 1385 0 is_stmt 1 discriminator 4
-	str	wzr, [x28, 80]
+	.loc 1 1386 0 is_stmt 1 discriminator 4
+	str	wzr, [x24, 80]
 	b	.L655
-.LVL725:
+.LVL723:
 	.p2align 3
 .L661:
 	.loc 1 1128 0
@@ -7986,290 +7981,295 @@ ebc_thread:
 	beq	.L793
 	.loc 1 1132 0
 	cmp	w1, 20
-	ldr	w0, [x28, 608]
-.LVL726:
+	ldr	w0, [x24, 608]
+.LVL724:
 	ccmp	w1, 1, 4, ne
 	ccmp	w0, 0, 4, ne
 	beq	.L660
 	.loc 1 1133 0
-	add	x25, x22, 592
-.LVL727:
+	add	x25, x21, 592
+.LVL725:
 	mov	x0, x25
 	bl	down_write
-.LVL728:
+.LVL726:
 	.loc 1 1134 0
-	ldrsw	x2, [x28, 20]
-	ldr	x1, [x23, 16]
-	ldr	x0, [x28, 144]
+	ldrsw	x2, [x24, 20]
+	ldr	x1, [x28, 16]
+	ldr	x0, [x24, 144]
 	bl	memcpy
-.LVL729:
+.LVL727:
 	.loc 1 1135 0
-	mov	x0, x23
+	mov	x0, x28
 	bl	ebc_remove_from_dsp_buf_list
-.LVL730:
+.LVL728:
 	.loc 1 1136 0
-	mov	x0, x23
+	mov	x0, x28
 	bl	ebc_buf_release
-.LVL731:
+.LVL729:
 	.loc 1 1138 0
-	ldr	x1, [x28, 208]
-	mov	x4, x28
-	ldr	x0, [x28, 128]
-	ldp	x2, x3, [x28, 144]
+	ldr	x1, [x24, 208]
+	mov	x4, x24
+	ldr	x0, [x24, 128]
+	ldp	x2, x3, [x24, 144]
 	ldr	w5, [x1, 40]
 	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
-.LVL732:
+.LVL730:
 	.loc 1 1141 0
 	mov	x0, x25
 	bl	up_write
-.LVL733:
+.LVL731:
 	.loc 1 1142 0
-	ldr	w0, [x28, 28]
+	ldr	w0, [x24, 28]
 	cbnz	w0, .L655
-	.loc 1 1143 0
-	mov	w0, 1
-	str	w0, [x28, 28]
 	.loc 1 1145 0
-	ldr	w0, [x28, 184]
+	ldr	w0, [x24, 184]
+	.loc 1 1143 0
+	mov	w1, 1
 	.loc 1 1144 0
-	str	wzr, [x28, 76]
+	str	wzr, [x24, 76]
+	.loc 1 1143 0
+	str	w1, [x24, 28]
 	.loc 1 1145 0
 	cbz	w0, .L794
 .L665:
 	.loc 1 1147 0
-	ldr	x0, [x28, 88]
-	adrp	x1, .LC76
-	ldrb	w2, [x28, 32]
-	add	x1, x1, :lo12:.LC76
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC77
+	ldrb	w2, [x24, 32]
+	add	x1, x1, :lo12:.LC77
 	bl	_dev_info
-.LVL734:
+.LVL732:
 	.loc 1 1148 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL735:
+.LVL733:
 	b	.L655
-.LVL736:
+.LVL734:
 	.p2align 3
 .L786:
 	.loc 1 1117 0
-	str	wzr, [x28, 592]
+	str	wzr, [x24, 592]
 	.loc 1 1118 0
 	mov	x0, 3
-.LVL737:
+.LVL735:
 	bl	ebc_notify
-.LVL738:
+.LVL736:
 	.loc 1 1119 0
-	ldr	x0, [x28, 88]
-	adrp	x1, .LC75
-	add	x1, x1, :lo12:.LC75
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC76
+	add	x1, x1, :lo12:.LC76
 	bl	_dev_info
-.LVL739:
+.LVL737:
 	.p2align 2
 .L660:
 	.loc 1 1153 0
 	adrp	x25, jiffies
-.LVL740:
+.LVL738:
 	mov	x1, 402653184
 	add	x0, x20, 616
 	ldr	x2, [x25, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL741:
+.LVL739:
 	.loc 1 1155 0
-	ldr	w0, [x28, 428]
+	ldr	w0, [x24, 428]
 	cbz	w0, .L666
-	ldr	x0, [x28, 200]
+	ldr	x0, [x24, 200]
 .L667:
 	.loc 1 1158 0
 	ldr	w2, [x0, 40]
-	ldr	w3, [x23, 40]
+	ldr	w3, [x28, 40]
 	cmp	w3, w2
 	beq	.L668
 	.loc 1 1159 0
-	ldr	x0, [x28, 88]
-	adrp	x1, .LC77
-	add	x1, x1, :lo12:.LC77
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC78
+	add	x1, x1, :lo12:.LC78
 	bl	_dev_info
-.LVL742:
+.LVL740:
 	.loc 1 1160 0
-	ldr	w0, [x28, 28]
+	ldr	w0, [x24, 28]
 	cmp	w0, 1
 	beq	.L795
 .L778:
-	ldr	w2, [x23, 40]
+	ldr	w2, [x28, 40]
 .L668:
 	.loc 1 1167 0
 	cmp	w2, 11
 	bgt	.L675
 	cmp	w2, 7
-	bge	.L678
+	bge	.L676
 	cmp	w2, 1
 	beq	.L677
 	bgt	.L748
 	cbnz	w2, .L674
 	.loc 1 1212 0
-	add	x0, x22, 592
+	add	x0, x21, 592
 	bl	down_write
-.LVL743:
+.LVL741:
 	.loc 1 1218 0
-	ldr	x0, [x28, 200]
+	ldr	x0, [x24, 200]
 	.loc 1 1213 0
-	str	x23, [x28, 208]
+	str	x28, [x24, 208]
 	.loc 1 1218 0
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
 	bls	.L712
 	.loc 1 1220 0
-	ldrsw	x2, [x28, 20]
-	ldr	x1, [x23, 16]
-	ldr	x0, [x28, 128]
+	ldrsw	x2, [x24, 20]
+	ldr	x1, [x28, 16]
+	ldr	x0, [x24, 128]
 	bl	memcpy
-.LVL744:
+.LVL742:
 	.loc 1 1221 0
-	ldr	x0, [x28, 200]
-	ldrsw	x2, [x28, 20]
+	ldr	x0, [x24, 200]
+	ldrsw	x2, [x24, 20]
 	ldr	x1, [x0, 16]
-	ldr	x0, [x28, 136]
+	ldr	x0, [x24, 136]
 	bl	memcpy
-.LVL745:
+.LVL743:
 .L713:
 	.loc 1 1227 0
-	add	x0, x22, 592
+	add	x0, x21, 592
 	bl	up_write
-.LVL746:
+.LVL744:
 	.loc 1 1229 0
-	ldr	w0, [x28, 28]
+	ldr	w0, [x24, 28]
 	cbnz	w0, .L690
-	.loc 1 1232 0
-	ldr	w0, [x28, 184]
 	.loc 1 1230 0
-	mov	w1, 1
+	mov	w0, 1
+	str	w0, [x24, 28]
+	.loc 1 1232 0
+	ldr	w0, [x24, 184]
 	.loc 1 1231 0
-	str	wzr, [x28, 76]
-	.loc 1 1230 0
-	str	w1, [x28, 28]
+	str	wzr, [x24, 76]
 	.loc 1 1232 0
 	cbz	w0, .L796
 .L714:
 	.loc 1 1234 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL747:
+.LVL745:
 	cmn	w0, #1
 	beq	.L797
 	.loc 1 1242 0
-	ldr	x0, [x28, 88]
-	adrp	x1, .LC83
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC84
 	.loc 1 1239 0
-	ldr	w3, [x28, 96]
+	ldr	w3, [x24, 96]
 	.loc 1 1242 0
-	add	x1, x1, :lo12:.LC83
+	add	x1, x1, :lo12:.LC84
 	.loc 1 1239 0
-	strb	w3, [x28, 32]
-.LVL748:
+	strb	w3, [x24, 32]
+.LVL746:
 .L779:
 	.loc 1 1242 0
 	and	w2, w3, 255
 	.loc 1 1240 0
 	lsr	w3, w3, 8
-	strb	w3, [x28, 33]
+	strb	w3, [x24, 33]
 	.loc 1 1242 0
 	bl	_dev_info
-.LVL749:
+.LVL747:
 	.loc 1 1243 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL750:
-	.loc 1 1345 0
-	ldr	x0, [x28, 208]
+.LVL748:
+	.loc 1 1346 0
+	ldr	x0, [x24, 208]
 	ldr	w0, [x0, 40]
 	cmp	w0, 19
 	bne	.L729
-.LVL751:
+.LVL749:
 	.p2align 2
-.L802:
-	.loc 1 1348 0
-	ldr	x0, [x28, 88]
-	.loc 1 1346 0
-	mov	w25, 1
-.LVL752:
+.L800:
+	.loc 1 1349 0
+	ldr	x0, [x24, 88]
 	.loc 1 1347 0
-	str	wzr, [x28, 188]
-	.loc 1 1348 0
-	adrp	x1, .LC86
-	.loc 1 1346 0
-	str	w25, [x28, 600]
+	mov	w25, 1
+.LVL750:
 	.loc 1 1348 0
-	add	x1, x1, :lo12:.LC86
-	bl	_dev_info
-.LVL753:
+	str	wzr, [x24, 188]
+	.loc 1 1349 0
+	adrp	x1, .LC87
+	.loc 1 1347 0
+	str	w25, [x24, 600]
 	.loc 1 1349 0
+	add	x1, x1, :lo12:.LC87
+	bl	_dev_info
+.LVL751:
+	.loc 1 1350 0
 	mov	w2, w25
 	mov	w1, w25
-	add	x0, x22, 328
+	add	x0, x21, 328
 	bl	__wake_up_sync
-.LVL754:
-	.loc 1 1360 0
-	mov	x0, x23
+.LVL752:
+	.loc 1 1361 0
+	mov	x0, x28
 	bl	ebc_remove_from_dsp_buf_list
-.LVL755:
-	.loc 1 1362 0
-	ldr	w0, [x28, 428]
+.LVL753:
+	.loc 1 1363 0
+	ldr	w0, [x24, 428]
 	cbz	w0, .L731
-.LVL756:
+.LVL754:
 	.p2align 2
-.L804:
-	.loc 1 1363 0
-	ldr	x0, [x28, 200]
+.L802:
+	.loc 1 1364 0
+	ldr	x0, [x24, 200]
 	bl	ebc_buf_release
-.LVL757:
+.LVL755:
 	b	.L732
-.LVL758:
+.LVL756:
 	.p2align 3
 .L666:
 	.loc 1 1156 0
-	mov	x0, x23
-	str	x23, [x28, 200]
+	mov	x0, x28
+	str	x28, [x24, 200]
 	b	.L667
 	.p2align 3
-.L799:
+.L675:
 	.loc 1 1167 0
-	cmp	w2, 13
-	bge	.L678
-.L748:
+	cmp	w2, 14
+	ble	.L798
+	cmp	w2, 19
+	ble	.L748
+	cmp	w2, 20
+	bne	.L674
 	.loc 1 1259 0
-	mov	w21, 1
+	mov	w7, 1
+.LVL757:
+	.loc 1 1247 0
+	str	wzr, [x24, 608]
 .L678:
 	.loc 1 1268 0
-	ldr	x26, [x28, 200]
-.LVL759:
+	ldr	x26, [x24, 200]
 	.loc 1 1269 0
 	ldr	w0, [x26, 40]
 	cmp	w0, 1
-	bls	.L798
+	bls	.L799
 .L716:
 	.loc 1 1280 0
-	str	wzr, [x28, 76]
+	str	wzr, [x24, 76]
 	.loc 1 1281 0
-	str	x23, [x28, 208]
+	str	x28, [x24, 208]
 	.loc 1 1284 0
-	ldr	w0, [x23, 40]
-	sub	w0, w0, #7
+	ldr	w0, [x28, 40]
+	sub	w0, w0, #2
 	.loc 1 1283 0
-	cmp	w0, 4
+	cmp	w0, 13
 	bhi	.L717
-.L800:
+.L804:
 	.loc 1 1286 0
-	ldr	x0, [x28, 200]
+	ldr	x0, [x24, 200]
 .LBB1799:
 .LBB1800:
 	.loc 1 1077 0
-	ldr	w1, [x28, 20]
+	ldr	w1, [x24, 20]
 .LBE1800:
 .LBE1799:
 	.loc 1 1285 0
-	ldr	x4, [x23, 16]
+	ldr	x4, [x28, 16]
 .LBB1803:
 .LBB1801:
 	.loc 1 1077 0
@@ -8315,181 +8315,100 @@ ebc_thread:
 .LBE1802:
 .LBE1804:
 	.loc 1 1288 0
-	ldr	x0, [x28, 88]
-	adrp	x1, .LC88
-	add	x1, x1, :lo12:.LC88
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC89
+	add	x1, x1, :lo12:.LC89
 	bl	_dev_info
-.LVL760:
+.LVL758:
 	.loc 1 1290 0
-	str	x26, [x28, 200]
-	.loc 1 1291 0
-	b	.L690
-.LVL761:
-	.p2align 3
-.L675:
-	.loc 1 1167 0
-	cmp	w2, 14
-	ble	.L799
-	cmp	w2, 19
-	ble	.L748
-	cmp	w2, 20
-	bne	.L674
-	.loc 1 1268 0
-	ldr	x26, [x28, 200]
-.LVL762:
-	.loc 1 1259 0
-	mov	w21, 1
-	.loc 1 1247 0
-	str	wzr, [x28, 608]
-	.loc 1 1269 0
-	ldr	w0, [x26, 40]
-	cmp	w0, 1
-	bhi	.L716
-.L798:
-	.loc 1 1274 0
-	add	x0, x29, 152
-	.loc 1 1280 0
-	str	wzr, [x28, 76]
-	.loc 1 1274 0
-	str	x0, [x28, 200]
-	.loc 1 1281 0
-	str	x23, [x28, 208]
-	.loc 1 1275 0
-	ldr	x0, [x28, 136]
-	str	x0, [x29, 168]
-	.loc 1 1284 0
-	ldr	w0, [x23, 40]
-	sub	w0, w0, #7
-	.loc 1 1283 0
-	cmp	w0, 4
-	bls	.L800
+	str	x26, [x24, 200]
+.LVL759:
 	.p2align 2
-.L717:
-	.loc 1 1295 0
-	cbnz	w21, .L752
-	.loc 1 1299 0
-	ldr	w0, [x28, 48]
-	cmp	w0, 0
-	ble	.L722
-	.loc 1 1300 0
-	add	w24, w24, 1
-	.loc 1 1301 0
-	cmp	w0, w24
-	bgt	.L722
-	.loc 1 1302 0
-	mov	w0, 2
-	.loc 1 1303 0
-	mov	w24, 0
-	.loc 1 1302 0
-	str	w0, [x23, 40]
-.L722:
-	.loc 1 1307 0
-	ldr	w0, [x28, 184]
-	cbz	w0, .L801
-.L723:
-	.loc 1 1310 0
-	mov	x0, x20
-	bl	ebc_lut_update
-.LVL763:
-	mov	w21, w0
-	cbz	w0, .L724
-	.loc 1 1311 0
-	ldr	x0, [x28, 88]
-	adrp	x1, .LC82
-	.loc 1 1314 0
-	mov	w21, 0
-	.loc 1 1311 0
-	add	x1, x1, :lo12:.LC82
-	bl	_dev_err
-.LVL764:
-	.loc 1 1313 0
-	str	x26, [x28, 200]
-.LVL765:
 .L690:
-	.loc 1 1345 0
-	ldr	x0, [x28, 208]
+	.loc 1 1346 0
+	ldr	x0, [x24, 208]
 	ldr	w0, [x0, 40]
 	cmp	w0, 19
-	beq	.L802
+	beq	.L800
 .L729:
-	.loc 1 1351 0
+	.loc 1 1352 0
 	cmp	w0, 17
-	beq	.L803
+	beq	.L801
 .L730:
-	.loc 1 1360 0
-	mov	x0, x23
+	.loc 1 1361 0
+	mov	x0, x28
 	bl	ebc_remove_from_dsp_buf_list
-.LVL766:
-	.loc 1 1362 0
-	ldr	w0, [x28, 428]
-	cbnz	w0, .L804
+.LVL760:
+	.loc 1 1363 0
+	ldr	w0, [x24, 428]
+	cbnz	w0, .L802
 .L731:
-	.loc 1 1365 0
+	.loc 1 1366 0
 	mov	w0, 1
-	str	w0, [x28, 428]
+	str	w0, [x24, 428]
 .L732:
-	.loc 1 1367 0
-	ldr	x0, [x28, 208]
-	str	x0, [x28, 200]
 	.loc 1 1368 0
+	ldr	x0, [x24, 208]
+	str	x0, [x24, 200]
+	.loc 1 1369 0
 	b	.L655
-.LVL767:
+.LVL761:
 	.p2align 3
 .L785:
 	.loc 1 1113 0
-	str	wzr, [x28, 604]
+	str	wzr, [x24, 604]
 	.loc 1 1112 0
-	str	wzr, [x28, 608]
+	str	wzr, [x24, 608]
 	b	.L660
-.LVL768:
+.LVL762:
 	.p2align 3
 .L789:
 .LBB1805:
-	.loc 1 1372 0 discriminator 1
-	ldr	w0, [x28, 80]
+	.loc 1 1373 0 discriminator 1
+	ldr	w0, [x24, 80]
 	cbnz	w0, .L733
 .LBB1806:
-	.loc 1 1372 0 is_stmt 0 discriminator 3
+	.loc 1 1373 0 is_stmt 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL769:
+.LVL763:
 	b	.L737
 	.p2align 3
-.L805:
+.L803:
 .LBB1807:
-	.loc 1 1372 0 discriminator 7
-	ldr	w1, [x28, 80]
+	.loc 1 1373 0 discriminator 7
+	ldr	w1, [x24, 80]
 	cbnz	w1, .L734
-.LVL770:
-	.loc 1 1372 0 discriminator 9
+.LVL764:
+	.loc 1 1373 0 discriminator 9
 	cbnz	x0, .L780
-	.loc 1 1372 0 discriminator 11
+	.loc 1 1373 0 discriminator 11
 	bl	schedule
-.LVL771:
+.LVL765:
 .L737:
-	.loc 1 1372 0 discriminator 13
+	.loc 1 1373 0 discriminator 13
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL772:
-	ldr	w1, [x28, 28]
-	cbnz	w1, .L805
+.LVL766:
+	ldr	w1, [x24, 28]
+	cbnz	w1, .L803
 .L734:
 .LBE1807:
-	.loc 1 1372 0 discriminator 8
+	.loc 1 1373 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL773:
-	ldr	w0, [x28, 28]
+.LVL767:
+	ldr	w0, [x24, 28]
 .LBE1806:
 .LBE1805:
-	.loc 1 1375 0 is_stmt 1 discriminator 8
+	.loc 1 1376 0 is_stmt 1 discriminator 8
 	cbnz	w0, .L780
-	.loc 1 1380 0
-	ldr	w0, [x28, 184]
+	.loc 1 1381 0
+	ldr	w0, [x24, 184]
 	cmp	w0, 1
 	bne	.L780
 	.p2align 2
@@ -8499,656 +8418,731 @@ ebc_thread:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
-.LVL774:
+.LVL768:
 	b	.L780
-.LVL775:
+.LVL769:
 	.p2align 3
-.L724:
+.L798:
 .LBE1809:
 .LBE1808:
-	.loc 1 1322 0
-	ldr	x0, [x28, 208]
+	.loc 1 1167 0
+	cmp	w2, 13
+	bge	.L676
+.L748:
+	.loc 1 1268 0
+	ldr	x26, [x24, 200]
+	.loc 1 1259 0
+	mov	w7, 1
+.LVL770:
+	.loc 1 1269 0
+	ldr	w0, [x26, 40]
+	cmp	w0, 1
+	bhi	.L716
+.L799:
+	.loc 1 1274 0
+	add	x0, x29, 152
+	.loc 1 1280 0
+	str	wzr, [x24, 76]
+	.loc 1 1274 0
+	str	x0, [x24, 200]
+	.loc 1 1281 0
+	str	x28, [x24, 208]
+	.loc 1 1275 0
+	ldr	x0, [x24, 136]
+	str	x0, [x29, 168]
+	.loc 1 1284 0
+	ldr	w0, [x28, 40]
+	sub	w0, w0, #2
+	.loc 1 1283 0
+	cmp	w0, 13
+	bls	.L804
+	.p2align 2
+.L717:
+	.loc 1 1296 0
+	cbnz	w7, .L752
+	.loc 1 1300 0
+	ldr	w0, [x24, 48]
+	cmp	w0, 0
+	ble	.L722
+	.loc 1 1301 0
+	add	w23, w23, 1
+	.loc 1 1302 0
+	cmp	w0, w23
+	bgt	.L722
+	.loc 1 1303 0
+	mov	w0, 2
+	.loc 1 1304 0
+	mov	w23, 0
+	.loc 1 1303 0
+	str	w0, [x28, 40]
+.L722:
+	.loc 1 1308 0
+	ldr	w0, [x24, 184]
+	cbz	w0, .L805
+.L723:
+	.loc 1 1311 0
+	mov	x0, x20
+	bl	ebc_lut_update
+.LVL771:
+	cbz	w0, .L724
+.L807:
+	.loc 1 1312 0
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC83
+	add	x1, x1, :lo12:.LC83
+	bl	_dev_err
+.LVL772:
+	.loc 1 1314 0
+	str	x26, [x24, 200]
+	.loc 1 1315 0
+	b	.L690
+.L795:
+	.loc 1 1161 0
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC79
+	add	x1, x1, :lo12:.LC79
+	bl	_dev_info
+.LVL773:
+.LBB1810:
+	.loc 1 1162 0
+	ldr	w0, [x24, 76]
+	cbz	w0, .L806
+.L672:
+.LVL774:
+.L670:
+.LBE1810:
+	.loc 1 1163 0 discriminator 11
+	ldr	x0, [x24, 88]
+.LVL775:
+	adrp	x1, .LC80
+	add	x1, x1, :lo12:.LC80
+	bl	_dev_info
 .LVL776:
-	adrp	x1, .LC84
-	.loc 1 1319 0
-	ldr	w3, [x28, 96]
-	.loc 1 1322 0
-	add	x1, x1, :lo12:.LC84
-	.loc 1 1319 0
-	strb	w3, [x28, 32]
-	.loc 1 1322 0
+	b	.L778
+	.p2align 3
+.L674:
+	.loc 1 1338 0
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC86
+	add	x1, x1, :lo12:.LC86
+	bl	_dev_err
+.LVL777:
+	.loc 1 1339 0
+	b	.L690
+.L676:
+	.loc 1 1167 0
+	mov	w7, 0
+.LVL778:
+	b	.L678
+	.p2align 3
+.L752:
+	.loc 1 1308 0
+	ldr	w0, [x24, 184]
+	.loc 1 1297 0
+	mov	w23, 0
+	.loc 1 1308 0
+	cbnz	w0, .L723
+.L805:
+	.loc 1 1309 0
+	mov	x0, x20
+	bl	ebc_power_set.constprop.12
+.LVL779:
+	.loc 1 1311 0
+	mov	x0, x20
+	bl	ebc_lut_update
+.LVL780:
+	cbnz	w0, .L807
+.L724:
+	.loc 1 1323 0
+	ldr	x0, [x24, 208]
+	adrp	x1, .LC85
+	.loc 1 1320 0
+	ldr	w3, [x24, 96]
+	.loc 1 1323 0
+	add	x1, x1, :lo12:.LC85
+	.loc 1 1320 0
+	strb	w3, [x24, 32]
+	.loc 1 1323 0
 	and	w3, w3, 255
 	ldr	w2, [x0, 40]
-	ldr	x0, [x28, 88]
+	ldr	x0, [x24, 88]
 	bl	_dev_info
-.LVL777:
-	.loc 1 1323 0
-	mov	w0, 1
-	str	w0, [x28, 28]
+.LVL781:
 	.loc 1 1324 0
+	mov	w0, 1
+	str	w0, [x24, 28]
+	.loc 1 1325 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL778:
-	.loc 1 1326 0
+.LVL782:
+	.loc 1 1327 0
 	ldr	x1, [x25, #:lo12:jiffies]
 	add	x0, x20, 672
 	str	x0, [x29, 104]
 	add	x1, x1, 900
 	bl	mod_timer
-.LVL779:
-.LBB1810:
-	.loc 1 1327 0
-	ldr	w0, [x28, 76]
-	cbz	w0, .L806
+.LVL783:
+.LBB1814:
+	.loc 1 1328 0
+	ldr	w0, [x24, 76]
+	cbz	w0, .L808
 .L727:
-.LVL780:
+.LVL784:
 .L725:
-.LBE1810:
-	.loc 1 1329 0 discriminator 11
+.LBE1814:
+	.loc 1 1330 0 discriminator 11
 	ldr	x2, [x25, #:lo12:jiffies]
 	mov	x1, 402653184
 	ldr	x0, [x29, 104]
-.LVL781:
+.LVL785:
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL782:
-	.loc 1 1330 0 discriminator 11
-	str	wzr, [x28, 76]
-	.loc 1 1332 0 discriminator 11
-	str	x26, [x28, 200]
-	.loc 1 1334 0 discriminator 11
-	b	.L690
-	.p2align 3
-.L752:
-	.loc 1 1307 0
-	ldr	w0, [x28, 184]
-	.loc 1 1296 0
-	mov	w24, 0
-	.loc 1 1307 0
-	cbnz	w0, .L723
-.L801:
-	.loc 1 1308 0
-	mov	x0, x20
-	bl	ebc_power_set.constprop.12
-.LVL783:
-	b	.L723
-.LVL784:
-.L795:
-	.loc 1 1161 0
-	ldr	x0, [x28, 88]
-	adrp	x1, .LC78
-	add	x1, x1, :lo12:.LC78
-	bl	_dev_info
-.LVL785:
-.LBB1814:
-	.loc 1 1162 0
-	ldr	w0, [x28, 76]
-	cbz	w0, .L807
-.L672:
 .LVL786:
-.L670:
-.LBE1814:
-	.loc 1 1163 0 discriminator 11
-	ldr	x0, [x28, 88]
-.LVL787:
-	adrp	x1, .LC79
-	add	x1, x1, :lo12:.LC79
-	bl	_dev_info
-.LVL788:
-	b	.L778
-	.p2align 3
-.L674:
-	.loc 1 1337 0
-	ldr	x0, [x28, 88]
-	adrp	x1, .LC85
-	add	x1, x1, :lo12:.LC85
-	bl	_dev_err
-.LVL789:
-	.loc 1 1338 0
+	.loc 1 1331 0 discriminator 11
+	str	wzr, [x24, 76]
+	.loc 1 1333 0 discriminator 11
+	str	x26, [x24, 200]
+	.loc 1 1335 0 discriminator 11
 	b	.L690
 	.p2align 3
 .L677:
 	.loc 1 1169 0
-	ldr	w0, [x28, 604]
+	ldr	w0, [x24, 604]
 	cbz	w0, .L682
 	.loc 1 1182 0
-	ldr	x0, [x28, 200]
+	ldr	x0, [x24, 200]
 	.loc 1 1180 0
-	str	x23, [x28, 208]
+	str	x28, [x24, 208]
 	.loc 1 1170 0
-	str	w2, [x28, 608]
+	str	w2, [x24, 608]
 	.loc 1 1182 0
 	ldr	w1, [x0, 40]
 	cmp	w1, 1
-	bls	.L808
+	bls	.L809
 	.loc 1 1184 0
 	ldr	x1, [x0, 16]
-	ldrsw	x2, [x28, 20]
-	ldr	x0, [x28, 128]
+	ldrsw	x2, [x24, 20]
+	ldr	x0, [x24, 128]
 	bl	memcpy
-.LVL790:
+.LVL787:
 	.loc 1 1185 0
-	ldr	x0, [x28, 200]
-	ldrsw	x2, [x28, 20]
+	ldr	x0, [x24, 200]
+	ldrsw	x2, [x24, 20]
 	ldr	x1, [x0, 16]
-	ldr	x0, [x28, 136]
+	ldr	x0, [x24, 136]
 	bl	memcpy
-.LVL791:
+.LVL788:
 	.loc 1 1186 0
-	ldr	x0, [x28, 200]
-	ldrsw	x2, [x28, 20]
+	ldr	x0, [x24, 200]
+	ldrsw	x2, [x24, 20]
 	ldr	x1, [x0, 16]
-	ldr	x0, [x28, 144]
+	ldr	x0, [x24, 144]
 	bl	memcpy
-.LVL792:
-	ldr	x0, [x28, 208]
+.LVL789:
+	ldr	x0, [x24, 208]
 .L685:
 .LBB1818:
 .LBB1819:
 	.loc 1 374 0
-	ldp	w3, w16, [x0, 48]
+	ldp	w3, w14, [x0, 48]
 	.loc 1 433 0
-	mov	w15, 234881024
+	mov	w13, 234881024
 	.loc 1 375 0
-	ldp	w2, w25, [x0, 56]
+	ldp	w2, w17, [x0, 56]
 	.loc 1 372 0
 	cmp	w3, 0
 	.loc 1 377 0
 	ldr	w1, [x20, 240]
 	.loc 1 372 0
-	add	w17, w3, 7
-	csel	w17, w17, w3, lt
+	add	w15, w3, 7
+	csel	w15, w15, w3, lt
 	.loc 1 373 0
-	add	w10, w2, 7
+	add	w8, w2, 7
 	cmp	w2, 0
 	.loc 1 377 0
-	add	w18, w1, 7
+	add	w16, w1, 7
 	.loc 1 373 0
-	csel	w10, w10, w2, lt
+	csel	w8, w8, w2, lt
 	.loc 1 377 0
 	cmp	w1, 0
-	csel	w18, w18, w1, lt
+	csel	w16, w16, w1, lt
 	.loc 1 373 0
-	asr	w10, w10, 3
+	asr	w8, w8, 3
 	.loc 1 377 0
-	asr	w18, w18, 3
-.LVL793:
+	asr	w16, w16, 3
+.LVL790:
 	.loc 1 373 0
-	add	w10, w10, 1
-.LVL794:
+	add	w8, w8, 1
+.LVL791:
 	ldr	w1, [x20, 236]
 	.loc 1 380 0
-	cmp	w10, w18
+	cmp	w8, w16
 .LBE1819:
 .LBE1818:
 	.loc 1 1191 0
-	ldr	x13, [x0, 16]
+	ldr	x11, [x0, 16]
 .LBB1824:
 .LBB1820:
 	.loc 1 380 0
-	sub	w0, w18, #1
-	csel	w10, w0, w10, ge
-.LVL795:
+	sub	w0, w16, #1
+	csel	w8, w0, w8, ge
+.LVL792:
 	.loc 1 382 0
-	cmp	w1, w25
+	cmp	w1, w17
 	sub	w1, w1, #1
 	.loc 1 439 0
-	mov	w14, -536870912
+	mov	w12, -536870912
 	.loc 1 382 0
-	csel	w25, w1, w25, le
+	csel	w17, w1, w17, le
 	.loc 1 372 0
-	asr	w17, w17, 3
-.LVL796:
-	mul	w7, w16, w18
+	asr	w15, w15, 3
+.LVL793:
+	mul	w5, w14, w16
 	.loc 1 384 0
-	cmp	w16, w25
+	cmp	w14, w17
 .LBE1820:
 .LBE1824:
 	.loc 1 1191 0
-	ldr	x9, [x28, 128]
+	ldr	x7, [x24, 128]
 	.loc 1 1192 0
-	ldp	x12, x11, [x28, 144]
+	ldp	x10, x9, [x24, 144]
 .LBB1825:
 .LBB1821:
 	.loc 1 384 0
 	bgt	.L693
-.LVL797:
+.LVL794:
 	.p2align 2
 .L763:
 	.loc 1 389 0
-	mov	w5, w17
-	cmp	w17, w10
+	mov	w4, w15
+	cmp	w15, w8
 	ble	.L764
 	b	.L710
-.LVL798:
+.LVL795:
 	.p2align 3
 .L694:
 	.loc 1 402 0
 	tst	x2, 65280
 	bne	.L695
 	.loc 1 403 0
-	and	w27, w0, 240
-	cmp	w27, 224
-	beq	.L809
+	and	w26, w1, 240
+	cmp	w26, 224
+	beq	.L810
 	.loc 1 406 0
-	orr	w3, w3, 240
+	orr	w18, w18, 240
 .L695:
 	.loc 1 408 0
 	tst	x2, 16711680
 	bne	.L697
 	.loc 1 409 0
-	and	w27, w0, 3840
-	cmp	w27, 3584
-	beq	.L810
+	and	w26, w1, 3840
+	cmp	w26, 3584
+	beq	.L811
 	.loc 1 412 0
-	orr	w3, w3, 3840
+	orr	w18, w18, 3840
 .L697:
 	.loc 1 414 0
 	tst	x2, 4278190080
 	bne	.L699
 	.loc 1 415 0
-	and	w27, w0, 61440
-	cmp	w27, 57344
-	beq	.L811
+	and	w26, w1, 61440
+	cmp	w26, 57344
+	beq	.L812
 	.loc 1 418 0
-	orr	w3, w3, 61440
+	orr	w18, w18, 61440
 .L699:
 	.loc 1 420 0
 	tst	x2, 1095216660480
 	bne	.L701
 	.loc 1 421 0
-	and	w27, w0, 983040
-	cmp	w27, 917504
-	beq	.L812
+	and	w26, w1, 983040
+	cmp	w26, 917504
+	beq	.L813
 	.loc 1 424 0
-	orr	w3, w3, 983040
+	orr	w18, w18, 983040
 .L701:
 	.loc 1 426 0
 	tst	x2, 280375465082880
 	bne	.L703
 	.loc 1 427 0
-	and	w27, w0, 15728640
-	cmp	w27, 14680064
-	beq	.L813
+	and	w26, w1, 15728640
+	cmp	w26, 14680064
+	beq	.L814
 	.loc 1 430 0
-	orr	w3, w3, 15728640
+	orr	w18, w18, 15728640
 .L703:
 	.loc 1 432 0
 	tst	x2, 71776119061217280
 	bne	.L705
 	.loc 1 433 0
-	and	w27, w0, 251658240
-	cmp	w27, w15
-	beq	.L814
+	and	w26, w1, 251658240
+	cmp	w26, w13
+	beq	.L815
 	.loc 1 436 0
-	orr	w3, w3, 251658240
+	orr	w18, w18, 251658240
 .L705:
 	.loc 1 438 0
 	tst	x2, -72057594037927936
 	bne	.L707
 	.loc 1 439 0
-	and	w2, w0, -268435456
-.LVL799:
-	cmp	w2, w14
-	beq	.L815
+	and	w2, w1, -268435456
+.LVL796:
+	cmp	w2, w12
+	beq	.L816
 	.loc 1 442 0
-	orr	w3, w3, -268435456
-.LVL800:
+	orr	w18, w18, -268435456
+.LVL797:
 .L707:
 	.loc 1 445 0
-	and	w0, w0, w26
-.LVL801:
+	and	w1, w1, w25
+.LVL798:
 	.loc 1 389 0
-	add	w5, w5, 1
-	eor	w0, w0, w4
-	cmp	w5, w10
-	and	w0, w0, w3
+	add	w4, w4, 1
+	eor	w1, w1, w3
+	cmp	w4, w8
+	and	w1, w1, w18
 	.loc 1 445 0
-	eor	w0, w4, w0
+	eor	w1, w3, w1
 	.loc 1 446 0
-	str	w0, [x9, x1]
+	str	w1, [x7, x0]
 	.loc 1 389 0
 	bgt	.L710
-.LVL802:
+.LVL799:
 .L764:
 	.loc 1 390 0
-	sxtw	x1, w5
-.LVL803:
+	sxtw	x0, w4
+.LVL800:
 	.loc 1 394 0
-	mov	w3, 0
+	mov	w18, 0
 	.loc 1 393 0
-	lsl	x0, x1, 3
+	lsl	x1, x0, 3
 	.loc 1 390 0
-	lsl	x1, x1, 2
-.LVL804:
+	lsl	x0, x0, 2
+.LVL801:
 	.loc 1 393 0
-	add	x0, x0, x7, sxtw 3
-	add	x1, x1, x7, sxtw 2
-	ldr	x2, [x11, x0]
+	add	x1, x1, x5, sxtw 3
+	add	x0, x0, x5, sxtw 2
+	ldr	x2, [x9, x1]
 	.loc 1 390 0
-	ldr	w4, [x9, x1]
+	ldr	w3, [x7, x0]
 	.loc 1 391 0
-	ldr	w0, [x13, x1]
+	ldr	w1, [x11, x0]
 	.loc 1 396 0
-	and	x27, x2, 255
+	and	x26, x2, 255
+.LVL802:
 	.loc 1 392 0
-	ldr	w26, [x12, x1]
-.LVL805:
+	ldr	w25, [x10, x0]
+.LVL803:
 	.loc 1 396 0
-	cbnz	x27, .L694
-.LVL806:
+	cbnz	x26, .L694
+.LVL804:
 	.loc 1 397 0
-	and	w3, w0, 15
-.LVL807:
-	cmp	w3, 14
+	and	w26, w1, 15
 	.loc 1 400 0
-	mov	w3, 15
-.LVL808:
+	mov	w18, 15
 	.loc 1 397 0
+	cmp	w26, 14
 	bne	.L694
 	.loc 1 398 0
-	orr	w4, w4, w3
-.LVL809:
+	orr	w3, w3, w18
+.LVL805:
 	.loc 1 394 0
-	mov	w3, 0
-.LVL810:
+	mov	w18, 0
+.LVL806:
 	b	.L694
-.LVL811:
+.LVL807:
 	.p2align 3
 .L793:
 .LBE1821:
 .LBE1825:
 	.loc 1 1129 0
-	str	wzr, [x28, 608]
+	str	wzr, [x24, 608]
 	b	.L660
-.LVL812:
-.L803:
-	.loc 1 1355 0
-	ldr	x0, [x28, 88]
-	.loc 1 1353 0
+.LVL808:
+.L801:
+	.loc 1 1356 0
+	ldr	x0, [x24, 88]
+	.loc 1 1354 0
 	mov	w25, 1
-.LVL813:
-	.loc 1 1352 0
-	str	wzr, [x28, 188]
-	.loc 1 1355 0
-	adrp	x1, .LC87
+.LVL809:
 	.loc 1 1353 0
-	str	w25, [x28, 592]
-	.loc 1 1355 0
-	add	x1, x1, :lo12:.LC87
+	str	wzr, [x24, 188]
+	.loc 1 1356 0
+	adrp	x1, .LC88
 	.loc 1 1354 0
-	str	wzr, [x28, 608]
+	str	w25, [x24, 592]
+	.loc 1 1356 0
+	add	x1, x1, :lo12:.LC88
 	.loc 1 1355 0
-	bl	_dev_info
-.LVL814:
+	str	wzr, [x24, 608]
 	.loc 1 1356 0
+	bl	_dev_info
+.LVL810:
+	.loc 1 1357 0
 	mov	x0, 2
 	bl	ebc_notify
-.LVL815:
-	.loc 1 1357 0
+.LVL811:
+	.loc 1 1358 0
 	mov	w2, w25
 	mov	w1, w25
-	add	x0, x22, 328
+	add	x0, x21, 328
 	bl	__wake_up_sync
-.LVL816:
+.LVL812:
 	b	.L730
-.LVL817:
-.L806:
-.LBB1826:
-.LBB1811:
-.LBB1812:
-	.loc 1 1327 0 discriminator 1
-	add	x27, x22, 352
-.LBE1812:
-	mov	w1, 0
-	add	x0, x29, 112
-	bl	init_wait_entry
-.LVL818:
-	b	.L728
-	.p2align 3
-.L816:
-.LVL819:
-.LBB1813:
-	.loc 1 1327 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L725
-	.loc 1 1327 0 discriminator 7
-	bl	schedule
-.LVL820:
-.L728:
-	.loc 1 1327 0 discriminator 9
-	add	x1, x29, 112
-	mov	w2, 1
-	mov	x0, x27
-	bl	prepare_to_wait_event
-.LVL821:
-	ldr	w1, [x28, 76]
-	cbz	w1, .L816
-.LBE1813:
-	.loc 1 1327 0 discriminator 4
-	mov	x0, x27
-	add	x1, x29, 112
-	bl	finish_wait
-.LVL822:
-	b	.L725
-.LVL823:
-.L808:
-.LBE1811:
-.LBE1826:
-	mov	x0, x23
-	.loc 1 1187 0 is_stmt 1
+.L809:
+	mov	x0, x28
+	.loc 1 1187 0
 	cbnz	w1, .L685
 	.loc 1 1188 0
-	ldrsw	x2, [x28, 20]
-	ldp	x1, x0, [x28, 136]
+	ldrsw	x2, [x24, 20]
+	ldp	x1, x0, [x24, 136]
 	bl	memcpy
-.LVL824:
-	ldr	x0, [x28, 208]
+.LVL813:
+	ldr	x0, [x24, 208]
 	b	.L685
 .L712:
 	.loc 1 1224 0
-	ldr	x1, [x23, 16]
-	mov	x3, x28
-	ldr	x0, [x28, 128]
-	ldr	x2, [x28, 152]
+	ldr	x0, [x24, 128]
+	mov	x3, x24
+	ldr	x2, [x24, 152]
+	ldr	x1, [x28, 16]
 	bl	refresh_new_image_auto
-.LVL825:
+.LVL814:
 	b	.L713
-.L797:
-	.loc 1 1235 0
-	ldr	x0, [x28, 88]
-	adrp	x1, .LC82
-	add	x1, x1, :lo12:.LC82
-	bl	_dev_err
-.LVL826:
-	.loc 1 1236 0
-	b	.L690
 .L796:
 	.loc 1 1233 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.12
-.LVL827:
+.LVL815:
 	b	.L714
-.L807:
-.LBB1827:
-.LBB1815:
-.LBB1816:
+.L797:
+	.loc 1 1235 0
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC83
+	add	x1, x1, :lo12:.LC83
+	bl	_dev_err
+.LVL816:
+	.loc 1 1236 0
+	b	.L690
+.L806:
+.LBB1826:
+.LBB1811:
+.LBB1812:
 	.loc 1 1162 0 discriminator 1
-	add	x26, x22, 352
-.LVL828:
-.LBE1816:
+	add	x26, x21, 352
+.LVL817:
+.LBE1812:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL829:
+.LVL818:
 	b	.L673
 	.p2align 3
 .L817:
-.LVL830:
-.LBB1817:
+.LVL819:
+.LBB1813:
 	.loc 1 1162 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L670
 	.loc 1 1162 0 discriminator 7
 	bl	schedule
-.LVL831:
+.LVL820:
 .L673:
 	.loc 1 1162 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x26
 	bl	prepare_to_wait_event
-.LVL832:
-	ldr	w1, [x28, 76]
+.LVL821:
+	ldr	w1, [x24, 76]
 	cbz	w1, .L817
-.LBE1817:
+.LBE1813:
 	.loc 1 1162 0 discriminator 4
 	mov	x0, x26
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL833:
+.LVL822:
 	b	.L670
-.LVL834:
+.LVL823:
 	.p2align 3
-.L811:
-.LBE1815:
-.LBE1827:
-.LBB1828:
+.L810:
+.LBE1811:
+.LBE1826:
+.LBB1827:
 .LBB1822:
-	.loc 1 416 0 is_stmt 1
-	orr	w4, w4, 61440
-	b	.L699
-	.p2align 3
-.L812:
-	.loc 1 422 0
-	orr	w4, w4, 983040
-	b	.L701
-	.p2align 3
-.L813:
-	.loc 1 428 0
-	orr	w4, w4, 15728640
-	b	.L703
+	.loc 1 404 0 is_stmt 1
+	orr	w3, w3, 240
+	b	.L695
 	.p2align 3
-.L814:
-	.loc 1 434 0
-	orr	w4, w4, 251658240
-	b	.L705
-.LVL835:
+.L811:
+	.loc 1 410 0
+	orr	w3, w3, 3840
+	b	.L697
+.LVL824:
 	.p2align 3
-.L815:
+.L816:
 	.loc 1 440 0
-	orr	w4, w4, -268435456
-.LVL836:
+	orr	w3, w3, -268435456
+.LVL825:
 	.loc 1 445 0
-	and	w0, w0, w26
-.LVL837:
-	eor	w0, w0, w4
-.LVL838:
+	and	w1, w1, w25
+.LVL826:
+	eor	w1, w1, w3
+.LVL827:
 	.loc 1 389 0
-	add	w5, w5, 1
-	and	w0, w0, w3
-	cmp	w5, w10
+	add	w4, w4, 1
+	and	w1, w1, w18
+	cmp	w4, w8
 	.loc 1 445 0
-	eor	w0, w4, w0
+	eor	w1, w3, w1
 	.loc 1 446 0
-	str	w0, [x9, x1]
+	str	w1, [x7, x0]
 	.loc 1 389 0
 	ble	.L764
-.LVL839:
+.LVL828:
 	.p2align 2
 .L710:
 	.loc 1 384 0
-	add	w16, w16, 1
-	add	w7, w7, w18
-	cmp	w16, w25
+	add	w14, w14, 1
+	add	w5, w5, w16
+	cmp	w14, w17
 	ble	.L763
 .L693:
 .LBE1822:
-.LBE1828:
+.LBE1827:
 	.loc 1 1195 0
-	ldr	w0, [x28, 28]
+	ldr	w0, [x24, 28]
 	cbnz	w0, .L690
-	.loc 1 1198 0
-	ldr	w0, [x28, 184]
 	.loc 1 1196 0
-	mov	w1, 1
+	mov	w0, 1
+	str	w0, [x24, 28]
+	.loc 1 1198 0
+	ldr	w0, [x24, 184]
 	.loc 1 1197 0
-	str	wzr, [x28, 76]
-	.loc 1 1196 0
-	str	w1, [x28, 28]
+	str	wzr, [x24, 76]
 	.loc 1 1198 0
 	cbz	w0, .L818
 .L711:
 	.loc 1 1200 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL840:
+.LVL829:
 	cmn	w0, #1
 	beq	.L690
 	.loc 1 1204 0
-	ldr	w3, [x28, 96]
+	ldr	w3, [x24, 96]
 	.loc 1 1207 0
-	adrp	x1, .LC81
+	adrp	x1, .LC82
 	.loc 1 1204 0
-	strb	w3, [x28, 32]
+	strb	w3, [x24, 32]
 	.loc 1 1207 0
-	add	x1, x1, :lo12:.LC81
-	ldr	x0, [x28, 88]
+	add	x1, x1, :lo12:.LC82
+	ldr	x0, [x24, 88]
 	b	.L779
-.LVL841:
+.LVL830:
 	.p2align 3
-.L809:
-.LBB1829:
+.L812:
+.LBB1828:
 .LBB1823:
-	.loc 1 404 0
-	orr	w4, w4, 240
-	b	.L695
+	.loc 1 416 0
+	orr	w3, w3, 61440
+	b	.L699
 	.p2align 3
-.L810:
-	.loc 1 410 0
-	orr	w4, w4, 3840
-	b	.L697
-.LVL842:
-.L682:
+.L813:
+	.loc 1 422 0
+	orr	w3, w3, 983040
+	b	.L701
+	.p2align 3
+.L814:
+	.loc 1 428 0
+	orr	w3, w3, 15728640
+	b	.L703
+	.p2align 3
+.L815:
+	.loc 1 434 0
+	orr	w3, w3, 251658240
+	b	.L705
+.LVL831:
+.L808:
 .LBE1823:
+.LBE1828:
+.LBB1829:
+.LBB1815:
+.LBB1816:
+	.loc 1 1328 0 discriminator 1
+	add	x27, x21, 352
+.LBE1816:
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL832:
+	b	.L728
+	.p2align 3
+.L819:
+.LVL833:
+.LBB1817:
+	.loc 1 1328 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L725
+	.loc 1 1328 0 discriminator 7
+	bl	schedule
+.LVL834:
+.L728:
+	.loc 1 1328 0 discriminator 9
+	add	x1, x29, 112
+	mov	w2, 1
+	mov	x0, x27
+	bl	prepare_to_wait_event
+.LVL835:
+	ldr	w1, [x24, 76]
+	cbz	w1, .L819
+.LBE1817:
+	.loc 1 1328 0 discriminator 4
+	mov	x0, x27
+	add	x1, x29, 112
+	bl	finish_wait
+.LVL836:
+	b	.L725
+.L682:
+.LBE1815:
 .LBE1829:
-	.loc 1 1173 0
-	ldr	x0, [x28, 88]
-	adrp	x1, .LC80
-	add	x1, x1, :lo12:.LC80
+	.loc 1 1173 0 is_stmt 1
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC81
+	add	x1, x1, :lo12:.LC81
 	bl	_dev_info
-.LVL843:
+.LVL837:
 	.loc 1 1174 0
-	mov	x0, x23
+	mov	x0, x28
 	b	.L777
-.LVL844:
+.LVL838:
 .L787:
 .LBB1830:
 .LBB1831:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.8
-.LVL845:
+.LVL839:
 	b	.L657
-.LVL846:
+.LVL840:
 .L818:
 .LBE1831:
 .LBE1830:
 	.loc 1 1199 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.12
-.LVL847:
+.LVL841:
 	b	.L711
-.LVL848:
+.LVL842:
 .L794:
 	.loc 1 1146 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.12
-.LVL849:
+.LVL843:
 	b	.L665
-.LVL850:
+.LVL844:
 .L788:
-	.loc 1 1390 0
+	.loc 1 1391 0
 	bl	__stack_chk_fail
-.LVL851:
+.LVL845:
 	.cfi_endproc
 .LFE2825:
 	.size	ebc_thread, .-ebc_thread
@@ -9161,7 +9155,7 @@ ebc_driver:
 	.xword	ebc_probe
 	.xword	ebc_remove
 	.zero	24
-	.xword	.LC89
+	.xword	.LC90
 	.zero	32
 	.xword	ebc_match
 	.zero	64
@@ -9173,7 +9167,7 @@ ebc_driver:
 ebc_misc:
 	.word	243
 	.zero	4
-	.xword	.LC42
+	.xword	.LC43
 	.xword	ebc_ops
 	.zero	56
 	.type	ebc_thread_wq, %object
@@ -9207,7 +9201,7 @@ ebc_auto_thread_sem:
 	.type	dev_attr_waveform_version, %object
 	.size	dev_attr_waveform_version, 32
 dev_attr_waveform_version:
-	.xword	.LC95
+	.xword	.LC96
 	.hword	292
 	.zero	6
 	.xword	waveform_version_read
@@ -9215,7 +9209,7 @@ dev_attr_waveform_version:
 	.type	dev_attr_pmic_name, %object
 	.size	dev_attr_pmic_name, 32
 dev_attr_pmic_name:
-	.xword	.LC94
+	.xword	.LC95
 	.hword	292
 	.zero	6
 	.xword	pmic_name_read
@@ -9223,7 +9217,7 @@ dev_attr_pmic_name:
 	.type	dev_attr_pmic_temp, %object
 	.size	dev_attr_pmic_temp, 32
 dev_attr_pmic_temp:
-	.xword	.LC93
+	.xword	.LC94
 	.hword	292
 	.zero	6
 	.xword	pmic_temp_read
@@ -9231,7 +9225,7 @@ dev_attr_pmic_temp:
 	.type	dev_attr_pmic_vcom, %object
 	.size	dev_attr_pmic_vcom, 32
 dev_attr_pmic_vcom:
-	.xword	.LC92
+	.xword	.LC93
 	.hword	420
 	.zero	6
 	.xword	pmic_vcom_read
@@ -9239,7 +9233,7 @@ dev_attr_pmic_vcom:
 	.type	dev_attr_ebc_version, %object
 	.size	dev_attr_ebc_version, 32
 dev_attr_ebc_version:
-	.xword	.LC91
+	.xword	.LC92
 	.hword	292
 	.zero	6
 	.xword	ebc_version_read
@@ -9247,7 +9241,7 @@ dev_attr_ebc_version:
 	.type	dev_attr_ebc_state, %object
 	.size	dev_attr_ebc_state, 32
 dev_attr_ebc_state:
-	.xword	.LC90
+	.xword	.LC91
 	.hword	292
 	.zero	6
 	.xword	ebc_state_read
@@ -9324,9 +9318,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init2261, %object
-	.size	__addressable_ebc_init2261, 8
-__addressable_ebc_init2261:
+	.type	__addressable_ebc_init2262, %object
+	.size	__addressable_ebc_init2262, 8
+__addressable_ebc_init2262:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -9366,252 +9360,255 @@ __exitcall_ebc_exit:
 	.string	"frame done\n"
 	.zero	4
 .LC10:
-	.string	"temperature = %d, out of range0~50 ,use 25 \n"
-	.zero	3
+	.string	"temperature = %d, out of range0~50 ,use 0 \n"
+	.zero	4
 .LC11:
-	.string	"ebc_pmic_read_temp failed, ret = %d\n"
+	.string	"temperature = %d, out of range0~50 ,use 50 \n"
 	.zero	3
 .LC12:
+	.string	"ebc_pmic_read_temp failed, ret = %d\n"
+	.zero	3
+.LC13:
 	.string	"lut update use temperature = %d\n"
 	.zero	7
-.LC13:
+.LC14:
 	.string	"get lut data failed\n"
 	.zero	3
-.LC14:
+.LC15:
 	.string	"%d\n"
 	.zero	4
-.LC15:
-	.string	"2.03"
-	.zero	3
 .LC16:
+	.string	"2.05"
+	.zero	3
+.LC17:
 	.string	"%s\n"
 	.zero	4
-.LC17:
+.LC18:
 	.string	"invalid value = %s\n"
 	.zero	4
-.LC18:
+.LC19:
 	.string	"set vcom value failed\n"
 	.zero	1
-.LC19:
+.LC20:
 	.string	"%s: no need to update\n"
 	.zero	1
-.LC20:
+.LC21:
 	.string	"ebc hw power off\n"
 	.zero	6
-.LC21:
+.LC22:
 	.string	"%s: device is busy now...\n"
 	.zero	5
-.LC22:
-	.string	"device suspend\n"
 .LC23:
+	.string	"device suspend\n"
+.LC24:
 	.string	"ebc_tcon"
 	.zero	7
-.LC24:
+.LC25:
 	.string	"not find ebc tcon\n"
 	.zero	5
-.LC25:
+.LC26:
 	.string	"pmic"
 	.zero	3
-.LC26:
+.LC27:
 	.string	"not find pmic node\n"
 	.zero	4
-.LC27:
+.LC28:
 	.string	"not find pmic i2c client\n"
 	.zero	6
-.LC28:
+.LC29:
 	.string	"get drvdata from pmic client failed\n"
 	.zero	3
-.LC29:
+.LC30:
 	.string	"panel,width"
 	.zero	4
-.LC30:
+.LC31:
 	.string	"panel,panel_color"
 	.zero	6
-.LC31:
+.LC32:
 	.string	"panel,mirror"
 	.zero	3
-.LC32:
+.LC33:
 	.string	"panel,width-mm"
 	.zero	1
-.LC33:
-	.string	"panel,height-mm"
 .LC34:
+	.string	"panel,height-mm"
+.LC35:
 	.string	"memory-region"
 	.zero	2
-.LC35:
+.LC36:
 	.string	"Couldn't address to resource for reserved memory\n"
 	.zero	6
-.LC36:
-	.string	"waveform-region"
 .LC37:
-	.string	"%s:%d: failed to get mem from reserved\n"
+	.string	"waveform-region"
 .LC38:
+	.string	"%s:%d: failed to get mem from reserved\n"
+.LC39:
 	.string	"Failed to read waveform from mem, we use waveform file from kernel file instead\n"
 	.zero	7
-.LC39:
+.LC40:
 	.string	"Failed to read waveform file from kernel, no waveform!!!\n"
 	.zero	6
-.LC40:
+.LC41:
 	.string	"failed to create ebc_task thread\n"
 	.zero	6
-.LC41:
+.LC42:
 	.string	"ebc_thread"
 	.zero	5
-.LC42:
+.LC43:
 	.string	"ebc"
 	.zero	4
-.LC43:
+.LC44:
 	.string	"ulogo_addr="
 	.zero	4
-.LC44:
+.LC45:
 	.string	"klogo_addr="
 	.zero	4
-.LC45:
-	.string	"ulogo_addr=0x%x"
 .LC46:
+	.string	"ulogo_addr=0x%x"
+.LC47:
 	.string	"have ulogo display, ulogo addr = 0x%x\n"
 	.zero	1
-.LC47:
+.LC48:
 	.string	"malloc ulogo buffer failed\n"
 	.zero	4
-.LC48:
-	.string	"klogo_addr=0x%x"
 .LC49:
+	.string	"klogo_addr=0x%x"
+.LC50:
 	.string	"need show klogo, klogo addr = 0x%x\n"
 	.zero	4
-.LC50:
+.LC51:
 	.string	"malloc klogo buffer failed\n"
 	.zero	4
-.LC51:
+.LC52:
 	.string	"no uboot logo, panel init\n"
 	.zero	5
-.LC52:
+.LC53:
 	.string	"rockchip ebc driver %s probe success\n"
 	.zero	2
-.LC53:
+.LC54:
 	.string	"panel,height"
 	.zero	3
-.LC54:
-	.string	"panel,vir_width"
 .LC55:
+	.string	"panel,vir_width"
+.LC56:
 	.string	"panel,vir_height"
 	.zero	7
-.LC56:
+.LC57:
 	.string	"panel,sdck"
 	.zero	5
-.LC57:
+.LC58:
 	.string	"panel,lsl"
 	.zero	6
-.LC58:
+.LC59:
 	.string	"panel,lbl"
 	.zero	6
-.LC59:
+.LC60:
 	.string	"panel,ldl"
 	.zero	6
-.LC60:
+.LC61:
 	.string	"panel,lel"
 	.zero	6
-.LC61:
+.LC62:
 	.string	"panel,gdck-sta"
 	.zero	1
-.LC62:
+.LC63:
 	.string	"panel,lgonl"
 	.zero	4
-.LC63:
+.LC64:
 	.string	"panel,fsl"
 	.zero	6
-.LC64:
+.LC65:
 	.string	"panel,fbl"
 	.zero	6
-.LC65:
+.LC66:
 	.string	"panel,fdl"
 	.zero	6
-.LC66:
+.LC67:
 	.string	"panel,fel"
 	.zero	6
-.LC67:
+.LC68:
 	.string	"panel,panel_16bit"
 	.zero	6
-.LC68:
+.LC69:
 	.string	"buffer manage init failed\n"
 	.zero	5
-.LC69:
+.LC70:
 	.string	"lut table init failed\n"
 	.zero	1
-.LC70:
+.LC71:
 	.string	"ebc_task"
 	.zero	7
-.LC71:
+.LC72:
 	.string	"failed to run ebc thread\n"
 	.zero	6
-.LC72:
+.LC73:
 	.string	"task init failed\n"
 	.zero	6
-.LC73:
+.LC74:
 	.string	"failed to probe panel: %d\n"
 	.zero	5
-.LC74:
+.LC75:
 	.string	"ebc hw power on\n"
 	.zero	7
-.LC75:
+.LC76:
 	.string	"early resume\n"
 	.zero	2
-.LC76:
+.LC77:
 	.string	"overlay mode start, update background, frame_total=%d\n"
 	.zero	1
-.LC77:
+.LC78:
 	.string	"change display mode from %d to %d\n"
 	.zero	5
-.LC78:
+.LC79:
 	.string	"ebc is busy now, waiting prev refresh mode end...\n"
 	.zero	5
-.LC79:
+.LC80:
 	.string	"prev refresh mode end\n"
 	.zero	1
-.LC80:
+.LC81:
 	.string	"overlay disabled, drop EPD_OVERLAY frame\n"
 	.zero	6
-.LC81:
+.LC82:
 	.string	"overlay mode start, frame_total=%d\n"
 	.zero	4
-.LC82:
+.LC83:
 	.string	"ebc_lut_update err\n"
 	.zero	4
-.LC83:
+.LC84:
 	.string	"auto mode start, frame_total=%d\n"
 	.zero	7
-.LC84:
+.LC85:
 	.string	"frame start, mode = %d, framecount = %d\n"
 	.zero	7
-.LC85:
-	.string	"ebc buffer mode error!\n"
 .LC86:
+	.string	"ebc buffer mode error!\n"
+.LC87:
 	.string	"power off\n"
 	.zero	5
-.LC87:
+.LC88:
 	.string	"early suspend\n"
 	.zero	1
-.LC88:
+.LC89:
 	.string	"check_part_mode==0, no need refresh\n"
 	.zero	3
-.LC89:
-	.string	"ebc-dev"
 .LC90:
+	.string	"ebc-dev"
+.LC91:
 	.string	"ebc_state"
 	.zero	6
-.LC91:
+.LC92:
 	.string	"ebc_version"
 	.zero	4
-.LC92:
+.LC93:
 	.string	"pmic_vcom"
 	.zero	6
-.LC93:
+.LC94:
 	.string	"pmic_temp"
 	.zero	6
-.LC94:
+.LC95:
 	.string	"pmic_name"
 	.zero	6
-.LC95:
+.LC96:
 	.string	"waveform_version"
 	.text
 .Letext0:
@@ -9811,7 +9808,7 @@ __exitcall_ebc_exit:
 	.file 212 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x14272
+	.4byte	0x1427f
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
@@ -37430,7 +37427,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3006
 	.byte	0x1
-	.2byte	0x6b4
+	.2byte	0x6b5
 	.4byte	0x7b4
 	.uleb128 0x9
 	.byte	0x3
@@ -37438,7 +37435,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3007
 	.byte	0x1
-	.2byte	0x6be
+	.2byte	0x6bf
 	.4byte	0xc5f5
 	.uleb128 0x9
 	.byte	0x3
@@ -37446,7 +37443,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3008
 	.byte	0x1
-	.2byte	0x6cd
+	.2byte	0x6ce
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
@@ -37454,7 +37451,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3009
 	.byte	0x1
-	.2byte	0x6d8
+	.2byte	0x6d9
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
@@ -37462,7 +37459,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3010
 	.byte	0x1
-	.2byte	0x6e6
+	.2byte	0x6e7
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
@@ -37470,7 +37467,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3011
 	.byte	0x1
-	.2byte	0x709
+	.2byte	0x70a
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
@@ -37478,7 +37475,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3012
 	.byte	0x1
-	.2byte	0x713
+	.2byte	0x714
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
@@ -37486,7 +37483,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3013
 	.byte	0x1
-	.2byte	0x71c
+	.2byte	0x71d
 	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
@@ -37494,7 +37491,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3014
 	.byte	0x1
-	.2byte	0x8b6
+	.2byte	0x8b7
 	.4byte	0xa547
 	.uleb128 0x9
 	.byte	0x3
@@ -37511,7 +37508,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3015
 	.byte	0x1
-	.2byte	0x8bb
+	.2byte	0x8bc
 	.4byte	0xe5d7
 	.uleb128 0x9
 	.byte	0x3
@@ -37519,7 +37516,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3016
 	.byte	0x1
-	.2byte	0x8c1
+	.2byte	0x8c2
 	.4byte	0xd683
 	.uleb128 0x9
 	.byte	0x3
@@ -37527,15 +37524,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3017
 	.byte	0x1
-	.2byte	0x8d5
+	.2byte	0x8d6
 	.4byte	0x443
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init2261
+	.8byte	__addressable_ebc_init2262
 	.uleb128 0x4c
 	.4byte	.LASF3018
 	.byte	0x1
-	.2byte	0x8d6
+	.2byte	0x8d7
 	.4byte	0x497
 	.uleb128 0x9
 	.byte	0x3
@@ -37543,7 +37540,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x8d0
+	.2byte	0x8d1
 	.8byte	.LFB2851
 	.8byte	.LFE2851-.LFB2851
 	.uleb128 0x1
@@ -37551,12 +37548,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe660
 	.uleb128 0x4e
 	.8byte	.LVL34
-	.4byte	0x13f76
+	.4byte	0x13f83
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x8cb
+	.2byte	0x8cc
 	.4byte	0xc6
 	.8byte	.LFB2850
 	.8byte	.LFE2850-.LFB2850
@@ -37565,12 +37562,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe690
 	.uleb128 0x4e
 	.8byte	.LVL319
-	.4byte	0x13f82
+	.4byte	0x13f8f
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x8aa
+	.2byte	0x8ab
 	.4byte	0xc6
 	.8byte	.LFB2849
 	.8byte	.LFE2849-.LFB2849
@@ -37580,42 +37577,42 @@ __exitcall_ebc_exit:
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x8aa
+	.2byte	0x8ab
 	.4byte	0xa55b
 	.4byte	.LLST7
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x8ac
+	.2byte	0x8ad
 	.4byte	0xe47d
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x8ad
+	.2byte	0x8ae
 	.4byte	0xe72c
 	.uleb128 0x53
-	.4byte	0x13367
+	.4byte	0x13374
 	.8byte	.LBB926
 	.8byte	.LBE926-.LBB926
 	.byte	0x1
-	.2byte	0x8ac
+	.2byte	0x8ad
 	.4byte	0xe6fc
 	.uleb128 0x54
-	.4byte	0x13378
+	.4byte	0x13385
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12f58
+	.4byte	0x12f65
 	.8byte	.LBB928
 	.8byte	.LBE928-.LBB928
 	.byte	0x1
-	.2byte	0x8af
+	.2byte	0x8b0
 	.4byte	0xe71e
 	.uleb128 0x54
-	.4byte	0x12f64
+	.4byte	0x12f71
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL38
-	.4byte	0x13f8e
+	.4byte	0x13f9b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -37623,7 +37620,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x50
 	.4byte	.LASF3022
 	.byte	0x1
-	.2byte	0x899
+	.2byte	0x89a
 	.4byte	0xc6
 	.8byte	.LFB2848
 	.8byte	.LFE2848-.LFB2848
@@ -37633,18 +37630,18 @@ __exitcall_ebc_exit:
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x899
+	.2byte	0x89a
 	.4byte	0xa55b
 	.4byte	.LLST139
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x89b
+	.2byte	0x89c
 	.4byte	0xe47d
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x89c
+	.2byte	0x89d
 	.4byte	0xe72c
 	.uleb128 0x55
 	.4byte	.LASF3023
@@ -37653,52 +37650,52 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	__func__.35204
 	.uleb128 0x53
-	.4byte	0x13367
+	.4byte	0x13374
 	.8byte	.LBB1404
 	.8byte	.LBE1404-.LBB1404
 	.byte	0x1
-	.2byte	0x89b
+	.2byte	0x89c
 	.4byte	0xe7b1
 	.uleb128 0x54
-	.4byte	0x13378
+	.4byte	0x13385
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12f70
+	.4byte	0x12f7d
 	.8byte	.LBB1406
 	.8byte	.LBE1406-.LBB1406
 	.byte	0x1
-	.2byte	0x8a4
+	.2byte	0x8a5
 	.4byte	0xe7d3
 	.uleb128 0x54
-	.4byte	0x12f7c
+	.4byte	0x12f89
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12cbe
+	.4byte	0x12ccb
 	.8byte	.LBB1408
 	.8byte	.LBE1408-.LBB1408
 	.byte	0x1
-	.2byte	0x8a0
+	.2byte	0x8a1
 	.4byte	0xe81e
 	.uleb128 0x54
-	.4byte	0x12cd9
+	.4byte	0x12ce6
 	.uleb128 0x54
-	.4byte	0x12cce
+	.4byte	0x12cdb
 	.uleb128 0x56
 	.8byte	.LBB1409
 	.8byte	.LBE1409-.LBB1409
 	.uleb128 0x57
-	.4byte	0x12ce4
+	.4byte	0x12cf1
 	.uleb128 0x4e
 	.8byte	.LVL472
-	.4byte	0x13e06
+	.4byte	0x13e13
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL470
-	.4byte	0x13f8e
+	.4byte	0x13f9b
 	.uleb128 0x4e
 	.8byte	.LVL471
-	.4byte	0x13f8e
+	.4byte	0x13f9b
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
@@ -37712,7 +37709,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3024
 	.byte	0x1
-	.2byte	0x892
+	.2byte	0x893
 	.4byte	0xc6
 	.8byte	.LFB2847
 	.8byte	.LFE2847-.LFB2847
@@ -37722,17 +37719,17 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	.LASF3025
 	.byte	0x1
-	.2byte	0x892
+	.2byte	0x893
 	.4byte	0xd6ff
 	.4byte	.LLST9
 	.uleb128 0x4e
 	.8byte	.LVL44
-	.4byte	0x13f9b
+	.4byte	0x13fa8
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3026
 	.byte	0x1
-	.2byte	0x825
+	.2byte	0x826
 	.4byte	0xc6
 	.8byte	.LFB2846
 	.8byte	.LFE2846-.LFB2846
@@ -37742,110 +37739,110 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	.LASF3025
 	.byte	0x1
-	.2byte	0x825
+	.2byte	0x826
 	.4byte	0xd6ff
 	.4byte	.LLST140
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x827
+	.2byte	0x828
 	.4byte	0xa55b
 	.uleb128 0x46
 	.4byte	.LASF3027
 	.byte	0x1
-	.2byte	0x828
+	.2byte	0x829
 	.4byte	0xb87f
 	.uleb128 0x59
 	.4byte	.LASF3028
 	.byte	0x1
-	.2byte	0x829
+	.2byte	0x82a
 	.4byte	0xd6ff
 	.4byte	.LLST141
 	.uleb128 0x46
 	.4byte	.LASF3029
 	.byte	0x1
-	.2byte	0x82a
+	.2byte	0x82b
 	.4byte	0xb87f
 	.uleb128 0x59
 	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0x82b
+	.2byte	0x82c
 	.4byte	0xc028
 	.4byte	.LLST142
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x82c
+	.2byte	0x82d
 	.4byte	0xe47d
 	.uleb128 0x59
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x82d
+	.2byte	0x82e
 	.4byte	0xe72c
 	.4byte	.LLST143
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x82e
+	.2byte	0x82f
 	.4byte	0xe13f
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x82f
+	.2byte	0x830
 	.4byte	0xc6
 	.uleb128 0x5a
-	.4byte	0x13385
+	.4byte	0x13392
 	.8byte	.LBB1555
 	.4byte	.Ldebug_ranges0+0xba0
 	.byte	0x1
-	.2byte	0x831
+	.2byte	0x832
 	.4byte	0xe96d
 	.uleb128 0x54
-	.4byte	0x133ae
+	.4byte	0x133bb
 	.uleb128 0x54
-	.4byte	0x133a2
+	.4byte	0x133af
 	.uleb128 0x54
-	.4byte	0x13396
+	.4byte	0x133a3
 	.uleb128 0x4e
 	.8byte	.LVL475
-	.4byte	0x13fa7
+	.4byte	0x13fb4
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13262
+	.4byte	0x1326f
 	.8byte	.LBB1559
 	.8byte	.LBE1559-.LBB1559
 	.byte	0x1
-	.2byte	0x843
+	.2byte	0x844
 	.4byte	0xe9ac
 	.uleb128 0x54
-	.4byte	0x13272
+	.4byte	0x1327f
 	.uleb128 0x5b
-	.4byte	0x13367
+	.4byte	0x13374
 	.8byte	.LBB1560
 	.8byte	.LBE1560-.LBB1560
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x54
-	.4byte	0x13378
+	.4byte	0x13385
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13284
+	.4byte	0x13291
 	.8byte	.LBB1562
 	.8byte	.LBE1562-.LBB1562
 	.byte	0x1
-	.2byte	0x854
+	.2byte	0x855
 	.4byte	0xe9ec
 	.uleb128 0x54
-	.4byte	0x13295
+	.4byte	0x132a2
 	.uleb128 0x5c
-	.4byte	0x13367
+	.4byte	0x13374
 	.8byte	.LBB1563
 	.8byte	.LBE1563-.LBB1563
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x54
-	.4byte	0x13378
+	.4byte	0x13385
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
@@ -37853,7 +37850,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1565
 	.4byte	.Ldebug_ranges0+0xbd0
 	.byte	0x1
-	.2byte	0x862
+	.2byte	0x863
 	.4byte	0xf3a5
 	.uleb128 0x54
 	.4byte	0x115bd
@@ -37862,768 +37859,768 @@ __exitcall_ebc_exit:
 	.uleb128 0x57
 	.4byte	0x115c9
 	.uleb128 0x5a
-	.4byte	0x132a8
+	.4byte	0x132b5
 	.8byte	.LBB1567
 	.4byte	.Ldebug_ranges0+0xc30
 	.byte	0x1
-	.2byte	0x596
+	.2byte	0x597
 	.4byte	0xea7c
 	.uleb128 0x54
-	.4byte	0x132d0
+	.4byte	0x132dd
 	.uleb128 0x54
-	.4byte	0x132c4
+	.4byte	0x132d1
 	.uleb128 0x54
-	.4byte	0x132b9
+	.4byte	0x132c6
 	.uleb128 0x5e
-	.4byte	0x132dd
+	.4byte	0x132ea
 	.8byte	.LBB1568
 	.4byte	.Ldebug_ranges0+0xc30
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13311
+	.4byte	0x1331e
 	.uleb128 0x54
-	.4byte	0x13305
+	.4byte	0x13312
 	.uleb128 0x54
-	.4byte	0x132f9
+	.4byte	0x13306
 	.uleb128 0x54
-	.4byte	0x132ee
+	.4byte	0x132fb
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xc30
 	.uleb128 0x57
-	.4byte	0x1331c
+	.4byte	0x13329
 	.uleb128 0x4e
 	.8byte	.LVL483
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132a8
+	.4byte	0x132b5
 	.8byte	.LBB1579
 	.8byte	.LBE1579-.LBB1579
 	.byte	0x1
-	.2byte	0x599
+	.2byte	0x59a
 	.4byte	0xeaf9
 	.uleb128 0x54
-	.4byte	0x132d0
+	.4byte	0x132dd
 	.uleb128 0x54
-	.4byte	0x132c4
+	.4byte	0x132d1
 	.uleb128 0x54
-	.4byte	0x132b9
+	.4byte	0x132c6
 	.uleb128 0x5c
-	.4byte	0x132dd
+	.4byte	0x132ea
 	.8byte	.LBB1580
 	.8byte	.LBE1580-.LBB1580
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13311
+	.4byte	0x1331e
 	.uleb128 0x54
-	.4byte	0x13305
+	.4byte	0x13312
 	.uleb128 0x54
-	.4byte	0x132f9
+	.4byte	0x13306
 	.uleb128 0x54
-	.4byte	0x132ee
+	.4byte	0x132fb
 	.uleb128 0x56
 	.8byte	.LBB1581
 	.8byte	.LBE1581-.LBB1581
 	.uleb128 0x57
-	.4byte	0x1331c
+	.4byte	0x13329
 	.uleb128 0x4e
 	.8byte	.LVL484
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132a8
+	.4byte	0x132b5
 	.8byte	.LBB1582
 	.8byte	.LBE1582-.LBB1582
 	.byte	0x1
-	.2byte	0x59c
+	.2byte	0x59d
 	.4byte	0xeb76
 	.uleb128 0x54
-	.4byte	0x132d0
+	.4byte	0x132dd
 	.uleb128 0x54
-	.4byte	0x132c4
+	.4byte	0x132d1
 	.uleb128 0x54
-	.4byte	0x132b9
+	.4byte	0x132c6
 	.uleb128 0x5c
-	.4byte	0x132dd
+	.4byte	0x132ea
 	.8byte	.LBB1583
 	.8byte	.LBE1583-.LBB1583
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13311
+	.4byte	0x1331e
 	.uleb128 0x54
-	.4byte	0x13305
+	.4byte	0x13312
 	.uleb128 0x54
-	.4byte	0x132f9
+	.4byte	0x13306
 	.uleb128 0x54
-	.4byte	0x132ee
+	.4byte	0x132fb
 	.uleb128 0x56
 	.8byte	.LBB1584
 	.8byte	.LBE1584-.LBB1584
 	.uleb128 0x57
-	.4byte	0x1331c
+	.4byte	0x13329
 	.uleb128 0x4e
 	.8byte	.LVL485
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132a8
+	.4byte	0x132b5
 	.8byte	.LBB1585
 	.8byte	.LBE1585-.LBB1585
 	.byte	0x1
-	.2byte	0x59f
+	.2byte	0x5a0
 	.4byte	0xebf3
 	.uleb128 0x54
-	.4byte	0x132d0
+	.4byte	0x132dd
 	.uleb128 0x54
-	.4byte	0x132c4
+	.4byte	0x132d1
 	.uleb128 0x54
-	.4byte	0x132b9
+	.4byte	0x132c6
 	.uleb128 0x5c
-	.4byte	0x132dd
+	.4byte	0x132ea
 	.8byte	.LBB1586
 	.8byte	.LBE1586-.LBB1586
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13311
+	.4byte	0x1331e
 	.uleb128 0x54
-	.4byte	0x13305
+	.4byte	0x13312
 	.uleb128 0x54
-	.4byte	0x132f9
+	.4byte	0x13306
 	.uleb128 0x54
-	.4byte	0x132ee
+	.4byte	0x132fb
 	.uleb128 0x56
 	.8byte	.LBB1587
 	.8byte	.LBE1587-.LBB1587
 	.uleb128 0x57
-	.4byte	0x1331c
+	.4byte	0x13329
 	.uleb128 0x4e
 	.8byte	.LVL486
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132a8
+	.4byte	0x132b5
 	.8byte	.LBB1588
 	.8byte	.LBE1588-.LBB1588
 	.byte	0x1
-	.2byte	0x5a2
+	.2byte	0x5a3
 	.4byte	0xec70
 	.uleb128 0x54
-	.4byte	0x132d0
+	.4byte	0x132dd
 	.uleb128 0x54
-	.4byte	0x132c4
+	.4byte	0x132d1
 	.uleb128 0x54
-	.4byte	0x132b9
+	.4byte	0x132c6
 	.uleb128 0x5c
-	.4byte	0x132dd
+	.4byte	0x132ea
 	.8byte	.LBB1589
 	.8byte	.LBE1589-.LBB1589
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13311
+	.4byte	0x1331e
 	.uleb128 0x54
-	.4byte	0x13305
+	.4byte	0x13312
 	.uleb128 0x54
-	.4byte	0x132f9
+	.4byte	0x13306
 	.uleb128 0x54
-	.4byte	0x132ee
+	.4byte	0x132fb
 	.uleb128 0x56
 	.8byte	.LBB1590
 	.8byte	.LBE1590-.LBB1590
 	.uleb128 0x57
-	.4byte	0x1331c
+	.4byte	0x13329
 	.uleb128 0x4e
 	.8byte	.LVL487
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132a8
+	.4byte	0x132b5
 	.8byte	.LBB1591
 	.8byte	.LBE1591-.LBB1591
 	.byte	0x1
-	.2byte	0x5a5
+	.2byte	0x5a6
 	.4byte	0xeced
 	.uleb128 0x54
-	.4byte	0x132d0
+	.4byte	0x132dd
 	.uleb128 0x54
-	.4byte	0x132c4
+	.4byte	0x132d1
 	.uleb128 0x54
-	.4byte	0x132b9
+	.4byte	0x132c6
 	.uleb128 0x5c
-	.4byte	0x132dd
+	.4byte	0x132ea
 	.8byte	.LBB1592
 	.8byte	.LBE1592-.LBB1592
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13311
+	.4byte	0x1331e
 	.uleb128 0x54
-	.4byte	0x13305
+	.4byte	0x13312
 	.uleb128 0x54
-	.4byte	0x132f9
+	.4byte	0x13306
 	.uleb128 0x54
-	.4byte	0x132ee
+	.4byte	0x132fb
 	.uleb128 0x56
 	.8byte	.LBB1593
 	.8byte	.LBE1593-.LBB1593
 	.uleb128 0x57
-	.4byte	0x1331c
+	.4byte	0x13329
 	.uleb128 0x4e
 	.8byte	.LVL488
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132a8
+	.4byte	0x132b5
 	.8byte	.LBB1594
 	.8byte	.LBE1594-.LBB1594
 	.byte	0x1
-	.2byte	0x5a8
+	.2byte	0x5a9
 	.4byte	0xed6a
 	.uleb128 0x54
-	.4byte	0x132d0
+	.4byte	0x132dd
 	.uleb128 0x54
-	.4byte	0x132c4
+	.4byte	0x132d1
 	.uleb128 0x54
-	.4byte	0x132b9
+	.4byte	0x132c6
 	.uleb128 0x5c
-	.4byte	0x132dd
+	.4byte	0x132ea
 	.8byte	.LBB1595
 	.8byte	.LBE1595-.LBB1595
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13311
+	.4byte	0x1331e
 	.uleb128 0x54
-	.4byte	0x13305
+	.4byte	0x13312
 	.uleb128 0x54
-	.4byte	0x132f9
+	.4byte	0x13306
 	.uleb128 0x54
-	.4byte	0x132ee
+	.4byte	0x132fb
 	.uleb128 0x56
 	.8byte	.LBB1596
 	.8byte	.LBE1596-.LBB1596
 	.uleb128 0x57
-	.4byte	0x1331c
+	.4byte	0x13329
 	.uleb128 0x4e
 	.8byte	.LVL489
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132a8
+	.4byte	0x132b5
 	.8byte	.LBB1597
 	.8byte	.LBE1597-.LBB1597
 	.byte	0x1
-	.2byte	0x5ab
+	.2byte	0x5ac
 	.4byte	0xede7
 	.uleb128 0x54
-	.4byte	0x132d0
+	.4byte	0x132dd
 	.uleb128 0x54
-	.4byte	0x132c4
+	.4byte	0x132d1
 	.uleb128 0x54
-	.4byte	0x132b9
+	.4byte	0x132c6
 	.uleb128 0x5c
-	.4byte	0x132dd
+	.4byte	0x132ea
 	.8byte	.LBB1598
 	.8byte	.LBE1598-.LBB1598
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13311
+	.4byte	0x1331e
 	.uleb128 0x54
-	.4byte	0x13305
+	.4byte	0x13312
 	.uleb128 0x54
-	.4byte	0x132f9
+	.4byte	0x13306
 	.uleb128 0x54
-	.4byte	0x132ee
+	.4byte	0x132fb
 	.uleb128 0x56
 	.8byte	.LBB1599
 	.8byte	.LBE1599-.LBB1599
 	.uleb128 0x57
-	.4byte	0x1331c
+	.4byte	0x13329
 	.uleb128 0x4e
 	.8byte	.LVL490
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132a8
+	.4byte	0x132b5
 	.8byte	.LBB1600
 	.8byte	.LBE1600-.LBB1600
 	.byte	0x1
-	.2byte	0x5ae
+	.2byte	0x5af
 	.4byte	0xee64
 	.uleb128 0x54
-	.4byte	0x132d0
+	.4byte	0x132dd
 	.uleb128 0x54
-	.4byte	0x132c4
+	.4byte	0x132d1
 	.uleb128 0x54
-	.4byte	0x132b9
+	.4byte	0x132c6
 	.uleb128 0x5c
-	.4byte	0x132dd
+	.4byte	0x132ea
 	.8byte	.LBB1601
 	.8byte	.LBE1601-.LBB1601
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13311
+	.4byte	0x1331e
 	.uleb128 0x54
-	.4byte	0x13305
+	.4byte	0x13312
 	.uleb128 0x54
-	.4byte	0x132f9
+	.4byte	0x13306
 	.uleb128 0x54
-	.4byte	0x132ee
+	.4byte	0x132fb
 	.uleb128 0x56
 	.8byte	.LBB1602
 	.8byte	.LBE1602-.LBB1602
 	.uleb128 0x57
-	.4byte	0x1331c
+	.4byte	0x13329
 	.uleb128 0x4e
 	.8byte	.LVL491
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132a8
+	.4byte	0x132b5
 	.8byte	.LBB1603
 	.8byte	.LBE1603-.LBB1603
 	.byte	0x1
-	.2byte	0x5b1
+	.2byte	0x5b2
 	.4byte	0xeee1
 	.uleb128 0x54
-	.4byte	0x132d0
+	.4byte	0x132dd
 	.uleb128 0x54
-	.4byte	0x132c4
+	.4byte	0x132d1
 	.uleb128 0x54
-	.4byte	0x132b9
+	.4byte	0x132c6
 	.uleb128 0x5c
-	.4byte	0x132dd
+	.4byte	0x132ea
 	.8byte	.LBB1604
 	.8byte	.LBE1604-.LBB1604
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13311
+	.4byte	0x1331e
 	.uleb128 0x54
-	.4byte	0x13305
+	.4byte	0x13312
 	.uleb128 0x54
-	.4byte	0x132f9
+	.4byte	0x13306
 	.uleb128 0x54
-	.4byte	0x132ee
+	.4byte	0x132fb
 	.uleb128 0x56
 	.8byte	.LBB1605
 	.8byte	.LBE1605-.LBB1605
 	.uleb128 0x57
-	.4byte	0x1331c
+	.4byte	0x13329
 	.uleb128 0x4e
 	.8byte	.LVL492
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132a8
+	.4byte	0x132b5
 	.8byte	.LBB1606
 	.8byte	.LBE1606-.LBB1606
 	.byte	0x1
-	.2byte	0x5b4
+	.2byte	0x5b5
 	.4byte	0xef5e
 	.uleb128 0x54
-	.4byte	0x132d0
+	.4byte	0x132dd
 	.uleb128 0x54
-	.4byte	0x132c4
+	.4byte	0x132d1
 	.uleb128 0x54
-	.4byte	0x132b9
+	.4byte	0x132c6
 	.uleb128 0x5c
-	.4byte	0x132dd
+	.4byte	0x132ea
 	.8byte	.LBB1607
 	.8byte	.LBE1607-.LBB1607
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13311
+	.4byte	0x1331e
 	.uleb128 0x54
-	.4byte	0x13305
+	.4byte	0x13312
 	.uleb128 0x54
-	.4byte	0x132f9
+	.4byte	0x13306
 	.uleb128 0x54
-	.4byte	0x132ee
+	.4byte	0x132fb
 	.uleb128 0x56
 	.8byte	.LBB1608
 	.8byte	.LBE1608-.LBB1608
 	.uleb128 0x57
-	.4byte	0x1331c
+	.4byte	0x13329
 	.uleb128 0x4e
 	.8byte	.LVL493
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132a8
+	.4byte	0x132b5
 	.8byte	.LBB1609
 	.8byte	.LBE1609-.LBB1609
 	.byte	0x1
-	.2byte	0x5b7
+	.2byte	0x5b8
 	.4byte	0xefdb
 	.uleb128 0x54
-	.4byte	0x132d0
+	.4byte	0x132dd
 	.uleb128 0x54
-	.4byte	0x132c4
+	.4byte	0x132d1
 	.uleb128 0x54
-	.4byte	0x132b9
+	.4byte	0x132c6
 	.uleb128 0x5c
-	.4byte	0x132dd
+	.4byte	0x132ea
 	.8byte	.LBB1610
 	.8byte	.LBE1610-.LBB1610
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13311
+	.4byte	0x1331e
 	.uleb128 0x54
-	.4byte	0x13305
+	.4byte	0x13312
 	.uleb128 0x54
-	.4byte	0x132f9
+	.4byte	0x13306
 	.uleb128 0x54
-	.4byte	0x132ee
+	.4byte	0x132fb
 	.uleb128 0x56
 	.8byte	.LBB1611
 	.8byte	.LBE1611-.LBB1611
 	.uleb128 0x57
-	.4byte	0x1331c
+	.4byte	0x13329
 	.uleb128 0x4e
 	.8byte	.LVL494
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132a8
+	.4byte	0x132b5
 	.8byte	.LBB1612
 	.8byte	.LBE1612-.LBB1612
 	.byte	0x1
-	.2byte	0x5ba
+	.2byte	0x5bb
 	.4byte	0xf058
 	.uleb128 0x54
-	.4byte	0x132d0
+	.4byte	0x132dd
 	.uleb128 0x54
-	.4byte	0x132c4
+	.4byte	0x132d1
 	.uleb128 0x54
-	.4byte	0x132b9
+	.4byte	0x132c6
 	.uleb128 0x5c
-	.4byte	0x132dd
+	.4byte	0x132ea
 	.8byte	.LBB1613
 	.8byte	.LBE1613-.LBB1613
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13311
+	.4byte	0x1331e
 	.uleb128 0x54
-	.4byte	0x13305
+	.4byte	0x13312
 	.uleb128 0x54
-	.4byte	0x132f9
+	.4byte	0x13306
 	.uleb128 0x54
-	.4byte	0x132ee
+	.4byte	0x132fb
 	.uleb128 0x56
 	.8byte	.LBB1614
 	.8byte	.LBE1614-.LBB1614
 	.uleb128 0x57
-	.4byte	0x1331c
+	.4byte	0x13329
 	.uleb128 0x4e
 	.8byte	.LVL495
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132a8
+	.4byte	0x132b5
 	.8byte	.LBB1615
 	.8byte	.LBE1615-.LBB1615
 	.byte	0x1
-	.2byte	0x5bd
+	.2byte	0x5be
 	.4byte	0xf0d5
 	.uleb128 0x54
-	.4byte	0x132d0
+	.4byte	0x132dd
 	.uleb128 0x54
-	.4byte	0x132c4
+	.4byte	0x132d1
 	.uleb128 0x54
-	.4byte	0x132b9
+	.4byte	0x132c6
 	.uleb128 0x5c
-	.4byte	0x132dd
+	.4byte	0x132ea
 	.8byte	.LBB1616
 	.8byte	.LBE1616-.LBB1616
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13311
+	.4byte	0x1331e
 	.uleb128 0x54
-	.4byte	0x13305
+	.4byte	0x13312
 	.uleb128 0x54
-	.4byte	0x132f9
+	.4byte	0x13306
 	.uleb128 0x54
-	.4byte	0x132ee
+	.4byte	0x132fb
 	.uleb128 0x56
 	.8byte	.LBB1617
 	.8byte	.LBE1617-.LBB1617
 	.uleb128 0x57
-	.4byte	0x1331c
+	.4byte	0x13329
 	.uleb128 0x4e
 	.8byte	.LVL496
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132a8
+	.4byte	0x132b5
 	.8byte	.LBB1618
 	.8byte	.LBE1618-.LBB1618
 	.byte	0x1
-	.2byte	0x5c0
+	.2byte	0x5c1
 	.4byte	0xf152
 	.uleb128 0x54
-	.4byte	0x132d0
+	.4byte	0x132dd
 	.uleb128 0x54
-	.4byte	0x132c4
+	.4byte	0x132d1
 	.uleb128 0x54
-	.4byte	0x132b9
+	.4byte	0x132c6
 	.uleb128 0x5c
-	.4byte	0x132dd
+	.4byte	0x132ea
 	.8byte	.LBB1619
 	.8byte	.LBE1619-.LBB1619
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13311
+	.4byte	0x1331e
 	.uleb128 0x54
-	.4byte	0x13305
+	.4byte	0x13312
 	.uleb128 0x54
-	.4byte	0x132f9
+	.4byte	0x13306
 	.uleb128 0x54
-	.4byte	0x132ee
+	.4byte	0x132fb
 	.uleb128 0x56
 	.8byte	.LBB1620
 	.8byte	.LBE1620-.LBB1620
 	.uleb128 0x57
-	.4byte	0x1331c
+	.4byte	0x13329
 	.uleb128 0x4e
 	.8byte	.LVL497
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132a8
+	.4byte	0x132b5
 	.8byte	.LBB1621
 	.8byte	.LBE1621-.LBB1621
 	.byte	0x1
-	.2byte	0x5c3
+	.2byte	0x5c4
 	.4byte	0xf1cf
 	.uleb128 0x54
-	.4byte	0x132d0
+	.4byte	0x132dd
 	.uleb128 0x54
-	.4byte	0x132c4
+	.4byte	0x132d1
 	.uleb128 0x54
-	.4byte	0x132b9
+	.4byte	0x132c6
 	.uleb128 0x5c
-	.4byte	0x132dd
+	.4byte	0x132ea
 	.8byte	.LBB1622
 	.8byte	.LBE1622-.LBB1622
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13311
+	.4byte	0x1331e
 	.uleb128 0x54
-	.4byte	0x13305
+	.4byte	0x13312
 	.uleb128 0x54
-	.4byte	0x132f9
+	.4byte	0x13306
 	.uleb128 0x54
-	.4byte	0x132ee
+	.4byte	0x132fb
 	.uleb128 0x56
 	.8byte	.LBB1623
 	.8byte	.LBE1623-.LBB1623
 	.uleb128 0x57
-	.4byte	0x1331c
+	.4byte	0x13329
 	.uleb128 0x4e
 	.8byte	.LVL498
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x132a8
+	.4byte	0x132b5
 	.8byte	.LBB1624
 	.4byte	.Ldebug_ranges0+0xc80
 	.byte	0x1
-	.2byte	0x5c6
+	.2byte	0x5c7
 	.4byte	0xf245
 	.uleb128 0x54
-	.4byte	0x132d0
+	.4byte	0x132dd
 	.uleb128 0x54
-	.4byte	0x132c4
+	.4byte	0x132d1
 	.uleb128 0x54
-	.4byte	0x132b9
+	.4byte	0x132c6
 	.uleb128 0x5e
-	.4byte	0x132dd
+	.4byte	0x132ea
 	.8byte	.LBB1625
 	.4byte	.Ldebug_ranges0+0xc80
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13311
+	.4byte	0x1331e
 	.uleb128 0x54
-	.4byte	0x13305
+	.4byte	0x13312
 	.uleb128 0x54
-	.4byte	0x132f9
+	.4byte	0x13306
 	.uleb128 0x54
-	.4byte	0x132ee
+	.4byte	0x132fb
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xc80
 	.uleb128 0x57
-	.4byte	0x1331c
+	.4byte	0x13329
 	.uleb128 0x4e
 	.8byte	.LVL499
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.uleb128 0x4e
 	.8byte	.LVL531
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x132a8
+	.4byte	0x132b5
 	.8byte	.LBB1631
 	.4byte	.Ldebug_ranges0+0xcc0
 	.byte	0x1
-	.2byte	0x5c9
+	.2byte	0x5ca
 	.4byte	0xf2bb
 	.uleb128 0x54
-	.4byte	0x132d0
+	.4byte	0x132dd
 	.uleb128 0x54
-	.4byte	0x132c4
+	.4byte	0x132d1
 	.uleb128 0x54
-	.4byte	0x132b9
+	.4byte	0x132c6
 	.uleb128 0x5e
-	.4byte	0x132dd
+	.4byte	0x132ea
 	.8byte	.LBB1632
 	.4byte	.Ldebug_ranges0+0xcc0
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13311
+	.4byte	0x1331e
 	.uleb128 0x54
-	.4byte	0x13305
+	.4byte	0x13312
 	.uleb128 0x54
-	.4byte	0x132f9
+	.4byte	0x13306
 	.uleb128 0x54
-	.4byte	0x132ee
+	.4byte	0x132fb
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xcc0
 	.uleb128 0x57
-	.4byte	0x1331c
+	.4byte	0x13329
 	.uleb128 0x4e
 	.8byte	.LVL500
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.uleb128 0x4e
 	.8byte	.LVL530
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x132a8
+	.4byte	0x132b5
 	.8byte	.LBB1638
 	.4byte	.Ldebug_ranges0+0xd00
 	.byte	0x1
-	.2byte	0x5cc
+	.2byte	0x5cd
 	.4byte	0xf331
 	.uleb128 0x54
-	.4byte	0x132d0
+	.4byte	0x132dd
 	.uleb128 0x54
-	.4byte	0x132c4
+	.4byte	0x132d1
 	.uleb128 0x54
-	.4byte	0x132b9
+	.4byte	0x132c6
 	.uleb128 0x5e
-	.4byte	0x132dd
+	.4byte	0x132ea
 	.8byte	.LBB1639
 	.4byte	.Ldebug_ranges0+0xd00
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13311
+	.4byte	0x1331e
 	.uleb128 0x54
-	.4byte	0x13305
+	.4byte	0x13312
 	.uleb128 0x54
-	.4byte	0x132f9
+	.4byte	0x13306
 	.uleb128 0x54
-	.4byte	0x132ee
+	.4byte	0x132fb
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xd00
 	.uleb128 0x57
-	.4byte	0x1331c
+	.4byte	0x13329
 	.uleb128 0x4e
 	.8byte	.LVL501
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.uleb128 0x4e
 	.8byte	.LVL529
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x132a8
+	.4byte	0x132b5
 	.8byte	.LBB1645
 	.4byte	.Ldebug_ranges0+0xd40
 	.byte	0x1
-	.2byte	0x5cf
+	.2byte	0x5d0
 	.uleb128 0x54
-	.4byte	0x132d0
+	.4byte	0x132dd
 	.uleb128 0x54
-	.4byte	0x132c4
+	.4byte	0x132d1
 	.uleb128 0x54
-	.4byte	0x132b9
+	.4byte	0x132c6
 	.uleb128 0x5e
-	.4byte	0x132dd
+	.4byte	0x132ea
 	.8byte	.LBB1646
 	.4byte	.Ldebug_ranges0+0xd40
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13311
+	.4byte	0x1331e
 	.uleb128 0x54
-	.4byte	0x13305
+	.4byte	0x13312
 	.uleb128 0x54
-	.4byte	0x132f9
+	.4byte	0x13306
 	.uleb128 0x54
-	.4byte	0x132ee
+	.4byte	0x132fb
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xd40
 	.uleb128 0x57
-	.4byte	0x1331c
+	.4byte	0x13329
 	.uleb128 0x4e
 	.8byte	.LVL502
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.uleb128 0x4e
 	.8byte	.LVL528
-	.4byte	0x13fb4
+	.4byte	0x13fc1
 	.byte	0
 	.byte	0
 	.byte	0
@@ -38634,7 +38631,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1667
 	.4byte	.Ldebug_ranges0+0xd80
 	.byte	0x1
-	.2byte	0x86e
+	.2byte	0x86f
 	.4byte	0xf552
 	.uleb128 0x54
 	.4byte	0xfd80
@@ -38661,104 +38658,104 @@ __exitcall_ebc_exit:
 	.uleb128 0x57
 	.4byte	0xfdde
 	.uleb128 0x5a
-	.4byte	0x133bb
+	.4byte	0x133c8
 	.8byte	.LBB1669
 	.4byte	.Ldebug_ranges0+0xdf0
 	.byte	0x1
-	.2byte	0x76c
+	.2byte	0x76d
 	.4byte	0xf415
 	.uleb128 0x54
-	.4byte	0x133cb
+	.4byte	0x133d8
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13385
+	.4byte	0x13392
 	.8byte	.LBB1673
 	.4byte	.Ldebug_ranges0+0xe20
 	.byte	0x1
-	.2byte	0x787
+	.2byte	0x788
 	.4byte	0xf44a
 	.uleb128 0x54
-	.4byte	0x133ae
+	.4byte	0x133bb
 	.uleb128 0x54
-	.4byte	0x133a2
+	.4byte	0x133af
 	.uleb128 0x54
-	.4byte	0x13396
+	.4byte	0x133a3
 	.uleb128 0x4e
 	.8byte	.LVL508
-	.4byte	0x13fa7
+	.4byte	0x13fb4
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13385
+	.4byte	0x13392
 	.8byte	.LBB1681
 	.8byte	.LBE1681-.LBB1681
 	.byte	0x1
-	.2byte	0x78a
+	.2byte	0x78b
 	.4byte	0xf483
 	.uleb128 0x54
-	.4byte	0x133ae
+	.4byte	0x133bb
 	.uleb128 0x54
-	.4byte	0x133a2
+	.4byte	0x133af
 	.uleb128 0x54
-	.4byte	0x13396
+	.4byte	0x133a3
 	.uleb128 0x4e
 	.8byte	.LVL509
-	.4byte	0x13fa7
+	.4byte	0x13fb4
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13385
+	.4byte	0x13392
 	.8byte	.LBB1683
 	.8byte	.LBE1683-.LBB1683
 	.byte	0x1
-	.2byte	0x78d
+	.2byte	0x78e
 	.4byte	0xf4bc
 	.uleb128 0x54
-	.4byte	0x133ae
+	.4byte	0x133bb
 	.uleb128 0x54
-	.4byte	0x133a2
+	.4byte	0x133af
 	.uleb128 0x54
-	.4byte	0x13396
+	.4byte	0x133a3
 	.uleb128 0x4e
 	.8byte	.LVL510
-	.4byte	0x13fa7
+	.4byte	0x13fb4
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13385
+	.4byte	0x13392
 	.8byte	.LBB1685
 	.8byte	.LBE1685-.LBB1685
 	.byte	0x1
-	.2byte	0x795
+	.2byte	0x796
 	.4byte	0xf4f5
 	.uleb128 0x54
-	.4byte	0x133ae
+	.4byte	0x133bb
 	.uleb128 0x54
-	.4byte	0x133a2
+	.4byte	0x133af
 	.uleb128 0x54
-	.4byte	0x13396
+	.4byte	0x133a3
 	.uleb128 0x4e
 	.8byte	.LVL511
-	.4byte	0x13fa7
+	.4byte	0x13fb4
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL504
-	.4byte	0x13fc1
+	.4byte	0x13fce
 	.uleb128 0x4e
 	.8byte	.LVL505
-	.4byte	0x13fce
+	.4byte	0x13fdb
 	.uleb128 0x4e
 	.8byte	.LVL506
-	.4byte	0x13fda
+	.4byte	0x13fe7
 	.uleb128 0x4e
 	.8byte	.LVL507
-	.4byte	0x13fe6
+	.4byte	0x13ff3
 	.uleb128 0x4e
 	.8byte	.LVL512
-	.4byte	0x13ff2
+	.4byte	0x13fff
 	.uleb128 0x4e
 	.8byte	.LVL513
-	.4byte	0x13ffc
+	.4byte	0x14009
 	.uleb128 0x4e
 	.8byte	.LVL525
-	.4byte	0x14008
+	.4byte	0x14015
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
@@ -38766,7 +38763,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1694
 	.4byte	.Ldebug_ranges0+0xe70
 	.byte	0x1
-	.2byte	0x875
+	.2byte	0x876
 	.4byte	0xf634
 	.uleb128 0x54
 	.4byte	0xfdfa
@@ -38794,39 +38791,39 @@ __exitcall_ebc_exit:
 	.uleb128 0x57
 	.4byte	0xfe4c
 	.uleb128 0x53
-	.4byte	0x133bb
+	.4byte	0x133c8
 	.8byte	.LBB1696
 	.8byte	.LBE1696-.LBB1696
 	.byte	0x1
-	.2byte	0x73f
+	.2byte	0x740
 	.4byte	0xf5ca
 	.uleb128 0x54
-	.4byte	0x133cb
+	.4byte	0x133d8
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL515
-	.4byte	0x13fc1
+	.4byte	0x13fce
 	.uleb128 0x4e
 	.8byte	.LVL516
-	.4byte	0x13fce
+	.4byte	0x13fdb
 	.uleb128 0x4e
 	.8byte	.LVL534
-	.4byte	0x13fda
+	.4byte	0x13fe7
 	.uleb128 0x4e
 	.8byte	.LVL535
-	.4byte	0x14015
+	.4byte	0x14022
 	.uleb128 0x4e
 	.8byte	.LVL615
-	.4byte	0x14008
+	.4byte	0x14015
 	.uleb128 0x4e
 	.8byte	.LVL616
-	.4byte	0x14021
+	.4byte	0x1402e
 	.uleb128 0x4e
 	.8byte	.LVL617
-	.4byte	0x14008
+	.4byte	0x14015
 	.uleb128 0x4e
 	.8byte	.LVL636
-	.4byte	0x14008
+	.4byte	0x14015
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
@@ -38834,7 +38831,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1705
 	.4byte	.Ldebug_ranges0+0xed0
 	.byte	0x1
-	.2byte	0x87c
+	.2byte	0x87d
 	.4byte	0xf7c1
 	.uleb128 0x54
 	.4byte	0xfd48
@@ -38846,53 +38843,53 @@ __exitcall_ebc_exit:
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5a
-	.4byte	0x13591
+	.4byte	0x1359e
 	.8byte	.LBB1707
 	.4byte	.Ldebug_ranges0+0xf10
 	.byte	0x1
-	.2byte	0x7a2
+	.2byte	0x7a3
 	.4byte	0xf6bb
 	.uleb128 0x54
-	.4byte	0x1359d
+	.4byte	0x135aa
 	.uleb128 0x56
 	.8byte	.LBB1709
 	.8byte	.LBE1709-.LBB1709
 	.uleb128 0x57
-	.4byte	0x135c8
+	.4byte	0x135d5
 	.uleb128 0x5b
-	.4byte	0x13715
+	.4byte	0x13722
 	.8byte	.LBB1710
 	.8byte	.LBE1710-.LBB1710
 	.byte	0x10
 	.byte	0x1c
 	.uleb128 0x54
-	.4byte	0x13738
+	.4byte	0x13745
 	.uleb128 0x54
-	.4byte	0x1372c
+	.4byte	0x13739
 	.uleb128 0x54
-	.4byte	0x13722
+	.4byte	0x1372f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13657
+	.4byte	0x13664
 	.8byte	.LBB1714
 	.8byte	.LBE1714-.LBB1714
 	.byte	0x1
-	.2byte	0x7aa
+	.2byte	0x7ab
 	.4byte	0xf706
 	.uleb128 0x54
-	.4byte	0x1366c
+	.4byte	0x13679
 	.uleb128 0x54
-	.4byte	0x13663
+	.4byte	0x13670
 	.uleb128 0x56
 	.8byte	.LBB1715
 	.8byte	.LBE1715-.LBB1715
 	.uleb128 0x5f
-	.4byte	0x13675
+	.4byte	0x13682
 	.4byte	.LLST147
 	.uleb128 0x5f
-	.4byte	0x1367f
+	.4byte	0x1368c
 	.4byte	.LLST148
 	.byte	0
 	.byte	0
@@ -38904,48 +38901,48 @@ __exitcall_ebc_exit:
 	.4byte	.LLST149
 	.uleb128 0x4e
 	.8byte	.LVL542
-	.4byte	0x1402d
+	.4byte	0x1403a
 	.uleb128 0x4e
 	.8byte	.LVL544
-	.4byte	0x14039
+	.4byte	0x14046
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13657
+	.4byte	0x13664
 	.8byte	.LBB1718
 	.8byte	.LBE1718-.LBB1718
 	.byte	0x1
-	.2byte	0x7b3
+	.2byte	0x7b4
 	.4byte	0xf77e
 	.uleb128 0x54
-	.4byte	0x1366c
+	.4byte	0x13679
 	.uleb128 0x54
-	.4byte	0x13663
+	.4byte	0x13670
 	.uleb128 0x56
 	.8byte	.LBB1719
 	.8byte	.LBE1719-.LBB1719
 	.uleb128 0x5f
-	.4byte	0x13675
+	.4byte	0x13682
 	.4byte	.LLST150
 	.uleb128 0x5f
-	.4byte	0x1367f
+	.4byte	0x1368c
 	.4byte	.LLST151
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL536
-	.4byte	0x1402d
+	.4byte	0x1403a
 	.uleb128 0x4e
 	.8byte	.LVL537
-	.4byte	0x14046
+	.4byte	0x14053
 	.uleb128 0x4e
 	.8byte	.LVL545
-	.4byte	0x14046
+	.4byte	0x14053
 	.uleb128 0x4e
 	.8byte	.LVL620
-	.4byte	0x14008
+	.4byte	0x14015
 	.uleb128 0x4e
 	.8byte	.LVL624
-	.4byte	0x14008
+	.4byte	0x14015
 	.byte	0
 	.byte	0
 	.uleb128 0x53
@@ -38953,52 +38950,52 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1722
 	.8byte	.LBE1722-.LBB1722
 	.byte	0x1
-	.2byte	0x883
+	.2byte	0x884
 	.4byte	0xf85b
 	.uleb128 0x54
 	.4byte	0xfd2a
 	.uleb128 0x5a
-	.4byte	0x12fee
+	.4byte	0x12ffb
 	.8byte	.LBB1724
 	.4byte	.Ldebug_ranges0+0xf70
 	.byte	0x1
-	.2byte	0x7c3
+	.2byte	0x7c4
 	.4byte	0xf826
 	.uleb128 0x54
-	.4byte	0x13010
+	.4byte	0x1301d
 	.uleb128 0x54
-	.4byte	0x13005
+	.4byte	0x13012
 	.uleb128 0x54
-	.4byte	0x12ffa
+	.4byte	0x13007
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xf70
 	.uleb128 0x5f
-	.4byte	0x1301b
+	.4byte	0x13028
 	.4byte	.LLST152
 	.uleb128 0x4e
 	.8byte	.LVL552
-	.4byte	0x14053
+	.4byte	0x14060
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL553
-	.4byte	0x1405f
+	.4byte	0x1406c
 	.uleb128 0x4e
 	.8byte	.LVL554
-	.4byte	0x1406b
+	.4byte	0x14078
 	.uleb128 0x4e
 	.8byte	.LVL555
-	.4byte	0x1405f
+	.4byte	0x1406c
 	.uleb128 0x4e
 	.8byte	.LVL556
-	.4byte	0x1406b
+	.4byte	0x14078
 	.byte	0
 	.uleb128 0x5a
 	.4byte	0xfc7b
 	.8byte	.LBB1734
 	.4byte	.Ldebug_ranges0+0xfd0
 	.byte	0x1
-	.2byte	0x886
+	.2byte	0x887
 	.4byte	0xfafe
 	.uleb128 0x54
 	.4byte	0xfc98
@@ -39039,7 +39036,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1736
 	.8byte	.LBE1736-.LBB1736
 	.byte	0x1
-	.2byte	0x7fb
+	.2byte	0x7fc
 	.4byte	0xf93d
 	.uleb128 0x54
 	.4byte	0x11681
@@ -39053,153 +39050,153 @@ __exitcall_ebc_exit:
 	.4byte	.LLST161
 	.uleb128 0x4e
 	.8byte	.LVL573
-	.4byte	0x14077
+	.4byte	0x14084
 	.uleb128 0x4e
 	.8byte	.LVL575
-	.4byte	0x13ffc
+	.4byte	0x14009
 	.uleb128 0x4e
 	.8byte	.LVL576
-	.4byte	0x14083
+	.4byte	0x14090
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1316b
+	.4byte	0x13178
 	.8byte	.LBB1738
 	.8byte	.LBE1738-.LBB1738
 	.byte	0x1
-	.2byte	0x7e1
+	.2byte	0x7e2
 	.4byte	0xf994
 	.uleb128 0x54
-	.4byte	0x13188
+	.4byte	0x13195
 	.uleb128 0x54
-	.4byte	0x1317c
+	.4byte	0x13189
 	.uleb128 0x5c
-	.4byte	0x13195
+	.4byte	0x131a2
 	.8byte	.LBB1739
 	.8byte	.LBE1739-.LBB1739
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x131b2
+	.4byte	0x131bf
 	.uleb128 0x54
-	.4byte	0x131a6
+	.4byte	0x131b3
 	.uleb128 0x4e
 	.8byte	.LVL589
-	.4byte	0x1408f
+	.4byte	0x1409c
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1316b
+	.4byte	0x13178
 	.8byte	.LBB1741
 	.8byte	.LBE1741-.LBB1741
 	.byte	0x1
-	.2byte	0x7ef
+	.2byte	0x7f0
 	.4byte	0xf9eb
 	.uleb128 0x54
-	.4byte	0x13188
+	.4byte	0x13195
 	.uleb128 0x54
-	.4byte	0x1317c
+	.4byte	0x13189
 	.uleb128 0x5c
-	.4byte	0x13195
+	.4byte	0x131a2
 	.8byte	.LBB1742
 	.8byte	.LBE1742-.LBB1742
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x131b2
+	.4byte	0x131bf
 	.uleb128 0x54
-	.4byte	0x131a6
+	.4byte	0x131b3
 	.uleb128 0x4e
 	.8byte	.LVL604
-	.4byte	0x1408f
+	.4byte	0x1409c
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL558
-	.4byte	0x1409c
+	.4byte	0x140a9
 	.uleb128 0x4e
 	.8byte	.LVL560
-	.4byte	0x1409c
+	.4byte	0x140a9
 	.uleb128 0x4e
 	.8byte	.LVL562
-	.4byte	0x140a8
+	.4byte	0x140b5
 	.uleb128 0x4e
 	.8byte	.LVL567
-	.4byte	0x140a8
+	.4byte	0x140b5
 	.uleb128 0x4e
 	.8byte	.LVL571
-	.4byte	0x13f8e
+	.4byte	0x13f9b
 	.uleb128 0x4e
 	.8byte	.LVL572
-	.4byte	0x140b5
+	.4byte	0x140c2
 	.uleb128 0x4e
 	.8byte	.LVL577
-	.4byte	0x140c1
+	.4byte	0x140ce
 	.uleb128 0x4e
 	.8byte	.LVL578
-	.4byte	0x140c1
+	.4byte	0x140ce
 	.uleb128 0x4e
 	.8byte	.LVL588
-	.4byte	0x13f8e
+	.4byte	0x13f9b
 	.uleb128 0x4e
 	.8byte	.LVL593
-	.4byte	0x140cd
+	.4byte	0x140da
 	.uleb128 0x4e
 	.8byte	.LVL596
-	.4byte	0x14077
+	.4byte	0x14084
 	.uleb128 0x4e
 	.8byte	.LVL598
-	.4byte	0x140cd
+	.4byte	0x140da
 	.uleb128 0x4e
 	.8byte	.LVL599
-	.4byte	0x14083
+	.4byte	0x14090
 	.uleb128 0x4e
 	.8byte	.LVL601
-	.4byte	0x140d7
+	.4byte	0x140e4
 	.uleb128 0x4e
 	.8byte	.LVL603
-	.4byte	0x13f8e
+	.4byte	0x13f9b
 	.uleb128 0x4e
 	.8byte	.LVL607
-	.4byte	0x140cd
+	.4byte	0x140da
 	.uleb128 0x4e
 	.8byte	.LVL610
-	.4byte	0x14077
+	.4byte	0x14084
 	.uleb128 0x4e
 	.8byte	.LVL612
-	.4byte	0x140cd
+	.4byte	0x140da
 	.uleb128 0x4e
 	.8byte	.LVL613
-	.4byte	0x14083
+	.4byte	0x14090
 	.uleb128 0x4e
 	.8byte	.LVL640
-	.4byte	0x14008
+	.4byte	0x14015
 	.uleb128 0x4e
 	.8byte	.LVL643
-	.4byte	0x14008
+	.4byte	0x14015
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1323f
+	.4byte	0x1324c
 	.8byte	.LBB1747
 	.8byte	.LBE1747-.LBB1747
 	.byte	0x1
-	.2byte	0x888
+	.2byte	0x889
 	.4byte	0xfb47
 	.uleb128 0x54
-	.4byte	0x13256
+	.4byte	0x13263
 	.uleb128 0x54
-	.4byte	0x1324b
+	.4byte	0x13258
 	.uleb128 0x5b
-	.4byte	0x13341
+	.4byte	0x1334e
 	.8byte	.LBB1748
 	.8byte	.LBE1748-.LBB1748
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x54
-	.4byte	0x1335a
+	.4byte	0x13367
 	.uleb128 0x54
-	.4byte	0x1334e
+	.4byte	0x1335b
 	.byte	0
 	.byte	0
 	.uleb128 0x53
@@ -39207,274 +39204,274 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1750
 	.8byte	.LBE1750-.LBB1750
 	.byte	0x1
-	.2byte	0x88b
+	.2byte	0x88c
 	.4byte	0xfbc4
 	.uleb128 0x54
 	.4byte	0xfe80
 	.uleb128 0x4e
 	.8byte	.LVL579
-	.4byte	0x140e3
+	.4byte	0x140f0
 	.uleb128 0x4e
 	.8byte	.LVL580
-	.4byte	0x140ef
+	.4byte	0x140fc
 	.uleb128 0x4e
 	.8byte	.LVL581
-	.4byte	0x140ef
+	.4byte	0x140fc
 	.uleb128 0x4e
 	.8byte	.LVL582
-	.4byte	0x140ef
+	.4byte	0x140fc
 	.uleb128 0x4e
 	.8byte	.LVL583
-	.4byte	0x140ef
+	.4byte	0x140fc
 	.uleb128 0x4e
 	.8byte	.LVL584
-	.4byte	0x140ef
+	.4byte	0x140fc
 	.uleb128 0x4e
 	.8byte	.LVL585
-	.4byte	0x140ef
+	.4byte	0x140fc
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL476
-	.4byte	0x13fc1
+	.4byte	0x13fce
 	.uleb128 0x4e
 	.8byte	.LVL477
-	.4byte	0x140fc
+	.4byte	0x14109
 	.uleb128 0x4e
 	.8byte	.LVL479
-	.4byte	0x13fc1
+	.4byte	0x13fce
 	.uleb128 0x4e
 	.8byte	.LVL480
-	.4byte	0x14108
+	.4byte	0x14115
 	.uleb128 0x4e
 	.8byte	.LVL517
-	.4byte	0x14008
+	.4byte	0x14015
 	.uleb128 0x4e
 	.8byte	.LVL519
-	.4byte	0x14008
+	.4byte	0x14015
 	.uleb128 0x4e
 	.8byte	.LVL526
-	.4byte	0x14008
+	.4byte	0x14015
 	.uleb128 0x4e
 	.8byte	.LVL586
-	.4byte	0x13f8e
+	.4byte	0x13f9b
 	.uleb128 0x4e
 	.8byte	.LVL621
-	.4byte	0x14008
+	.4byte	0x14015
 	.uleb128 0x4e
 	.8byte	.LVL628
-	.4byte	0x14008
+	.4byte	0x14015
 	.uleb128 0x4e
 	.8byte	.LVL629
-	.4byte	0x14008
+	.4byte	0x14015
 	.uleb128 0x4e
 	.8byte	.LVL630
-	.4byte	0x14008
+	.4byte	0x14015
 	.uleb128 0x4e
 	.8byte	.LVL634
-	.4byte	0x14008
+	.4byte	0x14015
 	.uleb128 0x4e
 	.8byte	.LVL638
-	.4byte	0x14115
+	.4byte	0x14122
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0x7cf
+	.2byte	0x7d0
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfd1d
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x7cf
+	.2byte	0x7d0
 	.4byte	0xe47d
 	.uleb128 0x64
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x7cf
+	.2byte	0x7d0
 	.4byte	0xe13f
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x7d1
+	.2byte	0x7d2
 	.4byte	0xe72c
 	.uleb128 0x46
 	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0x7d2
+	.2byte	0x7d3
 	.4byte	0x6d
 	.uleb128 0x46
 	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0x7d3
+	.2byte	0x7d4
 	.4byte	0x6d
 	.uleb128 0x46
 	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0x7d4
+	.2byte	0x7d5
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0x7d5
+	.2byte	0x7d6
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0x7d6
+	.2byte	0x7d7
 	.4byte	0x219
 	.uleb128 0x46
 	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0x7d7
+	.2byte	0x7d8
 	.4byte	0x219
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x7d8
+	.2byte	0x7d9
 	.4byte	0xe418
 	.uleb128 0x46
 	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0x7d9
+	.2byte	0x7da
 	.4byte	0x443
 	.uleb128 0x46
 	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0x7da
+	.2byte	0x7db
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x65
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x7b8
+	.2byte	0x7b9
 	.byte	0x1
 	.4byte	0xfd37
 	.uleb128 0x64
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x7b8
+	.2byte	0x7b9
 	.4byte	0xe72c
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0x79e
+	.2byte	0x79f
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfd6f
 	.uleb128 0x64
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x79e
+	.2byte	0x79f
 	.4byte	0xe72c
 	.uleb128 0x46
 	.4byte	.LASF2465
 	.byte	0x1
-	.2byte	0x7a0
+	.2byte	0x7a1
 	.4byte	0xd7ff
 	.uleb128 0x66
 	.uleb128 0x52
 	.string	"__k"
 	.byte	0x1
-	.2byte	0x7ad
+	.2byte	0x7ae
 	.4byte	0x2ef0
 	.byte	0
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0x755
+	.2byte	0x756
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfde9
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x755
+	.2byte	0x756
 	.4byte	0xe47d
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x757
+	.2byte	0x758
 	.4byte	0xa55b
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x758
+	.2byte	0x759
 	.4byte	0xe13f
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x759
+	.2byte	0x75a
 	.4byte	0xe72c
 	.uleb128 0x46
 	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0x75a
+	.2byte	0x75b
 	.4byte	0xb87f
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x75b
+	.2byte	0x75c
 	.4byte	0x9737
 	.uleb128 0x46
 	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0x75c
+	.2byte	0x75d
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x75d
+	.2byte	0x75e
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x75d
+	.2byte	0x75e
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0x72c
+	.2byte	0x72d
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfe5a
 	.uleb128 0x64
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x72c
+	.2byte	0x72d
 	.4byte	0xe72c
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x72e
+	.2byte	0x72f
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x72f
+	.2byte	0x730
 	.4byte	0xa55b
 	.uleb128 0x46
 	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0x730
+	.2byte	0x731
 	.4byte	0xb87f
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x731
+	.2byte	0x732
 	.4byte	0x9737
 	.uleb128 0x46
 	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0x732
+	.2byte	0x733
 	.4byte	0x29
 	.uleb128 0x46
 	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0x733
+	.2byte	0x734
 	.4byte	0xc6
 	.uleb128 0x67
 	.4byte	.LASF3023
@@ -39493,20 +39490,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x62
 	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0x71e
+	.2byte	0x71f
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfe8d
 	.uleb128 0x64
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x71e
+	.2byte	0x71f
 	.4byte	0xe72c
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3048
 	.byte	0x1
-	.2byte	0x715
+	.2byte	0x716
 	.4byte	0x2d9
 	.8byte	.LFB2839
 	.8byte	.LFE2839-.LFB2839
@@ -39516,29 +39513,29 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x715
+	.2byte	0x716
 	.4byte	0xa55b
 	.4byte	.LLST71
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x716
+	.2byte	0x717
 	.4byte	0xb3d6
 	.4byte	.LLST72
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x717
+	.2byte	0x718
 	.4byte	0x219
 	.4byte	.LLST73
 	.uleb128 0x4e
 	.8byte	.LVL272
-	.4byte	0x1411f
+	.4byte	0x1412c
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0x70c
+	.2byte	0x70d
 	.4byte	0x2d9
 	.8byte	.LFB2838
 	.8byte	.LFE2838-.LFB2838
@@ -39548,29 +39545,29 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x70c
+	.2byte	0x70d
 	.4byte	0xa55b
 	.4byte	.LLST74
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x70d
+	.2byte	0x70e
 	.4byte	0xb3d6
 	.4byte	.LLST75
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x70e
+	.2byte	0x70f
 	.4byte	0x219
 	.4byte	.LLST76
 	.uleb128 0x4e
 	.8byte	.LVL277
-	.4byte	0x1411f
+	.4byte	0x1412c
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3050
 	.byte	0x1
-	.2byte	0x6f4
+	.2byte	0x6f5
 	.4byte	0x2d9
 	.8byte	.LFB2837
 	.8byte	.LFE2837-.LFB2837
@@ -39580,64 +39577,64 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x6f4
+	.2byte	0x6f5
 	.4byte	0xa55b
 	.4byte	.LLST86
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x6f5
+	.2byte	0x6f6
 	.4byte	0xb3d6
 	.4byte	.LLST87
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6f6
+	.2byte	0x6f7
 	.4byte	0x56
 	.4byte	.LLST88
 	.uleb128 0x58
 	.4byte	.LASF382
 	.byte	0x1
-	.2byte	0x6f6
+	.2byte	0x6f7
 	.4byte	0x2ce
 	.4byte	.LLST89
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x6f8
+	.2byte	0x6f9
 	.4byte	0xe47d
 	.4byte	.LLST90
 	.uleb128 0x59
 	.4byte	.LASF2455
 	.byte	0x1
-	.2byte	0x6f9
+	.2byte	0x6fa
 	.4byte	0xc6
 	.4byte	.LLST91
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x6f9
+	.2byte	0x6fa
 	.4byte	0xc6
 	.uleb128 0x4e
 	.8byte	.LVL303
-	.4byte	0x1412c
+	.4byte	0x14139
 	.uleb128 0x4e
 	.8byte	.LVL305
-	.4byte	0x14139
+	.4byte	0x14146
 	.uleb128 0x4e
 	.8byte	.LVL310
-	.4byte	0x14008
+	.4byte	0x14015
 	.uleb128 0x4e
 	.8byte	.LVL313
-	.4byte	0x14008
+	.4byte	0x14015
 	.uleb128 0x4e
 	.8byte	.LVL314
-	.4byte	0x14115
+	.4byte	0x14122
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0x6e8
+	.2byte	0x6e9
 	.4byte	0x2d9
 	.8byte	.LFB2836
 	.8byte	.LFE2836-.LFB2836
@@ -39647,49 +39644,49 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x6e8
+	.2byte	0x6e9
 	.4byte	0xa55b
 	.4byte	.LLST77
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x6e9
+	.2byte	0x6ea
 	.4byte	0xb3d6
 	.4byte	.LLST78
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6ea
+	.2byte	0x6eb
 	.4byte	0x219
 	.4byte	.LLST79
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x6ec
+	.2byte	0x6ed
 	.4byte	0xe47d
 	.uleb128 0x46
 	.4byte	.LASF2455
 	.byte	0x1
-	.2byte	0x6ed
+	.2byte	0x6ee
 	.4byte	0xc6
 	.uleb128 0x53
-	.4byte	0x12f17
+	.4byte	0x12f24
 	.8byte	.LBB1206
 	.8byte	.LBE1206-.LBB1206
 	.byte	0x1
-	.2byte	0x6ef
+	.2byte	0x6f0
 	.4byte	0x100a9
 	.uleb128 0x54
-	.4byte	0x12f27
+	.4byte	0x12f34
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL282
-	.4byte	0x1411f
+	.4byte	0x1412c
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0x6da
+	.2byte	0x6db
 	.4byte	0x2d9
 	.8byte	.LFB2835
 	.8byte	.LFE2835-.LFB2835
@@ -39699,57 +39696,57 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x6da
+	.2byte	0x6db
 	.4byte	0xa55b
 	.4byte	.LLST80
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x6db
+	.2byte	0x6dc
 	.4byte	0xb3d6
 	.4byte	.LLST81
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6dc
+	.2byte	0x6dd
 	.4byte	0x219
 	.4byte	.LLST82
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x6de
+	.2byte	0x6df
 	.4byte	0xe47d
 	.uleb128 0x69
 	.string	"t"
 	.byte	0x1
-	.2byte	0x6df
+	.2byte	0x6e0
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x5a
-	.4byte	0x12f33
+	.4byte	0x12f40
 	.8byte	.LBB1208
 	.4byte	.Ldebug_ranges0+0x6a0
 	.byte	0x1
-	.2byte	0x6e1
+	.2byte	0x6e2
 	.4byte	0x10145
 	.uleb128 0x54
-	.4byte	0x12f4e
+	.4byte	0x12f5b
 	.uleb128 0x54
-	.4byte	0x12f43
+	.4byte	0x12f50
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL289
-	.4byte	0x1411f
+	.4byte	0x1412c
 	.uleb128 0x4e
 	.8byte	.LVL292
-	.4byte	0x14115
+	.4byte	0x14122
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0x6cf
+	.2byte	0x6d0
 	.4byte	0x2d9
 	.8byte	.LFB2834
 	.8byte	.LFE2834-.LFB2834
@@ -39759,34 +39756,34 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x6cf
+	.2byte	0x6d0
 	.4byte	0xa55b
 	.4byte	.LLST83
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x6d0
+	.2byte	0x6d1
 	.4byte	0xb3d6
 	.4byte	.LLST84
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6d1
+	.2byte	0x6d2
 	.4byte	0x219
 	.4byte	.LLST85
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x6d3
+	.2byte	0x6d4
 	.4byte	0xe47d
 	.uleb128 0x4e
 	.8byte	.LVL297
-	.4byte	0x1411f
+	.4byte	0x1412c
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0x6c4
+	.2byte	0x6c5
 	.4byte	0x2d9
 	.8byte	.LFB2833
 	.8byte	.LFE2833-.LFB2833
@@ -39796,37 +39793,37 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x6c4
+	.2byte	0x6c5
 	.4byte	0xa55b
 	.4byte	.LLST92
 	.uleb128 0x58
 	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x6c5
+	.2byte	0x6c6
 	.4byte	0xb3d6
 	.4byte	.LLST93
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6c6
+	.2byte	0x6c7
 	.4byte	0x219
 	.4byte	.LLST94
 	.uleb128 0x46
 	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0x6c8
+	.2byte	0x6c9
 	.4byte	0x56
 	.uleb128 0x4e
 	.8byte	.LVL316
-	.4byte	0x14145
+	.4byte	0x14152
 	.uleb128 0x4e
 	.8byte	.LVL317
-	.4byte	0x1411f
+	.4byte	0x1412c
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0x6ad
+	.2byte	0x6ae
 	.4byte	0xc6
 	.8byte	.LFB2832
 	.8byte	.LFE2832-.LFB2832
@@ -39836,13 +39833,13 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	.LASF417
 	.byte	0x1
-	.2byte	0x6ad
+	.2byte	0x6ae
 	.4byte	0x1c6a
 	.4byte	.LLST6
 	.uleb128 0x6a
 	.4byte	.LASF1272
 	.byte	0x1
-	.2byte	0x6ad
+	.2byte	0x6ae
 	.4byte	0x5547
 	.uleb128 0x1
 	.byte	0x51
@@ -39850,7 +39847,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0x69e
+	.2byte	0x69f
 	.4byte	0xc6
 	.8byte	.LFB2831
 	.8byte	.LFE2831-.LFB2831
@@ -39860,31 +39857,31 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	.LASF1272
 	.byte	0x1
-	.2byte	0x69e
+	.2byte	0x69f
 	.4byte	0x5547
 	.4byte	.LLST10
 	.uleb128 0x51
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x69e
+	.2byte	0x69f
 	.4byte	0x3ca0
 	.4byte	.LLST11
 	.uleb128 0x46
 	.4byte	.LASF883
 	.byte	0x1
-	.2byte	0x6a0
+	.2byte	0x6a1
 	.4byte	0x29
 	.uleb128 0x4e
 	.8byte	.LVL46
-	.4byte	0x14151
+	.4byte	0x1415e
 	.uleb128 0x4e
 	.8byte	.LVL47
-	.4byte	0x1415d
+	.4byte	0x1416a
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x5d5
+	.2byte	0x5d6
 	.4byte	0x194
 	.8byte	.LFB2830
 	.8byte	.LFE2830-.LFB2830
@@ -39894,40 +39891,40 @@ __exitcall_ebc_exit:
 	.uleb128 0x58
 	.4byte	.LASF1272
 	.byte	0x1
-	.2byte	0x5d5
+	.2byte	0x5d6
 	.4byte	0x5547
 	.4byte	.LLST12
 	.uleb128 0x51
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0x5d5
+	.2byte	0x5d6
 	.4byte	0x6d
 	.4byte	.LLST13
 	.uleb128 0x51
 	.string	"arg"
 	.byte	0x1
-	.2byte	0x5d5
+	.2byte	0x5d6
 	.4byte	0x29
 	.4byte	.LLST14
 	.uleb128 0x46
 	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x5d7
+	.2byte	0x5d8
 	.4byte	0x443
 	.uleb128 0x46
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x5d8
+	.2byte	0x5d9
 	.4byte	0xe13f
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x5d9
+	.2byte	0x5da
 	.4byte	0xe72c
 	.uleb128 0x4c
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x5da
+	.2byte	0x5db
 	.4byte	0xd9e5
 	.uleb128 0x2
 	.byte	0x91
@@ -39935,22 +39932,22 @@ __exitcall_ebc_exit:
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5db
+	.2byte	0x5dc
 	.4byte	0xe418
 	.uleb128 0x46
 	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x5dc
+	.2byte	0x5dd
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x5dd
+	.2byte	0x5de
 	.4byte	0x29
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x5de
+	.2byte	0x5df
 	.4byte	0xc6
 	.uleb128 0x55
 	.4byte	.LASF3023
@@ -39964,19 +39961,19 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x628
+	.2byte	0x629
 	.4byte	0xc6
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x1a0
 	.uleb128 0x6b
 	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x628
+	.2byte	0x629
 	.8byte	.L127
 	.uleb128 0x4c
 	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x628
+	.2byte	0x629
 	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
@@ -39984,7 +39981,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x628
+	.2byte	0x629
 	.4byte	0x194
 	.uleb128 0x6c
 	.8byte	.LBB998
@@ -39993,71 +39990,71 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x628
+	.2byte	0x629
 	.4byte	0x194
 	.4byte	.LLST29
 	.uleb128 0x4e
 	.8byte	.LVL93
-	.4byte	0x1416a
+	.4byte	0x14177
 	.uleb128 0x4e
 	.8byte	.LVL94
-	.4byte	0x14176
+	.4byte	0x14183
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL91
-	.4byte	0x14183
+	.4byte	0x14190
 	.uleb128 0x4e
 	.8byte	.LVL95
-	.4byte	0x1418f
+	.4byte	0x1419c
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13026
+	.4byte	0x13033
 	.8byte	.LBB934
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x690
+	.2byte	0x691
 	.4byte	0x10679
 	.uleb128 0x54
-	.4byte	0x1304b
+	.4byte	0x13058
 	.uleb128 0x54
-	.4byte	0x13040
+	.4byte	0x1304d
 	.uleb128 0x54
-	.4byte	0x13036
+	.4byte	0x13043
 	.uleb128 0x6d
-	.4byte	0x13084
+	.4byte	0x13091
 	.8byte	.LBB935
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x130a9
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x1309e
+	.4byte	0x130ab
 	.uleb128 0x54
-	.4byte	0x13094
+	.4byte	0x130a1
 	.uleb128 0x6e
-	.4byte	0x13121
+	.4byte	0x1312e
 	.8byte	.LBB937
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x105af
 	.uleb128 0x54
-	.4byte	0x1313c
+	.4byte	0x13149
 	.uleb128 0x6f
-	.4byte	0x13131
+	.4byte	0x1313e
 	.4byte	.LLST15
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x80
 	.uleb128 0x5f
-	.4byte	0x13147
+	.4byte	0x13154
 	.4byte	.LLST16
 	.uleb128 0x5f
-	.4byte	0x13152
+	.4byte	0x1315f
 	.4byte	.LLST17
 	.uleb128 0x70
-	.4byte	0x13575
+	.4byte	0x13582
 	.8byte	.LBB939
 	.8byte	.LBE939-.LBB939
 	.byte	0x6
@@ -40067,99 +40064,99 @@ __exitcall_ebc_exit:
 	.8byte	.LBB940
 	.8byte	.LBE940-.LBB940
 	.uleb128 0x5f
-	.4byte	0x13585
+	.4byte	0x13592
 	.4byte	.LLST18
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13549
+	.4byte	0x13556
 	.8byte	.LBB941
 	.8byte	.LBE941-.LBB941
 	.byte	0x6
 	.byte	0x55
 	.4byte	0x1055d
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13570
 	.uleb128 0x54
-	.4byte	0x13559
+	.4byte	0x13566
 	.uleb128 0x5b
-	.4byte	0x1362b
+	.4byte	0x13638
 	.8byte	.LBB942
 	.8byte	.LBE942-.LBB942
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x13645
+	.4byte	0x13652
 	.uleb128 0x54
-	.4byte	0x1363b
+	.4byte	0x13648
 	.byte	0
 	.byte	0
 	.uleb128 0x56
 	.8byte	.LBB944
 	.8byte	.LBE944-.LBB944
 	.uleb128 0x57
-	.4byte	0x1315e
+	.4byte	0x1316b
 	.uleb128 0x5b
-	.4byte	0x135f9
+	.4byte	0x13606
 	.8byte	.LBB945
 	.8byte	.LBE945-.LBB945
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13614
+	.4byte	0x13621
 	.uleb128 0x54
-	.4byte	0x13609
+	.4byte	0x13616
 	.uleb128 0x56
 	.8byte	.LBB946
 	.8byte	.LBE946-.LBB946
 	.uleb128 0x57
-	.4byte	0x1361f
+	.4byte	0x1362c
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x130ed
+	.4byte	0x130fa
 	.8byte	.LBB951
 	.8byte	.LBE951-.LBB951
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x1066a
 	.uleb128 0x54
-	.4byte	0x130fd
+	.4byte	0x1310a
 	.uleb128 0x56
 	.8byte	.LBB952
 	.8byte	.LBE952-.LBB952
 	.uleb128 0x5f
-	.4byte	0x13108
+	.4byte	0x13115
 	.4byte	.LLST19
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xc0
 	.4byte	0x10635
 	.uleb128 0x5f
-	.4byte	0x13114
+	.4byte	0x13121
 	.4byte	.LLST20
 	.uleb128 0x5b
-	.4byte	0x135f9
+	.4byte	0x13606
 	.8byte	.LBB954
 	.8byte	.LBE954-.LBB954
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13614
+	.4byte	0x13621
 	.uleb128 0x54
-	.4byte	0x13609
+	.4byte	0x13616
 	.uleb128 0x56
 	.8byte	.LBB955
 	.8byte	.LBE955-.LBB955
 	.uleb128 0x57
-	.4byte	0x1361f
+	.4byte	0x1362c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13575
+	.4byte	0x13582
 	.8byte	.LBB956
 	.8byte	.LBE956-.LBB956
 	.byte	0x6
@@ -40168,7 +40165,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB957
 	.8byte	.LBE957-.LBB957
 	.uleb128 0x5f
-	.4byte	0x13585
+	.4byte	0x13592
 	.4byte	.LLST21
 	.byte	0
 	.byte	0
@@ -40176,60 +40173,60 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL121
-	.4byte	0x1419c
+	.4byte	0x141a9
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13055
+	.4byte	0x13062
 	.8byte	.LBB967
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
-	.2byte	0x613
+	.2byte	0x614
 	.4byte	0x108a4
 	.uleb128 0x54
-	.4byte	0x1307a
+	.4byte	0x13087
 	.uleb128 0x54
-	.4byte	0x1306f
+	.4byte	0x1307c
 	.uleb128 0x54
-	.4byte	0x13065
+	.4byte	0x13072
 	.uleb128 0x6d
-	.4byte	0x130b3
+	.4byte	0x130c0
 	.8byte	.LBB968
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x130d8
+	.4byte	0x130e5
 	.uleb128 0x54
-	.4byte	0x130cd
+	.4byte	0x130da
 	.uleb128 0x54
-	.4byte	0x130c3
+	.4byte	0x130d0
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x57
-	.4byte	0x130e1
+	.4byte	0x130ee
 	.uleb128 0x6e
-	.4byte	0x13121
+	.4byte	0x1312e
 	.8byte	.LBB970
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x107d9
 	.uleb128 0x54
-	.4byte	0x1313c
+	.4byte	0x13149
 	.uleb128 0x6f
-	.4byte	0x13131
+	.4byte	0x1313e
 	.4byte	.LLST22
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x130
 	.uleb128 0x5f
-	.4byte	0x13147
+	.4byte	0x13154
 	.4byte	.LLST23
 	.uleb128 0x5f
-	.4byte	0x13152
+	.4byte	0x1315f
 	.4byte	.LLST24
 	.uleb128 0x70
-	.4byte	0x13575
+	.4byte	0x13582
 	.8byte	.LBB972
 	.8byte	.LBE972-.LBB972
 	.byte	0x6
@@ -40239,7 +40236,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB973
 	.8byte	.LBE973-.LBB973
 	.uleb128 0x5f
-	.4byte	0x13585
+	.4byte	0x13592
 	.4byte	.LLST25
 	.byte	0
 	.byte	0
@@ -40248,90 +40245,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE974-.LBB974
 	.4byte	0x10793
 	.uleb128 0x57
-	.4byte	0x1315e
+	.4byte	0x1316b
 	.uleb128 0x5b
-	.4byte	0x135f9
+	.4byte	0x13606
 	.8byte	.LBB975
 	.8byte	.LBE975-.LBB975
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13614
+	.4byte	0x13621
 	.uleb128 0x54
-	.4byte	0x13609
+	.4byte	0x13616
 	.uleb128 0x56
 	.8byte	.LBB976
 	.8byte	.LBE976-.LBB976
 	.uleb128 0x57
-	.4byte	0x1361f
+	.4byte	0x1362c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13549
+	.4byte	0x13556
 	.8byte	.LBB977
 	.8byte	.LBE977-.LBB977
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13570
 	.uleb128 0x54
-	.4byte	0x13559
+	.4byte	0x13566
 	.uleb128 0x5b
-	.4byte	0x1362b
+	.4byte	0x13638
 	.8byte	.LBB978
 	.8byte	.LBE978-.LBB978
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x13645
+	.4byte	0x13652
 	.uleb128 0x54
-	.4byte	0x1363b
+	.4byte	0x13648
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x130ed
+	.4byte	0x130fa
 	.8byte	.LBB982
 	.8byte	.LBE982-.LBB982
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x10894
 	.uleb128 0x54
-	.4byte	0x130fd
+	.4byte	0x1310a
 	.uleb128 0x56
 	.8byte	.LBB983
 	.8byte	.LBE983-.LBB983
 	.uleb128 0x5f
-	.4byte	0x13108
+	.4byte	0x13115
 	.4byte	.LLST26
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x170
 	.4byte	0x1085f
 	.uleb128 0x5f
-	.4byte	0x13114
+	.4byte	0x13121
 	.4byte	.LLST27
 	.uleb128 0x5b
-	.4byte	0x135f9
+	.4byte	0x13606
 	.8byte	.LBB985
 	.8byte	.LBE985-.LBB985
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13614
+	.4byte	0x13621
 	.uleb128 0x54
-	.4byte	0x13609
+	.4byte	0x13616
 	.uleb128 0x56
 	.8byte	.LBB986
 	.8byte	.LBE986-.LBB986
 	.uleb128 0x57
-	.4byte	0x1361f
+	.4byte	0x1362c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13575
+	.4byte	0x13582
 	.8byte	.LBB987
 	.8byte	.LBE987-.LBB987
 	.byte	0x6
@@ -40340,7 +40337,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB988
 	.8byte	.LBE988-.LBB988
 	.uleb128 0x5f
-	.4byte	0x13585
+	.4byte	0x13592
 	.4byte	.LLST28
 	.byte	0
 	.byte	0
@@ -40348,61 +40345,61 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL86
-	.4byte	0x141a9
+	.4byte	0x141b6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13055
+	.4byte	0x13062
 	.8byte	.LBB1002
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
-	.2byte	0x62f
+	.2byte	0x630
 	.4byte	0x10acf
 	.uleb128 0x54
-	.4byte	0x1307a
+	.4byte	0x13087
 	.uleb128 0x54
-	.4byte	0x1306f
+	.4byte	0x1307c
 	.uleb128 0x54
-	.4byte	0x13065
+	.4byte	0x13072
 	.uleb128 0x6d
-	.4byte	0x130b3
+	.4byte	0x130c0
 	.8byte	.LBB1003
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x130d8
+	.4byte	0x130e5
 	.uleb128 0x54
-	.4byte	0x130cd
+	.4byte	0x130da
 	.uleb128 0x54
-	.4byte	0x130c3
+	.4byte	0x130d0
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x1f0
 	.uleb128 0x57
-	.4byte	0x130e1
+	.4byte	0x130ee
 	.uleb128 0x6e
-	.4byte	0x13121
+	.4byte	0x1312e
 	.8byte	.LBB1005
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x10a04
 	.uleb128 0x54
-	.4byte	0x1313c
+	.4byte	0x13149
 	.uleb128 0x6f
-	.4byte	0x13131
+	.4byte	0x1313e
 	.4byte	.LLST30
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x230
 	.uleb128 0x5f
-	.4byte	0x13147
+	.4byte	0x13154
 	.4byte	.LLST31
 	.uleb128 0x5f
-	.4byte	0x13152
+	.4byte	0x1315f
 	.4byte	.LLST32
 	.uleb128 0x70
-	.4byte	0x13575
+	.4byte	0x13582
 	.8byte	.LBB1007
 	.8byte	.LBE1007-.LBB1007
 	.byte	0x6
@@ -40412,7 +40409,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1008
 	.8byte	.LBE1008-.LBB1008
 	.uleb128 0x5f
-	.4byte	0x13585
+	.4byte	0x13592
 	.4byte	.LLST33
 	.byte	0
 	.byte	0
@@ -40421,90 +40418,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1009-.LBB1009
 	.4byte	0x109be
 	.uleb128 0x57
-	.4byte	0x1315e
+	.4byte	0x1316b
 	.uleb128 0x5b
-	.4byte	0x135f9
+	.4byte	0x13606
 	.8byte	.LBB1010
 	.8byte	.LBE1010-.LBB1010
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13614
+	.4byte	0x13621
 	.uleb128 0x54
-	.4byte	0x13609
+	.4byte	0x13616
 	.uleb128 0x56
 	.8byte	.LBB1011
 	.8byte	.LBE1011-.LBB1011
 	.uleb128 0x57
-	.4byte	0x1361f
+	.4byte	0x1362c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13549
+	.4byte	0x13556
 	.8byte	.LBB1012
 	.8byte	.LBE1012-.LBB1012
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13570
 	.uleb128 0x54
-	.4byte	0x13559
+	.4byte	0x13566
 	.uleb128 0x5b
-	.4byte	0x1362b
+	.4byte	0x13638
 	.8byte	.LBB1013
 	.8byte	.LBE1013-.LBB1013
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x13645
+	.4byte	0x13652
 	.uleb128 0x54
-	.4byte	0x1363b
+	.4byte	0x13648
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x130ed
+	.4byte	0x130fa
 	.8byte	.LBB1017
 	.8byte	.LBE1017-.LBB1017
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x10abf
 	.uleb128 0x54
-	.4byte	0x130fd
+	.4byte	0x1310a
 	.uleb128 0x56
 	.8byte	.LBB1018
 	.8byte	.LBE1018-.LBB1018
 	.uleb128 0x5f
-	.4byte	0x13108
+	.4byte	0x13115
 	.4byte	.LLST34
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x270
 	.4byte	0x10a8a
 	.uleb128 0x5f
-	.4byte	0x13114
+	.4byte	0x13121
 	.4byte	.LLST35
 	.uleb128 0x5b
-	.4byte	0x135f9
+	.4byte	0x13606
 	.8byte	.LBB1020
 	.8byte	.LBE1020-.LBB1020
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13614
+	.4byte	0x13621
 	.uleb128 0x54
-	.4byte	0x13609
+	.4byte	0x13616
 	.uleb128 0x56
 	.8byte	.LBB1021
 	.8byte	.LBE1021-.LBB1021
 	.uleb128 0x57
-	.4byte	0x1361f
+	.4byte	0x1362c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13575
+	.4byte	0x13582
 	.8byte	.LBB1022
 	.8byte	.LBE1022-.LBB1022
 	.byte	0x6
@@ -40513,7 +40510,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1023
 	.8byte	.LBE1023-.LBB1023
 	.uleb128 0x5f
-	.4byte	0x13585
+	.4byte	0x13592
 	.4byte	.LLST36
 	.byte	0
 	.byte	0
@@ -40521,57 +40518,57 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL110
-	.4byte	0x141a9
+	.4byte	0x141b6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13026
+	.4byte	0x13033
 	.8byte	.LBB1032
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
-	.2byte	0x5fd
+	.2byte	0x5fe
 	.4byte	0x10cef
 	.uleb128 0x54
-	.4byte	0x1304b
+	.4byte	0x13058
 	.uleb128 0x54
-	.4byte	0x13040
+	.4byte	0x1304d
 	.uleb128 0x54
-	.4byte	0x13036
+	.4byte	0x13043
 	.uleb128 0x6d
-	.4byte	0x13084
+	.4byte	0x13091
 	.8byte	.LBB1033
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x130a9
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x1309e
+	.4byte	0x130ab
 	.uleb128 0x54
-	.4byte	0x13094
+	.4byte	0x130a1
 	.uleb128 0x6e
-	.4byte	0x13121
+	.4byte	0x1312e
 	.8byte	.LBB1035
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x10c25
 	.uleb128 0x54
-	.4byte	0x1313c
+	.4byte	0x13149
 	.uleb128 0x6f
-	.4byte	0x13131
+	.4byte	0x1313e
 	.4byte	.LLST37
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x2f0
 	.uleb128 0x5f
-	.4byte	0x13147
+	.4byte	0x13154
 	.4byte	.LLST38
 	.uleb128 0x5f
-	.4byte	0x13152
+	.4byte	0x1315f
 	.4byte	.LLST39
 	.uleb128 0x70
-	.4byte	0x13575
+	.4byte	0x13582
 	.8byte	.LBB1037
 	.8byte	.LBE1037-.LBB1037
 	.byte	0x6
@@ -40581,7 +40578,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1038
 	.8byte	.LBE1038-.LBB1038
 	.uleb128 0x5f
-	.4byte	0x13585
+	.4byte	0x13592
 	.4byte	.LLST40
 	.byte	0
 	.byte	0
@@ -40590,90 +40587,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1039-.LBB1039
 	.4byte	0x10bdf
 	.uleb128 0x57
-	.4byte	0x1315e
+	.4byte	0x1316b
 	.uleb128 0x5b
-	.4byte	0x135f9
+	.4byte	0x13606
 	.8byte	.LBB1040
 	.8byte	.LBE1040-.LBB1040
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13614
+	.4byte	0x13621
 	.uleb128 0x54
-	.4byte	0x13609
+	.4byte	0x13616
 	.uleb128 0x56
 	.8byte	.LBB1041
 	.8byte	.LBE1041-.LBB1041
 	.uleb128 0x57
-	.4byte	0x1361f
+	.4byte	0x1362c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13549
+	.4byte	0x13556
 	.8byte	.LBB1042
 	.8byte	.LBE1042-.LBB1042
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13570
 	.uleb128 0x54
-	.4byte	0x13559
+	.4byte	0x13566
 	.uleb128 0x5b
-	.4byte	0x1362b
+	.4byte	0x13638
 	.8byte	.LBB1043
 	.8byte	.LBE1043-.LBB1043
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x13645
+	.4byte	0x13652
 	.uleb128 0x54
-	.4byte	0x1363b
+	.4byte	0x13648
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x130ed
+	.4byte	0x130fa
 	.8byte	.LBB1049
 	.8byte	.LBE1049-.LBB1049
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x10ce0
 	.uleb128 0x54
-	.4byte	0x130fd
+	.4byte	0x1310a
 	.uleb128 0x56
 	.8byte	.LBB1050
 	.8byte	.LBE1050-.LBB1050
 	.uleb128 0x5f
-	.4byte	0x13108
+	.4byte	0x13115
 	.4byte	.LLST41
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x340
 	.4byte	0x10cab
 	.uleb128 0x5f
-	.4byte	0x13114
+	.4byte	0x13121
 	.4byte	.LLST42
 	.uleb128 0x5b
-	.4byte	0x135f9
+	.4byte	0x13606
 	.8byte	.LBB1052
 	.8byte	.LBE1052-.LBB1052
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13614
+	.4byte	0x13621
 	.uleb128 0x54
-	.4byte	0x13609
+	.4byte	0x13616
 	.uleb128 0x56
 	.8byte	.LBB1053
 	.8byte	.LBE1053-.LBB1053
 	.uleb128 0x57
-	.4byte	0x1361f
+	.4byte	0x1362c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13575
+	.4byte	0x13582
 	.8byte	.LBB1054
 	.8byte	.LBE1054-.LBB1054
 	.byte	0x6
@@ -40682,7 +40679,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1055
 	.8byte	.LBE1055-.LBB1055
 	.uleb128 0x5f
-	.4byte	0x13585
+	.4byte	0x13592
 	.4byte	.LLST43
 	.byte	0
 	.byte	0
@@ -40690,61 +40687,61 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL137
-	.4byte	0x1419c
+	.4byte	0x141a9
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13055
+	.4byte	0x13062
 	.8byte	.LBB1066
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
-	.2byte	0x64c
+	.2byte	0x64d
 	.4byte	0x10f2b
 	.uleb128 0x54
-	.4byte	0x1307a
+	.4byte	0x13087
 	.uleb128 0x54
-	.4byte	0x1306f
+	.4byte	0x1307c
 	.uleb128 0x54
-	.4byte	0x13065
+	.4byte	0x13072
 	.uleb128 0x6d
-	.4byte	0x130b3
+	.4byte	0x130c0
 	.8byte	.LBB1067
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x130d8
+	.4byte	0x130e5
 	.uleb128 0x54
-	.4byte	0x130cd
+	.4byte	0x130da
 	.uleb128 0x54
-	.4byte	0x130c3
+	.4byte	0x130d0
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x370
 	.uleb128 0x5f
-	.4byte	0x130e1
+	.4byte	0x130ee
 	.4byte	.LLST44
 	.uleb128 0x6e
-	.4byte	0x13121
+	.4byte	0x1312e
 	.8byte	.LBB1069
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
 	.4byte	0x10e53
 	.uleb128 0x54
-	.4byte	0x1313c
+	.4byte	0x13149
 	.uleb128 0x6f
-	.4byte	0x13131
+	.4byte	0x1313e
 	.4byte	.LLST45
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x5f
-	.4byte	0x13147
+	.4byte	0x13154
 	.4byte	.LLST46
 	.uleb128 0x5f
-	.4byte	0x13152
+	.4byte	0x1315f
 	.4byte	.LLST47
 	.uleb128 0x70
-	.4byte	0x13575
+	.4byte	0x13582
 	.8byte	.LBB1071
 	.8byte	.LBE1071-.LBB1071
 	.byte	0x6
@@ -40754,7 +40751,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1072
 	.8byte	.LBE1072-.LBB1072
 	.uleb128 0x5f
-	.4byte	0x13585
+	.4byte	0x13592
 	.4byte	.LLST48
 	.byte	0
 	.byte	0
@@ -40763,90 +40760,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1073-.LBB1073
 	.4byte	0x10e0d
 	.uleb128 0x57
-	.4byte	0x1315e
+	.4byte	0x1316b
 	.uleb128 0x5b
-	.4byte	0x135f9
+	.4byte	0x13606
 	.8byte	.LBB1074
 	.8byte	.LBE1074-.LBB1074
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13614
+	.4byte	0x13621
 	.uleb128 0x54
-	.4byte	0x13609
+	.4byte	0x13616
 	.uleb128 0x56
 	.8byte	.LBB1075
 	.8byte	.LBE1075-.LBB1075
 	.uleb128 0x57
-	.4byte	0x1361f
+	.4byte	0x1362c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13549
+	.4byte	0x13556
 	.8byte	.LBB1076
 	.8byte	.LBE1076-.LBB1076
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13570
 	.uleb128 0x54
-	.4byte	0x13559
+	.4byte	0x13566
 	.uleb128 0x5b
-	.4byte	0x1362b
+	.4byte	0x13638
 	.8byte	.LBB1077
 	.8byte	.LBE1077-.LBB1077
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x13645
+	.4byte	0x13652
 	.uleb128 0x54
-	.4byte	0x1363b
+	.4byte	0x13648
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x130ed
+	.4byte	0x130fa
 	.8byte	.LBB1083
 	.8byte	.LBE1083-.LBB1083
 	.byte	0x9
 	.byte	0x74
 	.4byte	0x10f0e
 	.uleb128 0x54
-	.4byte	0x130fd
+	.4byte	0x1310a
 	.uleb128 0x56
 	.8byte	.LBB1084
 	.8byte	.LBE1084-.LBB1084
 	.uleb128 0x5f
-	.4byte	0x13108
+	.4byte	0x13115
 	.4byte	.LLST49
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x420
 	.4byte	0x10ed9
 	.uleb128 0x5f
-	.4byte	0x13114
+	.4byte	0x13121
 	.4byte	.LLST50
 	.uleb128 0x5b
-	.4byte	0x135f9
+	.4byte	0x13606
 	.8byte	.LBB1086
 	.8byte	.LBE1086-.LBB1086
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13614
+	.4byte	0x13621
 	.uleb128 0x54
-	.4byte	0x13609
+	.4byte	0x13616
 	.uleb128 0x56
 	.8byte	.LBB1087
 	.8byte	.LBE1087-.LBB1087
 	.uleb128 0x57
-	.4byte	0x1361f
+	.4byte	0x1362c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13575
+	.4byte	0x13582
 	.8byte	.LBB1088
 	.8byte	.LBE1088-.LBB1088
 	.byte	0x6
@@ -40855,7 +40852,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1089
 	.8byte	.LBE1089-.LBB1089
 	.uleb128 0x5f
-	.4byte	0x13585
+	.4byte	0x13592
 	.4byte	.LLST51
 	.byte	0
 	.byte	0
@@ -40863,59 +40860,59 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL149
-	.4byte	0x141a9
+	.4byte	0x141b6
 	.uleb128 0x4e
 	.8byte	.LVL227
-	.4byte	0x13ff2
+	.4byte	0x13fff
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13026
+	.4byte	0x13033
 	.8byte	.LBB1102
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
-	.2byte	0x669
+	.2byte	0x66a
 	.4byte	0x10fdd
 	.uleb128 0x54
-	.4byte	0x1304b
+	.4byte	0x13058
 	.uleb128 0x54
-	.4byte	0x13040
+	.4byte	0x1304d
 	.uleb128 0x54
-	.4byte	0x13036
+	.4byte	0x13043
 	.uleb128 0x6d
-	.4byte	0x13084
+	.4byte	0x13091
 	.8byte	.LBB1103
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x130a9
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x1309e
+	.4byte	0x130ab
 	.uleb128 0x54
-	.4byte	0x13094
+	.4byte	0x130a1
 	.uleb128 0x6d
-	.4byte	0x13121
+	.4byte	0x1312e
 	.8byte	.LBB1105
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x54
-	.4byte	0x1313c
+	.4byte	0x13149
 	.uleb128 0x71
-	.4byte	0x13131
+	.4byte	0x1313e
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x4b0
 	.uleb128 0x57
-	.4byte	0x13147
+	.4byte	0x13154
 	.uleb128 0x5f
-	.4byte	0x13152
+	.4byte	0x1315f
 	.4byte	.LLST52
 	.uleb128 0x5b
-	.4byte	0x13575
+	.4byte	0x13582
 	.8byte	.LBB1107
 	.8byte	.LBE1107-.LBB1107
 	.byte	0x6
@@ -40924,7 +40921,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1108
 	.8byte	.LBE1108-.LBB1108
 	.uleb128 0x5f
-	.4byte	0x13585
+	.4byte	0x13592
 	.4byte	.LLST53
 	.byte	0
 	.byte	0
@@ -40933,52 +40930,52 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13026
+	.4byte	0x13033
 	.8byte	.LBB1114
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
-	.2byte	0x659
+	.2byte	0x65a
 	.4byte	0x111fd
 	.uleb128 0x54
-	.4byte	0x1304b
+	.4byte	0x13058
 	.uleb128 0x54
-	.4byte	0x13040
+	.4byte	0x1304d
 	.uleb128 0x54
-	.4byte	0x13036
+	.4byte	0x13043
 	.uleb128 0x6d
-	.4byte	0x13084
+	.4byte	0x13091
 	.8byte	.LBB1115
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x130a9
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x1309e
+	.4byte	0x130ab
 	.uleb128 0x54
-	.4byte	0x13094
+	.4byte	0x130a1
 	.uleb128 0x6e
-	.4byte	0x13121
+	.4byte	0x1312e
 	.8byte	.LBB1117
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x11133
 	.uleb128 0x54
-	.4byte	0x1313c
+	.4byte	0x13149
 	.uleb128 0x6f
-	.4byte	0x13131
+	.4byte	0x1313e
 	.4byte	.LLST54
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x540
 	.uleb128 0x5f
-	.4byte	0x13147
+	.4byte	0x13154
 	.4byte	.LLST55
 	.uleb128 0x5f
-	.4byte	0x13152
+	.4byte	0x1315f
 	.4byte	.LLST56
 	.uleb128 0x70
-	.4byte	0x13575
+	.4byte	0x13582
 	.8byte	.LBB1119
 	.8byte	.LBE1119-.LBB1119
 	.byte	0x6
@@ -40988,7 +40985,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1120
 	.8byte	.LBE1120-.LBB1120
 	.uleb128 0x5f
-	.4byte	0x13585
+	.4byte	0x13592
 	.4byte	.LLST57
 	.byte	0
 	.byte	0
@@ -40997,90 +40994,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1121-.LBB1121
 	.4byte	0x110ed
 	.uleb128 0x57
-	.4byte	0x1315e
+	.4byte	0x1316b
 	.uleb128 0x5b
-	.4byte	0x135f9
+	.4byte	0x13606
 	.8byte	.LBB1122
 	.8byte	.LBE1122-.LBB1122
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13614
+	.4byte	0x13621
 	.uleb128 0x54
-	.4byte	0x13609
+	.4byte	0x13616
 	.uleb128 0x56
 	.8byte	.LBB1123
 	.8byte	.LBE1123-.LBB1123
 	.uleb128 0x57
-	.4byte	0x1361f
+	.4byte	0x1362c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13549
+	.4byte	0x13556
 	.8byte	.LBB1124
 	.8byte	.LBE1124-.LBB1124
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13570
 	.uleb128 0x54
-	.4byte	0x13559
+	.4byte	0x13566
 	.uleb128 0x5b
-	.4byte	0x1362b
+	.4byte	0x13638
 	.8byte	.LBB1125
 	.8byte	.LBE1125-.LBB1125
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x13645
+	.4byte	0x13652
 	.uleb128 0x54
-	.4byte	0x1363b
+	.4byte	0x13648
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x130ed
+	.4byte	0x130fa
 	.8byte	.LBB1133
 	.8byte	.LBE1133-.LBB1133
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x111ee
 	.uleb128 0x54
-	.4byte	0x130fd
+	.4byte	0x1310a
 	.uleb128 0x56
 	.8byte	.LBB1134
 	.8byte	.LBE1134-.LBB1134
 	.uleb128 0x5f
-	.4byte	0x13108
+	.4byte	0x13115
 	.4byte	.LLST58
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x590
 	.4byte	0x111b9
 	.uleb128 0x5f
-	.4byte	0x13114
+	.4byte	0x13121
 	.4byte	.LLST59
 	.uleb128 0x5b
-	.4byte	0x135f9
+	.4byte	0x13606
 	.8byte	.LBB1136
 	.8byte	.LBE1136-.LBB1136
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13614
+	.4byte	0x13621
 	.uleb128 0x54
-	.4byte	0x13609
+	.4byte	0x13616
 	.uleb128 0x56
 	.8byte	.LBB1137
 	.8byte	.LBE1137-.LBB1137
 	.uleb128 0x57
-	.4byte	0x1361f
+	.4byte	0x1362c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13575
+	.4byte	0x13582
 	.8byte	.LBB1138
 	.8byte	.LBE1138-.LBB1138
 	.byte	0x6
@@ -41089,7 +41086,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1139
 	.8byte	.LBE1139-.LBB1139
 	.uleb128 0x5f
-	.4byte	0x13585
+	.4byte	0x13592
 	.4byte	.LLST60
 	.byte	0
 	.byte	0
@@ -41097,56 +41094,56 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL210
-	.4byte	0x1419c
+	.4byte	0x141a9
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13026
+	.4byte	0x13033
 	.8byte	.LBB1150
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
-	.2byte	0x60b
+	.2byte	0x60c
 	.4byte	0x1141d
 	.uleb128 0x54
-	.4byte	0x1304b
+	.4byte	0x13058
 	.uleb128 0x54
-	.4byte	0x13040
+	.4byte	0x1304d
 	.uleb128 0x54
-	.4byte	0x13036
+	.4byte	0x13043
 	.uleb128 0x6d
-	.4byte	0x13084
+	.4byte	0x13091
 	.8byte	.LBB1151
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x130a9
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x1309e
+	.4byte	0x130ab
 	.uleb128 0x54
-	.4byte	0x13094
+	.4byte	0x130a1
 	.uleb128 0x6e
-	.4byte	0x13121
+	.4byte	0x1312e
 	.8byte	.LBB1153
 	.4byte	.Ldebug_ranges0+0x620
 	.byte	0x9
 	.byte	0x84
 	.4byte	0x11353
 	.uleb128 0x54
-	.4byte	0x1313c
+	.4byte	0x13149
 	.uleb128 0x6f
-	.4byte	0x13131
+	.4byte	0x1313e
 	.4byte	.LLST61
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x620
 	.uleb128 0x5f
-	.4byte	0x13147
+	.4byte	0x13154
 	.4byte	.LLST62
 	.uleb128 0x5f
-	.4byte	0x13152
+	.4byte	0x1315f
 	.4byte	.LLST63
 	.uleb128 0x70
-	.4byte	0x13575
+	.4byte	0x13582
 	.8byte	.LBB1155
 	.8byte	.LBE1155-.LBB1155
 	.byte	0x6
@@ -41156,7 +41153,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1156
 	.8byte	.LBE1156-.LBB1156
 	.uleb128 0x5f
-	.4byte	0x13585
+	.4byte	0x13592
 	.4byte	.LLST64
 	.byte	0
 	.byte	0
@@ -41165,90 +41162,90 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1157-.LBB1157
 	.4byte	0x1130d
 	.uleb128 0x57
-	.4byte	0x1315e
+	.4byte	0x1316b
 	.uleb128 0x5b
-	.4byte	0x135f9
+	.4byte	0x13606
 	.8byte	.LBB1158
 	.8byte	.LBE1158-.LBB1158
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13614
+	.4byte	0x13621
 	.uleb128 0x54
-	.4byte	0x13609
+	.4byte	0x13616
 	.uleb128 0x56
 	.8byte	.LBB1159
 	.8byte	.LBE1159-.LBB1159
 	.uleb128 0x57
-	.4byte	0x1361f
+	.4byte	0x1362c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13549
+	.4byte	0x13556
 	.8byte	.LBB1160
 	.8byte	.LBE1160-.LBB1160
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13563
+	.4byte	0x13570
 	.uleb128 0x54
-	.4byte	0x13559
+	.4byte	0x13566
 	.uleb128 0x5b
-	.4byte	0x1362b
+	.4byte	0x13638
 	.8byte	.LBB1161
 	.8byte	.LBE1161-.LBB1161
 	.byte	0xca
 	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x13645
+	.4byte	0x13652
 	.uleb128 0x54
-	.4byte	0x1363b
+	.4byte	0x13648
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x130ed
+	.4byte	0x130fa
 	.8byte	.LBB1169
 	.8byte	.LBE1169-.LBB1169
 	.byte	0x9
 	.byte	0x86
 	.4byte	0x1140e
 	.uleb128 0x54
-	.4byte	0x130fd
+	.4byte	0x1310a
 	.uleb128 0x56
 	.8byte	.LBB1170
 	.8byte	.LBE1170-.LBB1170
 	.uleb128 0x5f
-	.4byte	0x13108
+	.4byte	0x13115
 	.4byte	.LLST65
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x670
 	.4byte	0x113d9
 	.uleb128 0x5f
-	.4byte	0x13114
+	.4byte	0x13121
 	.4byte	.LLST66
 	.uleb128 0x5b
-	.4byte	0x135f9
+	.4byte	0x13606
 	.8byte	.LBB1172
 	.8byte	.LBE1172-.LBB1172
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13614
+	.4byte	0x13621
 	.uleb128 0x54
-	.4byte	0x13609
+	.4byte	0x13616
 	.uleb128 0x56
 	.8byte	.LBB1173
 	.8byte	.LBE1173-.LBB1173
 	.uleb128 0x57
-	.4byte	0x1361f
+	.4byte	0x1362c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13575
+	.4byte	0x13582
 	.8byte	.LBB1174
 	.8byte	.LBE1174-.LBB1174
 	.byte	0x6
@@ -41257,7 +41254,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1175
 	.8byte	.LBE1175-.LBB1175
 	.uleb128 0x5f
-	.4byte	0x13585
+	.4byte	0x13592
 	.4byte	.LLST67
 	.byte	0
 	.byte	0
@@ -41265,96 +41262,96 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL218
-	.4byte	0x1419c
+	.4byte	0x141a9
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL51
-	.4byte	0x14077
+	.4byte	0x14084
 	.uleb128 0x4e
 	.8byte	.LVL52
-	.4byte	0x140cd
+	.4byte	0x140da
 	.uleb128 0x4e
 	.8byte	.LVL53
-	.4byte	0x14151
+	.4byte	0x1415e
 	.uleb128 0x4e
 	.8byte	.LVL64
-	.4byte	0x141b6
+	.4byte	0x141c3
 	.uleb128 0x4e
 	.8byte	.LVL67
-	.4byte	0x14008
+	.4byte	0x14015
 	.uleb128 0x4e
 	.8byte	.LVL70
-	.4byte	0x13f8e
+	.4byte	0x13f9b
 	.uleb128 0x4e
 	.8byte	.LVL87
-	.4byte	0x14151
+	.4byte	0x1415e
 	.uleb128 0x4e
 	.8byte	.LVL88
-	.4byte	0x141c2
+	.4byte	0x141cf
 	.uleb128 0x4e
 	.8byte	.LVL90
-	.4byte	0x14083
+	.4byte	0x14090
 	.uleb128 0x4e
 	.8byte	.LVL97
-	.4byte	0x14077
+	.4byte	0x14084
 	.uleb128 0x4e
 	.8byte	.LVL111
-	.4byte	0x141ce
+	.4byte	0x141db
 	.uleb128 0x4e
 	.8byte	.LVL112
-	.4byte	0x14083
+	.4byte	0x14090
 	.uleb128 0x4e
 	.8byte	.LVL113
-	.4byte	0x140d7
+	.4byte	0x140e4
 	.uleb128 0x4e
 	.8byte	.LVL123
-	.4byte	0x141da
+	.4byte	0x141e7
 	.uleb128 0x4e
 	.8byte	.LVL124
-	.4byte	0x14151
+	.4byte	0x1415e
 	.uleb128 0x4e
 	.8byte	.LVL151
-	.4byte	0x13f8e
+	.4byte	0x13f9b
 	.uleb128 0x4e
 	.8byte	.LVL154
-	.4byte	0x13f8e
+	.4byte	0x13f9b
 	.uleb128 0x4e
 	.8byte	.LVL156
-	.4byte	0x14077
+	.4byte	0x14084
 	.uleb128 0x4e
 	.8byte	.LVL158
-	.4byte	0x14077
+	.4byte	0x14084
 	.uleb128 0x4e
 	.8byte	.LVL159
-	.4byte	0x140cd
+	.4byte	0x140da
 	.uleb128 0x4e
 	.8byte	.LVL160
-	.4byte	0x14151
+	.4byte	0x1415e
 	.uleb128 0x4e
 	.8byte	.LVL173
-	.4byte	0x14008
+	.4byte	0x14015
 	.uleb128 0x4e
 	.8byte	.LVL176
-	.4byte	0x14008
+	.4byte	0x14015
 	.uleb128 0x4e
 	.8byte	.LVL178
-	.4byte	0x14077
+	.4byte	0x14084
 	.uleb128 0x4e
 	.8byte	.LVL179
-	.4byte	0x14151
+	.4byte	0x1415e
 	.uleb128 0x4e
 	.8byte	.LVL187
-	.4byte	0x141b6
+	.4byte	0x141c3
 	.uleb128 0x4e
 	.8byte	.LVL221
-	.4byte	0x140d7
+	.4byte	0x140e4
 	.uleb128 0x4e
 	.8byte	.LVL228
-	.4byte	0x14008
+	.4byte	0x14015
 	.uleb128 0x4e
 	.8byte	.LVL229
-	.4byte	0x14115
+	.4byte	0x14122
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
@@ -41368,25 +41365,25 @@ __exitcall_ebc_exit:
 	.uleb128 0x62
 	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x592
+	.2byte	0x593
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x115d6
 	.uleb128 0x64
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x592
+	.2byte	0x593
 	.4byte	0xe13f
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x594
+	.2byte	0x595
 	.4byte	0xa55b
 	.byte	0
 	.uleb128 0x4d
 	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x58c
+	.2byte	0x58d
 	.8byte	.LFB2828
 	.8byte	.LFE2828-.LFB2828
 	.uleb128 0x1
@@ -41395,17 +41392,17 @@ __exitcall_ebc_exit:
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x58c
+	.2byte	0x58d
 	.4byte	0x31bd
 	.4byte	.LLST68
 	.uleb128 0x4e
 	.8byte	.LVL242
-	.4byte	0x1200b
+	.4byte	0x12018
 	.byte	0
 	.uleb128 0x4d
 	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0x580
+	.2byte	0x581
 	.8byte	.LFB2827
 	.8byte	.LFE2827-.LFB2827
 	.uleb128 0x1
@@ -41414,43 +41411,43 @@ __exitcall_ebc_exit:
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x580
+	.2byte	0x581
 	.4byte	0x31bd
 	.4byte	.LLST8
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x582
+	.2byte	0x583
 	.4byte	0xe72c
 	.uleb128 0x5e
-	.4byte	0x12fb8
+	.4byte	0x12fc5
 	.8byte	.LBB930
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.2byte	0x586
+	.2byte	0x587
 	.uleb128 0x54
-	.4byte	0x12fc4
+	.4byte	0x12fd1
 	.uleb128 0x4e
 	.8byte	.LVL41
-	.4byte	0x141e6
+	.4byte	0x141f3
 	.byte	0
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0x570
+	.2byte	0x571
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x1169a
 	.uleb128 0x64
 	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x570
+	.2byte	0x571
 	.4byte	0xe13f
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x572
+	.2byte	0x573
 	.4byte	0xe418
 	.byte	0
 	.uleb128 0x4f
@@ -41462,7 +41459,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2825-.LFB2825
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11e33
+	.4byte	0x11e40
 	.uleb128 0x51
 	.string	"ptr"
 	.byte	0x1
@@ -41515,10 +41512,10 @@ __exitcall_ebc_exit:
 	.uleb128 0x6b
 	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0x540
+	.2byte	0x541
 	.8byte	.L690
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x1140
+	.4byte	.Ldebug_ranges0+0x10e0
 	.4byte	0x117ea
 	.uleb128 0x46
 	.4byte	.LASF3063
@@ -41526,8 +41523,8 @@ __exitcall_ebc_exit:
 	.2byte	0x48a
 	.4byte	0xc6
 	.uleb128 0x56
-	.8byte	.LBB1815
-	.8byte	.LBE1815-.LBB1815
+	.8byte	.LBB1811
+	.8byte	.LBE1811-.LBB1811
 	.uleb128 0x6b
 	.4byte	.LASF3075
 	.byte	0x1
@@ -41547,49 +41544,49 @@ __exitcall_ebc_exit:
 	.2byte	0x48a
 	.4byte	0x194
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x1170
+	.4byte	.Ldebug_ranges0+0x1110
 	.4byte	0x117ce
 	.uleb128 0x59
 	.4byte	.LASF3065
 	.byte	0x1
 	.2byte	0x48a
 	.4byte	0x194
-	.4byte	.LLST185
+	.4byte	.LLST184
 	.uleb128 0x4e
-	.8byte	.LVL831
-	.4byte	0x1416a
+	.8byte	.LVL820
+	.4byte	0x14177
 	.uleb128 0x4e
-	.8byte	.LVL832
-	.4byte	0x14176
+	.8byte	.LVL821
+	.4byte	0x14183
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL829
-	.4byte	0x14183
+	.8byte	.LVL818
+	.4byte	0x14190
 	.uleb128 0x4e
-	.8byte	.LVL833
-	.4byte	0x1418f
+	.8byte	.LVL822
+	.4byte	0x1419c
 	.byte	0
 	.byte	0
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x10e0
+	.4byte	.Ldebug_ranges0+0x1140
 	.4byte	0x1188c
 	.uleb128 0x46
 	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x52f
+	.2byte	0x530
 	.4byte	0xc6
 	.uleb128 0x56
-	.8byte	.LBB1811
-	.8byte	.LBE1811-.LBB1811
+	.8byte	.LBB1815
+	.8byte	.LBE1815-.LBB1815
 	.uleb128 0x6b
 	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x52f
+	.2byte	0x530
 	.8byte	.L727
 	.uleb128 0x4c
 	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x52f
+	.2byte	0x530
 	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
@@ -41597,30 +41594,30 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x52f
+	.2byte	0x530
 	.4byte	0x194
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x1110
+	.4byte	.Ldebug_ranges0+0x1170
 	.4byte	0x11870
 	.uleb128 0x59
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x52f
+	.2byte	0x530
 	.4byte	0x194
-	.4byte	.LLST184
+	.4byte	.LLST185
 	.uleb128 0x4e
-	.8byte	.LVL820
-	.4byte	0x1416a
+	.8byte	.LVL834
+	.4byte	0x14177
 	.uleb128 0x4e
-	.8byte	.LVL821
-	.4byte	0x14176
+	.8byte	.LVL835
+	.4byte	0x14183
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL818
-	.4byte	0x14183
+	.8byte	.LVL832
+	.4byte	0x14190
 	.uleb128 0x4e
-	.8byte	.LVL822
-	.4byte	0x1418f
+	.8byte	.LVL836
+	.4byte	0x1419c
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
@@ -41630,7 +41627,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x55c
+	.2byte	0x55d
 	.4byte	0xc6
 	.uleb128 0x56
 	.8byte	.LBB1806
@@ -41638,11 +41635,11 @@ __exitcall_ebc_exit:
 	.uleb128 0x72
 	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x55c
+	.2byte	0x55d
 	.uleb128 0x4c
 	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x55c
+	.2byte	0x55d
 	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
@@ -41650,7 +41647,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x55c
+	.2byte	0x55d
 	.4byte	0x194
 	.uleb128 0x6c
 	.8byte	.LBB1807
@@ -41659,22 +41656,22 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x55c
+	.2byte	0x55d
 	.4byte	0x194
 	.4byte	.LLST183
 	.uleb128 0x4e
-	.8byte	.LVL771
-	.4byte	0x1416a
+	.8byte	.LVL765
+	.4byte	0x14177
 	.uleb128 0x4e
-	.8byte	.LVL772
-	.4byte	0x14176
+	.8byte	.LVL766
+	.4byte	0x14183
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL769
-	.4byte	0x14183
+	.8byte	.LVL763
+	.4byte	0x14190
 	.uleb128 0x4e
-	.8byte	.LVL773
-	.4byte	0x1418f
+	.8byte	.LVL767
+	.4byte	0x1419c
 	.byte	0
 	.byte	0
 	.uleb128 0x61
@@ -41683,19 +41680,19 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x568
+	.2byte	0x569
 	.4byte	0xc6
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x1020
 	.uleb128 0x6b
 	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x568
+	.2byte	0x569
 	.8byte	.L743
 	.uleb128 0x4c
 	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x568
+	.2byte	0x569
 	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
@@ -41703,7 +41700,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x568
+	.2byte	0x569
 	.4byte	0x194
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x1060
@@ -41711,329 +41708,332 @@ __exitcall_ebc_exit:
 	.uleb128 0x59
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x568
+	.2byte	0x569
 	.4byte	0x194
 	.4byte	.LLST182
 	.uleb128 0x4e
-	.8byte	.LVL722
-	.4byte	0x1416a
+	.8byte	.LVL720
+	.4byte	0x14177
 	.uleb128 0x4e
-	.8byte	.LVL723
-	.4byte	0x14176
+	.8byte	.LVL721
+	.4byte	0x14183
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL720
-	.4byte	0x14183
+	.8byte	.LVL718
+	.4byte	0x14190
 	.uleb128 0x4e
-	.8byte	.LVL724
-	.4byte	0x1418f
+	.8byte	.LVL722
+	.4byte	0x1419c
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x11e33
+	.4byte	0x11e40
 	.8byte	.LBB1799
 	.4byte	.Ldebug_ranges0+0x10a0
 	.byte	0x1
 	.2byte	0x505
 	.4byte	0x11a25
 	.uleb128 0x54
-	.4byte	0x11e5c
+	.4byte	0x11e69
 	.uleb128 0x54
-	.4byte	0x11e50
+	.4byte	0x11e5d
 	.uleb128 0x54
-	.4byte	0x11e44
+	.4byte	0x11e51
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x10a0
 	.uleb128 0x57
-	.4byte	0x11e68
+	.4byte	0x11e75
 	.uleb128 0x57
-	.4byte	0x11e72
+	.4byte	0x11e7f
 	.uleb128 0x57
-	.4byte	0x11e7e
+	.4byte	0x11e8b
 	.uleb128 0x57
-	.4byte	0x11e8a
+	.4byte	0x11e97
 	.uleb128 0x57
-	.4byte	0x11e96
+	.4byte	0x11ea3
 	.uleb128 0x57
-	.4byte	0x11ea2
+	.4byte	0x11eaf
 	.uleb128 0x73
-	.4byte	0x11eae
+	.4byte	0x11ebb
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12cbe
+	.4byte	0x12ccb
 	.8byte	.LBB1808
 	.8byte	.LBE1808-.LBB1808
 	.byte	0x1
-	.2byte	0x565
+	.2byte	0x566
 	.4byte	0x11a70
 	.uleb128 0x54
-	.4byte	0x12cd9
+	.4byte	0x12ce6
 	.uleb128 0x54
-	.4byte	0x12cce
+	.4byte	0x12cdb
 	.uleb128 0x56
 	.8byte	.LBB1809
 	.8byte	.LBE1809-.LBB1809
 	.uleb128 0x57
-	.4byte	0x12ce4
+	.4byte	0x12cf1
 	.uleb128 0x4e
-	.8byte	.LVL774
-	.4byte	0x13e06
+	.8byte	.LVL768
+	.4byte	0x13e13
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12964
+	.4byte	0x12971
 	.8byte	.LBB1818
 	.4byte	.Ldebug_ranges0+0x11a0
 	.byte	0x1
 	.2byte	0x4a7
 	.4byte	0x11b36
 	.uleb128 0x54
-	.4byte	0x129a1
+	.4byte	0x129ae
 	.uleb128 0x54
-	.4byte	0x129a1
+	.4byte	0x129ae
 	.uleb128 0x54
-	.4byte	0x129a1
+	.4byte	0x129ae
 	.uleb128 0x54
-	.4byte	0x129ad
+	.4byte	0x129ba
 	.uleb128 0x54
-	.4byte	0x12995
+	.4byte	0x129a2
 	.uleb128 0x54
-	.4byte	0x12989
+	.4byte	0x12996
 	.uleb128 0x54
-	.4byte	0x1297d
+	.4byte	0x1298a
 	.uleb128 0x54
-	.4byte	0x12971
+	.4byte	0x1297e
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x11a0
 	.uleb128 0x57
-	.4byte	0x129b9
+	.4byte	0x129c6
 	.uleb128 0x5f
-	.4byte	0x129c5
+	.4byte	0x129d2
 	.4byte	.LLST186
 	.uleb128 0x57
-	.4byte	0x129d1
+	.4byte	0x129de
 	.uleb128 0x5f
-	.4byte	0x129dd
+	.4byte	0x129ea
 	.4byte	.LLST187
 	.uleb128 0x5f
-	.4byte	0x129e9
+	.4byte	0x129f6
 	.4byte	.LLST188
 	.uleb128 0x57
-	.4byte	0x129f5
+	.4byte	0x12a02
 	.uleb128 0x57
-	.4byte	0x12a01
+	.4byte	0x12a0e
 	.uleb128 0x57
-	.4byte	0x12a0d
+	.4byte	0x12a1a
 	.uleb128 0x5f
-	.4byte	0x12a19
+	.4byte	0x12a26
 	.4byte	.LLST189
 	.uleb128 0x57
-	.4byte	0x12a25
+	.4byte	0x12a32
 	.uleb128 0x5f
-	.4byte	0x12a31
+	.4byte	0x12a3e
 	.4byte	.LLST190
 	.uleb128 0x60
-	.4byte	0x12a3d
+	.4byte	0x12a4a
 	.uleb128 0x1
-	.byte	0x60
+	.byte	0x5e
 	.uleb128 0x5f
-	.4byte	0x12a47
+	.4byte	0x12a54
 	.4byte	.LLST191
 	.uleb128 0x5f
-	.4byte	0x12a51
+	.4byte	0x12a5e
 	.4byte	.LLST192
 	.uleb128 0x5f
-	.4byte	0x12a5d
+	.4byte	0x12a6a
 	.4byte	.LLST193
 	.uleb128 0x5f
-	.4byte	0x12a69
+	.4byte	0x12a76
 	.4byte	.LLST194
 	.uleb128 0x5f
-	.4byte	0x12a75
+	.4byte	0x12a82
 	.4byte	.LLST195
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12cbe
+	.4byte	0x12ccb
 	.8byte	.LBB1830
 	.8byte	.LBE1830-.LBB1830
 	.byte	0x1
 	.2byte	0x450
 	.4byte	0x11b81
 	.uleb128 0x54
-	.4byte	0x12cd9
+	.4byte	0x12ce6
 	.uleb128 0x54
-	.4byte	0x12cce
+	.4byte	0x12cdb
 	.uleb128 0x56
 	.8byte	.LBB1831
 	.8byte	.LBE1831-.LBB1831
 	.uleb128 0x57
-	.4byte	0x12ce4
+	.4byte	0x12cf1
 	.uleb128 0x4e
-	.8byte	.LVL845
-	.4byte	0x13e06
+	.8byte	.LVL839
+	.4byte	0x13e13
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
+	.8byte	.LVL705
+	.4byte	0x141ff
+	.uleb128 0x4e
 	.8byte	.LVL706
-	.4byte	0x141f2
+	.4byte	0x1420b
 	.uleb128 0x4e
 	.8byte	.LVL707
-	.4byte	0x141fe
+	.4byte	0x141c3
 	.uleb128 0x4e
-	.8byte	.LVL708
-	.4byte	0x141b6
+	.8byte	.LVL726
+	.4byte	0x14217
+	.uleb128 0x4e
+	.8byte	.LVL727
+	.4byte	0x140da
 	.uleb128 0x4e
 	.8byte	.LVL728
-	.4byte	0x1420a
+	.4byte	0x1420b
 	.uleb128 0x4e
 	.8byte	.LVL729
-	.4byte	0x140cd
+	.4byte	0x141c3
 	.uleb128 0x4e
 	.8byte	.LVL730
-	.4byte	0x141fe
+	.4byte	0x12be6
 	.uleb128 0x4e
 	.8byte	.LVL731
-	.4byte	0x141b6
+	.4byte	0x14223
 	.uleb128 0x4e
 	.8byte	.LVL732
-	.4byte	0x12bd9
+	.4byte	0x13f9b
 	.uleb128 0x4e
 	.8byte	.LVL733
-	.4byte	0x14216
-	.uleb128 0x4e
-	.8byte	.LVL734
-	.4byte	0x13f8e
+	.4byte	0x12293
 	.uleb128 0x4e
-	.8byte	.LVL735
-	.4byte	0x12286
+	.8byte	.LVL736
+	.4byte	0x1422f
 	.uleb128 0x4e
-	.8byte	.LVL738
-	.4byte	0x14222
+	.8byte	.LVL737
+	.4byte	0x13f9b
 	.uleb128 0x4e
 	.8byte	.LVL739
-	.4byte	0x13f8e
+	.4byte	0x14078
+	.uleb128 0x4e
+	.8byte	.LVL740
+	.4byte	0x13f9b
 	.uleb128 0x4e
 	.8byte	.LVL741
-	.4byte	0x1406b
+	.4byte	0x14217
 	.uleb128 0x4e
 	.8byte	.LVL742
-	.4byte	0x13f8e
+	.4byte	0x140da
 	.uleb128 0x4e
 	.8byte	.LVL743
-	.4byte	0x1420a
+	.4byte	0x140da
 	.uleb128 0x4e
 	.8byte	.LVL744
-	.4byte	0x140cd
+	.4byte	0x14223
 	.uleb128 0x4e
 	.8byte	.LVL745
-	.4byte	0x140cd
-	.uleb128 0x4e
-	.8byte	.LVL746
-	.4byte	0x14216
+	.4byte	0x11ec4
 	.uleb128 0x4e
 	.8byte	.LVL747
-	.4byte	0x11eb7
+	.4byte	0x13f9b
 	.uleb128 0x4e
-	.8byte	.LVL749
-	.4byte	0x13f8e
+	.8byte	.LVL748
+	.4byte	0x12293
 	.uleb128 0x4e
-	.8byte	.LVL750
-	.4byte	0x12286
+	.8byte	.LVL751
+	.4byte	0x13f9b
 	.uleb128 0x4e
-	.8byte	.LVL753
-	.4byte	0x13f8e
+	.8byte	.LVL752
+	.4byte	0x140e4
 	.uleb128 0x4e
-	.8byte	.LVL754
-	.4byte	0x140d7
+	.8byte	.LVL753
+	.4byte	0x1420b
 	.uleb128 0x4e
 	.8byte	.LVL755
-	.4byte	0x141fe
+	.4byte	0x141c3
 	.uleb128 0x4e
-	.8byte	.LVL757
-	.4byte	0x141b6
+	.8byte	.LVL758
+	.4byte	0x13f9b
 	.uleb128 0x4e
 	.8byte	.LVL760
-	.4byte	0x13f8e
+	.4byte	0x1420b
 	.uleb128 0x4e
-	.8byte	.LVL763
-	.4byte	0x11eb7
+	.8byte	.LVL771
+	.4byte	0x11ec4
 	.uleb128 0x4e
-	.8byte	.LVL764
-	.4byte	0x14008
+	.8byte	.LVL772
+	.4byte	0x14015
 	.uleb128 0x4e
-	.8byte	.LVL766
-	.4byte	0x141fe
+	.8byte	.LVL773
+	.4byte	0x13f9b
 	.uleb128 0x4e
-	.8byte	.LVL777
-	.4byte	0x13f8e
+	.8byte	.LVL776
+	.4byte	0x13f9b
 	.uleb128 0x4e
-	.8byte	.LVL778
-	.4byte	0x12286
+	.8byte	.LVL777
+	.4byte	0x14015
 	.uleb128 0x4e
 	.8byte	.LVL779
-	.4byte	0x1406b
+	.4byte	0x13ed1
+	.uleb128 0x4e
+	.8byte	.LVL780
+	.4byte	0x11ec4
+	.uleb128 0x4e
+	.8byte	.LVL781
+	.4byte	0x13f9b
 	.uleb128 0x4e
 	.8byte	.LVL782
-	.4byte	0x1406b
+	.4byte	0x12293
 	.uleb128 0x4e
 	.8byte	.LVL783
-	.4byte	0x13ec4
+	.4byte	0x14078
 	.uleb128 0x4e
-	.8byte	.LVL785
-	.4byte	0x13f8e
+	.8byte	.LVL786
+	.4byte	0x14078
+	.uleb128 0x4e
+	.8byte	.LVL787
+	.4byte	0x140da
 	.uleb128 0x4e
 	.8byte	.LVL788
-	.4byte	0x13f8e
+	.4byte	0x140da
 	.uleb128 0x4e
 	.8byte	.LVL789
-	.4byte	0x14008
+	.4byte	0x140da
 	.uleb128 0x4e
-	.8byte	.LVL790
-	.4byte	0x140cd
+	.8byte	.LVL810
+	.4byte	0x13f9b
 	.uleb128 0x4e
-	.8byte	.LVL791
-	.4byte	0x140cd
+	.8byte	.LVL811
+	.4byte	0x1422f
 	.uleb128 0x4e
-	.8byte	.LVL792
-	.4byte	0x140cd
+	.8byte	.LVL812
+	.4byte	0x140e4
+	.uleb128 0x4e
+	.8byte	.LVL813
+	.4byte	0x140da
 	.uleb128 0x4e
 	.8byte	.LVL814
-	.4byte	0x13f8e
+	.4byte	0x12b1f
 	.uleb128 0x4e
 	.8byte	.LVL815
-	.4byte	0x14222
+	.4byte	0x13ed1
 	.uleb128 0x4e
 	.8byte	.LVL816
-	.4byte	0x140d7
-	.uleb128 0x4e
-	.8byte	.LVL824
-	.4byte	0x140cd
-	.uleb128 0x4e
-	.8byte	.LVL825
-	.4byte	0x12b12
+	.4byte	0x14015
 	.uleb128 0x4e
-	.8byte	.LVL826
-	.4byte	0x14008
+	.8byte	.LVL829
+	.4byte	0x11ec4
 	.uleb128 0x4e
-	.8byte	.LVL827
-	.4byte	0x13ec4
+	.8byte	.LVL837
+	.4byte	0x13f9b
 	.uleb128 0x4e
-	.8byte	.LVL840
-	.4byte	0x11eb7
+	.8byte	.LVL841
+	.4byte	0x13ed1
 	.uleb128 0x4e
 	.8byte	.LVL843
-	.4byte	0x13f8e
-	.uleb128 0x4e
-	.8byte	.LVL847
-	.4byte	0x13ec4
+	.4byte	0x13ed1
 	.uleb128 0x4e
-	.8byte	.LVL849
-	.4byte	0x13ec4
-	.uleb128 0x4e
-	.8byte	.LVL851
-	.4byte	0x14115
+	.8byte	.LVL845
+	.4byte	0x14122
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3077
@@ -42041,7 +42041,7 @@ __exitcall_ebc_exit:
 	.2byte	0x42c
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11eb7
+	.4byte	0x11ec4
 	.uleb128 0x64
 	.4byte	.LASF3078
 	.byte	0x1
@@ -42101,7 +42101,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2823-.LFB2823
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1200b
+	.4byte	0x12018
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
@@ -42127,65 +42127,65 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x64
 	.uleb128 0x53
-	.4byte	0x12f33
+	.4byte	0x12f40
 	.8byte	.LBB1204
 	.8byte	.LBE1204-.LBB1204
 	.byte	0x1
 	.2byte	0x3d9
-	.4byte	0x11f3a
+	.4byte	0x11f47
 	.uleb128 0x54
-	.4byte	0x12f4e
+	.4byte	0x12f5b
 	.uleb128 0x54
-	.4byte	0x12f43
+	.4byte	0x12f50
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL248
-	.4byte	0x13f8e
+	.4byte	0x13f9b
 	.uleb128 0x4e
 	.8byte	.LVL249
-	.4byte	0x1422e
+	.4byte	0x1423b
 	.uleb128 0x4e
 	.8byte	.LVL253
-	.4byte	0x14008
+	.4byte	0x14015
 	.uleb128 0x4e
 	.8byte	.LVL254
-	.4byte	0x14008
+	.4byte	0x13f9b
 	.uleb128 0x4e
 	.8byte	.LVL256
-	.4byte	0x1422e
+	.4byte	0x1423b
 	.uleb128 0x4e
 	.8byte	.LVL257
-	.4byte	0x14008
+	.4byte	0x14015
 	.uleb128 0x4e
 	.8byte	.LVL258
-	.4byte	0x1422e
+	.4byte	0x1423b
 	.uleb128 0x4e
 	.8byte	.LVL259
-	.4byte	0x1422e
+	.4byte	0x1423b
 	.uleb128 0x4e
 	.8byte	.LVL260
-	.4byte	0x1422e
+	.4byte	0x1423b
 	.uleb128 0x4e
 	.8byte	.LVL261
-	.4byte	0x1422e
+	.4byte	0x1423b
 	.uleb128 0x4e
 	.8byte	.LVL262
-	.4byte	0x1422e
+	.4byte	0x1423b
 	.uleb128 0x4e
 	.8byte	.LVL263
-	.4byte	0x1422e
+	.4byte	0x1423b
 	.uleb128 0x4e
 	.8byte	.LVL264
-	.4byte	0x1422e
+	.4byte	0x1423b
 	.uleb128 0x4e
 	.8byte	.LVL265
-	.4byte	0x1422e
+	.4byte	0x1423b
 	.uleb128 0x4e
 	.8byte	.LVL266
-	.4byte	0x14008
+	.4byte	0x13f9b
 	.uleb128 0x4e
 	.8byte	.LVL267
-	.4byte	0x14115
+	.4byte	0x14122
 	.byte	0
 	.uleb128 0x4d
 	.4byte	.LASF3089
@@ -42195,7 +42195,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x120c4
+	.4byte	0x120d1
 	.uleb128 0x46
 	.4byte	.LASF2957
 	.byte	0x1
@@ -42208,34 +42208,34 @@ __exitcall_ebc_exit:
 	.4byte	0xe13f
 	.uleb128 0x4e
 	.8byte	.LVL231
-	.4byte	0x14039
+	.4byte	0x14046
 	.uleb128 0x4e
 	.8byte	.LVL232
-	.4byte	0x13f8e
+	.4byte	0x13f9b
 	.uleb128 0x4e
 	.8byte	.LVL233
-	.4byte	0x140d7
+	.4byte	0x140e4
 	.uleb128 0x4e
 	.8byte	.LVL234
-	.4byte	0x140d7
+	.4byte	0x140e4
 	.uleb128 0x4e
 	.8byte	.LVL235
-	.4byte	0x13f8e
+	.4byte	0x13f9b
 	.uleb128 0x4e
 	.8byte	.LVL236
-	.4byte	0x13ff2
+	.4byte	0x13fff
 	.uleb128 0x4e
 	.8byte	.LVL237
-	.4byte	0x1406b
+	.4byte	0x14078
 	.uleb128 0x4e
 	.8byte	.LVL238
-	.4byte	0x140d7
+	.4byte	0x140e4
 	.uleb128 0x4e
 	.8byte	.LVL239
-	.4byte	0x140d7
+	.4byte	0x140e4
 	.uleb128 0x4e
 	.8byte	.LVL240
-	.4byte	0x14039
+	.4byte	0x14046
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3090
@@ -42246,7 +42246,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2821-.LFB2821
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12276
+	.4byte	0x12283
 	.uleb128 0x58
 	.4byte	.LASF793
 	.byte	0x1
@@ -42272,12 +42272,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe72c
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xb30
-	.4byte	0x121ae
+	.4byte	0x121bb
 	.uleb128 0x3f
 	.byte	0x8
 	.byte	0x1
 	.2byte	0x378
-	.4byte	0x12147
+	.4byte	0x12154
 	.uleb128 0x41
 	.4byte	.LASF3091
 	.byte	0x1
@@ -42287,29 +42287,29 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x1
 	.2byte	0x378
-	.4byte	0x12276
+	.4byte	0x12283
 	.byte	0
 	.uleb128 0x52
 	.string	"__u"
 	.byte	0x1
 	.2byte	0x378
-	.4byte	0x12125
+	.4byte	0x12132
 	.uleb128 0x5a
-	.4byte	0x13715
+	.4byte	0x13722
 	.8byte	.LBB1386
 	.4byte	.Ldebug_ranges0+0xb70
 	.byte	0x1
 	.2byte	0x378
-	.4byte	0x1217b
+	.4byte	0x12188
 	.uleb128 0x54
-	.4byte	0x13738
+	.4byte	0x13745
 	.uleb128 0x54
-	.4byte	0x1372c
+	.4byte	0x13739
 	.uleb128 0x54
-	.4byte	0x13722
+	.4byte	0x1372f
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13575
+	.4byte	0x13582
 	.8byte	.LBB1389
 	.8byte	.LBE1389-.LBB1389
 	.byte	0x1
@@ -42318,67 +42318,67 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1390
 	.8byte	.LBE1390-.LBB1390
 	.uleb128 0x60
-	.4byte	0x13585
+	.4byte	0x13592
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1340f
+	.4byte	0x1341c
 	.8byte	.LBB1394
 	.8byte	.LBE1394-.LBB1394
 	.byte	0x1
 	.2byte	0x3a4
-	.4byte	0x12200
+	.4byte	0x1220d
 	.uleb128 0x54
-	.4byte	0x13420
-	.uleb128 0x5c
 	.4byte	0x1342d
+	.uleb128 0x5c
+	.4byte	0x1343a
 	.8byte	.LBB1396
 	.8byte	.LBE1396-.LBB1396
 	.byte	0xd
 	.2byte	0x240
 	.uleb128 0x54
-	.4byte	0x13449
+	.4byte	0x13456
 	.uleb128 0x54
-	.4byte	0x1343e
+	.4byte	0x1344b
 	.uleb128 0x4e
 	.8byte	.LVL452
-	.4byte	0x1423a
+	.4byte	0x14247
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL446
-	.4byte	0x13d03
+	.4byte	0x13d10
 	.uleb128 0x4e
 	.8byte	.LVL447
-	.4byte	0x14247
+	.4byte	0x14254
 	.uleb128 0x4e
 	.8byte	.LVL448
-	.4byte	0x1416a
+	.4byte	0x14177
 	.uleb128 0x4e
 	.8byte	.LVL449
-	.4byte	0x14251
+	.4byte	0x1425e
 	.uleb128 0x4e
 	.8byte	.LVL450
-	.4byte	0x13d03
+	.4byte	0x13d10
 	.uleb128 0x4e
 	.8byte	.LVL451
-	.4byte	0x12809
+	.4byte	0x12816
 	.uleb128 0x4e
 	.8byte	.LVL453
-	.4byte	0x13d03
+	.4byte	0x13d10
 	.uleb128 0x4e
 	.8byte	.LVL454
-	.4byte	0x1261f
+	.4byte	0x1262c
 	.uleb128 0x4e
 	.8byte	.LVL455
-	.4byte	0x12435
+	.4byte	0x12442
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x12286
+	.4byte	0x12293
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
@@ -42391,7 +42391,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2820-.LFB2820
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x123d7
+	.4byte	0x123e4
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
@@ -42415,78 +42415,78 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	__func__.34740
 	.uleb128 0x53
-	.4byte	0x123d7
+	.4byte	0x123e4
 	.8byte	.LBB1379
 	.8byte	.LBE1379-.LBB1379
 	.byte	0x1
 	.2byte	0x354
-	.4byte	0x12313
+	.4byte	0x12320
 	.uleb128 0x54
-	.4byte	0x123f0
+	.4byte	0x123fd
 	.uleb128 0x54
-	.4byte	0x123e4
+	.4byte	0x123f1
 	.uleb128 0x4e
 	.8byte	.LVL427
-	.4byte	0x13d03
+	.4byte	0x13d10
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x123d7
+	.4byte	0x123e4
 	.8byte	.LBB1381
 	.8byte	.LBE1381-.LBB1381
 	.byte	0x1
 	.2byte	0x361
-	.4byte	0x12347
+	.4byte	0x12354
 	.uleb128 0x54
-	.4byte	0x123f0
+	.4byte	0x123fd
 	.uleb128 0x54
-	.4byte	0x123e4
+	.4byte	0x123f1
 	.uleb128 0x4e
 	.8byte	.LVL432
-	.4byte	0x13d03
+	.4byte	0x13d10
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x123d7
+	.4byte	0x123e4
 	.8byte	.LBB1383
 	.8byte	.LBE1383-.LBB1383
 	.byte	0x1
 	.2byte	0x33b
-	.4byte	0x1237b
+	.4byte	0x12388
 	.uleb128 0x54
-	.4byte	0x123f0
+	.4byte	0x123fd
 	.uleb128 0x54
-	.4byte	0x123e4
+	.4byte	0x123f1
 	.uleb128 0x4e
 	.8byte	.LVL437
-	.4byte	0x13d03
+	.4byte	0x13d10
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL426
-	.4byte	0x12435
+	.4byte	0x12442
 	.uleb128 0x4e
 	.8byte	.LVL428
-	.4byte	0x12435
+	.4byte	0x12442
 	.uleb128 0x4e
 	.8byte	.LVL431
-	.4byte	0x1261f
+	.4byte	0x1262c
 	.uleb128 0x4e
 	.8byte	.LVL433
-	.4byte	0x1261f
+	.4byte	0x1262c
 	.uleb128 0x4e
 	.8byte	.LVL436
-	.4byte	0x12809
+	.4byte	0x12816
 	.uleb128 0x4e
 	.8byte	.LVL438
-	.4byte	0x12809
+	.4byte	0x12816
 	.uleb128 0x4e
 	.8byte	.LVL441
-	.4byte	0x1425d
+	.4byte	0x1426a
 	.byte	0
 	.uleb128 0x65
 	.4byte	.LASF3094
 	.byte	0x1
 	.2byte	0x327
 	.byte	0x1
-	.4byte	0x123fd
+	.4byte	0x1240a
 	.uleb128 0x64
 	.4byte	.LASF2998
 	.byte	0x1
@@ -42503,7 +42503,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x31c
 	.byte	0x1
-	.4byte	0x1242f
+	.4byte	0x1243c
 	.uleb128 0x64
 	.4byte	.LASF2998
 	.byte	0x1
@@ -42518,7 +42518,7 @@ __exitcall_ebc_exit:
 	.string	"buf"
 	.byte	0x1
 	.2byte	0x31e
-	.4byte	0x1242f
+	.4byte	0x1243c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -42528,7 +42528,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x312
 	.byte	0x1
-	.4byte	0x12473
+	.4byte	0x12480
 	.uleb128 0x64
 	.4byte	.LASF3097
 	.byte	0x1
@@ -42555,7 +42555,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x2e8
 	.byte	0x1
-	.4byte	0x12549
+	.4byte	0x12556
 	.uleb128 0x64
 	.4byte	.LASF3097
 	.byte	0x1
@@ -42647,7 +42647,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x2bf
 	.byte	0x1
-	.4byte	0x1261f
+	.4byte	0x1262c
 	.uleb128 0x64
 	.4byte	.LASF3097
 	.byte	0x1
@@ -42739,7 +42739,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x2b4
 	.byte	0x1
-	.4byte	0x1265d
+	.4byte	0x1266a
 	.uleb128 0x64
 	.4byte	.LASF3097
 	.byte	0x1
@@ -42766,7 +42766,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x290
 	.byte	0x1
-	.4byte	0x12733
+	.4byte	0x12740
 	.uleb128 0x64
 	.4byte	.LASF3097
 	.byte	0x1
@@ -42858,7 +42858,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x269
 	.byte	0x1
-	.4byte	0x12809
+	.4byte	0x12816
 	.uleb128 0x64
 	.4byte	.LASF3097
 	.byte	0x1
@@ -42953,7 +42953,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2811-.LFB2811
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12964
+	.4byte	0x12971
 	.uleb128 0x6a
 	.4byte	.LASF3097
 	.byte	0x1
@@ -43101,7 +43101,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x164
 	.byte	0x1
-	.4byte	0x12a82
+	.4byte	0x12a8f
 	.uleb128 0x64
 	.4byte	.LASF3119
 	.byte	0x1
@@ -43226,7 +43226,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2809-.LFB2809
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12b12
+	.4byte	0x12b1f
 	.uleb128 0x58
 	.4byte	.LASF2273
 	.byte	0x1
@@ -43247,19 +43247,19 @@ __exitcall_ebc_exit:
 	.4byte	.LLST175
 	.uleb128 0x4e
 	.8byte	.LVL690
-	.4byte	0x1420a
+	.4byte	0x14217
 	.uleb128 0x4e
 	.8byte	.LVL692
-	.4byte	0x12bd9
+	.4byte	0x12be6
 	.uleb128 0x4e
 	.8byte	.LVL693
-	.4byte	0x14216
+	.4byte	0x14223
 	.uleb128 0x4e
 	.8byte	.LVL696
-	.4byte	0x12b12
+	.4byte	0x12b1f
 	.uleb128 0x4e
 	.8byte	.LVL697
-	.4byte	0x14216
+	.4byte	0x14223
 	.byte	0
 	.uleb128 0x74
 	.4byte	.LASF3130
@@ -43269,7 +43269,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2808-.LFB2808
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12bd9
+	.4byte	0x12be6
 	.uleb128 0x6a
 	.4byte	.LASF3119
 	.byte	0x1
@@ -43355,7 +43355,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2807-.LFB2807
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12cbe
+	.4byte	0x12ccb
 	.uleb128 0x76
 	.4byte	.LASF3119
 	.byte	0x1
@@ -43458,7 +43458,7 @@ __exitcall_ebc_exit:
 	.byte	0xb4
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x12cf0
+	.4byte	0x12cfd
 	.uleb128 0x7d
 	.string	"ebc"
 	.byte	0x1
@@ -43481,7 +43481,7 @@ __exitcall_ebc_exit:
 	.byte	0x86
 	.4byte	0x10b
 	.byte	0x3
-	.4byte	0x12d38
+	.4byte	0x12d45
 	.uleb128 0x7e
 	.4byte	.LASF2856
 	.byte	0x1
@@ -43514,7 +43514,7 @@ __exitcall_ebc_exit:
 	.byte	0x80
 	.4byte	0x10b
 	.byte	0x3
-	.4byte	0x12d6a
+	.4byte	0x12d77
 	.uleb128 0x7e
 	.4byte	.LASF2856
 	.byte	0x1
@@ -43536,7 +43536,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x12d8d
+	.4byte	0x12d9a
 	.uleb128 0x7e
 	.4byte	.LASF2932
 	.byte	0xb
@@ -43553,7 +43553,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x12dbb
+	.4byte	0x12dc8
 	.uleb128 0x7e
 	.4byte	.LASF2932
 	.byte	0xb
@@ -43575,7 +43575,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x12dff
+	.4byte	0x12e0c
 	.uleb128 0x7e
 	.4byte	.LASF2932
 	.byte	0xb
@@ -43607,7 +43607,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x12e17
+	.4byte	0x12e24
 	.uleb128 0x7e
 	.4byte	.LASF2932
 	.byte	0xb
@@ -43620,7 +43620,7 @@ __exitcall_ebc_exit:
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12e3e
+	.4byte	0x12e4b
 	.uleb128 0x7e
 	.4byte	.LASF2932
 	.byte	0xb
@@ -43637,7 +43637,7 @@ __exitcall_ebc_exit:
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x12e88
+	.4byte	0x12e95
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa
@@ -43670,7 +43670,7 @@ __exitcall_ebc_exit:
 	.2byte	0x108
 	.4byte	0xb7a4
 	.byte	0x3
-	.4byte	0x12ea6
+	.4byte	0x12eb3
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa
@@ -43683,7 +43683,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.4byte	0xb7a4
 	.byte	0x3
-	.4byte	0x12ec2
+	.4byte	0x12ecf
 	.uleb128 0x7d
 	.string	"bus"
 	.byte	0xc8
@@ -43696,7 +43696,7 @@ __exitcall_ebc_exit:
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12ede
+	.4byte	0x12eeb
 	.uleb128 0x7e
 	.4byte	.LASF3152
 	.byte	0xa
@@ -43708,7 +43708,7 @@ __exitcall_ebc_exit:
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x12f17
+	.4byte	0x12f24
 	.uleb128 0x7d
 	.string	"dev"
 	.byte	0xcb
@@ -43736,7 +43736,7 @@ __exitcall_ebc_exit:
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12f33
+	.4byte	0x12f40
 	.uleb128 0x7e
 	.4byte	.LASF2933
 	.byte	0x3
@@ -43749,7 +43749,7 @@ __exitcall_ebc_exit:
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12f58
+	.4byte	0x12f65
 	.uleb128 0x7e
 	.4byte	.LASF2933
 	.byte	0x3
@@ -43766,7 +43766,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x12f70
+	.4byte	0x12f7d
 	.uleb128 0x7e
 	.4byte	.LASF2933
 	.byte	0x3
@@ -43778,7 +43778,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x12f88
+	.4byte	0x12f95
 	.uleb128 0x7e
 	.4byte	.LASF2933
 	.byte	0x3
@@ -43790,7 +43790,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x12fa0
+	.4byte	0x12fad
 	.uleb128 0x7e
 	.4byte	.LASF2933
 	.byte	0x3
@@ -43802,7 +43802,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x12fb8
+	.4byte	0x12fc5
 	.uleb128 0x7e
 	.4byte	.LASF2933
 	.byte	0x3
@@ -43814,12 +43814,12 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x12fd0
+	.4byte	0x12fdd
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x12fd0
+	.4byte	0x12fdd
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -43829,24 +43829,24 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x12fee
+	.4byte	0x12ffb
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x12fd0
+	.4byte	0x12fdd
 	.byte	0
 	.uleb128 0x7f
 	.4byte	.LASF3163
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x13026
+	.4byte	0x13033
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x12fd0
+	.4byte	0x12fdd
 	.uleb128 0x7e
 	.4byte	.LASF192
 	.byte	0x4
@@ -43869,7 +43869,7 @@ __exitcall_ebc_exit:
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13055
+	.4byte	0x13062
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -43892,7 +43892,7 @@ __exitcall_ebc_exit:
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13084
+	.4byte	0x13091
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -43915,7 +43915,7 @@ __exitcall_ebc_exit:
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x130b3
+	.4byte	0x130c0
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -43938,7 +43938,7 @@ __exitcall_ebc_exit:
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x130ed
+	.4byte	0x130fa
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -43966,7 +43966,7 @@ __exitcall_ebc_exit:
 	.byte	0xf5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13121
+	.4byte	0x1312e
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0x6
@@ -43991,7 +43991,7 @@ __exitcall_ebc_exit:
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1316b
+	.4byte	0x13178
 	.uleb128 0x7e
 	.4byte	.LASF1149
 	.byte	0x6
@@ -44026,7 +44026,7 @@ __exitcall_ebc_exit:
 	.2byte	0x2e5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13195
+	.4byte	0x131a2
 	.uleb128 0x64
 	.4byte	.LASF986
 	.byte	0x12
@@ -44044,7 +44044,7 @@ __exitcall_ebc_exit:
 	.2byte	0x216
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x131cd
+	.4byte	0x131da
 	.uleb128 0x64
 	.4byte	.LASF986
 	.byte	0x12
@@ -44069,7 +44069,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1dd
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13203
+	.4byte	0x13210
 	.uleb128 0x64
 	.4byte	.LASF986
 	.byte	0x12
@@ -44092,7 +44092,7 @@ __exitcall_ebc_exit:
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x13221
+	.4byte	0x1322e
 	.uleb128 0x64
 	.4byte	.LASF986
 	.byte	0x12
@@ -44105,7 +44105,7 @@ __exitcall_ebc_exit:
 	.2byte	0x13d
 	.4byte	0xd788
 	.byte	0x3
-	.4byte	0x1323f
+	.4byte	0x1324c
 	.uleb128 0x64
 	.4byte	.LASF170
 	.byte	0x12
@@ -44117,7 +44117,7 @@ __exitcall_ebc_exit:
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x13262
+	.4byte	0x1326f
 	.uleb128 0x7e
 	.4byte	.LASF3025
 	.byte	0xbe
@@ -44135,12 +44135,12 @@ __exitcall_ebc_exit:
 	.byte	0xd6
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x1327e
+	.4byte	0x1328b
 	.uleb128 0x7e
 	.4byte	.LASF3025
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x1327e
+	.4byte	0x1328b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -44151,12 +44151,12 @@ __exitcall_ebc_exit:
 	.2byte	0x164
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x132a2
+	.4byte	0x132af
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x132a2
+	.4byte	0x132af
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -44167,7 +44167,7 @@ __exitcall_ebc_exit:
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x132dd
+	.4byte	0x132ea
 	.uleb128 0x63
 	.string	"np"
 	.byte	0xe
@@ -44190,7 +44190,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13329
+	.4byte	0x13336
 	.uleb128 0x63
 	.string	"np"
 	.byte	0xe
@@ -44222,7 +44222,7 @@ __exitcall_ebc_exit:
 	.byte	0xe
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x13341
+	.4byte	0x1334e
 	.uleb128 0x7e
 	.4byte	.LASF867
 	.byte	0xe
@@ -44234,7 +44234,7 @@ __exitcall_ebc_exit:
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x13367
+	.4byte	0x13374
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -44252,7 +44252,7 @@ __exitcall_ebc_exit:
 	.2byte	0x49b
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13385
+	.4byte	0x13392
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -44265,7 +44265,7 @@ __exitcall_ebc_exit:
 	.2byte	0x2c5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x133bb
+	.4byte	0x133c8
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -44288,7 +44288,7 @@ __exitcall_ebc_exit:
 	.byte	0xca
 	.4byte	0x33c
 	.byte	0x3
-	.4byte	0x133d7
+	.4byte	0x133e4
 	.uleb128 0x7d
 	.string	"res"
 	.byte	0xf
@@ -44301,7 +44301,7 @@ __exitcall_ebc_exit:
 	.byte	0x22
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x133f3
+	.4byte	0x13400
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xcc
@@ -44314,7 +44314,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1340f
+	.4byte	0x1341c
 	.uleb128 0x7e
 	.4byte	.LASF986
 	.byte	0xcd
@@ -44327,7 +44327,7 @@ __exitcall_ebc_exit:
 	.2byte	0x23e
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x1342d
+	.4byte	0x1343a
 	.uleb128 0x64
 	.4byte	.LASF2273
 	.byte	0xd
@@ -44340,7 +44340,7 @@ __exitcall_ebc_exit:
 	.2byte	0x203
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x13456
+	.4byte	0x13463
 	.uleb128 0x63
 	.string	"wq"
 	.byte	0xd
@@ -44357,7 +44357,7 @@ __exitcall_ebc_exit:
 	.byte	0xd
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x13479
+	.4byte	0x13486
 	.uleb128 0x7e
 	.4byte	.LASF2273
 	.byte	0xd
@@ -44375,7 +44375,7 @@ __exitcall_ebc_exit:
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13495
+	.4byte	0x134a2
 	.uleb128 0x63
 	.string	"m"
 	.byte	0x51
@@ -44388,7 +44388,7 @@ __exitcall_ebc_exit:
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x134b1
+	.4byte	0x134be
 	.uleb128 0x63
 	.string	"m"
 	.byte	0x51
@@ -44401,7 +44401,7 @@ __exitcall_ebc_exit:
 	.byte	0x97
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x134ed
+	.4byte	0x134fa
 	.uleb128 0x7e
 	.4byte	.LASF1149
 	.byte	0xca
@@ -44428,7 +44428,7 @@ __exitcall_ebc_exit:
 	.byte	0xca
 	.byte	0x91
 	.byte	0x3
-	.4byte	0x1351d
+	.4byte	0x1352a
 	.uleb128 0x7e
 	.4byte	.LASF986
 	.byte	0xca
@@ -44452,7 +44452,7 @@ __exitcall_ebc_exit:
 	.byte	0xca
 	.byte	0x80
 	.byte	0x3
-	.4byte	0x13549
+	.4byte	0x13556
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xca
@@ -44475,12 +44475,12 @@ __exitcall_ebc_exit:
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1356f
+	.4byte	0x1357c
 	.uleb128 0x7d
 	.string	"ti"
 	.byte	0xca
 	.byte	0x5f
-	.4byte	0x1356f
+	.4byte	0x1357c
 	.uleb128 0x7e
 	.4byte	.LASF3208
 	.byte	0xca
@@ -44496,7 +44496,7 @@ __exitcall_ebc_exit:
 	.byte	0xf
 	.4byte	0x2ef0
 	.byte	0x3
-	.4byte	0x13591
+	.4byte	0x1359e
 	.uleb128 0x78
 	.4byte	.LASF3210
 	.byte	0x5
@@ -44508,7 +44508,7 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x135d5
+	.4byte	0x135e2
 	.uleb128 0x7e
 	.4byte	.LASF961
 	.byte	0x10
@@ -44519,7 +44519,7 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x135c8
+	.4byte	0x135d5
 	.uleb128 0x22
 	.4byte	.LASF3091
 	.byte	0x10
@@ -44529,13 +44529,13 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x12276
+	.4byte	0x12283
 	.byte	0
 	.uleb128 0x7b
 	.string	"__u"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x135a9
+	.4byte	0x135b6
 	.byte	0
 	.byte	0
 	.uleb128 0x80
@@ -44549,7 +44549,7 @@ __exitcall_ebc_exit:
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x135f9
+	.4byte	0x13606
 	.uleb128 0x7d
 	.string	"n"
 	.byte	0xce
@@ -44562,7 +44562,7 @@ __exitcall_ebc_exit:
 	.byte	0x9a
 	.4byte	0xdd
 	.byte	0x3
-	.4byte	0x1362b
+	.4byte	0x13638
 	.uleb128 0x7e
 	.4byte	.LASF2455
 	.byte	0x8
@@ -44585,7 +44585,7 @@ __exitcall_ebc_exit:
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13651
+	.4byte	0x1365e
 	.uleb128 0x7d
 	.string	"nr"
 	.byte	0x7
@@ -44595,7 +44595,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF1149
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x13651
+	.4byte	0x1365e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -44605,7 +44605,7 @@ __exitcall_ebc_exit:
 	.byte	0x11
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x1368a
+	.4byte	0x13697
 	.uleb128 0x7d
 	.string	"i"
 	.byte	0x11
@@ -44615,7 +44615,7 @@ __exitcall_ebc_exit:
 	.string	"v"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x1368a
+	.4byte	0x13697
 	.uleb128 0x7b
 	.string	"w0"
 	.byte	0x11
@@ -44625,7 +44625,7 @@ __exitcall_ebc_exit:
 	.string	"x1"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x1368a
+	.4byte	0x13697
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -44636,7 +44636,7 @@ __exitcall_ebc_exit:
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x136aa
+	.4byte	0x136b7
 	.uleb128 0x7d
 	.string	"x"
 	.byte	0xcf
@@ -44649,7 +44649,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x136c6
+	.4byte	0x136d3
 	.uleb128 0x7e
 	.4byte	.LASF2488
 	.byte	0xd0
@@ -44661,12 +44661,12 @@ __exitcall_ebc_exit:
 	.byte	0xd1
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x136e7
+	.4byte	0x136f4
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd1
 	.byte	0xb
-	.4byte	0x136e7
+	.4byte	0x136f4
 	.uleb128 0x7e
 	.4byte	.LASF986
 	.byte	0xd1
@@ -44675,21 +44675,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x136ef
+	.4byte	0x136fc
 	.uleb128 0x81
 	.uleb128 0x3
-	.4byte	0x136ed
+	.4byte	0x136fa
 	.uleb128 0x7f
 	.4byte	.LASF3219
 	.byte	0xd1
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x13715
+	.4byte	0x13722
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd1
 	.byte	0x9
-	.4byte	0x136e7
+	.4byte	0x136f4
 	.uleb128 0x7e
 	.4byte	.LASF986
 	.byte	0xd1
@@ -44701,12 +44701,12 @@ __exitcall_ebc_exit:
 	.byte	0xc
 	.2byte	0x11a
 	.byte	0x3
-	.4byte	0x13745
+	.4byte	0x13752
 	.uleb128 0x63
 	.string	"p"
 	.byte	0xc
 	.2byte	0x11a
-	.4byte	0x13745
+	.4byte	0x13752
 	.uleb128 0x63
 	.string	"res"
 	.byte	0xc
@@ -44720,418 +44720,418 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x136ed
+	.4byte	0x136fa
 	.uleb128 0x82
-	.4byte	0x1261f
+	.4byte	0x1262c
 	.8byte	.LFB2814
 	.8byte	.LFE2814-.LFB2814
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x139ce
+	.4byte	0x139db
 	.uleb128 0x71
-	.4byte	0x1262c
+	.4byte	0x12639
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x12638
+	.4byte	0x12645
 	.4byte	.LLST95
 	.uleb128 0x6f
-	.4byte	0x12644
+	.4byte	0x12651
 	.4byte	.LLST96
 	.uleb128 0x6f
-	.4byte	0x12650
+	.4byte	0x1265d
 	.4byte	.LLST97
 	.uleb128 0x53
-	.4byte	0x1265d
+	.4byte	0x1266a
 	.8byte	.LBB1230
 	.8byte	.LBE1230-.LBB1230
 	.byte	0x1
 	.2byte	0x2bb
-	.4byte	0x13883
+	.4byte	0x13890
 	.uleb128 0x54
-	.4byte	0x1268e
+	.4byte	0x1269b
 	.uleb128 0x54
-	.4byte	0x1268e
+	.4byte	0x1269b
 	.uleb128 0x54
-	.4byte	0x1268e
+	.4byte	0x1269b
 	.uleb128 0x54
-	.4byte	0x12682
+	.4byte	0x1268f
 	.uleb128 0x54
-	.4byte	0x12676
+	.4byte	0x12683
 	.uleb128 0x54
-	.4byte	0x1266a
+	.4byte	0x12677
 	.uleb128 0x56
 	.8byte	.LBB1231
 	.8byte	.LBE1231-.LBB1231
 	.uleb128 0x57
-	.4byte	0x1269a
+	.4byte	0x126a7
 	.uleb128 0x5f
-	.4byte	0x126a6
+	.4byte	0x126b3
 	.4byte	.LLST98
 	.uleb128 0x57
-	.4byte	0x126b0
+	.4byte	0x126bd
 	.uleb128 0x5f
-	.4byte	0x126ba
+	.4byte	0x126c7
 	.4byte	.LLST99
 	.uleb128 0x5f
-	.4byte	0x126c6
+	.4byte	0x126d3
 	.4byte	.LLST100
 	.uleb128 0x5f
-	.4byte	0x126d2
+	.4byte	0x126df
 	.4byte	.LLST101
 	.uleb128 0x57
-	.4byte	0x126de
+	.4byte	0x126eb
 	.uleb128 0x60
-	.4byte	0x126ea
+	.4byte	0x126f7
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x60
-	.4byte	0x126f6
+	.4byte	0x12703
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5f
-	.4byte	0x12702
+	.4byte	0x1270f
 	.4byte	.LLST102
 	.uleb128 0x5f
-	.4byte	0x1270e
+	.4byte	0x1271b
 	.4byte	.LLST103
 	.uleb128 0x5f
-	.4byte	0x1271a
+	.4byte	0x12727
 	.4byte	.LLST104
 	.uleb128 0x57
-	.4byte	0x12726
+	.4byte	0x12733
 	.uleb128 0x5a
-	.4byte	0x12d38
+	.4byte	0x12d45
 	.8byte	.LBB1232
 	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
 	.2byte	0x2ae
-	.4byte	0x1385d
+	.4byte	0x1386a
 	.uleb128 0x54
-	.4byte	0x12d5e
+	.4byte	0x12d6b
 	.uleb128 0x54
-	.4byte	0x12d53
+	.4byte	0x12d60
 	.uleb128 0x54
-	.4byte	0x12d48
+	.4byte	0x12d55
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x12d38
+	.4byte	0x12d45
 	.8byte	.LBB1239
 	.4byte	.Ldebug_ranges0+0x730
 	.byte	0x1
 	.2byte	0x2af
 	.uleb128 0x54
-	.4byte	0x12d5e
+	.4byte	0x12d6b
 	.uleb128 0x54
-	.4byte	0x12d53
+	.4byte	0x12d60
 	.uleb128 0x54
-	.4byte	0x12d48
+	.4byte	0x12d55
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x780
 	.uleb128 0x54
-	.4byte	0x12650
+	.4byte	0x1265d
 	.uleb128 0x54
-	.4byte	0x12644
+	.4byte	0x12651
 	.uleb128 0x54
-	.4byte	0x12638
+	.4byte	0x12645
 	.uleb128 0x54
-	.4byte	0x1262c
+	.4byte	0x12639
 	.uleb128 0x5e
-	.4byte	0x12733
+	.4byte	0x12740
 	.8byte	.LBB1251
 	.4byte	.Ldebug_ranges0+0x780
 	.byte	0x1
 	.2byte	0x2b9
 	.uleb128 0x54
-	.4byte	0x12764
+	.4byte	0x12771
 	.uleb128 0x54
-	.4byte	0x12764
+	.4byte	0x12771
 	.uleb128 0x54
-	.4byte	0x12764
+	.4byte	0x12771
 	.uleb128 0x54
-	.4byte	0x12758
+	.4byte	0x12765
 	.uleb128 0x54
-	.4byte	0x1274c
+	.4byte	0x12759
 	.uleb128 0x54
-	.4byte	0x12740
+	.4byte	0x1274d
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x780
 	.uleb128 0x57
-	.4byte	0x12770
+	.4byte	0x1277d
 	.uleb128 0x60
-	.4byte	0x1277c
+	.4byte	0x12789
 	.uleb128 0x1
 	.byte	0x5c
 	.uleb128 0x57
-	.4byte	0x12786
+	.4byte	0x12793
 	.uleb128 0x60
-	.4byte	0x12790
+	.4byte	0x1279d
 	.uleb128 0x1
 	.byte	0x5f
 	.uleb128 0x57
-	.4byte	0x1279c
+	.4byte	0x127a9
 	.uleb128 0x5f
-	.4byte	0x127a8
+	.4byte	0x127b5
 	.4byte	.LLST105
 	.uleb128 0x5f
-	.4byte	0x127b4
+	.4byte	0x127c1
 	.4byte	.LLST106
 	.uleb128 0x60
-	.4byte	0x127c0
+	.4byte	0x127cd
 	.uleb128 0x1
 	.byte	0x59
 	.uleb128 0x60
-	.4byte	0x127cc
+	.4byte	0x127d9
 	.uleb128 0x1
 	.byte	0x5a
 	.uleb128 0x5f
-	.4byte	0x127d8
+	.4byte	0x127e5
 	.4byte	.LLST107
 	.uleb128 0x5f
-	.4byte	0x127e4
+	.4byte	0x127f1
 	.4byte	.LLST108
 	.uleb128 0x60
-	.4byte	0x127f0
+	.4byte	0x127fd
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x57
-	.4byte	0x127fc
+	.4byte	0x12809
 	.uleb128 0x5a
-	.4byte	0x12d38
+	.4byte	0x12d45
 	.8byte	.LBB1253
 	.4byte	.Ldebug_ranges0+0x7c0
 	.byte	0x1
 	.2byte	0x287
-	.4byte	0x13956
+	.4byte	0x13963
 	.uleb128 0x54
-	.4byte	0x12d5e
+	.4byte	0x12d6b
 	.uleb128 0x54
-	.4byte	0x12d53
+	.4byte	0x12d60
 	.uleb128 0x54
-	.4byte	0x12d48
+	.4byte	0x12d55
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12d38
+	.4byte	0x12d45
 	.8byte	.LBB1258
 	.4byte	.Ldebug_ranges0+0x810
 	.byte	0x1
 	.2byte	0x288
-	.4byte	0x1397e
+	.4byte	0x1398b
 	.uleb128 0x54
-	.4byte	0x12d5e
+	.4byte	0x12d6b
 	.uleb128 0x54
-	.4byte	0x12d53
+	.4byte	0x12d60
 	.uleb128 0x54
-	.4byte	0x12d48
+	.4byte	0x12d55
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12d38
+	.4byte	0x12d45
 	.8byte	.LBB1270
 	.4byte	.Ldebug_ranges0+0x880
 	.byte	0x1
 	.2byte	0x289
-	.4byte	0x139a6
+	.4byte	0x139b3
 	.uleb128 0x54
-	.4byte	0x12d5e
+	.4byte	0x12d6b
 	.uleb128 0x54
-	.4byte	0x12d53
+	.4byte	0x12d60
 	.uleb128 0x54
-	.4byte	0x12d48
+	.4byte	0x12d55
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x12d38
+	.4byte	0x12d45
 	.8byte	.LBB1282
 	.4byte	.Ldebug_ranges0+0x8f0
 	.byte	0x1
 	.2byte	0x28a
 	.uleb128 0x54
-	.4byte	0x12d5e
+	.4byte	0x12d6b
 	.uleb128 0x54
-	.4byte	0x12d53
+	.4byte	0x12d60
 	.uleb128 0x54
-	.4byte	0x12d48
+	.4byte	0x12d55
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x82
-	.4byte	0x12435
+	.4byte	0x12442
 	.8byte	.LFB2817
 	.8byte	.LFE2817-.LFB2817
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13d03
+	.4byte	0x13d10
 	.uleb128 0x71
-	.4byte	0x12442
+	.4byte	0x1244f
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x1244e
+	.4byte	0x1245b
 	.4byte	.LLST109
 	.uleb128 0x6f
-	.4byte	0x1245a
+	.4byte	0x12467
 	.4byte	.LLST110
 	.uleb128 0x6f
-	.4byte	0x12466
+	.4byte	0x12473
 	.4byte	.LLST111
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x940
-	.4byte	0x13be8
+	.4byte	0x13bf5
 	.uleb128 0x54
-	.4byte	0x12466
+	.4byte	0x12473
 	.uleb128 0x54
-	.4byte	0x1245a
+	.4byte	0x12467
 	.uleb128 0x54
-	.4byte	0x1244e
+	.4byte	0x1245b
 	.uleb128 0x54
-	.4byte	0x12442
+	.4byte	0x1244f
 	.uleb128 0x5e
-	.4byte	0x12473
+	.4byte	0x12480
 	.8byte	.LBB1318
 	.4byte	.Ldebug_ranges0+0x940
 	.byte	0x1
 	.2byte	0x317
 	.uleb128 0x54
-	.4byte	0x124a4
+	.4byte	0x124b1
 	.uleb128 0x54
-	.4byte	0x124a4
+	.4byte	0x124b1
 	.uleb128 0x54
-	.4byte	0x124a4
+	.4byte	0x124b1
 	.uleb128 0x54
-	.4byte	0x12498
+	.4byte	0x124a5
 	.uleb128 0x54
-	.4byte	0x1248c
+	.4byte	0x12499
 	.uleb128 0x54
-	.4byte	0x12480
+	.4byte	0x1248d
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x940
 	.uleb128 0x57
-	.4byte	0x124b0
+	.4byte	0x124bd
 	.uleb128 0x5f
-	.4byte	0x124bc
+	.4byte	0x124c9
 	.4byte	.LLST112
 	.uleb128 0x5f
-	.4byte	0x124c8
+	.4byte	0x124d5
 	.4byte	.LLST113
 	.uleb128 0x5f
-	.4byte	0x124d4
+	.4byte	0x124e1
 	.4byte	.LLST114
 	.uleb128 0x5f
-	.4byte	0x124e0
+	.4byte	0x124ed
 	.4byte	.LLST115
 	.uleb128 0x5f
-	.4byte	0x124ec
+	.4byte	0x124f9
 	.4byte	.LLST116
 	.uleb128 0x5f
-	.4byte	0x124f8
+	.4byte	0x12505
 	.4byte	.LLST117
 	.uleb128 0x5f
-	.4byte	0x12504
+	.4byte	0x12511
 	.4byte	.LLST118
 	.uleb128 0x5f
-	.4byte	0x12510
+	.4byte	0x1251d
 	.4byte	.LLST119
 	.uleb128 0x57
-	.4byte	0x1251a
+	.4byte	0x12527
 	.uleb128 0x5f
-	.4byte	0x12524
+	.4byte	0x12531
 	.4byte	.LLST120
 	.uleb128 0x5f
-	.4byte	0x12530
+	.4byte	0x1253d
 	.4byte	.LLST121
 	.uleb128 0x57
-	.4byte	0x1253c
+	.4byte	0x12549
 	.uleb128 0x5a
-	.4byte	0x12cf0
+	.4byte	0x12cfd
 	.8byte	.LBB1320
 	.4byte	.Ldebug_ranges0+0x970
 	.byte	0x1
 	.2byte	0x308
-	.4byte	0x13b05
+	.4byte	0x13b12
 	.uleb128 0x54
-	.4byte	0x12d16
+	.4byte	0x12d23
 	.uleb128 0x54
-	.4byte	0x12d0b
+	.4byte	0x12d18
 	.uleb128 0x54
-	.4byte	0x12d00
+	.4byte	0x12d0d
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x970
 	.uleb128 0x57
-	.4byte	0x12d21
+	.4byte	0x12d2e
 	.uleb128 0x5f
-	.4byte	0x12d2c
+	.4byte	0x12d39
 	.4byte	.LLST122
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12cf0
+	.4byte	0x12cfd
 	.8byte	.LBB1323
 	.8byte	.LBE1323-.LBB1323
 	.byte	0x1
 	.2byte	0x305
-	.4byte	0x13b51
+	.4byte	0x13b5e
 	.uleb128 0x54
-	.4byte	0x12d16
+	.4byte	0x12d23
 	.uleb128 0x54
-	.4byte	0x12d0b
+	.4byte	0x12d18
 	.uleb128 0x54
-	.4byte	0x12d00
+	.4byte	0x12d0d
 	.uleb128 0x56
 	.8byte	.LBB1324
 	.8byte	.LBE1324-.LBB1324
 	.uleb128 0x57
-	.4byte	0x12d21
+	.4byte	0x12d2e
 	.uleb128 0x5f
-	.4byte	0x12d2c
+	.4byte	0x12d39
 	.4byte	.LLST123
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12cf0
+	.4byte	0x12cfd
 	.8byte	.LBB1325
 	.8byte	.LBE1325-.LBB1325
 	.byte	0x1
 	.2byte	0x306
-	.4byte	0x13b9d
+	.4byte	0x13baa
 	.uleb128 0x54
-	.4byte	0x12d16
+	.4byte	0x12d23
 	.uleb128 0x54
-	.4byte	0x12d0b
+	.4byte	0x12d18
 	.uleb128 0x54
-	.4byte	0x12d00
+	.4byte	0x12d0d
 	.uleb128 0x56
 	.8byte	.LBB1326
 	.8byte	.LBE1326-.LBB1326
 	.uleb128 0x57
-	.4byte	0x12d21
+	.4byte	0x12d2e
 	.uleb128 0x5f
-	.4byte	0x12d2c
+	.4byte	0x12d39
 	.4byte	.LLST124
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12cf0
+	.4byte	0x12cfd
 	.8byte	.LBB1327
 	.8byte	.LBE1327-.LBB1327
 	.byte	0x1
 	.2byte	0x307
 	.uleb128 0x54
-	.4byte	0x12d16
+	.4byte	0x12d23
 	.uleb128 0x54
-	.4byte	0x12d0b
+	.4byte	0x12d18
 	.uleb128 0x54
-	.4byte	0x12d00
+	.4byte	0x12d0d
 	.uleb128 0x56
 	.8byte	.LBB1328
 	.8byte	.LBE1328-.LBB1328
 	.uleb128 0x57
-	.4byte	0x12d21
+	.4byte	0x12d2e
 	.uleb128 0x5f
-	.4byte	0x12d2c
+	.4byte	0x12d39
 	.4byte	.LLST125
 	.byte	0
 	.byte	0
@@ -45139,102 +45139,102 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12549
+	.4byte	0x12556
 	.8byte	.LBB1332
 	.8byte	.LBE1332-.LBB1332
 	.byte	0x1
 	.2byte	0x319
 	.uleb128 0x54
-	.4byte	0x1257a
+	.4byte	0x12587
 	.uleb128 0x54
-	.4byte	0x1257a
+	.4byte	0x12587
 	.uleb128 0x54
-	.4byte	0x1257a
+	.4byte	0x12587
 	.uleb128 0x54
-	.4byte	0x1256e
+	.4byte	0x1257b
 	.uleb128 0x54
-	.4byte	0x12562
+	.4byte	0x1256f
 	.uleb128 0x54
-	.4byte	0x12556
+	.4byte	0x12563
 	.uleb128 0x56
 	.8byte	.LBB1333
 	.8byte	.LBE1333-.LBB1333
 	.uleb128 0x57
-	.4byte	0x12586
+	.4byte	0x12593
 	.uleb128 0x57
-	.4byte	0x12592
+	.4byte	0x1259f
 	.uleb128 0x57
-	.4byte	0x1259e
+	.4byte	0x125ab
 	.uleb128 0x60
-	.4byte	0x125aa
+	.4byte	0x125b7
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x60
-	.4byte	0x125b6
+	.4byte	0x125c3
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5f
-	.4byte	0x125c2
+	.4byte	0x125cf
 	.4byte	.LLST126
 	.uleb128 0x5f
-	.4byte	0x125ce
+	.4byte	0x125db
 	.4byte	.LLST127
 	.uleb128 0x5f
-	.4byte	0x125da
+	.4byte	0x125e7
 	.4byte	.LLST128
 	.uleb128 0x5f
-	.4byte	0x125e6
+	.4byte	0x125f3
 	.4byte	.LLST129
 	.uleb128 0x57
-	.4byte	0x125f0
+	.4byte	0x125fd
 	.uleb128 0x5f
-	.4byte	0x125fa
+	.4byte	0x12607
 	.4byte	.LLST130
 	.uleb128 0x5f
-	.4byte	0x12606
+	.4byte	0x12613
 	.4byte	.LLST131
 	.uleb128 0x57
-	.4byte	0x12612
+	.4byte	0x1261f
 	.uleb128 0x5a
-	.4byte	0x12cf0
+	.4byte	0x12cfd
 	.8byte	.LBB1334
 	.4byte	.Ldebug_ranges0+0x9a0
 	.byte	0x1
 	.2byte	0x2dd
-	.4byte	0x13cc8
+	.4byte	0x13cd5
 	.uleb128 0x54
-	.4byte	0x12d16
+	.4byte	0x12d23
 	.uleb128 0x54
-	.4byte	0x12d0b
+	.4byte	0x12d18
 	.uleb128 0x54
-	.4byte	0x12d00
+	.4byte	0x12d0d
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x9a0
 	.uleb128 0x57
-	.4byte	0x12d21
+	.4byte	0x12d2e
 	.uleb128 0x5f
-	.4byte	0x12d2c
+	.4byte	0x12d39
 	.4byte	.LLST132
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x12cf0
+	.4byte	0x12cfd
 	.8byte	.LBB1341
 	.4byte	.Ldebug_ranges0+0xa10
 	.byte	0x1
 	.2byte	0x2dc
 	.uleb128 0x54
-	.4byte	0x12d16
+	.4byte	0x12d23
 	.uleb128 0x54
-	.4byte	0x12d0b
+	.4byte	0x12d18
 	.uleb128 0x54
-	.4byte	0x12d00
+	.4byte	0x12d0d
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xa10
 	.uleb128 0x57
-	.4byte	0x12d21
+	.4byte	0x12d2e
 	.uleb128 0x5f
-	.4byte	0x12d2c
+	.4byte	0x12d39
 	.4byte	.LLST133
 	.byte	0
 	.byte	0
@@ -45242,200 +45242,200 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x123fd
+	.4byte	0x1240a
 	.8byte	.LFB2859
 	.8byte	.LFE2859-.LFB2859
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13e06
+	.4byte	0x13e13
 	.uleb128 0x6f
-	.4byte	0x1240a
+	.4byte	0x12417
 	.4byte	.LLST134
 	.uleb128 0x54
-	.4byte	0x12416
+	.4byte	0x12423
 	.uleb128 0x57
-	.4byte	0x12422
+	.4byte	0x1242f
 	.uleb128 0x5a
-	.4byte	0x12e3e
+	.4byte	0x12e4b
 	.8byte	.LBB1357
 	.4byte	.Ldebug_ranges0+0xa70
 	.byte	0x1
 	.2byte	0x320
-	.4byte	0x13d84
+	.4byte	0x13d91
 	.uleb128 0x54
-	.4byte	0x12e6f
+	.4byte	0x12e7c
 	.uleb128 0x54
-	.4byte	0x12e63
+	.4byte	0x12e70
 	.uleb128 0x54
-	.4byte	0x12e57
+	.4byte	0x12e64
 	.uleb128 0x54
-	.4byte	0x12e4b
+	.4byte	0x12e58
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xa70
 	.uleb128 0x57
-	.4byte	0x12e7b
-	.uleb128 0x5e
 	.4byte	0x12e88
+	.uleb128 0x5e
+	.4byte	0x12e95
 	.8byte	.LBB1359
 	.4byte	.Ldebug_ranges0+0xac0
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x54
-	.4byte	0x12e99
+	.4byte	0x12ea6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12dbb
+	.4byte	0x12dc8
 	.8byte	.LBB1368
 	.4byte	.Ldebug_ranges0+0xaf0
 	.byte	0x1
 	.2byte	0x321
-	.4byte	0x13db6
+	.4byte	0x13dc3
 	.uleb128 0x54
-	.4byte	0x12df3
+	.4byte	0x12e00
 	.uleb128 0x54
-	.4byte	0x12de8
+	.4byte	0x12df5
 	.uleb128 0x54
-	.4byte	0x12ddd
+	.4byte	0x12dea
 	.uleb128 0x54
-	.4byte	0x12dd2
+	.4byte	0x12ddf
 	.uleb128 0x54
-	.4byte	0x12dc7
+	.4byte	0x12dd4
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12d8d
+	.4byte	0x12d9a
 	.8byte	.LBB1374
 	.8byte	.LBE1374-.LBB1374
 	.byte	0x1
 	.2byte	0x322
-	.4byte	0x13de2
+	.4byte	0x13def
 	.uleb128 0x54
-	.4byte	0x12daf
+	.4byte	0x12dbc
 	.uleb128 0x54
-	.4byte	0x12da4
+	.4byte	0x12db1
 	.uleb128 0x54
-	.4byte	0x12d99
+	.4byte	0x12da6
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12d6a
+	.4byte	0x12d77
 	.8byte	.LBB1376
 	.8byte	.LBE1376-.LBB1376
 	.byte	0x1
 	.2byte	0x323
 	.uleb128 0x54
-	.4byte	0x12d81
+	.4byte	0x12d8e
 	.uleb128 0x54
-	.4byte	0x12d76
+	.4byte	0x12d83
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12cbe
+	.4byte	0x12ccb
 	.8byte	.LFB2860
 	.8byte	.LFE2860-.LFB2860
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13ec4
+	.4byte	0x13ed1
 	.uleb128 0x6f
-	.4byte	0x12cce
+	.4byte	0x12cdb
 	.4byte	.LLST137
 	.uleb128 0x6f
-	.4byte	0x12cd9
+	.4byte	0x12ce6
 	.4byte	.LLST138
 	.uleb128 0x57
-	.4byte	0x12ce4
+	.4byte	0x12cf1
 	.uleb128 0x70
-	.4byte	0x12dff
+	.4byte	0x12e0c
 	.8byte	.LBB1398
 	.8byte	.LBE1398-.LBB1398
 	.byte	0x1
 	.byte	0xc6
-	.4byte	0x13e5a
+	.4byte	0x13e67
 	.uleb128 0x54
-	.4byte	0x12e0b
+	.4byte	0x12e18
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12f88
+	.4byte	0x12f95
 	.8byte	.LBB1400
 	.8byte	.LBE1400-.LBB1400
 	.byte	0x1
 	.byte	0xc7
-	.4byte	0x13e7b
+	.4byte	0x13e88
 	.uleb128 0x54
-	.4byte	0x12f94
+	.4byte	0x12fa1
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12fb8
+	.4byte	0x12fc5
 	.8byte	.LBB1402
 	.8byte	.LBE1402-.LBB1402
 	.byte	0x1
 	.byte	0xca
-	.4byte	0x13ea9
+	.4byte	0x13eb6
 	.uleb128 0x54
-	.4byte	0x12fc4
+	.4byte	0x12fd1
 	.uleb128 0x4e
 	.8byte	.LVL464
-	.4byte	0x141e6
+	.4byte	0x141f3
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL461
-	.4byte	0x13f8e
+	.4byte	0x13f9b
 	.uleb128 0x4e
 	.8byte	.LVL465
-	.4byte	0x13f8e
+	.4byte	0x13f9b
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12cbe
+	.4byte	0x12ccb
 	.8byte	.LFB2864
 	.8byte	.LFE2864-.LFB2864
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13f76
+	.4byte	0x13f83
 	.uleb128 0x6f
-	.4byte	0x12cce
+	.4byte	0x12cdb
 	.4byte	.LLST162
 	.uleb128 0x57
-	.4byte	0x12ce4
+	.4byte	0x12cf1
 	.uleb128 0x54
-	.4byte	0x12cd9
+	.4byte	0x12ce6
 	.uleb128 0x70
-	.4byte	0x12fa0
+	.4byte	0x12fad
 	.8byte	.LBB1762
 	.8byte	.LBE1762-.LBB1762
 	.byte	0x1
 	.byte	0xbf
-	.4byte	0x13f14
+	.4byte	0x13f21
 	.uleb128 0x54
-	.4byte	0x12fac
+	.4byte	0x12fb9
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12e17
+	.4byte	0x12e24
 	.8byte	.LBB1764
 	.8byte	.LBE1764-.LBB1764
 	.byte	0x1
 	.byte	0xc0
-	.4byte	0x13f3a
+	.4byte	0x13f47
 	.uleb128 0x54
-	.4byte	0x12e32
+	.4byte	0x12e3f
 	.uleb128 0x54
-	.4byte	0x12e27
+	.4byte	0x12e34
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12fd6
+	.4byte	0x12fe3
 	.8byte	.LBB1766
 	.8byte	.LBE1766-.LBB1766
 	.byte	0x1
 	.byte	0xbc
-	.4byte	0x13f68
+	.4byte	0x13f75
 	.uleb128 0x54
-	.4byte	0x12fe2
+	.4byte	0x12fef
 	.uleb128 0x4e
 	.8byte	.LVL653
-	.4byte	0x14269
+	.4byte	0x14276
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL650
-	.4byte	0x13f8e
+	.4byte	0x13f9b
 	.byte	0
 	.uleb128 0x84
 	.4byte	.LASF3221
@@ -48968,514 +48968,502 @@ __exitcall_ebc_exit:
 	.8byte	0
 .LLST176:
 	.8byte	.LVL699
-	.8byte	.LVL700
+	.8byte	.LVL701
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST177:
-	.8byte	.LVL701
-	.8byte	.LVL710
+	.8byte	.LVL700
+	.8byte	.LVL708
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL714
+	.8byte	.LVL712
 	.8byte	.LFE2825
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST178:
-	.8byte	.LVL704
-	.8byte	.LVL709
+	.8byte	.LVL703
+	.8byte	.LVL711
 	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL714
-	.8byte	.LVL715
+	.byte	0x6c
+	.8byte	.LVL712
+	.8byte	.LVL713
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL715
-	.8byte	.LVL725
+	.8byte	.LVL713
+	.8byte	.LVL723
 	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL725
-	.8byte	.LVL726
+	.byte	0x6c
+	.8byte	.LVL723
+	.8byte	.LVL724
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL726
-	.8byte	.LVL736
+	.8byte	.LVL724
+	.8byte	.LVL734
 	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL736
-	.8byte	.LVL737
+	.byte	0x6c
+	.8byte	.LVL734
+	.8byte	.LVL735
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL737
-	.8byte	.LVL767
+	.8byte	.LVL735
+	.8byte	.LVL761
 	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL767
-	.8byte	.LVL768
+	.byte	0x6c
+	.8byte	.LVL761
+	.8byte	.LVL762
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL768
-	.8byte	.LVL811
+	.8byte	.LVL762
+	.8byte	.LVL807
 	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL811
-	.8byte	.LVL812
+	.byte	0x6c
+	.8byte	.LVL807
+	.8byte	.LVL808
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL812
-	.8byte	.LVL850
+	.8byte	.LVL808
+	.8byte	.LFE2825
 	.2byte	0x1
-	.byte	0x67
+	.byte	0x6c
 	.8byte	0
 	.8byte	0
 .LLST179:
-	.8byte	.LVL703
-	.8byte	.LVL711
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL714
-	.8byte	.LVL775
+	.8byte	.LVL757
+	.8byte	.LVL758-1
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL775
-	.8byte	.LVL776
+	.byte	0x57
+	.8byte	.LVL770
+	.8byte	.LVL771-1
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL776
-	.8byte	.LFE2825
+	.byte	0x57
+	.8byte	.LVL778
+	.8byte	.LVL779-1
 	.2byte	0x1
-	.byte	0x65
+	.byte	0x57
 	.8byte	0
 	.8byte	0
 .LLST180:
 	.8byte	.LVL702
-	.8byte	.LVL712
+	.8byte	.LVL709
 	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL714
+	.byte	0x67
+	.8byte	.LVL712
 	.8byte	.LFE2825
 	.2byte	0x1
-	.byte	0x68
+	.byte	0x67
 	.8byte	0
 	.8byte	0
 .LLST181:
-	.8byte	.LVL704
-	.8byte	.LVL713
+	.8byte	.LVL703
+	.8byte	.LVL710
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL714
-	.8byte	.LVL798
+	.8byte	.LVL712
+	.8byte	.LVL795
 	.2byte	0x1
 	.byte	0x6a
+	.8byte	.LVL799
 	.8byte	.LVL802
-	.8byte	.LVL805
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL811
-	.8byte	.LVL828
+	.8byte	.LVL807
+	.8byte	.LVL817
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL839
-	.8byte	.LVL841
+	.8byte	.LVL828
+	.8byte	.LVL830
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL842
+	.8byte	.LVL831
 	.8byte	.LFE2825
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST185:
-	.8byte	.LVL786
-	.8byte	.LVL787
+.LLST184:
+	.8byte	.LVL774
+	.8byte	.LVL775
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL830
-	.8byte	.LVL831-1
+	.8byte	.LVL819
+	.8byte	.LVL820-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST184:
-	.8byte	.LVL780
-	.8byte	.LVL781
+.LLST185:
+	.8byte	.LVL784
+	.8byte	.LVL785
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL819
-	.8byte	.LVL820-1
+	.8byte	.LVL833
+	.8byte	.LVL834-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST183:
-	.8byte	.LVL716
-	.8byte	.LVL717
+	.8byte	.LVL714
+	.8byte	.LVL715
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL770
-	.8byte	.LVL771-1
+	.8byte	.LVL764
+	.8byte	.LVL765-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST182:
+	.8byte	.LVL703
 	.8byte	.LVL704
-	.8byte	.LVL705
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL718
-	.8byte	.LVL719
+	.8byte	.LVL716
+	.8byte	.LVL717
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL721
-	.8byte	.LVL722-1
+	.8byte	.LVL719
+	.8byte	.LVL720-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST186:
-	.8byte	.LVL751
-	.8byte	.LVL753-1
+	.8byte	.LVL749
+	.8byte	.LVL751-1
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL765
-	.8byte	.LVL766-1
+	.byte	0x60
+	.8byte	.LVL759
+	.8byte	.LVL760-1
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL793
-	.8byte	.LVL811
+	.byte	0x60
+	.8byte	.LVL790
+	.8byte	.LVL807
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL812
-	.8byte	.LVL814-1
+	.byte	0x60
+	.8byte	.LVL808
+	.8byte	.LVL810-1
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL834
-	.8byte	.LVL840-1
+	.byte	0x60
+	.8byte	.LVL823
+	.8byte	.LVL829-1
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL841
-	.8byte	.LVL842
+	.byte	0x60
+	.8byte	.LVL830
+	.8byte	.LVL831
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL846
-	.8byte	.LVL847-1
+	.byte	0x60
+	.8byte	.LVL840
+	.8byte	.LVL841-1
 	.2byte	0x1
-	.byte	0x62
+	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST187:
+	.8byte	.LVL795
 	.8byte	.LVL798
-	.8byte	.LVL801
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL806
-	.8byte	.LVL811
+	.byte	0x51
+	.8byte	.LVL804
+	.8byte	.LVL807
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL834
-	.8byte	.LVL837
+	.byte	0x51
+	.8byte	.LVL823
+	.8byte	.LVL826
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL841
-	.8byte	.LVL842
+	.byte	0x51
+	.8byte	.LVL830
+	.8byte	.LVL831
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST188:
-	.8byte	.LVL704
-	.8byte	.LVL713
+	.8byte	.LVL703
+	.8byte	.LVL710
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL714
-	.8byte	.LVL759
+	.byte	0x69
+	.8byte	.LVL712
+	.8byte	.LVL725
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL761
-	.8byte	.LVL762
+	.byte	0x69
+	.8byte	.LVL734
+	.8byte	.LVL738
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL765
-	.8byte	.LVL775
+	.byte	0x69
+	.8byte	.LVL746
+	.8byte	.LVL750
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL784
-	.8byte	.LVL798
+	.byte	0x69
+	.8byte	.LVL754
+	.8byte	.LVL756
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL800
-	.8byte	.LVL805
+	.byte	0x69
+	.8byte	.LVL759
+	.8byte	.LVL769
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL811
-	.8byte	.LVL817
+	.byte	0x69
+	.8byte	.LVL794
+	.8byte	.LVL795
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL823
-	.8byte	.LVL828
+	.byte	0x69
+	.8byte	.LVL797
+	.8byte	.LVL803
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL836
-	.8byte	.LVL841
+	.byte	0x69
+	.8byte	.LVL807
+	.8byte	.LVL809
 	.2byte	0x1
-	.byte	0x6a
+	.byte	0x69
+	.8byte	.LVL825
+	.8byte	.LVL830
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL838
 	.8byte	.LVL842
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL844
 	.8byte	.LFE2825
 	.2byte	0x1
-	.byte	0x6a
+	.byte	0x69
 	.8byte	0
 	.8byte	0
 .LLST189:
-	.8byte	.LVL751
-	.8byte	.LVL753-1
+	.8byte	.LVL749
+	.8byte	.LVL751-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL765
-	.8byte	.LVL766-1
+	.8byte	.LVL759
+	.8byte	.LVL760-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL797
-	.8byte	.LVL799
+	.8byte	.LVL794
+	.8byte	.LVL796
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL800
-	.8byte	.LVL811
+	.8byte	.LVL797
+	.8byte	.LVL807
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL812
-	.8byte	.LVL814-1
+	.8byte	.LVL808
+	.8byte	.LVL810-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL834
-	.8byte	.LVL835
+	.8byte	.LVL823
+	.8byte	.LVL824
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL839
-	.8byte	.LVL840-1
+	.8byte	.LVL828
+	.8byte	.LVL829-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL841
-	.8byte	.LVL842
+	.8byte	.LVL830
+	.8byte	.LVL831
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL846
-	.8byte	.LVL847-1
+	.8byte	.LVL840
+	.8byte	.LVL841-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST190:
-	.8byte	.LVL751
-	.8byte	.LVL753-1
+	.8byte	.LVL749
+	.8byte	.LVL751-1
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL765
-	.8byte	.LVL766-1
+	.byte	0x62
+	.8byte	.LVL759
+	.8byte	.LVL760-1
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL797
+	.byte	0x62
+	.8byte	.LVL794
+	.8byte	.LVL805
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL806
 	.8byte	.LVL807
 	.2byte	0x1
-	.byte	0x53
+	.byte	0x62
 	.8byte	.LVL808
-	.8byte	.LVL809
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL810
-	.8byte	.LVL811
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL812
-	.8byte	.LVL814-1
+	.8byte	.LVL810-1
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL834
-	.8byte	.LVL840-1
+	.byte	0x62
+	.8byte	.LVL823
+	.8byte	.LVL829-1
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL841
-	.8byte	.LVL842
+	.byte	0x62
+	.8byte	.LVL830
+	.8byte	.LVL831
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL846
-	.8byte	.LVL847-1
+	.byte	0x62
+	.8byte	.LVL840
+	.8byte	.LVL841-1
 	.2byte	0x1
-	.byte	0x53
+	.byte	0x62
 	.8byte	0
 	.8byte	0
 .LLST191:
-	.8byte	.LVL751
-	.8byte	.LVL753-1
+	.8byte	.LVL749
+	.8byte	.LVL751-1
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL765
-	.8byte	.LVL766-1
+	.byte	0x54
+	.8byte	.LVL759
+	.8byte	.LVL760-1
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL797
+	.byte	0x54
+	.8byte	.LVL794
+	.8byte	.LVL795
+	.2byte	0x1
+	.byte	0x54
 	.8byte	.LVL798
+	.8byte	.LVL800
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x54
+	.8byte	.LVL800
 	.8byte	.LVL801
-	.8byte	.LVL803
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL803
-	.8byte	.LVL804
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL812
-	.8byte	.LVL814-1
+	.byte	0x50
+	.8byte	.LVL808
+	.8byte	.LVL810-1
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL838
-	.8byte	.LVL840-1
+	.byte	0x54
+	.8byte	.LVL827
+	.8byte	.LVL829-1
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL846
-	.8byte	.LVL847-1
+	.byte	0x54
+	.8byte	.LVL840
+	.8byte	.LVL841-1
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST192:
-	.8byte	.LVL751
-	.8byte	.LVL753-1
+	.8byte	.LVL749
+	.8byte	.LVL751-1
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL765
-	.8byte	.LVL766-1
+	.byte	0x5f
+	.8byte	.LVL759
+	.8byte	.LVL760-1
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL796
-	.8byte	.LVL811
+	.byte	0x5f
+	.8byte	.LVL793
+	.8byte	.LVL807
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL812
-	.8byte	.LVL814-1
+	.byte	0x5f
+	.8byte	.LVL808
+	.8byte	.LVL810-1
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL834
-	.8byte	.LVL840-1
+	.byte	0x5f
+	.8byte	.LVL823
+	.8byte	.LVL829-1
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL841
-	.8byte	.LVL842
+	.byte	0x5f
+	.8byte	.LVL830
+	.8byte	.LVL831
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL846
-	.8byte	.LVL847-1
+	.byte	0x5f
+	.8byte	.LVL840
+	.8byte	.LVL841-1
 	.2byte	0x1
-	.byte	0x61
+	.byte	0x5f
 	.8byte	0
 	.8byte	0
 .LLST193:
-	.8byte	.LVL751
-	.8byte	.LVL753-1
+	.8byte	.LVL749
+	.8byte	.LVL751-1
 	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL765
-	.8byte	.LVL766-1
+	.byte	0x58
+	.8byte	.LVL759
+	.8byte	.LVL760-1
 	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL794
-	.8byte	.LVL811
+	.byte	0x58
+	.8byte	.LVL791
+	.8byte	.LVL807
 	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL812
-	.8byte	.LVL814-1
+	.byte	0x58
+	.8byte	.LVL808
+	.8byte	.LVL810-1
 	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL834
-	.8byte	.LVL840-1
+	.byte	0x58
+	.8byte	.LVL823
+	.8byte	.LVL829-1
 	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL841
-	.8byte	.LVL842
+	.byte	0x58
+	.8byte	.LVL830
+	.8byte	.LVL831
 	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL846
-	.8byte	.LVL847-1
+	.byte	0x58
+	.8byte	.LVL840
+	.8byte	.LVL841-1
 	.2byte	0x1
-	.byte	0x5a
+	.byte	0x58
 	.8byte	0
 	.8byte	0
 .LLST194:
-	.8byte	.LVL751
-	.8byte	.LVL753-1
+	.8byte	.LVL749
+	.8byte	.LVL751-1
 	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL765
-	.8byte	.LVL766-1
+	.byte	0x5e
+	.8byte	.LVL759
+	.8byte	.LVL760-1
 	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL796
-	.8byte	.LVL811
+	.byte	0x5e
+	.8byte	.LVL793
+	.8byte	.LVL807
 	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL812
-	.8byte	.LVL814-1
+	.byte	0x5e
+	.8byte	.LVL808
+	.8byte	.LVL810-1
 	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL834
-	.8byte	.LVL840-1
+	.byte	0x5e
+	.8byte	.LVL823
+	.8byte	.LVL829-1
 	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL841
-	.8byte	.LVL842
+	.byte	0x5e
+	.8byte	.LVL830
+	.8byte	.LVL831
 	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL846
-	.8byte	.LVL847-1
+	.byte	0x5e
+	.8byte	.LVL840
+	.8byte	.LVL841-1
 	.2byte	0x1
-	.byte	0x60
+	.byte	0x5e
 	.8byte	0
 	.8byte	0
 .LLST195:
-	.8byte	.LVL704
-	.8byte	.LVL713
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL714
-	.8byte	.LVL727
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL736
-	.8byte	.LVL740
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL748
-	.8byte	.LVL752
+	.8byte	.LVL749
+	.8byte	.LVL751-1
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL756
-	.8byte	.LVL758
+	.byte	0x61
+	.8byte	.LVL759
+	.8byte	.LVL760-1
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL765
-	.8byte	.LVL775
+	.byte	0x61
+	.8byte	.LVL792
+	.8byte	.LVL807
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL795
-	.8byte	.LVL813
+	.byte	0x61
+	.8byte	.LVL808
+	.8byte	.LVL810-1
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL834
-	.8byte	.LVL842
+	.byte	0x61
+	.8byte	.LVL823
+	.8byte	.LVL829-1
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL844
-	.8byte	.LVL848
+	.byte	0x61
+	.8byte	.LVL830
+	.8byte	.LVL831
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL850
-	.8byte	.LFE2825
+	.byte	0x61
+	.8byte	.LVL840
+	.8byte	.LVL841-1
 	.2byte	0x1
-	.byte	0x69
+	.byte	0x61
 	.8byte	0
 	.8byte	0
 .LLST69:
@@ -50880,8 +50868,8 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	.LBB1814
 	.8byte	.LBE1814
-	.8byte	.LBB1827
-	.8byte	.LBE1827
+	.8byte	.LBB1829
+	.8byte	.LBE1829
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1816
@@ -50896,10 +50884,10 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1824
 	.8byte	.LBB1825
 	.8byte	.LBE1825
+	.8byte	.LBB1827
+	.8byte	.LBE1827
 	.8byte	.LBB1828
 	.8byte	.LBE1828
-	.8byte	.LBB1829
-	.8byte	.LBE1829
 	.8byte	0
 	.8byte	0
 	.8byte	.Ltext0
@@ -51256,7 +51244,7 @@ __exitcall_ebc_exit:
 .LASF3121:
 	.string	"image_bg"
 .LASF3017:
-	.string	"__addressable_ebc_init2261"
+	.string	"__addressable_ebc_init2262"
 .LASF2857:
 	.string	"ebc_buf_status"
 .LASF1806:

commit 94e452359f84fe4b47fd4f81f9709b0c69c37d39
Author: Elaine Zhang <zhangqing@rock-chips.com>
Date:   Tue Jun 8 11:07:49 2021 +0800

    clk: rockchip: rk3568: add CLK_GATE_NO_SET_RATE flag for some clks
    
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    Change-Id: I222f9038a96071b6e12601e5fe91779721e19a46

diff --git a/drivers/clk/rockchip/clk-rk3568.c b/drivers/clk/rockchip/clk-rk3568.c
index eb40d6fd915f..5afbe2ba5692 100644
--- a/drivers/clk/rockchip/clk-rk3568.c
+++ b/drivers/clk/rockchip/clk-rk3568.c
@@ -1161,35 +1161,35 @@ static struct rockchip_clk_branch rk3568_clk_branches[] __initdata = {
 			RK3568_CLKSEL_CON(43), 12, 4, DFLAGS,
 			RK3568_CLKGATE_CON(22), 12, GFLAGS),
 	GATE(ACLK_RGA, "aclk_rga", "aclk_rga_pre", 0,
-			RK3568_CLKGATE_CON(23), 4, GFLAGS),
+			RK3568_CLKGATE_CON(23), 4, GFLAGS | CLK_GATE_NO_SET_RATE),
 	GATE(HCLK_RGA, "hclk_rga", "hclk_rga_pre", 0,
-			RK3568_CLKGATE_CON(23), 5, GFLAGS),
+			RK3568_CLKGATE_CON(23), 5, GFLAGS | CLK_GATE_NO_SET_RATE),
 	COMPOSITE_NODIV(CLK_RGA_CORE, "clk_rga_core", gpll300_gpll200_gpll100_p, 0,
 			RK3568_CLKSEL_CON(43), 2, 2, MFLAGS,
 			RK3568_CLKGATE_CON(23), 6, GFLAGS),
 	GATE(ACLK_IEP, "aclk_iep", "aclk_rga_pre", 0,
-			RK3568_CLKGATE_CON(23), 7, GFLAGS),
+			RK3568_CLKGATE_CON(23), 7, GFLAGS | CLK_GATE_NO_SET_RATE),
 	GATE(HCLK_IEP, "hclk_iep", "hclk_rga_pre", 0,
-			RK3568_CLKGATE_CON(23), 8, GFLAGS),
+			RK3568_CLKGATE_CON(23), 8, GFLAGS | CLK_GATE_NO_SET_RATE),
 	COMPOSITE_NODIV(CLK_IEP_CORE, "clk_iep_core", gpll300_gpll200_gpll100_p, 0,
 			RK3568_CLKSEL_CON(43), 4, 2, MFLAGS,
 			RK3568_CLKGATE_CON(23), 9, GFLAGS),
-	GATE(HCLK_EBC, "hclk_ebc", "hclk_rga_pre", 0, RK3568_CLKGATE_CON(23), 10, GFLAGS),
+	GATE(HCLK_EBC, "hclk_ebc", "hclk_rga_pre", 0, RK3568_CLKGATE_CON(23), 10, GFLAGS | CLK_GATE_NO_SET_RATE),
 	COMPOSITE_NODIV(DCLK_EBC, "dclk_ebc", gpll400_cpll333_gpll200_p, 0,
 			RK3568_CLKSEL_CON(43), 6, 2, MFLAGS,
 			RK3568_CLKGATE_CON(23), 11, GFLAGS),
 	GATE(ACLK_JDEC, "aclk_jdec", "aclk_rga_pre", 0,
-			RK3568_CLKGATE_CON(23), 12, GFLAGS),
+			RK3568_CLKGATE_CON(23), 12, GFLAGS | CLK_GATE_NO_SET_RATE),
 	GATE(HCLK_JDEC, "hclk_jdec", "hclk_rga_pre", 0,
-			RK3568_CLKGATE_CON(23), 13, GFLAGS),
+			RK3568_CLKGATE_CON(23), 13, GFLAGS | CLK_GATE_NO_SET_RATE),
 	GATE(ACLK_JENC, "aclk_jenc", "aclk_rga_pre", 0,
-			RK3568_CLKGATE_CON(23), 14, GFLAGS),
+			RK3568_CLKGATE_CON(23), 14, GFLAGS | CLK_GATE_NO_SET_RATE),
 	GATE(HCLK_JENC, "hclk_jenc", "hclk_rga_pre", 0,
 			RK3568_CLKGATE_CON(23), 15, GFLAGS),
 	GATE(PCLK_EINK, "pclk_eink", "pclk_rga_pre", 0,
-			RK3568_CLKGATE_CON(22), 14, GFLAGS),
+			RK3568_CLKGATE_CON(22), 14, GFLAGS | CLK_GATE_NO_SET_RATE),
 	GATE(HCLK_EINK, "hclk_eink", "hclk_rga_pre", 0,
-			RK3568_CLKGATE_CON(22), 15, GFLAGS),
+			RK3568_CLKGATE_CON(22), 15, GFLAGS | CLK_GATE_NO_SET_RATE),
 
 	/* PD_RKVENC */
 	COMPOSITE(ACLK_RKVENC_PRE, "aclk_rkvenc_pre", gpll_cpll_npll_p, 0,

commit c56568e8bfae4236f50f02604801fa0a071c1cb0
Author: Elaine Zhang <zhangqing@rock-chips.com>
Date:   Mon Jun 7 11:30:46 2021 +0800

    clk: rockchip: add flag CLK_GATE_NO_SET_RATE
    
    Add CLK_GATE_NO_SET_RATE for gate clks not allowed to support setting
    rate.
    
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    Change-Id: Iddd1c958661f8ff9217b8781426314b0619367db

diff --git a/drivers/clk/rockchip/clk.c b/drivers/clk/rockchip/clk.c
index 08de23d0bc36..260c5bd6ffa3 100644
--- a/drivers/clk/rockchip/clk.c
+++ b/drivers/clk/rockchip/clk.c
@@ -618,7 +618,8 @@ void __init rockchip_clk_register_branches(
 				flags, &ctx->lock);
 			break;
 		case branch_gate:
-			flags |= CLK_SET_RATE_PARENT;
+			if (!(list->gate_flags & CLK_GATE_NO_SET_RATE))
+				flags |= CLK_SET_RATE_PARENT;
 
 			clk = clk_register_gate(NULL, list->name,
 				list->parent_names[0], flags,
diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h
index b59dc97e1d3c..402e3639a029 100644
--- a/include/linux/clk-provider.h
+++ b/include/linux/clk-provider.h
@@ -445,6 +445,8 @@ void of_fixed_clk_setup(struct device_node *np);
  *	of this register, and mask of gate bits are in higher 16-bit of this
  *	register.  While setting the gate bits, higher 16-bit should also be
  *	updated to indicate changing gate bits.
+ * CLK_GATE_NO_SET_RATE - The Gate not allowed to set rate.
+ *	And not allowed to set parent rate.
  */
 struct clk_gate {
 	struct clk_hw hw;
@@ -458,6 +460,7 @@ struct clk_gate {
 
 #define CLK_GATE_SET_TO_DISABLE		BIT(0)
 #define CLK_GATE_HIWORD_MASK		BIT(1)
+#define CLK_GATE_NO_SET_RATE		BIT(3)
 
 extern const struct clk_ops clk_gate_ops;
 struct clk *clk_register_gate(struct device *dev, const char *name,

commit d7fb9ec48d533ca716e4be4aa4193c8f5ae6e292
Author: Yu Qiaowei <cerf.yu@rock-chips.com>
Date:   Thu Jul 8 09:07:19 2021 +0800

    video/rockchip: rga2: Modify blend formula
    
    The maximum alpha is 255, but after the product of color and alpha
    in the blend formula, the final result is >> 8 (/256) instead of
    /255, which will introduce errors.
    This fix is that when alpha is 0x80~0xff, then +1.
    
    Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
    Change-Id: Ibba964f29a11eb226aa008a0dd5bf89048524b43

diff --git a/drivers/video/rockchip/rga2/rga2_reg_info.c b/drivers/video/rockchip/rga2/rga2_reg_info.c
index 51231e80d9cb..697cfab2e3fe 100644
--- a/drivers/video/rockchip/rga2/rga2_reg_info.c
+++ b/drivers/video/rockchip/rga2/rga2_reg_info.c
@@ -1282,36 +1282,41 @@ void RGA_MSG_2_RGA2_MSG(struct rga_req *req_rga, struct rga2_req *req)
                 case 0: //dst = 0
                     break;
                 case 1: //dst = src
-                    req->alpha_mode_0 = 0x0A1A;
-                    req->alpha_mode_1 = 0x0A1A;
+                    req->alpha_mode_0 = 0x0212;
+                    req->alpha_mode_1 = 0x0212;
                     break;
                 case 2: //dst = dst
-                    req->alpha_mode_0 = 0x1A0A;
-                    req->alpha_mode_1 = 0x1A0A;
+                    req->alpha_mode_0 = 0x1202;
+                    req->alpha_mode_1 = 0x1202;
                     break;
                 case 3: //dst = (256*sc + (256 - sa)*dc) >> 8
                     if((req_rga->alpha_rop_mode & 3) == 0) {
-                        alpha_mode_0 = 0x3818;
-                        alpha_mode_1 = 0x3818;
+                        /* both use globalAlpha. */
+                        alpha_mode_0 = 0x3010;
+                        alpha_mode_1 = 0x3010;
                     }
                     else if ((req_rga->alpha_rop_mode & 3) == 1) {
-                        alpha_mode_0 = 0x381A;
-                        alpha_mode_1 = 0x381A;
+                        /* dst use globalAlpha, and dst does not have pixelAlpha. */
+                        alpha_mode_0 = 0x3012;
+                        alpha_mode_1 = 0x3012;
                     }
                     else if ((req_rga->alpha_rop_mode & 3) == 2) {
-                        alpha_mode_0 = 0x381C;
-                        alpha_mode_1 = 0x381C;
+                        /* dst use globalAlpha, and dst has pixelAlpha. */
+                        alpha_mode_0 = 0x3014;
+                        alpha_mode_1 = 0x3014;
                     }
                     else {
-                        alpha_mode_0 = 0x381A;
-                        alpha_mode_1 = 0x381A;
+                        /* Do not use globalAlpha. */
+                        alpha_mode_0 = 0x3212;
+                        alpha_mode_1 = 0x3212;
                     }
                     req->alpha_mode_0 = alpha_mode_0;
                     req->alpha_mode_1 = alpha_mode_1;
                     break;
                 case 4: //dst = (sc*(256-da) + 256*dc) >> 8
-                    req->alpha_mode_0 = 0x1A3A;
-                    req->alpha_mode_1 = 0x1A3A;
+                    /* Do not use globalAlpha. */
+                    req->alpha_mode_0 = 0x1232;
+                    req->alpha_mode_1 = 0x1232;
                     break;
                 case 5: //dst = (da*sc) >> 8
                     break;
@@ -1322,8 +1327,8 @@ void RGA_MSG_2_RGA2_MSG(struct rga_req *req_rga, struct rga2_req *req)
                 case 8: //dst = ((256-sa)*dc) >> 8
                     break;
                 case 9: //dst = (da*sc + (256-sa)*dc) >> 8
-                    req->alpha_mode_0 = 0x3848;
-                    req->alpha_mode_1 = 0x3848;
+                    req->alpha_mode_0 = 0x3040;
+                    req->alpha_mode_1 = 0x3040;
                     break;
                 case 10://dst = ((256-da)*sc + (sa*dc)) >> 8
                     break;
@@ -1346,16 +1351,16 @@ void RGA_MSG_2_RGA2_MSG(struct rga_req *req_rga, struct rga2_req *req)
         }
         else {
             if((req_rga->alpha_rop_mode & 3) == 0) {
-                req->alpha_mode_0 = 0x3848;
-                req->alpha_mode_1 = 0x3848;
+                req->alpha_mode_0 = 0x3040;
+                req->alpha_mode_1 = 0x3040;
             }
             else if ((req_rga->alpha_rop_mode & 3) == 1) {
-		req->alpha_mode_0 = 0x384A;
-		req->alpha_mode_1 = 0x3A4A;
+		req->alpha_mode_0 = 0x3042;
+		req->alpha_mode_1 = 0x3242;
             }
             else if ((req_rga->alpha_rop_mode & 3) == 2) {
-                req->alpha_mode_0 = 0x384C;
-                req->alpha_mode_1 = 0x384C;
+                req->alpha_mode_0 = 0x3044;
+                req->alpha_mode_1 = 0x3044;
             }
         }
     }
@@ -1534,44 +1539,49 @@ void RGA_MSG_2_RGA2_MSG_32(struct rga_req_32 *req_rga, struct rga2_req *req)
     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 8) & 1) << 8); // nn_quantize
     req->dither_mode = req_rga->dither_mode;
 
-    if(((req_rga->alpha_rop_flag) & 1)) {
-        if((req_rga->alpha_rop_flag >> 3) & 1) {
+    if (((req_rga->alpha_rop_flag) & 1)) {
+        if ((req_rga->alpha_rop_flag >> 3) & 1) {
             /* porter duff alpha enable */
-            switch(req_rga->PD_mode)
+            switch (req_rga->PD_mode)
             {
                 case 0: //dst = 0
                     break;
                 case 1: //dst = src
-                    req->alpha_mode_0 = 0x0A1A;
-                    req->alpha_mode_1 = 0x0A1A;
+                    req->alpha_mode_0 = 0x0212;
+                    req->alpha_mode_1 = 0x0212;
                     break;
                 case 2: //dst = dst
-                    req->alpha_mode_0 = 0x1A0A;
-                    req->alpha_mode_1 = 0x1A0A;
+                    req->alpha_mode_0 = 0x1202;
+                    req->alpha_mode_1 = 0x1202;
                     break;
                 case 3: //dst = (256*sc + (256 - sa)*dc) >> 8
                     if((req_rga->alpha_rop_mode & 3) == 0) {
-                        alpha_mode_0 = 0x3818;
-                        alpha_mode_1 = 0x3818;
+                        /* both use globalAlpha. */
+                        alpha_mode_0 = 0x3010;
+                        alpha_mode_1 = 0x3010;
                     }
                     else if ((req_rga->alpha_rop_mode & 3) == 1) {
-                        alpha_mode_0 = 0x381A;
-                        alpha_mode_1 = 0x381A;
+                        /* dst use globalAlpha, and dst does not have pixelAlpha. */
+                        alpha_mode_0 = 0x3012;
+                        alpha_mode_1 = 0x3012;
                     }
                     else if ((req_rga->alpha_rop_mode & 3) == 2) {
-                        alpha_mode_0 = 0x381C;
-                        alpha_mode_1 = 0x381C;
+                        /* dst use globalAlpha, and dst has pixelAlpha. */
+                        alpha_mode_0 = 0x3014;
+                        alpha_mode_1 = 0x3014;
                     }
                     else {
-                        alpha_mode_0 = 0x381A;
-                        alpha_mode_1 = 0x381A;
+                        /* Do not use globalAlpha. */
+                        alpha_mode_0 = 0x3212;
+                        alpha_mode_1 = 0x3212;
                     }
                     req->alpha_mode_0 = alpha_mode_0;
                     req->alpha_mode_1 = alpha_mode_1;
                     break;
                 case 4: //dst = (sc*(256-da) + 256*dc) >> 8
-                    req->alpha_mode_0 = 0x1A3A;
-                    req->alpha_mode_1 = 0x1A3A;
+                    /* Do not use globalAlpha. */
+                    req->alpha_mode_0 = 0x1232;
+                    req->alpha_mode_1 = 0x1232;
                     break;
                 case 5: //dst = (da*sc) >> 8
                     break;
@@ -1582,8 +1592,8 @@ void RGA_MSG_2_RGA2_MSG_32(struct rga_req_32 *req_rga, struct rga2_req *req)
                 case 8: //dst = ((256-sa)*dc) >> 8
                     break;
                 case 9: //dst = (da*sc + (256-sa)*dc) >> 8
-                    req->alpha_mode_0 = 0x3848;
-                    req->alpha_mode_1 = 0x3848;
+                    req->alpha_mode_0 = 0x3040;
+                    req->alpha_mode_1 = 0x3040;
                     break;
                 case 10://dst = ((256-da)*sc + (sa*dc)) >> 8
                     break;
@@ -1606,19 +1616,20 @@ void RGA_MSG_2_RGA2_MSG_32(struct rga_req_32 *req_rga, struct rga2_req *req)
         }
         else {
             if((req_rga->alpha_rop_mode & 3) == 0) {
-                req->alpha_mode_0 = 0x3848;
-                req->alpha_mode_1 = 0x3848;
+                req->alpha_mode_0 = 0x3040;
+                req->alpha_mode_1 = 0x3040;
             }
             else if ((req_rga->alpha_rop_mode & 3) == 1) {
-		req->alpha_mode_0 = 0x384A;
-		req->alpha_mode_1 = 0x3A4A;
+		req->alpha_mode_0 = 0x3042;
+		req->alpha_mode_1 = 0x3242;
             }
             else if ((req_rga->alpha_rop_mode & 3) == 2) {
-                req->alpha_mode_0 = 0x384C;
-                req->alpha_mode_1 = 0x384C;
+                req->alpha_mode_0 = 0x3044;
+                req->alpha_mode_1 = 0x3044;
             }
         }
     }
+
     if (req_rga->mmu_info.mmu_en && (req_rga->mmu_info.mmu_flag & 1) == 1) {
         req->mmu_info.src0_mmu_flag = 1;
         req->mmu_info.dst_mmu_flag = 1;

commit 9e44a98d4c5bf9828ffd7f0d79a713fcf2b2ad30
Author: Caesar Wang <wxt@rock-chips.com>
Date:   Wed Jul 7 14:59:40 2021 +0800

    arm64/configs: update rockchip_linux_defconfig
    
    1) Enable rknpu module
    2) Enable CONFIG_ARM_ROCKCHIP_DMC_DEBUG=y
    
    Signed-off-by: Caesar Wang <wxt@rock-chips.com>
    Change-Id: I7d6a8b1aa5311030e689a19a4712d8b8dc657b09

diff --git a/arch/arm64/configs/rockchip_linux_defconfig b/arch/arm64/configs/rockchip_linux_defconfig
index 6aac6bc2b8fb..deccc57d509f 100644
--- a/arch/arm64/configs/rockchip_linux_defconfig
+++ b/arch/arm64/configs/rockchip_linux_defconfig
@@ -480,6 +480,7 @@ CONFIG_DEVFREQ_GOV_POWERSAVE=y
 CONFIG_DEVFREQ_GOV_USERSPACE=y
 CONFIG_ARM_ROCKCHIP_BUS_DEVFREQ=y
 CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ=y
+CONFIG_ARM_ROCKCHIP_DMC_DEBUG=y
 CONFIG_MEMORY=y
 CONFIG_IIO=y
 CONFIG_IIO_BUFFER=y
@@ -517,6 +518,7 @@ CONFIG_RK_SFC_NAND_MTD=y
 CONFIG_RK_SFC_NOR=y
 CONFIG_RK_SFC_NOR_MTD=y
 CONFIG_RK_HEADSET=y
+CONFIG_ROCKCHIP_RKNPU=y
 CONFIG_EXT4_FS=y
 CONFIG_EXT4_FS_POSIX_ACL=y
 CONFIG_EXT4_FS_SECURITY=y

commit ea02130e2fd20c27ee0e94408c4224cf7e24be5a
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Fri Jun 18 21:09:34 2021 +0800

    media: rockchip: cif: remove dummy buffer
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: Ib1cdf85020d37a7a4a06b726fb88597797806411

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index 7e66403866f3..8a8f5f56b872 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -23,7 +23,7 @@
 #include "dev.h"
 #include "mipi-csi2.h"
 
-#define CIF_REQ_BUFS_MIN	1
+#define CIF_REQ_BUFS_MIN	3
 #define CIF_MIN_WIDTH		64
 #define CIF_MIN_HEIGHT		64
 #define CIF_MAX_WIDTH		8192
@@ -1100,14 +1100,14 @@ static enum cif_reg_index get_dvp_reg_index_of_frm1_uv_addr(int channel_id)
 }
 
 /***************************** stream operations ******************************/
-static void rkcif_assign_new_buffer_oneframe(struct rkcif_stream *stream,
+static int rkcif_assign_new_buffer_oneframe(struct rkcif_stream *stream,
 					     enum rkcif_yuvaddr_state stat)
 {
-	struct rkcif_dummy_buffer *dummy_buf = &stream->dummy_buf;
 	struct rkcif_device *dev = stream->cifdev;
 	struct rkcif_buffer *buffer = NULL;
 	u32 frm_addr_y = CIF_REG_DVP_FRM0_ADDR_Y;
 	u32 frm_addr_uv = CIF_REG_DVP_FRM0_ADDR_UV;
+	int ret = 0;
 
 	spin_lock(&stream->vbq_lock);
 	if (stat == RKCIF_YUV_ADDR_STATE_INIT) {
@@ -1125,11 +1125,6 @@ static void rkcif_assign_new_buffer_oneframe(struct rkcif_stream *stream,
 					     stream->curr_buf->buff_addr[RKCIF_PLANE_Y]);
 			rkcif_write_register(dev, CIF_REG_DVP_FRM0_ADDR_UV,
 					     stream->curr_buf->buff_addr[RKCIF_PLANE_CBCR]);
-		} else {
-			rkcif_write_register(dev, CIF_REG_DVP_FRM0_ADDR_Y,
-					     dummy_buf->dma_addr);
-			rkcif_write_register(dev, CIF_REG_DVP_FRM0_ADDR_UV,
-					     dummy_buf->dma_addr);
 		}
 
 		if (!stream->next_buf) {
@@ -1145,11 +1140,6 @@ static void rkcif_assign_new_buffer_oneframe(struct rkcif_stream *stream,
 					     stream->next_buf->buff_addr[RKCIF_PLANE_Y]);
 			rkcif_write_register(dev, CIF_REG_DVP_FRM1_ADDR_UV,
 					     stream->next_buf->buff_addr[RKCIF_PLANE_CBCR]);
-		} else {
-			rkcif_write_register(dev, CIF_REG_DVP_FRM1_ADDR_Y,
-					     dummy_buf->dma_addr);
-			rkcif_write_register(dev, CIF_REG_DVP_FRM1_ADDR_UV,
-					     dummy_buf->dma_addr);
 		}
 	} else if (stat == RKCIF_YUV_ADDR_STATE_UPDATE) {
 		if (!list_empty(&stream->buf_head)) {
@@ -1165,10 +1155,6 @@ static void rkcif_assign_new_buffer_oneframe(struct rkcif_stream *stream,
 				buffer = stream->next_buf;
 			}
 		} else {
-			if (stream->frame_phase == CIF_CSI_FRAME0_READY)
-				stream->curr_buf = NULL;
-			if (stream->frame_phase == CIF_CSI_FRAME1_READY)
-				stream->next_buf = NULL;
 			buffer = NULL;
 		}
 
@@ -1186,22 +1172,19 @@ static void rkcif_assign_new_buffer_oneframe(struct rkcif_stream *stream,
 			rkcif_write_register(dev, frm_addr_uv,
 					     buffer->buff_addr[RKCIF_PLANE_CBCR]);
 		} else {
-			rkcif_write_register(dev, frm_addr_y,
-					     dummy_buf->dma_addr);
-			rkcif_write_register(dev, frm_addr_uv,
-					     dummy_buf->dma_addr);
+			ret = -EINVAL;
 			v4l2_dbg(1, rkcif_debug, &dev->v4l2_dev,
-				 "frame Drop to dummy buf\n");
+				 "not active buffer, frame Drop\n");
 		}
 	}
 	spin_unlock(&stream->vbq_lock);
+	return ret;
 }
 
 static void rkcif_assign_new_buffer_init(struct rkcif_stream *stream,
 					 int channel_id)
 {
 	struct rkcif_device *dev = stream->cifdev;
-	struct rkcif_dummy_buffer *dummy_buf = &stream->dummy_buf;
 	struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus;
 	u32 frm0_addr_y, frm0_addr_uv;
 	u32 frm1_addr_y, frm1_addr_uv;
@@ -1236,10 +1219,6 @@ static void rkcif_assign_new_buffer_init(struct rkcif_stream *stream,
 		if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
 			rkcif_write_register(dev, frm0_addr_uv,
 					     stream->curr_buf->buff_addr[RKCIF_PLANE_CBCR]);
-	} else {
-		rkcif_write_register(dev, frm0_addr_y, dummy_buf->dma_addr);
-		if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
-			rkcif_write_register(dev, frm0_addr_uv, dummy_buf->dma_addr);
 	}
 
 	if (!stream->next_buf) {
@@ -1256,10 +1235,6 @@ static void rkcif_assign_new_buffer_init(struct rkcif_stream *stream,
 		if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
 			rkcif_write_register(dev, frm1_addr_uv,
 					     stream->next_buf->buff_addr[RKCIF_PLANE_CBCR]);
-	} else {
-		rkcif_write_register(dev, frm1_addr_y, dummy_buf->dma_addr);
-		if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
-			rkcif_write_register(dev, frm1_addr_uv, dummy_buf->dma_addr);
 	}
 
 	stream->is_dvp_yuv_addr_init = true;
@@ -1273,33 +1248,36 @@ static void rkcif_assign_new_buffer_init(struct rkcif_stream *stream,
 		for (ch_id = 0; ch_id < RKCIF_MAX_STREAM_DVP; ch_id++) {
 			if (dev->stream[ch_id].is_dvp_yuv_addr_init)
 				continue;
-
-			rkcif_write_register(dev,
-					     get_dvp_reg_index_of_frm0_y_addr(ch_id),
-					     dummy_buf->dma_addr);
-			rkcif_write_register(dev,
-					     get_dvp_reg_index_of_frm1_y_addr(ch_id),
-					     dummy_buf->dma_addr);
-			rkcif_write_register(dev,
-					     get_dvp_reg_index_of_frm0_uv_addr(ch_id),
-					     dummy_buf->dma_addr);
-			rkcif_write_register(dev,
-					     get_dvp_reg_index_of_frm1_uv_addr(ch_id),
-					     dummy_buf->dma_addr);
+			if (stream->curr_buf) {
+				rkcif_write_register(dev,
+						     get_dvp_reg_index_of_frm0_y_addr(ch_id),
+						     stream->curr_buf->buff_addr[RKCIF_PLANE_Y]);
+				rkcif_write_register(dev,
+						     get_dvp_reg_index_of_frm0_uv_addr(ch_id),
+						     stream->curr_buf->buff_addr[RKCIF_PLANE_CBCR]);
+			}
+			if (stream->next_buf) {
+				rkcif_write_register(dev,
+						     get_dvp_reg_index_of_frm1_y_addr(ch_id),
+						     stream->next_buf->buff_addr[RKCIF_PLANE_Y]);
+				rkcif_write_register(dev,
+						     get_dvp_reg_index_of_frm1_uv_addr(ch_id),
+						     stream->next_buf->buff_addr[RKCIF_PLANE_CBCR]);
+			}
 		}
 	}
 
 	spin_unlock(&stream->vbq_lock);
 }
 
-static void rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
+static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
 					   int channel_id)
 {
 	struct rkcif_device *dev = stream->cifdev;
-	struct rkcif_dummy_buffer *dummy_buf = &stream->dummy_buf;
 	struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus;
 	struct rkcif_buffer *buffer = NULL;
 	u32 frm_addr_y, frm_addr_uv;
+	int ret = 0;
 
 	if (mbus_cfg->type == V4L2_MBUS_CSI2 ||
 	    mbus_cfg->type == V4L2_MBUS_CCP2) {
@@ -1336,10 +1314,6 @@ static void rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
 			}
 		}
 	} else {
-		if (stream->frame_phase == CIF_CSI_FRAME0_READY)
-			stream->curr_buf = NULL;
-		else if (stream->frame_phase == CIF_CSI_FRAME1_READY)
-			stream->next_buf = NULL;
 		buffer = NULL;
 	}
 	spin_unlock(&stream->vbq_lock);
@@ -1351,24 +1325,26 @@ static void rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
 			rkcif_write_register(dev, frm_addr_uv,
 					     buffer->buff_addr[RKCIF_PLANE_CBCR]);
 	} else {
-		rkcif_write_register(dev, frm_addr_y, dummy_buf->dma_addr);
-		if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
-			rkcif_write_register(dev, frm_addr_uv, dummy_buf->dma_addr);
+		ret = -EINVAL;
 		v4l2_info(&dev->v4l2_dev,
-			 "frame drop to dummy buf, %s stream[%d]\n",
+			 "not active buffer, skip current frame, %s stream[%d]\n",
 			 (mbus_cfg->type == V4L2_MBUS_CSI2 ||
 			  mbus_cfg->type == V4L2_MBUS_CCP2) ? "mipi/lvds" : "dvp",
 			  stream->id);
 	}
+	return ret;
 }
 
-static void rkcif_assign_new_buffer_pingpong(struct rkcif_stream *stream,
+static int rkcif_assign_new_buffer_pingpong(struct rkcif_stream *stream,
 					     int init, int channel_id)
 {
+	int ret = 0;
+
 	if (init)
 		rkcif_assign_new_buffer_init(stream, channel_id);
 	else
-		rkcif_assign_new_buffer_update(stream, channel_id);
+		ret = rkcif_assign_new_buffer_update(stream, channel_id);
+	return ret;
 }
 
 static void rkcif_csi_get_vc_num(struct rkcif_device *dev,
@@ -1873,57 +1849,6 @@ static void rkcif_buf_queue(struct vb2_buffer *vb)
 	spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
 }
 
-static int rkcif_create_dummy_buf(struct rkcif_stream *stream)
-{
-	u32 fourcc;
-	struct rkcif_dummy_buffer *dummy_buf = &stream->dummy_buf;
-	struct rkcif_device *dev = stream->cifdev;
-	struct rkcif_hw *hw_dev = dev->hw_dev;
-
-	/* get a maximum plane size */
-	dummy_buf->size = max3(stream->pixm.plane_fmt[0].bytesperline *
-		stream->pixm.height,
-		stream->pixm.plane_fmt[1].sizeimage,
-		stream->pixm.plane_fmt[2].sizeimage);
-	/*
-	 * rk cif don't support output yuyv fmt data
-	 * if user request yuyv fmt, the input mode must be RAW8
-	 * and the width is double Because the real input fmt is
-	 * yuyv
-	 */
-	fourcc  = stream->cif_fmt_out->fourcc;
-	if (fourcc == V4L2_PIX_FMT_YUYV || fourcc == V4L2_PIX_FMT_YVYU ||
-	    fourcc == V4L2_PIX_FMT_UYVY || fourcc == V4L2_PIX_FMT_VYUY)
-		dummy_buf->size *= 2;
-
-	dummy_buf->vaddr = dma_alloc_coherent(hw_dev->dev, dummy_buf->size,
-					      &dummy_buf->dma_addr,
-					      GFP_KERNEL);
-	if (!dummy_buf->vaddr) {
-		v4l2_err(&dev->v4l2_dev,
-			 "Failed to allocate the memory for dummy buffer\n");
-		return -ENOMEM;
-	}
-
-	v4l2_info(&dev->v4l2_dev, "Allocate dummy buffer, size: 0x%08x\n",
-		  dummy_buf->size);
-
-	return 0;
-}
-
-static void rkcif_destroy_dummy_buf(struct rkcif_stream *stream)
-{
-	struct rkcif_dummy_buffer *dummy_buf = &stream->dummy_buf;
-	struct rkcif_device *dev = stream->cifdev;
-	struct rkcif_hw *hw_dev = dev->hw_dev;
-
-	if (dummy_buf->vaddr)
-		dma_free_coherent(hw_dev->dev, dummy_buf->size,
-				  dummy_buf->vaddr, dummy_buf->dma_addr);
-	dummy_buf->dma_addr = 0;
-	dummy_buf->vaddr = NULL;
-}
-
 static void rkcif_do_cru_reset(struct rkcif_device *dev)
 {
 	struct rkcif_hw *cif_hw = dev->hw_dev;
@@ -2062,8 +1987,6 @@ static void rkcif_stop_streaming(struct vb2_queue *queue)
 		vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
 	}
 
-	rkcif_destroy_dummy_buf(stream);
-
 	ret = dev->pipe.close(&dev->pipe);
 	if (ret < 0)
 		v4l2_err(v4l2_dev, "pipeline close failed error:%d\n", ret);
@@ -2666,12 +2589,6 @@ static int rkcif_start_streaming(struct vb2_queue *queue, unsigned int count)
 	if (ret < 0)
 		goto destroy_buf;
 
-	ret = rkcif_create_dummy_buf(stream);
-	if (ret < 0) {
-		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) {
@@ -2773,7 +2690,6 @@ static int rkcif_start_streaming(struct vb2_queue *queue, unsigned int count)
 		list_del(&buf->queue);
 	}
 
-	rkcif_destroy_dummy_buf(stream);
 out:
 	mutex_unlock(&dev->stream_lock);
 	return ret;
@@ -4020,6 +3936,7 @@ void rkcif_irq_oneframe(struct rkcif_device *cif_dev)
 	/* TODO: xuhf-debug: add stream type */
 	struct rkcif_stream *stream;
 	u32 lastline, lastpix, ctl, cif_frmst, intstat, frmid;
+	int ret = 0;
 
 	intstat = rkcif_read_register(cif_dev, CIF_REG_DVP_INTSTAT);
 	cif_frmst = rkcif_read_register(cif_dev, CIF_REG_DVP_FRAME_STATUS);
@@ -4085,9 +4002,6 @@ void rkcif_irq_oneframe(struct rkcif_device *cif_dev)
 				vb_done = &stream->next_buf->vb;
 		}
 
-		rkcif_assign_new_buffer_oneframe(stream,
-						 RKCIF_YUV_ADDR_STATE_UPDATE);
-
 		/* In one-frame mode:
 		 * 1,must clear status manually by writing 0 to enable
 		 * the next frame end irq;
@@ -4095,11 +4009,14 @@ void rkcif_irq_oneframe(struct rkcif_device *cif_dev)
 		 */
 		rkcif_write_register(cif_dev, CIF_REG_DVP_FRAME_STATUS,
 				     cif_frmst & FRM0_STAT_CLS);
+		ret = rkcif_assign_new_buffer_oneframe(stream,
+						 RKCIF_YUV_ADDR_STATE_UPDATE);
 
-		if (vb_done) {
+		if (vb_done && (!ret)) {
 			vb_done->sequence = stream->frame_idx;
 			rkcif_vb_done_oneframe(stream, vb_done);
 		}
+
 		stream->frame_idx++;
 		cif_dev->irq_stats.all_frm_end_cnt++;
 	}
@@ -4603,6 +4520,7 @@ static void rkcif_update_stream(struct rkcif_device *cif_dev,
 	struct rkcif_buffer *active_buf = NULL;
 	struct vb2_v4l2_buffer *vb_done = NULL;
 	unsigned long lock_flags = 0;
+	int ret = 0;
 
 	if (stream->frame_phase == (CIF_CSI_FRAME0_READY | CIF_CSI_FRAME1_READY)) {
 
@@ -4626,9 +4544,11 @@ static void rkcif_update_stream(struct rkcif_device *cif_dev,
 	spin_unlock(&stream->fps_lock);
 
 	cif_dev->buf_wake_up_cnt += 1;
-	rkcif_assign_new_buffer_pingpong(stream,
-					 RKCIF_YUV_ADDR_STATE_UPDATE,
-					 mipi_id);
+	ret = rkcif_assign_new_buffer_pingpong(stream,
+					       RKCIF_YUV_ADDR_STATE_UPDATE,
+					       mipi_id);
+	if (ret)
+		goto end;
 
 	if (cif_dev->chip_id == CHIP_RV1126_CIF ||
 	    cif_dev->chip_id == CHIP_RV1126_CIF_LITE ||
@@ -4702,7 +4622,7 @@ static void rkcif_update_stream(struct rkcif_device *cif_dev,
 				  cif_dev->stream[3].state != RKCIF_STATE_STREAMING ? "stopped" : "running");
 		}
 	}
-
+end:
 	stream->frame_idx++;
 }
 
@@ -5152,6 +5072,7 @@ void rkcif_irq_pingpong(struct rkcif_device *cif_dev)
 	struct rkcif_stream *detect_stream = &cif_dev->stream[0];
 	struct v4l2_mbus_config *mbus;
 	unsigned int intstat = 0x0, i = 0xff, bak_intstat = 0x0;
+	int ret = 0;
 
 	if (!cif_dev->active_sensor)
 		return;
@@ -5414,14 +5335,13 @@ void rkcif_irq_pingpong(struct rkcif_device *cif_dev)
 					stream->fps_stats.frm1_timestamp = ktime_get_ns();
 				spin_unlock(&stream->fps_lock);
 
-				rkcif_assign_new_buffer_oneframe(stream,
+				ret = rkcif_assign_new_buffer_oneframe(stream,
 								 RKCIF_YUV_ADDR_STATE_UPDATE);
 
-				if (vb_done) {
+				if (vb_done && (!ret)) {
 					vb_done->sequence = stream->frame_idx;
 					rkcif_vb_done_oneframe(stream, vb_done);
 				}
-
 				stream->frame_idx++;
 				cif_dev->irq_stats.all_frm_end_cnt++;
 			}
diff --git a/drivers/media/platform/rockchip/cif/dev.h b/drivers/media/platform/rockchip/cif/dev.h
index 539a0dd5b4b9..40bc72937ab5 100644
--- a/drivers/media/platform/rockchip/cif/dev.h
+++ b/drivers/media/platform/rockchip/cif/dev.h
@@ -168,12 +168,6 @@ struct rkcif_buffer {
 	};
 };
 
-struct rkcif_dummy_buffer {
-	void *vaddr;
-	dma_addr_t dma_addr;
-	u32 size;
-};
-
 extern int rkcif_debug;
 
 /*
@@ -401,7 +395,6 @@ struct rkcif_stream {
 	unsigned int			crop_mask;
 	/* lock between irq and buf_queue */
 	struct list_head		buf_head;
-	struct rkcif_dummy_buffer	dummy_buf;
 	struct rkcif_buffer		*curr_buf;
 	struct rkcif_buffer		*next_buf;
 

commit cdead10da763e6a93869e281974c89852a0ba887
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Mon Jun 28 20:34:38 2021 +0800

    media: i2c: imx415: support get sony BRL
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I6045b794e7c482ee63058ded7f654b55c2f604d8

diff --git a/drivers/media/i2c/imx415.c b/drivers/media/i2c/imx415.c
index 570e25331e9c..6d32fb61de5d 100644
--- a/drivers/media/i2c/imx415.c
+++ b/drivers/media/i2c/imx415.c
@@ -1563,7 +1563,10 @@ static long imx415_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 			ret = imx415_write_reg(imx415->client, IMX415_REG_CTRL_MODE,
 				IMX415_REG_VALUE_08BIT, IMX415_MODE_SW_STANDBY);
 		break;
-
+	case RKMODULE_GET_SONY_BRL:
+		if (imx415->cur_mode->width == 3864 && imx415->cur_mode->height == 2192)
+			*((u32 *)arg) = BRL;
+		break;
 	default:
 		ret = -ENOIOCTLCMD;
 		break;
@@ -1583,6 +1586,7 @@ static long imx415_compat_ioctl32(struct v4l2_subdev *sd,
 	struct preisp_hdrae_exp_s *hdrae;
 	long ret;
 	u32  stream;
+	u32 brl = 0;
 
 	switch (cmd) {
 	case RKMODULE_GET_MODULE_INFO:
@@ -1593,8 +1597,12 @@ static long imx415_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = imx415_ioctl(sd, cmd, inf);
-		if (!ret)
-			ret = copy_to_user(up, inf, sizeof(*inf));
+		if (!ret) {
+			if (copy_to_user(up, inf, sizeof(*inf))) {
+				kfree(inf);
+				return -EFAULT;
+			}
+		}
 		kfree(inf);
 		break;
 	case RKMODULE_AWB_CFG:
@@ -1604,9 +1612,11 @@ static long imx415_compat_ioctl32(struct v4l2_subdev *sd,
 			return ret;
 		}
 
-		ret = copy_from_user(cfg, up, sizeof(*cfg));
-		if (!ret)
-			ret = imx415_ioctl(sd, cmd, cfg);
+		if (copy_from_user(cfg, up, sizeof(*cfg))) {
+			kfree(cfg);
+			return -EFAULT;
+		}
+		ret = imx415_ioctl(sd, cmd, cfg);
 		kfree(cfg);
 		break;
 	case RKMODULE_GET_HDR_CFG:
@@ -1617,8 +1627,12 @@ static long imx415_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = imx415_ioctl(sd, cmd, hdr);
-		if (!ret)
-			ret = copy_to_user(up, hdr, sizeof(*hdr));
+		if (!ret) {
+			if (copy_to_user(up, hdr, sizeof(*hdr))) {
+				kfree(hdr);
+				return -EFAULT;
+			}
+		}
 		kfree(hdr);
 		break;
 	case RKMODULE_SET_HDR_CFG:
@@ -1628,9 +1642,11 @@ static long imx415_compat_ioctl32(struct v4l2_subdev *sd,
 			return ret;
 		}
 
-		ret = copy_from_user(hdr, up, sizeof(*hdr));
-		if (!ret)
-			ret = imx415_ioctl(sd, cmd, hdr);
+		if (copy_from_user(hdr, up, sizeof(*hdr))) {
+			kfree(hdr);
+			return -EFAULT;
+		}
+		ret = imx415_ioctl(sd, cmd, hdr);
 		kfree(hdr);
 		break;
 	case PREISP_CMD_SET_HDRAE_EXP:
@@ -1640,18 +1656,25 @@ static long imx415_compat_ioctl32(struct v4l2_subdev *sd,
 			return ret;
 		}
 
-		ret = copy_from_user(hdrae, up, sizeof(*hdrae));
-		if (!ret)
-			ret = imx415_ioctl(sd, cmd, hdrae);
+		if (copy_from_user(hdrae, up, sizeof(*hdrae))) {
+			kfree(hdrae);
+			return -EFAULT;
+		}
+		ret = imx415_ioctl(sd, cmd, hdrae);
 		kfree(hdrae);
 		break;
 	case RKMODULE_SET_QUICK_STREAM:
-
-		ret = copy_from_user(&stream, up, sizeof(u32));
-		if (!ret)
-			ret = imx415_ioctl(sd, cmd, &stream);
+		if (copy_from_user(&stream, up, sizeof(u32)))
+			return -EFAULT;
+		ret = imx415_ioctl(sd, cmd, &stream);
+		break;
+	case RKMODULE_GET_SONY_BRL:
+		ret = imx415_ioctl(sd, cmd, &brl);
+		if (!ret) {
+			if (copy_to_user(up, &brl, sizeof(u32)))
+				return -EFAULT;
+		}
 		break;
-
 	default:
 		ret = -ENOIOCTLCMD;
 		break;

commit 506e3e2788aac123ac680a94baf848229d8e19cb
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Mon Jun 28 20:33:14 2021 +0800

    include: uapi/linux/rk-camera-module.h add RKMODULE_GET_SONY_BRL command
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I55bbf4c5e5163286e1f8c68b1a1734bcefcf2b22

diff --git a/include/uapi/linux/rk-camera-module.h b/include/uapi/linux/rk-camera-module.h
index 2b362766f476..0a6a5a78b6f4 100644
--- a/include/uapi/linux/rk-camera-module.h
+++ b/include/uapi/linux/rk-camera-module.h
@@ -100,6 +100,9 @@
 #define RKMODULE_GET_DCG_RATIO	\
 	_IOR('V', BASE_VIDIOC_PRIVATE + 18, struct rkmodule_dcg_ratio)
 
+#define RKMODULE_GET_SONY_BRL	\
+	_IOR('V', BASE_VIDIOC_PRIVATE + 19, __u32)
+
 /**
  * struct rkmodule_base_inf - module base information
  *
@@ -268,8 +271,8 @@ struct rkmodule_hdr_cfg {
  * eav: end of active video codes
  */
 struct rkmodule_sync_code {
-	u16 sav;
-	u16 eav;
+	__u16 sav;
+	__u16 eav;
 };
 
 /* sensor lvds difference sync code mode
@@ -425,9 +428,9 @@ struct rkmodule_bt656_mbus_info {
 
 /* DCG ratio (float) = integer + decimal / div_coeff */
 struct rkmodule_dcg_ratio {
-	u32 integer;
-	u32 decimal;
-	u32 div_coeff;
+	__u32 integer;
+	__u32 decimal;
+	__u32 div_coeff;
 };
 
 #endif /* _UAPI_RKMODULE_CAMERA_H */

commit f412d2e4aa756713724ba2eb7bdaa320c3f68de7
Author: Roger Chen <roger.chen@rock-chips.com>
Date:   Thu Jun 17 19:27:41 2021 +0800

    media: i2c: add driver for ov9281@30fps
    
    Signed-off-by: Roger Chen <roger.chen@rock-chips.com>
    Change-Id: I78132163e1fba4fb3fb531040df629b347ab0fa4

diff --git a/drivers/media/i2c/ov9281.c b/drivers/media/i2c/ov9281.c
index 206007acd275..245b11f4f4d2 100644
--- a/drivers/media/i2c/ov9281.c
+++ b/drivers/media/i2c/ov9281.c
@@ -80,6 +80,32 @@
 
 #define OV9281_NAME			"ov9281"
 
+
+//for SL
+#define OV9282_FPS		30
+#define OV9282_FLIP_ENABLE	1
+#define EXP_DEFAULT_TIME_US	3000
+#define OV9282_DEFAULT_GAIN	1
+
+#define OV9282_VTS_30_FPS	0xe48
+#define OV9282_HTS_30_FPS	0x2d8
+
+#define FPS_HTS_MODE		1
+#if FPS_HTS_MODE
+#define OV9282_VTS		OV9282_VTS_30_FPS
+#define OV9282_HTS		(OV9282_HTS_30_FPS * 30 / OV9282_FPS)
+#else
+#define OV9282_VTS		(OV9282_HTS_30_FPS * 30 / OV9282_FPS)
+#define OV9282_HTS		OV9282_VTS_30_FPS
+#endif
+
+#define TIME_MS			1000
+
+#define OV9282_EXP_TIME_REG	((uint16_t)(EXP_DEFAULT_TIME_US / 1000 * \
+				OV9282_FPS * OV9282_VTS / TIME_MS) << 4)
+#define OV9282_STROBE_TIME_REG	(OV9282_EXP_TIME_REG >> 4)
+
+
 static const char * const ov9281_supply_names[] = {
 	"avdd",		/* Analog power */
 	"dovdd",	/* Digital I/O power */
@@ -246,7 +272,146 @@ static const struct regval ov9281_1280x800_regs[] = {
 	{REG_NULL, 0x00},
 };
 
+
+static const struct regval ov9281_1280x800_30fps_regs[] = {
+	{0x0103, 0x01},/* software sleep */
+	{0x0100, 0x00},/* software reset */
+
+	/* use 20171222 strobe ok data ok */
+	{0x0302, 0x32},
+	{0x030d, 0x50},
+	{0x030e, 0x02},
+	{0x3001, 0x00},
+	{0x3004, 0x00},
+	{0x3005, 0x00},
+	{0x3011, 0x0a},
+	{0x3013, 0x18},
+	{0x3022, 0x01},
+	{0x3030, 0x10},
+	{0x3039, 0x32},
+	{0x303a, 0x00},
+	{0x3500, 0x00}, //exposure[19:16]
+	{0x3501, 0x2a}, //exposure[15:8]
+	{0x3502, 0x90}, //exposure[7:0]
+	{0x3503, 0x08}, //exposure change delay 1 frame,gain change select
+	{0x3505, 0x8c},
+	{0x3507, 0x03},
+	{0x3508, 0x00},
+	{0x3509, ((OV9282_DEFAULT_GAIN & 0x0f) << 4)}, //gain   (gain<<4)
+	{0x3610, 0x80},
+	{0x3611, 0xa0},
+	{0x3620, 0x6f},
+	{0x3632, 0x56},
+	{0x3633, 0x78},
+	{0x3662, 0x05},
+	{0x3666, 0x00},
+	{0x366f, 0x5a},
+	{0x3680, 0x84},
+	{0x3712, 0x80},
+	{0x372d, 0x22},
+	{0x3731, 0x80},
+	{0x3732, 0x30},
+	{0x3778, 0x00},
+	{0x377d, 0x22},
+	{0x3788, 0x02},
+	{0x3789, 0xa4},
+	{0x378a, 0x00},
+	{0x378b, 0x4a},
+	{0x3799, 0x20},
+	{0x3800, 0x00},
+	{0x3801, 0x00},
+	{0x3802, 0x00},
+	{0x3803, 0x00},
+	{0x3804, 0x05},
+	{0x3805, 0x0f},
+	{0x3806, 0x03},
+	{0x3807, 0x2f},
+	{0x3808, 0x05},
+	{0x3809, 0x00},
+	{0x380a, 0x03}, /* 1280x800 output */
+	{0x380b, 0x20},
+	{0x380c, (OV9282_HTS >> 8)},
+	{0x380d, (OV9282_HTS & 0xff)},
+
+	{0x380e, OV9282_VTS >> 8},
+	{0x380f, OV9282_VTS & 0xff},
+
+	{0x3810, 0x00},
+	{0x3811, 0x08},
+	{0x3812, 0x00},
+	{0x3813, 0x08}, /* 1280x800 v offset */
+	{0x3814, 0x11},
+	{0x3815, 0x11},
+#if OV9282_FLIP_ENABLE
+	{0x3820, 0x40},
+	{0x3821, 0x04},
+#else
+	{0x3820, 0x44},
+	{0x3821, 0x00},
+#endif
+	{0x3881, 0x42},
+	{0x38b1, 0x00},
+	{0x3920, 0xff},
+	{0x4003, 0x40},
+	{0x4008, 0x04},
+	{0x4009, 0x0b},
+	{0x400c, 0x00},
+	{0x400d, 0x07},
+	{0x4010, 0x40},
+	{0x4043, 0x40},
+	{0x4307, 0x30},
+	{0x4317, 0x00},
+	{0x4501, 0x00},
+	{0x4507, 0x00},
+	{0x4509, 0x00},
+	{0x450a, 0x08},
+	{0x4601, 0x04},
+	{0x470f, 0x00},
+	{0x4f07, 0x00},
+	{0x4800, 0x00},
+	{0x5000, 0x9f},
+	{0x5001, 0x00},
+	{0x5e00, 0x00},  //color bar
+	{0x5d00, 0x07},
+	{0x5d01, 0x00},
+	/* for vsync width 630us */
+	{0x4311, 0xc8},
+	{0x4312, 0x00},
+	//{0x0100, 0x01},
+
+	/* for strobe */
+	{0x3006, 0x0a},
+
+	/* exposure control */
+	{0x3500, 0x00},				//exposure[19:16]
+	{0x3501, OV9282_EXP_TIME_REG >> 8},	//exposure[15:8]
+	{0x3502, OV9282_EXP_TIME_REG & 0xff},	//exposure[7:0]  //low4 bit fraction bit
+
+	/* for strobe control */
+	//{0x3921,0x00},  //bit[7] shift direction, default 0 positive
+	{0x3924, 0x00},  //strobe shift[7:0]
+	{0x3925, 0x00},  //span[31:24]
+	{0x3926, 0x00},  //span[23:16]
+
+	{0x3927, OV9282_STROBE_TIME_REG >> 8},	//span[15:8]
+	{0x3928, OV9282_STROBE_TIME_REG & 0xff},//span[7:0]  exposure 0xa4
+	{REG_NULL, 0x00},
+};
+
 static const struct ov9281_mode supported_modes[] = {
+	{
+		.width = 1280,
+		.height = 800,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x0320,
+		.hts_def = 0x02d8,
+		.vts_def = 0x0e48,
+		.reg_list = ov9281_1280x800_30fps_regs,
+	},
+
 	{
 		.width = 1280,
 		.height = 800,

commit d2fa3651f89f4130db071eadc95bd07172183e8d
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Fri Jun 18 14:51:27 2021 +0800

    drm/bridge: synopsys: dw-hdmi: add 1024x768p60 to default mode
    
    Some traditional display devices like use 1024x768p60 resolution, so we
    add this mode to default mode when parse edid failed.
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: Ibb67898f8b0cc7b98f988a783f8eb4c28aa18359

diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index 5b2f8a2d8129..df2d6856f977 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -222,6 +222,10 @@ static const struct drm_display_mode dw_hdmi_default_modes[] = {
 		   1760, 1980, 0, 720, 725, 730, 750, 0,
 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
 	  .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+	/* 0x10 - 1024x768@60Hz */
+	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048,
+		   1184, 1344, 0,  768, 771, 777, 806, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
 	/* 17 - 720x576@50Hz 4:3 */
 	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
 		   796, 864, 0, 576, 581, 586, 625, 0,

commit 6619bf068adcb89d79e440564abd83fbb3d3970a
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Fri Jun 18 14:50:59 2021 +0800

    drm/rockchip: add 1024x768p60 to default output mode
    
    Some traditional display devices like use 1024x768p60 resolution,
    so we add this mode to default mode when parse edid failed.
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: I0acd1241d84ae65d415f595d6147fed3da0b2f20

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index ebbfb9e26d9a..a9ca58b0e8ac 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -170,6 +170,10 @@ static const struct drm_display_mode rockchip_drm_default_modes[] = {
 		   1760, 1980, 0, 720, 725, 730, 750, 0,
 		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
 	  .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
+	/* 0x10 - 1024x768@60Hz */
+	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048,
+		   1184, 1344, 0,  768, 771, 777, 806, 0,
+		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
 	/* 17 - 720x576@50Hz 4:3 */
 	{ DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
 		   796, 864, 0, 576, 581, 586, 625, 0,

commit a5952d0f07c9126cdfab7be8224af4450ec09d7c
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Wed Jun 16 20:17:02 2021 +0800

    drm/bridge: analogix_dp: add default mode when get edid failed
    
    This will used when product use edp2hdmi or edp2vga output.
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: Idf02a0d1e1bcef579fb3d6117a5e89744bdaac8a

diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
index 9c4223029675..0d5926dbf947 100644
--- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
+++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
@@ -223,6 +223,7 @@ static int rockchip_dp_get_modes(struct analogix_dp_plat_data *plat_data,
 	struct drm_display_info *di = &connector->display_info;
 	/* VOP couldn't output YUV video format for eDP rightly */
 	u32 mask = DRM_COLOR_FORMAT_YCRCB444 | DRM_COLOR_FORMAT_YCRCB422;
+	int ret = 0;
 
 	if ((di->color_formats & mask)) {
 		DRM_DEBUG_KMS("Swapping display color format from YUV to RGB\n");
@@ -231,7 +232,12 @@ static int rockchip_dp_get_modes(struct analogix_dp_plat_data *plat_data,
 		di->bpc = 8;
 	}
 
-	return 0;
+	if (list_empty(&connector->probed_modes) && !plat_data->panel) {
+		ret = rockchip_drm_add_modes_noedid(connector);
+		DRM_ERROR("analogix dp get edid mode failed, use default mode\n");
+	}
+
+	return ret;
 }
 
 static int rockchip_dp_bridge_attach(struct analogix_dp_plat_data *plat_data,

commit 8eed8785c49e04cc65f93579823c5a5334971bed
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Fri Jun 25 17:20:56 2021 +0800

    media: i2c: ov8858 increase vts by add sensor PLL clk
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I38e65fb4bfa6021b5f8cea3c2314cacf334dda6d

diff --git a/drivers/media/i2c/ov8858.c b/drivers/media/i2c/ov8858.c
index 0d72a5754b80..a991c196aea7 100644
--- a/drivers/media/i2c/ov8858.c
+++ b/drivers/media/i2c/ov8858.c
@@ -1788,8 +1788,8 @@ static const struct regval ov8858_3264x2448_regs_r2a_4lane[] = {
 	{0x380b, 0x90}, // y output size L
 	{0x380c, 0x07}, // HTS H
 	{0x380d, 0x94}, // HTS L
-	{0x380e, 0x09}, // VTS H
-	{0x380f, 0xaa}, // VTS L
+	{0x380e, 0x0a}, // VTS H
+	{0x380f, 0x00}, // VTS L
 	{0x3814, 0x01}, // x odd inc
 	{0x3821, 0x46}, // mirror on, bin off
 	{0x382a, 0x01}, // y odd inc
@@ -1807,6 +1807,7 @@ static const struct regval ov8858_3264x2448_regs_r2a_4lane[] = {
 	{0x4600, 0x01},
 	{0x4601, 0x97},
 	{0x382d, 0xff},
+	{0x030d, 0x1f},
 	{REG_NULL, 0x00},
 };
 
@@ -1889,7 +1890,7 @@ static const struct ov8858_mode supported_modes_r2a_4lane[] = {
 		},
 		.exp_def = 0x09a0,
 		.hts_def = 0x0794 * 2,
-		.vts_def = 0x09aa,
+		.vts_def = 0x0a00,
 		.reg_list = ov8858_3264x2448_regs_r2a_4lane,
 	},
 };

commit 7b891c4c109941d478675e1ab471d9bcdf654356
Author: Yifeng Zhao <yifeng.zhao@rock-chips.com>
Date:   Wed Jun 30 16:38:13 2021 +0800

    drivers: rk_nand: zftl: fix unexpected gfp: 0x4 (GFP_DMA32) printf
    
    bug:
    [    0.980989] rknandbase v1.2 2021-01-07
    [    0.981645] rknand fe330000.nandc: rknand_probe clk rate = 148500000
    [    0.981862] Unexpected gfp: 0x4 (GFP_DMA32). Fixing up to gfp: 0x6000c0 (GFP_KERNEL). Fix your code!
    [    0.981875] CPU: 3 PID: 1 Comm: swapper/0 Not tainted 4.19.193 #35
    [    0.981889] Hardware name: Rockchip RK3566 EVB1 DDR4 V10 Board (DT)
    [    0.981901] Call trace:
    [    0.981921]  dump_backtrace+0x0/0x15c
    [    0.981934]  show_stack+0x14/0x1c
    [    0.981949]  dump_stack+0xb8/0xf0
    [    0.981963]  ___slab_alloc+0x5c4/0x5d8
    [    0.981975]  __kmalloc+0x230/0x348
    [    0.981989]  ftl_malloc+0x18/0x20
    [    0.982002]  rk_ftl_init+0x5c/0x33c
    [    0.982017]  rknand_dev_init+0x64/0x3e0
    [    0.982028]  rknand_driver_init+0x3c/0x40
    [    0.982040]  do_one_initcall+0x90/0x270
    [    0.982053]  do_initcall_level+0xbc/0x160
    [    0.982064]  do_basic_setup+0x30/0x48
    [    0.982074]  kernel_init_freeable+0xb0/0x134
    [    0.982085]  kernel_init+0x14/0x290
    [    0.982096]  ret_from_fork+0x10/0x18
    
    Signed-off-by: Yifeng Zhao <yifeng.zhao@rock-chips.com>
    Change-Id: I8fe8eaee13a63e8d6df077ab9d5d004d583f2aa6

diff --git a/drivers/rk_nand/rk_zftl_arm64.S b/drivers/rk_nand/rk_zftl_arm64.S
index e2ded818efc9..ea8c92930f86 100644
--- a/drivers/rk_nand/rk_zftl_arm64.S
+++ b/drivers/rk_nand/rk_zftl_arm64.S
@@ -5,7 +5,7 @@
  * 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.
- * date: 2021-06-16
+ * date: 2021-06-30
  * function: rk ftl v6 for rockchip soc base on arm v8 to support 3D/2D
  *	     TLC and MLC.
  */
@@ -26946,7 +26946,7 @@ rk_ftl_init:
 	mov	w0, 136
 	strb	wzr, [x19, 496]
 	str	wzr, [x19, 248]
-	bl	ftl_malloc
+	bl	ftl_dma32_malloc
 	str	x0, [x19, 232]
 	cbnz	x0, .L4174
 .L4176:
@@ -26959,7 +26959,7 @@ rk_ftl_init:
 	ret
 .L4174:
 	mov	w0, 2048
-	bl	ftl_malloc
+	bl	ftl_dma32_malloc
 	add	x1, x19, 512
 	stp	x0, xzr, [x19, 504]
 	str	xzr, [x19, 240]
@@ -29119,93 +29119,94 @@ StorageSysDataDeInit:
 	.type	rk_ftl_vendor_storage_init, %function
 rk_ftl_vendor_storage_init:
 	stp	x29, x30, [sp, -80]!
-	mov	w0, 65536
 	add	x29, sp, 0
 	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR5
 	add	x20, x19, :lo12:.LANCHOR5
 	stp	x21, x22, [sp, 32]
 	stp	x23, x24, [sp, 48]
-	stp	x25, x26, [sp, 64]
+	str	x25, [sp, 64]
+	ldr	x0, [x20, 1112]
+	cbnz	x0, .L4500
+	mov	w0, 65536
 	bl	ftl_malloc
 	str	x0, [x20, 1112]
+.L4500:
+	add	x19, x19, :lo12:.LANCHOR5
+	ldr	x0, [x19, 1112]
 	cbz	x0, .L4505
-	adrp	x24, .LC337
-	mov	w26, 22084
-	mov	x22, x19
-	add	x24, x24, :lo12:.LC337
-	mov	w25, 0
-	mov	w23, 0
+	adrp	x23, .LC337
+	mov	w25, 22084
+	add	x23, x23, :lo12:.LC337
+	mov	w24, 0
+	mov	w22, 0
 	mov	w21, 0
-	movk	w26, 0x524b, lsl 16
+	movk	w25, 0x524b, lsl 16
 .L4503:
-	ldr	x2, [x20, 1112]
+	ldr	x2, [x19, 1112]
 	mov	w1, 128
 	lsl	w0, w21, 7
 	bl	FlashBootVendorRead
-	cbnz	w0, .L4501
-	ldr	x0, [x20, 1112]
+	cbnz	w0, .L4506
+	ldr	x0, [x19, 1112]
 	add	x1, x0, 61440
 	ldr	w3, [x0, 4]
 	ldr	w2, [x1, 4092]
 	ldr	w1, [x0]
-	mov	x0, x24
+	mov	x0, x23
 	bl	printk
-	ldr	x19, [x20, 1112]
-	ldr	w0, [x19]
-	cmp	w0, w26
+	ldr	x20, [x19, 1112]
+	ldr	w0, [x20]
+	cmp	w0, w25
 	bne	.L4502
-	add	x0, x19, 61440
-	ldr	w1, [x19, 4]
+	add	x0, x20, 61440
+	ldr	w1, [x20, 4]
 	ldr	w0, [x0, 4092]
 	cmp	w0, w1
 	bne	.L4502
-	cmp	w0, w23
+	cmp	w0, w22
 	bls	.L4502
-	mov	w25, w21
-	mov	w23, w0
+	mov	w24, w21
+	mov	w22, w0
 .L4502:
 	add	w21, w21, 1
 	cmp	w21, 2
 	bne	.L4503
-	cbz	w23, .L4504
-	mov	x2, x19
+	cbz	w22, .L4504
+	mov	x2, x20
 	mov	w1, 128
-	lsl	w0, w25, 7
+	lsl	w0, w24, 7
 	bl	FlashBootVendorRead
-	cbnz	w0, .L4501
+	cmp	w0, 0
+	csetm	w0, ne
 .L4499:
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
-	ldp	x25, x26, [sp, 64]
+	ldr	x25, [sp, 64]
 	ldp	x29, x30, [sp], 80
 	ret
 .L4504:
 	mov	w1, 0
 	mov	x2, 65536
-	mov	x0, x19
+	mov	x0, x20
 	bl	memset
 	mov	w1, 22084
 	mov	w0, 1
 	movk	w1, 0x524b, lsl 16
-	stp	w1, w0, [x19]
-	add	x1, x19, 61440
+	stp	w1, w0, [x20]
+	add	x1, x20, 61440
 	str	w0, [x1, 4092]
 	mov	w0, -1032
-	strh	w0, [x19, 14]
+	strh	w0, [x20, 14]
 	mov	w0, 0
 	b	.L4499
-.L4501:
-	add	x22, x22, :lo12:.LANCHOR5
-	ldr	x0, [x22, 1112]
-	bl	kfree
-	str	xzr, [x22, 1112]
-	mov	w0, -1
-	b	.L4499
 .L4505:
 	mov	w0, -12
 	b	.L4499
+.L4506:
+	mov	w0, -1
+	b	.L4499
 	.size	rk_ftl_vendor_storage_init, .-rk_ftl_vendor_storage_init
 	.align	2
 	.global	rk_ftl_vendor_read
@@ -29213,20 +29214,20 @@ rk_ftl_vendor_storage_init:
 rk_ftl_vendor_read:
 	adrp	x3, .LANCHOR5+1112
 	ldr	x4, [x3, #:lo12:.LANCHOR5+1112]
-	cbz	x4, .L4513
+	cbz	x4, .L4514
 	ldrh	w6, [x4, 10]
 	add	x5, x4, 16
 	mov	w3, 0
-.L4510:
+.L4511:
 	cmp	w3, w6
-	bcc	.L4512
-.L4513:
+	bcc	.L4513
+.L4514:
 	mov	w0, -1
 	ret
-.L4512:
+.L4513:
 	ldrh	w7, [x5], 8
 	cmp	w7, w0
-	bne	.L4511
+	bne	.L4512
 	stp	x29, x30, [sp, -32]!
 	add	x3, x4, w3, uxtw 3
 	mov	x0, x1
@@ -29244,9 +29245,9 @@ rk_ftl_vendor_read:
 	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
-.L4511:
+.L4512:
 	add	w3, w3, 1
-	b	.L4510
+	b	.L4511
 	.size	rk_ftl_vendor_read, .-rk_ftl_vendor_read
 	.align	2
 	.global	rk_ftl_vendor_write
@@ -29261,7 +29262,7 @@ rk_ftl_vendor_write:
 	stp	x23, x24, [sp, 48]
 	stp	x25, x26, [sp, 64]
 	stp	x27, x28, [sp, 80]
-	cbz	x19, .L4533
+	cbz	x19, .L4534
 	add	w4, w2, 63
 	ldrh	w3, [x19, 10]
 	ldrh	w24, [x19, 8]
@@ -29270,12 +29271,12 @@ rk_ftl_vendor_write:
 	and	w22, w4, -64
 	add	x1, x19, 16
 	mov	w20, 0
-.L4520:
+.L4521:
 	cmp	w20, w3
-	bcc	.L4528
+	bcc	.L4529
 	ldrh	w1, [x19, 14]
 	cmp	w22, w1
-	bhi	.L4533
+	bhi	.L4534
 	add	x3, x19, w3, uxth 3
 	strh	w0, [x3, 16]
 	and	w0, w22, 65535
@@ -29295,11 +29296,11 @@ rk_ftl_vendor_write:
 	ldrh	w0, [x19, 10]
 	add	w0, w0, 1
 	strh	w0, [x19, 10]
-	b	.L4535
-.L4528:
+	b	.L4536
+.L4529:
 	ldrh	w6, [x1], 8
 	cmp	w6, w0
-	bne	.L4521
+	bne	.L4522
 	uxtw	x23, w20
 	add	x5, x19, 1024
 	add	x21, x19, x23, lsl 3
@@ -29307,17 +29308,17 @@ rk_ftl_vendor_write:
 	add	w25, w25, 63
 	and	w25, w25, -64
 	cmp	w26, w25
-	bls	.L4522
+	bls	.L4523
 	ldrh	w0, [x19, 14]
 	cmp	w22, w0
-	bhi	.L4533
+	bhi	.L4534
 	add	x23, x23, 2
 	ldrh	w21, [x21, 18]
 	add	x23, x19, x23, lsl 3
 	sub	w3, w3, #1
-.L4523:
+.L4524:
 	cmp	w20, w3
-	bcc	.L4524
+	bcc	.L4525
 	add	x20, x19, w20, uxtw 3
 	and	w21, w21, 65535
 	add	x0, x5, w21, uxth
@@ -29334,7 +29335,7 @@ rk_ftl_vendor_write:
 	sub	w0, w0, w4
 	add	w25, w0, w25
 	strh	w25, [x19, 14]
-.L4535:
+.L4536:
 	ldr	w0, [x19, 4]
 	add	x1, x19, 61440
 	mov	x2, x19
@@ -29351,7 +29352,7 @@ rk_ftl_vendor_write:
 	lsl	w0, w24, 7
 	bl	FlashBootVendorWrite
 	mov	w0, 0
-.L4518:
+.L4519:
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
@@ -29359,7 +29360,7 @@ rk_ftl_vendor_write:
 	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 112
 	ret
-.L4524:
+.L4525:
 	add	w20, w20, 1
 	stp	w3, w6, [x29, 96]
 	add	x0, x19, w20, uxtw 3
@@ -29381,111 +29382,111 @@ rk_ftl_vendor_write:
 	add	w21, w21, w27
 	ldr	x5, [x29, 104]
 	ldp	w3, w6, [x29, 96]
-	b	.L4523
-.L4522:
+	b	.L4524
+.L4523:
 	ldrh	w0, [x21, 18]
 	uxtw	x2, w26
 	mov	x1, x28
 	add	x0, x5, x0
 	bl	memcpy
 	strh	w26, [x21, 20]
-	b	.L4535
-.L4521:
+	b	.L4536
+.L4522:
 	add	w20, w20, 1
-	b	.L4520
-.L4533:
+	b	.L4521
+.L4534:
 	mov	w0, -1
-	b	.L4518
+	b	.L4519
 	.size	rk_ftl_vendor_write, .-rk_ftl_vendor_write
 	.align	2
 	.global	rk_ftl_vendor_storage_ioctl
 	.type	rk_ftl_vendor_storage_ioctl, %function
 rk_ftl_vendor_storage_ioctl:
 	stp	x29, x30, [sp, -48]!
-	mov	w0, 4096
+	mov	w0, 9216
 	add	x29, sp, 0
 	stp	x19, x20, [sp, 16]
 	mov	x20, x2
 	str	x21, [sp, 32]
 	mov	w21, w1
 	bl	ftl_malloc
-	cbz	x0, .L4544
+	cbz	x0, .L4545
 	mov	w1, 30209
 	mov	x19, x0
 	movk	w1, 0x4004, lsl 16
 	cmp	w21, w1
-	beq	.L4539
+	beq	.L4540
 	add	w1, w1, 1
 	cmp	w21, w1
-	beq	.L4540
-.L4550:
+	beq	.L4541
+.L4551:
 	mov	x20, -14
-	b	.L4538
-.L4539:
+	b	.L4539
+.L4540:
 	mov	x2, 8
 	mov	x1, x20
 	bl	rk_copy_from_user
-	cbnz	x0, .L4550
+	cbnz	x0, .L4551
 	ldr	w1, [x19]
 	mov	w0, 17745
 	movk	w0, 0x5652, lsl 16
 	cmp	w1, w0
-	beq	.L4542
-.L4543:
+	beq	.L4543
+.L4544:
 	mov	x20, -1
-.L4538:
+.L4539:
 	mov	x0, x19
 	bl	kfree
-.L4536:
+.L4537:
 	mov	x0, x20
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
-.L4542:
+.L4543:
 	ldrh	w2, [x19, 6]
 	add	x1, x19, 8
 	ldrh	w0, [x19, 4]
 	bl	rk_ftl_vendor_read
 	cmn	w0, #1
-	beq	.L4543
+	beq	.L4544
 	strh	w0, [x19, 6]
 	and	x0, x0, 65535
 	add	x2, x0, 8
 	mov	x1, x19
 	mov	x0, x20
 	bl	rk_copy_to_user
-	cbnz	x0, .L4550
+	cbnz	x0, .L4551
 	mov	x20, 0
-	b	.L4538
-.L4540:
+	b	.L4539
+.L4541:
 	mov	x2, 8
 	mov	x1, x20
 	bl	rk_copy_from_user
-	cbnz	x0, .L4550
+	cbnz	x0, .L4551
 	ldr	w1, [x19]
 	mov	w0, 17745
 	movk	w0, 0x5652, lsl 16
 	cmp	w1, w0
-	bne	.L4543
+	bne	.L4544
 	ldrh	w2, [x19, 6]
 	cmp	w2, 4087
-	bhi	.L4543
+	bhi	.L4544
 	add	w2, w2, 8
 	mov	x1, x20
 	sxtw	x2, w2
 	mov	x0, x19
 	bl	rk_copy_from_user
-	cbnz	x0, .L4550
+	cbnz	x0, .L4551
 	ldrh	w2, [x19, 6]
 	add	x1, x19, 8
 	ldrh	w0, [x19, 4]
 	bl	rk_ftl_vendor_write
 	sxtw	x20, w0
-	b	.L4538
-.L4544:
+	b	.L4539
+.L4545:
 	mov	x20, -1
-	b	.L4536
+	b	.L4537
 	.size	rk_ftl_vendor_storage_ioctl, .-rk_ftl_vendor_storage_ioctl
 	.global	SecureBootUnlockTryCount
 	.global	SecureBootCheckOK

commit 2a520d73f0926783c570a072a04a36a742c36bd4
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Sat Jun 5 14:48:58 2021 +0800

    media: add motor driver fp5501 for camera focus/zoom
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: Ia417598fb196e320d82ff03fcfd921d89c6a762b

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index ccc865a742ca..5812988f4d5c 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -368,6 +368,12 @@ config VIDEO_DW9807_VCM
 	  capability. This is designed for linear control of
 	  voice coil motors, controlled via I2C serial interface.
 
+config VIDEO_FP5501
+	tristate "FP5501 step motor driver for camera focus/zoom"
+	depends on VIDEO_V4L2 && MEDIA_CONTROLLER
+	help
+	  This a driver used GPIO to drive motor
+
 config VIDEO_FP5510
 	tristate "FP5510 lens voice coil support"
 	depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index 20a8c6fd8ac5..3eab36772fa9 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -30,6 +30,7 @@ obj-$(CONFIG_VIDEO_AK7375)  += ak7375.o
 obj-$(CONFIG_VIDEO_DW9714)  += dw9714.o
 obj-$(CONFIG_VIDEO_DW9718)  += dw9718.o
 obj-$(CONFIG_VIDEO_DW9807_VCM)  += dw9807-vcm.o
+obj-$(CONFIG_VIDEO_FP5501)	+= fp5501.o
 obj-$(CONFIG_VIDEO_FP5510)	+= fp5510.o
 obj-$(CONFIG_VIDEO_GT9760S)	+= gt9760s.o
 obj-$(CONFIG_VIDEO_VM149C)	+= vm149c.o
diff --git a/drivers/media/i2c/fp5501.c b/drivers/media/i2c/fp5501.c
new file mode 100644
index 000000000000..773b3db8e5fc
--- /dev/null
+++ b/drivers/media/i2c/fp5501.c
@@ -0,0 +1,1052 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * motor  driver
+ *
+ * Copyright (C) 2020 Rockchip Electronics Co., Ltd.
+ *
+ */
+//#define DEBUG
+#include <linux/io.h>
+#include <linux/of_gpio.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/device.h>
+#include <linux/fb.h>
+#include <linux/interrupt.h>
+#include <linux/kernel.h>
+#include <linux/gpio/consumer.h>
+#include <linux/of_irq.h>
+#include <linux/platform_device.h>
+#include <linux/wakelock.h>
+#include <linux/hrtimer.h>
+#include <linux/pwm.h>
+#include <linux/delay.h>
+#include <media/v4l2-subdev.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <linux/version.h>
+#include <linux/rk-camera-module.h>
+#include <linux/completion.h>
+#include <linux/rk_vcm_head.h>
+
+#define DRIVER_VERSION	KERNEL_VERSION(0, 0x01, 0x00)
+
+#define DRIVER_NAME "fp5501"
+
+#define MAX_START_UP_HZ			(500)
+
+#define FOCUS_MAX_STEP_DEF		7500
+#define ZOOM_MAX_STEP_DEF		7500
+
+#define FOCUS_MAX_BACK_DELAY		4
+#define ZOOM_MAX_BACK_DELAY		4
+
+#define MOTOR_PHASE_PINS (4)
+#define PHASE_TYPES (4)
+
+static u8 phases_cw[PHASE_TYPES] = {0x09, 0x0c, 0x06, 0x03};
+
+enum {
+	MOTOR_STATUS_STOPPED = 0,
+	MOTOR_STATUS_CW = 1,
+	MOTOR_STATUS_CCW = 2,
+};
+
+enum ext_dev_type {
+	TYPE_FOCUS = 1,
+	TYPE_ZOOM = 2,
+};
+
+struct ext_dev {
+	u8 type;
+	u32 step_max;
+	u32 last_pos;
+	u32 step_cnt;
+	u32 cur_step_cnt;
+	u32 move_status;
+	u32 last_status;
+	u32 reback;
+	u32 reback_status;
+	u32 phase_index;
+	u32 cur_back_delay;
+	u32 max_back_delay;
+	bool is_need_reback;
+	bool is_need_update_tim;
+	bool is_running;
+	bool is_dir_opp;
+	bool reback_ctrl;
+	struct rk_cam_vcm_tim mv_tim;
+	struct completion comp_in;
+	struct completion comp_out;
+	struct gpio_desc *phase_gpios[MOTOR_PHASE_PINS];
+};
+
+struct motor_dev {
+	struct v4l2_subdev sd;
+	struct v4l2_ctrl_handler ctrl_handler;
+	struct v4l2_ctrl *focus_ctrl;
+	struct v4l2_ctrl *zoom_ctrl;
+	struct device *dev;
+	struct hrtimer timer;
+	u64 phase_interval_ns;
+	u32 start_up_speed;
+	u32 module_index;
+	bool is_timer_restart;
+	const char *module_facing;
+	spinlock_t spin_lock;
+	struct ext_dev focus;
+	struct ext_dev zoom;
+};
+
+static int set_motor_running_status(struct motor_dev *motor,
+				    struct ext_dev *ext_dev,
+				    u32 pos, bool is_need_reback)
+{
+	int ret = 0;
+	u32 mv_cnt = 0;
+	int status = 0;
+	unsigned long lock_flags = 0;
+
+	if (ext_dev->move_status != MOTOR_STATUS_STOPPED)
+		wait_for_completion(&ext_dev->comp_in);
+	mv_cnt = abs(pos - ext_dev->last_pos);
+	if (is_need_reback)
+		mv_cnt += ext_dev->reback;
+	if (mv_cnt == 0)
+		return 0;
+	reinit_completion(&ext_dev->comp_in);
+	if (ext_dev->is_dir_opp) {
+		if (pos > ext_dev->last_pos)
+			status = MOTOR_STATUS_CCW;
+		else
+			status = MOTOR_STATUS_CW;
+	} else {
+		if (pos > ext_dev->last_pos)
+			status = MOTOR_STATUS_CW;
+		else
+			status = MOTOR_STATUS_CCW;
+	}
+	if (ext_dev->last_status != MOTOR_STATUS_STOPPED &&
+	    ext_dev->last_status != status)
+		msleep(130);
+	ext_dev->last_status = status;
+	ext_dev->last_pos = pos;
+	spin_lock_irqsave(&motor->spin_lock, lock_flags);
+	ext_dev->move_status = status;
+	ext_dev->is_need_reback = is_need_reback;
+	ext_dev->step_cnt = mv_cnt + 1;
+	ext_dev->cur_step_cnt = ext_dev->step_cnt;
+	ext_dev->is_need_update_tim = true;
+
+	if (motor->is_timer_restart == false) {
+		motor->is_timer_restart = true;
+		spin_unlock_irqrestore(&motor->spin_lock, lock_flags);
+		hrtimer_start(&motor->timer, ktime_set(0, 0), HRTIMER_MODE_REL_PINNED);
+	} else {
+		spin_unlock_irqrestore(&motor->spin_lock, lock_flags);
+	}
+	ext_dev->is_running = true;
+	dev_dbg(motor->dev,
+		"ext tpye %d, mv_cnt %d, status %d, is_need_reback %d, reback %d, reback status %d\n",
+		ext_dev->type, ext_dev->cur_step_cnt, status,
+		is_need_reback, ext_dev->reback, ext_dev->reback_status);
+
+	return ret;
+}
+
+static void motor_gpio_set_phase(struct ext_dev *dev, int phase_index)
+{
+	int i;
+	int ctrl = phases_cw[phase_index];
+
+	for (i = 0; i < MOTOR_PHASE_PINS; i++)
+		gpiod_set_value(dev->phase_gpios[i], (ctrl >> i) & 0x1);
+}
+
+static void motor_gpio_set_stop(struct ext_dev *dev)
+{
+	int i = 0;
+
+	if (dev->is_running) {
+		for (i = 0; i < MOTOR_PHASE_PINS; i++)
+			gpiod_set_value(dev->phase_gpios[i], 0);
+	}
+}
+
+static void motor_set_config(struct ext_dev *dev)
+{
+	int phase_types = PHASE_TYPES;
+
+	if (dev->cur_step_cnt != 0) {
+		if (dev->step_cnt == dev->cur_step_cnt) {
+			if (dev->is_need_update_tim) {
+				dev->mv_tim.vcm_start_t = ns_to_timeval(ktime_get_ns());
+				dev->is_need_update_tim  = false;
+			}
+		} else {
+			if (dev->move_status == MOTOR_STATUS_CW)
+				dev->phase_index = (dev->phase_index + 1) % phase_types;
+			else
+				dev->phase_index = (dev->phase_index - 1) % phase_types;
+		}
+		motor_gpio_set_phase(dev, dev->phase_index);
+		dev->cur_step_cnt--;
+	} else {
+		if (dev->is_need_reback) {
+			if (dev->cur_back_delay < dev->max_back_delay) {
+				if (dev->cur_back_delay == 0)
+					motor_gpio_set_stop(dev);
+				dev->cur_back_delay++;
+			} else {
+				dev->cur_step_cnt = dev->reback + 1;
+				dev->step_cnt = dev->reback + 1;
+				dev->move_status = dev->reback_status;
+				dev->last_status = dev->reback_status;
+				dev->cur_back_delay = 0;
+				dev->is_need_reback = false;
+			}
+		} else {
+			motor_gpio_set_stop(dev);
+			dev->move_status = MOTOR_STATUS_STOPPED;
+			dev->mv_tim.vcm_end_t = ns_to_timeval(ktime_get_ns());
+			dev->is_running = false;
+			complete(&dev->comp_out);
+			complete(&dev->comp_in);
+		}
+	}
+}
+static enum hrtimer_restart motor_timer_func(struct hrtimer *timer)
+{
+	struct motor_dev *motor;
+	unsigned long lock_flags = 0;
+	static struct timeval tv_last = {0};
+	struct timeval tv = {0};
+	u64 time_dist = 0;
+
+	motor = container_of(timer, struct motor_dev, timer);
+
+	do_gettimeofday(&tv);
+	time_dist = tv.tv_sec * 1000000 + tv.tv_usec - (tv_last.tv_sec * 1000000 + tv_last.tv_usec);
+	tv_last = tv;
+	if (abs(time_dist * 1000 - motor->phase_interval_ns) > 250000)
+		dev_dbg(motor->dev,
+			 "focus cnt %d, zoom cnt %d, Current interrupt interval %llu\n",
+			 motor->focus.cur_step_cnt, motor->zoom.cur_step_cnt, time_dist);
+	spin_lock_irqsave(&motor->spin_lock, lock_flags);
+	if (motor->focus.move_status != MOTOR_STATUS_STOPPED)
+		motor_set_config(&motor->focus);
+	if (motor->zoom.move_status != MOTOR_STATUS_STOPPED)
+		motor_set_config(&motor->zoom);
+	if (motor->focus.move_status == MOTOR_STATUS_STOPPED &&
+	    motor->zoom.move_status == MOTOR_STATUS_STOPPED)
+		motor->is_timer_restart = false;
+
+	if (motor->is_timer_restart) {
+		spin_unlock_irqrestore(&motor->spin_lock, lock_flags);
+		do_gettimeofday(&tv);
+		time_dist = tv.tv_sec * 1000000 + tv.tv_usec - (tv_last.tv_sec * 1000000 + tv_last.tv_usec);
+		hrtimer_forward_now(timer,
+				    ns_to_ktime(motor->phase_interval_ns + (time_dist * 1000)));
+		return HRTIMER_RESTART;
+	} else {
+		spin_unlock_irqrestore(&motor->spin_lock, lock_flags);
+	}
+	return HRTIMER_NORESTART;
+}
+
+static void wait_for_motor_stop(struct motor_dev *motor, struct ext_dev *dev)
+{
+	unsigned long ret = 0;
+
+	if (dev->is_running) {
+		reinit_completion(&dev->comp_out);
+		ret = wait_for_completion_timeout(&dev->comp_out, 16 * HZ);
+		if (ret == 0)
+			dev_info(motor->dev,
+				 "wait for complete timeout\n");
+	}
+}
+
+static int motor_s_ctrl(struct v4l2_ctrl *ctrl)
+{
+	int ret = 0;
+	struct motor_dev *motor = container_of(ctrl->handler,
+					     struct motor_dev, ctrl_handler);
+	bool is_need_reback = false;
+
+	switch (ctrl->id) {
+	case V4L2_CID_FOCUS_ABSOLUTE:
+		if (motor->focus.reback_ctrl) {
+			if (ctrl->val >= motor->focus.last_pos)
+				is_need_reback = false;
+			else
+				is_need_reback = true;
+		}
+		ret = set_motor_running_status(motor,
+					       &motor->focus,
+					       ctrl->val,
+					       is_need_reback);
+		wait_for_motor_stop(motor, &motor->focus);
+		dev_dbg(motor->dev, "set focus pos %d\n", ctrl->val);
+		break;
+	case V4L2_CID_ZOOM_ABSOLUTE:
+		if (motor->zoom.reback_ctrl) {
+			if (ctrl->val >= motor->zoom.last_pos)
+				is_need_reback = false;
+			else
+				is_need_reback = true;
+		}
+		ret = set_motor_running_status(motor,
+					       &motor->zoom,
+					       ctrl->val,
+					       is_need_reback);
+		wait_for_motor_stop(motor, &motor->zoom);
+		dev_dbg(motor->dev, "set zoom pos %d\n", ctrl->val);
+		break;
+	default:
+		dev_err(motor->dev, "not support cmd %d\n", ctrl->id);
+		break;
+	}
+	return ret;
+}
+
+static int motor_set_zoom_follow(struct motor_dev *motor, struct rk_cam_set_zoom *mv_param)
+{
+	int i = 0;
+	bool is_need_zoom_reback = mv_param->is_need_zoom_reback;
+	bool is_need_focus_reback = mv_param->is_need_focus_reback;
+
+	for (i = 0; i < mv_param->setzoom_cnt; i++) {
+		if (i == (mv_param->setzoom_cnt - 1)) {
+			set_motor_running_status(motor,
+						 &motor->focus,
+						 mv_param->zoom_pos[i].focus_pos,
+						 is_need_focus_reback);
+			set_motor_running_status(motor,
+						 &motor->zoom,
+						 mv_param->zoom_pos[i].zoom_pos,
+						 is_need_zoom_reback);
+		} else {
+			set_motor_running_status(motor,
+						 &motor->focus,
+						 mv_param->zoom_pos[i].focus_pos,
+						 false);
+			set_motor_running_status(motor,
+						 &motor->zoom,
+						 mv_param->zoom_pos[i].zoom_pos,
+						 false);
+		}
+		dev_dbg(motor->dev,
+			"%s zoom %d, focus %d, i %d\n",
+			__func__,
+			mv_param->zoom_pos[i].zoom_pos,
+			mv_param->zoom_pos[i].focus_pos,
+			i);
+	}
+	wait_for_motor_stop(motor, &motor->focus);
+	wait_for_motor_stop(motor, &motor->zoom);
+	return 0;
+}
+
+static int motor_set_focus(struct motor_dev *motor, struct rk_cam_set_focus *mv_param)
+{
+	int ret = 0;
+	bool is_need_reback = mv_param->is_need_reback;
+
+#ifdef REBACK_CTRL_BY_DRV
+	if (mv_param->focus_pos >= motor->focus.last_pos)
+		is_need_reback = false;
+	else
+		is_need_reback = true;
+#endif
+	ret = set_motor_running_status(motor,
+				       &motor->focus,
+				       mv_param->focus_pos,
+				       is_need_reback);
+	wait_for_motor_stop(motor, &motor->focus);
+
+	return ret;
+}
+
+static int motor_reinit_focus(struct motor_dev *motor)
+{
+	int ret = 0;
+
+	motor->focus.last_pos = motor->focus.step_max;
+	ret = set_motor_running_status(motor,
+				       &motor->focus,
+				       0,
+				       true);
+	wait_for_motor_stop(motor, &motor->focus);
+
+	return ret;
+}
+
+static void motor_reinit_focus_pos(struct motor_dev *motor)
+{
+	motor_reinit_focus(motor);
+	motor->focus.last_pos = 0;
+	__v4l2_ctrl_modify_range(motor->focus_ctrl, 0,
+				 motor->focus.step_max - motor->focus.reback,
+				 1, 0);
+}
+
+static int  motor_reinit_zoom(struct motor_dev *motor)
+{
+	int ret = 0;
+
+	motor->zoom.last_pos = motor->zoom.step_max;
+	ret = set_motor_running_status(motor,
+				       &motor->zoom,
+				       0,
+				       true);
+	wait_for_motor_stop(motor, &motor->zoom);
+	return ret;
+}
+
+static void motor_reinit_zoom_pos(struct motor_dev *motor)
+{
+	motor_reinit_zoom(motor);
+	motor->zoom.last_pos = 0;
+	__v4l2_ctrl_modify_range(motor->zoom_ctrl, 0,
+				 motor->zoom.step_max - motor->zoom.reback,
+				 1, 0);
+}
+
+static long motor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	struct rk_cam_vcm_tim *mv_tim;
+	struct motor_dev *motor = container_of(sd, struct motor_dev, sd);
+	struct rk_cam_set_zoom *mv_param;
+	struct rk_cam_set_focus *focus_param;
+	struct rk_cam_modify_pos *pos;
+
+	switch (cmd) {
+	case RK_VIDIOC_VCM_TIMEINFO:
+		mv_tim = (struct rk_cam_vcm_tim *)arg;
+		memcpy(mv_tim, &motor->focus.mv_tim, sizeof(*mv_tim));
+
+		dev_dbg(motor->dev, "get_focus_move_tim 0x%lx, 0x%lx, 0x%lx, 0x%lx\n",
+			mv_tim->vcm_start_t.tv_sec,
+			mv_tim->vcm_start_t.tv_usec,
+			mv_tim->vcm_end_t.tv_sec,
+			mv_tim->vcm_end_t.tv_usec);
+		break;
+	case RK_VIDIOC_ZOOM_TIMEINFO:
+		mv_tim = (struct rk_cam_vcm_tim *)arg;
+		memcpy(mv_tim, &motor->zoom.mv_tim, sizeof(*mv_tim));
+
+		dev_dbg(motor->dev, "get_zoom_move_tim 0x%lx, 0x%lx, 0x%lx, 0x%lx\n",
+			mv_tim->vcm_start_t.tv_sec,
+			mv_tim->vcm_start_t.tv_usec,
+			mv_tim->vcm_end_t.tv_sec,
+			mv_tim->vcm_end_t.tv_usec);
+		break;
+	case RK_VIDIOC_FOCUS_CORRECTION:
+		motor_reinit_focus_pos(motor);
+		break;
+	case RK_VIDIOC_ZOOM_CORRECTION:
+		motor_reinit_zoom_pos(motor);
+		break;
+	case RK_VIDIOC_ZOOM_SET_POSITION:
+		mv_param = (struct rk_cam_set_zoom *)arg;
+		motor_set_zoom_follow(motor, mv_param);
+		break;
+	case RK_VIDIOC_FOCUS_SET_POSITION:
+		focus_param = (struct rk_cam_set_focus *)arg;
+		motor_set_focus(motor, focus_param);
+		break;
+	case RK_VIDIOC_MODIFY_POSITION:
+		pos = (struct rk_cam_modify_pos *)arg;
+		motor->focus.last_pos = pos->focus_pos;
+		motor->zoom.last_pos = pos->zoom_pos;
+		break;
+	default:
+		break;
+	}
+	return 0;
+}
+
+#ifdef CONFIG_COMPAT
+static long motor_compat_ioctl32(struct v4l2_subdev *sd, unsigned int cmd, unsigned long arg)
+{
+	void __user *up = compat_ptr(arg);
+	struct rk_cam_vcm_tim *mv_tim;
+	int ret = 0;
+	u32 val = 0;
+	struct rk_cam_set_zoom *mv_param;
+	struct rk_cam_set_focus *focus_param;
+	struct rk_cam_modify_pos *pos;
+
+	switch (cmd) {
+	case RK_VIDIOC_VCM_TIMEINFO:
+	case RK_VIDIOC_ZOOM_TIMEINFO:
+		mv_tim = kzalloc(sizeof(*mv_tim), GFP_KERNEL);
+		if (!mv_tim) {
+			ret = -ENOMEM;
+			return ret;
+		}
+		ret = motor_ioctl(sd, cmd, mv_tim);
+		if (!ret) {
+			if (copy_to_user(up, mv_tim, sizeof(*mv_tim))) {
+				kfree(mv_tim);
+				return -EFAULT;
+			}
+		}
+		kfree(mv_tim);
+		break;
+	case RK_VIDIOC_FOCUS_CORRECTION:
+	case RK_VIDIOC_ZOOM_CORRECTION:
+		if (copy_from_user(&val, up, sizeof(val)))
+			return -EFAULT;
+		ret = motor_ioctl(sd, cmd, &val);
+		break;
+	case RK_VIDIOC_ZOOM_SET_POSITION:
+		mv_param = kzalloc(sizeof(*mv_param), GFP_KERNEL);
+		if (!mv_param) {
+			ret = -ENOMEM;
+			return ret;
+		}
+		if (copy_from_user(mv_param, up, sizeof(*mv_param))) {
+			kfree(mv_param);
+			return -EFAULT;
+		}
+		ret = motor_ioctl(sd, cmd, mv_param);
+		kfree(mv_param);
+		break;
+	case RK_VIDIOC_FOCUS_SET_POSITION:
+		focus_param = kzalloc(sizeof(*focus_param), GFP_KERNEL);
+		if (!focus_param) {
+			ret = -ENOMEM;
+			return ret;
+		}
+		if (copy_from_user(focus_param, up, sizeof(*focus_param))) {
+			kfree(focus_param);
+			return -EFAULT;
+		}
+		ret = motor_ioctl(sd, cmd, focus_param);
+		kfree(focus_param);
+		break;
+	case RK_VIDIOC_MODIFY_POSITION:
+		pos = kzalloc(sizeof(*pos), GFP_KERNEL);
+		if (!pos) {
+			ret = -ENOMEM;
+			return ret;
+		}
+		if (copy_from_user(pos, up, sizeof(*pos))) {
+			kfree(pos);
+			return -EFAULT;
+		}
+		ret = motor_ioctl(sd, cmd, pos);
+		kfree(pos);
+		break;
+	default:
+		break;
+	}
+	return ret;
+}
+#endif
+
+static int motor_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct motor_dev *motor = container_of(ctrl->handler,
+					     struct motor_dev, ctrl_handler);
+
+	switch (ctrl->id) {
+	case V4L2_CID_FOCUS_ABSOLUTE:
+		ctrl->val = motor->focus.last_pos;
+		return 0;
+	case V4L2_CID_ZOOM_ABSOLUTE:
+		ctrl->val = motor->zoom.last_pos;
+		return 0;
+	}
+	return 0;
+}
+
+static const struct v4l2_subdev_core_ops motor_core_ops = {
+	.ioctl = motor_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = motor_compat_ioctl32
+#endif
+};
+
+static const struct v4l2_subdev_ops motor_subdev_ops = {
+	.core	= &motor_core_ops,
+};
+
+static const struct v4l2_ctrl_ops motor_ctrl_ops = {
+	.g_volatile_ctrl = motor_g_volatile_ctrl,
+	.s_ctrl = motor_s_ctrl,
+};
+
+static int motor_initialize_controls(struct motor_dev *motor)
+{
+	struct v4l2_ctrl_handler *handler;
+	int ret = 0;
+	unsigned long flags = V4L2_CTRL_FLAG_EXECUTE_ON_WRITE | V4L2_CTRL_FLAG_VOLATILE;
+
+	handler = &motor->ctrl_handler;
+	ret = v4l2_ctrl_handler_init(handler, 2);
+	if (ret)
+		return ret;
+	#ifdef REINIT_BOOT
+	ret = motor_reinit_focus(motor);
+	if (ret < 0)
+		return -EINVAL;
+	#endif
+	motor->focus.last_pos = 0;
+	motor->focus_ctrl = v4l2_ctrl_new_std(handler, &motor_ctrl_ops,
+			    V4L2_CID_FOCUS_ABSOLUTE, 0,
+			    motor->focus.step_max - motor->focus.reback,
+			    1, 0);
+	if (motor->focus_ctrl)
+		motor->focus_ctrl->flags |= flags;
+	#ifdef REINIT_BOOT
+	ret = motor_reinit_zoom(motor);
+	if (ret < 0)
+		return -EINVAL;
+	#endif
+	motor->zoom.last_pos = 0;
+	motor->zoom_ctrl = v4l2_ctrl_new_std(handler, &motor_ctrl_ops,
+			    V4L2_CID_ZOOM_ABSOLUTE,
+			    0,
+			    motor->zoom.step_max - motor->zoom.reback,
+			    1, 0);
+	if (motor->zoom_ctrl)
+		motor->zoom_ctrl->flags |= flags;
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(motor->dev,
+			"Failed to init controls(%d)\n", ret);
+		goto err_free_handler;
+	}
+
+	motor->sd.ctrl_handler = handler;
+	return ret;
+
+err_free_handler:
+	v4l2_ctrl_handler_free(handler);
+
+	return ret;
+}
+#define USED_SYS_DEBUG
+#ifdef USED_SYS_DEBUG
+
+static ssize_t reinit_focus_pos(struct device *dev,
+	struct device_attribute *attr,
+	const char *buf,
+	size_t count)
+{
+	struct v4l2_subdev *sd = dev_get_drvdata(dev);
+	struct motor_dev *motor = container_of(sd, struct motor_dev, sd);
+	int val = 0;
+	int ret = 0;
+
+	ret = kstrtoint(buf, 0, &val);
+	if (!ret) {
+		if (val == 1)
+			motor_reinit_focus_pos(motor);
+	}
+	return count;
+}
+
+static ssize_t reinit_zoom_pos(struct device *dev,
+	struct device_attribute *attr,
+	const char *buf,
+	size_t count)
+{
+	struct v4l2_subdev *sd = dev_get_drvdata(dev);
+	struct motor_dev *motor = container_of(sd, struct motor_dev, sd);
+	int val = 0;
+	int ret = 0;
+
+	ret = kstrtoint(buf, 0, &val);
+	if (!ret) {
+		if (val == 1)
+			motor_reinit_zoom_pos(motor);
+	}
+	return count;
+}
+
+static ssize_t set_focus_reback_ctrl(struct device *dev,
+	struct device_attribute *attr,
+	const char *buf,
+	size_t count)
+{
+	struct v4l2_subdev *sd = dev_get_drvdata(dev);
+	struct motor_dev *motor = container_of(sd, struct motor_dev, sd);
+	int val = 0;
+	int ret = 0;
+
+	ret = kstrtoint(buf, 0, &val);
+	if (!ret) {
+		if (val == 1)
+			motor->focus.reback_ctrl = true;
+		else
+			motor->focus.reback_ctrl = false;
+	}
+	return count;
+}
+
+static ssize_t set_zoom_reback_ctrl(struct device *dev,
+	struct device_attribute *attr,
+	const char *buf,
+	size_t count)
+{
+	struct v4l2_subdev *sd = dev_get_drvdata(dev);
+	struct motor_dev *motor = container_of(sd, struct motor_dev, sd);
+	int val = 0;
+	int ret = 0;
+
+	ret = kstrtoint(buf, 0, &val);
+	if (!ret) {
+		if (val == 1)
+			motor->zoom.reback_ctrl = true;
+		else
+			motor->zoom.reback_ctrl = false;
+	}
+	return count;
+}
+
+static ssize_t set_motor_speed(struct device *dev,
+	struct device_attribute *attr,
+	const char *buf,
+	size_t count)
+{
+	struct v4l2_subdev *sd = dev_get_drvdata(dev);
+	struct motor_dev *motor = container_of(sd, struct motor_dev, sd);
+	int val = 0;
+	int ret = 0;
+
+	ret = kstrtoint(buf, 0, &val);
+	if (!ret) {
+		if (val < 100 || val > 600)
+			dev_info(motor->dev,
+				"min speed 100pps, max speed 600pps, cur speed %d pps\n",
+				val);
+		else
+			motor->phase_interval_ns =
+				div_u64(NSEC_PER_SEC, val);
+	}
+	return count;
+}
+
+static struct device_attribute attributes[] = {
+	__ATTR(reinit_focus, S_IWUSR, NULL, reinit_focus_pos),
+	__ATTR(reinit_zoom, S_IWUSR, NULL, reinit_zoom_pos),
+	__ATTR(focus_reback_ctrl, S_IWUSR, NULL, set_focus_reback_ctrl),
+	__ATTR(zoom_reback_ctrl, S_IWUSR, NULL, set_zoom_reback_ctrl),
+	__ATTR(speed, S_IWUSR, NULL, set_motor_speed),
+};
+
+static int add_sysfs_interfaces(struct device *dev)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(attributes); i++)
+		if (device_create_file(dev, attributes + i))
+			goto undo;
+	return 0;
+undo:
+	for (i--; i >= 0 ; i--)
+		device_remove_file(dev, attributes + i);
+	dev_err(dev, "%s: failed to create sysfs interface\n", __func__);
+	return -ENODEV;
+}
+
+static int remove_sysfs_interfaces(struct device *dev)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(attributes); i++)
+		device_remove_file(dev, attributes + i);
+	return 0;
+}
+#endif
+
+static void dev_param_init(struct motor_dev *motor)
+{
+	motor->focus.type = TYPE_FOCUS;
+	motor->zoom.type = TYPE_ZOOM;
+	motor->phase_interval_ns =
+		div_u64(NSEC_PER_SEC, motor->start_up_speed);
+	motor->focus.mv_tim.vcm_start_t = ns_to_timeval(ktime_get_ns());
+	motor->focus.mv_tim.vcm_end_t = ns_to_timeval(ktime_get_ns());
+	motor->focus.move_status = MOTOR_STATUS_STOPPED;
+	motor->focus.last_status = MOTOR_STATUS_STOPPED;
+	init_completion(&motor->focus.comp_in);
+	init_completion(&motor->focus.comp_out);
+	motor->focus.is_running = false;
+	motor->focus.reback_ctrl = false;
+	motor->focus.phase_index = 0;
+	if (motor->focus.reback != 0) {
+		motor->focus.cur_back_delay = 0;
+		if (motor->focus.is_dir_opp)
+			motor->focus.reback_status = MOTOR_STATUS_CCW;
+		else
+			motor->focus.reback_status = MOTOR_STATUS_CW;
+	}
+
+	motor->zoom.mv_tim.vcm_start_t = ns_to_timeval(ktime_get_ns());
+	motor->zoom.mv_tim.vcm_end_t = ns_to_timeval(ktime_get_ns());
+	motor->zoom.move_status = MOTOR_STATUS_STOPPED;
+	motor->zoom.last_status = MOTOR_STATUS_STOPPED;
+	init_completion(&motor->zoom.comp_in);
+	init_completion(&motor->zoom.comp_out);
+	motor->zoom.is_running = false;
+	motor->zoom.reback_ctrl = false;
+	motor->zoom.phase_index = 0;
+	if (motor->zoom.reback != 0) {
+		motor->zoom.cur_back_delay = 0;
+		if (motor->zoom.is_dir_opp)
+			motor->zoom.reback_status = MOTOR_STATUS_CCW;
+		else
+			motor->zoom.reback_status = MOTOR_STATUS_CW;
+	}
+	spin_lock_init(&motor->spin_lock);
+	motor->is_timer_restart = false;
+}
+
+static int motor_dev_parse_dt(struct motor_dev *motor)
+{
+	struct device_node *node = motor->dev->of_node;
+	int ret = 0;
+	int i = 0;
+
+	motor->focus.phase_gpios[i] = devm_gpiod_get(motor->dev,
+						     "a1", GPIOD_OUT_LOW);
+	if (IS_ERR(motor->focus.phase_gpios[i])) {
+		dev_err(motor->dev, "Failed to get focus control gpios\n");
+		return -EINVAL;
+	}
+	i++;
+	motor->focus.phase_gpios[i] = devm_gpiod_get(motor->dev,
+						     "b1", GPIOD_OUT_LOW);
+	if (IS_ERR(motor->focus.phase_gpios[i])) {
+		dev_err(motor->dev, "Failed to get focus control gpios\n");
+		return -EINVAL;
+	}
+	i++;
+	motor->focus.phase_gpios[i] = devm_gpiod_get(motor->dev,
+						     "a2", GPIOD_OUT_LOW);
+	if (IS_ERR(motor->focus.phase_gpios[i])) {
+		dev_err(motor->dev, "Failed to get focus control gpios\n");
+		return -EINVAL;
+	}
+	i++;
+	motor->focus.phase_gpios[i] = devm_gpiod_get(motor->dev,
+						     "b2", GPIOD_OUT_LOW);
+	if (IS_ERR(motor->focus.phase_gpios[i])) {
+		dev_err(motor->dev, "Failed to get focus control gpios\n");
+		return -EINVAL;
+	}
+	i = 0;
+	motor->zoom.phase_gpios[i] = devm_gpiod_get(motor->dev,
+						     "c1", GPIOD_OUT_LOW);
+	if (IS_ERR(motor->focus.phase_gpios[i])) {
+		dev_err(motor->dev, "Failed to get focus control gpios\n");
+		return -EINVAL;
+	}
+	i++;
+	motor->zoom.phase_gpios[i] = devm_gpiod_get(motor->dev,
+						     "d1", GPIOD_OUT_LOW);
+	if (IS_ERR(motor->focus.phase_gpios[i])) {
+		dev_err(motor->dev, "Failed to get focus control gpios\n");
+		return -EINVAL;
+	}
+	i++;
+	motor->zoom.phase_gpios[i] = devm_gpiod_get(motor->dev,
+						     "c2", GPIOD_OUT_LOW);
+	if (IS_ERR(motor->focus.phase_gpios[i])) {
+		dev_err(motor->dev, "Failed to get focus control gpios\n");
+		return -EINVAL;
+	}
+	i++;
+	motor->zoom.phase_gpios[i] = devm_gpiod_get(motor->dev,
+						     "d2", GPIOD_OUT_LOW);
+	if (IS_ERR(motor->focus.phase_gpios[i])) {
+		dev_err(motor->dev, "Failed to get focus control gpios\n");
+		return -EINVAL;
+	}
+
+	ret = of_property_read_u32(node,
+				   "focus-step-max",
+				   &motor->focus.step_max);
+	if (ret != 0) {
+		motor->focus.step_max = FOCUS_MAX_STEP_DEF;
+		dev_err(motor->dev,
+			"failed get iris focus_pos_max,use dafult value 7500\n");
+	}
+
+	ret = of_property_read_u32(node,
+				   "zoom-step-max",
+				   &motor->zoom.step_max);
+	if (ret != 0) {
+		motor->zoom.step_max = ZOOM_MAX_STEP_DEF;
+		dev_err(motor->dev,
+			"failed get iris zoom_pos_max,use dafult value 7500\n");
+	}
+
+	ret = of_property_read_u32(node,
+				   "motor-start-up-speed",
+				   &motor->start_up_speed);
+	if (ret != 0) {
+		motor->start_up_speed = MAX_START_UP_HZ;
+		dev_err(motor->dev,
+			"failed get motor start up speed,use dafult value\n");
+	}
+
+	ret = of_property_read_u32(node,
+				   "focus-reback-distance",
+				   &motor->focus.reback);
+	if (ret != 0) {
+		dev_err(motor->dev,
+			"failed get focus reback distance, return\n");
+		return -EINVAL;
+	}
+	ret = of_property_read_u32(node,
+				   "focus-reback-delay",
+				   &motor->focus.max_back_delay);
+	if (ret != 0) {
+		motor->focus.max_back_delay = FOCUS_MAX_BACK_DELAY;
+		dev_err(motor->dev,
+			"failed get focus reback delay, used default\n");
+	}
+	ret = of_property_read_u32(node,
+				   "zoom-reback-distance",
+				   &motor->zoom.reback);
+	if (ret != 0) {
+		dev_err(motor->dev,
+			"failed get zoom reback distance, return\n");
+		return -EINVAL;
+	}
+	ret = of_property_read_u32(node,
+				   "zoom-reback-delay",
+				   &motor->zoom.max_back_delay);
+	if (ret != 0) {
+		motor->zoom.max_back_delay = ZOOM_MAX_BACK_DELAY;
+		dev_err(motor->dev,
+			"failed get zoom reback delay, used default\n");
+	}
+
+	motor->focus.is_dir_opp =
+		device_property_read_bool(motor->dev, "focus-dir-opposite");
+	motor->zoom.is_dir_opp =
+		device_property_read_bool(motor->dev, "zoom-dir-opposite");
+	ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
+				   &motor->module_index);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
+				       &motor->module_facing);
+	if (ret) {
+		dev_err(motor->dev,
+			"could not get module information!\n");
+		return -EINVAL;
+	}
+	return 0;
+}
+
+static int motor_dev_probe(struct platform_device *pdev)
+{
+	int ret = 0;
+	struct motor_dev *motor;
+	struct v4l2_subdev *sd;
+	char facing[2];
+
+	dev_info(&pdev->dev, "driver version: %02x.%02x.%02x",
+		DRIVER_VERSION >> 16,
+		(DRIVER_VERSION & 0xff00) >> 8,
+		DRIVER_VERSION & 0x00ff);
+	motor = devm_kzalloc(&pdev->dev, sizeof(*motor), GFP_KERNEL);
+	if (!motor)
+		return -ENOMEM;
+	motor->dev = &pdev->dev;
+	dev_set_name(motor->dev, "motor");
+	dev_set_drvdata(motor->dev, motor);
+	if (motor_dev_parse_dt(motor)) {
+		dev_err(motor->dev, "parse dt error\n");
+		return -EINVAL;
+	}
+	dev_param_init(motor);
+	hrtimer_init(&motor->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_PINNED);
+	motor->timer.function = motor_timer_func;
+	v4l2_subdev_init(&motor->sd, &motor_subdev_ops);
+	motor->sd.owner = pdev->dev.driver->owner;
+	motor->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
+	motor->sd.dev = &pdev->dev;
+	v4l2_set_subdevdata(&motor->sd, pdev);
+	platform_set_drvdata(pdev, &motor->sd);
+	motor_initialize_controls(motor);
+	if (ret)
+		goto err_free;
+	ret = media_entity_pads_init(&motor->sd.entity, 0, NULL);
+	if (ret < 0)
+		goto err_free;
+	sd = &motor->sd;
+	sd->entity.function = MEDIA_ENT_F_LENS;
+	sd->entity.flags = 0;
+
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(motor->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s",
+		 motor->module_index, facing,
+		 DRIVER_NAME);
+	ret = v4l2_async_register_subdev(sd);
+	if (ret)
+		dev_err(&pdev->dev, "v4l2 async register subdev failed\n");
+#ifdef USED_SYS_DEBUG
+	add_sysfs_interfaces(&pdev->dev);
+#endif
+	dev_info(motor->dev, "gpio motor driver probe success\n");
+	return 0;
+err_free:
+	v4l2_ctrl_handler_free(&motor->ctrl_handler);
+	v4l2_device_unregister_subdev(&motor->sd);
+	media_entity_cleanup(&motor->sd.entity);
+	return ret;
+}
+
+static int motor_dev_remove(struct platform_device *pdev)
+{
+	struct v4l2_subdev *sd = platform_get_drvdata(pdev);
+	struct motor_dev *motor;
+
+	if (sd)
+		motor = v4l2_get_subdevdata(sd);
+	else
+		return -ENODEV;
+	hrtimer_cancel(&motor->timer);
+	if (sd)
+		v4l2_device_unregister_subdev(sd);
+	v4l2_ctrl_handler_free(&motor->ctrl_handler);
+	media_entity_cleanup(&motor->sd.entity);
+#ifdef USED_SYS_DEBUG
+	remove_sysfs_interfaces(motor->dev);
+#endif
+	return 0;
+}
+
+#if defined(CONFIG_OF)
+static const struct of_device_id motor_dev_of_match[] = {
+	{ .compatible = "fitipower,fp5501", },
+	{},
+};
+#endif
+
+static struct platform_driver motor_dev_driver = {
+	.driver = {
+		.name = DRIVER_NAME,
+		.owner = THIS_MODULE,
+		.of_match_table = of_match_ptr(motor_dev_of_match),
+	},
+	.probe = motor_dev_probe,
+	.remove = motor_dev_remove,
+};
+
+module_platform_driver(motor_dev_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:motor");
+MODULE_AUTHOR("ROCKCHIP");

commit e4b2ee8a8837d2ba1c8ab2f108c7d1226d865d4d
Author: Steven Liu <steven.liu@rock-chips.com>
Date:   Fri Jul 2 10:17:21 2021 +0800

    serial: 8250_port: reset LSR DLAB before set MCR
    
    When setting the 16550 serial port baud rate, you need
    to configure the UART to loopback mode. After setting
    the DLL and DLH, you need to reset the LSR first,
    and then configure the MCR to make the UART return
    to the normal mode. If you do not reset the LSR
    first, an error will occur when the UART RX is still
    receiving data.
    
    Signed-off-by: Steven Liu <steven.liu@rock-chips.com>
    Change-Id: Ia940b278554ef1d4e7a6c4550fe4a4600407a57e

diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c
index 1d79bf098ce0..b05183c432d7 100644
--- a/drivers/tty/serial/8250/8250_port.c
+++ b/drivers/tty/serial/8250/8250_port.c
@@ -2681,6 +2681,8 @@ void serial8250_do_set_divisor(struct uart_port *port, unsigned int baud,
 		serial_port_out(port, UART_LCR, up->lcr | UART_LCR_DLAB);
 
 	serial_dl_write(up, quot);
+	if (port->type != PORT_16750)
+		serial_port_out(port, UART_LCR, up->lcr);	/* reset DLAB */
 
 #ifdef CONFIG_ARCH_ROCKCHIP
 	serial_port_out(port, UART_MCR, up->mcr);
@@ -2852,10 +2854,11 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
 	 * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR
 	 * is written without DLAB set, this mode will be disabled.
 	 */
-	if (port->type == PORT_16750)
+	if (port->type == PORT_16750) {
 		serial_port_out(port, UART_FCR, up->fcr);
+		serial_port_out(port, UART_LCR, up->lcr);	/* reset DLAB */
+	}
 
-	serial_port_out(port, UART_LCR, up->lcr);	/* reset DLAB */
 	if (port->type != PORT_16750) {
 		/* emulated UARTs (Lucent Venus 167x) need two steps */
 		if (up->fcr & UART_FCR_ENABLE_FIFO)

commit eccf16e8355641a20331f80de6ab54be7def4da9
Author: Finley Xiao <finley.xiao@rock-chips.com>
Date:   Wed Jun 30 15:13:47 2021 +0800

    soc: rockchip: opp_select: Export rockchip_nvmem_cell_read_u8/u16()
    
    Change-Id: I1c231afce31da9f42cd92839540d8dcb675778ce
    Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>

diff --git a/drivers/cpufreq/rockchip-cpufreq.c b/drivers/cpufreq/rockchip-cpufreq.c
index 206f47335503..173da325ce6d 100644
--- a/drivers/cpufreq/rockchip-cpufreq.c
+++ b/drivers/cpufreq/rockchip-cpufreq.c
@@ -58,14 +58,15 @@ static LIST_HEAD(cluster_info_list);
 static int px30_get_soc_info(struct device *dev, struct device_node *np,
 			     int *bin, int *process)
 {
-	int ret = 0, value = -EINVAL;
+	int ret = 0;
+	u8 value = 0;
 
 	if (!bin)
 		return 0;
 
 	if (of_property_match_string(np, "nvmem-cell-names",
 				     "performance") >= 0) {
-		ret = rockchip_get_efuse_value(np, "performance", &value);
+		ret = rockchip_nvmem_cell_read_u8(np, "performance", &value);
 		if (ret) {
 			dev_err(dev, "Failed to get soc performance value\n");
 			return ret;
@@ -81,13 +82,14 @@ static int px30_get_soc_info(struct device *dev, struct device_node *np,
 static int rk3288_get_soc_info(struct device *dev, struct device_node *np,
 			       int *bin, int *process)
 {
-	int ret = 0, value = -EINVAL;
+	int ret = 0;
+	u8 value = 0;
 	char *name;
 
 	if (!bin)
 		goto next;
 	if (of_property_match_string(np, "nvmem-cell-names", "special") >= 0) {
-		ret = rockchip_get_efuse_value(np, "special", &value);
+		ret = rockchip_nvmem_cell_read_u8(np, "special", &value);
 		if (ret) {
 			dev_err(dev, "Failed to get soc special value\n");
 			goto out;
@@ -104,7 +106,7 @@ static int rk3288_get_soc_info(struct device *dev, struct device_node *np,
 		name = "performance";
 
 	if (of_property_match_string(np, "nvmem-cell-names", name) >= 0) {
-		ret = rockchip_get_efuse_value(np, name, &value);
+		ret = rockchip_nvmem_cell_read_u8(np, name, &value);
 		if (ret) {
 			dev_err(dev, "Failed to get soc performance value\n");
 			goto out;
@@ -122,7 +124,7 @@ static int rk3288_get_soc_info(struct device *dev, struct device_node *np,
 		goto out;
 	if (of_property_match_string(np, "nvmem-cell-names",
 				     "process") >= 0) {
-		ret = rockchip_get_efuse_value(np, "process", &value);
+		ret = rockchip_nvmem_cell_read_u8(np, "process", &value);
 		if (ret) {
 			dev_err(dev, "Failed to get soc process version\n");
 			goto out;
@@ -140,16 +142,17 @@ static int rk3288_get_soc_info(struct device *dev, struct device_node *np,
 static int rk3399_get_soc_info(struct device *dev, struct device_node *np,
 			       int *bin, int *process)
 {
-	int ret = 0, value = -EINVAL;
+	int ret = 0;
+	u8 value = 0;
 
 	if (!bin)
 		return 0;
 
 	if (of_property_match_string(np, "nvmem-cell-names",
 				     "specification_serial_number") >= 0) {
-		ret = rockchip_get_efuse_value(np,
-					       "specification_serial_number",
-					       &value);
+		ret = rockchip_nvmem_cell_read_u8(np,
+						  "specification_serial_number",
+						  &value);
 		if (ret) {
 			dev_err(dev,
 				"Failed to get specification_serial_number\n");
@@ -161,9 +164,9 @@ static int rk3399_get_soc_info(struct device *dev, struct device_node *np,
 		} else if (value == 0x1) {
 			if (of_property_match_string(np, "nvmem-cell-names",
 						     "customer_demand") >= 0) {
-				ret = rockchip_get_efuse_value(np,
-							       "customer_demand",
-							       &value);
+				ret = rockchip_nvmem_cell_read_u8(np,
+								  "customer_demand",
+								  &value);
 				if (ret) {
 					dev_err(dev, "Failed to get customer_demand\n");
 					goto out;
@@ -188,10 +191,11 @@ static int rk3399_get_soc_info(struct device *dev, struct device_node *np,
 static int rv1126_get_soc_info(struct device *dev, struct device_node *np,
 			       int *bin, int *process)
 {
-	int ret = 0, value = -EINVAL;
+	int ret = 0;
+	u8 value = 0;
 
 	if (of_property_match_string(np, "nvmem-cell-names", "performance") >= 0) {
-		ret = rockchip_get_efuse_value(np, "performance", &value);
+		ret = rockchip_nvmem_cell_read_u8(np, "performance", &value);
 		if (ret) {
 			dev_err(dev, "Failed to get soc performance value\n");
 			return ret;
diff --git a/drivers/gpu/arm/midgard/platform/rk/mali_kbase_config_rk.c b/drivers/gpu/arm/midgard/platform/rk/mali_kbase_config_rk.c
index 5c3d245a0496..f0bdec04d72e 100644
--- a/drivers/gpu/arm/midgard/platform/rk/mali_kbase_config_rk.c
+++ b/drivers/gpu/arm/midgard/platform/rk/mali_kbase_config_rk.c
@@ -434,7 +434,8 @@ static void kbase_platform_rk_remove_sysfs_files(struct device *dev)
 static int rk3288_get_soc_info(struct device *dev, struct device_node *np,
 			       int *bin, int *process)
 {
-	int ret = -EINVAL, value = -EINVAL;
+	int ret = -EINVAL;
+	u8 value = 0;
 	char *name;
 
 	if (!bin)
@@ -445,7 +446,7 @@ static int rk3288_get_soc_info(struct device *dev, struct device_node *np,
 	else
 		name = "performance";
 	if (of_property_match_string(np, "nvmem-cell-names", name) >= 0) {
-		ret = rockchip_get_efuse_value(np, name, &value);
+		ret = rockchip_nvmem_cell_read_u8(np, name, &value);
 		if (ret) {
 			dev_err(dev, "Failed to get soc performance value\n");
 			goto out;
diff --git a/drivers/soc/rockchip/rockchip_opp_select.c b/drivers/soc/rockchip/rockchip_opp_select.c
index 34e9be1a5fcc..1520e2f96ea6 100644
--- a/drivers/soc/rockchip/rockchip_opp_select.c
+++ b/drivers/soc/rockchip/rockchip_opp_select.c
@@ -22,7 +22,6 @@
 
 #define MAX_PROP_NAME_LEN	6
 #define SEL_TABLE_END		~1
-#define LEAKAGE_INVALID		0xff
 #define AVS_DELETE_OPP		0
 #define AVS_SCALING_RATE	1
 
@@ -120,35 +119,6 @@ static const struct lkg_conversion_table conv_table[] = {
 	{ 400, 53 },
 };
 
-int rockchip_get_efuse_value(struct device_node *np, char *porp_name,
-			     int *value)
-{
-	struct nvmem_cell *cell;
-	unsigned char *buf;
-	size_t len;
-
-	cell = of_nvmem_cell_get(np, porp_name);
-	if (IS_ERR(cell))
-		return PTR_ERR(cell);
-
-	buf = (unsigned char *)nvmem_cell_read(cell, &len);
-
-	nvmem_cell_put(cell);
-
-	if (IS_ERR(buf))
-		return PTR_ERR(buf);
-
-	if (buf[0] == LEAKAGE_INVALID)
-		return -EINVAL;
-
-	*value = buf[0];
-
-	kfree(buf);
-
-	return 0;
-}
-EXPORT_SYMBOL(rockchip_get_efuse_value);
-
 static int rockchip_nvmem_cell_read_common(struct device_node *np,
 					   const char *cell_id,
 					   void *val, size_t count)
@@ -178,19 +148,19 @@ static int rockchip_nvmem_cell_read_common(struct device_node *np,
 	return 0;
 }
 
-static int rockchip_nvmem_cell_read_u8(struct device_node *np,
-					const char *cell_id,
-					u8 *val)
+int rockchip_nvmem_cell_read_u8(struct device_node *np, const char *cell_id,
+				u8 *val)
 {
 	return rockchip_nvmem_cell_read_common(np, cell_id, val, sizeof(*val));
 }
+EXPORT_SYMBOL(rockchip_nvmem_cell_read_u8);
 
-static int rockchip_nvmem_cell_read_u16(struct device_node *np,
-					const char *cell_id,
-					u16 *val)
+int rockchip_nvmem_cell_read_u16(struct device_node *np, const char *cell_id,
+				 u16 *val)
 {
 	return rockchip_nvmem_cell_read_common(np, cell_id, val, sizeof(*val));
 }
+EXPORT_SYMBOL(rockchip_nvmem_cell_read_u16);
 
 static int rockchip_get_sel_table(struct device_node *np, char *porp_name,
 				  struct sel_table **table)
@@ -503,7 +473,8 @@ static int rockchip_adjust_leakage(struct device *dev, struct device_node *np,
 				   int *leakage)
 {
 	struct nvmem_cell *cell;
-	u32 value = 0, temp;
+	u8 value = 0;
+	u32 temp;
 	int conversion;
 	int ret;
 
@@ -511,7 +482,7 @@ static int rockchip_adjust_leakage(struct device *dev, struct device_node *np,
 	if (IS_ERR(cell))
 		goto next;
 	nvmem_cell_put(cell);
-	ret = rockchip_get_efuse_value(np, "leakage_temp", &value);
+	ret = rockchip_nvmem_cell_read_u8(np, "leakage_temp", &value);
 	if (ret) {
 		dev_err(dev, "Failed to get leakage temp\n");
 		return -EINVAL;
@@ -523,7 +494,8 @@ static int rockchip_adjust_leakage(struct device *dev, struct device_node *np,
 	 * The ambient temp : temp = (temp_efuse / 63) * (40 - 20) + 20
 	 * Reserves a decimal point : temp = temp * 10
 	 */
-	temp = mul_frac((int_to_frac(value) / 63 * 20 + int_to_frac(20)),
+	temp = value;
+	temp = mul_frac((int_to_frac(temp) / 63 * 20 + int_to_frac(20)),
 			int_to_frac(10));
 	conversion = temp_to_conversion_rate(frac_to_int(temp));
 	*leakage = *leakage * conversion / 100;
@@ -533,7 +505,7 @@ static int rockchip_adjust_leakage(struct device *dev, struct device_node *np,
 	if (IS_ERR(cell))
 		return 0;
 	nvmem_cell_put(cell);
-	ret = rockchip_get_efuse_value(np, "leakage_volt", &value);
+	ret = rockchip_nvmem_cell_read_u8(np, "leakage_volt", &value);
 	if (ret) {
 		dev_err(dev, "Failed to get leakage volt\n");
 		return -EINVAL;
@@ -569,16 +541,19 @@ static int rockchip_get_leakage_v1(struct device *dev, struct device_node *np,
 {
 	struct nvmem_cell *cell;
 	int ret = 0;
+	u8 value = 0;
 
 	cell = of_nvmem_cell_get(np, "leakage");
 	if (IS_ERR(cell)) {
-		ret = rockchip_get_efuse_value(np, lkg_name, leakage);
+		ret = rockchip_nvmem_cell_read_u8(np, lkg_name, &value);
 	} else {
 		nvmem_cell_put(cell);
-		ret = rockchip_get_efuse_value(np, "leakage", leakage);
+		ret = rockchip_nvmem_cell_read_u8(np, "leakage", &value);
 	}
 	if (ret)
 		dev_err(dev, "Failed to get %s\n", lkg_name);
+	else
+		*leakage = value;
 
 	return ret;
 }
diff --git a/drivers/video/rockchip/mpp/mpp_rkvenc.c b/drivers/video/rockchip/mpp/mpp_rkvenc.c
index 0a6cda29ddad..1e8517852596 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvenc.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvenc.c
@@ -964,10 +964,11 @@ static struct monitor_dev_profile enc_mdevp = {
 static int rv1126_get_soc_info(struct device *dev, struct device_node *np,
 			       int *bin, int *process)
 {
-	int ret = 0, value = -EINVAL;
+	int ret = 0;
+	u8 value = 0;
 
 	if (of_property_match_string(np, "nvmem-cell-names", "performance") >= 0) {
-		ret = rockchip_get_efuse_value(np, "performance", &value);
+		ret = rockchip_nvmem_cell_read_u8(np, "performance", &value);
 		if (ret) {
 			dev_err(dev, "Failed to get soc performance value\n");
 			return ret;
diff --git a/include/soc/rockchip/rockchip_opp_select.h b/include/soc/rockchip/rockchip_opp_select.h
index 4dc0d9b8789f..e31c36c7f506 100644
--- a/include/soc/rockchip/rockchip_opp_select.h
+++ b/include/soc/rockchip/rockchip_opp_select.h
@@ -18,8 +18,10 @@ void rockchip_of_get_bin_sel(struct device *dev, struct device_node *np,
 			     int bin, int *scale_sel);
 void rockchip_of_get_bin_volt_sel(struct device *dev, struct device_node *np,
 				  int bin, int *bin_volt_sel);
-int rockchip_get_efuse_value(struct device_node *np, char *porp_name,
-			     int *value);
+int rockchip_nvmem_cell_read_u8(struct device_node *np, const char *cell_id,
+				u8 *val);
+int rockchip_nvmem_cell_read_u16(struct device_node *np, const char *cell_id,
+				 u16 *val);
 void rockchip_get_soc_info(struct device *dev,
 			   const struct of_device_id *matches,
 			   int *bin, int *process);
@@ -65,10 +67,16 @@ static inline void rockchip_of_get_bin_volt_sel(struct device *dev,
 {
 }
 
-static inline int rockchip_get_efuse_value(struct device_node *np,
-					   char *porp_name, int *value)
+static inline int rockchip_nvmem_cell_read_u8(struct device_node *np,
+					      const char *cell_id, u8 *val)
 {
-	return -ENOTSUPP;
+	return -EOPNOTSUPP;
+}
+
+static inline int rockchip_nvmem_cell_read_u16(struct device_node *np,
+					       const char *cell_id, u16 *val)
+{
+	return -EOPNOTSUPP;
 }
 
 static inline void rockchip_get_soc_info(struct device *dev,

commit fcf284298c60c23fcd2aca102db7bc9c3adda51d
Author: Finley Xiao <finley.xiao@rock-chips.com>
Date:   Wed Jun 30 15:15:49 2021 +0800

    soc: rockchip: opp_select: Remove non-essential conditions for getting pvtm
    
    Change-Id: I929046fa5c36f9cbc01e30edaa68f9abdfccdfd6
    Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>

diff --git a/drivers/soc/rockchip/rockchip_opp_select.c b/drivers/soc/rockchip/rockchip_opp_select.c
index 6f1b50be9682..34e9be1a5fcc 100644
--- a/drivers/soc/rockchip/rockchip_opp_select.c
+++ b/drivers/soc/rockchip/rockchip_opp_select.c
@@ -324,8 +324,6 @@ static int rockchip_get_bin_sel(struct device_node *np, char *name,
 static int rockchip_parse_pvtm_config(struct device_node *np,
 				      struct pvtm_config *pvtm)
 {
-	if (!of_find_property(np, "rockchip,pvtm-voltage-sel", NULL))
-		return -EINVAL;
 	if (of_property_read_u32(np, "rockchip,pvtm-freq", &pvtm->freq))
 		return -EINVAL;
 	if (of_property_read_u32(np, "rockchip,pvtm-volt", &pvtm->volt))

commit a7613ef6cd3aeb5da64f613ccdcc8f697442982f
Author: Frank Wang <frank.wang@rock-chips.com>
Date:   Thu Jul 1 14:48:13 2021 +0800

    usb: gadget: f_uac1: adds support for SS and SSP
    
    This adds UAC1 support of SS and SSP speed.
    
    Signed-off-by: Frank Wang <frank.wang@rock-chips.com>
    Change-Id: I896d9e36f05eef9bb3eacfc56ef7d32aa7c89044

diff --git a/drivers/usb/gadget/function/f_uac1.c b/drivers/usb/gadget/function/f_uac1.c
index 3a7f6e65cc74..acd976b7caf4 100644
--- a/drivers/usb/gadget/function/f_uac1.c
+++ b/drivers/usb/gadget/function/f_uac1.c
@@ -253,6 +253,24 @@ static struct usb_endpoint_descriptor as_out_ep_desc  = {
 	.bInterval =		4,
 };
 
+static struct usb_endpoint_descriptor ss_out_ep_desc = {
+	.bLength = USB_DT_ENDPOINT_AUDIO_SIZE,
+	.bDescriptorType = USB_DT_ENDPOINT,
+
+	.bEndpointAddress = USB_DIR_OUT,
+	.bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ADAPTIVE,
+	/* .wMaxPacketSize = DYNAMIC */
+	.bInterval = 4,
+};
+
+static struct usb_ss_ep_comp_descriptor ss_out_ep_desc_comp = {
+	.bLength		= sizeof(ss_out_ep_desc_comp),
+	.bDescriptorType	= USB_DT_SS_ENDPOINT_COMP,
+	.bMaxBurst		= 0,
+	.bmAttributes		= 0,
+	/* wBytesPerInterval = DYNAMIC */
+};
+
 /* Class-specific AS ISO OUT Endpoint Descriptor */
 static struct uac_iso_endpoint_descriptor as_iso_out_desc = {
 	.bLength =		UAC_ISO_ENDPOINT_DESC_SIZE,
@@ -284,6 +302,24 @@ static struct usb_endpoint_descriptor as_in_ep_desc  = {
 	.bInterval =		4,
 };
 
+static struct usb_endpoint_descriptor ss_in_ep_desc = {
+	.bLength = USB_DT_ENDPOINT_AUDIO_SIZE,
+	.bDescriptorType = USB_DT_ENDPOINT,
+
+	.bEndpointAddress = USB_DIR_IN,
+	.bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
+	/* .wMaxPacketSize = DYNAMIC */
+	.bInterval = 4,
+};
+
+static struct usb_ss_ep_comp_descriptor ss_in_ep_desc_comp = {
+	.bLength		= sizeof(ss_in_ep_desc_comp),
+	.bDescriptorType	= USB_DT_SS_ENDPOINT_COMP,
+	.bMaxBurst		= 0,
+	.bmAttributes		= 0,
+	/* wBytesPerInterval = DYNAMIC */
+};
+
 /* Class-specific AS ISO OUT Endpoint Descriptor */
 static struct uac_iso_endpoint_descriptor as_iso_in_desc = {
 	.bLength =		UAC_ISO_ENDPOINT_DESC_SIZE,
@@ -326,6 +362,40 @@ static struct usb_descriptor_header *f_audio_desc[] = {
 	NULL,
 };
 
+static struct usb_descriptor_header *f_ss_audio_desc[] = {
+	(struct usb_descriptor_header *)&iad_desc,
+	(struct usb_descriptor_header *)&ac_interface_desc,
+	(struct usb_descriptor_header *)&ac_header_desc,
+
+	(struct usb_descriptor_header *)&usb_out_it_desc,
+	(struct usb_descriptor_header *)&io_out_ot_fu_desc,
+	(struct usb_descriptor_header *)&io_out_ot_desc,
+	(struct usb_descriptor_header *)&io_in_it_desc,
+	(struct usb_descriptor_header *)&usb_in_ot_fu_desc,
+	(struct usb_descriptor_header *)&usb_in_ot_desc,
+
+	(struct usb_descriptor_header *)&as_out_interface_alt_0_desc,
+	(struct usb_descriptor_header *)&as_out_interface_alt_1_desc,
+	(struct usb_descriptor_header *)&as_out_header_desc,
+
+	(struct usb_descriptor_header *)&as_out_type_i_desc,
+
+	(struct usb_descriptor_header *)&ss_out_ep_desc,
+	(struct usb_descriptor_header *)&ss_out_ep_desc_comp,
+	(struct usb_descriptor_header *)&as_iso_out_desc,
+
+	(struct usb_descriptor_header *)&as_in_interface_alt_0_desc,
+	(struct usb_descriptor_header *)&as_in_interface_alt_1_desc,
+	(struct usb_descriptor_header *)&as_in_header_desc,
+
+	(struct usb_descriptor_header *)&as_in_type_i_desc,
+
+	(struct usb_descriptor_header *)&ss_in_ep_desc,
+	(struct usb_descriptor_header *)&ss_in_ep_desc_comp,
+	(struct usb_descriptor_header *)&as_iso_in_desc,
+	NULL,
+};
+
 enum {
 	STR_ASSOC,
 	STR_AC_IF,
@@ -716,6 +786,75 @@ static void f_audio_disable(struct usb_function *f)
 /*-------------------------------------------------------------------------*/
 #define USBDHDR(p) (struct usb_descriptor_header *)(p)
 
+static void setup_headers(struct f_uac_opts *opts,
+			  struct usb_descriptor_header **headers,
+			  enum usb_device_speed speed)
+{
+	struct usb_ss_ep_comp_descriptor *epout_desc_comp = NULL;
+	struct usb_ss_ep_comp_descriptor *epin_desc_comp = NULL;
+	struct usb_endpoint_descriptor *epout_desc;
+	struct usb_endpoint_descriptor *epin_desc;
+	int i;
+
+	switch (speed) {
+	case USB_SPEED_FULL:
+		/* fall through */
+	case USB_SPEED_HIGH:
+		epout_desc = &as_out_ep_desc;
+		epin_desc = &as_in_ep_desc;
+		break;
+	default:
+		epout_desc = &ss_out_ep_desc;
+		epin_desc = &ss_in_ep_desc;
+		epout_desc_comp = &ss_out_ep_desc_comp;
+		epin_desc_comp = &ss_in_ep_desc_comp;
+	}
+
+	i = 0;
+	headers[i++] = USBDHDR(&iad_desc);
+	headers[i++] = USBDHDR(&ac_interface_desc);
+	headers[i++] = USBDHDR(&ac_header_desc);
+
+	if (EPOUT_EN(opts)) {
+		headers[i++] = USBDHDR(&usb_out_it_desc);
+		if (EPOUT_FU(opts))
+			headers[i++] = USBDHDR(&io_out_ot_fu_desc);
+		headers[i++] = USBDHDR(&io_out_ot_desc);
+	}
+
+	if (EPIN_EN(opts)) {
+		headers[i++] = USBDHDR(&io_in_it_desc);
+		if (EPIN_FU(opts))
+			headers[i++] = USBDHDR(&usb_in_ot_fu_desc);
+		headers[i++] = USBDHDR(&usb_in_ot_desc);
+	}
+
+	if (EPOUT_EN(opts)) {
+		headers[i++] = USBDHDR(&as_out_interface_alt_0_desc);
+		headers[i++] = USBDHDR(&as_out_interface_alt_1_desc);
+		headers[i++] = USBDHDR(&as_out_header_desc);
+		headers[i++] = USBDHDR(&as_out_type_i_desc);
+		headers[i++] = USBDHDR(epout_desc);
+		if (epout_desc_comp)
+			headers[i++] = USBDHDR(epout_desc_comp);
+
+		headers[i++] = USBDHDR(&as_iso_out_desc);
+	}
+
+	if (EPIN_EN(opts)) {
+		headers[i++] = USBDHDR(&as_in_interface_alt_0_desc);
+		headers[i++] = USBDHDR(&as_in_interface_alt_1_desc);
+		headers[i++] = USBDHDR(&as_in_header_desc);
+		headers[i++] = USBDHDR(&as_in_type_i_desc);
+		headers[i++] = USBDHDR(epin_desc);
+		if (epin_desc_comp)
+			headers[i++] = USBDHDR(epin_desc_comp);
+
+		headers[i++] = USBDHDR(&as_iso_in_desc);
+	}
+	headers[i] = NULL;
+}
+
 static void setup_descriptor(struct f_uac_opts *opts)
 {
 	int i = 1;
@@ -773,43 +912,8 @@ static void setup_descriptor(struct f_uac_opts *opts)
 		UAC_DT_AC_HEADER_SIZE(ac_header_desc.bInCollection);
 	ac_header_desc.wTotalLength = cpu_to_le16(len + ac_header_desc.bLength);
 
-	i = 0;
-	f_audio_desc[i++] = USBDHDR(&iad_desc);
-	f_audio_desc[i++] = USBDHDR(&ac_interface_desc);
-	f_audio_desc[i++] = USBDHDR(&ac_header_desc);
-
-	if (EPOUT_EN(opts)) {
-		f_audio_desc[i++] = USBDHDR(&usb_out_it_desc);
-		if (EPOUT_FU(opts))
-			f_audio_desc[i++] = USBDHDR(&io_out_ot_fu_desc);
-		f_audio_desc[i++] = USBDHDR(&io_out_ot_desc);
-	}
-
-	if (EPIN_EN(opts)) {
-		f_audio_desc[i++] = USBDHDR(&io_in_it_desc);
-		if (EPIN_FU(opts))
-			f_audio_desc[i++] = USBDHDR(&usb_in_ot_fu_desc);
-		f_audio_desc[i++] = USBDHDR(&usb_in_ot_desc);
-	}
-
-	if (EPOUT_EN(opts)) {
-		f_audio_desc[i++] = USBDHDR(&as_out_interface_alt_0_desc);
-		f_audio_desc[i++] = USBDHDR(&as_out_interface_alt_1_desc);
-		f_audio_desc[i++] = USBDHDR(&as_out_header_desc);
-		f_audio_desc[i++] = USBDHDR(&as_out_type_i_desc);
-		f_audio_desc[i++] = USBDHDR(&as_out_ep_desc);
-		f_audio_desc[i++] = USBDHDR(&as_iso_out_desc);
-	}
-
-	if (EPIN_EN(opts)) {
-		f_audio_desc[i++] = USBDHDR(&as_in_interface_alt_0_desc);
-		f_audio_desc[i++] = USBDHDR(&as_in_interface_alt_1_desc);
-		f_audio_desc[i++] = USBDHDR(&as_in_header_desc);
-		f_audio_desc[i++] = USBDHDR(&as_in_type_i_desc);
-		f_audio_desc[i++] = USBDHDR(&as_in_ep_desc);
-		f_audio_desc[i++] = USBDHDR(&as_iso_in_desc);
-	}
-	f_audio_desc[i++] = NULL;
+	setup_headers(opts, f_audio_desc, USB_SPEED_HIGH);
+	setup_headers(opts, f_ss_audio_desc, USB_SPEED_SUPER);
 }
 
 static int set_ep_max_packet_size(const struct f_uac_opts *opts,
@@ -828,6 +932,8 @@ static int set_ep_max_packet_size(const struct f_uac_opts *opts,
 		break;
 
 	case USB_SPEED_HIGH:
+		/* fall through */
+	case USB_SPEED_SUPER:
 		max_size_ep = 1024;
 		factor = 8000;
 		break;
@@ -973,6 +1079,24 @@ static int f_audio_bind(struct usb_configuration *c, struct usb_function *f)
 		goto fail;
 	}
 
+	status = set_ep_max_packet_size(audio_opts, &ss_out_ep_desc,
+					USB_SPEED_SUPER, false);
+	if (status < 0) {
+		dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
+		goto fail;
+	}
+
+	ss_out_ep_desc_comp.wBytesPerInterval = ss_out_ep_desc.wMaxPacketSize;
+
+	status = set_ep_max_packet_size(audio_opts, &ss_in_ep_desc,
+					USB_SPEED_SUPER, true);
+	if (status < 0) {
+		dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
+		goto fail;
+	}
+
+	ss_in_ep_desc_comp.wBytesPerInterval = ss_in_ep_desc.wMaxPacketSize;
+
 	as_out_type_i_desc.bLength = UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(idx);
 	as_out_type_i_desc.bSamFreqType = idx;
 
@@ -1038,15 +1162,22 @@ static int f_audio_bind(struct usb_configuration *c, struct usb_function *f)
 		audio->in_ep->desc = &as_in_ep_desc;
 	}
 
+	ss_out_ep_desc.bEndpointAddress = as_out_ep_desc.bEndpointAddress;
+	ss_in_ep_desc.bEndpointAddress = as_in_ep_desc.bEndpointAddress;
+
 	setup_descriptor(audio_opts);
 	/* copy descriptors, and track endpoint copies */
-	status = usb_assign_descriptors(f, f_audio_desc, f_audio_desc, NULL,
-					NULL);
+	status = usb_assign_descriptors(f, f_audio_desc, f_audio_desc,
+					f_ss_audio_desc, f_ss_audio_desc);
 	if (status)
 		goto fail;
 
 	audio->out_ep_maxpsize = le16_to_cpu(as_out_ep_desc.wMaxPacketSize);
 	audio->in_ep_maxpsize = le16_to_cpu(as_in_ep_desc.wMaxPacketSize);
+	audio->out_ep_maxpsize = max_t(u16, audio->out_ep_maxpsize,
+				le16_to_cpu(ss_out_ep_desc.wMaxPacketSize));
+	audio->in_ep_maxpsize = max_t(u16, audio->in_ep_maxpsize,
+				le16_to_cpu(ss_in_ep_desc.wMaxPacketSize));
 	audio->params.c_chmask = audio_opts->c_chmask;
 	memcpy(audio->params.c_srate, audio_opts->c_srate,
 			sizeof(audio->params.c_srate));

commit f7e1cb1a9797cd6196aa82b4e1dcc57bb9faceca
Author: Frank Wang <frank.wang@rock-chips.com>
Date:   Thu Jul 1 14:38:04 2021 +0800

    usb: gadget: f_uac2: make compatible for windows os
    
    Amend to fix the UAC2 gadget could not be identified on Windows 10 OS.
    
    Fixes: 486bd80e78f4 ("UPSTREAM: usb: f_uac2: adds support for SS and SSP")
    
    Signed-off-by: Frank Wang <frank.wang@rock-chips.com>
    Change-Id: I992af23ab4ac2740a33621d9c3c47368f5135710

diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c
index 66232d6e3753..04768b61ab01 100644
--- a/drivers/usb/gadget/function/f_uac2.c
+++ b/drivers/usb/gadget/function/f_uac2.c
@@ -350,7 +350,7 @@ static struct usb_endpoint_descriptor ss_epout_desc = {
 	.bDescriptorType = USB_DT_ENDPOINT,
 
 	.bEndpointAddress = USB_DIR_OUT,
-	.bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
+	.bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ADAPTIVE,
 	/* .wMaxPacketSize = DYNAMIC */
 	.bInterval = 4,
 };
@@ -543,6 +543,8 @@ static struct usb_descriptor_header *ss_audio_desc[] = {
 	(struct usb_descriptor_header *)&out_clk_src_desc,
 	(struct usb_descriptor_header *)&usb_out_it_desc,
 	(struct usb_descriptor_header *)&io_in_it_desc,
+	(struct usb_descriptor_header *)&usb_in_ot_fu_desc,
+	(struct usb_descriptor_header *)&io_out_ot_fu_desc,
 	(struct usb_descriptor_header *)&usb_in_ot_desc,
 	(struct usb_descriptor_header *)&io_out_ot_desc,
 
@@ -912,6 +914,8 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
 		return ret;
 	}
 
+	ss_epin_desc_comp.wBytesPerInterval = ss_epin_desc.wMaxPacketSize;
+
 	ret = set_ep_max_packet_size(uac2_opts, &ss_epout_desc, USB_SPEED_SUPER,
 				     false);
 	if (ret < 0) {
@@ -919,6 +923,8 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
 		return ret;
 	}
 
+	ss_epout_desc_comp.wBytesPerInterval = ss_epout_desc.wMaxPacketSize;
+
 	if (EPOUT_EN(uac2_opts)) {
 		agdev->out_ep = usb_ep_autoconfig(gadget, &fs_epout_desc);
 		if (!agdev->out_ep) {

commit 7ef7c12df72121e36c888b2499b1e82f8b069e09
Author: Pawel Laszczak <pawell@cadence.com>
Date:   Wed Mar 10 11:52:16 2021 +0100

    UPSTREAM: usb: f_uac2: adds support for SS and SSP
    
    Patch adds support of SS and SSP speed.
    
    Signed-off-by: Pawel Laszczak <pawell@cadence.com>
    Link: https://lore.kernel.org/r/20210310105216.38202-1-pawell@gli-login.cadence.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Frank Wang <frank.wang@rock-chips.com>
    Change-Id: Iea75fa1f76f11dfe61bb4dabfdbc09549ad006ea
    (cherry picked from commit f8cb3d556be31d2f41f54a7d7623930b05c9b340)

diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c
index 62cd056a911b..66232d6e3753 100644
--- a/drivers/usb/gadget/function/f_uac2.c
+++ b/drivers/usb/gadget/function/f_uac2.c
@@ -345,6 +345,24 @@ static struct usb_endpoint_descriptor hs_epout_desc = {
 	.bInterval = 4,
 };
 
+static struct usb_endpoint_descriptor ss_epout_desc = {
+	.bLength = USB_DT_ENDPOINT_SIZE,
+	.bDescriptorType = USB_DT_ENDPOINT,
+
+	.bEndpointAddress = USB_DIR_OUT,
+	.bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
+	/* .wMaxPacketSize = DYNAMIC */
+	.bInterval = 4,
+};
+
+static struct usb_ss_ep_comp_descriptor ss_epout_desc_comp = {
+	.bLength		= sizeof(ss_epout_desc_comp),
+	.bDescriptorType	= USB_DT_SS_ENDPOINT_COMP,
+	.bMaxBurst		= 0,
+	.bmAttributes		= 0,
+	/* wBytesPerInterval = DYNAMIC */
+};
+
 /* CS AS ISO OUT Endpoint */
 static struct uac2_iso_endpoint_descriptor as_iso_out_desc = {
 	.bLength = sizeof as_iso_out_desc,
@@ -422,6 +440,24 @@ static struct usb_endpoint_descriptor hs_epin_desc = {
 	.bInterval = 4,
 };
 
+static struct usb_endpoint_descriptor ss_epin_desc = {
+	.bLength = USB_DT_ENDPOINT_SIZE,
+	.bDescriptorType = USB_DT_ENDPOINT,
+
+	.bEndpointAddress = USB_DIR_IN,
+	.bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
+	/* .wMaxPacketSize = DYNAMIC */
+	.bInterval = 4,
+};
+
+static struct usb_ss_ep_comp_descriptor ss_epin_desc_comp = {
+	.bLength		= sizeof(ss_epin_desc_comp),
+	.bDescriptorType	= USB_DT_SS_ENDPOINT_COMP,
+	.bMaxBurst		= 0,
+	.bmAttributes		= 0,
+	/* wBytesPerInterval = DYNAMIC */
+};
+
 /* CS AS ISO IN Endpoint */
 static struct uac2_iso_endpoint_descriptor as_iso_in_desc = {
 	.bLength = sizeof as_iso_in_desc,
@@ -498,6 +534,38 @@ static struct usb_descriptor_header *hs_audio_desc[] = {
 	NULL,
 };
 
+static struct usb_descriptor_header *ss_audio_desc[] = {
+	(struct usb_descriptor_header *)&iad_desc,
+	(struct usb_descriptor_header *)&std_ac_if_desc,
+
+	(struct usb_descriptor_header *)&ac_hdr_desc,
+	(struct usb_descriptor_header *)&in_clk_src_desc,
+	(struct usb_descriptor_header *)&out_clk_src_desc,
+	(struct usb_descriptor_header *)&usb_out_it_desc,
+	(struct usb_descriptor_header *)&io_in_it_desc,
+	(struct usb_descriptor_header *)&usb_in_ot_desc,
+	(struct usb_descriptor_header *)&io_out_ot_desc,
+
+	(struct usb_descriptor_header *)&std_as_out_if0_desc,
+	(struct usb_descriptor_header *)&std_as_out_if1_desc,
+
+	(struct usb_descriptor_header *)&as_out_hdr_desc,
+	(struct usb_descriptor_header *)&as_out_fmt1_desc,
+	(struct usb_descriptor_header *)&ss_epout_desc,
+	(struct usb_descriptor_header *)&ss_epout_desc_comp,
+	(struct usb_descriptor_header *)&as_iso_out_desc,
+
+	(struct usb_descriptor_header *)&std_as_in_if0_desc,
+	(struct usb_descriptor_header *)&std_as_in_if1_desc,
+
+	(struct usb_descriptor_header *)&as_in_hdr_desc,
+	(struct usb_descriptor_header *)&as_in_fmt1_desc,
+	(struct usb_descriptor_header *)&ss_epin_desc,
+	(struct usb_descriptor_header *)&ss_epin_desc_comp,
+	(struct usb_descriptor_header *)&as_iso_in_desc,
+	NULL,
+};
+
 struct cntrl_cur_lay2 {
 	__le16	dCUR;
 };
@@ -542,6 +610,7 @@ static int set_ep_max_packet_size(const struct f_uac_opts *uac2_opts,
 		break;
 
 	case USB_SPEED_HIGH:
+	case USB_SPEED_SUPER:
 		max_size_ep = 1024;
 		factor = 8000;
 		break;
@@ -581,6 +650,76 @@ static int set_ep_max_packet_size(const struct f_uac_opts *uac2_opts,
 /* Use macro to overcome line length limitation */
 #define USBDHDR(p) (struct usb_descriptor_header *)(p)
 
+static void setup_headers(struct f_uac_opts *opts,
+			  struct usb_descriptor_header **headers,
+			  enum usb_device_speed speed)
+{
+	struct usb_ss_ep_comp_descriptor *epout_desc_comp = NULL;
+	struct usb_ss_ep_comp_descriptor *epin_desc_comp = NULL;
+	struct usb_endpoint_descriptor *epout_desc;
+	struct usb_endpoint_descriptor *epin_desc;
+	int i;
+
+	switch (speed) {
+	case USB_SPEED_FULL:
+		epout_desc = &fs_epout_desc;
+		epin_desc = &fs_epin_desc;
+		break;
+	case USB_SPEED_HIGH:
+		epout_desc = &hs_epout_desc;
+		epin_desc = &hs_epin_desc;
+		break;
+	default:
+		epout_desc = &ss_epout_desc;
+		epin_desc = &ss_epin_desc;
+		epout_desc_comp = &ss_epout_desc_comp;
+		epin_desc_comp = &ss_epin_desc_comp;
+	}
+
+	i = 0;
+	headers[i++] = USBDHDR(&iad_desc);
+	headers[i++] = USBDHDR(&std_ac_if_desc);
+	headers[i++] = USBDHDR(&ac_hdr_desc);
+	if (EPIN_EN(opts))
+		headers[i++] = USBDHDR(&in_clk_src_desc);
+	if (EPOUT_EN(opts)) {
+		headers[i++] = USBDHDR(&out_clk_src_desc);
+		headers[i++] = USBDHDR(&usb_out_it_desc);
+	}
+	if (EPIN_EN(opts)) {
+		headers[i++] = USBDHDR(&io_in_it_desc);
+		if (EPIN_FU(opts))
+			headers[i++] = USBDHDR(&usb_in_ot_fu_desc);
+		headers[i++] = USBDHDR(&usb_in_ot_desc);
+	}
+	if (EPOUT_EN(opts)) {
+		if (EPOUT_FU(opts))
+			headers[i++] = USBDHDR(&io_out_ot_fu_desc);
+		headers[i++] = USBDHDR(&io_out_ot_desc);
+		headers[i++] = USBDHDR(&std_as_out_if0_desc);
+		headers[i++] = USBDHDR(&std_as_out_if1_desc);
+		headers[i++] = USBDHDR(&as_out_hdr_desc);
+		headers[i++] = USBDHDR(&as_out_fmt1_desc);
+		headers[i++] = USBDHDR(epout_desc);
+		if (epout_desc_comp)
+			headers[i++] = USBDHDR(epout_desc_comp);
+
+		headers[i++] = USBDHDR(&as_iso_out_desc);
+	}
+	if (EPIN_EN(opts)) {
+		headers[i++] = USBDHDR(&std_as_in_if0_desc);
+		headers[i++] = USBDHDR(&std_as_in_if1_desc);
+		headers[i++] = USBDHDR(&as_in_hdr_desc);
+		headers[i++] = USBDHDR(&as_in_fmt1_desc);
+		headers[i++] = USBDHDR(epin_desc);
+		if (epin_desc_comp)
+			headers[i++] = USBDHDR(epin_desc_comp);
+
+		headers[i++] = USBDHDR(&as_iso_in_desc);
+	}
+	headers[i] = NULL;
+}
+
 static void setup_descriptor(struct f_uac_opts *opts)
 {
 	/* patch descriptors */
@@ -650,79 +789,9 @@ static void setup_descriptor(struct f_uac_opts *opts)
 		iad_desc.bInterfaceCount++;
 	}
 
-	i = 0;
-	fs_audio_desc[i++] = USBDHDR(&iad_desc);
-	fs_audio_desc[i++] = USBDHDR(&std_ac_if_desc);
-	fs_audio_desc[i++] = USBDHDR(&ac_hdr_desc);
-	if (EPIN_EN(opts))
-		fs_audio_desc[i++] = USBDHDR(&in_clk_src_desc);
-	if (EPOUT_EN(opts)) {
-		fs_audio_desc[i++] = USBDHDR(&out_clk_src_desc);
-		fs_audio_desc[i++] = USBDHDR(&usb_out_it_desc);
-	}
-	if (EPIN_EN(opts)) {
-		fs_audio_desc[i++] = USBDHDR(&io_in_it_desc);
-		if (EPIN_FU(opts))
-			fs_audio_desc[i++] = USBDHDR(&usb_in_ot_fu_desc);
-		fs_audio_desc[i++] = USBDHDR(&usb_in_ot_desc);
-	}
-	if (EPOUT_EN(opts)) {
-		if (EPOUT_FU(opts))
-			fs_audio_desc[i++] = USBDHDR(&io_out_ot_fu_desc);
-		fs_audio_desc[i++] = USBDHDR(&io_out_ot_desc);
-		fs_audio_desc[i++] = USBDHDR(&std_as_out_if0_desc);
-		fs_audio_desc[i++] = USBDHDR(&std_as_out_if1_desc);
-		fs_audio_desc[i++] = USBDHDR(&as_out_hdr_desc);
-		fs_audio_desc[i++] = USBDHDR(&as_out_fmt1_desc);
-		fs_audio_desc[i++] = USBDHDR(&fs_epout_desc);
-		fs_audio_desc[i++] = USBDHDR(&as_iso_out_desc);
-	}
-	if (EPIN_EN(opts)) {
-		fs_audio_desc[i++] = USBDHDR(&std_as_in_if0_desc);
-		fs_audio_desc[i++] = USBDHDR(&std_as_in_if1_desc);
-		fs_audio_desc[i++] = USBDHDR(&as_in_hdr_desc);
-		fs_audio_desc[i++] = USBDHDR(&as_in_fmt1_desc);
-		fs_audio_desc[i++] = USBDHDR(&fs_epin_desc);
-		fs_audio_desc[i++] = USBDHDR(&as_iso_in_desc);
-	}
-	fs_audio_desc[i] = NULL;
-
-	i = 0;
-	hs_audio_desc[i++] = USBDHDR(&iad_desc);
-	hs_audio_desc[i++] = USBDHDR(&std_ac_if_desc);
-	hs_audio_desc[i++] = USBDHDR(&ac_hdr_desc);
-	if (EPIN_EN(opts))
-		hs_audio_desc[i++] = USBDHDR(&in_clk_src_desc);
-	if (EPOUT_EN(opts)) {
-		hs_audio_desc[i++] = USBDHDR(&out_clk_src_desc);
-		hs_audio_desc[i++] = USBDHDR(&usb_out_it_desc);
-	}
-	if (EPIN_EN(opts)) {
-		hs_audio_desc[i++] = USBDHDR(&io_in_it_desc);
-		if (EPIN_FU(opts))
-			hs_audio_desc[i++] = USBDHDR(&usb_in_ot_fu_desc);
-		hs_audio_desc[i++] = USBDHDR(&usb_in_ot_desc);
-	}
-	if (EPOUT_EN(opts)) {
-		if (EPOUT_FU(opts))
-			hs_audio_desc[i++] = USBDHDR(&io_out_ot_fu_desc);
-		hs_audio_desc[i++] = USBDHDR(&io_out_ot_desc);
-		hs_audio_desc[i++] = USBDHDR(&std_as_out_if0_desc);
-		hs_audio_desc[i++] = USBDHDR(&std_as_out_if1_desc);
-		hs_audio_desc[i++] = USBDHDR(&as_out_hdr_desc);
-		hs_audio_desc[i++] = USBDHDR(&as_out_fmt1_desc);
-		hs_audio_desc[i++] = USBDHDR(&hs_epout_desc);
-		hs_audio_desc[i++] = USBDHDR(&as_iso_out_desc);
-	}
-	if (EPIN_EN(opts)) {
-		hs_audio_desc[i++] = USBDHDR(&std_as_in_if0_desc);
-		hs_audio_desc[i++] = USBDHDR(&std_as_in_if1_desc);
-		hs_audio_desc[i++] = USBDHDR(&as_in_hdr_desc);
-		hs_audio_desc[i++] = USBDHDR(&as_in_fmt1_desc);
-		hs_audio_desc[i++] = USBDHDR(&hs_epin_desc);
-		hs_audio_desc[i++] = USBDHDR(&as_iso_in_desc);
-	}
-	hs_audio_desc[i] = NULL;
+	setup_headers(opts, fs_audio_desc, USB_SPEED_FULL);
+	setup_headers(opts, hs_audio_desc, USB_SPEED_HIGH);
+	setup_headers(opts, ss_audio_desc, USB_SPEED_SUPER);
 }
 
 static int
@@ -836,6 +905,20 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
 		return ret;
 	}
 
+	ret = set_ep_max_packet_size(uac2_opts, &ss_epin_desc, USB_SPEED_SUPER,
+				     true);
+	if (ret < 0) {
+		dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
+		return ret;
+	}
+
+	ret = set_ep_max_packet_size(uac2_opts, &ss_epout_desc, USB_SPEED_SUPER,
+				     false);
+	if (ret < 0) {
+		dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
+		return ret;
+	}
+
 	if (EPOUT_EN(uac2_opts)) {
 		agdev->out_ep = usb_ep_autoconfig(gadget, &fs_epout_desc);
 		if (!agdev->out_ep) {
@@ -860,13 +943,20 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
 				le16_to_cpu(fs_epout_desc.wMaxPacketSize),
 				le16_to_cpu(hs_epout_desc.wMaxPacketSize));
 
+	agdev->in_ep_maxpsize = max_t(u16, agdev->in_ep_maxpsize,
+				le16_to_cpu(ss_epin_desc.wMaxPacketSize));
+	agdev->out_ep_maxpsize = max_t(u16, agdev->out_ep_maxpsize,
+				le16_to_cpu(ss_epout_desc.wMaxPacketSize));
+
 	hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress;
 	hs_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress;
+	ss_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress;
+	ss_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress;
 
 	setup_descriptor(uac2_opts);
 
-	ret = usb_assign_descriptors(fn, fs_audio_desc, hs_audio_desc, NULL,
-				     NULL);
+	ret = usb_assign_descriptors(fn, fs_audio_desc, hs_audio_desc, ss_audio_desc,
+				     ss_audio_desc);
 	if (ret)
 		return ret;
 

commit 9b22b07cf598e3b8f36e079dd96519076c4d9898
Author: Hu Kejun <william.hu@rock-chips.com>
Date:   Wed Jun 30 15:45:35 2021 +0800

    media: spi: ms41908: zoom/focus use different reback value
    
    Signed-off-by: Hu Kejun <william.hu@rock-chips.com>
    Change-Id: I62ad6560bfd5aeb672aed2e5352bdacc68fd75f7

diff --git a/drivers/media/spi/ms41908.c b/drivers/media/spi/ms41908.c
index 7655e338a220..1b135b93ec70 100644
--- a/drivers/media/spi/ms41908.c
+++ b/drivers/media/spi/ms41908.c
@@ -1315,7 +1315,8 @@ static int motor_set_zoom_follow(struct motor_dev *motor, struct rk_cam_set_zoom
 {
 	int i = 0;
 	int ret = 0;
-	bool is_need_reback = mv_param->is_need_reback;
+	bool is_need_zoom_reback = mv_param->is_need_zoom_reback;
+	bool is_need_focus_reback = mv_param->is_need_focus_reback;
 
 	for (i = 0; i < mv_param->setzoom_cnt; i++) {
 		if (i == (mv_param->setzoom_cnt - 1)) {
@@ -1324,13 +1325,13 @@ static int motor_set_zoom_follow(struct motor_dev *motor, struct rk_cam_set_zoom
 						       mv_param->zoom_pos[i].focus_pos,
 						       true,
 						       true,
-						       is_need_reback);
+						       is_need_zoom_reback);
 			ret = set_motor_running_status(motor,
 						       motor->zoom,
 						       mv_param->zoom_pos[i].zoom_pos,
 						       true,
 						       false,
-						       is_need_reback);
+						       is_need_focus_reback);
 		} else {
 			set_motor_running_status(motor,
 						 motor->focus,
diff --git a/include/uapi/linux/rk_vcm_head.h b/include/uapi/linux/rk_vcm_head.h
index 0fd2f42ad2b4..4969b08c4164 100644
--- a/include/uapi/linux/rk_vcm_head.h
+++ b/include/uapi/linux/rk_vcm_head.h
@@ -89,7 +89,8 @@ struct rk_cam_zoom_pos {
 };
 
 struct rk_cam_set_zoom {
-	bool is_need_reback;
+	bool is_need_zoom_reback;
+	bool is_need_focus_reback;
 	u32 setzoom_cnt;
 	struct rk_cam_zoom_pos zoom_pos[VCMDRV_SETZOOM_MAXCNT];
 };

commit 56d410da862fac4463dc5e3466f84455b6d43569
Author: Felix Zeng <felix.zeng@rock-chips.com>
Date:   Tue Jun 29 17:54:16 2021 +0800

    arm64: configs: rockchip_defconfig: Enable rknpu module
    
    Signed-off-by: Felix Zeng <felix.zeng@rock-chips.com>
    Change-Id: Ie86cfb931e46983875a4ee2adcf5760166bb38e8

diff --git a/arch/arm64/configs/rockchip_defconfig b/arch/arm64/configs/rockchip_defconfig
index c129fe6de920..56a8ddd93265 100644
--- a/arch/arm64/configs/rockchip_defconfig
+++ b/arch/arm64/configs/rockchip_defconfig
@@ -872,6 +872,7 @@ CONFIG_TEE=y
 CONFIG_OPTEE=y
 CONFIG_RK_NAND=y
 CONFIG_RK_HEADSET=y
+CONFIG_ROCKCHIP_RKNPU=y
 CONFIG_EXT4_FS=y
 CONFIG_EXT4_FS_POSIX_ACL=y
 CONFIG_EXT4_FS_SECURITY=y

commit 9a93c881e9dde0dedfed0abb14d4387ddbd0aa72
Author: Felix Zeng <felix.zeng@rock-chips.com>
Date:   Tue Jun 29 14:42:48 2021 +0800

    driver: rknpu: Add rknpu driver for rk356x, version: 0.4.2
    
    Signed-off-by: Felix Zeng <felix.zeng@rock-chips.com>
    Change-Id: Ia9c19e37024d085010ef4c86a420ed5a9c831915

diff --git a/drivers/Kconfig b/drivers/Kconfig
index 9da31ed7f099..dc65838eff4c 100644
--- a/drivers/Kconfig
+++ b/drivers/Kconfig
@@ -229,4 +229,6 @@ source "drivers/rk_nand/Kconfig"
 
 source "drivers/headset_observe/Kconfig"
 
+source "drivers/rknpu/Kconfig"
+
 endmenu
diff --git a/drivers/Makefile b/drivers/Makefile
index bb146d68ab67..adbc9102d494 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -191,3 +191,4 @@ obj-$(CONFIG_GNSS)		+= gnss/
 obj-$(CONFIG_RK_NAND)		+= rk_nand/
 obj-$(CONFIG_RK_HEADSET)	+= headset_observe/
 obj-$(CONFIG_RK_FLASH)		+= rkflash/
+obj-$(CONFIG_ROCKCHIP_RKNPU)	+= rknpu/
diff --git a/drivers/rknpu/Kconfig b/drivers/rknpu/Kconfig
new file mode 100644
index 000000000000..42cb4718436e
--- /dev/null
+++ b/drivers/rknpu/Kconfig
@@ -0,0 +1,10 @@
+# SPDX-License-Identifier: GPL-2.0
+menu "RKNPU"
+	depends on ARCH_ROCKCHIP && DRM
+
+config ROCKCHIP_RKNPU
+	tristate "ROCKCHIP_RKNPU"
+	help
+	  rknpu module.
+
+endmenu
diff --git a/drivers/rknpu/Makefile b/drivers/rknpu/Makefile
new file mode 100644
index 000000000000..b2b14a9dab62
--- /dev/null
+++ b/drivers/rknpu/Makefile
@@ -0,0 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0
+obj-$(CONFIG_ROCKCHIP_RKNPU) += rknpu.o
+
+ccflags-y += -I$(src)/include
+ccflags-y += -Werror
+
+rknpu-y += rknpu_drv.o
+rknpu-y += rknpu_reset.o
+rknpu-y += rknpu_job.o
+rknpu-y += rknpu_gem.o
+rknpu-y += rknpu_fence.o
diff --git a/drivers/rknpu/include/rknpu_drv.h b/drivers/rknpu/include/rknpu_drv.h
new file mode 100644
index 000000000000..84623a271a56
--- /dev/null
+++ b/drivers/rknpu/include/rknpu_drv.h
@@ -0,0 +1,79 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
+ * Author: Felix Zeng <felix.zeng@rock-chips.com>
+ */
+
+#ifndef __LINUX_RKNPU_DRV_H_
+#define __LINUX_RKNPU_DRV_H_
+
+#include <linux/completion.h>
+#include <linux/device.h>
+#include <linux/kref.h>
+#include <linux/platform_device.h>
+#include <linux/spinlock.h>
+#include <linux/regulator/consumer.h>
+
+#include "rknpu_job.h"
+#include "rknpu_fence.h"
+
+#define DRIVER_NAME "rknpu"
+#define DRIVER_DESC "RKNPU driver"
+#define DRIVER_DATE "20210701"
+#define DRIVER_MAJOR 0
+#define DRIVER_MINOR 4
+#define DRIVER_PATCHLEVEL 2
+
+#define LOG_TAG "RKNPU"
+
+#define LOG_INFO(fmt, args...) pr_info(LOG_TAG ": " fmt, ##args)
+#define LOG_WARN(fmt, args...) pr_warning(LOG_TAG ": " fmt, ##args)
+#define LOG_DEBUG(fmt, args...) DRM_DEBUG_DRIVER(LOG_TAG ": " fmt, ##args)
+#define LOG_ERROR(fmt, args...) pr_err(LOG_TAG ": " fmt, ##args)
+
+#define LOG_DEV_INFO(dev, fmt, args...) dev_info(dev, LOG_TAG ": " fmt, ##args)
+#define LOG_DEV_WARN(dev, fmt, args...) dev_warn(dev, LOG_TAG ": " fmt, ##args)
+#define LOG_DEV_DEBUG(dev, fmt, args...)                                       \
+	DRM_DEV_DEBUG_DRIVER(dev, LOG_TAG ": " fmt, ##args)
+#define LOG_DEV_ERROR(dev, fmt, args...) dev_err(dev, LOG_TAG ": " fmt, ##args)
+
+struct rknpu_config {
+	__u32 bw_priority_base;
+	__u32 bw_priority_length;
+};
+
+/**
+ * RKNPU device
+ *
+ * @base: IO mapped base address for device
+ * @dev: Device instance
+ * @drm_dev: DRM device instance
+ */
+struct rknpu_device {
+	void __iomem *base;
+	struct device *dev;
+	struct drm_device *drm_dev;
+	atomic_t sequence;
+	spinlock_t lock;
+	spinlock_t irq_lock;
+	struct list_head todo_list;
+	wait_queue_head_t job_done_wq;
+	const struct rknpu_config *config;
+	void __iomem *bw_priority_base;
+	struct rknpu_job *job;
+	struct rknpu_fence_context *fence_ctx;
+	bool iommu_en;
+	struct reset_control *srst_a;
+	struct reset_control *srst_h;
+	struct clk_bulk_data *clks;
+	int num_clks;
+	struct regulator *vdd;
+	struct monitor_dev_info *mdev_info;
+	struct ipa_power_model_data *model_data;
+	struct thermal_cooling_device *devfreq_cooling;
+	struct devfreq *devfreq;
+	unsigned long current_freq;
+	unsigned long current_volt;
+};
+
+#endif /* __LINUX_RKNPU_DRV_H_ */
diff --git a/drivers/rknpu/include/rknpu_fence.h b/drivers/rknpu/include/rknpu_fence.h
new file mode 100644
index 000000000000..53047ad0b6a4
--- /dev/null
+++ b/drivers/rknpu/include/rknpu_fence.h
@@ -0,0 +1,26 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
+ * Author: Felix Zeng <felix.zeng@rock-chips.com>
+ */
+
+#ifndef __LINUX_RKNPU_FENCE_H_
+#define __LINUX_RKNPU_FENCE_H_
+
+#include "rknpu_job.h"
+
+struct rknpu_fence_context {
+	unsigned int context;
+	unsigned int seqno;
+	spinlock_t spinlock;
+};
+
+struct rknpu_fence_context *rknpu_fence_context_alloc(void);
+
+void rknpu_fence_context_free(struct rknpu_fence_context *fence_ctx);
+
+int rknpu_fence_alloc(struct rknpu_job *job);
+
+int rknpu_fence_get_fd(struct rknpu_job *job);
+
+#endif /* __LINUX_RKNPU_FENCE_H_ */
diff --git a/drivers/rknpu/include/rknpu_gem.h b/drivers/rknpu/include/rknpu_gem.h
new file mode 100644
index 000000000000..99b87a784f1e
--- /dev/null
+++ b/drivers/rknpu/include/rknpu_gem.h
@@ -0,0 +1,190 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
+ * Author: Felix Zeng <felix.zeng@rock-chips.com>
+ */
+
+#ifndef __LINUX_RKNPU_GEM_H
+#define __LINUX_RKNPU_GEM_H
+
+#include <linux/mm_types.h>
+#include <linux/version.h>
+
+#include <drm/drmP.h>
+#include <drm/drm_vma_manager.h>
+#include <drm/drm_gem.h>
+#if KERNEL_VERSION(4, 14, 0) > LINUX_VERSION_CODE
+#include <drm/drm_mem_util.h>
+#endif
+#include <drm/drm_mode.h>
+
+#define to_rknpu_obj(x) container_of(x, struct rknpu_gem_object, base)
+
+/*
+ * rknpu drm buffer structure.
+ *
+ * @base: a gem object.
+ *	- a new handle to this gem object would be created
+ *	by drm_gem_handle_create().
+ * @flags: indicate memory type to allocated buffer and cache attribute.
+ * @size: size requested from user, in bytes and this size is aligned
+ *	in page unit.
+ * @cookie: cookie returned by dma_alloc_attrs
+ * @kv_addr: kernel virtual address to allocated memory region.
+ * @dma_addr: bus address(accessed by dma) to allocated memory region.
+ *	- this address could be physical address without IOMMU and
+ *	device address with IOMMU.
+ * @pages: Array of backing pages.
+ * @sgt: Imported sg_table.
+ *
+ * P.S. this object would be transferred to user as kms_bo.handle so
+ *	user can access the buffer through kms_bo.handle.
+ */
+struct rknpu_gem_object {
+	struct drm_gem_object base;
+	unsigned int flags;
+	unsigned long size;
+	void *cookie;
+	void __iomem *kv_addr;
+	dma_addr_t dma_addr;
+	unsigned long dma_attrs;
+	unsigned long num_pages;
+	struct page **pages;
+	struct sg_table *sgt;
+	struct drm_mm_node mm_node;
+};
+
+/* create a new buffer with gem object */
+struct rknpu_gem_object *rknpu_gem_object_create(struct drm_device *dev,
+						 unsigned int flags,
+						 unsigned long size);
+
+/* destroy a buffer with gem object */
+void rknpu_gem_object_destroy(struct rknpu_gem_object *rknpu_obj);
+
+/* request gem object creation and buffer allocation as the size */
+int rknpu_gem_create_ioctl(struct drm_device *dev, void *data,
+			   struct drm_file *file_priv);
+
+/* get fake-offset of gem object that can be used with mmap. */
+int rknpu_gem_map_ioctl(struct drm_device *dev, void *data,
+			struct drm_file *file_priv);
+
+int rknpu_gem_destroy_ioctl(struct drm_device *dev, void *data,
+			    struct drm_file *file_priv);
+
+/*
+ * get rknpu drm object,
+ * gem object reference count would be increased.
+ */
+static inline void rknpu_gem_object_get(struct drm_gem_object *obj)
+{
+#if KERNEL_VERSION(4, 13, 0) < LINUX_VERSION_CODE
+	drm_gem_object_get(obj);
+#else
+	drm_gem_object_reference(obj);
+#endif
+}
+
+/*
+ * put rknpu drm object acquired from rknpu_gem_object_find() or rknpu_gem_object_get(),
+ * gem object reference count would be decreased.
+ */
+static inline void rknpu_gem_object_put(struct drm_gem_object *obj)
+{
+#if KERNEL_VERSION(4, 13, 0) < LINUX_VERSION_CODE
+	drm_gem_object_put_unlocked(obj);
+#else
+	drm_gem_object_unreference_unlocked(obj);
+#endif
+}
+
+/*
+ * get rknpu drm object from gem handle, this function could be used for
+ * other drivers such as 2d/3d acceleration drivers.
+ * with this function call, gem object reference count would be increased.
+ */
+static inline struct rknpu_gem_object *
+rknpu_gem_object_find(struct drm_file *filp, unsigned int handle)
+{
+	struct drm_gem_object *obj;
+
+	obj = drm_gem_object_lookup(filp, handle);
+	if (!obj) {
+		// DRM_ERROR("failed to lookup gem object.\n");
+		return NULL;
+	}
+
+	rknpu_gem_object_put(obj);
+
+	return to_rknpu_obj(obj);
+}
+
+/* get buffer information to memory region allocated by gem. */
+int rknpu_gem_get_ioctl(struct drm_device *dev, void *data,
+			struct drm_file *file_priv);
+
+/* free gem object. */
+void rknpu_gem_free_object(struct drm_gem_object *obj);
+
+/* create memory region for drm framebuffer. */
+int rknpu_gem_dumb_create(struct drm_file *file_priv, struct drm_device *dev,
+			  struct drm_mode_create_dumb *args);
+
+#if KERNEL_VERSION(4, 19, 0) > LINUX_VERSION_CODE
+/* map memory region for drm framebuffer to user space. */
+int rknpu_gem_dumb_map_offset(struct drm_file *file_priv,
+			      struct drm_device *dev, uint32_t handle,
+			      uint64_t *offset);
+#endif
+
+/* page fault handler and mmap fault address(virtual) to physical memory. */
+#if KERNEL_VERSION(4, 15, 0) <= LINUX_VERSION_CODE
+vm_fault_t rknpu_gem_fault(struct vm_fault *vmf);
+#elif KERNEL_VERSION(4, 14, 0) <= LINUX_VERSION_CODE
+int rknpu_gem_fault(struct vm_fault *vmf);
+#else
+int rknpu_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf);
+#endif
+
+/* set vm_flags and we can change the vm attribute to other one at here. */
+int rknpu_gem_mmap(struct file *filp, struct vm_area_struct *vma);
+
+/* low-level interface prime helpers */
+#if KERNEL_VERSION(4, 13, 0) <= LINUX_VERSION_CODE
+struct drm_gem_object *rknpu_gem_prime_import(struct drm_device *dev,
+					      struct dma_buf *dma_buf);
+#endif
+struct sg_table *rknpu_gem_prime_get_sg_table(struct drm_gem_object *obj);
+struct drm_gem_object *
+rknpu_gem_prime_import_sg_table(struct drm_device *dev,
+				struct dma_buf_attachment *attach,
+				struct sg_table *sgt);
+void *rknpu_gem_prime_vmap(struct drm_gem_object *obj);
+void rknpu_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
+int rknpu_gem_prime_mmap(struct drm_gem_object *obj,
+			 struct vm_area_struct *vma);
+
+int rknpu_gem_sync_ioctl(struct drm_device *dev, void *data,
+			 struct drm_file *file_priv);
+
+static inline void *rknpu_gem_alloc_page(size_t nr_pages)
+{
+#if KERNEL_VERSION(4, 13, 0) <= LINUX_VERSION_CODE
+	return kvmalloc_array(nr_pages, sizeof(struct page *),
+			      GFP_KERNEL | __GFP_ZERO);
+#else
+	return drm_calloc_large(nr_pages, sizeof(struct page *));
+#endif
+}
+
+static inline void rknpu_gem_free_page(void *pages)
+{
+#if KERNEL_VERSION(4, 13, 0) <= LINUX_VERSION_CODE
+	kvfree(pages);
+#else
+	drm_free_large(pages);
+#endif
+}
+
+#endif
diff --git a/drivers/rknpu/include/rknpu_ioctl.h b/drivers/rknpu/include/rknpu_ioctl.h
new file mode 100644
index 000000000000..a6e59b02924e
--- /dev/null
+++ b/drivers/rknpu/include/rknpu_ioctl.h
@@ -0,0 +1,279 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
+ * Author: Felix Zeng <felix.zeng@rock-chips.com>
+ */
+
+#ifndef __LINUX_RKNPU_IOCTL_H
+#define __LINUX_RKNPU_IOCTL_H
+
+#include <linux/ioctl.h>
+#include <linux/types.h>
+
+#if !defined(__KERNEL__)
+#define __user
+#endif
+
+#define RKNPU_PC_DATA_EXTRA_AMOUNT 4
+
+#define RKNPU_OFFSET_VERSION 0x0
+#define RKNPU_OFFSET_PC_OP_EN 0x8
+#define RKNPU_OFFSET_PC_DATA_ADDR 0x10
+#define RKNPU_OFFSET_PC_DATA_AMOUNT 0x14
+#define RKNPU_OFFSET_PC_TASK_CONTROL 0x30
+#define RKNPU_OFFSET_PC_DMA_BASE_ADDR 0x34
+#define RKNPU_OFFSET_PC_TASK_STATUS 0x3c
+
+#define RKNPU_OFFSET_INT_MASK 0x20
+#define RKNPU_OFFSET_INT_CLEAR 0x24
+#define RKNPU_OFFSET_INT_STATUS 0x28
+
+#define RKNPU_OFFSET_CLR_ALL_RW_AMOUNT 0x8010
+#define RKNPU_OFFSET_DT_WR_AMOUNT 0x8034
+#define RKNPU_OFFSET_DT_RD_AMOUNT 0x8038
+#define RKNPU_OFFSET_WT_RD_AMOUNT 0x803c
+
+#define RKNPU_OFFSET_ENABLE_MASK 0xf008
+
+#define RKNPU_INT_CLEAR 0x1ffff
+
+#define RKNPU_STR_HELPER(x) #x
+
+#define RKNPU_GET_DRV_VERSION_STRING(MAJOR, MINOR, PATCHLEVEL)                 \
+	RKNPU_STR_HELPER(MAJOR)                                                \
+	"." RKNPU_STR_HELPER(MINOR) "." RKNPU_STR_HELPER(PATCHLEVEL)
+#define RKNPU_GET_DRV_VERSION_CODE(MAJOR, MINOR, PATCHLEVEL)                   \
+	(MAJOR * 10000 + MINOR * 100 + PATCHLEVEL)
+#define RKNPU_GET_DRV_VERSION_MAJOR(CODE) (CODE / 10000)
+#define RKNPU_GET_DRV_VERSION_MINOR(CODE) ((CODE % 10000) / 100)
+#define RKNPU_GET_DRV_VERSION_PATCHLEVEL(CODE) (CODE % 100)
+
+/* memory type definitions. */
+enum e_rknpu_mem_type {
+	/* physically continuous memory and used as default. */
+	RKNPU_MEM_CONTIGUOUS = 0 << 0,
+	/* physically non-continuous memory. */
+	RKNPU_MEM_NON_CONTIGUOUS = 1 << 0,
+	/* non-cacheable mapping and used as default. */
+	RKNPU_MEM_NON_CACHEABLE = 0 << 1,
+	/* cacheable mapping. */
+	RKNPU_MEM_CACHEABLE = 1 << 1,
+	/* write-combine mapping. */
+	RKNPU_MEM_WRITE_COMBINE = 1 << 2,
+	/* dma attr kernel mapping */
+	RKNPU_MEM_KERNEL_MAPPING = 1 << 3,
+	/* iommu mapping */
+	RKNPU_MEM_IOMMU = 1 << 4,
+	/* zero mapping */
+	RKNPU_MEM_ZEROING = 1 << 5,
+	/* allocate secure buffer */
+	RKNPU_MEM_SECURE = 1 << 6,
+	/* allocate from non-dma32 zone */
+	RKNPU_MEM_NON_DMA32 = 1 << 7,
+	RKNPU_MEM_MASK = RKNPU_MEM_NON_CONTIGUOUS | RKNPU_MEM_CACHEABLE |
+			 RKNPU_MEM_WRITE_COMBINE | RKNPU_MEM_KERNEL_MAPPING |
+			 RKNPU_MEM_IOMMU | RKNPU_MEM_ZEROING |
+			 RKNPU_MEM_SECURE | RKNPU_MEM_NON_DMA32
+};
+
+/* sync mode definitions. */
+enum e_rknpu_mem_sync_mode {
+	RKNPU_MEM_SYNC_TO_DEVICE = 1 << 0,
+	RKNPU_MEM_SYNC_FROM_DEVICE = 1 << 1,
+	RKNPU_MEM_SYNC_MASK =
+		RKNPU_MEM_SYNC_TO_DEVICE | RKNPU_MEM_SYNC_FROM_DEVICE
+};
+
+/* job mode definitions. */
+enum e_rknpu_job_mode {
+	RKNPU_JOB_SLAVE = 0 << 0,
+	RKNPU_JOB_PC = 1 << 0,
+	RKNPU_JOB_BLOCK = 0 << 1,
+	RKNPU_JOB_NONBLOCK = 1 << 1,
+	RKNPU_JOB_PINGPONG = 1 << 2,
+	RKNPU_JOB_FENCE = 1 << 3,
+	RKNPU_JOB_MASK = RKNPU_JOB_PC | RKNPU_JOB_NONBLOCK |
+			 RKNPU_JOB_PINGPONG | RKNPU_JOB_FENCE
+};
+
+/* action definitions */
+enum e_rknpu_action {
+	RKNPU_GET_HW_VERSION = 0,
+	RKNPU_GET_DRV_VERSION = 1,
+	RKNPU_GET_FREQ = 2,
+	RKNPU_SET_FREQ = 3,
+	RKNPU_GET_VOLT = 4,
+	RKNPU_SET_VOLT = 5,
+	RKNPU_ACT_RESET = 6,
+	RKNPU_GET_BW_PRIORITY = 7,
+	RKNPU_SET_BW_PRIORITY = 8,
+	RKNPU_GET_BW_EXPECT = 9,
+	RKNPU_SET_BW_EXPECT = 10,
+	RKNPU_GET_BW_TW = 11,
+	RKNPU_SET_BW_TW = 12,
+	RKNPU_ACT_CLR_TOTAL_RW_AMOUNT = 13,
+	RKNPU_GET_DT_WR_AMOUNT = 14,
+	RKNPU_GET_DT_RD_AMOUNT = 15,
+	RKNPU_GET_WT_RD_AMOUNT = 16,
+	RKNPU_GET_TOTAL_RW_AMOUNT = 17,
+	RKNPU_GET_IOMMU_EN = 18,
+	RKNPU_SET_PROC_NICE = 19,
+};
+
+/**
+ * User-desired buffer creation information structure.
+ *
+ * @handle: The handle of the created GEM object.
+ * @flags: user request for setting memory type or cache attributes.
+ * @size: user-desired memory allocation size.
+ *	- this size value would be page-aligned internally.
+ * @obj_addr: address of RKNPU memory object.
+ * @dma_addr: dma address that access by rknpu.
+ */
+struct rknpu_mem_create {
+	__u32 handle;
+	__u32 flags;
+	__u64 size;
+	__u64 obj_addr;
+	__u64 dma_addr;
+};
+
+/**
+ * A structure for getting a fake-offset that can be used with mmap.
+ *
+ * @handle: handle of gem object.
+ * @reserved: just padding to be 64-bit aligned.
+ * @offset: a fake-offset of gem object.
+ */
+struct rknpu_mem_map {
+	__u32 handle;
+	__u32 reserved;
+	__u64 offset;
+};
+
+/**
+ * For destroying DMA buffer
+ *
+ * @handle:	handle of the buffer.
+ * @reserved: reserved for padding.
+ */
+struct rknpu_mem_destroy {
+	__u32 handle;
+	__u32 reserved;
+};
+
+/**
+ * For synchronizing DMA buffer
+ *
+ * @flags: user request for setting memory type or cache attributes.
+ * @reserved: reserved for padding.
+ * @obj_addr: address of RKNPU memory object.
+ * @offset: offset in bytes from start address of buffer.
+ * @size: size of memory region.
+ *
+ */
+struct rknpu_mem_sync {
+	__u32 flags;
+	__u32 reserved;
+	__u64 obj_addr;
+	__u64 offset;
+	__u64 size;
+};
+
+/**
+ * struct rknpu_task structure for task information
+ *
+ * @flags: flags for task
+ * @op_idx: operator index
+ * @enable_mask: enable mask
+ * @int_mask: interrupt mask
+ * @int_clear: interrupt clear
+ * @int_status: interrupt status
+ * @regcfg_amount: register config number
+ * @regcfg_offset: offset for register config
+ * @regcmd_data: data for register command
+ *
+ */
+struct rknpu_task {
+	__u32 flags;
+	__u32 op_idx;
+	__u32 enable_mask;
+	__u32 int_mask;
+	__u32 int_clear;
+	__u32 int_status;
+	__u32 regcfg_amount;
+	__u32 regcfg_offset;
+	__u64 regcmd_data;
+} __packed;
+
+/**
+ * struct rknpu_submit structure for job submit
+ *
+ * @flags: flags for job submit
+ * @timeout: submit timeout
+ * @task_start: task start index
+ * @task_number: task number
+ * @task_counter: task counter
+ * @priority: submit priority
+ * @task_obj_addr: address of task object
+ * @regcfg_obj_addr: address of register config object
+ * @user_data: (optional) user data
+ * @sequence: submit sequence
+ * @core_id: core id of rknpu
+ * @fence_fd: dma fence fd
+ *
+ */
+struct rknpu_submit {
+	__u32 flags;
+	__u32 timeout;
+	__u32 task_start;
+	__u32 task_number;
+	__u32 task_counter;
+	__s32 priority;
+	__u64 task_obj_addr;
+	__u64 regcfg_obj_addr;
+	__u64 user_data;
+	__u64 sequence;
+	__u32 core_id;
+	__s32 fence_fd;
+};
+
+/**
+ * struct rknpu_task structure for action (GET, SET or ACT)
+ *
+ * @flags: flags for action
+ * @value: GET or SET value
+ *
+ */
+struct rknpu_action {
+	__u32 flags;
+	__u32 value;
+};
+
+#define RKNPU_ACTION 0x00
+#define RKNPU_SUBMIT 0x01
+#define RKNPU_MEM_CREATE 0x02
+#define RKNPU_MEM_MAP 0x03
+#define RKNPU_MEM_DESTROY 0x04
+#define RKNPU_MEM_SYNC 0x05
+
+#if defined(__arm__) || defined(__aarch64__)
+
+#include <drm/drm.h>
+
+#define DRM_IOCTL_RKNPU_ACTION                                                 \
+	DRM_IOWR(DRM_COMMAND_BASE + RKNPU_ACTION, struct rknpu_action)
+#define DRM_IOCTL_RKNPU_SUBMIT                                                 \
+	DRM_IOWR(DRM_COMMAND_BASE + RKNPU_SUBMIT, struct rknpu_submit)
+#define DRM_IOCTL_RKNPU_MEM_CREATE                                             \
+	DRM_IOWR(DRM_COMMAND_BASE + RKNPU_MEM_CREATE, struct rknpu_mem_create)
+#define DRM_IOCTL_RKNPU_MEM_MAP                                                \
+	DRM_IOWR(DRM_COMMAND_BASE + RKNPU_MEM_MAP, struct rknpu_mem_map)
+#define DRM_IOCTL_RKNPU_MEM_DESTROY                                            \
+	DRM_IOWR(DRM_COMMAND_BASE + RKNPU_MEM_DESTROY, struct rknpu_mem_destroy)
+#define DRM_IOCTL_RKNPU_MEM_SYNC                                               \
+	DRM_IOWR(DRM_COMMAND_BASE + RKNPU_MEM_SYNC, struct rknpu_mem_sync)
+
+#endif
+
+#endif
diff --git a/drivers/rknpu/include/rknpu_job.h b/drivers/rknpu/include/rknpu_job.h
new file mode 100644
index 000000000000..832a517920b2
--- /dev/null
+++ b/drivers/rknpu/include/rknpu_job.h
@@ -0,0 +1,56 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
+ * Author: Felix Zeng <felix.zeng@rock-chips.com>
+ */
+
+#ifndef __LINUX_RKNPU_JOB_H_
+#define __LINUX_RKNPU_JOB_H_
+
+#include <linux/spinlock.h>
+#include <linux/dma-fence.h>
+#include <drm/drmP.h>
+
+#include "rknpu_ioctl.h"
+
+#define RKNPU_JOB_DONE (1 << 0)
+#define RKNPU_JOB_ASYNC (1 << 1)
+
+struct rknpu_job {
+	struct rknpu_device *rknpu_dev;
+	struct list_head head;
+	struct work_struct cleanup_work;
+	unsigned int flags;
+	int ret;
+	struct rknpu_submit *args;
+	bool args_owner;
+	struct rknpu_task *first_task;
+	struct rknpu_task *last_task;
+	uint32_t int_mask;
+	uint32_t int_status;
+	struct dma_fence *fence;
+	spinlock_t fence_lock;
+	ktime_t timestamp;
+};
+
+irqreturn_t rknpu_irq_handler(int irq, void *data);
+
+int rknpu_submit_ioctl(struct drm_device *dev, void *data,
+		       struct drm_file *file_priv);
+
+int rknpu_get_hw_version(struct rknpu_device *rknpu_dev, uint32_t *version);
+
+int rknpu_get_bw_priority(struct rknpu_device *rknpu_dev, uint32_t *priority,
+			  uint32_t *expect, uint32_t *tw);
+
+int rknpu_set_bw_priority(struct rknpu_device *rknpu_dev, uint32_t priority,
+			  uint32_t expect, uint32_t tw);
+
+int rknpu_clear_rw_amount(struct rknpu_device *rknpu_dev);
+
+int rknpu_get_rw_amount(struct rknpu_device *rknpu_dev, uint32_t *dt_wr,
+			uint32_t *dt_rd, uint32_t *wd_rd);
+
+int rknpu_get_total_rw_amount(struct rknpu_device *rknpu_dev, uint32_t *amount);
+
+#endif /* __LINUX_RKNPU_JOB_H_ */
diff --git a/drivers/rknpu/include/rknpu_reset.h b/drivers/rknpu/include/rknpu_reset.h
new file mode 100644
index 000000000000..05c9622e526c
--- /dev/null
+++ b/drivers/rknpu/include/rknpu_reset.h
@@ -0,0 +1,13 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
+ * Author: Felix Zeng <felix.zeng@rock-chips.com>
+ */
+
+#include <linux/reset.h>
+
+#include "rknpu_drv.h"
+
+int rknpu_reset_get(struct rknpu_device *rknpu_dev);
+
+int rknpu_soft_reset(struct rknpu_device *rknpu_dev);
diff --git a/drivers/rknpu/rknpu_drv.c b/drivers/rknpu/rknpu_drv.c
new file mode 100644
index 000000000000..c1e1134422f2
--- /dev/null
+++ b/drivers/rknpu/rknpu_drv.c
@@ -0,0 +1,773 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
+ * Author: Felix Zeng <felix.zeng@rock-chips.com>
+ */
+
+#include <linux/dma-buf.h>
+#include <linux/dma-mapping.h>
+#include <linux/fs.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/irqdomain.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/of_irq.h>
+#include <linux/of_platform.h>
+#include <linux/of_reserved_mem.h>
+#include <linux/platform_device.h>
+#include <linux/printk.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/time.h>
+#include <linux/uaccess.h>
+#include <linux/ktime.h>
+#include <linux/delay.h>
+#include <linux/wait.h>
+#include <linux/sched.h>
+#include <linux/clk.h>
+#include <linux/pm_runtime.h>
+#include <linux/devfreq_cooling.h>
+#include <drm/drmP.h>
+
+#include <soc/rockchip/rockchip_opp_select.h>
+#include <soc/rockchip/rockchip_system_monitor.h>
+#include <soc/rockchip/rockchip_ipa.h>
+
+#include "rknpu_ioctl.h"
+#include "rknpu_reset.h"
+#include "rknpu_gem.h"
+#include "rknpu_fence.h"
+#include "rknpu_drv.h"
+
+static int bypass_irq_handler;
+module_param(bypass_irq_handler, int, 0644);
+MODULE_PARM_DESC(bypass_irq_handler,
+		 "Bypass RKNPU irq handler if set it to 1, disabled by default");
+
+static const struct rknpu_config rk356x_rknpu_config = {
+	.bw_priority_base = 0xfe180008,
+	.bw_priority_length = 0x10,
+};
+
+/* driver probe and init */
+static const struct of_device_id rknpu_of_match[] = {
+	{
+		.compatible = "rockchip,rknpu",
+		.data = &rk356x_rknpu_config,
+	},
+	{
+		.compatible = "rockchip,rk3568-rknpu",
+		.data = &rk356x_rknpu_config,
+	},
+	{},
+};
+
+static const struct vm_operations_struct rknpu_gem_vm_ops = {
+	.fault = rknpu_gem_fault,
+	.open = drm_gem_vm_open,
+	.close = drm_gem_vm_close,
+};
+
+static int rknpu_action_ioctl(struct drm_device *dev, void *data,
+			      struct drm_file *file_priv);
+
+static const struct drm_ioctl_desc rknpu_ioctls[] = {
+	DRM_IOCTL_DEF_DRV(RKNPU_ACTION, rknpu_action_ioctl, DRM_RENDER_ALLOW),
+	DRM_IOCTL_DEF_DRV(RKNPU_SUBMIT, rknpu_submit_ioctl, DRM_RENDER_ALLOW),
+	DRM_IOCTL_DEF_DRV(RKNPU_MEM_CREATE, rknpu_gem_create_ioctl,
+			  DRM_RENDER_ALLOW),
+	DRM_IOCTL_DEF_DRV(RKNPU_MEM_MAP, rknpu_gem_map_ioctl, DRM_RENDER_ALLOW),
+	DRM_IOCTL_DEF_DRV(RKNPU_MEM_DESTROY, rknpu_gem_destroy_ioctl,
+			  DRM_RENDER_ALLOW),
+	DRM_IOCTL_DEF_DRV(RKNPU_MEM_SYNC, rknpu_gem_sync_ioctl,
+			  DRM_RENDER_ALLOW),
+};
+
+static const struct file_operations rknpu_drm_driver_fops = {
+	.owner = THIS_MODULE,
+	.open = drm_open,
+	.mmap = rknpu_gem_mmap,
+	.poll = drm_poll,
+	.read = drm_read,
+	.unlocked_ioctl = drm_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl = drm_compat_ioctl,
+#endif
+	.release = drm_release,
+	.llseek = noop_llseek,
+};
+
+static struct drm_driver rknpu_drm_driver = {
+	.driver_features = DRIVER_GEM | DRIVER_PRIME | DRIVER_RENDER,
+	.gem_free_object_unlocked = rknpu_gem_free_object,
+	.gem_vm_ops = &rknpu_gem_vm_ops,
+	.dumb_create = rknpu_gem_dumb_create,
+#if KERNEL_VERSION(4, 19, 0) > LINUX_VERSION_CODE
+	.dumb_map_offset = rknpu_gem_dumb_map_offset,
+#else
+	.dumb_map_offset = drm_gem_dumb_map_offset,
+#endif
+	.dumb_destroy = drm_gem_dumb_destroy,
+	.prime_handle_to_fd = drm_gem_prime_handle_to_fd,
+	.prime_fd_to_handle = drm_gem_prime_fd_to_handle,
+	.gem_prime_export = drm_gem_prime_export,
+#if KERNEL_VERSION(4, 13, 0) <= LINUX_VERSION_CODE
+	.gem_prime_import = rknpu_gem_prime_import,
+#else
+	.gem_prime_import = drm_gem_prime_import,
+#endif
+	.gem_prime_get_sg_table = rknpu_gem_prime_get_sg_table,
+	.gem_prime_import_sg_table = rknpu_gem_prime_import_sg_table,
+	.gem_prime_vmap = rknpu_gem_prime_vmap,
+	.gem_prime_vunmap = rknpu_gem_prime_vunmap,
+	.gem_prime_mmap = rknpu_gem_prime_mmap,
+	.ioctls = rknpu_ioctls,
+	.num_ioctls = ARRAY_SIZE(rknpu_ioctls),
+	.fops = &rknpu_drm_driver_fops,
+	.name = DRIVER_NAME,
+	.desc = DRIVER_DESC,
+	.date = DRIVER_DATE,
+	.major = DRIVER_MAJOR,
+	.minor = DRIVER_MINOR,
+	.patchlevel = DRIVER_PATCHLEVEL,
+};
+
+static int rknpu_get_drv_version(uint32_t *version)
+{
+	*version = RKNPU_GET_DRV_VERSION_CODE(DRIVER_MAJOR, DRIVER_MINOR,
+					      DRIVER_PATCHLEVEL);
+	return 0;
+}
+
+static int rknpu_action_ioctl(struct drm_device *dev, void *data,
+			      struct drm_file *file_priv)
+{
+	struct rknpu_device *rknpu_dev = dev_get_drvdata(dev->dev);
+	struct rknpu_action *args = data;
+	int ret = -EINVAL;
+
+	switch (args->flags) {
+	case RKNPU_GET_HW_VERSION:
+		ret = rknpu_get_hw_version(rknpu_dev, &args->value);
+		break;
+	case RKNPU_GET_DRV_VERSION:
+		ret = rknpu_get_drv_version(&args->value);
+		break;
+	case RKNPU_GET_FREQ:
+		args->value = rknpu_dev->current_freq;
+		ret = 0;
+		break;
+	case RKNPU_SET_FREQ:
+		break;
+	case RKNPU_GET_VOLT:
+		args->value = rknpu_dev->current_volt;
+		ret = 0;
+		break;
+	case RKNPU_SET_VOLT:
+		break;
+	case RKNPU_ACT_RESET:
+		ret = rknpu_soft_reset(rknpu_dev);
+		break;
+	case RKNPU_GET_BW_PRIORITY:
+		ret = rknpu_get_bw_priority(rknpu_dev, &args->value, NULL,
+					    NULL);
+		break;
+	case RKNPU_SET_BW_PRIORITY:
+		ret = rknpu_set_bw_priority(rknpu_dev, args->value, 0, 0);
+		break;
+	case RKNPU_GET_BW_EXPECT:
+		ret = rknpu_get_bw_priority(rknpu_dev, NULL, &args->value,
+					    NULL);
+		break;
+	case RKNPU_SET_BW_EXPECT:
+		ret = rknpu_set_bw_priority(rknpu_dev, 0, args->value, 0);
+		break;
+	case RKNPU_GET_BW_TW:
+		ret = rknpu_get_bw_priority(rknpu_dev, NULL, NULL,
+					    &args->value);
+		break;
+	case RKNPU_SET_BW_TW:
+		ret = rknpu_set_bw_priority(rknpu_dev, 0, 0, args->value);
+		break;
+	case RKNPU_ACT_CLR_TOTAL_RW_AMOUNT:
+		ret = rknpu_clear_rw_amount(rknpu_dev);
+		break;
+	case RKNPU_GET_DT_WR_AMOUNT:
+		ret = rknpu_get_rw_amount(rknpu_dev, &args->value, NULL, NULL);
+		break;
+	case RKNPU_GET_DT_RD_AMOUNT:
+		ret = rknpu_get_rw_amount(rknpu_dev, NULL, &args->value, NULL);
+		break;
+	case RKNPU_GET_WT_RD_AMOUNT:
+		ret = rknpu_get_rw_amount(rknpu_dev, NULL, NULL, &args->value);
+		break;
+	case RKNPU_GET_TOTAL_RW_AMOUNT:
+		ret = rknpu_get_total_rw_amount(rknpu_dev, &args->value);
+		break;
+	case RKNPU_GET_IOMMU_EN:
+		args->value = rknpu_dev->iommu_en;
+		ret = 0;
+		break;
+	case RKNPU_SET_PROC_NICE:
+		set_user_nice(current, *(int32_t *)&args->value);
+		ret = 0;
+		break;
+	default:
+		ret = -EINVAL;
+		break;
+	}
+
+	return ret;
+}
+
+static bool rknpu_is_iommu_enable(struct device *dev)
+{
+	struct device_node *iommu = NULL;
+
+	iommu = of_parse_phandle(dev->of_node, "iommus", 0);
+	if (!iommu) {
+		LOG_DEV_INFO(
+			dev,
+			"rknpu iommu device-tree entry not found!, using non-iommu mode\n");
+		return false;
+	}
+
+	if (!of_device_is_available(iommu)) {
+		LOG_DEV_INFO(dev,
+			     "rknpu iommu is disabled, using non-iommu mode\n");
+		of_node_put(iommu);
+		return false;
+	}
+	of_node_put(iommu);
+
+	LOG_DEV_INFO(dev, "rknpu iommu is enabled, using iommu mode\n");
+
+	return true;
+}
+
+static int rknpu_drm_probe(struct rknpu_device *rknpu_dev)
+{
+	struct device *dev = rknpu_dev->dev;
+	struct drm_device *drm_dev = NULL;
+	int ret = -EINVAL;
+
+	drm_dev = drm_dev_alloc(&rknpu_drm_driver, dev);
+	if (IS_ERR(drm_dev))
+		return PTR_ERR(drm_dev);
+
+	/* register the DRM device */
+	ret = drm_dev_register(drm_dev, 0);
+	if (ret < 0)
+		goto err_free_drm;
+
+	drm_dev->dev_private = rknpu_dev;
+	rknpu_dev->drm_dev = drm_dev;
+
+	return 0;
+
+err_free_drm:
+#if KERNEL_VERSION(4, 15, 0) <= LINUX_VERSION_CODE
+	drm_dev_put(drm_dev);
+#else
+	drm_dev_unref(drm_dev);
+#endif
+
+	return ret;
+}
+
+static void rknpu_drm_remove(struct rknpu_device *rknpu_dev)
+{
+	struct drm_device *drm_dev = rknpu_dev->drm_dev;
+
+	drm_dev_unregister(drm_dev);
+#if KERNEL_VERSION(4, 15, 0) <= LINUX_VERSION_CODE
+	drm_dev_put(drm_dev);
+#else
+	drm_dev_unref(drm_dev);
+#endif
+}
+
+static int rknpu_power_on(struct rknpu_device *rknpu_dev)
+{
+	struct device *dev = rknpu_dev->dev;
+	int ret = -EINVAL;
+
+	ret = regulator_enable(rknpu_dev->vdd);
+	if (ret) {
+		LOG_DEV_ERROR(
+			dev, "failed to enable regulator for rknpu, ret = %d\n",
+			ret);
+		return ret;
+	}
+
+	ret = clk_bulk_prepare_enable(rknpu_dev->num_clks, rknpu_dev->clks);
+	if (ret) {
+		LOG_DEV_ERROR(dev, "failed to enable clk for rknpu, ret = %d\n",
+			      ret);
+		return ret;
+	}
+
+	ret = pm_runtime_get_sync(dev);
+	if (ret < 0) {
+		LOG_DEV_ERROR(dev,
+			      "failed to get pm runtime for rknpu, ret = %d\n",
+			      ret);
+		return ret;
+	}
+
+	return ret;
+}
+
+static int rknpu_power_off(struct rknpu_device *rknpu_dev)
+{
+	struct device *dev = rknpu_dev->dev;
+
+	pm_runtime_put_sync(dev);
+
+	clk_bulk_disable_unprepare(rknpu_dev->num_clks, rknpu_dev->clks);
+
+	regulator_disable(rknpu_dev->vdd);
+
+	return 0;
+}
+
+static struct monitor_dev_profile npu_mdevp = {
+	.type = MONITOR_TPYE_DEV,
+	.low_temp_adjust = rockchip_monitor_dev_low_temp_adjust,
+	.high_temp_adjust = rockchip_monitor_dev_high_temp_adjust,
+};
+
+static int npu_devfreq_target(struct device *dev, unsigned long *target_freq,
+			      u32 flags)
+{
+	struct rknpu_device *rknpu_dev = dev_get_drvdata(dev);
+	struct dev_pm_opp *opp = NULL;
+	unsigned long freq = *target_freq;
+	unsigned long old_freq = rknpu_dev->current_freq;
+	unsigned long volt, old_volt = rknpu_dev->current_volt;
+	int ret = -EINVAL;
+
+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
+	rcu_read_lock();
+#endif
+
+	opp = devfreq_recommended_opp(dev, &freq, flags);
+	if (IS_ERR(opp)) {
+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
+		rcu_read_unlock();
+#endif
+		LOG_DEV_ERROR(dev, "failed to get opp (%ld)\n", PTR_ERR(opp));
+		return PTR_ERR(opp);
+	}
+	volt = dev_pm_opp_get_voltage(opp);
+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
+	rcu_read_unlock();
+#endif
+
+	/*
+	 * Only update if there is a change of frequency
+	 */
+	if (old_freq == freq) {
+		*target_freq = freq;
+		if (old_volt == volt)
+			return 0;
+		ret = regulator_set_voltage(rknpu_dev->vdd, volt, INT_MAX);
+		if (ret) {
+			LOG_DEV_ERROR(dev, "failed to set volt %lu\n", volt);
+			return ret;
+		}
+		rknpu_dev->current_volt = volt;
+		return 0;
+	}
+
+	if (rknpu_dev->vdd && old_volt != volt && old_freq < freq) {
+		ret = regulator_set_voltage(rknpu_dev->vdd, volt, INT_MAX);
+		if (ret) {
+			LOG_DEV_ERROR(dev, "failed to increase volt %lu\n",
+				      volt);
+			return ret;
+		}
+	}
+	LOG_DEV_DEBUG(dev, "%luHz %luuV -> %luHz %luuV\n", old_freq, old_volt,
+		      freq, volt);
+	ret = clk_set_rate(rknpu_dev->clks[0].clk, freq);
+	if (ret) {
+		LOG_DEV_ERROR(dev, "failed to set clock %lu\n", freq);
+		return ret;
+	}
+	*target_freq = freq;
+	rknpu_dev->current_freq = freq;
+
+	if (rknpu_dev->devfreq)
+		rknpu_dev->devfreq->last_status.current_frequency = freq;
+
+	if (rknpu_dev->vdd && old_volt != volt && old_freq > freq) {
+		ret = regulator_set_voltage(rknpu_dev->vdd, volt, INT_MAX);
+		if (ret) {
+			LOG_DEV_ERROR(dev, "failed to decrease volt %lu\n",
+				      volt);
+			return ret;
+		}
+	}
+	rknpu_dev->current_volt = volt;
+
+	return ret;
+}
+
+static int npu_devfreq_get_dev_status(struct device *dev,
+				      struct devfreq_dev_status *stat)
+{
+	return 0;
+}
+
+static int npu_devfreq_get_cur_freq(struct device *dev, unsigned long *freq)
+{
+	struct rknpu_device *rknpu_dev = dev_get_drvdata(dev);
+
+	*freq = rknpu_dev->current_freq;
+
+	return 0;
+}
+
+static struct devfreq_dev_profile npu_devfreq_profile = {
+	.polling_ms = 50,
+	.target = npu_devfreq_target,
+	.get_dev_status = npu_devfreq_get_dev_status,
+	.get_cur_freq = npu_devfreq_get_cur_freq,
+};
+
+static unsigned long npu_get_static_power(struct devfreq *devfreq,
+					  unsigned long voltage)
+{
+	struct device *dev = devfreq->dev.parent;
+	struct rknpu_device *rknpu_dev = dev_get_drvdata(dev);
+
+	if (!rknpu_dev->model_data)
+		return 0;
+
+	return rockchip_ipa_get_static_power(rknpu_dev->model_data, voltage);
+}
+
+static struct devfreq_cooling_power npu_cooling_power = {
+	.get_static_power = &npu_get_static_power,
+};
+
+static int npu_devfreq_adjust_current_freq_volt(struct device *dev,
+						struct rknpu_device *rknpu_dev)
+{
+	unsigned long volt, old_freq, freq;
+	struct dev_pm_opp *opp = NULL;
+	int ret = -EINVAL;
+
+	old_freq = clk_get_rate(rknpu_dev->clks[0].clk);
+	freq = old_freq;
+
+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
+	rcu_read_lock();
+#endif
+
+	opp = devfreq_recommended_opp(dev, &freq, 0);
+	volt = dev_pm_opp_get_voltage(opp);
+
+#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
+	rcu_read_unlock();
+#endif
+
+	if (freq >= old_freq && rknpu_dev->vdd) {
+		ret = regulator_set_voltage(rknpu_dev->vdd, volt, INT_MAX);
+		if (ret) {
+			LOG_DEV_ERROR(dev, "failed to set volt %lu\n", volt);
+			return ret;
+		}
+	}
+	LOG_DEV_DEBUG(dev, "adjust current freq=%luHz, volt=%luuV\n", freq,
+		      volt);
+	ret = clk_set_rate(rknpu_dev->clks[0].clk, freq);
+	if (ret) {
+		LOG_DEV_ERROR(dev, "failed to set clock %lu\n", freq);
+		return ret;
+	}
+	if (freq < old_freq && rknpu_dev->vdd) {
+		ret = regulator_set_voltage(rknpu_dev->vdd, volt, INT_MAX);
+		if (ret) {
+			LOG_DEV_ERROR(dev, "failed to set volt %lu\n", volt);
+			return ret;
+		}
+	}
+	rknpu_dev->current_freq = freq;
+	rknpu_dev->current_volt = volt;
+
+	return 0;
+}
+
+static int rknpu_devfreq_init(struct rknpu_device *rknpu_dev)
+{
+	struct device *dev = rknpu_dev->dev;
+	struct devfreq_dev_profile *dp = &npu_devfreq_profile;
+	int ret = -EINVAL;
+
+	ret = rockchip_init_opp_table(dev, NULL, "npu_leakage", "rknpu");
+
+	if (ret) {
+		LOG_DEV_ERROR(dev, "failed to init_opp_table\n");
+		return ret;
+	}
+
+	ret = npu_devfreq_adjust_current_freq_volt(dev, rknpu_dev);
+	if (ret) {
+		LOG_DEV_ERROR(dev, "failed to adjust current freq volt\n");
+		return ret;
+	}
+	dp->initial_freq = rknpu_dev->current_freq;
+
+	rknpu_dev->devfreq =
+		devm_devfreq_add_device(dev, dp, "userspace", NULL);
+	if (IS_ERR(rknpu_dev->devfreq)) {
+		LOG_DEV_ERROR(dev, "failed to add devfreq\n");
+		return PTR_ERR(rknpu_dev->devfreq);
+	}
+	devm_devfreq_register_opp_notifier(dev, rknpu_dev->devfreq);
+
+	rknpu_dev->devfreq->last_status.current_frequency = dp->initial_freq;
+	rknpu_dev->devfreq->last_status.total_time = 1;
+	rknpu_dev->devfreq->last_status.busy_time = 1;
+
+	npu_mdevp.data = rknpu_dev->devfreq;
+	rknpu_dev->mdev_info =
+		rockchip_system_monitor_register(dev, &npu_mdevp);
+	if (IS_ERR(rknpu_dev->mdev_info)) {
+		LOG_DEV_DEBUG(dev, "without system monitor\n");
+		rknpu_dev->mdev_info = NULL;
+	}
+
+	of_property_read_u32(dev->of_node, "dynamic-power-coefficient",
+			     (u32 *)&npu_cooling_power.dyn_power_coeff);
+
+#if KERNEL_VERSION(4, 4, 179) <= LINUX_VERSION_CODE
+	rknpu_dev->model_data =
+		rockchip_ipa_power_model_init(dev, "npu_leakage");
+	if (IS_ERR_OR_NULL(rknpu_dev->model_data)) {
+#else
+	ret = rockchip_ipa_power_model_init(dev, &rknpu_dev->model_data);
+	if (ret) {
+#endif
+		rknpu_dev->model_data = NULL;
+		LOG_DEV_ERROR(dev, "failed to initialize power model\n");
+	} else if (rknpu_dev->model_data->dynamic_coefficient) {
+		npu_cooling_power.dyn_power_coeff =
+			rknpu_dev->model_data->dynamic_coefficient;
+	}
+
+	if (!npu_cooling_power.dyn_power_coeff) {
+		LOG_DEV_ERROR(dev, "failed to get dynamic-coefficient\n");
+		goto out;
+	}
+
+#if KERNEL_VERSION(4, 4, 179) > LINUX_VERSION_CODE
+	rockchip_of_get_leakage(dev, "npu_leakage",
+				&rknpu_dev->model_data->leakage);
+#endif
+	rknpu_dev->devfreq_cooling = of_devfreq_cooling_register_power(
+		dev->of_node, rknpu_dev->devfreq, &npu_cooling_power);
+	if (IS_ERR_OR_NULL(rknpu_dev->devfreq_cooling))
+		LOG_DEV_ERROR(dev, "failed to register cooling device\n");
+
+out:
+	return 0;
+}
+
+static int rknpu_probe(struct platform_device *pdev)
+{
+	struct resource *res = NULL;
+	struct rknpu_device *rknpu_dev = NULL;
+	struct device *dev = &pdev->dev;
+	const struct of_device_id *match = NULL;
+	const struct rknpu_config *config = NULL;
+	int ret = -EINVAL;
+
+	if (!pdev->dev.of_node) {
+		LOG_DEV_ERROR(dev, "rknpu device-tree data is missing!\n");
+		return -ENODEV;
+	}
+
+	match = of_match_device(rknpu_of_match, dev);
+	if (!match) {
+		LOG_DEV_ERROR(dev, "rknpu device-tree entry is missing!\n");
+		return -ENODEV;
+	}
+
+	rknpu_dev = devm_kzalloc(dev, sizeof(*rknpu_dev), GFP_KERNEL);
+	if (!rknpu_dev) {
+		LOG_DEV_ERROR(dev, "failed to allocate rknpu device!\n");
+		return -ENOMEM;
+	}
+
+	config = of_device_get_match_data(dev);
+	if (!config)
+		return -EINVAL;
+
+	rknpu_dev->config = config;
+	rknpu_dev->dev = dev;
+
+	rknpu_dev->iommu_en = rknpu_is_iommu_enable(dev);
+	if (!rknpu_dev->iommu_en) {
+		/* Initialize reserved memory resources */
+		ret = of_reserved_mem_device_init(dev);
+		if (!ret) {
+			LOG_DEV_INFO(
+				dev,
+				"initialize reserved memory for rknpu device!\n");
+		}
+	}
+
+	rknpu_reset_get(rknpu_dev);
+
+	rknpu_dev->num_clks = devm_clk_bulk_get_all(dev, &rknpu_dev->clks);
+	if (rknpu_dev->num_clks < 1) {
+		LOG_DEV_ERROR(dev, "failed to get clk source for rknpu\n");
+		return -ENODEV;
+	}
+
+	rknpu_dev->vdd = devm_regulator_get_optional(dev, "rknpu");
+	if (IS_ERR(rknpu_dev->vdd)) {
+		if (PTR_ERR(rknpu_dev->vdd) != -ENODEV) {
+			ret = PTR_ERR(rknpu_dev->vdd);
+			LOG_DEV_ERROR(
+				dev,
+				"failed to get vdd regulator for rknpu: %d\n",
+				ret);
+			return ret;
+		}
+		rknpu_dev->vdd = NULL;
+	}
+
+	spin_lock_init(&rknpu_dev->lock);
+	spin_lock_init(&rknpu_dev->irq_lock);
+	INIT_LIST_HEAD(&rknpu_dev->todo_list);
+	init_waitqueue_head(&rknpu_dev->job_done_wq);
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res) {
+		LOG_DEV_ERROR(dev, "failed to get memory resource for rknpu\n");
+		return -ENXIO;
+	}
+
+	rknpu_dev->base = devm_ioremap_resource(dev, res);
+	if (PTR_ERR(rknpu_dev->base) == -EBUSY) {
+		rknpu_dev->base =
+			devm_ioremap(dev, res->start, resource_size(res));
+	}
+
+	if (IS_ERR(rknpu_dev->base)) {
+		LOG_DEV_ERROR(dev, "failed to remap register for rknpu\n");
+		return PTR_ERR(rknpu_dev->base);
+	}
+
+	rknpu_dev->bw_priority_base = devm_ioremap(
+		dev, config->bw_priority_base, config->bw_priority_length);
+	if (IS_ERR(rknpu_dev->bw_priority_base)) {
+		LOG_DEV_ERROR(
+			rknpu_dev->dev,
+			"failed to remap bw priority register for rknpu\n");
+		rknpu_dev->bw_priority_base = NULL;
+	}
+
+	res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+	if (!res) {
+		LOG_DEV_ERROR(dev,
+			      "failed to get interrupt resource for rknpu\n");
+		return -ENXIO;
+	}
+
+	if (!bypass_irq_handler) {
+		ret = devm_request_irq(dev, res->start, rknpu_irq_handler,
+				       IRQF_SHARED, dev_name(dev), rknpu_dev);
+		if (ret) {
+			LOG_DEV_ERROR(dev, "failed to request irq for rknpu\n");
+			return ret;
+		}
+	}
+
+	ret = rknpu_drm_probe(rknpu_dev);
+	if (ret) {
+		LOG_DEV_ERROR(dev, "failed to probe device for rknpu\n");
+		return ret;
+	}
+
+	rknpu_dev->fence_ctx = rknpu_fence_context_alloc();
+	if (IS_ERR(rknpu_dev->fence_ctx)) {
+		LOG_DEV_ERROR(dev,
+			      "failed to allocate fence context for rknpu\n");
+		ret = PTR_ERR(rknpu_dev->fence_ctx);
+		goto err_remove_drm;
+	}
+
+	platform_set_drvdata(pdev, rknpu_dev);
+
+	rknpu_devfreq_init(rknpu_dev);
+
+	pm_runtime_enable(dev);
+
+	ret = rknpu_power_on(rknpu_dev);
+	if (ret)
+		goto err_free_fence_context;
+
+	return 0;
+
+err_free_fence_context:
+	rknpu_fence_context_free(rknpu_dev->fence_ctx);
+err_remove_drm:
+	rknpu_drm_remove(rknpu_dev);
+
+	return ret;
+}
+
+static int rknpu_remove(struct platform_device *pdev)
+{
+	struct rknpu_device *rknpu_dev = platform_get_drvdata(pdev);
+
+	WARN_ON(rknpu_dev->job);
+	WARN_ON(!list_empty(&rknpu_dev->todo_list));
+
+	rknpu_drm_remove(rknpu_dev);
+
+	rknpu_fence_context_free(rknpu_dev->fence_ctx);
+
+	rknpu_power_off(rknpu_dev);
+
+	pm_runtime_disable(&pdev->dev);
+
+	return 0;
+}
+
+static struct platform_driver rknpu_driver = {
+	.probe = rknpu_probe,
+	.remove = rknpu_remove,
+	.driver = {
+		.owner = THIS_MODULE,
+		.name = "RKNPU",
+		.of_match_table = of_match_ptr(rknpu_of_match),
+	},
+};
+
+static int rknpu_init(void)
+{
+	return platform_driver_register(&rknpu_driver);
+}
+
+static void rknpu_exit(void)
+{
+	platform_driver_unregister(&rknpu_driver);
+}
+
+late_initcall(rknpu_init);
+module_exit(rknpu_exit);
+
+MODULE_DESCRIPTION("RKNPU driver");
+MODULE_AUTHOR("Felix Zeng <felix.zeng@rock-chips.com>");
+MODULE_ALIAS("rockchip-rknpu");
+MODULE_LICENSE("GPL v2");
+MODULE_VERSION(RKNPU_GET_DRV_VERSION_STRING(DRIVER_MAJOR, DRIVER_MINOR,
+					    DRIVER_PATCHLEVEL));
diff --git a/drivers/rknpu/rknpu_fence.c b/drivers/rknpu/rknpu_fence.c
new file mode 100644
index 000000000000..cbfb6c197fb6
--- /dev/null
+++ b/drivers/rknpu/rknpu_fence.c
@@ -0,0 +1,81 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
+ * Author: Felix Zeng <felix.zeng@rock-chips.com>
+ */
+
+#include <linux/dma-fence.h>
+#include <linux/sync_file.h>
+
+#include "rknpu_drv.h"
+#include "rknpu_job.h"
+
+#include "rknpu_fence.h"
+
+static const char *rknpu_fence_get_name(struct dma_fence *fence)
+{
+	return DRIVER_NAME;
+}
+
+static const struct dma_fence_ops rknpu_fence_ops = {
+	.get_driver_name = rknpu_fence_get_name,
+	.get_timeline_name = rknpu_fence_get_name,
+};
+
+struct rknpu_fence_context *rknpu_fence_context_alloc(void)
+{
+	struct rknpu_fence_context *fence_ctx = NULL;
+
+	fence_ctx = kzalloc(sizeof(*fence_ctx), GFP_KERNEL);
+	if (!fence_ctx)
+		return ERR_PTR(-ENOMEM);
+
+	fence_ctx->context = dma_fence_context_alloc(1);
+	spin_lock_init(&fence_ctx->spinlock);
+
+	return fence_ctx;
+}
+
+void rknpu_fence_context_free(struct rknpu_fence_context *fence_ctx)
+{
+	if (!IS_ERR(fence_ctx))
+		kfree(fence_ctx);
+}
+
+int rknpu_fence_alloc(struct rknpu_job *job)
+{
+	struct rknpu_fence_context *fence_ctx = job->rknpu_dev->fence_ctx;
+	struct dma_fence *fence = NULL;
+
+	fence = kzalloc(sizeof(*fence), GFP_KERNEL);
+	if (!fence)
+		return -ENOMEM;
+
+	dma_fence_init(fence, &rknpu_fence_ops, &job->fence_lock,
+		       fence_ctx->context, ++fence_ctx->seqno);
+
+	job->fence = fence;
+
+	return 0;
+}
+
+int rknpu_fence_get_fd(struct rknpu_job *job)
+{
+	struct sync_file *sync_file = NULL;
+	int fence_fd = -1;
+
+	if (!job->fence)
+		return -EINVAL;
+
+	fence_fd = get_unused_fd_flags(O_CLOEXEC);
+	if (fence_fd < 0)
+		return fence_fd;
+
+	sync_file = sync_file_create(job->fence);
+	if (!sync_file)
+		return -ENOMEM;
+
+	fd_install(fence_fd, sync_file->file);
+
+	return fence_fd;
+}
diff --git a/drivers/rknpu/rknpu_gem.c b/drivers/rknpu/rknpu_gem.c
new file mode 100644
index 000000000000..76080cf121b4
--- /dev/null
+++ b/drivers/rknpu/rknpu_gem.c
@@ -0,0 +1,975 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
+ * Author: Felix Zeng <felix.zeng@rock-chips.com>
+ */
+
+#include <drm/drmP.h>
+#include <drm/drm_vma_manager.h>
+
+#include <linux/shmem_fs.h>
+#include <linux/dma-buf.h>
+#include <linux/pfn_t.h>
+
+#include "rknpu_drv.h"
+#include "rknpu_ioctl.h"
+#include "rknpu_gem.h"
+
+#define RKNPU_GEM_ALLOC_FROM_PAGES 0
+
+#if RKNPU_GEM_ALLOC_FROM_PAGES
+static int rknpu_gem_get_pages(struct rknpu_gem_object *rknpu_obj)
+{
+	struct drm_device *drm = rknpu_obj->base.dev;
+	struct scatterlist *s = NULL;
+	int ret = -EINVAL, i = 0;
+
+	rknpu_obj->pages = drm_gem_get_pages(&rknpu_obj->base);
+	if (IS_ERR(rknpu_obj->pages))
+		return PTR_ERR(rknpu_obj->pages);
+
+	rknpu_obj->num_pages = rknpu_obj->base.size >> PAGE_SHIFT;
+
+	rknpu_obj->sgt =
+		drm_prime_pages_to_sg(rknpu_obj->pages, rknpu_obj->num_pages);
+	if (IS_ERR(rknpu_obj->sgt)) {
+		ret = PTR_ERR(rknpu_obj->sgt);
+		goto put_pages;
+	}
+
+	for_each_sg(rknpu_obj->sgt->sgl, s, rknpu_obj->sgt->nents, i) {
+		sg_dma_address(s) = sg_phys(s);
+		LOG_DEBUG(
+			"gem pages alloc sgt[%d], phys_address: %#llx, length: %#x\n",
+			i, (__u64)s->dma_address, s->length);
+	}
+
+	ret = dma_map_sg_attrs(drm->dev, rknpu_obj->sgt->sgl,
+			       rknpu_obj->sgt->nents, DMA_BIDIRECTIONAL,
+			       rknpu_obj->dma_attrs);
+	if (ret == 0) {
+		LOG_DEV_ERROR(drm->dev, "failed to map sg table.\n");
+		ret = -EFAULT;
+		goto free_sgt;
+	}
+
+	if (rknpu_obj->flags & RKNPU_MEM_KERNEL_MAPPING) {
+		rknpu_obj->kv_addr =
+			vmap(rknpu_obj->pages, rknpu_obj->num_pages, VM_MAP,
+			     PAGE_KERNEL);
+	}
+
+	rknpu_obj->dma_addr = (__u64)sg_dma_address(rknpu_obj->sgt->sgl);
+
+	return 0;
+
+free_sgt:
+	sg_free_table(rknpu_obj->sgt);
+	kfree(rknpu_obj->sgt);
+put_pages:
+	drm_gem_put_pages(&rknpu_obj->base, rknpu_obj->pages, false, false);
+
+	return ret;
+}
+
+static void rknpu_gem_put_pages(struct rknpu_gem_object *rknpu_obj)
+{
+	struct drm_device *drm = rknpu_obj->base.dev;
+
+	if (rknpu_obj->flags & RKNPU_MEM_KERNEL_MAPPING)
+		vunmap(rknpu_obj->kv_addr);
+
+	dma_map_sg_attrs(drm->dev, rknpu_obj->sgt->sgl, rknpu_obj->sgt->nents,
+			 DMA_BIDIRECTIONAL, rknpu_obj->dma_attrs);
+	drm_gem_put_pages(&rknpu_obj->base, rknpu_obj->pages, true, true);
+	sg_free_table(rknpu_obj->sgt);
+	kfree(rknpu_obj->sgt);
+}
+#endif
+
+#ifndef arch_dma_alloc_attrs
+#define arch_dma_alloc_attrs(dev) (true)
+#endif
+
+static inline void *dma_alloc_attrs_gfp(struct device *dev, size_t size,
+					dma_addr_t *dma_handle, gfp_t flag,
+					unsigned long attrs)
+{
+	const struct dma_map_ops *ops = get_dma_ops(dev);
+	void *cpu_addr;
+
+	BUG_ON(!ops);
+	WARN_ON_ONCE(dev && !dev->coherent_dma_mask);
+
+	if (dma_alloc_from_dev_coherent(dev, size, dma_handle, &cpu_addr))
+		return cpu_addr;
+
+	if (!arch_dma_alloc_attrs(&dev))
+		return NULL;
+	if (!ops->alloc)
+		return NULL;
+
+	cpu_addr = ops->alloc(dev, size, dma_handle, flag, attrs);
+
+	return cpu_addr;
+}
+
+static int rknpu_gem_alloc_buf(struct rknpu_gem_object *rknpu_obj)
+{
+	struct drm_device *drm = rknpu_obj->base.dev;
+	struct rknpu_device *rknpu_dev = drm->dev_private;
+	unsigned int nr_pages = 0;
+	struct sg_table *sgt = NULL;
+	struct scatterlist *s = NULL;
+	gfp_t gfp = GFP_KERNEL;
+	int ret = -EINVAL, i = 0;
+
+	if (rknpu_obj->dma_addr) {
+		LOG_DEBUG("buffer already allocated.\n");
+		return 0;
+	}
+
+	rknpu_obj->dma_attrs = 0;
+
+	/*
+	 * if RKNPU_MEM_CONTIGUOUS, fully physically contiguous memory
+	 * region will be allocated else physically contiguous
+	 * as possible.
+	 */
+	if (!(rknpu_obj->flags & RKNPU_MEM_NON_CONTIGUOUS))
+		rknpu_obj->dma_attrs |= DMA_ATTR_FORCE_CONTIGUOUS;
+
+	// cacheable mapping or writecombine mapping
+	if (rknpu_obj->flags & RKNPU_MEM_CACHEABLE) {
+		rknpu_obj->dma_attrs |= DMA_ATTR_NON_CONSISTENT;
+		// force coherent
+		rknpu_obj->dma_attrs |= DMA_ATTR_FORCE_COHERENT;
+	} else if (rknpu_obj->flags & RKNPU_MEM_WRITE_COMBINE) {
+		rknpu_obj->dma_attrs |= DMA_ATTR_WRITE_COMBINE;
+	}
+
+	if (!(rknpu_obj->flags & RKNPU_MEM_KERNEL_MAPPING))
+		rknpu_obj->dma_attrs |= DMA_ATTR_NO_KERNEL_MAPPING;
+
+	if (!(rknpu_obj->flags & RKNPU_MEM_ZEROING))
+		rknpu_obj->dma_attrs |= DMA_ATTR_SKIP_ZEROING;
+
+#if RKNPU_GEM_ALLOC_FROM_PAGES
+	if ((rknpu_obj->flags & RKNPU_MEM_NON_CONTIGUOUS) &&
+	    rknpu_dev->iommu_en) {
+		return rknpu_gem_get_pages(rknpu_obj);
+	}
+#endif
+
+	if (!(rknpu_obj->flags & RKNPU_MEM_NON_DMA32))
+		gfp |= __GFP_DMA32;
+
+	nr_pages = rknpu_obj->size >> PAGE_SHIFT;
+
+	rknpu_obj->pages = rknpu_gem_alloc_page(nr_pages);
+	if (!rknpu_obj->pages) {
+		LOG_ERROR("failed to allocate pages.\n");
+		return -ENOMEM;
+	}
+
+	rknpu_obj->cookie = dma_alloc_attrs_gfp(drm->dev, rknpu_obj->size,
+						&rknpu_obj->dma_addr, gfp,
+						rknpu_obj->dma_attrs);
+	if (!rknpu_obj->cookie) {
+		/*
+		 * when RKNPU_MEM_CONTIGUOUS and IOMMU is available
+		 * try to fallback to allocate non-contiguous buffer
+		 */
+		if (!(rknpu_obj->flags & RKNPU_MEM_NON_CONTIGUOUS) &&
+		    rknpu_dev->iommu_en) {
+			LOG_DEV_WARN(
+				drm->dev,
+				"try to fallback to allocate non-contiguous %lu buffer.\n",
+				rknpu_obj->size);
+			rknpu_obj->dma_attrs &= ~DMA_ATTR_FORCE_CONTIGUOUS;
+			rknpu_obj->flags |= RKNPU_MEM_NON_CONTIGUOUS;
+			rknpu_obj->cookie =
+				dma_alloc_attrs_gfp(drm->dev, rknpu_obj->size,
+						    &rknpu_obj->dma_addr, gfp,
+						    rknpu_obj->dma_attrs);
+			if (!rknpu_obj->cookie) {
+				LOG_DEV_ERROR(
+					drm->dev,
+					"failed to allocate non-contiguous %lu buffer.\n",
+					rknpu_obj->size);
+				goto err_free;
+			}
+		} else {
+			LOG_DEV_ERROR(drm->dev,
+				      "failed to allocate %lu buffer.\n",
+				      rknpu_obj->size);
+			goto err_free;
+		}
+	}
+
+	if (rknpu_obj->flags & RKNPU_MEM_KERNEL_MAPPING)
+		rknpu_obj->kv_addr = rknpu_obj->cookie;
+
+	sgt = kzalloc(sizeof(*sgt), GFP_KERNEL);
+	if (!sgt) {
+		ret = -ENOMEM;
+		goto err_free_dma;
+	}
+
+	ret = dma_get_sgtable_attrs(drm->dev, sgt, rknpu_obj->cookie,
+				    rknpu_obj->dma_addr, rknpu_obj->size,
+				    rknpu_obj->dma_attrs);
+	if (ret < 0) {
+		LOG_DEV_ERROR(drm->dev, "failed to get sgtable.\n");
+		goto err_free_sgt;
+	}
+
+	for_each_sg(sgt->sgl, s, sgt->nents, i) {
+		sg_dma_address(s) = sg_phys(s);
+		LOG_DEBUG(
+			"dma alloc sgt[%d], phys_address: %#llx, length: %u\n",
+			i, (__u64)s->dma_address, s->length);
+	}
+
+	if (drm_prime_sg_to_page_addr_arrays(sgt, rknpu_obj->pages, NULL,
+					     nr_pages)) {
+		LOG_DEV_ERROR(drm->dev, "invalid sgtable.\n");
+		ret = -EINVAL;
+		goto err_free_sg_table;
+	}
+
+	rknpu_obj->sgt = sgt;
+
+	return ret;
+
+err_free_sg_table:
+	sg_free_table(sgt);
+err_free_sgt:
+	kfree(sgt);
+err_free_dma:
+	dma_free_attrs(drm->dev, rknpu_obj->size, rknpu_obj->cookie,
+		       rknpu_obj->dma_addr, rknpu_obj->dma_attrs);
+err_free:
+	rknpu_gem_free_page(rknpu_obj->pages);
+
+	return ret;
+}
+
+static void rknpu_gem_free_buf(struct rknpu_gem_object *rknpu_obj)
+{
+	struct drm_device *drm = rknpu_obj->base.dev;
+#if RKNPU_GEM_ALLOC_FROM_PAGES
+	struct rknpu_device *rknpu_dev = drm->dev_private;
+#endif
+
+	if (!rknpu_obj->dma_addr) {
+		LOG_DEBUG("dma handle is invalid.\n");
+		return;
+	}
+
+#if RKNPU_GEM_ALLOC_FROM_PAGES
+	if ((rknpu_obj->flags & RKNPU_MEM_NON_CONTIGUOUS) &&
+	    rknpu_dev->iommu_en) {
+		rknpu_gem_put_pages(rknpu_obj);
+		return;
+	}
+#endif
+
+	sg_free_table(rknpu_obj->sgt);
+	kfree(rknpu_obj->sgt);
+
+	dma_free_attrs(drm->dev, rknpu_obj->size, rknpu_obj->cookie,
+		       rknpu_obj->dma_addr, rknpu_obj->dma_attrs);
+
+	rknpu_gem_free_page(rknpu_obj->pages);
+
+	rknpu_obj->dma_addr = 0;
+}
+
+static int rknpu_gem_handle_create(struct drm_gem_object *obj,
+				   struct drm_file *file_priv,
+				   unsigned int *handle)
+{
+	int ret = -EINVAL;
+	/*
+	 * allocate a id of idr table where the obj is registered
+	 * and handle has the id what user can see.
+	 */
+	ret = drm_gem_handle_create(file_priv, obj, handle);
+	if (ret)
+		return ret;
+
+	LOG_DEBUG("gem handle = %#x\n", *handle);
+
+	/* drop reference from allocate - handle holds it now. */
+	rknpu_gem_object_put(obj);
+
+	return 0;
+}
+
+static int rknpu_gem_handle_destroy(struct drm_file *file_priv,
+				    unsigned int handle)
+{
+	return drm_gem_handle_delete(file_priv, handle);
+}
+
+static struct rknpu_gem_object *rknpu_gem_init(struct drm_device *drm,
+					       unsigned long size)
+{
+	struct rknpu_gem_object *rknpu_obj = NULL;
+	struct drm_gem_object *obj = NULL;
+	struct address_space *mapping = NULL;
+	int ret = -EINVAL;
+
+	rknpu_obj = kzalloc(sizeof(*rknpu_obj), GFP_KERNEL);
+	if (!rknpu_obj)
+		return ERR_PTR(-ENOMEM);
+
+	rknpu_obj->size = size;
+	obj = &rknpu_obj->base;
+
+	ret = drm_gem_object_init(drm, obj, size);
+	if (ret < 0) {
+		LOG_DEV_ERROR(drm->dev, "failed to initialize gem object\n");
+		kfree(rknpu_obj);
+		return ERR_PTR(ret);
+	}
+
+	mapping = obj->filp->f_mapping;
+	mapping_set_gfp_mask(mapping, GFP_HIGHUSER | __GFP_NOWARN);
+
+	ret = drm_gem_create_mmap_offset(obj);
+	if (ret < 0) {
+		drm_gem_object_release(obj);
+		kfree(rknpu_obj);
+		return ERR_PTR(ret);
+	}
+
+	return rknpu_obj;
+}
+
+struct rknpu_gem_object *rknpu_gem_object_create(struct drm_device *drm,
+						 unsigned int flags,
+						 unsigned long size)
+{
+	struct rknpu_device *rknpu_dev = drm->dev_private;
+	struct rknpu_gem_object *rknpu_obj = NULL;
+	int ret = -EINVAL;
+
+	if (flags & ~(RKNPU_MEM_MASK)) {
+		LOG_DEV_ERROR(drm->dev, "invalid buffer flags: %u\n", flags);
+		return ERR_PTR(-EINVAL);
+	}
+
+	if (!size) {
+		LOG_DEV_ERROR(drm->dev, "invalid buffer size: %lu\n", size);
+		return ERR_PTR(-EINVAL);
+	}
+
+	size = roundup(size, PAGE_SIZE);
+
+	rknpu_obj = rknpu_gem_init(drm, size);
+	if (IS_ERR(rknpu_obj))
+		return rknpu_obj;
+
+	if (!rknpu_dev->iommu_en && (flags & RKNPU_MEM_NON_CONTIGUOUS)) {
+		/*
+		 * when no IOMMU is available, all allocated buffers are
+		 * contiguous anyway, so drop RKNPU_MEM_NON_CONTIGUOUS flag
+		 */
+		flags &= ~RKNPU_MEM_NON_CONTIGUOUS;
+		LOG_WARN(
+			"non-contiguous allocation is not supported without IOMMU, falling back to contiguous buffer\n");
+	}
+
+	/* set memory type and cache attribute from user side. */
+	rknpu_obj->flags = flags;
+
+	ret = rknpu_gem_alloc_buf(rknpu_obj);
+	if (ret < 0) {
+		drm_gem_object_release(&rknpu_obj->base);
+		kfree(rknpu_obj);
+		return ERR_PTR(ret);
+	}
+
+	LOG_DEBUG(
+		"create dma addr = %#llx, cookie = 0x%p, size = %lu, attrs = %#lx, flags = %#x\n",
+		(__u64)rknpu_obj->dma_addr, rknpu_obj->cookie, rknpu_obj->size,
+		rknpu_obj->dma_attrs, rknpu_obj->flags);
+
+	return rknpu_obj;
+}
+
+void rknpu_gem_object_destroy(struct rknpu_gem_object *rknpu_obj)
+{
+	struct drm_gem_object *obj = &rknpu_obj->base;
+
+	LOG_DEBUG(
+		"destroy dma addr = %#llx, cookie = 0x%p, size = %lu, attrs = %#lx, flags = %#x, handle count = %d\n",
+		(__u64)rknpu_obj->dma_addr, rknpu_obj->cookie, rknpu_obj->size,
+		rknpu_obj->dma_attrs, rknpu_obj->flags, obj->handle_count);
+
+	/*
+	 * do not release memory region from exporter.
+	 *
+	 * the region will be released by exporter
+	 * once dmabuf's refcount becomes 0.
+	 */
+	if (obj->import_attach) {
+		drm_prime_gem_destroy(obj, rknpu_obj->sgt);
+		rknpu_gem_free_page(rknpu_obj->pages);
+	} else {
+		rknpu_gem_free_buf(rknpu_obj);
+	}
+
+	/* release file pointer to gem object. */
+	drm_gem_object_release(obj);
+
+	kfree(rknpu_obj);
+}
+
+int rknpu_gem_create_ioctl(struct drm_device *dev, void *data,
+			   struct drm_file *file_priv)
+{
+	struct rknpu_mem_create *args = data;
+	struct rknpu_gem_object *rknpu_obj = NULL;
+	int ret = -EINVAL;
+
+	rknpu_obj = rknpu_gem_object_find(file_priv, args->handle);
+	if (!rknpu_obj) {
+		rknpu_obj =
+			rknpu_gem_object_create(dev, args->flags, args->size);
+		if (IS_ERR(rknpu_obj))
+			return PTR_ERR(rknpu_obj);
+
+		ret = rknpu_gem_handle_create(&rknpu_obj->base, file_priv,
+					      &args->handle);
+		if (ret) {
+			rknpu_gem_object_destroy(rknpu_obj);
+			return ret;
+		}
+	}
+
+	// rknpu_gem_object_get(&rknpu_obj->base);
+
+	args->size = rknpu_obj->size;
+	args->obj_addr = (__u64)rknpu_obj;
+	args->dma_addr = rknpu_obj->dma_addr;
+
+	return 0;
+}
+
+int rknpu_gem_map_ioctl(struct drm_device *dev, void *data,
+			struct drm_file *file_priv)
+{
+	struct rknpu_mem_map *args = data;
+
+#if KERNEL_VERSION(4, 19, 0) > LINUX_VERSION_CODE
+	return rknpu_gem_dumb_map_offset(file_priv, dev, args->handle,
+					 &args->offset);
+#else
+	return drm_gem_dumb_map_offset(file_priv, dev, args->handle,
+				       &args->offset);
+#endif
+}
+
+int rknpu_gem_destroy_ioctl(struct drm_device *dev, void *data,
+			    struct drm_file *file_priv)
+{
+	struct rknpu_gem_object *rknpu_obj = NULL;
+	struct drm_gem_object *obj = NULL;
+	struct rknpu_mem_destroy *args = data;
+
+	rknpu_obj = rknpu_gem_object_find(file_priv, args->handle);
+	if (!rknpu_obj)
+		return -EINVAL;
+
+	// rknpu_gem_object_put(&rknpu_obj->base);
+
+	obj = &rknpu_obj->base;
+	if (obj->import_attach)
+		return 0;
+
+	return rknpu_gem_handle_destroy(file_priv, args->handle);
+}
+
+#if RKNPU_GEM_ALLOC_FROM_PAGES
+/*
+ * __vm_map_pages - maps range of kernel pages into user vma
+ * @vma: user vma to map to
+ * @pages: pointer to array of source kernel pages
+ * @num: number of pages in page array
+ * @offset: user's requested vm_pgoff
+ *
+ * This allows drivers to map range of kernel pages into a user vma.
+ *
+ * Return: 0 on success and error code otherwise.
+ */
+static int __vm_map_pages(struct vm_area_struct *vma, struct page **pages,
+			  unsigned long num, unsigned long offset)
+{
+	unsigned long count = vma_pages(vma);
+	unsigned long uaddr = vma->vm_start;
+	int ret = -EINVAL, i = 0;
+
+	/* Fail if the user requested offset is beyond the end of the object */
+	if (offset >= num)
+		return -ENXIO;
+
+	/* Fail if the user requested size exceeds available object size */
+	if (count > num - offset)
+		return -ENXIO;
+
+	for (i = 0; i < count; i++) {
+		ret = vm_insert_page(vma, uaddr, pages[offset + i]);
+		if (ret < 0)
+			return ret;
+		uaddr += PAGE_SIZE;
+	}
+
+	return 0;
+}
+
+static int rknpu_gem_mmap_pages(struct rknpu_gem_object *rknpu_obj,
+				struct vm_area_struct *vma)
+{
+	struct drm_device *drm = rknpu_obj->base.dev;
+	int ret = -EINVAL;
+
+	vma->vm_flags |= VM_MIXEDMAP;
+
+	ret = __vm_map_pages(vma, rknpu_obj->pages, rknpu_obj->num_pages,
+			     vma->vm_pgoff);
+	if (ret < 0)
+		LOG_DEV_ERROR(drm->dev, "failed to map pages into vma: %d\n",
+			      ret);
+
+	return ret;
+}
+#endif
+
+static int rknpu_gem_mmap_buffer(struct rknpu_gem_object *rknpu_obj,
+				 struct vm_area_struct *vma)
+{
+	struct drm_device *drm = rknpu_obj->base.dev;
+#if RKNPU_GEM_ALLOC_FROM_PAGES
+	struct rknpu_device *rknpu_dev = drm->dev_private;
+#endif
+	unsigned long vm_size = 0;
+	int ret = -EINVAL;
+
+	/*
+	 * clear the VM_PFNMAP flag that was set by drm_gem_mmap(), and set the
+	 * vm_pgoff (used as a fake buffer offset by DRM) to 0 as we want to map
+	 * the whole buffer.
+	 */
+	vma->vm_flags &= ~VM_PFNMAP;
+	vma->vm_pgoff = 0;
+
+	vm_size = vma->vm_end - vma->vm_start;
+
+	/* check if user-requested size is valid. */
+	if (vm_size > rknpu_obj->size)
+		return -EINVAL;
+
+#if RKNPU_GEM_ALLOC_FROM_PAGES
+	if ((rknpu_obj->flags & RKNPU_MEM_NON_CONTIGUOUS) &&
+	    rknpu_dev->iommu_en) {
+		return rknpu_gem_mmap_pages(rknpu_obj, vma);
+	}
+#endif
+
+	ret = dma_mmap_attrs(drm->dev, vma, rknpu_obj->cookie,
+			     rknpu_obj->dma_addr, rknpu_obj->size,
+			     rknpu_obj->dma_attrs);
+	if (ret < 0) {
+		LOG_DEV_ERROR(drm->dev, "failed to mmap, ret = %d\n", ret);
+		return ret;
+	}
+
+	return 0;
+}
+
+void rknpu_gem_free_object(struct drm_gem_object *obj)
+{
+	rknpu_gem_object_destroy(to_rknpu_obj(obj));
+}
+
+int rknpu_gem_dumb_create(struct drm_file *file_priv, struct drm_device *drm,
+			  struct drm_mode_create_dumb *args)
+{
+	struct rknpu_device *rknpu_dev = drm->dev_private;
+	struct rknpu_gem_object *rknpu_obj = NULL;
+	unsigned int flags = 0;
+	int ret = -EINVAL;
+
+	/*
+	 * allocate memory to be used for framebuffer.
+	 * - this callback would be called by user application
+	 *	with DRM_IOCTL_MODE_CREATE_DUMB command.
+	 */
+	args->pitch = args->width * ((args->bpp + 7) / 8);
+	args->size = args->pitch * args->height;
+
+	if (rknpu_dev->iommu_en)
+		flags = RKNPU_MEM_NON_CONTIGUOUS | RKNPU_MEM_WRITE_COMBINE;
+	else
+		flags = RKNPU_MEM_CONTIGUOUS | RKNPU_MEM_WRITE_COMBINE;
+
+	rknpu_obj = rknpu_gem_object_create(drm, flags, args->size);
+	if (IS_ERR(rknpu_obj)) {
+		LOG_DEV_ERROR(drm->dev, "gem object allocate failed.\n");
+		return PTR_ERR(rknpu_obj);
+	}
+
+	ret = rknpu_gem_handle_create(&rknpu_obj->base, file_priv,
+				      &args->handle);
+	if (ret) {
+		rknpu_gem_object_destroy(rknpu_obj);
+		return ret;
+	}
+
+	return 0;
+}
+
+#if KERNEL_VERSION(4, 19, 0) > LINUX_VERSION_CODE
+int rknpu_gem_dumb_map_offset(struct drm_file *file_priv,
+			      struct drm_device *drm, uint32_t handle,
+			      uint64_t *offset)
+{
+	struct rknpu_gem_object *rknpu_obj = NULL;
+	struct drm_gem_object *obj = NULL;
+	int ret = -EINVAL;
+
+	rknpu_obj = rknpu_gem_object_find(file_priv, handle);
+	if (!rknpu_obj)
+		return -EINVAL;
+
+	/* Don't allow imported objects to be mapped */
+	obj = &rknpu_obj->base;
+	if (obj->import_attach)
+		return -EINVAL;
+
+	ret = drm_gem_create_mmap_offset(obj);
+	if (ret)
+		return ret;
+
+	*offset = drm_vma_node_offset_addr(&obj->vma_node);
+
+	return 0;
+}
+#endif
+
+#if KERNEL_VERSION(4, 15, 0) <= LINUX_VERSION_CODE
+vm_fault_t rknpu_gem_fault(struct vm_fault *vmf)
+{
+	struct vm_area_struct *vma = vmf->vma;
+	struct drm_gem_object *obj = vma->vm_private_data;
+	struct rknpu_gem_object *rknpu_obj = to_rknpu_obj(obj);
+	struct drm_device *drm = rknpu_obj->base.dev;
+	unsigned long pfn = 0;
+	pgoff_t page_offset = 0;
+
+	page_offset = (vmf->address - vma->vm_start) >> PAGE_SHIFT;
+
+	if (page_offset >= (rknpu_obj->size >> PAGE_SHIFT)) {
+		LOG_DEV_ERROR(drm->dev, "invalid page offset\n");
+		return VM_FAULT_SIGBUS;
+	}
+
+	pfn = page_to_pfn(rknpu_obj->pages[page_offset]);
+	return vmf_insert_mixed(vma, vmf->address,
+				__pfn_to_pfn_t(pfn, PFN_DEV));
+}
+#elif KERNEL_VERSION(4, 14, 0) <= LINUX_VERSION_CODE
+int rknpu_gem_fault(struct vm_fault *vmf)
+{
+	struct vm_area_struct *vma = vmf->vma;
+	struct drm_gem_object *obj = vma->vm_private_data;
+	struct rknpu_gem_object *rknpu_obj = to_rknpu_obj(obj);
+	struct drm_device *drm = rknpu_obj->base.dev;
+	unsigned long pfn = 0;
+	pgoff_t page_offset = 0;
+	int ret = -EINVAL;
+
+	page_offset = (vmf->address - vma->vm_start) >> PAGE_SHIFT;
+
+	if (page_offset >= (rknpu_obj->size >> PAGE_SHIFT)) {
+		LOG_DEV_ERROR(drm->dev, "invalid page offset\n");
+		ret = -EINVAL;
+		goto out;
+	}
+
+	pfn = page_to_pfn(rknpu_obj->pages[page_offset]);
+	ret = vm_insert_mixed(vma, vmf->address, __pfn_to_pfn_t(pfn, PFN_DEV));
+
+out:
+	switch (ret) {
+	case 0:
+	case -ERESTARTSYS:
+	case -EINTR:
+		return VM_FAULT_NOPAGE;
+	case -ENOMEM:
+		return VM_FAULT_OOM;
+	default:
+		return VM_FAULT_SIGBUS;
+	}
+}
+#else
+int rknpu_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
+{
+	struct drm_gem_object *obj = vma->vm_private_data;
+	struct rknpu_gem_object *rknpu_obj = to_rknpu_obj(obj);
+	struct drm_device *drm = rknpu_obj->base.dev;
+	unsigned long pfn = 0;
+	pgoff_t page_offset = 0;
+	int ret = -EINVAL;
+
+	page_offset = ((unsigned long)vmf->virtual_address - vma->vm_start) >>
+		      PAGE_SHIFT;
+
+	if (page_offset >= (rknpu_obj->size >> PAGE_SHIFT)) {
+		LOG_DEV_ERROR(drm->dev, "invalid page offset\n");
+		ret = -EINVAL;
+		goto out;
+	}
+
+	pfn = page_to_pfn(rknpu_obj->pages[page_offset]);
+	ret = vm_insert_mixed(vma, (unsigned long)vmf->virtual_address,
+			      __pfn_to_pfn_t(pfn, PFN_DEV));
+
+out:
+	switch (ret) {
+	case 0:
+	case -ERESTARTSYS:
+	case -EINTR:
+		return VM_FAULT_NOPAGE;
+	case -ENOMEM:
+		return VM_FAULT_OOM;
+	default:
+		return VM_FAULT_SIGBUS;
+	}
+}
+#endif
+
+static int rknpu_gem_mmap_obj(struct drm_gem_object *obj,
+			      struct vm_area_struct *vma)
+{
+	struct rknpu_gem_object *rknpu_obj = to_rknpu_obj(obj);
+	int ret = -EINVAL;
+
+	LOG_DEBUG("flags = %#x\n", rknpu_obj->flags);
+
+	/* non-cacheable as default. */
+	if (rknpu_obj->flags & RKNPU_MEM_CACHEABLE) {
+		vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
+	} else if (rknpu_obj->flags & RKNPU_MEM_WRITE_COMBINE) {
+		vma->vm_page_prot =
+			pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
+	} else {
+		vma->vm_page_prot =
+			pgprot_noncached(vm_get_page_prot(vma->vm_flags));
+	}
+
+	ret = rknpu_gem_mmap_buffer(rknpu_obj, vma);
+	if (ret)
+		goto err_close_vm;
+
+	return 0;
+
+err_close_vm:
+	drm_gem_vm_close(vma);
+
+	return ret;
+}
+
+int rknpu_gem_mmap(struct file *filp, struct vm_area_struct *vma)
+{
+	struct drm_gem_object *obj = NULL;
+	int ret = -EINVAL;
+
+	/* set vm_area_struct. */
+	ret = drm_gem_mmap(filp, vma);
+	if (ret < 0) {
+		LOG_ERROR("failed to mmap, ret = %d\n", ret);
+		return ret;
+	}
+
+	obj = vma->vm_private_data;
+
+	if (obj->import_attach)
+		return dma_buf_mmap(obj->dma_buf, vma, 0);
+
+	return rknpu_gem_mmap_obj(obj, vma);
+}
+
+/* low-level interface prime helpers */
+#if KERNEL_VERSION(4, 13, 0) <= LINUX_VERSION_CODE
+struct drm_gem_object *rknpu_gem_prime_import(struct drm_device *dev,
+					      struct dma_buf *dma_buf)
+{
+	return drm_gem_prime_import_dev(dev, dma_buf, dev->dev);
+}
+#endif
+
+struct sg_table *rknpu_gem_prime_get_sg_table(struct drm_gem_object *obj)
+{
+	struct rknpu_gem_object *rknpu_obj = to_rknpu_obj(obj);
+	int npages = 0;
+
+	npages = rknpu_obj->size >> PAGE_SHIFT;
+
+	return drm_prime_pages_to_sg(rknpu_obj->pages, npages);
+}
+
+struct drm_gem_object *
+rknpu_gem_prime_import_sg_table(struct drm_device *dev,
+				struct dma_buf_attachment *attach,
+				struct sg_table *sgt)
+{
+	struct rknpu_gem_object *rknpu_obj = NULL;
+	int npages = 0;
+	int ret = -EINVAL;
+
+	rknpu_obj = rknpu_gem_init(dev, attach->dmabuf->size);
+	if (IS_ERR(rknpu_obj)) {
+		ret = PTR_ERR(rknpu_obj);
+		return ERR_PTR(ret);
+	}
+
+	rknpu_obj->dma_addr = sg_dma_address(sgt->sgl);
+
+	npages = rknpu_obj->size >> PAGE_SHIFT;
+	rknpu_obj->pages = rknpu_gem_alloc_page(npages);
+	if (!rknpu_obj->pages) {
+		ret = -ENOMEM;
+		goto err;
+	}
+
+	ret = drm_prime_sg_to_page_addr_arrays(sgt, rknpu_obj->pages, NULL,
+					       npages);
+	if (ret < 0)
+		goto err_free_large;
+
+	rknpu_obj->sgt = sgt;
+
+	if (sgt->nents == 1) {
+		/* always physically continuous memory if sgt->nents is 1. */
+		rknpu_obj->flags |= RKNPU_MEM_CONTIGUOUS;
+	} else {
+		/*
+		 * this case could be CONTIG or NONCONTIG type but for now
+		 * sets NONCONTIG.
+		 * TODO. we have to find a way that exporter can notify
+		 * the type of its own buffer to importer.
+		 */
+		rknpu_obj->flags |= RKNPU_MEM_NON_CONTIGUOUS;
+	}
+
+	return &rknpu_obj->base;
+
+err_free_large:
+	rknpu_gem_free_page(rknpu_obj->pages);
+err:
+	drm_gem_object_release(&rknpu_obj->base);
+	kfree(rknpu_obj);
+	return ERR_PTR(ret);
+}
+
+void *rknpu_gem_prime_vmap(struct drm_gem_object *obj)
+{
+	struct rknpu_gem_object *rknpu_obj = to_rknpu_obj(obj);
+
+	if (!rknpu_obj->pages)
+		return NULL;
+
+	return vmap(rknpu_obj->pages, rknpu_obj->num_pages, VM_MAP,
+		    PAGE_KERNEL);
+}
+
+void rknpu_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
+{
+	vunmap(vaddr);
+}
+
+int rknpu_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
+{
+	int ret = -EINVAL;
+
+	ret = drm_gem_mmap_obj(obj, obj->size, vma);
+	if (ret < 0)
+		return ret;
+
+	return rknpu_gem_mmap_obj(obj, vma);
+}
+
+int rknpu_gem_sync_ioctl(struct drm_device *dev, void *data,
+			 struct drm_file *file_priv)
+{
+	struct rknpu_gem_object *rknpu_obj = NULL;
+	struct rknpu_mem_sync *args = data;
+	struct scatterlist *sg;
+	dma_addr_t sg_dma_addr;
+	unsigned long length, offset = 0;
+	unsigned long sg_offset, sg_left, size = 0;
+	unsigned long len = 0;
+	int i;
+
+	rknpu_obj = (struct rknpu_gem_object *)args->obj_addr;
+	if (!rknpu_obj)
+		return -EINVAL;
+
+	if (!(rknpu_obj->flags & RKNPU_MEM_CACHEABLE))
+		return -EINVAL;
+
+	if (!(rknpu_obj->flags & RKNPU_MEM_NON_CONTIGUOUS)) {
+		if (args->flags & RKNPU_MEM_SYNC_TO_DEVICE) {
+			dma_sync_single_range_for_device(
+				dev->dev, rknpu_obj->dma_addr, args->offset,
+				args->size, DMA_TO_DEVICE);
+		}
+		if (args->flags & RKNPU_MEM_SYNC_FROM_DEVICE) {
+			dma_sync_single_range_for_cpu(dev->dev,
+						      rknpu_obj->dma_addr,
+						      args->offset, args->size,
+						      DMA_FROM_DEVICE);
+		}
+	} else {
+		length = args->size;
+		offset = args->offset;
+		sg_dma_addr = rknpu_obj->dma_addr;
+
+		for_each_sg(rknpu_obj->sgt->sgl, sg, rknpu_obj->sgt->nents,
+			     i) {
+			len += sg->length;
+			if (len <= offset)
+				continue;
+
+			sg_left = len - offset;
+			sg_offset = sg->length - sg_left;
+			size = (length < sg_left) ? length : sg_left;
+
+			if (args->flags & RKNPU_MEM_SYNC_TO_DEVICE) {
+				dma_sync_single_range_for_device(
+					dev->dev, sg_dma_addr, sg_offset, size,
+					DMA_TO_DEVICE);
+			}
+
+			if (args->flags & RKNPU_MEM_SYNC_FROM_DEVICE) {
+				dma_sync_single_range_for_cpu(dev->dev,
+							      sg_dma_addr,
+							      sg_offset, size,
+							      DMA_FROM_DEVICE);
+			}
+
+			offset += size;
+			length -= size;
+			sg_dma_addr += sg->length;
+
+			if (length == 0)
+				break;
+		}
+	}
+
+	return 0;
+}
diff --git a/drivers/rknpu/rknpu_job.c b/drivers/rknpu/rknpu_job.c
new file mode 100644
index 000000000000..f011c7aaff8f
--- /dev/null
+++ b/drivers/rknpu/rknpu_job.c
@@ -0,0 +1,495 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
+ * Author: Felix Zeng <felix.zeng@rock-chips.com>
+ */
+
+#include "rknpu_ioctl.h"
+#include "rknpu_drv.h"
+#include "rknpu_reset.h"
+#include "rknpu_gem.h"
+#include "rknpu_fence.h"
+#include "rknpu_job.h"
+
+#define _REG_READ(base, offset) readl(base + (offset))
+#define _REG_WRITE(base, value, offset) writel(value, base + (offset))
+
+#define REG_READ(offset) _REG_READ(rknpu_dev->base, offset)
+#define REG_WRITE(value, offset) _REG_WRITE(rknpu_dev->base, value, offset)
+
+static void rknpu_job_free(struct rknpu_job *job)
+{
+	struct rknpu_gem_object *task_obj = NULL;
+
+	if (job->fence)
+		dma_fence_put(job->fence);
+
+	task_obj = (struct rknpu_gem_object *)job->args->task_obj_addr;
+	if (task_obj)
+		rknpu_gem_object_put(&task_obj->base);
+
+	if (job->args_owner)
+		kfree(job->args);
+
+	kfree(job);
+}
+
+static int rknpu_job_cleanup(struct rknpu_job *job)
+{
+	rknpu_job_free(job);
+
+	return 0;
+}
+
+static void rknpu_job_cleanup_work(struct work_struct *work)
+{
+	struct rknpu_job *job =
+		container_of(work, struct rknpu_job, cleanup_work);
+
+	rknpu_job_cleanup(job);
+}
+
+static inline struct rknpu_job *rknpu_job_alloc(struct rknpu_device *rknpu_dev,
+						struct rknpu_submit *args)
+{
+	struct rknpu_job *job = NULL;
+	struct rknpu_gem_object *task_obj = NULL;
+
+	job = kzalloc(sizeof(*job), GFP_KERNEL);
+	if (!job)
+		return NULL;
+
+	job->timestamp = ktime_get();
+	job->rknpu_dev = rknpu_dev;
+
+	task_obj = (struct rknpu_gem_object *)args->task_obj_addr;
+	if (task_obj)
+		rknpu_gem_object_get(&task_obj->base);
+
+	if (!(args->flags & RKNPU_JOB_NONBLOCK)) {
+		job->args = args;
+		job->args_owner = false;
+		return job;
+	}
+
+	job->args = kzalloc(sizeof(*args), GFP_KERNEL);
+	if (!job->args) {
+		kfree(job);
+		return NULL;
+	}
+	*job->args = *args;
+	job->args_owner = true;
+
+	INIT_WORK(&job->cleanup_work, rknpu_job_cleanup_work);
+
+	return job;
+}
+
+static inline int rknpu_job_wait(struct rknpu_job *job)
+{
+	struct rknpu_device *rknpu_dev = job->rknpu_dev;
+	struct rknpu_submit *args = job->args;
+	struct rknpu_task *last_task = NULL;
+	int ret = -EINVAL;
+
+	ret = wait_event_interruptible_timeout(rknpu_dev->job_done_wq,
+					       job->flags & RKNPU_JOB_DONE,
+					       msecs_to_jiffies(args->timeout));
+
+	last_task = job->last_task;
+	if (!last_task)
+		return -EINVAL;
+
+	last_task->int_status = job->int_status;
+
+	if (ret <= 0) {
+		args->task_counter = 0;
+		if (args->flags & RKNPU_JOB_PC) {
+			uint32_t task_status =
+				REG_READ(RKNPU_OFFSET_PC_TASK_STATUS);
+			args->task_counter = (task_status & 0xfff);
+		}
+		return ret < 0 ? ret : -ETIMEDOUT;
+	}
+
+	args->task_counter = args->task_number;
+
+	return 0;
+}
+
+static inline int rknpu_job_commit_pc(struct rknpu_job *job)
+{
+	struct rknpu_device *rknpu_dev = job->rknpu_dev;
+	struct rknpu_submit *args = job->args;
+	struct rknpu_gem_object *task_obj =
+		(struct rknpu_gem_object *)args->task_obj_addr;
+	struct rknpu_task *task_base = NULL;
+	struct rknpu_task *first_task = NULL;
+	struct rknpu_task *last_task = NULL;
+	int task_start = args->task_start;
+	int task_end = args->task_start + args->task_number - 1;
+	int task_pp_en = args->flags & RKNPU_JOB_PINGPONG ? 1 : 0;
+
+	if (!task_obj)
+		return -EINVAL;
+
+	if ((task_start + 1) * sizeof(*task_base) > task_obj->size ||
+	    (task_end + 1) * sizeof(*task_base) > task_obj->size)
+		return -EINVAL;
+
+	task_base = task_obj->kv_addr;
+
+	first_task = &task_base[task_start];
+	last_task = &task_base[task_end];
+
+	REG_WRITE(first_task->regcmd_data, RKNPU_OFFSET_PC_DATA_ADDR);
+
+	REG_WRITE(first_task->regcfg_amount + RKNPU_PC_DATA_EXTRA_AMOUNT - 1,
+		  RKNPU_OFFSET_PC_DATA_AMOUNT);
+
+	REG_WRITE(last_task->int_mask, RKNPU_OFFSET_INT_MASK);
+
+	REG_WRITE(first_task->int_mask, RKNPU_OFFSET_INT_CLEAR);
+
+	REG_WRITE(((0x6 | task_pp_en) << 12) | args->task_number,
+		  RKNPU_OFFSET_PC_TASK_CONTROL);
+
+	REG_WRITE(0x0, RKNPU_OFFSET_PC_DMA_BASE_ADDR);
+
+	job->first_task = first_task;
+	job->last_task = last_task;
+	job->int_mask = last_task->int_mask;
+
+	REG_WRITE(0x1, RKNPU_OFFSET_PC_OP_EN);
+	REG_WRITE(0x0, RKNPU_OFFSET_PC_OP_EN);
+
+	return 0;
+}
+
+static int rknpu_job_commit(struct rknpu_job *job)
+{
+	struct rknpu_device *rknpu_dev = job->rknpu_dev;
+	struct rknpu_submit *args = job->args;
+
+	// switch to slave mode
+	REG_WRITE(0x1, RKNPU_OFFSET_PC_DATA_ADDR);
+
+	if (!(args->flags & RKNPU_JOB_PC))
+		return -EINVAL;
+
+	return rknpu_job_commit_pc(job);
+}
+
+static void rknpu_job_next(struct rknpu_device *rknpu_dev)
+{
+	struct rknpu_job *job = NULL;
+	unsigned long flags;
+
+	spin_lock_irqsave(&rknpu_dev->irq_lock, flags);
+
+	if (rknpu_dev->job || list_empty(&rknpu_dev->todo_list)) {
+		spin_unlock_irqrestore(&rknpu_dev->irq_lock, flags);
+		return;
+	}
+
+	job = list_first_entry(&rknpu_dev->todo_list, struct rknpu_job, head);
+
+	list_del_init(&job->head);
+
+	rknpu_dev->job = job;
+
+	spin_unlock_irqrestore(&rknpu_dev->irq_lock, flags);
+
+	job->ret = rknpu_job_commit(job);
+}
+
+static void rknpu_job_done(struct rknpu_job *job, int ret)
+{
+	struct rknpu_device *rknpu_dev = job->rknpu_dev;
+	unsigned long flags;
+
+	spin_lock_irqsave(&rknpu_dev->irq_lock, flags);
+	rknpu_dev->job = NULL;
+	spin_unlock_irqrestore(&rknpu_dev->irq_lock, flags);
+
+	job->flags |= RKNPU_JOB_DONE;
+	job->ret = ret;
+
+	if (job->fence)
+		dma_fence_signal(job->fence);
+
+	wake_up(&rknpu_dev->job_done_wq);
+	rknpu_job_next(rknpu_dev);
+
+	if (job->flags & RKNPU_JOB_ASYNC)
+		schedule_work(&job->cleanup_work);
+}
+
+static void rknpu_job_schedule(struct rknpu_job *job)
+{
+	struct rknpu_device *rknpu_dev = job->rknpu_dev;
+	unsigned long flags;
+
+	spin_lock_irqsave(&rknpu_dev->irq_lock, flags);
+	list_add_tail(&job->head, &rknpu_dev->todo_list);
+	spin_unlock_irqrestore(&rknpu_dev->irq_lock, flags);
+
+	rknpu_job_next(rknpu_dev);
+}
+
+static void rknpu_job_abort(struct rknpu_job *job)
+{
+	struct rknpu_device *rknpu_dev = job->rknpu_dev;
+	unsigned long flags;
+
+	msleep(100);
+	if (job->ret == -ETIMEDOUT)
+		rknpu_soft_reset(rknpu_dev);
+
+	if (job == rknpu_dev->job) {
+		spin_lock_irqsave(&rknpu_dev->irq_lock, flags);
+		rknpu_dev->job = NULL;
+		spin_unlock_irqrestore(&rknpu_dev->irq_lock, flags);
+	}
+
+	rknpu_job_cleanup(job);
+}
+
+static inline uint32_t rknpu_fuzz_status(uint32_t status)
+{
+	uint32_t fuzz_status = 0;
+
+	if ((status & 0x3) != 0)
+		fuzz_status |= 0x3;
+
+	if ((status & 0xc) != 0)
+		fuzz_status |= 0xc;
+
+	if ((status & 0x30) != 0)
+		fuzz_status |= 0x30;
+
+	if ((status & 0xc0) != 0)
+		fuzz_status |= 0xc0;
+
+	if ((status & 0x300) != 0)
+		fuzz_status |= 0x300;
+
+	if ((status & 0xc00) != 0)
+		fuzz_status |= 0xc00;
+
+	return fuzz_status;
+}
+
+irqreturn_t rknpu_irq_handler(int irq, void *data)
+{
+	struct rknpu_device *rknpu_dev = data;
+	struct rknpu_job *job = rknpu_dev->job;
+	uint32_t status = 0;
+
+	if (!job)
+		return IRQ_HANDLED;
+
+	status = REG_READ(RKNPU_OFFSET_INT_STATUS);
+	REG_WRITE(RKNPU_INT_CLEAR, RKNPU_OFFSET_INT_CLEAR);
+
+	job->int_status = status;
+
+	if (rknpu_fuzz_status(status) != job->int_mask) {
+		LOG_DEBUG("irq: status = %#x, mask = %#x\n", status,
+			  job->int_mask);
+		return IRQ_HANDLED;
+	}
+
+	rknpu_job_done(job, 0);
+
+	return IRQ_HANDLED;
+}
+
+static void rknpu_job_timeout_clean(struct rknpu_device *rknpu_dev)
+{
+	struct rknpu_job *job = NULL;
+	unsigned long flags;
+	ktime_t now = ktime_get();
+
+	job = rknpu_dev->job;
+	if (job &&
+	    ktime_to_ms(ktime_sub(now, job->timestamp)) >= job->args->timeout) {
+		rknpu_soft_reset(rknpu_dev);
+
+		spin_lock_irqsave(&rknpu_dev->irq_lock, flags);
+		rknpu_dev->job = NULL;
+		spin_unlock_irqrestore(&rknpu_dev->irq_lock, flags);
+
+		do {
+			schedule_work(&job->cleanup_work);
+
+			spin_lock_irqsave(&rknpu_dev->irq_lock, flags);
+
+			if (!list_empty(&rknpu_dev->todo_list)) {
+				job = list_first_entry(&rknpu_dev->todo_list,
+						       struct rknpu_job, head);
+				list_del_init(&job->head);
+			} else {
+				job = NULL;
+			}
+
+			spin_unlock_irqrestore(&rknpu_dev->irq_lock, flags);
+		} while (job);
+	}
+}
+
+int rknpu_submit_ioctl(struct drm_device *dev, void *data,
+		       struct drm_file *file_priv)
+{
+	struct rknpu_device *rknpu_dev = dev_get_drvdata(dev->dev);
+	struct rknpu_submit *args = data;
+	struct rknpu_job *job = NULL;
+	int ret = -EINVAL;
+
+	if (args->task_number == 0) {
+		LOG_ERROR("invalid rknpu task number!\n");
+		return -EINVAL;
+	}
+
+	job = rknpu_job_alloc(rknpu_dev, args);
+	if (!job) {
+		LOG_ERROR("failed to allocate rknpu job!\n");
+		return -ENOMEM;
+	}
+
+	if (args->flags & RKNPU_JOB_FENCE) {
+		ret = rknpu_fence_alloc(job);
+		if (ret) {
+			rknpu_job_free(job);
+			return ret;
+		}
+		job->args->fence_fd = rknpu_fence_get_fd(job);
+		args->fence_fd = job->args->fence_fd;
+	}
+
+	if (args->flags & RKNPU_JOB_NONBLOCK) {
+		job->flags |= RKNPU_JOB_ASYNC;
+		rknpu_job_timeout_clean(rknpu_dev);
+		rknpu_job_schedule(job);
+		ret = job->ret;
+		if (ret) {
+			rknpu_job_abort(job);
+			return ret;
+		}
+	} else {
+		rknpu_job_schedule(job);
+		if (args->flags & RKNPU_JOB_PC)
+			job->ret = rknpu_job_wait(job);
+
+		args->task_counter = job->args->task_counter;
+		ret = job->ret;
+		if (!ret)
+			rknpu_job_cleanup(job);
+		else
+			rknpu_job_abort(job);
+	}
+
+	return ret;
+}
+
+int rknpu_get_hw_version(struct rknpu_device *rknpu_dev, uint32_t *version)
+{
+	if (version != NULL)
+		*version = REG_READ(RKNPU_OFFSET_VERSION);
+
+	return 0;
+}
+
+int rknpu_get_bw_priority(struct rknpu_device *rknpu_dev, uint32_t *priority,
+			  uint32_t *expect, uint32_t *tw)
+{
+	void __iomem *base = rknpu_dev->bw_priority_base;
+
+	if (!base)
+		return -EINVAL;
+
+	spin_lock(&rknpu_dev->lock);
+
+	if (priority != NULL)
+		*priority = _REG_READ(base, 0x0);
+
+	if (expect != NULL)
+		*expect = _REG_READ(base, 0x8);
+
+	if (tw != NULL)
+		*tw = _REG_READ(base, 0xc);
+
+	spin_unlock(&rknpu_dev->lock);
+
+	return 0;
+}
+
+int rknpu_set_bw_priority(struct rknpu_device *rknpu_dev, uint32_t priority,
+			  uint32_t expect, uint32_t tw)
+{
+	void __iomem *base = rknpu_dev->bw_priority_base;
+
+	if (!base)
+		return -EINVAL;
+
+	spin_lock(&rknpu_dev->lock);
+
+	if (priority != 0)
+		_REG_WRITE(base, priority, 0x0);
+
+	if (expect != 0)
+		_REG_WRITE(base, expect, 0x8);
+
+	if (tw != 0)
+		_REG_WRITE(base, tw, 0xc);
+
+	spin_unlock(&rknpu_dev->lock);
+
+	return 0;
+}
+
+int rknpu_clear_rw_amount(struct rknpu_device *rknpu_dev)
+{
+	spin_lock(&rknpu_dev->lock);
+
+	REG_WRITE(0x80000101, RKNPU_OFFSET_CLR_ALL_RW_AMOUNT);
+	REG_WRITE(0x00000101, RKNPU_OFFSET_CLR_ALL_RW_AMOUNT);
+
+	spin_unlock(&rknpu_dev->lock);
+
+	return 0;
+}
+
+int rknpu_get_rw_amount(struct rknpu_device *rknpu_dev, uint32_t *dt_wr,
+			uint32_t *dt_rd, uint32_t *wd_rd)
+{
+	spin_lock(&rknpu_dev->lock);
+
+	if (dt_wr != NULL)
+		*dt_wr = REG_READ(RKNPU_OFFSET_DT_WR_AMOUNT);
+
+	if (dt_rd != NULL)
+		*dt_rd = REG_READ(RKNPU_OFFSET_DT_RD_AMOUNT);
+
+	if (wd_rd != NULL)
+		*wd_rd = REG_READ(RKNPU_OFFSET_WT_RD_AMOUNT);
+
+	spin_unlock(&rknpu_dev->lock);
+
+	return 0;
+}
+
+int rknpu_get_total_rw_amount(struct rknpu_device *rknpu_dev, uint32_t *amount)
+{
+	uint32_t dt_wr = 0;
+	uint32_t dt_rd = 0;
+	uint32_t wd_rd = 0;
+	int ret = -EINVAL;
+
+	ret = rknpu_get_rw_amount(rknpu_dev, &dt_wr, &dt_rd, &wd_rd);
+
+	if (amount != NULL)
+		*amount = dt_wr + dt_rd + wd_rd;
+
+	return ret;
+}
diff --git a/drivers/rknpu/rknpu_reset.c b/drivers/rknpu/rknpu_reset.c
new file mode 100644
index 000000000000..4e5785def4c7
--- /dev/null
+++ b/drivers/rknpu/rknpu_reset.c
@@ -0,0 +1,107 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
+ * Author: Felix Zeng <felix.zeng@rock-chips.com>
+ */
+
+#include <linux/iommu.h>
+
+#include "rknpu_reset.h"
+
+static inline struct reset_control *rknpu_reset_control_get(struct device *dev,
+							    const char *name)
+{
+	struct reset_control *rst = NULL;
+
+	rst = devm_reset_control_get(dev, name);
+	if (IS_ERR(rst))
+		LOG_DEV_ERROR(dev,
+			      "failed to get rknpu reset control: %s, %ld\n",
+			      name, PTR_ERR(rst));
+
+	return rst;
+}
+
+int rknpu_reset_get(struct rknpu_device *rknpu_dev)
+{
+	struct reset_control *srst_a = NULL;
+	struct reset_control *srst_h = NULL;
+
+	srst_a = rknpu_reset_control_get(rknpu_dev->dev, "srst_a");
+	if (IS_ERR(srst_a))
+		return PTR_ERR(srst_a);
+
+	rknpu_dev->srst_a = srst_a;
+
+	srst_h = devm_reset_control_get(rknpu_dev->dev, "srst_h");
+	if (IS_ERR(srst_h))
+		return PTR_ERR(srst_h);
+
+	rknpu_dev->srst_h = srst_h;
+
+	return 0;
+}
+
+static int rknpu_reset_assert(struct reset_control *rst)
+{
+	int ret = -EINVAL;
+
+	if (!rst)
+		return -EINVAL;
+
+	ret = reset_control_assert(rst);
+	if (ret < 0) {
+		LOG_ERROR("failed to assert rknpu reset: %d\n", ret);
+		return ret;
+	}
+
+	return 0;
+}
+
+static int rknpu_reset_deassert(struct reset_control *rst)
+{
+	int ret = -EINVAL;
+
+	if (!rst)
+		return -EINVAL;
+
+	ret = reset_control_deassert(rst);
+	if (ret < 0) {
+		LOG_ERROR("failed to deassert rknpu reset: %d\n", ret);
+		return ret;
+	}
+
+	return 0;
+}
+
+int rknpu_soft_reset(struct rknpu_device *rknpu_dev)
+{
+	struct iommu_domain *domain = NULL;
+	int ret = -EINVAL;
+
+	LOG_INFO("soft reset\n");
+
+	ret = rknpu_reset_assert(rknpu_dev->srst_a);
+	ret |= rknpu_reset_assert(rknpu_dev->srst_h);
+
+	udelay(10);
+
+	ret |= rknpu_reset_deassert(rknpu_dev->srst_a);
+	ret |= rknpu_reset_deassert(rknpu_dev->srst_h);
+
+	if (ret) {
+		LOG_DEV_ERROR(rknpu_dev->dev,
+			      "failed to soft reset for rknpu: %d\n", ret);
+		return ret;
+	}
+
+	if (rknpu_dev->iommu_en)
+		domain = iommu_get_domain_for_dev(rknpu_dev->dev);
+
+	if (domain) {
+		iommu_detach_device(domain, rknpu_dev->dev);
+		iommu_attach_device(domain, rknpu_dev->dev);
+	}
+
+	return ret;
+}

commit 6888c9dac384268d79211904763a4046b84eb4b9
Author: Felix Zeng <felix.zeng@rock-chips.com>
Date:   Thu Jul 1 17:46:31 2021 +0800

    arm64: dts: rockchip: rk3568: rknpu: Add rknpu cru reset
    
    Signed-off-by: Felix Zeng <felix.zeng@rock-chips.com>
    Change-Id: Ibc546e80e6f82f0e907505a1eec1e9d37231646a

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index 12160259737f..71e531f3f8e9 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -1073,6 +1073,8 @@
 		clock-names = "scmi_clk", "clk", "aclk", "hclk";
 		assigned-clocks = <&cru CLK_NPU>;
 		assigned-clock-rates = <600000000>;
+		resets = <&cru SRST_A_NPU>, <&cru SRST_H_NPU>;
+		reset-names = "srst_a", "srst_h";
 		power-domains = <&power RK3568_PD_NPU>;
 		operating-points-v2 = <&npu_opp_table>;
 		iommus = <&rknpu_mmu>;

commit c164e7f75de1a512ce7eca5abf7be955fbaedcaf
Author: Felix Zeng <felix.zeng@rock-chips.com>
Date:   Thu Jul 1 11:50:34 2021 +0800

    arm64: dts: rockchip: rk3568: rknpu: Add new rknpu compatible with rk3568 target
    
    Signed-off-by: Felix Zeng <felix.zeng@rock-chips.com>
    Change-Id: I150aa58dc640cea47d30f89d7fefe500031cd074

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index 53305adffa27..12160259737f 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -1066,7 +1066,7 @@
 	};
 
 	rknpu: npu@fde40000 {
-		compatible = "rockchip,rknpu";
+		compatible = "rockchip,rk3568-rknpu", "rockchip,rknpu";
 		reg = <0x0 0xfde40000 0x0 0x10000>;
 		interrupts = <GIC_SPI 151 IRQ_TYPE_LEVEL_HIGH>;
 		clocks = <&scmi_clk 2>, <&cru CLK_NPU>, <&cru ACLK_NPU>, <&cru HCLK_NPU>;

commit 6bf5f1220e44302b87c68e7b6de14a5319b01a9b
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Thu Jun 24 10:49:56 2021 +0800

    Revert "spi: rockchip: Add compatible string for rk3568"
    
    This reverts commit 6a1a1cf4e72d37820539f66735aa71849ab49c09.
    
    1.Set rk3568 spi node to fall back point
    2.Both rk3568 and rv1126's spi is the same design
    
    Change-Id: Ibbb8e4005ad7cd2a6d53eb4c700d657e1f95be7f
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c
index 7f7e74650216..071151369003 100644
--- a/drivers/spi/spi-rockchip.c
+++ b/drivers/spi/spi-rockchip.c
@@ -1076,7 +1076,6 @@ static const struct of_device_id rockchip_spi_dt_match[] = {
 	{ .compatible = "rockchip,rk3288-spi", },
 	{ .compatible = "rockchip,rk3368-spi", },
 	{ .compatible = "rockchip,rk3399-spi", },
-	{ .compatible = "rockchip,rk3568-spi", },
 	{ },
 };
 MODULE_DEVICE_TABLE(of, rockchip_spi_dt_match);

commit 886073c63ba5740737f38dc0d4e87e235ed6a93f
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Thu Jun 24 09:45:34 2021 +0800

    arm64: dts: rockchip: rk3568: Set spi node to fall back point
    
    Both rk3568' spi is compatible with rk3036's spi design.
    
    Change-Id: I952beb57c151e77165db781bc17ec782b6bc62a4
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index 55bdc827bde4..53305adffa27 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -2858,7 +2858,7 @@
 	};
 
 	spi0: spi@fe610000 {
-		compatible = "rockchip,rk3568-spi", "rockchip,rk3066-spi";
+		compatible = "rockchip,rk3066-spi";
 		reg = <0x0 0xfe610000 0x0 0x1000>;
 		interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>;
 		#address-cells = <1>;
@@ -2874,7 +2874,7 @@
 	};
 
 	spi1: spi@fe620000 {
-		compatible = "rockchip,rk3568-spi", "rockchip,rk3066-spi";
+		compatible = "rockchip,rk3066-spi";
 		reg = <0x0 0xfe620000 0x0 0x1000>;
 		interrupts = <GIC_SPI 104 IRQ_TYPE_LEVEL_HIGH>;
 		#address-cells = <1>;
@@ -2890,7 +2890,7 @@
 	};
 
 	spi2: spi@fe630000 {
-		compatible = "rockchip,rk3568-spi", "rockchip,rk3066-spi";
+		compatible = "rockchip,rk3066-spi";
 		reg = <0x0 0xfe630000 0x0 0x1000>;
 		interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>;
 		#address-cells = <1>;
@@ -2906,7 +2906,7 @@
 	};
 
 	spi3: spi@fe640000 {
-		compatible = "rockchip,rk3568-spi", "rockchip,rk3066-spi";
+		compatible = "rockchip,rk3066-spi";
 		reg = <0x0 0xfe640000 0x0 0x1000>;
 		interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>;
 		#address-cells = <1>;

commit 5d1bcbaa40596a5476bfaa22dcfc873b4e350269
Author: YouMin Chen <cym@rock-chips.com>
Date:   Tue Jun 29 17:49:53 2021 +0800

    PM / devfreq: rockchip-dfi: add support lpddr4x
    
    Change-Id: Icd86a458dc9843e80d9206d620a1da6a71adf799
    Signed-off-by: YouMin Chen <cym@rock-chips.com>

diff --git a/drivers/devfreq/event/rockchip-dfi.c b/drivers/devfreq/event/rockchip-dfi.c
index f606f629d82b..7a4bdd9a8b40 100644
--- a/drivers/devfreq/event/rockchip-dfi.c
+++ b/drivers/devfreq/event/rockchip-dfi.c
@@ -27,6 +27,7 @@
 #include <linux/of.h>
 
 #define PX30_PMUGRF_OS_REG2		0x208
+#define PX30_PMUGRF_OS_REG3		0x20c
 
 #define RK3128_GRF_SOC_CON0		0x140
 #define RK3128_GRF_OS_REG1		0x1cc
@@ -58,6 +59,8 @@
 #define MAX_DMC_NUM_CH			2
 #define READ_DRAMTYPE_INFO(n)		(((n) >> 13) & 0x7)
 #define READ_CH_INFO(n)			(((n) >> 28) & 0x3)
+#define READ_DRAMTYPE_INFO_V3(n, m)	((((n) >> 13) & 0x7) | ((((m) >> 12) & 0x3) << 3))
+#define READ_SYSREG_VERSION(m)		(((m) >> 28) & 0xf)
 /* DDRMON_CTRL */
 #define DDRMON_CTRL			0x04
 #define CLR_DDRMON_CTRL			(0x3f0000 << 0)
@@ -83,6 +86,7 @@ enum {
 	LPDDR2 = 5,
 	LPDDR3 = 6,
 	LPDDR4 = 7,
+	LPDDR4X = 8,
 	UNUSED = 0xFF
 };
 
@@ -350,7 +354,7 @@ static void rockchip_dfi_start_hardware_counter(struct devfreq_event_dev *edev)
 	/* set ddr type to dfi */
 	if (info->dram_type == LPDDR3 || info->dram_type == LPDDR2)
 		writel_relaxed(LPDDR2_3_EN, dfi_regs + DDRMON_CTRL);
-	else if (info->dram_type == LPDDR4)
+	else if (info->dram_type == LPDDR4 || info->dram_type == LPDDR4X)
 		writel_relaxed(LPDDR4_EN, dfi_regs + DDRMON_CTRL);
 	else if (info->dram_type == DDR4)
 		writel_relaxed(DDR4_EN, dfi_regs + DDRMON_CTRL);
@@ -384,10 +388,10 @@ static int rockchip_dfi_get_busier_ch(struct devfreq_event_dev *edev)
 		info->ch_usage[i].total = readl_relaxed(dfi_regs +
 				DDRMON_CH0_COUNT_NUM + i * 20);
 
-		/* LPDDR4 BL = 16,other DDR type BL = 8 */
+		/* LPDDR4 and LPDDR4X BL = 16,other DDR type BL = 8 */
 		tmp = readl_relaxed(dfi_regs +
 				DDRMON_CH0_DFI_ACCESS_NUM + i * 20);
-		if (info->dram_type == LPDDR4)
+		if (info->dram_type == LPDDR4 || info->dram_type == LPDDR4X)
 			tmp *= 8;
 		else
 			tmp *= 4;
@@ -467,7 +471,7 @@ static __init int px30_dfi_init(struct platform_device *pdev,
 {
 	struct device_node *np = pdev->dev.of_node, *node;
 	struct resource *res;
-	u32 val;
+	u32 val_2, val_3;
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	data->regs = devm_ioremap_resource(&pdev->dev, res);
@@ -481,8 +485,12 @@ static __init int px30_dfi_init(struct platform_device *pdev,
 			return PTR_ERR(data->regmap_pmugrf);
 	}
 
-	regmap_read(data->regmap_pmugrf, PX30_PMUGRF_OS_REG2, &val);
-	data->dram_type = READ_DRAMTYPE_INFO(val);
+	regmap_read(data->regmap_pmugrf, PX30_PMUGRF_OS_REG2, &val_2);
+	regmap_read(data->regmap_pmugrf, PX30_PMUGRF_OS_REG3, &val_3);
+	if (READ_SYSREG_VERSION(val_3) >= 0x3)
+		data->dram_type = READ_DRAMTYPE_INFO_V3(val_2, val_3);
+	else
+		data->dram_type = READ_DRAMTYPE_INFO(val_2);
 	data->ch_msk = 1;
 	data->clk = NULL;
 

commit fbc159156c90bee7dd0c4aa1dd335f74770d1b17
Author: Guochun Huang <hero.huang@rock-chips.com>
Date:   Thu Jun 24 18:14:17 2021 +0800

    arm64: dts: rockchip: rk3568: rename mipi_dphy to video_phy
    
    Signed-off-by: Guochun Huang <hero.huang@rock-chips.com>
    Change-Id: Ie019c9d27e06328d45920d41c0a065f8bc47588f

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi
index 7818060dcc0f..bc7f618602ef 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi
@@ -246,11 +246,11 @@
 	status = "okay";
 };
 
-&mipi_dphy0 {
+&video_phy0 {
 	status = "okay";
 };
 
-&mipi_dphy1 {
+&video_phy1 {
 	status = "okay";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-evb-mipitest-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-evb-mipitest-v10.dtsi
index 4f5547faf24b..77ecad88f4ec 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-evb-mipitest-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-evb-mipitest-v10.dtsi
@@ -155,7 +155,7 @@
 };
 
 /*
- * mipi_dphy0 needs to be enabled
+ * video_phy0 needs to be enabled
  * when dsi0 is enabled
  */
 &dsi0 {
@@ -178,7 +178,7 @@
 };
 
 /*
- * mipi_dphy1 needs to be enabled
+ * video_phy1 needs to be enabled
  * when dsi1 is enabled
  */
 &dsi1 {
@@ -321,11 +321,11 @@
 	};
 };
 
-&mipi_dphy0 {
+&video_phy0 {
 	status = "okay";
 };
 
-&mipi_dphy1 {
+&video_phy1 {
 	status = "disabled";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10-lvds.dts b/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10-lvds.dts
index 390ba4c80997..98a384041b8b 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10-lvds.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10-lvds.dts
@@ -97,11 +97,3 @@
 	status = "okay";
 	connect = <&vp1_out_lvds>;
 };
-
-&mipi_dphy0 {
-	status = "disabled";
-};
-
-&mipi_dphy1 {
-	status = "disabled";
-};
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi
index 913aff5e2614..c43a63708ac4 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi
@@ -155,7 +155,7 @@
 };
 
 /*
- * mipi_dphy0 needs to be enabled
+ * video_phy0 needs to be enabled
  * when dsi0 is enabled
  */
 &dsi0 {
@@ -178,7 +178,7 @@
 };
 
 /*
- * mipi_dphy1 needs to be enabled
+ * video_phy1 needs to be enabled
  * when dsi1 is enabled
  */
 &dsi1 {
@@ -316,11 +316,11 @@
 	};
 };
 
-&mipi_dphy0 {
+&video_phy0 {
 	status = "okay";
 };
 
-&mipi_dphy1 {
+&video_phy1 {
 	status = "disabled";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10-eink.dts b/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10-eink.dts
index 2faa4e6803ce..83546eef6529 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10-eink.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10-eink.dts
@@ -285,7 +285,7 @@
 	};
 };
 
-&mipi_dphy0 {
+&video_phy0 {
 	status = "disabled";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi
index a23339548302..e4805605ebf0 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi
@@ -7,6 +7,7 @@
 /dts-v1/;
 
 #include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/display/media-bus-format.h>
 #include <dt-bindings/pinctrl/rockchip.h>
 #include "rk3566.dtsi"
 #include "rk3566-evb.dtsi"
@@ -166,7 +167,7 @@
 };
 
 /*
- * mipi_dphy0 needs to be enabled
+ * video_phy0 needs to be enabled
  * when dsi0 is enabled
  */
 &dsi0 {
@@ -189,7 +190,7 @@
 };
 
 /*
- * mipi_dphy1 needs to be enabled
+ * video_phy1 needs to be enabled
  * when dsi1 is enabled
  */
 &dsi1 {
@@ -405,11 +406,11 @@
 	};
 };
 
-&mipi_dphy0 {
+&video_phy0 {
 	status = "okay";
 };
 
-&mipi_dphy1 {
+&video_phy1 {
 	status = "disabled";
 };
 
@@ -594,4 +595,3 @@
 	BT,wake_host_irq = <&gpio2 RK_PC0 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
-
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-evb3-ddr3-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-evb3-ddr3-v10.dtsi
index 99b59f98be45..74cd0915056b 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-evb3-ddr3-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-evb3-ddr3-v10.dtsi
@@ -88,7 +88,7 @@
 };
 
 /*
- * mipi_dphy0 needs to be enabled
+ * video_phy0 needs to be enabled
  * when dsi0 is enabled
  */
 &dsi0 {
@@ -111,7 +111,7 @@
 };
 
 /*
- * mipi_dphy1 needs to be enabled
+ * video_phy1 needs to be enabled
  * when dsi1 is enabled
  */
 &dsi1 {
@@ -283,11 +283,11 @@
 	};
 };
 
-&mipi_dphy0 {
+&video_phy0 {
 	status = "okay";
 };
 
-&mipi_dphy1 {
+&video_phy1 {
 	status = "disabled";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi
index e9cb9c23ba61..8e0d808e6a89 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi
@@ -66,7 +66,7 @@
 };
 
 /*
- * mipi_dphy0 needs to be enabled
+ * video_phy0 needs to be enabled
  * when dsi0 is enabled
  */
 &dsi0 {
@@ -90,7 +90,7 @@
 };
 
 /*
- * mipi_dphy1 needs to be enabled
+ * video_phy1 needs to be enabled
  * when dsi1 is enabled
  */
 &dsi1 {
@@ -179,11 +179,11 @@
 	};
 };
 
-&mipi_dphy0 {
+&video_phy0 {
 	status = "okay";
 };
 
-&mipi_dphy1 {
+&video_phy1 {
 	status = "disabled";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts
index a72bfe1ec459..45a9e8312eea 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts
@@ -844,7 +844,7 @@
 	status = "okay";
 };
 
-&mipi_dphy0 {
+&video_phy0 {
 	status = "disabled";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w6.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w6.dts
index 27d3c69b6355..03801d5dff0e 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w6.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w6.dts
@@ -698,7 +698,7 @@
 	status = "okay";
 };
 
-&mipi_dphy0 {
+&video_phy0 {
 	status = "disabled";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink.dts
index b0216ae1583e..3fadfaec8e51 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink.dts
@@ -714,7 +714,7 @@
 	status = "okay";
 };
 
-&mipi_dphy0 {
+&video_phy0 {
 	status = "disabled";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-k108.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-k108.dts
index cb1ae9d2546c..22a5459329da 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-k108.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-k108.dts
@@ -991,7 +991,7 @@
 	status = "okay";
 };
 
-&mipi_dphy0 {
+&video_phy0 {
 	status = "okay";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-rkg11.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-rkg11.dts
index d10c0bb3989b..2540354c1a5c 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-rkg11.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-rkg11.dts
@@ -893,11 +893,11 @@
 	status = "okay";
 };
 
-&mipi_dphy0 {
+&video_phy0 {
 	status = "okay";
 };
 
-&mipi_dphy1 {
+&video_phy1 {
 	status = "okay";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-v10.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-v10.dts
index ca412b19378c..32601e463df4 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-v10.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-v10.dts
@@ -921,7 +921,7 @@
 	status = "okay";
 };
 
-&mipi_dphy0 {
+&video_phy0 {
 	status = "okay";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet.dts
index ebb0feecbe02..eef06d5b4a62 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet.dts
@@ -926,7 +926,7 @@
 	status = "okay";
 };
 
-&mipi_dphy0 {
+&video_phy0 {
 	status = "okay";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi
index 69d5d7e1e980..dc847d0ab9ed 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi
@@ -152,7 +152,7 @@
 };
 
 /*
- * mipi_dphy0 needs to be enabled
+ * video_phy0 needs to be enabled
  * when dsi0 is enabled
  */
 &dsi0 {
@@ -172,7 +172,7 @@
 };
 
 /*
- * mipi_dphy1 needs to be enabled
+ * video_phy1 needs to be enabled
  * when dsi1 is enabled
  */
 &dsi1 {
@@ -354,11 +354,11 @@
 	};
 };
 
-&mipi_dphy0 {
+&video_phy0 {
 	status = "okay";
 };
 
-&mipi_dphy1 {
+&video_phy1 {
 	status = "disabled";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10-bt1120-to-hdmi.dts b/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10-bt1120-to-hdmi.dts
index eddea1dd9148..7a5a7feb52a7 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10-bt1120-to-hdmi.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10-bt1120-to-hdmi.dts
@@ -45,7 +45,7 @@
 	};
 };
 
-&mipi_dphy0 {
+&video_phy0 {
 	status = "disabled";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi
index 505d01779c48..b3fbc7d80b43 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi
@@ -77,7 +77,7 @@
 };
 
 /*
- * mipi_dphy0 needs to be enabled
+ * video_phy0 needs to be enabled
  * when dsi0 is enabled
  */
 &dsi0 {
@@ -97,7 +97,7 @@
 };
 
 /*
- * mipi_dphy1 needs to be enabled
+ * video_phy1 needs to be enabled
  * when dsi1 is enabled
  */
 &dsi1 {
@@ -201,11 +201,11 @@
 	};
 };
 
-&mipi_dphy0 {
+&video_phy0 {
 	status = "okay";
 };
 
-&mipi_dphy1 {
+&video_phy1 {
 	status = "disabled";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi
index 1a7ebb1ed1e9..651d4c1fcb5b 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi
@@ -165,7 +165,7 @@
 };
 
 /*
- * mipi_dphy0 needs to be enabled
+ * video_phy0 needs to be enabled
  * when dsi0 is enabled
  */
 &dsi0 {
@@ -185,7 +185,7 @@
 };
 
 /*
- * mipi_dphy1 needs to be enabled
+ * video_phy1 needs to be enabled
  * when dsi1 is enabled
  */
 &dsi1 {
@@ -397,11 +397,11 @@
 	};
 };
 
-&mipi_dphy0 {
+&video_phy0 {
 	status = "okay";
 };
 
-&mipi_dphy1 {
+&video_phy1 {
 	status = "disabled";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10-rk628-bt1120-to-hdmi.dts b/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10-rk628-bt1120-to-hdmi.dts
index d5251a5fc17a..106e85c07eb4 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10-rk628-bt1120-to-hdmi.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10-rk628-bt1120-to-hdmi.dts
@@ -24,7 +24,7 @@
 	};
 };
 
-&mipi_dphy0 {
+&video_phy0 {
 	status = "disabled";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi
index b8110a505c62..9fac596bc732 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi
@@ -77,7 +77,7 @@
 };
 
 /*
- * mipi_dphy0 needs to be enabled
+ * video_phy0 needs to be enabled
  * when dsi0 is enabled
  */
 &dsi0 {
@@ -97,7 +97,7 @@
 };
 
 /*
- * mipi_dphy1 needs to be enabled
+ * video_phy1 needs to be enabled
  * when dsi1 is enabled
  */
 &dsi1 {
@@ -287,11 +287,11 @@
 	};
 };
 
-&mipi_dphy0 {
+&video_phy0 {
 	status = "okay";
 };
 
-&mipi_dphy1 {
+&video_phy1 {
 	status = "disabled";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi
index b222f4107258..7697ee16ad64 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi
@@ -305,11 +305,11 @@
 	status = "okay";
 };
 
-&mipi_dphy0 {
+&video_phy0 {
 	status = "okay";
 };
 
-&mipi_dphy1 {
+&video_phy1 {
 	status = "okay";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index f7ef831fc3d7..55bdc827bde4 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -1808,11 +1808,11 @@
 		compatible = "rockchip,rk3568-mipi-dsi";
 		reg = <0x0 0xfe060000 0x0 0x10000>;
 		interrupts = <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>;
-		clocks = <&cru PCLK_DSITX_0>, <&cru HCLK_VO>, <&mipi_dphy0>;
+		clocks = <&cru PCLK_DSITX_0>, <&cru HCLK_VO>, <&video_phy0>;
 		clock-names = "pclk", "hclk", "hs_clk";
 		resets = <&cru SRST_P_DSITX_0>;
 		reset-names = "apb";
-		phys = <&mipi_dphy0>;
+		phys = <&video_phy0>;
 		phy-names = "mipi_dphy";
 		power-domains = <&power RK3568_PD_VO>;
 		rockchip,grf = <&grf>;
@@ -1848,11 +1848,11 @@
 		compatible = "rockchip,rk3568-mipi-dsi";
 		reg = <0x0 0xfe070000 0x0 0x10000>;
 		interrupts = <GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>;
-		clocks = <&cru PCLK_DSITX_1>, <&cru HCLK_VO>, <&mipi_dphy1>;
+		clocks = <&cru PCLK_DSITX_1>, <&cru HCLK_VO>, <&video_phy1>;
 		clock-names = "pclk", "hclk", "hs_clk";
 		resets = <&cru SRST_P_DSITX_1>;
 		reset-names = "apb";
-		phys = <&mipi_dphy1>;
+		phys = <&video_phy1>;
 		phy-names = "mipi_dphy";
 		power-domains = <&power RK3568_PD_VO>;
 		rockchip,grf = <&grf>;
@@ -3281,21 +3281,6 @@
 		status = "disabled";
 	};
 
-	mipi_dphy0: mipi-dphy@fe850000 {
-		compatible = "rockchip,rk3568-mipi-dphy";
-		reg = <0x0 0xfe850000 0x0 0x10000>;
-		clocks = <&pmucru CLK_MIPIDSIPHY0_REF>, <&cru PCLK_MIPIDSIPHY0>;
-		clock-names = "ref", "pclk";
-		clock-output-names = "mipi_dphy_pll";
-		#clock-cells = <0>;
-		resets = <&cru SRST_P_MIPIDSIPHY0>;
-		reset-names = "apb";
-		power-domains = <&power RK3568_PD_VO>;
-		#phy-cells = <0>;
-		rockchip,grf = <&grf>;
-		status = "disabled";
-	};
-
 	video_phy0: video-phy@fe850000 {
 		compatible = "rockchip,rk3568-video-phy";
 		reg = <0x0 0xfe850000  0x0 0x10000>,
@@ -3311,18 +3296,18 @@
 		status = "disabled";
 	};
 
-	mipi_dphy1: mipi-dphy@fe860000 {
-		compatible = "rockchip,rk3568-mipi-dphy";
-		reg = <0x0 0xfe860000 0x0 0x10000>;
-		clocks = <&pmucru CLK_MIPIDSIPHY1_REF>, <&cru PCLK_MIPIDSIPHY1>;
-		clock-names = "ref", "pclk";
-		clock-output-names = "mipi_dphy1_pll";
+	video_phy1: video-phy@fe860000 {
+		compatible = "rockchip,rk3568-video-phy";
+		reg = <0x0 0xfe860000  0x0 0x10000>,
+		      <0x0 0xfe070000 0x0 0x10000>;
+		clocks = <&pmucru CLK_MIPIDSIPHY1_REF>,
+			 <&cru PCLK_MIPIDSIPHY1>, <&cru PCLK_DSITX_1>;
+		clock-names = "ref", "pclk_phy", "pclk_host";
 		#clock-cells = <0>;
 		resets = <&cru SRST_P_MIPIDSIPHY1>;
-		reset-names = "apb";
+		reset-names = "rst";
 		power-domains = <&power RK3568_PD_VO>;
 		#phy-cells = <0>;
-		rockchip,grf = <&grf>;
 		status = "disabled";
 	};
 

commit b797fb0dfa65b0f887331aa37fd8e6dc39926f9a
Author: Guochun Huang <hero.huang@rock-chips.com>
Date:   Wed Jun 23 14:17:22 2021 +0800

    phy/rockchip: inno-video-combo-phy: update for rk356x mipi_dphy
    
    Signed-off-by: Guochun Huang <hero.huang@rock-chips.com>
    Change-Id: I33377ec3d0293a17dc5a231e50906d43dcf74781

diff --git a/drivers/phy/rockchip/phy-rockchip-inno-mipi-dphy.c b/drivers/phy/rockchip/phy-rockchip-inno-mipi-dphy.c
index b49b1aad2a09..4449f025ff20 100644
--- a/drivers/phy/rockchip/phy-rockchip-inno-mipi-dphy.c
+++ b/drivers/phy/rockchip/phy-rockchip-inno-mipi-dphy.c
@@ -817,7 +817,6 @@ static int inno_mipi_dphy_remove(struct platform_device *pdev)
 
 static const struct of_device_id inno_mipi_dphy_of_match[] = {
 	{ .compatible = "rockchip,rk1808-mipi-dphy", },
-	{ .compatible = "rockchip,rk3568-mipi-dphy", },
 	{ .compatible = "rockchip,rv1126-mipi-dphy", },
 	{}
 };
diff --git a/drivers/phy/rockchip/phy-rockchip-inno-video-combo-phy.c b/drivers/phy/rockchip/phy-rockchip-inno-video-combo-phy.c
index 3e4b3b8c67b6..4886d548daf9 100644
--- a/drivers/phy/rockchip/phy-rockchip-inno-video-combo-phy.c
+++ b/drivers/phy/rockchip/phy-rockchip-inno-video-combo-phy.c
@@ -14,6 +14,7 @@
 #include <linux/module.h>
 #include <linux/of_device.h>
 #include <linux/platform_device.h>
+#include <linux/regmap.h>
 #include <linux/reset.h>
 #include <linux/phy/phy.h>
 #include <linux/pm_runtime.h>
@@ -82,12 +83,27 @@
 #define DATA_LANE_0_SKEW_PHASE_MASK		GENMASK(2, 0)
 #define DATA_LANE_0_SKEW_PHASE(x)		UPDATE(x, 2, 0)
 /* Analog Register Part: reg08 */
+#define PRE_EMPHASIS_ENABLE_MASK		BIT(7)
+#define PRE_EMPHASIS_ENABLE			BIT(7)
+#define PRE_EMPHASIS_DISABLE			0
+#define PLL_POST_DIV_ENABLE_MASK		BIT(5)
+#define PLL_POST_DIV_ENABLE			BIT(5)
+#define PLL_POST_DIV_DISABLE			0
+#define DATA_LANE_VOD_RANGE_SET_MASK		GENMASK(3, 0)
+#define DATA_LANE_VOD_RANGE_SET(x)		UPDATE(x, 3, 0)
 #define SAMPLE_CLOCK_DIRECTION_MASK		BIT(4)
 #define SAMPLE_CLOCK_DIRECTION_REVERSE		BIT(4)
 #define SAMPLE_CLOCK_DIRECTION_FORWARD		0
 #define LOWFRE_EN_MASK				BIT(5)
 #define PLL_OUTPUT_FREQUENCY_DIV_BY_1		0
 #define PLL_OUTPUT_FREQUENCY_DIV_BY_2		1
+/* Analog Register Part: reg0b */
+#define CLOCK_LANE_VOD_RANGE_SET_MASK		GENMASK(3, 0)
+#define CLOCK_LANE_VOD_RANGE_SET(x)		UPDATE(x, 3, 0)
+#define VOD_MIN_RANGE				0x1
+#define VOD_MID_RANGE				0x3
+#define VOD_BIG_RANGE				0x7
+#define VOD_MAX_RANGE				0xf
 /* Analog Register Part: reg1e */
 #define PLL_MODE_SEL_MASK			GENMASK(6, 5)
 #define PLL_MODE_SEL_LVDS_MODE			0
@@ -107,20 +123,22 @@
 #define T_LPX_CNT_MASK				GENMASK(5, 0)
 #define T_LPX_CNT(x)				UPDATE(x, 5, 0)
 /* Clock/Data0/Data1/Data2/Data3 Lane Register Part: reg06 */
+#define T_HS_ZERO_CNT_HI_MASK			BIT(7)
+#define T_HS_ZERO_CNT_HI(x)			UPDATE(x, 7, 7)
 #define T_HS_PREPARE_CNT_MASK			GENMASK(6, 0)
 #define T_HS_PREPARE_CNT(x)			UPDATE(x, 6, 0)
 /* Clock/Data0/Data1/Data2/Data3 Lane Register Part: reg07 */
-#define T_HS_ZERO_CNT_MASK			GENMASK(5, 0)
-#define T_HS_ZERO_CNT(x)			UPDATE(x, 5, 0)
+#define T_HS_ZERO_CNT_LO_MASK			GENMASK(5, 0)
+#define T_HS_ZERO_CNT_LO(x)			UPDATE(x, 5, 0)
 /* Clock/Data0/Data1/Data2/Data3 Lane Register Part: reg08 */
 #define T_HS_TRAIL_CNT_MASK			GENMASK(6, 0)
 #define T_HS_TRAIL_CNT(x)			UPDATE(x, 6, 0)
 /* Clock/Data0/Data1/Data2/Data3 Lane Register Part: reg09 */
-#define T_HS_EXIT_CNT_MASK			GENMASK(4, 0)
-#define T_HS_EXIT_CNT(x)			UPDATE(x, 4, 0)
+#define T_HS_EXIT_CNT_LO_MASK			GENMASK(4, 0)
+#define T_HS_EXIT_CNT_LO(x)			UPDATE(x, 4, 0)
 /* Clock/Data0/Data1/Data2/Data3 Lane Register Part: reg0a */
-#define T_CLK_POST_CNT_MASK			GENMASK(3, 0)
-#define T_CLK_POST_CNT(x)			UPDATE(x, 3, 0)
+#define T_CLK_POST_CNT_LO_MASK			GENMASK(3, 0)
+#define T_CLK_POST_CNT_LO(x)			UPDATE(x, 3, 0)
 /* Clock/Data0/Data1/Data2/Data3 Lane Register Part: reg0c */
 #define LPDT_TX_PPI_SYNC_MASK			BIT(2)
 #define LPDT_TX_PPI_SYNC_ENABLE			BIT(2)
@@ -134,9 +152,13 @@
 #define T_CLK_PRE_CNT_MASK			GENMASK(3, 0)
 #define T_CLK_PRE_CNT(x)			UPDATE(x, 3, 0)
 /* Clock/Data0/Data1/Data2/Data3 Lane Register Part: reg10 */
+#define T_CLK_POST_HI_MASK			GENMASK(7, 6)
+#define T_CLK_POST_HI(x)			UPDATE(x, 7, 6)
 #define T_TA_GO_CNT_MASK			GENMASK(5, 0)
 #define T_TA_GO_CNT(x)				UPDATE(x, 5, 0)
 /* Clock/Data0/Data1/Data2/Data3 Lane Register Part: reg11 */
+#define T_HS_EXIT_CNT_HI_MASK			BIT(6)
+#define T_HS_EXIT_CNT_HI(x)			UPDATE(x, 6, 6)
 #define T_TA_SURE_CNT_MASK			GENMASK(5, 0)
 #define T_TA_SURE_CNT(x)			UPDATE(x, 5, 0)
 /* Clock/Data0/Data1/Data2/Data3 Lane Register Part: reg12 */
@@ -174,6 +196,11 @@
 #define DSI_PHY_STATUS		0xb0
 #define PHY_LOCK		BIT(0)
 
+enum phy_max_rate {
+	MAX_1GHZ,
+	MAX_2_5GHZ,
+};
+
 struct mipi_dphy_timing {
 	unsigned int clkmiss;
 	unsigned int clkpost;
@@ -199,15 +226,26 @@ struct mipi_dphy_timing {
 	unsigned int wakeup;
 };
 
+struct inno_mipi_dphy_timing {
+	unsigned int max_lane_mbps;
+	u8 lpx;
+	u8 hs_prepare;
+	u8 clk_lane_hs_zero;
+	u8 data_lane_hs_zero;
+	u8 hs_trail;
+};
+
 struct inno_video_phy {
 	struct device *dev;
 	struct clk *ref_clk;
 	struct clk *pclk_phy;
 	struct clk *pclk_host;
-	void __iomem *phy_base;
+	struct regmap *regmap;
 	void __iomem *host_base;
 	struct reset_control *rst;
 	enum phy_mode mode;
+	unsigned int lanes;
+	const struct inno_video_phy_plat_data *pdata;
 
 	struct {
 		struct clk_hw hw;
@@ -217,6 +255,12 @@ struct inno_video_phy {
 	} pll;
 };
 
+struct inno_video_phy_plat_data {
+	const struct inno_mipi_dphy_timing *inno_mipi_dphy_timing_table;
+	const unsigned int num_timings;
+	enum phy_max_rate max_rate;
+};
+
 enum {
 	REGISTER_PART_ANALOG,
 	REGISTER_PART_DIGITAL,
@@ -228,6 +272,44 @@ enum {
 	REGISTER_PART_LVDS,
 };
 
+static const
+struct inno_mipi_dphy_timing inno_mipi_dphy_timing_table_max_1GHz[] = {
+	{ 110, 0x0, 0x20, 0x16, 0x02, 0x22},
+	{ 150, 0x0, 0x06, 0x16, 0x03, 0x45},
+	{ 200, 0x0, 0x18, 0x17, 0x04, 0x0b},
+	{ 250, 0x0, 0x05, 0x17, 0x05, 0x16},
+	{ 300, 0x0, 0x51, 0x18, 0x06, 0x2c},
+	{ 400, 0x0, 0x64, 0x19, 0x07, 0x33},
+	{ 500, 0x0, 0x20, 0x1b, 0x07, 0x4e},
+	{ 600, 0x0, 0x6a, 0x1d, 0x08, 0x3a},
+	{ 700, 0x0, 0x3e, 0x1e, 0x08, 0x6a},
+	{ 800, 0x0, 0x21, 0x1f, 0x09, 0x29},
+	{1000, 0x0, 0x09, 0x20, 0x09, 0x27},
+};
+
+static const
+struct inno_mipi_dphy_timing inno_mipi_dphy_timing_table_max_2_5GHz[] = {
+	{ 110, 0x02, 0x7f, 0x16, 0x02, 0x02},
+	{ 150, 0x02, 0x7f, 0x16, 0x03, 0x02},
+	{ 200, 0x02, 0x7f, 0x17, 0x04, 0x02},
+	{ 250, 0x02, 0x7f, 0x17, 0x05, 0x04},
+	{ 300, 0x02, 0x7f, 0x18, 0x06, 0x04},
+	{ 400, 0x03, 0x7e, 0x19, 0x07, 0x04},
+	{ 500, 0x03, 0x7c, 0x1b, 0x07, 0x08},
+	{ 600, 0x03, 0x70, 0x1d, 0x08, 0x10},
+	{ 700, 0x05, 0x40, 0x1e, 0x08, 0x30},
+	{ 800, 0x05, 0x02, 0x1f, 0x09, 0x30},
+	{1000, 0x05, 0x08, 0x20, 0x09, 0x30},
+	{1200, 0x06, 0x03, 0x32, 0x14, 0x0f},
+	{1400, 0x09, 0x03, 0x32, 0x14, 0x0f},
+	{1600, 0x0d, 0x42, 0x36, 0x0e, 0x0f},
+	{1800, 0x0e, 0x47, 0x7a, 0x0e, 0x0f},
+	{2000, 0x11, 0x64, 0x7a, 0x0e, 0x0b},
+	{2200, 0x13, 0x64, 0x7e, 0x15, 0x0b},
+	{2400, 0x13, 0x33, 0x7f, 0x15, 0x6a},
+	{2500, 0x15, 0x54, 0x7f, 0x15, 0x6a},
+};
+
 static inline struct inno_video_phy *hw_to_inno(struct clk_hw *hw)
 {
 	return container_of(hw, struct inno_video_phy, pll.hw);
@@ -237,12 +319,8 @@ static void phy_update_bits(struct inno_video_phy *inno,
 			    u8 first, u8 second, u8 mask, u8 val)
 {
 	u32 reg = PHY_REG(first, second) << 2;
-	unsigned int tmp, orig;
 
-	orig = readl(inno->phy_base + reg);
-	tmp = orig & ~mask;
-	tmp |= val & mask;
-	writel(tmp, inno->phy_base + reg);
+	regmap_update_bits(inno->regmap, reg, mask, val);
 }
 
 static void host_update_bits(struct inno_video_phy *inno,
@@ -284,37 +362,49 @@ static void mipi_dphy_timing_get_default(struct mipi_dphy_timing *timing,
 	timing->wakeup = 1000000000;
 }
 
-static void inno_video_phy_mipi_mode_enable(struct inno_video_phy *inno)
+static const struct inno_mipi_dphy_timing *
+inno_mipi_dphy_get_timing(struct inno_video_phy *inno)
 {
-	struct mipi_dphy_timing gotp;
-	const struct {
-		unsigned long rate;
-		u8 hs_prepare;
-		u8 clk_lane_hs_zero;
-		u8 data_lane_hs_zero;
-		u8 hs_trail;
-	} timings[] = {
-		{ 110000000, 0x20, 0x16, 0x02, 0x22},
-		{ 150000000, 0x06, 0x16, 0x03, 0x45},
-		{ 200000000, 0x18, 0x17, 0x04, 0x0b},
-		{ 250000000, 0x05, 0x17, 0x05, 0x16},
-		{ 300000000, 0x51, 0x18, 0x06, 0x2c},
-		{ 400000000, 0x64, 0x19, 0x07, 0x33},
-		{ 500000000, 0x20, 0x1b, 0x07, 0x4e},
-		{ 600000000, 0x6a, 0x1d, 0x08, 0x3a},
-		{ 700000000, 0x3e, 0x1e, 0x08, 0x6a},
-		{ 800000000, 0x21, 0x1f, 0x09, 0x29},
-		{1000000000, 0x09, 0x20, 0x09, 0x27},
-	};
-	u32 t_txbyteclkhs, t_txclkesc, ui;
-	u32 txbyteclkhs, txclkesc, esc_clk_div;
-	u32 hs_exit, clk_post, clk_pre, wakeup, lpx, ta_go, ta_sure, ta_wait;
-	u32 hs_prepare, hs_trail, hs_zero, clk_lane_hs_zero, data_lane_hs_zero;
+	const struct inno_mipi_dphy_timing *timings;
+	unsigned int num_timings;
+	unsigned int lane_mbps = inno->pll.rate / USEC_PER_SEC;
 	unsigned int i;
 
-	/* Select MIPI mode */
-	phy_update_bits(inno, REGISTER_PART_LVDS, 0x03,
-			MODE_ENABLE_MASK, MIPI_MODE_ENABLE);
+	timings = inno->pdata->inno_mipi_dphy_timing_table;
+	num_timings = inno->pdata->num_timings;
+
+	for (i = 0; i < num_timings; i++)
+		if (lane_mbps <= timings[i].max_lane_mbps)
+			break;
+
+	if (i == num_timings)
+		--i;
+
+	return &timings[i];
+
+}
+
+static void inno_mipi_dphy_max_2_5GHz_pll_enable(struct inno_video_phy *inno)
+{
+
+	phy_update_bits(inno, REGISTER_PART_ANALOG, 0x03,
+			REG_PREDIV_MASK, REG_PREDIV(inno->pll.prediv));
+	phy_update_bits(inno, REGISTER_PART_ANALOG, 0x03,
+			REG_FBDIV_HI_MASK, REG_FBDIV_HI(inno->pll.fbdiv >> 8));
+	phy_update_bits(inno, REGISTER_PART_ANALOG, 0x04,
+			REG_FBDIV_LO_MASK, REG_FBDIV_LO(inno->pll.fbdiv));
+	phy_update_bits(inno, REGISTER_PART_ANALOG, 0x08,
+			PLL_POST_DIV_ENABLE_MASK, PLL_POST_DIV_ENABLE);
+	phy_update_bits(inno, REGISTER_PART_ANALOG, 0x0b,
+			CLOCK_LANE_VOD_RANGE_SET_MASK,
+			CLOCK_LANE_VOD_RANGE_SET(VOD_MAX_RANGE));
+	phy_update_bits(inno, REGISTER_PART_ANALOG, 0x01,
+			 REG_LDOPD_MASK | REG_PLLPD_MASK,
+			 REG_LDOPD_POWER_ON | REG_PLLPD_POWER_ON);
+}
+
+static void inno_mipi_dphy_max_1GHz_pll_enable(struct inno_video_phy *inno)
+{
 	/* Configure PLL */
 	phy_update_bits(inno, REGISTER_PART_ANALOG, 0x03,
 			REG_PREDIV_MASK, REG_PREDIV(inno->pll.prediv));
@@ -326,6 +416,10 @@ static void inno_video_phy_mipi_mode_enable(struct inno_video_phy *inno)
 	phy_update_bits(inno, REGISTER_PART_ANALOG, 0x01,
 			REG_LDOPD_MASK | REG_PLLPD_MASK,
 			REG_LDOPD_POWER_ON | REG_PLLPD_POWER_ON);
+}
+
+static void inno_mipi_dphy_reset(struct inno_video_phy *inno)
+{
 	/* Reset analog */
 	phy_update_bits(inno, REGISTER_PART_ANALOG, 0x01,
 			REG_SYNCRST_MASK, REG_SYNCRST_RESET);
@@ -338,15 +432,26 @@ static void inno_video_phy_mipi_mode_enable(struct inno_video_phy *inno)
 	udelay(1);
 	phy_update_bits(inno, REGISTER_PART_DIGITAL, 0x00,
 			REG_DIG_RSTN_MASK, REG_DIG_RSTN_NORMAL);
+}
 
-	txbyteclkhs = inno->pll.rate / 8;
-	t_txbyteclkhs = div_u64(PSEC_PER_SEC, txbyteclkhs);
+static void inno_mipi_dphy_timing_init(struct inno_video_phy *inno)
+{
+	struct mipi_dphy_timing gotp;
+	u32 t_txbyteclkhs, t_txclkesc, ui, sys_clk;
+	u32 txbyteclkhs, txclkesc, esc_clk_div;
+	u32 hs_exit, clk_post, clk_pre, wakeup, lpx, ta_go, ta_sure, ta_wait;
+	u32 hs_prepare, hs_trail, hs_zero, clk_lane_hs_zero, data_lane_hs_zero;
+	const struct inno_mipi_dphy_timing *timing;
+	unsigned int i;
 
-	esc_clk_div = DIV_ROUND_UP(txbyteclkhs, 20000000);
+	txbyteclkhs = inno->pll.rate / 8;
+	t_txbyteclkhs = DIV_ROUND_CLOSEST_ULL(PSEC_PER_SEC, txbyteclkhs);
+	sys_clk = clk_get_rate(inno->pclk_phy);
+	esc_clk_div = DIV_ROUND_CLOSEST_ULL(txbyteclkhs, 20000000);
 	txclkesc = txbyteclkhs / esc_clk_div;
 	t_txclkesc = div_u64(PSEC_PER_SEC, txclkesc);
 
-	ui = div_u64(PSEC_PER_SEC, inno->pll.rate);
+	ui = DIV_ROUND_CLOSEST_ULL(PSEC_PER_SEC, inno->pll.rate);
 
 	memset(&gotp, 0, sizeof(gotp));
 	mipi_dphy_timing_get_default(&gotp, ui);
@@ -355,57 +460,57 @@ static void inno_video_phy_mipi_mode_enable(struct inno_video_phy *inno)
 	 * The value of counter for HS Ths-exit
 	 * Ths-exit = Tpin_txbyteclkhs * value
 	 */
-	hs_exit = DIV_ROUND_UP(gotp.hsexit, t_txbyteclkhs);
+	hs_exit = DIV_ROUND_CLOSEST_ULL(gotp.hsexit, t_txbyteclkhs);
 	/*
 	 * The value of counter for HS Tclk-post
 	 * Tclk-post = Tpin_txbyteclkhs * value
 	 */
-	clk_post = DIV_ROUND_UP(gotp.clkpost, t_txbyteclkhs);
+	clk_post = DIV_ROUND_CLOSEST_ULL(gotp.clkpost, t_txbyteclkhs);
 	/*
 	 * The value of counter for HS Tclk-pre
 	 * Tclk-pre = Tpin_txbyteclkhs * value
 	 */
-	clk_pre = DIV_ROUND_UP(gotp.clkpre, t_txbyteclkhs);
-
-	/*
-	 * The value of counter for HS Tlpx Time
-	 * Tlpx = Tpin_txbyteclkhs * (2 + value)
-	 */
-	lpx = DIV_ROUND_UP(gotp.lpx, t_txbyteclkhs);
-	if (lpx >= 2)
-		lpx -= 2;
+	clk_pre = DIV_ROUND_CLOSEST_ULL(gotp.clkpre, t_txbyteclkhs);
 
+	wakeup = DIV_ROUND_CLOSEST_ULL(gotp.wakeup * sys_clk, PSEC_PER_SEC);
+	if (wakeup > 0x3ff)
+		wakeup = 0x3ff;
 	/*
 	 * The value of counter for HS Tta-go
 	 * Tta-go for turnaround
 	 * Tta-go = Ttxclkesc * value
 	 */
-	ta_go = DIV_ROUND_UP(gotp.tago, t_txclkesc);
+	ta_go = DIV_ROUND_CLOSEST_ULL(gotp.tago, t_txclkesc);
 	/*
 	 * The value of counter for HS Tta-sure
 	 * Tta-sure for turnaround
 	 * Tta-sure = Ttxclkesc * value
 	 */
-	ta_sure = DIV_ROUND_UP(gotp.tasure, t_txclkesc);
+	ta_sure = DIV_ROUND_CLOSEST_ULL(gotp.tasure, t_txclkesc);
 	/*
 	 * The value of counter for HS Tta-wait
 	 * Tta-wait for turnaround
 	 * Tta-wait = Ttxclkesc * value
 	 */
-	ta_wait = DIV_ROUND_UP(gotp.taget, t_txclkesc);
-
-	for (i = 0; i < ARRAY_SIZE(timings); i++)
-		if (inno->pll.rate <= timings[i].rate)
-			break;
+	ta_wait = DIV_ROUND_CLOSEST_ULL(gotp.taget, t_txclkesc);
 
-	if (i == ARRAY_SIZE(timings))
-		--i;
+	timing = inno_mipi_dphy_get_timing(inno);
 
-	hs_prepare = timings[i].hs_prepare;
-	hs_trail = timings[i].hs_trail;
-	clk_lane_hs_zero = timings[i].clk_lane_hs_zero;
-	data_lane_hs_zero = timings[i].data_lane_hs_zero;
-	wakeup = 0x3ff;
+	/*
+	 * The value of counter for HS Tlpx Time
+	 * Tlpx = Tpin_txbyteclkhs * (2 + value)
+	 */
+	if (inno->pdata->max_rate == MAX_1GHZ) {
+		lpx = DIV_ROUND_CLOSEST_ULL(gotp.lpx, t_txbyteclkhs);
+		if (lpx >= 2)
+			lpx -= 2;
+	} else
+		lpx = timing->lpx;
+
+	hs_prepare = timing->hs_prepare;
+	hs_trail = timing->hs_trail;
+	clk_lane_hs_zero = timing->clk_lane_hs_zero;
+	data_lane_hs_zero = timing->data_lane_hs_zero;
 
 	for (i = REGISTER_PART_CLOCK_LANE; i <= REGISTER_PART_DATA3_LANE; i++) {
 		if (i == REGISTER_PART_CLOCK_LANE)
@@ -417,14 +522,29 @@ static void inno_video_phy_mipi_mode_enable(struct inno_video_phy *inno)
 				T_LPX_CNT(lpx));
 		phy_update_bits(inno, i, 0x06, T_HS_PREPARE_CNT_MASK,
 				T_HS_PREPARE_CNT(hs_prepare));
-		phy_update_bits(inno, i, 0x07, T_HS_ZERO_CNT_MASK,
-				T_HS_ZERO_CNT(hs_zero));
+
+		if (inno->pdata->max_rate == MAX_2_5GHZ)
+			phy_update_bits(inno, i, 0x06, T_HS_ZERO_CNT_HI_MASK,
+					T_HS_ZERO_CNT_HI(hs_zero >> 6));
+
+		phy_update_bits(inno, i, 0x07, T_HS_ZERO_CNT_LO_MASK,
+				T_HS_ZERO_CNT_LO(hs_zero));
 		phy_update_bits(inno, i, 0x08, T_HS_TRAIL_CNT_MASK,
 				T_HS_TRAIL_CNT(hs_trail));
-		phy_update_bits(inno, i, 0x09, T_HS_EXIT_CNT_MASK,
-				T_HS_EXIT_CNT(hs_exit));
-		phy_update_bits(inno, i, 0x0a, T_CLK_POST_CNT_MASK,
-				T_CLK_POST_CNT(clk_post));
+
+		if (inno->pdata->max_rate == MAX_2_5GHZ)
+			phy_update_bits(inno, i, 0x11, T_HS_EXIT_CNT_HI_MASK,
+					T_HS_EXIT_CNT_HI(hs_exit >> 5));
+
+		phy_update_bits(inno, i, 0x09, T_HS_EXIT_CNT_LO_MASK,
+				T_HS_EXIT_CNT_LO(hs_exit));
+
+		if (inno->pdata->max_rate == MAX_2_5GHZ)
+			phy_update_bits(inno, i, 0x10, T_CLK_POST_HI_MASK,
+					T_CLK_POST_HI(clk_post >> 4));
+
+		phy_update_bits(inno, i, 0x0a, T_CLK_POST_CNT_LO_MASK,
+				T_CLK_POST_CNT_LO(clk_post));
 		phy_update_bits(inno, i, 0x0e, T_CLK_PRE_CNT_MASK,
 				T_CLK_PRE_CNT(clk_pre));
 		phy_update_bits(inno, i, 0x0c, T_WAKEUP_CNT_HI_MASK,
@@ -439,10 +559,47 @@ static void inno_video_phy_mipi_mode_enable(struct inno_video_phy *inno)
 				T_TA_WAIT_CNT(ta_wait));
 	}
 
-	/* Enable all lanes on analog part */
-	phy_update_bits(inno, REGISTER_PART_ANALOG, 0x00,
-			LANE_EN_MASK, LANE_EN_CK | LANE_EN_3 | LANE_EN_2 |
-			LANE_EN_1 | LANE_EN_0);
+}
+
+static void inno_mipi_dphy_lane_enable(struct inno_video_phy *inno)
+{
+	u8 val = LANE_EN_CK;
+
+	switch (inno->lanes) {
+	case 1:
+		val |= LANE_EN_0;
+		break;
+	case 2:
+		val |= LANE_EN_1 | LANE_EN_0;
+		break;
+	case 3:
+		val |= LANE_EN_2 | LANE_EN_1 | LANE_EN_0;
+		break;
+	case 4:
+	default:
+		val |= LANE_EN_3 | LANE_EN_2 | LANE_EN_1 | LANE_EN_0;
+		break;
+	}
+
+	phy_update_bits(inno, REGISTER_PART_ANALOG, 0x00, LANE_EN_MASK, val);
+}
+
+
+static void inno_video_phy_mipi_mode_enable(struct inno_video_phy *inno)
+{
+	/* Select MIPI mode */
+	phy_update_bits(inno, REGISTER_PART_LVDS, 0x03,
+			MODE_ENABLE_MASK, MIPI_MODE_ENABLE);
+	if (inno->pdata->max_rate == MAX_2_5GHZ)
+		inno_mipi_dphy_max_2_5GHz_pll_enable(inno);
+	else
+		inno_mipi_dphy_max_1GHz_pll_enable(inno);
+
+	inno_mipi_dphy_reset(inno);
+
+	inno_mipi_dphy_timing_init(inno);
+
+	inno_mipi_dphy_lane_enable(inno);
 }
 
 static void inno_video_phy_lvds_mode_enable(struct inno_video_phy *inno)
@@ -765,6 +922,13 @@ static void inno_video_phy_pll_unregister(struct inno_video_phy *inno)
 	of_clk_del_provider(dev->of_node);
 }
 
+static const struct regmap_config inno_video_phy_regmap_config = {
+	.reg_bits = 32,
+	.val_bits = 32,
+	.reg_stride = 4,
+	.max_register = 0x3ac,
+};
+
 static int inno_video_phy_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
@@ -772,6 +936,7 @@ static int inno_video_phy_probe(struct platform_device *pdev)
 	struct phy_provider *phy_provider;
 	struct phy *phy;
 	struct resource *res;
+	void __iomem *regs;
 	int ret;
 
 	inno = devm_kzalloc(dev, sizeof(*inno), GFP_KERNEL);
@@ -779,6 +944,7 @@ static int inno_video_phy_probe(struct platform_device *pdev)
 		return -ENOMEM;
 
 	inno->dev = dev;
+	inno->pdata = of_device_get_match_data(inno->dev);
 	platform_set_drvdata(pdev, inno);
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -787,9 +953,17 @@ static int inno_video_phy_probe(struct platform_device *pdev)
 		return -EINVAL;
 	}
 
-	inno->phy_base = devm_ioremap(dev, res->start, resource_size(res));
-	if (!inno->phy_base)
-		return -ENOMEM;
+	regs = devm_ioremap_resource(dev, res);
+	if (IS_ERR(regs))
+		return PTR_ERR(regs);
+
+	inno->regmap = devm_regmap_init_mmio(dev, regs,
+					     &inno_video_phy_regmap_config);
+	if (IS_ERR(inno->regmap)) {
+		ret = PTR_ERR(inno->regmap);
+		dev_err(dev, "failed to init regmap: %d\n", ret);
+		return ret;
+	}
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
 	if (!res) {
@@ -836,6 +1010,9 @@ static int inno_video_phy_probe(struct platform_device *pdev)
 		return ret;
 	}
 
+	if (of_property_read_u32(dev->of_node, "inno,lanes", &inno->lanes))
+		inno->lanes = 4;
+
 	phy_set_drvdata(phy, inno);
 
 	phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
@@ -864,11 +1041,32 @@ static int inno_video_phy_remove(struct platform_device *pdev)
 	return 0;
 }
 
+static const struct inno_video_phy_plat_data phy_max_1GHz_plat_data = {
+	.inno_mipi_dphy_timing_table = inno_mipi_dphy_timing_table_max_1GHz,
+	.num_timings = ARRAY_SIZE(inno_mipi_dphy_timing_table_max_1GHz),
+	.max_rate = MAX_1GHZ,
+};
+
+static const struct inno_video_phy_plat_data phy_max_2_5GHz_plat_data = {
+	.inno_mipi_dphy_timing_table = inno_mipi_dphy_timing_table_max_2_5GHz,
+	.num_timings = ARRAY_SIZE(inno_mipi_dphy_timing_table_max_2_5GHz),
+	.max_rate = MAX_2_5GHZ,
+};
+
 static const struct of_device_id inno_video_phy_of_match[] = {
-	{ .compatible = "rockchip,px30-video-phy", },
-	{ .compatible = "rockchip,rk3128-video-phy", },
-	{ .compatible = "rockchip,rk3368-video-phy", },
-	{ .compatible = "rockchip,rk3568-video-phy", },
+	{
+		.compatible = "rockchip,px30-video-phy",
+		.data = &phy_max_1GHz_plat_data,
+	}, {
+		.compatible = "rockchip,rk3128-video-phy",
+		.data = &phy_max_1GHz_plat_data,
+	}, {
+		.compatible = "rockchip,rk3368-video-phy",
+		.data = &phy_max_1GHz_plat_data,
+	}, {
+		.compatible = "rockchip,rk3568-video-phy",
+		.data = &phy_max_2_5GHz_plat_data,
+	},
 	{}
 };
 MODULE_DEVICE_TABLE(of, inno_video_phy_of_match);

commit e728bb617c5eed63598d19027b9fe2e626b9ce12
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Thu Jul 1 10:30:05 2021 +0800

    drm/rockchip: driver: fix sub_dev pointer error
    
    the sub_dev will be update by list_for_each_entry() and return !NULL
    error pointer when no found subdev;
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: I8d7db3b66c6c57b986a42cac9ed6eca53b72611e

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index 1fe7a980b0d7..ebbfb9e26d9a 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -116,15 +116,18 @@ EXPORT_SYMBOL(rockchip_drm_unregister_sub_dev);
 struct rockchip_drm_sub_dev *rockchip_drm_get_sub_dev(struct device_node *node)
 {
 	struct rockchip_drm_sub_dev *sub_dev = NULL;
+	bool found = false;
 
 	mutex_lock(&rockchip_drm_sub_dev_lock);
 	list_for_each_entry(sub_dev, &rockchip_drm_sub_dev_list, list) {
-		if (sub_dev->of_node == node)
+		if (sub_dev->of_node == node) {
+			found = true;
 			break;
+		}
 	}
 	mutex_unlock(&rockchip_drm_sub_dev_lock);
 
-	return sub_dev;
+	return found ? sub_dev : NULL;
 }
 EXPORT_SYMBOL(rockchip_drm_get_sub_dev);
 

commit d8a6016ef33e7b9c3c84b82f9d0cdc8c97fccde7
Author: Wyon Bi <bivvy.bi@rock-chips.com>
Date:   Thu Jul 1 09:15:43 2021 +0800

    drm/rockchip: analogix_dp: Add support for external bridge
    
    The current output code only supports connection to drm panels.
    Add code to support drm bridge, to support connections to
    external connectors.
    
    Change-Id: I775244b7183692f07b74123fa43c8bb958525087
    Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
index 19f0c41b8511..9c4223029675 100644
--- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
+++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
@@ -72,6 +72,7 @@ struct rockchip_dp_device {
 	struct drm_device        *drm_dev;
 	struct device            *dev;
 	struct drm_encoder       encoder;
+	struct drm_bridge	 *bridge;
 	struct drm_display_mode  mode;
 
 	int			 num_clks;
@@ -233,6 +234,24 @@ static int rockchip_dp_get_modes(struct analogix_dp_plat_data *plat_data,
 	return 0;
 }
 
+static int rockchip_dp_bridge_attach(struct analogix_dp_plat_data *plat_data,
+				     struct drm_bridge *bridge,
+				     struct drm_connector *connector)
+{
+	struct rockchip_dp_device *dp = to_dp(plat_data);
+	int ret;
+
+	if (dp->bridge) {
+		ret = drm_bridge_attach(&dp->encoder, dp->bridge, bridge);
+		if (ret) {
+			DRM_ERROR("Failed to attach bridge to drm: %d\n", ret);
+			return ret;
+		}
+	}
+
+	return 0;
+}
+
 static bool
 rockchip_dp_drm_encoder_mode_fixup(struct drm_encoder *encoder,
 				   const struct drm_display_mode *mode,
@@ -495,6 +514,7 @@ static int rockchip_dp_bind(struct device *dev, struct device *master,
 	dp->plat_data.power_on_end = rockchip_dp_poweron_end;
 	dp->plat_data.power_off = rockchip_dp_powerdown;
 	dp->plat_data.get_modes = rockchip_dp_get_modes;
+	dp->plat_data.attach = rockchip_dp_bridge_attach;
 	dp->plat_data.property_ops = &rockchip_dp_encoder_property_ops;
 
 	ret = rockchip_drm_psr_register(&dp->encoder, analogix_dp_psr_set);
@@ -562,10 +582,11 @@ static int rockchip_dp_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
 	struct drm_panel *panel = NULL;
+	struct drm_bridge *bridge = NULL;
 	struct rockchip_dp_device *dp;
 	int ret, id;
 
-	ret = drm_of_find_panel_or_bridge(dev->of_node, 1, 0, &panel, NULL);
+	ret = drm_of_find_panel_or_bridge(dev->of_node, 1, 0, &panel, &bridge);
 	if (ret < 0 && ret != -ENODEV)
 		return ret;
 
@@ -580,6 +601,8 @@ static int rockchip_dp_probe(struct platform_device *pdev)
 	dp->dev = dev;
 	dp->adp = ERR_PTR(-ENODEV);
 	dp->plat_data.panel = panel;
+	dp->plat_data.skip_connector = !!bridge;
+	dp->bridge = bridge;
 
 	ret = rockchip_dp_of_probe(dp);
 	if (ret < 0)

commit 2215bae0d4a2436404f222b4df5aaaeeb837e1bc
Merge: 6440e5a3fb41 9f84340f012e
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Wed Jun 30 19:17:14 2021 +0200

    Merge 4.19.196 into android-4.19-stable
    
    Changes in 4.19.196
            net: ieee802154: fix null deref in parse dev addr
            HID: quirks: Set INCREMENT_USAGE_ON_DUPLICATE for Saitek X65
            HID: hid-sensor-hub: Return error for hid_set_field() failure
            HID: Add BUS_VIRTUAL to hid_connect logging
            HID: usbhid: fix info leak in hid_submit_ctrl
            ARM: OMAP2+: Fix build warning when mmc_omap is not built
            gfs2: Prevent direct-I/O write fallback errors from getting lost
            HID: gt683r: add missing MODULE_DEVICE_TABLE
            gfs2: Fix use-after-free in gfs2_glock_shrink_scan
            scsi: target: core: Fix warning on realtime kernels
            ethernet: myri10ge: Fix missing error code in myri10ge_probe()
            scsi: scsi_devinfo: Add blacklist entry for HPE OPEN-V
            nvme-loop: reset queue count to 1 in nvme_loop_destroy_io_queues()
            nvme-loop: clear NVME_LOOP_Q_LIVE when nvme_loop_configure_admin_queue() fails
            nvme-loop: check for NVME_LOOP_Q_LIVE in nvme_loop_destroy_admin_queue()
            net: ipconfig: Don't override command-line hostnames or domains
            rtnetlink: Fix missing error code in rtnl_bridge_notify()
            net/x25: Return the correct errno code
            net: Return the correct errno code
            fib: Return the correct errno code
            dmaengine: ALTERA_MSGDMA depends on HAS_IOMEM
            dmaengine: QCOM_HIDMA_MGMT depends on HAS_IOMEM
            dmaengine: stedma40: add missing iounmap() on error in d40_probe()
            afs: Fix an IS_ERR() vs NULL check
            mm/memory-failure: make sure wait for page writeback in memory_failure
            batman-adv: Avoid WARN_ON timing related checks
            net: ipv4: fix memory leak in netlbl_cipsov4_add_std
            net: rds: fix memory leak in rds_recvmsg
            udp: fix race between close() and udp_abort()
            rtnetlink: Fix regression in bridge VLAN configuration
            net/mlx5e: Remove dependency in IPsec initialization flows
            net/mlx5e: Block offload of outer header csum for UDP tunnels
            netfilter: synproxy: Fix out of bounds when parsing TCP options
            sch_cake: Fix out of bounds when parsing TCP options and header
            alx: Fix an error handling path in 'alx_probe()'
            net: stmmac: dwmac1000: Fix extended MAC address registers definition
            net: add documentation to socket.c
            net: make get_net_ns return error if NET_NS is disabled
            qlcnic: Fix an error handling path in 'qlcnic_probe()'
            netxen_nic: Fix an error handling path in 'netxen_nic_probe()'
            net: qrtr: fix OOB Read in qrtr_endpoint_post
            ptp: ptp_clock: Publish scaled_ppm_to_ppb
            ptp: improve max_adj check against unreasonable values
            net: cdc_ncm: switch to eth%d interface naming
            net: usb: fix possible use-after-free in smsc75xx_bind
            net: fec_ptp: fix issue caused by refactor the fec_devtype
            net: ipv4: fix memory leak in ip_mc_add1_src
            net/af_unix: fix a data-race in unix_dgram_sendmsg / unix_release_sock
            be2net: Fix an error handling path in 'be_probe()'
            net: hamradio: fix memory leak in mkiss_close
            net: cdc_eem: fix tx fixup skb leak
            icmp: don't send out ICMP messages with a source address of 0.0.0.0
            net: ethernet: fix potential use-after-free in ec_bhf_remove
            ASoC: rt5659: Fix the lost powers for the HDA header
            pinctrl: ralink: rt2880: avoid to error in calls is pin is already enabled
            radeon: use memcpy_to/fromio for UVD fw upload
            hwmon: (scpi-hwmon) shows the negative temperature properly
            can: bcm: fix infoleak in struct bcm_msg_head
            can: mcba_usb: fix memory leak in mcba_usb
            usb: core: hub: Disable autosuspend for Cypress CY7C65632
            tracing: Do not stop recording cmdlines when tracing is off
            tracing: Do not stop recording comms if the trace file is being read
            tracing: Do no increment trace_clock_global() by one
            PCI: Mark TI C667X to avoid bus reset
            PCI: Mark some NVIDIA GPUs to avoid bus reset
            PCI: Add ACS quirk for Broadcom BCM57414 NIC
            PCI: Work around Huawei Intelligent NIC VF FLR erratum
            ARCv2: save ABI registers across signal handling
            dmaengine: pl330: fix wrong usage of spinlock flags in dma_cyclc
            cfg80211: make certificate generation more robust
            net: bridge: fix vlan tunnel dst null pointer dereference
            net: bridge: fix vlan tunnel dst refcnt when egressing
            mm/slub: clarify verification reporting
            mm/slub.c: include swab.h
            net: fec_ptp: add clock rate zero check
            tools headers UAPI: Sync linux/in.h copy with the kernel sources
            KVM: arm/arm64: Fix KVM_VGIC_V3_ADDR_TYPE_REDIST read
            can: bcm/raw/isotp: use per module netdevice notifier
            inet: use bigger hash table for IP ID generation
            usb: dwc3: debugfs: Add and remove endpoint dirs dynamically
            usb: dwc3: core: fix kernel panic when do reboot
            x86/fpu: Reset state for all signal restore failures
            module: limit enabling module.sig_enforce
            drm/nouveau: wait for moving fence after pinning v2
            drm/radeon: wait for moving fence after pinning
            ARM: 9081/1: fix gcc-10 thumb2-kernel regression
            Makefile: Move -Wno-unused-but-set-variable out of GCC only block
            MIPS: generic: Update node names to avoid unit addresses
            Revert "PCI: PM: Do not read power state in pci_enable_device_flags()"
            mac80211: remove warning in ieee80211_get_sband()
            cfg80211: call cfg80211_leave_ocb when switching away from OCB
            mac80211: drop multicast fragments
            net: ethtool: clear heap allocations for ethtool function
            ping: Check return value of function 'ping_queue_rcv_skb'
            inet: annotate date races around sk->sk_txhash
            net: caif: fix memory leak in ldisc_open
            net/packet: annotate accesses to po->bind
            net/packet: annotate accesses to po->ifindex
            r8152: Avoid memcpy() over-reading of ETH_SS_STATS
            sh_eth: Avoid memcpy() over-reading of ETH_SS_STATS
            r8169: Avoid memcpy() over-reading of ETH_SS_STATS
            KVM: selftests: Fix kvm_check_cap() assertion
            net: qed: Fix memcpy() overflow of qed_dcbx_params()
            PCI: Add AMD RS690 quirk to enable 64-bit DMA
            net: ll_temac: Avoid ndo_start_xmit returning NETDEV_TX_BUSY
            pinctrl: stm32: fix the reported number of GPIO lines per bank
            nilfs2: fix memory leak in nilfs_sysfs_delete_device_group
            i2c: robotfuzz-osif: fix control-request directions
            Linux 4.19.196
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I50d641505bc18d2dc4b4131643de3bfd8e8a8e6e

commit 9f84340f012ee60c12aacc03662bcdd67419a31a
Author: Sasha Levin <sashal@kernel.org>
Date:   Wed Jun 30 09:18:40 2021 -0400

    Linux 4.19.196
    
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Tested-by: Hulk Robot <hulkrobot@huawei.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/Makefile b/Makefile
index cda7a18b925a..63b0bc92a0fa 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 195
+SUBLEVEL = 196
 EXTRAVERSION =
 NAME = "People's Front"
 

commit f376dd8a409fe4cca5b121cd7c42b894689aada6
Author: Johan Hovold <johan@kernel.org>
Date:   Mon May 24 11:09:12 2021 +0200

    i2c: robotfuzz-osif: fix control-request directions
    
    commit 4ca070ef0dd885616ef294d269a9bf8e3b258e1a upstream.
    
    The direction of the pipe argument must match the request-type direction
    bit or control requests may fail depending on the host-controller-driver
    implementation.
    
    Control transfers without a data stage are treated as OUT requests by
    the USB stack and should be using usb_sndctrlpipe(). Failing to do so
    will now trigger a warning.
    
    Fix the OSIFI2C_SET_BIT_RATE and OSIFI2C_STOP requests which erroneously
    used the osif_usb_read() helper and set the IN direction bit.
    
    Reported-by: syzbot+9d7dadd15b8819d73f41@syzkaller.appspotmail.com
    Fixes: 83e53a8f120f ("i2c: Add bus driver for for OSIF USB i2c device.")
    Cc: stable@vger.kernel.org      # 3.14
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/i2c/busses/i2c-robotfuzz-osif.c b/drivers/i2c/busses/i2c-robotfuzz-osif.c
index d848cf515234..3fe21397a4f6 100644
--- a/drivers/i2c/busses/i2c-robotfuzz-osif.c
+++ b/drivers/i2c/busses/i2c-robotfuzz-osif.c
@@ -86,7 +86,7 @@ static int osif_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs,
 			}
 		}
 
-		ret = osif_usb_read(adapter, OSIFI2C_STOP, 0, 0, NULL, 0);
+		ret = osif_usb_write(adapter, OSIFI2C_STOP, 0, 0, NULL, 0);
 		if (ret) {
 			dev_err(&adapter->dev, "failure sending STOP\n");
 			return -EREMOTEIO;
@@ -156,7 +156,7 @@ static int osif_probe(struct usb_interface *interface,
 	 * Set bus frequency. The frequency is:
 	 * 120,000,000 / ( 16 + 2 * div * 4^prescale).
 	 * Using dev = 52, prescale = 0 give 100KHz */
-	ret = osif_usb_read(&priv->adapter, OSIFI2C_SET_BIT_RATE, 52, 0,
+	ret = osif_usb_write(&priv->adapter, OSIFI2C_SET_BIT_RATE, 52, 0,
 			    NULL, 0);
 	if (ret) {
 		dev_err(&interface->dev, "failure sending bit rate");

commit 9436cdffaf5bc83f41e72dfbd4d9ec885ff7b4f2
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Thu Jun 24 18:39:33 2021 -0700

    nilfs2: fix memory leak in nilfs_sysfs_delete_device_group
    
    [ Upstream commit 8fd0c1b0647a6bda4067ee0cd61e8395954b6f28 ]
    
    My local syzbot instance hit memory leak in nilfs2.  The problem was in
    missing kobject_put() in nilfs_sysfs_delete_device_group().
    
    kobject_del() does not call kobject_cleanup() for passed kobject and it
    leads to leaking duped kobject name if kobject_put() was not called.
    
    Fail log:
    
      BUG: memory leak
      unreferenced object 0xffff8880596171e0 (size 8):
      comm "syz-executor379", pid 8381, jiffies 4294980258 (age 21.100s)
      hex dump (first 8 bytes):
        6c 6f 6f 70 30 00 00 00                          loop0...
      backtrace:
         kstrdup+0x36/0x70 mm/util.c:60
         kstrdup_const+0x53/0x80 mm/util.c:83
         kvasprintf_const+0x108/0x190 lib/kasprintf.c:48
         kobject_set_name_vargs+0x56/0x150 lib/kobject.c:289
         kobject_add_varg lib/kobject.c:384 [inline]
         kobject_init_and_add+0xc9/0x160 lib/kobject.c:473
         nilfs_sysfs_create_device_group+0x150/0x800 fs/nilfs2/sysfs.c:999
         init_nilfs+0xe26/0x12b0 fs/nilfs2/the_nilfs.c:637
    
    Link: https://lkml.kernel.org/r/20210612140559.20022-1-paskripkin@gmail.com
    Fixes: da7141fb78db ("nilfs2: add /sys/fs/nilfs2/<device> group")
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Acked-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
    Cc: Michael L. Semon <mlsemon35@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/nilfs2/sysfs.c b/fs/nilfs2/sysfs.c
index e60be7bb55b0..c6c8a33c81d5 100644
--- a/fs/nilfs2/sysfs.c
+++ b/fs/nilfs2/sysfs.c
@@ -1054,6 +1054,7 @@ void nilfs_sysfs_delete_device_group(struct the_nilfs *nilfs)
 	nilfs_sysfs_delete_superblock_group(nilfs);
 	nilfs_sysfs_delete_segctor_group(nilfs);
 	kobject_del(&nilfs->ns_dev_kobj);
+	kobject_put(&nilfs->ns_dev_kobj);
 	kfree(nilfs->ns_dev_subgroups);
 }
 

commit fde184840c38e235620931895c8d121fa37bb4f8
Author: Fabien Dessenne <fabien.dessenne@foss.st.com>
Date:   Thu Jun 17 16:46:29 2021 +0200

    pinctrl: stm32: fix the reported number of GPIO lines per bank
    
    [ Upstream commit 67e2996f72c71ebe4ac2fcbcf77e54479bb7aa11 ]
    
    Each GPIO bank supports a variable number of lines which is usually 16, but
    is less in some cases : this is specified by the last argument of the
    "gpio-ranges" bank node property.
    Report to the framework, the actual number of lines, so the libgpiod
    gpioinfo command lists the actually existing GPIO lines.
    
    Fixes: 1dc9d289154b ("pinctrl: stm32: add possibility to use gpio-ranges to declare bank range")
    Signed-off-by: Fabien Dessenne <fabien.dessenne@foss.st.com>
    Link: https://lore.kernel.org/r/20210617144629.2557693-1-fabien.dessenne@foss.st.com
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pinctrl/stm32/pinctrl-stm32.c b/drivers/pinctrl/stm32/pinctrl-stm32.c
index 14dfbbd6c1c3..4e17728f2937 100644
--- a/drivers/pinctrl/stm32/pinctrl-stm32.c
+++ b/drivers/pinctrl/stm32/pinctrl-stm32.c
@@ -978,7 +978,7 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl,
 	struct resource res;
 	struct reset_control *rstc;
 	int npins = STM32_GPIO_PINS_PER_BANK;
-	int bank_nr, err;
+	int bank_nr, err, i = 0;
 
 	rstc = of_reset_control_get_exclusive(np, NULL);
 	if (!IS_ERR(rstc))
@@ -1007,9 +1007,14 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl,
 
 	of_property_read_string(np, "st,bank-name", &bank->gpio_chip.label);
 
-	if (!of_parse_phandle_with_fixed_args(np, "gpio-ranges", 3, 0, &args)) {
+	if (!of_parse_phandle_with_fixed_args(np, "gpio-ranges", 3, i, &args)) {
 		bank_nr = args.args[1] / STM32_GPIO_PINS_PER_BANK;
 		bank->gpio_chip.base = args.args[1];
+
+		npins = args.args[2];
+		while (!of_parse_phandle_with_fixed_args(np, "gpio-ranges", 3,
+							 ++i, &args))
+			npins += args.args[2];
 	} else {
 		bank_nr = pctl->nbanks;
 		bank->gpio_chip.base = bank_nr * STM32_GPIO_PINS_PER_BANK;

commit a5ccdf780c934efd5fbc41a717a998362d76c004
Author: Esben Haabendal <esben@geanix.com>
Date:   Fri Jun 18 12:52:38 2021 +0200

    net: ll_temac: Avoid ndo_start_xmit returning NETDEV_TX_BUSY
    
    [ Upstream commit f6396341194234e9b01cd7538bc2c6ac4501ab14 ]
    
    As documented in Documentation/networking/driver.rst, the ndo_start_xmit
    method must not return NETDEV_TX_BUSY under any normal circumstances, and
    as recommended, we simply stop the tx queue in advance, when there is a
    risk that the next xmit would cause a NETDEV_TX_BUSY return.
    
    Signed-off-by: Esben Haabendal <esben@geanix.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/xilinx/ll_temac_main.c b/drivers/net/ethernet/xilinx/ll_temac_main.c
index 2241f9897092..939de185bc6b 100644
--- a/drivers/net/ethernet/xilinx/ll_temac_main.c
+++ b/drivers/net/ethernet/xilinx/ll_temac_main.c
@@ -736,6 +736,11 @@ temac_start_xmit(struct sk_buff *skb, struct net_device *ndev)
 	/* Kick off the transfer */
 	lp->dma_out(lp, TX_TAILDESC_PTR, tail_p); /* DMA start */
 
+	if (temac_check_tx_bd_space(lp, MAX_SKB_FRAGS + 1)) {
+		netdev_info(ndev, "%s -> netif_stop_queue\n", __func__);
+		netif_stop_queue(ndev);
+	}
+
 	return NETDEV_TX_OK;
 }
 

commit 987c6da9b2f4ba5a74545477c740178e06c2da45
Author: Mikel Rychliski <mikel@mikelr.com>
Date:   Fri Jun 11 17:48:23 2021 -0400

    PCI: Add AMD RS690 quirk to enable 64-bit DMA
    
    [ Upstream commit cacf994a91d3a55c0c2f853d6429cd7b86113915 ]
    
    Although the AMD RS690 chipset has 64-bit DMA support, BIOS implementations
    sometimes fail to configure the memory limit registers correctly.
    
    The Acer F690GVM mainboard uses this chipset and a Marvell 88E8056 NIC. The
    sky2 driver programs the NIC to use 64-bit DMA, which will not work:
    
      sky2 0000:02:00.0: error interrupt status=0x8
      sky2 0000:02:00.0 eth0: tx timeout
      sky2 0000:02:00.0 eth0: transmit ring 0 .. 22 report=0 done=0
    
    Other drivers required by this mainboard either don't support 64-bit DMA,
    or have it disabled using driver specific quirks. For example, the ahci
    driver has quirks to enable or disable 64-bit DMA depending on the BIOS
    version (see ahci_sb600_enable_64bit() in ahci.c). This ahci quirk matches
    against the SB600 SATA controller, but the real issue is almost certainly
    with the RS690 PCI host that it was commonly attached to.
    
    To avoid this issue in all drivers with 64-bit DMA support, fix the
    configuration of the PCI host. If the kernel is aware of physical memory
    above 4GB, but the BIOS never configured the PCI host with this
    information, update the registers with our values.
    
    [bhelgaas: drop PCI_DEVICE_ID_ATI_RS690 definition]
    Link: https://lore.kernel.org/r/20210611214823.4898-1-mikel@mikelr.com
    Signed-off-by: Mikel Rychliski <mikel@mikelr.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c
index 0c67a5a94de3..76959a7d88c8 100644
--- a/arch/x86/pci/fixup.c
+++ b/arch/x86/pci/fixup.c
@@ -779,4 +779,48 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AMD, 0x1571, pci_amd_enable_64bit_bar);
 DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AMD, 0x15b1, pci_amd_enable_64bit_bar);
 DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AMD, 0x1601, pci_amd_enable_64bit_bar);
 
+#define RS690_LOWER_TOP_OF_DRAM2	0x30
+#define RS690_LOWER_TOP_OF_DRAM2_VALID	0x1
+#define RS690_UPPER_TOP_OF_DRAM2	0x31
+#define RS690_HTIU_NB_INDEX		0xA8
+#define RS690_HTIU_NB_INDEX_WR_ENABLE	0x100
+#define RS690_HTIU_NB_DATA		0xAC
+
+/*
+ * Some BIOS implementations support RAM above 4GB, but do not configure the
+ * PCI host to respond to bus master accesses for these addresses. These
+ * implementations set the TOP_OF_DRAM_SLOT1 register correctly, so PCI DMA
+ * works as expected for addresses below 4GB.
+ *
+ * Reference: "AMD RS690 ASIC Family Register Reference Guide" (pg. 2-57)
+ * https://www.amd.com/system/files/TechDocs/43372_rs690_rrg_3.00o.pdf
+ */
+static void rs690_fix_64bit_dma(struct pci_dev *pdev)
+{
+	u32 val = 0;
+	phys_addr_t top_of_dram = __pa(high_memory - 1) + 1;
+
+	if (top_of_dram <= (1ULL << 32))
+		return;
+
+	pci_write_config_dword(pdev, RS690_HTIU_NB_INDEX,
+				RS690_LOWER_TOP_OF_DRAM2);
+	pci_read_config_dword(pdev, RS690_HTIU_NB_DATA, &val);
+
+	if (val)
+		return;
+
+	pci_info(pdev, "Adjusting top of DRAM to %pa for 64-bit DMA support\n", &top_of_dram);
+
+	pci_write_config_dword(pdev, RS690_HTIU_NB_INDEX,
+		RS690_UPPER_TOP_OF_DRAM2 | RS690_HTIU_NB_INDEX_WR_ENABLE);
+	pci_write_config_dword(pdev, RS690_HTIU_NB_DATA, top_of_dram >> 32);
+
+	pci_write_config_dword(pdev, RS690_HTIU_NB_INDEX,
+		RS690_LOWER_TOP_OF_DRAM2 | RS690_HTIU_NB_INDEX_WR_ENABLE);
+	pci_write_config_dword(pdev, RS690_HTIU_NB_DATA,
+		top_of_dram | RS690_LOWER_TOP_OF_DRAM2_VALID);
+}
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x7910, rs690_fix_64bit_dma);
+
 #endif

commit 144ca5c30c7a97d0c37c404c157db1b1358e2fcf
Author: Kees Cook <keescook@chromium.org>
Date:   Thu Jun 17 10:09:53 2021 -0700

    net: qed: Fix memcpy() overflow of qed_dcbx_params()
    
    [ Upstream commit 1c200f832e14420fa770193f9871f4ce2df00d07 ]
    
    The source (&dcbx_info->operational.params) and dest
    (&p_hwfn->p_dcbx_info->set.config.params) are both struct qed_dcbx_params
    (560 bytes), not struct qed_dcbx_admin_params (564 bytes), which is used
    as the memcpy() size.
    
    However it seems that struct qed_dcbx_operational_params
    (dcbx_info->operational)'s layout matches struct qed_dcbx_admin_params
    (p_hwfn->p_dcbx_info->set.config)'s 4 byte difference (3 padding, 1 byte
    for "valid").
    
    On the assumption that the size is wrong (rather than the source structure
    type), adjust the memcpy() size argument to be 4 bytes smaller and add
    a BUILD_BUG_ON() to validate any changes to the structure sizes.
    
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/qlogic/qed/qed_dcbx.c b/drivers/net/ethernet/qlogic/qed/qed_dcbx.c
index 5900a506bf8d..ff8a7750d3c0 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_dcbx.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_dcbx.c
@@ -1294,9 +1294,11 @@ int qed_dcbx_get_config_params(struct qed_hwfn *p_hwfn,
 		p_hwfn->p_dcbx_info->set.ver_num |= DCBX_CONFIG_VERSION_STATIC;
 
 	p_hwfn->p_dcbx_info->set.enabled = dcbx_info->operational.enabled;
+	BUILD_BUG_ON(sizeof(dcbx_info->operational.params) !=
+		     sizeof(p_hwfn->p_dcbx_info->set.config.params));
 	memcpy(&p_hwfn->p_dcbx_info->set.config.params,
 	       &dcbx_info->operational.params,
-	       sizeof(struct qed_dcbx_admin_params));
+	       sizeof(p_hwfn->p_dcbx_info->set.config.params));
 	p_hwfn->p_dcbx_info->set.config.valid = true;
 
 	memcpy(params, &p_hwfn->p_dcbx_info->set, sizeof(struct qed_dcbx_set));

commit df084ef4de987d870eb958ce2e1ae97f6251109a
Author: Fuad Tabba <tabba@google.com>
Date:   Tue Jun 15 16:04:43 2021 +0100

    KVM: selftests: Fix kvm_check_cap() assertion
    
    [ Upstream commit d8ac05ea13d789d5491a5920d70a05659015441d ]
    
    KVM_CHECK_EXTENSION ioctl can return any negative value on error,
    and not necessarily -1. Change the assertion to reflect that.
    
    Signed-off-by: Fuad Tabba <tabba@google.com>
    Message-Id: <20210615150443.1183365-1-tabba@google.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index fb5d2d1e0c04..b138fd5e4620 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -55,7 +55,7 @@ int kvm_check_cap(long cap)
 		exit(KSFT_SKIP);
 
 	ret = ioctl(kvm_fd, KVM_CHECK_EXTENSION, cap);
-	TEST_ASSERT(ret != -1, "KVM_CHECK_EXTENSION IOCTL failed,\n"
+	TEST_ASSERT(ret >= 0, "KVM_CHECK_EXTENSION IOCTL failed,\n"
 		"  rc: %i errno: %i", ret, errno);
 
 	close(kvm_fd);

commit e4e42da589e76ca071366fce0f30b87d4ba6d02e
Author: Kees Cook <keescook@chromium.org>
Date:   Wed Jun 16 12:53:59 2021 -0700

    r8169: Avoid memcpy() over-reading of ETH_SS_STATS
    
    [ Upstream commit da5ac772cfe2a03058b0accfac03fad60c46c24d ]
    
    In preparation for FORTIFY_SOURCE performing compile-time and run-time
    field bounds checking for memcpy(), memmove(), and memset(), avoid
    intentionally reading across neighboring array fields.
    
    The memcpy() is copying the entire structure, not just the first array.
    Adjust the source argument so the compiler can do appropriate bounds
    checking.
    
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
index 0c9e6cb0e341..523626f2ffbe 100644
--- a/drivers/net/ethernet/realtek/r8169.c
+++ b/drivers/net/ethernet/realtek/r8169.c
@@ -1823,7 +1823,7 @@ static void rtl8169_get_strings(struct net_device *dev, u32 stringset, u8 *data)
 {
 	switch(stringset) {
 	case ETH_SS_STATS:
-		memcpy(data, *rtl8169_gstrings, sizeof(rtl8169_gstrings));
+		memcpy(data, rtl8169_gstrings, sizeof(rtl8169_gstrings));
 		break;
 	}
 }

commit 7cb59801bd8edd96b6e4e563ccb968e6ba002b57
Author: Kees Cook <keescook@chromium.org>
Date:   Wed Jun 16 12:53:33 2021 -0700

    sh_eth: Avoid memcpy() over-reading of ETH_SS_STATS
    
    [ Upstream commit 224004fbb033600715dbd626bceec10bfd9c58bc ]
    
    In preparation for FORTIFY_SOURCE performing compile-time and run-time
    field bounds checking for memcpy(), memmove(), and memset(), avoid
    intentionally reading across neighboring array fields.
    
    The memcpy() is copying the entire structure, not just the first array.
    Adjust the source argument so the compiler can do appropriate bounds
    checking.
    
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c
index 24638cb157ca..394ab9cdfe2c 100644
--- a/drivers/net/ethernet/renesas/sh_eth.c
+++ b/drivers/net/ethernet/renesas/sh_eth.c
@@ -2302,7 +2302,7 @@ static void sh_eth_get_strings(struct net_device *ndev, u32 stringset, u8 *data)
 {
 	switch (stringset) {
 	case ETH_SS_STATS:
-		memcpy(data, *sh_eth_gstrings_stats,
+		memcpy(data, sh_eth_gstrings_stats,
 		       sizeof(sh_eth_gstrings_stats));
 		break;
 	}

commit ea9b445a5c8c377156c747132e61367977bb6dbe
Author: Kees Cook <keescook@chromium.org>
Date:   Wed Jun 16 12:53:03 2021 -0700

    r8152: Avoid memcpy() over-reading of ETH_SS_STATS
    
    [ Upstream commit 99718abdc00e86e4f286dd836408e2834886c16e ]
    
    In preparation for FORTIFY_SOURCE performing compile-time and run-time
    field bounds checking for memcpy(), memmove(), and memset(), avoid
    intentionally reading across neighboring array fields.
    
    The memcpy() is copying the entire structure, not just the first array.
    Adjust the source argument so the compiler can do appropriate bounds
    checking.
    
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index a27ea04cfa6c..726fb5561a0f 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -4649,7 +4649,7 @@ static void rtl8152_get_strings(struct net_device *dev, u32 stringset, u8 *data)
 {
 	switch (stringset) {
 	case ETH_SS_STATS:
-		memcpy(data, *rtl8152_gstrings, sizeof(rtl8152_gstrings));
+		memcpy(data, rtl8152_gstrings, sizeof(rtl8152_gstrings));
 		break;
 	}
 }

commit 47ee8bbf6c12a98dcb24f9014d32b283ca22a664
Author: Eric Dumazet <edumazet@google.com>
Date:   Wed Jun 16 06:42:02 2021 -0700

    net/packet: annotate accesses to po->ifindex
    
    [ Upstream commit e032f7c9c7cefffcfb79b9fc16c53011d2d9d11f ]
    
    Like prior patch, we need to annotate lockless accesses to po->ifindex
    For instance, packet_getname() is reading po->ifindex (twice) while
    another thread is able to change po->ifindex.
    
    KCSAN reported:
    
    BUG: KCSAN: data-race in packet_do_bind / packet_getname
    
    write to 0xffff888143ce3cbc of 4 bytes by task 25573 on cpu 1:
     packet_do_bind+0x420/0x7e0 net/packet/af_packet.c:3191
     packet_bind+0xc3/0xd0 net/packet/af_packet.c:3255
     __sys_bind+0x200/0x290 net/socket.c:1637
     __do_sys_bind net/socket.c:1648 [inline]
     __se_sys_bind net/socket.c:1646 [inline]
     __x64_sys_bind+0x3d/0x50 net/socket.c:1646
     do_syscall_64+0x4a/0x90 arch/x86/entry/common.c:47
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    read to 0xffff888143ce3cbc of 4 bytes by task 25578 on cpu 0:
     packet_getname+0x5b/0x1a0 net/packet/af_packet.c:3525
     __sys_getsockname+0x10e/0x1a0 net/socket.c:1887
     __do_sys_getsockname net/socket.c:1902 [inline]
     __se_sys_getsockname net/socket.c:1899 [inline]
     __x64_sys_getsockname+0x3e/0x50 net/socket.c:1899
     do_syscall_64+0x4a/0x90 arch/x86/entry/common.c:47
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    value changed: 0x00000000 -> 0x00000001
    
    Reported by Kernel Concurrency Sanitizer on:
    CPU: 0 PID: 25578 Comm: syz-executor.5 Not tainted 5.13.0-rc6-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index 42299fa02038..8d9005019ef7 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -3157,11 +3157,11 @@ static int packet_do_bind(struct sock *sk, const char *name, int ifindex,
 		if (unlikely(unlisted)) {
 			dev_put(dev);
 			po->prot_hook.dev = NULL;
-			po->ifindex = -1;
+			WRITE_ONCE(po->ifindex, -1);
 			packet_cached_dev_reset(po);
 		} else {
 			po->prot_hook.dev = dev;
-			po->ifindex = dev ? dev->ifindex : 0;
+			WRITE_ONCE(po->ifindex, dev ? dev->ifindex : 0);
 			packet_cached_dev_assign(po, dev);
 		}
 	}
@@ -3476,7 +3476,7 @@ static int packet_getname_spkt(struct socket *sock, struct sockaddr *uaddr,
 	uaddr->sa_family = AF_PACKET;
 	memset(uaddr->sa_data, 0, sizeof(uaddr->sa_data));
 	rcu_read_lock();
-	dev = dev_get_by_index_rcu(sock_net(sk), pkt_sk(sk)->ifindex);
+	dev = dev_get_by_index_rcu(sock_net(sk), READ_ONCE(pkt_sk(sk)->ifindex));
 	if (dev)
 		strlcpy(uaddr->sa_data, dev->name, sizeof(uaddr->sa_data));
 	rcu_read_unlock();
@@ -3491,16 +3491,18 @@ static int packet_getname(struct socket *sock, struct sockaddr *uaddr,
 	struct sock *sk = sock->sk;
 	struct packet_sock *po = pkt_sk(sk);
 	DECLARE_SOCKADDR(struct sockaddr_ll *, sll, uaddr);
+	int ifindex;
 
 	if (peer)
 		return -EOPNOTSUPP;
 
+	ifindex = READ_ONCE(po->ifindex);
 	sll->sll_family = AF_PACKET;
-	sll->sll_ifindex = po->ifindex;
+	sll->sll_ifindex = ifindex;
 	sll->sll_protocol = READ_ONCE(po->num);
 	sll->sll_pkttype = 0;
 	rcu_read_lock();
-	dev = dev_get_by_index_rcu(sock_net(sk), po->ifindex);
+	dev = dev_get_by_index_rcu(sock_net(sk), ifindex);
 	if (dev) {
 		sll->sll_hatype = dev->type;
 		sll->sll_halen = dev->addr_len;
@@ -4079,7 +4081,7 @@ static int packet_notifier(struct notifier_block *this,
 				}
 				if (msg == NETDEV_UNREGISTER) {
 					packet_cached_dev_reset(po);
-					po->ifindex = -1;
+					WRITE_ONCE(po->ifindex, -1);
 					if (po->prot_hook.dev)
 						dev_put(po->prot_hook.dev);
 					po->prot_hook.dev = NULL;
@@ -4598,7 +4600,7 @@ static int packet_seq_show(struct seq_file *seq, void *v)
 			   refcount_read(&s->sk_refcnt),
 			   s->sk_type,
 			   ntohs(READ_ONCE(po->num)),
-			   po->ifindex,
+			   READ_ONCE(po->ifindex),
 			   po->running,
 			   atomic_read(&s->sk_rmem_alloc),
 			   from_kuid_munged(seq_user_ns(seq), sock_i_uid(s)),

commit 5079679471fb8535637e6c86609488eff1aac35e
Author: Eric Dumazet <edumazet@google.com>
Date:   Wed Jun 16 06:42:01 2021 -0700

    net/packet: annotate accesses to po->bind
    
    [ Upstream commit c7d2ef5dd4b03ed0ee1d13bc0c55f9cf62d49bd6 ]
    
    tpacket_snd(), packet_snd(), packet_getname() and packet_seq_show()
    can read po->num without holding a lock. This means other threads
    can change po->num at the same time.
    
    KCSAN complained about this known fact [1]
    Add READ_ONCE()/WRITE_ONCE() to address the issue.
    
    [1] BUG: KCSAN: data-race in packet_do_bind / packet_sendmsg
    
    write to 0xffff888131a0dcc0 of 2 bytes by task 24714 on cpu 0:
     packet_do_bind+0x3ab/0x7e0 net/packet/af_packet.c:3181
     packet_bind+0xc3/0xd0 net/packet/af_packet.c:3255
     __sys_bind+0x200/0x290 net/socket.c:1637
     __do_sys_bind net/socket.c:1648 [inline]
     __se_sys_bind net/socket.c:1646 [inline]
     __x64_sys_bind+0x3d/0x50 net/socket.c:1646
     do_syscall_64+0x4a/0x90 arch/x86/entry/common.c:47
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    read to 0xffff888131a0dcc0 of 2 bytes by task 24719 on cpu 1:
     packet_snd net/packet/af_packet.c:2899 [inline]
     packet_sendmsg+0x317/0x3570 net/packet/af_packet.c:3040
     sock_sendmsg_nosec net/socket.c:654 [inline]
     sock_sendmsg net/socket.c:674 [inline]
     ____sys_sendmsg+0x360/0x4d0 net/socket.c:2350
     ___sys_sendmsg net/socket.c:2404 [inline]
     __sys_sendmsg+0x1ed/0x270 net/socket.c:2433
     __do_sys_sendmsg net/socket.c:2442 [inline]
     __se_sys_sendmsg net/socket.c:2440 [inline]
     __x64_sys_sendmsg+0x42/0x50 net/socket.c:2440
     do_syscall_64+0x4a/0x90 arch/x86/entry/common.c:47
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    value changed: 0x0000 -> 0x1200
    
    Reported by Kernel Concurrency Sanitizer on:
    CPU: 1 PID: 24719 Comm: syz-executor.5 Not tainted 5.13.0-rc4-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index 16b745d254fe..42299fa02038 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -2656,7 +2656,7 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
 	}
 	if (likely(saddr == NULL)) {
 		dev	= packet_cached_dev_get(po);
-		proto	= po->num;
+		proto	= READ_ONCE(po->num);
 	} else {
 		err = -EINVAL;
 		if (msg->msg_namelen < sizeof(struct sockaddr_ll))
@@ -2869,7 +2869,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
 
 	if (likely(saddr == NULL)) {
 		dev	= packet_cached_dev_get(po);
-		proto	= po->num;
+		proto	= READ_ONCE(po->num);
 	} else {
 		err = -EINVAL;
 		if (msg->msg_namelen < sizeof(struct sockaddr_ll))
@@ -3141,7 +3141,7 @@ static int packet_do_bind(struct sock *sk, const char *name, int ifindex,
 			/* prevents packet_notifier() from calling
 			 * register_prot_hook()
 			 */
-			po->num = 0;
+			WRITE_ONCE(po->num, 0);
 			__unregister_prot_hook(sk, true);
 			rcu_read_lock();
 			dev_curr = po->prot_hook.dev;
@@ -3151,7 +3151,7 @@ static int packet_do_bind(struct sock *sk, const char *name, int ifindex,
 		}
 
 		BUG_ON(po->running);
-		po->num = proto;
+		WRITE_ONCE(po->num, proto);
 		po->prot_hook.type = proto;
 
 		if (unlikely(unlisted)) {
@@ -3497,7 +3497,7 @@ static int packet_getname(struct socket *sock, struct sockaddr *uaddr,
 
 	sll->sll_family = AF_PACKET;
 	sll->sll_ifindex = po->ifindex;
-	sll->sll_protocol = po->num;
+	sll->sll_protocol = READ_ONCE(po->num);
 	sll->sll_pkttype = 0;
 	rcu_read_lock();
 	dev = dev_get_by_index_rcu(sock_net(sk), po->ifindex);
@@ -4391,7 +4391,7 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u,
 	was_running = po->running;
 	num = po->num;
 	if (was_running) {
-		po->num = 0;
+		WRITE_ONCE(po->num, 0);
 		__unregister_prot_hook(sk, false);
 	}
 	spin_unlock(&po->bind_lock);
@@ -4426,7 +4426,7 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u,
 
 	spin_lock(&po->bind_lock);
 	if (was_running) {
-		po->num = num;
+		WRITE_ONCE(po->num, num);
 		register_prot_hook(sk);
 	}
 	spin_unlock(&po->bind_lock);
@@ -4597,7 +4597,7 @@ static int packet_seq_show(struct seq_file *seq, void *v)
 			   s,
 			   refcount_read(&s->sk_refcnt),
 			   s->sk_type,
-			   ntohs(po->num),
+			   ntohs(READ_ONCE(po->num)),
 			   po->ifindex,
 			   po->running,
 			   atomic_read(&s->sk_rmem_alloc),

commit 568ce04020f5fca707d67d36db2d551966212cfa
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Sat Jun 12 17:51:22 2021 +0300

    net: caif: fix memory leak in ldisc_open
    
    [ Upstream commit 58af3d3d54e87bfc1f936e16c04ade3369d34011 ]
    
    Syzbot reported memory leak in tty_init_dev().
    The problem was in unputted tty in ldisc_open()
    
    static int ldisc_open(struct tty_struct *tty)
    {
    ...
            ser->tty = tty_kref_get(tty);
    ...
            result = register_netdevice(dev);
            if (result) {
                    rtnl_unlock();
                    free_netdev(dev);
                    return -ENODEV;
            }
    ...
    }
    
    Ser pointer is netdev private_data, so after free_netdev()
    this pointer goes away with unputted tty reference. So, fix
    it by adding tty_kref_put() before freeing netdev.
    
    Reported-and-tested-by: syzbot+f303e045423e617d2cad@syzkaller.appspotmail.com
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/caif/caif_serial.c b/drivers/net/caif/caif_serial.c
index 94d5ce9419ca..81ec17b9c49c 100644
--- a/drivers/net/caif/caif_serial.c
+++ b/drivers/net/caif/caif_serial.c
@@ -360,6 +360,7 @@ static int ldisc_open(struct tty_struct *tty)
 	rtnl_lock();
 	result = register_netdevice(dev);
 	if (result) {
+		tty_kref_put(tty);
 		rtnl_unlock();
 		free_netdev(dev);
 		return -ENODEV;

commit a501d3006839162b34a64b7641027278c419235d
Author: Eric Dumazet <edumazet@google.com>
Date:   Thu Jun 10 07:44:11 2021 -0700

    inet: annotate date races around sk->sk_txhash
    
    [ Upstream commit b71eaed8c04f72a919a9c44e83e4ee254e69e7f3 ]
    
    UDP sendmsg() path can be lockless, it is possible for another
    thread to re-connect an change sk->sk_txhash under us.
    
    There is no serious impact, but we can use READ_ONCE()/WRITE_ONCE()
    pair to document the race.
    
    BUG: KCSAN: data-race in __ip4_datagram_connect / skb_set_owner_w
    
    write to 0xffff88813397920c of 4 bytes by task 30997 on cpu 1:
     sk_set_txhash include/net/sock.h:1937 [inline]
     __ip4_datagram_connect+0x69e/0x710 net/ipv4/datagram.c:75
     __ip6_datagram_connect+0x551/0x840 net/ipv6/datagram.c:189
     ip6_datagram_connect+0x2a/0x40 net/ipv6/datagram.c:272
     inet_dgram_connect+0xfd/0x180 net/ipv4/af_inet.c:580
     __sys_connect_file net/socket.c:1837 [inline]
     __sys_connect+0x245/0x280 net/socket.c:1854
     __do_sys_connect net/socket.c:1864 [inline]
     __se_sys_connect net/socket.c:1861 [inline]
     __x64_sys_connect+0x3d/0x50 net/socket.c:1861
     do_syscall_64+0x4a/0x90 arch/x86/entry/common.c:47
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    read to 0xffff88813397920c of 4 bytes by task 31039 on cpu 0:
     skb_set_hash_from_sk include/net/sock.h:2211 [inline]
     skb_set_owner_w+0x118/0x220 net/core/sock.c:2101
     sock_alloc_send_pskb+0x452/0x4e0 net/core/sock.c:2359
     sock_alloc_send_skb+0x2d/0x40 net/core/sock.c:2373
     __ip6_append_data+0x1743/0x21a0 net/ipv6/ip6_output.c:1621
     ip6_make_skb+0x258/0x420 net/ipv6/ip6_output.c:1983
     udpv6_sendmsg+0x160a/0x16b0 net/ipv6/udp.c:1527
     inet6_sendmsg+0x5f/0x80 net/ipv6/af_inet6.c:642
     sock_sendmsg_nosec net/socket.c:654 [inline]
     sock_sendmsg net/socket.c:674 [inline]
     ____sys_sendmsg+0x360/0x4d0 net/socket.c:2350
     ___sys_sendmsg net/socket.c:2404 [inline]
     __sys_sendmmsg+0x315/0x4b0 net/socket.c:2490
     __do_sys_sendmmsg net/socket.c:2519 [inline]
     __se_sys_sendmmsg net/socket.c:2516 [inline]
     __x64_sys_sendmmsg+0x53/0x60 net/socket.c:2516
     do_syscall_64+0x4a/0x90 arch/x86/entry/common.c:47
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    value changed: 0xbca3c43d -> 0xfdb309e0
    
    Reported by Kernel Concurrency Sanitizer on:
    CPU: 0 PID: 31039 Comm: syz-executor.2 Not tainted 5.13.0-rc3-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/net/sock.h b/include/net/sock.h
index bc752237dff3..351749c694ce 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -1832,7 +1832,8 @@ static inline u32 net_tx_rndhash(void)
 
 static inline void sk_set_txhash(struct sock *sk)
 {
-	sk->sk_txhash = net_tx_rndhash();
+	/* This pairs with READ_ONCE() in skb_set_hash_from_sk() */
+	WRITE_ONCE(sk->sk_txhash, net_tx_rndhash());
 }
 
 static inline void sk_rethink_txhash(struct sock *sk)
@@ -2103,9 +2104,12 @@ static inline void sock_poll_wait(struct file *filp, struct socket *sock,
 
 static inline void skb_set_hash_from_sk(struct sk_buff *skb, struct sock *sk)
 {
-	if (sk->sk_txhash) {
+	/* This pairs with WRITE_ONCE() in sk_set_txhash() */
+	u32 txhash = READ_ONCE(sk->sk_txhash);
+
+	if (txhash) {
 		skb->l4_hash = 1;
-		skb->hash = sk->sk_txhash;
+		skb->hash = txhash;
 	}
 }
 

commit 1d86498c252e6b680710a31c3a003491477dd50d
Author: Zheng Yongjun <zhengyongjun3@huawei.com>
Date:   Thu Jun 10 09:41:36 2021 +0800

    ping: Check return value of function 'ping_queue_rcv_skb'
    
    [ Upstream commit 9d44fa3e50cc91691896934d106c86e4027e61ca ]
    
    Function 'ping_queue_rcv_skb' not always return success, which will
    also return fail. If not check the wrong return value of it, lead to function
    `ping_rcv` return success.
    
    Signed-off-by: Zheng Yongjun <zhengyongjun3@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
index c59144502ee8..862744c28548 100644
--- a/net/ipv4/ping.c
+++ b/net/ipv4/ping.c
@@ -968,6 +968,7 @@ bool ping_rcv(struct sk_buff *skb)
 	struct sock *sk;
 	struct net *net = dev_net(skb->dev);
 	struct icmphdr *icmph = icmp_hdr(skb);
+	bool rc = false;
 
 	/* We assume the packet has already been checked by icmp_rcv */
 
@@ -982,14 +983,15 @@ bool ping_rcv(struct sk_buff *skb)
 		struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);
 
 		pr_debug("rcv on socket %p\n", sk);
-		if (skb2)
-			ping_queue_rcv_skb(sk, skb2);
+		if (skb2 && !ping_queue_rcv_skb(sk, skb2))
+			rc = true;
 		sock_put(sk);
-		return true;
 	}
-	pr_debug("no socket, dropping\n");
 
-	return false;
+	if (!rc)
+		pr_debug("no socket, dropping\n");
+
+	return rc;
 }
 EXPORT_SYMBOL_GPL(ping_rcv);
 

commit 8b0f8cf5b02df6447974eea1a456b9f642fa1241
Author: Austin Kim <austindh.kim@gmail.com>
Date:   Wed Jun 9 03:34:25 2021 +0100

    net: ethtool: clear heap allocations for ethtool function
    
    [ Upstream commit 80ec82e3d2c1fab42eeb730aaa7985494a963d3f ]
    
    Several ethtool functions leave heap uncleared (potentially) by
    drivers. This will leave the unused portion of heap unchanged and
    might copy the full contents back to userspace.
    
    Signed-off-by: Austin Kim <austindh.kim@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/core/ethtool.c b/net/core/ethtool.c
index 83028017c26d..4db9512feba8 100644
--- a/net/core/ethtool.c
+++ b/net/core/ethtool.c
@@ -1594,7 +1594,7 @@ static int ethtool_get_any_eeprom(struct net_device *dev, void __user *useraddr,
 	if (eeprom.offset + eeprom.len > total_len)
 		return -EINVAL;
 
-	data = kmalloc(PAGE_SIZE, GFP_USER);
+	data = kzalloc(PAGE_SIZE, GFP_USER);
 	if (!data)
 		return -ENOMEM;
 
@@ -1659,7 +1659,7 @@ static int ethtool_set_eeprom(struct net_device *dev, void __user *useraddr)
 	if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev))
 		return -EINVAL;
 
-	data = kmalloc(PAGE_SIZE, GFP_USER);
+	data = kzalloc(PAGE_SIZE, GFP_USER);
 	if (!data)
 		return -ENOMEM;
 
@@ -1840,7 +1840,7 @@ static int ethtool_self_test(struct net_device *dev, char __user *useraddr)
 		return -EFAULT;
 
 	test.len = test_len;
-	data = kmalloc_array(test_len, sizeof(u64), GFP_USER);
+	data = kcalloc(test_len, sizeof(u64), GFP_USER);
 	if (!data)
 		return -ENOMEM;
 
@@ -2372,7 +2372,7 @@ static int ethtool_get_tunable(struct net_device *dev, void __user *useraddr)
 	ret = ethtool_tunable_valid(&tuna);
 	if (ret)
 		return ret;
-	data = kmalloc(tuna.len, GFP_USER);
+	data = kzalloc(tuna.len, GFP_USER);
 	if (!data)
 		return -ENOMEM;
 	ret = ops->get_tunable(dev, &tuna, data);
@@ -2552,7 +2552,7 @@ static int get_phy_tunable(struct net_device *dev, void __user *useraddr)
 	ret = ethtool_phy_tunable_valid(&tuna);
 	if (ret)
 		return ret;
-	data = kmalloc(tuna.len, GFP_USER);
+	data = kzalloc(tuna.len, GFP_USER);
 	if (!data)
 		return -ENOMEM;
 	mutex_lock(&phydev->lock);

commit 6ab6b68ddf09fad033e653ed85acc8789d57fa6b
Author: Johannes Berg <johannes.berg@intel.com>
Date:   Wed Jun 9 16:13:06 2021 +0200

    mac80211: drop multicast fragments
    
    [ Upstream commit a9799541ca34652d9996e45f80e8e03144c12949 ]
    
    These are not permitted by the spec, just drop them.
    
    Link: https://lore.kernel.org/r/20210609161305.23def022b750.Ibd6dd3cdce573dae262fcdc47f8ac52b883a9c50@changeid
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 2ba19decb126..012697efafc3 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -2124,17 +2124,15 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
 	sc = le16_to_cpu(hdr->seq_ctrl);
 	frag = sc & IEEE80211_SCTL_FRAG;
 
-	if (is_multicast_ether_addr(hdr->addr1)) {
-		I802_DEBUG_INC(rx->local->dot11MulticastReceivedFrameCount);
-		goto out_no_led;
-	}
-
 	if (rx->sta)
 		cache = &rx->sta->frags;
 
 	if (likely(!ieee80211_has_morefrags(fc) && frag == 0))
 		goto out;
 
+	if (is_multicast_ether_addr(hdr->addr1))
+		return RX_DROP_MONITOR;
+
 	I802_DEBUG_INC(rx->local->rx_handlers_fragments);
 
 	if (skb_linearize(rx->skb))
@@ -2260,7 +2258,6 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
 
  out:
 	ieee80211_led_rx(rx->local);
- out_no_led:
 	if (rx->sta)
 		rx->sta->rx_stats.packets++;
 	return RX_CONTINUE;

commit 24e2441b102db48bf8eec1f6b789db49b5e86adb
Author: Du Cheng <ducheng2@gmail.com>
Date:   Wed Apr 28 14:39:41 2021 +0800

    cfg80211: call cfg80211_leave_ocb when switching away from OCB
    
    [ Upstream commit a64b6a25dd9f984ed05fade603a00e2eae787d2f ]
    
    If the userland switches back-and-forth between NL80211_IFTYPE_OCB and
    NL80211_IFTYPE_ADHOC via send_msg(NL80211_CMD_SET_INTERFACE), there is a
    chance where the cleanup cfg80211_leave_ocb() is not called. This leads
    to initialization of in-use memory (e.g. init u.ibss while in-use by
    u.ocb) due to a shared struct/union within ieee80211_sub_if_data:
    
    struct ieee80211_sub_if_data {
        ...
        union {
            struct ieee80211_if_ap ap;
            struct ieee80211_if_vlan vlan;
            struct ieee80211_if_managed mgd;
            struct ieee80211_if_ibss ibss; // <- shares address
            struct ieee80211_if_mesh mesh;
            struct ieee80211_if_ocb ocb; // <- shares address
            struct ieee80211_if_mntr mntr;
            struct ieee80211_if_nan nan;
        } u;
        ...
    }
    
    Therefore add handling of otype == NL80211_IFTYPE_OCB, during
    cfg80211_change_iface() to perform cleanup when leaving OCB mode.
    
    link to syzkaller bug:
    https://syzkaller.appspot.com/bug?id=0612dbfa595bf4b9b680ff7b4948257b8e3732d5
    
    Reported-by: syzbot+105896fac213f26056f9@syzkaller.appspotmail.com
    Signed-off-by: Du Cheng <ducheng2@gmail.com>
    Link: https://lore.kernel.org/r/20210428063941.105161-1-ducheng2@gmail.com
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/wireless/util.c b/net/wireless/util.c
index c4536468dfbe..e7be500b6452 100644
--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -965,6 +965,9 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev,
 		case NL80211_IFTYPE_MESH_POINT:
 			/* mesh should be handled? */
 			break;
+		case NL80211_IFTYPE_OCB:
+			cfg80211_leave_ocb(rdev, dev);
+			break;
 		default:
 			break;
 		}

commit 25487a5ff100398cb214ae854358609e4bbd4e7d
Author: Johannes Berg <johannes.berg@intel.com>
Date:   Mon May 17 16:47:17 2021 +0200

    mac80211: remove warning in ieee80211_get_sband()
    
    [ Upstream commit 0ee4d55534f82a0624701d0bb9fc2304d4529086 ]
    
    Syzbot reports that it's possible to hit this from userspace,
    by trying to add a station before any other connection setup
    has been done. Instead of trying to catch this in some other
    way simply remove the warning, that will appropriately reject
    the call from userspace.
    
    Reported-by: syzbot+7716dbc401d9a437890d@syzkaller.appspotmail.com
    Link: https://lore.kernel.org/r/20210517164715.f537da276d17.Id05f40ec8761d6a8cc2df87f1aa09c651988a586@changeid
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index 6c9d9c94983b..dea48696f994 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -1398,7 +1398,7 @@ ieee80211_get_sband(struct ieee80211_sub_if_data *sdata)
 	rcu_read_lock();
 	chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
 
-	if (WARN_ON_ONCE(!chanctx_conf)) {
+	if (!chanctx_conf) {
 		rcu_read_unlock();
 		return NULL;
 	}

commit 2bf73bce3df9517c4144f05ea0a80dbfeaa36933
Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Date:   Tue Jun 22 17:35:18 2021 +0200

    Revert "PCI: PM: Do not read power state in pci_enable_device_flags()"
    
    [ Upstream commit 4d6035f9bf4ea12776322746a216e856dfe46698 ]
    
    Revert commit 4514d991d992 ("PCI: PM: Do not read power state in
    pci_enable_device_flags()") that is reported to cause PCI device
    initialization issues on some systems.
    
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=213481
    Link: https://lore.kernel.org/linux-acpi/YNDoGICcg0V8HhpQ@eldamar.lan
    Reported-by: Michael <phyre@rogers.com>
    Reported-by: Salvatore Bonaccorso <carnil@debian.org>
    Fixes: 4514d991d992 ("PCI: PM: Do not read power state in pci_enable_device_flags()")
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 3d59bbe4a5d5..9ebf32de8575 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -1585,11 +1585,21 @@ static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags)
 	int err;
 	int i, bars = 0;
 
-	if (atomic_inc_return(&dev->enable_cnt) > 1) {
-		pci_update_current_state(dev, dev->current_state);
-		return 0;		/* already enabled */
+	/*
+	 * Power state could be unknown at this point, either due to a fresh
+	 * boot or a device removal call.  So get the current power state
+	 * so that things like MSI message writing will behave as expected
+	 * (e.g. if the device really is in D0 at enable time).
+	 */
+	if (dev->pm_cap) {
+		u16 pmcsr;
+		pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr);
+		dev->current_state = (pmcsr & PCI_PM_CTRL_STATE_MASK);
 	}
 
+	if (atomic_inc_return(&dev->enable_cnt) > 1)
+		return 0;		/* already enabled */
+
 	bridge = pci_upstream_bridge(dev);
 	if (bridge)
 		pci_enable_bridge(bridge);

commit 822564cd3aa1a6a092cc227e394f31f902864b88
Author: Nathan Chancellor <nathan@kernel.org>
Date:   Fri Apr 9 12:21:28 2021 -0700

    MIPS: generic: Update node names to avoid unit addresses
    
    commit e607ff630c6053ecc67502677c0e50053d7892d4 upstream.
    
    With the latest mkimage from U-Boot 2021.04, the generic defconfigs no
    longer build, failing with:
    
    /usr/bin/mkimage: verify_header failed for FIT Image support with exit code 1
    
    This is expected after the linked U-Boot commits because '@' is
    forbidden in the node names due to the way that libfdt treats nodes with
    the same prefix but different unit addresses.
    
    Switch the '@' in the node name to '-'. Drop the unit addresses from the
    hash and kernel child nodes because there is only one node so they do
    not need to have a number to differentiate them.
    
    Cc: stable@vger.kernel.org
    Link: https://source.denx.de/u-boot/u-boot/-/commit/79af75f7776fc20b0d7eb6afe1e27c00fdb4b9b4
    Link: https://source.denx.de/u-boot/u-boot/-/commit/3f04db891a353f4b127ed57279279f851c6b4917
    Suggested-by: Simon Glass <sjg@chromium.org>
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Reviewed-by: Tom Rini <trini@konsulko.com>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    [nathan: Backport to 4.19, only apply to .its.S files that exist]
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/mips/generic/board-boston.its.S b/arch/mips/generic/board-boston.its.S
index a7f51f97b910..c45ad2759421 100644
--- a/arch/mips/generic/board-boston.its.S
+++ b/arch/mips/generic/board-boston.its.S
@@ -1,22 +1,22 @@
 / {
 	images {
-		fdt@boston {
+		fdt-boston {
 			description = "img,boston Device Tree";
 			data = /incbin/("boot/dts/img/boston.dtb");
 			type = "flat_dt";
 			arch = "mips";
 			compression = "none";
-			hash@0 {
+			hash {
 				algo = "sha1";
 			};
 		};
 	};
 
 	configurations {
-		conf@boston {
+		conf-boston {
 			description = "Boston Linux kernel";
-			kernel = "kernel@0";
-			fdt = "fdt@boston";
+			kernel = "kernel";
+			fdt = "fdt-boston";
 		};
 	};
 };
diff --git a/arch/mips/generic/board-ni169445.its.S b/arch/mips/generic/board-ni169445.its.S
index e4cb4f95a8cc..0a2e8f7a8526 100644
--- a/arch/mips/generic/board-ni169445.its.S
+++ b/arch/mips/generic/board-ni169445.its.S
@@ -1,22 +1,22 @@
 / {
 	images {
-		fdt@ni169445 {
+		fdt-ni169445 {
 			description = "NI 169445 device tree";
 			data = /incbin/("boot/dts/ni/169445.dtb");
 			type = "flat_dt";
 			arch = "mips";
 			compression = "none";
-			hash@0 {
+			hash {
 				algo = "sha1";
 			};
 		};
 	};
 
 	configurations {
-		conf@ni169445 {
+		conf-ni169445 {
 			description = "NI 169445 Linux Kernel";
-			kernel = "kernel@0";
-			fdt = "fdt@ni169445";
+			kernel = "kernel";
+			fdt = "fdt-ni169445";
 		};
 	};
 };
diff --git a/arch/mips/generic/board-xilfpga.its.S b/arch/mips/generic/board-xilfpga.its.S
index a2e773d3f14f..08c1e900eb4e 100644
--- a/arch/mips/generic/board-xilfpga.its.S
+++ b/arch/mips/generic/board-xilfpga.its.S
@@ -1,22 +1,22 @@
 / {
 	images {
-		fdt@xilfpga {
+		fdt-xilfpga {
 			description = "MIPSfpga (xilfpga) Device Tree";
 			data = /incbin/("boot/dts/xilfpga/nexys4ddr.dtb");
 			type = "flat_dt";
 			arch = "mips";
 			compression = "none";
-			hash@0 {
+			hash {
 				algo = "sha1";
 			};
 		};
 	};
 
 	configurations {
-		conf@xilfpga {
+		conf-xilfpga {
 			description = "MIPSfpga Linux kernel";
-			kernel = "kernel@0";
-			fdt = "fdt@xilfpga";
+			kernel = "kernel";
+			fdt = "fdt-xilfpga";
 		};
 	};
 };
diff --git a/arch/mips/generic/vmlinux.its.S b/arch/mips/generic/vmlinux.its.S
index 1a08438fd893..3e254676540f 100644
--- a/arch/mips/generic/vmlinux.its.S
+++ b/arch/mips/generic/vmlinux.its.S
@@ -6,7 +6,7 @@
 	#address-cells = <ADDR_CELLS>;
 
 	images {
-		kernel@0 {
+		kernel {
 			description = KERNEL_NAME;
 			data = /incbin/(VMLINUX_BINARY);
 			type = "kernel";
@@ -15,18 +15,18 @@
 			compression = VMLINUX_COMPRESSION;
 			load = /bits/ ADDR_BITS <VMLINUX_LOAD_ADDRESS>;
 			entry = /bits/ ADDR_BITS <VMLINUX_ENTRY_ADDRESS>;
-			hash@0 {
+			hash {
 				algo = "sha1";
 			};
 		};
 	};
 
 	configurations {
-		default = "conf@default";
+		default = "conf-default";
 
-		conf@default {
+		conf-default {
 			description = "Generic Linux kernel";
-			kernel = "kernel@0";
+			kernel = "kernel";
 		};
 	};
 };

commit 6edee499192828dc5e885241de12185f5b6df594
Author: Nathan Chancellor <nathan@kernel.org>
Date:   Wed Apr 28 18:23:50 2021 -0700

    Makefile: Move -Wno-unused-but-set-variable out of GCC only block
    
    commit 885480b084696331bea61a4f7eba10652999a9c1 upstream.
    
    Currently, -Wunused-but-set-variable is only supported by GCC so it is
    disabled unconditionally in a GCC only block (it is enabled with W=1).
    clang currently has its implementation for this warning in review so
    preemptively move this statement out of the GCC only block and wrap it
    with cc-disable-warning so that both compilers function the same.
    
    Cc: stable@vger.kernel.org
    Link: https://reviews.llvm.org/D100581
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
    Tested-by: Nick Desaulniers <ndesaulniers@google.com>
    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    [nc: Backport, workaround lack of e2079e93f562 in older branches]
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index 9ff7a4b7b8cb..cda7a18b925a 100644
--- a/Makefile
+++ b/Makefile
@@ -716,12 +716,11 @@ KBUILD_CFLAGS += $(call cc-disable-warning, tautological-compare)
 # See modpost pattern 2
 KBUILD_CFLAGS += $(call cc-option, -mno-global-merge,)
 KBUILD_CFLAGS += $(call cc-option, -fcatch-undefined-behavior)
-else
+endif
 
 # These warnings generated too much noise in a regular build.
 # Use make W=1 to enable them (see scripts/Makefile.extrawarn)
 KBUILD_CFLAGS += $(call cc-disable-warning, unused-but-set-variable)
-endif
 
 KBUILD_CFLAGS += $(call cc-disable-warning, unused-const-variable)
 ifdef CONFIG_FRAME_POINTER

commit 188afa5647dd8d260af962df3c816f399688f59d
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Fri May 14 11:26:37 2021 +0100

    ARM: 9081/1: fix gcc-10 thumb2-kernel regression
    
    commit dad7b9896a5dbac5da8275d5a6147c65c81fb5f2 upstream.
    
    When building the kernel wtih gcc-10 or higher using the
    CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y flag, the compiler picks a slightly
    different set of registers for the inline assembly in cpu_init() that
    subsequently results in a corrupt kernel stack as well as remaining in
    FIQ mode. If a banked register is used for the last argument, the wrong
    version of that register gets loaded into CPSR_c.  When building in Arm
    mode, the arguments are passed as immediate values and the bug cannot
    happen.
    
    This got introduced when Daniel reworked the FIQ handling and was
    technically always broken, but happened to work with both clang and gcc
    before gcc-10 as long as they picked one of the lower registers.
    This is probably an indication that still very few people build the
    kernel in Thumb2 mode.
    
    Marek pointed out the problem on IRC, Arnd narrowed it down to this
    inline assembly and Russell pinpointed the exact bug.
    
    Change the constraints to force the final mode switch to use a non-banked
    register for the argument to ensure that the correct constant gets loaded.
    Another alternative would be to always use registers for the constant
    arguments to avoid the #ifdef that has now become more complex.
    
    Cc: <stable@vger.kernel.org> # v3.18+
    Cc: Daniel Thompson <daniel.thompson@linaro.org>
    Reported-by: Marek Vasut <marek.vasut@gmail.com>
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Fixes: c0e7f7ee717e ("ARM: 8150/3: fiq: Replace default FIQ handler")
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 7bbaa293a38c..95db057ed2fa 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -547,9 +547,11 @@ void notrace cpu_init(void)
 	 * In Thumb-2, msr with an immediate value is not allowed.
 	 */
 #ifdef CONFIG_THUMB2_KERNEL
-#define PLC	"r"
+#define PLC_l	"l"
+#define PLC_r	"r"
 #else
-#define PLC	"I"
+#define PLC_l	"I"
+#define PLC_r	"I"
 #endif
 
 	/*
@@ -571,15 +573,15 @@ void notrace cpu_init(void)
 	"msr	cpsr_c, %9"
 	    :
 	    : "r" (stk),
-	      PLC (PSR_F_BIT | PSR_I_BIT | IRQ_MODE),
+	      PLC_r (PSR_F_BIT | PSR_I_BIT | IRQ_MODE),
 	      "I" (offsetof(struct stack, irq[0])),
-	      PLC (PSR_F_BIT | PSR_I_BIT | ABT_MODE),
+	      PLC_r (PSR_F_BIT | PSR_I_BIT | ABT_MODE),
 	      "I" (offsetof(struct stack, abt[0])),
-	      PLC (PSR_F_BIT | PSR_I_BIT | UND_MODE),
+	      PLC_r (PSR_F_BIT | PSR_I_BIT | UND_MODE),
 	      "I" (offsetof(struct stack, und[0])),
-	      PLC (PSR_F_BIT | PSR_I_BIT | FIQ_MODE),
+	      PLC_r (PSR_F_BIT | PSR_I_BIT | FIQ_MODE),
 	      "I" (offsetof(struct stack, fiq[0])),
-	      PLC (PSR_F_BIT | PSR_I_BIT | SVC_MODE)
+	      PLC_l (PSR_F_BIT | PSR_I_BIT | SVC_MODE)
 	    : "r14");
 #endif
 }

commit 72b03fbba6d55d41be82d5717449961ff5903835
Author: Christian König <christian.koenig@amd.com>
Date:   Mon Jun 21 13:43:05 2021 +0200

    drm/radeon: wait for moving fence after pinning
    
    commit 4b41726aae563273bb4b4a9462ba51ce4d372f78 upstream.
    
    We actually need to wait for the moving fence after pinning
    the BO to make sure that the pin is completed.
    
    Signed-off-by: Christian König <christian.koenig@amd.com>
    Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
    References: https://lore.kernel.org/dri-devel/20210621151758.2347474-1-daniel.vetter@ffwll.ch/
    CC: stable@kernel.org
    Link: https://patchwork.freedesktop.org/patch/msgid/20210622114506.106349-2-christian.koenig@amd.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/radeon/radeon_prime.c b/drivers/gpu/drm/radeon/radeon_prime.c
index 7110d403322c..c138e07f51a3 100644
--- a/drivers/gpu/drm/radeon/radeon_prime.c
+++ b/drivers/gpu/drm/radeon/radeon_prime.c
@@ -92,9 +92,19 @@ int radeon_gem_prime_pin(struct drm_gem_object *obj)
 
 	/* pin buffer into GTT */
 	ret = radeon_bo_pin(bo, RADEON_GEM_DOMAIN_GTT, NULL);
-	if (likely(ret == 0))
-		bo->prime_shared_count++;
-
+	if (unlikely(ret))
+		goto error;
+
+	if (bo->tbo.moving) {
+		ret = dma_fence_wait(bo->tbo.moving, false);
+		if (unlikely(ret)) {
+			radeon_bo_unpin(bo);
+			goto error;
+		}
+	}
+
+	bo->prime_shared_count++;
+error:
 	radeon_bo_unreserve(bo);
 	return ret;
 }

commit 4b4ce5cbef3a30820a21008a62327f55e8a24094
Author: Christian König <christian.koenig@amd.com>
Date:   Mon Jun 21 13:36:35 2021 +0200

    drm/nouveau: wait for moving fence after pinning v2
    
    commit 17b11f71795abdce46f62a808f906857e525cea8 upstream.
    
    We actually need to wait for the moving fence after pinning
    the BO to make sure that the pin is completed.
    
    v2: grab the lock while waiting
    
    Signed-off-by: Christian König <christian.koenig@amd.com>
    Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
    References: https://lore.kernel.org/dri-devel/20210621151758.2347474-1-daniel.vetter@ffwll.ch/
    CC: stable@kernel.org
    Link: https://patchwork.freedesktop.org/patch/msgid/20210622114506.106349-1-christian.koenig@amd.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/nouveau/nouveau_prime.c b/drivers/gpu/drm/nouveau/nouveau_prime.c
index 1fefc93af1d7..bbfce7b9d03e 100644
--- a/drivers/gpu/drm/nouveau/nouveau_prime.c
+++ b/drivers/gpu/drm/nouveau/nouveau_prime.c
@@ -98,7 +98,22 @@ int nouveau_gem_prime_pin(struct drm_gem_object *obj)
 	if (ret)
 		return -EINVAL;
 
-	return 0;
+	ret = ttm_bo_reserve(&nvbo->bo, false, false, NULL);
+	if (ret)
+		goto error;
+
+	if (nvbo->bo.moving)
+		ret = dma_fence_wait(nvbo->bo.moving, true);
+
+	ttm_bo_unreserve(&nvbo->bo);
+	if (ret)
+		goto error;
+
+	return ret;
+
+error:
+	nouveau_bo_unpin(nvbo);
+	return ret;
 }
 
 void nouveau_gem_prime_unpin(struct drm_gem_object *obj)

commit ff660863628fb144badcb3395cde7821c82c13a6
Author: Mimi Zohar <zohar@linux.ibm.com>
Date:   Tue Jun 22 13:36:41 2021 +0200

    module: limit enabling module.sig_enforce
    
    [ Upstream commit 0c18f29aae7ce3dadd26d8ee3505d07cc982df75 ]
    
    Irrespective as to whether CONFIG_MODULE_SIG is configured, specifying
    "module.sig_enforce=1" on the boot command line sets "sig_enforce".
    Only allow "sig_enforce" to be set when CONFIG_MODULE_SIG is configured.
    
    This patch makes the presence of /sys/module/module/parameters/sig_enforce
    dependent on CONFIG_MODULE_SIG=y.
    
    Fixes: fda784e50aac ("module: export module signature enforcement status")
    Reported-by: Nayna Jain <nayna@linux.ibm.com>
    Tested-by: Mimi Zohar <zohar@linux.ibm.com>
    Tested-by: Jessica Yu <jeyu@kernel.org>
    Signed-off-by: Mimi Zohar <zohar@linux.ibm.com>
    Signed-off-by: Jessica Yu <jeyu@kernel.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/module.c b/kernel/module.c
index 92d8610742c7..68637e661d75 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -268,9 +268,18 @@ static void module_assert_mutex_or_preempt(void)
 #endif
 }
 
+#ifdef CONFIG_MODULE_SIG
 static bool sig_enforce = IS_ENABLED(CONFIG_MODULE_SIG_FORCE);
 module_param(sig_enforce, bool_enable_only, 0644);
 
+void set_module_sig_enforced(void)
+{
+	sig_enforce = true;
+}
+#else
+#define sig_enforce false
+#endif
+
 /*
  * Export sig_enforce kernel cmdline parameter to allow other subsystems rely
  * on that instead of directly to CONFIG_MODULE_SIG_FORCE config.

commit 55cfd22f9b5a051fa815d6987825e00aa15427af
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Wed Jun 9 21:18:00 2021 +0200

    x86/fpu: Reset state for all signal restore failures
    
    commit efa165504943f2128d50f63de0c02faf6dcceb0d upstream.
    
    If access_ok() or fpregs_soft_set() fails in __fpu__restore_sig() then the
    function just returns but does not clear the FPU state as it does for all
    other fatal failures.
    
    Clear the FPU state for these failures as well.
    
    Fixes: 72a671ced66d ("x86, fpu: Unify signal handling code paths for x86 and x86_64 kernels")
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Cc: stable@vger.kernel.org
    Link: https://lkml.kernel.org/r/87mtryyhhz.ffs@nanos.tec.linutronix.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kernel/fpu/signal.c b/arch/x86/kernel/fpu/signal.c
index d99a8ee9e185..86a231338bbf 100644
--- a/arch/x86/kernel/fpu/signal.c
+++ b/arch/x86/kernel/fpu/signal.c
@@ -272,6 +272,7 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)
 	int state_size = fpu_kernel_xstate_size;
 	u64 xfeatures = 0;
 	int fx_only = 0;
+	int ret = 0;
 
 	ia32_fxstate &= (IS_ENABLED(CONFIG_X86_32) ||
 			 IS_ENABLED(CONFIG_IA32_EMULATION));
@@ -281,15 +282,21 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)
 		return 0;
 	}
 
-	if (!access_ok(VERIFY_READ, buf, size))
-		return -EACCES;
+	if (!access_ok(VERIFY_READ, buf, size)) {
+		ret = -EACCES;
+		goto out_err;
+	}
 
 	fpu__initialize(fpu);
 
-	if (!static_cpu_has(X86_FEATURE_FPU))
-		return fpregs_soft_set(current, NULL,
-				       0, sizeof(struct user_i387_ia32_struct),
-				       NULL, buf) != 0;
+	if (!static_cpu_has(X86_FEATURE_FPU)) {
+		ret = fpregs_soft_set(current, NULL,
+				      0, sizeof(struct user_i387_ia32_struct),
+				      NULL, buf) != 0;
+		if (ret)
+			goto out_err;
+		return 0;
+	}
 
 	if (use_xsave()) {
 		struct _fpx_sw_bytes fx_sw_user;
@@ -349,6 +356,7 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)
 		fpu__restore(fpu);
 		local_bh_enable();
 
+		/* Failure is already handled */
 		return err;
 	} else {
 		/*
@@ -356,13 +364,14 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)
 		 * state to the registers directly (with exceptions handled).
 		 */
 		user_fpu_begin();
-		if (copy_user_to_fpregs_zeroing(buf_fx, xfeatures, fx_only)) {
-			fpu__clear(fpu);
-			return -1;
-		}
+		if (!copy_user_to_fpregs_zeroing(buf_fx, xfeatures, fx_only))
+			return 0;
+		ret = -1;
 	}
 
-	return 0;
+out_err:
+	fpu__clear(fpu);
+	return ret;
 }
 
 static inline int xstate_sigframe_size(void)

commit 7f9745ab342bcce5efd5d4d2297d0a3dd9db0eac
Author: Peter Chen <peter.chen@kernel.org>
Date:   Tue Jun 8 18:56:56 2021 +0800

    usb: dwc3: core: fix kernel panic when do reboot
    
    commit 4bf584a03eec674975ee9fe36c8583d9d470dab1 upstream.
    
    When do system reboot, it calls dwc3_shutdown and the whole debugfs
    for dwc3 has removed first, when the gadget tries to do deinit, and
    remove debugfs for its endpoints, it meets NULL pointer dereference
    issue when call debugfs_lookup. Fix it by removing the whole dwc3
    debugfs later than dwc3_drd_exit.
    
    [ 2924.958838] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000002
    ....
    [ 2925.030994] pstate: 60000005 (nZCv daif -PAN -UAO -TCO BTYPE=--)
    [ 2925.037005] pc : inode_permission+0x2c/0x198
    [ 2925.041281] lr : lookup_one_len_common+0xb0/0xf8
    [ 2925.045903] sp : ffff80001276ba70
    [ 2925.049218] x29: ffff80001276ba70 x28: ffff0000c01f0000 x27: 0000000000000000
    [ 2925.056364] x26: ffff800011791e70 x25: 0000000000000008 x24: dead000000000100
    [ 2925.063510] x23: dead000000000122 x22: 0000000000000000 x21: 0000000000000001
    [ 2925.070652] x20: ffff8000122c6188 x19: 0000000000000000 x18: 0000000000000000
    [ 2925.077797] x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000004
    [ 2925.084943] x14: ffffffffffffffff x13: 0000000000000000 x12: 0000000000000030
    [ 2925.092087] x11: 0101010101010101 x10: 7f7f7f7f7f7f7f7f x9 : ffff8000102b2420
    [ 2925.099232] x8 : 7f7f7f7f7f7f7f7f x7 : feff73746e2f6f64 x6 : 0000000000008080
    [ 2925.106378] x5 : 61c8864680b583eb x4 : 209e6ec2d263dbb7 x3 : 000074756f307065
    [ 2925.113523] x2 : 0000000000000001 x1 : 0000000000000000 x0 : ffff8000122c6188
    [ 2925.120671] Call trace:
    [ 2925.123119]  inode_permission+0x2c/0x198
    [ 2925.127042]  lookup_one_len_common+0xb0/0xf8
    [ 2925.131315]  lookup_one_len_unlocked+0x34/0xb0
    [ 2925.135764]  lookup_positive_unlocked+0x14/0x50
    [ 2925.140296]  debugfs_lookup+0x68/0xa0
    [ 2925.143964]  dwc3_gadget_free_endpoints+0x84/0xb0
    [ 2925.148675]  dwc3_gadget_exit+0x28/0x78
    [ 2925.152518]  dwc3_drd_exit+0x100/0x1f8
    [ 2925.156267]  dwc3_remove+0x11c/0x120
    [ 2925.159851]  dwc3_shutdown+0x14/0x20
    [ 2925.163432]  platform_shutdown+0x28/0x38
    [ 2925.167360]  device_shutdown+0x15c/0x378
    [ 2925.171291]  kernel_restart_prepare+0x3c/0x48
    [ 2925.175650]  kernel_restart+0x1c/0x68
    [ 2925.179316]  __do_sys_reboot+0x218/0x240
    [ 2925.183247]  __arm64_sys_reboot+0x28/0x30
    [ 2925.187262]  invoke_syscall+0x48/0x100
    [ 2925.191017]  el0_svc_common.constprop.0+0x48/0xc8
    [ 2925.195726]  do_el0_svc+0x28/0x88
    [ 2925.199045]  el0_svc+0x20/0x30
    [ 2925.202104]  el0_sync_handler+0xa8/0xb0
    [ 2925.205942]  el0_sync+0x148/0x180
    [ 2925.209270] Code: a9025bf5 2a0203f5 121f0056 370802b5 (79400660)
    [ 2925.215372] ---[ end trace 124254d8e485a58b ]---
    [ 2925.220012] Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
    [ 2925.227676] Kernel Offset: disabled
    [ 2925.231164] CPU features: 0x00001001,20000846
    [ 2925.235521] Memory Limit: none
    [ 2925.238580] ---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b ]---
    
    Fixes: 8d396bb0a5b6 ("usb: dwc3: debugfs: Add and remove endpoint dirs dynamically")
    Cc: Jack Pham <jackp@codeaurora.org>
    Tested-by: Jack Pham <jackp@codeaurora.org>
    Signed-off-by: Peter Chen <peter.chen@kernel.org>
    Link: https://lore.kernel.org/r/20210608105656.10795-1-peter.chen@kernel.org
    (cherry picked from commit 2a042767814bd0edf2619f06fecd374e266ea068)
    Link: https://lore.kernel.org/r/20210615080847.GA10432@jackp-linux.qualcomm.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index e890c26b6c82..e223502eafca 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -1550,8 +1550,8 @@ static int dwc3_remove(struct platform_device *pdev)
 
 	pm_runtime_get_sync(&pdev->dev);
 
-	dwc3_debugfs_exit(dwc);
 	dwc3_core_exit_mode(dwc);
+	dwc3_debugfs_exit(dwc);
 
 	dwc3_core_exit(dwc);
 	dwc3_ulpi_exit(dwc);

commit 3bef21035888dd19750ad79b5d08fe52a02ad719
Author: Jack Pham <jackp@codeaurora.org>
Date:   Sat May 29 12:29:32 2021 -0700

    usb: dwc3: debugfs: Add and remove endpoint dirs dynamically
    
    commit 8d396bb0a5b62b326f6be7594d8bd46b088296bd upstream.
    
    The DWC3 DebugFS directory and files are currently created once
    during probe.  This includes creation of subdirectories for each
    of the gadget's endpoints.  This works fine for peripheral-only
    controllers, as dwc3_core_init_mode() calls dwc3_gadget_init()
    just prior to calling dwc3_debugfs_init().
    
    However, for dual-role controllers, dwc3_core_init_mode() will
    instead call dwc3_drd_init() which is problematic in a few ways.
    First, the initial state must be determined, then dwc3_set_mode()
    will have to schedule drd_work and by then dwc3_debugfs_init()
    could have already been invoked.  Even if the initial mode is
    peripheral, dwc3_gadget_init() happens after the DebugFS files
    are created, and worse so if the initial state is host and the
    controller switches to peripheral much later.  And secondly,
    even if the gadget endpoints' debug entries were successfully
    created, if the controller exits peripheral mode, its dwc3_eps
    are freed so the debug files would now hold stale references.
    
    So it is best if the DebugFS endpoint entries are created and
    removed dynamically at the same time the underlying dwc3_eps are.
    Do this by calling dwc3_debugfs_create_endpoint_dir() as each
    endpoint is created, and conversely remove the DebugFS entry when
    the endpoint is freed.
    
    Fixes: 41ce1456e1db ("usb: dwc3: core: make dwc3_set_mode() work properly")
    Cc: stable <stable@vger.kernel.org>
    Reviewed-by: Peter Chen <peter.chen@kernel.org>
    Signed-off-by: Jack Pham <jackp@codeaurora.org>
    Link: https://lore.kernel.org/r/20210529192932.22912-1-jackp@codeaurora.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/dwc3/debug.h b/drivers/usb/dwc3/debug.h
index 4f75ab3505b7..069db13f3a10 100644
--- a/drivers/usb/dwc3/debug.h
+++ b/drivers/usb/dwc3/debug.h
@@ -653,9 +653,12 @@ static inline const char *dwc3_gadget_generic_cmd_status_string(int status)
 
 
 #ifdef CONFIG_DEBUG_FS
+extern void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep);
 extern void dwc3_debugfs_init(struct dwc3 *);
 extern void dwc3_debugfs_exit(struct dwc3 *);
 #else
+static inline void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep)
+{  }
 static inline void dwc3_debugfs_init(struct dwc3 *d)
 {  }
 static inline void dwc3_debugfs_exit(struct dwc3 *d)
diff --git a/drivers/usb/dwc3/debugfs.c b/drivers/usb/dwc3/debugfs.c
index 04ce7c01a09e..58a2479d8e6a 100644
--- a/drivers/usb/dwc3/debugfs.c
+++ b/drivers/usb/dwc3/debugfs.c
@@ -725,30 +725,14 @@ static void dwc3_debugfs_create_endpoint_files(struct dwc3_ep *dep,
 	}
 }
 
-static void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep,
-		struct dentry *parent)
+void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep)
 {
 	struct dentry		*dir;
 
-	dir = debugfs_create_dir(dep->name, parent);
+	dir = debugfs_create_dir(dep->name, dep->dwc->root);
 	dwc3_debugfs_create_endpoint_files(dep, dir);
 }
 
-static void dwc3_debugfs_create_endpoint_dirs(struct dwc3 *dwc,
-		struct dentry *parent)
-{
-	int			i;
-
-	for (i = 0; i < dwc->num_eps; i++) {
-		struct dwc3_ep	*dep = dwc->eps[i];
-
-		if (!dep)
-			continue;
-
-		dwc3_debugfs_create_endpoint_dir(dep, parent);
-	}
-}
-
 void dwc3_debugfs_init(struct dwc3 *dwc)
 {
 	struct dentry		*root;
@@ -777,7 +761,6 @@ void dwc3_debugfs_init(struct dwc3 *dwc)
 				    &dwc3_testmode_fops);
 		debugfs_create_file("link_state", S_IRUGO | S_IWUSR, root, dwc,
 				    &dwc3_link_state_fops);
-		dwc3_debugfs_create_endpoint_dirs(dwc, root);
 	}
 }
 
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 1396ee529792..c93bed41d988 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -2255,6 +2255,8 @@ static int dwc3_gadget_init_endpoint(struct dwc3 *dwc, u8 epnum)
 	INIT_LIST_HEAD(&dep->started_list);
 	INIT_LIST_HEAD(&dep->cancelled_list);
 
+	dwc3_debugfs_create_endpoint_dir(dep);
+
 	return 0;
 }
 
@@ -2298,6 +2300,7 @@ static void dwc3_gadget_free_endpoints(struct dwc3 *dwc)
 			list_del(&dep->endpoint.ep_list);
 		}
 
+		debugfs_remove_recursive(debugfs_lookup(dep->name, dwc->root));
 		kfree(dep);
 	}
 }

commit 7f7e23df8509e072593200400a4b094cc44376d2
Author: Eric Dumazet <edumazet@google.com>
Date:   Wed Mar 24 14:53:37 2021 -0700

    inet: use bigger hash table for IP ID generation
    
    commit aa6dd211e4b1dde9d5dc25d699d35f789ae7eeba upstream.
    
    In commit 73f156a6e8c1 ("inetpeer: get rid of ip_id_count")
    I used a very small hash table that could be abused
    by patient attackers to reveal sensitive information.
    
    Switch to a dynamic sizing, depending on RAM size.
    
    Typical big hosts will now use 128x more storage (2 MB)
    to get a similar increase in security and reduction
    of hash collisions.
    
    As a bonus, use of alloc_large_system_hash() spreads
    allocated memory among all NUMA nodes.
    
    Fixes: 73f156a6e8c1 ("inetpeer: get rid of ip_id_count")
    Reported-by: Amit Klein <aksecurity@gmail.com>
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Cc: Willy Tarreau <w@1wt.eu>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 2fe50f6f876d..484bd646df5f 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -70,6 +70,7 @@
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/mm.h>
+#include <linux/bootmem.h>
 #include <linux/string.h>
 #include <linux/socket.h>
 #include <linux/sockios.h>
@@ -470,8 +471,10 @@ static void ipv4_confirm_neigh(const struct dst_entry *dst, const void *daddr)
 	__ipv4_confirm_neigh(dev, *(__force u32 *)pkey);
 }
 
-#define IP_IDENTS_SZ 2048u
-
+/* Hash tables of size 2048..262144 depending on RAM size.
+ * Each bucket uses 8 bytes.
+ */
+static u32 ip_idents_mask __read_mostly;
 static atomic_t *ip_idents __read_mostly;
 static u32 *ip_tstamps __read_mostly;
 
@@ -481,12 +484,16 @@ static u32 *ip_tstamps __read_mostly;
  */
 u32 ip_idents_reserve(u32 hash, int segs)
 {
-	u32 *p_tstamp = ip_tstamps + hash % IP_IDENTS_SZ;
-	atomic_t *p_id = ip_idents + hash % IP_IDENTS_SZ;
-	u32 old = READ_ONCE(*p_tstamp);
-	u32 now = (u32)jiffies;
+	u32 bucket, old, now = (u32)jiffies;
+	atomic_t *p_id;
+	u32 *p_tstamp;
 	u32 delta = 0;
 
+	bucket = hash & ip_idents_mask;
+	p_tstamp = ip_tstamps + bucket;
+	p_id = ip_idents + bucket;
+	old = READ_ONCE(*p_tstamp);
+
 	if (old != now && cmpxchg(p_tstamp, old, now) == old)
 		delta = prandom_u32_max(now - old);
 
@@ -3197,18 +3204,25 @@ struct ip_rt_acct __percpu *ip_rt_acct __read_mostly;
 
 int __init ip_rt_init(void)
 {
+	void *idents_hash;
 	int cpu;
 
-	ip_idents = kmalloc_array(IP_IDENTS_SZ, sizeof(*ip_idents),
-				  GFP_KERNEL);
-	if (!ip_idents)
-		panic("IP: failed to allocate ip_idents\n");
+	/* For modern hosts, this will use 2 MB of memory */
+	idents_hash = alloc_large_system_hash("IP idents",
+					      sizeof(*ip_idents) + sizeof(*ip_tstamps),
+					      0,
+					      16, /* one bucket per 64 KB */
+					      HASH_ZERO,
+					      NULL,
+					      &ip_idents_mask,
+					      2048,
+					      256*1024);
+
+	ip_idents = idents_hash;
 
-	prandom_bytes(ip_idents, IP_IDENTS_SZ * sizeof(*ip_idents));
+	prandom_bytes(ip_idents, (ip_idents_mask + 1) * sizeof(*ip_idents));
 
-	ip_tstamps = kcalloc(IP_IDENTS_SZ, sizeof(*ip_tstamps), GFP_KERNEL);
-	if (!ip_tstamps)
-		panic("IP: failed to allocate ip_tstamps\n");
+	ip_tstamps = idents_hash + (ip_idents_mask + 1) * sizeof(*ip_idents);
 
 	for_each_possible_cpu(cpu) {
 		struct uncached_list *ul = &per_cpu(rt_uncached_list, cpu);

commit d42c3ebb315618ca536ef764e3f929ce1d5c3485
Author: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Date:   Sat Jun 5 19:26:35 2021 +0900

    can: bcm/raw/isotp: use per module netdevice notifier
    
    commit 8d0caedb759683041d9db82069937525999ada53 upstream.
    
    syzbot is reporting hung task at register_netdevice_notifier() [1] and
    unregister_netdevice_notifier() [2], for cleanup_net() might perform
    time consuming operations while CAN driver's raw/bcm/isotp modules are
    calling {register,unregister}_netdevice_notifier() on each socket.
    
    Change raw/bcm/isotp modules to call register_netdevice_notifier() from
    module's __init function and call unregister_netdevice_notifier() from
    module's __exit function, as with gw/j1939 modules are doing.
    
    Link: https://syzkaller.appspot.com/bug?id=391b9498827788b3cc6830226d4ff5be87107c30 [1]
    Link: https://syzkaller.appspot.com/bug?id=1724d278c83ca6e6df100a2e320c10d991cf2bce [2]
    Link: https://lore.kernel.org/r/54a5f451-05ed-f977-8534-79e7aa2bcc8f@i-love.sakura.ne.jp
    Cc: linux-stable <stable@vger.kernel.org>
    Reported-by: syzbot <syzbot+355f8edb2ff45d5f95fa@syzkaller.appspotmail.com>
    Reported-by: syzbot <syzbot+0f1827363a305f74996f@syzkaller.appspotmail.com>
    Reviewed-by: Kirill Tkhai <ktkhai@virtuozzo.com>
    Tested-by: syzbot <syzbot+355f8edb2ff45d5f95fa@syzkaller.appspotmail.com>
    Tested-by: Oliver Hartkopp <socketcan@hartkopp.net>
    Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/can/bcm.c b/net/can/bcm.c
index c82137fb2763..9f30d7b4389a 100644
--- a/net/can/bcm.c
+++ b/net/can/bcm.c
@@ -125,7 +125,7 @@ struct bcm_sock {
 	struct sock sk;
 	int bound;
 	int ifindex;
-	struct notifier_block notifier;
+	struct list_head notifier;
 	struct list_head rx_ops;
 	struct list_head tx_ops;
 	unsigned long dropped_usr_msgs;
@@ -133,6 +133,10 @@ struct bcm_sock {
 	char procname [32]; /* inode number in decimal with \0 */
 };
 
+static LIST_HEAD(bcm_notifier_list);
+static DEFINE_SPINLOCK(bcm_notifier_lock);
+static struct bcm_sock *bcm_busy_notifier;
+
 static inline struct bcm_sock *bcm_sk(const struct sock *sk)
 {
 	return (struct bcm_sock *)sk;
@@ -1432,20 +1436,15 @@ static int bcm_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
 /*
  * notification handler for netdevice status changes
  */
-static int bcm_notifier(struct notifier_block *nb, unsigned long msg,
-			void *ptr)
+static void bcm_notify(struct bcm_sock *bo, unsigned long msg,
+		       struct net_device *dev)
 {
-	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
-	struct bcm_sock *bo = container_of(nb, struct bcm_sock, notifier);
 	struct sock *sk = &bo->sk;
 	struct bcm_op *op;
 	int notify_enodev = 0;
 
 	if (!net_eq(dev_net(dev), sock_net(sk)))
-		return NOTIFY_DONE;
-
-	if (dev->type != ARPHRD_CAN)
-		return NOTIFY_DONE;
+		return;
 
 	switch (msg) {
 
@@ -1480,7 +1479,28 @@ static int bcm_notifier(struct notifier_block *nb, unsigned long msg,
 				sk->sk_error_report(sk);
 		}
 	}
+}
 
+static int bcm_notifier(struct notifier_block *nb, unsigned long msg,
+			void *ptr)
+{
+	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
+
+	if (dev->type != ARPHRD_CAN)
+		return NOTIFY_DONE;
+	if (msg != NETDEV_UNREGISTER && msg != NETDEV_DOWN)
+		return NOTIFY_DONE;
+	if (unlikely(bcm_busy_notifier)) /* Check for reentrant bug. */
+		return NOTIFY_DONE;
+
+	spin_lock(&bcm_notifier_lock);
+	list_for_each_entry(bcm_busy_notifier, &bcm_notifier_list, notifier) {
+		spin_unlock(&bcm_notifier_lock);
+		bcm_notify(bcm_busy_notifier, msg, dev);
+		spin_lock(&bcm_notifier_lock);
+	}
+	bcm_busy_notifier = NULL;
+	spin_unlock(&bcm_notifier_lock);
 	return NOTIFY_DONE;
 }
 
@@ -1500,9 +1520,9 @@ static int bcm_init(struct sock *sk)
 	INIT_LIST_HEAD(&bo->rx_ops);
 
 	/* set notifier */
-	bo->notifier.notifier_call = bcm_notifier;
-
-	register_netdevice_notifier(&bo->notifier);
+	spin_lock(&bcm_notifier_lock);
+	list_add_tail(&bo->notifier, &bcm_notifier_list);
+	spin_unlock(&bcm_notifier_lock);
 
 	return 0;
 }
@@ -1525,7 +1545,14 @@ static int bcm_release(struct socket *sock)
 
 	/* remove bcm_ops, timer, rx_unregister(), etc. */
 
-	unregister_netdevice_notifier(&bo->notifier);
+	spin_lock(&bcm_notifier_lock);
+	while (bcm_busy_notifier == bo) {
+		spin_unlock(&bcm_notifier_lock);
+		schedule_timeout_uninterruptible(1);
+		spin_lock(&bcm_notifier_lock);
+	}
+	list_del(&bo->notifier);
+	spin_unlock(&bcm_notifier_lock);
 
 	lock_sock(sk);
 
@@ -1740,6 +1767,10 @@ static struct pernet_operations canbcm_pernet_ops __read_mostly = {
 	.exit = canbcm_pernet_exit,
 };
 
+static struct notifier_block canbcm_notifier = {
+	.notifier_call = bcm_notifier
+};
+
 static int __init bcm_module_init(void)
 {
 	int err;
@@ -1753,12 +1784,14 @@ static int __init bcm_module_init(void)
 	}
 
 	register_pernet_subsys(&canbcm_pernet_ops);
+	register_netdevice_notifier(&canbcm_notifier);
 	return 0;
 }
 
 static void __exit bcm_module_exit(void)
 {
 	can_proto_unregister(&bcm_can_proto);
+	unregister_netdevice_notifier(&canbcm_notifier);
 	unregister_pernet_subsys(&canbcm_pernet_ops);
 }
 
diff --git a/net/can/raw.c b/net/can/raw.c
index 3aab7664933f..296a11a922e0 100644
--- a/net/can/raw.c
+++ b/net/can/raw.c
@@ -84,7 +84,7 @@ struct raw_sock {
 	struct sock sk;
 	int bound;
 	int ifindex;
-	struct notifier_block notifier;
+	struct list_head notifier;
 	int loopback;
 	int recv_own_msgs;
 	int fd_frames;
@@ -96,6 +96,10 @@ struct raw_sock {
 	struct uniqframe __percpu *uniq;
 };
 
+static LIST_HEAD(raw_notifier_list);
+static DEFINE_SPINLOCK(raw_notifier_lock);
+static struct raw_sock *raw_busy_notifier;
+
 /*
  * Return pointer to store the extra msg flags for raw_recvmsg().
  * We use the space of one unsigned int beyond the 'struct sockaddr_can'
@@ -266,21 +270,16 @@ static int raw_enable_allfilters(struct net *net, struct net_device *dev,
 	return err;
 }
 
-static int raw_notifier(struct notifier_block *nb,
-			unsigned long msg, void *ptr)
+static void raw_notify(struct raw_sock *ro, unsigned long msg,
+		       struct net_device *dev)
 {
-	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
-	struct raw_sock *ro = container_of(nb, struct raw_sock, notifier);
 	struct sock *sk = &ro->sk;
 
 	if (!net_eq(dev_net(dev), sock_net(sk)))
-		return NOTIFY_DONE;
-
-	if (dev->type != ARPHRD_CAN)
-		return NOTIFY_DONE;
+		return;
 
 	if (ro->ifindex != dev->ifindex)
-		return NOTIFY_DONE;
+		return;
 
 	switch (msg) {
 
@@ -309,7 +308,28 @@ static int raw_notifier(struct notifier_block *nb,
 			sk->sk_error_report(sk);
 		break;
 	}
+}
+
+static int raw_notifier(struct notifier_block *nb, unsigned long msg,
+			void *ptr)
+{
+	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
+
+	if (dev->type != ARPHRD_CAN)
+		return NOTIFY_DONE;
+	if (msg != NETDEV_UNREGISTER && msg != NETDEV_DOWN)
+		return NOTIFY_DONE;
+	if (unlikely(raw_busy_notifier)) /* Check for reentrant bug. */
+		return NOTIFY_DONE;
 
+	spin_lock(&raw_notifier_lock);
+	list_for_each_entry(raw_busy_notifier, &raw_notifier_list, notifier) {
+		spin_unlock(&raw_notifier_lock);
+		raw_notify(raw_busy_notifier, msg, dev);
+		spin_lock(&raw_notifier_lock);
+	}
+	raw_busy_notifier = NULL;
+	spin_unlock(&raw_notifier_lock);
 	return NOTIFY_DONE;
 }
 
@@ -338,9 +358,9 @@ static int raw_init(struct sock *sk)
 		return -ENOMEM;
 
 	/* set notifier */
-	ro->notifier.notifier_call = raw_notifier;
-
-	register_netdevice_notifier(&ro->notifier);
+	spin_lock(&raw_notifier_lock);
+	list_add_tail(&ro->notifier, &raw_notifier_list);
+	spin_unlock(&raw_notifier_lock);
 
 	return 0;
 }
@@ -355,7 +375,14 @@ static int raw_release(struct socket *sock)
 
 	ro = raw_sk(sk);
 
-	unregister_netdevice_notifier(&ro->notifier);
+	spin_lock(&raw_notifier_lock);
+	while (raw_busy_notifier == ro) {
+		spin_unlock(&raw_notifier_lock);
+		schedule_timeout_uninterruptible(1);
+		spin_lock(&raw_notifier_lock);
+	}
+	list_del(&ro->notifier);
+	spin_unlock(&raw_notifier_lock);
 
 	lock_sock(sk);
 
@@ -870,6 +897,10 @@ static const struct can_proto raw_can_proto = {
 	.prot       = &raw_proto,
 };
 
+static struct notifier_block canraw_notifier = {
+	.notifier_call = raw_notifier
+};
+
 static __init int raw_module_init(void)
 {
 	int err;
@@ -879,6 +910,8 @@ static __init int raw_module_init(void)
 	err = can_proto_register(&raw_can_proto);
 	if (err < 0)
 		printk(KERN_ERR "can: registration of raw protocol failed\n");
+	else
+		register_netdevice_notifier(&canraw_notifier);
 
 	return err;
 }
@@ -886,6 +919,7 @@ static __init int raw_module_init(void)
 static __exit void raw_module_exit(void)
 {
 	can_proto_unregister(&raw_can_proto);
+	unregister_netdevice_notifier(&canraw_notifier);
 }
 
 module_init(raw_module_init);

commit 43336ea7d9d57502dc0b861b05bf592de9707609
Author: Eric Auger <eric.auger@redhat.com>
Date:   Mon Apr 12 17:00:34 2021 +0200

    KVM: arm/arm64: Fix KVM_VGIC_V3_ADDR_TYPE_REDIST read
    
    commit 94ac0835391efc1a30feda6fc908913ec012951e upstream.
    
    When reading the base address of the a REDIST region
    through KVM_VGIC_V3_ADDR_TYPE_REDIST we expect the
    redistributor region list to be populated with a single
    element.
    
    However list_first_entry() expects the list to be non empty.
    Instead we should use list_first_entry_or_null which effectively
    returns NULL if the list is empty.
    
    Fixes: dbd9733ab674 ("KVM: arm/arm64: Replace the single rdist region by a list")
    Cc: <Stable@vger.kernel.org> # v4.18+
    Signed-off-by: Eric Auger <eric.auger@redhat.com>
    Reported-by: Gavin Shan <gshan@redhat.com>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20210412150034.29185-1-eric.auger@redhat.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/virt/kvm/arm/vgic/vgic-kvm-device.c b/virt/kvm/arm/vgic/vgic-kvm-device.c
index 6ada2432e37c..71d92096776e 100644
--- a/virt/kvm/arm/vgic/vgic-kvm-device.c
+++ b/virt/kvm/arm/vgic/vgic-kvm-device.c
@@ -95,8 +95,8 @@ int kvm_vgic_addr(struct kvm *kvm, unsigned long type, u64 *addr, bool write)
 			r = vgic_v3_set_redist_base(kvm, 0, *addr, 0);
 			goto out;
 		}
-		rdreg = list_first_entry(&vgic->rd_regions,
-					 struct vgic_redist_region, list);
+		rdreg = list_first_entry_or_null(&vgic->rd_regions,
+						 struct vgic_redist_region, list);
 		if (!rdreg)
 			addr_ptr = &undef_value;
 		else

commit ede182d28e78bd2aa8c232caa05211c718fe1775
Author: Arnaldo Carvalho de Melo <acme@redhat.com>
Date:   Sat Jun 19 10:15:22 2021 -0300

    tools headers UAPI: Sync linux/in.h copy with the kernel sources
    
    commit 1792a59eab9593de2eae36c40c5a22d70f52c026 upstream.
    
    To pick the changes in:
    
      321827477360934d ("icmp: don't send out ICMP messages with a source address of 0.0.0.0")
    
    That don't result in any change in tooling, as INADDR_ are not used to
    generate id->string tables used by 'perf trace'.
    
    This addresses this build warning:
    
      Warning: Kernel ABI header at 'tools/include/uapi/linux/in.h' differs from latest version at 'include/uapi/linux/in.h'
      diff -u tools/include/uapi/linux/in.h include/uapi/linux/in.h
    
    Cc: David S. Miller <davem@davemloft.net>
    Cc: Toke Høiland-Jørgensen <toke@redhat.com>
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/include/uapi/linux/in.h b/tools/include/uapi/linux/in.h
index 48e8a225b985..2a66ab49f14d 100644
--- a/tools/include/uapi/linux/in.h
+++ b/tools/include/uapi/linux/in.h
@@ -280,6 +280,9 @@ struct sockaddr_in {
 /* Address indicating an error return. */
 #define	INADDR_NONE		((unsigned long int) 0xffffffff)
 
+/* Dummy address for src of ICMP replies if no real address is set (RFC7600). */
+#define	INADDR_DUMMY		((unsigned long int) 0xc0000008)
+
 /* Network number for local host loopback. */
 #define	IN_LOOPBACKNET		127
 

commit b5c8467d00314d596de481bb2cea6df9fc6e030e
Author: Fugang Duan <fugang.duan@nxp.com>
Date:   Wed Jun 16 17:14:25 2021 +0800

    net: fec_ptp: add clock rate zero check
    
    commit cb3cefe3f3f8af27c6076ef7d1f00350f502055d upstream.
    
    Add clock rate zero check to fix coverity issue of "divide by 0".
    
    Fixes: commit 85bd1798b24a ("net: fec: fix spin_lock dead lock")
    Signed-off-by: Fugang Duan <fugang.duan@nxp.com>
    Signed-off-by: Joakim Zhang <qiangqing.zhang@nxp.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/freescale/fec_ptp.c b/drivers/net/ethernet/freescale/fec_ptp.c
index eca65d49decb..52a811f91384 100644
--- a/drivers/net/ethernet/freescale/fec_ptp.c
+++ b/drivers/net/ethernet/freescale/fec_ptp.c
@@ -597,6 +597,10 @@ void fec_ptp_init(struct platform_device *pdev, int irq_idx)
 	fep->ptp_caps.enable = fec_ptp_enable;
 
 	fep->cycle_speed = clk_get_rate(fep->clk_ptp);
+	if (!fep->cycle_speed) {
+		fep->cycle_speed = NSEC_PER_SEC;
+		dev_err(&fep->pdev->dev, "clk_ptp clock rate is zero\n");
+	}
 	fep->ptp_inc = NSEC_PER_SEC / fep->cycle_speed;
 
 	spin_lock_init(&fep->tmreg_lock);

commit b838dfa48163d2f2a7de4779580ba9199a99058a
Author: Andrew Morton <akpm@linux-foundation.org>
Date:   Tue Jun 15 18:23:39 2021 -0700

    mm/slub.c: include swab.h
    
    commit 1b3865d016815cbd69a1879ca1c8a8901fda1072 upstream.
    
    Fixes build with CONFIG_SLAB_FREELIST_HARDENED=y.
    
    Hopefully.  But it's the right thing to do anwyay.
    
    Fixes: 1ad53d9fa3f61 ("slub: improve bit diffusion for freelist ptr obfuscation")
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=213417
    Reported-by: <vannguye@cisco.com>
    Acked-by: Kees Cook <keescook@chromium.org>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/mm/slub.c b/mm/slub.c
index 11a2df00729e..b6c5c8fd265d 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -15,6 +15,7 @@
 #include <linux/module.h>
 #include <linux/bit_spinlock.h>
 #include <linux/interrupt.h>
+#include <linux/swab.h>
 #include <linux/bitops.h>
 #include <linux/slab.h>
 #include "slab.h"

commit ca709d250e4403457a0907d672b7ae4330208607
Author: Kees Cook <keescook@chromium.org>
Date:   Tue Jun 15 18:23:19 2021 -0700

    mm/slub: clarify verification reporting
    
    commit 8669dbab2ae56085c128894b181c2aa50f97e368 upstream.
    
    Patch series "Actually fix freelist pointer vs redzoning", v4.
    
    This fixes redzoning vs the freelist pointer (both for middle-position
    and very small caches).  Both are "theoretical" fixes, in that I see no
    evidence of such small-sized caches actually be used in the kernel, but
    that's no reason to let the bugs continue to exist, especially since
    people doing local development keep tripping over it.  :)
    
    This patch (of 3):
    
    Instead of repeating "Redzone" and "Poison", clarify which sides of
    those zones got tripped.  Additionally fix column alignment in the
    trailer.
    
    Before:
    
      BUG test (Tainted: G    B            ): Redzone overwritten
      ...
      Redzone (____ptrval____): bb bb bb bb bb bb bb bb      ........
      Object (____ptrval____): f6 f4 a5 40 1d e8            ...@..
      Redzone (____ptrval____): 1a aa                        ..
      Padding (____ptrval____): 00 00 00 00 00 00 00 00      ........
    
    After:
    
      BUG test (Tainted: G    B            ): Right Redzone overwritten
      ...
      Redzone  (____ptrval____): bb bb bb bb bb bb bb bb      ........
      Object   (____ptrval____): f6 f4 a5 40 1d e8            ...@..
      Redzone  (____ptrval____): 1a aa                        ..
      Padding  (____ptrval____): 00 00 00 00 00 00 00 00      ........
    
    The earlier commits that slowly resulted in the "Before" reporting were:
    
      d86bd1bece6f ("mm/slub: support left redzone")
      ffc79d288000 ("slub: use print_hex_dump")
      2492268472e7 ("SLUB: change error reporting format to follow lockdep loosely")
    
    Link: https://lkml.kernel.org/r/20210608183955.280836-1-keescook@chromium.org
    Link: https://lkml.kernel.org/r/20210608183955.280836-2-keescook@chromium.org
    Link: https://lore.kernel.org/lkml/cfdb11d7-fb8e-e578-c939-f7f5fb69a6bd@suse.cz/
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Acked-by: Vlastimil Babka <vbabka@suse.cz>
    Cc: Marco Elver <elver@google.com>
    Cc: "Lin, Zhenpeng" <zplin@psu.edu>
    Cc: Christoph Lameter <cl@linux.com>
    Cc: Pekka Enberg <penberg@kernel.org>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Roman Gushchin <guro@fb.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Documentation/vm/slub.rst b/Documentation/vm/slub.rst
index 3a775fd64e2d..3602959d5f92 100644
--- a/Documentation/vm/slub.rst
+++ b/Documentation/vm/slub.rst
@@ -154,7 +154,7 @@ SLUB Debug output
 Here is a sample of slub debug output::
 
  ====================================================================
- BUG kmalloc-8: Redzone overwritten
+ BUG kmalloc-8: Right Redzone overwritten
  --------------------------------------------------------------------
 
  INFO: 0xc90f6d28-0xc90f6d2b. First byte 0x00 instead of 0xcc
@@ -162,10 +162,10 @@ Here is a sample of slub debug output::
  INFO: Object 0xc90f6d20 @offset=3360 fp=0xc90f6d58
  INFO: Allocated in get_modalias+0x61/0xf5 age=53 cpu=1 pid=554
 
- Bytes b4 0xc90f6d10:  00 00 00 00 00 00 00 00 5a 5a 5a 5a 5a 5a 5a 5a ........ZZZZZZZZ
-   Object 0xc90f6d20:  31 30 31 39 2e 30 30 35                         1019.005
-  Redzone 0xc90f6d28:  00 cc cc cc                                     .
-  Padding 0xc90f6d50:  5a 5a 5a 5a 5a 5a 5a 5a                         ZZZZZZZZ
+ Bytes b4 (0xc90f6d10): 00 00 00 00 00 00 00 00 5a 5a 5a 5a 5a 5a 5a 5a ........ZZZZZZZZ
+ Object   (0xc90f6d20): 31 30 31 39 2e 30 30 35                         1019.005
+ Redzone  (0xc90f6d28): 00 cc cc cc                                     .
+ Padding  (0xc90f6d50): 5a 5a 5a 5a 5a 5a 5a 5a                         ZZZZZZZZ
 
    [<c010523d>] dump_trace+0x63/0x1eb
    [<c01053df>] show_trace_log_lvl+0x1a/0x2f
diff --git a/mm/slub.c b/mm/slub.c
index da141e5974f2..11a2df00729e 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -672,15 +672,15 @@ static void print_trailer(struct kmem_cache *s, struct page *page, u8 *p)
 	       p, p - addr, get_freepointer(s, p));
 
 	if (s->flags & SLAB_RED_ZONE)
-		print_section(KERN_ERR, "Redzone ", p - s->red_left_pad,
+		print_section(KERN_ERR, "Redzone  ", p - s->red_left_pad,
 			      s->red_left_pad);
 	else if (p > addr + 16)
 		print_section(KERN_ERR, "Bytes b4 ", p - 16, 16);
 
-	print_section(KERN_ERR, "Object ", p,
+	print_section(KERN_ERR,         "Object   ", p,
 		      min_t(unsigned int, s->object_size, PAGE_SIZE));
 	if (s->flags & SLAB_RED_ZONE)
-		print_section(KERN_ERR, "Redzone ", p + s->object_size,
+		print_section(KERN_ERR, "Redzone  ", p + s->object_size,
 			s->inuse - s->object_size);
 
 	if (s->offset)
@@ -695,7 +695,7 @@ static void print_trailer(struct kmem_cache *s, struct page *page, u8 *p)
 
 	if (off != size_from_object(s))
 		/* Beginning of the filler is the free pointer */
-		print_section(KERN_ERR, "Padding ", p + off,
+		print_section(KERN_ERR, "Padding  ", p + off,
 			      size_from_object(s) - off);
 
 	dump_stack();
@@ -873,11 +873,11 @@ static int check_object(struct kmem_cache *s, struct page *page,
 	u8 *endobject = object + s->object_size;
 
 	if (s->flags & SLAB_RED_ZONE) {
-		if (!check_bytes_and_report(s, page, object, "Redzone",
+		if (!check_bytes_and_report(s, page, object, "Left Redzone",
 			object - s->red_left_pad, val, s->red_left_pad))
 			return 0;
 
-		if (!check_bytes_and_report(s, page, object, "Redzone",
+		if (!check_bytes_and_report(s, page, object, "Right Redzone",
 			endobject, val, s->inuse - s->object_size))
 			return 0;
 	} else {
@@ -892,7 +892,7 @@ static int check_object(struct kmem_cache *s, struct page *page,
 		if (val != SLUB_RED_ACTIVE && (s->flags & __OBJECT_POISON) &&
 			(!check_bytes_and_report(s, page, p, "Poison", p,
 					POISON_FREE, s->object_size - 1) ||
-			 !check_bytes_and_report(s, page, p, "Poison",
+			 !check_bytes_and_report(s, page, p, "End Poison",
 				p + s->object_size - 1, POISON_END, 1)))
 			return 0;
 		/*

commit 84fc1c944e45ab317e2e70a0e7f76fa2a5e43b6e
Author: Nikolay Aleksandrov <nikolay@nvidia.com>
Date:   Thu Jun 10 15:04:11 2021 +0300

    net: bridge: fix vlan tunnel dst refcnt when egressing
    
    commit cfc579f9d89af4ada58c69b03bcaa4887840f3b3 upstream.
    
    The egress tunnel code uses dst_clone() and directly sets the result
    which is wrong because the entry might have 0 refcnt or be already deleted,
    causing number of problems. It also triggers the WARN_ON() in dst_hold()[1]
    when a refcnt couldn't be taken. Fix it by using dst_hold_safe() and
    checking if a reference was actually taken before setting the dst.
    
    [1] dmesg WARN_ON log and following refcnt errors
     WARNING: CPU: 5 PID: 38 at include/net/dst.h:230 br_handle_egress_vlan_tunnel+0x10b/0x134 [bridge]
     Modules linked in: 8021q garp mrp bridge stp llc bonding ipv6 virtio_net
     CPU: 5 PID: 38 Comm: ksoftirqd/5 Kdump: loaded Tainted: G        W         5.13.0-rc3+ #360
     Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-1.fc33 04/01/2014
     RIP: 0010:br_handle_egress_vlan_tunnel+0x10b/0x134 [bridge]
     Code: e8 85 bc 01 e1 45 84 f6 74 90 45 31 f6 85 db 48 c7 c7 a0 02 19 a0 41 0f 94 c6 31 c9 31 d2 44 89 f6 e8 64 bc 01 e1 85 db 75 02 <0f> 0b 31 c9 31 d2 44 89 f6 48 c7 c7 70 02 19 a0 e8 4b bc 01 e1 49
     RSP: 0018:ffff8881003d39e8 EFLAGS: 00010246
     RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
     RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffffffffa01902a0
     RBP: ffff8881040c6700 R08: 0000000000000000 R09: 0000000000000001
     R10: 2ce93d0054fe0d00 R11: 54fe0d00000e0000 R12: ffff888109515000
     R13: 0000000000000000 R14: 0000000000000001 R15: 0000000000000401
     FS:  0000000000000000(0000) GS:ffff88822bf40000(0000) knlGS:0000000000000000
     CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
     CR2: 00007f42ba70f030 CR3: 0000000109926000 CR4: 00000000000006e0
     Call Trace:
      br_handle_vlan+0xbc/0xca [bridge]
      __br_forward+0x23/0x164 [bridge]
      deliver_clone+0x41/0x48 [bridge]
      br_handle_frame_finish+0x36f/0x3aa [bridge]
      ? skb_dst+0x2e/0x38 [bridge]
      ? br_handle_ingress_vlan_tunnel+0x3e/0x1c8 [bridge]
      ? br_handle_frame_finish+0x3aa/0x3aa [bridge]
      br_handle_frame+0x2c3/0x377 [bridge]
      ? __skb_pull+0x33/0x51
      ? vlan_do_receive+0x4f/0x36a
      ? br_handle_frame_finish+0x3aa/0x3aa [bridge]
      __netif_receive_skb_core+0x539/0x7c6
      ? __list_del_entry_valid+0x16e/0x1c2
      __netif_receive_skb_list_core+0x6d/0xd6
      netif_receive_skb_list_internal+0x1d9/0x1fa
      gro_normal_list+0x22/0x3e
      dev_gro_receive+0x55b/0x600
      ? detach_buf_split+0x58/0x140
      napi_gro_receive+0x94/0x12e
      virtnet_poll+0x15d/0x315 [virtio_net]
      __napi_poll+0x2c/0x1c9
      net_rx_action+0xe6/0x1fb
      __do_softirq+0x115/0x2d8
      run_ksoftirqd+0x18/0x20
      smpboot_thread_fn+0x183/0x19c
      ? smpboot_unregister_percpu_thread+0x66/0x66
      kthread+0x10a/0x10f
      ? kthread_mod_delayed_work+0xb6/0xb6
      ret_from_fork+0x22/0x30
     ---[ end trace 49f61b07f775fd2b ]---
     dst_release: dst:00000000c02d677a refcnt:-1
     dst_release underflow
    
    Cc: stable@vger.kernel.org
    Fixes: 11538d039ac6 ("bridge: vlan dst_metadata hooks in ingress and egress paths")
    Signed-off-by: Nikolay Aleksandrov <nikolay@nvidia.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/bridge/br_vlan_tunnel.c b/net/bridge/br_vlan_tunnel.c
index 4d5100677c68..adb6845ceba4 100644
--- a/net/bridge/br_vlan_tunnel.c
+++ b/net/bridge/br_vlan_tunnel.c
@@ -208,8 +208,8 @@ int br_handle_egress_vlan_tunnel(struct sk_buff *skb,
 		return err;
 
 	tunnel_dst = rcu_dereference(vlan->tinfo.tunnel_dst);
-	if (tunnel_dst)
-		skb_dst_set(skb, dst_clone(&tunnel_dst->dst));
+	if (tunnel_dst && dst_hold_safe(&tunnel_dst->dst))
+		skb_dst_set(skb, &tunnel_dst->dst);
 
 	return 0;
 }

commit 24a6e55f17aa123bc1fc54b7d3c410b41bc16530
Author: Nikolay Aleksandrov <nikolay@nvidia.com>
Date:   Thu Jun 10 15:04:10 2021 +0300

    net: bridge: fix vlan tunnel dst null pointer dereference
    
    commit 58e2071742e38f29f051b709a5cca014ba51166f upstream.
    
    This patch fixes a tunnel_dst null pointer dereference due to lockless
    access in the tunnel egress path. When deleting a vlan tunnel the
    tunnel_dst pointer is set to NULL without waiting a grace period (i.e.
    while it's still usable) and packets egressing are dereferencing it
    without checking. Use READ/WRITE_ONCE to annotate the lockless use of
    tunnel_id, use RCU for accessing tunnel_dst and make sure it is read
    only once and checked in the egress path. The dst is already properly RCU
    protected so we don't need to do anything fancy than to make sure
    tunnel_id and tunnel_dst are read only once and checked in the egress path.
    
    Cc: stable@vger.kernel.org
    Fixes: 11538d039ac6 ("bridge: vlan dst_metadata hooks in ingress and egress paths")
    Signed-off-by: Nikolay Aleksandrov <nikolay@nvidia.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index 33b8222db75c..7ca3b469242e 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -100,8 +100,8 @@ struct br_vlan_stats {
 };
 
 struct br_tunnel_info {
-	__be64			tunnel_id;
-	struct metadata_dst	*tunnel_dst;
+	__be64				tunnel_id;
+	struct metadata_dst __rcu	*tunnel_dst;
 };
 
 /**
diff --git a/net/bridge/br_vlan_tunnel.c b/net/bridge/br_vlan_tunnel.c
index 6d2c4eed2dc8..4d5100677c68 100644
--- a/net/bridge/br_vlan_tunnel.c
+++ b/net/bridge/br_vlan_tunnel.c
@@ -46,26 +46,33 @@ static struct net_bridge_vlan *br_vlan_tunnel_lookup(struct rhashtable *tbl,
 				      br_vlan_tunnel_rht_params);
 }
 
+static void vlan_tunnel_info_release(struct net_bridge_vlan *vlan)
+{
+	struct metadata_dst *tdst = rtnl_dereference(vlan->tinfo.tunnel_dst);
+
+	WRITE_ONCE(vlan->tinfo.tunnel_id, 0);
+	RCU_INIT_POINTER(vlan->tinfo.tunnel_dst, NULL);
+	dst_release(&tdst->dst);
+}
+
 void vlan_tunnel_info_del(struct net_bridge_vlan_group *vg,
 			  struct net_bridge_vlan *vlan)
 {
-	if (!vlan->tinfo.tunnel_dst)
+	if (!rcu_access_pointer(vlan->tinfo.tunnel_dst))
 		return;
 	rhashtable_remove_fast(&vg->tunnel_hash, &vlan->tnode,
 			       br_vlan_tunnel_rht_params);
-	vlan->tinfo.tunnel_id = 0;
-	dst_release(&vlan->tinfo.tunnel_dst->dst);
-	vlan->tinfo.tunnel_dst = NULL;
+	vlan_tunnel_info_release(vlan);
 }
 
 static int __vlan_tunnel_info_add(struct net_bridge_vlan_group *vg,
 				  struct net_bridge_vlan *vlan, u32 tun_id)
 {
-	struct metadata_dst *metadata = NULL;
+	struct metadata_dst *metadata = rtnl_dereference(vlan->tinfo.tunnel_dst);
 	__be64 key = key32_to_tunnel_id(cpu_to_be32(tun_id));
 	int err;
 
-	if (vlan->tinfo.tunnel_dst)
+	if (metadata)
 		return -EEXIST;
 
 	metadata = __ip_tun_set_dst(0, 0, 0, 0, 0, TUNNEL_KEY,
@@ -74,8 +81,8 @@ static int __vlan_tunnel_info_add(struct net_bridge_vlan_group *vg,
 		return -EINVAL;
 
 	metadata->u.tun_info.mode |= IP_TUNNEL_INFO_TX | IP_TUNNEL_INFO_BRIDGE;
-	vlan->tinfo.tunnel_dst = metadata;
-	vlan->tinfo.tunnel_id = key;
+	rcu_assign_pointer(vlan->tinfo.tunnel_dst, metadata);
+	WRITE_ONCE(vlan->tinfo.tunnel_id, key);
 
 	err = rhashtable_lookup_insert_fast(&vg->tunnel_hash, &vlan->tnode,
 					    br_vlan_tunnel_rht_params);
@@ -84,9 +91,7 @@ static int __vlan_tunnel_info_add(struct net_bridge_vlan_group *vg,
 
 	return 0;
 out:
-	dst_release(&vlan->tinfo.tunnel_dst->dst);
-	vlan->tinfo.tunnel_dst = NULL;
-	vlan->tinfo.tunnel_id = 0;
+	vlan_tunnel_info_release(vlan);
 
 	return err;
 }
@@ -186,12 +191,15 @@ int br_handle_ingress_vlan_tunnel(struct sk_buff *skb,
 int br_handle_egress_vlan_tunnel(struct sk_buff *skb,
 				 struct net_bridge_vlan *vlan)
 {
+	struct metadata_dst *tunnel_dst;
+	__be64 tunnel_id;
 	int err;
 
-	if (!vlan || !vlan->tinfo.tunnel_id)
+	if (!vlan)
 		return 0;
 
-	if (unlikely(!skb_vlan_tag_present(skb)))
+	tunnel_id = READ_ONCE(vlan->tinfo.tunnel_id);
+	if (!tunnel_id || unlikely(!skb_vlan_tag_present(skb)))
 		return 0;
 
 	skb_dst_drop(skb);
@@ -199,7 +207,9 @@ int br_handle_egress_vlan_tunnel(struct sk_buff *skb,
 	if (err)
 		return err;
 
-	skb_dst_set(skb, dst_clone(&vlan->tinfo.tunnel_dst->dst));
+	tunnel_dst = rcu_dereference(vlan->tinfo.tunnel_dst);
+	if (tunnel_dst)
+		skb_dst_set(skb, dst_clone(&tunnel_dst->dst));
 
 	return 0;
 }

commit 534fb8a871c4fa3218303118c38b4e304f8a9fd6
Author: Johannes Berg <johannes.berg@intel.com>
Date:   Fri Jun 18 13:41:29 2021 +0300

    cfg80211: make certificate generation more robust
    
    commit b5642479b0f7168fe16d156913533fe65ab4f8d5 upstream.
    
    If all net/wireless/certs/*.hex files are deleted, the build
    will hang at this point since the 'cat' command will have no
    arguments. Do "echo | cat - ..." so that even if the "..."
    part is empty, the whole thing won't hang.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
    Link: https://lore.kernel.org/r/iwlwifi.20210618133832.c989056c3664.Ic3b77531d00b30b26dcd69c64e55ae2f60c3f31e@changeid
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/wireless/Makefile b/net/wireless/Makefile
index 8158b375d170..4500ad5f2a61 100644
--- a/net/wireless/Makefile
+++ b/net/wireless/Makefile
@@ -27,7 +27,7 @@ $(obj)/shipped-certs.c: $(wildcard $(srctree)/$(src)/certs/*.hex)
 	@$(kecho) "  GEN     $@"
 	@(echo '#include "reg.h"'; \
 	  echo 'const u8 shipped_regdb_certs[] = {'; \
-	  cat $^ ; \
+	  echo | cat - $^ ; \
 	  echo '};'; \
 	  echo 'unsigned int shipped_regdb_certs_len = sizeof(shipped_regdb_certs);'; \
 	 ) > $@

commit 3d1224a9126521a0984e9858106b6180a24326e8
Author: Bumyong Lee <bumyong.lee@samsung.com>
Date:   Fri May 7 15:36:47 2021 +0900

    dmaengine: pl330: fix wrong usage of spinlock flags in dma_cyclc
    
    commit 4ad5dd2d7876d79507a20f026507d1a93b8fff10 upstream.
    
    flags varible which is the input parameter of pl330_prep_dma_cyclic()
    should not be used by spinlock_irq[save/restore] function.
    
    Signed-off-by: Jongho Park <jongho7.park@samsung.com>
    Signed-off-by: Bumyong Lee <bumyong.lee@samsung.com>
    Signed-off-by: Chanho Park <chanho61.park@samsung.com>
    Link: https://lore.kernel.org/r/20210507063647.111209-1-chanho61.park@samsung.com
    Fixes: f6f2421c0a1c ("dmaengine: pl330: Merge dma_pl330_dmac and pl330_dmac structs")
    Cc: stable@vger.kernel.org
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c
index 15b30d2d8f7e..816630505294 100644
--- a/drivers/dma/pl330.c
+++ b/drivers/dma/pl330.c
@@ -2671,13 +2671,15 @@ static struct dma_async_tx_descriptor *pl330_prep_dma_cyclic(
 	for (i = 0; i < len / period_len; i++) {
 		desc = pl330_get_desc(pch);
 		if (!desc) {
+			unsigned long iflags;
+
 			dev_err(pch->dmac->ddma.dev, "%s:%d Unable to fetch desc\n",
 				__func__, __LINE__);
 
 			if (!first)
 				return NULL;
 
-			spin_lock_irqsave(&pl330->pool_lock, flags);
+			spin_lock_irqsave(&pl330->pool_lock, iflags);
 
 			while (!list_empty(&first->node)) {
 				desc = list_entry(first->node.next,
@@ -2687,7 +2689,7 @@ static struct dma_async_tx_descriptor *pl330_prep_dma_cyclic(
 
 			list_move_tail(&first->node, &pl330->desc_pool);
 
-			spin_unlock_irqrestore(&pl330->pool_lock, flags);
+			spin_unlock_irqrestore(&pl330->pool_lock, iflags);
 
 			return NULL;
 		}

commit f2f1b3a34f06424b4b67fce30be2347d4fe5a213
Author: Vineet Gupta <vgupta@synopsys.com>
Date:   Tue Jun 8 19:39:25 2021 -0700

    ARCv2: save ABI registers across signal handling
    
    commit 96f1b00138cb8f04c742c82d0a7c460b2202e887 upstream.
    
    ARCv2 has some configuration dependent registers (r30, r58, r59) which
    could be targetted by the compiler. To keep the ABI stable, these were
    unconditionally part of the glibc ABI
    (sysdeps/unix/sysv/linux/arc/sys/ucontext.h:mcontext_t) however we
    missed populating them (by saving/restoring them across signal
    handling).
    
    This patch fixes the issue by
     - adding arcv2 ABI regs to kernel struct sigcontext
     - populating them during signal handling
    
    Change to struct sigcontext might seem like a glibc ABI change (although
    it primarily uses ucontext_t:mcontext_t) but the fact is
     - it has only been extended (existing fields are not touched)
     - the old sigcontext was ABI incomplete to begin with anyways
    
    Fixes: https://github.com/foss-for-synopsys-dwc-arc-processors/linux/issues/53
    Cc: <stable@vger.kernel.org>
    Tested-by: kernel test robot <lkp@intel.com>
    Reported-by: Vladimir Isaev <isaev@synopsys.com>
    Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arc/include/uapi/asm/sigcontext.h b/arch/arc/include/uapi/asm/sigcontext.h
index 95f8a4380e11..7a5449dfcb29 100644
--- a/arch/arc/include/uapi/asm/sigcontext.h
+++ b/arch/arc/include/uapi/asm/sigcontext.h
@@ -18,6 +18,7 @@
  */
 struct sigcontext {
 	struct user_regs_struct regs;
+	struct user_regs_arcv2 v2abi;
 };
 
 #endif /* _ASM_ARC_SIGCONTEXT_H */
diff --git a/arch/arc/kernel/signal.c b/arch/arc/kernel/signal.c
index da243420bcb5..68901f6f18ba 100644
--- a/arch/arc/kernel/signal.c
+++ b/arch/arc/kernel/signal.c
@@ -64,6 +64,41 @@ struct rt_sigframe {
 	unsigned int sigret_magic;
 };
 
+static int save_arcv2_regs(struct sigcontext *mctx, struct pt_regs *regs)
+{
+	int err = 0;
+#ifndef CONFIG_ISA_ARCOMPACT
+	struct user_regs_arcv2 v2abi;
+
+	v2abi.r30 = regs->r30;
+#ifdef CONFIG_ARC_HAS_ACCL_REGS
+	v2abi.r58 = regs->r58;
+	v2abi.r59 = regs->r59;
+#else
+	v2abi.r58 = v2abi.r59 = 0;
+#endif
+	err = __copy_to_user(&mctx->v2abi, &v2abi, sizeof(v2abi));
+#endif
+	return err;
+}
+
+static int restore_arcv2_regs(struct sigcontext *mctx, struct pt_regs *regs)
+{
+	int err = 0;
+#ifndef CONFIG_ISA_ARCOMPACT
+	struct user_regs_arcv2 v2abi;
+
+	err = __copy_from_user(&v2abi, &mctx->v2abi, sizeof(v2abi));
+
+	regs->r30 = v2abi.r30;
+#ifdef CONFIG_ARC_HAS_ACCL_REGS
+	regs->r58 = v2abi.r58;
+	regs->r59 = v2abi.r59;
+#endif
+#endif
+	return err;
+}
+
 static int
 stash_usr_regs(struct rt_sigframe __user *sf, struct pt_regs *regs,
 	       sigset_t *set)
@@ -97,6 +132,10 @@ stash_usr_regs(struct rt_sigframe __user *sf, struct pt_regs *regs,
 
 	err = __copy_to_user(&(sf->uc.uc_mcontext.regs.scratch), &uregs.scratch,
 			     sizeof(sf->uc.uc_mcontext.regs.scratch));
+
+	if (is_isa_arcv2())
+		err |= save_arcv2_regs(&(sf->uc.uc_mcontext), regs);
+
 	err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(sigset_t));
 
 	return err ? -EFAULT : 0;
@@ -112,6 +151,10 @@ static int restore_usr_regs(struct pt_regs *regs, struct rt_sigframe __user *sf)
 	err |= __copy_from_user(&uregs.scratch,
 				&(sf->uc.uc_mcontext.regs.scratch),
 				sizeof(sf->uc.uc_mcontext.regs.scratch));
+
+	if (is_isa_arcv2())
+		err |= restore_arcv2_regs(&(sf->uc.uc_mcontext), regs);
+
 	if (err)
 		return -EFAULT;
 

commit 5489a33c043744f55737ab3eb53949029d1d7f64
Author: Chiqijun <chiqijun@huawei.com>
Date:   Mon May 24 17:44:07 2021 -0500

    PCI: Work around Huawei Intelligent NIC VF FLR erratum
    
    commit ce00322c2365e1f7b0312f2f493539c833465d97 upstream.
    
    pcie_flr() starts a Function Level Reset (FLR), waits 100ms (the maximum
    time allowed for FLR completion by PCIe r5.0, sec 6.6.2), and waits for the
    FLR to complete.  It assumes the FLR is complete when a config read returns
    valid data.
    
    When we do an FLR on several Huawei Intelligent NIC VFs at the same time,
    firmware on the NIC processes them serially.  The VF may respond to config
    reads before the firmware has completed its reset processing.  If we bind a
    driver to the VF (e.g., by assigning the VF to a virtual machine) in the
    interval between the successful config read and completion of the firmware
    reset processing, the NIC VF driver may fail to load.
    
    Prevent this driver failure by waiting for the NIC firmware to complete its
    reset processing.  Not all NIC firmware supports this feature.
    
    [bhelgaas: commit log]
    Link: https://support.huawei.com/enterprise/en/doc/EDOC1100063073/87950645/vm-oss-occasionally-fail-to-load-the-in200-driver-when-the-vf-performs-flr
    Link: https://lore.kernel.org/r/20210414132301.1793-1-chiqijun@huawei.com
    Signed-off-by: Chiqijun <chiqijun@huawei.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Alex Williamson <alex.williamson@redhat.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index c5141b0542d1..576b5bb6b95f 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -3897,6 +3897,69 @@ static int delay_250ms_after_flr(struct pci_dev *dev, int probe)
 	return 0;
 }
 
+#define PCI_DEVICE_ID_HINIC_VF      0x375E
+#define HINIC_VF_FLR_TYPE           0x1000
+#define HINIC_VF_FLR_CAP_BIT        (1UL << 30)
+#define HINIC_VF_OP                 0xE80
+#define HINIC_VF_FLR_PROC_BIT       (1UL << 18)
+#define HINIC_OPERATION_TIMEOUT     15000	/* 15 seconds */
+
+/* Device-specific reset method for Huawei Intelligent NIC virtual functions */
+static int reset_hinic_vf_dev(struct pci_dev *pdev, int probe)
+{
+	unsigned long timeout;
+	void __iomem *bar;
+	u32 val;
+
+	if (probe)
+		return 0;
+
+	bar = pci_iomap(pdev, 0, 0);
+	if (!bar)
+		return -ENOTTY;
+
+	/* Get and check firmware capabilities */
+	val = ioread32be(bar + HINIC_VF_FLR_TYPE);
+	if (!(val & HINIC_VF_FLR_CAP_BIT)) {
+		pci_iounmap(pdev, bar);
+		return -ENOTTY;
+	}
+
+	/* Set HINIC_VF_FLR_PROC_BIT for the start of FLR */
+	val = ioread32be(bar + HINIC_VF_OP);
+	val = val | HINIC_VF_FLR_PROC_BIT;
+	iowrite32be(val, bar + HINIC_VF_OP);
+
+	pcie_flr(pdev);
+
+	/*
+	 * The device must recapture its Bus and Device Numbers after FLR
+	 * in order generate Completions.  Issue a config write to let the
+	 * device capture this information.
+	 */
+	pci_write_config_word(pdev, PCI_VENDOR_ID, 0);
+
+	/* Firmware clears HINIC_VF_FLR_PROC_BIT when reset is complete */
+	timeout = jiffies + msecs_to_jiffies(HINIC_OPERATION_TIMEOUT);
+	do {
+		val = ioread32be(bar + HINIC_VF_OP);
+		if (!(val & HINIC_VF_FLR_PROC_BIT))
+			goto reset_complete;
+		msleep(20);
+	} while (time_before(jiffies, timeout));
+
+	val = ioread32be(bar + HINIC_VF_OP);
+	if (!(val & HINIC_VF_FLR_PROC_BIT))
+		goto reset_complete;
+
+	pci_warn(pdev, "Reset dev timeout, FLR ack reg: %#010x\n", val);
+
+reset_complete:
+	pci_iounmap(pdev, bar);
+
+	return 0;
+}
+
 static const struct pci_dev_reset_methods pci_dev_reset_methods[] = {
 	{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82599_SFP_VF,
 		 reset_intel_82599_sfp_virtfn },
@@ -3908,6 +3971,8 @@ static const struct pci_dev_reset_methods pci_dev_reset_methods[] = {
 	{ PCI_VENDOR_ID_INTEL, 0x0953, delay_250ms_after_flr },
 	{ PCI_VENDOR_ID_CHELSIO, PCI_ANY_ID,
 		reset_chelsio_generic_dev },
+	{ PCI_VENDOR_ID_HUAWEI, PCI_DEVICE_ID_HINIC_VF,
+		reset_hinic_vf_dev },
 	{ 0 }
 };
 

commit 0f359bbf2ed7f40871773cb92ea6f7b22f5c746c
Author: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
Date:   Fri May 21 21:13:17 2021 -0400

    PCI: Add ACS quirk for Broadcom BCM57414 NIC
    
    commit db2f77e2bd99dbd2fb23ddde58f0fae392fe3338 upstream.
    
    The Broadcom BCM57414 NIC may be a multi-function device.  While it does
    not advertise an ACS capability, peer-to-peer transactions are not possible
    between the individual functions, so it is safe to treat them as fully
    isolated.
    
    Add an ACS quirk for this device so the functions can be in independent
    IOMMU groups and attached individually to userspace applications using
    VFIO.
    
    [bhelgaas: commit log]
    Link: https://lore.kernel.org/r/1621645997-16251-1-git-send-email-michael.chan@broadcom.com
    Signed-off-by: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
    Signed-off-by: Michael Chan <michael.chan@broadcom.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 285b361831ec..c5141b0542d1 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -4711,6 +4711,8 @@ static const struct pci_dev_acs_enabled {
 	{ PCI_VENDOR_ID_AMPERE, 0xE00A, pci_quirk_xgene_acs },
 	{ PCI_VENDOR_ID_AMPERE, 0xE00B, pci_quirk_xgene_acs },
 	{ PCI_VENDOR_ID_AMPERE, 0xE00C, pci_quirk_xgene_acs },
+	/* Broadcom multi-function device */
+	{ PCI_VENDOR_ID_BROADCOM, 0x16D7, pci_quirk_mf_endpoint_acs },
 	{ PCI_VENDOR_ID_BROADCOM, 0xD714, pci_quirk_brcm_acs },
 	{ 0 }
 };

commit 4e54f2b2cf0188d1efd7ad189d99830fcbc5aad6
Author: Shanker Donthineni <sdonthineni@nvidia.com>
Date:   Tue Jun 8 11:18:56 2021 +0530

    PCI: Mark some NVIDIA GPUs to avoid bus reset
    
    commit 4c207e7121fa92b66bf1896bf8ccb9edfb0f9731 upstream.
    
    Some NVIDIA GPU devices do not work with SBR.  Triggering SBR leaves the
    device inoperable for the current system boot. It requires a system
    hard-reboot to get the GPU device back to normal operating condition
    post-SBR. For the affected devices, enable NO_BUS_RESET quirk to avoid the
    issue.
    
    This issue will be fixed in the next generation of hardware.
    
    Link: https://lore.kernel.org/r/20210608054857.18963-8-ameynarkhede03@gmail.com
    Signed-off-by: Shanker Donthineni <sdonthineni@nvidia.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Sinan Kaya <okaya@kernel.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index bc4858b056f9..285b361831ec 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -3463,6 +3463,18 @@ static void quirk_no_bus_reset(struct pci_dev *dev)
 	dev->dev_flags |= PCI_DEV_FLAGS_NO_BUS_RESET;
 }
 
+/*
+ * Some NVIDIA GPU devices do not work with bus reset, SBR needs to be
+ * prevented for those affected devices.
+ */
+static void quirk_nvidia_no_bus_reset(struct pci_dev *dev)
+{
+	if ((dev->device & 0xffc0) == 0x2340)
+		quirk_no_bus_reset(dev);
+}
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID,
+			 quirk_nvidia_no_bus_reset);
+
 /*
  * Some Atheros AR9xxx and QCA988x chips do not behave after a bus reset.
  * The device will throw a Link Down error on AER-capable systems and

commit cb985bd818bc77b91947be14304c2231255829ac
Author: Antti Järvinen <antti.jarvinen@gmail.com>
Date:   Mon Mar 15 10:26:06 2021 +0000

    PCI: Mark TI C667X to avoid bus reset
    
    commit b5cf198e74a91073d12839a3e2db99994a39995d upstream.
    
    Some TI KeyStone C667X devices do not support bus/hot reset.  The PCIESS
    automatically disables LTSSM when Secondary Bus Reset is received and
    device stops working.  Prevent bus reset for these devices.  With this
    change, the device can be assigned to VMs with VFIO, but it will leak state
    between VMs.
    
    Reference: https://e2e.ti.com/support/processors/f/791/t/954382
    Link: https://lore.kernel.org/r/20210315102606.17153-1-antti.jarvinen@gmail.com
    Signed-off-by: Antti Järvinen <antti.jarvinen@gmail.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Kishon Vijay Abraham I <kishon@ti.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 70f05595da60..bc4858b056f9 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -3483,6 +3483,16 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0034, quirk_no_bus_reset);
  */
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_CAVIUM, 0xa100, quirk_no_bus_reset);
 
+/*
+ * Some TI KeyStone C667X devices do not support bus/hot reset.  The PCIESS
+ * automatically disables LTSSM when Secondary Bus Reset is received and
+ * the device stops working.  Prevent bus reset for these devices.  With
+ * this change, the device can be assigned to VMs with VFIO, but it will
+ * leak state between VMs.  Reference
+ * https://e2e.ti.com/support/processors/f/791/t/954382
+ */
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TI, 0xb005, quirk_no_bus_reset);
+
 static void quirk_no_pm_reset(struct pci_dev *dev)
 {
 	/*

commit 79197fb7aea98e5b5084c9c1489064a4b4d51494
Author: Steven Rostedt (VMware) <rostedt@goodmis.org>
Date:   Thu Jun 17 17:12:35 2021 -0400

    tracing: Do no increment trace_clock_global() by one
    
    commit 89529d8b8f8daf92d9979382b8d2eb39966846ea upstream.
    
    The trace_clock_global() tries to make sure the events between CPUs is
    somewhat in order. A global value is used and updated by the latest read
    of a clock. If one CPU is ahead by a little, and is read by another CPU, a
    lock is taken, and if the timestamp of the other CPU is behind, it will
    simply use the other CPUs timestamp.
    
    The lock is also only taken with a "trylock" due to tracing, and strange
    recursions can happen. The lock is not taken at all in NMI context.
    
    In the case where the lock is not able to be taken, the non synced
    timestamp is returned. But it will not be less than the saved global
    timestamp.
    
    The problem arises because when the time goes "backwards" the time
    returned is the saved timestamp plus 1. If the lock is not taken, and the
    plus one to the timestamp is returned, there's a small race that can cause
    the time to go backwards!
    
            CPU0                            CPU1
            ----                            ----
                                    trace_clock_global() {
                                        ts = clock() [ 1000 ]
                                        trylock(clock_lock) [ success ]
                                        global_ts = ts; [ 1000 ]
    
                                        <interrupted by NMI>
     trace_clock_global() {
        ts = clock() [ 999 ]
        if (ts < global_ts)
            ts = global_ts + 1 [ 1001 ]
    
        trylock(clock_lock) [ fail ]
    
        return ts [ 1001]
     }
                                        unlock(clock_lock);
                                        return ts; [ 1000 ]
                                    }
    
     trace_clock_global() {
        ts = clock() [ 1000 ]
        if (ts < global_ts) [ false 1000 == 1000 ]
    
        trylock(clock_lock) [ success ]
        global_ts = ts; [ 1000 ]
        unlock(clock_lock)
    
        return ts; [ 1000 ]
     }
    
    The above case shows to reads of trace_clock_global() on the same CPU, but
    the second read returns one less than the first read. That is, time when
    backwards, and this is not what is allowed by trace_clock_global().
    
    This was triggered by heavy tracing and the ring buffer checker that tests
    for the clock going backwards:
    
     Ring buffer clock went backwards: 20613921464 -> 20613921463
     ------------[ cut here ]------------
     WARNING: CPU: 2 PID: 0 at kernel/trace/ring_buffer.c:3412 check_buffer+0x1b9/0x1c0
     Modules linked in:
     [..]
     [CPU: 2]TIME DOES NOT MATCH expected:20620711698 actual:20620711697 delta:6790234 before:20613921463 after:20613921463
       [20613915818] PAGE TIME STAMP
       [20613915818] delta:0
       [20613915819] delta:1
       [20613916035] delta:216
       [20613916465] delta:430
       [20613916575] delta:110
       [20613916749] delta:174
       [20613917248] delta:499
       [20613917333] delta:85
       [20613917775] delta:442
       [20613917921] delta:146
       [20613918321] delta:400
       [20613918568] delta:247
       [20613918768] delta:200
       [20613919306] delta:538
       [20613919353] delta:47
       [20613919980] delta:627
       [20613920296] delta:316
       [20613920571] delta:275
       [20613920862] delta:291
       [20613921152] delta:290
       [20613921464] delta:312
       [20613921464] delta:0 TIME EXTEND
       [20613921464] delta:0
    
    This happened more than once, and always for an off by one result. It also
    started happening after commit aafe104aa9096 was added.
    
    Cc: stable@vger.kernel.org
    Fixes: aafe104aa9096 ("tracing: Restructure trace_clock_global() to never block")
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/trace/trace_clock.c b/kernel/trace/trace_clock.c
index c1637f90c8a3..4702efb00ff2 100644
--- a/kernel/trace/trace_clock.c
+++ b/kernel/trace/trace_clock.c
@@ -115,9 +115,9 @@ u64 notrace trace_clock_global(void)
 	prev_time = READ_ONCE(trace_clock_struct.prev_time);
 	now = sched_clock_cpu(this_cpu);
 
-	/* Make sure that now is always greater than prev_time */
+	/* Make sure that now is always greater than or equal to prev_time */
 	if ((s64)(now - prev_time) < 0)
-		now = prev_time + 1;
+		now = prev_time;
 
 	/*
 	 * If in an NMI context then dont risk lockups and simply return
@@ -131,7 +131,7 @@ u64 notrace trace_clock_global(void)
 		/* Reread prev_time in case it was already updated */
 		prev_time = READ_ONCE(trace_clock_struct.prev_time);
 		if ((s64)(now - prev_time) < 0)
-			now = prev_time + 1;
+			now = prev_time;
 
 		trace_clock_struct.prev_time = now;
 

commit 04e7a7c95027e72bba8973e1c4b9b4a1b29f7a0c
Author: Steven Rostedt (VMware) <rostedt@goodmis.org>
Date:   Thu Jun 17 14:32:34 2021 -0400

    tracing: Do not stop recording comms if the trace file is being read
    
    commit 4fdd595e4f9a1ff6d93ec702eaecae451cfc6591 upstream.
    
    A while ago, when the "trace" file was opened, tracing was stopped, and
    code was added to stop recording the comms to saved_cmdlines, for mapping
    of the pids to the task name.
    
    Code has been added that only records the comm if a trace event occurred,
    and there's no reason to not trace it if the trace file is opened.
    
    Cc: stable@vger.kernel.org
    Fixes: 7ffbd48d5cab2 ("tracing: Cache comms only after an event occurred")
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 133cf8d125a3..71bc808fe03a 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -1743,9 +1743,6 @@ struct saved_cmdlines_buffer {
 };
 static struct saved_cmdlines_buffer *savedcmd;
 
-/* temporary disable recording */
-static atomic_t trace_record_taskinfo_disabled __read_mostly;
-
 static inline char *get_saved_cmdlines(int idx)
 {
 	return &savedcmd->saved_cmdlines[idx * TASK_COMM_LEN];
@@ -3259,9 +3256,6 @@ static void *s_start(struct seq_file *m, loff_t *pos)
 		return ERR_PTR(-EBUSY);
 #endif
 
-	if (!iter->snapshot)
-		atomic_inc(&trace_record_taskinfo_disabled);
-
 	if (*pos != iter->pos) {
 		iter->ent = NULL;
 		iter->cpu = 0;
@@ -3304,9 +3298,6 @@ static void s_stop(struct seq_file *m, void *p)
 		return;
 #endif
 
-	if (!iter->snapshot)
-		atomic_dec(&trace_record_taskinfo_disabled);
-
 	trace_access_unlock(iter->cpu_file);
 	trace_event_read_unlock();
 }

commit ae1fe292b314fbc1db9b1897d1f354c8f2e1931a
Author: Steven Rostedt (VMware) <rostedt@goodmis.org>
Date:   Thu Jun 17 13:47:25 2021 -0400

    tracing: Do not stop recording cmdlines when tracing is off
    
    commit 85550c83da421fb12dc1816c45012e1e638d2b38 upstream.
    
    The saved_cmdlines is used to map pids to the task name, such that the
    output of the tracing does not just show pids, but also gives a human
    readable name for the task.
    
    If the name is not mapped, the output looks like this:
    
        <...>-1316          [005] ...2   132.044039: ...
    
    Instead of this:
    
        gnome-shell-1316    [005] ...2   132.044039: ...
    
    The names are updated when tracing is running, but are skipped if tracing
    is stopped. Unfortunately, this stops the recording of the names if the
    top level tracer is stopped, and not if there's other tracers active.
    
    The recording of a name only happens when a new event is written into a
    ring buffer, so there is no need to test if tracing is on or not. If
    tracing is off, then no event is written and no need to test if tracing is
    off or not.
    
    Remove the check, as it hides the names of tasks for events in the
    instance buffers.
    
    Cc: stable@vger.kernel.org
    Fixes: 7ffbd48d5cab2 ("tracing: Cache comms only after an event occurred")
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index f8aaa7879d7d..133cf8d125a3 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -2031,8 +2031,6 @@ static bool tracing_record_taskinfo_skip(int flags)
 {
 	if (unlikely(!(flags & (TRACE_RECORD_CMDLINE | TRACE_RECORD_TGID))))
 		return true;
-	if (atomic_read(&trace_record_taskinfo_disabled) || !tracing_is_on())
-		return true;
 	if (!__this_cpu_read(trace_taskinfo_save))
 		return true;
 	return false;

commit f0a3391d574aff42c3107f1c570543b2c6adc32a
Author: Andrew Lunn <andrew@lunn.ch>
Date:   Mon Jun 14 17:55:23 2021 +0200

    usb: core: hub: Disable autosuspend for Cypress CY7C65632
    
    commit a7d8d1c7a7f73e780aa9ae74926ae5985b2f895f upstream.
    
    The Cypress CY7C65632 appears to have an issue with auto suspend and
    detecting devices, not too dissimilar to the SMSC 5534B hub. It is
    easiest to reproduce by connecting multiple mass storage devices to
    the hub at the same time. On a Lenovo Yoga, around 1 in 3 attempts
    result in the devices not being detected. It is however possible to
    make them appear using lsusb -v.
    
    Disabling autosuspend for this hub resolves the issue.
    
    Fixes: 1208f9e1d758 ("USB: hub: Fix the broken detection of USB3 device in SMSC hub")
    Cc: stable@vger.kernel.org
    Signed-off-by: Andrew Lunn <andrew@lunn.ch>
    Link: https://lore.kernel.org/r/20210614155524.2228800-1-andrew@lunn.ch
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 0ddc2e30065f..a7f16dbfffdf 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -38,6 +38,8 @@
 #define USB_VENDOR_GENESYS_LOGIC		0x05e3
 #define USB_VENDOR_SMSC				0x0424
 #define USB_PRODUCT_USB5534B			0x5534
+#define USB_VENDOR_CYPRESS			0x04b4
+#define USB_PRODUCT_CY7C65632			0x6570
 #define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND	0x01
 #define HUB_QUIRK_DISABLE_AUTOSUSPEND		0x02
 
@@ -5442,6 +5444,11 @@ static const struct usb_device_id hub_id_table[] = {
       .idProduct = USB_PRODUCT_USB5534B,
       .bInterfaceClass = USB_CLASS_HUB,
       .driver_info = HUB_QUIRK_DISABLE_AUTOSUSPEND},
+    { .match_flags = USB_DEVICE_ID_MATCH_VENDOR
+                   | USB_DEVICE_ID_MATCH_PRODUCT,
+      .idVendor = USB_VENDOR_CYPRESS,
+      .idProduct = USB_PRODUCT_CY7C65632,
+      .driver_info = HUB_QUIRK_DISABLE_AUTOSUSPEND},
     { .match_flags = USB_DEVICE_ID_MATCH_VENDOR
 			| USB_DEVICE_ID_MATCH_INT_CLASS,
       .idVendor = USB_VENDOR_GENESYS_LOGIC,

commit a115198caaab6d663bef75823a3c5f0802306d60
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Thu Jun 10 00:58:33 2021 +0300

    can: mcba_usb: fix memory leak in mcba_usb
    
    commit 91c02557174be7f72e46ed7311e3bea1939840b0 upstream.
    
    Syzbot reported memory leak in SocketCAN driver for Microchip CAN BUS
    Analyzer Tool. The problem was in unfreed usb_coherent.
    
    In mcba_usb_start() 20 coherent buffers are allocated and there is
    nothing, that frees them:
    
    1) In callback function the urb is resubmitted and that's all
    2) In disconnect function urbs are simply killed, but URB_FREE_BUFFER
       is not set (see mcba_usb_start) and this flag cannot be used with
       coherent buffers.
    
    Fail log:
    | [ 1354.053291][ T8413] mcba_usb 1-1:0.0 can0: device disconnected
    | [ 1367.059384][ T8420] kmemleak: 20 new suspected memory leaks (see /sys/kernel/debug/kmem)
    
    So, all allocated buffers should be freed with usb_free_coherent()
    explicitly
    
    NOTE:
    The same pattern for allocating and freeing coherent buffers
    is used in drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c
    
    Fixes: 51f3baad7de9 ("can: mcba_usb: Add support for Microchip CAN BUS Analyzer")
    Link: https://lore.kernel.org/r/20210609215833.30393-1-paskripkin@gmail.com
    Cc: linux-stable <stable@vger.kernel.org>
    Reported-and-tested-by: syzbot+57281c762a3922e14dfe@syzkaller.appspotmail.com
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/can/usb/mcba_usb.c b/drivers/net/can/usb/mcba_usb.c
index 896f5b022729..3215ba69a9e7 100644
--- a/drivers/net/can/usb/mcba_usb.c
+++ b/drivers/net/can/usb/mcba_usb.c
@@ -93,6 +93,8 @@ struct mcba_priv {
 	bool can_ka_first_pass;
 	bool can_speed_check;
 	atomic_t free_ctx_cnt;
+	void *rxbuf[MCBA_MAX_RX_URBS];
+	dma_addr_t rxbuf_dma[MCBA_MAX_RX_URBS];
 };
 
 /* CAN frame */
@@ -644,6 +646,7 @@ static int mcba_usb_start(struct mcba_priv *priv)
 	for (i = 0; i < MCBA_MAX_RX_URBS; i++) {
 		struct urb *urb = NULL;
 		u8 *buf;
+		dma_addr_t buf_dma;
 
 		/* create a URB, and a buffer for it */
 		urb = usb_alloc_urb(0, GFP_KERNEL);
@@ -653,7 +656,7 @@ static int mcba_usb_start(struct mcba_priv *priv)
 		}
 
 		buf = usb_alloc_coherent(priv->udev, MCBA_USB_RX_BUFF_SIZE,
-					 GFP_KERNEL, &urb->transfer_dma);
+					 GFP_KERNEL, &buf_dma);
 		if (!buf) {
 			netdev_err(netdev, "No memory left for USB buffer\n");
 			usb_free_urb(urb);
@@ -672,11 +675,14 @@ static int mcba_usb_start(struct mcba_priv *priv)
 		if (err) {
 			usb_unanchor_urb(urb);
 			usb_free_coherent(priv->udev, MCBA_USB_RX_BUFF_SIZE,
-					  buf, urb->transfer_dma);
+					  buf, buf_dma);
 			usb_free_urb(urb);
 			break;
 		}
 
+		priv->rxbuf[i] = buf;
+		priv->rxbuf_dma[i] = buf_dma;
+
 		/* Drop reference, USB core will take care of freeing it */
 		usb_free_urb(urb);
 	}
@@ -719,7 +725,14 @@ static int mcba_usb_open(struct net_device *netdev)
 
 static void mcba_urb_unlink(struct mcba_priv *priv)
 {
+	int i;
+
 	usb_kill_anchored_urbs(&priv->rx_submitted);
+
+	for (i = 0; i < MCBA_MAX_RX_URBS; ++i)
+		usb_free_coherent(priv->udev, MCBA_USB_RX_BUFF_SIZE,
+				  priv->rxbuf[i], priv->rxbuf_dma[i]);
+
 	usb_kill_anchored_urbs(&priv->tx_submitted);
 }
 

commit 8899857d7e450805e6410de5004126491f197146
Author: Norbert Slusarek <nslusarek@gmx.net>
Date:   Sat Jun 12 22:18:54 2021 +0200

    can: bcm: fix infoleak in struct bcm_msg_head
    
    commit 5e87ddbe3942e27e939bdc02deb8579b0cbd8ecc upstream.
    
    On 64-bit systems, struct bcm_msg_head has an added padding of 4 bytes between
    struct members count and ival1. Even though all struct members are initialized,
    the 4-byte hole will contain data from the kernel stack. This patch zeroes out
    struct bcm_msg_head before usage, preventing infoleaks to userspace.
    
    Fixes: ffd980f976e7 ("[CAN]: Add broadcast manager (bcm) protocol")
    Link: https://lore.kernel.org/r/trinity-7c1b2e82-e34f-4885-8060-2cd7a13769ce-1623532166177@3c-app-gmx-bs52
    Cc: linux-stable <stable@vger.kernel.org>
    Signed-off-by: Norbert Slusarek <nslusarek@gmx.net>
    Acked-by: Oliver Hartkopp <socketcan@hartkopp.net>
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/can/bcm.c b/net/can/bcm.c
index 79bb8afa9c0c..c82137fb2763 100644
--- a/net/can/bcm.c
+++ b/net/can/bcm.c
@@ -393,6 +393,7 @@ static void bcm_tx_timeout_tsklet(unsigned long data)
 		if (!op->count && (op->flags & TX_COUNTEVT)) {
 
 			/* create notification to user */
+			memset(&msg_head, 0, sizeof(msg_head));
 			msg_head.opcode  = TX_EXPIRED;
 			msg_head.flags   = op->flags;
 			msg_head.count   = op->count;
@@ -440,6 +441,7 @@ static void bcm_rx_changed(struct bcm_op *op, struct canfd_frame *data)
 	/* this element is not throttled anymore */
 	data->flags &= (BCM_CAN_FLAGS_MASK|RX_RECV);
 
+	memset(&head, 0, sizeof(head));
 	head.opcode  = RX_CHANGED;
 	head.flags   = op->flags;
 	head.count   = op->count;
@@ -554,6 +556,7 @@ static void bcm_rx_timeout_tsklet(unsigned long data)
 	struct bcm_msg_head msg_head;
 
 	/* create notification to user */
+	memset(&msg_head, 0, sizeof(msg_head));
 	msg_head.opcode  = RX_TIMEOUT;
 	msg_head.flags   = op->flags;
 	msg_head.count   = op->count;

commit e6a1d16ee37c60fc30272f88ac99bf34cd9de277
Author: Riwen Lu <luriwen@kylinos.cn>
Date:   Fri Jun 4 11:09:59 2021 +0800

    hwmon: (scpi-hwmon) shows the negative temperature properly
    
    [ Upstream commit 78d13552346289bad4a9bf8eabb5eec5e5a321a5 ]
    
    The scpi hwmon shows the sub-zero temperature in an unsigned integer,
    which would confuse the users when the machine works in low temperature
    environment. This shows the sub-zero temperature in an signed value and
    users can get it properly from sensors.
    
    Signed-off-by: Riwen Lu <luriwen@kylinos.cn>
    Tested-by: Xin Chen <chenxin@kylinos.cn>
    Link: https://lore.kernel.org/r/20210604030959.736379-1-luriwen@kylinos.cn
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hwmon/scpi-hwmon.c b/drivers/hwmon/scpi-hwmon.c
index 7e49da50bc69..562f3e287297 100644
--- a/drivers/hwmon/scpi-hwmon.c
+++ b/drivers/hwmon/scpi-hwmon.c
@@ -107,6 +107,15 @@ scpi_show_sensor(struct device *dev, struct device_attribute *attr, char *buf)
 
 	scpi_scale_reading(&value, sensor);
 
+	/*
+	 * Temperature sensor values are treated as signed values based on
+	 * observation even though that is not explicitly specified, and
+	 * because an unsigned u64 temperature does not really make practical
+	 * sense especially when the temperature is below zero degrees Celsius.
+	 */
+	if (sensor->info.class == TEMPERATURE)
+		return sprintf(buf, "%lld\n", (s64)value);
+
 	return sprintf(buf, "%llu\n", value);
 }
 

commit 8bc97e82cae1c2eb21150aabfece872d351d0642
Author: Chen Li <chenli@uniontech.com>
Date:   Fri Jun 4 16:43:02 2021 +0800

    radeon: use memcpy_to/fromio for UVD fw upload
    
    [ Upstream commit ab8363d3875a83f4901eb1cc00ce8afd24de6c85 ]
    
    I met a gpu addr bug recently and the kernel log
    tells me the pc is memcpy/memset and link register is
    radeon_uvd_resume.
    
    As we know, in some architectures, optimized memcpy/memset
    may not work well on device memory. Trival memcpy_toio/memset_io
    can fix this problem.
    
    BTW, amdgpu has already done it in:
    commit ba0b2275a678 ("drm/amdgpu: use memcpy_to/fromio for UVD fw upload"),
    that's why it has no this issue on the same gpu and platform.
    
    Signed-off-by: Chen Li <chenli@uniontech.com>
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c
index 95f4db70dd22..fde9c69ecc86 100644
--- a/drivers/gpu/drm/radeon/radeon_uvd.c
+++ b/drivers/gpu/drm/radeon/radeon_uvd.c
@@ -286,7 +286,7 @@ int radeon_uvd_resume(struct radeon_device *rdev)
 	if (rdev->uvd.vcpu_bo == NULL)
 		return -EINVAL;
 
-	memcpy(rdev->uvd.cpu_addr, rdev->uvd_fw->data, rdev->uvd_fw->size);
+	memcpy_toio((void __iomem *)rdev->uvd.cpu_addr, rdev->uvd_fw->data, rdev->uvd_fw->size);
 
 	size = radeon_bo_size(rdev->uvd.vcpu_bo);
 	size -= rdev->uvd_fw->size;
@@ -294,7 +294,7 @@ int radeon_uvd_resume(struct radeon_device *rdev)
 	ptr = rdev->uvd.cpu_addr;
 	ptr += rdev->uvd_fw->size;
 
-	memset(ptr, 0, size);
+	memset_io((void __iomem *)ptr, 0, size);
 
 	return 0;
 }

commit 349f4b6cd08e7b57cf235384034e5a6046bdc709
Author: Sergio Paracuellos <sergio.paracuellos@gmail.com>
Date:   Fri Jun 4 07:53:37 2021 +0200

    pinctrl: ralink: rt2880: avoid to error in calls is pin is already enabled
    
    [ Upstream commit eb367d875f94a228c17c8538e3f2efcf2eb07ead ]
    
    In 'rt2880_pmx_group_enable' driver is printing an error and returning
    -EBUSY if a pin has been already enabled. This begets anoying messages
    in the caller when this happens like the following:
    
    rt2880-pinmux pinctrl: pcie is already enabled
    mt7621-pci 1e140000.pcie: Error applying setting, reverse things back
    
    To avoid this just print the already enabled message in the pinctrl
    driver and return 0 instead to not confuse the user with a real
    bad problem.
    
    Signed-off-by: Sergio Paracuellos <sergio.paracuellos@gmail.com>
    Link: https://lore.kernel.org/r/20210604055337.20407-1-sergio.paracuellos@gmail.com
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/staging/mt7621-pinctrl/pinctrl-rt2880.c b/drivers/staging/mt7621-pinctrl/pinctrl-rt2880.c
index 80e7067cfb79..ad811c0438cc 100644
--- a/drivers/staging/mt7621-pinctrl/pinctrl-rt2880.c
+++ b/drivers/staging/mt7621-pinctrl/pinctrl-rt2880.c
@@ -127,7 +127,7 @@ static int rt2880_pmx_group_enable(struct pinctrl_dev *pctrldev,
 	if (p->groups[group].enabled) {
 		dev_err(p->dev, "%s is already enabled\n",
 			p->groups[group].name);
-		return -EBUSY;
+		return 0;
 	}
 
 	p->groups[group].enabled = 1;

commit d8c93d34a86a36bd2802154872b1565e5d7d58f5
Author: Jack Yu <jack.yu@realtek.com>
Date:   Thu May 27 01:06:51 2021 +0000

    ASoC: rt5659: Fix the lost powers for the HDA header
    
    [ Upstream commit 6308c44ed6eeadf65c0a7ba68d609773ed860fbb ]
    
    The power of "LDO2", "MICBIAS1" and "Mic Det Power" were powered off after
    the DAPM widgets were added, and these powers were set by the JD settings
    "RT5659_JD_HDA_HEADER" in the probe function. In the codec probe function,
    these powers were ignored to prevent them controlled by DAPM.
    
    Signed-off-by: Oder Chiou <oder_chiou@realtek.com>
    Signed-off-by: Jack Yu <jack.yu@realtek.com>
    Message-Id: <15fced51977b458798ca4eebf03dafb9@realtek.com>
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/codecs/rt5659.c b/sound/soc/codecs/rt5659.c
index b331b3ba61a9..ab73f84b5970 100644
--- a/sound/soc/codecs/rt5659.c
+++ b/sound/soc/codecs/rt5659.c
@@ -2473,13 +2473,18 @@ static int set_dmic_power(struct snd_soc_dapm_widget *w,
 	return 0;
 }
 
-static const struct snd_soc_dapm_widget rt5659_dapm_widgets[] = {
+static const struct snd_soc_dapm_widget rt5659_particular_dapm_widgets[] = {
 	SND_SOC_DAPM_SUPPLY("LDO2", RT5659_PWR_ANLG_3, RT5659_PWR_LDO2_BIT, 0,
 		NULL, 0),
-	SND_SOC_DAPM_SUPPLY("PLL", RT5659_PWR_ANLG_3, RT5659_PWR_PLL_BIT, 0,
-		NULL, 0),
+	SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5659_PWR_ANLG_2, RT5659_PWR_MB1_BIT,
+		0, NULL, 0),
 	SND_SOC_DAPM_SUPPLY("Mic Det Power", RT5659_PWR_VOL,
 		RT5659_PWR_MIC_DET_BIT, 0, NULL, 0),
+};
+
+static const struct snd_soc_dapm_widget rt5659_dapm_widgets[] = {
+	SND_SOC_DAPM_SUPPLY("PLL", RT5659_PWR_ANLG_3, RT5659_PWR_PLL_BIT, 0,
+		NULL, 0),
 	SND_SOC_DAPM_SUPPLY("Mono Vref", RT5659_PWR_ANLG_1,
 		RT5659_PWR_VREF3_BIT, 0, NULL, 0),
 
@@ -2504,8 +2509,6 @@ static const struct snd_soc_dapm_widget rt5659_dapm_widgets[] = {
 		RT5659_ADC_MONO_R_ASRC_SFT, 0, NULL, 0),
 
 	/* Input Side */
-	SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5659_PWR_ANLG_2, RT5659_PWR_MB1_BIT,
-		0, NULL, 0),
 	SND_SOC_DAPM_SUPPLY("MICBIAS2", RT5659_PWR_ANLG_2, RT5659_PWR_MB2_BIT,
 		0, NULL, 0),
 	SND_SOC_DAPM_SUPPLY("MICBIAS3", RT5659_PWR_ANLG_2, RT5659_PWR_MB3_BIT,
@@ -3700,10 +3703,23 @@ static int rt5659_set_bias_level(struct snd_soc_component *component,
 
 static int rt5659_probe(struct snd_soc_component *component)
 {
+	struct snd_soc_dapm_context *dapm =
+		snd_soc_component_get_dapm(component);
 	struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component);
 
 	rt5659->component = component;
 
+	switch (rt5659->pdata.jd_src) {
+	case RT5659_JD_HDA_HEADER:
+		break;
+
+	default:
+		snd_soc_dapm_new_controls(dapm,
+			rt5659_particular_dapm_widgets,
+			ARRAY_SIZE(rt5659_particular_dapm_widgets));
+		break;
+	}
+
 	return 0;
 }
 

commit 0260916843cc74f3906acf8b6f256693e01530a2
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Fri Jun 18 16:49:02 2021 +0300

    net: ethernet: fix potential use-after-free in ec_bhf_remove
    
    [ Upstream commit 9cca0c2d70149160407bda9a9446ce0c29b6e6c6 ]
    
    static void ec_bhf_remove(struct pci_dev *dev)
    {
    ...
            struct ec_bhf_priv *priv = netdev_priv(net_dev);
    
            unregister_netdev(net_dev);
            free_netdev(net_dev);
    
            pci_iounmap(dev, priv->dma_io);
            pci_iounmap(dev, priv->io);
    ...
    }
    
    priv is netdev private data, but it is used
    after free_netdev(). It can cause use-after-free when accessing priv
    pointer. So, fix it by moving free_netdev() after pci_iounmap()
    calls.
    
    Fixes: 6af55ff52b02 ("Driver for Beckhoff CX5020 EtherCAT master module.")
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/ec_bhf.c b/drivers/net/ethernet/ec_bhf.c
index d71cba0842c5..59dc20020c73 100644
--- a/drivers/net/ethernet/ec_bhf.c
+++ b/drivers/net/ethernet/ec_bhf.c
@@ -585,10 +585,12 @@ static void ec_bhf_remove(struct pci_dev *dev)
 	struct ec_bhf_priv *priv = netdev_priv(net_dev);
 
 	unregister_netdev(net_dev);
-	free_netdev(net_dev);
 
 	pci_iounmap(dev, priv->dma_io);
 	pci_iounmap(dev, priv->io);
+
+	free_netdev(net_dev);
+
 	pci_release_regions(dev);
 	pci_clear_master(dev);
 	pci_disable_device(dev);

commit 3bf50dc858f62b58f0aea9f62322e00d22115260
Author: Toke Høiland-Jørgensen <toke@redhat.com>
Date:   Fri Jun 18 13:04:35 2021 +0200

    icmp: don't send out ICMP messages with a source address of 0.0.0.0
    
    [ Upstream commit 321827477360934dc040e9d3c626bf1de6c3ab3c ]
    
    When constructing ICMP response messages, the kernel will try to pick a
    suitable source address for the outgoing packet. However, if no IPv4
    addresses are configured on the system at all, this will fail and we end up
    producing an ICMP message with a source address of 0.0.0.0. This can happen
    on a box routing IPv4 traffic via v6 nexthops, for instance.
    
    Since 0.0.0.0 is not generally routable on the internet, there's a good
    chance that such ICMP messages will never make it back to the sender of the
    original packet that the ICMP message was sent in response to. This, in
    turn, can create connectivity and PMTUd problems for senders. Fortunately,
    RFC7600 reserves a dummy address to be used as a source for ICMP
    messages (192.0.0.8/32), so let's teach the kernel to substitute that
    address as a last resort if the regular source address selection procedure
    fails.
    
    Below is a quick example reproducing this issue with network namespaces:
    
    ip netns add ns0
    ip l add type veth peer netns ns0
    ip l set dev veth0 up
    ip a add 10.0.0.1/24 dev veth0
    ip a add fc00:dead:cafe:42::1/64 dev veth0
    ip r add 10.1.0.0/24 via inet6 fc00:dead:cafe:42::2
    ip -n ns0 l set dev veth0 up
    ip -n ns0 a add fc00:dead:cafe:42::2/64 dev veth0
    ip -n ns0 r add 10.0.0.0/24 via inet6 fc00:dead:cafe:42::1
    ip netns exec ns0 sysctl -w net.ipv4.icmp_ratelimit=0
    ip netns exec ns0 sysctl -w net.ipv4.ip_forward=1
    tcpdump -tpni veth0 -c 2 icmp &
    ping -w 1 10.1.0.1 > /dev/null
    tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
    listening on veth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
    IP 10.0.0.1 > 10.1.0.1: ICMP echo request, id 29, seq 1, length 64
    IP 0.0.0.0 > 10.0.0.1: ICMP net 10.1.0.1 unreachable, length 92
    2 packets captured
    2 packets received by filter
    0 packets dropped by kernel
    
    With this patch the above capture changes to:
    IP 10.0.0.1 > 10.1.0.1: ICMP echo request, id 31127, seq 1, length 64
    IP 192.0.0.8 > 10.0.0.1: ICMP net 10.1.0.1 unreachable, length 92
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-by: Juliusz Chroboczek <jch@irif.fr>
    Reviewed-by: David Ahern <dsahern@kernel.org>
    Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/uapi/linux/in.h b/include/uapi/linux/in.h
index 48e8a225b985..2a66ab49f14d 100644
--- a/include/uapi/linux/in.h
+++ b/include/uapi/linux/in.h
@@ -280,6 +280,9 @@ struct sockaddr_in {
 /* Address indicating an error return. */
 #define	INADDR_NONE		((unsigned long int) 0xffffffff)
 
+/* Dummy address for src of ICMP replies if no real address is set (RFC7600). */
+#define	INADDR_DUMMY		((unsigned long int) 0xc0000008)
+
 /* Network number for local host loopback. */
 #define	IN_LOOPBACKNET		127
 
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
index b048125ea099..dde6cf82e9f0 100644
--- a/net/ipv4/icmp.c
+++ b/net/ipv4/icmp.c
@@ -744,6 +744,13 @@ void __icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info,
 		icmp_param.data_len = room;
 	icmp_param.head_len = sizeof(struct icmphdr);
 
+	/* if we don't have a source address at this point, fall back to the
+	 * dummy address instead of sending out a packet with a source address
+	 * of 0.0.0.0
+	 */
+	if (!fl4.saddr)
+		fl4.saddr = htonl(INADDR_DUMMY);
+
 	icmp_push_reply(&icmp_param, &fl4, &ipc, &rt);
 ende:
 	ip_rt_put(rt);

commit f4e6a7f19c82f39b1803e91c54718f0d7143767d
Author: Linyu Yuan <linyyuan@codeaurora.org>
Date:   Thu Jun 17 07:32:32 2021 +0800

    net: cdc_eem: fix tx fixup skb leak
    
    [ Upstream commit c3b26fdf1b32f91c7a3bc743384b4a298ab53ad7 ]
    
    when usbnet transmit a skb, eem fixup it in eem_tx_fixup(),
    if skb_copy_expand() failed, it return NULL,
    usbnet_start_xmit() will have no chance to free original skb.
    
    fix it by free orginal skb in eem_tx_fixup() first,
    then check skb clone status, if failed, return NULL to usbnet.
    
    Fixes: 9f722c0978b0 ("usbnet: CDC EEM support (v5)")
    Signed-off-by: Linyu Yuan <linyyuan@codeaurora.org>
    Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/usb/cdc_eem.c b/drivers/net/usb/cdc_eem.c
index 61ea4eaace5d..e3f108080af1 100644
--- a/drivers/net/usb/cdc_eem.c
+++ b/drivers/net/usb/cdc_eem.c
@@ -135,10 +135,10 @@ static struct sk_buff *eem_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
 	}
 
 	skb2 = skb_copy_expand(skb, EEM_HEAD, ETH_FCS_LEN + padlen, flags);
+	dev_kfree_skb_any(skb);
 	if (!skb2)
 		return NULL;
 
-	dev_kfree_skb_any(skb);
 	skb = skb2;
 
 done:

commit c16c4716a1b5ba4f83c7e00da457cba06761f119
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Wed Jun 16 22:09:06 2021 +0300

    net: hamradio: fix memory leak in mkiss_close
    
    [ Upstream commit 7edcc682301492380fbdd604b4516af5ae667a13 ]
    
    My local syzbot instance hit memory leak in
    mkiss_open()[1]. The problem was in missing
    free_netdev() in mkiss_close().
    
    In mkiss_open() netdevice is allocated and then
    registered, but in mkiss_close() netdevice was
    only unregistered, but not freed.
    
    Fail log:
    
    BUG: memory leak
    unreferenced object 0xffff8880281ba000 (size 4096):
      comm "syz-executor.1", pid 11443, jiffies 4295046091 (age 17.660s)
      hex dump (first 32 bytes):
        61 78 30 00 00 00 00 00 00 00 00 00 00 00 00 00  ax0.............
        00 27 fa 2a 80 88 ff ff 00 00 00 00 00 00 00 00  .'.*............
      backtrace:
        [<ffffffff81a27201>] kvmalloc_node+0x61/0xf0
        [<ffffffff8706e7e8>] alloc_netdev_mqs+0x98/0xe80
        [<ffffffff84e64192>] mkiss_open+0xb2/0x6f0 [1]
        [<ffffffff842355db>] tty_ldisc_open+0x9b/0x110
        [<ffffffff84236488>] tty_set_ldisc+0x2e8/0x670
        [<ffffffff8421f7f3>] tty_ioctl+0xda3/0x1440
        [<ffffffff81c9f273>] __x64_sys_ioctl+0x193/0x200
        [<ffffffff8911263a>] do_syscall_64+0x3a/0xb0
        [<ffffffff89200068>] entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    BUG: memory leak
    unreferenced object 0xffff8880141a9a00 (size 96):
      comm "syz-executor.1", pid 11443, jiffies 4295046091 (age 17.660s)
      hex dump (first 32 bytes):
        e8 a2 1b 28 80 88 ff ff e8 a2 1b 28 80 88 ff ff  ...(.......(....
        98 92 9c aa b0 40 02 00 00 00 00 00 00 00 00 00  .....@..........
      backtrace:
        [<ffffffff8709f68b>] __hw_addr_create_ex+0x5b/0x310
        [<ffffffff8709fb38>] __hw_addr_add_ex+0x1f8/0x2b0
        [<ffffffff870a0c7b>] dev_addr_init+0x10b/0x1f0
        [<ffffffff8706e88b>] alloc_netdev_mqs+0x13b/0xe80
        [<ffffffff84e64192>] mkiss_open+0xb2/0x6f0 [1]
        [<ffffffff842355db>] tty_ldisc_open+0x9b/0x110
        [<ffffffff84236488>] tty_set_ldisc+0x2e8/0x670
        [<ffffffff8421f7f3>] tty_ioctl+0xda3/0x1440
        [<ffffffff81c9f273>] __x64_sys_ioctl+0x193/0x200
        [<ffffffff8911263a>] do_syscall_64+0x3a/0xb0
        [<ffffffff89200068>] entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    BUG: memory leak
    unreferenced object 0xffff8880219bfc00 (size 512):
      comm "syz-executor.1", pid 11443, jiffies 4295046091 (age 17.660s)
      hex dump (first 32 bytes):
        00 a0 1b 28 80 88 ff ff 80 8f b1 8d ff ff ff ff  ...(............
        80 8f b1 8d ff ff ff ff 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<ffffffff81a27201>] kvmalloc_node+0x61/0xf0
        [<ffffffff8706eec7>] alloc_netdev_mqs+0x777/0xe80
        [<ffffffff84e64192>] mkiss_open+0xb2/0x6f0 [1]
        [<ffffffff842355db>] tty_ldisc_open+0x9b/0x110
        [<ffffffff84236488>] tty_set_ldisc+0x2e8/0x670
        [<ffffffff8421f7f3>] tty_ioctl+0xda3/0x1440
        [<ffffffff81c9f273>] __x64_sys_ioctl+0x193/0x200
        [<ffffffff8911263a>] do_syscall_64+0x3a/0xb0
        [<ffffffff89200068>] entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    BUG: memory leak
    unreferenced object 0xffff888029b2b200 (size 256):
      comm "syz-executor.1", pid 11443, jiffies 4295046091 (age 17.660s)
      hex dump (first 32 bytes):
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<ffffffff81a27201>] kvmalloc_node+0x61/0xf0
        [<ffffffff8706f062>] alloc_netdev_mqs+0x912/0xe80
        [<ffffffff84e64192>] mkiss_open+0xb2/0x6f0 [1]
        [<ffffffff842355db>] tty_ldisc_open+0x9b/0x110
        [<ffffffff84236488>] tty_set_ldisc+0x2e8/0x670
        [<ffffffff8421f7f3>] tty_ioctl+0xda3/0x1440
        [<ffffffff81c9f273>] __x64_sys_ioctl+0x193/0x200
        [<ffffffff8911263a>] do_syscall_64+0x3a/0xb0
        [<ffffffff89200068>] entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Fixes: 815f62bf7427 ("[PATCH] SMP rewrite of mkiss")
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/hamradio/mkiss.c b/drivers/net/hamradio/mkiss.c
index 3b14e6e281d4..940aa7a19f50 100644
--- a/drivers/net/hamradio/mkiss.c
+++ b/drivers/net/hamradio/mkiss.c
@@ -810,6 +810,7 @@ static void mkiss_close(struct tty_struct *tty)
 	ax->tty = NULL;
 
 	unregister_netdev(ax->dev);
+	free_netdev(ax->dev);
 }
 
 /* Perform I/O control on an active ax25 channel. */

commit d6b973592a98f20622dcca73898fd442ec036970
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Wed Jun 16 20:43:37 2021 +0200

    be2net: Fix an error handling path in 'be_probe()'
    
    [ Upstream commit c19c8c0e666f9259e2fc4d2fa4b9ff8e3b40ee5d ]
    
    If an error occurs after a 'pci_enable_pcie_error_reporting()' call, it
    must be undone by a corresponding 'pci_disable_pcie_error_reporting()'
    call, as already done in the remove function.
    
    Fixes: d6b6d9877878 ("be2net: use PCIe AER capability")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Acked-by: Somnath Kotur <somnath.kotur@broadcom.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 3fe6a28027fe..05cb2f7cc35c 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -6029,6 +6029,7 @@ static int be_probe(struct pci_dev *pdev, const struct pci_device_id *pdev_id)
 unmap_bars:
 	be_unmap_pci_bars(adapter);
 free_netdev:
+	pci_disable_pcie_error_reporting(pdev);
 	free_netdev(netdev);
 rel_reg:
 	pci_release_regions(pdev);

commit 0693d384ff0de10722e4950333adfc299086b472
Author: Eric Dumazet <edumazet@google.com>
Date:   Wed Jun 16 07:47:15 2021 -0700

    net/af_unix: fix a data-race in unix_dgram_sendmsg / unix_release_sock
    
    [ Upstream commit a494bd642d9120648b06bb7d28ce6d05f55a7819 ]
    
    While unix_may_send(sk, osk) is called while osk is locked, it appears
    unix_release_sock() can overwrite unix_peer() after this lock has been
    released, making KCSAN unhappy.
    
    Changing unix_release_sock() to access/change unix_peer()
    before lock is released should fix this issue.
    
    BUG: KCSAN: data-race in unix_dgram_sendmsg / unix_release_sock
    
    write to 0xffff88810465a338 of 8 bytes by task 20852 on cpu 1:
     unix_release_sock+0x4ed/0x6e0 net/unix/af_unix.c:558
     unix_release+0x2f/0x50 net/unix/af_unix.c:859
     __sock_release net/socket.c:599 [inline]
     sock_close+0x6c/0x150 net/socket.c:1258
     __fput+0x25b/0x4e0 fs/file_table.c:280
     ____fput+0x11/0x20 fs/file_table.c:313
     task_work_run+0xae/0x130 kernel/task_work.c:164
     tracehook_notify_resume include/linux/tracehook.h:189 [inline]
     exit_to_user_mode_loop kernel/entry/common.c:175 [inline]
     exit_to_user_mode_prepare+0x156/0x190 kernel/entry/common.c:209
     __syscall_exit_to_user_mode_work kernel/entry/common.c:291 [inline]
     syscall_exit_to_user_mode+0x20/0x40 kernel/entry/common.c:302
     do_syscall_64+0x56/0x90 arch/x86/entry/common.c:57
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    read to 0xffff88810465a338 of 8 bytes by task 20888 on cpu 0:
     unix_may_send net/unix/af_unix.c:189 [inline]
     unix_dgram_sendmsg+0x923/0x1610 net/unix/af_unix.c:1712
     sock_sendmsg_nosec net/socket.c:654 [inline]
     sock_sendmsg net/socket.c:674 [inline]
     ____sys_sendmsg+0x360/0x4d0 net/socket.c:2350
     ___sys_sendmsg net/socket.c:2404 [inline]
     __sys_sendmmsg+0x315/0x4b0 net/socket.c:2490
     __do_sys_sendmmsg net/socket.c:2519 [inline]
     __se_sys_sendmmsg net/socket.c:2516 [inline]
     __x64_sys_sendmmsg+0x53/0x60 net/socket.c:2516
     do_syscall_64+0x4a/0x90 arch/x86/entry/common.c:47
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    value changed: 0xffff888167905400 -> 0x0000000000000000
    
    Reported by Kernel Concurrency Sanitizer on:
    CPU: 0 PID: 20888 Comm: syz-executor.0 Not tainted 5.13.0-rc5-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index 2020306468af..53fe5ada5a83 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -540,12 +540,14 @@ static void unix_release_sock(struct sock *sk, int embrion)
 	u->path.mnt = NULL;
 	state = sk->sk_state;
 	sk->sk_state = TCP_CLOSE;
+
+	skpair = unix_peer(sk);
+	unix_peer(sk) = NULL;
+
 	unix_state_unlock(sk);
 
 	wake_up_interruptible_all(&u->peer_wait);
 
-	skpair = unix_peer(sk);
-
 	if (skpair != NULL) {
 		if (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET) {
 			unix_state_lock(skpair);
@@ -560,7 +562,6 @@ static void unix_release_sock(struct sock *sk, int embrion)
 
 		unix_dgram_peer_wake_disconnect(sk, skpair);
 		sock_put(skpair); /* It may now die */
-		unix_peer(sk) = NULL;
 	}
 
 	/* Try to flush out this socket. Throw out buffers at least */

commit 1e28018b5c83d5073f74a6fb72eabe8370b2f501
Author: Chengyang Fan <cy.fan@huawei.com>
Date:   Wed Jun 16 17:59:25 2021 +0800

    net: ipv4: fix memory leak in ip_mc_add1_src
    
    [ Upstream commit d8e2973029b8b2ce477b564824431f3385c77083 ]
    
    BUG: memory leak
    unreferenced object 0xffff888101bc4c00 (size 32):
      comm "syz-executor527", pid 360, jiffies 4294807421 (age 19.329s)
      hex dump (first 32 bytes):
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
        01 00 00 00 00 00 00 00 ac 14 14 bb 00 00 02 00 ................
      backtrace:
        [<00000000f17c5244>] kmalloc include/linux/slab.h:558 [inline]
        [<00000000f17c5244>] kzalloc include/linux/slab.h:688 [inline]
        [<00000000f17c5244>] ip_mc_add1_src net/ipv4/igmp.c:1971 [inline]
        [<00000000f17c5244>] ip_mc_add_src+0x95f/0xdb0 net/ipv4/igmp.c:2095
        [<000000001cb99709>] ip_mc_source+0x84c/0xea0 net/ipv4/igmp.c:2416
        [<0000000052cf19ed>] do_ip_setsockopt net/ipv4/ip_sockglue.c:1294 [inline]
        [<0000000052cf19ed>] ip_setsockopt+0x114b/0x30c0 net/ipv4/ip_sockglue.c:1423
        [<00000000477edfbc>] raw_setsockopt+0x13d/0x170 net/ipv4/raw.c:857
        [<00000000e75ca9bb>] __sys_setsockopt+0x158/0x270 net/socket.c:2117
        [<00000000bdb993a8>] __do_sys_setsockopt net/socket.c:2128 [inline]
        [<00000000bdb993a8>] __se_sys_setsockopt net/socket.c:2125 [inline]
        [<00000000bdb993a8>] __x64_sys_setsockopt+0xba/0x150 net/socket.c:2125
        [<000000006a1ffdbd>] do_syscall_64+0x40/0x80 arch/x86/entry/common.c:47
        [<00000000b11467c4>] entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    In commit 24803f38a5c0 ("igmp: do not remove igmp souce list info when set
    link down"), the ip_mc_clear_src() in ip_mc_destroy_dev() was removed,
    because it was also called in igmpv3_clear_delrec().
    
    Rough callgraph:
    
    inetdev_destroy
    -> ip_mc_destroy_dev
         -> igmpv3_clear_delrec
            -> ip_mc_clear_src
    -> RCU_INIT_POINTER(dev->ip_ptr, NULL)
    
    However, ip_mc_clear_src() called in igmpv3_clear_delrec() doesn't
    release in_dev->mc_list->sources. And RCU_INIT_POINTER() assigns the
    NULL to dev->ip_ptr. As a result, in_dev cannot be obtained through
    inetdev_by_index() and then in_dev->mc_list->sources cannot be released
    by ip_mc_del1_src() in the sock_close. Rough call sequence goes like:
    
    sock_close
    -> __sock_release
       -> inet_release
          -> ip_mc_drop_socket
             -> inetdev_by_index
             -> ip_mc_leave_src
                -> ip_mc_del_src
                   -> ip_mc_del1_src
    
    So we still need to call ip_mc_clear_src() in ip_mc_destroy_dev() to free
    in_dev->mc_list->sources.
    
    Fixes: 24803f38a5c0 ("igmp: do not remove igmp souce list info ...")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Chengyang Fan <cy.fan@huawei.com>
    Acked-by: Hangbin Liu <liuhangbin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c
index 523d26f5e22e..ffa847fc9619 100644
--- a/net/ipv4/igmp.c
+++ b/net/ipv4/igmp.c
@@ -1816,6 +1816,7 @@ void ip_mc_destroy_dev(struct in_device *in_dev)
 	while ((i = rtnl_dereference(in_dev->mc_list)) != NULL) {
 		in_dev->mc_list = i->next_rcu;
 		in_dev->mc_count--;
+		ip_mc_clear_src(i);
 		ip_ma_put(i);
 	}
 }

commit d9326579bb5c201c0931cc405fbca3254f3a1340
Author: Joakim Zhang <qiangqing.zhang@nxp.com>
Date:   Wed Jun 16 17:14:26 2021 +0800

    net: fec_ptp: fix issue caused by refactor the fec_devtype
    
    [ Upstream commit d23765646e71b43ed2b809930411ba5c0aadee7b ]
    
    Commit da722186f654 ("net: fec: set GPR bit on suspend by DT configuration.")
    refactor the fec_devtype, need adjust ptp driver accordingly.
    
    Fixes: da722186f654 ("net: fec: set GPR bit on suspend by DT configuration.")
    Signed-off-by: Joakim Zhang <qiangqing.zhang@nxp.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/freescale/fec_ptp.c b/drivers/net/ethernet/freescale/fec_ptp.c
index 09a762eb4f09..eca65d49decb 100644
--- a/drivers/net/ethernet/freescale/fec_ptp.c
+++ b/drivers/net/ethernet/freescale/fec_ptp.c
@@ -220,15 +220,13 @@ static u64 fec_ptp_read(const struct cyclecounter *cc)
 {
 	struct fec_enet_private *fep =
 		container_of(cc, struct fec_enet_private, cc);
-	const struct platform_device_id *id_entry =
-		platform_get_device_id(fep->pdev);
 	u32 tempval;
 
 	tempval = readl(fep->hwp + FEC_ATIME_CTRL);
 	tempval |= FEC_T_CTRL_CAPTURE;
 	writel(tempval, fep->hwp + FEC_ATIME_CTRL);
 
-	if (id_entry->driver_data & FEC_QUIRK_BUG_CAPTURE)
+	if (fep->quirks & FEC_QUIRK_BUG_CAPTURE)
 		udelay(1);
 
 	return readl(fep->hwp + FEC_ATIME);

commit 2fc8300c9cfa5167fcb5b1a2a07db6f53e82f59b
Author: Dongliang Mu <mudongliangabcd@gmail.com>
Date:   Wed Jun 16 10:48:33 2021 +0800

    net: usb: fix possible use-after-free in smsc75xx_bind
    
    [ Upstream commit 56b786d86694e079d8aad9b314e015cd4ac02a3d ]
    
    The commit 46a8b29c6306 ("net: usb: fix memory leak in smsc75xx_bind")
    fails to clean up the work scheduled in smsc75xx_reset->
    smsc75xx_set_multicast, which leads to use-after-free if the work is
    scheduled to start after the deallocation. In addition, this patch
    also removes a dangling pointer - dev->data[0].
    
    This patch calls cancel_work_sync to cancel the scheduled work and set
    the dangling pointer to NULL.
    
    Fixes: 46a8b29c6306 ("net: usb: fix memory leak in smsc75xx_bind")
    Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/usb/smsc75xx.c b/drivers/net/usb/smsc75xx.c
index 62f2862c9775..8b9fd4e071f3 100644
--- a/drivers/net/usb/smsc75xx.c
+++ b/drivers/net/usb/smsc75xx.c
@@ -1495,7 +1495,7 @@ static int smsc75xx_bind(struct usbnet *dev, struct usb_interface *intf)
 	ret = smsc75xx_wait_ready(dev, 0);
 	if (ret < 0) {
 		netdev_warn(dev->net, "device not ready in smsc75xx_bind\n");
-		goto err;
+		goto free_pdata;
 	}
 
 	smsc75xx_init_mac_address(dev);
@@ -1504,7 +1504,7 @@ static int smsc75xx_bind(struct usbnet *dev, struct usb_interface *intf)
 	ret = smsc75xx_reset(dev);
 	if (ret < 0) {
 		netdev_warn(dev->net, "smsc75xx_reset error %d\n", ret);
-		goto err;
+		goto cancel_work;
 	}
 
 	dev->net->netdev_ops = &smsc75xx_netdev_ops;
@@ -1515,8 +1515,11 @@ static int smsc75xx_bind(struct usbnet *dev, struct usb_interface *intf)
 	dev->net->max_mtu = MAX_SINGLE_PACKET_SIZE;
 	return 0;
 
-err:
+cancel_work:
+	cancel_work_sync(&pdata->set_multicast);
+free_pdata:
 	kfree(pdata);
+	dev->data[0] = 0;
 	return ret;
 }
 
@@ -1527,7 +1530,6 @@ static void smsc75xx_unbind(struct usbnet *dev, struct usb_interface *intf)
 		cancel_work_sync(&pdata->set_multicast);
 		netif_dbg(dev, ifdown, dev->net, "free pdata\n");
 		kfree(pdata);
-		pdata = NULL;
 		dev->data[0] = 0;
 	}
 }

commit 13dbc21c63c9c41f265670b9cc8d77f969674e81
Author: Maciej Żenczykowski <maze@google.com>
Date:   Tue Jun 15 01:05:49 2021 -0700

    net: cdc_ncm: switch to eth%d interface naming
    
    [ Upstream commit c1a3d4067309451e68c33dbd356032549cc0bd8e ]
    
    This is meant to make the host side cdc_ncm interface consistently
    named just like the older CDC protocols: cdc_ether & cdc_ecm
    (and even rndis_host), which all use 'FLAG_ETHER | FLAG_POINTTOPOINT'.
    
    include/linux/usb/usbnet.h:
      #define FLAG_ETHER    0x0020          /* maybe use "eth%d" names */
      #define FLAG_WLAN     0x0080          /* use "wlan%d" names */
      #define FLAG_WWAN     0x0400          /* use "wwan%d" names */
      #define FLAG_POINTTOPOINT 0x1000      /* possibly use "usb%d" names */
    
    drivers/net/usb/usbnet.c @ line 1711:
      strcpy (net->name, "usb%d");
      ...
      // heuristic:  "usb%d" for links we know are two-host,
      // else "eth%d" when there's reasonable doubt.  userspace
      // can rename the link if it knows better.
      if ((dev->driver_info->flags & FLAG_ETHER) != 0 &&
          ((dev->driver_info->flags & FLAG_POINTTOPOINT) == 0 ||
           (net->dev_addr [0] & 0x02) == 0))
              strcpy (net->name, "eth%d");
      /* WLAN devices should always be named "wlan%d" */
      if ((dev->driver_info->flags & FLAG_WLAN) != 0)
              strcpy(net->name, "wlan%d");
      /* WWAN devices should always be named "wwan%d" */
      if ((dev->driver_info->flags & FLAG_WWAN) != 0)
              strcpy(net->name, "wwan%d");
    
    So by using ETHER | POINTTOPOINT the interface naming is
    either usb%d or eth%d based on the global uniqueness of the
    mac address of the device.
    
    Without this 2.5gbps ethernet dongles which all seem to use the cdc_ncm
    driver end up being called usb%d instead of eth%d even though they're
    definitely not two-host.  (All 1gbps & 5gbps ethernet usb dongles I've
    tested don't hit this problem due to use of different drivers, primarily
    r8152 and aqc111)
    
    Fixes tag is based purely on git blame, and is really just here to make
    sure this hits LTS branches newer than v4.5.
    
    Cc: Lorenzo Colitti <lorenzo@google.com>
    Fixes: 4d06dd537f95 ("cdc_ncm: do not call usbnet_link_change from cdc_ncm_bind")
    Signed-off-by: Maciej Żenczykowski <maze@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c
index 82ec00a7370d..f3f78ccdb274 100644
--- a/drivers/net/usb/cdc_ncm.c
+++ b/drivers/net/usb/cdc_ncm.c
@@ -1666,7 +1666,7 @@ static void cdc_ncm_status(struct usbnet *dev, struct urb *urb)
 static const struct driver_info cdc_ncm_info = {
 	.description = "CDC NCM",
 	.flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET
-			| FLAG_LINK_INTR,
+			| FLAG_LINK_INTR | FLAG_ETHER,
 	.bind = cdc_ncm_bind,
 	.unbind = cdc_ncm_unbind,
 	.manage_power = usbnet_manage_power,

commit cee0a9c1826bebd7c2578ad0dcff06eb68868069
Author: Jakub Kicinski <kuba@kernel.org>
Date:   Mon Jun 14 15:24:05 2021 -0700

    ptp: improve max_adj check against unreasonable values
    
    [ Upstream commit 475b92f932168a78da8109acd10bfb7578b8f2bb ]
    
    Scaled PPM conversion to PPB may (on 64bit systems) result
    in a value larger than s32 can hold (freq/scaled_ppm is a long).
    This means the kernel will not correctly reject unreasonably
    high ->freq values (e.g. > 4294967295ppb, 281474976645 scaled PPM).
    
    The conversion is equivalent to a division by ~66 (65.536),
    so the value of ppb is always smaller than ppm, but not small
    enough to assume narrowing the type from long -> s32 is okay.
    
    Note that reasonable user space (e.g. ptp4l) will not use such
    high values, anyway, 4289046510ppb ~= 4.3x, so the fix is
    somewhat pedantic.
    
    Fixes: d39a743511cd ("ptp: validate the requested frequency adjustment.")
    Fixes: d94ba80ebbea ("ptp: Added a brand new class driver for ptp clocks.")
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Acked-by: Richard Cochran <richardcochran@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/ptp/ptp_clock.c b/drivers/ptp/ptp_clock.c
index 863958f3bb57..89632cc9c28f 100644
--- a/drivers/ptp/ptp_clock.c
+++ b/drivers/ptp/ptp_clock.c
@@ -76,7 +76,7 @@ static void enqueue_external_timestamp(struct timestamp_event_queue *queue,
 	spin_unlock_irqrestore(&queue->lock, flags);
 }
 
-s32 scaled_ppm_to_ppb(long ppm)
+long scaled_ppm_to_ppb(long ppm)
 {
 	/*
 	 * The 'freq' field in the 'struct timex' is in parts per
@@ -93,7 +93,7 @@ s32 scaled_ppm_to_ppb(long ppm)
 	s64 ppb = 1 + ppm;
 	ppb *= 125;
 	ppb >>= 13;
-	return (s32) ppb;
+	return (long) ppb;
 }
 EXPORT_SYMBOL(scaled_ppm_to_ppb);
 
@@ -148,7 +148,7 @@ static int ptp_clock_adjtime(struct posix_clock *pc, struct timex *tx)
 		delta = ktime_to_ns(kt);
 		err = ops->adjtime(ops, delta);
 	} else if (tx->modes & ADJ_FREQUENCY) {
-		s32 ppb = scaled_ppm_to_ppb(tx->freq);
+		long ppb = scaled_ppm_to_ppb(tx->freq);
 		if (ppb > ops->max_adj || ppb < -ops->max_adj)
 			return -ERANGE;
 		if (ops->adjfine)
diff --git a/include/linux/ptp_clock_kernel.h b/include/linux/ptp_clock_kernel.h
index 40ea83fcfdd5..99c3f4ee938e 100644
--- a/include/linux/ptp_clock_kernel.h
+++ b/include/linux/ptp_clock_kernel.h
@@ -210,7 +210,7 @@ extern int ptp_clock_index(struct ptp_clock *ptp);
  * @ppm:    Parts per million, but with a 16 bit binary fractional field
  */
 
-extern s32 scaled_ppm_to_ppb(long ppm);
+extern long scaled_ppm_to_ppb(long ppm);
 
 /**
  * ptp_find_pin() - obtain the pin index of a given auxiliary function

commit b5200624e643bb4cf65eb3b6d9bf36fc11982669
Author: Shalom Toledo <shalomt@mellanox.com>
Date:   Tue Jun 11 18:45:09 2019 +0300

    ptp: ptp_clock: Publish scaled_ppm_to_ppb
    
    [ Upstream commit 4368dada5b37e74a13b892ca5cef8a7d558e9a5f ]
    
    Publish scaled_ppm_to_ppb to allow drivers to use it.
    
    Signed-off-by: Shalom Toledo <shalomt@mellanox.com>
    Reviewed-by: Petr Machata <petrm@mellanox.com>
    Signed-off-by: Ido Schimmel <idosch@mellanox.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/ptp/ptp_clock.c b/drivers/ptp/ptp_clock.c
index e232233beb8f..863958f3bb57 100644
--- a/drivers/ptp/ptp_clock.c
+++ b/drivers/ptp/ptp_clock.c
@@ -76,7 +76,7 @@ static void enqueue_external_timestamp(struct timestamp_event_queue *queue,
 	spin_unlock_irqrestore(&queue->lock, flags);
 }
 
-static s32 scaled_ppm_to_ppb(long ppm)
+s32 scaled_ppm_to_ppb(long ppm)
 {
 	/*
 	 * The 'freq' field in the 'struct timex' is in parts per
@@ -95,6 +95,7 @@ static s32 scaled_ppm_to_ppb(long ppm)
 	ppb >>= 13;
 	return (s32) ppb;
 }
+EXPORT_SYMBOL(scaled_ppm_to_ppb);
 
 /* posix clock implementation */
 
diff --git a/include/linux/ptp_clock_kernel.h b/include/linux/ptp_clock_kernel.h
index 51349d124ee5..40ea83fcfdd5 100644
--- a/include/linux/ptp_clock_kernel.h
+++ b/include/linux/ptp_clock_kernel.h
@@ -204,6 +204,14 @@ extern void ptp_clock_event(struct ptp_clock *ptp,
 
 extern int ptp_clock_index(struct ptp_clock *ptp);
 
+/**
+ * scaled_ppm_to_ppb() - convert scaled ppm to ppb
+ *
+ * @ppm:    Parts per million, but with a 16 bit binary fractional field
+ */
+
+extern s32 scaled_ppm_to_ppb(long ppm);
+
 /**
  * ptp_find_pin() - obtain the pin index of a given auxiliary function
  *

commit f8111c0d7ed42ede41a3d0d393b104de0730a8a6
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Mon Jun 14 15:06:50 2021 +0300

    net: qrtr: fix OOB Read in qrtr_endpoint_post
    
    [ Upstream commit ad9d24c9429e2159d1e279dc3a83191ccb4daf1d ]
    
    Syzbot reported slab-out-of-bounds Read in
    qrtr_endpoint_post. The problem was in wrong
    _size_ type:
    
            if (len != ALIGN(size, 4) + hdrlen)
                    goto err;
    
    If size from qrtr_hdr is 4294967293 (0xfffffffd), the result of
    ALIGN(size, 4) will be 0. In case of len == hdrlen and size == 4294967293
    in header this check won't fail and
    
            skb_put_data(skb, data + hdrlen, size);
    
    will read out of bound from data, which is hdrlen allocated block.
    
    Fixes: 194ccc88297a ("net: qrtr: Support decoding incoming v2 packets")
    Reported-and-tested-by: syzbot+1917d778024161609247@syzkaller.appspotmail.com
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c
index 43f63d0606ec..1e2772913957 100644
--- a/net/qrtr/qrtr.c
+++ b/net/qrtr/qrtr.c
@@ -264,7 +264,7 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len)
 	const struct qrtr_hdr_v2 *v2;
 	struct sk_buff *skb;
 	struct qrtr_cb *cb;
-	unsigned int size;
+	size_t size;
 	unsigned int ver;
 	size_t hdrlen;
 

commit dc9b44464b9ed86fdc60b1d8021d85b4274f5e62
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Sat Jun 12 14:53:12 2021 +0200

    netxen_nic: Fix an error handling path in 'netxen_nic_probe()'
    
    [ Upstream commit 49a10c7b176295f8fafb338911cf028e97f65f4d ]
    
    If an error occurs after a 'pci_enable_pcie_error_reporting()' call, it
    must be undone by a corresponding 'pci_disable_pcie_error_reporting()'
    call, as already done in the remove function.
    
    Fixes: e87ad5539343 ("netxen: support pci error handlers")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
index 42b99b182616..a331ad406e7a 100644
--- a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
+++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
@@ -1618,6 +1618,8 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	free_netdev(netdev);
 
 err_out_free_res:
+	if (NX_IS_REVISION_P3(pdev->revision))
+		pci_disable_pcie_error_reporting(pdev);
 	pci_release_regions(pdev);
 
 err_out_disable_pdev:

commit ac2e10e26f2939312f86bc0d35fc9b2f80b513e4
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Sat Jun 12 14:37:46 2021 +0200

    qlcnic: Fix an error handling path in 'qlcnic_probe()'
    
    [ Upstream commit cb3376604a676e0302258b01893911bdd7aa5278 ]
    
    If an error occurs after a 'pci_enable_pcie_error_reporting()' call, it
    must be undone by a corresponding 'pci_disable_pcie_error_reporting()'
    call, as already done in the remove function.
    
    Fixes: 451724c821c1 ("qlcnic: aer support")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index ed34b7d1a9e1..43920374beae 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -2708,6 +2708,7 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	kfree(ahw);
 
 err_out_free_res:
+	pci_disable_pcie_error_reporting(pdev);
 	pci_release_regions(pdev);
 
 err_out_disable_pdev:

commit 29174c883e493b612170b7874e560e006d18985a
Author: Changbin Du <changbin.du@gmail.com>
Date:   Fri Jun 11 22:29:59 2021 +0800

    net: make get_net_ns return error if NET_NS is disabled
    
    [ Upstream commit ea6932d70e223e02fea3ae20a4feff05d7c1ea9a ]
    
    There is a panic in socket ioctl cmd SIOCGSKNS when NET_NS is not enabled.
    The reason is that nsfs tries to access ns->ops but the proc_ns_operations
    is not implemented in this case.
    
    [7.670023] Unable to handle kernel NULL pointer dereference at virtual address 00000010
    [7.670268] pgd = 32b54000
    [7.670544] [00000010] *pgd=00000000
    [7.671861] Internal error: Oops: 5 [#1] SMP ARM
    [7.672315] Modules linked in:
    [7.672918] CPU: 0 PID: 1 Comm: systemd Not tainted 5.13.0-rc3-00375-g6799d4f2da49 #16
    [7.673309] Hardware name: Generic DT based system
    [7.673642] PC is at nsfs_evict+0x24/0x30
    [7.674486] LR is at clear_inode+0x20/0x9c
    
    The same to tun SIOCGSKNS command.
    
    To fix this problem, we make get_net_ns() return -EINVAL when NET_NS is
    disabled. Meanwhile move it to right place net/core/net_namespace.c.
    
    Signed-off-by: Changbin Du <changbin.du@gmail.com>
    Fixes: c62cce2caee5 ("net: add an ioctl to get a socket network namespace")
    Cc: Cong Wang <xiyou.wangcong@gmail.com>
    Cc: Jakub Kicinski <kuba@kernel.org>
    Cc: David Laight <David.Laight@ACULAB.COM>
    Cc: Christian Brauner <christian.brauner@ubuntu.com>
    Suggested-by: Jakub Kicinski <kuba@kernel.org>
    Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/socket.h b/include/linux/socket.h
index cc1d3f1b7656..15a7eb24f63c 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -384,6 +384,4 @@ extern int __sys_getpeername(int fd, struct sockaddr __user *usockaddr,
 extern int __sys_socketpair(int family, int type, int protocol,
 			    int __user *usockvec);
 extern int __sys_shutdown(int fd, int how);
-
-extern struct ns_common *get_net_ns(struct ns_common *ns);
 #endif /* _LINUX_SOCKET_H */
diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h
index 5007eaba207d..bc88ac6c2e1d 100644
--- a/include/net/net_namespace.h
+++ b/include/net/net_namespace.h
@@ -175,6 +175,8 @@ struct net *copy_net_ns(unsigned long flags, struct user_namespace *user_ns,
 void net_ns_get_ownership(const struct net *net, kuid_t *uid, kgid_t *gid);
 
 void net_ns_barrier(void);
+
+struct ns_common *get_net_ns(struct ns_common *ns);
 #else /* CONFIG_NET_NS */
 #include <linux/sched.h>
 #include <linux/nsproxy.h>
@@ -194,6 +196,11 @@ static inline void net_ns_get_ownership(const struct net *net,
 }
 
 static inline void net_ns_barrier(void) {}
+
+static inline struct ns_common *get_net_ns(struct ns_common *ns)
+{
+	return ERR_PTR(-EINVAL);
+}
 #endif /* CONFIG_NET_NS */
 
 
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c
index c60123dff803..939d8a31eb82 100644
--- a/net/core/net_namespace.c
+++ b/net/core/net_namespace.c
@@ -598,6 +598,18 @@ void __put_net(struct net *net)
 }
 EXPORT_SYMBOL_GPL(__put_net);
 
+/**
+ * get_net_ns - increment the refcount of the network namespace
+ * @ns: common namespace (net)
+ *
+ * Returns the net's common namespace.
+ */
+struct ns_common *get_net_ns(struct ns_common *ns)
+{
+	return &get_net(container_of(ns, struct net, ns))->ns;
+}
+EXPORT_SYMBOL_GPL(get_net_ns);
+
 struct net *get_net_ns_by_fd(int fd)
 {
 	struct file *file;
diff --git a/net/socket.c b/net/socket.c
index 1ed7be54815a..f14bca00ff01 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1048,19 +1048,6 @@ static long sock_do_ioctl(struct net *net, struct socket *sock,
  *	what to do with it - that's up to the protocol still.
  */
 
-/**
- *	get_net_ns - increment the refcount of the network namespace
- *	@ns: common namespace (net)
- *
- *	Returns the net's common namespace.
- */
-
-struct ns_common *get_net_ns(struct ns_common *ns)
-{
-	return &get_net(container_of(ns, struct net, ns))->ns;
-}
-EXPORT_SYMBOL_GPL(get_net_ns);
-
 static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
 {
 	struct socket *sock;

commit 137e2b34d1c6304b1fa2d55d5232a457bf8b2655
Author: Pedro Tammela <pctammela@gmail.com>
Date:   Thu Mar 14 10:45:23 2019 -0300

    net: add documentation to socket.c
    
    [ Upstream commit 8a3c245c031944f2176118270e7bc5d4fd4a1075 ]
    
    Adds missing sphinx documentation to the
    socket.c's functions. Also fixes some whitespaces.
    
    I also changed the style of older documentation as an
    effort to have an uniform documentation style.
    
    Signed-off-by: Pedro Tammela <pctammela@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/net.h b/include/linux/net.h
index e0930678c8bf..41dc703b261c 100644
--- a/include/linux/net.h
+++ b/include/linux/net.h
@@ -83,6 +83,12 @@ enum sock_type {
 
 #endif /* ARCH_HAS_SOCKET_TYPES */
 
+/**
+ * enum sock_shutdown_cmd - Shutdown types
+ * @SHUT_RD: shutdown receptions
+ * @SHUT_WR: shutdown transmissions
+ * @SHUT_RDWR: shutdown receptions/transmissions
+ */
 enum sock_shutdown_cmd {
 	SHUT_RD,
 	SHUT_WR,
diff --git a/include/linux/socket.h b/include/linux/socket.h
index 7ed4713d5337..cc1d3f1b7656 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -26,7 +26,7 @@ typedef __kernel_sa_family_t	sa_family_t;
 /*
  *	1003.1g requires sa_family_t and that sa_data is char.
  */
- 
+
 struct sockaddr {
 	sa_family_t	sa_family;	/* address family, AF_xxx	*/
 	char		sa_data[14];	/* 14 bytes of protocol address	*/
@@ -44,7 +44,7 @@ struct linger {
  *	system, not 4.3. Thus msg_accrights(len) are now missing. They
  *	belong in an obscure libc emulation or the bin.
  */
- 
+
 struct msghdr {
 	void		*msg_name;	/* ptr to socket address structure */
 	int		msg_namelen;	/* size of socket address structure */
@@ -54,7 +54,7 @@ struct msghdr {
 	unsigned int	msg_flags;	/* flags on received message */
 	struct kiocb	*msg_iocb;	/* ptr to iocb for async requests */
 };
- 
+
 struct user_msghdr {
 	void		__user *msg_name;	/* ptr to socket address structure */
 	int		msg_namelen;		/* size of socket address structure */
@@ -122,7 +122,7 @@ struct cmsghdr {
  *	inside range, given by msg->msg_controllen before using
  *	ancillary object DATA.				--ANK (980731)
  */
- 
+
 static inline struct cmsghdr * __cmsg_nxthdr(void *__ctl, __kernel_size_t __size,
 					       struct cmsghdr *__cmsg)
 {
@@ -264,10 +264,10 @@ struct ucred {
 /* Maximum queue length specifiable by listen.  */
 #define SOMAXCONN	128
 
-/* Flags we can use with send/ and recv. 
+/* Flags we can use with send/ and recv.
    Added those for 1003.1g not all are supported yet
  */
- 
+
 #define MSG_OOB		1
 #define MSG_PEEK	2
 #define MSG_DONTROUTE	4
diff --git a/net/socket.c b/net/socket.c
index 29169045dcfe..1ed7be54815a 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -384,6 +384,18 @@ static struct file_system_type sock_fs_type = {
  *	but we take care of internal coherence yet.
  */
 
+/**
+ *	sock_alloc_file - Bind a &socket to a &file
+ *	@sock: socket
+ *	@flags: file status flags
+ *	@dname: protocol name
+ *
+ *	Returns the &file bound with @sock, implicitly storing it
+ *	in sock->file. If dname is %NULL, sets to "".
+ *	On failure the return is a ERR pointer (see linux/err.h).
+ *	This function uses GFP_KERNEL internally.
+ */
+
 struct file *sock_alloc_file(struct socket *sock, int flags, const char *dname)
 {
 	struct file *file;
@@ -424,6 +436,14 @@ static int sock_map_fd(struct socket *sock, int flags)
 	return PTR_ERR(newfile);
 }
 
+/**
+ *	sock_from_file - Return the &socket bounded to @file.
+ *	@file: file
+ *	@err: pointer to an error code return
+ *
+ *	On failure returns %NULL and assigns -ENOTSOCK to @err.
+ */
+
 struct socket *sock_from_file(struct file *file, int *err)
 {
 	if (file->f_op == &socket_file_ops)
@@ -532,11 +552,11 @@ static const struct inode_operations sockfs_inode_ops = {
 };
 
 /**
- *	sock_alloc	-	allocate a socket
+ *	sock_alloc - allocate a socket
  *
  *	Allocate a new inode and socket object. The two are bound together
  *	and initialised. The socket is then returned. If we are out of inodes
- *	NULL is returned.
+ *	NULL is returned. This functions uses GFP_KERNEL internally.
  */
 
 struct socket *sock_alloc(void)
@@ -561,7 +581,7 @@ struct socket *sock_alloc(void)
 EXPORT_SYMBOL(sock_alloc);
 
 /**
- *	sock_release	-	close a socket
+ *	sock_release - close a socket
  *	@sock: socket to close
  *
  *	The socket is released from the protocol stack if it has a release
@@ -617,6 +637,15 @@ void __sock_tx_timestamp(__u16 tsflags, __u8 *tx_flags)
 }
 EXPORT_SYMBOL(__sock_tx_timestamp);
 
+/**
+ *	sock_sendmsg - send a message through @sock
+ *	@sock: socket
+ *	@msg: message to send
+ *
+ *	Sends @msg through @sock, passing through LSM.
+ *	Returns the number of bytes sent, or an error code.
+ */
+
 static inline int sock_sendmsg_nosec(struct socket *sock, struct msghdr *msg)
 {
 	int ret = sock->ops->sendmsg(sock, msg, msg_data_left(msg));
@@ -633,6 +662,18 @@ int sock_sendmsg(struct socket *sock, struct msghdr *msg)
 }
 EXPORT_SYMBOL(sock_sendmsg);
 
+/**
+ *	kernel_sendmsg - send a message through @sock (kernel-space)
+ *	@sock: socket
+ *	@msg: message header
+ *	@vec: kernel vec
+ *	@num: vec array length
+ *	@size: total message data size
+ *
+ *	Builds the message data with @vec and sends it through @sock.
+ *	Returns the number of bytes sent, or an error code.
+ */
+
 int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
 		   struct kvec *vec, size_t num, size_t size)
 {
@@ -641,6 +682,19 @@ int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
 }
 EXPORT_SYMBOL(kernel_sendmsg);
 
+/**
+ *	kernel_sendmsg_locked - send a message through @sock (kernel-space)
+ *	@sk: sock
+ *	@msg: message header
+ *	@vec: output s/g array
+ *	@num: output s/g array length
+ *	@size: total message data size
+ *
+ *	Builds the message data with @vec and sends it through @sock.
+ *	Returns the number of bytes sent, or an error code.
+ *	Caller must hold @sk.
+ */
+
 int kernel_sendmsg_locked(struct sock *sk, struct msghdr *msg,
 			  struct kvec *vec, size_t num, size_t size)
 {
@@ -789,6 +843,16 @@ void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
 }
 EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops);
 
+/**
+ *	sock_recvmsg - receive a message from @sock
+ *	@sock: socket
+ *	@msg: message to receive
+ *	@flags: message flags
+ *
+ *	Receives @msg from @sock, passing through LSM. Returns the total number
+ *	of bytes received, or an error.
+ */
+
 static inline int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg,
 				     int flags)
 {
@@ -804,20 +868,21 @@ int sock_recvmsg(struct socket *sock, struct msghdr *msg, int flags)
 EXPORT_SYMBOL(sock_recvmsg);
 
 /**
- * kernel_recvmsg - Receive a message from a socket (kernel space)
- * @sock:       The socket to receive the message from
- * @msg:        Received message
- * @vec:        Input s/g array for message data
- * @num:        Size of input s/g array
- * @size:       Number of bytes to read
- * @flags:      Message flags (MSG_DONTWAIT, etc...)
+ *	kernel_recvmsg - Receive a message from a socket (kernel space)
+ *	@sock: The socket to receive the message from
+ *	@msg: Received message
+ *	@vec: Input s/g array for message data
+ *	@num: Size of input s/g array
+ *	@size: Number of bytes to read
+ *	@flags: Message flags (MSG_DONTWAIT, etc...)
  *
- * On return the msg structure contains the scatter/gather array passed in the
- * vec argument. The array is modified so that it consists of the unfilled
- * portion of the original array.
+ *	On return the msg structure contains the scatter/gather array passed in the
+ *	vec argument. The array is modified so that it consists of the unfilled
+ *	portion of the original array.
  *
- * The returned value is the total number of bytes received, or an error.
+ *	The returned value is the total number of bytes received, or an error.
  */
+
 int kernel_recvmsg(struct socket *sock, struct msghdr *msg,
 		   struct kvec *vec, size_t num, size_t size, int flags)
 {
@@ -983,6 +1048,13 @@ static long sock_do_ioctl(struct net *net, struct socket *sock,
  *	what to do with it - that's up to the protocol still.
  */
 
+/**
+ *	get_net_ns - increment the refcount of the network namespace
+ *	@ns: common namespace (net)
+ *
+ *	Returns the net's common namespace.
+ */
+
 struct ns_common *get_net_ns(struct ns_common *ns)
 {
 	return &get_net(container_of(ns, struct net, ns))->ns;
@@ -1077,6 +1149,19 @@ static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
 	return err;
 }
 
+/**
+ *	sock_create_lite - creates a socket
+ *	@family: protocol family (AF_INET, ...)
+ *	@type: communication type (SOCK_STREAM, ...)
+ *	@protocol: protocol (0, ...)
+ *	@res: new socket
+ *
+ *	Creates a new socket and assigns it to @res, passing through LSM.
+ *	The new socket initialization is not complete, see kernel_accept().
+ *	Returns 0 or an error. On failure @res is set to %NULL.
+ *	This function internally uses GFP_KERNEL.
+ */
+
 int sock_create_lite(int family, int type, int protocol, struct socket **res)
 {
 	int err;
@@ -1202,6 +1287,21 @@ int sock_wake_async(struct socket_wq *wq, int how, int band)
 }
 EXPORT_SYMBOL(sock_wake_async);
 
+/**
+ *	__sock_create - creates a socket
+ *	@net: net namespace
+ *	@family: protocol family (AF_INET, ...)
+ *	@type: communication type (SOCK_STREAM, ...)
+ *	@protocol: protocol (0, ...)
+ *	@res: new socket
+ *	@kern: boolean for kernel space sockets
+ *
+ *	Creates a new socket and assigns it to @res, passing through LSM.
+ *	Returns 0 or an error. On failure @res is set to %NULL. @kern must
+ *	be set to true if the socket resides in kernel space.
+ *	This function internally uses GFP_KERNEL.
+ */
+
 int __sock_create(struct net *net, int family, int type, int protocol,
 			 struct socket **res, int kern)
 {
@@ -1311,12 +1411,35 @@ int __sock_create(struct net *net, int family, int type, int protocol,
 }
 EXPORT_SYMBOL(__sock_create);
 
+/**
+ *	sock_create - creates a socket
+ *	@family: protocol family (AF_INET, ...)
+ *	@type: communication type (SOCK_STREAM, ...)
+ *	@protocol: protocol (0, ...)
+ *	@res: new socket
+ *
+ *	A wrapper around __sock_create().
+ *	Returns 0 or an error. This function internally uses GFP_KERNEL.
+ */
+
 int sock_create(int family, int type, int protocol, struct socket **res)
 {
 	return __sock_create(current->nsproxy->net_ns, family, type, protocol, res, 0);
 }
 EXPORT_SYMBOL(sock_create);
 
+/**
+ *	sock_create_kern - creates a socket (kernel space)
+ *	@net: net namespace
+ *	@family: protocol family (AF_INET, ...)
+ *	@type: communication type (SOCK_STREAM, ...)
+ *	@protocol: protocol (0, ...)
+ *	@res: new socket
+ *
+ *	A wrapper around __sock_create().
+ *	Returns 0 or an error. This function internally uses GFP_KERNEL.
+ */
+
 int sock_create_kern(struct net *net, int family, int type, int protocol, struct socket **res)
 {
 	return __sock_create(net, family, type, protocol, res, 1);
@@ -3273,18 +3396,46 @@ static long compat_sock_ioctl(struct file *file, unsigned int cmd,
 }
 #endif
 
+/**
+ *	kernel_bind - bind an address to a socket (kernel space)
+ *	@sock: socket
+ *	@addr: address
+ *	@addrlen: length of address
+ *
+ *	Returns 0 or an error.
+ */
+
 int kernel_bind(struct socket *sock, struct sockaddr *addr, int addrlen)
 {
 	return sock->ops->bind(sock, addr, addrlen);
 }
 EXPORT_SYMBOL(kernel_bind);
 
+/**
+ *	kernel_listen - move socket to listening state (kernel space)
+ *	@sock: socket
+ *	@backlog: pending connections queue size
+ *
+ *	Returns 0 or an error.
+ */
+
 int kernel_listen(struct socket *sock, int backlog)
 {
 	return sock->ops->listen(sock, backlog);
 }
 EXPORT_SYMBOL(kernel_listen);
 
+/**
+ *	kernel_accept - accept a connection (kernel space)
+ *	@sock: listening socket
+ *	@newsock: new connected socket
+ *	@flags: flags
+ *
+ *	@flags must be SOCK_CLOEXEC, SOCK_NONBLOCK or 0.
+ *	If it fails, @newsock is guaranteed to be %NULL.
+ *	Returns 0 or an error.
+ */
+
 int kernel_accept(struct socket *sock, struct socket **newsock, int flags)
 {
 	struct sock *sk = sock->sk;
@@ -3310,6 +3461,19 @@ int kernel_accept(struct socket *sock, struct socket **newsock, int flags)
 }
 EXPORT_SYMBOL(kernel_accept);
 
+/**
+ *	kernel_connect - connect a socket (kernel space)
+ *	@sock: socket
+ *	@addr: address
+ *	@addrlen: address length
+ *	@flags: flags (O_NONBLOCK, ...)
+ *
+ *	For datagram sockets, @addr is the addres to which datagrams are sent
+ *	by default, and the only address from which datagrams are received.
+ *	For stream sockets, attempts to connect to @addr.
+ *	Returns 0 or an error code.
+ */
+
 int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
 		   int flags)
 {
@@ -3317,18 +3481,48 @@ int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
 }
 EXPORT_SYMBOL(kernel_connect);
 
+/**
+ *	kernel_getsockname - get the address which the socket is bound (kernel space)
+ *	@sock: socket
+ *	@addr: address holder
+ *
+ * 	Fills the @addr pointer with the address which the socket is bound.
+ *	Returns 0 or an error code.
+ */
+
 int kernel_getsockname(struct socket *sock, struct sockaddr *addr)
 {
 	return sock->ops->getname(sock, addr, 0);
 }
 EXPORT_SYMBOL(kernel_getsockname);
 
+/**
+ *	kernel_peername - get the address which the socket is connected (kernel space)
+ *	@sock: socket
+ *	@addr: address holder
+ *
+ * 	Fills the @addr pointer with the address which the socket is connected.
+ *	Returns 0 or an error code.
+ */
+
 int kernel_getpeername(struct socket *sock, struct sockaddr *addr)
 {
 	return sock->ops->getname(sock, addr, 1);
 }
 EXPORT_SYMBOL(kernel_getpeername);
 
+/**
+ *	kernel_getsockopt - get a socket option (kernel space)
+ *	@sock: socket
+ *	@level: API level (SOL_SOCKET, ...)
+ *	@optname: option tag
+ *	@optval: option value
+ *	@optlen: option length
+ *
+ *	Assigns the option length to @optlen.
+ *	Returns 0 or an error.
+ */
+
 int kernel_getsockopt(struct socket *sock, int level, int optname,
 			char *optval, int *optlen)
 {
@@ -3351,6 +3545,17 @@ int kernel_getsockopt(struct socket *sock, int level, int optname,
 }
 EXPORT_SYMBOL(kernel_getsockopt);
 
+/**
+ *	kernel_setsockopt - set a socket option (kernel space)
+ *	@sock: socket
+ *	@level: API level (SOL_SOCKET, ...)
+ *	@optname: option tag
+ *	@optval: option value
+ *	@optlen: option length
+ *
+ *	Returns 0 or an error.
+ */
+
 int kernel_setsockopt(struct socket *sock, int level, int optname,
 			char *optval, unsigned int optlen)
 {
@@ -3371,6 +3576,17 @@ int kernel_setsockopt(struct socket *sock, int level, int optname,
 }
 EXPORT_SYMBOL(kernel_setsockopt);
 
+/**
+ *	kernel_sendpage - send a &page through a socket (kernel space)
+ *	@sock: socket
+ *	@page: page
+ *	@offset: page offset
+ *	@size: total size in bytes
+ *	@flags: flags (MSG_DONTWAIT, ...)
+ *
+ *	Returns the total amount sent in bytes or an error.
+ */
+
 int kernel_sendpage(struct socket *sock, struct page *page, int offset,
 		    size_t size, int flags)
 {
@@ -3381,6 +3597,18 @@ int kernel_sendpage(struct socket *sock, struct page *page, int offset,
 }
 EXPORT_SYMBOL(kernel_sendpage);
 
+/**
+ *	kernel_sendpage_locked - send a &page through the locked sock (kernel space)
+ *	@sk: sock
+ *	@page: page
+ *	@offset: page offset
+ *	@size: total size in bytes
+ *	@flags: flags (MSG_DONTWAIT, ...)
+ *
+ *	Returns the total amount sent in bytes or an error.
+ *	Caller must hold @sk.
+ */
+
 int kernel_sendpage_locked(struct sock *sk, struct page *page, int offset,
 			   size_t size, int flags)
 {
@@ -3394,17 +3622,30 @@ int kernel_sendpage_locked(struct sock *sk, struct page *page, int offset,
 }
 EXPORT_SYMBOL(kernel_sendpage_locked);
 
+/**
+ *	kernel_shutdown - shut down part of a full-duplex connection (kernel space)
+ *	@sock: socket
+ *	@how: connection part
+ *
+ *	Returns 0 or an error.
+ */
+
 int kernel_sock_shutdown(struct socket *sock, enum sock_shutdown_cmd how)
 {
 	return sock->ops->shutdown(sock, how);
 }
 EXPORT_SYMBOL(kernel_sock_shutdown);
 
-/* This routine returns the IP overhead imposed by a socket i.e.
- * the length of the underlying IP header, depending on whether
- * this is an IPv4 or IPv6 socket and the length from IP options turned
- * on at the socket. Assumes that the caller has a lock on the socket.
+/**
+ *	kernel_sock_ip_overhead - returns the IP overhead imposed by a socket
+ *	@sk: socket
+ *
+ *	This routine returns the IP overhead imposed by a socket i.e.
+ *	the length of the underlying IP header, depending on whether
+ *	this is an IPv4 or IPv6 socket and the length from IP options turned
+ *	on at the socket. Assumes that the caller has a lock on the socket.
  */
+
 u32 kernel_sock_ip_overhead(struct sock *sk)
 {
 	struct inet_sock *inet;

commit 8a8ea7f1bcef431ac67ae02623a29ff578d5d90a
Author: Jisheng Zhang <Jisheng.Zhang@synaptics.com>
Date:   Fri Jun 11 15:16:11 2021 +0800

    net: stmmac: dwmac1000: Fix extended MAC address registers definition
    
    [ Upstream commit 1adb20f0d496b2c61e9aa1f4761b8d71f93d258e ]
    
    The register starts from 0x800 is the 16th MAC address register rather
    than the first one.
    
    Fixes: cffb13f4d6fb ("stmmac: extend mac addr reg and fix perfect filering")
    Signed-off-by: Jisheng Zhang <Jisheng.Zhang@synaptics.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h b/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h
index 184ca13c8f79..1a84cf459e40 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h
@@ -86,10 +86,10 @@ enum power_event {
 #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 */

commit a2750410aee6e128f545fed737bade03503468bb
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Fri Jun 11 08:13:39 2021 +0200

    alx: Fix an error handling path in 'alx_probe()'
    
    [ Upstream commit 33e381448cf7a05d76ac0b47d4a6531ecd0e5c53 ]
    
    If an error occurs after a 'pci_enable_pcie_error_reporting()' call, it
    must be undone by a corresponding 'pci_disable_pcie_error_reporting()'
    call, as already done in the remove function.
    
    Fixes: ab69bde6b2e9 ("alx: add a simple AR816x/AR817x device driver")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c
index d83ad06bf199..54bfe9d84ecd 100644
--- a/drivers/net/ethernet/atheros/alx/main.c
+++ b/drivers/net/ethernet/atheros/alx/main.c
@@ -1855,6 +1855,7 @@ static int alx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	free_netdev(netdev);
 out_pci_release:
 	pci_release_mem_regions(pdev);
+	pci_disable_pcie_error_reporting(pdev);
 out_pci_disable:
 	pci_disable_device(pdev);
 	return err;

commit 595897ef118d6fe66690c4fc5b572028c9da95b7
Author: Maxim Mikityanskiy <maximmi@nvidia.com>
Date:   Thu Jun 10 19:40:31 2021 +0300

    sch_cake: Fix out of bounds when parsing TCP options and header
    
    [ Upstream commit ba91c49dedbde758ba0b72f57ac90b06ddf8e548 ]
    
    The TCP option parser in cake qdisc (cake_get_tcpopt and
    cake_tcph_may_drop) could read one byte out of bounds. When the length
    is 1, the execution flow gets into the loop, reads one byte of the
    opcode, and if the opcode is neither TCPOPT_EOL nor TCPOPT_NOP, it reads
    one more byte, which exceeds the length of 1.
    
    This fix is inspired by commit 9609dad263f8 ("ipv4: tcp_input: fix stack
    out of bounds when parsing TCP options.").
    
    v2 changes:
    
    Added doff validation in cake_get_tcphdr to avoid parsing garbage as TCP
    header. Although it wasn't strictly an out-of-bounds access (memory was
    allocated), garbage values could be read where CAKE expected the TCP
    header if doff was smaller than 5.
    
    Cc: Young Xiao <92siuyang@gmail.com>
    Fixes: 8b7138814f29 ("sch_cake: Add optional ACK filter")
    Signed-off-by: Maxim Mikityanskiy <maximmi@nvidia.com>
    Acked-by: Toke Høiland-Jørgensen <toke@toke.dk>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sched/sch_cake.c b/net/sched/sch_cake.c
index 32712e7dcbdc..2025f0f559de 100644
--- a/net/sched/sch_cake.c
+++ b/net/sched/sch_cake.c
@@ -900,7 +900,7 @@ static struct tcphdr *cake_get_tcphdr(const struct sk_buff *skb,
 	}
 
 	tcph = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
-	if (!tcph)
+	if (!tcph || tcph->doff < 5)
 		return NULL;
 
 	return skb_header_pointer(skb, offset,
@@ -924,6 +924,8 @@ static const void *cake_get_tcpopt(const struct tcphdr *tcph,
 			length--;
 			continue;
 		}
+		if (length < 2)
+			break;
 		opsize = *ptr++;
 		if (opsize < 2 || opsize > length)
 			break;
@@ -1061,6 +1063,8 @@ static bool cake_tcph_may_drop(const struct tcphdr *tcph,
 			length--;
 			continue;
 		}
+		if (length < 2)
+			break;
 		opsize = *ptr++;
 		if (opsize < 2 || opsize > length)
 			break;

commit 7d9a9a1a88a3da574e019b4de756bc73337b3b0b
Author: Maxim Mikityanskiy <maximmi@nvidia.com>
Date:   Thu Jun 10 19:40:29 2021 +0300

    netfilter: synproxy: Fix out of bounds when parsing TCP options
    
    [ Upstream commit 5fc177ab759418c9537433e63301096e733fb915 ]
    
    The TCP option parser in synproxy (synproxy_parse_options) could read
    one byte out of bounds. When the length is 1, the execution flow gets
    into the loop, reads one byte of the opcode, and if the opcode is
    neither TCPOPT_EOL nor TCPOPT_NOP, it reads one more byte, which exceeds
    the length of 1.
    
    This fix is inspired by commit 9609dad263f8 ("ipv4: tcp_input: fix stack
    out of bounds when parsing TCP options.").
    
    v2 changes:
    
    Added an early return when length < 0 to avoid calling
    skb_header_pointer with negative length.
    
    Cc: Young Xiao <92siuyang@gmail.com>
    Fixes: 48b1de4c110a ("netfilter: add SYNPROXY core/target")
    Signed-off-by: Maxim Mikityanskiy <maximmi@nvidia.com>
    Reviewed-by: Florian Westphal <fw@strlen.de>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netfilter/nf_synproxy_core.c b/net/netfilter/nf_synproxy_core.c
index 353a2aa80c3c..04b07b63c540 100644
--- a/net/netfilter/nf_synproxy_core.c
+++ b/net/netfilter/nf_synproxy_core.c
@@ -34,6 +34,9 @@ synproxy_parse_options(const struct sk_buff *skb, unsigned int doff,
 	int length = (th->doff * 4) - sizeof(*th);
 	u8 buf[40], *ptr;
 
+	if (unlikely(length < 0))
+		return false;
+
 	ptr = skb_header_pointer(skb, doff + sizeof(*th), length, buf);
 	if (ptr == NULL)
 		return false;
@@ -50,6 +53,8 @@ synproxy_parse_options(const struct sk_buff *skb, unsigned int doff,
 			length--;
 			continue;
 		default:
+			if (length < 2)
+				return true;
 			opsize = *ptr++;
 			if (opsize < 2)
 				return true;

commit 0facea514ab68feb7dca82a143f99d725c066672
Author: Aya Levin <ayal@nvidia.com>
Date:   Mon May 10 14:34:58 2021 +0300

    net/mlx5e: Block offload of outer header csum for UDP tunnels
    
    [ Upstream commit 6d6727dddc7f93fcc155cb8d0c49c29ae0e71122 ]
    
    The device is able to offload either the outer header csum or inner
    header csum. The driver utilizes the inner csum offload. Hence, block
    setting of tx-udp_tnl-csum-segmentation and set it to off[fixed].
    
    Fixes: b49663c8fb49 ("net/mlx5e: Add support for UDP tunnel segmentation with outer checksum offload")
    Signed-off-by: Aya Levin <ayal@nvidia.com>
    Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index 51edc507b7b5..9003702892cd 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@ -4679,11 +4679,8 @@ static void mlx5e_build_nic_netdev(struct net_device *netdev)
 	}
 
 	if (mlx5_vxlan_allowed(mdev->vxlan)) {
-		netdev->hw_features     |= NETIF_F_GSO_UDP_TUNNEL |
-					   NETIF_F_GSO_UDP_TUNNEL_CSUM;
-		netdev->hw_enc_features |= NETIF_F_GSO_UDP_TUNNEL |
-					   NETIF_F_GSO_UDP_TUNNEL_CSUM;
-		netdev->gso_partial_features = NETIF_F_GSO_UDP_TUNNEL_CSUM;
+		netdev->hw_features     |= NETIF_F_GSO_UDP_TUNNEL;
+		netdev->hw_enc_features |= NETIF_F_GSO_UDP_TUNNEL;
 	}
 
 	if (MLX5_CAP_ETH(mdev, tunnel_stateless_gre)) {

commit aec707a0d1558fa9fa1f32ff5c200e013fe1f641
Author: Huy Nguyen <huyn@nvidia.com>
Date:   Fri May 28 13:20:32 2021 -0500

    net/mlx5e: Remove dependency in IPsec initialization flows
    
    [ Upstream commit 8ad893e516a77209a1818a2072d2027d87db809f ]
    
    Currently, IPsec feature is disabled because mlx5e_build_nic_netdev
    is required to be called after mlx5e_ipsec_init. This requirement is
    invalid as mlx5e_build_nic_netdev and mlx5e_ipsec_init initialize
    independent resources.
    
    Remove ipsec pointer check in mlx5e_build_nic_netdev so that the
    two functions can be called at any order.
    
    Fixes: 547eede070eb ("net/mlx5e: IPSec, Innova IPSec offload infrastructure")
    Signed-off-by: Huy Nguyen <huyn@nvidia.com>
    Reviewed-by: Raed Salem <raeds@nvidia.com>
    Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c
index cf58c9637904..c467f5e981f6 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c
@@ -515,9 +515,6 @@ void mlx5e_ipsec_build_netdev(struct mlx5e_priv *priv)
 	struct mlx5_core_dev *mdev = priv->mdev;
 	struct net_device *netdev = priv->netdev;
 
-	if (!priv->ipsec)
-		return;
-
 	if (!(mlx5_accel_ipsec_device_caps(mdev) & MLX5_ACCEL_IPSEC_CAP_ESP) ||
 	    !MLX5_CAP_ETH(mdev, swp)) {
 		mlx5_core_dbg(mdev, "mlx5e: ESP and SWP offload not supported\n");

commit ba14e0b49388ef9f02787fe3dc719e0621169e64
Author: Ido Schimmel <idosch@nvidia.com>
Date:   Wed Jun 9 14:17:53 2021 +0300

    rtnetlink: Fix regression in bridge VLAN configuration
    
    [ Upstream commit d2e381c4963663bca6f30c3b996fa4dbafe8fcb5 ]
    
    Cited commit started returning errors when notification info is not
    filled by the bridge driver, resulting in the following regression:
    
     # ip link add name br1 type bridge vlan_filtering 1
     # bridge vlan add dev br1 vid 555 self pvid untagged
     RTNETLINK answers: Invalid argument
    
    As long as the bridge driver does not fill notification info for the
    bridge device itself, an empty notification should not be considered as
    an error. This is explained in commit 59ccaaaa49b5 ("bridge: dont send
    notification when skb->len == 0 in rtnl_bridge_notify").
    
    Fix by removing the error and add a comment to avoid future bugs.
    
    Fixes: a8db57c1d285 ("rtnetlink: Fix missing error code in rtnl_bridge_notify()")
    Signed-off-by: Ido Schimmel <idosch@nvidia.com>
    Reviewed-by: Nikolay Aleksandrov <nikolay@nvidia.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 7f2dda27f9e7..055fd09ac111 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -4102,10 +4102,12 @@ static int rtnl_bridge_notify(struct net_device *dev)
 	if (err < 0)
 		goto errout;
 
-	if (!skb->len) {
-		err = -EINVAL;
+	/* Notification info is only filled for bridge ports, not the bridge
+	 * device itself. Therefore, a zero notification length is valid and
+	 * should not result in an error.
+	 */
+	if (!skb->len)
 		goto errout;
-	}
 
 	rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC);
 	return 0;

commit 2f73448041bd0682d4b552cfd314ace66107f1ad
Author: Paolo Abeni <pabeni@redhat.com>
Date:   Wed Jun 9 11:49:01 2021 +0200

    udp: fix race between close() and udp_abort()
    
    [ Upstream commit a8b897c7bcd47f4147d066e22cc01d1026d7640e ]
    
    Kaustubh reported and diagnosed a panic in udp_lib_lookup().
    The root cause is udp_abort() racing with close(). Both
    racing functions acquire the socket lock, but udp{v6}_destroy_sock()
    release it before performing destructive actions.
    
    We can't easily extend the socket lock scope to avoid the race,
    instead use the SOCK_DEAD flag to prevent udp_abort from doing
    any action when the critical race happens.
    
    Diagnosed-and-tested-by: Kaustubh Pandey <kapandey@codeaurora.org>
    Fixes: 5d77dca82839 ("net: diag: support SOCK_DESTROY for UDP sockets")
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index 110af0e7dc7b..2ff9f774d446 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -2432,6 +2432,9 @@ void udp_destroy_sock(struct sock *sk)
 {
 	struct udp_sock *up = udp_sk(sk);
 	bool slow = lock_sock_fast(sk);
+
+	/* protects from races with udp_abort() */
+	sock_set_flag(sk, SOCK_DEAD);
 	udp_flush_pending_frames(sk);
 	unlock_sock_fast(sk, slow);
 	if (static_branch_unlikely(&udp_encap_needed_key) && up->encap_type) {
@@ -2673,10 +2676,17 @@ int udp_abort(struct sock *sk, int err)
 {
 	lock_sock(sk);
 
+	/* udp{v6}_destroy_sock() sets it under the sk lock, avoid racing
+	 * with close()
+	 */
+	if (sock_flag(sk, SOCK_DEAD))
+		goto out;
+
 	sk->sk_err = err;
 	sk->sk_error_report(sk);
 	__udp_disconnect(sk, 0);
 
+out:
 	release_sock(sk);
 
 	return 0;
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index 6799ad462be3..c4a76c6af205 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -1476,6 +1476,9 @@ void udpv6_destroy_sock(struct sock *sk)
 {
 	struct udp_sock *up = udp_sk(sk);
 	lock_sock(sk);
+
+	/* protects from races with udp_abort() */
+	sock_set_flag(sk, SOCK_DEAD);
 	udp_v6_flush_pending_frames(sk);
 	release_sock(sk);
 

commit 06b7cb0194bd1ede0dd27f3a946e7c0279fba44a
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Tue Jun 8 11:06:41 2021 +0300

    net: rds: fix memory leak in rds_recvmsg
    
    [ Upstream commit 49bfcbfd989a8f1f23e705759a6bb099de2cff9f ]
    
    Syzbot reported memory leak in rds. The problem
    was in unputted refcount in case of error.
    
    int rds_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
                    int msg_flags)
    {
    ...
    
            if (!rds_next_incoming(rs, &inc)) {
                    ...
            }
    
    After this "if" inc refcount incremented and
    
            if (rds_cmsg_recv(inc, msg, rs)) {
                    ret = -EFAULT;
                    goto out;
            }
    ...
    out:
            return ret;
    }
    
    in case of rds_cmsg_recv() fail the refcount won't be
    decremented. And it's easy to see from ftrace log, that
    rds_inc_addref() don't have rds_inc_put() pair in
    rds_recvmsg() after rds_cmsg_recv()
    
     1)               |  rds_recvmsg() {
     1)   3.721 us    |    rds_inc_addref();
     1)   3.853 us    |    rds_message_inc_copy_to_user();
     1) + 10.395 us   |    rds_cmsg_recv();
     1) + 34.260 us   |  }
    
    Fixes: bdbe6fbc6a2f ("RDS: recv.c")
    Reported-and-tested-by: syzbot+5134cdf021c4ed5aaa5f@syzkaller.appspotmail.com
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Reviewed-by: Håkon Bugge <haakon.bugge@oracle.com>
    Acked-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/rds/recv.c b/net/rds/recv.c
index 3ca278988b52..ccf0bf283002 100644
--- a/net/rds/recv.c
+++ b/net/rds/recv.c
@@ -705,7 +705,7 @@ int rds_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
 
 		if (rds_cmsg_recv(inc, msg, rs)) {
 			ret = -EFAULT;
-			goto out;
+			break;
 		}
 		rds_recvmsg_zcookie(rs, msg);
 

commit 5340858147e3dc60913fb3dd0cbb758ec4a26e66
Author: Nanyong Sun <sunnanyong@huawei.com>
Date:   Tue Jun 8 09:51:58 2021 +0800

    net: ipv4: fix memory leak in netlbl_cipsov4_add_std
    
    [ Upstream commit d612c3f3fae221e7ea736d196581c2217304bbbc ]
    
    Reported by syzkaller:
    BUG: memory leak
    unreferenced object 0xffff888105df7000 (size 64):
    comm "syz-executor842", pid 360, jiffies 4294824824 (age 22.546s)
    hex dump (first 32 bytes):
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
    backtrace:
    [<00000000e67ed558>] kmalloc include/linux/slab.h:590 [inline]
    [<00000000e67ed558>] kzalloc include/linux/slab.h:720 [inline]
    [<00000000e67ed558>] netlbl_cipsov4_add_std net/netlabel/netlabel_cipso_v4.c:145 [inline]
    [<00000000e67ed558>] netlbl_cipsov4_add+0x390/0x2340 net/netlabel/netlabel_cipso_v4.c:416
    [<0000000006040154>] genl_family_rcv_msg_doit.isra.0+0x20e/0x320 net/netlink/genetlink.c:739
    [<00000000204d7a1c>] genl_family_rcv_msg net/netlink/genetlink.c:783 [inline]
    [<00000000204d7a1c>] genl_rcv_msg+0x2bf/0x4f0 net/netlink/genetlink.c:800
    [<00000000c0d6a995>] netlink_rcv_skb+0x134/0x3d0 net/netlink/af_netlink.c:2504
    [<00000000d78b9d2c>] genl_rcv+0x24/0x40 net/netlink/genetlink.c:811
    [<000000009733081b>] netlink_unicast_kernel net/netlink/af_netlink.c:1314 [inline]
    [<000000009733081b>] netlink_unicast+0x4a0/0x6a0 net/netlink/af_netlink.c:1340
    [<00000000d5fd43b8>] netlink_sendmsg+0x789/0xc70 net/netlink/af_netlink.c:1929
    [<000000000a2d1e40>] sock_sendmsg_nosec net/socket.c:654 [inline]
    [<000000000a2d1e40>] sock_sendmsg+0x139/0x170 net/socket.c:674
    [<00000000321d1969>] ____sys_sendmsg+0x658/0x7d0 net/socket.c:2350
    [<00000000964e16bc>] ___sys_sendmsg+0xf8/0x170 net/socket.c:2404
    [<000000001615e288>] __sys_sendmsg+0xd3/0x190 net/socket.c:2433
    [<000000004ee8b6a5>] do_syscall_64+0x37/0x90 arch/x86/entry/common.c:47
    [<00000000171c7cee>] entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    The memory of doi_def->map.std pointing is allocated in
    netlbl_cipsov4_add_std, but no place has freed it. It should be
    freed in cipso_v4_doi_free which frees the cipso DOI resource.
    
    Fixes: 96cb8e3313c7a ("[NetLabel]: CIPSOv4 and Unlabeled packet integration")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Nanyong Sun <sunnanyong@huawei.com>
    Acked-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv4/cipso_ipv4.c b/net/ipv4/cipso_ipv4.c
index 6a1b52b34e20..e8b8dd1cb157 100644
--- a/net/ipv4/cipso_ipv4.c
+++ b/net/ipv4/cipso_ipv4.c
@@ -486,6 +486,7 @@ void cipso_v4_doi_free(struct cipso_v4_doi *doi_def)
 		kfree(doi_def->map.std->lvl.local);
 		kfree(doi_def->map.std->cat.cipso);
 		kfree(doi_def->map.std->cat.local);
+		kfree(doi_def->map.std);
 		break;
 	}
 	kfree(doi_def);

commit e8e9d2968a9d08bf5c683afca182f1537edebf8d
Author: Sven Eckelmann <sven@narfation.org>
Date:   Tue May 18 21:00:27 2021 +0200

    batman-adv: Avoid WARN_ON timing related checks
    
    [ Upstream commit 9f460ae31c4435fd022c443a6029352217a16ac1 ]
    
    The soft/batadv interface for a queued OGM can be changed during the time
    the OGM was queued for transmission and when the OGM is actually
    transmitted by the worker.
    
    But WARN_ON must be used to denote kernel bugs and not to print simple
    warnings. A warning can simply be printed using pr_warn.
    
    Reported-by: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
    Reported-by: syzbot+c0b807de416427ff3dd1@syzkaller.appspotmail.com
    Fixes: ef0a937f7a14 ("batman-adv: consider outgoing interface in OGM sending")
    Signed-off-by: Sven Eckelmann <sven@narfation.org>
    Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c
index 0b052ff51bde..cede6826e5b3 100644
--- a/net/batman-adv/bat_iv_ogm.c
+++ b/net/batman-adv/bat_iv_ogm.c
@@ -594,8 +594,10 @@ static void batadv_iv_ogm_emit(struct batadv_forw_packet *forw_packet)
 	if (WARN_ON(!forw_packet->if_outgoing))
 		return;
 
-	if (WARN_ON(forw_packet->if_outgoing->soft_iface != soft_iface))
+	if (forw_packet->if_outgoing->soft_iface != soft_iface) {
+		pr_warn("%s: soft interface switch for queued OGM\n", __func__);
 		return;
+	}
 
 	if (forw_packet->if_incoming->if_status != BATADV_IF_ACTIVE)
 		return;

commit 6d210d547adc2218ef8b5bcf23518c5f2f1fd872
Author: yangerkun <yangerkun@huawei.com>
Date:   Tue Jun 15 18:23:32 2021 -0700

    mm/memory-failure: make sure wait for page writeback in memory_failure
    
    [ Upstream commit e8675d291ac007e1c636870db880f837a9ea112a ]
    
    Our syzkaller trigger the "BUG_ON(!list_empty(&inode->i_wb_list))" in
    clear_inode:
    
      kernel BUG at fs/inode.c:519!
      Internal error: Oops - BUG: 0 [#1] SMP
      Modules linked in:
      Process syz-executor.0 (pid: 249, stack limit = 0x00000000a12409d7)
      CPU: 1 PID: 249 Comm: syz-executor.0 Not tainted 4.19.95
      Hardware name: linux,dummy-virt (DT)
      pstate: 80000005 (Nzcv daif -PAN -UAO)
      pc : clear_inode+0x280/0x2a8
      lr : clear_inode+0x280/0x2a8
      Call trace:
        clear_inode+0x280/0x2a8
        ext4_clear_inode+0x38/0xe8
        ext4_free_inode+0x130/0xc68
        ext4_evict_inode+0xb20/0xcb8
        evict+0x1a8/0x3c0
        iput+0x344/0x460
        do_unlinkat+0x260/0x410
        __arm64_sys_unlinkat+0x6c/0xc0
        el0_svc_common+0xdc/0x3b0
        el0_svc_handler+0xf8/0x160
        el0_svc+0x10/0x218
      Kernel panic - not syncing: Fatal exception
    
    A crash dump of this problem show that someone called __munlock_pagevec
    to clear page LRU without lock_page: do_mmap -> mmap_region -> do_munmap
    -> munlock_vma_pages_range -> __munlock_pagevec.
    
    As a result memory_failure will call identify_page_state without
    wait_on_page_writeback.  And after truncate_error_page clear the mapping
    of this page.  end_page_writeback won't call sb_clear_inode_writeback to
    clear inode->i_wb_list.  That will trigger BUG_ON in clear_inode!
    
    Fix it by checking PageWriteback too to help determine should we skip
    wait_on_page_writeback.
    
    Link: https://lkml.kernel.org/r/20210604084705.3729204-1-yangerkun@huawei.com
    Fixes: 0bc1f8b0682c ("hwpoison: fix the handling path of the victimized page frame that belong to non-LRU")
    Signed-off-by: yangerkun <yangerkun@huawei.com>
    Acked-by: Naoya Horiguchi <naoya.horiguchi@nec.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Theodore Ts'o <tytso@mit.edu>
    Cc: Oscar Salvador <osalvador@suse.de>
    Cc: Yu Kuai <yukuai3@huawei.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/memory-failure.c b/mm/memory-failure.c
index 034607a68ccb..3da3c63dccd1 100644
--- a/mm/memory-failure.c
+++ b/mm/memory-failure.c
@@ -1387,7 +1387,12 @@ int memory_failure(unsigned long pfn, int flags)
 		return 0;
 	}
 
-	if (!PageTransTail(p) && !PageLRU(p))
+	/*
+	 * __munlock_pagevec may clear a writeback page's LRU flag without
+	 * page_lock. We need wait writeback completion for this page or it
+	 * may trigger vfs BUG while evict inode.
+	 */
+	if (!PageTransTail(p) && !PageLRU(p) && !PageWriteback(p))
 		goto identify_page_state;
 
 	/*

commit 6b907d1a1ea9b95fc390c85e9c318ef99beaf968
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Tue Jun 15 08:39:52 2021 +0100

    afs: Fix an IS_ERR() vs NULL check
    
    [ Upstream commit a33d62662d275cee22888fa7760fe09d5b9cd1f9 ]
    
    The proc_symlink() function returns NULL on error, it doesn't return
    error pointers.
    
    Fixes: 5b86d4ff5dce ("afs: Implement network namespacing")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: David Howells <dhowells@redhat.com>
    cc: linux-afs@lists.infradead.org
    Link: https://lore.kernel.org/r/YLjMRKX40pTrJvgf@mwanda/
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/afs/main.c b/fs/afs/main.c
index 8ecb127be63f..2eecb2c0a3c0 100644
--- a/fs/afs/main.c
+++ b/fs/afs/main.c
@@ -200,8 +200,8 @@ static int __init afs_init(void)
 		goto error_fs;
 
 	afs_proc_symlink = proc_symlink("fs/afs", NULL, "../self/net/afs");
-	if (IS_ERR(afs_proc_symlink)) {
-		ret = PTR_ERR(afs_proc_symlink);
+	if (!afs_proc_symlink) {
+		ret = -ENOMEM;
 		goto error_proc;
 	}
 

commit 53f0b1fffafe99f40006fb1be99adf71a3472741
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Tue May 18 22:11:08 2021 +0800

    dmaengine: stedma40: add missing iounmap() on error in d40_probe()
    
    [ Upstream commit fffdaba402cea79b8d219355487d342ec23f91c6 ]
    
    Add the missing iounmap() before return from d40_probe()
    in the error handling case.
    
    Fixes: 8d318a50b3d7 ("DMAENGINE: Support for ST-Ericssons DMA40 block v3")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
    Link: https://lore.kernel.org/r/20210518141108.1324127-1-yangyingliang@huawei.com
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/dma/ste_dma40.c b/drivers/dma/ste_dma40.c
index 3d55405c49ca..e588dc5daaa8 100644
--- a/drivers/dma/ste_dma40.c
+++ b/drivers/dma/ste_dma40.c
@@ -3663,6 +3663,9 @@ static int __init d40_probe(struct platform_device *pdev)
 
 	kfree(base->lcla_pool.base_unaligned);
 
+	if (base->lcpa_base)
+		iounmap(base->lcpa_base);
+
 	if (base->phy_lcpa)
 		release_mem_region(base->phy_lcpa,
 				   base->lcpa_size);

commit c74f609772465ec6c7774c60be33b495e0414dd6
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Fri May 21 19:13:11 2021 -0700

    dmaengine: QCOM_HIDMA_MGMT depends on HAS_IOMEM
    
    [ Upstream commit 0cfbb589d67f16fa55b26ae02b69c31b52e344b1 ]
    
    When CONFIG_HAS_IOMEM is not set/enabled, certain iomap() family
    functions [including ioremap(), devm_ioremap(), etc.] are not
    available.
    Drivers that use these functions should depend on HAS_IOMEM so that
    they do not cause build errors.
    
    Rectifies these build errors:
    s390-linux-ld: drivers/dma/qcom/hidma_mgmt.o: in function `hidma_mgmt_probe':
    hidma_mgmt.c:(.text+0x780): undefined reference to `devm_ioremap_resource'
    s390-linux-ld: drivers/dma/qcom/hidma_mgmt.o: in function `hidma_mgmt_init':
    hidma_mgmt.c:(.init.text+0x126): undefined reference to `of_address_to_resource'
    s390-linux-ld: hidma_mgmt.c:(.init.text+0x16e): undefined reference to `of_address_to_resource'
    
    Fixes: 67a2003e0607 ("dmaengine: add Qualcomm Technologies HIDMA channel driver")
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Reported-by: kernel test robot <lkp@intel.com>
    Cc: Sinan Kaya <okaya@codeaurora.org>
    Cc: Vinod Koul <vkoul@kernel.org>
    Cc: dmaengine@vger.kernel.org
    Link: https://lore.kernel.org/r/20210522021313.16405-3-rdunlap@infradead.org
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/dma/qcom/Kconfig b/drivers/dma/qcom/Kconfig
index a7761c4025f4..a97c7123d913 100644
--- a/drivers/dma/qcom/Kconfig
+++ b/drivers/dma/qcom/Kconfig
@@ -9,6 +9,7 @@ config QCOM_BAM_DMA
 
 config QCOM_HIDMA_MGMT
 	tristate "Qualcomm Technologies HIDMA Management support"
+	depends on HAS_IOMEM
 	select DMA_ENGINE
 	help
 	  Enable support for the Qualcomm Technologies HIDMA Management.

commit df1f5fc7f2d9a21b7de6221167a85fbb2336a588
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Fri May 21 19:13:10 2021 -0700

    dmaengine: ALTERA_MSGDMA depends on HAS_IOMEM
    
    [ Upstream commit 253697b93c2a1c237d34d3ae326e394aeb0ca7b3 ]
    
    When CONFIG_HAS_IOMEM is not set/enabled, certain iomap() family
    functions [including ioremap(), devm_ioremap(), etc.] are not
    available.
    Drivers that use these functions should depend on HAS_IOMEM so that
    they do not cause build errors.
    
    Repairs this build error:
    s390-linux-ld: drivers/dma/altera-msgdma.o: in function `request_and_map':
    altera-msgdma.c:(.text+0x14b0): undefined reference to `devm_ioremap'
    
    Fixes: a85c6f1b2921 ("dmaengine: Add driver for Altera / Intel mSGDMA IP core")
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Reported-by: kernel test robot <lkp@intel.com>
    Cc: Stefan Roese <sr@denx.de>
    Cc: Vinod Koul <vkoul@kernel.org>
    Cc: dmaengine@vger.kernel.org
    Reviewed-by: Stefan Roese <sr@denx.de>
    Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr@denx.de
    Link: https://lore.kernel.org/r/20210522021313.16405-2-rdunlap@infradead.org
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
index a4f95574eb9a..52dd4bd7c209 100644
--- a/drivers/dma/Kconfig
+++ b/drivers/dma/Kconfig
@@ -58,6 +58,7 @@ config DMA_OF
 #devices
 config ALTERA_MSGDMA
 	tristate "Altera / Intel mSGDMA Engine"
+	depends on HAS_IOMEM
 	select DMA_ENGINE
 	help
 	  Enable support for Altera / Intel mSGDMA controller.

commit 7e3f278d55b0677aa82d07ba521390c8b090ee69
Author: Zheng Yongjun <zhengyongjun3@huawei.com>
Date:   Wed Jun 2 22:06:58 2021 +0800

    fib: Return the correct errno code
    
    [ Upstream commit 59607863c54e9eb3f69afc5257dfe71c38bb751e ]
    
    When kalloc or kmemdup failed, should return ENOMEM rather than ENOBUF.
    
    Signed-off-by: Zheng Yongjun <zhengyongjun3@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c
index 8916c5d9b3b3..46a13ed15c4e 100644
--- a/net/core/fib_rules.c
+++ b/net/core/fib_rules.c
@@ -1105,7 +1105,7 @@ static void notify_rule_change(int event, struct fib_rule *rule,
 {
 	struct net *net;
 	struct sk_buff *skb;
-	int err = -ENOBUFS;
+	int err = -ENOMEM;
 
 	net = ops->fro_net;
 	skb = nlmsg_new(fib_rule_nlmsg_size(ops, rule), GFP_KERNEL);

commit b966a0defc93c533c0f96410c20f50c42a5fed52
Author: Zheng Yongjun <zhengyongjun3@huawei.com>
Date:   Wed Jun 2 22:06:40 2021 +0800

    net: Return the correct errno code
    
    [ Upstream commit 49251cd00228a3c983651f6bb2f33f6a0b8f152e ]
    
    When kalloc or kmemdup failed, should return ENOMEM rather than ENOBUF.
    
    Signed-off-by: Zheng Yongjun <zhengyongjun3@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/compat.c b/net/compat.c
index 2a8c7cb5f06a..2778a236e091 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -158,7 +158,7 @@ int cmsghdr_from_user_compat_to_kern(struct msghdr *kmsg, struct sock *sk,
 	if (kcmlen > stackbuf_size)
 		kcmsg_base = kcmsg = sock_kmalloc(sk, kcmlen, GFP_KERNEL);
 	if (kcmsg == NULL)
-		return -ENOBUFS;
+		return -ENOMEM;
 
 	/* Now copy them over neatly. */
 	memset(kcmsg, 0, kcmlen);

commit 1f61f0ee4a94c73e505b38f0ff045a0e7e19fa61
Author: Zheng Yongjun <zhengyongjun3@huawei.com>
Date:   Wed Jun 2 22:06:30 2021 +0800

    net/x25: Return the correct errno code
    
    [ Upstream commit d7736958668c4facc15f421e622ffd718f5be80a ]
    
    When kalloc or kmemdup failed, should return ENOMEM rather than ENOBUF.
    
    Signed-off-by: Zheng Yongjun <zhengyongjun3@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c
index f43d037ea852..f87002792836 100644
--- a/net/x25/af_x25.c
+++ b/net/x25/af_x25.c
@@ -551,7 +551,7 @@ static int x25_create(struct net *net, struct socket *sock, int protocol,
 	if (protocol)
 		goto out;
 
-	rc = -ENOBUFS;
+	rc = -ENOMEM;
 	if ((sk = x25_alloc_socket(net, kern)) == NULL)
 		goto out;
 

commit 7e0147403ebae2fc60b1657114058d20e874a89a
Author: Jiapeng Chong <jiapeng.chong@linux.alibaba.com>
Date:   Wed Jun 2 18:15:04 2021 +0800

    rtnetlink: Fix missing error code in rtnl_bridge_notify()
    
    [ Upstream commit a8db57c1d285c758adc7fb43d6e2bad2554106e1 ]
    
    The error code is missing in this code scenario, add the error code
    '-EINVAL' to the return value 'err'.
    
    Eliminate the follow smatch warning:
    
    net/core/rtnetlink.c:4834 rtnl_bridge_notify() warn: missing error code
    'err'.
    
    Reported-by: Abaci Robot <abaci@linux.alibaba.com>
    Signed-off-by: Jiapeng Chong <jiapeng.chong@linux.alibaba.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 935053ee7765..7f2dda27f9e7 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -4102,8 +4102,10 @@ static int rtnl_bridge_notify(struct net_device *dev)
 	if (err < 0)
 		goto errout;
 
-	if (!skb->len)
+	if (!skb->len) {
+		err = -EINVAL;
 		goto errout;
+	}
 
 	rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC);
 	return 0;

commit 51c0007f4c6b88f22c2a5bfb099d7654f0db973c
Author: Josh Triplett <josh@joshtriplett.org>
Date:   Tue Jun 1 18:38:41 2021 -0700

    net: ipconfig: Don't override command-line hostnames or domains
    
    [ Upstream commit b508d5fb69c2211a1b860fc058aafbefc3b3c3cd ]
    
    If the user specifies a hostname or domain name as part of the ip=
    command-line option, preserve it and don't overwrite it with one
    supplied by DHCP/BOOTP.
    
    For instance, ip=::::myhostname::dhcp will use "myhostname" rather than
    ignoring and overwriting it.
    
    Fix the comment on ic_bootp_string that suggests it only copies a string
    "if not already set"; it doesn't have any such logic.
    
    Signed-off-by: Josh Triplett <josh@joshtriplett.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c
index 88212615bf4c..58719b9635d9 100644
--- a/net/ipv4/ipconfig.c
+++ b/net/ipv4/ipconfig.c
@@ -866,7 +866,7 @@ static void __init ic_bootp_send_if(struct ic_device *d, unsigned long jiffies_d
 
 
 /*
- *  Copy BOOTP-supplied string if not already set.
+ *  Copy BOOTP-supplied string
  */
 static int __init ic_bootp_string(char *dest, char *src, int len, int max)
 {
@@ -915,12 +915,15 @@ static void __init ic_do_bootp_ext(u8 *ext)
 		}
 		break;
 	case 12:	/* Host name */
-		ic_bootp_string(utsname()->nodename, ext+1, *ext,
-				__NEW_UTS_LEN);
-		ic_host_name_set = 1;
+		if (!ic_host_name_set) {
+			ic_bootp_string(utsname()->nodename, ext+1, *ext,
+					__NEW_UTS_LEN);
+			ic_host_name_set = 1;
+		}
 		break;
 	case 15:	/* Domain name (DNS) */
-		ic_bootp_string(ic_domain, ext+1, *ext, sizeof(ic_domain));
+		if (!ic_domain[0])
+			ic_bootp_string(ic_domain, ext+1, *ext, sizeof(ic_domain));
 		break;
 	case 17:	/* Root path */
 		if (!root_server_path[0])

commit 9ccbe18eb48a9b27b646931e01d84dfe0bc8a10d
Author: Hannes Reinecke <hare@suse.de>
Date:   Wed May 26 17:23:17 2021 +0200

    nvme-loop: check for NVME_LOOP_Q_LIVE in nvme_loop_destroy_admin_queue()
    
    [ Upstream commit 4237de2f73a669e4f89ac0aa2b44fb1a1d9ec583 ]
    
    We need to check the NVME_LOOP_Q_LIVE flag in
    nvme_loop_destroy_admin_queue() to protect against duplicate
    invocations eg during concurrent reset and remove calls.
    
    Signed-off-by: Hannes Reinecke <hare@suse.de>
    Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/nvme/target/loop.c b/drivers/nvme/target/loop.c
index dba0b0145f48..08b52f3ed0c3 100644
--- a/drivers/nvme/target/loop.c
+++ b/drivers/nvme/target/loop.c
@@ -274,7 +274,8 @@ static const struct blk_mq_ops nvme_loop_admin_mq_ops = {
 
 static void nvme_loop_destroy_admin_queue(struct nvme_loop_ctrl *ctrl)
 {
-	clear_bit(NVME_LOOP_Q_LIVE, &ctrl->queues[0].flags);
+	if (!test_and_clear_bit(NVME_LOOP_Q_LIVE, &ctrl->queues[0].flags))
+		return;
 	nvmet_sq_destroy(&ctrl->queues[0].nvme_sq);
 	blk_cleanup_queue(ctrl->ctrl.admin_q);
 	blk_mq_free_tag_set(&ctrl->admin_tag_set);

commit ef244ccfd1c213fa8c05b58b6760640718e9b636
Author: Hannes Reinecke <hare@suse.de>
Date:   Wed May 26 17:23:16 2021 +0200

    nvme-loop: clear NVME_LOOP_Q_LIVE when nvme_loop_configure_admin_queue() fails
    
    [ Upstream commit 1c5f8e882a05de5c011e8c3fbeceb0d1c590eb53 ]
    
    When the call to nvme_enable_ctrl() in nvme_loop_configure_admin_queue()
    fails the NVME_LOOP_Q_LIVE flag is not cleared.
    
    Signed-off-by: Hannes Reinecke <hare@suse.de>
    Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/nvme/target/loop.c b/drivers/nvme/target/loop.c
index 7b6e44ed299a..dba0b0145f48 100644
--- a/drivers/nvme/target/loop.c
+++ b/drivers/nvme/target/loop.c
@@ -418,6 +418,7 @@ static int nvme_loop_configure_admin_queue(struct nvme_loop_ctrl *ctrl)
 	return 0;
 
 out_cleanup_queue:
+	clear_bit(NVME_LOOP_Q_LIVE, &ctrl->queues[0].flags);
 	blk_cleanup_queue(ctrl->ctrl.admin_q);
 out_free_tagset:
 	blk_mq_free_tag_set(&ctrl->admin_tag_set);

commit a0a60f6092b50a0cc261e829bb5fbb2ac33dac29
Author: Hannes Reinecke <hare@suse.de>
Date:   Wed May 26 17:23:15 2021 +0200

    nvme-loop: reset queue count to 1 in nvme_loop_destroy_io_queues()
    
    [ Upstream commit a6c144f3d2e230f2b3ac5ed8c51e0f0391556197 ]
    
    The queue count is increased in nvme_loop_init_io_queues(), so we
    need to reset it to 1 at the end of nvme_loop_destroy_io_queues().
    Otherwise the function is not re-entrant safe, and crash will happen
    during concurrent reset and remove calls.
    
    Signed-off-by: Hannes Reinecke <hare@suse.de>
    Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/nvme/target/loop.c b/drivers/nvme/target/loop.c
index 137a27fa369c..7b6e44ed299a 100644
--- a/drivers/nvme/target/loop.c
+++ b/drivers/nvme/target/loop.c
@@ -309,6 +309,7 @@ static void nvme_loop_destroy_io_queues(struct nvme_loop_ctrl *ctrl)
 		clear_bit(NVME_LOOP_Q_LIVE, &ctrl->queues[i].flags);
 		nvmet_sq_destroy(&ctrl->queues[i].nvme_sq);
 	}
+	ctrl->ctrl.queue_count = 1;
 }
 
 static int nvme_loop_init_io_queues(struct nvme_loop_ctrl *ctrl)

commit fff7a22c612130ff4e18bdbc4741c7f936caa9ad
Author: Ewan D. Milne <emilne@redhat.com>
Date:   Tue Jun 1 13:52:14 2021 -0400

    scsi: scsi_devinfo: Add blacklist entry for HPE OPEN-V
    
    [ Upstream commit e57f5cd99ca60cddf40201b0f4ced9f1938e299c ]
    
    Apparently some arrays are now returning "HPE" as the vendor.
    
    Link: https://lore.kernel.org/r/20210601175214.25719-1-emilne@redhat.com
    Signed-off-by: Ewan D. Milne <emilne@redhat.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c
index a08ff3bd6310..6a2a413cc97e 100644
--- a/drivers/scsi/scsi_devinfo.c
+++ b/drivers/scsi/scsi_devinfo.c
@@ -184,6 +184,7 @@ static struct {
 	{"HP", "C3323-300", "4269", BLIST_NOTQ},
 	{"HP", "C5713A", NULL, BLIST_NOREPORTLUN},
 	{"HP", "DISK-SUBSYSTEM", "*", BLIST_REPORTLUN2},
+	{"HPE", "OPEN-", "*", BLIST_REPORTLUN2 | BLIST_TRY_VPD_PAGES},
 	{"IBM", "AuSaV1S2", NULL, BLIST_FORCELUN},
 	{"IBM", "ProFibre 4000R", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
 	{"IBM", "2105", NULL, BLIST_RETRY_HWERROR},

commit c6095a0fa07f3f88004f23dd5993d4af27afd55d
Author: Jiapeng Chong <jiapeng.chong@linux.alibaba.com>
Date:   Tue Jun 1 19:04:51 2021 +0800

    ethernet: myri10ge: Fix missing error code in myri10ge_probe()
    
    [ Upstream commit f336d0b93ae978f12c5e27199f828da89b91e56a ]
    
    The error code is missing in this code scenario, add the error code
    '-EINVAL' to the return value 'status'.
    
    Eliminate the follow smatch warning:
    
    drivers/net/ethernet/myricom/myri10ge/myri10ge.c:3818 myri10ge_probe()
    warn: missing error code 'status'.
    
    Reported-by: Abaci Robot <abaci@linux.alibaba.com>
    Signed-off-by: Jiapeng Chong <jiapeng.chong@linux.alibaba.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/myricom/myri10ge/myri10ge.c b/drivers/net/ethernet/myricom/myri10ge/myri10ge.c
index 6789eed78ff7..3bc570c46f81 100644
--- a/drivers/net/ethernet/myricom/myri10ge/myri10ge.c
+++ b/drivers/net/ethernet/myricom/myri10ge/myri10ge.c
@@ -3853,6 +3853,7 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 		dev_err(&pdev->dev,
 			"invalid sram_size %dB or board span %ldB\n",
 			mgp->sram_size, mgp->board_span);
+		status = -EINVAL;
 		goto abort_with_ioremap;
 	}
 	memcpy_fromio(mgp->eeprom_strings,

commit 8fa2bb8837ea92f725e63ec38935195bc0266668
Author: Maurizio Lombardi <mlombard@redhat.com>
Date:   Mon May 31 14:13:26 2021 +0200

    scsi: target: core: Fix warning on realtime kernels
    
    [ Upstream commit 515da6f4295c2c42b8c54572cce3d2dd1167c41e ]
    
    On realtime kernels, spin_lock_irq*(spinlock_t) do not disable the
    interrupts, a call to irqs_disabled() will return false thus firing a
    warning in __transport_wait_for_tasks().
    
    Remove the warning and also replace assert_spin_locked() with
    lockdep_assert_held()
    
    Link: https://lore.kernel.org/r/20210531121326.3649-1-mlombard@redhat.com
    Reviewed-by: Bart Van Assche <bvanassche@acm.org>
    Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index bdada97cd4fe..9c60a090cfd1 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -2982,9 +2982,7 @@ __transport_wait_for_tasks(struct se_cmd *cmd, bool fabric_stop,
 	__releases(&cmd->t_state_lock)
 	__acquires(&cmd->t_state_lock)
 {
-
-	assert_spin_locked(&cmd->t_state_lock);
-	WARN_ON_ONCE(!irqs_disabled());
+	lockdep_assert_held(&cmd->t_state_lock);
 
 	if (fabric_stop)
 		cmd->transport_state |= CMD_T_FABRIC_STOP;

commit 094bf5670e762afa243d2c41a5c4ab71c7447bf4
Author: Hillf Danton <hdanton@sina.com>
Date:   Tue May 18 16:46:25 2021 +0800

    gfs2: Fix use-after-free in gfs2_glock_shrink_scan
    
    [ Upstream commit 1ab19c5de4c537ec0d9b21020395a5b5a6c059b2 ]
    
    The GLF_LRU flag is checked under lru_lock in gfs2_glock_remove_from_lru() to
    remove the glock from the lru list in __gfs2_glock_put().
    
    On the shrink scan path, the same flag is cleared under lru_lock but because
    of cond_resched_lock(&lru_lock) in gfs2_dispose_glock_lru(), progress on the
    put side can be made without deleting the glock from the lru list.
    
    Keep GLF_LRU across the race window opened by cond_resched_lock(&lru_lock) to
    ensure correct behavior on both sides - clear GLF_LRU after list_del under
    lru_lock.
    
    Reported-by: syzbot <syzbot+34ba7ddbf3021981a228@syzkaller.appspotmail.com>
    Signed-off-by: Hillf Danton <hdanton@sina.com>
    Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
index c20d71d86812..14d11ccda868 100644
--- a/fs/gfs2/glock.c
+++ b/fs/gfs2/glock.c
@@ -1457,6 +1457,7 @@ __acquires(&lru_lock)
 	while(!list_empty(list)) {
 		gl = list_entry(list->next, struct gfs2_glock, gl_lru);
 		list_del_init(&gl->gl_lru);
+		clear_bit(GLF_LRU, &gl->gl_flags);
 		if (!spin_trylock(&gl->gl_lockref.lock)) {
 add_back_to_lru:
 			list_add(&gl->gl_lru, &lru_list);
@@ -1502,7 +1503,6 @@ static long gfs2_scan_glock_lru(int nr)
 		if (!test_bit(GLF_LOCK, &gl->gl_flags)) {
 			list_move(&gl->gl_lru, &dispose);
 			atomic_dec(&lru_count);
-			clear_bit(GLF_LRU, &gl->gl_flags);
 			freed++;
 			continue;
 		}

commit f77cbc1b22ccccc60f73895a2ba875830f9199e5
Author: Bixuan Cui <cuibixuan@huawei.com>
Date:   Sat May 8 11:14:48 2021 +0800

    HID: gt683r: add missing MODULE_DEVICE_TABLE
    
    [ Upstream commit a4b494099ad657f1cb85436d333cf38870ee95bc ]
    
    This patch adds missing MODULE_DEVICE_TABLE definition which generates
    correct modalias for automatic loading of this driver when it is built
    as an external module.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Bixuan Cui <cuibixuan@huawei.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hid/hid-gt683r.c b/drivers/hid/hid-gt683r.c
index a298fbd8db6b..8ca4c1baeda8 100644
--- a/drivers/hid/hid-gt683r.c
+++ b/drivers/hid/hid-gt683r.c
@@ -64,6 +64,7 @@ static const struct hid_device_id gt683r_led_id[] = {
 	{ HID_USB_DEVICE(USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL) },
 	{ }
 };
+MODULE_DEVICE_TABLE(hid, gt683r_led_id);
 
 static void gt683r_brightness_set(struct led_classdev *led_cdev,
 				enum led_brightness brightness)

commit f88375b1de30713598ba8e6f5716797e4ee3ec3f
Author: Andreas Gruenbacher <agruenba@redhat.com>
Date:   Mon May 10 12:25:59 2021 +0200

    gfs2: Prevent direct-I/O write fallback errors from getting lost
    
    [ Upstream commit 43a511c44e58e357a687d61a20cf5ef1dc9e5a7c ]
    
    When a direct I/O write falls entirely and falls back to buffered I/O and the
    buffered I/O fails, the write failed with return value 0 instead of the error
    number reported by the buffered I/O. Fix that.
    
    Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c
index 143e7d518c5d..7c69486d556f 100644
--- a/fs/gfs2/file.c
+++ b/fs/gfs2/file.c
@@ -822,8 +822,11 @@ static ssize_t gfs2_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
 		current->backing_dev_info = inode_to_bdi(inode);
 		buffered = iomap_file_buffered_write(iocb, from, &gfs2_iomap_ops);
 		current->backing_dev_info = NULL;
-		if (unlikely(buffered <= 0))
+		if (unlikely(buffered <= 0)) {
+			if (!ret)
+				ret = buffered;
 			goto out_unlock;
+		}
 
 		/*
 		 * We need to ensure that the page cache pages are written to

commit e296c88f07ea85d87c5381433cc5c1189c7e8c80
Author: Yongqiang Liu <liuyongqiang13@huawei.com>
Date:   Thu Apr 1 13:15:33 2021 +0000

    ARM: OMAP2+: Fix build warning when mmc_omap is not built
    
    [ Upstream commit 040ab72ee10ea88e1883ad143b3e2b77596abc31 ]
    
    GCC reports the following warning with W=1:
    
    arch/arm/mach-omap2/board-n8x0.c:325:19: warning:
    variable 'index' set but not used [-Wunused-but-set-variable]
    325 |  int bit, *openp, index;
        |                   ^~~~~
    
    Fix this by moving CONFIG_MMC_OMAP to cover the rest codes
    in the n8x0_mmc_callback().
    
    Signed-off-by: Yongqiang Liu <liuyongqiang13@huawei.com>
    Signed-off-by: Tony Lindgren <tony@atomide.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c
index 75bc18646df6..902e9df9b8bb 100644
--- a/arch/arm/mach-omap2/board-n8x0.c
+++ b/arch/arm/mach-omap2/board-n8x0.c
@@ -325,6 +325,7 @@ static int n8x0_mmc_get_cover_state(struct device *dev, int slot)
 
 static void n8x0_mmc_callback(void *data, u8 card_mask)
 {
+#ifdef CONFIG_MMC_OMAP
 	int bit, *openp, index;
 
 	if (board_is_n800()) {
@@ -342,7 +343,6 @@ static void n8x0_mmc_callback(void *data, u8 card_mask)
 	else
 		*openp = 0;
 
-#ifdef CONFIG_MMC_OMAP
 	omap_mmc_notify_cover_event(mmc_device, index, *openp);
 #else
 	pr_warn("MMC: notify cover event not available\n");

commit 0e280502be1b003c3483ae03fc60dea554fcfa82
Author: Anirudh Rayabharam <mail@anirudhrb.com>
Date:   Sun Apr 25 23:03:53 2021 +0530

    HID: usbhid: fix info leak in hid_submit_ctrl
    
    [ Upstream commit 6be388f4a35d2ce5ef7dbf635a8964a5da7f799f ]
    
    In hid_submit_ctrl(), the way of calculating the report length doesn't
    take into account that report->size can be zero. When running the
    syzkaller reproducer, a report of size 0 causes hid_submit_ctrl) to
    calculate transfer_buffer_length as 16384. When this urb is passed to
    the usb core layer, KMSAN reports an info leak of 16384 bytes.
    
    To fix this, first modify hid_report_len() to account for the zero
    report size case by using DIV_ROUND_UP for the division. Then, call it
    from hid_submit_ctrl().
    
    Reported-by: syzbot+7c2bb71996f95a82524c@syzkaller.appspotmail.com
    Signed-off-by: Anirudh Rayabharam <mail@anirudhrb.com>
    Acked-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 1e6f8b0d00fb..6b6db57b49d6 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -377,7 +377,7 @@ static int hid_submit_ctrl(struct hid_device *hid)
 	raw_report = usbhid->ctrl[usbhid->ctrltail].raw_report;
 	dir = usbhid->ctrl[usbhid->ctrltail].dir;
 
-	len = ((report->size - 1) >> 3) + 1 + (report->id > 0);
+	len = hid_report_len(report);
 	if (dir == USB_DIR_OUT) {
 		usbhid->urbctrl->pipe = usb_sndctrlpipe(hid_to_usb_dev(hid), 0);
 		usbhid->urbctrl->transfer_buffer_length = len;
diff --git a/include/linux/hid.h b/include/linux/hid.h
index 4dcce83ca378..c833948aade0 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -1151,8 +1151,7 @@ static inline void hid_hw_wait(struct hid_device *hdev)
  */
 static inline u32 hid_report_len(struct hid_report *report)
 {
-	/* equivalent to DIV_ROUND_UP(report->size, 8) + !!(report->id > 0) */
-	return ((report->size - 1) >> 3) + 1 + (report->id > 0);
+	return DIV_ROUND_UP(report->size, 8) + (report->id > 0);
 }
 
 int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, u32 size,

commit e2d88292e7d09fce40ae38c5bf5fc5d26512382e
Author: Mark Bolhuis <mark@bolhuis.dev>
Date:   Mon May 3 17:39:38 2021 +0100

    HID: Add BUS_VIRTUAL to hid_connect logging
    
    [ Upstream commit 48e33befe61a7d407753c53d1a06fc8d6b5dab80 ]
    
    Add BUS_VIRTUAL to hid_connect logging since it's a valid hid bus type and it
    should not print <UNKNOWN>
    
    Signed-off-by: Mark Bolhuis <mark@bolhuis.dev>
    Signed-off-by: Jiri Kosina <jkosina@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index 9b66eb1d42c2..acbbc21e6233 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -1823,6 +1823,9 @@ int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
 	case BUS_I2C:
 		bus = "I2C";
 		break;
+	case BUS_VIRTUAL:
+		bus = "VIRTUAL";
+		break;
 	default:
 		bus = "<UNKNOWN>";
 	}

commit a1408334aad06cc6442b9cf66e8336bff2f114a5
Author: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Date:   Thu Apr 15 11:52:31 2021 -0700

    HID: hid-sensor-hub: Return error for hid_set_field() failure
    
    [ Upstream commit edb032033da0dc850f6e7740fa1023c73195bc89 ]
    
    In the function sensor_hub_set_feature(), return error when hid_set_field()
    fails.
    
    Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
    Acked-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hid/hid-sensor-hub.c b/drivers/hid/hid-sensor-hub.c
index 21fbdcde1faa..ef62f36ebcf9 100644
--- a/drivers/hid/hid-sensor-hub.c
+++ b/drivers/hid/hid-sensor-hub.c
@@ -223,16 +223,21 @@ int sensor_hub_set_feature(struct hid_sensor_hub_device *hsdev, u32 report_id,
 	buffer_size = buffer_size / sizeof(__s32);
 	if (buffer_size) {
 		for (i = 0; i < buffer_size; ++i) {
-			hid_set_field(report->field[field_index], i,
-				      (__force __s32)cpu_to_le32(*buf32));
+			ret = hid_set_field(report->field[field_index], i,
+					    (__force __s32)cpu_to_le32(*buf32));
+			if (ret)
+				goto done_proc;
+
 			++buf32;
 		}
 	}
 	if (remaining_bytes) {
 		value = 0;
 		memcpy(&value, (u8 *)buf32, remaining_bytes);
-		hid_set_field(report->field[field_index], i,
-			      (__force __s32)cpu_to_le32(value));
+		ret = hid_set_field(report->field[field_index], i,
+				    (__force __s32)cpu_to_le32(value));
+		if (ret)
+			goto done_proc;
 	}
 	hid_hw_request(hsdev->hdev, report, HID_REQ_SET_REPORT);
 	hid_hw_wait(hsdev->hdev);

commit 00b16396ad26fbb725d13c305f1d6e372e44f9f5
Author: Nirenjan Krishnan <nirenjan@gmail.com>
Date:   Mon Mar 29 09:10:02 2021 -0700

    HID: quirks: Set INCREMENT_USAGE_ON_DUPLICATE for Saitek X65
    
    [ Upstream commit 25bdbfbb2d8331a67824dd03d0087e9c98835f3a ]
    
    The Saitek X65 joystick has a pair of axes that were used as mouse
    pointer controls by the Windows driver. The corresponding usage page is
    the Game Controls page, which is not recognized by the generic HID
    driver, and therefore, both axes get mapped to ABS_MISC. The quirk makes
    the second axis get mapped to ABS_MISC+1, and therefore made available
    separately.
    
    Signed-off-by: Nirenjan Krishnan <nirenjan@gmail.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 75342f3dfb86..ee5dce862a21 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -999,6 +999,7 @@
 #define USB_DEVICE_ID_SAITEK_X52	0x075c
 #define USB_DEVICE_ID_SAITEK_X52_2	0x0255
 #define USB_DEVICE_ID_SAITEK_X52_PRO	0x0762
+#define USB_DEVICE_ID_SAITEK_X65	0x0b6a
 
 #define USB_VENDOR_ID_SAMSUNG		0x0419
 #define USB_DEVICE_ID_SAMSUNG_IR_REMOTE	0x0001
diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
index 8fbe7b9cd84a..48e9761d4ace 100644
--- a/drivers/hid/hid-quirks.c
+++ b/drivers/hid/hid-quirks.c
@@ -155,6 +155,7 @@ static const struct hid_device_id hid_quirks[] = {
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_X52), HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_X52_2), HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_X52_PRO), HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE },
+	{ HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_X65), HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SEMICO, USB_DEVICE_ID_SEMICO_USB_KEYKOARD2), HID_QUIRK_NO_INIT_REPORTS },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SEMICO, USB_DEVICE_ID_SEMICO_USB_KEYKOARD), HID_QUIRK_NO_INIT_REPORTS },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_SENNHEISER, USB_DEVICE_ID_SENNHEISER_BTD500USB), HID_QUIRK_NOGET },

commit 5f728ec65485625e30f46e5b4917ff023ad29ea0
Author: Dan Robertson <dan@dlrobertson.com>
Date:   Fri Apr 23 00:02:13 2021 -0400

    net: ieee802154: fix null deref in parse dev addr
    
    [ Upstream commit 9fdd04918a452980631ecc499317881c1d120b70 ]
    
    Fix a logic error that could result in a null deref if the user sets
    the mode incorrectly for the given addr type.
    
    Signed-off-by: Dan Robertson <dan@dlrobertson.com>
    Acked-by: Alexander Aring <aahringo@redhat.com>
    Link: https://lore.kernel.org/r/20210423040214.15438-2-dan@dlrobertson.com
    Signed-off-by: Stefan Schmidt <stefan@datenfreihafen.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ieee802154/nl802154.c b/net/ieee802154/nl802154.c
index b1c55db73764..6d4c71a52b6b 100644
--- a/net/ieee802154/nl802154.c
+++ b/net/ieee802154/nl802154.c
@@ -1315,19 +1315,20 @@ ieee802154_llsec_parse_dev_addr(struct nlattr *nla,
 				     nl802154_dev_addr_policy, NULL))
 		return -EINVAL;
 
-	if (!attrs[NL802154_DEV_ADDR_ATTR_PAN_ID] ||
-	    !attrs[NL802154_DEV_ADDR_ATTR_MODE] ||
-	    !(attrs[NL802154_DEV_ADDR_ATTR_SHORT] ||
-	      attrs[NL802154_DEV_ADDR_ATTR_EXTENDED]))
+	if (!attrs[NL802154_DEV_ADDR_ATTR_PAN_ID] || !attrs[NL802154_DEV_ADDR_ATTR_MODE])
 		return -EINVAL;
 
 	addr->pan_id = nla_get_le16(attrs[NL802154_DEV_ADDR_ATTR_PAN_ID]);
 	addr->mode = nla_get_u32(attrs[NL802154_DEV_ADDR_ATTR_MODE]);
 	switch (addr->mode) {
 	case NL802154_DEV_ADDR_SHORT:
+		if (!attrs[NL802154_DEV_ADDR_ATTR_SHORT])
+			return -EINVAL;
 		addr->short_addr = nla_get_le16(attrs[NL802154_DEV_ADDR_ATTR_SHORT]);
 		break;
 	case NL802154_DEV_ADDR_EXTENDED:
+		if (!attrs[NL802154_DEV_ADDR_ATTR_EXTENDED])
+			return -EINVAL;
 		addr->extended_addr = nla_get_le64(attrs[NL802154_DEV_ADDR_ATTR_EXTENDED]);
 		break;
 	default:

commit 36b35520b437b79a07d23b501a97f67fd184e51f
Author: Weixin Zhou <zwx@rock-chips.com>
Date:   Mon Jun 28 17:27:25 2021 +0800

    input: touchscreen: cyttsp5: fix memory out of bounds write issue
    
    Signed-off-by: Weixin Zhou <zwx@rock-chips.com>
    Change-Id: I8d58353b74b96d6014613ae01e8a25643e2a50c9

diff --git a/drivers/input/touchscreen/cyttsp5/cyttsp5_core.c b/drivers/input/touchscreen/cyttsp5/cyttsp5_core.c
index 7fac39a1bbaf..5dccaa1cf7de 100644
--- a/drivers/input/touchscreen/cyttsp5/cyttsp5_core.c
+++ b/drivers/input/touchscreen/cyttsp5/cyttsp5_core.c
@@ -1710,6 +1710,11 @@ static int cyttsp5_hid_output_read_conf_block_(struct cyttsp5_core_data *cd,
 	if (length < read_length)
 		length = read_length;
 
+	if (length + 10 > CY_MAX_INPUT) {
+		dev_err(cd->dev, "%s:%d: size=%d is larger than the max %d!!!\n",
+			__func__, __LINE__, length + 10, CY_MAX_INPUT);
+		return -EINVAL;
+	}
 	memcpy(read_buf, &cd->response_buf[10], length);
 	*crc = get_unaligned_le16(&cd->response_buf[read_length + 10]);
 
@@ -2481,6 +2486,11 @@ static int cyttsp5_hid_output_bl_get_information_(struct cyttsp5_core_data *cd,
 	if (!data_len)
 		return -EPROTO;
 
+	if (data_len + 8 > CY_MAX_INPUT) {
+		dev_err(cd->dev, "%s:%d: size=%d is larger than the max %d!!!\n",
+			__func__, __LINE__, data_len, CY_MAX_INPUT);
+		return -EINVAL;
+	}
 	memcpy(return_data, &cd->response_buf[8], data_len);
 
 	return 0;
@@ -3874,6 +3884,12 @@ static int move_touch_data(struct cyttsp5_core_data *cd,
 		tthe_print(cd, cd->input_buf, size, "OpModeData=");
 #endif
 
+	if (si->desc.tch_header_size > CY_MAX_INPUT) {
+		dev_err(cd->dev, "%s:%d: size=%d is larger than the max %d!!!\n",
+			__func__, __LINE__, si->desc.tch_header_size, CY_MAX_INPUT);
+		return -EINVAL;
+	}
+
 	memcpy(si->xy_mode, cd->input_buf, si->desc.tch_header_size);
 	cyttsp5_pr_buf(cd->dev, (u8 *)si->xy_mode, si->desc.tch_header_size,
 			"xy_mode");
@@ -3885,6 +3901,13 @@ static int move_touch_data(struct cyttsp5_core_data *cd,
 
 	length = num_cur_tch * si->desc.tch_record_size;
 
+	if ((length + si->desc.tch_header_size) > CY_MAX_INPUT) {
+		dev_err(cd->dev, "%s:%d: size=%d is larger than the max %d!!!\n",
+			__func__, __LINE__, length + si->desc.tch_header_size,
+			CY_MAX_INPUT);
+		return -EINVAL;
+	}
+
 	memcpy(si->xy_data, &cd->input_buf[si->desc.tch_header_size], length);
 	cyttsp5_pr_buf(cd->dev, (u8 *)si->xy_data, length, "xy_data");
 	return 0;
@@ -3931,6 +3954,12 @@ static int parse_command_input(struct cyttsp5_core_data *cd, int size)
 	parade_debug(cd->dev, DEBUG_LEVEL_2, "%s: Received cmd interrupt\n",
 		__func__);
 
+	if (size > CY_MAX_INPUT) {
+		dev_err(cd->dev, "%s:%d: size=%d is larger than the max %d!!!\n",
+			__func__, __LINE__, size, CY_MAX_INPUT);
+		return -EINVAL;
+	}
+
 	memcpy(cd->response_buf, cd->input_buf, size);
 
 	mutex_lock(&cd->system_lock);
@@ -3973,12 +4002,17 @@ static int cyttsp5_parse_input(struct cyttsp5_core_data *cd)
 		wake_up(&cd->wait_q);
 		mutex_unlock(&cd->system_lock);
 		return 0;
-	} else if (size == 2 || size >= CY_PIP_1P7_EMPTY_BUF)
+	} else if (size == 2 || size >= CY_PIP_1P7_EMPTY_BUF || size > CY_MAX_INPUT) {
 		/*
 		 * Before PIP 1.7, empty buffer is 0x0002;
 		 * From PIP 1.7, empty buffer is 0xFFXX
 		 */
+		if (size > CY_MAX_INPUT && size < CY_PIP_1P7_EMPTY_BUF)
+			dev_err(cd->dev, "%s:%d: size=%d is larger than the max %d!!!\n",
+				__func__, __LINE__, size, CY_MAX_INPUT);
+
 		return 0;
+	}
 
 	report_id = cd->input_buf[2];
 	parade_debug(cd->dev, DEBUG_LEVEL_2, "%s: report_id:%X\n",

commit 403ae7fd2a50c584775376e6a7d308a51b6eaa8e
Author: Wyon Bi <bivvy.bi@rock-chips.com>
Date:   Wed Jun 30 11:44:02 2021 +0800

    drm/rockchip: cdn_dp: Fix link retrain condition
    
    Validate the cached values of link parameters before
    attempting to retrain.
    
    Change-Id: Idf4f8a7c2d85109e05dc7e387f46ddeb55cd0a01
    Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c b/drivers/gpu/drm/rockchip/cdn-dp-core.c
index 38f2e68cd349..f09fcf89248b 100644
--- a/drivers/gpu/drm/rockchip/cdn-dp-core.c
+++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c
@@ -1061,6 +1061,24 @@ static int cdn_dp_request_firmware(struct cdn_dp_device *dp)
 	return ret;
 }
 
+static bool cdn_dp_needs_link_retrain(struct cdn_dp_device *dp)
+{
+	u8 link_status[DP_LINK_STATUS_SIZE];
+
+	/*
+	 * Validate the cached values of link parameters before attempting to
+	 * retrain.
+	 */
+	if (!dp->link.rate || !dp->link.num_lanes)
+		return false;
+
+	if (drm_dp_dpcd_read_link_status(&dp->aux, link_status) < 0)
+		return false;
+
+	/* Retrain if Channel EQ or CR not ok */
+	return !drm_dp_channel_eq_ok(link_status, dp->link.num_lanes);
+}
+
 static void cdn_dp_pd_event_work(struct work_struct *work)
 {
 	struct cdn_dp_device *dp = container_of(work, struct cdn_dp_device,
@@ -1101,7 +1119,7 @@ static void cdn_dp_pd_event_work(struct work_struct *work)
 		dp->connected = false;
 
 	/* Enabled and connected with a sink, re-train if requested */
-	} else if (!cdn_dp_check_link_status(dp)) {
+	} else if (cdn_dp_needs_link_retrain(dp)) {
 		unsigned int rate = dp->link.rate;
 		unsigned int lanes = dp->link.num_lanes;
 		struct drm_display_mode *mode = &dp->mode;

commit d7b5c8101508e4322d29583cf7817c54d93dd78c
Author: Wyon Bi <bivvy.bi@rock-chips.com>
Date:   Sun Jun 27 19:07:16 2021 +0800

    phy: rockchip-typec: Fix DP lane config
    
    Split dynamic lane configuration from tcphy_dp_cfg_lane().
    
    Change-Id: Ie4ce3138b30f3f9304daec9a9c582091548c0e60
    Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>

diff --git a/drivers/phy/rockchip/phy-rockchip-typec.c b/drivers/phy/rockchip/phy-rockchip-typec.c
index 99c77be6c738..24adca065b44 100644
--- a/drivers/phy/rockchip/phy-rockchip-typec.c
+++ b/drivers/phy/rockchip/phy-rockchip-typec.c
@@ -843,67 +843,58 @@ static void tcphy_rx_usb3_cfg_lane(struct rockchip_typec_phy *tcphy, u32 lane)
 	writel(0xfb, tcphy->base + XCVR_DIAG_BIDI_CTRL(lane));
 }
 
-static void tcphy_dp_cfg_lane(struct rockchip_typec_phy *tcphy, int link_rate,
-			      u8 swing, u8 pre_emp, u32 lane)
+static void tcphy_dp_cfg_lane(struct rockchip_typec_phy *tcphy, u32 lane)
 {
-	u16 val;
-
 	writel(0xbefc, tcphy->base + XCVR_PSM_RCTRL(lane));
 	writel(0x6799, tcphy->base + TX_PSC_A0(lane));
 	writel(0x6798, tcphy->base + TX_PSC_A1(lane));
 	writel(0x98, tcphy->base + TX_PSC_A2(lane));
 	writel(0x98, tcphy->base + TX_PSC_A3(lane));
-
-	writel(tcphy->config[swing][pre_emp].swing,
-	       tcphy->base + TX_TXCC_MGNFS_MULT_000(lane));
-	writel(tcphy->config[swing][pre_emp].pe,
-	       tcphy->base + TX_TXCC_CPOST_MULT_00(lane));
-
-	if (swing == 2 && pre_emp == 0 && link_rate != 540000) {
-		writel(0x700, tcphy->base + TX_DIAG_TX_DRV(lane));
-		writel(0x13c, tcphy->base + TX_TXCC_CAL_SCLR_MULT(lane));
-	} else {
-		writel(0x128, tcphy->base + TX_TXCC_CAL_SCLR_MULT(lane));
-		writel(0x0400, tcphy->base + TX_DIAG_TX_DRV(lane));
-	}
-
-	val = readl(tcphy->base + XCVR_DIAG_PLLDRC_CTRL(lane));
-	val = val & 0x8fff;
-	switch (link_rate) {
-	case 540000:
-		val |= (5 << 12);
-		break;
-	case 162000:
-	case 270000:
-	default:
-		val |= (6 << 12);
-		break;
-	}
-	writel(val, tcphy->base + XCVR_DIAG_PLLDRC_CTRL(lane));
 }
 
 int tcphy_dp_set_phy_config(struct phy *phy, int link_rate,
 			    int lane_count, u8 swing, u8 pre_emp)
 {
 	struct rockchip_typec_phy *tcphy = phy_get_drvdata(phy);
-	u8 i;
+	u8 i, j, lane;
+	u32 val;
 
 	if (!phy->power_count)
 		return -EPERM;
 
-	if (tcphy->mode == MODE_DFP_DP) {
-		for (i = 0; i < 4; i++)
-			tcphy_dp_cfg_lane(tcphy, link_rate, swing, pre_emp, i);
+	if (lane_count == 4) {
+		i = 0;
+		j = 3;
 	} else {
 		if (tcphy->flip) {
-			tcphy_dp_cfg_lane(tcphy, link_rate, swing, pre_emp, 0);
-			tcphy_dp_cfg_lane(tcphy, link_rate, swing, pre_emp, 1);
+			i = 0;
+			j = 1;
 		} else {
-			tcphy_dp_cfg_lane(tcphy, link_rate, swing, pre_emp, 2);
-			tcphy_dp_cfg_lane(tcphy, link_rate, swing, pre_emp, 3);
+			i = 2;
+			j = 3;
 		}
 	}
 
+	for (lane = i; lane <= j; lane++) {
+		writel(tcphy->config[swing][pre_emp].swing,
+		       tcphy->base + TX_TXCC_MGNFS_MULT_000(lane));
+		writel(tcphy->config[swing][pre_emp].pe,
+		       tcphy->base + TX_TXCC_CPOST_MULT_00(lane));
+
+		if (swing == 2 && pre_emp == 0 && link_rate != 540000) {
+			writel(0x700, tcphy->base + TX_DIAG_TX_DRV(lane));
+			writel(0x13c, tcphy->base + TX_TXCC_CAL_SCLR_MULT(lane));
+		} else {
+			writel(0x128, tcphy->base + TX_TXCC_CAL_SCLR_MULT(lane));
+			writel(0x0400, tcphy->base + TX_DIAG_TX_DRV(lane));
+		}
+
+		val = readl(tcphy->base + XCVR_DIAG_PLLDRC_CTRL(lane));
+		val &= ~GENMASK(14, 12);
+		val |= ((link_rate == 540000) ? 0x5 : 0x6) << 12;
+		writel(val, tcphy->base + XCVR_DIAG_PLLDRC_CTRL(lane));
+	}
+
 	return 0;
 }
 EXPORT_SYMBOL(tcphy_dp_set_phy_config);
@@ -1286,20 +1277,20 @@ static int tcphy_phy_init(struct rockchip_typec_phy *tcphy, u8 mode)
 		tcphy_cfg_usb3_to_usb2_only(tcphy, true);
 		tcphy_cfg_dp_pll(tcphy, DP_DEFAULT_RATE);
 		for (i = 0; i < 4; i++)
-			tcphy_dp_cfg_lane(tcphy, DP_DEFAULT_RATE, 0, 0, i);
+			tcphy_dp_cfg_lane(tcphy, i);
 	} else {
 		tcphy_cfg_usb3_pll(tcphy);
 		tcphy_cfg_dp_pll(tcphy, DP_DEFAULT_RATE);
 		if (tcphy->flip) {
 			tcphy_tx_usb3_cfg_lane(tcphy, 3);
 			tcphy_rx_usb3_cfg_lane(tcphy, 2);
-			tcphy_dp_cfg_lane(tcphy, DP_DEFAULT_RATE, 0, 0, 0);
-			tcphy_dp_cfg_lane(tcphy, DP_DEFAULT_RATE, 0, 0, 1);
+			tcphy_dp_cfg_lane(tcphy, 0);
+			tcphy_dp_cfg_lane(tcphy, 1);
 		} else {
 			tcphy_tx_usb3_cfg_lane(tcphy, 0);
 			tcphy_rx_usb3_cfg_lane(tcphy, 1);
-			tcphy_dp_cfg_lane(tcphy, DP_DEFAULT_RATE, 0, 0, 2);
-			tcphy_dp_cfg_lane(tcphy, DP_DEFAULT_RATE, 0, 0, 3);
+			tcphy_dp_cfg_lane(tcphy, 2);
+			tcphy_dp_cfg_lane(tcphy, 3);
 		}
 	}
 

commit 3ab5d277d1309272c4c21565b18eb338b0dd9283
Author: Zheng Yang <zhengyang@rock-chips.com>
Date:   Wed Jun 30 15:58:17 2021 +0800

    drm/bridge: dw-hdmi: fix rgb2yuv csc coeff
    
    According the CEA-861, HDMI outputs the limited range by default.
    
    Change-Id: I06fc1b92ca15e17fd27f3c09f9ced675f686c15f
    Signed-off-by: Zheng Yang <zhengyang@rock-chips.com>

diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index 9e80533fde5b..5b2f8a2d8129 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -149,26 +149,50 @@ static const u16 csc_coeff_rgb_out_eitu709[3][4] = {
 
 static const u16 csc_coeff_rgb_in_eitu601[3][4] = {
 	{ 0x2591, 0x1322, 0x074b, 0x0000 },
-	{ 0x6535, 0x2000, 0x7acc, 0x0200 },
-	{ 0x6acd, 0x7534, 0x2000, 0x0200 }
+	{ 0xe535, 0x2000, 0xfacc, 0x0200 },
+	{ 0xeacd, 0xf534, 0x2000, 0x0200 }
 };
 
 static const u16 csc_coeff_rgb_in_eitu601_10bit[3][4] = {
 	{ 0x2591, 0x1322, 0x074b, 0x0000 },
-	{ 0x6535, 0x2000, 0x7acc, 0x0800 },
-	{ 0x6acd, 0x7534, 0x2000, 0x0800 }
+	{ 0xe535, 0x2000, 0xfacc, 0x0800 },
+	{ 0xeacd, 0xf534, 0x2000, 0x0800 }
+};
+
+static const u16 csc_coeff_rgb_in_eitu601_limited[3][4] = {
+	{ 0x2044, 0x106f, 0x0644, 0x0040 },
+	{ 0xe677, 0x1c1c, 0xfd46, 0x0200 },
+	{ 0xed60, 0xf685, 0x1c1c, 0x0200 }
+};
+
+static const u16 csc_coeff_rgb_in_eitu601_10bit_limited[3][4] = {
+	{ 0x2044, 0x106f, 0x0644, 0x0100 },
+	{ 0xe677, 0x1c1c, 0xfd46, 0x0800 },
+	{ 0xed60, 0xf685, 0x1c1c, 0x0800 }
 };
 
 static const u16 csc_coeff_rgb_in_eitu709[3][4] = {
 	{ 0x2dc5, 0x0d9b, 0x049e, 0x0000 },
-	{ 0x62f0, 0x2000, 0x7d11, 0x0200 },
-	{ 0x6756, 0x78ab, 0x2000, 0x0200 }
+	{ 0xe2f0, 0x2000, 0xfd11, 0x0200 },
+	{ 0xe756, 0xf8ab, 0x2000, 0x0200 }
 };
 
 static const u16 csc_coeff_rgb_in_eitu709_10bit[3][4] = {
 	{ 0x2dc5, 0x0d9b, 0x049e, 0x0000 },
-	{ 0x62f0, 0x2000, 0x7d11, 0x0800 },
-	{ 0x6756, 0x78ab, 0x2000, 0x0800 }
+	{ 0xe2f0, 0x2000, 0xfd11, 0x0800 },
+	{ 0xe756, 0xf8ab, 0x2000, 0x0800 }
+};
+
+static const u16 csc_coeff_rgb_in_eitu709_limited[3][4] = {
+	{ 0x2750, 0x0baf, 0x03f8, 0x0040 },
+	{ 0xe677, 0x1c1c, 0xfd6d, 0x0200 },
+	{ 0xea55, 0xf98f, 0x1c1c, 0x0200 }
+};
+
+static const u16 csc_coeff_rgb_in_eitu709_10bit_limited[3][4] = {
+	{ 0x2750, 0x0baf, 0x03f8, 0x0100 },
+	{ 0xe677, 0x1c1c, 0xfd6d, 0x0800 },
+	{ 0xea55, 0xf98f, 0x1c1c, 0x0800 }
 };
 
 static const u16 csc_coeff_full_to_limited[3][4] = {
@@ -1156,14 +1180,14 @@ static void dw_hdmi_update_csc_coeffs(struct dw_hdmi *hdmi)
 			if (hdmi->hdmi_data.enc_out_encoding ==
 						V4L2_YCBCR_ENC_601) {
 				if (color_depth == 10)
-					csc_coeff = &csc_coeff_rgb_in_eitu601_10bit;
+					csc_coeff = &csc_coeff_rgb_in_eitu601_10bit_limited;
 				else
-					csc_coeff = &csc_coeff_rgb_in_eitu601;
+					csc_coeff = &csc_coeff_rgb_in_eitu601_limited;
 			} else {
 				if (color_depth == 10)
-					csc_coeff = &csc_coeff_rgb_in_eitu709_10bit;
+					csc_coeff = &csc_coeff_rgb_in_eitu709_10bit_limited;
 				else
-					csc_coeff = &csc_coeff_rgb_in_eitu709;
+					csc_coeff = &csc_coeff_rgb_in_eitu709_limited;
 			}
 			csc_scale = 0;
 		}

commit f0c323800d01bdab73b1ac2ae19ce1b85816b988
Author: Zheng Yang <zhengyang@rock-chips.com>
Date:   Wed Jun 30 15:25:46 2021 +0800

    drm/rockchip: dw_hdmi: correct output bus format if unsupported_yuv_input
    
    If unsupported_yuv_input is true, like RK3288, the current logic
    will fix the output bus format to MEDIA_BUS_FMT_RGB888_1X24 or
    MEDIA_BUS_FMT_RGB101010_1X30, does not changed width the property
    hdmi_output_format. This patch fix the issue.
    
    Change-Id: Iddf4182ea8eff066b5f4972c8c3802f7919eb7da
    Signed-off-by: Zheng Yang <zhengyang@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
index 615f5c5c1982..40cce5486ebe 100644
--- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
+++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
@@ -772,39 +772,47 @@ dw_hdmi_rockchip_select_output(struct drm_connector_state *conn_state,
 		else
 			*bus_format = MEDIA_BUS_FMT_UYYVYY8_0_5X24;
 		*bus_width = color_depth / 2;
+		hdmi->output_bus_format = *bus_format;
 	} else {
 		*output_mode = ROCKCHIP_OUT_MODE_AAAA;
+
 		if (color_depth > 8) {
-			if (*color_format != DRM_HDMI_OUTPUT_DEFAULT_RGB &&
-			    !hdmi->unsupported_yuv_input)
-				*bus_format = MEDIA_BUS_FMT_YUV10_1X30;
+			if (*color_format != DRM_HDMI_OUTPUT_DEFAULT_RGB)
+				hdmi->output_bus_format = MEDIA_BUS_FMT_YUV10_1X30;
+			else
+				hdmi->output_bus_format = MEDIA_BUS_FMT_RGB101010_1X30;
+
+			if (!hdmi->unsupported_yuv_input)
+				*bus_format = hdmi->output_bus_format;
 			else
 				*bus_format = MEDIA_BUS_FMT_RGB101010_1X30;
 		} else {
-			if (*color_format != DRM_HDMI_OUTPUT_DEFAULT_RGB &&
-			    !hdmi->unsupported_yuv_input)
-				*bus_format = MEDIA_BUS_FMT_YUV8_1X24;
+			if (*color_format != DRM_HDMI_OUTPUT_DEFAULT_RGB)
+				hdmi->output_bus_format = MEDIA_BUS_FMT_YUV8_1X24;
+			else
+				hdmi->output_bus_format = MEDIA_BUS_FMT_RGB888_1X24;
+
+			if (!hdmi->unsupported_yuv_input)
+				*bus_format = hdmi->output_bus_format;
 			else
 				*bus_format = MEDIA_BUS_FMT_RGB888_1X24;
 		}
-		if (*color_format == DRM_HDMI_OUTPUT_YCBCR422)
+
+		if (*color_format == DRM_HDMI_OUTPUT_YCBCR422) {
 			*bus_width = 8;
-		else
+
+			if (color_depth == 12)
+				hdmi->output_bus_format = MEDIA_BUS_FMT_UYVY12_1X24;
+			else if (color_depth == 10)
+				hdmi->output_bus_format = MEDIA_BUS_FMT_UYVY10_1X20;
+			else
+				hdmi->output_bus_format = MEDIA_BUS_FMT_UYVY8_1X16;
+		} else {
 			*bus_width = color_depth;
+		}
 	}
 
 	hdmi->bus_format = *bus_format;
-
-	if (*color_format == DRM_HDMI_OUTPUT_YCBCR422) {
-		if (color_depth == 12)
-			hdmi->output_bus_format = MEDIA_BUS_FMT_UYVY12_1X24;
-		else if (color_depth == 10)
-			hdmi->output_bus_format = MEDIA_BUS_FMT_UYVY10_1X20;
-		else
-			hdmi->output_bus_format = MEDIA_BUS_FMT_UYVY8_1X16;
-	} else {
-		hdmi->output_bus_format = *bus_format;
-	}
 }
 
 static bool

commit a7591931442ea347e4c28014045e04a2b226d2f0
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Sat Jun 26 19:54:15 2021 +0800

    regulator: xz3216: update drivers to support vsel set
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: Ifd686fb977f9d397d856cf6338499fcbbe674fd2

diff --git a/drivers/regulator/xz3216.c b/drivers/regulator/xz3216.c
index 54182559b161..309ef56acfd9 100644
--- a/drivers/regulator/xz3216.c
+++ b/drivers/regulator/xz3216.c
@@ -66,15 +66,19 @@ struct xz3216 {
 	struct i2c_client *i2c;
 	int num_regulators;
 	struct regulator_dev *rdev;
+	struct regulator_desc desc;
 	struct regulator_init_data *regulator;
 	struct regmap *regmap;
 	/* Voltage setting register */
 	unsigned int vol_reg;
 	unsigned int sleep_reg;
+	unsigned int en_reg;
+	unsigned int sleep_en_reg;
 	/* Voltage range and step(linear) */
 	unsigned int vsel_min;
 	unsigned int vsel_step;
 	unsigned int sleep_vol_cache;
+	unsigned int sleep_vsel_id;
 };
 
 struct xz3216_regulator {
@@ -86,6 +90,7 @@ struct xz3216_regulator {
 struct xz3216_board {
 	struct regulator_init_data *xz3216_init_data;
 	struct device_node *of_node;
+	unsigned int sleep_vsel_id;
 };
 
 static unsigned int xz3216_dcdc_get_mode(struct regulator_dev *dev)
@@ -120,19 +125,51 @@ static int xz3216_dcdc_set_mode(struct regulator_dev *dev, unsigned int mode)
 	}
 }
 
+static int xz3216_dcdc_is_enable(struct regulator_dev *dev)
+{
+	struct xz3216 *xz3216 = rdev_get_drvdata(dev);
+	int ret = 0;
+	unsigned int val;
+
+	ret = regmap_read(xz3216->regmap, xz3216->en_reg, &val);
+	if (ret < 0)
+		return ret;
+	if (val & VSEL_BUCK_EN)
+		return 1;
+	else
+		return 0;
+}
+
+static int xz3216_dcdc_enable(struct regulator_dev *dev)
+{
+	struct xz3216 *xz3216 = rdev_get_drvdata(dev);
+
+	return regmap_update_bits(xz3216->regmap, xz3216->en_reg,
+				VSEL_BUCK_EN, VSEL_BUCK_EN);
+}
+
+static int xz3216_dcdc_disable(struct regulator_dev *dev)
+{
+	struct xz3216 *xz3216 = rdev_get_drvdata(dev);
+
+	return regmap_update_bits(xz3216->regmap, xz3216->en_reg,
+				VSEL_BUCK_EN, 0);
+}
+
 static int xz3216_dcdc_suspend_enable(struct regulator_dev *dev)
 {
 	struct xz3216 *xz3216 = rdev_get_drvdata(dev);
-	return regmap_update_bits(xz3216->regmap, XZ3216_BUCK1_SLP_VOL_BASE,
-				  VSEL_BUCK_EN, VSEL_BUCK_EN);
+
+	return regmap_update_bits(xz3216->regmap, xz3216->sleep_en_reg,
+				VSEL_BUCK_EN, VSEL_BUCK_EN);
 }
 
 static int xz3216_dcdc_suspend_disable(struct regulator_dev *dev)
 {
 	struct xz3216 *xz3216 = rdev_get_drvdata(dev);
-	return regmap_update_bits(xz3216->regmap, XZ3216_BUCK1_SLP_VOL_BASE,
-				  VSEL_BUCK_EN, 0);
 
+	return regmap_update_bits(xz3216->regmap, xz3216->sleep_en_reg,
+				VSEL_BUCK_EN, 0);
 }
 
 static int xz3216_dcdc_set_sleep_voltage(struct regulator_dev *dev,
@@ -146,13 +183,13 @@ static int xz3216_dcdc_set_sleep_voltage(struct regulator_dev *dev,
 	ret = regulator_map_voltage_linear(dev, uV, uV);
 	if (ret < 0)
 		return ret;
-	ret = regmap_update_bits(xz3216->regmap, XZ3216_BUCK1_SLP_VOL_BASE,
+	ret = regmap_update_bits(xz3216->regmap, xz3216->sleep_reg,
 					VSEL_NSEL_MASK, ret);
 	if (ret < 0)
 		return ret;
 	xz3216->sleep_vol_cache = uV;
-	return 0;
 
+	return 0;
 }
 
 static int xz3216_dcdc_set_suspend_mode(struct regulator_dev *dev,
@@ -162,11 +199,11 @@ static int xz3216_dcdc_set_suspend_mode(struct regulator_dev *dev,
 
 	switch (mode) {
 	case REGULATOR_MODE_FAST:
-		return regmap_update_bits(xz3216->regmap, xz3216->vol_reg,
-					  VSEL_MODE, VSEL_MODE);
+		return regmap_update_bits(xz3216->regmap, xz3216->sleep_reg,
+						VSEL_MODE, VSEL_MODE);
 	case REGULATOR_MODE_NORMAL:
-		return regmap_update_bits(xz3216->regmap, xz3216->vol_reg,
-					  VSEL_MODE, 0);
+		return regmap_update_bits(xz3216->regmap, xz3216->sleep_reg,
+						VSEL_MODE, 0);
 	default:
 		DBG_ERR("error:dcdc_xz3216 only auto and pwm mode\n");
 		return -EINVAL;
@@ -209,9 +246,9 @@ static struct regulator_ops xz3216_dcdc_ops = {
 	.get_voltage_sel = regulator_get_voltage_sel_regmap,
 	.list_voltage = regulator_list_voltage_linear,
 	.map_voltage = regulator_map_voltage_linear,
-	.is_enabled = regulator_is_enabled_regmap,
-	.enable = regulator_enable_regmap,
-	.disable = regulator_disable_regmap,
+	.is_enabled = xz3216_dcdc_is_enable,
+	.enable = xz3216_dcdc_enable,
+	.disable = xz3216_dcdc_disable,
 	.get_mode = xz3216_dcdc_get_mode,
 	.set_mode = xz3216_dcdc_set_mode,
 	.set_suspend_voltage = xz3216_dcdc_set_sleep_voltage,
@@ -222,24 +259,44 @@ static struct regulator_ops xz3216_dcdc_ops = {
 	.set_voltage_time_sel = regulator_set_voltage_time_sel,
 };
 
-static struct regulator_desc regulators[] = {
-	{
-		.name = "XZ_DCDC1",
-		.supply_name = "vin",
-		.id = 0,
-		.ops = &xz3216_dcdc_ops,
-		.n_voltages = 64,
-		.type = REGULATOR_VOLTAGE,
-		.enable_time = 400,
-		.enable_reg = XZ3216_BUCK1_SET_VOL_BASE,
-		.enable_mask = VSEL_BUCK_EN,
-		.min_uV = 600000,
-		.uV_step = 12500,
-		.vsel_reg = XZ3216_BUCK1_SET_VOL_BASE,
-		.vsel_mask = VSEL_NSEL_MASK,
-		.owner = THIS_MODULE,
-	},
-};
+static int xz3216_regulator_register(struct xz3216 *xz3216, struct regulator_config *config)
+{
+	struct regulator_desc *rdesc = &xz3216->desc;
+
+	rdesc->name = "XZ_DCDC1";
+	rdesc->supply_name = "vin";
+	rdesc->id = 0;
+	rdesc->ops = &xz3216_dcdc_ops;
+	rdesc->type = REGULATOR_VOLTAGE;
+	rdesc->n_voltages = 64;
+	rdesc->enable_mask = VSEL_BUCK_EN;
+	rdesc->min_uV = 600000;
+	rdesc->uV_step = 12500;
+	rdesc->vsel_mask = VSEL_NSEL_MASK;
+	rdesc->owner = THIS_MODULE;
+	rdesc->enable_time = 400;
+
+	if (xz3216->sleep_vsel_id) {
+		rdesc->vsel_reg = XZ3216_BUCK1_SET_VOL_BASE;
+		rdesc->enable_reg = XZ3216_BUCK1_SET_VOL_BASE;
+
+		xz3216->vol_reg = rdesc->vsel_reg;
+		xz3216->en_reg = rdesc->vsel_reg;
+		xz3216->sleep_reg = XZ3216_BUCK1_SLP_VOL_BASE;
+		xz3216->sleep_en_reg = xz3216->sleep_reg;
+	} else {
+		rdesc->vsel_reg = XZ3216_BUCK1_SLP_VOL_BASE;
+		rdesc->enable_reg = XZ3216_BUCK1_SLP_VOL_BASE;
+
+		xz3216->vol_reg = rdesc->vsel_reg;
+		xz3216->en_reg = rdesc->vsel_reg;
+		xz3216->sleep_reg = XZ3216_BUCK1_SET_VOL_BASE;
+		xz3216->sleep_en_reg = xz3216->sleep_reg;
+	}
+	xz3216->rdev = devm_regulator_register(xz3216->dev, &xz3216->desc, config);
+
+	return PTR_ERR_OR_ZERO(xz3216->rdev);
+}
 
 static const struct regmap_config xz3216_regmap_config = {
 	.reg_bits = 8,
@@ -265,26 +322,47 @@ static struct xz3216_board *xz3216_parse_dt(struct xz3216 *xz3216)
 	struct device_node *regs;
 	struct device_node *xz3216_np;
 	int count;
+	u32 tmp;
+
+	pdata = devm_kzalloc(xz3216->dev, sizeof(*pdata), GFP_KERNEL);
+	if (!pdata)
+		return NULL;
 
 	xz3216_np = of_node_get(xz3216->dev->of_node);
 	if (!xz3216_np) {
 		DBG_ERR("could not find pmic sub-node\n");
 		return NULL;
 	}
+
+	regs = of_find_node_by_name(xz3216_np, "regulator");
+	if (!regs) {
+		DBG_ERR("can not found regulator node\n");
+		return NULL;
+	}
+	count = of_property_read_u32(regs, "fcs,suspend-voltage-selector",
+				   &tmp);
+	if (!count) {
+		pdata->sleep_vsel_id = tmp;
+		pr_info("xz3216, suspend-voltage-selector = %d\n", pdata->sleep_vsel_id);
+	} else {
+		pdata->sleep_vsel_id = 0;
+		pr_info("xz3216, get suspend-voltage-selector failed, use default value\n");
+	}
+	of_node_put(regs);
+
 	regs = of_find_node_by_name(xz3216_np, "regulators");
 	if (!regs)
 		return NULL;
 	count = of_regulator_match(xz3216->dev, regs, xz3216_reg_matches,
 				   XZ3216_NUM_REGULATORS);
 	of_node_put(regs);
-	pdata = devm_kzalloc(xz3216->dev, sizeof(*pdata), GFP_KERNEL);
-	if (!pdata)
+	if (!count)
 		return NULL;
 	pdata->xz3216_init_data = xz3216_reg_matches[0].init_data;
 	pdata->of_node = xz3216_reg_matches[0].of_node;
+
 	return pdata;
 }
-
 #else
 static struct xz3216_board *xz3216_parse_dt(struct i2c_client *i2c)
 {
@@ -300,7 +378,7 @@ static int xz3216_i2c_probe(struct i2c_client *i2c,
 	const struct of_device_id *match;
 	struct regulator_config config = { };
 	int ret;
-	DBG("%s, line=%d\n", __func__, __LINE__);
+
 	xz3216 = devm_kzalloc(&i2c->dev, sizeof(struct xz3216),
 						GFP_KERNEL);
 	if (!xz3216) {
@@ -329,6 +407,7 @@ static int xz3216_i2c_probe(struct i2c_client *i2c,
 	if (!pdev)
 		pdev = xz3216_parse_dt(xz3216);
 	if (pdev) {
+		xz3216->sleep_vsel_id = pdev->sleep_vsel_id;
 		xz3216->num_regulators = XZ3216_NUM_REGULATORS;
 		xz3216->rdev = kcalloc(XZ3216_NUM_REGULATORS,
 					sizeof(struct regulator_dev),
@@ -342,9 +421,8 @@ static int xz3216_i2c_probe(struct i2c_client *i2c,
 		config.dev = xz3216->dev;
 		config.driver_data = xz3216;
 		config.init_data = xz3216->regulator;
-		xz3216->rdev = devm_regulator_register(xz3216->dev,
-						&regulators[0], &config);
-		ret = PTR_ERR_OR_ZERO(xz3216->rdev);
+		config.regmap = xz3216->regmap;
+		ret = xz3216_regulator_register(xz3216, &config);
 		if (ret < 0)
 			dev_err(&i2c->dev, "Failed to register regulator!\n");
 		return ret;

commit f9560c9c14cf682331a4886f4e840b12b655ab65
Author: Dmitry Torokhov <dtor@chromium.org>
Date:   Wed Feb 4 13:54:48 2015 -0800

    cpufreq: interactive: fix policy locking
    
    cpufreq_interactive_speedchange_task() is running as a separate kernel
    thread and is calling __cpufreq_driver_target(), which requires callers
    to hold policy->rwsem for writing to prevent racing with other parts of
    the kernel trying to adjust the frequency, for example kernel thermal
    throttling. Let's change the code to take policy->rwsem and while at it
    refactor the code a bit.
    
    This was originally 2 changes reviewed at:
            https://chromium-review.googlesource.com/246273
            https://chromium-review.googlesource.com/256120
    
    Change-Id: Icc2d97c6c1b929acd2ee32e8c81d81fd2af778ab
    Signed-off-by: Dmitry Torokhov <dtor@chromium.org>
    Reviewed-by: Dylan Reid <dgreid@chromium.org>
    Reviewed-by: Douglas Anderson <dianders@chromium.org>
    Signed-off-by: Dmitry Torokhov <dtor@google.com>
    Signed-off-by: Liang Chen <cl@rock-chips.com>

diff --git a/drivers/cpufreq/cpufreq_interactive.c b/drivers/cpufreq/cpufreq_interactive.c
index 7bbcdf6f64fd..06f767956400 100644
--- a/drivers/cpufreq/cpufreq_interactive.c
+++ b/drivers/cpufreq/cpufreq_interactive.c
@@ -607,15 +607,20 @@ static int cpufreq_interactive_speedchange_task(void *data)
 		struct interactive_cpu *icpu = &per_cpu(interactive_cpu, cpu);
 		struct cpufreq_policy *policy;
 
-		if (unlikely(!down_read_trylock(&icpu->enable_sem)))
+		policy = cpufreq_cpu_get(cpu);
+		if (!policy)
 			continue;
 
-		if (likely(icpu->ipolicy)) {
-			policy = icpu->ipolicy->policy;
-			cpufreq_interactive_adjust_cpu(cpu, policy);
+		down_write(&policy->rwsem);
+
+		if (likely(down_read_trylock(&icpu->enable_sem))) {
+			if (likely(icpu->ipolicy))
+				cpufreq_interactive_adjust_cpu(cpu, policy);
+			up_read(&icpu->enable_sem);
 		}
 
-		up_read(&icpu->enable_sem);
+		up_write(&policy->rwsem);
+		cpufreq_cpu_put(policy);
 	}
 
 	goto again;

commit a6f921d31f907d12c62636dfd7116c24ad1feffe
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Tue Jun 29 08:38:42 2021 +0800

    mmc: dw_mmc-rockchip: Always fix ID mode clk request into 375KHz for RK356X
    
    RK356X SoCs only support 375KHz for ID mode, otherwise it will be always
    failed to set clk if the first attempt to identify cards.
    
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: I99ba322b3eeb4c4658869dc88b7a9f303081e12e

diff --git a/drivers/mmc/host/dw_mmc-rockchip.c b/drivers/mmc/host/dw_mmc-rockchip.c
index 1e4739e3f2e1..cc7cd5e7fd21 100644
--- a/drivers/mmc/host/dw_mmc-rockchip.c
+++ b/drivers/mmc/host/dw_mmc-rockchip.c
@@ -28,6 +28,7 @@ struct dw_mci_rockchip_priv_data {
 	int			num_phases;
 	bool			use_v2_tuning;
 	int			last_degree;
+	u32			f_min;
 };
 
 static void dw_mci_rk3288_set_ios(struct dw_mci *host, struct mmc_ios *ios)
@@ -49,6 +50,9 @@ static void dw_mci_rk3288_set_ios(struct dw_mci *host, struct mmc_ios *ios)
 	 * Note: div can only be 0 or 1, but div must be set to 1 for eMMC
 	 * DDR52 8-bit mode.
 	 */
+	if (ios->clock < priv->f_min)
+		ios->clock = priv->f_min;
+
 	if (ios->bus_width == MMC_BUS_WIDTH_8 &&
 	    ios->timing == MMC_TIMING_MMC_DDR52)
 		cclkin = 2 * ios->clock * RK3288_CLKGEN_DIV;
@@ -316,6 +320,17 @@ static int dw_mci_rk3288_parse_dt(struct dw_mci *host)
 	if (!priv)
 		return -ENOMEM;
 
+	/*
+	 * RK356X SoCs only support 375KHz for ID mode, so any clk request
+	 * that less than 1.6MHz(2 * 400KHz * RK3288_CLKGEN_DIV) should be
+	 * wrapped  into 375KHz
+	 */
+	if (of_device_is_compatible(host->dev->of_node,
+				    "rockchip,rk3568-dw-mshc"))
+		priv->f_min = 375000;
+	else
+		priv->f_min = 100000;
+
 	if (of_property_read_u32(np, "rockchip,desired-num-phases",
 					&priv->num_phases))
 		priv->num_phases = 360;

commit d6f112ccc1a0f8f975d0afce9074823d9aec5dd1
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Thu Jun 24 16:53:04 2021 +0800

    drm/rockchip: ebc_dev: release version v2.03
    
    1.add 8 pixel align buf process
    2.overlay mode use double buf
    3.add EPD_DU4 mode
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: I849206c3776e445bff9e3722868ee8cc8b041e4e

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c b/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
index 01b044eb7815..f0a9624548c5 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
+++ b/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
@@ -78,7 +78,7 @@ int ebc_add_to_dsp_buf_list(struct ebc_buf_s *dsp_buf)
 	mutex_lock(&ebc_buf_info.dsp_buf_lock);
 	if (ebc_buf_info.dsp_buf_list) {
 		switch (dsp_buf->buf_mode) {
-		case EPD_DU:
+		case EPD_A2_ENTER:
 		case EPD_SUSPEND:
 		case EPD_RESUME:
 		case EPD_POWER_OFF:
@@ -92,7 +92,7 @@ int ebc_add_to_dsp_buf_list(struct ebc_buf_s *dsp_buf)
 				temp_pos = ebc_buf_info.dsp_buf_list->nb_elt;
 				while (--temp_pos) {
 					temp_buf = (struct ebc_buf_s *)buf_list_get(ebc_buf_info.dsp_buf_list, temp_pos);
-					if ((temp_buf->buf_mode >= EPD_PART_GC16) && (temp_buf->buf_mode <= EPD_A2)) {
+					if ((temp_buf->buf_mode >= EPD_PART_GC16) && (temp_buf->buf_mode <= EPD_DU4)) {
 						buf_list_remove(ebc_buf_info.dsp_buf_list, temp_pos);
 						ebc_buf_release(temp_buf);
 					} else if ((1 == is_full_mode) && (temp_buf->buf_mode >= EPD_FULL_GC16)
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
index 705f4a23ee24..79f9b4739b18 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
@@ -71,11 +71,13 @@ enum panel_refresh_mode {
 	EPD_PART_GCC16		= 11,
 	EPD_A2			= 12,
 	EPD_DU			= 13,
-	EPD_RESET		= 14,
-	EPD_SUSPEND		= 15,
-	EPD_RESUME		= 16,
-	EPD_POWER_OFF		= 17,
-	EPD_FORCE_FULL		= 18,
+	EPD_DU4			= 14,
+	EPD_A2_ENTER		= 15,
+	EPD_RESET		= 16,
+	EPD_SUSPEND		= 17,
+	EPD_RESUME		= 18,
+	EPD_POWER_OFF		= 19,
+	EPD_FORCE_FULL		= 20,
 };
 
 /*
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index d559056fe7f7..e66fcdd41463 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -21,7 +21,7 @@ __initcall_ebc_init6s:
 	.p2align 3,,7
 	.type	get_auto_image, %function
 get_auto_image:
-.LFB2810:
+.LFB2811:
 	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
 	.loc 1 453 0
 	.cfi_startproc
@@ -523,62 +523,62 @@ get_auto_image:
 	.cfi_restore 30
 	ret
 	.cfi_endproc
-.LFE2810:
+.LFE2811:
 	.size	get_auto_image, .-get_auto_image
 	.align	2
 	.p2align 3,,7
 	.type	ebc_open, %function
 ebc_open:
-.LFB2827:
-	.loc 1 1644 0
+.LFB2832:
+	.loc 1 1710 0
 	.cfi_startproc
 .LVL32:
-	.loc 1 1648 0
+	.loc 1 1714 0
 	mov	w0, 0
 .LVL33:
-	.loc 1 1645 0
+	.loc 1 1711 0
 	str	xzr, [x1, 104]
-	.loc 1 1648 0
+	.loc 1 1714 0
 	ret
 	.cfi_endproc
-.LFE2827:
+.LFE2832:
 	.size	ebc_open, .-ebc_open
 	.section	.exit.text,"ax",@progbits
 	.align	2
 	.type	ebc_exit, %function
 ebc_exit:
-.LFB2846:
-	.loc 1 2190 0
+.LFB2851:
+	.loc 1 2257 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2191 0
+	.loc 1 2258 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2190 0
+	.loc 1 2257 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2191 0
+	.loc 1 2258 0
 	bl	platform_driver_unregister
 .LVL34:
-	.loc 1 2192 0
+	.loc 1 2259 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2846:
+.LFE2851:
 	.size	ebc_exit, .-ebc_exit
 	.text
 	.align	2
 	.p2align 3,,7
 	.type	ebc_resume, %function
 ebc_resume:
-.LFB2844:
-	.loc 1 2152 0
+.LFB2849:
+	.loc 1 2219 0
 	.cfi_startproc
 .LVL35:
 	stp	x29, x30, [sp, -32]!
@@ -589,17 +589,17 @@ ebc_resume:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-.LBB910:
-.LBB911:
+.LBB926:
+.LBB927:
 	.file 2 "./include/linux/device.h"
 	.loc 2 1181 0
 	ldr	x19, [x0, 184]
-.LBE911:
-.LBE910:
-	.loc 1 2156 0
+.LBE927:
+.LBE926:
+	.loc 1 2223 0
 	ldr	x1, [x19, 16]
-.LBB912:
-.LBB913:
+.LBB928:
+.LBB929:
 	.file 3 "drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic.h"
 	.loc 3 45 0
 	mov	x0, x1
@@ -607,17 +607,17 @@ ebc_resume:
 	ldr	x1, [x1, 48]
 	blr	x1
 .LVL37:
-.LBE913:
-.LBE912:
-	.loc 1 2157 0
+.LBE929:
+.LBE928:
+	.loc 1 2224 0
 	str	wzr, [x19, 780]
-	.loc 1 2158 0
+	.loc 1 2225 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
 .LVL38:
-	.loc 1 2161 0
+	.loc 1 2228 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -627,85 +627,85 @@ ebc_resume:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2844:
+.LFE2849:
 	.size	ebc_resume, .-ebc_resume
 	.align	2
 	.p2align 3,,7
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
-.LFB2822:
-	.loc 1 1343 0
+.LFB2827:
+	.loc 1 1409 0
 	.cfi_startproc
 .LVL39:
-	.loc 1 1344 0
+	.loc 1 1410 0
 	adrp	x0, .LANCHOR0
 .LVL40:
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1346 0
+	.loc 1 1412 0
 	ldr	w2, [x0, 608]
 	cbnz	w2, .L80
 	ret
 	.p2align 3
 .L80:
-	.loc 1 1343 0
+	.loc 1 1409 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-.LBB914:
-.LBB915:
+.LBB930:
+.LBB931:
 	.file 4 "./include/linux/wakelock.h"
 	.loc 4 68 0
 	add	x0, x0, 400
-.LBE915:
-.LBE914:
-	.loc 1 1343 0
+.LBE931:
+.LBE930:
+	.loc 1 1409 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1347 0
+	.loc 1 1413 0
 	str	wzr, [x0, 208]
-.LBB917:
-.LBB916:
+.LBB933:
+.LBB932:
 	.loc 4 68 0
 	bl	__pm_relax
 .LVL41:
-.LBE916:
-.LBE917:
-	.loc 1 1352 0
+.LBE932:
+.LBE933:
+	.loc 1 1418 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2822:
+.LFE2827:
 	.size	ebc_vdd_power_timeout, .-ebc_vdd_power_timeout
 	.align	2
 	.p2align 3,,7
 	.type	ebc_remove, %function
 ebc_remove:
-.LFB2842:
-	.loc 1 2128 0
+.LFB2847:
+	.loc 1 2195 0
 	.cfi_startproc
 .LVL42:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2129 0
+	.loc 1 2196 0
 	adrp	x0, .LANCHOR1
 .LVL43:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2128 0
+	.loc 1 2195 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2129 0
+	.loc 1 2196 0
 	add	x0, x0, 224
-	.loc 1 2128 0
-	.loc 1 2129 0
+	.loc 1 2195 0
+	.loc 1 2196 0
 	bl	misc_deregister
 .LVL44:
-	.loc 1 2132 0
+	.loc 1 2199 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -713,14 +713,14 @@ ebc_remove:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2842:
+.LFE2847:
 	.size	ebc_remove, .-ebc_remove
 	.align	2
 	.p2align 3,,7
 	.type	ebc_mmap, %function
 ebc_mmap:
-.LFB2826:
-	.loc 1 1629 0
+.LFB2831:
+	.loc 1 1695 0
 	.cfi_startproc
 .LVL45:
 	stp	x29, x30, [sp, -32]!
@@ -731,33 +731,33 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1629 0
+	.loc 1 1695 0
 	mov	x19, x1
-	.loc 1 1632 0
+	.loc 1 1698 0
 	bl	ebc_phy_buf_base_get
 .LVL46:
-	.loc 1 1635 0
+	.loc 1 1701 0
 	lsr	x2, x0, 12
-	.loc 1 1633 0
+	.loc 1 1699 0
 	mov	x6, 16384
-	.loc 1 1635 0
+	.loc 1 1701 0
 	mov	x0, x19
-	.loc 1 1633 0
+	.loc 1 1699 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 1635 0
+	.loc 1 1701 0
 	ldp	x1, x3, [x19]
-	.loc 1 1633 0
+	.loc 1 1699 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 1635 0
+	.loc 1 1701 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
 .LVL47:
-	.loc 1 1638 0
+	.loc 1 1704 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 1641 0
+	.loc 1 1707 0
 	ldr	x19, [sp, 16]
 .LVL48:
 	csel	w0, w0, w1, eq
@@ -768,23 +768,23 @@ ebc_mmap:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2826:
+.LFE2831:
 	.size	ebc_mmap, .-ebc_mmap
 	.align	2
 	.p2align 3,,7
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
-.LFB2825:
-	.loc 1 1428 0
+.LFB2830:
+	.loc 1 1494 0
 	.cfi_startproc
 .LVL49:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 1438 0
+	.loc 1 1504 0
 	cmp	w1, 28672
-	.loc 1 1428 0
+	.loc 1 1494 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -798,15 +798,15 @@ ebc_io_ctl:
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
 	.cfi_offset 23, -112
-	.loc 1 1428 0
+	.loc 1 1494 0
 	mov	x21, x2
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 1430 0
+	.loc 1 1496 0
 	adrp	x0, .LANCHOR0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1438 0
+	.loc 1 1504 0
 	bcc	.L88
 	mov	w0, 28675
 	cmp	w1, w0
@@ -816,7 +816,7 @@ ebc_io_ctl:
 	cmp	w0, 1
 	bls	.L89
 .L88:
-	.loc 1 1454 0
+	.loc 1 1520 0
 	mov	w0, 28677
 	cmp	w1, w0
 	beq	.L92
@@ -832,13 +832,13 @@ ebc_io_ctl:
 	mov	w0, 28683
 	cmp	w1, w0
 	bne	.L91
-	.loc 1 1606 0
+	.loc 1 1672 0
 	bl	ebc_empty_buf_get
 .LVL51:
 	mov	x23, x0
-	.loc 1 1607 0
+	.loc 1 1673 0
 	cbz	x0, .L112
-	.loc 1 1609 0
+	.loc 1 1675 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 392]
@@ -849,18 +849,18 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL52:
-	.loc 1 1610 0
+	.loc 1 1676 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL53:
 	sub	w0, w20, w0
-.LBB918:
-.LBB919:
-.LBB920:
-.LBB921:
-.LBB922:
-.LBB923:
-.LBB924:
+.LBB934:
+.LBB935:
+.LBB936:
+.LBB937:
+.LBB938:
+.LBB939:
+.LBB940:
 	.file 5 "./arch/arm64/include/asm/current.h"
 	.loc 5 19 0
 #APP
@@ -869,27 +869,27 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL54:
 #NO_APP
-.LBE924:
-.LBE923:
+.LBE940:
+.LBE939:
 	.file 6 "./arch/arm64/include/asm/uaccess.h"
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE922:
-.LBE921:
-.LBE920:
-.LBE919:
-.LBE918:
-	.loc 1 1612 0
+.LBE938:
+.LBE937:
+.LBE936:
+.LBE935:
+.LBE934:
+	.loc 1 1678 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 1611 0
+	.loc 1 1677 0
 	str	w0, [x29, 104]
-	.loc 1 1613 0
+	.loc 1 1679 0
 	stp	w4, w1, [x29, 112]
+.LBB965:
+.LBB962:
+.LBB959:
 .LBB949:
-.LBB946:
-.LBB943:
-.LBB933:
-.LBB931:
+.LBB947:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL55:
@@ -897,47 +897,47 @@ ebc_io_ctl:
 	tbnz	x3, 21, .L149
 .LVL56:
 .L215:
-.LBB925:
-.LBB926:
-.LBB927:
+.LBB941:
+.LBB942:
+.LBB943:
 	.file 7 "./include/asm-generic/bitops/non-atomic.h"
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL57:
-.LBE927:
-.LBE926:
-.LBE925:
-.LBE931:
-.LBE933:
 .LBE943:
-.LBE946:
+.LBE942:
+.LBE941:
+.LBE947:
 .LBE949:
-	.loc 1 1429 0
+.LBE959:
+.LBE962:
+.LBE965:
+	.loc 1 1495 0
 	mov	x0, x21
 .LVL58:
+.LBB966:
+.LBB963:
+.LBB960:
 .LBB950:
-.LBB947:
-.LBB944:
-.LBB934:
-.LBB932:
+.LBB948:
 	.loc 6 84 0
 	tbz	x2, 26, .L150
 .LVL59:
 .L149:
-.LBB928:
-.LBB929:
-.LBB930:
+.LBB944:
+.LBB945:
+.LBB946:
 	.file 8 "./include/linux/bitops.h"
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL60:
-.LBE930:
-.LBE929:
+.LBE946:
+.LBE945:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL61:
 .L150:
-.LBE928:
+.LBE944:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -950,46 +950,46 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL62:
 #NO_APP
-.LBE932:
-.LBE934:
+.LBE948:
+.LBE950:
 	.file 9 "./include/linux/uaccess.h"
 	.loc 9 132 0
 	mov	x22, 44
 	cbnz	x0, .L223
 .L151:
-.LBE944:
-.LBE947:
-.LBE950:
-	.loc 1 1615 0
+.LBE960:
+.LBE963:
+.LBE966:
+	.loc 1 1681 0
 	mov	x0, x23
 .LVL63:
 	bl	ebc_buf_release
 .LVL64:
-	.loc 1 1616 0
+	.loc 1 1682 0
 	b	.L87
 .LVL65:
 	.p2align 3
 .L89:
-	.loc 1 1445 0
+	.loc 1 1511 0
 	cbnz	x21, .L88
-	.loc 1 1446 0
+	.loc 1 1512 0
 	ldr	x0, [x20, 272]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
 .LVL66:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC1
-	.loc 1 1447 0
+	.loc 1 1513 0
 	mov	x22, -14
-	.loc 1 1446 0
+	.loc 1 1512 0
 	bl	_dev_err
 .LVL67:
-	.loc 1 1447 0
+	.loc 1 1513 0
 	b	.L87
 .LVL68:
 	.p2align 3
 .L221:
-	.loc 1 1454 0
+	.loc 1 1520 0
 	mov	w0, 28674
 	cmp	w1, w0
 	beq	.L94
@@ -1000,23 +1000,23 @@ ebc_io_ctl:
 	mov	w0, 28676
 	cmp	w1, w0
 	bne	.L91
-	.loc 1 1538 0
+	.loc 1 1604 0
 	ldr	x0, [x20, 272]
-	.loc 1 1537 0
+	.loc 1 1603 0
 	mov	w2, 1
 	str	w2, [x20, 788]
-	.loc 1 1538 0
+	.loc 1 1604 0
 	adrp	x1, .LC2
 .LVL69:
-	.loc 1 1539 0
+	.loc 1 1605 0
 	mov	x22, 0
-	.loc 1 1538 0
+	.loc 1 1604 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
 .LVL70:
 	.p2align 2
 .L87:
-	.loc 1 1626 0
+	.loc 1 1692 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
 .LVL71:
@@ -1044,19 +1044,19 @@ ebc_io_ctl:
 	.p2align 3
 .L224:
 	.cfi_restore_state
-	.loc 1 1454 0
+	.loc 1 1520 0
 	cmp	w1, 28672
 	beq	.L96
 	mov	w0, 28673
 	cmp	w1, w0
 	bne	.L91
-.LBB951:
-.LBB952:
-.LBB953:
-.LBB954:
-.LBB955:
-.LBB956:
-.LBB957:
+.LBB967:
+.LBB968:
+.LBB969:
+.LBB970:
+.LBB971:
+.LBB972:
+.LBB973:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1064,8 +1064,8 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL75:
 #NO_APP
-.LBE957:
-.LBE956:
+.LBE973:
+.LBE972:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
@@ -1075,19 +1075,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L226
 .LVL77:
 .L117:
-.LBB958:
-.LBB959:
-.LBB960:
+.LBB974:
+.LBB975:
+.LBB976:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL78:
-.LBE960:
-.LBE959:
+.LBE976:
+.LBE975:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL79:
 .L118:
-.LBE958:
+.LBE974:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1100,23 +1100,23 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL80:
 #NO_APP
-.LBE955:
-.LBE954:
+.LBE971:
+.LBE970:
 	.loc 9 114 0
 	cbz	x0, .L120
-.LBB966:
-.LBB967:
-.LBB968:
-.LBB969:
-.LBB970:
+.LBB982:
+.LBB983:
+.LBB984:
+.LBB985:
+.LBB986:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL81:
-.LBE970:
-.LBE969:
-.LBE968:
-.LBB971:
-.LBB972:
+.LBE986:
+.LBE985:
+.LBE984:
+.LBB987:
+.LBB988:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1124,13 +1124,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL82:
 #NO_APP
-.LBE972:
-.LBE971:
-.LBB973:
+.LBE988:
+.LBE987:
+.LBB989:
 	.loc 6 254 0
 	and	x0, x0, x21
 .LVL83:
-.LBE973:
+.LBE989:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1145,8 +1145,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE967:
-.LBE966:
+.LBE983:
+.LBE982:
 	.loc 9 116 0
 	mov	x2, 44
 	add	x0, x29, 104
@@ -1155,75 +1155,75 @@ ebc_io_ctl:
 .LVL86:
 	.loc 9 118 0
 	cbnz	x0, .L120
-.LBE953:
-.LBE952:
-.LBE951:
-	.loc 1 1492 0
+.LBE969:
+.LBE968:
+.LBE967:
+	.loc 1 1558 0
 	bl	ebc_phy_buf_base_get
 .LVL87:
 	ldrsw	x1, [x29, 104]
-	.loc 1 1493 0
+	.loc 1 1559 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
 .LVL88:
 	mov	x21, x0
 .LVL89:
-	.loc 1 1494 0
+	.loc 1 1560 0
 	cbz	x0, .L127
-	.loc 1 1495 0
+	.loc 1 1561 0
 	ldr	w5, [x29, 108]
-	.loc 1 1504 0
+	.loc 1 1570 0
 	add	x20, x20, 184
-	.loc 1 1499 0
+	.loc 1 1565 0
 	ldp	w4, w2, [x29, 124]
-	.loc 1 1495 0
+	.loc 1 1561 0
 	str	w5, [x21, 40]
-	.loc 1 1500 0
+	.loc 1 1566 0
 	ldp	w3, w1, [x29, 132]
-	.loc 1 1499 0
+	.loc 1 1565 0
 	stp	w4, w2, [x21, 48]
-	.loc 1 1500 0
+	.loc 1 1566 0
 	stp	w3, w1, [x21, 56]
-	.loc 1 1502 0
+	.loc 1 1568 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL90:
-	.loc 1 1504 0
+	.loc 1 1570 0
 	ldr	w0, [x20, 80]
 	cbz	w0, .L227
 .L122:
-	.loc 1 1508 0
+	.loc 1 1574 0
 	ldr	w0, [x21, 40]
-	cmp	w0, 15
-	beq	.L228
-	.loc 1 1508 0 is_stmt 0 discriminator 3
 	cmp	w0, 17
+	beq	.L228
+	.loc 1 1574 0 is_stmt 0 discriminator 3
+	cmp	w0, 19
 	bne	.L127
 .L124:
-	.loc 1 1509 0 is_stmt 1
+	.loc 1 1575 0 is_stmt 1
 	mov	w0, 1
 	str	w0, [x20, 188]
-.LBB980:
-.LBB981:
-	.loc 1 1510 0
+.LBB996:
+.LBB997:
+	.loc 1 1576 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
 .LVL91:
 	adrp	x0, .LANCHOR1
-.LBB982:
+.LBB998:
 	add	x0, x0, :lo12:.LANCHOR1
 	add	x21, x0, 328
 	b	.L128
 	.p2align 3
 .L229:
 .LVL92:
-	.loc 1 1510 0 is_stmt 0 discriminator 5
+	.loc 1 1576 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L127
-	.loc 1 1510 0 discriminator 7
+	.loc 1 1576 0 discriminator 7
 	bl	schedule
 .LVL93:
 .L128:
-	.loc 1 1510 0 discriminator 9
+	.loc 1 1576 0 discriminator 9
 	add	x1, x29, 64
 	mov	w2, 1
 	mov	x0, x21
@@ -1231,8 +1231,8 @@ ebc_io_ctl:
 .LVL94:
 	ldr	w1, [x20, 188]
 	cbnz	w1, .L229
-.LBE982:
-	.loc 1 1510 0 discriminator 4
+.LBE998:
+	.loc 1 1576 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
 	bl	finish_wait
@@ -1244,15 +1244,15 @@ ebc_io_ctl:
 .LVL96:
 	.p2align 3
 .L104:
-.LBE981:
-.LBE980:
-	.loc 1 1593 0 is_stmt 1
+.LBE997:
+.LBE996:
+	.loc 1 1659 0 is_stmt 1
 	bl	ebc_empty_buf_get
 .LVL97:
 	mov	x23, x0
-	.loc 1 1594 0
+	.loc 1 1660 0
 	cbz	x0, .L112
-	.loc 1 1596 0
+	.loc 1 1662 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 328]
@@ -1262,20 +1262,20 @@ ebc_io_ctl:
 .LVL98:
 	.p2align 3
 .L222:
-	.loc 1 1454 0
+	.loc 1 1520 0
 	mov	w0, 28678
 	cmp	w1, w0
 	beq	.L102
 	mov	w0, 28679
 	cmp	w1, w0
 	bne	.L91
-.LBB986:
-.LBB987:
-.LBB988:
-.LBB989:
-.LBB990:
-.LBB991:
-.LBB992:
+.LBB1002:
+.LBB1003:
+.LBB1004:
+.LBB1005:
+.LBB1006:
+.LBB1007:
+.LBB1008:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1283,8 +1283,8 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL99:
 #NO_APP
-.LBE992:
-.LBE991:
+.LBE1008:
+.LBE1007:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
@@ -1294,19 +1294,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L230
 .LVL101:
 .L129:
-.LBB993:
-.LBB994:
-.LBB995:
+.LBB1009:
+.LBB1010:
+.LBB1011:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL102:
-.LBE995:
-.LBE994:
+.LBE1011:
+.LBE1010:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL103:
 .L130:
-.LBE993:
+.LBE1009:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1319,23 +1319,23 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL104:
 #NO_APP
-.LBE990:
-.LBE989:
+.LBE1006:
+.LBE1005:
 	.loc 9 114 0
 	cbz	x0, .L120
-.LBB1001:
-.LBB1002:
-.LBB1003:
-.LBB1004:
-.LBB1005:
+.LBB1017:
+.LBB1018:
+.LBB1019:
+.LBB1020:
+.LBB1021:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL105:
-.LBE1005:
-.LBE1004:
-.LBE1003:
-.LBB1006:
-.LBB1007:
+.LBE1021:
+.LBE1020:
+.LBE1019:
+.LBB1022:
+.LBB1023:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1343,13 +1343,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL106:
 #NO_APP
-.LBE1007:
-.LBE1006:
-.LBB1008:
+.LBE1023:
+.LBE1022:
+.LBB1024:
 	.loc 6 254 0
 	and	x0, x0, x21
 .LVL107:
-.LBE1008:
+.LBE1024:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1364,8 +1364,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1002:
-.LBE1001:
+.LBE1018:
+.LBE1017:
 	.loc 9 116 0
 	mov	x2, 44
 	add	x0, x29, 104
@@ -1374,39 +1374,39 @@ ebc_io_ctl:
 .LVL110:
 	.loc 9 118 0
 	cbnz	x0, .L120
-.LBE988:
-.LBE987:
-.LBE986:
-	.loc 1 1519 0
+.LBE1004:
+.LBE1003:
+.LBE1002:
+	.loc 1 1585 0
 	bl	ebc_osd_buf_clone
 .LVL111:
 	mov	x1, x0
-	.loc 1 1520 0
+	.loc 1 1586 0
 	cbz	x0, .L127
-	.loc 1 1521 0
+	.loc 1 1587 0
 	ldr	w6, [x29, 108]
-	.loc 1 1530 0
+	.loc 1 1596 0
 	add	x20, x20, 184
-	.loc 1 1525 0
+	.loc 1 1591 0
 	ldp	w5, w3, [x29, 124]
-	.loc 1 1521 0
+	.loc 1 1587 0
 	str	w6, [x1, 40]
-	.loc 1 1526 0
+	.loc 1 1592 0
 	ldp	w4, w2, [x29, 132]
-	.loc 1 1525 0
+	.loc 1 1591 0
 	stp	w5, w3, [x1, 48]
-	.loc 1 1526 0
+	.loc 1 1592 0
 	stp	w4, w2, [x1, 56]
-	.loc 1 1528 0
+	.loc 1 1594 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL112:
-	.loc 1 1530 0
+	.loc 1 1596 0
 	ldr	w0, [x20, 80]
 	cbnz	w0, .L127
-	.loc 1 1531 0
+	.loc 1 1597 0
 	mov	w2, 1
 	str	w2, [x20, 80]
-	.loc 1 1532 0
+	.loc 1 1598 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -1418,22 +1418,22 @@ ebc_io_ctl:
 .LVL114:
 	.p2align 3
 .L223:
-.LBB1015:
-.LBB948:
-.LBB945:
-.LBB935:
-.LBB936:
-.LBB937:
-.LBB938:
-.LBB939:
+.LBB1031:
+.LBB964:
+.LBB961:
+.LBB951:
+.LBB952:
+.LBB953:
+.LBB954:
+.LBB955:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL115:
-.LBE939:
-.LBE938:
-.LBE937:
-.LBB940:
-.LBB941:
+.LBE955:
+.LBE954:
+.LBE953:
+.LBB956:
+.LBB957:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1441,13 +1441,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL116:
 #NO_APP
-.LBE941:
-.LBE940:
-.LBB942:
+.LBE957:
+.LBE956:
+.LBB958:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL117:
-.LBE942:
+.LBE958:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL118:
@@ -1463,8 +1463,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE936:
-.LBE935:
+.LBE952:
+.LBE951:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
@@ -1476,25 +1476,25 @@ ebc_io_ctl:
 .LVL122:
 	.p2align 3
 .L102:
-.LBE945:
-.LBE948:
-.LBE1015:
-	.loc 1 1456 0
+.LBE961:
+.LBE964:
+.LBE1031:
+	.loc 1 1522 0
 	bl	ebc_osd_buf_get
 .LVL123:
-	.loc 1 1457 0
+	.loc 1 1523 0
 	cbz	x0, .L112
-	.loc 1 1460 0
+	.loc 1 1526 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL124:
-.LBB1016:
-.LBB1017:
-.LBB1018:
-.LBB1019:
-.LBB1020:
-.LBB1021:
-.LBB1022:
+.LBB1032:
+.LBB1033:
+.LBB1034:
+.LBB1035:
+.LBB1036:
+.LBB1037:
+.LBB1038:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1502,32 +1502,32 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL125:
 #NO_APP
-.LBE1022:
-.LBE1021:
+.LBE1038:
+.LBE1037:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1020:
-.LBE1019:
-.LBE1018:
-.LBE1017:
-.LBE1016:
-	.loc 1 1460 0
+.LBE1036:
+.LBE1035:
+.LBE1034:
+.LBE1033:
+.LBE1032:
+	.loc 1 1526 0
 	sub	w0, w22, w0
-	.loc 1 1465 0
+	.loc 1 1531 0
 	ldr	w1, [x20, 176]
-	.loc 1 1464 0
+	.loc 1 1530 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1463 0
+	.loc 1 1529 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1465 0
+	.loc 1 1531 0
 	str	w1, [x29, 120]
-	.loc 1 1462 0
+	.loc 1 1528 0
 	str	w0, [x29, 104]
-.LBB1049:
-.LBB1046:
-.LBB1043:
-.LBB1032:
-.LBB1029:
+.LBB1065:
+.LBB1062:
+.LBB1059:
+.LBB1048:
+.LBB1045:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL126:
@@ -1535,19 +1535,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L231
 .LVL127:
 .L108:
-.LBB1023:
-.LBB1024:
-.LBB1025:
+.LBB1039:
+.LBB1040:
+.LBB1041:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL128:
-.LBE1025:
-.LBE1024:
+.LBE1041:
+.LBE1040:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL129:
 .L109:
-.LBE1023:
+.LBE1039:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1560,24 +1560,24 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL130:
 #NO_APP
-.LBE1029:
-.LBE1032:
+.LBE1045:
+.LBE1048:
 	.loc 9 132 0
 	mov	x22, 44
 	cbz	x0, .L87
-.LBB1033:
-.LBB1034:
-.LBB1035:
-.LBB1036:
-.LBB1037:
+.LBB1049:
+.LBB1050:
+.LBB1051:
+.LBB1052:
+.LBB1053:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL131:
-.LBE1037:
-.LBE1036:
-.LBE1035:
-.LBB1038:
-.LBB1039:
+.LBE1053:
+.LBE1052:
+.LBE1051:
+.LBB1054:
+.LBB1055:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1585,13 +1585,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL132:
 #NO_APP
-.LBE1039:
-.LBE1038:
-.LBB1040:
+.LBE1055:
+.LBE1054:
+.LBB1056:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL133:
-.LBE1040:
+.LBE1056:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL134:
@@ -1607,8 +1607,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1034:
-.LBE1033:
+.LBE1050:
+.LBE1049:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
@@ -1620,16 +1620,16 @@ ebc_io_ctl:
 .LVL138:
 	.p2align 3
 .L98:
-.LBE1043:
-.LBE1046:
-.LBE1049:
-.LBB1050:
-.LBB1051:
-.LBB1052:
-.LBB1053:
-.LBB1054:
-.LBB1055:
-.LBB1056:
+.LBE1059:
+.LBE1062:
+.LBE1065:
+.LBB1066:
+.LBB1067:
+.LBB1068:
+.LBB1069:
+.LBB1070:
+.LBB1071:
+.LBB1072:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1637,42 +1637,42 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL139:
 #NO_APP
-.LBE1056:
-.LBE1055:
+.LBE1072:
+.LBE1071:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
-.LBE1054:
-.LBE1053:
-.LBE1052:
-.LBE1051:
-.LBE1050:
-	.loc 1 1546 0
+.LBE1070:
+.LBE1069:
+.LBE1068:
+.LBE1067:
+.LBE1066:
+	.loc 1 1612 0
 	add	x22, x20, 232
-.LBB1085:
-.LBB1081:
-.LBB1077:
-.LBB1066:
-.LBB1063:
-	.loc 6 77 0
-	ldr	x1, [x0, 8]
-.LVL140:
-	.loc 6 84 0
+.LBB1101:
+.LBB1097:
+.LBB1093:
+.LBB1082:
+.LBB1079:
+	.loc 6 77 0
+	ldr	x1, [x0, 8]
+.LVL140:
+	.loc 6 84 0
 	tbz	x2, 21, .L232
 .LVL141:
 .L132:
-.LBB1057:
-.LBB1058:
-.LBB1059:
+.LBB1073:
+.LBB1074:
+.LBB1075:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL142:
-.LBE1059:
-.LBE1058:
+.LBE1075:
+.LBE1074:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL143:
 .L133:
-.LBE1057:
+.LBE1073:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1686,22 +1686,22 @@ ebc_io_ctl:
 .LVL144:
 #NO_APP
 	mov	x3, x0
-.LBE1063:
-.LBE1066:
+.LBE1079:
+.LBE1082:
 	.loc 9 114 0
 	cbz	x0, .L161
-.LBB1067:
-.LBB1068:
-.LBB1069:
-.LBB1070:
-.LBB1071:
+.LBB1083:
+.LBB1084:
+.LBB1085:
+.LBB1086:
+.LBB1087:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LBE1071:
-.LBE1070:
-.LBE1069:
-.LBB1072:
-.LBB1073:
+.LBE1087:
+.LBE1086:
+.LBE1085:
+.LBB1088:
+.LBB1089:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1709,13 +1709,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL145:
 #NO_APP
-.LBE1073:
-.LBE1072:
-.LBB1074:
+.LBE1089:
+.LBE1088:
+.LBB1090:
 	.loc 6 254 0
 	and	x0, x0, x21
 .LVL146:
-.LBE1074:
+.LBE1090:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1730,8 +1730,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1068:
-.LBE1067:
+.LBE1084:
+.LBE1083:
 	.loc 9 116 0
 	mov	x2, 4
 	mov	x0, x22
@@ -1740,52 +1740,52 @@ ebc_io_ctl:
 .LVL149:
 	.loc 9 118 0
 	cbnz	x0, .L233
-.LBE1077:
-.LBE1081:
-.LBE1085:
-	.loc 1 1550 0
+.LBE1093:
+.LBE1097:
+.LBE1101:
+	.loc 1 1616 0
 	add	x20, x20, 184
 	ldr	w2, [x20, 48]
 	ldr	x0, [x20, 88]
 .LVL150:
-	.loc 1 1551 0
+	.loc 1 1617 0
 	mov	x22, 0
-	.loc 1 1550 0
+	.loc 1 1616 0
 	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	_dev_info
 .LVL151:
-	.loc 1 1551 0
+	.loc 1 1617 0
 	b	.L87
 .LVL152:
 	.p2align 3
 .L92:
-	.loc 1 1543 0
+	.loc 1 1609 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC3
 .LVL153:
-	.loc 1 1541 0
+	.loc 1 1607 0
 	str	wzr, [x20, 788]
-	.loc 1 1544 0
+	.loc 1 1610 0
 	mov	x22, 0
-	.loc 1 1542 0
+	.loc 1 1608 0
 	str	wzr, [x20, 792]
-	.loc 1 1543 0
+	.loc 1 1609 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
 .LVL154:
-	.loc 1 1544 0
+	.loc 1 1610 0
 	b	.L87
 .LVL155:
 	.p2align 3
 .L100:
-	.loc 1 1580 0
+	.loc 1 1646 0
 	bl	ebc_empty_buf_get
 .LVL156:
 	mov	x23, x0
-	.loc 1 1581 0
+	.loc 1 1647 0
 	cbz	x0, .L112
-	.loc 1 1583 0
+	.loc 1 1649 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 320]
@@ -1795,13 +1795,13 @@ ebc_io_ctl:
 .LVL157:
 	.p2align 3
 .L105:
-	.loc 1 1567 0
+	.loc 1 1633 0
 	bl	ebc_empty_buf_get
 .LVL158:
 	mov	x23, x0
-	.loc 1 1568 0
+	.loc 1 1634 0
 	cbz	x0, .L112
-	.loc 1 1570 0
+	.loc 1 1636 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 312]
@@ -1810,18 +1810,18 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL159:
-	.loc 1 1571 0
+	.loc 1 1637 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL160:
 	sub	w0, w20, w0
-.LBB1086:
-.LBB1087:
-.LBB1088:
-.LBB1089:
-.LBB1090:
-.LBB1091:
-.LBB1092:
+.LBB1102:
+.LBB1103:
+.LBB1104:
+.LBB1105:
+.LBB1106:
+.LBB1107:
+.LBB1108:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1829,26 +1829,26 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL161:
 #NO_APP
-.LBE1092:
-.LBE1091:
+.LBE1108:
+.LBE1107:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1090:
-.LBE1089:
-.LBE1088:
-.LBE1087:
-.LBE1086:
-	.loc 1 1574 0
+.LBE1106:
+.LBE1105:
+.LBE1104:
+.LBE1103:
+.LBE1102:
+	.loc 1 1640 0
 	ldp	w4, w1, [x22, 84]
-	.loc 1 1572 0
+	.loc 1 1638 0
 	str	w0, [x29, 104]
-	.loc 1 1573 0
+	.loc 1 1639 0
 	stp	w1, w4, [x29, 112]
-.LBB1097:
-.LBB1096:
-.LBB1095:
-.LBB1094:
-.LBB1093:
+.LBB1113:
+.LBB1112:
+.LBB1111:
+.LBB1110:
+.LBB1109:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL162:
@@ -1858,18 +1858,18 @@ ebc_io_ctl:
 .LVL163:
 	.p2align 3
 .L94:
-.LBE1093:
-.LBE1094:
-.LBE1095:
-.LBE1096:
-.LBE1097:
-.LBB1098:
-.LBB1099:
-.LBB1100:
-.LBB1101:
-.LBB1102:
-.LBB1103:
-.LBB1104:
+.LBE1109:
+.LBE1110:
+.LBE1111:
+.LBE1112:
+.LBE1113:
+.LBB1114:
+.LBB1115:
+.LBB1116:
+.LBB1117:
+.LBB1118:
+.LBB1119:
+.LBB1120:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1877,31 +1877,31 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL164:
 #NO_APP
-.LBE1104:
-.LBE1103:
+.LBE1120:
+.LBE1119:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1102:
-.LBE1101:
-.LBE1100:
-.LBE1099:
-.LBE1098:
-	.loc 1 1557 0
+.LBE1118:
+.LBE1117:
+.LBE1116:
+.LBE1115:
+.LBE1114:
+	.loc 1 1623 0
 	ldp	w1, w0, [x20, 116]
 .LVL165:
 	stp	w1, w0, [x29, 140]
-	.loc 1 1554 0
+	.loc 1 1620 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 1553 0
+	.loc 1 1619 0
 	stp	w5, w6, [x29, 112]
-	.loc 1 1555 0
+	.loc 1 1621 0
 	ldr	w4, [x20, 176]
 	str	w4, [x29, 120]
-.LBB1133:
-.LBB1129:
-.LBB1125:
-.LBB1114:
-.LBB1111:
+.LBB1149:
+.LBB1145:
+.LBB1141:
+.LBB1130:
+.LBB1127:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL166:
@@ -1909,19 +1909,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L234
 .LVL167:
 .L136:
-.LBB1105:
-.LBB1106:
-.LBB1107:
+.LBB1121:
+.LBB1122:
+.LBB1123:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL168:
-.LBE1107:
-.LBE1106:
+.LBE1123:
+.LBE1122:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL169:
 .L137:
-.LBE1105:
+.LBE1121:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1934,64 +1934,64 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL170:
 #NO_APP
-.LBE1111:
-.LBE1114:
+.LBE1127:
+.LBE1130:
 	.loc 9 132 0
 	cbnz	x0, .L138
 .L139:
-.LBE1125:
-.LBE1129:
-.LBE1133:
-	.loc 1 1560 0
+.LBE1141:
+.LBE1145:
+.LBE1149:
+	.loc 1 1626 0
 	ldr	x0, [x20, 272]
 .LVL171:
 	adrp	x1, .LC5
 .LVL172:
-	.loc 1 1561 0
+	.loc 1 1627 0
 	mov	x22, -14
-	.loc 1 1560 0
+	.loc 1 1626 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
 .LVL173:
-	.loc 1 1561 0
+	.loc 1 1627 0
 	b	.L87
 .LVL174:
 	.p2align 3
 .L91:
-	.loc 1 1621 0
+	.loc 1 1687 0
 	ldr	x0, [x20, 272]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
 .LVL175:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
-	.loc 1 1622 0
+	.loc 1 1688 0
 	mov	x22, 0
-	.loc 1 1621 0
+	.loc 1 1687 0
 	bl	_dev_err
 .LVL176:
-	.loc 1 1625 0
+	.loc 1 1691 0
 	b	.L87
 .LVL177:
 	.p2align 3
 .L96:
-	.loc 1 1470 0
+	.loc 1 1536 0
 	bl	ebc_empty_buf_get
 .LVL178:
 	mov	x23, x0
-	.loc 1 1471 0
+	.loc 1 1537 0
 	cbz	x0, .L112
-	.loc 1 1474 0
+	.loc 1 1540 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL179:
-.LBB1134:
-.LBB1135:
-.LBB1136:
-.LBB1137:
-.LBB1138:
-.LBB1139:
-.LBB1140:
+.LBB1150:
+.LBB1151:
+.LBB1152:
+.LBB1153:
+.LBB1154:
+.LBB1155:
+.LBB1156:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1999,32 +1999,32 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL180:
 #NO_APP
-.LBE1140:
-.LBE1139:
+.LBE1156:
+.LBE1155:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1138:
-.LBE1137:
-.LBE1136:
-.LBE1135:
-.LBE1134:
-	.loc 1 1474 0
+.LBE1154:
+.LBE1153:
+.LBE1152:
+.LBE1151:
+.LBE1150:
+	.loc 1 1540 0
 	sub	w0, w22, w0
-	.loc 1 1479 0
+	.loc 1 1545 0
 	ldr	w1, [x20, 176]
-	.loc 1 1478 0
+	.loc 1 1544 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1477 0
+	.loc 1 1543 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1479 0
+	.loc 1 1545 0
 	str	w1, [x29, 120]
-	.loc 1 1476 0
+	.loc 1 1542 0
 	str	w0, [x29, 104]
-.LBB1169:
-.LBB1165:
-.LBB1161:
-.LBB1150:
-.LBB1147:
+.LBB1185:
+.LBB1181:
+.LBB1177:
+.LBB1166:
+.LBB1163:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL181:
@@ -2032,19 +2032,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L235
 .LVL182:
 .L113:
-.LBB1141:
-.LBB1142:
-.LBB1143:
+.LBB1157:
+.LBB1158:
+.LBB1159:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL183:
-.LBE1143:
-.LBE1142:
+.LBE1159:
+.LBE1158:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL184:
 .L114:
-.LBE1141:
+.LBE1157:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2057,268 +2057,268 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL185:
 #NO_APP
-.LBE1147:
-.LBE1150:
+.LBE1163:
+.LBE1166:
 	.loc 9 132 0
 	cbnz	x0, .L115
 .L116:
-.LBE1161:
-.LBE1165:
-.LBE1169:
-	.loc 1 1483 0
+.LBE1177:
+.LBE1181:
+.LBE1185:
+	.loc 1 1549 0
 	mov	x0, x23
 .LVL186:
-	.loc 1 1484 0
+	.loc 1 1550 0
 	mov	x22, -14
-	.loc 1 1483 0
+	.loc 1 1549 0
 	bl	ebc_buf_release
 .LVL187:
-	.loc 1 1484 0
+	.loc 1 1550 0
 	b	.L87
 .LVL188:
 	.p2align 3
 .L230:
-.LBB1170:
+.LBB1186:
+.LBB1029:
+.LBB1027:
+.LBB1025:
+.LBB1015:
+.LBB1012:
 .LBB1013:
-.LBB1011:
-.LBB1009:
-.LBB999:
-.LBB996:
-.LBB997:
-.LBB998:
+.LBB1014:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE998:
-.LBE997:
-.LBE996:
-.LBE999:
-.LBE1009:
-.LBE1011:
+.LBE1014:
 .LBE1013:
-.LBE1170:
-	.loc 1 1429 0
+.LBE1012:
+.LBE1015:
+.LBE1025:
+.LBE1027:
+.LBE1029:
+.LBE1186:
+	.loc 1 1495 0
 	mov	x0, x21
 .LVL189:
-.LBB1171:
-.LBB1014:
-.LBB1012:
-.LBB1010:
-.LBB1000:
+.LBB1187:
+.LBB1030:
+.LBB1028:
+.LBB1026:
+.LBB1016:
 	.loc 6 84 0
 	tbz	x2, 26, .L130
 	b	.L129
 .LVL190:
 	.p2align 3
 .L226:
-.LBE1000:
-.LBE1010:
-.LBE1012:
-.LBE1014:
-.LBE1171:
-.LBB1172:
+.LBE1016:
+.LBE1026:
+.LBE1028:
+.LBE1030:
+.LBE1187:
+.LBB1188:
+.LBB994:
+.LBB992:
+.LBB990:
+.LBB980:
+.LBB977:
 .LBB978:
-.LBB976:
-.LBB974:
-.LBB964:
-.LBB961:
-.LBB962:
-.LBB963:
+.LBB979:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE963:
-.LBE962:
-.LBE961:
-.LBE964:
-.LBE974:
-.LBE976:
+.LBE979:
 .LBE978:
-.LBE1172:
-	.loc 1 1429 0
+.LBE977:
+.LBE980:
+.LBE990:
+.LBE992:
+.LBE994:
+.LBE1188:
+	.loc 1 1495 0
 	mov	x0, x21
 .LVL191:
-.LBB1173:
-.LBB979:
-.LBB977:
-.LBB975:
-.LBB965:
+.LBB1189:
+.LBB995:
+.LBB993:
+.LBB991:
+.LBB981:
 	.loc 6 84 0
 	tbz	x2, 26, .L118
 	b	.L117
 .LVL192:
 	.p2align 3
 .L234:
-.LBE965:
-.LBE975:
-.LBE977:
-.LBE979:
-.LBE1173:
-.LBB1174:
-.LBB1130:
+.LBE981:
+.LBE991:
+.LBE993:
+.LBE995:
+.LBE1189:
+.LBB1190:
+.LBB1146:
+.LBB1142:
+.LBB1131:
+.LBB1128:
+.LBB1124:
+.LBB1125:
 .LBB1126:
-.LBB1115:
-.LBB1112:
-.LBB1108:
-.LBB1109:
-.LBB1110:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL193:
-.LBE1110:
-.LBE1109:
-.LBE1108:
-.LBE1112:
-.LBE1115:
 .LBE1126:
-.LBE1130:
-.LBE1174:
-	.loc 1 1429 0
+.LBE1125:
+.LBE1124:
+.LBE1128:
+.LBE1131:
+.LBE1142:
+.LBE1146:
+.LBE1190:
+	.loc 1 1495 0
 	mov	x0, x21
 .LVL194:
-.LBB1175:
-.LBB1131:
-.LBB1127:
-.LBB1116:
-.LBB1113:
+.LBB1191:
+.LBB1147:
+.LBB1143:
+.LBB1132:
+.LBB1129:
 	.loc 6 84 0
 	tbz	x2, 26, .L137
 	b	.L136
 .LVL195:
 	.p2align 3
 .L232:
-.LBE1113:
-.LBE1116:
-.LBE1127:
-.LBE1131:
-.LBE1175:
-.LBB1176:
-.LBB1082:
+.LBE1129:
+.LBE1132:
+.LBE1143:
+.LBE1147:
+.LBE1191:
+.LBB1192:
+.LBB1098:
+.LBB1094:
+.LBB1091:
+.LBB1080:
+.LBB1076:
+.LBB1077:
 .LBB1078:
-.LBB1075:
-.LBB1064:
-.LBB1060:
-.LBB1061:
-.LBB1062:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1062:
-.LBE1061:
-.LBE1060:
-.LBE1064:
-.LBE1075:
 .LBE1078:
-.LBE1082:
-.LBE1176:
-	.loc 1 1429 0
+.LBE1077:
+.LBE1076:
+.LBE1080:
+.LBE1091:
+.LBE1094:
+.LBE1098:
+.LBE1192:
+	.loc 1 1495 0
 	mov	x0, x21
 .LVL196:
-.LBB1177:
-.LBB1083:
-.LBB1079:
-.LBB1076:
-.LBB1065:
+.LBB1193:
+.LBB1099:
+.LBB1095:
+.LBB1092:
+.LBB1081:
 	.loc 6 84 0
 	tbz	x2, 26, .L133
 	b	.L132
 .LVL197:
 	.p2align 3
 .L235:
-.LBE1065:
-.LBE1076:
-.LBE1079:
-.LBE1083:
-.LBE1177:
+.LBE1081:
+.LBE1092:
+.LBE1095:
+.LBE1099:
+.LBE1193:
+.LBB1194:
+.LBB1182:
 .LBB1178:
-.LBB1166:
+.LBB1167:
+.LBB1164:
+.LBB1160:
+.LBB1161:
 .LBB1162:
-.LBB1151:
-.LBB1148:
-.LBB1144:
-.LBB1145:
-.LBB1146:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL198:
-.LBE1146:
-.LBE1145:
-.LBE1144:
-.LBE1148:
-.LBE1151:
 .LBE1162:
-.LBE1166:
+.LBE1161:
+.LBE1160:
+.LBE1164:
+.LBE1167:
 .LBE1178:
-	.loc 1 1429 0
+.LBE1182:
+.LBE1194:
+	.loc 1 1495 0
 	mov	x0, x21
 .LVL199:
+.LBB1195:
+.LBB1183:
 .LBB1179:
-.LBB1167:
-.LBB1163:
-.LBB1152:
-.LBB1149:
+.LBB1168:
+.LBB1165:
 	.loc 6 84 0
 	tbz	x2, 26, .L114
 	b	.L113
 .LVL200:
 	.p2align 3
 .L231:
-.LBE1149:
-.LBE1152:
-.LBE1163:
-.LBE1167:
+.LBE1165:
+.LBE1168:
 .LBE1179:
-.LBB1180:
-.LBB1047:
-.LBB1044:
-.LBB1041:
-.LBB1030:
-.LBB1026:
-.LBB1027:
-.LBB1028:
+.LBE1183:
+.LBE1195:
+.LBB1196:
+.LBB1063:
+.LBB1060:
+.LBB1057:
+.LBB1046:
+.LBB1042:
+.LBB1043:
+.LBB1044:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL201:
-.LBE1028:
-.LBE1027:
-.LBE1026:
-.LBE1030:
-.LBE1041:
 .LBE1044:
-.LBE1047:
-.LBE1180:
-	.loc 1 1429 0
+.LBE1043:
+.LBE1042:
+.LBE1046:
+.LBE1057:
+.LBE1060:
+.LBE1063:
+.LBE1196:
+	.loc 1 1495 0
 	mov	x0, x21
 .LVL202:
-.LBB1181:
-.LBB1048:
-.LBB1045:
-.LBB1042:
-.LBB1031:
+.LBB1197:
+.LBB1064:
+.LBB1061:
+.LBB1058:
+.LBB1047:
 	.loc 6 84 0
 	tbz	x2, 26, .L109
 	b	.L108
 .LVL203:
 	.p2align 3
 .L138:
-.LBE1031:
-.LBE1042:
-.LBE1045:
-.LBE1048:
-.LBE1181:
-.LBB1182:
-.LBB1132:
-.LBB1128:
-.LBB1117:
-.LBB1118:
-.LBB1119:
-.LBB1120:
-.LBB1121:
+.LBE1047:
+.LBE1058:
+.LBE1061:
+.LBE1064:
+.LBE1197:
+.LBB1198:
+.LBB1148:
+.LBB1144:
+.LBB1133:
+.LBB1134:
+.LBB1135:
+.LBB1136:
+.LBB1137:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL204:
-.LBE1121:
-.LBE1120:
-.LBE1119:
-.LBB1122:
-.LBB1123:
+.LBE1137:
+.LBE1136:
+.LBE1135:
+.LBB1138:
+.LBB1139:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2326,13 +2326,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL205:
 #NO_APP
-.LBE1123:
-.LBE1122:
-.LBB1124:
+.LBE1139:
+.LBE1138:
+.LBB1140:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL206:
-.LBE1124:
+.LBE1140:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL207:
@@ -2348,44 +2348,44 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1118:
-.LBE1117:
+.LBE1134:
+.LBE1133:
 	.loc 9 134 0
 	mov	x2, 44
 	add	x1, x29, 104
 .LVL209:
 	bl	__arch_copy_to_user
 .LVL210:
-.LBE1128:
-.LBE1132:
-.LBE1182:
-	.loc 1 1559 0
+.LBE1144:
+.LBE1148:
+.LBE1198:
+	.loc 1 1625 0
 	cbnz	x0, .L139
-.LBB1183:
-.LBB983:
+.LBB1199:
+.LBB999:
 	mov	x22, 0
 	b	.L87
 .LVL211:
 	.p2align 3
 .L115:
-.LBE983:
-.LBE1183:
+.LBE999:
+.LBE1199:
+.LBB1200:
 .LBB1184:
-.LBB1168:
-.LBB1164:
-.LBB1153:
-.LBB1154:
-.LBB1155:
-.LBB1156:
-.LBB1157:
+.LBB1180:
+.LBB1169:
+.LBB1170:
+.LBB1171:
+.LBB1172:
+.LBB1173:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL212:
-.LBE1157:
-.LBE1156:
-.LBE1155:
-.LBB1158:
-.LBB1159:
+.LBE1173:
+.LBE1172:
+.LBE1171:
+.LBB1174:
+.LBB1175:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2393,13 +2393,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL213:
 #NO_APP
-.LBE1159:
-.LBE1158:
-.LBB1160:
+.LBE1175:
+.LBE1174:
+.LBB1176:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL214:
-.LBE1160:
+.LBE1176:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL215:
@@ -2415,38 +2415,38 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1154:
-.LBE1153:
+.LBE1170:
+.LBE1169:
 	.loc 9 134 0
 	mov	x2, 44
 	add	x1, x29, 104
 .LVL217:
 	bl	__arch_copy_to_user
 .LVL218:
-.LBE1164:
-.LBE1168:
+.LBE1180:
 .LBE1184:
-	.loc 1 1482 0
+.LBE1200:
+	.loc 1 1548 0
 	cbnz	w0, .L116
-.LBB1185:
-.LBB984:
+.LBB1201:
+.LBB1000:
 	mov	x22, 0
 	b	.L87
 .LVL219:
 	.p2align 3
 .L120:
-.LBE984:
-.LBE1185:
-	.loc 1 1490 0
+.LBE1000:
+.LBE1201:
+	.loc 1 1556 0
 	mov	x22, -14
 	b	.L87
 .LVL220:
 	.p2align 3
 .L227:
-	.loc 1 1505 0
+	.loc 1 1571 0
 	mov	w2, 1
 	str	w2, [x20, 80]
-	.loc 1 1506 0
+	.loc 1 1572 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -2456,25 +2456,25 @@ ebc_io_ctl:
 	b	.L122
 	.p2align 3
 .L228:
-	.loc 1 1508 0 discriminator 1
+	.loc 1 1574 0 discriminator 1
 	ldr	w0, [x20, 592]
 	cbz	w0, .L124
-.LBB1186:
-.LBB985:
+.LBB1202:
+.LBB1001:
 	mov	x22, 0
 	b	.L87
 .LVL222:
 .L112:
-.LBE985:
-.LBE1186:
-	.loc 1 1458 0
+.LBE1001:
+.LBE1202:
+	.loc 1 1524 0
 	mov	x22, -1
 	b	.L87
 .LVL223:
 .L161:
-.LBB1187:
-.LBB1084:
-.LBB1080:
+.LBB1203:
+.LBB1100:
+.LBB1096:
 	.loc 9 112 0
 	mov	x0, 4
 .LVL224:
@@ -2487,22 +2487,22 @@ ebc_io_ctl:
 .LVL226:
 	bl	memset
 .LVL227:
-.LBE1080:
-.LBE1084:
-.LBE1187:
-	.loc 1 1547 0
+.LBE1096:
+.LBE1100:
+.LBE1203:
+	.loc 1 1613 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC4
-	.loc 1 1548 0
+	.loc 1 1614 0
 	mov	x22, -14
-	.loc 1 1547 0
+	.loc 1 1613 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
 .LVL228:
-	.loc 1 1548 0
+	.loc 1 1614 0
 	b	.L87
 .L225:
-	.loc 1 1626 0
+	.loc 1 1692 0
 	bl	__stack_chk_fail
 .LVL229:
 .L233:
@@ -2511,47 +2511,47 @@ ebc_io_ctl:
 .LVL230:
 	b	.L134
 	.cfi_endproc
-.LFE2825:
+.LFE2830:
 	.size	ebc_io_ctl, .-ebc_io_ctl
 	.align	2
 	.p2align 3,,7
 	.type	frame_done_callback, %function
 frame_done_callback:
-.LFB2817:
-	.loc 1 861 0
+.LFB2822:
+	.loc 1 942 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 862 0
+	.loc 1 943 0
 	adrp	x0, .LANCHOR0
 	add	x1, x0, :lo12:.LANCHOR0
-	.loc 1 861 0
+	.loc 1 942 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 862 0
+	.loc 1 943 0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 861 0
+	.loc 1 942 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 865 0
+	.loc 1 946 0
 	add	x19, x20, 184
 	ldr	x0, [x19, 208]
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
 	bhi	.L237
-	.loc 1 868 0
+	.loc 1 949 0
 	ldr	w0, [x19, 36]
 	cbz	w0, .L239
-	.loc 1 869 0
+	.loc 1 950 0
 	ldr	x0, [x1, 8]
 	bl	wake_up_process
 .LVL231:
-	.loc 1 895 0
+	.loc 1 976 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -2566,40 +2566,40 @@ frame_done_callback:
 	.p2align 3
 .L237:
 	.cfi_restore_state
-	.loc 1 883 0
+	.loc 1 964 0
 	ldr	w0, [x19, 40]
 	cbnz	w0, .L243
-	.loc 1 889 0
+	.loc 1 970 0
 	ldr	x0, [x19, 88]
-	.loc 1 888 0
+	.loc 1 969 0
 	mov	w20, 1
-	.loc 1 887 0
+	.loc 1 968 0
 	str	wzr, [x19, 28]
-	.loc 1 889 0
+	.loc 1 970 0
 	adrp	x1, .LC9
-	.loc 1 888 0
+	.loc 1 969 0
 	str	w20, [x19, 76]
-	.loc 1 889 0
+	.loc 1 970 0
 	add	x1, x1, :lo12:.LC9
-	.loc 1 890 0
+	.loc 1 971 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
-	.loc 1 889 0
+	.loc 1 970 0
 	bl	_dev_info
 .LVL232:
-	.loc 1 890 0
+	.loc 1 971 0
 	mov	w2, w20
 	add	x0, x19, 352
 	mov	w1, w20
 	bl	__wake_up_sync
 .LVL233:
-	.loc 1 891 0
+	.loc 1 972 0
 	mov	w2, w20
 	mov	w1, w20
 	add	x0, x19, 304
 	bl	__wake_up_sync
 .LVL234:
-	.loc 1 895 0
+	.loc 1 976 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -2614,23 +2614,23 @@ frame_done_callback:
 	.p2align 3
 .L239:
 	.cfi_restore_state
-	.loc 1 872 0
+	.loc 1 953 0
 	ldr	x0, [x19, 88]
 	adrp	x1, .LC8
 	add	x1, x1, :lo12:.LC8
-	.loc 1 877 0
+	.loc 1 958 0
 	mov	w21, 1
-	.loc 1 872 0
+	.loc 1 953 0
 	bl	_dev_info
 .LVL235:
-	.loc 1 874 0
+	.loc 1 955 0
 	ldp	w3, w2, [x20, 108]
 	mov	w1, 0
 	ldr	x0, [x19, 152]
 	mul	w2, w3, w2
 	bl	memset
 .LVL236:
-	.loc 1 875 0
+	.loc 1 956 0
 	adrp	x2, jiffies
 	add	x0, x20, 672
 	mov	x1, 402653184
@@ -2638,11 +2638,11 @@ frame_done_callback:
 	add	x1, x2, x1
 	bl	mod_timer
 .LVL237:
-	.loc 1 877 0
+	.loc 1 958 0
 	str	w21, [x19, 76]
-	.loc 1 876 0
+	.loc 1 957 0
 	str	wzr, [x19, 28]
-	.loc 1 878 0
+	.loc 1 959 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
 	mov	w2, w21
@@ -2650,13 +2650,13 @@ frame_done_callback:
 	add	x0, x19, 352
 	bl	__wake_up_sync
 .LVL238:
-	.loc 1 879 0
+	.loc 1 960 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x19, 304
 	bl	__wake_up_sync
 .LVL239:
-	.loc 1 895 0
+	.loc 1 976 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -2671,15 +2671,15 @@ frame_done_callback:
 	.p2align 3
 .L243:
 	.cfi_restore_state
-	.loc 1 885 0
+	.loc 1 966 0
 	ldr	x0, [x1, 8]
-	.loc 1 884 0
+	.loc 1 965 0
 	mov	w1, 1
 	str	w1, [x19, 28]
-	.loc 1 885 0
+	.loc 1 966 0
 	bl	wake_up_process
 .LVL240:
-	.loc 1 895 0
+	.loc 1 976 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -2691,14 +2691,14 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2817:
+.LFE2822:
 	.size	frame_done_callback, .-frame_done_callback
 	.align	2
 	.p2align 3,,7
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
-.LFB2823:
-	.loc 1 1355 0
+.LFB2828:
+	.loc 1 1421 0
 	.cfi_startproc
 .LVL241:
 	stp	x29, x30, [sp, -16]!
@@ -2707,33 +2707,33 @@ ebc_frame_timeout:
 	.cfi_offset 30, -8
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1356 0
+	.loc 1 1422 0
 	bl	frame_done_callback
 .LVL242:
-	.loc 1 1358 0
+	.loc 1 1424 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2823:
+.LFE2828:
 	.size	ebc_frame_timeout, .-ebc_frame_timeout
 	.align	2
 	.p2align 3,,7
 	.type	ebc_lut_update, %function
 ebc_lut_update:
-.LFB2818:
-	.loc 1 898 0
+.LFB2823:
+	.loc 1 979 0
 	.cfi_startproc
 .LVL243:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 900 0
+	.loc 1 981 0
 	mov	w3, 25
-	.loc 1 898 0
+	.loc 1 979 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x21, x22, [sp, 32]
@@ -2743,74 +2743,75 @@ ebc_lut_update:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -48
 	.cfi_offset 20, -40
-	.loc 1 900 0
+	.loc 1 981 0
 	add	x1, x29, 64
-	.loc 1 898 0
+	.loc 1 979 0
 	adrp	x19, __stack_chk_guard
 	add	x0, x19, :lo12:__stack_chk_guard
 .LVL244:
-	.loc 1 904 0
+	.loc 1 985 0
 	ldr	x2, [x21, 16]
-	.loc 1 900 0
+	.loc 1 981 0
 	str	w3, [x1, -12]!
 .LVL245:
-	.loc 1 898 0
+	.loc 1 979 0
 	ldr	x3, [x0]
 	str	x3, [x29, 56]
 	mov	x3,0
-.LBB1188:
-.LBB1189:
+.LBB1204:
+.LBB1205:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
 .LVL246:
 	mov	w20, w0
-.LBE1189:
-.LBE1188:
-	.loc 1 905 0
+.LBE1205:
+.LBE1204:
+	.loc 1 986 0
 	cbnz	w0, .L247
 .LVL247:
-	.loc 1 906 0
+	.loc 1 987 0
 	ldr	w2, [x29, 52]
-	.loc 1 907 0
+	.loc 1 988 0
 	add	x22, x21, 184
-	.loc 1 906 0
-	tbnz	w2, #31, .L270
-	.loc 1 910 0
+	.loc 1 987 0
+	tbnz	w2, #31, .L271
+	.loc 1 991 0
 	cmp	w2, 50
-	bgt	.L271
+	bgt	.L272
 .L249:
-	.loc 1 918 0
+	.loc 1 999 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC12
 	add	x1, x1, :lo12:.LC12
 	bl	_dev_info
 .LVL248:
-	.loc 1 921 0
+	.loc 1 1002 0
 	ldr	x0, [x22, 208]
 	ldr	w0, [x0, 40]
-	cmp	w0, 18
-	bls	.L272
-	.loc 1 969 0
+	cmp	w0, 20
+	bls	.L273
+	.loc 1 1055 0
 	ldr	w2, [x29, 52]
-.L269:
+.L270:
 	mov	w1, 7
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL249:
-	cbnz	w0, .L261
-.L264:
-	.loc 1 974 0
-	cbnz	w20, .L262
+	cbnz	w0, .L262
+	.p2align 2
+.L265:
+	.loc 1 1060 0
+	cbnz	w20, .L263
 .L246:
-	.loc 1 980 0
+	.loc 1 1066 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	w0, w20
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L273
+	cbnz	x1, .L274
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 .LVL250:
@@ -2826,13 +2827,13 @@ ebc_lut_update:
 	ret
 .LVL251:
 	.p2align 3
-.L272:
+.L273:
 	.cfi_restore_state
-	.loc 1 921 0
+	.loc 1 1002 0
 	adrp	x1, .L252
-	.loc 1 923 0
+	.loc 1 1004 0
 	ldr	w2, [x29, 52]
-	.loc 1 921 0
+	.loc 1 1002 0
 	add	x1, x1, :lo12:.L252
 	ldrb	w0, [x1,w0,uxtw]
 	adr	x1, .Lrtx252
@@ -2845,12 +2846,12 @@ ebc_lut_update:
 .L252:
 	.byte	(.L251 - .Lrtx252) / 4
 	.byte	(.L251 - .Lrtx252) / 4
-	.byte	(.L269 - .Lrtx252) / 4
+	.byte	(.L270 - .Lrtx252) / 4
 	.byte	(.L254 - .Lrtx252) / 4
 	.byte	(.L255 - .Lrtx252) / 4
 	.byte	(.L256 - .Lrtx252) / 4
 	.byte	(.L257 - .Lrtx252) / 4
-	.byte	(.L269 - .Lrtx252) / 4
+	.byte	(.L270 - .Lrtx252) / 4
 	.byte	(.L254 - .Lrtx252) / 4
 	.byte	(.L255 - .Lrtx252) / 4
 	.byte	(.L256 - .Lrtx252) / 4
@@ -2858,171 +2859,182 @@ ebc_lut_update:
 	.byte	(.L258 - .Lrtx252) / 4
 	.byte	(.L259 - .Lrtx252) / 4
 	.byte	(.L260 - .Lrtx252) / 4
-	.byte	(.L269 - .Lrtx252) / 4
-	.byte	(.L269 - .Lrtx252) / 4
-	.byte	(.L269 - .Lrtx252) / 4
-	.byte	(.L269 - .Lrtx252) / 4
+	.byte	(.L259 - .Lrtx252) / 4
+	.byte	(.L261 - .Lrtx252) / 4
+	.byte	(.L270 - .Lrtx252) / 4
+	.byte	(.L270 - .Lrtx252) / 4
+	.byte	(.L270 - .Lrtx252) / 4
+	.byte	(.L270 - .Lrtx252) / 4
 	.text
-	.p2align 3
-.L260:
-	.loc 1 923 0
-	mov	w1, 1
-	add	x0, x21, 280
-	bl	epd_lut_get
 .LVL252:
-	cbz	w0, .L264
-	.p2align 2
-.L261:
-	.loc 1 912 0
-	mov	w20, -1
-.L262:
-	.loc 1 975 0
-	ldr	x0, [x22, 88]
-	adrp	x1, .LC13
-	add	x1, x1, :lo12:.LC13
-	bl	_dev_err
-.LVL253:
-	.loc 1 976 0
-	b	.L246
-.LVL254:
 	.p2align 3
 .L247:
-	.loc 1 916 0
+	.loc 1 997 0
 	add	x22, x21, 184
 	mov	w2, w0
 	adrp	x1, .LC11
 	add	x1, x1, :lo12:.LC11
 	ldr	x0, [x22, 88]
 	bl	_dev_err
-.LVL255:
+.LVL253:
 	ldr	w2, [x29, 52]
 	b	.L249
 	.p2align 3
-.L271:
-	.loc 1 911 0
+.L272:
+	.loc 1 992 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC10
 	add	x1, x1, :lo12:.LC10
 	bl	_dev_err
-.LVL256:
-	.loc 1 912 0
+.LVL254:
+	.loc 1 993 0
 	mov	w2, 50
 	str	w2, [x29, 52]
-.LVL257:
+.LVL255:
 	b	.L249
 	.p2align 3
+.L261:
+	.loc 1 1004 0
+	mov	w1, 1
+	add	x0, x21, 280
+	bl	epd_lut_get
+.LVL256:
+	cbz	w0, .L265
+	.p2align 2
+.L262:
+	.loc 1 993 0
+	mov	w20, -1
+.L263:
+	.loc 1 1061 0
+	ldr	x0, [x22, 88]
+	adrp	x1, .LC13
+	add	x1, x1, :lo12:.LC13
+	bl	_dev_err
+.LVL257:
+	.loc 1 1062 0
+	b	.L246
+	.p2align 3
 .L255:
-	.loc 1 955 0
+	.loc 1 1041 0
 	mov	w1, 9
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL258:
-	cbnz	w0, .L261
-	b	.L264
+	cbnz	w0, .L262
+	b	.L265
 	.p2align 3
 .L256:
-	.loc 1 960 0
+	.loc 1 1046 0
 	mov	w1, 10
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL259:
-	cbnz	w0, .L261
-	b	.L264
+	cbnz	w0, .L262
+	b	.L265
 	.p2align 3
-.L257:
-	.loc 1 965 0
-	mov	w1, 11
+.L251:
+	.loc 1 1018 0
+	mov	w1, 5
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL260:
-	cbnz	w0, .L261
-	b	.L264
+	cbnz	w0, .L262
+	b	.L265
 	.p2align 3
-.L258:
-	.loc 1 941 0
-	mov	w1, 6
+.L254:
+	.loc 1 1036 0
+	mov	w1, 8
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL261:
-	cbnz	w0, .L261
-	b	.L264
+	cbnz	w0, .L262
+	b	.L265
 	.p2align 3
-.L251:
-	.loc 1 937 0
-	mov	w1, 5
+.L257:
+	.loc 1 1051 0
+	mov	w1, 11
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL262:
-	cbnz	w0, .L261
-	b	.L264
+	cbnz	w0, .L262
+	b	.L265
 	.p2align 3
-.L254:
-	.loc 1 950 0
-	mov	w1, 8
+.L258:
+	.loc 1 1022 0
+	mov	w1, 6
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL263:
-	cbnz	w0, .L261
-	b	.L264
+	cbnz	w0, .L262
+	b	.L265
 	.p2align 3
 .L259:
-	.loc 1 945 0
+	.loc 1 1027 0
 	mov	w1, 4
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL264:
-	cbnz	w0, .L261
-	b	.L264
+	cbnz	w0, .L262
+	b	.L265
 	.p2align 3
-.L270:
-	.loc 1 907 0
+.L260:
+	.loc 1 1031 0
+	mov	w1, 3
+	add	x0, x21, 280
+	bl	epd_lut_get
+.LVL265:
+	cbnz	w0, .L262
+	b	.L265
+	.p2align 3
+.L271:
+	.loc 1 988 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC10
 	add	x1, x1, :lo12:.LC10
 	bl	_dev_err
-.LVL265:
-	.loc 1 908 0
+.LVL266:
+	.loc 1 989 0
 	str	wzr, [x29, 52]
 	mov	w2, 0
 	b	.L249
-.L273:
-	.loc 1 980 0
+.L274:
+	.loc 1 1066 0
 	bl	__stack_chk_fail
-.LVL266:
+.LVL267:
 	.cfi_endproc
-.LFE2818:
+.LFE2823:
 	.size	ebc_lut_update, .-ebc_lut_update
 	.align	2
 	.p2align 3,,7
 	.type	ebc_state_read, %function
 ebc_state_read:
-.LFB2834:
-	.loc 1 1750 0
+.LFB2839:
+	.loc 1 1816 0
 	.cfi_startproc
-.LVL267:
+.LVL268:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1751 0
+	.loc 1 1817 0
 	adrp	x3, .LANCHOR0
-	.loc 1 1750 0
+	.loc 1 1816 0
 	mov	x0, x2
-.LVL268:
-	.loc 1 1751 0
-	adrp	x1, .LC14
 .LVL269:
-	.loc 1 1750 0
+	.loc 1 1817 0
+	adrp	x1, .LC14
+.LVL270:
+	.loc 1 1816 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1751 0
+	.loc 1 1817 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL270:
+.LVL271:
 	add	x1, x1, :lo12:.LC14
 	ldr	w2, [x2, 608]
 	bl	sprintf
-.LVL271:
-	.loc 1 1752 0
+.LVL272:
+	.loc 1 1818 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3030,38 +3042,38 @@ ebc_state_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2834:
+.LFE2839:
 	.size	ebc_state_read, .-ebc_state_read
 	.align	2
 	.p2align 3,,7
 	.type	ebc_version_read, %function
 ebc_version_read:
-.LFB2833:
-	.loc 1 1741 0
+.LFB2838:
+	.loc 1 1807 0
 	.cfi_startproc
-.LVL272:
+.LVL273:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mov	x0, x2
-.LVL273:
-	.loc 1 1742 0
-	adrp	x1, .LC16
 .LVL274:
-	adrp	x2, .LC15
+	.loc 1 1808 0
+	adrp	x1, .LC16
 .LVL275:
-	.loc 1 1741 0
+	adrp	x2, .LC15
+.LVL276:
+	.loc 1 1807 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1742 0
+	.loc 1 1808 0
 	add	x2, x2, :lo12:.LC15
-	.loc 1 1741 0
-	.loc 1 1742 0
+	.loc 1 1807 0
+	.loc 1 1808 0
 	add	x1, x1, :lo12:.LC16
 	bl	sprintf
-.LVL276:
-	.loc 1 1743 0
+.LVL277:
+	.loc 1 1809 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3069,56 +3081,56 @@ ebc_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2833:
+.LFE2838:
 	.size	ebc_version_read, .-ebc_version_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
-.LFB2831:
-	.loc 1 1705 0
+.LFB2836:
+	.loc 1 1771 0
 	.cfi_startproc
-.LVL277:
+.LVL278:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 1706 0
+	.loc 1 1772 0
 	adrp	x0, .LANCHOR0
-.LVL278:
-	.loc 1 1705 0
+.LVL279:
+	.loc 1 1771 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1709 0
+	.loc 1 1775 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1705 0
+	.loc 1 1771 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1705 0
+	.loc 1 1771 0
 	mov	x19, x2
-	.loc 1 1709 0
+	.loc 1 1775 0
 	ldr	x1, [x0, 16]
-.LVL279:
-.LBB1190:
-.LBB1191:
+.LVL280:
+.LBB1206:
+.LBB1207:
 	.loc 3 55 0
 	mov	x0, x1
 	ldr	x1, [x1, 64]
 	blr	x1
-.LVL280:
-.LBE1191:
-.LBE1190:
-	.loc 1 1711 0
+.LVL281:
+.LBE1207:
+.LBE1206:
+	.loc 1 1777 0
 	mov	w2, w0
 	adrp	x1, .LC14
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC14
 	bl	sprintf
-.LVL281:
-	.loc 1 1712 0
+.LVL282:
+	.loc 1 1778 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL282:
+.LVL283:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3126,72 +3138,72 @@ pmic_vcom_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2831:
+.LFE2836:
 	.size	pmic_vcom_read, .-pmic_vcom_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_temp_read, %function
 pmic_temp_read:
-.LFB2830:
-	.loc 1 1691 0
+.LFB2835:
+	.loc 1 1757 0
 	.cfi_startproc
-.LVL283:
+.LVL284:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 1692 0
+	.loc 1 1758 0
 	adrp	x0, .LANCHOR0
-.LVL284:
-	.loc 1 1691 0
+.LVL285:
+	.loc 1 1757 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1695 0
+	.loc 1 1761 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-.LBB1192:
-.LBB1193:
+.LBB1208:
+.LBB1209:
 	.loc 3 50 0
 	add	x1, x29, 36
-.LVL285:
-.LBE1193:
-.LBE1192:
-	.loc 1 1691 0
+.LVL286:
+.LBE1209:
+.LBE1208:
+	.loc 1 1757 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 1691 0
+	.loc 1 1757 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
-.LVL286:
-	.loc 1 1695 0
+.LVL287:
+	.loc 1 1761 0
 	ldr	x2, [x0, 16]
-.LBB1195:
-.LBB1194:
+.LBB1211:
+.LBB1210:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL287:
-.LBE1194:
-.LBE1195:
-	.loc 1 1697 0
+.LVL288:
+.LBE1210:
+.LBE1211:
+	.loc 1 1763 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC14
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC14
 	bl	sprintf
-.LVL288:
-	.loc 1 1698 0
+.LVL289:
+	.loc 1 1764 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L283
+	cbnz	x1, .L284
 	ldp	x19, x20, [sp, 16]
-.LVL289:
+.LVL290:
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -3201,46 +3213,46 @@ pmic_temp_read:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL290:
-.L283:
+.LVL291:
+.L284:
 	.cfi_restore_state
 	bl	__stack_chk_fail
-.LVL291:
+.LVL292:
 	.cfi_endproc
-.LFE2830:
+.LFE2835:
 	.size	pmic_temp_read, .-pmic_temp_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_name_read, %function
 pmic_name_read:
-.LFB2829:
-	.loc 1 1680 0
+.LFB2834:
+	.loc 1 1746 0
 	.cfi_startproc
-.LVL292:
+.LVL293:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1681 0
+	.loc 1 1747 0
 	adrp	x3, .LANCHOR0
-	.loc 1 1680 0
+	.loc 1 1746 0
 	mov	x0, x2
-.LVL293:
-	.loc 1 1683 0
-	adrp	x1, .LC16
 .LVL294:
-	.loc 1 1680 0
+	.loc 1 1749 0
+	adrp	x1, .LC16
+.LVL295:
+	.loc 1 1746 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1683 0
+	.loc 1 1749 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL295:
+.LVL296:
 	add	x1, x1, :lo12:.LC16
 	ldr	x2, [x2, 16]
 	add	x2, x2, 8
 	bl	sprintf
-.LVL296:
-	.loc 1 1684 0
+.LVL297:
+	.loc 1 1750 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3248,24 +3260,24 @@ pmic_name_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2829:
+.LFE2834:
 	.size	pmic_name_read, .-pmic_name_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
-.LFB2832:
-	.loc 1 1717 0
+.LFB2837:
+	.loc 1 1783 0
 	.cfi_startproc
-.LVL297:
+.LVL298:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 1718 0
+	.loc 1 1784 0
 	adrp	x0, .LANCHOR0
-.LVL298:
-	.loc 1 1717 0
+.LVL299:
+	.loc 1 1783 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -3275,47 +3287,47 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 1717 0
+	.loc 1 1783 0
 	add	x1, x19, :lo12:__stack_chk_guard
-.LVL299:
+.LVL300:
 	mov	x21, x2
-	.loc 1 1718 0
+	.loc 1 1784 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
-.LVL300:
-	.loc 1 1717 0
+.LVL301:
+	.loc 1 1783 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
-.LVL301:
+.LVL302:
 	mov	x20, x3
-	.loc 1 1721 0
+	.loc 1 1787 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
-.LVL302:
-	.loc 1 1722 0
-	cbnz	w0, .L293
 .LVL303:
-	.loc 1 1726 0
+	.loc 1 1788 0
+	cbnz	w0, .L294
+.LVL304:
+	.loc 1 1792 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
-.LVL304:
-	.loc 1 1727 0
-	cbnz	w0, .L294
-.L286:
-	.loc 1 1733 0
+.LVL305:
+	.loc 1 1793 0
+	cbnz	w0, .L295
+.L287:
+	.loc 1 1799 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
-.LVL305:
+.LVL306:
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L295
+	cbnz	x1, .L296
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL306:
+.LVL307:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -3326,53 +3338,53 @@ pmic_vcom_write:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL307:
+.LVL308:
 	.p2align 3
-.L293:
+.L294:
 	.cfi_restore_state
-	.loc 1 1723 0
+	.loc 1 1789 0
 	ldr	x0, [x22]
 	adrp	x1, .LC17
 	mov	x2, x21
 	add	x1, x1, :lo12:.LC17
-	.loc 1 1724 0
+	.loc 1 1790 0
 	mov	x20, -1
-.LVL308:
-	.loc 1 1723 0
-	bl	_dev_err
 .LVL309:
-	.loc 1 1724 0
-	b	.L286
+	.loc 1 1789 0
+	bl	_dev_err
 .LVL310:
+	.loc 1 1790 0
+	b	.L287
+.LVL311:
 	.p2align 3
-.L294:
-	.loc 1 1728 0
+.L295:
+	.loc 1 1794 0
 	ldr	x0, [x22]
 	adrp	x1, .LC18
-	.loc 1 1729 0
+	.loc 1 1795 0
 	mov	x20, -1
-.LVL311:
-	.loc 1 1728 0
+.LVL312:
+	.loc 1 1794 0
 	add	x1, x1, :lo12:.LC18
 	bl	_dev_err
-.LVL312:
-	.loc 1 1729 0
-	b	.L286
-.L295:
-	.loc 1 1733 0
-	bl	__stack_chk_fail
 .LVL313:
+	.loc 1 1795 0
+	b	.L287
+.L296:
+	.loc 1 1799 0
+	bl	__stack_chk_fail
+.LVL314:
 	.cfi_endproc
-.LFE2832:
+.LFE2837:
 	.size	pmic_vcom_write, .-pmic_vcom_write
 	.align	2
 	.p2align 3,,7
 	.type	waveform_version_read, %function
 waveform_version_read:
-.LFB2828:
-	.loc 1 1669 0
+.LFB2833:
+	.loc 1 1735 0
 	.cfi_startproc
-.LVL314:
+.LVL315:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -3381,22 +3393,22 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1669 0
+	.loc 1 1735 0
 	mov	x19, x2
-	.loc 1 1670 0
+	.loc 1 1736 0
 	bl	epd_lut_get_wf_version
-.LVL315:
-	.loc 1 1672 0
+.LVL316:
+	.loc 1 1738 0
 	mov	x2, x0
 	adrp	x1, .LC16
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC16
 	bl	sprintf
-.LVL316:
-	.loc 1 1673 0
+.LVL317:
+	.loc 1 1739 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL317:
+.LVL318:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3404,839 +3416,1274 @@ waveform_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2828:
+.LFE2833:
 	.size	waveform_version_read, .-waveform_version_read
 	.section	.init.text,"ax",@progbits
 	.align	2
 	.type	ebc_init, %function
 ebc_init:
-.LFB2845:
-	.loc 1 2185 0
+.LFB2850:
+	.loc 1 2252 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2186 0
+	.loc 1 2253 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2185 0
+	.loc 1 2252 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2186 0
+	.loc 1 2253 0
 	bl	__platform_driver_register
-.LVL318:
-	.loc 1 2187 0
+.LVL319:
+	.loc 1 2254 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2845:
+.LFE2850:
 	.size	ebc_init, .-ebc_init
 	.text
 	.align	2
 	.p2align 3,,7
-	.type	direct_mode_data_change.isra.1, %function
-direct_mode_data_change.isra.1:
-.LFB2848:
-	.loc 1 616 0
+	.type	direct_mode_data_change, %function
+direct_mode_data_change:
+.LFB2814:
+	.loc 1 695 0
 	.cfi_startproc
-.LVL319:
-	.loc 1 620 0
-	adrp	x6, .LANCHOR0
-	.loc 1 616 0
-	and	w3, w3, 255
-	.loc 1 626 0
-	sub	w3, w3, w4
 .LVL320:
-	.loc 1 620 0
-	ldr	x13, [x6, #:lo12:.LANCHOR0]
-	.loc 1 627 0
-	lsl	w3, w3, 16
+	.loc 1 696 0
+	ldr	w13, [x3, 72]
 .LVL321:
-	add	x5, x5, x3, sxtw
+	cbnz	w13, .L335
+.LBB1230:
+.LBB1231:
+	.loc 1 660 0
+	adrp	x5, .LANCHOR0
+	.loc 1 666 0
+	ldrb	w7, [x3, 32]
+	ldr	w4, [x3, 40]
+	.loc 1 660 0
+	ldr	x15, [x5, #:lo12:.LANCHOR0]
+	.loc 1 667 0
+	ldr	x3, [x3, 112]
 .LVL322:
+	.loc 1 666 0
+	sub	w7, w7, w4
+.LVL323:
+	.loc 1 668 0
+	add	x15, x15, 24
+	.loc 1 667 0
+	lsl	w7, w7, 16
+.LVL324:
+	add	x7, x3, x7, sxtw
+.LVL325:
+	.loc 1 671 0
+	ldr	w16, [x15, 88]
+	.loc 1 670 0
+	ldr	w3, [x15, 84]
+	.loc 1 668 0
+	ldr	w17, [x15, 156]
+.LVL326:
+	.loc 1 676 0
+	cmp	w16, 0
+	.loc 1 670 0
+	lsr	w12, w3, 3
+.LVL327:
+	.loc 1 676 0
+	ble	.L323
+	sub	w14, w12, #1
+	add	x14, x14, 1
+	lsl	x14, x14, 2
+	.loc 1 677 0
+	cbz	w17, .L309
+.LVL328:
+	.p2align 2
+.L336:
+	.loc 1 678 0
+	ldr	w10, [x15, 88]
+.LVL329:
+	sub	w10, w10, #1
+	sub	w10, w10, w13
+	mul	w10, w10, w3
+	lsr	w10, w10, 2
+	add	x10, x0, x10
+.LVL330:
+.L310:
+	.loc 1 682 0
+	cbz	w12, .L311
+	mov	x5, 0
+	.p2align 2
+.L312:
+	.loc 1 684 0
+	ldr	w3, [x2, x5, lsl 2]
+	.loc 1 683 0
+	ldr	w4, [x1, x5, lsl 2]
+	add	x5, x5, 1
+.LVL331:
+.LBB1232:
+.LBB1233:
+	.loc 1 131 0
+	and	w9, w3, 65280
+.LBE1233:
+.LBE1232:
+	.loc 1 682 0
+	cmp	w12, w5
+.LVL332:
+	.loc 1 686 0
+	and	w6, w4, 65535
+.LBB1238:
+.LBB1234:
+	.loc 1 130 0
+	ubfiz	w8, w3, 8, 8
+	.loc 1 131 0
+	add	w9, w9, w6, lsr 8
+	.loc 1 130 0
+	add	w6, w8, w6, uxtb
+.LBE1234:
+.LBE1238:
+	.loc 1 687 0
+	lsr	w3, w3, 16
+.LVL333:
+	lsr	w4, w4, 16
+.LBB1239:
+.LBB1240:
+	.loc 1 130 0
+	ubfiz	w8, w3, 8, 8
+	.loc 1 131 0
+	and	w3, w3, 65280
+.LBE1240:
+.LBE1239:
+.LBB1244:
+.LBB1235:
+	.loc 1 130 0
+	ldrb	w11, [x7, w6, sxtw]
+.LBE1235:
+.LBE1244:
+.LBB1245:
+.LBB1241:
+	.loc 1 131 0
+	add	w3, w3, w4, lsr 8
+.LBE1241:
+.LBE1245:
+.LBB1246:
+.LBB1236:
+	ldrb	w9, [x7, w9, sxtw]
+.LBE1236:
+.LBE1246:
+.LBB1247:
+.LBB1242:
+	.loc 1 130 0
+	add	w6, w8, w4, uxtb
+.LBE1242:
+.LBE1247:
+.LBB1248:
+.LBB1237:
+	orr	w4, w11, w9, lsl 4
+.LBE1237:
+.LBE1248:
+	.loc 1 686 0
+	strb	w4, [x10], 2
+.LBB1249:
+.LBB1243:
+	.loc 1 131 0
+	ldrb	w3, [x7, w3, sxtw]
+	.loc 1 130 0
+	ldrb	w4, [x7, w6, sxtw]
+	orr	w3, w4, w3, lsl 4
+.LBE1243:
+.LBE1249:
+	.loc 1 687 0
+	strb	w3, [x10, -1]
+	.loc 1 682 0
+	bgt	.L312
+	add	x1, x1, x14
+	add	x2, x2, x14
+.L311:
+	.loc 1 676 0
+	add	w13, w13, 1
+	cmp	w16, w13
+	beq	.L323
+	ldr	w3, [x15, 84]
+	.loc 1 677 0
+	cbnz	w17, .L336
+.L309:
+	.loc 1 680 0
+	mul	w10, w13, w3
+.LVL334:
+	lsr	w10, w10, 2
+	add	x10, x0, x10
+.LVL335:
+	b	.L310
+.LVL336:
+.L335:
+.LBE1231:
+.LBE1230:
+.LBB1250:
+.LBB1251:
+.LBB1252:
+	.loc 1 621 0
+	adrp	x7, .LANCHOR0
+	.loc 1 627 0
+	ldrb	w4, [x3, 32]
+	ldr	w6, [x3, 40]
+	.loc 1 621 0
+	ldr	x13, [x7, #:lo12:.LANCHOR0]
+.LVL337:
 	.loc 1 628 0
+	ldr	x5, [x3, 112]
+	.loc 1 627 0
+	sub	w3, w4, w6
+.LVL338:
+	.loc 1 629 0
 	add	x13, x13, 24
-	ldr	w16, [x13, 156]
+	.loc 1 628 0
+	lsl	w3, w3, 16
+.LVL339:
+	add	x3, x5, x3, sxtw
+.LVL340:
+	.loc 1 632 0
+	ldr	w15, [x13, 88]
 	.loc 1 631 0
-	ldp	w3, w15, [x13, 84]
-.LVL323:
-	.loc 1 636 0
+	ldr	w5, [x13, 84]
+	.loc 1 629 0
+	ldr	w16, [x13, 156]
+.LVL341:
+	.loc 1 637 0
 	cmp	w15, 0
-	ble	.L312
-	lsr	w14, w3, 4
-	mov	w12, 0
-.LVL324:
+	.loc 1 631 0
+	lsr	w14, w5, 4
+	.loc 1 637 0
+	ble	.L323
 	sub	w11, w14, #1
+	mov	x10, x2
+.LVL342:
 	add	x11, x11, 1
+	mov	x9, x1
+.LVL343:
 	lsl	x11, x11, 3
-	.loc 1 637 0
-	cbz	w16, .L315
-.LVL325:
-.L326:
+	mov	w12, 0
+.LVL344:
 	.loc 1 638 0
-	ldr	w6, [x13, 88]
-.LVL326:
-	sub	w6, w6, #1
-	sub	w6, w6, w12
-	mul	w6, w6, w3
-	lsr	w6, w6, 2
-	add	x6, x0, x6
-.LVL327:
-.L316:
-	.loc 1 642 0
-	cbz	w14, .L324
-	.loc 1 616 0
+	cbz	w16, .L326
+.LVL345:
+.L339:
+	.loc 1 639 0
+	ldr	w4, [x13, 88]
+.LVL346:
+	sub	w4, w4, #1
+	sub	w4, w4, w12
+	mul	w4, w4, w5
+	lsr	w4, w4, 2
+	add	x4, x0, x4
+.LVL347:
+.L327:
+	.loc 1 643 0
+	cbz	w14, .L337
+.LBE1252:
+.LBE1251:
+.LBE1250:
+	.loc 1 695 0
 	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
-.LVL328:
 	.p2align 2
-.L317:
-	.loc 1 642 0
-	mov	x7, 0
+.L328:
+.LBB1297:
+.LBB1295:
+.LBB1293:
+	.loc 1 643 0
+	mov	x5, 0
 	.p2align 2
-.L306:
+.L308:
+	.loc 1 645 0
+	ldr	x2, [x10, x5]
+.LVL348:
+	add	x4, x4, 4
 	.loc 1 644 0
-	ldr	x4, [x2, x7]
-.LVL329:
-	add	x6, x6, 4
+	ldr	x1, [x9, x5]
+.LVL349:
+	add	x5, x5, 8
+	.loc 1 647 0
+	and	w7, w2, 65535
 	.loc 1 643 0
-	ldr	x3, [x1, x7]
-.LVL330:
-	add	x7, x7, 8
-	.loc 1 646 0
-	and	w9, w4, 65535
-	.loc 1 642 0
-	cmp	x11, x7
-	.loc 1 646 0
-	and	w8, w3, 65535
-.LBB1196:
-.LBB1197:
+	cmp	x11, x5
+	.loc 1 647 0
+	and	w6, w1, 65535
+.LBB1253:
+.LBB1254:
 	.loc 1 130 0
-	ubfiz	w30, w9, 8, 8
+	ubfiz	w30, w7, 8, 8
 	.loc 1 131 0
-	and	w9, w9, 65280
+	and	w7, w7, 65280
 	.loc 1 130 0
-	add	w30, w30, w8, uxtb
+	add	w30, w30, w6, uxtb
 	.loc 1 131 0
-	add	w9, w9, w8, lsr 8
-.LBE1197:
-.LBE1196:
-	.loc 1 647 0
-	lsr	w10, w4, 16
-	lsr	w8, w3, 16
-.LBB1201:
-.LBB1202:
+	add	w7, w7, w6, lsr 8
+.LBE1254:
+.LBE1253:
+	.loc 1 648 0
+	lsr	w8, w2, 16
+	lsr	w6, w1, 16
+.LBB1258:
+.LBB1259:
 	.loc 1 130 0
-	ubfiz	w18, w10, 8, 8
-.LBE1202:
-.LBE1201:
-.LBB1208:
-.LBB1198:
-	ldrb	w30, [x5, w30, sxtw]
-.LBE1198:
-.LBE1208:
-.LBB1209:
-.LBB1203:
+	ubfiz	w18, w8, 8, 8
+.LBE1259:
+.LBE1258:
+.LBB1265:
+.LBB1255:
+	ldrb	w30, [x3, w30, sxtw]
+.LBE1255:
+.LBE1265:
+.LBB1266:
+.LBB1260:
 	.loc 1 131 0
-	and	w10, w10, 65280
-.LBE1203:
-.LBE1209:
-.LBB1210:
-.LBB1199:
-	ldrb	w17, [x5, w9, sxtw]
-.LBE1199:
-.LBE1210:
-.LBB1211:
-.LBB1204:
+	and	w8, w8, 65280
+.LBE1260:
+.LBE1266:
+.LBB1267:
+.LBB1256:
+	ldrb	w17, [x3, w7, sxtw]
+.LBE1256:
+.LBE1267:
+.LBB1268:
+.LBB1261:
 	.loc 1 130 0
-	add	w18, w18, w8, uxtb
+	add	w18, w18, w6, uxtb
 	.loc 1 131 0
-	add	w10, w10, w8, lsr 8
-.LBE1204:
-.LBE1211:
-	.loc 1 648 0
-	ubfx	x9, x4, 32, 16
-	ubfx	x8, x3, 32, 16
+	add	w8, w8, w6, lsr 8
+.LBE1261:
+.LBE1268:
 	.loc 1 649 0
-	lsr	x4, x4, 48
-.LVL331:
-.LBB1212:
-.LBB1200:
+	ubfx	x7, x2, 32, 16
+	ubfx	x6, x1, 32, 16
+	.loc 1 650 0
+	lsr	x2, x2, 48
+.LVL350:
+.LBB1269:
+.LBB1257:
 	.loc 1 130 0
 	orr	w17, w30, w17, lsl 4
-.LBE1200:
-.LBE1212:
-	.loc 1 646 0
-	strb	w17, [x6, -4]
-.LBB1213:
-.LBB1214:
+.LBE1257:
+.LBE1269:
+	.loc 1 647 0
+	strb	w17, [x4, -4]
+.LBB1270:
+.LBB1271:
 	.loc 1 130 0
-	ubfiz	w17, w9, 8, 8
+	ubfiz	w17, w7, 8, 8
 	.loc 1 131 0
-	and	w9, w9, 65280
-.LBE1214:
-.LBE1213:
-.LBB1220:
-.LBB1205:
-	ldrb	w10, [x5, w10, sxtw]
-.LBE1205:
-.LBE1220:
-.LBB1221:
-.LBB1215:
+	and	w7, w7, 65280
+.LBE1271:
+.LBE1270:
+.LBB1277:
+.LBB1262:
+	ldrb	w8, [x3, w8, sxtw]
+.LBE1262:
+.LBE1277:
+.LBB1278:
+.LBB1272:
 	.loc 1 130 0
-	add	w17, w17, w8, uxtb
-.LBE1215:
-.LBE1221:
-.LBB1222:
-.LBB1206:
-	ldrb	w18, [x5, w18, sxtw]
-.LBE1206:
-.LBE1222:
-.LBB1223:
-.LBB1216:
+	add	w17, w17, w6, uxtb
+.LBE1272:
+.LBE1278:
+.LBB1279:
+.LBB1263:
+	ldrb	w18, [x3, w18, sxtw]
+.LBE1263:
+.LBE1279:
+.LBB1280:
+.LBB1273:
 	.loc 1 131 0
-	add	w8, w9, w8, lsr 8
-.LBE1216:
-.LBE1223:
-	.loc 1 649 0
-	lsr	x3, x3, 48
-.LVL332:
-.LBB1224:
-.LBB1207:
+	add	w6, w7, w6, lsr 8
+.LBE1273:
+.LBE1280:
+	.loc 1 650 0
+	lsr	x1, x1, 48
+.LVL351:
+.LBB1281:
+.LBB1264:
 	.loc 1 130 0
-	orr	w9, w18, w10, lsl 4
-.LBE1207:
-.LBE1224:
-	.loc 1 647 0
-	strb	w9, [x6, -3]
-.LBB1225:
-.LBB1226:
+	orr	w7, w18, w8, lsl 4
+.LBE1264:
+.LBE1281:
+	.loc 1 648 0
+	strb	w7, [x4, -3]
+.LBB1282:
+.LBB1283:
 	.loc 1 130 0
-	ubfiz	w9, w4, 8, 8
+	ubfiz	w7, w2, 8, 8
 	.loc 1 131 0
-	and	w4, w4, 65280
-.LBE1226:
-.LBE1225:
-.LBB1230:
-.LBB1217:
-	ldrb	w10, [x5, w8, sxtw]
-.LBE1217:
-.LBE1230:
-.LBB1231:
-.LBB1227:
+	and	w2, w2, 65280
+.LBE1283:
+.LBE1282:
+.LBB1287:
+.LBB1274:
+	ldrb	w8, [x3, w6, sxtw]
+.LBE1274:
+.LBE1287:
+.LBB1288:
+.LBB1284:
 	.loc 1 130 0
-	add	w8, w9, w3, uxtb
-.LBE1227:
-.LBE1231:
-.LBB1232:
-.LBB1218:
-	ldrb	w17, [x5, w17, sxtw]
-.LBE1218:
-.LBE1232:
-.LBB1233:
-.LBB1228:
+	add	w6, w7, w1, uxtb
+.LBE1284:
+.LBE1288:
+.LBB1289:
+.LBB1275:
+	ldrb	w17, [x3, w17, sxtw]
+.LBE1275:
+.LBE1289:
+.LBB1290:
+.LBB1285:
 	.loc 1 131 0
-	add	w3, w4, w3, lsr 8
-.LBE1228:
-.LBE1233:
-.LBB1234:
-.LBB1219:
+	add	w1, w2, w1, lsr 8
+.LBE1285:
+.LBE1290:
+.LBB1291:
+.LBB1276:
 	.loc 1 130 0
-	orr	w4, w17, w10, lsl 4
-.LBE1219:
-.LBE1234:
-	.loc 1 648 0
-	strb	w4, [x6, -2]
-.LBB1235:
-.LBB1229:
+	orr	w2, w17, w8, lsl 4
+.LBE1276:
+.LBE1291:
+	.loc 1 649 0
+	strb	w2, [x4, -2]
+.LBB1292:
+.LBB1286:
 	.loc 1 131 0
-	ldrb	w3, [x5, w3, sxtw]
+	ldrb	w1, [x3, w1, sxtw]
 	.loc 1 130 0
-	ldrb	w4, [x5, w8, sxtw]
-	orr	w3, w4, w3, lsl 4
-.LBE1229:
-.LBE1235:
-	.loc 1 649 0
-	strb	w3, [x6, -1]
-	.loc 1 642 0
-	bne	.L306
-	.loc 1 636 0
+	ldrb	w2, [x3, w6, sxtw]
+	orr	w1, w2, w1, lsl 4
+.LBE1286:
+.LBE1292:
+	.loc 1 650 0
+	strb	w1, [x4, -1]
+	.loc 1 643 0
+	bne	.L308
+	.loc 1 637 0
 	add	w12, w12, 1
-	add	x1, x1, x11
-.LVL333:
-	add	x2, x2, x11
-.LVL334:
+	add	x9, x9, x11
+	add	x10, x10, x11
 	cmp	w15, w12
-	beq	.L300
-.L325:
-	ldr	w3, [x13, 84]
-	.loc 1 637 0
-	cbz	w16, .L303
+	beq	.L301
+.L338:
+	ldr	w5, [x13, 84]
 	.loc 1 638 0
-	ldr	w6, [x13, 88]
-.LVL335:
-	sub	w6, w6, #1
-	sub	w6, w6, w12
-	mul	w6, w6, w3
-	lsr	w6, w6, 2
-	add	x6, x0, x6
-.LVL336:
-	.loc 1 642 0
-	cbnz	w14, .L317
-.L323:
-	.loc 1 636 0
+	cbz	w16, .L305
+	.loc 1 639 0
+	ldr	w4, [x13, 88]
+.LVL352:
+	sub	w4, w4, #1
+	sub	w4, w4, w12
+	mul	w4, w4, w5
+	lsr	w4, w4, 2
+	add	x4, x0, x4
+.LVL353:
+	.loc 1 643 0
+	cbnz	w14, .L328
+.L334:
+	.loc 1 637 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	bne	.L325
-.L300:
-	.loc 1 652 0
+	bne	.L338
+.L301:
+.LBE1293:
+.LBE1295:
+.LBE1297:
+	.loc 1 700 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
-.LVL337:
-.L315:
-	.loc 1 640 0
-	mul	w6, w12, w3
-.LVL338:
-	lsr	w6, w6, 2
-	add	x6, x0, x6
-.LVL339:
-	b	.L316
-.LVL340:
+.LVL354:
+.L326:
+.LBB1298:
+.LBB1296:
+.LBB1294:
+	.loc 1 641 0
+	mul	w4, w12, w5
+.LVL355:
+	lsr	w4, w4, 2
+	add	x4, x0, x4
+.LVL356:
+	b	.L327
+.LVL357:
 	.p2align 3
-.L303:
+.L305:
 	.cfi_def_cfa 29, 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	mul	w6, w12, w3
-.LVL341:
-	lsr	w6, w6, 2
-	add	x6, x0, x6
-.LVL342:
-	.loc 1 642 0
-	cbnz	w14, .L317
-	b	.L323
-.LVL343:
-.L324:
+	mul	w4, w12, w5
+.LVL358:
+	lsr	w4, w4, 2
+	add	x4, x0, x4
+.LVL359:
+	.loc 1 643 0
+	cbnz	w14, .L328
+	b	.L334
+.LVL360:
+.L337:
 	.cfi_def_cfa 31, 0
 	.cfi_restore 29
 	.cfi_restore 30
-	.loc 1 636 0
+	.loc 1 637 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L312
-	ldr	w3, [x13, 84]
-	.loc 1 637 0
-	cbz	w16, .L315
-	b	.L326
-.L312:
+	beq	.L323
+	ldr	w5, [x13, 84]
+	.loc 1 638 0
+	cbz	w16, .L326
+	b	.L339
+.LVL361:
+	.p2align 3
+.L323:
 	ret
+.LBE1294:
+.LBE1296:
+.LBE1298:
 	.cfi_endproc
-.LFE2848:
-	.size	direct_mode_data_change.isra.1, .-direct_mode_data_change.isra.1
+.LFE2814:
+	.size	direct_mode_data_change, .-direct_mode_data_change
 	.align	2
 	.p2align 3,,7
-	.type	direct_mode_data_change_part.isra.2, %function
-direct_mode_data_change_part.isra.2:
-.LFB2849:
-	.loc 1 654 0
+	.type	direct_mode_data_change_part, %function
+direct_mode_data_change_part:
+.LFB2817:
+	.loc 1 789 0
 	.cfi_startproc
-.LVL344:
-	.loc 1 658 0
-	adrp	x6, .LANCHOR0
-	.loc 1 654 0
-	and	w3, w3, 255
-	.loc 1 663 0
-	sub	w3, w3, w4
-.LVL345:
-	.loc 1 658 0
-	ldr	x14, [x6, #:lo12:.LANCHOR0]
-	.loc 1 664 0
-	lsl	w3, w3, 16
-.LVL346:
-	add	x5, x5, x3, sxtw
-.LVL347:
-	.loc 1 665 0
+.LVL362:
+	stp	x29, x30, [sp, -80]!
+	.cfi_def_cfa_offset 80
+	.cfi_offset 29, -80
+	.cfi_offset 30, -72
+.LBB1317:
+.LBB1318:
+.LBB1319:
+	.loc 1 748 0
+	adrp	x5, .LANCHOR0
+.LBE1319:
+.LBE1318:
+.LBE1317:
+	.loc 1 789 0
+	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 790 0
+	ldr	w16, [x3, 72]
+.LVL363:
+	cbnz	w16, .L444
+.LBB1332:
+.LBB1333:
+	.loc 1 707 0
+	ldr	x18, [x5, #:lo12:.LANCHOR0]
+	.loc 1 712 0
+	ldrb	w14, [x3, 32]
+	ldr	w4, [x3, 40]
+	.loc 1 714 0
+	add	x18, x18, 24
+	.loc 1 713 0
+	ldr	x3, [x3, 112]
+.LVL364:
+	.loc 1 712 0
+	sub	w14, w14, w4
+.LVL365:
+	.loc 1 717 0
+	ldr	w30, [x18, 88]
+	.loc 1 713 0
+	lsl	w14, w14, 16
+.LVL366:
+	.loc 1 714 0
+	ldr	w19, [x18, 156]
+	.loc 1 713 0
+	add	x14, x3, x14, sxtw
+.LVL367:
+	.loc 1 716 0
+	ldr	w3, [x18, 84]
+.LVL368:
+	.loc 1 722 0
+	cmp	w30, 0
+	.loc 1 716 0
+	lsr	w9, w3, 3
+.LVL369:
+	.loc 1 722 0
+	ble	.L340
+	sub	w17, w9, #1
+.LBB1334:
+.LBB1335:
+	.loc 1 136 0
+	mov	w15, 3
+	add	x17, x17, 1
+	lsl	x17, x17, 2
+.LBE1335:
+.LBE1334:
+	.loc 1 723 0
+	cbz	w19, .L370
+.LVL370:
+	.p2align 2
+.L445:
+	.loc 1 724 0
+	ldr	w13, [x18, 88]
+.LVL371:
+	sub	w13, w13, #1
+	sub	w13, w13, w16
+	mul	w13, w13, w3
+	lsr	w13, w13, 2
+	add	x13, x0, x13
+.LVL372:
+.L371:
+	.loc 1 728 0
+	cbz	w9, .L372
+	add	x13, x13, 2
+.LVL373:
+	mov	x10, 0
+	.p2align 2
+.L385:
+	.loc 1 730 0
+	ldr	w6, [x2, x10, lsl 2]
+.LBB1341:
+.LBB1342:
+	.loc 1 140 0
+	mov	w4, 0
+.LBE1342:
+.LBE1341:
+	.loc 1 729 0
+	ldr	w7, [x1, x10, lsl 2]
+.LBB1347:
+.LBB1336:
+	.loc 1 140 0
+	mov	w5, 0
+.LBE1336:
+.LBE1347:
+	.loc 1 732 0
+	and	w20, w6, 65535
+	and	w12, w7, 65535
+.LBB1348:
+.LBB1343:
+	.loc 1 151 0
+	and	w3, w20, 65280
+	add	w8, w3, w12, lsr 8
+.LBE1343:
+.LBE1348:
+	.loc 1 733 0
+	lsr	w3, w6, 16
+.LBB1349:
+.LBB1337:
+	.loc 1 150 0
+	ubfiz	w23, w3, 8, 8
+.LBE1337:
+.LBE1349:
+	.loc 1 733 0
+	and	w3, w3, 65535
+	lsr	w11, w7, 16
+.LBB1350:
+.LBB1344:
+	.loc 1 150 0
+	ubfiz	w24, w6, 8, 8
+.LBE1344:
+.LBE1350:
+.LBB1351:
+.LBB1338:
+	.loc 1 151 0
+	and	w21, w3, 65280
+.LBE1338:
+.LBE1351:
+.LBB1352:
+.LBB1345:
+	.loc 1 137 0
+	eor	w25, w20, w12
+	.loc 1 150 0
+	add	w24, w24, w12, uxtb
+.LBE1345:
+.LBE1352:
+.LBB1353:
+.LBB1339:
+	add	w23, w23, w11, uxtb
+	.loc 1 137 0
+	eor	w22, w3, w11
+	.loc 1 151 0
+	add	w21, w21, w11, lsr 8
+.LBE1339:
+.LBE1353:
+	.loc 1 731 0
+	cmp	w7, w6
+	beq	.L373
+.LBB1354:
+.LBB1346:
+	.loc 1 139 0
+	cmp	w20, w12
+	beq	.L374
+	.loc 1 136 0
+	tst	x25, 15
+	.loc 1 151 0
+	ldrb	w6, [x14, w8, sxtw]
+	.loc 1 136 0
+	csel	w4, w15, wzr, ne
+	.loc 1 144 0
+	tst	w25, 240
+	orr	w7, w4, 12
+	.loc 1 150 0
+	ldrb	w8, [x14, w24, sxtw]
+	.loc 1 144 0
+	csel	w4, w7, w4, ne
+	.loc 1 146 0
+	tst	w25, 3840
+	orr	w7, w4, 48
+	csel	w4, w7, w4, ne
+	.loc 1 148 0
+	tst	w25, 61440
+	orr	w7, w4, -64
+	.loc 1 150 0
+	orr	w6, w8, w6, lsl 4
+	.loc 1 148 0
+	and	w7, w7, 255
+	csel	w4, w7, w4, ne
+	.loc 1 150 0
+	and	w4, w6, w4
+	and	w4, w4, 255
+.L374:
+.LBE1346:
+.LBE1354:
+	.loc 1 732 0
+	strb	w4, [x13, -2]
+.LBB1355:
+.LBB1340:
+	.loc 1 139 0
+	cmp	w3, w11
+	beq	.L379
+	.loc 1 136 0
+	tst	x22, 15
+	.loc 1 150 0
+	ldrb	w6, [x14, w23, sxtw]
+	.loc 1 136 0
+	csel	w3, w15, wzr, ne
+	.loc 1 144 0
+	tst	w22, 240
+	orr	w4, w3, 12
+	.loc 1 151 0
+	ldrb	w5, [x14, w21, sxtw]
+	.loc 1 144 0
+	csel	w3, w4, w3, ne
+	.loc 1 146 0
+	tst	w22, 3840
+	orr	w4, w3, 48
+	csel	w3, w4, w3, ne
+	.loc 1 148 0
+	tst	w22, 61440
+	orr	w4, w3, -64
+	.loc 1 150 0
+	orr	w5, w6, w5, lsl 4
+	.loc 1 148 0
+	and	w4, w4, 255
+	csel	w3, w4, w3, ne
+	.loc 1 150 0
+	and	w3, w5, w3
+	and	w5, w3, 255
+.L379:
+.LBE1340:
+.LBE1355:
+	.loc 1 733 0
+	strb	w5, [x13, -1]
+.L384:
+	add	x10, x10, 1
+	add	x13, x13, 2
+	.loc 1 728 0
+	cmp	w9, w10
+	bgt	.L385
+	add	x1, x1, x17
+	add	x2, x2, x17
+.LVL374:
+.L372:
+	.loc 1 722 0
+	add	w16, w16, 1
+	cmp	w30, w16
+	beq	.L340
+	ldr	w3, [x18, 84]
+	.loc 1 723 0
+	cbnz	w19, .L445
+.L370:
+	.loc 1 726 0
+	mul	w13, w16, w3
+.LVL375:
+	lsr	w13, w13, 2
+	add	x13, x0, x13
+.LVL376:
+	b	.L371
+.LVL377:
+	.p2align 3
+.L373:
+	.loc 1 736 0
+	strh	wzr, [x13, -2]
+	b	.L384
+.LVL378:
+	.p2align 3
+.L340:
+.LBE1333:
+.LBE1332:
+	.loc 1 794 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+.LVL379:
+	ldp	x23, x24, [sp, 48]
+	ldr	x25, [sp, 64]
+.LVL380:
+	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
+.LVL381:
+	ret
+.LVL382:
+.L444:
+	.cfi_restore_state
+.LBB1356:
+.LBB1331:
+.LBB1330:
+	.loc 1 748 0
+	ldr	x14, [x5, #:lo12:.LANCHOR0]
+	.loc 1 753 0
+	ldrb	w7, [x3, 32]
+	ldr	w4, [x3, 40]
+	.loc 1 755 0
 	add	x14, x14, 24
+	.loc 1 754 0
+	ldr	x3, [x3, 112]
+.LVL383:
+	.loc 1 753 0
+	sub	w7, w7, w4
+.LVL384:
+	.loc 1 758 0
+	ldr	w15, [x14, 88]
+	.loc 1 754 0
+	lsl	w7, w7, 16
+.LVL385:
+	.loc 1 755 0
 	ldr	w16, [x14, 156]
-	.loc 1 668 0
-	ldp	w3, w15, [x14, 84]
-.LVL348:
-	.loc 1 673 0
+.LVL386:
+	.loc 1 754 0
+	add	x7, x3, x7, sxtw
+.LVL387:
+	.loc 1 757 0
+	ldr	w3, [x14, 84]
+.LVL388:
+	.loc 1 763 0
 	cmp	w15, 0
-	ble	.L393
+	.loc 1 757 0
 	lsr	w11, w3, 4
-.LVL349:
-	mov	w12, 0
-.LVL350:
+.LVL389:
+	.loc 1 763 0
+	ble	.L340
 	sub	w13, w11, #1
-.LBB1236:
-.LBB1237:
-	.loc 1 136 0
-	mov	w10, 3
+	mov	x9, x2
+.LVL390:
 	add	x13, x13, 1
+	mov	x8, x1
+.LVL391:
 	lsl	x13, x13, 3
-.LBE1237:
-.LBE1236:
-	.loc 1 674 0
-	cbz	w16, .L396
-.LVL351:
-.L411:
-	.loc 1 675 0
-	ldr	w6, [x14, 88]
-.LVL352:
-	sub	w6, w6, #1
-	sub	w6, w6, w12
-	mul	w6, w6, w3
-	lsr	w6, w6, 2
-	add	x6, x0, x6
-.LVL353:
-.L397:
-	.loc 1 679 0
-	cbz	w11, .L399
-	add	x6, x6, 4
-.LVL354:
-	mov	x8, 0
-.LVL355:
-.L400:
-	.loc 1 680 0
-	ldr	x3, [x1, x8, lsl 3]
-	.loc 1 681 0
-	ldr	x4, [x2, x8, lsl 3]
-	.loc 1 682 0
-	cmp	x3, x4
-	beq	.L409
-	.loc 1 654 0
-	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
-.LVL356:
-.L401:
-	.loc 1 683 0
-	and	w17, w4, 65535
-	and	w9, w3, 65535
-.LVL357:
-.LBB1239:
-.LBB1240:
+	mov	w12, 0
+.LVL392:
+.LBB1320:
+.LBB1321:
+	.loc 1 136 0
+	mov	w10, 3
+.LBE1321:
+.LBE1320:
+	.loc 1 764 0
+	cbz	w16, .L344
+.LVL393:
+	.p2align 2
+.L446:
+	.loc 1 765 0
+	ldr	w1, [x14, 88]
+.LVL394:
+	sub	w1, w1, #1
+	sub	w1, w1, w12
+	mul	w3, w1, w3
+	lsr	w3, w3, 2
+	add	x3, x0, x3
+.LVL395:
+.L345:
+	.loc 1 769 0
+	cbz	w11, .L346
+	add	x3, x3, 4
+.LVL396:
+	mov	x5, 0
+	.p2align 2
+.L369:
+	.loc 1 770 0
+	ldr	x1, [x8, x5, lsl 3]
+.LVL397:
+	.loc 1 771 0
+	ldr	x2, [x9, x5, lsl 3]
+.LVL398:
+	.loc 1 772 0
+	cmp	x1, x2
+	beq	.L347
+	.loc 1 773 0
+	and	w17, w2, 65535
+	and	w6, w1, 65535
+.LVL399:
+.LBB1323:
+.LBB1324:
 	.loc 1 140 0
-	mov	w7, 0
+	mov	w4, 0
 	.loc 1 139 0
-	cmp	w17, w9
-	beq	.L334
+	cmp	w17, w6
+	beq	.L348
 	.loc 1 137 0
-	eor	w18, w17, w9
-.LVL358:
+	eor	w18, w17, w6
+.LVL400:
 	.loc 1 150 0
-	ubfiz	w30, w17, 8, 8
+	ubfiz	w19, w17, 8, 8
 	.loc 1 151 0
 	and	w17, w17, 65280
 	.loc 1 150 0
-	add	w30, w30, w9, uxtb
+	add	w19, w19, w6, uxtb
 	.loc 1 136 0
 	tst	x18, 15
 	.loc 1 151 0
-	add	w9, w17, w9, lsr 8
+	add	w6, w17, w6, lsr 8
 	.loc 1 136 0
-	csel	w7, w10, wzr, ne
+	csel	w4, w10, wzr, ne
 	.loc 1 144 0
 	tst	w18, 240
-	orr	w17, w7, 12
+	orr	w17, w4, 12
 	.loc 1 150 0
-	ldrb	w30, [x5, w30, sxtw]
+	ldrb	w19, [x7, w19, sxtw]
 	.loc 1 144 0
-	csel	w7, w17, w7, ne
+	csel	w4, w17, w4, ne
 	.loc 1 146 0
 	tst	w18, 3840
-	orr	w17, w7, 48
+	orr	w17, w4, 48
 	.loc 1 151 0
-	ldrb	w9, [x5, w9, sxtw]
+	ldrb	w6, [x7, w6, sxtw]
 	.loc 1 146 0
-	csel	w7, w17, w7, ne
+	csel	w4, w17, w4, ne
 	.loc 1 148 0
 	tst	w18, 61440
-	orr	w17, w7, -64
+	orr	w17, w4, -64
 	and	w17, w17, 255
 	.loc 1 150 0
-	orr	w9, w30, w9, lsl 4
+	orr	w6, w19, w6, lsl 4
 	.loc 1 148 0
-	csel	w7, w17, w7, ne
+	csel	w4, w17, w4, ne
 	.loc 1 150 0
-	and	w7, w9, w7
-	and	w7, w7, 255
-.LVL359:
-.L334:
-.LBE1240:
-.LBE1239:
-	.loc 1 683 0
-	strb	w7, [x6, -4]
-	.loc 1 684 0
-	lsr	w17, w4, 16
-	lsr	w9, w3, 16
-.LBB1241:
-.LBB1242:
+	and	w4, w6, w4
+	and	w4, w4, 255
+.LVL401:
+.L348:
+.LBE1324:
+.LBE1323:
+	.loc 1 773 0
+	strb	w4, [x3, -4]
+	.loc 1 774 0
+	lsr	w17, w2, 16
+	lsr	w6, w1, 16
+.LBB1325:
+.LBB1326:
 	.loc 1 140 0
-	mov	w7, 0
+	mov	w4, 0
 	.loc 1 139 0
-	cmp	w17, w9
-	beq	.L339
+	cmp	w17, w6
+	beq	.L353
 	.loc 1 137 0
-	eor	w18, w17, w9
-.LVL360:
+	eor	w18, w17, w6
+.LVL402:
 	.loc 1 150 0
-	ubfiz	w30, w17, 8, 8
+	ubfiz	w19, w17, 8, 8
 	.loc 1 151 0
 	and	w17, w17, 65280
 	.loc 1 150 0
-	add	w30, w30, w9, uxtb
+	add	w19, w19, w6, uxtb
 	.loc 1 136 0
 	tst	x18, 15
 	.loc 1 151 0
-	add	w9, w17, w9, lsr 8
+	add	w6, w17, w6, lsr 8
 	.loc 1 136 0
-	csel	w7, w10, wzr, ne
+	csel	w4, w10, wzr, ne
 	.loc 1 144 0
 	tst	w18, 240
-	orr	w17, w7, 12
+	orr	w17, w4, 12
 	.loc 1 150 0
-	ldrb	w30, [x5, w30, sxtw]
+	ldrb	w19, [x7, w19, sxtw]
 	.loc 1 144 0
-	csel	w7, w17, w7, ne
+	csel	w4, w17, w4, ne
 	.loc 1 146 0
 	tst	w18, 3840
-	orr	w17, w7, 48
+	orr	w17, w4, 48
 	.loc 1 151 0
-	ldrb	w9, [x5, w9, sxtw]
+	ldrb	w6, [x7, w6, sxtw]
 	.loc 1 146 0
-	csel	w7, w17, w7, ne
+	csel	w4, w17, w4, ne
 	.loc 1 148 0
 	tst	w18, 61440
-	orr	w17, w7, -64
+	orr	w17, w4, -64
 	and	w17, w17, 255
 	.loc 1 150 0
-	orr	w9, w30, w9, lsl 4
+	orr	w6, w19, w6, lsl 4
 	.loc 1 148 0
-	csel	w7, w17, w7, ne
+	csel	w4, w17, w4, ne
 	.loc 1 150 0
-	and	w7, w9, w7
-	and	w7, w7, 255
-.LVL361:
-.L339:
-.LBE1242:
-.LBE1241:
-	.loc 1 684 0
-	strb	w7, [x6, -3]
-	.loc 1 685 0
-	ubfx	x17, x4, 32, 16
-	ubfx	x9, x3, 32, 16
-.LBB1243:
-.LBB1244:
+	and	w4, w6, w4
+	and	w4, w4, 255
+.LVL403:
+.L353:
+.LBE1326:
+.LBE1325:
+	.loc 1 774 0
+	strb	w4, [x3, -3]
+	.loc 1 775 0
+	ubfx	x17, x2, 32, 16
+	ubfx	x6, x1, 32, 16
+.LBB1327:
+.LBB1328:
 	.loc 1 140 0
-	mov	w7, 0
+	mov	w4, 0
 	.loc 1 139 0
-	cmp	w17, w9
-	beq	.L344
+	cmp	w17, w6
+	beq	.L358
 	.loc 1 137 0
-	eor	w18, w17, w9
-.LVL362:
+	eor	w18, w17, w6
+.LVL404:
 	.loc 1 150 0
-	ubfiz	w30, w17, 8, 8
+	ubfiz	w19, w17, 8, 8
 	.loc 1 151 0
 	and	w17, w17, 65280
 	.loc 1 150 0
-	add	w30, w30, w9, uxtb
+	add	w19, w19, w6, uxtb
 	.loc 1 136 0
 	tst	x18, 15
 	.loc 1 151 0
-	add	w9, w17, w9, lsr 8
+	add	w6, w17, w6, lsr 8
 	.loc 1 136 0
-	csel	w7, w10, wzr, ne
+	csel	w4, w10, wzr, ne
 	.loc 1 144 0
 	tst	w18, 240
-	orr	w17, w7, 12
+	orr	w17, w4, 12
 	.loc 1 150 0
-	ldrb	w30, [x5, w30, sxtw]
+	ldrb	w19, [x7, w19, sxtw]
 	.loc 1 144 0
-	csel	w7, w17, w7, ne
+	csel	w4, w17, w4, ne
 	.loc 1 146 0
 	tst	w18, 3840
-	orr	w17, w7, 48
+	orr	w17, w4, 48
 	.loc 1 151 0
-	ldrb	w9, [x5, w9, sxtw]
+	ldrb	w6, [x7, w6, sxtw]
 	.loc 1 146 0
-	csel	w7, w17, w7, ne
+	csel	w4, w17, w4, ne
 	.loc 1 148 0
 	tst	w18, 61440
-	orr	w17, w7, -64
+	orr	w17, w4, -64
 	and	w17, w17, 255
 	.loc 1 150 0
-	orr	w9, w30, w9, lsl 4
+	orr	w6, w19, w6, lsl 4
 	.loc 1 148 0
-	csel	w7, w17, w7, ne
+	csel	w4, w17, w4, ne
 	.loc 1 150 0
-	and	w7, w9, w7
-	and	w7, w7, 255
-.LVL363:
-.L344:
-.LBE1244:
-.LBE1243:
-	.loc 1 685 0
-	strb	w7, [x6, -2]
-	.loc 1 686 0
-	lsr	x4, x4, 48
-.LVL364:
-	lsr	x3, x3, 48
-.LVL365:
-.LBB1245:
-.LBB1238:
+	and	w4, w6, w4
+	and	w4, w4, 255
+.LVL405:
+.L358:
+.LBE1328:
+.LBE1327:
+	.loc 1 775 0
+	strb	w4, [x3, -2]
+	.loc 1 776 0
+	lsr	x2, x2, 48
+.LVL406:
+	lsr	x1, x1, 48
+.LVL407:
+.LBB1329:
+.LBB1322:
 	.loc 1 140 0
-	mov	w7, 0
+	mov	w4, 0
 	.loc 1 139 0
-	cmp	w4, w3
-	beq	.L349
+	cmp	w2, w1
+	beq	.L363
 	.loc 1 137 0
-	eor	w9, w4, w3
-.LVL366:
+	eor	w6, w2, w1
+.LVL408:
 	.loc 1 150 0
-	ubfiz	w7, w4, 8, 8
+	ubfiz	w4, w2, 8, 8
 	.loc 1 151 0
-	and	w4, w4, 65280
+	and	w2, w2, 65280
 	.loc 1 150 0
-	add	w7, w7, w3, uxtb
+	add	w4, w4, w1, uxtb
 	.loc 1 136 0
-	tst	x9, 15
+	tst	x6, 15
 	.loc 1 151 0
-	add	w3, w4, w3, lsr 8
+	add	w1, w2, w1, lsr 8
 	.loc 1 136 0
-	csel	w4, w10, wzr, ne
+	csel	w2, w10, wzr, ne
 	.loc 1 144 0
-	tst	w9, 240
-	orr	w18, w4, 12
-.LVL367:
+	tst	w6, 240
+	orr	w18, w2, 12
+.LVL409:
 	.loc 1 150 0
-	ldrb	w17, [x5, w7, sxtw]
+	ldrb	w17, [x7, w4, sxtw]
 	.loc 1 144 0
-	csel	w4, w18, w4, ne
+	csel	w2, w18, w2, ne
 	.loc 1 146 0
-	tst	w9, 3840
-	orr	w18, w4, 48
+	tst	w6, 3840
+	orr	w18, w2, 48
 	.loc 1 151 0
-	ldrb	w7, [x5, w3, sxtw]
+	ldrb	w4, [x7, w1, sxtw]
 	.loc 1 146 0
-	csel	w4, w18, w4, ne
+	csel	w2, w18, w2, ne
 	.loc 1 148 0
-	tst	w9, 61440
-	orr	w3, w4, -64
-	and	w3, w3, 255
+	tst	w6, 61440
+	orr	w1, w2, -64
+	and	w1, w1, 255
 	.loc 1 150 0
-	orr	w7, w17, w7, lsl 4
+	orr	w4, w17, w4, lsl 4
 	.loc 1 148 0
-	csel	w4, w3, w4, ne
+	csel	w2, w1, w2, ne
 	.loc 1 150 0
-	and	w4, w7, w4
-	and	w7, w4, 255
-.LVL368:
-.L349:
-.LBE1238:
-.LBE1245:
-	.loc 1 686 0
-	strb	w7, [x6, -1]
-	add	x8, x8, 1
-	add	x6, x6, 4
-	.loc 1 679 0
-	cmp	w11, w8
-	ble	.L410
-.LVL369:
-.L355:
-	.loc 1 680 0
-	ldr	x3, [x1, x8, lsl 3]
-	.loc 1 681 0
-	ldr	x4, [x2, x8, lsl 3]
-	.loc 1 682 0
-	cmp	x3, x4
-	bne	.L401
-	.loc 1 689 0
-	str	wzr, [x6, -4]
-	add	x8, x8, 1
-	add	x6, x6, 4
-	.loc 1 679 0
-	cmp	w11, w8
-	bgt	.L355
-.L410:
-	add	x1, x1, x13
-.LVL370:
-	add	x2, x2, x13
-.LVL371:
-.L332:
-	.loc 1 673 0
-	add	w12, w12, 1
-	cmp	w15, w12
-	beq	.L327
-	ldr	w3, [x14, 84]
-.LVL372:
-	.loc 1 674 0
-	cbz	w16, .L330
-	.loc 1 675 0
-	ldr	w6, [x14, 88]
-.LVL373:
-	sub	w6, w6, #1
-	sub	w6, w6, w12
-	mul	w6, w6, w3
-	lsr	w6, w6, 2
-	add	x6, x0, x6
-.LVL374:
-.L331:
-	.loc 1 679 0
-	cbz	w11, .L332
-	add	x6, x6, 4
-.LVL375:
-	mov	x8, 0
-	b	.L355
-.LVL376:
-	.p2align 3
-.L409:
-	.cfi_def_cfa 31, 0
-	.cfi_restore 29
-	.cfi_restore 30
-	.loc 1 689 0
-	str	wzr, [x6, -4]
-	add	x8, x8, 1
-	.loc 1 679 0
-	cmp	w11, w8
-	add	x6, x6, 4
-	bgt	.L400
-	add	x1, x1, x13
-.LVL377:
-	add	x2, x2, x13
-.LVL378:
-.L399:
-	.loc 1 673 0
+	and	w2, w4, w2
+	and	w4, w2, 255
+.LVL410:
+.L363:
+.LBE1322:
+.LBE1329:
+	.loc 1 776 0
+	strb	w4, [x3, -1]
+.LVL411:
+.L368:
+	add	x5, x5, 1
+	add	x3, x3, 4
+	.loc 1 769 0
+	cmp	w11, w5
+	bgt	.L369
+	add	x8, x8, x13
+	add	x9, x9, x13
+.LVL412:
+.L346:
+	.loc 1 763 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L393
+	beq	.L340
 	ldr	w3, [x14, 84]
-.LVL379:
-	.loc 1 674 0
-	cbnz	w16, .L411
-.L396:
-	.loc 1 677 0
-	mul	w6, w12, w3
-.LVL380:
-	lsr	w6, w6, 2
-	add	x6, x0, x6
-.LVL381:
-	b	.L397
-.LVL382:
+.LVL413:
+	.loc 1 764 0
+	cbnz	w16, .L446
+.L344:
+	.loc 1 767 0
+	mul	w3, w12, w3
+	lsr	w3, w3, 2
+	add	x3, x0, x3
+.LVL414:
+	b	.L345
+.LVL415:
 	.p2align 3
-.L330:
-	.cfi_def_cfa 29, 16
-	.cfi_offset 29, -16
-	.cfi_offset 30, -8
-	mul	w6, w12, w3
-.LVL383:
-	lsr	w6, w6, 2
-	add	x6, x0, x6
-.LVL384:
-	b	.L331
-.LVL385:
-.L327:
-	.loc 1 694 0
-	ldp	x29, x30, [sp], 16
-	.cfi_restore 30
-	.cfi_restore 29
-	.cfi_def_cfa 31, 0
-	ret
-.LVL386:
-.L393:
-	ret
+.L347:
+	.loc 1 779 0
+	str	wzr, [x3, -4]
+	b	.L368
+.LBE1330:
+.LBE1331:
+.LBE1356:
 	.cfi_endproc
-.LFE2849:
-	.size	direct_mode_data_change_part.isra.2, .-direct_mode_data_change_part.isra.2
+.LFE2817:
+	.size	direct_mode_data_change_part, .-direct_mode_data_change_part
 	.align	2
 	.p2align 3,,7
-	.type	flip.isra.3, %function
-flip.isra.3:
-.LFB2850:
-	.loc 1 696 0
+	.type	flip.isra.7, %function
+flip.isra.7:
+.LFB2859:
+	.loc 1 796 0
 	.cfi_startproc
-.LVL387:
+.LVL416:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 700 0
+	.loc 1 800 0
 	sxtw	x2, w1
-	.loc 1 696 0
+	.loc 1 796 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 696 0
+	.loc 1 796 0
 	mov	x20, x0
-	.loc 1 698 0
+	.loc 1 798 0
 	ldr	w19, [x0, 72]
-	.loc 1 700 0
+	.loc 1 800 0
 	ldr	x0, [x0]
-.LVL388:
-.LBB1246:
-.LBB1247:
-.LBB1248:
-.LBB1249:
+.LVL417:
+.LBB1357:
+.LBB1358:
+.LBB1359:
+.LBB1360:
 	.file 10 "./include/linux/dma-mapping.h"
 	.loc 10 266 0
-	cbz	x0, .L415
+	cbz	x0, .L450
 	ldr	x3, [x0, 648]
 	.loc 10 268 0
 	adrp	x4, dummy_dma_ops
 	add	x4, x4, :lo12:dummy_dma_ops
 	cmp	x3, 0
 	csel	x3, x4, x3, eq
-.L413:
-.LBE1249:
-.LBE1248:
+.L448:
+.LBE1360:
+.LBE1359:
 	.loc 10 434 0
 	ldr	x5, [x3, 88]
 	sxtw	x19, w19
-	cbz	x5, .L414
-.LBE1247:
-.LBE1246:
-	.loc 1 700 0
+	cbz	x5, .L449
+.LBE1358:
+.LBE1357:
+	.loc 1 800 0
 	add	x4, x19, x19, lsl 1
-.LBB1255:
-.LBB1252:
+.LBB1366:
+.LBB1363:
 	.loc 10 435 0
 	mov	w3, 1
-.LBE1252:
-.LBE1255:
-	.loc 1 700 0
+.LBE1363:
+.LBE1366:
+	.loc 1 800 0
 	add	x4, x20, x4, lsl 3
-.LBB1256:
-.LBB1253:
+.LBB1367:
+.LBB1364:
 	.loc 10 435 0
 	ldr	x1, [x4, 32]
 	blr	x5
-.LVL389:
-.L414:
-.LBE1253:
-.LBE1256:
-	.loc 1 701 0
+.LVL418:
+.L449:
+.LBE1364:
+.LBE1367:
+	.loc 1 801 0
 	ldr	x5, [x20, 8]
-.LBB1257:
-.LBB1258:
+.LBB1368:
+.LBB1369:
 	.file 11 "drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.h"
 	.loc 11 57 0
 	mov	w4, 0
@@ -4244,58 +4691,58 @@ flip.isra.3:
 	mov	w2, 0
 	mov	x0, x5
 	mov	w1, 0
-.LBE1258:
-.LBE1257:
-	.loc 1 702 0
+.LBE1369:
+.LBE1368:
+	.loc 1 802 0
 	add	x19, x19, x19, lsl 1
-.LBB1261:
-.LBB1259:
+.LBB1372:
+.LBB1370:
 	.loc 11 57 0
 	ldr	x5, [x5, 64]
-.LBE1259:
-.LBE1261:
-	.loc 1 702 0
+.LBE1370:
+.LBE1372:
+	.loc 1 802 0
 	add	x19, x20, x19, lsl 3
-.LBB1262:
-.LBB1260:
+.LBB1373:
+.LBB1371:
 	.loc 11 57 0
 	blr	x5
-.LVL390:
-.LBE1260:
-.LBE1262:
-	.loc 1 702 0
+.LVL419:
+.LBE1371:
+.LBE1373:
+	.loc 1 802 0
 	ldr	x1, [x20, 8]
-.LBB1263:
-.LBB1264:
+.LBB1374:
+.LBB1375:
 	.loc 11 62 0
 	mov	w2, 0
 	mov	x0, x1
 	ldr	x3, [x1, 72]
 	ldr	w1, [x19, 32]
 	blr	x3
-.LVL391:
-.LBE1264:
-.LBE1263:
-	.loc 1 703 0
+.LVL420:
+.LBE1375:
+.LBE1374:
+	.loc 1 803 0
 	ldr	x2, [x20, 8]
-.LBB1265:
-.LBB1266:
+.LBB1376:
+.LBB1377:
 	.loc 11 77 0
 	mov	w1, 1
 	mov	x0, x2
 	ldr	x2, [x2, 96]
 	blr	x2
-.LVL392:
-.LBE1266:
-.LBE1265:
-	.loc 1 704 0
+.LVL421:
+.LBE1377:
+.LBE1376:
+	.loc 1 804 0
 	ldr	w1, [x20, 72]
 	mov	w0, 1
 	sub	w0, w0, w1
 	str	w0, [x20, 72]
-	.loc 1 705 0
+	.loc 1 805 0
 	ldp	x19, x20, [sp, 16]
-.LVL393:
+.LVL422:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -4304,33 +4751,33 @@ flip.isra.3:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL394:
+.LVL423:
 	.p2align 3
-.L415:
+.L450:
 	.cfi_restore_state
-.LBB1267:
-.LBB1254:
-.LBB1251:
-.LBB1250:
+.LBB1378:
+.LBB1365:
+.LBB1362:
+.LBB1361:
 	.loc 10 268 0
 	adrp	x3, dummy_dma_ops
 	add	x3, x3, :lo12:dummy_dma_ops
-	b	.L413
-.LBE1250:
-.LBE1251:
-.LBE1254:
-.LBE1267:
+	b	.L448
+.LBE1361:
+.LBE1362:
+.LBE1365:
+.LBE1378:
 	.cfi_endproc
-.LFE2850:
-	.size	flip.isra.3, .-flip.isra.3
+.LFE2859:
+	.size	flip.isra.7, .-flip.isra.7
 	.align	2
 	.p2align 3,,7
 	.type	ebc_frame_start, %function
 ebc_frame_start:
-.LFB2815:
-	.loc 1 714 0
+.LFB2820:
+	.loc 1 814 0
 	.cfi_startproc
-.LVL395:
+.LVL424:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
@@ -4340,55 +4787,68 @@ ebc_frame_start:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 716 0
+	.loc 1 816 0
 	add	x19, x0, 184
-	.loc 1 714 0
+	.loc 1 814 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 714 0
+	.loc 1 814 0
 	mov	x20, x0
-	.loc 1 715 0
+	.loc 1 815 0
 	add	x21, x0, 24
-	.loc 1 718 0
+	.loc 1 818 0
 	ldr	x1, [x19, 208]
 	ldr	w0, [x1, 40]
-.LVL396:
+.LVL425:
+	tbnz	w0, #31, .L456
 	cmp	w0, 1
-	beq	.L422
-	bgt	.L423
-	cbnz	w0, .L421
-	.loc 1 738 0
+	ble	.L457
+	sub	w0, w0, #7
+	cmp	w0, 8
+	bhi	.L456
+	.loc 1 850 0
+	ldr	x2, [x19, 200]
+	.loc 1 848 0
+	mov	x3, x19
+	.loc 1 847 0
+	ldrb	w0, [x19, 32]
+	str	w0, [x19, 40]
+	.loc 1 848 0
 	ldr	x0, [x19, 168]
-	mov	x4, x19
-	ldp	x1, x2, [x19, 128]
-	ldr	x3, [x19, 152]
-	bl	get_auto_image
-.LVL397:
-	.loc 1 743 0
-	ldr	w0, [x19, 36]
-	cbz	w0, .L428
-.LBB1268:
-.LBB1269:
-	.loc 1 709 0
+	ldr	x2, [x2, 16]
+	ldr	x1, [x1, 16]
+	bl	direct_mode_data_change_part
+.LVL426:
+.LBB1379:
+.LBB1380:
+	.loc 1 809 0
 	str	wzr, [x21, 72]
-	.loc 1 710 0
+	.loc 1 810 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
-	bl	flip.isra.3
-.LVL398:
-.LBE1269:
-.LBE1268:
-	.loc 1 745 0
-	ldp	x1, x2, [x19, 128]
-	mov	x4, x19
-	ldr	x3, [x19, 152]
+	bl	flip.isra.7
+.LVL427:
+.LBE1380:
+.LBE1379:
+	.loc 1 853 0
+	ldr	w0, [x19, 40]
+	.loc 1 854 0
+	mov	x3, x19
+	.loc 1 855 0
+	ldp	x2, x1, [x19, 200]
+	.loc 1 853 0
+	sub	w0, w0, #1
+	str	w0, [x19, 40]
+	.loc 1 854 0
 	ldr	x0, [x19, 176]
-	bl	get_auto_image
-.LVL399:
-.L420:
-	.loc 1 789 0
+	ldr	x1, [x1, 16]
+	ldr	x2, [x2, 16]
+	bl	direct_mode_data_change_part
+.LVL428:
+.L455:
+	.loc 1 875 0
 	ldp	x19, x20, [sp, 16]
-.LVL400:
+.LVL429:
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -4399,57 +4859,53 @@ ebc_frame_start:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL401:
+.LVL430:
 	.p2align 3
-.L423:
+.L456:
 	.cfi_restore_state
-	.loc 1 718 0
-	sub	w0, w0, #7
-	cmp	w0, 5
-	bhi	.L421
-	.loc 1 764 0
+	.loc 1 863 0
 	ldr	x2, [x19, 200]
-	.loc 1 761 0
-	ldrb	w4, [x19, 32]
-	str	w4, [x19, 40]
-	.loc 1 762 0
+	.loc 1 861 0
+	mov	x3, x19
+	.loc 1 860 0
+	ldrb	w0, [x19, 32]
+	str	w0, [x19, 40]
+	.loc 1 861 0
 	ldr	x0, [x19, 168]
-	mov	w3, w4
-	ldr	x5, [x20, 296]
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
-	bl	direct_mode_data_change_part.isra.2
-.LVL402:
-.LBB1270:
-.LBB1271:
-	.loc 1 709 0
+	bl	direct_mode_data_change
+.LVL431:
+.LBB1381:
+.LBB1382:
+	.loc 1 809 0
 	str	wzr, [x21, 72]
-	.loc 1 710 0
+	.loc 1 810 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
-	bl	flip.isra.3
-.LVL403:
-.LBE1271:
-.LBE1270:
-	.loc 1 767 0
-	ldr	w4, [x19, 40]
-	.loc 1 769 0
+	bl	flip.isra.7
+.LVL432:
+.LBE1382:
+.LBE1381:
+	.loc 1 866 0
+	ldr	w0, [x19, 40]
+	.loc 1 867 0
+	mov	x3, x19
+	.loc 1 868 0
 	ldp	x2, x1, [x19, 200]
-	.loc 1 767 0
-	sub	w4, w4, #1
-	str	w4, [x19, 40]
-	.loc 1 768 0
+	.loc 1 866 0
+	sub	w0, w0, #1
+	str	w0, [x19, 40]
+	.loc 1 867 0
 	ldr	x0, [x19, 176]
-	ldrb	w3, [x20, 216]
-	ldr	x5, [x20, 296]
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change_part.isra.2
-.LVL404:
-	.loc 1 789 0
+	bl	direct_mode_data_change
+.LVL433:
+	.loc 1 875 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL405:
+.LVL434:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -4459,91 +4915,42 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL406:
+.LVL435:
 	.p2align 3
-.L422:
+.L457:
 	.cfi_restore_state
-	.loc 1 720 0
+	.loc 1 821 0
 	ldr	x0, [x19, 168]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 128]
 	ldr	x3, [x19, 152]
 	bl	get_auto_image
-.LVL407:
-	.loc 1 725 0
+.LVL436:
+	.loc 1 826 0
 	ldr	w0, [x19, 36]
-	cbz	w0, .L426
-.LBB1272:
-.LBB1273:
-	.loc 1 709 0
+	cbz	w0, .L459
+.LBB1383:
+.LBB1384:
+	.loc 1 809 0
 	str	wzr, [x21, 72]
-	.loc 1 710 0
+	.loc 1 810 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
-	bl	flip.isra.3
-.LVL408:
-.LBE1273:
-.LBE1272:
-	.loc 1 789 0
-	ldr	x21, [sp, 32]
-	ldp	x19, x20, [sp, 16]
-.LVL409:
-	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
-.LVL410:
-	.p2align 3
-.L421:
-	.cfi_restore_state
-	.loc 1 777 0
-	ldr	x2, [x19, 200]
-	.loc 1 774 0
-	ldrb	w4, [x19, 32]
-	str	w4, [x19, 40]
-	.loc 1 775 0
-	ldr	x0, [x19, 168]
-	mov	w3, w4
-	ldr	x5, [x20, 296]
-	ldr	x2, [x2, 16]
-	ldr	x1, [x1, 16]
-	bl	direct_mode_data_change.isra.1
-.LVL411:
-.LBB1274:
-.LBB1275:
-	.loc 1 709 0
-	str	wzr, [x21, 72]
-	.loc 1 710 0
-	mov	x0, x21
-	ldr	w1, [x20, 208]
-	bl	flip.isra.3
-.LVL412:
-.LBE1275:
-.LBE1274:
-	.loc 1 780 0
-	ldr	w4, [x19, 40]
-	.loc 1 782 0
-	ldp	x2, x1, [x19, 200]
-	.loc 1 780 0
-	sub	w4, w4, #1
-	str	w4, [x19, 40]
-	.loc 1 781 0
+	bl	flip.isra.7
+.LVL437:
+.LBE1384:
+.LBE1383:
+	.loc 1 828 0
+	ldp	x1, x2, [x19, 128]
+	mov	x4, x19
+	ldr	x3, [x19, 152]
 	ldr	x0, [x19, 176]
-	ldrb	w3, [x20, 216]
-	ldr	x5, [x20, 296]
-	ldr	x1, [x1, 16]
-	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change.isra.1
-.LVL413:
-	.loc 1 789 0
+	bl	get_auto_image
+.LVL438:
+	.loc 1 875 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL414:
+.LVL439:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -4553,50 +4960,39 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL415:
-.L428:
+.LVL440:
+.L459:
 	.cfi_restore_state
-	.loc 1 751 0
-	adrp	x1, .LANCHOR3
-	adrp	x0, .LC20
-	add	x1, x1, :lo12:.LANCHOR3
-	add	x0, x0, :lo12:.LC20
-	bl	printk
-.LVL416:
-	.loc 1 752 0
-	str	wzr, [x19, 28]
-	b	.L420
-.L426:
-	.loc 1 733 0
+	.loc 1 834 0
 	adrp	x1, .LANCHOR3
 	adrp	x0, .LC19
 	add	x1, x1, :lo12:.LANCHOR3
 	add	x0, x0, :lo12:.LC19
 	bl	printk
-.LVL417:
-	.loc 1 734 0
+.LVL441:
+	.loc 1 835 0
 	str	wzr, [x19, 28]
-	b	.L420
+	b	.L455
 	.cfi_endproc
-.LFE2815:
+.LFE2820:
 	.size	ebc_frame_start, .-ebc_frame_start
 	.align	2
 	.p2align 3,,7
 	.type	ebc_auto_tast_function, %function
 ebc_auto_tast_function:
-.LFB2816:
-	.loc 1 792 0
+.LFB2821:
+	.loc 1 878 0
 	.cfi_startproc
-.LVL418:
+.LVL442:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
 	.cfi_offset 30, -88
-	.loc 1 793 0
+	.loc 1 879 0
 	adrp	x1, .LANCHOR0
-	.loc 1 792 0
+	.loc 1 878 0
 	adrp	x0, __stack_chk_guard
-.LVL419:
+.LVL443:
 	add	x0, x0, :lo12:__stack_chk_guard
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -4605,226 +5001,208 @@ ebc_auto_tast_function:
 	.cfi_offset 20, -72
 	adrp	x20, .LANCHOR1
 	stp	x21, x22, [sp, 32]
-	.loc 1 798 0
+	.loc 1 884 0
 	add	x20, x20, :lo12:.LANCHOR1
 	.cfi_offset 21, -64
 	.cfi_offset 22, -56
-	.loc 1 793 0
+	.loc 1 879 0
 	ldr	x22, [x1, #:lo12:.LANCHOR0]
-.LVL420:
-	.loc 1 798 0
+.LVL444:
+	.loc 1 884 0
 	add	x20, x20, 376
-	.loc 1 792 0
+	.loc 1 878 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
-.LBB1276:
-.LBB1277:
-.LBB1278:
+.LBB1385:
+.LBB1386:
+.LBB1387:
 	.file 12 "./include/linux/compiler.h"
-	.loc 12 234 0
+	.loc 12 288 0
 	mov	x24, 2
-.LBE1278:
-.LBE1277:
-.LBE1276:
-	.loc 1 792 0
+.LBE1387:
+.LBE1386:
+.LBE1385:
+	.loc 1 878 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -32
 	.cfi_offset 26, -24
-	.loc 1 794 0
+	.loc 1 880 0
 	add	x21, x22, 24
-	.loc 1 795 0
+	.loc 1 881 0
 	add	x19, x22, 184
 	add	x26, x22, 728
-	.loc 1 792 0
+	.loc 1 878 0
 	ldr	x1, [x0]
 	str	x1, [x29, 88]
 	mov	x1,0
 	adrp	x25, system_wq
-.LBB1283:
-.LBB1280:
-.LBB1281:
+.LBB1392:
+.LBB1389:
+.LBB1390:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x23, sp_el0
 // 0 "" 2
-.LVL421:
+.LVL445:
 #NO_APP
-	b	.L441
+	b	.L471
 	.p2align 3
-.L449:
-.LBE1281:
-.LBE1280:
-.LBE1283:
-	.loc 1 803 0
-	cbnz	w0, .L432
-	.loc 1 814 0
-	ldr	w1, [x22, 208]
+.L480:
+.LBE1390:
+.LBE1389:
+.LBE1392:
+	.loc 1 889 0
+	sub	w0, w0, #7
+	cmp	w0, 8
+	bhi	.L464
+	.loc 1 908 0
+	ldr	w1, [x19, 40]
+	.loc 1 909 0
 	mov	x0, x21
-	bl	flip.isra.3
-.LVL422:
-	.loc 1 815 0
-	ldrsw	x0, [x21, 72]
-	mov	x4, x19
-	ldp	x1, x2, [x19, 128]
-	add	x0, x19, x0, lsl 3
-	ldr	x3, [x19, 152]
-	ldr	x0, [x0, 168]
-	bl	get_auto_image
-.LVL423:
-.L437:
-	.loc 1 849 0
+	.loc 1 908 0
+	sub	w1, w1, #1
+	str	w1, [x19, 40]
+	.loc 1 909 0
+	ldr	w1, [x22, 208]
+	bl	flip.isra.7
+.LVL446:
+	.loc 1 910 0
+	ldr	w0, [x19, 40]
+	cbnz	w0, .L478
+.L467:
+	.loc 1 930 0
 	ldr	x0, [x19, 208]
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
-	bls	.L448
-.L440:
-	.loc 1 853 0
+	bls	.L479
+.L470:
+	.loc 1 934 0
 	mov	x0, x20
 	bl	up
-.LVL424:
-	.loc 1 854 0
+.LVL447:
+	.loc 1 935 0
 	bl	schedule
-.LVL425:
-.L441:
-	.loc 1 798 0
+.LVL448:
+.L471:
+	.loc 1 884 0
 	mov	x0, x20
 	bl	down
-.LVL426:
-.LBB1284:
-.LBB1282:
-.LBB1279:
-	.loc 12 234 0
+.LVL449:
+.LBB1393:
+.LBB1391:
+.LBB1388:
+	.loc 12 288 0
 	str	x24, [x23, 32]
-.LBE1279:
-.LBE1282:
-.LBE1284:
-	.loc 1 802 0
+.LBE1388:
+.LBE1391:
+.LBE1393:
+	.loc 1 888 0
 #APP
-// 802 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
+// 888 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
 	dmb ish
 // 0 "" 2
-	.loc 1 803 0
+	.loc 1 889 0
 #NO_APP
 	ldr	x0, [x19, 208]
 	ldr	w0, [x0, 40]
+	tbnz	w0, #31, .L464
 	cmp	w0, 1
-	beq	.L433
-	ble	.L449
-	sub	w0, w0, #7
-	cmp	w0, 5
-	bhi	.L432
-	.loc 1 827 0
-	ldr	w1, [x19, 40]
-	.loc 1 828 0
-	mov	x0, x21
-	.loc 1 827 0
-	sub	w1, w1, #1
-	str	w1, [x19, 40]
-	.loc 1 828 0
+	bgt	.L480
+	.loc 1 892 0
 	ldr	w1, [x22, 208]
-	bl	flip.isra.3
-.LVL427:
-	.loc 1 829 0
-	ldr	w4, [x19, 40]
-	cbz	w4, .L437
-	.loc 1 831 0
+	mov	x0, x21
+	bl	flip.isra.7
+.LVL450:
+	.loc 1 893 0
 	ldrsw	x0, [x21, 72]
-	.loc 1 832 0
-	ldp	x2, x1, [x19, 200]
-	.loc 1 831 0
+	mov	x4, x19
+	ldp	x1, x2, [x19, 128]
 	add	x0, x19, x0, lsl 3
-	ldrb	w3, [x22, 216]
-	ldr	x5, [x22, 296]
-	ldr	x1, [x1, 16]
+	ldr	x3, [x19, 152]
 	ldr	x0, [x0, 168]
-	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change_part.isra.2
-.LVL428:
-	.loc 1 849 0
+	bl	get_auto_image
+.LVL451:
+	.loc 1 930 0
 	ldr	x0, [x19, 208]
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
-	bhi	.L440
-	.p2align 2
-.L448:
-.LBB1285:
-.LBB1286:
-.LBB1287:
-.LBB1288:
+	bhi	.L470
+.L479:
+.LBB1394:
+.LBB1395:
+.LBB1396:
+.LBB1397:
 	.file 13 "./include/linux/workqueue.h"
 	.loc 13 518 0
 	ldr	x1, [x25, #:lo12:system_wq]
 	mov	x2, x26
 	mov	w0, 8
 	bl	queue_work_on
-.LVL429:
-	b	.L440
-	.p2align 3
-.L433:
-.LBE1288:
-.LBE1287:
-.LBE1286:
-.LBE1285:
-	.loc 1 806 0
-	ldrsw	x0, [x21, 72]
-	mov	x4, x19
-	ldp	x1, x2, [x19, 128]
-	add	x0, x19, x0, lsl 3
-	ldr	x3, [x19, 152]
-	ldr	x0, [x0, 168]
-	bl	get_auto_image
-.LVL430:
-	.loc 1 811 0
-	ldr	w1, [x22, 208]
-	mov	x0, x21
-	bl	flip.isra.3
-.LVL431:
-	.loc 1 812 0
-	b	.L437
+.LVL452:
+	b	.L470
 	.p2align 3
-.L432:
-	.loc 1 837 0
+.L464:
+.LBE1397:
+.LBE1396:
+.LBE1395:
+.LBE1394:
+	.loc 1 918 0
 	ldr	w1, [x19, 40]
-	.loc 1 838 0
+	.loc 1 919 0
 	mov	x0, x21
-	.loc 1 837 0
+	.loc 1 918 0
 	sub	w1, w1, #1
 	str	w1, [x19, 40]
-	.loc 1 838 0
+	.loc 1 919 0
 	ldr	w1, [x22, 208]
-	bl	flip.isra.3
-.LVL432:
-	.loc 1 839 0
-	ldr	w4, [x19, 40]
-	cbz	w4, .L437
-	.loc 1 841 0
+	bl	flip.isra.7
+.LVL453:
+	.loc 1 920 0
+	ldr	w0, [x19, 40]
+	cbz	w0, .L467
+	.loc 1 922 0
 	ldrsw	x0, [x21, 72]
-	.loc 1 842 0
+	mov	x3, x19
+	.loc 1 923 0
 	ldp	x2, x1, [x19, 200]
-	.loc 1 841 0
+	.loc 1 922 0
 	add	x0, x19, x0, lsl 3
-	ldrb	w3, [x22, 216]
-	ldr	x5, [x22, 296]
 	ldr	x1, [x1, 16]
 	ldr	x0, [x0, 168]
 	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change.isra.1
-.LVL433:
-	.loc 1 845 0
-	b	.L437
+	bl	direct_mode_data_change
+.LVL454:
+	.loc 1 926 0
+	b	.L467
+	.p2align 3
+.L478:
+	.loc 1 912 0
+	ldrsw	x0, [x21, 72]
+	mov	x3, x19
+	.loc 1 913 0
+	ldp	x2, x1, [x19, 200]
+	.loc 1 912 0
+	add	x0, x19, x0, lsl 3
+	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 168]
+	ldr	x2, [x2, 16]
+	bl	direct_mode_data_change_part
+.LVL455:
+	.loc 1 916 0
+	b	.L467
 	.cfi_endproc
-.LFE2816:
+.LFE2821:
 	.size	ebc_auto_tast_function, .-ebc_auto_tast_function
 	.align	2
 	.p2align 3,,7
-	.type	ebc_power_set.part.4, %function
-ebc_power_set.part.4:
-.LFB2851:
+	.type	ebc_power_set.part.8, %function
+ebc_power_set.part.8:
+.LFB2860:
 	.loc 1 180 0
 	.cfi_startproc
-.LVL434:
+.LVL456:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -4840,41 +5218,41 @@ ebc_power_set.part.4:
 	str	w1, [x0, 368]
 	.loc 1 198 0
 	ldr	x1, [x0, 8]
-.LVL435:
-.LBB1289:
-.LBB1290:
+.LVL457:
+.LBB1398:
+.LBB1399:
 	.loc 11 51 0
 	mov	x0, x1
-.LVL436:
+.LVL458:
 	ldr	x1, [x1, 56]
 	blr	x1
-.LVL437:
-.LBE1290:
-.LBE1289:
+.LVL459:
+.LBE1399:
+.LBE1398:
 	.loc 1 199 0
 	ldr	x2, [x19, 16]
-.LBB1291:
-.LBB1292:
+.LBB1400:
+.LBB1401:
 	.loc 3 35 0
 	mov	w1, 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL438:
-.LBE1292:
-.LBE1291:
+.LVL460:
+.LBE1401:
+.LBE1400:
 	.loc 1 200 0
 	ldr	w0, [x19, 608]
-	cbnz	w0, .L456
+	cbnz	w0, .L487
 	.loc 1 204 0
 	ldr	x0, [x19]
-	adrp	x1, .LC21
-	add	x1, x1, :lo12:.LC21
+	adrp	x1, .LC20
+	add	x1, x1, :lo12:.LC20
 	bl	_dev_info
-.LVL439:
+.LVL461:
 	.loc 1 208 0
 	ldp	x19, x20, [sp, 16]
-.LVL440:
+.LVL462:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -4883,29 +5261,29 @@ ebc_power_set.part.4:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL441:
+.LVL463:
 	.p2align 3
-.L456:
+.L487:
 	.cfi_restore_state
 	.loc 1 201 0
 	str	wzr, [x19, 608]
-.LBB1293:
-.LBB1294:
+.LBB1402:
+.LBB1403:
 	.loc 4 68 0
 	add	x0, x19, 400
 	bl	__pm_relax
-.LVL442:
-.LBE1294:
-.LBE1293:
+.LVL464:
+.LBE1403:
+.LBE1402:
 	.loc 1 204 0
 	ldr	x0, [x19]
-	adrp	x1, .LC21
-	add	x1, x1, :lo12:.LC21
+	adrp	x1, .LC20
+	add	x1, x1, :lo12:.LC20
 	bl	_dev_info
-.LVL443:
+.LVL465:
 	.loc 1 208 0
 	ldp	x19, x20, [sp, 16]
-.LVL444:
+.LVL466:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -4914,16 +5292,16 @@ ebc_power_set.part.4:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2851:
-	.size	ebc_power_set.part.4, .-ebc_power_set.part.4
+.LFE2860:
+	.size	ebc_power_set.part.8, .-ebc_power_set.part.8
 	.align	2
 	.p2align 3,,7
 	.type	ebc_suspend, %function
 ebc_suspend:
-.LFB2843:
-	.loc 1 2135 0
+.LFB2848:
+	.loc 1 2202 0
 	.cfi_startproc
-.LVL445:
+.LVL467:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -4933,40 +5311,40 @@ ebc_suspend:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-.LBB1295:
-.LBB1296:
+.LBB1404:
+.LBB1405:
 	.loc 2 1181 0
 	ldr	x20, [x0, 184]
-.LBE1296:
-.LBE1295:
-	.loc 1 2139 0
+.LBE1405:
+.LBE1404:
+	.loc 1 2206 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 184]
-.LVL446:
+.LVL468:
 	cmp	w0, 1
-	beq	.L460
-.L458:
-	.loc 1 2143 0
+	beq	.L491
+.L489:
+	.loc 1 2210 0
 	mov	w0, 1
 	str	w0, [x19, 596]
-	.loc 1 2145 0
+	.loc 1 2212 0
 	ldr	x1, [x20, 16]
-.LBB1297:
-.LBB1298:
+.LBB1406:
+.LBB1407:
 	.loc 3 40 0
 	mov	x0, x1
 	ldr	x1, [x1, 40]
 	blr	x1
-.LVL447:
-.LBE1298:
-.LBE1297:
-	.loc 1 2146 0
+.LVL469:
+.LBE1407:
+.LBE1406:
+	.loc 1 2213 0
 	ldr	x0, [x19, 88]
-	adrp	x1, .LC23
-	add	x1, x1, :lo12:.LC23
+	adrp	x1, .LC22
+	add	x1, x1, :lo12:.LC22
 	bl	_dev_info
-.LVL448:
-	.loc 1 2149 0
+.LVL470:
+	.loc 1 2216 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -4978,64 +5356,64 @@ ebc_suspend:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L460:
+.L491:
 	.cfi_restore_state
-	.loc 1 2140 0
+	.loc 1 2207 0
 	ldr	x0, [x19, 88]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
-	adrp	x1, .LC22
+	adrp	x1, .LC21
 	add	x2, x2, 16
-	add	x1, x1, :lo12:.LC22
+	add	x1, x1, :lo12:.LC21
 	bl	_dev_info
-.LVL449:
-.LBB1299:
-.LBB1300:
+.LVL471:
+.LBB1408:
+.LBB1409:
 	mov	w1, 0
 	mov	x0, x20
-	bl	ebc_power_set.part.4
-.LVL450:
-	b	.L458
-.LBE1300:
-.LBE1299:
+	bl	ebc_power_set.part.8
+.LVL472:
+	b	.L489
+.LBE1409:
+.LBE1408:
 	.cfi_endproc
-.LFE2843:
+.LFE2848:
 	.size	ebc_suspend, .-ebc_suspend
 	.align	2
 	.p2align 3,,7
 	.type	ebc_probe, %function
 ebc_probe:
-.LFB2841:
-	.loc 1 2020 0
+.LFB2846:
+	.loc 1 2086 0
 	.cfi_startproc
-.LVL451:
+.LVL473:
 	stp	x29, x30, [sp, -208]!
 	.cfi_def_cfa_offset 208
 	.cfi_offset 29, -208
 	.cfi_offset 30, -200
-.LBB1446:
-.LBB1447:
+.LBB1555:
+.LBB1556:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
-.LBE1447:
-.LBE1446:
-	.loc 1 2020 0
+.LBE1556:
+.LBE1555:
+	.loc 1 2086 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -192
 	.cfi_offset 20, -184
-	.loc 1 2021 0
+	.loc 1 2087 0
 	add	x20, x0, 16
-	.loc 1 2020 0
+	.loc 1 2086 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -160
 	.cfi_offset 24, -152
 	adrp	x23, __stack_chk_guard
 	stp	x21, x22, [sp, 32]
 	add	x0, x23, :lo12:__stack_chk_guard
-.LVL452:
+.LVL474:
 	stp	x25, x26, [sp, 64]
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 21, -176
@@ -5044,748 +5422,753 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 2020 0
+	.loc 1 2086 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
-.LBB1449:
-.LBB1448:
+.LBB1558:
+.LBB1557:
 	.loc 2 711 0
 	mov	x0, x20
 	mov	x1, 800
 	bl	devm_kmalloc
-.LVL453:
-.LBE1448:
-.LBE1449:
-	.loc 1 2032 0
-	cbz	x0, .L506
-	.loc 1 2036 0
+.LVL475:
+.LBE1557:
+.LBE1558:
+	.loc 1 2098 0
+	cbz	x0, .L537
+	.loc 1 2102 0
 	adrp	x25, .LANCHOR0
 	mov	x19, x0
-	.loc 1 2038 0
-	adrp	x1, .LC24
+	.loc 1 2104 0
+	adrp	x1, .LC23
 	mov	w2, 0
-	.loc 1 2036 0
+	.loc 1 2102 0
 	str	x0, [x25, #:lo12:.LANCHOR0]
-	.loc 1 2038 0
-	add	x1, x1, :lo12:.LC24
+	.loc 1 2104 0
+	add	x1, x1, :lo12:.LC23
 	ldr	x0, [x20, 752]
-	.loc 1 2035 0
+	.loc 1 2101 0
 	str	x20, [x19]
-	.loc 1 2038 0
+	.loc 1 2104 0
 	bl	of_parse_phandle
-.LVL454:
-	.loc 1 2039 0
-	cbz	x0, .L546
-	.loc 1 2044 0
+.LVL476:
+	.loc 1 2105 0
+	cbz	x0, .L577
+	.loc 1 2110 0
 	bl	of_find_device_by_node
-.LVL455:
-	.loc 1 2046 0
-	cbz	x0, .L465
-.LBB1450:
-.LBB1451:
-.LBB1452:
+.LVL477:
+	.loc 1 2112 0
+	cbz	x0, .L496
+.LBB1559:
+.LBB1560:
+.LBB1561:
 	.loc 2 1181 0
 	ldr	x0, [x0, 200]
-.LVL456:
-.LBE1452:
-.LBE1451:
-.LBE1450:
-	.loc 1 2049 0
+.LVL478:
+.LBE1561:
+.LBE1560:
+.LBE1559:
+	.loc 1 2115 0
 	str	x0, [x19, 8]
-	.loc 1 2050 0
-	cbz	x0, .L465
-	.loc 1 2052 0
+	.loc 1 2116 0
+	cbz	x0, .L496
+	.loc 1 2118 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 2054 0
+	.loc 1 2120 0
 	mov	w2, 0
-	adrp	x1, .LC26
-	add	x1, x1, :lo12:.LC26
+	adrp	x1, .LC25
+	add	x1, x1, :lo12:.LC25
 	ldr	x0, [x20, 752]
 	bl	of_parse_phandle
-.LVL457:
-	.loc 1 2055 0
-	cbz	x0, .L547
-	.loc 1 2060 0
+.LVL479:
+	.loc 1 2121 0
+	cbz	x0, .L578
+	.loc 1 2126 0
 	bl	of_find_i2c_device_by_node
-.LVL458:
-	.loc 1 2062 0
-	cbz	x0, .L548
-.LBB1453:
-.LBB1454:
-.LBB1455:
+.LVL480:
+	.loc 1 2128 0
+	cbz	x0, .L579
+.LBB1562:
+.LBB1563:
+.LBB1564:
 	.loc 2 1181 0
 	ldr	x0, [x0, 216]
-.LVL459:
-.LBE1455:
-.LBE1454:
-.LBE1453:
-	.loc 1 2066 0
+.LVL481:
+.LBE1564:
+.LBE1563:
+.LBE1562:
+	.loc 1 2132 0
 	str	x0, [x19, 16]
-	.loc 1 2067 0
-	cbz	x0, .L549
-	.loc 1 2073 0
+	.loc 1 2133 0
+	cbz	x0, .L580
+	.loc 1 2139 0
 	add	x21, x19, 184
-.LVL460:
-	.loc 1 2075 0
+.LVL482:
+	.loc 1 2141 0
 	add	x22, x19, 24
-	.loc 1 2073 0
+	.loc 1 2139 0
 	str	x20, [x21, 88]
-.LBB1456:
-.LBB1457:
-.LBB1458:
-.LBB1459:
-.LBB1460:
+.LBB1565:
+.LBB1566:
+.LBB1567:
+.LBB1568:
+.LBB1569:
 	.file 14 "./include/linux/of.h"
 	.loc 14 499 0
-	adrp	x1, .LC30
-.LBE1460:
-.LBE1459:
-.LBE1458:
-.LBE1457:
-.LBE1456:
-	.loc 1 2075 0
+	adrp	x1, .LC29
+.LBE1569:
+.LBE1568:
+.LBE1567:
+.LBE1566:
+.LBE1565:
+	.loc 1 2141 0
 	str	x20, [x19, 24]
-.LBB1555:
-.LBB1551:
-.LBB1467:
-.LBB1464:
-.LBB1461:
+.LBB1664:
+.LBB1660:
+.LBB1576:
+.LBB1573:
+.LBB1570:
 	.loc 14 499 0
 	mov	x4, 0
-.LBE1461:
-.LBE1464:
-.LBE1467:
-.LBE1551:
-.LBE1555:
-	.loc 1 2076 0
+.LBE1570:
+.LBE1573:
+.LBE1576:
+.LBE1660:
+.LBE1664:
+	.loc 1 2142 0
 	ldr	x2, [x19, 8]
-.LBB1556:
-.LBB1552:
-.LBB1468:
-.LBB1465:
-.LBB1462:
+.LBB1665:
+.LBB1661:
+.LBB1577:
+.LBB1574:
+.LBB1571:
 	.loc 14 499 0
-	add	x1, x1, :lo12:.LC30
-.LBE1462:
-.LBE1465:
-.LBE1468:
-.LBE1552:
-.LBE1556:
-	.loc 1 2077 0
+	add	x1, x1, :lo12:.LC29
+.LBE1571:
+.LBE1574:
+.LBE1577:
+.LBE1661:
+.LBE1665:
+	.loc 1 2143 0
 	stp	x2, x0, [x22, 8]
-.LBB1557:
-.LBB1553:
-.LBB1469:
-.LBB1466:
-.LBB1463:
+.LBB1666:
+.LBB1662:
+.LBB1578:
+.LBB1575:
+.LBB1572:
 	.loc 14 499 0
 	mov	x3, 1
 	ldr	x0, [x20, 752]
 	add	x2, x19, 100
 	bl	of_property_read_variable_u32_array
-.LVL461:
+.LVL483:
 	.loc 14 501 0
-	tbnz	w0, #31, .L470
-.LBE1463:
-.LBE1466:
-.LBE1469:
-.LBB1470:
-.LBB1471:
-.LBB1472:
+	tbnz	w0, #31, .L501
+.LBE1572:
+.LBE1575:
+.LBE1578:
+.LBB1579:
+.LBB1580:
+.LBB1581:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC54
+	adrp	x1, .LC53
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 104
+	add	x1, x1, :lo12:.LC53
+	bl	of_property_read_variable_u32_array
+.LVL484:
+	.loc 14 501 0
+	tbnz	w0, #31, .L501
+.LBE1581:
+.LBE1580:
+.LBE1579:
+.LBB1582:
+.LBB1583:
+.LBB1584:
+	.loc 14 499 0
+	ldr	x0, [x20, 752]
+	adrp	x1, .LC54
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x19, 108
 	add	x1, x1, :lo12:.LC54
 	bl	of_property_read_variable_u32_array
-.LVL462:
+.LVL485:
 	.loc 14 501 0
-	tbnz	w0, #31, .L470
-.LBE1472:
-.LBE1471:
-.LBE1470:
-.LBB1473:
-.LBB1474:
-.LBB1475:
+	tbnz	w0, #31, .L501
+.LBE1584:
+.LBE1583:
+.LBE1582:
+.LBB1585:
+.LBB1586:
+.LBB1587:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC55
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 108
+	add	x2, x19, 112
 	add	x1, x1, :lo12:.LC55
 	bl	of_property_read_variable_u32_array
-.LVL463:
+.LVL486:
 	.loc 14 501 0
-	tbnz	w0, #31, .L470
-.LBE1475:
-.LBE1474:
-.LBE1473:
-.LBB1476:
-.LBB1477:
-.LBB1478:
+	tbnz	w0, #31, .L501
+.LBE1587:
+.LBE1586:
+.LBE1585:
+.LBB1588:
+.LBB1589:
+.LBB1590:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC56
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 112
+	add	x2, x19, 128
 	add	x1, x1, :lo12:.LC56
 	bl	of_property_read_variable_u32_array
-.LVL464:
+.LVL487:
 	.loc 14 501 0
-	tbnz	w0, #31, .L470
-.LBE1478:
-.LBE1477:
-.LBE1476:
-.LBB1479:
-.LBB1480:
-.LBB1481:
+	tbnz	w0, #31, .L501
+.LBE1590:
+.LBE1589:
+.LBE1588:
+.LBB1591:
+.LBB1592:
+.LBB1593:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC57
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 128
+	add	x2, x19, 132
 	add	x1, x1, :lo12:.LC57
 	bl	of_property_read_variable_u32_array
-.LVL465:
+.LVL488:
 	.loc 14 501 0
-	tbnz	w0, #31, .L470
-.LBE1481:
-.LBE1480:
-.LBE1479:
-.LBB1482:
-.LBB1483:
-.LBB1484:
+	tbnz	w0, #31, .L501
+.LBE1593:
+.LBE1592:
+.LBE1591:
+.LBB1594:
+.LBB1595:
+.LBB1596:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC58
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 132
+	add	x2, x19, 136
 	add	x1, x1, :lo12:.LC58
 	bl	of_property_read_variable_u32_array
-.LVL466:
+.LVL489:
 	.loc 14 501 0
-	tbnz	w0, #31, .L470
-.LBE1484:
-.LBE1483:
-.LBE1482:
-.LBB1485:
-.LBB1486:
-.LBB1487:
+	tbnz	w0, #31, .L501
+.LBE1596:
+.LBE1595:
+.LBE1594:
+.LBB1597:
+.LBB1598:
+.LBB1599:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC59
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 136
+	add	x2, x19, 140
 	add	x1, x1, :lo12:.LC59
 	bl	of_property_read_variable_u32_array
-.LVL467:
+.LVL490:
 	.loc 14 501 0
-	tbnz	w0, #31, .L470
-.LBE1487:
-.LBE1486:
-.LBE1485:
-.LBB1488:
-.LBB1489:
-.LBB1490:
+	tbnz	w0, #31, .L501
+.LBE1599:
+.LBE1598:
+.LBE1597:
+.LBB1600:
+.LBB1601:
+.LBB1602:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC60
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 140
+	add	x2, x19, 144
 	add	x1, x1, :lo12:.LC60
 	bl	of_property_read_variable_u32_array
-.LVL468:
+.LVL491:
 	.loc 14 501 0
-	tbnz	w0, #31, .L470
-.LBE1490:
-.LBE1489:
-.LBE1488:
-.LBB1491:
-.LBB1492:
-.LBB1493:
+	tbnz	w0, #31, .L501
+.LBE1602:
+.LBE1601:
+.LBE1600:
+.LBB1603:
+.LBB1604:
+.LBB1605:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC61
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 144
+	add	x2, x19, 148
 	add	x1, x1, :lo12:.LC61
 	bl	of_property_read_variable_u32_array
-.LVL469:
+.LVL492:
 	.loc 14 501 0
-	tbnz	w0, #31, .L470
-.LBE1493:
-.LBE1492:
-.LBE1491:
-.LBB1494:
-.LBB1495:
-.LBB1496:
+	tbnz	w0, #31, .L501
+.LBE1605:
+.LBE1604:
+.LBE1603:
+.LBB1606:
+.LBB1607:
+.LBB1608:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC62
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 148
+	add	x2, x19, 152
 	add	x1, x1, :lo12:.LC62
 	bl	of_property_read_variable_u32_array
-.LVL470:
+.LVL493:
 	.loc 14 501 0
-	tbnz	w0, #31, .L470
-.LBE1496:
-.LBE1495:
-.LBE1494:
-.LBB1497:
-.LBB1498:
-.LBB1499:
+	tbnz	w0, #31, .L501
+.LBE1608:
+.LBE1607:
+.LBE1606:
+.LBB1609:
+.LBB1610:
+.LBB1611:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC63
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 152
+	add	x2, x19, 156
 	add	x1, x1, :lo12:.LC63
 	bl	of_property_read_variable_u32_array
-.LVL471:
+.LVL494:
 	.loc 14 501 0
-	tbnz	w0, #31, .L470
-.LBE1499:
-.LBE1498:
-.LBE1497:
-.LBB1500:
-.LBB1501:
-.LBB1502:
+	tbnz	w0, #31, .L501
+.LBE1611:
+.LBE1610:
+.LBE1609:
+.LBB1612:
+.LBB1613:
+.LBB1614:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC64
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 156
+	add	x2, x19, 160
 	add	x1, x1, :lo12:.LC64
 	bl	of_property_read_variable_u32_array
-.LVL472:
+.LVL495:
 	.loc 14 501 0
-	tbnz	w0, #31, .L470
-.LBE1502:
-.LBE1501:
-.LBE1500:
-.LBB1503:
-.LBB1504:
-.LBB1505:
+	tbnz	w0, #31, .L501
+.LBE1614:
+.LBE1613:
+.LBE1612:
+.LBB1615:
+.LBB1616:
+.LBB1617:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC65
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 160
-	add	x1, x1, :lo12:.LC65
-	bl	of_property_read_variable_u32_array
-.LVL473:
-	.loc 14 501 0
-	tbnz	w0, #31, .L470
-.LBE1505:
-.LBE1504:
-.LBE1503:
-.LBB1506:
-.LBB1507:
-.LBB1508:
-	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC66
-	mov	x4, 0
-	mov	x3, 1
 	add	x2, x19, 164
-	add	x1, x1, :lo12:.LC66
+	add	x1, x1, :lo12:.LC65
 	bl	of_property_read_variable_u32_array
-.LVL474:
+.LVL496:
 	.loc 14 501 0
-	tbnz	w0, #31, .L470
-.LBE1508:
-.LBE1507:
-.LBE1506:
-.LBB1509:
-.LBB1510:
-.LBB1511:
+	tbnz	w0, #31, .L501
+.LBE1617:
+.LBE1616:
+.LBE1615:
+.LBB1618:
+.LBB1619:
+.LBB1620:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC67
+	adrp	x1, .LC66
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 168
-	add	x1, x1, :lo12:.LC67
+	add	x1, x1, :lo12:.LC66
 	bl	of_property_read_variable_u32_array
-.LVL475:
+.LVL497:
 	.loc 14 501 0
-	tbnz	w0, #31, .L470
-.LBE1511:
-.LBE1510:
-.LBE1509:
-.LBB1512:
-.LBB1513:
-.LBB1514:
+	tbnz	w0, #31, .L501
+.LBE1620:
+.LBE1619:
+.LBE1618:
+.LBB1621:
+.LBB1622:
+.LBB1623:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC68
+	adrp	x1, .LC67
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 172
-	add	x1, x1, :lo12:.LC68
+	add	x1, x1, :lo12:.LC67
 	bl	of_property_read_variable_u32_array
-.LVL476:
+.LVL498:
 	.loc 14 501 0
-	tbnz	w0, #31, .L550
-.LBE1514:
-.LBE1513:
-.LBE1512:
-.LBB1515:
-.LBB1516:
-.LBB1517:
+	tbnz	w0, #31, .L581
+.LBE1623:
+.LBE1622:
+.LBE1621:
+.LBB1624:
+.LBB1625:
+.LBB1626:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC31
+	adrp	x1, .LC30
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 176
-	add	x1, x1, :lo12:.LC31
+	add	x1, x1, :lo12:.LC30
 	bl	of_property_read_variable_u32_array
-.LVL477:
+.LVL499:
 	.loc 14 501 0
-	tbnz	w0, #31, .L471
-.L497:
-.LBE1517:
-.LBE1516:
-.LBE1515:
-.LBB1522:
-.LBB1523:
-.LBB1524:
+	tbnz	w0, #31, .L502
+.L528:
+.LBE1626:
+.LBE1625:
+.LBE1624:
+.LBB1631:
+.LBB1632:
+.LBB1633:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC32
+	adrp	x1, .LC31
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 180
-	add	x1, x1, :lo12:.LC32
+	add	x1, x1, :lo12:.LC31
 	bl	of_property_read_variable_u32_array
-.LVL478:
+.LVL500:
 	.loc 14 501 0
-	tbnz	w0, #31, .L472
-.L498:
-.LBE1524:
-.LBE1523:
-.LBE1522:
-.LBB1529:
-.LBB1530:
-.LBB1531:
+	tbnz	w0, #31, .L503
+.L529:
+.LBE1633:
+.LBE1632:
+.LBE1631:
+.LBB1638:
+.LBB1639:
+.LBB1640:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC33
+	adrp	x1, .LC32
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 116
-	add	x1, x1, :lo12:.LC33
+	add	x1, x1, :lo12:.LC32
 	bl	of_property_read_variable_u32_array
-.LVL479:
+.LVL501:
 	.loc 14 501 0
-	tbnz	w0, #31, .L473
-.L499:
-.LBE1531:
-.LBE1530:
-.LBE1529:
-.LBB1536:
-.LBB1537:
-.LBB1538:
+	tbnz	w0, #31, .L504
+.L530:
+.LBE1640:
+.LBE1639:
+.LBE1638:
+.LBB1645:
+.LBB1646:
+.LBB1647:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC34
+	adrp	x1, .LC33
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 120
-	add	x1, x1, :lo12:.LC34
+	add	x1, x1, :lo12:.LC33
 	bl	of_property_read_variable_u32_array
-.LVL480:
+.LVL502:
 	.loc 14 501 0
-	tbnz	w0, #31, .L474
-.L500:
-.LBE1538:
-.LBE1537:
-.LBE1536:
-.LBE1553:
-.LBE1557:
-	.loc 1 2085 0
+	tbnz	w0, #31, .L505
+.L531:
+.LBE1647:
+.LBE1646:
+.LBE1645:
+.LBE1662:
+.LBE1666:
+	.loc 1 2151 0
 	ldr	w0, [x22, 88]
-.LBB1558:
-.LBB1559:
-	.loc 1 1822 0
+.LBB1667:
+.LBB1668:
+	.loc 1 1888 0
 	mov	w2, 0
-.LBE1559:
-.LBE1558:
-	.loc 1 2085 0
+.LBE1668:
+.LBE1667:
+	.loc 1 2151 0
 	str	w0, [x21, 52]
-	.loc 1 2086 0
+	.loc 1 2152 0
 	ldr	w1, [x22, 84]
 	str	w1, [x21, 56]
-	.loc 1 2087 0
+	.loc 1 2155 0
+	tst	x1, 15
+	.loc 1 2153 0
 	mul	w0, w0, w1
-.LBB1583:
-.LBB1578:
-	.loc 1 1822 0
-	adrp	x1, .LC35
-	add	x1, x1, :lo12:.LC35
-.LBE1578:
-.LBE1583:
-	.loc 1 2087 0
+	.loc 1 2155 0
+	cset	w1, eq
+	str	w1, [x21, 72]
+.LBB1692:
+.LBB1687:
+	.loc 1 1888 0
+	adrp	x1, .LC34
+	add	x1, x1, :lo12:.LC34
+.LBE1687:
+.LBE1692:
+	.loc 1 2153 0
 	lsr	w3, w0, 1
-	.loc 1 2088 0
+	.loc 1 2154 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x21, 20]
-.LBB1584:
-.LBB1579:
-	.loc 1 1813 0
+.LBB1693:
+.LBB1688:
+	.loc 1 1879 0
 	ldr	x26, [x19]
-.LVL481:
-	.loc 1 1822 0
+.LVL503:
+	.loc 1 1888 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL482:
-	.loc 1 1823 0
-	cbz	x0, .L507
-	.loc 1 1826 0
+.LVL504:
+	.loc 1 1889 0
+	cbz	x0, .L538
+	.loc 1 1892 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL483:
+.LVL505:
 	mov	w24, w0
-	.loc 1 1828 0
-	cbnz	w0, .L551
-.LBB1560:
-.LBB1561:
+	.loc 1 1894 0
+	cbnz	w0, .L582
+.LBB1669:
+.LBB1670:
 	.file 15 "./include/linux/ioport.h"
 	.loc 15 204 0
 	ldp	x1, x2, [x29, 104]
-.LBE1561:
-.LBE1560:
-	.loc 1 1833 0
+.LBE1670:
+.LBE1669:
+	.loc 1 1899 0
 	str	x1, [x19, 184]
-	.loc 1 1836 0
+	.loc 1 1902 0
 	mov	x3, 1
 	mov	x0, x26
-.LBB1563:
-.LBB1562:
+.LBB1672:
+.LBB1671:
 	.loc 15 204 0
 	add	x2, x2, 1
 	sub	x2, x2, x1
-.LBE1562:
-.LBE1563:
-	.loc 1 1834 0
+.LBE1671:
+.LBE1672:
+	.loc 1 1900 0
 	str	w2, [x21, 16]
-	.loc 1 1836 0
+	.loc 1 1902 0
 	sxtw	x2, w2
 	bl	devm_memremap
-.LVL484:
+.LVL506:
 	str	x0, [x21, 8]
-	.loc 1 1838 0
-	cbz	x0, .L478
-	.loc 1 1846 0
+	.loc 1 1904 0
+	cbz	x0, .L509
+	.loc 1 1912 0
 	mov	x1, x0
 	ldr	w2, [x21, 16]
 	ldr	x0, [x19, 184]
 	mov	w4, 4
 	mov	w3, 2097152
 	bl	ebc_buf_init
-.LVL485:
-	.loc 1 1847 0
-	cbnz	w0, .L478
-	.loc 1 1852 0
+.LVL507:
+	.loc 1 1913 0
+	cbnz	w0, .L509
+	.loc 1 1918 0
 	ldr	x0, [x21, 8]
-	.loc 1 1853 0
+	.loc 1 1919 0
 	mov	x5, 1048576
 	str	x5, [x22, 40]
-.LBB1564:
-.LBB1565:
+.LBB1673:
+.LBB1674:
 	.loc 2 711 0
 	mov	w2, 32960
-.LBE1565:
-.LBE1564:
-	.loc 1 1852 0
+.LBE1674:
+.LBE1673:
+	.loc 1 1918 0
 	add	x6, x0, 10485760
 	str	x6, [x22, 24]
 	add	x4, x0, 11534336
-	.loc 1 1858 0
+	.loc 1 1924 0
 	add	x1, x0, 12582912
-	.loc 1 1854 0
+	.loc 1 1920 0
 	ldr	x3, [x19, 184]
-.LBB1569:
-.LBB1566:
+.LBB1678:
+.LBB1675:
 	.loc 2 711 0
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
-.LBE1566:
-.LBE1569:
-	.loc 1 1854 0
+.LBE1675:
+.LBE1678:
+	.loc 1 1920 0
 	add	x7, x3, 10485760
 	str	x7, [x22, 32]
-	.loc 1 1855 0
+	.loc 1 1921 0
 	str	x6, [x21, 168]
-	.loc 1 1854 0
+	.loc 1 1920 0
 	add	x3, x3, 11534336
-	.loc 1 1853 0
+	.loc 1 1919 0
 	str	x5, [x22, 64]
-	.loc 1 1854 0
+	.loc 1 1920 0
 	stp	x4, x3, [x22, 48]
-	.loc 1 1858 0
+	.loc 1 1924 0
 	str	x1, [x21, 112]
-.LBB1570:
-.LBB1567:
+.LBB1679:
+.LBB1676:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
-.LBE1567:
-.LBE1570:
-	.loc 1 1855 0
+.LBE1676:
+.LBE1679:
+	.loc 1 1921 0
 	str	x4, [x21, 176]
-.LBB1571:
-.LBB1568:
+.LBB1680:
+.LBB1677:
 	.loc 2 711 0
 	bl	devm_kmalloc
-.LVL486:
-.LBE1568:
-.LBE1571:
-	.loc 1 1861 0
+.LVL508:
+.LBE1677:
+.LBE1680:
+	.loc 1 1927 0
 	str	x0, [x21, 128]
-	.loc 1 1862 0
-	cbz	x0, .L478
-.LBB1572:
-.LBB1573:
+	.loc 1 1928 0
+	cbz	x0, .L509
+.LBB1681:
+.LBB1682:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL487:
-.LBE1573:
-.LBE1572:
-	.loc 1 1864 0
+.LVL509:
+.LBE1682:
+.LBE1681:
+	.loc 1 1930 0
 	str	x0, [x21, 136]
-	.loc 1 1865 0
-	cbz	x0, .L478
-.LBB1574:
-.LBB1575:
+	.loc 1 1931 0
+	cbz	x0, .L509
+.LBB1683:
+.LBB1684:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL488:
-.LBE1575:
-.LBE1574:
-	.loc 1 1867 0
+.LVL510:
+.LBE1684:
+.LBE1683:
+	.loc 1 1933 0
 	str	x0, [x21, 144]
-	.loc 1 1868 0
-	cbz	x0, .L478
-	.loc 1 1875 0
+	.loc 1 1934 0
+	cbz	x0, .L509
+	.loc 1 1941 0
 	ldp	w1, w0, [x22, 84]
-.LBB1576:
-.LBB1577:
+.LBB1685:
+.LBB1686:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	mul	w1, w1, w0
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL489:
-.LBE1577:
-.LBE1576:
-	.loc 1 1875 0
+.LVL511:
+.LBE1686:
+.LBE1685:
+	.loc 1 1941 0
 	str	x0, [x21, 152]
-	.loc 1 1876 0
-	cbz	x0, .L478
-	.loc 1 1878 0
+	.loc 1 1942 0
+	cbz	x0, .L509
+	.loc 1 1944 0
 	ldp	w2, w1, [x22, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
-.LVL490:
-	.loc 1 1879 0
+.LVL512:
+	.loc 1 1945 0
 	ldrsw	x2, [x21, 20]
 	mov	w1, 255
 	ldr	x0, [x21, 144]
 	bl	memset
-.LVL491:
-.LBE1579:
-.LBE1584:
-.LBB1585:
-.LBB1586:
-	.loc 1 1773 0
+.LVL513:
+.LBE1688:
+.LBE1693:
+.LBB1694:
+.LBB1695:
+	.loc 1 1839 0
 	ldr	x26, [x19, 272]
-.LVL492:
-	.loc 1 1779 0
-	adrp	x1, .LC37
+.LVL514:
+	.loc 1 1845 0
+	adrp	x1, .LC36
 	mov	w2, 0
-	add	x1, x1, :lo12:.LC37
+	add	x1, x1, :lo12:.LC36
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL493:
-	.loc 1 1780 0
-	cbz	x0, .L508
-	.loc 1 1783 0
+.LVL515:
+	.loc 1 1846 0
+	cbz	x0, .L539
+	.loc 1 1849 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL494:
+.LVL516:
 	mov	w24, w0
-	.loc 1 1785 0
-	cbz	w0, .L552
-.L479:
-.LBE1586:
-.LBE1585:
-	.loc 1 2100 0
-	adrp	x1, .LC70
+	.loc 1 1851 0
+	cbz	w0, .L583
+.L510:
+.LBE1695:
+.LBE1694:
+	.loc 1 2167 0
+	adrp	x1, .LC69
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC70
+	add	x1, x1, :lo12:.LC69
 	bl	_dev_err
-.LVL495:
-	.loc 1 2101 0
-	b	.L461
-.LVL496:
+.LVL517:
+	.loc 1 2168 0
+	b	.L492
+.LVL518:
 	.p2align 3
-.L470:
-	.loc 1 2083 0
+.L501:
+	.loc 1 2149 0
 	mov	w24, -22
-	.loc 1 2082 0
-	adrp	x1, .LC74
+	.loc 1 2148 0
+	adrp	x1, .LC73
 	mov	w2, w24
-	add	x1, x1, :lo12:.LC74
+	add	x1, x1, :lo12:.LC73
 	mov	x0, x20
 	bl	_dev_err
-.LVL497:
-.L461:
-	.loc 1 2125 0
+.LVL519:
+.L492:
+	.loc 1 2192 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w24
-.LVL498:
+.LVL520:
 	ldr	x2, [x29, 200]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L553
+	cbnz	x1, .L584
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL499:
+.LVL521:
 	ldp	x23, x24, [sp, 48]
 	ldp	x25, x26, [sp, 64]
-.LVL500:
+.LVL522:
 	ldp	x27, x28, [sp, 80]
-.LVL501:
+.LVL523:
 	ldp	x29, x30, [sp], 208
 	.cfi_remember_state
 	.cfi_restore 30
@@ -5802,251 +6185,251 @@ ebc_probe:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL502:
+.LVL524:
 	.p2align 3
-.L551:
+.L582:
 	.cfi_restore_state
-.LBB1593:
-.LBB1580:
-	.loc 1 1829 0
-	adrp	x1, .LC36
+.LBB1702:
+.LBB1689:
+	.loc 1 1895 0
+	adrp	x1, .LC35
 	mov	x0, x26
-	add	x1, x1, :lo12:.LC36
+	add	x1, x1, :lo12:.LC35
 	bl	_dev_err
-.LVL503:
-.L475:
-.LBE1580:
-.LBE1593:
-	.loc 1 2093 0
-	adrp	x1, .LC69
+.LVL525:
+.L506:
+.LBE1689:
+.LBE1702:
+	.loc 1 2160 0
+	adrp	x1, .LC68
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC69
+	add	x1, x1, :lo12:.LC68
 	bl	_dev_err
-.LVL504:
-	.loc 1 2094 0
-	b	.L461
-.LVL505:
+.LVL526:
+	.loc 1 2161 0
+	b	.L492
+.LVL527:
 	.p2align 3
-.L474:
-.LBB1594:
-.LBB1554:
-	.loc 1 1422 0
+.L505:
+.LBB1703:
+.LBB1663:
+	.loc 1 1488 0
 	str	wzr, [x22, 96]
-	b	.L500
+	b	.L531
 	.p2align 3
-.L473:
-.LBB1543:
-.LBB1541:
-.LBB1539:
+.L504:
+.LBB1652:
+.LBB1650:
+.LBB1648:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC34
-.LBE1539:
-.LBE1541:
-.LBE1543:
-	.loc 1 1419 0
+	adrp	x1, .LC33
+.LBE1648:
+.LBE1650:
+.LBE1652:
+	.loc 1 1485 0
 	str	wzr, [x22, 92]
-.LBB1544:
-.LBB1542:
-.LBB1540:
+.LBB1653:
+.LBB1651:
+.LBB1649:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 120
-	add	x1, x1, :lo12:.LC34
+	add	x1, x1, :lo12:.LC33
 	bl	of_property_read_variable_u32_array
-.LVL506:
+.LVL528:
 	.loc 14 501 0
-	tbz	w0, #31, .L500
-	b	.L474
+	tbz	w0, #31, .L531
+	b	.L505
 	.p2align 3
-.L472:
-.LBE1540:
-.LBE1542:
-.LBE1544:
-.LBB1545:
-.LBB1534:
-.LBB1532:
+.L503:
+.LBE1649:
+.LBE1651:
+.LBE1653:
+.LBB1654:
+.LBB1643:
+.LBB1641:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC33
-.LBE1532:
-.LBE1534:
-.LBE1545:
-	.loc 1 1416 0
+	adrp	x1, .LC32
+.LBE1641:
+.LBE1643:
+.LBE1654:
+	.loc 1 1482 0
 	str	wzr, [x22, 156]
-.LBB1546:
-.LBB1535:
-.LBB1533:
+.LBB1655:
+.LBB1644:
+.LBB1642:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 116
-	add	x1, x1, :lo12:.LC33
+	add	x1, x1, :lo12:.LC32
 	bl	of_property_read_variable_u32_array
-.LVL507:
+.LVL529:
 	.loc 14 501 0
-	tbz	w0, #31, .L499
-	b	.L473
+	tbz	w0, #31, .L530
+	b	.L504
 	.p2align 3
-.L471:
-.LBE1533:
-.LBE1535:
-.LBE1546:
-.LBB1547:
-.LBB1527:
-.LBB1525:
+.L502:
+.LBE1642:
+.LBE1644:
+.LBE1655:
+.LBB1656:
+.LBB1636:
+.LBB1634:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC32
-.LBE1525:
-.LBE1527:
-.LBE1547:
-	.loc 1 1413 0
+	adrp	x1, .LC31
+.LBE1634:
+.LBE1636:
+.LBE1656:
+	.loc 1 1479 0
 	str	wzr, [x22, 152]
-.LBB1548:
-.LBB1528:
-.LBB1526:
+.LBB1657:
+.LBB1637:
+.LBB1635:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 180
-	add	x1, x1, :lo12:.LC32
+	add	x1, x1, :lo12:.LC31
 	bl	of_property_read_variable_u32_array
-.LVL508:
+.LVL530:
 	.loc 14 501 0
-	tbz	w0, #31, .L498
-	b	.L472
+	tbz	w0, #31, .L529
+	b	.L503
 	.p2align 3
-.L550:
-.LBE1526:
-.LBE1528:
-.LBE1548:
-.LBB1549:
-.LBB1520:
-.LBB1518:
+.L581:
+.LBE1635:
+.LBE1637:
+.LBE1657:
+.LBB1658:
+.LBB1629:
+.LBB1627:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC31
-.LBE1518:
-.LBE1520:
-.LBE1549:
-	.loc 1 1410 0
+	adrp	x1, .LC30
+.LBE1627:
+.LBE1629:
+.LBE1658:
+	.loc 1 1476 0
 	str	wzr, [x22, 148]
-.LBB1550:
-.LBB1521:
-.LBB1519:
+.LBB1659:
+.LBB1630:
+.LBB1628:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 176
-	add	x1, x1, :lo12:.LC31
+	add	x1, x1, :lo12:.LC30
 	bl	of_property_read_variable_u32_array
-.LVL509:
+.LVL531:
 	.loc 14 501 0
-	tbz	w0, #31, .L497
-	b	.L471
-.LVL510:
+	tbz	w0, #31, .L528
+	b	.L502
+.LVL532:
 	.p2align 3
-.L552:
-.LBE1519:
-.LBE1521:
-.LBE1550:
-.LBE1554:
-.LBE1594:
-.LBB1595:
-.LBB1589:
-	.loc 1 1791 0
+.L583:
+.LBE1628:
+.LBE1630:
+.LBE1659:
+.LBE1663:
+.LBE1703:
+.LBB1704:
+.LBB1698:
+	.loc 1 1857 0
 	mov	x0, x26
 	mov	x3, 1
-.LBB1587:
-.LBB1588:
+.LBB1696:
+.LBB1697:
 	.loc 15 204 0
 	ldp	x1, x26, [x29, 104]
-.LVL511:
+.LVL533:
 	add	x26, x26, 1
 	sub	x26, x26, x1
-.LBE1588:
-.LBE1587:
-	.loc 1 1791 0
+.LBE1697:
+.LBE1696:
+	.loc 1 1857 0
 	sxtw	x2, w26
 	bl	devm_memremap
-.LVL512:
+.LVL534:
 	str	x0, [x19, 376]
-	.loc 1 1793 0
-	cbz	x0, .L554
-	.loc 1 1798 0
+	.loc 1 1859 0
+	cbz	x0, .L585
+	.loc 1 1864 0
 	bl	epd_lut_from_mem_init
-.LVL513:
-	.loc 1 1799 0
-	tbnz	w0, #31, .L555
-.L481:
-.LBE1589:
-.LBE1595:
-.LBB1596:
-.LBB1597:
-	.loc 1 1888 0
+.LVL535:
+	.loc 1 1865 0
+	tbnz	w0, #31, .L586
+.L512:
+.LBE1698:
+.LBE1704:
+.LBB1705:
+.LBB1706:
+	.loc 1 1954 0
 	add	x0, x19, 736
 	mov	x1, 68719476704
 	str	x1, [x21, 544]
-	.loc 1 1890 0
+	.loc 1 1956 0
 	add	x25, x25, :lo12:.LANCHOR0
-.LBB1598:
-.LBB1599:
-.LBB1600:
-.LBB1601:
-.LBB1602:
-	.loc 12 234 0
+.LBB1707:
+.LBB1708:
+.LBB1709:
+.LBB1710:
+.LBB1711:
+	.loc 12 288 0
 	str	x0, [x19, 736]
-.LBE1602:
-.LBE1601:
-.LBE1600:
-.LBE1599:
-.LBE1598:
-	.loc 1 1886 0
+.LBE1711:
+.LBE1710:
+.LBE1709:
+.LBE1708:
+.LBE1707:
+	.loc 1 1952 0
 	mov	w26, 99
-.LBB1604:
-.LBB1603:
+.LBB1713:
+.LBB1712:
 	.file 16 "./include/linux/list.h"
 	.loc 16 29 0
 	str	x0, [x0, 8]
-.LBE1603:
-.LBE1604:
-	.loc 1 1888 0
+.LBE1712:
+.LBE1713:
+	.loc 1 1954 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x21, 568]
-	.loc 1 1890 0
-	adrp	x3, .LC71
+	.loc 1 1956 0
+	adrp	x3, .LC70
 	mov	w2, -1
-	add	x3, x3, :lo12:.LC71
+	add	x3, x3, :lo12:.LC70
 	mov	x1, x21
 	adrp	x0, ebc_auto_tast_function
-	.loc 1 1886 0
+	.loc 1 1952 0
 	str	w26, [x29, 104]
-	.loc 1 1890 0
+	.loc 1 1956 0
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
-.LVL514:
+.LVL536:
 	str	x0, [x25, 8]
-	.loc 1 1891 0
+	.loc 1 1957 0
 	cmn	x0, #4096
-	bhi	.L556
-	.loc 1 1895 0
+	bhi	.L587
+	.loc 1 1961 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
-.LVL515:
-	.loc 1 1896 0
+.LVL537:
+	.loc 1 1962 0
 	ldr	x2, [x25, 8]
-.LBB1605:
-.LBB1606:
+.LBB1714:
+.LBB1715:
 	.file 17 "./arch/arm64/include/asm/atomic_lse.h"
 	.loc 17 47 0
 	mov	w0, 1
-.LVL516:
+.LVL538:
 	add	x1, x2, 48
-.LVL517:
+.LVL539:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -6074,49 +6457,49 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL518:
+.LVL540:
 #NO_APP
-.LBE1606:
-.LBE1605:
-.LBB1607:
-	.loc 1 1899 0
-	adrp	x3, .LC42
+.LBE1715:
+.LBE1714:
+.LBB1716:
+	.loc 1 1965 0
+	adrp	x3, .LC41
 	adrp	x0, ebc_thread
-.LVL519:
-	add	x3, x3, :lo12:.LC42
+.LVL541:
+	add	x3, x3, :lo12:.LC41
 	mov	w2, -1
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x21
-.LBE1607:
-	.loc 1 1898 0
+.LBE1716:
+	.loc 1 1964 0
 	str	w26, [x29, 104]
-.LBB1608:
-	.loc 1 1899 0
+.LBB1717:
+	.loc 1 1965 0
 	bl	kthread_create_on_node
-.LVL520:
+.LVL542:
 	mov	x25, x0
-.LVL521:
+.LVL543:
 	cmn	x0, #4096
-	bhi	.L483
+	bhi	.L514
 	bl	wake_up_process
-.LVL522:
-.LBE1608:
+.LVL544:
+.LBE1717:
 	str	x25, [x21, 120]
-	.loc 1 1904 0
+	.loc 1 1970 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x25
 	bl	sched_setscheduler_nocheck
-.LVL523:
-	.loc 1 1905 0
+.LVL545:
+	.loc 1 1971 0
 	ldr	x2, [x21, 120]
-.LBB1609:
-.LBB1610:
+.LBB1718:
+.LBB1719:
 	.loc 17 47 0
 	mov	w0, 1
-.LVL524:
+.LVL546:
 	add	x1, x2, 48
-.LVL525:
+.LVL547:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -6144,62 +6527,62 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL526:
+.LVL548:
 #NO_APP
-.LBE1610:
-.LBE1609:
-.LBE1597:
-.LBE1596:
-.LBB1613:
-.LBB1614:
-	.loc 1 1914 0
+.LBE1719:
+.LBE1718:
+.LBE1706:
+.LBE1705:
+.LBB1722:
+.LBB1723:
+	.loc 1 1980 0
 	mov	w0, -1
-.LVL527:
+.LVL549:
 	str	w0, [x21, 48]
-.LBB1615:
-.LBB1616:
+.LBB1724:
+.LBB1725:
 	.loc 4 39 0
 	add	x0, x19, 400
-.LVL528:
-.LBE1616:
-.LBE1615:
-	.loc 1 1918 0
+.LVL550:
+.LBE1725:
+.LBE1724:
+	.loc 1 1984 0
 	str	wzr, [x21, 28]
-	.loc 1 1917 0
+	.loc 1 1983 0
 	str	wzr, [x21, 80]
-.LBB1621:
-.LBB1617:
-	.loc 4 43 0
-	adrp	x1, .LC43
-.LBE1617:
-.LBE1621:
-	.loc 1 1913 0
-	str	wzr, [x21, 184]
-.LBB1622:
-.LBB1618:
+.LBB1730:
+.LBB1726:
 	.loc 4 43 0
-	add	x1, x1, :lo12:.LC43
-.LBE1618:
-.LBE1622:
-	.loc 1 1915 0
+	adrp	x1, .LC42
+.LBE1726:
+.LBE1730:
+	.loc 1 1979 0
+	str	wzr, [x21, 184]
+.LBB1731:
+.LBB1727:
+	.loc 4 43 0
+	add	x1, x1, :lo12:.LC42
+.LBE1727:
+.LBE1731:
+	.loc 1 1981 0
 	str	wzr, [x21, 592]
-	.loc 1 1925 0
+	.loc 1 1991 0
 	add	x25, x19, 616
-.LVL529:
-	.loc 1 1916 0
+.LVL551:
+	.loc 1 1982 0
 	str	wzr, [x21, 596]
-	.loc 1 1926 0
+	.loc 1 1992 0
 	adrp	x26, jiffies
-.LBB1623:
-.LBB1619:
+.LBB1732:
+.LBB1728:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0]
-.LBE1619:
-.LBE1623:
-	.loc 1 1926 0
+.LBE1728:
+.LBE1732:
+	.loc 1 1992 0
 	mov	x27, 268435455
-.LBB1624:
-.LBB1620:
+.LBB1733:
+.LBB1729:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0, 16]
 	stp	xzr, xzr, [x0, 32]
@@ -6217,12 +6600,12 @@ ebc_probe:
 	str	x1, [x19, 400]
 	.loc 4 45 0
 	bl	wakeup_source_add
-.LVL530:
-.LBE1620:
-.LBE1624:
-	.loc 1 1922 0
+.LVL552:
+.LBE1729:
+.LBE1733:
+	.loc 1 1988 0
 	str	wzr, [x21, 424]
-	.loc 1 1925 0
+	.loc 1 1991 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -6230,17 +6613,17 @@ ebc_probe:
 	adrp	x1, ebc_vdd_power_timeout
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
-.LVL531:
-	.loc 1 1926 0
+.LVL553:
+	.loc 1 1992 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
-	.loc 1 1929 0
+	.loc 1 1995 0
 	add	x25, x19, 672
-	.loc 1 1926 0
+	.loc 1 1992 0
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL532:
-	.loc 1 1929 0
+.LVL554:
+	.loc 1 1995 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -6248,633 +6631,633 @@ ebc_probe:
 	adrp	x1, ebc_frame_timeout
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
-.LVL533:
-	.loc 1 1930 0
+.LVL555:
+	.loc 1 1996 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL534:
-.LBE1614:
-.LBE1613:
-.LBB1625:
-.LBB1626:
-	.loc 1 1940 0
+.LVL556:
+.LBE1723:
+.LBE1722:
+.LBB1734:
+.LBB1735:
+	.loc 1 2006 0
 	adrp	x0, saved_command_line
-	adrp	x1, .LC44
-	.loc 1 1937 0
+	adrp	x1, .LC43
+	.loc 1 2003 0
 	stp	wzr, wzr, [x29, 100]
-.LVL535:
-	.loc 1 1940 0
-	add	x1, x1, :lo12:.LC44
+.LVL557:
+	.loc 1 2006 0
+	add	x1, x1, :lo12:.LC43
 	ldr	x25, [x0, #:lo12:saved_command_line]
 	mov	x0, x25
 	bl	strstr
-.LVL536:
-	.loc 1 1941 0
-	adrp	x1, .LC45
-	.loc 1 1940 0
+.LVL558:
+	.loc 1 2007 0
+	adrp	x1, .LC44
+	.loc 1 2006 0
 	mov	x26, x0
-.LVL537:
-	.loc 1 1941 0
-	add	x1, x1, :lo12:.LC45
+.LVL559:
+	.loc 1 2007 0
+	add	x1, x1, :lo12:.LC44
 	mov	x0, x25
 	bl	strstr
-.LVL538:
+.LVL560:
 	mov	x28, x0
-.LVL539:
-	.loc 1 1946 0
-	cbz	x26, .L484
-	.loc 1 1947 0
+.LVL561:
+	.loc 1 2012 0
+	cbz	x26, .L515
+	.loc 1 2013 0
 	add	x2, x29, 100
-	adrp	x1, .LC46
+	adrp	x1, .LC45
 	mov	x0, x26
-	add	x1, x1, :lo12:.LC46
+	add	x1, x1, :lo12:.LC45
 	bl	sscanf
-.LVL540:
-	.loc 1 1948 0
+.LVL562:
+	.loc 1 2014 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
-	bls	.L557
-.L484:
-	.loc 1 1960 0
+	bls	.L588
+.L515:
+	.loc 1 2026 0
 	mov	w25, 0
-.LVL541:
+.LVL563:
 	mov	x27, 0
-.LVL542:
-	.loc 1 1944 0
+.LVL564:
+	.loc 1 2010 0
 	mov	x26, 0
-.LVL543:
-	.loc 1 1960 0
-	cbz	x28, .L504
-.LVL544:
-.L503:
-	.loc 1 1961 0
+.LVL565:
+	.loc 1 2026 0
+	cbz	x28, .L535
+.LVL566:
+.L534:
+	.loc 1 2027 0
 	add	x2, x29, 104
 	mov	x0, x28
-	adrp	x1, .LC49
-	add	x1, x1, :lo12:.LC49
+	adrp	x1, .LC48
+	add	x1, x1, :lo12:.LC48
 	bl	sscanf
-.LVL545:
-	.loc 1 1939 0
+.LVL567:
+	.loc 1 2005 0
 	mov	w28, 0
-.LVL546:
-	.loc 1 1962 0
+.LVL568:
+	.loc 1 2028 0
 	ldr	w2, [x29, 104]
-	.loc 1 1944 0
+	.loc 1 2010 0
 	mov	x26, 0
-.LVL547:
-	.loc 1 1962 0
+.LVL569:
+	.loc 1 2028 0
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
-	bls	.L558
-.L488:
-	.loc 1 1974 0
-	cbnz	w25, .L487
-.LVL548:
-.L504:
-	.loc 1 1975 0
+	bls	.L589
+.L519:
+	.loc 1 2040 0
+	cbnz	w25, .L518
+.LVL570:
+.L535:
+	.loc 1 2041 0
 	ldr	x0, [x21, 88]
-	adrp	x1, .LC52
-	add	x1, x1, :lo12:.LC52
+	adrp	x1, .LC51
+	add	x1, x1, :lo12:.LC51
 	bl	_dev_info
-.LVL549:
-	.loc 1 1976 0
+.LVL571:
+	.loc 1 2042 0
 	ldr	x0, [x19, 16]
 	bl	ebc_pmic_verity_vcom
-.LVL550:
-.LBB1627:
-.LBB1628:
-	.loc 1 1330 0
+.LVL572:
+.LBB1736:
+.LBB1737:
+	.loc 1 1396 0
 	bl	ebc_empty_buf_get
-.LVL551:
+.LVL573:
 	mov	x25, x0
-.LVL552:
-	.loc 1 1331 0
+.LVL574:
+	.loc 1 1397 0
 	ldp	w2, w0, [x19, 108]
 	mov	w1, 255
 	mul	w2, w2, w0
 	ldr	x0, [x25, 16]
 	lsr	w2, w2, 1
 	bl	memset
-.LVL553:
-	.loc 1 1334 0
+.LVL575:
+	.loc 1 1400 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1332 0
-	mov	w0, 14
+	.loc 1 1398 0
+	mov	w0, 16
 	str	w0, [x25, 40]
-	.loc 1 1337 0
+	.loc 1 1403 0
 	mov	x0, x25
-	.loc 1 1335 0
+	.loc 1 1401 0
 	ldr	w1, [x19, 108]
 	str	w1, [x25, 56]
-	.loc 1 1336 0
+	.loc 1 1402 0
 	ldr	w1, [x19, 112]
 	str	w1, [x25, 60]
-	.loc 1 1337 0
+	.loc 1 1403 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL554:
-.L490:
-.LBE1628:
-.LBE1627:
-	.loc 1 1993 0
-	cbnz	w28, .L559
-.L492:
-	.loc 1 2006 0
+.LVL576:
+.L521:
+.LBE1737:
+.LBE1736:
+	.loc 1 2059 0
+	cbnz	w28, .L590
+.L523:
+	.loc 1 2072 0
 	ldr	w0, [x21, 80]
 	adrp	x22, .LANCHOR1
-	cbz	w0, .L560
-.L494:
-	.loc 1 2011 0
-	cbz	x27, .L495
-	.loc 1 2012 0
+	cbz	w0, .L591
+.L525:
+	.loc 1 2077 0
+	cbz	x27, .L526
+	.loc 1 2078 0
 	mov	x0, x27
 	bl	kfree
-.LVL555:
-.L495:
-	.loc 1 2013 0
-	cbz	x26, .L486
-	.loc 1 2014 0
+.LVL577:
+.L526:
+	.loc 1 2079 0
+	cbz	x26, .L517
+	.loc 1 2080 0
 	mov	x0, x26
 	bl	kfree
-.LVL556:
-.L486:
-.LBE1626:
-.LBE1625:
-.LBB1638:
-.LBB1639:
-.LBB1640:
+.LVL578:
+.L517:
+.LBE1735:
+.LBE1734:
+.LBB1747:
+.LBB1748:
+.LBB1749:
 	.loc 2 1186 0
 	str	x19, [x20, 184]
-.LBE1640:
-.LBE1639:
-.LBE1638:
-.LBB1641:
-.LBB1642:
-	.loc 1 1758 0
+.LBE1749:
+.LBE1748:
+.LBE1747:
+.LBB1750:
+.LBB1751:
+	.loc 1 1824 0
 	add	x22, x22, :lo12:.LANCHOR1
 	add	x0, x22, 224
 	bl	misc_register
-.LVL557:
-	.loc 1 1760 0
+.LVL579:
+	.loc 1 1826 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 400
 	bl	device_create_file
-.LVL558:
-	.loc 1 1761 0
+.LVL580:
+	.loc 1 1827 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 432
 	bl	device_create_file
-.LVL559:
-	.loc 1 1762 0
+.LVL581:
+	.loc 1 1828 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 464
 	bl	device_create_file
-.LVL560:
-	.loc 1 1763 0
+.LVL582:
+	.loc 1 1829 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 496
 	bl	device_create_file
-.LVL561:
-	.loc 1 1764 0
+.LVL583:
+	.loc 1 1830 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 528
 	bl	device_create_file
-.LVL562:
-	.loc 1 1765 0
+.LVL584:
+	.loc 1 1831 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 560
 	bl	device_create_file
-.LVL563:
-.LBE1642:
-.LBE1641:
-	.loc 1 2122 0
+.LVL585:
+.LBE1751:
+.LBE1750:
+	.loc 1 2189 0
 	ldr	x0, [x21, 88]
 	adrp	x2, .LC15
-	adrp	x1, .LC53
+	adrp	x1, .LC52
 	add	x2, x2, :lo12:.LC15
-	add	x1, x1, :lo12:.LC53
+	add	x1, x1, :lo12:.LC52
 	bl	_dev_info
-.LVL564:
-	.loc 1 2124 0
-	b	.L461
-.LVL565:
+.LVL586:
+	.loc 1 2191 0
+	b	.L492
+.LVL587:
 	.p2align 3
-.L557:
-.LBB1643:
-.LBB1635:
-	.loc 1 1950 0
+.L588:
+.LBB1752:
+.LBB1744:
+	.loc 1 2016 0
 	ldr	x0, [x21, 88]
-	adrp	x1, .LC47
-	add	x1, x1, :lo12:.LC47
+	adrp	x1, .LC46
+	add	x1, x1, :lo12:.LC46
 	bl	_dev_info
-.LVL566:
-	.loc 1 1951 0
+.LVL588:
+	.loc 1 2017 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
-.LBB1629:
-.LBB1630:
-.LBB1631:
+.LBB1738:
+.LBB1739:
+.LBB1740:
 	.file 18 "./include/linux/slab.h"
 	.loc 18 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL567:
+.LVL589:
 	mov	x27, x0
-.LVL568:
-.LBE1631:
-.LBE1630:
-.LBE1629:
-	.loc 1 1952 0
-	cbz	x0, .L561
-	.loc 1 1956 0
+.LVL590:
+.LBE1740:
+.LBE1739:
+.LBE1738:
+	.loc 1 2018 0
+	cbz	x0, .L592
+	.loc 1 2022 0
 	ldp	w2, w1, [x22, 84]
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 100]
-.LVL569:
+.LVL591:
 	sub	x1, x1, x3
-.LVL570:
+.LVL592:
 	ldr	x3, [x21, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL571:
-	.loc 1 1960 0
-	cbnz	x28, .L562
-	.loc 1 1939 0
+.LVL593:
+	.loc 1 2026 0
+	cbnz	x28, .L593
+	.loc 1 2005 0
 	mov	w28, 0
-.LVL572:
-	.loc 1 1944 0
+.LVL594:
+	.loc 1 2010 0
 	mov	x26, 0
-.LVL573:
-.L487:
-	.loc 1 1981 0
+.LVL595:
+.L518:
+	.loc 1 2047 0
 	bl	ebc_empty_buf_get
-.LVL574:
+.LVL596:
 	mov	x25, x0
-.LVL575:
-	.loc 1 1982 0
-	cbz	x0, .L490
-	.loc 1 1983 0
+.LVL597:
+	.loc 1 2048 0
+	cbz	x0, .L521
+	.loc 1 2049 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
 	ldr	x0, [x25, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL576:
-	.loc 1 1986 0
+.LVL598:
+	.loc 1 2052 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1984 0
+	.loc 1 2050 0
 	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 1989 0
+	.loc 1 2055 0
 	mov	x0, x25
-	.loc 1 1987 0
+	.loc 1 2053 0
 	ldr	w1, [x22, 84]
 	str	w1, [x25, 56]
-	.loc 1 1988 0
+	.loc 1 2054 0
 	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 1989 0
+	.loc 1 2055 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL577:
-	b	.L490
-.LVL578:
+.LVL599:
+	b	.L521
+.LVL600:
 	.p2align 3
-.L560:
-	.loc 1 2007 0
+.L591:
+	.loc 1 2073 0
 	mov	w2, 1
 	str	w2, [x21, 80]
-	.loc 1 2008 0
+	.loc 1 2074 0
 	add	x0, x22, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL579:
-	b	.L494
-.LVL580:
+.LVL601:
+	b	.L525
+.LVL602:
 	.p2align 3
-.L558:
-	.loc 1 1964 0
+.L589:
+	.loc 1 2030 0
 	ldr	x0, [x21, 88]
-	adrp	x1, .LC50
-	add	x1, x1, :lo12:.LC50
+	adrp	x1, .LC49
+	add	x1, x1, :lo12:.LC49
 	bl	_dev_info
-.LVL581:
-	.loc 1 1965 0
+.LVL603:
+	.loc 1 2031 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
-.LBB1632:
-.LBB1633:
-.LBB1634:
+.LBB1741:
+.LBB1742:
+.LBB1743:
 	.loc 18 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL582:
+.LVL604:
 	mov	x26, x0
-.LBE1634:
-.LBE1633:
-.LBE1632:
-	.loc 1 1966 0
-	cbz	x0, .L563
-	.loc 1 1970 0
+.LBE1743:
+.LBE1742:
+.LBE1741:
+	.loc 1 2032 0
+	cbz	x0, .L594
+	.loc 1 2036 0
 	ldp	w2, w1, [x22, 84]
-	.loc 1 1963 0
+	.loc 1 2029 0
 	mov	w28, 1
-	.loc 1 1970 0
+	.loc 1 2036 0
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
-.LVL583:
+.LVL605:
 	sub	x1, x1, x3
-.LVL584:
+.LVL606:
 	ldr	x3, [x21, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL585:
-	b	.L488
-.LVL586:
+.LVL607:
+	b	.L519
+.LVL608:
 	.p2align 3
-.L478:
-.LBE1635:
-.LBE1643:
-.LBB1644:
-.LBB1581:
-	.loc 1 1839 0
+.L509:
+.LBE1744:
+.LBE1752:
+.LBB1753:
+.LBB1690:
+	.loc 1 1905 0
 	mov	w24, -12
-	b	.L475
-.LVL587:
+	b	.L506
+.LVL609:
 	.p2align 3
-.L559:
-.LBE1581:
-.LBE1644:
-.LBB1645:
-.LBB1636:
-	.loc 1 1994 0
+.L590:
+.LBE1690:
+.LBE1753:
+.LBB1754:
+.LBB1745:
+	.loc 1 2060 0
 	bl	ebc_empty_buf_get
-.LVL588:
+.LVL610:
 	mov	x25, x0
-.LVL589:
-	.loc 1 1995 0
-	cbz	x0, .L492
-	.loc 1 1996 0
+.LVL611:
+	.loc 1 2061 0
+	cbz	x0, .L523
+	.loc 1 2062 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
 	ldr	x0, [x25, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL590:
-	.loc 1 1999 0
+.LVL612:
+	.loc 1 2065 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1997 0
+	.loc 1 2063 0
 	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 2000 0
+	.loc 1 2066 0
 	ldr	w0, [x22, 84]
 	str	w0, [x25, 56]
-	.loc 1 2002 0
+	.loc 1 2068 0
 	mov	x0, x25
-	.loc 1 2001 0
+	.loc 1 2067 0
 	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 2002 0
+	.loc 1 2068 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL591:
-	b	.L492
-.LVL592:
+.LVL613:
+	b	.L523
+.LVL614:
 	.p2align 3
-.L555:
-.LBE1636:
-.LBE1645:
-.LBB1646:
-.LBB1590:
-	.loc 1 1800 0
+.L586:
+.LBE1745:
+.LBE1754:
+.LBB1755:
+.LBB1699:
+	.loc 1 1866 0
 	ldr	x0, [x19, 272]
-	adrp	x1, .LC39
-	add	x1, x1, :lo12:.LC39
+	adrp	x1, .LC38
+	add	x1, x1, :lo12:.LC38
 	bl	_dev_err
-.LVL593:
-	.loc 1 1801 0
+.LVL615:
+	.loc 1 1867 0
 	ldr	x0, [x19, 272]
 	mov	w2, w26
 	ldr	x1, [x19, 376]
 	bl	epd_lut_from_file_init
-.LVL594:
-	.loc 1 1802 0
-	tbz	w0, #31, .L481
-	.loc 1 1803 0
+.LVL616:
+	.loc 1 1868 0
+	tbz	w0, #31, .L512
+	.loc 1 1869 0
 	ldr	x0, [x19, 272]
-	adrp	x1, .LC40
-	.loc 1 1804 0
+	adrp	x1, .LC39
+	.loc 1 1870 0
 	mov	w24, -1
-	.loc 1 1803 0
-	add	x1, x1, :lo12:.LC40
+	.loc 1 1869 0
+	add	x1, x1, :lo12:.LC39
 	bl	_dev_err
-.LVL595:
-	b	.L479
-.LVL596:
+.LVL617:
+	b	.L510
+.LVL618:
 	.p2align 3
-.L465:
-.LBE1590:
-.LBE1646:
-	.loc 1 2047 0
+.L496:
+.LBE1699:
+.LBE1755:
+	.loc 1 2113 0
 	mov	w24, -517
-	b	.L461
-.LVL597:
+	b	.L492
+.LVL619:
 	.p2align 3
-.L556:
-.LBB1647:
-.LBB1611:
-	.loc 1 1892 0
+.L587:
+.LBB1756:
+.LBB1720:
+	.loc 1 1958 0
 	ldr	x0, [x21, 88]
-	adrp	x1, .LC41
-	add	x1, x1, :lo12:.LC41
+	adrp	x1, .LC40
+	add	x1, x1, :lo12:.LC40
 	bl	_dev_err
-.LVL598:
-.L482:
-.LBE1611:
-.LBE1647:
-	.loc 1 2107 0
-	adrp	x1, .LC73
+.LVL620:
+.L513:
+.LBE1720:
+.LBE1756:
+	.loc 1 2174 0
+	adrp	x1, .LC72
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC73
-	.loc 1 2108 0
+	add	x1, x1, :lo12:.LC72
+	.loc 1 2175 0
 	mov	w24, -1
-	.loc 1 2107 0
+	.loc 1 2174 0
 	bl	_dev_err
-.LVL599:
-	.loc 1 2108 0
-	b	.L461
-.LVL600:
+.LVL621:
+	.loc 1 2175 0
+	b	.L492
+.LVL622:
 	.p2align 3
-.L483:
-.LBB1648:
-.LBB1612:
-	.loc 1 1901 0
+.L514:
+.LBB1757:
+.LBB1721:
+	.loc 1 1967 0
 	ldr	x0, [x21, 88]
-.LVL601:
-	adrp	x1, .LC72
-	.loc 1 1899 0
+.LVL623:
+	adrp	x1, .LC71
+	.loc 1 1965 0
 	str	x25, [x21, 120]
-	.loc 1 1901 0
-	add	x1, x1, :lo12:.LC72
+	.loc 1 1967 0
+	add	x1, x1, :lo12:.LC71
 	bl	_dev_err
-.LVL602:
-	b	.L482
-.LVL603:
+.LVL624:
+	b	.L513
+.LVL625:
 	.p2align 3
-.L506:
-.LBE1612:
-.LBE1648:
-	.loc 1 2033 0
+.L537:
+.LBE1721:
+.LBE1757:
+	.loc 1 2099 0
 	mov	w24, -12
-	b	.L461
-.LVL604:
+	b	.L492
+.LVL626:
 	.p2align 3
-.L507:
-.LBB1649:
-.LBB1582:
-	.loc 1 1824 0
+.L538:
+.LBB1758:
+.LBB1691:
+	.loc 1 1890 0
 	mov	w24, -19
-	b	.L475
-.LVL605:
-.L546:
-.LBE1582:
-.LBE1649:
-	.loc 1 2040 0
-	adrp	x1, .LC25
+	b	.L506
+.LVL627:
+.L577:
+.LBE1691:
+.LBE1758:
+	.loc 1 2106 0
+	adrp	x1, .LC24
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC25
-	.loc 1 2041 0
+	add	x1, x1, :lo12:.LC24
+	.loc 1 2107 0
 	mov	w24, -19
-	.loc 1 2040 0
+	.loc 1 2106 0
 	bl	_dev_err
-.LVL606:
-	.loc 1 2041 0
-	b	.L461
-.L549:
-	.loc 1 2068 0
-	adrp	x1, .LC29
+.LVL628:
+	.loc 1 2107 0
+	b	.L492
+.L580:
+	.loc 1 2134 0
+	adrp	x1, .LC28
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC29
-	.loc 1 2069 0
+	add	x1, x1, :lo12:.LC28
+	.loc 1 2135 0
 	mov	w24, -517
-	.loc 1 2068 0
+	.loc 1 2134 0
 	bl	_dev_err
-.LVL607:
-	.loc 1 2069 0
-	b	.L461
-.L547:
-	.loc 1 2056 0
-	adrp	x1, .LC27
+.LVL629:
+	.loc 1 2135 0
+	b	.L492
+.L578:
+	.loc 1 2122 0
+	adrp	x1, .LC26
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC27
-	.loc 1 2057 0
+	add	x1, x1, :lo12:.LC26
+	.loc 1 2123 0
 	mov	w24, -19
-	.loc 1 2056 0
+	.loc 1 2122 0
 	bl	_dev_err
-.LVL608:
-	.loc 1 2057 0
-	b	.L461
-.LVL609:
-.L508:
-.LBB1650:
-.LBB1591:
-	.loc 1 1781 0
+.LVL630:
+	.loc 1 2123 0
+	b	.L492
+.LVL631:
+.L539:
+.LBB1759:
+.LBB1700:
+	.loc 1 1847 0
 	mov	w24, -19
-	b	.L479
-.LVL610:
-.L548:
-.LBE1591:
-.LBE1650:
-	.loc 1 2063 0
-	adrp	x1, .LC28
+	b	.L510
+.LVL632:
+.L579:
+.LBE1700:
+.LBE1759:
+	.loc 1 2129 0
+	adrp	x1, .LC27
 	mov	x0, x20
-.LVL611:
-	add	x1, x1, :lo12:.LC28
-	.loc 1 2064 0
+.LVL633:
+	add	x1, x1, :lo12:.LC27
+	.loc 1 2130 0
 	mov	w24, -517
-	.loc 1 2063 0
+	.loc 1 2129 0
 	bl	_dev_err
-.LVL612:
-	.loc 1 2064 0
-	b	.L461
-.LVL613:
-.L554:
-.LBB1651:
-.LBB1592:
-	.loc 1 1794 0
+.LVL634:
+	.loc 1 2130 0
+	b	.L492
+.LVL635:
+.L585:
+.LBB1760:
+.LBB1701:
+	.loc 1 1860 0
 	ldr	x0, [x19, 272]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
-	adrp	x1, .LC38
-	mov	w3, 1794
+	adrp	x1, .LC37
+	mov	w3, 1860
 	add	x2, x2, 32
-	add	x1, x1, :lo12:.LC38
-	.loc 1 1795 0
+	add	x1, x1, :lo12:.LC37
+	.loc 1 1861 0
 	mov	w24, -12
-	.loc 1 1794 0
+	.loc 1 1860 0
 	bl	_dev_err
-.LVL614:
-	b	.L479
-.LVL615:
-.L553:
-.LBE1592:
-.LBE1651:
-	.loc 1 2125 0
+.LVL636:
+	b	.L510
+.LVL637:
+.L584:
+.LBE1701:
+.LBE1760:
+	.loc 1 2192 0
 	bl	__stack_chk_fail
-.LVL616:
-.L563:
-.LBB1652:
-.LBB1637:
-	.loc 1 1967 0
+.LVL638:
+.L594:
+.LBB1761:
+.LBB1746:
+	.loc 1 2033 0
 	ldr	x0, [x21, 88]
-.LVL617:
-	adrp	x1, .LC51
+.LVL639:
+	adrp	x1, .LC50
 	adrp	x22, .LANCHOR1
-	add	x1, x1, :lo12:.LC51
+	add	x1, x1, :lo12:.LC50
 	bl	_dev_err
-.LVL618:
-	b	.L486
-.LVL619:
-.L561:
-	.loc 1 1953 0
+.LVL640:
+	b	.L517
+.LVL641:
+.L592:
+	.loc 1 2019 0
 	ldr	x0, [x21, 88]
-.LVL620:
-	adrp	x1, .LC48
+.LVL642:
+	adrp	x1, .LC47
 	adrp	x22, .LANCHOR1
-	add	x1, x1, :lo12:.LC48
+	add	x1, x1, :lo12:.LC47
 	bl	_dev_err
-.LVL621:
-	b	.L486
-.LVL622:
-.L562:
-	.loc 1 1949 0
+.LVL643:
+	b	.L517
+.LVL644:
+.L593:
+	.loc 1 2015 0
 	mov	w25, 1
-.LVL623:
-	b	.L503
-.LBE1637:
-.LBE1652:
+.LVL645:
+	b	.L534
+.LBE1746:
+.LBE1761:
 	.cfi_endproc
-.LFE2841:
+.LFE2846:
 	.size	ebc_probe, .-ebc_probe
 	.align	2
 	.p2align 3,,7
-	.type	ebc_power_set.constprop.8, %function
-ebc_power_set.constprop.8:
-.LFB2855:
+	.type	ebc_power_set.constprop.12, %function
+ebc_power_set.constprop.12:
+.LFB2864:
 	.loc 1 180 0
 	.cfi_startproc
-.LVL624:
+.LVL646:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -6890,45 +7273,45 @@ ebc_power_set.constprop.8:
 	mov	x19, x0
 	.loc 1 186 0
 	ldr	w0, [x20, 424]
-.LVL625:
-	cbz	w0, .L567
-.L565:
+.LVL647:
+	cbz	w0, .L598
+.L596:
 	.loc 1 190 0
 	mov	w1, 1
 	str	w1, [x20, 184]
 	.loc 1 191 0
 	ldr	x2, [x19, 16]
-.LBB1653:
-.LBB1654:
+.LBB1762:
+.LBB1763:
 	.loc 3 30 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL626:
-.LBE1654:
-.LBE1653:
+.LVL648:
+.LBE1763:
+.LBE1762:
 	.loc 1 192 0
 	ldr	x2, [x19, 8]
-.LBB1655:
-.LBB1656:
+.LBB1764:
+.LBB1765:
 	.loc 11 46 0
 	add	x1, x19, 24
 	mov	x0, x2
 	ldr	x2, [x2, 48]
 	blr	x2
-.LVL627:
-.LBE1656:
-.LBE1655:
+.LVL649:
+.LBE1765:
+.LBE1764:
 	.loc 1 193 0
 	ldr	x0, [x19]
-	adrp	x1, .LC75
-	add	x1, x1, :lo12:.LC75
+	adrp	x1, .LC74
+	add	x1, x1, :lo12:.LC74
 	bl	_dev_info
-.LVL628:
+.LVL650:
 	.loc 1 208 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
-.LVL629:
+.LVL651:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -6937,51 +7320,51 @@ ebc_power_set.constprop.8:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL630:
+.LVL652:
 	.p2align 3
-.L567:
+.L598:
 	.cfi_restore_state
 	.loc 1 187 0
 	mov	w0, 1
 	str	w0, [x20, 424]
-.LBB1657:
-.LBB1658:
+.LBB1766:
+.LBB1767:
 	.loc 4 58 0
 	add	x0, x19, 400
 	bl	__pm_stay_awake
-.LVL631:
-	b	.L565
-.LBE1658:
-.LBE1657:
+.LVL653:
+	b	.L596
+.LBE1767:
+.LBE1766:
 	.cfi_endproc
-.LFE2855:
-	.size	ebc_power_set.constprop.8, .-ebc_power_set.constprop.8
+.LFE2864:
+	.size	ebc_power_set.constprop.12, .-ebc_power_set.constprop.12
 	.align	2
 	.p2align 3,,7
 	.global	refresh_new_image2
 	.type	refresh_new_image2, %function
 refresh_new_image2:
-.LFB2806:
+.LFB2807:
 	.loc 1 213 0
 	.cfi_startproc
-.LVL632:
+.LVL654:
 	.loc 1 220 0
 	ldp	w16, w5, [x4, 52]
-.LVL633:
+.LVL655:
 	cmp	w5, 0
 	add	w11, w5, 7
 	csel	w11, w11, w5, lt
-.LVL634:
+.LVL656:
 	.loc 1 222 0
 	cmp	w16, 0
 	.loc 1 220 0
 	asr	w11, w11, 3
-.LVL635:
+.LVL657:
 	.loc 1 222 0
-	ble	.L568
+	ble	.L599
 	sub	w14, w11, #1
 	mov	w15, 0
-.LVL636:
+.LVL658:
 	add	x14, x14, 1
 	.loc 1 267 0
 	mov	w13, 234881024
@@ -6989,92 +7372,92 @@ refresh_new_image2:
 	lsl	x14, x14, 2
 	.loc 1 273 0
 	mov	w12, -536870912
-.LVL637:
+.LVL659:
 	.p2align 2
-.L570:
+.L601:
 	.loc 1 223 0 discriminator 1
 	mov	x6, 0
 	cmp	w11, 0
-	bgt	.L591
-	b	.L588
-.LVL638:
+	bgt	.L622
+	b	.L619
+.LVL660:
 	.p2align 3
-.L571:
+.L602:
 	.loc 1 236 0
 	tst	x5, 65280
-	bne	.L572
+	bne	.L603
 	.loc 1 237 0
 	and	w10, w4, 240
 	cmp	w10, 224
-	beq	.L593
+	beq	.L624
 	.loc 1 240 0
 	orr	w7, w7, 240
-.L572:
+.L603:
 	.loc 1 242 0
 	tst	x5, 16711680
-	bne	.L574
+	bne	.L605
 	.loc 1 243 0
 	and	w10, w4, 3840
 	cmp	w10, 3584
-	beq	.L594
+	beq	.L625
 	.loc 1 246 0
 	orr	w7, w7, 3840
-.L574:
+.L605:
 	.loc 1 248 0
 	tst	x5, 4278190080
-	bne	.L576
+	bne	.L607
 	.loc 1 249 0
 	and	w10, w4, 61440
 	cmp	w10, 57344
-	beq	.L595
+	beq	.L626
 	.loc 1 252 0
 	orr	w7, w7, 61440
-.L576:
+.L607:
 	.loc 1 254 0
 	tst	x5, 1095216660480
-	bne	.L578
+	bne	.L609
 	.loc 1 255 0
 	and	w10, w4, 983040
 	cmp	w10, 917504
-	beq	.L596
+	beq	.L627
 	.loc 1 258 0
 	orr	w7, w7, 983040
-.L578:
+.L609:
 	.loc 1 260 0
 	tst	x5, 280375465082880
-	bne	.L580
+	bne	.L611
 	.loc 1 261 0
 	and	w10, w4, 15728640
 	cmp	w10, 14680064
-	beq	.L597
+	beq	.L628
 	.loc 1 264 0
 	orr	w7, w7, 15728640
-.L580:
+.L611:
 	.loc 1 266 0
 	tst	x5, 71776119061217280
-	bne	.L582
+	bne	.L613
 	.loc 1 267 0
 	and	w10, w4, 251658240
 	cmp	w10, w13
-	beq	.L598
+	beq	.L629
 	.loc 1 270 0
 	orr	w7, w7, 251658240
-.L582:
+.L613:
 	.loc 1 272 0
 	tst	x5, -72057594037927936
-	bne	.L584
+	bne	.L615
 	.loc 1 273 0
 	and	w5, w4, -268435456
-.LVL639:
+.LVL661:
 	cmp	w5, w12
-	beq	.L599
+	beq	.L630
 	.loc 1 276 0
 	orr	w7, w7, -268435456
-.LVL640:
-.L584:
+.LVL662:
+.L615:
 	.loc 1 280 0 discriminator 2
 	and	w4, w4, w9
-.LVL641:
+.LVL663:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
@@ -7083,54 +7466,54 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 223 0 discriminator 2
 	cmp	w11, w6
-	ble	.L600
-.LVL642:
-.L591:
+	ble	.L631
+.LVL664:
+.L622:
 	.loc 1 224 0
 	ldr	x5, [x3, x6, lsl 3]
 	.loc 1 228 0
 	mov	w7, 0
 	.loc 1 225 0
 	ldr	w4, [x1, x6, lsl 2]
-.LVL643:
+.LVL665:
 	.loc 1 226 0
 	ldr	w8, [x0, x6, lsl 2]
 	.loc 1 230 0
 	and	x10, x5, 255
 	.loc 1 227 0
 	ldr	w9, [x2, x6, lsl 2]
-.LVL644:
+.LVL666:
 	.loc 1 230 0
-	cbnz	x10, .L571
-.LVL645:
+	cbnz	x10, .L602
+.LVL667:
 	.loc 1 231 0
 	and	w10, w4, 15
 	.loc 1 234 0
 	mov	w7, 15
 	.loc 1 231 0
 	cmp	w10, 14
-	bne	.L571
+	bne	.L602
 	.loc 1 232 0
 	orr	w8, w8, w7
-.LVL646:
+.LVL668:
 	.loc 1 228 0
 	mov	w7, 0
-.LVL647:
-	b	.L571
+.LVL669:
+	b	.L602
 	.p2align 3
-.L598:
+.L629:
 	.loc 1 268 0
 	orr	w8, w8, 251658240
-	b	.L582
-.LVL648:
+	b	.L613
+.LVL670:
 	.p2align 3
-.L599:
+.L630:
 	.loc 1 274 0
 	orr	w8, w8, -268435456
-.LVL649:
+.LVL671:
 	.loc 1 280 0
 	and	w4, w4, w9
-.LVL650:
+.LVL672:
 	eor	w4, w4, w8
 	and	w4, w4, w7
 	eor	w4, w8, w4
@@ -7139,105 +7522,105 @@ refresh_new_image2:
 	add	x6, x6, 1
 	.loc 1 223 0
 	cmp	w11, w6
-	bgt	.L591
-.LVL651:
+	bgt	.L622
+.LVL673:
 	.p2align 2
-.L600:
+.L631:
 	add	x3, x3, x17
 	add	x1, x1, x14
 	add	x2, x2, x14
 	add	x0, x0, x14
-.LVL652:
-.L588:
+.LVL674:
+.L619:
 	.loc 1 222 0 discriminator 2
 	add	w15, w15, 1
 	cmp	w16, w15
-	bne	.L570
-.L568:
+	bne	.L601
+.L599:
 	ret
-.LVL653:
+.LVL675:
 	.p2align 3
-.L594:
+.L625:
 	.loc 1 244 0
 	orr	w8, w8, 3840
-	b	.L574
+	b	.L605
 	.p2align 3
-.L595:
+.L626:
 	.loc 1 250 0
 	orr	w8, w8, 61440
-	b	.L576
+	b	.L607
 	.p2align 3
-.L596:
+.L627:
 	.loc 1 256 0
 	orr	w8, w8, 983040
-	b	.L578
+	b	.L609
 	.p2align 3
-.L597:
+.L628:
 	.loc 1 262 0
 	orr	w8, w8, 15728640
-	b	.L580
+	b	.L611
 	.p2align 3
-.L593:
+.L624:
 	.loc 1 238 0
 	orr	w8, w8, 240
-	b	.L572
+	b	.L603
 	.cfi_endproc
-.LFE2806:
+.LFE2807:
 	.size	refresh_new_image2, .-refresh_new_image2
 	.align	2
 	.p2align 3,,7
 	.global	refresh_new_image_auto
 	.type	refresh_new_image_auto, %function
 refresh_new_image_auto:
-.LFB2807:
+.LFB2808:
 	.loc 1 288 0
 	.cfi_startproc
-.LVL654:
+.LVL676:
 	.loc 1 295 0
 	ldp	w13, w4, [x3, 52]
 	cmp	w4, 0
 	add	w9, w4, 7
 	csel	w9, w9, w4, lt
-.LVL655:
+.LVL677:
 	.loc 1 297 0
 	cmp	w13, 0
 	.loc 1 295 0
 	asr	w9, w9, 3
-.LVL656:
+.LVL678:
 	.loc 1 297 0
-	ble	.L601
+	ble	.L632
 	sub	w12, w9, #1
 	mov	w11, 0
-.LVL657:
+.LVL679:
 	add	x12, x12, 1
 	.loc 1 305 0
 	mov	w10, 15
 	lsl	x14, x12, 3
 	lsl	x12, x12, 2
 	.p2align 2
-.L603:
+.L634:
 	.loc 1 298 0 discriminator 1
 	mov	x6, 0
 	cmp	w9, 0
-	ble	.L614
+	ble	.L645
 	.p2align 2
-.L616:
+.L647:
 	.loc 1 299 0
 	ldr	x4, [x2, x6, lsl 3]
-.LVL658:
+.LVL680:
 	.loc 1 301 0
 	ldr	w7, [x0, x6, lsl 2]
 	.loc 1 300 0
 	ldr	w3, [x1, x6, lsl 2]
-.LVL659:
+.LVL681:
 	.loc 1 304 0
 	and	x5, x4, 255
 	.loc 1 305 0
 	cmp	x5, 0
-.LVL660:
+.LVL682:
 	eor	w5, w3, w7
 	csel	w3, wzr, w10, ne
-.LVL661:
+.LVL683:
 	.loc 1 308 0
 	orr	w8, w3, 240
 	tst	x4, 65280
@@ -7265,10 +7648,10 @@ refresh_new_image_auto:
 	.loc 1 326 0
 	tst	x4, -72057594037927936
 	orr	w4, w3, -268435456
-.LVL662:
+.LVL684:
 	csel	w3, w4, w3, eq
 	and	w3, w5, w3
-.LVL663:
+.LVL685:
 	.loc 1 329 0
 	eor	w3, w3, w7
 	.loc 1 330 0
@@ -7276,30 +7659,30 @@ refresh_new_image_auto:
 	add	x6, x6, 1
 	.loc 1 298 0
 	cmp	w9, w6
-	bgt	.L616
+	bgt	.L647
 	add	x2, x2, x14
 	add	x1, x1, x12
 	add	x0, x0, x12
-.LVL664:
-.L614:
+.LVL686:
+.L645:
 	.loc 1 297 0 discriminator 2
 	add	w11, w11, 1
 	cmp	w13, w11
-	bne	.L603
-.L601:
+	bne	.L634
+.L632:
 	ret
 	.cfi_endproc
-.LFE2807:
+.LFE2808:
 	.size	refresh_new_image_auto, .-refresh_new_image_auto
 	.align	2
 	.p2align 3,,7
 	.global	new_buffer_refresh
 	.type	new_buffer_refresh, %function
 new_buffer_refresh:
-.LFB2808:
+.LFB2809:
 	.loc 1 336 0
 	.cfi_startproc
-.LVL665:
+.LVL687:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -7316,35 +7699,35 @@ new_buffer_refresh:
 	adrp	x20, .LANCHOR1
 	.loc 1 337 0
 	ldr	x19, [x1, #:lo12:.LANCHOR0]
-.LVL666:
+.LVL688:
 	.loc 1 340 0
 	add	x0, x20, :lo12:.LANCHOR1
-.LVL667:
+.LVL689:
 	add	x0, x0, 592
 	bl	down_write
-.LVL668:
+.LVL690:
 	.loc 1 338 0
 	add	x19, x19, 184
-.LVL669:
+.LVL691:
 	.loc 1 341 0
 	ldr	x0, [x19, 208]
 	ldr	w5, [x0, 40]
-	cbz	w5, .L622
+	cbz	w5, .L653
 	.loc 1 347 0
 	ldr	x1, [x0, 16]
 	mov	x4, x19
 	ldp	x2, x3, [x19, 144]
 	ldr	x0, [x19, 128]
 	bl	refresh_new_image2
-.LVL670:
+.LVL692:
 	.loc 1 352 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 592
 	bl	up_write
-.LVL671:
+.LVL693:
 	.loc 1 353 0
 	ldp	x19, x20, [sp, 16]
-.LVL672:
+.LVL694:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -7353,9 +7736,9 @@ new_buffer_refresh:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL673:
+.LVL695:
 	.p2align 3
-.L622:
+.L653:
 	.cfi_restore_state
 	.loc 1 342 0
 	ldr	x1, [x0, 16]
@@ -7363,15 +7746,15 @@ new_buffer_refresh:
 	ldr	x2, [x19, 152]
 	ldr	x0, [x19, 128]
 	bl	refresh_new_image_auto
-.LVL674:
+.LVL696:
 	.loc 1 352 0
 	add	x0, x20, :lo12:.LANCHOR1
 	add	x0, x0, 592
 	bl	up_write
-.LVL675:
+.LVL697:
 	.loc 1 353 0
 	ldp	x19, x20, [sp, 16]
-.LVL676:
+.LVL698:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -7380,25 +7763,25 @@ new_buffer_refresh:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2808:
+.LFE2809:
 	.size	new_buffer_refresh, .-new_buffer_refresh
 	.align	2
 	.p2align 3,,7
 	.type	ebc_thread, %function
 ebc_thread:
-.LFB2820:
-	.loc 1 1017 0
+.LFB2825:
+	.loc 1 1092 0
 	.cfi_startproc
-.LVL677:
+.LVL699:
 	stp	x29, x30, [sp, -224]!
 	.cfi_def_cfa_offset 224
 	.cfi_offset 29, -224
 	.cfi_offset 30, -216
-	.loc 1 1018 0
+	.loc 1 1093 0
 	adrp	x1, .LANCHOR0
-	.loc 1 1017 0
+	.loc 1 1092 0
 	adrp	x0, __stack_chk_guard
-.LVL678:
+.LVL700:
 	add	x0, x0, :lo12:__stack_chk_guard
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -7410,109 +7793,109 @@ ebc_thread:
 	.cfi_offset 22, -184
 	adrp	x22, .LANCHOR1
 	stp	x23, x24, [sp, 48]
-.LBB1682:
-.LBB1683:
-.LBB1684:
-	.loc 1 1318 0
+.LBB1790:
+.LBB1791:
+.LBB1792:
+	.loc 1 1384 0
 	add	x22, x22, :lo12:.LANCHOR1
-.LBE1684:
-.LBE1683:
-.LBE1682:
-	.loc 1 1017 0
+.LBE1792:
+.LBE1791:
+.LBE1790:
+	.loc 1 1092 0
 	stp	x27, x28, [sp, 80]
-.LBB1689:
-.LBB1687:
-.LBB1685:
-	.loc 1 1318 0
+.LBB1797:
+.LBB1795:
+.LBB1793:
+	.loc 1 1384 0
 	add	x19, x22, 304
-.LBE1685:
-.LBE1687:
-.LBE1689:
-	.loc 1 1018 0
+.LBE1793:
+.LBE1795:
+.LBE1797:
+	.loc 1 1093 0
 	ldr	x20, [x1, #:lo12:.LANCHOR0]
-.LVL679:
+.LVL701:
 	.cfi_offset 23, -176
 	.cfi_offset 24, -168
 	.cfi_offset 27, -144
 	.cfi_offset 28, -136
-	.loc 1 1023 0
+	.loc 1 1097 0
 	mov	w24, 0
-.LVL680:
-	.loc 1 1017 0
+.LVL702:
+	.loc 1 1092 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -160
 	.cfi_offset 26, -152
-	.loc 1 1022 0
+	.loc 1 1096 0
 	mov	w21, 0
-.LVL681:
-	.loc 1 1020 0
+.LVL703:
+	.loc 1 1094 0
 	add	x28, x20, 184
-	.loc 1 1017 0
+	.loc 1 1092 0
 	ldr	x1, [x0]
 	str	x1, [x29, 216]
 	mov	x1,0
-.LVL682:
+.LVL704:
 	.p2align 2
-.L624:
-	.loc 1 1028 0
+.L655:
+	.loc 1 1102 0
 	ldr	w0, [x28, 600]
-.LVL683:
-	cbnz	w0, .L771
-.L625:
-	.loc 1 1034 0
+.LVL705:
+	cbnz	w0, .L784
+.L656:
+	.loc 1 1108 0
 	bl	ebc_dsp_buf_get
-.LVL684:
+.LVL706:
 	mov	x23, x0
-	.loc 1 1036 0
-	cbz	x0, .L627
-	.loc 1 1036 0 is_stmt 0 discriminator 1
+	.loc 1 1110 0
+	cbz	x0, .L658
+	.loc 1 1110 0 is_stmt 0 discriminator 1
 	ldr	x1, [x0, 8]
-	cbz	x1, .L627
-	.loc 1 1037 0 is_stmt 1
+	cbz	x1, .L658
+	.loc 1 1111 0 is_stmt 1
 	ldr	w1, [x0, 40]
-	cmp	w1, 17
-	beq	.L772
-	.loc 1 1041 0
+	cmp	w1, 19
+	beq	.L785
+	.loc 1 1115 0
 	ldr	x2, [x28, 592]
-	cbz	x2, .L630
-	.loc 1 1042 0
-	cmp	w1, 16
-	beq	.L773
-.L764:
-	.loc 1 1100 0
+	cbz	x2, .L661
+	.loc 1 1116 0
+	cmp	w1, 18
+	beq	.L786
+.L777:
+	.loc 1 1174 0
 	bl	ebc_remove_from_dsp_buf_list
-.LVL685:
-	.loc 1 1101 0
+.LVL707:
+	.loc 1 1175 0
 	mov	x0, x23
 	bl	ebc_buf_release
-.LVL686:
-	.loc 1 1028 0
+.LVL708:
+	.loc 1 1102 0
 	ldr	w0, [x28, 600]
-	cbz	w0, .L625
+	cbz	w0, .L656
 	.p2align 2
-.L771:
-	.loc 1 1029 0
+.L784:
+	.loc 1 1103 0
 	ldr	w0, [x28, 184]
 	cmp	w0, 1
-	beq	.L774
-.L626:
-	.loc 1 1324 0
+	beq	.L787
+.L657:
+	.loc 1 1390 0
 	adrp	x0, __stack_chk_guard
 	add	x23, x0, :lo12:__stack_chk_guard
-.LVL687:
+.LVL709:
 	ldr	x2, [x29, 216]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
 	mov	w0, 0
-	cbnz	x1, .L775
+	cbnz	x1, .L788
 	ldp	x19, x20, [sp, 16]
-.LVL688:
+.LVL710:
 	ldp	x21, x22, [sp, 32]
-.LVL689:
+.LVL711:
 	ldp	x23, x24, [sp, 48]
-.LVL690:
+.LVL712:
 	ldp	x25, x26, [sp, 64]
-.LVL691:
+.LVL713:
 	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 224
 	.cfi_remember_state
@@ -7530,105 +7913,105 @@ ebc_thread:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL692:
+.LVL714:
 	.p2align 3
-.L627:
+.L658:
 	.cfi_restore_state
-	.loc 1 1305 0
+	.loc 1 1371 0
 	ldr	w0, [x28, 28]
-.LVL693:
+.LVL715:
 	cmp	w0, 1
-	beq	.L776
-	.loc 1 1314 0
+	beq	.L789
+	.loc 1 1380 0
 	ldr	w0, [x28, 184]
 	cmp	w0, 1
-	beq	.L777
-.LVL694:
-.L767:
+	beq	.L790
+.LVL716:
+.L780:
 	ldr	w0, [x28, 80]
-.LVL695:
-	.loc 1 1317 0
-	cbz	w0, .L778
-.L715:
-.LVL696:
-.L705:
-	.loc 1 1319 0
+.LVL717:
+	.loc 1 1383 0
+	cbz	w0, .L791
+.L743:
+.LVL718:
+.L733:
+	.loc 1 1385 0
 	str	wzr, [x28, 80]
-	b	.L624
-.LVL697:
+	b	.L655
+.LVL719:
 	.p2align 3
-.L778:
-.LBB1690:
-.LBB1688:
-	.loc 1 1318 0 discriminator 1
+.L791:
+.LBB1798:
+.LBB1796:
+	.loc 1 1384 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL698:
-	b	.L716
+.LVL720:
+	b	.L744
 	.p2align 3
-.L779:
-.LVL699:
-.LBB1686:
-	.loc 1 1318 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L705
-	.loc 1 1318 0 discriminator 7
+.L792:
+.LVL721:
+.LBB1794:
+	.loc 1 1384 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L733
+	.loc 1 1384 0 discriminator 7
 	bl	schedule
-.LVL700:
-.L716:
-	.loc 1 1318 0 discriminator 9
+.LVL722:
+.L744:
+	.loc 1 1384 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL701:
+.LVL723:
 	ldr	w1, [x28, 80]
-	cbz	w1, .L779
-.LBE1686:
-	.loc 1 1318 0 discriminator 4
+	cbz	w1, .L792
+.LBE1794:
+	.loc 1 1384 0 discriminator 4
 	add	x1, x29, 112
 	mov	x0, x19
 	bl	finish_wait
-.LVL702:
-.LBE1688:
-.LBE1690:
-	.loc 1 1319 0 is_stmt 1 discriminator 4
+.LVL724:
+.LBE1796:
+.LBE1798:
+	.loc 1 1385 0 is_stmt 1 discriminator 4
 	str	wzr, [x28, 80]
-	b	.L624
-.LVL703:
+	b	.L655
+.LVL725:
 	.p2align 3
-.L630:
-	.loc 1 1054 0
-	cmp	w1, 15
-	beq	.L780
-	.loc 1 1058 0
-	cmp	w1, 1
+.L661:
+	.loc 1 1128 0
+	cmp	w1, 17
+	beq	.L793
+	.loc 1 1132 0
+	cmp	w1, 20
 	ldr	w0, [x28, 608]
-.LVL704:
-	ccmp	w1, 18, 4, ne
+.LVL726:
+	ccmp	w1, 1, 4, ne
 	ccmp	w0, 0, 4, ne
-	beq	.L629
-	.loc 1 1059 0
+	beq	.L660
+	.loc 1 1133 0
 	add	x25, x22, 592
-.LVL705:
+.LVL727:
 	mov	x0, x25
 	bl	down_write
-.LVL706:
-	.loc 1 1060 0
+.LVL728:
+	.loc 1 1134 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x23, 16]
 	ldr	x0, [x28, 144]
 	bl	memcpy
-.LVL707:
-	.loc 1 1061 0
+.LVL729:
+	.loc 1 1135 0
 	mov	x0, x23
 	bl	ebc_remove_from_dsp_buf_list
-.LVL708:
-	.loc 1 1062 0
+.LVL730:
+	.loc 1 1136 0
 	mov	x0, x23
 	bl	ebc_buf_release
-.LVL709:
-	.loc 1 1064 0
+.LVL731:
+	.loc 1 1138 0
 	ldr	x1, [x28, 208]
 	mov	x4, x28
 	ldr	x0, [x28, 128]
@@ -7636,706 +8019,632 @@ ebc_thread:
 	ldr	w5, [x1, 40]
 	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
-.LVL710:
-	.loc 1 1067 0
+.LVL732:
+	.loc 1 1141 0
 	mov	x0, x25
 	bl	up_write
-.LVL711:
-	.loc 1 1068 0
+.LVL733:
+	.loc 1 1142 0
 	ldr	w0, [x28, 28]
-	cbnz	w0, .L624
-	.loc 1 1069 0
+	cbnz	w0, .L655
+	.loc 1 1143 0
 	mov	w0, 1
 	str	w0, [x28, 28]
-	.loc 1 1071 0
+	.loc 1 1145 0
 	ldr	w0, [x28, 184]
-	.loc 1 1070 0
+	.loc 1 1144 0
 	str	wzr, [x28, 76]
-	.loc 1 1071 0
-	cbz	w0, .L781
-.L634:
-	.loc 1 1073 0
+	.loc 1 1145 0
+	cbz	w0, .L794
+.L665:
+	.loc 1 1147 0
 	ldr	x0, [x28, 88]
-	adrp	x1, .LC77
+	adrp	x1, .LC76
 	ldrb	w2, [x28, 32]
-	add	x1, x1, :lo12:.LC77
+	add	x1, x1, :lo12:.LC76
 	bl	_dev_info
-.LVL712:
-	.loc 1 1074 0
+.LVL734:
+	.loc 1 1148 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL713:
-	b	.L624
-.LVL714:
+.LVL735:
+	b	.L655
+.LVL736:
 	.p2align 3
-.L773:
-	.loc 1 1043 0
+.L786:
+	.loc 1 1117 0
 	str	wzr, [x28, 592]
-	.loc 1 1044 0
+	.loc 1 1118 0
 	mov	x0, 3
-.LVL715:
+.LVL737:
 	bl	ebc_notify
-.LVL716:
-	.loc 1 1045 0
+.LVL738:
+	.loc 1 1119 0
 	ldr	x0, [x28, 88]
-	adrp	x1, .LC76
-	add	x1, x1, :lo12:.LC76
+	adrp	x1, .LC75
+	add	x1, x1, :lo12:.LC75
 	bl	_dev_info
-.LVL717:
+.LVL739:
 	.p2align 2
-.L629:
-	.loc 1 1079 0
+.L660:
+	.loc 1 1153 0
 	adrp	x25, jiffies
-.LVL718:
+.LVL740:
 	mov	x1, 402653184
 	add	x0, x20, 616
 	ldr	x2, [x25, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL719:
-	.loc 1 1081 0
+.LVL741:
+	.loc 1 1155 0
 	ldr	w0, [x28, 428]
-	cbz	w0, .L635
+	cbz	w0, .L666
 	ldr	x0, [x28, 200]
-.L636:
-	.loc 1 1084 0
+.L667:
+	.loc 1 1158 0
 	ldr	w2, [x0, 40]
 	ldr	w3, [x23, 40]
 	cmp	w3, w2
-	beq	.L637
-	.loc 1 1085 0
+	beq	.L668
+	.loc 1 1159 0
 	ldr	x0, [x28, 88]
-	adrp	x1, .LC78
-	add	x1, x1, :lo12:.LC78
+	adrp	x1, .LC77
+	add	x1, x1, :lo12:.LC77
 	bl	_dev_info
-.LVL720:
-	.loc 1 1086 0
+.LVL742:
+	.loc 1 1160 0
 	ldr	w0, [x28, 28]
 	cmp	w0, 1
-	beq	.L782
-.L765:
+	beq	.L795
+.L778:
 	ldr	w2, [x23, 40]
-.L637:
-	.loc 1 1093 0
+.L668:
+	.loc 1 1167 0
 	cmp	w2, 11
-	bgt	.L644
+	bgt	.L675
 	cmp	w2, 7
-	bge	.L647
+	bge	.L678
 	cmp	w2, 1
-	beq	.L646
-	bgt	.L720
-	cbnz	w2, .L643
-	.loc 1 1138 0
+	beq	.L677
+	bgt	.L748
+	cbnz	w2, .L674
+	.loc 1 1212 0
 	add	x0, x22, 592
 	bl	down_write
-.LVL721:
-	.loc 1 1144 0
+.LVL743:
+	.loc 1 1218 0
 	ldr	x0, [x28, 200]
-	.loc 1 1139 0
+	.loc 1 1213 0
 	str	x23, [x28, 208]
-	.loc 1 1144 0
+	.loc 1 1218 0
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
-	bls	.L681
-	.loc 1 1146 0
+	bls	.L712
+	.loc 1 1220 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x23, 16]
 	ldr	x0, [x28, 128]
 	bl	memcpy
-.LVL722:
-	.loc 1 1147 0
+.LVL744:
+	.loc 1 1221 0
 	ldr	x0, [x28, 200]
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x28, 136]
 	bl	memcpy
-.LVL723:
-.L682:
-	.loc 1 1153 0
+.LVL745:
+.L713:
+	.loc 1 1227 0
 	add	x0, x22, 592
 	bl	up_write
-.LVL724:
-	.loc 1 1155 0
+.LVL746:
+	.loc 1 1229 0
 	ldr	w0, [x28, 28]
-	cbnz	w0, .L659
-	.loc 1 1158 0
+	cbnz	w0, .L690
+	.loc 1 1232 0
 	ldr	w0, [x28, 184]
-	.loc 1 1156 0
+	.loc 1 1230 0
 	mov	w1, 1
-	.loc 1 1157 0
+	.loc 1 1231 0
 	str	wzr, [x28, 76]
-	.loc 1 1156 0
+	.loc 1 1230 0
 	str	w1, [x28, 28]
-	.loc 1 1158 0
-	cbz	w0, .L783
-.L683:
-	.loc 1 1160 0
+	.loc 1 1232 0
+	cbz	w0, .L796
+.L714:
+	.loc 1 1234 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL725:
+.LVL747:
 	cmn	w0, #1
-	beq	.L784
-	.loc 1 1168 0
+	beq	.L797
+	.loc 1 1242 0
 	ldr	x0, [x28, 88]
-	adrp	x1, .LC84
-	.loc 1 1165 0
+	adrp	x1, .LC83
+	.loc 1 1239 0
 	ldr	w3, [x28, 96]
-	.loc 1 1168 0
-	add	x1, x1, :lo12:.LC84
-	.loc 1 1165 0
+	.loc 1 1242 0
+	add	x1, x1, :lo12:.LC83
+	.loc 1 1239 0
 	strb	w3, [x28, 32]
-.LVL726:
-.L766:
-	.loc 1 1168 0
+.LVL748:
+.L779:
+	.loc 1 1242 0
 	and	w2, w3, 255
-	.loc 1 1166 0
+	.loc 1 1240 0
 	lsr	w3, w3, 8
 	strb	w3, [x28, 33]
-	.loc 1 1168 0
+	.loc 1 1242 0
 	bl	_dev_info
-.LVL727:
-	.loc 1 1169 0
+.LVL749:
+	.loc 1 1243 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL728:
-	.loc 1 1279 0
+.LVL750:
+	.loc 1 1345 0
 	ldr	x0, [x28, 208]
 	ldr	w0, [x0, 40]
-	cmp	w0, 17
-	bne	.L701
-.LVL729:
+	cmp	w0, 19
+	bne	.L729
+.LVL751:
 	.p2align 2
-.L790:
-	.loc 1 1282 0
+.L802:
+	.loc 1 1348 0
 	ldr	x0, [x28, 88]
-	.loc 1 1280 0
+	.loc 1 1346 0
 	mov	w25, 1
-.LVL730:
-	.loc 1 1281 0
+.LVL752:
+	.loc 1 1347 0
 	str	wzr, [x28, 188]
-	.loc 1 1282 0
-	adrp	x1, .LC87
-	.loc 1 1280 0
+	.loc 1 1348 0
+	adrp	x1, .LC86
+	.loc 1 1346 0
 	str	w25, [x28, 600]
-	.loc 1 1282 0
-	add	x1, x1, :lo12:.LC87
+	.loc 1 1348 0
+	add	x1, x1, :lo12:.LC86
 	bl	_dev_info
-.LVL731:
-	.loc 1 1283 0
+.LVL753:
+	.loc 1 1349 0
 	mov	w2, w25
 	mov	w1, w25
 	add	x0, x22, 328
 	bl	__wake_up_sync
-.LVL732:
-	.loc 1 1294 0
+.LVL754:
+	.loc 1 1360 0
 	mov	x0, x23
 	bl	ebc_remove_from_dsp_buf_list
-.LVL733:
-	.loc 1 1296 0
+.LVL755:
+	.loc 1 1362 0
 	ldr	w0, [x28, 428]
-	cbz	w0, .L703
-.LVL734:
+	cbz	w0, .L731
+.LVL756:
 	.p2align 2
-.L792:
-	.loc 1 1297 0
+.L804:
+	.loc 1 1363 0
 	ldr	x0, [x28, 200]
 	bl	ebc_buf_release
-.LVL735:
-	b	.L704
-.LVL736:
+.LVL757:
+	b	.L732
+.LVL758:
 	.p2align 3
-.L635:
-	.loc 1 1082 0
+.L666:
+	.loc 1 1156 0
 	mov	x0, x23
 	str	x23, [x28, 200]
-	b	.L636
+	b	.L667
 	.p2align 3
-.L649:
-	.loc 1 1093 0
-	cmp	w2, 18
-	bne	.L643
-	.loc 1 1184 0
+.L799:
+	.loc 1 1167 0
+	cmp	w2, 13
+	bge	.L678
+.L748:
+	.loc 1 1259 0
 	mov	w21, 1
-	.loc 1 1173 0
-	str	wzr, [x28, 608]
-.L647:
-	.loc 1 1192 0
+.L678:
+	.loc 1 1268 0
 	ldr	x26, [x28, 200]
-.LVL737:
-	.loc 1 1193 0
+.LVL759:
+	.loc 1 1269 0
 	ldr	w0, [x26, 40]
 	cmp	w0, 1
-	bls	.L785
-.L685:
-	.loc 1 1204 0
+	bls	.L798
+.L716:
+	.loc 1 1280 0
 	str	wzr, [x28, 76]
-	.loc 1 1205 0
+	.loc 1 1281 0
 	str	x23, [x28, 208]
-	.loc 1 1207 0
-	ldr	w9, [x23, 40]
-	.loc 1 1210 0
-	sub	w0, w9, #7
-	.loc 1 1207 0
+	.loc 1 1284 0
+	ldr	w0, [x23, 40]
+	sub	w0, w0, #7
+	.loc 1 1283 0
 	cmp	w0, 4
-	bls	.L786
-.LVL738:
-.L686:
-	.loc 1 1222 0
-	cbnz	w21, .L724
-	.loc 1 1226 0
-	ldr	w1, [x28, 48]
-	mov	x0, x23
+	bhi	.L717
+.L800:
+	.loc 1 1286 0
+	ldr	x0, [x28, 200]
+.LBB1799:
+.LBB1800:
+	.loc 1 1077 0
+	ldr	w1, [x28, 20]
+.LBE1800:
+.LBE1799:
+	.loc 1 1285 0
+	ldr	x4, [x23, 16]
+.LBB1803:
+.LBB1801:
+	.loc 1 1077 0
 	cmp	w1, 0
-	ble	.L693
-	.loc 1 1227 0
+.LBE1801:
+.LBE1803:
+	.loc 1 1286 0
+	ldr	x5, [x0, 16]
+.LBB1804:
+.LBB1802:
+	.loc 1 1077 0
+	add	w0, w1, 7
+	csel	w0, w0, w1, lt
+	asr	w0, w0, 3
+	cmp	w0, 0
+	ble	.L718
+	.loc 1 1081 0
+	ldr	x2, [x4]
+	ldr	x1, [x5]
+	cmp	x2, x1
+	bne	.L717
+	sub	w1, w0, #1
+	mov	x0, 8
+	add	x1, x1, 1
+	lsl	x1, x1, 3
+	b	.L720
+	.p2align 3
+.L721:
+	.loc 1 1078 0
+	ldr	x3, [x4, x0]
+	add	x0, x0, 8
+	.loc 1 1079 0
+	add	x2, x5, x0
+	.loc 1 1081 0
+	ldr	x2, [x2, -8]
+	cmp	x3, x2
+	bne	.L717
+.L720:
+	.loc 1 1077 0
+	cmp	x1, x0
+	bne	.L721
+.L718:
+.LBE1802:
+.LBE1804:
+	.loc 1 1288 0
+	ldr	x0, [x28, 88]
+	adrp	x1, .LC88
+	add	x1, x1, :lo12:.LC88
+	bl	_dev_info
+.LVL760:
+	.loc 1 1290 0
+	str	x26, [x28, 200]
+	.loc 1 1291 0
+	b	.L690
+.LVL761:
+	.p2align 3
+.L675:
+	.loc 1 1167 0
+	cmp	w2, 14
+	ble	.L799
+	cmp	w2, 19
+	ble	.L748
+	cmp	w2, 20
+	bne	.L674
+	.loc 1 1268 0
+	ldr	x26, [x28, 200]
+.LVL762:
+	.loc 1 1259 0
+	mov	w21, 1
+	.loc 1 1247 0
+	str	wzr, [x28, 608]
+	.loc 1 1269 0
+	ldr	w0, [x26, 40]
+	cmp	w0, 1
+	bhi	.L716
+.L798:
+	.loc 1 1274 0
+	add	x0, x29, 152
+	.loc 1 1280 0
+	str	wzr, [x28, 76]
+	.loc 1 1274 0
+	str	x0, [x28, 200]
+	.loc 1 1281 0
+	str	x23, [x28, 208]
+	.loc 1 1275 0
+	ldr	x0, [x28, 136]
+	str	x0, [x29, 168]
+	.loc 1 1284 0
+	ldr	w0, [x23, 40]
+	sub	w0, w0, #7
+	.loc 1 1283 0
+	cmp	w0, 4
+	bls	.L800
+	.p2align 2
+.L717:
+	.loc 1 1295 0
+	cbnz	w21, .L752
+	.loc 1 1299 0
+	ldr	w0, [x28, 48]
+	cmp	w0, 0
+	ble	.L722
+	.loc 1 1300 0
 	add	w24, w24, 1
-	.loc 1 1228 0
-	cmp	w1, w24
-	ble	.L787
-.L693:
-	.loc 1 1235 0
-	cmp	w9, 12
-	beq	.L788
-.L694:
-	.loc 1 1241 0
+	.loc 1 1301 0
+	cmp	w0, w24
+	bgt	.L722
+	.loc 1 1302 0
+	mov	w0, 2
+	.loc 1 1303 0
+	mov	w24, 0
+	.loc 1 1302 0
+	str	w0, [x23, 40]
+.L722:
+	.loc 1 1307 0
 	ldr	w0, [x28, 184]
-	cbz	w0, .L789
-.L695:
-	.loc 1 1244 0
+	cbz	w0, .L801
+.L723:
+	.loc 1 1310 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL739:
+.LVL763:
 	mov	w21, w0
-	cbz	w0, .L696
-	.loc 1 1245 0
+	cbz	w0, .L724
+	.loc 1 1311 0
 	ldr	x0, [x28, 88]
-	adrp	x1, .LC83
-	.loc 1 1248 0
+	adrp	x1, .LC82
+	.loc 1 1314 0
 	mov	w21, 0
-	.loc 1 1245 0
-	add	x1, x1, :lo12:.LC83
+	.loc 1 1311 0
+	add	x1, x1, :lo12:.LC82
 	bl	_dev_err
-.LVL740:
-	.loc 1 1247 0
+.LVL764:
+	.loc 1 1313 0
 	str	x26, [x28, 200]
-.LVL741:
-.L659:
-	.loc 1 1279 0
+.LVL765:
+.L690:
+	.loc 1 1345 0
 	ldr	x0, [x28, 208]
 	ldr	w0, [x0, 40]
+	cmp	w0, 19
+	beq	.L802
+.L729:
+	.loc 1 1351 0
 	cmp	w0, 17
-	beq	.L790
-.L701:
-	.loc 1 1285 0
-	cmp	w0, 15
-	beq	.L791
-.L702:
-	.loc 1 1294 0
+	beq	.L803
+.L730:
+	.loc 1 1360 0
 	mov	x0, x23
 	bl	ebc_remove_from_dsp_buf_list
-.LVL742:
-	.loc 1 1296 0
+.LVL766:
+	.loc 1 1362 0
 	ldr	w0, [x28, 428]
-	cbnz	w0, .L792
-.L703:
-	.loc 1 1299 0
+	cbnz	w0, .L804
+.L731:
+	.loc 1 1365 0
 	mov	w0, 1
 	str	w0, [x28, 428]
-.L704:
-	.loc 1 1301 0
+.L732:
+	.loc 1 1367 0
 	ldr	x0, [x28, 208]
 	str	x0, [x28, 200]
-	.loc 1 1302 0
-	b	.L624
-.LVL743:
-	.p2align 3
-.L644:
-	.loc 1 1093 0
-	cmp	w2, 17
-	bgt	.L649
-	cmp	w2, 14
-	bge	.L720
-	cmp	w2, 12
-	beq	.L720
-	cmp	w2, 13
-	beq	.L647
-.L643:
-	.loc 1 1271 0
-	ldr	x0, [x28, 88]
-	adrp	x1, .LC86
-	add	x1, x1, :lo12:.LC86
-	bl	_dev_err
-.LVL744:
-	.loc 1 1272 0
-	b	.L659
-.LVL745:
+	.loc 1 1368 0
+	b	.L655
+.LVL767:
 	.p2align 3
-.L772:
-	.loc 1 1039 0
+.L785:
+	.loc 1 1113 0
 	str	wzr, [x28, 604]
-	.loc 1 1038 0
+	.loc 1 1112 0
 	str	wzr, [x28, 608]
-	b	.L629
-.LVL746:
+	b	.L660
+.LVL768:
 	.p2align 3
-.L776:
-.LBB1691:
-	.loc 1 1306 0 discriminator 1
+.L789:
+.LBB1805:
+	.loc 1 1372 0 discriminator 1
 	ldr	w0, [x28, 80]
-	cbnz	w0, .L705
-.LBB1692:
-	.loc 1 1306 0 is_stmt 0 discriminator 3
+	cbnz	w0, .L733
+.LBB1806:
+	.loc 1 1372 0 is_stmt 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL747:
-	b	.L709
+.LVL769:
+	b	.L737
 	.p2align 3
-.L793:
-.LBB1693:
-	.loc 1 1306 0 discriminator 7
+.L805:
+.LBB1807:
+	.loc 1 1372 0 discriminator 7
 	ldr	w1, [x28, 80]
-	cbnz	w1, .L706
-.LVL748:
-	.loc 1 1306 0 discriminator 9
-	cbnz	x0, .L767
-	.loc 1 1306 0 discriminator 11
+	cbnz	w1, .L734
+.LVL770:
+	.loc 1 1372 0 discriminator 9
+	cbnz	x0, .L780
+	.loc 1 1372 0 discriminator 11
 	bl	schedule
-.LVL749:
-.L709:
-	.loc 1 1306 0 discriminator 13
+.LVL771:
+.L737:
+	.loc 1 1372 0 discriminator 13
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL750:
+.LVL772:
 	ldr	w1, [x28, 28]
-	cbnz	w1, .L793
-.L706:
-.LBE1693:
-	.loc 1 1306 0 discriminator 8
+	cbnz	w1, .L805
+.L734:
+.LBE1807:
+	.loc 1 1372 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL751:
+.LVL773:
 	ldr	w0, [x28, 28]
-.LBE1692:
-.LBE1691:
-	.loc 1 1309 0 is_stmt 1 discriminator 8
-	cbnz	w0, .L767
-	.loc 1 1314 0
+.LBE1806:
+.LBE1805:
+	.loc 1 1375 0 is_stmt 1 discriminator 8
+	cbnz	w0, .L780
+	.loc 1 1380 0
 	ldr	w0, [x28, 184]
 	cmp	w0, 1
-	bne	.L767
+	bne	.L780
 	.p2align 2
-.L777:
-.LBB1694:
-.LBB1695:
+.L790:
+.LBB1808:
+.LBB1809:
 	mov	w1, 0
 	mov	x0, x20
-	bl	ebc_power_set.part.4
-.LVL752:
-	b	.L767
-.LVL753:
+	bl	ebc_power_set.part.8
+.LVL774:
+	b	.L780
+.LVL775:
 	.p2align 3
-.L696:
-.LBE1695:
-.LBE1694:
-	.loc 1 1256 0
+.L724:
+.LBE1809:
+.LBE1808:
+	.loc 1 1322 0
 	ldr	x0, [x28, 208]
-.LVL754:
-	adrp	x1, .LC85
-	.loc 1 1253 0
+.LVL776:
+	adrp	x1, .LC84
+	.loc 1 1319 0
 	ldr	w3, [x28, 96]
-	.loc 1 1256 0
-	add	x1, x1, :lo12:.LC85
-	.loc 1 1253 0
+	.loc 1 1322 0
+	add	x1, x1, :lo12:.LC84
+	.loc 1 1319 0
 	strb	w3, [x28, 32]
-	.loc 1 1256 0
+	.loc 1 1322 0
 	and	w3, w3, 255
 	ldr	w2, [x0, 40]
 	ldr	x0, [x28, 88]
 	bl	_dev_info
-.LVL755:
-	.loc 1 1257 0
+.LVL777:
+	.loc 1 1323 0
 	mov	w0, 1
 	str	w0, [x28, 28]
-	.loc 1 1258 0
+	.loc 1 1324 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL756:
-	.loc 1 1260 0
+.LVL778:
+	.loc 1 1326 0
 	ldr	x1, [x25, #:lo12:jiffies]
 	add	x0, x20, 672
 	str	x0, [x29, 104]
 	add	x1, x1, 900
 	bl	mod_timer
-.LVL757:
-.LBB1696:
-	.loc 1 1261 0
+.LVL779:
+.LBB1810:
+	.loc 1 1327 0
 	ldr	w0, [x28, 76]
-	cbz	w0, .L794
-.L699:
-.LVL758:
-.L697:
-.LBE1696:
-	.loc 1 1263 0 discriminator 11
+	cbz	w0, .L806
+.L727:
+.LVL780:
+.L725:
+.LBE1810:
+	.loc 1 1329 0 discriminator 11
 	ldr	x2, [x25, #:lo12:jiffies]
 	mov	x1, 402653184
 	ldr	x0, [x29, 104]
-.LVL759:
+.LVL781:
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL760:
-	.loc 1 1264 0 discriminator 11
+.LVL782:
+	.loc 1 1330 0 discriminator 11
 	str	wzr, [x28, 76]
-	.loc 1 1266 0 discriminator 11
+	.loc 1 1332 0 discriminator 11
 	str	x26, [x28, 200]
-	.loc 1 1268 0 discriminator 11
-	b	.L659
-.LVL761:
+	.loc 1 1334 0 discriminator 11
+	b	.L690
 	.p2align 3
-.L724:
-	mov	x0, x23
-	.loc 1 1223 0
-	mov	w24, 0
-	.loc 1 1235 0
-	cmp	w9, 12
-	bne	.L694
-.L788:
-	.loc 1 1237 0
-	ldr	w1, [x26, 40]
-	sub	w1, w1, #12
-	cmp	w1, 1
-	bls	.L694
-	.loc 1 1238 0
-	mov	w1, 13
-	str	w1, [x0, 40]
-	.loc 1 1241 0
+.L752:
+	.loc 1 1307 0
 	ldr	w0, [x28, 184]
-	cbnz	w0, .L695
-	.p2align 2
-.L789:
-	.loc 1 1242 0
+	.loc 1 1296 0
+	mov	w24, 0
+	.loc 1 1307 0
+	cbnz	w0, .L723
+.L801:
+	.loc 1 1308 0
 	mov	x0, x20
-	bl	ebc_power_set.constprop.8
-.LVL762:
-	b	.L695
-	.p2align 3
-.L786:
-	.loc 1 1214 0
-	ldp	w7, w0, [x20, 108]
-	.loc 1 1212 0
-	ldr	x4, [x23, 16]
-	.loc 1 1214 0
-	mul	w7, w7, w0
-	.loc 1 1213 0
-	ldr	x0, [x28, 200]
-	.loc 1 1214 0
-	lsr	w7, w7, 1
-	.loc 1 1213 0
-	ldr	x5, [x0, 16]
-.LBB1700:
-.LBB1701:
-	.loc 1 992 0
-	asr	w0, w7, 3
-	cbz	w0, .L687
-	.loc 1 996 0
-	ldr	x1, [x4]
-	ldr	x2, [x5]
-	cmp	x2, x1
-	bne	.L686
-	sub	w3, w0, #1
-	mov	x0, 8
-	add	x3, x3, 1
-	lsl	x3, x3, 3
-	b	.L689
-	.p2align 3
-.L690:
-	.loc 1 993 0
-	ldr	x2, [x4, x0]
-	add	x0, x0, 8
-	.loc 1 994 0
-	add	x1, x5, x0
-	.loc 1 996 0
-	ldr	x1, [x1, -8]
-	cmp	x2, x1
-	bne	.L686
-.L689:
-	.loc 1 992 0
-	cmp	x3, x0
-	bne	.L690
-.L687:
-	.loc 1 1002 0
-	ands	w7, w7, 7
-.LVL763:
-	beq	.L691
-	sub	w1, w7, #1
-	mov	x0, 0
-	add	x1, x1, 1
-	lsl	x1, x1, 2
-	b	.L692
-	.p2align 3
+	bl	ebc_power_set.constprop.12
+.LVL783:
+	b	.L723
+.LVL784:
 .L795:
-	add	x0, x0, 4
-	.loc 1 1003 0
-	cmp	x1, x0
-	beq	.L691
-.L692:
-.LBB1702:
-	.loc 1 1007 0
-	ldrb	w3, [x4, x0]
-	ldrb	w2, [x5, x0]
-	cmp	w3, w2
-	beq	.L795
-	b	.L686
-.L787:
-.LBE1702:
-.LBE1701:
-.LBE1700:
-	.loc 1 1229 0
-	mov	w0, 2
-	str	w0, [x23, 40]
-	.loc 1 1230 0
-	mov	w24, 0
-	ldr	x0, [x28, 208]
-	ldr	w9, [x0, 40]
-	b	.L693
-.LVL764:
-.L782:
-	.loc 1 1087 0
+	.loc 1 1161 0
 	ldr	x0, [x28, 88]
-	adrp	x1, .LC79
-	add	x1, x1, :lo12:.LC79
+	adrp	x1, .LC78
+	add	x1, x1, :lo12:.LC78
 	bl	_dev_info
-.LVL765:
-.LBB1703:
-	.loc 1 1088 0
+.LVL785:
+.LBB1814:
+	.loc 1 1162 0
 	ldr	w0, [x28, 76]
-	cbz	w0, .L796
-.L641:
-.LVL766:
-.L639:
-.LBE1703:
-	.loc 1 1089 0 discriminator 11
+	cbz	w0, .L807
+.L672:
+.LVL786:
+.L670:
+.LBE1814:
+	.loc 1 1163 0 discriminator 11
 	ldr	x0, [x28, 88]
-.LVL767:
-	adrp	x1, .LC80
-	add	x1, x1, :lo12:.LC80
+.LVL787:
+	adrp	x1, .LC79
+	add	x1, x1, :lo12:.LC79
 	bl	_dev_info
-.LVL768:
-	b	.L765
-.LVL769:
-.L794:
-.LBB1707:
-.LBB1697:
-.LBB1698:
-	.loc 1 1261 0 discriminator 1
-	add	x27, x22, 352
-.LBE1698:
-	mov	w1, 0
-	add	x0, x29, 112
-	bl	init_wait_entry
-.LVL770:
-	b	.L700
-	.p2align 3
-.L797:
-.LVL771:
-.LBB1699:
-	.loc 1 1261 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L697
-	.loc 1 1261 0 discriminator 7
-	bl	schedule
-.LVL772:
-.L700:
-	.loc 1 1261 0 discriminator 9
-	add	x1, x29, 112
-	mov	w2, 1
-	mov	x0, x27
-	bl	prepare_to_wait_event
-.LVL773:
-	ldr	w1, [x28, 76]
-	cbz	w1, .L797
-.LBE1699:
-	.loc 1 1261 0 discriminator 4
-	mov	x0, x27
-	add	x1, x29, 112
-	bl	finish_wait
-.LVL774:
-.LBE1697:
-.LBE1707:
-	.loc 1 1263 0 is_stmt 1 discriminator 4
-	ldr	x2, [x25, #:lo12:jiffies]
-	mov	x1, 402653184
-	ldr	x0, [x29, 104]
-	add	x1, x2, x1
-	bl	mod_timer
-.LVL775:
-	.loc 1 1264 0 discriminator 4
-	str	wzr, [x28, 76]
-	.loc 1 1266 0 discriminator 4
-	str	x26, [x28, 200]
-	b	.L659
-.LVL776:
+.LVL788:
+	b	.L778
 	.p2align 3
-.L720:
-	.loc 1 1192 0
-	ldr	x26, [x28, 200]
-.LVL777:
-	.loc 1 1184 0
-	mov	w21, 1
-	.loc 1 1193 0
-	ldr	w0, [x26, 40]
-	cmp	w0, 1
-	bhi	.L685
-.L785:
-	.loc 1 1198 0
-	add	x0, x29, 152
-	str	x0, [x28, 200]
-	.loc 1 1199 0
-	ldr	x0, [x28, 136]
-	str	x0, [x29, 168]
-	b	.L685
-.LVL778:
+.L674:
+	.loc 1 1337 0
+	ldr	x0, [x28, 88]
+	adrp	x1, .LC85
+	add	x1, x1, :lo12:.LC85
+	bl	_dev_err
+.LVL789:
+	.loc 1 1338 0
+	b	.L690
 	.p2align 3
-.L646:
-	.loc 1 1095 0
+.L677:
+	.loc 1 1169 0
 	ldr	w0, [x28, 604]
-	cbz	w0, .L651
-	.loc 1 1108 0
+	cbz	w0, .L682
+	.loc 1 1182 0
 	ldr	x0, [x28, 200]
-	.loc 1 1106 0
+	.loc 1 1180 0
 	str	x23, [x28, 208]
-	.loc 1 1096 0
+	.loc 1 1170 0
 	str	w2, [x28, 608]
-	.loc 1 1108 0
+	.loc 1 1182 0
 	ldr	w1, [x0, 40]
 	cmp	w1, 1
-	bls	.L798
-	.loc 1 1110 0
+	bls	.L808
+	.loc 1 1184 0
 	ldr	x1, [x0, 16]
 	ldrsw	x2, [x28, 20]
 	ldr	x0, [x28, 128]
 	bl	memcpy
-.LVL779:
-	.loc 1 1111 0
+.LVL790:
+	.loc 1 1185 0
 	ldr	x0, [x28, 200]
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x28, 136]
 	bl	memcpy
-.LVL780:
-	.loc 1 1112 0
+.LVL791:
+	.loc 1 1186 0
 	ldr	x0, [x28, 200]
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x28, 144]
 	bl	memcpy
-.LVL781:
+.LVL792:
 	ldr	x0, [x28, 208]
-.L654:
-.LBB1708:
-.LBB1709:
+.L685:
+.LBB1818:
+.LBB1819:
 	.loc 1 374 0
 	ldp	w3, w16, [x0, 48]
 	.loc 1 433 0
@@ -8363,23 +8672,23 @@ ebc_thread:
 	asr	w10, w10, 3
 	.loc 1 377 0
 	asr	w18, w18, 3
-.LVL782:
+.LVL793:
 	.loc 1 373 0
 	add	w10, w10, 1
-.LVL783:
+.LVL794:
 	ldr	w1, [x20, 236]
 	.loc 1 380 0
 	cmp	w10, w18
-.LBE1709:
-.LBE1708:
-	.loc 1 1117 0
+.LBE1819:
+.LBE1818:
+	.loc 1 1191 0
 	ldr	x13, [x0, 16]
-.LBB1713:
-.LBB1710:
+.LBB1824:
+.LBB1820:
 	.loc 1 380 0
 	sub	w0, w18, #1
 	csel	w10, w0, w10, ge
-.LVL784:
+.LVL795:
 	.loc 1 382 0
 	cmp	w1, w25
 	sub	w1, w1, #1
@@ -8389,106 +8698,106 @@ ebc_thread:
 	csel	w25, w1, w25, le
 	.loc 1 372 0
 	asr	w17, w17, 3
-.LVL785:
+.LVL796:
 	mul	w7, w16, w18
 	.loc 1 384 0
 	cmp	w16, w25
-.LBE1710:
-.LBE1713:
-	.loc 1 1117 0
+.LBE1820:
+.LBE1824:
+	.loc 1 1191 0
 	ldr	x9, [x28, 128]
-	.loc 1 1118 0
+	.loc 1 1192 0
 	ldp	x12, x11, [x28, 144]
-.LBB1714:
-.LBB1711:
+.LBB1825:
+.LBB1821:
 	.loc 1 384 0
-	bgt	.L662
-.LVL786:
+	bgt	.L693
+.LVL797:
 	.p2align 2
-.L745:
+.L763:
 	.loc 1 389 0
 	mov	w5, w17
 	cmp	w17, w10
-	ble	.L746
-	b	.L679
-.LVL787:
+	ble	.L764
+	b	.L710
+.LVL798:
 	.p2align 3
-.L663:
+.L694:
 	.loc 1 402 0
 	tst	x2, 65280
-	bne	.L664
+	bne	.L695
 	.loc 1 403 0
 	and	w27, w0, 240
 	cmp	w27, 224
-	beq	.L799
+	beq	.L809
 	.loc 1 406 0
 	orr	w3, w3, 240
-.L664:
+.L695:
 	.loc 1 408 0
 	tst	x2, 16711680
-	bne	.L666
+	bne	.L697
 	.loc 1 409 0
 	and	w27, w0, 3840
 	cmp	w27, 3584
-	beq	.L800
+	beq	.L810
 	.loc 1 412 0
 	orr	w3, w3, 3840
-.L666:
+.L697:
 	.loc 1 414 0
 	tst	x2, 4278190080
-	bne	.L668
+	bne	.L699
 	.loc 1 415 0
 	and	w27, w0, 61440
 	cmp	w27, 57344
-	beq	.L801
+	beq	.L811
 	.loc 1 418 0
 	orr	w3, w3, 61440
-.L668:
+.L699:
 	.loc 1 420 0
 	tst	x2, 1095216660480
-	bne	.L670
+	bne	.L701
 	.loc 1 421 0
 	and	w27, w0, 983040
 	cmp	w27, 917504
-	beq	.L802
+	beq	.L812
 	.loc 1 424 0
 	orr	w3, w3, 983040
-.L670:
+.L701:
 	.loc 1 426 0
 	tst	x2, 280375465082880
-	bne	.L672
+	bne	.L703
 	.loc 1 427 0
 	and	w27, w0, 15728640
 	cmp	w27, 14680064
-	beq	.L803
+	beq	.L813
 	.loc 1 430 0
 	orr	w3, w3, 15728640
-.L672:
+.L703:
 	.loc 1 432 0
 	tst	x2, 71776119061217280
-	bne	.L674
+	bne	.L705
 	.loc 1 433 0
 	and	w27, w0, 251658240
 	cmp	w27, w15
-	beq	.L804
+	beq	.L814
 	.loc 1 436 0
 	orr	w3, w3, 251658240
-.L674:
+.L705:
 	.loc 1 438 0
 	tst	x2, -72057594037927936
-	bne	.L676
+	bne	.L707
 	.loc 1 439 0
 	and	w2, w0, -268435456
-.LVL788:
+.LVL799:
 	cmp	w2, w14
-	beq	.L805
+	beq	.L815
 	.loc 1 442 0
 	orr	w3, w3, -268435456
-.LVL789:
-.L676:
+.LVL800:
+.L707:
 	.loc 1 445 0
 	and	w0, w0, w26
-.LVL790:
+.LVL801:
 	.loc 1 389 0
 	add	w5, w5, 1
 	eor	w0, w0, w4
@@ -8499,19 +8808,19 @@ ebc_thread:
 	.loc 1 446 0
 	str	w0, [x9, x1]
 	.loc 1 389 0
-	bgt	.L679
-.LVL791:
-.L746:
+	bgt	.L710
+.LVL802:
+.L764:
 	.loc 1 390 0
 	sxtw	x1, w5
-.LVL792:
+.LVL803:
 	.loc 1 394 0
 	mov	w3, 0
 	.loc 1 393 0
 	lsl	x0, x1, 3
 	.loc 1 390 0
 	lsl	x1, x1, 2
-.LVL793:
+.LVL804:
 	.loc 1 393 0
 	add	x0, x0, x7, sxtw 3
 	add	x1, x1, x7, sxtw 2
@@ -8524,197 +8833,215 @@ ebc_thread:
 	and	x27, x2, 255
 	.loc 1 392 0
 	ldr	w26, [x12, x1]
-.LVL794:
+.LVL805:
 	.loc 1 396 0
-	cbnz	x27, .L663
-.LVL795:
+	cbnz	x27, .L694
+.LVL806:
 	.loc 1 397 0
 	and	w3, w0, 15
-.LVL796:
+.LVL807:
 	cmp	w3, 14
 	.loc 1 400 0
 	mov	w3, 15
-.LVL797:
+.LVL808:
 	.loc 1 397 0
-	bne	.L663
+	bne	.L694
 	.loc 1 398 0
 	orr	w4, w4, w3
-.LVL798:
+.LVL809:
 	.loc 1 394 0
 	mov	w3, 0
-.LVL799:
-	b	.L663
-.LVL800:
+.LVL810:
+	b	.L694
+.LVL811:
 	.p2align 3
-.L780:
-.LBE1711:
-.LBE1714:
-	.loc 1 1055 0
+.L793:
+.LBE1821:
+.LBE1825:
+	.loc 1 1129 0
 	str	wzr, [x28, 608]
-	b	.L629
-.LVL801:
-.L791:
-	.loc 1 1289 0
+	b	.L660
+.LVL812:
+.L803:
+	.loc 1 1355 0
 	ldr	x0, [x28, 88]
-	.loc 1 1287 0
+	.loc 1 1353 0
 	mov	w25, 1
-.LVL802:
-	.loc 1 1286 0
+.LVL813:
+	.loc 1 1352 0
 	str	wzr, [x28, 188]
-	.loc 1 1289 0
-	adrp	x1, .LC88
-	.loc 1 1287 0
+	.loc 1 1355 0
+	adrp	x1, .LC87
+	.loc 1 1353 0
 	str	w25, [x28, 592]
-	.loc 1 1289 0
-	add	x1, x1, :lo12:.LC88
-	.loc 1 1288 0
+	.loc 1 1355 0
+	add	x1, x1, :lo12:.LC87
+	.loc 1 1354 0
 	str	wzr, [x28, 608]
-	.loc 1 1289 0
+	.loc 1 1355 0
 	bl	_dev_info
-.LVL803:
-	.loc 1 1290 0
+.LVL814:
+	.loc 1 1356 0
 	mov	x0, 2
 	bl	ebc_notify
-.LVL804:
-	.loc 1 1291 0
+.LVL815:
+	.loc 1 1357 0
 	mov	w2, w25
 	mov	w1, w25
 	add	x0, x22, 328
 	bl	__wake_up_sync
-.LVL805:
-	b	.L702
-.L798:
+.LVL816:
+	b	.L730
+.LVL817:
+.L806:
+.LBB1826:
+.LBB1811:
+.LBB1812:
+	.loc 1 1327 0 discriminator 1
+	add	x27, x22, 352
+.LBE1812:
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL818:
+	b	.L728
+	.p2align 3
+.L816:
+.LVL819:
+.LBB1813:
+	.loc 1 1327 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L725
+	.loc 1 1327 0 discriminator 7
+	bl	schedule
+.LVL820:
+.L728:
+	.loc 1 1327 0 discriminator 9
+	add	x1, x29, 112
+	mov	w2, 1
+	mov	x0, x27
+	bl	prepare_to_wait_event
+.LVL821:
+	ldr	w1, [x28, 76]
+	cbz	w1, .L816
+.LBE1813:
+	.loc 1 1327 0 discriminator 4
+	mov	x0, x27
+	add	x1, x29, 112
+	bl	finish_wait
+.LVL822:
+	b	.L725
+.LVL823:
+.L808:
+.LBE1811:
+.LBE1826:
 	mov	x0, x23
-	.loc 1 1113 0
-	cbnz	w1, .L654
-	.loc 1 1114 0
+	.loc 1 1187 0 is_stmt 1
+	cbnz	w1, .L685
+	.loc 1 1188 0
 	ldrsw	x2, [x28, 20]
 	ldp	x1, x0, [x28, 136]
 	bl	memcpy
-.LVL806:
+.LVL824:
 	ldr	x0, [x28, 208]
-	b	.L654
-.L681:
-	.loc 1 1150 0
+	b	.L685
+.L712:
+	.loc 1 1224 0
 	ldr	x1, [x23, 16]
 	mov	x3, x28
 	ldr	x0, [x28, 128]
 	ldr	x2, [x28, 152]
 	bl	refresh_new_image_auto
-.LVL807:
-	b	.L682
-.LVL808:
-.L691:
-	.loc 1 1215 0
-	ldr	x0, [x28, 88]
-	adrp	x1, .LC89
-	add	x1, x1, :lo12:.LC89
-	bl	_dev_info
-.LVL809:
-	.loc 1 1217 0
-	str	x26, [x28, 200]
-	.loc 1 1218 0
-	b	.L659
-.LVL810:
-.L784:
-	.loc 1 1161 0
+.LVL825:
+	b	.L713
+.L797:
+	.loc 1 1235 0
 	ldr	x0, [x28, 88]
-	adrp	x1, .LC83
-	add	x1, x1, :lo12:.LC83
+	adrp	x1, .LC82
+	add	x1, x1, :lo12:.LC82
 	bl	_dev_err
-.LVL811:
-	.loc 1 1162 0
-	b	.L659
-.L783:
-	.loc 1 1159 0
-	mov	x0, x20
-	bl	ebc_power_set.constprop.8
-.LVL812:
-	b	.L683
+.LVL826:
+	.loc 1 1236 0
+	b	.L690
 .L796:
-.LBB1715:
-.LBB1704:
-.LBB1705:
-	.loc 1 1088 0 discriminator 1
+	.loc 1 1233 0
+	mov	x0, x20
+	bl	ebc_power_set.constprop.12
+.LVL827:
+	b	.L714
+.L807:
+.LBB1827:
+.LBB1815:
+.LBB1816:
+	.loc 1 1162 0 discriminator 1
 	add	x26, x22, 352
-.LVL813:
-.LBE1705:
+.LVL828:
+.LBE1816:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL814:
-	b	.L642
+.LVL829:
+	b	.L673
 	.p2align 3
-.L806:
-.LVL815:
-.LBB1706:
-	.loc 1 1088 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L639
-	.loc 1 1088 0 discriminator 7
+.L817:
+.LVL830:
+.LBB1817:
+	.loc 1 1162 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L670
+	.loc 1 1162 0 discriminator 7
 	bl	schedule
-.LVL816:
-.L642:
-	.loc 1 1088 0 discriminator 9
+.LVL831:
+.L673:
+	.loc 1 1162 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x26
 	bl	prepare_to_wait_event
-.LVL817:
+.LVL832:
 	ldr	w1, [x28, 76]
-	cbz	w1, .L806
-.LBE1706:
-	.loc 1 1088 0 discriminator 4
+	cbz	w1, .L817
+.LBE1817:
+	.loc 1 1162 0 discriminator 4
 	mov	x0, x26
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL818:
-	b	.L639
-.LVL819:
-	.p2align 3
-.L803:
-.LBE1704:
-.LBE1715:
-.LBB1716:
-.LBB1712:
-	.loc 1 428 0 is_stmt 1
-	orr	w4, w4, 15728640
-	b	.L672
-	.p2align 3
-.L804:
-	.loc 1 434 0
-	orr	w4, w4, 251658240
-	b	.L674
-	.p2align 3
-.L799:
-	.loc 1 404 0
-	orr	w4, w4, 240
-	b	.L664
-	.p2align 3
-.L800:
-	.loc 1 410 0
-	orr	w4, w4, 3840
-	b	.L666
+.LVL833:
+	b	.L670
+.LVL834:
 	.p2align 3
-.L801:
-	.loc 1 416 0
+.L811:
+.LBE1815:
+.LBE1827:
+.LBB1828:
+.LBB1822:
+	.loc 1 416 0 is_stmt 1
 	orr	w4, w4, 61440
-	b	.L668
+	b	.L699
 	.p2align 3
-.L802:
+.L812:
 	.loc 1 422 0
 	orr	w4, w4, 983040
-	b	.L670
-.LVL820:
+	b	.L701
 	.p2align 3
-.L805:
+.L813:
+	.loc 1 428 0
+	orr	w4, w4, 15728640
+	b	.L703
+	.p2align 3
+.L814:
+	.loc 1 434 0
+	orr	w4, w4, 251658240
+	b	.L705
+.LVL835:
+	.p2align 3
+.L815:
 	.loc 1 440 0
 	orr	w4, w4, -268435456
-.LVL821:
+.LVL836:
 	.loc 1 445 0
 	and	w0, w0, w26
-.LVL822:
+.LVL837:
 	eor	w0, w0, w4
-.LVL823:
+.LVL838:
 	.loc 1 389 0
 	add	w5, w5, 1
 	and	w0, w0, w3
@@ -8724,91 +9051,106 @@ ebc_thread:
 	.loc 1 446 0
 	str	w0, [x9, x1]
 	.loc 1 389 0
-	ble	.L746
-.LVL824:
+	ble	.L764
+.LVL839:
 	.p2align 2
-.L679:
+.L710:
 	.loc 1 384 0
 	add	w16, w16, 1
 	add	w7, w7, w18
 	cmp	w16, w25
-	ble	.L745
-.L662:
-.LBE1712:
-.LBE1716:
-	.loc 1 1121 0
+	ble	.L763
+.L693:
+.LBE1822:
+.LBE1828:
+	.loc 1 1195 0
 	ldr	w0, [x28, 28]
-	cbnz	w0, .L659
-	.loc 1 1124 0
+	cbnz	w0, .L690
+	.loc 1 1198 0
 	ldr	w0, [x28, 184]
-	.loc 1 1122 0
+	.loc 1 1196 0
 	mov	w1, 1
-	.loc 1 1123 0
+	.loc 1 1197 0
 	str	wzr, [x28, 76]
-	.loc 1 1122 0
+	.loc 1 1196 0
 	str	w1, [x28, 28]
-	.loc 1 1124 0
-	cbz	w0, .L807
-.L680:
-	.loc 1 1126 0
+	.loc 1 1198 0
+	cbz	w0, .L818
+.L711:
+	.loc 1 1200 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL825:
+.LVL840:
 	cmn	w0, #1
-	beq	.L659
-	.loc 1 1130 0
+	beq	.L690
+	.loc 1 1204 0
 	ldr	w3, [x28, 96]
-	.loc 1 1133 0
-	adrp	x1, .LC82
-	.loc 1 1130 0
+	.loc 1 1207 0
+	adrp	x1, .LC81
+	.loc 1 1204 0
 	strb	w3, [x28, 32]
-	.loc 1 1133 0
-	add	x1, x1, :lo12:.LC82
+	.loc 1 1207 0
+	add	x1, x1, :lo12:.LC81
 	ldr	x0, [x28, 88]
-	b	.L766
-.LVL826:
-.L651:
-	.loc 1 1099 0
+	b	.L779
+.LVL841:
+	.p2align 3
+.L809:
+.LBB1829:
+.LBB1823:
+	.loc 1 404 0
+	orr	w4, w4, 240
+	b	.L695
+	.p2align 3
+.L810:
+	.loc 1 410 0
+	orr	w4, w4, 3840
+	b	.L697
+.LVL842:
+.L682:
+.LBE1823:
+.LBE1829:
+	.loc 1 1173 0
 	ldr	x0, [x28, 88]
-	adrp	x1, .LC81
-	add	x1, x1, :lo12:.LC81
+	adrp	x1, .LC80
+	add	x1, x1, :lo12:.LC80
 	bl	_dev_info
-.LVL827:
-	.loc 1 1100 0
+.LVL843:
+	.loc 1 1174 0
 	mov	x0, x23
-	b	.L764
-.LVL828:
-.L774:
-.LBB1717:
-.LBB1718:
+	b	.L777
+.LVL844:
+.L787:
+.LBB1830:
+.LBB1831:
 	mov	w1, 0
 	mov	x0, x20
-	bl	ebc_power_set.part.4
-.LVL829:
-	b	.L626
-.LVL830:
-.L807:
-.LBE1718:
-.LBE1717:
-	.loc 1 1125 0
+	bl	ebc_power_set.part.8
+.LVL845:
+	b	.L657
+.LVL846:
+.L818:
+.LBE1831:
+.LBE1830:
+	.loc 1 1199 0
 	mov	x0, x20
-	bl	ebc_power_set.constprop.8
-.LVL831:
-	b	.L680
-.LVL832:
-.L781:
-	.loc 1 1072 0
+	bl	ebc_power_set.constprop.12
+.LVL847:
+	b	.L711
+.LVL848:
+.L794:
+	.loc 1 1146 0
 	mov	x0, x20
-	bl	ebc_power_set.constprop.8
-.LVL833:
-	b	.L634
-.LVL834:
-.L775:
-	.loc 1 1324 0
+	bl	ebc_power_set.constprop.12
+.LVL849:
+	b	.L665
+.LVL850:
+.L788:
+	.loc 1 1390 0
 	bl	__stack_chk_fail
-.LVL835:
+.LVL851:
 	.cfi_endproc
-.LFE2820:
+.LFE2825:
 	.size	ebc_thread, .-ebc_thread
 	.data
 	.align	3
@@ -8819,7 +9161,7 @@ ebc_driver:
 	.xword	ebc_probe
 	.xword	ebc_remove
 	.zero	24
-	.xword	.LC90
+	.xword	.LC89
 	.zero	32
 	.xword	ebc_match
 	.zero	64
@@ -8831,7 +9173,7 @@ ebc_driver:
 ebc_misc:
 	.word	243
 	.zero	4
-	.xword	.LC43
+	.xword	.LC42
 	.xword	ebc_ops
 	.zero	56
 	.type	ebc_thread_wq, %object
@@ -8865,7 +9207,7 @@ ebc_auto_thread_sem:
 	.type	dev_attr_waveform_version, %object
 	.size	dev_attr_waveform_version, 32
 dev_attr_waveform_version:
-	.xword	.LC96
+	.xword	.LC95
 	.hword	292
 	.zero	6
 	.xword	waveform_version_read
@@ -8873,7 +9215,7 @@ dev_attr_waveform_version:
 	.type	dev_attr_pmic_name, %object
 	.size	dev_attr_pmic_name, 32
 dev_attr_pmic_name:
-	.xword	.LC95
+	.xword	.LC94
 	.hword	292
 	.zero	6
 	.xword	pmic_name_read
@@ -8881,7 +9223,7 @@ dev_attr_pmic_name:
 	.type	dev_attr_pmic_temp, %object
 	.size	dev_attr_pmic_temp, 32
 dev_attr_pmic_temp:
-	.xword	.LC94
+	.xword	.LC93
 	.hword	292
 	.zero	6
 	.xword	pmic_temp_read
@@ -8889,7 +9231,7 @@ dev_attr_pmic_temp:
 	.type	dev_attr_pmic_vcom, %object
 	.size	dev_attr_pmic_vcom, 32
 dev_attr_pmic_vcom:
-	.xword	.LC93
+	.xword	.LC92
 	.hword	420
 	.zero	6
 	.xword	pmic_vcom_read
@@ -8897,7 +9239,7 @@ dev_attr_pmic_vcom:
 	.type	dev_attr_ebc_version, %object
 	.size	dev_attr_ebc_version, 32
 dev_attr_ebc_version:
-	.xword	.LC92
+	.xword	.LC91
 	.hword	292
 	.zero	6
 	.xword	ebc_version_read
@@ -8905,7 +9247,7 @@ dev_attr_ebc_version:
 	.type	dev_attr_ebc_state, %object
 	.size	dev_attr_ebc_state, 32
 dev_attr_ebc_state:
-	.xword	.LC91
+	.xword	.LC90
 	.hword	292
 	.zero	6
 	.xword	ebc_state_read
@@ -8934,24 +9276,24 @@ ebc_auto_task:
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.34862, %object
-	.size	__func__.34862, 11
-__func__.34862:
+	.type	__func__.34937, %object
+	.size	__func__.34937, 11
+__func__.34937:
 	.string	"ebc_io_ctl"
 	.align	3
 	.set	.LANCHOR3,. + 0
-	.type	__func__.34667, %object
-	.size	__func__.34667, 16
-__func__.34667:
+	.type	__func__.34740, %object
+	.size	__func__.34740, 16
+__func__.34740:
 	.string	"ebc_frame_start"
-	.type	__func__.35129, %object
-	.size	__func__.35129, 12
-__func__.35129:
+	.type	__func__.35204, %object
+	.size	__func__.35204, 12
+__func__.35204:
 	.string	"ebc_suspend"
 	.zero	4
-	.type	__func__.35070, %object
-	.size	__func__.35070, 19
-__func__.35070:
+	.type	__func__.35145, %object
+	.size	__func__.35145, 19
+__func__.35145:
 	.string	"ebc_lut_table_init"
 	.zero	5
 	.type	ebc_match, %object
@@ -8982,9 +9324,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init2194, %object
-	.size	__addressable_ebc_init2194, 8
-__addressable_ebc_init2194:
+	.type	__addressable_ebc_init2261, %object
+	.size	__addressable_ebc_init2261, 8
+__addressable_ebc_init2261:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -9039,7 +9381,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC15:
-	.string	"2.02"
+	.string	"2.03"
 	.zero	3
 .LC16:
 	.string	"%s\n"
@@ -9051,228 +9393,225 @@ __exitcall_ebc_exit:
 	.string	"set vcom value failed\n"
 	.zero	1
 .LC19:
-	.string	"%s: overlay mode no need to update\n"
-	.zero	4
+	.string	"%s: no need to update\n"
+	.zero	1
 .LC20:
-	.string	"%s: auto mode no need to update\n"
-	.zero	7
-.LC21:
 	.string	"ebc hw power off\n"
 	.zero	6
-.LC22:
+.LC21:
 	.string	"%s: device is busy now...\n"
 	.zero	5
-.LC23:
+.LC22:
 	.string	"device suspend\n"
-.LC24:
+.LC23:
 	.string	"ebc_tcon"
 	.zero	7
-.LC25:
+.LC24:
 	.string	"not find ebc tcon\n"
 	.zero	5
-.LC26:
+.LC25:
 	.string	"pmic"
 	.zero	3
-.LC27:
+.LC26:
 	.string	"not find pmic node\n"
 	.zero	4
-.LC28:
+.LC27:
 	.string	"not find pmic i2c client\n"
 	.zero	6
-.LC29:
+.LC28:
 	.string	"get drvdata from pmic client failed\n"
 	.zero	3
-.LC30:
+.LC29:
 	.string	"panel,width"
 	.zero	4
-.LC31:
+.LC30:
 	.string	"panel,panel_color"
 	.zero	6
-.LC32:
+.LC31:
 	.string	"panel,mirror"
 	.zero	3
-.LC33:
+.LC32:
 	.string	"panel,width-mm"
 	.zero	1
-.LC34:
+.LC33:
 	.string	"panel,height-mm"
-.LC35:
+.LC34:
 	.string	"memory-region"
 	.zero	2
-.LC36:
+.LC35:
 	.string	"Couldn't address to resource for reserved memory\n"
 	.zero	6
-.LC37:
+.LC36:
 	.string	"waveform-region"
-.LC38:
+.LC37:
 	.string	"%s:%d: failed to get mem from reserved\n"
-.LC39:
+.LC38:
 	.string	"Failed to read waveform from mem, we use waveform file from kernel file instead\n"
 	.zero	7
-.LC40:
+.LC39:
 	.string	"Failed to read waveform file from kernel, no waveform!!!\n"
 	.zero	6
-.LC41:
+.LC40:
 	.string	"failed to create ebc_task thread\n"
 	.zero	6
-.LC42:
+.LC41:
 	.string	"ebc_thread"
 	.zero	5
-.LC43:
+.LC42:
 	.string	"ebc"
 	.zero	4
-.LC44:
+.LC43:
 	.string	"ulogo_addr="
 	.zero	4
-.LC45:
+.LC44:
 	.string	"klogo_addr="
 	.zero	4
-.LC46:
+.LC45:
 	.string	"ulogo_addr=0x%x"
-.LC47:
+.LC46:
 	.string	"have ulogo display, ulogo addr = 0x%x\n"
 	.zero	1
-.LC48:
+.LC47:
 	.string	"malloc ulogo buffer failed\n"
 	.zero	4
-.LC49:
+.LC48:
 	.string	"klogo_addr=0x%x"
-.LC50:
+.LC49:
 	.string	"need show klogo, klogo addr = 0x%x\n"
 	.zero	4
-.LC51:
+.LC50:
 	.string	"malloc klogo buffer failed\n"
 	.zero	4
-.LC52:
+.LC51:
 	.string	"no uboot logo, panel init\n"
 	.zero	5
-.LC53:
+.LC52:
 	.string	"rockchip ebc driver %s probe success\n"
 	.zero	2
-.LC54:
+.LC53:
 	.string	"panel,height"
 	.zero	3
-.LC55:
+.LC54:
 	.string	"panel,vir_width"
-.LC56:
+.LC55:
 	.string	"panel,vir_height"
 	.zero	7
-.LC57:
+.LC56:
 	.string	"panel,sdck"
 	.zero	5
-.LC58:
+.LC57:
 	.string	"panel,lsl"
 	.zero	6
-.LC59:
+.LC58:
 	.string	"panel,lbl"
 	.zero	6
-.LC60:
+.LC59:
 	.string	"panel,ldl"
 	.zero	6
-.LC61:
+.LC60:
 	.string	"panel,lel"
 	.zero	6
-.LC62:
+.LC61:
 	.string	"panel,gdck-sta"
 	.zero	1
-.LC63:
+.LC62:
 	.string	"panel,lgonl"
 	.zero	4
-.LC64:
+.LC63:
 	.string	"panel,fsl"
 	.zero	6
-.LC65:
+.LC64:
 	.string	"panel,fbl"
 	.zero	6
-.LC66:
+.LC65:
 	.string	"panel,fdl"
 	.zero	6
-.LC67:
+.LC66:
 	.string	"panel,fel"
 	.zero	6
-.LC68:
+.LC67:
 	.string	"panel,panel_16bit"
 	.zero	6
-.LC69:
+.LC68:
 	.string	"buffer manage init failed\n"
 	.zero	5
-.LC70:
+.LC69:
 	.string	"lut table init failed\n"
 	.zero	1
-.LC71:
+.LC70:
 	.string	"ebc_task"
 	.zero	7
-.LC72:
+.LC71:
 	.string	"failed to run ebc thread\n"
 	.zero	6
-.LC73:
+.LC72:
 	.string	"task init failed\n"
 	.zero	6
-.LC74:
+.LC73:
 	.string	"failed to probe panel: %d\n"
 	.zero	5
-.LC75:
+.LC74:
 	.string	"ebc hw power on\n"
 	.zero	7
-.LC76:
+.LC75:
 	.string	"early resume\n"
 	.zero	2
-.LC77:
+.LC76:
 	.string	"overlay mode start, update background, frame_total=%d\n"
 	.zero	1
-.LC78:
+.LC77:
 	.string	"change display mode from %d to %d\n"
 	.zero	5
-.LC79:
+.LC78:
 	.string	"ebc is busy now, waiting prev refresh mode end...\n"
 	.zero	5
-.LC80:
+.LC79:
 	.string	"prev refresh mode end\n"
 	.zero	1
-.LC81:
+.LC80:
 	.string	"overlay disabled, drop EPD_OVERLAY frame\n"
 	.zero	6
-.LC82:
+.LC81:
 	.string	"overlay mode start, frame_total=%d\n"
 	.zero	4
-.LC83:
+.LC82:
 	.string	"ebc_lut_update err\n"
 	.zero	4
-.LC84:
+.LC83:
 	.string	"auto mode start, frame_total=%d\n"
 	.zero	7
-.LC85:
+.LC84:
 	.string	"frame start, mode = %d, framecount = %d\n"
 	.zero	7
-.LC86:
+.LC85:
 	.string	"ebc buffer mode error!\n"
-.LC87:
+.LC86:
 	.string	"power off\n"
 	.zero	5
-.LC88:
+.LC87:
 	.string	"early suspend\n"
 	.zero	1
-.LC89:
+.LC88:
 	.string	"check_part_mode==0, no need refresh\n"
 	.zero	3
-.LC90:
+.LC89:
 	.string	"ebc-dev"
-.LC91:
+.LC90:
 	.string	"ebc_state"
 	.zero	6
-.LC92:
+.LC91:
 	.string	"ebc_version"
 	.zero	4
-.LC93:
+.LC92:
 	.string	"pmic_vcom"
 	.zero	6
-.LC94:
+.LC93:
 	.string	"pmic_temp"
 	.zero	6
-.LC95:
+.LC94:
 	.string	"pmic_name"
 	.zero	6
-.LC96:
+.LC95:
 	.string	"waveform_version"
 	.text
 .Letext0:
@@ -9472,16 +9811,16 @@ __exitcall_ebc_exit:
 	.file 212 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x13e39
+	.4byte	0x14272
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF3277
+	.4byte	.LASF3282
 	.byte	0x1
-	.4byte	.LASF3278
-	.4byte	.LASF3279
-	.4byte	.Ldebug_ranges0+0xfc0
+	.4byte	.LASF3283
+	.4byte	.LASF3284
+	.4byte	.Ldebug_ranges0+0x1200
 	.8byte	0
 	.4byte	.Ldebug_line0
 	.uleb128 0x2
@@ -10175,73 +10514,73 @@ __exitcall_ebc_exit:
 	.4byte	.LASF97
 	.byte	0x1f
 	.2byte	0x70e
-	.4byte	0x7550
+	.4byte	0x7566
 	.byte	0
 	.uleb128 0x1b
 	.4byte	.LASF98
 	.byte	0x1f
 	.2byte	0x70f
-	.4byte	0x8853
+	.4byte	0x8869
 	.byte	0x8
 	.uleb128 0x1b
 	.4byte	.LASF99
 	.byte	0x1f
 	.2byte	0x710
-	.4byte	0x887d
+	.4byte	0x8893
 	.byte	0x10
 	.uleb128 0x1b
 	.4byte	.LASF100
 	.byte	0x1f
 	.2byte	0x711
-	.4byte	0x88a1
+	.4byte	0x88b7
 	.byte	0x18
 	.uleb128 0x1b
 	.4byte	.LASF101
 	.byte	0x1f
 	.2byte	0x712
-	.4byte	0x78fd
+	.4byte	0x7913
 	.byte	0x20
 	.uleb128 0x1b
 	.4byte	.LASF102
 	.byte	0x1f
 	.2byte	0x713
-	.4byte	0x78fd
+	.4byte	0x7913
 	.byte	0x28
 	.uleb128 0x1b
 	.4byte	.LASF103
 	.byte	0x1f
 	.2byte	0x714
-	.4byte	0x88bb
+	.4byte	0x88d1
 	.byte	0x30
 	.uleb128 0x1b
 	.4byte	.LASF104
 	.byte	0x1f
 	.2byte	0x715
-	.4byte	0x88bb
+	.4byte	0x88d1
 	.byte	0x38
 	.uleb128 0x1b
 	.4byte	.LASF105
 	.byte	0x1f
 	.2byte	0x716
-	.4byte	0x88e0
+	.4byte	0x88f6
 	.byte	0x40
 	.uleb128 0x1b
 	.4byte	.LASF106
 	.byte	0x1f
 	.2byte	0x717
-	.4byte	0x88ff
+	.4byte	0x8915
 	.byte	0x48
 	.uleb128 0x1b
 	.4byte	.LASF107
 	.byte	0x1f
 	.2byte	0x718
-	.4byte	0x88ff
+	.4byte	0x8915
 	.byte	0x50
 	.uleb128 0x1b
 	.4byte	.LASF108
 	.byte	0x1f
 	.2byte	0x719
-	.4byte	0x8919
+	.4byte	0x892f
 	.byte	0x58
 	.uleb128 0x1b
 	.4byte	.LASF109
@@ -10253,115 +10592,115 @@ __exitcall_ebc_exit:
 	.4byte	.LASF110
 	.byte	0x1f
 	.2byte	0x71b
-	.4byte	0x8933
+	.4byte	0x8949
 	.byte	0x68
 	.uleb128 0x1b
 	.4byte	.LASF111
 	.byte	0x1f
 	.2byte	0x71c
-	.4byte	0x894d
+	.4byte	0x8963
 	.byte	0x70
 	.uleb128 0x1b
 	.4byte	.LASF112
 	.byte	0x1f
 	.2byte	0x71d
-	.4byte	0x8933
+	.4byte	0x8949
 	.byte	0x78
 	.uleb128 0x1b
 	.4byte	.LASF113
 	.byte	0x1f
 	.2byte	0x71e
-	.4byte	0x8971
+	.4byte	0x8987
 	.byte	0x80
 	.uleb128 0x1b
 	.4byte	.LASF114
 	.byte	0x1f
 	.2byte	0x71f
-	.4byte	0x8990
+	.4byte	0x89a6
 	.byte	0x88
 	.uleb128 0x1b
 	.4byte	.LASF115
 	.byte	0x1f
 	.2byte	0x720
-	.4byte	0x89af
+	.4byte	0x89c5
 	.byte	0x90
 	.uleb128 0x1b
 	.4byte	.LASF116
 	.byte	0x1f
 	.2byte	0x721
-	.4byte	0x89dd
+	.4byte	0x89f3
 	.byte	0x98
 	.uleb128 0x1b
 	.4byte	.LASF117
 	.byte	0x1f
 	.2byte	0x722
-	.4byte	0x59d3
+	.4byte	0x59e9
 	.byte	0xa0
 	.uleb128 0x1b
 	.4byte	.LASF118
 	.byte	0x1f
 	.2byte	0x723
-	.4byte	0x89f2
+	.4byte	0x8a08
 	.byte	0xa8
 	.uleb128 0x1b
 	.4byte	.LASF119
 	.byte	0x1f
 	.2byte	0x724
-	.4byte	0x89af
+	.4byte	0x89c5
 	.byte	0xb0
 	.uleb128 0x1b
 	.4byte	.LASF120
 	.byte	0x1f
 	.2byte	0x725
-	.4byte	0x8a1b
+	.4byte	0x8a31
 	.byte	0xb8
 	.uleb128 0x1b
 	.4byte	.LASF121
 	.byte	0x1f
 	.2byte	0x726
-	.4byte	0x8a44
+	.4byte	0x8a5a
 	.byte	0xc0
 	.uleb128 0x1b
 	.4byte	.LASF122
 	.byte	0x1f
 	.2byte	0x727
-	.4byte	0x8a6e
+	.4byte	0x8a84
 	.byte	0xc8
 	.uleb128 0x1b
 	.4byte	.LASF123
 	.byte	0x1f
 	.2byte	0x728
-	.4byte	0x8a92
+	.4byte	0x8aa8
 	.byte	0xd0
 	.uleb128 0x1b
 	.4byte	.LASF124
 	.byte	0x1f
 	.2byte	0x72a
-	.4byte	0x8b56
+	.4byte	0x8b6c
 	.byte	0xd8
 	.uleb128 0x1b
 	.4byte	.LASF125
 	.byte	0x1f
 	.2byte	0x72e
-	.4byte	0x8b84
+	.4byte	0x8b9a
 	.byte	0xe0
 	.uleb128 0x1b
 	.4byte	.LASF126
 	.byte	0x1f
 	.2byte	0x730
-	.4byte	0x8bad
+	.4byte	0x8bc3
 	.byte	0xe8
 	.uleb128 0x1b
 	.4byte	.LASF127
 	.byte	0x1f
 	.2byte	0x732
-	.4byte	0x8bad
+	.4byte	0x8bc3
 	.byte	0xf0
 	.uleb128 0x1b
 	.4byte	.LASF128
 	.byte	0x1f
 	.2byte	0x734
-	.4byte	0x8971
+	.4byte	0x8987
 	.byte	0xf8
 	.uleb128 0x1c
 	.4byte	.LASF129
@@ -10411,7 +10750,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF135
 	.byte	0x21
 	.byte	0x3e
-	.4byte	0x679d
+	.4byte	0x67b3
 	.byte	0x8
 	.byte	0
 	.uleb128 0x15
@@ -10775,7 +11114,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF173
 	.byte	0x26
 	.byte	0xb
-	.4byte	0x2296
+	.4byte	0x22ac
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF174
@@ -10920,7 +11259,7 @@ __exitcall_ebc_exit:
 	.byte	0xbf
 	.4byte	0x155
 	.uleb128 0x25
-	.4byte	.LASF308
+	.4byte	.LASF310
 	.byte	0x34
 	.byte	0x8
 	.4byte	0x29
@@ -11167,7 +11506,7 @@ __exitcall_ebc_exit:
 	.byte	0x12
 	.4byte	0xc6
 	.uleb128 0x2a
-	.4byte	.LASF985
+	.4byte	.LASF987
 	.byte	0
 	.byte	0x2d
 	.2byte	0x1b1
@@ -11661,186 +12000,196 @@ __exitcall_ebc_exit:
 	.byte	0x33
 	.byte	0x36
 	.4byte	0x4eb
-	.uleb128 0x2c
+	.uleb128 0x19
+	.4byte	.LASF308
+	.byte	0x33
+	.byte	0x39
+	.4byte	0x4eb
+	.uleb128 0x19
 	.4byte	.LASF309
 	.byte	0x33
-	.byte	0x38
+	.byte	0x39
+	.4byte	0x4eb
 	.uleb128 0x2c
-	.4byte	.LASF310
+	.4byte	.LASF311
 	.byte	0x33
-	.byte	0x38
+	.byte	0x3b
+	.uleb128 0x2c
+	.4byte	.LASF312
+	.byte	0x33
+	.byte	0x3b
 	.uleb128 0x19
-	.4byte	.LASF311
+	.4byte	.LASF313
 	.byte	0x35
 	.byte	0x15
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF312
+	.4byte	.LASF314
 	.byte	0x35
 	.byte	0x15
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF313
+	.4byte	.LASF315
 	.byte	0x35
 	.byte	0x16
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF314
+	.4byte	.LASF316
 	.byte	0x35
 	.byte	0x16
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF315
+	.4byte	.LASF317
 	.byte	0x35
 	.byte	0x17
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF316
+	.4byte	.LASF318
 	.byte	0x35
 	.byte	0x17
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF317
+	.4byte	.LASF319
 	.byte	0x35
 	.byte	0x18
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF318
+	.4byte	.LASF320
 	.byte	0x35
 	.byte	0x18
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF319
+	.4byte	.LASF321
 	.byte	0x35
 	.byte	0x19
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF320
+	.4byte	.LASF322
 	.byte	0x35
 	.byte	0x19
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF321
+	.4byte	.LASF323
 	.byte	0x35
 	.byte	0x1a
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF322
+	.4byte	.LASF324
 	.byte	0x35
 	.byte	0x1a
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF323
+	.4byte	.LASF325
 	.byte	0x35
 	.byte	0x1b
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF324
+	.4byte	.LASF326
 	.byte	0x35
 	.byte	0x1b
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF325
+	.4byte	.LASF327
 	.byte	0x35
 	.byte	0x1c
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF326
+	.4byte	.LASF328
 	.byte	0x35
 	.byte	0x1c
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF327
+	.4byte	.LASF329
 	.byte	0x35
 	.byte	0x1e
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF328
+	.4byte	.LASF330
 	.byte	0x35
 	.byte	0x1e
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF329
+	.4byte	.LASF331
 	.byte	0x35
 	.byte	0x1f
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF330
+	.4byte	.LASF332
 	.byte	0x35
 	.byte	0x1f
 	.4byte	0x4eb
 	.uleb128 0x5
 	.4byte	0x13a
-	.4byte	0x1301
+	.4byte	0x1317
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF331
+	.4byte	.LASF333
 	.byte	0x36
 	.byte	0x4a
-	.4byte	0x12f1
+	.4byte	0x1307
 	.uleb128 0x19
-	.4byte	.LASF332
+	.4byte	.LASF334
 	.byte	0x37
 	.byte	0x56
 	.4byte	0x331
 	.uleb128 0x26
-	.4byte	.LASF333
+	.4byte	.LASF335
 	.2byte	0x110
 	.byte	0x37
 	.byte	0x59
-	.4byte	0x1361
+	.4byte	0x1377
 	.uleb128 0xe
-	.4byte	.LASF334
+	.4byte	.LASF336
 	.byte	0x37
 	.byte	0x5c
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF335
+	.4byte	.LASF337
 	.byte	0x37
 	.byte	0x5e
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF336
+	.4byte	.LASF338
 	.byte	0x37
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF337
+	.4byte	.LASF339
 	.byte	0x37
 	.byte	0x61
-	.4byte	0x1361
+	.4byte	0x1377
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF338
+	.4byte	.LASF340
 	.byte	0x37
 	.byte	0x62
-	.4byte	0x1361
+	.4byte	0x1377
 	.byte	0x90
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x1371
-	.4byte	0x1371
+	.4byte	0x1387
+	.4byte	0x1387
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1377
+	.4byte	0x138d
 	.uleb128 0x24
-	.4byte	.LASF339
+	.4byte	.LASF341
 	.uleb128 0xd
-	.4byte	.LASF340
+	.4byte	.LASF342
 	.byte	0x68
 	.byte	0x37
 	.byte	0x66
-	.4byte	0x1422
+	.4byte	0x1438
 	.uleb128 0x20
 	.string	"x19"
 	.byte	0x37
@@ -11924,113 +12273,113 @@ __exitcall_ebc_exit:
 	.2byte	0x220
 	.byte	0x37
 	.byte	0x7e
-	.4byte	0x1450
+	.4byte	0x1466
 	.uleb128 0xe
-	.4byte	.LASF341
+	.4byte	.LASF343
 	.byte	0x37
 	.byte	0x7f
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF342
+	.4byte	.LASF344
 	.byte	0x37
 	.byte	0x80
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF343
+	.4byte	.LASF345
 	.byte	0x37
 	.byte	0x81
 	.4byte	0xca3
 	.byte	0x10
 	.byte	0
 	.uleb128 0x26
-	.4byte	.LASF344
+	.4byte	.LASF346
 	.2byte	0x3d0
 	.byte	0x37
 	.byte	0x76
-	.4byte	0x14d0
+	.4byte	0x14e6
 	.uleb128 0xe
-	.4byte	.LASF340
+	.4byte	.LASF342
 	.byte	0x37
 	.byte	0x77
-	.4byte	0x137c
+	.4byte	0x1392
 	.byte	0
 	.uleb128 0x20
 	.string	"uw"
 	.byte	0x37
 	.byte	0x82
-	.4byte	0x1422
+	.4byte	0x1438
 	.byte	0x70
 	.uleb128 0x27
-	.4byte	.LASF345
+	.4byte	.LASF347
 	.byte	0x37
 	.byte	0x84
 	.4byte	0x6d
 	.2byte	0x290
 	.uleb128 0x27
-	.4byte	.LASF346
+	.4byte	.LASF348
 	.byte	0x37
 	.byte	0x85
 	.4byte	0x443
 	.2byte	0x298
 	.uleb128 0x27
-	.4byte	.LASF347
+	.4byte	.LASF349
 	.byte	0x37
 	.byte	0x86
 	.4byte	0x6d
 	.2byte	0x2a0
 	.uleb128 0x27
-	.4byte	.LASF348
+	.4byte	.LASF350
 	.byte	0x37
 	.byte	0x87
 	.4byte	0x6d
 	.2byte	0x2a4
 	.uleb128 0x27
-	.4byte	.LASF349
+	.4byte	.LASF351
 	.byte	0x37
 	.byte	0x88
 	.4byte	0x29
 	.2byte	0x2a8
 	.uleb128 0x27
-	.4byte	.LASF350
+	.4byte	.LASF352
 	.byte	0x37
 	.byte	0x89
 	.4byte	0x29
 	.2byte	0x2b0
 	.uleb128 0x27
-	.4byte	.LASF351
+	.4byte	.LASF353
 	.byte	0x37
 	.byte	0x8a
-	.4byte	0x1317
+	.4byte	0x132d
 	.2byte	0x2b8
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF352
+	.4byte	.LASF354
 	.byte	0x37
 	.2byte	0x111
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF353
+	.4byte	.LASF355
 	.byte	0x38
 	.byte	0x59
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF354
+	.4byte	.LASF356
 	.byte	0x39
 	.byte	0x30
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF355
+	.4byte	.LASF357
 	.byte	0x39
 	.byte	0x30
 	.4byte	0x4eb
 	.uleb128 0xd
-	.4byte	.LASF356
+	.4byte	.LASF358
 	.byte	0x28
 	.byte	0x3a
 	.byte	0x1c
-	.4byte	0x153a
+	.4byte	0x1550
 	.uleb128 0xe
 	.4byte	.LASF170
 	.byte	0x3a
@@ -12038,7 +12387,7 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF357
+	.4byte	.LASF359
 	.byte	0x3a
 	.byte	0x1e
 	.4byte	0x443
@@ -12047,28 +12396,28 @@ __exitcall_ebc_exit:
 	.4byte	.LASF70
 	.byte	0x3a
 	.byte	0x1f
-	.4byte	0x153a
+	.4byte	0x1550
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF358
+	.4byte	.LASF360
 	.byte	0x3a
 	.byte	0x20
 	.4byte	0x392
 	.byte	0x18
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF359
+	.4byte	.LASF361
 	.byte	0x3a
 	.byte	0x11
-	.4byte	0x1545
+	.4byte	0x155b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x154b
+	.4byte	0x1561
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x1569
+	.4byte	0x157f
 	.uleb128 0x11
-	.4byte	0x1569
+	.4byte	0x157f
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
@@ -12078,13 +12427,13 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x14fd
+	.4byte	0x1513
 	.uleb128 0xd
-	.4byte	.LASF360
+	.4byte	.LASF362
 	.byte	0x18
 	.byte	0x3a
 	.byte	0x23
-	.4byte	0x1594
+	.4byte	0x15aa
 	.uleb128 0xe
 	.4byte	.LASF115
 	.byte	0x3a
@@ -12099,84 +12448,84 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF361
+	.4byte	.LASF363
 	.byte	0x3a
 	.byte	0x27
-	.4byte	0x156f
+	.4byte	0x1585
 	.uleb128 0xd
-	.4byte	.LASF362
+	.4byte	.LASF364
 	.byte	0x8
 	.byte	0x3b
 	.byte	0x10
-	.4byte	0x15b8
+	.4byte	0x15ce
 	.uleb128 0xe
-	.4byte	.LASF363
+	.4byte	.LASF365
 	.byte	0x3b
 	.byte	0x10
 	.4byte	0x104d
 	.byte	0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x159f
+	.4byte	0x15b5
 	.uleb128 0x8
-	.4byte	.LASF364
+	.4byte	.LASF366
 	.byte	0x3b
 	.byte	0x10
-	.4byte	0x159f
+	.4byte	0x15b5
 	.uleb128 0x19
-	.4byte	.LASF365
+	.4byte	.LASF367
 	.byte	0x3b
 	.byte	0x26
 	.4byte	0x6d
 	.uleb128 0x19
-	.4byte	.LASF366
+	.4byte	.LASF368
 	.byte	0x3b
 	.byte	0x59
-	.4byte	0x159f
+	.4byte	0x15b5
 	.uleb128 0x19
-	.4byte	.LASF367
+	.4byte	.LASF369
 	.byte	0x3b
 	.byte	0x5a
-	.4byte	0x159f
+	.4byte	0x15b5
 	.uleb128 0x19
-	.4byte	.LASF368
+	.4byte	.LASF370
 	.byte	0x3b
 	.byte	0x5b
-	.4byte	0x159f
+	.4byte	0x15b5
 	.uleb128 0x19
-	.4byte	.LASF369
+	.4byte	.LASF371
 	.byte	0x3b
 	.byte	0x5c
-	.4byte	0x159f
+	.4byte	0x15b5
 	.uleb128 0x13
-	.4byte	.LASF370
+	.4byte	.LASF372
 	.byte	0x3b
 	.2byte	0x2d2
-	.4byte	0x160b
+	.4byte	0x1621
 	.uleb128 0x5
-	.4byte	0x159f
-	.4byte	0x161b
+	.4byte	0x15b5
+	.4byte	0x1631
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x30
-	.4byte	0x162b
+	.4byte	0x1641
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x161b
+	.4byte	0x1631
 	.uleb128 0x15
-	.4byte	.LASF371
+	.4byte	.LASF373
 	.byte	0x3b
 	.2byte	0x303
-	.4byte	0x162b
+	.4byte	0x1641
 	.uleb128 0x5
 	.4byte	0x30
-	.4byte	0x1652
+	.4byte	0x1668
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x40
@@ -12185,83 +12534,83 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x163c
+	.4byte	0x1652
 	.uleb128 0x15
-	.4byte	.LASF372
+	.4byte	.LASF374
 	.byte	0x3b
 	.2byte	0x357
-	.4byte	0x1652
+	.4byte	0x1668
 	.uleb128 0x19
-	.4byte	.LASF373
+	.4byte	.LASF375
 	.byte	0x3c
 	.byte	0x67
 	.4byte	0xc6
 	.uleb128 0xd
-	.4byte	.LASF374
+	.4byte	.LASF376
 	.byte	0x8
 	.byte	0x3d
 	.byte	0x22
-	.4byte	0x1687
+	.4byte	0x169d
 	.uleb128 0xe
 	.4byte	.LASF66
 	.byte	0x3d
 	.byte	0x23
-	.4byte	0x16ac
+	.4byte	0x16c2
 	.byte	0
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF375
+	.4byte	.LASF377
 	.byte	0x10
 	.byte	0x3d
 	.byte	0x26
-	.4byte	0x16ac
+	.4byte	0x16c2
 	.uleb128 0xe
 	.4byte	.LASF63
 	.byte	0x3d
 	.byte	0x27
-	.4byte	0x16ac
+	.4byte	0x16c2
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF68
 	.byte	0x3d
 	.byte	0x27
-	.4byte	0x16b2
+	.4byte	0x16c8
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1687
+	.4byte	0x169d
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x16ac
+	.4byte	0x16c2
 	.uleb128 0xd
-	.4byte	.LASF376
+	.4byte	.LASF378
 	.byte	0x4
 	.byte	0x3e
 	.byte	0x30
-	.4byte	0x16d1
+	.4byte	0x16e7
 	.uleb128 0xe
-	.4byte	.LASF377
+	.4byte	.LASF379
 	.byte	0x3e
 	.byte	0x31
 	.4byte	0x6d
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF378
+	.4byte	.LASF380
 	.byte	0x3e
 	.byte	0x35
-	.4byte	0x16b8
+	.4byte	0x16ce
 	.uleb128 0x2e
 	.byte	0x8
 	.byte	0x3e
 	.2byte	0x19b
-	.4byte	0x1700
+	.4byte	0x1716
 	.uleb128 0x1b
-	.4byte	.LASF376
+	.4byte	.LASF378
 	.byte	0x3e
 	.2byte	0x19c
-	.4byte	0x16b8
+	.4byte	0x16ce
 	.byte	0
 	.uleb128 0x1b
 	.4byte	.LASF115
@@ -12271,15 +12620,15 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0
 	.uleb128 0x13
-	.4byte	.LASF379
+	.4byte	.LASF381
 	.byte	0x3e
 	.2byte	0x19e
-	.4byte	0x16dc
+	.4byte	0x16f2
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x3f
 	.byte	0x1e
-	.4byte	0x172d
+	.4byte	0x1743
 	.uleb128 0xe
 	.4byte	.LASF115
 	.byte	0x3f
@@ -12287,7 +12636,7 @@ __exitcall_ebc_exit:
 	.4byte	0xe50
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF380
+	.4byte	.LASF382
 	.byte	0x3f
 	.byte	0x20
 	.4byte	0xc6
@@ -12297,32 +12646,32 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x3f
 	.byte	0x1a
-	.4byte	0x1746
+	.4byte	0x175c
 	.uleb128 0x22
-	.4byte	.LASF381
+	.4byte	.LASF383
 	.byte	0x3f
 	.byte	0x1c
 	.4byte	0xef
 	.uleb128 0x29
-	.4byte	0x170c
+	.4byte	0x1722
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF382
+	.4byte	.LASF384
 	.byte	0x8
 	.byte	0x3f
 	.byte	0x19
-	.4byte	0x1759
+	.4byte	0x176f
 	.uleb128 0x23
-	.4byte	0x172d
+	.4byte	0x1743
 	.byte	0
 	.byte	0
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x40
 	.byte	0x32
-	.4byte	0x177a
+	.4byte	0x1790
 	.uleb128 0xe
-	.4byte	.LASF383
+	.4byte	.LASF385
 	.byte	0x40
 	.byte	0x33
 	.4byte	0x13a
@@ -12338,224 +12687,224 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x40
 	.byte	0x31
-	.4byte	0x1793
+	.4byte	0x17a9
 	.uleb128 0x29
-	.4byte	0x1759
+	.4byte	0x176f
 	.uleb128 0x22
-	.4byte	.LASF384
+	.4byte	.LASF386
 	.byte	0x40
 	.byte	0x35
 	.4byte	0x155
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF385
+	.4byte	.LASF387
 	.byte	0x10
 	.byte	0x40
 	.byte	0x30
-	.4byte	0x17b2
+	.4byte	0x17c8
 	.uleb128 0x23
-	.4byte	0x177a
+	.4byte	0x1790
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF264
 	.byte	0x40
 	.byte	0x37
-	.4byte	0x17b7
+	.4byte	0x17cd
 	.byte	0x8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x1793
+	.4byte	0x17a9
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x9d
 	.uleb128 0x19
-	.4byte	.LASF386
+	.4byte	.LASF388
 	.byte	0x40
 	.byte	0x3c
-	.4byte	0x17b2
+	.4byte	0x17c8
 	.uleb128 0x19
-	.4byte	.LASF387
+	.4byte	.LASF389
 	.byte	0x40
 	.byte	0x3d
-	.4byte	0x17b2
+	.4byte	0x17c8
 	.uleb128 0xd
-	.4byte	.LASF388
+	.4byte	.LASF390
 	.byte	0x30
 	.byte	0x40
 	.byte	0x3f
-	.4byte	0x181c
+	.4byte	0x1832
 	.uleb128 0xe
-	.4byte	.LASF389
+	.4byte	.LASF391
 	.byte	0x40
 	.byte	0x40
 	.4byte	0x194
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF390
+	.4byte	.LASF392
 	.byte	0x40
 	.byte	0x41
 	.4byte	0x194
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF391
+	.4byte	.LASF393
 	.byte	0x40
 	.byte	0x42
 	.4byte	0x194
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF392
+	.4byte	.LASF394
 	.byte	0x40
 	.byte	0x43
 	.4byte	0x194
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF393
+	.4byte	.LASF395
 	.byte	0x40
 	.byte	0x44
-	.4byte	0x181c
+	.4byte	0x1832
 	.byte	0x20
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x194
-	.4byte	0x182c
+	.4byte	0x1842
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF394
+	.4byte	.LASF396
 	.byte	0x40
 	.byte	0x46
-	.4byte	0x17d3
+	.4byte	0x17e9
 	.uleb128 0x21
 	.byte	0x10
 	.byte	0x40
 	.byte	0x6b
-	.4byte	0x1856
+	.4byte	0x186c
 	.uleb128 0x22
-	.4byte	.LASF395
+	.4byte	.LASF397
 	.byte	0x40
 	.byte	0x6c
 	.4byte	0x392
 	.uleb128 0x22
-	.4byte	.LASF396
+	.4byte	.LASF398
 	.byte	0x40
 	.byte	0x6d
-	.4byte	0x1856
+	.4byte	0x186c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1594
+	.4byte	0x15aa
 	.uleb128 0x21
 	.byte	0x10
 	.byte	0x40
 	.byte	0x74
-	.4byte	0x1886
+	.4byte	0x189c
 	.uleb128 0x22
-	.4byte	.LASF397
+	.4byte	.LASF399
 	.byte	0x40
 	.byte	0x75
 	.4byte	0x3d6
 	.uleb128 0x22
-	.4byte	.LASF398
+	.4byte	.LASF400
 	.byte	0x40
 	.byte	0x76
-	.4byte	0x1687
+	.4byte	0x169d
 	.uleb128 0x22
-	.4byte	.LASF399
+	.4byte	.LASF401
 	.byte	0x40
 	.byte	0x77
 	.4byte	0x407
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF400
+	.4byte	.LASF402
 	.byte	0xd0
 	.byte	0x40
 	.byte	0x59
-	.4byte	0x1965
+	.4byte	0x197b
 	.uleb128 0xe
-	.4byte	.LASF401
+	.4byte	.LASF403
 	.byte	0x40
 	.byte	0x5b
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF402
+	.4byte	.LASF404
 	.byte	0x40
 	.byte	0x5c
-	.4byte	0x16d1
+	.4byte	0x16e7
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF403
+	.4byte	.LASF405
 	.byte	0x40
 	.byte	0x5d
-	.4byte	0x1687
+	.4byte	0x169d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF404
+	.4byte	.LASF406
 	.byte	0x40
 	.byte	0x5e
-	.4byte	0x196a
+	.4byte	0x1980
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF405
+	.4byte	.LASF407
 	.byte	0x40
 	.byte	0x5f
-	.4byte	0x1793
+	.4byte	0x17a9
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF406
+	.4byte	.LASF408
 	.byte	0x40
 	.byte	0x60
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF407
+	.4byte	.LASF409
 	.byte	0x40
 	.byte	0x62
-	.4byte	0x1c5a
+	.4byte	0x1c70
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF408
+	.4byte	.LASF410
 	.byte	0x40
 	.byte	0x65
-	.4byte	0x1746
+	.4byte	0x175c
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF409
+	.4byte	.LASF411
 	.byte	0x40
 	.byte	0x66
-	.4byte	0x1d42
+	.4byte	0x1d58
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF410
+	.4byte	.LASF412
 	.byte	0x40
 	.byte	0x67
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF411
+	.4byte	.LASF413
 	.byte	0x40
 	.byte	0x68
 	.4byte	0x29
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF412
+	.4byte	.LASF414
 	.byte	0x40
 	.byte	0x69
 	.4byte	0x443
 	.byte	0x78
 	.uleb128 0x23
-	.4byte	0x1837
+	.4byte	0x184d
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF413
+	.4byte	.LASF415
 	.byte	0x40
 	.byte	0x6f
 	.4byte	0x392
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF414
+	.4byte	.LASF416
 	.byte	0x40
 	.byte	0x70
 	.4byte	0x392
@@ -12564,7 +12913,7 @@ __exitcall_ebc_exit:
 	.string	"d_u"
 	.byte	0x40
 	.byte	0x78
-	.4byte	0x185c
+	.4byte	0x1872
 	.byte	0xb0
 	.uleb128 0xe
 	.4byte	.LASF129
@@ -12580,321 +12929,321 @@ __exitcall_ebc_exit:
 	.byte	0xc8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x1886
+	.4byte	0x189c
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1886
+	.4byte	0x189c
 	.uleb128 0x1a
-	.4byte	.LASF415
+	.4byte	.LASF417
 	.2byte	0x2a0
 	.byte	0x1f
 	.2byte	0x263
-	.4byte	0x1c4f
+	.4byte	0x1c65
 	.uleb128 0x1b
-	.4byte	.LASF416
+	.4byte	.LASF418
 	.byte	0x1f
 	.2byte	0x264
 	.4byte	0x27a
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF417
+	.4byte	.LASF419
 	.byte	0x1f
 	.2byte	0x265
 	.4byte	0xb4
 	.byte	0x2
 	.uleb128 0x1b
-	.4byte	.LASF418
+	.4byte	.LASF420
 	.byte	0x1f
 	.2byte	0x266
-	.4byte	0x23e5
+	.4byte	0x23fb
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF419
+	.4byte	.LASF421
 	.byte	0x1f
 	.2byte	0x267
-	.4byte	0x2405
+	.4byte	0x241b
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF420
+	.4byte	.LASF422
 	.byte	0x1f
 	.2byte	0x268
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF421
+	.4byte	.LASF423
 	.byte	0x1f
 	.2byte	0x26b
-	.4byte	0x7c11
+	.4byte	0x7c27
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF422
+	.4byte	.LASF424
 	.byte	0x1f
 	.2byte	0x26c
-	.4byte	0x7c11
+	.4byte	0x7c27
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF423
+	.4byte	.LASF425
 	.byte	0x1f
 	.2byte	0x26f
-	.4byte	0x7d8a
+	.4byte	0x7da0
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF424
+	.4byte	.LASF426
 	.byte	0x1f
 	.2byte	0x270
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF425
+	.4byte	.LASF427
 	.byte	0x1f
 	.2byte	0x271
-	.4byte	0x514b
+	.4byte	0x5161
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF426
+	.4byte	.LASF428
 	.byte	0x1f
 	.2byte	0x274
 	.4byte	0x443
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF427
+	.4byte	.LASF429
 	.byte	0x1f
 	.2byte	0x278
 	.4byte	0x29
 	.byte	0x40
 	.uleb128 0x23
-	.4byte	0x7b77
+	.4byte	0x7b8d
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF428
+	.4byte	.LASF430
 	.byte	0x1f
 	.2byte	0x284
 	.4byte	0x26f
 	.byte	0x4c
 	.uleb128 0x1b
-	.4byte	.LASF429
+	.4byte	.LASF431
 	.byte	0x1f
 	.2byte	0x285
 	.4byte	0x2c3
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF430
+	.4byte	.LASF432
 	.byte	0x1f
 	.2byte	0x286
 	.4byte	0xa12
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF431
+	.4byte	.LASF433
 	.byte	0x1f
 	.2byte	0x287
 	.4byte	0xa12
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF432
+	.4byte	.LASF434
 	.byte	0x1f
 	.2byte	0x288
 	.4byte	0xa12
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF433
+	.4byte	.LASF435
 	.byte	0x1f
 	.2byte	0x289
 	.4byte	0xe50
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF434
+	.4byte	.LASF436
 	.byte	0x1f
 	.2byte	0x28a
 	.4byte	0xb4
 	.byte	0x8c
 	.uleb128 0x1b
-	.4byte	.LASF435
+	.4byte	.LASF437
 	.byte	0x1f
 	.2byte	0x28b
 	.4byte	0x10b
 	.byte	0x8e
 	.uleb128 0x1b
-	.4byte	.LASF436
+	.4byte	.LASF438
 	.byte	0x1f
 	.2byte	0x28c
 	.4byte	0x10b
 	.byte	0x8f
 	.uleb128 0x1b
-	.4byte	.LASF437
+	.4byte	.LASF439
 	.byte	0x1f
 	.2byte	0x28d
 	.4byte	0x305
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF438
+	.4byte	.LASF440
 	.byte	0x1f
 	.2byte	0x294
 	.4byte	0x29
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF439
+	.4byte	.LASF441
 	.byte	0x1f
 	.2byte	0x295
-	.4byte	0x4e0b
+	.4byte	0x4e21
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF440
+	.4byte	.LASF442
 	.byte	0x1f
 	.2byte	0x297
 	.4byte	0x29
 	.byte	0xd0
 	.uleb128 0x1b
-	.4byte	.LASF441
+	.4byte	.LASF443
 	.byte	0x1f
 	.2byte	0x298
 	.4byte	0x29
 	.byte	0xd8
 	.uleb128 0x1b
-	.4byte	.LASF442
+	.4byte	.LASF444
 	.byte	0x1f
 	.2byte	0x29a
 	.4byte	0x3d6
 	.byte	0xe0
 	.uleb128 0x1b
-	.4byte	.LASF443
+	.4byte	.LASF445
 	.byte	0x1f
 	.2byte	0x29b
 	.4byte	0x392
 	.byte	0xf0
 	.uleb128 0x1c
-	.4byte	.LASF444
+	.4byte	.LASF446
 	.byte	0x1f
 	.2byte	0x29d
-	.4byte	0x7d95
+	.4byte	0x7dab
 	.2byte	0x100
 	.uleb128 0x1c
-	.4byte	.LASF445
+	.4byte	.LASF447
 	.byte	0x1f
 	.2byte	0x2a0
 	.4byte	0xc6
 	.2byte	0x108
 	.uleb128 0x1c
-	.4byte	.LASF446
+	.4byte	.LASF448
 	.byte	0x1f
 	.2byte	0x2a1
 	.4byte	0x11a
 	.2byte	0x10c
 	.uleb128 0x1c
-	.4byte	.LASF447
+	.4byte	.LASF449
 	.byte	0x1f
 	.2byte	0x2a2
 	.4byte	0x11a
 	.2byte	0x10e
 	.uleb128 0x1c
-	.4byte	.LASF448
+	.4byte	.LASF450
 	.byte	0x1f
 	.2byte	0x2a4
 	.4byte	0x392
 	.2byte	0x110
 	.uleb128 0x1c
-	.4byte	.LASF449
+	.4byte	.LASF451
 	.byte	0x1f
 	.2byte	0x2a5
 	.4byte	0x392
 	.2byte	0x120
 	.uleb128 0x1c
-	.4byte	.LASF450
+	.4byte	.LASF452
 	.byte	0x1f
 	.2byte	0x2a6
 	.4byte	0x392
 	.2byte	0x130
 	.uleb128 0x2f
-	.4byte	0x7b99
+	.4byte	0x7baf
 	.2byte	0x140
 	.uleb128 0x1c
-	.4byte	.LASF451
+	.4byte	.LASF453
 	.byte	0x1f
 	.2byte	0x2ab
 	.4byte	0x387
 	.2byte	0x150
 	.uleb128 0x1c
-	.4byte	.LASF452
+	.4byte	.LASF454
 	.byte	0x1f
 	.2byte	0x2ac
 	.4byte	0x387
 	.2byte	0x158
 	.uleb128 0x1c
-	.4byte	.LASF453
+	.4byte	.LASF455
 	.byte	0x1f
 	.2byte	0x2ad
 	.4byte	0x367
 	.2byte	0x160
 	.uleb128 0x1c
-	.4byte	.LASF454
+	.4byte	.LASF456
 	.byte	0x1f
 	.2byte	0x2ae
 	.4byte	0x367
 	.2byte	0x164
 	.uleb128 0x1c
-	.4byte	.LASF455
+	.4byte	.LASF457
 	.byte	0x1f
 	.2byte	0x2af
 	.4byte	0x367
 	.2byte	0x168
 	.uleb128 0x1c
-	.4byte	.LASF456
+	.4byte	.LASF458
 	.byte	0x1f
 	.2byte	0x2b3
-	.4byte	0x7d9b
+	.4byte	0x7db1
 	.2byte	0x170
 	.uleb128 0x1c
-	.4byte	.LASF457
+	.4byte	.LASF459
 	.byte	0x1f
 	.2byte	0x2b4
-	.4byte	0x7de3
+	.4byte	0x7df9
 	.2byte	0x178
 	.uleb128 0x1c
-	.4byte	.LASF458
+	.4byte	.LASF460
 	.byte	0x1f
 	.2byte	0x2b5
-	.4byte	0x5046
+	.4byte	0x505c
 	.2byte	0x180
 	.uleb128 0x1c
-	.4byte	.LASF459
+	.4byte	.LASF461
 	.byte	0x1f
 	.2byte	0x2b6
 	.4byte	0x392
 	.2byte	0x250
 	.uleb128 0x2f
-	.4byte	0x7bbb
+	.4byte	0x7bd1
 	.2byte	0x260
 	.uleb128 0x1c
-	.4byte	.LASF460
+	.4byte	.LASF462
 	.byte	0x1f
 	.2byte	0x2bf
 	.4byte	0xd2
 	.2byte	0x268
 	.uleb128 0x1c
-	.4byte	.LASF461
+	.4byte	.LASF463
 	.byte	0x1f
 	.2byte	0x2c2
 	.4byte	0xd2
 	.2byte	0x26c
 	.uleb128 0x1c
-	.4byte	.LASF462
+	.4byte	.LASF464
 	.byte	0x1f
 	.2byte	0x2c3
-	.4byte	0x7dee
+	.4byte	0x7e04
 	.2byte	0x270
 	.uleb128 0x1c
-	.4byte	.LASF463
+	.4byte	.LASF465
 	.byte	0x1f
 	.2byte	0x2c7
-	.4byte	0x7df9
+	.4byte	0x7e0f
 	.2byte	0x278
 	.uleb128 0x1c
-	.4byte	.LASF464
+	.4byte	.LASF466
 	.byte	0x1f
 	.2byte	0x2cb
-	.4byte	0x7e04
+	.4byte	0x7e1a
 	.2byte	0x280
 	.uleb128 0x1c
-	.4byte	.LASF465
+	.4byte	.LASF467
 	.byte	0x1f
 	.2byte	0x2ce
 	.4byte	0x443
@@ -12913,103 +13262,103 @@ __exitcall_ebc_exit:
 	.2byte	0x298
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x1970
+	.4byte	0x1986
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1970
+	.4byte	0x1986
 	.uleb128 0x5
 	.4byte	0x96
-	.4byte	0x1c6a
+	.4byte	0x1c80
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1f
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF466
+	.4byte	.LASF468
 	.byte	0xc0
 	.byte	0x40
 	.byte	0x8a
-	.4byte	0x1d3d
+	.4byte	0x1d53
 	.uleb128 0xe
-	.4byte	.LASF467
+	.4byte	.LASF469
 	.byte	0x40
 	.byte	0x8b
-	.4byte	0x215f
+	.4byte	0x2175
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF468
+	.4byte	.LASF470
 	.byte	0x40
 	.byte	0x8c
-	.4byte	0x215f
+	.4byte	0x2175
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF403
+	.4byte	.LASF405
 	.byte	0x40
 	.byte	0x8d
-	.4byte	0x2185
+	.4byte	0x219b
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF469
+	.4byte	.LASF471
 	.byte	0x40
 	.byte	0x8e
-	.4byte	0x21af
+	.4byte	0x21c5
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF470
+	.4byte	.LASF472
 	.byte	0x40
 	.byte	0x90
-	.4byte	0x21c4
+	.4byte	0x21da
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF471
+	.4byte	.LASF473
 	.byte	0x40
 	.byte	0x91
-	.4byte	0x21d9
+	.4byte	0x21ef
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF472
+	.4byte	.LASF474
 	.byte	0x40
 	.byte	0x92
-	.4byte	0x21ea
+	.4byte	0x2200
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF473
+	.4byte	.LASF475
 	.byte	0x40
 	.byte	0x93
-	.4byte	0x21ea
+	.4byte	0x2200
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF474
+	.4byte	.LASF476
 	.byte	0x40
 	.byte	0x94
-	.4byte	0x2200
+	.4byte	0x2216
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF475
+	.4byte	.LASF477
 	.byte	0x40
 	.byte	0x95
-	.4byte	0x221f
+	.4byte	0x2235
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF476
+	.4byte	.LASF478
 	.byte	0x40
 	.byte	0x96
-	.4byte	0x223f
+	.4byte	0x2255
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF477
+	.4byte	.LASF479
 	.byte	0x40
 	.byte	0x97
-	.4byte	0x2259
+	.4byte	0x226f
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF478
+	.4byte	.LASF480
 	.byte	0x40
 	.byte	0x98
-	.4byte	0x2279
+	.4byte	0x228f
 	.byte	0x60
 	.uleb128 0x23
-	.4byte	0x2127
+	.4byte	0x213d
 	.byte	0x68
 	.uleb128 0xe
 	.4byte	.LASF130
@@ -13031,327 +13380,327 @@ __exitcall_ebc_exit:
 	.byte	0x80
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x1c6a
+	.4byte	0x1c80
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1d3d
+	.4byte	0x1d53
 	.uleb128 0x1a
-	.4byte	.LASF479
+	.4byte	.LASF481
 	.2byte	0x6c0
 	.byte	0x1f
 	.2byte	0x583
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.uleb128 0x1b
-	.4byte	.LASF480
+	.4byte	.LASF482
 	.byte	0x1f
 	.2byte	0x584
 	.4byte	0x392
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF481
+	.4byte	.LASF483
 	.byte	0x1f
 	.2byte	0x585
 	.4byte	0x26f
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF482
+	.4byte	.LASF484
 	.byte	0x1f
 	.2byte	0x586
 	.4byte	0x96
 	.byte	0x14
 	.uleb128 0x1b
-	.4byte	.LASF483
+	.4byte	.LASF485
 	.byte	0x1f
 	.2byte	0x587
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF484
+	.4byte	.LASF486
 	.byte	0x1f
 	.2byte	0x588
 	.4byte	0x2c3
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF485
+	.4byte	.LASF487
 	.byte	0x1f
 	.2byte	0x589
-	.4byte	0x8463
+	.4byte	0x8479
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF486
+	.4byte	.LASF488
 	.byte	0x1f
 	.2byte	0x58a
-	.4byte	0x8639
+	.4byte	0x864f
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF487
+	.4byte	.LASF489
 	.byte	0x1f
 	.2byte	0x58b
-	.4byte	0x863f
+	.4byte	0x8655
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF488
+	.4byte	.LASF490
 	.byte	0x1f
 	.2byte	0x58c
-	.4byte	0x8645
+	.4byte	0x865b
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF489
+	.4byte	.LASF491
 	.byte	0x1f
 	.2byte	0x58d
-	.4byte	0x8655
+	.4byte	0x866b
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF490
+	.4byte	.LASF492
 	.byte	0x1f
 	.2byte	0x58e
 	.4byte	0x29
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF491
+	.4byte	.LASF493
 	.byte	0x1f
 	.2byte	0x58f
 	.4byte	0x29
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF492
+	.4byte	.LASF494
 	.byte	0x1f
 	.2byte	0x590
 	.4byte	0x29
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF493
+	.4byte	.LASF495
 	.byte	0x1f
 	.2byte	0x591
-	.4byte	0x196a
+	.4byte	0x1980
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF494
+	.4byte	.LASF496
 	.byte	0x1f
 	.2byte	0x592
-	.4byte	0x4e0b
+	.4byte	0x4e21
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF495
+	.4byte	.LASF497
 	.byte	0x1f
 	.2byte	0x593
 	.4byte	0xc6
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF496
+	.4byte	.LASF498
 	.byte	0x1f
 	.2byte	0x594
 	.4byte	0x367
 	.byte	0xa4
 	.uleb128 0x1b
-	.4byte	.LASF497
+	.4byte	.LASF499
 	.byte	0x1f
 	.2byte	0x596
 	.4byte	0x443
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF498
+	.4byte	.LASF500
 	.byte	0x1f
 	.2byte	0x598
-	.4byte	0x8665
+	.4byte	0x867b
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF499
+	.4byte	.LASF501
 	.byte	0x1f
 	.2byte	0x59a
-	.4byte	0x867b
+	.4byte	0x8691
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF500
+	.4byte	.LASF502
 	.byte	0x1f
 	.2byte	0x59b
-	.4byte	0x874e
+	.4byte	0x8764
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF501
+	.4byte	.LASF503
 	.byte	0x1f
 	.2byte	0x59e
-	.4byte	0x875e
+	.4byte	0x8774
 	.byte	0xc8
 	.uleb128 0x1b
-	.4byte	.LASF502
+	.4byte	.LASF504
 	.byte	0x1f
 	.2byte	0x5a1
-	.4byte	0x8769
+	.4byte	0x877f
 	.byte	0xd0
 	.uleb128 0x1b
-	.4byte	.LASF503
+	.4byte	.LASF505
 	.byte	0x1f
 	.2byte	0x5a2
 	.4byte	0xa9
 	.byte	0xd8
 	.uleb128 0x1b
-	.4byte	.LASF504
+	.4byte	.LASF506
 	.byte	0x1f
 	.2byte	0x5a4
-	.4byte	0x166e
+	.4byte	0x1684
 	.byte	0xe0
 	.uleb128 0x1b
-	.4byte	.LASF505
+	.4byte	.LASF507
 	.byte	0x1f
 	.2byte	0x5a5
 	.4byte	0x392
 	.byte	0xe8
 	.uleb128 0x1b
-	.4byte	.LASF506
+	.4byte	.LASF508
 	.byte	0x1f
 	.2byte	0x5a6
-	.4byte	0x7b5b
+	.4byte	0x7b71
 	.byte	0xf8
 	.uleb128 0x1c
-	.4byte	.LASF507
+	.4byte	.LASF509
 	.byte	0x1f
 	.2byte	0x5a7
-	.4byte	0x483b
+	.4byte	0x4851
 	.2byte	0x100
 	.uleb128 0x1c
-	.4byte	.LASF508
+	.4byte	.LASF510
 	.byte	0x1f
 	.2byte	0x5a8
-	.4byte	0x8774
+	.4byte	0x878a
 	.2byte	0x108
 	.uleb128 0x1c
-	.4byte	.LASF509
+	.4byte	.LASF511
 	.byte	0x1f
 	.2byte	0x5a9
 	.4byte	0x3d6
 	.2byte	0x110
 	.uleb128 0x1c
-	.4byte	.LASF510
+	.4byte	.LASF512
 	.byte	0x1f
 	.2byte	0x5aa
 	.4byte	0x6d
 	.2byte	0x120
 	.uleb128 0x1c
-	.4byte	.LASF511
+	.4byte	.LASF513
 	.byte	0x1f
 	.2byte	0x5ab
-	.4byte	0x7556
+	.4byte	0x756c
 	.2byte	0x128
 	.uleb128 0x1c
-	.4byte	.LASF512
+	.4byte	.LASF514
 	.byte	0x1f
 	.2byte	0x5ad
-	.4byte	0x830b
+	.4byte	0x8321
 	.2byte	0x268
 	.uleb128 0x1c
-	.4byte	.LASF513
+	.4byte	.LASF515
 	.byte	0x1f
 	.2byte	0x5af
-	.4byte	0x877a
+	.4byte	0x8790
 	.2byte	0x420
 	.uleb128 0x1c
-	.4byte	.LASF514
+	.4byte	.LASF516
 	.byte	0x1f
 	.2byte	0x5b0
-	.4byte	0x5d49
+	.4byte	0x5d5f
 	.2byte	0x440
 	.uleb128 0x1c
-	.4byte	.LASF515
+	.4byte	.LASF517
 	.byte	0x1f
 	.2byte	0x5b2
 	.4byte	0x443
 	.2byte	0x450
 	.uleb128 0x1c
-	.4byte	.LASF516
+	.4byte	.LASF518
 	.byte	0x1f
 	.2byte	0x5b3
 	.4byte	0x6d
 	.2byte	0x458
 	.uleb128 0x1c
-	.4byte	.LASF517
+	.4byte	.LASF519
 	.byte	0x1f
 	.2byte	0x5b4
 	.4byte	0x326
 	.2byte	0x45c
 	.uleb128 0x1c
-	.4byte	.LASF518
+	.4byte	.LASF520
 	.byte	0x1f
 	.2byte	0x5b8
 	.4byte	0x13a
 	.2byte	0x460
 	.uleb128 0x1c
-	.4byte	.LASF519
+	.4byte	.LASF521
 	.byte	0x1f
 	.2byte	0x5be
-	.4byte	0x243f
+	.4byte	0x2455
 	.2byte	0x468
 	.uleb128 0x1c
-	.4byte	.LASF520
+	.4byte	.LASF522
 	.byte	0x1f
 	.2byte	0x5c4
 	.4byte	0x219
 	.2byte	0x488
 	.uleb128 0x1c
-	.4byte	.LASF521
+	.4byte	.LASF523
 	.byte	0x1f
 	.2byte	0x5c6
-	.4byte	0x1d42
+	.4byte	0x1d58
 	.2byte	0x490
 	.uleb128 0x1c
-	.4byte	.LASF522
+	.4byte	.LASF524
 	.byte	0x1f
 	.2byte	0x5cb
 	.4byte	0xc6
 	.2byte	0x498
 	.uleb128 0x1c
-	.4byte	.LASF523
+	.4byte	.LASF525
 	.byte	0x1f
 	.2byte	0x5cd
-	.4byte	0x4b91
+	.4byte	0x4ba7
 	.2byte	0x4a0
 	.uleb128 0x1c
-	.4byte	.LASF524
+	.4byte	.LASF526
 	.byte	0x1f
 	.2byte	0x5d0
 	.4byte	0x543
 	.2byte	0x4e0
 	.uleb128 0x1c
-	.4byte	.LASF525
+	.4byte	.LASF527
 	.byte	0x1f
 	.2byte	0x5d3
 	.4byte	0x543
 	.2byte	0x4e8
 	.uleb128 0x1c
-	.4byte	.LASF526
+	.4byte	.LASF528
 	.byte	0x1f
 	.2byte	0x5d6
 	.4byte	0xc6
 	.2byte	0x4f0
 	.uleb128 0x1c
-	.4byte	.LASF527
+	.4byte	.LASF529
 	.byte	0x1f
 	.2byte	0x5d9
-	.4byte	0x32f4
+	.4byte	0x330a
 	.2byte	0x4f8
 	.uleb128 0x1c
-	.4byte	.LASF528
+	.4byte	.LASF530
 	.byte	0x1f
 	.2byte	0x5da
 	.4byte	0x3bd
 	.2byte	0x500
 	.uleb128 0x1c
-	.4byte	.LASF529
+	.4byte	.LASF531
 	.byte	0x1f
 	.2byte	0x5e1
-	.4byte	0x5a0b
+	.4byte	0x5a21
 	.2byte	0x508
 	.uleb128 0x1c
-	.4byte	.LASF530
+	.4byte	.LASF532
 	.byte	0x1f
 	.2byte	0x5e7
-	.4byte	0x4ccb
+	.4byte	0x4ce1
 	.2byte	0x540
 	.uleb128 0x1c
-	.4byte	.LASF531
+	.4byte	.LASF533
 	.byte	0x1f
 	.2byte	0x5e8
-	.4byte	0x4ccb
+	.4byte	0x4ce1
 	.2byte	0x580
 	.uleb128 0x30
 	.string	"rcu"
@@ -13360,43 +13709,43 @@ __exitcall_ebc_exit:
 	.4byte	0x407
 	.2byte	0x5a0
 	.uleb128 0x1c
-	.4byte	.LASF532
+	.4byte	.LASF534
 	.byte	0x1f
 	.2byte	0x5ea
-	.4byte	0x31e0
+	.4byte	0x31f6
 	.2byte	0x5b0
 	.uleb128 0x1c
-	.4byte	.LASF533
+	.4byte	.LASF535
 	.byte	0x1f
 	.2byte	0x5ec
-	.4byte	0x243f
+	.4byte	0x2455
 	.2byte	0x5e0
 	.uleb128 0x1c
-	.4byte	.LASF534
+	.4byte	.LASF536
 	.byte	0x1f
 	.2byte	0x5f1
 	.4byte	0xc6
 	.2byte	0x600
 	.uleb128 0x1c
-	.4byte	.LASF535
+	.4byte	.LASF537
 	.byte	0x1f
 	.2byte	0x5f4
 	.4byte	0xe50
 	.2byte	0x640
 	.uleb128 0x1c
-	.4byte	.LASF536
+	.4byte	.LASF538
 	.byte	0x1f
 	.2byte	0x5f5
 	.4byte	0x392
 	.2byte	0x648
 	.uleb128 0x1c
-	.4byte	.LASF537
+	.4byte	.LASF539
 	.byte	0x1f
 	.2byte	0x5f7
 	.4byte	0xe50
 	.2byte	0x658
 	.uleb128 0x1c
-	.4byte	.LASF538
+	.4byte	.LASF540
 	.byte	0x1f
 	.2byte	0x5f8
 	.4byte	0x392
@@ -13428,12 +13777,12 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1d48
+	.4byte	0x1d5e
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x40
 	.byte	0x9a
-	.4byte	0x20d7
+	.4byte	0x20ed
 	.uleb128 0xe
 	.4byte	.LASF129
 	.byte	0x40
@@ -13442,42 +13791,42 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x10
-	.4byte	0x20e7
+	.4byte	0x20fd
 	.uleb128 0x11
-	.4byte	0x20e7
+	.4byte	0x20fd
 	.uleb128 0x11
-	.4byte	0x2117
+	.4byte	0x212d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2112
+	.4byte	0x2128
 	.uleb128 0xd
-	.4byte	.LASF539
+	.4byte	.LASF541
 	.byte	0x10
 	.byte	0x41
 	.byte	0x8
-	.4byte	0x2112
+	.4byte	0x2128
 	.uleb128 0x20
 	.string	"mnt"
 	.byte	0x41
 	.byte	0x9
-	.4byte	0x2239
+	.4byte	0x224f
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF400
+	.4byte	.LASF402
 	.byte	0x41
 	.byte	0xa
-	.4byte	0x196a
+	.4byte	0x1980
 	.byte	0x8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x20ed
+	.4byte	0x2103
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x20ed
+	.4byte	0x2103
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x20d7
+	.4byte	0x20ed
 	.uleb128 0x31
 	.byte	0
 	.byte	0x40
@@ -13486,107 +13835,107 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x40
 	.byte	0x9a
-	.4byte	0x214b
+	.4byte	0x2161
 	.uleb128 0x22
-	.4byte	.LASF540
+	.4byte	.LASF542
 	.byte	0x40
 	.byte	0x9a
-	.4byte	0x211d
+	.4byte	0x2133
 	.uleb128 0x22
-	.4byte	.LASF541
+	.4byte	.LASF543
 	.byte	0x40
 	.byte	0x9a
-	.4byte	0x20c2
+	.4byte	0x20d8
 	.uleb128 0x29
-	.4byte	0x2123
+	.4byte	0x2139
 	.byte	0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x215f
+	.4byte	0x2175
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x214b
+	.4byte	0x2161
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x2179
+	.4byte	0x218f
 	.uleb128 0x11
-	.4byte	0x2179
+	.4byte	0x218f
 	.uleb128 0x11
-	.4byte	0x217f
+	.4byte	0x2195
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1965
+	.4byte	0x197b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1793
+	.4byte	0x17a9
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2165
+	.4byte	0x217b
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x21a9
+	.4byte	0x21bf
 	.uleb128 0x11
-	.4byte	0x2179
+	.4byte	0x218f
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
-	.4byte	0x21a9
+	.4byte	0x21bf
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x17b2
+	.4byte	0x17c8
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x218b
+	.4byte	0x21a1
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x21c4
+	.4byte	0x21da
 	.uleb128 0x11
-	.4byte	0x2179
+	.4byte	0x218f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x21b5
+	.4byte	0x21cb
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x21d9
+	.4byte	0x21ef
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x21ca
+	.4byte	0x21e0
 	.uleb128 0x10
-	.4byte	0x21ea
+	.4byte	0x2200
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x21df
+	.4byte	0x21f5
 	.uleb128 0x10
-	.4byte	0x2200
+	.4byte	0x2216
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x21f0
+	.4byte	0x2206
 	.uleb128 0x14
 	.4byte	0x219
-	.4byte	0x221f
+	.4byte	0x2235
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.uleb128 0x11
 	.4byte	0x219
 	.uleb128 0x11
@@ -13594,90 +13943,90 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2206
+	.4byte	0x221c
 	.uleb128 0x24
-	.4byte	.LASF542
+	.4byte	.LASF544
 	.uleb128 0x14
-	.4byte	0x2239
-	.4byte	0x2239
+	.4byte	0x224f
+	.4byte	0x224f
 	.uleb128 0x11
-	.4byte	0x2117
+	.4byte	0x212d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2225
+	.4byte	0x223b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x222a
+	.4byte	0x2240
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x2259
+	.4byte	0x226f
 	.uleb128 0x11
-	.4byte	0x20e7
+	.4byte	0x20fd
 	.uleb128 0x11
 	.4byte	0x29b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2245
+	.4byte	0x225b
 	.uleb128 0x14
-	.4byte	0x196a
-	.4byte	0x2273
+	.4byte	0x1980
+	.4byte	0x2289
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.uleb128 0x11
-	.4byte	0x2273
+	.4byte	0x2289
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1c4f
+	.4byte	0x1c65
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x225f
+	.4byte	0x2275
 	.uleb128 0x19
-	.4byte	.LASF543
+	.4byte	.LASF545
 	.byte	0x40
 	.byte	0xe6
-	.4byte	0x1700
+	.4byte	0x1716
 	.uleb128 0x15
-	.4byte	.LASF544
+	.4byte	.LASF546
 	.byte	0x40
 	.2byte	0x1fe
 	.4byte	0xc6
 	.uleb128 0x8
-	.4byte	.LASF545
+	.4byte	.LASF547
 	.byte	0x26
 	.byte	0x8
 	.4byte	0x12a
 	.uleb128 0x1f
-	.4byte	.LASF546
+	.4byte	.LASF548
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x42
 	.byte	0x8
-	.4byte	0x22d0
+	.4byte	0x22e6
 	.uleb128 0xc
-	.4byte	.LASF547
+	.4byte	.LASF549
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF548
+	.4byte	.LASF550
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF549
+	.4byte	.LASF551
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF550
+	.4byte	.LASF552
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF551
+	.4byte	.LASF553
 	.byte	0x4
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF552
+	.4byte	.LASF554
 	.byte	0x10
 	.byte	0x42
 	.byte	0x35
-	.4byte	0x22f3
+	.4byte	0x2309
 	.uleb128 0x20
 	.string	"nr"
 	.byte	0x42
@@ -13688,43 +14037,43 @@ __exitcall_ebc_exit:
 	.string	"ns"
 	.byte	0x42
 	.byte	0x37
-	.4byte	0x22f8
+	.4byte	0x230e
 	.byte	0x8
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF553
+	.4byte	.LASF555
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x22f3
+	.4byte	0x2309
 	.uleb128 0x32
 	.string	"pid"
 	.byte	0x60
 	.byte	0x42
 	.byte	0x3a
-	.4byte	0x2353
+	.4byte	0x2369
 	.uleb128 0xe
-	.4byte	.LASF380
+	.4byte	.LASF382
 	.byte	0x42
 	.byte	0x3c
 	.4byte	0x367
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF554
+	.4byte	.LASF556
 	.byte	0x42
 	.byte	0x3d
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF555
+	.4byte	.LASF557
 	.byte	0x42
 	.byte	0x3f
-	.4byte	0x2353
+	.4byte	0x2369
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF556
+	.4byte	.LASF558
 	.byte	0x42
 	.byte	0x41
-	.4byte	0x1594
+	.4byte	0x15aa
 	.byte	0x28
 	.uleb128 0x20
 	.string	"rcu"
@@ -13733,73 +14082,73 @@ __exitcall_ebc_exit:
 	.4byte	0x407
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF557
+	.4byte	.LASF559
 	.byte	0x42
 	.byte	0x43
-	.4byte	0x2363
+	.4byte	0x2379
 	.byte	0x50
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x3bd
-	.4byte	0x2363
+	.4byte	0x2379
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x22d0
-	.4byte	0x2373
+	.4byte	0x22e6
+	.4byte	0x2389
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF558
+	.4byte	.LASF560
 	.byte	0x42
 	.byte	0x46
-	.4byte	0x22fe
+	.4byte	0x2314
 	.uleb128 0x19
-	.4byte	.LASF559
+	.4byte	.LASF561
 	.byte	0x42
 	.byte	0x48
 	.4byte	0x7b4
 	.uleb128 0x19
-	.4byte	.LASF560
+	.4byte	.LASF562
 	.byte	0x42
 	.byte	0x62
-	.4byte	0x22f3
+	.4byte	0x2309
 	.uleb128 0x19
-	.4byte	.LASF561
+	.4byte	.LASF563
 	.byte	0x43
 	.byte	0x23
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF562
+	.4byte	.LASF564
 	.byte	0x43
 	.byte	0x24
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF563
+	.4byte	.LASF565
 	.byte	0x43
 	.byte	0x52
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF564
+	.4byte	.LASF566
 	.byte	0x43
 	.byte	0x53
 	.4byte	0xc6
 	.uleb128 0x24
-	.4byte	.LASF565
+	.4byte	.LASF567
 	.uleb128 0x19
-	.4byte	.LASF566
+	.4byte	.LASF568
 	.byte	0x44
 	.byte	0x13
-	.4byte	0x23c0
+	.4byte	0x23d6
 	.uleb128 0xf
 	.byte	0x4
 	.byte	0x44
 	.byte	0x15
-	.4byte	0x23e5
+	.4byte	0x23fb
 	.uleb128 0x20
 	.string	"val"
 	.byte	0x44
@@ -13808,15 +14157,15 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF567
+	.4byte	.LASF569
 	.byte	0x44
 	.byte	0x17
-	.4byte	0x23d0
+	.4byte	0x23e6
 	.uleb128 0xf
 	.byte	0x4
 	.byte	0x44
 	.byte	0x1a
-	.4byte	0x2405
+	.4byte	0x241b
 	.uleb128 0x20
 	.string	"val"
 	.byte	0x44
@@ -13825,16 +14174,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF568
+	.4byte	.LASF570
 	.byte	0x44
 	.byte	0x1c
-	.4byte	0x23f0
+	.4byte	0x2406
 	.uleb128 0xd
-	.4byte	.LASF569
+	.4byte	.LASF571
 	.byte	0x4
 	.byte	0x45
 	.byte	0xf
-	.4byte	0x2429
+	.4byte	0x243f
 	.uleb128 0xe
 	.4byte	.LASF220
 	.byte	0x45
@@ -13843,21 +14192,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF570
+	.4byte	.LASF572
 	.byte	0x46
 	.byte	0xb
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF571
+	.4byte	.LASF573
 	.byte	0x46
 	.byte	0xc
 	.4byte	0xc6
 	.uleb128 0xd
-	.4byte	.LASF572
+	.4byte	.LASF574
 	.byte	0x20
 	.byte	0x47
 	.byte	0x35
-	.4byte	0x247c
+	.4byte	0x2492
 	.uleb128 0xe
 	.4byte	.LASF97
 	.byte	0x47
@@ -13874,21 +14223,21 @@ __exitcall_ebc_exit:
 	.string	"osq"
 	.byte	0x47
 	.byte	0x39
-	.4byte	0x2410
+	.4byte	0x2426
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF573
+	.4byte	.LASF575
 	.byte	0x47
 	.byte	0x3b
 	.4byte	0x392
 	.byte	0x10
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF574
+	.4byte	.LASF576
 	.2byte	0xe80
 	.byte	0x48
 	.2byte	0x287
-	.4byte	0x2eda
+	.4byte	0x2ef0
 	.uleb128 0x1b
 	.4byte	.LASF204
 	.byte	0x48
@@ -13896,19 +14245,19 @@ __exitcall_ebc_exit:
 	.4byte	0xc1e
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF575
+	.4byte	.LASF577
 	.byte	0x48
 	.2byte	0x290
 	.4byte	0x19b
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF576
+	.4byte	.LASF578
 	.byte	0x48
 	.2byte	0x298
 	.4byte	0x443
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF577
+	.4byte	.LASF579
 	.byte	0x48
 	.2byte	0x299
 	.4byte	0x367
@@ -13920,19 +14269,19 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0x34
 	.uleb128 0x1b
-	.4byte	.LASF578
+	.4byte	.LASF580
 	.byte	0x48
 	.2byte	0x29c
 	.4byte	0x6d
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF579
+	.4byte	.LASF581
 	.byte	0x48
 	.2byte	0x29f
-	.4byte	0x2eeb
+	.4byte	0x2f01
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF580
+	.4byte	.LASF582
 	.byte	0x48
 	.2byte	0x2a0
 	.4byte	0xc6
@@ -13944,283 +14293,283 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0x4c
 	.uleb128 0x1b
-	.4byte	.LASF581
+	.4byte	.LASF583
 	.byte	0x48
 	.2byte	0x2a5
 	.4byte	0x6d
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF582
+	.4byte	.LASF584
 	.byte	0x48
 	.2byte	0x2a6
 	.4byte	0x29
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF583
+	.4byte	.LASF585
 	.byte	0x48
 	.2byte	0x2a7
-	.4byte	0x2eda
+	.4byte	0x2ef0
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF584
+	.4byte	.LASF586
 	.byte	0x48
 	.2byte	0x2b0
 	.4byte	0xc6
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF585
+	.4byte	.LASF587
 	.byte	0x48
 	.2byte	0x2b1
 	.4byte	0xc6
 	.byte	0x6c
 	.uleb128 0x1b
-	.4byte	.LASF586
+	.4byte	.LASF588
 	.byte	0x48
 	.2byte	0x2b3
 	.4byte	0xc6
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF587
+	.4byte	.LASF589
 	.byte	0x48
 	.2byte	0x2b5
 	.4byte	0xc6
 	.byte	0x74
 	.uleb128 0x1b
-	.4byte	.LASF588
+	.4byte	.LASF590
 	.byte	0x48
 	.2byte	0x2b6
 	.4byte	0xc6
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF589
+	.4byte	.LASF591
 	.byte	0x48
 	.2byte	0x2b7
 	.4byte	0xc6
 	.byte	0x7c
 	.uleb128 0x1b
-	.4byte	.LASF590
+	.4byte	.LASF592
 	.byte	0x48
 	.2byte	0x2b8
 	.4byte	0x6d
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF591
+	.4byte	.LASF593
 	.byte	0x48
 	.2byte	0x2ba
-	.4byte	0x45cd
+	.4byte	0x45e3
 	.byte	0x88
 	.uleb128 0x2b
 	.string	"se"
 	.byte	0x48
 	.2byte	0x2bb
-	.4byte	0x41fc
+	.4byte	0x4212
 	.byte	0xc0
 	.uleb128 0x30
 	.string	"rt"
 	.byte	0x48
 	.2byte	0x2bc
-	.4byte	0x4329
+	.4byte	0x433f
 	.2byte	0x2c0
 	.uleb128 0x1c
-	.4byte	.LASF592
+	.4byte	.LASF594
 	.byte	0x48
 	.2byte	0x2bf
 	.4byte	0x155
 	.2byte	0x310
 	.uleb128 0x1c
-	.4byte	.LASF593
+	.4byte	.LASF595
 	.byte	0x48
 	.2byte	0x2c0
 	.4byte	0xc6
 	.2byte	0x318
 	.uleb128 0x1c
-	.4byte	.LASF594
+	.4byte	.LASF596
 	.byte	0x48
 	.2byte	0x2c1
 	.4byte	0x155
 	.2byte	0x320
 	.uleb128 0x1c
-	.4byte	.LASF595
+	.4byte	.LASF597
 	.byte	0x48
 	.2byte	0x2c2
 	.4byte	0x155
 	.2byte	0x328
 	.uleb128 0x1c
-	.4byte	.LASF596
+	.4byte	.LASF598
 	.byte	0x48
 	.2byte	0x2c5
-	.4byte	0x45d8
+	.4byte	0x45ee
 	.2byte	0x330
 	.uleb128 0x30
 	.string	"dl"
 	.byte	0x48
 	.2byte	0x2c7
-	.4byte	0x43cc
+	.4byte	0x43e2
 	.2byte	0x338
 	.uleb128 0x1c
-	.4byte	.LASF597
+	.4byte	.LASF599
 	.byte	0x48
 	.2byte	0x2d9
 	.4byte	0x6d
 	.2byte	0x420
 	.uleb128 0x1c
-	.4byte	.LASF598
+	.4byte	.LASF600
 	.byte	0x48
 	.2byte	0x2da
 	.4byte	0xc6
 	.2byte	0x424
 	.uleb128 0x1c
-	.4byte	.LASF599
+	.4byte	.LASF601
 	.byte	0x48
 	.2byte	0x2db
-	.4byte	0x15bd
+	.4byte	0x15d3
 	.2byte	0x428
 	.uleb128 0x1c
-	.4byte	.LASF600
+	.4byte	.LASF602
 	.byte	0x48
 	.2byte	0x2dc
-	.4byte	0x15bd
+	.4byte	0x15d3
 	.2byte	0x430
 	.uleb128 0x1c
-	.4byte	.LASF601
+	.4byte	.LASF603
 	.byte	0x48
 	.2byte	0x2df
 	.4byte	0xc6
 	.2byte	0x438
 	.uleb128 0x1c
-	.4byte	.LASF602
+	.4byte	.LASF604
 	.byte	0x48
 	.2byte	0x2e0
-	.4byte	0x44f7
+	.4byte	0x450d
 	.2byte	0x43c
 	.uleb128 0x1c
-	.4byte	.LASF603
+	.4byte	.LASF605
 	.byte	0x48
 	.2byte	0x2e1
 	.4byte	0x392
 	.2byte	0x440
 	.uleb128 0x1c
-	.4byte	.LASF604
+	.4byte	.LASF606
 	.byte	0x48
 	.2byte	0x2e2
-	.4byte	0x45e3
+	.4byte	0x45f9
 	.2byte	0x450
 	.uleb128 0x1c
-	.4byte	.LASF605
+	.4byte	.LASF607
 	.byte	0x48
 	.2byte	0x2e6
 	.4byte	0x29
 	.2byte	0x458
 	.uleb128 0x1c
-	.4byte	.LASF606
+	.4byte	.LASF608
 	.byte	0x48
 	.2byte	0x2e7
 	.4byte	0x10b
 	.2byte	0x460
 	.uleb128 0x1c
-	.4byte	.LASF607
+	.4byte	.LASF609
 	.byte	0x48
 	.2byte	0x2e8
 	.4byte	0x10b
 	.2byte	0x461
 	.uleb128 0x1c
-	.4byte	.LASF608
+	.4byte	.LASF610
 	.byte	0x48
 	.2byte	0x2e9
 	.4byte	0xc6
 	.2byte	0x464
 	.uleb128 0x1c
-	.4byte	.LASF609
+	.4byte	.LASF611
 	.byte	0x48
 	.2byte	0x2ea
 	.4byte	0x392
 	.2byte	0x468
 	.uleb128 0x1c
-	.4byte	.LASF610
+	.4byte	.LASF612
 	.byte	0x48
 	.2byte	0x2ed
-	.4byte	0x3f7a
+	.4byte	0x3f90
 	.2byte	0x478
 	.uleb128 0x1c
-	.4byte	.LASF555
+	.4byte	.LASF557
 	.byte	0x48
 	.2byte	0x2ef
 	.4byte	0x392
 	.2byte	0x498
 	.uleb128 0x1c
-	.4byte	.LASF611
+	.4byte	.LASF613
 	.byte	0x48
 	.2byte	0x2f1
-	.4byte	0x3486
+	.4byte	0x349c
 	.2byte	0x4a8
 	.uleb128 0x1c
-	.4byte	.LASF612
+	.4byte	.LASF614
 	.byte	0x48
 	.2byte	0x2f2
-	.4byte	0x34b7
+	.4byte	0x34cd
 	.2byte	0x4d0
 	.uleb128 0x30
 	.string	"mm"
 	.byte	0x48
 	.2byte	0x2f5
-	.4byte	0x460c
+	.4byte	0x4622
 	.2byte	0x4e8
 	.uleb128 0x1c
-	.4byte	.LASF613
+	.4byte	.LASF615
 	.byte	0x48
 	.2byte	0x2f6
-	.4byte	0x460c
+	.4byte	0x4622
 	.2byte	0x4f0
 	.uleb128 0x1c
-	.4byte	.LASF614
+	.4byte	.LASF616
 	.byte	0x48
 	.2byte	0x2f9
-	.4byte	0x3c55
+	.4byte	0x3c6b
 	.2byte	0x4f8
 	.uleb128 0x1c
-	.4byte	.LASF615
+	.4byte	.LASF617
 	.byte	0x48
 	.2byte	0x2fc
-	.4byte	0x3db5
+	.4byte	0x3dcb
 	.2byte	0x520
 	.uleb128 0x1c
-	.4byte	.LASF616
+	.4byte	.LASF618
 	.byte	0x48
 	.2byte	0x2fe
 	.4byte	0xc6
 	.2byte	0x538
 	.uleb128 0x1c
-	.4byte	.LASF617
+	.4byte	.LASF619
 	.byte	0x48
 	.2byte	0x2ff
 	.4byte	0xc6
 	.2byte	0x53c
 	.uleb128 0x1c
-	.4byte	.LASF618
+	.4byte	.LASF620
 	.byte	0x48
 	.2byte	0x300
 	.4byte	0xc6
 	.2byte	0x540
 	.uleb128 0x1c
-	.4byte	.LASF619
+	.4byte	.LASF621
 	.byte	0x48
 	.2byte	0x302
 	.4byte	0xc6
 	.2byte	0x544
 	.uleb128 0x1c
-	.4byte	.LASF620
+	.4byte	.LASF622
 	.byte	0x48
 	.2byte	0x304
 	.4byte	0x29
 	.2byte	0x548
 	.uleb128 0x1c
-	.4byte	.LASF621
+	.4byte	.LASF623
 	.byte	0x48
 	.2byte	0x307
 	.4byte	0x6d
 	.2byte	0x550
 	.uleb128 0x33
-	.4byte	.LASF622
+	.4byte	.LASF624
 	.byte	0x48
 	.2byte	0x30a
 	.4byte	0x6d
@@ -14229,7 +14578,7 @@ __exitcall_ebc_exit:
 	.byte	0x1f
 	.2byte	0x554
 	.uleb128 0x33
-	.4byte	.LASF623
+	.4byte	.LASF625
 	.byte	0x48
 	.2byte	0x30b
 	.4byte	0x6d
@@ -14238,7 +14587,7 @@ __exitcall_ebc_exit:
 	.byte	0x1e
 	.2byte	0x554
 	.uleb128 0x33
-	.4byte	.LASF624
+	.4byte	.LASF626
 	.byte	0x48
 	.2byte	0x30c
 	.4byte	0x6d
@@ -14247,7 +14596,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.2byte	0x554
 	.uleb128 0x33
-	.4byte	.LASF625
+	.4byte	.LASF627
 	.byte	0x48
 	.2byte	0x30d
 	.4byte	0x6d
@@ -14256,7 +14605,7 @@ __exitcall_ebc_exit:
 	.byte	0x1c
 	.2byte	0x554
 	.uleb128 0x33
-	.4byte	.LASF626
+	.4byte	.LASF628
 	.byte	0x48
 	.2byte	0x30f
 	.4byte	0x6d
@@ -14265,7 +14614,7 @@ __exitcall_ebc_exit:
 	.byte	0x1b
 	.2byte	0x554
 	.uleb128 0x33
-	.4byte	.LASF627
+	.4byte	.LASF629
 	.byte	0x48
 	.2byte	0x318
 	.4byte	0x6d
@@ -14274,7 +14623,7 @@ __exitcall_ebc_exit:
 	.byte	0x1f
 	.2byte	0x558
 	.uleb128 0x33
-	.4byte	.LASF628
+	.4byte	.LASF630
 	.byte	0x48
 	.2byte	0x319
 	.4byte	0x6d
@@ -14283,7 +14632,7 @@ __exitcall_ebc_exit:
 	.byte	0x1e
 	.2byte	0x558
 	.uleb128 0x33
-	.4byte	.LASF629
+	.4byte	.LASF631
 	.byte	0x48
 	.2byte	0x31e
 	.4byte	0x6d
@@ -14292,7 +14641,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.2byte	0x558
 	.uleb128 0x33
-	.4byte	.LASF630
+	.4byte	.LASF632
 	.byte	0x48
 	.2byte	0x320
 	.4byte	0x6d
@@ -14301,7 +14650,7 @@ __exitcall_ebc_exit:
 	.byte	0x1c
 	.2byte	0x558
 	.uleb128 0x33
-	.4byte	.LASF631
+	.4byte	.LASF633
 	.byte	0x48
 	.2byte	0x328
 	.4byte	0x6d
@@ -14310,7 +14659,7 @@ __exitcall_ebc_exit:
 	.byte	0x1b
 	.2byte	0x558
 	.uleb128 0x33
-	.4byte	.LASF632
+	.4byte	.LASF634
 	.byte	0x48
 	.2byte	0x32c
 	.4byte	0x6d
@@ -14319,7 +14668,7 @@ __exitcall_ebc_exit:
 	.byte	0x1a
 	.2byte	0x558
 	.uleb128 0x1c
-	.4byte	.LASF633
+	.4byte	.LASF635
 	.byte	0x48
 	.2byte	0x32f
 	.4byte	0x29
@@ -14337,223 +14686,223 @@ __exitcall_ebc_exit:
 	.4byte	0x285
 	.2byte	0x598
 	.uleb128 0x1c
-	.4byte	.LASF634
+	.4byte	.LASF636
 	.byte	0x48
 	.2byte	0x334
 	.4byte	0x285
 	.2byte	0x59c
 	.uleb128 0x1c
-	.4byte	.LASF635
+	.4byte	.LASF637
 	.byte	0x48
 	.2byte	0x338
 	.4byte	0x29
 	.2byte	0x5a0
 	.uleb128 0x1c
-	.4byte	.LASF636
+	.4byte	.LASF638
 	.byte	0x48
 	.2byte	0x341
-	.4byte	0x2eda
+	.4byte	0x2ef0
 	.2byte	0x5a8
 	.uleb128 0x1c
-	.4byte	.LASF637
+	.4byte	.LASF639
 	.byte	0x48
 	.2byte	0x344
-	.4byte	0x2eda
+	.4byte	0x2ef0
 	.2byte	0x5b0
 	.uleb128 0x1c
-	.4byte	.LASF638
+	.4byte	.LASF640
 	.byte	0x48
 	.2byte	0x349
 	.4byte	0x392
 	.2byte	0x5b8
 	.uleb128 0x1c
-	.4byte	.LASF639
+	.4byte	.LASF641
 	.byte	0x48
 	.2byte	0x34a
 	.4byte	0x392
 	.2byte	0x5c8
 	.uleb128 0x1c
-	.4byte	.LASF640
+	.4byte	.LASF642
 	.byte	0x48
 	.2byte	0x34b
-	.4byte	0x2eda
+	.4byte	0x2ef0
 	.2byte	0x5d8
 	.uleb128 0x1c
-	.4byte	.LASF641
+	.4byte	.LASF643
 	.byte	0x48
 	.2byte	0x353
 	.4byte	0x392
 	.2byte	0x5e0
 	.uleb128 0x1c
-	.4byte	.LASF642
+	.4byte	.LASF644
 	.byte	0x48
 	.2byte	0x354
 	.4byte	0x392
 	.2byte	0x5f0
 	.uleb128 0x1c
-	.4byte	.LASF643
+	.4byte	.LASF645
 	.byte	0x48
 	.2byte	0x357
-	.4byte	0x4612
+	.4byte	0x4628
 	.2byte	0x600
 	.uleb128 0x1c
-	.4byte	.LASF644
+	.4byte	.LASF646
 	.byte	0x48
 	.2byte	0x358
-	.4byte	0x4618
+	.4byte	0x462e
 	.2byte	0x608
 	.uleb128 0x1c
-	.4byte	.LASF645
+	.4byte	.LASF647
 	.byte	0x48
 	.2byte	0x359
 	.4byte	0x392
 	.2byte	0x648
 	.uleb128 0x1c
-	.4byte	.LASF646
+	.4byte	.LASF648
 	.byte	0x48
 	.2byte	0x35a
 	.4byte	0x392
 	.2byte	0x658
 	.uleb128 0x1c
-	.4byte	.LASF647
+	.4byte	.LASF649
 	.byte	0x48
 	.2byte	0x35c
-	.4byte	0x464d
+	.4byte	0x4663
 	.2byte	0x668
 	.uleb128 0x1c
-	.4byte	.LASF648
+	.4byte	.LASF650
 	.byte	0x48
 	.2byte	0x35f
-	.4byte	0x4653
+	.4byte	0x4669
 	.2byte	0x670
 	.uleb128 0x1c
-	.4byte	.LASF649
+	.4byte	.LASF651
 	.byte	0x48
 	.2byte	0x362
-	.4byte	0x4653
+	.4byte	0x4669
 	.2byte	0x678
 	.uleb128 0x1c
-	.4byte	.LASF650
+	.4byte	.LASF652
 	.byte	0x48
 	.2byte	0x364
 	.4byte	0x155
 	.2byte	0x680
 	.uleb128 0x1c
-	.4byte	.LASF651
+	.4byte	.LASF653
 	.byte	0x48
 	.2byte	0x365
 	.4byte	0x155
 	.2byte	0x688
 	.uleb128 0x1c
-	.4byte	.LASF652
+	.4byte	.LASF654
 	.byte	0x48
 	.2byte	0x36a
 	.4byte	0x155
 	.2byte	0x690
 	.uleb128 0x1c
-	.4byte	.LASF653
+	.4byte	.LASF655
 	.byte	0x48
 	.2byte	0x36c
-	.4byte	0x4659
+	.4byte	0x466f
 	.2byte	0x698
 	.uleb128 0x1c
-	.4byte	.LASF654
+	.4byte	.LASF656
 	.byte	0x48
 	.2byte	0x36d
 	.4byte	0x6d
 	.2byte	0x6a0
 	.uleb128 0x1c
-	.4byte	.LASF655
+	.4byte	.LASF657
 	.byte	0x48
 	.2byte	0x36f
-	.4byte	0x3f15
+	.4byte	0x3f2b
 	.2byte	0x6a8
 	.uleb128 0x1c
-	.4byte	.LASF656
+	.4byte	.LASF658
 	.byte	0x48
 	.2byte	0x378
 	.4byte	0x29
 	.2byte	0x6c0
 	.uleb128 0x1c
-	.4byte	.LASF657
+	.4byte	.LASF659
 	.byte	0x48
 	.2byte	0x379
 	.4byte	0x29
 	.2byte	0x6c8
 	.uleb128 0x1c
-	.4byte	.LASF658
+	.4byte	.LASF660
 	.byte	0x48
 	.2byte	0x37c
 	.4byte	0x155
 	.2byte	0x6d0
 	.uleb128 0x1c
-	.4byte	.LASF659
+	.4byte	.LASF661
 	.byte	0x48
 	.2byte	0x37f
 	.4byte	0x155
 	.2byte	0x6d8
 	.uleb128 0x1c
-	.4byte	.LASF660
+	.4byte	.LASF662
 	.byte	0x48
 	.2byte	0x382
 	.4byte	0x29
 	.2byte	0x6e0
 	.uleb128 0x1c
-	.4byte	.LASF661
+	.4byte	.LASF663
 	.byte	0x48
 	.2byte	0x383
 	.4byte	0x29
 	.2byte	0x6e8
 	.uleb128 0x1c
-	.4byte	.LASF662
+	.4byte	.LASF664
 	.byte	0x48
 	.2byte	0x386
-	.4byte	0x3f46
+	.4byte	0x3f5c
 	.2byte	0x6f0
 	.uleb128 0x1c
-	.4byte	.LASF663
+	.4byte	.LASF665
 	.byte	0x48
 	.2byte	0x387
-	.4byte	0x465f
+	.4byte	0x4675
 	.2byte	0x708
 	.uleb128 0x1c
-	.4byte	.LASF664
+	.4byte	.LASF666
 	.byte	0x48
 	.2byte	0x38d
-	.4byte	0x47a7
+	.4byte	0x47bd
 	.2byte	0x738
 	.uleb128 0x1c
-	.4byte	.LASF665
+	.4byte	.LASF667
 	.byte	0x48
 	.2byte	0x390
-	.4byte	0x47a7
+	.4byte	0x47bd
 	.2byte	0x740
 	.uleb128 0x1c
-	.4byte	.LASF666
+	.4byte	.LASF668
 	.byte	0x48
 	.2byte	0x393
-	.4byte	0x47a7
+	.4byte	0x47bd
 	.2byte	0x748
 	.uleb128 0x1c
-	.4byte	.LASF667
+	.4byte	.LASF669
 	.byte	0x48
 	.2byte	0x39c
-	.4byte	0x47ad
+	.4byte	0x47c3
 	.2byte	0x750
 	.uleb128 0x1c
-	.4byte	.LASF668
+	.4byte	.LASF670
 	.byte	0x48
 	.2byte	0x39e
-	.4byte	0x47c2
+	.4byte	0x47d8
 	.2byte	0x760
 	.uleb128 0x1c
-	.4byte	.LASF669
+	.4byte	.LASF671
 	.byte	0x48
 	.2byte	0x3a5
 	.4byte	0x29
 	.2byte	0x768
 	.uleb128 0x1c
-	.4byte	.LASF670
+	.4byte	.LASF672
 	.byte	0x48
 	.2byte	0x3a6
 	.4byte	0x29
@@ -14562,325 +14911,325 @@ __exitcall_ebc_exit:
 	.string	"fs"
 	.byte	0x48
 	.2byte	0x3a9
-	.4byte	0x47cd
+	.4byte	0x47e3
 	.2byte	0x778
 	.uleb128 0x1c
-	.4byte	.LASF671
+	.4byte	.LASF673
 	.byte	0x48
 	.2byte	0x3ac
-	.4byte	0x47d8
+	.4byte	0x47ee
 	.2byte	0x780
 	.uleb128 0x1c
-	.4byte	.LASF672
+	.4byte	.LASF674
 	.byte	0x48
 	.2byte	0x3af
-	.4byte	0x47e3
+	.4byte	0x47f9
 	.2byte	0x788
 	.uleb128 0x1c
-	.4byte	.LASF673
+	.4byte	.LASF675
 	.byte	0x48
 	.2byte	0x3b2
-	.4byte	0x47ee
+	.4byte	0x4804
 	.2byte	0x790
 	.uleb128 0x1c
-	.4byte	.LASF674
+	.4byte	.LASF676
 	.byte	0x48
 	.2byte	0x3b3
-	.4byte	0x47f9
+	.4byte	0x480f
 	.2byte	0x798
 	.uleb128 0x1c
-	.4byte	.LASF675
+	.4byte	.LASF677
 	.byte	0x48
 	.2byte	0x3b4
-	.4byte	0x38ba
+	.4byte	0x38d0
 	.2byte	0x7a0
 	.uleb128 0x1c
-	.4byte	.LASF676
+	.4byte	.LASF678
 	.byte	0x48
 	.2byte	0x3b5
-	.4byte	0x38ba
+	.4byte	0x38d0
 	.2byte	0x7a8
 	.uleb128 0x1c
-	.4byte	.LASF677
+	.4byte	.LASF679
 	.byte	0x48
 	.2byte	0x3b7
-	.4byte	0x38ba
+	.4byte	0x38d0
 	.2byte	0x7b0
 	.uleb128 0x1c
 	.4byte	.LASF218
 	.byte	0x48
 	.2byte	0x3b8
-	.4byte	0x3c30
+	.4byte	0x3c46
 	.2byte	0x7b8
 	.uleb128 0x1c
-	.4byte	.LASF678
+	.4byte	.LASF680
 	.byte	0x48
 	.2byte	0x3b9
 	.4byte	0x29
 	.2byte	0x7d0
 	.uleb128 0x1c
-	.4byte	.LASF679
+	.4byte	.LASF681
 	.byte	0x48
 	.2byte	0x3ba
 	.4byte	0x2ce
 	.2byte	0x7d8
 	.uleb128 0x1c
-	.4byte	.LASF680
+	.4byte	.LASF682
 	.byte	0x48
 	.2byte	0x3bb
 	.4byte	0x6d
 	.2byte	0x7e0
 	.uleb128 0x1c
-	.4byte	.LASF681
+	.4byte	.LASF683
 	.byte	0x48
 	.2byte	0x3bd
 	.4byte	0x42c
 	.2byte	0x7e8
 	.uleb128 0x1c
-	.4byte	.LASF682
+	.4byte	.LASF684
 	.byte	0x48
 	.2byte	0x3bf
-	.4byte	0x4804
+	.4byte	0x481a
 	.2byte	0x7f0
 	.uleb128 0x1c
-	.4byte	.LASF683
+	.4byte	.LASF685
 	.byte	0x48
 	.2byte	0x3c4
-	.4byte	0x382e
+	.4byte	0x3844
 	.2byte	0x7f8
 	.uleb128 0x1c
-	.4byte	.LASF684
+	.4byte	.LASF686
 	.byte	0x48
 	.2byte	0x3c7
 	.4byte	0x155
 	.2byte	0x808
 	.uleb128 0x1c
-	.4byte	.LASF685
+	.4byte	.LASF687
 	.byte	0x48
 	.2byte	0x3c8
 	.4byte	0x155
 	.2byte	0x810
 	.uleb128 0x1c
-	.4byte	.LASF686
+	.4byte	.LASF688
 	.byte	0x48
 	.2byte	0x3cb
 	.4byte	0xe50
 	.2byte	0x818
 	.uleb128 0x1c
-	.4byte	.LASF687
+	.4byte	.LASF689
 	.byte	0x48
 	.2byte	0x3ce
 	.4byte	0xe1e
 	.2byte	0x81c
 	.uleb128 0x1c
-	.4byte	.LASF688
+	.4byte	.LASF690
 	.byte	0x48
 	.2byte	0x3d0
-	.4byte	0x4519
+	.4byte	0x452f
 	.2byte	0x820
 	.uleb128 0x1c
-	.4byte	.LASF689
+	.4byte	.LASF691
 	.byte	0x48
 	.2byte	0x3d4
-	.4byte	0x3507
+	.4byte	0x351d
 	.2byte	0x828
 	.uleb128 0x1c
-	.4byte	.LASF690
+	.4byte	.LASF692
 	.byte	0x48
 	.2byte	0x3d6
-	.4byte	0x2eda
+	.4byte	0x2ef0
 	.2byte	0x838
 	.uleb128 0x1c
-	.4byte	.LASF691
+	.4byte	.LASF693
 	.byte	0x48
 	.2byte	0x3d8
-	.4byte	0x480f
+	.4byte	0x4825
 	.2byte	0x840
 	.uleb128 0x1c
-	.4byte	.LASF692
+	.4byte	.LASF694
 	.byte	0x48
 	.2byte	0x400
 	.4byte	0x443
 	.2byte	0x848
 	.uleb128 0x1c
-	.4byte	.LASF693
+	.4byte	.LASF695
 	.byte	0x48
 	.2byte	0x403
-	.4byte	0x481a
+	.4byte	0x4830
 	.2byte	0x850
 	.uleb128 0x1c
-	.4byte	.LASF694
+	.4byte	.LASF696
 	.byte	0x48
 	.2byte	0x407
-	.4byte	0x4825
+	.4byte	0x483b
 	.2byte	0x858
 	.uleb128 0x1c
-	.4byte	.LASF695
+	.4byte	.LASF697
 	.byte	0x48
 	.2byte	0x40b
-	.4byte	0x4830
+	.4byte	0x4846
 	.2byte	0x860
 	.uleb128 0x1c
-	.4byte	.LASF696
+	.4byte	.LASF698
 	.byte	0x48
 	.2byte	0x40d
-	.4byte	0x483b
+	.4byte	0x4851
 	.2byte	0x868
 	.uleb128 0x1c
-	.4byte	.LASF697
+	.4byte	.LASF699
 	.byte	0x48
 	.2byte	0x40f
-	.4byte	0x48d2
+	.4byte	0x48e8
 	.2byte	0x870
 	.uleb128 0x1c
-	.4byte	.LASF698
+	.4byte	.LASF700
 	.byte	0x48
 	.2byte	0x412
 	.4byte	0x29
 	.2byte	0x878
 	.uleb128 0x1c
-	.4byte	.LASF699
+	.4byte	.LASF701
 	.byte	0x48
 	.2byte	0x413
-	.4byte	0x48d8
+	.4byte	0x48ee
 	.2byte	0x880
 	.uleb128 0x1c
-	.4byte	.LASF700
+	.4byte	.LASF702
 	.byte	0x48
 	.2byte	0x415
-	.4byte	0x3e4c
+	.4byte	0x3e62
 	.2byte	0x888
 	.uleb128 0x1c
-	.4byte	.LASF701
+	.4byte	.LASF703
 	.byte	0x48
 	.2byte	0x418
 	.4byte	0x6d
 	.2byte	0x8c8
 	.uleb128 0x1c
-	.4byte	.LASF702
+	.4byte	.LASF704
 	.byte	0x48
 	.2byte	0x41c
 	.4byte	0x155
 	.2byte	0x8d0
 	.uleb128 0x1c
-	.4byte	.LASF703
+	.4byte	.LASF705
 	.byte	0x48
 	.2byte	0x41e
 	.4byte	0x155
 	.2byte	0x8d8
 	.uleb128 0x1c
-	.4byte	.LASF704
+	.4byte	.LASF706
 	.byte	0x48
 	.2byte	0x420
 	.4byte	0x155
 	.2byte	0x8e0
 	.uleb128 0x1c
-	.4byte	.LASF705
+	.4byte	.LASF707
 	.byte	0x48
 	.2byte	0x424
-	.4byte	0x3873
+	.4byte	0x3889
 	.2byte	0x8e8
 	.uleb128 0x1c
-	.4byte	.LASF706
+	.4byte	.LASF708
 	.byte	0x48
 	.2byte	0x426
-	.4byte	0x16d1
+	.4byte	0x16e7
 	.2byte	0x8f0
 	.uleb128 0x1c
-	.4byte	.LASF707
+	.4byte	.LASF709
 	.byte	0x48
 	.2byte	0x427
 	.4byte	0xc6
 	.2byte	0x8f4
 	.uleb128 0x1c
-	.4byte	.LASF708
+	.4byte	.LASF710
 	.byte	0x48
 	.2byte	0x428
 	.4byte	0xc6
 	.2byte	0x8f8
 	.uleb128 0x1c
-	.4byte	.LASF709
+	.4byte	.LASF711
 	.byte	0x48
 	.2byte	0x42c
-	.4byte	0x48e3
+	.4byte	0x48f9
 	.2byte	0x900
 	.uleb128 0x1c
-	.4byte	.LASF710
+	.4byte	.LASF712
 	.byte	0x48
 	.2byte	0x42e
 	.4byte	0x392
 	.2byte	0x908
 	.uleb128 0x1c
-	.4byte	.LASF711
+	.4byte	.LASF713
 	.byte	0x48
 	.2byte	0x435
-	.4byte	0x48ee
+	.4byte	0x4904
 	.2byte	0x918
 	.uleb128 0x1c
-	.4byte	.LASF712
+	.4byte	.LASF714
 	.byte	0x48
 	.2byte	0x437
-	.4byte	0x48f9
+	.4byte	0x490f
 	.2byte	0x920
 	.uleb128 0x1c
-	.4byte	.LASF713
+	.4byte	.LASF715
 	.byte	0x48
 	.2byte	0x439
 	.4byte	0x392
 	.2byte	0x928
 	.uleb128 0x1c
-	.4byte	.LASF714
+	.4byte	.LASF716
 	.byte	0x48
 	.2byte	0x43a
-	.4byte	0x4904
+	.4byte	0x491a
 	.2byte	0x938
 	.uleb128 0x1c
-	.4byte	.LASF715
+	.4byte	.LASF717
 	.byte	0x48
 	.2byte	0x43d
-	.4byte	0x490a
+	.4byte	0x4920
 	.2byte	0x940
 	.uleb128 0x1c
-	.4byte	.LASF716
+	.4byte	.LASF718
 	.byte	0x48
 	.2byte	0x43e
-	.4byte	0x243f
+	.4byte	0x2455
 	.2byte	0x950
 	.uleb128 0x1c
-	.4byte	.LASF717
+	.4byte	.LASF719
 	.byte	0x48
 	.2byte	0x43f
 	.4byte	0x392
 	.2byte	0x970
 	.uleb128 0x1c
-	.4byte	.LASF718
+	.4byte	.LASF720
 	.byte	0x48
 	.2byte	0x47d
-	.4byte	0x4925
+	.4byte	0x493b
 	.2byte	0x980
 	.uleb128 0x1c
-	.4byte	.LASF719
+	.4byte	.LASF721
 	.byte	0x48
 	.2byte	0x47e
 	.4byte	0x13a
 	.2byte	0x988
 	.uleb128 0x1c
-	.4byte	.LASF720
+	.4byte	.LASF722
 	.byte	0x48
 	.2byte	0x47f
 	.4byte	0x13a
 	.2byte	0x98c
 	.uleb128 0x1c
-	.4byte	.LASF721
+	.4byte	.LASF723
 	.byte	0x48
 	.2byte	0x484
 	.4byte	0x29
 	.2byte	0x990
 	.uleb128 0x1c
-	.4byte	.LASF722
+	.4byte	.LASF724
 	.byte	0x48
 	.2byte	0x487
-	.4byte	0x3e44
+	.4byte	0x3e5a
 	.2byte	0x998
 	.uleb128 0x30
 	.string	"rcu"
@@ -14889,470 +15238,470 @@ __exitcall_ebc_exit:
 	.4byte	0x407
 	.2byte	0x998
 	.uleb128 0x1c
-	.4byte	.LASF723
+	.4byte	.LASF725
 	.byte	0x48
 	.2byte	0x48c
-	.4byte	0x4930
+	.4byte	0x4946
 	.2byte	0x9a8
 	.uleb128 0x1c
-	.4byte	.LASF724
+	.4byte	.LASF726
 	.byte	0x48
 	.2byte	0x48e
-	.4byte	0x3e13
+	.4byte	0x3e29
 	.2byte	0x9b0
 	.uleb128 0x1c
-	.4byte	.LASF725
+	.4byte	.LASF727
 	.byte	0x48
 	.2byte	0x491
-	.4byte	0x493b
+	.4byte	0x4951
 	.2byte	0x9c0
 	.uleb128 0x1c
-	.4byte	.LASF726
+	.4byte	.LASF728
 	.byte	0x48
 	.2byte	0x49c
 	.4byte	0xc6
 	.2byte	0x9c8
 	.uleb128 0x1c
-	.4byte	.LASF727
+	.4byte	.LASF729
 	.byte	0x48
 	.2byte	0x49d
 	.4byte	0xc6
 	.2byte	0x9cc
 	.uleb128 0x1c
-	.4byte	.LASF728
+	.4byte	.LASF730
 	.byte	0x48
 	.2byte	0x49f
 	.4byte	0x29
 	.2byte	0x9d0
 	.uleb128 0x1c
-	.4byte	.LASF729
+	.4byte	.LASF731
 	.byte	0x48
 	.2byte	0x4a9
 	.4byte	0x155
 	.2byte	0x9d8
 	.uleb128 0x1c
-	.4byte	.LASF730
+	.4byte	.LASF732
 	.byte	0x48
 	.2byte	0x4aa
 	.4byte	0x155
 	.2byte	0x9e0
 	.uleb128 0x1c
-	.4byte	.LASF731
+	.4byte	.LASF733
 	.byte	0x48
 	.2byte	0x4c7
 	.4byte	0x29
 	.2byte	0x9e8
 	.uleb128 0x1c
-	.4byte	.LASF732
+	.4byte	.LASF734
 	.byte	0x48
 	.2byte	0x4ca
 	.4byte	0x29
 	.2byte	0x9f0
 	.uleb128 0x1c
-	.4byte	.LASF733
+	.4byte	.LASF735
 	.byte	0x48
 	.2byte	0x4e4
-	.4byte	0x4946
+	.4byte	0x495c
 	.2byte	0x9f8
 	.uleb128 0x1c
-	.4byte	.LASF734
+	.4byte	.LASF736
 	.byte	0x48
 	.2byte	0x4e5
 	.4byte	0x31b
 	.2byte	0xa00
 	.uleb128 0x1c
-	.4byte	.LASF735
+	.4byte	.LASF737
 	.byte	0x48
 	.2byte	0x4e6
 	.4byte	0xc6
 	.2byte	0xa04
 	.uleb128 0x1c
-	.4byte	.LASF736
+	.4byte	.LASF738
 	.byte	0x48
 	.2byte	0x4e9
 	.4byte	0x6d
 	.2byte	0xa08
 	.uleb128 0x1c
-	.4byte	.LASF737
+	.4byte	.LASF739
 	.byte	0x48
 	.2byte	0x4ec
-	.4byte	0x4946
+	.4byte	0x495c
 	.2byte	0xa10
 	.uleb128 0x1c
-	.4byte	.LASF738
+	.4byte	.LASF740
 	.byte	0x48
 	.2byte	0x4f0
-	.4byte	0x4951
+	.4byte	0x4967
 	.2byte	0xa18
 	.uleb128 0x1c
-	.4byte	.LASF739
+	.4byte	.LASF741
 	.byte	0x48
 	.2byte	0x4f4
-	.4byte	0x49a6
+	.4byte	0x49bc
 	.2byte	0xa20
 	.uleb128 0x1c
-	.4byte	.LASF740
+	.4byte	.LASF742
 	.byte	0x48
 	.2byte	0x4fd
 	.4byte	0xc6
 	.2byte	0xa28
 	.uleb128 0x1c
-	.4byte	.LASF741
+	.4byte	.LASF743
 	.byte	0x48
 	.2byte	0x4ff
-	.4byte	0x2eda
+	.4byte	0x2ef0
 	.2byte	0xa30
 	.uleb128 0x1c
-	.4byte	.LASF742
+	.4byte	.LASF744
 	.byte	0x48
 	.2byte	0x502
-	.4byte	0x4a19
+	.4byte	0x4a2f
 	.2byte	0xa38
 	.uleb128 0x1c
-	.4byte	.LASF743
+	.4byte	.LASF745
 	.byte	0x48
 	.2byte	0x506
 	.4byte	0x367
 	.2byte	0xa40
 	.uleb128 0x1c
-	.4byte	.LASF744
+	.4byte	.LASF746
 	.byte	0x48
 	.2byte	0x50d
 	.4byte	0x443
 	.2byte	0xa48
 	.uleb128 0x2f
-	.4byte	0x4556
+	.4byte	0x456c
 	.2byte	0xa50
 	.uleb128 0x2f
-	.4byte	0x459c
+	.4byte	0x45b2
 	.2byte	0xa58
 	.uleb128 0x1c
-	.4byte	.LASF745
+	.4byte	.LASF747
 	.byte	0x48
 	.2byte	0x521
-	.4byte	0x243f
+	.4byte	0x2455
 	.2byte	0xa60
 	.uleb128 0x1c
-	.4byte	.LASF746
+	.4byte	.LASF748
 	.byte	0x48
 	.2byte	0x524
 	.4byte	0x155
 	.2byte	0xa80
 	.uleb128 0x1c
-	.4byte	.LASF747
+	.4byte	.LASF749
 	.byte	0x48
 	.2byte	0x525
 	.4byte	0x155
 	.2byte	0xa88
 	.uleb128 0x1c
-	.4byte	.LASF748
+	.4byte	.LASF750
 	.byte	0x48
 	.2byte	0x52e
-	.4byte	0x1450
+	.4byte	0x1466
 	.2byte	0xa90
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x247c
+	.4byte	0x2492
 	.uleb128 0x19
-	.4byte	.LASF749
+	.4byte	.LASF751
 	.byte	0x49
 	.byte	0xa
 	.4byte	0x9ed
 	.uleb128 0xd
-	.4byte	.LASF750
+	.4byte	.LASF752
 	.byte	0x8
 	.byte	0x4a
 	.byte	0x46
-	.4byte	0x2f04
+	.4byte	0x2f1a
 	.uleb128 0xe
 	.4byte	.LASF63
 	.byte	0x4a
 	.byte	0x47
-	.4byte	0x2f04
+	.4byte	0x2f1a
 	.byte	0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2eeb
+	.4byte	0x2f01
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2f10
+	.4byte	0x2f26
 	.uleb128 0x10
-	.4byte	0x2f1b
+	.4byte	0x2f31
 	.uleb128 0x11
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF751
+	.4byte	.LASF753
 	.byte	0x4b
 	.byte	0x1e
 	.4byte	0x6d
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0x2f36
+	.4byte	0x2f4c
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x7
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF752
+	.4byte	.LASF754
 	.byte	0x4c
 	.byte	0x13
-	.4byte	0x2f26
+	.4byte	0x2f3c
 	.uleb128 0x19
-	.4byte	.LASF753
+	.4byte	.LASF755
 	.byte	0x4d
 	.byte	0x26
 	.4byte	0xc6
 	.uleb128 0x10
-	.4byte	0x2f5c
+	.4byte	0x2f72
 	.uleb128 0x11
-	.4byte	0x2f5c
+	.4byte	0x2f72
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x15b8
+	.4byte	0x15ce
 	.uleb128 0x19
-	.4byte	.LASF754
+	.4byte	.LASF756
 	.byte	0x4d
 	.byte	0x48
-	.4byte	0x2f6d
+	.4byte	0x2f83
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2f4c
+	.4byte	0x2f62
 	.uleb128 0xd
-	.4byte	.LASF755
+	.4byte	.LASF757
 	.byte	0x18
 	.byte	0x4d
 	.byte	0x5b
-	.4byte	0x2fa4
+	.4byte	0x2fba
 	.uleb128 0xe
-	.4byte	.LASF576
+	.4byte	.LASF578
 	.byte	0x4d
 	.byte	0x5c
 	.4byte	0x443
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF756
+	.4byte	.LASF758
 	.byte	0x4d
 	.byte	0x5d
-	.4byte	0x2eda
+	.4byte	0x2ef0
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF757
+	.4byte	.LASF759
 	.byte	0x4d
 	.byte	0x5e
 	.4byte	0x194
 	.byte	0x10
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF755
+	.4byte	.LASF757
 	.byte	0x4d
 	.byte	0x61
-	.4byte	0x2f73
+	.4byte	0x2f89
 	.uleb128 0x19
-	.4byte	.LASF758
+	.4byte	.LASF760
 	.byte	0x4d
 	.byte	0x62
 	.4byte	0x194
 	.uleb128 0x19
-	.4byte	.LASF759
+	.4byte	.LASF761
 	.byte	0x4b
 	.byte	0x7c
 	.4byte	0x6d
 	.uleb128 0x19
-	.4byte	.LASF760
+	.4byte	.LASF762
 	.byte	0x4b
 	.byte	0x80
 	.4byte	0xc6
 	.uleb128 0x16
 	.4byte	0x155
 	.uleb128 0x19
-	.4byte	.LASF761
+	.4byte	.LASF763
 	.byte	0x4e
 	.byte	0x60
-	.4byte	0x2fe0
+	.4byte	0x2ff6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2fd0
+	.4byte	0x2fe6
 	.uleb128 0x19
-	.4byte	.LASF762
+	.4byte	.LASF764
 	.byte	0x4f
 	.byte	0x22
 	.4byte	0xf3d
 	.uleb128 0x1f
-	.4byte	.LASF763
+	.4byte	.LASF765
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x4f
 	.byte	0x29
-	.4byte	0x3014
+	.4byte	0x302a
 	.uleb128 0xc
-	.4byte	.LASF764
+	.4byte	.LASF766
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF765
+	.4byte	.LASF767
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF766
+	.4byte	.LASF768
 	.byte	0x2
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF767
+	.4byte	.LASF769
 	.byte	0x48
 	.byte	0x4f
 	.byte	0x31
-	.4byte	0x308c
+	.4byte	0x30a2
 	.uleb128 0xe
-	.4byte	.LASF768
+	.4byte	.LASF770
 	.byte	0x4f
 	.byte	0x32
-	.4byte	0x2ff1
+	.4byte	0x3007
 	.byte	0
 	.uleb128 0x20
 	.string	"id"
 	.byte	0x4f
 	.byte	0x33
-	.4byte	0x3091
+	.4byte	0x30a7
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF769
+	.4byte	.LASF771
 	.byte	0x4f
 	.byte	0x34
 	.4byte	0x56
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF770
+	.4byte	.LASF772
 	.byte	0x4f
 	.byte	0x35
-	.4byte	0x309d
+	.4byte	0x30b3
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF771
+	.4byte	.LASF773
 	.byte	0x4f
 	.byte	0x36
-	.4byte	0x309d
+	.4byte	0x30b3
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF772
+	.4byte	.LASF774
 	.byte	0x4f
 	.byte	0x37
-	.4byte	0x2fe0
+	.4byte	0x2ff6
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF773
+	.4byte	.LASF775
 	.byte	0x4f
 	.byte	0x38
-	.4byte	0x2fe0
+	.4byte	0x2ff6
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF774
+	.4byte	.LASF776
 	.byte	0x4f
 	.byte	0x39
-	.4byte	0x30c2
+	.4byte	0x30d8
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF775
+	.4byte	.LASF777
 	.byte	0x4f
 	.byte	0x3a
-	.4byte	0x30c2
+	.4byte	0x30d8
 	.byte	0x40
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x3014
+	.4byte	0x302a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3097
+	.4byte	0x30ad
 	.uleb128 0x34
 	.uleb128 0x16
 	.4byte	0x13a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3098
+	.4byte	0x30ae
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x30b7
+	.4byte	0x30cd
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
-	.4byte	0x30b7
+	.4byte	0x30cd
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x30bd
+	.4byte	0x30d3
 	.uleb128 0x24
-	.4byte	.LASF776
+	.4byte	.LASF778
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x30a3
+	.4byte	0x30b9
 	.uleb128 0x19
-	.4byte	.LASF777
+	.4byte	.LASF779
 	.byte	0x4f
 	.byte	0x3d
-	.4byte	0x30d3
+	.4byte	0x30e9
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x308c
+	.4byte	0x30a2
 	.uleb128 0x19
-	.4byte	.LASF778
+	.4byte	.LASF780
 	.byte	0x50
 	.byte	0x8b
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF779
+	.4byte	.LASF781
 	.byte	0x50
 	.byte	0x8c
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF780
+	.4byte	.LASF782
 	.byte	0x51
 	.byte	0x4e
 	.4byte	0x155
 	.uleb128 0x19
-	.4byte	.LASF781
+	.4byte	.LASF783
 	.byte	0x51
 	.byte	0x4f
 	.4byte	0x35
 	.uleb128 0x19
-	.4byte	.LASF782
+	.4byte	.LASF784
 	.byte	0x51
 	.byte	0xbc
 	.4byte	0x29
 	.uleb128 0x8
-	.4byte	.LASF783
+	.4byte	.LASF785
 	.byte	0x52
 	.byte	0x1c
 	.4byte	0x14a
 	.uleb128 0x19
-	.4byte	.LASF784
+	.4byte	.LASF786
 	.byte	0x53
 	.byte	0xa
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF785
+	.4byte	.LASF787
 	.byte	0x53
 	.2byte	0x11e
 	.4byte	0xc6
 	.uleb128 0x14
 	.4byte	0x443
-	.4byte	0x3141
+	.4byte	0x3157
 	.uleb128 0x11
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3132
+	.4byte	0x3148
 	.uleb128 0xd
-	.4byte	.LASF786
+	.4byte	.LASF788
 	.byte	0x38
 	.byte	0x54
 	.byte	0xc
-	.4byte	0x319c
+	.4byte	0x31b2
 	.uleb128 0xe
-	.4byte	.LASF358
+	.4byte	.LASF360
 	.byte	0x54
 	.byte	0x11
 	.4byte	0x3d6
@@ -15364,10 +15713,10 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF787
+	.4byte	.LASF789
 	.byte	0x54
 	.byte	0x13
-	.4byte	0x31ad
+	.4byte	0x31c3
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF170
@@ -15389,51 +15738,51 @@ __exitcall_ebc_exit:
 	.byte	0x30
 	.byte	0
 	.uleb128 0x10
-	.4byte	0x31a7
+	.4byte	0x31bd
 	.uleb128 0x11
-	.4byte	0x31a7
+	.4byte	0x31bd
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3147
+	.4byte	0x315d
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x319c
+	.4byte	0x31b2
 	.uleb128 0x19
-	.4byte	.LASF788
+	.4byte	.LASF790
 	.byte	0x54
 	.byte	0xc3
 	.4byte	0x6d
 	.uleb128 0x8
-	.4byte	.LASF789
+	.4byte	.LASF791
 	.byte	0xd
 	.byte	0x16
-	.4byte	0x31c9
+	.4byte	0x31df
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x31cf
+	.4byte	0x31e5
 	.uleb128 0x10
-	.4byte	0x31da
+	.4byte	0x31f0
 	.uleb128 0x11
-	.4byte	0x31da
+	.4byte	0x31f0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x31e0
+	.4byte	0x31f6
 	.uleb128 0xd
-	.4byte	.LASF790
+	.4byte	.LASF792
 	.byte	0x30
 	.byte	0xd
 	.byte	0x67
-	.4byte	0x3229
+	.4byte	0x323f
 	.uleb128 0xe
-	.4byte	.LASF791
+	.4byte	.LASF793
 	.byte	0xd
 	.byte	0x68
 	.4byte	0x543
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF358
+	.4byte	.LASF360
 	.byte	0xd
 	.byte	0x69
 	.4byte	0x392
@@ -15442,7 +15791,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF70
 	.byte	0xd
 	.byte	0x6a
-	.4byte	0x31be
+	.4byte	0x31d4
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF129
@@ -15462,165 +15811,165 @@ __exitcall_ebc_exit:
 	.4byte	0x194
 	.byte	0xd
 	.byte	0x1f
-	.4byte	0x32ef
+	.4byte	0x3305
 	.uleb128 0xc
-	.4byte	.LASF792
+	.4byte	.LASF794
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF793
+	.4byte	.LASF795
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF794
+	.4byte	.LASF796
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF795
+	.4byte	.LASF797
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF796
+	.4byte	.LASF798
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF797
+	.4byte	.LASF799
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF798
+	.4byte	.LASF800
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF799
+	.4byte	.LASF801
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF800
+	.4byte	.LASF802
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF801
+	.4byte	.LASF803
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF802
+	.4byte	.LASF804
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF803
+	.4byte	.LASF805
 	.byte	0xf
 	.uleb128 0xc
-	.4byte	.LASF804
+	.4byte	.LASF806
 	.byte	0xf
 	.uleb128 0xc
-	.4byte	.LASF805
+	.4byte	.LASF807
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF806
+	.4byte	.LASF808
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF807
+	.4byte	.LASF809
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF808
+	.4byte	.LASF810
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF809
+	.4byte	.LASF811
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF810
+	.4byte	.LASF812
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF811
+	.4byte	.LASF813
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF812
+	.4byte	.LASF814
 	.byte	0x3b
 	.uleb128 0xc
-	.4byte	.LASF813
+	.4byte	.LASF815
 	.byte	0x1f
 	.uleb128 0x35
-	.4byte	.LASF814
+	.4byte	.LASF816
 	.4byte	0x7fffffff
 	.uleb128 0xc
-	.4byte	.LASF815
+	.4byte	.LASF817
 	.byte	0xff
 	.uleb128 0x36
-	.4byte	.LASF816
+	.4byte	.LASF818
 	.sleb128 -256
 	.uleb128 0x37
-	.4byte	.LASF817
+	.4byte	.LASF819
 	.8byte	0xfffffffe0
 	.uleb128 0xc
-	.4byte	.LASF818
+	.4byte	.LASF820
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF819
+	.4byte	.LASF821
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF820
+	.4byte	.LASF822
 	.byte	0x18
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF821
+	.4byte	.LASF823
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x32ef
+	.4byte	0x3305
 	.uleb128 0x15
-	.4byte	.LASF822
+	.4byte	.LASF824
 	.byte	0xd
 	.2byte	0x187
-	.4byte	0x32f4
+	.4byte	0x330a
 	.uleb128 0x15
-	.4byte	.LASF823
+	.4byte	.LASF825
 	.byte	0xd
 	.2byte	0x188
-	.4byte	0x32f4
+	.4byte	0x330a
 	.uleb128 0x15
-	.4byte	.LASF824
+	.4byte	.LASF826
 	.byte	0xd
 	.2byte	0x189
-	.4byte	0x32f4
+	.4byte	0x330a
 	.uleb128 0x15
-	.4byte	.LASF825
+	.4byte	.LASF827
 	.byte	0xd
 	.2byte	0x18a
-	.4byte	0x32f4
+	.4byte	0x330a
 	.uleb128 0x15
-	.4byte	.LASF826
+	.4byte	.LASF828
 	.byte	0xd
 	.2byte	0x18b
-	.4byte	0x32f4
+	.4byte	0x330a
 	.uleb128 0x15
-	.4byte	.LASF827
+	.4byte	.LASF829
 	.byte	0xd
 	.2byte	0x18c
-	.4byte	0x32f4
+	.4byte	0x330a
 	.uleb128 0x15
-	.4byte	.LASF828
+	.4byte	.LASF830
 	.byte	0xd
 	.2byte	0x18d
-	.4byte	0x32f4
+	.4byte	0x330a
 	.uleb128 0xd
-	.4byte	.LASF829
+	.4byte	.LASF831
 	.byte	0x4
 	.byte	0x56
 	.byte	0x13
-	.4byte	0x3367
+	.4byte	0x337d
 	.uleb128 0xe
-	.4byte	.LASF830
+	.4byte	.LASF832
 	.byte	0x56
 	.byte	0x14
 	.4byte	0x367
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF831
+	.4byte	.LASF833
 	.byte	0x56
 	.byte	0x15
-	.4byte	0x334e
+	.4byte	0x3364
 	.uleb128 0x8
-	.4byte	.LASF832
+	.4byte	.LASF834
 	.byte	0x57
 	.byte	0x19
 	.4byte	0x155
 	.uleb128 0x8
-	.4byte	.LASF833
+	.4byte	.LASF835
 	.byte	0x57
 	.byte	0x1a
 	.4byte	0x155
 	.uleb128 0x8
-	.4byte	.LASF834
+	.4byte	.LASF836
 	.byte	0x57
 	.byte	0x1c
 	.4byte	0x155
@@ -15628,101 +15977,101 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x57
 	.byte	0x21
-	.4byte	0x33a8
+	.4byte	0x33be
 	.uleb128 0x20
 	.string	"pte"
 	.byte	0x57
 	.byte	0x21
-	.4byte	0x3372
+	.4byte	0x3388
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF835
+	.4byte	.LASF837
 	.byte	0x57
 	.byte	0x21
-	.4byte	0x3393
+	.4byte	0x33a9
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x57
 	.byte	0x26
-	.4byte	0x33c8
+	.4byte	0x33de
 	.uleb128 0x20
 	.string	"pmd"
 	.byte	0x57
 	.byte	0x26
-	.4byte	0x337d
+	.4byte	0x3393
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF836
+	.4byte	.LASF838
 	.byte	0x57
 	.byte	0x26
-	.4byte	0x33b3
+	.4byte	0x33c9
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x57
 	.byte	0x31
-	.4byte	0x33e8
+	.4byte	0x33fe
 	.uleb128 0x20
 	.string	"pgd"
 	.byte	0x57
 	.byte	0x31
-	.4byte	0x3388
+	.4byte	0x339e
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF837
+	.4byte	.LASF839
 	.byte	0x57
 	.byte	0x31
-	.4byte	0x33d3
+	.4byte	0x33e9
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x57
 	.byte	0x35
-	.4byte	0x3408
+	.4byte	0x341e
 	.uleb128 0xe
-	.4byte	.LASF838
+	.4byte	.LASF840
 	.byte	0x57
 	.byte	0x35
-	.4byte	0x3372
+	.4byte	0x3388
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF839
+	.4byte	.LASF841
 	.byte	0x57
 	.byte	0x35
-	.4byte	0x33f3
+	.4byte	0x3409
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x58
 	.byte	0xf
-	.4byte	0x3428
+	.4byte	0x343e
 	.uleb128 0x20
 	.string	"pgd"
 	.byte	0x58
 	.byte	0xf
-	.4byte	0x33e8
+	.4byte	0x33fe
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF840
+	.4byte	.LASF842
 	.byte	0x58
 	.byte	0xf
-	.4byte	0x3413
+	.4byte	0x3429
 	.uleb128 0x8
-	.4byte	.LASF841
+	.4byte	.LASF843
 	.byte	0x59
 	.byte	0x2a
-	.4byte	0x343e
+	.4byte	0x3454
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3444
+	.4byte	0x345a
 	.uleb128 0xd
-	.4byte	.LASF842
+	.4byte	.LASF844
 	.byte	0x40
 	.byte	0x5a
 	.byte	0x47
-	.4byte	0x3481
+	.4byte	0x3497
 	.uleb128 0xe
 	.4byte	.LASF170
 	.byte	0x5a
@@ -15730,121 +16079,121 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x23
-	.4byte	0x53a5
+	.4byte	0x53bb
 	.byte	0x8
 	.uleb128 0x23
-	.4byte	0x53d7
+	.4byte	0x53ed
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF843
+	.4byte	.LASF845
 	.byte	0x5a
 	.byte	0xb8
 	.4byte	0x367
 	.byte	0x34
 	.uleb128 0xe
-	.4byte	.LASF844
+	.4byte	.LASF846
 	.byte	0x5a
 	.byte	0xbb
-	.4byte	0x4946
+	.4byte	0x495c
 	.byte	0x38
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x3444
+	.4byte	0x345a
 	.uleb128 0xd
-	.4byte	.LASF845
+	.4byte	.LASF847
 	.byte	0x28
 	.byte	0x5b
 	.byte	0x55
-	.4byte	0x34b7
+	.4byte	0x34cd
 	.uleb128 0xe
-	.4byte	.LASF587
+	.4byte	.LASF589
 	.byte	0x5b
 	.byte	0x56
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF846
+	.4byte	.LASF848
 	.byte	0x5b
 	.byte	0x57
 	.4byte	0x392
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF847
+	.4byte	.LASF849
 	.byte	0x5b
 	.byte	0x58
 	.4byte	0x392
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF848
+	.4byte	.LASF850
 	.byte	0x18
 	.byte	0x5c
 	.byte	0x24
-	.4byte	0x34e8
+	.4byte	0x34fe
 	.uleb128 0xe
-	.4byte	.LASF849
+	.4byte	.LASF851
 	.byte	0x5c
 	.byte	0x25
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF850
+	.4byte	.LASF852
 	.byte	0x5c
 	.byte	0x26
-	.4byte	0x34e8
+	.4byte	0x34fe
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF851
+	.4byte	.LASF853
 	.byte	0x5c
 	.byte	0x27
-	.4byte	0x34e8
+	.4byte	0x34fe
 	.byte	0x10
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x34b7
+	.4byte	0x34cd
 	.uleb128 0xd
-	.4byte	.LASF852
+	.4byte	.LASF854
 	.byte	0x8
 	.byte	0x5c
 	.byte	0x2b
-	.4byte	0x3507
+	.4byte	0x351d
 	.uleb128 0xe
-	.4byte	.LASF848
+	.4byte	.LASF850
 	.byte	0x5c
 	.byte	0x2c
-	.4byte	0x34e8
+	.4byte	0x34fe
 	.byte	0
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF853
+	.4byte	.LASF855
 	.byte	0x10
 	.byte	0x5c
 	.byte	0x39
-	.4byte	0x352c
+	.4byte	0x3542
 	.uleb128 0xe
-	.4byte	.LASF852
+	.4byte	.LASF854
 	.byte	0x5c
 	.byte	0x3a
-	.4byte	0x34ee
+	.4byte	0x3504
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF854
+	.4byte	.LASF856
 	.byte	0x5c
 	.byte	0x3b
-	.4byte	0x34e8
+	.4byte	0x34fe
 	.byte	0x8
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF855
+	.4byte	.LASF857
 	.byte	0x5d
 	.byte	0x47
 	.4byte	0x443
 	.uleb128 0x19
-	.4byte	.LASF856
+	.4byte	.LASF858
 	.byte	0x5d
 	.byte	0x48
-	.4byte	0x3542
+	.4byte	0x3558
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x30
@@ -15852,143 +16201,143 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.4byte	0x6d
 	.uleb128 0x1f
-	.4byte	.LASF857
+	.4byte	.LASF859
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x5d
 	.byte	0x5d
-	.4byte	0x3577
+	.4byte	0x358d
 	.uleb128 0xc
-	.4byte	.LASF858
+	.4byte	.LASF860
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF859
+	.4byte	.LASF861
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF860
+	.4byte	.LASF862
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF861
+	.4byte	.LASF863
 	.byte	0x3
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x5c
-	.4byte	0x3587
+	.4byte	0x359d
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x3577
+	.4byte	0x358d
 	.uleb128 0x19
-	.4byte	.LASF862
+	.4byte	.LASF864
 	.byte	0x5d
 	.byte	0x64
-	.4byte	0x3587
+	.4byte	0x359d
 	.uleb128 0x19
-	.4byte	.LASF863
+	.4byte	.LASF865
 	.byte	0x5d
 	.byte	0x66
-	.4byte	0x354e
+	.4byte	0x3564
 	.uleb128 0xd
-	.4byte	.LASF864
+	.4byte	.LASF866
 	.byte	0x20
 	.byte	0x5e
 	.byte	0x9
-	.4byte	0x35c7
+	.4byte	0x35dd
 	.uleb128 0xe
-	.4byte	.LASF865
+	.4byte	.LASF867
 	.byte	0x5e
 	.byte	0xa
-	.4byte	0x34b7
+	.4byte	0x34cd
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF193
 	.byte	0x5e
 	.byte	0xb
-	.4byte	0x3110
+	.4byte	0x3126
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF866
+	.4byte	.LASF868
 	.byte	0x10
 	.byte	0x5e
 	.byte	0xe
-	.4byte	0x35ec
+	.4byte	0x3602
 	.uleb128 0xe
 	.4byte	.LASF135
 	.byte	0x5e
 	.byte	0xf
-	.4byte	0x34ee
+	.4byte	0x3504
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF63
 	.byte	0x5e
 	.byte	0x10
-	.4byte	0x35ec
+	.4byte	0x3602
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x35a2
+	.4byte	0x35b8
 	.uleb128 0x1f
-	.4byte	.LASF867
+	.4byte	.LASF869
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x54
 	.byte	0xbe
-	.4byte	0x360f
+	.4byte	0x3625
 	.uleb128 0xc
-	.4byte	.LASF868
+	.4byte	.LASF870
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF869
+	.4byte	.LASF871
 	.byte	0x1
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF870
+	.4byte	.LASF872
 	.byte	0x48
 	.byte	0x5f
 	.byte	0x6f
-	.4byte	0x367c
+	.4byte	0x3692
 	.uleb128 0xe
-	.4byte	.LASF865
+	.4byte	.LASF867
 	.byte	0x5f
 	.byte	0x70
-	.4byte	0x35a2
+	.4byte	0x35b8
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF871
+	.4byte	.LASF873
 	.byte	0x5f
 	.byte	0x71
-	.4byte	0x3110
+	.4byte	0x3126
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF787
+	.4byte	.LASF789
 	.byte	0x5f
 	.byte	0x72
-	.4byte	0x3691
+	.4byte	0x36a7
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF872
+	.4byte	.LASF874
 	.byte	0x5f
 	.byte	0x73
-	.4byte	0x3704
+	.4byte	0x371a
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF575
+	.4byte	.LASF577
 	.byte	0x5f
 	.byte	0x74
 	.4byte	0x10b
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF873
+	.4byte	.LASF875
 	.byte	0x5f
 	.byte	0x75
 	.4byte	0x10b
 	.byte	0x39
 	.uleb128 0xe
-	.4byte	.LASF874
+	.4byte	.LASF876
 	.byte	0x5f
 	.byte	0x76
 	.4byte	0x10b
@@ -16001,31 +16350,31 @@ __exitcall_ebc_exit:
 	.byte	0x40
 	.byte	0
 	.uleb128 0x14
-	.4byte	0x35f2
-	.4byte	0x368b
+	.4byte	0x3608
+	.4byte	0x36a1
 	.uleb128 0x11
-	.4byte	0x368b
+	.4byte	0x36a1
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x360f
+	.4byte	0x3625
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x367c
+	.4byte	0x3692
 	.uleb128 0xd
-	.4byte	.LASF875
+	.4byte	.LASF877
 	.byte	0x40
 	.byte	0x5f
 	.byte	0x99
-	.4byte	0x3704
+	.4byte	0x371a
 	.uleb128 0xe
-	.4byte	.LASF876
+	.4byte	.LASF878
 	.byte	0x5f
 	.byte	0x9a
-	.4byte	0x37f0
+	.4byte	0x3806
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF877
+	.4byte	.LASF879
 	.byte	0x5f
 	.byte	0x9b
 	.4byte	0x6d
@@ -16040,42 +16389,42 @@ __exitcall_ebc_exit:
 	.string	"seq"
 	.byte	0x5f
 	.byte	0x9d
-	.4byte	0x16d1
+	.4byte	0x16e7
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF878
+	.4byte	.LASF880
 	.byte	0x5f
 	.byte	0x9e
-	.4byte	0x368b
+	.4byte	0x36a1
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF879
+	.4byte	.LASF881
 	.byte	0x5f
 	.byte	0x9f
-	.4byte	0x35c7
+	.4byte	0x35dd
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF880
+	.4byte	.LASF882
 	.byte	0x5f
 	.byte	0xa0
-	.4byte	0x37fb
+	.4byte	0x3811
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF881
+	.4byte	.LASF883
 	.byte	0x5f
 	.byte	0xa1
-	.4byte	0x3110
+	.4byte	0x3126
 	.byte	0x38
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3697
+	.4byte	0x36ad
 	.uleb128 0x26
-	.4byte	.LASF882
+	.4byte	.LASF884
 	.2byte	0x240
 	.byte	0x5f
 	.byte	0xcc
-	.4byte	0x37f0
+	.4byte	0x3806
 	.uleb128 0xe
 	.4byte	.LASF115
 	.byte	0x5f
@@ -16089,19 +16438,19 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF883
+	.4byte	.LASF885
 	.byte	0x5f
 	.byte	0xcf
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF884
+	.4byte	.LASF886
 	.byte	0x5f
 	.byte	0xd0
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0x38
-	.4byte	.LASF885
+	.4byte	.LASF887
 	.byte	0x5f
 	.byte	0xd1
 	.4byte	0x6d
@@ -16110,7 +16459,7 @@ __exitcall_ebc_exit:
 	.byte	0x1f
 	.byte	0x10
 	.uleb128 0x38
-	.4byte	.LASF886
+	.4byte	.LASF888
 	.byte	0x5f
 	.byte	0xd2
 	.4byte	0x6d
@@ -16119,7 +16468,7 @@ __exitcall_ebc_exit:
 	.byte	0x1e
 	.byte	0x10
 	.uleb128 0x38
-	.4byte	.LASF887
+	.4byte	.LASF889
 	.byte	0x5f
 	.byte	0xd3
 	.4byte	0x6d
@@ -16128,7 +16477,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.byte	0x10
 	.uleb128 0x38
-	.4byte	.LASF888
+	.4byte	.LASF890
 	.byte	0x5f
 	.byte	0xd4
 	.4byte	0x6d
@@ -16137,150 +16486,150 @@ __exitcall_ebc_exit:
 	.byte	0x1c
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF889
+	.4byte	.LASF891
 	.byte	0x5f
 	.byte	0xd6
 	.4byte	0x6d
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF890
+	.4byte	.LASF892
 	.byte	0x5f
 	.byte	0xd7
 	.4byte	0xb4
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF891
+	.4byte	.LASF893
 	.byte	0x5f
 	.byte	0xd8
 	.4byte	0xb4
 	.byte	0x1a
 	.uleb128 0xe
-	.4byte	.LASF892
+	.4byte	.LASF894
 	.byte	0x5f
 	.byte	0xd9
 	.4byte	0x6d
 	.byte	0x1c
 	.uleb128 0xe
-	.4byte	.LASF893
+	.4byte	.LASF895
 	.byte	0x5f
 	.byte	0xdb
-	.4byte	0x3110
+	.4byte	0x3126
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF894
+	.4byte	.LASF896
 	.byte	0x5f
 	.byte	0xdc
-	.4byte	0x368b
+	.4byte	0x36a1
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF895
+	.4byte	.LASF897
 	.byte	0x5f
 	.byte	0xdd
-	.4byte	0x3110
+	.4byte	0x3126
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF896
+	.4byte	.LASF898
 	.byte	0x5f
 	.byte	0xde
-	.4byte	0x368b
+	.4byte	0x36a1
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF897
+	.4byte	.LASF899
 	.byte	0x5f
 	.byte	0xdf
-	.4byte	0x3801
+	.4byte	0x3817
 	.byte	0x40
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x370a
+	.4byte	0x3720
 	.uleb128 0x16
-	.4byte	0x3110
+	.4byte	0x3126
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x37f6
+	.4byte	0x380c
 	.uleb128 0x5
-	.4byte	0x3697
-	.4byte	0x3811
+	.4byte	0x36ad
+	.4byte	0x3827
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x7
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF898
+	.4byte	.LASF900
 	.byte	0x5f
 	.2byte	0x135
 	.4byte	0x6d
 	.uleb128 0x24
-	.4byte	.LASF899
+	.4byte	.LASF901
 	.uleb128 0x15
-	.4byte	.LASF900
+	.4byte	.LASF902
 	.byte	0x5f
 	.2byte	0x15c
-	.4byte	0x381d
+	.4byte	0x3833
 	.uleb128 0xd
-	.4byte	.LASF683
+	.4byte	.LASF685
 	.byte	0x10
 	.byte	0x60
 	.byte	0x1c
-	.4byte	0x3853
+	.4byte	0x3869
 	.uleb128 0xe
-	.4byte	.LASF901
+	.4byte	.LASF903
 	.byte	0x60
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF902
+	.4byte	.LASF904
 	.byte	0x60
 	.byte	0x1e
-	.4byte	0x3858
+	.4byte	0x386e
 	.byte	0x8
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF903
+	.4byte	.LASF905
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3853
+	.4byte	0x3869
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x61
 	.byte	0x62
-	.4byte	0x3873
+	.4byte	0x3889
 	.uleb128 0xe
-	.4byte	.LASF363
+	.4byte	.LASF365
 	.byte	0x61
 	.byte	0x62
 	.4byte	0x104d
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF904
+	.4byte	.LASF906
 	.byte	0x61
 	.byte	0x62
-	.4byte	0x385e
+	.4byte	0x3874
 	.uleb128 0x19
-	.4byte	.LASF905
+	.4byte	.LASF907
 	.byte	0x61
 	.byte	0x63
-	.4byte	0x3873
+	.4byte	0x3889
 	.uleb128 0x5
-	.4byte	0x3873
-	.4byte	0x3899
+	.4byte	0x3889
+	.4byte	0x38af
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x4
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF906
+	.4byte	.LASF908
 	.byte	0x61
 	.2byte	0x19a
-	.4byte	0x3889
+	.4byte	0x389f
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x62
 	.byte	0x5a
-	.4byte	0x38ba
+	.4byte	0x38d0
 	.uleb128 0x20
 	.string	"sig"
 	.byte	0x62
@@ -16289,45 +16638,45 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF907
+	.4byte	.LASF909
 	.byte	0x62
 	.byte	0x5c
-	.4byte	0x38a5
+	.4byte	0x38bb
 	.uleb128 0x39
-	.4byte	.LASF1086
+	.4byte	.LASF1088
 	.byte	0x8
 	.byte	0x63
 	.byte	0x8
-	.4byte	0x38e8
+	.4byte	0x38fe
 	.uleb128 0x22
-	.4byte	.LASF908
+	.4byte	.LASF910
 	.byte	0x63
 	.byte	0x9
 	.4byte	0xc6
 	.uleb128 0x22
-	.4byte	.LASF909
+	.4byte	.LASF911
 	.byte	0x63
 	.byte	0xa
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF910
+	.4byte	.LASF912
 	.byte	0x63
 	.byte	0xb
-	.4byte	0x38c5
+	.4byte	0x38db
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x63
 	.byte	0x39
-	.4byte	0x3914
+	.4byte	0x392a
 	.uleb128 0xe
-	.4byte	.LASF911
+	.4byte	.LASF913
 	.byte	0x63
 	.byte	0x3a
 	.4byte	0x1ab
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF912
+	.4byte	.LASF914
 	.byte	0x63
 	.byte	0x3b
 	.4byte	0x1b6
@@ -16337,27 +16686,27 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0x63
 	.byte	0x3f
-	.4byte	0x394d
+	.4byte	0x3963
 	.uleb128 0xe
-	.4byte	.LASF913
+	.4byte	.LASF915
 	.byte	0x63
 	.byte	0x40
 	.4byte	0x203
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF914
+	.4byte	.LASF916
 	.byte	0x63
 	.byte	0x41
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF915
+	.4byte	.LASF917
 	.byte	0x63
 	.byte	0x42
-	.4byte	0x38e8
+	.4byte	0x38fe
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF916
+	.4byte	.LASF918
 	.byte	0x63
 	.byte	0x43
 	.4byte	0xc6
@@ -16367,57 +16716,57 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x63
 	.byte	0x47
-	.4byte	0x397a
+	.4byte	0x3990
 	.uleb128 0xe
-	.4byte	.LASF911
+	.4byte	.LASF913
 	.byte	0x63
 	.byte	0x48
 	.4byte	0x1ab
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF912
+	.4byte	.LASF914
 	.byte	0x63
 	.byte	0x49
 	.4byte	0x1b6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF915
+	.4byte	.LASF917
 	.byte	0x63
 	.byte	0x4a
-	.4byte	0x38e8
+	.4byte	0x38fe
 	.byte	0x8
 	.byte	0
 	.uleb128 0xf
 	.byte	0x20
 	.byte	0x63
 	.byte	0x4e
-	.4byte	0x39bf
+	.4byte	0x39d5
 	.uleb128 0xe
-	.4byte	.LASF911
+	.4byte	.LASF913
 	.byte	0x63
 	.byte	0x4f
 	.4byte	0x1ab
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF912
+	.4byte	.LASF914
 	.byte	0x63
 	.byte	0x50
 	.4byte	0x1b6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF917
+	.4byte	.LASF919
 	.byte	0x63
 	.byte	0x51
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF918
+	.4byte	.LASF920
 	.byte	0x63
 	.byte	0x52
 	.4byte	0x1f8
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF919
+	.4byte	.LASF921
 	.byte	0x63
 	.byte	0x53
 	.4byte	0x1f8
@@ -16427,21 +16776,21 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0x63
 	.byte	0x6b
-	.4byte	0x39ec
+	.4byte	0x3a02
 	.uleb128 0xe
-	.4byte	.LASF920
+	.4byte	.LASF922
 	.byte	0x63
 	.byte	0x6c
-	.4byte	0x39ec
+	.4byte	0x3a02
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF921
+	.4byte	.LASF923
 	.byte	0x63
 	.byte	0x6d
 	.4byte	0x443
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF922
+	.4byte	.LASF924
 	.byte	0x63
 	.byte	0x6e
 	.4byte	0x443
@@ -16449,7 +16798,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x39fc
+	.4byte	0x3a12
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x7
@@ -16458,15 +16807,15 @@ __exitcall_ebc_exit:
 	.byte	0xc
 	.byte	0x63
 	.byte	0x71
-	.4byte	0x3a1d
+	.4byte	0x3a33
 	.uleb128 0xe
-	.4byte	.LASF923
+	.4byte	.LASF925
 	.byte	0x63
 	.byte	0x72
-	.4byte	0x39ec
+	.4byte	0x3a02
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF924
+	.4byte	.LASF926
 	.byte	0x63
 	.byte	0x73
 	.4byte	0xd2
@@ -16476,45 +16825,45 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0x63
 	.byte	0x64
-	.4byte	0x3a47
+	.4byte	0x3a5d
 	.uleb128 0x22
-	.4byte	.LASF925
+	.4byte	.LASF927
 	.byte	0x63
 	.byte	0x69
 	.4byte	0xa2
 	.uleb128 0x22
-	.4byte	.LASF926
+	.4byte	.LASF928
 	.byte	0x63
 	.byte	0x6f
-	.4byte	0x39bf
+	.4byte	0x39d5
 	.uleb128 0x22
-	.4byte	.LASF927
+	.4byte	.LASF929
 	.byte	0x63
 	.byte	0x74
-	.4byte	0x39fc
+	.4byte	0x3a12
 	.byte	0
 	.uleb128 0xf
 	.byte	0x20
 	.byte	0x63
 	.byte	0x57
-	.4byte	0x3a62
+	.4byte	0x3a78
 	.uleb128 0xe
-	.4byte	.LASF928
+	.4byte	.LASF930
 	.byte	0x63
 	.byte	0x58
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x23
-	.4byte	0x3a1d
+	.4byte	0x3a33
 	.byte	0x8
 	.byte	0
 	.uleb128 0xf
 	.byte	0x10
 	.byte	0x63
 	.byte	0x79
-	.4byte	0x3a83
+	.4byte	0x3a99
 	.uleb128 0xe
-	.4byte	.LASF929
+	.4byte	.LASF931
 	.byte	0x63
 	.byte	0x7a
 	.4byte	0x194
@@ -16530,21 +16879,21 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x63
 	.byte	0x7f
-	.4byte	0x3ab0
+	.4byte	0x3ac6
 	.uleb128 0xe
-	.4byte	.LASF930
+	.4byte	.LASF932
 	.byte	0x63
 	.byte	0x80
 	.4byte	0x443
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF931
+	.4byte	.LASF933
 	.byte	0x63
 	.byte	0x81
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF932
+	.4byte	.LASF934
 	.byte	0x63
 	.byte	0x82
 	.4byte	0x6d
@@ -16554,153 +16903,153 @@ __exitcall_ebc_exit:
 	.byte	0x70
 	.byte	0x63
 	.byte	0x35
-	.4byte	0x3b11
+	.4byte	0x3b27
 	.uleb128 0x22
-	.4byte	.LASF933
+	.4byte	.LASF935
 	.byte	0x63
 	.byte	0x36
-	.4byte	0x3b11
+	.4byte	0x3b27
 	.uleb128 0x22
-	.4byte	.LASF934
+	.4byte	.LASF936
 	.byte	0x63
 	.byte	0x3c
-	.4byte	0x38f3
+	.4byte	0x3909
 	.uleb128 0x22
-	.4byte	.LASF935
+	.4byte	.LASF937
 	.byte	0x63
 	.byte	0x44
-	.4byte	0x3914
+	.4byte	0x392a
 	.uleb128 0x28
 	.string	"_rt"
 	.byte	0x63
 	.byte	0x4b
-	.4byte	0x394d
+	.4byte	0x3963
 	.uleb128 0x22
-	.4byte	.LASF936
+	.4byte	.LASF938
 	.byte	0x63
 	.byte	0x54
-	.4byte	0x397a
+	.4byte	0x3990
 	.uleb128 0x22
-	.4byte	.LASF937
+	.4byte	.LASF939
 	.byte	0x63
 	.byte	0x76
-	.4byte	0x3a47
+	.4byte	0x3a5d
 	.uleb128 0x22
-	.4byte	.LASF938
+	.4byte	.LASF940
 	.byte	0x63
 	.byte	0x7c
-	.4byte	0x3a62
+	.4byte	0x3a78
 	.uleb128 0x22
-	.4byte	.LASF939
+	.4byte	.LASF941
 	.byte	0x63
 	.byte	0x83
-	.4byte	0x3a83
+	.4byte	0x3a99
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xc6
-	.4byte	0x3b21
+	.4byte	0x3b37
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1b
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF940
+	.4byte	.LASF942
 	.byte	0x80
 	.byte	0x63
 	.byte	0x2b
-	.4byte	0x3b5e
+	.4byte	0x3b74
 	.uleb128 0xe
-	.4byte	.LASF941
+	.4byte	.LASF943
 	.byte	0x63
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF942
+	.4byte	.LASF944
 	.byte	0x63
 	.byte	0x2e
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF943
+	.4byte	.LASF945
 	.byte	0x63
 	.byte	0x2f
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF944
+	.4byte	.LASF946
 	.byte	0x63
 	.byte	0x84
-	.4byte	0x3ab0
+	.4byte	0x3ac6
 	.byte	0x10
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF945
+	.4byte	.LASF947
 	.byte	0x63
 	.byte	0x85
-	.4byte	0x3b21
+	.4byte	0x3b37
 	.uleb128 0xd
-	.4byte	.LASF946
+	.4byte	.LASF948
 	.byte	0x98
 	.byte	0x64
 	.byte	0x10
-	.4byte	0x3c2a
+	.4byte	0x3c40
 	.uleb128 0xe
-	.4byte	.LASF947
+	.4byte	.LASF949
 	.byte	0x64
 	.byte	0x11
-	.4byte	0x3367
+	.4byte	0x337d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF948
+	.4byte	.LASF950
 	.byte	0x64
 	.byte	0x12
 	.4byte	0x367
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF949
+	.4byte	.LASF951
 	.byte	0x64
 	.byte	0x13
 	.4byte	0x367
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF950
+	.4byte	.LASF952
 	.byte	0x64
 	.byte	0x18
 	.4byte	0x543
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF951
+	.4byte	.LASF953
 	.byte	0x64
 	.byte	0x1e
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF952
+	.4byte	.LASF954
 	.byte	0x64
 	.byte	0x1f
 	.4byte	0x29
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF953
+	.4byte	.LASF955
 	.byte	0x64
 	.byte	0x20
 	.4byte	0x543
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF954
+	.4byte	.LASF956
 	.byte	0x64
 	.byte	0x23
-	.4byte	0x874e
+	.4byte	0x8764
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF955
+	.4byte	.LASF957
 	.byte	0x64
 	.byte	0x24
-	.4byte	0x874e
+	.4byte	0x8764
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF956
+	.4byte	.LASF958
 	.byte	0x64
 	.byte	0x28
 	.4byte	0x3d6
@@ -16709,19 +17058,19 @@ __exitcall_ebc_exit:
 	.string	"uid"
 	.byte	0x64
 	.byte	0x29
-	.4byte	0x23e5
+	.4byte	0x23fb
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF957
+	.4byte	.LASF959
 	.byte	0x64
 	.byte	0x2d
 	.4byte	0x543
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF958
+	.4byte	.LASF960
 	.byte	0x64
 	.byte	0x31
-	.4byte	0x9562
+	.4byte	0x9578
 	.byte	0x60
 	.uleb128 0xe
 	.4byte	.LASF129
@@ -16738,165 +17087,165 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3b69
+	.4byte	0x3b7f
 	.uleb128 0xd
-	.4byte	.LASF949
+	.4byte	.LASF951
 	.byte	0x18
 	.byte	0x65
 	.byte	0x1a
-	.4byte	0x3c55
+	.4byte	0x3c6b
 	.uleb128 0xe
-	.4byte	.LASF959
+	.4byte	.LASF961
 	.byte	0x65
 	.byte	0x1b
 	.4byte	0x392
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF673
+	.4byte	.LASF675
 	.byte	0x65
 	.byte	0x1c
-	.4byte	0x38ba
+	.4byte	0x38d0
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF614
+	.4byte	.LASF616
 	.byte	0x28
 	.byte	0x66
 	.byte	0x22
-	.4byte	0x3c7a
+	.4byte	0x3c90
 	.uleb128 0xe
-	.4byte	.LASF960
+	.4byte	.LASF962
 	.byte	0x66
 	.byte	0x23
 	.4byte	0x155
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF961
+	.4byte	.LASF963
 	.byte	0x66
 	.byte	0x24
-	.4byte	0x3c7a
+	.4byte	0x3c90
 	.byte	0x8
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x3c8a
-	.4byte	0x3c8a
+	.4byte	0x3ca0
+	.4byte	0x3ca0
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3c90
+	.4byte	0x3ca6
 	.uleb128 0x1d
-	.4byte	.LASF962
+	.4byte	.LASF964
 	.byte	0xd8
 	.byte	0x5a
 	.2byte	0x10e
-	.4byte	0x3db5
+	.4byte	0x3dcb
 	.uleb128 0x1b
-	.4byte	.LASF963
+	.4byte	.LASF965
 	.byte	0x5a
 	.2byte	0x111
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF964
+	.4byte	.LASF966
 	.byte	0x5a
 	.2byte	0x112
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF965
+	.4byte	.LASF967
 	.byte	0x5a
 	.2byte	0x116
-	.4byte	0x3c8a
+	.4byte	0x3ca0
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF966
+	.4byte	.LASF968
 	.byte	0x5a
 	.2byte	0x116
-	.4byte	0x3c8a
+	.4byte	0x3ca0
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF967
+	.4byte	.LASF969
 	.byte	0x5a
 	.2byte	0x118
-	.4byte	0x34b7
+	.4byte	0x34cd
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF968
+	.4byte	.LASF970
 	.byte	0x5a
 	.2byte	0x120
 	.4byte	0x29
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF969
+	.4byte	.LASF971
 	.byte	0x5a
 	.2byte	0x124
-	.4byte	0x460c
+	.4byte	0x4622
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF970
+	.4byte	.LASF972
 	.byte	0x5a
 	.2byte	0x125
-	.4byte	0x3408
+	.4byte	0x341e
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF971
+	.4byte	.LASF973
 	.byte	0x5a
 	.2byte	0x126
 	.4byte	0x29
 	.byte	0x50
 	.uleb128 0x23
-	.4byte	0x5563
+	.4byte	0x5579
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF972
+	.4byte	.LASF974
 	.byte	0x5a
 	.2byte	0x13e
 	.4byte	0x392
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF973
+	.4byte	.LASF975
 	.byte	0x5a
 	.2byte	0x140
-	.4byte	0x558a
+	.4byte	0x55a0
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF974
+	.4byte	.LASF976
 	.byte	0x5a
 	.2byte	0x143
-	.4byte	0x5680
+	.4byte	0x5696
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF975
+	.4byte	.LASF977
 	.byte	0x5a
 	.2byte	0x146
 	.4byte	0x29
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF976
+	.4byte	.LASF978
 	.byte	0x5a
 	.2byte	0x148
-	.4byte	0x5531
+	.4byte	0x5547
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF977
+	.4byte	.LASF979
 	.byte	0x5a
 	.2byte	0x149
 	.4byte	0x443
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF978
+	.4byte	.LASF980
 	.byte	0x5a
 	.2byte	0x14b
 	.4byte	0x543
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF979
+	.4byte	.LASF981
 	.byte	0x5a
 	.2byte	0x152
-	.4byte	0x5537
+	.4byte	0x554d
 	.byte	0xb8
 	.uleb128 0x1b
 	.4byte	.LASF129
@@ -16924,131 +17273,131 @@ __exitcall_ebc_exit:
 	.byte	0xd0
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF980
+	.4byte	.LASF982
 	.byte	0x18
 	.byte	0x66
 	.byte	0x33
-	.4byte	0x3dda
+	.4byte	0x3df0
 	.uleb128 0xe
-	.4byte	.LASF981
+	.4byte	.LASF983
 	.byte	0x66
 	.byte	0x34
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF380
+	.4byte	.LASF382
 	.byte	0x66
 	.byte	0x35
-	.4byte	0x3dda
+	.4byte	0x3df0
 	.byte	0x4
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xc6
-	.4byte	0x3dea
+	.4byte	0x3e00
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x4
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF982
+	.4byte	.LASF984
 	.byte	0x28
 	.byte	0x66
 	.byte	0x39
-	.4byte	0x3e03
+	.4byte	0x3e19
 	.uleb128 0xe
-	.4byte	.LASF380
+	.4byte	.LASF382
 	.byte	0x66
 	.byte	0x3a
-	.4byte	0x3e03
+	.4byte	0x3e19
 	.byte	0
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x543
-	.4byte	0x3e13
+	.4byte	0x3e29
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x4
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF983
+	.4byte	.LASF985
 	.byte	0x10
 	.byte	0x66
 	.byte	0x3d
-	.4byte	0x3e44
+	.4byte	0x3e5a
 	.uleb128 0xe
-	.4byte	.LASF842
+	.4byte	.LASF844
 	.byte	0x66
 	.byte	0x3e
-	.4byte	0x343e
+	.4byte	0x3454
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF881
+	.4byte	.LASF883
 	.byte	0x66
 	.byte	0x40
 	.4byte	0xd2
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0x66
 	.byte	0x41
 	.4byte	0xd2
 	.byte	0xc
 	.byte	0
 	.uleb128 0x3a
-	.4byte	.LASF986
+	.4byte	.LASF988
 	.byte	0
 	.byte	0x66
 	.byte	0x49
 	.uleb128 0xd
-	.4byte	.LASF987
+	.4byte	.LASF989
 	.byte	0x40
 	.byte	0x67
 	.byte	0xc
-	.4byte	0x3eb9
+	.4byte	0x3ecf
 	.uleb128 0xe
-	.4byte	.LASF988
+	.4byte	.LASF990
 	.byte	0x67
 	.byte	0xf
 	.4byte	0x155
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF989
+	.4byte	.LASF991
 	.byte	0x67
 	.byte	0x11
 	.4byte	0x155
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF990
+	.4byte	.LASF992
 	.byte	0x67
 	.byte	0x13
 	.4byte	0x155
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF991
+	.4byte	.LASF993
 	.byte	0x67
 	.byte	0x15
 	.4byte	0x155
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF992
+	.4byte	.LASF994
 	.byte	0x67
 	.byte	0x17
 	.4byte	0x155
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF993
+	.4byte	.LASF995
 	.byte	0x67
 	.byte	0x1f
 	.4byte	0x155
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF994
+	.4byte	.LASF996
 	.byte	0x67
 	.byte	0x25
 	.4byte	0x155
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF995
+	.4byte	.LASF997
 	.byte	0x67
 	.byte	0x2e
 	.4byte	0x155
@@ -17058,9 +17407,9 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x68
 	.byte	0x6d
-	.4byte	0x3ed8
+	.4byte	0x3eee
 	.uleb128 0x22
-	.4byte	.LASF996
+	.4byte	.LASF998
 	.byte	0x68
 	.byte	0x6e
 	.4byte	0xef
@@ -17071,28 +17420,28 @@ __exitcall_ebc_exit:
 	.4byte	0xef
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF718
+	.4byte	.LASF720
 	.byte	0x20
 	.byte	0x68
 	.byte	0x3e
-	.4byte	0x3f15
+	.4byte	0x3f2b
 	.uleb128 0xe
-	.4byte	.LASF997
+	.4byte	.LASF999
 	.byte	0x68
 	.byte	0x4b
 	.4byte	0xd2
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF998
+	.4byte	.LASF1000
 	.byte	0x68
 	.byte	0x5a
 	.4byte	0xd2
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF999
+	.4byte	.LASF1001
 	.byte	0x68
 	.byte	0x7c
-	.4byte	0x3eb9
+	.4byte	0x3ecf
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF170
@@ -17102,19 +17451,19 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF655
+	.4byte	.LASF657
 	.byte	0x18
 	.byte	0x48
 	.byte	0xed
-	.4byte	0x3f46
+	.4byte	0x3f5c
 	.uleb128 0xe
-	.4byte	.LASF650
+	.4byte	.LASF652
 	.byte	0x48
 	.byte	0xef
 	.4byte	0x155
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF651
+	.4byte	.LASF653
 	.byte	0x48
 	.byte	0xf0
 	.4byte	0x155
@@ -17127,430 +17476,430 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1000
+	.4byte	.LASF1002
 	.byte	0x18
 	.byte	0x48
 	.byte	0xff
-	.4byte	0x3f7a
+	.4byte	0x3f90
 	.uleb128 0x1b
-	.4byte	.LASF650
+	.4byte	.LASF652
 	.byte	0x48
 	.2byte	0x100
 	.4byte	0x155
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF651
+	.4byte	.LASF653
 	.byte	0x48
 	.2byte	0x101
 	.4byte	0x155
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1001
+	.4byte	.LASF1003
 	.byte	0x48
 	.2byte	0x102
 	.4byte	0xfa
 	.byte	0x10
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF610
+	.4byte	.LASF612
 	.byte	0x20
 	.byte	0x48
 	.2byte	0x128
-	.4byte	0x3fbc
+	.4byte	0x3fd2
 	.uleb128 0x1b
-	.4byte	.LASF1002
+	.4byte	.LASF1004
 	.byte	0x48
 	.2byte	0x12d
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1003
+	.4byte	.LASF1005
 	.byte	0x48
 	.2byte	0x130
 	.4byte	0xfa
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1004
+	.4byte	.LASF1006
 	.byte	0x48
 	.2byte	0x135
 	.4byte	0xfa
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1005
+	.4byte	.LASF1007
 	.byte	0x48
 	.2byte	0x138
 	.4byte	0xfa
 	.byte	0x18
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1006
+	.4byte	.LASF1008
 	.byte	0x10
 	.byte	0x48
 	.2byte	0x14b
-	.4byte	0x3fe4
+	.4byte	0x3ffa
 	.uleb128 0x1b
-	.4byte	.LASF1007
+	.4byte	.LASF1009
 	.byte	0x48
 	.2byte	0x14c
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1008
+	.4byte	.LASF1010
 	.byte	0x48
 	.2byte	0x14d
 	.4byte	0x13a
 	.byte	0x8
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1009
+	.4byte	.LASF1011
 	.byte	0x8
 	.byte	0x48
 	.2byte	0x166
-	.4byte	0x400c
+	.4byte	0x4022
 	.uleb128 0x1b
-	.4byte	.LASF1010
+	.4byte	.LASF1012
 	.byte	0x48
 	.2byte	0x167
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1011
+	.4byte	.LASF1013
 	.byte	0x48
 	.2byte	0x168
 	.4byte	0x6d
 	.byte	0x4
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1012
+	.4byte	.LASF1014
 	.byte	0x40
 	.byte	0x48
 	.2byte	0x197
-	.4byte	0x408f
+	.4byte	0x40a5
 	.uleb128 0x1b
-	.4byte	.LASF1013
+	.4byte	.LASF1015
 	.byte	0x48
 	.2byte	0x198
 	.4byte	0x155
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1014
+	.4byte	.LASF1016
 	.byte	0x48
 	.2byte	0x199
 	.4byte	0x155
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1015
+	.4byte	.LASF1017
 	.byte	0x48
 	.2byte	0x19a
 	.4byte	0x155
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1016
+	.4byte	.LASF1018
 	.byte	0x48
 	.2byte	0x19b
 	.4byte	0x13a
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1017
+	.4byte	.LASF1019
 	.byte	0x48
 	.2byte	0x19c
 	.4byte	0x13a
 	.byte	0x1c
 	.uleb128 0x1b
-	.4byte	.LASF1018
+	.4byte	.LASF1020
 	.byte	0x48
 	.2byte	0x19d
 	.4byte	0x29
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1019
+	.4byte	.LASF1021
 	.byte	0x48
 	.2byte	0x19e
 	.4byte	0x29
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1020
+	.4byte	.LASF1022
 	.byte	0x48
 	.2byte	0x19f
 	.4byte	0x29
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1009
+	.4byte	.LASF1011
 	.byte	0x48
 	.2byte	0x1a0
-	.4byte	0x3fe4
+	.4byte	0x3ffa
 	.byte	0x38
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1021
+	.4byte	.LASF1023
 	.byte	0xd8
 	.byte	0x48
 	.2byte	0x1a3
-	.4byte	0x41fc
+	.4byte	0x4212
 	.uleb128 0x1b
-	.4byte	.LASF1022
+	.4byte	.LASF1024
 	.byte	0x48
 	.2byte	0x1a5
 	.4byte	0x155
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1023
+	.4byte	.LASF1025
 	.byte	0x48
 	.2byte	0x1a6
 	.4byte	0x155
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1024
+	.4byte	.LASF1026
 	.byte	0x48
 	.2byte	0x1a7
 	.4byte	0x155
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1025
+	.4byte	.LASF1027
 	.byte	0x48
 	.2byte	0x1a8
 	.4byte	0x155
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1026
+	.4byte	.LASF1028
 	.byte	0x48
 	.2byte	0x1a9
 	.4byte	0x155
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1027
+	.4byte	.LASF1029
 	.byte	0x48
 	.2byte	0x1aa
 	.4byte	0x155
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1028
+	.4byte	.LASF1030
 	.byte	0x48
 	.2byte	0x1ac
 	.4byte	0x155
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1029
+	.4byte	.LASF1031
 	.byte	0x48
 	.2byte	0x1ad
 	.4byte	0x155
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1030
+	.4byte	.LASF1032
 	.byte	0x48
 	.2byte	0x1ae
 	.4byte	0x14a
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1031
+	.4byte	.LASF1033
 	.byte	0x48
 	.2byte	0x1b0
 	.4byte	0x155
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1032
+	.4byte	.LASF1034
 	.byte	0x48
 	.2byte	0x1b1
 	.4byte	0x155
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1033
+	.4byte	.LASF1035
 	.byte	0x48
 	.2byte	0x1b2
 	.4byte	0x155
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1034
+	.4byte	.LASF1036
 	.byte	0x48
 	.2byte	0x1b3
 	.4byte	0x155
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1035
+	.4byte	.LASF1037
 	.byte	0x48
 	.2byte	0x1b5
 	.4byte	0x155
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1036
+	.4byte	.LASF1038
 	.byte	0x48
 	.2byte	0x1b6
 	.4byte	0x155
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1037
+	.4byte	.LASF1039
 	.byte	0x48
 	.2byte	0x1b7
 	.4byte	0x155
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1038
+	.4byte	.LASF1040
 	.byte	0x48
 	.2byte	0x1b8
 	.4byte	0x155
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1039
+	.4byte	.LASF1041
 	.byte	0x48
 	.2byte	0x1b9
 	.4byte	0x155
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF1040
+	.4byte	.LASF1042
 	.byte	0x48
 	.2byte	0x1bb
 	.4byte	0x155
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1041
+	.4byte	.LASF1043
 	.byte	0x48
 	.2byte	0x1bc
 	.4byte	0x155
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF1042
+	.4byte	.LASF1044
 	.byte	0x48
 	.2byte	0x1bd
 	.4byte	0x155
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF1043
+	.4byte	.LASF1045
 	.byte	0x48
 	.2byte	0x1be
 	.4byte	0x155
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF1044
+	.4byte	.LASF1046
 	.byte	0x48
 	.2byte	0x1bf
 	.4byte	0x155
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF1045
+	.4byte	.LASF1047
 	.byte	0x48
 	.2byte	0x1c0
 	.4byte	0x155
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF1046
+	.4byte	.LASF1048
 	.byte	0x48
 	.2byte	0x1c1
 	.4byte	0x155
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF1047
+	.4byte	.LASF1049
 	.byte	0x48
 	.2byte	0x1c2
 	.4byte	0x155
 	.byte	0xc8
 	.uleb128 0x1b
-	.4byte	.LASF1048
+	.4byte	.LASF1050
 	.byte	0x48
 	.2byte	0x1c3
 	.4byte	0x155
 	.byte	0xd0
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF1049
+	.4byte	.LASF1051
 	.2byte	0x200
 	.byte	0x48
 	.2byte	0x1c7
-	.4byte	0x4318
+	.4byte	0x432e
 	.uleb128 0x1b
-	.4byte	.LASF1050
+	.4byte	.LASF1052
 	.byte	0x48
 	.2byte	0x1c9
-	.4byte	0x3fbc
+	.4byte	0x3fd2
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1051
+	.4byte	.LASF1053
 	.byte	0x48
 	.2byte	0x1ca
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1052
+	.4byte	.LASF1054
 	.byte	0x48
 	.2byte	0x1cb
-	.4byte	0x34b7
+	.4byte	0x34cd
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1053
+	.4byte	.LASF1055
 	.byte	0x48
 	.2byte	0x1cc
 	.4byte	0x392
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF586
+	.4byte	.LASF588
 	.byte	0x48
 	.2byte	0x1cd
 	.4byte	0x6d
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1054
+	.4byte	.LASF1056
 	.byte	0x48
 	.2byte	0x1cf
 	.4byte	0x155
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1001
+	.4byte	.LASF1003
 	.byte	0x48
 	.2byte	0x1d0
 	.4byte	0x155
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1055
+	.4byte	.LASF1057
 	.byte	0x48
 	.2byte	0x1d1
 	.4byte	0x155
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1056
+	.4byte	.LASF1058
 	.byte	0x48
 	.2byte	0x1d2
 	.4byte	0x155
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1057
+	.4byte	.LASF1059
 	.byte	0x48
 	.2byte	0x1d4
 	.4byte	0x155
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1058
+	.4byte	.LASF1060
 	.byte	0x48
 	.2byte	0x1d6
-	.4byte	0x408f
+	.4byte	0x40a5
 	.byte	0x70
 	.uleb128 0x1c
-	.4byte	.LASF1059
+	.4byte	.LASF1061
 	.byte	0x48
 	.2byte	0x1d9
 	.4byte	0xc6
 	.2byte	0x148
 	.uleb128 0x1c
-	.4byte	.LASF637
+	.4byte	.LASF639
 	.byte	0x48
 	.2byte	0x1da
-	.4byte	0x4318
+	.4byte	0x432e
 	.2byte	0x150
 	.uleb128 0x1c
-	.4byte	.LASF1060
+	.4byte	.LASF1062
 	.byte	0x48
 	.2byte	0x1dc
-	.4byte	0x4323
+	.4byte	0x4339
 	.2byte	0x158
 	.uleb128 0x1c
-	.4byte	.LASF1061
+	.4byte	.LASF1063
 	.byte	0x48
 	.2byte	0x1de
-	.4byte	0x4323
+	.4byte	0x4339
 	.2byte	0x160
 	.uleb128 0x30
 	.string	"avg"
 	.byte	0x48
 	.2byte	0x1e8
-	.4byte	0x400c
+	.4byte	0x4022
 	.2byte	0x180
 	.uleb128 0x1c
 	.4byte	.LASF129
@@ -17579,59 +17928,59 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x41fc
+	.4byte	0x4212
 	.uleb128 0x24
-	.4byte	.LASF1060
+	.4byte	.LASF1062
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x431e
+	.4byte	0x4334
 	.uleb128 0x1d
-	.4byte	.LASF1062
+	.4byte	.LASF1064
 	.byte	0x50
 	.byte	0x48
 	.2byte	0x1f1
-	.4byte	0x43c6
+	.4byte	0x43dc
 	.uleb128 0x1b
-	.4byte	.LASF1063
+	.4byte	.LASF1065
 	.byte	0x48
 	.2byte	0x1f2
 	.4byte	0x392
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1064
+	.4byte	.LASF1066
 	.byte	0x48
 	.2byte	0x1f3
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1065
+	.4byte	.LASF1067
 	.byte	0x48
 	.2byte	0x1f4
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1066
+	.4byte	.LASF1068
 	.byte	0x48
 	.2byte	0x1f5
 	.4byte	0x6d
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF586
+	.4byte	.LASF588
 	.byte	0x48
 	.2byte	0x1f6
 	.4byte	0xb4
 	.byte	0x24
 	.uleb128 0x1b
-	.4byte	.LASF1067
+	.4byte	.LASF1069
 	.byte	0x48
 	.2byte	0x1f7
 	.4byte	0xb4
 	.byte	0x26
 	.uleb128 0x1b
-	.4byte	.LASF1068
+	.4byte	.LASF1070
 	.byte	0x48
 	.2byte	0x1f9
-	.4byte	0x43c6
+	.4byte	0x43dc
 	.byte	0x28
 	.uleb128 0x1b
 	.4byte	.LASF129
@@ -17660,57 +18009,57 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4329
+	.4byte	0x433f
 	.uleb128 0x1d
-	.4byte	.LASF1069
+	.4byte	.LASF1071
 	.byte	0xe8
 	.byte	0x48
 	.2byte	0x208
-	.4byte	0x44b9
+	.4byte	0x44cf
 	.uleb128 0x1b
-	.4byte	.LASF848
+	.4byte	.LASF850
 	.byte	0x48
 	.2byte	0x209
-	.4byte	0x34b7
+	.4byte	0x34cd
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1070
+	.4byte	.LASF1072
 	.byte	0x48
 	.2byte	0x210
 	.4byte	0x155
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1071
+	.4byte	.LASF1073
 	.byte	0x48
 	.2byte	0x211
 	.4byte	0x155
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1072
+	.4byte	.LASF1074
 	.byte	0x48
 	.2byte	0x212
 	.4byte	0x155
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1073
+	.4byte	.LASF1075
 	.byte	0x48
 	.2byte	0x213
 	.4byte	0x155
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1074
+	.4byte	.LASF1076
 	.byte	0x48
 	.2byte	0x214
 	.4byte	0x155
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1075
+	.4byte	.LASF1077
 	.byte	0x48
 	.2byte	0x21b
 	.4byte	0x14a
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1076
+	.4byte	.LASF1078
 	.byte	0x48
 	.2byte	0x21c
 	.4byte	0x155
@@ -17722,7 +18071,7 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0x50
 	.uleb128 0x3b
-	.4byte	.LASF1077
+	.4byte	.LASF1079
 	.byte	0x48
 	.2byte	0x237
 	.4byte	0x6d
@@ -17731,7 +18080,7 @@ __exitcall_ebc_exit:
 	.byte	0x1f
 	.byte	0x54
 	.uleb128 0x3b
-	.4byte	.LASF1078
+	.4byte	.LASF1080
 	.byte	0x48
 	.2byte	0x238
 	.4byte	0x6d
@@ -17740,7 +18089,7 @@ __exitcall_ebc_exit:
 	.byte	0x1e
 	.byte	0x54
 	.uleb128 0x3b
-	.4byte	.LASF1079
+	.4byte	.LASF1081
 	.byte	0x48
 	.2byte	0x239
 	.4byte	0x6d
@@ -17749,7 +18098,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.byte	0x54
 	.uleb128 0x3b
-	.4byte	.LASF1080
+	.4byte	.LASF1082
 	.byte	0x48
 	.2byte	0x23a
 	.4byte	0x6d
@@ -17758,7 +18107,7 @@ __exitcall_ebc_exit:
 	.byte	0x1c
 	.byte	0x54
 	.uleb128 0x3b
-	.4byte	.LASF1081
+	.4byte	.LASF1083
 	.byte	0x48
 	.2byte	0x23b
 	.4byte	0x6d
@@ -17767,37 +18116,37 @@ __exitcall_ebc_exit:
 	.byte	0x1b
 	.byte	0x54
 	.uleb128 0x1b
-	.4byte	.LASF1082
+	.4byte	.LASF1084
 	.byte	0x48
 	.2byte	0x241
-	.4byte	0x360f
+	.4byte	0x3625
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1083
+	.4byte	.LASF1085
 	.byte	0x48
 	.2byte	0x24a
-	.4byte	0x360f
+	.4byte	0x3625
 	.byte	0xa0
 	.byte	0
 	.uleb128 0x2e
 	.byte	0x4
 	.byte	0x48
 	.2byte	0x271
-	.4byte	0x44f7
+	.4byte	0x450d
 	.uleb128 0x1b
-	.4byte	.LASF675
+	.4byte	.LASF677
 	.byte	0x48
 	.2byte	0x272
 	.4byte	0x10b
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1084
+	.4byte	.LASF1086
 	.byte	0x48
 	.2byte	0x273
 	.4byte	0x10b
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF1085
+	.4byte	.LASF1087
 	.byte	0x48
 	.2byte	0x274
 	.4byte	0x10b
@@ -17810,16 +18159,16 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0
 	.uleb128 0x3c
-	.4byte	.LASF1087
+	.4byte	.LASF1089
 	.byte	0x4
 	.byte	0x48
 	.2byte	0x270
-	.4byte	0x4519
+	.4byte	0x452f
 	.uleb128 0x3d
 	.string	"b"
 	.byte	0x48
 	.2byte	0x278
-	.4byte	0x44b9
+	.4byte	0x44cf
 	.uleb128 0x3d
 	.string	"s"
 	.byte	0x48
@@ -17827,26 +18176,26 @@ __exitcall_ebc_exit:
 	.4byte	0x13a
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1088
+	.4byte	.LASF1090
 	.byte	0x8
 	.byte	0x48
 	.2byte	0x283
-	.4byte	0x4534
+	.4byte	0x454a
 	.uleb128 0x1b
 	.4byte	.LASF63
 	.byte	0x48
 	.2byte	0x284
-	.4byte	0x4534
+	.4byte	0x454a
 	.byte	0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4519
+	.4byte	0x452f
 	.uleb128 0x2e
 	.byte	0x8
 	.byte	0x48
 	.2byte	0x510
-	.4byte	0x4551
+	.4byte	0x4567
 	.uleb128 0x1b
 	.4byte	.LASF129
 	.byte	0x48
@@ -17862,9 +18211,9 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x48
 	.2byte	0x510
-	.4byte	0x4580
+	.4byte	0x4596
 	.uleb128 0x40
-	.4byte	.LASF1240
+	.4byte	.LASF1242
 	.byte	0x48
 	.2byte	0x510
 	.4byte	0x6d
@@ -17872,18 +18221,18 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x1f
 	.uleb128 0x41
-	.4byte	.LASF1089
+	.4byte	.LASF1091
 	.byte	0x48
 	.2byte	0x510
-	.4byte	0x453a
+	.4byte	0x4550
 	.uleb128 0x29
-	.4byte	0x4551
+	.4byte	0x4567
 	.byte	0
 	.uleb128 0x2e
 	.byte	0x8
 	.byte	0x48
 	.2byte	0x513
-	.4byte	0x4597
+	.4byte	0x45ad
 	.uleb128 0x1b
 	.4byte	.LASF130
 	.byte	0x48
@@ -17899,88 +18248,88 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x48
 	.2byte	0x513
-	.4byte	0x45c3
+	.4byte	0x45d9
 	.uleb128 0x41
-	.4byte	.LASF1090
+	.4byte	.LASF1092
 	.byte	0x48
 	.2byte	0x513
 	.4byte	0x6d
 	.uleb128 0x41
-	.4byte	.LASF1091
+	.4byte	.LASF1093
 	.byte	0x48
 	.2byte	0x513
-	.4byte	0x4580
+	.4byte	0x4596
 	.uleb128 0x29
-	.4byte	0x4597
+	.4byte	0x45ad
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF591
+	.4byte	.LASF593
 	.uleb128 0x3
-	.4byte	0x45c3
+	.4byte	0x45d9
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x45c8
+	.4byte	0x45de
 	.uleb128 0x24
-	.4byte	.LASF1092
+	.4byte	.LASF1094
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x45d3
+	.4byte	0x45e9
 	.uleb128 0x24
-	.4byte	.LASF1093
+	.4byte	.LASF1095
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x45de
+	.4byte	0x45f4
 	.uleb128 0x1a
-	.4byte	.LASF1094
+	.4byte	.LASF1096
 	.2byte	0x378
 	.byte	0x5a
 	.2byte	0x166
-	.4byte	0x460c
+	.4byte	0x4622
 	.uleb128 0x23
-	.4byte	0x56e9
+	.4byte	0x56ff
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1095
+	.4byte	.LASF1097
 	.byte	0x5a
 	.2byte	0x206
-	.4byte	0x5a11
+	.4byte	0x5a27
 	.2byte	0x378
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x45e9
+	.4byte	0x45ff
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x22fe
+	.4byte	0x2314
 	.uleb128 0x5
 	.4byte	0x3d6
-	.4byte	0x4628
+	.4byte	0x463e
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1096
+	.4byte	.LASF1098
 	.byte	0x20
 	.byte	0x69
 	.byte	0x1a
-	.4byte	0x464d
+	.4byte	0x4663
 	.uleb128 0xe
-	.4byte	.LASF1097
+	.4byte	.LASF1099
 	.byte	0x69
 	.byte	0x1b
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1098
+	.4byte	.LASF1100
 	.byte	0x69
 	.byte	0x1c
-	.4byte	0x1594
+	.4byte	0x15aa
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4628
+	.4byte	0x463e
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc6
@@ -17989,19 +18338,19 @@ __exitcall_ebc_exit:
 	.4byte	0x155
 	.uleb128 0x5
 	.4byte	0x392
-	.4byte	0x466f
+	.4byte	0x4685
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF666
+	.4byte	.LASF668
 	.byte	0xa8
 	.byte	0x6a
 	.byte	0x74
-	.4byte	0x47a2
+	.4byte	0x47b8
 	.uleb128 0xe
-	.4byte	.LASF577
+	.4byte	.LASF579
 	.byte	0x6a
 	.byte	0x75
 	.4byte	0x367
@@ -18010,203 +18359,193 @@ __exitcall_ebc_exit:
 	.string	"uid"
 	.byte	0x6a
 	.byte	0x7d
-	.4byte	0x23e5
+	.4byte	0x23fb
 	.byte	0x4
 	.uleb128 0x20
 	.string	"gid"
 	.byte	0x6a
 	.byte	0x7e
-	.4byte	0x2405
+	.4byte	0x241b
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1099
+	.4byte	.LASF1101
 	.byte	0x6a
 	.byte	0x7f
-	.4byte	0x23e5
+	.4byte	0x23fb
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF1100
+	.4byte	.LASF1102
 	.byte	0x6a
 	.byte	0x80
-	.4byte	0x2405
+	.4byte	0x241b
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1101
+	.4byte	.LASF1103
 	.byte	0x6a
 	.byte	0x81
-	.4byte	0x23e5
+	.4byte	0x23fb
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF1102
+	.4byte	.LASF1104
 	.byte	0x6a
 	.byte	0x82
-	.4byte	0x2405
+	.4byte	0x241b
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1103
+	.4byte	.LASF1105
 	.byte	0x6a
 	.byte	0x83
-	.4byte	0x23e5
+	.4byte	0x23fb
 	.byte	0x1c
 	.uleb128 0xe
-	.4byte	.LASF1104
+	.4byte	.LASF1106
 	.byte	0x6a
 	.byte	0x84
-	.4byte	0x2405
+	.4byte	0x241b
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1105
+	.4byte	.LASF1107
 	.byte	0x6a
 	.byte	0x85
 	.4byte	0x6d
 	.byte	0x24
 	.uleb128 0xe
-	.4byte	.LASF1106
+	.4byte	.LASF1108
 	.byte	0x6a
 	.byte	0x86
-	.4byte	0x5b20
+	.4byte	0x5b36
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1107
+	.4byte	.LASF1109
 	.byte	0x6a
 	.byte	0x87
-	.4byte	0x5b20
+	.4byte	0x5b36
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1108
+	.4byte	.LASF1110
 	.byte	0x6a
 	.byte	0x88
-	.4byte	0x5b20
+	.4byte	0x5b36
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF1109
+	.4byte	.LASF1111
 	.byte	0x6a
 	.byte	0x89
-	.4byte	0x5b20
+	.4byte	0x5b36
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF1110
+	.4byte	.LASF1112
 	.byte	0x6a
 	.byte	0x8a
-	.4byte	0x5b20
+	.4byte	0x5b36
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF1111
+	.4byte	.LASF1113
 	.byte	0x6a
 	.byte	0x8c
 	.4byte	0x96
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF955
+	.4byte	.LASF957
 	.byte	0x6a
 	.byte	0x8e
-	.4byte	0x874e
+	.4byte	0x8764
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF1112
+	.4byte	.LASF1114
 	.byte	0x6a
 	.byte	0x8f
-	.4byte	0x874e
+	.4byte	0x8764
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF1113
+	.4byte	.LASF1115
 	.byte	0x6a
 	.byte	0x90
-	.4byte	0x874e
+	.4byte	0x8764
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF1114
+	.4byte	.LASF1116
 	.byte	0x6a
 	.byte	0x91
-	.4byte	0x874e
+	.4byte	0x8764
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF744
+	.4byte	.LASF746
 	.byte	0x6a
 	.byte	0x94
 	.4byte	0x443
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF1115
+	.4byte	.LASF1117
 	.byte	0x6a
 	.byte	0x96
-	.4byte	0x3c2a
+	.4byte	0x3c40
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF1116
+	.4byte	.LASF1118
 	.byte	0x6a
 	.byte	0x97
-	.4byte	0x5a0b
+	.4byte	0x5a21
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF1117
+	.4byte	.LASF1119
 	.byte	0x6a
 	.byte	0x98
-	.4byte	0x9643
+	.4byte	0x9659
 	.byte	0x90
 	.uleb128 0x23
-	.4byte	0x9624
+	.4byte	0x963a
 	.byte	0x98
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x466f
+	.4byte	0x4685
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x47a2
+	.4byte	0x47b8
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x47bd
+	.4byte	0x47d3
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF668
-	.uleb128 0x7
-	.byte	0x8
-	.4byte	0x47bd
-	.uleb128 0x24
-	.4byte	.LASF1118
-	.uleb128 0x7
-	.byte	0x8
-	.4byte	0x47c8
-	.uleb128 0x24
-	.4byte	.LASF1119
+	.4byte	.LASF670
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x47d3
 	.uleb128 0x24
-	.4byte	.LASF672
+	.4byte	.LASF1120
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x47de
 	.uleb128 0x24
-	.4byte	.LASF1120
+	.4byte	.LASF1121
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x47e9
 	.uleb128 0x24
-	.4byte	.LASF1121
+	.4byte	.LASF674
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x47f4
 	.uleb128 0x24
-	.4byte	.LASF682
+	.4byte	.LASF1122
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x47ff
 	.uleb128 0x24
-	.4byte	.LASF1122
+	.4byte	.LASF1123
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x480a
 	.uleb128 0x24
-	.4byte	.LASF693
+	.4byte	.LASF684
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x4815
 	.uleb128 0x24
-	.4byte	.LASF1123
+	.4byte	.LASF1124
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x4820
@@ -18216,30 +18555,40 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.4byte	0x482b
 	.uleb128 0x24
-	.4byte	.LASF696
+	.4byte	.LASF1125
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x4836
-	.uleb128 0xd
+	.uleb128 0x24
 	.4byte	.LASF697
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4841
+	.uleb128 0x24
+	.4byte	.LASF698
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x484c
+	.uleb128 0xd
+	.4byte	.LASF699
 	.byte	0x78
 	.byte	0x6b
 	.byte	0x63
-	.4byte	0x48d2
+	.4byte	0x48e8
 	.uleb128 0xe
-	.4byte	.LASF1124
+	.4byte	.LASF1126
 	.byte	0x6b
 	.byte	0x64
 	.4byte	0x543
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1125
+	.4byte	.LASF1127
 	.byte	0x6b
 	.byte	0x65
 	.4byte	0x367
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1126
+	.4byte	.LASF1128
 	.byte	0x6b
 	.byte	0x66
 	.4byte	0x367
@@ -18251,144 +18600,144 @@ __exitcall_ebc_exit:
 	.4byte	0xe50
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1127
+	.4byte	.LASF1129
 	.byte	0x6b
 	.byte	0x6b
 	.4byte	0xb4
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF1128
+	.4byte	.LASF1130
 	.byte	0x6b
 	.byte	0x70
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1129
+	.4byte	.LASF1131
 	.byte	0x6b
 	.byte	0x71
 	.4byte	0x29
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1130
+	.4byte	.LASF1132
 	.byte	0x6b
 	.byte	0x73
-	.4byte	0x4dae
+	.4byte	0x4dc4
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1131
+	.4byte	.LASF1133
 	.byte	0x6b
 	.byte	0x74
-	.4byte	0x5e1e
+	.4byte	0x5e34
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF1132
+	.4byte	.LASF1134
 	.byte	0x6b
 	.byte	0x75
 	.4byte	0x3bd
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF1133
+	.4byte	.LASF1135
 	.byte	0x6b
 	.byte	0x77
-	.4byte	0x31e0
+	.4byte	0x31f6
 	.byte	0x48
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4841
+	.4byte	0x4857
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3b5e
+	.4byte	0x3b74
 	.uleb128 0x24
-	.4byte	.LASF1134
+	.4byte	.LASF1136
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x48de
+	.4byte	0x48f4
 	.uleb128 0x24
-	.4byte	.LASF1135
+	.4byte	.LASF1137
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x48e9
+	.4byte	0x48ff
 	.uleb128 0x24
-	.4byte	.LASF1136
+	.4byte	.LASF1138
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x48f4
+	.4byte	0x490a
 	.uleb128 0x24
-	.4byte	.LASF1137
+	.4byte	.LASF1139
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x48ff
+	.4byte	0x4915
 	.uleb128 0x5
-	.4byte	0x491a
-	.4byte	0x491a
+	.4byte	0x4930
+	.4byte	0x4930
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4920
+	.4byte	0x4936
 	.uleb128 0x24
-	.4byte	.LASF1138
+	.4byte	.LASF1140
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3ed8
+	.4byte	0x3eee
 	.uleb128 0x24
-	.4byte	.LASF1139
+	.4byte	.LASF1141
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x492b
+	.4byte	0x4941
 	.uleb128 0x24
-	.4byte	.LASF1140
+	.4byte	.LASF1142
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4936
+	.4byte	0x494c
 	.uleb128 0x24
-	.4byte	.LASF844
+	.4byte	.LASF846
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4941
+	.4byte	0x4957
 	.uleb128 0x24
-	.4byte	.LASF1141
+	.4byte	.LASF1143
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x494c
+	.4byte	0x4962
 	.uleb128 0xd
-	.4byte	.LASF1142
+	.4byte	.LASF1144
 	.byte	0x40
 	.byte	0x6c
 	.byte	0x4a
-	.4byte	0x49a6
+	.4byte	0x49bc
 	.uleb128 0xe
-	.4byte	.LASF575
+	.4byte	.LASF577
 	.byte	0x6c
 	.byte	0x4b
-	.4byte	0x4e68
+	.4byte	0x4e7e
 	.byte	0
 	.uleb128 0x23
-	.4byte	0x4ed3
+	.4byte	0x4ee9
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1143
+	.4byte	.LASF1145
 	.byte	0x6c
 	.byte	0x59
-	.4byte	0x4eeb
+	.4byte	0x4f01
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1144
+	.4byte	.LASF1146
 	.byte	0x6c
 	.byte	0x5a
 	.4byte	0x29
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1145
+	.4byte	.LASF1147
 	.byte	0x6c
 	.byte	0x5c
-	.4byte	0x4f46
+	.4byte	0x4f5c
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1059
+	.4byte	.LASF1061
 	.byte	0x6c
 	.byte	0x5d
 	.4byte	0x6d
@@ -18396,27 +18745,27 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4957
+	.4byte	0x496d
 	.uleb128 0xd
-	.4byte	.LASF1146
+	.4byte	.LASF1148
 	.byte	0x40
 	.byte	0x6d
 	.byte	0x22
-	.4byte	0x4a19
+	.4byte	0x4a2f
 	.uleb128 0xe
 	.4byte	.LASF63
 	.byte	0x6d
 	.byte	0x23
-	.4byte	0x4a19
+	.4byte	0x4a2f
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1147
+	.4byte	.LASF1149
 	.byte	0x6d
 	.byte	0x24
 	.4byte	0x443
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0x6d
 	.byte	0x25
 	.4byte	0x29
@@ -18428,105 +18777,105 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1148
+	.4byte	.LASF1150
 	.byte	0x6d
 	.byte	0x27
-	.4byte	0x5a2c
+	.4byte	0x5a42
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1149
+	.4byte	.LASF1151
 	.byte	0x6d
 	.byte	0x28
 	.4byte	0x6d
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1150
+	.4byte	.LASF1152
 	.byte	0x6d
 	.byte	0x29
 	.4byte	0x331
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1151
+	.4byte	.LASF1153
 	.byte	0x6d
 	.byte	0x2a
-	.4byte	0x3091
+	.4byte	0x30a7
 	.byte	0x38
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x49ac
+	.4byte	0x49c2
 	.uleb128 0x15
-	.4byte	.LASF1152
+	.4byte	.LASF1154
 	.byte	0x48
 	.2byte	0x5d0
-	.4byte	0x4612
+	.4byte	0x4628
 	.uleb128 0x42
-	.4byte	.LASF1153
+	.4byte	.LASF1155
 	.2byte	0x4000
 	.byte	0x48
 	.2byte	0x68b
-	.4byte	0x4a52
+	.4byte	0x4a68
 	.uleb128 0x41
-	.4byte	.LASF756
+	.4byte	.LASF758
 	.byte	0x48
 	.2byte	0x68d
-	.4byte	0x247c
+	.4byte	0x2492
 	.uleb128 0x41
-	.4byte	.LASF576
+	.4byte	.LASF578
 	.byte	0x48
 	.2byte	0x692
-	.4byte	0x4a52
+	.4byte	0x4a68
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0x4a63
+	.4byte	0x4a79
 	.uleb128 0x43
 	.4byte	0x4f
 	.2byte	0x7ff
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF1154
+	.4byte	.LASF1156
 	.byte	0x48
 	.2byte	0x699
-	.4byte	0x4a52
+	.4byte	0x4a68
 	.uleb128 0xd
-	.4byte	.LASF1155
+	.4byte	.LASF1157
 	.byte	0x88
 	.byte	0x6e
 	.byte	0x18
-	.4byte	0x4b48
+	.4byte	0x4b5e
 	.uleb128 0xe
-	.4byte	.LASF1156
+	.4byte	.LASF1158
 	.byte	0x6e
 	.byte	0x19
 	.4byte	0x13a
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF901
+	.4byte	.LASF903
 	.byte	0x6e
 	.byte	0x1a
 	.4byte	0x27a
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1157
+	.4byte	.LASF1159
 	.byte	0x6e
 	.byte	0x1b
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1158
+	.4byte	.LASF1160
 	.byte	0x6e
 	.byte	0x1c
 	.4byte	0x2ef
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF1159
+	.4byte	.LASF1161
 	.byte	0x6e
 	.byte	0x1d
 	.4byte	0x155
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1160
+	.4byte	.LASF1162
 	.byte	0x6e
 	.byte	0x1e
 	.4byte	0x155
@@ -18544,7 +18893,7 @@ __exitcall_ebc_exit:
 	.4byte	0x26f
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1161
+	.4byte	.LASF1163
 	.byte	0x6e
 	.byte	0x29
 	.4byte	0x26f
@@ -18553,59 +18902,59 @@ __exitcall_ebc_exit:
 	.string	"uid"
 	.byte	0x6e
 	.byte	0x2a
-	.4byte	0x23e5
+	.4byte	0x23fb
 	.byte	0x30
 	.uleb128 0x20
 	.string	"gid"
 	.byte	0x6e
 	.byte	0x2b
-	.4byte	0x2405
+	.4byte	0x241b
 	.byte	0x34
 	.uleb128 0xe
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0x6e
 	.byte	0x2c
 	.4byte	0x2c3
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF1162
+	.4byte	.LASF1164
 	.byte	0x6e
 	.byte	0x2d
 	.4byte	0xa12
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF1163
+	.4byte	.LASF1165
 	.byte	0x6e
 	.byte	0x2e
 	.4byte	0xa12
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF1164
+	.4byte	.LASF1166
 	.byte	0x6e
 	.byte	0x2f
 	.4byte	0xa12
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF1165
+	.4byte	.LASF1167
 	.byte	0x6e
 	.byte	0x30
 	.4byte	0xa12
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF1166
+	.4byte	.LASF1168
 	.byte	0x6e
 	.byte	0x31
 	.4byte	0x155
 	.byte	0x80
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1167
+	.4byte	.LASF1169
 	.byte	0x20
 	.byte	0x6f
 	.byte	0xc
-	.4byte	0x4b91
+	.4byte	0x4ba7
 	.uleb128 0xe
-	.4byte	.LASF1168
+	.4byte	.LASF1170
 	.byte	0x6f
 	.byte	0xd
 	.4byte	0x31b
@@ -18617,50 +18966,50 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1169
+	.4byte	.LASF1171
 	.byte	0x6f
 	.byte	0x17
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1170
+	.4byte	.LASF1172
 	.byte	0x6f
 	.byte	0x1e
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1171
+	.4byte	.LASF1173
 	.byte	0x6f
 	.byte	0x21
-	.4byte	0x4946
+	.4byte	0x495c
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1172
+	.4byte	.LASF1174
 	.byte	0x40
 	.byte	0x6f
 	.byte	0x3c
-	.4byte	0x4bfd
+	.4byte	0x4c13
 	.uleb128 0xe
-	.4byte	.LASF1173
+	.4byte	.LASF1175
 	.byte	0x6f
 	.byte	0x3d
-	.4byte	0x4c1d
+	.4byte	0x4c33
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1174
+	.4byte	.LASF1176
 	.byte	0x6f
 	.byte	0x3f
-	.4byte	0x4c1d
+	.4byte	0x4c33
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1175
+	.4byte	.LASF1177
 	.byte	0x6f
 	.byte	0x42
 	.4byte	0x194
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1176
+	.4byte	.LASF1178
 	.byte	0x6f
 	.byte	0x43
 	.4byte	0xc6
@@ -18672,7 +19021,7 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0x1c
 	.uleb128 0xe
-	.4byte	.LASF959
+	.4byte	.LASF961
 	.byte	0x6f
 	.byte	0x47
 	.4byte	0x392
@@ -18684,57 +19033,57 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1177
+	.4byte	.LASF1179
 	.byte	0x6f
 	.byte	0x4d
-	.4byte	0x4c23
+	.4byte	0x4c39
 	.byte	0x38
 	.byte	0
 	.uleb128 0x14
 	.4byte	0x29
-	.4byte	0x4c11
+	.4byte	0x4c27
 	.uleb128 0x11
-	.4byte	0x4c11
+	.4byte	0x4c27
 	.uleb128 0x11
-	.4byte	0x4c17
+	.4byte	0x4c2d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4b91
+	.4byte	0x4ba7
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4b48
+	.4byte	0x4b5e
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4bfd
+	.4byte	0x4c13
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x543
 	.uleb128 0xd
-	.4byte	.LASF1178
+	.4byte	.LASF1180
 	.byte	0x18
 	.byte	0x70
 	.byte	0x1c
-	.4byte	0x4c4e
+	.4byte	0x4c64
 	.uleb128 0xe
-	.4byte	.LASF959
+	.4byte	.LASF961
 	.byte	0x70
 	.byte	0x1d
 	.4byte	0x392
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1179
+	.4byte	.LASF1181
 	.byte	0x70
 	.byte	0x1f
 	.4byte	0x194
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1180
+	.4byte	.LASF1182
 	.byte	0x10
 	.byte	0x70
 	.byte	0x22
-	.4byte	0x4c73
+	.4byte	0x4c89
 	.uleb128 0x20
 	.string	"rcu"
 	.byte	0x70
@@ -18745,24 +19094,24 @@ __exitcall_ebc_exit:
 	.string	"lru"
 	.byte	0x70
 	.byte	0x25
-	.4byte	0x4c73
+	.4byte	0x4c89
 	.byte	0x10
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x4c82
-	.4byte	0x4c82
+	.4byte	0x4c98
+	.4byte	0x4c98
 	.uleb128 0x44
 	.4byte	0x4f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4c29
+	.4byte	0x4c3f
 	.uleb128 0xd
-	.4byte	.LASF1181
+	.4byte	.LASF1183
 	.byte	0x40
 	.byte	0x70
 	.byte	0x28
-	.4byte	0x4cc5
+	.4byte	0x4cdb
 	.uleb128 0xe
 	.4byte	.LASF115
 	.byte	0x70
@@ -18773,16 +19122,16 @@ __exitcall_ebc_exit:
 	.string	"lru"
 	.byte	0x70
 	.byte	0x2c
-	.4byte	0x4c29
+	.4byte	0x4c3f
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1182
+	.4byte	.LASF1184
 	.byte	0x70
 	.byte	0x2f
-	.4byte	0x4cc5
+	.4byte	0x4cdb
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1179
+	.4byte	.LASF1181
 	.byte	0x70
 	.byte	0x31
 	.4byte	0x194
@@ -18790,33 +19139,33 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4c4e
+	.4byte	0x4c64
 	.uleb128 0xd
-	.4byte	.LASF1183
+	.4byte	.LASF1185
 	.byte	0x20
 	.byte	0x70
 	.byte	0x34
-	.4byte	0x4d08
+	.4byte	0x4d1e
 	.uleb128 0xe
-	.4byte	.LASF865
+	.4byte	.LASF867
 	.byte	0x70
 	.byte	0x35
-	.4byte	0x4d08
+	.4byte	0x4d1e
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF959
+	.4byte	.LASF961
 	.byte	0x70
 	.byte	0x37
 	.4byte	0x392
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1184
+	.4byte	.LASF1186
 	.byte	0x70
 	.byte	0x38
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1185
+	.4byte	.LASF1187
 	.byte	0x70
 	.byte	0x39
 	.4byte	0x29b
@@ -18824,7 +19173,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4c88
+	.4byte	0x4c9e
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xe50
@@ -18832,9 +19181,9 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x71
 	.byte	0x63
-	.4byte	0x4d33
+	.4byte	0x4d49
 	.uleb128 0x22
-	.4byte	.LASF1186
+	.4byte	.LASF1188
 	.byte	0x71
 	.byte	0x64
 	.4byte	0x392
@@ -18845,11 +19194,11 @@ __exitcall_ebc_exit:
 	.4byte	0x407
 	.byte	0
 	.uleb128 0x26
-	.4byte	.LASF1187
+	.4byte	.LASF1189
 	.2byte	0x240
 	.byte	0x71
 	.byte	0x5c
-	.4byte	0x4da8
+	.4byte	0x4dbe
 	.uleb128 0xe
 	.4byte	.LASF260
 	.byte	0x71
@@ -18857,92 +19206,92 @@ __exitcall_ebc_exit:
 	.4byte	0x96
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF881
+	.4byte	.LASF883
 	.byte	0x71
 	.byte	0x5e
 	.4byte	0x96
 	.byte	0x1
 	.uleb128 0xe
-	.4byte	.LASF380
+	.4byte	.LASF382
 	.byte	0x71
 	.byte	0x5f
 	.4byte	0x96
 	.byte	0x2
 	.uleb128 0xe
-	.4byte	.LASF1188
+	.4byte	.LASF1190
 	.byte	0x71
 	.byte	0x60
 	.4byte	0x96
 	.byte	0x3
 	.uleb128 0xe
-	.4byte	.LASF637
+	.4byte	.LASF639
 	.byte	0x71
 	.byte	0x61
-	.4byte	0x4da8
+	.4byte	0x4dbe
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1189
+	.4byte	.LASF1191
 	.byte	0x71
 	.byte	0x62
-	.4byte	0x4ddf
+	.4byte	0x4df5
 	.byte	0x10
 	.uleb128 0x23
-	.4byte	0x4d14
+	.4byte	0x4d2a
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1190
+	.4byte	.LASF1192
 	.byte	0x71
 	.byte	0x67
-	.4byte	0x4de5
+	.4byte	0x4dfb
 	.byte	0x28
 	.uleb128 0x27
-	.4byte	.LASF1191
+	.4byte	.LASF1193
 	.byte	0x71
 	.byte	0x68
-	.4byte	0x4df5
+	.4byte	0x4e0b
 	.2byte	0x228
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4d33
+	.4byte	0x4d49
 	.uleb128 0xd
-	.4byte	.LASF1192
+	.4byte	.LASF1194
 	.byte	0x10
 	.byte	0x71
 	.byte	0x70
-	.4byte	0x4ddf
+	.4byte	0x4df5
 	.uleb128 0xe
-	.4byte	.LASF1193
+	.4byte	.LASF1195
 	.byte	0x71
 	.byte	0x71
 	.4byte	0xe50
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1168
+	.4byte	.LASF1170
 	.byte	0x71
 	.byte	0x72
 	.4byte	0x31b
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1194
+	.4byte	.LASF1196
 	.byte	0x71
 	.byte	0x73
-	.4byte	0x4da8
+	.4byte	0x4dbe
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4dae
+	.4byte	0x4dc4
 	.uleb128 0x5
 	.4byte	0x443
-	.4byte	0x4df5
+	.4byte	0x4e0b
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3f
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0x4e0b
+	.4byte	0x4e21
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
@@ -18951,19 +19300,19 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1195
+	.4byte	.LASF1197
 	.byte	0x30
 	.byte	0x72
 	.byte	0x1e
-	.4byte	0x4e60
+	.4byte	0x4e76
 	.uleb128 0xe
-	.4byte	.LASF380
+	.4byte	.LASF382
 	.byte	0x72
 	.byte	0x1f
 	.4byte	0x543
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF573
+	.4byte	.LASF575
 	.byte	0x72
 	.byte	0x20
 	.4byte	0x392
@@ -18978,59 +19327,59 @@ __exitcall_ebc_exit:
 	.string	"osq"
 	.byte	0x72
 	.byte	0x23
-	.4byte	0x2410
+	.4byte	0x2426
 	.byte	0x1c
 	.uleb128 0xe
 	.4byte	.LASF97
 	.byte	0x72
 	.byte	0x28
-	.4byte	0x2eda
+	.4byte	0x2ef0
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1196
+	.4byte	.LASF1198
 	.byte	0x72
 	.byte	0x31
 	.4byte	0x194
 	.byte	0x28
 	.byte	0
 	.uleb128 0x3a
-	.4byte	.LASF1197
+	.4byte	.LASF1199
 	.byte	0
 	.byte	0x73
 	.byte	0x18
 	.uleb128 0x1f
-	.4byte	.LASF1198
+	.4byte	.LASF1200
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x6c
 	.byte	0x40
-	.4byte	0x4e91
+	.4byte	0x4ea7
 	.uleb128 0xc
-	.4byte	.LASF1199
+	.4byte	.LASF1201
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1200
+	.4byte	.LASF1202
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1201
+	.4byte	.LASF1203
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF1202
+	.4byte	.LASF1204
 	.byte	0x3
 	.byte	0
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x6c
 	.byte	0x4e
-	.4byte	0x4eb2
+	.4byte	0x4ec8
 	.uleb128 0xe
-	.4byte	.LASF1203
+	.4byte	.LASF1205
 	.byte	0x6c
 	.byte	0x4f
-	.4byte	0x4e60
+	.4byte	0x4e76
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1204
+	.4byte	.LASF1206
 	.byte	0x6c
 	.byte	0x50
 	.4byte	0x29
@@ -19040,15 +19389,15 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0x6c
 	.byte	0x53
-	.4byte	0x4ed3
+	.4byte	0x4ee9
 	.uleb128 0xe
-	.4byte	.LASF1205
+	.4byte	.LASF1207
 	.byte	0x6c
 	.byte	0x54
 	.4byte	0x407
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1206
+	.4byte	.LASF1208
 	.byte	0x6c
 	.byte	0x55
 	.4byte	0x29
@@ -19058,28 +19407,28 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0x6c
 	.byte	0x4d
-	.4byte	0x4ee6
+	.4byte	0x4efc
 	.uleb128 0x29
-	.4byte	0x4e91
+	.4byte	0x4ea7
 	.uleb128 0x29
-	.4byte	0x4eb2
+	.4byte	0x4ec8
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1207
+	.4byte	.LASF1209
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4ee6
+	.4byte	0x4efc
 	.uleb128 0xd
-	.4byte	.LASF1208
+	.4byte	.LASF1210
 	.byte	0x30
 	.byte	0x6c
 	.byte	0x60
-	.4byte	0x4f46
+	.4byte	0x4f5c
 	.uleb128 0xe
-	.4byte	.LASF1207
+	.4byte	.LASF1209
 	.byte	0x6c
 	.byte	0x61
-	.4byte	0x4eeb
+	.4byte	0x4f01
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF70
@@ -19088,19 +19437,19 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF576
+	.4byte	.LASF578
 	.byte	0x6c
 	.byte	0x63
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1209
+	.4byte	.LASF1211
 	.byte	0x6c
 	.byte	0x64
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1210
+	.4byte	.LASF1212
 	.byte	0x6c
 	.byte	0x65
 	.4byte	0x29b
@@ -19109,35 +19458,35 @@ __exitcall_ebc_exit:
 	.4byte	.LASF63
 	.byte	0x6c
 	.byte	0x67
-	.4byte	0x4f46
+	.4byte	0x4f5c
 	.byte	0x28
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4ef1
+	.4byte	0x4f07
 	.uleb128 0xd
-	.4byte	.LASF1211
+	.4byte	.LASF1213
 	.byte	0x8
 	.byte	0x6c
 	.byte	0x72
-	.4byte	0x4f65
+	.4byte	0x4f7b
 	.uleb128 0xe
-	.4byte	.LASF1212
+	.4byte	.LASF1214
 	.byte	0x6c
 	.byte	0x73
-	.4byte	0x4f6a
+	.4byte	0x4f80
 	.byte	0
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1212
+	.4byte	.LASF1214
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4f65
+	.4byte	0x4f7b
 	.uleb128 0xf
 	.byte	0x18
 	.byte	0x74
 	.byte	0x1c
-	.4byte	0x4f9c
+	.4byte	0x4fb2
 	.uleb128 0x20
 	.string	"id"
 	.byte	0x74
@@ -19145,7 +19494,7 @@ __exitcall_ebc_exit:
 	.4byte	0x387
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1213
+	.4byte	.LASF1215
 	.byte	0x74
 	.byte	0x1e
 	.4byte	0x443
@@ -19158,23 +19507,23 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1214
+	.4byte	.LASF1216
 	.byte	0x74
 	.byte	0x20
-	.4byte	0x4f70
+	.4byte	0x4f86
 	.uleb128 0x8
-	.4byte	.LASF1215
+	.4byte	.LASF1217
 	.byte	0x74
 	.byte	0x2f
 	.4byte	0x4a2
 	.uleb128 0xd
-	.4byte	.LASF1216
+	.4byte	.LASF1218
 	.byte	0x10
 	.byte	0x74
 	.byte	0x31
-	.4byte	0x4fd6
+	.4byte	0x4fec
 	.uleb128 0xe
-	.4byte	.LASF1217
+	.4byte	.LASF1219
 	.byte	0x74
 	.byte	0x32
 	.4byte	0xc6
@@ -19183,31 +19532,31 @@ __exitcall_ebc_exit:
 	.string	"fn"
 	.byte	0x74
 	.byte	0x33
-	.4byte	0x4fa7
+	.4byte	0x4fbd
 	.byte	0x8
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1218
+	.4byte	.LASF1220
 	.byte	0x74
 	.byte	0x38
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF1219
+	.4byte	.LASF1221
 	.byte	0x74
 	.byte	0x38
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF1220
+	.4byte	.LASF1222
 	.byte	0x74
 	.byte	0x39
 	.4byte	0x367
 	.uleb128 0x19
-	.4byte	.LASF1216
+	.4byte	.LASF1218
 	.byte	0x74
 	.byte	0x3d
-	.4byte	0x4fb2
+	.4byte	0x4fc8
 	.uleb128 0x8
-	.4byte	.LASF1221
+	.4byte	.LASF1223
 	.byte	0x5a
 	.byte	0x1a
 	.4byte	0xc6
@@ -19215,7 +19564,7 @@ __exitcall_ebc_exit:
 	.byte	0x28
 	.byte	0x5a
 	.byte	0x51
-	.4byte	0x5046
+	.4byte	0x505c
 	.uleb128 0x20
 	.string	"lru"
 	.byte	0x5a
@@ -19223,83 +19572,83 @@ __exitcall_ebc_exit:
 	.4byte	0x392
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1222
+	.4byte	.LASF1224
 	.byte	0x5a
 	.byte	0x59
-	.4byte	0x514b
+	.4byte	0x5161
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF877
+	.4byte	.LASF879
 	.byte	0x5a
 	.byte	0x5a
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF357
+	.4byte	.LASF359
 	.byte	0x5a
 	.byte	0x61
 	.4byte	0x29
 	.byte	0x20
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1223
+	.4byte	.LASF1225
 	.byte	0xd0
 	.byte	0x1f
 	.2byte	0x1a7
-	.4byte	0x514b
+	.4byte	0x5161
 	.uleb128 0x1b
-	.4byte	.LASF1224
+	.4byte	.LASF1226
 	.byte	0x1f
 	.2byte	0x1a8
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1225
+	.4byte	.LASF1227
 	.byte	0x1f
 	.2byte	0x1a9
-	.4byte	0x4dae
+	.4byte	0x4dc4
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1226
+	.4byte	.LASF1228
 	.byte	0x1f
 	.2byte	0x1aa
 	.4byte	0x367
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1227
+	.4byte	.LASF1229
 	.byte	0x1f
 	.2byte	0x1ab
-	.4byte	0x3507
+	.4byte	0x351d
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1228
+	.4byte	.LASF1230
 	.byte	0x1f
 	.2byte	0x1ac
-	.4byte	0x4e0b
+	.4byte	0x4e21
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1229
+	.4byte	.LASF1231
 	.byte	0x1f
 	.2byte	0x1ae
 	.4byte	0x29
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1230
+	.4byte	.LASF1232
 	.byte	0x1f
 	.2byte	0x1b0
 	.4byte	0x29
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1231
+	.4byte	.LASF1233
 	.byte	0x1f
 	.2byte	0x1b1
 	.4byte	0x29
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1232
+	.4byte	.LASF1234
 	.byte	0x1f
 	.2byte	0x1b2
-	.4byte	0x79e8
+	.4byte	0x79fe
 	.byte	0x78
 	.uleb128 0x1b
 	.4byte	.LASF170
@@ -19308,34 +19657,34 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1233
+	.4byte	.LASF1235
 	.byte	0x1f
 	.2byte	0x1b4
 	.4byte	0xe50
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF1168
+	.4byte	.LASF1170
 	.byte	0x1f
 	.2byte	0x1b5
 	.4byte	0x31b
 	.byte	0x8c
 	.uleb128 0x1b
-	.4byte	.LASF1186
+	.4byte	.LASF1188
 	.byte	0x1f
 	.2byte	0x1b6
 	.4byte	0x392
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1234
+	.4byte	.LASF1236
 	.byte	0x1f
 	.2byte	0x1b7
 	.4byte	0x443
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF1235
+	.4byte	.LASF1237
 	.byte	0x1f
 	.2byte	0x1b8
-	.4byte	0x5d9a
+	.4byte	0x5db0
 	.byte	0xa8
 	.uleb128 0x1b
 	.4byte	.LASF129
@@ -19364,26 +19713,26 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5046
+	.4byte	0x505c
 	.uleb128 0xf
 	.byte	0x10
 	.byte	0x5a
 	.byte	0x66
-	.4byte	0x517e
+	.4byte	0x5194
 	.uleb128 0xe
 	.4byte	.LASF63
 	.byte	0x5a
 	.byte	0x67
-	.4byte	0x343e
+	.4byte	0x3454
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1148
+	.4byte	.LASF1150
 	.byte	0x5a
 	.byte	0x69
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1236
+	.4byte	.LASF1238
 	.byte	0x5a
 	.byte	0x6a
 	.4byte	0xc6
@@ -19393,22 +19742,22 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x5a
 	.byte	0x64
-	.4byte	0x5197
+	.4byte	0x51ad
 	.uleb128 0x22
-	.4byte	.LASF1237
+	.4byte	.LASF1239
 	.byte	0x5a
 	.byte	0x65
 	.4byte	0x392
 	.uleb128 0x29
-	.4byte	0x5151
+	.4byte	0x5167
 	.byte	0
 	.uleb128 0xf
 	.byte	0x4
 	.byte	0x5a
 	.byte	0x77
-	.4byte	0x51cd
+	.4byte	0x51e3
 	.uleb128 0x38
-	.4byte	.LASF1238
+	.4byte	.LASF1240
 	.byte	0x5a
 	.byte	0x78
 	.4byte	0x6d
@@ -19417,7 +19766,7 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0
 	.uleb128 0x38
-	.4byte	.LASF1239
+	.4byte	.LASF1241
 	.byte	0x5a
 	.byte	0x79
 	.4byte	0x6d
@@ -19426,7 +19775,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0
 	.uleb128 0x38
-	.4byte	.LASF1240
+	.4byte	.LASF1242
 	.byte	0x5a
 	.byte	0x7a
 	.4byte	0x6d
@@ -19439,74 +19788,74 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x5a
 	.byte	0x74
-	.4byte	0x51f1
+	.4byte	0x5207
 	.uleb128 0x22
-	.4byte	.LASF1241
+	.4byte	.LASF1243
 	.byte	0x5a
 	.byte	0x75
 	.4byte	0x443
 	.uleb128 0x22
-	.4byte	.LASF1242
+	.4byte	.LASF1244
 	.byte	0x5a
 	.byte	0x76
 	.4byte	0x29
 	.uleb128 0x29
-	.4byte	0x5197
+	.4byte	0x51ad
 	.byte	0
 	.uleb128 0xf
 	.byte	0x28
 	.byte	0x5a
 	.byte	0x63
-	.4byte	0x521e
+	.4byte	0x5234
 	.uleb128 0x23
-	.4byte	0x517e
+	.4byte	0x5194
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1243
+	.4byte	.LASF1245
 	.byte	0x5a
 	.byte	0x71
-	.4byte	0x5223
+	.4byte	0x5239
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1244
+	.4byte	.LASF1246
 	.byte	0x5a
 	.byte	0x73
 	.4byte	0x443
 	.byte	0x18
 	.uleb128 0x23
-	.4byte	0x51cd
+	.4byte	0x51e3
 	.byte	0x20
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1245
+	.4byte	.LASF1247
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x521e
+	.4byte	0x5234
 	.uleb128 0xf
 	.byte	0x10
 	.byte	0x5a
 	.byte	0x7e
-	.4byte	0x5262
+	.4byte	0x5278
 	.uleb128 0xe
-	.4byte	.LASF1246
+	.4byte	.LASF1248
 	.byte	0x5a
 	.byte	0x7f
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1247
+	.4byte	.LASF1249
 	.byte	0x5a
 	.byte	0x82
 	.4byte	0x96
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1248
+	.4byte	.LASF1250
 	.byte	0x5a
 	.byte	0x83
 	.4byte	0x96
 	.byte	0x9
 	.uleb128 0xe
-	.4byte	.LASF1249
+	.4byte	.LASF1251
 	.byte	0x5a
 	.byte	0x84
 	.4byte	0x367
@@ -19516,21 +19865,21 @@ __exitcall_ebc_exit:
 	.byte	0x20
 	.byte	0x5a
 	.byte	0x86
-	.4byte	0x528f
+	.4byte	0x52a5
 	.uleb128 0xe
-	.4byte	.LASF1250
+	.4byte	.LASF1252
 	.byte	0x5a
 	.byte	0x87
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1251
+	.4byte	.LASF1253
 	.byte	0x5a
 	.byte	0x88
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1252
+	.4byte	.LASF1254
 	.byte	0x5a
 	.byte	0x89
 	.4byte	0x392
@@ -19540,14 +19889,14 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x5a
 	.byte	0x8f
-	.4byte	0x52ae
+	.4byte	0x52c4
 	.uleb128 0x22
-	.4byte	.LASF1253
+	.4byte	.LASF1255
 	.byte	0x5a
 	.byte	0x90
-	.4byte	0x460c
+	.4byte	0x4622
 	.uleb128 0x22
-	.4byte	.LASF1254
+	.4byte	.LASF1256
 	.byte	0x5a
 	.byte	0x91
 	.4byte	0x367
@@ -19556,27 +19905,27 @@ __exitcall_ebc_exit:
 	.byte	0x28
 	.byte	0x5a
 	.byte	0x8b
-	.4byte	0x52ed
+	.4byte	0x5303
 	.uleb128 0xe
-	.4byte	.LASF1255
+	.4byte	.LASF1257
 	.byte	0x5a
 	.byte	0x8c
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1256
+	.4byte	.LASF1258
 	.byte	0x5a
 	.byte	0x8d
-	.4byte	0x3433
+	.4byte	0x3449
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1257
+	.4byte	.LASF1259
 	.byte	0x5a
 	.byte	0x8e
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0x23
-	.4byte	0x528f
+	.4byte	0x52a5
 	.byte	0x18
 	.uleb128 0x20
 	.string	"ptl"
@@ -19589,52 +19938,52 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0x5a
 	.byte	0x99
-	.4byte	0x531a
+	.4byte	0x5330
 	.uleb128 0xe
-	.4byte	.LASF1258
+	.4byte	.LASF1260
 	.byte	0x5a
 	.byte	0x9b
-	.4byte	0x539f
+	.4byte	0x53b5
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1259
+	.4byte	.LASF1261
 	.byte	0x5a
 	.byte	0x9c
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1260
+	.4byte	.LASF1262
 	.byte	0x5a
 	.byte	0x9d
 	.4byte	0x29
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1261
+	.4byte	.LASF1263
 	.byte	0xc8
 	.byte	0x75
 	.byte	0x72
-	.4byte	0x539f
+	.4byte	0x53b5
 	.uleb128 0xe
-	.4byte	.LASF1262
+	.4byte	.LASF1264
 	.byte	0x75
 	.byte	0x73
-	.4byte	0xc853
+	.4byte	0xc869
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1263
+	.4byte	.LASF1265
 	.byte	0x75
 	.byte	0x74
-	.4byte	0xc893
+	.4byte	0xc8a9
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1264
+	.4byte	.LASF1266
 	.byte	0x75
 	.byte	0x75
-	.4byte	0xc7e7
+	.4byte	0xc7fd
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1265
+	.4byte	.LASF1267
 	.byte	0x75
 	.byte	0x76
 	.4byte	0x29b
@@ -19643,28 +19992,28 @@ __exitcall_ebc_exit:
 	.string	"res"
 	.byte	0x75
 	.byte	0x77
-	.4byte	0x9721
+	.4byte	0x9737
 	.byte	0x40
 	.uleb128 0x20
 	.string	"ref"
 	.byte	0x75
 	.byte	0x78
-	.4byte	0xc66e
+	.4byte	0xc684
 	.byte	0xa0
 	.uleb128 0xe
-	.4byte	.LASF1266
+	.4byte	.LASF1268
 	.byte	0x75
 	.byte	0x79
-	.4byte	0xc8b4
+	.4byte	0xc8ca
 	.byte	0xa8
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x75
 	.byte	0x7a
-	.4byte	0xa545
+	.4byte	0xa55b
 	.byte	0xb0
 	.uleb128 0xe
-	.4byte	.LASF791
+	.4byte	.LASF793
 	.byte	0x75
 	.byte	0x7b
 	.4byte	0x443
@@ -19673,29 +20022,29 @@ __exitcall_ebc_exit:
 	.4byte	.LASF192
 	.byte	0x75
 	.byte	0x7c
-	.4byte	0xc830
+	.4byte	0xc846
 	.byte	0xc0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x531a
+	.4byte	0x5330
 	.uleb128 0x21
 	.byte	0x28
 	.byte	0x5a
 	.byte	0x50
-	.4byte	0x53d7
+	.4byte	0x53ed
 	.uleb128 0x29
-	.4byte	0x500d
+	.4byte	0x5023
 	.uleb128 0x29
-	.4byte	0x51f1
+	.4byte	0x5207
 	.uleb128 0x29
-	.4byte	0x5229
+	.4byte	0x523f
 	.uleb128 0x29
-	.4byte	0x5262
+	.4byte	0x5278
 	.uleb128 0x29
-	.4byte	0x52ae
+	.4byte	0x52c4
 	.uleb128 0x29
-	.4byte	0x52ed
+	.4byte	0x5303
 	.uleb128 0x22
 	.4byte	.LASF69
 	.byte	0x5a
@@ -19706,168 +20055,168 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x5a
 	.byte	0xa4
-	.4byte	0x540c
+	.4byte	0x5422
 	.uleb128 0x22
-	.4byte	.LASF1267
+	.4byte	.LASF1269
 	.byte	0x5a
 	.byte	0xa9
 	.4byte	0x367
 	.uleb128 0x22
-	.4byte	.LASF1268
+	.4byte	.LASF1270
 	.byte	0x5a
 	.byte	0xb1
 	.4byte	0x6d
 	.uleb128 0x22
-	.4byte	.LASF879
+	.4byte	.LASF881
 	.byte	0x5a
 	.byte	0xb3
 	.4byte	0x6d
 	.uleb128 0x22
-	.4byte	.LASF1269
+	.4byte	.LASF1271
 	.byte	0x5a
 	.byte	0xb4
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF1270
+	.4byte	.LASF1272
 	.2byte	0x100
 	.byte	0x1f
 	.2byte	0x395
-	.4byte	0x552c
+	.4byte	0x5542
 	.uleb128 0x2b
 	.string	"f_u"
 	.byte	0x1f
 	.2byte	0x399
-	.4byte	0x7ec2
+	.4byte	0x7ed8
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1271
+	.4byte	.LASF1273
 	.byte	0x1f
 	.2byte	0x39a
-	.4byte	0x20ed
+	.4byte	0x2103
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1272
+	.4byte	.LASF1274
 	.byte	0x1f
 	.2byte	0x39b
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1273
+	.4byte	.LASF1275
 	.byte	0x1f
 	.2byte	0x39c
-	.4byte	0x7d9b
+	.4byte	0x7db1
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1274
+	.4byte	.LASF1276
 	.byte	0x1f
 	.2byte	0x3a2
 	.4byte	0xe50
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1275
+	.4byte	.LASF1277
 	.byte	0x1f
 	.2byte	0x3a3
-	.4byte	0x75d7
+	.4byte	0x75ed
 	.byte	0x34
 	.uleb128 0x1b
-	.4byte	.LASF1276
+	.4byte	.LASF1278
 	.byte	0x1f
 	.2byte	0x3a4
 	.4byte	0x543
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1277
+	.4byte	.LASF1279
 	.byte	0x1f
 	.2byte	0x3a5
 	.4byte	0x6d
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1278
+	.4byte	.LASF1280
 	.byte	0x1f
 	.2byte	0x3a6
 	.4byte	0x326
 	.byte	0x44
 	.uleb128 0x1b
-	.4byte	.LASF1279
+	.4byte	.LASF1281
 	.byte	0x1f
 	.2byte	0x3a7
-	.4byte	0x243f
+	.4byte	0x2455
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1280
+	.4byte	.LASF1282
 	.byte	0x1f
 	.2byte	0x3a8
 	.4byte	0x2c3
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1281
+	.4byte	.LASF1283
 	.byte	0x1f
 	.2byte	0x3a9
-	.4byte	0x7e0a
+	.4byte	0x7e20
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1282
+	.4byte	.LASF1284
 	.byte	0x1f
 	.2byte	0x3aa
-	.4byte	0x47a7
+	.4byte	0x47bd
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1283
+	.4byte	.LASF1285
 	.byte	0x1f
 	.2byte	0x3ab
-	.4byte	0x7e66
+	.4byte	0x7e7c
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF1284
+	.4byte	.LASF1286
 	.byte	0x1f
 	.2byte	0x3ad
 	.4byte	0x155
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF1285
+	.4byte	.LASF1287
 	.byte	0x1f
 	.2byte	0x3af
 	.4byte	0x443
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF1234
+	.4byte	.LASF1236
 	.byte	0x1f
 	.2byte	0x3b2
 	.4byte	0x443
 	.byte	0xc8
 	.uleb128 0x1b
-	.4byte	.LASF1286
+	.4byte	.LASF1288
 	.byte	0x1f
 	.2byte	0x3b6
 	.4byte	0x392
 	.byte	0xd0
 	.uleb128 0x1b
-	.4byte	.LASF1287
+	.4byte	.LASF1289
 	.byte	0x1f
 	.2byte	0x3b7
 	.4byte	0x392
 	.byte	0xe0
 	.uleb128 0x1b
-	.4byte	.LASF1288
+	.4byte	.LASF1290
 	.byte	0x1f
 	.2byte	0x3b9
-	.4byte	0x514b
+	.4byte	0x5161
 	.byte	0xf0
 	.uleb128 0x1b
-	.4byte	.LASF1289
+	.4byte	.LASF1291
 	.byte	0x1f
 	.2byte	0x3ba
-	.4byte	0x5d9a
+	.4byte	0x5db0
 	.byte	0xf8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x540c
+	.4byte	0x5422
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x540c
+	.4byte	0x5422
 	.uleb128 0x2a
-	.4byte	.LASF979
+	.4byte	.LASF981
 	.byte	0
 	.byte	0x5a
 	.2byte	0x105
@@ -19875,15 +20224,15 @@ __exitcall_ebc_exit:
 	.byte	0x20
 	.byte	0x5a
 	.2byte	0x131
-	.4byte	0x5563
+	.4byte	0x5579
 	.uleb128 0x2b
 	.string	"rb"
 	.byte	0x5a
 	.2byte	0x132
-	.4byte	0x34b7
+	.4byte	0x34cd
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1290
+	.4byte	.LASF1292
 	.byte	0x5a
 	.2byte	0x133
 	.4byte	0x29
@@ -19893,106 +20242,106 @@ __exitcall_ebc_exit:
 	.byte	0x20
 	.byte	0x5a
 	.2byte	0x130
-	.4byte	0x5585
+	.4byte	0x559b
 	.uleb128 0x41
-	.4byte	.LASF1291
+	.4byte	.LASF1293
 	.byte	0x5a
 	.2byte	0x134
-	.4byte	0x5540
+	.4byte	0x5556
 	.uleb128 0x41
-	.4byte	.LASF1292
+	.4byte	.LASF1294
 	.byte	0x5a
 	.2byte	0x135
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF973
+	.4byte	.LASF975
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5585
+	.4byte	0x559b
 	.uleb128 0x1d
-	.4byte	.LASF1293
+	.4byte	.LASF1295
 	.byte	0x88
 	.byte	0x76
 	.2byte	0x195
-	.4byte	0x567b
+	.4byte	0x5691
 	.uleb128 0x1b
 	.4byte	.LASF110
 	.byte	0x76
 	.2byte	0x196
-	.4byte	0xc9cc
+	.4byte	0xc9e2
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1294
+	.4byte	.LASF1296
 	.byte	0x76
 	.2byte	0x197
-	.4byte	0xc9cc
+	.4byte	0xc9e2
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1295
+	.4byte	.LASF1297
 	.byte	0x76
 	.2byte	0x198
-	.4byte	0xc9e6
+	.4byte	0xc9fc
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1296
+	.4byte	.LASF1298
 	.byte	0x76
 	.2byte	0x199
-	.4byte	0xc9fb
+	.4byte	0xca11
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1297
+	.4byte	.LASF1299
 	.byte	0x76
 	.2byte	0x19a
-	.4byte	0xca10
+	.4byte	0xca26
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1298
+	.4byte	.LASF1300
 	.byte	0x76
 	.2byte	0x19b
-	.4byte	0xca2a
+	.4byte	0xca40
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1299
+	.4byte	.LASF1301
 	.byte	0x76
 	.2byte	0x19d
-	.4byte	0xca45
+	.4byte	0xca5b
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1300
+	.4byte	.LASF1302
 	.byte	0x76
 	.2byte	0x19f
-	.4byte	0xca5a
+	.4byte	0xca70
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1301
+	.4byte	.LASF1303
 	.byte	0x76
 	.2byte	0x1a3
-	.4byte	0xca10
+	.4byte	0xca26
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1302
+	.4byte	.LASF1304
 	.byte	0x76
 	.2byte	0x1a6
-	.4byte	0xca10
+	.4byte	0xca26
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1303
+	.4byte	.LASF1305
 	.byte	0x76
 	.2byte	0x1ab
-	.4byte	0xca83
+	.4byte	0xca99
 	.byte	0x50
 	.uleb128 0x1b
 	.4byte	.LASF264
 	.byte	0x76
 	.2byte	0x1b1
-	.4byte	0xca98
+	.4byte	0xcaae
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1304
+	.4byte	.LASF1306
 	.byte	0x76
 	.2byte	0x1cf
-	.4byte	0xcab2
+	.4byte	0xcac8
 	.byte	0x60
 	.uleb128 0x1b
 	.4byte	.LASF129
@@ -20020,76 +20369,76 @@ __exitcall_ebc_exit:
 	.byte	0x80
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x5590
+	.4byte	0x55a6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x567b
+	.4byte	0x5691
 	.uleb128 0x1d
-	.4byte	.LASF1305
+	.4byte	.LASF1307
 	.byte	0x10
 	.byte	0x5a
 	.2byte	0x15a
-	.4byte	0x56ae
+	.4byte	0x56c4
 	.uleb128 0x1b
-	.4byte	.LASF756
+	.4byte	.LASF758
 	.byte	0x5a
 	.2byte	0x15b
-	.4byte	0x2eda
+	.4byte	0x2ef0
 	.byte	0
 	.uleb128 0x1b
 	.4byte	.LASF63
 	.byte	0x5a
 	.2byte	0x15c
-	.4byte	0x56ae
+	.4byte	0x56c4
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5686
+	.4byte	0x569c
 	.uleb128 0x1d
-	.4byte	.LASF1306
+	.4byte	.LASF1308
 	.byte	0x38
 	.byte	0x5a
 	.2byte	0x15f
-	.4byte	0x56e9
+	.4byte	0x56ff
 	.uleb128 0x1b
-	.4byte	.LASF1307
+	.4byte	.LASF1309
 	.byte	0x5a
 	.2byte	0x160
 	.4byte	0x367
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1308
+	.4byte	.LASF1310
 	.byte	0x5a
 	.2byte	0x161
-	.4byte	0x5686
+	.4byte	0x569c
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1309
+	.4byte	.LASF1311
 	.byte	0x5a
 	.2byte	0x162
-	.4byte	0x4628
+	.4byte	0x463e
 	.byte	0x18
 	.byte	0
 	.uleb128 0x45
 	.2byte	0x378
 	.byte	0x5a
 	.2byte	0x167
-	.4byte	0x59b0
+	.4byte	0x59c6
 	.uleb128 0x1b
 	.4byte	.LASF108
 	.byte	0x5a
 	.2byte	0x168
-	.4byte	0x3c8a
+	.4byte	0x3ca0
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1310
+	.4byte	.LASF1312
 	.byte	0x5a
 	.2byte	0x169
-	.4byte	0x34ee
+	.4byte	0x3504
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1311
+	.4byte	.LASF1313
 	.byte	0x5a
 	.2byte	0x16a
 	.4byte	0x155
@@ -20098,28 +20447,28 @@ __exitcall_ebc_exit:
 	.4byte	.LASF117
 	.byte	0x5a
 	.2byte	0x16c
-	.4byte	0x59d3
+	.4byte	0x59e9
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1312
+	.4byte	.LASF1314
 	.byte	0x5a
 	.2byte	0x170
 	.4byte	0x29
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1313
+	.4byte	.LASF1315
 	.byte	0x5a
 	.2byte	0x171
 	.4byte	0x29
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1314
+	.4byte	.LASF1316
 	.byte	0x5a
 	.2byte	0x177
 	.4byte	0x29
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1315
+	.4byte	.LASF1317
 	.byte	0x5a
 	.2byte	0x178
 	.4byte	0x29
@@ -20128,136 +20477,136 @@ __exitcall_ebc_exit:
 	.string	"pgd"
 	.byte	0x5a
 	.2byte	0x179
-	.4byte	0x59d9
+	.4byte	0x59ef
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1316
+	.4byte	.LASF1318
 	.byte	0x5a
 	.2byte	0x184
 	.4byte	0x367
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1317
+	.4byte	.LASF1319
 	.byte	0x5a
 	.2byte	0x18d
 	.4byte	0x367
 	.byte	0x4c
 	.uleb128 0x1b
-	.4byte	.LASF1318
+	.4byte	.LASF1320
 	.byte	0x5a
 	.2byte	0x190
 	.4byte	0x543
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1319
+	.4byte	.LASF1321
 	.byte	0x5a
 	.2byte	0x192
 	.4byte	0xc6
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1320
+	.4byte	.LASF1322
 	.byte	0x5a
 	.2byte	0x194
 	.4byte	0xe50
 	.byte	0x5c
 	.uleb128 0x1b
-	.4byte	.LASF1321
+	.4byte	.LASF1323
 	.byte	0x5a
 	.2byte	0x197
-	.4byte	0x4e0b
+	.4byte	0x4e21
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1322
+	.4byte	.LASF1324
 	.byte	0x5a
 	.2byte	0x199
 	.4byte	0x392
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1323
+	.4byte	.LASF1325
 	.byte	0x5a
 	.2byte	0x1a0
 	.4byte	0x29
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF1324
+	.4byte	.LASF1326
 	.byte	0x5a
 	.2byte	0x1a1
 	.4byte	0x29
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF1325
+	.4byte	.LASF1327
 	.byte	0x5a
 	.2byte	0x1a3
 	.4byte	0x29
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF957
+	.4byte	.LASF959
 	.byte	0x5a
 	.2byte	0x1a4
 	.4byte	0x29
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF1326
+	.4byte	.LASF1328
 	.byte	0x5a
 	.2byte	0x1a5
 	.4byte	0x29
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF1327
+	.4byte	.LASF1329
 	.byte	0x5a
 	.2byte	0x1a6
 	.4byte	0x29
 	.byte	0xc8
 	.uleb128 0x1b
-	.4byte	.LASF1328
+	.4byte	.LASF1330
 	.byte	0x5a
 	.2byte	0x1a7
 	.4byte	0x29
 	.byte	0xd0
 	.uleb128 0x1b
-	.4byte	.LASF1329
+	.4byte	.LASF1331
 	.byte	0x5a
 	.2byte	0x1a8
 	.4byte	0x29
 	.byte	0xd8
 	.uleb128 0x1b
-	.4byte	.LASF1330
+	.4byte	.LASF1332
 	.byte	0x5a
 	.2byte	0x1a9
 	.4byte	0x29
 	.byte	0xe0
 	.uleb128 0x1b
-	.4byte	.LASF1331
+	.4byte	.LASF1333
 	.byte	0x5a
 	.2byte	0x1ab
 	.4byte	0xe50
 	.byte	0xe8
 	.uleb128 0x1b
-	.4byte	.LASF1332
+	.4byte	.LASF1334
 	.byte	0x5a
 	.2byte	0x1ac
 	.4byte	0x29
 	.byte	0xf0
 	.uleb128 0x1b
-	.4byte	.LASF1333
+	.4byte	.LASF1335
 	.byte	0x5a
 	.2byte	0x1ac
 	.4byte	0x29
 	.byte	0xf8
 	.uleb128 0x1c
-	.4byte	.LASF1334
+	.4byte	.LASF1336
 	.byte	0x5a
 	.2byte	0x1ac
 	.4byte	0x29
 	.2byte	0x100
 	.uleb128 0x1c
-	.4byte	.LASF1335
+	.4byte	.LASF1337
 	.byte	0x5a
 	.2byte	0x1ac
 	.4byte	0x29
 	.2byte	0x108
 	.uleb128 0x1c
-	.4byte	.LASF1336
+	.4byte	.LASF1338
 	.byte	0x5a
 	.2byte	0x1ad
 	.4byte	0x29
@@ -20269,58 +20618,58 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.2byte	0x118
 	.uleb128 0x1c
-	.4byte	.LASF1337
+	.4byte	.LASF1339
 	.byte	0x5a
 	.2byte	0x1ad
 	.4byte	0x29
 	.2byte	0x120
 	.uleb128 0x1c
-	.4byte	.LASF1338
+	.4byte	.LASF1340
 	.byte	0x5a
 	.2byte	0x1ae
 	.4byte	0x29
 	.2byte	0x128
 	.uleb128 0x1c
-	.4byte	.LASF1339
+	.4byte	.LASF1341
 	.byte	0x5a
 	.2byte	0x1ae
 	.4byte	0x29
 	.2byte	0x130
 	.uleb128 0x1c
-	.4byte	.LASF1340
+	.4byte	.LASF1342
 	.byte	0x5a
 	.2byte	0x1ae
 	.4byte	0x29
 	.2byte	0x138
 	.uleb128 0x1c
-	.4byte	.LASF1341
+	.4byte	.LASF1343
 	.byte	0x5a
 	.2byte	0x1ae
 	.4byte	0x29
 	.2byte	0x140
 	.uleb128 0x1c
-	.4byte	.LASF1342
+	.4byte	.LASF1344
 	.byte	0x5a
 	.2byte	0x1b0
-	.4byte	0x59df
+	.4byte	0x59f5
 	.2byte	0x148
 	.uleb128 0x1c
-	.4byte	.LASF615
+	.4byte	.LASF617
 	.byte	0x5a
 	.2byte	0x1b6
-	.4byte	0x3dea
+	.4byte	0x3e00
 	.2byte	0x2b8
 	.uleb128 0x1c
-	.4byte	.LASF1343
+	.4byte	.LASF1345
 	.byte	0x5a
 	.2byte	0x1b8
-	.4byte	0x59f4
+	.4byte	0x5a0a
 	.2byte	0x2e0
 	.uleb128 0x1c
-	.4byte	.LASF1344
+	.4byte	.LASF1346
 	.byte	0x5a
 	.2byte	0x1bb
-	.4byte	0x4f9c
+	.4byte	0x4fb2
 	.2byte	0x2e8
 	.uleb128 0x1c
 	.4byte	.LASF170
@@ -20329,71 +20678,71 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.2byte	0x300
 	.uleb128 0x1c
-	.4byte	.LASF1306
+	.4byte	.LASF1308
 	.byte	0x5a
 	.2byte	0x1bf
-	.4byte	0x59fa
+	.4byte	0x5a10
 	.2byte	0x308
 	.uleb128 0x1c
-	.4byte	.LASF1345
+	.4byte	.LASF1347
 	.byte	0x5a
 	.2byte	0x1c1
 	.4byte	0x367
 	.2byte	0x310
 	.uleb128 0x1c
-	.4byte	.LASF1346
+	.4byte	.LASF1348
 	.byte	0x5a
 	.2byte	0x1c4
 	.4byte	0xe50
 	.2byte	0x314
 	.uleb128 0x1c
-	.4byte	.LASF1347
+	.4byte	.LASF1349
 	.byte	0x5a
 	.2byte	0x1c5
-	.4byte	0x5a05
+	.4byte	0x5a1b
 	.2byte	0x318
 	.uleb128 0x1c
 	.4byte	.LASF97
 	.byte	0x5a
 	.2byte	0x1d2
-	.4byte	0x2eda
+	.4byte	0x2ef0
 	.2byte	0x320
 	.uleb128 0x1c
-	.4byte	.LASF1116
+	.4byte	.LASF1118
 	.byte	0x5a
 	.2byte	0x1d4
-	.4byte	0x5a0b
+	.4byte	0x5a21
 	.2byte	0x328
 	.uleb128 0x1c
-	.4byte	.LASF1348
+	.4byte	.LASF1350
 	.byte	0x5a
 	.2byte	0x1d7
-	.4byte	0x5531
+	.4byte	0x5547
 	.2byte	0x330
 	.uleb128 0x1c
-	.4byte	.LASF1349
+	.4byte	.LASF1351
 	.byte	0x5a
 	.2byte	0x1f1
 	.4byte	0x367
 	.2byte	0x338
 	.uleb128 0x1c
-	.4byte	.LASF1211
+	.4byte	.LASF1213
 	.byte	0x5a
 	.2byte	0x1f6
-	.4byte	0x4f4c
+	.4byte	0x4f62
 	.2byte	0x340
 	.uleb128 0x1c
-	.4byte	.LASF1350
+	.4byte	.LASF1352
 	.byte	0x5a
 	.2byte	0x1fa
-	.4byte	0x31e0
+	.4byte	0x31f6
 	.2byte	0x348
 	.byte	0
 	.uleb128 0x14
 	.4byte	0x29
-	.4byte	0x59d3
+	.4byte	0x59e9
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
@@ -20405,61 +20754,61 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x59b0
+	.4byte	0x59c6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x33e8
+	.4byte	0x33fe
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0x59ef
+	.4byte	0x5a05
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2d
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1351
+	.4byte	.LASF1353
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x59ef
+	.4byte	0x5a05
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x56b4
+	.4byte	0x56ca
 	.uleb128 0x24
-	.4byte	.LASF1352
+	.4byte	.LASF1354
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5a00
+	.4byte	0x5a16
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x23c0
+	.4byte	0x23d6
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0x5a20
+	.4byte	0x5a36
 	.uleb128 0x44
 	.4byte	0x4f
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF1353
+	.4byte	.LASF1355
 	.byte	0x5a
 	.2byte	0x209
-	.4byte	0x45e9
+	.4byte	0x45ff
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x343e
+	.4byte	0x3454
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5a38
+	.4byte	0x5a4e
 	.uleb128 0x1d
-	.4byte	.LASF1354
+	.4byte	.LASF1356
 	.byte	0x68
 	.byte	0x76
 	.2byte	0x163
-	.4byte	0x5afc
+	.4byte	0x5b12
 	.uleb128 0x2b
 	.string	"vma"
 	.byte	0x76
 	.2byte	0x164
-	.4byte	0x3c8a
+	.4byte	0x3ca0
 	.byte	0
 	.uleb128 0x1b
 	.4byte	.LASF170
@@ -20468,19 +20817,19 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1168
+	.4byte	.LASF1170
 	.byte	0x76
 	.2byte	0x166
 	.4byte	0x31b
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF1355
+	.4byte	.LASF1357
 	.byte	0x76
 	.2byte	0x167
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1356
+	.4byte	.LASF1358
 	.byte	0x76
 	.2byte	0x168
 	.4byte	0x29
@@ -20489,68 +20838,68 @@ __exitcall_ebc_exit:
 	.string	"pmd"
 	.byte	0x76
 	.2byte	0x169
-	.4byte	0xc88d
+	.4byte	0xc8a3
 	.byte	0x20
 	.uleb128 0x2b
 	.string	"pud"
 	.byte	0x76
 	.2byte	0x16b
-	.4byte	0xc991
+	.4byte	0xc9a7
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1357
+	.4byte	.LASF1359
 	.byte	0x76
 	.2byte	0x16e
-	.4byte	0x33a8
+	.4byte	0x33be
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1358
+	.4byte	.LASF1360
 	.byte	0x76
 	.2byte	0x170
-	.4byte	0x343e
+	.4byte	0x3454
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1171
+	.4byte	.LASF1173
 	.byte	0x76
 	.2byte	0x171
-	.4byte	0x4946
+	.4byte	0x495c
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF842
+	.4byte	.LASF844
 	.byte	0x76
 	.2byte	0x172
-	.4byte	0x343e
+	.4byte	0x3454
 	.byte	0x48
 	.uleb128 0x2b
 	.string	"pte"
 	.byte	0x76
 	.2byte	0x178
-	.4byte	0xc997
+	.4byte	0xc9ad
 	.byte	0x50
 	.uleb128 0x2b
 	.string	"ptl"
 	.byte	0x76
 	.2byte	0x17c
-	.4byte	0x4d0e
+	.4byte	0x4d24
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1359
+	.4byte	.LASF1361
 	.byte	0x76
 	.2byte	0x180
-	.4byte	0x3433
+	.4byte	0x3449
 	.byte	0x60
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1360
+	.4byte	.LASF1362
 	.byte	0x77
 	.byte	0x16
 	.4byte	0xc6
 	.uleb128 0xd
-	.4byte	.LASF1361
+	.4byte	.LASF1363
 	.byte	0x8
 	.byte	0x77
 	.byte	0x18
-	.4byte	0x5b20
+	.4byte	0x5b36
 	.uleb128 0x20
 	.string	"cap"
 	.byte	0x77
@@ -20559,28 +20908,28 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1362
+	.4byte	.LASF1364
 	.byte	0x77
 	.byte	0x1a
-	.4byte	0x5b07
+	.4byte	0x5b1d
 	.uleb128 0x3
-	.4byte	0x5b20
+	.4byte	0x5b36
 	.uleb128 0x19
-	.4byte	.LASF1363
+	.4byte	.LASF1365
 	.byte	0x77
 	.byte	0x2d
-	.4byte	0x5b2b
+	.4byte	0x5b41
 	.uleb128 0x19
-	.4byte	.LASF1364
+	.4byte	.LASF1366
 	.byte	0x77
 	.byte	0x2e
-	.4byte	0x5b2b
+	.4byte	0x5b41
 	.uleb128 0xd
-	.4byte	.LASF1365
+	.4byte	.LASF1367
 	.byte	0x18
 	.byte	0x78
 	.byte	0x10
-	.4byte	0x5b77
+	.4byte	0x5b8d
 	.uleb128 0xe
 	.4byte	.LASF115
 	.byte	0x78
@@ -20588,56 +20937,56 @@ __exitcall_ebc_exit:
 	.4byte	0xe1e
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF380
+	.4byte	.LASF382
 	.byte	0x78
 	.byte	0x12
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF573
+	.4byte	.LASF575
 	.byte	0x78
 	.byte	0x13
 	.4byte	0x392
 	.byte	0x8
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1366
+	.4byte	.LASF1368
 	.byte	0x38
 	.byte	0x79
 	.byte	0x11
-	.4byte	0x5bcc
+	.4byte	0x5be2
 	.uleb128 0xe
-	.4byte	.LASF1367
+	.4byte	.LASF1369
 	.byte	0x79
 	.byte	0x12
 	.4byte	0xef
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1368
+	.4byte	.LASF1370
 	.byte	0x79
 	.byte	0x14
 	.4byte	0xef
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1369
+	.4byte	.LASF1371
 	.byte	0x79
 	.byte	0x16
 	.4byte	0xef
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1370
+	.4byte	.LASF1372
 	.byte	0x79
 	.byte	0x17
-	.4byte	0x5bcc
+	.4byte	0x5be2
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1371
+	.4byte	.LASF1373
 	.byte	0x79
 	.byte	0x18
 	.4byte	0xd2
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1372
+	.4byte	.LASF1374
 	.byte	0x79
 	.byte	0x19
 	.4byte	0xc93
@@ -20645,152 +20994,152 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xef
-	.4byte	0x5bdc
+	.4byte	0x5bf2
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF1373
+	.4byte	.LASF1375
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x7a
 	.byte	0xf
-	.4byte	0x5c05
+	.4byte	0x5c1b
 	.uleb128 0xc
-	.4byte	.LASF1374
+	.4byte	.LASF1376
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1375
+	.4byte	.LASF1377
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1376
+	.4byte	.LASF1378
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF1377
+	.4byte	.LASF1379
 	.byte	0x3
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1378
+	.4byte	.LASF1380
 	.byte	0x8
 	.byte	0x7b
 	.byte	0x14
-	.4byte	0x5c1e
+	.4byte	0x5c34
 	.uleb128 0xe
-	.4byte	.LASF756
+	.4byte	.LASF758
 	.byte	0x7b
 	.byte	0x15
-	.4byte	0x2eda
+	.4byte	0x2ef0
 	.byte	0
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF1379
+	.4byte	.LASF1381
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x7c
 	.byte	0x1d
-	.4byte	0x5c41
+	.4byte	0x5c57
 	.uleb128 0xc
-	.4byte	.LASF1380
+	.4byte	.LASF1382
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1381
+	.4byte	.LASF1383
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1382
+	.4byte	.LASF1384
 	.byte	0x2
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1383
+	.4byte	.LASF1385
 	.byte	0x40
 	.byte	0x7c
 	.byte	0x20
-	.4byte	0x5c96
+	.4byte	0x5cac
 	.uleb128 0xe
-	.4byte	.LASF1384
+	.4byte	.LASF1386
 	.byte	0x7c
 	.byte	0x21
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1385
+	.4byte	.LASF1387
 	.byte	0x7c
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1386
+	.4byte	.LASF1388
 	.byte	0x7c
 	.byte	0x23
-	.4byte	0x1594
+	.4byte	0x15aa
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1387
+	.4byte	.LASF1389
 	.byte	0x7c
 	.byte	0x25
 	.4byte	0xc6
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1388
+	.4byte	.LASF1390
 	.byte	0x7c
 	.byte	0x26
 	.4byte	0x407
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1389
+	.4byte	.LASF1391
 	.byte	0x7c
 	.byte	0x28
-	.4byte	0x5c1e
+	.4byte	0x5c34
 	.byte	0x38
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1390
+	.4byte	.LASF1392
 	.byte	0x88
 	.byte	0x7d
 	.byte	0xc
-	.4byte	0x5cdf
+	.4byte	0x5cf5
 	.uleb128 0x20
 	.string	"rss"
 	.byte	0x7d
 	.byte	0xd
-	.4byte	0x5c41
+	.4byte	0x5c57
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1391
+	.4byte	.LASF1393
 	.byte	0x7d
 	.byte	0xe
-	.4byte	0x3548
+	.4byte	0x355e
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF1392
+	.4byte	.LASF1394
 	.byte	0x7d
 	.byte	0xf
-	.4byte	0x4e0b
+	.4byte	0x4e21
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF1393
+	.4byte	.LASF1395
 	.byte	0x7d
 	.byte	0x10
-	.4byte	0x5c05
+	.4byte	0x5c1b
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF1394
+	.4byte	.LASF1396
 	.byte	0x7d
 	.byte	0x11
 	.4byte	0xc6
 	.byte	0x80
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1395
+	.4byte	.LASF1397
 	.byte	0x10
 	.byte	0x7e
 	.byte	0xa
-	.4byte	0x5d03
+	.4byte	0x5d19
 	.uleb128 0x20
 	.string	"fn"
 	.byte	0x7e
 	.byte	0xb
-	.4byte	0x2f0a
+	.4byte	0x2f20
 	.byte	0
 	.uleb128 0x20
 	.string	"arg"
@@ -20803,78 +21152,78 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x7f
 	.byte	0x17
-	.4byte	0x5d16
+	.4byte	0x5d2c
 	.uleb128 0x20
 	.string	"b"
 	.byte	0x7f
 	.byte	0x18
-	.4byte	0x5d16
+	.4byte	0x5d2c
 	.byte	0
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x8b
-	.4byte	0x5d26
+	.4byte	0x5d3c
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1396
+	.4byte	.LASF1398
 	.byte	0x7f
 	.byte	0x19
-	.4byte	0x5d03
+	.4byte	0x5d19
 	.uleb128 0x3
-	.4byte	0x5d26
+	.4byte	0x5d3c
 	.uleb128 0xf
 	.byte	0x10
 	.byte	0x80
 	.byte	0x18
-	.4byte	0x5d49
+	.4byte	0x5d5f
 	.uleb128 0x20
 	.string	"b"
 	.byte	0x80
 	.byte	0x19
-	.4byte	0x5d16
+	.4byte	0x5d2c
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1397
+	.4byte	.LASF1399
 	.byte	0x80
 	.byte	0x1a
-	.4byte	0x5d36
+	.4byte	0x5d4c
 	.uleb128 0x3
-	.4byte	0x5d49
+	.4byte	0x5d5f
 	.uleb128 0x19
-	.4byte	.LASF1398
+	.4byte	.LASF1400
 	.byte	0x80
 	.byte	0x29
-	.4byte	0x5d31
+	.4byte	0x5d47
 	.uleb128 0x19
-	.4byte	.LASF1399
+	.4byte	.LASF1401
 	.byte	0x80
 	.byte	0x2a
-	.4byte	0x5d54
+	.4byte	0x5d6a
 	.uleb128 0x5
 	.4byte	0x115
-	.4byte	0x5d7f
+	.4byte	0x5d95
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x5d6f
+	.4byte	0x5d85
 	.uleb128 0x19
-	.4byte	.LASF1400
+	.4byte	.LASF1402
 	.byte	0x80
 	.byte	0x51
-	.4byte	0x5d7f
+	.4byte	0x5d95
 	.uleb128 0x19
-	.4byte	.LASF1401
+	.4byte	.LASF1403
 	.byte	0x80
 	.byte	0x52
-	.4byte	0x5d7f
+	.4byte	0x5d95
 	.uleb128 0x8
-	.4byte	.LASF1402
+	.4byte	.LASF1404
 	.byte	0x81
 	.byte	0x8
 	.4byte	0x13a
@@ -20882,57 +21231,57 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x6b
 	.byte	0x53
-	.4byte	0x5dc4
+	.4byte	0x5dda
 	.uleb128 0x22
-	.4byte	.LASF1403
+	.4byte	.LASF1405
 	.byte	0x6b
 	.byte	0x54
 	.4byte	0x392
 	.uleb128 0x22
-	.4byte	.LASF1404
+	.4byte	.LASF1406
 	.byte	0x6b
 	.byte	0x55
-	.4byte	0x5223
+	.4byte	0x5239
 	.byte	0
 	.uleb128 0x21
 	.byte	0x10
 	.byte	0x6b
 	.byte	0x57
-	.4byte	0x5de3
+	.4byte	0x5df9
 	.uleb128 0x22
-	.4byte	.LASF1405
+	.4byte	.LASF1407
 	.byte	0x6b
 	.byte	0x58
 	.4byte	0x3d6
 	.uleb128 0x22
-	.4byte	.LASF1406
+	.4byte	.LASF1408
 	.byte	0x6b
 	.byte	0x59
 	.4byte	0x407
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1407
+	.4byte	.LASF1409
 	.byte	0x38
 	.byte	0x6b
 	.byte	0x49
-	.4byte	0x5e1e
+	.4byte	0x5e34
 	.uleb128 0x20
 	.string	"q"
 	.byte	0x6b
 	.byte	0x4a
-	.4byte	0x4951
+	.4byte	0x4967
 	.byte	0
 	.uleb128 0x20
 	.string	"ioc"
 	.byte	0x6b
 	.byte	0x4b
-	.4byte	0x48d2
+	.4byte	0x48e8
 	.byte	0x8
 	.uleb128 0x23
-	.4byte	0x5da5
+	.4byte	0x5dbb
 	.byte	0x10
 	.uleb128 0x23
-	.4byte	0x5dc4
+	.4byte	0x5dda
 	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF170
@@ -20943,260 +21292,260 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5de3
+	.4byte	0x5df9
 	.uleb128 0x19
-	.4byte	.LASF1408
+	.4byte	.LASF1410
 	.byte	0x82
 	.byte	0xb
 	.4byte	0x6d
 	.uleb128 0xd
-	.4byte	.LASF1409
+	.4byte	.LASF1411
 	.byte	0x18
 	.byte	0x83
 	.byte	0x5c
-	.4byte	0x5e60
+	.4byte	0x5e76
 	.uleb128 0xe
-	.4byte	.LASF1410
+	.4byte	.LASF1412
 	.byte	0x83
 	.byte	0x5d
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1411
+	.4byte	.LASF1413
 	.byte	0x83
 	.byte	0x5e
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1412
+	.4byte	.LASF1414
 	.byte	0x83
 	.byte	0x5f
 	.4byte	0x29
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1413
+	.4byte	.LASF1415
 	.byte	0x38
 	.byte	0x83
 	.byte	0x62
-	.4byte	0x5e91
+	.4byte	0x5ea7
 	.uleb128 0xe
-	.4byte	.LASF1414
+	.4byte	.LASF1416
 	.byte	0x83
 	.byte	0x63
 	.4byte	0x194
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF390
+	.4byte	.LASF392
 	.byte	0x83
 	.byte	0x64
 	.4byte	0x194
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF393
+	.4byte	.LASF395
 	.byte	0x83
 	.byte	0x65
-	.4byte	0x5e91
+	.4byte	0x5ea7
 	.byte	0x10
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x194
-	.4byte	0x5ea1
+	.4byte	0x5eb7
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x4
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1415
+	.4byte	.LASF1417
 	.byte	0x1f
 	.byte	0x49
-	.4byte	0x5e2f
+	.4byte	0x5e45
 	.uleb128 0x19
-	.4byte	.LASF1416
+	.4byte	.LASF1418
 	.byte	0x1f
 	.byte	0x4b
 	.4byte	0x6d
 	.uleb128 0x19
-	.4byte	.LASF1417
+	.4byte	.LASF1419
 	.byte	0x1f
 	.byte	0x4c
-	.4byte	0x5e60
+	.4byte	0x5e76
 	.uleb128 0x19
-	.4byte	.LASF1418
+	.4byte	.LASF1420
 	.byte	0x1f
 	.byte	0x4d
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF1419
+	.4byte	.LASF1421
 	.byte	0x1f
 	.byte	0x4d
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF1420
+	.4byte	.LASF1422
 	.byte	0x1f
 	.byte	0x4e
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF1421
+	.4byte	.LASF1423
 	.byte	0x1f
 	.byte	0x4f
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF1422
+	.4byte	.LASF1424
 	.byte	0x1f
 	.byte	0x50
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF1423
+	.4byte	.LASF1425
 	.byte	0x1f
 	.byte	0x51
 	.4byte	0xc6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5f0a
+	.4byte	0x5f20
 	.uleb128 0x1d
-	.4byte	.LASF1424
+	.4byte	.LASF1426
 	.byte	0x28
 	.byte	0x1f
 	.2byte	0x137
-	.4byte	0x5f73
+	.4byte	0x5f89
 	.uleb128 0x1b
-	.4byte	.LASF1425
+	.4byte	.LASF1427
 	.byte	0x1f
 	.2byte	0x138
-	.4byte	0x5531
+	.4byte	0x5547
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1426
+	.4byte	.LASF1428
 	.byte	0x1f
 	.2byte	0x13d
 	.4byte	0x2c3
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1427
+	.4byte	.LASF1429
 	.byte	0x1f
 	.2byte	0x13e
-	.4byte	0x7622
+	.4byte	0x7638
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF357
+	.4byte	.LASF359
 	.byte	0x1f
 	.2byte	0x13f
 	.4byte	0x443
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1428
+	.4byte	.LASF1430
 	.byte	0x1f
 	.2byte	0x140
 	.4byte	0xc6
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1429
+	.4byte	.LASF1431
 	.byte	0x1f
 	.2byte	0x141
 	.4byte	0x11a
 	.byte	0x24
 	.uleb128 0x1b
-	.4byte	.LASF1430
+	.4byte	.LASF1432
 	.byte	0x1f
 	.2byte	0x142
 	.4byte	0x11a
 	.byte	0x26
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1431
+	.4byte	.LASF1433
 	.byte	0x50
 	.byte	0x1f
 	.byte	0xd9
-	.4byte	0x5fec
+	.4byte	0x6002
 	.uleb128 0xe
-	.4byte	.LASF1432
+	.4byte	.LASF1434
 	.byte	0x1f
 	.byte	0xda
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1433
+	.4byte	.LASF1435
 	.byte	0x1f
 	.byte	0xdb
 	.4byte	0x27a
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1434
+	.4byte	.LASF1436
 	.byte	0x1f
 	.byte	0xdc
-	.4byte	0x23e5
+	.4byte	0x23fb
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1435
+	.4byte	.LASF1437
 	.byte	0x1f
 	.byte	0xdd
-	.4byte	0x2405
+	.4byte	0x241b
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF1436
+	.4byte	.LASF1438
 	.byte	0x1f
 	.byte	0xde
 	.4byte	0x2c3
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1437
+	.4byte	.LASF1439
 	.byte	0x1f
 	.byte	0xdf
 	.4byte	0xa12
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1438
+	.4byte	.LASF1440
 	.byte	0x1f
 	.byte	0xe0
 	.4byte	0xa12
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1439
+	.4byte	.LASF1441
 	.byte	0x1f
 	.byte	0xe1
 	.4byte	0xa12
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF1440
+	.4byte	.LASF1442
 	.byte	0x1f
 	.byte	0xe8
-	.4byte	0x5531
+	.4byte	0x5547
 	.byte	0x48
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x21f
-	.4byte	0x5ffc
+	.4byte	0x6012
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x5
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x5fec
+	.4byte	0x6002
 	.uleb128 0x19
-	.4byte	.LASF1441
+	.4byte	.LASF1443
 	.byte	0x84
 	.byte	0x45
-	.4byte	0x5ffc
+	.4byte	0x6012
 	.uleb128 0x19
-	.4byte	.LASF1442
+	.4byte	.LASF1444
 	.byte	0x84
 	.byte	0x5a
 	.4byte	0xc6
 	.uleb128 0xd
-	.4byte	.LASF1443
+	.4byte	.LASF1445
 	.byte	0x68
 	.byte	0x84
 	.byte	0x63
-	.4byte	0x603c
+	.4byte	0x6052
 	.uleb128 0xe
-	.4byte	.LASF1444
+	.4byte	.LASF1446
 	.byte	0x84
 	.byte	0x64
-	.4byte	0x603c
+	.4byte	0x6052
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1445
+	.4byte	.LASF1447
 	.byte	0x84
 	.byte	0x65
 	.4byte	0x29
@@ -21204,390 +21553,390 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x392
-	.4byte	0x604c
+	.4byte	0x6062
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x5
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1446
+	.4byte	.LASF1448
 	.byte	0
 	.byte	0x84
 	.byte	0x71
-	.4byte	0x6063
+	.4byte	0x6079
 	.uleb128 0x20
 	.string	"x"
 	.byte	0x84
 	.byte	0x72
-	.4byte	0x6063
+	.4byte	0x6079
 	.byte	0
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x6072
+	.4byte	0x6088
 	.uleb128 0x44
 	.4byte	0x4f
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF1447
+	.4byte	.LASF1449
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x84
 	.byte	0x87
-	.4byte	0x60dd
+	.4byte	0x60f3
 	.uleb128 0xc
-	.4byte	.LASF1448
+	.4byte	.LASF1450
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1449
+	.4byte	.LASF1451
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1450
+	.4byte	.LASF1452
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1451
+	.4byte	.LASF1453
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF1452
+	.4byte	.LASF1454
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF1453
+	.4byte	.LASF1455
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF1454
+	.4byte	.LASF1456
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF1455
+	.4byte	.LASF1457
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF1456
+	.4byte	.LASF1458
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF1457
+	.4byte	.LASF1459
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF1458
+	.4byte	.LASF1460
 	.byte	0x9
 	.uleb128 0xc
-	.4byte	.LASF1459
+	.4byte	.LASF1461
 	.byte	0xa
 	.uleb128 0xc
-	.4byte	.LASF1460
+	.4byte	.LASF1462
 	.byte	0xb
 	.uleb128 0xc
-	.4byte	.LASF1461
+	.4byte	.LASF1463
 	.byte	0xc
 	.uleb128 0xc
-	.4byte	.LASF1462
+	.4byte	.LASF1464
 	.byte	0xd
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF1463
+	.4byte	.LASF1465
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x84
 	.byte	0x9f
-	.4byte	0x61c0
+	.4byte	0x61d6
 	.uleb128 0xc
-	.4byte	.LASF1464
+	.4byte	.LASF1466
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1465
+	.4byte	.LASF1467
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1466
+	.4byte	.LASF1468
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1467
+	.4byte	.LASF1469
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF1468
+	.4byte	.LASF1470
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF1469
+	.4byte	.LASF1471
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF1470
+	.4byte	.LASF1472
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF1471
+	.4byte	.LASF1473
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF1472
+	.4byte	.LASF1474
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF1473
+	.4byte	.LASF1475
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF1474
+	.4byte	.LASF1476
 	.byte	0x9
 	.uleb128 0xc
-	.4byte	.LASF1475
+	.4byte	.LASF1477
 	.byte	0xa
 	.uleb128 0xc
-	.4byte	.LASF1476
+	.4byte	.LASF1478
 	.byte	0xb
 	.uleb128 0xc
-	.4byte	.LASF1477
+	.4byte	.LASF1479
 	.byte	0xc
 	.uleb128 0xc
-	.4byte	.LASF1478
+	.4byte	.LASF1480
 	.byte	0xd
 	.uleb128 0xc
-	.4byte	.LASF1479
+	.4byte	.LASF1481
 	.byte	0xe
 	.uleb128 0xc
-	.4byte	.LASF1480
+	.4byte	.LASF1482
 	.byte	0xf
 	.uleb128 0xc
-	.4byte	.LASF1481
+	.4byte	.LASF1483
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF1482
+	.4byte	.LASF1484
 	.byte	0x11
 	.uleb128 0xc
-	.4byte	.LASF1483
+	.4byte	.LASF1485
 	.byte	0x12
 	.uleb128 0xc
-	.4byte	.LASF1484
+	.4byte	.LASF1486
 	.byte	0x13
 	.uleb128 0xc
-	.4byte	.LASF1485
+	.4byte	.LASF1487
 	.byte	0x14
 	.uleb128 0xc
-	.4byte	.LASF1486
+	.4byte	.LASF1488
 	.byte	0x15
 	.uleb128 0xc
-	.4byte	.LASF1487
+	.4byte	.LASF1489
 	.byte	0x16
 	.uleb128 0xc
-	.4byte	.LASF1488
+	.4byte	.LASF1490
 	.byte	0x17
 	.uleb128 0xc
-	.4byte	.LASF1489
+	.4byte	.LASF1491
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF1490
+	.4byte	.LASF1492
 	.byte	0x19
 	.uleb128 0xc
-	.4byte	.LASF1491
+	.4byte	.LASF1493
 	.byte	0x1a
 	.uleb128 0xc
-	.4byte	.LASF1492
+	.4byte	.LASF1494
 	.byte	0x1b
 	.uleb128 0xc
-	.4byte	.LASF1493
+	.4byte	.LASF1495
 	.byte	0x1c
 	.uleb128 0xc
-	.4byte	.LASF1494
+	.4byte	.LASF1496
 	.byte	0x1d
 	.uleb128 0xc
-	.4byte	.LASF1495
+	.4byte	.LASF1497
 	.byte	0x1e
 	.uleb128 0xc
-	.4byte	.LASF1496
+	.4byte	.LASF1498
 	.byte	0x1f
 	.uleb128 0xc
-	.4byte	.LASF1497
+	.4byte	.LASF1499
 	.byte	0x20
 	.uleb128 0xc
-	.4byte	.LASF1498
+	.4byte	.LASF1500
 	.byte	0x21
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1499
+	.4byte	.LASF1501
 	.byte	0x20
 	.byte	0x84
 	.byte	0xea
-	.4byte	0x61e5
+	.4byte	0x61fb
 	.uleb128 0xe
-	.4byte	.LASF1500
+	.4byte	.LASF1502
 	.byte	0x84
 	.byte	0xf3
 	.4byte	0x3f
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1501
+	.4byte	.LASF1503
 	.byte	0x84
 	.byte	0xf4
 	.4byte	0x3f
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1502
+	.4byte	.LASF1504
 	.byte	0x88
 	.byte	0x84
 	.byte	0xf7
-	.4byte	0x622e
+	.4byte	0x6244
 	.uleb128 0xe
-	.4byte	.LASF1503
+	.4byte	.LASF1505
 	.byte	0x84
 	.byte	0xf8
-	.4byte	0x622e
+	.4byte	0x6244
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1504
+	.4byte	.LASF1506
 	.byte	0x84
 	.byte	0xf9
-	.4byte	0x61c0
+	.4byte	0x61d6
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF1505
+	.4byte	.LASF1507
 	.byte	0x84
 	.byte	0xfb
 	.4byte	0x543
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF1506
+	.4byte	.LASF1508
 	.byte	0x84
 	.byte	0xfd
 	.4byte	0x29
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF1507
+	.4byte	.LASF1509
 	.byte	0x84
 	.byte	0xff
-	.4byte	0x63aa
+	.4byte	0x63c0
 	.byte	0x80
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x392
-	.4byte	0x623e
+	.4byte	0x6254
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x4
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF1508
+	.4byte	.LASF1510
 	.2byte	0x1680
 	.byte	0x84
 	.2byte	0x284
-	.4byte	0x63aa
+	.4byte	0x63c0
 	.uleb128 0x1b
-	.4byte	.LASF1509
+	.4byte	.LASF1511
 	.byte	0x84
 	.2byte	0x285
-	.4byte	0x673d
+	.4byte	0x6753
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1510
+	.4byte	.LASF1512
 	.byte	0x84
 	.2byte	0x286
-	.4byte	0x674d
+	.4byte	0x6763
 	.2byte	0x1380
 	.uleb128 0x1c
-	.4byte	.LASF1511
+	.4byte	.LASF1513
 	.byte	0x84
 	.2byte	0x287
 	.4byte	0xc6
 	.2byte	0x13c0
 	.uleb128 0x1c
-	.4byte	.LASF1512
+	.4byte	.LASF1514
 	.byte	0x84
 	.2byte	0x2a0
 	.4byte	0x29
 	.2byte	0x13c8
 	.uleb128 0x1c
-	.4byte	.LASF1513
+	.4byte	.LASF1515
 	.byte	0x84
 	.2byte	0x2a1
 	.4byte	0x29
 	.2byte	0x13d0
 	.uleb128 0x1c
-	.4byte	.LASF1514
+	.4byte	.LASF1516
 	.byte	0x84
 	.2byte	0x2a2
 	.4byte	0x29
 	.2byte	0x13d8
 	.uleb128 0x1c
-	.4byte	.LASF1515
+	.4byte	.LASF1517
 	.byte	0x84
 	.2byte	0x2a4
 	.4byte	0xc6
 	.2byte	0x13e0
 	.uleb128 0x1c
-	.4byte	.LASF1516
+	.4byte	.LASF1518
 	.byte	0x84
 	.2byte	0x2a5
-	.4byte	0x1594
+	.4byte	0x15aa
 	.2byte	0x13e8
 	.uleb128 0x1c
-	.4byte	.LASF1517
+	.4byte	.LASF1519
 	.byte	0x84
 	.2byte	0x2a6
-	.4byte	0x1594
+	.4byte	0x15aa
 	.2byte	0x1400
 	.uleb128 0x1c
-	.4byte	.LASF1518
+	.4byte	.LASF1520
 	.byte	0x84
 	.2byte	0x2a7
-	.4byte	0x2eda
+	.4byte	0x2ef0
 	.2byte	0x1418
 	.uleb128 0x1c
-	.4byte	.LASF1519
+	.4byte	.LASF1521
 	.byte	0x84
 	.2byte	0x2a9
 	.4byte	0xc6
 	.2byte	0x1420
 	.uleb128 0x1c
-	.4byte	.LASF1520
+	.4byte	.LASF1522
 	.byte	0x84
 	.2byte	0x2aa
-	.4byte	0x648b
+	.4byte	0x64a1
 	.2byte	0x1424
 	.uleb128 0x1c
-	.4byte	.LASF1521
+	.4byte	.LASF1523
 	.byte	0x84
 	.2byte	0x2ac
 	.4byte	0xc6
 	.2byte	0x1428
 	.uleb128 0x1c
-	.4byte	.LASF1522
+	.4byte	.LASF1524
 	.byte	0x84
 	.2byte	0x2af
 	.4byte	0xc6
 	.2byte	0x142c
 	.uleb128 0x1c
-	.4byte	.LASF1523
+	.4byte	.LASF1525
 	.byte	0x84
 	.2byte	0x2b0
-	.4byte	0x648b
+	.4byte	0x64a1
 	.2byte	0x1430
 	.uleb128 0x1c
-	.4byte	.LASF1524
+	.4byte	.LASF1526
 	.byte	0x84
 	.2byte	0x2b1
-	.4byte	0x1594
+	.4byte	0x15aa
 	.2byte	0x1438
 	.uleb128 0x1c
-	.4byte	.LASF1525
+	.4byte	.LASF1527
 	.byte	0x84
 	.2byte	0x2b2
-	.4byte	0x2eda
+	.4byte	0x2ef0
 	.2byte	0x1450
 	.uleb128 0x1c
-	.4byte	.LASF1526
+	.4byte	.LASF1528
 	.byte	0x84
 	.2byte	0x2b8
 	.4byte	0x29
 	.2byte	0x1458
 	.uleb128 0x1c
-	.4byte	.LASF1527
+	.4byte	.LASF1529
 	.byte	0x84
 	.2byte	0x2c3
-	.4byte	0x604c
+	.4byte	0x6062
 	.2byte	0x1480
 	.uleb128 0x1c
-	.4byte	.LASF1528
+	.4byte	.LASF1530
 	.byte	0x84
 	.2byte	0x2c4
 	.4byte	0xe50
 	.2byte	0x1480
 	.uleb128 0x1c
-	.4byte	.LASF1502
+	.4byte	.LASF1504
 	.byte	0x84
 	.2byte	0x2d7
-	.4byte	0x61e5
+	.4byte	0x61fb
 	.2byte	0x1488
 	.uleb128 0x1c
 	.4byte	.LASF170
@@ -21596,210 +21945,210 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.2byte	0x1510
 	.uleb128 0x1c
-	.4byte	.LASF1529
+	.4byte	.LASF1531
 	.byte	0x84
 	.2byte	0x2db
-	.4byte	0x604c
+	.4byte	0x6062
 	.2byte	0x1540
 	.uleb128 0x1c
-	.4byte	.LASF1530
+	.4byte	.LASF1532
 	.byte	0x84
 	.2byte	0x2de
-	.4byte	0x675d
+	.4byte	0x6773
 	.2byte	0x1540
 	.uleb128 0x1c
-	.4byte	.LASF1531
+	.4byte	.LASF1533
 	.byte	0x84
 	.2byte	0x2df
-	.4byte	0x6763
+	.4byte	0x6779
 	.2byte	0x1548
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x623e
+	.4byte	0x6254
 	.uleb128 0x13
-	.4byte	.LASF1532
+	.4byte	.LASF1534
 	.byte	0x84
 	.2byte	0x110
 	.4byte	0x6d
 	.uleb128 0x1d
-	.4byte	.LASF1533
+	.4byte	.LASF1535
 	.byte	0x50
 	.byte	0x84
 	.2byte	0x11d
-	.4byte	0x63fe
+	.4byte	0x6414
 	.uleb128 0x1b
-	.4byte	.LASF380
+	.4byte	.LASF382
 	.byte	0x84
 	.2byte	0x11e
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1534
+	.4byte	.LASF1536
 	.byte	0x84
 	.2byte	0x11f
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF1175
+	.4byte	.LASF1177
 	.byte	0x84
 	.2byte	0x120
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1503
+	.4byte	.LASF1505
 	.byte	0x84
 	.2byte	0x123
-	.4byte	0x63fe
+	.4byte	0x6414
 	.byte	0x10
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x392
-	.4byte	0x640e
+	.4byte	0x6424
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1535
+	.4byte	.LASF1537
 	.byte	0x60
 	.byte	0x84
 	.2byte	0x126
-	.4byte	0x6443
+	.4byte	0x6459
 	.uleb128 0x2b
 	.string	"pcp"
 	.byte	0x84
 	.2byte	0x127
-	.4byte	0x63bc
+	.4byte	0x63d2
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1536
+	.4byte	.LASF1538
 	.byte	0x84
 	.2byte	0x12d
 	.4byte	0x101
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1537
+	.4byte	.LASF1539
 	.byte	0x84
 	.2byte	0x12e
-	.4byte	0x6443
+	.4byte	0x6459
 	.byte	0x51
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x101
-	.4byte	0x6453
+	.4byte	0x6469
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xc
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1538
+	.4byte	.LASF1540
 	.byte	0x22
 	.byte	0x84
 	.2byte	0x132
-	.4byte	0x647b
+	.4byte	0x6491
 	.uleb128 0x1b
-	.4byte	.LASF1536
+	.4byte	.LASF1538
 	.byte	0x84
 	.2byte	0x133
 	.4byte	0x101
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1539
+	.4byte	.LASF1541
 	.byte	0x84
 	.2byte	0x134
-	.4byte	0x647b
+	.4byte	0x6491
 	.byte	0x1
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x101
-	.4byte	0x648b
+	.4byte	0x64a1
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x20
 	.byte	0
 	.uleb128 0x1e
-	.4byte	.LASF1540
+	.4byte	.LASF1542
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x84
 	.2byte	0x139
-	.4byte	0x64b5
+	.4byte	0x64cb
 	.uleb128 0xc
-	.4byte	.LASF1541
+	.4byte	.LASF1543
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1542
+	.4byte	.LASF1544
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1543
+	.4byte	.LASF1545
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF1544
+	.4byte	.LASF1546
 	.byte	0x3
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF1545
+	.4byte	.LASF1547
 	.2byte	0x680
 	.byte	0x84
 	.2byte	0x172
-	.4byte	0x6683
+	.4byte	0x6699
 	.uleb128 0x1b
-	.4byte	.LASF1546
+	.4byte	.LASF1548
 	.byte	0x84
 	.2byte	0x176
-	.4byte	0x6683
+	.4byte	0x6699
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1547
+	.4byte	.LASF1549
 	.byte	0x84
 	.2byte	0x178
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1548
+	.4byte	.LASF1550
 	.byte	0x84
 	.2byte	0x183
-	.4byte	0x6693
+	.4byte	0x66a9
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1549
+	.4byte	.LASF1551
 	.byte	0x84
 	.2byte	0x188
-	.4byte	0x63aa
+	.4byte	0x63c0
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1550
+	.4byte	.LASF1552
 	.byte	0x84
 	.2byte	0x189
-	.4byte	0x66a3
+	.4byte	0x66b9
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1551
+	.4byte	.LASF1553
 	.byte	0x84
 	.2byte	0x18c
 	.4byte	0x29b
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1552
+	.4byte	.LASF1554
 	.byte	0x84
 	.2byte	0x198
 	.4byte	0x29
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1553
+	.4byte	.LASF1555
 	.byte	0x84
 	.2byte	0x1c3
 	.4byte	0x29
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1554
+	.4byte	.LASF1556
 	.byte	0x84
 	.2byte	0x1c4
 	.4byte	0x29
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1555
+	.4byte	.LASF1557
 	.byte	0x84
 	.2byte	0x1c5
 	.4byte	0x29
@@ -21811,28 +22160,28 @@ __exitcall_ebc_exit:
 	.4byte	0x56
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1556
+	.4byte	.LASF1558
 	.byte	0x84
 	.2byte	0x1cf
 	.4byte	0x29
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1557
+	.4byte	.LASF1559
 	.byte	0x84
 	.2byte	0x1d7
 	.4byte	0xc6
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1527
+	.4byte	.LASF1529
 	.byte	0x84
 	.2byte	0x1da
-	.4byte	0x604c
+	.4byte	0x6062
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF1443
+	.4byte	.LASF1445
 	.byte	0x84
 	.2byte	0x1dd
-	.4byte	0x66a9
+	.4byte	0x66bf
 	.byte	0xc0
 	.uleb128 0x1c
 	.4byte	.LASF170
@@ -21847,76 +22196,76 @@ __exitcall_ebc_exit:
 	.4byte	0xe50
 	.2byte	0x540
 	.uleb128 0x1c
-	.4byte	.LASF1529
+	.4byte	.LASF1531
 	.byte	0x84
 	.2byte	0x1e6
-	.4byte	0x604c
+	.4byte	0x6062
 	.2byte	0x580
 	.uleb128 0x1c
-	.4byte	.LASF1558
+	.4byte	.LASF1560
 	.byte	0x84
 	.2byte	0x1ed
 	.4byte	0x29
 	.2byte	0x580
 	.uleb128 0x1c
-	.4byte	.LASF1559
+	.4byte	.LASF1561
 	.byte	0x84
 	.2byte	0x1f1
 	.4byte	0x29
 	.2byte	0x588
 	.uleb128 0x1c
-	.4byte	.LASF1560
+	.4byte	.LASF1562
 	.byte	0x84
 	.2byte	0x1f3
 	.4byte	0x3f
 	.2byte	0x590
 	.uleb128 0x1c
-	.4byte	.LASF1561
+	.4byte	.LASF1563
 	.byte	0x84
 	.2byte	0x1fc
 	.4byte	0x6d
 	.2byte	0x5a0
 	.uleb128 0x1c
-	.4byte	.LASF1562
+	.4byte	.LASF1564
 	.byte	0x84
 	.2byte	0x1fd
 	.4byte	0x6d
 	.2byte	0x5a4
 	.uleb128 0x1c
-	.4byte	.LASF1563
+	.4byte	.LASF1565
 	.byte	0x84
 	.2byte	0x1fe
 	.4byte	0xc6
 	.2byte	0x5a8
 	.uleb128 0x1c
-	.4byte	.LASF1564
+	.4byte	.LASF1566
 	.byte	0x84
 	.2byte	0x203
 	.4byte	0x29b
 	.2byte	0x5ac
 	.uleb128 0x1c
-	.4byte	.LASF1565
+	.4byte	.LASF1567
 	.byte	0x84
 	.2byte	0x206
 	.4byte	0x29b
 	.2byte	0x5ad
 	.uleb128 0x1c
-	.4byte	.LASF1566
+	.4byte	.LASF1568
 	.byte	0x84
 	.2byte	0x208
-	.4byte	0x604c
+	.4byte	0x6062
 	.2byte	0x5c0
 	.uleb128 0x1c
-	.4byte	.LASF1531
+	.4byte	.LASF1533
 	.byte	0x84
 	.2byte	0x20a
-	.4byte	0x66b9
+	.4byte	0x66cf
 	.2byte	0x5c0
 	.uleb128 0x1c
-	.4byte	.LASF1567
+	.4byte	.LASF1569
 	.byte	0x84
 	.2byte	0x20b
-	.4byte	0x66c9
+	.4byte	0x66df
 	.2byte	0x628
 	.uleb128 0x1c
 	.4byte	.LASF129
@@ -21945,55 +22294,55 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0x6693
+	.4byte	0x66a9
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x194
-	.4byte	0x66a3
+	.4byte	0x66b9
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x640e
+	.4byte	0x6424
 	.uleb128 0x5
-	.4byte	0x6017
-	.4byte	0x66b9
+	.4byte	0x602d
+	.4byte	0x66cf
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xa
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x543
-	.4byte	0x66c9
+	.4byte	0x66df
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xc
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x543
-	.4byte	0x66d8
+	.4byte	0x66ee
 	.uleb128 0x44
 	.4byte	0x4f
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1568
+	.4byte	.LASF1570
 	.byte	0x10
 	.byte	0x84
 	.2byte	0x25f
-	.4byte	0x6700
+	.4byte	0x6716
 	.uleb128 0x1b
-	.4byte	.LASF1545
+	.4byte	.LASF1547
 	.byte	0x84
 	.2byte	0x260
-	.4byte	0x6700
+	.4byte	0x6716
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1569
+	.4byte	.LASF1571
 	.byte	0x84
 	.2byte	0x261
 	.4byte	0xc6
@@ -22001,69 +22350,69 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x64b5
+	.4byte	0x64cb
 	.uleb128 0x1d
-	.4byte	.LASF1570
+	.4byte	.LASF1572
 	.byte	0x40
 	.byte	0x84
 	.2byte	0x272
-	.4byte	0x6721
+	.4byte	0x6737
 	.uleb128 0x1b
-	.4byte	.LASF1571
+	.4byte	.LASF1573
 	.byte	0x84
 	.2byte	0x273
-	.4byte	0x6721
+	.4byte	0x6737
 	.byte	0
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x66d8
-	.4byte	0x6731
+	.4byte	0x66ee
+	.4byte	0x6747
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF1572
+	.4byte	.LASF1574
 	.byte	0x84
 	.2byte	0x278
-	.4byte	0x343e
+	.4byte	0x3454
 	.uleb128 0x5
-	.4byte	0x64b5
-	.4byte	0x674d
+	.4byte	0x64cb
+	.4byte	0x6763
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x6706
-	.4byte	0x675d
+	.4byte	0x671c
+	.4byte	0x6773
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6453
+	.4byte	0x6469
 	.uleb128 0x5
 	.4byte	0x543
-	.4byte	0x6773
+	.4byte	0x6789
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x20
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1573
+	.4byte	.LASF1575
 	.byte	0x21
 	.byte	0x33
-	.4byte	0x677e
+	.4byte	0x6794
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6784
+	.4byte	0x679a
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x679d
+	.4byte	0x67b3
 	.uleb128 0x11
-	.4byte	0x679d
+	.4byte	0x67b3
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
@@ -22071,208 +22420,208 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x67a3
+	.4byte	0x67b9
 	.uleb128 0xd
-	.4byte	.LASF1574
+	.4byte	.LASF1576
 	.byte	0x18
 	.byte	0x21
 	.byte	0x36
-	.4byte	0x67d4
+	.4byte	0x67ea
 	.uleb128 0xe
-	.4byte	.LASF1575
+	.4byte	.LASF1577
 	.byte	0x21
 	.byte	0x37
-	.4byte	0x6773
+	.4byte	0x6789
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF63
 	.byte	0x21
 	.byte	0x38
-	.4byte	0x679d
+	.4byte	0x67b3
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1576
+	.4byte	.LASF1578
 	.byte	0x21
 	.byte	0x39
 	.4byte	0xc6
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1577
+	.4byte	.LASF1579
 	.byte	0x38
 	.byte	0x21
 	.byte	0x41
-	.4byte	0x67f9
+	.4byte	0x680f
 	.uleb128 0xe
-	.4byte	.LASF1578
+	.4byte	.LASF1580
 	.byte	0x21
 	.byte	0x42
-	.4byte	0x4e0b
+	.4byte	0x4e21
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF135
 	.byte	0x21
 	.byte	0x43
-	.4byte	0x679d
+	.4byte	0x67b3
 	.byte	0x30
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1579
+	.4byte	.LASF1581
 	.byte	0x21
 	.byte	0xee
-	.4byte	0x67d4
+	.4byte	0x67ea
 	.uleb128 0x15
-	.4byte	.LASF1580
+	.4byte	.LASF1582
 	.byte	0x84
 	.2byte	0x368
 	.4byte	0xc6
 	.uleb128 0x5
 	.4byte	0xc6
-	.4byte	0x6820
+	.4byte	0x6836
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF1581
+	.4byte	.LASF1583
 	.byte	0x84
 	.2byte	0x394
-	.4byte	0x6810
+	.4byte	0x6826
 	.uleb128 0x15
-	.4byte	.LASF1582
+	.4byte	.LASF1584
 	.byte	0x84
 	.2byte	0x3a0
 	.4byte	0x4eb
 	.uleb128 0x15
-	.4byte	.LASF1583
+	.4byte	.LASF1585
 	.byte	0x84
 	.2byte	0x3a5
-	.4byte	0x623e
+	.4byte	0x6254
 	.uleb128 0x1d
-	.4byte	.LASF1584
+	.4byte	.LASF1586
 	.byte	0x10
 	.byte	0x84
 	.2byte	0x469
-	.4byte	0x686c
+	.4byte	0x6882
 	.uleb128 0x1b
-	.4byte	.LASF1585
+	.4byte	.LASF1587
 	.byte	0x84
 	.2byte	0x476
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1586
+	.4byte	.LASF1588
 	.byte	0x84
 	.2byte	0x479
-	.4byte	0x686c
+	.4byte	0x6882
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x29
 	.uleb128 0x15
-	.4byte	.LASF1584
+	.4byte	.LASF1586
 	.byte	0x84
 	.2byte	0x493
-	.4byte	0x687e
+	.4byte	0x6894
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6884
+	.4byte	0x689a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6844
+	.4byte	0x685a
 	.uleb128 0x15
-	.4byte	.LASF1587
+	.4byte	.LASF1589
 	.byte	0x84
 	.2byte	0x4ea
 	.4byte	0xc6
 	.uleb128 0xd
-	.4byte	.LASF1588
+	.4byte	.LASF1590
 	.byte	0x28
 	.byte	0x85
 	.byte	0x7
-	.4byte	0x68f7
+	.4byte	0x690d
 	.uleb128 0xe
-	.4byte	.LASF1589
+	.4byte	.LASF1591
 	.byte	0x85
 	.byte	0x8
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1590
+	.4byte	.LASF1592
 	.byte	0x85
 	.byte	0x9
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1591
+	.4byte	.LASF1593
 	.byte	0x85
 	.byte	0xa
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1592
+	.4byte	.LASF1594
 	.byte	0x85
 	.byte	0xb
 	.4byte	0xc6
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF1593
+	.4byte	.LASF1595
 	.byte	0x85
 	.byte	0xc
-	.4byte	0x15bd
+	.4byte	0x15d3
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1594
+	.4byte	.LASF1596
 	.byte	0x85
 	.byte	0xd
-	.4byte	0x15bd
+	.4byte	0x15d3
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1595
+	.4byte	.LASF1597
 	.byte	0x85
 	.byte	0xe
-	.4byte	0x15bd
+	.4byte	0x15d3
 	.byte	0x20
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x6896
-	.4byte	0x6907
+	.4byte	0x68ac
+	.4byte	0x691d
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x7
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1588
+	.4byte	.LASF1590
 	.byte	0x85
 	.byte	0x11
-	.4byte	0x68f7
+	.4byte	0x690d
 	.uleb128 0x19
-	.4byte	.LASF1596
+	.4byte	.LASF1598
 	.byte	0x86
 	.byte	0x11
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF1597
+	.4byte	.LASF1599
 	.byte	0x86
 	.byte	0x1c
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF1598
+	.4byte	.LASF1600
 	.byte	0x86
 	.byte	0x24
 	.4byte	0x29
 	.uleb128 0x15
-	.4byte	.LASF1599
+	.4byte	.LASF1601
 	.byte	0x87
 	.2byte	0x259
 	.4byte	0x31b
 	.uleb128 0xd
-	.4byte	.LASF1600
+	.4byte	.LASF1602
 	.byte	0x28
 	.byte	0x88
 	.byte	0x14
-	.4byte	0x697c
+	.4byte	0x6992
 	.uleb128 0xe
 	.4byte	.LASF115
 	.byte	0x88
@@ -22280,116 +22629,116 @@ __exitcall_ebc_exit:
 	.4byte	0xe1e
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF380
+	.4byte	.LASF382
 	.byte	0x88
 	.byte	0x16
 	.4byte	0x14a
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF959
+	.4byte	.LASF961
 	.byte	0x88
 	.byte	0x18
 	.4byte	0x392
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1242
+	.4byte	.LASF1244
 	.byte	0x88
 	.byte	0x1a
-	.4byte	0x697c
+	.4byte	0x6992
 	.byte	0x20
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x12a
 	.uleb128 0x19
-	.4byte	.LASF1601
+	.4byte	.LASF1603
 	.byte	0x88
 	.byte	0x1d
 	.4byte	0xc6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6993
+	.4byte	0x69a9
 	.uleb128 0x1d
-	.4byte	.LASF1602
+	.4byte	.LASF1604
 	.byte	0xd0
 	.byte	0x89
 	.2byte	0x126
-	.4byte	0x6a3d
+	.4byte	0x6a53
 	.uleb128 0x1b
-	.4byte	.LASF1603
+	.4byte	.LASF1605
 	.byte	0x89
 	.2byte	0x127
 	.4byte	0x3d6
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1604
+	.4byte	.LASF1606
 	.byte	0x89
 	.2byte	0x128
 	.4byte	0x392
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1605
+	.4byte	.LASF1607
 	.byte	0x89
 	.2byte	0x129
 	.4byte	0x392
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1606
+	.4byte	.LASF1608
 	.byte	0x89
 	.2byte	0x12a
 	.4byte	0x392
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1607
+	.4byte	.LASF1609
 	.byte	0x89
 	.2byte	0x12b
-	.4byte	0x243f
+	.4byte	0x2455
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1608
+	.4byte	.LASF1610
 	.byte	0x89
 	.2byte	0x12c
 	.4byte	0xe50
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1609
+	.4byte	.LASF1611
 	.byte	0x89
 	.2byte	0x12d
 	.4byte	0x367
 	.byte	0x64
 	.uleb128 0x1b
-	.4byte	.LASF1610
+	.4byte	.LASF1612
 	.byte	0x89
 	.2byte	0x12e
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1611
+	.4byte	.LASF1613
 	.byte	0x89
 	.2byte	0x12f
-	.4byte	0x6ac0
+	.4byte	0x6ad6
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1612
+	.4byte	.LASF1614
 	.byte	0x89
 	.2byte	0x130
 	.4byte	0x2c3
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1613
+	.4byte	.LASF1615
 	.byte	0x89
 	.2byte	0x131
 	.4byte	0x29
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1614
+	.4byte	.LASF1616
 	.byte	0x89
 	.2byte	0x132
-	.4byte	0x6aea
+	.4byte	0x6b00
 	.byte	0x88
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1615
+	.4byte	.LASF1617
 	.byte	0x8a
 	.byte	0x14
 	.4byte	0x1b6
@@ -22397,38 +22746,38 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x8a
 	.byte	0x16
-	.4byte	0x6a5d
+	.4byte	0x6a73
 	.uleb128 0x20
 	.string	"val"
 	.byte	0x8a
 	.byte	0x17
-	.4byte	0x6a3d
+	.4byte	0x6a53
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1616
+	.4byte	.LASF1618
 	.byte	0x8a
 	.byte	0x18
-	.4byte	0x6a48
+	.4byte	0x6a5e
 	.uleb128 0x1f
-	.4byte	.LASF1617
+	.4byte	.LASF1619
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x89
 	.byte	0x36
-	.4byte	0x6a8b
+	.4byte	0x6aa1
 	.uleb128 0xc
-	.4byte	.LASF1618
+	.4byte	.LASF1620
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1619
+	.4byte	.LASF1621
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1620
+	.4byte	.LASF1622
 	.byte	0x2
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1621
+	.4byte	.LASF1623
 	.byte	0x89
 	.byte	0x42
 	.4byte	0xe8
@@ -22436,284 +22785,284 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x89
 	.byte	0x45
-	.4byte	0x6ac0
+	.4byte	0x6ad6
 	.uleb128 0x28
 	.string	"uid"
 	.byte	0x89
 	.byte	0x46
-	.4byte	0x23e5
+	.4byte	0x23fb
 	.uleb128 0x28
 	.string	"gid"
 	.byte	0x89
 	.byte	0x47
-	.4byte	0x2405
+	.4byte	0x241b
 	.uleb128 0x22
-	.4byte	.LASF1622
+	.4byte	.LASF1624
 	.byte	0x89
 	.byte	0x48
-	.4byte	0x6a5d
+	.4byte	0x6a73
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1623
+	.4byte	.LASF1625
 	.byte	0x8
 	.byte	0x89
 	.byte	0x44
-	.4byte	0x6adf
+	.4byte	0x6af5
 	.uleb128 0x23
-	.4byte	0x6a96
+	.4byte	0x6aac
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF192
 	.byte	0x89
 	.byte	0x4a
-	.4byte	0x6a68
+	.4byte	0x6a7e
 	.byte	0x4
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1624
+	.4byte	.LASF1626
 	.byte	0x89
 	.byte	0xc1
 	.4byte	0xe50
 	.uleb128 0xd
-	.4byte	.LASF1625
+	.4byte	.LASF1627
 	.byte	0x48
 	.byte	0x89
 	.byte	0xcd
-	.4byte	0x6b63
+	.4byte	0x6b79
 	.uleb128 0xe
-	.4byte	.LASF1626
+	.4byte	.LASF1628
 	.byte	0x89
 	.byte	0xce
-	.4byte	0x6a8b
+	.4byte	0x6aa1
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1627
+	.4byte	.LASF1629
 	.byte	0x89
 	.byte	0xcf
-	.4byte	0x6a8b
+	.4byte	0x6aa1
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1628
+	.4byte	.LASF1630
 	.byte	0x89
 	.byte	0xd0
-	.4byte	0x6a8b
+	.4byte	0x6aa1
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1629
+	.4byte	.LASF1631
 	.byte	0x89
 	.byte	0xd1
-	.4byte	0x6a8b
+	.4byte	0x6aa1
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1630
+	.4byte	.LASF1632
 	.byte	0x89
 	.byte	0xd2
-	.4byte	0x6a8b
+	.4byte	0x6aa1
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1631
+	.4byte	.LASF1633
 	.byte	0x89
 	.byte	0xd3
-	.4byte	0x6a8b
+	.4byte	0x6aa1
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1632
+	.4byte	.LASF1634
 	.byte	0x89
 	.byte	0xd4
-	.4byte	0x6a8b
+	.4byte	0x6aa1
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1633
+	.4byte	.LASF1635
 	.byte	0x89
 	.byte	0xd5
 	.4byte	0x9bd
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF1634
+	.4byte	.LASF1636
 	.byte	0x89
 	.byte	0xd6
 	.4byte	0x9bd
 	.byte	0x40
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1635
+	.4byte	.LASF1637
 	.byte	0x48
 	.byte	0x89
 	.byte	0xde
-	.4byte	0x6bdc
+	.4byte	0x6bf2
 	.uleb128 0xe
-	.4byte	.LASF1636
+	.4byte	.LASF1638
 	.byte	0x89
 	.byte	0xdf
-	.4byte	0x6c1e
+	.4byte	0x6c34
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1637
+	.4byte	.LASF1639
 	.byte	0x89
 	.byte	0xe0
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1638
+	.4byte	.LASF1640
 	.byte	0x89
 	.byte	0xe2
 	.4byte	0x392
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1639
+	.4byte	.LASF1641
 	.byte	0x89
 	.byte	0xe3
 	.4byte	0x29
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1640
+	.4byte	.LASF1642
 	.byte	0x89
 	.byte	0xe4
 	.4byte	0x6d
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1641
+	.4byte	.LASF1643
 	.byte	0x89
 	.byte	0xe5
 	.4byte	0x6d
 	.byte	0x2c
 	.uleb128 0xe
-	.4byte	.LASF1642
+	.4byte	.LASF1644
 	.byte	0x89
 	.byte	0xe6
-	.4byte	0x6a8b
+	.4byte	0x6aa1
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1643
+	.4byte	.LASF1645
 	.byte	0x89
 	.byte	0xe7
-	.4byte	0x6a8b
+	.4byte	0x6aa1
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF1644
+	.4byte	.LASF1646
 	.byte	0x89
 	.byte	0xe8
 	.4byte	0x443
 	.byte	0x40
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1645
+	.4byte	.LASF1647
 	.byte	0x20
 	.byte	0x89
 	.2byte	0x1c4
-	.4byte	0x6c1e
+	.4byte	0x6c34
 	.uleb128 0x1b
-	.4byte	.LASF1646
+	.4byte	.LASF1648
 	.byte	0x89
 	.2byte	0x1c5
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1647
+	.4byte	.LASF1649
 	.byte	0x89
 	.2byte	0x1c6
-	.4byte	0x7228
+	.4byte	0x723e
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1648
+	.4byte	.LASF1650
 	.byte	0x89
 	.2byte	0x1c7
-	.4byte	0x7550
+	.4byte	0x7566
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1649
+	.4byte	.LASF1651
 	.byte	0x89
 	.2byte	0x1c8
-	.4byte	0x6c1e
+	.4byte	0x6c34
 	.byte	0x18
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6bdc
+	.4byte	0x6bf2
 	.uleb128 0x1a
-	.4byte	.LASF1650
+	.4byte	.LASF1652
 	.2byte	0x180
 	.byte	0x89
 	.2byte	0x109
-	.4byte	0x6c4d
+	.4byte	0x6c63
 	.uleb128 0x1b
-	.4byte	.LASF1651
+	.4byte	.LASF1653
 	.byte	0x89
 	.2byte	0x10a
-	.4byte	0x2f26
+	.4byte	0x2f3c
 	.byte	0
 	.uleb128 0x1b
 	.4byte	.LASF58
 	.byte	0x89
 	.2byte	0x10b
-	.4byte	0x6c4d
+	.4byte	0x6c63
 	.byte	0x40
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x693f
-	.4byte	0x6c5d
+	.4byte	0x6955
+	.4byte	0x6c73
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x7
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF1650
+	.4byte	.LASF1652
 	.byte	0x89
 	.2byte	0x10e
-	.4byte	0x6c24
+	.4byte	0x6c3a
 	.uleb128 0x1d
-	.4byte	.LASF1652
+	.4byte	.LASF1654
 	.byte	0x50
 	.byte	0x89
 	.2byte	0x136
-	.4byte	0x6cf9
+	.4byte	0x6d0f
 	.uleb128 0x1b
-	.4byte	.LASF1653
+	.4byte	.LASF1655
 	.byte	0x89
 	.2byte	0x137
-	.4byte	0x6d12
+	.4byte	0x6d28
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1654
+	.4byte	.LASF1656
 	.byte	0x89
 	.2byte	0x138
-	.4byte	0x6d12
+	.4byte	0x6d28
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1655
+	.4byte	.LASF1657
 	.byte	0x89
 	.2byte	0x139
-	.4byte	0x6d12
+	.4byte	0x6d28
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1656
+	.4byte	.LASF1658
 	.byte	0x89
 	.2byte	0x13a
-	.4byte	0x6d12
+	.4byte	0x6d28
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1657
+	.4byte	.LASF1659
 	.byte	0x89
 	.2byte	0x13b
-	.4byte	0x6d27
+	.4byte	0x6d3d
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1658
+	.4byte	.LASF1660
 	.byte	0x89
 	.2byte	0x13c
-	.4byte	0x6d27
+	.4byte	0x6d3d
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1659
+	.4byte	.LASF1661
 	.byte	0x89
 	.2byte	0x13d
-	.4byte	0x6d27
+	.4byte	0x6d3d
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1660
+	.4byte	.LASF1662
 	.byte	0x89
 	.2byte	0x13e
-	.4byte	0x6d47
+	.4byte	0x6d5d
 	.byte	0x38
 	.uleb128 0x1b
 	.4byte	.LASF129
@@ -22729,112 +23078,112 @@ __exitcall_ebc_exit:
 	.byte	0x48
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x6c69
+	.4byte	0x6c7f
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x6d12
+	.4byte	0x6d28
 	.uleb128 0x11
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6cfe
+	.4byte	0x6d14
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x6d27
+	.4byte	0x6d3d
 	.uleb128 0x11
-	.4byte	0x698d
+	.4byte	0x69a3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6d18
+	.4byte	0x6d2e
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x6d41
+	.4byte	0x6d57
 	.uleb128 0x11
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.uleb128 0x11
-	.4byte	0x6d41
+	.4byte	0x6d57
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6ac0
+	.4byte	0x6ad6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6d2d
+	.4byte	0x6d43
 	.uleb128 0x1d
-	.4byte	.LASF1661
+	.4byte	.LASF1663
 	.byte	0x68
 	.byte	0x89
 	.2byte	0x145
-	.4byte	0x6e04
+	.4byte	0x6e1a
 	.uleb128 0x1b
-	.4byte	.LASF1662
+	.4byte	.LASF1664
 	.byte	0x89
 	.2byte	0x146
-	.4byte	0x6d27
+	.4byte	0x6d3d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1663
+	.4byte	.LASF1665
 	.byte	0x89
 	.2byte	0x147
-	.4byte	0x6e1d
+	.4byte	0x6e33
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1664
+	.4byte	.LASF1666
 	.byte	0x89
 	.2byte	0x148
-	.4byte	0x6e2e
+	.4byte	0x6e44
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1665
+	.4byte	.LASF1667
 	.byte	0x89
 	.2byte	0x149
-	.4byte	0x6d27
+	.4byte	0x6d3d
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1666
+	.4byte	.LASF1668
 	.byte	0x89
 	.2byte	0x14a
-	.4byte	0x6d27
+	.4byte	0x6d3d
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1667
+	.4byte	.LASF1669
 	.byte	0x89
 	.2byte	0x14b
-	.4byte	0x6d27
+	.4byte	0x6d3d
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1668
+	.4byte	.LASF1670
 	.byte	0x89
 	.2byte	0x14c
-	.4byte	0x6d12
+	.4byte	0x6d28
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1669
+	.4byte	.LASF1671
 	.byte	0x89
 	.2byte	0x14f
-	.4byte	0x6e49
+	.4byte	0x6e5f
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1670
+	.4byte	.LASF1672
 	.byte	0x89
 	.2byte	0x150
-	.4byte	0x6e69
+	.4byte	0x6e7f
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1671
+	.4byte	.LASF1673
 	.byte	0x89
 	.2byte	0x152
-	.4byte	0x6e83
+	.4byte	0x6e99
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1660
+	.4byte	.LASF1662
 	.byte	0x89
 	.2byte	0x154
-	.4byte	0x6d47
+	.4byte	0x6d5d
 	.byte	0x50
 	.uleb128 0x1b
 	.4byte	.LASF129
@@ -22850,172 +23199,172 @@ __exitcall_ebc_exit:
 	.byte	0x60
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x6d4d
+	.4byte	0x6d63
 	.uleb128 0x14
-	.4byte	0x698d
-	.4byte	0x6e1d
+	.4byte	0x69a3
+	.4byte	0x6e33
 	.uleb128 0x11
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6e09
+	.4byte	0x6e1f
 	.uleb128 0x10
-	.4byte	0x6e2e
+	.4byte	0x6e44
 	.uleb128 0x11
-	.4byte	0x698d
+	.4byte	0x69a3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6e23
+	.4byte	0x6e39
 	.uleb128 0x14
-	.4byte	0x6e43
-	.4byte	0x6e43
+	.4byte	0x6e59
+	.4byte	0x6e59
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6a8b
+	.4byte	0x6aa1
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6e34
+	.4byte	0x6e4a
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x6e63
+	.4byte	0x6e79
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
-	.4byte	0x6e63
+	.4byte	0x6e79
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6a5d
+	.4byte	0x6a73
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6e4f
+	.4byte	0x6e65
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x6e83
+	.4byte	0x6e99
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
-	.4byte	0x6e43
+	.4byte	0x6e59
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6e6f
+	.4byte	0x6e85
 	.uleb128 0x1d
-	.4byte	.LASF1672
+	.4byte	.LASF1674
 	.byte	0x78
 	.byte	0x89
 	.2byte	0x15d
-	.4byte	0x6f67
+	.4byte	0x6f7d
 	.uleb128 0x1b
-	.4byte	.LASF1673
+	.4byte	.LASF1675
 	.byte	0x89
 	.2byte	0x15e
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1674
+	.4byte	.LASF1676
 	.byte	0x89
 	.2byte	0x15f
 	.4byte	0x155
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1675
+	.4byte	.LASF1677
 	.byte	0x89
 	.2byte	0x160
 	.4byte	0x155
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1676
+	.4byte	.LASF1678
 	.byte	0x89
 	.2byte	0x161
 	.4byte	0x155
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1677
+	.4byte	.LASF1679
 	.byte	0x89
 	.2byte	0x162
 	.4byte	0x155
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1678
+	.4byte	.LASF1680
 	.byte	0x89
 	.2byte	0x163
 	.4byte	0x155
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1679
+	.4byte	.LASF1681
 	.byte	0x89
 	.2byte	0x164
 	.4byte	0x155
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1680
+	.4byte	.LASF1682
 	.byte	0x89
 	.2byte	0x165
 	.4byte	0x14a
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1681
+	.4byte	.LASF1683
 	.byte	0x89
 	.2byte	0x167
 	.4byte	0x14a
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1682
+	.4byte	.LASF1684
 	.byte	0x89
 	.2byte	0x168
 	.4byte	0xc6
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1683
+	.4byte	.LASF1685
 	.byte	0x89
 	.2byte	0x169
 	.4byte	0xc6
 	.byte	0x4c
 	.uleb128 0x1b
-	.4byte	.LASF1684
+	.4byte	.LASF1686
 	.byte	0x89
 	.2byte	0x16a
 	.4byte	0x155
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1685
+	.4byte	.LASF1687
 	.byte	0x89
 	.2byte	0x16b
 	.4byte	0x155
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1686
+	.4byte	.LASF1688
 	.byte	0x89
 	.2byte	0x16c
 	.4byte	0x155
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1687
+	.4byte	.LASF1689
 	.byte	0x89
 	.2byte	0x16d
 	.4byte	0x14a
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1688
+	.4byte	.LASF1690
 	.byte	0x89
 	.2byte	0x16e
 	.4byte	0xc6
 	.byte	0x70
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1689
+	.4byte	.LASF1691
 	.byte	0x38
 	.byte	0x89
 	.2byte	0x191
-	.4byte	0x6ff7
+	.4byte	0x700d
 	.uleb128 0x1b
 	.4byte	.LASF170
 	.byte	0x89
@@ -23023,37 +23372,37 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1690
+	.4byte	.LASF1692
 	.byte	0x89
 	.2byte	0x193
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF1691
+	.4byte	.LASF1693
 	.byte	0x89
 	.2byte	0x195
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1692
+	.4byte	.LASF1694
 	.byte	0x89
 	.2byte	0x196
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF1693
+	.4byte	.LASF1695
 	.byte	0x89
 	.2byte	0x197
 	.4byte	0x6d
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1694
+	.4byte	.LASF1696
 	.byte	0x89
 	.2byte	0x198
 	.4byte	0x6d
 	.byte	0x14
 	.uleb128 0x1b
-	.4byte	.LASF1695
+	.4byte	.LASF1697
 	.byte	0x89
 	.2byte	0x199
 	.4byte	0x6d
@@ -23065,170 +23414,170 @@ __exitcall_ebc_exit:
 	.4byte	0xfa
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1166
+	.4byte	.LASF1168
 	.byte	0x89
 	.2byte	0x19b
 	.4byte	0x305
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1696
+	.4byte	.LASF1698
 	.byte	0x89
 	.2byte	0x19c
 	.4byte	0x305
 	.byte	0x30
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1697
+	.4byte	.LASF1699
 	.byte	0xb0
 	.byte	0x89
 	.2byte	0x19f
-	.4byte	0x701f
+	.4byte	0x7035
 	.uleb128 0x1b
-	.4byte	.LASF1698
+	.4byte	.LASF1700
 	.byte	0x89
 	.2byte	0x1a0
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1699
+	.4byte	.LASF1701
 	.byte	0x89
 	.2byte	0x1a1
-	.4byte	0x701f
+	.4byte	0x7035
 	.byte	0x8
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x6f67
-	.4byte	0x702f
+	.4byte	0x6f7d
+	.4byte	0x7045
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1700
+	.4byte	.LASF1702
 	.byte	0x20
 	.byte	0x89
 	.2byte	0x1a5
-	.4byte	0x70a5
+	.4byte	0x70bb
 	.uleb128 0x1b
-	.4byte	.LASF1701
+	.4byte	.LASF1703
 	.byte	0x89
 	.2byte	0x1a6
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF420
+	.4byte	.LASF422
 	.byte	0x89
 	.2byte	0x1a7
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF1702
+	.4byte	.LASF1704
 	.byte	0x89
 	.2byte	0x1a8
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1703
+	.4byte	.LASF1705
 	.byte	0x89
 	.2byte	0x1aa
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF1704
+	.4byte	.LASF1706
 	.byte	0x89
 	.2byte	0x1ab
 	.4byte	0x6d
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1705
+	.4byte	.LASF1707
 	.byte	0x89
 	.2byte	0x1ac
 	.4byte	0x6d
 	.byte	0x14
 	.uleb128 0x1b
-	.4byte	.LASF1706
+	.4byte	.LASF1708
 	.byte	0x89
 	.2byte	0x1ad
 	.4byte	0x6d
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1707
+	.4byte	.LASF1709
 	.byte	0x89
 	.2byte	0x1ae
 	.4byte	0x6d
 	.byte	0x1c
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1708
+	.4byte	.LASF1710
 	.byte	0x68
 	.byte	0x89
 	.2byte	0x1b2
-	.4byte	0x715c
+	.4byte	0x7172
 	.uleb128 0x1b
-	.4byte	.LASF1709
+	.4byte	.LASF1711
 	.byte	0x89
 	.2byte	0x1b3
-	.4byte	0x717f
+	.4byte	0x7195
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1710
+	.4byte	.LASF1712
 	.byte	0x89
 	.2byte	0x1b4
-	.4byte	0x6d12
+	.4byte	0x6d28
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1711
+	.4byte	.LASF1713
 	.byte	0x89
 	.2byte	0x1b5
-	.4byte	0x7199
+	.4byte	0x71af
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1712
+	.4byte	.LASF1714
 	.byte	0x89
 	.2byte	0x1b6
-	.4byte	0x7199
+	.4byte	0x71af
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1713
+	.4byte	.LASF1715
 	.byte	0x89
 	.2byte	0x1b7
-	.4byte	0x6d12
+	.4byte	0x6d28
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1714
+	.4byte	.LASF1716
 	.byte	0x89
 	.2byte	0x1b8
-	.4byte	0x71be
+	.4byte	0x71d4
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1715
+	.4byte	.LASF1717
 	.byte	0x89
 	.2byte	0x1b9
-	.4byte	0x71e3
+	.4byte	0x71f9
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1716
+	.4byte	.LASF1718
 	.byte	0x89
 	.2byte	0x1ba
-	.4byte	0x7202
+	.4byte	0x7218
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1717
+	.4byte	.LASF1719
 	.byte	0x89
 	.2byte	0x1bc
-	.4byte	0x71e3
+	.4byte	0x71f9
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1718
+	.4byte	.LASF1720
 	.byte	0x89
 	.2byte	0x1bd
-	.4byte	0x7222
+	.4byte	0x7238
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1719
+	.4byte	.LASF1721
 	.byte	0x89
 	.2byte	0x1be
-	.4byte	0x7199
+	.4byte	0x71af
 	.byte	0x50
 	.uleb128 0x1b
 	.4byte	.LASF129
@@ -23244,109 +23593,109 @@ __exitcall_ebc_exit:
 	.byte	0x60
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x70a5
+	.4byte	0x70bb
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x717f
+	.4byte	0x7195
 	.uleb128 0x11
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0x20e7
+	.4byte	0x20fd
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7161
+	.4byte	0x7177
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x7199
+	.4byte	0x71af
 	.uleb128 0x11
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7185
+	.4byte	0x719b
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x71b8
+	.4byte	0x71ce
 	.uleb128 0x11
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0x71b8
+	.4byte	0x71ce
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x702f
+	.4byte	0x7045
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x719f
+	.4byte	0x71b5
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x71dd
+	.4byte	0x71f3
 	.uleb128 0x11
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.uleb128 0x11
-	.4byte	0x6ac0
+	.4byte	0x6ad6
 	.uleb128 0x11
-	.4byte	0x71dd
+	.4byte	0x71f3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6e89
+	.4byte	0x6e9f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x71c4
+	.4byte	0x71da
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x7202
+	.4byte	0x7218
 	.uleb128 0x11
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.uleb128 0x11
-	.4byte	0x6d41
+	.4byte	0x6d57
 	.uleb128 0x11
-	.4byte	0x71dd
+	.4byte	0x71f3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x71e9
+	.4byte	0x71ff
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x721c
+	.4byte	0x7232
 	.uleb128 0x11
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.uleb128 0x11
-	.4byte	0x721c
+	.4byte	0x7232
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6ff7
+	.4byte	0x700d
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7208
+	.4byte	0x721e
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6cf9
+	.4byte	0x6d0f
 	.uleb128 0x1a
 	.4byte	.LASF162
 	.2byte	0x380
 	.byte	0x8b
 	.2byte	0x14c
-	.4byte	0x7550
+	.4byte	0x7566
 	.uleb128 0x1b
-	.4byte	.LASF575
+	.4byte	.LASF577
 	.byte	0x8b
 	.2byte	0x14d
-	.4byte	0xd3ca
+	.4byte	0xd3e0
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF959
+	.4byte	.LASF961
 	.byte	0x8b
 	.2byte	0x150
 	.4byte	0x392
@@ -23355,304 +23704,304 @@ __exitcall_ebc_exit:
 	.4byte	.LASF264
 	.byte	0x8b
 	.2byte	0x153
-	.4byte	0xd270
+	.4byte	0xd286
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1720
+	.4byte	.LASF1722
 	.byte	0x8b
 	.2byte	0x156
-	.4byte	0xd280
+	.4byte	0xd296
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1721
+	.4byte	.LASF1723
 	.byte	0x8b
 	.2byte	0x157
-	.4byte	0xd341
+	.4byte	0xd357
 	.byte	0xd0
 	.uleb128 0x1b
-	.4byte	.LASF1722
+	.4byte	.LASF1724
 	.byte	0x8b
 	.2byte	0x158
 	.4byte	0x56
 	.byte	0xd8
 	.uleb128 0x1b
-	.4byte	.LASF1723
+	.4byte	.LASF1725
 	.byte	0x8b
 	.2byte	0x159
 	.4byte	0x56
 	.byte	0xe0
 	.uleb128 0x1b
-	.4byte	.LASF1724
+	.4byte	.LASF1726
 	.byte	0x8b
 	.2byte	0x15a
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.byte	0xe8
 	.uleb128 0x1b
-	.4byte	.LASF1725
+	.4byte	.LASF1727
 	.byte	0x8b
 	.2byte	0x15d
-	.4byte	0xd4b3
+	.4byte	0xd4c9
 	.byte	0xf0
 	.uleb128 0x1b
-	.4byte	.LASF1726
+	.4byte	.LASF1728
 	.byte	0x8b
 	.2byte	0x15e
-	.4byte	0xd4b9
+	.4byte	0xd4cf
 	.byte	0xf8
 	.uleb128 0x1c
-	.4byte	.LASF1727
+	.4byte	.LASF1729
 	.byte	0x8b
 	.2byte	0x15f
 	.4byte	0x6d
 	.2byte	0x100
 	.uleb128 0x1c
-	.4byte	.LASF1728
+	.4byte	.LASF1730
 	.byte	0x8b
 	.2byte	0x167
-	.4byte	0x243f
+	.4byte	0x2455
 	.2byte	0x108
 	.uleb128 0x30
 	.string	"kp"
 	.byte	0x8b
 	.2byte	0x169
-	.4byte	0xd4bf
+	.4byte	0xd4d5
 	.2byte	0x128
 	.uleb128 0x1c
-	.4byte	.LASF1729
+	.4byte	.LASF1731
 	.byte	0x8b
 	.2byte	0x16a
 	.4byte	0x6d
 	.2byte	0x130
 	.uleb128 0x1c
-	.4byte	.LASF1730
+	.4byte	.LASF1732
 	.byte	0x8b
 	.2byte	0x16d
 	.4byte	0x6d
 	.2byte	0x134
 	.uleb128 0x1c
-	.4byte	.LASF1731
+	.4byte	.LASF1733
 	.byte	0x8b
 	.2byte	0x16e
-	.4byte	0xd4b3
+	.4byte	0xd4c9
 	.2byte	0x138
 	.uleb128 0x1c
-	.4byte	.LASF1732
+	.4byte	.LASF1734
 	.byte	0x8b
 	.2byte	0x16f
-	.4byte	0xd4b9
+	.4byte	0xd4cf
 	.2byte	0x140
 	.uleb128 0x1c
-	.4byte	.LASF1733
+	.4byte	.LASF1735
 	.byte	0x8b
 	.2byte	0x182
 	.4byte	0x29b
 	.2byte	0x148
 	.uleb128 0x1c
-	.4byte	.LASF1734
+	.4byte	.LASF1736
 	.byte	0x8b
 	.2byte	0x184
 	.4byte	0x29b
 	.2byte	0x149
 	.uleb128 0x1c
-	.4byte	.LASF1735
+	.4byte	.LASF1737
 	.byte	0x8b
 	.2byte	0x187
-	.4byte	0xd4b3
+	.4byte	0xd4c9
 	.2byte	0x150
 	.uleb128 0x1c
-	.4byte	.LASF1736
+	.4byte	.LASF1738
 	.byte	0x8b
 	.2byte	0x188
-	.4byte	0xd4b9
+	.4byte	0xd4cf
 	.2byte	0x158
 	.uleb128 0x1c
-	.4byte	.LASF1737
+	.4byte	.LASF1739
 	.byte	0x8b
 	.2byte	0x189
 	.4byte	0x6d
 	.2byte	0x160
 	.uleb128 0x1c
-	.4byte	.LASF1738
+	.4byte	.LASF1740
 	.byte	0x8b
 	.2byte	0x18c
 	.4byte	0x6d
 	.2byte	0x164
 	.uleb128 0x1c
-	.4byte	.LASF1739
+	.4byte	.LASF1741
 	.byte	0x8b
 	.2byte	0x18d
-	.4byte	0xd4ea
+	.4byte	0xd500
 	.2byte	0x168
 	.uleb128 0x1c
-	.4byte	.LASF1740
+	.4byte	.LASF1742
 	.byte	0x8b
 	.2byte	0x190
 	.4byte	0x48c
 	.2byte	0x170
 	.uleb128 0x1c
-	.4byte	.LASF1741
+	.4byte	.LASF1743
 	.byte	0x8b
 	.2byte	0x193
-	.4byte	0xd41c
+	.4byte	0xd432
 	.2byte	0x180
 	.uleb128 0x1c
-	.4byte	.LASF1742
+	.4byte	.LASF1744
 	.byte	0x8b
 	.2byte	0x194
-	.4byte	0xd41c
+	.4byte	0xd432
 	.2byte	0x1d0
 	.uleb128 0x1c
-	.4byte	.LASF1743
+	.4byte	.LASF1745
 	.byte	0x8b
 	.2byte	0x197
-	.4byte	0xd1f2
+	.4byte	0xd208
 	.2byte	0x220
 	.uleb128 0x1c
-	.4byte	.LASF1744
+	.4byte	.LASF1746
 	.byte	0x8b
 	.2byte	0x199
 	.4byte	0x29
 	.2byte	0x248
 	.uleb128 0x1c
-	.4byte	.LASF1745
+	.4byte	.LASF1747
 	.byte	0x8b
 	.2byte	0x19d
 	.4byte	0x6d
 	.2byte	0x250
 	.uleb128 0x1c
-	.4byte	.LASF1746
+	.4byte	.LASF1748
 	.byte	0x8b
 	.2byte	0x19e
 	.4byte	0x392
 	.2byte	0x258
 	.uleb128 0x1c
-	.4byte	.LASF1747
+	.4byte	.LASF1749
 	.byte	0x8b
 	.2byte	0x19f
-	.4byte	0xd4f0
+	.4byte	0xd506
 	.2byte	0x268
 	.uleb128 0x1c
-	.4byte	.LASF1748
+	.4byte	.LASF1750
 	.byte	0x8b
 	.2byte	0x1a4
-	.4byte	0xd4f6
+	.4byte	0xd50c
 	.2byte	0x270
 	.uleb128 0x1c
-	.4byte	.LASF1749
+	.4byte	.LASF1751
 	.byte	0x8b
 	.2byte	0x1a5
-	.4byte	0xd478
+	.4byte	0xd48e
 	.2byte	0x278
 	.uleb128 0x1c
-	.4byte	.LASF1750
+	.4byte	.LASF1752
 	.byte	0x8b
 	.2byte	0x1a8
-	.4byte	0xd501
+	.4byte	0xd517
 	.2byte	0x290
 	.uleb128 0x1c
-	.4byte	.LASF1751
+	.4byte	.LASF1753
 	.byte	0x8b
 	.2byte	0x1ab
-	.4byte	0xd50c
+	.4byte	0xd522
 	.2byte	0x298
 	.uleb128 0x1c
-	.4byte	.LASF1752
+	.4byte	.LASF1754
 	.byte	0x8b
 	.2byte	0x1b0
 	.4byte	0x219
 	.2byte	0x2a0
 	.uleb128 0x1c
-	.4byte	.LASF1753
+	.4byte	.LASF1755
 	.byte	0x8b
 	.2byte	0x1b4
 	.4byte	0x443
 	.2byte	0x2a8
 	.uleb128 0x1c
-	.4byte	.LASF1754
+	.4byte	.LASF1756
 	.byte	0x8b
 	.2byte	0x1b5
 	.4byte	0x6d
 	.2byte	0x2b0
 	.uleb128 0x1c
-	.4byte	.LASF1755
+	.4byte	.LASF1757
 	.byte	0x8b
 	.2byte	0x1b9
 	.4byte	0x6d
 	.2byte	0x2b4
 	.uleb128 0x1c
-	.4byte	.LASF1756
+	.4byte	.LASF1758
 	.byte	0x8b
 	.2byte	0x1ba
-	.4byte	0xd512
+	.4byte	0xd528
 	.2byte	0x2b8
 	.uleb128 0x1c
-	.4byte	.LASF1757
+	.4byte	.LASF1759
 	.byte	0x8b
 	.2byte	0x1bd
 	.4byte	0xee1
 	.2byte	0x2c0
 	.uleb128 0x1c
-	.4byte	.LASF1758
+	.4byte	.LASF1760
 	.byte	0x8b
 	.2byte	0x1be
 	.4byte	0x6d
 	.2byte	0x2c8
 	.uleb128 0x1c
-	.4byte	.LASF1759
+	.4byte	.LASF1761
 	.byte	0x8b
 	.2byte	0x1c1
 	.4byte	0x6d
 	.2byte	0x2cc
 	.uleb128 0x1c
-	.4byte	.LASF1760
+	.4byte	.LASF1762
 	.byte	0x8b
 	.2byte	0x1c2
-	.4byte	0xbb6c
+	.4byte	0xbb82
 	.2byte	0x2d0
 	.uleb128 0x1c
-	.4byte	.LASF1761
+	.4byte	.LASF1763
 	.byte	0x8b
 	.2byte	0x1c5
-	.4byte	0xd51d
+	.4byte	0xd533
 	.2byte	0x2d8
 	.uleb128 0x1c
-	.4byte	.LASF1762
+	.4byte	.LASF1764
 	.byte	0x8b
 	.2byte	0x1c6
 	.4byte	0x6d
 	.2byte	0x2e0
 	.uleb128 0x1c
-	.4byte	.LASF1763
+	.4byte	.LASF1765
 	.byte	0x8b
 	.2byte	0x1c7
-	.4byte	0xd52e
+	.4byte	0xd544
 	.2byte	0x2e8
 	.uleb128 0x1c
-	.4byte	.LASF1764
+	.4byte	.LASF1766
 	.byte	0x8b
 	.2byte	0x1c8
 	.4byte	0x6d
 	.2byte	0x2f0
 	.uleb128 0x1c
-	.4byte	.LASF1765
+	.4byte	.LASF1767
 	.byte	0x8b
 	.2byte	0x1d9
 	.4byte	0x392
 	.2byte	0x2f8
 	.uleb128 0x1c
-	.4byte	.LASF1766
+	.4byte	.LASF1768
 	.byte	0x8b
 	.2byte	0x1db
 	.4byte	0x392
 	.2byte	0x308
 	.uleb128 0x1c
-	.4byte	.LASF1767
+	.4byte	.LASF1769
 	.byte	0x8b
 	.2byte	0x1de
 	.4byte	0x4a2
 	.2byte	0x318
 	.uleb128 0x1c
-	.4byte	.LASF1768
+	.4byte	.LASF1770
 	.byte	0x8b
 	.2byte	0x1e0
 	.4byte	0x367
@@ -23684,13 +24033,13 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x722e
+	.4byte	0x7244
 	.uleb128 0x1a
-	.4byte	.LASF1769
+	.4byte	.LASF1771
 	.2byte	0x140
 	.byte	0x89
 	.2byte	0x20f
-	.4byte	0x75a7
+	.4byte	0x75bd
 	.uleb128 0x1b
 	.4byte	.LASF170
 	.byte	0x89
@@ -23698,81 +24047,81 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1770
+	.4byte	.LASF1772
 	.byte	0x89
 	.2byte	0x211
-	.4byte	0x4e0b
+	.4byte	0x4e21
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF671
+	.4byte	.LASF673
 	.byte	0x89
 	.2byte	0x212
-	.4byte	0x75a7
+	.4byte	0x75bd
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1771
+	.4byte	.LASF1773
 	.byte	0x89
 	.2byte	0x213
-	.4byte	0x75b7
+	.4byte	0x75cd
 	.byte	0x50
 	.uleb128 0x30
 	.string	"ops"
 	.byte	0x89
 	.2byte	0x214
-	.4byte	0x75c7
+	.4byte	0x75dd
 	.2byte	0x128
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x1c54
-	.4byte	0x75b7
+	.4byte	0x1c6a
+	.4byte	0x75cd
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x6b63
-	.4byte	0x75c7
+	.4byte	0x6b79
+	.4byte	0x75dd
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x7228
-	.4byte	0x75d7
+	.4byte	0x723e
+	.4byte	0x75ed
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x1e
-	.4byte	.LASF1772
+	.4byte	.LASF1774
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x1f
 	.2byte	0x125
-	.4byte	0x760d
+	.4byte	0x7623
 	.uleb128 0xc
-	.4byte	.LASF1773
+	.4byte	.LASF1775
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1774
+	.4byte	.LASF1776
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1775
+	.4byte	.LASF1777
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF1776
+	.4byte	.LASF1778
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF1777
+	.4byte	.LASF1779
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF1778
+	.4byte	.LASF1780
 	.byte	0x5
 	.byte	0
 	.uleb128 0x10
-	.4byte	0x7622
+	.4byte	0x7638
 	.uleb128 0x11
-	.4byte	0x5f04
+	.4byte	0x5f1a
 	.uleb128 0x11
 	.4byte	0x194
 	.uleb128 0x11
@@ -23780,138 +24129,138 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x760d
+	.4byte	0x7623
 	.uleb128 0x1d
-	.4byte	.LASF1779
+	.4byte	.LASF1781
 	.byte	0xc8
 	.byte	0x1f
 	.2byte	0x162
-	.4byte	0x777b
+	.4byte	0x7791
 	.uleb128 0x1b
-	.4byte	.LASF1780
+	.4byte	.LASF1782
 	.byte	0x1f
 	.2byte	0x163
-	.4byte	0x779f
+	.4byte	0x77b5
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1781
+	.4byte	.LASF1783
 	.byte	0x1f
 	.2byte	0x164
-	.4byte	0x77b9
+	.4byte	0x77cf
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1782
+	.4byte	.LASF1784
 	.byte	0x1f
 	.2byte	0x167
-	.4byte	0x77d3
+	.4byte	0x77e9
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1783
+	.4byte	.LASF1785
 	.byte	0x1f
 	.2byte	0x16a
-	.4byte	0x77e8
+	.4byte	0x77fe
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1784
+	.4byte	.LASF1786
 	.byte	0x1f
 	.2byte	0x170
-	.4byte	0x780c
+	.4byte	0x7822
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1785
+	.4byte	.LASF1787
 	.byte	0x1f
 	.2byte	0x173
-	.4byte	0x7845
+	.4byte	0x785b
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1786
+	.4byte	.LASF1788
 	.byte	0x1f
 	.2byte	0x176
-	.4byte	0x7878
+	.4byte	0x788e
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1787
+	.4byte	.LASF1789
 	.byte	0x1f
 	.2byte	0x17b
-	.4byte	0x7892
+	.4byte	0x78a8
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1788
+	.4byte	.LASF1790
 	.byte	0x1f
 	.2byte	0x17c
-	.4byte	0x78ad
+	.4byte	0x78c3
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1789
+	.4byte	.LASF1791
 	.byte	0x1f
 	.2byte	0x17d
-	.4byte	0x78c7
+	.4byte	0x78dd
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1790
+	.4byte	.LASF1792
 	.byte	0x1f
 	.2byte	0x17e
-	.4byte	0x78d8
+	.4byte	0x78ee
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1791
+	.4byte	.LASF1793
 	.byte	0x1f
 	.2byte	0x17f
-	.4byte	0x78fd
+	.4byte	0x7913
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1792
+	.4byte	.LASF1794
 	.byte	0x1f
 	.2byte	0x184
-	.4byte	0x7921
+	.4byte	0x7937
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1793
+	.4byte	.LASF1795
 	.byte	0x1f
 	.2byte	0x186
-	.4byte	0x793b
+	.4byte	0x7951
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1794
+	.4byte	.LASF1796
 	.byte	0x1f
 	.2byte	0x187
-	.4byte	0x78d8
+	.4byte	0x78ee
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1795
+	.4byte	.LASF1797
 	.byte	0x1f
 	.2byte	0x188
-	.4byte	0x77e8
+	.4byte	0x77fe
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1796
+	.4byte	.LASF1798
 	.byte	0x1f
 	.2byte	0x189
-	.4byte	0x795a
+	.4byte	0x7970
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1797
+	.4byte	.LASF1799
 	.byte	0x1f
 	.2byte	0x18b
-	.4byte	0x797b
+	.4byte	0x7991
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF1798
+	.4byte	.LASF1800
 	.byte	0x1f
 	.2byte	0x18c
-	.4byte	0x7995
+	.4byte	0x79ab
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1799
+	.4byte	.LASF1801
 	.byte	0x1f
 	.2byte	0x18f
-	.4byte	0x79c5
+	.4byte	0x79db
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF1800
+	.4byte	.LASF1802
 	.byte	0x1f
 	.2byte	0x191
-	.4byte	0x79d6
+	.4byte	0x79ec
 	.byte	0xa0
 	.uleb128 0x1b
 	.4byte	.LASF129
@@ -23939,61 +24288,61 @@ __exitcall_ebc_exit:
 	.byte	0xc0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x7628
+	.4byte	0x763e
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x7794
+	.4byte	0x77aa
 	.uleb128 0x11
-	.4byte	0x343e
+	.4byte	0x3454
 	.uleb128 0x11
-	.4byte	0x7794
+	.4byte	0x77aa
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x779a
+	.4byte	0x77b0
 	.uleb128 0x24
-	.4byte	.LASF1801
+	.4byte	.LASF1803
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7780
+	.4byte	0x7796
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x77b9
+	.4byte	0x77cf
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
-	.4byte	0x343e
+	.4byte	0x3454
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x77a5
+	.4byte	0x77bb
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x77d3
+	.4byte	0x77e9
 	.uleb128 0x11
-	.4byte	0x514b
+	.4byte	0x5161
 	.uleb128 0x11
-	.4byte	0x7794
+	.4byte	0x77aa
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x77bf
+	.4byte	0x77d5
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x77e8
+	.4byte	0x77fe
 	.uleb128 0x11
-	.4byte	0x343e
+	.4byte	0x3454
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x77d9
+	.4byte	0x77ef
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x780c
+	.4byte	0x7822
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
-	.4byte	0x514b
+	.4byte	0x5161
 	.uleb128 0x11
 	.4byte	0x3b7
 	.uleb128 0x11
@@ -24001,14 +24350,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x77ee
+	.4byte	0x7804
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x783f
+	.4byte	0x7855
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
-	.4byte	0x514b
+	.4byte	0x5161
 	.uleb128 0x11
 	.4byte	0x2c3
 	.uleb128 0x11
@@ -24016,23 +24365,23 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
-	.4byte	0x5a2c
+	.4byte	0x5a42
 	.uleb128 0x11
-	.4byte	0x783f
+	.4byte	0x7855
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x443
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7812
+	.4byte	0x7828
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x7878
+	.4byte	0x788e
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
-	.4byte	0x514b
+	.4byte	0x5161
 	.uleb128 0x11
 	.4byte	0x2c3
 	.uleb128 0x11
@@ -24040,28 +24389,28 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
-	.4byte	0x343e
+	.4byte	0x3454
 	.uleb128 0x11
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x784b
+	.4byte	0x7861
 	.uleb128 0x14
 	.4byte	0x2fa
-	.4byte	0x7892
+	.4byte	0x78a8
 	.uleb128 0x11
-	.4byte	0x514b
+	.4byte	0x5161
 	.uleb128 0x11
 	.4byte	0x2fa
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x787e
+	.4byte	0x7894
 	.uleb128 0x10
-	.4byte	0x78ad
+	.4byte	0x78c3
 	.uleb128 0x11
-	.4byte	0x343e
+	.4byte	0x3454
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
@@ -24069,73 +24418,73 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7898
+	.4byte	0x78ae
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x78c7
+	.4byte	0x78dd
 	.uleb128 0x11
-	.4byte	0x343e
+	.4byte	0x3454
 	.uleb128 0x11
 	.4byte	0x31b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x78b3
+	.4byte	0x78c9
 	.uleb128 0x10
-	.4byte	0x78d8
+	.4byte	0x78ee
 	.uleb128 0x11
-	.4byte	0x343e
+	.4byte	0x3454
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x78cd
+	.4byte	0x78e3
 	.uleb128 0x14
 	.4byte	0x2d9
-	.4byte	0x78f2
+	.4byte	0x7908
 	.uleb128 0x11
-	.4byte	0x5f04
+	.4byte	0x5f1a
 	.uleb128 0x11
-	.4byte	0x78f2
+	.4byte	0x7908
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x78f8
+	.4byte	0x790e
 	.uleb128 0x24
-	.4byte	.LASF1802
+	.4byte	.LASF1804
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x78de
+	.4byte	0x78f4
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x7921
+	.4byte	0x7937
 	.uleb128 0x11
-	.4byte	0x514b
+	.4byte	0x5161
 	.uleb128 0x11
-	.4byte	0x343e
+	.4byte	0x3454
 	.uleb128 0x11
-	.4byte	0x343e
+	.4byte	0x3454
 	.uleb128 0x11
-	.4byte	0x5bdc
+	.4byte	0x5bf2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7903
+	.4byte	0x7919
 	.uleb128 0x14
 	.4byte	0x29b
-	.4byte	0x793b
+	.4byte	0x7951
 	.uleb128 0x11
-	.4byte	0x343e
+	.4byte	0x3454
 	.uleb128 0x11
-	.4byte	0x63b0
+	.4byte	0x63c6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7927
+	.4byte	0x793d
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x795a
+	.4byte	0x7970
 	.uleb128 0x11
-	.4byte	0x343e
+	.4byte	0x3454
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
@@ -24143,213 +24492,213 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7941
+	.4byte	0x7957
 	.uleb128 0x10
-	.4byte	0x7975
+	.4byte	0x798b
 	.uleb128 0x11
-	.4byte	0x343e
+	.4byte	0x3454
 	.uleb128 0x11
-	.4byte	0x7975
+	.4byte	0x798b
 	.uleb128 0x11
-	.4byte	0x7975
+	.4byte	0x798b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x29b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7960
+	.4byte	0x7976
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x7995
+	.4byte	0x79ab
 	.uleb128 0x11
-	.4byte	0x514b
+	.4byte	0x5161
 	.uleb128 0x11
-	.4byte	0x343e
+	.4byte	0x3454
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7981
+	.4byte	0x7997
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x79b4
+	.4byte	0x79ca
 	.uleb128 0x11
-	.4byte	0x79b4
+	.4byte	0x79ca
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
-	.4byte	0x79bf
+	.4byte	0x79d5
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x79ba
+	.4byte	0x79d0
 	.uleb128 0x24
-	.4byte	.LASF1803
+	.4byte	.LASF1805
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x2fa
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x799b
+	.4byte	0x79b1
 	.uleb128 0x10
-	.4byte	0x79d6
+	.4byte	0x79ec
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x79cb
+	.4byte	0x79e1
 	.uleb128 0x15
-	.4byte	.LASF1804
+	.4byte	.LASF1806
 	.byte	0x1f
 	.2byte	0x199
-	.4byte	0x777b
+	.4byte	0x7791
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x777b
+	.4byte	0x7791
 	.uleb128 0x1d
-	.4byte	.LASF1805
+	.4byte	.LASF1807
 	.byte	0xf8
 	.byte	0x1f
 	.2byte	0x1c6
-	.4byte	0x7b5b
+	.4byte	0x7b71
 	.uleb128 0x1b
-	.4byte	.LASF1806
+	.4byte	.LASF1808
 	.byte	0x1f
 	.2byte	0x1c7
 	.4byte	0x26f
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1807
+	.4byte	.LASF1809
 	.byte	0x1f
 	.2byte	0x1c8
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF1808
+	.4byte	.LASF1810
 	.byte	0x1f
 	.2byte	0x1c9
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1809
+	.4byte	.LASF1811
 	.byte	0x1f
 	.2byte	0x1ca
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1810
+	.4byte	.LASF1812
 	.byte	0x1f
 	.2byte	0x1cb
-	.4byte	0x243f
+	.4byte	0x2455
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1811
+	.4byte	.LASF1813
 	.byte	0x1f
 	.2byte	0x1cc
 	.4byte	0x443
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1812
+	.4byte	.LASF1814
 	.byte	0x1f
 	.2byte	0x1cd
 	.4byte	0x443
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1813
+	.4byte	.LASF1815
 	.byte	0x1f
 	.2byte	0x1ce
 	.4byte	0xc6
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1814
+	.4byte	.LASF1816
 	.byte	0x1f
 	.2byte	0x1cf
 	.4byte	0x29b
 	.byte	0x4c
 	.uleb128 0x1b
-	.4byte	.LASF1815
+	.4byte	.LASF1817
 	.byte	0x1f
 	.2byte	0x1d1
 	.4byte	0x392
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1816
+	.4byte	.LASF1818
 	.byte	0x1f
 	.2byte	0x1d3
-	.4byte	0x7b5b
+	.4byte	0x7b71
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1817
+	.4byte	.LASF1819
 	.byte	0x1f
 	.2byte	0x1d4
 	.4byte	0x6d
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1818
+	.4byte	.LASF1820
 	.byte	0x1f
 	.2byte	0x1d5
 	.4byte	0x10b
 	.byte	0x6c
 	.uleb128 0x1b
-	.4byte	.LASF1819
+	.4byte	.LASF1821
 	.byte	0x1f
 	.2byte	0x1d6
-	.4byte	0x7b66
+	.4byte	0x7b7c
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1820
+	.4byte	.LASF1822
 	.byte	0x1f
 	.2byte	0x1d8
 	.4byte	0x6d
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1821
+	.4byte	.LASF1823
 	.byte	0x1f
 	.2byte	0x1d9
 	.4byte	0xc6
 	.byte	0x7c
 	.uleb128 0x1b
-	.4byte	.LASF1822
+	.4byte	.LASF1824
 	.byte	0x1f
 	.2byte	0x1da
-	.4byte	0x7b71
+	.4byte	0x7b87
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1823
+	.4byte	.LASF1825
 	.byte	0x1f
 	.2byte	0x1db
-	.4byte	0x4951
+	.4byte	0x4967
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF1824
+	.4byte	.LASF1826
 	.byte	0x1f
 	.2byte	0x1dc
-	.4byte	0x483b
+	.4byte	0x4851
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1825
+	.4byte	.LASF1827
 	.byte	0x1f
 	.2byte	0x1dd
 	.4byte	0x392
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF1826
+	.4byte	.LASF1828
 	.byte	0x1f
 	.2byte	0x1e4
 	.4byte	0x29
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF1827
+	.4byte	.LASF1829
 	.byte	0x1f
 	.2byte	0x1e7
 	.4byte	0xc6
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF1828
+	.4byte	.LASF1830
 	.byte	0x1f
 	.2byte	0x1e9
-	.4byte	0x243f
+	.4byte	0x2455
 	.byte	0xb8
 	.uleb128 0x1b
 	.4byte	.LASF129
@@ -24378,29 +24727,29 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x79ee
+	.4byte	0x7a04
 	.uleb128 0x24
-	.4byte	.LASF1829
+	.4byte	.LASF1831
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7b61
+	.4byte	0x7b77
 	.uleb128 0x24
-	.4byte	.LASF1830
+	.4byte	.LASF1832
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7b6c
+	.4byte	0x7b82
 	.uleb128 0x3f
 	.byte	0x4
 	.byte	0x1f
 	.2byte	0x280
-	.4byte	0x7b99
+	.4byte	0x7baf
 	.uleb128 0x41
-	.4byte	.LASF1831
+	.4byte	.LASF1833
 	.byte	0x1f
 	.2byte	0x281
 	.4byte	0x74
 	.uleb128 0x41
-	.4byte	.LASF1832
+	.4byte	.LASF1834
 	.byte	0x1f
 	.2byte	0x282
 	.4byte	0x6d
@@ -24409,14 +24758,14 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x1f
 	.2byte	0x2a7
-	.4byte	0x7bbb
+	.4byte	0x7bd1
 	.uleb128 0x41
-	.4byte	.LASF1833
+	.4byte	.LASF1835
 	.byte	0x1f
 	.2byte	0x2a8
 	.4byte	0x3bd
 	.uleb128 0x41
-	.4byte	.LASF1834
+	.4byte	.LASF1836
 	.byte	0x1f
 	.2byte	0x2a9
 	.4byte	0x407
@@ -24425,186 +24774,186 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x1f
 	.2byte	0x2b7
-	.4byte	0x7c01
+	.4byte	0x7c17
 	.uleb128 0x41
-	.4byte	.LASF1835
+	.4byte	.LASF1837
 	.byte	0x1f
 	.2byte	0x2b8
-	.4byte	0x4930
+	.4byte	0x4946
 	.uleb128 0x41
-	.4byte	.LASF1836
+	.4byte	.LASF1838
 	.byte	0x1f
 	.2byte	0x2b9
-	.4byte	0x7b5b
+	.4byte	0x7b71
 	.uleb128 0x41
-	.4byte	.LASF1837
+	.4byte	.LASF1839
 	.byte	0x1f
 	.2byte	0x2ba
-	.4byte	0x7c06
+	.4byte	0x7c1c
 	.uleb128 0x41
-	.4byte	.LASF1838
+	.4byte	.LASF1840
 	.byte	0x1f
 	.2byte	0x2bb
 	.4byte	0x219
 	.uleb128 0x41
-	.4byte	.LASF1839
+	.4byte	.LASF1841
 	.byte	0x1f
 	.2byte	0x2bc
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1840
+	.4byte	.LASF1842
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7c01
+	.4byte	0x7c17
 	.uleb128 0x24
-	.4byte	.LASF1841
+	.4byte	.LASF1843
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7c0c
+	.4byte	0x7c22
 	.uleb128 0x1a
-	.4byte	.LASF1842
+	.4byte	.LASF1844
 	.2byte	0x100
 	.byte	0x1f
 	.2byte	0x73c
-	.4byte	0x7d85
+	.4byte	0x7d9b
 	.uleb128 0x1b
-	.4byte	.LASF1843
+	.4byte	.LASF1845
 	.byte	0x1f
 	.2byte	0x73d
-	.4byte	0x8bcc
+	.4byte	0x8be2
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1844
+	.4byte	.LASF1846
 	.byte	0x1f
 	.2byte	0x73e
-	.4byte	0x8bf1
+	.4byte	0x8c07
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1845
+	.4byte	.LASF1847
 	.byte	0x1f
 	.2byte	0x73f
-	.4byte	0x8c0b
+	.4byte	0x8c21
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1846
+	.4byte	.LASF1848
 	.byte	0x1f
 	.2byte	0x740
-	.4byte	0x8c2a
+	.4byte	0x8c40
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1847
+	.4byte	.LASF1849
 	.byte	0x1f
 	.2byte	0x741
-	.4byte	0x8c44
+	.4byte	0x8c5a
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1848
+	.4byte	.LASF1850
 	.byte	0x1f
 	.2byte	0x743
-	.4byte	0x8c63
+	.4byte	0x8c79
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1849
+	.4byte	.LASF1851
 	.byte	0x1f
 	.2byte	0x745
-	.4byte	0x8c87
+	.4byte	0x8c9d
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1850
+	.4byte	.LASF1852
 	.byte	0x1f
 	.2byte	0x746
-	.4byte	0x8ca6
+	.4byte	0x8cbc
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1851
+	.4byte	.LASF1853
 	.byte	0x1f
 	.2byte	0x747
-	.4byte	0x8cc0
+	.4byte	0x8cd6
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1852
+	.4byte	.LASF1854
 	.byte	0x1f
 	.2byte	0x748
-	.4byte	0x8cdf
+	.4byte	0x8cf5
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1853
+	.4byte	.LASF1855
 	.byte	0x1f
 	.2byte	0x749
-	.4byte	0x8cfe
+	.4byte	0x8d14
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1854
+	.4byte	.LASF1856
 	.byte	0x1f
 	.2byte	0x74a
-	.4byte	0x8cc0
+	.4byte	0x8cd6
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1855
+	.4byte	.LASF1857
 	.byte	0x1f
 	.2byte	0x74b
-	.4byte	0x8d22
+	.4byte	0x8d38
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1856
+	.4byte	.LASF1858
 	.byte	0x1f
 	.2byte	0x74c
-	.4byte	0x8d4b
+	.4byte	0x8d61
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1857
+	.4byte	.LASF1859
 	.byte	0x1f
 	.2byte	0x74e
-	.4byte	0x8d6b
+	.4byte	0x8d81
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1858
+	.4byte	.LASF1860
 	.byte	0x1f
 	.2byte	0x74f
-	.4byte	0x8d8a
+	.4byte	0x8da0
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1859
+	.4byte	.LASF1861
 	.byte	0x1f
 	.2byte	0x750
-	.4byte	0x8db4
+	.4byte	0x8dca
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1860
+	.4byte	.LASF1862
 	.byte	0x1f
 	.2byte	0x751
-	.4byte	0x8dd3
+	.4byte	0x8de9
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF1861
+	.4byte	.LASF1863
 	.byte	0x1f
 	.2byte	0x752
-	.4byte	0x8dfd
+	.4byte	0x8e13
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1862
+	.4byte	.LASF1864
 	.byte	0x1f
 	.2byte	0x754
-	.4byte	0x8e22
+	.4byte	0x8e38
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF1863
+	.4byte	.LASF1865
 	.byte	0x1f
 	.2byte	0x755
-	.4byte	0x8e4b
+	.4byte	0x8e61
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF1864
+	.4byte	.LASF1866
 	.byte	0x1f
 	.2byte	0x758
-	.4byte	0x8cfe
+	.4byte	0x8d14
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF1865
+	.4byte	.LASF1867
 	.byte	0x1f
 	.2byte	0x759
-	.4byte	0x8e6a
+	.4byte	0x8e80
 	.byte	0xb0
 	.uleb128 0x1b
 	.4byte	.LASF129
@@ -24632,44 +24981,44 @@ __exitcall_ebc_exit:
 	.byte	0xd0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x7c17
+	.4byte	0x7c2d
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7d85
+	.4byte	0x7d9b
 	.uleb128 0x24
-	.4byte	.LASF1866
+	.4byte	.LASF1868
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7d90
+	.4byte	0x7da6
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x7b4
 	.uleb128 0x1d
-	.4byte	.LASF1867
+	.4byte	.LASF1869
 	.byte	0x38
 	.byte	0x1f
 	.2byte	0x450
-	.4byte	0x7de3
+	.4byte	0x7df9
 	.uleb128 0x1b
-	.4byte	.LASF1868
+	.4byte	.LASF1870
 	.byte	0x1f
 	.2byte	0x451
 	.4byte	0xe50
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1869
+	.4byte	.LASF1871
 	.byte	0x1f
 	.2byte	0x452
 	.4byte	0x392
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1870
+	.4byte	.LASF1872
 	.byte	0x1f
 	.2byte	0x453
 	.4byte	0x392
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1871
+	.4byte	.LASF1873
 	.byte	0x1f
 	.2byte	0x454
 	.4byte	0x392
@@ -24677,28 +25026,28 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7da1
+	.4byte	0x7db7
 	.uleb128 0x24
-	.4byte	.LASF1872
+	.4byte	.LASF1874
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7de9
+	.4byte	0x7dff
 	.uleb128 0x24
-	.4byte	.LASF1873
+	.4byte	.LASF1875
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7df4
+	.4byte	0x7e0a
 	.uleb128 0x24
-	.4byte	.LASF1874
+	.4byte	.LASF1876
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7dff
+	.4byte	0x7e15
 	.uleb128 0x1d
-	.4byte	.LASF1875
+	.4byte	.LASF1877
 	.byte	0x20
 	.byte	0x1f
 	.2byte	0x376
-	.4byte	0x7e66
+	.4byte	0x7e7c
 	.uleb128 0x1b
 	.4byte	.LASF115
 	.byte	0x1f
@@ -24709,71 +25058,71 @@ __exitcall_ebc_exit:
 	.string	"pid"
 	.byte	0x1f
 	.2byte	0x378
-	.4byte	0x4612
+	.4byte	0x4628
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF546
+	.4byte	.LASF548
 	.byte	0x1f
 	.2byte	0x379
-	.4byte	0x22a1
+	.4byte	0x22b7
 	.byte	0x10
 	.uleb128 0x2b
 	.string	"uid"
 	.byte	0x1f
 	.2byte	0x37a
-	.4byte	0x23e5
+	.4byte	0x23fb
 	.byte	0x14
 	.uleb128 0x1b
-	.4byte	.LASF1101
+	.4byte	.LASF1103
 	.byte	0x1f
 	.2byte	0x37a
-	.4byte	0x23e5
+	.4byte	0x23fb
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1876
+	.4byte	.LASF1878
 	.byte	0x1f
 	.2byte	0x37b
 	.4byte	0xc6
 	.byte	0x1c
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1877
+	.4byte	.LASF1879
 	.byte	0x20
 	.byte	0x1f
 	.2byte	0x381
-	.4byte	0x7ec2
+	.4byte	0x7ed8
 	.uleb128 0x1b
-	.4byte	.LASF1878
+	.4byte	.LASF1880
 	.byte	0x1f
 	.2byte	0x382
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0x1f
 	.2byte	0x383
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1879
+	.4byte	.LASF1881
 	.byte	0x1f
 	.2byte	0x384
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF1880
+	.4byte	.LASF1882
 	.byte	0x1f
 	.2byte	0x387
 	.4byte	0x6d
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1881
+	.4byte	.LASF1883
 	.byte	0x1f
 	.2byte	0x388
 	.4byte	0x6d
 	.byte	0x14
 	.uleb128 0x1b
-	.4byte	.LASF1882
+	.4byte	.LASF1884
 	.byte	0x1f
 	.2byte	0x389
 	.4byte	0x2c3
@@ -24783,40 +25132,40 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x1f
 	.2byte	0x396
-	.4byte	0x7ee4
+	.4byte	0x7efa
 	.uleb128 0x41
-	.4byte	.LASF1883
+	.4byte	.LASF1885
 	.byte	0x1f
 	.2byte	0x397
-	.4byte	0x2eeb
+	.4byte	0x2f01
 	.uleb128 0x41
-	.4byte	.LASF1884
+	.4byte	.LASF1886
 	.byte	0x1f
 	.2byte	0x398
 	.4byte	0x407
 	.byte	0
 	.uleb128 0x13
-	.4byte	.LASF1885
+	.4byte	.LASF1887
 	.byte	0x1f
 	.2byte	0x3ee
 	.4byte	0x443
 	.uleb128 0x1d
-	.4byte	.LASF1886
+	.4byte	.LASF1888
 	.byte	0x20
 	.byte	0x1f
 	.2byte	0x3f2
-	.4byte	0x7f32
+	.4byte	0x7f48
 	.uleb128 0x1b
-	.4byte	.LASF1887
+	.4byte	.LASF1889
 	.byte	0x1f
 	.2byte	0x3f3
-	.4byte	0x8079
+	.4byte	0x808f
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1888
+	.4byte	.LASF1890
 	.byte	0x1f
 	.2byte	0x3f4
-	.4byte	0x808a
+	.4byte	0x80a0
 	.byte	0x8
 	.uleb128 0x1b
 	.4byte	.LASF129
@@ -24832,139 +25181,139 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x7ef0
+	.4byte	0x7f06
 	.uleb128 0x10
-	.4byte	0x7f47
+	.4byte	0x7f5d
 	.uleb128 0x11
-	.4byte	0x7f47
+	.4byte	0x7f5d
 	.uleb128 0x11
-	.4byte	0x7f47
+	.4byte	0x7f5d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7f4d
+	.4byte	0x7f63
 	.uleb128 0x1d
-	.4byte	.LASF1889
+	.4byte	.LASF1891
 	.byte	0xe8
 	.byte	0x1f
 	.2byte	0x42c
-	.4byte	0x8079
+	.4byte	0x808f
 	.uleb128 0x1b
-	.4byte	.LASF1890
+	.4byte	.LASF1892
 	.byte	0x1f
 	.2byte	0x42d
-	.4byte	0x7f47
+	.4byte	0x7f5d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1891
+	.4byte	.LASF1893
 	.byte	0x1f
 	.2byte	0x42e
 	.4byte	0x392
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1892
+	.4byte	.LASF1894
 	.byte	0x1f
 	.2byte	0x42f
 	.4byte	0x3d6
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1893
+	.4byte	.LASF1895
 	.byte	0x1f
 	.2byte	0x430
 	.4byte	0x392
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1894
+	.4byte	.LASF1896
 	.byte	0x1f
 	.2byte	0x431
-	.4byte	0x7ee4
+	.4byte	0x7efa
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1895
+	.4byte	.LASF1897
 	.byte	0x1f
 	.2byte	0x432
 	.4byte	0x6d
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1896
+	.4byte	.LASF1898
 	.byte	0x1f
 	.2byte	0x433
 	.4byte	0x96
 	.byte	0x44
 	.uleb128 0x1b
-	.4byte	.LASF1897
+	.4byte	.LASF1899
 	.byte	0x1f
 	.2byte	0x434
 	.4byte	0x6d
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1898
+	.4byte	.LASF1900
 	.byte	0x1f
 	.2byte	0x435
 	.4byte	0xc6
 	.byte	0x4c
 	.uleb128 0x1b
-	.4byte	.LASF1899
+	.4byte	.LASF1901
 	.byte	0x1f
 	.2byte	0x436
-	.4byte	0x1594
+	.4byte	0x15aa
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1900
+	.4byte	.LASF1902
 	.byte	0x1f
 	.2byte	0x437
-	.4byte	0x5531
+	.4byte	0x5547
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1901
+	.4byte	.LASF1903
 	.byte	0x1f
 	.2byte	0x438
 	.4byte	0x2c3
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1902
+	.4byte	.LASF1904
 	.byte	0x1f
 	.2byte	0x439
 	.4byte	0x2c3
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1903
+	.4byte	.LASF1905
 	.byte	0x1f
 	.2byte	0x43b
-	.4byte	0x82f9
+	.4byte	0x830f
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1904
+	.4byte	.LASF1906
 	.byte	0x1f
 	.2byte	0x43d
 	.4byte	0x29
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF1905
+	.4byte	.LASF1907
 	.byte	0x1f
 	.2byte	0x43e
 	.4byte	0x29
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1906
+	.4byte	.LASF1908
 	.byte	0x1f
 	.2byte	0x440
-	.4byte	0x82ff
+	.4byte	0x8315
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF1907
+	.4byte	.LASF1909
 	.byte	0x1f
 	.2byte	0x441
-	.4byte	0x8305
+	.4byte	0x831b
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF1908
+	.4byte	.LASF1910
 	.byte	0x1f
 	.2byte	0x449
-	.4byte	0x826f
+	.4byte	0x8285
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF1909
+	.4byte	.LASF1911
 	.byte	0x1f
 	.2byte	0x44b
 	.4byte	0x392
@@ -24984,74 +25333,74 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7f37
+	.4byte	0x7f4d
 	.uleb128 0x10
-	.4byte	0x808a
+	.4byte	0x80a0
 	.uleb128 0x11
-	.4byte	0x7f47
+	.4byte	0x7f5d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x807f
+	.4byte	0x8095
 	.uleb128 0x1d
-	.4byte	.LASF1910
+	.4byte	.LASF1912
 	.byte	0x58
 	.byte	0x1f
 	.2byte	0x3fa
-	.4byte	0x812d
+	.4byte	0x8143
 	.uleb128 0x1b
-	.4byte	.LASF1911
+	.4byte	.LASF1913
 	.byte	0x1f
 	.2byte	0x3fb
-	.4byte	0x8146
+	.4byte	0x815c
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1912
+	.4byte	.LASF1914
 	.byte	0x1f
 	.2byte	0x3fc
-	.4byte	0x815b
+	.4byte	0x8171
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1913
+	.4byte	.LASF1915
 	.byte	0x1f
 	.2byte	0x3fd
-	.4byte	0x8170
+	.4byte	0x8186
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1914
+	.4byte	.LASF1916
 	.byte	0x1f
 	.2byte	0x3fe
-	.4byte	0x8181
+	.4byte	0x8197
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1915
+	.4byte	.LASF1917
 	.byte	0x1f
 	.2byte	0x3ff
-	.4byte	0x808a
+	.4byte	0x80a0
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1916
+	.4byte	.LASF1918
 	.byte	0x1f
 	.2byte	0x400
-	.4byte	0x819b
+	.4byte	0x81b1
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1917
+	.4byte	.LASF1919
 	.byte	0x1f
 	.2byte	0x401
-	.4byte	0x81b0
+	.4byte	0x81c6
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1918
+	.4byte	.LASF1920
 	.byte	0x1f
 	.2byte	0x402
-	.4byte	0x81cf
+	.4byte	0x81e5
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1919
+	.4byte	.LASF1921
 	.byte	0x1f
 	.2byte	0x403
-	.4byte	0x81e5
+	.4byte	0x81fb
 	.byte	0x40
 	.uleb128 0x1b
 	.4byte	.LASF129
@@ -25067,69 +25416,69 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x8090
+	.4byte	0x80a6
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8146
+	.4byte	0x815c
 	.uleb128 0x11
-	.4byte	0x7f47
+	.4byte	0x7f5d
 	.uleb128 0x11
-	.4byte	0x7f47
+	.4byte	0x7f5d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8132
+	.4byte	0x8148
 	.uleb128 0x14
 	.4byte	0x29
-	.4byte	0x815b
+	.4byte	0x8171
 	.uleb128 0x11
-	.4byte	0x7f47
+	.4byte	0x7f5d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x814c
+	.4byte	0x8162
 	.uleb128 0x14
-	.4byte	0x7ee4
-	.4byte	0x8170
+	.4byte	0x7efa
+	.4byte	0x8186
 	.uleb128 0x11
-	.4byte	0x7ee4
+	.4byte	0x7efa
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8161
+	.4byte	0x8177
 	.uleb128 0x10
-	.4byte	0x8181
+	.4byte	0x8197
 	.uleb128 0x11
-	.4byte	0x7ee4
+	.4byte	0x7efa
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8176
+	.4byte	0x818c
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x819b
+	.4byte	0x81b1
 	.uleb128 0x11
-	.4byte	0x7f47
+	.4byte	0x7f5d
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8187
+	.4byte	0x819d
 	.uleb128 0x14
 	.4byte	0x29b
-	.4byte	0x81b0
+	.4byte	0x81c6
 	.uleb128 0x11
-	.4byte	0x7f47
+	.4byte	0x7f5d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x81a1
+	.4byte	0x81b7
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x81cf
+	.4byte	0x81e5
 	.uleb128 0x11
-	.4byte	0x7f47
+	.4byte	0x7f5d
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -25137,25 +25486,25 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x81b6
+	.4byte	0x81cc
 	.uleb128 0x10
-	.4byte	0x81e5
+	.4byte	0x81fb
 	.uleb128 0x11
-	.4byte	0x7f47
+	.4byte	0x7f5d
 	.uleb128 0x11
-	.4byte	0x783f
+	.4byte	0x7855
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x81d5
+	.4byte	0x81eb
 	.uleb128 0xd
-	.4byte	.LASF1920
+	.4byte	.LASF1922
 	.byte	0x20
 	.byte	0x8c
 	.byte	0xa
-	.4byte	0x821c
+	.4byte	0x8232
 	.uleb128 0xe
-	.4byte	.LASF575
+	.4byte	.LASF577
 	.byte	0x8c
 	.byte	0xb
 	.4byte	0x13a
@@ -25164,51 +25513,51 @@ __exitcall_ebc_exit:
 	.4byte	.LASF97
 	.byte	0x8c
 	.byte	0xc
-	.4byte	0x8221
+	.4byte	0x8237
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF959
+	.4byte	.LASF961
 	.byte	0x8c
 	.byte	0xd
 	.4byte	0x392
 	.byte	0x10
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1921
+	.4byte	.LASF1923
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x821c
+	.4byte	0x8232
 	.uleb128 0xd
-	.4byte	.LASF1922
+	.4byte	.LASF1924
 	.byte	0x8
 	.byte	0x8c
 	.byte	0x11
-	.4byte	0x8240
+	.4byte	0x8256
 	.uleb128 0xe
 	.4byte	.LASF97
 	.byte	0x8c
 	.byte	0x12
-	.4byte	0x8245
+	.4byte	0x825b
 	.byte	0
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1923
+	.4byte	.LASF1925
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8240
+	.4byte	0x8256
 	.uleb128 0x2e
 	.byte	0x18
 	.byte	0x1f
 	.2byte	0x445
-	.4byte	0x826f
+	.4byte	0x8285
 	.uleb128 0x1b
-	.4byte	.LASF1850
+	.4byte	.LASF1852
 	.byte	0x1f
 	.2byte	0x446
 	.4byte	0x392
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF575
+	.4byte	.LASF577
 	.byte	0x1f
 	.2byte	0x447
 	.4byte	0xc6
@@ -25218,61 +25567,61 @@ __exitcall_ebc_exit:
 	.byte	0x20
 	.byte	0x1f
 	.2byte	0x442
-	.4byte	0x829d
+	.4byte	0x82b3
 	.uleb128 0x41
-	.4byte	.LASF1924
+	.4byte	.LASF1926
 	.byte	0x1f
 	.2byte	0x443
-	.4byte	0x81eb
+	.4byte	0x8201
 	.uleb128 0x41
-	.4byte	.LASF1925
+	.4byte	.LASF1927
 	.byte	0x1f
 	.2byte	0x444
-	.4byte	0x8227
+	.4byte	0x823d
 	.uleb128 0x3d
 	.string	"afs"
 	.byte	0x1f
 	.2byte	0x448
-	.4byte	0x824b
+	.4byte	0x8261
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1926
+	.4byte	.LASF1928
 	.byte	0x30
 	.byte	0x1f
 	.2byte	0x521
-	.4byte	0x82f9
+	.4byte	0x830f
 	.uleb128 0x1b
-	.4byte	.LASF1927
+	.4byte	.LASF1929
 	.byte	0x1f
 	.2byte	0x522
 	.4byte	0xe70
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1928
+	.4byte	.LASF1930
 	.byte	0x1f
 	.2byte	0x523
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1929
+	.4byte	.LASF1931
 	.byte	0x1f
 	.2byte	0x524
 	.4byte	0xc6
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF1930
+	.4byte	.LASF1932
 	.byte	0x1f
 	.2byte	0x525
-	.4byte	0x82f9
+	.4byte	0x830f
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1931
+	.4byte	.LASF1933
 	.byte	0x1f
 	.2byte	0x526
-	.4byte	0x5531
+	.4byte	0x5547
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1932
+	.4byte	.LASF1934
 	.byte	0x1f
 	.2byte	0x527
 	.4byte	0x407
@@ -25280,51 +25629,51 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x829d
+	.4byte	0x82b3
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7f32
+	.4byte	0x7f48
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x812d
+	.4byte	0x8143
 	.uleb128 0x1a
-	.4byte	.LASF1933
+	.4byte	.LASF1935
 	.2byte	0x1b8
 	.byte	0x1f
 	.2byte	0x57d
-	.4byte	0x8341
+	.4byte	0x8357
 	.uleb128 0x1b
-	.4byte	.LASF1240
+	.4byte	.LASF1242
 	.byte	0x1f
 	.2byte	0x57e
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1934
+	.4byte	.LASF1936
 	.byte	0x1f
 	.2byte	0x57f
-	.4byte	0x1594
+	.4byte	0x15aa
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1392
+	.4byte	.LASF1394
 	.byte	0x1f
 	.2byte	0x580
-	.4byte	0x8341
+	.4byte	0x8357
 	.byte	0x20
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x5c96
-	.4byte	0x8351
+	.4byte	0x5cac
+	.4byte	0x8367
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1935
+	.4byte	.LASF1937
 	.byte	0x68
 	.byte	0x1f
 	.2byte	0x8ac
-	.4byte	0x8463
+	.4byte	0x8479
 	.uleb128 0x1b
 	.4byte	.LASF264
 	.byte	0x1f
@@ -25332,91 +25681,91 @@ __exitcall_ebc_exit:
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1936
+	.4byte	.LASF1938
 	.byte	0x1f
 	.2byte	0x8ae
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1937
+	.4byte	.LASF1939
 	.byte	0x1f
 	.2byte	0x8b4
-	.4byte	0x9092
+	.4byte	0x90a8
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1938
+	.4byte	.LASF1940
 	.byte	0x1f
 	.2byte	0x8b6
-	.4byte	0x90bb
+	.4byte	0x90d1
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1939
+	.4byte	.LASF1941
 	.byte	0x1f
 	.2byte	0x8b8
-	.4byte	0x90c6
+	.4byte	0x90dc
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1940
+	.4byte	.LASF1942
 	.byte	0x1f
 	.2byte	0x8b9
-	.4byte	0x8ee6
+	.4byte	0x8efc
 	.byte	0x28
 	.uleb128 0x1b
 	.4byte	.LASF97
 	.byte	0x1f
 	.2byte	0x8ba
-	.4byte	0x7550
+	.4byte	0x7566
 	.byte	0x30
 	.uleb128 0x1b
 	.4byte	.LASF63
 	.byte	0x1f
 	.2byte	0x8bb
-	.4byte	0x8463
+	.4byte	0x8479
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1941
+	.4byte	.LASF1943
 	.byte	0x1f
 	.2byte	0x8bc
 	.4byte	0x3bd
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1942
+	.4byte	.LASF1944
 	.byte	0x1f
 	.2byte	0x8be
 	.4byte	0xdfc
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1943
+	.4byte	.LASF1945
 	.byte	0x1f
 	.2byte	0x8bf
 	.4byte	0xdfc
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1944
+	.4byte	.LASF1946
 	.byte	0x1f
 	.2byte	0x8c0
 	.4byte	0xdfc
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1945
+	.4byte	.LASF1947
 	.byte	0x1f
 	.2byte	0x8c1
-	.4byte	0x90cc
+	.4byte	0x90e2
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1946
+	.4byte	.LASF1948
 	.byte	0x1f
 	.2byte	0x8c3
 	.4byte	0xdfc
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1947
+	.4byte	.LASF1949
 	.byte	0x1f
 	.2byte	0x8c4
 	.4byte	0xdfc
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1948
+	.4byte	.LASF1950
 	.byte	0x1f
 	.2byte	0x8c5
 	.4byte	0xdfc
@@ -25448,192 +25797,192 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8351
+	.4byte	0x8367
 	.uleb128 0x1a
-	.4byte	.LASF1949
+	.4byte	.LASF1951
 	.2byte	0x110
 	.byte	0x1f
 	.2byte	0x78f
-	.4byte	0x8634
+	.4byte	0x864a
 	.uleb128 0x1b
-	.4byte	.LASF1950
+	.4byte	.LASF1952
 	.byte	0x1f
 	.2byte	0x790
-	.4byte	0x8e7f
+	.4byte	0x8e95
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1951
+	.4byte	.LASF1953
 	.byte	0x1f
 	.2byte	0x791
-	.4byte	0x8e90
+	.4byte	0x8ea6
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1952
+	.4byte	.LASF1954
 	.byte	0x1f
 	.2byte	0x793
-	.4byte	0x8ea6
+	.4byte	0x8ebc
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1953
+	.4byte	.LASF1955
 	.byte	0x1f
 	.2byte	0x794
-	.4byte	0x8ec0
+	.4byte	0x8ed6
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF1954
+	.4byte	.LASF1956
 	.byte	0x1f
 	.2byte	0x795
-	.4byte	0x8ed5
+	.4byte	0x8eeb
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF1955
+	.4byte	.LASF1957
 	.byte	0x1f
 	.2byte	0x796
-	.4byte	0x8e90
+	.4byte	0x8ea6
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF1956
+	.4byte	.LASF1958
 	.byte	0x1f
 	.2byte	0x797
-	.4byte	0x8ee6
+	.4byte	0x8efc
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF1957
+	.4byte	.LASF1959
 	.byte	0x1f
 	.2byte	0x798
-	.4byte	0x6d12
+	.4byte	0x6d28
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF1958
+	.4byte	.LASF1960
 	.byte	0x1f
 	.2byte	0x799
-	.4byte	0x8efb
+	.4byte	0x8f11
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF1959
+	.4byte	.LASF1961
 	.byte	0x1f
 	.2byte	0x79a
-	.4byte	0x8efb
+	.4byte	0x8f11
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1960
+	.4byte	.LASF1962
 	.byte	0x1f
 	.2byte	0x79b
-	.4byte	0x8efb
+	.4byte	0x8f11
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF1961
+	.4byte	.LASF1963
 	.byte	0x1f
 	.2byte	0x79c
-	.4byte	0x8efb
+	.4byte	0x8f11
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF1962
+	.4byte	.LASF1964
 	.byte	0x1f
 	.2byte	0x79d
-	.4byte	0x8f20
+	.4byte	0x8f36
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF1963
+	.4byte	.LASF1965
 	.byte	0x1f
 	.2byte	0x79e
-	.4byte	0x8f3f
+	.4byte	0x8f55
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF1964
+	.4byte	.LASF1966
 	.byte	0x1f
 	.2byte	0x79f
-	.4byte	0x8f63
+	.4byte	0x8f79
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF1965
+	.4byte	.LASF1967
 	.byte	0x1f
 	.2byte	0x7a0
-	.4byte	0x3141
+	.4byte	0x3157
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF1966
+	.4byte	.LASF1968
 	.byte	0x1f
 	.2byte	0x7a1
-	.4byte	0x8f79
+	.4byte	0x8f8f
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF1967
+	.4byte	.LASF1969
 	.byte	0x1f
 	.2byte	0x7a2
-	.4byte	0x8ee6
+	.4byte	0x8efc
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF1968
+	.4byte	.LASF1970
 	.byte	0x1f
 	.2byte	0x7a3
-	.4byte	0x8f8f
+	.4byte	0x8fa5
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF1969
+	.4byte	.LASF1971
 	.byte	0x1f
 	.2byte	0x7a5
-	.4byte	0x8fa9
+	.4byte	0x8fbf
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF1970
+	.4byte	.LASF1972
 	.byte	0x1f
 	.2byte	0x7a6
-	.4byte	0x8fc8
+	.4byte	0x8fde
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF1971
+	.4byte	.LASF1973
 	.byte	0x1f
 	.2byte	0x7a7
-	.4byte	0x8fa9
+	.4byte	0x8fbf
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF1972
+	.4byte	.LASF1974
 	.byte	0x1f
 	.2byte	0x7a8
-	.4byte	0x8fa9
+	.4byte	0x8fbf
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF1973
+	.4byte	.LASF1975
 	.byte	0x1f
 	.2byte	0x7a9
-	.4byte	0x8fa9
+	.4byte	0x8fbf
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF1974
+	.4byte	.LASF1976
 	.byte	0x1f
 	.2byte	0x7ab
-	.4byte	0x8ff1
+	.4byte	0x9007
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF1975
+	.4byte	.LASF1977
 	.byte	0x1f
 	.2byte	0x7ac
-	.4byte	0x901a
+	.4byte	0x9030
 	.byte	0xc8
 	.uleb128 0x1b
-	.4byte	.LASF1976
+	.4byte	.LASF1978
 	.byte	0x1f
 	.2byte	0x7ad
-	.4byte	0x9035
+	.4byte	0x904b
 	.byte	0xd0
 	.uleb128 0x1b
-	.4byte	.LASF1977
+	.4byte	.LASF1979
 	.byte	0x1f
 	.2byte	0x7af
-	.4byte	0x9054
+	.4byte	0x906a
 	.byte	0xd8
 	.uleb128 0x1b
-	.4byte	.LASF1978
+	.4byte	.LASF1980
 	.byte	0x1f
 	.2byte	0x7b0
-	.4byte	0x906e
+	.4byte	0x9084
 	.byte	0xe0
 	.uleb128 0x1b
-	.4byte	.LASF1979
+	.4byte	.LASF1981
 	.byte	0x1f
 	.2byte	0x7b2
-	.4byte	0x906e
+	.4byte	0x9084
 	.byte	0xe8
 	.uleb128 0x1b
 	.4byte	.LASF129
@@ -25661,84 +26010,84 @@ __exitcall_ebc_exit:
 	.2byte	0x108
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x8469
+	.4byte	0x847f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8634
+	.4byte	0x864a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6e04
+	.4byte	0x6e1a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x715c
+	.4byte	0x7172
 	.uleb128 0x24
-	.4byte	.LASF1980
+	.4byte	.LASF1982
 	.uleb128 0x3
-	.4byte	0x864b
+	.4byte	0x8661
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8650
+	.4byte	0x8666
 	.uleb128 0x24
-	.4byte	.LASF1981
+	.4byte	.LASF1983
 	.uleb128 0x3
-	.4byte	0x865b
+	.4byte	0x8671
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x866b
+	.4byte	0x8681
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8660
+	.4byte	0x8676
 	.uleb128 0x24
-	.4byte	.LASF1982
+	.4byte	.LASF1984
 	.uleb128 0x3
-	.4byte	0x8671
+	.4byte	0x8687
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8676
+	.4byte	0x868c
 	.uleb128 0x32
 	.string	"key"
 	.byte	0xd0
 	.byte	0x8d
 	.byte	0x9b
-	.4byte	0x874e
+	.4byte	0x8764
 	.uleb128 0xe
-	.4byte	.LASF577
+	.4byte	.LASF579
 	.byte	0x8d
 	.byte	0x9c
-	.4byte	0x3367
+	.4byte	0x337d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1983
+	.4byte	.LASF1985
 	.byte	0x8d
 	.byte	0x9d
-	.4byte	0x9398
+	.4byte	0x93ae
 	.byte	0x4
 	.uleb128 0x23
-	.4byte	0x9493
+	.4byte	0x94a9
 	.byte	0x8
 	.uleb128 0x20
 	.string	"sem"
 	.byte	0x8d
 	.byte	0xa2
-	.4byte	0x4e0b
+	.4byte	0x4e21
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1115
+	.4byte	.LASF1117
 	.byte	0x8d
 	.byte	0xa3
-	.4byte	0x954a
+	.4byte	0x9560
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF744
+	.4byte	.LASF746
 	.byte	0x8d
 	.byte	0xa4
 	.4byte	0x443
 	.byte	0x58
 	.uleb128 0x23
-	.4byte	0x94b2
+	.4byte	0x94c8
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF1984
+	.4byte	.LASF1986
 	.byte	0x8d
 	.byte	0xa9
 	.4byte	0x9bd
@@ -25747,34 +26096,34 @@ __exitcall_ebc_exit:
 	.string	"uid"
 	.byte	0x8d
 	.byte	0xaa
-	.4byte	0x23e5
+	.4byte	0x23fb
 	.byte	0x70
 	.uleb128 0x20
 	.string	"gid"
 	.byte	0x8d
 	.byte	0xab
-	.4byte	0x2405
+	.4byte	0x241b
 	.byte	0x74
 	.uleb128 0xe
-	.4byte	.LASF1985
+	.4byte	.LASF1987
 	.byte	0x8d
 	.byte	0xac
-	.4byte	0x93a3
+	.4byte	0x93b9
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF1986
+	.4byte	.LASF1988
 	.byte	0x8d
 	.byte	0xad
 	.4byte	0xb4
 	.byte	0x7c
 	.uleb128 0xe
-	.4byte	.LASF1987
+	.4byte	.LASF1989
 	.byte	0x8d
 	.byte	0xae
 	.4byte	0xb4
 	.byte	0x7e
 	.uleb128 0xe
-	.4byte	.LASF575
+	.4byte	.LASF577
 	.byte	0x8d
 	.byte	0xb2
 	.4byte	0xa2
@@ -25786,92 +26135,92 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0x88
 	.uleb128 0x23
-	.4byte	0x94f2
+	.4byte	0x9508
 	.byte	0x90
 	.uleb128 0x23
-	.4byte	0x952c
+	.4byte	0x9542
 	.byte	0xa8
 	.uleb128 0xe
-	.4byte	.LASF1988
+	.4byte	.LASF1990
 	.byte	0x8d
 	.byte	0xea
-	.4byte	0x9550
+	.4byte	0x9566
 	.byte	0xc8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8681
+	.4byte	0x8697
 	.uleb128 0x24
-	.4byte	.LASF1989
+	.4byte	.LASF1991
 	.uleb128 0x3
-	.4byte	0x8754
+	.4byte	0x876a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8759
+	.4byte	0x876f
 	.uleb128 0x24
-	.4byte	.LASF1990
+	.4byte	.LASF1992
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8764
+	.4byte	0x877a
 	.uleb128 0x24
-	.4byte	.LASF1991
+	.4byte	.LASF1993
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x876f
+	.4byte	0x8785
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x878a
+	.4byte	0x87a0
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1f
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1992
+	.4byte	.LASF1994
 	.byte	0x18
 	.byte	0x1f
 	.2byte	0x6c5
-	.4byte	0x87cc
+	.4byte	0x87e2
 	.uleb128 0x1b
-	.4byte	.LASF1993
+	.4byte	.LASF1995
 	.byte	0x1f
 	.2byte	0x6c6
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1994
+	.4byte	.LASF1996
 	.byte	0x1f
 	.2byte	0x6c7
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF1995
+	.4byte	.LASF1997
 	.byte	0x1f
 	.2byte	0x6c8
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1996
+	.4byte	.LASF1998
 	.byte	0x1f
 	.2byte	0x6c9
-	.4byte	0x87cc
+	.4byte	0x87e2
 	.byte	0x10
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5b77
+	.4byte	0x5b8d
 	.uleb128 0x13
-	.4byte	.LASF1997
+	.4byte	.LASF1999
 	.byte	0x1f
 	.2byte	0x6e7
-	.4byte	0x87de
+	.4byte	0x87f4
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x87e4
+	.4byte	0x87fa
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x880c
+	.4byte	0x8822
 	.uleb128 0x11
-	.4byte	0x880c
+	.4byte	0x8822
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
@@ -25885,18 +26234,18 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8812
+	.4byte	0x8828
 	.uleb128 0x1d
-	.4byte	.LASF1998
+	.4byte	.LASF2000
 	.byte	0x10
 	.byte	0x1f
 	.2byte	0x6ea
-	.4byte	0x883a
+	.4byte	0x8850
 	.uleb128 0x1b
-	.4byte	.LASF1999
+	.4byte	.LASF2001
 	.byte	0x1f
 	.2byte	0x6eb
-	.4byte	0x87d2
+	.4byte	0x87e8
 	.byte	0
 	.uleb128 0x2b
 	.string	"pos"
@@ -25907,9 +26256,9 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x14
 	.4byte	0x2c3
-	.4byte	0x8853
+	.4byte	0x8869
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
 	.4byte	0x2c3
 	.uleb128 0x11
@@ -25917,72 +26266,72 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x883a
+	.4byte	0x8850
 	.uleb128 0x14
 	.4byte	0x2d9
-	.4byte	0x8877
+	.4byte	0x888d
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
 	.4byte	0x219
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0x8877
+	.4byte	0x888d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x2c3
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8859
+	.4byte	0x886f
 	.uleb128 0x14
 	.4byte	0x2d9
-	.4byte	0x88a1
+	.4byte	0x88b7
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0x8877
+	.4byte	0x888d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8883
+	.4byte	0x8899
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x88bb
+	.4byte	0x88d1
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
-	.4byte	0x880c
+	.4byte	0x8822
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x88a7
+	.4byte	0x88bd
 	.uleb128 0x14
 	.4byte	0x22f
-	.4byte	0x88d5
+	.4byte	0x88eb
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
-	.4byte	0x88d5
+	.4byte	0x88eb
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x88db
+	.4byte	0x88f1
 	.uleb128 0x24
-	.4byte	.LASF2000
+	.4byte	.LASF2002
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x88c1
+	.4byte	0x88d7
 	.uleb128 0x14
 	.4byte	0x194
-	.4byte	0x88ff
+	.4byte	0x8915
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
@@ -25990,45 +26339,45 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x88e6
+	.4byte	0x88fc
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8919
+	.4byte	0x892f
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
-	.4byte	0x3c8a
+	.4byte	0x3ca0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8905
+	.4byte	0x891b
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8933
+	.4byte	0x8949
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x891f
+	.4byte	0x8935
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x894d
+	.4byte	0x8963
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
-	.4byte	0x7ee4
+	.4byte	0x7efa
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8939
+	.4byte	0x894f
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8971
+	.4byte	0x8987
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
 	.4byte	0x2c3
 	.uleb128 0x11
@@ -26038,70 +26387,70 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8953
+	.4byte	0x8969
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8990
+	.4byte	0x89a6
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8977
+	.4byte	0x898d
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x89af
+	.4byte	0x89c5
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0x7f47
+	.4byte	0x7f5d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8996
+	.4byte	0x89ac
 	.uleb128 0x14
 	.4byte	0x2d9
-	.4byte	0x89dd
+	.4byte	0x89f3
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
-	.4byte	0x343e
+	.4byte	0x3454
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0x8877
+	.4byte	0x888d
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x89b5
+	.4byte	0x89cb
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x89f2
+	.4byte	0x8a08
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x89e3
+	.4byte	0x89f9
 	.uleb128 0x14
 	.4byte	0x2d9
-	.4byte	0x8a1b
+	.4byte	0x8a31
 	.uleb128 0x11
-	.4byte	0x4930
+	.4byte	0x4946
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
-	.4byte	0x8877
+	.4byte	0x888d
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
@@ -26109,16 +26458,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x89f8
+	.4byte	0x8a0e
 	.uleb128 0x14
 	.4byte	0x2d9
-	.4byte	0x8a44
+	.4byte	0x8a5a
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
-	.4byte	0x8877
+	.4byte	0x888d
 	.uleb128 0x11
-	.4byte	0x4930
+	.4byte	0x4946
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
@@ -26126,30 +26475,30 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8a21
+	.4byte	0x8a37
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8a68
+	.4byte	0x8a7e
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
 	.4byte	0x194
 	.uleb128 0x11
-	.4byte	0x8a68
+	.4byte	0x8a7e
 	.uleb128 0x11
-	.4byte	0x783f
+	.4byte	0x7855
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x7f47
+	.4byte	0x7f5d
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8a4a
+	.4byte	0x8a60
 	.uleb128 0x14
 	.4byte	0x194
-	.4byte	0x8a92
+	.4byte	0x8aa8
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -26159,23 +26508,23 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8a74
+	.4byte	0x8a8a
 	.uleb128 0x10
-	.4byte	0x8aa8
+	.4byte	0x8abe
 	.uleb128 0x11
-	.4byte	0x8aa8
+	.4byte	0x8abe
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8aae
+	.4byte	0x8ac4
 	.uleb128 0xd
-	.4byte	.LASF2001
+	.4byte	.LASF2003
 	.byte	0x80
 	.byte	0x8e
 	.byte	0x10
-	.4byte	0x8b56
+	.4byte	0x8b6c
 	.uleb128 0x20
 	.string	"buf"
 	.byte	0x8e
@@ -26183,43 +26532,43 @@ __exitcall_ebc_exit:
 	.4byte	0x219
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0x8e
 	.byte	0x12
 	.4byte	0x2ce
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2002
+	.4byte	.LASF2004
 	.byte	0x8e
 	.byte	0x13
 	.4byte	0x2ce
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF380
+	.4byte	.LASF382
 	.byte	0x8e
 	.byte	0x14
 	.4byte	0x2ce
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2003
+	.4byte	.LASF2005
 	.byte	0x8e
 	.byte	0x15
 	.4byte	0x2ce
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF877
+	.4byte	.LASF879
 	.byte	0x8e
 	.byte	0x16
 	.4byte	0x2c3
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2004
+	.4byte	.LASF2006
 	.byte	0x8e
 	.byte	0x17
 	.4byte	0x2c3
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1722
+	.4byte	.LASF1724
 	.byte	0x8e
 	.byte	0x18
 	.4byte	0x155
@@ -26228,28 +26577,28 @@ __exitcall_ebc_exit:
 	.4byte	.LASF115
 	.byte	0x8e
 	.byte	0x19
-	.4byte	0x243f
+	.4byte	0x2455
 	.byte	0x40
 	.uleb128 0x20
 	.string	"op"
 	.byte	0x8e
 	.byte	0x1a
-	.4byte	0x968b
+	.4byte	0x96a1
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2005
+	.4byte	.LASF2007
 	.byte	0x8e
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF1270
+	.4byte	.LASF1272
 	.byte	0x8e
 	.byte	0x1c
-	.4byte	0x9691
+	.4byte	0x96a7
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF357
+	.4byte	.LASF359
 	.byte	0x8e
 	.byte	0x1d
 	.4byte	0x443
@@ -26257,16 +26606,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8a98
+	.4byte	0x8aae
 	.uleb128 0x14
 	.4byte	0x2d9
-	.4byte	0x8b84
+	.4byte	0x8b9a
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
 	.4byte	0x2c3
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
 	.4byte	0x2c3
 	.uleb128 0x11
@@ -26276,16 +26625,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8b5c
+	.4byte	0x8b72
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8bad
+	.4byte	0x8bc3
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
 	.4byte	0x2c3
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
 	.4byte	0x2c3
 	.uleb128 0x11
@@ -26293,76 +26642,76 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8b8a
+	.4byte	0x8ba0
 	.uleb128 0x14
-	.4byte	0x196a
-	.4byte	0x8bcc
+	.4byte	0x1980
+	.4byte	0x8be2
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8bb3
+	.4byte	0x8bc9
 	.uleb128 0x14
 	.4byte	0x56
-	.4byte	0x8beb
+	.4byte	0x8c01
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
-	.4byte	0x8beb
+	.4byte	0x8c01
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5cdf
+	.4byte	0x5cf5
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8bd2
+	.4byte	0x8be8
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8c0b
+	.4byte	0x8c21
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8bf7
+	.4byte	0x8c0d
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8c2a
+	.4byte	0x8c40
 	.uleb128 0x11
-	.4byte	0x2239
+	.4byte	0x224f
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8c11
+	.4byte	0x8c27
 	.uleb128 0x14
-	.4byte	0x7c11
-	.4byte	0x8c44
+	.4byte	0x7c27
+	.4byte	0x8c5a
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8c30
+	.4byte	0x8c46
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8c63
+	.4byte	0x8c79
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.uleb128 0x11
 	.4byte	0x219
 	.uleb128 0x11
@@ -26370,14 +26719,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8c4a
+	.4byte	0x8c60
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8c87
+	.4byte	0x8c9d
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.uleb128 0x11
 	.4byte	0x27a
 	.uleb128 0x11
@@ -26385,64 +26734,64 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8c69
+	.4byte	0x8c7f
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8ca6
+	.4byte	0x8cbc
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8c8d
+	.4byte	0x8ca3
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8cc0
+	.4byte	0x8cd6
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8cac
+	.4byte	0x8cc2
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8cdf
+	.4byte	0x8cf5
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.uleb128 0x11
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8cc6
+	.4byte	0x8cdc
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8cfe
+	.4byte	0x8d14
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.uleb128 0x11
 	.4byte	0x27a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8ce5
+	.4byte	0x8cfb
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8d22
+	.4byte	0x8d38
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.uleb128 0x11
 	.4byte	0x27a
 	.uleb128 0x11
@@ -26450,58 +26799,58 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8d04
+	.4byte	0x8d1a
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8d4b
+	.4byte	0x8d61
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8d28
+	.4byte	0x8d3e
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8d65
+	.4byte	0x8d7b
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.uleb128 0x11
-	.4byte	0x8d65
+	.4byte	0x8d7b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5f73
+	.4byte	0x5f89
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8d51
+	.4byte	0x8d67
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8d8a
+	.4byte	0x8da0
 	.uleb128 0x11
-	.4byte	0x2239
+	.4byte	0x224f
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.uleb128 0x11
-	.4byte	0x8d65
+	.4byte	0x8d7b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8d71
+	.4byte	0x8d87
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8dae
+	.4byte	0x8dc4
 	.uleb128 0x11
-	.4byte	0x20e7
+	.4byte	0x20fd
 	.uleb128 0x11
-	.4byte	0x8dae
+	.4byte	0x8dc4
 	.uleb128 0x11
 	.4byte	0x13a
 	.uleb128 0x11
@@ -26509,15 +26858,15 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4a6f
+	.4byte	0x4a85
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8d90
+	.4byte	0x8da6
 	.uleb128 0x14
 	.4byte	0x2d9
-	.4byte	0x8dd3
+	.4byte	0x8de9
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.uleb128 0x11
 	.4byte	0x219
 	.uleb128 0x11
@@ -26525,14 +26874,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8dba
+	.4byte	0x8dd0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8df7
+	.4byte	0x8e0d
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
-	.4byte	0x8df7
+	.4byte	0x8e0d
 	.uleb128 0x11
 	.4byte	0x155
 	.uleb128 0x11
@@ -26540,17 +26889,17 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x878a
+	.4byte	0x87a0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8dd9
+	.4byte	0x8def
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8e1c
+	.4byte	0x8e32
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
-	.4byte	0x8e1c
+	.4byte	0x8e32
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
@@ -26559,16 +26908,16 @@ __exitcall_ebc_exit:
 	.4byte	0xa12
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8e03
+	.4byte	0x8e19
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8e4b
+	.4byte	0x8e61
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
@@ -26576,130 +26925,130 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8e28
+	.4byte	0x8e3e
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8e6a
+	.4byte	0x8e80
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
-	.4byte	0x7c11
+	.4byte	0x7c27
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8e51
+	.4byte	0x8e67
 	.uleb128 0x14
-	.4byte	0x1c54
-	.4byte	0x8e7f
+	.4byte	0x1c6a
+	.4byte	0x8e95
 	.uleb128 0x11
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8e70
+	.4byte	0x8e86
 	.uleb128 0x10
-	.4byte	0x8e90
+	.4byte	0x8ea6
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8e85
+	.4byte	0x8e9b
 	.uleb128 0x10
-	.4byte	0x8ea6
+	.4byte	0x8ebc
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8e96
+	.4byte	0x8eac
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8ec0
+	.4byte	0x8ed6
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.uleb128 0x11
-	.4byte	0x7794
+	.4byte	0x77aa
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8eac
+	.4byte	0x8ec2
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8ed5
+	.4byte	0x8eeb
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8ec6
+	.4byte	0x8edc
 	.uleb128 0x10
-	.4byte	0x8ee6
+	.4byte	0x8efc
 	.uleb128 0x11
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8edb
+	.4byte	0x8ef1
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8efb
+	.4byte	0x8f11
 	.uleb128 0x11
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8eec
+	.4byte	0x8f02
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8f15
+	.4byte	0x8f2b
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.uleb128 0x11
-	.4byte	0x8f15
+	.4byte	0x8f2b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8f1b
+	.4byte	0x8f31
 	.uleb128 0x24
-	.4byte	.LASF2006
+	.4byte	.LASF2008
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8f01
+	.4byte	0x8f17
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8f3f
+	.4byte	0x8f55
 	.uleb128 0x11
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.uleb128 0x11
-	.4byte	0x4653
+	.4byte	0x4669
 	.uleb128 0x11
 	.4byte	0x219
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8f26
+	.4byte	0x8f3c
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8f63
+	.4byte	0x8f79
 	.uleb128 0x11
-	.4byte	0x2239
+	.4byte	0x224f
 	.uleb128 0x11
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.uleb128 0x11
-	.4byte	0x4653
+	.4byte	0x4669
 	.uleb128 0x11
 	.4byte	0x219
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8f45
+	.4byte	0x8f5b
 	.uleb128 0x10
-	.4byte	0x8f79
+	.4byte	0x8f8f
 	.uleb128 0x11
 	.4byte	0x443
 	.uleb128 0x11
@@ -26707,46 +27056,46 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8f69
+	.4byte	0x8f7f
 	.uleb128 0x10
-	.4byte	0x8f8f
+	.4byte	0x8fa5
 	.uleb128 0x11
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8f7f
+	.4byte	0x8f95
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8fa9
+	.4byte	0x8fbf
 	.uleb128 0x11
-	.4byte	0x8aa8
+	.4byte	0x8abe
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8f95
+	.4byte	0x8fab
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x8fc8
+	.4byte	0x8fde
 	.uleb128 0x11
-	.4byte	0x2239
+	.4byte	0x224f
 	.uleb128 0x11
-	.4byte	0x8aa8
+	.4byte	0x8abe
 	.uleb128 0x11
-	.4byte	0x196a
+	.4byte	0x1980
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8faf
+	.4byte	0x8fc5
 	.uleb128 0x14
 	.4byte	0x2d9
-	.4byte	0x8ff1
+	.4byte	0x9007
 	.uleb128 0x11
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -26758,12 +27107,12 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8fce
+	.4byte	0x8fe4
 	.uleb128 0x14
 	.4byte	0x2d9
-	.4byte	0x901a
+	.4byte	0x9030
 	.uleb128 0x11
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -26775,48 +27124,48 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x8ff7
+	.4byte	0x900d
 	.uleb128 0x14
-	.4byte	0x902f
-	.4byte	0x902f
+	.4byte	0x9045
+	.4byte	0x9045
 	.uleb128 0x11
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x698d
+	.4byte	0x69a3
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9020
+	.4byte	0x9036
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9054
+	.4byte	0x906a
 	.uleb128 0x11
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.uleb128 0x11
-	.4byte	0x343e
+	.4byte	0x3454
 	.uleb128 0x11
 	.4byte	0x31b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x903b
+	.4byte	0x9051
 	.uleb128 0x14
 	.4byte	0x194
-	.4byte	0x906e
+	.4byte	0x9084
 	.uleb128 0x11
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.uleb128 0x11
-	.4byte	0x4c17
+	.4byte	0x4c2d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x905a
+	.4byte	0x9070
 	.uleb128 0x14
-	.4byte	0x196a
-	.4byte	0x9092
+	.4byte	0x1980
+	.4byte	0x90a8
 	.uleb128 0x11
-	.4byte	0x8463
+	.4byte	0x8479
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -26826,14 +27175,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9074
+	.4byte	0x908a
 	.uleb128 0x14
-	.4byte	0x196a
-	.4byte	0x90bb
+	.4byte	0x1980
+	.4byte	0x90d1
 	.uleb128 0x11
-	.4byte	0x2239
+	.4byte	0x224f
 	.uleb128 0x11
-	.4byte	0x8463
+	.4byte	0x8479
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -26843,25 +27192,25 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9098
+	.4byte	0x90ae
 	.uleb128 0x16
 	.4byte	0x443
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x90c1
+	.4byte	0x90d7
 	.uleb128 0x5
 	.4byte	0xdfc
-	.4byte	0x90dc
+	.4byte	0x90f2
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2007
+	.4byte	.LASF2009
 	.byte	0x60
 	.byte	0x8f
 	.byte	0x42
-	.4byte	0x91b7
+	.4byte	0x91cd
 	.uleb128 0xe
 	.4byte	.LASF264
 	.byte	0x8f
@@ -26869,43 +27218,43 @@ __exitcall_ebc_exit:
 	.4byte	0x56
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF358
+	.4byte	.LASF360
 	.byte	0x8f
 	.byte	0x44
 	.4byte	0x392
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF637
+	.4byte	.LASF639
 	.byte	0x8f
 	.byte	0x45
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2008
+	.4byte	.LASF2010
 	.byte	0x8f
 	.byte	0x46
-	.4byte	0xa0b1
+	.4byte	0xa0c7
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2009
+	.4byte	.LASF2011
 	.byte	0x8f
 	.byte	0x47
-	.4byte	0xa13c
+	.4byte	0xa152
 	.byte	0x28
 	.uleb128 0x20
 	.string	"sd"
 	.byte	0x8f
 	.byte	0x48
-	.4byte	0x9996
+	.4byte	0x99ac
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2010
+	.4byte	.LASF2012
 	.byte	0x8f
 	.byte	0x49
-	.4byte	0xa015
+	.4byte	0xa02b
 	.byte	0x38
 	.uleb128 0x38
-	.4byte	.LASF2011
+	.4byte	.LASF2013
 	.byte	0x8f
 	.byte	0x4d
 	.4byte	0x6d
@@ -26914,7 +27263,7 @@ __exitcall_ebc_exit:
 	.byte	0x1f
 	.byte	0x3c
 	.uleb128 0x38
-	.4byte	.LASF2012
+	.4byte	.LASF2014
 	.byte	0x8f
 	.byte	0x4e
 	.4byte	0x6d
@@ -26923,7 +27272,7 @@ __exitcall_ebc_exit:
 	.byte	0x1e
 	.byte	0x3c
 	.uleb128 0x38
-	.4byte	.LASF2013
+	.4byte	.LASF2015
 	.byte	0x8f
 	.byte	0x4f
 	.4byte	0x6d
@@ -26932,7 +27281,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.byte	0x3c
 	.uleb128 0x38
-	.4byte	.LASF2014
+	.4byte	.LASF2016
 	.byte	0x8f
 	.byte	0x50
 	.4byte	0x6d
@@ -26941,7 +27290,7 @@ __exitcall_ebc_exit:
 	.byte	0x1c
 	.byte	0x3c
 	.uleb128 0x38
-	.4byte	.LASF2015
+	.4byte	.LASF2017
 	.byte	0x8f
 	.byte	0x51
 	.4byte	0x6d
@@ -26975,375 +27324,375 @@ __exitcall_ebc_exit:
 	.byte	0x58
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF2016
+	.4byte	.LASF2018
 	.byte	0x1f
 	.2byte	0x93b
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x90dc
+	.4byte	0x90f2
 	.uleb128 0x15
-	.4byte	.LASF2017
+	.4byte	.LASF2019
 	.byte	0x1f
 	.2byte	0xa1e
-	.4byte	0x5223
+	.4byte	0x5239
 	.uleb128 0x15
-	.4byte	.LASF2018
+	.4byte	.LASF2020
 	.byte	0x1f
 	.2byte	0xa36
-	.4byte	0x20bc
+	.4byte	0x20d2
 	.uleb128 0x15
-	.4byte	.LASF2019
+	.4byte	.LASF2021
 	.byte	0x1f
 	.2byte	0xa5b
 	.4byte	0x7b4
 	.uleb128 0x15
-	.4byte	.LASF2020
+	.4byte	.LASF2022
 	.byte	0x1f
 	.2byte	0xa5c
 	.4byte	0x7b4
 	.uleb128 0x5
 	.4byte	0x5c
-	.4byte	0x9209
+	.4byte	0x921f
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x91f9
+	.4byte	0x920f
 	.uleb128 0x46
-	.4byte	.LASF3017
+	.4byte	.LASF3021
 	.byte	0x1f
 	.2byte	0xba2
-	.4byte	0x9209
+	.4byte	0x921f
 	.uleb128 0x15
-	.4byte	.LASF2021
+	.4byte	.LASF2023
 	.byte	0x1f
 	.2byte	0xc7d
 	.4byte	0x7b4
 	.uleb128 0x15
-	.4byte	.LASF2022
+	.4byte	.LASF2024
 	.byte	0x1f
 	.2byte	0xc89
-	.4byte	0x7d85
+	.4byte	0x7d9b
 	.uleb128 0x15
-	.4byte	.LASF2023
+	.4byte	.LASF2025
 	.byte	0x1f
 	.2byte	0xc9a
-	.4byte	0x7d85
+	.4byte	0x7d9b
 	.uleb128 0x15
-	.4byte	.LASF2024
+	.4byte	.LASF2026
 	.byte	0x1f
 	.2byte	0xcec
-	.4byte	0x1d3d
+	.4byte	0x1d53
 	.uleb128 0x15
-	.4byte	.LASF2025
+	.4byte	.LASF2027
 	.byte	0x1f
 	.2byte	0xcf0
 	.4byte	0x7b4
 	.uleb128 0x15
-	.4byte	.LASF2026
+	.4byte	.LASF2028
 	.byte	0x1f
 	.2byte	0xcf1
-	.4byte	0x7d85
+	.4byte	0x7d9b
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x2ce
 	.uleb128 0x8
-	.4byte	.LASF2027
+	.4byte	.LASF2029
 	.byte	0x90
 	.byte	0x28
-	.4byte	0x9273
+	.4byte	0x9289
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9296
+	.4byte	0x92ac
 	.uleb128 0x11
-	.4byte	0x9296
+	.4byte	0x92ac
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
 	.4byte	0x443
 	.uleb128 0x11
-	.4byte	0x9262
+	.4byte	0x9278
 	.uleb128 0x11
-	.4byte	0x8877
+	.4byte	0x888d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x929c
+	.4byte	0x92b2
 	.uleb128 0xd
-	.4byte	.LASF2028
+	.4byte	.LASF2030
 	.byte	0x40
 	.byte	0x90
 	.byte	0x71
-	.4byte	0x9315
+	.4byte	0x932b
 	.uleb128 0xe
-	.4byte	.LASF2029
+	.4byte	.LASF2031
 	.byte	0x90
 	.byte	0x73
 	.4byte	0x56
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF791
+	.4byte	.LASF793
 	.byte	0x90
 	.byte	0x74
 	.4byte	0x443
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2030
+	.4byte	.LASF2032
 	.byte	0x90
 	.byte	0x75
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF901
+	.4byte	.LASF903
 	.byte	0x90
 	.byte	0x76
 	.4byte	0x27a
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2031
+	.4byte	.LASF2033
 	.byte	0x90
 	.byte	0x77
-	.4byte	0x9296
+	.4byte	0x92ac
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2027
+	.4byte	.LASF2029
 	.byte	0x90
 	.byte	0x78
-	.4byte	0x933a
+	.4byte	0x9350
 	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF105
 	.byte	0x90
 	.byte	0x79
-	.4byte	0x9340
+	.4byte	0x9356
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2032
+	.4byte	.LASF2034
 	.byte	0x90
 	.byte	0x7a
 	.4byte	0x443
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2033
+	.4byte	.LASF2035
 	.byte	0x90
 	.byte	0x7b
 	.4byte	0x443
 	.byte	0x38
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2034
+	.4byte	.LASF2036
 	.byte	0x20
 	.byte	0x90
 	.byte	0x5f
-	.4byte	0x933a
+	.4byte	0x9350
 	.uleb128 0xe
-	.4byte	.LASF2035
+	.4byte	.LASF2037
 	.byte	0x90
 	.byte	0x60
 	.4byte	0x367
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1098
+	.4byte	.LASF1100
 	.byte	0x90
 	.byte	0x61
-	.4byte	0x1594
+	.4byte	0x15aa
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9268
+	.4byte	0x927e
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9315
+	.4byte	0x932b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x23e5
+	.4byte	0x23fb
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2405
+	.4byte	0x241b
 	.uleb128 0x5
-	.4byte	0x929c
-	.4byte	0x935d
+	.4byte	0x92b2
+	.4byte	0x9373
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2036
+	.4byte	.LASF2038
 	.byte	0x90
 	.byte	0xca
-	.4byte	0x9352
+	.4byte	0x9368
 	.uleb128 0xd
-	.4byte	.LASF2037
+	.4byte	.LASF2039
 	.byte	0x10
 	.byte	0x91
 	.byte	0x1a
-	.4byte	0x938d
+	.4byte	0x93a3
 	.uleb128 0xe
-	.4byte	.LASF1189
+	.4byte	.LASF1191
 	.byte	0x91
 	.byte	0x1b
-	.4byte	0x9392
+	.4byte	0x93a8
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2038
+	.4byte	.LASF2040
 	.byte	0x91
 	.byte	0x1c
 	.4byte	0x29
 	.byte	0x8
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF2039
+	.4byte	.LASF2041
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x938d
+	.4byte	0x93a3
 	.uleb128 0x8
-	.4byte	.LASF2040
+	.4byte	.LASF2042
 	.byte	0x8d
 	.byte	0x21
 	.4byte	0x2e4
 	.uleb128 0x8
-	.4byte	.LASF2041
+	.4byte	.LASF2043
 	.byte	0x8d
 	.byte	0x24
 	.4byte	0x2ef
 	.uleb128 0xd
-	.4byte	.LASF2042
+	.4byte	.LASF2044
 	.byte	0x18
 	.byte	0x8d
 	.byte	0x58
-	.4byte	0x93df
+	.4byte	0x93f5
 	.uleb128 0xe
 	.4byte	.LASF192
 	.byte	0x8d
 	.byte	0x59
-	.4byte	0x93e9
+	.4byte	0x93ff
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2043
+	.4byte	.LASF2045
 	.byte	0x8d
 	.byte	0x5a
 	.4byte	0x56
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2044
+	.4byte	.LASF2046
 	.byte	0x8d
 	.byte	0x5b
 	.4byte	0x2ce
 	.byte	0x10
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF2045
+	.4byte	.LASF2047
 	.uleb128 0x3
-	.4byte	0x93df
+	.4byte	0x93f5
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x93df
+	.4byte	0x93f5
 	.uleb128 0x39
-	.4byte	.LASF2046
+	.4byte	.LASF2048
 	.byte	0x20
 	.byte	0x8d
 	.byte	0x5e
-	.4byte	0x9412
+	.4byte	0x9428
 	.uleb128 0x22
-	.4byte	.LASF2047
+	.4byte	.LASF2049
 	.byte	0x8d
 	.byte	0x5f
 	.4byte	0x443
 	.uleb128 0x22
-	.4byte	.LASF791
+	.4byte	.LASF793
 	.byte	0x8d
 	.byte	0x60
-	.4byte	0x9417
+	.4byte	0x942d
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x93ef
+	.4byte	0x9405
 	.uleb128 0x5
 	.4byte	0x443
-	.4byte	0x9427
+	.4byte	0x943d
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF2048
+	.4byte	.LASF2050
 	.byte	0x8d
 	.byte	0x83
-	.4byte	0x9432
+	.4byte	0x9448
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9438
+	.4byte	0x944e
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9456
+	.4byte	0x946c
 	.uleb128 0x11
-	.4byte	0x874e
+	.4byte	0x8764
 	.uleb128 0x11
-	.4byte	0x9456
+	.4byte	0x946c
 	.uleb128 0x11
-	.4byte	0x945c
+	.4byte	0x9472
 	.uleb128 0x11
-	.4byte	0x874e
+	.4byte	0x8764
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x93e4
+	.4byte	0x93fa
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9412
+	.4byte	0x9428
 	.uleb128 0xd
-	.4byte	.LASF2049
+	.4byte	.LASF2051
 	.byte	0x18
 	.byte	0x8d
 	.byte	0x88
-	.4byte	0x9493
+	.4byte	0x94a9
 	.uleb128 0xe
-	.4byte	.LASF2050
+	.4byte	.LASF2052
 	.byte	0x8d
 	.byte	0x89
-	.4byte	0x9427
+	.4byte	0x943d
 	.byte	0
 	.uleb128 0x20
 	.string	"key"
 	.byte	0x8d
 	.byte	0x8a
-	.4byte	0x874e
+	.4byte	0x8764
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2051
+	.4byte	.LASF2053
 	.byte	0x8d
 	.byte	0x8b
-	.4byte	0x93e9
+	.4byte	0x93ff
 	.byte	0x10
 	.byte	0
 	.uleb128 0x21
 	.byte	0x18
 	.byte	0x8d
 	.byte	0x9e
-	.4byte	0x94b2
+	.4byte	0x94c8
 	.uleb128 0x22
-	.4byte	.LASF2052
+	.4byte	.LASF2054
 	.byte	0x8d
 	.byte	0x9f
 	.4byte	0x392
 	.uleb128 0x22
-	.4byte	.LASF2053
+	.4byte	.LASF2055
 	.byte	0x8d
 	.byte	0xa0
-	.4byte	0x34b7
+	.4byte	0x34cd
 	.byte	0
 	.uleb128 0x21
 	.byte	0x8
 	.byte	0x8d
 	.byte	0xa5
-	.4byte	0x94d1
+	.4byte	0x94e7
 	.uleb128 0x22
-	.4byte	.LASF2054
+	.4byte	.LASF2056
 	.byte	0x8d
 	.byte	0xa6
 	.4byte	0x9bd
 	.uleb128 0x22
-	.4byte	.LASF2055
+	.4byte	.LASF2057
 	.byte	0x8d
 	.byte	0xa7
 	.4byte	0x9bd
@@ -27352,15 +27701,15 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x8d
 	.byte	0xcc
-	.4byte	0x94f2
+	.4byte	0x9508
 	.uleb128 0xe
 	.4byte	.LASF192
 	.byte	0x8d
 	.byte	0xcd
-	.4byte	0x93e9
+	.4byte	0x93ff
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2043
+	.4byte	.LASF2045
 	.byte	0x8d
 	.byte	0xce
 	.4byte	0x219
@@ -27370,65 +27719,65 @@ __exitcall_ebc_exit:
 	.byte	0x18
 	.byte	0x8d
 	.byte	0xca
-	.4byte	0x950b
+	.4byte	0x9521
 	.uleb128 0x22
-	.4byte	.LASF2056
+	.4byte	.LASF2058
 	.byte	0x8d
 	.byte	0xcb
-	.4byte	0x93ae
+	.4byte	0x93c4
 	.uleb128 0x29
-	.4byte	0x94d1
+	.4byte	0x94e7
 	.byte	0
 	.uleb128 0xf
 	.byte	0x20
 	.byte	0x8d
 	.byte	0xd8
-	.4byte	0x952c
+	.4byte	0x9542
 	.uleb128 0xe
-	.4byte	.LASF2057
+	.4byte	.LASF2059
 	.byte	0x8d
 	.byte	0xda
 	.4byte	0x392
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2058
+	.4byte	.LASF2060
 	.byte	0x8d
 	.byte	0xdb
-	.4byte	0x9368
+	.4byte	0x937e
 	.byte	0x10
 	.byte	0
 	.uleb128 0x21
 	.byte	0x20
 	.byte	0x8d
 	.byte	0xd6
-	.4byte	0x9545
+	.4byte	0x955b
 	.uleb128 0x22
-	.4byte	.LASF2059
+	.4byte	.LASF2061
 	.byte	0x8d
 	.byte	0xd7
-	.4byte	0x93ef
+	.4byte	0x9405
 	.uleb128 0x29
-	.4byte	0x950b
+	.4byte	0x9521
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF2060
+	.4byte	.LASF2062
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9545
+	.4byte	0x955b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9462
+	.4byte	0x9478
 	.uleb128 0x15
-	.4byte	.LASF2061
+	.4byte	.LASF2063
 	.byte	0x8d
-	.2byte	0x18f
-	.4byte	0x9352
+	.2byte	0x190
+	.4byte	0x9368
 	.uleb128 0xd
-	.4byte	.LASF2062
+	.4byte	.LASF2064
 	.byte	0x28
 	.byte	0x92
 	.byte	0xf
-	.4byte	0x95c3
+	.4byte	0x95d9
 	.uleb128 0xe
 	.4byte	.LASF115
 	.byte	0x92
@@ -27436,31 +27785,31 @@ __exitcall_ebc_exit:
 	.4byte	0xe1e
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2063
+	.4byte	.LASF2065
 	.byte	0x92
 	.byte	0x12
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF2064
+	.4byte	.LASF2066
 	.byte	0x92
 	.byte	0x13
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2065
+	.4byte	.LASF2067
 	.byte	0x92
 	.byte	0x14
 	.4byte	0xc6
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF2066
+	.4byte	.LASF2068
 	.byte	0x92
 	.byte	0x15
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2067
+	.4byte	.LASF2069
 	.byte	0x92
 	.byte	0x16
 	.4byte	0x29
@@ -27473,29 +27822,29 @@ __exitcall_ebc_exit:
 	.byte	0x20
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2068
+	.4byte	.LASF2070
 	.byte	0x92
 	.byte	0x4a
-	.4byte	0x9562
+	.4byte	0x9578
 	.uleb128 0x19
-	.4byte	.LASF2069
+	.4byte	.LASF2071
 	.byte	0x64
 	.byte	0x3b
-	.4byte	0x3b69
+	.4byte	0x3b7f
 	.uleb128 0xd
-	.4byte	.LASF1117
+	.4byte	.LASF1119
 	.byte	0x8
 	.byte	0x6a
 	.byte	0x1e
-	.4byte	0x960a
+	.4byte	0x9620
 	.uleb128 0xe
-	.4byte	.LASF577
+	.4byte	.LASF579
 	.byte	0x6a
 	.byte	0x1f
 	.4byte	0x367
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2070
+	.4byte	.LASF2072
 	.byte	0x6a
 	.byte	0x20
 	.4byte	0xc6
@@ -27504,27 +27853,27 @@ __exitcall_ebc_exit:
 	.string	"gid"
 	.byte	0x6a
 	.byte	0x21
-	.4byte	0x960a
+	.4byte	0x9620
 	.byte	0x8
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x2405
-	.4byte	0x9619
+	.4byte	0x241b
+	.4byte	0x962f
 	.uleb128 0x44
 	.4byte	0x4f
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2071
+	.4byte	.LASF2073
 	.byte	0x6a
 	.byte	0x3d
-	.4byte	0x95d9
+	.4byte	0x95ef
 	.uleb128 0x21
 	.byte	0x10
 	.byte	0x6a
 	.byte	0x9a
-	.4byte	0x9643
+	.4byte	0x9659
 	.uleb128 0x22
-	.4byte	.LASF2072
+	.4byte	.LASF2074
 	.byte	0x6a
 	.byte	0x9b
 	.4byte	0xc6
@@ -27536,114 +27885,114 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x95d9
+	.4byte	0x95ef
 	.uleb128 0xd
-	.4byte	.LASF2073
+	.4byte	.LASF2075
 	.byte	0x20
 	.byte	0x8e
 	.byte	0x20
-	.4byte	0x9686
+	.4byte	0x969c
 	.uleb128 0xe
-	.4byte	.LASF1878
+	.4byte	.LASF1880
 	.byte	0x8e
 	.byte	0x21
-	.4byte	0x96ab
+	.4byte	0x96c1
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2074
+	.4byte	.LASF2076
 	.byte	0x8e
 	.byte	0x22
-	.4byte	0x96c1
+	.4byte	0x96d7
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF63
 	.byte	0x8e
 	.byte	0x23
-	.4byte	0x96e0
+	.4byte	0x96f6
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2075
+	.4byte	.LASF2077
 	.byte	0x8e
 	.byte	0x24
-	.4byte	0x96fa
+	.4byte	0x9710
 	.byte	0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x9649
+	.4byte	0x965f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9686
+	.4byte	0x969c
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x552c
+	.4byte	0x5542
 	.uleb128 0x14
 	.4byte	0x443
-	.4byte	0x96ab
+	.4byte	0x96c1
 	.uleb128 0x11
-	.4byte	0x8aa8
+	.4byte	0x8abe
 	.uleb128 0x11
-	.4byte	0x8877
+	.4byte	0x888d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9697
+	.4byte	0x96ad
 	.uleb128 0x10
-	.4byte	0x96c1
+	.4byte	0x96d7
 	.uleb128 0x11
-	.4byte	0x8aa8
+	.4byte	0x8abe
 	.uleb128 0x11
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x96b1
+	.4byte	0x96c7
 	.uleb128 0x14
 	.4byte	0x443
-	.4byte	0x96e0
+	.4byte	0x96f6
 	.uleb128 0x11
-	.4byte	0x8aa8
+	.4byte	0x8abe
 	.uleb128 0x11
 	.4byte	0x443
 	.uleb128 0x11
-	.4byte	0x8877
+	.4byte	0x888d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x96c7
+	.4byte	0x96dd
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x96fa
+	.4byte	0x9710
 	.uleb128 0x11
-	.4byte	0x8aa8
+	.4byte	0x8abe
 	.uleb128 0x11
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x96e6
+	.4byte	0x96fc
 	.uleb128 0x19
-	.4byte	.LASF2076
+	.4byte	.LASF2078
 	.byte	0x93
 	.byte	0x28
-	.4byte	0x196a
+	.4byte	0x1980
 	.uleb128 0x19
-	.4byte	.LASF2077
+	.4byte	.LASF2079
 	.byte	0x94
 	.byte	0x18
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF2078
+	.4byte	.LASF2080
 	.byte	0x94
 	.byte	0x38
 	.4byte	0x29
 	.uleb128 0xd
-	.4byte	.LASF2079
+	.4byte	.LASF2081
 	.byte	0x60
 	.byte	0xf
 	.byte	0x14
-	.4byte	0x97be
+	.4byte	0x97d4
 	.uleb128 0xe
-	.4byte	.LASF1878
+	.4byte	.LASF1880
 	.byte	0xf
 	.byte	0x15
 	.4byte	0x33c
@@ -27667,28 +28016,28 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF769
+	.4byte	.LASF771
 	.byte	0xf
 	.byte	0x19
 	.4byte	0x29
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF637
+	.4byte	.LASF639
 	.byte	0xf
 	.byte	0x1a
-	.4byte	0x97c3
+	.4byte	0x97d9
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF639
+	.4byte	.LASF641
 	.byte	0xf
 	.byte	0x1a
-	.4byte	0x97c3
+	.4byte	0x97d9
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2031
+	.4byte	.LASF2033
 	.byte	0xf
 	.byte	0x1a
-	.4byte	0x97c3
+	.4byte	0x97d9
 	.byte	0x38
 	.uleb128 0xe
 	.4byte	.LASF129
@@ -27716,102 +28065,102 @@ __exitcall_ebc_exit:
 	.byte	0x58
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x9721
+	.4byte	0x9737
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9721
+	.4byte	0x9737
 	.uleb128 0x19
-	.4byte	.LASF2080
+	.4byte	.LASF2082
 	.byte	0xf
 	.byte	0xaf
-	.4byte	0x9721
+	.4byte	0x9737
 	.uleb128 0x19
-	.4byte	.LASF2081
+	.4byte	.LASF2083
 	.byte	0xf
 	.byte	0xb0
-	.4byte	0x9721
+	.4byte	0x9737
 	.uleb128 0x32
 	.string	"idr"
 	.byte	0x18
 	.byte	0x95
 	.byte	0x13
-	.4byte	0x9810
+	.4byte	0x9826
 	.uleb128 0xe
-	.4byte	.LASF2082
+	.4byte	.LASF2084
 	.byte	0x95
 	.byte	0x14
-	.4byte	0x4dae
+	.4byte	0x4dc4
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2083
+	.4byte	.LASF2085
 	.byte	0x95
 	.byte	0x15
 	.4byte	0x6d
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2084
+	.4byte	.LASF2086
 	.byte	0x95
 	.byte	0x16
 	.4byte	0x6d
 	.byte	0x14
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2085
+	.4byte	.LASF2087
 	.byte	0x80
 	.byte	0x95
 	.byte	0xe0
-	.4byte	0x9829
+	.4byte	0x983f
 	.uleb128 0xe
-	.4byte	.LASF2086
+	.4byte	.LASF2088
 	.byte	0x95
 	.byte	0xe1
 	.4byte	0x179
 	.byte	0
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2085
+	.4byte	.LASF2087
 	.byte	0x95
 	.byte	0xe4
-	.4byte	0x9834
+	.4byte	0x984a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9810
+	.4byte	0x9826
 	.uleb128 0xd
-	.4byte	.LASF2087
+	.4byte	.LASF2089
 	.byte	0x18
 	.byte	0x96
 	.byte	0x54
-	.4byte	0x986b
+	.4byte	0x9881
 	.uleb128 0xe
-	.4byte	.LASF2088
+	.4byte	.LASF2090
 	.byte	0x96
 	.byte	0x55
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF638
+	.4byte	.LASF640
 	.byte	0x96
 	.byte	0x57
-	.4byte	0x34ee
+	.4byte	0x3504
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1189
+	.4byte	.LASF1191
 	.byte	0x96
 	.byte	0x5d
-	.4byte	0x98d7
+	.4byte	0x98ed
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2089
+	.4byte	.LASF2091
 	.byte	0x60
 	.byte	0x96
 	.byte	0xbd
-	.4byte	0x98d7
+	.4byte	0x98ed
 	.uleb128 0x20
 	.string	"kn"
 	.byte	0x96
 	.byte	0xbf
-	.4byte	0x9996
+	.4byte	0x99ac
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF170
@@ -27820,81 +28169,81 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2090
+	.4byte	.LASF2092
 	.byte	0x96
 	.byte	0xc3
-	.4byte	0x97df
+	.4byte	0x97f5
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2091
+	.4byte	.LASF2093
 	.byte	0x96
 	.byte	0xc4
 	.4byte	0x13a
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2092
+	.4byte	.LASF2094
 	.byte	0x96
 	.byte	0xc5
 	.4byte	0x13a
 	.byte	0x2c
 	.uleb128 0xe
-	.4byte	.LASF2093
+	.4byte	.LASF2095
 	.byte	0x96
 	.byte	0xc6
-	.4byte	0x9c4d
+	.4byte	0x9c63
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2094
+	.4byte	.LASF2096
 	.byte	0x96
 	.byte	0xc9
 	.4byte	0x392
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2095
+	.4byte	.LASF2097
 	.byte	0x96
 	.byte	0xcb
-	.4byte	0x1594
+	.4byte	0x15aa
 	.byte	0x48
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x986b
+	.4byte	0x9881
 	.uleb128 0xd
-	.4byte	.LASF2096
+	.4byte	.LASF2098
 	.byte	0x8
 	.byte	0x96
 	.byte	0x60
-	.4byte	0x98f6
+	.4byte	0x990c
 	.uleb128 0xe
-	.4byte	.LASF2097
+	.4byte	.LASF2099
 	.byte	0x96
 	.byte	0x61
-	.4byte	0x9996
+	.4byte	0x99ac
 	.byte	0
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2098
+	.4byte	.LASF2100
 	.byte	0x80
 	.byte	0x96
 	.byte	0x83
-	.4byte	0x9996
+	.4byte	0x99ac
 	.uleb128 0xe
-	.4byte	.LASF380
+	.4byte	.LASF382
 	.byte	0x96
 	.byte	0x84
 	.4byte	0x367
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF879
+	.4byte	.LASF881
 	.byte	0x96
 	.byte	0x85
 	.4byte	0x367
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF637
+	.4byte	.LASF639
 	.byte	0x96
 	.byte	0x8f
-	.4byte	0x9996
+	.4byte	0x99ac
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF264
@@ -27906,25 +28255,25 @@ __exitcall_ebc_exit:
 	.string	"rb"
 	.byte	0x96
 	.byte	0x92
-	.4byte	0x34b7
+	.4byte	0x34cd
 	.byte	0x18
 	.uleb128 0x20
 	.string	"ns"
 	.byte	0x96
 	.byte	0x94
-	.4byte	0x3091
+	.4byte	0x30a7
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF383
+	.4byte	.LASF385
 	.byte	0x96
 	.byte	0x95
 	.4byte	0x6d
 	.byte	0x38
 	.uleb128 0x23
-	.4byte	0x9ae8
+	.4byte	0x9afe
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2099
+	.4byte	.LASF2101
 	.byte	0x96
 	.byte	0x9c
 	.4byte	0x443
@@ -27933,7 +28282,7 @@ __exitcall_ebc_exit:
 	.string	"id"
 	.byte	0x96
 	.byte	0x9e
-	.4byte	0x9acc
+	.4byte	0x9ae2
 	.byte	0x68
 	.uleb128 0xe
 	.4byte	.LASF170
@@ -27942,108 +28291,108 @@ __exitcall_ebc_exit:
 	.4byte	0xb4
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF901
+	.4byte	.LASF903
 	.byte	0x96
 	.byte	0xa0
 	.4byte	0x27a
 	.byte	0x72
 	.uleb128 0xe
-	.4byte	.LASF1431
+	.4byte	.LASF1433
 	.byte	0x96
 	.byte	0xa1
-	.4byte	0x9b17
+	.4byte	0x9b2d
 	.byte	0x78
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x98f6
+	.4byte	0x990c
 	.uleb128 0xd
-	.4byte	.LASF2100
+	.4byte	.LASF2102
 	.byte	0x20
 	.byte	0x96
 	.byte	0x64
-	.4byte	0x99d9
+	.4byte	0x99ef
 	.uleb128 0x20
 	.string	"ops"
 	.byte	0x96
 	.byte	0x65
-	.4byte	0x9a9a
+	.4byte	0x9ab0
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF110
 	.byte	0x96
 	.byte	0x66
-	.4byte	0x9aa5
+	.4byte	0x9abb
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0x96
 	.byte	0x67
 	.4byte	0x2c3
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2101
+	.4byte	.LASF2103
 	.byte	0x96
 	.byte	0x68
-	.4byte	0x9996
+	.4byte	0x99ac
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2102
+	.4byte	.LASF2104
 	.byte	0x70
 	.byte	0x96
 	.byte	0xe2
-	.4byte	0x9a95
+	.4byte	0x9aab
 	.uleb128 0xe
 	.4byte	.LASF110
 	.byte	0x96
 	.byte	0xe7
-	.4byte	0x9d16
+	.4byte	0x9d2c
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF112
 	.byte	0x96
 	.byte	0xe8
-	.4byte	0x9d27
+	.4byte	0x9d3d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2103
+	.4byte	.LASF2105
 	.byte	0x96
 	.byte	0xf5
-	.4byte	0x96fa
+	.4byte	0x9710
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2104
+	.4byte	.LASF2106
 	.byte	0x96
 	.byte	0xf7
-	.4byte	0x96ab
+	.4byte	0x96c1
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2105
+	.4byte	.LASF2107
 	.byte	0x96
 	.byte	0xf8
-	.4byte	0x96e0
+	.4byte	0x96f6
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2106
+	.4byte	.LASF2108
 	.byte	0x96
 	.byte	0xf9
-	.4byte	0x96c1
+	.4byte	0x96d7
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF99
 	.byte	0x96
 	.byte	0xfb
-	.4byte	0x9d4b
+	.4byte	0x9d61
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF2107
+	.4byte	.LASF2109
 	.byte	0x96
 	.2byte	0x105
 	.4byte	0x2ce
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF2108
+	.4byte	.LASF2110
 	.byte	0x96
 	.2byte	0x10c
 	.4byte	0x29b
@@ -28052,19 +28401,19 @@ __exitcall_ebc_exit:
 	.4byte	.LASF100
 	.byte	0x96
 	.2byte	0x10d
-	.4byte	0x9d4b
+	.4byte	0x9d61
 	.byte	0x48
 	.uleb128 0x1b
 	.4byte	.LASF105
 	.byte	0x96
 	.2byte	0x110
-	.4byte	0x9d65
+	.4byte	0x9d7b
 	.byte	0x50
 	.uleb128 0x1b
 	.4byte	.LASF108
 	.byte	0x96
 	.2byte	0x113
-	.4byte	0x9d7f
+	.4byte	0x9d95
 	.byte	0x58
 	.uleb128 0x1b
 	.4byte	.LASF129
@@ -28080,20 +28429,20 @@ __exitcall_ebc_exit:
 	.byte	0x68
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x99d9
+	.4byte	0x99ef
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9a95
+	.4byte	0x9aab
 	.uleb128 0x24
-	.4byte	.LASF2109
+	.4byte	.LASF2111
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9aa0
+	.4byte	0x9ab6
 	.uleb128 0xf
 	.byte	0x8
 	.byte	0x96
 	.byte	0x6d
-	.4byte	0x9acc
+	.4byte	0x9ae2
 	.uleb128 0x20
 	.string	"ino"
 	.byte	0x96
@@ -28101,20 +28450,20 @@ __exitcall_ebc_exit:
 	.4byte	0x13a
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2110
+	.4byte	.LASF2112
 	.byte	0x96
 	.byte	0x75
 	.4byte	0x13a
 	.byte	0x4
 	.byte	0
 	.uleb128 0x39
-	.4byte	.LASF2111
+	.4byte	.LASF2113
 	.byte	0x8
 	.byte	0x96
 	.byte	0x6c
-	.4byte	0x9ae8
+	.4byte	0x9afe
 	.uleb128 0x29
-	.4byte	0x9aab
+	.4byte	0x9ac1
 	.uleb128 0x28
 	.string	"id"
 	.byte	0x96
@@ -28125,69 +28474,69 @@ __exitcall_ebc_exit:
 	.byte	0x20
 	.byte	0x96
 	.byte	0x96
-	.4byte	0x9b12
+	.4byte	0x9b28
 	.uleb128 0x28
 	.string	"dir"
 	.byte	0x96
 	.byte	0x97
-	.4byte	0x983a
+	.4byte	0x9850
 	.uleb128 0x22
-	.4byte	.LASF1852
+	.4byte	.LASF1854
 	.byte	0x96
 	.byte	0x98
-	.4byte	0x98dd
+	.4byte	0x98f3
 	.uleb128 0x22
-	.4byte	.LASF2112
+	.4byte	.LASF2114
 	.byte	0x96
 	.byte	0x99
-	.4byte	0x999c
+	.4byte	0x99b2
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF2113
+	.4byte	.LASF2115
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9b12
+	.4byte	0x9b28
 	.uleb128 0xd
-	.4byte	.LASF2114
+	.4byte	.LASF2116
 	.byte	0x50
 	.byte	0x96
 	.byte	0xab
-	.4byte	0x9ba2
+	.4byte	0x9bb8
 	.uleb128 0xe
-	.4byte	.LASF1963
+	.4byte	.LASF1965
 	.byte	0x96
 	.byte	0xac
-	.4byte	0x9bbb
+	.4byte	0x9bd1
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1969
+	.4byte	.LASF1971
 	.byte	0x96
 	.byte	0xad
-	.4byte	0x9bd5
+	.4byte	0x9beb
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1853
+	.4byte	.LASF1855
 	.byte	0x96
 	.byte	0xaf
-	.4byte	0x9bf4
+	.4byte	0x9c0a
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1854
+	.4byte	.LASF1856
 	.byte	0x96
 	.byte	0xb1
-	.4byte	0x9c09
+	.4byte	0x9c1f
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1856
+	.4byte	.LASF1858
 	.byte	0x96
 	.byte	0xb2
-	.4byte	0x9c28
+	.4byte	0x9c3e
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1972
+	.4byte	.LASF1974
 	.byte	0x96
 	.byte	0xb4
-	.4byte	0x9c47
+	.4byte	0x9c5d
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF129
@@ -28216,33 +28565,33 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9bbb
+	.4byte	0x9bd1
 	.uleb128 0x11
-	.4byte	0x98d7
+	.4byte	0x98ed
 	.uleb128 0x11
-	.4byte	0x4653
+	.4byte	0x4669
 	.uleb128 0x11
 	.4byte	0x219
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9ba2
+	.4byte	0x9bb8
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9bd5
+	.4byte	0x9beb
 	.uleb128 0x11
-	.4byte	0x8aa8
+	.4byte	0x8abe
 	.uleb128 0x11
-	.4byte	0x98d7
+	.4byte	0x98ed
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9bc1
+	.4byte	0x9bd7
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9bf4
+	.4byte	0x9c0a
 	.uleb128 0x11
-	.4byte	0x9996
+	.4byte	0x99ac
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
@@ -28250,113 +28599,113 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9bdb
+	.4byte	0x9bf1
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9c09
+	.4byte	0x9c1f
 	.uleb128 0x11
-	.4byte	0x9996
+	.4byte	0x99ac
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9bfa
+	.4byte	0x9c10
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9c28
+	.4byte	0x9c3e
 	.uleb128 0x11
-	.4byte	0x9996
+	.4byte	0x99ac
 	.uleb128 0x11
-	.4byte	0x9996
+	.4byte	0x99ac
 	.uleb128 0x11
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9c0f
+	.4byte	0x9c25
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9c47
+	.4byte	0x9c5d
 	.uleb128 0x11
-	.4byte	0x8aa8
+	.4byte	0x8abe
 	.uleb128 0x11
-	.4byte	0x9996
+	.4byte	0x99ac
 	.uleb128 0x11
-	.4byte	0x98d7
+	.4byte	0x98ed
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9c2e
+	.4byte	0x9c44
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9b1d
+	.4byte	0x9b33
 	.uleb128 0xd
-	.4byte	.LASF2115
+	.4byte	.LASF2117
 	.byte	0x98
 	.byte	0x96
 	.byte	0xce
-	.4byte	0x9d01
+	.4byte	0x9d17
 	.uleb128 0x20
 	.string	"kn"
 	.byte	0x96
 	.byte	0xd0
-	.4byte	0x9996
+	.4byte	0x99ac
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1270
+	.4byte	.LASF1272
 	.byte	0x96
 	.byte	0xd1
-	.4byte	0x5531
+	.4byte	0x5547
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2001
+	.4byte	.LASF2003
 	.byte	0x96
 	.byte	0xd2
-	.4byte	0x8aa8
+	.4byte	0x8abe
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2099
+	.4byte	.LASF2101
 	.byte	0x96
 	.byte	0xd3
 	.4byte	0x443
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF572
+	.4byte	.LASF574
 	.byte	0x96
 	.byte	0xd6
-	.4byte	0x243f
+	.4byte	0x2455
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2116
+	.4byte	.LASF2118
 	.byte	0x96
 	.byte	0xd7
-	.4byte	0x243f
+	.4byte	0x2455
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2035
+	.4byte	.LASF2037
 	.byte	0x96
 	.byte	0xd8
 	.4byte	0xc6
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF959
+	.4byte	.LASF961
 	.byte	0x96
 	.byte	0xd9
 	.4byte	0x392
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2117
+	.4byte	.LASF2119
 	.byte	0x96
 	.byte	0xda
 	.4byte	0x219
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2107
+	.4byte	.LASF2109
 	.byte	0x96
 	.byte	0xdc
 	.4byte	0x2ce
 	.byte	0x80
 	.uleb128 0x38
-	.4byte	.LASF2118
+	.4byte	.LASF2120
 	.byte	0x96
 	.byte	0xdd
 	.4byte	0x29b
@@ -28365,7 +28714,7 @@ __exitcall_ebc_exit:
 	.byte	0x7
 	.byte	0x88
 	.uleb128 0x38
-	.4byte	.LASF2119
+	.4byte	.LASF2121
 	.byte	0x96
 	.byte	0xde
 	.4byte	0x29b
@@ -28374,37 +28723,37 @@ __exitcall_ebc_exit:
 	.byte	0x6
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF974
+	.4byte	.LASF976
 	.byte	0x96
 	.byte	0xdf
-	.4byte	0x5680
+	.4byte	0x5696
 	.byte	0x90
 	.byte	0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9d10
+	.4byte	0x9d26
 	.uleb128 0x11
-	.4byte	0x9d10
+	.4byte	0x9d26
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9c53
+	.4byte	0x9c69
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9d01
+	.4byte	0x9d17
 	.uleb128 0x10
-	.4byte	0x9d27
+	.4byte	0x9d3d
 	.uleb128 0x11
-	.4byte	0x9d10
+	.4byte	0x9d26
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9d1c
+	.4byte	0x9d32
 	.uleb128 0x14
 	.4byte	0x2d9
-	.4byte	0x9d4b
+	.4byte	0x9d61
 	.uleb128 0x11
-	.4byte	0x9d10
+	.4byte	0x9d26
 	.uleb128 0x11
 	.4byte	0x219
 	.uleb128 0x11
@@ -28414,121 +28763,121 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9d2d
+	.4byte	0x9d43
 	.uleb128 0x14
 	.4byte	0x22f
-	.4byte	0x9d65
+	.4byte	0x9d7b
 	.uleb128 0x11
-	.4byte	0x9d10
+	.4byte	0x9d26
 	.uleb128 0x11
-	.4byte	0x88d5
+	.4byte	0x88eb
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9d51
+	.4byte	0x9d67
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9d7f
+	.4byte	0x9d95
 	.uleb128 0x11
-	.4byte	0x9d10
+	.4byte	0x9d26
 	.uleb128 0x11
-	.4byte	0x3c8a
+	.4byte	0x3ca0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9d6b
+	.4byte	0x9d81
 	.uleb128 0x1f
-	.4byte	.LASF2120
+	.4byte	.LASF2122
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x97
 	.byte	0x1a
-	.4byte	0x9da8
+	.4byte	0x9dbe
 	.uleb128 0xc
-	.4byte	.LASF2121
+	.4byte	.LASF2123
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2122
+	.4byte	.LASF2124
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2123
+	.4byte	.LASF2125
 	.byte	0x2
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2124
+	.4byte	.LASF2126
 	.byte	0x30
 	.byte	0x97
 	.byte	0x27
-	.4byte	0x9dfd
+	.4byte	0x9e13
 	.uleb128 0xe
 	.4byte	.LASF192
 	.byte	0x97
 	.byte	0x28
-	.4byte	0x9d85
+	.4byte	0x9d9b
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2125
+	.4byte	.LASF2127
 	.byte	0x97
 	.byte	0x29
-	.4byte	0x9e07
+	.4byte	0x9e1d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2126
+	.4byte	.LASF2128
 	.byte	0x97
 	.byte	0x2a
-	.4byte	0x90c6
+	.4byte	0x90dc
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2127
+	.4byte	.LASF2129
 	.byte	0x97
 	.byte	0x2b
-	.4byte	0x9e27
+	.4byte	0x9e3d
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2128
+	.4byte	.LASF2130
 	.byte	0x97
 	.byte	0x2c
-	.4byte	0x9e32
+	.4byte	0x9e48
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2129
+	.4byte	.LASF2131
 	.byte	0x97
 	.byte	0x2d
-	.4byte	0x2f0a
+	.4byte	0x2f20
 	.byte	0x28
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x9da8
+	.4byte	0x9dbe
 	.uleb128 0x16
 	.4byte	0x29b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9e02
+	.4byte	0x9e18
 	.uleb128 0x14
-	.4byte	0x3091
-	.4byte	0x9e1c
+	.4byte	0x30a7
+	.4byte	0x9e32
 	.uleb128 0x11
-	.4byte	0x9e1c
+	.4byte	0x9e32
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9e22
+	.4byte	0x9e38
 	.uleb128 0x24
-	.4byte	.LASF2130
+	.4byte	.LASF2132
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9e0d
+	.4byte	0x9e23
 	.uleb128 0x16
-	.4byte	0x3091
+	.4byte	0x30a7
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9e2d
+	.4byte	0x9e43
 	.uleb128 0xd
-	.4byte	.LASF2131
+	.4byte	.LASF2133
 	.byte	0x10
 	.byte	0x98
 	.byte	0x1e
-	.4byte	0x9e5d
+	.4byte	0x9e73
 	.uleb128 0xe
 	.4byte	.LASF264
 	.byte	0x98
@@ -28536,18 +28885,18 @@ __exitcall_ebc_exit:
 	.4byte	0x56
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF901
+	.4byte	.LASF903
 	.byte	0x98
 	.byte	0x20
 	.4byte	0x27a
 	.byte	0x8
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2132
+	.4byte	.LASF2134
 	.byte	0x28
 	.byte	0x98
 	.byte	0x54
-	.4byte	0x9ea6
+	.4byte	0x9ebc
 	.uleb128 0xe
 	.4byte	.LASF264
 	.byte	0x98
@@ -28555,81 +28904,81 @@ __exitcall_ebc_exit:
 	.4byte	0x56
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2133
+	.4byte	.LASF2135
 	.byte	0x98
 	.byte	0x56
-	.4byte	0x9eca
+	.4byte	0x9ee0
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2134
+	.4byte	.LASF2136
 	.byte	0x98
 	.byte	0x58
-	.4byte	0x9f44
+	.4byte	0x9f5a
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2135
+	.4byte	.LASF2137
 	.byte	0x98
 	.byte	0x5a
-	.4byte	0x9f4a
+	.4byte	0x9f60
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2136
+	.4byte	.LASF2138
 	.byte	0x98
 	.byte	0x5b
-	.4byte	0x9f50
+	.4byte	0x9f66
 	.byte	0x20
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x9e5d
+	.4byte	0x9e73
 	.uleb128 0x14
 	.4byte	0x27a
-	.4byte	0x9ec4
+	.4byte	0x9eda
 	.uleb128 0x11
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.uleb128 0x11
-	.4byte	0x9ec4
+	.4byte	0x9eda
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9e38
+	.4byte	0x9e4e
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9eab
+	.4byte	0x9ec1
 	.uleb128 0x14
 	.4byte	0x27a
-	.4byte	0x9ee9
+	.4byte	0x9eff
 	.uleb128 0x11
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.uleb128 0x11
-	.4byte	0x9ee9
+	.4byte	0x9eff
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9eef
+	.4byte	0x9f05
 	.uleb128 0xd
-	.4byte	.LASF2137
+	.4byte	.LASF2139
 	.byte	0x38
 	.byte	0x98
 	.byte	0xa1
-	.4byte	0x9f44
+	.4byte	0x9f5a
 	.uleb128 0xe
-	.4byte	.LASF2112
+	.4byte	.LASF2114
 	.byte	0x98
 	.byte	0xa2
-	.4byte	0x9e38
+	.4byte	0x9e4e
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0x98
 	.byte	0xa3
 	.4byte	0x2ce
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF357
+	.4byte	.LASF359
 	.byte	0x98
 	.byte	0xa4
 	.4byte	0x443
@@ -28638,39 +28987,39 @@ __exitcall_ebc_exit:
 	.4byte	.LASF99
 	.byte	0x98
 	.byte	0xa5
-	.4byte	0x9f7e
+	.4byte	0x9f94
 	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF100
 	.byte	0x98
 	.byte	0xa7
-	.4byte	0x9f7e
+	.4byte	0x9f94
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF108
 	.byte	0x98
 	.byte	0xa9
-	.4byte	0x9fa2
+	.4byte	0x9fb8
 	.byte	0x30
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9ed0
+	.4byte	0x9ee6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9ec4
+	.4byte	0x9eda
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9ee9
+	.4byte	0x9eff
 	.uleb128 0x14
 	.4byte	0x2d9
-	.4byte	0x9f7e
+	.4byte	0x9f94
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.uleb128 0x11
-	.4byte	0x9ee9
+	.4byte	0x9eff
 	.uleb128 0x11
 	.4byte	0x219
 	.uleb128 0x11
@@ -28680,63 +29029,63 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9f56
+	.4byte	0x9f6c
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0x9fa2
+	.4byte	0x9fb8
 	.uleb128 0x11
-	.4byte	0x5531
+	.4byte	0x5547
 	.uleb128 0x11
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.uleb128 0x11
-	.4byte	0x9ee9
+	.4byte	0x9eff
 	.uleb128 0x11
-	.4byte	0x3c8a
+	.4byte	0x3ca0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9f84
+	.4byte	0x9f9a
 	.uleb128 0xd
-	.4byte	.LASF2138
+	.4byte	.LASF2140
 	.byte	0x10
 	.byte	0x98
 	.byte	0xd6
-	.4byte	0x9fcd
+	.4byte	0x9fe3
 	.uleb128 0xe
-	.4byte	.LASF2075
+	.4byte	.LASF2077
 	.byte	0x98
 	.byte	0xd7
-	.4byte	0x9feb
+	.4byte	0xa001
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2139
+	.4byte	.LASF2141
 	.byte	0x98
 	.byte	0xd8
-	.4byte	0xa00f
+	.4byte	0xa025
 	.byte	0x8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x9fa8
+	.4byte	0x9fbe
 	.uleb128 0x14
 	.4byte	0x2d9
-	.4byte	0x9feb
+	.4byte	0xa001
 	.uleb128 0x11
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.uleb128 0x11
-	.4byte	0x9ec4
+	.4byte	0x9eda
 	.uleb128 0x11
 	.4byte	0x219
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9fd2
+	.4byte	0x9fe8
 	.uleb128 0x14
 	.4byte	0x2d9
-	.4byte	0xa00f
+	.4byte	0xa025
 	.uleb128 0x11
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.uleb128 0x11
-	.4byte	0x9ec4
+	.4byte	0x9eda
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
@@ -28744,59 +29093,59 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9ff1
+	.4byte	0xa007
 	.uleb128 0xd
-	.4byte	.LASF2010
+	.4byte	.LASF2012
 	.byte	0x4
 	.byte	0x99
 	.byte	0x15
-	.4byte	0xa02e
+	.4byte	0xa044
 	.uleb128 0xe
-	.4byte	.LASF1124
+	.4byte	.LASF1126
 	.byte	0x99
 	.byte	0x16
-	.4byte	0x3367
+	.4byte	0x337d
 	.byte	0
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2140
+	.4byte	.LASF2142
 	.byte	0x8f
 	.byte	0x26
 	.4byte	0x4eb
 	.uleb128 0x19
-	.4byte	.LASF2141
+	.4byte	.LASF2143
 	.byte	0x8f
 	.byte	0x2a
 	.4byte	0x155
 	.uleb128 0xd
-	.4byte	.LASF2008
+	.4byte	.LASF2010
 	.byte	0xa0
 	.byte	0x8f
 	.byte	0xcb
-	.4byte	0xa0b1
+	.4byte	0xa0c7
 	.uleb128 0xe
-	.4byte	.LASF959
+	.4byte	.LASF961
 	.byte	0x8f
 	.byte	0xcc
 	.4byte	0x392
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2142
+	.4byte	.LASF2144
 	.byte	0x8f
 	.byte	0xcd
 	.4byte	0xe50
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2143
+	.4byte	.LASF2145
 	.byte	0x8f
 	.byte	0xce
-	.4byte	0x90dc
+	.4byte	0x90f2
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2144
+	.4byte	.LASF2146
 	.byte	0x8f
 	.byte	0xcf
-	.4byte	0xa345
+	.4byte	0xa35b
 	.byte	0x78
 	.uleb128 0xe
 	.4byte	.LASF129
@@ -28825,48 +29174,48 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa044
+	.4byte	0xa05a
 	.uleb128 0xd
-	.4byte	.LASF2145
+	.4byte	.LASF2147
 	.byte	0x50
 	.byte	0x8f
 	.byte	0x91
-	.4byte	0xa13c
+	.4byte	0xa152
 	.uleb128 0xe
 	.4byte	.LASF112
 	.byte	0x8f
 	.byte	0x92
-	.4byte	0xa14d
+	.4byte	0xa163
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2138
+	.4byte	.LASF2140
 	.byte	0x8f
 	.byte	0x93
-	.4byte	0xa153
+	.4byte	0xa169
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2146
+	.4byte	.LASF2148
 	.byte	0x8f
 	.byte	0x94
-	.4byte	0x9f4a
+	.4byte	0x9f60
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2147
+	.4byte	.LASF2149
 	.byte	0x8f
 	.byte	0x95
-	.4byte	0xa16e
+	.4byte	0xa184
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2148
+	.4byte	.LASF2150
 	.byte	0x8f
 	.byte	0x96
-	.4byte	0xa183
+	.4byte	0xa199
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2149
+	.4byte	.LASF2151
 	.byte	0x8f
 	.byte	0x97
-	.4byte	0xa19e
+	.4byte	0xa1b4
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF129
@@ -28895,71 +29244,71 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa0b7
+	.4byte	0xa0cd
 	.uleb128 0x10
-	.4byte	0xa14d
+	.4byte	0xa163
 	.uleb128 0x11
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa142
+	.4byte	0xa158
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9fcd
+	.4byte	0x9fe3
 	.uleb128 0x14
-	.4byte	0xa168
-	.4byte	0xa168
+	.4byte	0xa17e
+	.4byte	0xa17e
 	.uleb128 0x11
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9dfd
+	.4byte	0x9e13
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa159
+	.4byte	0xa16f
 	.uleb128 0x14
-	.4byte	0x3091
-	.4byte	0xa183
+	.4byte	0x30a7
+	.4byte	0xa199
 	.uleb128 0x11
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa174
+	.4byte	0xa18a
 	.uleb128 0x10
-	.4byte	0xa19e
+	.4byte	0xa1b4
 	.uleb128 0x11
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.uleb128 0x11
-	.4byte	0x9346
+	.4byte	0x935c
 	.uleb128 0x11
-	.4byte	0x934c
+	.4byte	0x9362
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa189
+	.4byte	0xa19f
 	.uleb128 0x26
-	.4byte	.LASF2150
+	.4byte	.LASF2152
 	.2byte	0x1220
 	.byte	0x8f
 	.byte	0x9f
-	.4byte	0xa1f1
+	.4byte	0xa207
 	.uleb128 0xe
-	.4byte	.LASF2151
+	.4byte	.LASF2153
 	.byte	0x8f
 	.byte	0xa0
-	.4byte	0xa1f1
+	.4byte	0xa207
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2152
+	.4byte	.LASF2154
 	.byte	0x8f
 	.byte	0xa1
-	.4byte	0xa201
+	.4byte	0xa217
 	.byte	0x18
 	.uleb128 0x27
-	.4byte	.LASF2153
+	.4byte	.LASF2155
 	.byte	0x8f
 	.byte	0xa2
 	.4byte	0xc6
@@ -28968,10 +29317,10 @@ __exitcall_ebc_exit:
 	.string	"buf"
 	.byte	0x8f
 	.byte	0xa3
-	.4byte	0xa211
+	.4byte	0xa227
 	.2byte	0x21c
 	.uleb128 0x27
-	.4byte	.LASF2154
+	.4byte	.LASF2156
 	.byte	0x8f
 	.byte	0xa4
 	.4byte	0xc6
@@ -28979,144 +29328,144 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x219
-	.4byte	0xa201
+	.4byte	0xa217
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x219
-	.4byte	0xa211
+	.4byte	0xa227
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x3f
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0xa222
+	.4byte	0xa238
 	.uleb128 0x43
 	.4byte	0x4f
 	.2byte	0xfff
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2155
+	.4byte	.LASF2157
 	.byte	0x18
 	.byte	0x8f
 	.byte	0xa7
-	.4byte	0xa253
+	.4byte	0xa269
 	.uleb128 0xe
-	.4byte	.LASF902
+	.4byte	.LASF904
 	.byte	0x8f
 	.byte	0xa8
-	.4byte	0xa272
+	.4byte	0xa288
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF264
 	.byte	0x8f
 	.byte	0xa9
-	.4byte	0xa291
+	.4byte	0xa2a7
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2156
+	.4byte	.LASF2158
 	.byte	0x8f
 	.byte	0xaa
-	.4byte	0xa2bb
+	.4byte	0xa2d1
 	.byte	0x10
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xa222
+	.4byte	0xa238
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xa26c
+	.4byte	0xa282
 	.uleb128 0x11
-	.4byte	0xa0b1
+	.4byte	0xa0c7
 	.uleb128 0x11
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa258
+	.4byte	0xa26e
 	.uleb128 0x3
-	.4byte	0xa26c
+	.4byte	0xa282
 	.uleb128 0x14
 	.4byte	0x56
-	.4byte	0xa28b
+	.4byte	0xa2a1
 	.uleb128 0x11
-	.4byte	0xa0b1
+	.4byte	0xa0c7
 	.uleb128 0x11
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa277
+	.4byte	0xa28d
 	.uleb128 0x3
-	.4byte	0xa28b
+	.4byte	0xa2a1
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xa2af
+	.4byte	0xa2c5
 	.uleb128 0x11
-	.4byte	0xa0b1
+	.4byte	0xa0c7
 	.uleb128 0x11
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.uleb128 0x11
-	.4byte	0xa2af
+	.4byte	0xa2c5
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa1a4
+	.4byte	0xa1ba
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa296
+	.4byte	0xa2ac
 	.uleb128 0x3
-	.4byte	0xa2b5
+	.4byte	0xa2cb
 	.uleb128 0xd
-	.4byte	.LASF2157
+	.4byte	.LASF2159
 	.byte	0x20
 	.byte	0x8f
 	.byte	0xae
-	.4byte	0xa2f1
+	.4byte	0xa307
 	.uleb128 0xe
-	.4byte	.LASF2112
+	.4byte	.LASF2114
 	.byte	0x8f
 	.byte	0xaf
-	.4byte	0x9e38
+	.4byte	0x9e4e
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2075
+	.4byte	.LASF2077
 	.byte	0x8f
 	.byte	0xb0
-	.4byte	0xa310
+	.4byte	0xa326
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2139
+	.4byte	.LASF2141
 	.byte	0x8f
 	.byte	0xb2
-	.4byte	0xa334
+	.4byte	0xa34a
 	.byte	0x18
 	.byte	0
 	.uleb128 0x14
 	.4byte	0x2d9
-	.4byte	0xa30a
+	.4byte	0xa320
 	.uleb128 0x11
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.uleb128 0x11
-	.4byte	0xa30a
+	.4byte	0xa320
 	.uleb128 0x11
 	.4byte	0x219
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa2c0
+	.4byte	0xa2d6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa2f1
+	.4byte	0xa307
 	.uleb128 0x14
 	.4byte	0x2d9
-	.4byte	0xa334
+	.4byte	0xa34a
 	.uleb128 0x11
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.uleb128 0x11
-	.4byte	0xa30a
+	.4byte	0xa320
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
@@ -29124,280 +29473,280 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa316
+	.4byte	0xa32c
 	.uleb128 0x19
-	.4byte	.LASF2158
+	.4byte	.LASF2160
 	.byte	0x8f
 	.byte	0xb6
-	.4byte	0x9fcd
+	.4byte	0x9fe3
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa253
+	.4byte	0xa269
 	.uleb128 0x19
-	.4byte	.LASF2159
+	.4byte	.LASF2161
 	.byte	0x8f
 	.byte	0xf5
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.uleb128 0x19
-	.4byte	.LASF2160
+	.4byte	.LASF2162
 	.byte	0x8f
 	.byte	0xf7
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.uleb128 0x19
-	.4byte	.LASF2161
+	.4byte	.LASF2163
 	.byte	0x8f
 	.byte	0xf9
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.uleb128 0x19
-	.4byte	.LASF2162
+	.4byte	.LASF2164
 	.byte	0x8f
 	.byte	0xfb
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.uleb128 0x19
-	.4byte	.LASF2163
+	.4byte	.LASF2165
 	.byte	0x8f
 	.byte	0xfd
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.uleb128 0xd
-	.4byte	.LASF2164
+	.4byte	.LASF2166
 	.byte	0x20
 	.byte	0x9a
 	.byte	0x27
-	.4byte	0xa3b3
+	.4byte	0xa3c9
 	.uleb128 0xe
-	.4byte	.LASF2165
+	.4byte	.LASF2167
 	.byte	0x9a
 	.byte	0x28
 	.4byte	0x443
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2166
+	.4byte	.LASF2168
 	.byte	0x9a
 	.byte	0x29
 	.4byte	0x392
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2167
+	.4byte	.LASF2169
 	.byte	0x9a
 	.byte	0x2a
-	.4byte	0xa015
+	.4byte	0xa02b
 	.byte	0x18
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2168
+	.4byte	.LASF2170
 	.byte	0x9b
 	.byte	0x22
 	.4byte	0x4a2
 	.uleb128 0x19
-	.4byte	.LASF2169
+	.4byte	.LASF2171
 	.byte	0x9b
 	.byte	0x23
 	.4byte	0x4a2
 	.uleb128 0x19
-	.4byte	.LASF2170
+	.4byte	.LASF2172
 	.byte	0x9b
 	.byte	0x39
 	.4byte	0x564
 	.uleb128 0xd
-	.4byte	.LASF2171
+	.4byte	.LASF2173
 	.byte	0x4
 	.byte	0x9b
 	.byte	0x3e
-	.4byte	0xa3ed
+	.4byte	0xa403
 	.uleb128 0xe
-	.4byte	.LASF2035
+	.4byte	.LASF2037
 	.byte	0x9b
 	.byte	0x3f
 	.4byte	0xc6
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF2172
+	.4byte	.LASF2174
 	.byte	0x9b
 	.byte	0x40
-	.4byte	0xa3d4
+	.4byte	0xa3ea
 	.uleb128 0x1d
-	.4byte	.LASF2173
+	.4byte	.LASF2175
 	.byte	0xb8
 	.byte	0x9b
 	.2byte	0x122
-	.4byte	0xa531
+	.4byte	0xa547
 	.uleb128 0x1b
-	.4byte	.LASF2174
+	.4byte	.LASF2176
 	.byte	0x9b
 	.2byte	0x123
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2175
+	.4byte	.LASF2177
 	.byte	0x9b
 	.2byte	0x124
-	.4byte	0xa838
+	.4byte	0xa84e
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2176
+	.4byte	.LASF2178
 	.byte	0x9b
 	.2byte	0x125
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2177
+	.4byte	.LASF2179
 	.byte	0x9b
 	.2byte	0x126
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF2178
+	.4byte	.LASF2180
 	.byte	0x9b
 	.2byte	0x127
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2179
+	.4byte	.LASF2181
 	.byte	0x9b
 	.2byte	0x128
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF2180
+	.4byte	.LASF2182
 	.byte	0x9b
 	.2byte	0x129
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF2181
+	.4byte	.LASF2183
 	.byte	0x9b
 	.2byte	0x12a
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF2182
+	.4byte	.LASF2184
 	.byte	0x9b
 	.2byte	0x12b
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF2183
+	.4byte	.LASF2185
 	.byte	0x9b
 	.2byte	0x12c
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF2184
+	.4byte	.LASF2186
 	.byte	0x9b
 	.2byte	0x12d
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF2185
+	.4byte	.LASF2187
 	.byte	0x9b
 	.2byte	0x12e
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF2186
+	.4byte	.LASF2188
 	.byte	0x9b
 	.2byte	0x12f
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF2187
+	.4byte	.LASF2189
 	.byte	0x9b
 	.2byte	0x130
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF2188
+	.4byte	.LASF2190
 	.byte	0x9b
 	.2byte	0x131
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF2189
+	.4byte	.LASF2191
 	.byte	0x9b
 	.2byte	0x132
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF2190
+	.4byte	.LASF2192
 	.byte	0x9b
 	.2byte	0x133
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x80
 	.uleb128 0x1b
-	.4byte	.LASF2191
+	.4byte	.LASF2193
 	.byte	0x9b
 	.2byte	0x134
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF2192
+	.4byte	.LASF2194
 	.byte	0x9b
 	.2byte	0x135
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF2193
+	.4byte	.LASF2195
 	.byte	0x9b
 	.2byte	0x136
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x98
 	.uleb128 0x1b
-	.4byte	.LASF2194
+	.4byte	.LASF2196
 	.byte	0x9b
 	.2byte	0x137
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF2195
+	.4byte	.LASF2197
 	.byte	0x9b
 	.2byte	0x138
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF2196
+	.4byte	.LASF2198
 	.byte	0x9b
 	.2byte	0x139
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0xb0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xa3f8
+	.4byte	0xa40e
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa54b
+	.4byte	0xa561
 	.uleb128 0x1a
-	.4byte	.LASF2197
+	.4byte	.LASF2199
 	.2byte	0x3b0
 	.byte	0x2
 	.2byte	0x407
-	.4byte	0xa822
+	.4byte	0xa838
 	.uleb128 0x1b
-	.4byte	.LASF637
+	.4byte	.LASF639
 	.byte	0x2
 	.2byte	0x408
-	.4byte	0xa545
+	.4byte	0xa55b
 	.byte	0
 	.uleb128 0x2b
 	.string	"p"
 	.byte	0x2
 	.2byte	0x40a
-	.4byte	0xb543
+	.4byte	0xb559
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2143
+	.4byte	.LASF2145
 	.byte	0x2
 	.2byte	0x40c
-	.4byte	0x90dc
+	.4byte	0x90f2
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2198
+	.4byte	.LASF2200
 	.byte	0x2
 	.2byte	0x40d
 	.4byte	0x56
@@ -29406,154 +29755,154 @@ __exitcall_ebc_exit:
 	.4byte	.LASF192
 	.byte	0x2
 	.2byte	0x40e
-	.4byte	0xb10a
+	.4byte	0xb120
 	.byte	0x78
 	.uleb128 0x1b
-	.4byte	.LASF572
+	.4byte	.LASF574
 	.byte	0x2
 	.2byte	0x410
-	.4byte	0x243f
+	.4byte	0x2455
 	.byte	0x80
 	.uleb128 0x2b
 	.string	"bus"
 	.byte	0x2
 	.2byte	0x414
-	.4byte	0xadac
+	.4byte	0xadc2
 	.byte	0xa0
 	.uleb128 0x1b
-	.4byte	.LASF2199
+	.4byte	.LASF2201
 	.byte	0x2
 	.2byte	0x415
-	.4byte	0xaf20
+	.4byte	0xaf36
 	.byte	0xa8
 	.uleb128 0x1b
-	.4byte	.LASF2200
+	.4byte	.LASF2202
 	.byte	0x2
 	.2byte	0x417
 	.4byte	0x443
 	.byte	0xb0
 	.uleb128 0x1b
-	.4byte	.LASF2201
+	.4byte	.LASF2203
 	.byte	0x2
 	.2byte	0x419
 	.4byte	0x443
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF2202
+	.4byte	.LASF2204
 	.byte	0x2
 	.2byte	0x41b
-	.4byte	0xb4ae
+	.4byte	0xb4c4
 	.byte	0xc0
 	.uleb128 0x1c
-	.4byte	.LASF2203
+	.4byte	.LASF2205
 	.byte	0x2
 	.2byte	0x41c
-	.4byte	0xa8e5
+	.4byte	0xa8fb
 	.2byte	0x128
 	.uleb128 0x1c
-	.4byte	.LASF2204
+	.4byte	.LASF2206
 	.byte	0x2
 	.2byte	0x41d
-	.4byte	0xb549
+	.4byte	0xb55f
 	.2byte	0x260
 	.uleb128 0x1c
-	.4byte	.LASF2205
+	.4byte	.LASF2207
 	.byte	0x2
 	.2byte	0x420
-	.4byte	0xb64b
+	.4byte	0xb661
 	.2byte	0x268
 	.uleb128 0x1c
-	.4byte	.LASF2206
+	.4byte	.LASF2208
 	.byte	0x2
 	.2byte	0x423
-	.4byte	0xb656
+	.4byte	0xb66c
 	.2byte	0x270
 	.uleb128 0x1c
-	.4byte	.LASF2207
+	.4byte	.LASF2209
 	.byte	0x2
 	.2byte	0x426
 	.4byte	0x392
 	.2byte	0x278
 	.uleb128 0x1c
-	.4byte	.LASF2208
+	.4byte	.LASF2210
 	.byte	0x2
 	.2byte	0x42c
-	.4byte	0xb78e
+	.4byte	0xb7a4
 	.2byte	0x288
 	.uleb128 0x1c
-	.4byte	.LASF2209
+	.4byte	.LASF2211
 	.byte	0x2
 	.2byte	0x42d
-	.4byte	0x4659
+	.4byte	0x466f
 	.2byte	0x290
 	.uleb128 0x1c
-	.4byte	.LASF2210
+	.4byte	.LASF2212
 	.byte	0x2
 	.2byte	0x42e
 	.4byte	0x155
 	.2byte	0x298
 	.uleb128 0x1c
-	.4byte	.LASF2211
+	.4byte	.LASF2213
 	.byte	0x2
 	.2byte	0x433
 	.4byte	0x155
 	.2byte	0x2a0
 	.uleb128 0x1c
-	.4byte	.LASF2212
+	.4byte	.LASF2214
 	.byte	0x2
 	.2byte	0x434
 	.4byte	0x29
 	.2byte	0x2a8
 	.uleb128 0x1c
-	.4byte	.LASF2213
+	.4byte	.LASF2215
 	.byte	0x2
 	.2byte	0x436
-	.4byte	0xb794
+	.4byte	0xb7aa
 	.2byte	0x2b0
 	.uleb128 0x1c
-	.4byte	.LASF2214
+	.4byte	.LASF2216
 	.byte	0x2
 	.2byte	0x438
 	.4byte	0x392
 	.2byte	0x2b8
 	.uleb128 0x1c
-	.4byte	.LASF2215
+	.4byte	.LASF2217
 	.byte	0x2
 	.2byte	0x43a
-	.4byte	0xb79f
+	.4byte	0xb7b5
 	.2byte	0x2c8
 	.uleb128 0x1c
-	.4byte	.LASF2216
+	.4byte	.LASF2218
 	.byte	0x2
 	.2byte	0x43d
-	.4byte	0xb7aa
+	.4byte	0xb7c0
 	.2byte	0x2d0
 	.uleb128 0x1c
-	.4byte	.LASF2217
+	.4byte	.LASF2219
 	.byte	0x2
 	.2byte	0x440
-	.4byte	0xb7b5
+	.4byte	0xb7cb
 	.2byte	0x2d8
 	.uleb128 0x1c
-	.4byte	.LASF2218
+	.4byte	.LASF2220
 	.byte	0x2
 	.2byte	0x442
-	.4byte	0xad7f
+	.4byte	0xad95
 	.2byte	0x2e0
 	.uleb128 0x1c
-	.4byte	.LASF2219
+	.4byte	.LASF2221
 	.byte	0x2
 	.2byte	0x444
-	.4byte	0xb869
+	.4byte	0xb87f
 	.2byte	0x2f0
 	.uleb128 0x1c
-	.4byte	.LASF2220
+	.4byte	.LASF2222
 	.byte	0x2
 	.2byte	0x445
-	.4byte	0xb47e
+	.4byte	0xb494
 	.2byte	0x2f8
 	.uleb128 0x1c
-	.4byte	.LASF2221
+	.4byte	.LASF2223
 	.byte	0x2
 	.2byte	0x447
 	.4byte	0x26f
@@ -29565,55 +29914,55 @@ __exitcall_ebc_exit:
 	.4byte	0x13a
 	.2byte	0x304
 	.uleb128 0x1c
-	.4byte	.LASF2222
+	.4byte	.LASF2224
 	.byte	0x2
 	.2byte	0x44a
 	.4byte	0xe50
 	.2byte	0x308
 	.uleb128 0x1c
-	.4byte	.LASF2223
+	.4byte	.LASF2225
 	.byte	0x2
 	.2byte	0x44b
 	.4byte	0x392
 	.2byte	0x310
 	.uleb128 0x1c
-	.4byte	.LASF2224
+	.4byte	.LASF2226
 	.byte	0x2
 	.2byte	0x44d
-	.4byte	0xa382
+	.4byte	0xa398
 	.2byte	0x320
 	.uleb128 0x1c
-	.4byte	.LASF2225
+	.4byte	.LASF2227
 	.byte	0x2
 	.2byte	0x44e
-	.4byte	0xb2fa
+	.4byte	0xb310
 	.2byte	0x340
 	.uleb128 0x1c
-	.4byte	.LASF2226
+	.4byte	.LASF2228
 	.byte	0x2
 	.2byte	0x44f
-	.4byte	0xaf00
+	.4byte	0xaf16
 	.2byte	0x348
 	.uleb128 0x1c
 	.4byte	.LASF112
 	.byte	0x2
 	.2byte	0x451
-	.4byte	0xa838
+	.4byte	0xa84e
 	.2byte	0x350
 	.uleb128 0x1c
-	.4byte	.LASF2227
+	.4byte	.LASF2229
 	.byte	0x2
 	.2byte	0x452
-	.4byte	0xb874
+	.4byte	0xb88a
 	.2byte	0x358
 	.uleb128 0x1c
-	.4byte	.LASF2228
+	.4byte	.LASF2230
 	.byte	0x2
 	.2byte	0x453
-	.4byte	0xb87f
+	.4byte	0xb895
 	.2byte	0x360
 	.uleb128 0x33
-	.4byte	.LASF2229
+	.4byte	.LASF2231
 	.byte	0x2
 	.2byte	0x455
 	.4byte	0x29b
@@ -29622,7 +29971,7 @@ __exitcall_ebc_exit:
 	.byte	0x7
 	.2byte	0x368
 	.uleb128 0x33
-	.4byte	.LASF2230
+	.4byte	.LASF2232
 	.byte	0x2
 	.2byte	0x456
 	.4byte	0x29b
@@ -29631,7 +29980,7 @@ __exitcall_ebc_exit:
 	.byte	0x6
 	.2byte	0x368
 	.uleb128 0x33
-	.4byte	.LASF2231
+	.4byte	.LASF2233
 	.byte	0x2
 	.2byte	0x457
 	.4byte	0x29b
@@ -29640,7 +29989,7 @@ __exitcall_ebc_exit:
 	.byte	0x5
 	.2byte	0x368
 	.uleb128 0x33
-	.4byte	.LASF2232
+	.4byte	.LASF2234
 	.byte	0x2
 	.2byte	0x458
 	.4byte	0x29b
@@ -29673,92 +30022,92 @@ __exitcall_ebc_exit:
 	.4byte	0x155
 	.2byte	0x388
 	.uleb128 0x1c
-	.4byte	.LASF2233
+	.4byte	.LASF2235
 	.byte	0x2
 	.2byte	0x45e
 	.4byte	0x155
 	.2byte	0x390
 	.uleb128 0x1c
-	.4byte	.LASF2234
+	.4byte	.LASF2236
 	.byte	0x2
 	.2byte	0x45f
 	.4byte	0x155
 	.2byte	0x398
 	.uleb128 0x1c
-	.4byte	.LASF746
+	.4byte	.LASF748
 	.byte	0x2
 	.2byte	0x460
 	.4byte	0x155
 	.2byte	0x3a0
 	.uleb128 0x1c
-	.4byte	.LASF747
+	.4byte	.LASF749
 	.byte	0x2
 	.2byte	0x461
 	.4byte	0x155
 	.2byte	0x3a8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xa54b
+	.4byte	0xa561
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa536
+	.4byte	0xa54c
 	.uleb128 0x10
-	.4byte	0xa838
+	.4byte	0xa84e
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa82d
+	.4byte	0xa843
 	.uleb128 0x1e
-	.4byte	.LASF2235
+	.4byte	.LASF2237
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x9b
 	.2byte	0x1fc
-	.4byte	0xa868
+	.4byte	0xa87e
 	.uleb128 0xc
-	.4byte	.LASF2236
+	.4byte	.LASF2238
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2237
+	.4byte	.LASF2239
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2238
+	.4byte	.LASF2240
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2239
+	.4byte	.LASF2241
 	.byte	0x3
 	.byte	0
 	.uleb128 0x1e
-	.4byte	.LASF2240
+	.4byte	.LASF2242
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x9b
 	.2byte	0x212
-	.4byte	0xa898
+	.4byte	0xa8ae
 	.uleb128 0xc
-	.4byte	.LASF2241
+	.4byte	.LASF2243
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2242
+	.4byte	.LASF2244
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2243
+	.4byte	.LASF2245
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2244
+	.4byte	.LASF2246
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2245
+	.4byte	.LASF2247
 	.byte	0x4
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF2246
+	.4byte	.LASF2248
 	.byte	0x20
 	.byte	0x9b
 	.2byte	0x21e
-	.4byte	0xa8da
+	.4byte	0xa8f0
 	.uleb128 0x1b
 	.4byte	.LASF115
 	.byte	0x9b
@@ -29766,43 +30115,43 @@ __exitcall_ebc_exit:
 	.4byte	0xe50
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1124
+	.4byte	.LASF1126
 	.byte	0x9b
 	.2byte	0x220
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF2247
+	.4byte	.LASF2249
 	.byte	0x9b
 	.2byte	0x222
 	.4byte	0x392
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2248
+	.4byte	.LASF2250
 	.byte	0x9b
 	.2byte	0x225
-	.4byte	0xa8df
+	.4byte	0xa8f5
 	.byte	0x18
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF2249
+	.4byte	.LASF2251
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa8da
+	.4byte	0xa8f0
 	.uleb128 0x1a
-	.4byte	.LASF2250
+	.4byte	.LASF2252
 	.2byte	0x138
 	.byte	0x9b
 	.2byte	0x249
-	.4byte	0xabe0
+	.4byte	0xabf6
 	.uleb128 0x1b
-	.4byte	.LASF2251
+	.4byte	.LASF2253
 	.byte	0x9b
 	.2byte	0x24a
-	.4byte	0xa3ed
+	.4byte	0xa403
 	.byte	0
 	.uleb128 0x3b
-	.4byte	.LASF2252
+	.4byte	.LASF2254
 	.byte	0x9b
 	.2byte	0x24b
 	.4byte	0x6d
@@ -29811,7 +30160,7 @@ __exitcall_ebc_exit:
 	.byte	0x1f
 	.byte	0x4
 	.uleb128 0x3b
-	.4byte	.LASF2253
+	.4byte	.LASF2255
 	.byte	0x9b
 	.2byte	0x24c
 	.4byte	0x6d
@@ -29820,7 +30169,7 @@ __exitcall_ebc_exit:
 	.byte	0x1e
 	.byte	0x4
 	.uleb128 0x3b
-	.4byte	.LASF2254
+	.4byte	.LASF2256
 	.byte	0x9b
 	.2byte	0x24d
 	.4byte	0x29b
@@ -29829,7 +30178,7 @@ __exitcall_ebc_exit:
 	.byte	0x5
 	.byte	0x4
 	.uleb128 0x3b
-	.4byte	.LASF2255
+	.4byte	.LASF2257
 	.byte	0x9b
 	.2byte	0x24e
 	.4byte	0x29b
@@ -29838,7 +30187,7 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x4
 	.uleb128 0x3b
-	.4byte	.LASF2256
+	.4byte	.LASF2258
 	.byte	0x9b
 	.2byte	0x24f
 	.4byte	0x29b
@@ -29847,7 +30196,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x4
 	.uleb128 0x3b
-	.4byte	.LASF2257
+	.4byte	.LASF2259
 	.byte	0x9b
 	.2byte	0x250
 	.4byte	0x29b
@@ -29856,7 +30205,7 @@ __exitcall_ebc_exit:
 	.byte	0x2
 	.byte	0x4
 	.uleb128 0x3b
-	.4byte	.LASF2258
+	.4byte	.LASF2260
 	.byte	0x9b
 	.2byte	0x251
 	.4byte	0x29b
@@ -29865,7 +30214,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x4
 	.uleb128 0x3b
-	.4byte	.LASF2259
+	.4byte	.LASF2261
 	.byte	0x9b
 	.2byte	0x252
 	.4byte	0x29b
@@ -29874,7 +30223,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0x4
 	.uleb128 0x3b
-	.4byte	.LASF2260
+	.4byte	.LASF2262
 	.byte	0x9b
 	.2byte	0x253
 	.4byte	0x29b
@@ -29883,7 +30232,7 @@ __exitcall_ebc_exit:
 	.byte	0x7
 	.byte	0x5
 	.uleb128 0x3b
-	.4byte	.LASF2261
+	.4byte	.LASF2263
 	.byte	0x9b
 	.2byte	0x254
 	.4byte	0x29b
@@ -29892,7 +30241,7 @@ __exitcall_ebc_exit:
 	.byte	0x6
 	.byte	0x5
 	.uleb128 0x1b
-	.4byte	.LASF2262
+	.4byte	.LASF2264
 	.byte	0x9b
 	.2byte	0x255
 	.4byte	0x13a
@@ -29904,25 +30253,25 @@ __exitcall_ebc_exit:
 	.4byte	0xe50
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF358
+	.4byte	.LASF360
 	.byte	0x9b
 	.2byte	0x258
 	.4byte	0x392
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF1096
+	.4byte	.LASF1098
 	.byte	0x9b
 	.2byte	0x259
-	.4byte	0x4628
+	.4byte	0x463e
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2263
+	.4byte	.LASF2265
 	.byte	0x9b
 	.2byte	0x25a
-	.4byte	0xace2
+	.4byte	0xacf8
 	.byte	0x40
 	.uleb128 0x3b
-	.4byte	.LASF2264
+	.4byte	.LASF2266
 	.byte	0x9b
 	.2byte	0x25b
 	.4byte	0x29b
@@ -29931,7 +30280,7 @@ __exitcall_ebc_exit:
 	.byte	0x7
 	.byte	0x48
 	.uleb128 0x3b
-	.4byte	.LASF2265
+	.4byte	.LASF2267
 	.byte	0x9b
 	.2byte	0x25c
 	.4byte	0x29b
@@ -29940,7 +30289,7 @@ __exitcall_ebc_exit:
 	.byte	0x6
 	.byte	0x48
 	.uleb128 0x3b
-	.4byte	.LASF2266
+	.4byte	.LASF2268
 	.byte	0x9b
 	.2byte	0x25d
 	.4byte	0x29b
@@ -29949,7 +30298,7 @@ __exitcall_ebc_exit:
 	.byte	0x5
 	.byte	0x48
 	.uleb128 0x3b
-	.4byte	.LASF2267
+	.4byte	.LASF2269
 	.byte	0x9b
 	.2byte	0x25e
 	.4byte	0x6d
@@ -29958,7 +30307,7 @@ __exitcall_ebc_exit:
 	.byte	0x1c
 	.byte	0x48
 	.uleb128 0x3b
-	.4byte	.LASF2268
+	.4byte	.LASF2270
 	.byte	0x9b
 	.2byte	0x25f
 	.4byte	0x6d
@@ -29967,49 +30316,49 @@ __exitcall_ebc_exit:
 	.byte	0x1b
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF2269
+	.4byte	.LASF2271
 	.byte	0x9b
 	.2byte	0x264
-	.4byte	0x3147
+	.4byte	0x315d
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF2270
+	.4byte	.LASF2272
 	.byte	0x9b
 	.2byte	0x265
 	.4byte	0x29
 	.byte	0x88
 	.uleb128 0x1b
-	.4byte	.LASF2271
+	.4byte	.LASF2273
 	.byte	0x9b
 	.2byte	0x266
-	.4byte	0x31e0
+	.4byte	0x31f6
 	.byte	0x90
 	.uleb128 0x1b
-	.4byte	.LASF2272
+	.4byte	.LASF2274
 	.byte	0x9b
 	.2byte	0x267
-	.4byte	0x1594
+	.4byte	0x15aa
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF2273
+	.4byte	.LASF2275
 	.byte	0x9b
 	.2byte	0x268
-	.4byte	0xaced
+	.4byte	0xad03
 	.byte	0xd8
 	.uleb128 0x1b
-	.4byte	.LASF2274
+	.4byte	.LASF2276
 	.byte	0x9b
 	.2byte	0x269
 	.4byte	0x367
 	.byte	0xe0
 	.uleb128 0x1b
-	.4byte	.LASF2275
+	.4byte	.LASF2277
 	.byte	0x9b
 	.2byte	0x26a
 	.4byte	0x367
 	.byte	0xe4
 	.uleb128 0x3b
-	.4byte	.LASF2276
+	.4byte	.LASF2278
 	.byte	0x9b
 	.2byte	0x26b
 	.4byte	0x6d
@@ -30018,7 +30367,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.byte	0xe8
 	.uleb128 0x3b
-	.4byte	.LASF2277
+	.4byte	.LASF2279
 	.byte	0x9b
 	.2byte	0x26c
 	.4byte	0x6d
@@ -30027,7 +30376,7 @@ __exitcall_ebc_exit:
 	.byte	0x1c
 	.byte	0xe8
 	.uleb128 0x3b
-	.4byte	.LASF2278
+	.4byte	.LASF2280
 	.byte	0x9b
 	.2byte	0x26d
 	.4byte	0x6d
@@ -30036,7 +30385,7 @@ __exitcall_ebc_exit:
 	.byte	0x1b
 	.byte	0xe8
 	.uleb128 0x3b
-	.4byte	.LASF2279
+	.4byte	.LASF2281
 	.byte	0x9b
 	.2byte	0x26e
 	.4byte	0x6d
@@ -30045,7 +30394,7 @@ __exitcall_ebc_exit:
 	.byte	0x1a
 	.byte	0xe8
 	.uleb128 0x3b
-	.4byte	.LASF2280
+	.4byte	.LASF2282
 	.byte	0x9b
 	.2byte	0x26f
 	.4byte	0x6d
@@ -30054,7 +30403,7 @@ __exitcall_ebc_exit:
 	.byte	0x19
 	.byte	0xe8
 	.uleb128 0x3b
-	.4byte	.LASF2281
+	.4byte	.LASF2283
 	.byte	0x9b
 	.2byte	0x270
 	.4byte	0x29b
@@ -30063,7 +30412,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0xe8
 	.uleb128 0x3b
-	.4byte	.LASF2282
+	.4byte	.LASF2284
 	.byte	0x9b
 	.2byte	0x271
 	.4byte	0x6d
@@ -30072,7 +30421,7 @@ __exitcall_ebc_exit:
 	.byte	0x17
 	.byte	0xe8
 	.uleb128 0x3b
-	.4byte	.LASF2283
+	.4byte	.LASF2285
 	.byte	0x9b
 	.2byte	0x272
 	.4byte	0x6d
@@ -30081,7 +30430,7 @@ __exitcall_ebc_exit:
 	.byte	0x16
 	.byte	0xe8
 	.uleb128 0x3b
-	.4byte	.LASF2284
+	.4byte	.LASF2286
 	.byte	0x9b
 	.2byte	0x273
 	.4byte	0x6d
@@ -30090,7 +30439,7 @@ __exitcall_ebc_exit:
 	.byte	0x15
 	.byte	0xe8
 	.uleb128 0x3b
-	.4byte	.LASF2285
+	.4byte	.LASF2287
 	.byte	0x9b
 	.2byte	0x274
 	.4byte	0x6d
@@ -30099,7 +30448,7 @@ __exitcall_ebc_exit:
 	.byte	0x14
 	.byte	0xe8
 	.uleb128 0x3b
-	.4byte	.LASF2286
+	.4byte	.LASF2288
 	.byte	0x9b
 	.2byte	0x275
 	.4byte	0x6d
@@ -30108,84 +30457,84 @@ __exitcall_ebc_exit:
 	.byte	0x13
 	.byte	0xe8
 	.uleb128 0x1b
-	.4byte	.LASF2287
+	.4byte	.LASF2289
 	.byte	0x9b
 	.2byte	0x276
 	.4byte	0x6d
 	.byte	0xec
 	.uleb128 0x1b
-	.4byte	.LASF2288
+	.4byte	.LASF2290
 	.byte	0x9b
 	.2byte	0x277
-	.4byte	0xa868
+	.4byte	0xa87e
 	.byte	0xf0
 	.uleb128 0x1b
-	.4byte	.LASF2289
+	.4byte	.LASF2291
 	.byte	0x9b
 	.2byte	0x278
-	.4byte	0xa83e
+	.4byte	0xa854
 	.byte	0xf4
 	.uleb128 0x1b
-	.4byte	.LASF2290
+	.4byte	.LASF2292
 	.byte	0x9b
 	.2byte	0x279
 	.4byte	0xc6
 	.byte	0xf8
 	.uleb128 0x1b
-	.4byte	.LASF2291
+	.4byte	.LASF2293
 	.byte	0x9b
 	.2byte	0x27a
 	.4byte	0xc6
 	.byte	0xfc
 	.uleb128 0x1c
-	.4byte	.LASF2292
+	.4byte	.LASF2294
 	.byte	0x9b
 	.2byte	0x27b
 	.4byte	0x29
 	.2byte	0x100
 	.uleb128 0x1c
-	.4byte	.LASF2293
+	.4byte	.LASF2295
 	.byte	0x9b
 	.2byte	0x27c
 	.4byte	0x29
 	.2byte	0x108
 	.uleb128 0x1c
-	.4byte	.LASF2294
+	.4byte	.LASF2296
 	.byte	0x9b
 	.2byte	0x27d
 	.4byte	0x29
 	.2byte	0x110
 	.uleb128 0x1c
-	.4byte	.LASF2295
+	.4byte	.LASF2297
 	.byte	0x9b
 	.2byte	0x27e
 	.4byte	0x29
 	.2byte	0x118
 	.uleb128 0x1c
-	.4byte	.LASF2296
+	.4byte	.LASF2298
 	.byte	0x9b
 	.2byte	0x280
-	.4byte	0xacf3
+	.4byte	0xad09
 	.2byte	0x120
 	.uleb128 0x1c
-	.4byte	.LASF2297
+	.4byte	.LASF2299
 	.byte	0x9b
 	.2byte	0x281
-	.4byte	0xad09
+	.4byte	0xad1f
 	.2byte	0x128
 	.uleb128 0x30
 	.string	"qos"
 	.byte	0x9b
 	.2byte	0x282
-	.4byte	0xad14
+	.4byte	0xad2a
 	.2byte	0x130
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2298
+	.4byte	.LASF2300
 	.byte	0xd0
 	.byte	0x9c
 	.byte	0x38
-	.4byte	0xace2
+	.4byte	0xacf8
 	.uleb128 0xe
 	.4byte	.LASF264
 	.byte	0x9c
@@ -30199,7 +30548,7 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF358
+	.4byte	.LASF360
 	.byte	0x9c
 	.byte	0x3b
 	.4byte	0x392
@@ -30211,79 +30560,79 @@ __exitcall_ebc_exit:
 	.4byte	0xe50
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2273
+	.4byte	.LASF2275
 	.byte	0x9c
 	.byte	0x3d
-	.4byte	0xaced
+	.4byte	0xad03
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2299
+	.4byte	.LASF2301
 	.byte	0x9c
 	.byte	0x3e
-	.4byte	0x3147
+	.4byte	0x315d
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2270
+	.4byte	.LASF2272
 	.byte	0x9c
 	.byte	0x3f
 	.4byte	0x29
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2300
+	.4byte	.LASF2302
 	.byte	0x9c
 	.byte	0x40
-	.4byte	0x3110
+	.4byte	0x3126
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF2301
+	.4byte	.LASF2303
 	.byte	0x9c
 	.byte	0x41
-	.4byte	0x3110
+	.4byte	0x3126
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2302
+	.4byte	.LASF2304
 	.byte	0x9c
 	.byte	0x42
-	.4byte	0x3110
+	.4byte	0x3126
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF2303
+	.4byte	.LASF2305
 	.byte	0x9c
 	.byte	0x43
-	.4byte	0x3110
+	.4byte	0x3126
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF2304
+	.4byte	.LASF2306
 	.byte	0x9c
 	.byte	0x44
-	.4byte	0x3110
+	.4byte	0x3126
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2305
+	.4byte	.LASF2307
 	.byte	0x9c
 	.byte	0x45
 	.4byte	0x29
 	.byte	0x98
 	.uleb128 0xe
-	.4byte	.LASF2306
+	.4byte	.LASF2308
 	.byte	0x9c
 	.byte	0x46
 	.4byte	0x29
 	.byte	0xa0
 	.uleb128 0xe
-	.4byte	.LASF2307
+	.4byte	.LASF2309
 	.byte	0x9c
 	.byte	0x47
 	.4byte	0x29
 	.byte	0xa8
 	.uleb128 0xe
-	.4byte	.LASF2308
+	.4byte	.LASF2310
 	.byte	0x9c
 	.byte	0x48
 	.4byte	0x29
 	.byte	0xb0
 	.uleb128 0xe
-	.4byte	.LASF2309
+	.4byte	.LASF2311
 	.byte	0x9c
 	.byte	0x49
 	.4byte	0x29
@@ -30292,10 +30641,10 @@ __exitcall_ebc_exit:
 	.string	"dev"
 	.byte	0x9c
 	.byte	0x4a
-	.4byte	0xa545
+	.4byte	0xa55b
 	.byte	0xc0
 	.uleb128 0x38
-	.4byte	.LASF879
+	.4byte	.LASF881
 	.byte	0x9c
 	.byte	0x4b
 	.4byte	0x29b
@@ -30304,7 +30653,7 @@ __exitcall_ebc_exit:
 	.byte	0x7
 	.byte	0xc8
 	.uleb128 0x38
-	.4byte	.LASF2310
+	.4byte	.LASF2312
 	.byte	0x9c
 	.byte	0x4c
 	.4byte	0x29b
@@ -30315,110 +30664,110 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xabe0
+	.4byte	0xabf6
 	.uleb128 0x24
-	.4byte	.LASF2311
+	.4byte	.LASF2313
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xace8
+	.4byte	0xacfe
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa898
+	.4byte	0xa8ae
 	.uleb128 0x10
-	.4byte	0xad09
+	.4byte	0xad1f
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
 	.4byte	0x12a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xacf9
+	.4byte	0xad0f
 	.uleb128 0x24
-	.4byte	.LASF2312
+	.4byte	.LASF2314
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xad0f
+	.4byte	0xad25
 	.uleb128 0x1d
-	.4byte	.LASF2313
+	.4byte	.LASF2315
 	.byte	0xd8
 	.byte	0x9b
 	.2byte	0x296
-	.4byte	0xad69
+	.4byte	0xad7f
 	.uleb128 0x2b
 	.string	"ops"
 	.byte	0x9b
 	.2byte	0x297
-	.4byte	0xa3f8
+	.4byte	0xa40e
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2314
+	.4byte	.LASF2316
 	.byte	0x9b
 	.2byte	0x298
-	.4byte	0xad79
+	.4byte	0xad8f
 	.byte	0xb8
 	.uleb128 0x1b
-	.4byte	.LASF2315
+	.4byte	.LASF2317
 	.byte	0x9b
 	.2byte	0x299
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0xc0
 	.uleb128 0x1b
-	.4byte	.LASF2316
+	.4byte	.LASF2318
 	.byte	0x9b
 	.2byte	0x29a
-	.4byte	0xa838
+	.4byte	0xa84e
 	.byte	0xc8
 	.uleb128 0x1b
-	.4byte	.LASF2317
+	.4byte	.LASF2319
 	.byte	0x9b
 	.2byte	0x29b
-	.4byte	0xa838
+	.4byte	0xa84e
 	.byte	0xd0
 	.byte	0
 	.uleb128 0x10
-	.4byte	0xad79
+	.4byte	0xad8f
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
 	.4byte	0x29b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xad69
+	.4byte	0xad7f
 	.uleb128 0xd
-	.4byte	.LASF2318
+	.4byte	.LASF2320
 	.byte	0x10
 	.byte	0x9d
 	.byte	0x13
-	.4byte	0xada4
+	.4byte	0xadba
 	.uleb128 0xe
-	.4byte	.LASF2319
+	.4byte	.LASF2321
 	.byte	0x9d
 	.byte	0x15
 	.4byte	0x443
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2320
+	.4byte	.LASF2322
 	.byte	0x9d
 	.byte	0x1a
 	.4byte	0x29b
 	.byte	0x8
 	.byte	0
 	.uleb128 0x3a
-	.4byte	.LASF2321
+	.4byte	.LASF2323
 	.byte	0
 	.byte	0x9d
 	.byte	0x20
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xadb2
+	.4byte	0xadc8
 	.uleb128 0xd
-	.4byte	.LASF2322
+	.4byte	.LASF2324
 	.byte	0xd0
 	.byte	0x2
 	.byte	0x7a
-	.4byte	0xaf00
+	.4byte	0xaf16
 	.uleb128 0xe
 	.4byte	.LASF264
 	.byte	0x2
@@ -30426,133 +30775,133 @@ __exitcall_ebc_exit:
 	.4byte	0x56
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2323
+	.4byte	.LASF2325
 	.byte	0x2
 	.byte	0x7c
 	.4byte	0x56
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2324
+	.4byte	.LASF2326
 	.byte	0x2
 	.byte	0x7d
-	.4byte	0xa545
+	.4byte	0xa55b
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2325
+	.4byte	.LASF2327
 	.byte	0x2
 	.byte	0x7e
-	.4byte	0xaf00
+	.4byte	0xaf16
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2326
+	.4byte	.LASF2328
 	.byte	0x2
 	.byte	0x7f
-	.4byte	0xaf00
+	.4byte	0xaf16
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2327
+	.4byte	.LASF2329
 	.byte	0x2
 	.byte	0x80
-	.4byte	0xaf00
+	.4byte	0xaf16
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2328
+	.4byte	.LASF2330
 	.byte	0x2
 	.byte	0x82
-	.4byte	0xb04f
+	.4byte	0xb065
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2156
+	.4byte	.LASF2158
 	.byte	0x2
 	.byte	0x83
-	.4byte	0xb069
+	.4byte	0xb07f
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2329
+	.4byte	.LASF2331
 	.byte	0x2
 	.byte	0x84
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2330
+	.4byte	.LASF2332
 	.byte	0x2
 	.byte	0x85
-	.4byte	0xa838
+	.4byte	0xa84e
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2331
+	.4byte	.LASF2333
 	.byte	0x2
 	.byte	0x86
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2332
+	.4byte	.LASF2334
 	.byte	0x2
 	.byte	0x87
-	.4byte	0xa838
+	.4byte	0xa84e
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2333
+	.4byte	.LASF2335
 	.byte	0x2
 	.byte	0x89
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2230
+	.4byte	.LASF2232
 	.byte	0x2
 	.byte	0x8a
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2176
+	.4byte	.LASF2178
 	.byte	0x2
 	.byte	0x8c
-	.4byte	0xb083
+	.4byte	0xb099
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF2177
+	.4byte	.LASF2179
 	.byte	0x2
 	.byte	0x8d
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2334
+	.4byte	.LASF2336
 	.byte	0x2
 	.byte	0x8f
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF2335
+	.4byte	.LASF2337
 	.byte	0x2
 	.byte	0x91
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x88
 	.uleb128 0x20
 	.string	"pm"
 	.byte	0x2
 	.byte	0x93
-	.4byte	0xb089
+	.4byte	0xb09f
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2336
+	.4byte	.LASF2338
 	.byte	0x2
 	.byte	0x95
-	.4byte	0xb099
+	.4byte	0xb0af
 	.byte	0x98
 	.uleb128 0x20
 	.string	"p"
 	.byte	0x2
 	.byte	0x97
-	.4byte	0xb0a4
+	.4byte	0xb0ba
 	.byte	0xa0
 	.uleb128 0xe
-	.4byte	.LASF2337
+	.4byte	.LASF2339
 	.byte	0x2
 	.byte	0x98
 	.4byte	0xdfc
 	.byte	0xa8
 	.uleb128 0xe
-	.4byte	.LASF2338
+	.4byte	.LASF2340
 	.byte	0x2
 	.byte	0x9a
 	.4byte	0x29b
@@ -30584,27 +30933,27 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xaf06
+	.4byte	0xaf1c
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x9ea6
+	.4byte	0x9ebc
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xaf20
+	.4byte	0xaf36
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
-	.4byte	0xaf20
+	.4byte	0xaf36
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xaf26
+	.4byte	0xaf3c
 	.uleb128 0x1d
-	.4byte	.LASF2339
+	.4byte	.LASF2341
 	.byte	0xa8
 	.byte	0x2
 	.2byte	0x12a
-	.4byte	0xb04f
+	.4byte	0xb065
 	.uleb128 0x1b
 	.4byte	.LASF264
 	.byte	0x2
@@ -30615,103 +30964,103 @@ __exitcall_ebc_exit:
 	.string	"bus"
 	.byte	0x2
 	.2byte	0x12c
-	.4byte	0xadac
+	.4byte	0xadc2
 	.byte	0x8
 	.uleb128 0x1b
 	.4byte	.LASF97
 	.byte	0x2
 	.2byte	0x12e
-	.4byte	0x7550
+	.4byte	0x7566
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2340
+	.4byte	.LASF2342
 	.byte	0x2
 	.2byte	0x12f
 	.4byte	0x56
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF2341
+	.4byte	.LASF2343
 	.byte	0x2
 	.2byte	0x131
 	.4byte	0x29b
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2342
+	.4byte	.LASF2344
 	.byte	0x2
 	.2byte	0x132
-	.4byte	0xb110
+	.4byte	0xb126
 	.byte	0x24
 	.uleb128 0x1b
-	.4byte	.LASF2343
+	.4byte	.LASF2345
 	.byte	0x2
 	.2byte	0x134
-	.4byte	0xb175
+	.4byte	0xb18b
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF2344
+	.4byte	.LASF2346
 	.byte	0x2
 	.2byte	0x135
-	.4byte	0xb1bc
+	.4byte	0xb1d2
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF2329
+	.4byte	.LASF2331
 	.byte	0x2
 	.2byte	0x137
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF2330
+	.4byte	.LASF2332
 	.byte	0x2
 	.2byte	0x138
-	.4byte	0xa838
+	.4byte	0xa84e
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF2331
+	.4byte	.LASF2333
 	.byte	0x2
 	.2byte	0x139
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF2332
+	.4byte	.LASF2334
 	.byte	0x2
 	.2byte	0x13a
-	.4byte	0xa838
+	.4byte	0xa84e
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF2176
+	.4byte	.LASF2178
 	.byte	0x2
 	.2byte	0x13b
-	.4byte	0xb083
+	.4byte	0xb099
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF2177
+	.4byte	.LASF2179
 	.byte	0x2
 	.2byte	0x13c
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x60
 	.uleb128 0x1b
-	.4byte	.LASF2226
+	.4byte	.LASF2228
 	.byte	0x2
 	.2byte	0x13d
-	.4byte	0xaf00
+	.4byte	0xaf16
 	.byte	0x68
 	.uleb128 0x2b
 	.string	"pm"
 	.byte	0x2
 	.2byte	0x13f
-	.4byte	0xb089
+	.4byte	0xb09f
 	.byte	0x70
 	.uleb128 0x1b
-	.4byte	.LASF2345
+	.4byte	.LASF2347
 	.byte	0x2
 	.2byte	0x140
-	.4byte	0xa838
+	.4byte	0xa84e
 	.byte	0x78
 	.uleb128 0x2b
 	.string	"p"
 	.byte	0x2
 	.2byte	0x142
-	.4byte	0xb1c7
+	.4byte	0xb1dd
 	.byte	0x80
 	.uleb128 0x1b
 	.4byte	.LASF129
@@ -30740,50 +31089,50 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xaf0c
+	.4byte	0xaf22
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xb069
+	.4byte	0xb07f
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
-	.4byte	0xa2af
+	.4byte	0xa2c5
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb055
+	.4byte	0xb06b
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xb083
+	.4byte	0xb099
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
-	.4byte	0xa3ed
+	.4byte	0xa403
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb06f
+	.4byte	0xb085
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa531
+	.4byte	0xa547
 	.uleb128 0x24
-	.4byte	.LASF2336
+	.4byte	.LASF2338
 	.uleb128 0x3
-	.4byte	0xb08f
+	.4byte	0xb0a5
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb094
+	.4byte	0xb0aa
 	.uleb128 0x24
-	.4byte	.LASF2346
+	.4byte	.LASF2348
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb09f
+	.4byte	0xb0b5
 	.uleb128 0x1d
-	.4byte	.LASF2347
+	.4byte	.LASF2349
 	.byte	0x30
 	.byte	0x2
 	.2byte	0x249
-	.4byte	0xb105
+	.4byte	0xb11b
 	.uleb128 0x1b
 	.4byte	.LASF264
 	.byte	0x2
@@ -30791,111 +31140,111 @@ __exitcall_ebc_exit:
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2226
+	.4byte	.LASF2228
 	.byte	0x2
 	.2byte	0x24b
-	.4byte	0xaf00
+	.4byte	0xaf16
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2156
+	.4byte	.LASF2158
 	.byte	0x2
 	.2byte	0x24c
-	.4byte	0xb069
+	.4byte	0xb07f
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2348
+	.4byte	.LASF2350
 	.byte	0x2
 	.2byte	0x24d
-	.4byte	0xb36c
+	.4byte	0xb382
 	.byte	0x18
 	.uleb128 0x1b
 	.4byte	.LASF112
 	.byte	0x2
 	.2byte	0x24f
-	.4byte	0xa838
+	.4byte	0xa84e
 	.byte	0x20
 	.uleb128 0x2b
 	.string	"pm"
 	.byte	0x2
 	.2byte	0x251
-	.4byte	0xb089
+	.4byte	0xb09f
 	.byte	0x28
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb0aa
+	.4byte	0xb0c0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb105
+	.4byte	0xb11b
 	.uleb128 0x1f
-	.4byte	.LASF2342
+	.4byte	.LASF2344
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x2
 	.byte	0xf9
-	.4byte	0xb133
+	.4byte	0xb149
 	.uleb128 0xc
-	.4byte	.LASF2349
+	.4byte	.LASF2351
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2350
+	.4byte	.LASF2352
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2351
+	.4byte	.LASF2353
 	.byte	0x2
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2352
+	.4byte	.LASF2354
 	.byte	0xc8
 	.byte	0x9e
 	.byte	0xf1
-	.4byte	0xb170
+	.4byte	0xb186
 	.uleb128 0xe
 	.4byte	.LASF264
 	.byte	0x9e
 	.byte	0xf2
-	.4byte	0x877a
+	.4byte	0x8790
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF192
 	.byte	0x9e
 	.byte	0xf3
-	.4byte	0x877a
+	.4byte	0x8790
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2353
+	.4byte	.LASF2355
 	.byte	0x9e
 	.byte	0xf4
-	.4byte	0xb8b8
+	.4byte	0xb8ce
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF791
+	.4byte	.LASF793
 	.byte	0x9e
 	.byte	0xf5
-	.4byte	0x3091
+	.4byte	0x30a7
 	.byte	0xc0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb133
+	.4byte	0xb149
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb170
+	.4byte	0xb186
 	.uleb128 0xd
-	.4byte	.LASF2354
+	.4byte	.LASF2356
 	.byte	0x20
 	.byte	0x9e
 	.byte	0xbf
-	.4byte	0xb1b7
+	.4byte	0xb1cd
 	.uleb128 0x20
 	.string	"id"
 	.byte	0x9e
 	.byte	0xc0
-	.4byte	0xb8a8
+	.4byte	0xb8be
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2201
+	.4byte	.LASF2203
 	.byte	0x9e
 	.byte	0xc1
-	.4byte	0xb89d
+	.4byte	0xb8b3
 	.byte	0x10
 	.uleb128 0x20
 	.string	"cls"
@@ -30904,28 +31253,28 @@ __exitcall_ebc_exit:
 	.4byte	0xd2
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2355
+	.4byte	.LASF2357
 	.byte	0x9e
 	.byte	0xc3
 	.4byte	0xd2
 	.byte	0x1c
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb17b
+	.4byte	0xb191
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb1b7
+	.4byte	0xb1cd
 	.uleb128 0x24
-	.4byte	.LASF2356
+	.4byte	.LASF2358
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb1c2
+	.4byte	0xb1d8
 	.uleb128 0x1d
-	.4byte	.LASF2225
+	.4byte	.LASF2227
 	.byte	0x98
 	.byte	0x2
 	.2byte	0x1ae
-	.4byte	0xb2cf
+	.4byte	0xb2e5
 	.uleb128 0x1b
 	.4byte	.LASF264
 	.byte	0x2
@@ -30936,85 +31285,85 @@ __exitcall_ebc_exit:
 	.4byte	.LASF97
 	.byte	0x2
 	.2byte	0x1b0
-	.4byte	0x7550
+	.4byte	0x7566
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2357
+	.4byte	.LASF2359
 	.byte	0x2
 	.2byte	0x1b2
-	.4byte	0xaf00
+	.4byte	0xaf16
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2326
+	.4byte	.LASF2328
 	.byte	0x2
 	.2byte	0x1b3
-	.4byte	0xaf00
+	.4byte	0xaf16
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF2358
+	.4byte	.LASF2360
 	.byte	0x2
 	.2byte	0x1b4
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2359
+	.4byte	.LASF2361
 	.byte	0x2
 	.2byte	0x1b6
-	.4byte	0xb069
+	.4byte	0xb07f
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF2348
+	.4byte	.LASF2350
 	.byte	0x2
 	.2byte	0x1b7
-	.4byte	0xb2e9
+	.4byte	0xb2ff
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF2360
+	.4byte	.LASF2362
 	.byte	0x2
 	.2byte	0x1b9
-	.4byte	0xb300
+	.4byte	0xb316
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF2361
+	.4byte	.LASF2363
 	.byte	0x2
 	.2byte	0x1ba
-	.4byte	0xa838
+	.4byte	0xa84e
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF2362
+	.4byte	.LASF2364
 	.byte	0x2
 	.2byte	0x1bc
-	.4byte	0xa827
+	.4byte	0xa83d
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF2363
+	.4byte	.LASF2365
 	.byte	0x2
 	.2byte	0x1be
-	.4byte	0xa168
+	.4byte	0xa17e
 	.byte	0x50
 	.uleb128 0x1b
-	.4byte	.LASF2148
+	.4byte	.LASF2150
 	.byte	0x2
 	.2byte	0x1bf
-	.4byte	0xb315
+	.4byte	0xb32b
 	.byte	0x58
 	.uleb128 0x1b
-	.4byte	.LASF2149
+	.4byte	.LASF2151
 	.byte	0x2
 	.2byte	0x1c1
-	.4byte	0xb330
+	.4byte	0xb346
 	.byte	0x60
 	.uleb128 0x2b
 	.string	"pm"
 	.byte	0x2
 	.2byte	0x1c3
-	.4byte	0xb089
+	.4byte	0xb09f
 	.byte	0x68
 	.uleb128 0x2b
 	.string	"p"
 	.byte	0x2
 	.2byte	0x1c5
-	.4byte	0xb0a4
+	.4byte	0xb0ba
 	.byte	0x70
 	.uleb128 0x1b
 	.4byte	.LASF129
@@ -31043,123 +31392,123 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x14
 	.4byte	0x219
-	.4byte	0xb2e3
+	.4byte	0xb2f9
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
-	.4byte	0xb2e3
+	.4byte	0xb2f9
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x27a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb2cf
+	.4byte	0xb2e5
 	.uleb128 0x10
-	.4byte	0xb2fa
+	.4byte	0xb310
 	.uleb128 0x11
-	.4byte	0xb2fa
+	.4byte	0xb310
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb1cd
+	.4byte	0xb1e3
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb2ef
+	.4byte	0xb305
 	.uleb128 0x14
-	.4byte	0x3091
-	.4byte	0xb315
+	.4byte	0x30a7
+	.4byte	0xb32b
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb306
+	.4byte	0xb31c
 	.uleb128 0x10
-	.4byte	0xb330
+	.4byte	0xb346
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
-	.4byte	0x9346
+	.4byte	0x935c
 	.uleb128 0x11
-	.4byte	0x934c
+	.4byte	0x9362
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb31b
+	.4byte	0xb331
 	.uleb128 0x15
-	.4byte	.LASF2364
+	.4byte	.LASF2366
 	.byte	0x2
 	.2byte	0x1d2
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.uleb128 0x15
-	.4byte	.LASF2365
+	.4byte	.LASF2367
 	.byte	0x2
 	.2byte	0x1d3
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.uleb128 0x14
 	.4byte	0x219
-	.4byte	0xb36c
+	.4byte	0xb382
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
-	.4byte	0xb2e3
+	.4byte	0xb2f9
 	.uleb128 0x11
-	.4byte	0x9346
+	.4byte	0x935c
 	.uleb128 0x11
-	.4byte	0x934c
+	.4byte	0x9362
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb34e
+	.4byte	0xb364
 	.uleb128 0x1d
-	.4byte	.LASF2366
+	.4byte	.LASF2368
 	.byte	0x20
 	.byte	0x2
 	.2byte	0x255
-	.4byte	0xb3a7
+	.4byte	0xb3bd
 	.uleb128 0x1b
-	.4byte	.LASF2112
+	.4byte	.LASF2114
 	.byte	0x2
 	.2byte	0x256
-	.4byte	0x9e38
+	.4byte	0x9e4e
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2075
+	.4byte	.LASF2077
 	.byte	0x2
 	.2byte	0x257
-	.4byte	0xb3c6
+	.4byte	0xb3dc
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2139
+	.4byte	.LASF2141
 	.byte	0x2
 	.2byte	0x259
-	.4byte	0xb3ea
+	.4byte	0xb400
 	.byte	0x18
 	.byte	0
 	.uleb128 0x14
 	.4byte	0x2d9
-	.4byte	0xb3c0
+	.4byte	0xb3d6
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
-	.4byte	0xb3c0
+	.4byte	0xb3d6
 	.uleb128 0x11
 	.4byte	0x219
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb372
+	.4byte	0xb388
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb3a7
+	.4byte	0xb3bd
 	.uleb128 0x14
 	.4byte	0x2d9
-	.4byte	0xb3ea
+	.4byte	0xb400
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
-	.4byte	0xb3c0
+	.4byte	0xb3d6
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
@@ -31167,49 +31516,49 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb3cc
+	.4byte	0xb3e2
 	.uleb128 0x1d
-	.4byte	.LASF2367
+	.4byte	.LASF2369
 	.byte	0x10
 	.byte	0x2
 	.2byte	0x30b
-	.4byte	0xb418
+	.4byte	0xb42e
 	.uleb128 0x1b
-	.4byte	.LASF2368
+	.4byte	.LASF2370
 	.byte	0x2
 	.2byte	0x310
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2369
+	.4byte	.LASF2371
 	.byte	0x2
 	.2byte	0x311
 	.4byte	0x29
 	.byte	0x8
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2370
+	.4byte	.LASF2372
 	.byte	0x38
 	.byte	0x9f
 	.byte	0x15
-	.4byte	0xb479
+	.4byte	0xb48f
 	.uleb128 0xe
-	.4byte	.LASF2371
+	.4byte	.LASF2373
 	.byte	0x9f
 	.byte	0x16
-	.4byte	0xb47e
+	.4byte	0xb494
 	.byte	0
 	.uleb128 0x20
 	.string	"ops"
 	.byte	0x9f
 	.byte	0x17
-	.4byte	0xba33
+	.4byte	0xba49
 	.byte	0x8
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x9f
 	.byte	0x18
-	.4byte	0xa545
+	.4byte	0xa55b
 	.byte	0x10
 	.uleb128 0xe
 	.4byte	.LASF129
@@ -31237,71 +31586,71 @@ __exitcall_ebc_exit:
 	.byte	0x30
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb418
+	.4byte	0xb42e
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb418
+	.4byte	0xb42e
 	.uleb128 0x1e
-	.4byte	.LASF2372
+	.4byte	.LASF2374
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x2
 	.2byte	0x396
-	.4byte	0xb4ae
+	.4byte	0xb4c4
 	.uleb128 0xc
-	.4byte	.LASF2373
+	.4byte	.LASF2375
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2374
+	.4byte	.LASF2376
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2375
+	.4byte	.LASF2377
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2376
+	.4byte	.LASF2378
 	.byte	0x3
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF2377
+	.4byte	.LASF2379
 	.byte	0x68
 	.byte	0x2
 	.2byte	0x3a8
-	.4byte	0xb53e
+	.4byte	0xb554
 	.uleb128 0x1b
-	.4byte	.LASF2378
+	.4byte	.LASF2380
 	.byte	0x2
 	.2byte	0x3a9
 	.4byte	0x392
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2379
+	.4byte	.LASF2381
 	.byte	0x2
 	.2byte	0x3aa
 	.4byte	0x392
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2380
+	.4byte	.LASF2382
 	.byte	0x2
 	.2byte	0x3ab
 	.4byte	0x392
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2381
+	.4byte	.LASF2383
 	.byte	0x2
 	.2byte	0x3ac
 	.4byte	0x392
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF2382
+	.4byte	.LASF2384
 	.byte	0x2
 	.2byte	0x3ad
 	.4byte	0x29b
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF757
+	.4byte	.LASF759
 	.byte	0x2
 	.2byte	0x3ae
-	.4byte	0xb484
+	.4byte	0xb49a
 	.byte	0x44
 	.uleb128 0x1b
 	.4byte	.LASF129
@@ -31329,21 +31678,21 @@ __exitcall_ebc_exit:
 	.byte	0x60
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF2383
+	.4byte	.LASF2385
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb53e
+	.4byte	0xb554
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xad1a
+	.4byte	0xad30
 	.uleb128 0xd
-	.4byte	.LASF2384
+	.4byte	.LASF2386
 	.byte	0xb0
 	.byte	0xa0
 	.byte	0x9f
-	.4byte	0xb64b
+	.4byte	0xb661
 	.uleb128 0xe
-	.4byte	.LASF1850
+	.4byte	.LASF1852
 	.byte	0xa0
 	.byte	0xa0
 	.4byte	0x392
@@ -31358,10 +31707,10 @@ __exitcall_ebc_exit:
 	.string	"ops"
 	.byte	0xa0
 	.byte	0xa2
-	.4byte	0xbf38
+	.4byte	0xbf4e
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2385
+	.4byte	.LASF2387
 	.byte	0xa0
 	.byte	0xa3
 	.4byte	0x443
@@ -31373,34 +31722,34 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2386
+	.4byte	.LASF2388
 	.byte	0xa0
 	.byte	0xa5
 	.4byte	0x6d
 	.byte	0x2c
 	.uleb128 0xe
-	.4byte	.LASF2220
+	.4byte	.LASF2222
 	.byte	0xa0
 	.byte	0xa8
-	.4byte	0xb47e
+	.4byte	0xb494
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2387
+	.4byte	.LASF2389
 	.byte	0xa0
 	.byte	0xa9
-	.4byte	0xbd23
+	.4byte	0xbd39
 	.byte	0x38
 	.uleb128 0x20
 	.string	"gc"
 	.byte	0xa0
 	.byte	0xaa
-	.4byte	0xbf43
+	.4byte	0xbf59
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF637
+	.4byte	.LASF639
 	.byte	0xa0
 	.byte	0xac
-	.4byte	0xb64b
+	.4byte	0xb661
 	.byte	0x48
 	.uleb128 0xe
 	.4byte	.LASF129
@@ -31427,175 +31776,175 @@ __exitcall_ebc_exit:
 	.4byte	0x155
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2388
+	.4byte	.LASF2390
 	.byte	0xa0
 	.byte	0xb8
 	.4byte	0x347
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF2389
+	.4byte	.LASF2391
 	.byte	0xa0
 	.byte	0xb9
 	.4byte	0x6d
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2390
+	.4byte	.LASF2392
 	.byte	0xa0
 	.byte	0xba
 	.4byte	0x6d
 	.byte	0x7c
 	.uleb128 0xe
-	.4byte	.LASF2391
+	.4byte	.LASF2393
 	.byte	0xa0
 	.byte	0xbb
-	.4byte	0x4dae
+	.4byte	0x4dc4
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF2392
+	.4byte	.LASF2394
 	.byte	0xa0
 	.byte	0xbc
-	.4byte	0x243f
+	.4byte	0x2455
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2393
+	.4byte	.LASF2395
 	.byte	0xa0
 	.byte	0xbd
-	.4byte	0xbf49
+	.4byte	0xbf5f
 	.byte	0xb0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb54f
+	.4byte	0xb565
 	.uleb128 0x24
-	.4byte	.LASF2394
+	.4byte	.LASF2396
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb651
+	.4byte	0xb667
 	.uleb128 0xd
-	.4byte	.LASF2395
+	.4byte	.LASF2397
 	.byte	0xc0
 	.byte	0xa
 	.byte	0x84
-	.4byte	0xb789
+	.4byte	0xb79f
 	.uleb128 0xe
-	.4byte	.LASF2396
+	.4byte	.LASF2398
 	.byte	0xa
 	.byte	0x85
-	.4byte	0xdc15
+	.4byte	0xdc37
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2397
+	.4byte	.LASF2399
 	.byte	0xa
 	.byte	0x88
-	.4byte	0xdc3a
+	.4byte	0xdc5c
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF108
 	.byte	0xa
 	.byte	0x8b
-	.4byte	0xdc68
+	.4byte	0xdc8a
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2398
+	.4byte	.LASF2400
 	.byte	0xa
 	.byte	0x8f
-	.4byte	0xdc9c
+	.4byte	0xdcbe
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2399
+	.4byte	.LASF2401
 	.byte	0xa
 	.byte	0x92
-	.4byte	0xdcca
+	.4byte	0xdcec
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2400
+	.4byte	.LASF2402
 	.byte	0xa
 	.byte	0x96
-	.4byte	0xdcef
+	.4byte	0xdd11
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2401
+	.4byte	.LASF2403
 	.byte	0xa
 	.byte	0x9d
-	.4byte	0xdd18
+	.4byte	0xdd3a
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2402
+	.4byte	.LASF2404
 	.byte	0xa
 	.byte	0xa0
-	.4byte	0xdd3d
+	.4byte	0xdd5f
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2403
+	.4byte	.LASF2405
 	.byte	0xa
 	.byte	0xa4
-	.4byte	0xdd66
+	.4byte	0xdd88
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2404
+	.4byte	.LASF2406
 	.byte	0xa
 	.byte	0xa7
-	.4byte	0xdcef
+	.4byte	0xdd11
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2405
+	.4byte	.LASF2407
 	.byte	0xa
 	.byte	0xaa
-	.4byte	0xdd86
+	.4byte	0xdda8
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2406
+	.4byte	.LASF2408
 	.byte	0xa
 	.byte	0xad
-	.4byte	0xdd86
+	.4byte	0xdda8
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2407
+	.4byte	.LASF2409
 	.byte	0xa
 	.byte	0xb0
-	.4byte	0xdda6
+	.4byte	0xddc8
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2408
+	.4byte	.LASF2410
 	.byte	0xa
 	.byte	0xb3
-	.4byte	0xdda6
+	.4byte	0xddc8
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2409
+	.4byte	.LASF2411
 	.byte	0xa
 	.byte	0xb6
-	.4byte	0xddc6
+	.4byte	0xdde8
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF2410
+	.4byte	.LASF2412
 	.byte	0xa
 	.byte	0xb8
-	.4byte	0xdde0
+	.4byte	0xde02
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2411
+	.4byte	.LASF2413
 	.byte	0xa
 	.byte	0xb9
-	.4byte	0xddfa
+	.4byte	0xde1c
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF2412
+	.4byte	.LASF2414
 	.byte	0xa
 	.byte	0xba
-	.4byte	0xddfa
+	.4byte	0xde1c
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF2413
+	.4byte	.LASF2415
 	.byte	0xa
 	.byte	0xbb
-	.4byte	0xde23
+	.4byte	0xde45
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2414
+	.4byte	.LASF2416
 	.byte	0xa
 	.byte	0xbd
-	.4byte	0xde3e
+	.4byte	0xde60
 	.byte	0x98
 	.uleb128 0xe
 	.4byte	.LASF129
@@ -31623,34 +31972,34 @@ __exitcall_ebc_exit:
 	.byte	0xb8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb65c
+	.4byte	0xb672
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb789
+	.4byte	0xb79f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb3f0
+	.4byte	0xb406
 	.uleb128 0x24
-	.4byte	.LASF2415
+	.4byte	.LASF2417
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb79a
+	.4byte	0xb7b0
 	.uleb128 0x48
 	.string	"cma"
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb7a5
+	.4byte	0xb7bb
 	.uleb128 0x24
-	.4byte	.LASF2416
+	.4byte	.LASF2418
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb7b0
+	.4byte	0xb7c6
 	.uleb128 0xd
-	.4byte	.LASF2417
+	.4byte	.LASF2419
 	.byte	0xf0
 	.byte	0xe
 	.byte	0x33
-	.4byte	0xb864
+	.4byte	0xb87a
 	.uleb128 0xe
 	.4byte	.LASF264
 	.byte	0xe
@@ -31664,164 +32013,164 @@ __exitcall_ebc_exit:
 	.4byte	0x56
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2418
+	.4byte	.LASF2420
 	.byte	0xe
 	.byte	0x36
-	.4byte	0xbc35
+	.4byte	0xbc4b
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2419
+	.4byte	.LASF2421
 	.byte	0xe
 	.byte	0x37
 	.4byte	0x56
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2220
+	.4byte	.LASF2222
 	.byte	0xe
 	.byte	0x38
-	.4byte	0xb418
+	.4byte	0xb42e
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2420
+	.4byte	.LASF2422
 	.byte	0xe
 	.byte	0x3a
-	.4byte	0xbc89
+	.4byte	0xbc9f
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2421
+	.4byte	.LASF2423
 	.byte	0xe
 	.byte	0x3b
-	.4byte	0xbc89
+	.4byte	0xbc9f
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF637
+	.4byte	.LASF639
 	.byte	0xe
 	.byte	0x3c
-	.4byte	0xb869
+	.4byte	0xb87f
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2031
+	.4byte	.LASF2033
 	.byte	0xe
 	.byte	0x3d
-	.4byte	0xb869
+	.4byte	0xb87f
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF639
+	.4byte	.LASF641
 	.byte	0xe
 	.byte	0x3e
-	.4byte	0xb869
+	.4byte	0xb87f
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2143
+	.4byte	.LASF2145
 	.byte	0xe
 	.byte	0x40
-	.4byte	0x90dc
+	.4byte	0x90f2
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF2422
+	.4byte	.LASF2424
 	.byte	0xe
 	.byte	0x42
 	.4byte	0x29
 	.byte	0xe0
 	.uleb128 0xe
-	.4byte	.LASF791
+	.4byte	.LASF793
 	.byte	0xe
 	.byte	0x43
 	.4byte	0x443
 	.byte	0xe8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb7bb
+	.4byte	0xb7d1
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb7bb
+	.4byte	0xb7d1
 	.uleb128 0x24
-	.4byte	.LASF2227
+	.4byte	.LASF2229
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb86f
+	.4byte	0xb885
 	.uleb128 0x24
-	.4byte	.LASF2228
+	.4byte	.LASF2230
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb87a
+	.4byte	0xb890
 	.uleb128 0x15
-	.4byte	.LASF2423
+	.4byte	.LASF2425
 	.byte	0x2
 	.2byte	0x590
-	.4byte	0xa827
+	.4byte	0xa83d
 	.uleb128 0x15
-	.4byte	.LASF2424
+	.4byte	.LASF2426
 	.byte	0x2
 	.2byte	0x592
-	.4byte	0xa827
+	.4byte	0xa83d
 	.uleb128 0x8
-	.4byte	.LASF2425
+	.4byte	.LASF2427
 	.byte	0x9e
 	.byte	0xe
 	.4byte	0x29
 	.uleb128 0x5
 	.4byte	0x8b
-	.4byte	0xb8b8
+	.4byte	0xb8ce
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x8
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0xb8c8
+	.4byte	0xb8de
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x7f
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0xb8d8
+	.4byte	0xb8ee
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x13
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF2426
+	.4byte	.LASF2428
 	.byte	0x20
 	.byte	0x9e
 	.2byte	0x222
-	.4byte	0xb900
+	.4byte	0xb916
 	.uleb128 0x1b
 	.4byte	.LASF264
 	.byte	0x9e
 	.2byte	0x223
-	.4byte	0xb8c8
+	.4byte	0xb8de
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2201
+	.4byte	.LASF2203
 	.byte	0x9e
 	.2byte	0x224
-	.4byte	0xb89d
+	.4byte	0xb8b3
 	.byte	0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb8d8
+	.4byte	0xb8ee
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xb915
+	.4byte	0xb92b
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb905
+	.4byte	0xb91b
 	.uleb128 0x19
-	.4byte	.LASF2427
+	.4byte	.LASF2429
 	.byte	0xa1
 	.byte	0x14
 	.4byte	0xc6
 	.uleb128 0xd
-	.4byte	.LASF2428
+	.4byte	.LASF2430
 	.byte	0x20
 	.byte	0xa1
 	.byte	0x1e
-	.4byte	0xb956
+	.4byte	0xb96c
 	.uleb128 0xe
 	.4byte	.LASF227
 	.byte	0xa1
@@ -31829,139 +32178,139 @@ __exitcall_ebc_exit:
 	.4byte	0xe1e
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2429
+	.4byte	.LASF2431
 	.byte	0xa1
 	.byte	0x20
-	.4byte	0x3507
+	.4byte	0x351d
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF97
 	.byte	0xa1
 	.byte	0x21
-	.4byte	0x2eda
+	.4byte	0x2ef0
 	.byte	0x18
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb95c
+	.4byte	0xb972
 	.uleb128 0x24
-	.4byte	.LASF2430
+	.4byte	.LASF2432
 	.uleb128 0xd
-	.4byte	.LASF2431
+	.4byte	.LASF2433
 	.byte	0x80
 	.byte	0x9f
 	.byte	0x75
-	.4byte	0xba2e
+	.4byte	0xba44
 	.uleb128 0x20
 	.string	"get"
 	.byte	0x9f
 	.byte	0x76
-	.4byte	0xbabf
+	.4byte	0xbad5
 	.byte	0
 	.uleb128 0x20
 	.string	"put"
 	.byte	0x9f
 	.byte	0x77
-	.4byte	0xbad0
+	.4byte	0xbae6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2432
+	.4byte	.LASF2434
 	.byte	0x9f
 	.byte	0x78
-	.4byte	0xbae5
+	.4byte	0xbafb
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2433
+	.4byte	.LASF2435
 	.byte	0x9f
 	.byte	0x79
-	.4byte	0xbb05
+	.4byte	0xbb1b
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2434
+	.4byte	.LASF2436
 	.byte	0x9f
 	.byte	0x7b
-	.4byte	0xbb1f
+	.4byte	0xbb35
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2435
+	.4byte	.LASF2437
 	.byte	0x9f
 	.byte	0x7d
-	.4byte	0xbb48
+	.4byte	0xbb5e
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2436
+	.4byte	.LASF2438
 	.byte	0x9f
 	.byte	0x82
-	.4byte	0xbb72
+	.4byte	0xbb88
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2437
+	.4byte	.LASF2439
 	.byte	0x9f
 	.byte	0x85
-	.4byte	0xbb87
+	.4byte	0xbb9d
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2438
+	.4byte	.LASF2440
 	.byte	0x9f
 	.byte	0x87
-	.4byte	0xbba1
+	.4byte	0xbbb7
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2439
+	.4byte	.LASF2441
 	.byte	0x9f
 	.byte	0x8a
-	.4byte	0xbbbb
+	.4byte	0xbbd1
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2440
+	.4byte	.LASF2442
 	.byte	0x9f
 	.byte	0x8c
-	.4byte	0xbbef
+	.4byte	0xbc05
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2441
+	.4byte	.LASF2443
 	.byte	0x9f
 	.byte	0x91
-	.4byte	0xbba1
+	.4byte	0xbbb7
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2442
+	.4byte	.LASF2444
 	.byte	0x9f
 	.byte	0x94
-	.4byte	0xbb87
+	.4byte	0xbb9d
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2443
+	.4byte	.LASF2445
 	.byte	0x9f
 	.byte	0x96
-	.4byte	0xbabf
+	.4byte	0xbad5
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF2444
+	.4byte	.LASF2446
 	.byte	0x9f
 	.byte	0x97
-	.4byte	0xbc0f
+	.4byte	0xbc25
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF2445
+	.4byte	.LASF2447
 	.byte	0x9f
 	.byte	0x99
-	.4byte	0xbc29
+	.4byte	0xbc3f
 	.byte	0x78
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xb961
+	.4byte	0xb977
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xba2e
+	.4byte	0xba44
 	.uleb128 0xd
-	.4byte	.LASF2446
+	.4byte	.LASF2448
 	.byte	0x10
 	.byte	0x9f
 	.byte	0x26
-	.4byte	0xba69
+	.4byte	0xba7f
 	.uleb128 0xe
-	.4byte	.LASF2447
+	.4byte	.LASF2449
 	.byte	0x9f
 	.byte	0x27
 	.4byte	0x6d
@@ -31973,103 +32322,103 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF2448
+	.4byte	.LASF2450
 	.byte	0x9f
 	.byte	0x29
-	.4byte	0xba69
+	.4byte	0xba7f
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb479
+	.4byte	0xb48f
 	.uleb128 0xd
-	.4byte	.LASF2449
+	.4byte	.LASF2451
 	.byte	0x50
 	.byte	0x9f
 	.byte	0x34
-	.4byte	0xbaa0
+	.4byte	0xbab6
 	.uleb128 0xe
-	.4byte	.LASF2220
+	.4byte	.LASF2222
 	.byte	0x9f
 	.byte	0x35
-	.4byte	0xb47e
+	.4byte	0xb494
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2450
+	.4byte	.LASF2452
 	.byte	0x9f
 	.byte	0x36
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1752
+	.4byte	.LASF1754
 	.byte	0x9f
 	.byte	0x37
-	.4byte	0xbaa0
+	.4byte	0xbab6
 	.byte	0x10
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x155
-	.4byte	0xbab0
+	.4byte	0xbac6
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x7
 	.byte	0
 	.uleb128 0x14
-	.4byte	0xb47e
-	.4byte	0xbabf
+	.4byte	0xb494
+	.4byte	0xbad5
 	.uleb128 0x11
-	.4byte	0xb47e
+	.4byte	0xb494
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbab0
+	.4byte	0xbac6
 	.uleb128 0x10
-	.4byte	0xbad0
+	.4byte	0xbae6
 	.uleb128 0x11
-	.4byte	0xb47e
+	.4byte	0xb494
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbac5
+	.4byte	0xbadb
 	.uleb128 0x14
 	.4byte	0x29b
-	.4byte	0xbae5
+	.4byte	0xbafb
 	.uleb128 0x11
-	.4byte	0xba69
+	.4byte	0xba7f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbad6
+	.4byte	0xbaec
 	.uleb128 0x14
-	.4byte	0x3091
-	.4byte	0xbaff
+	.4byte	0x30a7
+	.4byte	0xbb15
 	.uleb128 0x11
-	.4byte	0xba69
+	.4byte	0xba7f
 	.uleb128 0x11
-	.4byte	0xbaff
+	.4byte	0xbb15
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xa822
+	.4byte	0xa838
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbaeb
+	.4byte	0xbb01
 	.uleb128 0x14
 	.4byte	0x29b
-	.4byte	0xbb1f
+	.4byte	0xbb35
 	.uleb128 0x11
-	.4byte	0xba69
+	.4byte	0xba7f
 	.uleb128 0x11
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbb0b
+	.4byte	0xbb21
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbb48
+	.4byte	0xbb5e
 	.uleb128 0x11
-	.4byte	0xba69
+	.4byte	0xba7f
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
@@ -32081,16 +32430,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbb25
+	.4byte	0xbb3b
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbb6c
+	.4byte	0xbb82
 	.uleb128 0x11
-	.4byte	0xba69
+	.4byte	0xba7f
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
-	.4byte	0xbb6c
+	.4byte	0xbb82
 	.uleb128 0x11
 	.4byte	0x2ce
 	.byte	0
@@ -32099,43 +32448,43 @@ __exitcall_ebc_exit:
 	.4byte	0x56
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbb4e
+	.4byte	0xbb64
 	.uleb128 0x14
-	.4byte	0xb47e
-	.4byte	0xbb87
+	.4byte	0xb494
+	.4byte	0xbb9d
 	.uleb128 0x11
-	.4byte	0xba69
+	.4byte	0xba7f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbb78
+	.4byte	0xbb8e
 	.uleb128 0x14
-	.4byte	0xb47e
-	.4byte	0xbba1
+	.4byte	0xb494
+	.4byte	0xbbb7
 	.uleb128 0x11
-	.4byte	0xba69
+	.4byte	0xba7f
 	.uleb128 0x11
-	.4byte	0xb47e
+	.4byte	0xb494
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbb8d
+	.4byte	0xbba3
 	.uleb128 0x14
-	.4byte	0xb47e
-	.4byte	0xbbbb
+	.4byte	0xb494
+	.4byte	0xbbd1
 	.uleb128 0x11
-	.4byte	0xba69
+	.4byte	0xba7f
 	.uleb128 0x11
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbba7
+	.4byte	0xbbbd
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbbe9
+	.4byte	0xbbff
 	.uleb128 0x11
-	.4byte	0xba69
+	.4byte	0xba7f
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
@@ -32145,53 +32494,53 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
-	.4byte	0xbbe9
+	.4byte	0xbbff
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xba6f
+	.4byte	0xba85
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbbc1
+	.4byte	0xbbd7
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbc09
+	.4byte	0xbc1f
 	.uleb128 0x11
-	.4byte	0xba69
+	.4byte	0xba7f
 	.uleb128 0x11
-	.4byte	0xbc09
+	.4byte	0xbc1f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xba39
+	.4byte	0xba4f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbbf5
+	.4byte	0xbc0b
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbc29
+	.4byte	0xbc3f
 	.uleb128 0x11
-	.4byte	0xba69
+	.4byte	0xba7f
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbc15
+	.4byte	0xbc2b
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x145
 	.uleb128 0x8
-	.4byte	.LASF2418
+	.4byte	.LASF2420
 	.byte	0xe
 	.byte	0x1c
 	.4byte	0x13a
 	.uleb128 0xd
-	.4byte	.LASF2451
+	.4byte	.LASF2453
 	.byte	0x58
 	.byte	0xe
 	.byte	0x1f
-	.4byte	0xbc89
+	.4byte	0xbc9f
 	.uleb128 0xe
 	.4byte	.LASF264
 	.byte	0xe
@@ -32199,13 +32548,13 @@ __exitcall_ebc_exit:
 	.4byte	0x219
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2452
+	.4byte	.LASF2454
 	.byte	0xe
 	.byte	0x21
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2453
+	.4byte	.LASF2455
 	.byte	0xe
 	.byte	0x22
 	.4byte	0x443
@@ -32214,223 +32563,223 @@ __exitcall_ebc_exit:
 	.4byte	.LASF63
 	.byte	0xe
 	.byte	0x23
-	.4byte	0xbc89
+	.4byte	0xbc9f
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2112
+	.4byte	.LASF2114
 	.byte	0xe
 	.byte	0x2b
-	.4byte	0x9eef
+	.4byte	0x9f05
 	.byte	0x20
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbc40
+	.4byte	0xbc56
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb864
+	.4byte	0xb87a
 	.uleb128 0x19
-	.4byte	.LASF2454
+	.4byte	.LASF2456
 	.byte	0xe
 	.byte	0x6a
-	.4byte	0xa0b7
+	.4byte	0xa0cd
 	.uleb128 0x19
-	.4byte	.LASF2455
+	.4byte	.LASF2457
 	.byte	0xe
 	.byte	0x6b
-	.4byte	0xba2e
+	.4byte	0xba44
 	.uleb128 0x19
-	.4byte	.LASF2456
+	.4byte	.LASF2458
 	.byte	0xe
 	.byte	0x87
-	.4byte	0xb869
+	.4byte	0xb87f
 	.uleb128 0x19
-	.4byte	.LASF2457
+	.4byte	.LASF2459
 	.byte	0xe
 	.byte	0x88
-	.4byte	0xb869
+	.4byte	0xb87f
 	.uleb128 0x19
-	.4byte	.LASF2458
+	.4byte	.LASF2460
 	.byte	0xe
 	.byte	0x89
-	.4byte	0xb869
+	.4byte	0xb87f
 	.uleb128 0x19
-	.4byte	.LASF2459
+	.4byte	.LASF2461
 	.byte	0xe
 	.byte	0x8a
-	.4byte	0xb869
+	.4byte	0xb87f
 	.uleb128 0x19
-	.4byte	.LASF2460
+	.4byte	.LASF2462
 	.byte	0xe
 	.byte	0x8b
 	.4byte	0xe1e
 	.uleb128 0xd
-	.4byte	.LASF2461
+	.4byte	.LASF2463
 	.byte	0x50
 	.byte	0xa0
 	.byte	0x3f
-	.4byte	0xbd13
+	.4byte	0xbd29
 	.uleb128 0xe
-	.4byte	.LASF2220
+	.4byte	.LASF2222
 	.byte	0xa0
 	.byte	0x40
-	.4byte	0xb47e
+	.4byte	0xb494
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2462
+	.4byte	.LASF2464
 	.byte	0xa0
 	.byte	0x41
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2463
+	.4byte	.LASF2465
 	.byte	0xa0
 	.byte	0x42
-	.4byte	0xbd13
+	.4byte	0xbd29
 	.byte	0xc
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x13a
-	.4byte	0xbd23
+	.4byte	0xbd39
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF2464
+	.4byte	.LASF2466
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xa0
 	.byte	0x4c
-	.4byte	0xbd64
+	.4byte	0xbd7a
 	.uleb128 0xc
-	.4byte	.LASF2465
+	.4byte	.LASF2467
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2466
+	.4byte	.LASF2468
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2467
+	.4byte	.LASF2469
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2468
+	.4byte	.LASF2470
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2469
+	.4byte	.LASF2471
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF2470
+	.4byte	.LASF2472
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF2471
+	.4byte	.LASF2473
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF2472
+	.4byte	.LASF2474
 	.byte	0x7
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2473
+	.4byte	.LASF2475
 	.byte	0x50
 	.byte	0xa0
 	.byte	0x66
-	.4byte	0xbde9
+	.4byte	0xbdff
 	.uleb128 0xe
-	.4byte	.LASF2328
+	.4byte	.LASF2330
 	.byte	0xa0
 	.byte	0x67
-	.4byte	0xbe07
+	.4byte	0xbe1d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2474
+	.4byte	.LASF2476
 	.byte	0xa0
 	.byte	0x69
-	.4byte	0xbe2c
+	.4byte	0xbe42
 	.byte	0x8
 	.uleb128 0x20
 	.string	"map"
 	.byte	0xa0
 	.byte	0x6b
-	.4byte	0xbe4b
+	.4byte	0xbe61
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2475
+	.4byte	.LASF2477
 	.byte	0xa0
 	.byte	0x6c
-	.4byte	0xbe61
+	.4byte	0xbe77
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2476
+	.4byte	.LASF2478
 	.byte	0xa0
 	.byte	0x6d
-	.4byte	0xbe8f
+	.4byte	0xbea5
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2396
+	.4byte	.LASF2398
 	.byte	0xa0
 	.byte	0x72
-	.4byte	0xbeb3
+	.4byte	0xbec9
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2397
+	.4byte	.LASF2399
 	.byte	0xa0
 	.byte	0x74
-	.4byte	0xbece
+	.4byte	0xbee4
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2315
+	.4byte	.LASF2317
 	.byte	0xa0
 	.byte	0x76
-	.4byte	0xbeed
+	.4byte	0xbf03
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2477
+	.4byte	.LASF2479
 	.byte	0xa0
 	.byte	0x77
-	.4byte	0xbf03
+	.4byte	0xbf19
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2478
+	.4byte	.LASF2480
 	.byte	0xa0
 	.byte	0x78
-	.4byte	0xbf27
+	.4byte	0xbf3d
 	.byte	0x48
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xbd64
+	.4byte	0xbd7a
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbe07
+	.4byte	0xbe1d
 	.uleb128 0x11
-	.4byte	0xb64b
+	.4byte	0xb661
 	.uleb128 0x11
-	.4byte	0xb869
+	.4byte	0xb87f
 	.uleb128 0x11
-	.4byte	0xbd23
+	.4byte	0xbd39
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbdee
+	.4byte	0xbe04
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbe26
+	.4byte	0xbe3c
 	.uleb128 0x11
-	.4byte	0xb64b
+	.4byte	0xb661
 	.uleb128 0x11
-	.4byte	0xbe26
+	.4byte	0xbe3c
 	.uleb128 0x11
-	.4byte	0xbd23
+	.4byte	0xbd39
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbce2
+	.4byte	0xbcf8
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbe0d
+	.4byte	0xbe23
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbe4b
+	.4byte	0xbe61
 	.uleb128 0x11
-	.4byte	0xb64b
+	.4byte	0xb661
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
@@ -32438,41 +32787,41 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbe32
+	.4byte	0xbe48
 	.uleb128 0x10
-	.4byte	0xbe61
+	.4byte	0xbe77
 	.uleb128 0x11
-	.4byte	0xb64b
+	.4byte	0xb661
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbe51
+	.4byte	0xbe67
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbe8f
+	.4byte	0xbea5
 	.uleb128 0x11
-	.4byte	0xb64b
+	.4byte	0xb661
 	.uleb128 0x11
-	.4byte	0xb869
+	.4byte	0xb87f
 	.uleb128 0x11
-	.4byte	0xbc2f
+	.4byte	0xbc45
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
-	.4byte	0x686c
+	.4byte	0x6882
 	.uleb128 0x11
-	.4byte	0x3548
+	.4byte	0x355e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbe67
+	.4byte	0xbe7d
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbeb3
+	.4byte	0xbec9
 	.uleb128 0x11
-	.4byte	0xb64b
+	.4byte	0xb661
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
@@ -32482,11 +32831,11 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbe95
+	.4byte	0xbeab
 	.uleb128 0x10
-	.4byte	0xbece
+	.4byte	0xbee4
 	.uleb128 0x11
-	.4byte	0xb64b
+	.4byte	0xb661
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
@@ -32494,82 +32843,82 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbeb9
+	.4byte	0xbecf
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbeed
+	.4byte	0xbf03
 	.uleb128 0x11
-	.4byte	0xb64b
+	.4byte	0xb661
 	.uleb128 0x11
-	.4byte	0xb956
+	.4byte	0xb96c
 	.uleb128 0x11
 	.4byte	0x29b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbed4
+	.4byte	0xbeea
 	.uleb128 0x10
-	.4byte	0xbf03
+	.4byte	0xbf19
 	.uleb128 0x11
-	.4byte	0xb64b
+	.4byte	0xb661
 	.uleb128 0x11
-	.4byte	0xb956
+	.4byte	0xb96c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbef3
+	.4byte	0xbf09
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xbf27
+	.4byte	0xbf3d
 	.uleb128 0x11
-	.4byte	0xb64b
+	.4byte	0xb661
 	.uleb128 0x11
-	.4byte	0xbe26
+	.4byte	0xbe3c
 	.uleb128 0x11
-	.4byte	0x686c
+	.4byte	0x6882
 	.uleb128 0x11
-	.4byte	0x3548
+	.4byte	0x355e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbf09
+	.4byte	0xbf1f
 	.uleb128 0x19
-	.4byte	.LASF2479
+	.4byte	.LASF2481
 	.byte	0xa0
 	.byte	0x81
-	.4byte	0xbd64
+	.4byte	0xbd7a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbde9
+	.4byte	0xbdff
 	.uleb128 0x24
-	.4byte	.LASF2480
+	.4byte	.LASF2482
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbf3e
+	.4byte	0xbf54
 	.uleb128 0x5
 	.4byte	0x6d
-	.4byte	0xbf58
+	.4byte	0xbf6e
 	.uleb128 0x44
 	.4byte	0x4f
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF2481
+	.4byte	.LASF2483
 	.byte	0xa0
 	.2byte	0x121
-	.4byte	0xba2e
+	.4byte	0xba44
 	.uleb128 0x15
-	.4byte	.LASF2482
+	.4byte	.LASF2484
 	.byte	0xa0
 	.2byte	0x1a5
-	.4byte	0xbde9
+	.4byte	0xbdff
 	.uleb128 0xd
-	.4byte	.LASF2483
+	.4byte	.LASF2485
 	.byte	0x10
 	.byte	0xa2
 	.byte	0x45
-	.4byte	0xbfad
+	.4byte	0xbfc3
 	.uleb128 0xe
-	.4byte	.LASF1147
+	.4byte	.LASF1149
 	.byte	0xa2
 	.byte	0x46
 	.4byte	0xa9
@@ -32590,65 +32939,65 @@ __exitcall_ebc_exit:
 	.string	"buf"
 	.byte	0xa2
 	.byte	0x55
-	.4byte	0xbfad
+	.4byte	0xbfc3
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x8b
 	.uleb128 0x39
-	.4byte	.LASF2484
+	.4byte	.LASF2486
 	.byte	0x22
 	.byte	0xa2
 	.byte	0x87
-	.4byte	0xbfe1
+	.4byte	0xbff7
 	.uleb128 0x22
-	.4byte	.LASF2485
+	.4byte	.LASF2487
 	.byte	0xa2
 	.byte	0x88
 	.4byte	0x8b
 	.uleb128 0x22
-	.4byte	.LASF2486
+	.4byte	.LASF2488
 	.byte	0xa2
 	.byte	0x89
 	.4byte	0xa9
 	.uleb128 0x22
-	.4byte	.LASF2487
+	.4byte	.LASF2489
 	.byte	0xa2
 	.byte	0x8a
-	.4byte	0xbfe1
+	.4byte	0xbff7
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x8b
-	.4byte	0xbff1
+	.4byte	0xc007
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x21
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2488
+	.4byte	.LASF2490
 	.byte	0xa3
 	.byte	0x27
-	.4byte	0xadb2
+	.4byte	0xadc8
 	.uleb128 0x19
-	.4byte	.LASF2489
+	.4byte	.LASF2491
 	.byte	0xa3
 	.byte	0x28
-	.4byte	0xb0aa
+	.4byte	0xb0c0
 	.uleb128 0x19
-	.4byte	.LASF2490
+	.4byte	.LASF2492
 	.byte	0xa3
 	.byte	0x29
-	.4byte	0xb0aa
+	.4byte	0xb0c0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc018
+	.4byte	0xc02e
 	.uleb128 0x1a
-	.4byte	.LASF2491
+	.4byte	.LASF2493
 	.2byte	0x3e8
 	.byte	0xa3
 	.2byte	0x148
-	.4byte	0xc092
+	.4byte	0xc0a8
 	.uleb128 0x1b
 	.4byte	.LASF170
 	.byte	0xa3
@@ -32656,7 +33005,7 @@ __exitcall_ebc_exit:
 	.4byte	0xb4
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1147
+	.4byte	.LASF1149
 	.byte	0xa3
 	.2byte	0x14a
 	.4byte	0xb4
@@ -32665,22 +33014,22 @@ __exitcall_ebc_exit:
 	.4byte	.LASF264
 	.byte	0xa3
 	.2byte	0x14d
-	.4byte	0xb8c8
+	.4byte	0xb8de
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF2492
+	.4byte	.LASF2494
 	.byte	0xa3
 	.2byte	0x14e
-	.4byte	0xc19d
+	.4byte	0xc1b3
 	.byte	0x18
 	.uleb128 0x2b
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x14f
-	.4byte	0xa54b
+	.4byte	0xa561
 	.byte	0x20
 	.uleb128 0x1c
-	.4byte	.LASF2493
+	.4byte	.LASF2495
 	.byte	0xa3
 	.2byte	0x150
 	.4byte	0xc6
@@ -32692,186 +33041,186 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.2byte	0x3d4
 	.uleb128 0x1c
-	.4byte	.LASF2494
+	.4byte	.LASF2496
 	.byte	0xa3
 	.2byte	0x152
 	.4byte	0x392
 	.2byte	0x3d8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xc018
+	.4byte	0xc02e
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x10b
 	.uleb128 0x1a
-	.4byte	.LASF2495
+	.4byte	.LASF2497
 	.2byte	0x4c0
 	.byte	0xa3
-	.2byte	0x29e
-	.4byte	0xc19d
+	.2byte	0x2a0
+	.4byte	0xc1b3
 	.uleb128 0x1b
 	.4byte	.LASF97
 	.byte	0xa3
-	.2byte	0x29f
-	.4byte	0x7550
+	.2byte	0x2a1
+	.4byte	0x7566
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2225
+	.4byte	.LASF2227
 	.byte	0xa3
-	.2byte	0x2a0
+	.2byte	0x2a2
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2496
+	.4byte	.LASF2498
 	.byte	0xa3
-	.2byte	0x2a1
-	.4byte	0xc3f8
+	.2byte	0x2a3
+	.4byte	0xc40e
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2497
+	.4byte	.LASF2499
 	.byte	0xa3
-	.2byte	0x2a2
+	.2byte	0x2a4
 	.4byte	0x443
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF2498
+	.4byte	.LASF2500
 	.byte	0xa3
-	.2byte	0x2a5
-	.4byte	0xc3fe
+	.2byte	0x2a7
+	.4byte	0xc414
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2499
+	.4byte	.LASF2501
 	.byte	0xa3
-	.2byte	0x2a6
-	.4byte	0xb925
+	.2byte	0x2a8
+	.4byte	0xb93b
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF2500
+	.4byte	.LASF2502
 	.byte	0xa3
-	.2byte	0x2a7
-	.4byte	0xb925
+	.2byte	0x2a9
+	.4byte	0xb93b
 	.byte	0x48
 	.uleb128 0x1b
-	.4byte	.LASF1064
+	.4byte	.LASF1066
 	.byte	0xa3
-	.2byte	0x2a9
+	.2byte	0x2ab
 	.4byte	0xc6
 	.byte	0x68
 	.uleb128 0x1b
-	.4byte	.LASF2501
+	.4byte	.LASF2503
 	.byte	0xa3
-	.2byte	0x2aa
+	.2byte	0x2ac
 	.4byte	0xc6
 	.byte	0x6c
 	.uleb128 0x2b
 	.string	"dev"
 	.byte	0xa3
-	.2byte	0x2ab
-	.4byte	0xa54b
+	.2byte	0x2ad
+	.4byte	0xa561
 	.byte	0x70
 	.uleb128 0x30
 	.string	"nr"
 	.byte	0xa3
-	.2byte	0x2ad
+	.2byte	0x2af
 	.4byte	0xc6
 	.2byte	0x420
 	.uleb128 0x1c
 	.4byte	.LASF264
 	.byte	0xa3
-	.2byte	0x2ae
-	.4byte	0xc404
+	.2byte	0x2b0
+	.4byte	0xc41a
 	.2byte	0x424
 	.uleb128 0x1c
-	.4byte	.LASF2502
+	.4byte	.LASF2504
 	.byte	0xa3
-	.2byte	0x2af
-	.4byte	0x4628
+	.2byte	0x2b1
+	.4byte	0x463e
 	.2byte	0x458
 	.uleb128 0x1c
-	.4byte	.LASF2503
+	.4byte	.LASF2505
 	.byte	0xa3
-	.2byte	0x2b1
-	.4byte	0x243f
+	.2byte	0x2b3
+	.4byte	0x2455
 	.2byte	0x478
 	.uleb128 0x1c
-	.4byte	.LASF2504
+	.4byte	.LASF2506
 	.byte	0xa3
-	.2byte	0x2b2
+	.2byte	0x2b4
 	.4byte	0x392
 	.2byte	0x498
 	.uleb128 0x1c
-	.4byte	.LASF2505
+	.4byte	.LASF2507
 	.byte	0xa3
-	.2byte	0x2b4
-	.4byte	0xc414
+	.2byte	0x2b6
+	.4byte	0xc42a
 	.2byte	0x4a8
 	.uleb128 0x1c
-	.4byte	.LASF2506
+	.4byte	.LASF2508
 	.byte	0xa3
-	.2byte	0x2b5
-	.4byte	0xc41a
+	.2byte	0x2b7
+	.4byte	0xc430
 	.2byte	0x4b0
 	.uleb128 0x1c
-	.4byte	.LASF2507
+	.4byte	.LASF2509
 	.byte	0xa3
-	.2byte	0x2b7
-	.4byte	0xb64b
+	.2byte	0x2b9
+	.4byte	0xb661
 	.2byte	0x4b8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc09d
+	.4byte	0xc0b3
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x97be
+	.4byte	0x97d4
 	.uleb128 0x1d
-	.4byte	.LASF2508
+	.4byte	.LASF2510
 	.byte	0x18
 	.byte	0xa3
 	.2byte	0x207
-	.4byte	0xc1de
+	.4byte	0xc1f4
 	.uleb128 0x1b
-	.4byte	.LASF2509
+	.4byte	.LASF2511
 	.byte	0xa3
 	.2byte	0x20e
-	.4byte	0xc202
+	.4byte	0xc218
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2510
+	.4byte	.LASF2512
 	.byte	0xa3
 	.2byte	0x210
-	.4byte	0xc23b
+	.4byte	0xc251
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2511
+	.4byte	.LASF2513
 	.byte	0xa3
 	.2byte	0x215
-	.4byte	0xc250
+	.4byte	0xc266
 	.byte	0x10
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xc1a9
+	.4byte	0xc1bf
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xc1fc
+	.4byte	0xc212
 	.uleb128 0x11
-	.4byte	0xc19d
+	.4byte	0xc1b3
 	.uleb128 0x11
-	.4byte	0xc1fc
+	.4byte	0xc212
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbf70
+	.4byte	0xbf86
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc1e3
+	.4byte	0xc1f9
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xc235
+	.4byte	0xc24b
 	.uleb128 0x11
-	.4byte	0xc19d
+	.4byte	0xc1b3
 	.uleb128 0x11
 	.4byte	0x11a
 	.uleb128 0x11
@@ -32883,176 +33232,176 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xc235
+	.4byte	0xc24b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xbfb3
+	.4byte	0xbfc9
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc208
+	.4byte	0xc21e
 	.uleb128 0x14
 	.4byte	0x13a
-	.4byte	0xc250
+	.4byte	0xc266
 	.uleb128 0x11
-	.4byte	0xc19d
+	.4byte	0xc1b3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc241
+	.4byte	0xc257
 	.uleb128 0x1d
-	.4byte	.LASF2512
+	.4byte	.LASF2514
 	.byte	0x18
 	.byte	0xa3
 	.2byte	0x225
-	.4byte	0xc28b
+	.4byte	0xc2a1
 	.uleb128 0x1b
-	.4byte	.LASF2513
+	.4byte	.LASF2515
 	.byte	0xa3
 	.2byte	0x226
-	.4byte	0xc2a0
+	.4byte	0xc2b6
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2514
+	.4byte	.LASF2516
 	.byte	0xa3
 	.2byte	0x227
-	.4byte	0xc2ba
+	.4byte	0xc2d0
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2515
+	.4byte	.LASF2517
 	.byte	0xa3
 	.2byte	0x228
-	.4byte	0xc2a0
+	.4byte	0xc2b6
 	.byte	0x10
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xc256
+	.4byte	0xc26c
 	.uleb128 0x10
-	.4byte	0xc2a0
+	.4byte	0xc2b6
 	.uleb128 0x11
-	.4byte	0xc19d
+	.4byte	0xc1b3
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc290
+	.4byte	0xc2a6
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xc2ba
+	.4byte	0xc2d0
 	.uleb128 0x11
-	.4byte	0xc19d
+	.4byte	0xc1b3
 	.uleb128 0x11
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc2a6
+	.4byte	0xc2bc
 	.uleb128 0x1d
-	.4byte	.LASF2516
+	.4byte	.LASF2518
 	.byte	0x50
 	.byte	0xa3
 	.2byte	0x254
-	.4byte	0xc350
+	.4byte	0xc366
 	.uleb128 0x1b
-	.4byte	.LASF2517
+	.4byte	.LASF2519
 	.byte	0xa3
 	.2byte	0x255
-	.4byte	0xc35f
+	.4byte	0xc375
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2518
+	.4byte	.LASF2520
 	.byte	0xa3
 	.2byte	0x257
-	.4byte	0xc35f
+	.4byte	0xc375
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2519
+	.4byte	.LASF2521
 	.byte	0xa3
 	.2byte	0x258
-	.4byte	0xc375
+	.4byte	0xc38b
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2520
+	.4byte	.LASF2522
 	.byte	0xa3
 	.2byte	0x259
-	.4byte	0xc35f
+	.4byte	0xc375
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF2521
+	.4byte	.LASF2523
 	.byte	0xa3
 	.2byte	0x25a
-	.4byte	0xc375
+	.4byte	0xc38b
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2522
+	.4byte	.LASF2524
 	.byte	0xa3
 	.2byte	0x25b
-	.4byte	0xc35f
+	.4byte	0xc375
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF2523
+	.4byte	.LASF2525
 	.byte	0xa3
 	.2byte	0x25d
-	.4byte	0xc386
+	.4byte	0xc39c
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF2524
+	.4byte	.LASF2526
 	.byte	0xa3
 	.2byte	0x25e
-	.4byte	0xc386
+	.4byte	0xc39c
 	.byte	0x38
 	.uleb128 0x1b
-	.4byte	.LASF2525
+	.4byte	.LASF2527
 	.byte	0xa3
 	.2byte	0x261
-	.4byte	0xc391
+	.4byte	0xc3a7
 	.byte	0x40
 	.uleb128 0x1b
-	.4byte	.LASF2526
+	.4byte	.LASF2528
 	.byte	0xa3
 	.2byte	0x262
-	.4byte	0xc391
+	.4byte	0xc3a7
 	.byte	0x48
 	.byte	0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xc35f
+	.4byte	0xc375
 	.uleb128 0x11
-	.4byte	0xc19d
+	.4byte	0xc1b3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc350
+	.4byte	0xc366
 	.uleb128 0x10
-	.4byte	0xc375
+	.4byte	0xc38b
 	.uleb128 0x11
-	.4byte	0xc19d
+	.4byte	0xc1b3
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc365
+	.4byte	0xc37b
 	.uleb128 0x10
-	.4byte	0xc386
+	.4byte	0xc39c
 	.uleb128 0x11
-	.4byte	0xc19d
+	.4byte	0xc1b3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc37b
+	.4byte	0xc391
 	.uleb128 0x24
-	.4byte	.LASF2527
+	.4byte	.LASF2529
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc38c
+	.4byte	0xc3a2
 	.uleb128 0x1d
-	.4byte	.LASF2528
+	.4byte	.LASF2530
 	.byte	0x18
 	.byte	0xa3
 	.2byte	0x27f
-	.4byte	0xc3f3
+	.4byte	0xc409
 	.uleb128 0x1b
 	.4byte	.LASF170
 	.byte	0xa3
@@ -33060,59 +33409,59 @@ __exitcall_ebc_exit:
 	.4byte	0x155
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2529
+	.4byte	.LASF2531
 	.byte	0xa3
 	.2byte	0x281
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2530
+	.4byte	.LASF2532
 	.byte	0xa3
 	.2byte	0x282
 	.4byte	0x11a
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF2531
+	.4byte	.LASF2533
 	.byte	0xa3
 	.2byte	0x283
 	.4byte	0x11a
 	.byte	0xe
 	.uleb128 0x1b
-	.4byte	.LASF2532
+	.4byte	.LASF2534
 	.byte	0xa3
 	.2byte	0x284
 	.4byte	0x11a
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2533
+	.4byte	.LASF2535
 	.byte	0xa3
 	.2byte	0x285
 	.4byte	0x11a
 	.byte	0x12
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xc397
+	.4byte	0xc3ad
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc1de
+	.4byte	0xc1f4
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc28b
+	.4byte	0xc2a1
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0xc414
+	.4byte	0xc42a
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x2f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc2c0
+	.4byte	0xc2d6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc3f3
+	.4byte	0xc409
 	.uleb128 0x19
-	.4byte	.LASF2534
+	.4byte	.LASF2536
 	.byte	0xa4
 	.byte	0x8
 	.4byte	0xc6
@@ -33120,43 +33469,43 @@ __exitcall_ebc_exit:
 	.byte	0x40
 	.byte	0xa5
 	.byte	0x1d
-	.4byte	0xc44c
+	.4byte	0xc462
 	.uleb128 0xe
-	.4byte	.LASF2535
+	.4byte	.LASF2537
 	.byte	0xa5
 	.byte	0x1e
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2536
+	.4byte	.LASF2538
 	.byte	0xa5
 	.byte	0x1f
-	.4byte	0xc44c
+	.4byte	0xc462
 	.byte	0x4
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x6d
-	.4byte	0xc45c
+	.4byte	0xc472
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x6
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF2537
+	.4byte	.LASF2539
 	.byte	0xa5
 	.byte	0x20
-	.4byte	0xc42b
+	.4byte	0xc441
 	.uleb128 0x19
-	.4byte	.LASF2538
+	.4byte	.LASF2540
 	.byte	0xa6
 	.byte	0x15
-	.4byte	0xc45c
+	.4byte	0xc472
 	.uleb128 0xd
-	.4byte	.LASF2539
+	.4byte	.LASF2541
 	.byte	0x8
 	.byte	0xa5
 	.byte	0x2c
-	.4byte	0xc48b
+	.4byte	0xc4a1
 	.uleb128 0x20
 	.string	"hcr"
 	.byte	0xa5
@@ -33165,17 +33514,17 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2540
+	.4byte	.LASF2542
 	.byte	0xa5
 	.byte	0x30
-	.4byte	0xc472
+	.4byte	0xc488
 	.uleb128 0x15
-	.4byte	.LASF2541
+	.4byte	.LASF2543
 	.byte	0xa7
 	.2byte	0x102
-	.4byte	0x15ff
+	.4byte	0x1615
 	.uleb128 0x15
-	.4byte	.LASF2542
+	.4byte	.LASF2544
 	.byte	0xa7
 	.2byte	0x1ae
 	.4byte	0x29b
@@ -33184,111 +33533,111 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0xa7
 	.2byte	0x1d0
-	.4byte	0xc4fe
+	.4byte	0xc514
 	.uleb128 0xc
-	.4byte	.LASF2543
+	.4byte	.LASF2545
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2544
+	.4byte	.LASF2546
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2545
+	.4byte	.LASF2547
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2546
+	.4byte	.LASF2548
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2547
+	.4byte	.LASF2549
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF2548
+	.4byte	.LASF2550
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF2549
+	.4byte	.LASF2551
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF2550
+	.4byte	.LASF2552
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF2551
+	.4byte	.LASF2553
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF2552
+	.4byte	.LASF2554
 	.byte	0x9
 	.uleb128 0xc
-	.4byte	.LASF2553
+	.4byte	.LASF2555
 	.byte	0xa
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x5c
-	.4byte	0xc50e
+	.4byte	0xc524
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x9
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xc4fe
+	.4byte	0xc514
 	.uleb128 0x15
-	.4byte	.LASF2554
+	.4byte	.LASF2556
 	.byte	0xa7
 	.2byte	0x1e5
-	.4byte	0xc50e
+	.4byte	0xc524
 	.uleb128 0x15
-	.4byte	.LASF2555
+	.4byte	.LASF2557
 	.byte	0xa7
 	.2byte	0x203
-	.4byte	0x2eda
+	.4byte	0x2ef0
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0xc53c
+	.4byte	0xc552
 	.uleb128 0x43
 	.4byte	0x4f
 	.2byte	0x1ff
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2556
+	.4byte	.LASF2558
 	.byte	0xa8
 	.byte	0x39
-	.4byte	0xc52b
+	.4byte	0xc541
 	.uleb128 0x5
-	.4byte	0x33e8
-	.4byte	0xc558
+	.4byte	0x33fe
+	.4byte	0xc56e
 	.uleb128 0x43
 	.4byte	0x4f
 	.2byte	0x1ff
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF2557
+	.4byte	.LASF2559
 	.byte	0xa8
 	.2byte	0x2bd
-	.4byte	0xc547
+	.4byte	0xc55d
 	.uleb128 0x5
-	.4byte	0x33e8
-	.4byte	0xc56f
+	.4byte	0x33fe
+	.4byte	0xc585
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF2558
+	.4byte	.LASF2560
 	.byte	0xa8
 	.2byte	0x2be
-	.4byte	0xc564
+	.4byte	0xc57a
 	.uleb128 0x15
-	.4byte	.LASF2559
+	.4byte	.LASF2561
 	.byte	0xa8
 	.2byte	0x2bf
-	.4byte	0xc547
+	.4byte	0xc55d
 	.uleb128 0x15
-	.4byte	.LASF2560
+	.4byte	.LASF2562
 	.byte	0xa8
 	.2byte	0x2c0
-	.4byte	0xc547
+	.4byte	0xc55d
 	.uleb128 0x19
-	.4byte	.LASF2561
+	.4byte	.LASF2563
 	.byte	0xa9
 	.byte	0x1e
 	.4byte	0x2ef
 	.uleb128 0x19
-	.4byte	.LASF2562
+	.4byte	.LASF2564
 	.byte	0x6d
 	.byte	0xb0
 	.4byte	0x392
@@ -33297,36 +33646,36 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0xaa
 	.byte	0x9d
-	.4byte	0xc5d4
+	.4byte	0xc5ea
 	.uleb128 0xc
-	.4byte	.LASF2563
+	.4byte	.LASF2565
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2564
+	.4byte	.LASF2566
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2565
+	.4byte	.LASF2567
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF2566
+	.4byte	.LASF2568
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF2567
+	.4byte	.LASF2569
 	.byte	0x10
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2568
+	.4byte	.LASF2570
 	.byte	0xab
-	.byte	0x42
-	.4byte	0x2eda
+	.byte	0x45
+	.4byte	0x2ef0
 	.uleb128 0xd
-	.4byte	.LASF2569
+	.4byte	.LASF2571
 	.byte	0x50
 	.byte	0xac
 	.byte	0x42
-	.4byte	0xc658
+	.4byte	0xc66e
 	.uleb128 0xe
-	.4byte	.LASF2570
+	.4byte	.LASF2572
 	.byte	0xac
 	.byte	0x43
 	.4byte	0xc6
@@ -33338,75 +33687,75 @@ __exitcall_ebc_exit:
 	.4byte	0x56
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2571
+	.4byte	.LASF2573
 	.byte	0xac
 	.byte	0x45
-	.4byte	0x7d9b
+	.4byte	0x7db1
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF959
+	.4byte	.LASF961
 	.byte	0xac
 	.byte	0x46
 	.4byte	0x392
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF637
+	.4byte	.LASF639
 	.byte	0xac
 	.byte	0x47
-	.4byte	0xa545
+	.4byte	0xa55b
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2572
+	.4byte	.LASF2574
 	.byte	0xac
 	.byte	0x48
-	.4byte	0xa545
+	.4byte	0xa55b
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2226
+	.4byte	.LASF2228
 	.byte	0xac
 	.byte	0x49
-	.4byte	0xaf00
+	.4byte	0xaf16
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2573
+	.4byte	.LASF2575
 	.byte	0xac
 	.byte	0x4a
 	.4byte	0x56
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF901
+	.4byte	.LASF903
 	.byte	0xac
 	.byte	0x4b
 	.4byte	0x27a
 	.byte	0x48
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF2574
+	.4byte	.LASF2576
 	.byte	0xad
 	.byte	0x3c
-	.4byte	0xc663
+	.4byte	0xc679
 	.uleb128 0x10
-	.4byte	0xc66e
+	.4byte	0xc684
 	.uleb128 0x11
-	.4byte	0xc66e
+	.4byte	0xc684
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc674
+	.4byte	0xc68a
 	.uleb128 0xd
-	.4byte	.LASF2575
+	.4byte	.LASF2577
 	.byte	0x38
 	.byte	0xad
 	.byte	0x58
-	.4byte	0xc6cc
+	.4byte	0xc6e2
 	.uleb128 0xe
-	.4byte	.LASF380
+	.4byte	.LASF382
 	.byte	0xad
 	.byte	0x59
 	.4byte	0x543
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2576
+	.4byte	.LASF2578
 	.byte	0xad
 	.byte	0x5e
 	.4byte	0x29
@@ -33415,16 +33764,16 @@ __exitcall_ebc_exit:
 	.4byte	.LASF112
 	.byte	0xad
 	.byte	0x5f
-	.4byte	0xc6cc
+	.4byte	0xc6e2
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2577
+	.4byte	.LASF2579
 	.byte	0xad
 	.byte	0x60
-	.4byte	0xc6cc
+	.4byte	0xc6e2
 	.byte	0x18
 	.uleb128 0x38
-	.4byte	.LASF2578
+	.4byte	.LASF2580
 	.byte	0xad
 	.byte	0x61
 	.4byte	0x29b
@@ -33441,44 +33790,44 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc658
+	.4byte	0xc66e
 	.uleb128 0xd
-	.4byte	.LASF2579
+	.4byte	.LASF2581
 	.byte	0x20
 	.byte	0xae
 	.byte	0xa
-	.4byte	0xc70f
+	.4byte	0xc725
 	.uleb128 0xe
-	.4byte	.LASF881
+	.4byte	.LASF883
 	.byte	0xae
 	.byte	0xb
 	.4byte	0x2ce
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0xae
 	.byte	0xc
 	.4byte	0x2ce
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2580
+	.4byte	.LASF2582
 	.byte	0xae
 	.byte	0xd
-	.4byte	0x9e07
+	.4byte	0x9e1d
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1740
+	.4byte	.LASF1742
 	.byte	0xae
 	.byte	0xe
 	.4byte	0x4a2
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2581
+	.4byte	.LASF2583
 	.byte	0x18
 	.byte	0xaf
 	.byte	0x18
-	.4byte	0xc740
+	.4byte	0xc756
 	.uleb128 0xe
 	.4byte	.LASF70
 	.byte	0xaf
@@ -33486,24 +33835,24 @@ __exitcall_ebc_exit:
 	.4byte	0x443
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF791
+	.4byte	.LASF793
 	.byte	0xaf
 	.byte	0x1a
 	.4byte	0x443
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF587
+	.4byte	.LASF589
 	.byte	0xaf
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2582
+	.4byte	.LASF2584
 	.byte	0x30
 	.byte	0xaf
 	.byte	0x1e
-	.4byte	0xc789
+	.4byte	0xc79f
 	.uleb128 0xe
 	.4byte	.LASF264
 	.byte	0xaf
@@ -33517,339 +33866,339 @@ __exitcall_ebc_exit:
 	.4byte	0xef2
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2583
+	.4byte	.LASF2585
 	.byte	0xaf
 	.byte	0x21
 	.4byte	0x48c
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2584
+	.4byte	.LASF2586
 	.byte	0xaf
 	.byte	0x22
 	.4byte	0x4a2
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2585
+	.4byte	.LASF2587
 	.byte	0xaf
 	.byte	0x23
-	.4byte	0xc789
+	.4byte	0xc79f
 	.byte	0x28
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc70f
+	.4byte	0xc725
 	.uleb128 0x8
-	.4byte	.LASF2586
+	.4byte	.LASF2588
 	.byte	0xaf
 	.byte	0x27
 	.4byte	0xcd
 	.uleb128 0x19
-	.4byte	.LASF2587
+	.4byte	.LASF2589
 	.byte	0xb0
 	.byte	0xa
-	.4byte	0xc740
+	.4byte	0xc756
 	.uleb128 0x19
-	.4byte	.LASF2588
+	.4byte	.LASF2590
 	.byte	0xb0
 	.byte	0xb
-	.4byte	0xc740
+	.4byte	0xc756
 	.uleb128 0x19
-	.4byte	.LASF2589
+	.4byte	.LASF2591
 	.byte	0xb0
 	.byte	0xc
-	.4byte	0xc740
+	.4byte	0xc756
 	.uleb128 0x19
-	.4byte	.LASF2590
+	.4byte	.LASF2592
 	.byte	0xb0
 	.byte	0xd
-	.4byte	0xc740
+	.4byte	0xc756
 	.uleb128 0x19
-	.4byte	.LASF2591
+	.4byte	.LASF2593
 	.byte	0xb0
 	.byte	0xe
-	.4byte	0xc740
+	.4byte	0xc756
 	.uleb128 0x19
-	.4byte	.LASF2592
+	.4byte	.LASF2594
 	.byte	0xb0
 	.byte	0xf
-	.4byte	0xc740
+	.4byte	0xc756
 	.uleb128 0x19
-	.4byte	.LASF2593
+	.4byte	.LASF2595
 	.byte	0xb0
 	.byte	0x10
-	.4byte	0xc740
+	.4byte	0xc756
 	.uleb128 0xd
-	.4byte	.LASF2594
+	.4byte	.LASF2596
 	.byte	0x28
 	.byte	0x75
 	.byte	0x14
-	.4byte	0xc830
+	.4byte	0xc846
 	.uleb128 0xe
-	.4byte	.LASF2595
+	.4byte	.LASF2597
 	.byte	0x75
 	.byte	0x15
 	.4byte	0x30
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2596
+	.4byte	.LASF2598
 	.byte	0x75
 	.byte	0x16
 	.4byte	0x30
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2397
+	.4byte	.LASF2399
 	.byte	0x75
 	.byte	0x17
 	.4byte	0x29
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2597
+	.4byte	.LASF2599
 	.byte	0x75
 	.byte	0x18
 	.4byte	0x29
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2396
+	.4byte	.LASF2398
 	.byte	0x75
 	.byte	0x19
 	.4byte	0x29
 	.byte	0x20
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF2598
+	.4byte	.LASF2600
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x75
 	.byte	0x39
-	.4byte	0xc853
+	.4byte	0xc869
 	.uleb128 0xc
-	.4byte	.LASF2599
+	.4byte	.LASF2601
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2600
+	.4byte	.LASF2602
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2601
+	.4byte	.LASF2603
 	.byte	0x3
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF2602
+	.4byte	.LASF2604
 	.byte	0x75
 	.byte	0x5f
-	.4byte	0xc85e
+	.4byte	0xc874
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc864
+	.4byte	0xc87a
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xc887
+	.4byte	0xc89d
 	.uleb128 0x11
-	.4byte	0x3c8a
+	.4byte	0x3ca0
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
-	.4byte	0xc887
+	.4byte	0xc89d
 	.uleb128 0x11
 	.4byte	0x6d
 	.uleb128 0x11
-	.4byte	0xc88d
+	.4byte	0xc8a3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3481
+	.4byte	0x3497
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x33c8
+	.4byte	0x33de
 	.uleb128 0x8
-	.4byte	.LASF2603
+	.4byte	.LASF2605
 	.byte	0x75
 	.byte	0x64
-	.4byte	0xc89e
+	.4byte	0xc8b4
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc8a4
+	.4byte	0xc8ba
 	.uleb128 0x10
-	.4byte	0xc8b4
+	.4byte	0xc8ca
 	.uleb128 0x11
-	.4byte	0x343e
+	.4byte	0x3454
 	.uleb128 0x11
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc663
+	.4byte	0xc679
 	.uleb128 0x19
-	.4byte	.LASF2604
+	.4byte	.LASF2606
 	.byte	0x76
 	.byte	0x2a
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF2605
+	.4byte	.LASF2607
 	.byte	0x76
 	.byte	0x34
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF2606
+	.4byte	.LASF2608
 	.byte	0x76
 	.byte	0x35
 	.4byte	0x443
 	.uleb128 0x19
-	.4byte	.LASF2607
+	.4byte	.LASF2609
 	.byte	0x76
 	.byte	0x36
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF2608
+	.4byte	.LASF2610
 	.byte	0x76
 	.byte	0x39
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF2609
+	.4byte	.LASF2611
 	.byte	0x76
 	.byte	0x3f
 	.4byte	0xcd
 	.uleb128 0x19
-	.4byte	.LASF2610
+	.4byte	.LASF2612
 	.byte	0x76
 	.byte	0x40
 	.4byte	0xcd
 	.uleb128 0x19
-	.4byte	.LASF2611
+	.4byte	.LASF2613
 	.byte	0x76
 	.byte	0x41
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF2612
+	.4byte	.LASF2614
 	.byte	0x76
 	.byte	0x44
 	.4byte	0xcd
 	.uleb128 0x19
-	.4byte	.LASF2613
+	.4byte	.LASF2615
 	.byte	0x76
 	.byte	0x45
 	.4byte	0xcd
 	.uleb128 0x19
-	.4byte	.LASF2614
+	.4byte	.LASF2616
 	.byte	0x76
 	.byte	0x46
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF2615
+	.4byte	.LASF2617
 	.byte	0x76
 	.byte	0x8b
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF2616
+	.4byte	.LASF2618
 	.byte	0x76
 	.byte	0x8d
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF2617
+	.4byte	.LASF2619
 	.byte	0x76
 	.byte	0x8e
 	.4byte	0x29
 	.uleb128 0x19
-	.4byte	.LASF2618
+	.4byte	.LASF2620
 	.byte	0x76
 	.byte	0x90
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF2619
+	.4byte	.LASF2621
 	.byte	0x76
 	.byte	0x91
 	.4byte	0xc6
 	.uleb128 0x19
-	.4byte	.LASF2620
+	.4byte	.LASF2622
 	.byte	0x76
 	.byte	0x92
 	.4byte	0x29
 	.uleb128 0x5
-	.4byte	0x3408
-	.4byte	0xc985
+	.4byte	0x341e
+	.4byte	0xc99b
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xf
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF2621
+	.4byte	.LASF2623
 	.byte	0x76
 	.2byte	0x142
-	.4byte	0xc975
+	.4byte	0xc98b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3428
+	.4byte	0x343e
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x33a8
+	.4byte	0x33be
 	.uleb128 0x1e
-	.4byte	.LASF2622
+	.4byte	.LASF2624
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x76
 	.2byte	0x18a
-	.4byte	0xc9c1
+	.4byte	0xc9d7
 	.uleb128 0xc
-	.4byte	.LASF2623
+	.4byte	.LASF2625
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2624
+	.4byte	.LASF2626
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2625
+	.4byte	.LASF2627
 	.byte	0x2
 	.byte	0
 	.uleb128 0x10
-	.4byte	0xc9cc
+	.4byte	0xc9e2
 	.uleb128 0x11
-	.4byte	0x3c8a
+	.4byte	0x3ca0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc9c1
+	.4byte	0xc9d7
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xc9e6
+	.4byte	0xc9fc
 	.uleb128 0x11
-	.4byte	0x3c8a
+	.4byte	0x3ca0
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc9d2
+	.4byte	0xc9e8
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xc9fb
+	.4byte	0xca11
 	.uleb128 0x11
-	.4byte	0x3c8a
+	.4byte	0x3ca0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc9ec
+	.4byte	0xca02
 	.uleb128 0x14
-	.4byte	0x5002
-	.4byte	0xca10
+	.4byte	0x5018
+	.4byte	0xca26
 	.uleb128 0x11
-	.4byte	0x5a32
+	.4byte	0x5a48
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xca01
+	.4byte	0xca17
 	.uleb128 0x14
-	.4byte	0x5002
-	.4byte	0xca2a
+	.4byte	0x5018
+	.4byte	0xca40
 	.uleb128 0x11
-	.4byte	0x5a32
+	.4byte	0x5a48
 	.uleb128 0x11
-	.4byte	0xc99d
+	.4byte	0xc9b3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xca16
+	.4byte	0xca2c
 	.uleb128 0x10
-	.4byte	0xca45
+	.4byte	0xca5b
 	.uleb128 0x11
-	.4byte	0x5a32
+	.4byte	0x5a48
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
@@ -33857,21 +34206,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xca30
+	.4byte	0xca46
 	.uleb128 0x14
 	.4byte	0x29
-	.4byte	0xca5a
+	.4byte	0xca70
 	.uleb128 0x11
-	.4byte	0x3c8a
+	.4byte	0x3ca0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xca4b
+	.4byte	0xca61
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xca83
+	.4byte	0xca99
 	.uleb128 0x11
-	.4byte	0x3c8a
+	.4byte	0x3ca0
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
@@ -33883,396 +34232,396 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xca60
+	.4byte	0xca76
 	.uleb128 0x14
 	.4byte	0x56
-	.4byte	0xca98
+	.4byte	0xcaae
 	.uleb128 0x11
-	.4byte	0x3c8a
+	.4byte	0x3ca0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xca89
+	.4byte	0xca9f
 	.uleb128 0x14
-	.4byte	0x343e
-	.4byte	0xcab2
+	.4byte	0x3454
+	.4byte	0xcac8
 	.uleb128 0x11
-	.4byte	0x3c8a
+	.4byte	0x3ca0
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xca9e
+	.4byte	0xcab4
 	.uleb128 0x19
-	.4byte	.LASF2626
+	.4byte	.LASF2628
 	.byte	0xb1
 	.byte	0x4c
-	.4byte	0xa2c0
+	.4byte	0xa2d6
 	.uleb128 0x13
-	.4byte	.LASF2627
+	.4byte	.LASF2629
 	.byte	0x76
 	.2byte	0x2ba
-	.4byte	0x78cd
+	.4byte	0x78e3
 	.uleb128 0x5
-	.4byte	0xcae5
-	.4byte	0xcada
+	.4byte	0xcafb
+	.4byte	0xcaf0
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xcacf
+	.4byte	0xcae5
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xcac3
+	.4byte	0xcad9
 	.uleb128 0x3
-	.4byte	0xcadf
+	.4byte	0xcaf5
 	.uleb128 0x15
-	.4byte	.LASF2628
+	.4byte	.LASF2630
 	.byte	0x76
 	.2byte	0x2c8
-	.4byte	0xcada
+	.4byte	0xcaf0
 	.uleb128 0x1f
-	.4byte	.LASF2629
+	.4byte	.LASF2631
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xb2
 	.byte	0x19
-	.4byte	0xcc63
+	.4byte	0xcc79
 	.uleb128 0xc
-	.4byte	.LASF2630
+	.4byte	.LASF2632
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2631
+	.4byte	.LASF2633
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2632
+	.4byte	.LASF2634
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2633
+	.4byte	.LASF2635
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2634
+	.4byte	.LASF2636
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF2635
+	.4byte	.LASF2637
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF2636
+	.4byte	.LASF2638
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF2637
+	.4byte	.LASF2639
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF2638
+	.4byte	.LASF2640
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF2639
+	.4byte	.LASF2641
 	.byte	0x9
 	.uleb128 0xc
-	.4byte	.LASF2640
+	.4byte	.LASF2642
 	.byte	0xa
 	.uleb128 0xc
-	.4byte	.LASF2641
+	.4byte	.LASF2643
 	.byte	0xb
 	.uleb128 0xc
-	.4byte	.LASF2642
+	.4byte	.LASF2644
 	.byte	0xc
 	.uleb128 0xc
-	.4byte	.LASF2643
+	.4byte	.LASF2645
 	.byte	0xd
 	.uleb128 0xc
-	.4byte	.LASF2644
+	.4byte	.LASF2646
 	.byte	0xe
 	.uleb128 0xc
-	.4byte	.LASF2645
+	.4byte	.LASF2647
 	.byte	0xf
 	.uleb128 0xc
-	.4byte	.LASF2646
+	.4byte	.LASF2648
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF2647
+	.4byte	.LASF2649
 	.byte	0x11
 	.uleb128 0xc
-	.4byte	.LASF2648
+	.4byte	.LASF2650
 	.byte	0x12
 	.uleb128 0xc
-	.4byte	.LASF2649
+	.4byte	.LASF2651
 	.byte	0x13
 	.uleb128 0xc
-	.4byte	.LASF2650
+	.4byte	.LASF2652
 	.byte	0x14
 	.uleb128 0xc
-	.4byte	.LASF2651
+	.4byte	.LASF2653
 	.byte	0x15
 	.uleb128 0xc
-	.4byte	.LASF2652
+	.4byte	.LASF2654
 	.byte	0x16
 	.uleb128 0xc
-	.4byte	.LASF2653
+	.4byte	.LASF2655
 	.byte	0x17
 	.uleb128 0xc
-	.4byte	.LASF2654
+	.4byte	.LASF2656
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF2655
+	.4byte	.LASF2657
 	.byte	0x19
 	.uleb128 0xc
-	.4byte	.LASF2656
+	.4byte	.LASF2658
 	.byte	0x1a
 	.uleb128 0xc
-	.4byte	.LASF2657
+	.4byte	.LASF2659
 	.byte	0x1b
 	.uleb128 0xc
-	.4byte	.LASF2658
+	.4byte	.LASF2660
 	.byte	0x1c
 	.uleb128 0xc
-	.4byte	.LASF2659
+	.4byte	.LASF2661
 	.byte	0x1d
 	.uleb128 0xc
-	.4byte	.LASF2660
+	.4byte	.LASF2662
 	.byte	0x1e
 	.uleb128 0xc
-	.4byte	.LASF2661
+	.4byte	.LASF2663
 	.byte	0x1f
 	.uleb128 0xc
-	.4byte	.LASF2662
+	.4byte	.LASF2664
 	.byte	0x20
 	.uleb128 0xc
-	.4byte	.LASF2663
+	.4byte	.LASF2665
 	.byte	0x21
 	.uleb128 0xc
-	.4byte	.LASF2664
+	.4byte	.LASF2666
 	.byte	0x22
 	.uleb128 0xc
-	.4byte	.LASF2665
+	.4byte	.LASF2667
 	.byte	0x23
 	.uleb128 0xc
-	.4byte	.LASF2666
+	.4byte	.LASF2668
 	.byte	0x24
 	.uleb128 0xc
-	.4byte	.LASF2667
+	.4byte	.LASF2669
 	.byte	0x25
 	.uleb128 0xc
-	.4byte	.LASF2668
+	.4byte	.LASF2670
 	.byte	0x26
 	.uleb128 0xc
-	.4byte	.LASF2669
+	.4byte	.LASF2671
 	.byte	0x27
 	.uleb128 0xc
-	.4byte	.LASF2670
+	.4byte	.LASF2672
 	.byte	0x28
 	.uleb128 0xc
-	.4byte	.LASF2671
+	.4byte	.LASF2673
 	.byte	0x29
 	.uleb128 0xc
-	.4byte	.LASF2672
+	.4byte	.LASF2674
 	.byte	0x2a
 	.uleb128 0xc
-	.4byte	.LASF2673
+	.4byte	.LASF2675
 	.byte	0x2b
 	.uleb128 0xc
-	.4byte	.LASF2674
+	.4byte	.LASF2676
 	.byte	0x2c
 	.uleb128 0xc
-	.4byte	.LASF2675
+	.4byte	.LASF2677
 	.byte	0x2d
 	.uleb128 0xc
-	.4byte	.LASF2676
+	.4byte	.LASF2678
 	.byte	0x2e
 	.uleb128 0xc
-	.4byte	.LASF2677
+	.4byte	.LASF2679
 	.byte	0x2f
 	.uleb128 0xc
-	.4byte	.LASF2678
+	.4byte	.LASF2680
 	.byte	0x30
 	.uleb128 0xc
-	.4byte	.LASF2679
+	.4byte	.LASF2681
 	.byte	0x31
 	.uleb128 0xc
-	.4byte	.LASF2680
+	.4byte	.LASF2682
 	.byte	0x32
 	.uleb128 0xc
-	.4byte	.LASF2681
+	.4byte	.LASF2683
 	.byte	0x33
 	.uleb128 0xc
-	.4byte	.LASF2682
+	.4byte	.LASF2684
 	.byte	0x34
 	.uleb128 0xc
-	.4byte	.LASF2683
+	.4byte	.LASF2685
 	.byte	0x35
 	.uleb128 0xc
-	.4byte	.LASF2684
+	.4byte	.LASF2686
 	.byte	0x36
 	.uleb128 0xc
-	.4byte	.LASF2685
+	.4byte	.LASF2687
 	.byte	0x37
 	.uleb128 0xc
-	.4byte	.LASF2686
+	.4byte	.LASF2688
 	.byte	0x38
 	.uleb128 0xc
-	.4byte	.LASF2687
+	.4byte	.LASF2689
 	.byte	0x39
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2688
+	.4byte	.LASF2690
 	.byte	0xb3
 	.byte	0xc
 	.4byte	0xc6
 	.uleb128 0x26
-	.4byte	.LASF2689
+	.4byte	.LASF2691
 	.2byte	0x1c8
 	.byte	0xb3
 	.byte	0x2d
-	.4byte	0xcc88
+	.4byte	0xcc9e
 	.uleb128 0xe
-	.4byte	.LASF2035
+	.4byte	.LASF2037
 	.byte	0xb3
 	.byte	0x2e
-	.4byte	0xcc88
+	.4byte	0xcc9e
 	.byte	0
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x29
-	.4byte	0xcc98
+	.4byte	0xccae
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x38
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2690
+	.4byte	.LASF2692
 	.byte	0xb3
 	.byte	0x31
-	.4byte	0xcc6e
+	.4byte	0xcc84
 	.uleb128 0x19
-	.4byte	.LASF2691
+	.4byte	.LASF2693
 	.byte	0xb3
 	.byte	0x83
-	.4byte	0x66b9
+	.4byte	0x66cf
 	.uleb128 0x5
 	.4byte	0x543
-	.4byte	0xccbd
+	.4byte	0xccd3
 	.uleb128 0x44
 	.4byte	0x4f
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1567
+	.4byte	.LASF1569
 	.byte	0xb3
 	.byte	0x84
-	.4byte	0xccae
+	.4byte	0xccc4
 	.uleb128 0x19
-	.4byte	.LASF2692
+	.4byte	.LASF2694
 	.byte	0xb3
 	.byte	0x85
-	.4byte	0x6763
+	.4byte	0x6779
 	.uleb128 0x5
 	.4byte	0x5c
-	.4byte	0xccde
+	.4byte	0xccf4
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xccd3
+	.4byte	0xcce9
 	.uleb128 0x15
-	.4byte	.LASF2693
+	.4byte	.LASF2695
 	.byte	0xb3
 	.2byte	0x183
-	.4byte	0xccde
+	.4byte	0xccf4
 	.uleb128 0x15
-	.4byte	.LASF2694
+	.4byte	.LASF2696
 	.byte	0x76
 	.2byte	0x8d3
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF2695
+	.4byte	.LASF2697
 	.byte	0x76
 	.2byte	0x8d4
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF2696
+	.4byte	.LASF2698
 	.byte	0x76
 	.2byte	0x8d7
 	.4byte	0x543
 	.uleb128 0x15
-	.4byte	.LASF2697
+	.4byte	.LASF2699
 	.byte	0x76
 	.2byte	0x9a7
 	.4byte	0x29
 	.uleb128 0x15
-	.4byte	.LASF2698
+	.4byte	.LASF2700
 	.byte	0x76
 	.2byte	0xa85
 	.4byte	0xf3d
 	.uleb128 0x15
-	.4byte	.LASF2699
+	.4byte	.LASF2701
 	.byte	0x76
 	.2byte	0xa92
 	.4byte	0xf3d
 	.uleb128 0x15
-	.4byte	.LASF2700
+	.4byte	.LASF2702
 	.byte	0x76
 	.2byte	0xacd
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF2701
+	.4byte	.LASF2703
 	.byte	0x76
 	.2byte	0xad8
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF2702
+	.4byte	.LASF2704
 	.byte	0x76
 	.2byte	0xb02
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF2703
+	.4byte	.LASF2705
 	.byte	0x76
 	.2byte	0xb03
 	.4byte	0xc6
 	.uleb128 0x15
-	.4byte	.LASF2704
+	.4byte	.LASF2706
 	.byte	0x76
 	.2byte	0xb05
 	.4byte	0x543
 	.uleb128 0x15
-	.4byte	.LASF2705
+	.4byte	.LASF2707
 	.byte	0x76
 	.2byte	0xb3a
-	.4byte	0xc6d2
+	.4byte	0xc6e8
 	.uleb128 0x19
-	.4byte	.LASF2706
+	.4byte	.LASF2708
 	.byte	0xb4
 	.byte	0x38
-	.4byte	0x9352
+	.4byte	0x9368
 	.uleb128 0x19
-	.4byte	.LASF2707
+	.4byte	.LASF2709
 	.byte	0xb5
 	.byte	0x21
 	.4byte	0x4eb
 	.uleb128 0x8
-	.4byte	.LASF2708
+	.4byte	.LASF2710
 	.byte	0xb6
 	.byte	0x10
 	.4byte	0xef
 	.uleb128 0x8
-	.4byte	.LASF2709
+	.4byte	.LASF2711
 	.byte	0xb6
 	.byte	0x11
 	.4byte	0xa9
 	.uleb128 0x8
-	.4byte	.LASF2710
+	.4byte	.LASF2712
 	.byte	0xb6
 	.byte	0x13
 	.4byte	0xef
 	.uleb128 0x8
-	.4byte	.LASF2711
+	.4byte	.LASF2713
 	.byte	0xb6
 	.byte	0x15
 	.4byte	0xd2
 	.uleb128 0x8
-	.4byte	.LASF2712
+	.4byte	.LASF2714
 	.byte	0xb6
 	.byte	0x16
 	.4byte	0xef
 	.uleb128 0x8
-	.4byte	.LASF2713
+	.4byte	.LASF2715
 	.byte	0xb6
 	.byte	0x17
 	.4byte	0xdd
@@ -34280,172 +34629,172 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0xb6
 	.byte	0x94
-	.4byte	0xcdf6
+	.4byte	0xce0c
 	.uleb128 0x22
-	.4byte	.LASF2714
+	.4byte	.LASF2716
 	.byte	0xb6
 	.byte	0x95
-	.4byte	0xcdc1
+	.4byte	0xcdd7
 	.uleb128 0x22
-	.4byte	.LASF2715
+	.4byte	.LASF2717
 	.byte	0xb6
 	.byte	0x96
-	.4byte	0xcd95
+	.4byte	0xcdab
 	.byte	0
 	.uleb128 0xf
 	.byte	0x10
 	.byte	0xb6
 	.byte	0x92
-	.4byte	0xce17
+	.4byte	0xce2d
 	.uleb128 0xe
-	.4byte	.LASF2716
+	.4byte	.LASF2718
 	.byte	0xb6
 	.byte	0x93
-	.4byte	0xcdcc
+	.4byte	0xcde2
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2717
+	.4byte	.LASF2719
 	.byte	0xb6
 	.byte	0x97
-	.4byte	0xcdd7
+	.4byte	0xcded
 	.byte	0x8
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF2718
+	.4byte	.LASF2720
 	.byte	0xb6
 	.byte	0x98
-	.4byte	0xcdf6
+	.4byte	0xce0c
 	.uleb128 0xd
-	.4byte	.LASF2719
+	.4byte	.LASF2721
 	.byte	0x18
 	.byte	0xb6
 	.byte	0xc0
-	.4byte	0xce77
+	.4byte	0xce8d
 	.uleb128 0xe
-	.4byte	.LASF2720
+	.4byte	.LASF2722
 	.byte	0xb6
 	.byte	0xc1
-	.4byte	0xcdb6
+	.4byte	0xcdcc
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2721
+	.4byte	.LASF2723
 	.byte	0xb6
 	.byte	0xc2
 	.4byte	0x96
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF2722
+	.4byte	.LASF2724
 	.byte	0xb6
 	.byte	0xc3
 	.4byte	0x96
 	.byte	0x5
 	.uleb128 0xe
-	.4byte	.LASF2723
+	.4byte	.LASF2725
 	.byte	0xb6
 	.byte	0xc4
-	.4byte	0xcda0
+	.4byte	0xcdb6
 	.byte	0x6
 	.uleb128 0xe
-	.4byte	.LASF2724
+	.4byte	.LASF2726
 	.byte	0xb6
 	.byte	0xc5
-	.4byte	0xcd95
+	.4byte	0xcdab
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2725
+	.4byte	.LASF2727
 	.byte	0xb6
 	.byte	0xc6
-	.4byte	0xcdc1
+	.4byte	0xcdd7
 	.byte	0x10
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF2726
+	.4byte	.LASF2728
 	.byte	0xb6
 	.byte	0xc7
-	.4byte	0xce22
+	.4byte	0xce38
 	.uleb128 0x1d
-	.4byte	.LASF2727
+	.4byte	.LASF2729
 	.byte	0x40
 	.byte	0xb6
 	.2byte	0x13c
-	.4byte	0xcf12
+	.4byte	0xcf28
 	.uleb128 0x1b
-	.4byte	.LASF2728
+	.4byte	.LASF2730
 	.byte	0xb6
 	.2byte	0x13d
-	.4byte	0xcdb6
+	.4byte	0xcdcc
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2729
+	.4byte	.LASF2731
 	.byte	0xb6
 	.2byte	0x13e
-	.4byte	0xcdb6
+	.4byte	0xcdcc
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF2730
+	.4byte	.LASF2732
 	.byte	0xb6
 	.2byte	0x13f
-	.4byte	0xcdc1
+	.4byte	0xcdd7
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2731
+	.4byte	.LASF2733
 	.byte	0xb6
 	.2byte	0x140
-	.4byte	0xcd95
+	.4byte	0xcdab
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2732
+	.4byte	.LASF2734
 	.byte	0xb6
 	.2byte	0x141
-	.4byte	0xcdab
+	.4byte	0xcdc1
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF2733
+	.4byte	.LASF2735
 	.byte	0xb6
 	.2byte	0x142
-	.4byte	0xcdc1
+	.4byte	0xcdd7
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF2734
+	.4byte	.LASF2736
 	.byte	0xb6
 	.2byte	0x143
-	.4byte	0xcdb6
+	.4byte	0xcdcc
 	.byte	0x28
 	.uleb128 0x1b
-	.4byte	.LASF2735
+	.4byte	.LASF2737
 	.byte	0xb6
 	.2byte	0x144
-	.4byte	0xcdb6
+	.4byte	0xcdcc
 	.byte	0x2c
 	.uleb128 0x1b
-	.4byte	.LASF2736
+	.4byte	.LASF2738
 	.byte	0xb6
 	.2byte	0x145
-	.4byte	0xcdc1
+	.4byte	0xcdd7
 	.byte	0x30
 	.uleb128 0x1b
-	.4byte	.LASF2737
+	.4byte	.LASF2739
 	.byte	0xb6
 	.2byte	0x146
-	.4byte	0xcdc1
+	.4byte	0xcdd7
 	.byte	0x38
 	.byte	0
 	.uleb128 0x5
-	.4byte	0xce17
-	.4byte	0xcf1d
+	.4byte	0xce2d
+	.4byte	0xcf33
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF2738
+	.4byte	.LASF2740
 	.byte	0xb7
 	.byte	0x25
-	.4byte	0xcf12
+	.4byte	0xcf28
 	.uleb128 0xd
-	.4byte	.LASF2739
+	.4byte	.LASF2741
 	.byte	0x20
 	.byte	0xb8
 	.byte	0x31
-	.4byte	0xcf65
+	.4byte	0xcf7b
 	.uleb128 0xe
 	.4byte	.LASF170
 	.byte	0xb8
@@ -34456,40 +34805,40 @@ __exitcall_ebc_exit:
 	.string	"set"
 	.byte	0xb8
 	.byte	0x35
-	.4byte	0xcfe4
+	.4byte	0xcffa
 	.byte	0x8
 	.uleb128 0x20
 	.string	"get"
 	.byte	0xb8
 	.byte	0x37
-	.4byte	0xcffe
+	.4byte	0xd014
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2397
+	.4byte	.LASF2399
 	.byte	0xb8
 	.byte	0x39
-	.4byte	0x2f0a
+	.4byte	0x2f20
 	.byte	0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xcf28
+	.4byte	0xcf3e
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xcf7e
+	.4byte	0xcf94
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
-	.4byte	0xcf7e
+	.4byte	0xcf94
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xcfdf
+	.4byte	0xcff5
 	.uleb128 0xd
-	.4byte	.LASF2740
+	.4byte	.LASF2742
 	.byte	0x28
 	.byte	0xb8
 	.byte	0x47
-	.4byte	0xcfdf
+	.4byte	0xcff5
 	.uleb128 0xe
 	.4byte	.LASF264
 	.byte	0xb8
@@ -34500,22 +34849,22 @@ __exitcall_ebc_exit:
 	.string	"mod"
 	.byte	0xb8
 	.byte	0x49
-	.4byte	0x7550
+	.4byte	0x7566
 	.byte	0x8
 	.uleb128 0x20
 	.string	"ops"
 	.byte	0xb8
 	.byte	0x4a
-	.4byte	0xd0b2
+	.4byte	0xd0c8
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1985
+	.4byte	.LASF1987
 	.byte	0xb8
 	.byte	0x4b
 	.4byte	0x125
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF554
+	.4byte	.LASF556
 	.byte	0xb8
 	.byte	0x4c
 	.4byte	0x101
@@ -34527,30 +34876,30 @@ __exitcall_ebc_exit:
 	.4byte	0x10b
 	.byte	0x1b
 	.uleb128 0x23
-	.4byte	0xd004
+	.4byte	0xd01a
 	.byte	0x20
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xcf84
+	.4byte	0xcf9a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xcf6a
+	.4byte	0xcf80
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xcffe
+	.4byte	0xd014
 	.uleb128 0x11
 	.4byte	0x219
 	.uleb128 0x11
-	.4byte	0xcf7e
+	.4byte	0xcf94
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xcfea
+	.4byte	0xd000
 	.uleb128 0x21
 	.byte	0x8
 	.byte	0xb8
 	.byte	0x4e
-	.4byte	0xd02e
+	.4byte	0xd044
 	.uleb128 0x28
 	.string	"arg"
 	.byte	0xb8
@@ -34560,43 +34909,43 @@ __exitcall_ebc_exit:
 	.string	"str"
 	.byte	0xb8
 	.byte	0x50
-	.4byte	0xd058
+	.4byte	0xd06e
 	.uleb128 0x28
 	.string	"arr"
 	.byte	0xb8
 	.byte	0x51
-	.4byte	0xd0ac
+	.4byte	0xd0c2
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2741
+	.4byte	.LASF2743
 	.byte	0x10
 	.byte	0xb8
 	.byte	0x58
-	.4byte	0xd053
+	.4byte	0xd069
 	.uleb128 0xe
-	.4byte	.LASF2030
+	.4byte	.LASF2032
 	.byte	0xb8
 	.byte	0x59
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2742
+	.4byte	.LASF2744
 	.byte	0xb8
 	.byte	0x5a
 	.4byte	0x219
 	.byte	0x8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xd02e
+	.4byte	0xd044
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd053
+	.4byte	0xd069
 	.uleb128 0xd
-	.4byte	.LASF2743
+	.4byte	.LASF2745
 	.byte	0x20
 	.byte	0xb8
 	.byte	0x5e
-	.4byte	0xd0a7
+	.4byte	0xd0bd
 	.uleb128 0x20
 	.string	"max"
 	.byte	0xb8
@@ -34604,7 +34953,7 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2744
+	.4byte	.LASF2746
 	.byte	0xb8
 	.byte	0x61
 	.4byte	0x6d
@@ -34613,161 +34962,161 @@ __exitcall_ebc_exit:
 	.string	"num"
 	.byte	0xb8
 	.byte	0x62
-	.4byte	0x3548
+	.4byte	0x355e
 	.byte	0x8
 	.uleb128 0x20
 	.string	"ops"
 	.byte	0xb8
 	.byte	0x63
-	.4byte	0xd0b2
+	.4byte	0xd0c8
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2745
+	.4byte	.LASF2747
 	.byte	0xb8
 	.byte	0x64
 	.4byte	0x443
 	.byte	0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xd05e
+	.4byte	0xd074
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd0a7
+	.4byte	0xd0bd
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xcf65
+	.4byte	0xcf7b
 	.uleb128 0x5
-	.4byte	0xcfdf
-	.4byte	0xd0c3
+	.4byte	0xcff5
+	.4byte	0xd0d9
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xd0b8
+	.4byte	0xd0ce
 	.uleb128 0x19
-	.4byte	.LASF2746
+	.4byte	.LASF2748
 	.byte	0xb8
 	.byte	0x55
-	.4byte	0xd0c3
+	.4byte	0xd0d9
 	.uleb128 0x19
-	.4byte	.LASF2747
+	.4byte	.LASF2749
 	.byte	0xb8
 	.byte	0x55
-	.4byte	0xd0c3
+	.4byte	0xd0d9
 	.uleb128 0x15
-	.4byte	.LASF2748
+	.4byte	.LASF2750
 	.byte	0xb8
 	.2byte	0x155
-	.4byte	0xcf65
+	.4byte	0xcf7b
 	.uleb128 0x15
-	.4byte	.LASF2749
+	.4byte	.LASF2751
 	.byte	0xb8
 	.2byte	0x15a
-	.4byte	0xcf65
+	.4byte	0xcf7b
 	.uleb128 0x15
-	.4byte	.LASF2750
+	.4byte	.LASF2752
 	.byte	0xb8
 	.2byte	0x15f
-	.4byte	0xcf65
+	.4byte	0xcf7b
 	.uleb128 0x15
-	.4byte	.LASF2751
+	.4byte	.LASF2753
 	.byte	0xb8
 	.2byte	0x164
-	.4byte	0xcf65
+	.4byte	0xcf7b
 	.uleb128 0x15
-	.4byte	.LASF2752
+	.4byte	.LASF2754
 	.byte	0xb8
 	.2byte	0x169
-	.4byte	0xcf65
+	.4byte	0xcf7b
 	.uleb128 0x15
-	.4byte	.LASF2753
+	.4byte	.LASF2755
 	.byte	0xb8
 	.2byte	0x16e
-	.4byte	0xcf65
+	.4byte	0xcf7b
 	.uleb128 0x15
-	.4byte	.LASF2754
+	.4byte	.LASF2756
 	.byte	0xb8
 	.2byte	0x173
-	.4byte	0xcf65
+	.4byte	0xcf7b
 	.uleb128 0x15
-	.4byte	.LASF2755
+	.4byte	.LASF2757
 	.byte	0xb8
 	.2byte	0x178
-	.4byte	0xcf65
+	.4byte	0xcf7b
 	.uleb128 0x15
-	.4byte	.LASF2756
+	.4byte	.LASF2758
 	.byte	0xb8
 	.2byte	0x17d
-	.4byte	0xcf65
+	.4byte	0xcf7b
 	.uleb128 0x15
-	.4byte	.LASF2757
+	.4byte	.LASF2759
 	.byte	0xb8
 	.2byte	0x184
-	.4byte	0xcf65
+	.4byte	0xcf7b
 	.uleb128 0x15
-	.4byte	.LASF2758
+	.4byte	.LASF2760
 	.byte	0xb8
 	.2byte	0x189
-	.4byte	0xcf65
+	.4byte	0xcf7b
 	.uleb128 0x15
-	.4byte	.LASF2759
+	.4byte	.LASF2761
 	.byte	0xb8
 	.2byte	0x18f
-	.4byte	0xcf65
+	.4byte	0xcf7b
 	.uleb128 0x15
-	.4byte	.LASF2760
+	.4byte	.LASF2762
 	.byte	0xb8
 	.2byte	0x195
-	.4byte	0xcf65
+	.4byte	0xcf7b
 	.uleb128 0x15
-	.4byte	.LASF2761
+	.4byte	.LASF2763
 	.byte	0xb8
 	.2byte	0x1fe
-	.4byte	0xcf65
+	.4byte	0xcf7b
 	.uleb128 0x15
-	.4byte	.LASF2762
+	.4byte	.LASF2764
 	.byte	0xb8
 	.2byte	0x200
-	.4byte	0xcf65
+	.4byte	0xcf7b
 	.uleb128 0xd
-	.4byte	.LASF2763
+	.4byte	.LASF2765
 	.byte	0x30
 	.byte	0xb9
 	.byte	0x28
-	.4byte	0xd1ab
+	.4byte	0xd1c1
 	.uleb128 0xe
-	.4byte	.LASF865
+	.4byte	.LASF867
 	.byte	0xb9
 	.byte	0x29
-	.4byte	0xd1ab
+	.4byte	0xd1c1
 	.byte	0
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x34b7
-	.4byte	0xd1bb
+	.4byte	0x34cd
+	.4byte	0xd1d1
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2764
+	.4byte	.LASF2766
 	.byte	0x10
 	.byte	0xba
 	.byte	0x18
-	.4byte	0xd1ec
+	.4byte	0xd202
 	.uleb128 0x20
 	.string	"plt"
 	.byte	0xba
 	.byte	0x19
-	.4byte	0xd1ec
+	.4byte	0xd202
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2765
+	.4byte	.LASF2767
 	.byte	0xba
 	.byte	0x1a
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2766
+	.4byte	.LASF2768
 	.byte	0xba
 	.byte	0x1b
 	.4byte	0xc6
@@ -34775,52 +35124,52 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xce82
+	.4byte	0xce98
 	.uleb128 0xd
-	.4byte	.LASF2767
+	.4byte	.LASF2769
 	.byte	0x28
 	.byte	0xba
 	.byte	0x1e
-	.4byte	0xd223
+	.4byte	0xd239
 	.uleb128 0xe
-	.4byte	.LASF2768
+	.4byte	.LASF2770
 	.byte	0xba
 	.byte	0x1f
-	.4byte	0xd1bb
+	.4byte	0xd1d1
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1740
+	.4byte	.LASF1742
 	.byte	0xba
 	.byte	0x20
-	.4byte	0xd1bb
+	.4byte	0xd1d1
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2769
+	.4byte	.LASF2771
 	.byte	0xba
 	.byte	0x23
-	.4byte	0xd25f
+	.4byte	0xd275
 	.byte	0x20
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2770
+	.4byte	.LASF2772
 	.byte	0x10
 	.byte	0xba
 	.byte	0x32
-	.4byte	0xd25f
+	.4byte	0xd275
 	.uleb128 0xe
-	.4byte	.LASF2771
+	.4byte	.LASF2773
 	.byte	0xba
 	.byte	0x3b
 	.4byte	0x224
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2772
+	.4byte	.LASF2774
 	.byte	0xba
 	.byte	0x3c
 	.4byte	0x224
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF2773
+	.4byte	.LASF2775
 	.byte	0xba
 	.byte	0x3d
 	.4byte	0x224
@@ -34834,130 +35183,130 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd223
+	.4byte	0xd239
 	.uleb128 0x19
-	.4byte	.LASF2774
+	.4byte	.LASF2776
 	.byte	0xba
 	.byte	0x2d
 	.4byte	0x155
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0xd280
+	.4byte	0xd296
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x37
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2775
+	.4byte	.LASF2777
 	.byte	0x80
 	.byte	0x8b
 	.byte	0x2e
-	.4byte	0xd2c8
+	.4byte	0xd2de
 	.uleb128 0xe
-	.4byte	.LASF2143
+	.4byte	.LASF2145
 	.byte	0x8b
 	.byte	0x2f
-	.4byte	0x90dc
+	.4byte	0x90f2
 	.byte	0
 	.uleb128 0x20
 	.string	"mod"
 	.byte	0x8b
 	.byte	0x30
-	.4byte	0x7550
+	.4byte	0x7566
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2776
+	.4byte	.LASF2778
 	.byte	0x8b
 	.byte	0x31
-	.4byte	0x91c3
+	.4byte	0x91d9
 	.byte	0x68
 	.uleb128 0x20
 	.string	"mp"
 	.byte	0x8b
 	.byte	0x32
-	.4byte	0xd2cd
+	.4byte	0xd2e3
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF2777
+	.4byte	.LASF2779
 	.byte	0x8b
 	.byte	0x33
-	.4byte	0x464d
+	.4byte	0x4663
 	.byte	0x78
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF2778
+	.4byte	.LASF2780
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd2c8
+	.4byte	0xd2de
 	.uleb128 0xd
-	.4byte	.LASF2779
+	.4byte	.LASF2781
 	.byte	0x38
 	.byte	0x8b
 	.byte	0x36
-	.4byte	0xd328
+	.4byte	0xd33e
 	.uleb128 0xe
-	.4byte	.LASF2112
+	.4byte	.LASF2114
 	.byte	0x8b
 	.byte	0x37
-	.4byte	0x9e38
+	.4byte	0x9e4e
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2075
+	.4byte	.LASF2077
 	.byte	0x8b
 	.byte	0x38
-	.4byte	0xd34d
+	.4byte	0xd363
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2139
+	.4byte	.LASF2141
 	.byte	0x8b
 	.byte	0x3a
-	.4byte	0xd371
+	.4byte	0xd387
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2780
+	.4byte	.LASF2782
 	.byte	0x8b
 	.byte	0x3c
-	.4byte	0xd387
+	.4byte	0xd39d
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2781
+	.4byte	.LASF2783
 	.byte	0x8b
 	.byte	0x3d
-	.4byte	0xd39c
+	.4byte	0xd3b2
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2397
+	.4byte	.LASF2399
 	.byte	0x8b
 	.byte	0x3e
-	.4byte	0xd3ad
+	.4byte	0xd3c3
 	.byte	0x30
 	.byte	0
 	.uleb128 0x14
 	.4byte	0x2d9
-	.4byte	0xd341
+	.4byte	0xd357
 	.uleb128 0x11
-	.4byte	0xd341
+	.4byte	0xd357
 	.uleb128 0x11
-	.4byte	0xd347
+	.4byte	0xd35d
 	.uleb128 0x11
 	.4byte	0x219
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd2d3
+	.4byte	0xd2e9
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd280
+	.4byte	0xd296
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd328
+	.4byte	0xd33e
 	.uleb128 0x14
 	.4byte	0x2d9
-	.4byte	0xd371
+	.4byte	0xd387
 	.uleb128 0x11
-	.4byte	0xd341
+	.4byte	0xd357
 	.uleb128 0x11
-	.4byte	0xd347
+	.4byte	0xd35d
 	.uleb128 0x11
 	.4byte	0x56
 	.uleb128 0x11
@@ -34965,115 +35314,115 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd353
+	.4byte	0xd369
 	.uleb128 0x10
-	.4byte	0xd387
+	.4byte	0xd39d
 	.uleb128 0x11
-	.4byte	0x7550
+	.4byte	0x7566
 	.uleb128 0x11
 	.4byte	0x56
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd377
+	.4byte	0xd38d
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xd39c
+	.4byte	0xd3b2
 	.uleb128 0x11
-	.4byte	0x7550
+	.4byte	0x7566
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd38d
+	.4byte	0xd3a3
 	.uleb128 0x10
-	.4byte	0xd3ad
+	.4byte	0xd3c3
 	.uleb128 0x11
-	.4byte	0x7550
+	.4byte	0x7566
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd3a2
+	.4byte	0xd3b8
 	.uleb128 0x19
-	.4byte	.LASF2782
+	.4byte	.LASF2784
 	.byte	0x8b
 	.byte	0x4a
-	.4byte	0xd2d3
+	.4byte	0xd2e9
 	.uleb128 0x15
-	.4byte	.LASF2783
+	.4byte	.LASF2785
 	.byte	0x8b
 	.2byte	0x10c
 	.4byte	0xc6
 	.uleb128 0x1e
-	.4byte	.LASF2784
+	.4byte	.LASF2786
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x8b
 	.2byte	0x119
-	.4byte	0xd3f4
+	.4byte	0xd40a
 	.uleb128 0xc
-	.4byte	.LASF2785
+	.4byte	.LASF2787
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2786
+	.4byte	.LASF2788
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2787
+	.4byte	.LASF2789
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2788
+	.4byte	.LASF2790
 	.byte	0x3
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF2789
+	.4byte	.LASF2791
 	.byte	0x38
 	.byte	0x8b
 	.2byte	0x120
-	.4byte	0xd41c
+	.4byte	0xd432
 	.uleb128 0x2b
 	.string	"mod"
 	.byte	0x8b
 	.2byte	0x121
-	.4byte	0x7550
+	.4byte	0x7566
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF865
+	.4byte	.LASF867
 	.byte	0x8b
 	.2byte	0x122
-	.4byte	0xd192
+	.4byte	0xd1a8
 	.byte	0x8
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF2790
+	.4byte	.LASF2792
 	.byte	0x50
 	.byte	0x8b
 	.2byte	0x125
-	.4byte	0xd478
+	.4byte	0xd48e
 	.uleb128 0x1b
-	.4byte	.LASF872
+	.4byte	.LASF874
 	.byte	0x8b
 	.2byte	0x127
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0x8b
 	.2byte	0x129
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2791
+	.4byte	.LASF2793
 	.byte	0x8b
 	.2byte	0x12b
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF2792
+	.4byte	.LASF2794
 	.byte	0x8b
 	.2byte	0x12d
 	.4byte	0x6d
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF2793
+	.4byte	.LASF2795
 	.byte	0x8b
 	.2byte	0x12f
 	.4byte	0x6d
@@ -35082,29 +35431,29 @@ __exitcall_ebc_exit:
 	.string	"mtn"
 	.byte	0x8b
 	.2byte	0x132
-	.4byte	0xd3f4
+	.4byte	0xd40a
 	.byte	0x18
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF2794
+	.4byte	.LASF2796
 	.byte	0x18
 	.byte	0x8b
 	.2byte	0x13d
-	.4byte	0xd4ad
+	.4byte	0xd4c3
 	.uleb128 0x1b
-	.4byte	.LASF2795
+	.4byte	.LASF2797
 	.byte	0x8b
 	.2byte	0x13e
-	.4byte	0xd4ad
+	.4byte	0xd4c3
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF2796
+	.4byte	.LASF2798
 	.byte	0x8b
 	.2byte	0x13f
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF2797
+	.4byte	.LASF2799
 	.byte	0x8b
 	.2byte	0x140
 	.4byte	0x219
@@ -35112,7 +35461,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xce77
+	.4byte	0xce8d
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x25f
@@ -35121,21 +35470,21 @@ __exitcall_ebc_exit:
 	.4byte	0x135
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xcf84
+	.4byte	0xcf9a
 	.uleb128 0xd
-	.4byte	.LASF2798
+	.4byte	.LASF2800
 	.byte	0x8
 	.byte	0xbb
 	.byte	0x12
-	.4byte	0xd4ea
+	.4byte	0xd500
 	.uleb128 0xe
-	.4byte	.LASF2799
+	.4byte	.LASF2801
 	.byte	0xbb
 	.byte	0x14
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2800
+	.4byte	.LASF2802
 	.byte	0xbb
 	.byte	0x14
 	.4byte	0xc6
@@ -35143,104 +35492,104 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd4c5
+	.4byte	0xd4db
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x980
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd478
+	.4byte	0xd48e
 	.uleb128 0x24
-	.4byte	.LASF2801
+	.4byte	.LASF2803
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd4fc
+	.4byte	0xd512
 	.uleb128 0x24
-	.4byte	.LASF2802
+	.4byte	.LASF2804
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd507
+	.4byte	0xd51d
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc78f
+	.4byte	0xc7a5
 	.uleb128 0x24
-	.4byte	.LASF2803
+	.4byte	.LASF2805
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd523
+	.4byte	0xd539
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd518
+	.4byte	0xd52e
 	.uleb128 0x24
-	.4byte	.LASF2804
+	.4byte	.LASF2806
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd534
+	.4byte	0xd54a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd529
+	.4byte	0xd53f
 	.uleb128 0x15
-	.4byte	.LASF2805
+	.4byte	.LASF2807
 	.byte	0x8b
 	.2byte	0x1f6
-	.4byte	0x243f
+	.4byte	0x2455
 	.uleb128 0x15
-	.4byte	.LASF2806
+	.4byte	.LASF2808
 	.byte	0x8b
-	.2byte	0x32c
-	.4byte	0xa0b1
+	.2byte	0x317
+	.4byte	0xa0c7
 	.uleb128 0x15
-	.4byte	.LASF2807
+	.4byte	.LASF2809
 	.byte	0x8b
-	.2byte	0x32d
-	.4byte	0xa0b7
+	.2byte	0x318
+	.4byte	0xa0cd
 	.uleb128 0x15
-	.4byte	.LASF2808
+	.4byte	.LASF2810
 	.byte	0x8b
-	.2byte	0x32e
+	.2byte	0x319
 	.4byte	0xc6
 	.uleb128 0x26
-	.4byte	.LASF865
+	.4byte	.LASF867
 	.2byte	0x3b0
 	.byte	0xbc
 	.byte	0x16
-	.4byte	0xd584
+	.4byte	0xd59a
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xbc
 	.byte	0x17
-	.4byte	0xa54b
+	.4byte	0xa561
 	.byte	0
 	.byte	0
 	.uleb128 0x5
-	.4byte	0xd58f
-	.4byte	0xd58f
+	.4byte	0xd5a5
+	.4byte	0xd5a5
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd56a
+	.4byte	0xd580
 	.uleb128 0x19
-	.4byte	.LASF2809
+	.4byte	.LASF2811
 	.byte	0xbc
 	.byte	0x1f
-	.4byte	0xd584
+	.4byte	0xd59a
 	.uleb128 0x19
-	.4byte	.LASF2810
+	.4byte	.LASF2812
 	.byte	0xbd
 	.byte	0x5a
 	.4byte	0x29b
 	.uleb128 0x19
-	.4byte	.LASF2811
+	.4byte	.LASF2813
 	.byte	0xbd
 	.byte	0x6c
-	.4byte	0xadb2
+	.4byte	0xadc8
 	.uleb128 0x26
-	.4byte	.LASF2812
+	.4byte	.LASF2814
 	.2byte	0x3e8
 	.byte	0xbe
 	.byte	0x17
-	.4byte	0xd641
+	.4byte	0xd657
 	.uleb128 0xe
 	.4byte	.LASF264
 	.byte	0xbe
@@ -35254,7 +35603,7 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2813
+	.4byte	.LASF2815
 	.byte	0xbe
 	.byte	0x1a
 	.4byte	0x29b
@@ -35263,115 +35612,115 @@ __exitcall_ebc_exit:
 	.string	"dev"
 	.byte	0xbe
 	.byte	0x1b
-	.4byte	0xa54b
+	.4byte	0xa561
 	.byte	0x10
 	.uleb128 0x27
-	.4byte	.LASF2814
+	.4byte	.LASF2816
 	.byte	0xbe
 	.byte	0x1c
 	.4byte	0x13a
 	.2byte	0x3c0
 	.uleb128 0x27
-	.4byte	.LASF2079
+	.4byte	.LASF2081
 	.byte	0xbe
 	.byte	0x1d
-	.4byte	0x97c3
+	.4byte	0x97d9
 	.2byte	0x3c8
 	.uleb128 0x27
-	.4byte	.LASF2815
+	.4byte	.LASF2817
 	.byte	0xbe
 	.byte	0x1f
-	.4byte	0xd646
+	.4byte	0xd65c
 	.2byte	0x3d0
 	.uleb128 0x27
-	.4byte	.LASF2816
+	.4byte	.LASF2818
 	.byte	0xbe
 	.byte	0x20
 	.4byte	0x219
 	.2byte	0x3d8
 	.uleb128 0x27
-	.4byte	.LASF2817
+	.4byte	.LASF2819
 	.byte	0xbe
 	.byte	0x23
-	.4byte	0xd651
+	.4byte	0xd667
 	.2byte	0x3e0
 	.uleb128 0x27
-	.4byte	.LASF2218
+	.4byte	.LASF2220
 	.byte	0xbe
 	.byte	0x26
-	.4byte	0xada4
+	.4byte	0xadba
 	.2byte	0x3e8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xd5b6
+	.4byte	0xd5cc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xb900
+	.4byte	0xb916
 	.uleb128 0x24
-	.4byte	.LASF2817
+	.4byte	.LASF2819
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd64c
+	.4byte	0xd662
 	.uleb128 0x19
-	.4byte	.LASF2818
+	.4byte	.LASF2820
 	.byte	0xbe
 	.byte	0x30
-	.4byte	0xadb2
+	.4byte	0xadc8
 	.uleb128 0x19
-	.4byte	.LASF2819
+	.4byte	.LASF2821
 	.byte	0xbe
 	.byte	0x31
-	.4byte	0xa54b
+	.4byte	0xa561
 	.uleb128 0xd
-	.4byte	.LASF2820
+	.4byte	.LASF2822
 	.byte	0xe0
 	.byte	0xbe
 	.byte	0xb7
-	.4byte	0xd6da
+	.4byte	0xd6f0
 	.uleb128 0xe
-	.4byte	.LASF2329
+	.4byte	.LASF2331
 	.byte	0xbe
 	.byte	0xb8
-	.4byte	0xd6ef
+	.4byte	0xd705
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2331
+	.4byte	.LASF2333
 	.byte	0xbe
 	.byte	0xb9
-	.4byte	0xd6ef
+	.4byte	0xd705
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2332
+	.4byte	.LASF2334
 	.byte	0xbe
 	.byte	0xba
-	.4byte	0xd700
+	.4byte	0xd716
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2176
+	.4byte	.LASF2178
 	.byte	0xbe
 	.byte	0xbb
-	.4byte	0xd71a
+	.4byte	0xd730
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2177
+	.4byte	.LASF2179
 	.byte	0xbe
 	.byte	0xbc
-	.4byte	0xd6ef
+	.4byte	0xd705
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2199
+	.4byte	.LASF2201
 	.byte	0xbe
 	.byte	0xbd
-	.4byte	0xaf26
+	.4byte	0xaf3c
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2821
+	.4byte	.LASF2823
 	.byte	0xbe
 	.byte	0xbe
-	.4byte	0xd646
+	.4byte	0xd65c
 	.byte	0xd0
 	.uleb128 0xe
-	.4byte	.LASF2822
+	.4byte	.LASF2824
 	.byte	0xbe
 	.byte	0xbf
 	.4byte	0x29b
@@ -35379,92 +35728,92 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xd6e9
+	.4byte	0xd6ff
 	.uleb128 0x11
-	.4byte	0xd6e9
+	.4byte	0xd6ff
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd5b6
+	.4byte	0xd5cc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd6da
+	.4byte	0xd6f0
 	.uleb128 0x10
-	.4byte	0xd700
+	.4byte	0xd716
 	.uleb128 0x11
-	.4byte	0xd6e9
+	.4byte	0xd6ff
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd6f5
+	.4byte	0xd70b
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xd71a
+	.4byte	0xd730
 	.uleb128 0x11
-	.4byte	0xd6e9
+	.4byte	0xd6ff
 	.uleb128 0x11
-	.4byte	0xa3ed
+	.4byte	0xa403
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd706
+	.4byte	0xd71c
 	.uleb128 0x5
-	.4byte	0xb170
-	.4byte	0xd72b
+	.4byte	0xb186
+	.4byte	0xd741
 	.uleb128 0x18
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xd720
+	.4byte	0xd736
 	.uleb128 0x19
-	.4byte	.LASF2823
+	.4byte	.LASF2825
 	.byte	0xbf
 	.byte	0x31
-	.4byte	0xd72b
+	.4byte	0xd741
 	.uleb128 0x19
-	.4byte	.LASF2824
+	.4byte	.LASF2826
 	.byte	0xc0
 	.byte	0x16
 	.4byte	0xe70
 	.uleb128 0x19
-	.4byte	.LASF2825
+	.4byte	.LASF2827
 	.byte	0xc0
 	.byte	0x17
 	.4byte	0xe50
 	.uleb128 0x19
-	.4byte	.LASF2826
+	.4byte	.LASF2828
 	.byte	0xc0
 	.byte	0x19
-	.4byte	0x4a2b
+	.4byte	0x4a41
 	.uleb128 0x19
-	.4byte	.LASF2827
+	.4byte	.LASF2829
 	.byte	0xc0
 	.byte	0x1a
-	.4byte	0x247c
+	.4byte	0x2492
 	.uleb128 0x19
-	.4byte	.LASF2828
+	.4byte	.LASF2830
 	.byte	0x12
 	.byte	0x8c
 	.4byte	0x29b
 	.uleb128 0x1e
-	.4byte	.LASF2829
+	.4byte	.LASF2831
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x12
 	.2byte	0x130
-	.4byte	0xd796
+	.4byte	0xd7ac
 	.uleb128 0xc
-	.4byte	.LASF2830
+	.4byte	.LASF2832
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2831
+	.4byte	.LASF2833
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2832
+	.4byte	.LASF2834
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x5223
-	.4byte	0xd7ac
+	.4byte	0x5239
+	.4byte	0xd7c2
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
@@ -35473,173 +35822,173 @@ __exitcall_ebc_exit:
 	.byte	0xd
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF2833
+	.4byte	.LASF2835
 	.byte	0x12
 	.2byte	0x13b
-	.4byte	0xd796
+	.4byte	0xd7ac
 	.uleb128 0xb
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0x4
 	.byte	0x1b
-	.4byte	0xd7d1
+	.4byte	0xd7e7
 	.uleb128 0xc
-	.4byte	.LASF2834
+	.4byte	.LASF2836
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2835
+	.4byte	.LASF2837
 	.byte	0x1
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2836
+	.4byte	.LASF2838
 	.byte	0xd0
 	.byte	0x4
 	.byte	0x20
-	.4byte	0xd7e9
+	.4byte	0xd7ff
 	.uleb128 0x20
 	.string	"ws"
 	.byte	0x4
 	.byte	0x21
-	.4byte	0xabe0
+	.4byte	0xabf6
 	.byte	0
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2837
+	.4byte	.LASF2839
 	.byte	0x4
 	.byte	0xc1
 	.byte	0x7
-	.4byte	0xd802
+	.4byte	0xd818
 	.uleb128 0xe
-	.4byte	.LASF2838
+	.4byte	.LASF2840
 	.byte	0xc1
 	.byte	0x8
 	.4byte	0xc6
 	.byte	0
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF2839
+	.4byte	.LASF2841
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc2
 	.byte	0xb
-	.4byte	0xd85b
+	.4byte	0xd871
 	.uleb128 0xc
-	.4byte	.LASF2840
+	.4byte	.LASF2842
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2841
+	.4byte	.LASF2843
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2842
+	.4byte	.LASF2844
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2843
+	.4byte	.LASF2845
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF2844
+	.4byte	.LASF2846
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF2845
+	.4byte	.LASF2847
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF2846
+	.4byte	.LASF2848
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF2847
+	.4byte	.LASF2849
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF2848
+	.4byte	.LASF2850
 	.byte	0x9
 	.uleb128 0xc
-	.4byte	.LASF2849
+	.4byte	.LASF2851
 	.byte	0xa
 	.uleb128 0xc
-	.4byte	.LASF2850
+	.4byte	.LASF2852
 	.byte	0xb
 	.uleb128 0xc
-	.4byte	.LASF2851
+	.4byte	.LASF2853
 	.byte	0xc
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2852
+	.4byte	.LASF2854
 	.byte	0x18
 	.byte	0xc2
 	.byte	0x27
-	.4byte	0xd88c
+	.4byte	0xd8a2
 	.uleb128 0xe
-	.4byte	.LASF2853
+	.4byte	.LASF2855
 	.byte	0xc2
 	.byte	0x28
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF791
+	.4byte	.LASF793
 	.byte	0xc2
 	.byte	0x29
-	.4byte	0x3548
+	.4byte	0x355e
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2854
+	.4byte	.LASF2856
 	.byte	0xc2
 	.byte	0x2a
-	.4byte	0xc097
+	.4byte	0xc0ad
 	.byte	0x10
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF2855
+	.4byte	.LASF2857
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc3
 	.byte	0xe
-	.4byte	0xd8bb
+	.4byte	0xd8d1
 	.uleb128 0xc
-	.4byte	.LASF2856
+	.4byte	.LASF2858
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2857
+	.4byte	.LASF2859
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2858
+	.4byte	.LASF2860
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2859
+	.4byte	.LASF2861
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2860
+	.4byte	.LASF2862
 	.byte	0x4
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2861
+	.4byte	.LASF2863
 	.byte	0x40
 	.byte	0xc3
 	.byte	0x16
-	.4byte	0xd940
+	.4byte	0xd956
 	.uleb128 0xe
-	.4byte	.LASF757
+	.4byte	.LASF759
 	.byte	0xc3
 	.byte	0x17
-	.4byte	0xd88c
+	.4byte	0xd8a2
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2862
+	.4byte	.LASF2864
 	.byte	0xc3
 	.byte	0x18
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2863
+	.4byte	.LASF2865
 	.byte	0xc3
 	.byte	0x19
 	.4byte	0x219
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2864
+	.4byte	.LASF2866
 	.byte	0xc3
 	.byte	0x1a
-	.4byte	0x47ad
+	.4byte	0x47c3
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2865
+	.4byte	.LASF2867
 	.byte	0xc3
 	.byte	0x1b
 	.4byte	0xc6
@@ -35651,358 +36000,364 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x2c
 	.uleb128 0xe
-	.4byte	.LASF2866
+	.4byte	.LASF2868
 	.byte	0xc3
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2867
+	.4byte	.LASF2869
 	.byte	0xc3
 	.byte	0x1e
 	.4byte	0xc6
 	.byte	0x34
 	.uleb128 0xe
-	.4byte	.LASF2868
+	.4byte	.LASF2870
 	.byte	0xc3
 	.byte	0x1f
 	.4byte	0xc6
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2869
+	.4byte	.LASF2871
 	.byte	0xc3
 	.byte	0x20
 	.4byte	0xc6
 	.byte	0x3c
 	.byte	0
 	.uleb128 0x1f
-	.4byte	.LASF2870
+	.4byte	.LASF2872
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc4
 	.byte	0x3b
-	.4byte	0xd9c3
+	.4byte	0xd9e5
 	.uleb128 0xc
-	.4byte	.LASF2871
+	.4byte	.LASF2873
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2872
+	.4byte	.LASF2874
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2873
+	.4byte	.LASF2875
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2874
+	.4byte	.LASF2876
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF2875
+	.4byte	.LASF2877
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF2876
+	.4byte	.LASF2878
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF2877
+	.4byte	.LASF2879
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF2878
+	.4byte	.LASF2880
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF2879
+	.4byte	.LASF2881
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF2880
+	.4byte	.LASF2882
 	.byte	0x9
 	.uleb128 0xc
-	.4byte	.LASF2881
+	.4byte	.LASF2883
 	.byte	0xa
 	.uleb128 0xc
-	.4byte	.LASF2882
+	.4byte	.LASF2884
 	.byte	0xb
 	.uleb128 0xc
-	.4byte	.LASF2883
+	.4byte	.LASF2885
 	.byte	0xc
 	.uleb128 0xc
-	.4byte	.LASF2884
+	.4byte	.LASF2886
 	.byte	0xd
 	.uleb128 0xc
-	.4byte	.LASF2885
+	.4byte	.LASF2887
 	.byte	0xe
 	.uleb128 0xc
-	.4byte	.LASF2886
+	.4byte	.LASF2888
 	.byte	0xf
 	.uleb128 0xc
-	.4byte	.LASF2887
+	.4byte	.LASF2889
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF2888
+	.4byte	.LASF2890
 	.byte	0x11
 	.uleb128 0xc
-	.4byte	.LASF2889
+	.4byte	.LASF2891
 	.byte	0x12
+	.uleb128 0xc
+	.4byte	.LASF2892
+	.byte	0x13
+	.uleb128 0xc
+	.4byte	.LASF2893
+	.byte	0x14
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2890
+	.4byte	.LASF2894
 	.byte	0x2c
 	.byte	0xc4
-	.byte	0x54
-	.4byte	0xda54
+	.byte	0x56
+	.4byte	0xda76
 	.uleb128 0xe
-	.4byte	.LASF881
+	.4byte	.LASF883
 	.byte	0xc4
-	.byte	0x55
+	.byte	0x57
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2891
+	.4byte	.LASF2895
 	.byte	0xc4
-	.byte	0x56
+	.byte	0x58
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF2892
+	.4byte	.LASF2896
 	.byte	0xc4
-	.byte	0x57
+	.byte	0x59
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF261
 	.byte	0xc4
-	.byte	0x58
+	.byte	0x5a
 	.4byte	0xc6
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF2893
+	.4byte	.LASF2897
 	.byte	0xc4
-	.byte	0x59
+	.byte	0x5b
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2866
+	.4byte	.LASF2868
 	.byte	0xc4
-	.byte	0x5a
+	.byte	0x5c
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2867
+	.4byte	.LASF2869
 	.byte	0xc4
-	.byte	0x5b
+	.byte	0x5d
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2868
+	.4byte	.LASF2870
 	.byte	0xc4
-	.byte	0x5c
+	.byte	0x5e
 	.4byte	0xc6
 	.byte	0x1c
 	.uleb128 0xe
-	.4byte	.LASF2869
+	.4byte	.LASF2871
 	.byte	0xc4
-	.byte	0x5d
+	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2894
+	.4byte	.LASF2898
 	.byte	0xc4
-	.byte	0x5e
+	.byte	0x60
 	.4byte	0xc6
 	.byte	0x24
 	.uleb128 0xe
-	.4byte	.LASF2895
+	.4byte	.LASF2899
 	.byte	0xc4
-	.byte	0x5f
+	.byte	0x61
 	.4byte	0xc6
 	.byte	0x28
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2896
+	.4byte	.LASF2900
 	.byte	0x50
 	.byte	0x3
 	.byte	0x10
-	.4byte	0xdacd
+	.4byte	0xdaef
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x3
 	.byte	0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2897
+	.4byte	.LASF2901
 	.byte	0x3
 	.byte	0x12
-	.4byte	0x47ad
+	.4byte	0x47c3
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2898
+	.4byte	.LASF2902
 	.byte	0x3
 	.byte	0x13
 	.4byte	0x443
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2899
+	.4byte	.LASF2903
 	.byte	0x3
 	.byte	0x14
-	.4byte	0xdae3
+	.4byte	0xdb05
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2900
+	.4byte	.LASF2904
 	.byte	0x3
 	.byte	0x15
-	.4byte	0xdaf4
+	.4byte	0xdb16
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2901
+	.4byte	.LASF2905
 	.byte	0x3
 	.byte	0x16
-	.4byte	0xdaf4
+	.4byte	0xdb16
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2902
+	.4byte	.LASF2906
 	.byte	0x3
 	.byte	0x17
-	.4byte	0xdb0e
+	.4byte	0xdb30
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2903
+	.4byte	.LASF2907
 	.byte	0x3
 	.byte	0x18
-	.4byte	0xdb23
+	.4byte	0xdb45
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2904
+	.4byte	.LASF2908
 	.byte	0x3
 	.byte	0x19
-	.4byte	0xdb3d
+	.4byte	0xdb5f
 	.byte	0x48
 	.byte	0
 	.uleb128 0x10
-	.4byte	0xdadd
+	.4byte	0xdaff
 	.uleb128 0x11
-	.4byte	0xdadd
+	.4byte	0xdaff
 	.uleb128 0x11
 	.4byte	0x29b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xda54
+	.4byte	0xda76
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdacd
+	.4byte	0xdaef
 	.uleb128 0x10
-	.4byte	0xdaf4
+	.4byte	0xdb16
 	.uleb128 0x11
-	.4byte	0xdadd
+	.4byte	0xdaff
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdae9
+	.4byte	0xdb0b
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdb0e
+	.4byte	0xdb30
 	.uleb128 0x11
-	.4byte	0xdadd
+	.4byte	0xdaff
 	.uleb128 0x11
-	.4byte	0x4653
+	.4byte	0x4669
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdafa
+	.4byte	0xdb1c
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdb23
+	.4byte	0xdb45
 	.uleb128 0x11
-	.4byte	0xdadd
+	.4byte	0xdaff
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb14
+	.4byte	0xdb36
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdb3d
+	.4byte	0xdb5f
 	.uleb128 0x11
-	.4byte	0xdadd
+	.4byte	0xdaff
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb29
+	.4byte	0xdb4b
 	.uleb128 0x1f
-	.4byte	.LASF2905
+	.4byte	.LASF2909
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc5
 	.byte	0x5
-	.4byte	0xdb6c
+	.4byte	0xdb8e
 	.uleb128 0xc
-	.4byte	.LASF2906
+	.4byte	.LASF2910
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2907
+	.4byte	.LASF2911
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2908
+	.4byte	.LASF2912
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2909
+	.4byte	.LASF2913
 	.byte	0x3
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2910
+	.4byte	.LASF2914
 	.byte	0x20
 	.byte	0xc6
 	.byte	0xb
-	.4byte	0xdbb5
+	.4byte	0xdbd7
 	.uleb128 0xe
-	.4byte	.LASF2911
+	.4byte	.LASF2915
 	.byte	0xc6
 	.byte	0xc
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF881
+	.4byte	.LASF883
 	.byte	0xc6
 	.byte	0xd
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2452
+	.4byte	.LASF2454
 	.byte	0xc6
 	.byte	0xe
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF2912
+	.4byte	.LASF2916
 	.byte	0xc6
 	.byte	0xf
 	.4byte	0x310
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2913
+	.4byte	.LASF2917
 	.byte	0xc6
 	.byte	0x11
 	.4byte	0x6d
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2914
+	.4byte	.LASF2918
 	.byte	0x10
 	.byte	0xc6
 	.byte	0x2a
-	.4byte	0xdbe6
+	.4byte	0xdc08
 	.uleb128 0x20
 	.string	"sgl"
 	.byte	0xc6
 	.byte	0x2b
-	.4byte	0xdbe6
+	.4byte	0xdc08
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2915
+	.4byte	.LASF2919
 	.byte	0xc6
 	.byte	0x2c
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2916
+	.4byte	.LASF2920
 	.byte	0xc6
 	.byte	0x2d
 	.4byte	0x6d
@@ -36010,16 +36365,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb6c
+	.4byte	0xdb8e
 	.uleb128 0x14
 	.4byte	0x443
-	.4byte	0xdc0f
+	.4byte	0xdc31
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdc0f
+	.4byte	0xdc31
 	.uleb128 0x11
 	.4byte	0x31b
 	.uleb128 0x11
@@ -36030,11 +36385,11 @@ __exitcall_ebc_exit:
 	.4byte	0x310
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdbec
+	.4byte	0xdc0e
 	.uleb128 0x10
-	.4byte	0xdc3a
+	.4byte	0xdc5c
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
@@ -36046,14 +36401,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc1b
+	.4byte	0xdc3d
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdc68
+	.4byte	0xdc8a
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
-	.4byte	0x3c8a
+	.4byte	0x3ca0
 	.uleb128 0x11
 	.4byte	0x443
 	.uleb128 0x11
@@ -36065,14 +36420,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc40
+	.4byte	0xdc62
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdc96
+	.4byte	0xdcb8
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
-	.4byte	0xdc96
+	.4byte	0xdcb8
 	.uleb128 0x11
 	.4byte	0x443
 	.uleb128 0x11
@@ -36084,164 +36439,164 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdbb5
+	.4byte	0xdbd7
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc6e
+	.4byte	0xdc90
 	.uleb128 0x14
 	.4byte	0x310
-	.4byte	0xdcca
+	.4byte	0xdcec
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
-	.4byte	0x343e
+	.4byte	0x3454
 	.uleb128 0x11
 	.4byte	0x29
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdb43
+	.4byte	0xdb65
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdca2
+	.4byte	0xdcc4
 	.uleb128 0x10
-	.4byte	0xdcef
+	.4byte	0xdd11
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
 	.4byte	0x310
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdb43
+	.4byte	0xdb65
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdcd0
+	.4byte	0xdcf2
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdd18
+	.4byte	0xdd3a
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
-	.4byte	0xdbe6
+	.4byte	0xdc08
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdb43
+	.4byte	0xdb65
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdcf5
+	.4byte	0xdd17
 	.uleb128 0x10
-	.4byte	0xdd3d
+	.4byte	0xdd5f
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
-	.4byte	0xdbe6
+	.4byte	0xdc08
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdb43
+	.4byte	0xdb65
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd1e
+	.4byte	0xdd40
 	.uleb128 0x14
 	.4byte	0x310
-	.4byte	0xdd66
+	.4byte	0xdd88
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
 	.4byte	0x331
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdb43
+	.4byte	0xdb65
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd43
+	.4byte	0xdd65
 	.uleb128 0x10
-	.4byte	0xdd86
+	.4byte	0xdda8
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
 	.4byte	0x310
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdb43
+	.4byte	0xdb65
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd6c
+	.4byte	0xdd8e
 	.uleb128 0x10
-	.4byte	0xdda6
+	.4byte	0xddc8
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
-	.4byte	0xdbe6
+	.4byte	0xdc08
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdb43
+	.4byte	0xdb65
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd8c
+	.4byte	0xddae
 	.uleb128 0x10
-	.4byte	0xddc6
+	.4byte	0xdde8
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
 	.4byte	0x443
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdb43
+	.4byte	0xdb65
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xddac
+	.4byte	0xddce
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdde0
+	.4byte	0xde02
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
 	.4byte	0x310
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xddcc
+	.4byte	0xddee
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xddfa
+	.4byte	0xde1c
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
 	.4byte	0x155
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdde6
+	.4byte	0xde08
 	.uleb128 0x14
 	.4byte	0x443
-	.4byte	0xde23
+	.4byte	0xde45
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
 	.4byte	0x443
 	.uleb128 0x11
@@ -36253,11 +36608,11 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde00
+	.4byte	0xde22
 	.uleb128 0x10
-	.4byte	0xde3e
+	.4byte	0xde60
 	.uleb128 0x11
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x11
 	.4byte	0x443
 	.uleb128 0x11
@@ -36265,109 +36620,109 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde29
+	.4byte	0xde4b
 	.uleb128 0x19
-	.4byte	.LASF2917
+	.4byte	.LASF2921
 	.byte	0xa
 	.byte	0xc9
-	.4byte	0xb789
+	.4byte	0xb79f
 	.uleb128 0x19
-	.4byte	.LASF2918
+	.4byte	.LASF2922
 	.byte	0xa
 	.byte	0xca
-	.4byte	0xb789
+	.4byte	0xb79f
 	.uleb128 0x19
-	.4byte	.LASF2919
+	.4byte	.LASF2923
 	.byte	0xa
 	.byte	0xcb
-	.4byte	0xb789
+	.4byte	0xb79f
 	.uleb128 0x24
-	.4byte	.LASF2920
+	.4byte	.LASF2924
 	.uleb128 0x19
-	.4byte	.LASF2921
+	.4byte	.LASF2925
 	.byte	0xc7
 	.byte	0x7
-	.4byte	0xde75
+	.4byte	0xde97
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde65
+	.4byte	0xde87
 	.uleb128 0x24
-	.4byte	.LASF2922
+	.4byte	.LASF2926
 	.uleb128 0x19
-	.4byte	.LASF2923
+	.4byte	.LASF2927
 	.byte	0xc7
 	.byte	0x8
-	.4byte	0xde8b
+	.4byte	0xdead
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde7b
+	.4byte	0xde9d
 	.uleb128 0x19
-	.4byte	.LASF2924
+	.4byte	.LASF2928
 	.byte	0xc7
 	.byte	0x16
-	.4byte	0xb78e
+	.4byte	0xb7a4
 	.uleb128 0x19
-	.4byte	.LASF2925
+	.4byte	.LASF2929
 	.byte	0xc8
 	.byte	0x1b
-	.4byte	0xb789
+	.4byte	0xb79f
 	.uleb128 0xd
-	.4byte	.LASF2926
+	.4byte	.LASF2930
 	.byte	0x18
 	.byte	0xc9
 	.byte	0xf
-	.4byte	0xded8
+	.4byte	0xdefa
 	.uleb128 0xe
-	.4byte	.LASF2863
+	.4byte	.LASF2865
 	.byte	0xc9
 	.byte	0x10
 	.4byte	0x443
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2862
+	.4byte	.LASF2864
 	.byte	0xc9
 	.byte	0x11
 	.4byte	0x29
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0xc9
 	.byte	0x12
 	.4byte	0x2ce
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2927
+	.4byte	.LASF2931
 	.byte	0xa0
 	.byte	0xc9
 	.byte	0x15
-	.4byte	0xe01c
+	.4byte	0xe03e
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xc9
 	.byte	0x16
-	.4byte	0xa545
+	.4byte	0xa55b
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2928
+	.4byte	.LASF2932
 	.byte	0xc9
 	.byte	0x17
-	.4byte	0xe0dd
+	.4byte	0xe0ff
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2929
+	.4byte	.LASF2933
 	.byte	0xc9
 	.byte	0x18
-	.4byte	0xdadd
+	.4byte	0xdaff
 	.byte	0x10
 	.uleb128 0x20
 	.string	"fb"
 	.byte	0xc9
 	.byte	0x19
-	.4byte	0xe0e3
+	.4byte	0xe105
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2930
+	.4byte	.LASF2934
 	.byte	0xc9
 	.byte	0x1a
 	.4byte	0xc6
@@ -36379,43 +36734,43 @@ __exitcall_ebc_exit:
 	.4byte	0x13a
 	.byte	0x4c
 	.uleb128 0xe
-	.4byte	.LASF2892
+	.4byte	.LASF2896
 	.byte	0xc9
 	.byte	0x1d
 	.4byte	0x13a
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2931
+	.4byte	.LASF2935
 	.byte	0xc9
 	.byte	0x1e
 	.4byte	0x13a
 	.byte	0x54
 	.uleb128 0xe
-	.4byte	.LASF2932
+	.4byte	.LASF2936
 	.byte	0xc9
 	.byte	0x1f
 	.4byte	0x13a
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2894
+	.4byte	.LASF2898
 	.byte	0xc9
 	.byte	0x20
 	.4byte	0x13a
 	.byte	0x5c
 	.uleb128 0xe
-	.4byte	.LASF2895
+	.4byte	.LASF2899
 	.byte	0xc9
 	.byte	0x21
 	.4byte	0x13a
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2933
+	.4byte	.LASF2937
 	.byte	0xc9
 	.byte	0x22
 	.4byte	0x13a
 	.byte	0x64
 	.uleb128 0xe
-	.4byte	.LASF2934
+	.4byte	.LASF2938
 	.byte	0xc9
 	.byte	0x23
 	.4byte	0x13a
@@ -36445,13 +36800,13 @@ __exitcall_ebc_exit:
 	.4byte	0x13a
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2935
+	.4byte	.LASF2939
 	.byte	0xc9
 	.byte	0x28
 	.4byte	0x13a
 	.byte	0x7c
 	.uleb128 0xe
-	.4byte	.LASF2936
+	.4byte	.LASF2940
 	.byte	0xc9
 	.byte	0x29
 	.4byte	0x13a
@@ -36481,38 +36836,38 @@ __exitcall_ebc_exit:
 	.4byte	0x13a
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2937
+	.4byte	.LASF2941
 	.byte	0xc9
 	.byte	0x2e
 	.4byte	0x13a
 	.byte	0x94
 	.uleb128 0xe
-	.4byte	.LASF2893
+	.4byte	.LASF2897
 	.byte	0xc9
 	.byte	0x2f
 	.4byte	0x13a
 	.byte	0x98
 	.uleb128 0xe
-	.4byte	.LASF2938
+	.4byte	.LASF2942
 	.byte	0xc9
 	.byte	0x30
 	.4byte	0x13a
 	.byte	0x9c
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2939
+	.4byte	.LASF2943
 	.byte	0x70
 	.byte	0xb
 	.byte	0x17
-	.4byte	0xe0dd
+	.4byte	0xe0ff
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xb
 	.byte	0x18
-	.4byte	0xa545
+	.4byte	0xa55b
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2940
+	.4byte	.LASF2944
 	.byte	0xb
 	.byte	0x19
 	.4byte	0x443
@@ -36530,67 +36885,67 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2941
+	.4byte	.LASF2945
 	.byte	0xb
 	.byte	0x1d
-	.4byte	0xe0f8
+	.4byte	0xe11a
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2942
+	.4byte	.LASF2946
 	.byte	0xb
 	.byte	0x1e
-	.4byte	0xe0f8
+	.4byte	0xe11a
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2943
+	.4byte	.LASF2947
 	.byte	0xb
 	.byte	0x1f
-	.4byte	0xe103
+	.4byte	0xe125
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2944
+	.4byte	.LASF2948
 	.byte	0xb
 	.byte	0x21
-	.4byte	0xe123
+	.4byte	0xe145
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2945
+	.4byte	.LASF2949
 	.byte	0xb
 	.byte	0x22
-	.4byte	0xe134
+	.4byte	0xe156
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2946
+	.4byte	.LASF2950
 	.byte	0xb
 	.byte	0x23
-	.4byte	0xe159
+	.4byte	0xe17b
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2947
+	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x24
-	.4byte	0xe174
+	.4byte	0xe196
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2948
+	.4byte	.LASF2952
 	.byte	0xb
 	.byte	0x25
-	.4byte	0xe18a
+	.4byte	0xe1ac
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2949
+	.4byte	.LASF2953
 	.byte	0xb
 	.byte	0x26
-	.4byte	0xe1ae
+	.4byte	0xe1d0
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2950
+	.4byte	.LASF2954
 	.byte	0xb
 	.byte	0x27
-	.4byte	0xe1c4
+	.4byte	0xe1e6
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2951
+	.4byte	.LASF2955
 	.byte	0xb
 	.byte	0x29
 	.4byte	0x4a2
@@ -36598,10 +36953,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe01c
+	.4byte	0xe03e
 	.uleb128 0x5
-	.4byte	0xdea7
-	.4byte	0xe0f3
+	.4byte	0xdec9
+	.4byte	0xe115
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
@@ -36610,38 +36965,38 @@ __exitcall_ebc_exit:
 	.string	"clk"
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe0f3
+	.4byte	0xe115
 	.uleb128 0x24
-	.4byte	.LASF2952
+	.4byte	.LASF2956
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe0fe
+	.4byte	0xe120
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xe11d
+	.4byte	0xe13f
 	.uleb128 0x11
-	.4byte	0xe0dd
+	.4byte	0xe0ff
 	.uleb128 0x11
-	.4byte	0xe11d
+	.4byte	0xe13f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xded8
+	.4byte	0xdefa
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe109
+	.4byte	0xe12b
 	.uleb128 0x10
-	.4byte	0xe134
+	.4byte	0xe156
 	.uleb128 0x11
-	.4byte	0xe0dd
+	.4byte	0xe0ff
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe129
+	.4byte	0xe14b
 	.uleb128 0x10
-	.4byte	0xe159
+	.4byte	0xe17b
 	.uleb128 0x11
-	.4byte	0xe0dd
+	.4byte	0xe0ff
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -36653,11 +37008,11 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe13a
+	.4byte	0xe15c
 	.uleb128 0x10
-	.4byte	0xe174
+	.4byte	0xe196
 	.uleb128 0x11
-	.4byte	0xe0dd
+	.4byte	0xe0ff
 	.uleb128 0x11
 	.4byte	0x13a
 	.uleb128 0x11
@@ -36665,24 +37020,24 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe15f
+	.4byte	0xe181
 	.uleb128 0x10
-	.4byte	0xe18a
+	.4byte	0xe1ac
 	.uleb128 0x11
-	.4byte	0xe0dd
+	.4byte	0xe0ff
 	.uleb128 0x11
 	.4byte	0x13a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe17a
+	.4byte	0xe19c
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xe1ae
+	.4byte	0xe1d0
 	.uleb128 0x11
-	.4byte	0xe0dd
+	.4byte	0xe0ff
 	.uleb128 0x11
-	.4byte	0x3548
+	.4byte	0x355e
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -36690,97 +37045,97 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe190
+	.4byte	0xe1b2
 	.uleb128 0x10
-	.4byte	0xe1c4
+	.4byte	0xe1e6
 	.uleb128 0x11
-	.4byte	0xe0dd
+	.4byte	0xe0ff
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1b4
+	.4byte	0xe1d6
 	.uleb128 0x26
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.2byte	0x268
 	.byte	0x1
 	.byte	0x33
-	.4byte	0xe3e6
+	.4byte	0xe408
 	.uleb128 0xe
-	.4byte	.LASF2954
+	.4byte	.LASF2958
 	.byte	0x1
 	.byte	0x34
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2955
+	.4byte	.LASF2959
 	.byte	0x1
 	.byte	0x35
 	.4byte	0x219
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2956
+	.4byte	.LASF2960
 	.byte	0x1
 	.byte	0x36
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2957
+	.4byte	.LASF2961
 	.byte	0x1
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2958
+	.4byte	.LASF2962
 	.byte	0x1
 	.byte	0x38
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2959
+	.4byte	.LASF2963
 	.byte	0x1
 	.byte	0x39
 	.4byte	0xc6
 	.byte	0x1c
 	.uleb128 0xe
-	.4byte	.LASF2960
+	.4byte	.LASF2964
 	.byte	0x1
 	.byte	0x3a
 	.4byte	0x61
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2961
+	.4byte	.LASF2965
 	.byte	0x1
 	.byte	0x3b
 	.4byte	0x61
 	.byte	0x21
 	.uleb128 0xe
-	.4byte	.LASF2962
+	.4byte	.LASF2966
 	.byte	0x1
 	.byte	0x3c
 	.4byte	0xc6
 	.byte	0x24
 	.uleb128 0xe
-	.4byte	.LASF2963
+	.4byte	.LASF2967
 	.byte	0x1
 	.byte	0x3d
 	.4byte	0xc6
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2964
+	.4byte	.LASF2968
 	.byte	0x1
 	.byte	0x3e
 	.4byte	0xc6
 	.byte	0x2c
 	.uleb128 0xe
-	.4byte	.LASF2965
+	.4byte	.LASF2969
 	.byte	0x1
 	.byte	0x3f
 	.4byte	0xc6
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2892
+	.4byte	.LASF2896
 	.byte	0x1
 	.byte	0x40
 	.4byte	0xc6
@@ -36792,25 +37147,25 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2966
+	.4byte	.LASF2970
 	.byte	0x1
 	.byte	0x42
-	.4byte	0x4653
+	.4byte	0x4669
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2967
+	.4byte	.LASF2971
 	.byte	0x1
 	.byte	0x43
 	.4byte	0xc6
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2968
+	.4byte	.LASF2972
 	.byte	0x1
 	.byte	0x44
 	.4byte	0xc6
 	.byte	0x4c
 	.uleb128 0xe
-	.4byte	.LASF2969
+	.4byte	.LASF2973
 	.byte	0x1
 	.byte	0x45
 	.4byte	0xc6
@@ -36819,148 +37174,148 @@ __exitcall_ebc_exit:
 	.string	"dev"
 	.byte	0x1
 	.byte	0x46
-	.4byte	0xa545
+	.4byte	0xa55b
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2970
+	.4byte	.LASF2974
 	.byte	0x1
 	.byte	0x47
-	.4byte	0xd85b
+	.4byte	0xd871
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2971
+	.4byte	.LASF2975
 	.byte	0x1
 	.byte	0x48
-	.4byte	0x2eda
+	.4byte	0x2ef0
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2972
+	.4byte	.LASF2976
 	.byte	0x1
 	.byte	0x4a
-	.4byte	0x4653
+	.4byte	0x4669
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF2973
+	.4byte	.LASF2977
 	.byte	0x1
 	.byte	0x4b
-	.4byte	0x4653
+	.4byte	0x4669
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF2974
+	.4byte	.LASF2978
 	.byte	0x1
 	.byte	0x4c
-	.4byte	0x4653
+	.4byte	0x4669
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2975
+	.4byte	.LASF2979
 	.byte	0x1
 	.byte	0x4e
-	.4byte	0xc097
+	.4byte	0xc0ad
 	.byte	0x98
 	.uleb128 0xe
-	.4byte	.LASF2976
+	.4byte	.LASF2980
 	.byte	0x1
 	.byte	0x4f
-	.4byte	0xc097
+	.4byte	0xc0ad
 	.byte	0xa0
 	.uleb128 0xe
-	.4byte	.LASF2977
+	.4byte	.LASF2981
 	.byte	0x1
 	.byte	0x50
-	.4byte	0xe3e6
+	.4byte	0xe408
 	.byte	0xa8
 	.uleb128 0xe
-	.4byte	.LASF2978
+	.4byte	.LASF2982
 	.byte	0x1
 	.byte	0x51
 	.4byte	0xc6
 	.byte	0xb8
 	.uleb128 0xe
-	.4byte	.LASF2979
+	.4byte	.LASF2983
 	.byte	0x1
 	.byte	0x52
 	.4byte	0xc6
 	.byte	0xbc
 	.uleb128 0xe
-	.4byte	.LASF2980
+	.4byte	.LASF2984
 	.byte	0x1
 	.byte	0x53
 	.4byte	0x219
 	.byte	0xc0
 	.uleb128 0xe
-	.4byte	.LASF2981
+	.4byte	.LASF2985
 	.byte	0x1
 	.byte	0x54
-	.4byte	0xe3f6
+	.4byte	0xe418
 	.byte	0xc8
 	.uleb128 0xe
-	.4byte	.LASF2982
+	.4byte	.LASF2986
 	.byte	0x1
 	.byte	0x55
-	.4byte	0xe3f6
+	.4byte	0xe418
 	.byte	0xd0
 	.uleb128 0xe
-	.4byte	.LASF2983
+	.4byte	.LASF2987
 	.byte	0x1
 	.byte	0x57
-	.4byte	0xd7d1
+	.4byte	0xd7e7
 	.byte	0xd8
 	.uleb128 0x27
-	.4byte	.LASF2984
+	.4byte	.LASF2988
 	.byte	0x1
 	.byte	0x58
 	.4byte	0xc6
 	.2byte	0x1a8
 	.uleb128 0x27
-	.4byte	.LASF2985
+	.4byte	.LASF2989
 	.byte	0x1
 	.byte	0x5a
 	.4byte	0xc6
 	.2byte	0x1ac
 	.uleb128 0x27
-	.4byte	.LASF2986
+	.4byte	.LASF2990
 	.byte	0x1
 	.byte	0x5c
-	.4byte	0x3147
+	.4byte	0x315d
 	.2byte	0x1b0
 	.uleb128 0x27
-	.4byte	.LASF2987
+	.4byte	.LASF2991
 	.byte	0x1
 	.byte	0x5f
-	.4byte	0x3147
+	.4byte	0x315d
 	.2byte	0x1e8
 	.uleb128 0x27
-	.4byte	.LASF2988
+	.4byte	.LASF2992
 	.byte	0x1
 	.byte	0x62
-	.4byte	0x31e0
+	.4byte	0x31f6
 	.2byte	0x220
 	.uleb128 0x27
-	.4byte	.LASF2989
+	.4byte	.LASF2993
 	.byte	0x1
 	.byte	0x65
 	.4byte	0xc6
 	.2byte	0x250
 	.uleb128 0x27
-	.4byte	.LASF2990
+	.4byte	.LASF2994
 	.byte	0x1
 	.byte	0x67
 	.4byte	0xc6
 	.2byte	0x254
 	.uleb128 0x27
-	.4byte	.LASF2991
+	.4byte	.LASF2995
 	.byte	0x1
 	.byte	0x69
 	.4byte	0xc6
 	.2byte	0x258
 	.uleb128 0x27
-	.4byte	.LASF2992
+	.4byte	.LASF2996
 	.byte	0x1
 	.byte	0x6b
 	.4byte	0xc6
 	.2byte	0x25c
 	.uleb128 0x27
-	.4byte	.LASF2993
+	.4byte	.LASF2997
 	.byte	0x1
 	.byte	0x6c
 	.4byte	0xc6
@@ -36968,2852 +37323,2852 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x443
-	.4byte	0xe3f6
+	.4byte	0xe418
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd8bb
+	.4byte	0xd8d1
 	.uleb128 0x4a
 	.string	"ebc"
 	.2byte	0x320
 	.byte	0x1
 	.byte	0x6f
-	.4byte	0xe446
+	.4byte	0xe468
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x1
 	.byte	0x70
-	.4byte	0xa545
+	.4byte	0xa55b
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2928
+	.4byte	.LASF2932
 	.byte	0x1
 	.byte	0x71
-	.4byte	0xe0dd
+	.4byte	0xe0ff
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2929
+	.4byte	.LASF2933
 	.byte	0x1
 	.byte	0x72
-	.4byte	0xdadd
+	.4byte	0xdaff
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2994
+	.4byte	.LASF2998
 	.byte	0x1
 	.byte	0x73
-	.4byte	0xded8
+	.4byte	0xdefa
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1771
+	.4byte	.LASF1773
 	.byte	0x1
 	.byte	0x74
-	.4byte	0xe1ca
+	.4byte	0xe1ec
 	.byte	0xb8
 	.byte	0
 	.uleb128 0x4b
-	.4byte	.LASF2995
+	.4byte	.LASF2999
 	.byte	0x1
 	.byte	0x77
-	.4byte	0xe45b
+	.4byte	0xe47d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	global_ebc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe3fc
+	.4byte	0xe41e
 	.uleb128 0x4b
-	.4byte	.LASF2996
+	.4byte	.LASF3000
 	.byte	0x1
 	.byte	0x78
-	.4byte	0x2eda
+	.4byte	0x2ef0
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_auto_task
 	.uleb128 0x4b
-	.4byte	.LASF2997
+	.4byte	.LASF3001
 	.byte	0x1
 	.byte	0x79
-	.4byte	0x4e0b
+	.4byte	0x4e21
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	auto_buf_sema
 	.uleb128 0x4b
-	.4byte	.LASF2998
+	.4byte	.LASF3002
 	.byte	0x1
 	.byte	0x7b
-	.4byte	0x156f
+	.4byte	0x1585
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_wq
 	.uleb128 0x4b
-	.4byte	.LASF2999
+	.4byte	.LASF3003
 	.byte	0x1
 	.byte	0x7c
-	.4byte	0x156f
+	.4byte	0x1585
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_thread_wq
 	.uleb128 0x4b
-	.4byte	.LASF3000
+	.4byte	.LASF3004
 	.byte	0x1
 	.byte	0x7d
-	.4byte	0x156f
+	.4byte	0x1585
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_poweroff_wq
 	.uleb128 0x4b
-	.4byte	.LASF3001
+	.4byte	.LASF3005
 	.byte	0x1
 	.byte	0x7e
-	.4byte	0x5b46
+	.4byte	0x5b5c
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_auto_thread_sem
 	.uleb128 0x4c
-	.4byte	.LASF3002
+	.4byte	.LASF3006
 	.byte	0x1
-	.2byte	0x672
+	.2byte	0x6b4
 	.4byte	0x7b4
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_ops
 	.uleb128 0x4c
-	.4byte	.LASF3003
+	.4byte	.LASF3007
 	.byte	0x1
-	.2byte	0x67c
-	.4byte	0xc5df
+	.2byte	0x6be
+	.4byte	0xc5f5
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_misc
 	.uleb128 0x4c
-	.4byte	.LASF3004
+	.4byte	.LASF3008
 	.byte	0x1
-	.2byte	0x68b
-	.4byte	0xb372
+	.2byte	0x6cd
+	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_waveform_version
 	.uleb128 0x4c
-	.4byte	.LASF3005
+	.4byte	.LASF3009
 	.byte	0x1
-	.2byte	0x696
-	.4byte	0xb372
+	.2byte	0x6d8
+	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_name
 	.uleb128 0x4c
-	.4byte	.LASF3006
+	.4byte	.LASF3010
 	.byte	0x1
-	.2byte	0x6a4
-	.4byte	0xb372
+	.2byte	0x6e6
+	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_temp
 	.uleb128 0x4c
-	.4byte	.LASF3007
+	.4byte	.LASF3011
 	.byte	0x1
-	.2byte	0x6c7
-	.4byte	0xb372
+	.2byte	0x709
+	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_vcom
 	.uleb128 0x4c
-	.4byte	.LASF3008
+	.4byte	.LASF3012
 	.byte	0x1
-	.2byte	0x6d1
-	.4byte	0xb372
+	.2byte	0x713
+	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_version
 	.uleb128 0x4c
-	.4byte	.LASF3009
+	.4byte	.LASF3013
 	.byte	0x1
-	.2byte	0x6da
-	.4byte	0xb372
+	.2byte	0x71c
+	.4byte	0xb388
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_state
 	.uleb128 0x4c
-	.4byte	.LASF3010
+	.4byte	.LASF3014
 	.byte	0x1
-	.2byte	0x873
-	.4byte	0xa531
+	.2byte	0x8b6
+	.4byte	0xa547
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_pm
 	.uleb128 0x5
-	.4byte	0xb170
-	.4byte	0xe5b5
+	.4byte	0xb186
+	.4byte	0xe5d7
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe5a5
+	.4byte	0xe5c7
 	.uleb128 0x4c
-	.4byte	.LASF3011
+	.4byte	.LASF3015
 	.byte	0x1
-	.2byte	0x878
-	.4byte	0xe5b5
+	.2byte	0x8bb
+	.4byte	0xe5d7
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_match
 	.uleb128 0x4c
-	.4byte	.LASF3012
+	.4byte	.LASF3016
 	.byte	0x1
-	.2byte	0x87e
-	.4byte	0xd66d
+	.2byte	0x8c1
+	.4byte	0xd683
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_driver
 	.uleb128 0x4c
-	.4byte	.LASF3013
+	.4byte	.LASF3017
 	.byte	0x1
-	.2byte	0x892
+	.2byte	0x8d5
 	.4byte	0x443
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init2194
+	.8byte	__addressable_ebc_init2261
 	.uleb128 0x4c
-	.4byte	.LASF3014
+	.4byte	.LASF3018
 	.byte	0x1
-	.2byte	0x893
+	.2byte	0x8d6
 	.4byte	0x497
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	__exitcall_ebc_exit
 	.uleb128 0x4d
-	.4byte	.LASF3063
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x88d
-	.8byte	.LFB2846
-	.8byte	.LFE2846-.LFB2846
+	.2byte	0x8d0
+	.8byte	.LFB2851
+	.8byte	.LFE2851-.LFB2851
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe63e
+	.4byte	0xe660
 	.uleb128 0x4e
 	.8byte	.LVL34
-	.4byte	0x13b3d
+	.4byte	0x13f76
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3015
+	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x888
+	.2byte	0x8cb
 	.4byte	0xc6
-	.8byte	.LFB2845
-	.8byte	.LFE2845-.LFB2845
+	.8byte	.LFB2850
+	.8byte	.LFE2850-.LFB2850
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe66e
+	.4byte	0xe690
 	.uleb128 0x4e
-	.8byte	.LVL318
-	.4byte	0x13b49
+	.8byte	.LVL319
+	.4byte	0x13f82
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3016
+	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x867
+	.2byte	0x8aa
 	.4byte	0xc6
-	.8byte	.LFB2844
-	.8byte	.LFE2844-.LFB2844
+	.8byte	.LFB2849
+	.8byte	.LFE2849-.LFB2849
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe70a
+	.4byte	0xe72c
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x867
-	.4byte	0xa545
+	.2byte	0x8aa
+	.4byte	0xa55b
 	.4byte	.LLST7
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x869
-	.4byte	0xe45b
+	.2byte	0x8ac
+	.4byte	0xe47d
 	.uleb128 0x46
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x86a
-	.4byte	0xe70a
+	.2byte	0x8ad
+	.4byte	0xe72c
 	.uleb128 0x53
-	.4byte	0x131ec
-	.8byte	.LBB910
-	.8byte	.LBE910-.LBB910
+	.4byte	0x13367
+	.8byte	.LBB926
+	.8byte	.LBE926-.LBB926
 	.byte	0x1
-	.2byte	0x869
-	.4byte	0xe6da
+	.2byte	0x8ac
+	.4byte	0xe6fc
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x13378
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12ddd
-	.8byte	.LBB912
-	.8byte	.LBE912-.LBB912
+	.4byte	0x12f58
+	.8byte	.LBB928
+	.8byte	.LBE928-.LBB928
 	.byte	0x1
-	.2byte	0x86c
-	.4byte	0xe6fc
+	.2byte	0x8af
+	.4byte	0xe71e
 	.uleb128 0x54
-	.4byte	0x12de9
+	.4byte	0x12f64
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL38
-	.4byte	0x13b55
+	.4byte	0x13f8e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1ca
+	.4byte	0xe1ec
 	.uleb128 0x50
-	.4byte	.LASF3018
+	.4byte	.LASF3022
 	.byte	0x1
-	.2byte	0x856
+	.2byte	0x899
 	.4byte	0xc6
-	.8byte	.LFB2843
-	.8byte	.LFE2843-.LFB2843
+	.8byte	.LFB2848
+	.8byte	.LFE2848-.LFB2848
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe817
+	.4byte	0xe839
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x856
-	.4byte	0xa545
-	.4byte	.LLST118
+	.2byte	0x899
+	.4byte	0xa55b
+	.4byte	.LLST139
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x858
-	.4byte	0xe45b
+	.2byte	0x89b
+	.4byte	0xe47d
 	.uleb128 0x46
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x859
-	.4byte	0xe70a
+	.2byte	0x89c
+	.4byte	0xe72c
 	.uleb128 0x55
-	.4byte	.LASF3019
-	.4byte	0xe827
+	.4byte	.LASF3023
+	.4byte	0xe849
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35129
+	.8byte	__func__.35204
 	.uleb128 0x53
-	.4byte	0x131ec
-	.8byte	.LBB1295
-	.8byte	.LBE1295-.LBB1295
+	.4byte	0x13367
+	.8byte	.LBB1404
+	.8byte	.LBE1404-.LBB1404
 	.byte	0x1
-	.2byte	0x858
-	.4byte	0xe78f
+	.2byte	0x89b
+	.4byte	0xe7b1
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x13378
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12df5
-	.8byte	.LBB1297
-	.8byte	.LBE1297-.LBB1297
+	.4byte	0x12f70
+	.8byte	.LBB1406
+	.8byte	.LBE1406-.LBB1406
 	.byte	0x1
-	.2byte	0x861
-	.4byte	0xe7b1
+	.2byte	0x8a4
+	.4byte	0xe7d3
 	.uleb128 0x54
-	.4byte	0x12e01
+	.4byte	0x12f7c
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12b43
-	.8byte	.LBB1299
-	.8byte	.LBE1299-.LBB1299
+	.4byte	0x12cbe
+	.8byte	.LBB1408
+	.8byte	.LBE1408-.LBB1408
 	.byte	0x1
-	.2byte	0x85d
-	.4byte	0xe7fc
+	.2byte	0x8a0
+	.4byte	0xe81e
 	.uleb128 0x54
-	.4byte	0x12b5e
+	.4byte	0x12cd9
 	.uleb128 0x54
-	.4byte	0x12b53
+	.4byte	0x12cce
 	.uleb128 0x56
-	.8byte	.LBB1300
-	.8byte	.LBE1300-.LBB1300
+	.8byte	.LBB1409
+	.8byte	.LBE1409-.LBB1409
 	.uleb128 0x57
-	.4byte	0x12b69
+	.4byte	0x12ce4
 	.uleb128 0x4e
-	.8byte	.LVL450
-	.4byte	0x139cd
+	.8byte	.LVL472
+	.4byte	0x13e06
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL448
-	.4byte	0x13b55
+	.8byte	.LVL470
+	.4byte	0x13f8e
 	.uleb128 0x4e
-	.8byte	.LVL449
-	.4byte	0x13b55
+	.8byte	.LVL471
+	.4byte	0x13f8e
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xe827
+	.4byte	0xe849
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xb
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe817
+	.4byte	0xe839
 	.uleb128 0x4f
-	.4byte	.LASF3020
+	.4byte	.LASF3024
 	.byte	0x1
-	.2byte	0x84f
+	.2byte	0x892
 	.4byte	0xc6
-	.8byte	.LFB2842
-	.8byte	.LFE2842-.LFB2842
+	.8byte	.LFB2847
+	.8byte	.LFE2847-.LFB2847
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe86c
+	.4byte	0xe88e
 	.uleb128 0x58
-	.4byte	.LASF3021
+	.4byte	.LASF3025
 	.byte	0x1
-	.2byte	0x84f
-	.4byte	0xd6e9
+	.2byte	0x892
+	.4byte	0xd6ff
 	.4byte	.LLST9
 	.uleb128 0x4e
 	.8byte	.LVL44
-	.4byte	0x13b62
+	.4byte	0x13f9b
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3022
+	.4byte	.LASF3026
 	.byte	0x1
-	.2byte	0x7e3
+	.2byte	0x825
 	.4byte	0xc6
-	.8byte	.LFB2841
-	.8byte	.LFE2841-.LFB2841
+	.8byte	.LFB2846
+	.8byte	.LFE2846-.LFB2846
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfc59
+	.4byte	0xfc7b
 	.uleb128 0x58
-	.4byte	.LASF3021
+	.4byte	.LASF3025
 	.byte	0x1
-	.2byte	0x7e3
-	.4byte	0xd6e9
-	.4byte	.LLST119
+	.2byte	0x825
+	.4byte	0xd6ff
+	.4byte	.LLST140
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x7e5
-	.4byte	0xa545
+	.2byte	0x827
+	.4byte	0xa55b
 	.uleb128 0x46
-	.4byte	.LASF3023
+	.4byte	.LASF3027
 	.byte	0x1
-	.2byte	0x7e6
-	.4byte	0xb869
+	.2byte	0x828
+	.4byte	0xb87f
 	.uleb128 0x59
-	.4byte	.LASF3024
+	.4byte	.LASF3028
 	.byte	0x1
-	.2byte	0x7e7
-	.4byte	0xd6e9
-	.4byte	.LLST120
+	.2byte	0x829
+	.4byte	0xd6ff
+	.4byte	.LLST141
 	.uleb128 0x46
-	.4byte	.LASF3025
+	.4byte	.LASF3029
 	.byte	0x1
-	.2byte	0x7e8
-	.4byte	0xb869
+	.2byte	0x82a
+	.4byte	0xb87f
 	.uleb128 0x59
-	.4byte	.LASF3026
+	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0x7e9
-	.4byte	0xc012
-	.4byte	.LLST121
+	.2byte	0x82b
+	.4byte	0xc028
+	.4byte	.LLST142
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x7ea
-	.4byte	0xe45b
+	.2byte	0x82c
+	.4byte	0xe47d
 	.uleb128 0x59
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x7eb
-	.4byte	0xe70a
-	.4byte	.LLST122
+	.2byte	0x82d
+	.4byte	0xe72c
+	.4byte	.LLST143
 	.uleb128 0x46
-	.4byte	.LASF2994
+	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x7ec
-	.4byte	0xe11d
+	.2byte	0x82e
+	.4byte	0xe13f
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x7ed
+	.2byte	0x82f
 	.4byte	0xc6
 	.uleb128 0x5a
-	.4byte	0x1320a
-	.8byte	.LBB1446
-	.4byte	.Ldebug_ranges0+0x9b0
+	.4byte	0x13385
+	.8byte	.LBB1555
+	.4byte	.Ldebug_ranges0+0xba0
 	.byte	0x1
-	.2byte	0x7ef
-	.4byte	0xe94b
+	.2byte	0x831
+	.4byte	0xe96d
 	.uleb128 0x54
-	.4byte	0x13233
+	.4byte	0x133ae
 	.uleb128 0x54
-	.4byte	0x13227
+	.4byte	0x133a2
 	.uleb128 0x54
-	.4byte	0x1321b
+	.4byte	0x13396
 	.uleb128 0x4e
-	.8byte	.LVL453
-	.4byte	0x13b6e
+	.8byte	.LVL475
+	.4byte	0x13fa7
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x130e7
-	.8byte	.LBB1450
-	.8byte	.LBE1450-.LBB1450
+	.4byte	0x13262
+	.8byte	.LBB1559
+	.8byte	.LBE1559-.LBB1559
 	.byte	0x1
-	.2byte	0x801
-	.4byte	0xe98a
+	.2byte	0x843
+	.4byte	0xe9ac
 	.uleb128 0x54
-	.4byte	0x130f7
+	.4byte	0x13272
 	.uleb128 0x5b
-	.4byte	0x131ec
-	.8byte	.LBB1451
-	.8byte	.LBE1451-.LBB1451
+	.4byte	0x13367
+	.8byte	.LBB1560
+	.8byte	.LBE1560-.LBB1560
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x13378
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13109
-	.8byte	.LBB1453
-	.8byte	.LBE1453-.LBB1453
+	.4byte	0x13284
+	.8byte	.LBB1562
+	.8byte	.LBE1562-.LBB1562
 	.byte	0x1
-	.2byte	0x812
-	.4byte	0xe9ca
+	.2byte	0x854
+	.4byte	0xe9ec
 	.uleb128 0x54
-	.4byte	0x1311a
+	.4byte	0x13295
 	.uleb128 0x5c
-	.4byte	0x131ec
-	.8byte	.LBB1454
-	.8byte	.LBE1454-.LBB1454
+	.4byte	0x13367
+	.8byte	.LBB1563
+	.8byte	.LBE1563-.LBB1563
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x13378
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x1158a
-	.8byte	.LBB1456
-	.4byte	.Ldebug_ranges0+0x9e0
+	.4byte	0x115ac
+	.8byte	.LBB1565
+	.4byte	.Ldebug_ranges0+0xbd0
 	.byte	0x1
-	.2byte	0x820
-	.4byte	0xf383
+	.2byte	0x862
+	.4byte	0xf3a5
 	.uleb128 0x54
-	.4byte	0x1159b
+	.4byte	0x115bd
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0x9e0
+	.4byte	.Ldebug_ranges0+0xbd0
 	.uleb128 0x57
-	.4byte	0x115a7
+	.4byte	0x115c9
 	.uleb128 0x5a
-	.4byte	0x1312d
-	.8byte	.LBB1458
-	.4byte	.Ldebug_ranges0+0xa40
+	.4byte	0x132a8
+	.8byte	.LBB1567
+	.4byte	.Ldebug_ranges0+0xc30
 	.byte	0x1
-	.2byte	0x554
-	.4byte	0xea5a
+	.2byte	0x596
+	.4byte	0xea7c
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x132d0
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x132c4
 	.uleb128 0x54
-	.4byte	0x1313e
+	.4byte	0x132b9
 	.uleb128 0x5e
-	.4byte	0x13162
-	.8byte	.LBB1459
-	.4byte	.Ldebug_ranges0+0xa40
+	.4byte	0x132dd
+	.8byte	.LBB1568
+	.4byte	.Ldebug_ranges0+0xc30
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13196
+	.4byte	0x13311
 	.uleb128 0x54
-	.4byte	0x1318a
+	.4byte	0x13305
 	.uleb128 0x54
-	.4byte	0x1317e
+	.4byte	0x132f9
 	.uleb128 0x54
-	.4byte	0x13173
+	.4byte	0x132ee
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xa40
+	.4byte	.Ldebug_ranges0+0xc30
 	.uleb128 0x57
-	.4byte	0x131a1
+	.4byte	0x1331c
 	.uleb128 0x4e
-	.8byte	.LVL461
-	.4byte	0x13b7b
+	.8byte	.LVL483
+	.4byte	0x13fb4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1312d
-	.8byte	.LBB1470
-	.8byte	.LBE1470-.LBB1470
+	.4byte	0x132a8
+	.8byte	.LBB1579
+	.8byte	.LBE1579-.LBB1579
 	.byte	0x1
-	.2byte	0x557
-	.4byte	0xead7
+	.2byte	0x599
+	.4byte	0xeaf9
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x132d0
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x132c4
 	.uleb128 0x54
-	.4byte	0x1313e
+	.4byte	0x132b9
 	.uleb128 0x5c
-	.4byte	0x13162
-	.8byte	.LBB1471
-	.8byte	.LBE1471-.LBB1471
+	.4byte	0x132dd
+	.8byte	.LBB1580
+	.8byte	.LBE1580-.LBB1580
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13196
+	.4byte	0x13311
 	.uleb128 0x54
-	.4byte	0x1318a
+	.4byte	0x13305
 	.uleb128 0x54
-	.4byte	0x1317e
+	.4byte	0x132f9
 	.uleb128 0x54
-	.4byte	0x13173
+	.4byte	0x132ee
 	.uleb128 0x56
-	.8byte	.LBB1472
-	.8byte	.LBE1472-.LBB1472
+	.8byte	.LBB1581
+	.8byte	.LBE1581-.LBB1581
 	.uleb128 0x57
-	.4byte	0x131a1
+	.4byte	0x1331c
 	.uleb128 0x4e
-	.8byte	.LVL462
-	.4byte	0x13b7b
+	.8byte	.LVL484
+	.4byte	0x13fb4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1312d
-	.8byte	.LBB1473
-	.8byte	.LBE1473-.LBB1473
+	.4byte	0x132a8
+	.8byte	.LBB1582
+	.8byte	.LBE1582-.LBB1582
 	.byte	0x1
-	.2byte	0x55a
-	.4byte	0xeb54
+	.2byte	0x59c
+	.4byte	0xeb76
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x132d0
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x132c4
 	.uleb128 0x54
-	.4byte	0x1313e
+	.4byte	0x132b9
 	.uleb128 0x5c
-	.4byte	0x13162
-	.8byte	.LBB1474
-	.8byte	.LBE1474-.LBB1474
+	.4byte	0x132dd
+	.8byte	.LBB1583
+	.8byte	.LBE1583-.LBB1583
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13196
+	.4byte	0x13311
 	.uleb128 0x54
-	.4byte	0x1318a
+	.4byte	0x13305
 	.uleb128 0x54
-	.4byte	0x1317e
+	.4byte	0x132f9
 	.uleb128 0x54
-	.4byte	0x13173
+	.4byte	0x132ee
 	.uleb128 0x56
-	.8byte	.LBB1475
-	.8byte	.LBE1475-.LBB1475
+	.8byte	.LBB1584
+	.8byte	.LBE1584-.LBB1584
 	.uleb128 0x57
-	.4byte	0x131a1
+	.4byte	0x1331c
 	.uleb128 0x4e
-	.8byte	.LVL463
-	.4byte	0x13b7b
+	.8byte	.LVL485
+	.4byte	0x13fb4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1312d
-	.8byte	.LBB1476
-	.8byte	.LBE1476-.LBB1476
+	.4byte	0x132a8
+	.8byte	.LBB1585
+	.8byte	.LBE1585-.LBB1585
 	.byte	0x1
-	.2byte	0x55d
-	.4byte	0xebd1
+	.2byte	0x59f
+	.4byte	0xebf3
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x132d0
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x132c4
 	.uleb128 0x54
-	.4byte	0x1313e
+	.4byte	0x132b9
 	.uleb128 0x5c
-	.4byte	0x13162
-	.8byte	.LBB1477
-	.8byte	.LBE1477-.LBB1477
+	.4byte	0x132dd
+	.8byte	.LBB1586
+	.8byte	.LBE1586-.LBB1586
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13196
+	.4byte	0x13311
 	.uleb128 0x54
-	.4byte	0x1318a
+	.4byte	0x13305
 	.uleb128 0x54
-	.4byte	0x1317e
+	.4byte	0x132f9
 	.uleb128 0x54
-	.4byte	0x13173
+	.4byte	0x132ee
 	.uleb128 0x56
-	.8byte	.LBB1478
-	.8byte	.LBE1478-.LBB1478
+	.8byte	.LBB1587
+	.8byte	.LBE1587-.LBB1587
 	.uleb128 0x57
-	.4byte	0x131a1
+	.4byte	0x1331c
 	.uleb128 0x4e
-	.8byte	.LVL464
-	.4byte	0x13b7b
+	.8byte	.LVL486
+	.4byte	0x13fb4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1312d
-	.8byte	.LBB1479
-	.8byte	.LBE1479-.LBB1479
+	.4byte	0x132a8
+	.8byte	.LBB1588
+	.8byte	.LBE1588-.LBB1588
 	.byte	0x1
-	.2byte	0x560
-	.4byte	0xec4e
+	.2byte	0x5a2
+	.4byte	0xec70
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x132d0
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x132c4
 	.uleb128 0x54
-	.4byte	0x1313e
+	.4byte	0x132b9
 	.uleb128 0x5c
-	.4byte	0x13162
-	.8byte	.LBB1480
-	.8byte	.LBE1480-.LBB1480
+	.4byte	0x132dd
+	.8byte	.LBB1589
+	.8byte	.LBE1589-.LBB1589
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13196
+	.4byte	0x13311
 	.uleb128 0x54
-	.4byte	0x1318a
+	.4byte	0x13305
 	.uleb128 0x54
-	.4byte	0x1317e
+	.4byte	0x132f9
 	.uleb128 0x54
-	.4byte	0x13173
+	.4byte	0x132ee
 	.uleb128 0x56
-	.8byte	.LBB1481
-	.8byte	.LBE1481-.LBB1481
+	.8byte	.LBB1590
+	.8byte	.LBE1590-.LBB1590
 	.uleb128 0x57
-	.4byte	0x131a1
+	.4byte	0x1331c
 	.uleb128 0x4e
-	.8byte	.LVL465
-	.4byte	0x13b7b
+	.8byte	.LVL487
+	.4byte	0x13fb4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1312d
-	.8byte	.LBB1482
-	.8byte	.LBE1482-.LBB1482
+	.4byte	0x132a8
+	.8byte	.LBB1591
+	.8byte	.LBE1591-.LBB1591
 	.byte	0x1
-	.2byte	0x563
-	.4byte	0xeccb
+	.2byte	0x5a5
+	.4byte	0xeced
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x132d0
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x132c4
 	.uleb128 0x54
-	.4byte	0x1313e
+	.4byte	0x132b9
 	.uleb128 0x5c
-	.4byte	0x13162
-	.8byte	.LBB1483
-	.8byte	.LBE1483-.LBB1483
+	.4byte	0x132dd
+	.8byte	.LBB1592
+	.8byte	.LBE1592-.LBB1592
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13196
+	.4byte	0x13311
 	.uleb128 0x54
-	.4byte	0x1318a
+	.4byte	0x13305
 	.uleb128 0x54
-	.4byte	0x1317e
+	.4byte	0x132f9
 	.uleb128 0x54
-	.4byte	0x13173
+	.4byte	0x132ee
 	.uleb128 0x56
-	.8byte	.LBB1484
-	.8byte	.LBE1484-.LBB1484
+	.8byte	.LBB1593
+	.8byte	.LBE1593-.LBB1593
 	.uleb128 0x57
-	.4byte	0x131a1
+	.4byte	0x1331c
 	.uleb128 0x4e
-	.8byte	.LVL466
-	.4byte	0x13b7b
+	.8byte	.LVL488
+	.4byte	0x13fb4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1312d
-	.8byte	.LBB1485
-	.8byte	.LBE1485-.LBB1485
+	.4byte	0x132a8
+	.8byte	.LBB1594
+	.8byte	.LBE1594-.LBB1594
 	.byte	0x1
-	.2byte	0x566
-	.4byte	0xed48
+	.2byte	0x5a8
+	.4byte	0xed6a
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x132d0
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x132c4
 	.uleb128 0x54
-	.4byte	0x1313e
+	.4byte	0x132b9
 	.uleb128 0x5c
-	.4byte	0x13162
-	.8byte	.LBB1486
-	.8byte	.LBE1486-.LBB1486
+	.4byte	0x132dd
+	.8byte	.LBB1595
+	.8byte	.LBE1595-.LBB1595
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13196
+	.4byte	0x13311
 	.uleb128 0x54
-	.4byte	0x1318a
+	.4byte	0x13305
 	.uleb128 0x54
-	.4byte	0x1317e
+	.4byte	0x132f9
 	.uleb128 0x54
-	.4byte	0x13173
+	.4byte	0x132ee
 	.uleb128 0x56
-	.8byte	.LBB1487
-	.8byte	.LBE1487-.LBB1487
+	.8byte	.LBB1596
+	.8byte	.LBE1596-.LBB1596
 	.uleb128 0x57
-	.4byte	0x131a1
+	.4byte	0x1331c
 	.uleb128 0x4e
-	.8byte	.LVL467
-	.4byte	0x13b7b
+	.8byte	.LVL489
+	.4byte	0x13fb4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1312d
-	.8byte	.LBB1488
-	.8byte	.LBE1488-.LBB1488
+	.4byte	0x132a8
+	.8byte	.LBB1597
+	.8byte	.LBE1597-.LBB1597
 	.byte	0x1
-	.2byte	0x569
-	.4byte	0xedc5
+	.2byte	0x5ab
+	.4byte	0xede7
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x132d0
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x132c4
 	.uleb128 0x54
-	.4byte	0x1313e
+	.4byte	0x132b9
 	.uleb128 0x5c
-	.4byte	0x13162
-	.8byte	.LBB1489
-	.8byte	.LBE1489-.LBB1489
+	.4byte	0x132dd
+	.8byte	.LBB1598
+	.8byte	.LBE1598-.LBB1598
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13196
+	.4byte	0x13311
 	.uleb128 0x54
-	.4byte	0x1318a
+	.4byte	0x13305
 	.uleb128 0x54
-	.4byte	0x1317e
+	.4byte	0x132f9
 	.uleb128 0x54
-	.4byte	0x13173
+	.4byte	0x132ee
 	.uleb128 0x56
-	.8byte	.LBB1490
-	.8byte	.LBE1490-.LBB1490
+	.8byte	.LBB1599
+	.8byte	.LBE1599-.LBB1599
 	.uleb128 0x57
-	.4byte	0x131a1
+	.4byte	0x1331c
 	.uleb128 0x4e
-	.8byte	.LVL468
-	.4byte	0x13b7b
+	.8byte	.LVL490
+	.4byte	0x13fb4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1312d
-	.8byte	.LBB1491
-	.8byte	.LBE1491-.LBB1491
+	.4byte	0x132a8
+	.8byte	.LBB1600
+	.8byte	.LBE1600-.LBB1600
 	.byte	0x1
-	.2byte	0x56c
-	.4byte	0xee42
+	.2byte	0x5ae
+	.4byte	0xee64
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x132d0
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x132c4
 	.uleb128 0x54
-	.4byte	0x1313e
+	.4byte	0x132b9
 	.uleb128 0x5c
-	.4byte	0x13162
-	.8byte	.LBB1492
-	.8byte	.LBE1492-.LBB1492
+	.4byte	0x132dd
+	.8byte	.LBB1601
+	.8byte	.LBE1601-.LBB1601
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13196
+	.4byte	0x13311
 	.uleb128 0x54
-	.4byte	0x1318a
+	.4byte	0x13305
 	.uleb128 0x54
-	.4byte	0x1317e
+	.4byte	0x132f9
 	.uleb128 0x54
-	.4byte	0x13173
+	.4byte	0x132ee
 	.uleb128 0x56
-	.8byte	.LBB1493
-	.8byte	.LBE1493-.LBB1493
+	.8byte	.LBB1602
+	.8byte	.LBE1602-.LBB1602
 	.uleb128 0x57
-	.4byte	0x131a1
+	.4byte	0x1331c
 	.uleb128 0x4e
-	.8byte	.LVL469
-	.4byte	0x13b7b
+	.8byte	.LVL491
+	.4byte	0x13fb4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1312d
-	.8byte	.LBB1494
-	.8byte	.LBE1494-.LBB1494
+	.4byte	0x132a8
+	.8byte	.LBB1603
+	.8byte	.LBE1603-.LBB1603
 	.byte	0x1
-	.2byte	0x56f
-	.4byte	0xeebf
+	.2byte	0x5b1
+	.4byte	0xeee1
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x132d0
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x132c4
 	.uleb128 0x54
-	.4byte	0x1313e
+	.4byte	0x132b9
 	.uleb128 0x5c
-	.4byte	0x13162
-	.8byte	.LBB1495
-	.8byte	.LBE1495-.LBB1495
+	.4byte	0x132dd
+	.8byte	.LBB1604
+	.8byte	.LBE1604-.LBB1604
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13196
+	.4byte	0x13311
 	.uleb128 0x54
-	.4byte	0x1318a
+	.4byte	0x13305
 	.uleb128 0x54
-	.4byte	0x1317e
+	.4byte	0x132f9
 	.uleb128 0x54
-	.4byte	0x13173
+	.4byte	0x132ee
 	.uleb128 0x56
-	.8byte	.LBB1496
-	.8byte	.LBE1496-.LBB1496
+	.8byte	.LBB1605
+	.8byte	.LBE1605-.LBB1605
 	.uleb128 0x57
-	.4byte	0x131a1
+	.4byte	0x1331c
 	.uleb128 0x4e
-	.8byte	.LVL470
-	.4byte	0x13b7b
+	.8byte	.LVL492
+	.4byte	0x13fb4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1312d
-	.8byte	.LBB1497
-	.8byte	.LBE1497-.LBB1497
+	.4byte	0x132a8
+	.8byte	.LBB1606
+	.8byte	.LBE1606-.LBB1606
 	.byte	0x1
-	.2byte	0x572
-	.4byte	0xef3c
+	.2byte	0x5b4
+	.4byte	0xef5e
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x132d0
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x132c4
 	.uleb128 0x54
-	.4byte	0x1313e
+	.4byte	0x132b9
 	.uleb128 0x5c
-	.4byte	0x13162
-	.8byte	.LBB1498
-	.8byte	.LBE1498-.LBB1498
+	.4byte	0x132dd
+	.8byte	.LBB1607
+	.8byte	.LBE1607-.LBB1607
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13196
+	.4byte	0x13311
 	.uleb128 0x54
-	.4byte	0x1318a
+	.4byte	0x13305
 	.uleb128 0x54
-	.4byte	0x1317e
+	.4byte	0x132f9
 	.uleb128 0x54
-	.4byte	0x13173
+	.4byte	0x132ee
 	.uleb128 0x56
-	.8byte	.LBB1499
-	.8byte	.LBE1499-.LBB1499
+	.8byte	.LBB1608
+	.8byte	.LBE1608-.LBB1608
 	.uleb128 0x57
-	.4byte	0x131a1
+	.4byte	0x1331c
 	.uleb128 0x4e
-	.8byte	.LVL471
-	.4byte	0x13b7b
+	.8byte	.LVL493
+	.4byte	0x13fb4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1312d
-	.8byte	.LBB1500
-	.8byte	.LBE1500-.LBB1500
+	.4byte	0x132a8
+	.8byte	.LBB1609
+	.8byte	.LBE1609-.LBB1609
 	.byte	0x1
-	.2byte	0x575
-	.4byte	0xefb9
+	.2byte	0x5b7
+	.4byte	0xefdb
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x132d0
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x132c4
 	.uleb128 0x54
-	.4byte	0x1313e
+	.4byte	0x132b9
 	.uleb128 0x5c
-	.4byte	0x13162
-	.8byte	.LBB1501
-	.8byte	.LBE1501-.LBB1501
+	.4byte	0x132dd
+	.8byte	.LBB1610
+	.8byte	.LBE1610-.LBB1610
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13196
+	.4byte	0x13311
 	.uleb128 0x54
-	.4byte	0x1318a
+	.4byte	0x13305
 	.uleb128 0x54
-	.4byte	0x1317e
+	.4byte	0x132f9
 	.uleb128 0x54
-	.4byte	0x13173
+	.4byte	0x132ee
 	.uleb128 0x56
-	.8byte	.LBB1502
-	.8byte	.LBE1502-.LBB1502
+	.8byte	.LBB1611
+	.8byte	.LBE1611-.LBB1611
 	.uleb128 0x57
-	.4byte	0x131a1
+	.4byte	0x1331c
 	.uleb128 0x4e
-	.8byte	.LVL472
-	.4byte	0x13b7b
+	.8byte	.LVL494
+	.4byte	0x13fb4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1312d
-	.8byte	.LBB1503
-	.8byte	.LBE1503-.LBB1503
+	.4byte	0x132a8
+	.8byte	.LBB1612
+	.8byte	.LBE1612-.LBB1612
 	.byte	0x1
-	.2byte	0x578
-	.4byte	0xf036
+	.2byte	0x5ba
+	.4byte	0xf058
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x132d0
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x132c4
 	.uleb128 0x54
-	.4byte	0x1313e
+	.4byte	0x132b9
 	.uleb128 0x5c
-	.4byte	0x13162
-	.8byte	.LBB1504
-	.8byte	.LBE1504-.LBB1504
+	.4byte	0x132dd
+	.8byte	.LBB1613
+	.8byte	.LBE1613-.LBB1613
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13196
+	.4byte	0x13311
 	.uleb128 0x54
-	.4byte	0x1318a
+	.4byte	0x13305
 	.uleb128 0x54
-	.4byte	0x1317e
+	.4byte	0x132f9
 	.uleb128 0x54
-	.4byte	0x13173
+	.4byte	0x132ee
 	.uleb128 0x56
-	.8byte	.LBB1505
-	.8byte	.LBE1505-.LBB1505
+	.8byte	.LBB1614
+	.8byte	.LBE1614-.LBB1614
 	.uleb128 0x57
-	.4byte	0x131a1
+	.4byte	0x1331c
 	.uleb128 0x4e
-	.8byte	.LVL473
-	.4byte	0x13b7b
+	.8byte	.LVL495
+	.4byte	0x13fb4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1312d
-	.8byte	.LBB1506
-	.8byte	.LBE1506-.LBB1506
+	.4byte	0x132a8
+	.8byte	.LBB1615
+	.8byte	.LBE1615-.LBB1615
 	.byte	0x1
-	.2byte	0x57b
-	.4byte	0xf0b3
+	.2byte	0x5bd
+	.4byte	0xf0d5
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x132d0
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x132c4
 	.uleb128 0x54
-	.4byte	0x1313e
+	.4byte	0x132b9
 	.uleb128 0x5c
-	.4byte	0x13162
-	.8byte	.LBB1507
-	.8byte	.LBE1507-.LBB1507
+	.4byte	0x132dd
+	.8byte	.LBB1616
+	.8byte	.LBE1616-.LBB1616
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13196
+	.4byte	0x13311
 	.uleb128 0x54
-	.4byte	0x1318a
+	.4byte	0x13305
 	.uleb128 0x54
-	.4byte	0x1317e
+	.4byte	0x132f9
 	.uleb128 0x54
-	.4byte	0x13173
+	.4byte	0x132ee
 	.uleb128 0x56
-	.8byte	.LBB1508
-	.8byte	.LBE1508-.LBB1508
+	.8byte	.LBB1617
+	.8byte	.LBE1617-.LBB1617
 	.uleb128 0x57
-	.4byte	0x131a1
+	.4byte	0x1331c
 	.uleb128 0x4e
-	.8byte	.LVL474
-	.4byte	0x13b7b
+	.8byte	.LVL496
+	.4byte	0x13fb4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1312d
-	.8byte	.LBB1509
-	.8byte	.LBE1509-.LBB1509
+	.4byte	0x132a8
+	.8byte	.LBB1618
+	.8byte	.LBE1618-.LBB1618
 	.byte	0x1
-	.2byte	0x57e
-	.4byte	0xf130
+	.2byte	0x5c0
+	.4byte	0xf152
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x132d0
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x132c4
 	.uleb128 0x54
-	.4byte	0x1313e
+	.4byte	0x132b9
 	.uleb128 0x5c
-	.4byte	0x13162
-	.8byte	.LBB1510
-	.8byte	.LBE1510-.LBB1510
+	.4byte	0x132dd
+	.8byte	.LBB1619
+	.8byte	.LBE1619-.LBB1619
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13196
+	.4byte	0x13311
 	.uleb128 0x54
-	.4byte	0x1318a
+	.4byte	0x13305
 	.uleb128 0x54
-	.4byte	0x1317e
+	.4byte	0x132f9
 	.uleb128 0x54
-	.4byte	0x13173
+	.4byte	0x132ee
 	.uleb128 0x56
-	.8byte	.LBB1511
-	.8byte	.LBE1511-.LBB1511
+	.8byte	.LBB1620
+	.8byte	.LBE1620-.LBB1620
 	.uleb128 0x57
-	.4byte	0x131a1
+	.4byte	0x1331c
 	.uleb128 0x4e
-	.8byte	.LVL475
-	.4byte	0x13b7b
+	.8byte	.LVL497
+	.4byte	0x13fb4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1312d
-	.8byte	.LBB1512
-	.8byte	.LBE1512-.LBB1512
+	.4byte	0x132a8
+	.8byte	.LBB1621
+	.8byte	.LBE1621-.LBB1621
 	.byte	0x1
-	.2byte	0x581
-	.4byte	0xf1ad
+	.2byte	0x5c3
+	.4byte	0xf1cf
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x132d0
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x132c4
 	.uleb128 0x54
-	.4byte	0x1313e
+	.4byte	0x132b9
 	.uleb128 0x5c
-	.4byte	0x13162
-	.8byte	.LBB1513
-	.8byte	.LBE1513-.LBB1513
+	.4byte	0x132dd
+	.8byte	.LBB1622
+	.8byte	.LBE1622-.LBB1622
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13196
+	.4byte	0x13311
 	.uleb128 0x54
-	.4byte	0x1318a
+	.4byte	0x13305
 	.uleb128 0x54
-	.4byte	0x1317e
+	.4byte	0x132f9
 	.uleb128 0x54
-	.4byte	0x13173
+	.4byte	0x132ee
 	.uleb128 0x56
-	.8byte	.LBB1514
-	.8byte	.LBE1514-.LBB1514
+	.8byte	.LBB1623
+	.8byte	.LBE1623-.LBB1623
 	.uleb128 0x57
-	.4byte	0x131a1
+	.4byte	0x1331c
 	.uleb128 0x4e
-	.8byte	.LVL476
-	.4byte	0x13b7b
+	.8byte	.LVL498
+	.4byte	0x13fb4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x1312d
-	.8byte	.LBB1515
-	.4byte	.Ldebug_ranges0+0xa90
+	.4byte	0x132a8
+	.8byte	.LBB1624
+	.4byte	.Ldebug_ranges0+0xc80
 	.byte	0x1
-	.2byte	0x584
-	.4byte	0xf223
+	.2byte	0x5c6
+	.4byte	0xf245
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x132d0
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x132c4
 	.uleb128 0x54
-	.4byte	0x1313e
+	.4byte	0x132b9
 	.uleb128 0x5e
-	.4byte	0x13162
-	.8byte	.LBB1516
-	.4byte	.Ldebug_ranges0+0xa90
+	.4byte	0x132dd
+	.8byte	.LBB1625
+	.4byte	.Ldebug_ranges0+0xc80
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13196
+	.4byte	0x13311
 	.uleb128 0x54
-	.4byte	0x1318a
+	.4byte	0x13305
 	.uleb128 0x54
-	.4byte	0x1317e
+	.4byte	0x132f9
 	.uleb128 0x54
-	.4byte	0x13173
+	.4byte	0x132ee
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xa90
+	.4byte	.Ldebug_ranges0+0xc80
 	.uleb128 0x57
-	.4byte	0x131a1
+	.4byte	0x1331c
 	.uleb128 0x4e
-	.8byte	.LVL477
-	.4byte	0x13b7b
+	.8byte	.LVL499
+	.4byte	0x13fb4
 	.uleb128 0x4e
-	.8byte	.LVL509
-	.4byte	0x13b7b
+	.8byte	.LVL531
+	.4byte	0x13fb4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x1312d
-	.8byte	.LBB1522
-	.4byte	.Ldebug_ranges0+0xad0
+	.4byte	0x132a8
+	.8byte	.LBB1631
+	.4byte	.Ldebug_ranges0+0xcc0
 	.byte	0x1
-	.2byte	0x587
-	.4byte	0xf299
+	.2byte	0x5c9
+	.4byte	0xf2bb
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x132d0
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x132c4
 	.uleb128 0x54
-	.4byte	0x1313e
+	.4byte	0x132b9
 	.uleb128 0x5e
-	.4byte	0x13162
-	.8byte	.LBB1523
-	.4byte	.Ldebug_ranges0+0xad0
+	.4byte	0x132dd
+	.8byte	.LBB1632
+	.4byte	.Ldebug_ranges0+0xcc0
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13196
+	.4byte	0x13311
 	.uleb128 0x54
-	.4byte	0x1318a
+	.4byte	0x13305
 	.uleb128 0x54
-	.4byte	0x1317e
+	.4byte	0x132f9
 	.uleb128 0x54
-	.4byte	0x13173
+	.4byte	0x132ee
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xad0
+	.4byte	.Ldebug_ranges0+0xcc0
 	.uleb128 0x57
-	.4byte	0x131a1
+	.4byte	0x1331c
 	.uleb128 0x4e
-	.8byte	.LVL478
-	.4byte	0x13b7b
+	.8byte	.LVL500
+	.4byte	0x13fb4
 	.uleb128 0x4e
-	.8byte	.LVL508
-	.4byte	0x13b7b
+	.8byte	.LVL530
+	.4byte	0x13fb4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x1312d
-	.8byte	.LBB1529
-	.4byte	.Ldebug_ranges0+0xb10
+	.4byte	0x132a8
+	.8byte	.LBB1638
+	.4byte	.Ldebug_ranges0+0xd00
 	.byte	0x1
-	.2byte	0x58a
-	.4byte	0xf30f
+	.2byte	0x5cc
+	.4byte	0xf331
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x132d0
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x132c4
 	.uleb128 0x54
-	.4byte	0x1313e
+	.4byte	0x132b9
 	.uleb128 0x5e
-	.4byte	0x13162
-	.8byte	.LBB1530
-	.4byte	.Ldebug_ranges0+0xb10
+	.4byte	0x132dd
+	.8byte	.LBB1639
+	.4byte	.Ldebug_ranges0+0xd00
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13196
+	.4byte	0x13311
 	.uleb128 0x54
-	.4byte	0x1318a
+	.4byte	0x13305
 	.uleb128 0x54
-	.4byte	0x1317e
+	.4byte	0x132f9
 	.uleb128 0x54
-	.4byte	0x13173
+	.4byte	0x132ee
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xb10
+	.4byte	.Ldebug_ranges0+0xd00
 	.uleb128 0x57
-	.4byte	0x131a1
+	.4byte	0x1331c
 	.uleb128 0x4e
-	.8byte	.LVL479
-	.4byte	0x13b7b
+	.8byte	.LVL501
+	.4byte	0x13fb4
 	.uleb128 0x4e
-	.8byte	.LVL507
-	.4byte	0x13b7b
+	.8byte	.LVL529
+	.4byte	0x13fb4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x1312d
-	.8byte	.LBB1536
-	.4byte	.Ldebug_ranges0+0xb50
+	.4byte	0x132a8
+	.8byte	.LBB1645
+	.4byte	.Ldebug_ranges0+0xd40
 	.byte	0x1
-	.2byte	0x58d
+	.2byte	0x5cf
 	.uleb128 0x54
-	.4byte	0x13155
+	.4byte	0x132d0
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x132c4
 	.uleb128 0x54
-	.4byte	0x1313e
+	.4byte	0x132b9
 	.uleb128 0x5e
-	.4byte	0x13162
-	.8byte	.LBB1537
-	.4byte	.Ldebug_ranges0+0xb50
+	.4byte	0x132dd
+	.8byte	.LBB1646
+	.4byte	.Ldebug_ranges0+0xd40
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13196
+	.4byte	0x13311
 	.uleb128 0x54
-	.4byte	0x1318a
+	.4byte	0x13305
 	.uleb128 0x54
-	.4byte	0x1317e
+	.4byte	0x132f9
 	.uleb128 0x54
-	.4byte	0x13173
+	.4byte	0x132ee
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xb50
+	.4byte	.Ldebug_ranges0+0xd40
 	.uleb128 0x57
-	.4byte	0x131a1
+	.4byte	0x1331c
 	.uleb128 0x4e
-	.8byte	.LVL480
-	.4byte	0x13b7b
+	.8byte	.LVL502
+	.4byte	0x13fb4
 	.uleb128 0x4e
-	.8byte	.LVL506
-	.4byte	0x13b7b
+	.8byte	.LVL528
+	.4byte	0x13fb4
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0xfd4d
-	.8byte	.LBB1558
-	.4byte	.Ldebug_ranges0+0xb90
+	.4byte	0xfd6f
+	.8byte	.LBB1667
+	.4byte	.Ldebug_ranges0+0xd80
 	.byte	0x1
-	.2byte	0x82b
-	.4byte	0xf530
+	.2byte	0x86e
+	.4byte	0xf552
 	.uleb128 0x54
-	.4byte	0xfd5e
+	.4byte	0xfd80
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xb90
+	.4byte	.Ldebug_ranges0+0xd80
 	.uleb128 0x5f
-	.4byte	0xfd6a
-	.4byte	.LLST123
+	.4byte	0xfd8c
+	.4byte	.LLST144
 	.uleb128 0x57
-	.4byte	0xfd76
+	.4byte	0xfd98
 	.uleb128 0x57
-	.4byte	0xfd82
+	.4byte	0xfda4
 	.uleb128 0x57
-	.4byte	0xfd8e
+	.4byte	0xfdb0
 	.uleb128 0x60
-	.4byte	0xfd9a
+	.4byte	0xfdbc
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x57
-	.4byte	0xfda4
+	.4byte	0xfdc6
 	.uleb128 0x57
-	.4byte	0xfdb0
+	.4byte	0xfdd2
 	.uleb128 0x57
-	.4byte	0xfdbc
+	.4byte	0xfdde
 	.uleb128 0x5a
-	.4byte	0x13240
-	.8byte	.LBB1560
-	.4byte	.Ldebug_ranges0+0xc00
+	.4byte	0x133bb
+	.8byte	.LBB1669
+	.4byte	.Ldebug_ranges0+0xdf0
 	.byte	0x1
-	.2byte	0x72a
-	.4byte	0xf3f3
+	.2byte	0x76c
+	.4byte	0xf415
 	.uleb128 0x54
-	.4byte	0x13250
+	.4byte	0x133cb
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x1320a
-	.8byte	.LBB1564
-	.4byte	.Ldebug_ranges0+0xc30
+	.4byte	0x13385
+	.8byte	.LBB1673
+	.4byte	.Ldebug_ranges0+0xe20
 	.byte	0x1
-	.2byte	0x745
-	.4byte	0xf428
+	.2byte	0x787
+	.4byte	0xf44a
 	.uleb128 0x54
-	.4byte	0x13233
+	.4byte	0x133ae
 	.uleb128 0x54
-	.4byte	0x13227
+	.4byte	0x133a2
 	.uleb128 0x54
-	.4byte	0x1321b
+	.4byte	0x13396
 	.uleb128 0x4e
-	.8byte	.LVL486
-	.4byte	0x13b6e
+	.8byte	.LVL508
+	.4byte	0x13fa7
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1320a
-	.8byte	.LBB1572
-	.8byte	.LBE1572-.LBB1572
+	.4byte	0x13385
+	.8byte	.LBB1681
+	.8byte	.LBE1681-.LBB1681
 	.byte	0x1
-	.2byte	0x748
-	.4byte	0xf461
+	.2byte	0x78a
+	.4byte	0xf483
 	.uleb128 0x54
-	.4byte	0x13233
+	.4byte	0x133ae
 	.uleb128 0x54
-	.4byte	0x13227
+	.4byte	0x133a2
 	.uleb128 0x54
-	.4byte	0x1321b
+	.4byte	0x13396
 	.uleb128 0x4e
-	.8byte	.LVL487
-	.4byte	0x13b6e
+	.8byte	.LVL509
+	.4byte	0x13fa7
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1320a
-	.8byte	.LBB1574
-	.8byte	.LBE1574-.LBB1574
+	.4byte	0x13385
+	.8byte	.LBB1683
+	.8byte	.LBE1683-.LBB1683
 	.byte	0x1
-	.2byte	0x74b
-	.4byte	0xf49a
+	.2byte	0x78d
+	.4byte	0xf4bc
 	.uleb128 0x54
-	.4byte	0x13233
+	.4byte	0x133ae
 	.uleb128 0x54
-	.4byte	0x13227
+	.4byte	0x133a2
 	.uleb128 0x54
-	.4byte	0x1321b
+	.4byte	0x13396
 	.uleb128 0x4e
-	.8byte	.LVL488
-	.4byte	0x13b6e
+	.8byte	.LVL510
+	.4byte	0x13fa7
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1320a
-	.8byte	.LBB1576
-	.8byte	.LBE1576-.LBB1576
+	.4byte	0x13385
+	.8byte	.LBB1685
+	.8byte	.LBE1685-.LBB1685
 	.byte	0x1
-	.2byte	0x753
-	.4byte	0xf4d3
+	.2byte	0x795
+	.4byte	0xf4f5
 	.uleb128 0x54
-	.4byte	0x13233
+	.4byte	0x133ae
 	.uleb128 0x54
-	.4byte	0x13227
+	.4byte	0x133a2
 	.uleb128 0x54
-	.4byte	0x1321b
+	.4byte	0x13396
 	.uleb128 0x4e
-	.8byte	.LVL489
-	.4byte	0x13b6e
+	.8byte	.LVL511
+	.4byte	0x13fa7
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL482
-	.4byte	0x13b88
+	.8byte	.LVL504
+	.4byte	0x13fc1
 	.uleb128 0x4e
-	.8byte	.LVL483
-	.4byte	0x13b95
+	.8byte	.LVL505
+	.4byte	0x13fce
 	.uleb128 0x4e
-	.8byte	.LVL484
-	.4byte	0x13ba1
+	.8byte	.LVL506
+	.4byte	0x13fda
 	.uleb128 0x4e
-	.8byte	.LVL485
-	.4byte	0x13bad
+	.8byte	.LVL507
+	.4byte	0x13fe6
 	.uleb128 0x4e
-	.8byte	.LVL490
-	.4byte	0x13bb9
+	.8byte	.LVL512
+	.4byte	0x13ff2
 	.uleb128 0x4e
-	.8byte	.LVL491
-	.4byte	0x13bc3
+	.8byte	.LVL513
+	.4byte	0x13ffc
 	.uleb128 0x4e
-	.8byte	.LVL503
-	.4byte	0x13bcf
+	.8byte	.LVL525
+	.4byte	0x14008
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0xfdc7
-	.8byte	.LBB1585
-	.4byte	.Ldebug_ranges0+0xc80
+	.4byte	0xfde9
+	.8byte	.LBB1694
+	.4byte	.Ldebug_ranges0+0xe70
 	.byte	0x1
-	.2byte	0x832
-	.4byte	0xf612
+	.2byte	0x875
+	.4byte	0xf634
 	.uleb128 0x54
-	.4byte	0xfdd8
+	.4byte	0xfdfa
 	.uleb128 0x54
-	.4byte	0xfdd8
+	.4byte	0xfdfa
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xc80
+	.4byte	.Ldebug_ranges0+0xe70
 	.uleb128 0x57
-	.4byte	0xfde4
+	.4byte	0xfe06
 	.uleb128 0x5f
-	.4byte	0xfdf0
-	.4byte	.LLST124
+	.4byte	0xfe12
+	.4byte	.LLST145
 	.uleb128 0x57
-	.4byte	0xfdfc
+	.4byte	0xfe1e
 	.uleb128 0x60
-	.4byte	0xfe08
+	.4byte	0xfe2a
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5f
-	.4byte	0xfe12
-	.4byte	.LLST125
+	.4byte	0xfe34
+	.4byte	.LLST146
 	.uleb128 0x57
-	.4byte	0xfe1e
+	.4byte	0xfe40
 	.uleb128 0x57
-	.4byte	0xfe2a
+	.4byte	0xfe4c
 	.uleb128 0x53
-	.4byte	0x13240
-	.8byte	.LBB1587
-	.8byte	.LBE1587-.LBB1587
+	.4byte	0x133bb
+	.8byte	.LBB1696
+	.8byte	.LBE1696-.LBB1696
 	.byte	0x1
-	.2byte	0x6fd
-	.4byte	0xf5a8
+	.2byte	0x73f
+	.4byte	0xf5ca
 	.uleb128 0x54
-	.4byte	0x13250
+	.4byte	0x133cb
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL493
-	.4byte	0x13b88
+	.8byte	.LVL515
+	.4byte	0x13fc1
 	.uleb128 0x4e
-	.8byte	.LVL494
-	.4byte	0x13b95
+	.8byte	.LVL516
+	.4byte	0x13fce
 	.uleb128 0x4e
-	.8byte	.LVL512
-	.4byte	0x13ba1
+	.8byte	.LVL534
+	.4byte	0x13fda
 	.uleb128 0x4e
-	.8byte	.LVL513
-	.4byte	0x13bdc
+	.8byte	.LVL535
+	.4byte	0x14015
 	.uleb128 0x4e
-	.8byte	.LVL593
-	.4byte	0x13bcf
+	.8byte	.LVL615
+	.4byte	0x14008
 	.uleb128 0x4e
-	.8byte	.LVL594
-	.4byte	0x13be8
+	.8byte	.LVL616
+	.4byte	0x14021
 	.uleb128 0x4e
-	.8byte	.LVL595
-	.4byte	0x13bcf
+	.8byte	.LVL617
+	.4byte	0x14008
 	.uleb128 0x4e
-	.8byte	.LVL614
-	.4byte	0x13bcf
+	.8byte	.LVL636
+	.4byte	0x14008
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0xfd15
-	.8byte	.LBB1596
-	.4byte	.Ldebug_ranges0+0xce0
+	.4byte	0xfd37
+	.8byte	.LBB1705
+	.4byte	.Ldebug_ranges0+0xed0
 	.byte	0x1
-	.2byte	0x839
-	.4byte	0xf79f
+	.2byte	0x87c
+	.4byte	0xf7c1
 	.uleb128 0x54
-	.4byte	0xfd26
+	.4byte	0xfd48
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xce0
+	.4byte	.Ldebug_ranges0+0xed0
 	.uleb128 0x60
-	.4byte	0xfd32
+	.4byte	0xfd54
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5a
-	.4byte	0x13416
-	.8byte	.LBB1598
-	.4byte	.Ldebug_ranges0+0xd20
+	.4byte	0x13591
+	.8byte	.LBB1707
+	.4byte	.Ldebug_ranges0+0xf10
 	.byte	0x1
-	.2byte	0x760
-	.4byte	0xf699
+	.2byte	0x7a2
+	.4byte	0xf6bb
 	.uleb128 0x54
-	.4byte	0x13422
+	.4byte	0x1359d
 	.uleb128 0x56
-	.8byte	.LBB1600
-	.8byte	.LBE1600-.LBB1600
+	.8byte	.LBB1709
+	.8byte	.LBE1709-.LBB1709
 	.uleb128 0x57
-	.4byte	0x1344d
+	.4byte	0x135c8
 	.uleb128 0x5b
-	.4byte	0x1359a
-	.8byte	.LBB1601
-	.8byte	.LBE1601-.LBB1601
+	.4byte	0x13715
+	.8byte	.LBB1710
+	.8byte	.LBE1710-.LBB1710
 	.byte	0x10
 	.byte	0x1c
 	.uleb128 0x54
-	.4byte	0x135ba
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x135af
+	.4byte	0x1372c
 	.uleb128 0x54
-	.4byte	0x135a6
+	.4byte	0x13722
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x134dc
-	.8byte	.LBB1605
-	.8byte	.LBE1605-.LBB1605
+	.4byte	0x13657
+	.8byte	.LBB1714
+	.8byte	.LBE1714-.LBB1714
 	.byte	0x1
-	.2byte	0x768
-	.4byte	0xf6e4
+	.2byte	0x7aa
+	.4byte	0xf706
 	.uleb128 0x54
-	.4byte	0x134f1
+	.4byte	0x1366c
 	.uleb128 0x54
-	.4byte	0x134e8
+	.4byte	0x13663
 	.uleb128 0x56
-	.8byte	.LBB1606
-	.8byte	.LBE1606-.LBB1606
+	.8byte	.LBB1715
+	.8byte	.LBE1715-.LBB1715
 	.uleb128 0x5f
-	.4byte	0x134fa
-	.4byte	.LLST126
+	.4byte	0x13675
+	.4byte	.LLST147
 	.uleb128 0x5f
-	.4byte	0x13504
-	.4byte	.LLST127
+	.4byte	0x1367f
+	.4byte	.LLST148
 	.byte	0
 	.byte	0
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xd50
-	.4byte	0xf711
+	.4byte	.Ldebug_ranges0+0xf40
+	.4byte	0xf733
 	.uleb128 0x5f
-	.4byte	0xfd3f
-	.4byte	.LLST128
+	.4byte	0xfd61
+	.4byte	.LLST149
 	.uleb128 0x4e
-	.8byte	.LVL520
-	.4byte	0x13bf4
+	.8byte	.LVL542
+	.4byte	0x1402d
 	.uleb128 0x4e
-	.8byte	.LVL522
-	.4byte	0x13c00
+	.8byte	.LVL544
+	.4byte	0x14039
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x134dc
-	.8byte	.LBB1609
-	.8byte	.LBE1609-.LBB1609
+	.4byte	0x13657
+	.8byte	.LBB1718
+	.8byte	.LBE1718-.LBB1718
 	.byte	0x1
-	.2byte	0x771
-	.4byte	0xf75c
+	.2byte	0x7b3
+	.4byte	0xf77e
 	.uleb128 0x54
-	.4byte	0x134f1
+	.4byte	0x1366c
 	.uleb128 0x54
-	.4byte	0x134e8
+	.4byte	0x13663
 	.uleb128 0x56
-	.8byte	.LBB1610
-	.8byte	.LBE1610-.LBB1610
+	.8byte	.LBB1719
+	.8byte	.LBE1719-.LBB1719
 	.uleb128 0x5f
-	.4byte	0x134fa
-	.4byte	.LLST129
+	.4byte	0x13675
+	.4byte	.LLST150
 	.uleb128 0x5f
-	.4byte	0x13504
-	.4byte	.LLST130
+	.4byte	0x1367f
+	.4byte	.LLST151
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL514
-	.4byte	0x13bf4
+	.8byte	.LVL536
+	.4byte	0x1402d
 	.uleb128 0x4e
-	.8byte	.LVL515
-	.4byte	0x13c0d
+	.8byte	.LVL537
+	.4byte	0x14046
 	.uleb128 0x4e
-	.8byte	.LVL523
-	.4byte	0x13c0d
+	.8byte	.LVL545
+	.4byte	0x14046
 	.uleb128 0x4e
-	.8byte	.LVL598
-	.4byte	0x13bcf
+	.8byte	.LVL620
+	.4byte	0x14008
 	.uleb128 0x4e
-	.8byte	.LVL602
-	.4byte	0x13bcf
+	.8byte	.LVL624
+	.4byte	0x14008
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0xfcfb
-	.8byte	.LBB1613
-	.8byte	.LBE1613-.LBB1613
+	.4byte	0xfd1d
+	.8byte	.LBB1722
+	.8byte	.LBE1722-.LBB1722
 	.byte	0x1
-	.2byte	0x840
-	.4byte	0xf839
+	.2byte	0x883
+	.4byte	0xf85b
 	.uleb128 0x54
-	.4byte	0xfd08
+	.4byte	0xfd2a
 	.uleb128 0x5a
-	.4byte	0x12e73
-	.8byte	.LBB1615
-	.4byte	.Ldebug_ranges0+0xd80
+	.4byte	0x12fee
+	.8byte	.LBB1724
+	.4byte	.Ldebug_ranges0+0xf70
 	.byte	0x1
-	.2byte	0x781
-	.4byte	0xf804
+	.2byte	0x7c3
+	.4byte	0xf826
 	.uleb128 0x54
-	.4byte	0x12e95
+	.4byte	0x13010
 	.uleb128 0x54
-	.4byte	0x12e8a
+	.4byte	0x13005
 	.uleb128 0x54
-	.4byte	0x12e7f
+	.4byte	0x12ffa
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xd80
+	.4byte	.Ldebug_ranges0+0xf70
 	.uleb128 0x5f
-	.4byte	0x12ea0
-	.4byte	.LLST131
+	.4byte	0x1301b
+	.4byte	.LLST152
 	.uleb128 0x4e
-	.8byte	.LVL530
-	.4byte	0x13c1a
+	.8byte	.LVL552
+	.4byte	0x14053
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL531
-	.4byte	0x13c26
+	.8byte	.LVL553
+	.4byte	0x1405f
 	.uleb128 0x4e
-	.8byte	.LVL532
-	.4byte	0x13c32
+	.8byte	.LVL554
+	.4byte	0x1406b
 	.uleb128 0x4e
-	.8byte	.LVL533
-	.4byte	0x13c26
+	.8byte	.LVL555
+	.4byte	0x1405f
 	.uleb128 0x4e
-	.8byte	.LVL534
-	.4byte	0x13c32
+	.8byte	.LVL556
+	.4byte	0x1406b
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0xfc59
-	.8byte	.LBB1625
-	.4byte	.Ldebug_ranges0+0xde0
+	.4byte	0xfc7b
+	.8byte	.LBB1734
+	.4byte	.Ldebug_ranges0+0xfd0
 	.byte	0x1
-	.2byte	0x843
-	.4byte	0xfadc
+	.2byte	0x886
+	.4byte	0xfafe
 	.uleb128 0x54
-	.4byte	0xfc76
+	.4byte	0xfc98
 	.uleb128 0x54
-	.4byte	0xfc6a
+	.4byte	0xfc8c
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xde0
+	.4byte	.Ldebug_ranges0+0xfd0
 	.uleb128 0x57
-	.4byte	0xfc82
+	.4byte	0xfca4
 	.uleb128 0x5f
-	.4byte	0xfc8e
-	.4byte	.LLST132
+	.4byte	0xfcb0
+	.4byte	.LLST153
 	.uleb128 0x5f
-	.4byte	0xfc9a
-	.4byte	.LLST133
+	.4byte	0xfcbc
+	.4byte	.LLST154
 	.uleb128 0x5f
-	.4byte	0xfca6
-	.4byte	.LLST134
+	.4byte	0xfcc8
+	.4byte	.LLST155
 	.uleb128 0x5f
-	.4byte	0xfcb2
-	.4byte	.LLST135
+	.4byte	0xfcd4
+	.4byte	.LLST156
 	.uleb128 0x5f
-	.4byte	0xfcbe
-	.4byte	.LLST136
+	.4byte	0xfce0
+	.4byte	.LLST157
 	.uleb128 0x5f
-	.4byte	0xfcca
-	.4byte	.LLST137
+	.4byte	0xfcec
+	.4byte	.LLST158
 	.uleb128 0x57
-	.4byte	0xfcd6
+	.4byte	0xfcf8
 	.uleb128 0x5f
-	.4byte	0xfce2
-	.4byte	.LLST138
+	.4byte	0xfd04
+	.4byte	.LLST159
 	.uleb128 0x5f
-	.4byte	0xfcee
-	.4byte	.LLST139
+	.4byte	0xfd10
+	.4byte	.LLST160
 	.uleb128 0x53
-	.4byte	0x1164e
-	.8byte	.LBB1627
-	.8byte	.LBE1627-.LBB1627
+	.4byte	0x11670
+	.8byte	.LBB1736
+	.8byte	.LBE1736-.LBB1736
 	.byte	0x1
-	.2byte	0x7b9
-	.4byte	0xf91b
+	.2byte	0x7fb
+	.4byte	0xf93d
 	.uleb128 0x54
-	.4byte	0x1165f
+	.4byte	0x11681
 	.uleb128 0x54
-	.4byte	0x1165f
+	.4byte	0x11681
 	.uleb128 0x56
-	.8byte	.LBB1628
-	.8byte	.LBE1628-.LBB1628
+	.8byte	.LBB1737
+	.8byte	.LBE1737-.LBB1737
 	.uleb128 0x5f
-	.4byte	0x1166b
-	.4byte	.LLST140
+	.4byte	0x1168d
+	.4byte	.LLST161
 	.uleb128 0x4e
-	.8byte	.LVL551
-	.4byte	0x13c3e
+	.8byte	.LVL573
+	.4byte	0x14077
 	.uleb128 0x4e
-	.8byte	.LVL553
-	.4byte	0x13bc3
+	.8byte	.LVL575
+	.4byte	0x13ffc
 	.uleb128 0x4e
-	.8byte	.LVL554
-	.4byte	0x13c4a
+	.8byte	.LVL576
+	.4byte	0x14083
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12ff0
-	.8byte	.LBB1629
-	.8byte	.LBE1629-.LBB1629
+	.4byte	0x1316b
+	.8byte	.LBB1738
+	.8byte	.LBE1738-.LBB1738
 	.byte	0x1
-	.2byte	0x79f
-	.4byte	0xf972
+	.2byte	0x7e1
+	.4byte	0xf994
 	.uleb128 0x54
-	.4byte	0x1300d
+	.4byte	0x13188
 	.uleb128 0x54
-	.4byte	0x13001
+	.4byte	0x1317c
 	.uleb128 0x5c
-	.4byte	0x1301a
-	.8byte	.LBB1630
-	.8byte	.LBE1630-.LBB1630
+	.4byte	0x13195
+	.8byte	.LBB1739
+	.8byte	.LBE1739-.LBB1739
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x13037
+	.4byte	0x131b2
 	.uleb128 0x54
-	.4byte	0x1302b
+	.4byte	0x131a6
 	.uleb128 0x4e
-	.8byte	.LVL567
-	.4byte	0x13c56
+	.8byte	.LVL589
+	.4byte	0x1408f
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12ff0
-	.8byte	.LBB1632
-	.8byte	.LBE1632-.LBB1632
+	.4byte	0x1316b
+	.8byte	.LBB1741
+	.8byte	.LBE1741-.LBB1741
 	.byte	0x1
-	.2byte	0x7ad
-	.4byte	0xf9c9
+	.2byte	0x7ef
+	.4byte	0xf9eb
 	.uleb128 0x54
-	.4byte	0x1300d
+	.4byte	0x13188
 	.uleb128 0x54
-	.4byte	0x13001
+	.4byte	0x1317c
 	.uleb128 0x5c
-	.4byte	0x1301a
-	.8byte	.LBB1633
-	.8byte	.LBE1633-.LBB1633
+	.4byte	0x13195
+	.8byte	.LBB1742
+	.8byte	.LBE1742-.LBB1742
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x13037
+	.4byte	0x131b2
 	.uleb128 0x54
-	.4byte	0x1302b
+	.4byte	0x131a6
 	.uleb128 0x4e
-	.8byte	.LVL582
-	.4byte	0x13c56
+	.8byte	.LVL604
+	.4byte	0x1408f
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL536
-	.4byte	0x13c63
+	.8byte	.LVL558
+	.4byte	0x1409c
 	.uleb128 0x4e
-	.8byte	.LVL538
-	.4byte	0x13c63
+	.8byte	.LVL560
+	.4byte	0x1409c
 	.uleb128 0x4e
-	.8byte	.LVL540
-	.4byte	0x13c6f
+	.8byte	.LVL562
+	.4byte	0x140a8
 	.uleb128 0x4e
-	.8byte	.LVL545
-	.4byte	0x13c6f
+	.8byte	.LVL567
+	.4byte	0x140a8
 	.uleb128 0x4e
-	.8byte	.LVL549
-	.4byte	0x13b55
+	.8byte	.LVL571
+	.4byte	0x13f8e
 	.uleb128 0x4e
-	.8byte	.LVL550
-	.4byte	0x13c7c
+	.8byte	.LVL572
+	.4byte	0x140b5
 	.uleb128 0x4e
-	.8byte	.LVL555
-	.4byte	0x13c88
+	.8byte	.LVL577
+	.4byte	0x140c1
 	.uleb128 0x4e
-	.8byte	.LVL556
-	.4byte	0x13c88
+	.8byte	.LVL578
+	.4byte	0x140c1
 	.uleb128 0x4e
-	.8byte	.LVL566
-	.4byte	0x13b55
+	.8byte	.LVL588
+	.4byte	0x13f8e
 	.uleb128 0x4e
-	.8byte	.LVL571
-	.4byte	0x13c94
+	.8byte	.LVL593
+	.4byte	0x140cd
 	.uleb128 0x4e
-	.8byte	.LVL574
-	.4byte	0x13c3e
+	.8byte	.LVL596
+	.4byte	0x14077
 	.uleb128 0x4e
-	.8byte	.LVL576
-	.4byte	0x13c94
+	.8byte	.LVL598
+	.4byte	0x140cd
 	.uleb128 0x4e
-	.8byte	.LVL577
-	.4byte	0x13c4a
+	.8byte	.LVL599
+	.4byte	0x14083
 	.uleb128 0x4e
-	.8byte	.LVL579
-	.4byte	0x13c9e
+	.8byte	.LVL601
+	.4byte	0x140d7
 	.uleb128 0x4e
-	.8byte	.LVL581
-	.4byte	0x13b55
+	.8byte	.LVL603
+	.4byte	0x13f8e
 	.uleb128 0x4e
-	.8byte	.LVL585
-	.4byte	0x13c94
+	.8byte	.LVL607
+	.4byte	0x140cd
 	.uleb128 0x4e
-	.8byte	.LVL588
-	.4byte	0x13c3e
+	.8byte	.LVL610
+	.4byte	0x14077
 	.uleb128 0x4e
-	.8byte	.LVL590
-	.4byte	0x13c94
+	.8byte	.LVL612
+	.4byte	0x140cd
 	.uleb128 0x4e
-	.8byte	.LVL591
-	.4byte	0x13c4a
+	.8byte	.LVL613
+	.4byte	0x14083
 	.uleb128 0x4e
-	.8byte	.LVL618
-	.4byte	0x13bcf
+	.8byte	.LVL640
+	.4byte	0x14008
 	.uleb128 0x4e
-	.8byte	.LVL621
-	.4byte	0x13bcf
+	.8byte	.LVL643
+	.4byte	0x14008
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x130c4
-	.8byte	.LBB1638
-	.8byte	.LBE1638-.LBB1638
+	.4byte	0x1323f
+	.8byte	.LBB1747
+	.8byte	.LBE1747-.LBB1747
 	.byte	0x1
-	.2byte	0x845
-	.4byte	0xfb25
+	.2byte	0x888
+	.4byte	0xfb47
 	.uleb128 0x54
-	.4byte	0x130db
+	.4byte	0x13256
 	.uleb128 0x54
-	.4byte	0x130d0
+	.4byte	0x1324b
 	.uleb128 0x5b
-	.4byte	0x131c6
-	.8byte	.LBB1639
-	.8byte	.LBE1639-.LBB1639
+	.4byte	0x13341
+	.8byte	.LBB1748
+	.8byte	.LBE1748-.LBB1748
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x54
-	.4byte	0x131df
+	.4byte	0x1335a
 	.uleb128 0x54
-	.4byte	0x131d3
+	.4byte	0x1334e
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0xfe4d
-	.8byte	.LBB1641
-	.8byte	.LBE1641-.LBB1641
+	.4byte	0xfe6f
+	.8byte	.LBB1750
+	.8byte	.LBE1750-.LBB1750
 	.byte	0x1
-	.2byte	0x848
-	.4byte	0xfba2
+	.2byte	0x88b
+	.4byte	0xfbc4
 	.uleb128 0x54
-	.4byte	0xfe5e
+	.4byte	0xfe80
 	.uleb128 0x4e
-	.8byte	.LVL557
-	.4byte	0x13caa
+	.8byte	.LVL579
+	.4byte	0x140e3
 	.uleb128 0x4e
-	.8byte	.LVL558
-	.4byte	0x13cb6
+	.8byte	.LVL580
+	.4byte	0x140ef
 	.uleb128 0x4e
-	.8byte	.LVL559
-	.4byte	0x13cb6
+	.8byte	.LVL581
+	.4byte	0x140ef
 	.uleb128 0x4e
-	.8byte	.LVL560
-	.4byte	0x13cb6
+	.8byte	.LVL582
+	.4byte	0x140ef
 	.uleb128 0x4e
-	.8byte	.LVL561
-	.4byte	0x13cb6
+	.8byte	.LVL583
+	.4byte	0x140ef
 	.uleb128 0x4e
-	.8byte	.LVL562
-	.4byte	0x13cb6
+	.8byte	.LVL584
+	.4byte	0x140ef
 	.uleb128 0x4e
-	.8byte	.LVL563
-	.4byte	0x13cb6
+	.8byte	.LVL585
+	.4byte	0x140ef
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL454
-	.4byte	0x13b88
+	.8byte	.LVL476
+	.4byte	0x13fc1
 	.uleb128 0x4e
-	.8byte	.LVL455
-	.4byte	0x13cc3
+	.8byte	.LVL477
+	.4byte	0x140fc
 	.uleb128 0x4e
-	.8byte	.LVL457
-	.4byte	0x13b88
+	.8byte	.LVL479
+	.4byte	0x13fc1
 	.uleb128 0x4e
-	.8byte	.LVL458
-	.4byte	0x13ccf
+	.8byte	.LVL480
+	.4byte	0x14108
 	.uleb128 0x4e
-	.8byte	.LVL495
-	.4byte	0x13bcf
+	.8byte	.LVL517
+	.4byte	0x14008
 	.uleb128 0x4e
-	.8byte	.LVL497
-	.4byte	0x13bcf
+	.8byte	.LVL519
+	.4byte	0x14008
 	.uleb128 0x4e
-	.8byte	.LVL504
-	.4byte	0x13bcf
+	.8byte	.LVL526
+	.4byte	0x14008
 	.uleb128 0x4e
-	.8byte	.LVL564
-	.4byte	0x13b55
+	.8byte	.LVL586
+	.4byte	0x13f8e
 	.uleb128 0x4e
-	.8byte	.LVL599
-	.4byte	0x13bcf
+	.8byte	.LVL621
+	.4byte	0x14008
 	.uleb128 0x4e
-	.8byte	.LVL606
-	.4byte	0x13bcf
+	.8byte	.LVL628
+	.4byte	0x14008
 	.uleb128 0x4e
-	.8byte	.LVL607
-	.4byte	0x13bcf
+	.8byte	.LVL629
+	.4byte	0x14008
 	.uleb128 0x4e
-	.8byte	.LVL608
-	.4byte	0x13bcf
+	.8byte	.LVL630
+	.4byte	0x14008
 	.uleb128 0x4e
-	.8byte	.LVL612
-	.4byte	0x13bcf
+	.8byte	.LVL634
+	.4byte	0x14008
 	.uleb128 0x4e
-	.8byte	.LVL616
-	.4byte	0x13cdc
+	.8byte	.LVL638
+	.4byte	0x14115
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3035
+	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0x78d
+	.2byte	0x7cf
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfcfb
+	.4byte	0xfd1d
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x78d
-	.4byte	0xe45b
+	.2byte	0x7cf
+	.4byte	0xe47d
 	.uleb128 0x64
-	.4byte	.LASF2994
+	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x78d
-	.4byte	0xe11d
+	.2byte	0x7cf
+	.4byte	0xe13f
 	.uleb128 0x46
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x78f
-	.4byte	0xe70a
+	.2byte	0x7d1
+	.4byte	0xe72c
 	.uleb128 0x46
-	.4byte	.LASF3027
+	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0x790
+	.2byte	0x7d2
 	.4byte	0x6d
 	.uleb128 0x46
-	.4byte	.LASF3028
+	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0x791
+	.2byte	0x7d3
 	.4byte	0x6d
 	.uleb128 0x46
-	.4byte	.LASF3029
+	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0x792
+	.2byte	0x7d4
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3030
+	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0x793
+	.2byte	0x7d5
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3031
+	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0x794
+	.2byte	0x7d6
 	.4byte	0x219
 	.uleb128 0x46
-	.4byte	.LASF3032
+	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0x795
+	.2byte	0x7d7
 	.4byte	0x219
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x796
-	.4byte	0xe3f6
+	.2byte	0x7d8
+	.4byte	0xe418
 	.uleb128 0x46
-	.4byte	.LASF3033
+	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0x797
+	.2byte	0x7d9
 	.4byte	0x443
 	.uleb128 0x46
-	.4byte	.LASF3034
+	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0x798
+	.2byte	0x7da
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3092
+	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x776
+	.2byte	0x7b8
 	.byte	0x1
-	.4byte	0xfd15
+	.4byte	0xfd37
 	.uleb128 0x64
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x776
-	.4byte	0xe70a
+	.2byte	0x7b8
+	.4byte	0xe72c
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3036
+	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0x75c
+	.2byte	0x79e
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfd4d
+	.4byte	0xfd6f
 	.uleb128 0x64
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x75c
-	.4byte	0xe70a
+	.2byte	0x79e
+	.4byte	0xe72c
 	.uleb128 0x46
-	.4byte	.LASF2463
+	.4byte	.LASF2465
 	.byte	0x1
-	.2byte	0x75e
-	.4byte	0xd7e9
+	.2byte	0x7a0
+	.4byte	0xd7ff
 	.uleb128 0x66
 	.uleb128 0x52
 	.string	"__k"
 	.byte	0x1
-	.2byte	0x76b
-	.4byte	0x2eda
+	.2byte	0x7ad
+	.4byte	0x2ef0
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3037
+	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0x713
+	.2byte	0x755
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfdc7
+	.4byte	0xfde9
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x713
-	.4byte	0xe45b
+	.2byte	0x755
+	.4byte	0xe47d
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x715
-	.4byte	0xa545
+	.2byte	0x757
+	.4byte	0xa55b
 	.uleb128 0x46
-	.4byte	.LASF2994
+	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x716
-	.4byte	0xe11d
+	.2byte	0x758
+	.4byte	0xe13f
 	.uleb128 0x46
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x717
-	.4byte	0xe70a
+	.2byte	0x759
+	.4byte	0xe72c
 	.uleb128 0x46
-	.4byte	.LASF3038
+	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0x718
-	.4byte	0xb869
+	.2byte	0x75a
+	.4byte	0xb87f
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x719
-	.4byte	0x9721
+	.2byte	0x75b
+	.4byte	0x9737
 	.uleb128 0x46
-	.4byte	.LASF3039
+	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0x71a
+	.2byte	0x75c
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x71b
+	.2byte	0x75d
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x71b
+	.2byte	0x75d
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3040
+	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0x6ea
+	.2byte	0x72c
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe38
+	.4byte	0xfe5a
 	.uleb128 0x64
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x6ea
-	.4byte	0xe70a
+	.2byte	0x72c
+	.4byte	0xe72c
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x6ec
+	.2byte	0x72e
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x6ed
-	.4byte	0xa545
+	.2byte	0x72f
+	.4byte	0xa55b
 	.uleb128 0x46
-	.4byte	.LASF3038
+	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0x6ee
-	.4byte	0xb869
+	.2byte	0x730
+	.4byte	0xb87f
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x6ef
-	.4byte	0x9721
+	.2byte	0x731
+	.4byte	0x9737
 	.uleb128 0x46
-	.4byte	.LASF3041
+	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0x6f0
+	.2byte	0x732
 	.4byte	0x29
 	.uleb128 0x46
-	.4byte	.LASF3042
+	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0x6f1
+	.2byte	0x733
 	.4byte	0xc6
 	.uleb128 0x67
-	.4byte	.LASF3019
-	.4byte	0xfe48
-	.4byte	.LASF3040
+	.4byte	.LASF3023
+	.4byte	0xfe6a
+	.4byte	.LASF3044
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xfe48
+	.4byte	0xfe6a
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x12
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xfe38
+	.4byte	0xfe5a
 	.uleb128 0x62
-	.4byte	.LASF3043
+	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0x6dc
+	.2byte	0x71e
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe6b
+	.4byte	0xfe8d
 	.uleb128 0x64
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x6dc
-	.4byte	0xe70a
+	.2byte	0x71e
+	.4byte	0xe72c
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3044
+	.4byte	.LASF3048
 	.byte	0x1
-	.2byte	0x6d3
+	.2byte	0x715
 	.4byte	0x2d9
-	.8byte	.LFB2834
-	.8byte	.LFE2834-.LFB2834
+	.8byte	.LFB2839
+	.8byte	.LFE2839-.LFB2839
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfecb
+	.4byte	0xfeed
 	.uleb128 0x58
-	.4byte	.LASF2197
+	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x6d3
-	.4byte	0xa545
+	.2byte	0x715
+	.4byte	0xa55b
 	.4byte	.LLST71
 	.uleb128 0x58
-	.4byte	.LASF2112
+	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x6d4
-	.4byte	0xb3c0
+	.2byte	0x716
+	.4byte	0xb3d6
 	.4byte	.LLST72
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6d5
+	.2byte	0x717
 	.4byte	0x219
 	.4byte	.LLST73
 	.uleb128 0x4e
-	.8byte	.LVL271
-	.4byte	0x13ce6
+	.8byte	.LVL272
+	.4byte	0x1411f
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3045
+	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0x6ca
+	.2byte	0x70c
 	.4byte	0x2d9
-	.8byte	.LFB2833
-	.8byte	.LFE2833-.LFB2833
+	.8byte	.LFB2838
+	.8byte	.LFE2838-.LFB2838
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xff2b
+	.4byte	0xff4d
 	.uleb128 0x58
-	.4byte	.LASF2197
+	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x6ca
-	.4byte	0xa545
+	.2byte	0x70c
+	.4byte	0xa55b
 	.4byte	.LLST74
 	.uleb128 0x58
-	.4byte	.LASF2112
+	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x6cb
-	.4byte	0xb3c0
+	.2byte	0x70d
+	.4byte	0xb3d6
 	.4byte	.LLST75
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6cc
+	.2byte	0x70e
 	.4byte	0x219
 	.4byte	.LLST76
 	.uleb128 0x4e
-	.8byte	.LVL276
-	.4byte	0x13ce6
+	.8byte	.LVL277
+	.4byte	0x1411f
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3046
+	.4byte	.LASF3050
 	.byte	0x1
-	.2byte	0x6b2
+	.2byte	0x6f4
 	.4byte	0x2d9
-	.8byte	.LFB2832
-	.8byte	.LFE2832-.LFB2832
+	.8byte	.LFB2837
+	.8byte	.LFE2837-.LFB2837
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfffb
+	.4byte	0x1001d
 	.uleb128 0x58
-	.4byte	.LASF2197
+	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x6b2
-	.4byte	0xa545
+	.2byte	0x6f4
+	.4byte	0xa55b
 	.4byte	.LLST86
 	.uleb128 0x58
-	.4byte	.LASF2112
+	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x6b3
-	.4byte	0xb3c0
+	.2byte	0x6f5
+	.4byte	0xb3d6
 	.4byte	.LLST87
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6b4
+	.2byte	0x6f6
 	.4byte	0x56
 	.4byte	.LLST88
 	.uleb128 0x58
-	.4byte	.LASF380
+	.4byte	.LASF382
 	.byte	0x1
-	.2byte	0x6b4
+	.2byte	0x6f6
 	.4byte	0x2ce
 	.4byte	.LLST89
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x6b6
-	.4byte	0xe45b
+	.2byte	0x6f8
+	.4byte	0xe47d
 	.4byte	.LLST90
 	.uleb128 0x59
-	.4byte	.LASF2453
+	.4byte	.LASF2455
 	.byte	0x1
-	.2byte	0x6b7
+	.2byte	0x6f9
 	.4byte	0xc6
 	.4byte	.LLST91
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x6b7
+	.2byte	0x6f9
 	.4byte	0xc6
 	.uleb128 0x4e
-	.8byte	.LVL302
-	.4byte	0x13cf3
-	.uleb128 0x4e
-	.8byte	.LVL304
-	.4byte	0x13d00
+	.8byte	.LVL303
+	.4byte	0x1412c
 	.uleb128 0x4e
-	.8byte	.LVL309
-	.4byte	0x13bcf
+	.8byte	.LVL305
+	.4byte	0x14139
 	.uleb128 0x4e
-	.8byte	.LVL312
-	.4byte	0x13bcf
+	.8byte	.LVL310
+	.4byte	0x14008
 	.uleb128 0x4e
 	.8byte	.LVL313
-	.4byte	0x13cdc
+	.4byte	0x14008
+	.uleb128 0x4e
+	.8byte	.LVL314
+	.4byte	0x14115
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3047
+	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0x6a6
+	.2byte	0x6e8
 	.4byte	0x2d9
-	.8byte	.LFB2831
-	.8byte	.LFE2831-.LFB2831
+	.8byte	.LFB2836
+	.8byte	.LFE2836-.LFB2836
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10095
+	.4byte	0x100b7
 	.uleb128 0x58
-	.4byte	.LASF2197
+	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x6a6
-	.4byte	0xa545
+	.2byte	0x6e8
+	.4byte	0xa55b
 	.4byte	.LLST77
 	.uleb128 0x58
-	.4byte	.LASF2112
+	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x6a7
-	.4byte	0xb3c0
+	.2byte	0x6e9
+	.4byte	0xb3d6
 	.4byte	.LLST78
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6a8
+	.2byte	0x6ea
 	.4byte	0x219
 	.4byte	.LLST79
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x6aa
-	.4byte	0xe45b
+	.2byte	0x6ec
+	.4byte	0xe47d
 	.uleb128 0x46
-	.4byte	.LASF2453
+	.4byte	.LASF2455
 	.byte	0x1
-	.2byte	0x6ab
+	.2byte	0x6ed
 	.4byte	0xc6
 	.uleb128 0x53
-	.4byte	0x12d9c
-	.8byte	.LBB1190
-	.8byte	.LBE1190-.LBB1190
+	.4byte	0x12f17
+	.8byte	.LBB1206
+	.8byte	.LBE1206-.LBB1206
 	.byte	0x1
-	.2byte	0x6ad
-	.4byte	0x10087
+	.2byte	0x6ef
+	.4byte	0x100a9
 	.uleb128 0x54
-	.4byte	0x12dac
+	.4byte	0x12f27
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL281
-	.4byte	0x13ce6
+	.8byte	.LVL282
+	.4byte	0x1411f
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3048
+	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0x698
+	.2byte	0x6da
 	.4byte	0x2d9
-	.8byte	.LFB2830
-	.8byte	.LFE2830-.LFB2830
+	.8byte	.LFB2835
+	.8byte	.LFE2835-.LFB2835
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1013e
+	.4byte	0x10160
 	.uleb128 0x58
-	.4byte	.LASF2197
+	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x698
-	.4byte	0xa545
+	.2byte	0x6da
+	.4byte	0xa55b
 	.4byte	.LLST80
 	.uleb128 0x58
-	.4byte	.LASF2112
+	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x699
-	.4byte	0xb3c0
+	.2byte	0x6db
+	.4byte	0xb3d6
 	.4byte	.LLST81
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x69a
+	.2byte	0x6dc
 	.4byte	0x219
 	.4byte	.LLST82
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x69c
-	.4byte	0xe45b
+	.2byte	0x6de
+	.4byte	0xe47d
 	.uleb128 0x69
 	.string	"t"
 	.byte	0x1
-	.2byte	0x69d
+	.2byte	0x6df
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x5a
-	.4byte	0x12db8
-	.8byte	.LBB1192
+	.4byte	0x12f33
+	.8byte	.LBB1208
 	.4byte	.Ldebug_ranges0+0x6a0
 	.byte	0x1
-	.2byte	0x69f
-	.4byte	0x10123
+	.2byte	0x6e1
+	.4byte	0x10145
 	.uleb128 0x54
-	.4byte	0x12dd3
+	.4byte	0x12f4e
 	.uleb128 0x54
-	.4byte	0x12dc8
+	.4byte	0x12f43
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL288
-	.4byte	0x13ce6
+	.8byte	.LVL289
+	.4byte	0x1411f
 	.uleb128 0x4e
-	.8byte	.LVL291
-	.4byte	0x13cdc
+	.8byte	.LVL292
+	.4byte	0x14115
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3049
+	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0x68d
+	.2byte	0x6cf
 	.4byte	0x2d9
-	.8byte	.LFB2829
-	.8byte	.LFE2829-.LFB2829
+	.8byte	.LFB2834
+	.8byte	.LFE2834-.LFB2834
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x101aa
+	.4byte	0x101cc
 	.uleb128 0x58
-	.4byte	.LASF2197
+	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x68d
-	.4byte	0xa545
+	.2byte	0x6cf
+	.4byte	0xa55b
 	.4byte	.LLST83
 	.uleb128 0x58
-	.4byte	.LASF2112
+	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x68e
-	.4byte	0xb3c0
+	.2byte	0x6d0
+	.4byte	0xb3d6
 	.4byte	.LLST84
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x68f
+	.2byte	0x6d1
 	.4byte	0x219
 	.4byte	.LLST85
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x691
-	.4byte	0xe45b
+	.2byte	0x6d3
+	.4byte	0xe47d
 	.uleb128 0x4e
-	.8byte	.LVL296
-	.4byte	0x13ce6
+	.8byte	.LVL297
+	.4byte	0x1411f
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3050
+	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0x682
+	.2byte	0x6c4
 	.4byte	0x2d9
-	.8byte	.LFB2828
-	.8byte	.LFE2828-.LFB2828
+	.8byte	.LFB2833
+	.8byte	.LFE2833-.LFB2833
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10223
+	.4byte	0x10245
 	.uleb128 0x58
-	.4byte	.LASF2197
+	.4byte	.LASF2199
 	.byte	0x1
-	.2byte	0x682
-	.4byte	0xa545
+	.2byte	0x6c4
+	.4byte	0xa55b
 	.4byte	.LLST92
 	.uleb128 0x58
-	.4byte	.LASF2112
+	.4byte	.LASF2114
 	.byte	0x1
-	.2byte	0x683
-	.4byte	0xb3c0
+	.2byte	0x6c5
+	.4byte	0xb3d6
 	.4byte	.LLST93
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x684
+	.2byte	0x6c6
 	.4byte	0x219
 	.4byte	.LLST94
 	.uleb128 0x46
-	.4byte	.LASF3051
+	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0x686
+	.2byte	0x6c8
 	.4byte	0x56
 	.uleb128 0x4e
-	.8byte	.LVL315
-	.4byte	0x13d0c
-	.uleb128 0x4e
 	.8byte	.LVL316
-	.4byte	0x13ce6
+	.4byte	0x14145
+	.uleb128 0x4e
+	.8byte	.LVL317
+	.4byte	0x1411f
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3052
+	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0x66b
+	.2byte	0x6ad
 	.4byte	0xc6
-	.8byte	.LFB2827
-	.8byte	.LFE2827-.LFB2827
+	.8byte	.LFB2832
+	.8byte	.LFE2832-.LFB2832
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10264
+	.4byte	0x10286
 	.uleb128 0x58
-	.4byte	.LASF415
+	.4byte	.LASF417
 	.byte	0x1
-	.2byte	0x66b
-	.4byte	0x1c54
+	.2byte	0x6ad
+	.4byte	0x1c6a
 	.4byte	.LLST6
 	.uleb128 0x6a
-	.4byte	.LASF1270
+	.4byte	.LASF1272
 	.byte	0x1
-	.2byte	0x66b
-	.4byte	0x5531
+	.2byte	0x6ad
+	.4byte	0x5547
 	.uleb128 0x1
 	.byte	0x51
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3053
+	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0x65c
+	.2byte	0x69e
 	.4byte	0xc6
-	.8byte	.LFB2826
-	.8byte	.LFE2826-.LFB2826
+	.8byte	.LFB2831
+	.8byte	.LFE2831-.LFB2831
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x102cd
+	.4byte	0x102ef
 	.uleb128 0x58
-	.4byte	.LASF1270
+	.4byte	.LASF1272
 	.byte	0x1
-	.2byte	0x65c
-	.4byte	0x5531
+	.2byte	0x69e
+	.4byte	0x5547
 	.4byte	.LLST10
 	.uleb128 0x51
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x65c
-	.4byte	0x3c8a
+	.2byte	0x69e
+	.4byte	0x3ca0
 	.4byte	.LLST11
 	.uleb128 0x46
-	.4byte	.LASF881
+	.4byte	.LASF883
 	.byte	0x1
-	.2byte	0x65e
+	.2byte	0x6a0
 	.4byte	0x29
 	.uleb128 0x4e
 	.8byte	.LVL46
-	.4byte	0x13d18
+	.4byte	0x14151
 	.uleb128 0x4e
 	.8byte	.LVL47
-	.4byte	0x13d24
+	.4byte	0x1415d
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3054
+	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x593
+	.2byte	0x5d5
 	.4byte	0x194
-	.8byte	.LFB2825
-	.8byte	.LFE2825-.LFB2825
+	.8byte	.LFB2830
+	.8byte	.LFE2830-.LFB2830
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11575
+	.4byte	0x11597
 	.uleb128 0x58
-	.4byte	.LASF1270
+	.4byte	.LASF1272
 	.byte	0x1
-	.2byte	0x593
-	.4byte	0x5531
+	.2byte	0x5d5
+	.4byte	0x5547
 	.4byte	.LLST12
 	.uleb128 0x51
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0x593
+	.2byte	0x5d5
 	.4byte	0x6d
 	.4byte	.LLST13
 	.uleb128 0x51
 	.string	"arg"
 	.byte	0x1
-	.2byte	0x593
+	.2byte	0x5d5
 	.4byte	0x29
 	.4byte	.LLST14
 	.uleb128 0x46
-	.4byte	.LASF3055
+	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x595
+	.2byte	0x5d7
 	.4byte	0x443
 	.uleb128 0x46
-	.4byte	.LASF2994
+	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x596
-	.4byte	0xe11d
+	.2byte	0x5d8
+	.4byte	0xe13f
 	.uleb128 0x46
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x597
-	.4byte	0xe70a
+	.2byte	0x5d9
+	.4byte	0xe72c
 	.uleb128 0x4c
-	.4byte	.LASF3056
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x598
-	.4byte	0xd9c3
+	.2byte	0x5da
+	.4byte	0xd9e5
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 -56
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x599
-	.4byte	0xe3f6
+	.2byte	0x5db
+	.4byte	0xe418
 	.uleb128 0x46
-	.4byte	.LASF3057
+	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x59a
+	.2byte	0x5dc
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3058
+	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x59b
+	.2byte	0x5dd
 	.4byte	0x29
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x59c
+	.2byte	0x5de
 	.4byte	0xc6
 	.uleb128 0x55
-	.4byte	.LASF3019
-	.4byte	0x11585
+	.4byte	.LASF3023
+	.4byte	0x115a7
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34862
+	.8byte	__func__.34937
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x1a0
-	.4byte	0x10437
+	.4byte	0x10459
 	.uleb128 0x46
-	.4byte	.LASF3059
+	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x5e6
+	.2byte	0x628
 	.4byte	0xc6
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x1a0
 	.uleb128 0x6b
-	.4byte	.LASF3071
+	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x5e6
+	.2byte	0x628
 	.8byte	.L127
 	.uleb128 0x4c
-	.4byte	.LASF3060
+	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x5e6
-	.4byte	0x14fd
+	.2byte	0x628
+	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -96
 	.uleb128 0x46
-	.4byte	.LASF3059
+	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x5e6
+	.2byte	0x628
 	.4byte	0x194
 	.uleb128 0x6c
-	.8byte	.LBB982
-	.8byte	.LBE982-.LBB982
-	.4byte	0x1041b
+	.8byte	.LBB998
+	.8byte	.LBE998-.LBB998
+	.4byte	0x1043d
 	.uleb128 0x59
-	.4byte	.LASF3061
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x5e6
+	.2byte	0x628
 	.4byte	0x194
 	.4byte	.LLST29
 	.uleb128 0x4e
 	.8byte	.LVL93
-	.4byte	0x13d31
+	.4byte	0x1416a
 	.uleb128 0x4e
 	.8byte	.LVL94
-	.4byte	0x13d3d
+	.4byte	0x14176
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL91
-	.4byte	0x13d4a
+	.4byte	0x14183
 	.uleb128 0x4e
 	.8byte	.LVL95
-	.4byte	0x13d56
+	.4byte	0x1418f
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12eab
-	.8byte	.LBB918
+	.4byte	0x13026
+	.8byte	.LBB934
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x64e
-	.4byte	0x10657
+	.2byte	0x690
+	.4byte	0x10679
 	.uleb128 0x54
-	.4byte	0x12ed0
+	.4byte	0x1304b
 	.uleb128 0x54
-	.4byte	0x12ec5
+	.4byte	0x13040
 	.uleb128 0x54
-	.4byte	0x12ebb
+	.4byte	0x13036
 	.uleb128 0x6d
-	.4byte	0x12f09
-	.8byte	.LBB919
+	.4byte	0x13084
+	.8byte	.LBB935
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12f2e
+	.4byte	0x130a9
 	.uleb128 0x54
-	.4byte	0x12f23
+	.4byte	0x1309e
 	.uleb128 0x54
-	.4byte	0x12f19
+	.4byte	0x13094
 	.uleb128 0x6e
-	.4byte	0x12fa6
-	.8byte	.LBB921
+	.4byte	0x13121
+	.8byte	.LBB937
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x1058d
+	.4byte	0x105af
 	.uleb128 0x54
-	.4byte	0x12fc1
+	.4byte	0x1313c
 	.uleb128 0x6f
-	.4byte	0x12fb6
+	.4byte	0x13131
 	.4byte	.LLST15
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x80
 	.uleb128 0x5f
-	.4byte	0x12fcc
+	.4byte	0x13147
 	.4byte	.LLST16
 	.uleb128 0x5f
-	.4byte	0x12fd7
+	.4byte	0x13152
 	.4byte	.LLST17
 	.uleb128 0x70
-	.4byte	0x133fa
-	.8byte	.LBB923
-	.8byte	.LBE923-.LBB923
+	.4byte	0x13575
+	.8byte	.LBB939
+	.8byte	.LBE939-.LBB939
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x104f3
+	.4byte	0x10515
 	.uleb128 0x56
-	.8byte	.LBB924
-	.8byte	.LBE924-.LBB924
+	.8byte	.LBB940
+	.8byte	.LBE940-.LBB940
 	.uleb128 0x5f
-	.4byte	0x1340a
+	.4byte	0x13585
 	.4byte	.LLST18
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x133ce
-	.8byte	.LBB925
-	.8byte	.LBE925-.LBB925
+	.4byte	0x13549
+	.8byte	.LBB941
+	.8byte	.LBE941-.LBB941
 	.byte	0x6
 	.byte	0x55
-	.4byte	0x1053b
+	.4byte	0x1055d
 	.uleb128 0x54
-	.4byte	0x133e8
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x133de
+	.4byte	0x13559
 	.uleb128 0x5b
-	.4byte	0x134b0
-	.8byte	.LBB926
-	.8byte	.LBE926-.LBB926
+	.4byte	0x1362b
+	.8byte	.LBB942
+	.8byte	.LBE942-.LBB942
 	.byte	0xca
-	.byte	0x54
+	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x134ca
+	.4byte	0x13645
 	.uleb128 0x54
-	.4byte	0x134c0
+	.4byte	0x1363b
 	.byte	0
 	.byte	0
 	.uleb128 0x56
-	.8byte	.LBB928
-	.8byte	.LBE928-.LBB928
+	.8byte	.LBB944
+	.8byte	.LBE944-.LBB944
 	.uleb128 0x57
-	.4byte	0x12fe3
+	.4byte	0x1315e
 	.uleb128 0x5b
-	.4byte	0x1347e
-	.8byte	.LBB929
-	.8byte	.LBE929-.LBB929
+	.4byte	0x135f9
+	.8byte	.LBB945
+	.8byte	.LBE945-.LBB945
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13499
+	.4byte	0x13614
 	.uleb128 0x54
-	.4byte	0x1348e
+	.4byte	0x13609
 	.uleb128 0x56
-	.8byte	.LBB930
-	.8byte	.LBE930-.LBB930
+	.8byte	.LBB946
+	.8byte	.LBE946-.LBB946
 	.uleb128 0x57
-	.4byte	0x134a4
+	.4byte	0x1361f
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12f72
-	.8byte	.LBB935
-	.8byte	.LBE935-.LBB935
+	.4byte	0x130ed
+	.8byte	.LBB951
+	.8byte	.LBE951-.LBB951
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x10648
+	.4byte	0x1066a
 	.uleb128 0x54
-	.4byte	0x12f82
+	.4byte	0x130fd
 	.uleb128 0x56
-	.8byte	.LBB936
-	.8byte	.LBE936-.LBB936
+	.8byte	.LBB952
+	.8byte	.LBE952-.LBB952
 	.uleb128 0x5f
-	.4byte	0x12f8d
+	.4byte	0x13108
 	.4byte	.LLST19
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xc0
-	.4byte	0x10613
+	.4byte	0x10635
 	.uleb128 0x5f
-	.4byte	0x12f99
+	.4byte	0x13114
 	.4byte	.LLST20
 	.uleb128 0x5b
-	.4byte	0x1347e
-	.8byte	.LBB938
-	.8byte	.LBE938-.LBB938
+	.4byte	0x135f9
+	.8byte	.LBB954
+	.8byte	.LBE954-.LBB954
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13499
+	.4byte	0x13614
 	.uleb128 0x54
-	.4byte	0x1348e
+	.4byte	0x13609
 	.uleb128 0x56
-	.8byte	.LBB939
-	.8byte	.LBE939-.LBB939
+	.8byte	.LBB955
+	.8byte	.LBE955-.LBB955
 	.uleb128 0x57
-	.4byte	0x134a4
+	.4byte	0x1361f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x133fa
-	.8byte	.LBB940
-	.8byte	.LBE940-.LBB940
+	.4byte	0x13575
+	.8byte	.LBB956
+	.8byte	.LBE956-.LBB956
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB941
-	.8byte	.LBE941-.LBB941
+	.8byte	.LBB957
+	.8byte	.LBE957-.LBB957
 	.uleb128 0x5f
-	.4byte	0x1340a
+	.4byte	0x13585
 	.4byte	.LLST21
 	.byte	0
 	.byte	0
@@ -39821,171 +40176,171 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL121
-	.4byte	0x13d63
+	.4byte	0x1419c
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12eda
-	.8byte	.LBB951
+	.4byte	0x13055
+	.8byte	.LBB967
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
-	.2byte	0x5d1
-	.4byte	0x10882
+	.2byte	0x613
+	.4byte	0x108a4
 	.uleb128 0x54
-	.4byte	0x12eff
+	.4byte	0x1307a
 	.uleb128 0x54
-	.4byte	0x12ef4
+	.4byte	0x1306f
 	.uleb128 0x54
-	.4byte	0x12eea
+	.4byte	0x13065
 	.uleb128 0x6d
-	.4byte	0x12f38
-	.8byte	.LBB952
+	.4byte	0x130b3
+	.8byte	.LBB968
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x12f5d
+	.4byte	0x130d8
 	.uleb128 0x54
-	.4byte	0x12f52
+	.4byte	0x130cd
 	.uleb128 0x54
-	.4byte	0x12f48
+	.4byte	0x130c3
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x57
-	.4byte	0x12f66
+	.4byte	0x130e1
 	.uleb128 0x6e
-	.4byte	0x12fa6
-	.8byte	.LBB954
+	.4byte	0x13121
+	.8byte	.LBB970
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x107b7
+	.4byte	0x107d9
 	.uleb128 0x54
-	.4byte	0x12fc1
+	.4byte	0x1313c
 	.uleb128 0x6f
-	.4byte	0x12fb6
+	.4byte	0x13131
 	.4byte	.LLST22
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x130
 	.uleb128 0x5f
-	.4byte	0x12fcc
+	.4byte	0x13147
 	.4byte	.LLST23
 	.uleb128 0x5f
-	.4byte	0x12fd7
+	.4byte	0x13152
 	.4byte	.LLST24
 	.uleb128 0x70
-	.4byte	0x133fa
-	.8byte	.LBB956
-	.8byte	.LBE956-.LBB956
+	.4byte	0x13575
+	.8byte	.LBB972
+	.8byte	.LBE972-.LBB972
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x1071d
+	.4byte	0x1073f
 	.uleb128 0x56
-	.8byte	.LBB957
-	.8byte	.LBE957-.LBB957
+	.8byte	.LBB973
+	.8byte	.LBE973-.LBB973
 	.uleb128 0x5f
-	.4byte	0x1340a
+	.4byte	0x13585
 	.4byte	.LLST25
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB958
-	.8byte	.LBE958-.LBB958
-	.4byte	0x10771
+	.8byte	.LBB974
+	.8byte	.LBE974-.LBB974
+	.4byte	0x10793
 	.uleb128 0x57
-	.4byte	0x12fe3
+	.4byte	0x1315e
 	.uleb128 0x5b
-	.4byte	0x1347e
-	.8byte	.LBB959
-	.8byte	.LBE959-.LBB959
+	.4byte	0x135f9
+	.8byte	.LBB975
+	.8byte	.LBE975-.LBB975
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13499
+	.4byte	0x13614
 	.uleb128 0x54
-	.4byte	0x1348e
+	.4byte	0x13609
 	.uleb128 0x56
-	.8byte	.LBB960
-	.8byte	.LBE960-.LBB960
+	.8byte	.LBB976
+	.8byte	.LBE976-.LBB976
 	.uleb128 0x57
-	.4byte	0x134a4
+	.4byte	0x1361f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x133ce
-	.8byte	.LBB961
-	.8byte	.LBE961-.LBB961
+	.4byte	0x13549
+	.8byte	.LBB977
+	.8byte	.LBE977-.LBB977
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x133e8
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x133de
+	.4byte	0x13559
 	.uleb128 0x5b
-	.4byte	0x134b0
-	.8byte	.LBB962
-	.8byte	.LBE962-.LBB962
+	.4byte	0x1362b
+	.8byte	.LBB978
+	.8byte	.LBE978-.LBB978
 	.byte	0xca
-	.byte	0x54
+	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x134ca
+	.4byte	0x13645
 	.uleb128 0x54
-	.4byte	0x134c0
+	.4byte	0x1363b
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12f72
-	.8byte	.LBB966
-	.8byte	.LBE966-.LBB966
+	.4byte	0x130ed
+	.8byte	.LBB982
+	.8byte	.LBE982-.LBB982
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10872
+	.4byte	0x10894
 	.uleb128 0x54
-	.4byte	0x12f82
+	.4byte	0x130fd
 	.uleb128 0x56
-	.8byte	.LBB967
-	.8byte	.LBE967-.LBB967
+	.8byte	.LBB983
+	.8byte	.LBE983-.LBB983
 	.uleb128 0x5f
-	.4byte	0x12f8d
+	.4byte	0x13108
 	.4byte	.LLST26
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x170
-	.4byte	0x1083d
+	.4byte	0x1085f
 	.uleb128 0x5f
-	.4byte	0x12f99
+	.4byte	0x13114
 	.4byte	.LLST27
 	.uleb128 0x5b
-	.4byte	0x1347e
-	.8byte	.LBB969
-	.8byte	.LBE969-.LBB969
+	.4byte	0x135f9
+	.8byte	.LBB985
+	.8byte	.LBE985-.LBB985
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13499
+	.4byte	0x13614
 	.uleb128 0x54
-	.4byte	0x1348e
+	.4byte	0x13609
 	.uleb128 0x56
-	.8byte	.LBB970
-	.8byte	.LBE970-.LBB970
+	.8byte	.LBB986
+	.8byte	.LBE986-.LBB986
 	.uleb128 0x57
-	.4byte	0x134a4
+	.4byte	0x1361f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x133fa
-	.8byte	.LBB971
-	.8byte	.LBE971-.LBB971
+	.4byte	0x13575
+	.8byte	.LBB987
+	.8byte	.LBE987-.LBB987
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB972
-	.8byte	.LBE972-.LBB972
+	.8byte	.LBB988
+	.8byte	.LBE988-.LBB988
 	.uleb128 0x5f
-	.4byte	0x1340a
+	.4byte	0x13585
 	.4byte	.LLST28
 	.byte	0
 	.byte	0
@@ -39993,172 +40348,172 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL86
-	.4byte	0x13d70
+	.4byte	0x141a9
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12eda
-	.8byte	.LBB986
+	.4byte	0x13055
+	.8byte	.LBB1002
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
-	.2byte	0x5ed
-	.4byte	0x10aad
+	.2byte	0x62f
+	.4byte	0x10acf
 	.uleb128 0x54
-	.4byte	0x12eff
+	.4byte	0x1307a
 	.uleb128 0x54
-	.4byte	0x12ef4
+	.4byte	0x1306f
 	.uleb128 0x54
-	.4byte	0x12eea
+	.4byte	0x13065
 	.uleb128 0x6d
-	.4byte	0x12f38
-	.8byte	.LBB987
+	.4byte	0x130b3
+	.8byte	.LBB1003
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x12f5d
+	.4byte	0x130d8
 	.uleb128 0x54
-	.4byte	0x12f52
+	.4byte	0x130cd
 	.uleb128 0x54
-	.4byte	0x12f48
+	.4byte	0x130c3
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x1f0
 	.uleb128 0x57
-	.4byte	0x12f66
+	.4byte	0x130e1
 	.uleb128 0x6e
-	.4byte	0x12fa6
-	.8byte	.LBB989
+	.4byte	0x13121
+	.8byte	.LBB1005
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x109e2
+	.4byte	0x10a04
 	.uleb128 0x54
-	.4byte	0x12fc1
+	.4byte	0x1313c
 	.uleb128 0x6f
-	.4byte	0x12fb6
+	.4byte	0x13131
 	.4byte	.LLST30
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x230
 	.uleb128 0x5f
-	.4byte	0x12fcc
+	.4byte	0x13147
 	.4byte	.LLST31
 	.uleb128 0x5f
-	.4byte	0x12fd7
+	.4byte	0x13152
 	.4byte	.LLST32
 	.uleb128 0x70
-	.4byte	0x133fa
-	.8byte	.LBB991
-	.8byte	.LBE991-.LBB991
+	.4byte	0x13575
+	.8byte	.LBB1007
+	.8byte	.LBE1007-.LBB1007
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10948
+	.4byte	0x1096a
 	.uleb128 0x56
-	.8byte	.LBB992
-	.8byte	.LBE992-.LBB992
+	.8byte	.LBB1008
+	.8byte	.LBE1008-.LBB1008
 	.uleb128 0x5f
-	.4byte	0x1340a
+	.4byte	0x13585
 	.4byte	.LLST33
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB993
-	.8byte	.LBE993-.LBB993
-	.4byte	0x1099c
+	.8byte	.LBB1009
+	.8byte	.LBE1009-.LBB1009
+	.4byte	0x109be
 	.uleb128 0x57
-	.4byte	0x12fe3
+	.4byte	0x1315e
 	.uleb128 0x5b
-	.4byte	0x1347e
-	.8byte	.LBB994
-	.8byte	.LBE994-.LBB994
+	.4byte	0x135f9
+	.8byte	.LBB1010
+	.8byte	.LBE1010-.LBB1010
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13499
+	.4byte	0x13614
 	.uleb128 0x54
-	.4byte	0x1348e
+	.4byte	0x13609
 	.uleb128 0x56
-	.8byte	.LBB995
-	.8byte	.LBE995-.LBB995
+	.8byte	.LBB1011
+	.8byte	.LBE1011-.LBB1011
 	.uleb128 0x57
-	.4byte	0x134a4
+	.4byte	0x1361f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x133ce
-	.8byte	.LBB996
-	.8byte	.LBE996-.LBB996
+	.4byte	0x13549
+	.8byte	.LBB1012
+	.8byte	.LBE1012-.LBB1012
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x133e8
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x133de
+	.4byte	0x13559
 	.uleb128 0x5b
-	.4byte	0x134b0
-	.8byte	.LBB997
-	.8byte	.LBE997-.LBB997
+	.4byte	0x1362b
+	.8byte	.LBB1013
+	.8byte	.LBE1013-.LBB1013
 	.byte	0xca
-	.byte	0x54
+	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x134ca
+	.4byte	0x13645
 	.uleb128 0x54
-	.4byte	0x134c0
+	.4byte	0x1363b
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12f72
-	.8byte	.LBB1001
-	.8byte	.LBE1001-.LBB1001
+	.4byte	0x130ed
+	.8byte	.LBB1017
+	.8byte	.LBE1017-.LBB1017
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10a9d
+	.4byte	0x10abf
 	.uleb128 0x54
-	.4byte	0x12f82
+	.4byte	0x130fd
 	.uleb128 0x56
-	.8byte	.LBB1002
-	.8byte	.LBE1002-.LBB1002
+	.8byte	.LBB1018
+	.8byte	.LBE1018-.LBB1018
 	.uleb128 0x5f
-	.4byte	0x12f8d
+	.4byte	0x13108
 	.4byte	.LLST34
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x270
-	.4byte	0x10a68
+	.4byte	0x10a8a
 	.uleb128 0x5f
-	.4byte	0x12f99
+	.4byte	0x13114
 	.4byte	.LLST35
 	.uleb128 0x5b
-	.4byte	0x1347e
-	.8byte	.LBB1004
-	.8byte	.LBE1004-.LBB1004
+	.4byte	0x135f9
+	.8byte	.LBB1020
+	.8byte	.LBE1020-.LBB1020
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13499
+	.4byte	0x13614
 	.uleb128 0x54
-	.4byte	0x1348e
+	.4byte	0x13609
 	.uleb128 0x56
-	.8byte	.LBB1005
-	.8byte	.LBE1005-.LBB1005
+	.8byte	.LBB1021
+	.8byte	.LBE1021-.LBB1021
 	.uleb128 0x57
-	.4byte	0x134a4
+	.4byte	0x1361f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x133fa
-	.8byte	.LBB1006
-	.8byte	.LBE1006-.LBB1006
+	.4byte	0x13575
+	.8byte	.LBB1022
+	.8byte	.LBE1022-.LBB1022
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB1007
-	.8byte	.LBE1007-.LBB1007
+	.8byte	.LBB1023
+	.8byte	.LBE1023-.LBB1023
 	.uleb128 0x5f
-	.4byte	0x1340a
+	.4byte	0x13585
 	.4byte	.LLST36
 	.byte	0
 	.byte	0
@@ -40166,168 +40521,168 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL110
-	.4byte	0x13d70
+	.4byte	0x141a9
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12eab
-	.8byte	.LBB1016
+	.4byte	0x13026
+	.8byte	.LBB1032
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
-	.2byte	0x5bb
-	.4byte	0x10ccd
+	.2byte	0x5fd
+	.4byte	0x10cef
 	.uleb128 0x54
-	.4byte	0x12ed0
+	.4byte	0x1304b
 	.uleb128 0x54
-	.4byte	0x12ec5
+	.4byte	0x13040
 	.uleb128 0x54
-	.4byte	0x12ebb
+	.4byte	0x13036
 	.uleb128 0x6d
-	.4byte	0x12f09
-	.8byte	.LBB1017
+	.4byte	0x13084
+	.8byte	.LBB1033
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12f2e
+	.4byte	0x130a9
 	.uleb128 0x54
-	.4byte	0x12f23
+	.4byte	0x1309e
 	.uleb128 0x54
-	.4byte	0x12f19
+	.4byte	0x13094
 	.uleb128 0x6e
-	.4byte	0x12fa6
-	.8byte	.LBB1019
+	.4byte	0x13121
+	.8byte	.LBB1035
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10c03
+	.4byte	0x10c25
 	.uleb128 0x54
-	.4byte	0x12fc1
+	.4byte	0x1313c
 	.uleb128 0x6f
-	.4byte	0x12fb6
+	.4byte	0x13131
 	.4byte	.LLST37
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x2f0
 	.uleb128 0x5f
-	.4byte	0x12fcc
+	.4byte	0x13147
 	.4byte	.LLST38
 	.uleb128 0x5f
-	.4byte	0x12fd7
+	.4byte	0x13152
 	.4byte	.LLST39
 	.uleb128 0x70
-	.4byte	0x133fa
-	.8byte	.LBB1021
-	.8byte	.LBE1021-.LBB1021
+	.4byte	0x13575
+	.8byte	.LBB1037
+	.8byte	.LBE1037-.LBB1037
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10b69
+	.4byte	0x10b8b
 	.uleb128 0x56
-	.8byte	.LBB1022
-	.8byte	.LBE1022-.LBB1022
+	.8byte	.LBB1038
+	.8byte	.LBE1038-.LBB1038
 	.uleb128 0x5f
-	.4byte	0x1340a
+	.4byte	0x13585
 	.4byte	.LLST40
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1023
-	.8byte	.LBE1023-.LBB1023
-	.4byte	0x10bbd
+	.8byte	.LBB1039
+	.8byte	.LBE1039-.LBB1039
+	.4byte	0x10bdf
 	.uleb128 0x57
-	.4byte	0x12fe3
+	.4byte	0x1315e
 	.uleb128 0x5b
-	.4byte	0x1347e
-	.8byte	.LBB1024
-	.8byte	.LBE1024-.LBB1024
+	.4byte	0x135f9
+	.8byte	.LBB1040
+	.8byte	.LBE1040-.LBB1040
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13499
+	.4byte	0x13614
 	.uleb128 0x54
-	.4byte	0x1348e
+	.4byte	0x13609
 	.uleb128 0x56
-	.8byte	.LBB1025
-	.8byte	.LBE1025-.LBB1025
+	.8byte	.LBB1041
+	.8byte	.LBE1041-.LBB1041
 	.uleb128 0x57
-	.4byte	0x134a4
+	.4byte	0x1361f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x133ce
-	.8byte	.LBB1026
-	.8byte	.LBE1026-.LBB1026
+	.4byte	0x13549
+	.8byte	.LBB1042
+	.8byte	.LBE1042-.LBB1042
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x133e8
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x133de
+	.4byte	0x13559
 	.uleb128 0x5b
-	.4byte	0x134b0
-	.8byte	.LBB1027
-	.8byte	.LBE1027-.LBB1027
+	.4byte	0x1362b
+	.8byte	.LBB1043
+	.8byte	.LBE1043-.LBB1043
 	.byte	0xca
-	.byte	0x54
+	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x134ca
+	.4byte	0x13645
 	.uleb128 0x54
-	.4byte	0x134c0
+	.4byte	0x1363b
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12f72
-	.8byte	.LBB1033
-	.8byte	.LBE1033-.LBB1033
+	.4byte	0x130ed
+	.8byte	.LBB1049
+	.8byte	.LBE1049-.LBB1049
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x10cbe
+	.4byte	0x10ce0
 	.uleb128 0x54
-	.4byte	0x12f82
+	.4byte	0x130fd
 	.uleb128 0x56
-	.8byte	.LBB1034
-	.8byte	.LBE1034-.LBB1034
+	.8byte	.LBB1050
+	.8byte	.LBE1050-.LBB1050
 	.uleb128 0x5f
-	.4byte	0x12f8d
+	.4byte	0x13108
 	.4byte	.LLST41
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x340
-	.4byte	0x10c89
+	.4byte	0x10cab
 	.uleb128 0x5f
-	.4byte	0x12f99
+	.4byte	0x13114
 	.4byte	.LLST42
 	.uleb128 0x5b
-	.4byte	0x1347e
-	.8byte	.LBB1036
-	.8byte	.LBE1036-.LBB1036
+	.4byte	0x135f9
+	.8byte	.LBB1052
+	.8byte	.LBE1052-.LBB1052
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13499
+	.4byte	0x13614
 	.uleb128 0x54
-	.4byte	0x1348e
+	.4byte	0x13609
 	.uleb128 0x56
-	.8byte	.LBB1037
-	.8byte	.LBE1037-.LBB1037
+	.8byte	.LBB1053
+	.8byte	.LBE1053-.LBB1053
 	.uleb128 0x57
-	.4byte	0x134a4
+	.4byte	0x1361f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x133fa
-	.8byte	.LBB1038
-	.8byte	.LBE1038-.LBB1038
+	.4byte	0x13575
+	.8byte	.LBB1054
+	.8byte	.LBE1054-.LBB1054
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB1039
-	.8byte	.LBE1039-.LBB1039
+	.8byte	.LBB1055
+	.8byte	.LBE1055-.LBB1055
 	.uleb128 0x5f
-	.4byte	0x1340a
+	.4byte	0x13585
 	.4byte	.LLST43
 	.byte	0
 	.byte	0
@@ -40335,172 +40690,172 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL137
-	.4byte	0x13d63
+	.4byte	0x1419c
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12eda
-	.8byte	.LBB1050
+	.4byte	0x13055
+	.8byte	.LBB1066
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
-	.2byte	0x60a
-	.4byte	0x10f09
+	.2byte	0x64c
+	.4byte	0x10f2b
 	.uleb128 0x54
-	.4byte	0x12eff
+	.4byte	0x1307a
 	.uleb128 0x54
-	.4byte	0x12ef4
+	.4byte	0x1306f
 	.uleb128 0x54
-	.4byte	0x12eea
+	.4byte	0x13065
 	.uleb128 0x6d
-	.4byte	0x12f38
-	.8byte	.LBB1051
+	.4byte	0x130b3
+	.8byte	.LBB1067
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x12f5d
+	.4byte	0x130d8
 	.uleb128 0x54
-	.4byte	0x12f52
+	.4byte	0x130cd
 	.uleb128 0x54
-	.4byte	0x12f48
+	.4byte	0x130c3
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x370
 	.uleb128 0x5f
-	.4byte	0x12f66
+	.4byte	0x130e1
 	.4byte	.LLST44
 	.uleb128 0x6e
-	.4byte	0x12fa6
-	.8byte	.LBB1053
+	.4byte	0x13121
+	.8byte	.LBB1069
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x10e31
+	.4byte	0x10e53
 	.uleb128 0x54
-	.4byte	0x12fc1
+	.4byte	0x1313c
 	.uleb128 0x6f
-	.4byte	0x12fb6
+	.4byte	0x13131
 	.4byte	.LLST45
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x5f
-	.4byte	0x12fcc
+	.4byte	0x13147
 	.4byte	.LLST46
 	.uleb128 0x5f
-	.4byte	0x12fd7
+	.4byte	0x13152
 	.4byte	.LLST47
 	.uleb128 0x70
-	.4byte	0x133fa
-	.8byte	.LBB1055
-	.8byte	.LBE1055-.LBB1055
+	.4byte	0x13575
+	.8byte	.LBB1071
+	.8byte	.LBE1071-.LBB1071
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10d97
+	.4byte	0x10db9
 	.uleb128 0x56
-	.8byte	.LBB1056
-	.8byte	.LBE1056-.LBB1056
+	.8byte	.LBB1072
+	.8byte	.LBE1072-.LBB1072
 	.uleb128 0x5f
-	.4byte	0x1340a
+	.4byte	0x13585
 	.4byte	.LLST48
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1057
-	.8byte	.LBE1057-.LBB1057
-	.4byte	0x10deb
+	.8byte	.LBB1073
+	.8byte	.LBE1073-.LBB1073
+	.4byte	0x10e0d
 	.uleb128 0x57
-	.4byte	0x12fe3
+	.4byte	0x1315e
 	.uleb128 0x5b
-	.4byte	0x1347e
-	.8byte	.LBB1058
-	.8byte	.LBE1058-.LBB1058
+	.4byte	0x135f9
+	.8byte	.LBB1074
+	.8byte	.LBE1074-.LBB1074
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13499
+	.4byte	0x13614
 	.uleb128 0x54
-	.4byte	0x1348e
+	.4byte	0x13609
 	.uleb128 0x56
-	.8byte	.LBB1059
-	.8byte	.LBE1059-.LBB1059
+	.8byte	.LBB1075
+	.8byte	.LBE1075-.LBB1075
 	.uleb128 0x57
-	.4byte	0x134a4
+	.4byte	0x1361f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x133ce
-	.8byte	.LBB1060
-	.8byte	.LBE1060-.LBB1060
+	.4byte	0x13549
+	.8byte	.LBB1076
+	.8byte	.LBE1076-.LBB1076
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x133e8
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x133de
+	.4byte	0x13559
 	.uleb128 0x5b
-	.4byte	0x134b0
-	.8byte	.LBB1061
-	.8byte	.LBE1061-.LBB1061
+	.4byte	0x1362b
+	.8byte	.LBB1077
+	.8byte	.LBE1077-.LBB1077
 	.byte	0xca
-	.byte	0x54
+	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x134ca
+	.4byte	0x13645
 	.uleb128 0x54
-	.4byte	0x134c0
+	.4byte	0x1363b
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12f72
-	.8byte	.LBB1067
-	.8byte	.LBE1067-.LBB1067
+	.4byte	0x130ed
+	.8byte	.LBB1083
+	.8byte	.LBE1083-.LBB1083
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10eec
+	.4byte	0x10f0e
 	.uleb128 0x54
-	.4byte	0x12f82
+	.4byte	0x130fd
 	.uleb128 0x56
-	.8byte	.LBB1068
-	.8byte	.LBE1068-.LBB1068
+	.8byte	.LBB1084
+	.8byte	.LBE1084-.LBB1084
 	.uleb128 0x5f
-	.4byte	0x12f8d
+	.4byte	0x13108
 	.4byte	.LLST49
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x420
-	.4byte	0x10eb7
+	.4byte	0x10ed9
 	.uleb128 0x5f
-	.4byte	0x12f99
+	.4byte	0x13114
 	.4byte	.LLST50
 	.uleb128 0x5b
-	.4byte	0x1347e
-	.8byte	.LBB1070
-	.8byte	.LBE1070-.LBB1070
+	.4byte	0x135f9
+	.8byte	.LBB1086
+	.8byte	.LBE1086-.LBB1086
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13499
+	.4byte	0x13614
 	.uleb128 0x54
-	.4byte	0x1348e
+	.4byte	0x13609
 	.uleb128 0x56
-	.8byte	.LBB1071
-	.8byte	.LBE1071-.LBB1071
+	.8byte	.LBB1087
+	.8byte	.LBE1087-.LBB1087
 	.uleb128 0x57
-	.4byte	0x134a4
+	.4byte	0x1361f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x133fa
-	.8byte	.LBB1072
-	.8byte	.LBE1072-.LBB1072
+	.4byte	0x13575
+	.8byte	.LBB1088
+	.8byte	.LBE1088-.LBB1088
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB1073
-	.8byte	.LBE1073-.LBB1073
+	.8byte	.LBB1089
+	.8byte	.LBE1089-.LBB1089
 	.uleb128 0x5f
-	.4byte	0x1340a
+	.4byte	0x13585
 	.4byte	.LLST51
 	.byte	0
 	.byte	0
@@ -40508,68 +40863,68 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL149
-	.4byte	0x13d70
+	.4byte	0x141a9
 	.uleb128 0x4e
 	.8byte	.LVL227
-	.4byte	0x13bb9
+	.4byte	0x13ff2
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12eab
-	.8byte	.LBB1086
+	.4byte	0x13026
+	.8byte	.LBB1102
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
-	.2byte	0x627
-	.4byte	0x10fbb
+	.2byte	0x669
+	.4byte	0x10fdd
 	.uleb128 0x54
-	.4byte	0x12ed0
+	.4byte	0x1304b
 	.uleb128 0x54
-	.4byte	0x12ec5
+	.4byte	0x13040
 	.uleb128 0x54
-	.4byte	0x12ebb
+	.4byte	0x13036
 	.uleb128 0x6d
-	.4byte	0x12f09
-	.8byte	.LBB1087
+	.4byte	0x13084
+	.8byte	.LBB1103
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12f2e
+	.4byte	0x130a9
 	.uleb128 0x54
-	.4byte	0x12f23
+	.4byte	0x1309e
 	.uleb128 0x54
-	.4byte	0x12f19
+	.4byte	0x13094
 	.uleb128 0x6d
-	.4byte	0x12fa6
-	.8byte	.LBB1089
+	.4byte	0x13121
+	.8byte	.LBB1105
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x54
-	.4byte	0x12fc1
+	.4byte	0x1313c
 	.uleb128 0x71
-	.4byte	0x12fb6
+	.4byte	0x13131
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x4b0
 	.uleb128 0x57
-	.4byte	0x12fcc
+	.4byte	0x13147
 	.uleb128 0x5f
-	.4byte	0x12fd7
+	.4byte	0x13152
 	.4byte	.LLST52
 	.uleb128 0x5b
-	.4byte	0x133fa
-	.8byte	.LBB1091
-	.8byte	.LBE1091-.LBB1091
+	.4byte	0x13575
+	.8byte	.LBB1107
+	.8byte	.LBE1107-.LBB1107
 	.byte	0x6
 	.byte	0x4d
 	.uleb128 0x56
-	.8byte	.LBB1092
-	.8byte	.LBE1092-.LBB1092
+	.8byte	.LBB1108
+	.8byte	.LBE1108-.LBB1108
 	.uleb128 0x5f
-	.4byte	0x1340a
+	.4byte	0x13585
 	.4byte	.LLST53
 	.byte	0
 	.byte	0
@@ -40578,163 +40933,163 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12eab
-	.8byte	.LBB1098
+	.4byte	0x13026
+	.8byte	.LBB1114
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
-	.2byte	0x617
-	.4byte	0x111db
+	.2byte	0x659
+	.4byte	0x111fd
 	.uleb128 0x54
-	.4byte	0x12ed0
+	.4byte	0x1304b
 	.uleb128 0x54
-	.4byte	0x12ec5
+	.4byte	0x13040
 	.uleb128 0x54
-	.4byte	0x12ebb
+	.4byte	0x13036
 	.uleb128 0x6d
-	.4byte	0x12f09
-	.8byte	.LBB1099
+	.4byte	0x13084
+	.8byte	.LBB1115
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12f2e
+	.4byte	0x130a9
 	.uleb128 0x54
-	.4byte	0x12f23
+	.4byte	0x1309e
 	.uleb128 0x54
-	.4byte	0x12f19
+	.4byte	0x13094
 	.uleb128 0x6e
-	.4byte	0x12fa6
-	.8byte	.LBB1101
+	.4byte	0x13121
+	.8byte	.LBB1117
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x11111
+	.4byte	0x11133
 	.uleb128 0x54
-	.4byte	0x12fc1
+	.4byte	0x1313c
 	.uleb128 0x6f
-	.4byte	0x12fb6
+	.4byte	0x13131
 	.4byte	.LLST54
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x540
 	.uleb128 0x5f
-	.4byte	0x12fcc
+	.4byte	0x13147
 	.4byte	.LLST55
 	.uleb128 0x5f
-	.4byte	0x12fd7
+	.4byte	0x13152
 	.4byte	.LLST56
 	.uleb128 0x70
-	.4byte	0x133fa
-	.8byte	.LBB1103
-	.8byte	.LBE1103-.LBB1103
+	.4byte	0x13575
+	.8byte	.LBB1119
+	.8byte	.LBE1119-.LBB1119
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x11077
+	.4byte	0x11099
 	.uleb128 0x56
-	.8byte	.LBB1104
-	.8byte	.LBE1104-.LBB1104
+	.8byte	.LBB1120
+	.8byte	.LBE1120-.LBB1120
 	.uleb128 0x5f
-	.4byte	0x1340a
+	.4byte	0x13585
 	.4byte	.LLST57
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1105
-	.8byte	.LBE1105-.LBB1105
-	.4byte	0x110cb
+	.8byte	.LBB1121
+	.8byte	.LBE1121-.LBB1121
+	.4byte	0x110ed
 	.uleb128 0x57
-	.4byte	0x12fe3
+	.4byte	0x1315e
 	.uleb128 0x5b
-	.4byte	0x1347e
-	.8byte	.LBB1106
-	.8byte	.LBE1106-.LBB1106
+	.4byte	0x135f9
+	.8byte	.LBB1122
+	.8byte	.LBE1122-.LBB1122
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13499
+	.4byte	0x13614
 	.uleb128 0x54
-	.4byte	0x1348e
+	.4byte	0x13609
 	.uleb128 0x56
-	.8byte	.LBB1107
-	.8byte	.LBE1107-.LBB1107
+	.8byte	.LBB1123
+	.8byte	.LBE1123-.LBB1123
 	.uleb128 0x57
-	.4byte	0x134a4
+	.4byte	0x1361f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x133ce
-	.8byte	.LBB1108
-	.8byte	.LBE1108-.LBB1108
+	.4byte	0x13549
+	.8byte	.LBB1124
+	.8byte	.LBE1124-.LBB1124
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x133e8
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x133de
+	.4byte	0x13559
 	.uleb128 0x5b
-	.4byte	0x134b0
-	.8byte	.LBB1109
-	.8byte	.LBE1109-.LBB1109
+	.4byte	0x1362b
+	.8byte	.LBB1125
+	.8byte	.LBE1125-.LBB1125
 	.byte	0xca
-	.byte	0x54
+	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x134ca
+	.4byte	0x13645
 	.uleb128 0x54
-	.4byte	0x134c0
+	.4byte	0x1363b
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12f72
-	.8byte	.LBB1117
-	.8byte	.LBE1117-.LBB1117
+	.4byte	0x130ed
+	.8byte	.LBB1133
+	.8byte	.LBE1133-.LBB1133
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x111cc
+	.4byte	0x111ee
 	.uleb128 0x54
-	.4byte	0x12f82
+	.4byte	0x130fd
 	.uleb128 0x56
-	.8byte	.LBB1118
-	.8byte	.LBE1118-.LBB1118
+	.8byte	.LBB1134
+	.8byte	.LBE1134-.LBB1134
 	.uleb128 0x5f
-	.4byte	0x12f8d
+	.4byte	0x13108
 	.4byte	.LLST58
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x590
-	.4byte	0x11197
+	.4byte	0x111b9
 	.uleb128 0x5f
-	.4byte	0x12f99
+	.4byte	0x13114
 	.4byte	.LLST59
 	.uleb128 0x5b
-	.4byte	0x1347e
-	.8byte	.LBB1120
-	.8byte	.LBE1120-.LBB1120
+	.4byte	0x135f9
+	.8byte	.LBB1136
+	.8byte	.LBE1136-.LBB1136
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13499
+	.4byte	0x13614
 	.uleb128 0x54
-	.4byte	0x1348e
+	.4byte	0x13609
 	.uleb128 0x56
-	.8byte	.LBB1121
-	.8byte	.LBE1121-.LBB1121
+	.8byte	.LBB1137
+	.8byte	.LBE1137-.LBB1137
 	.uleb128 0x57
-	.4byte	0x134a4
+	.4byte	0x1361f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x133fa
-	.8byte	.LBB1122
-	.8byte	.LBE1122-.LBB1122
+	.4byte	0x13575
+	.8byte	.LBB1138
+	.8byte	.LBE1138-.LBB1138
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB1123
-	.8byte	.LBE1123-.LBB1123
+	.8byte	.LBB1139
+	.8byte	.LBE1139-.LBB1139
 	.uleb128 0x5f
-	.4byte	0x1340a
+	.4byte	0x13585
 	.4byte	.LLST60
 	.byte	0
 	.byte	0
@@ -40742,167 +41097,167 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL210
-	.4byte	0x13d63
+	.4byte	0x1419c
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12eab
-	.8byte	.LBB1134
+	.4byte	0x13026
+	.8byte	.LBB1150
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
-	.2byte	0x5c9
-	.4byte	0x113fb
+	.2byte	0x60b
+	.4byte	0x1141d
 	.uleb128 0x54
-	.4byte	0x12ed0
+	.4byte	0x1304b
 	.uleb128 0x54
-	.4byte	0x12ec5
+	.4byte	0x13040
 	.uleb128 0x54
-	.4byte	0x12ebb
+	.4byte	0x13036
 	.uleb128 0x6d
-	.4byte	0x12f09
-	.8byte	.LBB1135
+	.4byte	0x13084
+	.8byte	.LBB1151
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12f2e
+	.4byte	0x130a9
 	.uleb128 0x54
-	.4byte	0x12f23
+	.4byte	0x1309e
 	.uleb128 0x54
-	.4byte	0x12f19
+	.4byte	0x13094
 	.uleb128 0x6e
-	.4byte	0x12fa6
-	.8byte	.LBB1137
+	.4byte	0x13121
+	.8byte	.LBB1153
 	.4byte	.Ldebug_ranges0+0x620
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x11331
+	.4byte	0x11353
 	.uleb128 0x54
-	.4byte	0x12fc1
+	.4byte	0x1313c
 	.uleb128 0x6f
-	.4byte	0x12fb6
+	.4byte	0x13131
 	.4byte	.LLST61
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x620
 	.uleb128 0x5f
-	.4byte	0x12fcc
+	.4byte	0x13147
 	.4byte	.LLST62
 	.uleb128 0x5f
-	.4byte	0x12fd7
+	.4byte	0x13152
 	.4byte	.LLST63
 	.uleb128 0x70
-	.4byte	0x133fa
-	.8byte	.LBB1139
-	.8byte	.LBE1139-.LBB1139
+	.4byte	0x13575
+	.8byte	.LBB1155
+	.8byte	.LBE1155-.LBB1155
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x11297
+	.4byte	0x112b9
 	.uleb128 0x56
-	.8byte	.LBB1140
-	.8byte	.LBE1140-.LBB1140
+	.8byte	.LBB1156
+	.8byte	.LBE1156-.LBB1156
 	.uleb128 0x5f
-	.4byte	0x1340a
+	.4byte	0x13585
 	.4byte	.LLST64
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1141
-	.8byte	.LBE1141-.LBB1141
-	.4byte	0x112eb
+	.8byte	.LBB1157
+	.8byte	.LBE1157-.LBB1157
+	.4byte	0x1130d
 	.uleb128 0x57
-	.4byte	0x12fe3
+	.4byte	0x1315e
 	.uleb128 0x5b
-	.4byte	0x1347e
-	.8byte	.LBB1142
-	.8byte	.LBE1142-.LBB1142
+	.4byte	0x135f9
+	.8byte	.LBB1158
+	.8byte	.LBE1158-.LBB1158
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13499
+	.4byte	0x13614
 	.uleb128 0x54
-	.4byte	0x1348e
+	.4byte	0x13609
 	.uleb128 0x56
-	.8byte	.LBB1143
-	.8byte	.LBE1143-.LBB1143
+	.8byte	.LBB1159
+	.8byte	.LBE1159-.LBB1159
 	.uleb128 0x57
-	.4byte	0x134a4
+	.4byte	0x1361f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x133ce
-	.8byte	.LBB1144
-	.8byte	.LBE1144-.LBB1144
+	.4byte	0x13549
+	.8byte	.LBB1160
+	.8byte	.LBE1160-.LBB1160
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x133e8
+	.4byte	0x13563
 	.uleb128 0x54
-	.4byte	0x133de
+	.4byte	0x13559
 	.uleb128 0x5b
-	.4byte	0x134b0
-	.8byte	.LBB1145
-	.8byte	.LBE1145-.LBB1145
+	.4byte	0x1362b
+	.8byte	.LBB1161
+	.8byte	.LBE1161-.LBB1161
 	.byte	0xca
-	.byte	0x54
+	.byte	0x61
 	.uleb128 0x54
-	.4byte	0x134ca
+	.4byte	0x13645
 	.uleb128 0x54
-	.4byte	0x134c0
+	.4byte	0x1363b
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12f72
-	.8byte	.LBB1153
-	.8byte	.LBE1153-.LBB1153
+	.4byte	0x130ed
+	.8byte	.LBB1169
+	.8byte	.LBE1169-.LBB1169
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x113ec
+	.4byte	0x1140e
 	.uleb128 0x54
-	.4byte	0x12f82
+	.4byte	0x130fd
 	.uleb128 0x56
-	.8byte	.LBB1154
-	.8byte	.LBE1154-.LBB1154
+	.8byte	.LBB1170
+	.8byte	.LBE1170-.LBB1170
 	.uleb128 0x5f
-	.4byte	0x12f8d
+	.4byte	0x13108
 	.4byte	.LLST65
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x670
-	.4byte	0x113b7
+	.4byte	0x113d9
 	.uleb128 0x5f
-	.4byte	0x12f99
+	.4byte	0x13114
 	.4byte	.LLST66
 	.uleb128 0x5b
-	.4byte	0x1347e
-	.8byte	.LBB1156
-	.8byte	.LBE1156-.LBB1156
+	.4byte	0x135f9
+	.8byte	.LBB1172
+	.8byte	.LBE1172-.LBB1172
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13499
+	.4byte	0x13614
 	.uleb128 0x54
-	.4byte	0x1348e
+	.4byte	0x13609
 	.uleb128 0x56
-	.8byte	.LBB1157
-	.8byte	.LBE1157-.LBB1157
+	.8byte	.LBB1173
+	.8byte	.LBE1173-.LBB1173
 	.uleb128 0x57
-	.4byte	0x134a4
+	.4byte	0x1361f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x133fa
-	.8byte	.LBB1158
-	.8byte	.LBE1158-.LBB1158
+	.4byte	0x13575
+	.8byte	.LBB1174
+	.8byte	.LBE1174-.LBB1174
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x56
-	.8byte	.LBB1159
-	.8byte	.LBE1159-.LBB1159
+	.8byte	.LBB1175
+	.8byte	.LBE1175-.LBB1175
 	.uleb128 0x5f
-	.4byte	0x1340a
+	.4byte	0x13585
 	.4byte	.LLST67
 	.byte	0
 	.byte	0
@@ -40910,1558 +41265,1735 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL218
-	.4byte	0x13d63
+	.4byte	0x1419c
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL51
-	.4byte	0x13c3e
+	.4byte	0x14077
 	.uleb128 0x4e
 	.8byte	.LVL52
-	.4byte	0x13c94
+	.4byte	0x140cd
 	.uleb128 0x4e
 	.8byte	.LVL53
-	.4byte	0x13d18
+	.4byte	0x14151
 	.uleb128 0x4e
 	.8byte	.LVL64
-	.4byte	0x13d7d
+	.4byte	0x141b6
 	.uleb128 0x4e
 	.8byte	.LVL67
-	.4byte	0x13bcf
+	.4byte	0x14008
 	.uleb128 0x4e
 	.8byte	.LVL70
-	.4byte	0x13b55
+	.4byte	0x13f8e
 	.uleb128 0x4e
 	.8byte	.LVL87
-	.4byte	0x13d18
+	.4byte	0x14151
 	.uleb128 0x4e
 	.8byte	.LVL88
-	.4byte	0x13d89
+	.4byte	0x141c2
 	.uleb128 0x4e
 	.8byte	.LVL90
-	.4byte	0x13c4a
+	.4byte	0x14083
 	.uleb128 0x4e
 	.8byte	.LVL97
-	.4byte	0x13c3e
+	.4byte	0x14077
 	.uleb128 0x4e
 	.8byte	.LVL111
-	.4byte	0x13d95
+	.4byte	0x141ce
 	.uleb128 0x4e
 	.8byte	.LVL112
-	.4byte	0x13c4a
+	.4byte	0x14083
 	.uleb128 0x4e
 	.8byte	.LVL113
-	.4byte	0x13c9e
+	.4byte	0x140d7
 	.uleb128 0x4e
 	.8byte	.LVL123
-	.4byte	0x13da1
+	.4byte	0x141da
 	.uleb128 0x4e
 	.8byte	.LVL124
-	.4byte	0x13d18
+	.4byte	0x14151
 	.uleb128 0x4e
 	.8byte	.LVL151
-	.4byte	0x13b55
+	.4byte	0x13f8e
 	.uleb128 0x4e
 	.8byte	.LVL154
-	.4byte	0x13b55
+	.4byte	0x13f8e
 	.uleb128 0x4e
 	.8byte	.LVL156
-	.4byte	0x13c3e
+	.4byte	0x14077
 	.uleb128 0x4e
 	.8byte	.LVL158
-	.4byte	0x13c3e
+	.4byte	0x14077
 	.uleb128 0x4e
 	.8byte	.LVL159
-	.4byte	0x13c94
+	.4byte	0x140cd
 	.uleb128 0x4e
 	.8byte	.LVL160
-	.4byte	0x13d18
+	.4byte	0x14151
 	.uleb128 0x4e
 	.8byte	.LVL173
-	.4byte	0x13bcf
+	.4byte	0x14008
 	.uleb128 0x4e
 	.8byte	.LVL176
-	.4byte	0x13bcf
+	.4byte	0x14008
 	.uleb128 0x4e
 	.8byte	.LVL178
-	.4byte	0x13c3e
+	.4byte	0x14077
 	.uleb128 0x4e
 	.8byte	.LVL179
-	.4byte	0x13d18
+	.4byte	0x14151
 	.uleb128 0x4e
 	.8byte	.LVL187
-	.4byte	0x13d7d
+	.4byte	0x141b6
 	.uleb128 0x4e
 	.8byte	.LVL221
-	.4byte	0x13c9e
+	.4byte	0x140d7
 	.uleb128 0x4e
 	.8byte	.LVL228
-	.4byte	0x13bcf
+	.4byte	0x14008
 	.uleb128 0x4e
 	.8byte	.LVL229
-	.4byte	0x13cdc
+	.4byte	0x14115
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0x11585
+	.4byte	0x115a7
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xa
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x11575
+	.4byte	0x11597
 	.uleb128 0x62
-	.4byte	.LASF3062
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x550
+	.2byte	0x592
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x115b4
+	.4byte	0x115d6
 	.uleb128 0x64
-	.4byte	.LASF2994
+	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x550
-	.4byte	0xe11d
+	.2byte	0x592
+	.4byte	0xe13f
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x552
-	.4byte	0xa545
+	.2byte	0x594
+	.4byte	0xa55b
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3064
+	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x54a
-	.8byte	.LFB2823
-	.8byte	.LFE2823-.LFB2823
+	.2byte	0x58c
+	.8byte	.LFB2828
+	.8byte	.LFE2828-.LFB2828
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x115ee
+	.4byte	0x11610
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x54a
-	.4byte	0x31a7
+	.2byte	0x58c
+	.4byte	0x31bd
 	.4byte	.LLST68
 	.uleb128 0x4e
 	.8byte	.LVL242
-	.4byte	0x12050
+	.4byte	0x1200b
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3065
+	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0x53e
-	.8byte	.LFB2822
-	.8byte	.LFE2822-.LFB2822
+	.2byte	0x580
+	.8byte	.LFB2827
+	.8byte	.LFE2827-.LFB2827
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1164e
+	.4byte	0x11670
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x53e
-	.4byte	0x31a7
+	.2byte	0x580
+	.4byte	0x31bd
 	.4byte	.LLST8
 	.uleb128 0x46
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x540
-	.4byte	0xe70a
+	.2byte	0x582
+	.4byte	0xe72c
 	.uleb128 0x5e
-	.4byte	0x12e3d
-	.8byte	.LBB914
+	.4byte	0x12fb8
+	.8byte	.LBB930
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.2byte	0x544
+	.2byte	0x586
 	.uleb128 0x54
-	.4byte	0x12e49
+	.4byte	0x12fc4
 	.uleb128 0x4e
 	.8byte	.LVL41
-	.4byte	0x13dad
+	.4byte	0x141e6
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3066
+	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0x52e
+	.2byte	0x570
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11678
+	.4byte	0x1169a
 	.uleb128 0x64
-	.4byte	.LASF2994
+	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x52e
-	.4byte	0xe11d
+	.2byte	0x570
+	.4byte	0xe13f
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x530
-	.4byte	0xe3f6
+	.2byte	0x572
+	.4byte	0xe418
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3067
+	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0x3f8
+	.2byte	0x443
 	.4byte	0xc6
-	.8byte	.LFB2820
-	.8byte	.LFE2820-.LFB2820
+	.8byte	.LFB2825
+	.8byte	.LFE2825-.LFB2825
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11e5f
+	.4byte	0x11e33
 	.uleb128 0x51
 	.string	"ptr"
 	.byte	0x1
-	.2byte	0x3f8
+	.2byte	0x443
 	.4byte	0x443
-	.4byte	.LLST155
+	.4byte	.LLST176
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x3fa
-	.4byte	0xe45b
-	.4byte	.LLST156
-	.uleb128 0x46
-	.4byte	.LASF2994
-	.byte	0x1
-	.2byte	0x3fb
-	.4byte	0xe11d
+	.2byte	0x445
+	.4byte	0xe47d
+	.4byte	.LLST177
 	.uleb128 0x46
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x3fc
-	.4byte	0xe70a
+	.2byte	0x446
+	.4byte	0xe72c
 	.uleb128 0x68
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x3fd
-	.4byte	0xe3f6
-	.4byte	.LLST157
+	.2byte	0x447
+	.4byte	0xe418
+	.4byte	.LLST178
 	.uleb128 0x59
-	.4byte	.LASF3068
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x3fe
+	.2byte	0x448
 	.4byte	0xc6
-	.4byte	.LLST158
+	.4byte	.LLST179
 	.uleb128 0x59
-	.4byte	.LASF2964
+	.4byte	.LASF2968
 	.byte	0x1
-	.2byte	0x3ff
+	.2byte	0x449
 	.4byte	0xc6
-	.4byte	.LLST159
+	.4byte	.LLST180
 	.uleb128 0x4c
-	.4byte	.LASF3069
+	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0x400
-	.4byte	0xd8bb
+	.2byte	0x44a
+	.4byte	0xd8d1
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -72
 	.uleb128 0x59
-	.4byte	.LASF3070
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x401
-	.4byte	0xe3f6
-	.4byte	.LLST160
+	.2byte	0x44b
+	.4byte	0xe418
+	.4byte	.LLST181
 	.uleb128 0x6b
-	.4byte	.LASF3072
+	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0x4fe
-	.8byte	.L659
+	.2byte	0x540
+	.8byte	.L690
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xf10
-	.4byte	0x117d4
+	.4byte	.Ldebug_ranges0+0x1140
+	.4byte	0x117ea
 	.uleb128 0x46
-	.4byte	.LASF3059
+	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x440
+	.2byte	0x48a
 	.4byte	0xc6
 	.uleb128 0x56
-	.8byte	.LBB1704
-	.8byte	.LBE1704-.LBB1704
+	.8byte	.LBB1815
+	.8byte	.LBE1815-.LBB1815
 	.uleb128 0x6b
-	.4byte	.LASF3071
+	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x440
-	.8byte	.L641
+	.2byte	0x48a
+	.8byte	.L672
 	.uleb128 0x4c
-	.4byte	.LASF3060
+	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x440
-	.4byte	0x14fd
+	.2byte	0x48a
+	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3059
+	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x440
+	.2byte	0x48a
 	.4byte	0x194
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xf40
-	.4byte	0x117b8
+	.4byte	.Ldebug_ranges0+0x1170
+	.4byte	0x117ce
 	.uleb128 0x59
-	.4byte	.LASF3061
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x440
+	.2byte	0x48a
 	.4byte	0x194
-	.4byte	.LLST165
+	.4byte	.LLST185
 	.uleb128 0x4e
-	.8byte	.LVL816
-	.4byte	0x13d31
+	.8byte	.LVL831
+	.4byte	0x1416a
 	.uleb128 0x4e
-	.8byte	.LVL817
-	.4byte	0x13d3d
+	.8byte	.LVL832
+	.4byte	0x14176
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL814
-	.4byte	0x13d4a
+	.8byte	.LVL829
+	.4byte	0x14183
 	.uleb128 0x4e
-	.8byte	.LVL818
-	.4byte	0x13d56
+	.8byte	.LVL833
+	.4byte	0x1418f
 	.byte	0
 	.byte	0
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xeb0
-	.4byte	0x11876
+	.4byte	.Ldebug_ranges0+0x10e0
+	.4byte	0x1188c
 	.uleb128 0x46
-	.4byte	.LASF3059
+	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x4ed
+	.2byte	0x52f
 	.4byte	0xc6
 	.uleb128 0x56
-	.8byte	.LBB1697
-	.8byte	.LBE1697-.LBB1697
+	.8byte	.LBB1811
+	.8byte	.LBE1811-.LBB1811
 	.uleb128 0x6b
-	.4byte	.LASF3071
+	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x4ed
-	.8byte	.L699
+	.2byte	0x52f
+	.8byte	.L727
 	.uleb128 0x4c
-	.4byte	.LASF3060
+	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x4ed
-	.4byte	0x14fd
+	.2byte	0x52f
+	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3059
+	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x4ed
+	.2byte	0x52f
 	.4byte	0x194
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xee0
-	.4byte	0x1185a
+	.4byte	.Ldebug_ranges0+0x1110
+	.4byte	0x11870
 	.uleb128 0x59
-	.4byte	.LASF3061
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x4ed
+	.2byte	0x52f
 	.4byte	0x194
-	.4byte	.LLST163
+	.4byte	.LLST184
 	.uleb128 0x4e
-	.8byte	.LVL772
-	.4byte	0x13d31
+	.8byte	.LVL820
+	.4byte	0x1416a
 	.uleb128 0x4e
-	.8byte	.LVL773
-	.4byte	0x13d3d
+	.8byte	.LVL821
+	.4byte	0x14176
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL770
-	.4byte	0x13d4a
+	.8byte	.LVL818
+	.4byte	0x14183
 	.uleb128 0x4e
-	.8byte	.LVL774
-	.4byte	0x13d56
+	.8byte	.LVL822
+	.4byte	0x1418f
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1691
-	.8byte	.LBE1691-.LBB1691
-	.4byte	0x11928
+	.8byte	.LBB1805
+	.8byte	.LBE1805-.LBB1805
+	.4byte	0x1193e
 	.uleb128 0x46
-	.4byte	.LASF3059
+	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x51a
+	.2byte	0x55c
 	.4byte	0xc6
 	.uleb128 0x56
-	.8byte	.LBB1692
-	.8byte	.LBE1692-.LBB1692
+	.8byte	.LBB1806
+	.8byte	.LBE1806-.LBB1806
 	.uleb128 0x72
-	.4byte	.LASF3071
+	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x51a
+	.2byte	0x55c
 	.uleb128 0x4c
-	.4byte	.LASF3060
+	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x51a
-	.4byte	0x14fd
+	.2byte	0x55c
+	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3059
+	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x51a
+	.2byte	0x55c
 	.4byte	0x194
 	.uleb128 0x6c
-	.8byte	.LBB1693
-	.8byte	.LBE1693-.LBB1693
-	.4byte	0x1190c
+	.8byte	.LBB1807
+	.8byte	.LBE1807-.LBB1807
+	.4byte	0x11922
 	.uleb128 0x59
-	.4byte	.LASF3061
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x51a
+	.2byte	0x55c
 	.4byte	0x194
-	.4byte	.LLST162
+	.4byte	.LLST183
 	.uleb128 0x4e
-	.8byte	.LVL749
-	.4byte	0x13d31
+	.8byte	.LVL771
+	.4byte	0x1416a
 	.uleb128 0x4e
-	.8byte	.LVL750
-	.4byte	0x13d3d
+	.8byte	.LVL772
+	.4byte	0x14176
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL747
-	.4byte	0x13d4a
+	.8byte	.LVL769
+	.4byte	0x14183
 	.uleb128 0x4e
-	.8byte	.LVL751
-	.4byte	0x13d56
+	.8byte	.LVL773
+	.4byte	0x1418f
 	.byte	0
 	.byte	0
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xe30
-	.4byte	0x119be
+	.4byte	.Ldebug_ranges0+0x1020
+	.4byte	0x119d4
 	.uleb128 0x46
-	.4byte	.LASF3059
+	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x526
+	.2byte	0x568
 	.4byte	0xc6
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xe30
+	.4byte	.Ldebug_ranges0+0x1020
 	.uleb128 0x6b
-	.4byte	.LASF3071
+	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x526
-	.8byte	.L715
+	.2byte	0x568
+	.8byte	.L743
 	.uleb128 0x4c
-	.4byte	.LASF3060
+	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x526
-	.4byte	0x14fd
+	.2byte	0x568
+	.4byte	0x1513
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3059
+	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x526
+	.2byte	0x568
 	.4byte	0x194
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xe70
-	.4byte	0x119a2
+	.4byte	.Ldebug_ranges0+0x1060
+	.4byte	0x119b8
 	.uleb128 0x59
-	.4byte	.LASF3061
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x526
+	.2byte	0x568
 	.4byte	0x194
-	.4byte	.LLST161
+	.4byte	.LLST182
 	.uleb128 0x4e
-	.8byte	.LVL700
-	.4byte	0x13d31
+	.8byte	.LVL722
+	.4byte	0x1416a
 	.uleb128 0x4e
-	.8byte	.LVL701
-	.4byte	0x13d3d
+	.8byte	.LVL723
+	.4byte	0x14176
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL698
-	.4byte	0x13d4a
-	.uleb128 0x4e
-	.8byte	.LVL702
-	.4byte	0x13d56
-	.byte	0
-	.byte	0
-	.uleb128 0x53
-	.4byte	0x12b43
-	.8byte	.LBB1694
-	.8byte	.LBE1694-.LBB1694
-	.byte	0x1
-	.2byte	0x523
-	.4byte	0x11a09
-	.uleb128 0x54
-	.4byte	0x12b5e
-	.uleb128 0x54
-	.4byte	0x12b53
-	.uleb128 0x56
-	.8byte	.LBB1695
-	.8byte	.LBE1695-.LBB1695
-	.uleb128 0x57
-	.4byte	0x12b69
+	.8byte	.LVL720
+	.4byte	0x14183
 	.uleb128 0x4e
-	.8byte	.LVL752
-	.4byte	0x139cd
+	.8byte	.LVL724
+	.4byte	0x1418f
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x11e5f
-	.8byte	.LBB1700
-	.8byte	.LBE1700-.LBB1700
+	.uleb128 0x5a
+	.4byte	0x11e33
+	.8byte	.LBB1799
+	.4byte	.Ldebug_ranges0+0x10a0
 	.byte	0x1
-	.2byte	0x4bc
-	.4byte	0x11a8f
+	.2byte	0x505
+	.4byte	0x11a25
 	.uleb128 0x54
-	.4byte	0x11e88
+	.4byte	0x11e5c
 	.uleb128 0x54
-	.4byte	0x11e7c
+	.4byte	0x11e50
 	.uleb128 0x54
-	.4byte	0x11e70
-	.uleb128 0x56
-	.8byte	.LBB1701
-	.8byte	.LBE1701-.LBB1701
+	.4byte	0x11e44
+	.uleb128 0x5d
+	.4byte	.Ldebug_ranges0+0x10a0
 	.uleb128 0x57
-	.4byte	0x11e94
+	.4byte	0x11e68
 	.uleb128 0x57
-	.4byte	0x11e9e
+	.4byte	0x11e72
 	.uleb128 0x57
-	.4byte	0x11eaa
+	.4byte	0x11e7e
 	.uleb128 0x57
-	.4byte	0x11eb6
-	.uleb128 0x5f
-	.4byte	0x11ec2
-	.4byte	.LLST164
+	.4byte	0x11e8a
 	.uleb128 0x57
-	.4byte	0x11ece
+	.4byte	0x11e96
 	.uleb128 0x57
-	.4byte	0x11eda
+	.4byte	0x11ea2
 	.uleb128 0x73
-	.4byte	0x11ee6
+	.4byte	0x11eae
+	.byte	0
+	.byte	0
+	.uleb128 0x53
+	.4byte	0x12cbe
+	.8byte	.LBB1808
+	.8byte	.LBE1808-.LBB1808
+	.byte	0x1
+	.2byte	0x565
+	.4byte	0x11a70
+	.uleb128 0x54
+	.4byte	0x12cd9
+	.uleb128 0x54
+	.4byte	0x12cce
 	.uleb128 0x56
-	.8byte	.LBB1702
-	.8byte	.LBE1702-.LBB1702
-	.uleb128 0x57
-	.4byte	0x11eef
+	.8byte	.LBB1809
+	.8byte	.LBE1809-.LBB1809
 	.uleb128 0x57
-	.4byte	0x11efb
-	.byte	0
+	.4byte	0x12ce4
+	.uleb128 0x4e
+	.8byte	.LVL774
+	.4byte	0x13e06
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x127e9
-	.8byte	.LBB1708
-	.4byte	.Ldebug_ranges0+0xf70
+	.4byte	0x12964
+	.8byte	.LBB1818
+	.4byte	.Ldebug_ranges0+0x11a0
 	.byte	0x1
-	.2byte	0x45d
-	.4byte	0x11b55
+	.2byte	0x4a7
+	.4byte	0x11b36
 	.uleb128 0x54
-	.4byte	0x12826
+	.4byte	0x129a1
 	.uleb128 0x54
-	.4byte	0x12826
+	.4byte	0x129a1
 	.uleb128 0x54
-	.4byte	0x12826
+	.4byte	0x129a1
 	.uleb128 0x54
-	.4byte	0x12832
+	.4byte	0x129ad
 	.uleb128 0x54
-	.4byte	0x1281a
+	.4byte	0x12995
 	.uleb128 0x54
-	.4byte	0x1280e
+	.4byte	0x12989
 	.uleb128 0x54
-	.4byte	0x12802
+	.4byte	0x1297d
 	.uleb128 0x54
-	.4byte	0x127f6
+	.4byte	0x12971
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xf70
+	.4byte	.Ldebug_ranges0+0x11a0
 	.uleb128 0x57
-	.4byte	0x1283e
+	.4byte	0x129b9
 	.uleb128 0x5f
-	.4byte	0x1284a
-	.4byte	.LLST166
+	.4byte	0x129c5
+	.4byte	.LLST186
 	.uleb128 0x57
-	.4byte	0x12856
+	.4byte	0x129d1
 	.uleb128 0x5f
-	.4byte	0x12862
-	.4byte	.LLST167
+	.4byte	0x129dd
+	.4byte	.LLST187
 	.uleb128 0x5f
-	.4byte	0x1286e
-	.4byte	.LLST168
+	.4byte	0x129e9
+	.4byte	.LLST188
 	.uleb128 0x57
-	.4byte	0x1287a
+	.4byte	0x129f5
 	.uleb128 0x57
-	.4byte	0x12886
+	.4byte	0x12a01
 	.uleb128 0x57
-	.4byte	0x12892
+	.4byte	0x12a0d
 	.uleb128 0x5f
-	.4byte	0x1289e
-	.4byte	.LLST169
+	.4byte	0x12a19
+	.4byte	.LLST189
 	.uleb128 0x57
-	.4byte	0x128aa
+	.4byte	0x12a25
 	.uleb128 0x5f
-	.4byte	0x128b6
-	.4byte	.LLST170
+	.4byte	0x12a31
+	.4byte	.LLST190
 	.uleb128 0x60
-	.4byte	0x128c2
+	.4byte	0x12a3d
 	.uleb128 0x1
 	.byte	0x60
 	.uleb128 0x5f
-	.4byte	0x128cc
-	.4byte	.LLST171
+	.4byte	0x12a47
+	.4byte	.LLST191
 	.uleb128 0x5f
-	.4byte	0x128d6
-	.4byte	.LLST172
+	.4byte	0x12a51
+	.4byte	.LLST192
 	.uleb128 0x5f
-	.4byte	0x128e2
-	.4byte	.LLST173
+	.4byte	0x12a5d
+	.4byte	.LLST193
 	.uleb128 0x5f
-	.4byte	0x128ee
-	.4byte	.LLST174
+	.4byte	0x12a69
+	.4byte	.LLST194
 	.uleb128 0x5f
-	.4byte	0x128fa
-	.4byte	.LLST175
+	.4byte	0x12a75
+	.4byte	.LLST195
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12b43
-	.8byte	.LBB1717
-	.8byte	.LBE1717-.LBB1717
+	.4byte	0x12cbe
+	.8byte	.LBB1830
+	.8byte	.LBE1830-.LBB1830
 	.byte	0x1
-	.2byte	0x406
-	.4byte	0x11ba0
+	.2byte	0x450
+	.4byte	0x11b81
 	.uleb128 0x54
-	.4byte	0x12b5e
+	.4byte	0x12cd9
 	.uleb128 0x54
-	.4byte	0x12b53
+	.4byte	0x12cce
 	.uleb128 0x56
-	.8byte	.LBB1718
-	.8byte	.LBE1718-.LBB1718
+	.8byte	.LBB1831
+	.8byte	.LBE1831-.LBB1831
 	.uleb128 0x57
-	.4byte	0x12b69
+	.4byte	0x12ce4
 	.uleb128 0x4e
-	.8byte	.LVL829
-	.4byte	0x139cd
+	.8byte	.LVL845
+	.4byte	0x13e06
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL684
-	.4byte	0x13db9
-	.uleb128 0x4e
-	.8byte	.LVL685
-	.4byte	0x13dc5
-	.uleb128 0x4e
-	.8byte	.LVL686
-	.4byte	0x13d7d
-	.uleb128 0x4e
 	.8byte	.LVL706
-	.4byte	0x13dd1
+	.4byte	0x141f2
 	.uleb128 0x4e
 	.8byte	.LVL707
-	.4byte	0x13c94
+	.4byte	0x141fe
 	.uleb128 0x4e
 	.8byte	.LVL708
-	.4byte	0x13dc5
+	.4byte	0x141b6
 	.uleb128 0x4e
-	.8byte	.LVL709
-	.4byte	0x13d7d
-	.uleb128 0x4e
-	.8byte	.LVL710
-	.4byte	0x12a5e
-	.uleb128 0x4e
-	.8byte	.LVL711
-	.4byte	0x13ddd
-	.uleb128 0x4e
-	.8byte	.LVL712
-	.4byte	0x13b55
+	.8byte	.LVL728
+	.4byte	0x1420a
 	.uleb128 0x4e
-	.8byte	.LVL713
-	.4byte	0x122e5
+	.8byte	.LVL729
+	.4byte	0x140cd
 	.uleb128 0x4e
-	.8byte	.LVL716
-	.4byte	0x13de9
+	.8byte	.LVL730
+	.4byte	0x141fe
 	.uleb128 0x4e
-	.8byte	.LVL717
-	.4byte	0x13b55
+	.8byte	.LVL731
+	.4byte	0x141b6
 	.uleb128 0x4e
-	.8byte	.LVL719
-	.4byte	0x13c32
+	.8byte	.LVL732
+	.4byte	0x12bd9
 	.uleb128 0x4e
-	.8byte	.LVL720
-	.4byte	0x13b55
+	.8byte	.LVL733
+	.4byte	0x14216
 	.uleb128 0x4e
-	.8byte	.LVL721
-	.4byte	0x13dd1
+	.8byte	.LVL734
+	.4byte	0x13f8e
 	.uleb128 0x4e
-	.8byte	.LVL722
-	.4byte	0x13c94
+	.8byte	.LVL735
+	.4byte	0x12286
 	.uleb128 0x4e
-	.8byte	.LVL723
-	.4byte	0x13c94
+	.8byte	.LVL738
+	.4byte	0x14222
 	.uleb128 0x4e
-	.8byte	.LVL724
-	.4byte	0x13ddd
+	.8byte	.LVL739
+	.4byte	0x13f8e
 	.uleb128 0x4e
-	.8byte	.LVL725
-	.4byte	0x11f09
+	.8byte	.LVL741
+	.4byte	0x1406b
 	.uleb128 0x4e
-	.8byte	.LVL727
-	.4byte	0x13b55
+	.8byte	.LVL742
+	.4byte	0x13f8e
 	.uleb128 0x4e
-	.8byte	.LVL728
-	.4byte	0x122e5
+	.8byte	.LVL743
+	.4byte	0x1420a
 	.uleb128 0x4e
-	.8byte	.LVL731
-	.4byte	0x13b55
+	.8byte	.LVL744
+	.4byte	0x140cd
 	.uleb128 0x4e
-	.8byte	.LVL732
-	.4byte	0x13c9e
+	.8byte	.LVL745
+	.4byte	0x140cd
 	.uleb128 0x4e
-	.8byte	.LVL733
-	.4byte	0x13dc5
+	.8byte	.LVL746
+	.4byte	0x14216
 	.uleb128 0x4e
-	.8byte	.LVL735
-	.4byte	0x13d7d
+	.8byte	.LVL747
+	.4byte	0x11eb7
 	.uleb128 0x4e
-	.8byte	.LVL739
-	.4byte	0x11f09
+	.8byte	.LVL749
+	.4byte	0x13f8e
 	.uleb128 0x4e
-	.8byte	.LVL740
-	.4byte	0x13bcf
+	.8byte	.LVL750
+	.4byte	0x12286
 	.uleb128 0x4e
-	.8byte	.LVL742
-	.4byte	0x13dc5
+	.8byte	.LVL753
+	.4byte	0x13f8e
 	.uleb128 0x4e
-	.8byte	.LVL744
-	.4byte	0x13bcf
+	.8byte	.LVL754
+	.4byte	0x140d7
 	.uleb128 0x4e
 	.8byte	.LVL755
-	.4byte	0x13b55
-	.uleb128 0x4e
-	.8byte	.LVL756
-	.4byte	0x122e5
+	.4byte	0x141fe
 	.uleb128 0x4e
 	.8byte	.LVL757
-	.4byte	0x13c32
+	.4byte	0x141b6
 	.uleb128 0x4e
 	.8byte	.LVL760
-	.4byte	0x13c32
+	.4byte	0x13f8e
 	.uleb128 0x4e
-	.8byte	.LVL762
-	.4byte	0x13a8b
+	.8byte	.LVL763
+	.4byte	0x11eb7
 	.uleb128 0x4e
-	.8byte	.LVL765
-	.4byte	0x13b55
+	.8byte	.LVL764
+	.4byte	0x14008
 	.uleb128 0x4e
-	.8byte	.LVL768
-	.4byte	0x13b55
+	.8byte	.LVL766
+	.4byte	0x141fe
 	.uleb128 0x4e
-	.8byte	.LVL775
-	.4byte	0x13c32
+	.8byte	.LVL777
+	.4byte	0x13f8e
+	.uleb128 0x4e
+	.8byte	.LVL778
+	.4byte	0x12286
 	.uleb128 0x4e
 	.8byte	.LVL779
-	.4byte	0x13c94
+	.4byte	0x1406b
 	.uleb128 0x4e
-	.8byte	.LVL780
-	.4byte	0x13c94
+	.8byte	.LVL782
+	.4byte	0x1406b
 	.uleb128 0x4e
-	.8byte	.LVL781
-	.4byte	0x13c94
+	.8byte	.LVL783
+	.4byte	0x13ec4
 	.uleb128 0x4e
-	.8byte	.LVL803
-	.4byte	0x13b55
+	.8byte	.LVL785
+	.4byte	0x13f8e
 	.uleb128 0x4e
-	.8byte	.LVL804
-	.4byte	0x13de9
+	.8byte	.LVL788
+	.4byte	0x13f8e
 	.uleb128 0x4e
-	.8byte	.LVL805
-	.4byte	0x13c9e
+	.8byte	.LVL789
+	.4byte	0x14008
 	.uleb128 0x4e
-	.8byte	.LVL806
-	.4byte	0x13c94
+	.8byte	.LVL790
+	.4byte	0x140cd
 	.uleb128 0x4e
-	.8byte	.LVL807
-	.4byte	0x12997
+	.8byte	.LVL791
+	.4byte	0x140cd
 	.uleb128 0x4e
-	.8byte	.LVL809
-	.4byte	0x13b55
+	.8byte	.LVL792
+	.4byte	0x140cd
 	.uleb128 0x4e
-	.8byte	.LVL811
-	.4byte	0x13bcf
+	.8byte	.LVL814
+	.4byte	0x13f8e
 	.uleb128 0x4e
-	.8byte	.LVL812
-	.4byte	0x13a8b
+	.8byte	.LVL815
+	.4byte	0x14222
+	.uleb128 0x4e
+	.8byte	.LVL816
+	.4byte	0x140d7
+	.uleb128 0x4e
+	.8byte	.LVL824
+	.4byte	0x140cd
 	.uleb128 0x4e
 	.8byte	.LVL825
-	.4byte	0x11f09
+	.4byte	0x12b12
+	.uleb128 0x4e
+	.8byte	.LVL826
+	.4byte	0x14008
 	.uleb128 0x4e
 	.8byte	.LVL827
-	.4byte	0x13b55
+	.4byte	0x13ec4
 	.uleb128 0x4e
-	.8byte	.LVL831
-	.4byte	0x13a8b
+	.8byte	.LVL840
+	.4byte	0x11eb7
 	.uleb128 0x4e
-	.8byte	.LVL833
-	.4byte	0x13a8b
+	.8byte	.LVL843
+	.4byte	0x13f8e
 	.uleb128 0x4e
-	.8byte	.LVL835
-	.4byte	0x13cdc
+	.8byte	.LVL847
+	.4byte	0x13ec4
+	.uleb128 0x4e
+	.8byte	.LVL849
+	.4byte	0x13ec4
+	.uleb128 0x4e
+	.8byte	.LVL851
+	.4byte	0x14115
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3073
+	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x3d6
+	.2byte	0x42c
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11f09
+	.4byte	0x11eb7
 	.uleb128 0x64
-	.4byte	.LASF3074
+	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0x3d6
-	.4byte	0x4653
+	.2byte	0x42c
+	.4byte	0x4669
 	.uleb128 0x64
-	.4byte	.LASF3075
+	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0x3d6
-	.4byte	0x4653
+	.2byte	0x42c
+	.4byte	0x4669
 	.uleb128 0x64
-	.4byte	.LASF3076
+	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0x3d6
+	.2byte	0x42c
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x3d8
+	.2byte	0x42e
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3077
+	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0x3d9
+	.2byte	0x42f
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3078
+	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0x3d9
+	.2byte	0x42f
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3079
-	.byte	0x1
-	.2byte	0x3da
-	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF3080
-	.byte	0x1
-	.2byte	0x3db
-	.4byte	0xc6
-	.uleb128 0x46
-	.4byte	.LASF3081
-	.byte	0x1
-	.2byte	0x3dc
-	.4byte	0x4659
-	.uleb128 0x46
-	.4byte	.LASF3082
-	.byte	0x1
-	.2byte	0x3dd
-	.4byte	0x4659
-	.uleb128 0x72
 	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0x3f4
-	.uleb128 0x66
+	.2byte	0x430
+	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0x3ec
-	.4byte	0x10b
+	.2byte	0x431
+	.4byte	0x466f
 	.uleb128 0x46
 	.4byte	.LASF3085
 	.byte	0x1
-	.2byte	0x3ec
-	.4byte	0x10b
-	.byte	0
+	.2byte	0x432
+	.4byte	0x466f
+	.uleb128 0x72
+	.4byte	.LASF3086
+	.byte	0x1
+	.2byte	0x43f
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3086
+	.4byte	.LASF3087
 	.byte	0x1
-	.2byte	0x381
+	.2byte	0x3d2
 	.4byte	0xc6
-	.8byte	.LFB2818
-	.8byte	.LFE2818-.LFB2818
+	.8byte	.LFB2823
+	.8byte	.LFE2823-.LFB2823
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12050
+	.4byte	0x1200b
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x381
-	.4byte	0xe45b
+	.2byte	0x3d2
+	.4byte	0xe47d
 	.4byte	.LLST69
 	.uleb128 0x46
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x383
-	.4byte	0xe70a
+	.2byte	0x3d4
+	.4byte	0xe72c
 	.uleb128 0x59
-	.4byte	.LASF3087
+	.4byte	.LASF3088
 	.byte	0x1
-	.2byte	0x384
+	.2byte	0x3d5
 	.4byte	0xc6
 	.4byte	.LLST70
 	.uleb128 0x69
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x385
+	.2byte	0x3d6
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x64
 	.uleb128 0x53
-	.4byte	0x12db8
-	.8byte	.LBB1188
-	.8byte	.LBE1188-.LBB1188
+	.4byte	0x12f33
+	.8byte	.LBB1204
+	.8byte	.LBE1204-.LBB1204
 	.byte	0x1
-	.2byte	0x388
-	.4byte	0x11f8c
+	.2byte	0x3d9
+	.4byte	0x11f3a
 	.uleb128 0x54
-	.4byte	0x12dd3
+	.4byte	0x12f4e
 	.uleb128 0x54
-	.4byte	0x12dc8
+	.4byte	0x12f43
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL248
-	.4byte	0x13b55
+	.4byte	0x13f8e
 	.uleb128 0x4e
 	.8byte	.LVL249
-	.4byte	0x13df5
-	.uleb128 0x4e
-	.8byte	.LVL252
-	.4byte	0x13df5
+	.4byte	0x1422e
 	.uleb128 0x4e
 	.8byte	.LVL253
-	.4byte	0x13bcf
+	.4byte	0x14008
 	.uleb128 0x4e
-	.8byte	.LVL255
-	.4byte	0x13bcf
+	.8byte	.LVL254
+	.4byte	0x14008
 	.uleb128 0x4e
 	.8byte	.LVL256
-	.4byte	0x13bcf
+	.4byte	0x1422e
+	.uleb128 0x4e
+	.8byte	.LVL257
+	.4byte	0x14008
 	.uleb128 0x4e
 	.8byte	.LVL258
-	.4byte	0x13df5
+	.4byte	0x1422e
 	.uleb128 0x4e
 	.8byte	.LVL259
-	.4byte	0x13df5
+	.4byte	0x1422e
 	.uleb128 0x4e
 	.8byte	.LVL260
-	.4byte	0x13df5
+	.4byte	0x1422e
 	.uleb128 0x4e
 	.8byte	.LVL261
-	.4byte	0x13df5
+	.4byte	0x1422e
 	.uleb128 0x4e
 	.8byte	.LVL262
-	.4byte	0x13df5
+	.4byte	0x1422e
 	.uleb128 0x4e
 	.8byte	.LVL263
-	.4byte	0x13df5
+	.4byte	0x1422e
 	.uleb128 0x4e
 	.8byte	.LVL264
-	.4byte	0x13df5
+	.4byte	0x1422e
 	.uleb128 0x4e
 	.8byte	.LVL265
-	.4byte	0x13bcf
+	.4byte	0x1422e
 	.uleb128 0x4e
 	.8byte	.LVL266
-	.4byte	0x13cdc
+	.4byte	0x14008
+	.uleb128 0x4e
+	.8byte	.LVL267
+	.4byte	0x14115
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3088
+	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x35c
-	.8byte	.LFB2817
-	.8byte	.LFE2817-.LFB2817
+	.2byte	0x3ad
+	.8byte	.LFB2822
+	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12109
+	.4byte	0x120c4
 	.uleb128 0x46
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x35e
-	.4byte	0xe70a
+	.2byte	0x3af
+	.4byte	0xe72c
 	.uleb128 0x46
-	.4byte	.LASF2994
+	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x35f
-	.4byte	0xe11d
+	.2byte	0x3b0
+	.4byte	0xe13f
 	.uleb128 0x4e
 	.8byte	.LVL231
-	.4byte	0x13c00
+	.4byte	0x14039
 	.uleb128 0x4e
 	.8byte	.LVL232
-	.4byte	0x13b55
+	.4byte	0x13f8e
 	.uleb128 0x4e
 	.8byte	.LVL233
-	.4byte	0x13c9e
+	.4byte	0x140d7
 	.uleb128 0x4e
 	.8byte	.LVL234
-	.4byte	0x13c9e
+	.4byte	0x140d7
 	.uleb128 0x4e
 	.8byte	.LVL235
-	.4byte	0x13b55
+	.4byte	0x13f8e
 	.uleb128 0x4e
 	.8byte	.LVL236
-	.4byte	0x13bb9
+	.4byte	0x13ff2
 	.uleb128 0x4e
 	.8byte	.LVL237
-	.4byte	0x13c32
+	.4byte	0x1406b
 	.uleb128 0x4e
 	.8byte	.LVL238
-	.4byte	0x13c9e
+	.4byte	0x140d7
 	.uleb128 0x4e
 	.8byte	.LVL239
-	.4byte	0x13c9e
+	.4byte	0x140d7
 	.uleb128 0x4e
 	.8byte	.LVL240
-	.4byte	0x13c00
+	.4byte	0x14039
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3089
+	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x317
+	.2byte	0x36d
 	.4byte	0xc6
-	.8byte	.LFB2816
-	.8byte	.LFE2816-.LFB2816
+	.8byte	.LFB2821
+	.8byte	.LFE2821-.LFB2821
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x122d5
+	.4byte	0x12276
 	.uleb128 0x58
-	.4byte	.LASF791
+	.4byte	.LASF793
 	.byte	0x1
-	.2byte	0x317
+	.2byte	0x36d
 	.4byte	0x443
-	.4byte	.LLST115
+	.4byte	.LLST136
 	.uleb128 0x69
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x319
-	.4byte	0xe45b
+	.2byte	0x36f
+	.4byte	0xe47d
 	.uleb128 0x1
 	.byte	0x66
 	.uleb128 0x46
-	.4byte	.LASF2994
+	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x31a
-	.4byte	0xe11d
+	.2byte	0x370
+	.4byte	0xe13f
 	.uleb128 0x46
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x31b
-	.4byte	0xe70a
+	.2byte	0x371
+	.4byte	0xe72c
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x940
-	.4byte	0x121f3
+	.4byte	.Ldebug_ranges0+0xb30
+	.4byte	0x121ae
 	.uleb128 0x3f
 	.byte	0x8
 	.byte	0x1
-	.2byte	0x322
-	.4byte	0x1218c
+	.2byte	0x378
+	.4byte	0x12147
 	.uleb128 0x41
-	.4byte	.LASF3090
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x322
+	.2byte	0x378
 	.4byte	0x19b
 	.uleb128 0x3d
 	.string	"__c"
 	.byte	0x1
-	.2byte	0x322
-	.4byte	0x122d5
+	.2byte	0x378
+	.4byte	0x12276
 	.byte	0
 	.uleb128 0x52
 	.string	"__u"
 	.byte	0x1
-	.2byte	0x322
-	.4byte	0x1216a
+	.2byte	0x378
+	.4byte	0x12125
 	.uleb128 0x5a
-	.4byte	0x1359a
-	.8byte	.LBB1277
-	.4byte	.Ldebug_ranges0+0x980
+	.4byte	0x13715
+	.8byte	.LBB1386
+	.4byte	.Ldebug_ranges0+0xb70
 	.byte	0x1
-	.2byte	0x322
-	.4byte	0x121c0
+	.2byte	0x378
+	.4byte	0x1217b
 	.uleb128 0x54
-	.4byte	0x135ba
+	.4byte	0x13738
 	.uleb128 0x54
-	.4byte	0x135af
+	.4byte	0x1372c
 	.uleb128 0x54
-	.4byte	0x135a6
+	.4byte	0x13722
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x133fa
-	.8byte	.LBB1280
-	.8byte	.LBE1280-.LBB1280
+	.4byte	0x13575
+	.8byte	.LBB1389
+	.8byte	.LBE1389-.LBB1389
 	.byte	0x1
-	.2byte	0x322
+	.2byte	0x378
 	.uleb128 0x56
-	.8byte	.LBB1281
-	.8byte	.LBE1281-.LBB1281
+	.8byte	.LBB1390
+	.8byte	.LBE1390-.LBB1390
 	.uleb128 0x60
-	.4byte	0x1340a
+	.4byte	0x13585
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13294
-	.8byte	.LBB1285
-	.8byte	.LBE1285-.LBB1285
+	.4byte	0x1340f
+	.8byte	.LBB1394
+	.8byte	.LBE1394-.LBB1394
 	.byte	0x1
-	.2byte	0x353
-	.4byte	0x12245
+	.2byte	0x3a4
+	.4byte	0x12200
 	.uleb128 0x54
-	.4byte	0x132a5
+	.4byte	0x13420
 	.uleb128 0x5c
-	.4byte	0x132b2
-	.8byte	.LBB1287
-	.8byte	.LBE1287-.LBB1287
+	.4byte	0x1342d
+	.8byte	.LBB1396
+	.8byte	.LBE1396-.LBB1396
 	.byte	0xd
 	.2byte	0x240
 	.uleb128 0x54
-	.4byte	0x132ce
+	.4byte	0x13449
 	.uleb128 0x54
-	.4byte	0x132c3
+	.4byte	0x1343e
 	.uleb128 0x4e
-	.8byte	.LVL429
-	.4byte	0x13e01
+	.8byte	.LVL452
+	.4byte	0x1423a
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL422
-	.4byte	0x138ca
-	.uleb128 0x4e
-	.8byte	.LVL423
-	.4byte	0x1268e
-	.uleb128 0x4e
-	.8byte	.LVL424
-	.4byte	0x13e0e
+	.8byte	.LVL446
+	.4byte	0x13d03
 	.uleb128 0x4e
-	.8byte	.LVL425
-	.4byte	0x13d31
+	.8byte	.LVL447
+	.4byte	0x14247
 	.uleb128 0x4e
-	.8byte	.LVL426
-	.4byte	0x13e18
+	.8byte	.LVL448
+	.4byte	0x1416a
 	.uleb128 0x4e
-	.8byte	.LVL427
-	.4byte	0x138ca
+	.8byte	.LVL449
+	.4byte	0x14251
 	.uleb128 0x4e
-	.8byte	.LVL428
-	.4byte	0x1370c
+	.8byte	.LVL450
+	.4byte	0x13d03
 	.uleb128 0x4e
-	.8byte	.LVL430
-	.4byte	0x1268e
+	.8byte	.LVL451
+	.4byte	0x12809
 	.uleb128 0x4e
-	.8byte	.LVL431
-	.4byte	0x138ca
+	.8byte	.LVL453
+	.4byte	0x13d03
 	.uleb128 0x4e
-	.8byte	.LVL432
-	.4byte	0x138ca
+	.8byte	.LVL454
+	.4byte	0x1261f
 	.uleb128 0x4e
-	.8byte	.LVL433
-	.4byte	0x135cc
+	.8byte	.LVL455
+	.4byte	0x12435
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x122e5
+	.4byte	0x12286
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3091
+	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x2c9
-	.8byte	.LFB2815
-	.8byte	.LFE2815-.LFB2815
+	.2byte	0x32d
+	.8byte	.LFB2820
+	.8byte	.LFE2820-.LFB2820
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12484
+	.4byte	0x123d7
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x2c9
-	.4byte	0xe45b
-	.4byte	.LLST114
+	.2byte	0x32d
+	.4byte	0xe47d
+	.4byte	.LLST135
 	.uleb128 0x46
-	.4byte	.LASF2994
+	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x2cb
-	.4byte	0xe11d
+	.2byte	0x32f
+	.4byte	0xe13f
 	.uleb128 0x46
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x2cc
-	.4byte	0xe70a
+	.2byte	0x330
+	.4byte	0xe72c
 	.uleb128 0x55
-	.4byte	.LASF3019
-	.4byte	0xb915
+	.4byte	.LASF3023
+	.4byte	0xb92b
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34667
-	.uleb128 0x53
-	.4byte	0x12484
-	.8byte	.LBB1268
-	.8byte	.LBE1268-.LBB1268
-	.byte	0x1
-	.2byte	0x2e8
-	.4byte	0x12372
-	.uleb128 0x54
-	.4byte	0x1249d
-	.uleb128 0x54
-	.4byte	0x12491
-	.uleb128 0x4e
-	.8byte	.LVL398
-	.4byte	0x138ca
-	.byte	0
+	.8byte	__func__.34740
 	.uleb128 0x53
-	.4byte	0x12484
-	.8byte	.LBB1270
-	.8byte	.LBE1270-.LBB1270
+	.4byte	0x123d7
+	.8byte	.LBB1379
+	.8byte	.LBE1379-.LBB1379
 	.byte	0x1
-	.2byte	0x2fe
-	.4byte	0x123a6
+	.2byte	0x354
+	.4byte	0x12313
 	.uleb128 0x54
-	.4byte	0x1249d
+	.4byte	0x123f0
 	.uleb128 0x54
-	.4byte	0x12491
+	.4byte	0x123e4
 	.uleb128 0x4e
-	.8byte	.LVL403
-	.4byte	0x138ca
+	.8byte	.LVL427
+	.4byte	0x13d03
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12484
-	.8byte	.LBB1272
-	.8byte	.LBE1272-.LBB1272
+	.4byte	0x123d7
+	.8byte	.LBB1381
+	.8byte	.LBE1381-.LBB1381
 	.byte	0x1
-	.2byte	0x2d6
-	.4byte	0x123da
+	.2byte	0x361
+	.4byte	0x12347
 	.uleb128 0x54
-	.4byte	0x1249d
+	.4byte	0x123f0
 	.uleb128 0x54
-	.4byte	0x12491
+	.4byte	0x123e4
 	.uleb128 0x4e
-	.8byte	.LVL408
-	.4byte	0x138ca
+	.8byte	.LVL432
+	.4byte	0x13d03
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12484
-	.8byte	.LBB1274
-	.8byte	.LBE1274-.LBB1274
+	.4byte	0x123d7
+	.8byte	.LBB1383
+	.8byte	.LBE1383-.LBB1383
 	.byte	0x1
-	.2byte	0x30b
-	.4byte	0x1240e
+	.2byte	0x33b
+	.4byte	0x1237b
 	.uleb128 0x54
-	.4byte	0x1249d
+	.4byte	0x123f0
 	.uleb128 0x54
-	.4byte	0x12491
+	.4byte	0x123e4
 	.uleb128 0x4e
-	.8byte	.LVL412
-	.4byte	0x138ca
+	.8byte	.LVL437
+	.4byte	0x13d03
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL397
-	.4byte	0x1268e
-	.uleb128 0x4e
-	.8byte	.LVL399
-	.4byte	0x1268e
-	.uleb128 0x4e
-	.8byte	.LVL402
-	.4byte	0x1370c
+	.8byte	.LVL426
+	.4byte	0x12435
 	.uleb128 0x4e
-	.8byte	.LVL404
-	.4byte	0x1370c
+	.8byte	.LVL428
+	.4byte	0x12435
 	.uleb128 0x4e
-	.8byte	.LVL407
-	.4byte	0x1268e
+	.8byte	.LVL431
+	.4byte	0x1261f
 	.uleb128 0x4e
-	.8byte	.LVL411
-	.4byte	0x135cc
+	.8byte	.LVL433
+	.4byte	0x1261f
 	.uleb128 0x4e
-	.8byte	.LVL413
-	.4byte	0x135cc
+	.8byte	.LVL436
+	.4byte	0x12809
 	.uleb128 0x4e
-	.8byte	.LVL416
-	.4byte	0x13e24
+	.8byte	.LVL438
+	.4byte	0x12809
 	.uleb128 0x4e
-	.8byte	.LVL417
-	.4byte	0x13e24
+	.8byte	.LVL441
+	.4byte	0x1425d
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3093
+	.4byte	.LASF3094
+	.byte	0x1
+	.2byte	0x327
+	.byte	0x1
+	.4byte	0x123fd
+	.uleb128 0x64
+	.4byte	.LASF2998
+	.byte	0x1
+	.2byte	0x327
+	.4byte	0xe13f
+	.uleb128 0x64
+	.4byte	.LASF2957
+	.byte	0x1
+	.2byte	0x327
+	.4byte	0xe72c
+	.byte	0
+	.uleb128 0x65
+	.4byte	.LASF3095
+	.byte	0x1
+	.2byte	0x31c
+	.byte	0x1
+	.4byte	0x1242f
+	.uleb128 0x64
+	.4byte	.LASF2998
+	.byte	0x1
+	.2byte	0x31c
+	.4byte	0xe13f
+	.uleb128 0x64
+	.4byte	.LASF2957
+	.byte	0x1
+	.2byte	0x31c
+	.4byte	0xe72c
+	.uleb128 0x52
+	.string	"buf"
+	.byte	0x1
+	.2byte	0x31e
+	.4byte	0x1242f
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdec9
+	.uleb128 0x65
+	.4byte	.LASF3096
+	.byte	0x1
+	.2byte	0x312
+	.byte	0x1
+	.4byte	0x12473
+	.uleb128 0x64
+	.4byte	.LASF3097
+	.byte	0x1
+	.2byte	0x312
+	.4byte	0xc0ad
+	.uleb128 0x64
+	.4byte	.LASF3098
+	.byte	0x1
+	.2byte	0x313
+	.4byte	0xaab
+	.uleb128 0x64
+	.4byte	.LASF3099
+	.byte	0x1
+	.2byte	0x313
+	.4byte	0xaab
+	.uleb128 0x64
+	.4byte	.LASF2957
+	.byte	0x1
+	.2byte	0x314
+	.4byte	0xe72c
+	.byte	0
+	.uleb128 0x65
+	.4byte	.LASF3100
+	.byte	0x1
+	.2byte	0x2e8
+	.byte	0x1
+	.4byte	0x12549
+	.uleb128 0x64
+	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x2c3
+	.2byte	0x2e8
+	.4byte	0xc0ad
+	.uleb128 0x64
+	.4byte	.LASF3098
 	.byte	0x1
-	.4byte	0x124aa
+	.2byte	0x2e9
+	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF2994
+	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x2c3
-	.4byte	0xe11d
+	.2byte	0x2e9
+	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x2c3
-	.4byte	0xe70a
-	.byte	0
-	.uleb128 0x65
-	.4byte	.LASF3094
+	.2byte	0x2ea
+	.4byte	0xe72c
+	.uleb128 0x46
+	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x2b8
+	.2byte	0x2ec
+	.4byte	0xe13f
+	.uleb128 0x46
+	.4byte	.LASF3101
 	.byte	0x1
-	.4byte	0x124dc
-	.uleb128 0x64
-	.4byte	.LASF2994
+	.2byte	0x2ed
+	.4byte	0x155
+	.uleb128 0x46
+	.4byte	.LASF3102
 	.byte	0x1
-	.2byte	0x2b8
-	.4byte	0xe11d
-	.uleb128 0x64
-	.4byte	.LASF2953
+	.2byte	0x2ed
+	.4byte	0x155
+	.uleb128 0x46
+	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x2b8
-	.4byte	0xe70a
+	.2byte	0x2ed
+	.4byte	0x466f
+	.uleb128 0x46
+	.4byte	.LASF3104
+	.byte	0x1
+	.2byte	0x2ed
+	.4byte	0x466f
+	.uleb128 0x46
+	.4byte	.LASF3105
+	.byte	0x1
+	.2byte	0x2ee
+	.4byte	0xc0ad
+	.uleb128 0x46
+	.4byte	.LASF2896
+	.byte	0x1
+	.2byte	0x2ef
+	.4byte	0xc6
+	.uleb128 0x46
+	.4byte	.LASF261
+	.byte	0x1
+	.2byte	0x2ef
+	.4byte	0xc6
 	.uleb128 0x52
-	.string	"buf"
+	.string	"i"
 	.byte	0x1
-	.2byte	0x2ba
-	.4byte	0x124dc
+	.2byte	0x2f0
+	.4byte	0xc6
+	.uleb128 0x52
+	.string	"j"
+	.byte	0x1
+	.2byte	0x2f0
+	.4byte	0xc6
+	.uleb128 0x46
+	.4byte	.LASF3106
+	.byte	0x1
+	.2byte	0x2f1
+	.4byte	0xc6
+	.uleb128 0x46
+	.4byte	.LASF2856
+	.byte	0x1
+	.2byte	0x2f2
+	.4byte	0xc0ad
+	.uleb128 0x46
+	.4byte	.LASF2942
+	.byte	0x1
+	.2byte	0x2f3
+	.4byte	0xc6
 	.byte	0
-	.uleb128 0x7
-	.byte	0x8
-	.4byte	0xdea7
 	.uleb128 0x65
-	.4byte	.LASF3095
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x28e
+	.2byte	0x2bf
 	.byte	0x1
-	.4byte	0x125b8
+	.4byte	0x1261f
 	.uleb128 0x64
-	.4byte	.LASF3096
+	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x28e
-	.4byte	0xc097
+	.2byte	0x2bf
+	.4byte	0xc0ad
 	.uleb128 0x64
-	.4byte	.LASF3097
+	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x28f
+	.2byte	0x2c0
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3098
+	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x28f
+	.2byte	0x2c0
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
-	.2byte	0x290
-	.4byte	0xe70a
+	.2byte	0x2c1
+	.4byte	0xe72c
 	.uleb128 0x46
-	.4byte	.LASF2994
+	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x292
-	.4byte	0xe11d
+	.2byte	0x2c3
+	.4byte	0xe13f
 	.uleb128 0x46
-	.4byte	.LASF3099
+	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x293
-	.4byte	0x155
+	.2byte	0x2c4
+	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3100
+	.4byte	.LASF3102
 	.byte	0x1
-	.2byte	0x293
-	.4byte	0x155
+	.2byte	0x2c4
+	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3101
+	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x293
-	.4byte	0x4659
+	.2byte	0x2c4
+	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3102
+	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x293
-	.4byte	0x4659
+	.2byte	0x2c4
+	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3103
+	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x294
-	.4byte	0xc097
+	.2byte	0x2c5
+	.4byte	0xc0ad
 	.uleb128 0x46
-	.4byte	.LASF2892
+	.4byte	.LASF2896
 	.byte	0x1
-	.2byte	0x295
+	.2byte	0x2c6
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF261
 	.byte	0x1
-	.2byte	0x295
+	.2byte	0x2c6
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x296
+	.2byte	0x2c7
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x296
+	.2byte	0x2c7
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3104
+	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x297
+	.2byte	0x2c8
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2854
+	.4byte	.LASF2856
 	.byte	0x1
-	.2byte	0x298
-	.4byte	0xc097
+	.2byte	0x2c9
+	.4byte	0xc0ad
 	.uleb128 0x46
-	.4byte	.LASF2938
+	.4byte	.LASF2942
 	.byte	0x1
-	.2byte	0x299
+	.2byte	0x2ca
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3105
+	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x268
+	.2byte	0x2b4
 	.byte	0x1
-	.4byte	0x1268e
+	.4byte	0x1265d
 	.uleb128 0x64
-	.4byte	.LASF3096
+	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x268
-	.4byte	0xc097
+	.2byte	0x2b4
+	.4byte	0xc0ad
 	.uleb128 0x64
-	.4byte	.LASF3097
+	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x269
+	.2byte	0x2b5
+	.4byte	0xaab
+	.uleb128 0x64
+	.4byte	.LASF3099
+	.byte	0x1
+	.2byte	0x2b5
 	.4byte	0xaab
 	.uleb128 0x64
+	.4byte	.LASF2957
+	.byte	0x1
+	.2byte	0x2b6
+	.4byte	0xe72c
+	.byte	0
+	.uleb128 0x65
+	.4byte	.LASF3109
+	.byte	0x1
+	.2byte	0x290
+	.byte	0x1
+	.4byte	0x12733
+	.uleb128 0x64
+	.4byte	.LASF3097
+	.byte	0x1
+	.2byte	0x290
+	.4byte	0xc0ad
+	.uleb128 0x64
 	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x269
+	.2byte	0x291
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF2953
+	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x26a
-	.4byte	0xe70a
+	.2byte	0x291
+	.4byte	0xaab
+	.uleb128 0x64
+	.4byte	.LASF2957
+	.byte	0x1
+	.2byte	0x292
+	.4byte	0xe72c
 	.uleb128 0x46
-	.4byte	.LASF2994
+	.4byte	.LASF2998
 	.byte	0x1
-	.2byte	0x26c
-	.4byte	0xe11d
+	.2byte	0x294
+	.4byte	0xe13f
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x26d
+	.2byte	0x295
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x26d
+	.2byte	0x295
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2892
+	.4byte	.LASF2896
 	.byte	0x1
-	.2byte	0x26e
+	.2byte	0x296
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF261
 	.byte	0x1
-	.2byte	0x26f
+	.2byte	0x297
+	.4byte	0xc6
+	.uleb128 0x46
+	.4byte	.LASF3101
+	.byte	0x1
+	.2byte	0x298
+	.4byte	0x13a
+	.uleb128 0x46
+	.4byte	.LASF3102
+	.byte	0x1
+	.2byte	0x298
+	.4byte	0x13a
+	.uleb128 0x46
+	.4byte	.LASF3103
+	.byte	0x1
+	.2byte	0x298
+	.4byte	0xaab
+	.uleb128 0x46
+	.4byte	.LASF3104
+	.byte	0x1
+	.2byte	0x298
+	.4byte	0xaab
+	.uleb128 0x46
+	.4byte	.LASF3105
+	.byte	0x1
+	.2byte	0x299
+	.4byte	0xc0ad
+	.uleb128 0x46
+	.4byte	.LASF3106
+	.byte	0x1
+	.2byte	0x29a
 	.4byte	0xc6
 	.uleb128 0x46
+	.4byte	.LASF2856
+	.byte	0x1
+	.2byte	0x29b
+	.4byte	0xc0ad
+	.uleb128 0x46
+	.4byte	.LASF2942
+	.byte	0x1
+	.2byte	0x29c
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x65
+	.4byte	.LASF3110
+	.byte	0x1
+	.2byte	0x269
+	.byte	0x1
+	.4byte	0x12809
+	.uleb128 0x64
+	.4byte	.LASF3097
+	.byte	0x1
+	.2byte	0x269
+	.4byte	0xc0ad
+	.uleb128 0x64
+	.4byte	.LASF3098
+	.byte	0x1
+	.2byte	0x26a
+	.4byte	0xaab
+	.uleb128 0x64
 	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x270
-	.4byte	0x155
+	.2byte	0x26a
+	.4byte	0xaab
+	.uleb128 0x64
+	.4byte	.LASF2957
+	.byte	0x1
+	.2byte	0x26b
+	.4byte	0xe72c
 	.uleb128 0x46
-	.4byte	.LASF3100
+	.4byte	.LASF2998
+	.byte	0x1
+	.2byte	0x26d
+	.4byte	0xe13f
+	.uleb128 0x52
+	.string	"i"
+	.byte	0x1
+	.2byte	0x26e
+	.4byte	0xc6
+	.uleb128 0x52
+	.string	"j"
+	.byte	0x1
+	.2byte	0x26e
+	.4byte	0xc6
+	.uleb128 0x46
+	.4byte	.LASF2896
+	.byte	0x1
+	.2byte	0x26f
+	.4byte	0xc6
+	.uleb128 0x46
+	.4byte	.LASF261
 	.byte	0x1
 	.2byte	0x270
-	.4byte	0x155
+	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x270
-	.4byte	0x4659
+	.2byte	0x271
+	.4byte	0x155
 	.uleb128 0x46
 	.4byte	.LASF3102
 	.byte	0x1
-	.2byte	0x270
-	.4byte	0x4659
+	.2byte	0x271
+	.4byte	0x155
 	.uleb128 0x46
 	.4byte	.LASF3103
 	.byte	0x1
 	.2byte	0x271
-	.4byte	0xc097
+	.4byte	0x466f
 	.uleb128 0x46
 	.4byte	.LASF3104
 	.byte	0x1
+	.2byte	0x271
+	.4byte	0x466f
+	.uleb128 0x46
+	.4byte	.LASF3105
+	.byte	0x1
 	.2byte	0x272
-	.4byte	0xc6
+	.4byte	0xc0ad
 	.uleb128 0x46
-	.4byte	.LASF2854
+	.4byte	.LASF3106
 	.byte	0x1
 	.2byte	0x273
-	.4byte	0xc097
+	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2938
+	.4byte	.LASF2856
 	.byte	0x1
 	.2byte	0x274
+	.4byte	0xc0ad
+	.uleb128 0x46
+	.4byte	.LASF2942
+	.byte	0x1
+	.2byte	0x275
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3106
+	.4byte	.LASF3111
 	.byte	0x1
 	.2byte	0x1c3
-	.8byte	.LFB2810
-	.8byte	.LFE2810-.LFB2810
+	.8byte	.LFB2811
+	.8byte	.LFE2811-.LFB2811
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x127e9
+	.4byte	0x12964
 	.uleb128 0x6a
-	.4byte	.LASF3096
+	.4byte	.LASF3097
 	.byte	0x1
 	.2byte	0x1c3
-	.4byte	0xc097
+	.4byte	0xc0ad
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6a
-	.4byte	.LASF3097
+	.4byte	.LASF3098
 	.byte	0x1
 	.2byte	0x1c3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x6a
-	.4byte	.LASF3098
+	.4byte	.LASF3099
 	.byte	0x1
 	.2byte	0x1c3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x6a
-	.4byte	.LASF3107
+	.4byte	.LASF3112
 	.byte	0x1
 	.2byte	0x1c4
-	.4byte	0xc097
+	.4byte	0xc0ad
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x6a
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x1c4
-	.4byte	0xe70a
+	.4byte	0xe72c
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x46
-	.4byte	.LASF2994
+	.4byte	.LASF2998
 	.byte	0x1
 	.2byte	0x1c6
-	.4byte	0xe11d
+	.4byte	0xe13f
 	.uleb128 0x68
 	.string	"i"
 	.byte	0x1
@@ -42474,7 +43006,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1c8
 	.4byte	0xc6
 	.uleb128 0x4c
-	.4byte	.LASF2892
+	.4byte	.LASF2896
 	.byte	0x1
 	.2byte	0x1c9
 	.4byte	0xc6
@@ -42487,121 +43019,121 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.4byte	.LLST1
 	.uleb128 0x59
-	.4byte	.LASF3099
+	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x1cb
 	.4byte	0x13a
 	.4byte	.LLST2
 	.uleb128 0x59
-	.4byte	.LASF3100
+	.4byte	.LASF3102
 	.byte	0x1
 	.2byte	0x1cb
 	.4byte	0x13a
 	.4byte	.LLST3
 	.uleb128 0x4c
-	.4byte	.LASF3101
+	.4byte	.LASF3103
 	.byte	0x1
 	.2byte	0x1cc
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4c
-	.4byte	.LASF3102
+	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x1cc
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x59
-	.4byte	.LASF3103
+	.4byte	.LASF3105
 	.byte	0x1
 	.2byte	0x1cd
-	.4byte	0xc097
+	.4byte	0xc0ad
 	.4byte	.LLST4
 	.uleb128 0x4c
-	.4byte	.LASF2960
+	.4byte	.LASF2964
 	.byte	0x1
 	.2byte	0x1ce
 	.4byte	0x10b
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x4c
-	.4byte	.LASF3108
+	.4byte	.LASF3113
 	.byte	0x1
 	.2byte	0x1cf
-	.4byte	0xc097
+	.4byte	0xc0ad
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x46
-	.4byte	.LASF3109
+	.4byte	.LASF3114
 	.byte	0x1
 	.2byte	0x1d0
 	.4byte	0x10b
 	.uleb128 0x46
-	.4byte	.LASF2854
+	.4byte	.LASF2856
 	.byte	0x1
 	.2byte	0x1d1
-	.4byte	0xc097
+	.4byte	0xc0ad
 	.uleb128 0x46
-	.4byte	.LASF2938
+	.4byte	.LASF2942
 	.byte	0x1
 	.2byte	0x1d2
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3110
+	.4byte	.LASF3115
 	.byte	0x1
 	.2byte	0x1d3
 	.4byte	0x10b
 	.uleb128 0x46
-	.4byte	.LASF3111
+	.4byte	.LASF3116
 	.byte	0x1
 	.2byte	0x1d3
 	.4byte	0x10b
 	.uleb128 0x59
-	.4byte	.LASF3112
+	.4byte	.LASF3117
 	.byte	0x1
 	.2byte	0x1d4
 	.4byte	0x13a
 	.4byte	.LLST5
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3113
+	.4byte	.LASF3118
 	.byte	0x1
 	.2byte	0x164
 	.byte	0x1
-	.4byte	0x12907
+	.4byte	0x12a82
 	.uleb128 0x64
-	.4byte	.LASF3114
+	.4byte	.LASF3119
 	.byte	0x1
 	.2byte	0x164
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3115
+	.4byte	.LASF3120
 	.byte	0x1
 	.2byte	0x164
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3116
+	.4byte	.LASF3121
 	.byte	0x1
 	.2byte	0x164
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3107
+	.4byte	.LASF3112
 	.byte	0x1
 	.2byte	0x164
-	.4byte	0x4659
+	.4byte	0x466f
 	.uleb128 0x64
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x165
-	.4byte	0xe70a
+	.4byte	0xe72c
 	.uleb128 0x64
-	.4byte	.LASF2865
+	.4byte	.LASF2867
 	.byte	0x1
 	.2byte	0x165
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2892
+	.4byte	.LASF2896
 	.byte	0x1
 	.2byte	0x167
 	.4byte	0xc6
@@ -42611,47 +43143,47 @@ __exitcall_ebc_exit:
 	.2byte	0x167
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3117
+	.4byte	.LASF3122
 	.byte	0x1
 	.2byte	0x168
 	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3118
+	.4byte	.LASF3123
 	.byte	0x1
 	.2byte	0x168
 	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3119
+	.4byte	.LASF3124
 	.byte	0x1
 	.2byte	0x168
 	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3120
+	.4byte	.LASF3125
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3121
+	.4byte	.LASF3126
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3122
+	.4byte	.LASF3127
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3109
+	.4byte	.LASF3114
 	.byte	0x1
 	.2byte	0x16a
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3108
+	.4byte	.LASF3113
 	.byte	0x1
 	.2byte	0x16b
-	.4byte	0x4659
+	.4byte	0x466f
 	.uleb128 0x46
-	.4byte	.LASF3123
+	.4byte	.LASF3128
 	.byte	0x1
 	.2byte	0x16c
 	.4byte	0x13a
@@ -42666,107 +43198,107 @@ __exitcall_ebc_exit:
 	.2byte	0x16e
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2866
+	.4byte	.LASF2868
 	.byte	0x1
 	.2byte	0x16f
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2868
+	.4byte	.LASF2870
 	.byte	0x1
 	.2byte	0x170
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2867
+	.4byte	.LASF2869
 	.byte	0x1
 	.2byte	0x171
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2869
+	.4byte	.LASF2871
 	.byte	0x1
 	.2byte	0x172
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x74
-	.4byte	.LASF3124
+	.4byte	.LASF3129
 	.byte	0x1
 	.2byte	0x14f
-	.8byte	.LFB2808
-	.8byte	.LFE2808-.LFB2808
+	.8byte	.LFB2809
+	.8byte	.LFE2809-.LFB2809
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12997
+	.4byte	0x12b12
 	.uleb128 0x58
-	.4byte	.LASF2271
+	.4byte	.LASF2273
 	.byte	0x1
 	.2byte	0x14f
-	.4byte	0x31da
-	.4byte	.LLST152
+	.4byte	0x31f0
+	.4byte	.LLST173
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x151
-	.4byte	0xe45b
-	.4byte	.LLST153
+	.4byte	0xe47d
+	.4byte	.LLST174
 	.uleb128 0x59
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x152
-	.4byte	0xe70a
-	.4byte	.LLST154
+	.4byte	0xe72c
+	.4byte	.LLST175
 	.uleb128 0x4e
-	.8byte	.LVL668
-	.4byte	0x13dd1
+	.8byte	.LVL690
+	.4byte	0x1420a
 	.uleb128 0x4e
-	.8byte	.LVL670
-	.4byte	0x12a5e
+	.8byte	.LVL692
+	.4byte	0x12bd9
 	.uleb128 0x4e
-	.8byte	.LVL671
-	.4byte	0x13ddd
+	.8byte	.LVL693
+	.4byte	0x14216
 	.uleb128 0x4e
-	.8byte	.LVL674
-	.4byte	0x12997
+	.8byte	.LVL696
+	.4byte	0x12b12
 	.uleb128 0x4e
-	.8byte	.LVL675
-	.4byte	0x13ddd
+	.8byte	.LVL697
+	.4byte	0x14216
 	.byte	0
 	.uleb128 0x74
-	.4byte	.LASF3125
+	.4byte	.LASF3130
 	.byte	0x1
 	.2byte	0x11e
-	.8byte	.LFB2807
-	.8byte	.LFE2807-.LFB2807
+	.8byte	.LFB2808
+	.8byte	.LFE2808-.LFB2808
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12a5e
+	.4byte	0x12bd9
 	.uleb128 0x6a
-	.4byte	.LASF3114
+	.4byte	.LASF3119
 	.byte	0x1
 	.2byte	0x11e
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6a
-	.4byte	.LASF3115
+	.4byte	.LASF3120
 	.byte	0x1
 	.2byte	0x11e
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x6a
-	.4byte	.LASF3107
+	.4byte	.LASF3112
 	.byte	0x1
 	.2byte	0x11e
-	.4byte	0x4659
+	.4byte	0x466f
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x58
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
 	.2byte	0x11f
-	.4byte	0xe70a
-	.4byte	.LLST148
+	.4byte	0xe72c
+	.4byte	.LLST169
 	.uleb128 0x4c
-	.4byte	.LASF2892
+	.4byte	.LASF2896
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0xc6
@@ -42780,22 +43312,22 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x59
 	.uleb128 0x46
-	.4byte	.LASF3117
+	.4byte	.LASF3122
 	.byte	0x1
 	.2byte	0x122
 	.4byte	0x13a
 	.uleb128 0x59
-	.4byte	.LASF3118
+	.4byte	.LASF3123
 	.byte	0x1
 	.2byte	0x122
 	.4byte	0x13a
-	.4byte	.LLST149
+	.4byte	.LLST170
 	.uleb128 0x59
-	.4byte	.LASF3109
+	.4byte	.LASF3114
 	.byte	0x1
 	.2byte	0x123
 	.4byte	0x155
-	.4byte	.LLST150
+	.4byte	.LLST171
 	.uleb128 0x69
 	.string	"i"
 	.byte	0x1
@@ -42809,63 +43341,63 @@ __exitcall_ebc_exit:
 	.2byte	0x124
 	.4byte	0xc6
 	.uleb128 0x59
-	.4byte	.LASF3123
+	.4byte	.LASF3128
 	.byte	0x1
 	.2byte	0x125
 	.4byte	0x13a
-	.4byte	.LLST151
+	.4byte	.LLST172
 	.byte	0
 	.uleb128 0x75
-	.4byte	.LASF3126
+	.4byte	.LASF3131
 	.byte	0x1
 	.byte	0xd3
-	.8byte	.LFB2806
-	.8byte	.LFE2806-.LFB2806
+	.8byte	.LFB2807
+	.8byte	.LFE2807-.LFB2807
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12b43
+	.4byte	0x12cbe
 	.uleb128 0x76
-	.4byte	.LASF3114
+	.4byte	.LASF3119
 	.byte	0x1
 	.byte	0xd3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x76
-	.4byte	.LASF3115
+	.4byte	.LASF3120
 	.byte	0x1
 	.byte	0xd3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x76
-	.4byte	.LASF3116
+	.4byte	.LASF3121
 	.byte	0x1
 	.byte	0xd3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x76
-	.4byte	.LASF3107
+	.4byte	.LASF3112
 	.byte	0x1
 	.byte	0xd3
-	.4byte	0x4659
+	.4byte	0x466f
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x77
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
 	.byte	0xd4
-	.4byte	0xe70a
-	.4byte	.LLST142
+	.4byte	0xe72c
+	.4byte	.LLST163
 	.uleb128 0x77
-	.4byte	.LASF2865
+	.4byte	.LASF2867
 	.byte	0x1
 	.byte	0xd4
 	.4byte	0xc6
-	.4byte	.LLST143
+	.4byte	.LLST164
 	.uleb128 0x4b
-	.4byte	.LASF2892
+	.4byte	.LASF2896
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0xc6
@@ -42879,28 +43411,28 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x78
-	.4byte	.LASF3117
+	.4byte	.LASF3122
 	.byte	0x1
 	.byte	0xd7
 	.4byte	0x13a
 	.uleb128 0x79
-	.4byte	.LASF3118
+	.4byte	.LASF3123
 	.byte	0x1
 	.byte	0xd7
 	.4byte	0x13a
-	.4byte	.LLST144
+	.4byte	.LLST165
 	.uleb128 0x79
-	.4byte	.LASF3119
+	.4byte	.LASF3124
 	.byte	0x1
 	.byte	0xd7
 	.4byte	0x13a
-	.4byte	.LLST145
+	.4byte	.LLST166
 	.uleb128 0x79
-	.4byte	.LASF3109
+	.4byte	.LASF3114
 	.byte	0x1
 	.byte	0xd8
 	.4byte	0x155
-	.4byte	.LLST146
+	.4byte	.LLST167
 	.uleb128 0x7a
 	.string	"i"
 	.byte	0x1
@@ -42914,210 +43446,210 @@ __exitcall_ebc_exit:
 	.byte	0xd9
 	.4byte	0xc6
 	.uleb128 0x79
-	.4byte	.LASF3123
+	.4byte	.LASF3128
 	.byte	0x1
 	.byte	0xda
 	.4byte	0x13a
-	.4byte	.LLST147
+	.4byte	.LLST168
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3127
+	.4byte	.LASF3132
 	.byte	0x1
 	.byte	0xb4
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x12b75
+	.4byte	0x12cf0
 	.uleb128 0x7d
 	.string	"ebc"
 	.byte	0x1
 	.byte	0xb4
-	.4byte	0xe45b
+	.4byte	0xe47d
 	.uleb128 0x7e
-	.4byte	.LASF3128
+	.4byte	.LASF3133
 	.byte	0x1
 	.byte	0xb4
 	.4byte	0xc6
 	.uleb128 0x78
-	.4byte	.LASF2953
+	.4byte	.LASF2957
 	.byte	0x1
 	.byte	0xb6
-	.4byte	0xe70a
+	.4byte	0xe72c
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3129
+	.4byte	.LASF3134
 	.byte	0x1
 	.byte	0x86
 	.4byte	0x10b
 	.byte	0x3
-	.4byte	0x12bbd
+	.4byte	0x12d38
 	.uleb128 0x7e
-	.4byte	.LASF2854
+	.4byte	.LASF2856
 	.byte	0x1
 	.byte	0x86
-	.4byte	0xc097
+	.4byte	0xc0ad
 	.uleb128 0x7e
-	.4byte	.LASF3099
+	.4byte	.LASF3101
 	.byte	0x1
 	.byte	0x86
 	.4byte	0x11a
 	.uleb128 0x7e
-	.4byte	.LASF3100
+	.4byte	.LASF3102
 	.byte	0x1
 	.byte	0x86
 	.4byte	0x11a
 	.uleb128 0x78
-	.4byte	.LASF3130
+	.4byte	.LASF3135
 	.byte	0x1
 	.byte	0x88
 	.4byte	0x10b
 	.uleb128 0x78
-	.4byte	.LASF3112
+	.4byte	.LASF3117
 	.byte	0x1
 	.byte	0x89
 	.4byte	0x11a
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3131
+	.4byte	.LASF3136
 	.byte	0x1
 	.byte	0x80
 	.4byte	0x10b
 	.byte	0x3
-	.4byte	0x12bef
+	.4byte	0x12d6a
 	.uleb128 0x7e
-	.4byte	.LASF2854
+	.4byte	.LASF2856
 	.byte	0x1
 	.byte	0x80
-	.4byte	0xc097
+	.4byte	0xc0ad
 	.uleb128 0x7e
-	.4byte	.LASF3099
+	.4byte	.LASF3101
 	.byte	0x1
 	.byte	0x80
 	.4byte	0x11a
 	.uleb128 0x7e
-	.4byte	.LASF3100
+	.4byte	.LASF3102
 	.byte	0x1
 	.byte	0x80
 	.4byte	0x11a
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3132
+	.4byte	.LASF3137
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x12c12
+	.4byte	0x12d8d
 	.uleb128 0x7e
-	.4byte	.LASF2928
+	.4byte	.LASF2932
 	.byte	0xb
 	.byte	0x4b
-	.4byte	0xe0dd
+	.4byte	0xe0ff
 	.uleb128 0x7e
-	.4byte	.LASF2960
+	.4byte	.LASF2964
 	.byte	0xb
 	.byte	0x4b
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3133
+	.4byte	.LASF3138
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x12c40
+	.4byte	0x12dbb
 	.uleb128 0x7e
-	.4byte	.LASF2928
+	.4byte	.LASF2932
 	.byte	0xb
 	.byte	0x3c
-	.4byte	0xe0dd
+	.4byte	0xe0ff
 	.uleb128 0x7e
-	.4byte	.LASF3134
+	.4byte	.LASF3139
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13a
 	.uleb128 0x7e
-	.4byte	.LASF3135
+	.4byte	.LASF3140
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13a
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3136
+	.4byte	.LASF3141
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x12c84
+	.4byte	0x12dff
 	.uleb128 0x7e
-	.4byte	.LASF2928
+	.4byte	.LASF2932
 	.byte	0xb
 	.byte	0x36
-	.4byte	0xe0dd
+	.4byte	0xe0ff
 	.uleb128 0x7e
-	.4byte	.LASF3137
+	.4byte	.LASF3142
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF3138
+	.4byte	.LASF3143
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF3139
+	.4byte	.LASF3144
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF3140
+	.4byte	.LASF3145
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3141
+	.4byte	.LASF3146
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x12c9c
+	.4byte	0x12e17
 	.uleb128 0x7e
-	.4byte	.LASF2928
+	.4byte	.LASF2932
 	.byte	0xb
 	.byte	0x31
-	.4byte	0xe0dd
+	.4byte	0xe0ff
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3142
+	.4byte	.LASF3147
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12cc3
+	.4byte	0x12e3e
 	.uleb128 0x7e
-	.4byte	.LASF2928
+	.4byte	.LASF2932
 	.byte	0xb
 	.byte	0x2c
-	.4byte	0xe0dd
+	.4byte	0xe0ff
 	.uleb128 0x7e
-	.4byte	.LASF2994
+	.4byte	.LASF2998
 	.byte	0xb
 	.byte	0x2c
-	.4byte	0xe11d
+	.4byte	0xe13f
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3143
+	.4byte	.LASF3148
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x12d0d
+	.4byte	0x12e88
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa
 	.2byte	0x1ab
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x64
-	.4byte	.LASF1147
+	.4byte	.LASF1149
 	.byte	0xa
 	.2byte	0x1ac
 	.4byte	0x310
 	.uleb128 0x64
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0xa
 	.2byte	0x1ac
 	.4byte	0x2ce
@@ -43125,196 +43657,196 @@ __exitcall_ebc_exit:
 	.string	"dir"
 	.byte	0xa
 	.2byte	0x1ad
-	.4byte	0xdb43
+	.4byte	0xdb65
 	.uleb128 0x52
 	.string	"ops"
 	.byte	0xa
 	.2byte	0x1af
-	.4byte	0xb78e
+	.4byte	0xb7a4
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3144
+	.4byte	.LASF3149
 	.byte	0xa
 	.2byte	0x108
-	.4byte	0xb78e
+	.4byte	0xb7a4
 	.byte	0x3
-	.4byte	0x12d2b
+	.4byte	0x12ea6
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa
 	.2byte	0x108
-	.4byte	0xa545
+	.4byte	0xa55b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3145
+	.4byte	.LASF3150
 	.byte	0xc8
 	.byte	0x1d
-	.4byte	0xb78e
+	.4byte	0xb7a4
 	.byte	0x3
-	.4byte	0x12d47
+	.4byte	0x12ec2
 	.uleb128 0x7d
 	.string	"bus"
 	.byte	0xc8
 	.byte	0x1d
-	.4byte	0xadac
+	.4byte	0xadc2
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3146
+	.4byte	.LASF3151
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12d63
+	.4byte	0x12ede
 	.uleb128 0x7e
-	.4byte	.LASF3147
+	.4byte	.LASF3152
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3148
+	.4byte	.LASF3153
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x12d9c
+	.4byte	0x12f17
 	.uleb128 0x7d
 	.string	"dev"
 	.byte	0xcb
 	.byte	0xa3
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x7e
-	.4byte	.LASF3149
+	.4byte	.LASF3154
 	.byte	0xcb
 	.byte	0xa4
 	.4byte	0x310
 	.uleb128 0x7e
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0x2ce
 	.uleb128 0x7e
-	.4byte	.LASF3150
+	.4byte	.LASF3155
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3151
+	.4byte	.LASF3156
 	.byte	0x3
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12db8
+	.4byte	0x12f33
 	.uleb128 0x7e
-	.4byte	.LASF2929
+	.4byte	.LASF2933
 	.byte	0x3
 	.byte	0x35
-	.4byte	0xdadd
+	.4byte	0xdaff
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3152
+	.4byte	.LASF3157
 	.byte	0x3
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12ddd
+	.4byte	0x12f58
 	.uleb128 0x7e
-	.4byte	.LASF2929
+	.4byte	.LASF2933
 	.byte	0x3
 	.byte	0x30
-	.4byte	0xdadd
+	.4byte	0xdaff
 	.uleb128 0x7d
 	.string	"t"
 	.byte	0x3
 	.byte	0x30
-	.4byte	0x4653
+	.4byte	0x4669
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3153
+	.4byte	.LASF3158
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x12df5
+	.4byte	0x12f70
 	.uleb128 0x7e
-	.4byte	.LASF2929
+	.4byte	.LASF2933
 	.byte	0x3
 	.byte	0x2b
-	.4byte	0xdadd
+	.4byte	0xdaff
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3154
+	.4byte	.LASF3159
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x12e0d
+	.4byte	0x12f88
 	.uleb128 0x7e
-	.4byte	.LASF2929
+	.4byte	.LASF2933
 	.byte	0x3
 	.byte	0x26
-	.4byte	0xdadd
+	.4byte	0xdaff
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3155
+	.4byte	.LASF3160
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x12e25
+	.4byte	0x12fa0
 	.uleb128 0x7e
-	.4byte	.LASF2929
+	.4byte	.LASF2933
 	.byte	0x3
 	.byte	0x21
-	.4byte	0xdadd
+	.4byte	0xdaff
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3156
+	.4byte	.LASF3161
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x12e3d
+	.4byte	0x12fb8
 	.uleb128 0x7e
-	.4byte	.LASF2929
+	.4byte	.LASF2933
 	.byte	0x3
 	.byte	0x1c
-	.4byte	0xdadd
+	.4byte	0xdaff
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3157
+	.4byte	.LASF3162
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x12e55
+	.4byte	0x12fd0
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x12e55
+	.4byte	0x12fd0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd7d1
+	.4byte	0xd7e7
 	.uleb128 0x7f
-	.4byte	.LASF2836
+	.4byte	.LASF2838
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x12e73
+	.4byte	0x12fee
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x12e55
+	.4byte	0x12fd0
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3158
+	.4byte	.LASF3163
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x12eab
+	.4byte	0x13026
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x12e55
+	.4byte	0x12fd0
 	.uleb128 0x7e
 	.4byte	.LASF192
 	.byte	0x4
@@ -43329,25 +43861,25 @@ __exitcall_ebc_exit:
 	.string	"ws"
 	.byte	0x4
 	.byte	0x27
-	.4byte	0xace2
+	.4byte	0xacf8
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3159
+	.4byte	.LASF3164
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12eda
+	.4byte	0x13055
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x443
 	.uleb128 0x7e
-	.4byte	.LASF2002
+	.4byte	.LASF2004
 	.byte	0x9
 	.byte	0x98
-	.4byte	0x3091
+	.4byte	0x30a7
 	.uleb128 0x7d
 	.string	"n"
 	.byte	0x9
@@ -43355,22 +43887,22 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3160
+	.4byte	.LASF3165
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12f09
+	.4byte	0x13084
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x443
 	.uleb128 0x7e
-	.4byte	.LASF2002
+	.4byte	.LASF2004
 	.byte	0x9
 	.byte	0x90
-	.4byte	0x3091
+	.4byte	0x30a7
 	.uleb128 0x7d
 	.string	"n"
 	.byte	0x9
@@ -43378,22 +43910,22 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3161
+	.4byte	.LASF3166
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12f38
+	.4byte	0x130b3
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x443
 	.uleb128 0x7e
-	.4byte	.LASF2002
+	.4byte	.LASF2004
 	.byte	0x9
 	.byte	0x81
-	.4byte	0x3091
+	.4byte	0x30a7
 	.uleb128 0x7d
 	.string	"n"
 	.byte	0x9
@@ -43401,22 +43933,22 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3162
+	.4byte	.LASF3167
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12f72
+	.4byte	0x130ed
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x443
 	.uleb128 0x7e
-	.4byte	.LASF2002
+	.4byte	.LASF2004
 	.byte	0x9
 	.byte	0x6e
-	.4byte	0x3091
+	.4byte	0x30a7
 	.uleb128 0x7d
 	.string	"n"
 	.byte	0x9
@@ -43429,44 +43961,44 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3163
+	.4byte	.LASF3168
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x12fa6
+	.4byte	0x13121
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0x6
 	.byte	0xf5
-	.4byte	0x3091
+	.4byte	0x30a7
 	.uleb128 0x78
-	.4byte	.LASF3164
+	.4byte	.LASF3169
 	.byte	0x6
 	.byte	0xf7
 	.4byte	0x443
 	.uleb128 0x66
 	.uleb128 0x78
-	.4byte	.LASF3165
+	.4byte	.LASF3170
 	.byte	0x6
 	.byte	0xfe
 	.4byte	0x155
 	.byte	0
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3166
+	.4byte	.LASF3171
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12ff0
+	.4byte	0x1316b
 	.uleb128 0x7e
-	.4byte	.LASF1147
+	.4byte	.LASF1149
 	.byte	0x6
 	.byte	0x4b
-	.4byte	0x3091
+	.4byte	0x30a7
 	.uleb128 0x7e
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
@@ -43476,27 +44008,27 @@ __exitcall_ebc_exit:
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x78
-	.4byte	.LASF3167
+	.4byte	.LASF3172
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x66
 	.uleb128 0x78
-	.4byte	.LASF3165
+	.4byte	.LASF3170
 	.byte	0x6
 	.byte	0x56
 	.4byte	0x155
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3168
+	.4byte	.LASF3173
 	.byte	0x12
 	.2byte	0x2e5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x1301a
+	.4byte	0x13195
 	.uleb128 0x64
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0x12
 	.2byte	0x2e5
 	.4byte	0x2ce
@@ -43507,14 +44039,14 @@ __exitcall_ebc_exit:
 	.4byte	0x31b
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3169
+	.4byte	.LASF3174
 	.byte	0x12
 	.2byte	0x216
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13052
+	.4byte	0x131cd
 	.uleb128 0x64
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0x12
 	.2byte	0x216
 	.4byte	0x2ce
@@ -43525,21 +44057,21 @@ __exitcall_ebc_exit:
 	.4byte	0x31b
 	.uleb128 0x66
 	.uleb128 0x46
-	.4byte	.LASF877
+	.4byte	.LASF879
 	.byte	0x12
 	.2byte	0x21a
 	.4byte	0x6d
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3170
+	.4byte	.LASF3175
 	.byte	0x12
 	.2byte	0x1dd
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13088
+	.4byte	0x13203
 	.uleb128 0x64
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0x12
 	.2byte	0x1dd
 	.4byte	0x2ce
@@ -43549,31 +44081,31 @@ __exitcall_ebc_exit:
 	.2byte	0x1dd
 	.4byte	0x31b
 	.uleb128 0x46
-	.4byte	.LASF3171
+	.4byte	.LASF3176
 	.byte	0x12
 	.2byte	0x1df
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3172
+	.4byte	.LASF3177
 	.byte	0x12
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x130a6
+	.4byte	0x13221
 	.uleb128 0x64
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0x12
 	.2byte	0x159
 	.4byte	0x2ce
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3173
+	.4byte	.LASF3178
 	.byte	0x12
 	.2byte	0x13d
-	.4byte	0xd772
+	.4byte	0xd788
 	.byte	0x3
-	.4byte	0x130c4
+	.4byte	0x1323f
 	.uleb128 0x64
 	.4byte	.LASF170
 	.byte	0x12
@@ -43581,96 +44113,96 @@ __exitcall_ebc_exit:
 	.4byte	0x31b
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3174
+	.4byte	.LASF3179
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x130e7
+	.4byte	0x13262
 	.uleb128 0x7e
-	.4byte	.LASF3021
+	.4byte	.LASF3025
 	.byte	0xbe
 	.byte	0xdb
-	.4byte	0xd6e9
+	.4byte	0xd6ff
 	.uleb128 0x7e
-	.4byte	.LASF791
+	.4byte	.LASF793
 	.byte	0xbe
 	.byte	0xdc
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3175
+	.4byte	.LASF3180
 	.byte	0xbe
 	.byte	0xd6
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13103
+	.4byte	0x1327e
 	.uleb128 0x7e
-	.4byte	.LASF3021
+	.4byte	.LASF3025
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x13103
+	.4byte	0x1327e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xd641
+	.4byte	0xd657
 	.uleb128 0x62
-	.4byte	.LASF3176
+	.4byte	.LASF3181
 	.byte	0xa3
 	.2byte	0x164
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13127
+	.4byte	0x132a2
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x13127
+	.4byte	0x132a2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xc092
+	.4byte	0xc0a8
 	.uleb128 0x62
-	.4byte	.LASF3177
+	.4byte	.LASF3182
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13162
+	.4byte	0x132dd
 	.uleb128 0x63
 	.string	"np"
 	.byte	0xe
 	.2byte	0x498
-	.4byte	0xbc8f
+	.4byte	0xbca5
 	.uleb128 0x64
-	.4byte	.LASF3178
+	.4byte	.LASF3183
 	.byte	0xe
 	.2byte	0x499
 	.4byte	0x56
 	.uleb128 0x64
-	.4byte	.LASF3179
+	.4byte	.LASF3184
 	.byte	0xe
 	.2byte	0x49a
 	.4byte	0xaab
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3180
+	.4byte	.LASF3185
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x131ae
+	.4byte	0x13329
 	.uleb128 0x63
 	.string	"np"
 	.byte	0xe
 	.2byte	0x1ef
-	.4byte	0xbc8f
+	.4byte	0xbca5
 	.uleb128 0x64
-	.4byte	.LASF3178
+	.4byte	.LASF3183
 	.byte	0xe
 	.2byte	0x1f0
 	.4byte	0x56
 	.uleb128 0x64
-	.4byte	.LASF3181
+	.4byte	.LASF3186
 	.byte	0xe
 	.2byte	0x1f1
 	.4byte	0xaab
@@ -43686,61 +44218,61 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3182
+	.4byte	.LASF3187
 	.byte	0xe
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x131c6
+	.4byte	0x13341
 	.uleb128 0x7e
-	.4byte	.LASF865
+	.4byte	.LASF867
 	.byte	0xe
 	.byte	0x83
-	.4byte	0xb869
+	.4byte	0xb87f
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3183
+	.4byte	.LASF3188
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x131ec
+	.4byte	0x13367
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
 	.2byte	0x4a0
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x64
-	.4byte	.LASF791
+	.4byte	.LASF793
 	.byte	0x2
 	.2byte	0x4a0
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3184
+	.4byte	.LASF3189
 	.byte	0x2
 	.2byte	0x49b
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x1320a
+	.4byte	0x13385
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
 	.2byte	0x49b
-	.4byte	0xbaff
+	.4byte	0xbb15
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3185
+	.4byte	.LASF3190
 	.byte	0x2
 	.2byte	0x2c5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13240
+	.4byte	0x133bb
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
 	.2byte	0x2c5
-	.4byte	0xa545
+	.4byte	0xa55b
 	.uleb128 0x64
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0x2
 	.2byte	0x2c5
 	.4byte	0x2ce
@@ -43751,99 +44283,99 @@ __exitcall_ebc_exit:
 	.4byte	0x31b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3186
+	.4byte	.LASF3191
 	.byte	0xf
 	.byte	0xca
 	.4byte	0x33c
 	.byte	0x3
-	.4byte	0x1325c
+	.4byte	0x133d7
 	.uleb128 0x7d
 	.string	"res"
 	.byte	0xf
 	.byte	0xca
-	.4byte	0xc1a3
+	.4byte	0xc1b9
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3187
+	.4byte	.LASF3192
 	.byte	0xcc
 	.byte	0x22
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x13278
+	.4byte	0x133f3
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xcc
 	.byte	0x22
-	.4byte	0x3091
+	.4byte	0x30a7
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3188
+	.4byte	.LASF3193
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13294
+	.4byte	0x1340f
 	.uleb128 0x7e
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3189
+	.4byte	.LASF3194
 	.byte	0xd
 	.2byte	0x23e
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x132b2
+	.4byte	0x1342d
 	.uleb128 0x64
-	.4byte	.LASF2271
+	.4byte	.LASF2273
 	.byte	0xd
 	.2byte	0x23e
-	.4byte	0x31da
+	.4byte	0x31f0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3190
+	.4byte	.LASF3195
 	.byte	0xd
 	.2byte	0x203
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x132db
+	.4byte	0x13456
 	.uleb128 0x63
 	.string	"wq"
 	.byte	0xd
 	.2byte	0x203
-	.4byte	0x32f4
+	.4byte	0x330a
 	.uleb128 0x64
-	.4byte	.LASF2271
+	.4byte	.LASF2273
 	.byte	0xd
 	.2byte	0x204
-	.4byte	0x31da
+	.4byte	0x31f0
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3191
+	.4byte	.LASF3196
 	.byte	0xd
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x132fe
+	.4byte	0x13479
 	.uleb128 0x7e
-	.4byte	.LASF2271
+	.4byte	.LASF2273
 	.byte	0xd
 	.byte	0xdd
-	.4byte	0x31da
+	.4byte	0x31f0
 	.uleb128 0x7e
-	.4byte	.LASF3192
+	.4byte	.LASF3197
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3193
+	.4byte	.LASF3198
 	.byte	0x51
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1331a
+	.4byte	0x13495
 	.uleb128 0x63
 	.string	"m"
 	.byte	0x51
@@ -43851,12 +44383,12 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3194
+	.4byte	.LASF3199
 	.byte	0x51
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13336
+	.4byte	0x134b1
 	.uleb128 0x63
 	.string	"m"
 	.byte	0x51
@@ -43864,121 +44396,121 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3195
+	.4byte	.LASF3200
 	.byte	0xca
-	.byte	0x8a
+	.byte	0x97
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x13372
+	.4byte	0x134ed
 	.uleb128 0x7e
-	.4byte	.LASF1147
+	.4byte	.LASF1149
 	.byte	0xca
-	.byte	0x8a
-	.4byte	0x3091
+	.byte	0x97
+	.4byte	0x30a7
 	.uleb128 0x7e
-	.4byte	.LASF3196
+	.4byte	.LASF3201
 	.byte	0xca
-	.byte	0x8a
+	.byte	0x97
 	.4byte	0x2ce
 	.uleb128 0x7e
-	.4byte	.LASF3197
+	.4byte	.LASF3202
 	.byte	0xca
-	.byte	0x8a
+	.byte	0x97
 	.4byte	0x29b
 	.uleb128 0x7b
 	.string	"sz"
 	.byte	0xca
-	.byte	0x8c
+	.byte	0x99
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3198
+	.4byte	.LASF3203
 	.byte	0xca
-	.byte	0x84
+	.byte	0x91
 	.byte	0x3
-	.4byte	0x133a2
+	.4byte	0x1351d
 	.uleb128 0x7e
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0xca
-	.byte	0x84
+	.byte	0x91
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF380
+	.4byte	.LASF382
 	.byte	0xca
-	.byte	0x84
+	.byte	0x91
 	.4byte	0x29
 	.uleb128 0x66
 	.uleb128 0x78
-	.4byte	.LASF3199
+	.4byte	.LASF3204
 	.byte	0xca
-	.byte	0x86
+	.byte	0x93
 	.4byte	0xc6
 	.byte	0
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3200
+	.4byte	.LASF3205
 	.byte	0xca
-	.byte	0x73
+	.byte	0x80
 	.byte	0x3
-	.4byte	0x133ce
+	.4byte	0x13549
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xca
-	.byte	0x73
-	.4byte	0x3091
+	.byte	0x80
+	.4byte	0x30a7
 	.uleb128 0x7d
 	.string	"n"
 	.byte	0xca
-	.byte	0x73
+	.byte	0x80
 	.4byte	0x29
 	.uleb128 0x7e
-	.4byte	.LASF3201
+	.4byte	.LASF3206
 	.byte	0xca
-	.byte	0x74
+	.byte	0x81
 	.4byte	0x29b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3202
+	.4byte	.LASF3207
 	.byte	0xca
-	.byte	0x52
+	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x133f4
+	.4byte	0x1356f
 	.uleb128 0x7d
 	.string	"ti"
 	.byte	0xca
-	.byte	0x52
-	.4byte	0x133f4
+	.byte	0x5f
+	.4byte	0x1356f
 	.uleb128 0x7e
-	.4byte	.LASF3203
+	.4byte	.LASF3208
 	.byte	0xca
-	.byte	0x52
+	.byte	0x5f
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc1e
 	.uleb128 0x7c
-	.4byte	.LASF3204
+	.4byte	.LASF3209
 	.byte	0x5
 	.byte	0xf
-	.4byte	0x2eda
+	.4byte	0x2ef0
 	.byte	0x3
-	.4byte	0x13416
+	.4byte	0x13591
 	.uleb128 0x78
-	.4byte	.LASF3205
+	.4byte	.LASF3210
 	.byte	0x5
 	.byte	0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3206
+	.4byte	.LASF3211
 	.byte	0x10
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x1345a
+	.4byte	0x135d5
 	.uleb128 0x7e
-	.4byte	.LASF959
+	.4byte	.LASF961
 	.byte	0x10
 	.byte	0x1a
 	.4byte	0x3b7
@@ -43987,9 +44519,9 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x1344d
+	.4byte	0x135c8
 	.uleb128 0x22
-	.4byte	.LASF3090
+	.4byte	.LASF3091
 	.byte	0x10
 	.byte	0x1c
 	.4byte	0x3b7
@@ -43997,27 +44529,27 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x122d5
+	.4byte	0x12276
 	.byte	0
 	.uleb128 0x7b
 	.string	"__u"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x1342e
+	.4byte	0x135a9
 	.byte	0
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3280
+	.4byte	.LASF3285
 	.byte	0x20
 	.2byte	0x126
 	.byte	0x3
 	.uleb128 0x7c
-	.4byte	.LASF3207
+	.4byte	.LASF3212
 	.byte	0xce
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1347e
+	.4byte	0x135f9
 	.uleb128 0x7d
 	.string	"n"
 	.byte	0xce
@@ -44025,19 +44557,19 @@ __exitcall_ebc_exit:
 	.4byte	0x155
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3208
+	.4byte	.LASF3213
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xdd
 	.byte	0x3
-	.4byte	0x134b0
+	.4byte	0x1362b
 	.uleb128 0x7e
-	.4byte	.LASF2453
+	.4byte	.LASF2455
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xef
 	.uleb128 0x7e
-	.4byte	.LASF877
+	.4byte	.LASF879
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xc6
@@ -44048,32 +44580,32 @@ __exitcall_ebc_exit:
 	.4byte	0x8b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3209
+	.4byte	.LASF3214
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x134d6
+	.4byte	0x13651
 	.uleb128 0x7d
 	.string	"nr"
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF1147
+	.4byte	.LASF1149
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x134d6
+	.4byte	0x13651
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x3a
 	.uleb128 0x7f
-	.4byte	.LASF3210
+	.4byte	.LASF3215
 	.byte	0x11
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x1350f
+	.4byte	0x1368a
 	.uleb128 0x7d
 	.string	"i"
 	.byte	0x11
@@ -44083,7 +44615,7 @@ __exitcall_ebc_exit:
 	.string	"v"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x1350f
+	.4byte	0x1368a
 	.uleb128 0x7b
 	.string	"w0"
 	.byte	0x11
@@ -44093,18 +44625,18 @@ __exitcall_ebc_exit:
 	.string	"x1"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x1350f
+	.4byte	0x1368a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x367
 	.uleb128 0x7c
-	.4byte	.LASF3211
+	.4byte	.LASF3216
 	.byte	0xcf
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1352f
+	.4byte	0x136aa
 	.uleb128 0x7d
 	.string	"x"
 	.byte	0xcf
@@ -44112,839 +44644,1086 @@ __exitcall_ebc_exit:
 	.4byte	0xef
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3212
+	.4byte	.LASF3217
 	.byte	0xd0
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1354b
+	.4byte	0x136c6
 	.uleb128 0x7e
-	.4byte	.LASF2486
+	.4byte	.LASF2488
 	.byte	0xd0
 	.byte	0xb
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3213
+	.4byte	.LASF3218
 	.byte	0xd1
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x1356c
+	.4byte	0x136e7
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd1
 	.byte	0xb
-	.4byte	0x1356c
+	.4byte	0x136e7
 	.uleb128 0x7e
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0xd1
 	.byte	0xb
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x13574
+	.4byte	0x136ef
 	.uleb128 0x81
 	.uleb128 0x3
-	.4byte	0x13572
+	.4byte	0x136ed
 	.uleb128 0x7f
-	.4byte	.LASF3214
+	.4byte	.LASF3219
 	.byte	0xd1
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x1359a
+	.4byte	0x13715
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd1
 	.byte	0x9
-	.4byte	0x1356c
+	.4byte	0x136e7
 	.uleb128 0x7e
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0xd1
 	.byte	0x9
 	.4byte	0x6d
 	.byte	0
-	.uleb128 0x7f
-	.4byte	.LASF3215
+	.uleb128 0x65
+	.4byte	.LASF3220
 	.byte	0xc
-	.byte	0xe4
+	.2byte	0x11a
 	.byte	0x3
-	.4byte	0x135c6
-	.uleb128 0x7d
+	.4byte	0x13745
+	.uleb128 0x63
 	.string	"p"
 	.byte	0xc
-	.byte	0xe4
-	.4byte	0x135c6
-	.uleb128 0x7d
+	.2byte	0x11a
+	.4byte	0x13745
+	.uleb128 0x63
 	.string	"res"
 	.byte	0xc
-	.byte	0xe4
+	.2byte	0x11a
 	.4byte	0x443
-	.uleb128 0x7e
-	.4byte	.LASF984
+	.uleb128 0x64
+	.4byte	.LASF986
 	.byte	0xc
-	.byte	0xe4
+	.2byte	0x11a
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x13572
+	.4byte	0x136ed
 	.uleb128 0x82
-	.4byte	0x125b8
-	.8byte	.LFB2848
-	.8byte	.LFE2848-.LFB2848
+	.4byte	0x1261f
+	.8byte	.LFB2814
+	.8byte	.LFE2814-.LFB2814
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1370c
+	.4byte	0x139ce
 	.uleb128 0x71
-	.4byte	0x125c5
+	.4byte	0x1262c
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x125d1
+	.4byte	0x12638
 	.4byte	.LLST95
 	.uleb128 0x6f
-	.4byte	0x125dd
+	.4byte	0x12644
 	.4byte	.LLST96
+	.uleb128 0x6f
+	.4byte	0x12650
+	.4byte	.LLST97
+	.uleb128 0x53
+	.4byte	0x1265d
+	.8byte	.LBB1230
+	.8byte	.LBE1230-.LBB1230
+	.byte	0x1
+	.2byte	0x2bb
+	.4byte	0x13883
+	.uleb128 0x54
+	.4byte	0x1268e
+	.uleb128 0x54
+	.4byte	0x1268e
+	.uleb128 0x54
+	.4byte	0x1268e
+	.uleb128 0x54
+	.4byte	0x12682
+	.uleb128 0x54
+	.4byte	0x12676
+	.uleb128 0x54
+	.4byte	0x1266a
+	.uleb128 0x56
+	.8byte	.LBB1231
+	.8byte	.LBE1231-.LBB1231
+	.uleb128 0x57
+	.4byte	0x1269a
+	.uleb128 0x5f
+	.4byte	0x126a6
+	.4byte	.LLST98
+	.uleb128 0x57
+	.4byte	0x126b0
+	.uleb128 0x5f
+	.4byte	0x126ba
+	.4byte	.LLST99
+	.uleb128 0x5f
+	.4byte	0x126c6
+	.4byte	.LLST100
+	.uleb128 0x5f
+	.4byte	0x126d2
+	.4byte	.LLST101
+	.uleb128 0x57
+	.4byte	0x126de
+	.uleb128 0x60
+	.4byte	0x126ea
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x60
+	.4byte	0x126f6
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x5f
+	.4byte	0x12702
+	.4byte	.LLST102
+	.uleb128 0x5f
+	.4byte	0x1270e
+	.4byte	.LLST103
+	.uleb128 0x5f
+	.4byte	0x1271a
+	.4byte	.LLST104
+	.uleb128 0x57
+	.4byte	0x12726
+	.uleb128 0x5a
+	.4byte	0x12d38
+	.8byte	.LBB1232
+	.4byte	.Ldebug_ranges0+0x6d0
+	.byte	0x1
+	.2byte	0x2ae
+	.4byte	0x1385d
+	.uleb128 0x54
+	.4byte	0x12d5e
+	.uleb128 0x54
+	.4byte	0x12d53
+	.uleb128 0x54
+	.4byte	0x12d48
+	.byte	0
+	.uleb128 0x5e
+	.4byte	0x12d38
+	.8byte	.LBB1239
+	.4byte	.Ldebug_ranges0+0x730
+	.byte	0x1
+	.2byte	0x2af
+	.uleb128 0x54
+	.4byte	0x12d5e
+	.uleb128 0x54
+	.4byte	0x12d53
+	.uleb128 0x54
+	.4byte	0x12d48
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x5d
+	.4byte	.Ldebug_ranges0+0x780
+	.uleb128 0x54
+	.4byte	0x12650
+	.uleb128 0x54
+	.4byte	0x12644
+	.uleb128 0x54
+	.4byte	0x12638
+	.uleb128 0x54
+	.4byte	0x1262c
+	.uleb128 0x5e
+	.4byte	0x12733
+	.8byte	.LBB1251
+	.4byte	.Ldebug_ranges0+0x780
+	.byte	0x1
+	.2byte	0x2b9
 	.uleb128 0x54
-	.4byte	0x125e9
+	.4byte	0x12764
 	.uleb128 0x54
-	.4byte	0x125e9
+	.4byte	0x12764
 	.uleb128 0x54
-	.4byte	0x125e9
+	.4byte	0x12764
+	.uleb128 0x54
+	.4byte	0x12758
+	.uleb128 0x54
+	.4byte	0x1274c
+	.uleb128 0x54
+	.4byte	0x12740
+	.uleb128 0x5d
+	.4byte	.Ldebug_ranges0+0x780
 	.uleb128 0x57
-	.4byte	0x125f5
+	.4byte	0x12770
 	.uleb128 0x60
-	.4byte	0x12601
+	.4byte	0x1277c
 	.uleb128 0x1
 	.byte	0x5c
 	.uleb128 0x57
-	.4byte	0x1260b
+	.4byte	0x12786
 	.uleb128 0x60
-	.4byte	0x12615
+	.4byte	0x12790
 	.uleb128 0x1
 	.byte	0x5f
 	.uleb128 0x57
-	.4byte	0x12621
+	.4byte	0x1279c
 	.uleb128 0x5f
-	.4byte	0x1262d
-	.4byte	.LLST97
+	.4byte	0x127a8
+	.4byte	.LLST105
 	.uleb128 0x5f
-	.4byte	0x12639
-	.4byte	.LLST98
+	.4byte	0x127b4
+	.4byte	.LLST106
+	.uleb128 0x60
+	.4byte	0x127c0
+	.uleb128 0x1
+	.byte	0x59
+	.uleb128 0x60
+	.4byte	0x127cc
+	.uleb128 0x1
+	.byte	0x5a
 	.uleb128 0x5f
-	.4byte	0x12645
-	.4byte	.LLST99
+	.4byte	0x127d8
+	.4byte	.LLST107
 	.uleb128 0x5f
-	.4byte	0x12651
-	.4byte	.LLST100
+	.4byte	0x127e4
+	.4byte	.LLST108
+	.uleb128 0x60
+	.4byte	0x127f0
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x57
+	.4byte	0x127fc
+	.uleb128 0x5a
+	.4byte	0x12d38
+	.8byte	.LBB1253
+	.4byte	.Ldebug_ranges0+0x7c0
+	.byte	0x1
+	.2byte	0x287
+	.4byte	0x13956
+	.uleb128 0x54
+	.4byte	0x12d5e
+	.uleb128 0x54
+	.4byte	0x12d53
+	.uleb128 0x54
+	.4byte	0x12d48
+	.byte	0
+	.uleb128 0x5a
+	.4byte	0x12d38
+	.8byte	.LBB1258
+	.4byte	.Ldebug_ranges0+0x810
+	.byte	0x1
+	.2byte	0x288
+	.4byte	0x1397e
+	.uleb128 0x54
+	.4byte	0x12d5e
+	.uleb128 0x54
+	.4byte	0x12d53
+	.uleb128 0x54
+	.4byte	0x12d48
+	.byte	0
+	.uleb128 0x5a
+	.4byte	0x12d38
+	.8byte	.LBB1270
+	.4byte	.Ldebug_ranges0+0x880
+	.byte	0x1
+	.2byte	0x289
+	.4byte	0x139a6
+	.uleb128 0x54
+	.4byte	0x12d5e
+	.uleb128 0x54
+	.4byte	0x12d53
+	.uleb128 0x54
+	.4byte	0x12d48
+	.byte	0
+	.uleb128 0x5e
+	.4byte	0x12d38
+	.8byte	.LBB1282
+	.4byte	.Ldebug_ranges0+0x8f0
+	.byte	0x1
+	.2byte	0x28a
+	.uleb128 0x54
+	.4byte	0x12d5e
+	.uleb128 0x54
+	.4byte	0x12d53
+	.uleb128 0x54
+	.4byte	0x12d48
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x82
+	.4byte	0x12435
+	.8byte	.LFB2817
+	.8byte	.LFE2817-.LFB2817
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x13d03
+	.uleb128 0x71
+	.4byte	0x12442
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x6f
+	.4byte	0x1244e
+	.4byte	.LLST109
+	.uleb128 0x6f
+	.4byte	0x1245a
+	.4byte	.LLST110
+	.uleb128 0x6f
+	.4byte	0x12466
+	.4byte	.LLST111
+	.uleb128 0x61
+	.4byte	.Ldebug_ranges0+0x940
+	.4byte	0x13be8
+	.uleb128 0x54
+	.4byte	0x12466
+	.uleb128 0x54
+	.4byte	0x1245a
+	.uleb128 0x54
+	.4byte	0x1244e
+	.uleb128 0x54
+	.4byte	0x12442
+	.uleb128 0x5e
+	.4byte	0x12473
+	.8byte	.LBB1318
+	.4byte	.Ldebug_ranges0+0x940
+	.byte	0x1
+	.2byte	0x317
+	.uleb128 0x54
+	.4byte	0x124a4
+	.uleb128 0x54
+	.4byte	0x124a4
+	.uleb128 0x54
+	.4byte	0x124a4
+	.uleb128 0x54
+	.4byte	0x12498
+	.uleb128 0x54
+	.4byte	0x1248c
+	.uleb128 0x54
+	.4byte	0x12480
+	.uleb128 0x5d
+	.4byte	.Ldebug_ranges0+0x940
+	.uleb128 0x57
+	.4byte	0x124b0
+	.uleb128 0x5f
+	.4byte	0x124bc
+	.4byte	.LLST112
+	.uleb128 0x5f
+	.4byte	0x124c8
+	.4byte	.LLST113
+	.uleb128 0x5f
+	.4byte	0x124d4
+	.4byte	.LLST114
+	.uleb128 0x5f
+	.4byte	0x124e0
+	.4byte	.LLST115
+	.uleb128 0x5f
+	.4byte	0x124ec
+	.4byte	.LLST116
+	.uleb128 0x5f
+	.4byte	0x124f8
+	.4byte	.LLST117
+	.uleb128 0x5f
+	.4byte	0x12504
+	.4byte	.LLST118
+	.uleb128 0x5f
+	.4byte	0x12510
+	.4byte	.LLST119
+	.uleb128 0x57
+	.4byte	0x1251a
 	.uleb128 0x5f
-	.4byte	0x1265d
-	.4byte	.LLST101
+	.4byte	0x12524
+	.4byte	.LLST120
 	.uleb128 0x5f
-	.4byte	0x12669
-	.4byte	.LLST102
-	.uleb128 0x60
-	.4byte	0x12675
-	.uleb128 0x1
-	.byte	0x55
+	.4byte	0x12530
+	.4byte	.LLST121
 	.uleb128 0x57
-	.4byte	0x12681
+	.4byte	0x1253c
 	.uleb128 0x5a
-	.4byte	0x12bbd
-	.8byte	.LBB1196
-	.4byte	.Ldebug_ranges0+0x6d0
+	.4byte	0x12cf0
+	.8byte	.LBB1320
+	.4byte	.Ldebug_ranges0+0x970
 	.byte	0x1
-	.2byte	0x286
-	.4byte	0x13697
+	.2byte	0x308
+	.4byte	0x13b05
 	.uleb128 0x54
-	.4byte	0x12be3
+	.4byte	0x12d16
 	.uleb128 0x54
-	.4byte	0x12bd8
+	.4byte	0x12d0b
 	.uleb128 0x54
-	.4byte	0x12bcd
+	.4byte	0x12d00
+	.uleb128 0x5d
+	.4byte	.Ldebug_ranges0+0x970
+	.uleb128 0x57
+	.4byte	0x12d21
+	.uleb128 0x5f
+	.4byte	0x12d2c
+	.4byte	.LLST122
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x12bbd
-	.8byte	.LBB1201
-	.4byte	.Ldebug_ranges0+0x720
+	.byte	0
+	.uleb128 0x53
+	.4byte	0x12cf0
+	.8byte	.LBB1323
+	.8byte	.LBE1323-.LBB1323
 	.byte	0x1
-	.2byte	0x287
-	.4byte	0x136bf
+	.2byte	0x305
+	.4byte	0x13b51
 	.uleb128 0x54
-	.4byte	0x12be3
+	.4byte	0x12d16
 	.uleb128 0x54
-	.4byte	0x12bd8
+	.4byte	0x12d0b
 	.uleb128 0x54
-	.4byte	0x12bcd
+	.4byte	0x12d00
+	.uleb128 0x56
+	.8byte	.LBB1324
+	.8byte	.LBE1324-.LBB1324
+	.uleb128 0x57
+	.4byte	0x12d21
+	.uleb128 0x5f
+	.4byte	0x12d2c
+	.4byte	.LLST123
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x12bbd
-	.8byte	.LBB1213
-	.4byte	.Ldebug_ranges0+0x790
+	.byte	0
+	.uleb128 0x53
+	.4byte	0x12cf0
+	.8byte	.LBB1325
+	.8byte	.LBE1325-.LBB1325
 	.byte	0x1
-	.2byte	0x288
-	.4byte	0x136e7
+	.2byte	0x306
+	.4byte	0x13b9d
 	.uleb128 0x54
-	.4byte	0x12be3
+	.4byte	0x12d16
 	.uleb128 0x54
-	.4byte	0x12bd8
+	.4byte	0x12d0b
 	.uleb128 0x54
-	.4byte	0x12bcd
+	.4byte	0x12d00
+	.uleb128 0x56
+	.8byte	.LBB1326
+	.8byte	.LBE1326-.LBB1326
+	.uleb128 0x57
+	.4byte	0x12d21
+	.uleb128 0x5f
+	.4byte	0x12d2c
+	.4byte	.LLST124
 	.byte	0
-	.uleb128 0x5e
-	.4byte	0x12bbd
-	.8byte	.LBB1225
-	.4byte	.Ldebug_ranges0+0x800
+	.byte	0
+	.uleb128 0x5c
+	.4byte	0x12cf0
+	.8byte	.LBB1327
+	.8byte	.LBE1327-.LBB1327
 	.byte	0x1
-	.2byte	0x289
+	.2byte	0x307
 	.uleb128 0x54
-	.4byte	0x12be3
+	.4byte	0x12d16
 	.uleb128 0x54
-	.4byte	0x12bd8
+	.4byte	0x12d0b
 	.uleb128 0x54
-	.4byte	0x12bcd
+	.4byte	0x12d00
+	.uleb128 0x56
+	.8byte	.LBB1328
+	.8byte	.LBE1328-.LBB1328
+	.uleb128 0x57
+	.4byte	0x12d21
+	.uleb128 0x5f
+	.4byte	0x12d2c
+	.4byte	.LLST125
 	.byte	0
 	.byte	0
-	.uleb128 0x82
-	.4byte	0x124e2
-	.8byte	.LFB2849
-	.8byte	.LFE2849-.LFB2849
-	.uleb128 0x1
-	.byte	0x9c
-	.4byte	0x138ca
-	.uleb128 0x71
-	.4byte	0x124ef
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x6f
-	.4byte	0x124fb
-	.4byte	.LLST103
-	.uleb128 0x6f
-	.4byte	0x12507
-	.4byte	.LLST104
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x5c
+	.4byte	0x12549
+	.8byte	.LBB1332
+	.8byte	.LBE1332-.LBB1332
+	.byte	0x1
+	.2byte	0x319
+	.uleb128 0x54
+	.4byte	0x1257a
+	.uleb128 0x54
+	.4byte	0x1257a
+	.uleb128 0x54
+	.4byte	0x1257a
 	.uleb128 0x54
-	.4byte	0x12513
+	.4byte	0x1256e
 	.uleb128 0x54
-	.4byte	0x12513
+	.4byte	0x12562
 	.uleb128 0x54
-	.4byte	0x12513
+	.4byte	0x12556
+	.uleb128 0x56
+	.8byte	.LBB1333
+	.8byte	.LBE1333-.LBB1333
 	.uleb128 0x57
-	.4byte	0x1251f
-	.uleb128 0x5f
-	.4byte	0x1252b
-	.4byte	.LLST105
-	.uleb128 0x5f
-	.4byte	0x12537
-	.4byte	.LLST106
+	.4byte	0x12586
+	.uleb128 0x57
+	.4byte	0x12592
+	.uleb128 0x57
+	.4byte	0x1259e
 	.uleb128 0x60
-	.4byte	0x12543
+	.4byte	0x125aa
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x60
-	.4byte	0x1254f
+	.4byte	0x125b6
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5f
-	.4byte	0x1255b
-	.4byte	.LLST107
-	.uleb128 0x60
-	.4byte	0x12567
-	.uleb128 0x1
-	.byte	0x5f
-	.uleb128 0x60
-	.4byte	0x12573
-	.uleb128 0x1
-	.byte	0x5b
-	.uleb128 0x60
-	.4byte	0x1257f
-	.uleb128 0x1
-	.byte	0x5c
+	.4byte	0x125c2
+	.4byte	.LLST126
+	.uleb128 0x5f
+	.4byte	0x125ce
+	.4byte	.LLST127
+	.uleb128 0x5f
+	.4byte	0x125da
+	.4byte	.LLST128
+	.uleb128 0x5f
+	.4byte	0x125e6
+	.4byte	.LLST129
 	.uleb128 0x57
-	.4byte	0x12589
+	.4byte	0x125f0
 	.uleb128 0x5f
-	.4byte	0x12593
-	.4byte	.LLST108
-	.uleb128 0x60
-	.4byte	0x1259f
-	.uleb128 0x1
-	.byte	0x55
+	.4byte	0x125fa
+	.4byte	.LLST130
+	.uleb128 0x5f
+	.4byte	0x12606
+	.4byte	.LLST131
 	.uleb128 0x57
-	.4byte	0x125ab
+	.4byte	0x12612
 	.uleb128 0x5a
-	.4byte	0x12b75
-	.8byte	.LBB1236
-	.4byte	.Ldebug_ranges0+0x850
+	.4byte	0x12cf0
+	.8byte	.LBB1334
+	.4byte	.Ldebug_ranges0+0x9a0
 	.byte	0x1
-	.2byte	0x2ae
-	.4byte	0x137e9
+	.2byte	0x2dd
+	.4byte	0x13cc8
 	.uleb128 0x54
-	.4byte	0x12b9b
+	.4byte	0x12d16
 	.uleb128 0x54
-	.4byte	0x12b90
+	.4byte	0x12d0b
 	.uleb128 0x54
-	.4byte	0x12b85
+	.4byte	0x12d00
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0x850
-	.uleb128 0x57
-	.4byte	0x12ba6
-	.uleb128 0x5f
-	.4byte	0x12bb1
-	.4byte	.LLST109
-	.byte	0
-	.byte	0
-	.uleb128 0x53
-	.4byte	0x12b75
-	.8byte	.LBB1239
-	.8byte	.LBE1239-.LBB1239
-	.byte	0x1
-	.2byte	0x2ab
-	.4byte	0x13835
-	.uleb128 0x54
-	.4byte	0x12b9b
-	.uleb128 0x54
-	.4byte	0x12b90
-	.uleb128 0x54
-	.4byte	0x12b85
-	.uleb128 0x56
-	.8byte	.LBB1240
-	.8byte	.LBE1240-.LBB1240
+	.4byte	.Ldebug_ranges0+0x9a0
 	.uleb128 0x57
-	.4byte	0x12ba6
+	.4byte	0x12d21
 	.uleb128 0x5f
-	.4byte	0x12bb1
-	.4byte	.LLST110
+	.4byte	0x12d2c
+	.4byte	.LLST132
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x12b75
-	.8byte	.LBB1241
-	.8byte	.LBE1241-.LBB1241
+	.uleb128 0x5e
+	.4byte	0x12cf0
+	.8byte	.LBB1341
+	.4byte	.Ldebug_ranges0+0xa10
 	.byte	0x1
-	.2byte	0x2ac
-	.4byte	0x13881
+	.2byte	0x2dc
 	.uleb128 0x54
-	.4byte	0x12b9b
+	.4byte	0x12d16
 	.uleb128 0x54
-	.4byte	0x12b90
+	.4byte	0x12d0b
 	.uleb128 0x54
-	.4byte	0x12b85
-	.uleb128 0x56
-	.8byte	.LBB1242
-	.8byte	.LBE1242-.LBB1242
+	.4byte	0x12d00
+	.uleb128 0x5d
+	.4byte	.Ldebug_ranges0+0xa10
 	.uleb128 0x57
-	.4byte	0x12ba6
+	.4byte	0x12d21
 	.uleb128 0x5f
-	.4byte	0x12bb1
-	.4byte	.LLST111
+	.4byte	0x12d2c
+	.4byte	.LLST133
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
-	.4byte	0x12b75
-	.8byte	.LBB1243
-	.8byte	.LBE1243-.LBB1243
-	.byte	0x1
-	.2byte	0x2ad
-	.uleb128 0x54
-	.4byte	0x12b9b
-	.uleb128 0x54
-	.4byte	0x12b90
-	.uleb128 0x54
-	.4byte	0x12b85
-	.uleb128 0x56
-	.8byte	.LBB1244
-	.8byte	.LBE1244-.LBB1244
-	.uleb128 0x57
-	.4byte	0x12ba6
-	.uleb128 0x5f
-	.4byte	0x12bb1
-	.4byte	.LLST112
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x124aa
-	.8byte	.LFB2850
-	.8byte	.LFE2850-.LFB2850
+	.4byte	0x123fd
+	.8byte	.LFB2859
+	.8byte	.LFE2859-.LFB2859
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x139cd
+	.4byte	0x13e06
 	.uleb128 0x6f
-	.4byte	0x124b7
-	.4byte	.LLST113
+	.4byte	0x1240a
+	.4byte	.LLST134
 	.uleb128 0x54
-	.4byte	0x124c3
+	.4byte	0x12416
 	.uleb128 0x57
-	.4byte	0x124cf
+	.4byte	0x12422
 	.uleb128 0x5a
-	.4byte	0x12cc3
-	.8byte	.LBB1246
-	.4byte	.Ldebug_ranges0+0x880
+	.4byte	0x12e3e
+	.8byte	.LBB1357
+	.4byte	.Ldebug_ranges0+0xa70
 	.byte	0x1
-	.2byte	0x2bc
-	.4byte	0x1394b
+	.2byte	0x320
+	.4byte	0x13d84
 	.uleb128 0x54
-	.4byte	0x12cf4
+	.4byte	0x12e6f
 	.uleb128 0x54
-	.4byte	0x12ce8
+	.4byte	0x12e63
 	.uleb128 0x54
-	.4byte	0x12cdc
+	.4byte	0x12e57
 	.uleb128 0x54
-	.4byte	0x12cd0
+	.4byte	0x12e4b
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0x880
+	.4byte	.Ldebug_ranges0+0xa70
 	.uleb128 0x57
-	.4byte	0x12d00
+	.4byte	0x12e7b
 	.uleb128 0x5e
-	.4byte	0x12d0d
-	.8byte	.LBB1248
-	.4byte	.Ldebug_ranges0+0x8d0
+	.4byte	0x12e88
+	.8byte	.LBB1359
+	.4byte	.Ldebug_ranges0+0xac0
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x54
-	.4byte	0x12d1e
+	.4byte	0x12e99
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12c40
-	.8byte	.LBB1257
-	.4byte	.Ldebug_ranges0+0x900
+	.4byte	0x12dbb
+	.8byte	.LBB1368
+	.4byte	.Ldebug_ranges0+0xaf0
 	.byte	0x1
-	.2byte	0x2bd
-	.4byte	0x1397d
+	.2byte	0x321
+	.4byte	0x13db6
 	.uleb128 0x54
-	.4byte	0x12c78
+	.4byte	0x12df3
 	.uleb128 0x54
-	.4byte	0x12c6d
+	.4byte	0x12de8
 	.uleb128 0x54
-	.4byte	0x12c62
+	.4byte	0x12ddd
 	.uleb128 0x54
-	.4byte	0x12c57
+	.4byte	0x12dd2
 	.uleb128 0x54
-	.4byte	0x12c4c
+	.4byte	0x12dc7
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12c12
-	.8byte	.LBB1263
-	.8byte	.LBE1263-.LBB1263
+	.4byte	0x12d8d
+	.8byte	.LBB1374
+	.8byte	.LBE1374-.LBB1374
 	.byte	0x1
-	.2byte	0x2be
-	.4byte	0x139a9
+	.2byte	0x322
+	.4byte	0x13de2
 	.uleb128 0x54
-	.4byte	0x12c34
+	.4byte	0x12daf
 	.uleb128 0x54
-	.4byte	0x12c29
+	.4byte	0x12da4
 	.uleb128 0x54
-	.4byte	0x12c1e
+	.4byte	0x12d99
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12bef
-	.8byte	.LBB1265
-	.8byte	.LBE1265-.LBB1265
+	.4byte	0x12d6a
+	.8byte	.LBB1376
+	.8byte	.LBE1376-.LBB1376
 	.byte	0x1
-	.2byte	0x2bf
+	.2byte	0x323
 	.uleb128 0x54
-	.4byte	0x12c06
+	.4byte	0x12d81
 	.uleb128 0x54
-	.4byte	0x12bfb
+	.4byte	0x12d76
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12b43
-	.8byte	.LFB2851
-	.8byte	.LFE2851-.LFB2851
+	.4byte	0x12cbe
+	.8byte	.LFB2860
+	.8byte	.LFE2860-.LFB2860
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13a8b
+	.4byte	0x13ec4
 	.uleb128 0x6f
-	.4byte	0x12b53
-	.4byte	.LLST116
+	.4byte	0x12cce
+	.4byte	.LLST137
 	.uleb128 0x6f
-	.4byte	0x12b5e
-	.4byte	.LLST117
+	.4byte	0x12cd9
+	.4byte	.LLST138
 	.uleb128 0x57
-	.4byte	0x12b69
+	.4byte	0x12ce4
 	.uleb128 0x70
-	.4byte	0x12c84
-	.8byte	.LBB1289
-	.8byte	.LBE1289-.LBB1289
+	.4byte	0x12dff
+	.8byte	.LBB1398
+	.8byte	.LBE1398-.LBB1398
 	.byte	0x1
 	.byte	0xc6
-	.4byte	0x13a21
+	.4byte	0x13e5a
 	.uleb128 0x54
-	.4byte	0x12c90
+	.4byte	0x12e0b
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12e0d
-	.8byte	.LBB1291
-	.8byte	.LBE1291-.LBB1291
+	.4byte	0x12f88
+	.8byte	.LBB1400
+	.8byte	.LBE1400-.LBB1400
 	.byte	0x1
 	.byte	0xc7
-	.4byte	0x13a42
+	.4byte	0x13e7b
 	.uleb128 0x54
-	.4byte	0x12e19
+	.4byte	0x12f94
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12e3d
-	.8byte	.LBB1293
-	.8byte	.LBE1293-.LBB1293
+	.4byte	0x12fb8
+	.8byte	.LBB1402
+	.8byte	.LBE1402-.LBB1402
 	.byte	0x1
 	.byte	0xca
-	.4byte	0x13a70
+	.4byte	0x13ea9
 	.uleb128 0x54
-	.4byte	0x12e49
+	.4byte	0x12fc4
 	.uleb128 0x4e
-	.8byte	.LVL442
-	.4byte	0x13dad
+	.8byte	.LVL464
+	.4byte	0x141e6
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL439
-	.4byte	0x13b55
+	.8byte	.LVL461
+	.4byte	0x13f8e
 	.uleb128 0x4e
-	.8byte	.LVL443
-	.4byte	0x13b55
+	.8byte	.LVL465
+	.4byte	0x13f8e
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12b43
-	.8byte	.LFB2855
-	.8byte	.LFE2855-.LFB2855
+	.4byte	0x12cbe
+	.8byte	.LFB2864
+	.8byte	.LFE2864-.LFB2864
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13b3d
+	.4byte	0x13f76
 	.uleb128 0x6f
-	.4byte	0x12b53
-	.4byte	.LLST141
+	.4byte	0x12cce
+	.4byte	.LLST162
 	.uleb128 0x57
-	.4byte	0x12b69
+	.4byte	0x12ce4
 	.uleb128 0x54
-	.4byte	0x12b5e
+	.4byte	0x12cd9
 	.uleb128 0x70
-	.4byte	0x12e25
-	.8byte	.LBB1653
-	.8byte	.LBE1653-.LBB1653
+	.4byte	0x12fa0
+	.8byte	.LBB1762
+	.8byte	.LBE1762-.LBB1762
 	.byte	0x1
 	.byte	0xbf
-	.4byte	0x13adb
+	.4byte	0x13f14
 	.uleb128 0x54
-	.4byte	0x12e31
+	.4byte	0x12fac
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12c9c
-	.8byte	.LBB1655
-	.8byte	.LBE1655-.LBB1655
+	.4byte	0x12e17
+	.8byte	.LBB1764
+	.8byte	.LBE1764-.LBB1764
 	.byte	0x1
 	.byte	0xc0
-	.4byte	0x13b01
+	.4byte	0x13f3a
 	.uleb128 0x54
-	.4byte	0x12cb7
+	.4byte	0x12e32
 	.uleb128 0x54
-	.4byte	0x12cac
+	.4byte	0x12e27
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12e5b
-	.8byte	.LBB1657
-	.8byte	.LBE1657-.LBB1657
+	.4byte	0x12fd6
+	.8byte	.LBB1766
+	.8byte	.LBE1766-.LBB1766
 	.byte	0x1
 	.byte	0xbc
-	.4byte	0x13b2f
+	.4byte	0x13f68
 	.uleb128 0x54
-	.4byte	0x12e67
+	.4byte	0x12fe2
 	.uleb128 0x4e
-	.8byte	.LVL631
-	.4byte	0x13e30
+	.8byte	.LVL653
+	.4byte	0x14269
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL628
-	.4byte	0x13b55
+	.8byte	.LVL650
+	.4byte	0x13f8e
 	.byte	0
 	.uleb128 0x84
-	.4byte	.LASF3216
-	.4byte	.LASF3216
+	.4byte	.LASF3221
+	.4byte	.LASF3221
 	.byte	0xbe
 	.byte	0xcc
 	.uleb128 0x84
-	.4byte	.LASF3217
-	.4byte	.LASF3217
+	.4byte	.LASF3222
+	.4byte	.LASF3222
 	.byte	0xbe
 	.byte	0xca
 	.uleb128 0x85
-	.4byte	.LASF3218
-	.4byte	.LASF3218
+	.4byte	.LASF3223
+	.4byte	.LASF3223
 	.byte	0x2
 	.2byte	0x5d1
 	.uleb128 0x84
-	.4byte	.LASF3219
-	.4byte	.LASF3219
+	.4byte	.LASF3224
+	.4byte	.LASF3224
 	.byte	0xac
 	.byte	0x4f
 	.uleb128 0x85
-	.4byte	.LASF3220
-	.4byte	.LASF3220
+	.4byte	.LASF3225
+	.4byte	.LASF3225
 	.byte	0x2
 	.2byte	0x2bf
 	.uleb128 0x85
-	.4byte	.LASF3221
-	.4byte	.LASF3221
+	.4byte	.LASF3226
+	.4byte	.LASF3226
 	.byte	0xe
 	.2byte	0x149
 	.uleb128 0x85
-	.4byte	.LASF3222
-	.4byte	.LASF3222
+	.4byte	.LASF3227
+	.4byte	.LASF3227
 	.byte	0xe
 	.2byte	0x172
 	.uleb128 0x84
-	.4byte	.LASF3223
-	.4byte	.LASF3223
+	.4byte	.LASF3228
+	.4byte	.LASF3228
 	.byte	0xd2
 	.byte	0x78
 	.uleb128 0x84
-	.4byte	.LASF3224
-	.4byte	.LASF3224
+	.4byte	.LASF3229
+	.4byte	.LASF3229
 	.byte	0xaa
 	.byte	0x59
 	.uleb128 0x84
-	.4byte	.LASF3225
-	.4byte	.LASF3225
+	.4byte	.LASF3230
+	.4byte	.LASF3230
 	.byte	0xc3
 	.byte	0x2f
 	.uleb128 0x86
-	.4byte	.LASF3226
-	.4byte	.LASF3226
+	.4byte	.LASF3231
+	.4byte	.LASF3231
 	.uleb128 0x84
-	.4byte	.LASF3226
-	.4byte	.LASF3226
+	.4byte	.LASF3231
+	.4byte	.LASF3231
 	.byte	0xd3
 	.byte	0x36
 	.uleb128 0x85
-	.4byte	.LASF3227
-	.4byte	.LASF3227
+	.4byte	.LASF3232
+	.4byte	.LASF3232
 	.byte	0x2
 	.2byte	0x5cb
 	.uleb128 0x84
-	.4byte	.LASF3228
-	.4byte	.LASF3228
+	.4byte	.LASF3233
+	.4byte	.LASF3233
 	.byte	0xc2
 	.byte	0x30
 	.uleb128 0x84
-	.4byte	.LASF3229
-	.4byte	.LASF3229
+	.4byte	.LASF3234
+	.4byte	.LASF3234
 	.byte	0xc2
 	.byte	0x31
 	.uleb128 0x84
-	.4byte	.LASF3230
-	.4byte	.LASF3230
+	.4byte	.LASF3235
+	.4byte	.LASF3235
 	.byte	0xab
 	.byte	0x9
 	.uleb128 0x85
-	.4byte	.LASF3231
-	.4byte	.LASF3231
+	.4byte	.LASF3236
+	.4byte	.LASF3236
 	.byte	0x48
 	.2byte	0x6b8
 	.uleb128 0x85
-	.4byte	.LASF3232
-	.4byte	.LASF3232
+	.4byte	.LASF3237
+	.4byte	.LASF3237
 	.byte	0x48
 	.2byte	0x676
 	.uleb128 0x84
-	.4byte	.LASF3233
-	.4byte	.LASF3233
+	.4byte	.LASF3238
+	.4byte	.LASF3238
 	.byte	0x9c
 	.byte	0x67
 	.uleb128 0x84
-	.4byte	.LASF3234
-	.4byte	.LASF3234
+	.4byte	.LASF3239
+	.4byte	.LASF3239
 	.byte	0x54
 	.byte	0x53
 	.uleb128 0x84
-	.4byte	.LASF3235
-	.4byte	.LASF3235
+	.4byte	.LASF3240
+	.4byte	.LASF3240
 	.byte	0x54
 	.byte	0xa5
 	.uleb128 0x84
-	.4byte	.LASF3236
-	.4byte	.LASF3236
+	.4byte	.LASF3241
+	.4byte	.LASF3241
 	.byte	0xc3
 	.byte	0x2b
 	.uleb128 0x84
-	.4byte	.LASF3237
-	.4byte	.LASF3237
+	.4byte	.LASF3242
+	.4byte	.LASF3242
 	.byte	0xc3
 	.byte	0x27
 	.uleb128 0x85
-	.4byte	.LASF3238
-	.4byte	.LASF3238
+	.4byte	.LASF3243
+	.4byte	.LASF3243
 	.byte	0x12
 	.2byte	0x184
 	.uleb128 0x84
-	.4byte	.LASF3239
-	.4byte	.LASF3239
+	.4byte	.LASF3244
+	.4byte	.LASF3244
 	.byte	0xd4
-	.byte	0x4d
+	.byte	0x51
 	.uleb128 0x85
-	.4byte	.LASF3240
-	.4byte	.LASF3240
+	.4byte	.LASF3245
+	.4byte	.LASF3245
 	.byte	0x20
 	.2byte	0x1d9
 	.uleb128 0x84
-	.4byte	.LASF3241
-	.4byte	.LASF3241
+	.4byte	.LASF3246
+	.4byte	.LASF3246
 	.byte	0x3
 	.byte	0x3b
 	.uleb128 0x84
-	.4byte	.LASF3242
-	.4byte	.LASF3242
+	.4byte	.LASF3247
+	.4byte	.LASF3247
 	.byte	0x12
 	.byte	0xb9
 	.uleb128 0x86
-	.4byte	.LASF3243
-	.4byte	.LASF3243
+	.4byte	.LASF3248
+	.4byte	.LASF3248
 	.uleb128 0x84
-	.4byte	.LASF3244
-	.4byte	.LASF3244
+	.4byte	.LASF3249
+	.4byte	.LASF3249
 	.byte	0x3a
 	.byte	0xc2
 	.uleb128 0x84
-	.4byte	.LASF3245
-	.4byte	.LASF3245
+	.4byte	.LASF3250
+	.4byte	.LASF3250
 	.byte	0xac
 	.byte	0x4e
 	.uleb128 0x85
-	.4byte	.LASF3246
-	.4byte	.LASF3246
+	.4byte	.LASF3251
+	.4byte	.LASF3251
 	.byte	0x2
 	.2byte	0x287
 	.uleb128 0x84
-	.4byte	.LASF3247
-	.4byte	.LASF3247
+	.4byte	.LASF3252
+	.4byte	.LASF3252
 	.byte	0xbf
 	.byte	0x38
 	.uleb128 0x85
-	.4byte	.LASF3248
-	.4byte	.LASF3248
+	.4byte	.LASF3253
+	.4byte	.LASF3253
 	.byte	0xa3
-	.2byte	0x379
+	.2byte	0x37b
 	.uleb128 0x86
-	.4byte	.LASF3249
-	.4byte	.LASF3249
+	.4byte	.LASF3254
+	.4byte	.LASF3254
 	.uleb128 0x85
-	.4byte	.LASF3250
-	.4byte	.LASF3250
+	.4byte	.LASF3255
+	.4byte	.LASF3255
 	.byte	0x20
 	.2byte	0x1c7
 	.uleb128 0x85
-	.4byte	.LASF3251
-	.4byte	.LASF3251
+	.4byte	.LASF3256
+	.4byte	.LASF3256
 	.byte	0x20
 	.2byte	0x17e
 	.uleb128 0x84
-	.4byte	.LASF3252
-	.4byte	.LASF3252
+	.4byte	.LASF3257
+	.4byte	.LASF3257
 	.byte	0x3
 	.byte	0x3a
 	.uleb128 0x84
-	.4byte	.LASF3253
-	.4byte	.LASF3253
+	.4byte	.LASF3258
+	.4byte	.LASF3258
 	.byte	0xc2
 	.byte	0x32
 	.uleb128 0x84
-	.4byte	.LASF3254
-	.4byte	.LASF3254
+	.4byte	.LASF3259
+	.4byte	.LASF3259
 	.byte	0xc3
 	.byte	0x2c
 	.uleb128 0x85
-	.4byte	.LASF3255
-	.4byte	.LASF3255
+	.4byte	.LASF3260
+	.4byte	.LASF3260
 	.byte	0x76
 	.2byte	0xa07
 	.uleb128 0x84
-	.4byte	.LASF3256
-	.4byte	.LASF3256
+	.4byte	.LASF3261
+	.4byte	.LASF3261
 	.byte	0x48
 	.byte	0xdc
 	.uleb128 0x85
-	.4byte	.LASF3257
-	.4byte	.LASF3257
+	.4byte	.LASF3262
+	.4byte	.LASF3262
 	.byte	0x3a
 	.2byte	0x459
 	.uleb128 0x84
-	.4byte	.LASF3258
-	.4byte	.LASF3258
+	.4byte	.LASF3263
+	.4byte	.LASF3263
 	.byte	0x3a
 	.byte	0xe9
 	.uleb128 0x85
-	.4byte	.LASF3259
-	.4byte	.LASF3259
+	.4byte	.LASF3264
+	.4byte	.LASF3264
 	.byte	0x3a
 	.2byte	0x45a
 	.uleb128 0x85
-	.4byte	.LASF3260
-	.4byte	.LASF3260
+	.4byte	.LASF3265
+	.4byte	.LASF3265
 	.byte	0x6
 	.2byte	0x19f
 	.uleb128 0x85
-	.4byte	.LASF3261
-	.4byte	.LASF3261
+	.4byte	.LASF3266
+	.4byte	.LASF3266
 	.byte	0x6
 	.2byte	0x199
 	.uleb128 0x84
-	.4byte	.LASF3262
-	.4byte	.LASF3262
+	.4byte	.LASF3267
+	.4byte	.LASF3267
 	.byte	0xc3
 	.byte	0x25
 	.uleb128 0x84
-	.4byte	.LASF3263
-	.4byte	.LASF3263
+	.4byte	.LASF3268
+	.4byte	.LASF3268
 	.byte	0xc3
 	.byte	0x2a
 	.uleb128 0x84
-	.4byte	.LASF3264
-	.4byte	.LASF3264
+	.4byte	.LASF3269
+	.4byte	.LASF3269
 	.byte	0xc3
 	.byte	0x24
 	.uleb128 0x84
-	.4byte	.LASF3265
-	.4byte	.LASF3265
+	.4byte	.LASF3270
+	.4byte	.LASF3270
 	.byte	0xc3
 	.byte	0x23
 	.uleb128 0x84
-	.4byte	.LASF3266
-	.4byte	.LASF3266
+	.4byte	.LASF3271
+	.4byte	.LASF3271
 	.byte	0x9c
 	.byte	0x73
 	.uleb128 0x84
-	.4byte	.LASF3267
-	.4byte	.LASF3267
+	.4byte	.LASF3272
+	.4byte	.LASF3272
 	.byte	0xc3
 	.byte	0x29
 	.uleb128 0x84
-	.4byte	.LASF3268
-	.4byte	.LASF3268
+	.4byte	.LASF3273
+	.4byte	.LASF3273
 	.byte	0xc3
 	.byte	0x26
 	.uleb128 0x84
-	.4byte	.LASF3269
-	.4byte	.LASF3269
+	.4byte	.LASF3274
+	.4byte	.LASF3274
 	.byte	0x72
 	.byte	0x88
 	.uleb128 0x84
-	.4byte	.LASF3270
-	.4byte	.LASF3270
+	.4byte	.LASF3275
+	.4byte	.LASF3275
 	.byte	0x72
 	.byte	0x98
 	.uleb128 0x84
-	.4byte	.LASF3271
-	.4byte	.LASF3271
+	.4byte	.LASF3276
+	.4byte	.LASF3276
 	.byte	0xc4
-	.byte	0x65
+	.byte	0x67
 	.uleb128 0x84
-	.4byte	.LASF3272
-	.4byte	.LASF3272
+	.4byte	.LASF3277
+	.4byte	.LASF3277
 	.byte	0xc2
 	.byte	0x33
 	.uleb128 0x85
-	.4byte	.LASF3273
-	.4byte	.LASF3273
+	.4byte	.LASF3278
+	.4byte	.LASF3278
 	.byte	0xd
 	.2byte	0x1d6
 	.uleb128 0x87
@@ -44953,18 +45732,18 @@ __exitcall_ebc_exit:
 	.byte	0x78
 	.byte	0x2c
 	.uleb128 0x84
-	.4byte	.LASF3274
-	.4byte	.LASF3274
+	.4byte	.LASF3279
+	.4byte	.LASF3279
 	.byte	0x78
 	.byte	0x27
 	.uleb128 0x84
-	.4byte	.LASF3275
-	.4byte	.LASF3275
+	.4byte	.LASF3280
+	.4byte	.LASF3280
 	.byte	0x1e
 	.byte	0xb0
 	.uleb128 0x84
-	.4byte	.LASF3276
-	.4byte	.LASF3276
+	.4byte	.LASF3281
+	.4byte	.LASF3281
 	.byte	0x9c
 	.byte	0x71
 	.byte	0
@@ -46781,9 +47560,9 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST118:
-	.8byte	.LVL445
-	.8byte	.LVL446
+.LLST139:
+	.8byte	.LVL467
+	.8byte	.LVL468
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -46795,663 +47574,663 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST119:
-	.8byte	.LVL451
-	.8byte	.LVL452
+.LLST140:
+	.8byte	.LVL473
+	.8byte	.LVL474
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST120:
-	.8byte	.LVL455
-	.8byte	.LVL456
+.LLST141:
+	.8byte	.LVL477
+	.8byte	.LVL478
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL497
-	.8byte	.LVL498
+	.8byte	.LVL519
+	.8byte	.LVL520
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL596
-	.8byte	.LVL597
+	.8byte	.LVL618
+	.8byte	.LVL619
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST121:
-	.8byte	.LVL458
-	.8byte	.LVL459
+.LLST142:
+	.8byte	.LVL480
+	.8byte	.LVL481
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL610
-	.8byte	.LVL611
+	.8byte	.LVL632
+	.8byte	.LVL633
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST122:
-	.8byte	.LVL460
-	.8byte	.LVL499
+.LLST143:
+	.8byte	.LVL482
+	.8byte	.LVL521
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL502
-	.8byte	.LVL596
+	.8byte	.LVL524
+	.8byte	.LVL618
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL597
-	.8byte	.LVL603
+	.8byte	.LVL619
+	.8byte	.LVL625
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL604
-	.8byte	.LVL605
+	.8byte	.LVL626
+	.8byte	.LVL627
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL609
-	.8byte	.LVL610
+	.8byte	.LVL631
+	.8byte	.LVL632
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL613
-	.8byte	.LFE2841
+	.8byte	.LVL635
+	.8byte	.LFE2846
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST123:
-	.8byte	.LVL481
-	.8byte	.LVL492
+.LLST144:
+	.8byte	.LVL503
+	.8byte	.LVL514
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL497
-	.8byte	.LVL500
+	.8byte	.LVL519
+	.8byte	.LVL522
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL502
-	.8byte	.LVL505
+	.8byte	.LVL524
+	.8byte	.LVL527
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL586
-	.8byte	.LVL587
+	.8byte	.LVL608
+	.8byte	.LVL609
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL604
-	.8byte	.LVL605
+	.8byte	.LVL626
+	.8byte	.LVL627
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL615
-	.8byte	.LVL616
+	.8byte	.LVL637
+	.8byte	.LVL638
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST124:
-	.8byte	.LVL492
-	.8byte	.LVL496
+.LLST145:
+	.8byte	.LVL514
+	.8byte	.LVL518
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL497
-	.8byte	.LVL500
+	.8byte	.LVL519
+	.8byte	.LVL522
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL510
-	.8byte	.LVL511
+	.8byte	.LVL532
+	.8byte	.LVL533
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL609
-	.8byte	.LVL610
+	.8byte	.LVL631
+	.8byte	.LVL632
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL615
-	.8byte	.LVL616
+	.8byte	.LVL637
+	.8byte	.LVL638
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST125:
-	.8byte	.LVL511
-	.8byte	.LVL512-1
+.LLST146:
+	.8byte	.LVL533
+	.8byte	.LVL534-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST126:
-	.8byte	.LVL516
-	.8byte	.LVL519
+.LLST147:
+	.8byte	.LVL538
+	.8byte	.LVL541
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST127:
-	.8byte	.LVL517
-	.8byte	.LVL518
+.LLST148:
+	.8byte	.LVL539
+	.8byte	.LVL540
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST128:
-	.8byte	.LVL497
-	.8byte	.LVL500
+.LLST149:
+	.8byte	.LVL519
+	.8byte	.LVL522
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL521
-	.8byte	.LVL529
+	.8byte	.LVL543
+	.8byte	.LVL551
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL598
-	.8byte	.LVL600
+	.8byte	.LVL620
+	.8byte	.LVL622
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL600
-	.8byte	.LVL601
+	.8byte	.LVL622
+	.8byte	.LVL623
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL601
-	.8byte	.LVL603
+	.8byte	.LVL623
+	.8byte	.LVL625
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL615
-	.8byte	.LVL616
+	.8byte	.LVL637
+	.8byte	.LVL638
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST129:
-	.8byte	.LVL524
-	.8byte	.LVL527
+.LLST150:
+	.8byte	.LVL546
+	.8byte	.LVL549
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST130:
-	.8byte	.LVL525
-	.8byte	.LVL526
+.LLST151:
+	.8byte	.LVL547
+	.8byte	.LVL548
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST131:
-	.8byte	.LVL528
-	.8byte	.LVL530-1
+.LLST152:
+	.8byte	.LVL550
+	.8byte	.LVL552-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST132:
-	.8byte	.LVL497
-	.8byte	.LVL502
+.LLST153:
+	.8byte	.LVL519
+	.8byte	.LVL524
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL535
-	.8byte	.LVL569
+	.8byte	.LVL557
+	.8byte	.LVL591
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL569
-	.8byte	.LVL570
+	.8byte	.LVL591
+	.8byte	.LVL592
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL573
-	.8byte	.LVL586
+	.8byte	.LVL595
+	.8byte	.LVL608
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL587
-	.8byte	.LVL592
+	.8byte	.LVL609
+	.8byte	.LVL614
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL615
-	.8byte	.LVL622
+	.8byte	.LVL637
+	.8byte	.LVL644
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
 	.8byte	0
 	.8byte	0
-.LLST133:
-	.8byte	.LVL497
-	.8byte	.LVL502
+.LLST154:
+	.8byte	.LVL519
+	.8byte	.LVL524
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL535
-	.8byte	.LVL583
+	.8byte	.LVL557
+	.8byte	.LVL605
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL583
-	.8byte	.LVL584
+	.8byte	.LVL605
+	.8byte	.LVL606
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL587
-	.8byte	.LVL592
+	.8byte	.LVL609
+	.8byte	.LVL614
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL615
-	.8byte	.LFE2841
+	.8byte	.LVL637
+	.8byte	.LFE2846
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
 	.8byte	0
 	.8byte	0
-.LLST134:
-	.8byte	.LVL497
-	.8byte	.LVL500
+.LLST155:
+	.8byte	.LVL519
+	.8byte	.LVL522
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL541
-	.8byte	.LVL552
+	.8byte	.LVL563
+	.8byte	.LVL574
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL556
-	.8byte	.LVL565
+	.8byte	.LVL578
+	.8byte	.LVL587
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL573
-	.8byte	.LVL575
+	.8byte	.LVL595
+	.8byte	.LVL597
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL580
-	.8byte	.LVL586
+	.8byte	.LVL602
+	.8byte	.LVL608
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL615
-	.8byte	.LVL619
+	.8byte	.LVL637
+	.8byte	.LVL641
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL623
-	.8byte	.LFE2841
+	.8byte	.LVL645
+	.8byte	.LFE2846
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST135:
-	.8byte	.LVL497
-	.8byte	.LVL501
+.LLST156:
+	.8byte	.LVL519
+	.8byte	.LVL523
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL546
-	.8byte	.LVL565
+	.8byte	.LVL568
+	.8byte	.LVL587
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL572
-	.8byte	.LVL586
+	.8byte	.LVL594
+	.8byte	.LVL608
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL587
-	.8byte	.LVL592
+	.8byte	.LVL609
+	.8byte	.LVL614
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL615
-	.8byte	.LVL619
+	.8byte	.LVL637
+	.8byte	.LVL641
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST136:
-	.8byte	.LVL497
-	.8byte	.LVL500
+.LLST157:
+	.8byte	.LVL519
+	.8byte	.LVL522
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL537
-	.8byte	.LVL543
+	.8byte	.LVL559
+	.8byte	.LVL565
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL544
-	.8byte	.LVL547
+	.8byte	.LVL566
+	.8byte	.LVL569
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL556
-	.8byte	.LVL573
+	.8byte	.LVL578
+	.8byte	.LVL595
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL615
-	.8byte	.LVL616
+	.8byte	.LVL637
+	.8byte	.LVL638
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL619
-	.8byte	.LFE2841
+	.8byte	.LVL641
+	.8byte	.LFE2846
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST137:
-	.8byte	.LVL497
-	.8byte	.LVL501
+.LLST158:
+	.8byte	.LVL519
+	.8byte	.LVL523
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL539
-	.8byte	.LVL546
+	.8byte	.LVL561
+	.8byte	.LVL568
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL548
-	.8byte	.LVL572
+	.8byte	.LVL570
+	.8byte	.LVL594
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL578
-	.8byte	.LVL580
+	.8byte	.LVL600
+	.8byte	.LVL602
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL587
-	.8byte	.LVL592
+	.8byte	.LVL609
+	.8byte	.LVL614
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL615
-	.8byte	.LVL616
+	.8byte	.LVL637
+	.8byte	.LVL638
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL619
-	.8byte	.LFE2841
+	.8byte	.LVL641
+	.8byte	.LFE2846
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST138:
-	.8byte	.LVL497
-	.8byte	.LVL501
+.LLST159:
+	.8byte	.LVL519
+	.8byte	.LVL523
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL542
-	.8byte	.LVL565
+	.8byte	.LVL564
+	.8byte	.LVL587
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL568
-	.8byte	.LVL586
+	.8byte	.LVL590
+	.8byte	.LVL608
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL587
-	.8byte	.LVL592
+	.8byte	.LVL609
+	.8byte	.LVL614
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL615
-	.8byte	.LVL619
+	.8byte	.LVL637
+	.8byte	.LVL641
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL619
-	.8byte	.LVL620
+	.8byte	.LVL641
+	.8byte	.LVL642
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL620
-	.8byte	.LFE2841
+	.8byte	.LVL642
+	.8byte	.LFE2846
 	.2byte	0x1
 	.byte	0x6b
 	.8byte	0
 	.8byte	0
-.LLST139:
-	.8byte	.LVL497
-	.8byte	.LVL500
+.LLST160:
+	.8byte	.LVL519
+	.8byte	.LVL522
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL543
 	.8byte	.LVL565
+	.8byte	.LVL587
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL573
-	.8byte	.LVL586
+	.8byte	.LVL595
+	.8byte	.LVL608
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL587
-	.8byte	.LVL592
+	.8byte	.LVL609
+	.8byte	.LVL614
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL615
-	.8byte	.LVL616
+	.8byte	.LVL637
+	.8byte	.LVL638
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL616
-	.8byte	.LVL617
+	.8byte	.LVL638
+	.8byte	.LVL639
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL617
-	.8byte	.LVL619
+	.8byte	.LVL639
+	.8byte	.LVL641
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST140:
-	.8byte	.LVL497
-	.8byte	.LVL500
+.LLST161:
+	.8byte	.LVL519
+	.8byte	.LVL522
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL552
-	.8byte	.LVL565
+	.8byte	.LVL574
+	.8byte	.LVL587
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL578
-	.8byte	.LVL580
+	.8byte	.LVL600
+	.8byte	.LVL602
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL587
-	.8byte	.LVL589
+	.8byte	.LVL609
+	.8byte	.LVL611
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL615
-	.8byte	.LVL616
+	.8byte	.LVL637
+	.8byte	.LVL638
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
 .LLST71:
-	.8byte	.LVL267
 	.8byte	.LVL268
+	.8byte	.LVL269
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST72:
-	.8byte	.LVL267
-	.8byte	.LVL269
+	.8byte	.LVL268
+	.8byte	.LVL270
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST73:
-	.8byte	.LVL267
-	.8byte	.LVL270
+	.8byte	.LVL268
+	.8byte	.LVL271
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL270
-	.8byte	.LVL271-1
+	.8byte	.LVL271
+	.8byte	.LVL272-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST74:
-	.8byte	.LVL272
 	.8byte	.LVL273
+	.8byte	.LVL274
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST75:
-	.8byte	.LVL272
-	.8byte	.LVL274
+	.8byte	.LVL273
+	.8byte	.LVL275
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST76:
-	.8byte	.LVL272
-	.8byte	.LVL275
+	.8byte	.LVL273
+	.8byte	.LVL276
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL275
-	.8byte	.LVL276-1
+	.8byte	.LVL276
+	.8byte	.LVL277-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST86:
-	.8byte	.LVL297
 	.8byte	.LVL298
+	.8byte	.LVL299
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST87:
-	.8byte	.LVL297
-	.8byte	.LVL299
+	.8byte	.LVL298
+	.8byte	.LVL300
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST88:
-	.8byte	.LVL297
-	.8byte	.LVL301
+	.8byte	.LVL298
+	.8byte	.LVL302
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL301
-	.8byte	.LVL306
+	.8byte	.LVL302
+	.8byte	.LVL307
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL307
-	.8byte	.LFE2832
+	.8byte	.LVL308
+	.8byte	.LFE2837
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
 .LLST89:
-	.8byte	.LVL297
-	.8byte	.LVL302-1
+	.8byte	.LVL298
+	.8byte	.LVL303-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL302-1
-	.8byte	.LVL305
+	.8byte	.LVL303-1
+	.8byte	.LVL306
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL307
 	.8byte	.LVL308
+	.8byte	.LVL309
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL310
 	.8byte	.LVL311
+	.8byte	.LVL312
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST90:
-	.8byte	.LVL300
-	.8byte	.LVL306
+	.8byte	.LVL301
+	.8byte	.LVL307
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL307
-	.8byte	.LFE2832
+	.8byte	.LVL308
+	.8byte	.LFE2837
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
 .LLST91:
-	.8byte	.LVL303
-	.8byte	.LVL307
+	.8byte	.LVL304
+	.8byte	.LVL308
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
-	.8byte	.LVL310
-	.8byte	.LFE2832
+	.8byte	.LVL311
+	.8byte	.LFE2837
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
 	.8byte	0
 	.8byte	0
 .LLST77:
-	.8byte	.LVL277
 	.8byte	.LVL278
+	.8byte	.LVL279
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST78:
-	.8byte	.LVL277
-	.8byte	.LVL279
+	.8byte	.LVL278
+	.8byte	.LVL280
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST79:
-	.8byte	.LVL277
-	.8byte	.LVL280-1
+	.8byte	.LVL278
+	.8byte	.LVL281-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL280-1
-	.8byte	.LVL282
+	.8byte	.LVL281-1
+	.8byte	.LVL283
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
 .LLST80:
-	.8byte	.LVL283
 	.8byte	.LVL284
+	.8byte	.LVL285
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST81:
-	.8byte	.LVL283
-	.8byte	.LVL285
+	.8byte	.LVL284
+	.8byte	.LVL286
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST82:
-	.8byte	.LVL283
-	.8byte	.LVL286
+	.8byte	.LVL284
+	.8byte	.LVL287
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL286
-	.8byte	.LVL289
+	.8byte	.LVL287
+	.8byte	.LVL290
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL290
-	.8byte	.LFE2830
+	.8byte	.LVL291
+	.8byte	.LFE2835
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST83:
-	.8byte	.LVL292
 	.8byte	.LVL293
+	.8byte	.LVL294
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST84:
-	.8byte	.LVL292
-	.8byte	.LVL294
+	.8byte	.LVL293
+	.8byte	.LVL295
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST85:
-	.8byte	.LVL292
-	.8byte	.LVL295
+	.8byte	.LVL293
+	.8byte	.LVL296
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL295
-	.8byte	.LVL296-1
+	.8byte	.LVL296
+	.8byte	.LVL297-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST92:
-	.8byte	.LVL314
-	.8byte	.LVL315-1
+	.8byte	.LVL315
+	.8byte	.LVL316-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST93:
-	.8byte	.LVL314
-	.8byte	.LVL315-1
+	.8byte	.LVL315
+	.8byte	.LVL316-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST94:
-	.8byte	.LVL314
-	.8byte	.LVL315-1
+	.8byte	.LVL315
+	.8byte	.LVL316-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL315-1
-	.8byte	.LVL317
+	.8byte	.LVL316-1
+	.8byte	.LVL318
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -47565,7 +48344,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL222
-	.8byte	.LFE2825
+	.8byte	.LFE2830
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
@@ -47903,7 +48682,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL229
-	.8byte	.LFE2825
+	.8byte	.LFE2830
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -47937,7 +48716,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x53
 	.8byte	.LVL230
-	.8byte	.LFE2825
+	.8byte	.LFE2830
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
@@ -48187,505 +48966,514 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST155:
-	.8byte	.LVL677
-	.8byte	.LVL678
+.LLST176:
+	.8byte	.LVL699
+	.8byte	.LVL700
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST156:
-	.8byte	.LVL679
-	.8byte	.LVL688
+.LLST177:
+	.8byte	.LVL701
+	.8byte	.LVL710
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL692
-	.8byte	.LFE2820
+	.8byte	.LVL714
+	.8byte	.LFE2825
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST157:
-	.8byte	.LVL682
-	.8byte	.LVL687
+.LLST178:
+	.8byte	.LVL704
+	.8byte	.LVL709
 	.2byte	0x1
 	.byte	0x67
-	.8byte	.LVL692
-	.8byte	.LVL693
+	.8byte	.LVL714
+	.8byte	.LVL715
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL693
-	.8byte	.LVL703
+	.8byte	.LVL715
+	.8byte	.LVL725
 	.2byte	0x1
 	.byte	0x67
-	.8byte	.LVL703
-	.8byte	.LVL704
+	.8byte	.LVL725
+	.8byte	.LVL726
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL704
-	.8byte	.LVL714
+	.8byte	.LVL726
+	.8byte	.LVL736
 	.2byte	0x1
 	.byte	0x67
-	.8byte	.LVL714
-	.8byte	.LVL715
+	.8byte	.LVL736
+	.8byte	.LVL737
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL715
-	.8byte	.LVL745
+	.8byte	.LVL737
+	.8byte	.LVL767
 	.2byte	0x1
 	.byte	0x67
-	.8byte	.LVL745
-	.8byte	.LVL746
+	.8byte	.LVL767
+	.8byte	.LVL768
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL746
-	.8byte	.LVL800
+	.8byte	.LVL768
+	.8byte	.LVL811
 	.2byte	0x1
 	.byte	0x67
-	.8byte	.LVL800
-	.8byte	.LVL801
+	.8byte	.LVL811
+	.8byte	.LVL812
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL801
-	.8byte	.LVL834
+	.8byte	.LVL812
+	.8byte	.LVL850
 	.2byte	0x1
 	.byte	0x67
 	.8byte	0
 	.8byte	0
-.LLST158:
-	.8byte	.LVL681
-	.8byte	.LVL689
+.LLST179:
+	.8byte	.LVL703
+	.8byte	.LVL711
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL692
-	.8byte	.LVL753
+	.8byte	.LVL714
+	.8byte	.LVL775
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL753
-	.8byte	.LVL754
+	.8byte	.LVL775
+	.8byte	.LVL776
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL754
-	.8byte	.LFE2820
+	.8byte	.LVL776
+	.8byte	.LFE2825
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST159:
-	.8byte	.LVL680
-	.8byte	.LVL690
+.LLST180:
+	.8byte	.LVL702
+	.8byte	.LVL712
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL692
-	.8byte	.LFE2820
+	.8byte	.LVL714
+	.8byte	.LFE2825
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST160:
-	.8byte	.LVL682
-	.8byte	.LVL691
+.LLST181:
+	.8byte	.LVL704
+	.8byte	.LVL713
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL692
-	.8byte	.LVL787
+	.8byte	.LVL714
+	.8byte	.LVL798
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL791
-	.8byte	.LVL794
+	.8byte	.LVL802
+	.8byte	.LVL805
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL811
+	.8byte	.LVL828
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL800
-	.8byte	.LVL813
+	.8byte	.LVL839
+	.8byte	.LVL841
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL824
-	.8byte	.LFE2820
+	.8byte	.LVL842
+	.8byte	.LFE2825
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST165:
-	.8byte	.LVL766
-	.8byte	.LVL767
+.LLST185:
+	.8byte	.LVL786
+	.8byte	.LVL787
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL815
-	.8byte	.LVL816-1
+	.8byte	.LVL830
+	.8byte	.LVL831-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST163:
-	.8byte	.LVL758
-	.8byte	.LVL759
+.LLST184:
+	.8byte	.LVL780
+	.8byte	.LVL781
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL771
-	.8byte	.LVL772-1
+	.8byte	.LVL819
+	.8byte	.LVL820-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST162:
-	.8byte	.LVL694
-	.8byte	.LVL695
+.LLST183:
+	.8byte	.LVL716
+	.8byte	.LVL717
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL748
-	.8byte	.LVL749-1
+	.8byte	.LVL770
+	.8byte	.LVL771-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST161:
-	.8byte	.LVL682
-	.8byte	.LVL683
+.LLST182:
+	.8byte	.LVL704
+	.8byte	.LVL705
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL696
-	.8byte	.LVL697
+	.8byte	.LVL718
+	.8byte	.LVL719
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL699
-	.8byte	.LVL700-1
+	.8byte	.LVL721
+	.8byte	.LVL722-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST164:
-	.8byte	.LVL738
-	.8byte	.LVL739-1
-	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL761
-	.8byte	.LVL762-1
-	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL763
-	.8byte	.LVL764
-	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL808
-	.8byte	.LVL809-1
+.LLST186:
+	.8byte	.LVL751
+	.8byte	.LVL753-1
 	.2byte	0x1
-	.byte	0x57
-	.8byte	0
-	.8byte	0
-.LLST166:
-	.8byte	.LVL729
-	.8byte	.LVL731-1
+	.byte	0x62
+	.8byte	.LVL765
+	.8byte	.LVL766-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL741
-	.8byte	.LVL742-1
+	.8byte	.LVL793
+	.8byte	.LVL811
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL782
-	.8byte	.LVL800
+	.8byte	.LVL812
+	.8byte	.LVL814-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL801
-	.8byte	.LVL803-1
+	.8byte	.LVL834
+	.8byte	.LVL840-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL819
-	.8byte	.LVL825-1
+	.8byte	.LVL841
+	.8byte	.LVL842
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL830
-	.8byte	.LVL831-1
+	.8byte	.LVL846
+	.8byte	.LVL847-1
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST167:
-	.8byte	.LVL787
-	.8byte	.LVL790
+.LLST187:
+	.8byte	.LVL798
+	.8byte	.LVL801
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL795
-	.8byte	.LVL800
+	.8byte	.LVL806
+	.8byte	.LVL811
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL819
-	.8byte	.LVL822
+	.8byte	.LVL834
+	.8byte	.LVL837
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL841
+	.8byte	.LVL842
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST168:
-	.8byte	.LVL682
-	.8byte	.LVL691
+.LLST188:
+	.8byte	.LVL704
+	.8byte	.LVL713
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL692
-	.8byte	.LVL737
+	.8byte	.LVL714
+	.8byte	.LVL759
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL741
-	.8byte	.LVL753
+	.8byte	.LVL761
+	.8byte	.LVL762
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL764
-	.8byte	.LVL769
+	.8byte	.LVL765
+	.8byte	.LVL775
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL776
-	.8byte	.LVL777
+	.8byte	.LVL784
+	.8byte	.LVL798
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL778
-	.8byte	.LVL787
+	.8byte	.LVL800
+	.8byte	.LVL805
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL789
-	.8byte	.LVL794
+	.8byte	.LVL811
+	.8byte	.LVL817
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL800
-	.8byte	.LVL808
+	.8byte	.LVL823
+	.8byte	.LVL828
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL810
-	.8byte	.LVL813
+	.8byte	.LVL836
+	.8byte	.LVL841
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL821
-	.8byte	.LFE2820
+	.8byte	.LVL842
+	.8byte	.LFE2825
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST169:
-	.8byte	.LVL729
-	.8byte	.LVL731-1
+.LLST189:
+	.8byte	.LVL751
+	.8byte	.LVL753-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL741
-	.8byte	.LVL742-1
+	.8byte	.LVL765
+	.8byte	.LVL766-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL786
-	.8byte	.LVL788
+	.8byte	.LVL797
+	.8byte	.LVL799
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL789
 	.8byte	.LVL800
+	.8byte	.LVL811
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL801
-	.8byte	.LVL803-1
+	.8byte	.LVL812
+	.8byte	.LVL814-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL819
-	.8byte	.LVL820
+	.8byte	.LVL834
+	.8byte	.LVL835
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL824
-	.8byte	.LVL825-1
+	.8byte	.LVL839
+	.8byte	.LVL840-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL830
-	.8byte	.LVL831-1
+	.8byte	.LVL841
+	.8byte	.LVL842
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL846
+	.8byte	.LVL847-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST170:
-	.8byte	.LVL729
-	.8byte	.LVL731-1
+.LLST190:
+	.8byte	.LVL751
+	.8byte	.LVL753-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL741
-	.8byte	.LVL742-1
+	.8byte	.LVL765
+	.8byte	.LVL766-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL786
-	.8byte	.LVL796
+	.8byte	.LVL797
+	.8byte	.LVL807
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL797
-	.8byte	.LVL798
+	.8byte	.LVL808
+	.8byte	.LVL809
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL799
-	.8byte	.LVL800
+	.8byte	.LVL810
+	.8byte	.LVL811
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL801
-	.8byte	.LVL803-1
+	.8byte	.LVL812
+	.8byte	.LVL814-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL819
-	.8byte	.LVL825-1
+	.8byte	.LVL834
+	.8byte	.LVL840-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL830
-	.8byte	.LVL831-1
+	.8byte	.LVL841
+	.8byte	.LVL842
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL846
+	.8byte	.LVL847-1
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST171:
-	.8byte	.LVL729
-	.8byte	.LVL731-1
+.LLST191:
+	.8byte	.LVL751
+	.8byte	.LVL753-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL741
-	.8byte	.LVL742-1
+	.8byte	.LVL765
+	.8byte	.LVL766-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL786
-	.8byte	.LVL787
+	.8byte	.LVL797
+	.8byte	.LVL798
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL790
-	.8byte	.LVL792
+	.8byte	.LVL801
+	.8byte	.LVL803
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL792
-	.8byte	.LVL793
+	.8byte	.LVL803
+	.8byte	.LVL804
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL801
-	.8byte	.LVL803-1
+	.8byte	.LVL812
+	.8byte	.LVL814-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL823
-	.8byte	.LVL825-1
+	.8byte	.LVL838
+	.8byte	.LVL840-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL830
-	.8byte	.LVL831-1
+	.8byte	.LVL846
+	.8byte	.LVL847-1
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST172:
-	.8byte	.LVL729
-	.8byte	.LVL731-1
+.LLST192:
+	.8byte	.LVL751
+	.8byte	.LVL753-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL741
-	.8byte	.LVL742-1
+	.8byte	.LVL765
+	.8byte	.LVL766-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL785
-	.8byte	.LVL800
+	.8byte	.LVL796
+	.8byte	.LVL811
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL801
-	.8byte	.LVL803-1
+	.8byte	.LVL812
+	.8byte	.LVL814-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL819
-	.8byte	.LVL825-1
+	.8byte	.LVL834
+	.8byte	.LVL840-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL830
-	.8byte	.LVL831-1
+	.8byte	.LVL841
+	.8byte	.LVL842
+	.2byte	0x1
+	.byte	0x61
+	.8byte	.LVL846
+	.8byte	.LVL847-1
 	.2byte	0x1
 	.byte	0x61
 	.8byte	0
 	.8byte	0
-.LLST173:
-	.8byte	.LVL729
-	.8byte	.LVL731-1
+.LLST193:
+	.8byte	.LVL751
+	.8byte	.LVL753-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL741
-	.8byte	.LVL742-1
+	.8byte	.LVL765
+	.8byte	.LVL766-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL783
-	.8byte	.LVL800
+	.8byte	.LVL794
+	.8byte	.LVL811
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL801
-	.8byte	.LVL803-1
+	.8byte	.LVL812
+	.8byte	.LVL814-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL819
-	.8byte	.LVL825-1
+	.8byte	.LVL834
+	.8byte	.LVL840-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL830
-	.8byte	.LVL831-1
+	.8byte	.LVL841
+	.8byte	.LVL842
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL846
+	.8byte	.LVL847-1
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST174:
-	.8byte	.LVL729
-	.8byte	.LVL731-1
+.LLST194:
+	.8byte	.LVL751
+	.8byte	.LVL753-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL741
-	.8byte	.LVL742-1
+	.8byte	.LVL765
+	.8byte	.LVL766-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL785
-	.8byte	.LVL800
+	.8byte	.LVL796
+	.8byte	.LVL811
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL801
-	.8byte	.LVL803-1
+	.8byte	.LVL812
+	.8byte	.LVL814-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL819
-	.8byte	.LVL825-1
+	.8byte	.LVL834
+	.8byte	.LVL840-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL830
-	.8byte	.LVL831-1
+	.8byte	.LVL841
+	.8byte	.LVL842
+	.2byte	0x1
+	.byte	0x60
+	.8byte	.LVL846
+	.8byte	.LVL847-1
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST175:
-	.8byte	.LVL682
-	.8byte	.LVL691
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL692
-	.8byte	.LVL705
+.LLST195:
+	.8byte	.LVL704
+	.8byte	.LVL713
 	.2byte	0x1
 	.byte	0x69
 	.8byte	.LVL714
-	.8byte	.LVL718
+	.8byte	.LVL727
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL726
-	.8byte	.LVL730
+	.8byte	.LVL736
+	.8byte	.LVL740
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL734
-	.8byte	.LVL736
+	.8byte	.LVL748
+	.8byte	.LVL752
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL741
-	.8byte	.LVL743
+	.8byte	.LVL756
+	.8byte	.LVL758
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL745
-	.8byte	.LVL753
+	.8byte	.LVL765
+	.8byte	.LVL775
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL784
-	.8byte	.LVL802
+	.8byte	.LVL795
+	.8byte	.LVL813
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL819
-	.8byte	.LVL826
+	.8byte	.LVL834
+	.8byte	.LVL842
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL828
-	.8byte	.LVL832
+	.8byte	.LVL844
+	.8byte	.LVL848
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL834
-	.8byte	.LFE2820
+	.8byte	.LVL850
+	.8byte	.LFE2825
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
@@ -48700,7 +49488,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL251
-	.8byte	.LFE2818
+	.8byte	.LFE2823
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
@@ -48712,52 +49500,48 @@ __exitcall_ebc_exit:
 	.byte	0x71
 	.sleb128 -12
 	.8byte	.LVL247
-	.8byte	.LVL254
+	.8byte	.LVL252
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
-	.8byte	.LVL254
-	.8byte	.LVL257
+	.8byte	.LVL252
+	.8byte	.LVL255
 	.2byte	0x2
 	.byte	0x71
 	.sleb128 -12
-	.8byte	.LVL257
-	.8byte	.LFE2818
+	.8byte	.LVL255
+	.8byte	.LFE2823
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
 	.8byte	0
 	.8byte	0
-.LLST115:
-	.8byte	.LVL418
-	.8byte	.LVL419
+.LLST136:
+	.8byte	.LVL442
+	.8byte	.LVL443
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST114:
-	.8byte	.LVL395
-	.8byte	.LVL396
+.LLST135:
+	.8byte	.LVL424
+	.8byte	.LVL425
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL396
-	.8byte	.LVL400
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL401
-	.8byte	.LVL405
+	.8byte	.LVL425
+	.8byte	.LVL429
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL406
-	.8byte	.LVL409
+	.8byte	.LVL430
+	.8byte	.LVL434
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL410
-	.8byte	.LVL414
+	.8byte	.LVL435
+	.8byte	.LVL439
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL415
-	.8byte	.LFE2815
+	.8byte	.LVL440
+	.8byte	.LFE2820
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
@@ -48856,471 +49640,670 @@ __exitcall_ebc_exit:
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST152:
-	.8byte	.LVL665
-	.8byte	.LVL667
+.LLST173:
+	.8byte	.LVL687
+	.8byte	.LVL689
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST153:
-	.8byte	.LVL666
-	.8byte	.LVL669
+.LLST174:
+	.8byte	.LVL688
+	.8byte	.LVL691
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST154:
-	.8byte	.LVL669
-	.8byte	.LVL672
+.LLST175:
+	.8byte	.LVL691
+	.8byte	.LVL694
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL673
-	.8byte	.LVL676
+	.8byte	.LVL695
+	.8byte	.LVL698
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST148:
-	.8byte	.LVL654
-	.8byte	.LVL659
+.LLST169:
+	.8byte	.LVL676
+	.8byte	.LVL681
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL664
-	.8byte	.LFE2807
+	.8byte	.LVL686
+	.8byte	.LFE2808
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST149:
-	.8byte	.LVL660
-	.8byte	.LVL661
+.LLST170:
+	.8byte	.LVL682
+	.8byte	.LVL683
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST150:
-	.8byte	.LVL658
-	.8byte	.LVL662
+.LLST171:
+	.8byte	.LVL680
+	.8byte	.LVL684
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST151:
-	.8byte	.LVL661
-	.8byte	.LVL663
+.LLST172:
+	.8byte	.LVL683
+	.8byte	.LVL685
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST142:
-	.8byte	.LVL632
-	.8byte	.LVL638
+.LLST163:
+	.8byte	.LVL654
+	.8byte	.LVL660
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL642
-	.8byte	.LVL643
+	.8byte	.LVL664
+	.8byte	.LVL665
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL652
-	.8byte	.LVL653
+	.8byte	.LVL674
+	.8byte	.LVL675
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST143:
-	.8byte	.LVL632
-	.8byte	.LVL633
+.LLST164:
+	.8byte	.LVL654
+	.8byte	.LVL655
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST144:
-	.8byte	.LVL638
-	.8byte	.LVL641
+.LLST165:
+	.8byte	.LVL660
+	.8byte	.LVL663
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL645
-	.8byte	.LVL650
+	.8byte	.LVL667
+	.8byte	.LVL672
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL653
-	.8byte	.LFE2806
+	.8byte	.LVL675
+	.8byte	.LFE2807
+	.2byte	0x1
+	.byte	0x54
+	.8byte	0
+	.8byte	0
+.LLST166:
+	.8byte	.LVL659
+	.8byte	.LVL660
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL662
+	.8byte	.LVL666
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL671
+	.8byte	.LVL675
+	.2byte	0x1
+	.byte	0x59
+	.8byte	0
+	.8byte	0
+.LLST167:
+	.8byte	.LVL659
+	.8byte	.LVL661
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL662
+	.8byte	.LVL670
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL673
+	.8byte	.LFE2807
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST168:
+	.8byte	.LVL659
+	.8byte	.LVL668
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL669
+	.8byte	.LFE2807
+	.2byte	0x1
+	.byte	0x57
+	.8byte	0
+	.8byte	0
+.LLST95:
+	.8byte	.LVL320
+	.8byte	.LVL349
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL354
+	.8byte	.LVL357
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL360
+	.8byte	.LFE2814
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST96:
+	.8byte	.LVL320
+	.8byte	.LVL348
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL354
+	.8byte	.LVL357
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL360
+	.8byte	.LFE2814
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST97:
+	.8byte	.LVL320
+	.8byte	.LVL322
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL336
+	.8byte	.LVL338
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST98:
+	.8byte	.LVL321
+	.8byte	.LVL337
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	.LVL361
+	.8byte	.LFE2814
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	0
+	.8byte	0
+.LLST99:
+	.8byte	.LVL326
+	.8byte	.LVL336
+	.2byte	0x1
+	.byte	0x60
+	.8byte	.LVL361
+	.8byte	.LFE2814
+	.2byte	0x1
+	.byte	0x60
+	.8byte	0
+	.8byte	0
+.LLST100:
+	.8byte	.LVL327
+	.8byte	.LVL336
+	.2byte	0x1
+	.byte	0x5c
+	.8byte	.LVL361
+	.8byte	.LFE2814
+	.2byte	0x1
+	.byte	0x5c
+	.8byte	0
+	.8byte	0
+.LLST101:
+	.8byte	.LVL331
+	.8byte	.LVL333
 	.2byte	0x1
-	.byte	0x54
+	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST145:
-	.8byte	.LVL637
-	.8byte	.LVL638
+.LLST102:
+	.8byte	.LVL328
+	.8byte	.LVL329
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL640
-	.8byte	.LVL644
+	.byte	0x5a
+	.8byte	.LVL330
+	.8byte	.LVL334
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL649
-	.8byte	.LVL653
+	.byte	0x5a
+	.8byte	.LVL335
+	.8byte	.LVL336
 	.2byte	0x1
-	.byte	0x59
+	.byte	0x5a
+	.8byte	.LVL361
+	.8byte	.LFE2814
+	.2byte	0x1
+	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST146:
-	.8byte	.LVL637
-	.8byte	.LVL639
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL640
-	.8byte	.LVL648
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL651
-	.8byte	.LFE2806
+.LLST103:
+	.8byte	.LVL323
+	.8byte	.LVL324
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST147:
-	.8byte	.LVL637
-	.8byte	.LVL646
+.LLST104:
+	.8byte	.LVL325
+	.8byte	.LVL336
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL647
-	.8byte	.LFE2806
+	.8byte	.LVL361
+	.8byte	.LFE2814
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST95:
-	.8byte	.LVL319
-	.8byte	.LVL333
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL337
-	.8byte	.LVL340
+.LLST105:
+	.8byte	.LVL348
+	.8byte	.LVL350
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL343
-	.8byte	.LFE2848
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST106:
+	.8byte	.LVL349
+	.8byte	.LVL351
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST96:
-	.8byte	.LVL319
-	.8byte	.LVL334
+.LLST107:
+	.8byte	.LVL345
+	.8byte	.LVL346
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL337
-	.8byte	.LVL340
+	.byte	0x54
+	.8byte	.LVL347
+	.8byte	.LVL352
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL343
-	.8byte	.LFE2848
+	.byte	0x54
+	.8byte	.LVL353
+	.8byte	.LVL355
 	.2byte	0x1
-	.byte	0x52
-	.8byte	0
-	.8byte	0
-.LLST97:
-	.8byte	.LVL329
-	.8byte	.LVL331
+	.byte	0x54
+	.8byte	.LVL356
+	.8byte	.LVL358
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL359
+	.8byte	.LFE2814
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST98:
-	.8byte	.LVL330
-	.8byte	.LVL332
+.LLST108:
+	.8byte	.LVL338
+	.8byte	.LVL339
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST99:
-	.8byte	.LVL328
-	.8byte	.LVL337
+.LLST109:
+	.8byte	.LVL362
+	.8byte	.LVL394
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL395
+	.8byte	.LVL397
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL340
-	.8byte	.LVL343
+	.8byte	.LVL412
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST100:
-	.8byte	.LVL328
-	.8byte	.LVL337
+.LLST110:
+	.8byte	.LVL362
+	.8byte	.LVL398
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL340
-	.8byte	.LVL343
+	.8byte	.LVL412
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST101:
-	.8byte	.LVL325
-	.8byte	.LVL326
-	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL327
-	.8byte	.LVL335
-	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL336
-	.8byte	.LVL338
-	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL339
-	.8byte	.LVL341
+.LLST111:
+	.8byte	.LVL362
+	.8byte	.LVL364
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL342
-	.8byte	.LFE2848
+	.byte	0x53
+	.8byte	.LVL382
+	.8byte	.LVL383
 	.2byte	0x1
-	.byte	0x56
+	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST102:
-	.8byte	.LVL320
-	.8byte	.LVL321
+.LLST112:
+	.8byte	.LVL378
+	.8byte	.LVL382
 	.2byte	0x1
-	.byte	0x53
+	.byte	0x52
+	.8byte	.LVL393
+	.8byte	.LVL406
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL411
+	.8byte	.LFE2817
+	.2byte	0x1
+	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST103:
-	.8byte	.LVL344
-	.8byte	.LVL370
+.LLST113:
+	.8byte	.LVL378
+	.8byte	.LVL382
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL376
-	.8byte	.LVL377
+	.8byte	.LVL393
+	.8byte	.LVL394
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL378
-	.8byte	.LVL382
+	.8byte	.LVL395
+	.8byte	.LVL407
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL386
-	.8byte	.LFE2849
+	.8byte	.LVL411
+	.8byte	.LFE2817
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST104:
-	.8byte	.LVL344
-	.8byte	.LVL371
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL376
+.LLST114:
+	.8byte	.LVL378
 	.8byte	.LVL382
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL386
-	.8byte	.LFE2849
+	.byte	0x58
+	.8byte	.LVL391
+	.8byte	.LFE2817
 	.2byte	0x1
-	.byte	0x52
+	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST105:
-	.8byte	.LVL351
-	.8byte	.LVL364
+.LLST115:
+	.8byte	.LVL378
+	.8byte	.LVL382
 	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL369
-	.8byte	.LFE2849
+	.byte	0x59
+	.8byte	.LVL390
+	.8byte	.LFE2817
 	.2byte	0x1
-	.byte	0x54
+	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST106:
-	.8byte	.LVL355
-	.8byte	.LVL365
+.LLST116:
+	.8byte	.LVL378
+	.8byte	.LVL382
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL369
-	.8byte	.LVL372
+	.8byte	.LVL395
+	.8byte	.LVL396
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL376
-	.8byte	.LVL379
+	.8byte	.LVL412
+	.8byte	.LVL413
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL385
-	.8byte	.LFE2849
+	.8byte	.LVL414
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST107:
-	.8byte	.LVL351
-	.8byte	.LVL352
+.LLST117:
+	.8byte	.LVL378
+	.8byte	.LVL382
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL353
-	.8byte	.LVL354
+	.byte	0x5f
+	.8byte	.LVL388
+	.8byte	.LFE2817
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL371
-	.8byte	.LVL373
+	.byte	0x5f
+	.8byte	0
+	.8byte	0
+.LLST118:
+	.8byte	.LVL378
+	.8byte	.LVL382
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL374
-	.8byte	.LVL375
+	.byte	0x5b
+	.8byte	.LVL389
+	.8byte	.LFE2817
 	.2byte	0x1
-	.byte	0x56
+	.byte	0x5b
+	.8byte	0
+	.8byte	0
+.LLST119:
 	.8byte	.LVL378
-	.8byte	.LVL380
+	.8byte	.LVL382
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL381
-	.8byte	.LVL383
+	.byte	0x5c
+	.8byte	.LVL392
+	.8byte	.LFE2817
 	.2byte	0x1
-	.byte	0x56
+	.byte	0x5c
+	.8byte	0
+	.8byte	0
+.LLST120:
 	.8byte	.LVL384
-	.8byte	.LFE2849
+	.8byte	.LVL385
 	.2byte	0x1
-	.byte	0x56
+	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST108:
-	.8byte	.LVL345
-	.8byte	.LVL346
+.LLST121:
+	.8byte	.LVL378
+	.8byte	.LVL382
 	.2byte	0x1
-	.byte	0x53
+	.byte	0x57
+	.8byte	.LVL387
+	.8byte	.LFE2817
+	.2byte	0x1
+	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST109:
-	.8byte	.LVL356
-	.8byte	.LVL357
+.LLST122:
+	.8byte	.LVL378
+	.8byte	.LVL382
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL366
-	.8byte	.LVL376
+	.byte	0x56
+	.8byte	.LVL393
+	.8byte	.LVL399
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL382
-	.8byte	.LVL386
+	.byte	0x56
+	.8byte	.LVL408
+	.8byte	.LFE2817
 	.2byte	0x1
-	.byte	0x59
+	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST110:
-	.8byte	.LVL356
-	.8byte	.LVL360
+.LLST123:
+	.8byte	.LVL378
+	.8byte	.LVL382
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL361
-	.8byte	.LVL362
+	.8byte	.LVL393
+	.8byte	.LVL402
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL363
-	.8byte	.LVL367
+	.8byte	.LVL403
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL368
-	.8byte	.LVL376
+	.8byte	.LVL405
+	.8byte	.LVL409
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL382
-	.8byte	.LVL386
+	.8byte	.LVL410
+	.8byte	.LFE2817
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST111:
-	.8byte	.LVL356
-	.8byte	.LVL358
+.LLST124:
+	.8byte	.LVL378
+	.8byte	.LVL382
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL359
-	.8byte	.LVL362
+	.8byte	.LVL393
+	.8byte	.LVL400
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL363
-	.8byte	.LVL367
+	.8byte	.LVL401
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL368
-	.8byte	.LVL376
+	.8byte	.LVL405
+	.8byte	.LVL409
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL382
-	.8byte	.LVL386
+	.8byte	.LVL410
+	.8byte	.LFE2817
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST112:
-	.8byte	.LVL356
-	.8byte	.LVL358
+.LLST125:
+	.8byte	.LVL378
+	.8byte	.LVL382
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL359
-	.8byte	.LVL360
+	.8byte	.LVL393
+	.8byte	.LVL400
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL361
-	.8byte	.LVL367
+	.8byte	.LVL401
+	.8byte	.LVL402
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL368
-	.8byte	.LVL376
+	.8byte	.LVL403
+	.8byte	.LVL409
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL410
+	.8byte	.LFE2817
 	.2byte	0x1
 	.byte	0x62
+	.8byte	0
+	.8byte	0
+.LLST126:
+	.8byte	.LVL370
+	.8byte	.LVL371
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	.LVL372
+	.8byte	.LVL373
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	.LVL374
+	.8byte	.LVL375
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	.LVL376
+	.8byte	.LVL377
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	.LVL378
+	.8byte	.LVL382
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	0
+	.8byte	0
+.LLST127:
+	.8byte	.LVL368
+	.8byte	.LVL381
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	0
+	.8byte	0
+.LLST128:
+	.8byte	.LVL369
 	.8byte	.LVL382
+	.2byte	0x1
+	.byte	0x59
+	.8byte	0
+	.8byte	0
+.LLST129:
+	.8byte	.LVL363
 	.8byte	.LVL386
 	.2byte	0x1
-	.byte	0x62
+	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST113:
-	.8byte	.LVL387
-	.8byte	.LVL388
+.LLST130:
+	.8byte	.LVL365
+	.8byte	.LVL366
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	0
+	.8byte	0
+.LLST131:
+	.8byte	.LVL367
+	.8byte	.LVL382
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	0
+	.8byte	0
+.LLST132:
+	.8byte	.LVL370
+	.8byte	.LVL379
+	.2byte	0x1
+	.byte	0x66
+	.8byte	0
+	.8byte	0
+.LLST133:
+	.8byte	.LVL370
+	.8byte	.LVL380
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST134:
+	.8byte	.LVL416
+	.8byte	.LVL417
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL388
-	.8byte	.LVL393
+	.8byte	.LVL417
+	.8byte	.LVL422
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL394
-	.8byte	.LFE2850
+	.8byte	.LVL423
+	.8byte	.LFE2859
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST116:
-	.8byte	.LVL434
-	.8byte	.LVL436
+.LLST137:
+	.8byte	.LVL456
+	.8byte	.LVL458
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL436
-	.8byte	.LVL440
+	.8byte	.LVL458
+	.8byte	.LVL462
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL441
-	.8byte	.LVL444
+	.8byte	.LVL463
+	.8byte	.LVL466
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST117:
-	.8byte	.LVL434
-	.8byte	.LVL435
+.LLST138:
+	.8byte	.LVL456
+	.8byte	.LVL457
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST141:
-	.8byte	.LVL624
-	.8byte	.LVL625
+.LLST162:
+	.8byte	.LVL646
+	.8byte	.LVL647
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL625
-	.8byte	.LVL629
+	.8byte	.LVL647
+	.8byte	.LVL651
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL630
-	.8byte	.LFE2855
+	.8byte	.LVL652
+	.8byte	.LFE2864
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -49335,2754 +50318,2830 @@ __exitcall_ebc_exit:
 	.2byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0-.Ltext0
-	.8byte	.LFB2846
-	.8byte	.LFE2846-.LFB2846
-	.8byte	.LFB2845
-	.8byte	.LFE2845-.LFB2845
+	.8byte	.LFB2851
+	.8byte	.LFE2851-.LFB2851
+	.8byte	.LFB2850
+	.8byte	.LFE2850-.LFB2850
 	.8byte	0
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
 .Ldebug_ranges0:
-	.8byte	.LBB914
-	.8byte	.LBE914
-	.8byte	.LBB917
-	.8byte	.LBE917
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB918
-	.8byte	.LBE918
-	.8byte	.LBB949
-	.8byte	.LBE949
-	.8byte	.LBB950
-	.8byte	.LBE950
-	.8byte	.LBB1015
-	.8byte	.LBE1015
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB921
-	.8byte	.LBE921
+	.8byte	.LBB930
+	.8byte	.LBE930
 	.8byte	.LBB933
 	.8byte	.LBE933
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB934
 	.8byte	.LBE934
+	.8byte	.LBB965
+	.8byte	.LBE965
+	.8byte	.LBB966
+	.8byte	.LBE966
+	.8byte	.LBB1031
+	.8byte	.LBE1031
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB937
 	.8byte	.LBE937
-	.8byte	.LBB942
-	.8byte	.LBE942
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB951
-	.8byte	.LBE951
-	.8byte	.LBB1172
-	.8byte	.LBE1172
-	.8byte	.LBB1173
-	.8byte	.LBE1173
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB954
-	.8byte	.LBE954
-	.8byte	.LBB974
-	.8byte	.LBE974
-	.8byte	.LBB975
-	.8byte	.LBE975
+	.8byte	.LBB949
+	.8byte	.LBE949
+	.8byte	.LBB950
+	.8byte	.LBE950
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB968
-	.8byte	.LBE968
-	.8byte	.LBB973
-	.8byte	.LBE973
+	.8byte	.LBB953
+	.8byte	.LBE953
+	.8byte	.LBB958
+	.8byte	.LBE958
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB980
-	.8byte	.LBE980
-	.8byte	.LBB1183
-	.8byte	.LBE1183
-	.8byte	.LBB1185
-	.8byte	.LBE1185
-	.8byte	.LBB1186
-	.8byte	.LBE1186
+	.8byte	.LBB967
+	.8byte	.LBE967
+	.8byte	.LBB1188
+	.8byte	.LBE1188
+	.8byte	.LBB1189
+	.8byte	.LBE1189
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB986
-	.8byte	.LBE986
-	.8byte	.LBB1170
-	.8byte	.LBE1170
-	.8byte	.LBB1171
-	.8byte	.LBE1171
+	.8byte	.LBB970
+	.8byte	.LBE970
+	.8byte	.LBB990
+	.8byte	.LBE990
+	.8byte	.LBB991
+	.8byte	.LBE991
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB984
+	.8byte	.LBE984
 	.8byte	.LBB989
 	.8byte	.LBE989
-	.8byte	.LBB1009
-	.8byte	.LBE1009
-	.8byte	.LBB1010
-	.8byte	.LBE1010
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1003
-	.8byte	.LBE1003
-	.8byte	.LBB1008
-	.8byte	.LBE1008
+	.8byte	.LBB996
+	.8byte	.LBE996
+	.8byte	.LBB1199
+	.8byte	.LBE1199
+	.8byte	.LBB1201
+	.8byte	.LBE1201
+	.8byte	.LBB1202
+	.8byte	.LBE1202
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1002
+	.8byte	.LBE1002
+	.8byte	.LBB1186
+	.8byte	.LBE1186
+	.8byte	.LBB1187
+	.8byte	.LBE1187
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1016
-	.8byte	.LBE1016
-	.8byte	.LBB1049
-	.8byte	.LBE1049
-	.8byte	.LBB1180
-	.8byte	.LBE1180
-	.8byte	.LBB1181
-	.8byte	.LBE1181
+	.8byte	.LBB1005
+	.8byte	.LBE1005
+	.8byte	.LBB1025
+	.8byte	.LBE1025
+	.8byte	.LBB1026
+	.8byte	.LBE1026
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1019
 	.8byte	.LBE1019
+	.8byte	.LBB1024
+	.8byte	.LBE1024
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB1032
 	.8byte	.LBE1032
-	.8byte	.LBB1041
-	.8byte	.LBE1041
-	.8byte	.LBB1042
-	.8byte	.LBE1042
+	.8byte	.LBB1065
+	.8byte	.LBE1065
+	.8byte	.LBB1196
+	.8byte	.LBE1196
+	.8byte	.LBB1197
+	.8byte	.LBE1197
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1035
 	.8byte	.LBE1035
-	.8byte	.LBB1040
-	.8byte	.LBE1040
+	.8byte	.LBB1048
+	.8byte	.LBE1048
+	.8byte	.LBB1057
+	.8byte	.LBE1057
+	.8byte	.LBB1058
+	.8byte	.LBE1058
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1050
-	.8byte	.LBE1050
-	.8byte	.LBB1085
-	.8byte	.LBE1085
-	.8byte	.LBB1176
-	.8byte	.LBE1176
-	.8byte	.LBB1177
-	.8byte	.LBE1177
-	.8byte	.LBB1187
-	.8byte	.LBE1187
+	.8byte	.LBB1051
+	.8byte	.LBE1051
+	.8byte	.LBB1056
+	.8byte	.LBE1056
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1053
-	.8byte	.LBE1053
 	.8byte	.LBB1066
 	.8byte	.LBE1066
-	.8byte	.LBB1075
-	.8byte	.LBE1075
-	.8byte	.LBB1076
-	.8byte	.LBE1076
+	.8byte	.LBB1101
+	.8byte	.LBE1101
+	.8byte	.LBB1192
+	.8byte	.LBE1192
+	.8byte	.LBB1193
+	.8byte	.LBE1193
+	.8byte	.LBB1203
+	.8byte	.LBE1203
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1069
 	.8byte	.LBE1069
-	.8byte	.LBB1074
-	.8byte	.LBE1074
+	.8byte	.LBB1082
+	.8byte	.LBE1082
+	.8byte	.LBB1091
+	.8byte	.LBE1091
+	.8byte	.LBB1092
+	.8byte	.LBE1092
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1086
-	.8byte	.LBE1086
-	.8byte	.LBB1097
-	.8byte	.LBE1097
+	.8byte	.LBB1085
+	.8byte	.LBE1085
+	.8byte	.LBB1090
+	.8byte	.LBE1090
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1089
-	.8byte	.LBE1089
-	.8byte	.LBB1094
-	.8byte	.LBE1094
+	.8byte	.LBB1102
+	.8byte	.LBE1102
+	.8byte	.LBB1113
+	.8byte	.LBE1113
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1090
-	.8byte	.LBE1090
-	.8byte	.LBB1093
-	.8byte	.LBE1093
+	.8byte	.LBB1105
+	.8byte	.LBE1105
+	.8byte	.LBB1110
+	.8byte	.LBE1110
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1098
-	.8byte	.LBE1098
-	.8byte	.LBB1133
-	.8byte	.LBE1133
-	.8byte	.LBB1174
-	.8byte	.LBE1174
-	.8byte	.LBB1175
-	.8byte	.LBE1175
-	.8byte	.LBB1182
-	.8byte	.LBE1182
+	.8byte	.LBB1106
+	.8byte	.LBE1106
+	.8byte	.LBB1109
+	.8byte	.LBE1109
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1101
-	.8byte	.LBE1101
 	.8byte	.LBB1114
 	.8byte	.LBE1114
-	.8byte	.LBB1115
-	.8byte	.LBE1115
-	.8byte	.LBB1116
-	.8byte	.LBE1116
+	.8byte	.LBB1149
+	.8byte	.LBE1149
+	.8byte	.LBB1190
+	.8byte	.LBE1190
+	.8byte	.LBB1191
+	.8byte	.LBE1191
+	.8byte	.LBB1198
+	.8byte	.LBE1198
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1119
-	.8byte	.LBE1119
-	.8byte	.LBB1124
-	.8byte	.LBE1124
+	.8byte	.LBB1117
+	.8byte	.LBE1117
+	.8byte	.LBB1130
+	.8byte	.LBE1130
+	.8byte	.LBB1131
+	.8byte	.LBE1131
+	.8byte	.LBB1132
+	.8byte	.LBE1132
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1134
-	.8byte	.LBE1134
-	.8byte	.LBB1169
-	.8byte	.LBE1169
-	.8byte	.LBB1178
-	.8byte	.LBE1178
-	.8byte	.LBB1179
-	.8byte	.LBE1179
-	.8byte	.LBB1184
-	.8byte	.LBE1184
+	.8byte	.LBB1135
+	.8byte	.LBE1135
+	.8byte	.LBB1140
+	.8byte	.LBE1140
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1137
-	.8byte	.LBE1137
 	.8byte	.LBB1150
 	.8byte	.LBE1150
-	.8byte	.LBB1151
-	.8byte	.LBE1151
-	.8byte	.LBB1152
-	.8byte	.LBE1152
+	.8byte	.LBB1185
+	.8byte	.LBE1185
+	.8byte	.LBB1194
+	.8byte	.LBE1194
+	.8byte	.LBB1195
+	.8byte	.LBE1195
+	.8byte	.LBB1200
+	.8byte	.LBE1200
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1155
-	.8byte	.LBE1155
-	.8byte	.LBB1160
-	.8byte	.LBE1160
+	.8byte	.LBB1153
+	.8byte	.LBE1153
+	.8byte	.LBB1166
+	.8byte	.LBE1166
+	.8byte	.LBB1167
+	.8byte	.LBE1167
+	.8byte	.LBB1168
+	.8byte	.LBE1168
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1192
-	.8byte	.LBE1192
-	.8byte	.LBB1195
-	.8byte	.LBE1195
+	.8byte	.LBB1171
+	.8byte	.LBE1171
+	.8byte	.LBB1176
+	.8byte	.LBE1176
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1196
-	.8byte	.LBE1196
 	.8byte	.LBB1208
 	.8byte	.LBE1208
-	.8byte	.LBB1210
-	.8byte	.LBE1210
-	.8byte	.LBB1212
-	.8byte	.LBE1212
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1201
-	.8byte	.LBE1201
-	.8byte	.LBB1209
-	.8byte	.LBE1209
 	.8byte	.LBB1211
 	.8byte	.LBE1211
-	.8byte	.LBB1220
-	.8byte	.LBE1220
-	.8byte	.LBB1222
-	.8byte	.LBE1222
-	.8byte	.LBB1224
-	.8byte	.LBE1224
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1213
-	.8byte	.LBE1213
-	.8byte	.LBB1221
-	.8byte	.LBE1221
-	.8byte	.LBB1223
-	.8byte	.LBE1223
-	.8byte	.LBB1230
-	.8byte	.LBE1230
-	.8byte	.LBB1232
-	.8byte	.LBE1232
-	.8byte	.LBB1234
-	.8byte	.LBE1234
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1225
-	.8byte	.LBE1225
-	.8byte	.LBB1231
-	.8byte	.LBE1231
-	.8byte	.LBB1233
-	.8byte	.LBE1233
-	.8byte	.LBB1235
-	.8byte	.LBE1235
+	.8byte	.LBB1232
+	.8byte	.LBE1232
+	.8byte	.LBB1238
+	.8byte	.LBE1238
+	.8byte	.LBB1244
+	.8byte	.LBE1244
+	.8byte	.LBB1246
+	.8byte	.LBE1246
+	.8byte	.LBB1248
+	.8byte	.LBE1248
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1236
-	.8byte	.LBE1236
+	.8byte	.LBB1239
+	.8byte	.LBE1239
 	.8byte	.LBB1245
 	.8byte	.LBE1245
+	.8byte	.LBB1247
+	.8byte	.LBE1247
+	.8byte	.LBB1249
+	.8byte	.LBE1249
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1246
-	.8byte	.LBE1246
-	.8byte	.LBB1255
-	.8byte	.LBE1255
-	.8byte	.LBB1256
-	.8byte	.LBE1256
-	.8byte	.LBB1267
-	.8byte	.LBE1267
+	.8byte	.LBB1250
+	.8byte	.LBE1250
+	.8byte	.LBB1297
+	.8byte	.LBE1297
+	.8byte	.LBB1298
+	.8byte	.LBE1298
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1248
-	.8byte	.LBE1248
-	.8byte	.LBB1251
-	.8byte	.LBE1251
+	.8byte	.LBB1253
+	.8byte	.LBE1253
+	.8byte	.LBB1265
+	.8byte	.LBE1265
+	.8byte	.LBB1267
+	.8byte	.LBE1267
+	.8byte	.LBB1269
+	.8byte	.LBE1269
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1257
-	.8byte	.LBE1257
-	.8byte	.LBB1261
-	.8byte	.LBE1261
-	.8byte	.LBB1262
-	.8byte	.LBE1262
+	.8byte	.LBB1258
+	.8byte	.LBE1258
+	.8byte	.LBB1266
+	.8byte	.LBE1266
+	.8byte	.LBB1268
+	.8byte	.LBE1268
+	.8byte	.LBB1277
+	.8byte	.LBE1277
+	.8byte	.LBB1279
+	.8byte	.LBE1279
+	.8byte	.LBB1281
+	.8byte	.LBE1281
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1276
-	.8byte	.LBE1276
-	.8byte	.LBB1283
-	.8byte	.LBE1283
-	.8byte	.LBB1284
-	.8byte	.LBE1284
+	.8byte	.LBB1270
+	.8byte	.LBE1270
+	.8byte	.LBB1278
+	.8byte	.LBE1278
+	.8byte	.LBB1280
+	.8byte	.LBE1280
+	.8byte	.LBB1287
+	.8byte	.LBE1287
+	.8byte	.LBB1289
+	.8byte	.LBE1289
+	.8byte	.LBB1291
+	.8byte	.LBE1291
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1277
-	.8byte	.LBE1277
 	.8byte	.LBB1282
 	.8byte	.LBE1282
+	.8byte	.LBB1288
+	.8byte	.LBE1288
+	.8byte	.LBB1290
+	.8byte	.LBE1290
+	.8byte	.LBB1292
+	.8byte	.LBE1292
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1317
+	.8byte	.LBE1317
+	.8byte	.LBB1356
+	.8byte	.LBE1356
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1320
+	.8byte	.LBE1320
+	.8byte	.LBB1329
+	.8byte	.LBE1329
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1334
+	.8byte	.LBE1334
+	.8byte	.LBB1347
+	.8byte	.LBE1347
+	.8byte	.LBB1349
+	.8byte	.LBE1349
+	.8byte	.LBB1351
+	.8byte	.LBE1351
+	.8byte	.LBB1353
+	.8byte	.LBE1353
+	.8byte	.LBB1355
+	.8byte	.LBE1355
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1341
+	.8byte	.LBE1341
+	.8byte	.LBB1348
+	.8byte	.LBE1348
+	.8byte	.LBB1350
+	.8byte	.LBE1350
+	.8byte	.LBB1352
+	.8byte	.LBE1352
+	.8byte	.LBB1354
+	.8byte	.LBE1354
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1357
+	.8byte	.LBE1357
+	.8byte	.LBB1366
+	.8byte	.LBE1366
+	.8byte	.LBB1367
+	.8byte	.LBE1367
+	.8byte	.LBB1378
+	.8byte	.LBE1378
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1359
+	.8byte	.LBE1359
+	.8byte	.LBB1362
+	.8byte	.LBE1362
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1368
+	.8byte	.LBE1368
+	.8byte	.LBB1372
+	.8byte	.LBE1372
+	.8byte	.LBB1373
+	.8byte	.LBE1373
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1385
+	.8byte	.LBE1385
+	.8byte	.LBB1392
+	.8byte	.LBE1392
+	.8byte	.LBB1393
+	.8byte	.LBE1393
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1386
+	.8byte	.LBE1386
+	.8byte	.LBB1391
+	.8byte	.LBE1391
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1446
-	.8byte	.LBE1446
-	.8byte	.LBB1449
-	.8byte	.LBE1449
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1456
-	.8byte	.LBE1456
 	.8byte	.LBB1555
 	.8byte	.LBE1555
-	.8byte	.LBB1556
-	.8byte	.LBE1556
-	.8byte	.LBB1557
-	.8byte	.LBE1557
-	.8byte	.LBB1594
-	.8byte	.LBE1594
+	.8byte	.LBB1558
+	.8byte	.LBE1558
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1565
+	.8byte	.LBE1565
+	.8byte	.LBB1664
+	.8byte	.LBE1664
+	.8byte	.LBB1665
+	.8byte	.LBE1665
+	.8byte	.LBB1666
+	.8byte	.LBE1666
+	.8byte	.LBB1703
+	.8byte	.LBE1703
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1567
+	.8byte	.LBE1567
+	.8byte	.LBB1576
+	.8byte	.LBE1576
+	.8byte	.LBB1577
+	.8byte	.LBE1577
+	.8byte	.LBB1578
+	.8byte	.LBE1578
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1458
-	.8byte	.LBE1458
-	.8byte	.LBB1467
-	.8byte	.LBE1467
-	.8byte	.LBB1468
-	.8byte	.LBE1468
-	.8byte	.LBB1469
-	.8byte	.LBE1469
+	.8byte	.LBB1624
+	.8byte	.LBE1624
+	.8byte	.LBB1658
+	.8byte	.LBE1658
+	.8byte	.LBB1659
+	.8byte	.LBE1659
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1515
-	.8byte	.LBE1515
-	.8byte	.LBB1549
-	.8byte	.LBE1549
-	.8byte	.LBB1550
-	.8byte	.LBE1550
+	.8byte	.LBB1631
+	.8byte	.LBE1631
+	.8byte	.LBB1656
+	.8byte	.LBE1656
+	.8byte	.LBB1657
+	.8byte	.LBE1657
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1522
-	.8byte	.LBE1522
-	.8byte	.LBB1547
-	.8byte	.LBE1547
-	.8byte	.LBB1548
-	.8byte	.LBE1548
+	.8byte	.LBB1638
+	.8byte	.LBE1638
+	.8byte	.LBB1654
+	.8byte	.LBE1654
+	.8byte	.LBB1655
+	.8byte	.LBE1655
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1529
-	.8byte	.LBE1529
-	.8byte	.LBB1545
-	.8byte	.LBE1545
-	.8byte	.LBB1546
-	.8byte	.LBE1546
+	.8byte	.LBB1645
+	.8byte	.LBE1645
+	.8byte	.LBB1652
+	.8byte	.LBE1652
+	.8byte	.LBB1653
+	.8byte	.LBE1653
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1536
-	.8byte	.LBE1536
-	.8byte	.LBB1543
-	.8byte	.LBE1543
-	.8byte	.LBB1544
-	.8byte	.LBE1544
+	.8byte	.LBB1667
+	.8byte	.LBE1667
+	.8byte	.LBB1692
+	.8byte	.LBE1692
+	.8byte	.LBB1693
+	.8byte	.LBE1693
+	.8byte	.LBB1702
+	.8byte	.LBE1702
+	.8byte	.LBB1753
+	.8byte	.LBE1753
+	.8byte	.LBB1758
+	.8byte	.LBE1758
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1558
-	.8byte	.LBE1558
-	.8byte	.LBB1583
-	.8byte	.LBE1583
-	.8byte	.LBB1584
-	.8byte	.LBE1584
-	.8byte	.LBB1593
-	.8byte	.LBE1593
-	.8byte	.LBB1644
-	.8byte	.LBE1644
-	.8byte	.LBB1649
-	.8byte	.LBE1649
+	.8byte	.LBB1669
+	.8byte	.LBE1669
+	.8byte	.LBB1672
+	.8byte	.LBE1672
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1560
-	.8byte	.LBE1560
-	.8byte	.LBB1563
-	.8byte	.LBE1563
+	.8byte	.LBB1673
+	.8byte	.LBE1673
+	.8byte	.LBB1678
+	.8byte	.LBE1678
+	.8byte	.LBB1679
+	.8byte	.LBE1679
+	.8byte	.LBB1680
+	.8byte	.LBE1680
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1564
-	.8byte	.LBE1564
-	.8byte	.LBB1569
-	.8byte	.LBE1569
-	.8byte	.LBB1570
-	.8byte	.LBE1570
-	.8byte	.LBB1571
-	.8byte	.LBE1571
+	.8byte	.LBB1694
+	.8byte	.LBE1694
+	.8byte	.LBB1704
+	.8byte	.LBE1704
+	.8byte	.LBB1755
+	.8byte	.LBE1755
+	.8byte	.LBB1759
+	.8byte	.LBE1759
+	.8byte	.LBB1760
+	.8byte	.LBE1760
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1585
-	.8byte	.LBE1585
-	.8byte	.LBB1595
-	.8byte	.LBE1595
-	.8byte	.LBB1646
-	.8byte	.LBE1646
-	.8byte	.LBB1650
-	.8byte	.LBE1650
-	.8byte	.LBB1651
-	.8byte	.LBE1651
+	.8byte	.LBB1705
+	.8byte	.LBE1705
+	.8byte	.LBB1756
+	.8byte	.LBE1756
+	.8byte	.LBB1757
+	.8byte	.LBE1757
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1596
-	.8byte	.LBE1596
-	.8byte	.LBB1647
-	.8byte	.LBE1647
-	.8byte	.LBB1648
-	.8byte	.LBE1648
+	.8byte	.LBB1707
+	.8byte	.LBE1707
+	.8byte	.LBB1713
+	.8byte	.LBE1713
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1598
-	.8byte	.LBE1598
-	.8byte	.LBB1604
-	.8byte	.LBE1604
+	.8byte	.LBB1716
+	.8byte	.LBE1716
+	.8byte	.LBB1717
+	.8byte	.LBE1717
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1607
-	.8byte	.LBE1607
-	.8byte	.LBB1608
-	.8byte	.LBE1608
+	.8byte	.LBB1724
+	.8byte	.LBE1724
+	.8byte	.LBB1730
+	.8byte	.LBE1730
+	.8byte	.LBB1731
+	.8byte	.LBE1731
+	.8byte	.LBB1732
+	.8byte	.LBE1732
+	.8byte	.LBB1733
+	.8byte	.LBE1733
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1615
-	.8byte	.LBE1615
-	.8byte	.LBB1621
-	.8byte	.LBE1621
-	.8byte	.LBB1622
-	.8byte	.LBE1622
-	.8byte	.LBB1623
-	.8byte	.LBE1623
-	.8byte	.LBB1624
-	.8byte	.LBE1624
+	.8byte	.LBB1734
+	.8byte	.LBE1734
+	.8byte	.LBB1752
+	.8byte	.LBE1752
+	.8byte	.LBB1754
+	.8byte	.LBE1754
+	.8byte	.LBB1761
+	.8byte	.LBE1761
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1625
-	.8byte	.LBE1625
-	.8byte	.LBB1643
-	.8byte	.LBE1643
-	.8byte	.LBB1645
-	.8byte	.LBE1645
-	.8byte	.LBB1652
-	.8byte	.LBE1652
+	.8byte	.LBB1790
+	.8byte	.LBE1790
+	.8byte	.LBB1797
+	.8byte	.LBE1797
+	.8byte	.LBB1798
+	.8byte	.LBE1798
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1682
-	.8byte	.LBE1682
-	.8byte	.LBB1689
-	.8byte	.LBE1689
-	.8byte	.LBB1690
-	.8byte	.LBE1690
+	.8byte	.LBB1792
+	.8byte	.LBE1792
+	.8byte	.LBB1793
+	.8byte	.LBE1793
+	.8byte	.LBB1794
+	.8byte	.LBE1794
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1684
-	.8byte	.LBE1684
-	.8byte	.LBB1685
-	.8byte	.LBE1685
-	.8byte	.LBB1686
-	.8byte	.LBE1686
+	.8byte	.LBB1799
+	.8byte	.LBE1799
+	.8byte	.LBB1803
+	.8byte	.LBE1803
+	.8byte	.LBB1804
+	.8byte	.LBE1804
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1696
-	.8byte	.LBE1696
-	.8byte	.LBB1707
-	.8byte	.LBE1707
+	.8byte	.LBB1810
+	.8byte	.LBE1810
+	.8byte	.LBB1826
+	.8byte	.LBE1826
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1698
-	.8byte	.LBE1698
-	.8byte	.LBB1699
-	.8byte	.LBE1699
+	.8byte	.LBB1812
+	.8byte	.LBE1812
+	.8byte	.LBB1813
+	.8byte	.LBE1813
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1703
-	.8byte	.LBE1703
-	.8byte	.LBB1715
-	.8byte	.LBE1715
+	.8byte	.LBB1814
+	.8byte	.LBE1814
+	.8byte	.LBB1827
+	.8byte	.LBE1827
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1705
-	.8byte	.LBE1705
-	.8byte	.LBB1706
-	.8byte	.LBE1706
+	.8byte	.LBB1816
+	.8byte	.LBE1816
+	.8byte	.LBB1817
+	.8byte	.LBE1817
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1708
-	.8byte	.LBE1708
-	.8byte	.LBB1713
-	.8byte	.LBE1713
-	.8byte	.LBB1714
-	.8byte	.LBE1714
-	.8byte	.LBB1716
-	.8byte	.LBE1716
+	.8byte	.LBB1818
+	.8byte	.LBE1818
+	.8byte	.LBB1824
+	.8byte	.LBE1824
+	.8byte	.LBB1825
+	.8byte	.LBE1825
+	.8byte	.LBB1828
+	.8byte	.LBE1828
+	.8byte	.LBB1829
+	.8byte	.LBE1829
 	.8byte	0
 	.8byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0
-	.8byte	.LFB2846
-	.8byte	.LFE2846
-	.8byte	.LFB2845
-	.8byte	.LFE2845
+	.8byte	.LFB2851
+	.8byte	.LFE2851
+	.8byte	.LFB2850
+	.8byte	.LFE2850
 	.8byte	0
 	.8byte	0
 	.section	.debug_line,"",@progbits
 .Ldebug_line0:
 	.section	.debug_str,"MS",@progbits,1
-.LASF908:
+.LASF910:
 	.string	"sival_int"
-.LASF2623:
+.LASF2625:
 	.string	"PE_SIZE_PTE"
-.LASF2366:
+.LASF2368:
 	.string	"device_attribute"
 .LASF169:
 	.string	"line"
-.LASF1850:
+.LASF1852:
 	.string	"link"
-.LASF658:
+.LASF660:
 	.string	"start_time"
-.LASF2098:
+.LASF2100:
 	.string	"kernfs_node"
-.LASF2242:
+.LASF2244:
 	.string	"RPM_REQ_IDLE"
-.LASF2378:
+.LASF2380:
 	.string	"suppliers"
-.LASF3037:
+.LASF3041:
 	.string	"ebc_buffer_manage_init"
-.LASF2877:
+.LASF2879:
 	.string	"EPD_FULL_GCC16"
 .LASF37:
 	.string	"dev_t"
-.LASF1970:
+.LASF1972:
 	.string	"show_options2"
-.LASF2625:
+.LASF2627:
 	.string	"PE_SIZE_PUD"
-.LASF2588:
+.LASF2590:
 	.string	"__tracepoint_page_ref_mod"
-.LASF2965:
+.LASF2969:
 	.string	"full_mode_num"
-.LASF1040:
+.LASF1042:
 	.string	"nr_wakeups"
-.LASF1878:
+.LASF1880:
 	.string	"start"
-.LASF1336:
+.LASF1338:
 	.string	"start_brk"
 .LASF99:
 	.string	"read"
-.LASF1677:
+.LASF1679:
 	.string	"d_ino_softlimit"
-.LASF1966:
+.LASF1968:
 	.string	"copy_mnt_data"
-.LASF1777:
+.LASF1779:
 	.string	"WRITE_LIFE_LONG"
-.LASF2312:
+.LASF2314:
 	.string	"dev_pm_qos"
-.LASF1199:
+.LASF1201:
 	.string	"UTASK_RUNNING"
 .LASF164:
 	.string	"hex_asc"
-.LASF1065:
+.LASF1067:
 	.string	"watchdog_stamp"
-.LASF2835:
+.LASF2837:
 	.string	"WAKE_LOCK_TYPE_COUNT"
-.LASF2711:
+.LASF2713:
 	.string	"Elf64_Word"
-.LASF860:
+.LASF862:
 	.string	"PCPU_FC_PAGE"
-.LASF2155:
+.LASF2157:
 	.string	"kset_uevent_ops"
-.LASF368:
+.LASF370:
 	.string	"__cpu_present_mask"
-.LASF1446:
+.LASF1448:
 	.string	"zone_padding"
 .LASF181:
 	.string	"TT_NONE"
-.LASF1665:
+.LASF1667:
 	.string	"acquire_dquot"
-.LASF2210:
+.LASF2212:
 	.string	"coherent_dma_mask"
-.LASF2358:
+.LASF2360:
 	.string	"dev_kobj"
-.LASF472:
+.LASF474:
 	.string	"d_release"
-.LASF3145:
+.LASF3150:
 	.string	"get_arch_dma_ops"
 .LASF304:
 	.string	"__ctors_start"
-.LASF575:
+.LASF577:
 	.string	"state"
-.LASF521:
+.LASF523:
 	.string	"s_d_op"
-.LASF2955:
+.LASF2959:
 	.string	"ebc_buffer_vir"
-.LASF906:
+.LASF908:
 	.string	"node_states"
-.LASF2899:
+.LASF2903:
 	.string	"pmic_power_req"
-.LASF898:
+.LASF900:
 	.string	"hrtimer_resolution"
 .LASF255:
 	.string	"FTR_HIGHER_OR_ZERO_SAFE"
-.LASF1084:
+.LASF1086:
 	.string	"need_qs"
 .LASF136:
 	.string	"panic_notifier_list"
-.LASF1562:
+.LASF1564:
 	.string	"compact_defer_shift"
 .LASF258:
 	.string	"visible"
 .LASF51:
 	.string	"blkcnt_t"
-.LASF1130:
+.LASF1132:
 	.string	"icq_tree"
-.LASF943:
+.LASF945:
 	.string	"si_code"
-.LASF646:
+.LASF648:
 	.string	"thread_node"
-.LASF3087:
+.LASF3088:
 	.string	"temperature"
-.LASF1299:
+.LASF1301:
 	.string	"map_pages"
-.LASF542:
+.LASF544:
 	.string	"vfsmount"
-.LASF2228:
+.LASF2230:
 	.string	"iommu_fwspec"
-.LASF342:
+.LASF344:
 	.string	"tp2_value"
-.LASF2450:
+.LASF2452:
 	.string	"nargs"
-.LASF1539:
+.LASF1541:
 	.string	"vm_node_stat_diff"
-.LASF1159:
+.LASF1161:
 	.string	"attributes"
-.LASF2016:
+.LASF2018:
 	.string	"fs_kobj"
-.LASF2549:
+.LASF2551:
 	.string	"TASKLET_SOFTIRQ"
-.LASF1417:
+.LASF1419:
 	.string	"inodes_stat"
 .LASF251:
 	.string	"ftr_type"
-.LASF648:
+.LASF650:
 	.string	"set_child_tid"
-.LASF914:
+.LASF916:
 	.string	"_overrun"
 .LASF158:
 	.string	"system_state"
-.LASF822:
+.LASF824:
 	.string	"system_wq"
-.LASF601:
+.LASF603:
 	.string	"rcu_read_lock_nesting"
-.LASF2983:
+.LASF2987:
 	.string	"suspend_lock"
-.LASF2527:
+.LASF2529:
 	.string	"gpio_desc"
-.LASF959:
+.LASF961:
 	.string	"list"
-.LASF3162:
+.LASF3167:
 	.string	"_copy_from_user"
-.LASF3188:
+.LASF3193:
 	.string	"get_order"
-.LASF942:
+.LASF944:
 	.string	"si_errno"
-.LASF531:
+.LASF533:
 	.string	"s_inode_lru"
-.LASF2688:
+.LASF2690:
 	.string	"sysctl_stat_interval"
-.LASF1123:
+.LASF1125:
 	.string	"blk_plug"
-.LASF2783:
+.LASF2785:
 	.string	"modules_disabled"
-.LASF2641:
+.LASF2643:
 	.string	"PGSCAN_SKIP_DMA32"
-.LASF544:
+.LASF546:
 	.string	"sysctl_vfs_cache_pressure"
-.LASF2627:
+.LASF2629:
 	.string	"compound_page_dtor"
-.LASF830:
+.LASF832:
 	.string	"refs"
-.LASF1761:
+.LASF1763:
 	.string	"trace_events"
-.LASF1340:
+.LASF1342:
 	.string	"env_start"
-.LASF2908:
+.LASF2912:
 	.string	"DMA_FROM_DEVICE"
-.LASF753:
+.LASF755:
 	.string	"cpu_number"
-.LASF401:
+.LASF403:
 	.string	"d_flags"
-.LASF1310:
+.LASF1312:
 	.string	"mm_rb"
-.LASF2184:
+.LASF2186:
 	.string	"freeze_late"
-.LASF3056:
+.LASF3060:
 	.string	"buf_info"
-.LASF406:
+.LASF408:
 	.string	"d_inode"
-.LASF1829:
+.LASF1831:
 	.string	"hd_struct"
-.LASF1200:
+.LASF1202:
 	.string	"UTASK_SSTEP"
-.LASF636:
+.LASF638:
 	.string	"real_parent"
 .LASF217:
 	.string	"locked"
 .LASF72:
 	.string	"exitcall_t"
-.LASF2940:
+.LASF2944:
 	.string	"regs"
-.LASF1034:
+.LASF1036:
 	.string	"slice_max"
-.LASF669:
+.LASF671:
 	.string	"last_switch_count"
-.LASF2166:
+.LASF2168:
 	.string	"n_node"
-.LASF1621:
+.LASF1623:
 	.string	"qsize_t"
-.LASF3185:
+.LASF3190:
 	.string	"devm_kzalloc"
-.LASF377:
+.LASF379:
 	.string	"sequence"
-.LASF2528:
+.LASF2530:
 	.string	"i2c_adapter_quirks"
-.LASF671:
+.LASF673:
 	.string	"files"
-.LASF1360:
+.LASF1362:
 	.string	"file_caps_enabled"
-.LASF1910:
+.LASF1912:
 	.string	"lock_manager_operations"
-.LASF1699:
+.LASF1701:
 	.string	"s_state"
-.LASF1063:
+.LASF1065:
 	.string	"run_list"
-.LASF2550:
+.LASF3109:
+	.string	"clac_full_data_align8"
+.LASF2552:
 	.string	"SCHED_SOFTIRQ"
-.LASF1927:
+.LASF1929:
 	.string	"fa_lock"
-.LASF2771:
+.LASF2773:
 	.string	"mov0"
-.LASF2772:
+.LASF2774:
 	.string	"mov1"
-.LASF2773:
+.LASF2775:
 	.string	"mov2"
-.LASF2801:
+.LASF2803:
 	.string	"module_sect_attrs"
-.LASF1868:
+.LASF1870:
 	.string	"flc_lock"
-.LASF1208:
+.LASF1210:
 	.string	"return_instance"
-.LASF2752:
+.LASF2754:
 	.string	"param_ops_uint"
-.LASF888:
+.LASF890:
 	.string	"softirq_activated"
-.LASF3021:
+.LASF3025:
 	.string	"pdev"
-.LASF824:
+.LASF826:
 	.string	"system_long_wq"
 .LASF156:
 	.string	"SYSTEM_RESTART"
-.LASF2255:
+.LASF2257:
 	.string	"is_prepared"
-.LASF2015:
+.LASF2017:
 	.string	"uevent_suppress"
-.LASF1515:
+.LASF1517:
 	.string	"node_id"
-.LASF1583:
+.LASF1585:
 	.string	"contig_page_data"
-.LASF2291:
+.LASF2293:
 	.string	"autosuspend_delay"
 .LASF3:
 	.string	"unsigned int"
-.LASF926:
+.LASF928:
 	.string	"_addr_bnd"
 .LASF160:
 	.string	"c_true"
-.LASF1575:
+.LASF1577:
 	.string	"notifier_call"
-.LASF3063:
+.LASF3067:
 	.string	"ebc_exit"
-.LASF1830:
+.LASF1832:
 	.string	"gendisk"
-.LASF1690:
+.LASF1692:
 	.string	"spc_timelimit"
-.LASF509:
+.LASF511:
 	.string	"s_instances"
-.LASF2733:
+.LASF2735:
 	.string	"sh_size"
-.LASF769:
+.LASF771:
 	.string	"desc"
-.LASF376:
+.LASF378:
 	.string	"seqcount"
-.LASF317:
+.LASF319:
 	.string	"__hyp_idmap_text_start"
-.LASF402:
+.LASF404:
 	.string	"d_seq"
-.LASF968:
+.LASF970:
 	.string	"rb_subtree_gap"
-.LASF1540:
+.LASF1542:
 	.string	"zone_type"
 .LASF46:
 	.string	"size_t"
 .LASF208:
 	.string	"compat_elf_hwcap"
-.LASF3257:
+.LASF3262:
 	.string	"prepare_to_wait_event"
-.LASF1107:
+.LASF1109:
 	.string	"cap_permitted"
 .LASF182:
 	.string	"TT_NATIVE"
-.LASF1549:
+.LASF1551:
 	.string	"zone_pgdat"
-.LASF546:
+.LASF548:
 	.string	"pid_type"
-.LASF1685:
+.LASF1687:
 	.string	"d_rt_spc_softlimit"
 .LASF41:
 	.string	"bool"
-.LASF2694:
+.LASF2696:
 	.string	"min_free_kbytes"
-.LASF369:
+.LASF371:
 	.string	"__cpu_active_mask"
-.LASF2399:
+.LASF2401:
 	.string	"map_page"
-.LASF607:
+.LASF609:
 	.string	"rcu_tasks_idx"
-.LASF606:
+.LASF608:
 	.string	"rcu_tasks_holdout"
-.LASF1276:
+.LASF1278:
 	.string	"f_count"
-.LASF1766:
+.LASF1768:
 	.string	"target_list"
-.LASF1382:
+.LASF1384:
 	.string	"RCU_BH_SYNC"
 .LASF283:
 	.string	"__init_end"
-.LASF1568:
+.LASF1570:
 	.string	"zoneref"
-.LASF2790:
+.LASF2792:
 	.string	"module_layout"
-.LASF524:
+.LASF526:
 	.string	"s_remove_count"
 .LASF216:
 	.string	"__reserved"
-.LASF937:
+.LASF939:
 	.string	"_sigfault"
-.LASF3116:
+.LASF3121:
 	.string	"image_bg"
-.LASF2855:
+.LASF3017:
+	.string	"__addressable_ebc_init2261"
+.LASF2857:
 	.string	"ebc_buf_status"
-.LASF1804:
+.LASF1806:
 	.string	"empty_aops"
 .LASF86:
 	.string	"atomic_long_t"
-.LASF2108:
+.LASF2110:
 	.string	"prealloc"
-.LASF1302:
+.LASF1304:
 	.string	"pfn_mkwrite"
 .LASF69:
 	.string	"callback_head"
-.LASF339:
+.LASF341:
 	.string	"perf_event"
-.LASF1285:
+.LASF1287:
 	.string	"f_security"
-.LASF449:
+.LASF451:
 	.string	"i_sb_list"
-.LASF2494:
+.LASF2496:
 	.string	"detected"
-.LASF772:
+.LASF774:
 	.string	"read_cntpct_el0"
-.LASF1318:
+.LASF1320:
 	.string	"pgtables_bytes"
-.LASF1844:
+.LASF1846:
 	.string	"get_link"
 .LASF54:
 	.string	"fmode_t"
-.LASF2221:
+.LASF2223:
 	.string	"devt"
-.LASF945:
+.LASF947:
 	.string	"siginfo_t"
-.LASF2181:
+.LASF2183:
 	.string	"restore"
-.LASF1395:
+.LASF1397:
 	.string	"delayed_call"
-.LASF917:
+.LASF919:
 	.string	"_status"
-.LASF2897:
+.LASF2901:
 	.string	"pmic_name"
-.LASF1461:
+.LASF1463:
 	.string	"NR_FREE_CMA_PAGES"
-.LASF2425:
+.LASF2427:
 	.string	"kernel_ulong_t"
-.LASF2208:
+.LASF2210:
 	.string	"dma_ops"
-.LASF2137:
+.LASF2139:
 	.string	"bin_attribute"
-.LASF1600:
+.LASF1602:
 	.string	"percpu_counter"
-.LASF2985:
+.LASF2989:
 	.string	"first_in"
-.LASF2326:
+.LASF2328:
 	.string	"dev_groups"
-.LASF2947:
+.LASF2951:
 	.string	"image_addr_set"
 .LASF300:
 	.string	"__softirqentry_text_start"
-.LASF318:
+.LASF320:
 	.string	"__hyp_idmap_text_end"
-.LASF630:
+.LASF632:
 	.string	"memcg_kmem_skip_account"
-.LASF2372:
+.LASF2374:
 	.string	"dl_dev_state"
-.LASF893:
+.LASF895:
 	.string	"expires_next"
-.LASF2085:
+.LASF2087:
 	.string	"ida_bitmap"
-.LASF443:
+.LASF445:
 	.string	"i_io_list"
-.LASF1926:
+.LASF1928:
 	.string	"fasync_struct"
-.LASF2287:
+.LASF2289:
 	.string	"links_count"
-.LASF2631:
+.LASF2633:
 	.string	"PGPGOUT"
-.LASF1659:
+.LASF1661:
 	.string	"release_dqblk"
 .LASF187:
 	.string	"uaddr2"
 .LASF30:
 	.string	"__kernel_timer_t"
-.LASF1751:
+.LASF1753:
 	.string	"notes_attrs"
-.LASF2481:
+.LASF2483:
 	.string	"irqchip_fwnode_ops"
-.LASF1611:
+.LASF1613:
 	.string	"dq_id"
-.LASF3108:
+.LASF3113:
 	.string	"frame_count_tmp"
-.LASF3115:
+.LASF3120:
 	.string	"image_fb"
-.LASF1786:
+.LASF1788:
 	.string	"write_end"
-.LASF1496:
+.LASF1498:
 	.string	"NR_ION_HEAP_POOL"
-.LASF1421:
+.LASF1423:
 	.string	"sysctl_protected_hardlinks"
-.LASF3261:
+.LASF3266:
 	.string	"__arch_copy_from_user"
-.LASF1174:
+.LASF1176:
 	.string	"scan_objects"
-.LASF1550:
+.LASF1552:
 	.string	"pageset"
-.LASF1235:
+.LASF1237:
 	.string	"wb_err"
-.LASF3159:
+.LASF3164:
 	.string	"copy_to_user"
-.LASF732:
+.LASF734:
 	.string	"trace_recursion"
-.LASF1334:
+.LASF1336:
 	.string	"start_data"
-.LASF1780:
+.LASF1782:
 	.string	"writepage"
-.LASF2010:
+.LASF2012:
 	.string	"kref"
-.LASF1111:
+.LASF1113:
 	.string	"jit_keyring"
 .LASF168:
 	.string	"file_disp"
-.LASF2962:
+.LASF2966:
 	.string	"auto_need_refresh"
-.LASF2843:
+.LASF2845:
 	.string	"WF_TYPE_GRAY2"
-.LASF1087:
+.LASF1089:
 	.string	"rcu_special"
-.LASF649:
+.LASF651:
 	.string	"clear_child_tid"
-.LASF696:
+.LASF698:
 	.string	"backing_dev_info"
-.LASF2546:
+.LASF2548:
 	.string	"NET_RX_SOFTIRQ"
-.LASF808:
+.LASF810:
 	.string	"__WORK_OFFQ_CANCELING"
-.LASF534:
+.LASF536:
 	.string	"s_stack_depth"
-.LASF1327:
+.LASF1329:
 	.string	"data_vm"
 .LASF11:
 	.string	"__s32"
-.LASF2483:
+.LASF2485:
 	.string	"i2c_msg"
-.LASF766:
+.LASF768:
 	.string	"ate_match_acpi_oem_info"
-.LASF389:
+.LASF391:
 	.string	"nr_dentry"
-.LASF2180:
+.LASF2182:
 	.string	"poweroff"
-.LASF2074:
+.LASF2076:
 	.string	"stop"
-.LASF2593:
+.LASF2595:
 	.string	"__tracepoint_page_ref_unfreeze"
-.LASF2062:
+.LASF2064:
 	.string	"ratelimit_state"
-.LASF528:
+.LASF530:
 	.string	"s_pins"
-.LASF2525:
+.LASF2527:
 	.string	"scl_gpiod"
-.LASF2080:
+.LASF2082:
 	.string	"ioport_resource"
-.LASF2698:
+.LASF2700:
 	.string	"init_on_alloc"
-.LASF2462:
+.LASF2464:
 	.string	"param_count"
-.LASF2112:
+.LASF2114:
 	.string	"attr"
-.LASF2438:
+.LASF2440:
 	.string	"get_next_child_node"
-.LASF2807:
+.LASF2809:
 	.string	"module_ktype"
-.LASF2012:
+.LASF2014:
 	.string	"state_in_sysfs"
-.LASF1221:
+.LASF1223:
 	.string	"vm_fault_t"
-.LASF1202:
+.LASF1204:
 	.string	"UTASK_SSTEP_TRAPPED"
-.LASF330:
+.LASF332:
 	.string	"__entry_tramp_text_end"
-.LASF1304:
+.LASF1306:
 	.string	"find_special_page"
-.LASF2578:
+.LASF2580:
 	.string	"force_atomic"
 .LASF105:
 	.string	"poll"
-.LASF2441:
+.LASF2443:
 	.string	"graph_get_next_endpoint"
-.LASF1407:
+.LASF1409:
 	.string	"io_cq"
-.LASF2852:
+.LASF2854:
 	.string	"epd_lut_data"
-.LASF2329:
+.LASF2331:
 	.string	"probe"
-.LASF2719:
+.LASF2721:
 	.string	"elf64_sym"
-.LASF2763:
+.LASF2765:
 	.string	"latch_tree_node"
-.LASF1152:
+.LASF1154:
 	.string	"cad_pid"
-.LASF2936:
+.LASF2940:
 	.string	"lgonl"
-.LASF532:
+.LASF534:
 	.string	"destroy_work"
-.LASF3072:
+.LASF3076:
 	.string	"one_buffer_end"
 .LASF253:
 	.string	"FTR_LOWER_SAFE"
 .LASF126:
 	.string	"clone_file_range"
-.LASF2517:
+.LASF2519:
 	.string	"recover_bus"
-.LASF2265:
+.LASF2267:
 	.string	"syscore"
 .LASF13:
 	.string	"__s64"
-.LASF863:
+.LASF865:
 	.string	"pcpu_chosen_fc"
-.LASF388:
+.LASF390:
 	.string	"dentry_stat_t"
-.LASF3210:
+.LASF3215:
 	.string	"atomic_add"
-.LASF1640:
+.LASF1642:
 	.string	"dqi_bgrace"
 .LASF22:
 	.string	"__kernel_pid_t"
 .LASF157:
 	.string	"SYSTEM_SUSPEND"
-.LASF935:
+.LASF937:
 	.string	"_timer"
-.LASF1593:
+.LASF1595:
 	.string	"thread_sibling"
-.LASF2395:
+.LASF2397:
 	.string	"dma_map_ops"
-.LASF2028:
+.LASF2030:
 	.string	"ctl_table"
 .LASF43:
 	.string	"uid_t"
-.LASF3239:
+.LASF3244:
 	.string	"strstr"
-.LASF2845:
+.LASF2847:
 	.string	"WF_TYPE_A2"
-.LASF2823:
+.LASF2825:
 	.string	"of_default_bus_match_table"
-.LASF1218:
+.LASF1220:
 	.string	"__bp_harden_hyp_vecs_start"
-.LASF1258:
+.LASF1260:
 	.string	"pgmap"
-.LASF487:
+.LASF489:
 	.string	"dq_op"
-.LASF2365:
+.LASF2367:
 	.string	"sysfs_dev_char_kobj"
-.LASF605:
+.LASF607:
 	.string	"rcu_tasks_nvcsw"
 .LASF100:
 	.string	"write"
-.LASF2592:
+.LASF2594:
 	.string	"__tracepoint_page_ref_freeze"
-.LASF2926:
+.LASF2930:
 	.string	"panel_buffer"
-.LASF314:
+.LASF316:
 	.string	"__exception_text_end"
-.LASF2731:
+.LASF2733:
 	.string	"sh_addr"
 .LASF274:
 	.string	"_text"
-.LASF1884:
+.LASF1886:
 	.string	"fu_rcuhead"
-.LASF2707:
+.LASF2709:
 	.string	"modprobe_path"
-.LASF2214:
+.LASF2216:
 	.string	"dma_pools"
-.LASF2076:
+.LASF2078:
 	.string	"arch_debugfs_dir"
-.LASF925:
+.LASF927:
 	.string	"_addr_lsb"
-.LASF2034:
+.LASF2036:
 	.string	"ctl_table_poll"
-.LASF460:
+.LASF462:
 	.string	"i_generation"
-.LASF938:
+.LASF940:
 	.string	"_sigpoll"
 .LASF280:
 	.string	"__bss_start"
-.LASF1928:
+.LASF1930:
 	.string	"magic"
-.LASF2309:
+.LASF2311:
 	.string	"wakeup_count"
-.LASF997:
+.LASF999:
 	.string	"cpu_id_start"
-.LASF2437:
+.LASF2439:
 	.string	"get_parent"
-.LASF1045:
+.LASF1047:
 	.string	"nr_wakeups_affine"
-.LASF762:
+.LASF764:
 	.string	"arch_timer_read_ool_enabled"
-.LASF832:
+.LASF834:
 	.string	"pteval_t"
-.LASF427:
+.LASF429:
 	.string	"i_ino"
-.LASF3280:
+.LASF3285:
 	.string	"might_fault"
-.LASF1559:
+.LASF1561:
 	.string	"compact_cached_free_pfn"
-.LASF877:
+.LASF879:
 	.string	"index"
-.LASF2201:
+.LASF2203:
 	.string	"driver_data"
-.LASF2934:
+.LASF2938:
 	.string	"sdck"
-.LASF2806:
+.LASF2808:
 	.string	"module_kset"
-.LASF2416:
+.LASF2418:
 	.string	"removed_region"
-.LASF2167:
+.LASF2169:
 	.string	"n_ref"
-.LASF900:
+.LASF902:
 	.string	"tick_cpu_device"
-.LASF1930:
+.LASF1932:
 	.string	"fa_next"
-.LASF1273:
+.LASF1275:
 	.string	"f_op"
-.LASF2701:
+.LASF2703:
 	.string	"randomize_va_space"
-.LASF2577:
+.LASF2579:
 	.string	"confirm_switch"
-.LASF2886:
+.LASF2890:
 	.string	"EPD_SUSPEND"
-.LASF378:
+.LASF380:
 	.string	"seqcount_t"
-.LASF1842:
+.LASF1844:
 	.string	"inode_operations"
-.LASF2447:
+.LASF2449:
 	.string	"port"
-.LASF2828:
+.LASF2830:
 	.string	"usercopy_fallback"
-.LASF923:
+.LASF925:
 	.string	"_dummy_pkey"
-.LASF2821:
+.LASF2823:
 	.string	"id_table"
-.LASF1610:
+.LASF1612:
 	.string	"dq_sb"
-.LASF899:
+.LASF901:
 	.string	"tick_device"
 .LASF127:
 	.string	"dedupe_file_range"
-.LASF1192:
+.LASF1194:
 	.string	"radix_tree_root"
-.LASF1121:
+.LASF1123:
 	.string	"sighand_struct"
-.LASF2837:
+.LASF2839:
 	.string	"sched_param"
-.LASF1349:
+.LASF1351:
 	.string	"tlb_flush_pending"
 .LASF170:
 	.string	"flags"
-.LASF708:
+.LASF710:
 	.string	"cpuset_slab_spread_rotor"
-.LASF1946:
+.LASF1948:
 	.string	"i_lock_key"
-.LASF1245:
+.LASF1247:
 	.string	"kmem_cache"
-.LASF2677:
+.LASF2679:
 	.string	"KCOMPACTD_FREE_SCANNED"
-.LASF415:
+.LASF417:
 	.string	"inode"
-.LASF2776:
+.LASF2778:
 	.string	"drivers_dir"
-.LASF1451:
+.LASF1453:
 	.string	"NR_ZONE_ACTIVE_ANON"
 .LASF166:
 	.string	"bug_entry"
 .LASF287:
 	.string	"__end_ro_after_init"
-.LASF1392:
+.LASF1394:
 	.string	"rw_sem"
-.LASF1770:
+.LASF1772:
 	.string	"dqio_sem"
-.LASF1056:
+.LASF1058:
 	.string	"prev_sum_exec_runtime"
-.LASF1735:
+.LASF1737:
 	.string	"gpl_future_syms"
-.LASF2875:
+.LASF2877:
 	.string	"EPD_FULL_GLR16"
-.LASF1039:
+.LASF1041:
 	.string	"nr_forced_migrations"
-.LASF2073:
+.LASF2075:
 	.string	"seq_operations"
-.LASF635:
+.LASF637:
 	.string	"stack_canary"
-.LASF1158:
+.LASF1160:
 	.string	"blksize"
-.LASF639:
+.LASF641:
 	.string	"sibling"
-.LASF1283:
+.LASF1285:
 	.string	"f_ra"
-.LASF1975:
+.LASF1977:
 	.string	"quota_write"
-.LASF1995:
+.LASF1997:
 	.string	"fi_extents_max"
-.LASF2478:
+.LASF2480:
 	.string	"translate"
-.LASF2519:
+.LASF2521:
 	.string	"set_scl"
-.LASF1854:
+.LASF1856:
 	.string	"rmdir"
-.LASF2130:
+.LASF2132:
 	.string	"sock"
-.LASF384:
+.LASF386:
 	.string	"hash_len"
-.LASF869:
+.LASF871:
 	.string	"HRTIMER_RESTART"
-.LASF2211:
+.LASF2213:
 	.string	"bus_dma_mask"
-.LASF559:
+.LASF561:
 	.string	"pidfd_fops"
-.LASF1914:
+.LASF1916:
 	.string	"lm_put_owner"
-.LASF3241:
+.LASF3246:
 	.string	"ebc_pmic_verity_vcom"
-.LASF2521:
+.LASF2523:
 	.string	"set_sda"
-.LASF471:
+.LASF473:
 	.string	"d_init"
-.LASF1305:
+.LASF1307:
 	.string	"core_thread"
-.LASF1779:
+.LASF1781:
 	.string	"address_space_operations"
-.LASF979:
+.LASF981:
 	.string	"vm_userfaultfd_ctx"
-.LASF2348:
+.LASF2350:
 	.string	"devnode"
-.LASF876:
+.LASF878:
 	.string	"cpu_base"
-.LASF1239:
+.LASF1241:
 	.string	"objects"
-.LASF2432:
+.LASF2434:
 	.string	"device_is_available"
-.LASF1602:
+.LASF1604:
 	.string	"dquot"
-.LASF1070:
+.LASF1072:
 	.string	"dl_runtime"
 .LASF84:
 	.string	"initcall_debug"
-.LASF557:
+.LASF559:
 	.string	"numbers"
-.LASF871:
+.LASF873:
 	.string	"_softexpires"
-.LASF2060:
+.LASF2062:
 	.string	"key_user"
-.LASF2068:
+.LASF2070:
 	.string	"printk_ratelimit_state"
-.LASF1365:
+.LASF1367:
 	.string	"semaphore"
-.LASF645:
+.LASF647:
 	.string	"thread_group"
-.LASF2332:
+.LASF2334:
 	.string	"shutdown"
-.LASF1607:
+.LASF1609:
 	.string	"dq_lock"
-.LASF1837:
+.LASF1839:
 	.string	"i_cdev"
-.LASF348:
+.LASF350:
 	.string	"sve_vl_onexec"
-.LASF1341:
+.LASF1343:
 	.string	"env_end"
-.LASF1626:
+.LASF1628:
 	.string	"dqb_bhardlimit"
-.LASF2032:
+.LASF2034:
 	.string	"extra1"
-.LASF698:
+.LASF700:
 	.string	"ptrace_message"
-.LASF1762:
+.LASF1764:
 	.string	"num_trace_events"
-.LASF916:
+.LASF918:
 	.string	"_sys_private"
-.LASF2420:
+.LASF2422:
 	.string	"properties"
-.LASF520:
+.LASF522:
 	.string	"s_subtype"
 .LASF70:
 	.string	"func"
-.LASF1138:
+.LASF1140:
 	.string	"perf_event_context"
-.LASF2996:
+.LASF3000:
 	.string	"ebc_auto_task"
 .LASF93:
 	.string	"printk_delay_msec"
-.LASF2696:
+.LASF2698:
 	.string	"mmap_pages_allocated"
-.LASF986:
+.LASF988:
 	.string	"tlbflush_unmap_batch"
-.LASF2170:
+.LASF2172:
 	.string	"power_group_name"
-.LASF776:
+.LASF778:
 	.string	"clock_event_device"
-.LASF1196:
+.LASF1198:
 	.string	"m_count"
-.LASF2161:
+.LASF2163:
 	.string	"hypervisor_kobj"
-.LASF602:
+.LASF604:
 	.string	"rcu_read_unlock_special"
-.LASF940:
+.LASF942:
 	.string	"siginfo"
-.LASF993:
+.LASF995:
 	.string	"read_bytes"
-.LASF320:
+.LASF322:
 	.string	"__hyp_text_end"
-.LASF1989:
+.LASF1991:
 	.string	"fsverity_operations"
-.LASF1088:
+.LASF1090:
 	.string	"wake_q_node"
-.LASF1114:
+.LASF1116:
 	.string	"request_key_auth"
-.LASF1951:
+.LASF1953:
 	.string	"destroy_inode"
-.LASF2959:
+.LASF2963:
 	.string	"is_busy_now"
 .LASF57:
 	.string	"irq_hw_number_t"
-.LASF2364:
+.LASF2366:
 	.string	"sysfs_dev_block_kobj"
-.LASF552:
+.LASF554:
 	.string	"upid"
-.LASF3269:
+.LASF3274:
 	.string	"down_write"
-.LASF1096:
+.LASF1098:
 	.string	"completion"
-.LASF3070:
+.LASF3074:
 	.string	"old_prev_buf"
-.LASF1497:
+.LASF1499:
 	.string	"NR_GPU_HEAP"
-.LASF858:
+.LASF860:
 	.string	"PCPU_FC_AUTO"
-.LASF1904:
+.LASF1906:
 	.string	"fl_break_time"
-.LASF1201:
+.LASF1203:
 	.string	"UTASK_SSTEP_ACK"
 .LASF76:
 	.string	"__con_initcall_end"
-.LASF1143:
+.LASF1145:
 	.string	"active_uprobe"
-.LASF3000:
+.LASF3004:
 	.string	"ebc_poweroff_wq"
-.LASF1969:
+.LASF1971:
 	.string	"show_options"
-.LASF2140:
+.LASF2142:
 	.string	"uevent_helper"
-.LASF3041:
+.LASF3045:
 	.string	"lut_buffer_phy"
 .LASF109:
 	.string	"mmap_supported_flags"
 .LASF50:
 	.string	"sector_t"
-.LASF1215:
+.LASF1217:
 	.string	"bp_hardening_cb_t"
-.LASF1806:
+.LASF1808:
 	.string	"bd_dev"
-.LASF1845:
+.LASF1847:
 	.string	"permission"
-.LASF1514:
+.LASF1516:
 	.string	"node_spanned_pages"
-.LASF918:
+.LASF920:
 	.string	"_utime"
-.LASF2246:
+.LASF2248:
 	.string	"pm_subsys_data"
-.LASF2347:
+.LASF2349:
 	.string	"device_type"
-.LASF1153:
+.LASF1155:
 	.string	"thread_union"
-.LASF1809:
+.LASF1811:
 	.string	"bd_super"
-.LASF2706:
+.LASF2708:
 	.string	"usermodehelper_table"
 .LASF159:
 	.string	"taint_flag"
-.LASF1976:
+.LASF1978:
 	.string	"get_dquots"
-.LASF2400:
+.LASF2402:
 	.string	"unmap_page"
-.LASF825:
+.LASF827:
 	.string	"system_unbound_wq"
-.LASF514:
+.LASF516:
 	.string	"s_uuid"
-.LASF1664:
+.LASF1666:
 	.string	"destroy_dquot"
-.LASF1676:
+.LASF1678:
 	.string	"d_ino_hardlimit"
-.LASF1874:
+.LASF1876:
 	.string	"fsverity_info"
-.LASF2038:
+.LASF2040:
 	.string	"nr_leaves_on_tree"
-.LASF1709:
+.LASF1711:
 	.string	"quota_on"
-.LASF2456:
+.LASF2458:
 	.string	"of_root"
-.LASF1293:
+.LASF1295:
 	.string	"vm_operations_struct"
-.LASF2388:
+.LASF2390:
 	.string	"hwirq_max"
-.LASF2196:
+.LASF2198:
 	.string	"runtime_idle"
-.LASF1890:
+.LASF1892:
 	.string	"fl_next"
-.LASF2524:
+.LASF2526:
 	.string	"unprepare_recovery"
-.LASF438:
+.LASF440:
 	.string	"i_state"
-.LASF591:
+.LASF593:
 	.string	"sched_class"
-.LASF1968:
+.LASF1970:
 	.string	"umount_end"
-.LASF689:
+.LASF691:
 	.string	"pi_waiters"
-.LASF2655:
+.LASF2657:
 	.string	"PGSCAN_DIRECT"
-.LASF1254:
+.LASF1256:
 	.string	"pt_frag_refcount"
-.LASF1846:
+.LASF1848:
 	.string	"permission2"
-.LASF1703:
+.LASF1705:
 	.string	"i_ino_timelimit"
 .LASF225:
 	.string	"cnts"
-.LASF2238:
+.LASF2240:
 	.string	"RPM_SUSPENDED"
-.LASF695:
+.LASF697:
 	.string	"reclaim_state"
-.LASF3279:
+.LASF3284:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF137:
 	.string	"vendor_panic_cb"
-.LASF3065:
+.LASF3069:
 	.string	"ebc_vdd_power_timeout"
-.LASF3131:
+.LASF3136:
 	.string	"ebc_get_4pix_wf"
-.LASF2796:
+.LASF2798:
 	.string	"num_symtab"
-.LASF1596:
+.LASF1598:
 	.string	"cpu_scale"
-.LASF2643:
+.LASF2645:
 	.string	"PGSCAN_SKIP_MOVABLE"
-.LASF1953:
+.LASF1955:
 	.string	"write_inode"
-.LASF412:
+.LASF414:
 	.string	"d_fsdata"
-.LASF2239:
+.LASF2241:
 	.string	"RPM_SUSPENDING"
-.LASF2610:
+.LASF2612:
 	.string	"mmap_rnd_bits_max"
-.LASF1229:
+.LASF1231:
 	.string	"nrpages"
-.LASF843:
+.LASF845:
 	.string	"_refcount"
-.LASF463:
+.LASF465:
 	.string	"i_crypt_info"
-.LASF1869:
+.LASF1871:
 	.string	"flc_flock"
-.LASF2774:
+.LASF2776:
 	.string	"module_alloc_base"
-.LASF1749:
+.LASF1751:
 	.string	"core_kallsyms"
-.LASF3243:
+.LASF3248:
 	.string	"memcpy"
-.LASF2889:
+.LASF2893:
 	.string	"EPD_FORCE_FULL"
-.LASF2398:
+.LASF2400:
 	.string	"get_sgtable"
-.LASF3112:
+.LASF3117:
 	.string	"xor_val"
-.LASF2153:
+.LASF2155:
 	.string	"envp_idx"
-.LASF462:
+.LASF464:
 	.string	"i_fsnotify_marks"
-.LASF2013:
+.LASF2015:
 	.string	"state_add_uevent_sent"
-.LASF2666:
+.LASF2668:
 	.string	"OOM_KILL"
-.LASF442:
+.LASF444:
 	.string	"i_hash"
-.LASF3099:
+.LASF3101:
 	.string	"gray_old"
 .LASF67:
 	.string	"hlist_node"
-.LASF3250:
+.LASF3255:
 	.string	"sprintf"
-.LASF1906:
+.LASF1908:
 	.string	"fl_ops"
-.LASF1713:
+.LASF1715:
 	.string	"quota_sync"
-.LASF2705:
+.LASF2707:
 	.string	"debug_guardpage_ops"
-.LASF2671:
+.LASF2673:
 	.string	"COMPACTISOLATED"
-.LASF3221:
+.LASF3226:
 	.string	"of_property_read_variable_u32_array"
-.LASF325:
+.LASF327:
 	.string	"__inittext_begin"
-.LASF1393:
+.LASF1395:
 	.string	"writer"
-.LASF761:
+.LASF763:
 	.string	"arch_timer_read_counter"
 .LASF269:
 	.string	"ftr_bits"
-.LASF625:
+.LASF627:
 	.string	"sched_remote_wakeup"
-.LASF2177:
+.LASF2179:
 	.string	"resume"
-.LASF688:
+.LASF690:
 	.string	"wake_q"
-.LASF2673:
+.LASF2675:
 	.string	"COMPACTFAIL"
-.LASF693:
+.LASF695:
 	.string	"bio_list"
-.LASF1662:
+.LASF1664:
 	.string	"write_dquot"
-.LASF2650:
+.LASF2652:
 	.string	"PGLAZYFREED"
-.LASF1346:
+.LASF1348:
 	.string	"ioctx_lock"
-.LASF308:
+.LASF310:
 	.string	"current_stack_pointer"
-.LASF2832:
+.LASF2834:
 	.string	"NR_KMALLOC_TYPES"
-.LASF1206:
+.LASF1208:
 	.string	"dup_xol_addr"
-.LASF2472:
+.LASF2474:
 	.string	"DOMAIN_BUS_WAKEUP"
-.LASF1220:
+.LASF1222:
 	.string	"arm64_el2_vector_last_slot"
-.LASF3273:
+.LASF3278:
 	.string	"queue_work_on"
-.LASF2333:
+.LASF2335:
 	.string	"online"
-.LASF2195:
+.LASF2197:
 	.string	"runtime_resume"
-.LASF1205:
+.LASF1207:
 	.string	"dup_xol_work"
-.LASF3152:
+.LASF3157:
 	.string	"ebc_pmic_read_temp"
-.LASF2873:
+.LASF2875:
 	.string	"EPD_FULL_GC16"
-.LASF3009:
+.LASF3013:
 	.string	"dev_attr_ebc_state"
-.LASF2159:
+.LASF2161:
 	.string	"kernel_kobj"
-.LASF2585:
+.LASF2587:
 	.string	"funcs"
-.LASF2992:
+.LASF2996:
 	.string	"overlay_enable"
-.LASF1105:
+.LASF1107:
 	.string	"securebits"
-.LASF2710:
+.LASF2712:
 	.string	"Elf64_Off"
-.LASF1325:
+.LASF1327:
 	.string	"total_vm"
-.LASF620:
+.LASF622:
 	.string	"jobctl"
-.LASF2871:
+.LASF2873:
 	.string	"EPD_AUTO"
-.LASF329:
+.LASF331:
 	.string	"__entry_tramp_text_start"
-.LASF847:
+.LASF849:
 	.string	"node_list"
-.LASF2469:
+.LASF2471:
 	.string	"DOMAIN_BUS_NEXUS"
-.LASF2036:
+.LASF2038:
 	.string	"sysctl_mount_point"
-.LASF2988:
+.LASF2992:
 	.string	"auto_buffer_work"
 .LASF266:
 	.string	"user_mask"
-.LASF2740:
+.LASF2742:
 	.string	"kernel_param"
-.LASF2279:
+.LASF2281:
 	.string	"deferred_resume"
-.LASF1675:
+.LASF1677:
 	.string	"d_spc_softlimit"
 .LASF53:
 	.string	"gfp_t"
-.LASF335:
+.LASF337:
 	.string	"bps_disabled"
-.LASF903:
+.LASF905:
 	.string	"seccomp_filter"
-.LASF777:
+.LASF779:
 	.string	"timer_unstable_counter_workaround"
-.LASF651:
+.LASF653:
 	.string	"stime"
-.LASF1227:
+.LASF1229:
 	.string	"i_mmap"
-.LASF1150:
+.LASF1152:
 	.string	"phys_addr"
-.LASF395:
+.LASF397:
 	.string	"d_lru"
-.LASF2406:
+.LASF2408:
 	.string	"sync_single_for_device"
-.LASF1120:
+.LASF1122:
 	.string	"signal_struct"
-.LASF797:
+.LASF799:
 	.string	"WORK_STRUCT_COLOR_BITS"
-.LASF716:
+.LASF718:
 	.string	"perf_event_mutex"
-.LASF1128:
+.LASF1130:
 	.string	"nr_batch_requests"
-.LASF1457:
+.LASF1459:
 	.string	"NR_PAGETABLE"
-.LASF1726:
+.LASF1728:
 	.string	"crcs"
-.LASF2681:
+.LASF2683:
 	.string	"UNEVICTABLE_PGMLOCKED"
-.LASF834:
+.LASF836:
 	.string	"pgdval_t"
-.LASF2911:
+.LASF2915:
 	.string	"page_link"
-.LASF1857:
+.LASF1859:
 	.string	"setattr"
-.LASF933:
+.LASF935:
 	.string	"_pad"
-.LASF1288:
+.LASF1290:
 	.string	"f_mapping"
-.LASF2174:
+.LASF2176:
 	.string	"prepare"
-.LASF2136:
+.LASF2138:
 	.string	"bin_attrs"
-.LASF2921:
+.LASF2925:
 	.string	"HYPERVISOR_shared_info"
-.LASF680:
+.LASF682:
 	.string	"sas_ss_flags"
-.LASF1278:
+.LASF1280:
 	.string	"f_mode"
-.LASF1427:
+.LASF1429:
 	.string	"ki_complete"
-.LASF3024:
+.LASF3028:
 	.string	"ebc_tcon_pdev"
-.LASF1753:
+.LASF1755:
 	.string	"percpu"
-.LASF581:
+.LASF583:
 	.string	"wakee_flips"
-.LASF1865:
+.LASF1867:
 	.string	"set_acl"
-.LASF2058:
+.LASF2060:
 	.string	"keys"
 .LASF298:
 	.string	"__irqentry_text_start"
-.LASF561:
+.LASF563:
 	.string	"overflowuid"
-.LASF827:
+.LASF829:
 	.string	"system_power_efficient_wq"
-.LASF2199:
+.LASF2201:
 	.string	"driver"
-.LASF1542:
+.LASF1544:
 	.string	"ZONE_NORMAL"
-.LASF3117:
+.LASF3122:
 	.string	"image_new_data"
-.LASF423:
+.LASF425:
 	.string	"i_op"
-.LASF1684:
+.LASF1686:
 	.string	"d_rt_spc_hardlimit"
-.LASF2971:
+.LASF2975:
 	.string	"ebc_task"
-.LASF2124:
+.LASF2126:
 	.string	"kobj_ns_type_operations"
-.LASF1390:
+.LASF1392:
 	.string	"percpu_rw_semaphore"
-.LASF594:
+.LASF596:
 	.string	"boost_period"
-.LASF2454:
+.LASF2456:
 	.string	"of_node_ktype"
-.LASF666:
+.LASF668:
 	.string	"cred"
 .LASF240:
 	.string	"jump_entry"
-.LASF2609:
+.LASF2611:
 	.string	"mmap_rnd_bits_min"
-.LASF1441:
+.LASF1443:
 	.string	"migratetype_names"
-.LASF1181:
+.LASF1183:
 	.string	"list_lru_node"
-.LASF391:
+.LASF393:
 	.string	"age_limit"
-.LASF2878:
+.LASF2880:
 	.string	"EPD_PART_GC16"
 .LASF236:
 	.string	"spinlock_t"
-.LASF2127:
+.LASF2129:
 	.string	"netlink_ns"
-.LASF360:
+.LASF362:
 	.string	"wait_queue_head"
-.LASF789:
+.LASF791:
 	.string	"work_func_t"
-.LASF2220:
+.LASF2222:
 	.string	"fwnode"
-.LASF1797:
+.LASF1799:
 	.string	"is_dirty_writeback"
 .LASF301:
 	.string	"__softirqentry_text_end"
-.LASF1760:
+.LASF1762:
 	.string	"trace_bprintk_fmt_start"
-.LASF663:
+.LASF665:
 	.string	"cpu_timers"
-.LASF2945:
+.LASF2949:
 	.string	"disable"
-.LASF1298:
+.LASF1300:
 	.string	"huge_fault"
-.LASF2006:
+.LASF2008:
 	.string	"kstatfs"
-.LASF3155:
+.LASF3160:
 	.string	"ebc_pmic_power_off"
-.LASF2632:
+.LASF2634:
 	.string	"PGPGOUTCLEAN"
-.LASF578:
+.LASF580:
 	.string	"ptrace"
-.LASF2301:
+.LASF2303:
 	.string	"max_time"
-.LASF1591:
+.LASF1593:
 	.string	"package_id"
 .LASF103:
 	.string	"iterate"
-.LASF1182:
+.LASF1184:
 	.string	"memcg_lrus"
-.LASF1833:
+.LASF1835:
 	.string	"i_dentry"
-.LASF2126:
+.LASF2128:
 	.string	"grab_current_ns"
-.LASF3039:
+.LASF3043:
 	.string	"fb_size"
-.LASF881:
+.LASF883:
 	.string	"offset"
-.LASF1264:
+.LASF1266:
 	.string	"altmap"
-.LASF1872:
+.LASF1874:
 	.string	"fsnotify_mark_connector"
-.LASF939:
+.LASF941:
 	.string	"_sigsys"
-.LASF3086:
+.LASF3087:
 	.string	"ebc_lut_update"
-.LASF1919:
+.LASF1921:
 	.string	"lm_setup"
-.LASF424:
+.LASF426:
 	.string	"i_sb"
-.LASF345:
+.LASF347:
 	.string	"fpsimd_cpu"
-.LASF2788:
+.LASF2790:
 	.string	"MODULE_STATE_UNFORMED"
 .LASF193:
 	.string	"expires"
-.LASF1378:
+.LASF1380:
 	.string	"rcuwait"
-.LASF327:
+.LASF329:
 	.string	"__mmuoff_data_start"
-.LASF657:
+.LASF659:
 	.string	"nivcsw"
-.LASF2495:
+.LASF2497:
 	.string	"i2c_adapter"
-.LASF1370:
+.LASF1372:
 	.string	"fe_reserved64"
-.LASF2376:
+.LASF2378:
 	.string	"DL_DEV_UNBINDING"
-.LASF352:
+.LASF354:
 	.string	"signal_minsigstksz"
-.LASF748:
+.LASF750:
 	.string	"thread"
-.LASF2346:
+.LASF2348:
 	.string	"subsys_private"
-.LASF2559:
+.LASF2561:
 	.string	"idmap_pg_dir"
-.LASF2516:
+.LASF2518:
 	.string	"i2c_bus_recovery_info"
-.LASF3042:
+.LASF3046:
 	.string	"lut_buffer_size"
-.LASF481:
+.LASF483:
 	.string	"s_dev"
-.LASF343:
+.LASF345:
 	.string	"fpsimd_state"
-.LASF1660:
+.LASF1662:
 	.string	"get_next_id"
 .LASF237:
 	.string	"rwlock_t"
-.LASF3278:
+.LASF3283:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
-.LASF838:
+.LASF840:
 	.string	"pgprot"
 .LASF17:
 	.string	"false"
-.LASF1972:
+.LASF1974:
 	.string	"show_path"
-.LASF1250:
+.LASF1252:
 	.string	"_compound_pad_1"
-.LASF1251:
+.LASF1253:
 	.string	"_compound_pad_2"
-.LASF548:
+.LASF550:
 	.string	"PIDTYPE_TGID"
-.LASF1913:
+.LASF1915:
 	.string	"lm_get_owner"
-.LASF2898:
+.LASF2902:
 	.string	"drvpar"
-.LASF2629:
+.LASF2631:
 	.string	"vm_event_item"
-.LASF2568:
+.LASF2570:
 	.string	"kthreadd_task"
-.LASF1803:
+.LASF1805:
 	.string	"swap_info_struct"
 .LASF87:
 	.string	"__icache_flags"
 .LASF147:
 	.string	"crash_kexec_post_notifiers"
-.LASF3140:
+.LASF3145:
 	.string	"eink_mode"
-.LASF1695:
+.LASF1697:
 	.string	"rt_spc_warnlimit"
-.LASF1188:
+.LASF1190:
 	.string	"exceptional"
-.LASF1993:
+.LASF1995:
 	.string	"fi_flags"
-.LASF1577:
+.LASF1579:
 	.string	"blocking_notifier_head"
-.LASF2345:
+.LASF2347:
 	.string	"coredump"
 .LASF277:
 	.string	"_data"
-.LASF1531:
+.LASF1533:
 	.string	"vm_stat"
-.LASF555:
+.LASF557:
 	.string	"tasks"
-.LASF911:
+.LASF913:
 	.string	"_pid"
-.LASF1154:
+.LASF1156:
 	.string	"init_stack"
-.LASF3123:
+.LASF3128:
 	.string	"dmask"
-.LASF1223:
+.LASF1225:
 	.string	"address_space"
-.LASF1214:
+.LASF1216:
 	.string	"mm_context_t"
-.LASF1309:
+.LASF1311:
 	.string	"startup"
-.LASF1416:
+.LASF1418:
 	.string	"sysctl_nr_open"
 .LASF81:
 	.string	"reset_devices"
-.LASF2974:
+.LASF2978:
 	.string	"auto_image_bg"
-.LASF444:
+.LASF446:
 	.string	"i_wb"
-.LASF2084:
+.LASF2086:
 	.string	"idr_next"
-.LASF3109:
+.LASF3114:
 	.string	"frame_count_data"
-.LASF2950:
+.LASF2954:
 	.string	"frame_start"
-.LASF1248:
+.LASF1250:
 	.string	"compound_order"
-.LASF1252:
+.LASF1254:
 	.string	"deferred_list"
-.LASF951:
+.LASF953:
 	.string	"locked_shm"
-.LASF1083:
+.LASF1085:
 	.string	"inactive_timer"
-.LASF924:
+.LASF926:
 	.string	"_pkey"
 .LASF288:
 	.string	"_end"
-.LASF475:
+.LASF477:
 	.string	"d_dname"
-.LASF1728:
+.LASF1730:
 	.string	"param_lock"
-.LASF970:
+.LASF972:
 	.string	"vm_page_prot"
 .LASF178:
 	.string	"timespec64"
-.LASF550:
+.LASF552:
 	.string	"PIDTYPE_SID"
-.LASF2403:
+.LASF2405:
 	.string	"map_resource"
-.LASF473:
+.LASF475:
 	.string	"d_prune"
 .LASF82:
 	.string	"rodata_enabled"
-.LASF2065:
+.LASF2067:
 	.string	"printed"
-.LASF315:
+.LASF317:
 	.string	"__hibernate_exit_text_start"
-.LASF2189:
+.LASF2191:
 	.string	"resume_noirq"
-.LASF1548:
+.LASF1550:
 	.string	"lowmem_reserve"
-.LASF842:
+.LASF844:
 	.string	"page"
-.LASF1671:
+.LASF1673:
 	.string	"get_inode_usage"
-.LASF2417:
+.LASF2419:
 	.string	"device_node"
-.LASF589:
+.LASF591:
 	.string	"normal_prio"
-.LASF1286:
+.LASF1288:
 	.string	"f_ep_links"
-.LASF3121:
+.LASF3126:
 	.string	"image_fb_tmp"
-.LASF2292:
+.LASF2294:
 	.string	"last_busy"
-.LASF1835:
+.LASF1837:
 	.string	"i_pipe"
-.LASF872:
+.LASF874:
 	.string	"base"
-.LASF1224:
+.LASF1226:
 	.string	"host"
 .LASF184:
 	.string	"uaddr"
-.LASF3268:
+.LASF3273:
 	.string	"ebc_remove_from_dsp_buf_list"
-.LASF659:
+.LASF661:
 	.string	"real_start_time"
 .LASF28:
 	.string	"__kernel_time_t"
-.LASF1990:
+.LASF1992:
 	.string	"unicode_map"
-.LASF2565:
+.LASF2567:
 	.string	"MEMREMAP_WC"
-.LASF2442:
+.LASF2444:
 	.string	"graph_get_remote_endpoint"
-.LASF1565:
+.LASF1567:
 	.string	"contiguous"
-.LASF1328:
+.LASF1330:
 	.string	"exec_vm"
-.LASF2564:
+.LASF2566:
 	.string	"MEMREMAP_WT"
-.LASF2720:
+.LASF2722:
 	.string	"st_name"
 .LASF227:
 	.string	"wait_lock"
-.LASF1807:
+.LASF1809:
 	.string	"bd_openers"
-.LASF699:
+.LASF701:
 	.string	"last_siginfo"
-.LASF1950:
+.LASF1952:
 	.string	"alloc_inode"
-.LASF2831:
+.LASF2833:
 	.string	"KMALLOC_RECLAIM"
-.LASF407:
+.LASF409:
 	.string	"d_iname"
-.LASF2223:
+.LASF2225:
 	.string	"devres_head"
-.LASF425:
+.LASF427:
 	.string	"i_mapping"
-.LASF3245:
+.LASF3250:
 	.string	"misc_register"
-.LASF720:
+.LASF722:
 	.string	"rseq_sig"
-.LASF3174:
+.LASF3179:
 	.string	"platform_set_drvdata"
-.LASF340:
+.LASF342:
 	.string	"cpu_context"
-.LASF2313:
+.LASF2315:
 	.string	"dev_pm_domain"
-.LASF1511:
+.LASF1513:
 	.string	"nr_zones"
-.LASF3197:
+.LASF3202:
 	.string	"is_source"
-.LASF1373:
+.LASF1375:
 	.string	"migrate_mode"
-.LASF2686:
+.LASF2688:
 	.string	"SWAP_RA_HIT"
-.LASF614:
+.LASF616:
 	.string	"vmacache"
-.LASF1443:
+.LASF1445:
 	.string	"free_area"
-.LASF1521:
+.LASF1523:
 	.string	"kswapd_failures"
-.LASF2186:
+.LASF2188:
 	.string	"poweroff_late"
-.LASF874:
+.LASF876:
 	.string	"is_soft"
 .LASF175:
 	.string	"timezone"
-.LASF403:
+.LASF405:
 	.string	"d_hash"
-.LASF1073:
+.LASF1075:
 	.string	"dl_bw"
-.LASF3167:
+.LASF3172:
 	.string	"limit"
-.LASF2143:
+.LASF2145:
 	.string	"kobj"
-.LASF3251:
+.LASF3256:
 	.string	"kstrtouint"
 .LASF113:
 	.string	"fsync"
-.LASF1991:
+.LASF1993:
 	.string	"mtd_info"
-.LASF420:
+.LASF422:
 	.string	"i_flags"
-.LASF2887:
+.LASF2891:
 	.string	"EPD_RESUME"
-.LASF3240:
+.LASF3245:
 	.string	"sscanf"
-.LASF3236:
+.LASF3241:
 	.string	"ebc_empty_buf_get"
-.LASF1472:
+.LASF1474:
 	.string	"NR_ISOLATED_ANON"
-.LASF3040:
+.LASF3044:
 	.string	"ebc_lut_table_init"
-.LASF1211:
+.LASF1213:
 	.string	"uprobes_state"
-.LASF1551:
+.LASF1553:
 	.string	"cma_alloc"
-.LASF848:
+.LASF850:
 	.string	"rb_node"
-.LASF611:
+.LASF613:
 	.string	"pushable_tasks"
-.LASF3122:
+.LASF3127:
 	.string	"image_bg_tmp"
-.LASF2200:
+.LASF2202:
 	.string	"platform_data"
-.LASF1394:
+.LASF1396:
 	.string	"readers_block"
-.LASF674:
+.LASF676:
 	.string	"sighand"
 .LASF104:
 	.string	"iterate_shared"
-.LASF2133:
+.LASF2135:
 	.string	"is_visible"
-.LASF673:
+.LASF675:
 	.string	"signal"
-.LASF2119:
+.LASF2121:
 	.string	"released"
-.LASF2615:
+.LASF2617:
 	.string	"sysctl_max_map_count"
-.LASF1663:
+.LASF1665:
 	.string	"alloc_dquot"
-.LASF2171:
+.LASF2173:
 	.string	"pm_message"
-.LASF522:
+.LASF524:
 	.string	"cleancache_poolid"
-.LASF844:
+.LASF846:
 	.string	"mem_cgroup"
-.LASF1013:
+.LASF1015:
 	.string	"last_update_time"
-.LASF1135:
+.LASF1137:
 	.string	"robust_list_head"
-.LASF3234:
+.LASF3239:
 	.string	"init_timer_key"
-.LASF1478:
+.LASF1480:
 	.string	"NR_ANON_MAPPED"
-.LASF380:
+.LASF382:
 	.string	"count"
-.LASF554:
+.LASF556:
 	.string	"level"
-.LASF529:
+.LASF531:
 	.string	"s_user_ns"
-.LASF1723:
+.LASF1725:
 	.string	"srcversion"
-.LASF856:
+.LASF858:
 	.string	"pcpu_unit_offsets"
-.LASF3143:
+.LASF3148:
 	.string	"dma_sync_single_for_device"
-.LASF2951:
+.LASF2955:
 	.string	"dsp_end_callback"
-.LASF458:
+.LASF460:
 	.string	"i_data"
-.LASF2005:
+.LASF2007:
 	.string	"poll_event"
-.LASF2554:
+.LASF2556:
 	.string	"softirq_to_name"
 .LASF65:
 	.string	"hlist_head"
-.LASF503:
+.LASF505:
 	.string	"s_encoding_flags"
-.LASF1051:
+.LASF1053:
 	.string	"runnable_weight"
-.LASF2444:
+.LASF2446:
 	.string	"graph_parse_endpoint"
-.LASF1399:
+.LASF1401:
 	.string	"uuid_null"
-.LASF1329:
+.LASF1331:
 	.string	"stack_vm"
-.LASF2274:
+.LASF2276:
 	.string	"usage_count"
-.LASF2075:
+.LASF2077:
 	.string	"show"
-.LASF3006:
+.LASF3010:
 	.string	"dev_attr_pmic_temp"
 .LASF7:
 	.string	"unsigned char"
-.LASF1967:
+.LASF1969:
 	.string	"umount_begin"
-.LASF1213:
+.LASF1215:
 	.string	"vdso"
-.LASF1313:
+.LASF1315:
 	.string	"mmap_legacy_base"
-.LASF2662:
+.LASF2664:
 	.string	"PAGEOUTRUN"
-.LASF980:
+.LASF982:
 	.string	"task_rss_stat"
-.LASF1139:
+.LASF1141:
 	.string	"pipe_inode_info"
-.LASF2978:
+.LASF2982:
 	.string	"ebc_power_status"
-.LASF958:
+.LASF960:
 	.string	"ratelimit"
-.LASF2486:
+.LASF2488:
 	.string	"word"
-.LASF2011:
+.LASF2013:
 	.string	"state_initialized"
-.LASF846:
+.LASF848:
 	.string	"prio_list"
-.LASF2540:
+.LASF2542:
 	.string	"nmi_contexts"
-.LASF2144:
+.LASF2146:
 	.string	"uevent_ops"
-.LASF543:
+.LASF545:
 	.string	"rename_lock"
-.LASF3071:
+.LASF3075:
 	.string	"__out"
-.LASF678:
+.LASF680:
 	.string	"sas_ss_sp"
-.LASF1450:
+.LASF1452:
 	.string	"NR_ZONE_INACTIVE_ANON"
-.LASF726:
+.LASF728:
 	.string	"nr_dirtied"
-.LASF3184:
+.LASF3189:
 	.string	"dev_get_drvdata"
-.LASF2393:
+.LASF2395:
 	.string	"linear_revmap"
-.LASF332:
+.LASF334:
 	.string	"arm64_dma_phys_limit"
-.LASF1448:
+.LASF1450:
 	.string	"NR_FREE_PAGES"
-.LASF519:
+.LASF521:
 	.string	"s_vfs_rename_mutex"
-.LASF2182:
+.LASF2184:
 	.string	"suspend_late"
-.LASF2263:
+.LASF2265:
 	.string	"wakeup"
-.LASF710:
+.LASF712:
 	.string	"cg_list"
-.LASF1818:
+.LASF1820:
 	.string	"bd_partno"
-.LASF1939:
+.LASF1941:
 	.string	"alloc_mnt_data"
-.LASF1825:
+.LASF1827:
 	.string	"bd_list"
-.LASF2262:
+.LASF2264:
 	.string	"driver_flags"
-.LASF1195:
+.LASF1197:
 	.string	"rw_semaphore"
-.LASF2183:
+.LASF2185:
 	.string	"resume_early"
-.LASF1932:
+.LASF1934:
 	.string	"fa_rcu"
-.LASF1864:
+.LASF1866:
 	.string	"tmpfile"
-.LASF1771:
+.LASF1773:
 	.string	"info"
 .LASF154:
 	.string	"SYSTEM_HALT"
-.LASF1861:
+.LASF1863:
 	.string	"fiemap"
-.LASF2429:
+.LASF2431:
 	.string	"waiters"
-.LASF2702:
+.LASF2704:
 	.string	"sysctl_memory_failure_early_kill"
-.LASF2758:
+.LASF2760:
 	.string	"param_ops_bool_enable_only"
-.LASF3128:
+.LASF3133:
 	.string	"power_status"
 .LASF306:
 	.string	"__start_opd"
-.LASF3248:
+.LASF3253:
 	.string	"of_find_i2c_device_by_node"
 .LASF153:
 	.string	"SYSTEM_RUNNING"
-.LASF2848:
+.LASF2850:
 	.string	"WF_TYPE_GLR16"
-.LASF944:
+.LASF946:
 	.string	"_sifields"
-.LASF2022:
+.LASF2024:
 	.string	"page_symlink_inode_operations"
-.LASF733:
+.LASF735:
 	.string	"memcg_in_oom"
-.LASF477:
+.LASF479:
 	.string	"d_manage"
-.LASF1131:
+.LASF1133:
 	.string	"icq_hint"
-.LASF1992:
+.LASF1994:
 	.string	"fiemap_extent_info"
-.LASF2907:
+.LASF2911:
 	.string	"DMA_TO_DEVICE"
-.LASF2727:
+.LASF2729:
 	.string	"elf64_shdr"
 .LASF297:
 	.string	"__end_rodata"
-.LASF768:
+.LASF770:
 	.string	"match_type"
-.LASF2745:
+.LASF2747:
 	.string	"elem"
-.LASF890:
+.LASF892:
 	.string	"nr_retries"
-.LASF2656:
+.LASF2658:
 	.string	"PGSCAN_DIRECT_THROTTLE"
-.LASF910:
+.LASF912:
 	.string	"sigval_t"
-.LASF1931:
+.LASF1933:
 	.string	"fa_file"
-.LASF2994:
+.LASF2998:
 	.string	"panel"
-.LASF2430:
+.LASF2432:
 	.string	"irq_data"
-.LASF3078:
+.LASF3082:
 	.string	"old_buffer_temp"
-.LASF2703:
+.LASF2705:
 	.string	"sysctl_memory_failure_recovery"
-.LASF2690:
+.LASF2692:
 	.string	"vm_event_states"
-.LASF404:
+.LASF406:
 	.string	"d_parent"
-.LASF2066:
+.LASF2068:
 	.string	"missed"
 .LASF149:
 	.string	"root_mountflags"
-.LASF1974:
+.LASF1976:
 	.string	"quota_read"
-.LASF2723:
+.LASF2725:
 	.string	"st_shndx"
-.LASF2397:
+.LASF2399:
 	.string	"free"
-.LASF3046:
+.LASF3050:
 	.string	"pmic_vcom_write"
-.LASF2131:
+.LASF2133:
 	.string	"attribute"
-.LASF446:
+.LASF448:
 	.string	"i_wb_frn_avg_time"
-.LASF2654:
+.LASF2656:
 	.string	"PGSCAN_KSWAPD"
-.LASF1827:
+.LASF1829:
 	.string	"bd_fsfreeze_count"
 .LASF192:
 	.string	"type"
 .LASF163:
 	.string	"taint_flags"
-.LASF1345:
+.LASF1347:
 	.string	"membarrier_state"
-.LASF3134:
+.LASF3139:
 	.string	"pre_image_addr"
-.LASF2176:
+.LASF2178:
 	.string	"suspend"
-.LASF1740:
+.LASF1742:
 	.string	"init"
-.LASF1119:
+.LASF1121:
 	.string	"files_struct"
 .LASF102:
 	.string	"write_iter"
-.LASF497:
+.LASF499:
 	.string	"s_security"
-.LASF654:
+.LASF656:
 	.string	"max_state"
-.LASF527:
+.LASF529:
 	.string	"s_dio_done_wq"
-.LASF2665:
+.LASF2667:
 	.string	"DROP_SLAB"
-.LASF920:
+.LASF922:
 	.string	"_dummy_bnd"
-.LASF679:
+.LASF681:
 	.string	"sas_ss_size"
-.LASF2466:
+.LASF2468:
 	.string	"DOMAIN_BUS_WIRED"
-.LASF1047:
+.LASF1049:
 	.string	"nr_wakeups_passive"
-.LASF1935:
+.LASF1937:
 	.string	"file_system_type"
-.LASF2021:
+.LASF2023:
 	.string	"generic_ro_fops"
-.LASF1163:
+.LASF1165:
 	.string	"mtime"
-.LASF1354:
+.LASF1356:
 	.string	"vm_fault"
-.LASF1380:
+.LASF1382:
 	.string	"RCU_SYNC"
-.LASF1554:
+.LASF1556:
 	.string	"spanned_pages"
-.LASF2150:
+.LASF2152:
 	.string	"kobj_uevent_env"
-.LASF2095:
+.LASF2097:
 	.string	"deactivate_waitq"
-.LASF1008:
+.LASF1010:
 	.string	"inv_weight"
-.LASF1952:
+.LASF1954:
 	.string	"dirty_inode"
-.LASF1567:
+.LASF1569:
 	.string	"vm_numa_stat"
-.LASF1510:
+.LASF1512:
 	.string	"node_zonelists"
-.LASF539:
+.LASF541:
 	.string	"path"
-.LASF2725:
+.LASF2727:
 	.string	"st_size"
 .LASF188:
 	.string	"rmtp"
-.LASF2424:
+.LASF2426:
 	.string	"platform_notify_remove"
-.LASF1025:
+.LASF1027:
 	.string	"wait_sum"
-.LASF1755:
+.LASF1757:
 	.string	"num_tracepoints"
-.LASF617:
+.LASF619:
 	.string	"exit_code"
-.LASF1054:
+.LASF1056:
 	.string	"exec_start"
-.LASF3275:
+.LASF3280:
 	.string	"printk"
-.LASF2379:
+.LASF2381:
 	.string	"consumers"
-.LASF2096:
+.LASF2098:
 	.string	"kernfs_elem_symlink"
-.LASF1179:
+.LASF1181:
 	.string	"nr_items"
-.LASF2503:
+.LASF2505:
 	.string	"userspace_clients_lock"
-.LASF884:
+.LASF886:
 	.string	"clock_was_set_seq"
-.LASF1284:
+.LASF1286:
 	.string	"f_version"
 .LASF140:
 	.string	"panic_timeout"
-.LASF1197:
+.LASF1199:
 	.string	"arch_uprobe_task"
-.LASF456:
+.LASF458:
 	.string	"i_fop"
-.LASF1851:
+.LASF1853:
 	.string	"unlink"
-.LASF2715:
+.LASF2717:
 	.string	"d_ptr"
-.LASF3048:
+.LASF3052:
 	.string	"pmic_temp_read"
-.LASF1650:
+.LASF1652:
 	.string	"dqstats"
-.LASF1017:
+.LASF1019:
 	.string	"period_contrib"
-.LASF603:
+.LASF605:
 	.string	"rcu_node_entry"
-.LASF1666:
+.LASF1668:
 	.string	"release_dquot"
-.LASF1412:
+.LASF1414:
 	.string	"max_files"
-.LASF1104:
+.LASF1106:
 	.string	"fsgid"
-.LASF2338:
+.LASF2340:
 	.string	"need_parent_lock"
-.LASF1383:
+.LASF1385:
 	.string	"rcu_sync"
-.LASF2611:
+.LASF2613:
 	.string	"mmap_rnd_bits"
-.LASF2459:
+.LASF2461:
 	.string	"of_stdout"
-.LASF3069:
+.LASF3073:
 	.string	"new_prev_buf"
-.LASF974:
+.LASF976:
 	.string	"vm_ops"
-.LASF2927:
+.LASF2931:
 	.string	"ebc_panel"
-.LASF1300:
+.LASF1302:
 	.string	"pagesize"
-.LASF483:
+.LASF485:
 	.string	"s_blocksize"
-.LASF975:
+.LASF977:
 	.string	"vm_pgoff"
-.LASF2299:
+.LASF2301:
 	.string	"timer"
-.LASF2460:
+.LASF2462:
 	.string	"devtree_lock"
-.LASF3125:
+.LASF3130:
 	.string	"refresh_new_image_auto"
-.LASF3059:
+.LASF3063:
 	.string	"__ret"
-.LASF1862:
+.LASF1864:
 	.string	"update_time"
-.LASF1977:
+.LASF1979:
 	.string	"bdev_try_to_free_page"
-.LASF1576:
+.LASF1578:
 	.string	"priority"
-.LASF930:
+.LASF932:
 	.string	"_call_addr"
-.LASF819:
+.LASF821:
 	.string	"WORK_BUSY_RUNNING"
-.LASF2050:
+.LASF2052:
 	.string	"check"
-.LASF1414:
+.LASF1416:
 	.string	"nr_inodes"
-.LASF2502:
+.LASF2504:
 	.string	"dev_released"
-.LASF2054:
+.LASF2056:
 	.string	"expiry"
-.LASF569:
+.LASF571:
 	.string	"optimistic_spin_queue"
-.LASF2956:
+.LASF2960:
 	.string	"ebc_buffer_size"
-.LASF3252:
+.LASF3257:
 	.string	"ebc_pmic_set_vcom"
-.LASF2639:
+.LASF2641:
 	.string	"ALLOCSTALL_NORMAL"
-.LASF3103:
+.LASF3105:
 	.string	"data_buf_tmp"
-.LASF323:
+.LASF325:
 	.string	"__initdata_begin"
-.LASF2901:
+.LASF2905:
 	.string	"pmic_pm_resume"
 .LASF224:
 	.string	"__lstate"
-.LASF2156:
+.LASF2158:
 	.string	"uevent"
-.LASF381:
+.LASF383:
 	.string	"lock_count"
 .LASF148:
 	.string	"panic_cpu"
-.LASF831:
+.LASF833:
 	.string	"refcount_t"
-.LASF694:
+.LASF696:
 	.string	"plug"
-.LASF1363:
+.LASF1365:
 	.string	"__cap_empty_set"
-.LASF1342:
+.LASF1344:
 	.string	"saved_auxv"
-.LASF1745:
+.LASF1747:
 	.string	"num_bugs"
-.LASF1647:
+.LASF1649:
 	.string	"qf_ops"
-.LASF2340:
+.LASF2342:
 	.string	"mod_name"
-.LASF2436:
+.LASF2438:
 	.string	"property_read_string_array"
-.LASF719:
+.LASF721:
 	.string	"rseq_len"
-.LASF2463:
+.LASF2465:
 	.string	"param"
-.LASF2779:
+.LASF2781:
 	.string	"module_attribute"
-.LASF1315:
+.LASF1317:
 	.string	"highest_vm_end"
 .LASF243:
 	.string	"pollfd"
-.LASF1044:
+.LASF1046:
 	.string	"nr_wakeups_remote"
-.LASF372:
+.LASF374:
 	.string	"cpu_bit_bitmap"
-.LASF1624:
+.LASF1626:
 	.string	"dq_data_lock"
-.LASF2716:
+.LASF2718:
 	.string	"d_tag"
-.LASF750:
+.LASF752:
 	.string	"llist_node"
-.LASF1622:
+.LASF1624:
 	.string	"projid"
-.LASF1148:
+.LASF1150:
 	.string	"pages"
-.LASF1185:
+.LASF1187:
 	.string	"memcg_aware"
-.LASF1068:
+.LASF1070:
 	.string	"back"
-.LASF2323:
+.LASF2325:
 	.string	"dev_name"
-.LASF1361:
+.LASF1363:
 	.string	"kernel_cap_struct"
-.LASF2738:
+.LASF2740:
 	.string	"_DYNAMIC"
-.LASF999:
+.LASF1001:
 	.string	"rseq_cs"
-.LASF2434:
+.LASF2436:
 	.string	"property_present"
-.LASF895:
+.LASF897:
 	.string	"softirq_expires_next"
-.LASF1592:
+.LASF1594:
 	.string	"llc_id"
-.LASF1848:
+.LASF1850:
 	.string	"readlink"
-.LASF2497:
+.LASF2499:
 	.string	"algo_data"
-.LASF1509:
+.LASF1511:
 	.string	"node_zones"
-.LASF3007:
+.LASF3011:
 	.string	"dev_attr_pmic_vcom"
-.LASF1557:
+.LASF1559:
 	.string	"initialized"
-.LASF1815:
+.LASF1817:
 	.string	"bd_holder_disks"
 .LASF62:
 	.string	"list_head"
-.LASF1528:
+.LASF1530:
 	.string	"lru_lock"
-.LASF2764:
+.LASF2766:
 	.string	"mod_plt_sec"
-.LASF634:
+.LASF636:
 	.string	"tgid"
-.LASF2891:
+.LASF2895:
 	.string	"epd_mode"
-.LASF1136:
+.LASF1138:
 	.string	"compat_robust_list_head"
-.LASF913:
+.LASF915:
 	.string	"_tid"
-.LASF537:
+.LASF539:
 	.string	"s_inode_wblist_lock"
-.LASF2002:
+.LASF2004:
 	.string	"from"
-.LASF1812:
+.LASF1814:
 	.string	"bd_holder"
-.LASF1333:
+.LASF1335:
 	.string	"end_code"
-.LASF1011:
+.LASF1013:
 	.string	"ewma"
 .LASF221:
 	.string	"qspinlock"
 .LASF89:
 	.string	"linux_banner_ptr"
-.LASF1489:
+.LASF1491:
 	.string	"NR_VMSCAN_WRITE"
-.LASF2799:
+.LASF2801:
 	.string	"insn"
-.LASF1997:
+.LASF1999:
 	.string	"filldir_t"
-.LASF1900:
+.LASF1902:
 	.string	"fl_file"
-.LASF1216:
+.LASF1218:
 	.string	"bp_hardening_data"
-.LASF1080:
+.LASF1082:
 	.string	"dl_non_contending"
-.LASF2523:
+.LASF2525:
 	.string	"prepare_recovery"
-.LASF1998:
+.LASF2000:
 	.string	"dir_context"
-.LASF2538:
+.LASF2540:
 	.string	"irq_stat"
-.LASF2644:
+.LASF2646:
 	.string	"PGFREE"
-.LASF2586:
+.LASF2588:
 	.string	"tracepoint_ptr_t"
-.LASF739:
+.LASF741:
 	.string	"utask"
-.LASF1469:
+.LASF1471:
 	.string	"NR_UNEVICTABLE"
-.LASF1049:
+.LASF1051:
 	.string	"sched_entity"
-.LASF1674:
+.LASF1676:
 	.string	"d_spc_hardlimit"
-.LASF2736:
+.LASF2738:
 	.string	"sh_addralign"
-.LASF771:
+.LASF773:
 	.string	"read_cntv_tval_el0"
 .LASF0:
 	.string	"long unsigned int"
-.LASF1029:
+.LASF1031:
 	.string	"sleep_max"
-.LASF319:
+.LASF321:
 	.string	"__hyp_text_start"
-.LASF1312:
+.LASF1314:
 	.string	"mmap_base"
-.LASF697:
+.LASF699:
 	.string	"io_context"
 .LASF209:
 	.string	"compat_elf_hwcap2"
-.LASF2507:
+.LASF2509:
 	.string	"host_notify_domain"
-.LASF814:
+.LASF816:
 	.string	"WORK_OFFQ_POOL_NONE"
-.LASF1731:
+.LASF1733:
 	.string	"gpl_syms"
-.LASF2103:
+.LASF2105:
 	.string	"seq_show"
-.LASF764:
+.LASF766:
 	.string	"ate_match_dt"
-.LASF3182:
+.LASF3187:
 	.string	"of_node_put"
-.LASF1358:
+.LASF1360:
 	.string	"cow_page"
-.LASF1590:
+.LASF1592:
 	.string	"core_id"
-.LASF2487:
+.LASF2489:
 	.string	"block"
-.LASF2689:
+.LASF2691:
 	.string	"vm_event_state"
-.LASF1702:
+.LASF1704:
 	.string	"i_spc_timelimit"
-.LASF1145:
+.LASF1147:
 	.string	"return_instances"
-.LASF2018:
+.LASF2020:
 	.string	"blockdev_superblock"
-.LASF2197:
+.LASF2199:
 	.string	"device"
-.LASF2750:
+.LASF2752:
 	.string	"param_ops_ushort"
-.LASF523:
+.LASF525:
 	.string	"s_shrink"
-.LASF1523:
+.LASF1525:
 	.string	"kcompactd_classzone_idx"
-.LASF3172:
+.LASF3177:
 	.string	"kmalloc_index"
-.LASF867:
+.LASF869:
 	.string	"hrtimer_restart"
-.LASF2605:
+.LASF2607:
 	.string	"totalram_pages"
-.LASF2484:
+.LASF2486:
 	.string	"i2c_smbus_data"
-.LASF2982:
+.LASF2986:
 	.string	"curr_dsp_buf"
-.LASF1066:
+.LASF1068:
 	.string	"time_slice"
-.LASF2419:
+.LASF2421:
 	.string	"full_name"
-.LASF2115:
+.LASF2117:
 	.string	"kernfs_open_file"
-.LASF865:
+.LASF867:
 	.string	"node"
-.LASF1810:
+.LASF1812:
 	.string	"bd_mutex"
-.LASF1377:
+.LASF1379:
 	.string	"MIGRATE_SYNC_NO_COPY"
-.LASF2303:
+.LASF2305:
 	.string	"start_prevent_time"
-.LASF2667:
+.LASF2669:
 	.string	"PGMIGRATE_SUCCESS"
-.LASF798:
+.LASF800:
 	.string	"WORK_STRUCT_PENDING"
-.LASF631:
+.LASF633:
 	.string	"no_cgroup_migration"
 .LASF284:
 	.string	"_sinittext"
-.LASF2653:
+.LASF2655:
 	.string	"PGSTEAL_DIRECT"
-.LASF371:
+.LASF373:
 	.string	"cpu_all_bits"
-.LASF2063:
+.LASF2065:
 	.string	"interval"
-.LASF2721:
+.LASF2723:
 	.string	"st_info"
-.LASF2216:
+.LASF2218:
 	.string	"cma_area"
-.LASF588:
+.LASF590:
 	.string	"static_prio"
-.LASF2836:
+.LASF2838:
 	.string	"wake_lock"
-.LASF2268:
+.LASF2270:
 	.string	"may_skip_resume"
-.LASF2990:
+.LASF2994:
 	.string	"is_deep_sleep"
-.LASF1172:
+.LASF1174:
 	.string	"shrinker"
-.LASF1079:
+.LASF1081:
 	.string	"dl_yielded"
-.LASF1636:
+.LASF1638:
 	.string	"dqi_format"
-.LASF2670:
+.LASF2672:
 	.string	"COMPACTFREE_SCANNED"
-.LASF2614:
+.LASF2616:
 	.string	"mmap_rnd_compat_bits"
-.LASF592:
+.LASF594:
 	.string	"last_sleep_ts"
-.LASF451:
+.LASF453:
 	.string	"i_version"
-.LASF655:
+.LASF657:
 	.string	"prev_cputime"
-.LASF2205:
+.LASF2207:
 	.string	"msi_domain"
-.LASF2014:
+.LASF2016:
 	.string	"state_remove_uevent_sent"
-.LASF1436:
+.LASF1438:
 	.string	"ia_size"
-.LASF886:
+.LASF888:
 	.string	"in_hrtirq"
-.LASF500:
+.LASF502:
 	.string	"s_master_keys"
-.LASF765:
+.LASF767:
 	.string	"ate_match_local_cap_id"
-.LASF2451:
+.LASF2453:
 	.string	"property"
-.LASF3043:
+.LASF3047:
 	.string	"ebc_sysfs_init"
-.LASF989:
+.LASF991:
 	.string	"wchar"
-.LASF313:
+.LASF315:
 	.string	"__exception_text_start"
-.LASF2423:
+.LASF2425:
 	.string	"platform_notify"
 .LASF61:
 	.string	"kernel_symbol"
-.LASF2919:
+.LASF2923:
 	.string	"dma_virt_ops"
-.LASF2296:
+.LASF2298:
 	.string	"subsys_data"
-.LASF2718:
+.LASF2720:
 	.string	"Elf64_Dyn"
-.LASF2353:
+.LASF2355:
 	.string	"compatible"
 .LASF173:
 	.string	"tv_sec"
@@ -52090,1049 +53149,1053 @@ __exitcall_ebc_exit:
 	.string	"pid_t"
 .LASF77:
 	.string	"__security_initcall_start"
-.LASF1052:
+.LASF1054:
 	.string	"run_node"
-.LASF793:
+.LASF795:
 	.string	"WORK_STRUCT_DELAYED_BIT"
-.LASF1036:
+.LASF1038:
 	.string	"nr_failed_migrations_affine"
-.LASF3187:
+.LASF3192:
 	.string	"IS_ERR"
-.LASF859:
+.LASF861:
 	.string	"PCPU_FC_EMBED"
-.LASF2094:
+.LASF2096:
 	.string	"supers"
-.LASF809:
+.LASF811:
 	.string	"WORK_OFFQ_CANCELING"
-.LASF2091:
+.LASF2093:
 	.string	"last_ino"
-.LASF690:
+.LASF692:
 	.string	"pi_top_task"
-.LASF803:
+.LASF805:
 	.string	"WORK_NR_COLORS"
-.LASF3126:
+.LASF3131:
 	.string	"refresh_new_image2"
-.LASF525:
+.LASF527:
 	.string	"s_fsnotify_inode_refs"
-.LASF413:
+.LASF415:
 	.string	"d_child"
-.LASF1999:
+.LASF2001:
 	.string	"actor"
-.LASF1207:
+.LASF1209:
 	.string	"uprobe"
-.LASF526:
+.LASF528:
 	.string	"s_readonly_remount"
-.LASF3213:
+.LASF3218:
 	.string	"kasan_check_write"
-.LASF375:
+.LASF377:
 	.string	"hlist_bl_node"
-.LASF2722:
+.LASF2724:
 	.string	"st_other"
-.LASF1947:
+.LASF1949:
 	.string	"i_mutex_key"
-.LASF2008:
+.LASF2010:
 	.string	"kset"
-.LASF875:
+.LASF877:
 	.string	"hrtimer_clock_base"
-.LASF1055:
+.LASF1057:
 	.string	"vruntime"
-.LASF2276:
+.LASF2278:
 	.string	"disable_depth"
-.LASF429:
+.LASF431:
 	.string	"i_size"
-.LASF1071:
+.LASF1073:
 	.string	"dl_deadline"
-.LASF562:
+.LASF564:
 	.string	"overflowgid"
-.LASF815:
+.LASF817:
 	.string	"WORK_STRUCT_FLAG_MASK"
-.LASF1269:
+.LASF1271:
 	.string	"units"
-.LASF3228:
+.LASF3233:
 	.string	"epd_lut_from_mem_init"
-.LASF309:
+.LASF311:
 	.string	"__nosave_begin"
 .LASF162:
 	.string	"module"
-.LASF2645:
+.LASF2647:
 	.string	"PGACTIVATE"
-.LASF2070:
+.LASF2072:
 	.string	"ngroups"
-.LASF1656:
+.LASF1658:
 	.string	"free_file_info"
-.LASF1203:
+.LASF1205:
 	.string	"autask"
-.LASF2536:
+.LASF2538:
 	.string	"ipi_irqs"
-.LASF565:
+.LASF567:
 	.string	"user_namespace"
-.LASF2754:
+.LASF2756:
 	.string	"param_ops_ulong"
-.LASF3204:
+.LASF3209:
 	.string	"get_current"
 .LASF231:
 	.string	"raw_spinlock"
-.LASF1516:
+.LASF1518:
 	.string	"kswapd_wait"
-.LASF2285:
+.LASF2287:
 	.string	"timer_autosuspends"
-.LASF2880:
+.LASF2882:
 	.string	"EPD_PART_GLR16"
-.LASF2676:
+.LASF2678:
 	.string	"KCOMPACTD_MIGRATE_SCANNED"
-.LASF1406:
+.LASF1408:
 	.string	"__rcu_head"
-.LASF1750:
+.LASF1752:
 	.string	"sect_attrs"
-.LASF2756:
+.LASF2758:
 	.string	"param_ops_charp"
-.LASF1710:
+.LASF1712:
 	.string	"quota_off"
-.LASF349:
+.LASF351:
 	.string	"fault_address"
-.LASF1604:
+.LASF1606:
 	.string	"dq_inuse"
-.LASF3095:
+.LASF3096:
 	.string	"direct_mode_data_change_part"
-.LASF1639:
+.LASF1641:
 	.string	"dqi_flags"
-.LASF2651:
+.LASF2653:
 	.string	"PGREFILL"
-.LASF2760:
+.LASF2762:
 	.string	"param_ops_bint"
-.LASF3237:
-	.string	"ebc_add_to_dsp_buf_list"
 .LASF3242:
+	.string	"ebc_add_to_dsp_buf_list"
+.LASF3247:
 	.string	"kfree"
-.LASF1800:
+.LASF1802:
 	.string	"swap_deactivate"
-.LASF2935:
+.LASF2939:
 	.string	"gdck_sta"
-.LASF1141:
+.LASF1143:
 	.string	"request_queue"
-.LASF1474:
+.LASF1476:
 	.string	"WORKINGSET_REFAULT"
-.LASF1638:
+.LASF1640:
 	.string	"dqi_dirty_list"
 .LASF229:
 	.string	"prove_locking"
-.LASF2789:
+.LASF2791:
 	.string	"mod_tree_node"
-.LASF2583:
+.LASF2585:
 	.string	"regfunc"
 .LASF241:
 	.string	"code"
-.LASF652:
+.LASF654:
 	.string	"gtime"
-.LASF570:
+.LASF572:
 	.string	"debug_locks"
-.LASF2997:
+.LASF3001:
 	.string	"auto_buf_sema"
-.LASF1781:
+.LASF1783:
 	.string	"readpage"
-.LASF2669:
+.LASF2671:
 	.string	"COMPACTMIGRATE_SCANNED"
-.LASF393:
+.LASF395:
 	.string	"dummy"
-.LASF2382:
+.LASF2384:
 	.string	"need_for_probe"
 .LASF219:
 	.string	"locked_pending"
-.LASF1177:
+.LASF1179:
 	.string	"nr_deferred"
-.LASF1875:
+.LASF1877:
 	.string	"fown_struct"
-.LASF1985:
+.LASF1987:
 	.string	"perm"
-.LASF712:
+.LASF714:
 	.string	"compat_robust_list"
-.LASF2954:
+.LASF2958:
 	.string	"ebc_buffer_phy"
-.LASF2475:
+.LASF2477:
 	.string	"unmap"
-.LASF2009:
+.LASF2011:
 	.string	"ktype"
-.LASF382:
+.LASF384:
 	.string	"lockref"
-.LASF2254:
+.LASF2256:
 	.string	"in_dpm_list"
-.LASF1821:
+.LASF1823:
 	.string	"bd_invalidated"
-.LASF1094:
+.LASF1096:
 	.string	"mm_struct"
-.LASF1429:
+.LASF1431:
 	.string	"ki_hint"
-.LASF418:
+.LASF420:
 	.string	"i_uid"
 .LASF85:
 	.string	"alternatives_applied"
-.LASF595:
+.LASF597:
 	.string	"boost_expires"
-.LASF2906:
+.LASF2910:
 	.string	"DMA_BIDIRECTIONAL"
-.LASF3260:
+.LASF3265:
 	.string	"__arch_copy_to_user"
 .LASF235:
 	.string	"spinlock"
-.LASF767:
+.LASF769:
 	.string	"arch_timer_erratum_workaround"
-.LASF553:
+.LASF555:
 	.string	"pid_namespace"
-.LASF931:
+.LASF933:
 	.string	"_syscall"
-.LASF2767:
+.LASF2769:
 	.string	"mod_arch_specific"
-.LASF2530:
+.LASF2532:
 	.string	"max_write_len"
-.LASF469:
+.LASF471:
 	.string	"d_compare"
-.LASF969:
+.LASF971:
 	.string	"vm_mm"
-.LASF3079:
+.LASF3083:
 	.string	"need_refresh"
-.LASF2818:
+.LASF2820:
 	.string	"platform_bus_type"
-.LASF3096:
+.LASF3097:
 	.string	"data_buf"
-.LASF3033:
+.LASF3037:
 	.string	"ulogo_buf"
-.LASF1635:
+.LASF1637:
 	.string	"mem_dqinfo"
 .LASF18:
 	.string	"true"
-.LASF453:
+.LASF455:
 	.string	"i_count"
-.LASF868:
+.LASF870:
 	.string	"HRTIMER_NORESTART"
-.LASF367:
+.LASF369:
 	.string	"__cpu_online_mask"
-.LASF1822:
+.LASF1824:
 	.string	"bd_disk"
-.LASF813:
+.LASF815:
 	.string	"WORK_OFFQ_POOL_BITS"
-.LASF1903:
+.LASF1905:
 	.string	"fl_fasync"
-.LASF3137:
+.LASF3142:
 	.string	"update_mode"
-.LASF2933:
+.LASF2937:
 	.string	"direct_mode"
-.LASF2409:
+.LASF2411:
 	.string	"cache_sync"
-.LASF433:
+.LASF435:
 	.string	"i_lock"
-.LASF2969:
+.LASF2973:
 	.string	"ebc_dsp_buf_status"
-.LASF405:
+.LASF407:
 	.string	"d_name"
-.LASF731:
+.LASF733:
 	.string	"trace"
-.LASF2149:
+.LASF2151:
 	.string	"get_ownership"
-.LASF2682:
+.LASF2684:
 	.string	"UNEVICTABLE_PGMUNLOCKED"
 .LASF194:
 	.string	"ufds"
-.LASF1348:
+.LASF1350:
 	.string	"exe_file"
-.LASF1170:
+.LASF1172:
 	.string	"nr_scanned"
-.LASF644:
+.LASF646:
 	.string	"pid_links"
-.LASF1204:
+.LASF1206:
 	.string	"vaddr"
-.LASF2288:
+.LASF2290:
 	.string	"request"
-.LASF1508:
+.LASF1510:
 	.string	"pglist_data"
-.LASF1772:
+.LASF1774:
 	.string	"rw_hint"
-.LASF2548:
+.LASF2550:
 	.string	"IRQ_POLL_SOFTIRQ"
-.LASF1064:
+.LASF1066:
 	.string	"timeout"
-.LASF670:
+.LASF672:
 	.string	"last_switch_time"
-.LASF563:
+.LASF565:
 	.string	"fs_overflowuid"
-.LASF2922:
+.LASF2926:
 	.string	"start_info"
-.LASF2691:
+.LASF2693:
 	.string	"vm_zone_stat"
-.LASF2826:
+.LASF2828:
 	.string	"init_thread_union"
-.LASF1672:
+.LASF1674:
 	.string	"qc_dqblk"
-.LASF2118:
+.LASF2120:
 	.string	"mmapped"
-.LASF2275:
+.LASF2277:
 	.string	"child_count"
-.LASF1940:
+.LASF1942:
 	.string	"kill_sb"
-.LASF409:
+.LASF411:
 	.string	"d_op"
-.LASF2515:
+.LASF2517:
 	.string	"unlock_bus"
-.LASF1374:
+.LASF1376:
 	.string	"MIGRATE_ASYNC"
-.LASF355:
+.LASF357:
 	.string	"__sched_text_end"
-.LASF436:
+.LASF438:
 	.string	"i_write_hint"
-.LASF1112:
+.LASF1114:
 	.string	"process_keyring"
-.LASF2579:
+.LASF2581:
 	.string	"page_ext_operations"
-.LASF2661:
+.LASF2663:
 	.string	"KSWAPD_HIGH_WMARK_HIT_QUICKLY"
-.LASF3044:
+.LASF3048:
 	.string	"ebc_state_read"
-.LASF3249:
+.LASF3254:
 	.string	"__stack_chk_fail"
-.LASF2904:
+.LASF2908:
 	.string	"pmic_set_vcom"
-.LASF2697:
+.LASF2699:
 	.string	"stack_guard_gap"
-.LASF3196:
+.LASF3201:
 	.string	"bytes"
-.LASF1736:
+.LASF1738:
 	.string	"gpl_future_crcs"
-.LASF1022:
+.LASF1024:
 	.string	"wait_start"
-.LASF1445:
+.LASF1447:
 	.string	"nr_free"
 .LASF271:
 	.string	"cpu_hwcaps"
-.LASF387:
+.LASF389:
 	.string	"slash_name"
 .LASF124:
 	.string	"show_fdinfo"
-.LASF2800:
+.LASF2802:
 	.string	"fixup"
-.LASF383:
+.LASF385:
 	.string	"hash"
-.LASF1244:
+.LASF1246:
 	.string	"freelist"
-.LASF1841:
+.LASF1843:
 	.string	"posix_acl"
 .LASF244:
 	.string	"static_key_mod"
 .LASF167:
 	.string	"bug_addr_disp"
-.LASF1641:
+.LASF1643:
 	.string	"dqi_igrace"
-.LASF2191:
+.LASF2193:
 	.string	"thaw_noirq"
-.LASF967:
+.LASF969:
 	.string	"vm_rb"
-.LASF3017:
+.LASF3021:
 	.string	"kernel_read_file_str"
-.LASF566:
+.LASF568:
 	.string	"init_user_ns"
-.LASF2445:
+.LASF2447:
 	.string	"add_links"
-.LASF2172:
+.LASF2174:
 	.string	"pm_message_t"
-.LASF2924:
+.LASF2928:
 	.string	"xen_dma_ops"
-.LASF1442:
+.LASF1444:
 	.string	"page_group_by_mobility_disabled"
-.LASF2371:
+.LASF2373:
 	.string	"secondary"
-.LASF2369:
+.LASF2371:
 	.string	"segment_boundary_mask"
-.LASF1465:
+.LASF1467:
 	.string	"NR_INACTIVE_ANON"
 .LASF245:
 	.string	"static_key"
-.LASF965:
+.LASF967:
 	.string	"vm_next"
-.LASF2331:
+.LASF2333:
 	.string	"remove"
-.LASF492:
+.LASF494:
 	.string	"s_magic"
-.LASF1081:
+.LASF1083:
 	.string	"dl_overrun"
-.LASF2396:
+.LASF2398:
 	.string	"alloc"
 .LASF294:
 	.string	"__entry_text_start"
-.LASF749:
+.LASF751:
 	.string	"sys_tz"
-.LASF2389:
+.LASF2391:
 	.string	"revmap_direct_max_irq"
-.LASF780:
+.LASF782:
 	.string	"jiffies_64"
-.LASF2059:
+.LASF2061:
 	.string	"payload"
-.LASF1387:
+.LASF1389:
 	.string	"cb_state"
-.LASF2916:
+.LASF2920:
 	.string	"orig_nents"
-.LASF3058:
+.LASF3062:
 	.string	"buf_addr"
-.LASF410:
+.LASF412:
 	.string	"d_sb"
-.LASF667:
+.LASF669:
 	.string	"comm"
 .LASF293:
 	.string	"__kprobes_text_end"
-.LASF2302:
+.LASF2304:
 	.string	"last_time"
-.LASF547:
+.LASF549:
 	.string	"PIDTYPE_PID"
-.LASF981:
+.LASF983:
 	.string	"events"
-.LASF2230:
+.LASF2232:
 	.string	"offline"
-.LASF1863:
+.LASF1865:
 	.string	"atomic_open"
-.LASF1571:
+.LASF1573:
 	.string	"_zonerefs"
 .LASF142:
 	.string	"panic_on_unrecovered_nmi"
-.LASF1233:
+.LASF1235:
 	.string	"private_lock"
-.LASF431:
+.LASF433:
 	.string	"i_mtime"
-.LASF2602:
+.LASF2604:
 	.string	"dev_page_fault_t"
-.LASF3089:
+.LASF3090:
 	.string	"ebc_auto_tast_function"
 .LASF24:
 	.string	"__kernel_gid32_t"
-.LASF1459:
+.LASF1461:
 	.string	"NR_BOUNCE"
-.LASF1282:
+.LASF1284:
 	.string	"f_cred"
-.LASF2786:
+.LASF2788:
 	.string	"MODULE_STATE_COMING"
-.LASF2229:
+.LASF2231:
 	.string	"offline_disabled"
-.LASF3180:
+.LASF3185:
 	.string	"of_property_read_u32_array"
-.LASF2474:
+.LASF2476:
 	.string	"select"
 .LASF88:
 	.string	"linux_banner"
-.LASF2385:
+.LASF2387:
 	.string	"host_data"
-.LASF2759:
+.LASF2761:
 	.string	"param_ops_invbool"
-.LASF2514:
+.LASF2516:
 	.string	"trylock_bus"
 .LASF108:
 	.string	"mmap"
 .LASF281:
 	.string	"__bss_stop"
-.LASF1897:
+.LASF1899:
 	.string	"fl_pid"
-.LASF2717:
+.LASF2719:
 	.string	"d_un"
-.LASF1350:
+.LASF1352:
 	.string	"async_put_work"
-.LASF2114:
+.LASF2116:
 	.string	"kernfs_syscall_ops"
-.LASF2979:
+.LASF2983:
 	.string	"ebc_last_display"
-.LASF1855:
+.LASF1857:
 	.string	"mknod"
 .LASF151:
 	.string	"SYSTEM_BOOTING"
-.LASF1598:
+.LASF1600:
 	.string	"max_freq_scale"
-.LASF2917:
+.LASF2921:
 	.string	"dma_direct_ops"
-.LASF2250:
+.LASF2252:
 	.string	"dev_pm_info"
 .LASF27:
 	.string	"__kernel_loff_t"
-.LASF2314:
+.LASF2316:
 	.string	"detach"
 .LASF117:
 	.string	"get_unmapped_area"
-.LASF1261:
+.LASF1263:
 	.string	"dev_pagemap"
-.LASF2646:
+.LASF2648:
 	.string	"PGDEACTIVATE"
-.LASF3102:
+.LASF3104:
 	.string	"buffer_old_tmp"
-.LASF1782:
+.LASF1784:
 	.string	"writepages"
-.LASF1021:
+.LASF1023:
 	.string	"sched_statistics"
 .LASF135:
 	.string	"head"
-.LASF1504:
+.LASF1506:
 	.string	"reclaim_stat"
-.LASF2839:
+.LASF2841:
 	.string	"epd_lut_type"
-.LASF2539:
+.LASF2541:
 	.string	"nmi_ctx"
-.LASF1142:
+.LASF1144:
 	.string	"uprobe_task"
-.LASF1801:
+.LASF1803:
 	.string	"writeback_control"
-.LASF1902:
+.LASF1904:
 	.string	"fl_end"
-.LASF3263:
+.LASF3268:
 	.string	"ebc_find_buf_by_phy_addr"
-.LASF1949:
+.LASF1951:
 	.string	"super_operations"
-.LASF392:
+.LASF394:
 	.string	"want_pages"
-.LASF2943:
+.LASF2947:
 	.string	"regmap_base"
-.LASF336:
+.LASF338:
 	.string	"wps_disabled"
-.LASF2402:
+.LASF2404:
 	.string	"unmap_sg"
-.LASF2858:
-	.string	"buf_dsp"
 .LASF2860:
+	.string	"buf_dsp"
+.LASF2862:
 	.string	"buf_error"
-.LASF1020:
+.LASF1022:
 	.string	"util_avg"
-.LASF756:
+.LASF758:
 	.string	"task"
-.LASF596:
+.LASF598:
 	.string	"sched_task_group"
-.LASF2841:
+.LASF2843:
 	.string	"WF_TYPE_GRAY16"
-.LASF2185:
+.LASF2187:
 	.string	"thaw_early"
-.LASF675:
+.LASF677:
 	.string	"blocked"
-.LASF426:
+.LASF428:
 	.string	"i_security"
-.LASF2642:
+.LASF2644:
 	.string	"PGSCAN_SKIP_NORMAL"
-.LASF2915:
+.LASF2919:
 	.string	"nents"
-.LASF754:
+.LASF756:
 	.string	"__smp_cross_call"
-.LASF2768:
+.LASF2770:
 	.string	"core"
-.LASF1813:
+.LASF1815:
 	.string	"bd_holders"
-.LASF3093:
+.LASF3094:
 	.string	"reset_and_flip"
-.LASF2944:
+.LASF2948:
 	.string	"enable"
-.LASF953:
+.LASF955:
 	.string	"pipe_bufs"
-.LASF3201:
+.LASF3206:
 	.string	"to_user"
-.LASF2122:
+.LASF2124:
 	.string	"KOBJ_NS_TYPE_NET"
 .LASF295:
 	.string	"__entry_text_end"
-.LASF1369:
+.LASF1371:
 	.string	"fe_length"
-.LASF1688:
+.LASF1690:
 	.string	"d_rt_spc_warns"
-.LASF464:
+.LASF308:
+	.string	"__noinstr_text_start"
+.LASF466:
 	.string	"i_verity_info"
 .LASF180:
 	.string	"timespec_type"
-.LASF849:
+.LASF851:
 	.string	"__rb_parent_color"
-.LASF2222:
+.LASF2224:
 	.string	"devres_lock"
-.LASF3124:
+.LASF3129:
 	.string	"new_buffer_refresh"
-.LASF363:
+.LASF365:
 	.string	"bits"
-.LASF558:
+.LASF560:
 	.string	"init_struct_pid"
-.LASF2031:
+.LASF2033:
 	.string	"child"
-.LASF1106:
+.LASF1108:
 	.string	"cap_inheritable"
-.LASF1386:
+.LASF1388:
 	.string	"gp_wait"
-.LASF1843:
+.LASF1845:
 	.string	"lookup"
-.LASF1588:
+.LASF1590:
 	.string	"cpu_topology"
-.LASF3205:
+.LASF3210:
 	.string	"sp_el0"
-.LASF3267:
+.LASF3272:
 	.string	"ebc_dsp_buf_get"
-.LASF2893:
+.LASF2897:
 	.string	"panel_color"
-.LASF1894:
+.LASF1896:
 	.string	"fl_owner"
-.LASF2849:
+.LASF2851:
 	.string	"WF_TYPE_GLD16"
-.LASF2991:
+.LASF2995:
 	.string	"is_power_off"
-.LASF977:
+.LASF979:
 	.string	"vm_private_data"
-.LASF1942:
+.LASF1944:
 	.string	"s_lock_key"
-.LASF1198:
+.LASF1200:
 	.string	"uprobe_task_state"
 .LASF206:
 	.string	"ttbr0"
-.LASF2145:
+.LASF2147:
 	.string	"kobj_type"
-.LASF2620:
+.LASF2622:
 	.string	"sysctl_overcommit_kbytes"
-.LASF2963:
+.LASF2967:
 	.string	"frame_left"
-.LASF2477:
+.LASF2479:
 	.string	"deactivate"
-.LASF2844:
+.LASF2846:
 	.string	"WF_TYPE_AUTO"
-.LASF1225:
+.LASF1227:
 	.string	"i_pages"
-.LASF3164:
+.LASF3169:
 	.string	"safe_ptr"
-.LASF374:
+.LASF376:
 	.string	"hlist_bl_head"
-.LASF1694:
+.LASF1696:
 	.string	"ino_warnlimit"
-.LASF1517:
+.LASF1519:
 	.string	"pfmemalloc_wait"
 .LASF114:
 	.string	"fasync"
-.LASF1707:
+.LASF1709:
 	.string	"i_rt_spc_warnlimit"
-.LASF1367:
+.LASF1369:
 	.string	"fe_logical"
-.LASF804:
+.LASF806:
 	.string	"WORK_NO_COLOR"
-.LASF983:
+.LASF985:
 	.string	"page_frag"
-.LASF994:
+.LASF996:
 	.string	"write_bytes"
-.LASF1994:
+.LASF1996:
 	.string	"fi_extents_mapped"
-.LASF1480:
+.LASF1482:
 	.string	"NR_FILE_PAGES"
 .LASF2:
 	.string	"char"
-.LASF952:
+.LASF954:
 	.string	"unix_inflight"
-.LASF1724:
+.LASF1726:
 	.string	"holders_dir"
-.LASF3060:
+.LASF3064:
 	.string	"__wq_entry"
-.LASF3074:
+.LASF3078:
 	.string	"new_buffer"
-.LASF461:
+.LASF463:
 	.string	"i_fsnotify_mask"
-.LASF2660:
+.LASF2662:
 	.string	"KSWAPD_LOW_WMARK_HIT_QUICKLY"
-.LASF992:
+.LASF994:
 	.string	"syscfs"
-.LASF3157:
+.LASF3162:
 	.string	"wake_unlock"
-.LASF2443:
+.LASF2445:
 	.string	"graph_get_port_parent"
-.LASF2680:
+.LASF2682:
 	.string	"UNEVICTABLE_PGRESCUED"
-.LASF2207:
+.LASF2209:
 	.string	"msi_list"
-.LASF3207:
+.LASF3212:
 	.string	"__ilog2_u64"
-.LASF545:
+.LASF547:
 	.string	"compat_time_t"
-.LASF397:
+.LASF399:
 	.string	"d_alias"
-.LASF1484:
+.LASF1486:
 	.string	"NR_SHMEM"
-.LASF362:
+.LASF364:
 	.string	"cpumask"
-.LASF2165:
+.LASF2167:
 	.string	"n_klist"
-.LASF1308:
+.LASF1310:
 	.string	"dumper"
-.LASF1737:
+.LASF1739:
 	.string	"num_gpl_future_syms"
-.LASF2273:
+.LASF2275:
 	.string	"wakeirq"
-.LASF845:
+.LASF847:
 	.string	"plist_node"
-.LASF1108:
+.LASF1110:
 	.string	"cap_effective"
-.LASF1744:
+.LASF1746:
 	.string	"taints"
-.LASF3223:
+.LASF3228:
 	.string	"of_address_to_resource"
-.LASF1010:
+.LASF1012:
 	.string	"enqueued"
-.LASF1001:
+.LASF1003:
 	.string	"sum_exec_runtime"
 .LASF165:
 	.string	"hex_asc_upper"
-.LASF504:
+.LASF506:
 	.string	"s_roots"
-.LASF2905:
+.LASF2909:
 	.string	"dma_data_direction"
-.LASF1687:
+.LASF1689:
 	.string	"d_rt_spc_timer"
-.LASF1955:
+.LASF1957:
 	.string	"evict_inode"
-.LASF1488:
+.LASF1490:
 	.string	"NR_UNSTABLE_NFS"
-.LASF2452:
+.LASF2454:
 	.string	"length"
-.LASF1581:
+.LASF1583:
 	.string	"sysctl_lowmem_reserve_ratio"
-.LASF2154:
+.LASF2156:
 	.string	"buflen"
-.LASF1826:
+.LASF1828:
 	.string	"bd_private"
-.LASF1901:
+.LASF1903:
 	.string	"fl_start"
-.LASF3179:
+.LASF3184:
 	.string	"out_value"
-.LASF1959:
+.LASF1961:
 	.string	"freeze_fs"
-.LASF907:
+.LASF909:
 	.string	"sigset_t"
-.LASF1915:
+.LASF1917:
 	.string	"lm_notify"
-.LASF3136:
+.LASF3141:
 	.string	"ebc_tcon_dsp_mode_set"
-.LASF878:
+.LASF880:
 	.string	"running"
-.LASF721:
+.LASF723:
 	.string	"rseq_event_mask"
-.LASF493:
+.LASF495:
 	.string	"s_root"
-.LASF1880:
+.LASF1882:
 	.string	"ra_pages"
 .LASF74:
 	.string	"aarch32_opcode_cond_checks"
 .LASF183:
 	.string	"TT_COMPAT"
-.LASF862:
+.LASF864:
 	.string	"pcpu_fc_names"
-.LASF2370:
+.LASF2372:
 	.string	"fwnode_handle"
-.LASF2726:
+.LASF2728:
 	.string	"Elf64_Sym"
-.LASF2093:
+.LASF2095:
 	.string	"syscall_ops"
-.LASF476:
+.LASF478:
 	.string	"d_automount"
-.LASF1263:
+.LASF1265:
 	.string	"page_free"
-.LASF3090:
+.LASF3091:
 	.string	"__val"
-.LASF1479:
+.LASF1481:
 	.string	"NR_FILE_MAPPED"
-.LASF637:
+.LASF639:
 	.string	"parent"
-.LASF1162:
+.LASF1164:
 	.string	"atime"
 .LASF125:
 	.string	"copy_file_range"
-.LASF2683:
+.LASF2685:
 	.string	"UNEVICTABLE_PGCLEARED"
-.LASF3253:
+.LASF3258:
 	.string	"epd_lut_get_wf_version"
-.LASF2045:
+.LASF2047:
 	.string	"key_type"
-.LASF795:
+.LASF797:
 	.string	"WORK_STRUCT_LINKED_BIT"
-.LASF3198:
+.LASF3203:
 	.string	"copy_overflow"
-.LASF2439:
+.LASF2441:
 	.string	"get_named_child_node"
-.LASF2256:
+.LASF2258:
 	.string	"is_suspended"
-.LASF2913:
+.LASF2917:
 	.string	"dma_length"
-.LASF2064:
+.LASF2066:
 	.string	"burst"
-.LASF1965:
+.LASF1967:
 	.string	"clone_mnt_data"
-.LASF2775:
+.LASF2777:
 	.string	"module_kobject"
-.LASF3038:
+.LASF3042:
 	.string	"memory"
-.LASF3171:
+.LASF3176:
 	.string	"order"
-.LASF737:
+.LASF739:
 	.string	"active_memcg"
-.LASF1330:
+.LASF1332:
 	.string	"def_flags"
-.LASF2995:
+.LASF2999:
 	.string	"global_ebc"
-.LASF1471:
+.LASF1473:
 	.string	"NR_SLAB_UNRECLAIMABLE"
-.LASF1124:
+.LASF1126:
 	.string	"refcount"
-.LASF1788:
+.LASF1790:
 	.string	"invalidatepage"
-.LASF3064:
+.LASF3068:
 	.string	"ebc_frame_timeout"
-.LASF361:
+.LASF363:
 	.string	"wait_queue_head_t"
-.LASF1268:
+.LASF1270:
 	.string	"page_type"
-.LASF2047:
+.LASF2049:
 	.string	"rcu_data0"
-.LASF1109:
+.LASF1111:
 	.string	"cap_bset"
-.LASF891:
+.LASF893:
 	.string	"nr_hangs"
-.LASF2251:
+.LASF2253:
 	.string	"power_state"
-.LASF742:
+.LASF744:
 	.string	"stack_vm_area"
-.LASF2817:
+.LASF2819:
 	.string	"mfd_cell"
-.LASF2883:
+.LASF2885:
 	.string	"EPD_A2"
-.LASF2100:
+.LASF2102:
 	.string	"kernfs_elem_attr"
-.LASF3077:
+.LASF3081:
 	.string	"new_buffer_temp"
-.LASF2297:
+.LASF2299:
 	.string	"set_latency_tolerance"
-.LASF571:
+.LASF573:
 	.string	"debug_locks_silent"
-.LASF1351:
+.LASF1353:
 	.string	"linux_binfmt"
 .LASF141:
 	.string	"panic_on_oops"
 .LASF270:
 	.string	"arm64_ftr_reg_ctrel0"
-.LASF1242:
+.LASF1244:
 	.string	"counters"
-.LASF3214:
+.LASF3219:
 	.string	"kasan_check_read"
-.LASF2057:
+.LASF2059:
 	.string	"name_link"
-.LASF540:
+.LASF542:
 	.string	"d_canonical_path"
 .LASF190:
 	.string	"compat_timespec"
-.LASF1487:
+.LASF1489:
 	.string	"NR_ANON_THPS"
-.LASF729:
+.LASF731:
 	.string	"timer_slack_ns"
-.LASF1911:
+.LASF1913:
 	.string	"lm_compare_owner"
-.LASF2322:
+.LASF2324:
 	.string	"bus_type"
-.LASF597:
+.LASF599:
 	.string	"policy"
-.LASF1291:
+.LASF1293:
 	.string	"shared"
-.LASF3011:
+.LASF3015:
 	.string	"ebc_match"
-.LASF2942:
+.LASF2946:
 	.string	"dclk"
-.LASF2215:
+.LASF2217:
 	.string	"dma_mem"
-.LASF356:
+.LASF358:
 	.string	"wait_queue_entry"
-.LASF2317:
+.LASF2319:
 	.string	"dismiss"
-.LASF2024:
+.LASF2026:
 	.string	"simple_dentry_operations"
-.LASF929:
+.LASF931:
 	.string	"_band"
-.LASF593:
+.LASF595:
 	.string	"boost"
-.LASF2104:
+.LASF2106:
 	.string	"seq_start"
-.LASF2808:
+.LASF2810:
 	.string	"module_sysfs_initialized"
-.LASF1000:
+.LASF1002:
 	.string	"task_cputime"
-.LASF2966:
+.LASF2970:
 	.string	"lut_addr"
-.LASF1194:
+.LASF1196:
 	.string	"rnode"
 .LASF232:
 	.string	"raw_lock"
 .LASF75:
 	.string	"__con_initcall_start"
-.LASF1715:
+.LASF1717:
 	.string	"get_dqblk"
-.LASF3023:
+.LASF3027:
 	.string	"ebc_tcon_node"
-.LASF2815:
+.LASF2817:
 	.string	"id_entry"
-.LASF1794:
+.LASF1796:
 	.string	"putback_page"
-.LASF2534:
+.LASF2536:
 	.string	"nr_irqs"
-.LASF892:
+.LASF894:
 	.string	"max_hang_time"
-.LASF3160:
+.LASF3165:
 	.string	"copy_from_user"
-.LASF2465:
+.LASF2467:
 	.string	"DOMAIN_BUS_ANY"
-.LASF2069:
+.LASF2071:
 	.string	"root_user"
-.LASF2088:
+.LASF2090:
 	.string	"subdirs"
-.LASF2884:
+.LASF2886:
 	.string	"EPD_DU"
-.LASF1881:
+.LASF1883:
 	.string	"mmap_miss"
-.LASF1652:
+.LASF1654:
 	.string	"quota_format_ops"
-.LASF3265:
+.LASF3270:
 	.string	"ebc_osd_buf_get"
-.LASF3055:
+.LASF3059:
 	.string	"argp"
-.LASF1752:
+.LASF1754:
 	.string	"args"
 .LASF33:
 	.string	"__poll_t"
-.LASF2431:
+.LASF2433:
 	.string	"fwnode_operations"
-.LASF1003:
+.LASF1005:
 	.string	"run_delay"
-.LASF1996:
+.LASF1998:
 	.string	"fi_extents_start"
-.LASF2925:
+.LASF2929:
 	.string	"dummy_dma_ops"
 .LASF238:
 	.string	"static_key_initialized"
-.LASF2782:
+.LASF2784:
 	.string	"module_uevent"
-.LASF3068:
+.LASF3072:
 	.string	"is_full_mode"
-.LASF2595:
+.LASF2597:
 	.string	"base_pfn"
 .LASF261:
 	.string	"width"
-.LASF927:
+.LASF929:
 	.string	"_addr_pkey"
-.LASF3051:
+.LASF3055:
 	.string	"waveform_buffer"
 .LASF296:
 	.string	"__start_rodata"
-.LASF1466:
+.LASF1468:
 	.string	"NR_ACTIVE_ANON"
-.LASF2928:
+.LASF2932:
 	.string	"tcon"
-.LASF1113:
+.LASF1115:
 	.string	"thread_keyring"
-.LASF2743:
+.LASF2745:
 	.string	"kparam_array"
-.LASF3216:
+.LASF3221:
 	.string	"platform_driver_unregister"
-.LASF650:
+.LASF652:
 	.string	"utime"
-.LASF1332:
+.LASF1334:
 	.string	"start_code"
-.LASF3012:
+.LASF3016:
 	.string	"ebc_driver"
-.LASF2603:
+.LASF2605:
 	.string	"dev_page_free_t"
-.LASF3177:
+.LASF3182:
 	.string	"of_property_read_u32"
-.LASF1396:
+.LASF1398:
 	.string	"guid_t"
 .LASF146:
 	.string	"sysctl_panic_on_stackoverflow"
-.LASF1892:
+.LASF1894:
 	.string	"fl_link"
-.LASF2247:
+.LASF2249:
 	.string	"clock_list"
-.LASF1585:
+.LASF1587:
 	.string	"section_mem_map"
-.LASF2135:
+.LASF309:
+	.string	"__noinstr_text_end"
+.LASF2137:
 	.string	"attrs"
 .LASF176:
 	.string	"tz_minuteswest"
-.LASF2457:
+.LASF2459:
 	.string	"of_chosen"
-.LASF3091:
+.LASF3092:
 	.string	"ebc_frame_start"
-.LASF346:
+.LASF348:
 	.string	"sve_state"
-.LASF1558:
+.LASF1560:
 	.string	"percpu_drift_mark"
-.LASF364:
+.LASF366:
 	.string	"cpumask_t"
 .LASF133:
 	.string	"kmsg_fops"
-.LASF3262:
+.LASF3267:
 	.string	"ebc_buf_release"
-.LASF817:
+.LASF819:
 	.string	"WORK_STRUCT_NO_POOL"
-.LASF1631:
+.LASF1633:
 	.string	"dqb_isoftlimit"
-.LASF2531:
+.LASF2533:
 	.string	"max_read_len"
-.LASF599:
+.LASF601:
 	.string	"cpus_allowed"
-.LASF1287:
+.LASF1289:
 	.string	"f_tfile_llink"
-.LASF1811:
+.LASF1813:
 	.string	"bd_claiming"
-.LASF2175:
+.LASF2177:
 	.string	"complete"
-.LASF2864:
+.LASF2866:
 	.string	"tid_name"
-.LASF1062:
+.LASF1064:
 	.string	"sched_rt_entity"
 .LASF116:
 	.string	"sendpage"
-.LASF3130:
+.LASF3135:
 	.string	"ret_val"
-.LASF864:
+.LASF866:
 	.string	"timerqueue_node"
 .LASF257:
 	.string	"sign"
-.LASF1625:
+.LASF1627:
 	.string	"mem_dqblk"
-.LASF2770:
+.LASF2772:
 	.string	"plt_entry"
-.LASF3138:
+.LASF3143:
 	.string	"display_mode"
-.LASF1978:
+.LASF1980:
 	.string	"nr_cached_objects"
-.LASF1438:
+.LASF1440:
 	.string	"ia_mtime"
-.LASF1167:
+.LASF1169:
 	.string	"shrink_control"
-.LASF1410:
+.LASF1412:
 	.string	"nr_files"
-.LASF2089:
+.LASF2091:
 	.string	"kernfs_root"
-.LASF727:
+.LASF729:
 	.string	"nr_dirtied_pause"
-.LASF1495:
+.LASF1497:
 	.string	"NR_ION_HEAP"
-.LASF2751:
+.LASF2753:
 	.string	"param_ops_int"
-.LASF936:
+.LASF938:
 	.string	"_sigchld"
-.LASF1820:
+.LASF1822:
 	.string	"bd_part_count"
-.LASF354:
+.LASF356:
 	.string	"__sched_text_start"
-.LASF2870:
+.LASF2872:
 	.string	"panel_refresh_mode"
 .LASF90:
 	.string	"linux_proc_banner"
-.LASF2571:
+.LASF2573:
 	.string	"fops"
-.LASF1271:
+.LASF1273:
 	.string	"f_path"
-.LASF3230:
+.LASF3235:
 	.string	"kthread_create_on_node"
-.LASF709:
+.LASF711:
 	.string	"cgroups"
-.LASF3163:
+.LASF3168:
 	.string	"__uaccess_mask_ptr"
-.LASF2342:
+.LASF2344:
 	.string	"probe_type"
-.LASF1808:
+.LASF1810:
 	.string	"bd_inode"
-.LASF2244:
+.LASF2246:
 	.string	"RPM_REQ_AUTOSUSPEND"
 .LASF267:
 	.string	"sys_val"
@@ -53142,1251 +54205,1253 @@ __exitcall_ebc_exit:
 	.string	"kptr_restrict"
 .LASF171:
 	.string	"time64_t"
-.LASF2504:
+.LASF2506:
 	.string	"userspace_clients"
-.LASF2141:
+.LASF2143:
 	.string	"uevent_seqnum"
-.LASF3226:
+.LASF3231:
 	.string	"memset"
-.LASF3135:
+.LASF3140:
 	.string	"cur_image_addr"
-.LASF2142:
+.LASF2144:
 	.string	"list_lock"
-.LASF2204:
+.LASF2206:
 	.string	"pm_domain"
-.LASF1095:
+.LASF1097:
 	.string	"cpu_bitmap"
-.LASF855:
+.LASF857:
 	.string	"pcpu_base_addr"
-.LASF1960:
+.LASF1962:
 	.string	"thaw_super"
-.LASF1009:
+.LASF1011:
 	.string	"util_est"
-.LASF1697:
+.LASF1699:
 	.string	"qc_state"
-.LASF2224:
+.LASF2226:
 	.string	"knode_class"
-.LASF1934:
+.LASF1936:
 	.string	"wait_unfrozen"
-.LASF2041:
+.LASF2043:
 	.string	"key_perm_t"
-.LASF2336:
+.LASF2338:
 	.string	"iommu_ops"
-.LASF896:
+.LASF898:
 	.string	"softirq_next_timer"
-.LASF1819:
+.LASF1821:
 	.string	"bd_part"
 .LASF118:
 	.string	"check_flags"
-.LASF1886:
+.LASF1888:
 	.string	"file_lock_operations"
-.LASF341:
+.LASF343:
 	.string	"tp_value"
-.LASF3020:
+.LASF3024:
 	.string	"ebc_remove"
-.LASF1891:
+.LASF1893:
 	.string	"fl_list"
-.LASF1267:
+.LASF1269:
 	.string	"_mapcount"
-.LASF887:
+.LASF889:
 	.string	"hang_detected"
-.LASF2147:
+.LASF2149:
 	.string	"child_ns_type"
-.LASF1646:
+.LASF1648:
 	.string	"qf_fmt_id"
-.LASF1048:
+.LASF1050:
 	.string	"nr_wakeups_idle"
-.LASF3270:
+.LASF3275:
 	.string	"up_write"
-.LASF1456:
+.LASF1458:
 	.string	"NR_MLOCK"
-.LASF2824:
+.LASF2826:
 	.string	"tasklist_lock"
 .LASF55:
 	.string	"phys_addr_t"
-.LASF1929:
+.LASF1931:
 	.string	"fa_fd"
-.LASF2563:
+.LASF2565:
 	.string	"MEMREMAP_WB"
-.LASF2700:
+.LASF2702:
 	.string	"sysctl_drop_caches"
-.LASF1971:
+.LASF1973:
 	.string	"show_devname"
-.LASF2937:
+.LASF2941:
 	.string	"panel_16bit"
-.LASF1320:
+.LASF1322:
 	.string	"page_table_lock"
-.LASF3010:
+.LASF3014:
 	.string	"ebc_pm"
-.LASF2838:
+.LASF2840:
 	.string	"sched_priority"
-.LASF1654:
+.LASF1656:
 	.string	"read_file_info"
-.LASF2596:
+.LASF2598:
 	.string	"reserve"
-.LASF1769:
+.LASF1771:
 	.string	"quota_info"
-.LASF1014:
+.LASF1016:
 	.string	"load_sum"
 .LASF91:
 	.string	"console_printk"
-.LASF700:
+.LASF702:
 	.string	"ioac"
-.LASF3191:
+.LASF3196:
 	.string	"__init_work"
-.LASF1169:
+.LASF1171:
 	.string	"nr_to_scan"
-.LASF2630:
+.LASF2632:
 	.string	"PGPGIN"
-.LASF1612:
+.LASF1614:
 	.string	"dq_off"
-.LASF1033:
+.LASF1035:
 	.string	"exec_max"
-.LASF1401:
+.LASF1403:
 	.string	"uuid_index"
-.LASF3192:
+.LASF3197:
 	.string	"onstack"
 .LASF189:
 	.string	"compat_rmtp"
-.LASF434:
+.LASF436:
 	.string	"i_bytes"
-.LASF2846:
+.LASF2848:
 	.string	"WF_TYPE_GC16"
-.LASF1924:
+.LASF1926:
 	.string	"nfs_fl"
-.LASF400:
+.LASF402:
 	.string	"dentry"
-.LASF2164:
+.LASF2166:
 	.string	"klist_node"
-.LASF1888:
+.LASF1890:
 	.string	"fl_release_private"
-.LASF2881:
+.LASF2883:
 	.string	"EPD_PART_GLD16"
 .LASF106:
 	.string	"unlocked_ioctl"
-.LASF1146:
+.LASF1148:
 	.string	"vm_struct"
-.LASF1307:
+.LASF1309:
 	.string	"nr_threads"
-.LASF1832:
+.LASF1834:
 	.string	"__i_nlink"
 .LASF144:
 	.string	"panic_on_warn"
-.LASF3062:
+.LASF3066:
 	.string	"ebc_panel_probe"
 .LASF79:
 	.string	"boot_command_line"
-.LASF2492:
+.LASF2494:
 	.string	"adapter"
-.LASF2464:
+.LASF2466:
 	.string	"irq_domain_bus_token"
-.LASF1449:
+.LASF1451:
 	.string	"NR_ZONE_LRU_BASE"
-.LASF2202:
+.LASF2204:
 	.string	"links"
-.LASF1866:
+.LASF1868:
 	.string	"bdi_writeback"
-.LASF1683:
+.LASF1685:
 	.string	"d_spc_warns"
-.LASF1038:
+.LASF1040:
 	.string	"nr_failed_migrations_hot"
-.LASF2929:
+.LASF2933:
 	.string	"pmic"
-.LASF1134:
+.LASF1136:
 	.string	"css_set"
-.LASF1400:
+.LASF1402:
 	.string	"guid_index"
-.LASF2968:
+.LASF2972:
 	.string	"ebc_irq_status"
-.LASF2542:
+.LASF2544:
 	.string	"force_irqthreads"
-.LASF1323:
+.LASF1325:
 	.string	"hiwater_rss"
-.LASF2162:
+.LASF2164:
 	.string	"power_kobj"
-.LASF489:
+.LASF491:
 	.string	"s_export_op"
-.LASF1834:
+.LASF1836:
 	.string	"i_rcu"
-.LASF2876:
+.LASF2878:
 	.string	"EPD_FULL_GLD16"
 .LASF155:
 	.string	"SYSTEM_POWER_OFF"
-.LASF745:
+.LASF747:
 	.string	"futex_exit_mutex"
-.LASF2491:
+.LASF2493:
 	.string	"i2c_client"
-.LASF1564:
+.LASF1566:
 	.string	"compact_blockskip_flush"
-.LASF1678:
+.LASF1680:
 	.string	"d_space"
-.LASF316:
+.LASF318:
 	.string	"__hibernate_exit_text_end"
-.LASF2169:
+.LASF2171:
 	.string	"pm_power_off_prepare"
-.LASF2052:
+.LASF2054:
 	.string	"graveyard_link"
-.LASF2820:
+.LASF2822:
 	.string	"platform_driver"
-.LASF1144:
+.LASF1146:
 	.string	"xol_vaddr"
 .LASF121:
 	.string	"splice_read"
-.LASF2708:
+.LASF2710:
 	.string	"Elf64_Addr"
-.LASF1686:
+.LASF1688:
 	.string	"d_rt_space"
 .LASF264:
 	.string	"name"
-.LASF3235:
+.LASF3240:
 	.string	"mod_timer"
 .LASF150:
 	.string	"early_boot_irqs_disabled"
-.LASF656:
+.LASF658:
 	.string	"nvcsw"
-.LASF3036:
+.LASF3040:
 	.string	"ebc_task_init"
-.LASF2830:
+.LASF2832:
 	.string	"KMALLOC_NORMAL"
-.LASF1085:
+.LASF1087:
 	.string	"exp_need_qs"
 .LASF249:
 	.string	"__stop___jump_table"
-.LASF1140:
+.LASF1142:
 	.string	"task_delay_info"
-.LASF1359:
+.LASF1361:
 	.string	"prealloc_pte"
-.LASF1453:
+.LASF1455:
 	.string	"NR_ZONE_ACTIVE_FILE"
-.LASF2387:
+.LASF2389:
 	.string	"bus_token"
-.LASF419:
+.LASF421:
 	.string	"i_gid"
-.LASF1617:
+.LASF1619:
 	.string	"quota_type"
-.LASF3098:
+.LASF3099:
 	.string	"buffer_old"
-.LASF1534:
+.LASF1536:
 	.string	"high"
-.LASF428:
+.LASF430:
 	.string	"i_rdev"
-.LASF2026:
+.LASF2028:
 	.string	"simple_dir_inode_operations"
-.LASF1920:
+.LASF1922:
 	.string	"nfs_lock_info"
-.LASF1371:
+.LASF1373:
 	.string	"fe_flags"
-.LASF685:
+.LASF687:
 	.string	"self_exec_id"
-.LASF1905:
+.LASF1907:
 	.string	"fl_downgrade_time"
-.LASF2975:
+.LASF2979:
 	.string	"auto_frame_count"
-.LASF2102:
+.LASF2104:
 	.string	"kernfs_ops"
-.LASF2972:
+.LASF2976:
 	.string	"auto_image_new"
-.LASF805:
+.LASF807:
 	.string	"WORK_CPU_UNBOUND"
-.LASF2785:
+.LASF2787:
 	.string	"MODULE_STATE_LIVE"
-.LASF1422:
+.LASF1424:
 	.string	"sysctl_protected_fifos"
-.LASF1057:
+.LASF1059:
 	.string	"nr_migrations"
-.LASF964:
+.LASF966:
 	.string	"vm_end"
-.LASF1964:
+.LASF1966:
 	.string	"remount_fs2"
-.LASF2081:
+.LASF2083:
 	.string	"iomem_resource"
-.LASF1895:
+.LASF1897:
 	.string	"fl_flags"
-.LASF2178:
+.LASF2180:
 	.string	"freeze"
-.LASF1455:
+.LASF1457:
 	.string	"NR_ZONE_WRITE_PENDING"
-.LASF1294:
+.LASF1296:
 	.string	"close"
-.LASF3118:
+.LASF3123:
 	.string	"image_fb_data"
-.LASF3034:
+.LASF3038:
 	.string	"klogo_buf"
-.LASF2888:
+.LASF2892:
 	.string	"EPD_POWER_OFF"
-.LASF1499:
+.LASF1501:
 	.string	"zone_reclaim_stat"
-.LASF2998:
+.LASF3002:
 	.string	"ebc_wq"
-.LASF734:
+.LASF736:
 	.string	"memcg_oom_gfp_mask"
-.LASF3194:
+.LASF3199:
 	.string	"_msecs_to_jiffies"
-.LASF1681:
+.LASF1683:
 	.string	"d_spc_timer"
-.LASF1757:
+.LASF1759:
 	.string	"jump_entries"
-.LASF3202:
+.LASF3207:
 	.string	"test_ti_thread_flag"
-.LASF2253:
+.LASF2255:
 	.string	"async_suspend"
-.LASF2628:
+.LASF2630:
 	.string	"compound_page_dtors"
-.LASF2004:
+.LASF2006:
 	.string	"read_pos"
-.LASF479:
+.LASF481:
 	.string	"super_block"
-.LASF3165:
+.LASF3170:
 	.string	"__addr"
-.LASF2320:
+.LASF2322:
 	.string	"dma_coherent"
-.LASF1069:
+.LASF1071:
 	.string	"sched_dl_entity"
-.LASF609:
+.LASF611:
 	.string	"rcu_tasks_holdout_list"
-.LASF1295:
+.LASF1297:
 	.string	"split"
-.LASF707:
+.LASF709:
 	.string	"cpuset_mem_spread_rotor"
-.LASF794:
+.LASF796:
 	.string	"WORK_STRUCT_PWQ_BIT"
-.LASF2037:
+.LASF2039:
 	.string	"assoc_array"
-.LASF564:
+.LASF566:
 	.string	"fs_overflowgid"
-.LASF1614:
+.LASF1616:
 	.string	"dq_dqb"
-.LASF2712:
+.LASF2714:
 	.string	"Elf64_Xword"
-.LASF985:
+.LASF987:
 	.string	"lock_class_key"
-.LASF1727:
+.LASF1729:
 	.string	"num_syms"
-.LASF2802:
+.LASF2804:
 	.string	"module_notes_attrs"
-.LASF2110:
+.LASF2112:
 	.string	"generation"
-.LASF551:
+.LASF553:
 	.string	"PIDTYPE_MAX"
-.LASF2766:
+.LASF2768:
 	.string	"plt_max_entries"
-.LASF2401:
+.LASF2403:
 	.string	"map_sg"
-.LASF2967:
-	.string	"buffer_need_check"
-.LASF1157:
+.LASF1159:
 	.string	"nlink"
-.LASF3029:
+.LASF3033:
 	.string	"ulogo_addr_valid"
-.LASF2575:
+.LASF2577:
 	.string	"percpu_ref"
 .LASF92:
 	.string	"devkmsg_log_str"
 .LASF254:
 	.string	"FTR_HIGHER_SAFE"
-.LASF3176:
+.LASF3181:
 	.string	"i2c_get_clientdata"
-.LASF3161:
+.LASF3166:
 	.string	"_copy_to_user"
-.LASF3209:
+.LASF3214:
 	.string	"test_bit"
 .LASF248:
 	.string	"__start___jump_table"
-.LASF781:
+.LASF783:
 	.string	"jiffies"
-.LASF2272:
+.LASF2274:
 	.string	"wait_queue"
-.LASF1644:
+.LASF1646:
 	.string	"dqi_priv"
-.LASF615:
+.LASF617:
 	.string	"rss_stat"
-.LASF706:
+.LASF708:
 	.string	"mems_allowed_seq"
-.LASF1768:
+.LASF1770:
 	.string	"refcnt"
-.LASF3081:
+.LASF3084:
 	.string	"pbuf_new"
-.LASF2179:
+.LASF2181:
 	.string	"thaw"
-.LASF1716:
+.LASF1718:
 	.string	"get_nextdqblk"
-.LASF515:
+.LASF517:
 	.string	"s_fs_info"
-.LASF1500:
+.LASF1502:
 	.string	"recent_rotated"
-.LASF2168:
+.LASF2170:
 	.string	"pm_power_off"
 .LASF197:
 	.string	"futex"
-.LASF1023:
+.LASF1025:
 	.string	"wait_max"
-.LASF3233:
+.LASF3238:
 	.string	"wakeup_source_add"
-.LASF3154:
+.LASF3159:
 	.string	"ebc_pmic_suspend"
-.LASF1156:
+.LASF1158:
 	.string	"result_mask"
-.LASF2232:
+.LASF2234:
 	.string	"state_synced"
-.LASF2418:
+.LASF2420:
 	.string	"phandle"
-.LASF1661:
+.LASF1663:
 	.string	"dquot_operations"
-.LASF1222:
+.LASF1224:
 	.string	"mapping"
-.LASF3186:
+.LASF3191:
 	.string	"resource_size"
-.LASF3231:
+.LASF3236:
 	.string	"wake_up_process"
-.LASF1352:
+.LASF1354:
 	.string	"kioctx_table"
-.LASF850:
+.LASF852:
 	.string	"rb_right"
-.LASF3101:
+.LASF3103:
 	.string	"buffer_new_tmp"
-.LASF976:
+.LASF978:
 	.string	"vm_file"
-.LASF2693:
+.LASF2695:
 	.string	"vmstat_text"
-.LASF2083:
+.LASF2085:
 	.string	"idr_base"
-.LASF743:
+.LASF745:
 	.string	"stack_refcount"
-.LASF437:
+.LASF439:
 	.string	"i_blocks"
-.LASF1519:
+.LASF1521:
 	.string	"kswapd_order"
-.LASF2173:
+.LASF2175:
 	.string	"dev_pm_ops"
-.LASF2778:
+.LASF2780:
 	.string	"module_param_attrs"
-.LASF873:
+.LASF875:
 	.string	"is_rel"
-.LASF2039:
+.LASF2041:
 	.string	"assoc_array_ptr"
-.LASF324:
+.LASF326:
 	.string	"__initdata_end"
-.LASF2499:
+.LASF2501:
 	.string	"bus_lock"
-.LASF3173:
+.LASF3178:
 	.string	"kmalloc_type"
-.LASF385:
+.LASF387:
 	.string	"qstr"
-.LASF3100:
+.LASF3102:
 	.string	"gray_new"
-.LASF1090:
+.LASF1092:
 	.string	"futex_state"
-.LASF1476:
+.LASF1478:
 	.string	"WORKINGSET_RESTORE"
-.LASF626:
+.LASF628:
 	.string	"sched_psi_wake_requeue"
-.LASF3195:
+.LASF3200:
 	.string	"check_copy_size"
-.LASF735:
+.LASF737:
 	.string	"memcg_oom_order"
-.LASF704:
+.LASF706:
 	.string	"acct_timexpd"
-.LASF1404:
+.LASF1406:
 	.string	"__rcu_icq_cache"
 .LASF145:
 	.string	"sysctl_panic_on_rcu_stall"
-.LASF984:
+.LASF986:
 	.string	"size"
-.LASF1541:
+.LASF1543:
 	.string	"ZONE_DMA32"
-.LASF2298:
+.LASF2300:
 	.string	"wakeup_source"
-.LASF1280:
+.LASF1282:
 	.string	"f_pos"
-.LASF1481:
+.LASF1483:
 	.string	"NR_FILE_DIRTY"
 .LASF19:
 	.string	"__kernel_long_t"
-.LASF724:
+.LASF726:
 	.string	"task_frag"
-.LASF1987:
+.LASF1989:
 	.string	"datalen"
-.LASF1046:
+.LASF1048:
 	.string	"nr_wakeups_affine_attempts"
-.LASF1464:
+.LASF1466:
 	.string	"NR_LRU_BASE"
-.LASF1739:
+.LASF1741:
 	.string	"extable"
-.LASF1767:
+.LASF1769:
 	.string	"exit"
-.LASF1561:
+.LASF1563:
 	.string	"compact_considered"
-.LASF2739:
+.LASF2741:
 	.string	"kernel_param_ops"
-.LASF440:
+.LASF442:
 	.string	"dirtied_when"
-.LASF2557:
+.LASF2559:
 	.string	"swapper_pg_dir"
-.LASF334:
+.LASF336:
 	.string	"suspended_step"
 .LASF250:
 	.string	"static_key_false"
-.LASF1236:
+.LASF1238:
 	.string	"pobjects"
-.LASF1796:
+.LASF1798:
 	.string	"is_partially_uptodate"
-.LASF1231:
+.LASF1233:
 	.string	"writeback_index"
-.LASF1306:
+.LASF1308:
 	.string	"core_state"
-.LASF866:
+.LASF868:
 	.string	"timerqueue_head"
-.LASF3232:
+.LASF3237:
 	.string	"sched_setscheduler_nocheck"
-.LASF1289:
+.LASF1291:
 	.string	"f_wb_err"
-.LASF3189:
+.LASF3194:
 	.string	"schedule_work"
-.LASF2428:
+.LASF2430:
 	.string	"rt_mutex"
-.LASF988:
+.LASF990:
 	.string	"rchar"
-.LASF3146:
+.LASF3151:
 	.string	"valid_dma_direction"
-.LASF1816:
+.LASF1818:
 	.string	"bd_contains"
-.LASF1137:
+.LASF1139:
 	.string	"futex_pi_state"
-.LASF1155:
+.LASF1157:
 	.string	"kstat"
 .LASF23:
 	.string	"__kernel_uid32_t"
-.LASF2522:
+.LASF2524:
 	.string	"get_bus_free"
 .LASF32:
 	.string	"__le32"
-.LASF430:
+.LASF432:
 	.string	"i_atime"
-.LASF835:
+.LASF837:
 	.string	"pte_t"
-.LASF1255:
-	.string	"_pt_pad_1"
 .LASF1257:
+	.string	"_pt_pad_1"
+.LASF1259:
 	.string	"_pt_pad_2"
-.LASF2810:
+.LASF2971:
+	.string	"buf_align16"
+.LASF2812:
 	.string	"cpuhp_tasks_frozen"
-.LASF1921:
+.LASF1923:
 	.string	"nlm_lockowner"
-.LASF2339:
+.LASF2341:
 	.string	"device_driver"
-.LASF665:
+.LASF667:
 	.string	"real_cred"
-.LASF806:
+.LASF808:
 	.string	"WORK_STRUCT_FLAG_BITS"
-.LASF2446:
+.LASF2448:
 	.string	"fwnode_endpoint"
-.LASF3061:
+.LASF3065:
 	.string	"__int"
-.LASF950:
+.LASF952:
 	.string	"epoll_watches"
-.LASF2675:
+.LASF2677:
 	.string	"KCOMPACTD_WAKE"
-.LASF3113:
+.LASF3118:
 	.string	"refresh_new_image"
-.LASF2072:
+.LASF2074:
 	.string	"non_rcu"
-.LASF2636:
+.LASF2638:
 	.string	"PGALLOC_NORMAL"
-.LASF366:
+.LASF368:
 	.string	"__cpu_possible_mask"
-.LASF784:
+.LASF786:
 	.string	"timekeeping_suspended"
-.LASF1524:
+.LASF1526:
 	.string	"kcompactd_wait"
-.LASF1628:
+.LASF1630:
 	.string	"dqb_curspace"
-.LASF802:
+.LASF804:
 	.string	"WORK_STRUCT_STATIC"
-.LASF1384:
+.LASF1386:
 	.string	"gp_state"
 .LASF185:
 	.string	"bitset"
-.LASF1018:
+.LASF1020:
 	.string	"load_avg"
-.LASF1303:
+.LASF1305:
 	.string	"access"
-.LASF2489:
+.LASF2491:
 	.string	"i2c_adapter_type"
-.LASF1419:
+.LASF1421:
 	.string	"lease_break_time"
-.LASF1060:
+.LASF1062:
 	.string	"cfs_rq"
-.LASF912:
+.LASF914:
 	.string	"_uid"
-.LASF337:
+.LASF339:
 	.string	"hbp_break"
-.LASF3025:
+.LASF3029:
 	.string	"pmic_node"
 .LASF138:
 	.string	"panic_blink"
-.LASF2769:
+.LASF2771:
 	.string	"ftrace_trampoline"
-.LASF922:
+.LASF924:
 	.string	"_upper"
-.LASF541:
+.LASF543:
 	.string	"__UNIQUE_ID_android_kabi_hide23"
-.LASF2672:
+.LASF2674:
 	.string	"COMPACTSTALL"
 .LASF10:
 	.string	"short unsigned int"
-.LASF1219:
+.LASF1221:
 	.string	"__bp_harden_hyp_vecs_end"
-.LASF778:
+.LASF780:
 	.string	"tick_usec"
-.LASF1824:
+.LASF1826:
 	.string	"bd_bdi"
-.LASF2713:
+.LASF2715:
 	.string	"Elf64_Sxword"
-.LASF1938:
+.LASF1940:
 	.string	"mount2"
-.LASF1948:
+.LASF1950:
 	.string	"i_mutex_dir_key"
-.LASF1403:
+.LASF1405:
 	.string	"q_node"
-.LASF2509:
+.LASF2511:
 	.string	"master_xfer"
-.LASF2324:
+.LASF2326:
 	.string	"dev_root"
-.LASF1693:
+.LASF1695:
 	.string	"spc_warnlimit"
-.LASF1492:
+.LASF1494:
 	.string	"NR_WRITTEN"
-.LASF2580:
+.LASF2582:
 	.string	"need"
-.LASF502:
+.LASF504:
 	.string	"s_encoding"
-.LASF3190:
+.LASF3195:
 	.string	"queue_work"
-.LASF1732:
+.LASF1734:
 	.string	"gpl_crcs"
-.LASF1718:
+.LASF1720:
 	.string	"get_state"
-.LASF3149:
+.LASF3154:
 	.string	"dma_handle"
-.LASF1357:
+.LASF1359:
 	.string	"orig_pte"
-.LASF2757:
+.LASF2759:
 	.string	"param_ops_bool"
-.LASF2458:
+.LASF2460:
 	.string	"of_aliases"
-.LASF1632:
+.LASF1634:
 	.string	"dqb_curinodes"
-.LASF1462:
+.LASF1464:
 	.string	"NR_VM_ZONE_STAT_ITEMS"
-.LASF1050:
+.LASF1052:
 	.string	"load"
 .LASF5:
 	.string	"__s8"
-.LASF350:
+.LASF352:
 	.string	"fault_code"
-.LASF3004:
+.LASF3008:
 	.string	"dev_attr_waveform_version"
-.LASF2209:
+.LASF2211:
 	.string	"dma_mask"
-.LASF2116:
+.LASF2118:
 	.string	"prealloc_mutex"
-.LASF2471:
+.LASF2473:
 	.string	"DOMAIN_BUS_FSL_MC_MSI"
-.LASF1463:
+.LASF1465:
 	.string	"node_stat_item"
-.LASF2493:
+.LASF2495:
 	.string	"init_irq"
-.LASF1089:
-	.string	"__UNIQUE_ID_android_kabi_hide46"
 .LASF1091:
+	.string	"__UNIQUE_ID_android_kabi_hide46"
+.LASF1093:
 	.string	"__UNIQUE_ID_android_kabi_hide47"
-.LASF1337:
+.LASF1339:
 	.string	"start_stack"
-.LASF2071:
+.LASF2073:
 	.string	"init_groups"
-.LASF1909:
+.LASF1911:
 	.string	"android_reserved1"
-.LASF310:
+.LASF312:
 	.string	"__nosave_end"
-.LASF2035:
+.LASF2037:
 	.string	"event"
-.LASF517:
+.LASF519:
 	.string	"s_mode"
-.LASF1608:
+.LASF1610:
 	.string	"dq_dqb_lock"
 .LASF21:
 	.string	"__kernel_ulong_t"
-.LASF2604:
+.LASF2606:
 	.string	"max_mapnr"
-.LASF2952:
+.LASF2956:
 	.string	"regmap"
-.LASF2920:
+.LASF2924:
 	.string	"shared_info"
-.LASF770:
+.LASF772:
 	.string	"read_cntp_tval_el0"
-.LASF2634:
+.LASF2636:
 	.string	"PSWPOUT"
-.LASF1072:
+.LASF1074:
 	.string	"dl_period"
-.LASF807:
+.LASF809:
 	.string	"WORK_OFFQ_FLAG_BASE"
-.LASF1483:
+.LASF1485:
 	.string	"NR_WRITEBACK_TEMP"
-.LASF2511:
+.LASF2513:
 	.string	"functionality"
+.LASF3107:
+	.string	"clac_part_data_align8"
 .LASF305:
 	.string	"__ctors_end"
-.LASF2264:
+.LASF2266:
 	.string	"wakeup_path"
-.LASF966:
+.LASF968:
 	.string	"vm_prev"
 .LASF273:
 	.string	"arm64_const_caps_ready"
-.LASF1165:
+.LASF1167:
 	.string	"btime"
-.LASF1908:
+.LASF1910:
 	.string	"fl_u"
-.LASF2033:
+.LASF2035:
 	.string	"extra2"
 .LASF6:
 	.string	"__u8"
 .LASF115:
 	.string	"lock"
-.LASF3153:
+.LASF3158:
 	.string	"ebc_pmic_resume"
-.LASF1560:
+.LASF1562:
 	.string	"compact_cached_migrate_pfn"
-.LASF2635:
+.LASF2637:
 	.string	"PGALLOC_DMA32"
-.LASF2753:
+.LASF2755:
 	.string	"param_ops_long"
-.LASF2993:
+.LASF2997:
 	.string	"overlay_start"
-.LASF2948:
+.LASF2952:
 	.string	"frame_addr_set"
-.LASF1075:
+.LASF1077:
 	.string	"runtime"
-.LASF396:
+.LASF398:
 	.string	"d_wait"
-.LASF2448:
+.LASF2450:
 	.string	"local_fwnode"
-.LASF2746:
+.LASF2748:
 	.string	"__start___param"
-.LASF1178:
+.LASF1180:
 	.string	"list_lru_one"
-.LASF1916:
+.LASF1918:
 	.string	"lm_grant"
 .LASF143:
 	.string	"panic_on_io_nmi"
-.LASF2574:
+.LASF2576:
 	.string	"percpu_ref_func_t"
-.LASF2106:
+.LASF2108:
 	.string	"seq_stop"
-.LASF1247:
+.LASF1249:
 	.string	"compound_dtor"
-.LASF1981:
+.LASF1983:
 	.string	"xattr_handler"
-.LASF1424:
+.LASF1426:
 	.string	"kiocb"
-.LASF2894:
+.LASF2898:
 	.string	"width_mm"
-.LASF1563:
+.LASF1565:
 	.string	"compact_order_failed"
-.LASF1103:
+.LASF1105:
 	.string	"fsuid"
-.LASF3203:
+.LASF3208:
 	.string	"flag"
-.LASF1473:
+.LASF1475:
 	.string	"NR_ISOLATED_FILE"
-.LASF482:
+.LASF484:
 	.string	"s_blocksize_bits"
-.LASF2293:
+.LASF2295:
 	.string	"active_jiffies"
-.LASF1553:
+.LASF1555:
 	.string	"managed_pages"
-.LASF2587:
+.LASF2589:
 	.string	"__tracepoint_page_ref_set"
-.LASF3142:
+.LASF3147:
 	.string	"ebc_tcon_enable"
-.LASF3277:
+.LASF3282:
 	.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"
-.LASF2618:
+.LASF2620:
 	.string	"sysctl_overcommit_memory"
-.LASF2533:
+.LASF2535:
 	.string	"max_comb_2nd_msg_len"
-.LASF1599:
+.LASF1601:
 	.string	"gfp_allowed_mask"
-.LASF1184:
+.LASF1186:
 	.string	"shrinker_id"
-.LASF2567:
+.LASF2569:
 	.string	"MEMREMAP_DEC"
-.LASF751:
+.LASF753:
 	.string	"total_cpus"
-.LASF1189:
+.LASF1191:
 	.string	"root"
 .LASF34:
 	.string	"value_offset"
-.LASF741:
+.LASF743:
 	.string	"oom_reaper_list"
-.LASF351:
+.LASF353:
 	.string	"debug"
-.LASF1547:
+.LASF1549:
 	.string	"nr_reserved_highatomic"
-.LASF2362:
+.LASF2364:
 	.string	"shutdown_pre"
-.LASF2282:
+.LASF2284:
 	.string	"no_callbacks"
-.LASF2822:
+.LASF2824:
 	.string	"prevent_deferred_probe"
 .LASF9:
 	.string	"__u16"
-.LASF1024:
+.LASF1026:
 	.string	"wait_count"
-.LASF1485:
+.LASF1487:
 	.string	"NR_SHMEM_THPS"
-.LASF1733:
+.LASF1735:
 	.string	"sig_ok"
-.LASF2078:
+.LASF2080:
 	.string	"lpj_fine"
-.LASF501:
+.LASF503:
 	.string	"s_vop"
-.LASF1648:
+.LASF1650:
 	.string	"qf_owner"
-.LASF3215:
+.LASF3220:
 	.string	"__write_once_size"
-.LASF2829:
+.LASF2831:
 	.string	"kmalloc_cache_type"
-.LASF572:
+.LASF574:
 	.string	"mutex"
-.LASF3181:
+.LASF3186:
 	.string	"out_values"
-.LASF837:
+.LASF839:
 	.string	"pgd_t"
-.LASF598:
+.LASF600:
 	.string	"nr_cpus_allowed"
-.LASF1458:
+.LASF1460:
 	.string	"NR_KERNEL_STACK_KB"
-.LASF1498:
+.LASF1500:
 	.string	"NR_VM_NODE_STAT_ITEMS"
 .LASF233:
 	.string	"raw_spinlock_t"
-.LASF2931:
+.LASF2935:
 	.string	"vir_width"
-.LASF3206:
+.LASF3211:
 	.string	"INIT_LIST_HEAD"
-.LASF1936:
+.LASF1938:
 	.string	"fs_flags"
-.LASF1790:
+.LASF1792:
 	.string	"freepage"
-.LASF2271:
+.LASF2273:
 	.string	"work"
-.LASF2051:
+.LASF2053:
 	.string	"keytype"
-.LASF949:
+.LASF951:
 	.string	"sigpending"
-.LASF2212:
+.LASF2214:
 	.string	"dma_pfn_offset"
-.LASF1187:
+.LASF1189:
 	.string	"radix_tree_node"
-.LASF3208:
+.LASF3213:
 	.string	"sign_extend64"
-.LASF2311:
+.LASF2313:
 	.string	"wake_irq"
-.LASF3027:
+.LASF3031:
 	.string	"ulogo_addr"
-.LASF857:
+.LASF859:
 	.string	"pcpu_fc"
-.LASF2295:
+.LASF2297:
 	.string	"accounting_timestamp"
-.LASF506:
+.LASF508:
 	.string	"s_bdev"
 .LASF177:
 	.string	"tz_dsttime"
 .LASF12:
 	.string	"__u32"
-.LASF2657:
+.LASF2659:
 	.string	"PGINODESTEAL"
-.LASF641:
+.LASF643:
 	.string	"ptraced"
-.LASF2749:
+.LASF2751:
 	.string	"param_ops_short"
-.LASF3247:
+.LASF3252:
 	.string	"of_find_device_by_node"
-.LASF2551:
+.LASF2553:
 	.string	"HRTIMER_SOFTIRQ"
-.LASF799:
+.LASF801:
 	.string	"WORK_STRUCT_DELAYED"
-.LASF452:
+.LASF454:
 	.string	"i_sequence"
-.LASF1507:
+.LASF1509:
 	.string	"pgdat"
-.LASF1086:
+.LASF1088:
 	.string	"sigval"
-.LASF2607:
+.LASF2609:
 	.string	"page_cluster"
-.LASF1630:
+.LASF1632:
 	.string	"dqb_ihardlimit"
-.LASF408:
+.LASF410:
 	.string	"d_lockref"
-.LASF2240:
+.LASF2242:
 	.string	"rpm_request"
-.LASF3054:
+.LASF3058:
 	.string	"ebc_io_ctl"
-.LASF1147:
+.LASF1149:
 	.string	"addr"
-.LASF2383:
+.LASF2385:
 	.string	"device_private"
-.LASF3144:
+.LASF3149:
 	.string	"get_dma_ops"
-.LASF2695:
+.LASF2697:
 	.string	"watermark_scale_factor"
-.LASF1839:
+.LASF1841:
 	.string	"i_dir_seq"
-.LASF2121:
+.LASF2123:
 	.string	"KOBJ_NS_TYPE_NONE"
-.LASF1799:
+.LASF1801:
 	.string	"swap_activate"
-.LASF982:
+.LASF984:
 	.string	"mm_rss_stat"
-.LASF1720:
+.LASF1722:
 	.string	"mkobj"
-.LASF2958:
+.LASF2962:
 	.string	"direct_buf_real_size"
-.LASF3266:
+.LASF3271:
 	.string	"__pm_relax"
-.LASF470:
+.LASF472:
 	.string	"d_delete"
-.LASF1620:
+.LASF1622:
 	.string	"PRJQUOTA"
-.LASF2067:
+.LASF2069:
 	.string	"begin"
-.LASF2734:
+.LASF2736:
 	.string	"sh_link"
-.LASF3018:
+.LASF3022:
 	.string	"ebc_suspend"
-.LASF2355:
+.LASF2357:
 	.string	"cls_msk"
-.LASF2663:
+.LASF2665:
 	.string	"PGROTATED"
-.LASF1668:
+.LASF1670:
 	.string	"write_info"
-.LASF2157:
+.LASF2159:
 	.string	"kobj_attribute"
-.LASF2277:
+.LASF2279:
 	.string	"idle_notification"
-.LASF1805:
+.LASF1807:
 	.string	"block_device"
-.LASF2120:
+.LASF2122:
 	.string	"kobj_ns_type"
-.LASF2616:
+.LASF2618:
 	.string	"sysctl_user_reserve_kbytes"
-.LASF2814:
+.LASF2816:
 	.string	"num_resources"
-.LASF1573:
+.LASF1575:
 	.string	"notifier_fn_t"
-.LASF3026:
+.LASF3030:
 	.string	"pmic_client"
-.LASF2569:
+.LASF2571:
 	.string	"miscdevice"
-.LASF653:
+.LASF655:
 	.string	"time_in_state"
-.LASF3035:
+.LASF3039:
 	.string	"ebc_logo_init"
-.LASF1266:
+.LASF1268:
 	.string	"kill"
-.LASF1027:
+.LASF1029:
 	.string	"iowait_sum"
-.LASF3114:
+.LASF3119:
 	.string	"image_new"
 .LASF15:
 	.string	"__u64"
-.LASF692:
+.LASF694:
 	.string	"journal_info"
-.LASF2874:
+.LASF2876:
 	.string	"EPD_FULL_GL16"
-.LASF623:
+.LASF625:
 	.string	"sched_contributes_to_load"
-.LASF1007:
+.LASF1009:
 	.string	"weight"
-.LASF465:
+.LASF467:
 	.string	"i_private"
-.LASF1983:
+.LASF1985:
 	.string	"serial"
 .LASF111:
 	.string	"flush"
-.LASF2861:
+.LASF2863:
 	.string	"ebc_buf_s"
-.LASF2194:
+.LASF2196:
 	.string	"runtime_suspend"
-.LASF435:
+.LASF437:
 	.string	"i_blkbits"
-.LASF2453:
+.LASF2455:
 	.string	"value"
-.LASF2987:
+.LASF2991:
 	.string	"frame_timer"
-.LASF1030:
+.LASF1032:
 	.string	"sum_sleep_runtime"
-.LASF3031:
+.LASF3035:
 	.string	"ulogo_addr_str"
-.LASF3094:
+.LASF3095:
 	.string	"flip"
-.LASF1076:
+.LASF1078:
 	.string	"deadline"
-.LASF961:
+.LASF963:
 	.string	"vmas"
-.LASF1326:
+.LASF1328:
 	.string	"pinned_vm"
-.LASF1512:
+.LASF1514:
 	.string	"node_start_pfn"
-.LASF2545:
+.LASF2547:
 	.string	"NET_TX_SOFTIRQ"
-.LASF701:
+.LASF703:
 	.string	"psi_flags"
-.LASF1356:
+.LASF1358:
 	.string	"address"
-.LASF1828:
+.LASF1830:
 	.string	"bd_fsfreeze_mutex"
-.LASF1232:
+.LASF1234:
 	.string	"a_ops"
-.LASF2351:
+.LASF2353:
 	.string	"PROBE_FORCE_SYNCHRONOUS"
 .LASF94:
 	.string	"dmesg_restrict"
-.LASF963:
+.LASF965:
 	.string	"vm_start"
-.LASF490:
+.LASF492:
 	.string	"s_flags"
-.LASF370:
+.LASF372:
 	.string	"cpumask_var_t"
-.LASF1297:
+.LASF1299:
 	.string	"fault"
 .LASF80:
 	.string	"saved_command_line"
-.LASF1973:
+.LASF1975:
 	.string	"show_stats"
-.LASF1074:
+.LASF1076:
 	.string	"dl_density"
-.LASF1657:
+.LASF1659:
 	.string	"read_dqblk"
-.LASF1613:
+.LASF1615:
 	.string	"dq_flags"
-.LASF3097:
+.LASF3098:
 	.string	"buffer_new"
 .LASF212:
 	.string	"user_fpsimd_state"
-.LASF3246:
+.LASF3251:
 	.string	"device_create_file"
-.LASF518:
+.LASF520:
 	.string	"s_time_gran"
-.LASF2361:
+.LASF2363:
 	.string	"dev_release"
-.LASF1362:
+.LASF1364:
 	.string	"kernel_cap_t"
-.LASF573:
+.LASF575:
 	.string	"wait_list"
-.LASF2278:
+.LASF2280:
 	.string	"request_pending"
-.LASF870:
+.LASF872:
 	.string	"hrtimer"
-.LASF491:
+.LASF493:
 	.string	"s_iflags"
-.LASF715:
+.LASF717:
 	.string	"perf_event_ctxp"
-.LASF454:
+.LASF456:
 	.string	"i_dio_count"
-.LASF507:
+.LASF509:
 	.string	"s_bdi"
-.LASF2854:
+.LASF2856:
 	.string	"wf_table"
-.LASF3120:
+.LASF3125:
 	.string	"image_new_tmp"
-.LASF1729:
+.LASF1731:
 	.string	"num_kp"
-.LASF3276:
+.LASF3281:
 	.string	"__pm_stay_awake"
-.LASF2562:
+.LASF2564:
 	.string	"vmap_area_list"
-.LASF3001:
+.LASF3005:
 	.string	"ebc_auto_thread_sem"
-.LASF627:
+.LASF629:
 	.string	"in_execve"
-.LASF2243:
+.LASF2245:
 	.string	"RPM_REQ_SUSPEND"
-.LASF480:
+.LASF482:
 	.string	"s_list"
-.LASF1629:
+.LASF1631:
 	.string	"dqb_rsvspace"
-.LASF1722:
+.LASF1724:
 	.string	"version"
-.LASF2561:
+.LASF2563:
 	.string	"xen_start_flags"
-.LASF2879:
+.LASF2881:
 	.string	"EPD_PART_GL16"
-.LASF1536:
+.LASF1538:
 	.string	"stat_threshold"
-.LASF2360:
+.LASF2362:
 	.string	"class_release"
-.LASF1883:
+.LASF1885:
 	.string	"fu_llist"
-.LASF686:
+.LASF688:
 	.string	"alloc_lock"
-.LASF511:
+.LASF513:
 	.string	"s_dquot"
-.LASF823:
+.LASF825:
 	.string	"system_highpri_wq"
-.LASF1191:
+.LASF1193:
 	.string	"tags"
-.LASF1882:
+.LASF1884:
 	.string	"prev_pos"
-.LASF2308:
+.LASF2310:
 	.string	"expire_count"
 .LASF276:
 	.string	"_etext"
-.LASF494:
+.LASF496:
 	.string	"s_umount"
-.LASF2134:
+.LASF2136:
 	.string	"is_bin_visible"
-.LASF1355:
+.LASF1357:
 	.string	"pgoff"
-.LASF2219:
+.LASF2221:
 	.string	"of_node"
-.LASF2882:
+.LASF2884:
 	.string	"EPD_PART_GCC16"
-.LASF2017:
+.LASF2019:
 	.string	"names_cachep"
-.LASF782:
+.LASF784:
 	.string	"preset_lpj"
-.LASF2986:
+.LASF2990:
 	.string	"vdd_timer"
-.LASF2218:
+.LASF2220:
 	.string	"archdata"
-.LASF1434:
+.LASF1436:
 	.string	"ia_uid"
-.LASF1364:
+.LASF1366:
 	.string	"__cap_init_eff_set"
-.LASF725:
+.LASF727:
 	.string	"delays"
-.LASF638:
+.LASF640:
 	.string	"children"
-.LASF1290:
+.LASF1292:
 	.string	"rb_subtree_last"
-.LASF2266:
+.LASF2268:
 	.string	"no_pm_callbacks"
-.LASF1595:
+.LASF1597:
 	.string	"llc_sibling"
-.LASF2668:
+.LASF2670:
 	.string	"PGMIGRATE_FAIL"
-.LASF2433:
+.LASF2435:
 	.string	"device_get_match_data"
-.LASF647:
+.LASF649:
 	.string	"vfork_done"
 .LASF198:
 	.string	"nanosleep"
-.LASF1413:
+.LASF1415:
 	.string	"inodes_stat_t"
-.LASF840:
+.LASF842:
 	.string	"pud_t"
-.LASF2812:
+.LASF2814:
 	.string	"platform_device"
-.LASF1692:
+.LASF1694:
 	.string	"rt_spc_timelimit"
 .LASF220:
 	.string	"tail"
-.LASF1437:
+.LASF1439:
 	.string	"ia_atime"
-.LASF2541:
+.LASF2543:
 	.string	"irq_default_affinity"
-.LASF722:
+.LASF724:
 	.string	"tlb_ubc"
-.LASF2413:
+.LASF2415:
 	.string	"remap"
-.LASF1645:
+.LASF1647:
 	.string	"quota_format_type"
-.LASF2813:
+.LASF2815:
 	.string	"id_auto"
-.LASF1176:
+.LASF1178:
 	.string	"seeks"
-.LASF574:
+.LASF576:
 	.string	"task_struct"
-.LASF2895:
+.LASF2899:
 	.string	"height_mm"
-.LASF2637:
+.LASF2639:
 	.string	"PGALLOC_MOVABLE"
-.LASF2269:
+.LASF2271:
 	.string	"suspend_timer"
-.LASF1986:
+.LASF1988:
 	.string	"quotalen"
-.LASF2407:
+.LASF2409:
 	.string	"sync_sg_for_cpu"
-.LASF1526:
+.LASF1528:
 	.string	"totalreserve_pages"
-.LASF447:
+.LASF449:
 	.string	"i_wb_frn_history"
-.LASF583:
+.LASF585:
 	.string	"last_wakee"
 .LASF63:
 	.string	"next"
-.LASF812:
+.LASF814:
 	.string	"WORK_OFFQ_LEFT"
 .LASF222:
 	.string	"arch_spinlock_t"
-.LASF1243:
+.LASF1245:
 	.string	"slab_cache"
-.LASF1126:
+.LASF1128:
 	.string	"nr_tasks"
-.LASF2505:
+.LASF2507:
 	.string	"bus_recovery_info"
-.LASF1322:
+.LASF1324:
 	.string	"mmlist"
-.LASF1717:
+.LASF1719:
 	.string	"set_dqblk"
-.LASF1241:
+.LASF1243:
 	.string	"s_mem"
-.LASF2237:
+.LASF2239:
 	.string	"RPM_RESUMING"
-.LASF468:
+.LASF470:
 	.string	"d_weak_revalidate"
-.LASF2981:
+.LASF2985:
 	.string	"prev_dsp_buf"
-.LASF1490:
+.LASF1492:
 	.string	"NR_VMSCAN_IMMEDIATE"
-.LASF510:
+.LASF512:
 	.string	"s_quota_types"
-.LASF1452:
+.LASF1454:
 	.string	"NR_ZONE_INACTIVE_FILE"
-.LASF2470:
+.LASF2472:
 	.string	"DOMAIN_BUS_IPI"
-.LASF1311:
+.LASF1313:
 	.string	"vmacache_seqnum"
-.LASF759:
+.LASF761:
 	.string	"setup_max_cpus"
-.LASF1831:
+.LASF1833:
 	.string	"i_nlink"
-.LASF2938:
+.LASF2942:
 	.string	"mirror"
-.LASF1785:
+.LASF1787:
 	.string	"write_begin"
-.LASF2226:
+.LASF2228:
 	.string	"groups"
-.LASF691:
+.LASF693:
 	.string	"pi_blocked_on"
-.LASF3022:
+.LASF3026:
 	.string	"ebc_probe"
-.LASF498:
+.LASF500:
 	.string	"s_xattr"
-.LASF3032:
+.LASF3036:
 	.string	"klogo_addr_str"
-.LASF990:
+.LASF992:
 	.string	"syscr"
-.LASF1944:
+.LASF1946:
 	.string	"s_vfs_rename_key"
-.LASF1430:
+.LASF1432:
 	.string	"ki_ioprio"
-.LASF1160:
+.LASF1162:
 	.string	"attributes_mask"
 .LASF199:
 	.string	"restart_block"
@@ -54394,1367 +55459,1365 @@ __exitcall_ebc_exit:
 	.string	"umode_t"
 .LASF200:
 	.string	"memstart_addr"
-.LASF2640:
+.LASF2642:
 	.string	"ALLOCSTALL_MOVABLE"
-.LASF740:
+.LASF742:
 	.string	"pagefault_disabled"
-.LASF991:
+.LASF993:
 	.string	"syscw"
-.LASF1398:
+.LASF1400:
 	.string	"guid_null"
 .LASF223:
 	.string	"wlocked"
-.LASF2687:
+.LASF2689:
 	.string	"NR_VM_EVENT_ITEMS"
-.LASF1958:
+.LASF1960:
 	.string	"freeze_super"
-.LASF535:
+.LASF537:
 	.string	"s_inode_list_lock"
-.LASF2597:
+.LASF2599:
 	.string	"align"
-.LASF3104:
+.LASF3106:
 	.string	"frame_idx"
 .LASF203:
 	.string	"mm_segment_t"
-.LASF2755:
+.LASF2757:
 	.string	"param_ops_ullong"
-.LASF1907:
+.LASF1909:
 	.string	"fl_lmops"
-.LASF2816:
+.LASF2818:
 	.string	"driver_override"
-.LASF1012:
+.LASF1014:
 	.string	"sched_avg"
-.LASF1711:
+.LASF1713:
 	.string	"quota_enable"
-.LASF1545:
+.LASF1547:
 	.string	"zone"
-.LASF1793:
+.LASF1795:
 	.string	"isolate_page"
-.LASF661:
+.LASF663:
 	.string	"maj_flt"
 .LASF228:
 	.string	"arch_rwlock_t"
-.LASF3264:
+.LASF3269:
 	.string	"ebc_osd_buf_clone"
 .LASF161:
 	.string	"c_false"
-.LASF897:
+.LASF899:
 	.string	"clock_base"
-.LASF2902:
+.LASF2906:
 	.string	"pmic_read_temperature"
-.LASF1795:
+.LASF1797:
 	.string	"launder_page"
-.LASF1840:
+.LASF1842:
 	.string	"cdev"
-.LASF1061:
+.LASF1063:
 	.string	"my_q"
-.LASF640:
+.LASF642:
 	.string	"group_leader"
-.LASF1853:
+.LASF1855:
 	.string	"mkdir"
-.LASF1570:
+.LASF1572:
 	.string	"zonelist"
 .LASF252:
 	.string	"FTR_EXACT"
-.LASF2570:
+.LASF2572:
 	.string	"minor"
-.LASF1696:
+.LASF1698:
 	.string	"nextents"
-.LASF3147:
+.LASF3152:
 	.string	"dma_direction"
 .LASF1:
 	.string	"sizetype"
-.LASF676:
+.LASF678:
 	.string	"real_blocked"
-.LASF1331:
+.LASF1333:
 	.string	"arg_lock"
-.LASF1738:
+.LASF1740:
 	.string	"num_exentries"
-.LASF3083:
+.LASF3086:
 	.string	"check_out"
-.LASF2606:
+.LASF2608:
 	.string	"high_memory"
 .LASF48:
 	.string	"int32_t"
-.LASF3014:
+.LASF3018:
 	.string	"__exitcall_ebc_exit"
-.LASF1037:
+.LASF1039:
 	.string	"nr_failed_migrations_running"
-.LASF894:
+.LASF896:
 	.string	"next_timer"
-.LASF738:
+.LASF740:
 	.string	"throttle_queue"
-.LASF3259:
+.LASF3264:
 	.string	"finish_wait"
-.LASF1477:
+.LASF1479:
 	.string	"WORKINGSET_NODERECLAIM"
-.LASF538:
+.LASF540:
 	.string	"s_inodes_wb"
-.LASF2245:
+.LASF2247:
 	.string	"RPM_REQ_RESUME"
-.LASF2042:
+.LASF2044:
 	.string	"keyring_index_key"
-.LASF3141:
+.LASF3146:
 	.string	"ebc_tcon_disable"
-.LASF1418:
+.LASF1420:
 	.string	"leases_enable"
 .LASF226:
 	.string	"qrwlock"
-.LASF2685:
+.LASF2687:
 	.string	"SWAP_RA"
-.LASF826:
+.LASF828:
 	.string	"system_freezable_wq"
-.LASF1877:
+.LASF1879:
 	.string	"file_ra_state"
-.LASF946:
+.LASF948:
 	.string	"user_struct"
-.LASF2363:
+.LASF2365:
 	.string	"ns_type"
-.LASF586:
+.LASF2887:
+	.string	"EPD_DU4"
+.LASF588:
 	.string	"on_rq"
-.LASF2337:
+.LASF2339:
 	.string	"lock_key"
-.LASF2560:
+.LASF2562:
 	.string	"tramp_pg_dir"
-.LASF3008:
+.LASF3012:
 	.string	"dev_attr_ebc_version"
-.LASF861:
+.LASF863:
 	.string	"PCPU_FC_NR"
-.LASF2117:
+.LASF2119:
 	.string	"prealloc_buf"
-.LASF2375:
+.LASF2377:
 	.string	"DL_DEV_DRIVER_BOUND"
-.LASF839:
+.LASF841:
 	.string	"pgprot_t"
-.LASF1954:
+.LASF1956:
 	.string	"drop_inode"
-.LASF1764:
+.LASF1766:
 	.string	"num_trace_evals"
-.LASF2334:
+.LASF2336:
 	.string	"num_vf"
-.LASF1532:
+.LASF1534:
 	.string	"isolate_mode_t"
-.LASF3148:
+.LASF3153:
 	.string	"debug_dma_sync_single_for_device"
 .LASF98:
 	.string	"llseek"
-.LASF2374:
+.LASF2376:
 	.string	"DL_DEV_PROBING"
-.LASF1783:
+.LASF1785:
 	.string	"set_page_dirty"
-.LASF1817:
+.LASF1819:
 	.string	"bd_block_size"
-.LASF1658:
+.LASF1660:
 	.string	"commit_dqblk"
-.LASF2148:
+.LASF2150:
 	.string	"namespace"
-.LASF1706:
+.LASF1708:
 	.string	"i_ino_warnlimit"
-.LASF2787:
+.LASF2789:
 	.string	"MODULE_STATE_GOING"
-.LASF1093:
+.LASF1095:
 	.string	"rcu_node"
-.LASF2198:
+.LASF2200:
 	.string	"init_name"
 .LASF83:
 	.string	"late_time_init"
-.LASF1961:
+.LASF1963:
 	.string	"unfreeze_fs"
-.LASF904:
+.LASF906:
 	.string	"nodemask_t"
-.LASF2225:
+.LASF2227:
 	.string	"class"
-.LASF1889:
+.LASF1891:
 	.string	"file_lock"
-.LASF322:
+.LASF324:
 	.string	"__idmap_text_end"
-.LASF2960:
+.LASF2964:
 	.string	"frame_total"
-.LASF773:
+.LASF775:
 	.string	"read_cntvct_el0"
 .LASF242:
 	.string	"target"
-.LASF2543:
+.LASF2545:
 	.string	"HI_SOFTIRQ"
-.LASF3150:
+.LASF3155:
 	.string	"direction"
-.LASF3119:
+.LASF3124:
 	.string	"image_bg_data"
-.LASF955:
+.LASF957:
 	.string	"session_keyring"
-.LASF331:
+.LASF333:
 	.string	"__boot_cpu_mode"
-.LASF2048:
+.LASF2050:
 	.string	"key_restrict_link_func_t"
-.LASF1482:
+.LASF1484:
 	.string	"NR_WRITEBACK"
-.LASF3107:
+.LASF3112:
 	.string	"frame_count"
-.LASF484:
+.LASF486:
 	.string	"s_maxbytes"
-.LASF2354:
+.LASF2356:
 	.string	"acpi_device_id"
-.LASF1679:
+.LASF1681:
 	.string	"d_ino_count"
-.LASF2684:
+.LASF2686:
 	.string	"UNEVICTABLE_PGSTRANDED"
-.LASF2488:
+.LASF2490:
 	.string	"i2c_bus_type"
-.LASF882:
+.LASF884:
 	.string	"hrtimer_cpu_base"
-.LASF3271:
+.LASF3276:
 	.string	"ebc_notify"
-.LASF1388:
+.LASF1390:
 	.string	"cb_head"
-.LASF1653:
+.LASF1655:
 	.string	"check_quota_file"
-.LASF1922:
+.LASF1924:
 	.string	"nfs4_lock_info"
-.LASF1988:
+.LASF1990:
 	.string	"restrict_link"
-.LASF2318:
+.LASF2320:
 	.string	"dev_archdata"
-.LASF2019:
+.LASF2021:
 	.string	"def_blk_fops"
-.LASF459:
+.LASF461:
 	.string	"i_devices"
-.LASF326:
+.LASF328:
 	.string	"__inittext_end"
-.LASF714:
+.LASF716:
 	.string	"pi_state_cache"
-.LASF972:
+.LASF974:
 	.string	"anon_vma_chain"
-.LASF1730:
+.LASF1732:
 	.string	"num_gpl_syms"
-.LASF600:
+.LASF602:
 	.string	"cpus_requested"
-.LASF2591:
+.LASF2593:
 	.string	"__tracepoint_page_ref_mod_unless"
-.LASF3158:
+.LASF3163:
 	.string	"wake_lock_init"
-.LASF1183:
+.LASF1185:
 	.string	"list_lru"
 .LASF215:
 	.string	"fpcr"
-.LASF2097:
+.LASF2099:
 	.string	"target_kn"
-.LASF909:
+.LASF911:
 	.string	"sival_ptr"
-.LASF417:
+.LASF419:
 	.string	"i_opflags"
-.LASF711:
+.LASF713:
 	.string	"robust_list"
-.LASF1712:
+.LASF1714:
 	.string	"quota_disable"
-.LASF2053:
+.LASF2055:
 	.string	"serial_node"
-.LASF1698:
+.LASF1700:
 	.string	"s_incoredqs"
-.LASF474:
+.LASF476:
 	.string	"d_iput"
 .LASF107:
 	.string	"compat_ioctl"
-.LASF3166:
+.LASF3171:
 	.string	"__range_ok"
 .LASF286:
 	.string	"__start_ro_after_init"
-.LASF2704:
+.LASF2706:
 	.string	"num_poisoned_pages"
-.LASF902:
+.LASF904:
 	.string	"filter"
-.LASF3151:
+.LASF3156:
 	.string	"ebc_pmic_get_vcom"
-.LASF2939:
+.LASF2943:
 	.string	"ebc_tcon"
-.LASF2608:
+.LASF2610:
 	.string	"sysctl_legacy_va_layout"
-.LASF816:
+.LASF818:
 	.string	"WORK_STRUCT_WQ_DATA_MASK"
-.LASF2377:
+.LASF2379:
 	.string	"dev_links_info"
 .LASF45:
 	.string	"loff_t"
-.LASF2714:
+.LASF2716:
 	.string	"d_val"
-.LASF643:
+.LASF645:
 	.string	"thread_pid"
-.LASF800:
+.LASF802:
 	.string	"WORK_STRUCT_PWQ"
-.LASF1494:
+.LASF1496:
 	.string	"NR_UNRECLAIMABLE_PAGES"
-.LASF2510:
+.LASF2512:
 	.string	"smbus_xfer"
-.LASF2761:
+.LASF2763:
 	.string	"param_array_ops"
-.LASF2674:
+.LASF2676:
 	.string	"COMPACTSUCCESS"
-.LASF932:
+.LASF934:
 	.string	"_arch"
-.LASF2724:
+.LASF2726:
 	.string	"st_value"
-.LASF2857:
+.LASF2859:
 	.string	"buf_user"
-.LASF2123:
+.LASF2125:
 	.string	"KOBJ_NS_TYPES"
 .LASF68:
 	.string	"pprev"
-.LASF422:
+.LASF424:
 	.string	"i_default_acl"
-.LASF1405:
+.LASF1407:
 	.string	"ioc_node"
-.LASF2231:
+.LASF2233:
 	.string	"of_node_reused"
-.LASF2111:
+.LASF2113:
 	.string	"kernfs_node_id"
-.LASF2350:
+.LASF2352:
 	.string	"PROBE_PREFER_ASYNCHRONOUS"
-.LASF1132:
+.LASF1134:
 	.string	"icq_list"
 .LASF25:
 	.string	"__kernel_size_t"
-.LASF613:
+.LASF615:
 	.string	"active_mm"
-.LASF1433:
+.LASF1435:
 	.string	"ia_mode"
-.LASF1078:
+.LASF1080:
 	.string	"dl_boosted"
-.LASF1175:
+.LASF1177:
 	.string	"batch"
-.LASF1879:
+.LASF1881:
 	.string	"async_size"
-.LASF703:
+.LASF705:
 	.string	"acct_vm_mem1"
-.LASF2735:
+.LASF2737:
 	.string	"sh_info"
-.LASF2146:
+.LASF2148:
 	.string	"default_attrs"
-.LASF2598:
+.LASF2600:
 	.string	"memory_type"
-.LASF852:
+.LASF854:
 	.string	"rb_root"
-.LASF1043:
+.LASF1045:
 	.string	"nr_wakeups_local"
-.LASF1180:
+.LASF1182:
 	.string	"list_lru_memcg"
-.LASF1774:
+.LASF1776:
 	.string	"WRITE_LIFE_NONE"
-.LASF1773:
+.LASF1775:
 	.string	"WRITE_LIFE_NOT_SET"
-.LASF2747:
+.LASF2749:
 	.string	"__stop___param"
-.LASF2811:
+.LASF2813:
 	.string	"cpu_subsys"
-.LASF677:
+.LASF679:
 	.string	"saved_sigmask"
-.LASF411:
+.LASF413:
 	.string	"d_time"
-.LASF2953:
+.LASF2957:
 	.string	"ebc_info"
 .LASF239:
 	.string	"entries"
-.LASF998:
+.LASF1000:
 	.string	"cpu_id"
-.LASF2946:
+.LASF2950:
 	.string	"dsp_mode_set"
-.LASF2649:
+.LASF2651:
 	.string	"PGMAJFAULT"
-.LASF1544:
+.LASF1546:
 	.string	"__MAX_NR_ZONES"
-.LASF2461:
+.LASF2463:
 	.string	"irq_fwspec"
-.LASF1802:
+.LASF1804:
 	.string	"iov_iter"
-.LASF508:
+.LASF510:
 	.string	"s_mtd"
-.LASF2741:
+.LASF2743:
 	.string	"kparam_string"
-.LASF2203:
+.LASF2205:
 	.string	"power"
 .LASF265:
 	.string	"strict_mask"
-.LASF3258:
+.LASF3263:
 	.string	"init_wait_entry"
-.LASF2784:
+.LASF2786:
 	.string	"module_state"
-.LASF3218:
+.LASF3223:
 	.string	"_dev_info"
-.LASF414:
+.LASF416:
 	.string	"d_subdirs"
-.LASF1984:
+.LASF1986:
 	.string	"last_used_at"
-.LASF1275:
+.LASF1277:
 	.string	"f_write_hint"
-.LASF1005:
+.LASF1007:
 	.string	"last_queued"
-.LASF1116:
+.LASF1118:
 	.string	"user_ns"
-.LASF2633:
+.LASF2635:
 	.string	"PSWPIN"
 .LASF66:
 	.string	"first"
-.LASF2227:
+.LASF2229:
 	.string	"iommu_group"
-.LASF556:
+.LASF558:
 	.string	"wait_pidfd"
-.LASF1943:
+.LASF1945:
 	.string	"s_umount_key"
-.LASF2923:
+.LASF2927:
 	.string	"xen_start_info"
-.LASF2455:
+.LASF2457:
 	.string	"of_fwnode_ops"
-.LASF2865:
+.LASF2867:
 	.string	"buf_mode"
-.LASF971:
+.LASF973:
 	.string	"vm_flags"
-.LASF1721:
+.LASF1723:
 	.string	"modinfo_attrs"
-.LASF2500:
+.LASF2502:
 	.string	"mux_lock"
 .LASF196:
 	.string	"has_timeout"
-.LASF2737:
+.LASF2739:
 	.string	"sh_entsize"
-.LASF416:
+.LASF418:
 	.string	"i_mode"
-.LASF2027:
+.LASF2029:
 	.string	"proc_handler"
-.LASF2217:
+.LASF2219:
 	.string	"removed_mem"
 .LASF247:
 	.string	"jump_label_t"
-.LASF3132:
+.LASF3137:
 	.string	"ebc_tcon_frame_start"
-.LASF2709:
+.LASF2711:
 	.string	"Elf64_Half"
-.LASF2284:
+.LASF2286:
 	.string	"use_autosuspend"
-.LASF3015:
+.LASF3019:
 	.string	"ebc_init"
-.LASF672:
+.LASF674:
 	.string	"nsproxy"
-.LASF2252:
+.LASF2254:
 	.string	"can_wakeup"
-.LASF2544:
+.LASF2546:
 	.string	"TIMER_SOFTIRQ"
-.LASF3111:
+.LASF3116:
 	.string	"temp_data"
-.LASF1212:
+.LASF1214:
 	.string	"xol_area"
 .LASF234:
 	.string	"rlock"
-.LASF1885:
+.LASF1887:
 	.string	"fl_owner_t"
-.LASF2729:
+.LASF2731:
 	.string	"sh_type"
-.LASF1101:
+.LASF1103:
 	.string	"euid"
-.LASF1098:
+.LASF1100:
 	.string	"wait"
-.LASF1747:
+.LASF1749:
 	.string	"bug_table"
-.LASF960:
+.LASF962:
 	.string	"seqnum"
-.LASF441:
+.LASF443:
 	.string	"dirtied_time_when"
-.LASF1893:
+.LASF1895:
 	.string	"fl_block"
-.LASF2699:
+.LASF2701:
 	.string	"init_on_free"
-.LASF1149:
+.LASF1151:
 	.string	"nr_pages"
-.LASF3127:
+.LASF3132:
 	.string	"ebc_power_set"
-.LASF1759:
+.LASF1761:
 	.string	"num_trace_bprintk_fmt"
-.LASF3212:
+.LASF3217:
 	.string	"__fls"
-.LASF1127:
+.LASF1129:
 	.string	"ioprio"
-.LASF2989:
+.LASF2993:
 	.string	"is_early_suspend"
-.LASF1161:
+.LASF1163:
 	.string	"rdev"
-.LASF1234:
+.LASF1236:
 	.string	"private_data"
-.LASF1876:
+.LASF1878:
 	.string	"signum"
-.LASF505:
+.LASF507:
 	.string	"s_mounts"
-.LASF632:
+.LASF634:
 	.string	"use_memdelay"
-.LASF1151:
+.LASF1153:
 	.string	"caller"
-.LASF344:
+.LASF346:
 	.string	"thread_struct"
-.LASF2152:
+.LASF2154:
 	.string	"envp"
-.LASF785:
+.LASF787:
 	.string	"persistent_clock_is_local"
-.LASF2411:
+.LASF2413:
 	.string	"dma_supported"
-.LASF3183:
+.LASF3188:
 	.string	"dev_set_drvdata"
-.LASF3272:
+.LASF3277:
 	.string	"epd_lut_get"
-.LASF1533:
+.LASF1535:
 	.string	"per_cpu_pages"
-.LASF1164:
+.LASF1166:
 	.string	"ctime"
-.LASF2412:
+.LASF2414:
 	.string	"set_dma_mask"
 .LASF112:
 	.string	"release"
-.LASF2368:
+.LASF2370:
 	.string	"max_segment_size"
 .LASF36:
 	.string	"__kernel_dev_t"
-.LASF2107:
+.LASF2109:
 	.string	"atomic_write_len"
-.LASF1633:
+.LASF1635:
 	.string	"dqb_btime"
-.LASF2391:
+.LASF2393:
 	.string	"revmap_tree"
-.LASF1316:
+.LASF1318:
 	.string	"mm_users"
-.LASF1475:
+.LASF1477:
 	.string	"WORKINGSET_ACTIVATE"
-.LASF513:
+.LASF515:
 	.string	"s_id"
-.LASF312:
+.LASF314:
 	.string	"__alt_instructions_end"
-.LASF1460:
+.LASF1462:
 	.string	"NR_ZSPAGES"
-.LASF530:
+.LASF532:
 	.string	"s_dentry_lru"
-.LASF2547:
+.LASF2549:
 	.string	"BLOCK_SOFTIRQ"
-.LASF1409:
+.LASF1411:
 	.string	"files_stat_struct"
-.LASF3224:
+.LASF3229:
 	.string	"devm_memremap"
-.LASF841:
+.LASF843:
 	.string	"pgtable_t"
-.LASF1031:
+.LASF1033:
 	.string	"block_start"
-.LASF2573:
+.LASF2575:
 	.string	"nodename"
-.LASF1852:
+.LASF1854:
 	.string	"symlink"
-.LASF1572:
+.LASF1574:
 	.string	"mem_map"
-.LASF3075:
+.LASF3079:
 	.string	"old_buffer"
-.LASF2949:
+.LASF2953:
 	.string	"lut_data_set"
-.LASF788:
+.LASF790:
 	.string	"sysctl_timer_migration"
-.LASF2909:
+.LASF2913:
 	.string	"DMA_NONE"
-.LASF1896:
+.LASF1898:
 	.string	"fl_type"
 .LASF58:
 	.string	"counter"
-.LASF2834:
+.LASF2836:
 	.string	"WAKE_LOCK_SUSPEND"
-.LASF1775:
+.LASF1777:
 	.string	"WRITE_LIFE_SHORT"
 .LASF285:
 	.string	"_einittext"
-.LASF2422:
+.LASF2424:
 	.string	"_flags"
-.LASF399:
+.LASF401:
 	.string	"d_rcu"
 .LASF205:
 	.string	"addr_limit"
-.LASF2804:
+.LASF2806:
 	.string	"trace_eval_map"
-.LASF1097:
+.LASF1099:
 	.string	"done"
 .LASF210:
 	.string	"elf_hwcap"
-.LASF2748:
+.LASF2750:
 	.string	"param_ops_byte"
-.LASF1982:
+.LASF1984:
 	.string	"fscrypt_operations"
-.LASF2410:
+.LASF2412:
 	.string	"mapping_error"
-.LASF1133:
+.LASF1135:
 	.string	"release_work"
-.LASF1836:
+.LASF1838:
 	.string	"i_bdev"
-.LASF2692:
+.LASF2694:
 	.string	"vm_node_stat"
-.LASF1937:
+.LASF1939:
 	.string	"mount"
-.LASF2833:
+.LASF2835:
 	.string	"kmalloc_caches"
-.LASF1376:
+.LASF1378:
 	.string	"MIGRATE_SYNC"
-.LASF1980:
+.LASF1982:
 	.string	"export_operations"
-.LASF549:
+.LASF551:
 	.string	"PIDTYPE_PGID"
-.LASF1719:
+.LASF1721:
 	.string	"rm_xquota"
-.LASF1082:
+.LASF1084:
 	.string	"dl_timer"
-.LASF3255:
+.LASF3260:
 	.string	"remap_pfn_range"
-.LASF2373:
+.LASF2375:
 	.string	"DL_DEV_NO_DRIVER"
-.LASF338:
+.LASF340:
 	.string	"hbp_watch"
-.LASF2840:
+.LASF2842:
 	.string	"WF_TYPE_RESET"
-.LASF2526:
+.LASF2528:
 	.string	"sda_gpiod"
-.LASF1546:
+.LASF1548:
 	.string	"watermark"
-.LASF2421:
+.LASF2423:
 	.string	"deadprops"
-.LASF3220:
+.LASF3225:
 	.string	"devm_kmalloc"
 .LASF16:
 	.string	"long long unsigned int"
-.LASF1292:
+.LASF1294:
 	.string	"anon_name"
-.LASF1440:
+.LASF1442:
 	.string	"ia_file"
 .LASF263:
 	.string	"arm64_ftr_reg"
-.LASF2482:
+.LASF2484:
 	.string	"irq_domain_simple_ops"
-.LASF466:
+.LASF468:
 	.string	"dentry_operations"
-.LASF736:
+.LASF738:
 	.string	"memcg_nr_pages_over_high"
-.LASF1601:
+.LASF1603:
 	.string	"percpu_counter_batch"
 .LASF42:
 	.string	"_Bool"
-.LASF1259:
+.LASF1261:
 	.string	"hmm_data"
-.LASF1028:
+.LASF1030:
 	.string	"sleep_start"
-.LASF660:
+.LASF662:
 	.string	"min_flt"
-.LASF1871:
+.LASF1873:
 	.string	"flc_lease"
-.LASF2404:
+.LASF2406:
 	.string	"unmap_resource"
-.LASF2984:
+.LASF2988:
 	.string	"wake_lock_is_set"
-.LASF2356:
+.LASF2358:
 	.string	"driver_private"
-.LASF1838:
+.LASF1840:
 	.string	"i_link"
-.LASF1379:
+.LASF1381:
 	.string	"rcu_sync_type"
-.LASF1860:
+.LASF1862:
 	.string	"listxattr"
-.LASF921:
+.LASF923:
 	.string	"_lower"
-.LASF1734:
+.LASF1736:
 	.string	"async_probe_requested"
-.LASF2306:
+.LASF2308:
 	.string	"active_count"
 .LASF279:
 	.string	"_edata"
 .LASF78:
 	.string	"__security_initcall_end"
-.LASF2158:
+.LASF2160:
 	.string	"kobj_sysfs_ops"
-.LASF2885:
+.LASF2889:
 	.string	"EPD_RESET"
-.LASF2367:
+.LASF2369:
 	.string	"device_dma_parameters"
 .LASF214:
 	.string	"fpsr"
-.LASF495:
+.LASF497:
 	.string	"s_count"
-.LASF467:
+.LASF469:
 	.string	"d_revalidate"
-.LASF2325:
+.LASF2327:
 	.string	"bus_groups"
-.LASF836:
+.LASF838:
 	.string	"pmd_t"
-.LASF486:
+.LASF488:
 	.string	"s_op"
-.LASF1609:
+.LASF1611:
 	.string	"dq_count"
-.LASF394:
+.LASF396:
 	.string	"dentry_stat"
 .LASF71:
 	.string	"pstate_check_t"
-.LASF828:
+.LASF830:
 	.string	"system_freezable_power_efficient_wq"
-.LASF3019:
+.LASF3023:
 	.string	"__func__"
 .LASF56:
 	.string	"resource_size_t"
-.LASF579:
+.LASF581:
 	.string	"wake_entry"
-.LASF948:
+.LASF950:
 	.string	"processes"
-.LASF1099:
+.LASF1101:
 	.string	"suid"
-.LASF2473:
+.LASF2475:
 	.string	"irq_domain_ops"
-.LASF957:
+.LASF959:
 	.string	"locked_vm"
-.LASF851:
+.LASF853:
 	.string	"rb_left"
-.LASF2105:
+.LASF2107:
 	.string	"seq_next"
 .LASF275:
 	.string	"_stext"
-.LASF1708:
+.LASF1710:
 	.string	"quotactl_ops"
-.LASF3080:
-	.string	"aligned_left"
-.LASF533:
+.LASF535:
 	.string	"s_sync_lock"
-.LASF2300:
+.LASF2302:
 	.string	"total_time"
 .LASF29:
 	.string	"__kernel_clock_t"
-.LASF390:
+.LASF392:
 	.string	"nr_unused"
-.LASF2912:
+.LASF2916:
 	.string	"dma_address"
-.LASF2613:
+.LASF2615:
 	.string	"mmap_rnd_compat_bits_max"
 .LASF40:
 	.string	"clockid_t"
-.LASF3013:
-	.string	"__addressable_ebc_init2194"
-.LASF1605:
+.LASF1607:
 	.string	"dq_free"
-.LASF1579:
+.LASF1581:
 	.string	"reboot_notifier_list"
-.LASF684:
+.LASF686:
 	.string	"parent_exec_id"
-.LASF2501:
+.LASF2503:
 	.string	"retries"
-.LASF2087:
+.LASF2089:
 	.string	"kernfs_elem_dir"
 .LASF213:
 	.string	"vregs"
-.LASF2622:
+.LASF2624:
 	.string	"page_entry_size"
-.LASF2970:
+.LASF2974:
 	.string	"lut_data"
-.LASF3092:
+.LASF3093:
 	.string	"ebc_other_init"
-.LASF1444:
+.LASF1446:
 	.string	"free_list"
-.LASF587:
+.LASF589:
 	.string	"prio"
-.LASF3175:
+.LASF3180:
 	.string	"platform_get_drvdata"
-.LASF2553:
+.LASF2555:
 	.string	"NR_SOFTIRQS"
-.LASF2310:
+.LASF2312:
 	.string	"autosleep_enabled"
-.LASF642:
+.LASF644:
 	.string	"ptrace_entry"
-.LASF2513:
+.LASF2515:
 	.string	"lock_bus"
-.LASF2020:
+.LASF2022:
 	.string	"def_chr_fops"
-.LASF584:
+.LASF586:
 	.string	"recent_used_cpu"
-.LASF1758:
+.LASF1760:
 	.string	"num_jump_entries"
-.LASF488:
+.LASF490:
 	.string	"s_qcop"
 .LASF59:
 	.string	"atomic_t"
-.LASF810:
+.LASF812:
 	.string	"WORK_OFFQ_FLAG_BITS"
-.LASF3133:
+.LASF3138:
 	.string	"ebc_tcon_image_addr_set"
-.LASF2529:
+.LASF2531:
 	.string	"max_num_msgs"
-.LASF2101:
+.LASF2103:
 	.string	"notify_next"
-.LASF2304:
+.LASF2306:
 	.string	"prevent_sleep_time"
-.LASF2619:
+.LASF2621:
 	.string	"sysctl_overcommit_ratio"
 .LASF202:
 	.string	"kimage_voffset"
 .LASF8:
 	.string	"short int"
-.LASF2352:
+.LASF2354:
 	.string	"of_device_id"
-.LASF2910:
+.LASF2914:
 	.string	"scatterlist"
-.LASF1265:
+.LASF1267:
 	.string	"altmap_valid"
-.LASF3274:
+.LASF3279:
 	.string	"down"
 .LASF101:
 	.string	"read_iter"
-.LASF333:
+.LASF335:
 	.string	"debug_info"
-.LASF1281:
+.LASF1283:
 	.string	"f_owner"
-.LASF2480:
+.LASF2482:
 	.string	"irq_domain_chip_generic"
-.LASF1381:
+.LASF1383:
 	.string	"RCU_SCHED_SYNC"
-.LASF2582:
+.LASF2584:
 	.string	"tracepoint"
-.LASF2781:
+.LASF2783:
 	.string	"test"
-.LASF2572:
+.LASF2574:
 	.string	"this_device"
-.LASF2003:
+.LASF2005:
 	.string	"pad_until"
-.LASF455:
+.LASF457:
 	.string	"i_writecount"
-.LASF445:
+.LASF447:
 	.string	"i_wb_frn_winner"
-.LASF1945:
+.LASF1947:
 	.string	"s_writers_key"
-.LASF1004:
+.LASF1006:
 	.string	"last_arrival"
-.LASF2386:
+.LASF2388:
 	.string	"mapcount"
-.LASF760:
+.LASF762:
 	.string	"__boot_cpu_id"
-.LASF1582:
+.LASF1584:
 	.string	"numa_zonelist_order"
-.LASF2249:
+.LASF2251:
 	.string	"pm_domain_data"
-.LASF2485:
+.LASF2487:
 	.string	"byte"
-.LASF3244:
+.LASF3249:
 	.string	"__wake_up_sync"
-.LASF2000:
+.LASF2002:
 	.string	"poll_table_struct"
-.LASF1791:
+.LASF1793:
 	.string	"direct_IO"
-.LASF2125:
+.LASF2127:
 	.string	"current_may_mount"
-.LASF379:
+.LASF381:
 	.string	"seqlock_t"
-.LASF2941:
+.LASF2945:
 	.string	"hclk"
-.LASF2113:
+.LASF2115:
 	.string	"kernfs_iattrs"
-.LASF2903:
+.LASF2907:
 	.string	"pmic_get_vcom"
-.LASF624:
+.LASF626:
 	.string	"sched_migrated"
-.LASF1240:
+.LASF1242:
 	.string	"frozen"
-.LASF2341:
+.LASF2343:
 	.string	"suppress_bind_attrs"
-.LASF1262:
+.LASF1264:
 	.string	"page_fault"
-.LASF1467:
+.LASF1469:
 	.string	"NR_INACTIVE_FILE"
-.LASF3199:
+.LASF3204:
 	.string	"__ret_warn_on"
-.LASF1623:
+.LASF1625:
 	.string	"kqid"
-.LASF2479:
+.LASF2481:
 	.string	"irq_generic_chip_ops"
-.LASF2056:
+.LASF2058:
 	.string	"index_key"
-.LASF2286:
+.LASF2288:
 	.string	"memalloc_noio"
-.LASF1619:
+.LASF1621:
 	.string	"GRPQUOTA"
-.LASF1578:
+.LASF1580:
 	.string	"rwsem"
-.LASF1432:
+.LASF1434:
 	.string	"ia_valid"
-.LASF1408:
+.LASF1410:
 	.string	"__invalid_size_argument_for_IOC"
-.LASF1238:
+.LASF1240:
 	.string	"inuse"
-.LASF820:
+.LASF822:
 	.string	"WORKER_DESC_LEN"
-.LASF1689:
+.LASF1691:
 	.string	"qc_type_state"
-.LASF2040:
+.LASF2042:
 	.string	"key_serial_t"
-.LASF1587:
+.LASF1589:
 	.string	"__highest_present_section_nr"
-.LASF2359:
+.LASF2361:
 	.string	"dev_uevent"
-.LASF2780:
+.LASF2782:
 	.string	"setup"
-.LASF1274:
+.LASF1276:
 	.string	"f_lock"
-.LASF2679:
+.LASF2681:
 	.string	"UNEVICTABLE_PGSCANNED"
-.LASF879:
+.LASF881:
 	.string	"active"
-.LASF2476:
+.LASF2478:
 	.string	"xlate"
-.LASF1634:
+.LASF1636:
 	.string	"dqb_itime"
-.LASF1776:
+.LASF1778:
 	.string	"WRITE_LIFE_MEDIUM"
-.LASF2468:
+.LASF2470:
 	.string	"DOMAIN_BUS_PLATFORM_MSI"
 .LASF268:
 	.string	"user_val"
-.LASF801:
+.LASF803:
 	.string	"WORK_STRUCT_LINKED"
-.LASF450:
+.LASF452:
 	.string	"i_wb_list"
-.LASF2025:
+.LASF2027:
 	.string	"simple_dir_operations"
-.LASF2381:
+.LASF2383:
 	.string	"defer_hook"
 .LASF128:
 	.string	"fadvise"
-.LASF2612:
+.LASF2614:
 	.string	"mmap_rnd_compat_bits_min"
-.LASF2594:
+.LASF2596:
 	.string	"vmem_altmap"
-.LASF1339:
+.LASF1341:
 	.string	"arg_end"
-.LASF2055:
+.LASF2057:
 	.string	"revoked_at"
-.LASF1186:
+.LASF1188:
 	.string	"private_list"
 .LASF260:
 	.string	"shift"
-.LASF1435:
+.LASF1437:
 	.string	"ia_gid"
 .LASF35:
 	.string	"name_offset"
-.LASF2132:
+.LASF2134:
 	.string	"attribute_group"
 .LASF299:
 	.string	"__irqentry_text_end"
-.LASF1344:
+.LASF1346:
 	.string	"context"
-.LASF1538:
+.LASF1540:
 	.string	"per_cpu_nodestat"
-.LASF2518:
+.LASF2520:
 	.string	"get_scl"
-.LASF2599:
+.LASF2601:
 	.string	"MEMORY_DEVICE_PRIVATE"
-.LASF1589:
+.LASF1591:
 	.string	"thread_id"
-.LASF730:
+.LASF732:
 	.string	"default_timer_slack_ns"
-.LASF3050:
+.LASF3054:
 	.string	"waveform_version_read"
-.LASF1765:
+.LASF1767:
 	.string	"source_list"
-.LASF755:
+.LASF757:
 	.string	"secondary_data"
-.LASF2241:
+.LASF2243:
 	.string	"RPM_REQ_NONE"
-.LASF978:
+.LASF980:
 	.string	"swap_readahead_info"
-.LASF1125:
+.LASF1127:
 	.string	"active_ref"
-.LASF833:
+.LASF835:
 	.string	"pmdval_t"
-.LASF2520:
+.LASF2522:
 	.string	"get_sda"
-.LASF1117:
+.LASF1119:
 	.string	"group_info"
-.LASF763:
+.LASF765:
 	.string	"arch_timer_erratum_match_type"
-.LASF2496:
+.LASF2498:
 	.string	"algo"
-.LASF1270:
+.LASF1272:
 	.string	"file"
-.LASF818:
+.LASF820:
 	.string	"WORK_BUSY_PENDING"
-.LASF2343:
+.LASF2345:
 	.string	"of_match_table"
-.LASF2576:
+.LASF2578:
 	.string	"percpu_count_ptr"
-.LASF3254:
+.LASF3259:
 	.string	"ebc_phy_buf_base_get"
-.LASF2077:
+.LASF2079:
 	.string	"loops_per_jiffy"
-.LASF2508:
+.LASF2510:
 	.string	"i2c_algorithm"
-.LASF2856:
+.LASF2858:
 	.string	"buf_idle"
-.LASF1397:
+.LASF1399:
 	.string	"uuid_t"
-.LASF2435:
+.LASF2437:
 	.string	"property_read_int_array"
-.LASF2973:
+.LASF2977:
 	.string	"auto_image_old"
-.LASF1858:
+.LASF1860:
 	.string	"setattr2"
-.LASF1353:
+.LASF1355:
 	.string	"init_mm"
-.LASF2659:
+.LASF2661:
 	.string	"KSWAPD_INODESTEAL"
-.LASF1173:
+.LASF1175:
 	.string	"count_objects"
-.LASF3211:
+.LASF3216:
 	.string	"fls64"
-.LASF919:
+.LASF921:
 	.string	"_stime"
-.LASF2380:
+.LASF2382:
 	.string	"needs_suppliers"
-.LASF2315:
+.LASF2317:
 	.string	"activate"
-.LASF1522:
+.LASF1524:
 	.string	"kcompactd_max_order"
-.LASF779:
+.LASF781:
 	.string	"tick_nsec"
-.LASF457:
+.LASF459:
 	.string	"i_flctx"
 .LASF134:
 	.string	"atomic_notifier_head"
-.LASF1058:
+.LASF1060:
 	.string	"statistics"
-.LASF2930:
+.LASF2934:
 	.string	"current_buffer"
-.LASF3105:
+.LASF3108:
 	.string	"direct_mode_data_change"
-.LASF1616:
+.LASF1618:
 	.string	"kprojid_t"
-.LASF664:
+.LASF666:
 	.string	"ptracer_cred"
-.LASF2139:
+.LASF2141:
 	.string	"store"
-.LASF1301:
+.LASF1303:
 	.string	"page_mkwrite"
-.LASF2007:
+.LASF2009:
 	.string	"kobject"
-.LASF2408:
+.LASF2410:
 	.string	"sync_sg_for_device"
-.LASF1962:
+.LASF1964:
 	.string	"statfs"
-.LASF3238:
+.LASF3243:
 	.string	"__kmalloc"
-.LASF3227:
+.LASF3232:
 	.string	"_dev_err"
-.LASF3217:
+.LASF3222:
 	.string	"__platform_driver_register"
-.LASF2957:
+.LASF2961:
 	.string	"ebc_buf_real_size"
-.LASF2999:
+.LASF3003:
 	.string	"ebc_thread_wq"
-.LASF1792:
+.LASF1794:
 	.string	"migratepage"
-.LASF2664:
+.LASF2666:
 	.string	"DROP_PAGECACHE"
-.LASF790:
+.LASF792:
 	.string	"work_struct"
-.LASF2892:
+.LASF2896:
 	.string	"height"
-.LASF1092:
+.LASF1094:
 	.string	"task_group"
-.LASF1067:
+.LASF1069:
 	.string	"on_list"
-.LASF2765:
+.LASF2767:
 	.string	"plt_num_entries"
-.LASF2678:
+.LASF2680:
 	.string	"UNEVICTABLE_PGCULLED"
-.LASF568:
+.LASF570:
 	.string	"kgid_t"
-.LASF580:
+.LASF582:
 	.string	"on_cpu"
-.LASF2129:
+.LASF2131:
 	.string	"drop_ns"
-.LASF1420:
+.LASF1422:
 	.string	"sysctl_protected_symlinks"
-.LASF2621:
+.LASF2623:
 	.string	"protection_map"
-.LASF2762:
+.LASF2764:
 	.string	"param_ops_string"
-.LASF2357:
+.LASF2359:
 	.string	"class_groups"
 .LASF289:
 	.string	"__per_cpu_load"
-.LASF1923:
+.LASF1925:
 	.string	"nfs4_lock_state"
-.LASF2803:
+.LASF2805:
 	.string	"trace_event_call"
-.LASF1228:
+.LASF1230:
 	.string	"i_mmap_rwsem"
-.LASF1402:
+.LASF1404:
 	.string	"errseq_t"
-.LASF1347:
+.LASF1349:
 	.string	"ioctx_table"
-.LASF1486:
+.LASF1488:
 	.string	"NR_SHMEM_PMDMAPPED"
-.LASF2532:
+.LASF2534:
 	.string	"max_comb_1st_msg_len"
-.LASF1543:
+.LASF1545:
 	.string	"ZONE_MOVABLE"
-.LASF3003:
+.LASF3007:
 	.string	"ebc_misc"
-.LASF2390:
+.LASF2392:
 	.string	"revmap_size"
-.LASF1899:
+.LASF1901:
 	.string	"fl_wait"
-.LASF682:
+.LASF684:
 	.string	"audit_context"
 .LASF290:
 	.string	"__per_cpu_start"
 .LASF282:
 	.string	"__init_begin"
-.LASF2138:
+.LASF2140:
 	.string	"sysfs_ops"
-.LASF2862:
+.LASF2864:
 	.string	"phy_addr"
-.LASF2163:
+.LASF2165:
 	.string	"firmware_kobj"
 .LASF291:
 	.string	"__per_cpu_end"
-.LASF2638:
+.LASF2640:
 	.string	"ALLOCSTALL_DMA32"
-.LASF2647:
+.LASF2649:
 	.string	"PGLAZYFREE"
-.LASF1849:
+.LASF1851:
 	.string	"create"
-.LASF1431:
+.LASF1433:
 	.string	"iattr"
-.LASF792:
+.LASF794:
 	.string	"WORK_STRUCT_PENDING_BIT"
-.LASF718:
+.LASF720:
 	.string	"rseq"
-.LASF3106:
+.LASF3111:
 	.string	"get_auto_image"
 .LASF195:
 	.string	"nfds"
-.LASF811:
+.LASF813:
 	.string	"WORK_OFFQ_POOL_SHIFT"
-.LASF717:
+.LASF719:
 	.string	"perf_event_list"
-.LASF1669:
+.LASF1671:
 	.string	"get_reserved_space"
-.LASF421:
+.LASF423:
 	.string	"i_acl"
-.LASF1787:
+.LASF1789:
 	.string	"bmap"
-.LASF3225:
+.LASF3230:
 	.string	"ebc_buf_init"
-.LASF2046:
+.LASF2048:
 	.string	"key_payload"
-.LASF2976:
+.LASF2980:
 	.string	"auto_image_osd"
-.LASF478:
+.LASF480:
 	.string	"d_real"
-.LASF2558:
+.LASF2560:
 	.string	"swapper_pg_end"
-.LASF3005:
+.LASF3009:
 	.string	"dev_attr_pmic_name"
-.LASF629:
+.LASF631:
 	.string	"in_user_fault"
-.LASF1918:
+.LASF1920:
 	.string	"lm_change"
-.LASF2537:
+.LASF2539:
 	.string	"irq_cpustat_t"
-.LASF1642:
+.LASF1644:
 	.string	"dqi_max_spc_limit"
-.LASF1256:
+.LASF1258:
 	.string	"pmd_huge_pte"
-.LASF2798:
+.LASF2800:
 	.string	"exception_table_entry"
-.LASF1556:
+.LASF1558:
 	.string	"nr_isolate_pageblock"
-.LASF2305:
+.LASF2307:
 	.string	"event_count"
 .LASF207:
 	.string	"preempt_count"
-.LASF1580:
+.LASF1582:
 	.string	"movable_zone"
-.LASF796:
+.LASF798:
 	.string	"WORK_STRUCT_COLOR_SHIFT"
 .LASF73:
 	.string	"initcall_entry_t"
 .LASF123:
 	.string	"fallocate"
-.LASF1705:
+.LASF1707:
 	.string	"i_spc_warnlimit"
-.LASF3200:
+.LASF3205:
 	.string	"check_object_size"
-.LASF1513:
+.LASF1515:
 	.string	"node_present_pages"
-.LASF1226:
+.LASF1228:
 	.string	"i_mmap_writable"
-.LASF705:
+.LASF707:
 	.string	"mems_allowed"
-.LASF2257:
+.LASF2259:
 	.string	"is_noirq_suspended"
-.LASF1756:
+.LASF1758:
 	.string	"tracepoints_ptrs"
 .LASF186:
 	.string	"time"
-.LASF582:
+.LASF584:
 	.string	"wakee_flip_decay_ts"
-.LASF1552:
+.LASF1554:
 	.string	"zone_start_pfn"
-.LASF516:
+.LASF518:
 	.string	"s_max_links"
-.LASF1041:
+.LASF1043:
 	.string	"nr_wakeups_sync"
-.LASF1748:
+.LASF1750:
 	.string	"kallsyms"
-.LASF1525:
+.LASF1527:
 	.string	"kcompactd"
 .LASF64:
 	.string	"prev"
-.LASF2213:
+.LASF2215:
 	.string	"dma_parms"
-.LASF1118:
+.LASF1120:
 	.string	"fs_struct"
 .LASF191:
 	.string	"clockid"
-.LASF1016:
+.LASF1018:
 	.string	"util_sum"
 .LASF49:
 	.string	"uint32_t"
-.LASF1338:
+.LASF1340:
 	.string	"arg_start"
-.LASF2414:
+.LASF2416:
 	.string	"unremap"
-.LASF2467:
+.LASF2469:
 	.string	"DOMAIN_BUS_PCI_MSI"
-.LASF1166:
+.LASF1168:
 	.string	"blocks"
-.LASF321:
+.LASF323:
 	.string	"__idmap_text_start"
-.LASF1714:
+.LASF1716:
 	.string	"set_info"
-.LASF3053:
+.LASF3057:
 	.string	"ebc_mmap"
-.LASF2617:
+.LASF2619:
 	.string	"sysctl_admin_reserve_kbytes"
-.LASF786:
+.LASF788:
 	.string	"timer_list"
-.LASF1682:
+.LASF1684:
 	.string	"d_ino_warns"
-.LASF2498:
+.LASF2500:
 	.string	"lock_ops"
-.LASF1324:
+.LASF1326:
 	.string	"hiwater_vm"
-.LASF3047:
+.LASF3051:
 	.string	"pmic_vcom_read"
-.LASF3219:
+.LASF3224:
 	.string	"misc_deregister"
-.LASF1246:
+.LASF1248:
 	.string	"compound_head"
-.LASF2556:
+.LASF2558:
 	.string	"empty_zero_page"
-.LASF1870:
+.LASF1872:
 	.string	"flc_posix"
 .LASF292:
 	.string	"__kprobes_text_start"
 .LASF26:
 	.string	"__kernel_ssize_t"
-.LASF1209:
+.LASF1211:
 	.string	"orig_ret_vaddr"
-.LASF432:
+.LASF434:
 	.string	"i_ctime"
-.LASF1814:
+.LASF1816:
 	.string	"bd_write_holder"
-.LASF2192:
+.LASF2194:
 	.string	"poweroff_noirq"
-.LASF3222:
+.LASF3227:
 	.string	"of_parse_phandle"
-.LASF1856:
+.LASF1858:
 	.string	"rename"
-.LASF962:
+.LASF964:
 	.string	"vm_area_struct"
-.LASF2235:
+.LASF2237:
 	.string	"rpm_status"
-.LASF1933:
+.LASF1935:
 	.string	"sb_writers"
-.LASF1691:
+.LASF1693:
 	.string	"ino_timelimit"
 .LASF120:
 	.string	"splice_write"
-.LASF2090:
+.LASF2092:
 	.string	"ino_idr"
-.LASF1704:
+.LASF1706:
 	.string	"i_rt_spc_timelimit"
 .LASF139:
 	.string	"oops_in_progress"
-.LASF3002:
+.LASF3006:
 	.string	"ebc_ops"
-.LASF3028:
+.LASF3032:
 	.string	"klogo_addr"
-.LASF1649:
+.LASF1651:
 	.string	"qf_next"
-.LASF2405:
+.LASF2407:
 	.string	"sync_single_for_cpu"
-.LASF791:
+.LASF793:
 	.string	"data"
-.LASF3168:
+.LASF3173:
 	.string	"kzalloc"
-.LASF3193:
+.LASF3198:
 	.string	"msecs_to_jiffies"
-.LASF1917:
+.LASF1919:
 	.string	"lm_break"
-.LASF1217:
+.LASF1219:
 	.string	"hyp_vectors_slot"
-.LASF1237:
+.LASF1239:
 	.string	"slab_list"
-.LASF905:
+.LASF907:
 	.string	"_unused_nodemask_arg_"
-.LASF621:
+.LASF623:
 	.string	"personality"
-.LASF1823:
+.LASF1825:
 	.string	"bd_queue"
-.LASF3016:
+.LASF3020:
 	.string	"ebc_resume"
-.LASF2827:
+.LASF2829:
 	.string	"init_task"
-.LASF386:
+.LASF388:
 	.string	"empty_name"
-.LASF1314:
+.LASF1316:
 	.string	"task_size"
-.LASF536:
+.LASF538:
 	.string	"s_inodes"
-.LASF928:
+.LASF930:
 	.string	"_addr"
-.LASF1586:
+.LASF1588:
 	.string	"pageblock_flags"
-.LASF1343:
+.LASF1345:
 	.string	"binfmt"
-.LASF2236:
+.LASF2238:
 	.string	"RPM_ACTIVE"
 .LASF4:
 	.string	"signed char"
-.LASF373:
+.LASF375:
 	.string	"rcu_scheduler_active"
-.LASF3178:
+.LASF3183:
 	.string	"propname"
-.LASF2099:
+.LASF2101:
 	.string	"priv"
-.LASF1859:
+.LASF1861:
 	.string	"getattr"
-.LASF610:
+.LASF612:
 	.string	"sched_info"
-.LASF1673:
+.LASF1675:
 	.string	"d_fieldmask"
-.LASF2001:
+.LASF2003:
 	.string	"seq_file"
-.LASF2190:
+.LASF2192:
 	.string	"freeze_noirq"
-.LASF1491:
+.LASF1493:
 	.string	"NR_DIRTIED"
-.LASF2730:
+.LASF2732:
 	.string	"sh_flags"
-.LASF608:
+.LASF610:
 	.string	"rcu_tasks_idle_cpu"
-.LASF1655:
+.LASF1657:
 	.string	"write_file_info"
-.LASF1847:
+.LASF1849:
 	.string	"get_acl"
-.LASF1957:
+.LASF1959:
 	.string	"sync_fs"
 .LASF129:
 	.string	"android_kabi_reserved1"
@@ -55764,665 +56827,667 @@ __exitcall_ebc_exit:
 	.string	"android_kabi_reserved3"
 .LASF132:
 	.string	"android_kabi_reserved4"
-.LASF2233:
+.LASF2235:
 	.string	"android_kabi_reserved5"
-.LASF2234:
+.LASF2236:
 	.string	"android_kabi_reserved6"
-.LASF746:
+.LASF748:
 	.string	"android_kabi_reserved7"
-.LASF747:
+.LASF749:
 	.string	"android_kabi_reserved8"
 .LASF246:
 	.string	"enabled"
-.LASF560:
+.LASF562:
 	.string	"init_pid_ns"
 .LASF96:
 	.string	"file_operations"
-.LASF2859:
+.LASF2861:
 	.string	"buf_osd"
-.LASF1743:
+.LASF1745:
 	.string	"arch"
-.LASF2259:
+.LASF2261:
 	.string	"no_pm"
-.LASF2890:
+.LASF2894:
 	.string	"ebc_buf_info"
-.LASF934:
+.LASF936:
 	.string	"_kill"
-.LASF783:
+.LASF785:
 	.string	"ktime_t"
-.LASF1898:
+.LASF1900:
 	.string	"fl_link_cpu"
-.LASF1725:
+.LASF1727:
 	.string	"syms"
-.LASF1053:
+.LASF1055:
 	.string	"group_node"
-.LASF2109:
+.LASF2111:
 	.string	"kernfs_open_node"
-.LASF1680:
+.LASF1682:
 	.string	"d_ino_timer"
-.LASF1468:
+.LASF1470:
 	.string	"NR_ACTIVE_FILE"
-.LASF2061:
+.LASF2063:
 	.string	"key_sysctls"
-.LASF1335:
+.LASF1337:
 	.string	"end_data"
-.LASF347:
+.LASF349:
 	.string	"sve_vl"
-.LASF2652:
+.LASF2654:
 	.string	"PGSTEAL_KSWAPD"
-.LASF3030:
+.LASF3034:
 	.string	"klogo_addr_valid"
-.LASF2600:
+.LASF2602:
 	.string	"MEMORY_DEVICE_PUBLIC"
-.LASF2330:
+.LASF2332:
 	.string	"sync_state"
-.LASF1426:
+.LASF1428:
 	.string	"ki_pos"
-.LASF1015:
+.LASF1017:
 	.string	"runnable_load_sum"
-.LASF2316:
+.LASF2318:
 	.string	"sync"
-.LASF2658:
+.LASF2660:
 	.string	"SLABS_SCANNED"
-.LASF1530:
+.LASF1532:
 	.string	"per_cpu_nodestats"
 .LASF122:
 	.string	"setlease"
-.LASF2206:
+.LASF2208:
 	.string	"pins"
-.LASF2792:
+.LASF2794:
 	.string	"ro_size"
-.LASF2267:
+.LASF2269:
 	.string	"must_resume"
 .LASF20:
 	.string	"long int"
-.LASF1555:
+.LASF1557:
 	.string	"present_pages"
-.LASF1867:
+.LASF1869:
 	.string	"file_lock_context"
-.LASF577:
+.LASF579:
 	.string	"usage"
-.LASF1535:
+.LASF1537:
 	.string	"per_cpu_pageset"
-.LASF757:
+.LASF759:
 	.string	"status"
-.LASF941:
+.LASF943:
 	.string	"si_signo"
-.LASF956:
+.LASF958:
 	.string	"uidhash_node"
 .LASF278:
 	.string	"_sdata"
-.LASF2850:
+.LASF2852:
 	.string	"WF_TYPE_GCC16"
-.LASF2512:
+.LASF2514:
 	.string	"i2c_lock_operations"
-.LASF3129:
+.LASF3134:
 	.string	"ebc_get_4pix_wf_part"
-.LASF1618:
+.LASF1620:
 	.string	"USRQUOTA"
-.LASF2043:
+.LASF2045:
 	.string	"description"
-.LASF2795:
+.LASF2797:
 	.string	"symtab"
-.LASF2914:
+.LASF2918:
 	.string	"sg_table"
-.LASF1122:
+.LASF1124:
 	.string	"rt_mutex_waiter"
-.LASF1963:
+.LASF1965:
 	.string	"remount_fs"
-.LASF485:
+.LASF487:
 	.string	"s_type"
-.LASF2289:
+.LASF2291:
 	.string	"runtime_status"
-.LASF628:
+.LASF630:
 	.string	"in_iowait"
-.LASF2584:
+.LASF2586:
 	.string	"unregfunc"
-.LASF2900:
+.LASF2904:
 	.string	"pmic_pm_suspend"
-.LASF1102:
+.LASF1104:
 	.string	"egid"
-.LASF1603:
+.LASF1605:
 	.string	"dq_hash"
-.LASF1470:
+.LASF1472:
 	.string	"NR_SLAB_RECLAIMABLE"
-.LASF1873:
+.LASF1875:
 	.string	"fscrypt_info"
-.LASF1956:
+.LASF1958:
 	.string	"put_super"
-.LASF2427:
+.LASF2429:
 	.string	"max_lock_depth"
-.LASF2449:
+.LASF2451:
 	.string	"fwnode_reference_args"
-.LASF612:
+.LASF614:
 	.string	"pushable_dl_tasks"
-.LASF1277:
+.LASF1279:
 	.string	"f_flags"
-.LASF1272:
+.LASF1274:
 	.string	"f_inode"
-.LASF2029:
+.LASF2031:
 	.string	"procname"
-.LASF3110:
+.LASF3115:
 	.string	"point_data"
-.LASF3229:
+.LASF3234:
 	.string	"epd_lut_from_file_init"
-.LASF1667:
+.LASF1669:
 	.string	"mark_dirty"
-.LASF758:
+.LASF760:
 	.string	"__early_cpu_boot_status"
-.LASF2344:
+.LASF2346:
 	.string	"acpi_match_table"
-.LASF1742:
+.LASF1744:
 	.string	"init_layout"
-.LASF1527:
+.LASF1529:
 	.string	"_pad1_"
-.LASF2777:
+.LASF2779:
 	.string	"kobj_completion"
-.LASF2866:
-	.string	"win_x1"
 .LASF2868:
+	.string	"win_x1"
+.LASF2870:
 	.string	"win_x2"
-.LASF2426:
+.LASF2428:
 	.string	"platform_device_id"
 .LASF31:
 	.string	"__kernel_clockid_t"
-.LASF683:
+.LASF685:
 	.string	"seccomp"
-.LASF3066:
+.LASF3070:
 	.string	"ebc_rst_panel"
-.LASF1789:
+.LASF1791:
 	.string	"releasepage"
-.LASF1700:
+.LASF1702:
 	.string	"qc_info"
-.LASF3067:
+.LASF3071:
 	.string	"ebc_thread"
-.LASF3082:
+.LASF3085:
 	.string	"pbuf_old"
-.LASF1501:
+.LASF2888:
+	.string	"EPD_A2_ENTER"
+.LASF1503:
 	.string	"recent_scanned"
-.LASF2932:
+.LASF2936:
 	.string	"vir_height"
-.LASF1741:
+.LASF1743:
 	.string	"core_layout"
-.LASF1529:
+.LASF1531:
 	.string	"_pad2_"
-.LASF995:
+.LASF997:
 	.string	"cancelled_write_bytes"
-.LASF2867:
-	.string	"win_y1"
 .LASF2869:
+	.string	"win_y1"
+.LASF2871:
 	.string	"win_y2"
-.LASF3076:
+.LASF3080:
 	.string	"buf_size"
-.LASF2086:
+.LASF2088:
 	.string	"bitmap"
-.LASF1584:
+.LASF1586:
 	.string	"mem_section"
-.LASF1171:
+.LASF1173:
 	.string	"memcg"
-.LASF915:
+.LASF917:
 	.string	"_sigval"
-.LASF2566:
+.LASF2568:
 	.string	"MEMREMAP_ENC"
-.LASF2555:
+.LASF2557:
 	.string	"ksoftirqd"
-.LASF668:
+.LASF670:
 	.string	"nameidata"
-.LASF1423:
+.LASF1425:
 	.string	"sysctl_protected_regular"
-.LASF2023:
+.LASF2025:
 	.string	"simple_symlink_inode_operations"
-.LASF2794:
+.LASF2796:
 	.string	"mod_kallsyms"
-.LASF353:
+.LASF355:
 	.string	"sve_max_vl"
-.LASF2863:
+.LASF2865:
 	.string	"virt_addr"
-.LASF1594:
+.LASF1596:
 	.string	"core_sibling"
-.LASF1059:
+.LASF1061:
 	.string	"depth"
-.LASF1566:
+.LASF1568:
 	.string	"_pad3_"
-.LASF359:
+.LASF361:
 	.string	"wait_queue_func_t"
 .LASF272:
 	.string	"cpu_hwcap_keys"
-.LASF1375:
+.LASF1377:
 	.string	"MIGRATE_SYNC_LIGHT"
-.LASF1035:
+.LASF1037:
 	.string	"nr_migrations_cold"
-.LASF3045:
+.LASF3049:
 	.string	"ebc_version_read"
 .LASF303:
 	.string	"__end_once"
-.LASF2918:
+.LASF2922:
 	.string	"dma_noncoherent_ops"
-.LASF1503:
+.LASF1505:
 	.string	"lists"
 .LASF52:
 	.string	"dma_addr_t"
 .LASF47:
 	.string	"ssize_t"
-.LASF774:
+.LASF776:
 	.string	"set_next_event_phys"
-.LASF2626:
+.LASF2628:
 	.string	"shmem_enabled_attr"
-.LASF1505:
+.LASF1507:
 	.string	"inactive_age"
-.LASF2601:
+.LASF2603:
 	.string	"MEMORY_DEVICE_FS_DAX"
-.LASF2961:
+.LASF2965:
 	.string	"frame_bw_total"
-.LASF2793:
+.LASF2795:
 	.string	"ro_after_init_size"
-.LASF2044:
+.LASF2046:
 	.string	"desc_len"
 .LASF119:
 	.string	"flock"
-.LASF987:
+.LASF989:
 	.string	"task_io_accounting"
-.LASF1296:
+.LASF1298:
 	.string	"mremap"
-.LASF512:
+.LASF514:
 	.string	"s_writers"
-.LASF2842:
+.LASF2844:
 	.string	"WF_TYPE_GRAY4"
-.LASF2581:
+.LASF2583:
 	.string	"tracepoint_func"
-.LASF2151:
+.LASF2153:
 	.string	"argv"
-.LASF358:
+.LASF360:
 	.string	"entry"
-.LASF1979:
+.LASF1981:
 	.string	"free_cached_objects"
-.LASF821:
+.LASF823:
 	.string	"workqueue_struct"
-.LASF687:
+.LASF689:
 	.string	"pi_lock"
-.LASF2819:
+.LASF2821:
 	.string	"platform_bus"
-.LASF880:
+.LASF882:
 	.string	"get_time"
-.LASF662:
+.LASF664:
 	.string	"cputime_expires"
-.LASF728:
+.LASF730:
 	.string	"dirty_paused_when"
-.LASF2030:
+.LASF2032:
 	.string	"maxlen"
-.LASF1454:
+.LASF1456:
 	.string	"NR_ZONE_UNEVICTABLE"
-.LASF1754:
+.LASF1756:
 	.string	"percpu_size"
-.LASF1321:
+.LASF1323:
 	.string	"mmap_sem"
-.LASF3256:
+.LASF3261:
 	.string	"schedule"
-.LASF3085:
-	.string	"old_buf_left"
-.LASF2440:
+.LASF2442:
 	.string	"get_reference_args"
-.LASF2283:
+.LASF2285:
 	.string	"irq_safe"
 .LASF174:
 	.string	"tv_nsec"
-.LASF448:
+.LASF450:
 	.string	"i_lru"
-.LASF1784:
+.LASF1786:
 	.string	"readpages"
 .LASF256:
 	.string	"arm64_ftr_bits"
-.LASF1569:
+.LASF1571:
 	.string	"zone_idx"
-.LASF1168:
+.LASF1170:
 	.string	"gfp_mask"
-.LASF713:
+.LASF715:
 	.string	"pi_state_list"
-.LASF1493:
+.LASF1495:
 	.string	"NR_KERNEL_MISC_RECLAIMABLE"
-.LASF1615:
+.LASF1617:
 	.string	"projid_t"
-.LASF1230:
+.LASF1232:
 	.string	"nrexceptional"
-.LASF1115:
+.LASF1117:
 	.string	"user"
-.LASF1778:
+.LASF1780:
 	.string	"WRITE_LIFE_EXTREME"
-.LASF1042:
+.LASF1044:
 	.string	"nr_wakeups_migrate"
-.LASF1643:
+.LASF1645:
 	.string	"dqi_max_ino_limit"
-.LASF1637:
+.LASF1639:
 	.string	"dqi_fmt_id"
-.LASF2394:
+.LASF2396:
 	.string	"dev_pin_info"
-.LASF1372:
+.LASF1374:
 	.string	"fe_reserved"
-.LASF1317:
+.LASF1319:
 	.string	"mm_count"
-.LASF2327:
+.LASF2329:
 	.string	"drv_groups"
-.LASF576:
+.LASF578:
 	.string	"stack"
-.LASF2415:
+.LASF2417:
 	.string	"dma_coherent_mem"
 .LASF259:
 	.string	"strict"
 .LASF201:
 	.string	"kimage_vaddr"
-.LASF1368:
+.LASF1370:
 	.string	"fe_physical"
-.LASF787:
+.LASF789:
 	.string	"function"
-.LASF1428:
+.LASF1430:
 	.string	"ki_flags"
-.LASF1389:
+.LASF1391:
 	.string	"gp_type"
-.LASF2964:
+.LASF2968:
 	.string	"part_mode_count"
-.LASF398:
+.LASF400:
 	.string	"d_in_lookup_hash"
-.LASF1100:
+.LASF1102:
 	.string	"sgid"
-.LASF2128:
+.LASF2130:
 	.string	"initial_ns"
-.LASF2809:
+.LASF2811:
 	.string	"node_devices"
-.LASF854:
+.LASF856:
 	.string	"rb_leftmost"
 .LASF204:
 	.string	"thread_info"
-.LASF775:
+.LASF777:
 	.string	"set_next_event_virt"
 .LASF172:
 	.string	"timespec"
-.LASF2797:
+.LASF2799:
 	.string	"strtab"
-.LASF2328:
+.LASF2330:
 	.string	"match"
 .LASF230:
 	.string	"lock_stat"
-.LASF2392:
+.LASF2394:
 	.string	"revmap_tree_mutex"
-.LASF3049:
+.LASF3053:
 	.string	"pmic_name_read"
-.LASF1077:
+.LASF1079:
 	.string	"dl_throttled"
-.LASF439:
+.LASF441:
 	.string	"i_rwsem"
-.LASF1670:
+.LASF1672:
 	.string	"get_projid"
-.LASF622:
+.LASF624:
 	.string	"sched_reset_on_fork"
-.LASF1520:
+.LASF1522:
 	.string	"kswapd_classzone_idx"
 .LASF211:
 	.string	"__int128 unsigned"
-.LASF1002:
+.LASF1004:
 	.string	"pcount"
-.LASF2193:
+.LASF2195:
 	.string	"restore_noirq"
-.LASF1425:
+.LASF1427:
 	.string	"ki_filp"
-.LASF1110:
+.LASF3110:
+	.string	"clac_full_data_align16"
+.LASF1112:
 	.string	"cap_ambient"
-.LASF2335:
+.LASF2337:
 	.string	"dma_configure"
-.LASF2290:
+.LASF2292:
 	.string	"runtime_error"
-.LASF3057:
+.LASF3061:
 	.string	"temp_offset"
-.LASF947:
+.LASF949:
 	.string	"__count"
 .LASF60:
 	.string	"atomic64_t"
-.LASF973:
+.LASF975:
 	.string	"anon_vma"
-.LASF2280:
+.LASF2282:
 	.string	"runtime_auto"
-.LASF2349:
+.LASF2351:
 	.string	"PROBE_DEFAULT_STRATEGY"
-.LASF2744:
+.LASF2746:
 	.string	"elemsize"
-.LASF889:
+.LASF3100:
+	.string	"clac_part_data_align16"
+.LASF891:
 	.string	"nr_events"
-.LASF2319:
+.LASF2321:
 	.string	"iommu"
-.LASF357:
+.LASF359:
 	.string	"private"
-.LASF2590:
+.LASF2592:
 	.string	"__tracepoint_page_ref_mod_and_return"
-.LASF2791:
+.LASF2793:
 	.string	"text_size"
-.LASF1651:
+.LASF1653:
 	.string	"stat"
-.LASF2980:
+.LASF2984:
 	.string	"lut_ddr_vir"
-.LASF1319:
+.LASF1321:
 	.string	"map_count"
-.LASF619:
+.LASF621:
 	.string	"pdeath_signal"
-.LASF618:
+.LASF620:
 	.string	"exit_signal"
-.LASF2853:
+.LASF2855:
 	.string	"frame_num"
-.LASF954:
+.LASF956:
 	.string	"uid_keyring"
-.LASF723:
+.LASF725:
 	.string	"splice_pipe"
-.LASF3088:
+.LASF3089:
 	.string	"frame_done_callback"
-.LASF1798:
+.LASF1800:
 	.string	"error_remove_page"
-.LASF3084:
-	.string	"new_buf_left"
-.LASF2321:
+.LASF2323:
 	.string	"pdev_archdata"
-.LASF1518:
+.LASF1520:
 	.string	"kswapd"
 .LASF110:
 	.string	"open"
-.LASF901:
+.LASF903:
 	.string	"mode"
-.LASF590:
+.LASF592:
 	.string	"rt_priority"
-.LASF1190:
+.LASF1192:
 	.string	"slots"
-.LASF496:
+.LASF498:
 	.string	"s_active"
-.LASF996:
+.LASF998:
 	.string	"ptr64"
-.LASF1439:
+.LASF1441:
 	.string	"ia_ctime"
 .LASF44:
 	.string	"gid_t"
-.LASF585:
+.LASF587:
 	.string	"wake_cpu"
-.LASF1210:
+.LASF1212:
 	.string	"chained"
-.LASF1366:
+.LASF1368:
 	.string	"fiemap_extent"
-.LASF681:
+.LASF683:
 	.string	"task_works"
-.LASF1887:
+.LASF1889:
 	.string	"fl_copy_lock"
-.LASF853:
+.LASF855:
 	.string	"rb_root_cached"
-.LASF499:
+.LASF501:
 	.string	"s_cop"
-.LASF1019:
+.LASF1021:
 	.string	"runnable_load_avg"
-.LASF1249:
+.LASF1251:
 	.string	"compound_mapcount"
-.LASF1447:
+.LASF1449:
 	.string	"zone_stat_item"
-.LASF3170:
+.LASF3175:
 	.string	"kmalloc_large"
-.LASF2624:
+.LASF2626:
 	.string	"PE_SIZE_PMD"
-.LASF885:
+.LASF887:
 	.string	"hres_active"
-.LASF1606:
+.LASF1608:
 	.string	"dq_dirty"
-.LASF1746:
+.LASF1748:
 	.string	"bug_list"
-.LASF2261:
+.LASF2263:
 	.string	"direct_complete"
-.LASF752:
+.LASF754:
 	.string	"__per_cpu_offset"
-.LASF2082:
+.LASF2084:
 	.string	"idr_rt"
-.LASF2506:
+.LASF2508:
 	.string	"quirks"
-.LASF1193:
+.LASF1195:
 	.string	"xa_lock"
-.LASF1925:
+.LASF1927:
 	.string	"nfs4_fl"
-.LASF1506:
+.LASF1508:
 	.string	"refaults"
-.LASF1006:
+.LASF1008:
 	.string	"load_weight"
-.LASF2851:
+.LASF2853:
 	.string	"WF_TYPE_MAX"
-.LASF567:
+.LASF569:
 	.string	"kuid_t"
-.LASF1032:
+.LASF1034:
 	.string	"block_max"
-.LASF604:
+.LASF606:
 	.string	"rcu_blocked_node"
-.LASF1385:
+.LASF1387:
 	.string	"gp_count"
-.LASF2049:
+.LASF2051:
 	.string	"key_restriction"
-.LASF3073:
+.LASF3077:
 	.string	"check_part_mode"
-.LASF616:
+.LASF618:
 	.string	"exit_state"
 .LASF152:
 	.string	"SYSTEM_SCHEDULING"
-.LASF2258:
+.LASF2260:
 	.string	"is_late_suspended"
 .LASF307:
 	.string	"__end_opd"
-.LASF1415:
+.LASF1417:
 	.string	"files_stat"
-.LASF1912:
+.LASF1914:
 	.string	"lm_owner_key"
-.LASF1537:
+.LASF1539:
 	.string	"vm_stat_diff"
-.LASF2847:
+.LASF2849:
 	.string	"WF_TYPE_GL16"
-.LASF2281:
+.LASF2283:
 	.string	"ignore_children"
-.LASF2079:
+.LASF2081:
 	.string	"resource"
-.LASF2187:
+.LASF2189:
 	.string	"restore_early"
-.LASF2092:
+.LASF2094:
 	.string	"next_generation"
-.LASF2589:
+.LASF2591:
 	.string	"__tracepoint_page_ref_mod_and_test"
-.LASF1941:
+.LASF1943:
 	.string	"fs_supers"
-.LASF1129:
+.LASF1131:
 	.string	"last_waited"
-.LASF3052:
+.LASF3056:
 	.string	"ebc_open"
-.LASF3139:
+.LASF3144:
 	.string	"three_win_mode"
-.LASF2872:
+.LASF2874:
 	.string	"EPD_OVERLAY"
-.LASF1627:
+.LASF1629:
 	.string	"dqb_bsoftlimit"
 .LASF218:
 	.string	"pending"
-.LASF2977:
+.LASF2981:
 	.string	"direct_buffer"
-.LASF2490:
+.LASF2492:
 	.string	"i2c_client_type"
-.LASF1026:
+.LASF1028:
 	.string	"iowait_count"
-.LASF2552:
+.LASF2554:
 	.string	"RCU_SOFTIRQ"
-.LASF2805:
+.LASF2807:
 	.string	"module_mutex"
-.LASF2648:
+.LASF2650:
 	.string	"PGFAULT"
-.LASF1574:
+.LASF1576:
 	.string	"notifier_block"
-.LASF2294:
+.LASF2296:
 	.string	"suspended_jiffies"
-.LASF2160:
+.LASF2162:
 	.string	"mm_kobj"
-.LASF2742:
+.LASF2744:
 	.string	"string"
-.LASF1391:
+.LASF1393:
 	.string	"read_count"
-.LASF1253:
+.LASF1255:
 	.string	"pt_mm"
-.LASF1502:
+.LASF1504:
 	.string	"lruvec"
-.LASF2896:
+.LASF2900:
 	.string	"ebc_pmic"
 .LASF14:
 	.string	"long long int"
-.LASF311:
+.LASF313:
 	.string	"__alt_instructions"
-.LASF2384:
+.LASF2386:
 	.string	"irq_domain"
-.LASF633:
+.LASF635:
 	.string	"atomic_flags"
-.LASF2535:
+.LASF2537:
 	.string	"__softirq_pending"
-.LASF1597:
+.LASF1599:
 	.string	"freq_scale"
-.LASF2270:
+.LASF2272:
 	.string	"timer_expires"
-.LASF2825:
+.LASF2827:
 	.string	"mmlist_lock"
-.LASF3156:
+.LASF3161:
 	.string	"ebc_pmic_power_on"
-.LASF1763:
+.LASF1765:
 	.string	"trace_evals"
-.LASF883:
+.LASF885:
 	.string	"active_bases"
-.LASF2732:
+.LASF2734:
 	.string	"sh_offset"
-.LASF2260:
+.LASF2262:
 	.string	"early_init"
-.LASF2728:
+.LASF2730:
 	.string	"sh_name"
-.LASF744:
+.LASF746:
 	.string	"security"
 .LASF262:
 	.string	"safe_val"
-.LASF365:
+.LASF367:
 	.string	"nr_cpu_ids"
-.LASF1279:
+.LASF1281:
 	.string	"f_pos_lock"
 .LASF179:
 	.string	"system_states"
-.LASF2188:
+.LASF2190:
 	.string	"suspend_noirq"
-.LASF1701:
+.LASF1703:
 	.string	"i_fieldmask"
 .LASF97:
 	.string	"owner"
-.LASF702:
+.LASF704:
 	.string	"acct_rss_mem1"
-.LASF829:
+.LASF831:
 	.string	"refcount_struct"
-.LASF1260:
+.LASF1262:
 	.string	"_zd_pad_1"
-.LASF2248:
+.LASF2250:
 	.string	"domain_data"
-.LASF328:
+.LASF330:
 	.string	"__mmuoff_data_end"
-.LASF2307:
+.LASF2309:
 	.string	"relax_count"
-.LASF1411:
+.LASF1413:
 	.string	"nr_free_files"
-.LASF3169:
+.LASF3174:
 	.string	"kmalloc"
 	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
 	.section	.note.GNU-stack,"",@progbits
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S
index ce20a5a7e45c..39ca0a73f5ea 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S
@@ -14,7 +14,7 @@
 	.p2align 3,,7
 	.type	get_wf_mode_index, %function
 get_wf_mode_index:
-.LFB1548:
+.LFB1549:
 	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform.c"
 	.loc 1 383 0
 	.cfi_startproc
@@ -432,14 +432,14 @@ get_wf_mode_index:
 	ldr	w0, [x19]
 	b	.L50
 	.cfi_endproc
-.LFE1548:
+.LFE1549:
 	.size	get_wf_mode_index, .-get_wf_mode_index
 	.align	2
 	.p2align 3,,7
 	.global	decodewaveform
 	.type	decodewaveform, %function
 decodewaveform:
-.LFB1546:
+.LFB1547:
 	.loc 1 64 0
 	.cfi_startproc
 .LVL21:
@@ -760,13 +760,13 @@ decodewaveform:
 	mov	w0, -22
 	b	.L51
 	.cfi_endproc
-.LFE1546:
+.LFE1547:
 	.size	decodewaveform, .-decodewaveform
 	.align	2
 	.p2align 3,,7
 	.type	get_wf_frm_num, %function
 get_wf_frm_num:
-.LFB1550:
+.LFB1551:
 	.loc 1 450 0
 	.cfi_startproc
 .LVL44:
@@ -904,14 +904,14 @@ get_wf_frm_num:
 	mov	w0, -22
 	b	.L91
 	.cfi_endproc
-.LFE1550:
+.LFE1551:
 	.size	get_wf_frm_num, .-get_wf_frm_num
 	.align	2
 	.p2align 3,,7
 	.global	pvi_wf_get_lut
 	.type	pvi_wf_get_lut, %function
 pvi_wf_get_lut:
-.LFB1552:
+.LFB1553:
 	.loc 1 937 0
 	.cfi_startproc
 .LVL58:
@@ -1195,14 +1195,14 @@ pvi_wf_get_lut:
 .LVL85:
 	b	.L111
 	.cfi_endproc
-.LFE1552:
+.LFE1553:
 	.size	pvi_wf_get_lut, .-pvi_wf_get_lut
 	.align	2
 	.p2align 3,,7
 	.global	pvi_wf_input
 	.type	pvi_wf_input, %function
 pvi_wf_input:
-.LFB1553:
+.LFB1554:
 	.loc 1 993 0
 	.cfi_startproc
 .LVL86:
@@ -1292,14 +1292,14 @@ pvi_wf_input:
 	beq	.L152
 	b	.L150
 	.cfi_endproc
-.LFE1553:
+.LFE1554:
 	.size	pvi_wf_input, .-pvi_wf_input
 	.align	2
 	.p2align 3,,7
 	.global	pvi_wf_get_version
 	.type	pvi_wf_get_version, %function
 pvi_wf_get_version:
-.LFB1554:
+.LFB1555:
 	.loc 1 1031 0
 	.cfi_startproc
 	.loc 1 1032 0
@@ -1331,32 +1331,32 @@ pvi_wf_get_version:
 	.loc 1 1045 0
 	ret
 	.cfi_endproc
-.LFE1554:
+.LFE1555:
 	.size	pvi_wf_get_version, .-pvi_wf_get_version
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR1,. + 0
-	.type	__func__.16854, %object
-	.size	__func__.16854, 15
-__func__.16854:
+	.type	__func__.16872, %object
+	.size	__func__.16872, 15
+__func__.16872:
 	.string	"get_wf_frm_num"
 	.data
 	.align	2
 	.set	.LANCHOR2,. + 0
-	.type	sftemp.16894, %object
-	.size	sftemp.16894, 4
-sftemp.16894:
+	.type	sftemp.16912, %object
+	.size	sftemp.16912, 4
+sftemp.16912:
 	.word	-1
-	.type	stype.16893, %object
-	.size	stype.16893, 4
-stype.16893:
+	.type	stype.16911, %object
+	.size	stype.16911, 4
+stype.16911:
 	.word	12
 	.bss
 	.align	3
 	.set	.LANCHOR0,. + 0
-	.type	pvi_modes.16805, %object
-	.size	pvi_modes.16805, 36
-pvi_modes.16805:
+	.type	pvi_modes.16823, %object
+	.size	pvi_modes.16823, 36
+pvi_modes.16823:
 	.zero	36
 	.zero	4
 	.type	global_waveform, %object
@@ -1367,9 +1367,9 @@ global_waveform:
 	.size	waveformdata, 8
 waveformdata:
 	.zero	8
-	.type	spi_id_buffer.16929, %object
-	.size	spi_id_buffer.16929, 32
-spi_id_buffer.16929:
+	.type	spi_id_buffer.16947, %object
+	.size	spi_id_buffer.16947, 32
+spi_id_buffer.16947:
 	.zero	32
 	.section	.rodata.str1.8,"aMS",@progbits,1
 	.align	3
@@ -1497,15 +1497,15 @@ spi_id_buffer.16929:
 	.file 96 "drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x683e
+	.4byte	0x6854
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF1511
-	.byte	0x1
-	.4byte	.LASF1512
 	.4byte	.LASF1513
+	.byte	0x1
+	.4byte	.LASF1514
+	.4byte	.LASF1515
 	.8byte	.Ltext0
 	.8byte	.Letext0-.Ltext0
 	.4byte	.Ldebug_line0
@@ -2222,7 +2222,7 @@ spi_id_buffer.16929:
 	.4byte	.LASF101
 	.byte	0xf
 	.byte	0x3e
-	.4byte	0x2c54
+	.4byte	0x2c6a
 	.byte	0x8
 	.byte	0
 	.uleb128 0x17
@@ -2486,7 +2486,7 @@ spi_id_buffer.16929:
 	.byte	0x12
 	.4byte	0xbb
 	.uleb128 0x22
-	.4byte	.LASF996
+	.4byte	.LASF998
 	.byte	0
 	.byte	0x11
 	.2byte	0x1b1
@@ -3027,201 +3027,211 @@ spi_id_buffer.16929:
 	.byte	0x18
 	.byte	0x36
 	.4byte	0x4ed
-	.uleb128 0x28
+	.uleb128 0x13
 	.4byte	.LASF226
 	.byte	0x18
-	.byte	0x38
-	.uleb128 0x28
+	.byte	0x39
+	.4byte	0x4ed
+	.uleb128 0x13
 	.4byte	.LASF227
 	.byte	0x18
-	.byte	0x38
-	.uleb128 0x13
+	.byte	0x39
+	.4byte	0x4ed
+	.uleb128 0x28
 	.4byte	.LASF228
+	.byte	0x18
+	.byte	0x3b
+	.uleb128 0x28
+	.4byte	.LASF229
+	.byte	0x18
+	.byte	0x3b
+	.uleb128 0x13
+	.4byte	.LASF230
 	.byte	0x19
 	.byte	0x15
 	.4byte	0x4ed
 	.uleb128 0x13
-	.4byte	.LASF229
+	.4byte	.LASF231
 	.byte	0x19
 	.byte	0x15
 	.4byte	0x4ed
 	.uleb128 0x13
-	.4byte	.LASF230
+	.4byte	.LASF232
 	.byte	0x19
 	.byte	0x16
 	.4byte	0x4ed
 	.uleb128 0x13
-	.4byte	.LASF231
+	.4byte	.LASF233
 	.byte	0x19
 	.byte	0x16
 	.4byte	0x4ed
 	.uleb128 0x13
-	.4byte	.LASF232
+	.4byte	.LASF234
 	.byte	0x19
 	.byte	0x17
 	.4byte	0x4ed
 	.uleb128 0x13
-	.4byte	.LASF233
+	.4byte	.LASF235
 	.byte	0x19
 	.byte	0x17
 	.4byte	0x4ed
 	.uleb128 0x13
-	.4byte	.LASF234
+	.4byte	.LASF236
 	.byte	0x19
 	.byte	0x18
 	.4byte	0x4ed
 	.uleb128 0x13
-	.4byte	.LASF235
+	.4byte	.LASF237
 	.byte	0x19
 	.byte	0x18
 	.4byte	0x4ed
 	.uleb128 0x13
-	.4byte	.LASF236
+	.4byte	.LASF238
 	.byte	0x19
 	.byte	0x19
 	.4byte	0x4ed
 	.uleb128 0x13
-	.4byte	.LASF237
+	.4byte	.LASF239
 	.byte	0x19
 	.byte	0x19
 	.4byte	0x4ed
 	.uleb128 0x13
-	.4byte	.LASF238
+	.4byte	.LASF240
 	.byte	0x19
 	.byte	0x1a
 	.4byte	0x4ed
 	.uleb128 0x13
-	.4byte	.LASF239
+	.4byte	.LASF241
 	.byte	0x19
 	.byte	0x1a
 	.4byte	0x4ed
 	.uleb128 0x13
-	.4byte	.LASF240
+	.4byte	.LASF242
 	.byte	0x19
 	.byte	0x1b
 	.4byte	0x4ed
 	.uleb128 0x13
-	.4byte	.LASF241
+	.4byte	.LASF243
 	.byte	0x19
 	.byte	0x1b
 	.4byte	0x4ed
 	.uleb128 0x13
-	.4byte	.LASF242
+	.4byte	.LASF244
 	.byte	0x19
 	.byte	0x1c
 	.4byte	0x4ed
 	.uleb128 0x13
-	.4byte	.LASF243
+	.4byte	.LASF245
 	.byte	0x19
 	.byte	0x1c
 	.4byte	0x4ed
 	.uleb128 0x13
-	.4byte	.LASF244
+	.4byte	.LASF246
 	.byte	0x19
 	.byte	0x1e
 	.4byte	0x4ed
 	.uleb128 0x13
-	.4byte	.LASF245
+	.4byte	.LASF247
 	.byte	0x19
 	.byte	0x1e
 	.4byte	0x4ed
 	.uleb128 0x13
-	.4byte	.LASF246
+	.4byte	.LASF248
 	.byte	0x19
 	.byte	0x1f
 	.4byte	0x4ed
 	.uleb128 0x13
-	.4byte	.LASF247
+	.4byte	.LASF249
 	.byte	0x19
 	.byte	0x1f
 	.4byte	0x4ed
 	.uleb128 0x5
 	.4byte	0x120
-	.4byte	0xdb2
+	.4byte	0xdc8
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x1
 	.byte	0
 	.uleb128 0x13
-	.4byte	.LASF248
+	.4byte	.LASF250
 	.byte	0x1a
 	.byte	0x4a
-	.4byte	0xda2
+	.4byte	0xdb8
 	.uleb128 0x13
-	.4byte	.LASF249
+	.4byte	.LASF251
 	.byte	0x1b
 	.byte	0xb7
 	.4byte	0x12b
 	.uleb128 0x13
-	.4byte	.LASF250
+	.4byte	.LASF252
 	.byte	0x1b
 	.byte	0xbc
 	.4byte	0x136
 	.uleb128 0x13
-	.4byte	.LASF251
+	.4byte	.LASF253
 	.byte	0x1b
 	.byte	0xbf
 	.4byte	0x136
 	.uleb128 0x13
-	.4byte	.LASF252
+	.4byte	.LASF254
 	.byte	0x1c
 	.byte	0x56
 	.4byte	0x29b
 	.uleb128 0x26
-	.4byte	.LASF253
+	.4byte	.LASF255
 	.2byte	0x110
 	.byte	0x1c
 	.byte	0x59
-	.4byte	0xe33
+	.4byte	0xe49
 	.uleb128 0xe
-	.4byte	.LASF254
+	.4byte	.LASF256
 	.byte	0x1c
 	.byte	0x5c
 	.4byte	0xbb
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF255
+	.4byte	.LASF257
 	.byte	0x1c
 	.byte	0x5e
 	.4byte	0xbb
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF256
+	.4byte	.LASF258
 	.byte	0x1c
 	.byte	0x5f
 	.4byte	0xbb
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF257
+	.4byte	.LASF259
 	.byte	0x1c
 	.byte	0x61
-	.4byte	0xe33
+	.4byte	0xe49
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF258
+	.4byte	.LASF260
 	.byte	0x1c
 	.byte	0x62
-	.4byte	0xe33
+	.4byte	0xe49
 	.byte	0x90
 	.byte	0
 	.uleb128 0x5
-	.4byte	0xe43
-	.4byte	0xe43
+	.4byte	0xe59
+	.4byte	0xe59
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0xf
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe49
+	.4byte	0xe5f
 	.uleb128 0x1a
-	.4byte	.LASF259
+	.4byte	.LASF261
 	.uleb128 0xf
-	.4byte	.LASF260
+	.4byte	.LASF262
 	.byte	0x68
 	.byte	0x1c
 	.byte	0x66
-	.4byte	0xef4
+	.4byte	0xf0a
 	.uleb128 0x12
 	.string	"x19"
 	.byte	0x1c
@@ -3305,103 +3315,103 @@ spi_id_buffer.16929:
 	.2byte	0x220
 	.byte	0x1c
 	.byte	0x7e
-	.4byte	0xf22
+	.4byte	0xf38
 	.uleb128 0xe
-	.4byte	.LASF261
+	.4byte	.LASF263
 	.byte	0x1c
 	.byte	0x7f
 	.4byte	0x2d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF262
+	.4byte	.LASF264
 	.byte	0x1c
 	.byte	0x80
 	.4byte	0x2d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF263
+	.4byte	.LASF265
 	.byte	0x1c
 	.byte	0x81
 	.4byte	0xaf1
 	.byte	0x10
 	.byte	0
 	.uleb128 0x26
-	.4byte	.LASF264
+	.4byte	.LASF266
 	.2byte	0x3d0
 	.byte	0x1c
 	.byte	0x76
-	.4byte	0xfa2
+	.4byte	0xfb8
 	.uleb128 0xe
-	.4byte	.LASF260
+	.4byte	.LASF262
 	.byte	0x1c
 	.byte	0x77
-	.4byte	0xe4e
+	.4byte	0xe64
 	.byte	0
 	.uleb128 0x12
 	.string	"uw"
 	.byte	0x1c
 	.byte	0x82
-	.4byte	0xef4
+	.4byte	0xf0a
 	.byte	0x70
 	.uleb128 0x27
-	.4byte	.LASF265
+	.4byte	.LASF267
 	.byte	0x1c
 	.byte	0x84
 	.4byte	0x6c
 	.2byte	0x290
 	.uleb128 0x27
-	.4byte	.LASF266
+	.4byte	.LASF268
 	.byte	0x1c
 	.byte	0x85
 	.4byte	0x45b
 	.2byte	0x298
 	.uleb128 0x27
-	.4byte	.LASF267
+	.4byte	.LASF269
 	.byte	0x1c
 	.byte	0x86
 	.4byte	0x6c
 	.2byte	0x2a0
 	.uleb128 0x27
-	.4byte	.LASF268
+	.4byte	.LASF270
 	.byte	0x1c
 	.byte	0x87
 	.4byte	0x6c
 	.2byte	0x2a4
 	.uleb128 0x27
-	.4byte	.LASF269
+	.4byte	.LASF271
 	.byte	0x1c
 	.byte	0x88
 	.4byte	0x2d
 	.2byte	0x2a8
 	.uleb128 0x27
-	.4byte	.LASF270
+	.4byte	.LASF272
 	.byte	0x1c
 	.byte	0x89
 	.4byte	0x2d
 	.2byte	0x2b0
 	.uleb128 0x27
-	.4byte	.LASF271
+	.4byte	.LASF273
 	.byte	0x1c
 	.byte	0x8a
-	.4byte	0xde9
+	.4byte	0xdff
 	.2byte	0x2b8
 	.byte	0
 	.uleb128 0x17
-	.4byte	.LASF272
+	.4byte	.LASF274
 	.byte	0x1c
 	.2byte	0x111
 	.4byte	0x2d
 	.uleb128 0x13
-	.4byte	.LASF273
+	.4byte	.LASF275
 	.byte	0x1d
 	.byte	0x59
 	.4byte	0xbb
 	.uleb128 0xf
-	.4byte	.LASF274
+	.4byte	.LASF276
 	.byte	0x4
 	.byte	0x1e
 	.byte	0xf
-	.4byte	0xfd2
+	.4byte	0xfe8
 	.uleb128 0xe
 	.4byte	.LASF135
 	.byte	0x1e
@@ -3410,29 +3420,29 @@ spi_id_buffer.16929:
 	.byte	0
 	.byte	0
 	.uleb128 0x13
-	.4byte	.LASF275
+	.4byte	.LASF277
 	.byte	0x1f
 	.byte	0xb
 	.4byte	0xbb
 	.uleb128 0x13
-	.4byte	.LASF276
+	.4byte	.LASF278
 	.byte	0x1f
 	.byte	0xc
 	.4byte	0xbb
 	.uleb128 0xf
-	.4byte	.LASF277
+	.4byte	.LASF279
 	.byte	0x20
 	.byte	0x20
 	.byte	0x35
-	.4byte	0x1025
+	.4byte	0x103b
 	.uleb128 0xe
-	.4byte	.LASF278
+	.4byte	.LASF280
 	.byte	0x20
 	.byte	0x36
 	.4byte	0x545
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF279
+	.4byte	.LASF281
 	.byte	0x20
 	.byte	0x37
 	.4byte	0x898
@@ -3441,41 +3451,41 @@ spi_id_buffer.16929:
 	.string	"osq"
 	.byte	0x20
 	.byte	0x39
-	.4byte	0xfb9
+	.4byte	0xfcf
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF280
+	.4byte	.LASF282
 	.byte	0x20
 	.byte	0x3b
 	.4byte	0x2f1
 	.byte	0x10
 	.byte	0
 	.uleb128 0x2a
-	.4byte	.LASF281
+	.4byte	.LASF283
 	.2byte	0xe80
 	.byte	0x21
 	.2byte	0x287
-	.4byte	0x1a83
+	.4byte	0x1a99
 	.uleb128 0x1d
-	.4byte	.LASF282
+	.4byte	.LASF284
 	.byte	0x21
 	.2byte	0x28d
-	.4byte	0x1c99
+	.4byte	0x1caf
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF283
+	.4byte	.LASF285
 	.byte	0x21
 	.2byte	0x290
 	.4byte	0x17c
 	.byte	0x20
 	.uleb128 0x1d
-	.4byte	.LASF284
+	.4byte	.LASF286
 	.byte	0x21
 	.2byte	0x298
 	.4byte	0x45b
 	.byte	0x28
 	.uleb128 0x1d
-	.4byte	.LASF285
+	.4byte	.LASF287
 	.byte	0x21
 	.2byte	0x299
 	.4byte	0x2c6
@@ -3487,19 +3497,19 @@ spi_id_buffer.16929:
 	.4byte	0x6c
 	.byte	0x34
 	.uleb128 0x1d
-	.4byte	.LASF286
+	.4byte	.LASF288
 	.byte	0x21
 	.2byte	0x29c
 	.4byte	0x6c
 	.byte	0x38
 	.uleb128 0x1d
-	.4byte	.LASF287
+	.4byte	.LASF289
 	.byte	0x21
 	.2byte	0x29f
-	.4byte	0x287d
+	.4byte	0x2893
 	.byte	0x40
 	.uleb128 0x1d
-	.4byte	.LASF288
+	.4byte	.LASF290
 	.byte	0x21
 	.2byte	0x2a0
 	.4byte	0xbb
@@ -3511,283 +3521,283 @@ spi_id_buffer.16929:
 	.4byte	0x6c
 	.byte	0x4c
 	.uleb128 0x1d
-	.4byte	.LASF289
+	.4byte	.LASF291
 	.byte	0x21
 	.2byte	0x2a5
 	.4byte	0x6c
 	.byte	0x50
 	.uleb128 0x1d
-	.4byte	.LASF290
+	.4byte	.LASF292
 	.byte	0x21
 	.2byte	0x2a6
 	.4byte	0x2d
 	.byte	0x58
 	.uleb128 0x1d
-	.4byte	.LASF291
+	.4byte	.LASF293
 	.byte	0x21
 	.2byte	0x2a7
-	.4byte	0x1a83
+	.4byte	0x1a99
 	.byte	0x60
 	.uleb128 0x1d
-	.4byte	.LASF292
+	.4byte	.LASF294
 	.byte	0x21
 	.2byte	0x2b0
 	.4byte	0xbb
 	.byte	0x68
 	.uleb128 0x1d
-	.4byte	.LASF293
+	.4byte	.LASF295
 	.byte	0x21
 	.2byte	0x2b1
 	.4byte	0xbb
 	.byte	0x6c
 	.uleb128 0x1d
-	.4byte	.LASF294
+	.4byte	.LASF296
 	.byte	0x21
 	.2byte	0x2b3
 	.4byte	0xbb
 	.byte	0x70
 	.uleb128 0x1d
-	.4byte	.LASF295
+	.4byte	.LASF297
 	.byte	0x21
 	.2byte	0x2b5
 	.4byte	0xbb
 	.byte	0x74
 	.uleb128 0x1d
-	.4byte	.LASF296
+	.4byte	.LASF298
 	.byte	0x21
 	.2byte	0x2b6
 	.4byte	0xbb
 	.byte	0x78
 	.uleb128 0x1d
-	.4byte	.LASF297
+	.4byte	.LASF299
 	.byte	0x21
 	.2byte	0x2b7
 	.4byte	0xbb
 	.byte	0x7c
 	.uleb128 0x1d
-	.4byte	.LASF298
+	.4byte	.LASF300
 	.byte	0x21
 	.2byte	0x2b8
 	.4byte	0x6c
 	.byte	0x80
 	.uleb128 0x1d
-	.4byte	.LASF299
+	.4byte	.LASF301
 	.byte	0x21
 	.2byte	0x2ba
-	.4byte	0x4653
+	.4byte	0x4669
 	.byte	0x88
 	.uleb128 0x24
 	.string	"se"
 	.byte	0x21
 	.2byte	0x2bb
-	.4byte	0x4258
+	.4byte	0x426e
 	.byte	0xc0
 	.uleb128 0x2b
 	.string	"rt"
 	.byte	0x21
 	.2byte	0x2bc
-	.4byte	0x4385
+	.4byte	0x439b
 	.2byte	0x2c0
 	.uleb128 0x2c
-	.4byte	.LASF300
+	.4byte	.LASF302
 	.byte	0x21
 	.2byte	0x2bf
 	.4byte	0x136
 	.2byte	0x310
 	.uleb128 0x2c
-	.4byte	.LASF301
+	.4byte	.LASF303
 	.byte	0x21
 	.2byte	0x2c0
 	.4byte	0xbb
 	.2byte	0x318
 	.uleb128 0x2c
-	.4byte	.LASF302
+	.4byte	.LASF304
 	.byte	0x21
 	.2byte	0x2c1
 	.4byte	0x136
 	.2byte	0x320
 	.uleb128 0x2c
-	.4byte	.LASF303
+	.4byte	.LASF305
 	.byte	0x21
 	.2byte	0x2c2
 	.4byte	0x136
 	.2byte	0x328
 	.uleb128 0x2c
-	.4byte	.LASF304
+	.4byte	.LASF306
 	.byte	0x21
 	.2byte	0x2c5
-	.4byte	0x465e
+	.4byte	0x4674
 	.2byte	0x330
 	.uleb128 0x2b
 	.string	"dl"
 	.byte	0x21
 	.2byte	0x2c7
-	.4byte	0x4428
+	.4byte	0x443e
 	.2byte	0x338
 	.uleb128 0x2c
-	.4byte	.LASF305
+	.4byte	.LASF307
 	.byte	0x21
 	.2byte	0x2d9
 	.4byte	0x6c
 	.2byte	0x420
 	.uleb128 0x2c
-	.4byte	.LASF306
+	.4byte	.LASF308
 	.byte	0x21
 	.2byte	0x2da
 	.4byte	0xbb
 	.2byte	0x424
 	.uleb128 0x2c
-	.4byte	.LASF307
+	.4byte	.LASF309
 	.byte	0x21
 	.2byte	0x2db
-	.4byte	0x1cf4
+	.4byte	0x1d0a
 	.2byte	0x428
 	.uleb128 0x2c
-	.4byte	.LASF308
+	.4byte	.LASF310
 	.byte	0x21
 	.2byte	0x2dc
-	.4byte	0x1cf4
+	.4byte	0x1d0a
 	.2byte	0x430
 	.uleb128 0x2c
-	.4byte	.LASF309
+	.4byte	.LASF311
 	.byte	0x21
 	.2byte	0x2df
 	.4byte	0xbb
 	.2byte	0x438
 	.uleb128 0x2c
-	.4byte	.LASF310
+	.4byte	.LASF312
 	.byte	0x21
 	.2byte	0x2e0
-	.4byte	0x4553
+	.4byte	0x4569
 	.2byte	0x43c
 	.uleb128 0x2c
-	.4byte	.LASF311
+	.4byte	.LASF313
 	.byte	0x21
 	.2byte	0x2e1
 	.4byte	0x2f1
 	.2byte	0x440
 	.uleb128 0x2c
-	.4byte	.LASF312
+	.4byte	.LASF314
 	.byte	0x21
 	.2byte	0x2e2
-	.4byte	0x4669
+	.4byte	0x467f
 	.2byte	0x450
 	.uleb128 0x2c
-	.4byte	.LASF313
+	.4byte	.LASF315
 	.byte	0x21
 	.2byte	0x2e6
 	.4byte	0x2d
 	.2byte	0x458
 	.uleb128 0x2c
-	.4byte	.LASF314
+	.4byte	.LASF316
 	.byte	0x21
 	.2byte	0x2e7
 	.4byte	0x100
 	.2byte	0x460
 	.uleb128 0x2c
-	.4byte	.LASF315
+	.4byte	.LASF317
 	.byte	0x21
 	.2byte	0x2e8
 	.4byte	0x100
 	.2byte	0x461
 	.uleb128 0x2c
-	.4byte	.LASF316
+	.4byte	.LASF318
 	.byte	0x21
 	.2byte	0x2e9
 	.4byte	0xbb
 	.2byte	0x464
 	.uleb128 0x2c
-	.4byte	.LASF317
+	.4byte	.LASF319
 	.byte	0x21
 	.2byte	0x2ea
 	.4byte	0x2f1
 	.2byte	0x468
 	.uleb128 0x2c
-	.4byte	.LASF318
+	.4byte	.LASF320
 	.byte	0x21
 	.2byte	0x2ed
-	.4byte	0x3fd6
+	.4byte	0x3fec
 	.2byte	0x478
 	.uleb128 0x2c
-	.4byte	.LASF319
+	.4byte	.LASF321
 	.byte	0x21
 	.2byte	0x2ef
 	.4byte	0x2f1
 	.2byte	0x498
 	.uleb128 0x2c
-	.4byte	.LASF320
+	.4byte	.LASF322
 	.byte	0x21
 	.2byte	0x2f1
-	.4byte	0x3794
+	.4byte	0x37aa
 	.2byte	0x4a8
 	.uleb128 0x2c
-	.4byte	.LASF321
+	.4byte	.LASF323
 	.byte	0x21
 	.2byte	0x2f2
-	.4byte	0x2ec7
+	.4byte	0x2edd
 	.2byte	0x4d0
 	.uleb128 0x2b
 	.string	"mm"
 	.byte	0x21
 	.2byte	0x2f5
-	.4byte	0x4674
+	.4byte	0x468a
 	.2byte	0x4e8
 	.uleb128 0x2c
-	.4byte	.LASF322
+	.4byte	.LASF324
 	.byte	0x21
 	.2byte	0x2f6
-	.4byte	0x4674
+	.4byte	0x468a
 	.2byte	0x4f0
 	.uleb128 0x2c
-	.4byte	.LASF323
+	.4byte	.LASF325
 	.byte	0x21
 	.2byte	0x2f9
-	.4byte	0x3db1
+	.4byte	0x3dc7
 	.2byte	0x4f8
 	.uleb128 0x2c
-	.4byte	.LASF324
+	.4byte	.LASF326
 	.byte	0x21
 	.2byte	0x2fc
-	.4byte	0x3e17
+	.4byte	0x3e2d
 	.2byte	0x520
 	.uleb128 0x2c
-	.4byte	.LASF325
+	.4byte	.LASF327
 	.byte	0x21
 	.2byte	0x2fe
 	.4byte	0xbb
 	.2byte	0x538
 	.uleb128 0x2c
-	.4byte	.LASF326
+	.4byte	.LASF328
 	.byte	0x21
 	.2byte	0x2ff
 	.4byte	0xbb
 	.2byte	0x53c
 	.uleb128 0x2c
-	.4byte	.LASF327
+	.4byte	.LASF329
 	.byte	0x21
 	.2byte	0x300
 	.4byte	0xbb
 	.2byte	0x540
 	.uleb128 0x2c
-	.4byte	.LASF328
+	.4byte	.LASF330
 	.byte	0x21
 	.2byte	0x302
 	.4byte	0xbb
 	.2byte	0x544
 	.uleb128 0x2c
-	.4byte	.LASF329
+	.4byte	.LASF331
 	.byte	0x21
 	.2byte	0x304
 	.4byte	0x2d
 	.2byte	0x548
 	.uleb128 0x2c
-	.4byte	.LASF330
+	.4byte	.LASF332
 	.byte	0x21
 	.2byte	0x307
 	.4byte	0x6c
 	.2byte	0x550
 	.uleb128 0x2d
-	.4byte	.LASF331
+	.4byte	.LASF333
 	.byte	0x21
 	.2byte	0x30a
 	.4byte	0x6c
@@ -3796,7 +3806,7 @@ spi_id_buffer.16929:
 	.byte	0x1f
 	.2byte	0x554
 	.uleb128 0x2d
-	.4byte	.LASF332
+	.4byte	.LASF334
 	.byte	0x21
 	.2byte	0x30b
 	.4byte	0x6c
@@ -3805,7 +3815,7 @@ spi_id_buffer.16929:
 	.byte	0x1e
 	.2byte	0x554
 	.uleb128 0x2d
-	.4byte	.LASF333
+	.4byte	.LASF335
 	.byte	0x21
 	.2byte	0x30c
 	.4byte	0x6c
@@ -3814,7 +3824,7 @@ spi_id_buffer.16929:
 	.byte	0x1d
 	.2byte	0x554
 	.uleb128 0x2d
-	.4byte	.LASF334
+	.4byte	.LASF336
 	.byte	0x21
 	.2byte	0x30d
 	.4byte	0x6c
@@ -3823,7 +3833,7 @@ spi_id_buffer.16929:
 	.byte	0x1c
 	.2byte	0x554
 	.uleb128 0x2d
-	.4byte	.LASF335
+	.4byte	.LASF337
 	.byte	0x21
 	.2byte	0x30f
 	.4byte	0x6c
@@ -3832,7 +3842,7 @@ spi_id_buffer.16929:
 	.byte	0x1b
 	.2byte	0x554
 	.uleb128 0x2d
-	.4byte	.LASF336
+	.4byte	.LASF338
 	.byte	0x21
 	.2byte	0x318
 	.4byte	0x6c
@@ -3841,7 +3851,7 @@ spi_id_buffer.16929:
 	.byte	0x1f
 	.2byte	0x558
 	.uleb128 0x2d
-	.4byte	.LASF337
+	.4byte	.LASF339
 	.byte	0x21
 	.2byte	0x319
 	.4byte	0x6c
@@ -3850,7 +3860,7 @@ spi_id_buffer.16929:
 	.byte	0x1e
 	.2byte	0x558
 	.uleb128 0x2d
-	.4byte	.LASF338
+	.4byte	.LASF340
 	.byte	0x21
 	.2byte	0x31e
 	.4byte	0x6c
@@ -3859,7 +3869,7 @@ spi_id_buffer.16929:
 	.byte	0x1d
 	.2byte	0x558
 	.uleb128 0x2d
-	.4byte	.LASF339
+	.4byte	.LASF341
 	.byte	0x21
 	.2byte	0x320
 	.4byte	0x6c
@@ -3868,7 +3878,7 @@ spi_id_buffer.16929:
 	.byte	0x1c
 	.2byte	0x558
 	.uleb128 0x2d
-	.4byte	.LASF340
+	.4byte	.LASF342
 	.byte	0x21
 	.2byte	0x328
 	.4byte	0x6c
@@ -3877,7 +3887,7 @@ spi_id_buffer.16929:
 	.byte	0x1b
 	.2byte	0x558
 	.uleb128 0x2d
-	.4byte	.LASF341
+	.4byte	.LASF343
 	.byte	0x21
 	.2byte	0x32c
 	.4byte	0x6c
@@ -3886,16 +3896,16 @@ spi_id_buffer.16929:
 	.byte	0x1a
 	.2byte	0x558
 	.uleb128 0x2c
-	.4byte	.LASF342
+	.4byte	.LASF344
 	.byte	0x21
 	.2byte	0x32f
 	.4byte	0x2d
 	.2byte	0x560
 	.uleb128 0x2c
-	.4byte	.LASF343
+	.4byte	.LASF345
 	.byte	0x21
 	.2byte	0x331
-	.4byte	0x1c4a
+	.4byte	0x1c60
 	.2byte	0x568
 	.uleb128 0x2b
 	.string	"pid"
@@ -3904,31 +3914,31 @@ spi_id_buffer.16929:
 	.4byte	0x231
 	.2byte	0x598
 	.uleb128 0x2c
-	.4byte	.LASF344
+	.4byte	.LASF346
 	.byte	0x21
 	.2byte	0x334
 	.4byte	0x231
 	.2byte	0x59c
 	.uleb128 0x2c
-	.4byte	.LASF345
+	.4byte	.LASF347
 	.byte	0x21
 	.2byte	0x338
 	.4byte	0x2d
 	.2byte	0x5a0
 	.uleb128 0x2c
-	.4byte	.LASF346
+	.4byte	.LASF348
 	.byte	0x21
 	.2byte	0x341
-	.4byte	0x1a83
+	.4byte	0x1a99
 	.2byte	0x5a8
 	.uleb128 0x2c
 	.4byte	.LASF65
 	.byte	0x21
 	.2byte	0x344
-	.4byte	0x1a83
+	.4byte	0x1a99
 	.2byte	0x5b0
 	.uleb128 0x2c
-	.4byte	.LASF347
+	.4byte	.LASF349
 	.byte	0x21
 	.2byte	0x349
 	.4byte	0x2f1
@@ -3940,187 +3950,187 @@ spi_id_buffer.16929:
 	.4byte	0x2f1
 	.2byte	0x5c8
 	.uleb128 0x2c
-	.4byte	.LASF348
+	.4byte	.LASF350
 	.byte	0x21
 	.2byte	0x34b
-	.4byte	0x1a83
+	.4byte	0x1a99
 	.2byte	0x5d8
 	.uleb128 0x2c
-	.4byte	.LASF349
+	.4byte	.LASF351
 	.byte	0x21
 	.2byte	0x353
 	.4byte	0x2f1
 	.2byte	0x5e0
 	.uleb128 0x2c
-	.4byte	.LASF350
+	.4byte	.LASF352
 	.byte	0x21
 	.2byte	0x354
 	.4byte	0x2f1
 	.2byte	0x5f0
 	.uleb128 0x2c
-	.4byte	.LASF351
+	.4byte	.LASF353
 	.byte	0x21
 	.2byte	0x357
-	.4byte	0x467a
+	.4byte	0x4690
 	.2byte	0x600
 	.uleb128 0x2c
-	.4byte	.LASF352
+	.4byte	.LASF354
 	.byte	0x21
 	.2byte	0x358
-	.4byte	0x4680
+	.4byte	0x4696
 	.2byte	0x608
 	.uleb128 0x2c
-	.4byte	.LASF353
+	.4byte	.LASF355
 	.byte	0x21
 	.2byte	0x359
 	.4byte	0x2f1
 	.2byte	0x648
 	.uleb128 0x2c
-	.4byte	.LASF354
+	.4byte	.LASF356
 	.byte	0x21
 	.2byte	0x35a
 	.4byte	0x2f1
 	.2byte	0x658
 	.uleb128 0x2c
-	.4byte	.LASF355
+	.4byte	.LASF357
 	.byte	0x21
 	.2byte	0x35c
-	.4byte	0x4690
+	.4byte	0x46a6
 	.2byte	0x668
 	.uleb128 0x2c
-	.4byte	.LASF356
+	.4byte	.LASF358
 	.byte	0x21
 	.2byte	0x35f
-	.4byte	0x3339
+	.4byte	0x334f
 	.2byte	0x670
 	.uleb128 0x2c
-	.4byte	.LASF357
+	.4byte	.LASF359
 	.byte	0x21
 	.2byte	0x362
-	.4byte	0x3339
+	.4byte	0x334f
 	.2byte	0x678
 	.uleb128 0x2c
-	.4byte	.LASF358
+	.4byte	.LASF360
 	.byte	0x21
 	.2byte	0x364
 	.4byte	0x136
 	.2byte	0x680
 	.uleb128 0x2c
-	.4byte	.LASF359
+	.4byte	.LASF361
 	.byte	0x21
 	.2byte	0x365
 	.4byte	0x136
 	.2byte	0x688
 	.uleb128 0x2c
-	.4byte	.LASF360
+	.4byte	.LASF362
 	.byte	0x21
 	.2byte	0x36a
 	.4byte	0x136
 	.2byte	0x690
 	.uleb128 0x2c
-	.4byte	.LASF361
+	.4byte	.LASF363
 	.byte	0x21
 	.2byte	0x36c
-	.4byte	0x4696
+	.4byte	0x46ac
 	.2byte	0x698
 	.uleb128 0x2c
-	.4byte	.LASF362
+	.4byte	.LASF364
 	.byte	0x21
 	.2byte	0x36d
 	.4byte	0x6c
 	.2byte	0x6a0
 	.uleb128 0x2c
-	.4byte	.LASF363
+	.4byte	.LASF365
 	.byte	0x21
 	.2byte	0x36f
-	.4byte	0x3f71
+	.4byte	0x3f87
 	.2byte	0x6a8
 	.uleb128 0x2c
-	.4byte	.LASF364
+	.4byte	.LASF366
 	.byte	0x21
 	.2byte	0x378
 	.4byte	0x2d
 	.2byte	0x6c0
 	.uleb128 0x2c
-	.4byte	.LASF365
+	.4byte	.LASF367
 	.byte	0x21
 	.2byte	0x379
 	.4byte	0x2d
 	.2byte	0x6c8
 	.uleb128 0x2c
-	.4byte	.LASF366
+	.4byte	.LASF368
 	.byte	0x21
 	.2byte	0x37c
 	.4byte	0x136
 	.2byte	0x6d0
 	.uleb128 0x2c
-	.4byte	.LASF367
+	.4byte	.LASF369
 	.byte	0x21
 	.2byte	0x37f
 	.4byte	0x136
 	.2byte	0x6d8
 	.uleb128 0x2c
-	.4byte	.LASF368
+	.4byte	.LASF370
 	.byte	0x21
 	.2byte	0x382
 	.4byte	0x2d
 	.2byte	0x6e0
 	.uleb128 0x2c
-	.4byte	.LASF369
+	.4byte	.LASF371
 	.byte	0x21
 	.2byte	0x383
 	.4byte	0x2d
 	.2byte	0x6e8
 	.uleb128 0x2c
-	.4byte	.LASF370
+	.4byte	.LASF372
 	.byte	0x21
 	.2byte	0x386
-	.4byte	0x3fa2
+	.4byte	0x3fb8
 	.2byte	0x6f0
 	.uleb128 0x2c
-	.4byte	.LASF371
+	.4byte	.LASF373
 	.byte	0x21
 	.2byte	0x387
-	.4byte	0x469c
+	.4byte	0x46b2
 	.2byte	0x708
 	.uleb128 0x2c
-	.4byte	.LASF372
+	.4byte	.LASF374
 	.byte	0x21
 	.2byte	0x38d
-	.4byte	0x46b6
+	.4byte	0x46cc
 	.2byte	0x738
 	.uleb128 0x2c
-	.4byte	.LASF373
+	.4byte	.LASF375
 	.byte	0x21
 	.2byte	0x390
-	.4byte	0x46b6
+	.4byte	0x46cc
 	.2byte	0x740
 	.uleb128 0x2c
-	.4byte	.LASF374
+	.4byte	.LASF376
 	.byte	0x21
 	.2byte	0x393
-	.4byte	0x46b6
+	.4byte	0x46cc
 	.2byte	0x748
 	.uleb128 0x2c
-	.4byte	.LASF375
+	.4byte	.LASF377
 	.byte	0x21
 	.2byte	0x39c
-	.4byte	0x46bc
+	.4byte	0x46d2
 	.2byte	0x750
 	.uleb128 0x2c
-	.4byte	.LASF376
+	.4byte	.LASF378
 	.byte	0x21
 	.2byte	0x39e
-	.4byte	0x46d1
+	.4byte	0x46e7
 	.2byte	0x760
 	.uleb128 0x2c
-	.4byte	.LASF377
+	.4byte	.LASF379
 	.byte	0x21
 	.2byte	0x3a5
 	.4byte	0x2d
 	.2byte	0x768
 	.uleb128 0x2c
-	.4byte	.LASF378
+	.4byte	.LASF380
 	.byte	0x21
 	.2byte	0x3a6
 	.4byte	0x2d
@@ -4129,325 +4139,325 @@ spi_id_buffer.16929:
 	.string	"fs"
 	.byte	0x21
 	.2byte	0x3a9
-	.4byte	0x46dc
+	.4byte	0x46f2
 	.2byte	0x778
 	.uleb128 0x2c
-	.4byte	.LASF379
+	.4byte	.LASF381
 	.byte	0x21
 	.2byte	0x3ac
-	.4byte	0x46e7
+	.4byte	0x46fd
 	.2byte	0x780
 	.uleb128 0x2c
-	.4byte	.LASF380
+	.4byte	.LASF382
 	.byte	0x21
 	.2byte	0x3af
-	.4byte	0x46f2
+	.4byte	0x4708
 	.2byte	0x788
 	.uleb128 0x2c
-	.4byte	.LASF381
+	.4byte	.LASF383
 	.byte	0x21
 	.2byte	0x3b2
-	.4byte	0x46fd
+	.4byte	0x4713
 	.2byte	0x790
 	.uleb128 0x2c
-	.4byte	.LASF382
+	.4byte	.LASF384
 	.byte	0x21
 	.2byte	0x3b3
-	.4byte	0x4708
+	.4byte	0x471e
 	.2byte	0x798
 	.uleb128 0x2c
-	.4byte	.LASF383
+	.4byte	.LASF385
 	.byte	0x21
 	.2byte	0x3b4
-	.4byte	0x3add
+	.4byte	0x3af3
 	.2byte	0x7a0
 	.uleb128 0x2c
-	.4byte	.LASF384
+	.4byte	.LASF386
 	.byte	0x21
 	.2byte	0x3b5
-	.4byte	0x3add
+	.4byte	0x3af3
 	.2byte	0x7a8
 	.uleb128 0x2c
-	.4byte	.LASF385
+	.4byte	.LASF387
 	.byte	0x21
 	.2byte	0x3b7
-	.4byte	0x3add
+	.4byte	0x3af3
 	.2byte	0x7b0
 	.uleb128 0x2c
 	.4byte	.LASF133
 	.byte	0x21
 	.2byte	0x3b8
-	.4byte	0x3d8c
+	.4byte	0x3da2
 	.2byte	0x7b8
 	.uleb128 0x2c
-	.4byte	.LASF386
+	.4byte	.LASF388
 	.byte	0x21
 	.2byte	0x3b9
 	.4byte	0x2d
 	.2byte	0x7d0
 	.uleb128 0x2c
-	.4byte	.LASF387
+	.4byte	.LASF389
 	.byte	0x21
 	.2byte	0x3ba
 	.4byte	0x27a
 	.2byte	0x7d8
 	.uleb128 0x2c
-	.4byte	.LASF388
+	.4byte	.LASF390
 	.byte	0x21
 	.2byte	0x3bb
 	.4byte	0x6c
 	.2byte	0x7e0
 	.uleb128 0x2c
-	.4byte	.LASF389
+	.4byte	.LASF391
 	.byte	0x21
 	.2byte	0x3bd
 	.4byte	0x38b
 	.2byte	0x7e8
 	.uleb128 0x2c
-	.4byte	.LASF390
+	.4byte	.LASF392
 	.byte	0x21
 	.2byte	0x3bf
-	.4byte	0x4713
+	.4byte	0x4729
 	.2byte	0x7f0
 	.uleb128 0x2c
-	.4byte	.LASF391
+	.4byte	.LASF393
 	.byte	0x21
 	.2byte	0x3c4
-	.4byte	0x3a98
+	.4byte	0x3aae
 	.2byte	0x7f8
 	.uleb128 0x2c
-	.4byte	.LASF392
+	.4byte	.LASF394
 	.byte	0x21
 	.2byte	0x3c7
 	.4byte	0x136
 	.2byte	0x808
 	.uleb128 0x2c
-	.4byte	.LASF393
+	.4byte	.LASF395
 	.byte	0x21
 	.2byte	0x3c8
 	.4byte	0x136
 	.2byte	0x810
 	.uleb128 0x2c
-	.4byte	.LASF394
+	.4byte	.LASF396
 	.byte	0x21
 	.2byte	0x3cb
 	.4byte	0x898
 	.2byte	0x818
 	.uleb128 0x2c
-	.4byte	.LASF395
+	.4byte	.LASF397
 	.byte	0x21
 	.2byte	0x3ce
 	.4byte	0x866
 	.2byte	0x81c
 	.uleb128 0x2c
-	.4byte	.LASF396
+	.4byte	.LASF398
 	.byte	0x21
 	.2byte	0x3d0
-	.4byte	0x459f
+	.4byte	0x45b5
 	.2byte	0x820
 	.uleb128 0x2c
-	.4byte	.LASF397
+	.4byte	.LASF399
 	.byte	0x21
 	.2byte	0x3d4
-	.4byte	0x2f17
+	.4byte	0x2f2d
 	.2byte	0x828
 	.uleb128 0x2c
-	.4byte	.LASF398
+	.4byte	.LASF400
 	.byte	0x21
 	.2byte	0x3d6
-	.4byte	0x1a83
+	.4byte	0x1a99
 	.2byte	0x838
 	.uleb128 0x2c
-	.4byte	.LASF399
+	.4byte	.LASF401
 	.byte	0x21
 	.2byte	0x3d8
-	.4byte	0x471e
+	.4byte	0x4734
 	.2byte	0x840
 	.uleb128 0x2c
-	.4byte	.LASF400
+	.4byte	.LASF402
 	.byte	0x21
 	.2byte	0x400
 	.4byte	0x45b
 	.2byte	0x848
 	.uleb128 0x2c
-	.4byte	.LASF401
+	.4byte	.LASF403
 	.byte	0x21
 	.2byte	0x403
-	.4byte	0x4729
+	.4byte	0x473f
 	.2byte	0x850
 	.uleb128 0x2c
-	.4byte	.LASF402
+	.4byte	.LASF404
 	.byte	0x21
 	.2byte	0x407
-	.4byte	0x4734
+	.4byte	0x474a
 	.2byte	0x858
 	.uleb128 0x2c
-	.4byte	.LASF403
+	.4byte	.LASF405
 	.byte	0x21
 	.2byte	0x40b
-	.4byte	0x473f
+	.4byte	0x4755
 	.2byte	0x860
 	.uleb128 0x2c
-	.4byte	.LASF404
+	.4byte	.LASF406
 	.byte	0x21
 	.2byte	0x40d
-	.4byte	0x474a
+	.4byte	0x4760
 	.2byte	0x868
 	.uleb128 0x2c
-	.4byte	.LASF405
+	.4byte	.LASF407
 	.byte	0x21
 	.2byte	0x40f
-	.4byte	0x4755
+	.4byte	0x476b
 	.2byte	0x870
 	.uleb128 0x2c
-	.4byte	.LASF406
+	.4byte	.LASF408
 	.byte	0x21
 	.2byte	0x412
 	.4byte	0x2d
 	.2byte	0x878
 	.uleb128 0x2c
-	.4byte	.LASF407
+	.4byte	.LASF409
 	.byte	0x21
 	.2byte	0x413
-	.4byte	0x475b
+	.4byte	0x4771
 	.2byte	0x880
 	.uleb128 0x2c
-	.4byte	.LASF408
+	.4byte	.LASF410
 	.byte	0x21
 	.2byte	0x415
-	.4byte	0x3e85
+	.4byte	0x3e9b
 	.2byte	0x888
 	.uleb128 0x2c
-	.4byte	.LASF409
+	.4byte	.LASF411
 	.byte	0x21
 	.2byte	0x418
 	.4byte	0x6c
 	.2byte	0x8c8
 	.uleb128 0x2c
-	.4byte	.LASF410
+	.4byte	.LASF412
 	.byte	0x21
 	.2byte	0x41c
 	.4byte	0x136
 	.2byte	0x8d0
 	.uleb128 0x2c
-	.4byte	.LASF411
+	.4byte	.LASF413
 	.byte	0x21
 	.2byte	0x41e
 	.4byte	0x136
 	.2byte	0x8d8
 	.uleb128 0x2c
-	.4byte	.LASF412
+	.4byte	.LASF414
 	.byte	0x21
 	.2byte	0x420
 	.4byte	0x136
 	.2byte	0x8e0
 	.uleb128 0x2c
-	.4byte	.LASF413
+	.4byte	.LASF415
 	.byte	0x21
 	.2byte	0x424
-	.4byte	0x1eff
+	.4byte	0x1f15
 	.2byte	0x8e8
 	.uleb128 0x2c
-	.4byte	.LASF414
+	.4byte	.LASF416
 	.byte	0x21
 	.2byte	0x426
-	.4byte	0x1edf
+	.4byte	0x1ef5
 	.2byte	0x8f0
 	.uleb128 0x2c
-	.4byte	.LASF415
+	.4byte	.LASF417
 	.byte	0x21
 	.2byte	0x427
 	.4byte	0xbb
 	.2byte	0x8f4
 	.uleb128 0x2c
-	.4byte	.LASF416
+	.4byte	.LASF418
 	.byte	0x21
 	.2byte	0x428
 	.4byte	0xbb
 	.2byte	0x8f8
 	.uleb128 0x2c
-	.4byte	.LASF417
+	.4byte	.LASF419
 	.byte	0x21
 	.2byte	0x42c
-	.4byte	0x4766
+	.4byte	0x477c
 	.2byte	0x900
 	.uleb128 0x2c
-	.4byte	.LASF418
+	.4byte	.LASF420
 	.byte	0x21
 	.2byte	0x42e
 	.4byte	0x2f1
 	.2byte	0x908
 	.uleb128 0x2c
-	.4byte	.LASF419
+	.4byte	.LASF421
 	.byte	0x21
 	.2byte	0x435
-	.4byte	0x4771
+	.4byte	0x4787
 	.2byte	0x918
 	.uleb128 0x2c
-	.4byte	.LASF420
+	.4byte	.LASF422
 	.byte	0x21
 	.2byte	0x437
-	.4byte	0x477c
+	.4byte	0x4792
 	.2byte	0x920
 	.uleb128 0x2c
-	.4byte	.LASF421
+	.4byte	.LASF423
 	.byte	0x21
 	.2byte	0x439
 	.4byte	0x2f1
 	.2byte	0x928
 	.uleb128 0x2c
-	.4byte	.LASF422
+	.4byte	.LASF424
 	.byte	0x21
 	.2byte	0x43a
-	.4byte	0x4787
+	.4byte	0x479d
 	.2byte	0x938
 	.uleb128 0x2c
-	.4byte	.LASF423
+	.4byte	.LASF425
 	.byte	0x21
 	.2byte	0x43d
-	.4byte	0x478d
+	.4byte	0x47a3
 	.2byte	0x940
 	.uleb128 0x2c
-	.4byte	.LASF424
+	.4byte	.LASF426
 	.byte	0x21
 	.2byte	0x43e
-	.4byte	0xfe8
+	.4byte	0xffe
 	.2byte	0x950
 	.uleb128 0x2c
-	.4byte	.LASF425
+	.4byte	.LASF427
 	.byte	0x21
 	.2byte	0x43f
 	.4byte	0x2f1
 	.2byte	0x970
 	.uleb128 0x2c
-	.4byte	.LASF426
+	.4byte	.LASF428
 	.byte	0x21
 	.2byte	0x47d
-	.4byte	0x47a8
+	.4byte	0x47be
 	.2byte	0x980
 	.uleb128 0x2c
-	.4byte	.LASF427
+	.4byte	.LASF429
 	.byte	0x21
 	.2byte	0x47e
 	.4byte	0x120
 	.2byte	0x988
 	.uleb128 0x2c
-	.4byte	.LASF428
+	.4byte	.LASF430
 	.byte	0x21
 	.2byte	0x47f
 	.4byte	0x120
 	.2byte	0x98c
 	.uleb128 0x2c
-	.4byte	.LASF429
+	.4byte	.LASF431
 	.byte	0x21
 	.2byte	0x484
 	.4byte	0x2d
 	.2byte	0x990
 	.uleb128 0x2c
-	.4byte	.LASF430
+	.4byte	.LASF432
 	.byte	0x21
 	.2byte	0x487
-	.4byte	0x3e7d
+	.4byte	0x3e93
 	.2byte	0x998
 	.uleb128 0x2b
 	.string	"rcu"
@@ -4456,236 +4466,236 @@ spi_id_buffer.16929:
 	.4byte	0x366
 	.2byte	0x998
 	.uleb128 0x2c
-	.4byte	.LASF431
+	.4byte	.LASF433
 	.byte	0x21
 	.2byte	0x48c
-	.4byte	0x47b3
+	.4byte	0x47c9
 	.2byte	0x9a8
 	.uleb128 0x2c
-	.4byte	.LASF432
+	.4byte	.LASF434
 	.byte	0x21
 	.2byte	0x48e
-	.4byte	0x3e4c
+	.4byte	0x3e62
 	.2byte	0x9b0
 	.uleb128 0x2c
-	.4byte	.LASF433
+	.4byte	.LASF435
 	.byte	0x21
 	.2byte	0x491
-	.4byte	0x47be
+	.4byte	0x47d4
 	.2byte	0x9c0
 	.uleb128 0x2c
-	.4byte	.LASF434
+	.4byte	.LASF436
 	.byte	0x21
 	.2byte	0x49c
 	.4byte	0xbb
 	.2byte	0x9c8
 	.uleb128 0x2c
-	.4byte	.LASF435
+	.4byte	.LASF437
 	.byte	0x21
 	.2byte	0x49d
 	.4byte	0xbb
 	.2byte	0x9cc
 	.uleb128 0x2c
-	.4byte	.LASF436
+	.4byte	.LASF438
 	.byte	0x21
 	.2byte	0x49f
 	.4byte	0x2d
 	.2byte	0x9d0
 	.uleb128 0x2c
-	.4byte	.LASF437
+	.4byte	.LASF439
 	.byte	0x21
 	.2byte	0x4a9
 	.4byte	0x136
 	.2byte	0x9d8
 	.uleb128 0x2c
-	.4byte	.LASF438
+	.4byte	.LASF440
 	.byte	0x21
 	.2byte	0x4aa
 	.4byte	0x136
 	.2byte	0x9e0
 	.uleb128 0x2c
-	.4byte	.LASF439
+	.4byte	.LASF441
 	.byte	0x21
 	.2byte	0x4c7
 	.4byte	0x2d
 	.2byte	0x9e8
 	.uleb128 0x2c
-	.4byte	.LASF440
+	.4byte	.LASF442
 	.byte	0x21
 	.2byte	0x4ca
 	.4byte	0x2d
 	.2byte	0x9f0
 	.uleb128 0x2c
-	.4byte	.LASF441
+	.4byte	.LASF443
 	.byte	0x21
 	.2byte	0x4e4
-	.4byte	0x47c9
+	.4byte	0x47df
 	.2byte	0x9f8
 	.uleb128 0x2c
-	.4byte	.LASF442
+	.4byte	.LASF444
 	.byte	0x21
 	.2byte	0x4e5
 	.4byte	0x290
 	.2byte	0xa00
 	.uleb128 0x2c
-	.4byte	.LASF443
+	.4byte	.LASF445
 	.byte	0x21
 	.2byte	0x4e6
 	.4byte	0xbb
 	.2byte	0xa04
 	.uleb128 0x2c
-	.4byte	.LASF444
+	.4byte	.LASF446
 	.byte	0x21
 	.2byte	0x4e9
 	.4byte	0x6c
 	.2byte	0xa08
 	.uleb128 0x2c
-	.4byte	.LASF445
+	.4byte	.LASF447
 	.byte	0x21
 	.2byte	0x4ec
-	.4byte	0x47c9
+	.4byte	0x47df
 	.2byte	0xa10
 	.uleb128 0x2c
-	.4byte	.LASF446
+	.4byte	.LASF448
 	.byte	0x21
 	.2byte	0x4f0
-	.4byte	0x47d4
+	.4byte	0x47ea
 	.2byte	0xa18
 	.uleb128 0x2c
-	.4byte	.LASF447
+	.4byte	.LASF449
 	.byte	0x21
 	.2byte	0x4f4
-	.4byte	0x47df
+	.4byte	0x47f5
 	.2byte	0xa20
 	.uleb128 0x2c
-	.4byte	.LASF448
+	.4byte	.LASF450
 	.byte	0x21
 	.2byte	0x4fd
 	.4byte	0xbb
 	.2byte	0xa28
 	.uleb128 0x2c
-	.4byte	.LASF449
+	.4byte	.LASF451
 	.byte	0x21
 	.2byte	0x4ff
-	.4byte	0x1a83
+	.4byte	0x1a99
 	.2byte	0xa30
 	.uleb128 0x2c
-	.4byte	.LASF450
+	.4byte	.LASF452
 	.byte	0x21
 	.2byte	0x502
-	.4byte	0x47ea
+	.4byte	0x4800
 	.2byte	0xa38
 	.uleb128 0x2c
-	.4byte	.LASF451
+	.4byte	.LASF453
 	.byte	0x21
 	.2byte	0x506
 	.4byte	0x2c6
 	.2byte	0xa40
 	.uleb128 0x2c
-	.4byte	.LASF452
+	.4byte	.LASF454
 	.byte	0x21
 	.2byte	0x50d
 	.4byte	0x45b
 	.2byte	0xa48
 	.uleb128 0x2e
-	.4byte	0x45dc
+	.4byte	0x45f2
 	.2byte	0xa50
 	.uleb128 0x2e
-	.4byte	0x4622
+	.4byte	0x4638
 	.2byte	0xa58
 	.uleb128 0x2c
-	.4byte	.LASF453
+	.4byte	.LASF455
 	.byte	0x21
 	.2byte	0x521
-	.4byte	0xfe8
+	.4byte	0xffe
 	.2byte	0xa60
 	.uleb128 0x2c
-	.4byte	.LASF454
+	.4byte	.LASF456
 	.byte	0x21
 	.2byte	0x524
 	.4byte	0x136
 	.2byte	0xa80
 	.uleb128 0x2c
-	.4byte	.LASF455
+	.4byte	.LASF457
 	.byte	0x21
 	.2byte	0x525
 	.4byte	0x136
 	.2byte	0xa88
 	.uleb128 0x2c
-	.4byte	.LASF456
+	.4byte	.LASF458
 	.byte	0x21
 	.2byte	0x52e
-	.4byte	0xf22
+	.4byte	0xf38
 	.2byte	0xa90
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1025
+	.4byte	0x103b
 	.uleb128 0xf
-	.4byte	.LASF457
+	.4byte	.LASF459
 	.byte	0x10
 	.byte	0x22
 	.byte	0xa
-	.4byte	0x1aae
+	.4byte	0x1ac4
 	.uleb128 0xe
-	.4byte	.LASF458
+	.4byte	.LASF460
 	.byte	0x22
 	.byte	0xb
 	.4byte	0x1ce
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF459
+	.4byte	.LASF461
 	.byte	0x22
 	.byte	0xc
 	.4byte	0x175
 	.byte	0x8
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF460
+	.4byte	.LASF462
 	.byte	0x8
 	.byte	0x22
 	.byte	0x15
-	.4byte	0x1ad3
+	.4byte	0x1ae9
 	.uleb128 0xe
-	.4byte	.LASF461
+	.4byte	.LASF463
 	.byte	0x22
 	.byte	0x16
 	.4byte	0xbb
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF462
+	.4byte	.LASF464
 	.byte	0x22
 	.byte	0x17
 	.4byte	0xbb
 	.byte	0x4
 	.byte	0
 	.uleb128 0x25
-	.4byte	.LASF463
+	.4byte	.LASF465
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x23
 	.byte	0x10
-	.4byte	0x1af6
+	.4byte	0x1b0c
 	.uleb128 0xc
-	.4byte	.LASF464
+	.4byte	.LASF466
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF465
+	.4byte	.LASF467
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF466
+	.4byte	.LASF468
 	.byte	0x2
 	.byte	0
 	.uleb128 0xd
 	.byte	0x28
 	.byte	0x23
 	.byte	0x1d
-	.4byte	0x1b47
+	.4byte	0x1b5d
 	.uleb128 0xe
-	.4byte	.LASF467
+	.4byte	.LASF469
 	.byte	0x23
 	.byte	0x1e
-	.4byte	0x1b47
+	.4byte	0x1b5d
 	.byte	0
 	.uleb128 0x12
 	.string	"val"
@@ -4700,22 +4710,22 @@ spi_id_buffer.16929:
 	.4byte	0x120
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF468
+	.4byte	.LASF470
 	.byte	0x23
 	.byte	0x21
 	.4byte	0x120
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF469
+	.4byte	.LASF471
 	.byte	0x23
 	.byte	0x22
 	.4byte	0x136
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF470
+	.4byte	.LASF472
 	.byte	0x23
 	.byte	0x23
-	.4byte	0x1b47
+	.4byte	0x1b5d
 	.byte	0x20
 	.byte	0
 	.uleb128 0x7
@@ -4725,35 +4735,35 @@ spi_id_buffer.16929:
 	.byte	0x8
 	.byte	0x23
 	.byte	0x29
-	.4byte	0x1b6c
+	.4byte	0x1b82
 	.uleb128 0x23
-	.4byte	.LASF471
+	.4byte	.LASF473
 	.byte	0x23
 	.byte	0x2a
-	.4byte	0x1b6c
+	.4byte	0x1b82
 	.uleb128 0x23
-	.4byte	.LASF472
+	.4byte	.LASF474
 	.byte	0x23
 	.byte	0x2b
-	.4byte	0x1b97
+	.4byte	0x1bad
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1a89
+	.4byte	0x1a9f
 	.uleb128 0xf
-	.4byte	.LASF473
+	.4byte	.LASF475
 	.byte	0x8
 	.byte	0x24
 	.byte	0xa
-	.4byte	0x1b97
+	.4byte	0x1bad
 	.uleb128 0xe
-	.4byte	.LASF458
+	.4byte	.LASF460
 	.byte	0x24
 	.byte	0xb
-	.4byte	0x3672
+	.4byte	0x3688
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF459
+	.4byte	.LASF461
 	.byte	0x24
 	.byte	0xc
 	.4byte	0x115
@@ -4761,14 +4771,14 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1b72
+	.4byte	0x1b88
 	.uleb128 0xd
 	.byte	0x18
 	.byte	0x23
 	.byte	0x26
-	.4byte	0x1bd0
+	.4byte	0x1be6
 	.uleb128 0xe
-	.4byte	.LASF474
+	.4byte	.LASF476
 	.byte	0x23
 	.byte	0x27
 	.4byte	0x23c
@@ -4777,13 +4787,13 @@ spi_id_buffer.16929:
 	.4byte	.LASF150
 	.byte	0x23
 	.byte	0x28
-	.4byte	0x1ad3
+	.4byte	0x1ae9
 	.byte	0x4
 	.uleb128 0x21
-	.4byte	0x1b4d
+	.4byte	0x1b63
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF475
+	.4byte	.LASF477
 	.byte	0x23
 	.byte	0x2d
 	.4byte	0x136
@@ -4793,108 +4803,108 @@ spi_id_buffer.16929:
 	.byte	0x20
 	.byte	0x23
 	.byte	0x30
-	.4byte	0x1c15
+	.4byte	0x1c2b
 	.uleb128 0xe
-	.4byte	.LASF476
+	.4byte	.LASF478
 	.byte	0x23
 	.byte	0x31
-	.4byte	0x1c1a
+	.4byte	0x1c30
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF477
+	.4byte	.LASF479
 	.byte	0x23
 	.byte	0x32
 	.4byte	0xbb
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF478
+	.4byte	.LASF480
 	.byte	0x23
 	.byte	0x33
 	.4byte	0xbb
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF458
+	.4byte	.LASF460
 	.byte	0x23
 	.byte	0x34
 	.4byte	0x2d
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF459
+	.4byte	.LASF461
 	.byte	0x23
 	.byte	0x35
 	.4byte	0x2d
 	.byte	0x18
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF479
+	.4byte	.LASF481
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1c15
+	.4byte	0x1c2b
 	.uleb128 0x1e
 	.byte	0x28
 	.byte	0x23
 	.byte	0x1b
-	.4byte	0x1c4a
+	.4byte	0x1c60
 	.uleb128 0x23
-	.4byte	.LASF480
+	.4byte	.LASF482
 	.byte	0x23
 	.byte	0x24
-	.4byte	0x1af6
+	.4byte	0x1b0c
 	.uleb128 0x23
-	.4byte	.LASF481
+	.4byte	.LASF483
 	.byte	0x23
 	.byte	0x2e
-	.4byte	0x1b9d
+	.4byte	0x1bb3
 	.uleb128 0x23
-	.4byte	.LASF482
+	.4byte	.LASF484
 	.byte	0x23
 	.byte	0x36
-	.4byte	0x1bd0
+	.4byte	0x1be6
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF343
+	.4byte	.LASF345
 	.byte	0x30
 	.byte	0x23
 	.byte	0x19
-	.4byte	0x1c68
+	.4byte	0x1c7e
 	.uleb128 0x12
 	.string	"fn"
 	.byte	0x23
 	.byte	0x1a
-	.4byte	0x1c7d
+	.4byte	0x1c93
 	.byte	0
 	.uleb128 0x21
-	.4byte	0x1c20
+	.4byte	0x1c36
 	.byte	0x8
 	.byte	0
 	.uleb128 0x16
 	.4byte	0x175
-	.4byte	0x1c77
+	.4byte	0x1c8d
 	.uleb128 0x11
-	.4byte	0x1c77
+	.4byte	0x1c8d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1c4a
+	.4byte	0x1c60
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1c68
+	.4byte	0x1c7e
 	.uleb128 0x2f
-	.4byte	.LASF483
+	.4byte	.LASF485
 	.byte	0x25
 	.byte	0x8
 	.4byte	0x2d
 	.uleb128 0x8
-	.4byte	.LASF484
+	.4byte	.LASF486
 	.byte	0x26
 	.byte	0x22
 	.4byte	0x2d
 	.uleb128 0xf
-	.4byte	.LASF282
+	.4byte	.LASF284
 	.byte	0x20
 	.byte	0x26
 	.byte	0x27
-	.4byte	0x1cd6
+	.4byte	0x1cec
 	.uleb128 0xe
 	.4byte	.LASF63
 	.byte	0x26
@@ -4902,86 +4912,86 @@ spi_id_buffer.16929:
 	.4byte	0x2d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF485
+	.4byte	.LASF487
 	.byte	0x26
 	.byte	0x29
-	.4byte	0x1c8e
+	.4byte	0x1ca4
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF486
+	.4byte	.LASF488
 	.byte	0x26
 	.byte	0x2b
 	.4byte	0x136
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF487
+	.4byte	.LASF489
 	.byte	0x26
 	.byte	0x2d
 	.4byte	0xbb
 	.byte	0x18
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF488
+	.4byte	.LASF490
 	.byte	0x8
 	.byte	0x27
 	.byte	0x10
-	.4byte	0x1cef
+	.4byte	0x1d05
 	.uleb128 0xe
-	.4byte	.LASF489
+	.4byte	.LASF491
 	.byte	0x27
 	.byte	0x10
 	.4byte	0xa96
 	.byte	0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x1cd6
+	.4byte	0x1cec
 	.uleb128 0x8
-	.4byte	.LASF490
+	.4byte	.LASF492
 	.byte	0x27
 	.byte	0x10
-	.4byte	0x1cd6
+	.4byte	0x1cec
 	.uleb128 0x13
-	.4byte	.LASF491
+	.4byte	.LASF493
 	.byte	0x27
 	.byte	0x26
 	.4byte	0x6c
 	.uleb128 0x13
-	.4byte	.LASF492
+	.4byte	.LASF494
 	.byte	0x27
 	.byte	0x59
-	.4byte	0x1cd6
+	.4byte	0x1cec
 	.uleb128 0x13
-	.4byte	.LASF493
+	.4byte	.LASF495
 	.byte	0x27
 	.byte	0x5a
-	.4byte	0x1cd6
+	.4byte	0x1cec
 	.uleb128 0x13
-	.4byte	.LASF494
+	.4byte	.LASF496
 	.byte	0x27
 	.byte	0x5b
-	.4byte	0x1cd6
+	.4byte	0x1cec
 	.uleb128 0x13
-	.4byte	.LASF495
+	.4byte	.LASF497
 	.byte	0x27
 	.byte	0x5c
-	.4byte	0x1cd6
+	.4byte	0x1cec
 	.uleb128 0x5
 	.4byte	0x34
-	.4byte	0x1d46
+	.4byte	0x1d5c
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x1d36
+	.4byte	0x1d4c
 	.uleb128 0x17
-	.4byte	.LASF496
+	.4byte	.LASF498
 	.byte	0x27
 	.2byte	0x303
-	.4byte	0x1d46
+	.4byte	0x1d5c
 	.uleb128 0x5
 	.4byte	0x34
-	.4byte	0x1d6d
+	.4byte	0x1d83
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x40
@@ -4990,14 +5000,14 @@ spi_id_buffer.16929:
 	.byte	0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x1d57
+	.4byte	0x1d6d
 	.uleb128 0x17
-	.4byte	.LASF497
+	.4byte	.LASF499
 	.byte	0x27
 	.2byte	0x357
-	.4byte	0x1d6d
+	.4byte	0x1d83
 	.uleb128 0x13
-	.4byte	.LASF498
+	.4byte	.LASF500
 	.byte	0x28
 	.byte	0x67
 	.4byte	0xbb
@@ -5005,9 +5015,9 @@ spi_id_buffer.16929:
 	.byte	0x10
 	.byte	0x29
 	.byte	0x63
-	.4byte	0x1da8
+	.4byte	0x1dbe
 	.uleb128 0x23
-	.4byte	.LASF499
+	.4byte	.LASF501
 	.byte	0x29
 	.byte	0x64
 	.4byte	0x2f1
@@ -5018,11 +5028,11 @@ spi_id_buffer.16929:
 	.4byte	0x366
 	.byte	0
 	.uleb128 0x26
-	.4byte	.LASF500
+	.4byte	.LASF502
 	.2byte	0x240
 	.byte	0x29
 	.byte	0x5c
-	.4byte	0x1e1d
+	.4byte	0x1e33
 	.uleb128 0xe
 	.4byte	.LASF173
 	.byte	0x29
@@ -5030,19 +5040,19 @@ spi_id_buffer.16929:
 	.4byte	0x90
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF501
+	.4byte	.LASF503
 	.byte	0x29
 	.byte	0x5e
 	.4byte	0x90
 	.byte	0x1
 	.uleb128 0xe
-	.4byte	.LASF502
+	.4byte	.LASF504
 	.byte	0x29
 	.byte	0x5f
 	.4byte	0x90
 	.byte	0x2
 	.uleb128 0xe
-	.4byte	.LASF503
+	.4byte	.LASF505
 	.byte	0x29
 	.byte	0x60
 	.4byte	0x90
@@ -5051,71 +5061,71 @@ spi_id_buffer.16929:
 	.4byte	.LASF65
 	.byte	0x29
 	.byte	0x61
-	.4byte	0x1e1d
+	.4byte	0x1e33
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF504
+	.4byte	.LASF506
 	.byte	0x29
 	.byte	0x62
-	.4byte	0x1e54
+	.4byte	0x1e6a
 	.byte	0x10
 	.uleb128 0x21
-	.4byte	0x1d89
+	.4byte	0x1d9f
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF505
+	.4byte	.LASF507
 	.byte	0x29
 	.byte	0x67
-	.4byte	0x1e5a
+	.4byte	0x1e70
 	.byte	0x28
 	.uleb128 0x27
-	.4byte	.LASF506
+	.4byte	.LASF508
 	.byte	0x29
 	.byte	0x68
-	.4byte	0x1e6a
+	.4byte	0x1e80
 	.2byte	0x228
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1da8
+	.4byte	0x1dbe
 	.uleb128 0xf
-	.4byte	.LASF507
+	.4byte	.LASF509
 	.byte	0x10
 	.byte	0x29
 	.byte	0x70
-	.4byte	0x1e54
+	.4byte	0x1e6a
 	.uleb128 0xe
-	.4byte	.LASF508
+	.4byte	.LASF510
 	.byte	0x29
 	.byte	0x71
 	.4byte	0x898
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF509
+	.4byte	.LASF511
 	.byte	0x29
 	.byte	0x72
 	.4byte	0x290
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF510
+	.4byte	.LASF512
 	.byte	0x29
 	.byte	0x73
-	.4byte	0x1e1d
+	.4byte	0x1e33
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1e23
+	.4byte	0x1e39
 	.uleb128 0x5
 	.4byte	0x45b
-	.4byte	0x1e6a
+	.4byte	0x1e80
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x3f
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x2d
-	.4byte	0x1e80
+	.4byte	0x1e96
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x2
@@ -5124,21 +5134,21 @@ spi_id_buffer.16929:
 	.byte	0
 	.byte	0
 	.uleb128 0x13
-	.4byte	.LASF511
+	.4byte	.LASF513
 	.byte	0x2a
 	.byte	0x30
 	.4byte	0x4ed
 	.uleb128 0x13
-	.4byte	.LASF512
+	.4byte	.LASF514
 	.byte	0x2a
 	.byte	0x30
 	.4byte	0x4ed
 	.uleb128 0xf
-	.4byte	.LASF513
+	.4byte	.LASF515
 	.byte	0x18
 	.byte	0x2b
 	.byte	0x23
-	.4byte	0x1ebb
+	.4byte	0x1ed1
 	.uleb128 0xe
 	.4byte	.LASF100
 	.byte	0x2b
@@ -5153,201 +5163,201 @@ spi_id_buffer.16929:
 	.byte	0x8
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF514
+	.4byte	.LASF516
 	.byte	0x2b
 	.byte	0x27
-	.4byte	0x1e96
+	.4byte	0x1eac
 	.uleb128 0xf
-	.4byte	.LASF515
+	.4byte	.LASF517
 	.byte	0x4
 	.byte	0x2c
 	.byte	0x30
-	.4byte	0x1edf
+	.4byte	0x1ef5
 	.uleb128 0xe
-	.4byte	.LASF516
+	.4byte	.LASF518
 	.byte	0x2c
 	.byte	0x31
 	.4byte	0x6c
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF517
+	.4byte	.LASF519
 	.byte	0x2c
 	.byte	0x35
-	.4byte	0x1ec6
+	.4byte	0x1edc
 	.uleb128 0xd
 	.byte	0x8
 	.byte	0x2d
 	.byte	0x62
-	.4byte	0x1eff
+	.4byte	0x1f15
 	.uleb128 0xe
-	.4byte	.LASF489
+	.4byte	.LASF491
 	.byte	0x2d
 	.byte	0x62
 	.4byte	0xa96
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF518
+	.4byte	.LASF520
 	.byte	0x2d
 	.byte	0x62
-	.4byte	0x1eea
+	.4byte	0x1f00
 	.uleb128 0x13
-	.4byte	.LASF519
+	.4byte	.LASF521
 	.byte	0x2d
 	.byte	0x63
-	.4byte	0x1eff
+	.4byte	0x1f15
 	.uleb128 0x1c
-	.4byte	.LASF520
+	.4byte	.LASF522
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x2d
 	.2byte	0x187
-	.4byte	0x1f51
+	.4byte	0x1f67
 	.uleb128 0xc
-	.4byte	.LASF521
+	.4byte	.LASF523
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF522
+	.4byte	.LASF524
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF523
+	.4byte	.LASF525
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF524
+	.4byte	.LASF526
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF525
+	.4byte	.LASF527
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF526
+	.4byte	.LASF528
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF527
+	.4byte	.LASF529
 	.byte	0x5
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x1eff
-	.4byte	0x1f61
+	.4byte	0x1f15
+	.4byte	0x1f77
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x4
 	.byte	0
 	.uleb128 0x17
-	.4byte	.LASF520
+	.4byte	.LASF522
 	.byte	0x2d
 	.2byte	0x19a
-	.4byte	0x1f51
+	.4byte	0x1f67
 	.uleb128 0xb
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x2f
 	.byte	0xb
-	.4byte	0x1fdd
+	.4byte	0x1ff3
 	.uleb128 0x30
-	.4byte	.LASF528
+	.4byte	.LASF530
 	.4byte	0x20000
 	.uleb128 0x30
-	.4byte	.LASF529
+	.4byte	.LASF531
 	.4byte	0x40000
 	.uleb128 0x30
-	.4byte	.LASF530
+	.4byte	.LASF532
 	.4byte	0x80000
 	.uleb128 0x30
-	.4byte	.LASF531
+	.4byte	.LASF533
 	.4byte	0x100000
 	.uleb128 0x30
-	.4byte	.LASF532
+	.4byte	.LASF534
 	.4byte	0x200000
 	.uleb128 0x30
-	.4byte	.LASF533
+	.4byte	.LASF535
 	.4byte	0x400000
 	.uleb128 0x30
-	.4byte	.LASF534
+	.4byte	.LASF536
 	.4byte	0x800000
 	.uleb128 0x30
-	.4byte	.LASF535
+	.4byte	.LASF537
 	.4byte	0x1000000
 	.uleb128 0x30
-	.4byte	.LASF536
+	.4byte	.LASF538
 	.4byte	0x2000000
 	.uleb128 0x30
-	.4byte	.LASF537
+	.4byte	.LASF539
 	.4byte	0x4000000
 	.uleb128 0x30
-	.4byte	.LASF538
+	.4byte	.LASF540
 	.4byte	0x8000000
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1fe3
+	.4byte	0x1ff9
 	.uleb128 0x1a
-	.4byte	.LASF539
+	.4byte	.LASF541
 	.uleb128 0x25
-	.4byte	.LASF540
+	.4byte	.LASF542
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x30
 	.byte	0x28
-	.4byte	0x2029
+	.4byte	0x203f
 	.uleb128 0xc
-	.4byte	.LASF541
+	.4byte	.LASF543
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF542
+	.4byte	.LASF544
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF543
+	.4byte	.LASF545
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF544
+	.4byte	.LASF546
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF545
+	.4byte	.LASF547
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF546
+	.4byte	.LASF548
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF547
+	.4byte	.LASF549
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF548
+	.4byte	.LASF550
 	.byte	0x6
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x200
-	.4byte	0x2039
+	.4byte	0x204f
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x5
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x2029
+	.4byte	0x203f
 	.uleb128 0x13
-	.4byte	.LASF549
+	.4byte	.LASF551
 	.byte	0x30
 	.byte	0x45
-	.4byte	0x2039
+	.4byte	0x204f
 	.uleb128 0x13
-	.4byte	.LASF550
+	.4byte	.LASF552
 	.byte	0x30
 	.byte	0x5a
 	.4byte	0xbb
 	.uleb128 0xf
-	.4byte	.LASF551
+	.4byte	.LASF553
 	.byte	0x68
 	.byte	0x30
 	.byte	0x63
-	.4byte	0x2079
+	.4byte	0x208f
 	.uleb128 0xe
-	.4byte	.LASF552
+	.4byte	.LASF554
 	.byte	0x30
 	.byte	0x64
-	.4byte	0x2079
+	.4byte	0x208f
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF553
+	.4byte	.LASF555
 	.byte	0x30
 	.byte	0x65
 	.4byte	0x2d
@@ -5355,416 +5365,416 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x2f1
-	.4byte	0x2089
+	.4byte	0x209f
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x5
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF554
+	.4byte	.LASF556
 	.byte	0
 	.byte	0x30
 	.byte	0x71
-	.4byte	0x20a0
+	.4byte	0x20b6
 	.uleb128 0x12
 	.string	"x"
 	.byte	0x30
 	.byte	0x72
-	.4byte	0x20a0
+	.4byte	0x20b6
 	.byte	0
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x60
-	.4byte	0x20af
+	.4byte	0x20c5
 	.uleb128 0x31
 	.4byte	0x4e
 	.byte	0
 	.uleb128 0x25
-	.4byte	.LASF555
+	.4byte	.LASF557
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x30
 	.byte	0x87
-	.4byte	0x211a
+	.4byte	0x2130
 	.uleb128 0xc
-	.4byte	.LASF556
+	.4byte	.LASF558
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF557
+	.4byte	.LASF559
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF558
+	.4byte	.LASF560
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF559
+	.4byte	.LASF561
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF560
+	.4byte	.LASF562
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF561
+	.4byte	.LASF563
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF562
+	.4byte	.LASF564
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF563
+	.4byte	.LASF565
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF564
+	.4byte	.LASF566
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF565
+	.4byte	.LASF567
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF566
+	.4byte	.LASF568
 	.byte	0x9
 	.uleb128 0xc
-	.4byte	.LASF567
+	.4byte	.LASF569
 	.byte	0xa
 	.uleb128 0xc
-	.4byte	.LASF568
+	.4byte	.LASF570
 	.byte	0xb
 	.uleb128 0xc
-	.4byte	.LASF569
+	.4byte	.LASF571
 	.byte	0xc
 	.uleb128 0xc
-	.4byte	.LASF570
+	.4byte	.LASF572
 	.byte	0xd
 	.byte	0
 	.uleb128 0x25
-	.4byte	.LASF571
+	.4byte	.LASF573
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x30
 	.byte	0x9f
-	.4byte	0x21fd
+	.4byte	0x2213
 	.uleb128 0xc
-	.4byte	.LASF572
+	.4byte	.LASF574
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF573
+	.4byte	.LASF575
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF574
+	.4byte	.LASF576
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF575
+	.4byte	.LASF577
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF576
+	.4byte	.LASF578
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF577
+	.4byte	.LASF579
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF578
+	.4byte	.LASF580
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF579
+	.4byte	.LASF581
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF580
+	.4byte	.LASF582
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF581
+	.4byte	.LASF583
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF582
+	.4byte	.LASF584
 	.byte	0x9
 	.uleb128 0xc
-	.4byte	.LASF583
+	.4byte	.LASF585
 	.byte	0xa
 	.uleb128 0xc
-	.4byte	.LASF584
+	.4byte	.LASF586
 	.byte	0xb
 	.uleb128 0xc
-	.4byte	.LASF585
+	.4byte	.LASF587
 	.byte	0xc
 	.uleb128 0xc
-	.4byte	.LASF586
+	.4byte	.LASF588
 	.byte	0xd
 	.uleb128 0xc
-	.4byte	.LASF587
+	.4byte	.LASF589
 	.byte	0xe
 	.uleb128 0xc
-	.4byte	.LASF588
+	.4byte	.LASF590
 	.byte	0xf
 	.uleb128 0xc
-	.4byte	.LASF589
+	.4byte	.LASF591
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF590
+	.4byte	.LASF592
 	.byte	0x11
 	.uleb128 0xc
-	.4byte	.LASF591
+	.4byte	.LASF593
 	.byte	0x12
 	.uleb128 0xc
-	.4byte	.LASF592
+	.4byte	.LASF594
 	.byte	0x13
 	.uleb128 0xc
-	.4byte	.LASF593
+	.4byte	.LASF595
 	.byte	0x14
 	.uleb128 0xc
-	.4byte	.LASF594
+	.4byte	.LASF596
 	.byte	0x15
 	.uleb128 0xc
-	.4byte	.LASF595
+	.4byte	.LASF597
 	.byte	0x16
 	.uleb128 0xc
-	.4byte	.LASF596
+	.4byte	.LASF598
 	.byte	0x17
 	.uleb128 0xc
-	.4byte	.LASF597
+	.4byte	.LASF599
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF598
+	.4byte	.LASF600
 	.byte	0x19
 	.uleb128 0xc
-	.4byte	.LASF599
+	.4byte	.LASF601
 	.byte	0x1a
 	.uleb128 0xc
-	.4byte	.LASF600
+	.4byte	.LASF602
 	.byte	0x1b
 	.uleb128 0xc
-	.4byte	.LASF601
+	.4byte	.LASF603
 	.byte	0x1c
 	.uleb128 0xc
-	.4byte	.LASF602
+	.4byte	.LASF604
 	.byte	0x1d
 	.uleb128 0xc
-	.4byte	.LASF603
+	.4byte	.LASF605
 	.byte	0x1e
 	.uleb128 0xc
-	.4byte	.LASF604
+	.4byte	.LASF606
 	.byte	0x1f
 	.uleb128 0xc
-	.4byte	.LASF605
+	.4byte	.LASF607
 	.byte	0x20
 	.uleb128 0xc
-	.4byte	.LASF606
+	.4byte	.LASF608
 	.byte	0x21
 	.byte	0
 	.uleb128 0x25
-	.4byte	.LASF607
+	.4byte	.LASF609
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x30
 	.byte	0xd3
-	.4byte	0x2232
+	.4byte	0x2248
 	.uleb128 0xc
-	.4byte	.LASF608
+	.4byte	.LASF610
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF609
+	.4byte	.LASF611
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF610
+	.4byte	.LASF612
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF611
+	.4byte	.LASF613
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF612
+	.4byte	.LASF614
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF613
+	.4byte	.LASF615
 	.byte	0x5
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF614
+	.4byte	.LASF616
 	.byte	0x20
 	.byte	0x30
 	.byte	0xea
-	.4byte	0x2257
+	.4byte	0x226d
 	.uleb128 0xe
-	.4byte	.LASF615
+	.4byte	.LASF617
 	.byte	0x30
 	.byte	0xf3
 	.4byte	0x3e
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF616
+	.4byte	.LASF618
 	.byte	0x30
 	.byte	0xf4
 	.4byte	0x3e
 	.byte	0x10
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF617
+	.4byte	.LASF619
 	.byte	0x88
 	.byte	0x30
 	.byte	0xf7
-	.4byte	0x22a0
+	.4byte	0x22b6
 	.uleb128 0xe
-	.4byte	.LASF618
+	.4byte	.LASF620
 	.byte	0x30
 	.byte	0xf8
-	.4byte	0x22a0
+	.4byte	0x22b6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF619
+	.4byte	.LASF621
 	.byte	0x30
 	.byte	0xf9
-	.4byte	0x2232
+	.4byte	0x2248
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF620
+	.4byte	.LASF622
 	.byte	0x30
 	.byte	0xfb
 	.4byte	0x545
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF621
+	.4byte	.LASF623
 	.byte	0x30
 	.byte	0xfd
 	.4byte	0x2d
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF622
+	.4byte	.LASF624
 	.byte	0x30
 	.byte	0xff
-	.4byte	0x241c
+	.4byte	0x2432
 	.byte	0x80
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x2f1
-	.4byte	0x22b0
+	.4byte	0x22c6
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x4
 	.byte	0
 	.uleb128 0x2a
-	.4byte	.LASF623
+	.4byte	.LASF625
 	.2byte	0x1680
 	.byte	0x30
 	.2byte	0x284
-	.4byte	0x241c
+	.4byte	0x2432
 	.uleb128 0x1d
-	.4byte	.LASF624
+	.4byte	.LASF626
 	.byte	0x30
 	.2byte	0x285
-	.4byte	0x27e7
+	.4byte	0x27fd
 	.byte	0
 	.uleb128 0x2c
-	.4byte	.LASF625
+	.4byte	.LASF627
 	.byte	0x30
 	.2byte	0x286
-	.4byte	0x27f7
+	.4byte	0x280d
 	.2byte	0x1380
 	.uleb128 0x2c
-	.4byte	.LASF626
+	.4byte	.LASF628
 	.byte	0x30
 	.2byte	0x287
 	.4byte	0xbb
 	.2byte	0x13c0
 	.uleb128 0x2c
-	.4byte	.LASF627
+	.4byte	.LASF629
 	.byte	0x30
 	.2byte	0x2a0
 	.4byte	0x2d
 	.2byte	0x13c8
 	.uleb128 0x2c
-	.4byte	.LASF628
+	.4byte	.LASF630
 	.byte	0x30
 	.2byte	0x2a1
 	.4byte	0x2d
 	.2byte	0x13d0
 	.uleb128 0x2c
-	.4byte	.LASF629
+	.4byte	.LASF631
 	.byte	0x30
 	.2byte	0x2a2
 	.4byte	0x2d
 	.2byte	0x13d8
 	.uleb128 0x2c
-	.4byte	.LASF630
+	.4byte	.LASF632
 	.byte	0x30
 	.2byte	0x2a4
 	.4byte	0xbb
 	.2byte	0x13e0
 	.uleb128 0x2c
-	.4byte	.LASF631
+	.4byte	.LASF633
 	.byte	0x30
 	.2byte	0x2a5
-	.4byte	0x1ebb
+	.4byte	0x1ed1
 	.2byte	0x13e8
 	.uleb128 0x2c
-	.4byte	.LASF632
+	.4byte	.LASF634
 	.byte	0x30
 	.2byte	0x2a6
-	.4byte	0x1ebb
+	.4byte	0x1ed1
 	.2byte	0x1400
 	.uleb128 0x2c
-	.4byte	.LASF633
+	.4byte	.LASF635
 	.byte	0x30
 	.2byte	0x2a7
-	.4byte	0x1a83
+	.4byte	0x1a99
 	.2byte	0x1418
 	.uleb128 0x2c
-	.4byte	.LASF634
+	.4byte	.LASF636
 	.byte	0x30
 	.2byte	0x2a9
 	.4byte	0xbb
 	.2byte	0x1420
 	.uleb128 0x2c
-	.4byte	.LASF635
+	.4byte	.LASF637
 	.byte	0x30
 	.2byte	0x2aa
-	.4byte	0x251b
+	.4byte	0x2531
 	.2byte	0x1424
 	.uleb128 0x2c
-	.4byte	.LASF636
+	.4byte	.LASF638
 	.byte	0x30
 	.2byte	0x2ac
 	.4byte	0xbb
 	.2byte	0x1428
 	.uleb128 0x2c
-	.4byte	.LASF637
+	.4byte	.LASF639
 	.byte	0x30
 	.2byte	0x2af
 	.4byte	0xbb
 	.2byte	0x142c
 	.uleb128 0x2c
-	.4byte	.LASF638
+	.4byte	.LASF640
 	.byte	0x30
 	.2byte	0x2b0
-	.4byte	0x251b
+	.4byte	0x2531
 	.2byte	0x1430
 	.uleb128 0x2c
-	.4byte	.LASF639
+	.4byte	.LASF641
 	.byte	0x30
 	.2byte	0x2b1
-	.4byte	0x1ebb
+	.4byte	0x1ed1
 	.2byte	0x1438
 	.uleb128 0x2c
-	.4byte	.LASF640
+	.4byte	.LASF642
 	.byte	0x30
 	.2byte	0x2b2
-	.4byte	0x1a83
+	.4byte	0x1a99
 	.2byte	0x1450
 	.uleb128 0x2c
-	.4byte	.LASF641
+	.4byte	.LASF643
 	.byte	0x30
 	.2byte	0x2b8
 	.4byte	0x2d
 	.2byte	0x1458
 	.uleb128 0x2c
-	.4byte	.LASF642
+	.4byte	.LASF644
 	.byte	0x30
 	.2byte	0x2c3
-	.4byte	0x2089
+	.4byte	0x209f
 	.2byte	0x1480
 	.uleb128 0x2c
-	.4byte	.LASF643
+	.4byte	.LASF645
 	.byte	0x30
 	.2byte	0x2c4
 	.4byte	0x898
 	.2byte	0x1480
 	.uleb128 0x2c
-	.4byte	.LASF617
+	.4byte	.LASF619
 	.byte	0x30
 	.2byte	0x2d7
-	.4byte	0x2257
+	.4byte	0x226d
 	.2byte	0x1488
 	.uleb128 0x2c
 	.4byte	.LASF63
@@ -5773,225 +5783,225 @@ spi_id_buffer.16929:
 	.4byte	0x2d
 	.2byte	0x1510
 	.uleb128 0x2c
-	.4byte	.LASF644
+	.4byte	.LASF646
 	.byte	0x30
 	.2byte	0x2db
-	.4byte	0x2089
+	.4byte	0x209f
 	.2byte	0x1540
 	.uleb128 0x2c
-	.4byte	.LASF645
+	.4byte	.LASF647
 	.byte	0x30
 	.2byte	0x2de
-	.4byte	0x2807
+	.4byte	0x281d
 	.2byte	0x1540
 	.uleb128 0x2c
-	.4byte	.LASF646
+	.4byte	.LASF648
 	.byte	0x30
 	.2byte	0x2df
-	.4byte	0x280d
+	.4byte	0x2823
 	.2byte	0x1548
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x22b0
+	.4byte	0x22c6
 	.uleb128 0x1c
-	.4byte	.LASF647
+	.4byte	.LASF649
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x30
 	.2byte	0x112
-	.4byte	0x244c
+	.4byte	0x2462
 	.uleb128 0xc
-	.4byte	.LASF648
+	.4byte	.LASF650
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF649
+	.4byte	.LASF651
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF650
+	.4byte	.LASF652
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF651
+	.4byte	.LASF653
 	.byte	0x3
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF652
+	.4byte	.LASF654
 	.byte	0x50
 	.byte	0x30
 	.2byte	0x11d
-	.4byte	0x248e
+	.4byte	0x24a4
 	.uleb128 0x1d
-	.4byte	.LASF502
+	.4byte	.LASF504
 	.byte	0x30
 	.2byte	0x11e
 	.4byte	0xbb
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF653
+	.4byte	.LASF655
 	.byte	0x30
 	.2byte	0x11f
 	.4byte	0xbb
 	.byte	0x4
 	.uleb128 0x1d
-	.4byte	.LASF654
+	.4byte	.LASF656
 	.byte	0x30
 	.2byte	0x120
 	.4byte	0xbb
 	.byte	0x8
 	.uleb128 0x1d
-	.4byte	.LASF618
+	.4byte	.LASF620
 	.byte	0x30
 	.2byte	0x123
-	.4byte	0x248e
+	.4byte	0x24a4
 	.byte	0x10
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x2f1
-	.4byte	0x249e
+	.4byte	0x24b4
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x3
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF655
+	.4byte	.LASF657
 	.byte	0x60
 	.byte	0x30
 	.2byte	0x126
-	.4byte	0x24d3
+	.4byte	0x24e9
 	.uleb128 0x24
 	.string	"pcp"
 	.byte	0x30
 	.2byte	0x127
-	.4byte	0x244c
+	.4byte	0x2462
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF656
+	.4byte	.LASF658
 	.byte	0x30
 	.2byte	0x12d
 	.4byte	0xf6
 	.byte	0x50
 	.uleb128 0x1d
-	.4byte	.LASF657
+	.4byte	.LASF659
 	.byte	0x30
 	.2byte	0x12e
-	.4byte	0x24d3
+	.4byte	0x24e9
 	.byte	0x51
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xf6
-	.4byte	0x24e3
+	.4byte	0x24f9
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0xc
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF658
+	.4byte	.LASF660
 	.byte	0x22
 	.byte	0x30
 	.2byte	0x132
-	.4byte	0x250b
+	.4byte	0x2521
 	.uleb128 0x1d
-	.4byte	.LASF656
+	.4byte	.LASF658
 	.byte	0x30
 	.2byte	0x133
 	.4byte	0xf6
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF659
+	.4byte	.LASF661
 	.byte	0x30
 	.2byte	0x134
-	.4byte	0x250b
+	.4byte	0x2521
 	.byte	0x1
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xf6
-	.4byte	0x251b
+	.4byte	0x2531
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x20
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF660
+	.4byte	.LASF662
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x30
 	.2byte	0x139
-	.4byte	0x2545
+	.4byte	0x255b
 	.uleb128 0xc
-	.4byte	.LASF661
+	.4byte	.LASF663
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF662
+	.4byte	.LASF664
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF663
+	.4byte	.LASF665
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF664
+	.4byte	.LASF666
 	.byte	0x3
 	.byte	0
 	.uleb128 0x2a
-	.4byte	.LASF665
+	.4byte	.LASF667
 	.2byte	0x680
 	.byte	0x30
 	.2byte	0x172
-	.4byte	0x2713
+	.4byte	0x2729
 	.uleb128 0x1d
-	.4byte	.LASF666
+	.4byte	.LASF668
 	.byte	0x30
 	.2byte	0x176
-	.4byte	0x2713
+	.4byte	0x2729
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF667
+	.4byte	.LASF669
 	.byte	0x30
 	.2byte	0x178
 	.4byte	0x2d
 	.byte	0x18
 	.uleb128 0x1d
-	.4byte	.LASF668
+	.4byte	.LASF670
 	.byte	0x30
 	.2byte	0x183
-	.4byte	0x2723
+	.4byte	0x2739
 	.byte	0x20
 	.uleb128 0x1d
-	.4byte	.LASF669
+	.4byte	.LASF671
 	.byte	0x30
 	.2byte	0x188
-	.4byte	0x241c
+	.4byte	0x2432
 	.byte	0x38
 	.uleb128 0x1d
-	.4byte	.LASF670
+	.4byte	.LASF672
 	.byte	0x30
 	.2byte	0x189
-	.4byte	0x2733
+	.4byte	0x2749
 	.byte	0x40
 	.uleb128 0x1d
-	.4byte	.LASF671
+	.4byte	.LASF673
 	.byte	0x30
 	.2byte	0x18c
 	.4byte	0x247
 	.byte	0x48
 	.uleb128 0x1d
-	.4byte	.LASF672
+	.4byte	.LASF674
 	.byte	0x30
 	.2byte	0x198
 	.4byte	0x2d
 	.byte	0x50
 	.uleb128 0x1d
-	.4byte	.LASF673
+	.4byte	.LASF675
 	.byte	0x30
 	.2byte	0x1c3
 	.4byte	0x2d
 	.byte	0x58
 	.uleb128 0x1d
-	.4byte	.LASF674
+	.4byte	.LASF676
 	.byte	0x30
 	.2byte	0x1c4
 	.4byte	0x2d
 	.byte	0x60
 	.uleb128 0x1d
-	.4byte	.LASF675
+	.4byte	.LASF677
 	.byte	0x30
 	.2byte	0x1c5
 	.4byte	0x2d
@@ -6003,28 +6013,28 @@ spi_id_buffer.16929:
 	.4byte	0x55
 	.byte	0x70
 	.uleb128 0x1d
-	.4byte	.LASF676
+	.4byte	.LASF678
 	.byte	0x30
 	.2byte	0x1cf
 	.4byte	0x2d
 	.byte	0x78
 	.uleb128 0x1d
-	.4byte	.LASF677
+	.4byte	.LASF679
 	.byte	0x30
 	.2byte	0x1d7
 	.4byte	0xbb
 	.byte	0x80
 	.uleb128 0x1d
-	.4byte	.LASF642
+	.4byte	.LASF644
 	.byte	0x30
 	.2byte	0x1da
-	.4byte	0x2089
+	.4byte	0x209f
 	.byte	0xc0
 	.uleb128 0x1d
-	.4byte	.LASF551
+	.4byte	.LASF553
 	.byte	0x30
 	.2byte	0x1dd
-	.4byte	0x2739
+	.4byte	0x274f
 	.byte	0xc0
 	.uleb128 0x2c
 	.4byte	.LASF63
@@ -6039,76 +6049,76 @@ spi_id_buffer.16929:
 	.4byte	0x898
 	.2byte	0x540
 	.uleb128 0x2c
-	.4byte	.LASF644
+	.4byte	.LASF646
 	.byte	0x30
 	.2byte	0x1e6
-	.4byte	0x2089
+	.4byte	0x209f
 	.2byte	0x580
 	.uleb128 0x2c
-	.4byte	.LASF678
+	.4byte	.LASF680
 	.byte	0x30
 	.2byte	0x1ed
 	.4byte	0x2d
 	.2byte	0x580
 	.uleb128 0x2c
-	.4byte	.LASF679
+	.4byte	.LASF681
 	.byte	0x30
 	.2byte	0x1f1
 	.4byte	0x2d
 	.2byte	0x588
 	.uleb128 0x2c
-	.4byte	.LASF680
+	.4byte	.LASF682
 	.byte	0x30
 	.2byte	0x1f3
 	.4byte	0x3e
 	.2byte	0x590
 	.uleb128 0x2c
-	.4byte	.LASF681
+	.4byte	.LASF683
 	.byte	0x30
 	.2byte	0x1fc
 	.4byte	0x6c
 	.2byte	0x5a0
 	.uleb128 0x2c
-	.4byte	.LASF682
+	.4byte	.LASF684
 	.byte	0x30
 	.2byte	0x1fd
 	.4byte	0x6c
 	.2byte	0x5a4
 	.uleb128 0x2c
-	.4byte	.LASF683
+	.4byte	.LASF685
 	.byte	0x30
 	.2byte	0x1fe
 	.4byte	0xbb
 	.2byte	0x5a8
 	.uleb128 0x2c
-	.4byte	.LASF684
+	.4byte	.LASF686
 	.byte	0x30
 	.2byte	0x203
 	.4byte	0x247
 	.2byte	0x5ac
 	.uleb128 0x2c
-	.4byte	.LASF685
+	.4byte	.LASF687
 	.byte	0x30
 	.2byte	0x206
 	.4byte	0x247
 	.2byte	0x5ad
 	.uleb128 0x2c
-	.4byte	.LASF686
+	.4byte	.LASF688
 	.byte	0x30
 	.2byte	0x208
-	.4byte	0x2089
+	.4byte	0x209f
 	.2byte	0x5c0
 	.uleb128 0x2c
-	.4byte	.LASF646
+	.4byte	.LASF648
 	.byte	0x30
 	.2byte	0x20a
-	.4byte	0x2749
+	.4byte	0x275f
 	.2byte	0x5c0
 	.uleb128 0x2c
-	.4byte	.LASF687
+	.4byte	.LASF689
 	.byte	0x30
 	.2byte	0x20b
-	.4byte	0x2759
+	.4byte	0x276f
 	.2byte	0x628
 	.uleb128 0x2c
 	.4byte	.LASF68
@@ -6137,38 +6147,38 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x2d
-	.4byte	0x2723
+	.4byte	0x2739
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x175
-	.4byte	0x2733
+	.4byte	0x2749
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x249e
+	.4byte	0x24b4
 	.uleb128 0x5
-	.4byte	0x2054
-	.4byte	0x2749
+	.4byte	0x206a
+	.4byte	0x275f
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0xa
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x545
-	.4byte	0x2759
+	.4byte	0x276f
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0xc
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x545
-	.4byte	0x2768
+	.4byte	0x277e
 	.uleb128 0x31
 	.4byte	0x4e
 	.byte	0
@@ -6177,28 +6187,28 @@ spi_id_buffer.16929:
 	.4byte	0x6c
 	.byte	0x30
 	.2byte	0x24f
-	.4byte	0x2782
+	.4byte	0x2798
 	.uleb128 0xc
-	.4byte	.LASF688
+	.4byte	.LASF690
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF689
+	.4byte	.LASF691
 	.byte	0x1
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF690
+	.4byte	.LASF692
 	.byte	0x10
 	.byte	0x30
 	.2byte	0x25f
-	.4byte	0x27aa
+	.4byte	0x27c0
 	.uleb128 0x1d
-	.4byte	.LASF665
+	.4byte	.LASF667
 	.byte	0x30
 	.2byte	0x260
-	.4byte	0x27aa
+	.4byte	0x27c0
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF691
+	.4byte	.LASF693
 	.byte	0x30
 	.2byte	0x261
 	.4byte	0xbb
@@ -6206,76 +6216,76 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2545
+	.4byte	0x255b
 	.uleb128 0x1b
-	.4byte	.LASF692
+	.4byte	.LASF694
 	.byte	0x40
 	.byte	0x30
 	.2byte	0x272
-	.4byte	0x27cb
+	.4byte	0x27e1
 	.uleb128 0x1d
-	.4byte	.LASF693
+	.4byte	.LASF695
 	.byte	0x30
 	.2byte	0x273
-	.4byte	0x27cb
+	.4byte	0x27e1
 	.byte	0
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x2782
-	.4byte	0x27db
+	.4byte	0x2798
+	.4byte	0x27f1
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x3
 	.byte	0
 	.uleb128 0x17
-	.4byte	.LASF694
+	.4byte	.LASF696
 	.byte	0x30
 	.2byte	0x278
-	.4byte	0x1fdd
+	.4byte	0x1ff3
 	.uleb128 0x5
-	.4byte	0x2545
-	.4byte	0x27f7
+	.4byte	0x255b
+	.4byte	0x280d
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x27b0
-	.4byte	0x2807
+	.4byte	0x27c6
+	.4byte	0x281d
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x24e3
+	.4byte	0x24f9
 	.uleb128 0x5
 	.4byte	0x545
-	.4byte	0x281d
+	.4byte	0x2833
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x20
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF695
+	.4byte	.LASF697
 	.byte	0x30
 	.byte	0x31
 	.byte	0x1e
-	.4byte	0x2872
+	.4byte	0x2888
 	.uleb128 0xe
-	.4byte	.LASF502
+	.4byte	.LASF504
 	.byte	0x31
 	.byte	0x1f
 	.4byte	0x545
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF280
+	.4byte	.LASF282
 	.byte	0x31
 	.byte	0x20
 	.4byte	0x2f1
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF279
+	.4byte	.LASF281
 	.byte	0x31
 	.byte	0x21
 	.4byte	0x866
@@ -6284,184 +6294,184 @@ spi_id_buffer.16929:
 	.string	"osq"
 	.byte	0x31
 	.byte	0x23
-	.4byte	0xfb9
+	.4byte	0xfcf
 	.byte	0x1c
 	.uleb128 0xe
-	.4byte	.LASF278
+	.4byte	.LASF280
 	.byte	0x31
 	.byte	0x28
-	.4byte	0x1a83
+	.4byte	0x1a99
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF696
+	.4byte	.LASF698
 	.byte	0x31
 	.byte	0x31
 	.4byte	0x175
 	.byte	0x28
 	.byte	0
 	.uleb128 0x13
-	.4byte	.LASF697
+	.4byte	.LASF699
 	.byte	0x32
 	.byte	0xa
-	.4byte	0x1aae
+	.4byte	0x1ac4
 	.uleb128 0xf
-	.4byte	.LASF698
+	.4byte	.LASF700
 	.byte	0x8
 	.byte	0x33
 	.byte	0x46
-	.4byte	0x2896
+	.4byte	0x28ac
 	.uleb128 0xe
 	.4byte	.LASF51
 	.byte	0x33
 	.byte	0x47
-	.4byte	0x2896
+	.4byte	0x28ac
 	.byte	0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x287d
+	.4byte	0x2893
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x28a2
+	.4byte	0x28b8
 	.uleb128 0x10
-	.4byte	0x28ad
+	.4byte	0x28c3
 	.uleb128 0x11
 	.4byte	0x45b
 	.byte	0
 	.uleb128 0x13
-	.4byte	.LASF699
+	.4byte	.LASF701
 	.byte	0x34
 	.byte	0x1e
 	.4byte	0x6c
 	.uleb128 0x5
 	.4byte	0x2d
-	.4byte	0x28c8
+	.4byte	0x28de
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x7
 	.byte	0
 	.uleb128 0x13
-	.4byte	.LASF700
+	.4byte	.LASF702
 	.byte	0x35
 	.byte	0x13
-	.4byte	0x28b8
+	.4byte	0x28ce
 	.uleb128 0x13
-	.4byte	.LASF701
+	.4byte	.LASF703
 	.byte	0x36
 	.byte	0x26
 	.4byte	0xbb
 	.uleb128 0x10
-	.4byte	0x28ee
+	.4byte	0x2904
 	.uleb128 0x11
-	.4byte	0x28ee
+	.4byte	0x2904
 	.uleb128 0x11
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1cef
+	.4byte	0x1d05
 	.uleb128 0x13
-	.4byte	.LASF702
+	.4byte	.LASF704
 	.byte	0x36
 	.byte	0x48
-	.4byte	0x28ff
+	.4byte	0x2915
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x28de
+	.4byte	0x28f4
 	.uleb128 0xf
-	.4byte	.LASF703
+	.4byte	.LASF705
 	.byte	0x18
 	.byte	0x36
 	.byte	0x5b
-	.4byte	0x2936
+	.4byte	0x294c
 	.uleb128 0xe
-	.4byte	.LASF284
+	.4byte	.LASF286
 	.byte	0x36
 	.byte	0x5c
 	.4byte	0x45b
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF704
+	.4byte	.LASF706
 	.byte	0x36
 	.byte	0x5d
-	.4byte	0x1a83
+	.4byte	0x1a99
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF705
+	.4byte	.LASF707
 	.byte	0x36
 	.byte	0x5e
 	.4byte	0x175
 	.byte	0x10
 	.byte	0
 	.uleb128 0x13
-	.4byte	.LASF703
+	.4byte	.LASF705
 	.byte	0x36
 	.byte	0x61
-	.4byte	0x2905
+	.4byte	0x291b
 	.uleb128 0x13
-	.4byte	.LASF706
+	.4byte	.LASF708
 	.byte	0x36
 	.byte	0x62
 	.4byte	0x175
 	.uleb128 0x13
-	.4byte	.LASF707
+	.4byte	.LASF709
 	.byte	0x34
 	.byte	0x7c
 	.4byte	0x6c
 	.uleb128 0x13
-	.4byte	.LASF708
+	.4byte	.LASF710
 	.byte	0x34
 	.byte	0x80
 	.4byte	0xbb
 	.uleb128 0x33
 	.4byte	0x136
 	.uleb128 0x13
-	.4byte	.LASF709
+	.4byte	.LASF711
 	.byte	0x37
 	.byte	0x60
-	.4byte	0x2972
+	.4byte	0x2988
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2962
+	.4byte	0x2978
 	.uleb128 0x13
-	.4byte	.LASF710
+	.4byte	.LASF712
 	.byte	0x38
 	.byte	0x22
 	.4byte	0x986
 	.uleb128 0x25
-	.4byte	.LASF711
+	.4byte	.LASF713
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x38
 	.byte	0x29
-	.4byte	0x29a6
+	.4byte	0x29bc
 	.uleb128 0xc
-	.4byte	.LASF712
+	.4byte	.LASF714
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF713
+	.4byte	.LASF715
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF714
+	.4byte	.LASF716
 	.byte	0x2
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF715
+	.4byte	.LASF717
 	.byte	0x48
 	.byte	0x38
 	.byte	0x31
-	.4byte	0x2a1e
+	.4byte	0x2a34
 	.uleb128 0xe
-	.4byte	.LASF716
+	.4byte	.LASF718
 	.byte	0x38
 	.byte	0x32
-	.4byte	0x2983
+	.4byte	0x2999
 	.byte	0
 	.uleb128 0x12
 	.string	"id"
 	.byte	0x38
 	.byte	0x33
-	.4byte	0x2a23
+	.4byte	0x2a39
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF64
@@ -6470,140 +6480,140 @@ spi_id_buffer.16929:
 	.4byte	0x55
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF717
+	.4byte	.LASF719
 	.byte	0x38
 	.byte	0x35
-	.4byte	0x2a2f
+	.4byte	0x2a45
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF718
+	.4byte	.LASF720
 	.byte	0x38
 	.byte	0x36
-	.4byte	0x2a2f
+	.4byte	0x2a45
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF719
+	.4byte	.LASF721
 	.byte	0x38
 	.byte	0x37
-	.4byte	0x2972
+	.4byte	0x2988
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF720
+	.4byte	.LASF722
 	.byte	0x38
 	.byte	0x38
-	.4byte	0x2972
+	.4byte	0x2988
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF721
+	.4byte	.LASF723
 	.byte	0x38
 	.byte	0x39
-	.4byte	0x2a54
+	.4byte	0x2a6a
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF722
+	.4byte	.LASF724
 	.byte	0x38
 	.byte	0x3a
-	.4byte	0x2a54
+	.4byte	0x2a6a
 	.byte	0x40
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x29a6
+	.4byte	0x29bc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2a29
+	.4byte	0x2a3f
 	.uleb128 0x34
 	.uleb128 0x33
 	.4byte	0x120
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2a2a
+	.4byte	0x2a40
 	.uleb128 0x16
 	.4byte	0xbb
-	.4byte	0x2a49
+	.4byte	0x2a5f
 	.uleb128 0x11
 	.4byte	0x2d
 	.uleb128 0x11
-	.4byte	0x2a49
+	.4byte	0x2a5f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2a4f
+	.4byte	0x2a65
 	.uleb128 0x1a
-	.4byte	.LASF723
+	.4byte	.LASF725
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2a35
+	.4byte	0x2a4b
 	.uleb128 0x13
-	.4byte	.LASF724
+	.4byte	.LASF726
 	.byte	0x38
 	.byte	0x3d
-	.4byte	0x2a65
+	.4byte	0x2a7b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2a1e
+	.4byte	0x2a34
 	.uleb128 0x13
-	.4byte	.LASF725
+	.4byte	.LASF727
 	.byte	0x39
 	.byte	0x8b
 	.4byte	0x2d
 	.uleb128 0x13
-	.4byte	.LASF726
+	.4byte	.LASF728
 	.byte	0x39
 	.byte	0x8c
 	.4byte	0x2d
 	.uleb128 0x13
-	.4byte	.LASF727
+	.4byte	.LASF729
 	.byte	0x3a
 	.byte	0x4e
 	.4byte	0x136
 	.uleb128 0x13
-	.4byte	.LASF728
+	.4byte	.LASF730
 	.byte	0x3a
 	.byte	0x4f
 	.4byte	0x39
 	.uleb128 0x13
-	.4byte	.LASF729
+	.4byte	.LASF731
 	.byte	0x3a
 	.byte	0xbc
 	.4byte	0x2d
 	.uleb128 0x8
-	.4byte	.LASF730
+	.4byte	.LASF732
 	.byte	0x3b
 	.byte	0x1c
 	.4byte	0x12b
 	.uleb128 0x13
-	.4byte	.LASF731
+	.4byte	.LASF733
 	.byte	0x3c
 	.byte	0xa
 	.4byte	0xbb
 	.uleb128 0x17
-	.4byte	.LASF732
+	.4byte	.LASF734
 	.byte	0x3c
 	.2byte	0x11e
 	.4byte	0xbb
 	.uleb128 0xf
-	.4byte	.LASF733
+	.4byte	.LASF735
 	.byte	0x38
 	.byte	0x3d
 	.byte	0xc
-	.4byte	0x2b19
+	.4byte	0x2b2f
 	.uleb128 0xe
-	.4byte	.LASF734
+	.4byte	.LASF736
 	.byte	0x3d
 	.byte	0x11
 	.4byte	0x335
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF475
+	.4byte	.LASF477
 	.byte	0x3d
 	.byte	0x12
 	.4byte	0x2d
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF735
+	.4byte	.LASF737
 	.byte	0x3d
 	.byte	0x13
-	.4byte	0x2b2a
+	.4byte	0x2b40
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF63
@@ -6625,51 +6635,51 @@ spi_id_buffer.16929:
 	.byte	0x30
 	.byte	0
 	.uleb128 0x10
-	.4byte	0x2b24
+	.4byte	0x2b3a
 	.uleb128 0x11
-	.4byte	0x2b24
+	.4byte	0x2b3a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2ac4
+	.4byte	0x2ada
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2b19
+	.4byte	0x2b2f
 	.uleb128 0x13
-	.4byte	.LASF736
+	.4byte	.LASF738
 	.byte	0x3d
 	.byte	0xc3
 	.4byte	0x6c
 	.uleb128 0x8
-	.4byte	.LASF737
+	.4byte	.LASF739
 	.byte	0x3e
 	.byte	0x16
-	.4byte	0x2b46
+	.4byte	0x2b5c
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2b4c
+	.4byte	0x2b62
 	.uleb128 0x10
-	.4byte	0x2b57
+	.4byte	0x2b6d
 	.uleb128 0x11
-	.4byte	0x2b57
+	.4byte	0x2b6d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2b5d
+	.4byte	0x2b73
 	.uleb128 0xf
-	.4byte	.LASF738
+	.4byte	.LASF740
 	.byte	0x30
 	.byte	0x3e
 	.byte	0x67
-	.4byte	0x2ba6
+	.4byte	0x2bbc
 	.uleb128 0xe
-	.4byte	.LASF739
+	.4byte	.LASF741
 	.byte	0x3e
 	.byte	0x68
 	.4byte	0x545
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF734
+	.4byte	.LASF736
 	.byte	0x3e
 	.byte	0x69
 	.4byte	0x2f1
@@ -6678,7 +6688,7 @@ spi_id_buffer.16929:
 	.4byte	.LASF59
 	.byte	0x3e
 	.byte	0x6a
-	.4byte	0x2b3b
+	.4byte	0x2b51
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF68
@@ -6694,77 +6704,77 @@ spi_id_buffer.16929:
 	.byte	0x28
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF740
+	.4byte	.LASF742
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2ba6
+	.4byte	0x2bbc
 	.uleb128 0x17
-	.4byte	.LASF741
+	.4byte	.LASF743
 	.byte	0x3e
 	.2byte	0x187
-	.4byte	0x2bab
+	.4byte	0x2bc1
 	.uleb128 0x17
-	.4byte	.LASF742
+	.4byte	.LASF744
 	.byte	0x3e
 	.2byte	0x188
-	.4byte	0x2bab
+	.4byte	0x2bc1
 	.uleb128 0x17
-	.4byte	.LASF743
+	.4byte	.LASF745
 	.byte	0x3e
 	.2byte	0x189
-	.4byte	0x2bab
+	.4byte	0x2bc1
 	.uleb128 0x17
-	.4byte	.LASF744
+	.4byte	.LASF746
 	.byte	0x3e
 	.2byte	0x18a
-	.4byte	0x2bab
+	.4byte	0x2bc1
 	.uleb128 0x17
-	.4byte	.LASF745
+	.4byte	.LASF747
 	.byte	0x3e
 	.2byte	0x18b
-	.4byte	0x2bab
+	.4byte	0x2bc1
 	.uleb128 0x17
-	.4byte	.LASF746
+	.4byte	.LASF748
 	.byte	0x3e
 	.2byte	0x18c
-	.4byte	0x2bab
+	.4byte	0x2bc1
 	.uleb128 0x17
-	.4byte	.LASF747
+	.4byte	.LASF749
 	.byte	0x3e
 	.2byte	0x18d
-	.4byte	0x2bab
+	.4byte	0x2bc1
 	.uleb128 0xf
-	.4byte	.LASF748
+	.4byte	.LASF750
 	.byte	0x20
 	.byte	0x3f
 	.byte	0x1a
-	.4byte	0x2c2a
+	.4byte	0x2c40
 	.uleb128 0xe
-	.4byte	.LASF749
+	.4byte	.LASF751
 	.byte	0x3f
 	.byte	0x1b
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF750
+	.4byte	.LASF752
 	.byte	0x3f
 	.byte	0x1c
-	.4byte	0x1ebb
+	.4byte	0x1ed1
 	.byte	0x8
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF751
+	.4byte	.LASF753
 	.byte	0xf
 	.byte	0x33
-	.4byte	0x2c35
+	.4byte	0x2c4b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2c3b
+	.4byte	0x2c51
 	.uleb128 0x16
 	.4byte	0xbb
-	.4byte	0x2c54
+	.4byte	0x2c6a
 	.uleb128 0x11
-	.4byte	0x2c54
+	.4byte	0x2c6a
 	.uleb128 0x11
 	.4byte	0x2d
 	.uleb128 0x11
@@ -6772,131 +6782,131 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2c5a
+	.4byte	0x2c70
 	.uleb128 0xf
-	.4byte	.LASF752
+	.4byte	.LASF754
 	.byte	0x18
 	.byte	0xf
 	.byte	0x36
-	.4byte	0x2c8b
+	.4byte	0x2ca1
 	.uleb128 0xe
-	.4byte	.LASF753
+	.4byte	.LASF755
 	.byte	0xf
 	.byte	0x37
-	.4byte	0x2c2a
+	.4byte	0x2c40
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF51
 	.byte	0xf
 	.byte	0x38
-	.4byte	0x2c54
+	.4byte	0x2c6a
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF754
+	.4byte	.LASF756
 	.byte	0xf
 	.byte	0x39
 	.4byte	0xbb
 	.byte	0x10
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF755
+	.4byte	.LASF757
 	.byte	0x38
 	.byte	0xf
 	.byte	0x41
-	.4byte	0x2cb0
+	.4byte	0x2cc6
 	.uleb128 0xe
-	.4byte	.LASF756
+	.4byte	.LASF758
 	.byte	0xf
 	.byte	0x42
-	.4byte	0x281d
+	.4byte	0x2833
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF101
 	.byte	0xf
 	.byte	0x43
-	.4byte	0x2c54
+	.4byte	0x2c6a
 	.byte	0x30
 	.byte	0
 	.uleb128 0x13
-	.4byte	.LASF757
+	.4byte	.LASF759
 	.byte	0xf
 	.byte	0xee
-	.4byte	0x2c8b
+	.4byte	0x2ca1
 	.uleb128 0x17
-	.4byte	.LASF758
+	.4byte	.LASF760
 	.byte	0x30
 	.2byte	0x368
 	.4byte	0xbb
 	.uleb128 0x5
 	.4byte	0xbb
-	.4byte	0x2cd7
+	.4byte	0x2ced
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x2
 	.byte	0
 	.uleb128 0x17
-	.4byte	.LASF759
+	.4byte	.LASF761
 	.byte	0x30
 	.2byte	0x394
-	.4byte	0x2cc7
+	.4byte	0x2cdd
 	.uleb128 0x17
-	.4byte	.LASF760
+	.4byte	.LASF762
 	.byte	0x30
 	.2byte	0x3a0
 	.4byte	0x4ed
 	.uleb128 0x17
-	.4byte	.LASF761
+	.4byte	.LASF763
 	.byte	0x30
 	.2byte	0x3a5
-	.4byte	0x22b0
+	.4byte	0x22c6
 	.uleb128 0x1b
-	.4byte	.LASF762
+	.4byte	.LASF764
 	.byte	0x10
 	.byte	0x30
 	.2byte	0x469
-	.4byte	0x2d23
+	.4byte	0x2d39
 	.uleb128 0x1d
-	.4byte	.LASF763
+	.4byte	.LASF765
 	.byte	0x30
 	.2byte	0x476
 	.4byte	0x2d
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF764
+	.4byte	.LASF766
 	.byte	0x30
 	.2byte	0x479
-	.4byte	0x2d23
+	.4byte	0x2d39
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x2d
 	.uleb128 0x17
-	.4byte	.LASF762
+	.4byte	.LASF764
 	.byte	0x30
 	.2byte	0x493
-	.4byte	0x2d35
+	.4byte	0x2d4b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2d3b
+	.4byte	0x2d51
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2cfb
+	.4byte	0x2d11
 	.uleb128 0x17
-	.4byte	.LASF765
+	.4byte	.LASF767
 	.byte	0x30
 	.2byte	0x4ea
 	.4byte	0xbb
 	.uleb128 0x13
-	.4byte	.LASF766
+	.4byte	.LASF768
 	.byte	0x40
 	.byte	0x47
 	.4byte	0x45b
 	.uleb128 0x13
-	.4byte	.LASF767
+	.4byte	.LASF769
 	.byte	0x40
 	.byte	0x48
-	.4byte	0x2d63
+	.4byte	0x2d79
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x34
@@ -6904,122 +6914,122 @@ spi_id_buffer.16929:
 	.byte	0x8
 	.4byte	0x6c
 	.uleb128 0x25
-	.4byte	.LASF768
+	.4byte	.LASF770
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x40
 	.byte	0x5d
-	.4byte	0x2d98
+	.4byte	0x2dae
 	.uleb128 0xc
-	.4byte	.LASF769
+	.4byte	.LASF771
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF770
+	.4byte	.LASF772
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF771
+	.4byte	.LASF773
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF772
+	.4byte	.LASF774
 	.byte	0x3
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x5b
-	.4byte	0x2da8
+	.4byte	0x2dbe
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x2
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x2d98
+	.4byte	0x2dae
 	.uleb128 0x13
-	.4byte	.LASF773
+	.4byte	.LASF775
 	.byte	0x40
 	.byte	0x64
-	.4byte	0x2da8
+	.4byte	0x2dbe
 	.uleb128 0x13
-	.4byte	.LASF774
+	.4byte	.LASF776
 	.byte	0x40
 	.byte	0x66
-	.4byte	0x2d6f
+	.4byte	0x2d85
 	.uleb128 0xf
-	.4byte	.LASF775
+	.4byte	.LASF777
 	.byte	0x28
 	.byte	0x41
 	.byte	0x7
-	.4byte	0x2e24
+	.4byte	0x2e3a
 	.uleb128 0xe
-	.4byte	.LASF776
+	.4byte	.LASF778
 	.byte	0x41
 	.byte	0x8
 	.4byte	0xbb
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF777
+	.4byte	.LASF779
 	.byte	0x41
 	.byte	0x9
 	.4byte	0xbb
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF778
+	.4byte	.LASF780
 	.byte	0x41
 	.byte	0xa
 	.4byte	0xbb
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF779
+	.4byte	.LASF781
 	.byte	0x41
 	.byte	0xb
 	.4byte	0xbb
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF780
+	.4byte	.LASF782
 	.byte	0x41
 	.byte	0xc
-	.4byte	0x1cf4
+	.4byte	0x1d0a
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF781
+	.4byte	.LASF783
 	.byte	0x41
 	.byte	0xd
-	.4byte	0x1cf4
+	.4byte	0x1d0a
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF782
+	.4byte	.LASF784
 	.byte	0x41
 	.byte	0xe
-	.4byte	0x1cf4
+	.4byte	0x1d0a
 	.byte	0x20
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x2dc3
-	.4byte	0x2e34
+	.4byte	0x2dd9
+	.4byte	0x2e4a
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x7
 	.byte	0
 	.uleb128 0x13
-	.4byte	.LASF775
+	.4byte	.LASF777
 	.byte	0x41
 	.byte	0x11
-	.4byte	0x2e24
+	.4byte	0x2e3a
 	.uleb128 0x13
-	.4byte	.LASF783
+	.4byte	.LASF785
 	.byte	0x42
 	.byte	0x11
 	.4byte	0x2d
 	.uleb128 0x13
-	.4byte	.LASF784
+	.4byte	.LASF786
 	.byte	0x42
 	.byte	0x1c
 	.4byte	0x2d
 	.uleb128 0x13
-	.4byte	.LASF785
+	.4byte	.LASF787
 	.byte	0x42
 	.byte	0x24
 	.4byte	0x2d
 	.uleb128 0x17
-	.4byte	.LASF786
+	.4byte	.LASF788
 	.byte	0x43
 	.2byte	0x259
 	.4byte	0x290
@@ -7028,139 +7038,139 @@ spi_id_buffer.16929:
 	.byte	0x18
 	.byte	0x44
 	.byte	0x13
-	.4byte	0x2e9d
+	.4byte	0x2eb3
 	.uleb128 0xe
-	.4byte	.LASF787
+	.4byte	.LASF789
 	.byte	0x44
 	.byte	0x14
-	.4byte	0x1e23
+	.4byte	0x1e39
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF788
+	.4byte	.LASF790
 	.byte	0x44
 	.byte	0x15
 	.4byte	0x6c
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF789
+	.4byte	.LASF791
 	.byte	0x44
 	.byte	0x16
 	.4byte	0x6c
 	.byte	0x14
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF790
+	.4byte	.LASF792
 	.byte	0x80
 	.byte	0x44
 	.byte	0xe0
-	.4byte	0x2eb6
+	.4byte	0x2ecc
 	.uleb128 0xe
-	.4byte	.LASF791
+	.4byte	.LASF793
 	.byte	0x44
 	.byte	0xe1
 	.4byte	0x15a
 	.byte	0
 	.byte	0
 	.uleb128 0x13
-	.4byte	.LASF790
+	.4byte	.LASF792
 	.byte	0x44
 	.byte	0xe4
-	.4byte	0x2ec1
+	.4byte	0x2ed7
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2e9d
+	.4byte	0x2eb3
 	.uleb128 0xf
-	.4byte	.LASF792
+	.4byte	.LASF794
 	.byte	0x18
 	.byte	0x45
 	.byte	0x24
-	.4byte	0x2ef8
+	.4byte	0x2f0e
 	.uleb128 0xe
-	.4byte	.LASF793
+	.4byte	.LASF795
 	.byte	0x45
 	.byte	0x25
 	.4byte	0x2d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF794
+	.4byte	.LASF796
 	.byte	0x45
 	.byte	0x26
-	.4byte	0x2ef8
+	.4byte	0x2f0e
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF795
+	.4byte	.LASF797
 	.byte	0x45
 	.byte	0x27
-	.4byte	0x2ef8
+	.4byte	0x2f0e
 	.byte	0x10
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2ec7
+	.4byte	0x2edd
 	.uleb128 0xf
-	.4byte	.LASF796
+	.4byte	.LASF798
 	.byte	0x8
 	.byte	0x45
 	.byte	0x2b
-	.4byte	0x2f17
+	.4byte	0x2f2d
 	.uleb128 0xe
-	.4byte	.LASF792
+	.4byte	.LASF794
 	.byte	0x45
 	.byte	0x2c
-	.4byte	0x2ef8
+	.4byte	0x2f0e
 	.byte	0
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF797
+	.4byte	.LASF799
 	.byte	0x10
 	.byte	0x45
 	.byte	0x39
-	.4byte	0x2f3c
+	.4byte	0x2f52
 	.uleb128 0xe
-	.4byte	.LASF796
+	.4byte	.LASF798
 	.byte	0x45
 	.byte	0x3a
-	.4byte	0x2efe
+	.4byte	0x2f14
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF798
+	.4byte	.LASF800
 	.byte	0x45
 	.byte	0x3b
-	.4byte	0x2ef8
+	.4byte	0x2f0e
 	.byte	0x8
 	.byte	0
 	.uleb128 0x13
-	.4byte	.LASF799
+	.4byte	.LASF801
 	.byte	0x46
 	.byte	0x23
 	.4byte	0xbb
 	.uleb128 0x13
-	.4byte	.LASF800
+	.4byte	.LASF802
 	.byte	0x46
 	.byte	0x24
 	.4byte	0xbb
 	.uleb128 0x13
-	.4byte	.LASF801
+	.4byte	.LASF803
 	.byte	0x46
 	.byte	0x52
 	.4byte	0xbb
 	.uleb128 0x13
-	.4byte	.LASF802
+	.4byte	.LASF804
 	.byte	0x46
 	.byte	0x53
 	.4byte	0xbb
 	.uleb128 0x1a
-	.4byte	.LASF803
+	.4byte	.LASF805
 	.uleb128 0x13
-	.4byte	.LASF804
+	.4byte	.LASF806
 	.byte	0x47
 	.byte	0x13
-	.4byte	0x2f68
+	.4byte	0x2f7e
 	.uleb128 0xd
 	.byte	0x4
 	.byte	0x47
 	.byte	0x15
-	.4byte	0x2f8d
+	.4byte	0x2fa3
 	.uleb128 0x12
 	.string	"val"
 	.byte	0x47
@@ -7169,15 +7179,15 @@ spi_id_buffer.16929:
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF805
+	.4byte	.LASF807
 	.byte	0x47
 	.byte	0x17
-	.4byte	0x2f78
+	.4byte	0x2f8e
 	.uleb128 0xd
 	.byte	0x4
 	.byte	0x47
 	.byte	0x1a
-	.4byte	0x2fad
+	.4byte	0x2fc3
 	.uleb128 0x12
 	.string	"val"
 	.byte	0x47
@@ -7186,46 +7196,46 @@ spi_id_buffer.16929:
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF806
+	.4byte	.LASF808
 	.byte	0x47
 	.byte	0x1c
-	.4byte	0x2f98
+	.4byte	0x2fae
 	.uleb128 0xf
-	.4byte	.LASF807
+	.4byte	.LASF809
 	.byte	0x18
 	.byte	0x48
 	.byte	0x54
-	.4byte	0x2fe9
+	.4byte	0x2fff
 	.uleb128 0xe
-	.4byte	.LASF808
+	.4byte	.LASF810
 	.byte	0x48
 	.byte	0x55
 	.4byte	0x2d
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF347
+	.4byte	.LASF349
 	.byte	0x48
 	.byte	0x57
-	.4byte	0x2efe
+	.4byte	0x2f14
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF504
+	.4byte	.LASF506
 	.byte	0x48
 	.byte	0x5d
-	.4byte	0x3055
+	.4byte	0x306b
 	.byte	0x10
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF809
+	.4byte	.LASF811
 	.byte	0x60
 	.byte	0x48
 	.byte	0xbd
-	.4byte	0x3055
+	.4byte	0x306b
 	.uleb128 0x12
 	.string	"kn"
 	.byte	0x48
 	.byte	0xbf
-	.4byte	0x3114
+	.4byte	0x312a
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF63
@@ -7234,72 +7244,72 @@ spi_id_buffer.16929:
 	.4byte	0x6c
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF810
+	.4byte	.LASF812
 	.byte	0x48
 	.byte	0xc3
-	.4byte	0x2e6c
+	.4byte	0x2e82
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF811
+	.4byte	.LASF813
 	.byte	0x48
 	.byte	0xc4
 	.4byte	0x120
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF812
+	.4byte	.LASF814
 	.byte	0x48
 	.byte	0xc5
 	.4byte	0x120
 	.byte	0x2c
 	.uleb128 0xe
-	.4byte	.LASF813
+	.4byte	.LASF815
 	.byte	0x48
 	.byte	0xc6
-	.4byte	0x33dc
+	.4byte	0x33f2
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF814
+	.4byte	.LASF816
 	.byte	0x48
 	.byte	0xc9
 	.4byte	0x2f1
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF815
+	.4byte	.LASF817
 	.byte	0x48
 	.byte	0xcb
-	.4byte	0x1ebb
+	.4byte	0x1ed1
 	.byte	0x48
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2fe9
+	.4byte	0x2fff
 	.uleb128 0xf
-	.4byte	.LASF816
+	.4byte	.LASF818
 	.byte	0x8
 	.byte	0x48
 	.byte	0x60
-	.4byte	0x3074
+	.4byte	0x308a
 	.uleb128 0xe
-	.4byte	.LASF817
+	.4byte	.LASF819
 	.byte	0x48
 	.byte	0x61
-	.4byte	0x3114
+	.4byte	0x312a
 	.byte	0
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF818
+	.4byte	.LASF820
 	.byte	0x80
 	.byte	0x48
 	.byte	0x83
-	.4byte	0x3114
+	.4byte	0x312a
 	.uleb128 0xe
-	.4byte	.LASF502
+	.4byte	.LASF504
 	.byte	0x48
 	.byte	0x84
 	.4byte	0x2c6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF819
+	.4byte	.LASF821
 	.byte	0x48
 	.byte	0x85
 	.4byte	0x2c6
@@ -7308,7 +7318,7 @@ spi_id_buffer.16929:
 	.4byte	.LASF65
 	.byte	0x48
 	.byte	0x8f
-	.4byte	0x3114
+	.4byte	0x312a
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF62
@@ -7320,25 +7330,25 @@ spi_id_buffer.16929:
 	.string	"rb"
 	.byte	0x48
 	.byte	0x92
-	.4byte	0x2ec7
+	.4byte	0x2edd
 	.byte	0x18
 	.uleb128 0x12
 	.string	"ns"
 	.byte	0x48
 	.byte	0x94
-	.4byte	0x2a23
+	.4byte	0x2a39
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF820
+	.4byte	.LASF822
 	.byte	0x48
 	.byte	0x95
 	.4byte	0x6c
 	.byte	0x38
 	.uleb128 0x21
-	.4byte	0x3266
+	.4byte	0x327c
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF821
+	.4byte	.LASF823
 	.byte	0x48
 	.byte	0x9c
 	.4byte	0x45b
@@ -7347,7 +7357,7 @@ spi_id_buffer.16929:
 	.string	"id"
 	.byte	0x48
 	.byte	0x9e
-	.4byte	0x324a
+	.4byte	0x3260
 	.byte	0x68
 	.uleb128 0xe
 	.4byte	.LASF63
@@ -7356,129 +7366,129 @@ spi_id_buffer.16929:
 	.4byte	0xa9
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF822
+	.4byte	.LASF824
 	.byte	0x48
 	.byte	0xa0
 	.4byte	0x226
 	.byte	0x72
 	.uleb128 0xe
-	.4byte	.LASF823
+	.4byte	.LASF825
 	.byte	0x48
 	.byte	0xa1
-	.4byte	0x3295
+	.4byte	0x32ab
 	.byte	0x78
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3074
+	.4byte	0x308a
 	.uleb128 0xf
-	.4byte	.LASF824
+	.4byte	.LASF826
 	.byte	0x20
 	.byte	0x48
 	.byte	0x64
-	.4byte	0x3157
+	.4byte	0x316d
 	.uleb128 0x12
 	.string	"ops"
 	.byte	0x48
 	.byte	0x65
-	.4byte	0x3218
+	.4byte	0x322e
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF825
+	.4byte	.LASF827
 	.byte	0x48
 	.byte	0x66
-	.4byte	0x3223
+	.4byte	0x3239
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF826
+	.4byte	.LASF828
 	.byte	0x48
 	.byte	0x67
 	.4byte	0x26f
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF827
+	.4byte	.LASF829
 	.byte	0x48
 	.byte	0x68
-	.4byte	0x3114
+	.4byte	0x312a
 	.byte	0x18
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF828
+	.4byte	.LASF830
 	.byte	0x70
 	.byte	0x48
 	.byte	0xe2
-	.4byte	0x3213
+	.4byte	0x3229
 	.uleb128 0xe
-	.4byte	.LASF825
+	.4byte	.LASF827
 	.byte	0x48
 	.byte	0xe7
-	.4byte	0x34c0
+	.4byte	0x34d6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF829
+	.4byte	.LASF831
 	.byte	0x48
 	.byte	0xe8
-	.4byte	0x34d1
+	.4byte	0x34e7
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF830
+	.4byte	.LASF832
 	.byte	0x48
 	.byte	0xf5
-	.4byte	0x34eb
+	.4byte	0x3501
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF831
+	.4byte	.LASF833
 	.byte	0x48
 	.byte	0xf7
-	.4byte	0x350b
+	.4byte	0x3521
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF832
+	.4byte	.LASF834
 	.byte	0x48
 	.byte	0xf8
-	.4byte	0x352a
+	.4byte	0x3540
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF833
+	.4byte	.LASF835
 	.byte	0x48
 	.byte	0xf9
-	.4byte	0x3540
+	.4byte	0x3556
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF834
+	.4byte	.LASF836
 	.byte	0x48
 	.byte	0xfb
-	.4byte	0x3564
+	.4byte	0x357a
 	.byte	0x30
 	.uleb128 0x1d
-	.4byte	.LASF835
+	.4byte	.LASF837
 	.byte	0x48
 	.2byte	0x105
 	.4byte	0x27a
 	.byte	0x38
 	.uleb128 0x1d
-	.4byte	.LASF836
+	.4byte	.LASF838
 	.byte	0x48
 	.2byte	0x10c
 	.4byte	0x247
 	.byte	0x40
 	.uleb128 0x1d
-	.4byte	.LASF837
+	.4byte	.LASF839
 	.byte	0x48
 	.2byte	0x10d
-	.4byte	0x3564
+	.4byte	0x357a
 	.byte	0x48
 	.uleb128 0x1d
-	.4byte	.LASF482
+	.4byte	.LASF484
 	.byte	0x48
 	.2byte	0x110
-	.4byte	0x3589
+	.4byte	0x359f
 	.byte	0x50
 	.uleb128 0x1d
-	.4byte	.LASF838
+	.4byte	.LASF840
 	.byte	0x48
 	.2byte	0x113
-	.4byte	0x35ae
+	.4byte	0x35c4
 	.byte	0x58
 	.uleb128 0x1d
 	.4byte	.LASF68
@@ -7494,20 +7504,20 @@ spi_id_buffer.16929:
 	.byte	0x68
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x3157
+	.4byte	0x316d
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3213
+	.4byte	0x3229
 	.uleb128 0x1a
-	.4byte	.LASF839
+	.4byte	.LASF841
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x321e
+	.4byte	0x3234
 	.uleb128 0xd
 	.byte	0x8
 	.byte	0x48
 	.byte	0x6d
-	.4byte	0x324a
+	.4byte	0x3260
 	.uleb128 0x12
 	.string	"ino"
 	.byte	0x48
@@ -7515,20 +7525,20 @@ spi_id_buffer.16929:
 	.4byte	0x120
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF840
+	.4byte	.LASF842
 	.byte	0x48
 	.byte	0x75
 	.4byte	0x120
 	.byte	0x4
 	.byte	0
 	.uleb128 0x36
-	.4byte	.LASF944
+	.4byte	.LASF946
 	.byte	0x8
 	.byte	0x48
 	.byte	0x6c
-	.4byte	0x3266
+	.4byte	0x327c
 	.uleb128 0x20
-	.4byte	0x3229
+	.4byte	0x323f
 	.uleb128 0x1f
 	.string	"id"
 	.byte	0x48
@@ -7539,69 +7549,69 @@ spi_id_buffer.16929:
 	.byte	0x20
 	.byte	0x48
 	.byte	0x96
-	.4byte	0x3290
+	.4byte	0x32a6
 	.uleb128 0x1f
 	.string	"dir"
 	.byte	0x48
 	.byte	0x97
-	.4byte	0x2fb8
+	.4byte	0x2fce
 	.uleb128 0x23
-	.4byte	.LASF841
+	.4byte	.LASF843
 	.byte	0x48
 	.byte	0x98
-	.4byte	0x305b
+	.4byte	0x3071
 	.uleb128 0x23
-	.4byte	.LASF842
+	.4byte	.LASF844
 	.byte	0x48
 	.byte	0x99
-	.4byte	0x311a
+	.4byte	0x3130
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF843
+	.4byte	.LASF845
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3290
+	.4byte	0x32a6
 	.uleb128 0xf
-	.4byte	.LASF844
+	.4byte	.LASF846
 	.byte	0x50
 	.byte	0x48
 	.byte	0xab
-	.4byte	0x3320
+	.4byte	0x3336
 	.uleb128 0xe
-	.4byte	.LASF845
+	.4byte	.LASF847
 	.byte	0x48
 	.byte	0xac
-	.4byte	0x333f
+	.4byte	0x3355
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF846
+	.4byte	.LASF848
 	.byte	0x48
 	.byte	0xad
-	.4byte	0x3364
+	.4byte	0x337a
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF847
+	.4byte	.LASF849
 	.byte	0x48
 	.byte	0xaf
-	.4byte	0x3383
+	.4byte	0x3399
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF848
+	.4byte	.LASF850
 	.byte	0x48
 	.byte	0xb1
-	.4byte	0x3398
+	.4byte	0x33ae
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF849
+	.4byte	.LASF851
 	.byte	0x48
 	.byte	0xb2
-	.4byte	0x33b7
+	.4byte	0x33cd
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF850
+	.4byte	.LASF852
 	.byte	0x48
 	.byte	0xb4
-	.4byte	0x33d6
+	.4byte	0x33ec
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF68
@@ -7630,11 +7640,11 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x16
 	.4byte	0xbb
-	.4byte	0x3339
+	.4byte	0x334f
 	.uleb128 0x11
-	.4byte	0x3055
+	.4byte	0x306b
 	.uleb128 0x11
-	.4byte	0x3339
+	.4byte	0x334f
 	.uleb128 0x11
 	.4byte	0x1fa
 	.byte	0
@@ -7643,28 +7653,28 @@ spi_id_buffer.16929:
 	.4byte	0xbb
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3320
+	.4byte	0x3336
 	.uleb128 0x16
 	.4byte	0xbb
-	.4byte	0x3359
+	.4byte	0x336f
 	.uleb128 0x11
-	.4byte	0x3359
+	.4byte	0x336f
 	.uleb128 0x11
-	.4byte	0x3055
+	.4byte	0x306b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x335f
+	.4byte	0x3375
 	.uleb128 0x1a
-	.4byte	.LASF851
+	.4byte	.LASF853
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3345
+	.4byte	0x335b
 	.uleb128 0x16
 	.4byte	0xbb
-	.4byte	0x3383
+	.4byte	0x3399
 	.uleb128 0x11
-	.4byte	0x3114
+	.4byte	0x312a
 	.uleb128 0x11
 	.4byte	0x55
 	.uleb128 0x11
@@ -7672,113 +7682,113 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x336a
+	.4byte	0x3380
 	.uleb128 0x16
 	.4byte	0xbb
-	.4byte	0x3398
+	.4byte	0x33ae
 	.uleb128 0x11
-	.4byte	0x3114
+	.4byte	0x312a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3389
+	.4byte	0x339f
 	.uleb128 0x16
 	.4byte	0xbb
-	.4byte	0x33b7
+	.4byte	0x33cd
 	.uleb128 0x11
-	.4byte	0x3114
+	.4byte	0x312a
 	.uleb128 0x11
-	.4byte	0x3114
+	.4byte	0x312a
 	.uleb128 0x11
 	.4byte	0x55
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x339e
+	.4byte	0x33b4
 	.uleb128 0x16
 	.4byte	0xbb
-	.4byte	0x33d6
+	.4byte	0x33ec
 	.uleb128 0x11
-	.4byte	0x3359
+	.4byte	0x336f
 	.uleb128 0x11
-	.4byte	0x3114
+	.4byte	0x312a
 	.uleb128 0x11
-	.4byte	0x3055
+	.4byte	0x306b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x33bd
+	.4byte	0x33d3
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x329b
+	.4byte	0x32b1
 	.uleb128 0xf
-	.4byte	.LASF852
+	.4byte	.LASF854
 	.byte	0x98
 	.byte	0x48
 	.byte	0xce
-	.4byte	0x3490
+	.4byte	0x34a6
 	.uleb128 0x12
 	.string	"kn"
 	.byte	0x48
 	.byte	0xd0
-	.4byte	0x3114
+	.4byte	0x312a
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF853
+	.4byte	.LASF855
 	.byte	0x48
 	.byte	0xd1
-	.4byte	0x3495
+	.4byte	0x34ab
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF851
+	.4byte	.LASF853
 	.byte	0x48
 	.byte	0xd2
-	.4byte	0x3359
+	.4byte	0x336f
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF821
+	.4byte	.LASF823
 	.byte	0x48
 	.byte	0xd3
 	.4byte	0x45b
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF277
+	.4byte	.LASF279
 	.byte	0x48
 	.byte	0xd6
-	.4byte	0xfe8
+	.4byte	0xffe
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF854
+	.4byte	.LASF856
 	.byte	0x48
 	.byte	0xd7
-	.4byte	0xfe8
+	.4byte	0xffe
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF855
+	.4byte	.LASF857
 	.byte	0x48
 	.byte	0xd8
 	.4byte	0xbb
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF856
+	.4byte	.LASF858
 	.byte	0x48
 	.byte	0xd9
 	.4byte	0x2f1
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF857
+	.4byte	.LASF859
 	.byte	0x48
 	.byte	0xda
 	.4byte	0x1fa
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF835
+	.4byte	.LASF837
 	.byte	0x48
 	.byte	0xdc
 	.4byte	0x27a
 	.byte	0x80
 	.uleb128 0x37
-	.4byte	.LASF858
+	.4byte	.LASF860
 	.byte	0x48
 	.byte	0xdd
 	.4byte	0x247
@@ -7787,7 +7797,7 @@ spi_id_buffer.16929:
 	.byte	0x7
 	.byte	0x88
 	.uleb128 0x37
-	.4byte	.LASF859
+	.4byte	.LASF861
 	.byte	0x48
 	.byte	0xde
 	.4byte	0x247
@@ -7796,97 +7806,97 @@ spi_id_buffer.16929:
 	.byte	0x6
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF860
+	.4byte	.LASF862
 	.byte	0x48
 	.byte	0xdf
-	.4byte	0x34a5
+	.4byte	0x34bb
 	.byte	0x90
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF853
+	.4byte	.LASF855
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3490
+	.4byte	0x34a6
 	.uleb128 0x1a
-	.4byte	.LASF861
+	.4byte	.LASF863
 	.uleb128 0x3
-	.4byte	0x349b
+	.4byte	0x34b1
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x34a0
+	.4byte	0x34b6
 	.uleb128 0x16
 	.4byte	0xbb
-	.4byte	0x34ba
+	.4byte	0x34d0
 	.uleb128 0x11
-	.4byte	0x34ba
+	.4byte	0x34d0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x33e2
+	.4byte	0x33f8
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x34ab
+	.4byte	0x34c1
 	.uleb128 0x10
-	.4byte	0x34d1
+	.4byte	0x34e7
 	.uleb128 0x11
-	.4byte	0x34ba
+	.4byte	0x34d0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x34c6
+	.4byte	0x34dc
 	.uleb128 0x16
 	.4byte	0xbb
-	.4byte	0x34eb
+	.4byte	0x3501
 	.uleb128 0x11
-	.4byte	0x3359
+	.4byte	0x336f
 	.uleb128 0x11
 	.4byte	0x45b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x34d7
+	.4byte	0x34ed
 	.uleb128 0x16
 	.4byte	0x45b
-	.4byte	0x3505
+	.4byte	0x351b
 	.uleb128 0x11
-	.4byte	0x3359
+	.4byte	0x336f
 	.uleb128 0x11
-	.4byte	0x3505
+	.4byte	0x351b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x26f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x34f1
+	.4byte	0x3507
 	.uleb128 0x16
 	.4byte	0x45b
-	.4byte	0x352a
+	.4byte	0x3540
 	.uleb128 0x11
-	.4byte	0x3359
+	.4byte	0x336f
 	.uleb128 0x11
 	.4byte	0x45b
 	.uleb128 0x11
-	.4byte	0x3505
+	.4byte	0x351b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3511
+	.4byte	0x3527
 	.uleb128 0x10
-	.4byte	0x3540
+	.4byte	0x3556
 	.uleb128 0x11
-	.4byte	0x3359
+	.4byte	0x336f
 	.uleb128 0x11
 	.4byte	0x45b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3530
+	.4byte	0x3546
 	.uleb128 0x16
 	.4byte	0x285
-	.4byte	0x3564
+	.4byte	0x357a
 	.uleb128 0x11
-	.4byte	0x34ba
+	.4byte	0x34d0
 	.uleb128 0x11
 	.4byte	0x1fa
 	.uleb128 0x11
@@ -7896,164 +7906,164 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3546
+	.4byte	0x355c
 	.uleb128 0x16
 	.4byte	0x205
-	.4byte	0x357e
+	.4byte	0x3594
 	.uleb128 0x11
-	.4byte	0x34ba
+	.4byte	0x34d0
 	.uleb128 0x11
-	.4byte	0x357e
+	.4byte	0x3594
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3584
+	.4byte	0x359a
 	.uleb128 0x1a
-	.4byte	.LASF862
+	.4byte	.LASF864
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x356a
+	.4byte	0x3580
 	.uleb128 0x16
 	.4byte	0xbb
-	.4byte	0x35a3
+	.4byte	0x35b9
 	.uleb128 0x11
-	.4byte	0x34ba
+	.4byte	0x34d0
 	.uleb128 0x11
-	.4byte	0x35a3
+	.4byte	0x35b9
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x35a9
+	.4byte	0x35bf
 	.uleb128 0x1a
-	.4byte	.LASF863
+	.4byte	.LASF865
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x358f
+	.4byte	0x35a5
 	.uleb128 0x25
-	.4byte	.LASF864
+	.4byte	.LASF866
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x49
 	.byte	0x1a
-	.4byte	0x35d7
+	.4byte	0x35ed
 	.uleb128 0xc
-	.4byte	.LASF865
+	.4byte	.LASF867
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF866
+	.4byte	.LASF868
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF867
+	.4byte	.LASF869
 	.byte	0x2
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF868
+	.4byte	.LASF870
 	.byte	0x30
 	.byte	0x49
 	.byte	0x27
-	.4byte	0x362c
+	.4byte	0x3642
 	.uleb128 0xe
 	.4byte	.LASF150
 	.byte	0x49
 	.byte	0x28
-	.4byte	0x35b4
+	.4byte	0x35ca
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF869
+	.4byte	.LASF871
 	.byte	0x49
 	.byte	0x29
-	.4byte	0x3636
+	.4byte	0x364c
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF870
+	.4byte	.LASF872
 	.byte	0x49
 	.byte	0x2a
-	.4byte	0x3641
+	.4byte	0x3657
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF871
+	.4byte	.LASF873
 	.byte	0x49
 	.byte	0x2b
-	.4byte	0x3661
+	.4byte	0x3677
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF872
+	.4byte	.LASF874
 	.byte	0x49
 	.byte	0x2c
-	.4byte	0x366c
+	.4byte	0x3682
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF873
+	.4byte	.LASF875
 	.byte	0x49
 	.byte	0x2d
-	.4byte	0x289c
+	.4byte	0x28b2
 	.byte	0x28
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x35d7
+	.4byte	0x35ed
 	.uleb128 0x33
 	.4byte	0x247
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3631
+	.4byte	0x3647
 	.uleb128 0x33
 	.4byte	0x45b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x363c
+	.4byte	0x3652
 	.uleb128 0x16
-	.4byte	0x2a23
-	.4byte	0x3656
+	.4byte	0x2a39
+	.4byte	0x366c
 	.uleb128 0x11
-	.4byte	0x3656
+	.4byte	0x366c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x365c
+	.4byte	0x3672
 	.uleb128 0x1a
-	.4byte	.LASF874
+	.4byte	.LASF876
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3647
+	.4byte	0x365d
 	.uleb128 0x33
-	.4byte	0x2a23
+	.4byte	0x2a39
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3667
+	.4byte	0x367d
 	.uleb128 0x8
-	.4byte	.LASF875
+	.4byte	.LASF877
 	.byte	0x24
 	.byte	0x8
 	.4byte	0x115
 	.uleb128 0x25
-	.4byte	.LASF876
+	.4byte	.LASF878
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x4a
 	.byte	0x8
-	.4byte	0x36ac
+	.4byte	0x36c2
 	.uleb128 0xc
-	.4byte	.LASF877
+	.4byte	.LASF879
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF878
+	.4byte	.LASF880
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF879
+	.4byte	.LASF881
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF880
+	.4byte	.LASF882
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF881
+	.4byte	.LASF883
 	.byte	0x4
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF882
+	.4byte	.LASF884
 	.byte	0x10
 	.byte	0x4a
 	.byte	0x35
-	.4byte	0x36cf
+	.4byte	0x36e5
 	.uleb128 0x12
 	.string	"nr"
 	.byte	0x4a
@@ -8064,43 +8074,43 @@ spi_id_buffer.16929:
 	.string	"ns"
 	.byte	0x4a
 	.byte	0x37
-	.4byte	0x36d4
+	.4byte	0x36ea
 	.byte	0x8
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF883
+	.4byte	.LASF885
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x36cf
+	.4byte	0x36e5
 	.uleb128 0x35
 	.string	"pid"
 	.byte	0x60
 	.byte	0x4a
 	.byte	0x3a
-	.4byte	0x372f
+	.4byte	0x3745
 	.uleb128 0xe
-	.4byte	.LASF502
+	.4byte	.LASF504
 	.byte	0x4a
 	.byte	0x3c
 	.4byte	0x2c6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF884
+	.4byte	.LASF886
 	.byte	0x4a
 	.byte	0x3d
 	.4byte	0x6c
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF319
+	.4byte	.LASF321
 	.byte	0x4a
 	.byte	0x3f
-	.4byte	0x372f
+	.4byte	0x3745
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF885
+	.4byte	.LASF887
 	.byte	0x4a
 	.byte	0x41
-	.4byte	0x1ebb
+	.4byte	0x1ed1
 	.byte	0x28
 	.uleb128 0x12
 	.string	"rcu"
@@ -8109,183 +8119,183 @@ spi_id_buffer.16929:
 	.4byte	0x366
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF886
+	.4byte	.LASF888
 	.byte	0x4a
 	.byte	0x43
-	.4byte	0x373f
+	.4byte	0x3755
 	.byte	0x50
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x31c
-	.4byte	0x373f
+	.4byte	0x3755
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x3
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x36ac
-	.4byte	0x374f
+	.4byte	0x36c2
+	.4byte	0x3765
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0
 	.byte	0
 	.uleb128 0x13
-	.4byte	.LASF887
+	.4byte	.LASF889
 	.byte	0x4a
 	.byte	0x46
-	.4byte	0x36da
+	.4byte	0x36f0
 	.uleb128 0x13
-	.4byte	.LASF888
+	.4byte	.LASF890
 	.byte	0x4a
 	.byte	0x48
 	.4byte	0x5d4
 	.uleb128 0x13
-	.4byte	.LASF889
+	.4byte	.LASF891
 	.byte	0x4a
 	.byte	0x62
-	.4byte	0x36cf
+	.4byte	0x36e5
 	.uleb128 0xf
-	.4byte	.LASF890
+	.4byte	.LASF892
 	.byte	0x4
 	.byte	0x4b
 	.byte	0x13
-	.4byte	0x3789
+	.4byte	0x379f
 	.uleb128 0xe
-	.4byte	.LASF891
+	.4byte	.LASF893
 	.byte	0x4b
 	.byte	0x14
 	.4byte	0x2c6
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF892
+	.4byte	.LASF894
 	.byte	0x4b
 	.byte	0x15
-	.4byte	0x3770
+	.4byte	0x3786
 	.uleb128 0xf
-	.4byte	.LASF893
+	.4byte	.LASF895
 	.byte	0x28
 	.byte	0x4c
 	.byte	0x55
-	.4byte	0x37c5
+	.4byte	0x37db
 	.uleb128 0xe
-	.4byte	.LASF295
+	.4byte	.LASF297
 	.byte	0x4c
 	.byte	0x56
 	.4byte	0xbb
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF894
+	.4byte	.LASF896
 	.byte	0x4c
 	.byte	0x57
 	.4byte	0x2f1
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF895
+	.4byte	.LASF897
 	.byte	0x4c
 	.byte	0x58
 	.4byte	0x2f1
 	.byte	0x18
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF896
+	.4byte	.LASF898
 	.byte	0x20
 	.byte	0x4d
 	.byte	0x9
-	.4byte	0x37ea
+	.4byte	0x3800
 	.uleb128 0xe
-	.4byte	.LASF897
+	.4byte	.LASF899
 	.byte	0x4d
 	.byte	0xa
-	.4byte	0x2ec7
+	.4byte	0x2edd
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF475
+	.4byte	.LASF477
 	.byte	0x4d
 	.byte	0xb
-	.4byte	0x2aa2
+	.4byte	0x2ab8
 	.byte	0x18
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF898
+	.4byte	.LASF900
 	.byte	0x10
 	.byte	0x4d
 	.byte	0xe
-	.4byte	0x380f
+	.4byte	0x3825
 	.uleb128 0xe
 	.4byte	.LASF101
 	.byte	0x4d
 	.byte	0xf
-	.4byte	0x2efe
+	.4byte	0x2f14
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF51
 	.byte	0x4d
 	.byte	0x10
-	.4byte	0x380f
+	.4byte	0x3825
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x37c5
+	.4byte	0x37db
 	.uleb128 0x25
-	.4byte	.LASF899
+	.4byte	.LASF901
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x3d
 	.byte	0xbe
-	.4byte	0x3832
+	.4byte	0x3848
 	.uleb128 0xc
-	.4byte	.LASF900
+	.4byte	.LASF902
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF901
+	.4byte	.LASF903
 	.byte	0x1
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF902
+	.4byte	.LASF904
 	.byte	0x48
 	.byte	0x4e
 	.byte	0x6f
-	.4byte	0x389f
+	.4byte	0x38b5
 	.uleb128 0xe
-	.4byte	.LASF897
+	.4byte	.LASF899
 	.byte	0x4e
 	.byte	0x70
-	.4byte	0x37c5
+	.4byte	0x37db
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF903
+	.4byte	.LASF905
 	.byte	0x4e
 	.byte	0x71
-	.4byte	0x2aa2
+	.4byte	0x2ab8
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF735
+	.4byte	.LASF737
 	.byte	0x4e
 	.byte	0x72
-	.4byte	0x38b4
+	.4byte	0x38ca
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF904
+	.4byte	.LASF906
 	.byte	0x4e
 	.byte	0x73
-	.4byte	0x3927
+	.4byte	0x393d
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF283
+	.4byte	.LASF285
 	.byte	0x4e
 	.byte	0x74
 	.4byte	0x100
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF905
+	.4byte	.LASF907
 	.byte	0x4e
 	.byte	0x75
 	.4byte	0x100
 	.byte	0x39
 	.uleb128 0xe
-	.4byte	.LASF906
+	.4byte	.LASF908
 	.byte	0x4e
 	.byte	0x76
 	.4byte	0x100
@@ -8298,37 +8308,37 @@ spi_id_buffer.16929:
 	.byte	0x40
 	.byte	0
 	.uleb128 0x16
-	.4byte	0x3815
-	.4byte	0x38ae
+	.4byte	0x382b
+	.4byte	0x38c4
 	.uleb128 0x11
-	.4byte	0x38ae
+	.4byte	0x38c4
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3832
+	.4byte	0x3848
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x389f
+	.4byte	0x38b5
 	.uleb128 0xf
-	.4byte	.LASF907
+	.4byte	.LASF909
 	.byte	0x40
 	.byte	0x4e
 	.byte	0x99
-	.4byte	0x3927
+	.4byte	0x393d
 	.uleb128 0xe
-	.4byte	.LASF908
+	.4byte	.LASF910
 	.byte	0x4e
 	.byte	0x9a
-	.4byte	0x3a13
+	.4byte	0x3a29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF909
+	.4byte	.LASF911
 	.byte	0x4e
 	.byte	0x9b
 	.4byte	0x6c
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF474
+	.4byte	.LASF476
 	.byte	0x4e
 	.byte	0x9c
 	.4byte	0x23c
@@ -8337,42 +8347,42 @@ spi_id_buffer.16929:
 	.string	"seq"
 	.byte	0x4e
 	.byte	0x9d
-	.4byte	0x1edf
+	.4byte	0x1ef5
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF910
+	.4byte	.LASF912
 	.byte	0x4e
 	.byte	0x9e
-	.4byte	0x38ae
+	.4byte	0x38c4
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF819
+	.4byte	.LASF821
 	.byte	0x4e
 	.byte	0x9f
-	.4byte	0x37ea
+	.4byte	0x3800
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF911
+	.4byte	.LASF913
 	.byte	0x4e
 	.byte	0xa0
-	.4byte	0x3a1e
+	.4byte	0x3a34
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF501
+	.4byte	.LASF503
 	.byte	0x4e
 	.byte	0xa1
-	.4byte	0x2aa2
+	.4byte	0x2ab8
 	.byte	0x38
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x38ba
+	.4byte	0x38d0
 	.uleb128 0x26
-	.4byte	.LASF912
+	.4byte	.LASF914
 	.2byte	0x240
 	.byte	0x4e
 	.byte	0xcc
-	.4byte	0x3a13
+	.4byte	0x3a29
 	.uleb128 0xe
 	.4byte	.LASF100
 	.byte	0x4e
@@ -8386,19 +8396,19 @@ spi_id_buffer.16929:
 	.4byte	0x6c
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF913
+	.4byte	.LASF915
 	.byte	0x4e
 	.byte	0xcf
 	.4byte	0x6c
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF914
+	.4byte	.LASF916
 	.byte	0x4e
 	.byte	0xd0
 	.4byte	0x6c
 	.byte	0xc
 	.uleb128 0x37
-	.4byte	.LASF915
+	.4byte	.LASF917
 	.byte	0x4e
 	.byte	0xd1
 	.4byte	0x6c
@@ -8407,7 +8417,7 @@ spi_id_buffer.16929:
 	.byte	0x1f
 	.byte	0x10
 	.uleb128 0x37
-	.4byte	.LASF916
+	.4byte	.LASF918
 	.byte	0x4e
 	.byte	0xd2
 	.4byte	0x6c
@@ -8416,7 +8426,7 @@ spi_id_buffer.16929:
 	.byte	0x1e
 	.byte	0x10
 	.uleb128 0x37
-	.4byte	.LASF917
+	.4byte	.LASF919
 	.byte	0x4e
 	.byte	0xd3
 	.4byte	0x6c
@@ -8425,7 +8435,7 @@ spi_id_buffer.16929:
 	.byte	0x1d
 	.byte	0x10
 	.uleb128 0x37
-	.4byte	.LASF918
+	.4byte	.LASF920
 	.byte	0x4e
 	.byte	0xd4
 	.4byte	0x6c
@@ -8434,151 +8444,151 @@ spi_id_buffer.16929:
 	.byte	0x1c
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF919
+	.4byte	.LASF921
 	.byte	0x4e
 	.byte	0xd6
 	.4byte	0x6c
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF920
+	.4byte	.LASF922
 	.byte	0x4e
 	.byte	0xd7
 	.4byte	0xa9
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF921
+	.4byte	.LASF923
 	.byte	0x4e
 	.byte	0xd8
 	.4byte	0xa9
 	.byte	0x1a
 	.uleb128 0xe
-	.4byte	.LASF922
+	.4byte	.LASF924
 	.byte	0x4e
 	.byte	0xd9
 	.4byte	0x6c
 	.byte	0x1c
 	.uleb128 0xe
-	.4byte	.LASF923
+	.4byte	.LASF925
 	.byte	0x4e
 	.byte	0xdb
-	.4byte	0x2aa2
+	.4byte	0x2ab8
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF924
+	.4byte	.LASF926
 	.byte	0x4e
 	.byte	0xdc
-	.4byte	0x38ae
+	.4byte	0x38c4
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF925
+	.4byte	.LASF927
 	.byte	0x4e
 	.byte	0xdd
-	.4byte	0x2aa2
+	.4byte	0x2ab8
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF926
+	.4byte	.LASF928
 	.byte	0x4e
 	.byte	0xde
-	.4byte	0x38ae
+	.4byte	0x38c4
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF927
+	.4byte	.LASF929
 	.byte	0x4e
 	.byte	0xdf
-	.4byte	0x3a6b
+	.4byte	0x3a81
 	.byte	0x40
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x392d
+	.4byte	0x3943
 	.uleb128 0x33
-	.4byte	0x2aa2
+	.4byte	0x2ab8
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3a19
+	.4byte	0x3a2f
 	.uleb128 0x25
-	.4byte	.LASF928
+	.4byte	.LASF930
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x4e
 	.byte	0xa4
-	.4byte	0x3a6b
+	.4byte	0x3a81
 	.uleb128 0xc
-	.4byte	.LASF929
+	.4byte	.LASF931
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF930
+	.4byte	.LASF932
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF931
+	.4byte	.LASF933
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF932
+	.4byte	.LASF934
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF933
+	.4byte	.LASF935
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF934
+	.4byte	.LASF936
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF935
+	.4byte	.LASF937
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF936
+	.4byte	.LASF938
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF937
+	.4byte	.LASF939
 	.byte	0x8
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x38ba
-	.4byte	0x3a7b
+	.4byte	0x38d0
+	.4byte	0x3a91
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x7
 	.byte	0
 	.uleb128 0x17
-	.4byte	.LASF938
+	.4byte	.LASF940
 	.byte	0x4e
 	.2byte	0x135
 	.4byte	0x6c
 	.uleb128 0x1a
-	.4byte	.LASF939
+	.4byte	.LASF941
 	.uleb128 0x17
-	.4byte	.LASF940
+	.4byte	.LASF942
 	.byte	0x4e
 	.2byte	0x15c
-	.4byte	0x3a87
+	.4byte	0x3a9d
 	.uleb128 0xf
-	.4byte	.LASF391
+	.4byte	.LASF393
 	.byte	0x10
 	.byte	0x4f
 	.byte	0x1c
-	.4byte	0x3abd
+	.4byte	0x3ad3
 	.uleb128 0xe
-	.4byte	.LASF822
+	.4byte	.LASF824
 	.byte	0x4f
 	.byte	0x1d
 	.4byte	0xbb
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF941
+	.4byte	.LASF943
 	.byte	0x4f
 	.byte	0x1e
-	.4byte	0x3ac2
+	.4byte	0x3ad8
 	.byte	0x8
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF942
+	.4byte	.LASF944
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3abd
+	.4byte	0x3ad3
 	.uleb128 0xd
 	.byte	0x8
 	.byte	0x50
 	.byte	0x5a
-	.4byte	0x3add
+	.4byte	0x3af3
 	.uleb128 0x12
 	.string	"sig"
 	.byte	0x50
@@ -8587,45 +8597,45 @@ spi_id_buffer.16929:
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF943
+	.4byte	.LASF945
 	.byte	0x50
 	.byte	0x5c
-	.4byte	0x3ac8
+	.4byte	0x3ade
 	.uleb128 0x36
-	.4byte	.LASF945
+	.4byte	.LASF947
 	.byte	0x8
 	.byte	0x51
 	.byte	0x8
-	.4byte	0x3b0b
+	.4byte	0x3b21
 	.uleb128 0x23
-	.4byte	.LASF946
+	.4byte	.LASF948
 	.byte	0x51
 	.byte	0x9
 	.4byte	0xbb
 	.uleb128 0x23
-	.4byte	.LASF947
+	.4byte	.LASF949
 	.byte	0x51
 	.byte	0xa
 	.4byte	0x45b
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF948
+	.4byte	.LASF950
 	.byte	0x51
 	.byte	0xb
-	.4byte	0x3ae8
+	.4byte	0x3afe
 	.uleb128 0xd
 	.byte	0x8
 	.byte	0x51
 	.byte	0x39
-	.4byte	0x3b37
+	.4byte	0x3b4d
 	.uleb128 0xe
-	.4byte	.LASF949
+	.4byte	.LASF951
 	.byte	0x51
 	.byte	0x3a
 	.4byte	0x18c
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF950
+	.4byte	.LASF952
 	.byte	0x51
 	.byte	0x3b
 	.4byte	0x197
@@ -8635,27 +8645,27 @@ spi_id_buffer.16929:
 	.byte	0x18
 	.byte	0x51
 	.byte	0x3f
-	.4byte	0x3b70
+	.4byte	0x3b86
 	.uleb128 0xe
-	.4byte	.LASF951
+	.4byte	.LASF953
 	.byte	0x51
 	.byte	0x40
 	.4byte	0x1e4
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF952
+	.4byte	.LASF954
 	.byte	0x51
 	.byte	0x41
 	.4byte	0xbb
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF953
+	.4byte	.LASF955
 	.byte	0x51
 	.byte	0x42
-	.4byte	0x3b0b
+	.4byte	0x3b21
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF954
+	.4byte	.LASF956
 	.byte	0x51
 	.byte	0x43
 	.4byte	0xbb
@@ -8665,57 +8675,57 @@ spi_id_buffer.16929:
 	.byte	0x10
 	.byte	0x51
 	.byte	0x47
-	.4byte	0x3b9d
+	.4byte	0x3bb3
 	.uleb128 0xe
-	.4byte	.LASF949
+	.4byte	.LASF951
 	.byte	0x51
 	.byte	0x48
 	.4byte	0x18c
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF950
+	.4byte	.LASF952
 	.byte	0x51
 	.byte	0x49
 	.4byte	0x197
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF953
+	.4byte	.LASF955
 	.byte	0x51
 	.byte	0x4a
-	.4byte	0x3b0b
+	.4byte	0x3b21
 	.byte	0x8
 	.byte	0
 	.uleb128 0xd
 	.byte	0x20
 	.byte	0x51
 	.byte	0x4e
-	.4byte	0x3be2
+	.4byte	0x3bf8
 	.uleb128 0xe
-	.4byte	.LASF949
+	.4byte	.LASF951
 	.byte	0x51
 	.byte	0x4f
 	.4byte	0x18c
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF950
+	.4byte	.LASF952
 	.byte	0x51
 	.byte	0x50
 	.4byte	0x197
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF955
+	.4byte	.LASF957
 	.byte	0x51
 	.byte	0x51
 	.4byte	0xbb
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF956
+	.4byte	.LASF958
 	.byte	0x51
 	.byte	0x52
 	.4byte	0x1d9
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF957
+	.4byte	.LASF959
 	.byte	0x51
 	.byte	0x53
 	.4byte	0x1d9
@@ -8725,21 +8735,21 @@ spi_id_buffer.16929:
 	.byte	0x18
 	.byte	0x51
 	.byte	0x6b
-	.4byte	0x3c0f
+	.4byte	0x3c25
 	.uleb128 0xe
-	.4byte	.LASF958
+	.4byte	.LASF960
 	.byte	0x51
 	.byte	0x6c
-	.4byte	0x3c0f
+	.4byte	0x3c25
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF959
+	.4byte	.LASF961
 	.byte	0x51
 	.byte	0x6d
 	.4byte	0x45b
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF960
+	.4byte	.LASF962
 	.byte	0x51
 	.byte	0x6e
 	.4byte	0x45b
@@ -8747,7 +8757,7 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x60
-	.4byte	0x3c1f
+	.4byte	0x3c35
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x7
@@ -8756,15 +8766,15 @@ spi_id_buffer.16929:
 	.byte	0xc
 	.byte	0x51
 	.byte	0x71
-	.4byte	0x3c40
+	.4byte	0x3c56
 	.uleb128 0xe
-	.4byte	.LASF961
+	.4byte	.LASF963
 	.byte	0x51
 	.byte	0x72
-	.4byte	0x3c0f
+	.4byte	0x3c25
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF962
+	.4byte	.LASF964
 	.byte	0x51
 	.byte	0x73
 	.4byte	0xc7
@@ -8774,45 +8784,45 @@ spi_id_buffer.16929:
 	.byte	0x18
 	.byte	0x51
 	.byte	0x64
-	.4byte	0x3c6a
+	.4byte	0x3c80
 	.uleb128 0x23
-	.4byte	.LASF963
+	.4byte	.LASF965
 	.byte	0x51
 	.byte	0x69
 	.4byte	0x97
 	.uleb128 0x23
-	.4byte	.LASF964
+	.4byte	.LASF966
 	.byte	0x51
 	.byte	0x6f
-	.4byte	0x3be2
+	.4byte	0x3bf8
 	.uleb128 0x23
-	.4byte	.LASF965
+	.4byte	.LASF967
 	.byte	0x51
 	.byte	0x74
-	.4byte	0x3c1f
+	.4byte	0x3c35
 	.byte	0
 	.uleb128 0xd
 	.byte	0x20
 	.byte	0x51
 	.byte	0x57
-	.4byte	0x3c85
+	.4byte	0x3c9b
 	.uleb128 0xe
-	.4byte	.LASF966
+	.4byte	.LASF968
 	.byte	0x51
 	.byte	0x58
 	.4byte	0x45b
 	.byte	0
 	.uleb128 0x21
-	.4byte	0x3c40
+	.4byte	0x3c56
 	.byte	0x8
 	.byte	0
 	.uleb128 0xd
 	.byte	0x10
 	.byte	0x51
 	.byte	0x79
-	.4byte	0x3ca6
+	.4byte	0x3cbc
 	.uleb128 0xe
-	.4byte	.LASF967
+	.4byte	.LASF969
 	.byte	0x51
 	.byte	0x7a
 	.4byte	0x175
@@ -8828,21 +8838,21 @@ spi_id_buffer.16929:
 	.byte	0x10
 	.byte	0x51
 	.byte	0x7f
-	.4byte	0x3cd3
+	.4byte	0x3ce9
 	.uleb128 0xe
-	.4byte	.LASF968
+	.4byte	.LASF970
 	.byte	0x51
 	.byte	0x80
 	.4byte	0x45b
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF969
+	.4byte	.LASF971
 	.byte	0x51
 	.byte	0x81
 	.4byte	0xbb
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF970
+	.4byte	.LASF972
 	.byte	0x51
 	.byte	0x82
 	.4byte	0x6c
@@ -8852,132 +8862,132 @@ spi_id_buffer.16929:
 	.byte	0x70
 	.byte	0x51
 	.byte	0x35
-	.4byte	0x3d34
+	.4byte	0x3d4a
 	.uleb128 0x23
-	.4byte	.LASF971
+	.4byte	.LASF973
 	.byte	0x51
 	.byte	0x36
-	.4byte	0x3d34
+	.4byte	0x3d4a
 	.uleb128 0x23
-	.4byte	.LASF972
+	.4byte	.LASF974
 	.byte	0x51
 	.byte	0x3c
-	.4byte	0x3b16
+	.4byte	0x3b2c
 	.uleb128 0x23
-	.4byte	.LASF973
+	.4byte	.LASF975
 	.byte	0x51
 	.byte	0x44
-	.4byte	0x3b37
+	.4byte	0x3b4d
 	.uleb128 0x1f
 	.string	"_rt"
 	.byte	0x51
 	.byte	0x4b
-	.4byte	0x3b70
+	.4byte	0x3b86
 	.uleb128 0x23
-	.4byte	.LASF974
+	.4byte	.LASF976
 	.byte	0x51
 	.byte	0x54
-	.4byte	0x3b9d
+	.4byte	0x3bb3
 	.uleb128 0x23
-	.4byte	.LASF975
+	.4byte	.LASF977
 	.byte	0x51
 	.byte	0x76
-	.4byte	0x3c6a
+	.4byte	0x3c80
 	.uleb128 0x23
-	.4byte	.LASF976
+	.4byte	.LASF978
 	.byte	0x51
 	.byte	0x7c
-	.4byte	0x3c85
+	.4byte	0x3c9b
 	.uleb128 0x23
-	.4byte	.LASF977
+	.4byte	.LASF979
 	.byte	0x51
 	.byte	0x83
-	.4byte	0x3ca6
+	.4byte	0x3cbc
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xbb
-	.4byte	0x3d44
+	.4byte	0x3d5a
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x1b
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF978
+	.4byte	.LASF980
 	.byte	0x80
 	.byte	0x51
 	.byte	0x2b
-	.4byte	0x3d81
+	.4byte	0x3d97
 	.uleb128 0xe
-	.4byte	.LASF979
+	.4byte	.LASF981
 	.byte	0x51
 	.byte	0x2c
 	.4byte	0xbb
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF980
+	.4byte	.LASF982
 	.byte	0x51
 	.byte	0x2e
 	.4byte	0xbb
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF981
+	.4byte	.LASF983
 	.byte	0x51
 	.byte	0x2f
 	.4byte	0xbb
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF982
+	.4byte	.LASF984
 	.byte	0x51
 	.byte	0x84
-	.4byte	0x3cd3
+	.4byte	0x3ce9
 	.byte	0x10
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF983
+	.4byte	.LASF985
 	.byte	0x51
 	.byte	0x85
-	.4byte	0x3d44
+	.4byte	0x3d5a
 	.uleb128 0xf
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0x18
 	.byte	0x52
 	.byte	0x1a
-	.4byte	0x3db1
+	.4byte	0x3dc7
 	.uleb128 0xe
-	.4byte	.LASF856
+	.4byte	.LASF858
 	.byte	0x52
 	.byte	0x1b
 	.4byte	0x2f1
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF381
+	.4byte	.LASF383
 	.byte	0x52
 	.byte	0x1c
-	.4byte	0x3add
+	.4byte	0x3af3
 	.byte	0x10
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF323
+	.4byte	.LASF325
 	.byte	0x28
 	.byte	0x53
 	.byte	0x22
-	.4byte	0x3dd6
+	.4byte	0x3dec
 	.uleb128 0xe
-	.4byte	.LASF985
+	.4byte	.LASF987
 	.byte	0x53
 	.byte	0x23
 	.4byte	0x136
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF986
+	.4byte	.LASF988
 	.byte	0x53
 	.byte	0x24
-	.4byte	0x3dd6
+	.4byte	0x3dec
 	.byte	0x8
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x35a3
-	.4byte	0x3de6
+	.4byte	0x35b9
+	.4byte	0x3dfc
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x3
@@ -8987,161 +8997,161 @@ spi_id_buffer.16929:
 	.4byte	0x6c
 	.byte	0x53
 	.byte	0x27
-	.4byte	0x3e17
+	.4byte	0x3e2d
 	.uleb128 0xc
-	.4byte	.LASF987
+	.4byte	.LASF989
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF988
+	.4byte	.LASF990
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF989
+	.4byte	.LASF991
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF990
+	.4byte	.LASF992
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF991
+	.4byte	.LASF993
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF992
+	.4byte	.LASF994
 	.byte	0x5
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF993
+	.4byte	.LASF995
 	.byte	0x18
 	.byte	0x53
 	.byte	0x33
-	.4byte	0x3e3c
+	.4byte	0x3e52
 	.uleb128 0xe
-	.4byte	.LASF994
+	.4byte	.LASF996
 	.byte	0x53
 	.byte	0x34
 	.4byte	0xbb
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF502
+	.4byte	.LASF504
 	.byte	0x53
 	.byte	0x35
-	.4byte	0x3e3c
+	.4byte	0x3e52
 	.byte	0x4
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xbb
-	.4byte	0x3e4c
+	.4byte	0x3e62
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x4
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF995
+	.4byte	.LASF997
 	.byte	0x10
 	.byte	0x53
 	.byte	0x3d
-	.4byte	0x3e7d
+	.4byte	0x3e93
 	.uleb128 0xe
-	.4byte	.LASF539
+	.4byte	.LASF541
 	.byte	0x53
 	.byte	0x3e
-	.4byte	0x1fdd
+	.4byte	0x1ff3
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF501
+	.4byte	.LASF503
 	.byte	0x53
 	.byte	0x40
 	.4byte	0xc7
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF826
+	.4byte	.LASF828
 	.byte	0x53
 	.byte	0x41
 	.4byte	0xc7
 	.byte	0xc
 	.byte	0
 	.uleb128 0x38
-	.4byte	.LASF997
+	.4byte	.LASF999
 	.byte	0
 	.byte	0x53
 	.byte	0x49
 	.uleb128 0xf
-	.4byte	.LASF998
+	.4byte	.LASF1000
 	.byte	0x40
 	.byte	0x54
 	.byte	0xc
-	.4byte	0x3ef2
+	.4byte	0x3f08
 	.uleb128 0xe
-	.4byte	.LASF999
+	.4byte	.LASF1001
 	.byte	0x54
 	.byte	0xf
 	.4byte	0x136
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1000
+	.4byte	.LASF1002
 	.byte	0x54
 	.byte	0x11
 	.4byte	0x136
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1001
+	.4byte	.LASF1003
 	.byte	0x54
 	.byte	0x13
 	.4byte	0x136
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1002
+	.4byte	.LASF1004
 	.byte	0x54
 	.byte	0x15
 	.4byte	0x136
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1003
+	.4byte	.LASF1005
 	.byte	0x54
 	.byte	0x17
 	.4byte	0x136
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1004
+	.4byte	.LASF1006
 	.byte	0x54
 	.byte	0x1f
 	.4byte	0x136
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1005
+	.4byte	.LASF1007
 	.byte	0x54
 	.byte	0x25
 	.4byte	0x136
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1006
+	.4byte	.LASF1008
 	.byte	0x54
 	.byte	0x2e
 	.4byte	0x136
 	.byte	0x38
 	.byte	0
 	.uleb128 0x25
-	.4byte	.LASF1007
+	.4byte	.LASF1009
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x55
 	.byte	0x19
-	.4byte	0x3f15
+	.4byte	0x3f2b
 	.uleb128 0xc
-	.4byte	.LASF1008
+	.4byte	.LASF1010
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1009
+	.4byte	.LASF1011
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1010
+	.4byte	.LASF1012
 	.byte	0x2
 	.byte	0
 	.uleb128 0x1e
 	.byte	0x8
 	.byte	0x55
 	.byte	0x6d
-	.4byte	0x3f34
+	.4byte	0x3f4a
 	.uleb128 0x23
-	.4byte	.LASF1011
+	.4byte	.LASF1013
 	.byte	0x55
 	.byte	0x6e
 	.4byte	0xe4
@@ -9152,28 +9162,28 @@ spi_id_buffer.16929:
 	.4byte	0xe4
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF426
+	.4byte	.LASF428
 	.byte	0x20
 	.byte	0x55
 	.byte	0x3e
-	.4byte	0x3f71
+	.4byte	0x3f87
 	.uleb128 0xe
-	.4byte	.LASF1012
+	.4byte	.LASF1014
 	.byte	0x55
 	.byte	0x4b
 	.4byte	0xc7
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1013
+	.4byte	.LASF1015
 	.byte	0x55
 	.byte	0x5a
 	.4byte	0xc7
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1014
+	.4byte	.LASF1016
 	.byte	0x55
 	.byte	0x7c
-	.4byte	0x3f15
+	.4byte	0x3f2b
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF63
@@ -9183,19 +9193,19 @@ spi_id_buffer.16929:
 	.byte	0x10
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF363
+	.4byte	.LASF365
 	.byte	0x18
 	.byte	0x21
 	.byte	0xed
-	.4byte	0x3fa2
+	.4byte	0x3fb8
 	.uleb128 0xe
-	.4byte	.LASF358
+	.4byte	.LASF360
 	.byte	0x21
 	.byte	0xef
 	.4byte	0x136
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF359
+	.4byte	.LASF361
 	.byte	0x21
 	.byte	0xf0
 	.4byte	0x136
@@ -9208,403 +9218,403 @@ spi_id_buffer.16929:
 	.byte	0x10
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF1015
+	.4byte	.LASF1017
 	.byte	0x18
 	.byte	0x21
 	.byte	0xff
-	.4byte	0x3fd6
+	.4byte	0x3fec
 	.uleb128 0x1d
-	.4byte	.LASF358
+	.4byte	.LASF360
 	.byte	0x21
 	.2byte	0x100
 	.4byte	0x136
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF359
+	.4byte	.LASF361
 	.byte	0x21
 	.2byte	0x101
 	.4byte	0x136
 	.byte	0x8
 	.uleb128 0x1d
-	.4byte	.LASF1016
+	.4byte	.LASF1018
 	.byte	0x21
 	.2byte	0x102
 	.4byte	0xef
 	.byte	0x10
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF318
+	.4byte	.LASF320
 	.byte	0x20
 	.byte	0x21
 	.2byte	0x128
-	.4byte	0x4018
+	.4byte	0x402e
 	.uleb128 0x1d
-	.4byte	.LASF1017
+	.4byte	.LASF1019
 	.byte	0x21
 	.2byte	0x12d
 	.4byte	0x2d
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1018
+	.4byte	.LASF1020
 	.byte	0x21
 	.2byte	0x130
 	.4byte	0xef
 	.byte	0x8
 	.uleb128 0x1d
-	.4byte	.LASF1019
+	.4byte	.LASF1021
 	.byte	0x21
 	.2byte	0x135
 	.4byte	0xef
 	.byte	0x10
 	.uleb128 0x1d
-	.4byte	.LASF1020
+	.4byte	.LASF1022
 	.byte	0x21
 	.2byte	0x138
 	.4byte	0xef
 	.byte	0x18
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1021
+	.4byte	.LASF1023
 	.byte	0x10
 	.byte	0x21
 	.2byte	0x14b
-	.4byte	0x4040
+	.4byte	0x4056
 	.uleb128 0x1d
-	.4byte	.LASF1022
+	.4byte	.LASF1024
 	.byte	0x21
 	.2byte	0x14c
 	.4byte	0x2d
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1023
+	.4byte	.LASF1025
 	.byte	0x21
 	.2byte	0x14d
 	.4byte	0x120
 	.byte	0x8
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1024
+	.4byte	.LASF1026
 	.byte	0x8
 	.byte	0x21
 	.2byte	0x166
-	.4byte	0x4068
+	.4byte	0x407e
 	.uleb128 0x1d
-	.4byte	.LASF1025
+	.4byte	.LASF1027
 	.byte	0x21
 	.2byte	0x167
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1026
+	.4byte	.LASF1028
 	.byte	0x21
 	.2byte	0x168
 	.4byte	0x6c
 	.byte	0x4
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1027
+	.4byte	.LASF1029
 	.byte	0x40
 	.byte	0x21
 	.2byte	0x197
-	.4byte	0x40eb
+	.4byte	0x4101
 	.uleb128 0x1d
-	.4byte	.LASF1028
+	.4byte	.LASF1030
 	.byte	0x21
 	.2byte	0x198
 	.4byte	0x136
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1029
+	.4byte	.LASF1031
 	.byte	0x21
 	.2byte	0x199
 	.4byte	0x136
 	.byte	0x8
 	.uleb128 0x1d
-	.4byte	.LASF1030
+	.4byte	.LASF1032
 	.byte	0x21
 	.2byte	0x19a
 	.4byte	0x136
 	.byte	0x10
 	.uleb128 0x1d
-	.4byte	.LASF1031
+	.4byte	.LASF1033
 	.byte	0x21
 	.2byte	0x19b
 	.4byte	0x120
 	.byte	0x18
 	.uleb128 0x1d
-	.4byte	.LASF1032
+	.4byte	.LASF1034
 	.byte	0x21
 	.2byte	0x19c
 	.4byte	0x120
 	.byte	0x1c
 	.uleb128 0x1d
-	.4byte	.LASF1033
+	.4byte	.LASF1035
 	.byte	0x21
 	.2byte	0x19d
 	.4byte	0x2d
 	.byte	0x20
 	.uleb128 0x1d
-	.4byte	.LASF1034
+	.4byte	.LASF1036
 	.byte	0x21
 	.2byte	0x19e
 	.4byte	0x2d
 	.byte	0x28
 	.uleb128 0x1d
-	.4byte	.LASF1035
+	.4byte	.LASF1037
 	.byte	0x21
 	.2byte	0x19f
 	.4byte	0x2d
 	.byte	0x30
 	.uleb128 0x1d
-	.4byte	.LASF1024
+	.4byte	.LASF1026
 	.byte	0x21
 	.2byte	0x1a0
-	.4byte	0x4040
+	.4byte	0x4056
 	.byte	0x38
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1036
+	.4byte	.LASF1038
 	.byte	0xd8
 	.byte	0x21
 	.2byte	0x1a3
-	.4byte	0x4258
+	.4byte	0x426e
 	.uleb128 0x1d
-	.4byte	.LASF1037
+	.4byte	.LASF1039
 	.byte	0x21
 	.2byte	0x1a5
 	.4byte	0x136
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1038
+	.4byte	.LASF1040
 	.byte	0x21
 	.2byte	0x1a6
 	.4byte	0x136
 	.byte	0x8
 	.uleb128 0x1d
-	.4byte	.LASF1039
+	.4byte	.LASF1041
 	.byte	0x21
 	.2byte	0x1a7
 	.4byte	0x136
 	.byte	0x10
 	.uleb128 0x1d
-	.4byte	.LASF1040
+	.4byte	.LASF1042
 	.byte	0x21
 	.2byte	0x1a8
 	.4byte	0x136
 	.byte	0x18
 	.uleb128 0x1d
-	.4byte	.LASF1041
+	.4byte	.LASF1043
 	.byte	0x21
 	.2byte	0x1a9
 	.4byte	0x136
 	.byte	0x20
 	.uleb128 0x1d
-	.4byte	.LASF1042
+	.4byte	.LASF1044
 	.byte	0x21
 	.2byte	0x1aa
 	.4byte	0x136
 	.byte	0x28
 	.uleb128 0x1d
-	.4byte	.LASF1043
+	.4byte	.LASF1045
 	.byte	0x21
 	.2byte	0x1ac
 	.4byte	0x136
 	.byte	0x30
 	.uleb128 0x1d
-	.4byte	.LASF1044
+	.4byte	.LASF1046
 	.byte	0x21
 	.2byte	0x1ad
 	.4byte	0x136
 	.byte	0x38
 	.uleb128 0x1d
-	.4byte	.LASF1045
+	.4byte	.LASF1047
 	.byte	0x21
 	.2byte	0x1ae
 	.4byte	0x12b
 	.byte	0x40
 	.uleb128 0x1d
-	.4byte	.LASF1046
+	.4byte	.LASF1048
 	.byte	0x21
 	.2byte	0x1b0
 	.4byte	0x136
 	.byte	0x48
 	.uleb128 0x1d
-	.4byte	.LASF1047
+	.4byte	.LASF1049
 	.byte	0x21
 	.2byte	0x1b1
 	.4byte	0x136
 	.byte	0x50
 	.uleb128 0x1d
-	.4byte	.LASF1048
+	.4byte	.LASF1050
 	.byte	0x21
 	.2byte	0x1b2
 	.4byte	0x136
 	.byte	0x58
 	.uleb128 0x1d
-	.4byte	.LASF1049
+	.4byte	.LASF1051
 	.byte	0x21
 	.2byte	0x1b3
 	.4byte	0x136
 	.byte	0x60
 	.uleb128 0x1d
-	.4byte	.LASF1050
+	.4byte	.LASF1052
 	.byte	0x21
 	.2byte	0x1b5
 	.4byte	0x136
 	.byte	0x68
 	.uleb128 0x1d
-	.4byte	.LASF1051
+	.4byte	.LASF1053
 	.byte	0x21
 	.2byte	0x1b6
 	.4byte	0x136
 	.byte	0x70
 	.uleb128 0x1d
-	.4byte	.LASF1052
+	.4byte	.LASF1054
 	.byte	0x21
 	.2byte	0x1b7
 	.4byte	0x136
 	.byte	0x78
 	.uleb128 0x1d
-	.4byte	.LASF1053
+	.4byte	.LASF1055
 	.byte	0x21
 	.2byte	0x1b8
 	.4byte	0x136
 	.byte	0x80
 	.uleb128 0x1d
-	.4byte	.LASF1054
+	.4byte	.LASF1056
 	.byte	0x21
 	.2byte	0x1b9
 	.4byte	0x136
 	.byte	0x88
 	.uleb128 0x1d
-	.4byte	.LASF1055
+	.4byte	.LASF1057
 	.byte	0x21
 	.2byte	0x1bb
 	.4byte	0x136
 	.byte	0x90
 	.uleb128 0x1d
-	.4byte	.LASF1056
+	.4byte	.LASF1058
 	.byte	0x21
 	.2byte	0x1bc
 	.4byte	0x136
 	.byte	0x98
 	.uleb128 0x1d
-	.4byte	.LASF1057
+	.4byte	.LASF1059
 	.byte	0x21
 	.2byte	0x1bd
 	.4byte	0x136
 	.byte	0xa0
 	.uleb128 0x1d
-	.4byte	.LASF1058
+	.4byte	.LASF1060
 	.byte	0x21
 	.2byte	0x1be
 	.4byte	0x136
 	.byte	0xa8
 	.uleb128 0x1d
-	.4byte	.LASF1059
+	.4byte	.LASF1061
 	.byte	0x21
 	.2byte	0x1bf
 	.4byte	0x136
 	.byte	0xb0
 	.uleb128 0x1d
-	.4byte	.LASF1060
+	.4byte	.LASF1062
 	.byte	0x21
 	.2byte	0x1c0
 	.4byte	0x136
 	.byte	0xb8
 	.uleb128 0x1d
-	.4byte	.LASF1061
+	.4byte	.LASF1063
 	.byte	0x21
 	.2byte	0x1c1
 	.4byte	0x136
 	.byte	0xc0
 	.uleb128 0x1d
-	.4byte	.LASF1062
+	.4byte	.LASF1064
 	.byte	0x21
 	.2byte	0x1c2
 	.4byte	0x136
 	.byte	0xc8
 	.uleb128 0x1d
-	.4byte	.LASF1063
+	.4byte	.LASF1065
 	.byte	0x21
 	.2byte	0x1c3
 	.4byte	0x136
 	.byte	0xd0
 	.byte	0
 	.uleb128 0x2a
-	.4byte	.LASF1064
+	.4byte	.LASF1066
 	.2byte	0x200
 	.byte	0x21
 	.2byte	0x1c7
-	.4byte	0x4374
+	.4byte	0x438a
 	.uleb128 0x1d
-	.4byte	.LASF1065
+	.4byte	.LASF1067
 	.byte	0x21
 	.2byte	0x1c9
-	.4byte	0x4018
+	.4byte	0x402e
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1066
+	.4byte	.LASF1068
 	.byte	0x21
 	.2byte	0x1ca
 	.4byte	0x2d
 	.byte	0x10
 	.uleb128 0x1d
-	.4byte	.LASF1067
+	.4byte	.LASF1069
 	.byte	0x21
 	.2byte	0x1cb
-	.4byte	0x2ec7
+	.4byte	0x2edd
 	.byte	0x18
 	.uleb128 0x1d
-	.4byte	.LASF1068
+	.4byte	.LASF1070
 	.byte	0x21
 	.2byte	0x1cc
 	.4byte	0x2f1
 	.byte	0x30
 	.uleb128 0x1d
-	.4byte	.LASF294
+	.4byte	.LASF296
 	.byte	0x21
 	.2byte	0x1cd
 	.4byte	0x6c
 	.byte	0x40
 	.uleb128 0x1d
-	.4byte	.LASF1069
+	.4byte	.LASF1071
 	.byte	0x21
 	.2byte	0x1cf
 	.4byte	0x136
 	.byte	0x48
 	.uleb128 0x1d
-	.4byte	.LASF1016
+	.4byte	.LASF1018
 	.byte	0x21
 	.2byte	0x1d0
 	.4byte	0x136
 	.byte	0x50
 	.uleb128 0x1d
-	.4byte	.LASF1070
+	.4byte	.LASF1072
 	.byte	0x21
 	.2byte	0x1d1
 	.4byte	0x136
 	.byte	0x58
 	.uleb128 0x1d
-	.4byte	.LASF1071
+	.4byte	.LASF1073
 	.byte	0x21
 	.2byte	0x1d2
 	.4byte	0x136
 	.byte	0x60
 	.uleb128 0x1d
-	.4byte	.LASF1072
+	.4byte	.LASF1074
 	.byte	0x21
 	.2byte	0x1d4
 	.4byte	0x136
 	.byte	0x68
 	.uleb128 0x1d
-	.4byte	.LASF1073
+	.4byte	.LASF1075
 	.byte	0x21
 	.2byte	0x1d6
-	.4byte	0x40eb
+	.4byte	0x4101
 	.byte	0x70
 	.uleb128 0x2c
-	.4byte	.LASF1074
+	.4byte	.LASF1076
 	.byte	0x21
 	.2byte	0x1d9
 	.4byte	0xbb
@@ -9613,25 +9623,25 @@ spi_id_buffer.16929:
 	.4byte	.LASF65
 	.byte	0x21
 	.2byte	0x1da
-	.4byte	0x4374
+	.4byte	0x438a
 	.2byte	0x150
 	.uleb128 0x2c
-	.4byte	.LASF1075
+	.4byte	.LASF1077
 	.byte	0x21
 	.2byte	0x1dc
-	.4byte	0x437f
+	.4byte	0x4395
 	.2byte	0x158
 	.uleb128 0x2c
-	.4byte	.LASF1076
+	.4byte	.LASF1078
 	.byte	0x21
 	.2byte	0x1de
-	.4byte	0x437f
+	.4byte	0x4395
 	.2byte	0x160
 	.uleb128 0x2b
 	.string	"avg"
 	.byte	0x21
 	.2byte	0x1e8
-	.4byte	0x4068
+	.4byte	0x407e
 	.2byte	0x180
 	.uleb128 0x2c
 	.4byte	.LASF68
@@ -9660,59 +9670,59 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4258
+	.4byte	0x426e
 	.uleb128 0x1a
-	.4byte	.LASF1075
+	.4byte	.LASF1077
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x437a
+	.4byte	0x4390
 	.uleb128 0x1b
-	.4byte	.LASF1077
+	.4byte	.LASF1079
 	.byte	0x50
 	.byte	0x21
 	.2byte	0x1f1
-	.4byte	0x4422
+	.4byte	0x4438
 	.uleb128 0x1d
-	.4byte	.LASF1078
+	.4byte	.LASF1080
 	.byte	0x21
 	.2byte	0x1f2
 	.4byte	0x2f1
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1079
+	.4byte	.LASF1081
 	.byte	0x21
 	.2byte	0x1f3
 	.4byte	0x2d
 	.byte	0x10
 	.uleb128 0x1d
-	.4byte	.LASF1080
+	.4byte	.LASF1082
 	.byte	0x21
 	.2byte	0x1f4
 	.4byte	0x2d
 	.byte	0x18
 	.uleb128 0x1d
-	.4byte	.LASF1081
+	.4byte	.LASF1083
 	.byte	0x21
 	.2byte	0x1f5
 	.4byte	0x6c
 	.byte	0x20
 	.uleb128 0x1d
-	.4byte	.LASF294
+	.4byte	.LASF296
 	.byte	0x21
 	.2byte	0x1f6
 	.4byte	0xa9
 	.byte	0x24
 	.uleb128 0x1d
-	.4byte	.LASF1082
+	.4byte	.LASF1084
 	.byte	0x21
 	.2byte	0x1f7
 	.4byte	0xa9
 	.byte	0x26
 	.uleb128 0x1d
-	.4byte	.LASF1083
+	.4byte	.LASF1085
 	.byte	0x21
 	.2byte	0x1f9
-	.4byte	0x4422
+	.4byte	0x4438
 	.byte	0x28
 	.uleb128 0x1d
 	.4byte	.LASF68
@@ -9741,57 +9751,57 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4385
+	.4byte	0x439b
 	.uleb128 0x1b
-	.4byte	.LASF1084
+	.4byte	.LASF1086
 	.byte	0xe8
 	.byte	0x21
 	.2byte	0x208
-	.4byte	0x4515
+	.4byte	0x452b
 	.uleb128 0x1d
-	.4byte	.LASF792
+	.4byte	.LASF794
 	.byte	0x21
 	.2byte	0x209
-	.4byte	0x2ec7
+	.4byte	0x2edd
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1085
+	.4byte	.LASF1087
 	.byte	0x21
 	.2byte	0x210
 	.4byte	0x136
 	.byte	0x18
 	.uleb128 0x1d
-	.4byte	.LASF1086
+	.4byte	.LASF1088
 	.byte	0x21
 	.2byte	0x211
 	.4byte	0x136
 	.byte	0x20
 	.uleb128 0x1d
-	.4byte	.LASF1087
+	.4byte	.LASF1089
 	.byte	0x21
 	.2byte	0x212
 	.4byte	0x136
 	.byte	0x28
 	.uleb128 0x1d
-	.4byte	.LASF1088
+	.4byte	.LASF1090
 	.byte	0x21
 	.2byte	0x213
 	.4byte	0x136
 	.byte	0x30
 	.uleb128 0x1d
-	.4byte	.LASF1089
+	.4byte	.LASF1091
 	.byte	0x21
 	.2byte	0x214
 	.4byte	0x136
 	.byte	0x38
 	.uleb128 0x1d
-	.4byte	.LASF1090
+	.4byte	.LASF1092
 	.byte	0x21
 	.2byte	0x21b
 	.4byte	0x12b
 	.byte	0x40
 	.uleb128 0x1d
-	.4byte	.LASF1091
+	.4byte	.LASF1093
 	.byte	0x21
 	.2byte	0x21c
 	.4byte	0x136
@@ -9803,7 +9813,7 @@ spi_id_buffer.16929:
 	.4byte	0x6c
 	.byte	0x50
 	.uleb128 0x39
-	.4byte	.LASF1092
+	.4byte	.LASF1094
 	.byte	0x21
 	.2byte	0x237
 	.4byte	0x6c
@@ -9812,7 +9822,7 @@ spi_id_buffer.16929:
 	.byte	0x1f
 	.byte	0x54
 	.uleb128 0x39
-	.4byte	.LASF1093
+	.4byte	.LASF1095
 	.byte	0x21
 	.2byte	0x238
 	.4byte	0x6c
@@ -9821,7 +9831,7 @@ spi_id_buffer.16929:
 	.byte	0x1e
 	.byte	0x54
 	.uleb128 0x39
-	.4byte	.LASF1094
+	.4byte	.LASF1096
 	.byte	0x21
 	.2byte	0x239
 	.4byte	0x6c
@@ -9830,7 +9840,7 @@ spi_id_buffer.16929:
 	.byte	0x1d
 	.byte	0x54
 	.uleb128 0x39
-	.4byte	.LASF1095
+	.4byte	.LASF1097
 	.byte	0x21
 	.2byte	0x23a
 	.4byte	0x6c
@@ -9839,7 +9849,7 @@ spi_id_buffer.16929:
 	.byte	0x1c
 	.byte	0x54
 	.uleb128 0x39
-	.4byte	.LASF1096
+	.4byte	.LASF1098
 	.byte	0x21
 	.2byte	0x23b
 	.4byte	0x6c
@@ -9848,37 +9858,37 @@ spi_id_buffer.16929:
 	.byte	0x1b
 	.byte	0x54
 	.uleb128 0x1d
-	.4byte	.LASF1097
+	.4byte	.LASF1099
 	.byte	0x21
 	.2byte	0x241
-	.4byte	0x3832
+	.4byte	0x3848
 	.byte	0x58
 	.uleb128 0x1d
-	.4byte	.LASF1098
+	.4byte	.LASF1100
 	.byte	0x21
 	.2byte	0x24a
-	.4byte	0x3832
+	.4byte	0x3848
 	.byte	0xa0
 	.byte	0
 	.uleb128 0x3a
 	.byte	0x4
 	.byte	0x21
 	.2byte	0x271
-	.4byte	0x4553
+	.4byte	0x4569
 	.uleb128 0x1d
-	.4byte	.LASF383
+	.4byte	.LASF385
 	.byte	0x21
 	.2byte	0x272
 	.4byte	0x100
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1099
+	.4byte	.LASF1101
 	.byte	0x21
 	.2byte	0x273
 	.4byte	0x100
 	.byte	0x1
 	.uleb128 0x1d
-	.4byte	.LASF1100
+	.4byte	.LASF1102
 	.byte	0x21
 	.2byte	0x274
 	.4byte	0x100
@@ -9891,16 +9901,16 @@ spi_id_buffer.16929:
 	.byte	0x3
 	.byte	0
 	.uleb128 0x3b
-	.4byte	.LASF1101
+	.4byte	.LASF1103
 	.byte	0x4
 	.byte	0x21
 	.2byte	0x270
-	.4byte	0x4575
+	.4byte	0x458b
 	.uleb128 0x3c
 	.string	"b"
 	.byte	0x21
 	.2byte	0x278
-	.4byte	0x4515
+	.4byte	0x452b
 	.uleb128 0x3c
 	.string	"s"
 	.byte	0x21
@@ -9908,46 +9918,46 @@ spi_id_buffer.16929:
 	.4byte	0x120
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1102
+	.4byte	.LASF1104
 	.byte	0x4
 	.4byte	0xbb
 	.byte	0x21
 	.2byte	0x27c
-	.4byte	0x459f
+	.4byte	0x45b5
 	.uleb128 0x3d
-	.4byte	.LASF1103
+	.4byte	.LASF1105
 	.sleb128 -1
 	.uleb128 0xc
-	.4byte	.LASF1104
+	.4byte	.LASF1106
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1105
+	.4byte	.LASF1107
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1106
+	.4byte	.LASF1108
 	.byte	0x2
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1107
+	.4byte	.LASF1109
 	.byte	0x8
 	.byte	0x21
 	.2byte	0x283
-	.4byte	0x45ba
+	.4byte	0x45d0
 	.uleb128 0x1d
 	.4byte	.LASF51
 	.byte	0x21
 	.2byte	0x284
-	.4byte	0x45ba
+	.4byte	0x45d0
 	.byte	0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x459f
+	.4byte	0x45b5
 	.uleb128 0x3a
 	.byte	0x8
 	.byte	0x21
 	.2byte	0x510
-	.4byte	0x45d7
+	.4byte	0x45ed
 	.uleb128 0x1d
 	.4byte	.LASF68
 	.byte	0x21
@@ -9963,9 +9973,9 @@ spi_id_buffer.16929:
 	.byte	0x8
 	.byte	0x21
 	.2byte	0x510
-	.4byte	0x4606
+	.4byte	0x461c
 	.uleb128 0x40
-	.4byte	.LASF1514
+	.4byte	.LASF1516
 	.byte	0x21
 	.2byte	0x510
 	.4byte	0x6c
@@ -9973,18 +9983,18 @@ spi_id_buffer.16929:
 	.byte	0x1
 	.byte	0x1f
 	.uleb128 0x41
-	.4byte	.LASF1108
+	.4byte	.LASF1110
 	.byte	0x21
 	.2byte	0x510
-	.4byte	0x45c0
+	.4byte	0x45d6
 	.uleb128 0x20
-	.4byte	0x45d7
+	.4byte	0x45ed
 	.byte	0
 	.uleb128 0x3a
 	.byte	0x8
 	.byte	0x21
 	.2byte	0x513
-	.4byte	0x461d
+	.4byte	0x4633
 	.uleb128 0x1d
 	.4byte	.LASF69
 	.byte	0x21
@@ -10000,126 +10010,116 @@ spi_id_buffer.16929:
 	.byte	0x8
 	.byte	0x21
 	.2byte	0x513
-	.4byte	0x4649
+	.4byte	0x465f
 	.uleb128 0x41
-	.4byte	.LASF1109
+	.4byte	.LASF1111
 	.byte	0x21
 	.2byte	0x513
 	.4byte	0x6c
 	.uleb128 0x41
-	.4byte	.LASF1110
+	.4byte	.LASF1112
 	.byte	0x21
 	.2byte	0x513
-	.4byte	0x4606
+	.4byte	0x461c
 	.uleb128 0x20
-	.4byte	0x461d
+	.4byte	0x4633
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF299
+	.4byte	.LASF301
 	.uleb128 0x3
-	.4byte	0x4649
+	.4byte	0x465f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x464e
+	.4byte	0x4664
 	.uleb128 0x1a
-	.4byte	.LASF1111
+	.4byte	.LASF1113
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4659
+	.4byte	0x466f
 	.uleb128 0x1a
-	.4byte	.LASF1112
+	.4byte	.LASF1114
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4664
+	.4byte	0x467a
 	.uleb128 0x1a
-	.4byte	.LASF1113
+	.4byte	.LASF1115
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x466f
+	.4byte	0x4685
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x36da
+	.4byte	0x36f0
 	.uleb128 0x5
 	.4byte	0x335
-	.4byte	0x4690
+	.4byte	0x46a6
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2c05
+	.4byte	0x2c1b
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x136
 	.uleb128 0x5
 	.4byte	0x2f1
-	.4byte	0x46ac
+	.4byte	0x46c2
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x2
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF374
+	.4byte	.LASF376
 	.uleb128 0x3
-	.4byte	0x46ac
+	.4byte	0x46c2
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x46b1
+	.4byte	0x46c7
 	.uleb128 0x5
 	.4byte	0x60
-	.4byte	0x46cc
+	.4byte	0x46e2
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0xf
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF376
-	.uleb128 0x7
-	.byte	0x8
-	.4byte	0x46cc
-	.uleb128 0x1a
-	.4byte	.LASF1114
-	.uleb128 0x7
-	.byte	0x8
-	.4byte	0x46d7
-	.uleb128 0x1a
-	.4byte	.LASF1115
+	.4byte	.LASF378
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x46e2
 	.uleb128 0x1a
-	.4byte	.LASF380
+	.4byte	.LASF1116
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x46ed
 	.uleb128 0x1a
-	.4byte	.LASF1116
+	.4byte	.LASF1117
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x46f8
 	.uleb128 0x1a
-	.4byte	.LASF1117
+	.4byte	.LASF382
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x4703
 	.uleb128 0x1a
-	.4byte	.LASF390
+	.4byte	.LASF1118
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x470e
 	.uleb128 0x1a
-	.4byte	.LASF1118
+	.4byte	.LASF1119
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x4719
 	.uleb128 0x1a
-	.4byte	.LASF401
+	.4byte	.LASF392
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x4724
 	.uleb128 0x1a
-	.4byte	.LASF1119
+	.4byte	.LASF1120
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x472f
@@ -10129,7 +10129,7 @@ spi_id_buffer.16929:
 	.byte	0x8
 	.4byte	0x473a
 	.uleb128 0x1a
-	.4byte	.LASF404
+	.4byte	.LASF1121
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x4745
@@ -10138,19 +10138,19 @@ spi_id_buffer.16929:
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x4750
+	.uleb128 0x1a
+	.4byte	.LASF406
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3d81
+	.4byte	0x475b
 	.uleb128 0x1a
-	.4byte	.LASF1120
+	.4byte	.LASF407
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4761
-	.uleb128 0x1a
-	.4byte	.LASF1121
+	.4byte	0x4766
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x476c
+	.4byte	0x3d97
 	.uleb128 0x1a
 	.4byte	.LASF1122
 	.uleb128 0x7
@@ -10161,31 +10161,31 @@ spi_id_buffer.16929:
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x4782
-	.uleb128 0x5
-	.4byte	0x479d
-	.4byte	0x479d
-	.uleb128 0x6
-	.4byte	0x4e
-	.byte	0x1
-	.byte	0
-	.uleb128 0x7
-	.byte	0x8
-	.4byte	0x47a3
 	.uleb128 0x1a
 	.4byte	.LASF1124
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3f34
+	.4byte	0x478d
 	.uleb128 0x1a
 	.4byte	.LASF1125
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x47ae
+	.4byte	0x4798
+	.uleb128 0x5
+	.4byte	0x47b3
+	.4byte	0x47b3
+	.uleb128 0x6
+	.4byte	0x4e
+	.byte	0x1
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x47b9
 	.uleb128 0x1a
 	.4byte	.LASF1126
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x47b9
+	.4byte	0x3f4a
 	.uleb128 0x1a
 	.4byte	.LASF1127
 	.uleb128 0x7
@@ -10206,46 +10206,56 @@ spi_id_buffer.16929:
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x47e5
-	.uleb128 0x17
+	.uleb128 0x1a
 	.4byte	.LASF1131
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x47f0
+	.uleb128 0x1a
+	.4byte	.LASF1132
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x47fb
+	.uleb128 0x17
+	.4byte	.LASF1133
 	.byte	0x21
 	.2byte	0x5d0
-	.4byte	0x467a
+	.4byte	0x4690
 	.uleb128 0x5
 	.4byte	0x2d
-	.4byte	0x480d
+	.4byte	0x4823
 	.uleb128 0x42
 	.4byte	0x4e
 	.2byte	0x7ff
 	.byte	0
 	.uleb128 0x17
-	.4byte	.LASF1132
+	.4byte	.LASF1134
 	.byte	0x21
 	.2byte	0x699
-	.4byte	0x47fc
+	.4byte	0x4812
 	.uleb128 0x1c
-	.4byte	.LASF1133
+	.4byte	.LASF1135
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x21
 	.2byte	0x775
-	.4byte	0x483d
+	.4byte	0x4853
 	.uleb128 0xc
-	.4byte	.LASF1134
+	.4byte	.LASF1136
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1135
+	.4byte	.LASF1137
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1136
+	.4byte	.LASF1138
 	.byte	0x2
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF1137
+	.4byte	.LASF1139
 	.byte	0x10
 	.byte	0x56
 	.byte	0x1e
-	.4byte	0x4862
+	.4byte	0x4878
 	.uleb128 0xe
 	.4byte	.LASF62
 	.byte	0x56
@@ -10253,18 +10263,18 @@ spi_id_buffer.16929:
 	.4byte	0x55
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF822
+	.4byte	.LASF824
 	.byte	0x56
 	.byte	0x20
 	.4byte	0x226
 	.byte	0x8
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF1138
+	.4byte	.LASF1140
 	.byte	0x28
 	.byte	0x56
 	.byte	0x54
-	.4byte	0x48ab
+	.4byte	0x48c1
 	.uleb128 0xe
 	.4byte	.LASF62
 	.byte	0x56
@@ -10272,51 +10282,51 @@ spi_id_buffer.16929:
 	.4byte	0x55
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1139
+	.4byte	.LASF1141
 	.byte	0x56
 	.byte	0x56
-	.4byte	0x49b0
+	.4byte	0x49c6
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1140
+	.4byte	.LASF1142
 	.byte	0x56
 	.byte	0x58
-	.4byte	0x4a2a
+	.4byte	0x4a40
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1141
+	.4byte	.LASF1143
 	.byte	0x56
 	.byte	0x5a
-	.4byte	0x4a30
+	.4byte	0x4a46
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1142
+	.4byte	.LASF1144
 	.byte	0x56
 	.byte	0x5b
-	.4byte	0x4a36
+	.4byte	0x4a4c
 	.byte	0x20
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x4862
+	.4byte	0x4878
 	.uleb128 0x16
 	.4byte	0x226
-	.4byte	0x48c9
+	.4byte	0x48df
 	.uleb128 0x11
-	.4byte	0x48c9
+	.4byte	0x48df
 	.uleb128 0x11
-	.4byte	0x49aa
+	.4byte	0x49c0
 	.uleb128 0x11
 	.4byte	0xbb
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x48cf
+	.4byte	0x48e5
 	.uleb128 0xf
-	.4byte	.LASF1143
+	.4byte	.LASF1145
 	.byte	0x60
 	.byte	0x57
 	.byte	0x42
-	.4byte	0x49aa
+	.4byte	0x49c0
 	.uleb128 0xe
 	.4byte	.LASF62
 	.byte	0x57
@@ -10324,7 +10334,7 @@ spi_id_buffer.16929:
 	.4byte	0x55
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF734
+	.4byte	.LASF736
 	.byte	0x57
 	.byte	0x44
 	.4byte	0x2f1
@@ -10333,34 +10343,34 @@ spi_id_buffer.16929:
 	.4byte	.LASF65
 	.byte	0x57
 	.byte	0x45
-	.4byte	0x48c9
+	.4byte	0x48df
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1144
+	.4byte	.LASF1146
 	.byte	0x57
 	.byte	0x46
-	.4byte	0x4b97
+	.4byte	0x4bad
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1145
+	.4byte	.LASF1147
 	.byte	0x57
 	.byte	0x47
-	.4byte	0x4c22
+	.4byte	0x4c38
 	.byte	0x28
 	.uleb128 0x12
 	.string	"sd"
 	.byte	0x57
 	.byte	0x48
-	.4byte	0x3114
+	.4byte	0x312a
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1146
+	.4byte	.LASF1148
 	.byte	0x57
 	.byte	0x49
-	.4byte	0x4afb
+	.4byte	0x4b11
 	.byte	0x38
 	.uleb128 0x37
-	.4byte	.LASF1147
+	.4byte	.LASF1149
 	.byte	0x57
 	.byte	0x4d
 	.4byte	0x6c
@@ -10369,7 +10379,7 @@ spi_id_buffer.16929:
 	.byte	0x1f
 	.byte	0x3c
 	.uleb128 0x37
-	.4byte	.LASF1148
+	.4byte	.LASF1150
 	.byte	0x57
 	.byte	0x4e
 	.4byte	0x6c
@@ -10378,7 +10388,7 @@ spi_id_buffer.16929:
 	.byte	0x1e
 	.byte	0x3c
 	.uleb128 0x37
-	.4byte	.LASF1149
+	.4byte	.LASF1151
 	.byte	0x57
 	.byte	0x4f
 	.4byte	0x6c
@@ -10387,7 +10397,7 @@ spi_id_buffer.16929:
 	.byte	0x1d
 	.byte	0x3c
 	.uleb128 0x37
-	.4byte	.LASF1150
+	.4byte	.LASF1152
 	.byte	0x57
 	.byte	0x50
 	.4byte	0x6c
@@ -10396,7 +10406,7 @@ spi_id_buffer.16929:
 	.byte	0x1c
 	.byte	0x3c
 	.uleb128 0x37
-	.4byte	.LASF1151
+	.4byte	.LASF1153
 	.byte	0x57
 	.byte	0x51
 	.4byte	0x6c
@@ -10431,84 +10441,84 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x483d
+	.4byte	0x4853
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x48b0
+	.4byte	0x48c6
 	.uleb128 0x16
 	.4byte	0x226
-	.4byte	0x49cf
+	.4byte	0x49e5
 	.uleb128 0x11
-	.4byte	0x48c9
+	.4byte	0x48df
 	.uleb128 0x11
-	.4byte	0x49cf
+	.4byte	0x49e5
 	.uleb128 0x11
 	.4byte	0xbb
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x49d5
+	.4byte	0x49eb
 	.uleb128 0xf
-	.4byte	.LASF1152
+	.4byte	.LASF1154
 	.byte	0x38
 	.byte	0x56
 	.byte	0xa1
-	.4byte	0x4a2a
+	.4byte	0x4a40
 	.uleb128 0xe
-	.4byte	.LASF842
+	.4byte	.LASF844
 	.byte	0x56
 	.byte	0xa2
-	.4byte	0x483d
+	.4byte	0x4853
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF826
+	.4byte	.LASF828
 	.byte	0x56
 	.byte	0xa3
 	.4byte	0x27a
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1153
+	.4byte	.LASF1155
 	.byte	0x56
 	.byte	0xa4
 	.4byte	0x45b
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF834
+	.4byte	.LASF836
 	.byte	0x56
 	.byte	0xa5
-	.4byte	0x4a64
+	.4byte	0x4a7a
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF837
+	.4byte	.LASF839
 	.byte	0x56
 	.byte	0xa7
-	.4byte	0x4a64
+	.4byte	0x4a7a
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF838
+	.4byte	.LASF840
 	.byte	0x56
 	.byte	0xa9
-	.4byte	0x4a88
+	.4byte	0x4a9e
 	.byte	0x30
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x49b6
+	.4byte	0x49cc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x49aa
+	.4byte	0x49c0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x49cf
+	.4byte	0x49e5
 	.uleb128 0x16
 	.4byte	0x285
-	.4byte	0x4a64
+	.4byte	0x4a7a
 	.uleb128 0x11
-	.4byte	0x3495
+	.4byte	0x34ab
 	.uleb128 0x11
-	.4byte	0x48c9
+	.4byte	0x48df
 	.uleb128 0x11
-	.4byte	0x49cf
+	.4byte	0x49e5
 	.uleb128 0x11
 	.4byte	0x1fa
 	.uleb128 0x11
@@ -10518,63 +10528,63 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4a3c
+	.4byte	0x4a52
 	.uleb128 0x16
 	.4byte	0xbb
-	.4byte	0x4a88
+	.4byte	0x4a9e
 	.uleb128 0x11
-	.4byte	0x3495
+	.4byte	0x34ab
 	.uleb128 0x11
-	.4byte	0x48c9
+	.4byte	0x48df
 	.uleb128 0x11
-	.4byte	0x49cf
+	.4byte	0x49e5
 	.uleb128 0x11
-	.4byte	0x35a3
+	.4byte	0x35b9
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4a6a
+	.4byte	0x4a80
 	.uleb128 0xf
-	.4byte	.LASF1154
+	.4byte	.LASF1156
 	.byte	0x10
 	.byte	0x56
 	.byte	0xd6
-	.4byte	0x4ab3
+	.4byte	0x4ac9
 	.uleb128 0xe
-	.4byte	.LASF1155
+	.4byte	.LASF1157
 	.byte	0x56
 	.byte	0xd7
-	.4byte	0x4ad1
+	.4byte	0x4ae7
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1156
+	.4byte	.LASF1158
 	.byte	0x56
 	.byte	0xd8
-	.4byte	0x4af5
+	.4byte	0x4b0b
 	.byte	0x8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x4a8e
+	.4byte	0x4aa4
 	.uleb128 0x16
 	.4byte	0x285
-	.4byte	0x4ad1
+	.4byte	0x4ae7
 	.uleb128 0x11
-	.4byte	0x48c9
+	.4byte	0x48df
 	.uleb128 0x11
-	.4byte	0x49aa
+	.4byte	0x49c0
 	.uleb128 0x11
 	.4byte	0x1fa
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4ab8
+	.4byte	0x4ace
 	.uleb128 0x16
 	.4byte	0x285
-	.4byte	0x4af5
+	.4byte	0x4b0b
 	.uleb128 0x11
-	.4byte	0x48c9
+	.4byte	0x48df
 	.uleb128 0x11
-	.4byte	0x49aa
+	.4byte	0x49c0
 	.uleb128 0x11
 	.4byte	0x55
 	.uleb128 0x11
@@ -10582,59 +10592,59 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4ad7
+	.4byte	0x4aed
 	.uleb128 0xf
-	.4byte	.LASF1146
+	.4byte	.LASF1148
 	.byte	0x4
 	.byte	0x58
 	.byte	0x15
-	.4byte	0x4b14
+	.4byte	0x4b2a
 	.uleb128 0xe
-	.4byte	.LASF1157
+	.4byte	.LASF1159
 	.byte	0x58
 	.byte	0x16
-	.4byte	0x3789
+	.4byte	0x379f
 	.byte	0
 	.byte	0
 	.uleb128 0x13
-	.4byte	.LASF1158
+	.4byte	.LASF1160
 	.byte	0x57
 	.byte	0x26
 	.4byte	0x4ed
 	.uleb128 0x13
-	.4byte	.LASF1159
+	.4byte	.LASF1161
 	.byte	0x57
 	.byte	0x2a
 	.4byte	0x136
 	.uleb128 0xf
-	.4byte	.LASF1144
+	.4byte	.LASF1146
 	.byte	0xa0
 	.byte	0x57
 	.byte	0xcb
-	.4byte	0x4b97
+	.4byte	0x4bad
 	.uleb128 0xe
-	.4byte	.LASF856
+	.4byte	.LASF858
 	.byte	0x57
 	.byte	0xcc
 	.4byte	0x2f1
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1160
+	.4byte	.LASF1162
 	.byte	0x57
 	.byte	0xcd
 	.4byte	0x898
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1161
+	.4byte	.LASF1163
 	.byte	0x57
 	.byte	0xce
-	.4byte	0x48cf
+	.4byte	0x48e5
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1162
+	.4byte	.LASF1164
 	.byte	0x57
 	.byte	0xcf
-	.4byte	0x4dbd
+	.4byte	0x4dd3
 	.byte	0x78
 	.uleb128 0xe
 	.4byte	.LASF68
@@ -10663,48 +10673,48 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4b2a
+	.4byte	0x4b40
 	.uleb128 0xf
-	.4byte	.LASF1163
+	.4byte	.LASF1165
 	.byte	0x50
 	.byte	0x57
 	.byte	0x91
-	.4byte	0x4c22
+	.4byte	0x4c38
 	.uleb128 0xe
-	.4byte	.LASF829
+	.4byte	.LASF831
 	.byte	0x57
 	.byte	0x92
-	.4byte	0x4c33
+	.4byte	0x4c49
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1154
+	.4byte	.LASF1156
 	.byte	0x57
 	.byte	0x93
-	.4byte	0x4c39
+	.4byte	0x4c4f
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1164
+	.4byte	.LASF1166
 	.byte	0x57
 	.byte	0x94
-	.4byte	0x4a30
+	.4byte	0x4a46
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1165
+	.4byte	.LASF1167
 	.byte	0x57
 	.byte	0x95
-	.4byte	0x4c54
+	.4byte	0x4c6a
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1166
+	.4byte	.LASF1168
 	.byte	0x57
 	.byte	0x96
-	.4byte	0x4c69
+	.4byte	0x4c7f
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1167
+	.4byte	.LASF1169
 	.byte	0x57
 	.byte	0x97
-	.4byte	0x4c90
+	.4byte	0x4ca6
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF68
@@ -10733,77 +10743,77 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4b9d
+	.4byte	0x4bb3
 	.uleb128 0x10
-	.4byte	0x4c33
+	.4byte	0x4c49
 	.uleb128 0x11
-	.4byte	0x48c9
+	.4byte	0x48df
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4c28
+	.4byte	0x4c3e
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4ab3
+	.4byte	0x4ac9
 	.uleb128 0x16
-	.4byte	0x4c4e
-	.4byte	0x4c4e
+	.4byte	0x4c64
+	.4byte	0x4c64
 	.uleb128 0x11
-	.4byte	0x48c9
+	.4byte	0x48df
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x362c
+	.4byte	0x3642
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4c3f
+	.4byte	0x4c55
 	.uleb128 0x16
-	.4byte	0x2a23
-	.4byte	0x4c69
+	.4byte	0x2a39
+	.4byte	0x4c7f
 	.uleb128 0x11
-	.4byte	0x48c9
+	.4byte	0x48df
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4c5a
+	.4byte	0x4c70
 	.uleb128 0x10
-	.4byte	0x4c84
+	.4byte	0x4c9a
 	.uleb128 0x11
-	.4byte	0x48c9
+	.4byte	0x48df
 	.uleb128 0x11
-	.4byte	0x4c84
+	.4byte	0x4c9a
 	.uleb128 0x11
-	.4byte	0x4c8a
+	.4byte	0x4ca0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2f8d
+	.4byte	0x2fa3
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2fad
+	.4byte	0x2fc3
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4c6f
+	.4byte	0x4c85
 	.uleb128 0x26
-	.4byte	.LASF1168
+	.4byte	.LASF1170
 	.2byte	0x1220
 	.byte	0x57
 	.byte	0x9f
-	.4byte	0x4ce3
+	.4byte	0x4cf9
 	.uleb128 0xe
-	.4byte	.LASF1169
+	.4byte	.LASF1171
 	.byte	0x57
 	.byte	0xa0
-	.4byte	0x4ce3
+	.4byte	0x4cf9
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1170
+	.4byte	.LASF1172
 	.byte	0x57
 	.byte	0xa1
-	.4byte	0x4cf3
+	.4byte	0x4d09
 	.byte	0x18
 	.uleb128 0x27
-	.4byte	.LASF1171
+	.4byte	.LASF1173
 	.byte	0x57
 	.byte	0xa2
 	.4byte	0xbb
@@ -10812,10 +10822,10 @@ spi_id_buffer.16929:
 	.string	"buf"
 	.byte	0x57
 	.byte	0xa3
-	.4byte	0x4d03
+	.4byte	0x4d19
 	.2byte	0x21c
 	.uleb128 0x27
-	.4byte	.LASF1172
+	.4byte	.LASF1174
 	.byte	0x57
 	.byte	0xa4
 	.4byte	0xbb
@@ -10823,369 +10833,369 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x1fa
-	.4byte	0x4cf3
+	.4byte	0x4d09
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x1fa
-	.4byte	0x4d03
+	.4byte	0x4d19
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x3f
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x60
-	.4byte	0x4d14
+	.4byte	0x4d2a
 	.uleb128 0x42
 	.4byte	0x4e
 	.2byte	0xfff
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF1173
+	.4byte	.LASF1175
 	.byte	0x18
 	.byte	0x57
 	.byte	0xa7
-	.4byte	0x4d45
+	.4byte	0x4d5b
 	.uleb128 0xe
-	.4byte	.LASF941
+	.4byte	.LASF943
 	.byte	0x57
 	.byte	0xa8
-	.4byte	0x4d64
+	.4byte	0x4d7a
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF62
 	.byte	0x57
 	.byte	0xa9
-	.4byte	0x4d83
+	.4byte	0x4d99
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1174
+	.4byte	.LASF1176
 	.byte	0x57
 	.byte	0xaa
-	.4byte	0x4dad
+	.4byte	0x4dc3
 	.byte	0x10
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x4d14
+	.4byte	0x4d2a
 	.uleb128 0x16
 	.4byte	0xbb
-	.4byte	0x4d5e
+	.4byte	0x4d74
 	.uleb128 0x11
-	.4byte	0x4b97
+	.4byte	0x4bad
 	.uleb128 0x11
-	.4byte	0x48c9
+	.4byte	0x48df
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4d4a
+	.4byte	0x4d60
 	.uleb128 0x3
-	.4byte	0x4d5e
+	.4byte	0x4d74
 	.uleb128 0x16
 	.4byte	0x55
-	.4byte	0x4d7d
+	.4byte	0x4d93
 	.uleb128 0x11
-	.4byte	0x4b97
+	.4byte	0x4bad
 	.uleb128 0x11
-	.4byte	0x48c9
+	.4byte	0x48df
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4d69
+	.4byte	0x4d7f
 	.uleb128 0x3
-	.4byte	0x4d7d
+	.4byte	0x4d93
 	.uleb128 0x16
 	.4byte	0xbb
-	.4byte	0x4da1
+	.4byte	0x4db7
 	.uleb128 0x11
-	.4byte	0x4b97
+	.4byte	0x4bad
 	.uleb128 0x11
-	.4byte	0x48c9
+	.4byte	0x48df
 	.uleb128 0x11
-	.4byte	0x4da1
+	.4byte	0x4db7
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4c96
+	.4byte	0x4cac
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4d88
+	.4byte	0x4d9e
 	.uleb128 0x3
-	.4byte	0x4da7
+	.4byte	0x4dbd
 	.uleb128 0x13
-	.4byte	.LASF1175
+	.4byte	.LASF1177
 	.byte	0x57
 	.byte	0xb6
-	.4byte	0x4ab3
+	.4byte	0x4ac9
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4d45
+	.4byte	0x4d5b
 	.uleb128 0x13
-	.4byte	.LASF1176
+	.4byte	.LASF1178
 	.byte	0x57
 	.byte	0xf5
-	.4byte	0x48c9
+	.4byte	0x48df
 	.uleb128 0x13
-	.4byte	.LASF1177
+	.4byte	.LASF1179
 	.byte	0x57
 	.byte	0xf7
-	.4byte	0x48c9
+	.4byte	0x48df
 	.uleb128 0x13
-	.4byte	.LASF1178
+	.4byte	.LASF1180
 	.byte	0x57
 	.byte	0xf9
-	.4byte	0x48c9
+	.4byte	0x48df
 	.uleb128 0x13
-	.4byte	.LASF1179
+	.4byte	.LASF1181
 	.byte	0x57
 	.byte	0xfb
-	.4byte	0x48c9
+	.4byte	0x48df
 	.uleb128 0x13
-	.4byte	.LASF1180
+	.4byte	.LASF1182
 	.byte	0x57
 	.byte	0xfd
-	.4byte	0x48c9
+	.4byte	0x48df
 	.uleb128 0xf
-	.4byte	.LASF1181
+	.4byte	.LASF1183
 	.byte	0x20
 	.byte	0x59
 	.byte	0x27
-	.4byte	0x4e2b
+	.4byte	0x4e41
 	.uleb128 0xe
-	.4byte	.LASF1182
+	.4byte	.LASF1184
 	.byte	0x59
 	.byte	0x28
 	.4byte	0x45b
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1183
+	.4byte	.LASF1185
 	.byte	0x59
 	.byte	0x29
 	.4byte	0x2f1
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1184
+	.4byte	.LASF1186
 	.byte	0x59
 	.byte	0x2a
-	.4byte	0x4afb
+	.4byte	0x4b11
 	.byte	0x18
 	.byte	0
 	.uleb128 0x13
-	.4byte	.LASF1185
+	.4byte	.LASF1187
 	.byte	0x5a
 	.byte	0x22
 	.4byte	0x4a4
 	.uleb128 0x13
-	.4byte	.LASF1186
+	.4byte	.LASF1188
 	.byte	0x5a
 	.byte	0x23
 	.4byte	0x4a4
 	.uleb128 0x13
-	.4byte	.LASF1187
+	.4byte	.LASF1189
 	.byte	0x5a
 	.byte	0x39
 	.4byte	0x566
 	.uleb128 0xf
-	.4byte	.LASF1188
+	.4byte	.LASF1190
 	.byte	0x4
 	.byte	0x5a
 	.byte	0x3e
-	.4byte	0x4e65
+	.4byte	0x4e7b
 	.uleb128 0xe
-	.4byte	.LASF855
+	.4byte	.LASF857
 	.byte	0x5a
 	.byte	0x3f
 	.4byte	0xbb
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1189
+	.4byte	.LASF1191
 	.byte	0x5a
 	.byte	0x40
-	.4byte	0x4e4c
+	.4byte	0x4e62
 	.uleb128 0x1b
-	.4byte	.LASF1190
+	.4byte	.LASF1192
 	.byte	0xb8
 	.byte	0x5a
 	.2byte	0x122
-	.4byte	0x4fa9
+	.4byte	0x4fbf
 	.uleb128 0x1d
-	.4byte	.LASF1191
+	.4byte	.LASF1193
 	.byte	0x5a
 	.2byte	0x123
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1192
+	.4byte	.LASF1194
 	.byte	0x5a
 	.2byte	0x124
-	.4byte	0x52ab
+	.4byte	0x52c1
 	.byte	0x8
 	.uleb128 0x1d
-	.4byte	.LASF1193
+	.4byte	.LASF1195
 	.byte	0x5a
 	.2byte	0x125
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x10
 	.uleb128 0x1d
-	.4byte	.LASF1194
+	.4byte	.LASF1196
 	.byte	0x5a
 	.2byte	0x126
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x18
 	.uleb128 0x1d
-	.4byte	.LASF1195
+	.4byte	.LASF1197
 	.byte	0x5a
 	.2byte	0x127
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x20
 	.uleb128 0x1d
-	.4byte	.LASF1196
+	.4byte	.LASF1198
 	.byte	0x5a
 	.2byte	0x128
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x28
 	.uleb128 0x1d
-	.4byte	.LASF1197
+	.4byte	.LASF1199
 	.byte	0x5a
 	.2byte	0x129
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x30
 	.uleb128 0x1d
-	.4byte	.LASF1198
+	.4byte	.LASF1200
 	.byte	0x5a
 	.2byte	0x12a
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x38
 	.uleb128 0x1d
-	.4byte	.LASF1199
+	.4byte	.LASF1201
 	.byte	0x5a
 	.2byte	0x12b
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x40
 	.uleb128 0x1d
-	.4byte	.LASF1200
+	.4byte	.LASF1202
 	.byte	0x5a
 	.2byte	0x12c
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x48
 	.uleb128 0x1d
-	.4byte	.LASF1201
+	.4byte	.LASF1203
 	.byte	0x5a
 	.2byte	0x12d
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x50
 	.uleb128 0x1d
-	.4byte	.LASF1202
+	.4byte	.LASF1204
 	.byte	0x5a
 	.2byte	0x12e
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x58
 	.uleb128 0x1d
-	.4byte	.LASF1203
+	.4byte	.LASF1205
 	.byte	0x5a
 	.2byte	0x12f
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x60
 	.uleb128 0x1d
-	.4byte	.LASF1204
+	.4byte	.LASF1206
 	.byte	0x5a
 	.2byte	0x130
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x68
 	.uleb128 0x1d
-	.4byte	.LASF1205
+	.4byte	.LASF1207
 	.byte	0x5a
 	.2byte	0x131
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x70
 	.uleb128 0x1d
-	.4byte	.LASF1206
+	.4byte	.LASF1208
 	.byte	0x5a
 	.2byte	0x132
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x78
 	.uleb128 0x1d
-	.4byte	.LASF1207
+	.4byte	.LASF1209
 	.byte	0x5a
 	.2byte	0x133
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x80
 	.uleb128 0x1d
-	.4byte	.LASF1208
+	.4byte	.LASF1210
 	.byte	0x5a
 	.2byte	0x134
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x88
 	.uleb128 0x1d
-	.4byte	.LASF1209
+	.4byte	.LASF1211
 	.byte	0x5a
 	.2byte	0x135
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x90
 	.uleb128 0x1d
-	.4byte	.LASF1210
+	.4byte	.LASF1212
 	.byte	0x5a
 	.2byte	0x136
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x98
 	.uleb128 0x1d
-	.4byte	.LASF1211
+	.4byte	.LASF1213
 	.byte	0x5a
 	.2byte	0x137
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0xa0
 	.uleb128 0x1d
-	.4byte	.LASF1212
+	.4byte	.LASF1214
 	.byte	0x5a
 	.2byte	0x138
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0xa8
 	.uleb128 0x1d
-	.4byte	.LASF1213
+	.4byte	.LASF1215
 	.byte	0x5a
 	.2byte	0x139
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0xb0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x4e70
+	.4byte	0x4e86
 	.uleb128 0x16
 	.4byte	0xbb
-	.4byte	0x4fbd
+	.4byte	0x4fd3
 	.uleb128 0x11
-	.4byte	0x4fbd
+	.4byte	0x4fd3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4fc3
+	.4byte	0x4fd9
 	.uleb128 0x2a
-	.4byte	.LASF1214
+	.4byte	.LASF1216
 	.2byte	0x3b0
 	.byte	0x5b
 	.2byte	0x407
-	.4byte	0x529a
+	.4byte	0x52b0
 	.uleb128 0x1d
 	.4byte	.LASF65
 	.byte	0x5b
 	.2byte	0x408
-	.4byte	0x4fbd
+	.4byte	0x4fd3
 	.byte	0
 	.uleb128 0x24
 	.string	"p"
 	.byte	0x5b
 	.2byte	0x40a
-	.4byte	0x5ed7
+	.4byte	0x5eed
 	.byte	0x8
 	.uleb128 0x1d
-	.4byte	.LASF1161
+	.4byte	.LASF1163
 	.byte	0x5b
 	.2byte	0x40c
-	.4byte	0x48cf
+	.4byte	0x48e5
 	.byte	0x10
 	.uleb128 0x1d
-	.4byte	.LASF1215
+	.4byte	.LASF1217
 	.byte	0x5b
 	.2byte	0x40d
 	.4byte	0x55
@@ -11194,154 +11204,154 @@ spi_id_buffer.16929:
 	.4byte	.LASF150
 	.byte	0x5b
 	.2byte	0x40e
-	.4byte	0x5be1
+	.4byte	0x5bf7
 	.byte	0x78
 	.uleb128 0x1d
-	.4byte	.LASF277
+	.4byte	.LASF279
 	.byte	0x5b
 	.2byte	0x410
-	.4byte	0xfe8
+	.4byte	0xffe
 	.byte	0x80
 	.uleb128 0x24
 	.string	"bus"
 	.byte	0x5b
 	.2byte	0x414
-	.4byte	0x5883
+	.4byte	0x5899
 	.byte	0xa0
 	.uleb128 0x1d
-	.4byte	.LASF1216
+	.4byte	.LASF1218
 	.byte	0x5b
 	.2byte	0x415
-	.4byte	0x59f7
+	.4byte	0x5a0d
 	.byte	0xa8
 	.uleb128 0x1d
-	.4byte	.LASF1217
+	.4byte	.LASF1219
 	.byte	0x5b
 	.2byte	0x417
 	.4byte	0x45b
 	.byte	0xb0
 	.uleb128 0x1d
-	.4byte	.LASF1218
+	.4byte	.LASF1220
 	.byte	0x5b
 	.2byte	0x419
 	.4byte	0x45b
 	.byte	0xb8
 	.uleb128 0x1d
-	.4byte	.LASF1219
+	.4byte	.LASF1221
 	.byte	0x5b
 	.2byte	0x41b
-	.4byte	0x5e42
+	.4byte	0x5e58
 	.byte	0xc0
 	.uleb128 0x2c
-	.4byte	.LASF1220
+	.4byte	.LASF1222
 	.byte	0x5b
 	.2byte	0x41c
-	.4byte	0x5358
+	.4byte	0x536e
 	.2byte	0x128
 	.uleb128 0x2c
-	.4byte	.LASF1221
+	.4byte	.LASF1223
 	.byte	0x5b
 	.2byte	0x41d
-	.4byte	0x5edd
+	.4byte	0x5ef3
 	.2byte	0x260
 	.uleb128 0x2c
-	.4byte	.LASF1222
+	.4byte	.LASF1224
 	.byte	0x5b
 	.2byte	0x420
-	.4byte	0x5ee8
+	.4byte	0x5efe
 	.2byte	0x268
 	.uleb128 0x2c
-	.4byte	.LASF1223
+	.4byte	.LASF1225
 	.byte	0x5b
 	.2byte	0x423
-	.4byte	0x5ef3
+	.4byte	0x5f09
 	.2byte	0x270
 	.uleb128 0x2c
-	.4byte	.LASF1224
+	.4byte	.LASF1226
 	.byte	0x5b
 	.2byte	0x426
 	.4byte	0x2f1
 	.2byte	0x278
 	.uleb128 0x2c
-	.4byte	.LASF1225
+	.4byte	.LASF1227
 	.byte	0x5b
 	.2byte	0x42c
-	.4byte	0x5f03
+	.4byte	0x5f19
 	.2byte	0x288
 	.uleb128 0x2c
-	.4byte	.LASF1226
+	.4byte	.LASF1228
 	.byte	0x5b
 	.2byte	0x42d
-	.4byte	0x4696
+	.4byte	0x46ac
 	.2byte	0x290
 	.uleb128 0x2c
-	.4byte	.LASF1227
+	.4byte	.LASF1229
 	.byte	0x5b
 	.2byte	0x42e
 	.4byte	0x136
 	.2byte	0x298
 	.uleb128 0x2c
-	.4byte	.LASF1228
+	.4byte	.LASF1230
 	.byte	0x5b
 	.2byte	0x433
 	.4byte	0x136
 	.2byte	0x2a0
 	.uleb128 0x2c
-	.4byte	.LASF1229
+	.4byte	.LASF1231
 	.byte	0x5b
 	.2byte	0x434
 	.4byte	0x2d
 	.2byte	0x2a8
 	.uleb128 0x2c
-	.4byte	.LASF1230
+	.4byte	.LASF1232
 	.byte	0x5b
 	.2byte	0x436
-	.4byte	0x5f09
+	.4byte	0x5f1f
 	.2byte	0x2b0
 	.uleb128 0x2c
-	.4byte	.LASF1231
+	.4byte	.LASF1233
 	.byte	0x5b
 	.2byte	0x438
 	.4byte	0x2f1
 	.2byte	0x2b8
 	.uleb128 0x2c
-	.4byte	.LASF1232
+	.4byte	.LASF1234
 	.byte	0x5b
 	.2byte	0x43a
-	.4byte	0x5f14
+	.4byte	0x5f2a
 	.2byte	0x2c8
 	.uleb128 0x2c
-	.4byte	.LASF1233
+	.4byte	.LASF1235
 	.byte	0x5b
 	.2byte	0x43d
-	.4byte	0x5f1f
+	.4byte	0x5f35
 	.2byte	0x2d0
 	.uleb128 0x2c
-	.4byte	.LASF1234
+	.4byte	.LASF1236
 	.byte	0x5b
 	.2byte	0x440
-	.4byte	0x5f2a
+	.4byte	0x5f40
 	.2byte	0x2d8
 	.uleb128 0x2c
-	.4byte	.LASF1235
+	.4byte	.LASF1237
 	.byte	0x5b
 	.2byte	0x442
-	.4byte	0x585e
+	.4byte	0x5874
 	.2byte	0x2e0
 	.uleb128 0x2c
-	.4byte	.LASF1236
+	.4byte	.LASF1238
 	.byte	0x5b
 	.2byte	0x444
-	.4byte	0x5f35
+	.4byte	0x5f4b
 	.2byte	0x2f0
 	.uleb128 0x2c
-	.4byte	.LASF1237
+	.4byte	.LASF1239
 	.byte	0x5b
 	.2byte	0x445
-	.4byte	0x5e12
+	.4byte	0x5e28
 	.2byte	0x2f8
 	.uleb128 0x2c
-	.4byte	.LASF1238
+	.4byte	.LASF1240
 	.byte	0x5b
 	.2byte	0x447
 	.4byte	0x21b
@@ -11353,55 +11363,55 @@ spi_id_buffer.16929:
 	.4byte	0x120
 	.2byte	0x304
 	.uleb128 0x2c
-	.4byte	.LASF1239
+	.4byte	.LASF1241
 	.byte	0x5b
 	.2byte	0x44a
 	.4byte	0x898
 	.2byte	0x308
 	.uleb128 0x2c
-	.4byte	.LASF1240
+	.4byte	.LASF1242
 	.byte	0x5b
 	.2byte	0x44b
 	.4byte	0x2f1
 	.2byte	0x310
 	.uleb128 0x2c
-	.4byte	.LASF1241
+	.4byte	.LASF1243
 	.byte	0x5b
 	.2byte	0x44d
-	.4byte	0x4dfa
+	.4byte	0x4e10
 	.2byte	0x320
 	.uleb128 0x2c
-	.4byte	.LASF1242
+	.4byte	.LASF1244
 	.byte	0x5b
 	.2byte	0x44e
-	.4byte	0x5d6d
+	.4byte	0x5d83
 	.2byte	0x340
 	.uleb128 0x2c
-	.4byte	.LASF1243
+	.4byte	.LASF1245
 	.byte	0x5b
 	.2byte	0x44f
-	.4byte	0x59d7
+	.4byte	0x59ed
 	.2byte	0x348
 	.uleb128 0x2c
-	.4byte	.LASF829
+	.4byte	.LASF831
 	.byte	0x5b
 	.2byte	0x451
-	.4byte	0x52ab
+	.4byte	0x52c1
 	.2byte	0x350
 	.uleb128 0x2c
-	.4byte	.LASF1244
+	.4byte	.LASF1246
 	.byte	0x5b
 	.2byte	0x452
-	.4byte	0x5f40
+	.4byte	0x5f56
 	.2byte	0x358
 	.uleb128 0x2c
-	.4byte	.LASF1245
+	.4byte	.LASF1247
 	.byte	0x5b
 	.2byte	0x453
-	.4byte	0x5f4b
+	.4byte	0x5f61
 	.2byte	0x360
 	.uleb128 0x2d
-	.4byte	.LASF1246
+	.4byte	.LASF1248
 	.byte	0x5b
 	.2byte	0x455
 	.4byte	0x247
@@ -11410,7 +11420,7 @@ spi_id_buffer.16929:
 	.byte	0x7
 	.2byte	0x368
 	.uleb128 0x2d
-	.4byte	.LASF1247
+	.4byte	.LASF1249
 	.byte	0x5b
 	.2byte	0x456
 	.4byte	0x247
@@ -11419,7 +11429,7 @@ spi_id_buffer.16929:
 	.byte	0x6
 	.2byte	0x368
 	.uleb128 0x2d
-	.4byte	.LASF1248
+	.4byte	.LASF1250
 	.byte	0x5b
 	.2byte	0x457
 	.4byte	0x247
@@ -11428,7 +11438,7 @@ spi_id_buffer.16929:
 	.byte	0x5
 	.2byte	0x368
 	.uleb128 0x2d
-	.4byte	.LASF1249
+	.4byte	.LASF1251
 	.byte	0x5b
 	.2byte	0x458
 	.4byte	0x247
@@ -11461,25 +11471,25 @@ spi_id_buffer.16929:
 	.4byte	0x136
 	.2byte	0x388
 	.uleb128 0x2c
-	.4byte	.LASF1250
+	.4byte	.LASF1252
 	.byte	0x5b
 	.2byte	0x45e
 	.4byte	0x136
 	.2byte	0x390
 	.uleb128 0x2c
-	.4byte	.LASF1251
+	.4byte	.LASF1253
 	.byte	0x5b
 	.2byte	0x45f
 	.4byte	0x136
 	.2byte	0x398
 	.uleb128 0x2c
-	.4byte	.LASF454
+	.4byte	.LASF456
 	.byte	0x5b
 	.2byte	0x460
 	.4byte	0x136
 	.2byte	0x3a0
 	.uleb128 0x2c
-	.4byte	.LASF455
+	.4byte	.LASF457
 	.byte	0x5b
 	.2byte	0x461
 	.4byte	0x136
@@ -11487,64 +11497,64 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4fae
+	.4byte	0x4fc4
 	.uleb128 0x10
-	.4byte	0x52ab
+	.4byte	0x52c1
 	.uleb128 0x11
-	.4byte	0x4fbd
+	.4byte	0x4fd3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x52a0
+	.4byte	0x52b6
 	.uleb128 0x1c
-	.4byte	.LASF1252
+	.4byte	.LASF1254
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x5a
 	.2byte	0x1fc
-	.4byte	0x52db
+	.4byte	0x52f1
 	.uleb128 0xc
-	.4byte	.LASF1253
+	.4byte	.LASF1255
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1254
+	.4byte	.LASF1256
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1255
+	.4byte	.LASF1257
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF1256
+	.4byte	.LASF1258
 	.byte	0x3
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1257
+	.4byte	.LASF1259
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x5a
 	.2byte	0x212
-	.4byte	0x530b
+	.4byte	0x5321
 	.uleb128 0xc
-	.4byte	.LASF1258
+	.4byte	.LASF1260
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1259
+	.4byte	.LASF1261
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1260
+	.4byte	.LASF1262
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF1261
+	.4byte	.LASF1263
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF1262
+	.4byte	.LASF1264
 	.byte	0x4
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1263
+	.4byte	.LASF1265
 	.byte	0x20
 	.byte	0x5a
 	.2byte	0x21e
-	.4byte	0x534d
+	.4byte	0x5363
 	.uleb128 0x1d
 	.4byte	.LASF100
 	.byte	0x5a
@@ -11552,43 +11562,43 @@ spi_id_buffer.16929:
 	.4byte	0x898
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1157
+	.4byte	.LASF1159
 	.byte	0x5a
 	.2byte	0x220
 	.4byte	0x6c
 	.byte	0x4
 	.uleb128 0x1d
-	.4byte	.LASF1264
+	.4byte	.LASF1266
 	.byte	0x5a
 	.2byte	0x222
 	.4byte	0x2f1
 	.byte	0x8
 	.uleb128 0x1d
-	.4byte	.LASF1265
+	.4byte	.LASF1267
 	.byte	0x5a
 	.2byte	0x225
-	.4byte	0x5352
+	.4byte	0x5368
 	.byte	0x18
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF1266
+	.4byte	.LASF1268
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x534d
+	.4byte	0x5363
 	.uleb128 0x2a
-	.4byte	.LASF1267
+	.4byte	.LASF1269
 	.2byte	0x138
 	.byte	0x5a
 	.2byte	0x249
-	.4byte	0x5653
+	.4byte	0x5669
 	.uleb128 0x1d
-	.4byte	.LASF1268
+	.4byte	.LASF1270
 	.byte	0x5a
 	.2byte	0x24a
-	.4byte	0x4e65
+	.4byte	0x4e7b
 	.byte	0
 	.uleb128 0x39
-	.4byte	.LASF1269
+	.4byte	.LASF1271
 	.byte	0x5a
 	.2byte	0x24b
 	.4byte	0x6c
@@ -11597,7 +11607,7 @@ spi_id_buffer.16929:
 	.byte	0x1f
 	.byte	0x4
 	.uleb128 0x39
-	.4byte	.LASF1270
+	.4byte	.LASF1272
 	.byte	0x5a
 	.2byte	0x24c
 	.4byte	0x6c
@@ -11606,7 +11616,7 @@ spi_id_buffer.16929:
 	.byte	0x1e
 	.byte	0x4
 	.uleb128 0x39
-	.4byte	.LASF1271
+	.4byte	.LASF1273
 	.byte	0x5a
 	.2byte	0x24d
 	.4byte	0x247
@@ -11615,7 +11625,7 @@ spi_id_buffer.16929:
 	.byte	0x5
 	.byte	0x4
 	.uleb128 0x39
-	.4byte	.LASF1272
+	.4byte	.LASF1274
 	.byte	0x5a
 	.2byte	0x24e
 	.4byte	0x247
@@ -11624,7 +11634,7 @@ spi_id_buffer.16929:
 	.byte	0x4
 	.byte	0x4
 	.uleb128 0x39
-	.4byte	.LASF1273
+	.4byte	.LASF1275
 	.byte	0x5a
 	.2byte	0x24f
 	.4byte	0x247
@@ -11633,7 +11643,7 @@ spi_id_buffer.16929:
 	.byte	0x3
 	.byte	0x4
 	.uleb128 0x39
-	.4byte	.LASF1274
+	.4byte	.LASF1276
 	.byte	0x5a
 	.2byte	0x250
 	.4byte	0x247
@@ -11642,7 +11652,7 @@ spi_id_buffer.16929:
 	.byte	0x2
 	.byte	0x4
 	.uleb128 0x39
-	.4byte	.LASF1275
+	.4byte	.LASF1277
 	.byte	0x5a
 	.2byte	0x251
 	.4byte	0x247
@@ -11651,7 +11661,7 @@ spi_id_buffer.16929:
 	.byte	0x1
 	.byte	0x4
 	.uleb128 0x39
-	.4byte	.LASF1276
+	.4byte	.LASF1278
 	.byte	0x5a
 	.2byte	0x252
 	.4byte	0x247
@@ -11660,7 +11670,7 @@ spi_id_buffer.16929:
 	.byte	0
 	.byte	0x4
 	.uleb128 0x39
-	.4byte	.LASF1277
+	.4byte	.LASF1279
 	.byte	0x5a
 	.2byte	0x253
 	.4byte	0x247
@@ -11669,7 +11679,7 @@ spi_id_buffer.16929:
 	.byte	0x7
 	.byte	0x5
 	.uleb128 0x39
-	.4byte	.LASF1278
+	.4byte	.LASF1280
 	.byte	0x5a
 	.2byte	0x254
 	.4byte	0x247
@@ -11678,7 +11688,7 @@ spi_id_buffer.16929:
 	.byte	0x6
 	.byte	0x5
 	.uleb128 0x1d
-	.4byte	.LASF1279
+	.4byte	.LASF1281
 	.byte	0x5a
 	.2byte	0x255
 	.4byte	0x120
@@ -11690,25 +11700,25 @@ spi_id_buffer.16929:
 	.4byte	0x898
 	.byte	0xc
 	.uleb128 0x1d
-	.4byte	.LASF734
+	.4byte	.LASF736
 	.byte	0x5a
 	.2byte	0x258
 	.4byte	0x2f1
 	.byte	0x10
 	.uleb128 0x1d
-	.4byte	.LASF748
+	.4byte	.LASF750
 	.byte	0x5a
 	.2byte	0x259
-	.4byte	0x2c05
+	.4byte	0x2c1b
 	.byte	0x20
 	.uleb128 0x1d
-	.4byte	.LASF1280
+	.4byte	.LASF1282
 	.byte	0x5a
 	.2byte	0x25a
-	.4byte	0x5755
+	.4byte	0x576b
 	.byte	0x40
 	.uleb128 0x39
-	.4byte	.LASF1281
+	.4byte	.LASF1283
 	.byte	0x5a
 	.2byte	0x25b
 	.4byte	0x247
@@ -11717,7 +11727,7 @@ spi_id_buffer.16929:
 	.byte	0x7
 	.byte	0x48
 	.uleb128 0x39
-	.4byte	.LASF1282
+	.4byte	.LASF1284
 	.byte	0x5a
 	.2byte	0x25c
 	.4byte	0x247
@@ -11726,7 +11736,7 @@ spi_id_buffer.16929:
 	.byte	0x6
 	.byte	0x48
 	.uleb128 0x39
-	.4byte	.LASF1283
+	.4byte	.LASF1285
 	.byte	0x5a
 	.2byte	0x25d
 	.4byte	0x247
@@ -11735,7 +11745,7 @@ spi_id_buffer.16929:
 	.byte	0x5
 	.byte	0x48
 	.uleb128 0x39
-	.4byte	.LASF1284
+	.4byte	.LASF1286
 	.byte	0x5a
 	.2byte	0x25e
 	.4byte	0x6c
@@ -11744,7 +11754,7 @@ spi_id_buffer.16929:
 	.byte	0x1c
 	.byte	0x48
 	.uleb128 0x39
-	.4byte	.LASF1285
+	.4byte	.LASF1287
 	.byte	0x5a
 	.2byte	0x25f
 	.4byte	0x6c
@@ -11753,49 +11763,49 @@ spi_id_buffer.16929:
 	.byte	0x1b
 	.byte	0x48
 	.uleb128 0x1d
-	.4byte	.LASF1286
+	.4byte	.LASF1288
 	.byte	0x5a
 	.2byte	0x264
-	.4byte	0x2ac4
+	.4byte	0x2ada
 	.byte	0x50
 	.uleb128 0x1d
-	.4byte	.LASF1287
+	.4byte	.LASF1289
 	.byte	0x5a
 	.2byte	0x265
 	.4byte	0x2d
 	.byte	0x88
 	.uleb128 0x1d
-	.4byte	.LASF1288
+	.4byte	.LASF1290
 	.byte	0x5a
 	.2byte	0x266
-	.4byte	0x2b5d
+	.4byte	0x2b73
 	.byte	0x90
 	.uleb128 0x1d
-	.4byte	.LASF1289
+	.4byte	.LASF1291
 	.byte	0x5a
 	.2byte	0x267
-	.4byte	0x1ebb
+	.4byte	0x1ed1
 	.byte	0xc0
 	.uleb128 0x1d
-	.4byte	.LASF1290
+	.4byte	.LASF1292
 	.byte	0x5a
 	.2byte	0x268
-	.4byte	0x5760
+	.4byte	0x5776
 	.byte	0xd8
 	.uleb128 0x1d
-	.4byte	.LASF1291
+	.4byte	.LASF1293
 	.byte	0x5a
 	.2byte	0x269
 	.4byte	0x2c6
 	.byte	0xe0
 	.uleb128 0x1d
-	.4byte	.LASF1292
+	.4byte	.LASF1294
 	.byte	0x5a
 	.2byte	0x26a
 	.4byte	0x2c6
 	.byte	0xe4
 	.uleb128 0x39
-	.4byte	.LASF1293
+	.4byte	.LASF1295
 	.byte	0x5a
 	.2byte	0x26b
 	.4byte	0x6c
@@ -11804,7 +11814,7 @@ spi_id_buffer.16929:
 	.byte	0x1d
 	.byte	0xe8
 	.uleb128 0x39
-	.4byte	.LASF1294
+	.4byte	.LASF1296
 	.byte	0x5a
 	.2byte	0x26c
 	.4byte	0x6c
@@ -11813,7 +11823,7 @@ spi_id_buffer.16929:
 	.byte	0x1c
 	.byte	0xe8
 	.uleb128 0x39
-	.4byte	.LASF1295
+	.4byte	.LASF1297
 	.byte	0x5a
 	.2byte	0x26d
 	.4byte	0x6c
@@ -11822,7 +11832,7 @@ spi_id_buffer.16929:
 	.byte	0x1b
 	.byte	0xe8
 	.uleb128 0x39
-	.4byte	.LASF1296
+	.4byte	.LASF1298
 	.byte	0x5a
 	.2byte	0x26e
 	.4byte	0x6c
@@ -11831,7 +11841,7 @@ spi_id_buffer.16929:
 	.byte	0x1a
 	.byte	0xe8
 	.uleb128 0x39
-	.4byte	.LASF1297
+	.4byte	.LASF1299
 	.byte	0x5a
 	.2byte	0x26f
 	.4byte	0x6c
@@ -11840,7 +11850,7 @@ spi_id_buffer.16929:
 	.byte	0x19
 	.byte	0xe8
 	.uleb128 0x39
-	.4byte	.LASF1298
+	.4byte	.LASF1300
 	.byte	0x5a
 	.2byte	0x270
 	.4byte	0x247
@@ -11849,7 +11859,7 @@ spi_id_buffer.16929:
 	.byte	0
 	.byte	0xe8
 	.uleb128 0x39
-	.4byte	.LASF1299
+	.4byte	.LASF1301
 	.byte	0x5a
 	.2byte	0x271
 	.4byte	0x6c
@@ -11858,7 +11868,7 @@ spi_id_buffer.16929:
 	.byte	0x17
 	.byte	0xe8
 	.uleb128 0x39
-	.4byte	.LASF1300
+	.4byte	.LASF1302
 	.byte	0x5a
 	.2byte	0x272
 	.4byte	0x6c
@@ -11867,7 +11877,7 @@ spi_id_buffer.16929:
 	.byte	0x16
 	.byte	0xe8
 	.uleb128 0x39
-	.4byte	.LASF1301
+	.4byte	.LASF1303
 	.byte	0x5a
 	.2byte	0x273
 	.4byte	0x6c
@@ -11876,7 +11886,7 @@ spi_id_buffer.16929:
 	.byte	0x15
 	.byte	0xe8
 	.uleb128 0x39
-	.4byte	.LASF1302
+	.4byte	.LASF1304
 	.byte	0x5a
 	.2byte	0x274
 	.4byte	0x6c
@@ -11885,7 +11895,7 @@ spi_id_buffer.16929:
 	.byte	0x14
 	.byte	0xe8
 	.uleb128 0x39
-	.4byte	.LASF1303
+	.4byte	.LASF1305
 	.byte	0x5a
 	.2byte	0x275
 	.4byte	0x6c
@@ -11894,84 +11904,84 @@ spi_id_buffer.16929:
 	.byte	0x13
 	.byte	0xe8
 	.uleb128 0x1d
-	.4byte	.LASF1304
+	.4byte	.LASF1306
 	.byte	0x5a
 	.2byte	0x276
 	.4byte	0x6c
 	.byte	0xec
 	.uleb128 0x1d
-	.4byte	.LASF1305
+	.4byte	.LASF1307
 	.byte	0x5a
 	.2byte	0x277
-	.4byte	0x52db
+	.4byte	0x52f1
 	.byte	0xf0
 	.uleb128 0x1d
-	.4byte	.LASF1306
+	.4byte	.LASF1308
 	.byte	0x5a
 	.2byte	0x278
-	.4byte	0x52b1
+	.4byte	0x52c7
 	.byte	0xf4
 	.uleb128 0x1d
-	.4byte	.LASF1307
+	.4byte	.LASF1309
 	.byte	0x5a
 	.2byte	0x279
 	.4byte	0xbb
 	.byte	0xf8
 	.uleb128 0x1d
-	.4byte	.LASF1308
+	.4byte	.LASF1310
 	.byte	0x5a
 	.2byte	0x27a
 	.4byte	0xbb
 	.byte	0xfc
 	.uleb128 0x2c
-	.4byte	.LASF1309
+	.4byte	.LASF1311
 	.byte	0x5a
 	.2byte	0x27b
 	.4byte	0x2d
 	.2byte	0x100
 	.uleb128 0x2c
-	.4byte	.LASF1310
+	.4byte	.LASF1312
 	.byte	0x5a
 	.2byte	0x27c
 	.4byte	0x2d
 	.2byte	0x108
 	.uleb128 0x2c
-	.4byte	.LASF1311
+	.4byte	.LASF1313
 	.byte	0x5a
 	.2byte	0x27d
 	.4byte	0x2d
 	.2byte	0x110
 	.uleb128 0x2c
-	.4byte	.LASF1312
+	.4byte	.LASF1314
 	.byte	0x5a
 	.2byte	0x27e
 	.4byte	0x2d
 	.2byte	0x118
 	.uleb128 0x2c
-	.4byte	.LASF1313
+	.4byte	.LASF1315
 	.byte	0x5a
 	.2byte	0x280
-	.4byte	0x5766
+	.4byte	0x577c
 	.2byte	0x120
 	.uleb128 0x2c
-	.4byte	.LASF1314
+	.4byte	.LASF1316
 	.byte	0x5a
 	.2byte	0x281
-	.4byte	0x577c
+	.4byte	0x5792
 	.2byte	0x128
 	.uleb128 0x2b
 	.string	"qos"
 	.byte	0x5a
 	.2byte	0x282
-	.4byte	0x5787
+	.4byte	0x579d
 	.2byte	0x130
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF1315
+	.4byte	.LASF1317
 	.byte	0xd0
 	.byte	0x5c
 	.byte	0x38
-	.4byte	0x5755
+	.4byte	0x576b
 	.uleb128 0xe
 	.4byte	.LASF62
 	.byte	0x5c
@@ -11985,7 +11995,7 @@ spi_id_buffer.16929:
 	.4byte	0xbb
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF734
+	.4byte	.LASF736
 	.byte	0x5c
 	.byte	0x3b
 	.4byte	0x2f1
@@ -11997,79 +12007,79 @@ spi_id_buffer.16929:
 	.4byte	0x898
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1290
+	.4byte	.LASF1292
 	.byte	0x5c
 	.byte	0x3d
-	.4byte	0x5760
+	.4byte	0x5776
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1316
+	.4byte	.LASF1318
 	.byte	0x5c
 	.byte	0x3e
-	.4byte	0x2ac4
+	.4byte	0x2ada
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1287
+	.4byte	.LASF1289
 	.byte	0x5c
 	.byte	0x3f
 	.4byte	0x2d
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF1317
+	.4byte	.LASF1319
 	.byte	0x5c
 	.byte	0x40
-	.4byte	0x2aa2
+	.4byte	0x2ab8
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF1318
+	.4byte	.LASF1320
 	.byte	0x5c
 	.byte	0x41
-	.4byte	0x2aa2
+	.4byte	0x2ab8
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF1319
+	.4byte	.LASF1321
 	.byte	0x5c
 	.byte	0x42
-	.4byte	0x2aa2
+	.4byte	0x2ab8
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF1320
+	.4byte	.LASF1322
 	.byte	0x5c
 	.byte	0x43
-	.4byte	0x2aa2
+	.4byte	0x2ab8
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF1321
+	.4byte	.LASF1323
 	.byte	0x5c
 	.byte	0x44
-	.4byte	0x2aa2
+	.4byte	0x2ab8
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF1322
+	.4byte	.LASF1324
 	.byte	0x5c
 	.byte	0x45
 	.4byte	0x2d
 	.byte	0x98
 	.uleb128 0xe
-	.4byte	.LASF1323
+	.4byte	.LASF1325
 	.byte	0x5c
 	.byte	0x46
 	.4byte	0x2d
 	.byte	0xa0
 	.uleb128 0xe
-	.4byte	.LASF1324
+	.4byte	.LASF1326
 	.byte	0x5c
 	.byte	0x47
 	.4byte	0x2d
 	.byte	0xa8
 	.uleb128 0xe
-	.4byte	.LASF1325
+	.4byte	.LASF1327
 	.byte	0x5c
 	.byte	0x48
 	.4byte	0x2d
 	.byte	0xb0
 	.uleb128 0xe
-	.4byte	.LASF1326
+	.4byte	.LASF1328
 	.byte	0x5c
 	.byte	0x49
 	.4byte	0x2d
@@ -12078,10 +12088,10 @@ spi_id_buffer.16929:
 	.string	"dev"
 	.byte	0x5c
 	.byte	0x4a
-	.4byte	0x4fbd
+	.4byte	0x4fd3
 	.byte	0xc0
 	.uleb128 0x37
-	.4byte	.LASF819
+	.4byte	.LASF821
 	.byte	0x5c
 	.byte	0x4b
 	.4byte	0x247
@@ -12090,7 +12100,7 @@ spi_id_buffer.16929:
 	.byte	0x7
 	.byte	0xc8
 	.uleb128 0x37
-	.4byte	.LASF1327
+	.4byte	.LASF1329
 	.byte	0x5c
 	.byte	0x4c
 	.4byte	0x247
@@ -12101,83 +12111,83 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5653
+	.4byte	0x5669
 	.uleb128 0x1a
-	.4byte	.LASF1328
+	.4byte	.LASF1330
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x575b
+	.4byte	0x5771
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x530b
+	.4byte	0x5321
 	.uleb128 0x10
-	.4byte	0x577c
+	.4byte	0x5792
 	.uleb128 0x11
-	.4byte	0x4fbd
+	.4byte	0x4fd3
 	.uleb128 0x11
 	.4byte	0x115
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x576c
+	.4byte	0x5782
 	.uleb128 0x1a
-	.4byte	.LASF1329
+	.4byte	.LASF1331
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5782
+	.4byte	0x5798
 	.uleb128 0x1b
-	.4byte	.LASF1330
+	.4byte	.LASF1332
 	.byte	0xd8
 	.byte	0x5a
 	.2byte	0x296
-	.4byte	0x57dc
+	.4byte	0x57f2
 	.uleb128 0x24
 	.string	"ops"
 	.byte	0x5a
 	.2byte	0x297
-	.4byte	0x4e70
+	.4byte	0x4e86
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1331
+	.4byte	.LASF1333
 	.byte	0x5a
 	.2byte	0x298
-	.4byte	0x57ec
+	.4byte	0x5802
 	.byte	0xb8
 	.uleb128 0x1d
-	.4byte	.LASF1332
+	.4byte	.LASF1334
 	.byte	0x5a
 	.2byte	0x299
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0xc0
 	.uleb128 0x1d
-	.4byte	.LASF1333
+	.4byte	.LASF1335
 	.byte	0x5a
 	.2byte	0x29a
-	.4byte	0x52ab
+	.4byte	0x52c1
 	.byte	0xc8
 	.uleb128 0x1d
-	.4byte	.LASF1334
+	.4byte	.LASF1336
 	.byte	0x5a
 	.2byte	0x29b
-	.4byte	0x52ab
+	.4byte	0x52c1
 	.byte	0xd0
 	.byte	0
 	.uleb128 0x10
-	.4byte	0x57ec
+	.4byte	0x5802
 	.uleb128 0x11
-	.4byte	0x4fbd
+	.4byte	0x4fd3
 	.uleb128 0x11
 	.4byte	0x247
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x57dc
+	.4byte	0x57f2
 	.uleb128 0xf
-	.4byte	.LASF1335
+	.4byte	.LASF1337
 	.byte	0x28
 	.byte	0x5d
 	.byte	0xf
-	.4byte	0x5853
+	.4byte	0x5869
 	.uleb128 0xe
 	.4byte	.LASF100
 	.byte	0x5d
@@ -12185,31 +12195,31 @@ spi_id_buffer.16929:
 	.4byte	0x866
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1336
+	.4byte	.LASF1338
 	.byte	0x5d
 	.byte	0x12
 	.4byte	0xbb
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1337
+	.4byte	.LASF1339
 	.byte	0x5d
 	.byte	0x13
 	.4byte	0xbb
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1338
+	.4byte	.LASF1340
 	.byte	0x5d
 	.byte	0x14
 	.4byte	0xbb
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF1339
+	.4byte	.LASF1341
 	.byte	0x5d
 	.byte	0x15
 	.4byte	0xbb
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1340
+	.4byte	.LASF1342
 	.byte	0x5d
 	.byte	0x16
 	.4byte	0x2d
@@ -12222,24 +12232,24 @@ spi_id_buffer.16929:
 	.byte	0x20
 	.byte	0
 	.uleb128 0x13
-	.4byte	.LASF1341
+	.4byte	.LASF1343
 	.byte	0x5d
 	.byte	0x4a
-	.4byte	0x57f2
+	.4byte	0x5808
 	.uleb128 0xf
-	.4byte	.LASF1342
+	.4byte	.LASF1344
 	.byte	0x10
 	.byte	0x5e
 	.byte	0x13
-	.4byte	0x5883
+	.4byte	0x5899
 	.uleb128 0xe
-	.4byte	.LASF1343
+	.4byte	.LASF1345
 	.byte	0x5e
 	.byte	0x15
 	.4byte	0x45b
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1344
+	.4byte	.LASF1346
 	.byte	0x5e
 	.byte	0x1a
 	.4byte	0x247
@@ -12247,13 +12257,13 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5889
+	.4byte	0x589f
 	.uleb128 0xf
-	.4byte	.LASF1345
+	.4byte	.LASF1347
 	.byte	0xd0
 	.byte	0x5b
 	.byte	0x7a
-	.4byte	0x59d7
+	.4byte	0x59ed
 	.uleb128 0xe
 	.4byte	.LASF62
 	.byte	0x5b
@@ -12261,133 +12271,133 @@ spi_id_buffer.16929:
 	.4byte	0x55
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1346
+	.4byte	.LASF1348
 	.byte	0x5b
 	.byte	0x7c
 	.4byte	0x55
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1347
+	.4byte	.LASF1349
 	.byte	0x5b
 	.byte	0x7d
-	.4byte	0x4fbd
+	.4byte	0x4fd3
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1348
+	.4byte	.LASF1350
 	.byte	0x5b
 	.byte	0x7e
-	.4byte	0x59d7
+	.4byte	0x59ed
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1349
+	.4byte	.LASF1351
 	.byte	0x5b
 	.byte	0x7f
-	.4byte	0x59d7
+	.4byte	0x59ed
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1350
+	.4byte	.LASF1352
 	.byte	0x5b
 	.byte	0x80
-	.4byte	0x59d7
+	.4byte	0x59ed
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF1351
+	.4byte	.LASF1353
 	.byte	0x5b
 	.byte	0x82
-	.4byte	0x5b26
+	.4byte	0x5b3c
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF1174
+	.4byte	.LASF1176
 	.byte	0x5b
 	.byte	0x83
-	.4byte	0x5b40
+	.4byte	0x5b56
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF1352
+	.4byte	.LASF1354
 	.byte	0x5b
 	.byte	0x84
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF1353
+	.4byte	.LASF1355
 	.byte	0x5b
 	.byte	0x85
-	.4byte	0x52ab
+	.4byte	0x52c1
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF1354
+	.4byte	.LASF1356
 	.byte	0x5b
 	.byte	0x86
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF1355
+	.4byte	.LASF1357
 	.byte	0x5b
 	.byte	0x87
-	.4byte	0x52ab
+	.4byte	0x52c1
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF1356
+	.4byte	.LASF1358
 	.byte	0x5b
 	.byte	0x89
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF1247
+	.4byte	.LASF1249
 	.byte	0x5b
 	.byte	0x8a
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x68
 	.uleb128 0xe
-	.4byte	.LASF1193
+	.4byte	.LASF1195
 	.byte	0x5b
 	.byte	0x8c
-	.4byte	0x5b5a
+	.4byte	0x5b70
 	.byte	0x70
 	.uleb128 0xe
-	.4byte	.LASF1194
+	.4byte	.LASF1196
 	.byte	0x5b
 	.byte	0x8d
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF1357
+	.4byte	.LASF1359
 	.byte	0x5b
 	.byte	0x8f
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF1358
+	.4byte	.LASF1360
 	.byte	0x5b
 	.byte	0x91
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x88
 	.uleb128 0x12
 	.string	"pm"
 	.byte	0x5b
 	.byte	0x93
-	.4byte	0x5b60
+	.4byte	0x5b76
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF1359
+	.4byte	.LASF1361
 	.byte	0x5b
 	.byte	0x95
-	.4byte	0x5b70
+	.4byte	0x5b86
 	.byte	0x98
 	.uleb128 0x12
 	.string	"p"
 	.byte	0x5b
 	.byte	0x97
-	.4byte	0x5b7b
+	.4byte	0x5b91
 	.byte	0xa0
 	.uleb128 0xe
-	.4byte	.LASF1360
+	.4byte	.LASF1362
 	.byte	0x5b
 	.byte	0x98
 	.4byte	0x844
 	.byte	0xa8
 	.uleb128 0xe
-	.4byte	.LASF1361
+	.4byte	.LASF1363
 	.byte	0x5b
 	.byte	0x9a
 	.4byte	0x247
@@ -12419,27 +12429,27 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x59dd
+	.4byte	0x59f3
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x48ab
+	.4byte	0x48c1
 	.uleb128 0x16
 	.4byte	0xbb
-	.4byte	0x59f7
+	.4byte	0x5a0d
 	.uleb128 0x11
-	.4byte	0x4fbd
+	.4byte	0x4fd3
 	.uleb128 0x11
-	.4byte	0x59f7
+	.4byte	0x5a0d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x59fd
+	.4byte	0x5a13
 	.uleb128 0x1b
-	.4byte	.LASF1362
+	.4byte	.LASF1364
 	.byte	0xa8
 	.byte	0x5b
 	.2byte	0x12a
-	.4byte	0x5b26
+	.4byte	0x5b3c
 	.uleb128 0x1d
 	.4byte	.LASF62
 	.byte	0x5b
@@ -12450,103 +12460,103 @@ spi_id_buffer.16929:
 	.string	"bus"
 	.byte	0x5b
 	.2byte	0x12c
-	.4byte	0x5883
+	.4byte	0x5899
 	.byte	0x8
 	.uleb128 0x1d
-	.4byte	.LASF278
+	.4byte	.LASF280
 	.byte	0x5b
 	.2byte	0x12e
-	.4byte	0x5c0f
+	.4byte	0x5c25
 	.byte	0x10
 	.uleb128 0x1d
-	.4byte	.LASF1363
+	.4byte	.LASF1365
 	.byte	0x5b
 	.2byte	0x12f
 	.4byte	0x55
 	.byte	0x18
 	.uleb128 0x1d
-	.4byte	.LASF1364
+	.4byte	.LASF1366
 	.byte	0x5b
 	.2byte	0x131
 	.4byte	0x247
 	.byte	0x20
 	.uleb128 0x1d
-	.4byte	.LASF1365
+	.4byte	.LASF1367
 	.byte	0x5b
 	.2byte	0x132
-	.4byte	0x5be7
+	.4byte	0x5bfd
 	.byte	0x24
 	.uleb128 0x1d
-	.4byte	.LASF1366
+	.4byte	.LASF1368
 	.byte	0x5b
 	.2byte	0x134
-	.4byte	0x5c1f
+	.4byte	0x5c35
 	.byte	0x28
 	.uleb128 0x1d
-	.4byte	.LASF1367
+	.4byte	.LASF1369
 	.byte	0x5b
 	.2byte	0x135
-	.4byte	0x5c2f
+	.4byte	0x5c45
 	.byte	0x30
 	.uleb128 0x1d
-	.4byte	.LASF1352
+	.4byte	.LASF1354
 	.byte	0x5b
 	.2byte	0x137
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x38
 	.uleb128 0x1d
-	.4byte	.LASF1353
+	.4byte	.LASF1355
 	.byte	0x5b
 	.2byte	0x138
-	.4byte	0x52ab
+	.4byte	0x52c1
 	.byte	0x40
 	.uleb128 0x1d
-	.4byte	.LASF1354
+	.4byte	.LASF1356
 	.byte	0x5b
 	.2byte	0x139
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x48
 	.uleb128 0x1d
-	.4byte	.LASF1355
+	.4byte	.LASF1357
 	.byte	0x5b
 	.2byte	0x13a
-	.4byte	0x52ab
+	.4byte	0x52c1
 	.byte	0x50
 	.uleb128 0x1d
-	.4byte	.LASF1193
+	.4byte	.LASF1195
 	.byte	0x5b
 	.2byte	0x13b
-	.4byte	0x5b5a
+	.4byte	0x5b70
 	.byte	0x58
 	.uleb128 0x1d
-	.4byte	.LASF1194
+	.4byte	.LASF1196
 	.byte	0x5b
 	.2byte	0x13c
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x60
 	.uleb128 0x1d
-	.4byte	.LASF1243
+	.4byte	.LASF1245
 	.byte	0x5b
 	.2byte	0x13d
-	.4byte	0x59d7
+	.4byte	0x59ed
 	.byte	0x68
 	.uleb128 0x24
 	.string	"pm"
 	.byte	0x5b
 	.2byte	0x13f
-	.4byte	0x5b60
+	.4byte	0x5b76
 	.byte	0x70
 	.uleb128 0x1d
-	.4byte	.LASF1368
+	.4byte	.LASF1370
 	.byte	0x5b
 	.2byte	0x140
-	.4byte	0x52ab
+	.4byte	0x52c1
 	.byte	0x78
 	.uleb128 0x24
 	.string	"p"
 	.byte	0x5b
 	.2byte	0x142
-	.4byte	0x5c3a
+	.4byte	0x5c50
 	.byte	0x80
 	.uleb128 0x1d
 	.4byte	.LASF68
@@ -12575,50 +12585,50 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x59e3
+	.4byte	0x59f9
 	.uleb128 0x16
 	.4byte	0xbb
-	.4byte	0x5b40
+	.4byte	0x5b56
 	.uleb128 0x11
-	.4byte	0x4fbd
+	.4byte	0x4fd3
 	.uleb128 0x11
-	.4byte	0x4da1
+	.4byte	0x4db7
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5b2c
+	.4byte	0x5b42
 	.uleb128 0x16
 	.4byte	0xbb
-	.4byte	0x5b5a
+	.4byte	0x5b70
 	.uleb128 0x11
-	.4byte	0x4fbd
+	.4byte	0x4fd3
 	.uleb128 0x11
-	.4byte	0x4e65
+	.4byte	0x4e7b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5b46
+	.4byte	0x5b5c
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4fa9
+	.4byte	0x4fbf
 	.uleb128 0x1a
-	.4byte	.LASF1359
+	.4byte	.LASF1361
 	.uleb128 0x3
-	.4byte	0x5b66
+	.4byte	0x5b7c
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5b6b
+	.4byte	0x5b81
 	.uleb128 0x1a
-	.4byte	.LASF1369
+	.4byte	.LASF1371
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5b76
+	.4byte	0x5b8c
 	.uleb128 0x1b
-	.4byte	.LASF1370
+	.4byte	.LASF1372
 	.byte	0x30
 	.byte	0x5b
 	.2byte	0x249
-	.4byte	0x5bdc
+	.4byte	0x5bf2
 	.uleb128 0x1d
 	.4byte	.LASF62
 	.byte	0x5b
@@ -12626,88 +12636,88 @@ spi_id_buffer.16929:
 	.4byte	0x55
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1243
+	.4byte	.LASF1245
 	.byte	0x5b
 	.2byte	0x24b
-	.4byte	0x59d7
+	.4byte	0x59ed
 	.byte	0x8
 	.uleb128 0x1d
-	.4byte	.LASF1174
+	.4byte	.LASF1176
 	.byte	0x5b
 	.2byte	0x24c
-	.4byte	0x5b40
+	.4byte	0x5b56
 	.byte	0x10
 	.uleb128 0x1d
-	.4byte	.LASF1371
+	.4byte	.LASF1373
 	.byte	0x5b
 	.2byte	0x24d
-	.4byte	0x5ddf
+	.4byte	0x5df5
 	.byte	0x18
 	.uleb128 0x1d
-	.4byte	.LASF829
+	.4byte	.LASF831
 	.byte	0x5b
 	.2byte	0x24f
-	.4byte	0x52ab
+	.4byte	0x52c1
 	.byte	0x20
 	.uleb128 0x24
 	.string	"pm"
 	.byte	0x5b
 	.2byte	0x251
-	.4byte	0x5b60
+	.4byte	0x5b76
 	.byte	0x28
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x5b81
+	.4byte	0x5b97
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5bdc
+	.4byte	0x5bf2
 	.uleb128 0x25
-	.4byte	.LASF1365
+	.4byte	.LASF1367
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x5b
 	.byte	0xf9
-	.4byte	0x5c0a
+	.4byte	0x5c20
 	.uleb128 0xc
-	.4byte	.LASF1372
+	.4byte	.LASF1374
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1373
+	.4byte	.LASF1375
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1374
+	.4byte	.LASF1376
 	.byte	0x2
 	.byte	0
 	.uleb128 0x1a
 	.4byte	.LASF128
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5c0a
+	.4byte	0x5c20
 	.uleb128 0x1a
-	.4byte	.LASF1375
+	.4byte	.LASF1377
 	.uleb128 0x3
-	.4byte	0x5c15
+	.4byte	0x5c2b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5c1a
+	.4byte	0x5c30
 	.uleb128 0x1a
-	.4byte	.LASF1376
+	.4byte	.LASF1378
 	.uleb128 0x3
-	.4byte	0x5c25
+	.4byte	0x5c3b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5c2a
+	.4byte	0x5c40
 	.uleb128 0x1a
-	.4byte	.LASF1377
+	.4byte	.LASF1379
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5c35
+	.4byte	0x5c4b
 	.uleb128 0x1b
-	.4byte	.LASF1242
+	.4byte	.LASF1244
 	.byte	0x98
 	.byte	0x5b
 	.2byte	0x1ae
-	.4byte	0x5d42
+	.4byte	0x5d58
 	.uleb128 0x1d
 	.4byte	.LASF62
 	.byte	0x5b
@@ -12715,88 +12725,88 @@ spi_id_buffer.16929:
 	.4byte	0x55
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF278
+	.4byte	.LASF280
 	.byte	0x5b
 	.2byte	0x1b0
-	.4byte	0x5c0f
+	.4byte	0x5c25
 	.byte	0x8
 	.uleb128 0x1d
-	.4byte	.LASF1378
+	.4byte	.LASF1380
 	.byte	0x5b
 	.2byte	0x1b2
-	.4byte	0x59d7
+	.4byte	0x59ed
 	.byte	0x10
 	.uleb128 0x1d
-	.4byte	.LASF1349
+	.4byte	.LASF1351
 	.byte	0x5b
 	.2byte	0x1b3
-	.4byte	0x59d7
+	.4byte	0x59ed
 	.byte	0x18
 	.uleb128 0x1d
-	.4byte	.LASF1379
+	.4byte	.LASF1381
 	.byte	0x5b
 	.2byte	0x1b4
-	.4byte	0x48c9
+	.4byte	0x48df
 	.byte	0x20
 	.uleb128 0x1d
-	.4byte	.LASF1380
+	.4byte	.LASF1382
 	.byte	0x5b
 	.2byte	0x1b6
-	.4byte	0x5b40
+	.4byte	0x5b56
 	.byte	0x28
 	.uleb128 0x1d
-	.4byte	.LASF1371
+	.4byte	.LASF1373
 	.byte	0x5b
 	.2byte	0x1b7
-	.4byte	0x5d5c
+	.4byte	0x5d72
 	.byte	0x30
 	.uleb128 0x1d
-	.4byte	.LASF1381
+	.4byte	.LASF1383
 	.byte	0x5b
 	.2byte	0x1b9
-	.4byte	0x5d73
+	.4byte	0x5d89
 	.byte	0x38
 	.uleb128 0x1d
-	.4byte	.LASF1382
+	.4byte	.LASF1384
 	.byte	0x5b
 	.2byte	0x1ba
-	.4byte	0x52ab
+	.4byte	0x52c1
 	.byte	0x40
 	.uleb128 0x1d
-	.4byte	.LASF1383
+	.4byte	.LASF1385
 	.byte	0x5b
 	.2byte	0x1bc
-	.4byte	0x529a
+	.4byte	0x52b0
 	.byte	0x48
 	.uleb128 0x1d
-	.4byte	.LASF1384
+	.4byte	.LASF1386
 	.byte	0x5b
 	.2byte	0x1be
-	.4byte	0x4c4e
+	.4byte	0x4c64
 	.byte	0x50
 	.uleb128 0x1d
-	.4byte	.LASF1166
+	.4byte	.LASF1168
 	.byte	0x5b
 	.2byte	0x1bf
-	.4byte	0x5d88
+	.4byte	0x5d9e
 	.byte	0x58
 	.uleb128 0x1d
-	.4byte	.LASF1167
+	.4byte	.LASF1169
 	.byte	0x5b
 	.2byte	0x1c1
-	.4byte	0x5da3
+	.4byte	0x5db9
 	.byte	0x60
 	.uleb128 0x24
 	.string	"pm"
 	.byte	0x5b
 	.2byte	0x1c3
-	.4byte	0x5b60
+	.4byte	0x5b76
 	.byte	0x68
 	.uleb128 0x24
 	.string	"p"
 	.byte	0x5b
 	.2byte	0x1c5
-	.4byte	0x5b7b
+	.4byte	0x5b91
 	.byte	0x70
 	.uleb128 0x1d
 	.4byte	.LASF68
@@ -12825,160 +12835,160 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x16
 	.4byte	0x1fa
-	.4byte	0x5d56
+	.4byte	0x5d6c
 	.uleb128 0x11
-	.4byte	0x4fbd
+	.4byte	0x4fd3
 	.uleb128 0x11
-	.4byte	0x5d56
+	.4byte	0x5d6c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x226
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5d42
+	.4byte	0x5d58
 	.uleb128 0x10
-	.4byte	0x5d6d
+	.4byte	0x5d83
 	.uleb128 0x11
-	.4byte	0x5d6d
+	.4byte	0x5d83
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5c40
+	.4byte	0x5c56
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5d62
+	.4byte	0x5d78
 	.uleb128 0x16
-	.4byte	0x2a23
-	.4byte	0x5d88
+	.4byte	0x2a39
+	.4byte	0x5d9e
 	.uleb128 0x11
-	.4byte	0x4fbd
+	.4byte	0x4fd3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5d79
+	.4byte	0x5d8f
 	.uleb128 0x10
-	.4byte	0x5da3
+	.4byte	0x5db9
 	.uleb128 0x11
-	.4byte	0x4fbd
+	.4byte	0x4fd3
 	.uleb128 0x11
-	.4byte	0x4c84
+	.4byte	0x4c9a
 	.uleb128 0x11
-	.4byte	0x4c8a
+	.4byte	0x4ca0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5d8e
+	.4byte	0x5da4
 	.uleb128 0x17
-	.4byte	.LASF1385
+	.4byte	.LASF1387
 	.byte	0x5b
 	.2byte	0x1d2
-	.4byte	0x48c9
+	.4byte	0x48df
 	.uleb128 0x17
-	.4byte	.LASF1386
+	.4byte	.LASF1388
 	.byte	0x5b
 	.2byte	0x1d3
-	.4byte	0x48c9
+	.4byte	0x48df
 	.uleb128 0x16
 	.4byte	0x1fa
-	.4byte	0x5ddf
+	.4byte	0x5df5
 	.uleb128 0x11
-	.4byte	0x4fbd
+	.4byte	0x4fd3
 	.uleb128 0x11
-	.4byte	0x5d56
+	.4byte	0x5d6c
 	.uleb128 0x11
-	.4byte	0x4c84
+	.4byte	0x4c9a
 	.uleb128 0x11
-	.4byte	0x4c8a
+	.4byte	0x4ca0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5dc1
+	.4byte	0x5dd7
 	.uleb128 0x1b
-	.4byte	.LASF1387
+	.4byte	.LASF1389
 	.byte	0x10
 	.byte	0x5b
 	.2byte	0x30b
-	.4byte	0x5e0d
+	.4byte	0x5e23
 	.uleb128 0x1d
-	.4byte	.LASF1388
+	.4byte	.LASF1390
 	.byte	0x5b
 	.2byte	0x310
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1389
+	.4byte	.LASF1391
 	.byte	0x5b
 	.2byte	0x311
 	.4byte	0x2d
 	.byte	0x8
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF1390
+	.4byte	.LASF1392
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5e0d
+	.4byte	0x5e23
 	.uleb128 0x1c
-	.4byte	.LASF1391
+	.4byte	.LASF1393
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x5b
 	.2byte	0x396
-	.4byte	0x5e42
+	.4byte	0x5e58
 	.uleb128 0xc
-	.4byte	.LASF1392
+	.4byte	.LASF1394
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1393
+	.4byte	.LASF1395
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1394
+	.4byte	.LASF1396
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF1395
+	.4byte	.LASF1397
 	.byte	0x3
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1396
+	.4byte	.LASF1398
 	.byte	0x68
 	.byte	0x5b
 	.2byte	0x3a8
-	.4byte	0x5ed2
+	.4byte	0x5ee8
 	.uleb128 0x1d
-	.4byte	.LASF1397
+	.4byte	.LASF1399
 	.byte	0x5b
 	.2byte	0x3a9
 	.4byte	0x2f1
 	.byte	0
 	.uleb128 0x1d
-	.4byte	.LASF1398
+	.4byte	.LASF1400
 	.byte	0x5b
 	.2byte	0x3aa
 	.4byte	0x2f1
 	.byte	0x10
 	.uleb128 0x1d
-	.4byte	.LASF1399
+	.4byte	.LASF1401
 	.byte	0x5b
 	.2byte	0x3ab
 	.4byte	0x2f1
 	.byte	0x20
 	.uleb128 0x1d
-	.4byte	.LASF1400
+	.4byte	.LASF1402
 	.byte	0x5b
 	.2byte	0x3ac
 	.4byte	0x2f1
 	.byte	0x30
 	.uleb128 0x1d
-	.4byte	.LASF1401
+	.4byte	.LASF1403
 	.byte	0x5b
 	.2byte	0x3ad
 	.4byte	0x247
 	.byte	0x40
 	.uleb128 0x1d
-	.4byte	.LASF705
+	.4byte	.LASF707
 	.byte	0x5b
 	.2byte	0x3ae
-	.4byte	0x5e18
+	.4byte	0x5e2e
 	.byte	0x44
 	.uleb128 0x1d
 	.4byte	.LASF68
@@ -13006,98 +13016,98 @@ spi_id_buffer.16929:
 	.byte	0x60
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF1402
+	.4byte	.LASF1404
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5ed2
+	.4byte	0x5ee8
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x578d
+	.4byte	0x57a3
 	.uleb128 0x1a
-	.4byte	.LASF1403
+	.4byte	.LASF1405
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5ee3
+	.4byte	0x5ef9
 	.uleb128 0x1a
-	.4byte	.LASF1404
+	.4byte	.LASF1406
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5eee
+	.4byte	0x5f04
 	.uleb128 0x1a
-	.4byte	.LASF1405
+	.4byte	.LASF1407
 	.uleb128 0x3
-	.4byte	0x5ef9
+	.4byte	0x5f0f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5efe
+	.4byte	0x5f14
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5de5
+	.4byte	0x5dfb
 	.uleb128 0x1a
-	.4byte	.LASF1406
+	.4byte	.LASF1408
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5f0f
+	.4byte	0x5f25
 	.uleb128 0x44
 	.string	"cma"
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5f1a
+	.4byte	0x5f30
 	.uleb128 0x1a
-	.4byte	.LASF1407
+	.4byte	.LASF1409
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5f25
+	.4byte	0x5f3b
 	.uleb128 0x1a
-	.4byte	.LASF1408
+	.4byte	.LASF1410
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5f30
+	.4byte	0x5f46
 	.uleb128 0x1a
-	.4byte	.LASF1244
+	.4byte	.LASF1246
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5f3b
+	.4byte	0x5f51
 	.uleb128 0x1a
-	.4byte	.LASF1245
+	.4byte	.LASF1247
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5f46
+	.4byte	0x5f5c
 	.uleb128 0x17
-	.4byte	.LASF1409
+	.4byte	.LASF1411
 	.byte	0x5b
 	.2byte	0x590
-	.4byte	0x529a
+	.4byte	0x52b0
 	.uleb128 0x17
-	.4byte	.LASF1410
+	.4byte	.LASF1412
 	.byte	0x5b
 	.2byte	0x592
-	.4byte	0x529a
+	.4byte	0x52b0
 	.uleb128 0x13
-	.4byte	.LASF1411
+	.4byte	.LASF1413
 	.byte	0x5f
 	.byte	0x8c
 	.4byte	0x247
 	.uleb128 0x1c
-	.4byte	.LASF1412
+	.4byte	.LASF1414
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x5f
 	.2byte	0x130
-	.4byte	0x5f98
+	.4byte	0x5fae
 	.uleb128 0xc
-	.4byte	.LASF1413
+	.4byte	.LASF1415
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1414
+	.4byte	.LASF1416
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1415
+	.4byte	.LASF1417
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x5fae
-	.4byte	0x5fae
+	.4byte	0x5fc4
+	.4byte	0x5fc4
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x1
@@ -13107,228 +13117,228 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5fb4
+	.4byte	0x5fca
 	.uleb128 0x1a
-	.4byte	.LASF1416
+	.4byte	.LASF1418
 	.uleb128 0x17
-	.4byte	.LASF1417
+	.4byte	.LASF1419
 	.byte	0x5f
 	.2byte	0x13b
-	.4byte	0x5f98
+	.4byte	0x5fae
 	.uleb128 0x25
-	.4byte	.LASF1418
+	.4byte	.LASF1420
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x60
 	.byte	0xb
-	.4byte	0x601e
+	.4byte	0x6034
 	.uleb128 0xc
-	.4byte	.LASF1419
+	.4byte	.LASF1421
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1420
+	.4byte	.LASF1422
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF1421
+	.4byte	.LASF1423
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF1422
+	.4byte	.LASF1424
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF1423
+	.4byte	.LASF1425
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF1424
+	.4byte	.LASF1426
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF1425
+	.4byte	.LASF1427
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF1426
+	.4byte	.LASF1428
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF1427
+	.4byte	.LASF1429
 	.byte	0x9
 	.uleb128 0xc
-	.4byte	.LASF1428
+	.4byte	.LASF1430
 	.byte	0xa
 	.uleb128 0xc
-	.4byte	.LASF1429
+	.4byte	.LASF1431
 	.byte	0xb
 	.uleb128 0xc
-	.4byte	.LASF1430
+	.4byte	.LASF1432
 	.byte	0xc
 	.byte	0
 	.uleb128 0x25
-	.4byte	.LASF1431
+	.4byte	.LASF1433
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x60
 	.byte	0x1a
-	.4byte	0x606b
+	.4byte	0x6081
 	.uleb128 0xc
-	.4byte	.LASF1432
+	.4byte	.LASF1434
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1433
+	.4byte	.LASF1435
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF1434
+	.4byte	.LASF1436
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF1435
+	.4byte	.LASF1437
 	.byte	0x3
 	.uleb128 0xc
-	.4byte	.LASF1436
+	.4byte	.LASF1438
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF1437
+	.4byte	.LASF1439
 	.byte	0x5
 	.uleb128 0xc
-	.4byte	.LASF1438
+	.4byte	.LASF1440
 	.byte	0x6
 	.uleb128 0xc
-	.4byte	.LASF1439
+	.4byte	.LASF1441
 	.byte	0x7
 	.uleb128 0xc
-	.4byte	.LASF1440
+	.4byte	.LASF1442
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF1441
+	.4byte	.LASF1443
 	.byte	0x9
 	.byte	0
 	.uleb128 0xf
-	.4byte	.LASF1442
+	.4byte	.LASF1444
 	.byte	0x18
 	.byte	0x60
 	.byte	0x27
-	.4byte	0x609c
+	.4byte	0x60b2
 	.uleb128 0xe
-	.4byte	.LASF1443
+	.4byte	.LASF1445
 	.byte	0x60
 	.byte	0x28
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF739
+	.4byte	.LASF741
 	.byte	0x60
 	.byte	0x29
-	.4byte	0x2d69
+	.4byte	0x2d7f
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1444
+	.4byte	.LASF1446
 	.byte	0x60
 	.byte	0x2a
-	.4byte	0x609c
+	.4byte	0x60b2
 	.byte	0x10
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x100
 	.uleb128 0xf
-	.4byte	.LASF1445
+	.4byte	.LASF1447
 	.byte	0x30
 	.byte	0x1
 	.byte	0xf
-	.4byte	0x61b7
+	.4byte	0x61cd
 	.uleb128 0xe
-	.4byte	.LASF1446
+	.4byte	.LASF1448
 	.byte	0x1
 	.byte	0x10
 	.4byte	0x120
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF1447
+	.4byte	.LASF1449
 	.byte	0x1
 	.byte	0x11
 	.4byte	0x120
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF1448
+	.4byte	.LASF1450
 	.byte	0x1
 	.byte	0x12
 	.4byte	0x120
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF1449
+	.4byte	.LASF1451
 	.byte	0x1
 	.byte	0x13
 	.4byte	0x100
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF1450
+	.4byte	.LASF1452
 	.byte	0x1
 	.byte	0x14
 	.4byte	0x100
 	.byte	0xd
 	.uleb128 0xe
-	.4byte	.LASF1451
+	.4byte	.LASF1453
 	.byte	0x1
 	.byte	0x15
 	.4byte	0x10a
 	.byte	0xe
 	.uleb128 0xe
-	.4byte	.LASF1452
+	.4byte	.LASF1454
 	.byte	0x1
 	.byte	0x16
 	.4byte	0x100
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF1453
+	.4byte	.LASF1455
 	.byte	0x1
 	.byte	0x17
 	.4byte	0x100
 	.byte	0x11
 	.uleb128 0xe
-	.4byte	.LASF1454
+	.4byte	.LASF1456
 	.byte	0x1
 	.byte	0x18
 	.4byte	0x100
 	.byte	0x12
 	.uleb128 0xe
-	.4byte	.LASF1455
+	.4byte	.LASF1457
 	.byte	0x1
 	.byte	0x19
 	.4byte	0x100
 	.byte	0x13
 	.uleb128 0xe
-	.4byte	.LASF1456
+	.4byte	.LASF1458
 	.byte	0x1
 	.byte	0x1a
 	.4byte	0x100
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF1457
+	.4byte	.LASF1459
 	.byte	0x1
 	.byte	0x1b
 	.4byte	0x100
 	.byte	0x15
 	.uleb128 0xe
-	.4byte	.LASF1458
+	.4byte	.LASF1460
 	.byte	0x1
 	.byte	0x1c
 	.4byte	0x100
 	.byte	0x16
 	.uleb128 0xe
-	.4byte	.LASF1459
+	.4byte	.LASF1461
 	.byte	0x1
 	.byte	0x1d
 	.4byte	0x100
 	.byte	0x17
 	.uleb128 0xe
-	.4byte	.LASF1460
+	.4byte	.LASF1462
 	.byte	0x1
 	.byte	0x1e
 	.4byte	0x120
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF1461
+	.4byte	.LASF1463
 	.byte	0x1
 	.byte	0x1f
 	.4byte	0x100
 	.byte	0x1c
 	.uleb128 0xe
-	.4byte	.LASF1462
+	.4byte	.LASF1464
 	.byte	0x1
 	.byte	0x20
 	.4byte	0x81e
@@ -13340,88 +13350,88 @@ spi_id_buffer.16929:
 	.4byte	0x100
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF1463
+	.4byte	.LASF1465
 	.byte	0x1
 	.byte	0x22
-	.4byte	0x61b7
+	.4byte	0x61cd
 	.byte	0x21
 	.uleb128 0xe
-	.4byte	.LASF1464
+	.4byte	.LASF1466
 	.byte	0x1
 	.byte	0x23
 	.4byte	0x100
 	.byte	0x25
 	.uleb128 0xe
-	.4byte	.LASF1465
+	.4byte	.LASF1467
 	.byte	0x1
 	.byte	0x24
 	.4byte	0x100
 	.byte	0x26
 	.uleb128 0xe
-	.4byte	.LASF1466
+	.4byte	.LASF1468
 	.byte	0x1
 	.byte	0x25
-	.4byte	0x61c7
+	.4byte	0x61dd
 	.byte	0x27
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x100
-	.4byte	0x61c7
+	.4byte	0x61dd
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x3
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x100
-	.4byte	0x61d7
+	.4byte	0x61ed
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x8
 	.byte	0
 	.uleb128 0x45
-	.4byte	.LASF1467
+	.4byte	.LASF1469
 	.byte	0x1
 	.byte	0x30
-	.4byte	0x609c
+	.4byte	0x60b2
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	waveformdata
 	.uleb128 0x45
-	.4byte	.LASF1468
+	.4byte	.LASF1470
 	.byte	0x1
 	.byte	0x3c
-	.4byte	0x6201
+	.4byte	0x6217
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	global_waveform
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x60a2
+	.4byte	0x60b8
 	.uleb128 0x46
-	.4byte	.LASF1471
+	.4byte	.LASF1473
 	.byte	0x1
 	.2byte	0x406
 	.4byte	0x55
-	.8byte	.LFB1554
-	.8byte	.LFE1554-.LFB1554
+	.8byte	.LFB1555
+	.8byte	.LFE1555-.LFB1555
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6258
+	.4byte	0x626e
 	.uleb128 0x47
-	.4byte	.LASF1469
+	.4byte	.LASF1471
 	.byte	0x1
 	.2byte	0x408
 	.4byte	0x55
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x47
-	.4byte	.LASF1470
+	.4byte	.LASF1472
 	.byte	0x1
 	.2byte	0x409
-	.4byte	0x6258
+	.4byte	0x626e
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	spi_id_buffer.16929
+	.8byte	spi_id_buffer.16947
 	.uleb128 0x48
 	.string	"i"
 	.byte	0x1
@@ -13430,85 +13440,85 @@ spi_id_buffer.16929:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x60
-	.4byte	0x6268
+	.4byte	0x627e
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x1f
 	.byte	0
 	.uleb128 0x46
-	.4byte	.LASF1472
+	.4byte	.LASF1474
 	.byte	0x1
 	.2byte	0x3e0
 	.4byte	0xbb
-	.8byte	.LFB1553
-	.8byte	.LFE1553-.LFB1553
+	.8byte	.LFB1554
+	.8byte	.LFE1554-.LFB1554
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x62c1
+	.4byte	0x62d7
 	.uleb128 0x49
-	.4byte	.LASF1475
+	.4byte	.LASF1477
 	.byte	0x1
 	.2byte	0x3e0
 	.4byte	0x45b
 	.4byte	.LLST19
 	.uleb128 0x4a
-	.4byte	.LASF1473
+	.4byte	.LASF1475
 	.byte	0x1
 	.2byte	0x3e2
-	.4byte	0x6201
+	.4byte	0x6217
 	.uleb128 0x4b
 	.8byte	.LVL91
-	.4byte	0x6836
+	.4byte	0x684c
 	.uleb128 0x4b
 	.8byte	.LVL92
-	.4byte	0x6836
+	.4byte	0x684c
 	.byte	0
 	.uleb128 0x46
-	.4byte	.LASF1474
+	.4byte	.LASF1476
 	.byte	0x1
 	.2byte	0x3a8
 	.4byte	0xbb
-	.8byte	.LFB1552
-	.8byte	.LFE1552-.LFB1552
+	.8byte	.LFB1553
+	.8byte	.LFE1553-.LFB1553
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6479
+	.4byte	0x648f
 	.uleb128 0x49
-	.4byte	.LASF1476
+	.4byte	.LASF1478
 	.byte	0x1
 	.2byte	0x3a8
-	.4byte	0x6479
+	.4byte	0x648f
 	.4byte	.LLST10
 	.uleb128 0x49
-	.4byte	.LASF1477
+	.4byte	.LASF1479
 	.byte	0x1
 	.2byte	0x3a8
-	.4byte	0x5fc5
+	.4byte	0x5fdb
 	.4byte	.LLST11
 	.uleb128 0x49
-	.4byte	.LASF1478
+	.4byte	.LASF1480
 	.byte	0x1
 	.2byte	0x3a8
 	.4byte	0xbb
 	.4byte	.LLST12
 	.uleb128 0x47
-	.4byte	.LASF1479
+	.4byte	.LASF1481
 	.byte	0x1
 	.2byte	0x3aa
-	.4byte	0x5fc5
+	.4byte	0x5fdb
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	stype.16893
+	.8byte	stype.16911
 	.uleb128 0x47
-	.4byte	.LASF1480
+	.4byte	.LASF1482
 	.byte	0x1
 	.2byte	0x3ab
 	.4byte	0xbb
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	sftemp.16894
+	.8byte	sftemp.16912
 	.uleb128 0x4a
-	.4byte	.LASF1481
+	.4byte	.LASF1483
 	.byte	0x1
 	.2byte	0x3ac
 	.4byte	0xbb
@@ -13518,118 +13528,118 @@ spi_id_buffer.16929:
 	.2byte	0x3ad
 	.4byte	0xbb
 	.uleb128 0x4c
-	.4byte	0x6642
+	.4byte	0x6658
 	.8byte	.LBB22
 	.4byte	.Ldebug_ranges0+0x60
 	.byte	0x1
 	.2byte	0x3bd
-	.4byte	0x6399
+	.4byte	0x63af
 	.uleb128 0x4d
-	.4byte	0x6653
+	.4byte	0x6669
 	.uleb128 0x4e
 	.4byte	.Ldebug_ranges0+0x60
 	.uleb128 0x4f
-	.4byte	0x665f
+	.4byte	0x6675
 	.uleb128 0x50
-	.4byte	0x666b
+	.4byte	0x6681
 	.4byte	.LLST13
 	.uleb128 0x50
-	.4byte	0x6677
+	.4byte	0x668d
 	.4byte	.LLST14
 	.uleb128 0x51
-	.4byte	0x6683
+	.4byte	0x6699
 	.uleb128 0x1
 	.byte	0x63
 	.byte	0
 	.byte	0
 	.uleb128 0x4c
-	.4byte	0x647f
+	.4byte	0x6495
 	.8byte	.LBB27
 	.4byte	.Ldebug_ranges0+0xa0
 	.byte	0x1
 	.2byte	0x3ce
-	.4byte	0x646b
+	.4byte	0x6481
 	.uleb128 0x4d
-	.4byte	0x6490
+	.4byte	0x64a6
 	.uleb128 0x4d
-	.4byte	0x64a8
+	.4byte	0x64be
 	.uleb128 0x4d
-	.4byte	0x649c
+	.4byte	0x64b2
 	.uleb128 0x4e
 	.4byte	.Ldebug_ranges0+0xa0
 	.uleb128 0x4f
-	.4byte	0x64b4
+	.4byte	0x64ca
 	.uleb128 0x50
-	.4byte	0x64c0
+	.4byte	0x64d6
 	.4byte	.LLST15
 	.uleb128 0x50
-	.4byte	0x64cc
+	.4byte	0x64e2
 	.4byte	.LLST16
 	.uleb128 0x50
-	.4byte	0x64d6
+	.4byte	0x64ec
 	.4byte	.LLST17
 	.uleb128 0x50
-	.4byte	0x64e0
+	.4byte	0x64f6
 	.4byte	.LLST18
 	.uleb128 0x4f
-	.4byte	0x64ec
+	.4byte	0x6502
 	.uleb128 0x52
 	.4byte	.Ldebug_ranges0+0xe0
-	.4byte	0x641b
+	.4byte	0x6431
 	.uleb128 0x4f
-	.4byte	0x64f9
+	.4byte	0x650f
 	.uleb128 0x4f
-	.4byte	0x6505
+	.4byte	0x651b
 	.uleb128 0x4f
-	.4byte	0x6511
+	.4byte	0x6527
 	.uleb128 0x4f
-	.4byte	0x651d
+	.4byte	0x6533
 	.uleb128 0x4f
-	.4byte	0x6529
+	.4byte	0x653f
 	.uleb128 0x4f
-	.4byte	0x6535
+	.4byte	0x654b
 	.byte	0
 	.uleb128 0x4b
 	.8byte	.LVL64
-	.4byte	0x668e
+	.4byte	0x66a4
 	.uleb128 0x4b
 	.8byte	.LVL65
-	.4byte	0x6543
+	.4byte	0x6559
 	.uleb128 0x4b
 	.8byte	.LVL76
-	.4byte	0x668e
+	.4byte	0x66a4
 	.uleb128 0x4b
 	.8byte	.LVL77
-	.4byte	0x6543
+	.4byte	0x6559
 	.uleb128 0x4b
 	.8byte	.LVL78
-	.4byte	0x6836
+	.4byte	0x684c
 	.uleb128 0x4b
 	.8byte	.LVL81
-	.4byte	0x6836
+	.4byte	0x684c
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
 	.8byte	.LVL83
-	.4byte	0x6836
+	.4byte	0x684c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x606b
+	.4byte	0x6081
 	.uleb128 0x53
-	.4byte	.LASF1497
+	.4byte	.LASF1499
 	.byte	0x1
 	.2byte	0x37f
 	.4byte	0xbb
 	.byte	0x1
-	.4byte	0x6543
+	.4byte	0x6559
 	.uleb128 0x54
-	.4byte	.LASF1476
+	.4byte	.LASF1478
 	.byte	0x1
 	.2byte	0x37f
-	.4byte	0x6479
+	.4byte	0x648f
 	.uleb128 0x54
-	.4byte	.LASF1481
+	.4byte	.LASF1483
 	.byte	0x1
 	.2byte	0x37f
 	.4byte	0xbb
@@ -13637,14 +13647,14 @@ spi_id_buffer.16929:
 	.4byte	.LASF150
 	.byte	0x1
 	.2byte	0x37f
-	.4byte	0x5fc5
+	.4byte	0x5fdb
 	.uleb128 0x4a
-	.4byte	.LASF1482
+	.4byte	.LASF1484
 	.byte	0x1
 	.2byte	0x381
 	.4byte	0xbb
 	.uleb128 0x4a
-	.4byte	.LASF1443
+	.4byte	.LASF1445
 	.byte	0x1
 	.2byte	0x382
 	.4byte	0xbb
@@ -13659,163 +13669,163 @@ spi_id_buffer.16929:
 	.2byte	0x383
 	.4byte	0xbb
 	.uleb128 0x4a
-	.4byte	.LASF1483
+	.4byte	.LASF1485
 	.byte	0x1
 	.2byte	0x383
 	.4byte	0xbb
 	.uleb128 0x4a
-	.4byte	.LASF1484
+	.4byte	.LASF1486
 	.byte	0x1
 	.2byte	0x384
 	.4byte	0xbb
 	.uleb128 0x55
 	.uleb128 0x4a
-	.4byte	.LASF1485
+	.4byte	.LASF1487
 	.byte	0x1
 	.2byte	0x398
 	.4byte	0x100
 	.uleb128 0x4a
-	.4byte	.LASF1486
+	.4byte	.LASF1488
 	.byte	0x1
 	.2byte	0x398
 	.4byte	0x100
 	.uleb128 0x4a
-	.4byte	.LASF1487
+	.4byte	.LASF1489
 	.byte	0x1
 	.2byte	0x399
 	.4byte	0x10a
 	.uleb128 0x4a
-	.4byte	.LASF1488
+	.4byte	.LASF1490
 	.byte	0x1
 	.2byte	0x39a
 	.4byte	0x10a
 	.uleb128 0x4a
-	.4byte	.LASF1489
+	.4byte	.LASF1491
 	.byte	0x1
 	.2byte	0x39b
 	.4byte	0x10a
 	.uleb128 0x4a
-	.4byte	.LASF1490
+	.4byte	.LASF1492
 	.byte	0x1
 	.2byte	0x39c
 	.4byte	0x10a
 	.byte	0
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1500
+	.4byte	.LASF1502
 	.byte	0x1
 	.2byte	0x1c1
 	.4byte	0xbb
-	.8byte	.LFB1550
-	.8byte	.LFE1550-.LFB1550
+	.8byte	.LFB1551
+	.8byte	.LFE1551-.LFB1551
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6627
+	.4byte	0x663d
 	.uleb128 0x49
-	.4byte	.LASF822
+	.4byte	.LASF824
 	.byte	0x1
 	.2byte	0x1c1
 	.4byte	0xbb
 	.4byte	.LLST7
 	.uleb128 0x49
-	.4byte	.LASF1481
+	.4byte	.LASF1483
 	.byte	0x1
 	.2byte	0x1c1
 	.4byte	0xbb
 	.4byte	.LLST8
 	.uleb128 0x57
-	.4byte	.LASF1469
+	.4byte	.LASF1471
 	.byte	0x1
 	.2byte	0x1c3
-	.4byte	0x6627
+	.4byte	0x663d
 	.4byte	.LLST9
 	.uleb128 0x4a
-	.4byte	.LASF1491
+	.4byte	.LASF1493
 	.byte	0x1
 	.2byte	0x1c4
 	.4byte	0x6c
 	.uleb128 0x4a
-	.4byte	.LASF1492
+	.4byte	.LASF1494
 	.byte	0x1
 	.2byte	0x1c4
 	.4byte	0x6c
 	.uleb128 0x4a
-	.4byte	.LASF1493
+	.4byte	.LASF1495
 	.byte	0x1
 	.2byte	0x1c4
 	.4byte	0x6c
 	.uleb128 0x4a
-	.4byte	.LASF1494
+	.4byte	.LASF1496
 	.byte	0x1
 	.2byte	0x1c4
 	.4byte	0x6c
 	.uleb128 0x47
-	.4byte	.LASF1495
+	.4byte	.LASF1497
 	.byte	0x1
 	.2byte	0x1c5
 	.4byte	0x6c
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x4a
-	.4byte	.LASF501
+	.4byte	.LASF503
 	.byte	0x1
 	.2byte	0x1c6
 	.4byte	0xbb
 	.uleb128 0x58
-	.4byte	.LASF1496
-	.4byte	0x663d
+	.4byte	.LASF1498
+	.4byte	0x6653
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.16854
+	.8byte	__func__.16872
 	.uleb128 0x4b
 	.8byte	.LVL48
-	.4byte	0x6785
+	.4byte	0x679b
 	.uleb128 0x4b
 	.8byte	.LVL50
-	.4byte	0x6785
+	.4byte	0x679b
 	.uleb128 0x4b
 	.8byte	.LVL53
-	.4byte	0x6836
+	.4byte	0x684c
 	.uleb128 0x4b
 	.8byte	.LVL57
-	.4byte	0x6836
+	.4byte	0x684c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x90
 	.uleb128 0x5
 	.4byte	0x67
-	.4byte	0x663d
+	.4byte	0x6653
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0xe
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x662d
+	.4byte	0x6643
 	.uleb128 0x53
-	.4byte	.LASF1498
+	.4byte	.LASF1500
 	.byte	0x1
 	.2byte	0x1ad
 	.4byte	0xbb
 	.byte	0x1
-	.4byte	0x668e
+	.4byte	0x66a4
 	.uleb128 0x54
-	.4byte	.LASF1478
+	.4byte	.LASF1480
 	.byte	0x1
 	.2byte	0x1ad
 	.4byte	0xbb
 	.uleb128 0x4a
-	.4byte	.LASF1469
+	.4byte	.LASF1471
 	.byte	0x1
 	.2byte	0x1af
-	.4byte	0x6627
+	.4byte	0x663d
 	.uleb128 0x4a
-	.4byte	.LASF1499
+	.4byte	.LASF1501
 	.byte	0x1
 	.2byte	0x1b0
 	.4byte	0xbb
 	.uleb128 0x4a
-	.4byte	.LASF884
+	.4byte	.LASF886
 	.byte	0x1
 	.2byte	0x1b1
 	.4byte	0xbb
@@ -13826,140 +13836,140 @@ spi_id_buffer.16929:
 	.4byte	0xbb
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1501
+	.4byte	.LASF1503
 	.byte	0x1
 	.2byte	0x17e
 	.4byte	0xbb
-	.8byte	.LFB1548
-	.8byte	.LFE1548-.LFB1548
+	.8byte	.LFB1549
+	.8byte	.LFE1549-.LFB1549
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x673b
+	.4byte	0x6751
 	.uleb128 0x49
-	.4byte	.LASF1477
+	.4byte	.LASF1479
 	.byte	0x1
 	.2byte	0x17e
-	.4byte	0x5fc5
+	.4byte	0x5fdb
 	.4byte	.LLST0
 	.uleb128 0x57
-	.4byte	.LASF1469
+	.4byte	.LASF1471
 	.byte	0x1
 	.2byte	0x180
-	.4byte	0x6201
+	.4byte	0x6217
 	.4byte	.LLST1
 	.uleb128 0x4a
-	.4byte	.LASF1502
+	.4byte	.LASF1504
 	.byte	0x1
 	.2byte	0x181
-	.4byte	0x673b
+	.4byte	0x6751
 	.uleb128 0x4a
-	.4byte	.LASF822
+	.4byte	.LASF824
 	.byte	0x1
 	.2byte	0x182
 	.4byte	0xbb
 	.uleb128 0x4c
-	.4byte	0x6741
+	.4byte	0x6757
 	.8byte	.LBB7
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
 	.2byte	0x184
-	.4byte	0x672d
+	.4byte	0x6743
 	.uleb128 0x4d
-	.4byte	0x6752
+	.4byte	0x6768
 	.uleb128 0x4d
-	.4byte	0x6752
+	.4byte	0x6768
 	.uleb128 0x4e
 	.4byte	.Ldebug_ranges0+0
 	.uleb128 0x51
-	.4byte	0x675e
+	.4byte	0x6774
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	pvi_modes.16805
+	.8byte	pvi_modes.16823
 	.uleb128 0x4b
 	.8byte	.LVL18
-	.4byte	0x6836
+	.4byte	0x684c
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
 	.8byte	.LVL7
-	.4byte	0x6836
+	.4byte	0x684c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc2
 	.uleb128 0x53
-	.4byte	.LASF1503
+	.4byte	.LASF1505
 	.byte	0x1
 	.2byte	0x118
-	.4byte	0x673b
+	.4byte	0x6751
 	.byte	0x1
-	.4byte	0x6775
+	.4byte	0x678b
 	.uleb128 0x54
-	.4byte	.LASF1469
+	.4byte	.LASF1471
 	.byte	0x1
 	.2byte	0x118
-	.4byte	0x6201
+	.4byte	0x6217
 	.uleb128 0x47
-	.4byte	.LASF1502
+	.4byte	.LASF1504
 	.byte	0x1
 	.2byte	0x11a
-	.4byte	0x6775
+	.4byte	0x678b
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	pvi_modes.16805
+	.8byte	pvi_modes.16823
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xbb
-	.4byte	0x6785
+	.4byte	0x679b
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x8
 	.byte	0
 	.uleb128 0x59
-	.4byte	.LASF1504
+	.4byte	.LASF1506
 	.byte	0x1
 	.byte	0x3f
 	.4byte	0xbb
-	.8byte	.LFB1546
-	.8byte	.LFE1546-.LFB1546
+	.8byte	.LFB1547
+	.8byte	.LFE1547-.LFB1547
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6836
+	.4byte	0x684c
 	.uleb128 0x5a
-	.4byte	.LASF739
+	.4byte	.LASF741
 	.byte	0x1
 	.byte	0x3f
-	.4byte	0x6627
+	.4byte	0x663d
 	.4byte	.LLST2
 	.uleb128 0x5a
-	.4byte	.LASF1505
+	.4byte	.LASF1507
 	.byte	0x1
 	.byte	0x3f
 	.4byte	0xbb
 	.4byte	.LLST3
 	.uleb128 0x5b
-	.4byte	.LASF1506
+	.4byte	.LASF1508
 	.byte	0x1
 	.byte	0x41
 	.4byte	0x6c
 	.uleb128 0x5b
-	.4byte	.LASF1507
+	.4byte	.LASF1509
 	.byte	0x1
 	.byte	0x41
 	.4byte	0x6c
 	.uleb128 0x5c
-	.4byte	.LASF1508
+	.4byte	.LASF1510
 	.byte	0x1
 	.byte	0x42
 	.4byte	0x6c
 	.4byte	.LLST4
 	.uleb128 0x5b
-	.4byte	.LASF501
+	.4byte	.LASF503
 	.byte	0x1
 	.byte	0x43
 	.4byte	0x6c
 	.uleb128 0x5c
-	.4byte	.LASF1509
+	.4byte	.LASF1511
 	.byte	0x1
 	.byte	0x44
 	.4byte	0x90
@@ -13970,21 +13980,21 @@ spi_id_buffer.16929:
 	.byte	0x45
 	.4byte	0x90
 	.uleb128 0x5c
-	.4byte	.LASF1510
+	.4byte	.LASF1512
 	.byte	0x1
 	.byte	0x46
 	.4byte	0x247
 	.4byte	.LLST6
 	.uleb128 0x4b
 	.8byte	.LVL27
-	.4byte	0x6836
+	.4byte	0x684c
 	.uleb128 0x4b
 	.8byte	.LVL43
-	.4byte	0x6836
+	.4byte	0x684c
 	.byte	0
 	.uleb128 0x5e
-	.4byte	.LASF1515
-	.4byte	.LASF1515
+	.4byte	.LASF1517
+	.4byte	.LASF1517
 	.byte	0xd
 	.byte	0xb0
 	.byte	0
@@ -15225,7 +15235,7 @@ spi_id_buffer.16929:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL90-.Ltext0
-	.8byte	.LFE1553-.Ltext0
+	.8byte	.LFE1554-.Ltext0
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
@@ -15275,7 +15285,7 @@ spi_id_buffer.16929:
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL84-.Ltext0
-	.8byte	.LFE1552-.Ltext0
+	.8byte	.LFE1553-.Ltext0
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
@@ -15290,7 +15300,7 @@ spi_id_buffer.16929:
 	.2byte	0x1
 	.byte	0x52
 	.8byte	.LVL84-.Ltext0
-	.8byte	.LFE1552-.Ltext0
+	.8byte	.LFE1553-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
@@ -15432,7 +15442,7 @@ spi_id_buffer.16929:
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL9-.Ltext0
-	.8byte	.LFE1548-.Ltext0
+	.8byte	.LFE1549-.Ltext0
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
@@ -15610,329 +15620,329 @@ spi_id_buffer.16929:
 	.section	.debug_line,"",@progbits
 .Ldebug_line0:
 	.section	.debug_str,"MS",@progbits,1
-.LASF351:
+.LASF353:
 	.string	"thread_pid"
-.LASF1342:
+.LASF1344:
 	.string	"dev_archdata"
-.LASF1422:
+.LASF1424:
 	.string	"WF_TYPE_GRAY2"
-.LASF1421:
+.LASF1423:
 	.string	"WF_TYPE_GRAY4"
-.LASF643:
+.LASF645:
 	.string	"lru_lock"
-.LASF779:
+.LASF781:
 	.string	"llc_id"
-.LASF998:
+.LASF1000:
 	.string	"task_io_accounting"
-.LASF1294:
+.LASF1296:
 	.string	"idle_notification"
-.LASF620:
+.LASF622:
 	.string	"inactive_age"
-.LASF855:
+.LASF857:
 	.string	"event"
-.LASF567:
+.LASF569:
 	.string	"NR_BOUNCE"
-.LASF603:
+.LASF605:
 	.string	"NR_ION_HEAP"
-.LASF706:
+.LASF708:
 	.string	"__early_cpu_boot_status"
-.LASF1460:
+.LASF1462:
 	.string	"reserved"
-.LASF529:
+.LASF531:
 	.string	"ADDR_NO_RANDOMIZE"
-.LASF763:
+.LASF765:
 	.string	"section_mem_map"
-.LASF558:
+.LASF560:
 	.string	"NR_ZONE_INACTIVE_ANON"
-.LASF1066:
+.LASF1068:
 	.string	"runnable_weight"
-.LASF321:
+.LASF323:
 	.string	"pushable_dl_tasks"
-.LASF1496:
+.LASF1498:
 	.string	"__func__"
-.LASF701:
+.LASF703:
 	.string	"cpu_number"
 .LASF134:
 	.string	"locked_pending"
-.LASF345:
+.LASF347:
 	.string	"stack_canary"
-.LASF326:
+.LASF328:
 	.string	"exit_code"
-.LASF398:
+.LASF400:
 	.string	"pi_top_task"
-.LASF1271:
+.LASF1273:
 	.string	"in_dpm_list"
-.LASF1405:
+.LASF1407:
 	.string	"dma_map_ops"
-.LASF881:
+.LASF883:
 	.string	"PIDTYPE_MAX"
 .LASF161:
 	.string	"__stop___jump_table"
 .LASF41:
 	.string	"gid_t"
-.LASF1096:
+.LASF1098:
 	.string	"dl_overrun"
-.LASF1141:
+.LASF1143:
 	.string	"attrs"
-.LASF734:
+.LASF736:
 	.string	"entry"
-.LASF1445:
+.LASF1447:
 	.string	"pvi_waveform"
-.LASF1506:
+.LASF1508:
 	.string	"oldpic"
-.LASF545:
+.LASF547:
 	.string	"MIGRATE_PCPTYPES"
 .LASF112:
 	.string	"sysctl_panic_on_stackoverflow"
-.LASF239:
+.LASF241:
 	.string	"__idmap_text_end"
 .LASF170:
 	.string	"sign"
-.LASF1361:
+.LASF1363:
 	.string	"need_parent_lock"
-.LASF847:
+.LASF849:
 	.string	"mkdir"
 .LASF39:
 	.string	"_Bool"
 .LASF137:
 	.string	"arch_spinlock_t"
-.LASF789:
+.LASF791:
 	.string	"idr_next"
-.LASF227:
+.LASF229:
 	.string	"__nosave_end"
-.LASF337:
+.LASF339:
 	.string	"in_iowait"
-.LASF1277:
+.LASF1279:
 	.string	"early_init"
-.LASF1451:
+.LASF1453:
 	.string	"fpl_lot"
-.LASF416:
+.LASF418:
 	.string	"cpuset_slab_spread_rotor"
-.LASF360:
+.LASF362:
 	.string	"gtime"
-.LASF484:
+.LASF486:
 	.string	"mm_segment_t"
-.LASF1273:
+.LASF1275:
 	.string	"is_suspended"
-.LASF813:
+.LASF815:
 	.string	"syscall_ops"
-.LASF367:
+.LASF369:
 	.string	"real_start_time"
-.LASF740:
+.LASF742:
 	.string	"workqueue_struct"
-.LASF951:
+.LASF953:
 	.string	"_tid"
-.LASF997:
+.LASF999:
 	.string	"tlbflush_unmap_batch"
-.LASF1407:
+.LASF1409:
 	.string	"removed_region"
 .LASF132:
 	.string	"locked"
-.LASF710:
+.LASF712:
 	.string	"arch_timer_read_ool_enabled"
-.LASF515:
+.LASF517:
 	.string	"seqcount"
-.LASF464:
+.LASF466:
 	.string	"TT_NONE"
-.LASF767:
+.LASF769:
 	.string	"pcpu_unit_offsets"
 .LASF105:
 	.string	"oops_in_progress"
-.LASF667:
+.LASF669:
 	.string	"nr_reserved_highatomic"
-.LASF563:
+.LASF565:
 	.string	"NR_ZONE_WRITE_PENDING"
-.LASF1463:
+.LASF1465:
 	.string	"unknown1"
-.LASF758:
+.LASF760:
 	.string	"movable_zone"
-.LASF512:
+.LASF514:
 	.string	"__sched_text_end"
-.LASF1229:
+.LASF1231:
 	.string	"dma_pfn_offset"
-.LASF536:
+.LASF538:
 	.string	"WHOLE_SECONDS"
-.LASF1383:
+.LASF1385:
 	.string	"shutdown_pre"
-.LASF1495:
+.LASF1497:
 	.string	"frm_num"
-.LASF295:
+.LASF297:
 	.string	"prio"
 .LASF145:
 	.string	"spinlock_t"
-.LASF579:
+.LASF581:
 	.string	"NR_SLAB_UNRECLAIMABLE"
 .LASF210:
 	.string	"__kprobes_text_start"
-.LASF585:
+.LASF587:
 	.string	"WORKINGSET_NODERECLAIM"
-.LASF749:
+.LASF751:
 	.string	"done"
-.LASF755:
+.LASF757:
 	.string	"blocking_notifier_head"
-.LASF899:
+.LASF901:
 	.string	"hrtimer_restart"
-.LASF509:
+.LASF511:
 	.string	"gfp_mask"
-.LASF376:
+.LASF378:
 	.string	"nameidata"
 .LASF203:
 	.string	"_einittext"
 .LASF141:
 	.string	"raw_lock"
-.LASF490:
+.LASF492:
 	.string	"cpumask_t"
-.LASF831:
+.LASF833:
 	.string	"seq_start"
-.LASF805:
+.LASF807:
 	.string	"kuid_t"
-.LASF834:
+.LASF836:
 	.string	"read"
-.LASF927:
+.LASF929:
 	.string	"clock_base"
-.LASF687:
+.LASF689:
 	.string	"vm_numa_stat"
-.LASF679:
+.LASF681:
 	.string	"compact_cached_free_pfn"
-.LASF1367:
+.LASF1369:
 	.string	"acpi_match_table"
-.LASF298:
+.LASF300:
 	.string	"rt_priority"
-.LASF1085:
+.LASF1087:
 	.string	"dl_runtime"
-.LASF821:
+.LASF823:
 	.string	"priv"
-.LASF1155:
+.LASF1157:
 	.string	"show"
 .LASF130:
 	.string	"hex_asc"
-.LASF508:
+.LASF510:
 	.string	"xa_lock"
-.LASF282:
+.LASF284:
 	.string	"thread_info"
 .LASF151:
 	.string	"entries"
-.LASF1129:
+.LASF1131:
 	.string	"uprobe_task"
-.LASF467:
+.LASF469:
 	.string	"uaddr"
-.LASF308:
+.LASF310:
 	.string	"cpus_requested"
 .LASF83:
 	.string	"reset_devices"
-.LASF411:
+.LASF413:
 	.string	"acct_vm_mem1"
-.LASF1101:
+.LASF1103:
 	.string	"rcu_special"
 .LASF51:
 	.string	"next"
-.LASF1256:
+.LASF1258:
 	.string	"RPM_SUSPENDING"
-.LASF505:
+.LASF507:
 	.string	"slots"
-.LASF744:
+.LASF746:
 	.string	"system_unbound_wq"
-.LASF1319:
+.LASF1321:
 	.string	"last_time"
 .LASF49:
 	.string	"counter"
-.LASF1071:
+.LASF1073:
 	.string	"prev_sum_exec_runtime"
-.LASF1348:
+.LASF1350:
 	.string	"bus_groups"
-.LASF580:
+.LASF582:
 	.string	"NR_ISOLATED_ANON"
-.LASF970:
+.LASF972:
 	.string	"_arch"
-.LASF327:
+.LASF329:
 	.string	"exit_signal"
-.LASF1225:
+.LASF1227:
 	.string	"dma_ops"
 .LASF56:
 	.string	"hlist_node"
-.LASF736:
+.LASF738:
 	.string	"sysctl_timer_migration"
-.LASF1008:
+.LASF1010:
 	.string	"RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT_BIT"
-.LASF964:
+.LASF966:
 	.string	"_addr_bnd"
-.LASF406:
+.LASF408:
 	.string	"ptrace_message"
-.LASF808:
+.LASF810:
 	.string	"subdirs"
-.LASF1404:
+.LASF1406:
 	.string	"dev_pin_info"
-.LASF519:
+.LASF521:
 	.string	"_unused_nodemask_arg_"
-.LASF663:
+.LASF665:
 	.string	"ZONE_MOVABLE"
-.LASF1142:
+.LASF1144:
 	.string	"bin_attrs"
-.LASF1487:
+.LASF1489:
 	.string	"pix0_new"
-.LASF246:
+.LASF248:
 	.string	"__entry_tramp_text_start"
 .LASF30:
 	.string	"__kernel_timer_t"
-.LASF562:
+.LASF564:
 	.string	"NR_ZONE_UNEVICTABLE"
-.LASF424:
+.LASF426:
 	.string	"perf_event_mutex"
-.LASF1380:
+.LASF1382:
 	.string	"dev_uevent"
-.LASF1499:
+.LASF1501:
 	.string	"temp_num"
-.LASF1006:
+.LASF1008:
 	.string	"cancelled_write_bytes"
-.LASF1076:
+.LASF1078:
 	.string	"my_q"
-.LASF267:
+.LASF269:
 	.string	"sve_vl"
-.LASF381:
+.LASF383:
 	.string	"signal"
-.LASF1474:
+.LASF1476:
 	.string	"pvi_wf_get_lut"
 .LASF202:
 	.string	"_sinittext"
-.LASF967:
+.LASF969:
 	.string	"_band"
-.LASF1504:
+.LASF1506:
 	.string	"decodewaveform"
-.LASF726:
+.LASF728:
 	.string	"tick_nsec"
-.LASF717:
+.LASF719:
 	.string	"read_cntp_tval_el0"
-.LASF1072:
+.LASF1074:
 	.string	"nr_migrations"
-.LASF658:
+.LASF660:
 	.string	"per_cpu_nodestat"
-.LASF665:
+.LASF667:
 	.string	"zone"
-.LASF866:
+.LASF868:
 	.string	"KOBJ_NS_TYPE_NET"
-.LASF793:
+.LASF795:
 	.string	"__rb_parent_color"
-.LASF241:
+.LASF243:
 	.string	"__initdata_end"
-.LASF980:
+.LASF982:
 	.string	"si_errno"
-.LASF669:
+.LASF671:
 	.string	"zone_pgdat"
-.LASF652:
+.LASF654:
 	.string	"per_cpu_pages"
 .LASF217:
 	.string	"__irqentry_text_end"
-.LASF425:
+.LASF427:
 	.string	"perf_event_list"
 .LASF38:
 	.string	"bool"
 .LASF171:
 	.string	"visible"
-.LASF1369:
+.LASF1371:
 	.string	"subsys_private"
-.LASF875:
+.LASF877:
 	.string	"compat_time_t"
-.LASF1278:
+.LASF1280:
 	.string	"direct_complete"
 .LASF103:
 	.string	"vendor_panic_cb"
@@ -15940,853 +15950,855 @@ spi_id_buffer.16929:
 	.string	"_edata"
 .LASF25:
 	.string	"__kernel_size_t"
-.LASF1116:
+.LASF1118:
 	.string	"signal_struct"
 .LASF102:
 	.string	"panic_notifier_list"
-.LASF886:
+.LASF888:
 	.string	"numbers"
-.LASF1419:
+.LASF1421:
 	.string	"WF_TYPE_RESET"
 .LASF168:
 	.string	"FTR_HIGHER_OR_ZERO_SAFE"
-.LASF259:
+.LASF261:
 	.string	"perf_event"
-.LASF1133:
+.LASF1135:
 	.string	"rseq_event_mask_bits"
-.LASF974:
+.LASF976:
 	.string	"_sigchld"
-.LASF531:
+.LASF533:
 	.string	"MMAP_PAGE_ZERO"
-.LASF786:
+.LASF788:
 	.string	"gfp_allowed_mask"
 .LASF183:
 	.string	"cpu_hwcaps"
-.LASF894:
+.LASF896:
 	.string	"prio_list"
-.LASF1109:
+.LASF1111:
 	.string	"futex_state"
-.LASF803:
+.LASF805:
 	.string	"user_namespace"
-.LASF960:
+.LASF962:
 	.string	"_upper"
-.LASF1444:
+.LASF1446:
 	.string	"wf_table"
-.LASF559:
+.LASF561:
 	.string	"NR_ZONE_ACTIVE_ANON"
-.LASF1062:
+.LASF1064:
 	.string	"nr_wakeups_passive"
-.LASF591:
+.LASF593:
 	.string	"NR_WRITEBACK_TEMP"
-.LASF549:
+.LASF551:
 	.string	"migratetype_names"
-.LASF395:
+.LASF397:
 	.string	"pi_lock"
-.LASF852:
+.LASF854:
 	.string	"kernfs_open_file"
-.LASF463:
+.LASF465:
 	.string	"timespec_type"
 .LASF76:
 	.string	"initcall_entry_t"
-.LASF993:
+.LASF995:
 	.string	"task_rss_stat"
-.LASF1309:
+.LASF1311:
 	.string	"last_busy"
-.LASF525:
+.LASF527:
 	.string	"N_MEMORY"
-.LASF778:
+.LASF780:
 	.string	"package_id"
-.LASF524:
+.LASF526:
 	.string	"N_HIGH_MEMORY"
-.LASF1370:
+.LASF1372:
 	.string	"device_type"
-.LASF1127:
+.LASF1129:
 	.string	"mem_cgroup"
-.LASF334:
+.LASF336:
 	.string	"sched_remote_wakeup"
-.LASF645:
+.LASF647:
 	.string	"per_cpu_nodestats"
-.LASF1061:
+.LASF1063:
 	.string	"nr_wakeups_affine_attempts"
-.LASF478:
+.LASF480:
 	.string	"has_timeout"
-.LASF678:
+.LASF680:
 	.string	"percpu_drift_mark"
-.LASF333:
+.LASF335:
 	.string	"sched_migrated"
-.LASF907:
+.LASF909:
 	.string	"hrtimer_clock_base"
-.LASF1185:
+.LASF1187:
 	.string	"pm_power_off"
-.LASF713:
+.LASF715:
 	.string	"ate_match_local_cap_id"
-.LASF902:
+.LASF904:
 	.string	"hrtimer"
-.LASF346:
+.LASF348:
 	.string	"real_parent"
-.LASF363:
+.LASF365:
 	.string	"prev_cputime"
-.LASF1246:
+.LASF1248:
 	.string	"offline_disabled"
-.LASF492:
+.LASF494:
 	.string	"__cpu_possible_mask"
-.LASF1021:
+.LASF1023:
 	.string	"load_weight"
-.LASF918:
+.LASF920:
 	.string	"softirq_activated"
-.LASF417:
+.LASF419:
 	.string	"cgroups"
-.LASF1365:
+.LASF1367:
 	.string	"probe_type"
-.LASF1077:
+.LASF1079:
 	.string	"sched_rt_entity"
-.LASF950:
+.LASF952:
 	.string	"_uid"
-.LASF973:
+.LASF975:
 	.string	"_timer"
-.LASF759:
+.LASF761:
 	.string	"sysctl_lowmem_reserve_ratio"
-.LASF888:
+.LASF890:
 	.string	"pidfd_fops"
-.LASF709:
+.LASF711:
 	.string	"arch_timer_read_counter"
-.LASF1038:
+.LASF1040:
 	.string	"wait_max"
-.LASF891:
+.LASF893:
 	.string	"refs"
-.LASF480:
+.LASF482:
 	.string	"futex"
-.LASF862:
+.LASF864:
 	.string	"poll_table_struct"
-.LASF698:
-	.string	"llist_node"
 .LASF700:
+	.string	"llist_node"
+.LASF702:
 	.string	"__per_cpu_offset"
-.LASF471:
+.LASF473:
 	.string	"rmtp"
-.LASF328:
+.LASF330:
 	.string	"pdeath_signal"
-.LASF1108:
-	.string	"__UNIQUE_ID_android_kabi_hide47"
 .LASF1110:
+	.string	"__UNIQUE_ID_android_kabi_hide47"
+.LASF1112:
 	.string	"__UNIQUE_ID_android_kabi_hide48"
-.LASF932:
+.LASF934:
 	.string	"HRTIMER_BASE_TAI"
-.LASF453:
+.LASF455:
 	.string	"futex_exit_mutex"
-.LASF1410:
+.LASF1412:
 	.string	"platform_notify_remove"
-.LASF797:
+.LASF799:
 	.string	"rb_root_cached"
-.LASF388:
+.LASF390:
 	.string	"sas_ss_flags"
-.LASF682:
+.LASF684:
 	.string	"compact_defer_shift"
-.LASF1228:
+.LASF1230:
 	.string	"bus_dma_mask"
-.LASF655:
+.LASF657:
 	.string	"per_cpu_pageset"
-.LASF969:
+.LASF971:
 	.string	"_syscall"
-.LASF1417:
+.LASF1419:
 	.string	"kmalloc_caches"
-.LASF917:
+.LASF919:
 	.string	"hang_detected"
-.LASF626:
+.LASF628:
 	.string	"nr_zones"
 .LASF195:
 	.string	"_data"
-.LASF800:
+.LASF802:
 	.string	"overflowgid"
-.LASF898:
+.LASF900:
 	.string	"timerqueue_head"
-.LASF1107:
+.LASF1109:
 	.string	"wake_q_node"
-.LASF840:
+.LASF842:
 	.string	"generation"
-.LASF382:
+.LASF384:
 	.string	"sighand"
-.LASF528:
+.LASF530:
 	.string	"UNAME26"
-.LASF909:
+.LASF911:
 	.string	"index"
-.LASF1402:
+.LASF1404:
 	.string	"device_private"
 .LASF5:
 	.string	"__s8"
-.LASF845:
+.LASF847:
 	.string	"remount_fs"
-.LASF419:
+.LASF421:
 	.string	"robust_list"
 .LASF64:
 	.string	"desc"
-.LASF938:
+.LASF940:
 	.string	"hrtimer_resolution"
-.LASF849:
+.LASF851:
 	.string	"rename"
 .LASF54:
 	.string	"hlist_head"
-.LASF1054:
+.LASF1056:
 	.string	"nr_forced_migrations"
-.LASF633:
+.LASF635:
 	.string	"kswapd"
-.LASF1400:
+.LASF1402:
 	.string	"defer_hook"
-.LASF959:
+.LASF961:
 	.string	"_lower"
-.LASF900:
+.LASF902:
 	.string	"HRTIMER_NORESTART"
-.LASF1080:
+.LASF1082:
 	.string	"watchdog_stamp"
-.LASF978:
+.LASF980:
 	.string	"siginfo"
-.LASF1030:
+.LASF1032:
 	.string	"runnable_load_sum"
-.LASF407:
+.LASF409:
 	.string	"last_siginfo"
 .LASF148:
 	.string	"elf_hwcap"
-.LASF810:
+.LASF812:
 	.string	"ino_idr"
-.LASF588:
+.LASF590:
 	.string	"NR_FILE_PAGES"
 .LASF23:
 	.string	"__kernel_uid32_t"
-.LASF1468:
+.LASF1470:
 	.string	"global_waveform"
 .LASF162:
 	.string	"static_key_false"
 .LASF144:
 	.string	"spinlock"
-.LASF972:
+.LASF974:
 	.string	"_kill"
-.LASF1345:
+.LASF1347:
 	.string	"bus_type"
-.LASF1007:
+.LASF1009:
 	.string	"rseq_cs_flags_bit"
-.LASF1153:
+.LASF1155:
 	.string	"private"
 .LASF133:
 	.string	"pending"
-.LASF522:
+.LASF524:
 	.string	"N_ONLINE"
-.LASF1113:
+.LASF1115:
 	.string	"mm_struct"
 .LASF19:
 	.string	"__kernel_long_t"
-.LASF1148:
+.LASF1150:
 	.string	"state_in_sysfs"
-.LASF447:
+.LASF449:
 	.string	"utask"
-.LASF1354:
+.LASF1356:
 	.string	"remove"
-.LASF276:
+.LASF278:
 	.string	"debug_locks_silent"
-.LASF1103:
+.LASF1105:
 	.string	"perf_invalid_context"
-.LASF657:
+.LASF659:
 	.string	"vm_stat_diff"
-.LASF368:
+.LASF370:
 	.string	"min_flt"
-.LASF842:
+.LASF844:
 	.string	"attr"
-.LASF418:
+.LASF420:
 	.string	"cg_list"
-.LASF879:
+.LASF881:
 	.string	"PIDTYPE_PGID"
-.LASF503:
+.LASF505:
 	.string	"exceptional"
 .LASF152:
 	.string	"jump_entry"
-.LASF299:
+.LASF301:
 	.string	"sched_class"
-.LASF1175:
+.LASF1177:
 	.string	"kobj_sysfs_ops"
-.LASF1457:
+.LASF1459:
 	.string	"amepd_part_number"
-.LASF385:
+.LASF387:
 	.string	"saved_sigmask"
-.LASF616:
+.LASF618:
 	.string	"recent_scanned"
 .LASF185:
 	.string	"arm64_const_caps_ready"
-.LASF365:
+.LASF367:
 	.string	"nivcsw"
 .LASF6:
 	.string	"__u8"
-.LASF500:
+.LASF502:
 	.string	"radix_tree_node"
-.LASF493:
+.LASF495:
 	.string	"__cpu_online_mask"
 .LASF117:
 	.string	"SYSTEM_BOOTING"
-.LASF348:
+.LASF350:
 	.string	"group_leader"
-.LASF733:
+.LASF735:
 	.string	"timer_list"
 .LASF22:
 	.string	"__kernel_pid_t"
-.LASF1154:
+.LASF1156:
 	.string	"sysfs_ops"
-.LASF1093:
+.LASF1095:
 	.string	"dl_boosted"
-.LASF291:
+.LASF293:
 	.string	"last_wakee"
-.LASF1217:
+.LASF1219:
 	.string	"platform_data"
-.LASF1349:
+.LASF1351:
 	.string	"dev_groups"
-.LASF922:
+.LASF924:
 	.string	"max_hang_time"
-.LASF357:
+.LASF359:
 	.string	"clear_child_tid"
 .LASF150:
 	.string	"type"
-.LASF537:
+.LASF539:
 	.string	"STICKY_TIMEOUTS"
-.LASF756:
+.LASF758:
 	.string	"rwsem"
-.LASF1130:
+.LASF1132:
 	.string	"vm_struct"
-.LASF601:
+.LASF603:
 	.string	"NR_KERNEL_MISC_RECLAIMABLE"
-.LASF947:
+.LASF949:
 	.string	"sival_ptr"
 .LASF109:
 	.string	"panic_on_io_nmi"
-.LASF1065:
+.LASF1067:
 	.string	"load"
-.LASF1372:
+.LASF1374:
 	.string	"PROBE_DEFAULT_STRATEGY"
-.LASF594:
+.LASF596:
 	.string	"NR_SHMEM_PMDMAPPED"
-.LASF1286:
+.LASF1288:
 	.string	"suspend_timer"
-.LASF1150:
+.LASF1152:
 	.string	"state_remove_uevent_sent"
-.LASF415:
+.LASF417:
 	.string	"cpuset_mem_spread_rotor"
-.LASF341:
+.LASF343:
 	.string	"use_memdelay"
 .LASF32:
 	.string	"__poll_t"
-.LASF542:
+.LASF544:
 	.string	"MIGRATE_MOVABLE"
-.LASF1055:
+.LASF1057:
 	.string	"nr_wakeups"
-.LASF287:
+.LASF289:
 	.string	"wake_entry"
-.LASF1471:
+.LASF1473:
 	.string	"pvi_wf_get_version"
-.LASF392:
+.LASF394:
 	.string	"parent_exec_id"
-.LASF915:
+.LASF917:
 	.string	"hres_active"
-.LASF1238:
+.LASF1240:
 	.string	"devt"
-.LASF1019:
+.LASF1021:
 	.string	"last_arrival"
-.LASF750:
+.LASF752:
 	.string	"wait"
-.LASF996:
+.LASF998:
 	.string	"lock_class_key"
-.LASF630:
+.LASF632:
 	.string	"node_id"
-.LASF286:
+.LASF288:
 	.string	"ptrace"
-.LASF1274:
+.LASF1276:
 	.string	"is_noirq_suspended"
-.LASF780:
+.LASF782:
 	.string	"thread_sibling"
-.LASF719:
+.LASF721:
 	.string	"read_cntpct_el0"
-.LASF860:
+.LASF862:
 	.string	"vm_ops"
-.LASF1325:
+.LASF1327:
 	.string	"expire_count"
-.LASF1357:
+.LASF1359:
 	.string	"num_vf"
-.LASF822:
+.LASF824:
 	.string	"mode"
-.LASF1210:
+.LASF1212:
 	.string	"restore_noirq"
-.LASF1424:
+.LASF1426:
 	.string	"WF_TYPE_A2"
-.LASF751:
+.LASF753:
 	.string	"notifier_fn_t"
-.LASF548:
+.LASF550:
 	.string	"MIGRATE_TYPES"
 .LASF27:
 	.string	"__kernel_loff_t"
 .LASF182:
 	.string	"arm64_ftr_reg_ctrel0"
-.LASF878:
+.LASF880:
 	.string	"PIDTYPE_TGID"
-.LASF1161:
+.LASF1163:
 	.string	"kobj"
 .LASF167:
 	.string	"FTR_HIGHER_SAFE"
-.LASF1436:
+.LASF1438:
 	.string	"PVI_WF_GL16"
-.LASF359:
+.LASF361:
 	.string	"stime"
-.LASF1230:
+.LASF1232:
 	.string	"dma_parms"
-.LASF707:
+.LASF709:
 	.string	"setup_max_cpus"
 .LASF94:
 	.string	"devkmsg_log_str"
-.LASF968:
+.LASF970:
 	.string	"_call_addr"
 .LASF85:
 	.string	"late_time_init"
-.LASF555:
+.LASF557:
 	.string	"zone_stat_item"
-.LASF307:
+.LASF309:
 	.string	"cpus_allowed"
-.LASF1412:
+.LASF1414:
 	.string	"kmalloc_cache_type"
-.LASF714:
+.LASF716:
 	.string	"ate_match_acpi_oem_info"
 .LASF48:
 	.string	"atomic_t"
-.LASF1043:
+.LASF1045:
 	.string	"sleep_start"
 .LASF46:
 	.string	"phys_addr_t"
-.LASF1037:
+.LASF1039:
 	.string	"wait_start"
-.LASF650:
+.LASF652:
 	.string	"WMARK_HIGH"
-.LASF864:
+.LASF866:
 	.string	"kobj_ns_type"
 .LASF169:
 	.string	"arm64_ftr_bits"
-.LASF715:
+.LASF717:
 	.string	"arch_timer_erratum_workaround"
 .LASF138:
 	.string	"prove_locking"
-.LASF592:
+.LASF594:
 	.string	"NR_SHMEM"
 .LASF7:
 	.string	"unsigned char"
-.LASF992:
+.LASF994:
 	.string	"NR_MM_COUNTERS"
 .LASF120:
 	.string	"SYSTEM_HALT"
-.LASF280:
+.LASF282:
 	.string	"wait_list"
-.LASF1044:
+.LASF1046:
 	.string	"sleep_max"
-.LASF408:
+.LASF410:
 	.string	"ioac"
-.LASF940:
+.LASF942:
 	.string	"tick_cpu_device"
-.LASF1060:
+.LASF1062:
 	.string	"nr_wakeups_affine"
-.LASF712:
+.LASF714:
 	.string	"ate_match_dt"
 .LASF33:
 	.string	"__kernel_dev_t"
-.LASF677:
+.LASF679:
 	.string	"initialized"
-.LASF1281:
+.LASF1283:
 	.string	"wakeup_path"
-.LASF851:
+.LASF853:
 	.string	"seq_file"
-.LASF1242:
+.LASF1244:
 	.string	"class"
-.LASF428:
+.LASF430:
 	.string	"rseq_sig"
-.LASF609:
+.LASF611:
 	.string	"LRU_ACTIVE_ANON"
-.LASF260:
+.LASF262:
 	.string	"cpu_context"
-.LASF607:
+.LASF609:
 	.string	"lru_list"
-.LASF1428:
+.LASF1430:
 	.string	"WF_TYPE_GLD16"
-.LASF1035:
+.LASF1037:
 	.string	"util_avg"
-.LASF1493:
+.LASF1495:
 	.string	"temp3"
-.LASF848:
+.LASF850:
 	.string	"rmdir"
-.LASF1494:
+.LASF1496:
 	.string	"temp4"
 .LASF184:
 	.string	"cpu_hwcap_keys"
-.LASF504:
+.LASF506:
 	.string	"root"
-.LASF1090:
+.LASF1092:
 	.string	"runtime"
-.LASF331:
+.LASF333:
 	.string	"sched_reset_on_fork"
-.LASF1223:
+.LASF1225:
 	.string	"pins"
-.LASF1320:
+.LASF1322:
 	.string	"start_prevent_time"
-.LASF600:
+.LASF602:
 	.string	"NR_WRITTEN"
-.LASF1477:
+.LASF1479:
 	.string	"lut_type"
-.LASF1347:
+.LASF1349:
 	.string	"dev_root"
-.LASF1344:
+.LASF1346:
 	.string	"dma_coherent"
-.LASF249:
+.LASF251:
 	.string	"memstart_addr"
-.LASF1136:
+.LASF1138:
 	.string	"RSEQ_EVENT_MIGRATE_BIT"
 .LASF58:
 	.string	"callback_head"
-.LASF1330:
+.LASF1332:
 	.string	"dev_pm_domain"
 .LASF154:
 	.string	"target"
-.LASF1415:
+.LASF1417:
 	.string	"NR_KMALLOC_TYPES"
-.LASF1293:
+.LASF1295:
 	.string	"disable_depth"
-.LASF867:
+.LASF869:
 	.string	"KOBJ_NS_TYPES"
-.LASF716:
+.LASF718:
 	.string	"match_type"
-.LASF1045:
+.LASF1047:
 	.string	"sum_sleep_runtime"
-.LASF911:
+.LASF913:
 	.string	"get_time"
-.LASF1378:
+.LASF1380:
 	.string	"class_groups"
-.LASF809:
+.LASF811:
 	.string	"kernfs_root"
-.LASF654:
+.LASF656:
 	.string	"batch"
-.LASF366:
+.LASF368:
 	.string	"start_time"
-.LASF1486:
+.LASF1488:
 	.string	"pix1_wf"
-.LASF991:
+.LASF993:
 	.string	"MM_UNRECLAIMABLE"
-.LASF544:
+.LASF546:
 	.string	"MIGRATE_CMA"
-.LASF920:
+.LASF922:
 	.string	"nr_retries"
-.LASF1050:
+.LASF1052:
 	.string	"nr_migrations_cold"
-.LASF1398:
+.LASF1400:
 	.string	"consumers"
-.LASF497:
+.LASF499:
 	.string	"cpu_bit_bitmap"
-.LASF1466:
+.LASF1468:
 	.string	"unknown2"
-.LASF1079:
+.LASF1081:
 	.string	"timeout"
-.LASF587:
+.LASF589:
 	.string	"NR_FILE_MAPPED"
-.LASF335:
+.LASF337:
 	.string	"sched_psi_wake_requeue"
 .LASF194:
 	.string	"_etext"
-.LASF1173:
+.LASF1175:
 	.string	"kset_uevent_ops"
-.LASF1497:
+.LASF1499:
 	.string	"parse_wf_direct"
-.LASF854:
+.LASF856:
 	.string	"prealloc_mutex"
-.LASF774:
+.LASF776:
 	.string	"pcpu_chosen_fc"
-.LASF653:
+.LASF655:
 	.string	"high"
-.LASF671:
+.LASF673:
 	.string	"cma_alloc"
-.LASF798:
+.LASF800:
 	.string	"rb_leftmost"
-.LASF656:
+.LASF658:
 	.string	"stat_threshold"
-.LASF1470:
+.LASF1472:
 	.string	"spi_id_buffer"
-.LASF1118:
+.LASF1120:
 	.string	"rt_mutex_waiter"
-.LASF1513:
+.LASF1515:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
-.LASF703:
+.LASF705:
 	.string	"secondary_data"
-.LASF1026:
+.LASF1028:
 	.string	"ewma"
-.LASF928:
+.LASF930:
 	.string	"hrtimer_base_type"
-.LASF769:
+.LASF771:
 	.string	"PCPU_FC_AUTO"
-.LASF1056:
+.LASF1058:
 	.string	"nr_wakeups_sync"
-.LASF1352:
+.LASF1354:
 	.string	"probe"
-.LASF1488:
+.LASF1490:
 	.string	"pix0_old"
-.LASF472:
+.LASF474:
 	.string	"compat_rmtp"
 .LASF212:
 	.string	"__entry_text_start"
 .LASF200:
 	.string	"__init_begin"
-.LASF988:
+.LASF990:
 	.string	"MM_ANONPAGES"
-.LASF1028:
+.LASF1030:
 	.string	"last_update_time"
-.LASF511:
+.LASF513:
 	.string	"__sched_text_start"
-.LASF597:
+.LASF599:
 	.string	"NR_VMSCAN_WRITE"
-.LASF284:
+.LASF286:
 	.string	"stack"
 .LASF66:
 	.string	"sibling"
-.LASF1114:
+.LASF1116:
 	.string	"fs_struct"
-.LASF766:
+.LASF768:
 	.string	"pcpu_base_addr"
-.LASF390:
+.LASF392:
 	.string	"audit_context"
-.LASF642:
+.LASF644:
 	.string	"_pad1_"
-.LASF1172:
+.LASF1174:
 	.string	"buflen"
-.LASF1467:
+.LASF1469:
 	.string	"waveformdata"
-.LASF553:
+.LASF555:
 	.string	"nr_free"
-.LASF1247:
+.LASF1249:
 	.string	"offline"
-.LASF432:
+.LASF434:
 	.string	"task_frag"
-.LASF517:
+.LASF519:
 	.string	"seqcount_t"
-.LASF1042:
+.LASF1044:
 	.string	"iowait_sum"
 .LASF81:
 	.string	"boot_command_line"
-.LASF1328:
+.LASF1330:
 	.string	"wake_irq"
-.LASF825:
+.LASF827:
 	.string	"open"
-.LASF507:
+.LASF509:
 	.string	"radix_tree_root"
-.LASF238:
+.LASF240:
 	.string	"__idmap_text_start"
-.LASF781:
+.LASF783:
 	.string	"core_sibling"
-.LASF1396:
+.LASF1398:
 	.string	"dev_links_info"
-.LASF1053:
+.LASF1055:
 	.string	"nr_failed_migrations_hot"
-.LASF570:
+.LASF572:
 	.string	"NR_VM_ZONE_STAT_ITEMS"
-.LASF1364:
+.LASF1366:
 	.string	"suppress_bind_attrs"
-.LASF903:
+.LASF905:
 	.string	"_softexpires"
-.LASF1313:
+.LASF1315:
 	.string	"subsys_data"
-.LASF469:
+.LASF471:
 	.string	"time"
-.LASF1420:
+.LASF1422:
 	.string	"WF_TYPE_GRAY16"
-.LASF455:
+.LASF457:
 	.string	"android_kabi_reserved8"
-.LASF271:
+.LASF273:
 	.string	"debug"
-.LASF1196:
+.LASF1198:
 	.string	"thaw"
-.LASF1505:
+.LASF227:
+	.string	"__noinstr_text_end"
+.LASF1507:
 	.string	"maxpic"
 .LASF224:
 	.string	"__start_opd"
-.LASF319:
+.LASF321:
 	.string	"tasks"
-.LASF771:
+.LASF773:
 	.string	"PCPU_FC_PAGE"
 .LASF225:
 	.string	"__end_opd"
-.LASF1138:
+.LASF1140:
 	.string	"attribute_group"
 .LASF106:
 	.string	"panic_timeout"
-.LASF791:
+.LASF793:
 	.string	"bitmap"
-.LASF1443:
+.LASF1445:
 	.string	"frame_num"
-.LASF527:
+.LASF529:
 	.string	"NR_NODE_STATES"
-.LASF1089:
+.LASF1091:
 	.string	"dl_density"
-.LASF1262:
+.LASF1264:
 	.string	"RPM_REQ_RESUME"
-.LASF1514:
+.LASF1516:
 	.string	"frozen"
 .LASF192:
 	.string	"_text"
-.LASF1397:
+.LASF1399:
 	.string	"suppliers"
-.LASF686:
+.LASF688:
 	.string	"_pad3_"
-.LASF1335:
+.LASF1337:
 	.string	"ratelimit_state"
 .LASF173:
 	.string	"shift"
-.LASF277:
+.LASF279:
 	.string	"mutex"
-.LASF826:
+.LASF828:
 	.string	"size"
-.LASF1115:
+.LASF1117:
 	.string	"files_struct"
 .LASF155:
 	.string	"file_operations"
-.LASF230:
+.LASF232:
 	.string	"__exception_text_start"
-.LASF1437:
+.LASF1439:
 	.string	"PVI_WF_GLR16"
-.LASF342:
+.LASF344:
 	.string	"atomic_flags"
 .LASF86:
 	.string	"initcall_debug"
-.LASF958:
+.LASF960:
 	.string	"_dummy_bnd"
-.LASF1067:
+.LASF1069:
 	.string	"run_node"
-.LASF790:
+.LASF792:
 	.string	"ida_bitmap"
-.LASF1314:
+.LASF1316:
 	.string	"set_latency_tolerance"
-.LASF540:
+.LASF542:
 	.string	"migratetype"
-.LASF1100:
+.LASF1102:
 	.string	"exp_need_qs"
 .LASF181:
 	.string	"ftr_bits"
-.LASF306:
+.LASF308:
 	.string	"nr_cpus_allowed"
-.LASF440:
+.LASF442:
 	.string	"trace_recursion"
-.LASF344:
+.LASF346:
 	.string	"tgid"
-.LASF513:
+.LASF515:
 	.string	"wait_queue_head"
-.LASF599:
+.LASF601:
 	.string	"NR_DIRTIED"
-.LASF405:
+.LASF407:
 	.string	"io_context"
-.LASF702:
+.LASF704:
 	.string	"__smp_cross_call"
-.LASF1069:
+.LASF1071:
 	.string	"exec_start"
-.LASF251:
+.LASF253:
 	.string	"kimage_voffset"
-.LASF1224:
+.LASF1226:
 	.string	"msi_list"
 .LASF179:
 	.string	"sys_val"
 .LASF43:
 	.string	"size_t"
-.LASF1478:
+.LASF1480:
 	.string	"temperture"
-.LASF1360:
+.LASF1362:
 	.string	"lock_key"
-.LASF289:
+.LASF291:
 	.string	"wakee_flips"
 .LASF199:
 	.string	"__bss_stop"
 .LASF207:
 	.string	"__per_cpu_load"
-.LASF1253:
+.LASF1255:
 	.string	"RPM_ACTIVE"
-.LASF1418:
+.LASF1420:
 	.string	"epd_lut_type"
-.LASF953:
+.LASF955:
 	.string	"_sigval"
-.LASF890:
+.LASF892:
 	.string	"refcount_struct"
-.LASF275:
+.LASF277:
 	.string	"debug_locks"
-.LASF1177:
+.LASF1179:
 	.string	"mm_kobj"
-.LASF466:
+.LASF468:
 	.string	"TT_COMPAT"
-.LASF1406:
+.LASF1408:
 	.string	"dma_coherent_mem"
-.LASF1218:
+.LASF1220:
 	.string	"driver_data"
-.LASF1020:
+.LASF1022:
 	.string	"last_queued"
-.LASF449:
+.LASF451:
 	.string	"oom_reaper_list"
-.LASF824:
+.LASF826:
 	.string	"kernfs_elem_attr"
-.LASF1489:
+.LASF1491:
 	.string	"pix1_new"
-.LASF539:
+.LASF541:
 	.string	"page"
-.LASF1318:
+.LASF1320:
 	.string	"max_time"
-.LASF637:
+.LASF639:
 	.string	"kcompactd_max_order"
-.LASF794:
+.LASF796:
 	.string	"rb_right"
-.LASF760:
+.LASF762:
 	.string	"numa_zonelist_order"
-.LASF708:
+.LASF710:
 	.string	"__boot_cpu_id"
-.LASF1070:
+.LASF1072:
 	.string	"vruntime"
-.LASF1179:
+.LASF1181:
 	.string	"power_kobj"
-.LASF1187:
+.LASF1189:
 	.string	"power_group_name"
-.LASF575:
+.LASF577:
 	.string	"NR_INACTIVE_FILE"
-.LASF1386:
+.LASF1388:
 	.string	"sysfs_dev_char_kobj"
-.LASF688:
+.LASF690:
 	.string	"ZONELIST_FALLBACK"
-.LASF1221:
+.LASF1223:
 	.string	"pm_domain"
-.LASF370:
+.LASF372:
 	.string	"cputime_expires"
-.LASF1439:
+.LASF1441:
 	.string	"PVI_WF_A2"
-.LASF1249:
+.LASF1251:
 	.string	"state_synced"
-.LASF1193:
+.LASF1195:
 	.string	"suspend"
-.LASF895:
+.LASF897:
 	.string	"node_list"
-.LASF1255:
+.LASF1257:
 	.string	"RPM_SUSPENDED"
-.LASF963:
+.LASF965:
 	.string	"_addr_lsb"
-.LASF930:
+.LASF932:
 	.string	"HRTIMER_BASE_REALTIME"
-.LASF450:
+.LASF452:
 	.string	"stack_vm_area"
-.LASF910:
+.LASF912:
 	.string	"running"
 .LASF223:
 	.string	"__ctors_end"
-.LASF618:
+.LASF620:
 	.string	"lists"
-.LASF818:
+.LASF820:
 	.string	"kernfs_node"
-.LASF423:
+.LASF425:
 	.string	"perf_event_ctxp"
-.LASF1446:
+.LASF1448:
 	.string	"checksum"
-.LASF1465:
+.LASF1467:
 	.string	"temperaturenumber"
-.LASF1304:
+.LASF1306:
 	.string	"links_count"
-.LASF723:
+.LASF725:
 	.string	"clock_event_device"
-.LASF543:
+.LASF545:
 	.string	"MIGRATE_RECLAIMABLE"
 .LASF55:
 	.string	"first"
@@ -16796,247 +16808,249 @@ spi_id_buffer.16929:
 	.string	"safe_val"
 .LASF172:
 	.string	"strict"
-.LASF420:
+.LASF422:
 	.string	"compat_robust_list"
-.LASF498:
+.LASF500:
 	.string	"rcu_scheduler_active"
-.LASF1032:
+.LASF1034:
 	.string	"period_contrib"
 .LASF214:
 	.string	"__start_rodata"
-.LASF1240:
+.LASF1242:
 	.string	"devres_head"
-.LASF384:
+.LASF386:
 	.string	"real_blocked"
-.LASF804:
+.LASF806:
 	.string	"init_user_ns"
-.LASF1102:
+.LASF1104:
 	.string	"perf_event_task_context"
-.LASF1475:
+.LASF1477:
 	.string	"waveform_file"
-.LASF1389:
+.LASF1391:
 	.string	"segment_boundary_mask"
-.LASF853:
+.LASF855:
 	.string	"file"
-.LASF1484:
+.LASF1486:
 	.string	"frame_num_gray2"
 .LASF165:
 	.string	"FTR_EXACT"
-.LASF1456:
+.LASF1458:
 	.string	"panel_size"
-.LASF1063:
+.LASF1065:
 	.string	"nr_wakeups_idle"
-.LASF410:
+.LASF412:
 	.string	"acct_rss_mem1"
 .LASF153:
 	.string	"code"
-.LASF589:
+.LASF591:
 	.string	"NR_FILE_DIRTY"
-.LASF1252:
+.LASF1254:
 	.string	"rpm_status"
-.LASF1235:
+.LASF1237:
 	.string	"archdata"
 .LASF29:
 	.string	"__kernel_clock_t"
-.LASF1434:
+.LASF1436:
 	.string	"PVI_WF_DU4"
-.LASF1244:
+.LASF1246:
 	.string	"iommu_group"
-.LASF269:
+.LASF271:
 	.string	"fault_address"
-.LASF383:
+.LASF385:
 	.string	"blocked"
-.LASF409:
+.LASF411:
 	.string	"psi_flags"
 .LASF11:
 	.string	"__s32"
-.LASF435:
+.LASF437:
 	.string	"nr_dirtied_pause"
 .LASF220:
 	.string	"__start_once"
-.LASF312:
+.LASF314:
 	.string	"rcu_blocked_node"
 .LASF77:
 	.string	"__con_initcall_start"
-.LASF258:
+.LASF260:
 	.string	"hbp_watch"
-.LASF247:
+.LASF249:
 	.string	"__entry_tramp_text_end"
-.LASF1257:
+.LASF1259:
 	.string	"rpm_request"
 .LASF99:
 	.string	"atomic_notifier_head"
-.LASF1143:
+.LASF1145:
 	.string	"kobject"
-.LASF1203:
+.LASF1205:
 	.string	"poweroff_late"
-.LASF1356:
+.LASF1358:
 	.string	"online"
-.LASF433:
+.LASF435:
 	.string	"delays"
-.LASF446:
+.LASF448:
 	.string	"throttle_queue"
-.LASF984:
+.LASF986:
 	.string	"sigpending"
-.LASF1340:
+.LASF252:
+	.string	"kimage_vaddr"
+.LASF1342:
 	.string	"begin"
-.LASF1376:
+.LASF1378:
 	.string	"acpi_device_id"
 .LASF122:
 	.string	"SYSTEM_RESTART"
-.LASF944:
+.LASF946:
 	.string	"kernfs_node_id"
-.LASF473:
+.LASF475:
 	.string	"compat_timespec"
-.LASF641:
+.LASF643:
 	.string	"totalreserve_pages"
-.LASF857:
+.LASF859:
 	.string	"prealloc_buf"
-.LASF1178:
+.LASF1180:
 	.string	"hypervisor_kobj"
-.LASF380:
+.LASF382:
 	.string	"nsproxy"
-.LASF839:
+.LASF841:
 	.string	"kernfs_open_node"
-.LASF1180:
+.LASF1182:
 	.string	"firmware_kobj"
-.LASF728:
+.LASF730:
 	.string	"jiffies"
-.LASF1157:
+.LASF1159:
 	.string	"refcount"
-.LASF1204:
+.LASF1206:
 	.string	"restore_early"
-.LASF1188:
+.LASF1190:
 	.string	"pm_message"
-.LASF946:
+.LASF948:
 	.string	"sival_int"
-.LASF1453:
+.LASF1455:
 	.string	"wf_version"
 .LASF160:
 	.string	"__start___jump_table"
-.LASF1433:
+.LASF1435:
 	.string	"PVI_WF_DU"
-.LASF1385:
+.LASF1387:
 	.string	"sysfs_dev_block_kobj"
-.LASF981:
+.LASF983:
 	.string	"si_code"
-.LASF1034:
+.LASF1036:
 	.string	"runnable_load_avg"
-.LASF1046:
+.LASF1048:
 	.string	"block_start"
-.LASF782:
+.LASF784:
 	.string	"llc_sibling"
-.LASF1237:
+.LASF1239:
 	.string	"fwnode"
-.LASF647:
+.LASF649:
 	.string	"zone_watermarks"
-.LASF372:
+.LASF374:
 	.string	"ptracer_cred"
-.LASF1261:
+.LASF1263:
 	.string	"RPM_REQ_AUTOSUSPEND"
 .LASF50:
 	.string	"atomic64_t"
-.LASF877:
+.LASF879:
 	.string	"PIDTYPE_PID"
 .LASF96:
 	.string	"dmesg_restrict"
-.LASF361:
+.LASF363:
 	.string	"time_in_state"
-.LASF1308:
+.LASF1310:
 	.string	"autosuspend_delay"
-.LASF1305:
+.LASF1307:
 	.string	"request"
-.LASF761:
+.LASF763:
 	.string	"contig_page_data"
-.LASF495:
+.LASF497:
 	.string	"__cpu_active_mask"
-.LASF1147:
+.LASF1149:
 	.string	"state_initialized"
-.LASF1213:
+.LASF1215:
 	.string	"runtime_idle"
-.LASF1152:
+.LASF1154:
 	.string	"bin_attribute"
-.LASF1098:
+.LASF1100:
 	.string	"inactive_timer"
-.LASF487:
+.LASF489:
 	.string	"preempt_count"
-.LASF885:
+.LASF887:
 	.string	"wait_pidfd"
-.LASF731:
+.LASF733:
 	.string	"timekeeping_suspended"
-.LASF811:
+.LASF813:
 	.string	"last_ino"
-.LASF1164:
+.LASF1166:
 	.string	"default_attrs"
-.LASF1001:
+.LASF1003:
 	.string	"syscr"
-.LASF931:
+.LASF933:
 	.string	"HRTIMER_BASE_BOOTTIME"
-.LASF547:
+.LASF549:
 	.string	"MIGRATE_ISOLATE"
-.LASF1002:
+.LASF1004:
 	.string	"syscw"
-.LASF762:
+.LASF764:
 	.string	"mem_section"
-.LASF564:
+.LASF566:
 	.string	"NR_MLOCK"
-.LASF1295:
+.LASF1297:
 	.string	"request_pending"
-.LASF391:
+.LASF393:
 	.string	"seccomp"
-.LASF961:
+.LASF963:
 	.string	"_dummy_pkey"
-.LASF362:
+.LASF364:
 	.string	"max_state"
-.LASF1014:
+.LASF1016:
 	.string	"rseq_cs"
-.LASF457:
+.LASF459:
 	.string	"timespec"
 .LASF13:
 	.string	"__s64"
-.LASF510:
+.LASF512:
 	.string	"rnode"
-.LASF1009:
+.LASF1011:
 	.string	"RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL_BIT"
-.LASF494:
+.LASF496:
 	.string	"__cpu_present_mask"
-.LASF1186:
+.LASF1188:
 	.string	"pm_power_off_prepare"
-.LASF1162:
+.LASF1164:
 	.string	"uevent_ops"
-.LASF1215:
+.LASF1217:
 	.string	"init_name"
-.LASF315:
+.LASF317:
 	.string	"rcu_tasks_idx"
-.LASF1435:
+.LASF1437:
 	.string	"PVI_WF_GC16"
-.LASF1341:
+.LASF1343:
 	.string	"printk_ratelimit_state"
-.LASF429:
+.LASF431:
 	.string	"rseq_event_mask"
-.LASF732:
+.LASF734:
 	.string	"persistent_clock_is_local"
 .LASF191:
 	.string	"__reserved"
 .LASF131:
 	.string	"hex_asc_upper"
-.LASF1447:
+.LASF1449:
 	.string	"file_length"
-.LASF1442:
+.LASF1444:
 	.string	"epd_lut_data"
-.LASF692:
+.LASF694:
 	.string	"zonelist"
-.LASF1512:
+.LASF1514:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform.c"
-.LASF670:
+.LASF672:
 	.string	"pageset"
-.LASF1455:
+.LASF1457:
 	.string	"wf_type"
-.LASF248:
+.LASF250:
 	.string	"__boot_cpu_mode"
-.LASF1124:
+.LASF1126:
 	.string	"perf_event_context"
-.LASF830:
+.LASF832:
 	.string	"seq_show"
 .LASF149:
 	.string	"static_key_initialized"
@@ -17044,389 +17058,389 @@ spi_id_buffer.16929:
 	.string	"rlock"
 .LASF91:
 	.string	"linux_banner_ptr"
-.LASF1212:
+.LASF1214:
 	.string	"runtime_resume"
-.LASF1084:
+.LASF1086:
 	.string	"sched_dl_entity"
-.LASF330:
+.LASF332:
 	.string	"personality"
-.LASF576:
+.LASF578:
 	.string	"NR_ACTIVE_FILE"
-.LASF1297:
+.LASF1299:
 	.string	"runtime_auto"
-.LASF1137:
+.LASF1139:
 	.string	"attribute"
-.LASF1362:
+.LASF1364:
 	.string	"device_driver"
-.LASF742:
+.LASF744:
 	.string	"system_highpri_wq"
-.LASF1018:
+.LASF1020:
 	.string	"run_delay"
-.LASF1112:
+.LASF1114:
 	.string	"rcu_node"
-.LASF566:
+.LASF568:
 	.string	"NR_KERNEL_STACK_KB"
-.LASF787:
+.LASF789:
 	.string	"idr_rt"
-.LASF465:
+.LASF467:
 	.string	"TT_NATIVE"
 .LASF196:
 	.string	"_sdata"
-.LASF1291:
+.LASF1293:
 	.string	"usage_count"
-.LASF1268:
+.LASF1270:
 	.string	"power_state"
-.LASF1350:
+.LASF1352:
 	.string	"drv_groups"
 .LASF114:
 	.string	"panic_cpu"
-.LASF1403:
+.LASF1405:
 	.string	"irq_domain"
-.LASF768:
+.LASF770:
 	.string	"pcpu_fc"
-.LASF573:
+.LASF575:
 	.string	"NR_INACTIVE_ANON"
-.LASF937:
+.LASF939:
 	.string	"HRTIMER_MAX_CLOCK_BASES"
-.LASF229:
+.LASF231:
 	.string	"__alt_instructions_end"
-.LASF884:
+.LASF886:
 	.string	"level"
-.LASF1048:
+.LASF1050:
 	.string	"exec_max"
-.LASF413:
+.LASF415:
 	.string	"mems_allowed"
-.LASF338:
+.LASF340:
 	.string	"in_user_fault"
-.LASF1259:
+.LASF1261:
 	.string	"RPM_REQ_IDLE"
-.LASF720:
+.LASF722:
 	.string	"read_cntvct_el0"
-.LASF659:
+.LASF661:
 	.string	"vm_node_stat_diff"
 .LASF62:
 	.string	"name"
-.LASF1449:
+.LASF1451:
 	.string	"run_type"
-.LASF613:
+.LASF615:
 	.string	"NR_LRU_LISTS"
-.LASF614:
+.LASF616:
 	.string	"zone_reclaim_stat"
-.LASF285:
+.LASF287:
 	.string	"usage"
-.LASF1395:
+.LASF1397:
 	.string	"DL_DEV_UNBINDING"
 .LASF164:
 	.string	"ftr_type"
 .LASF125:
 	.string	"taint_flag"
-.LASF799:
+.LASF801:
 	.string	"overflowuid"
-.LASF571:
+.LASF573:
 	.string	"node_stat_item"
-.LASF475:
+.LASF477:
 	.string	"expires"
-.LASF995:
+.LASF997:
 	.string	"page_frag"
-.LASF1194:
+.LASF1196:
 	.string	"resume"
 .LASF116:
 	.string	"early_boot_irqs_disabled"
-.LASF427:
+.LASF429:
 	.string	"rseq_len"
 .LASF110:
 	.string	"panic_on_warn"
-.LASF1321:
+.LASF1323:
 	.string	"prevent_sleep_time"
-.LASF1332:
+.LASF1334:
 	.string	"activate"
-.LASF893:
+.LASF895:
 	.string	"plist_node"
-.LASF1296:
+.LASF1298:
 	.string	"deferred_resume"
-.LASF452:
+.LASF454:
 	.string	"security"
 .LASF166:
 	.string	"FTR_LOWER_SAFE"
-.LASF634:
+.LASF636:
 	.string	"kswapd_order"
-.LASF1168:
+.LASF1170:
 	.string	"kobj_uevent_env"
-.LASF971:
+.LASF973:
 	.string	"_pad"
-.LASF378:
+.LASF380:
 	.string	"last_switch_time"
-.LASF775:
+.LASF777:
 	.string	"cpu_topology"
-.LASF956:
+.LASF958:
 	.string	"_utime"
-.LASF252:
+.LASF254:
 	.string	"arm64_dma_phys_limit"
-.LASF901:
+.LASF903:
 	.string	"HRTIMER_RESTART"
-.LASF1267:
+.LASF1269:
 	.string	"dev_pm_info"
-.LASF628:
+.LASF630:
 	.string	"node_present_pages"
-.LASF1431:
+.LASF1433:
 	.string	"pvi_wf_mode"
-.LASF1500:
+.LASF1502:
 	.string	"get_wf_frm_num"
-.LASF325:
+.LASF327:
 	.string	"exit_state"
-.LASF939:
+.LASF941:
 	.string	"tick_device"
-.LASF815:
+.LASF817:
 	.string	"deactivate_waitq"
-.LASF1289:
+.LASF1291:
 	.string	"wait_queue"
 .LASF1:
 	.string	"sizetype"
 .LASF216:
 	.string	"__irqentry_text_start"
-.LASF990:
+.LASF992:
 	.string	"MM_SHMEMPAGES"
-.LASF1068:
+.LASF1070:
 	.string	"group_node"
-.LASF437:
+.LASF439:
 	.string	"timer_slack_ns"
-.LASF1198:
+.LASF1200:
 	.string	"restore"
-.LASF1388:
+.LASF1390:
 	.string	"max_segment_size"
-.LASF1241:
+.LASF1243:
 	.string	"knode_class"
-.LASF448:
+.LASF450:
 	.string	"pagefault_disabled"
-.LASF234:
+.LASF236:
 	.string	"__hyp_idmap_text_start"
-.LASF1208:
+.LASF1210:
 	.string	"thaw_noirq"
-.LASF1209:
+.LASF1211:
 	.string	"poweroff_noirq"
-.LASF354:
+.LASF356:
 	.string	"thread_node"
-.LASF1394:
+.LASF1396:
 	.string	"DL_DEV_DRIVER_BOUND"
 .LASF10:
 	.string	"short unsigned int"
 .LASF124:
 	.string	"system_state"
-.LASF305:
+.LASF307:
 	.string	"policy"
 .LASF4:
 	.string	"signed char"
-.LASF1280:
+.LASF1282:
 	.string	"wakeup"
-.LASF535:
+.LASF537:
 	.string	"SHORT_INODE"
-.LASF874:
+.LASF876:
 	.string	"sock"
-.LASF858:
+.LASF860:
 	.string	"mmapped"
-.LASF456:
+.LASF458:
 	.string	"thread"
 .LASF61:
 	.string	"start"
-.LASF1075:
+.LASF1077:
 	.string	"cfs_rq"
-.LASF399:
+.LASF401:
 	.string	"pi_blocked_on"
-.LASF952:
+.LASF954:
 	.string	"_overrun"
-.LASF371:
+.LASF373:
 	.string	"cpu_timers"
-.LASF394:
+.LASF396:
 	.string	"alloc_lock"
-.LASF627:
+.LASF629:
 	.string	"node_start_pfn"
-.LASF906:
+.LASF908:
 	.string	"is_soft"
-.LASF1307:
+.LASF1309:
 	.string	"runtime_error"
-.LASF257:
+.LASF259:
 	.string	"hbp_break"
-.LASF1310:
+.LASF1312:
 	.string	"active_jiffies"
-.LASF1083:
+.LASF1085:
 	.string	"back"
-.LASF705:
+.LASF707:
 	.string	"status"
-.LASF375:
+.LASF377:
 	.string	"comm"
-.LASF237:
+.LASF239:
 	.string	"__hyp_text_end"
-.LASF502:
+.LASF504:
 	.string	"count"
-.LASF694:
+.LASF696:
 	.string	"mem_map"
-.LASF1052:
+.LASF1054:
 	.string	"nr_failed_migrations_running"
-.LASF441:
+.LASF443:
 	.string	"memcg_in_oom"
-.LASF827:
+.LASF829:
 	.string	"notify_next"
-.LASF1334:
+.LASF1336:
 	.string	"dismiss"
 .LASF89:
 	.string	"__icache_flags"
-.LASF1375:
+.LASF1377:
 	.string	"of_device_id"
-.LASF746:
+.LASF748:
 	.string	"system_power_efficient_wq"
-.LASF1121:
+.LASF1123:
 	.string	"robust_list_head"
-.LASF987:
+.LASF989:
 	.string	"MM_FILEPAGES"
-.LASF1430:
+.LASF1432:
 	.string	"WF_TYPE_MAX"
-.LASF496:
+.LASF498:
 	.string	"cpu_all_bits"
-.LASF279:
+.LASF281:
 	.string	"wait_lock"
 .LASF93:
 	.string	"console_printk"
-.LASF521:
+.LASF523:
 	.string	"N_POSSIBLE"
 .LASF98:
 	.string	"kmsg_fops"
-.LASF443:
+.LASF445:
 	.string	"memcg_oom_order"
-.LASF339:
+.LASF341:
 	.string	"memcg_kmem_skip_account"
-.LASF1017:
+.LASF1019:
 	.string	"pcount"
-.LASF1146:
+.LASF1148:
 	.string	"kref"
-.LASF1507:
+.LASF1509:
 	.string	"newpic"
-.LASF434:
+.LASF436:
 	.string	"nr_dirtied"
-.LASF268:
+.LASF270:
 	.string	"sve_vl_onexec"
 .LASF9:
 	.string	"__u16"
-.LASF584:
+.LASF586:
 	.string	"WORKINGSET_RESTORE"
-.LASF598:
+.LASF600:
 	.string	"NR_VMSCAN_IMMEDIATE"
-.LASF506:
+.LASF508:
 	.string	"tags"
-.LASF488:
+.LASF490:
 	.string	"cpumask"
-.LASF253:
+.LASF255:
 	.string	"debug_info"
-.LASF283:
+.LASF285:
 	.string	"state"
-.LASF943:
+.LASF945:
 	.string	"sigset_t"
-.LASF1254:
+.LASF1256:
 	.string	"RPM_RESUMING"
-.LASF1086:
+.LASF1088:
 	.string	"dl_deadline"
-.LASF816:
+.LASF818:
 	.string	"kernfs_elem_symlink"
-.LASF1029:
+.LASF1031:
 	.string	"load_sum"
-.LASF1013:
+.LASF1015:
 	.string	"cpu_id"
-.LASF925:
+.LASF927:
 	.string	"softirq_expires_next"
-.LASF1104:
+.LASF1106:
 	.string	"perf_hw_context"
-.LASF772:
+.LASF774:
 	.string	"PCPU_FC_NR"
-.LASF1390:
+.LASF1392:
 	.string	"fwnode_handle"
-.LASF1191:
+.LASF1193:
 	.string	"prepare"
-.LASF1099:
+.LASF1101:
 	.string	"need_qs"
-.LASF379:
+.LASF381:
 	.string	"files"
-.LASF1111:
+.LASF1113:
 	.string	"task_group"
-.LASF1095:
+.LASF1097:
 	.string	"dl_non_contending"
-.LASF668:
+.LASF670:
 	.string	"lowmem_reserve"
-.LASF565:
+.LASF567:
 	.string	"NR_PAGETABLE"
-.LASF1236:
+.LASF1238:
 	.string	"of_node"
-.LASF377:
+.LASF379:
 	.string	"last_switch_count"
-.LASF908:
+.LASF910:
 	.string	"cpu_base"
 .LASF128:
 	.string	"module"
-.LASF689:
+.LASF691:
 	.string	"MAX_ZONELISTS"
-.LASF735:
+.LASF737:
 	.string	"function"
-.LASF554:
+.LASF556:
 	.string	"zone_padding"
 .LASF59:
 	.string	"func"
 .LASF74:
 	.string	"pstate_check_t"
-.LASF954:
+.LASF956:
 	.string	"_sys_private"
-.LASF462:
+.LASF464:
 	.string	"tz_dsttime"
 .LASF21:
 	.string	"__kernel_ulong_t"
-.LASF1139:
+.LASF1141:
 	.string	"is_visible"
-.LASF638:
+.LASF640:
 	.string	"kcompactd_classzone_idx"
-.LASF1024:
+.LASF1026:
 	.string	"util_est"
-.LASF270:
+.LASF272:
 	.string	"fault_code"
 .LASF90:
 	.string	"linux_banner"
-.LASF814:
+.LASF816:
 	.string	"supers"
-.LASF445:
+.LASF447:
 	.string	"active_memcg"
-.LASF1004:
+.LASF1006:
 	.string	"read_bytes"
 .LASF176:
 	.string	"arm64_ftr_reg"
-.LASF1222:
+.LASF1224:
 	.string	"msi_domain"
 .LASF12:
 	.string	"__u32"
-.LASF784:
+.LASF786:
 	.string	"freq_scale"
-.LASF288:
+.LASF290:
 	.string	"on_cpu"
 .LASF127:
 	.string	"c_false"
-.LASF431:
+.LASF433:
 	.string	"splice_pipe"
-.LASF872:
+.LASF874:
 	.string	"initial_ns"
-.LASF1312:
+.LASF1314:
 	.string	"accounting_timestamp"
-.LASF550:
+.LASF552:
 	.string	"page_group_by_mobility_disabled"
-.LASF934:
+.LASF936:
 	.string	"HRTIMER_BASE_REALTIME_SOFT"
-.LASF843:
+.LASF845:
 	.string	"kernfs_iattrs"
 .LASF73:
 	.string	"iomem_resource"
-.LASF912:
+.LASF914:
 	.string	"hrtimer_cpu_base"
-.LASF353:
+.LASF355:
 	.string	"thread_group"
-.LASF1490:
+.LASF1492:
 	.string	"pix1_old"
-.LASF1270:
+.LASF1272:
 	.string	"async_suspend"
-.LASF489:
+.LASF491:
 	.string	"bits"
 .LASF60:
 	.string	"resource"
@@ -17434,229 +17448,229 @@ spi_id_buffer.16929:
 	.string	"__security_initcall_start"
 .LASF18:
 	.string	"true"
-.LASF1189:
+.LASF1191:
 	.string	"pm_message_t"
-.LASF1427:
+.LASF1429:
 	.string	"WF_TYPE_GLR16"
-.LASF1509:
+.LASF1511:
 	.string	"tempdata"
-.LASF228:
+.LASF230:
 	.string	"__alt_instructions"
-.LASF1358:
+.LASF1360:
 	.string	"dma_configure"
-.LASF662:
+.LASF664:
 	.string	"ZONE_NORMAL"
-.LASF871:
+.LASF873:
 	.string	"netlink_ns"
 .LASF20:
 	.string	"long int"
-.LASF914:
+.LASF916:
 	.string	"clock_was_set_seq"
 .LASF72:
 	.string	"ioport_resource"
-.LASF802:
+.LASF804:
 	.string	"fs_overflowgid"
-.LASF1012:
+.LASF1014:
 	.string	"cpu_id_start"
-.LASF1126:
+.LASF1128:
 	.string	"task_delay_info"
-.LASF693:
+.LASF695:
 	.string	"_zonerefs"
-.LASF1181:
+.LASF1183:
 	.string	"klist_node"
-.LASF935:
+.LASF937:
 	.string	"HRTIMER_BASE_BOOTTIME_SOFT"
-.LASF752:
+.LASF754:
 	.string	"notifier_block"
-.LASF646:
+.LASF648:
 	.string	"vm_stat"
-.LASF699:
+.LASF701:
 	.string	"total_cpus"
-.LASF1119:
+.LASF1121:
 	.string	"blk_plug"
-.LASF785:
+.LASF787:
 	.string	"max_freq_scale"
-.LASF322:
+.LASF324:
 	.string	"active_mm"
 .LASF119:
 	.string	"SYSTEM_RUNNING"
-.LASF309:
+.LASF311:
 	.string	"rcu_read_lock_nesting"
-.LASF683:
+.LASF685:
 	.string	"compact_order_failed"
-.LASF438:
+.LASF440:
 	.string	"default_timer_slack_ns"
-.LASF329:
+.LASF331:
 	.string	"jobctl"
-.LASF1122:
+.LASF1124:
 	.string	"compat_robust_list_head"
-.LASF673:
+.LASF675:
 	.string	"managed_pages"
-.LASF556:
+.LASF558:
 	.string	"NR_FREE_PAGES"
 .LASF80:
 	.string	"__security_initcall_end"
-.LASF1232:
+.LASF1234:
 	.string	"dma_mem"
-.LASF1201:
+.LASF1203:
 	.string	"freeze_late"
-.LASF1057:
+.LASF1059:
 	.string	"nr_wakeups_migrate"
 .LASF205:
 	.string	"__end_ro_after_init"
-.LASF1190:
+.LASF1192:
 	.string	"dev_pm_ops"
-.LASF1041:
+.LASF1043:
 	.string	"iowait_count"
-.LASF722:
+.LASF724:
 	.string	"set_next_event_virt"
-.LASF557:
+.LASF559:
 	.string	"NR_ZONE_LRU_BASE"
-.LASF1125:
+.LASF1127:
 	.string	"pipe_inode_info"
 .LASF209:
 	.string	"__per_cpu_end"
-.LASF869:
+.LASF871:
 	.string	"current_may_mount"
-.LASF837:
+.LASF839:
 	.string	"write"
-.LASF552:
+.LASF554:
 	.string	"free_list"
-.LASF1087:
+.LASF1089:
 	.string	"dl_period"
-.LASF833:
+.LASF835:
 	.string	"seq_stop"
-.LASF1022:
+.LASF1024:
 	.string	"weight"
-.LASF1339:
+.LASF1341:
 	.string	"missed"
-.LASF924:
+.LASF926:
 	.string	"next_timer"
-.LASF311:
+.LASF313:
 	.string	"rcu_node_entry"
-.LASF1473:
+.LASF1475:
 	.string	"pvi_wf"
-.LASF856:
+.LASF858:
 	.string	"list"
-.LASF397:
+.LASF399:
 	.string	"pi_waiters"
-.LASF1343:
+.LASF1345:
 	.string	"iommu"
-.LASF1131:
+.LASF1133:
 	.string	"cad_pid"
-.LASF439:
+.LASF441:
 	.string	"trace"
-.LASF1128:
+.LASF1130:
 	.string	"request_queue"
-.LASF1355:
+.LASF1357:
 	.string	"shutdown"
-.LASF1211:
+.LASF1213:
 	.string	"runtime_suspend"
-.LASF745:
+.LASF747:
 	.string	"system_freezable_wq"
-.LASF1336:
+.LASF1338:
 	.string	"interval"
 .LASF215:
 	.string	"__end_rodata"
-.LASF629:
+.LASF631:
 	.string	"node_spanned_pages"
-.LASF1005:
+.LASF1007:
 	.string	"write_bytes"
-.LASF905:
+.LASF907:
 	.string	"is_rel"
-.LASF923:
+.LASF925:
 	.string	"expires_next"
-.LASF846:
+.LASF848:
 	.string	"show_options"
 .LASF15:
 	.string	"__u64"
-.LASF949:
+.LASF951:
 	.string	"_pid"
-.LASF724:
+.LASF726:
 	.string	"timer_unstable_counter_workaround"
-.LASF474:
+.LASF476:
 	.string	"clockid"
-.LASF1351:
+.LASF1353:
 	.string	"match"
-.LASF476:
+.LASF478:
 	.string	"ufds"
 .LASF139:
 	.string	"lock_stat"
-.LASF1074:
+.LASF1076:
 	.string	"depth"
 .LASF163:
 	.string	"system_states"
-.LASF1458:
+.LASF1460:
 	.string	"wfm_rev"
 .LASF26:
 	.string	"__kernel_ssize_t"
-.LASF812:
+.LASF814:
 	.string	"next_generation"
-.LASF568:
+.LASF570:
 	.string	"NR_ZSPAGES"
-.LASF1311:
+.LASF1313:
 	.string	"suspended_jiffies"
-.LASF1134:
+.LASF1136:
 	.string	"RSEQ_EVENT_PREEMPT_BIT"
-.LASF1163:
+.LASF1165:
 	.string	"kobj_type"
-.LASF402:
+.LASF404:
 	.string	"plug"
 .LASF0:
 	.string	"long unsigned int"
-.LASF1416:
+.LASF1418:
 	.string	"kmem_cache"
-.LASF355:
+.LASF357:
 	.string	"vfork_done"
-.LASF1440:
+.LASF1442:
 	.string	"PVI_WF_GCC16"
-.LASF1368:
+.LASF1370:
 	.string	"coredump"
-.LASF481:
+.LASF483:
 	.string	"nanosleep"
 .LASF193:
 	.string	"_stext"
-.LASF1027:
+.LASF1029:
 	.string	"sched_avg"
-.LASF942:
+.LASF944:
 	.string	"seccomp_filter"
-.LASF1353:
+.LASF1355:
 	.string	"sync_state"
-.LASF403:
+.LASF405:
 	.string	"reclaim_state"
-.LASF1144:
+.LASF1146:
 	.string	"kset"
-.LASF962:
+.LASF964:
 	.string	"_pkey"
-.LASF676:
+.LASF678:
 	.string	"nr_isolate_pageblock"
 .LASF206:
 	.string	"_end"
-.LASF1227:
+.LASF1229:
 	.string	"coherent_dma_mask"
 .LASF57:
 	.string	"pprev"
-.LASF850:
+.LASF852:
 	.string	"show_path"
 .LASF198:
 	.string	"__bss_start"
-.LASF1379:
+.LASF1381:
 	.string	"dev_kobj"
-.LASF1205:
+.LASF1207:
 	.string	"suspend_noirq"
-.LASF806:
+.LASF808:
 	.string	"kgid_t"
-.LASF783:
+.LASF785:
 	.string	"cpu_scale"
-.LASF836:
+.LASF838:
 	.string	"prealloc"
-.LASF741:
+.LASF743:
 	.string	"system_wq"
-.LASF1183:
+.LASF1185:
 	.string	"n_node"
-.LASF754:
+.LASF756:
 	.string	"priority"
-.LASF1231:
+.LASF1233:
 	.string	"dma_pools"
 .LASF95:
 	.string	"printk_delay_msec"
@@ -17664,89 +17678,89 @@ spi_id_buffer.16929:
 	.string	"char"
 .LASF221:
 	.string	"__end_once"
-.LASF451:
+.LASF453:
 	.string	"stack_refcount"
-.LASF690:
+.LASF692:
 	.string	"zoneref"
-.LASF823:
+.LASF825:
 	.string	"iattr"
-.LASF1508:
+.LASF1510:
 	.string	"frame_tmp"
-.LASF1049:
+.LASF1051:
 	.string	"slice_max"
-.LASF350:
+.LASF352:
 	.string	"ptrace_entry"
-.LASF533:
+.LASF535:
 	.string	"READ_IMPLIES_EXEC"
-.LASF672:
+.LASF674:
 	.string	"zone_start_pfn"
 .LASF158:
 	.string	"enabled"
 .LASF35:
 	.string	"umode_t"
-.LASF393:
+.LASF395:
 	.string	"self_exec_id"
-.LASF1039:
+.LASF1041:
 	.string	"wait_count"
-.LASF1501:
+.LASF1503:
 	.string	"get_wf_mode_index"
-.LASF1333:
+.LASF1335:
 	.string	"sync"
-.LASF748:
+.LASF750:
 	.string	"completion"
-.LASF412:
+.LASF414:
 	.string	"acct_timexpd"
-.LASF1078:
+.LASF1080:
 	.string	"run_list"
-.LASF293:
+.LASF295:
 	.string	"wake_cpu"
-.LASF617:
+.LASF619:
 	.string	"lruvec"
 .LASF208:
 	.string	"__per_cpu_start"
-.LASF977:
+.LASF979:
 	.string	"_sigsys"
-.LASF520:
+.LASF522:
 	.string	"node_states"
-.LASF841:
+.LASF843:
 	.string	"symlink"
-.LASF666:
+.LASF668:
 	.string	"watermark"
-.LASF387:
+.LASF389:
 	.string	"sas_ss_size"
-.LASF882:
+.LASF884:
 	.string	"upid"
-.LASF635:
+.LASF637:
 	.string	"kswapd_classzone_idx"
-.LASF323:
+.LASF325:
 	.string	"vmacache"
-.LASF1301:
+.LASF1303:
 	.string	"use_autosuspend"
 .LASF177:
 	.string	"strict_mask"
 .LASF111:
 	.string	"sysctl_panic_on_rcu_stall"
-.LASF485:
+.LASF487:
 	.string	"addr_limit"
-.LASF1324:
+.LASF1326:
 	.string	"relax_count"
-.LASF1170:
+.LASF1172:
 	.string	"envp"
-.LASF233:
+.LASF235:
 	.string	"__hibernate_exit_text_end"
-.LASF1459:
+.LASF1461:
 	.string	"frame_rate"
-.LASF727:
+.LASF729:
 	.string	"jiffies_64"
-.LASF820:
+.LASF822:
 	.string	"hash"
-.LASF919:
+.LASF921:
 	.string	"nr_events"
 .LASF87:
 	.string	"alternatives_applied"
-.LASF765:
+.LASF767:
 	.string	"__highest_present_section_nr"
-.LASF897:
+.LASF899:
 	.string	"node"
 .LASF68:
 	.string	"android_kabi_reserved1"
@@ -17756,397 +17770,397 @@ spi_id_buffer.16929:
 	.string	"android_kabi_reserved3"
 .LASF71:
 	.string	"android_kabi_reserved4"
-.LASF374:
+.LASF376:
 	.string	"cred"
-.LASF1251:
+.LASF1253:
 	.string	"android_kabi_reserved6"
-.LASF454:
+.LASF456:
 	.string	"android_kabi_reserved7"
-.LASF414:
+.LASF416:
 	.string	"mems_allowed_seq"
-.LASF976:
+.LASF978:
 	.string	"_sigpoll"
-.LASF1088:
+.LASF1090:
 	.string	"dl_bw"
-.LASF725:
+.LASF727:
 	.string	"tick_usec"
-.LASF1300:
+.LASF1302:
 	.string	"irq_safe"
-.LASF982:
+.LASF984:
 	.string	"_sifields"
 .LASF37:
 	.string	"clockid_t"
-.LASF1015:
+.LASF1017:
 	.string	"task_cputime"
-.LASF364:
+.LASF366:
 	.string	"nvcsw"
-.LASF1426:
+.LASF1428:
 	.string	"WF_TYPE_GL16"
-.LASF1288:
+.LASF1290:
 	.string	"work"
-.LASF695:
+.LASF697:
 	.string	"rw_semaphore"
-.LASF1160:
+.LASF1162:
 	.string	"list_lock"
-.LASF316:
+.LASF318:
 	.string	"rcu_tasks_idle_cpu"
-.LASF386:
+.LASF388:
 	.string	"sas_ss_sp"
-.LASF1051:
+.LASF1053:
 	.string	"nr_failed_migrations_affine"
-.LASF499:
+.LASF501:
 	.string	"private_list"
-.LASF373:
+.LASF375:
 	.string	"real_cred"
-.LASF1263:
+.LASF1265:
 	.string	"pm_subsys_data"
-.LASF1123:
+.LASF1125:
 	.string	"futex_pi_state"
-.LASF1040:
+.LASF1042:
 	.string	"wait_sum"
-.LASF303:
+.LASF305:
 	.string	"boost_expires"
-.LASF332:
+.LASF334:
 	.string	"sched_contributes_to_load"
-.LASF1094:
+.LASF1096:
 	.string	"dl_yielded"
-.LASF1120:
+.LASF1122:
 	.string	"css_set"
-.LASF583:
+.LASF585:
 	.string	"WORKINGSET_ACTIVATE"
-.LASF729:
+.LASF731:
 	.string	"preset_lpj"
-.LASF263:
+.LASF265:
 	.string	"fpsimd_state"
 .LASF188:
 	.string	"vregs"
-.LASF318:
+.LASF320:
 	.string	"sched_info"
-.LASF880:
+.LASF882:
 	.string	"PIDTYPE_SID"
-.LASF1377:
+.LASF1379:
 	.string	"driver_private"
-.LASF1214:
+.LASF1216:
 	.string	"device"
-.LASF514:
+.LASF516:
 	.string	"wait_queue_head_t"
 .LASF100:
 	.string	"lock"
-.LASF1105:
+.LASF1107:
 	.string	"perf_sw_context"
-.LASF610:
+.LASF612:
 	.string	"LRU_INACTIVE_FILE"
-.LASF979:
+.LASF981:
 	.string	"si_signo"
-.LASF1192:
+.LASF1194:
 	.string	"complete"
-.LASF1411:
+.LASF1413:
 	.string	"usercopy_fallback"
-.LASF1258:
+.LASF1260:
 	.string	"RPM_REQ_NONE"
-.LASF255:
+.LASF257:
 	.string	"bps_disabled"
-.LASF753:
+.LASF755:
 	.string	"notifier_call"
-.LASF1491:
+.LASF1493:
 	.string	"temp1"
-.LASF1492:
+.LASF1494:
 	.string	"temp2"
-.LASF1476:
+.LASF1478:
 	.string	"output"
-.LASF400:
+.LASF402:
 	.string	"journal_info"
-.LASF1064:
+.LASF1066:
 	.string	"sched_entity"
 .LASF45:
 	.string	"gfp_t"
-.LASF272:
+.LASF274:
 	.string	"signal_minsigstksz"
 .LASF84:
 	.string	"rodata_enabled"
 .LASF157:
 	.string	"static_key"
-.LASF624:
+.LASF626:
 	.string	"node_zones"
-.LASF369:
+.LASF371:
 	.string	"maj_flt"
-.LASF1452:
+.LASF1454:
 	.string	"mode_version"
-.LASF1359:
+.LASF1361:
 	.string	"iommu_ops"
-.LASF1159:
+.LASF1161:
 	.string	"uevent_seqnum"
-.LASF966:
+.LASF968:
 	.string	"_addr"
-.LASF302:
+.LASF304:
 	.string	"boost_period"
-.LASF1315:
+.LASF1317:
 	.string	"wakeup_source"
-.LASF1202:
+.LASF1204:
 	.string	"thaw_early"
-.LASF301:
+.LASF303:
 	.string	"boost"
 .LASF201:
 	.string	"__init_end"
-.LASF1275:
+.LASF1277:
 	.string	"is_late_suspended"
-.LASF1106:
+.LASF1108:
 	.string	"perf_nr_task_contexts"
-.LASF648:
+.LASF650:
 	.string	"WMARK_MIN"
-.LASF1216:
+.LASF1218:
 	.string	"driver"
-.LASF577:
+.LASF579:
 	.string	"NR_UNEVICTABLE"
-.LASF859:
+.LASF861:
 	.string	"released"
-.LASF1480:
+.LASF1482:
 	.string	"sftemp"
-.LASF817:
+.LASF819:
 	.string	"target_kn"
-.LASF1284:
+.LASF1286:
 	.string	"must_resume"
-.LASF649:
+.LASF651:
 	.string	"WMARK_LOW"
-.LASF861:
+.LASF863:
 	.string	"vm_operations_struct"
 .LASF142:
 	.string	"raw_spinlock_t"
-.LASF792:
+.LASF794:
 	.string	"rb_node"
-.LASF1219:
+.LASF1221:
 	.string	"links"
-.LASF697:
+.LASF699:
 	.string	"sys_tz"
 .LASF78:
 	.string	"__con_initcall_end"
-.LASF721:
+.LASF723:
 	.string	"set_next_event_phys"
 .LASF24:
 	.string	"__kernel_gid32_t"
-.LASF1200:
+.LASF1202:
 	.string	"resume_early"
 .LASF47:
 	.string	"resource_size_t"
-.LASF336:
+.LASF338:
 	.string	"in_execve"
-.LASF999:
+.LASF1001:
 	.string	"rchar"
-.LASF743:
+.LASF745:
 	.string	"system_long_wq"
-.LASF430:
+.LASF432:
 	.string	"tlb_ubc"
-.LASF1073:
+.LASF1075:
 	.string	"statistics"
-.LASF347:
+.LASF349:
 	.string	"children"
-.LASF986:
+.LASF988:
 	.string	"vmas"
-.LASF773:
+.LASF775:
 	.string	"pcpu_fc_names"
-.LASF532:
+.LASF534:
 	.string	"ADDR_COMPAT_LAYOUT"
-.LASF294:
+.LASF296:
 	.string	"on_rq"
-.LASF1292:
+.LASF1294:
 	.string	"child_count"
-.LASF1287:
+.LASF1289:
 	.string	"timer_expires"
-.LASF829:
+.LASF831:
 	.string	"release"
 .LASF135:
 	.string	"tail"
-.LASF296:
+.LASF298:
 	.string	"static_prio"
-.LASF1432:
+.LASF1434:
 	.string	"PVI_WF_RESET"
-.LASF356:
+.LASF358:
 	.string	"set_child_tid"
-.LASF863:
+.LASF865:
 	.string	"vm_area_struct"
-.LASF1387:
+.LASF1389:
 	.string	"device_dma_parameters"
-.LASF266:
+.LASF268:
 	.string	"sve_state"
-.LASF868:
+.LASF870:
 	.string	"kobj_ns_type_operations"
-.LASF788:
+.LASF790:
 	.string	"idr_base"
 .LASF104:
 	.string	"panic_blink"
-.LASF313:
+.LASF315:
 	.string	"rcu_tasks_nvcsw"
-.LASF442:
+.LASF444:
 	.string	"memcg_oom_gfp_mask"
-.LASF696:
+.LASF698:
 	.string	"m_count"
-.LASF835:
+.LASF837:
 	.string	"atomic_write_len"
-.LASF324:
+.LASF326:
 	.string	"rss_stat"
-.LASF1322:
+.LASF1324:
 	.string	"event_count"
 .LASF44:
 	.string	"ssize_t"
-.LASF483:
+.LASF485:
 	.string	"current_stack_pointer"
-.LASF1199:
+.LASF1201:
 	.string	"suspend_late"
-.LASF1169:
+.LASF1171:
 	.string	"argv"
-.LASF664:
+.LASF666:
 	.string	"__MAX_NR_ZONES"
-.LASF1482:
+.LASF1484:
 	.string	"mode_index"
-.LASF436:
+.LASF438:
 	.string	"dirty_paused_when"
-.LASF1363:
+.LASF1365:
 	.string	"mod_name"
 .LASF53:
 	.string	"list_head"
-.LASF1326:
+.LASF1328:
 	.string	"wakeup_count"
-.LASF349:
+.LASF351:
 	.string	"ptraced"
 .LASF222:
 	.string	"__ctors_start"
-.LASF1408:
+.LASF1410:
 	.string	"device_node"
-.LASF730:
+.LASF732:
 	.string	"ktime_t"
-.LASF1485:
+.LASF1487:
 	.string	"pix0_wf"
-.LASF1515:
+.LASF1517:
 	.string	"printk"
-.LASF739:
+.LASF741:
 	.string	"data"
-.LASF1059:
+.LASF1061:
 	.string	"nr_wakeups_remote"
-.LASF718:
+.LASF720:
 	.string	"read_cntv_tval_el0"
-.LASF1047:
+.LASF1049:
 	.string	"block_max"
-.LASF590:
+.LASF592:
 	.string	"NR_WRITEBACK"
 .LASF180:
 	.string	"user_val"
-.LASF921:
+.LASF923:
 	.string	"nr_hangs"
-.LASF876:
+.LASF878:
 	.string	"pid_type"
-.LASF244:
+.LASF246:
 	.string	"__mmuoff_data_start"
 .LASF82:
 	.string	"saved_command_line"
-.LASF640:
+.LASF642:
 	.string	"kcompactd"
 .LASF101:
 	.string	"head"
-.LASF1399:
+.LASF1401:
 	.string	"needs_suppliers"
-.LASF865:
+.LASF867:
 	.string	"KOBJ_NS_TYPE_NONE"
 .LASF92:
 	.string	"linux_proc_banner"
-.LASF1248:
+.LASF1250:
 	.string	"of_node_reused"
 .LASF121:
 	.string	"SYSTEM_POWER_OFF"
-.LASF482:
+.LASF484:
 	.string	"poll"
 .LASF146:
 	.string	"compat_elf_hwcap"
-.LASF948:
+.LASF950:
 	.string	"sigval_t"
 .LASF174:
 	.string	"width"
-.LASF904:
+.LASF906:
 	.string	"base"
-.LASF422:
+.LASF424:
 	.string	"pi_state_cache"
 .LASF187:
 	.string	"user_fpsimd_state"
-.LASF1011:
+.LASF1013:
 	.string	"ptr64"
-.LASF602:
+.LASF604:
 	.string	"NR_UNRECLAIMABLE_PAGES"
-.LASF1092:
+.LASF1094:
 	.string	"dl_throttled"
-.LASF1184:
+.LASF1186:
 	.string	"n_ref"
-.LASF1472:
+.LASF1474:
 	.string	"pvi_wf_input"
-.LASF389:
+.LASF391:
 	.string	"task_works"
-.LASF615:
+.LASF617:
 	.string	"recent_rotated"
-.LASF256:
+.LASF258:
 	.string	"wps_disabled"
-.LASF1429:
+.LASF1431:
 	.string	"WF_TYPE_GCC16"
-.LASF1265:
+.LASF1267:
 	.string	"domain_data"
-.LASF619:
+.LASF621:
 	.string	"reclaim_stat"
-.LASF582:
+.LASF584:
 	.string	"WORKINGSET_REFAULT"
-.LASF1302:
+.LASF1304:
 	.string	"timer_autosuspends"
-.LASF236:
+.LASF238:
 	.string	"__hyp_text_start"
-.LASF777:
+.LASF779:
 	.string	"core_id"
 .LASF28:
 	.string	"__kernel_time_t"
-.LASF1174:
+.LASF1176:
 	.string	"uevent"
-.LASF870:
+.LASF872:
 	.string	"grab_current_ns"
-.LASF1454:
+.LASF1456:
 	.string	"wf_subversion"
-.LASF254:
+.LASF256:
 	.string	"suspended_step"
-.LASF838:
+.LASF840:
 	.string	"mmap"
-.LASF1091:
+.LASF1093:
 	.string	"deadline"
-.LASF518:
+.LASF520:
 	.string	"nodemask_t"
-.LASF1327:
+.LASF1329:
 	.string	"autosleep_enabled"
-.LASF1479:
+.LASF1481:
 	.string	"stype"
-.LASF770:
+.LASF772:
 	.string	"PCPU_FC_EMBED"
-.LASF235:
+.LASF237:
 	.string	"__hyp_idmap_text_end"
-.LASF1279:
+.LASF1281:
 	.string	"driver_flags"
-.LASF681:
+.LASF683:
 	.string	"compact_considered"
-.LASF975:
+.LASF977:
 	.string	"_sigfault"
 .LASF219:
 	.string	"__softirqentry_text_end"
-.LASF711:
+.LASF713:
 	.string	"arch_timer_erratum_match_type"
-.LASF1464:
+.LASF1466:
 	.string	"modenumber"
-.LASF278:
+.LASF280:
 	.string	"owner"
 .LASF147:
 	.string	"compat_elf_hwcap2"
-.LASF458:
+.LASF460:
 	.string	"tv_sec"
-.LASF936:
+.LASF938:
 	.string	"HRTIMER_BASE_TAI_SOFT"
 .LASF31:
 	.string	"__kernel_clockid_t"
-.LASF1425:
+.LASF1427:
 	.string	"WF_TYPE_GC16"
-.LASF1245:
+.LASF1247:
 	.string	"iommu_fwspec"
-.LASF889:
+.LASF891:
 	.string	"init_pid_ns"
 .LASF218:
 	.string	"__softirqentry_text_start"
@@ -18154,391 +18168,391 @@ spi_id_buffer.16929:
 	.string	"long long unsigned int"
 .LASF65:
 	.string	"parent"
-.LASF501:
+.LASF503:
 	.string	"offset"
-.LASF477:
+.LASF479:
 	.string	"nfds"
 .LASF36:
 	.string	"pid_t"
-.LASF913:
+.LASF915:
 	.string	"active_bases"
 .LASF204:
 	.string	"__start_ro_after_init"
-.LASF470:
+.LASF472:
 	.string	"uaddr2"
-.LASF1151:
+.LASF1153:
 	.string	"uevent_suppress"
 .LASF40:
 	.string	"uid_t"
-.LASF675:
+.LASF677:
 	.string	"present_pages"
-.LASF1081:
+.LASF1083:
 	.string	"time_slice"
-.LASF534:
+.LASF536:
 	.string	"ADDR_LIMIT_32BIT"
-.LASF273:
+.LASF275:
 	.string	"sve_max_vl"
-.LASF612:
+.LASF614:
 	.string	"LRU_UNEVICTABLE"
-.LASF623:
+.LASF625:
 	.string	"pglist_data"
-.LASF1033:
+.LASF1035:
 	.string	"load_avg"
-.LASF530:
+.LASF532:
 	.string	"FDPIC_FUNCPTRS"
-.LASF1469:
+.LASF1471:
 	.string	"waveform"
-.LASF776:
+.LASF778:
 	.string	"thread_id"
-.LASF883:
+.LASF885:
 	.string	"pid_namespace"
-.LASF595:
+.LASF597:
 	.string	"NR_ANON_THPS"
-.LASF608:
+.LASF610:
 	.string	"LRU_INACTIVE_ANON"
-.LASF1285:
+.LASF1287:
 	.string	"may_skip_resume"
-.LASF1414:
+.LASF1416:
 	.string	"KMALLOC_RECLAIM"
-.LASF828:
+.LASF830:
 	.string	"kernfs_ops"
-.LASF795:
+.LASF797:
 	.string	"rb_left"
-.LASF892:
+.LASF894:
 	.string	"refcount_t"
-.LASF265:
+.LASF267:
 	.string	"fpsimd_cpu"
-.LASF1260:
+.LASF1262:
 	.string	"RPM_REQ_SUSPEND"
-.LASF1510:
+.LASF1512:
 	.string	"israr"
-.LASF358:
+.LASF360:
 	.string	"utime"
-.LASF226:
+.LASF228:
 	.string	"__nosave_begin"
-.LASF965:
+.LASF967:
 	.string	"_addr_pkey"
-.LASF1511:
+.LASF1513:
 	.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"
-.LASF1264:
+.LASF1266:
 	.string	"clock_list"
 .LASF136:
 	.string	"qspinlock"
-.LASF941:
+.LASF943:
 	.string	"filter"
-.LASF625:
+.LASF627:
 	.string	"node_zonelists"
-.LASF796:
+.LASF798:
 	.string	"rb_root"
-.LASF945:
+.LASF947:
 	.string	"sigval"
-.LASF1283:
+.LASF1285:
 	.string	"no_pm_callbacks"
-.LASF1220:
+.LASF1222:
 	.string	"power"
-.LASF1401:
+.LASF1403:
 	.string	"need_for_probe"
 .LASF156:
 	.string	"static_key_mod"
-.LASF541:
+.LASF543:
 	.string	"MIGRATE_UNMOVABLE"
-.LASF1502:
+.LASF1504:
 	.string	"pvi_modes"
-.LASF957:
+.LASF959:
 	.string	"_stime"
 .LASF88:
 	.string	"atomic_long_t"
-.LASF611:
+.LASF613:
 	.string	"LRU_ACTIVE_FILE"
-.LASF1461:
+.LASF1463:
 	.string	"vcom_offset"
-.LASF1025:
+.LASF1027:
 	.string	"enqueued"
-.LASF1140:
+.LASF1142:
 	.string	"is_bin_visible"
-.LASF479:
+.LASF481:
 	.string	"pollfd"
-.LASF1266:
+.LASF1268:
 	.string	"pm_domain_data"
-.LASF738:
+.LASF740:
 	.string	"work_struct"
-.LASF1282:
+.LASF1284:
 	.string	"syscore"
-.LASF873:
+.LASF875:
 	.string	"drop_ns"
-.LASF262:
+.LASF264:
 	.string	"tp2_value"
-.LASF1233:
+.LASF1235:
 	.string	"cma_area"
-.LASF1366:
+.LASF1368:
 	.string	"of_match_table"
-.LASF460:
+.LASF462:
 	.string	"timezone"
-.LASF1306:
+.LASF1308:
 	.string	"runtime_status"
-.LASF1269:
+.LASF1271:
 	.string	"can_wakeup"
-.LASF1391:
+.LASF1393:
 	.string	"dl_dev_state"
-.LASF1145:
+.LASF1147:
 	.string	"ktype"
 .LASF108:
 	.string	"panic_on_unrecovered_nmi"
-.LASF1023:
+.LASF1025:
 	.string	"inv_weight"
-.LASF401:
+.LASF403:
 	.string	"bio_list"
-.LASF1382:
+.LASF1384:
 	.string	"dev_release"
-.LASF844:
+.LASF846:
 	.string	"kernfs_syscall_ops"
-.LASF574:
+.LASF576:
 	.string	"NR_ACTIVE_ANON"
-.LASF737:
+.LASF739:
 	.string	"work_func_t"
-.LASF660:
+.LASF662:
 	.string	"zone_type"
-.LASF593:
+.LASF595:
 	.string	"NR_SHMEM_THPS"
-.LASF983:
+.LASF985:
 	.string	"siginfo_t"
-.LASF1156:
+.LASF1158:
 	.string	"store"
 .LASF34:
 	.string	"dev_t"
-.LASF240:
+.LASF242:
 	.string	"__initdata_begin"
-.LASF1384:
+.LASF1386:
 	.string	"ns_type"
-.LASF1197:
+.LASF1199:
 	.string	"poweroff"
-.LASF560:
+.LASF562:
 	.string	"NR_ZONE_INACTIVE_FILE"
-.LASF1462:
+.LASF1464:
 	.string	"xwia"
-.LASF1290:
+.LASF1292:
 	.string	"wakeirq"
-.LASF1166:
+.LASF1168:
 	.string	"namespace"
-.LASF1276:
+.LASF1278:
 	.string	"no_pm"
-.LASF1498:
+.LASF1500:
 	.string	"get_wf_temp_index"
 .LASF14:
 	.string	"long long int"
-.LASF1097:
+.LASF1099:
 	.string	"dl_timer"
-.LASF1207:
+.LASF1209:
 	.string	"freeze_noirq"
-.LASF1483:
+.LASF1485:
 	.string	"frame_idx"
-.LASF1171:
+.LASF1173:
 	.string	"envp_idx"
-.LASF314:
+.LASF316:
 	.string	"rcu_tasks_holdout"
-.LASF1003:
+.LASF1005:
 	.string	"syscfs"
-.LASF622:
+.LASF624:
 	.string	"pgdat"
 .LASF42:
 	.string	"loff_t"
-.LASF523:
+.LASF525:
 	.string	"N_NORMAL_MEMORY"
-.LASF606:
+.LASF608:
 	.string	"NR_VM_NODE_STAT_ITEMS"
-.LASF1338:
+.LASF1340:
 	.string	"printed"
-.LASF1331:
+.LASF1333:
 	.string	"detach"
 .LASF75:
 	.string	"aarch32_opcode_cond_checks"
-.LASF684:
+.LASF686:
 	.string	"compact_blockskip_flush"
-.LASF459:
+.LASF461:
 	.string	"tv_nsec"
-.LASF1234:
+.LASF1236:
 	.string	"removed_mem"
-.LASF807:
+.LASF809:
 	.string	"kernfs_elem_dir"
-.LASF1409:
+.LASF1411:
 	.string	"platform_notify"
-.LASF1016:
+.LASF1018:
 	.string	"sum_exec_runtime"
-.LASF1250:
+.LASF1252:
 	.string	"android_kabi_reserved5"
-.LASF1117:
+.LASF1119:
 	.string	"sighand_struct"
-.LASF274:
+.LASF276:
 	.string	"optimistic_spin_queue"
-.LASF1176:
+.LASF1178:
 	.string	"kernel_kobj"
-.LASF1195:
+.LASF1197:
 	.string	"freeze"
-.LASF261:
+.LASF263:
 	.string	"tp_value"
-.LASF320:
+.LASF322:
 	.string	"pushable_tasks"
-.LASF639:
+.LASF641:
 	.string	"kcompactd_wait"
-.LASF832:
+.LASF834:
 	.string	"seq_next"
-.LASF526:
+.LASF528:
 	.string	"N_CPU"
-.LASF801:
+.LASF803:
 	.string	"fs_overflowuid"
-.LASF621:
+.LASF623:
 	.string	"refaults"
-.LASF1000:
+.LASF1002:
 	.string	"wchar"
-.LASF242:
+.LASF244:
 	.string	"__inittext_begin"
-.LASF1337:
+.LASF1339:
 	.string	"burst"
-.LASF1239:
+.LASF1241:
 	.string	"devres_lock"
-.LASF632:
+.LASF634:
 	.string	"pfmemalloc_wait"
-.LASF644:
+.LASF646:
 	.string	"_pad2_"
-.LASF661:
+.LASF663:
 	.string	"ZONE_DMA32"
-.LASF491:
+.LASF493:
 	.string	"nr_cpu_ids"
-.LASF1316:
+.LASF1318:
 	.string	"timer"
-.LASF929:
+.LASF931:
 	.string	"HRTIMER_BASE_MONOTONIC"
-.LASF1371:
+.LASF1373:
 	.string	"devnode"
-.LASF264:
+.LASF266:
 	.string	"thread_struct"
-.LASF1036:
+.LASF1038:
 	.string	"sched_statistics"
-.LASF704:
+.LASF706:
 	.string	"task"
-.LASF578:
+.LASF580:
 	.string	"NR_SLAB_RECLAIMABLE"
-.LASF1393:
+.LASF1395:
 	.string	"DL_DEV_PROBING"
-.LASF292:
+.LASF294:
 	.string	"recent_used_cpu"
 .LASF190:
 	.string	"fpcr"
-.LASF281:
+.LASF283:
 	.string	"task_struct"
 .LASF159:
 	.string	"jump_label_t"
-.LASF916:
+.LASF918:
 	.string	"in_hrtirq"
 .LASF113:
 	.string	"crash_kexec_post_notifiers"
-.LASF1413:
+.LASF1415:
 	.string	"KMALLOC_NORMAL"
-.LASF290:
+.LASF292:
 	.string	"wakee_flip_decay_ts"
-.LASF572:
+.LASF574:
 	.string	"NR_LRU_BASE"
 .LASF97:
 	.string	"kptr_restrict"
-.LASF486:
+.LASF488:
 	.string	"ttbr0"
-.LASF1058:
+.LASF1060:
 	.string	"nr_wakeups_local"
-.LASF636:
+.LASF638:
 	.string	"kswapd_failures"
-.LASF757:
+.LASF759:
 	.string	"reboot_notifier_list"
 .LASF129:
 	.string	"taint_flags"
-.LASF1450:
+.LASF1452:
 	.string	"fpl_platform"
-.LASF231:
+.LASF233:
 	.string	"__exception_text_end"
-.LASF680:
+.LASF682:
 	.string	"compact_cached_migrate_pfn"
-.LASF604:
+.LASF606:
 	.string	"NR_ION_HEAP_POOL"
-.LASF1346:
+.LASF1348:
 	.string	"dev_name"
-.LASF1132:
+.LASF1134:
 	.string	"init_stack"
-.LASF1392:
+.LASF1394:
 	.string	"DL_DEV_NO_DRIVER"
-.LASF1226:
+.LASF1228:
 	.string	"dma_mask"
-.LASF1381:
+.LASF1383:
 	.string	"class_release"
-.LASF1010:
+.LASF1012:
 	.string	"RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE_BIT"
-.LASF989:
+.LASF991:
 	.string	"MM_SWAPENTS"
 .LASF17:
 	.string	"false"
-.LASF300:
+.LASF302:
 	.string	"last_sleep_ts"
-.LASF343:
+.LASF345:
 	.string	"restart_block"
-.LASF605:
+.LASF607:
 	.string	"NR_GPU_HEAP"
-.LASF586:
+.LASF588:
 	.string	"NR_ANON_MAPPED"
-.LASF1272:
+.LASF1274:
 	.string	"is_prepared"
-.LASF581:
+.LASF583:
 	.string	"NR_ISOLATED_FILE"
-.LASF896:
+.LASF898:
 	.string	"timerqueue_node"
-.LASF1243:
+.LASF1245:
 	.string	"groups"
-.LASF243:
+.LASF245:
 	.string	"__inittext_end"
-.LASF546:
+.LASF548:
 	.string	"MIGRATE_HIGHATOMIC"
-.LASF1329:
+.LASF1331:
 	.string	"dev_pm_qos"
-.LASF1082:
+.LASF1084:
 	.string	"on_list"
-.LASF317:
+.LASF319:
 	.string	"rcu_tasks_holdout_list"
-.LASF404:
+.LASF406:
 	.string	"backing_dev_info"
-.LASF1165:
+.LASF1167:
 	.string	"child_ns_type"
-.LASF569:
+.LASF571:
 	.string	"NR_FREE_CMA_PAGES"
-.LASF1135:
+.LASF1137:
 	.string	"RSEQ_EVENT_SIGNAL_BIT"
-.LASF685:
+.LASF687:
 	.string	"contiguous"
-.LASF651:
+.LASF653:
 	.string	"NR_WMARK"
-.LASF1441:
+.LASF1443:
 	.string	"PVI_WF_MAX"
-.LASF1303:
+.LASF1305:
 	.string	"memalloc_noio"
-.LASF691:
+.LASF693:
 	.string	"zone_idx"
-.LASF538:
+.LASF540:
 	.string	"ADDR_LIMIT_3GB"
-.LASF1323:
+.LASF1325:
 	.string	"active_count"
-.LASF340:
+.LASF342:
 	.string	"no_cgroup_migration"
-.LASF926:
+.LASF928:
 	.string	"softirq_next_timer"
-.LASF1149:
+.LASF1151:
 	.string	"state_add_uevent_sent"
-.LASF1374:
+.LASF1376:
 	.string	"PROBE_FORCE_SYNCHRONOUS"
-.LASF1158:
+.LASF1160:
 	.string	"uevent_helper"
-.LASF1423:
+.LASF1425:
 	.string	"WF_TYPE_AUTO"
-.LASF994:
+.LASF996:
 	.string	"events"
 .LASF178:
 	.string	"user_mask"
@@ -18546,25 +18560,25 @@ spi_id_buffer.16929:
 	.string	"root_mountflags"
 .LASF3:
 	.string	"unsigned int"
-.LASF551:
+.LASF553:
 	.string	"free_area"
-.LASF304:
+.LASF306:
 	.string	"sched_task_group"
-.LASF1182:
+.LASF1184:
 	.string	"n_klist"
-.LASF674:
+.LASF676:
 	.string	"spanned_pages"
-.LASF1373:
+.LASF1375:
 	.string	"PROBE_PREFER_ASYNCHRONOUS"
-.LASF468:
+.LASF470:
 	.string	"bitset"
-.LASF1167:
+.LASF1169:
 	.string	"get_ownership"
-.LASF887:
+.LASF889:
 	.string	"init_struct_pid"
 .LASF118:
 	.string	"SYSTEM_SCHEDULING"
-.LASF819:
+.LASF821:
 	.string	"active"
 .LASF123:
 	.string	"SYSTEM_SUSPEND"
@@ -18574,77 +18588,77 @@ spi_id_buffer.16929:
 	.string	"raw_spinlock"
 .LASF8:
 	.string	"short int"
-.LASF250:
-	.string	"kimage_vaddr"
+.LASF226:
+	.string	"__noinstr_text_start"
 .LASF67:
 	.string	"child"
-.LASF764:
+.LASF766:
 	.string	"pageblock_flags"
-.LASF421:
+.LASF423:
 	.string	"pi_state_list"
-.LASF933:
+.LASF935:
 	.string	"HRTIMER_BASE_MONOTONIC_SOFT"
-.LASF1031:
+.LASF1033:
 	.string	"util_sum"
-.LASF747:
+.LASF749:
 	.string	"system_freezable_power_efficient_wq"
 .LASF52:
 	.string	"prev"
-.LASF1299:
+.LASF1301:
 	.string	"no_callbacks"
-.LASF310:
+.LASF312:
 	.string	"rcu_read_unlock_special"
-.LASF1438:
+.LASF1440:
 	.string	"PVI_WF_GLD16"
-.LASF1298:
+.LASF1300:
 	.string	"ignore_children"
-.LASF631:
+.LASF633:
 	.string	"kswapd_wait"
 .LASF126:
 	.string	"c_true"
-.LASF245:
+.LASF247:
 	.string	"__mmuoff_data_end"
-.LASF985:
+.LASF987:
 	.string	"seqnum"
-.LASF297:
+.LASF299:
 	.string	"normal_prio"
 .LASF213:
 	.string	"__entry_text_end"
-.LASF1206:
+.LASF1208:
 	.string	"resume_noirq"
-.LASF1448:
+.LASF1450:
 	.string	"serial"
-.LASF396:
+.LASF398:
 	.string	"wake_q"
-.LASF1503:
+.LASF1505:
 	.string	"parse_mode_version"
-.LASF596:
+.LASF598:
 	.string	"NR_UNSTABLE_NFS"
-.LASF955:
+.LASF957:
 	.string	"_status"
-.LASF561:
+.LASF563:
 	.string	"NR_ZONE_ACTIVE_FILE"
 .LASF189:
 	.string	"fpsr"
-.LASF516:
+.LASF518:
 	.string	"sequence"
 .LASF63:
 	.string	"flags"
-.LASF461:
+.LASF463:
 	.string	"tz_minuteswest"
-.LASF426:
+.LASF428:
 	.string	"rseq"
-.LASF444:
+.LASF446:
 	.string	"memcg_nr_pages_over_high"
-.LASF352:
+.LASF354:
 	.string	"pid_links"
-.LASF232:
+.LASF234:
 	.string	"__hibernate_exit_text_start"
-.LASF1317:
+.LASF1319:
 	.string	"total_time"
 .LASF211:
 	.string	"__kprobes_text_end"
-.LASF1481:
+.LASF1483:
 	.string	"temp_index"
 	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
 	.section	.note.GNU-stack,"",@progbits
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S
index 58ffc170160f..78cb8204855d 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S
@@ -14,7 +14,7 @@
 	.p2align 3,,7
 	.type	decode_wf_data, %function
 decode_wf_data:
-.LFB1555:
+.LFB1556:
 	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform.c"
 	.loc 1 242 0
 	.cfi_startproc
@@ -87,13 +87,13 @@ decode_wf_data:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE1555:
+.LFE1556:
 	.size	decode_wf_data, .-decode_wf_data
 	.align	2
 	.p2align 3,,7
 	.type	parse_wf_gray16.isra.3, %function
 parse_wf_gray16.isra.3:
-.LFB1568:
+.LFB1569:
 	.loc 1 342 0
 	.cfi_startproc
 .LVL6:
@@ -288,14 +288,14 @@ parse_wf_gray16.isra.3:
 .LBE234:
 .LBE237:
 	.cfi_endproc
-.LFE1568:
+.LFE1569:
 	.size	parse_wf_gray16.isra.3, .-parse_wf_gray16.isra.3
 	.align	2
 	.p2align 3,,7
 	.global	rkf_wf_input
 	.type	rkf_wf_input, %function
 rkf_wf_input:
-.LFB1550:
+.LFB1551:
 	.loc 1 128 0
 	.cfi_startproc
 .LVL33:
@@ -532,14 +532,14 @@ rkf_wf_input:
 	.loc 1 138 0
 	b	.L35
 	.cfi_endproc
-.LFE1550:
+.LFE1551:
 	.size	rkf_wf_input, .-rkf_wf_input
 	.align	2
 	.p2align 3,,7
 	.global	rkf_wf_get_version
 	.type	rkf_wf_get_version, %function
 rkf_wf_get_version:
-.LFB1551:
+.LFB1552:
 	.loc 1 161 0
 	.cfi_startproc
 	.loc 1 162 0
@@ -552,14 +552,14 @@ rkf_wf_get_version:
 	csel	x0, x0, xzr, ne
 	ret
 	.cfi_endproc
-.LFE1551:
+.LFE1552:
 	.size	rkf_wf_get_version, .-rkf_wf_get_version
 	.align	2
 	.p2align 3,,7
 	.global	rkf_wf_get_lut
 	.type	rkf_wf_get_lut, %function
 rkf_wf_get_lut:
-.LFB1564:
+.LFB1565:
 	.loc 1 476 0
 	.cfi_startproc
 .LVL58:
@@ -1388,18 +1388,18 @@ rkf_wf_get_lut:
 	lsl	x0, x0, 2
 	b	.L76
 	.cfi_endproc
-.LFE1564:
+.LFE1565:
 	.size	rkf_wf_get_lut, .-rkf_wf_get_lut
 	.data
 	.align	2
 	.set	.LANCHOR1,. + 0
-	.type	sftemp.16970, %object
-	.size	sftemp.16970, 4
-sftemp.16970:
+	.type	sftemp.16988, %object
+	.size	sftemp.16988, 4
+sftemp.16988:
 	.word	-1
-	.type	stype.16969, %object
-	.size	stype.16969, 4
-stype.16969:
+	.type	stype.16987, %object
+	.size	stype.16987, 4
+stype.16987:
 	.word	12
 	.bss
 	.align	3
@@ -1533,15 +1533,15 @@ crc32_table:
 	.file 100 "./arch/arm64/include/asm/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x7342
+	.4byte	0x7358
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF1532
-	.byte	0x1
-	.4byte	.LASF1533
 	.4byte	.LASF1534
+	.byte	0x1
+	.4byte	.LASF1535
+	.4byte	.LASF1536
 	.8byte	.Ltext0
 	.8byte	.Letext0-.Ltext0
 	.4byte	.Ldebug_line0
@@ -2245,7 +2245,7 @@ crc32_table:
 	.4byte	.LASF99
 	.byte	0x10
 	.byte	0x3e
-	.4byte	0x2c2b
+	.4byte	0x2c41
 	.byte	0x8
 	.byte	0
 	.uleb128 0x15
@@ -2502,7 +2502,7 @@ crc32_table:
 	.byte	0x12
 	.4byte	0xc0
 	.uleb128 0x21
-	.4byte	.LASF994
+	.4byte	.LASF996
 	.byte	0
 	.byte	0x12
 	.2byte	0x1b1
@@ -3043,201 +3043,211 @@ crc32_table:
 	.byte	0x19
 	.byte	0x36
 	.4byte	0x4d4
-	.uleb128 0x27
+	.uleb128 0x11
 	.4byte	.LASF224
 	.byte	0x19
-	.byte	0x38
-	.uleb128 0x27
+	.byte	0x39
+	.4byte	0x4d4
+	.uleb128 0x11
 	.4byte	.LASF225
 	.byte	0x19
-	.byte	0x38
-	.uleb128 0x11
+	.byte	0x39
+	.4byte	0x4d4
+	.uleb128 0x27
 	.4byte	.LASF226
+	.byte	0x19
+	.byte	0x3b
+	.uleb128 0x27
+	.4byte	.LASF227
+	.byte	0x19
+	.byte	0x3b
+	.uleb128 0x11
+	.4byte	.LASF228
 	.byte	0x1a
 	.byte	0x15
 	.4byte	0x4d4
 	.uleb128 0x11
-	.4byte	.LASF227
+	.4byte	.LASF229
 	.byte	0x1a
 	.byte	0x15
 	.4byte	0x4d4
 	.uleb128 0x11
-	.4byte	.LASF228
+	.4byte	.LASF230
 	.byte	0x1a
 	.byte	0x16
 	.4byte	0x4d4
 	.uleb128 0x11
-	.4byte	.LASF229
+	.4byte	.LASF231
 	.byte	0x1a
 	.byte	0x16
 	.4byte	0x4d4
 	.uleb128 0x11
-	.4byte	.LASF230
+	.4byte	.LASF232
 	.byte	0x1a
 	.byte	0x17
 	.4byte	0x4d4
 	.uleb128 0x11
-	.4byte	.LASF231
+	.4byte	.LASF233
 	.byte	0x1a
 	.byte	0x17
 	.4byte	0x4d4
 	.uleb128 0x11
-	.4byte	.LASF232
+	.4byte	.LASF234
 	.byte	0x1a
 	.byte	0x18
 	.4byte	0x4d4
 	.uleb128 0x11
-	.4byte	.LASF233
+	.4byte	.LASF235
 	.byte	0x1a
 	.byte	0x18
 	.4byte	0x4d4
 	.uleb128 0x11
-	.4byte	.LASF234
+	.4byte	.LASF236
 	.byte	0x1a
 	.byte	0x19
 	.4byte	0x4d4
 	.uleb128 0x11
-	.4byte	.LASF235
+	.4byte	.LASF237
 	.byte	0x1a
 	.byte	0x19
 	.4byte	0x4d4
 	.uleb128 0x11
-	.4byte	.LASF236
+	.4byte	.LASF238
 	.byte	0x1a
 	.byte	0x1a
 	.4byte	0x4d4
 	.uleb128 0x11
-	.4byte	.LASF237
+	.4byte	.LASF239
 	.byte	0x1a
 	.byte	0x1a
 	.4byte	0x4d4
 	.uleb128 0x11
-	.4byte	.LASF238
+	.4byte	.LASF240
 	.byte	0x1a
 	.byte	0x1b
 	.4byte	0x4d4
 	.uleb128 0x11
-	.4byte	.LASF239
+	.4byte	.LASF241
 	.byte	0x1a
 	.byte	0x1b
 	.4byte	0x4d4
 	.uleb128 0x11
-	.4byte	.LASF240
+	.4byte	.LASF242
 	.byte	0x1a
 	.byte	0x1c
 	.4byte	0x4d4
 	.uleb128 0x11
-	.4byte	.LASF241
+	.4byte	.LASF243
 	.byte	0x1a
 	.byte	0x1c
 	.4byte	0x4d4
 	.uleb128 0x11
-	.4byte	.LASF242
+	.4byte	.LASF244
 	.byte	0x1a
 	.byte	0x1e
 	.4byte	0x4d4
 	.uleb128 0x11
-	.4byte	.LASF243
+	.4byte	.LASF245
 	.byte	0x1a
 	.byte	0x1e
 	.4byte	0x4d4
 	.uleb128 0x11
-	.4byte	.LASF244
+	.4byte	.LASF246
 	.byte	0x1a
 	.byte	0x1f
 	.4byte	0x4d4
 	.uleb128 0x11
-	.4byte	.LASF245
+	.4byte	.LASF247
 	.byte	0x1a
 	.byte	0x1f
 	.4byte	0x4d4
 	.uleb128 0x5
 	.4byte	0x120
-	.4byte	0xd89
+	.4byte	0xd9f
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x1
 	.byte	0
 	.uleb128 0x11
-	.4byte	.LASF246
+	.4byte	.LASF248
 	.byte	0x1b
 	.byte	0x4a
-	.4byte	0xd79
+	.4byte	0xd8f
 	.uleb128 0x11
-	.4byte	.LASF247
+	.4byte	.LASF249
 	.byte	0x1c
 	.byte	0xb7
 	.4byte	0x12b
 	.uleb128 0x11
-	.4byte	.LASF248
+	.4byte	.LASF250
 	.byte	0x1c
 	.byte	0xbc
 	.4byte	0x136
 	.uleb128 0x11
-	.4byte	.LASF249
+	.4byte	.LASF251
 	.byte	0x1c
 	.byte	0xbf
 	.4byte	0x136
 	.uleb128 0x11
-	.4byte	.LASF250
+	.4byte	.LASF252
 	.byte	0x1d
 	.byte	0x56
 	.4byte	0x282
 	.uleb128 0x25
-	.4byte	.LASF251
+	.4byte	.LASF253
 	.2byte	0x110
 	.byte	0x1d
 	.byte	0x59
-	.4byte	0xe0a
+	.4byte	0xe20
 	.uleb128 0xc
-	.4byte	.LASF252
+	.4byte	.LASF254
 	.byte	0x1d
 	.byte	0x5c
 	.4byte	0xc0
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF253
+	.4byte	.LASF255
 	.byte	0x1d
 	.byte	0x5e
 	.4byte	0xc0
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF254
+	.4byte	.LASF256
 	.byte	0x1d
 	.byte	0x5f
 	.4byte	0xc0
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF255
+	.4byte	.LASF257
 	.byte	0x1d
 	.byte	0x61
-	.4byte	0xe0a
+	.4byte	0xe20
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF256
+	.4byte	.LASF258
 	.byte	0x1d
 	.byte	0x62
-	.4byte	0xe0a
+	.4byte	0xe20
 	.byte	0x90
 	.byte	0
 	.uleb128 0x5
-	.4byte	0xe1a
-	.4byte	0xe1a
+	.4byte	0xe30
+	.4byte	0xe30
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0xf
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe20
+	.4byte	0xe36
 	.uleb128 0x18
-	.4byte	.LASF257
+	.4byte	.LASF259
 	.uleb128 0xd
-	.4byte	.LASF258
+	.4byte	.LASF260
 	.byte	0x68
 	.byte	0x1d
 	.byte	0x66
-	.4byte	0xecb
+	.4byte	0xee1
 	.uleb128 0x10
 	.string	"x19"
 	.byte	0x1d
@@ -3321,103 +3331,103 @@ crc32_table:
 	.2byte	0x220
 	.byte	0x1d
 	.byte	0x7e
-	.4byte	0xef9
+	.4byte	0xf0f
 	.uleb128 0xc
-	.4byte	.LASF259
+	.4byte	.LASF261
 	.byte	0x1d
 	.byte	0x7f
 	.4byte	0x2d
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF260
+	.4byte	.LASF262
 	.byte	0x1d
 	.byte	0x80
 	.4byte	0x2d
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF261
+	.4byte	.LASF263
 	.byte	0x1d
 	.byte	0x81
 	.4byte	0xac8
 	.byte	0x10
 	.byte	0
 	.uleb128 0x25
-	.4byte	.LASF262
+	.4byte	.LASF264
 	.2byte	0x3d0
 	.byte	0x1d
 	.byte	0x76
-	.4byte	0xf79
+	.4byte	0xf8f
 	.uleb128 0xc
-	.4byte	.LASF258
+	.4byte	.LASF260
 	.byte	0x1d
 	.byte	0x77
-	.4byte	0xe25
+	.4byte	0xe3b
 	.byte	0
 	.uleb128 0x10
 	.string	"uw"
 	.byte	0x1d
 	.byte	0x82
-	.4byte	0xecb
+	.4byte	0xee1
 	.byte	0x70
 	.uleb128 0x26
-	.4byte	.LASF263
+	.4byte	.LASF265
 	.byte	0x1d
 	.byte	0x84
 	.4byte	0x6c
 	.2byte	0x290
 	.uleb128 0x26
-	.4byte	.LASF264
+	.4byte	.LASF266
 	.byte	0x1d
 	.byte	0x85
 	.4byte	0x442
 	.2byte	0x298
 	.uleb128 0x26
-	.4byte	.LASF265
+	.4byte	.LASF267
 	.byte	0x1d
 	.byte	0x86
 	.4byte	0x6c
 	.2byte	0x2a0
 	.uleb128 0x26
-	.4byte	.LASF266
+	.4byte	.LASF268
 	.byte	0x1d
 	.byte	0x87
 	.4byte	0x6c
 	.2byte	0x2a4
 	.uleb128 0x26
-	.4byte	.LASF267
+	.4byte	.LASF269
 	.byte	0x1d
 	.byte	0x88
 	.4byte	0x2d
 	.2byte	0x2a8
 	.uleb128 0x26
-	.4byte	.LASF268
+	.4byte	.LASF270
 	.byte	0x1d
 	.byte	0x89
 	.4byte	0x2d
 	.2byte	0x2b0
 	.uleb128 0x26
-	.4byte	.LASF269
+	.4byte	.LASF271
 	.byte	0x1d
 	.byte	0x8a
-	.4byte	0xdc0
+	.4byte	0xdd6
 	.2byte	0x2b8
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF270
+	.4byte	.LASF272
 	.byte	0x1d
 	.2byte	0x111
 	.4byte	0x2d
 	.uleb128 0x11
-	.4byte	.LASF271
+	.4byte	.LASF273
 	.byte	0x1e
 	.byte	0x59
 	.4byte	0xc0
 	.uleb128 0xd
-	.4byte	.LASF272
+	.4byte	.LASF274
 	.byte	0x4
 	.byte	0x1f
 	.byte	0xf
-	.4byte	0xfa9
+	.4byte	0xfbf
 	.uleb128 0xc
 	.4byte	.LASF133
 	.byte	0x1f
@@ -3426,29 +3436,29 @@ crc32_table:
 	.byte	0
 	.byte	0
 	.uleb128 0x11
-	.4byte	.LASF273
+	.4byte	.LASF275
 	.byte	0x20
 	.byte	0xb
 	.4byte	0xc0
 	.uleb128 0x11
-	.4byte	.LASF274
+	.4byte	.LASF276
 	.byte	0x20
 	.byte	0xc
 	.4byte	0xc0
 	.uleb128 0xd
-	.4byte	.LASF275
+	.4byte	.LASF277
 	.byte	0x20
 	.byte	0x21
 	.byte	0x35
-	.4byte	0xffc
+	.4byte	0x1012
 	.uleb128 0xc
-	.4byte	.LASF276
+	.4byte	.LASF278
 	.byte	0x21
 	.byte	0x36
 	.4byte	0x52c
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF277
+	.4byte	.LASF279
 	.byte	0x21
 	.byte	0x37
 	.4byte	0x86f
@@ -3457,41 +3467,41 @@ crc32_table:
 	.string	"osq"
 	.byte	0x21
 	.byte	0x39
-	.4byte	0xf90
+	.4byte	0xfa6
 	.byte	0xc
 	.uleb128 0xc
-	.4byte	.LASF278
+	.4byte	.LASF280
 	.byte	0x21
 	.byte	0x3b
 	.4byte	0x2d8
 	.byte	0x10
 	.byte	0
 	.uleb128 0x29
-	.4byte	.LASF279
+	.4byte	.LASF281
 	.2byte	0xe80
 	.byte	0x22
 	.2byte	0x287
-	.4byte	0x1a5a
+	.4byte	0x1a70
 	.uleb128 0x1c
-	.4byte	.LASF280
+	.4byte	.LASF282
 	.byte	0x22
 	.2byte	0x28d
-	.4byte	0x1c70
+	.4byte	0x1c86
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF281
+	.4byte	.LASF283
 	.byte	0x22
 	.2byte	0x290
 	.4byte	0x163
 	.byte	0x20
 	.uleb128 0x1c
-	.4byte	.LASF282
+	.4byte	.LASF284
 	.byte	0x22
 	.2byte	0x298
 	.4byte	0x442
 	.byte	0x28
 	.uleb128 0x1c
-	.4byte	.LASF283
+	.4byte	.LASF285
 	.byte	0x22
 	.2byte	0x299
 	.4byte	0x2ad
@@ -3503,19 +3513,19 @@ crc32_table:
 	.4byte	0x6c
 	.byte	0x34
 	.uleb128 0x1c
-	.4byte	.LASF284
+	.4byte	.LASF286
 	.byte	0x22
 	.2byte	0x29c
 	.4byte	0x6c
 	.byte	0x38
 	.uleb128 0x1c
-	.4byte	.LASF285
+	.4byte	.LASF287
 	.byte	0x22
 	.2byte	0x29f
-	.4byte	0x2854
+	.4byte	0x286a
 	.byte	0x40
 	.uleb128 0x1c
-	.4byte	.LASF286
+	.4byte	.LASF288
 	.byte	0x22
 	.2byte	0x2a0
 	.4byte	0xc0
@@ -3527,283 +3537,283 @@ crc32_table:
 	.4byte	0x6c
 	.byte	0x4c
 	.uleb128 0x1c
-	.4byte	.LASF287
+	.4byte	.LASF289
 	.byte	0x22
 	.2byte	0x2a5
 	.4byte	0x6c
 	.byte	0x50
 	.uleb128 0x1c
-	.4byte	.LASF288
+	.4byte	.LASF290
 	.byte	0x22
 	.2byte	0x2a6
 	.4byte	0x2d
 	.byte	0x58
 	.uleb128 0x1c
-	.4byte	.LASF289
+	.4byte	.LASF291
 	.byte	0x22
 	.2byte	0x2a7
-	.4byte	0x1a5a
+	.4byte	0x1a70
 	.byte	0x60
 	.uleb128 0x1c
-	.4byte	.LASF290
+	.4byte	.LASF292
 	.byte	0x22
 	.2byte	0x2b0
 	.4byte	0xc0
 	.byte	0x68
 	.uleb128 0x1c
-	.4byte	.LASF291
+	.4byte	.LASF293
 	.byte	0x22
 	.2byte	0x2b1
 	.4byte	0xc0
 	.byte	0x6c
 	.uleb128 0x1c
-	.4byte	.LASF292
+	.4byte	.LASF294
 	.byte	0x22
 	.2byte	0x2b3
 	.4byte	0xc0
 	.byte	0x70
 	.uleb128 0x1c
-	.4byte	.LASF293
+	.4byte	.LASF295
 	.byte	0x22
 	.2byte	0x2b5
 	.4byte	0xc0
 	.byte	0x74
 	.uleb128 0x1c
-	.4byte	.LASF294
+	.4byte	.LASF296
 	.byte	0x22
 	.2byte	0x2b6
 	.4byte	0xc0
 	.byte	0x78
 	.uleb128 0x1c
-	.4byte	.LASF295
+	.4byte	.LASF297
 	.byte	0x22
 	.2byte	0x2b7
 	.4byte	0xc0
 	.byte	0x7c
 	.uleb128 0x1c
-	.4byte	.LASF296
+	.4byte	.LASF298
 	.byte	0x22
 	.2byte	0x2b8
 	.4byte	0x6c
 	.byte	0x80
 	.uleb128 0x1c
-	.4byte	.LASF297
+	.4byte	.LASF299
 	.byte	0x22
 	.2byte	0x2ba
-	.4byte	0x462a
+	.4byte	0x4640
 	.byte	0x88
 	.uleb128 0x23
 	.string	"se"
 	.byte	0x22
 	.2byte	0x2bb
-	.4byte	0x422f
+	.4byte	0x4245
 	.byte	0xc0
 	.uleb128 0x2a
 	.string	"rt"
 	.byte	0x22
 	.2byte	0x2bc
-	.4byte	0x435c
+	.4byte	0x4372
 	.2byte	0x2c0
 	.uleb128 0x2b
-	.4byte	.LASF298
+	.4byte	.LASF300
 	.byte	0x22
 	.2byte	0x2bf
 	.4byte	0x136
 	.2byte	0x310
 	.uleb128 0x2b
-	.4byte	.LASF299
+	.4byte	.LASF301
 	.byte	0x22
 	.2byte	0x2c0
 	.4byte	0xc0
 	.2byte	0x318
 	.uleb128 0x2b
-	.4byte	.LASF300
+	.4byte	.LASF302
 	.byte	0x22
 	.2byte	0x2c1
 	.4byte	0x136
 	.2byte	0x320
 	.uleb128 0x2b
-	.4byte	.LASF301
+	.4byte	.LASF303
 	.byte	0x22
 	.2byte	0x2c2
 	.4byte	0x136
 	.2byte	0x328
 	.uleb128 0x2b
-	.4byte	.LASF302
+	.4byte	.LASF304
 	.byte	0x22
 	.2byte	0x2c5
-	.4byte	0x4635
+	.4byte	0x464b
 	.2byte	0x330
 	.uleb128 0x2a
 	.string	"dl"
 	.byte	0x22
 	.2byte	0x2c7
-	.4byte	0x43ff
+	.4byte	0x4415
 	.2byte	0x338
 	.uleb128 0x2b
-	.4byte	.LASF303
+	.4byte	.LASF305
 	.byte	0x22
 	.2byte	0x2d9
 	.4byte	0x6c
 	.2byte	0x420
 	.uleb128 0x2b
-	.4byte	.LASF304
+	.4byte	.LASF306
 	.byte	0x22
 	.2byte	0x2da
 	.4byte	0xc0
 	.2byte	0x424
 	.uleb128 0x2b
-	.4byte	.LASF305
+	.4byte	.LASF307
 	.byte	0x22
 	.2byte	0x2db
-	.4byte	0x1ccb
+	.4byte	0x1ce1
 	.2byte	0x428
 	.uleb128 0x2b
-	.4byte	.LASF306
+	.4byte	.LASF308
 	.byte	0x22
 	.2byte	0x2dc
-	.4byte	0x1ccb
+	.4byte	0x1ce1
 	.2byte	0x430
 	.uleb128 0x2b
-	.4byte	.LASF307
+	.4byte	.LASF309
 	.byte	0x22
 	.2byte	0x2df
 	.4byte	0xc0
 	.2byte	0x438
 	.uleb128 0x2b
-	.4byte	.LASF308
+	.4byte	.LASF310
 	.byte	0x22
 	.2byte	0x2e0
-	.4byte	0x452a
+	.4byte	0x4540
 	.2byte	0x43c
 	.uleb128 0x2b
-	.4byte	.LASF309
+	.4byte	.LASF311
 	.byte	0x22
 	.2byte	0x2e1
 	.4byte	0x2d8
 	.2byte	0x440
 	.uleb128 0x2b
-	.4byte	.LASF310
+	.4byte	.LASF312
 	.byte	0x22
 	.2byte	0x2e2
-	.4byte	0x4640
+	.4byte	0x4656
 	.2byte	0x450
 	.uleb128 0x2b
-	.4byte	.LASF311
+	.4byte	.LASF313
 	.byte	0x22
 	.2byte	0x2e6
 	.4byte	0x2d
 	.2byte	0x458
 	.uleb128 0x2b
-	.4byte	.LASF312
+	.4byte	.LASF314
 	.byte	0x22
 	.2byte	0x2e7
 	.4byte	0x100
 	.2byte	0x460
 	.uleb128 0x2b
-	.4byte	.LASF313
+	.4byte	.LASF315
 	.byte	0x22
 	.2byte	0x2e8
 	.4byte	0x100
 	.2byte	0x461
 	.uleb128 0x2b
-	.4byte	.LASF314
+	.4byte	.LASF316
 	.byte	0x22
 	.2byte	0x2e9
 	.4byte	0xc0
 	.2byte	0x464
 	.uleb128 0x2b
-	.4byte	.LASF315
+	.4byte	.LASF317
 	.byte	0x22
 	.2byte	0x2ea
 	.4byte	0x2d8
 	.2byte	0x468
 	.uleb128 0x2b
-	.4byte	.LASF316
+	.4byte	.LASF318
 	.byte	0x22
 	.2byte	0x2ed
-	.4byte	0x3fad
+	.4byte	0x3fc3
 	.2byte	0x478
 	.uleb128 0x2b
-	.4byte	.LASF317
+	.4byte	.LASF319
 	.byte	0x22
 	.2byte	0x2ef
 	.4byte	0x2d8
 	.2byte	0x498
 	.uleb128 0x2b
-	.4byte	.LASF318
+	.4byte	.LASF320
 	.byte	0x22
 	.2byte	0x2f1
-	.4byte	0x376b
+	.4byte	0x3781
 	.2byte	0x4a8
 	.uleb128 0x2b
-	.4byte	.LASF319
+	.4byte	.LASF321
 	.byte	0x22
 	.2byte	0x2f2
-	.4byte	0x2e9e
+	.4byte	0x2eb4
 	.2byte	0x4d0
 	.uleb128 0x2a
 	.string	"mm"
 	.byte	0x22
 	.2byte	0x2f5
-	.4byte	0x464b
+	.4byte	0x4661
 	.2byte	0x4e8
 	.uleb128 0x2b
-	.4byte	.LASF320
+	.4byte	.LASF322
 	.byte	0x22
 	.2byte	0x2f6
-	.4byte	0x464b
+	.4byte	0x4661
 	.2byte	0x4f0
 	.uleb128 0x2b
-	.4byte	.LASF321
+	.4byte	.LASF323
 	.byte	0x22
 	.2byte	0x2f9
-	.4byte	0x3d88
+	.4byte	0x3d9e
 	.2byte	0x4f8
 	.uleb128 0x2b
-	.4byte	.LASF322
+	.4byte	.LASF324
 	.byte	0x22
 	.2byte	0x2fc
-	.4byte	0x3dee
+	.4byte	0x3e04
 	.2byte	0x520
 	.uleb128 0x2b
-	.4byte	.LASF323
+	.4byte	.LASF325
 	.byte	0x22
 	.2byte	0x2fe
 	.4byte	0xc0
 	.2byte	0x538
 	.uleb128 0x2b
-	.4byte	.LASF324
+	.4byte	.LASF326
 	.byte	0x22
 	.2byte	0x2ff
 	.4byte	0xc0
 	.2byte	0x53c
 	.uleb128 0x2b
-	.4byte	.LASF325
+	.4byte	.LASF327
 	.byte	0x22
 	.2byte	0x300
 	.4byte	0xc0
 	.2byte	0x540
 	.uleb128 0x2b
-	.4byte	.LASF326
+	.4byte	.LASF328
 	.byte	0x22
 	.2byte	0x302
 	.4byte	0xc0
 	.2byte	0x544
 	.uleb128 0x2b
-	.4byte	.LASF327
+	.4byte	.LASF329
 	.byte	0x22
 	.2byte	0x304
 	.4byte	0x2d
 	.2byte	0x548
 	.uleb128 0x2b
-	.4byte	.LASF328
+	.4byte	.LASF330
 	.byte	0x22
 	.2byte	0x307
 	.4byte	0x6c
 	.2byte	0x550
 	.uleb128 0x2c
-	.4byte	.LASF329
+	.4byte	.LASF331
 	.byte	0x22
 	.2byte	0x30a
 	.4byte	0x6c
@@ -3812,7 +3822,7 @@ crc32_table:
 	.byte	0x1f
 	.2byte	0x554
 	.uleb128 0x2c
-	.4byte	.LASF330
+	.4byte	.LASF332
 	.byte	0x22
 	.2byte	0x30b
 	.4byte	0x6c
@@ -3821,7 +3831,7 @@ crc32_table:
 	.byte	0x1e
 	.2byte	0x554
 	.uleb128 0x2c
-	.4byte	.LASF331
+	.4byte	.LASF333
 	.byte	0x22
 	.2byte	0x30c
 	.4byte	0x6c
@@ -3830,7 +3840,7 @@ crc32_table:
 	.byte	0x1d
 	.2byte	0x554
 	.uleb128 0x2c
-	.4byte	.LASF332
+	.4byte	.LASF334
 	.byte	0x22
 	.2byte	0x30d
 	.4byte	0x6c
@@ -3839,7 +3849,7 @@ crc32_table:
 	.byte	0x1c
 	.2byte	0x554
 	.uleb128 0x2c
-	.4byte	.LASF333
+	.4byte	.LASF335
 	.byte	0x22
 	.2byte	0x30f
 	.4byte	0x6c
@@ -3848,7 +3858,7 @@ crc32_table:
 	.byte	0x1b
 	.2byte	0x554
 	.uleb128 0x2c
-	.4byte	.LASF334
+	.4byte	.LASF336
 	.byte	0x22
 	.2byte	0x318
 	.4byte	0x6c
@@ -3857,7 +3867,7 @@ crc32_table:
 	.byte	0x1f
 	.2byte	0x558
 	.uleb128 0x2c
-	.4byte	.LASF335
+	.4byte	.LASF337
 	.byte	0x22
 	.2byte	0x319
 	.4byte	0x6c
@@ -3866,7 +3876,7 @@ crc32_table:
 	.byte	0x1e
 	.2byte	0x558
 	.uleb128 0x2c
-	.4byte	.LASF336
+	.4byte	.LASF338
 	.byte	0x22
 	.2byte	0x31e
 	.4byte	0x6c
@@ -3875,7 +3885,7 @@ crc32_table:
 	.byte	0x1d
 	.2byte	0x558
 	.uleb128 0x2c
-	.4byte	.LASF337
+	.4byte	.LASF339
 	.byte	0x22
 	.2byte	0x320
 	.4byte	0x6c
@@ -3884,7 +3894,7 @@ crc32_table:
 	.byte	0x1c
 	.2byte	0x558
 	.uleb128 0x2c
-	.4byte	.LASF338
+	.4byte	.LASF340
 	.byte	0x22
 	.2byte	0x328
 	.4byte	0x6c
@@ -3893,7 +3903,7 @@ crc32_table:
 	.byte	0x1b
 	.2byte	0x558
 	.uleb128 0x2c
-	.4byte	.LASF339
+	.4byte	.LASF341
 	.byte	0x22
 	.2byte	0x32c
 	.4byte	0x6c
@@ -3902,16 +3912,16 @@ crc32_table:
 	.byte	0x1a
 	.2byte	0x558
 	.uleb128 0x2b
-	.4byte	.LASF340
+	.4byte	.LASF342
 	.byte	0x22
 	.2byte	0x32f
 	.4byte	0x2d
 	.2byte	0x560
 	.uleb128 0x2b
-	.4byte	.LASF341
+	.4byte	.LASF343
 	.byte	0x22
 	.2byte	0x331
-	.4byte	0x1c21
+	.4byte	0x1c37
 	.2byte	0x568
 	.uleb128 0x2a
 	.string	"pid"
@@ -3920,31 +3930,31 @@ crc32_table:
 	.4byte	0x218
 	.2byte	0x598
 	.uleb128 0x2b
-	.4byte	.LASF342
+	.4byte	.LASF344
 	.byte	0x22
 	.2byte	0x334
 	.4byte	0x218
 	.2byte	0x59c
 	.uleb128 0x2b
-	.4byte	.LASF343
+	.4byte	.LASF345
 	.byte	0x22
 	.2byte	0x338
 	.4byte	0x2d
 	.2byte	0x5a0
 	.uleb128 0x2b
-	.4byte	.LASF344
+	.4byte	.LASF346
 	.byte	0x22
 	.2byte	0x341
-	.4byte	0x1a5a
+	.4byte	0x1a70
 	.2byte	0x5a8
 	.uleb128 0x2b
 	.4byte	.LASF63
 	.byte	0x22
 	.2byte	0x344
-	.4byte	0x1a5a
+	.4byte	0x1a70
 	.2byte	0x5b0
 	.uleb128 0x2b
-	.4byte	.LASF345
+	.4byte	.LASF347
 	.byte	0x22
 	.2byte	0x349
 	.4byte	0x2d8
@@ -3956,187 +3966,187 @@ crc32_table:
 	.4byte	0x2d8
 	.2byte	0x5c8
 	.uleb128 0x2b
-	.4byte	.LASF346
+	.4byte	.LASF348
 	.byte	0x22
 	.2byte	0x34b
-	.4byte	0x1a5a
+	.4byte	0x1a70
 	.2byte	0x5d8
 	.uleb128 0x2b
-	.4byte	.LASF347
+	.4byte	.LASF349
 	.byte	0x22
 	.2byte	0x353
 	.4byte	0x2d8
 	.2byte	0x5e0
 	.uleb128 0x2b
-	.4byte	.LASF348
+	.4byte	.LASF350
 	.byte	0x22
 	.2byte	0x354
 	.4byte	0x2d8
 	.2byte	0x5f0
 	.uleb128 0x2b
-	.4byte	.LASF349
+	.4byte	.LASF351
 	.byte	0x22
 	.2byte	0x357
-	.4byte	0x4651
+	.4byte	0x4667
 	.2byte	0x600
 	.uleb128 0x2b
-	.4byte	.LASF350
+	.4byte	.LASF352
 	.byte	0x22
 	.2byte	0x358
-	.4byte	0x4657
+	.4byte	0x466d
 	.2byte	0x608
 	.uleb128 0x2b
-	.4byte	.LASF351
+	.4byte	.LASF353
 	.byte	0x22
 	.2byte	0x359
 	.4byte	0x2d8
 	.2byte	0x648
 	.uleb128 0x2b
-	.4byte	.LASF352
+	.4byte	.LASF354
 	.byte	0x22
 	.2byte	0x35a
 	.4byte	0x2d8
 	.2byte	0x658
 	.uleb128 0x2b
-	.4byte	.LASF353
+	.4byte	.LASF355
 	.byte	0x22
 	.2byte	0x35c
-	.4byte	0x4667
+	.4byte	0x467d
 	.2byte	0x668
 	.uleb128 0x2b
-	.4byte	.LASF354
+	.4byte	.LASF356
 	.byte	0x22
 	.2byte	0x35f
-	.4byte	0x3310
+	.4byte	0x3326
 	.2byte	0x670
 	.uleb128 0x2b
-	.4byte	.LASF355
+	.4byte	.LASF357
 	.byte	0x22
 	.2byte	0x362
-	.4byte	0x3310
+	.4byte	0x3326
 	.2byte	0x678
 	.uleb128 0x2b
-	.4byte	.LASF356
+	.4byte	.LASF358
 	.byte	0x22
 	.2byte	0x364
 	.4byte	0x136
 	.2byte	0x680
 	.uleb128 0x2b
-	.4byte	.LASF357
+	.4byte	.LASF359
 	.byte	0x22
 	.2byte	0x365
 	.4byte	0x136
 	.2byte	0x688
 	.uleb128 0x2b
-	.4byte	.LASF358
+	.4byte	.LASF360
 	.byte	0x22
 	.2byte	0x36a
 	.4byte	0x136
 	.2byte	0x690
 	.uleb128 0x2b
-	.4byte	.LASF359
+	.4byte	.LASF361
 	.byte	0x22
 	.2byte	0x36c
-	.4byte	0x466d
+	.4byte	0x4683
 	.2byte	0x698
 	.uleb128 0x2b
-	.4byte	.LASF360
+	.4byte	.LASF362
 	.byte	0x22
 	.2byte	0x36d
 	.4byte	0x6c
 	.2byte	0x6a0
 	.uleb128 0x2b
-	.4byte	.LASF361
+	.4byte	.LASF363
 	.byte	0x22
 	.2byte	0x36f
-	.4byte	0x3f48
+	.4byte	0x3f5e
 	.2byte	0x6a8
 	.uleb128 0x2b
-	.4byte	.LASF362
+	.4byte	.LASF364
 	.byte	0x22
 	.2byte	0x378
 	.4byte	0x2d
 	.2byte	0x6c0
 	.uleb128 0x2b
-	.4byte	.LASF363
+	.4byte	.LASF365
 	.byte	0x22
 	.2byte	0x379
 	.4byte	0x2d
 	.2byte	0x6c8
 	.uleb128 0x2b
-	.4byte	.LASF364
+	.4byte	.LASF366
 	.byte	0x22
 	.2byte	0x37c
 	.4byte	0x136
 	.2byte	0x6d0
 	.uleb128 0x2b
-	.4byte	.LASF365
+	.4byte	.LASF367
 	.byte	0x22
 	.2byte	0x37f
 	.4byte	0x136
 	.2byte	0x6d8
 	.uleb128 0x2b
-	.4byte	.LASF366
+	.4byte	.LASF368
 	.byte	0x22
 	.2byte	0x382
 	.4byte	0x2d
 	.2byte	0x6e0
 	.uleb128 0x2b
-	.4byte	.LASF367
+	.4byte	.LASF369
 	.byte	0x22
 	.2byte	0x383
 	.4byte	0x2d
 	.2byte	0x6e8
 	.uleb128 0x2b
-	.4byte	.LASF368
+	.4byte	.LASF370
 	.byte	0x22
 	.2byte	0x386
-	.4byte	0x3f79
+	.4byte	0x3f8f
 	.2byte	0x6f0
 	.uleb128 0x2b
-	.4byte	.LASF369
+	.4byte	.LASF371
 	.byte	0x22
 	.2byte	0x387
-	.4byte	0x4673
+	.4byte	0x4689
 	.2byte	0x708
 	.uleb128 0x2b
-	.4byte	.LASF370
+	.4byte	.LASF372
 	.byte	0x22
 	.2byte	0x38d
-	.4byte	0x468d
+	.4byte	0x46a3
 	.2byte	0x738
 	.uleb128 0x2b
-	.4byte	.LASF371
+	.4byte	.LASF373
 	.byte	0x22
 	.2byte	0x390
-	.4byte	0x468d
+	.4byte	0x46a3
 	.2byte	0x740
 	.uleb128 0x2b
-	.4byte	.LASF372
+	.4byte	.LASF374
 	.byte	0x22
 	.2byte	0x393
-	.4byte	0x468d
+	.4byte	0x46a3
 	.2byte	0x748
 	.uleb128 0x2b
-	.4byte	.LASF373
+	.4byte	.LASF375
 	.byte	0x22
 	.2byte	0x39c
-	.4byte	0x4693
+	.4byte	0x46a9
 	.2byte	0x750
 	.uleb128 0x2b
-	.4byte	.LASF374
+	.4byte	.LASF376
 	.byte	0x22
 	.2byte	0x39e
-	.4byte	0x46a8
+	.4byte	0x46be
 	.2byte	0x760
 	.uleb128 0x2b
-	.4byte	.LASF375
+	.4byte	.LASF377
 	.byte	0x22
 	.2byte	0x3a5
 	.4byte	0x2d
 	.2byte	0x768
 	.uleb128 0x2b
-	.4byte	.LASF376
+	.4byte	.LASF378
 	.byte	0x22
 	.2byte	0x3a6
 	.4byte	0x2d
@@ -4145,325 +4155,325 @@ crc32_table:
 	.string	"fs"
 	.byte	0x22
 	.2byte	0x3a9
-	.4byte	0x46b3
+	.4byte	0x46c9
 	.2byte	0x778
 	.uleb128 0x2b
-	.4byte	.LASF377
+	.4byte	.LASF379
 	.byte	0x22
 	.2byte	0x3ac
-	.4byte	0x46be
+	.4byte	0x46d4
 	.2byte	0x780
 	.uleb128 0x2b
-	.4byte	.LASF378
+	.4byte	.LASF380
 	.byte	0x22
 	.2byte	0x3af
-	.4byte	0x46c9
+	.4byte	0x46df
 	.2byte	0x788
 	.uleb128 0x2b
-	.4byte	.LASF379
+	.4byte	.LASF381
 	.byte	0x22
 	.2byte	0x3b2
-	.4byte	0x46d4
+	.4byte	0x46ea
 	.2byte	0x790
 	.uleb128 0x2b
-	.4byte	.LASF380
+	.4byte	.LASF382
 	.byte	0x22
 	.2byte	0x3b3
-	.4byte	0x46df
+	.4byte	0x46f5
 	.2byte	0x798
 	.uleb128 0x2b
-	.4byte	.LASF381
+	.4byte	.LASF383
 	.byte	0x22
 	.2byte	0x3b4
-	.4byte	0x3ab4
+	.4byte	0x3aca
 	.2byte	0x7a0
 	.uleb128 0x2b
-	.4byte	.LASF382
+	.4byte	.LASF384
 	.byte	0x22
 	.2byte	0x3b5
-	.4byte	0x3ab4
+	.4byte	0x3aca
 	.2byte	0x7a8
 	.uleb128 0x2b
-	.4byte	.LASF383
+	.4byte	.LASF385
 	.byte	0x22
 	.2byte	0x3b7
-	.4byte	0x3ab4
+	.4byte	0x3aca
 	.2byte	0x7b0
 	.uleb128 0x2b
 	.4byte	.LASF131
 	.byte	0x22
 	.2byte	0x3b8
-	.4byte	0x3d63
+	.4byte	0x3d79
 	.2byte	0x7b8
 	.uleb128 0x2b
-	.4byte	.LASF384
+	.4byte	.LASF386
 	.byte	0x22
 	.2byte	0x3b9
 	.4byte	0x2d
 	.2byte	0x7d0
 	.uleb128 0x2b
-	.4byte	.LASF385
+	.4byte	.LASF387
 	.byte	0x22
 	.2byte	0x3ba
 	.4byte	0x261
 	.2byte	0x7d8
 	.uleb128 0x2b
-	.4byte	.LASF386
+	.4byte	.LASF388
 	.byte	0x22
 	.2byte	0x3bb
 	.4byte	0x6c
 	.2byte	0x7e0
 	.uleb128 0x2b
-	.4byte	.LASF387
+	.4byte	.LASF389
 	.byte	0x22
 	.2byte	0x3bd
 	.4byte	0x372
 	.2byte	0x7e8
 	.uleb128 0x2b
-	.4byte	.LASF388
+	.4byte	.LASF390
 	.byte	0x22
 	.2byte	0x3bf
-	.4byte	0x46ea
+	.4byte	0x4700
 	.2byte	0x7f0
 	.uleb128 0x2b
-	.4byte	.LASF389
+	.4byte	.LASF391
 	.byte	0x22
 	.2byte	0x3c4
-	.4byte	0x3a6f
+	.4byte	0x3a85
 	.2byte	0x7f8
 	.uleb128 0x2b
-	.4byte	.LASF390
+	.4byte	.LASF392
 	.byte	0x22
 	.2byte	0x3c7
 	.4byte	0x136
 	.2byte	0x808
 	.uleb128 0x2b
-	.4byte	.LASF391
+	.4byte	.LASF393
 	.byte	0x22
 	.2byte	0x3c8
 	.4byte	0x136
 	.2byte	0x810
 	.uleb128 0x2b
-	.4byte	.LASF392
+	.4byte	.LASF394
 	.byte	0x22
 	.2byte	0x3cb
 	.4byte	0x86f
 	.2byte	0x818
 	.uleb128 0x2b
-	.4byte	.LASF393
+	.4byte	.LASF395
 	.byte	0x22
 	.2byte	0x3ce
 	.4byte	0x83d
 	.2byte	0x81c
 	.uleb128 0x2b
-	.4byte	.LASF394
+	.4byte	.LASF396
 	.byte	0x22
 	.2byte	0x3d0
-	.4byte	0x4576
+	.4byte	0x458c
 	.2byte	0x820
 	.uleb128 0x2b
-	.4byte	.LASF395
+	.4byte	.LASF397
 	.byte	0x22
 	.2byte	0x3d4
-	.4byte	0x2eee
+	.4byte	0x2f04
 	.2byte	0x828
 	.uleb128 0x2b
-	.4byte	.LASF396
+	.4byte	.LASF398
 	.byte	0x22
 	.2byte	0x3d6
-	.4byte	0x1a5a
+	.4byte	0x1a70
 	.2byte	0x838
 	.uleb128 0x2b
-	.4byte	.LASF397
+	.4byte	.LASF399
 	.byte	0x22
 	.2byte	0x3d8
-	.4byte	0x46f5
+	.4byte	0x470b
 	.2byte	0x840
 	.uleb128 0x2b
-	.4byte	.LASF398
+	.4byte	.LASF400
 	.byte	0x22
 	.2byte	0x400
 	.4byte	0x442
 	.2byte	0x848
 	.uleb128 0x2b
-	.4byte	.LASF399
+	.4byte	.LASF401
 	.byte	0x22
 	.2byte	0x403
-	.4byte	0x4700
+	.4byte	0x4716
 	.2byte	0x850
 	.uleb128 0x2b
-	.4byte	.LASF400
+	.4byte	.LASF402
 	.byte	0x22
 	.2byte	0x407
-	.4byte	0x470b
+	.4byte	0x4721
 	.2byte	0x858
 	.uleb128 0x2b
-	.4byte	.LASF401
+	.4byte	.LASF403
 	.byte	0x22
 	.2byte	0x40b
-	.4byte	0x4716
+	.4byte	0x472c
 	.2byte	0x860
 	.uleb128 0x2b
-	.4byte	.LASF402
+	.4byte	.LASF404
 	.byte	0x22
 	.2byte	0x40d
-	.4byte	0x4721
+	.4byte	0x4737
 	.2byte	0x868
 	.uleb128 0x2b
-	.4byte	.LASF403
+	.4byte	.LASF405
 	.byte	0x22
 	.2byte	0x40f
-	.4byte	0x472c
+	.4byte	0x4742
 	.2byte	0x870
 	.uleb128 0x2b
-	.4byte	.LASF404
+	.4byte	.LASF406
 	.byte	0x22
 	.2byte	0x412
 	.4byte	0x2d
 	.2byte	0x878
 	.uleb128 0x2b
-	.4byte	.LASF405
+	.4byte	.LASF407
 	.byte	0x22
 	.2byte	0x413
-	.4byte	0x4732
+	.4byte	0x4748
 	.2byte	0x880
 	.uleb128 0x2b
-	.4byte	.LASF406
+	.4byte	.LASF408
 	.byte	0x22
 	.2byte	0x415
-	.4byte	0x3e5c
+	.4byte	0x3e72
 	.2byte	0x888
 	.uleb128 0x2b
-	.4byte	.LASF407
+	.4byte	.LASF409
 	.byte	0x22
 	.2byte	0x418
 	.4byte	0x6c
 	.2byte	0x8c8
 	.uleb128 0x2b
-	.4byte	.LASF408
+	.4byte	.LASF410
 	.byte	0x22
 	.2byte	0x41c
 	.4byte	0x136
 	.2byte	0x8d0
 	.uleb128 0x2b
-	.4byte	.LASF409
+	.4byte	.LASF411
 	.byte	0x22
 	.2byte	0x41e
 	.4byte	0x136
 	.2byte	0x8d8
 	.uleb128 0x2b
-	.4byte	.LASF410
+	.4byte	.LASF412
 	.byte	0x22
 	.2byte	0x420
 	.4byte	0x136
 	.2byte	0x8e0
 	.uleb128 0x2b
-	.4byte	.LASF411
+	.4byte	.LASF413
 	.byte	0x22
 	.2byte	0x424
-	.4byte	0x1ed6
+	.4byte	0x1eec
 	.2byte	0x8e8
 	.uleb128 0x2b
-	.4byte	.LASF412
+	.4byte	.LASF414
 	.byte	0x22
 	.2byte	0x426
-	.4byte	0x1eb6
+	.4byte	0x1ecc
 	.2byte	0x8f0
 	.uleb128 0x2b
-	.4byte	.LASF413
+	.4byte	.LASF415
 	.byte	0x22
 	.2byte	0x427
 	.4byte	0xc0
 	.2byte	0x8f4
 	.uleb128 0x2b
-	.4byte	.LASF414
+	.4byte	.LASF416
 	.byte	0x22
 	.2byte	0x428
 	.4byte	0xc0
 	.2byte	0x8f8
 	.uleb128 0x2b
-	.4byte	.LASF415
+	.4byte	.LASF417
 	.byte	0x22
 	.2byte	0x42c
-	.4byte	0x473d
+	.4byte	0x4753
 	.2byte	0x900
 	.uleb128 0x2b
-	.4byte	.LASF416
+	.4byte	.LASF418
 	.byte	0x22
 	.2byte	0x42e
 	.4byte	0x2d8
 	.2byte	0x908
 	.uleb128 0x2b
-	.4byte	.LASF417
+	.4byte	.LASF419
 	.byte	0x22
 	.2byte	0x435
-	.4byte	0x4748
+	.4byte	0x475e
 	.2byte	0x918
 	.uleb128 0x2b
-	.4byte	.LASF418
+	.4byte	.LASF420
 	.byte	0x22
 	.2byte	0x437
-	.4byte	0x4753
+	.4byte	0x4769
 	.2byte	0x920
 	.uleb128 0x2b
-	.4byte	.LASF419
+	.4byte	.LASF421
 	.byte	0x22
 	.2byte	0x439
 	.4byte	0x2d8
 	.2byte	0x928
 	.uleb128 0x2b
-	.4byte	.LASF420
+	.4byte	.LASF422
 	.byte	0x22
 	.2byte	0x43a
-	.4byte	0x475e
+	.4byte	0x4774
 	.2byte	0x938
 	.uleb128 0x2b
-	.4byte	.LASF421
+	.4byte	.LASF423
 	.byte	0x22
 	.2byte	0x43d
-	.4byte	0x4764
+	.4byte	0x477a
 	.2byte	0x940
 	.uleb128 0x2b
-	.4byte	.LASF422
+	.4byte	.LASF424
 	.byte	0x22
 	.2byte	0x43e
-	.4byte	0xfbf
+	.4byte	0xfd5
 	.2byte	0x950
 	.uleb128 0x2b
-	.4byte	.LASF423
+	.4byte	.LASF425
 	.byte	0x22
 	.2byte	0x43f
 	.4byte	0x2d8
 	.2byte	0x970
 	.uleb128 0x2b
-	.4byte	.LASF424
+	.4byte	.LASF426
 	.byte	0x22
 	.2byte	0x47d
-	.4byte	0x477f
+	.4byte	0x4795
 	.2byte	0x980
 	.uleb128 0x2b
-	.4byte	.LASF425
+	.4byte	.LASF427
 	.byte	0x22
 	.2byte	0x47e
 	.4byte	0x120
 	.2byte	0x988
 	.uleb128 0x2b
-	.4byte	.LASF426
+	.4byte	.LASF428
 	.byte	0x22
 	.2byte	0x47f
 	.4byte	0x120
 	.2byte	0x98c
 	.uleb128 0x2b
-	.4byte	.LASF427
+	.4byte	.LASF429
 	.byte	0x22
 	.2byte	0x484
 	.4byte	0x2d
 	.2byte	0x990
 	.uleb128 0x2b
-	.4byte	.LASF428
+	.4byte	.LASF430
 	.byte	0x22
 	.2byte	0x487
-	.4byte	0x3e54
+	.4byte	0x3e6a
 	.2byte	0x998
 	.uleb128 0x2a
 	.string	"rcu"
@@ -4472,236 +4482,236 @@ crc32_table:
 	.4byte	0x34d
 	.2byte	0x998
 	.uleb128 0x2b
-	.4byte	.LASF429
+	.4byte	.LASF431
 	.byte	0x22
 	.2byte	0x48c
-	.4byte	0x478a
+	.4byte	0x47a0
 	.2byte	0x9a8
 	.uleb128 0x2b
-	.4byte	.LASF430
+	.4byte	.LASF432
 	.byte	0x22
 	.2byte	0x48e
-	.4byte	0x3e23
+	.4byte	0x3e39
 	.2byte	0x9b0
 	.uleb128 0x2b
-	.4byte	.LASF431
+	.4byte	.LASF433
 	.byte	0x22
 	.2byte	0x491
-	.4byte	0x4795
+	.4byte	0x47ab
 	.2byte	0x9c0
 	.uleb128 0x2b
-	.4byte	.LASF432
+	.4byte	.LASF434
 	.byte	0x22
 	.2byte	0x49c
 	.4byte	0xc0
 	.2byte	0x9c8
 	.uleb128 0x2b
-	.4byte	.LASF433
+	.4byte	.LASF435
 	.byte	0x22
 	.2byte	0x49d
 	.4byte	0xc0
 	.2byte	0x9cc
 	.uleb128 0x2b
-	.4byte	.LASF434
+	.4byte	.LASF436
 	.byte	0x22
 	.2byte	0x49f
 	.4byte	0x2d
 	.2byte	0x9d0
 	.uleb128 0x2b
-	.4byte	.LASF435
+	.4byte	.LASF437
 	.byte	0x22
 	.2byte	0x4a9
 	.4byte	0x136
 	.2byte	0x9d8
 	.uleb128 0x2b
-	.4byte	.LASF436
+	.4byte	.LASF438
 	.byte	0x22
 	.2byte	0x4aa
 	.4byte	0x136
 	.2byte	0x9e0
 	.uleb128 0x2b
-	.4byte	.LASF437
+	.4byte	.LASF439
 	.byte	0x22
 	.2byte	0x4c7
 	.4byte	0x2d
 	.2byte	0x9e8
 	.uleb128 0x2b
-	.4byte	.LASF438
+	.4byte	.LASF440
 	.byte	0x22
 	.2byte	0x4ca
 	.4byte	0x2d
 	.2byte	0x9f0
 	.uleb128 0x2b
-	.4byte	.LASF439
+	.4byte	.LASF441
 	.byte	0x22
 	.2byte	0x4e4
-	.4byte	0x47a0
+	.4byte	0x47b6
 	.2byte	0x9f8
 	.uleb128 0x2b
-	.4byte	.LASF440
+	.4byte	.LASF442
 	.byte	0x22
 	.2byte	0x4e5
 	.4byte	0x277
 	.2byte	0xa00
 	.uleb128 0x2b
-	.4byte	.LASF441
+	.4byte	.LASF443
 	.byte	0x22
 	.2byte	0x4e6
 	.4byte	0xc0
 	.2byte	0xa04
 	.uleb128 0x2b
-	.4byte	.LASF442
+	.4byte	.LASF444
 	.byte	0x22
 	.2byte	0x4e9
 	.4byte	0x6c
 	.2byte	0xa08
 	.uleb128 0x2b
-	.4byte	.LASF443
+	.4byte	.LASF445
 	.byte	0x22
 	.2byte	0x4ec
-	.4byte	0x47a0
+	.4byte	0x47b6
 	.2byte	0xa10
 	.uleb128 0x2b
-	.4byte	.LASF444
+	.4byte	.LASF446
 	.byte	0x22
 	.2byte	0x4f0
-	.4byte	0x47ab
+	.4byte	0x47c1
 	.2byte	0xa18
 	.uleb128 0x2b
-	.4byte	.LASF445
+	.4byte	.LASF447
 	.byte	0x22
 	.2byte	0x4f4
-	.4byte	0x47b6
+	.4byte	0x47cc
 	.2byte	0xa20
 	.uleb128 0x2b
-	.4byte	.LASF446
+	.4byte	.LASF448
 	.byte	0x22
 	.2byte	0x4fd
 	.4byte	0xc0
 	.2byte	0xa28
 	.uleb128 0x2b
-	.4byte	.LASF447
+	.4byte	.LASF449
 	.byte	0x22
 	.2byte	0x4ff
-	.4byte	0x1a5a
+	.4byte	0x1a70
 	.2byte	0xa30
 	.uleb128 0x2b
-	.4byte	.LASF448
+	.4byte	.LASF450
 	.byte	0x22
 	.2byte	0x502
-	.4byte	0x47c1
+	.4byte	0x47d7
 	.2byte	0xa38
 	.uleb128 0x2b
-	.4byte	.LASF449
+	.4byte	.LASF451
 	.byte	0x22
 	.2byte	0x506
 	.4byte	0x2ad
 	.2byte	0xa40
 	.uleb128 0x2b
-	.4byte	.LASF450
+	.4byte	.LASF452
 	.byte	0x22
 	.2byte	0x50d
 	.4byte	0x442
 	.2byte	0xa48
 	.uleb128 0x2d
-	.4byte	0x45b3
+	.4byte	0x45c9
 	.2byte	0xa50
 	.uleb128 0x2d
-	.4byte	0x45f9
+	.4byte	0x460f
 	.2byte	0xa58
 	.uleb128 0x2b
-	.4byte	.LASF451
+	.4byte	.LASF453
 	.byte	0x22
 	.2byte	0x521
-	.4byte	0xfbf
+	.4byte	0xfd5
 	.2byte	0xa60
 	.uleb128 0x2b
-	.4byte	.LASF452
+	.4byte	.LASF454
 	.byte	0x22
 	.2byte	0x524
 	.4byte	0x136
 	.2byte	0xa80
 	.uleb128 0x2b
-	.4byte	.LASF453
+	.4byte	.LASF455
 	.byte	0x22
 	.2byte	0x525
 	.4byte	0x136
 	.2byte	0xa88
 	.uleb128 0x2b
-	.4byte	.LASF454
+	.4byte	.LASF456
 	.byte	0x22
 	.2byte	0x52e
-	.4byte	0xef9
+	.4byte	0xf0f
 	.2byte	0xa90
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xffc
+	.4byte	0x1012
 	.uleb128 0xd
-	.4byte	.LASF455
+	.4byte	.LASF457
 	.byte	0x10
 	.byte	0x23
 	.byte	0xa
-	.4byte	0x1a85
+	.4byte	0x1a9b
 	.uleb128 0xc
-	.4byte	.LASF456
+	.4byte	.LASF458
 	.byte	0x23
 	.byte	0xb
 	.4byte	0x1b5
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF457
+	.4byte	.LASF459
 	.byte	0x23
 	.byte	0xc
 	.4byte	0x15c
 	.byte	0x8
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF458
+	.4byte	.LASF460
 	.byte	0x8
 	.byte	0x23
 	.byte	0x15
-	.4byte	0x1aaa
+	.4byte	0x1ac0
 	.uleb128 0xc
-	.4byte	.LASF459
+	.4byte	.LASF461
 	.byte	0x23
 	.byte	0x16
 	.4byte	0xc0
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF460
+	.4byte	.LASF462
 	.byte	0x23
 	.byte	0x17
 	.4byte	0xc0
 	.byte	0x4
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF461
+	.4byte	.LASF463
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x24
 	.byte	0x10
-	.4byte	0x1acd
+	.4byte	0x1ae3
 	.uleb128 0x1b
-	.4byte	.LASF462
+	.4byte	.LASF464
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF463
+	.4byte	.LASF465
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF464
+	.4byte	.LASF466
 	.byte	0x2
 	.byte	0
 	.uleb128 0xb
 	.byte	0x28
 	.byte	0x24
 	.byte	0x1d
-	.4byte	0x1b1e
+	.4byte	0x1b34
 	.uleb128 0xc
-	.4byte	.LASF465
+	.4byte	.LASF467
 	.byte	0x24
 	.byte	0x1e
-	.4byte	0x1b1e
+	.4byte	0x1b34
 	.byte	0
 	.uleb128 0x10
 	.string	"val"
@@ -4716,22 +4726,22 @@ crc32_table:
 	.4byte	0x120
 	.byte	0xc
 	.uleb128 0xc
-	.4byte	.LASF466
+	.4byte	.LASF468
 	.byte	0x24
 	.byte	0x21
 	.4byte	0x120
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF467
+	.4byte	.LASF469
 	.byte	0x24
 	.byte	0x22
 	.4byte	0x136
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF468
+	.4byte	.LASF470
 	.byte	0x24
 	.byte	0x23
-	.4byte	0x1b1e
+	.4byte	0x1b34
 	.byte	0x20
 	.byte	0
 	.uleb128 0x7
@@ -4741,35 +4751,35 @@ crc32_table:
 	.byte	0x8
 	.byte	0x24
 	.byte	0x29
-	.4byte	0x1b43
+	.4byte	0x1b59
 	.uleb128 0x22
-	.4byte	.LASF469
+	.4byte	.LASF471
 	.byte	0x24
 	.byte	0x2a
-	.4byte	0x1b43
+	.4byte	0x1b59
 	.uleb128 0x22
-	.4byte	.LASF470
+	.4byte	.LASF472
 	.byte	0x24
 	.byte	0x2b
-	.4byte	0x1b6e
+	.4byte	0x1b84
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1a60
+	.4byte	0x1a76
 	.uleb128 0xd
-	.4byte	.LASF471
+	.4byte	.LASF473
 	.byte	0x8
 	.byte	0x25
 	.byte	0xa
-	.4byte	0x1b6e
+	.4byte	0x1b84
 	.uleb128 0xc
-	.4byte	.LASF456
+	.4byte	.LASF458
 	.byte	0x25
 	.byte	0xb
-	.4byte	0x3649
+	.4byte	0x365f
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF457
+	.4byte	.LASF459
 	.byte	0x25
 	.byte	0xc
 	.4byte	0x115
@@ -4777,14 +4787,14 @@ crc32_table:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1b49
+	.4byte	0x1b5f
 	.uleb128 0xb
 	.byte	0x18
 	.byte	0x24
 	.byte	0x26
-	.4byte	0x1ba7
+	.4byte	0x1bbd
 	.uleb128 0xc
-	.4byte	.LASF472
+	.4byte	.LASF474
 	.byte	0x24
 	.byte	0x27
 	.4byte	0x223
@@ -4793,13 +4803,13 @@ crc32_table:
 	.4byte	.LASF148
 	.byte	0x24
 	.byte	0x28
-	.4byte	0x1aaa
+	.4byte	0x1ac0
 	.byte	0x4
 	.uleb128 0x20
-	.4byte	0x1b24
+	.4byte	0x1b3a
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF473
+	.4byte	.LASF475
 	.byte	0x24
 	.byte	0x2d
 	.4byte	0x136
@@ -4809,108 +4819,108 @@ crc32_table:
 	.byte	0x20
 	.byte	0x24
 	.byte	0x30
-	.4byte	0x1bec
+	.4byte	0x1c02
 	.uleb128 0xc
-	.4byte	.LASF474
+	.4byte	.LASF476
 	.byte	0x24
 	.byte	0x31
-	.4byte	0x1bf1
+	.4byte	0x1c07
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF475
+	.4byte	.LASF477
 	.byte	0x24
 	.byte	0x32
 	.4byte	0xc0
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF476
+	.4byte	.LASF478
 	.byte	0x24
 	.byte	0x33
 	.4byte	0xc0
 	.byte	0xc
 	.uleb128 0xc
-	.4byte	.LASF456
+	.4byte	.LASF458
 	.byte	0x24
 	.byte	0x34
 	.4byte	0x2d
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF457
+	.4byte	.LASF459
 	.byte	0x24
 	.byte	0x35
 	.4byte	0x2d
 	.byte	0x18
 	.byte	0
 	.uleb128 0x18
-	.4byte	.LASF477
+	.4byte	.LASF479
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1bec
+	.4byte	0x1c02
 	.uleb128 0x1d
 	.byte	0x28
 	.byte	0x24
 	.byte	0x1b
-	.4byte	0x1c21
+	.4byte	0x1c37
 	.uleb128 0x22
-	.4byte	.LASF478
+	.4byte	.LASF480
 	.byte	0x24
 	.byte	0x24
-	.4byte	0x1acd
+	.4byte	0x1ae3
 	.uleb128 0x22
-	.4byte	.LASF479
+	.4byte	.LASF481
 	.byte	0x24
 	.byte	0x2e
-	.4byte	0x1b74
+	.4byte	0x1b8a
 	.uleb128 0x22
-	.4byte	.LASF480
+	.4byte	.LASF482
 	.byte	0x24
 	.byte	0x36
-	.4byte	0x1ba7
+	.4byte	0x1bbd
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF341
+	.4byte	.LASF343
 	.byte	0x30
 	.byte	0x24
 	.byte	0x19
-	.4byte	0x1c3f
+	.4byte	0x1c55
 	.uleb128 0x10
 	.string	"fn"
 	.byte	0x24
 	.byte	0x1a
-	.4byte	0x1c54
+	.4byte	0x1c6a
 	.byte	0
 	.uleb128 0x20
-	.4byte	0x1bf7
+	.4byte	0x1c0d
 	.byte	0x8
 	.byte	0
 	.uleb128 0x14
 	.4byte	0x15c
-	.4byte	0x1c4e
+	.4byte	0x1c64
 	.uleb128 0xf
-	.4byte	0x1c4e
+	.4byte	0x1c64
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1c21
+	.4byte	0x1c37
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1c3f
+	.4byte	0x1c55
 	.uleb128 0x2e
-	.4byte	.LASF481
+	.4byte	.LASF483
 	.byte	0x26
 	.byte	0x8
 	.4byte	0x2d
 	.uleb128 0x8
-	.4byte	.LASF482
+	.4byte	.LASF484
 	.byte	0x27
 	.byte	0x22
 	.4byte	0x2d
 	.uleb128 0xd
-	.4byte	.LASF280
+	.4byte	.LASF282
 	.byte	0x20
 	.byte	0x27
 	.byte	0x27
-	.4byte	0x1cad
+	.4byte	0x1cc3
 	.uleb128 0xc
 	.4byte	.LASF61
 	.byte	0x27
@@ -4918,86 +4928,86 @@ crc32_table:
 	.4byte	0x2d
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF483
+	.4byte	.LASF485
 	.byte	0x27
 	.byte	0x29
-	.4byte	0x1c65
+	.4byte	0x1c7b
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF484
+	.4byte	.LASF486
 	.byte	0x27
 	.byte	0x2b
 	.4byte	0x136
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF485
+	.4byte	.LASF487
 	.byte	0x27
 	.byte	0x2d
 	.4byte	0xc0
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF486
+	.4byte	.LASF488
 	.byte	0x8
 	.byte	0x28
 	.byte	0x10
-	.4byte	0x1cc6
+	.4byte	0x1cdc
 	.uleb128 0xc
-	.4byte	.LASF487
+	.4byte	.LASF489
 	.byte	0x28
 	.byte	0x10
 	.4byte	0xa6d
 	.byte	0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x1cad
+	.4byte	0x1cc3
 	.uleb128 0x8
-	.4byte	.LASF488
+	.4byte	.LASF490
 	.byte	0x28
 	.byte	0x10
-	.4byte	0x1cad
+	.4byte	0x1cc3
 	.uleb128 0x11
-	.4byte	.LASF489
+	.4byte	.LASF491
 	.byte	0x28
 	.byte	0x26
 	.4byte	0x6c
 	.uleb128 0x11
-	.4byte	.LASF490
+	.4byte	.LASF492
 	.byte	0x28
 	.byte	0x59
-	.4byte	0x1cad
+	.4byte	0x1cc3
 	.uleb128 0x11
-	.4byte	.LASF491
+	.4byte	.LASF493
 	.byte	0x28
 	.byte	0x5a
-	.4byte	0x1cad
+	.4byte	0x1cc3
 	.uleb128 0x11
-	.4byte	.LASF492
+	.4byte	.LASF494
 	.byte	0x28
 	.byte	0x5b
-	.4byte	0x1cad
+	.4byte	0x1cc3
 	.uleb128 0x11
-	.4byte	.LASF493
+	.4byte	.LASF495
 	.byte	0x28
 	.byte	0x5c
-	.4byte	0x1cad
+	.4byte	0x1cc3
 	.uleb128 0x5
 	.4byte	0x34
-	.4byte	0x1d1d
+	.4byte	0x1d33
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x1d0d
+	.4byte	0x1d23
 	.uleb128 0x15
-	.4byte	.LASF494
+	.4byte	.LASF496
 	.byte	0x28
 	.2byte	0x303
-	.4byte	0x1d1d
+	.4byte	0x1d33
 	.uleb128 0x5
 	.4byte	0x34
-	.4byte	0x1d44
+	.4byte	0x1d5a
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x40
@@ -5006,14 +5016,14 @@ crc32_table:
 	.byte	0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x1d2e
+	.4byte	0x1d44
 	.uleb128 0x15
-	.4byte	.LASF495
+	.4byte	.LASF497
 	.byte	0x28
 	.2byte	0x357
-	.4byte	0x1d44
+	.4byte	0x1d5a
 	.uleb128 0x11
-	.4byte	.LASF496
+	.4byte	.LASF498
 	.byte	0x29
 	.byte	0x67
 	.4byte	0xc0
@@ -5021,9 +5031,9 @@ crc32_table:
 	.byte	0x10
 	.byte	0x2a
 	.byte	0x63
-	.4byte	0x1d7f
+	.4byte	0x1d95
 	.uleb128 0x22
-	.4byte	.LASF497
+	.4byte	.LASF499
 	.byte	0x2a
 	.byte	0x64
 	.4byte	0x2d8
@@ -5034,11 +5044,11 @@ crc32_table:
 	.4byte	0x34d
 	.byte	0
 	.uleb128 0x25
-	.4byte	.LASF498
+	.4byte	.LASF500
 	.2byte	0x240
 	.byte	0x2a
 	.byte	0x5c
-	.4byte	0x1df4
+	.4byte	0x1e0a
 	.uleb128 0xc
 	.4byte	.LASF171
 	.byte	0x2a
@@ -5046,19 +5056,19 @@ crc32_table:
 	.4byte	0x90
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF499
+	.4byte	.LASF501
 	.byte	0x2a
 	.byte	0x5e
 	.4byte	0x90
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF500
+	.4byte	.LASF502
 	.byte	0x2a
 	.byte	0x5f
 	.4byte	0x90
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF501
+	.4byte	.LASF503
 	.byte	0x2a
 	.byte	0x60
 	.4byte	0x90
@@ -5067,71 +5077,71 @@ crc32_table:
 	.4byte	.LASF63
 	.byte	0x2a
 	.byte	0x61
-	.4byte	0x1df4
+	.4byte	0x1e0a
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF502
+	.4byte	.LASF504
 	.byte	0x2a
 	.byte	0x62
-	.4byte	0x1e2b
+	.4byte	0x1e41
 	.byte	0x10
 	.uleb128 0x20
-	.4byte	0x1d60
+	.4byte	0x1d76
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF503
+	.4byte	.LASF505
 	.byte	0x2a
 	.byte	0x67
-	.4byte	0x1e31
+	.4byte	0x1e47
 	.byte	0x28
 	.uleb128 0x26
-	.4byte	.LASF504
+	.4byte	.LASF506
 	.byte	0x2a
 	.byte	0x68
-	.4byte	0x1e41
+	.4byte	0x1e57
 	.2byte	0x228
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1d7f
+	.4byte	0x1d95
 	.uleb128 0xd
-	.4byte	.LASF505
+	.4byte	.LASF507
 	.byte	0x10
 	.byte	0x2a
 	.byte	0x70
-	.4byte	0x1e2b
+	.4byte	0x1e41
 	.uleb128 0xc
-	.4byte	.LASF506
+	.4byte	.LASF508
 	.byte	0x2a
 	.byte	0x71
 	.4byte	0x86f
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF507
+	.4byte	.LASF509
 	.byte	0x2a
 	.byte	0x72
 	.4byte	0x277
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF508
+	.4byte	.LASF510
 	.byte	0x2a
 	.byte	0x73
-	.4byte	0x1df4
+	.4byte	0x1e0a
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1dfa
+	.4byte	0x1e10
 	.uleb128 0x5
 	.4byte	0x442
-	.4byte	0x1e41
+	.4byte	0x1e57
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x3f
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x2d
-	.4byte	0x1e57
+	.4byte	0x1e6d
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x2
@@ -5140,21 +5150,21 @@ crc32_table:
 	.byte	0
 	.byte	0
 	.uleb128 0x11
-	.4byte	.LASF509
+	.4byte	.LASF511
 	.byte	0x2b
 	.byte	0x30
 	.4byte	0x4d4
 	.uleb128 0x11
-	.4byte	.LASF510
+	.4byte	.LASF512
 	.byte	0x2b
 	.byte	0x30
 	.4byte	0x4d4
 	.uleb128 0xd
-	.4byte	.LASF511
+	.4byte	.LASF513
 	.byte	0x18
 	.byte	0x2c
 	.byte	0x23
-	.4byte	0x1e92
+	.4byte	0x1ea8
 	.uleb128 0xc
 	.4byte	.LASF98
 	.byte	0x2c
@@ -5169,201 +5179,201 @@ crc32_table:
 	.byte	0x8
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF512
+	.4byte	.LASF514
 	.byte	0x2c
 	.byte	0x27
-	.4byte	0x1e6d
+	.4byte	0x1e83
 	.uleb128 0xd
-	.4byte	.LASF513
+	.4byte	.LASF515
 	.byte	0x4
 	.byte	0x2d
 	.byte	0x30
-	.4byte	0x1eb6
+	.4byte	0x1ecc
 	.uleb128 0xc
-	.4byte	.LASF514
+	.4byte	.LASF516
 	.byte	0x2d
 	.byte	0x31
 	.4byte	0x6c
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF515
+	.4byte	.LASF517
 	.byte	0x2d
 	.byte	0x35
-	.4byte	0x1e9d
+	.4byte	0x1eb3
 	.uleb128 0xb
 	.byte	0x8
 	.byte	0x2e
 	.byte	0x62
-	.4byte	0x1ed6
+	.4byte	0x1eec
 	.uleb128 0xc
-	.4byte	.LASF487
+	.4byte	.LASF489
 	.byte	0x2e
 	.byte	0x62
 	.4byte	0xa6d
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF516
+	.4byte	.LASF518
 	.byte	0x2e
 	.byte	0x62
-	.4byte	0x1ec1
+	.4byte	0x1ed7
 	.uleb128 0x11
-	.4byte	.LASF517
+	.4byte	.LASF519
 	.byte	0x2e
 	.byte	0x63
-	.4byte	0x1ed6
+	.4byte	0x1eec
 	.uleb128 0x1a
-	.4byte	.LASF518
+	.4byte	.LASF520
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x2e
 	.2byte	0x187
-	.4byte	0x1f28
+	.4byte	0x1f3e
 	.uleb128 0x1b
-	.4byte	.LASF519
+	.4byte	.LASF521
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF520
+	.4byte	.LASF522
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF521
+	.4byte	.LASF523
 	.byte	0x2
 	.uleb128 0x1b
-	.4byte	.LASF522
+	.4byte	.LASF524
 	.byte	0x2
 	.uleb128 0x1b
-	.4byte	.LASF523
+	.4byte	.LASF525
 	.byte	0x3
 	.uleb128 0x1b
-	.4byte	.LASF524
+	.4byte	.LASF526
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF525
+	.4byte	.LASF527
 	.byte	0x5
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x1ed6
-	.4byte	0x1f38
+	.4byte	0x1eec
+	.4byte	0x1f4e
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x4
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF518
+	.4byte	.LASF520
 	.byte	0x2e
 	.2byte	0x19a
-	.4byte	0x1f28
+	.4byte	0x1f3e
 	.uleb128 0x2f
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x30
 	.byte	0xb
-	.4byte	0x1fb4
+	.4byte	0x1fca
 	.uleb128 0x30
-	.4byte	.LASF526
+	.4byte	.LASF528
 	.4byte	0x20000
 	.uleb128 0x30
-	.4byte	.LASF527
+	.4byte	.LASF529
 	.4byte	0x40000
 	.uleb128 0x30
-	.4byte	.LASF528
+	.4byte	.LASF530
 	.4byte	0x80000
 	.uleb128 0x30
-	.4byte	.LASF529
+	.4byte	.LASF531
 	.4byte	0x100000
 	.uleb128 0x30
-	.4byte	.LASF530
+	.4byte	.LASF532
 	.4byte	0x200000
 	.uleb128 0x30
-	.4byte	.LASF531
+	.4byte	.LASF533
 	.4byte	0x400000
 	.uleb128 0x30
-	.4byte	.LASF532
+	.4byte	.LASF534
 	.4byte	0x800000
 	.uleb128 0x30
-	.4byte	.LASF533
+	.4byte	.LASF535
 	.4byte	0x1000000
 	.uleb128 0x30
-	.4byte	.LASF534
+	.4byte	.LASF536
 	.4byte	0x2000000
 	.uleb128 0x30
-	.4byte	.LASF535
+	.4byte	.LASF537
 	.4byte	0x4000000
 	.uleb128 0x30
-	.4byte	.LASF536
+	.4byte	.LASF538
 	.4byte	0x8000000
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1fba
+	.4byte	0x1fd0
 	.uleb128 0x18
-	.4byte	.LASF537
+	.4byte	.LASF539
 	.uleb128 0x24
-	.4byte	.LASF538
+	.4byte	.LASF540
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x2f
 	.byte	0x28
-	.4byte	0x2000
+	.4byte	0x2016
 	.uleb128 0x1b
-	.4byte	.LASF539
+	.4byte	.LASF541
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF540
+	.4byte	.LASF542
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF541
+	.4byte	.LASF543
 	.byte	0x2
 	.uleb128 0x1b
-	.4byte	.LASF542
+	.4byte	.LASF544
 	.byte	0x3
 	.uleb128 0x1b
-	.4byte	.LASF543
+	.4byte	.LASF545
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF544
+	.4byte	.LASF546
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF545
+	.4byte	.LASF547
 	.byte	0x5
 	.uleb128 0x1b
-	.4byte	.LASF546
+	.4byte	.LASF548
 	.byte	0x6
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x1e7
-	.4byte	0x2010
+	.4byte	0x2026
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x5
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x2000
+	.4byte	0x2016
 	.uleb128 0x11
-	.4byte	.LASF547
+	.4byte	.LASF549
 	.byte	0x2f
 	.byte	0x45
-	.4byte	0x2010
+	.4byte	0x2026
 	.uleb128 0x11
-	.4byte	.LASF548
+	.4byte	.LASF550
 	.byte	0x2f
 	.byte	0x5a
 	.4byte	0xc0
 	.uleb128 0xd
-	.4byte	.LASF549
+	.4byte	.LASF551
 	.byte	0x68
 	.byte	0x2f
 	.byte	0x63
-	.4byte	0x2050
+	.4byte	0x2066
 	.uleb128 0xc
-	.4byte	.LASF550
+	.4byte	.LASF552
 	.byte	0x2f
 	.byte	0x64
-	.4byte	0x2050
+	.4byte	0x2066
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF551
+	.4byte	.LASF553
 	.byte	0x2f
 	.byte	0x65
 	.4byte	0x2d
@@ -5371,416 +5381,416 @@ crc32_table:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x2d8
-	.4byte	0x2060
+	.4byte	0x2076
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x5
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF552
+	.4byte	.LASF554
 	.byte	0
 	.byte	0x2f
 	.byte	0x71
-	.4byte	0x2077
+	.4byte	0x208d
 	.uleb128 0x10
 	.string	"x"
 	.byte	0x2f
 	.byte	0x72
-	.4byte	0x2077
+	.4byte	0x208d
 	.byte	0
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x60
-	.4byte	0x2086
+	.4byte	0x209c
 	.uleb128 0x31
 	.4byte	0x4e
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF553
+	.4byte	.LASF555
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x2f
 	.byte	0x87
-	.4byte	0x20f1
+	.4byte	0x2107
 	.uleb128 0x1b
-	.4byte	.LASF554
+	.4byte	.LASF556
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF555
+	.4byte	.LASF557
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF556
+	.4byte	.LASF558
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF557
+	.4byte	.LASF559
 	.byte	0x2
 	.uleb128 0x1b
-	.4byte	.LASF558
+	.4byte	.LASF560
 	.byte	0x3
 	.uleb128 0x1b
-	.4byte	.LASF559
+	.4byte	.LASF561
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF560
+	.4byte	.LASF562
 	.byte	0x5
 	.uleb128 0x1b
-	.4byte	.LASF561
+	.4byte	.LASF563
 	.byte	0x6
 	.uleb128 0x1b
-	.4byte	.LASF562
+	.4byte	.LASF564
 	.byte	0x7
 	.uleb128 0x1b
-	.4byte	.LASF563
+	.4byte	.LASF565
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF564
+	.4byte	.LASF566
 	.byte	0x9
 	.uleb128 0x1b
-	.4byte	.LASF565
+	.4byte	.LASF567
 	.byte	0xa
 	.uleb128 0x1b
-	.4byte	.LASF566
+	.4byte	.LASF568
 	.byte	0xb
 	.uleb128 0x1b
-	.4byte	.LASF567
+	.4byte	.LASF569
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF568
+	.4byte	.LASF570
 	.byte	0xd
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF569
+	.4byte	.LASF571
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x2f
 	.byte	0x9f
-	.4byte	0x21d4
+	.4byte	0x21ea
 	.uleb128 0x1b
-	.4byte	.LASF570
+	.4byte	.LASF572
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF571
+	.4byte	.LASF573
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF572
+	.4byte	.LASF574
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF573
+	.4byte	.LASF575
 	.byte	0x2
 	.uleb128 0x1b
-	.4byte	.LASF574
+	.4byte	.LASF576
 	.byte	0x3
 	.uleb128 0x1b
-	.4byte	.LASF575
+	.4byte	.LASF577
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF576
+	.4byte	.LASF578
 	.byte	0x5
 	.uleb128 0x1b
-	.4byte	.LASF577
+	.4byte	.LASF579
 	.byte	0x6
 	.uleb128 0x1b
-	.4byte	.LASF578
+	.4byte	.LASF580
 	.byte	0x7
 	.uleb128 0x1b
-	.4byte	.LASF579
+	.4byte	.LASF581
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF580
+	.4byte	.LASF582
 	.byte	0x9
 	.uleb128 0x1b
-	.4byte	.LASF581
+	.4byte	.LASF583
 	.byte	0xa
 	.uleb128 0x1b
-	.4byte	.LASF582
+	.4byte	.LASF584
 	.byte	0xb
 	.uleb128 0x1b
-	.4byte	.LASF583
+	.4byte	.LASF585
 	.byte	0xc
 	.uleb128 0x1b
-	.4byte	.LASF584
+	.4byte	.LASF586
 	.byte	0xd
 	.uleb128 0x1b
-	.4byte	.LASF585
+	.4byte	.LASF587
 	.byte	0xe
 	.uleb128 0x1b
-	.4byte	.LASF586
+	.4byte	.LASF588
 	.byte	0xf
 	.uleb128 0x1b
-	.4byte	.LASF587
+	.4byte	.LASF589
 	.byte	0x10
 	.uleb128 0x1b
-	.4byte	.LASF588
+	.4byte	.LASF590
 	.byte	0x11
 	.uleb128 0x1b
-	.4byte	.LASF589
+	.4byte	.LASF591
 	.byte	0x12
 	.uleb128 0x1b
-	.4byte	.LASF590
+	.4byte	.LASF592
 	.byte	0x13
 	.uleb128 0x1b
-	.4byte	.LASF591
+	.4byte	.LASF593
 	.byte	0x14
 	.uleb128 0x1b
-	.4byte	.LASF592
+	.4byte	.LASF594
 	.byte	0x15
 	.uleb128 0x1b
-	.4byte	.LASF593
+	.4byte	.LASF595
 	.byte	0x16
 	.uleb128 0x1b
-	.4byte	.LASF594
+	.4byte	.LASF596
 	.byte	0x17
 	.uleb128 0x1b
-	.4byte	.LASF595
+	.4byte	.LASF597
 	.byte	0x18
 	.uleb128 0x1b
-	.4byte	.LASF596
+	.4byte	.LASF598
 	.byte	0x19
 	.uleb128 0x1b
-	.4byte	.LASF597
+	.4byte	.LASF599
 	.byte	0x1a
 	.uleb128 0x1b
-	.4byte	.LASF598
+	.4byte	.LASF600
 	.byte	0x1b
 	.uleb128 0x1b
-	.4byte	.LASF599
+	.4byte	.LASF601
 	.byte	0x1c
 	.uleb128 0x1b
-	.4byte	.LASF600
+	.4byte	.LASF602
 	.byte	0x1d
 	.uleb128 0x1b
-	.4byte	.LASF601
+	.4byte	.LASF603
 	.byte	0x1e
 	.uleb128 0x1b
-	.4byte	.LASF602
+	.4byte	.LASF604
 	.byte	0x1f
 	.uleb128 0x1b
-	.4byte	.LASF603
+	.4byte	.LASF605
 	.byte	0x20
 	.uleb128 0x1b
-	.4byte	.LASF604
+	.4byte	.LASF606
 	.byte	0x21
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF605
+	.4byte	.LASF607
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x2f
 	.byte	0xd3
-	.4byte	0x2209
+	.4byte	0x221f
 	.uleb128 0x1b
-	.4byte	.LASF606
+	.4byte	.LASF608
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF607
+	.4byte	.LASF609
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF608
+	.4byte	.LASF610
 	.byte	0x2
 	.uleb128 0x1b
-	.4byte	.LASF609
+	.4byte	.LASF611
 	.byte	0x3
 	.uleb128 0x1b
-	.4byte	.LASF610
+	.4byte	.LASF612
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF611
+	.4byte	.LASF613
 	.byte	0x5
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF612
+	.4byte	.LASF614
 	.byte	0x20
 	.byte	0x2f
 	.byte	0xea
-	.4byte	0x222e
+	.4byte	0x2244
 	.uleb128 0xc
-	.4byte	.LASF613
+	.4byte	.LASF615
 	.byte	0x2f
 	.byte	0xf3
 	.4byte	0x3e
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF614
+	.4byte	.LASF616
 	.byte	0x2f
 	.byte	0xf4
 	.4byte	0x3e
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF615
+	.4byte	.LASF617
 	.byte	0x88
 	.byte	0x2f
 	.byte	0xf7
-	.4byte	0x2277
+	.4byte	0x228d
 	.uleb128 0xc
-	.4byte	.LASF616
+	.4byte	.LASF618
 	.byte	0x2f
 	.byte	0xf8
-	.4byte	0x2277
+	.4byte	0x228d
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF617
+	.4byte	.LASF619
 	.byte	0x2f
 	.byte	0xf9
-	.4byte	0x2209
+	.4byte	0x221f
 	.byte	0x50
 	.uleb128 0xc
-	.4byte	.LASF618
+	.4byte	.LASF620
 	.byte	0x2f
 	.byte	0xfb
 	.4byte	0x52c
 	.byte	0x70
 	.uleb128 0xc
-	.4byte	.LASF619
+	.4byte	.LASF621
 	.byte	0x2f
 	.byte	0xfd
 	.4byte	0x2d
 	.byte	0x78
 	.uleb128 0xc
-	.4byte	.LASF620
+	.4byte	.LASF622
 	.byte	0x2f
 	.byte	0xff
-	.4byte	0x23f3
+	.4byte	0x2409
 	.byte	0x80
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x2d8
-	.4byte	0x2287
+	.4byte	0x229d
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x4
 	.byte	0
 	.uleb128 0x29
-	.4byte	.LASF621
+	.4byte	.LASF623
 	.2byte	0x1680
 	.byte	0x2f
 	.2byte	0x284
-	.4byte	0x23f3
+	.4byte	0x2409
 	.uleb128 0x1c
-	.4byte	.LASF622
+	.4byte	.LASF624
 	.byte	0x2f
 	.2byte	0x285
-	.4byte	0x27be
+	.4byte	0x27d4
 	.byte	0
 	.uleb128 0x2b
-	.4byte	.LASF623
+	.4byte	.LASF625
 	.byte	0x2f
 	.2byte	0x286
-	.4byte	0x27ce
+	.4byte	0x27e4
 	.2byte	0x1380
 	.uleb128 0x2b
-	.4byte	.LASF624
+	.4byte	.LASF626
 	.byte	0x2f
 	.2byte	0x287
 	.4byte	0xc0
 	.2byte	0x13c0
 	.uleb128 0x2b
-	.4byte	.LASF625
+	.4byte	.LASF627
 	.byte	0x2f
 	.2byte	0x2a0
 	.4byte	0x2d
 	.2byte	0x13c8
 	.uleb128 0x2b
-	.4byte	.LASF626
+	.4byte	.LASF628
 	.byte	0x2f
 	.2byte	0x2a1
 	.4byte	0x2d
 	.2byte	0x13d0
 	.uleb128 0x2b
-	.4byte	.LASF627
+	.4byte	.LASF629
 	.byte	0x2f
 	.2byte	0x2a2
 	.4byte	0x2d
 	.2byte	0x13d8
 	.uleb128 0x2b
-	.4byte	.LASF628
+	.4byte	.LASF630
 	.byte	0x2f
 	.2byte	0x2a4
 	.4byte	0xc0
 	.2byte	0x13e0
 	.uleb128 0x2b
-	.4byte	.LASF629
+	.4byte	.LASF631
 	.byte	0x2f
 	.2byte	0x2a5
-	.4byte	0x1e92
+	.4byte	0x1ea8
 	.2byte	0x13e8
 	.uleb128 0x2b
-	.4byte	.LASF630
+	.4byte	.LASF632
 	.byte	0x2f
 	.2byte	0x2a6
-	.4byte	0x1e92
+	.4byte	0x1ea8
 	.2byte	0x1400
 	.uleb128 0x2b
-	.4byte	.LASF631
+	.4byte	.LASF633
 	.byte	0x2f
 	.2byte	0x2a7
-	.4byte	0x1a5a
+	.4byte	0x1a70
 	.2byte	0x1418
 	.uleb128 0x2b
-	.4byte	.LASF632
+	.4byte	.LASF634
 	.byte	0x2f
 	.2byte	0x2a9
 	.4byte	0xc0
 	.2byte	0x1420
 	.uleb128 0x2b
-	.4byte	.LASF633
+	.4byte	.LASF635
 	.byte	0x2f
 	.2byte	0x2aa
-	.4byte	0x24f2
+	.4byte	0x2508
 	.2byte	0x1424
 	.uleb128 0x2b
-	.4byte	.LASF634
+	.4byte	.LASF636
 	.byte	0x2f
 	.2byte	0x2ac
 	.4byte	0xc0
 	.2byte	0x1428
 	.uleb128 0x2b
-	.4byte	.LASF635
+	.4byte	.LASF637
 	.byte	0x2f
 	.2byte	0x2af
 	.4byte	0xc0
 	.2byte	0x142c
 	.uleb128 0x2b
-	.4byte	.LASF636
+	.4byte	.LASF638
 	.byte	0x2f
 	.2byte	0x2b0
-	.4byte	0x24f2
+	.4byte	0x2508
 	.2byte	0x1430
 	.uleb128 0x2b
-	.4byte	.LASF637
+	.4byte	.LASF639
 	.byte	0x2f
 	.2byte	0x2b1
-	.4byte	0x1e92
+	.4byte	0x1ea8
 	.2byte	0x1438
 	.uleb128 0x2b
-	.4byte	.LASF638
+	.4byte	.LASF640
 	.byte	0x2f
 	.2byte	0x2b2
-	.4byte	0x1a5a
+	.4byte	0x1a70
 	.2byte	0x1450
 	.uleb128 0x2b
-	.4byte	.LASF639
+	.4byte	.LASF641
 	.byte	0x2f
 	.2byte	0x2b8
 	.4byte	0x2d
 	.2byte	0x1458
 	.uleb128 0x2b
-	.4byte	.LASF640
+	.4byte	.LASF642
 	.byte	0x2f
 	.2byte	0x2c3
-	.4byte	0x2060
+	.4byte	0x2076
 	.2byte	0x1480
 	.uleb128 0x2b
-	.4byte	.LASF641
+	.4byte	.LASF643
 	.byte	0x2f
 	.2byte	0x2c4
 	.4byte	0x86f
 	.2byte	0x1480
 	.uleb128 0x2b
-	.4byte	.LASF615
+	.4byte	.LASF617
 	.byte	0x2f
 	.2byte	0x2d7
-	.4byte	0x222e
+	.4byte	0x2244
 	.2byte	0x1488
 	.uleb128 0x2b
 	.4byte	.LASF61
@@ -5789,225 +5799,225 @@ crc32_table:
 	.4byte	0x2d
 	.2byte	0x1510
 	.uleb128 0x2b
-	.4byte	.LASF642
+	.4byte	.LASF644
 	.byte	0x2f
 	.2byte	0x2db
-	.4byte	0x2060
+	.4byte	0x2076
 	.2byte	0x1540
 	.uleb128 0x2b
-	.4byte	.LASF643
+	.4byte	.LASF645
 	.byte	0x2f
 	.2byte	0x2de
-	.4byte	0x27de
+	.4byte	0x27f4
 	.2byte	0x1540
 	.uleb128 0x2b
-	.4byte	.LASF644
+	.4byte	.LASF646
 	.byte	0x2f
 	.2byte	0x2df
-	.4byte	0x27e4
+	.4byte	0x27fa
 	.2byte	0x1548
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2287
+	.4byte	0x229d
 	.uleb128 0x1a
-	.4byte	.LASF645
+	.4byte	.LASF647
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x2f
 	.2byte	0x112
-	.4byte	0x2423
+	.4byte	0x2439
 	.uleb128 0x1b
-	.4byte	.LASF646
+	.4byte	.LASF648
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF647
+	.4byte	.LASF649
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF648
+	.4byte	.LASF650
 	.byte	0x2
 	.uleb128 0x1b
-	.4byte	.LASF649
+	.4byte	.LASF651
 	.byte	0x3
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF650
+	.4byte	.LASF652
 	.byte	0x50
 	.byte	0x2f
 	.2byte	0x11d
-	.4byte	0x2465
+	.4byte	0x247b
 	.uleb128 0x1c
-	.4byte	.LASF500
+	.4byte	.LASF502
 	.byte	0x2f
 	.2byte	0x11e
 	.4byte	0xc0
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF651
+	.4byte	.LASF653
 	.byte	0x2f
 	.2byte	0x11f
 	.4byte	0xc0
 	.byte	0x4
 	.uleb128 0x1c
-	.4byte	.LASF652
+	.4byte	.LASF654
 	.byte	0x2f
 	.2byte	0x120
 	.4byte	0xc0
 	.byte	0x8
 	.uleb128 0x1c
-	.4byte	.LASF616
+	.4byte	.LASF618
 	.byte	0x2f
 	.2byte	0x123
-	.4byte	0x2465
+	.4byte	0x247b
 	.byte	0x10
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x2d8
-	.4byte	0x2475
+	.4byte	0x248b
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x3
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF653
+	.4byte	.LASF655
 	.byte	0x60
 	.byte	0x2f
 	.2byte	0x126
-	.4byte	0x24aa
+	.4byte	0x24c0
 	.uleb128 0x23
 	.string	"pcp"
 	.byte	0x2f
 	.2byte	0x127
-	.4byte	0x2423
+	.4byte	0x2439
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF654
+	.4byte	.LASF656
 	.byte	0x2f
 	.2byte	0x12d
 	.4byte	0xf6
 	.byte	0x50
 	.uleb128 0x1c
-	.4byte	.LASF655
+	.4byte	.LASF657
 	.byte	0x2f
 	.2byte	0x12e
-	.4byte	0x24aa
+	.4byte	0x24c0
 	.byte	0x51
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xf6
-	.4byte	0x24ba
+	.4byte	0x24d0
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0xc
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF656
+	.4byte	.LASF658
 	.byte	0x22
 	.byte	0x2f
 	.2byte	0x132
-	.4byte	0x24e2
+	.4byte	0x24f8
 	.uleb128 0x1c
-	.4byte	.LASF654
+	.4byte	.LASF656
 	.byte	0x2f
 	.2byte	0x133
 	.4byte	0xf6
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF657
+	.4byte	.LASF659
 	.byte	0x2f
 	.2byte	0x134
-	.4byte	0x24e2
+	.4byte	0x24f8
 	.byte	0x1
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xf6
-	.4byte	0x24f2
+	.4byte	0x2508
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x20
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF658
+	.4byte	.LASF660
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x2f
 	.2byte	0x139
-	.4byte	0x251c
+	.4byte	0x2532
 	.uleb128 0x1b
-	.4byte	.LASF659
+	.4byte	.LASF661
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF660
+	.4byte	.LASF662
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF661
+	.4byte	.LASF663
 	.byte	0x2
 	.uleb128 0x1b
-	.4byte	.LASF662
+	.4byte	.LASF664
 	.byte	0x3
 	.byte	0
 	.uleb128 0x29
-	.4byte	.LASF663
+	.4byte	.LASF665
 	.2byte	0x680
 	.byte	0x2f
 	.2byte	0x172
-	.4byte	0x26ea
+	.4byte	0x2700
 	.uleb128 0x1c
-	.4byte	.LASF664
+	.4byte	.LASF666
 	.byte	0x2f
 	.2byte	0x176
-	.4byte	0x26ea
+	.4byte	0x2700
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF665
+	.4byte	.LASF667
 	.byte	0x2f
 	.2byte	0x178
 	.4byte	0x2d
 	.byte	0x18
 	.uleb128 0x1c
-	.4byte	.LASF666
+	.4byte	.LASF668
 	.byte	0x2f
 	.2byte	0x183
-	.4byte	0x26fa
+	.4byte	0x2710
 	.byte	0x20
 	.uleb128 0x1c
-	.4byte	.LASF667
+	.4byte	.LASF669
 	.byte	0x2f
 	.2byte	0x188
-	.4byte	0x23f3
+	.4byte	0x2409
 	.byte	0x38
 	.uleb128 0x1c
-	.4byte	.LASF668
+	.4byte	.LASF670
 	.byte	0x2f
 	.2byte	0x189
-	.4byte	0x270a
+	.4byte	0x2720
 	.byte	0x40
 	.uleb128 0x1c
-	.4byte	.LASF669
+	.4byte	.LASF671
 	.byte	0x2f
 	.2byte	0x18c
 	.4byte	0x22e
 	.byte	0x48
 	.uleb128 0x1c
-	.4byte	.LASF670
+	.4byte	.LASF672
 	.byte	0x2f
 	.2byte	0x198
 	.4byte	0x2d
 	.byte	0x50
 	.uleb128 0x1c
-	.4byte	.LASF671
+	.4byte	.LASF673
 	.byte	0x2f
 	.2byte	0x1c3
 	.4byte	0x2d
 	.byte	0x58
 	.uleb128 0x1c
-	.4byte	.LASF672
+	.4byte	.LASF674
 	.byte	0x2f
 	.2byte	0x1c4
 	.4byte	0x2d
 	.byte	0x60
 	.uleb128 0x1c
-	.4byte	.LASF673
+	.4byte	.LASF675
 	.byte	0x2f
 	.2byte	0x1c5
 	.4byte	0x2d
@@ -6019,28 +6029,28 @@ crc32_table:
 	.4byte	0x55
 	.byte	0x70
 	.uleb128 0x1c
-	.4byte	.LASF674
+	.4byte	.LASF676
 	.byte	0x2f
 	.2byte	0x1cf
 	.4byte	0x2d
 	.byte	0x78
 	.uleb128 0x1c
-	.4byte	.LASF675
+	.4byte	.LASF677
 	.byte	0x2f
 	.2byte	0x1d7
 	.4byte	0xc0
 	.byte	0x80
 	.uleb128 0x1c
-	.4byte	.LASF640
+	.4byte	.LASF642
 	.byte	0x2f
 	.2byte	0x1da
-	.4byte	0x2060
+	.4byte	0x2076
 	.byte	0xc0
 	.uleb128 0x1c
-	.4byte	.LASF549
+	.4byte	.LASF551
 	.byte	0x2f
 	.2byte	0x1dd
-	.4byte	0x2710
+	.4byte	0x2726
 	.byte	0xc0
 	.uleb128 0x2b
 	.4byte	.LASF61
@@ -6055,76 +6065,76 @@ crc32_table:
 	.4byte	0x86f
 	.2byte	0x540
 	.uleb128 0x2b
-	.4byte	.LASF642
+	.4byte	.LASF644
 	.byte	0x2f
 	.2byte	0x1e6
-	.4byte	0x2060
+	.4byte	0x2076
 	.2byte	0x580
 	.uleb128 0x2b
-	.4byte	.LASF676
+	.4byte	.LASF678
 	.byte	0x2f
 	.2byte	0x1ed
 	.4byte	0x2d
 	.2byte	0x580
 	.uleb128 0x2b
-	.4byte	.LASF677
+	.4byte	.LASF679
 	.byte	0x2f
 	.2byte	0x1f1
 	.4byte	0x2d
 	.2byte	0x588
 	.uleb128 0x2b
-	.4byte	.LASF678
+	.4byte	.LASF680
 	.byte	0x2f
 	.2byte	0x1f3
 	.4byte	0x3e
 	.2byte	0x590
 	.uleb128 0x2b
-	.4byte	.LASF679
+	.4byte	.LASF681
 	.byte	0x2f
 	.2byte	0x1fc
 	.4byte	0x6c
 	.2byte	0x5a0
 	.uleb128 0x2b
-	.4byte	.LASF680
+	.4byte	.LASF682
 	.byte	0x2f
 	.2byte	0x1fd
 	.4byte	0x6c
 	.2byte	0x5a4
 	.uleb128 0x2b
-	.4byte	.LASF681
+	.4byte	.LASF683
 	.byte	0x2f
 	.2byte	0x1fe
 	.4byte	0xc0
 	.2byte	0x5a8
 	.uleb128 0x2b
-	.4byte	.LASF682
+	.4byte	.LASF684
 	.byte	0x2f
 	.2byte	0x203
 	.4byte	0x22e
 	.2byte	0x5ac
 	.uleb128 0x2b
-	.4byte	.LASF683
+	.4byte	.LASF685
 	.byte	0x2f
 	.2byte	0x206
 	.4byte	0x22e
 	.2byte	0x5ad
 	.uleb128 0x2b
-	.4byte	.LASF684
+	.4byte	.LASF686
 	.byte	0x2f
 	.2byte	0x208
-	.4byte	0x2060
+	.4byte	0x2076
 	.2byte	0x5c0
 	.uleb128 0x2b
-	.4byte	.LASF644
+	.4byte	.LASF646
 	.byte	0x2f
 	.2byte	0x20a
-	.4byte	0x2720
+	.4byte	0x2736
 	.2byte	0x5c0
 	.uleb128 0x2b
-	.4byte	.LASF685
+	.4byte	.LASF687
 	.byte	0x2f
 	.2byte	0x20b
-	.4byte	0x2730
+	.4byte	0x2746
 	.2byte	0x628
 	.uleb128 0x2b
 	.4byte	.LASF66
@@ -6153,38 +6163,38 @@ crc32_table:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x2d
-	.4byte	0x26fa
+	.4byte	0x2710
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x15c
-	.4byte	0x270a
+	.4byte	0x2720
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2475
+	.4byte	0x248b
 	.uleb128 0x5
-	.4byte	0x202b
-	.4byte	0x2720
+	.4byte	0x2041
+	.4byte	0x2736
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0xa
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x52c
-	.4byte	0x2730
+	.4byte	0x2746
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0xc
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x52c
-	.4byte	0x273f
+	.4byte	0x2755
 	.uleb128 0x31
 	.4byte	0x4e
 	.byte	0
@@ -6193,28 +6203,28 @@ crc32_table:
 	.4byte	0x6c
 	.byte	0x2f
 	.2byte	0x24f
-	.4byte	0x2759
+	.4byte	0x276f
 	.uleb128 0x1b
-	.4byte	.LASF686
+	.4byte	.LASF688
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF687
+	.4byte	.LASF689
 	.byte	0x1
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF688
+	.4byte	.LASF690
 	.byte	0x10
 	.byte	0x2f
 	.2byte	0x25f
-	.4byte	0x2781
+	.4byte	0x2797
 	.uleb128 0x1c
-	.4byte	.LASF663
+	.4byte	.LASF665
 	.byte	0x2f
 	.2byte	0x260
-	.4byte	0x2781
+	.4byte	0x2797
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF689
+	.4byte	.LASF691
 	.byte	0x2f
 	.2byte	0x261
 	.4byte	0xc0
@@ -6222,76 +6232,76 @@ crc32_table:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x251c
+	.4byte	0x2532
 	.uleb128 0x19
-	.4byte	.LASF690
+	.4byte	.LASF692
 	.byte	0x40
 	.byte	0x2f
 	.2byte	0x272
-	.4byte	0x27a2
+	.4byte	0x27b8
 	.uleb128 0x1c
-	.4byte	.LASF691
+	.4byte	.LASF693
 	.byte	0x2f
 	.2byte	0x273
-	.4byte	0x27a2
+	.4byte	0x27b8
 	.byte	0
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x2759
-	.4byte	0x27b2
+	.4byte	0x276f
+	.4byte	0x27c8
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x3
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF692
+	.4byte	.LASF694
 	.byte	0x2f
 	.2byte	0x278
-	.4byte	0x1fb4
+	.4byte	0x1fca
 	.uleb128 0x5
-	.4byte	0x251c
-	.4byte	0x27ce
+	.4byte	0x2532
+	.4byte	0x27e4
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x2787
-	.4byte	0x27de
+	.4byte	0x279d
+	.4byte	0x27f4
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x24ba
+	.4byte	0x24d0
 	.uleb128 0x5
 	.4byte	0x52c
-	.4byte	0x27f4
+	.4byte	0x280a
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x20
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF693
+	.4byte	.LASF695
 	.byte	0x30
 	.byte	0x31
 	.byte	0x1e
-	.4byte	0x2849
+	.4byte	0x285f
 	.uleb128 0xc
-	.4byte	.LASF500
+	.4byte	.LASF502
 	.byte	0x31
 	.byte	0x1f
 	.4byte	0x52c
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF278
+	.4byte	.LASF280
 	.byte	0x31
 	.byte	0x20
 	.4byte	0x2d8
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF277
+	.4byte	.LASF279
 	.byte	0x31
 	.byte	0x21
 	.4byte	0x83d
@@ -6300,184 +6310,184 @@ crc32_table:
 	.string	"osq"
 	.byte	0x31
 	.byte	0x23
-	.4byte	0xf90
+	.4byte	0xfa6
 	.byte	0x1c
 	.uleb128 0xc
-	.4byte	.LASF276
+	.4byte	.LASF278
 	.byte	0x31
 	.byte	0x28
-	.4byte	0x1a5a
+	.4byte	0x1a70
 	.byte	0x20
 	.uleb128 0xc
-	.4byte	.LASF694
+	.4byte	.LASF696
 	.byte	0x31
 	.byte	0x31
 	.4byte	0x15c
 	.byte	0x28
 	.byte	0
 	.uleb128 0x11
-	.4byte	.LASF695
+	.4byte	.LASF697
 	.byte	0x32
 	.byte	0xa
-	.4byte	0x1a85
+	.4byte	0x1a9b
 	.uleb128 0xd
-	.4byte	.LASF696
+	.4byte	.LASF698
 	.byte	0x8
 	.byte	0x33
 	.byte	0x46
-	.4byte	0x286d
+	.4byte	0x2883
 	.uleb128 0xc
 	.4byte	.LASF49
 	.byte	0x33
 	.byte	0x47
-	.4byte	0x286d
+	.4byte	0x2883
 	.byte	0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2854
+	.4byte	0x286a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2879
+	.4byte	0x288f
 	.uleb128 0xe
-	.4byte	0x2884
+	.4byte	0x289a
 	.uleb128 0xf
 	.4byte	0x442
 	.byte	0
 	.uleb128 0x11
-	.4byte	.LASF697
+	.4byte	.LASF699
 	.byte	0x34
 	.byte	0x1e
 	.4byte	0x6c
 	.uleb128 0x5
 	.4byte	0x2d
-	.4byte	0x289f
+	.4byte	0x28b5
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x7
 	.byte	0
 	.uleb128 0x11
-	.4byte	.LASF698
+	.4byte	.LASF700
 	.byte	0x35
 	.byte	0x13
-	.4byte	0x288f
+	.4byte	0x28a5
 	.uleb128 0x11
-	.4byte	.LASF699
+	.4byte	.LASF701
 	.byte	0x36
 	.byte	0x26
 	.4byte	0xc0
 	.uleb128 0xe
-	.4byte	0x28c5
+	.4byte	0x28db
 	.uleb128 0xf
-	.4byte	0x28c5
+	.4byte	0x28db
 	.uleb128 0xf
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1cc6
+	.4byte	0x1cdc
 	.uleb128 0x11
-	.4byte	.LASF700
+	.4byte	.LASF702
 	.byte	0x36
 	.byte	0x48
-	.4byte	0x28d6
+	.4byte	0x28ec
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x28b5
+	.4byte	0x28cb
 	.uleb128 0xd
-	.4byte	.LASF701
+	.4byte	.LASF703
 	.byte	0x18
 	.byte	0x36
 	.byte	0x5b
-	.4byte	0x290d
+	.4byte	0x2923
 	.uleb128 0xc
-	.4byte	.LASF282
+	.4byte	.LASF284
 	.byte	0x36
 	.byte	0x5c
 	.4byte	0x442
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF702
+	.4byte	.LASF704
 	.byte	0x36
 	.byte	0x5d
-	.4byte	0x1a5a
+	.4byte	0x1a70
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF703
+	.4byte	.LASF705
 	.byte	0x36
 	.byte	0x5e
 	.4byte	0x15c
 	.byte	0x10
 	.byte	0
 	.uleb128 0x11
-	.4byte	.LASF701
+	.4byte	.LASF703
 	.byte	0x36
 	.byte	0x61
-	.4byte	0x28dc
+	.4byte	0x28f2
 	.uleb128 0x11
-	.4byte	.LASF704
+	.4byte	.LASF706
 	.byte	0x36
 	.byte	0x62
 	.4byte	0x15c
 	.uleb128 0x11
-	.4byte	.LASF705
+	.4byte	.LASF707
 	.byte	0x34
 	.byte	0x7c
 	.4byte	0x6c
 	.uleb128 0x11
-	.4byte	.LASF706
+	.4byte	.LASF708
 	.byte	0x34
 	.byte	0x80
 	.4byte	0xc0
 	.uleb128 0x33
 	.4byte	0x136
 	.uleb128 0x11
-	.4byte	.LASF707
+	.4byte	.LASF709
 	.byte	0x37
 	.byte	0x60
-	.4byte	0x2949
+	.4byte	0x295f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2939
+	.4byte	0x294f
 	.uleb128 0x11
-	.4byte	.LASF708
+	.4byte	.LASF710
 	.byte	0x38
 	.byte	0x22
 	.4byte	0x95d
 	.uleb128 0x24
-	.4byte	.LASF709
+	.4byte	.LASF711
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x38
 	.byte	0x29
-	.4byte	0x297d
+	.4byte	0x2993
 	.uleb128 0x1b
-	.4byte	.LASF710
+	.4byte	.LASF712
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF711
+	.4byte	.LASF713
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF712
+	.4byte	.LASF714
 	.byte	0x2
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF713
+	.4byte	.LASF715
 	.byte	0x48
 	.byte	0x38
 	.byte	0x31
-	.4byte	0x29f5
+	.4byte	0x2a0b
 	.uleb128 0xc
-	.4byte	.LASF714
+	.4byte	.LASF716
 	.byte	0x38
 	.byte	0x32
-	.4byte	0x295a
+	.4byte	0x2970
 	.byte	0
 	.uleb128 0x10
 	.string	"id"
 	.byte	0x38
 	.byte	0x33
-	.4byte	0x29fa
+	.4byte	0x2a10
 	.byte	0x8
 	.uleb128 0xc
 	.4byte	.LASF62
@@ -6486,140 +6496,140 @@ crc32_table:
 	.4byte	0x55
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF715
+	.4byte	.LASF717
 	.byte	0x38
 	.byte	0x35
-	.4byte	0x2a06
+	.4byte	0x2a1c
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF716
+	.4byte	.LASF718
 	.byte	0x38
 	.byte	0x36
-	.4byte	0x2a06
+	.4byte	0x2a1c
 	.byte	0x20
 	.uleb128 0xc
-	.4byte	.LASF717
+	.4byte	.LASF719
 	.byte	0x38
 	.byte	0x37
-	.4byte	0x2949
+	.4byte	0x295f
 	.byte	0x28
 	.uleb128 0xc
-	.4byte	.LASF718
+	.4byte	.LASF720
 	.byte	0x38
 	.byte	0x38
-	.4byte	0x2949
+	.4byte	0x295f
 	.byte	0x30
 	.uleb128 0xc
-	.4byte	.LASF719
+	.4byte	.LASF721
 	.byte	0x38
 	.byte	0x39
-	.4byte	0x2a2b
+	.4byte	0x2a41
 	.byte	0x38
 	.uleb128 0xc
-	.4byte	.LASF720
+	.4byte	.LASF722
 	.byte	0x38
 	.byte	0x3a
-	.4byte	0x2a2b
+	.4byte	0x2a41
 	.byte	0x40
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x297d
+	.4byte	0x2993
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2a00
+	.4byte	0x2a16
 	.uleb128 0x34
 	.uleb128 0x33
 	.4byte	0x120
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2a01
+	.4byte	0x2a17
 	.uleb128 0x14
 	.4byte	0xc0
-	.4byte	0x2a20
+	.4byte	0x2a36
 	.uleb128 0xf
 	.4byte	0x2d
 	.uleb128 0xf
-	.4byte	0x2a20
+	.4byte	0x2a36
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2a26
+	.4byte	0x2a3c
 	.uleb128 0x18
-	.4byte	.LASF721
+	.4byte	.LASF723
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2a0c
+	.4byte	0x2a22
 	.uleb128 0x11
-	.4byte	.LASF722
+	.4byte	.LASF724
 	.byte	0x38
 	.byte	0x3d
-	.4byte	0x2a3c
+	.4byte	0x2a52
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x29f5
+	.4byte	0x2a0b
 	.uleb128 0x11
-	.4byte	.LASF723
+	.4byte	.LASF725
 	.byte	0x39
 	.byte	0x8b
 	.4byte	0x2d
 	.uleb128 0x11
-	.4byte	.LASF724
+	.4byte	.LASF726
 	.byte	0x39
 	.byte	0x8c
 	.4byte	0x2d
 	.uleb128 0x11
-	.4byte	.LASF725
+	.4byte	.LASF727
 	.byte	0x3a
 	.byte	0x4e
 	.4byte	0x136
 	.uleb128 0x11
-	.4byte	.LASF726
+	.4byte	.LASF728
 	.byte	0x3a
 	.byte	0x4f
 	.4byte	0x39
 	.uleb128 0x11
-	.4byte	.LASF727
+	.4byte	.LASF729
 	.byte	0x3a
 	.byte	0xbc
 	.4byte	0x2d
 	.uleb128 0x8
-	.4byte	.LASF728
+	.4byte	.LASF730
 	.byte	0x3b
 	.byte	0x1c
 	.4byte	0x12b
 	.uleb128 0x11
-	.4byte	.LASF729
+	.4byte	.LASF731
 	.byte	0x3c
 	.byte	0xa
 	.4byte	0xc0
 	.uleb128 0x15
-	.4byte	.LASF730
+	.4byte	.LASF732
 	.byte	0x3c
 	.2byte	0x11e
 	.4byte	0xc0
 	.uleb128 0xd
-	.4byte	.LASF731
+	.4byte	.LASF733
 	.byte	0x38
 	.byte	0x3d
 	.byte	0xc
-	.4byte	0x2af0
+	.4byte	0x2b06
 	.uleb128 0xc
-	.4byte	.LASF732
+	.4byte	.LASF734
 	.byte	0x3d
 	.byte	0x11
 	.4byte	0x31c
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF473
+	.4byte	.LASF475
 	.byte	0x3d
 	.byte	0x12
 	.4byte	0x2d
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF733
+	.4byte	.LASF735
 	.byte	0x3d
 	.byte	0x13
-	.4byte	0x2b01
+	.4byte	0x2b17
 	.byte	0x18
 	.uleb128 0xc
 	.4byte	.LASF61
@@ -6641,51 +6651,51 @@ crc32_table:
 	.byte	0x30
 	.byte	0
 	.uleb128 0xe
-	.4byte	0x2afb
+	.4byte	0x2b11
 	.uleb128 0xf
-	.4byte	0x2afb
+	.4byte	0x2b11
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2a9b
+	.4byte	0x2ab1
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2af0
+	.4byte	0x2b06
 	.uleb128 0x11
-	.4byte	.LASF734
+	.4byte	.LASF736
 	.byte	0x3d
 	.byte	0xc3
 	.4byte	0x6c
 	.uleb128 0x8
-	.4byte	.LASF735
+	.4byte	.LASF737
 	.byte	0x3e
 	.byte	0x16
-	.4byte	0x2b1d
+	.4byte	0x2b33
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2b23
+	.4byte	0x2b39
 	.uleb128 0xe
-	.4byte	0x2b2e
+	.4byte	0x2b44
 	.uleb128 0xf
-	.4byte	0x2b2e
+	.4byte	0x2b44
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2b34
+	.4byte	0x2b4a
 	.uleb128 0xd
-	.4byte	.LASF736
+	.4byte	.LASF738
 	.byte	0x30
 	.byte	0x3e
 	.byte	0x67
-	.4byte	0x2b7d
+	.4byte	0x2b93
 	.uleb128 0xc
-	.4byte	.LASF737
+	.4byte	.LASF739
 	.byte	0x3e
 	.byte	0x68
 	.4byte	0x52c
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF732
+	.4byte	.LASF734
 	.byte	0x3e
 	.byte	0x69
 	.4byte	0x2d8
@@ -6694,7 +6704,7 @@ crc32_table:
 	.4byte	.LASF57
 	.byte	0x3e
 	.byte	0x6a
-	.4byte	0x2b12
+	.4byte	0x2b28
 	.byte	0x18
 	.uleb128 0xc
 	.4byte	.LASF66
@@ -6710,77 +6720,77 @@ crc32_table:
 	.byte	0x28
 	.byte	0
 	.uleb128 0x18
-	.4byte	.LASF738
+	.4byte	.LASF740
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2b7d
+	.4byte	0x2b93
 	.uleb128 0x15
-	.4byte	.LASF739
+	.4byte	.LASF741
 	.byte	0x3e
 	.2byte	0x187
-	.4byte	0x2b82
+	.4byte	0x2b98
 	.uleb128 0x15
-	.4byte	.LASF740
+	.4byte	.LASF742
 	.byte	0x3e
 	.2byte	0x188
-	.4byte	0x2b82
+	.4byte	0x2b98
 	.uleb128 0x15
-	.4byte	.LASF741
+	.4byte	.LASF743
 	.byte	0x3e
 	.2byte	0x189
-	.4byte	0x2b82
+	.4byte	0x2b98
 	.uleb128 0x15
-	.4byte	.LASF742
+	.4byte	.LASF744
 	.byte	0x3e
 	.2byte	0x18a
-	.4byte	0x2b82
+	.4byte	0x2b98
 	.uleb128 0x15
-	.4byte	.LASF743
+	.4byte	.LASF745
 	.byte	0x3e
 	.2byte	0x18b
-	.4byte	0x2b82
+	.4byte	0x2b98
 	.uleb128 0x15
-	.4byte	.LASF744
+	.4byte	.LASF746
 	.byte	0x3e
 	.2byte	0x18c
-	.4byte	0x2b82
+	.4byte	0x2b98
 	.uleb128 0x15
-	.4byte	.LASF745
+	.4byte	.LASF747
 	.byte	0x3e
 	.2byte	0x18d
-	.4byte	0x2b82
+	.4byte	0x2b98
 	.uleb128 0xd
-	.4byte	.LASF746
+	.4byte	.LASF748
 	.byte	0x20
 	.byte	0x3f
 	.byte	0x1a
-	.4byte	0x2c01
+	.4byte	0x2c17
 	.uleb128 0xc
-	.4byte	.LASF747
+	.4byte	.LASF749
 	.byte	0x3f
 	.byte	0x1b
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF748
+	.4byte	.LASF750
 	.byte	0x3f
 	.byte	0x1c
-	.4byte	0x1e92
+	.4byte	0x1ea8
 	.byte	0x8
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF749
+	.4byte	.LASF751
 	.byte	0x10
 	.byte	0x33
-	.4byte	0x2c0c
+	.4byte	0x2c22
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2c12
+	.4byte	0x2c28
 	.uleb128 0x14
 	.4byte	0xc0
-	.4byte	0x2c2b
+	.4byte	0x2c41
 	.uleb128 0xf
-	.4byte	0x2c2b
+	.4byte	0x2c41
 	.uleb128 0xf
 	.4byte	0x2d
 	.uleb128 0xf
@@ -6788,131 +6798,131 @@ crc32_table:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2c31
+	.4byte	0x2c47
 	.uleb128 0xd
-	.4byte	.LASF750
+	.4byte	.LASF752
 	.byte	0x18
 	.byte	0x10
 	.byte	0x36
-	.4byte	0x2c62
+	.4byte	0x2c78
 	.uleb128 0xc
-	.4byte	.LASF751
+	.4byte	.LASF753
 	.byte	0x10
 	.byte	0x37
-	.4byte	0x2c01
+	.4byte	0x2c17
 	.byte	0
 	.uleb128 0xc
 	.4byte	.LASF49
 	.byte	0x10
 	.byte	0x38
-	.4byte	0x2c2b
+	.4byte	0x2c41
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF752
+	.4byte	.LASF754
 	.byte	0x10
 	.byte	0x39
 	.4byte	0xc0
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF753
+	.4byte	.LASF755
 	.byte	0x38
 	.byte	0x10
 	.byte	0x41
-	.4byte	0x2c87
+	.4byte	0x2c9d
 	.uleb128 0xc
-	.4byte	.LASF754
+	.4byte	.LASF756
 	.byte	0x10
 	.byte	0x42
-	.4byte	0x27f4
+	.4byte	0x280a
 	.byte	0
 	.uleb128 0xc
 	.4byte	.LASF99
 	.byte	0x10
 	.byte	0x43
-	.4byte	0x2c2b
+	.4byte	0x2c41
 	.byte	0x30
 	.byte	0
 	.uleb128 0x11
-	.4byte	.LASF755
+	.4byte	.LASF757
 	.byte	0x10
 	.byte	0xee
-	.4byte	0x2c62
+	.4byte	0x2c78
 	.uleb128 0x15
-	.4byte	.LASF756
+	.4byte	.LASF758
 	.byte	0x2f
 	.2byte	0x368
 	.4byte	0xc0
 	.uleb128 0x5
 	.4byte	0xc0
-	.4byte	0x2cae
+	.4byte	0x2cc4
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x2
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF757
+	.4byte	.LASF759
 	.byte	0x2f
 	.2byte	0x394
-	.4byte	0x2c9e
+	.4byte	0x2cb4
 	.uleb128 0x15
-	.4byte	.LASF758
+	.4byte	.LASF760
 	.byte	0x2f
 	.2byte	0x3a0
 	.4byte	0x4d4
 	.uleb128 0x15
-	.4byte	.LASF759
+	.4byte	.LASF761
 	.byte	0x2f
 	.2byte	0x3a5
-	.4byte	0x2287
+	.4byte	0x229d
 	.uleb128 0x19
-	.4byte	.LASF760
+	.4byte	.LASF762
 	.byte	0x10
 	.byte	0x2f
 	.2byte	0x469
-	.4byte	0x2cfa
+	.4byte	0x2d10
 	.uleb128 0x1c
-	.4byte	.LASF761
+	.4byte	.LASF763
 	.byte	0x2f
 	.2byte	0x476
 	.4byte	0x2d
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF762
+	.4byte	.LASF764
 	.byte	0x2f
 	.2byte	0x479
-	.4byte	0x2cfa
+	.4byte	0x2d10
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x2d
 	.uleb128 0x15
-	.4byte	.LASF760
+	.4byte	.LASF762
 	.byte	0x2f
 	.2byte	0x493
-	.4byte	0x2d0c
+	.4byte	0x2d22
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2d12
+	.4byte	0x2d28
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2cd2
+	.4byte	0x2ce8
 	.uleb128 0x15
-	.4byte	.LASF763
+	.4byte	.LASF765
 	.byte	0x2f
 	.2byte	0x4ea
 	.4byte	0xc0
 	.uleb128 0x11
-	.4byte	.LASF764
+	.4byte	.LASF766
 	.byte	0x40
 	.byte	0x47
 	.4byte	0x442
 	.uleb128 0x11
-	.4byte	.LASF765
+	.4byte	.LASF767
 	.byte	0x40
 	.byte	0x48
-	.4byte	0x2d3a
+	.4byte	0x2d50
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x34
@@ -6920,122 +6930,122 @@ crc32_table:
 	.byte	0x8
 	.4byte	0x6c
 	.uleb128 0x24
-	.4byte	.LASF766
+	.4byte	.LASF768
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x40
 	.byte	0x5d
-	.4byte	0x2d6f
+	.4byte	0x2d85
 	.uleb128 0x1b
-	.4byte	.LASF767
+	.4byte	.LASF769
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF768
+	.4byte	.LASF770
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF769
+	.4byte	.LASF771
 	.byte	0x2
 	.uleb128 0x1b
-	.4byte	.LASF770
+	.4byte	.LASF772
 	.byte	0x3
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x5b
-	.4byte	0x2d7f
+	.4byte	0x2d95
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x2
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x2d6f
+	.4byte	0x2d85
 	.uleb128 0x11
-	.4byte	.LASF771
+	.4byte	.LASF773
 	.byte	0x40
 	.byte	0x64
-	.4byte	0x2d7f
+	.4byte	0x2d95
 	.uleb128 0x11
-	.4byte	.LASF772
+	.4byte	.LASF774
 	.byte	0x40
 	.byte	0x66
-	.4byte	0x2d46
+	.4byte	0x2d5c
 	.uleb128 0xd
-	.4byte	.LASF773
+	.4byte	.LASF775
 	.byte	0x28
 	.byte	0x41
 	.byte	0x7
-	.4byte	0x2dfb
+	.4byte	0x2e11
 	.uleb128 0xc
-	.4byte	.LASF774
+	.4byte	.LASF776
 	.byte	0x41
 	.byte	0x8
 	.4byte	0xc0
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF775
+	.4byte	.LASF777
 	.byte	0x41
 	.byte	0x9
 	.4byte	0xc0
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF776
+	.4byte	.LASF778
 	.byte	0x41
 	.byte	0xa
 	.4byte	0xc0
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF777
+	.4byte	.LASF779
 	.byte	0x41
 	.byte	0xb
 	.4byte	0xc0
 	.byte	0xc
 	.uleb128 0xc
-	.4byte	.LASF778
+	.4byte	.LASF780
 	.byte	0x41
 	.byte	0xc
-	.4byte	0x1ccb
+	.4byte	0x1ce1
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF779
+	.4byte	.LASF781
 	.byte	0x41
 	.byte	0xd
-	.4byte	0x1ccb
+	.4byte	0x1ce1
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF780
+	.4byte	.LASF782
 	.byte	0x41
 	.byte	0xe
-	.4byte	0x1ccb
+	.4byte	0x1ce1
 	.byte	0x20
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x2d9a
-	.4byte	0x2e0b
+	.4byte	0x2db0
+	.4byte	0x2e21
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x7
 	.byte	0
 	.uleb128 0x11
-	.4byte	.LASF773
+	.4byte	.LASF775
 	.byte	0x41
 	.byte	0x11
-	.4byte	0x2dfb
+	.4byte	0x2e11
 	.uleb128 0x11
-	.4byte	.LASF781
+	.4byte	.LASF783
 	.byte	0x42
 	.byte	0x11
 	.4byte	0x2d
 	.uleb128 0x11
-	.4byte	.LASF782
+	.4byte	.LASF784
 	.byte	0x42
 	.byte	0x1c
 	.4byte	0x2d
 	.uleb128 0x11
-	.4byte	.LASF783
+	.4byte	.LASF785
 	.byte	0x42
 	.byte	0x24
 	.4byte	0x2d
 	.uleb128 0x15
-	.4byte	.LASF784
+	.4byte	.LASF786
 	.byte	0x43
 	.2byte	0x259
 	.4byte	0x277
@@ -7044,139 +7054,139 @@ crc32_table:
 	.byte	0x18
 	.byte	0x44
 	.byte	0x13
-	.4byte	0x2e74
+	.4byte	0x2e8a
 	.uleb128 0xc
-	.4byte	.LASF785
+	.4byte	.LASF787
 	.byte	0x44
 	.byte	0x14
-	.4byte	0x1dfa
+	.4byte	0x1e10
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF786
+	.4byte	.LASF788
 	.byte	0x44
 	.byte	0x15
 	.4byte	0x6c
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF787
+	.4byte	.LASF789
 	.byte	0x44
 	.byte	0x16
 	.4byte	0x6c
 	.byte	0x14
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF788
+	.4byte	.LASF790
 	.byte	0x80
 	.byte	0x44
 	.byte	0xe0
-	.4byte	0x2e8d
+	.4byte	0x2ea3
 	.uleb128 0xc
-	.4byte	.LASF789
+	.4byte	.LASF791
 	.byte	0x44
 	.byte	0xe1
 	.4byte	0x141
 	.byte	0
 	.byte	0
 	.uleb128 0x11
-	.4byte	.LASF788
+	.4byte	.LASF790
 	.byte	0x44
 	.byte	0xe4
-	.4byte	0x2e98
+	.4byte	0x2eae
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2e74
+	.4byte	0x2e8a
 	.uleb128 0xd
-	.4byte	.LASF790
+	.4byte	.LASF792
 	.byte	0x18
 	.byte	0x45
 	.byte	0x24
-	.4byte	0x2ecf
+	.4byte	0x2ee5
 	.uleb128 0xc
-	.4byte	.LASF791
+	.4byte	.LASF793
 	.byte	0x45
 	.byte	0x25
 	.4byte	0x2d
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF792
+	.4byte	.LASF794
 	.byte	0x45
 	.byte	0x26
-	.4byte	0x2ecf
+	.4byte	0x2ee5
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF793
+	.4byte	.LASF795
 	.byte	0x45
 	.byte	0x27
-	.4byte	0x2ecf
+	.4byte	0x2ee5
 	.byte	0x10
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2e9e
+	.4byte	0x2eb4
 	.uleb128 0xd
-	.4byte	.LASF794
+	.4byte	.LASF796
 	.byte	0x8
 	.byte	0x45
 	.byte	0x2b
-	.4byte	0x2eee
+	.4byte	0x2f04
 	.uleb128 0xc
-	.4byte	.LASF790
+	.4byte	.LASF792
 	.byte	0x45
 	.byte	0x2c
-	.4byte	0x2ecf
+	.4byte	0x2ee5
 	.byte	0
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF795
+	.4byte	.LASF797
 	.byte	0x10
 	.byte	0x45
 	.byte	0x39
-	.4byte	0x2f13
+	.4byte	0x2f29
 	.uleb128 0xc
-	.4byte	.LASF794
+	.4byte	.LASF796
 	.byte	0x45
 	.byte	0x3a
-	.4byte	0x2ed5
+	.4byte	0x2eeb
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF796
+	.4byte	.LASF798
 	.byte	0x45
 	.byte	0x3b
-	.4byte	0x2ecf
+	.4byte	0x2ee5
 	.byte	0x8
 	.byte	0
 	.uleb128 0x11
-	.4byte	.LASF797
+	.4byte	.LASF799
 	.byte	0x46
 	.byte	0x23
 	.4byte	0xc0
 	.uleb128 0x11
-	.4byte	.LASF798
+	.4byte	.LASF800
 	.byte	0x46
 	.byte	0x24
 	.4byte	0xc0
 	.uleb128 0x11
-	.4byte	.LASF799
+	.4byte	.LASF801
 	.byte	0x46
 	.byte	0x52
 	.4byte	0xc0
 	.uleb128 0x11
-	.4byte	.LASF800
+	.4byte	.LASF802
 	.byte	0x46
 	.byte	0x53
 	.4byte	0xc0
 	.uleb128 0x18
-	.4byte	.LASF801
+	.4byte	.LASF803
 	.uleb128 0x11
-	.4byte	.LASF802
+	.4byte	.LASF804
 	.byte	0x47
 	.byte	0x13
-	.4byte	0x2f3f
+	.4byte	0x2f55
 	.uleb128 0xb
 	.byte	0x4
 	.byte	0x47
 	.byte	0x15
-	.4byte	0x2f64
+	.4byte	0x2f7a
 	.uleb128 0x10
 	.string	"val"
 	.byte	0x47
@@ -7185,15 +7195,15 @@ crc32_table:
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF803
+	.4byte	.LASF805
 	.byte	0x47
 	.byte	0x17
-	.4byte	0x2f4f
+	.4byte	0x2f65
 	.uleb128 0xb
 	.byte	0x4
 	.byte	0x47
 	.byte	0x1a
-	.4byte	0x2f84
+	.4byte	0x2f9a
 	.uleb128 0x10
 	.string	"val"
 	.byte	0x47
@@ -7202,46 +7212,46 @@ crc32_table:
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF804
+	.4byte	.LASF806
 	.byte	0x47
 	.byte	0x1c
-	.4byte	0x2f6f
+	.4byte	0x2f85
 	.uleb128 0xd
-	.4byte	.LASF805
+	.4byte	.LASF807
 	.byte	0x18
 	.byte	0x48
 	.byte	0x54
-	.4byte	0x2fc0
+	.4byte	0x2fd6
 	.uleb128 0xc
-	.4byte	.LASF806
+	.4byte	.LASF808
 	.byte	0x48
 	.byte	0x55
 	.4byte	0x2d
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF345
+	.4byte	.LASF347
 	.byte	0x48
 	.byte	0x57
-	.4byte	0x2ed5
+	.4byte	0x2eeb
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF502
+	.4byte	.LASF504
 	.byte	0x48
 	.byte	0x5d
-	.4byte	0x302c
+	.4byte	0x3042
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF807
+	.4byte	.LASF809
 	.byte	0x60
 	.byte	0x48
 	.byte	0xbd
-	.4byte	0x302c
+	.4byte	0x3042
 	.uleb128 0x10
 	.string	"kn"
 	.byte	0x48
 	.byte	0xbf
-	.4byte	0x30eb
+	.4byte	0x3101
 	.byte	0
 	.uleb128 0xc
 	.4byte	.LASF61
@@ -7250,72 +7260,72 @@ crc32_table:
 	.4byte	0x6c
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF808
+	.4byte	.LASF810
 	.byte	0x48
 	.byte	0xc3
-	.4byte	0x2e43
+	.4byte	0x2e59
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF809
+	.4byte	.LASF811
 	.byte	0x48
 	.byte	0xc4
 	.4byte	0x120
 	.byte	0x28
 	.uleb128 0xc
-	.4byte	.LASF810
+	.4byte	.LASF812
 	.byte	0x48
 	.byte	0xc5
 	.4byte	0x120
 	.byte	0x2c
 	.uleb128 0xc
-	.4byte	.LASF811
+	.4byte	.LASF813
 	.byte	0x48
 	.byte	0xc6
-	.4byte	0x33b3
+	.4byte	0x33c9
 	.byte	0x30
 	.uleb128 0xc
-	.4byte	.LASF812
+	.4byte	.LASF814
 	.byte	0x48
 	.byte	0xc9
 	.4byte	0x2d8
 	.byte	0x38
 	.uleb128 0xc
-	.4byte	.LASF813
+	.4byte	.LASF815
 	.byte	0x48
 	.byte	0xcb
-	.4byte	0x1e92
+	.4byte	0x1ea8
 	.byte	0x48
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2fc0
+	.4byte	0x2fd6
 	.uleb128 0xd
-	.4byte	.LASF814
+	.4byte	.LASF816
 	.byte	0x8
 	.byte	0x48
 	.byte	0x60
-	.4byte	0x304b
+	.4byte	0x3061
 	.uleb128 0xc
-	.4byte	.LASF815
+	.4byte	.LASF817
 	.byte	0x48
 	.byte	0x61
-	.4byte	0x30eb
+	.4byte	0x3101
 	.byte	0
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF816
+	.4byte	.LASF818
 	.byte	0x80
 	.byte	0x48
 	.byte	0x83
-	.4byte	0x30eb
+	.4byte	0x3101
 	.uleb128 0xc
-	.4byte	.LASF500
+	.4byte	.LASF502
 	.byte	0x48
 	.byte	0x84
 	.4byte	0x2ad
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF817
+	.4byte	.LASF819
 	.byte	0x48
 	.byte	0x85
 	.4byte	0x2ad
@@ -7324,7 +7334,7 @@ crc32_table:
 	.4byte	.LASF63
 	.byte	0x48
 	.byte	0x8f
-	.4byte	0x30eb
+	.4byte	0x3101
 	.byte	0x8
 	.uleb128 0xc
 	.4byte	.LASF60
@@ -7336,25 +7346,25 @@ crc32_table:
 	.string	"rb"
 	.byte	0x48
 	.byte	0x92
-	.4byte	0x2e9e
+	.4byte	0x2eb4
 	.byte	0x18
 	.uleb128 0x10
 	.string	"ns"
 	.byte	0x48
 	.byte	0x94
-	.4byte	0x29fa
+	.4byte	0x2a10
 	.byte	0x30
 	.uleb128 0xc
-	.4byte	.LASF818
+	.4byte	.LASF820
 	.byte	0x48
 	.byte	0x95
 	.4byte	0x6c
 	.byte	0x38
 	.uleb128 0x20
-	.4byte	0x323d
+	.4byte	0x3253
 	.byte	0x40
 	.uleb128 0xc
-	.4byte	.LASF819
+	.4byte	.LASF821
 	.byte	0x48
 	.byte	0x9c
 	.4byte	0x442
@@ -7363,7 +7373,7 @@ crc32_table:
 	.string	"id"
 	.byte	0x48
 	.byte	0x9e
-	.4byte	0x3221
+	.4byte	0x3237
 	.byte	0x68
 	.uleb128 0xc
 	.4byte	.LASF61
@@ -7372,129 +7382,129 @@ crc32_table:
 	.4byte	0xae
 	.byte	0x70
 	.uleb128 0xc
-	.4byte	.LASF820
+	.4byte	.LASF822
 	.byte	0x48
 	.byte	0xa0
 	.4byte	0x20d
 	.byte	0x72
 	.uleb128 0xc
-	.4byte	.LASF821
+	.4byte	.LASF823
 	.byte	0x48
 	.byte	0xa1
-	.4byte	0x326c
+	.4byte	0x3282
 	.byte	0x78
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x304b
+	.4byte	0x3061
 	.uleb128 0xd
-	.4byte	.LASF822
+	.4byte	.LASF824
 	.byte	0x20
 	.byte	0x48
 	.byte	0x64
-	.4byte	0x312e
+	.4byte	0x3144
 	.uleb128 0x10
 	.string	"ops"
 	.byte	0x48
 	.byte	0x65
-	.4byte	0x31ef
+	.4byte	0x3205
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF823
+	.4byte	.LASF825
 	.byte	0x48
 	.byte	0x66
-	.4byte	0x31fa
+	.4byte	0x3210
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF824
+	.4byte	.LASF826
 	.byte	0x48
 	.byte	0x67
 	.4byte	0x256
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF825
+	.4byte	.LASF827
 	.byte	0x48
 	.byte	0x68
-	.4byte	0x30eb
+	.4byte	0x3101
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF826
+	.4byte	.LASF828
 	.byte	0x70
 	.byte	0x48
 	.byte	0xe2
-	.4byte	0x31ea
+	.4byte	0x3200
 	.uleb128 0xc
-	.4byte	.LASF823
+	.4byte	.LASF825
 	.byte	0x48
 	.byte	0xe7
-	.4byte	0x3497
+	.4byte	0x34ad
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF827
+	.4byte	.LASF829
 	.byte	0x48
 	.byte	0xe8
-	.4byte	0x34a8
+	.4byte	0x34be
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF828
+	.4byte	.LASF830
 	.byte	0x48
 	.byte	0xf5
-	.4byte	0x34c2
+	.4byte	0x34d8
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF829
+	.4byte	.LASF831
 	.byte	0x48
 	.byte	0xf7
-	.4byte	0x34e2
+	.4byte	0x34f8
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF830
+	.4byte	.LASF832
 	.byte	0x48
 	.byte	0xf8
-	.4byte	0x3501
+	.4byte	0x3517
 	.byte	0x20
 	.uleb128 0xc
-	.4byte	.LASF831
+	.4byte	.LASF833
 	.byte	0x48
 	.byte	0xf9
-	.4byte	0x3517
+	.4byte	0x352d
 	.byte	0x28
 	.uleb128 0xc
-	.4byte	.LASF832
+	.4byte	.LASF834
 	.byte	0x48
 	.byte	0xfb
-	.4byte	0x353b
+	.4byte	0x3551
 	.byte	0x30
 	.uleb128 0x1c
-	.4byte	.LASF833
+	.4byte	.LASF835
 	.byte	0x48
 	.2byte	0x105
 	.4byte	0x261
 	.byte	0x38
 	.uleb128 0x1c
-	.4byte	.LASF834
+	.4byte	.LASF836
 	.byte	0x48
 	.2byte	0x10c
 	.4byte	0x22e
 	.byte	0x40
 	.uleb128 0x1c
-	.4byte	.LASF835
+	.4byte	.LASF837
 	.byte	0x48
 	.2byte	0x10d
-	.4byte	0x353b
+	.4byte	0x3551
 	.byte	0x48
 	.uleb128 0x1c
-	.4byte	.LASF480
+	.4byte	.LASF482
 	.byte	0x48
 	.2byte	0x110
-	.4byte	0x3560
+	.4byte	0x3576
 	.byte	0x50
 	.uleb128 0x1c
-	.4byte	.LASF836
+	.4byte	.LASF838
 	.byte	0x48
 	.2byte	0x113
-	.4byte	0x3585
+	.4byte	0x359b
 	.byte	0x58
 	.uleb128 0x1c
 	.4byte	.LASF66
@@ -7510,20 +7520,20 @@ crc32_table:
 	.byte	0x68
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x312e
+	.4byte	0x3144
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x31ea
+	.4byte	0x3200
 	.uleb128 0x18
-	.4byte	.LASF837
+	.4byte	.LASF839
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x31f5
+	.4byte	0x320b
 	.uleb128 0xb
 	.byte	0x8
 	.byte	0x48
 	.byte	0x6d
-	.4byte	0x3221
+	.4byte	0x3237
 	.uleb128 0x10
 	.string	"ino"
 	.byte	0x48
@@ -7531,20 +7541,20 @@ crc32_table:
 	.4byte	0x120
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF838
+	.4byte	.LASF840
 	.byte	0x48
 	.byte	0x75
 	.4byte	0x120
 	.byte	0x4
 	.byte	0
 	.uleb128 0x36
-	.4byte	.LASF942
+	.4byte	.LASF944
 	.byte	0x8
 	.byte	0x48
 	.byte	0x6c
-	.4byte	0x323d
+	.4byte	0x3253
 	.uleb128 0x1f
-	.4byte	0x3200
+	.4byte	0x3216
 	.uleb128 0x1e
 	.string	"id"
 	.byte	0x48
@@ -7555,69 +7565,69 @@ crc32_table:
 	.byte	0x20
 	.byte	0x48
 	.byte	0x96
-	.4byte	0x3267
+	.4byte	0x327d
 	.uleb128 0x1e
 	.string	"dir"
 	.byte	0x48
 	.byte	0x97
-	.4byte	0x2f8f
+	.4byte	0x2fa5
 	.uleb128 0x22
-	.4byte	.LASF839
+	.4byte	.LASF841
 	.byte	0x48
 	.byte	0x98
-	.4byte	0x3032
+	.4byte	0x3048
 	.uleb128 0x22
-	.4byte	.LASF840
+	.4byte	.LASF842
 	.byte	0x48
 	.byte	0x99
-	.4byte	0x30f1
+	.4byte	0x3107
 	.byte	0
 	.uleb128 0x18
-	.4byte	.LASF841
+	.4byte	.LASF843
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3267
+	.4byte	0x327d
 	.uleb128 0xd
-	.4byte	.LASF842
+	.4byte	.LASF844
 	.byte	0x50
 	.byte	0x48
 	.byte	0xab
-	.4byte	0x32f7
+	.4byte	0x330d
 	.uleb128 0xc
-	.4byte	.LASF843
+	.4byte	.LASF845
 	.byte	0x48
 	.byte	0xac
-	.4byte	0x3316
+	.4byte	0x332c
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF844
+	.4byte	.LASF846
 	.byte	0x48
 	.byte	0xad
-	.4byte	0x333b
+	.4byte	0x3351
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF845
+	.4byte	.LASF847
 	.byte	0x48
 	.byte	0xaf
-	.4byte	0x335a
+	.4byte	0x3370
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF846
+	.4byte	.LASF848
 	.byte	0x48
 	.byte	0xb1
-	.4byte	0x336f
+	.4byte	0x3385
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF847
+	.4byte	.LASF849
 	.byte	0x48
 	.byte	0xb2
-	.4byte	0x338e
+	.4byte	0x33a4
 	.byte	0x20
 	.uleb128 0xc
-	.4byte	.LASF848
+	.4byte	.LASF850
 	.byte	0x48
 	.byte	0xb4
-	.4byte	0x33ad
+	.4byte	0x33c3
 	.byte	0x28
 	.uleb128 0xc
 	.4byte	.LASF66
@@ -7646,11 +7656,11 @@ crc32_table:
 	.byte	0
 	.uleb128 0x14
 	.4byte	0xc0
-	.4byte	0x3310
+	.4byte	0x3326
 	.uleb128 0xf
-	.4byte	0x302c
+	.4byte	0x3042
 	.uleb128 0xf
-	.4byte	0x3310
+	.4byte	0x3326
 	.uleb128 0xf
 	.4byte	0x1e1
 	.byte	0
@@ -7659,28 +7669,28 @@ crc32_table:
 	.4byte	0xc0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x32f7
+	.4byte	0x330d
 	.uleb128 0x14
 	.4byte	0xc0
-	.4byte	0x3330
+	.4byte	0x3346
 	.uleb128 0xf
-	.4byte	0x3330
+	.4byte	0x3346
 	.uleb128 0xf
-	.4byte	0x302c
+	.4byte	0x3042
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3336
+	.4byte	0x334c
 	.uleb128 0x18
-	.4byte	.LASF849
+	.4byte	.LASF851
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x331c
+	.4byte	0x3332
 	.uleb128 0x14
 	.4byte	0xc0
-	.4byte	0x335a
+	.4byte	0x3370
 	.uleb128 0xf
-	.4byte	0x30eb
+	.4byte	0x3101
 	.uleb128 0xf
 	.4byte	0x55
 	.uleb128 0xf
@@ -7688,113 +7698,113 @@ crc32_table:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3341
+	.4byte	0x3357
 	.uleb128 0x14
 	.4byte	0xc0
-	.4byte	0x336f
+	.4byte	0x3385
 	.uleb128 0xf
-	.4byte	0x30eb
+	.4byte	0x3101
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3360
+	.4byte	0x3376
 	.uleb128 0x14
 	.4byte	0xc0
-	.4byte	0x338e
+	.4byte	0x33a4
 	.uleb128 0xf
-	.4byte	0x30eb
+	.4byte	0x3101
 	.uleb128 0xf
-	.4byte	0x30eb
+	.4byte	0x3101
 	.uleb128 0xf
 	.4byte	0x55
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3375
+	.4byte	0x338b
 	.uleb128 0x14
 	.4byte	0xc0
-	.4byte	0x33ad
+	.4byte	0x33c3
 	.uleb128 0xf
-	.4byte	0x3330
+	.4byte	0x3346
 	.uleb128 0xf
-	.4byte	0x30eb
+	.4byte	0x3101
 	.uleb128 0xf
-	.4byte	0x302c
+	.4byte	0x3042
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3394
+	.4byte	0x33aa
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3272
+	.4byte	0x3288
 	.uleb128 0xd
-	.4byte	.LASF850
+	.4byte	.LASF852
 	.byte	0x98
 	.byte	0x48
 	.byte	0xce
-	.4byte	0x3467
+	.4byte	0x347d
 	.uleb128 0x10
 	.string	"kn"
 	.byte	0x48
 	.byte	0xd0
-	.4byte	0x30eb
+	.4byte	0x3101
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF851
+	.4byte	.LASF853
 	.byte	0x48
 	.byte	0xd1
-	.4byte	0x346c
+	.4byte	0x3482
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF849
+	.4byte	.LASF851
 	.byte	0x48
 	.byte	0xd2
-	.4byte	0x3330
+	.4byte	0x3346
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF819
+	.4byte	.LASF821
 	.byte	0x48
 	.byte	0xd3
 	.4byte	0x442
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF275
+	.4byte	.LASF277
 	.byte	0x48
 	.byte	0xd6
-	.4byte	0xfbf
+	.4byte	0xfd5
 	.byte	0x20
 	.uleb128 0xc
-	.4byte	.LASF852
+	.4byte	.LASF854
 	.byte	0x48
 	.byte	0xd7
-	.4byte	0xfbf
+	.4byte	0xfd5
 	.byte	0x40
 	.uleb128 0xc
-	.4byte	.LASF853
+	.4byte	.LASF855
 	.byte	0x48
 	.byte	0xd8
 	.4byte	0xc0
 	.byte	0x60
 	.uleb128 0xc
-	.4byte	.LASF854
+	.4byte	.LASF856
 	.byte	0x48
 	.byte	0xd9
 	.4byte	0x2d8
 	.byte	0x68
 	.uleb128 0xc
-	.4byte	.LASF855
+	.4byte	.LASF857
 	.byte	0x48
 	.byte	0xda
 	.4byte	0x1e1
 	.byte	0x78
 	.uleb128 0xc
-	.4byte	.LASF833
+	.4byte	.LASF835
 	.byte	0x48
 	.byte	0xdc
 	.4byte	0x261
 	.byte	0x80
 	.uleb128 0x37
-	.4byte	.LASF856
+	.4byte	.LASF858
 	.byte	0x48
 	.byte	0xdd
 	.4byte	0x22e
@@ -7803,7 +7813,7 @@ crc32_table:
 	.byte	0x7
 	.byte	0x88
 	.uleb128 0x37
-	.4byte	.LASF857
+	.4byte	.LASF859
 	.byte	0x48
 	.byte	0xde
 	.4byte	0x22e
@@ -7812,97 +7822,97 @@ crc32_table:
 	.byte	0x6
 	.byte	0x88
 	.uleb128 0xc
-	.4byte	.LASF858
+	.4byte	.LASF860
 	.byte	0x48
 	.byte	0xdf
-	.4byte	0x347c
+	.4byte	0x3492
 	.byte	0x90
 	.byte	0
 	.uleb128 0x18
-	.4byte	.LASF851
+	.4byte	.LASF853
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3467
+	.4byte	0x347d
 	.uleb128 0x18
-	.4byte	.LASF859
+	.4byte	.LASF861
 	.uleb128 0x3
-	.4byte	0x3472
+	.4byte	0x3488
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3477
+	.4byte	0x348d
 	.uleb128 0x14
 	.4byte	0xc0
-	.4byte	0x3491
+	.4byte	0x34a7
 	.uleb128 0xf
-	.4byte	0x3491
+	.4byte	0x34a7
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x33b9
+	.4byte	0x33cf
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3482
+	.4byte	0x3498
 	.uleb128 0xe
-	.4byte	0x34a8
+	.4byte	0x34be
 	.uleb128 0xf
-	.4byte	0x3491
+	.4byte	0x34a7
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x349d
+	.4byte	0x34b3
 	.uleb128 0x14
 	.4byte	0xc0
-	.4byte	0x34c2
+	.4byte	0x34d8
 	.uleb128 0xf
-	.4byte	0x3330
+	.4byte	0x3346
 	.uleb128 0xf
 	.4byte	0x442
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x34ae
+	.4byte	0x34c4
 	.uleb128 0x14
 	.4byte	0x442
-	.4byte	0x34dc
+	.4byte	0x34f2
 	.uleb128 0xf
-	.4byte	0x3330
+	.4byte	0x3346
 	.uleb128 0xf
-	.4byte	0x34dc
+	.4byte	0x34f2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x256
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x34c8
+	.4byte	0x34de
 	.uleb128 0x14
 	.4byte	0x442
-	.4byte	0x3501
+	.4byte	0x3517
 	.uleb128 0xf
-	.4byte	0x3330
+	.4byte	0x3346
 	.uleb128 0xf
 	.4byte	0x442
 	.uleb128 0xf
-	.4byte	0x34dc
+	.4byte	0x34f2
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x34e8
+	.4byte	0x34fe
 	.uleb128 0xe
-	.4byte	0x3517
+	.4byte	0x352d
 	.uleb128 0xf
-	.4byte	0x3330
+	.4byte	0x3346
 	.uleb128 0xf
 	.4byte	0x442
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3507
+	.4byte	0x351d
 	.uleb128 0x14
 	.4byte	0x26c
-	.4byte	0x353b
+	.4byte	0x3551
 	.uleb128 0xf
-	.4byte	0x3491
+	.4byte	0x34a7
 	.uleb128 0xf
 	.4byte	0x1e1
 	.uleb128 0xf
@@ -7912,164 +7922,164 @@ crc32_table:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x351d
+	.4byte	0x3533
 	.uleb128 0x14
 	.4byte	0x1ec
-	.4byte	0x3555
+	.4byte	0x356b
 	.uleb128 0xf
-	.4byte	0x3491
+	.4byte	0x34a7
 	.uleb128 0xf
-	.4byte	0x3555
+	.4byte	0x356b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x355b
+	.4byte	0x3571
 	.uleb128 0x18
-	.4byte	.LASF860
+	.4byte	.LASF862
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3541
+	.4byte	0x3557
 	.uleb128 0x14
 	.4byte	0xc0
-	.4byte	0x357a
+	.4byte	0x3590
 	.uleb128 0xf
-	.4byte	0x3491
+	.4byte	0x34a7
 	.uleb128 0xf
-	.4byte	0x357a
+	.4byte	0x3590
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3580
+	.4byte	0x3596
 	.uleb128 0x18
-	.4byte	.LASF861
+	.4byte	.LASF863
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3566
+	.4byte	0x357c
 	.uleb128 0x24
-	.4byte	.LASF862
+	.4byte	.LASF864
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x49
 	.byte	0x1a
-	.4byte	0x35ae
+	.4byte	0x35c4
 	.uleb128 0x1b
-	.4byte	.LASF863
+	.4byte	.LASF865
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF864
+	.4byte	.LASF866
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF865
+	.4byte	.LASF867
 	.byte	0x2
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF866
+	.4byte	.LASF868
 	.byte	0x30
 	.byte	0x49
 	.byte	0x27
-	.4byte	0x3603
+	.4byte	0x3619
 	.uleb128 0xc
 	.4byte	.LASF148
 	.byte	0x49
 	.byte	0x28
-	.4byte	0x358b
+	.4byte	0x35a1
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF867
+	.4byte	.LASF869
 	.byte	0x49
 	.byte	0x29
-	.4byte	0x360d
+	.4byte	0x3623
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF868
+	.4byte	.LASF870
 	.byte	0x49
 	.byte	0x2a
-	.4byte	0x3618
+	.4byte	0x362e
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF869
+	.4byte	.LASF871
 	.byte	0x49
 	.byte	0x2b
-	.4byte	0x3638
+	.4byte	0x364e
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF870
+	.4byte	.LASF872
 	.byte	0x49
 	.byte	0x2c
-	.4byte	0x3643
+	.4byte	0x3659
 	.byte	0x20
 	.uleb128 0xc
-	.4byte	.LASF871
+	.4byte	.LASF873
 	.byte	0x49
 	.byte	0x2d
-	.4byte	0x2873
+	.4byte	0x2889
 	.byte	0x28
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x35ae
+	.4byte	0x35c4
 	.uleb128 0x33
 	.4byte	0x22e
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3608
+	.4byte	0x361e
 	.uleb128 0x33
 	.4byte	0x442
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3613
+	.4byte	0x3629
 	.uleb128 0x14
-	.4byte	0x29fa
-	.4byte	0x362d
+	.4byte	0x2a10
+	.4byte	0x3643
 	.uleb128 0xf
-	.4byte	0x362d
+	.4byte	0x3643
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3633
+	.4byte	0x3649
 	.uleb128 0x18
-	.4byte	.LASF872
+	.4byte	.LASF874
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x361e
+	.4byte	0x3634
 	.uleb128 0x33
-	.4byte	0x29fa
+	.4byte	0x2a10
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x363e
+	.4byte	0x3654
 	.uleb128 0x8
-	.4byte	.LASF873
+	.4byte	.LASF875
 	.byte	0x25
 	.byte	0x8
 	.4byte	0x115
 	.uleb128 0x24
-	.4byte	.LASF874
+	.4byte	.LASF876
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x4a
 	.byte	0x8
-	.4byte	0x3683
+	.4byte	0x3699
 	.uleb128 0x1b
-	.4byte	.LASF875
+	.4byte	.LASF877
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF876
+	.4byte	.LASF878
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF877
+	.4byte	.LASF879
 	.byte	0x2
 	.uleb128 0x1b
-	.4byte	.LASF878
+	.4byte	.LASF880
 	.byte	0x3
 	.uleb128 0x1b
-	.4byte	.LASF879
+	.4byte	.LASF881
 	.byte	0x4
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF880
+	.4byte	.LASF882
 	.byte	0x10
 	.byte	0x4a
 	.byte	0x35
-	.4byte	0x36a6
+	.4byte	0x36bc
 	.uleb128 0x10
 	.string	"nr"
 	.byte	0x4a
@@ -8080,43 +8090,43 @@ crc32_table:
 	.string	"ns"
 	.byte	0x4a
 	.byte	0x37
-	.4byte	0x36ab
+	.4byte	0x36c1
 	.byte	0x8
 	.byte	0
 	.uleb128 0x18
-	.4byte	.LASF881
+	.4byte	.LASF883
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x36a6
+	.4byte	0x36bc
 	.uleb128 0x35
 	.string	"pid"
 	.byte	0x60
 	.byte	0x4a
 	.byte	0x3a
-	.4byte	0x3706
+	.4byte	0x371c
 	.uleb128 0xc
-	.4byte	.LASF500
+	.4byte	.LASF502
 	.byte	0x4a
 	.byte	0x3c
 	.4byte	0x2ad
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF882
+	.4byte	.LASF884
 	.byte	0x4a
 	.byte	0x3d
 	.4byte	0x6c
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF317
+	.4byte	.LASF319
 	.byte	0x4a
 	.byte	0x3f
-	.4byte	0x3706
+	.4byte	0x371c
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF883
+	.4byte	.LASF885
 	.byte	0x4a
 	.byte	0x41
-	.4byte	0x1e92
+	.4byte	0x1ea8
 	.byte	0x28
 	.uleb128 0x10
 	.string	"rcu"
@@ -8125,183 +8135,183 @@ crc32_table:
 	.4byte	0x34d
 	.byte	0x40
 	.uleb128 0xc
-	.4byte	.LASF884
+	.4byte	.LASF886
 	.byte	0x4a
 	.byte	0x43
-	.4byte	0x3716
+	.4byte	0x372c
 	.byte	0x50
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x303
-	.4byte	0x3716
+	.4byte	0x372c
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x3
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x3683
-	.4byte	0x3726
+	.4byte	0x3699
+	.4byte	0x373c
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0
 	.byte	0
 	.uleb128 0x11
-	.4byte	.LASF885
+	.4byte	.LASF887
 	.byte	0x4a
 	.byte	0x46
-	.4byte	0x36b1
+	.4byte	0x36c7
 	.uleb128 0x11
-	.4byte	.LASF886
+	.4byte	.LASF888
 	.byte	0x4a
 	.byte	0x48
 	.4byte	0x5bb
 	.uleb128 0x11
-	.4byte	.LASF887
+	.4byte	.LASF889
 	.byte	0x4a
 	.byte	0x62
-	.4byte	0x36a6
+	.4byte	0x36bc
 	.uleb128 0xd
-	.4byte	.LASF888
+	.4byte	.LASF890
 	.byte	0x4
 	.byte	0x4b
 	.byte	0x13
-	.4byte	0x3760
+	.4byte	0x3776
 	.uleb128 0xc
-	.4byte	.LASF889
+	.4byte	.LASF891
 	.byte	0x4b
 	.byte	0x14
 	.4byte	0x2ad
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF890
+	.4byte	.LASF892
 	.byte	0x4b
 	.byte	0x15
-	.4byte	0x3747
+	.4byte	0x375d
 	.uleb128 0xd
-	.4byte	.LASF891
+	.4byte	.LASF893
 	.byte	0x28
 	.byte	0x4c
 	.byte	0x55
-	.4byte	0x379c
+	.4byte	0x37b2
 	.uleb128 0xc
-	.4byte	.LASF293
+	.4byte	.LASF295
 	.byte	0x4c
 	.byte	0x56
 	.4byte	0xc0
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF892
+	.4byte	.LASF894
 	.byte	0x4c
 	.byte	0x57
 	.4byte	0x2d8
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF893
+	.4byte	.LASF895
 	.byte	0x4c
 	.byte	0x58
 	.4byte	0x2d8
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF894
+	.4byte	.LASF896
 	.byte	0x20
 	.byte	0x4d
 	.byte	0x9
-	.4byte	0x37c1
+	.4byte	0x37d7
 	.uleb128 0xc
-	.4byte	.LASF895
+	.4byte	.LASF897
 	.byte	0x4d
 	.byte	0xa
-	.4byte	0x2e9e
+	.4byte	0x2eb4
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF473
+	.4byte	.LASF475
 	.byte	0x4d
 	.byte	0xb
-	.4byte	0x2a79
+	.4byte	0x2a8f
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF896
+	.4byte	.LASF898
 	.byte	0x10
 	.byte	0x4d
 	.byte	0xe
-	.4byte	0x37e6
+	.4byte	0x37fc
 	.uleb128 0xc
 	.4byte	.LASF99
 	.byte	0x4d
 	.byte	0xf
-	.4byte	0x2ed5
+	.4byte	0x2eeb
 	.byte	0
 	.uleb128 0xc
 	.4byte	.LASF49
 	.byte	0x4d
 	.byte	0x10
-	.4byte	0x37e6
+	.4byte	0x37fc
 	.byte	0x8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x379c
+	.4byte	0x37b2
 	.uleb128 0x24
-	.4byte	.LASF897
+	.4byte	.LASF899
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x3d
 	.byte	0xbe
-	.4byte	0x3809
+	.4byte	0x381f
 	.uleb128 0x1b
-	.4byte	.LASF898
+	.4byte	.LASF900
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF899
+	.4byte	.LASF901
 	.byte	0x1
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF900
+	.4byte	.LASF902
 	.byte	0x48
 	.byte	0x4e
 	.byte	0x6f
-	.4byte	0x3876
+	.4byte	0x388c
 	.uleb128 0xc
-	.4byte	.LASF895
+	.4byte	.LASF897
 	.byte	0x4e
 	.byte	0x70
-	.4byte	0x379c
+	.4byte	0x37b2
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF901
+	.4byte	.LASF903
 	.byte	0x4e
 	.byte	0x71
-	.4byte	0x2a79
+	.4byte	0x2a8f
 	.byte	0x20
 	.uleb128 0xc
-	.4byte	.LASF733
+	.4byte	.LASF735
 	.byte	0x4e
 	.byte	0x72
-	.4byte	0x388b
+	.4byte	0x38a1
 	.byte	0x28
 	.uleb128 0xc
-	.4byte	.LASF902
+	.4byte	.LASF904
 	.byte	0x4e
 	.byte	0x73
-	.4byte	0x38fe
+	.4byte	0x3914
 	.byte	0x30
 	.uleb128 0xc
-	.4byte	.LASF281
+	.4byte	.LASF283
 	.byte	0x4e
 	.byte	0x74
 	.4byte	0x100
 	.byte	0x38
 	.uleb128 0xc
-	.4byte	.LASF903
+	.4byte	.LASF905
 	.byte	0x4e
 	.byte	0x75
 	.4byte	0x100
 	.byte	0x39
 	.uleb128 0xc
-	.4byte	.LASF904
+	.4byte	.LASF906
 	.byte	0x4e
 	.byte	0x76
 	.4byte	0x100
@@ -8314,37 +8324,37 @@ crc32_table:
 	.byte	0x40
 	.byte	0
 	.uleb128 0x14
-	.4byte	0x37ec
-	.4byte	0x3885
+	.4byte	0x3802
+	.4byte	0x389b
 	.uleb128 0xf
-	.4byte	0x3885
+	.4byte	0x389b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3809
+	.4byte	0x381f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3876
+	.4byte	0x388c
 	.uleb128 0xd
-	.4byte	.LASF905
+	.4byte	.LASF907
 	.byte	0x40
 	.byte	0x4e
 	.byte	0x99
-	.4byte	0x38fe
+	.4byte	0x3914
 	.uleb128 0xc
-	.4byte	.LASF906
+	.4byte	.LASF908
 	.byte	0x4e
 	.byte	0x9a
-	.4byte	0x39ea
+	.4byte	0x3a00
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF907
+	.4byte	.LASF909
 	.byte	0x4e
 	.byte	0x9b
 	.4byte	0x6c
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF472
+	.4byte	.LASF474
 	.byte	0x4e
 	.byte	0x9c
 	.4byte	0x223
@@ -8353,42 +8363,42 @@ crc32_table:
 	.string	"seq"
 	.byte	0x4e
 	.byte	0x9d
-	.4byte	0x1eb6
+	.4byte	0x1ecc
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF908
+	.4byte	.LASF910
 	.byte	0x4e
 	.byte	0x9e
-	.4byte	0x3885
+	.4byte	0x389b
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF817
+	.4byte	.LASF819
 	.byte	0x4e
 	.byte	0x9f
-	.4byte	0x37c1
+	.4byte	0x37d7
 	.byte	0x20
 	.uleb128 0xc
-	.4byte	.LASF909
+	.4byte	.LASF911
 	.byte	0x4e
 	.byte	0xa0
-	.4byte	0x39f5
+	.4byte	0x3a0b
 	.byte	0x30
 	.uleb128 0xc
-	.4byte	.LASF499
+	.4byte	.LASF501
 	.byte	0x4e
 	.byte	0xa1
-	.4byte	0x2a79
+	.4byte	0x2a8f
 	.byte	0x38
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3891
+	.4byte	0x38a7
 	.uleb128 0x25
-	.4byte	.LASF910
+	.4byte	.LASF912
 	.2byte	0x240
 	.byte	0x4e
 	.byte	0xcc
-	.4byte	0x39ea
+	.4byte	0x3a00
 	.uleb128 0xc
 	.4byte	.LASF98
 	.byte	0x4e
@@ -8402,19 +8412,19 @@ crc32_table:
 	.4byte	0x6c
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF911
+	.4byte	.LASF913
 	.byte	0x4e
 	.byte	0xcf
 	.4byte	0x6c
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF912
+	.4byte	.LASF914
 	.byte	0x4e
 	.byte	0xd0
 	.4byte	0x6c
 	.byte	0xc
 	.uleb128 0x37
-	.4byte	.LASF913
+	.4byte	.LASF915
 	.byte	0x4e
 	.byte	0xd1
 	.4byte	0x6c
@@ -8423,7 +8433,7 @@ crc32_table:
 	.byte	0x1f
 	.byte	0x10
 	.uleb128 0x37
-	.4byte	.LASF914
+	.4byte	.LASF916
 	.byte	0x4e
 	.byte	0xd2
 	.4byte	0x6c
@@ -8432,7 +8442,7 @@ crc32_table:
 	.byte	0x1e
 	.byte	0x10
 	.uleb128 0x37
-	.4byte	.LASF915
+	.4byte	.LASF917
 	.byte	0x4e
 	.byte	0xd3
 	.4byte	0x6c
@@ -8441,7 +8451,7 @@ crc32_table:
 	.byte	0x1d
 	.byte	0x10
 	.uleb128 0x37
-	.4byte	.LASF916
+	.4byte	.LASF918
 	.byte	0x4e
 	.byte	0xd4
 	.4byte	0x6c
@@ -8450,151 +8460,151 @@ crc32_table:
 	.byte	0x1c
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF917
+	.4byte	.LASF919
 	.byte	0x4e
 	.byte	0xd6
 	.4byte	0x6c
 	.byte	0x14
 	.uleb128 0xc
-	.4byte	.LASF918
+	.4byte	.LASF920
 	.byte	0x4e
 	.byte	0xd7
 	.4byte	0xae
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF919
+	.4byte	.LASF921
 	.byte	0x4e
 	.byte	0xd8
 	.4byte	0xae
 	.byte	0x1a
 	.uleb128 0xc
-	.4byte	.LASF920
+	.4byte	.LASF922
 	.byte	0x4e
 	.byte	0xd9
 	.4byte	0x6c
 	.byte	0x1c
 	.uleb128 0xc
-	.4byte	.LASF921
+	.4byte	.LASF923
 	.byte	0x4e
 	.byte	0xdb
-	.4byte	0x2a79
+	.4byte	0x2a8f
 	.byte	0x20
 	.uleb128 0xc
-	.4byte	.LASF922
+	.4byte	.LASF924
 	.byte	0x4e
 	.byte	0xdc
-	.4byte	0x3885
+	.4byte	0x389b
 	.byte	0x28
 	.uleb128 0xc
-	.4byte	.LASF923
+	.4byte	.LASF925
 	.byte	0x4e
 	.byte	0xdd
-	.4byte	0x2a79
+	.4byte	0x2a8f
 	.byte	0x30
 	.uleb128 0xc
-	.4byte	.LASF924
+	.4byte	.LASF926
 	.byte	0x4e
 	.byte	0xde
-	.4byte	0x3885
+	.4byte	0x389b
 	.byte	0x38
 	.uleb128 0xc
-	.4byte	.LASF925
+	.4byte	.LASF927
 	.byte	0x4e
 	.byte	0xdf
-	.4byte	0x3a42
+	.4byte	0x3a58
 	.byte	0x40
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3904
+	.4byte	0x391a
 	.uleb128 0x33
-	.4byte	0x2a79
+	.4byte	0x2a8f
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x39f0
+	.4byte	0x3a06
 	.uleb128 0x24
-	.4byte	.LASF926
+	.4byte	.LASF928
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x4e
 	.byte	0xa4
-	.4byte	0x3a42
+	.4byte	0x3a58
 	.uleb128 0x1b
-	.4byte	.LASF927
+	.4byte	.LASF929
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF928
+	.4byte	.LASF930
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF929
+	.4byte	.LASF931
 	.byte	0x2
 	.uleb128 0x1b
-	.4byte	.LASF930
+	.4byte	.LASF932
 	.byte	0x3
 	.uleb128 0x1b
-	.4byte	.LASF931
+	.4byte	.LASF933
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF932
+	.4byte	.LASF934
 	.byte	0x5
 	.uleb128 0x1b
-	.4byte	.LASF933
+	.4byte	.LASF935
 	.byte	0x6
 	.uleb128 0x1b
-	.4byte	.LASF934
+	.4byte	.LASF936
 	.byte	0x7
 	.uleb128 0x1b
-	.4byte	.LASF935
+	.4byte	.LASF937
 	.byte	0x8
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x3891
-	.4byte	0x3a52
+	.4byte	0x38a7
+	.4byte	0x3a68
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x7
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF936
+	.4byte	.LASF938
 	.byte	0x4e
 	.2byte	0x135
 	.4byte	0x6c
 	.uleb128 0x18
-	.4byte	.LASF937
+	.4byte	.LASF939
 	.uleb128 0x15
-	.4byte	.LASF938
+	.4byte	.LASF940
 	.byte	0x4e
 	.2byte	0x15c
-	.4byte	0x3a5e
+	.4byte	0x3a74
 	.uleb128 0xd
-	.4byte	.LASF389
+	.4byte	.LASF391
 	.byte	0x10
 	.byte	0x4f
 	.byte	0x1c
-	.4byte	0x3a94
+	.4byte	0x3aaa
 	.uleb128 0xc
-	.4byte	.LASF820
+	.4byte	.LASF822
 	.byte	0x4f
 	.byte	0x1d
 	.4byte	0xc0
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF939
+	.4byte	.LASF941
 	.byte	0x4f
 	.byte	0x1e
-	.4byte	0x3a99
+	.4byte	0x3aaf
 	.byte	0x8
 	.byte	0
 	.uleb128 0x18
-	.4byte	.LASF940
+	.4byte	.LASF942
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3a94
+	.4byte	0x3aaa
 	.uleb128 0xb
 	.byte	0x8
 	.byte	0x50
 	.byte	0x5a
-	.4byte	0x3ab4
+	.4byte	0x3aca
 	.uleb128 0x10
 	.string	"sig"
 	.byte	0x50
@@ -8603,45 +8613,45 @@ crc32_table:
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF941
+	.4byte	.LASF943
 	.byte	0x50
 	.byte	0x5c
-	.4byte	0x3a9f
+	.4byte	0x3ab5
 	.uleb128 0x36
-	.4byte	.LASF943
+	.4byte	.LASF945
 	.byte	0x8
 	.byte	0x51
 	.byte	0x8
-	.4byte	0x3ae2
+	.4byte	0x3af8
 	.uleb128 0x22
-	.4byte	.LASF944
+	.4byte	.LASF946
 	.byte	0x51
 	.byte	0x9
 	.4byte	0xc0
 	.uleb128 0x22
-	.4byte	.LASF945
+	.4byte	.LASF947
 	.byte	0x51
 	.byte	0xa
 	.4byte	0x442
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF946
+	.4byte	.LASF948
 	.byte	0x51
 	.byte	0xb
-	.4byte	0x3abf
+	.4byte	0x3ad5
 	.uleb128 0xb
 	.byte	0x8
 	.byte	0x51
 	.byte	0x39
-	.4byte	0x3b0e
+	.4byte	0x3b24
 	.uleb128 0xc
-	.4byte	.LASF947
+	.4byte	.LASF949
 	.byte	0x51
 	.byte	0x3a
 	.4byte	0x173
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF948
+	.4byte	.LASF950
 	.byte	0x51
 	.byte	0x3b
 	.4byte	0x17e
@@ -8651,27 +8661,27 @@ crc32_table:
 	.byte	0x18
 	.byte	0x51
 	.byte	0x3f
-	.4byte	0x3b47
+	.4byte	0x3b5d
 	.uleb128 0xc
-	.4byte	.LASF949
+	.4byte	.LASF951
 	.byte	0x51
 	.byte	0x40
 	.4byte	0x1cb
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF950
+	.4byte	.LASF952
 	.byte	0x51
 	.byte	0x41
 	.4byte	0xc0
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF951
+	.4byte	.LASF953
 	.byte	0x51
 	.byte	0x42
-	.4byte	0x3ae2
+	.4byte	0x3af8
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF952
+	.4byte	.LASF954
 	.byte	0x51
 	.byte	0x43
 	.4byte	0xc0
@@ -8681,57 +8691,57 @@ crc32_table:
 	.byte	0x10
 	.byte	0x51
 	.byte	0x47
-	.4byte	0x3b74
+	.4byte	0x3b8a
 	.uleb128 0xc
-	.4byte	.LASF947
+	.4byte	.LASF949
 	.byte	0x51
 	.byte	0x48
 	.4byte	0x173
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF948
+	.4byte	.LASF950
 	.byte	0x51
 	.byte	0x49
 	.4byte	0x17e
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF951
+	.4byte	.LASF953
 	.byte	0x51
 	.byte	0x4a
-	.4byte	0x3ae2
+	.4byte	0x3af8
 	.byte	0x8
 	.byte	0
 	.uleb128 0xb
 	.byte	0x20
 	.byte	0x51
 	.byte	0x4e
-	.4byte	0x3bb9
+	.4byte	0x3bcf
 	.uleb128 0xc
-	.4byte	.LASF947
+	.4byte	.LASF949
 	.byte	0x51
 	.byte	0x4f
 	.4byte	0x173
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF948
+	.4byte	.LASF950
 	.byte	0x51
 	.byte	0x50
 	.4byte	0x17e
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF953
+	.4byte	.LASF955
 	.byte	0x51
 	.byte	0x51
 	.4byte	0xc0
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF954
+	.4byte	.LASF956
 	.byte	0x51
 	.byte	0x52
 	.4byte	0x1c0
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF955
+	.4byte	.LASF957
 	.byte	0x51
 	.byte	0x53
 	.4byte	0x1c0
@@ -8741,21 +8751,21 @@ crc32_table:
 	.byte	0x18
 	.byte	0x51
 	.byte	0x6b
-	.4byte	0x3be6
+	.4byte	0x3bfc
 	.uleb128 0xc
-	.4byte	.LASF956
+	.4byte	.LASF958
 	.byte	0x51
 	.byte	0x6c
-	.4byte	0x3be6
+	.4byte	0x3bfc
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF957
+	.4byte	.LASF959
 	.byte	0x51
 	.byte	0x6d
 	.4byte	0x442
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF958
+	.4byte	.LASF960
 	.byte	0x51
 	.byte	0x6e
 	.4byte	0x442
@@ -8763,7 +8773,7 @@ crc32_table:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x60
-	.4byte	0x3bf6
+	.4byte	0x3c0c
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x7
@@ -8772,15 +8782,15 @@ crc32_table:
 	.byte	0xc
 	.byte	0x51
 	.byte	0x71
-	.4byte	0x3c17
+	.4byte	0x3c2d
 	.uleb128 0xc
-	.4byte	.LASF959
+	.4byte	.LASF961
 	.byte	0x51
 	.byte	0x72
-	.4byte	0x3be6
+	.4byte	0x3bfc
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF960
+	.4byte	.LASF962
 	.byte	0x51
 	.byte	0x73
 	.4byte	0xc7
@@ -8790,45 +8800,45 @@ crc32_table:
 	.byte	0x18
 	.byte	0x51
 	.byte	0x64
-	.4byte	0x3c41
+	.4byte	0x3c57
 	.uleb128 0x22
-	.4byte	.LASF961
+	.4byte	.LASF963
 	.byte	0x51
 	.byte	0x69
 	.4byte	0x9c
 	.uleb128 0x22
-	.4byte	.LASF962
+	.4byte	.LASF964
 	.byte	0x51
 	.byte	0x6f
-	.4byte	0x3bb9
+	.4byte	0x3bcf
 	.uleb128 0x22
-	.4byte	.LASF963
+	.4byte	.LASF965
 	.byte	0x51
 	.byte	0x74
-	.4byte	0x3bf6
+	.4byte	0x3c0c
 	.byte	0
 	.uleb128 0xb
 	.byte	0x20
 	.byte	0x51
 	.byte	0x57
-	.4byte	0x3c5c
+	.4byte	0x3c72
 	.uleb128 0xc
-	.4byte	.LASF964
+	.4byte	.LASF966
 	.byte	0x51
 	.byte	0x58
 	.4byte	0x442
 	.byte	0
 	.uleb128 0x20
-	.4byte	0x3c17
+	.4byte	0x3c2d
 	.byte	0x8
 	.byte	0
 	.uleb128 0xb
 	.byte	0x10
 	.byte	0x51
 	.byte	0x79
-	.4byte	0x3c7d
+	.4byte	0x3c93
 	.uleb128 0xc
-	.4byte	.LASF965
+	.4byte	.LASF967
 	.byte	0x51
 	.byte	0x7a
 	.4byte	0x15c
@@ -8844,21 +8854,21 @@ crc32_table:
 	.byte	0x10
 	.byte	0x51
 	.byte	0x7f
-	.4byte	0x3caa
+	.4byte	0x3cc0
 	.uleb128 0xc
-	.4byte	.LASF966
+	.4byte	.LASF968
 	.byte	0x51
 	.byte	0x80
 	.4byte	0x442
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF967
+	.4byte	.LASF969
 	.byte	0x51
 	.byte	0x81
 	.4byte	0xc0
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF968
+	.4byte	.LASF970
 	.byte	0x51
 	.byte	0x82
 	.4byte	0x6c
@@ -8868,132 +8878,132 @@ crc32_table:
 	.byte	0x70
 	.byte	0x51
 	.byte	0x35
-	.4byte	0x3d0b
+	.4byte	0x3d21
 	.uleb128 0x22
-	.4byte	.LASF969
+	.4byte	.LASF971
 	.byte	0x51
 	.byte	0x36
-	.4byte	0x3d0b
+	.4byte	0x3d21
 	.uleb128 0x22
-	.4byte	.LASF970
+	.4byte	.LASF972
 	.byte	0x51
 	.byte	0x3c
-	.4byte	0x3aed
+	.4byte	0x3b03
 	.uleb128 0x22
-	.4byte	.LASF971
+	.4byte	.LASF973
 	.byte	0x51
 	.byte	0x44
-	.4byte	0x3b0e
+	.4byte	0x3b24
 	.uleb128 0x1e
 	.string	"_rt"
 	.byte	0x51
 	.byte	0x4b
-	.4byte	0x3b47
+	.4byte	0x3b5d
 	.uleb128 0x22
-	.4byte	.LASF972
+	.4byte	.LASF974
 	.byte	0x51
 	.byte	0x54
-	.4byte	0x3b74
+	.4byte	0x3b8a
 	.uleb128 0x22
-	.4byte	.LASF973
+	.4byte	.LASF975
 	.byte	0x51
 	.byte	0x76
-	.4byte	0x3c41
+	.4byte	0x3c57
 	.uleb128 0x22
-	.4byte	.LASF974
+	.4byte	.LASF976
 	.byte	0x51
 	.byte	0x7c
-	.4byte	0x3c5c
+	.4byte	0x3c72
 	.uleb128 0x22
-	.4byte	.LASF975
+	.4byte	.LASF977
 	.byte	0x51
 	.byte	0x83
-	.4byte	0x3c7d
+	.4byte	0x3c93
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xc0
-	.4byte	0x3d1b
+	.4byte	0x3d31
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x1b
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF976
+	.4byte	.LASF978
 	.byte	0x80
 	.byte	0x51
 	.byte	0x2b
-	.4byte	0x3d58
+	.4byte	0x3d6e
 	.uleb128 0xc
-	.4byte	.LASF977
+	.4byte	.LASF979
 	.byte	0x51
 	.byte	0x2c
 	.4byte	0xc0
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF978
+	.4byte	.LASF980
 	.byte	0x51
 	.byte	0x2e
 	.4byte	0xc0
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF979
+	.4byte	.LASF981
 	.byte	0x51
 	.byte	0x2f
 	.4byte	0xc0
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF980
+	.4byte	.LASF982
 	.byte	0x51
 	.byte	0x84
-	.4byte	0x3caa
+	.4byte	0x3cc0
 	.byte	0x10
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF981
+	.4byte	.LASF983
 	.byte	0x51
 	.byte	0x85
-	.4byte	0x3d1b
+	.4byte	0x3d31
 	.uleb128 0xd
-	.4byte	.LASF982
+	.4byte	.LASF984
 	.byte	0x18
 	.byte	0x52
 	.byte	0x1a
-	.4byte	0x3d88
+	.4byte	0x3d9e
 	.uleb128 0xc
-	.4byte	.LASF854
+	.4byte	.LASF856
 	.byte	0x52
 	.byte	0x1b
 	.4byte	0x2d8
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF379
+	.4byte	.LASF381
 	.byte	0x52
 	.byte	0x1c
-	.4byte	0x3ab4
+	.4byte	0x3aca
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF321
+	.4byte	.LASF323
 	.byte	0x28
 	.byte	0x53
 	.byte	0x22
-	.4byte	0x3dad
+	.4byte	0x3dc3
 	.uleb128 0xc
-	.4byte	.LASF983
+	.4byte	.LASF985
 	.byte	0x53
 	.byte	0x23
 	.4byte	0x136
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF984
+	.4byte	.LASF986
 	.byte	0x53
 	.byte	0x24
-	.4byte	0x3dad
+	.4byte	0x3dc3
 	.byte	0x8
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x357a
-	.4byte	0x3dbd
+	.4byte	0x3590
+	.4byte	0x3dd3
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x3
@@ -9003,161 +9013,161 @@ crc32_table:
 	.4byte	0x6c
 	.byte	0x53
 	.byte	0x27
-	.4byte	0x3dee
+	.4byte	0x3e04
 	.uleb128 0x1b
-	.4byte	.LASF985
+	.4byte	.LASF987
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF986
+	.4byte	.LASF988
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF987
+	.4byte	.LASF989
 	.byte	0x2
 	.uleb128 0x1b
-	.4byte	.LASF988
+	.4byte	.LASF990
 	.byte	0x3
 	.uleb128 0x1b
-	.4byte	.LASF989
+	.4byte	.LASF991
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF990
+	.4byte	.LASF992
 	.byte	0x5
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF991
+	.4byte	.LASF993
 	.byte	0x18
 	.byte	0x53
 	.byte	0x33
-	.4byte	0x3e13
+	.4byte	0x3e29
 	.uleb128 0xc
-	.4byte	.LASF992
+	.4byte	.LASF994
 	.byte	0x53
 	.byte	0x34
 	.4byte	0xc0
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF500
+	.4byte	.LASF502
 	.byte	0x53
 	.byte	0x35
-	.4byte	0x3e13
+	.4byte	0x3e29
 	.byte	0x4
 	.byte	0
 	.uleb128 0x5
 	.4byte	0xc0
-	.4byte	0x3e23
+	.4byte	0x3e39
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x4
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF993
+	.4byte	.LASF995
 	.byte	0x10
 	.byte	0x53
 	.byte	0x3d
-	.4byte	0x3e54
+	.4byte	0x3e6a
 	.uleb128 0xc
-	.4byte	.LASF537
+	.4byte	.LASF539
 	.byte	0x53
 	.byte	0x3e
-	.4byte	0x1fb4
+	.4byte	0x1fca
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF499
+	.4byte	.LASF501
 	.byte	0x53
 	.byte	0x40
 	.4byte	0xc7
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF824
+	.4byte	.LASF826
 	.byte	0x53
 	.byte	0x41
 	.4byte	0xc7
 	.byte	0xc
 	.byte	0
 	.uleb128 0x38
-	.4byte	.LASF995
+	.4byte	.LASF997
 	.byte	0
 	.byte	0x53
 	.byte	0x49
 	.uleb128 0xd
-	.4byte	.LASF996
+	.4byte	.LASF998
 	.byte	0x40
 	.byte	0x54
 	.byte	0xc
-	.4byte	0x3ec9
+	.4byte	0x3edf
 	.uleb128 0xc
-	.4byte	.LASF997
+	.4byte	.LASF999
 	.byte	0x54
 	.byte	0xf
 	.4byte	0x136
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF998
+	.4byte	.LASF1000
 	.byte	0x54
 	.byte	0x11
 	.4byte	0x136
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF999
+	.4byte	.LASF1001
 	.byte	0x54
 	.byte	0x13
 	.4byte	0x136
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF1000
+	.4byte	.LASF1002
 	.byte	0x54
 	.byte	0x15
 	.4byte	0x136
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF1001
+	.4byte	.LASF1003
 	.byte	0x54
 	.byte	0x17
 	.4byte	0x136
 	.byte	0x20
 	.uleb128 0xc
-	.4byte	.LASF1002
+	.4byte	.LASF1004
 	.byte	0x54
 	.byte	0x1f
 	.4byte	0x136
 	.byte	0x28
 	.uleb128 0xc
-	.4byte	.LASF1003
+	.4byte	.LASF1005
 	.byte	0x54
 	.byte	0x25
 	.4byte	0x136
 	.byte	0x30
 	.uleb128 0xc
-	.4byte	.LASF1004
+	.4byte	.LASF1006
 	.byte	0x54
 	.byte	0x2e
 	.4byte	0x136
 	.byte	0x38
 	.byte	0
 	.uleb128 0x24
-	.4byte	.LASF1005
+	.4byte	.LASF1007
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x55
 	.byte	0x19
-	.4byte	0x3eec
+	.4byte	0x3f02
 	.uleb128 0x1b
-	.4byte	.LASF1006
+	.4byte	.LASF1008
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1007
+	.4byte	.LASF1009
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF1008
+	.4byte	.LASF1010
 	.byte	0x2
 	.byte	0
 	.uleb128 0x1d
 	.byte	0x8
 	.byte	0x55
 	.byte	0x6d
-	.4byte	0x3f0b
+	.4byte	0x3f21
 	.uleb128 0x22
-	.4byte	.LASF1009
+	.4byte	.LASF1011
 	.byte	0x55
 	.byte	0x6e
 	.4byte	0xe4
@@ -9168,28 +9178,28 @@ crc32_table:
 	.4byte	0xe4
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF424
+	.4byte	.LASF426
 	.byte	0x20
 	.byte	0x55
 	.byte	0x3e
-	.4byte	0x3f48
+	.4byte	0x3f5e
 	.uleb128 0xc
-	.4byte	.LASF1010
+	.4byte	.LASF1012
 	.byte	0x55
 	.byte	0x4b
 	.4byte	0xc7
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1011
+	.4byte	.LASF1013
 	.byte	0x55
 	.byte	0x5a
 	.4byte	0xc7
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF1012
+	.4byte	.LASF1014
 	.byte	0x55
 	.byte	0x7c
-	.4byte	0x3eec
+	.4byte	0x3f02
 	.byte	0x8
 	.uleb128 0xc
 	.4byte	.LASF61
@@ -9199,19 +9209,19 @@ crc32_table:
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF361
+	.4byte	.LASF363
 	.byte	0x18
 	.byte	0x22
 	.byte	0xed
-	.4byte	0x3f79
+	.4byte	0x3f8f
 	.uleb128 0xc
-	.4byte	.LASF356
+	.4byte	.LASF358
 	.byte	0x22
 	.byte	0xef
 	.4byte	0x136
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF357
+	.4byte	.LASF359
 	.byte	0x22
 	.byte	0xf0
 	.4byte	0x136
@@ -9224,403 +9234,403 @@ crc32_table:
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1013
+	.4byte	.LASF1015
 	.byte	0x18
 	.byte	0x22
 	.byte	0xff
-	.4byte	0x3fad
+	.4byte	0x3fc3
 	.uleb128 0x1c
-	.4byte	.LASF356
+	.4byte	.LASF358
 	.byte	0x22
 	.2byte	0x100
 	.4byte	0x136
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF357
+	.4byte	.LASF359
 	.byte	0x22
 	.2byte	0x101
 	.4byte	0x136
 	.byte	0x8
 	.uleb128 0x1c
-	.4byte	.LASF1014
+	.4byte	.LASF1016
 	.byte	0x22
 	.2byte	0x102
 	.4byte	0xef
 	.byte	0x10
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF316
+	.4byte	.LASF318
 	.byte	0x20
 	.byte	0x22
 	.2byte	0x128
-	.4byte	0x3fef
+	.4byte	0x4005
 	.uleb128 0x1c
-	.4byte	.LASF1015
+	.4byte	.LASF1017
 	.byte	0x22
 	.2byte	0x12d
 	.4byte	0x2d
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1016
+	.4byte	.LASF1018
 	.byte	0x22
 	.2byte	0x130
 	.4byte	0xef
 	.byte	0x8
 	.uleb128 0x1c
-	.4byte	.LASF1017
+	.4byte	.LASF1019
 	.byte	0x22
 	.2byte	0x135
 	.4byte	0xef
 	.byte	0x10
 	.uleb128 0x1c
-	.4byte	.LASF1018
+	.4byte	.LASF1020
 	.byte	0x22
 	.2byte	0x138
 	.4byte	0xef
 	.byte	0x18
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1019
+	.4byte	.LASF1021
 	.byte	0x10
 	.byte	0x22
 	.2byte	0x14b
-	.4byte	0x4017
+	.4byte	0x402d
 	.uleb128 0x1c
-	.4byte	.LASF1020
+	.4byte	.LASF1022
 	.byte	0x22
 	.2byte	0x14c
 	.4byte	0x2d
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1021
+	.4byte	.LASF1023
 	.byte	0x22
 	.2byte	0x14d
 	.4byte	0x120
 	.byte	0x8
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1022
+	.4byte	.LASF1024
 	.byte	0x8
 	.byte	0x22
 	.2byte	0x166
-	.4byte	0x403f
+	.4byte	0x4055
 	.uleb128 0x1c
-	.4byte	.LASF1023
+	.4byte	.LASF1025
 	.byte	0x22
 	.2byte	0x167
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1024
+	.4byte	.LASF1026
 	.byte	0x22
 	.2byte	0x168
 	.4byte	0x6c
 	.byte	0x4
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1025
+	.4byte	.LASF1027
 	.byte	0x40
 	.byte	0x22
 	.2byte	0x197
-	.4byte	0x40c2
+	.4byte	0x40d8
 	.uleb128 0x1c
-	.4byte	.LASF1026
+	.4byte	.LASF1028
 	.byte	0x22
 	.2byte	0x198
 	.4byte	0x136
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1027
+	.4byte	.LASF1029
 	.byte	0x22
 	.2byte	0x199
 	.4byte	0x136
 	.byte	0x8
 	.uleb128 0x1c
-	.4byte	.LASF1028
+	.4byte	.LASF1030
 	.byte	0x22
 	.2byte	0x19a
 	.4byte	0x136
 	.byte	0x10
 	.uleb128 0x1c
-	.4byte	.LASF1029
+	.4byte	.LASF1031
 	.byte	0x22
 	.2byte	0x19b
 	.4byte	0x120
 	.byte	0x18
 	.uleb128 0x1c
-	.4byte	.LASF1030
+	.4byte	.LASF1032
 	.byte	0x22
 	.2byte	0x19c
 	.4byte	0x120
 	.byte	0x1c
 	.uleb128 0x1c
-	.4byte	.LASF1031
+	.4byte	.LASF1033
 	.byte	0x22
 	.2byte	0x19d
 	.4byte	0x2d
 	.byte	0x20
 	.uleb128 0x1c
-	.4byte	.LASF1032
+	.4byte	.LASF1034
 	.byte	0x22
 	.2byte	0x19e
 	.4byte	0x2d
 	.byte	0x28
 	.uleb128 0x1c
-	.4byte	.LASF1033
+	.4byte	.LASF1035
 	.byte	0x22
 	.2byte	0x19f
 	.4byte	0x2d
 	.byte	0x30
 	.uleb128 0x1c
-	.4byte	.LASF1022
+	.4byte	.LASF1024
 	.byte	0x22
 	.2byte	0x1a0
-	.4byte	0x4017
+	.4byte	0x402d
 	.byte	0x38
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1034
+	.4byte	.LASF1036
 	.byte	0xd8
 	.byte	0x22
 	.2byte	0x1a3
-	.4byte	0x422f
+	.4byte	0x4245
 	.uleb128 0x1c
-	.4byte	.LASF1035
+	.4byte	.LASF1037
 	.byte	0x22
 	.2byte	0x1a5
 	.4byte	0x136
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1036
+	.4byte	.LASF1038
 	.byte	0x22
 	.2byte	0x1a6
 	.4byte	0x136
 	.byte	0x8
 	.uleb128 0x1c
-	.4byte	.LASF1037
+	.4byte	.LASF1039
 	.byte	0x22
 	.2byte	0x1a7
 	.4byte	0x136
 	.byte	0x10
 	.uleb128 0x1c
-	.4byte	.LASF1038
+	.4byte	.LASF1040
 	.byte	0x22
 	.2byte	0x1a8
 	.4byte	0x136
 	.byte	0x18
 	.uleb128 0x1c
-	.4byte	.LASF1039
+	.4byte	.LASF1041
 	.byte	0x22
 	.2byte	0x1a9
 	.4byte	0x136
 	.byte	0x20
 	.uleb128 0x1c
-	.4byte	.LASF1040
+	.4byte	.LASF1042
 	.byte	0x22
 	.2byte	0x1aa
 	.4byte	0x136
 	.byte	0x28
 	.uleb128 0x1c
-	.4byte	.LASF1041
+	.4byte	.LASF1043
 	.byte	0x22
 	.2byte	0x1ac
 	.4byte	0x136
 	.byte	0x30
 	.uleb128 0x1c
-	.4byte	.LASF1042
+	.4byte	.LASF1044
 	.byte	0x22
 	.2byte	0x1ad
 	.4byte	0x136
 	.byte	0x38
 	.uleb128 0x1c
-	.4byte	.LASF1043
+	.4byte	.LASF1045
 	.byte	0x22
 	.2byte	0x1ae
 	.4byte	0x12b
 	.byte	0x40
 	.uleb128 0x1c
-	.4byte	.LASF1044
+	.4byte	.LASF1046
 	.byte	0x22
 	.2byte	0x1b0
 	.4byte	0x136
 	.byte	0x48
 	.uleb128 0x1c
-	.4byte	.LASF1045
+	.4byte	.LASF1047
 	.byte	0x22
 	.2byte	0x1b1
 	.4byte	0x136
 	.byte	0x50
 	.uleb128 0x1c
-	.4byte	.LASF1046
+	.4byte	.LASF1048
 	.byte	0x22
 	.2byte	0x1b2
 	.4byte	0x136
 	.byte	0x58
 	.uleb128 0x1c
-	.4byte	.LASF1047
+	.4byte	.LASF1049
 	.byte	0x22
 	.2byte	0x1b3
 	.4byte	0x136
 	.byte	0x60
 	.uleb128 0x1c
-	.4byte	.LASF1048
+	.4byte	.LASF1050
 	.byte	0x22
 	.2byte	0x1b5
 	.4byte	0x136
 	.byte	0x68
 	.uleb128 0x1c
-	.4byte	.LASF1049
+	.4byte	.LASF1051
 	.byte	0x22
 	.2byte	0x1b6
 	.4byte	0x136
 	.byte	0x70
 	.uleb128 0x1c
-	.4byte	.LASF1050
+	.4byte	.LASF1052
 	.byte	0x22
 	.2byte	0x1b7
 	.4byte	0x136
 	.byte	0x78
 	.uleb128 0x1c
-	.4byte	.LASF1051
+	.4byte	.LASF1053
 	.byte	0x22
 	.2byte	0x1b8
 	.4byte	0x136
 	.byte	0x80
 	.uleb128 0x1c
-	.4byte	.LASF1052
+	.4byte	.LASF1054
 	.byte	0x22
 	.2byte	0x1b9
 	.4byte	0x136
 	.byte	0x88
 	.uleb128 0x1c
-	.4byte	.LASF1053
+	.4byte	.LASF1055
 	.byte	0x22
 	.2byte	0x1bb
 	.4byte	0x136
 	.byte	0x90
 	.uleb128 0x1c
-	.4byte	.LASF1054
+	.4byte	.LASF1056
 	.byte	0x22
 	.2byte	0x1bc
 	.4byte	0x136
 	.byte	0x98
 	.uleb128 0x1c
-	.4byte	.LASF1055
+	.4byte	.LASF1057
 	.byte	0x22
 	.2byte	0x1bd
 	.4byte	0x136
 	.byte	0xa0
 	.uleb128 0x1c
-	.4byte	.LASF1056
+	.4byte	.LASF1058
 	.byte	0x22
 	.2byte	0x1be
 	.4byte	0x136
 	.byte	0xa8
 	.uleb128 0x1c
-	.4byte	.LASF1057
+	.4byte	.LASF1059
 	.byte	0x22
 	.2byte	0x1bf
 	.4byte	0x136
 	.byte	0xb0
 	.uleb128 0x1c
-	.4byte	.LASF1058
+	.4byte	.LASF1060
 	.byte	0x22
 	.2byte	0x1c0
 	.4byte	0x136
 	.byte	0xb8
 	.uleb128 0x1c
-	.4byte	.LASF1059
+	.4byte	.LASF1061
 	.byte	0x22
 	.2byte	0x1c1
 	.4byte	0x136
 	.byte	0xc0
 	.uleb128 0x1c
-	.4byte	.LASF1060
+	.4byte	.LASF1062
 	.byte	0x22
 	.2byte	0x1c2
 	.4byte	0x136
 	.byte	0xc8
 	.uleb128 0x1c
-	.4byte	.LASF1061
+	.4byte	.LASF1063
 	.byte	0x22
 	.2byte	0x1c3
 	.4byte	0x136
 	.byte	0xd0
 	.byte	0
 	.uleb128 0x29
-	.4byte	.LASF1062
+	.4byte	.LASF1064
 	.2byte	0x200
 	.byte	0x22
 	.2byte	0x1c7
-	.4byte	0x434b
+	.4byte	0x4361
 	.uleb128 0x1c
-	.4byte	.LASF1063
+	.4byte	.LASF1065
 	.byte	0x22
 	.2byte	0x1c9
-	.4byte	0x3fef
+	.4byte	0x4005
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1064
+	.4byte	.LASF1066
 	.byte	0x22
 	.2byte	0x1ca
 	.4byte	0x2d
 	.byte	0x10
 	.uleb128 0x1c
-	.4byte	.LASF1065
+	.4byte	.LASF1067
 	.byte	0x22
 	.2byte	0x1cb
-	.4byte	0x2e9e
+	.4byte	0x2eb4
 	.byte	0x18
 	.uleb128 0x1c
-	.4byte	.LASF1066
+	.4byte	.LASF1068
 	.byte	0x22
 	.2byte	0x1cc
 	.4byte	0x2d8
 	.byte	0x30
 	.uleb128 0x1c
-	.4byte	.LASF292
+	.4byte	.LASF294
 	.byte	0x22
 	.2byte	0x1cd
 	.4byte	0x6c
 	.byte	0x40
 	.uleb128 0x1c
-	.4byte	.LASF1067
+	.4byte	.LASF1069
 	.byte	0x22
 	.2byte	0x1cf
 	.4byte	0x136
 	.byte	0x48
 	.uleb128 0x1c
-	.4byte	.LASF1014
+	.4byte	.LASF1016
 	.byte	0x22
 	.2byte	0x1d0
 	.4byte	0x136
 	.byte	0x50
 	.uleb128 0x1c
-	.4byte	.LASF1068
+	.4byte	.LASF1070
 	.byte	0x22
 	.2byte	0x1d1
 	.4byte	0x136
 	.byte	0x58
 	.uleb128 0x1c
-	.4byte	.LASF1069
+	.4byte	.LASF1071
 	.byte	0x22
 	.2byte	0x1d2
 	.4byte	0x136
 	.byte	0x60
 	.uleb128 0x1c
-	.4byte	.LASF1070
+	.4byte	.LASF1072
 	.byte	0x22
 	.2byte	0x1d4
 	.4byte	0x136
 	.byte	0x68
 	.uleb128 0x1c
-	.4byte	.LASF1071
+	.4byte	.LASF1073
 	.byte	0x22
 	.2byte	0x1d6
-	.4byte	0x40c2
+	.4byte	0x40d8
 	.byte	0x70
 	.uleb128 0x2b
-	.4byte	.LASF1072
+	.4byte	.LASF1074
 	.byte	0x22
 	.2byte	0x1d9
 	.4byte	0xc0
@@ -9629,25 +9639,25 @@ crc32_table:
 	.4byte	.LASF63
 	.byte	0x22
 	.2byte	0x1da
-	.4byte	0x434b
+	.4byte	0x4361
 	.2byte	0x150
 	.uleb128 0x2b
-	.4byte	.LASF1073
+	.4byte	.LASF1075
 	.byte	0x22
 	.2byte	0x1dc
-	.4byte	0x4356
+	.4byte	0x436c
 	.2byte	0x158
 	.uleb128 0x2b
-	.4byte	.LASF1074
+	.4byte	.LASF1076
 	.byte	0x22
 	.2byte	0x1de
-	.4byte	0x4356
+	.4byte	0x436c
 	.2byte	0x160
 	.uleb128 0x2a
 	.string	"avg"
 	.byte	0x22
 	.2byte	0x1e8
-	.4byte	0x403f
+	.4byte	0x4055
 	.2byte	0x180
 	.uleb128 0x2b
 	.4byte	.LASF66
@@ -9676,59 +9686,59 @@ crc32_table:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x422f
+	.4byte	0x4245
 	.uleb128 0x18
-	.4byte	.LASF1073
+	.4byte	.LASF1075
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4351
+	.4byte	0x4367
 	.uleb128 0x19
-	.4byte	.LASF1075
+	.4byte	.LASF1077
 	.byte	0x50
 	.byte	0x22
 	.2byte	0x1f1
-	.4byte	0x43f9
+	.4byte	0x440f
 	.uleb128 0x1c
-	.4byte	.LASF1076
+	.4byte	.LASF1078
 	.byte	0x22
 	.2byte	0x1f2
 	.4byte	0x2d8
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1077
+	.4byte	.LASF1079
 	.byte	0x22
 	.2byte	0x1f3
 	.4byte	0x2d
 	.byte	0x10
 	.uleb128 0x1c
-	.4byte	.LASF1078
+	.4byte	.LASF1080
 	.byte	0x22
 	.2byte	0x1f4
 	.4byte	0x2d
 	.byte	0x18
 	.uleb128 0x1c
-	.4byte	.LASF1079
+	.4byte	.LASF1081
 	.byte	0x22
 	.2byte	0x1f5
 	.4byte	0x6c
 	.byte	0x20
 	.uleb128 0x1c
-	.4byte	.LASF292
+	.4byte	.LASF294
 	.byte	0x22
 	.2byte	0x1f6
 	.4byte	0xae
 	.byte	0x24
 	.uleb128 0x1c
-	.4byte	.LASF1080
+	.4byte	.LASF1082
 	.byte	0x22
 	.2byte	0x1f7
 	.4byte	0xae
 	.byte	0x26
 	.uleb128 0x1c
-	.4byte	.LASF1081
+	.4byte	.LASF1083
 	.byte	0x22
 	.2byte	0x1f9
-	.4byte	0x43f9
+	.4byte	0x440f
 	.byte	0x28
 	.uleb128 0x1c
 	.4byte	.LASF66
@@ -9757,57 +9767,57 @@ crc32_table:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x435c
+	.4byte	0x4372
 	.uleb128 0x19
-	.4byte	.LASF1082
+	.4byte	.LASF1084
 	.byte	0xe8
 	.byte	0x22
 	.2byte	0x208
-	.4byte	0x44ec
+	.4byte	0x4502
 	.uleb128 0x1c
-	.4byte	.LASF790
+	.4byte	.LASF792
 	.byte	0x22
 	.2byte	0x209
-	.4byte	0x2e9e
+	.4byte	0x2eb4
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1083
+	.4byte	.LASF1085
 	.byte	0x22
 	.2byte	0x210
 	.4byte	0x136
 	.byte	0x18
 	.uleb128 0x1c
-	.4byte	.LASF1084
+	.4byte	.LASF1086
 	.byte	0x22
 	.2byte	0x211
 	.4byte	0x136
 	.byte	0x20
 	.uleb128 0x1c
-	.4byte	.LASF1085
+	.4byte	.LASF1087
 	.byte	0x22
 	.2byte	0x212
 	.4byte	0x136
 	.byte	0x28
 	.uleb128 0x1c
-	.4byte	.LASF1086
+	.4byte	.LASF1088
 	.byte	0x22
 	.2byte	0x213
 	.4byte	0x136
 	.byte	0x30
 	.uleb128 0x1c
-	.4byte	.LASF1087
+	.4byte	.LASF1089
 	.byte	0x22
 	.2byte	0x214
 	.4byte	0x136
 	.byte	0x38
 	.uleb128 0x1c
-	.4byte	.LASF1088
+	.4byte	.LASF1090
 	.byte	0x22
 	.2byte	0x21b
 	.4byte	0x12b
 	.byte	0x40
 	.uleb128 0x1c
-	.4byte	.LASF1089
+	.4byte	.LASF1091
 	.byte	0x22
 	.2byte	0x21c
 	.4byte	0x136
@@ -9819,7 +9829,7 @@ crc32_table:
 	.4byte	0x6c
 	.byte	0x50
 	.uleb128 0x39
-	.4byte	.LASF1090
+	.4byte	.LASF1092
 	.byte	0x22
 	.2byte	0x237
 	.4byte	0x6c
@@ -9828,7 +9838,7 @@ crc32_table:
 	.byte	0x1f
 	.byte	0x54
 	.uleb128 0x39
-	.4byte	.LASF1091
+	.4byte	.LASF1093
 	.byte	0x22
 	.2byte	0x238
 	.4byte	0x6c
@@ -9837,7 +9847,7 @@ crc32_table:
 	.byte	0x1e
 	.byte	0x54
 	.uleb128 0x39
-	.4byte	.LASF1092
+	.4byte	.LASF1094
 	.byte	0x22
 	.2byte	0x239
 	.4byte	0x6c
@@ -9846,7 +9856,7 @@ crc32_table:
 	.byte	0x1d
 	.byte	0x54
 	.uleb128 0x39
-	.4byte	.LASF1093
+	.4byte	.LASF1095
 	.byte	0x22
 	.2byte	0x23a
 	.4byte	0x6c
@@ -9855,7 +9865,7 @@ crc32_table:
 	.byte	0x1c
 	.byte	0x54
 	.uleb128 0x39
-	.4byte	.LASF1094
+	.4byte	.LASF1096
 	.byte	0x22
 	.2byte	0x23b
 	.4byte	0x6c
@@ -9864,37 +9874,37 @@ crc32_table:
 	.byte	0x1b
 	.byte	0x54
 	.uleb128 0x1c
-	.4byte	.LASF1095
+	.4byte	.LASF1097
 	.byte	0x22
 	.2byte	0x241
-	.4byte	0x3809
+	.4byte	0x381f
 	.byte	0x58
 	.uleb128 0x1c
-	.4byte	.LASF1096
+	.4byte	.LASF1098
 	.byte	0x22
 	.2byte	0x24a
-	.4byte	0x3809
+	.4byte	0x381f
 	.byte	0xa0
 	.byte	0
 	.uleb128 0x3a
 	.byte	0x4
 	.byte	0x22
 	.2byte	0x271
-	.4byte	0x452a
+	.4byte	0x4540
 	.uleb128 0x1c
-	.4byte	.LASF381
+	.4byte	.LASF383
 	.byte	0x22
 	.2byte	0x272
 	.4byte	0x100
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1097
+	.4byte	.LASF1099
 	.byte	0x22
 	.2byte	0x273
 	.4byte	0x100
 	.byte	0x1
 	.uleb128 0x1c
-	.4byte	.LASF1098
+	.4byte	.LASF1100
 	.byte	0x22
 	.2byte	0x274
 	.4byte	0x100
@@ -9907,16 +9917,16 @@ crc32_table:
 	.byte	0x3
 	.byte	0
 	.uleb128 0x3b
-	.4byte	.LASF1099
+	.4byte	.LASF1101
 	.byte	0x4
 	.byte	0x22
 	.2byte	0x270
-	.4byte	0x454c
+	.4byte	0x4562
 	.uleb128 0x3c
 	.string	"b"
 	.byte	0x22
 	.2byte	0x278
-	.4byte	0x44ec
+	.4byte	0x4502
 	.uleb128 0x3c
 	.string	"s"
 	.byte	0x22
@@ -9924,46 +9934,46 @@ crc32_table:
 	.4byte	0x120
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF1100
+	.4byte	.LASF1102
 	.byte	0x4
 	.4byte	0xc0
 	.byte	0x22
 	.2byte	0x27c
-	.4byte	0x4576
+	.4byte	0x458c
 	.uleb128 0x3d
-	.4byte	.LASF1101
+	.4byte	.LASF1103
 	.sleb128 -1
 	.uleb128 0x1b
-	.4byte	.LASF1102
+	.4byte	.LASF1104
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1103
+	.4byte	.LASF1105
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF1104
+	.4byte	.LASF1106
 	.byte	0x2
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1105
+	.4byte	.LASF1107
 	.byte	0x8
 	.byte	0x22
 	.2byte	0x283
-	.4byte	0x4591
+	.4byte	0x45a7
 	.uleb128 0x1c
 	.4byte	.LASF49
 	.byte	0x22
 	.2byte	0x284
-	.4byte	0x4591
+	.4byte	0x45a7
 	.byte	0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4576
+	.4byte	0x458c
 	.uleb128 0x3a
 	.byte	0x8
 	.byte	0x22
 	.2byte	0x510
-	.4byte	0x45ae
+	.4byte	0x45c4
 	.uleb128 0x1c
 	.4byte	.LASF66
 	.byte	0x22
@@ -9979,9 +9989,9 @@ crc32_table:
 	.byte	0x8
 	.byte	0x22
 	.2byte	0x510
-	.4byte	0x45dd
+	.4byte	0x45f3
 	.uleb128 0x40
-	.4byte	.LASF1535
+	.4byte	.LASF1537
 	.byte	0x22
 	.2byte	0x510
 	.4byte	0x6c
@@ -9989,18 +9999,18 @@ crc32_table:
 	.byte	0x1
 	.byte	0x1f
 	.uleb128 0x41
-	.4byte	.LASF1106
+	.4byte	.LASF1108
 	.byte	0x22
 	.2byte	0x510
-	.4byte	0x4597
+	.4byte	0x45ad
 	.uleb128 0x1f
-	.4byte	0x45ae
+	.4byte	0x45c4
 	.byte	0
 	.uleb128 0x3a
 	.byte	0x8
 	.byte	0x22
 	.2byte	0x513
-	.4byte	0x45f4
+	.4byte	0x460a
 	.uleb128 0x1c
 	.4byte	.LASF67
 	.byte	0x22
@@ -10016,126 +10026,116 @@ crc32_table:
 	.byte	0x8
 	.byte	0x22
 	.2byte	0x513
-	.4byte	0x4620
+	.4byte	0x4636
 	.uleb128 0x41
-	.4byte	.LASF1107
+	.4byte	.LASF1109
 	.byte	0x22
 	.2byte	0x513
 	.4byte	0x6c
 	.uleb128 0x41
-	.4byte	.LASF1108
+	.4byte	.LASF1110
 	.byte	0x22
 	.2byte	0x513
-	.4byte	0x45dd
+	.4byte	0x45f3
 	.uleb128 0x1f
-	.4byte	0x45f4
+	.4byte	0x460a
 	.byte	0
 	.uleb128 0x18
-	.4byte	.LASF297
+	.4byte	.LASF299
 	.uleb128 0x3
-	.4byte	0x4620
+	.4byte	0x4636
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4625
+	.4byte	0x463b
 	.uleb128 0x18
-	.4byte	.LASF1109
+	.4byte	.LASF1111
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4630
+	.4byte	0x4646
 	.uleb128 0x18
-	.4byte	.LASF1110
+	.4byte	.LASF1112
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x463b
+	.4byte	0x4651
 	.uleb128 0x18
-	.4byte	.LASF1111
+	.4byte	.LASF1113
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4646
+	.4byte	0x465c
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x36b1
+	.4byte	0x36c7
 	.uleb128 0x5
 	.4byte	0x31c
-	.4byte	0x4667
+	.4byte	0x467d
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2bdc
+	.4byte	0x2bf2
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x136
 	.uleb128 0x5
 	.4byte	0x2d8
-	.4byte	0x4683
+	.4byte	0x4699
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x2
 	.byte	0
 	.uleb128 0x18
-	.4byte	.LASF372
+	.4byte	.LASF374
 	.uleb128 0x3
-	.4byte	0x4683
+	.4byte	0x4699
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4688
+	.4byte	0x469e
 	.uleb128 0x5
 	.4byte	0x60
-	.4byte	0x46a3
+	.4byte	0x46b9
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0xf
 	.byte	0
 	.uleb128 0x18
-	.4byte	.LASF374
-	.uleb128 0x7
-	.byte	0x8
-	.4byte	0x46a3
-	.uleb128 0x18
-	.4byte	.LASF1112
-	.uleb128 0x7
-	.byte	0x8
-	.4byte	0x46ae
-	.uleb128 0x18
-	.4byte	.LASF1113
+	.4byte	.LASF376
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x46b9
 	.uleb128 0x18
-	.4byte	.LASF378
+	.4byte	.LASF1114
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x46c4
 	.uleb128 0x18
-	.4byte	.LASF1114
+	.4byte	.LASF1115
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x46cf
 	.uleb128 0x18
-	.4byte	.LASF1115
+	.4byte	.LASF380
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x46da
 	.uleb128 0x18
-	.4byte	.LASF388
+	.4byte	.LASF1116
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x46e5
 	.uleb128 0x18
-	.4byte	.LASF1116
+	.4byte	.LASF1117
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x46f0
 	.uleb128 0x18
-	.4byte	.LASF399
+	.4byte	.LASF390
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x46fb
 	.uleb128 0x18
-	.4byte	.LASF1117
+	.4byte	.LASF1118
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x4706
@@ -10145,7 +10145,7 @@ crc32_table:
 	.byte	0x8
 	.4byte	0x4711
 	.uleb128 0x18
-	.4byte	.LASF402
+	.4byte	.LASF1119
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x471c
@@ -10154,19 +10154,19 @@ crc32_table:
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x4727
+	.uleb128 0x18
+	.4byte	.LASF404
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3d58
+	.4byte	0x4732
 	.uleb128 0x18
-	.4byte	.LASF1118
+	.4byte	.LASF405
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4738
-	.uleb128 0x18
-	.4byte	.LASF1119
+	.4byte	0x473d
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4743
+	.4byte	0x3d6e
 	.uleb128 0x18
 	.4byte	.LASF1120
 	.uleb128 0x7
@@ -10177,31 +10177,31 @@ crc32_table:
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x4759
-	.uleb128 0x5
-	.4byte	0x4774
-	.4byte	0x4774
-	.uleb128 0x6
-	.4byte	0x4e
-	.byte	0x1
-	.byte	0
-	.uleb128 0x7
-	.byte	0x8
-	.4byte	0x477a
 	.uleb128 0x18
 	.4byte	.LASF1122
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3f0b
+	.4byte	0x4764
 	.uleb128 0x18
 	.4byte	.LASF1123
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4785
+	.4byte	0x476f
+	.uleb128 0x5
+	.4byte	0x478a
+	.4byte	0x478a
+	.uleb128 0x6
+	.4byte	0x4e
+	.byte	0x1
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4790
 	.uleb128 0x18
 	.4byte	.LASF1124
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4790
+	.4byte	0x3f21
 	.uleb128 0x18
 	.4byte	.LASF1125
 	.uleb128 0x7
@@ -10222,46 +10222,56 @@ crc32_table:
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x47bc
-	.uleb128 0x15
+	.uleb128 0x18
 	.4byte	.LASF1129
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x47c7
+	.uleb128 0x18
+	.4byte	.LASF1130
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x47d2
+	.uleb128 0x15
+	.4byte	.LASF1131
 	.byte	0x22
 	.2byte	0x5d0
-	.4byte	0x4651
+	.4byte	0x4667
 	.uleb128 0x5
 	.4byte	0x2d
-	.4byte	0x47e4
+	.4byte	0x47fa
 	.uleb128 0x42
 	.4byte	0x4e
 	.2byte	0x7ff
 	.byte	0
 	.uleb128 0x15
-	.4byte	.LASF1130
+	.4byte	.LASF1132
 	.byte	0x22
 	.2byte	0x699
-	.4byte	0x47d3
+	.4byte	0x47e9
 	.uleb128 0x1a
-	.4byte	.LASF1131
+	.4byte	.LASF1133
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x22
 	.2byte	0x775
-	.4byte	0x4814
+	.4byte	0x482a
 	.uleb128 0x1b
-	.4byte	.LASF1132
+	.4byte	.LASF1134
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1133
+	.4byte	.LASF1135
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF1134
+	.4byte	.LASF1136
 	.byte	0x2
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1135
+	.4byte	.LASF1137
 	.byte	0x10
 	.byte	0x56
 	.byte	0x1e
-	.4byte	0x4839
+	.4byte	0x484f
 	.uleb128 0xc
 	.4byte	.LASF60
 	.byte	0x56
@@ -10269,18 +10279,18 @@ crc32_table:
 	.4byte	0x55
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF820
+	.4byte	.LASF822
 	.byte	0x56
 	.byte	0x20
 	.4byte	0x20d
 	.byte	0x8
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1136
+	.4byte	.LASF1138
 	.byte	0x28
 	.byte	0x56
 	.byte	0x54
-	.4byte	0x4882
+	.4byte	0x4898
 	.uleb128 0xc
 	.4byte	.LASF60
 	.byte	0x56
@@ -10288,51 +10298,51 @@ crc32_table:
 	.4byte	0x55
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1137
+	.4byte	.LASF1139
 	.byte	0x56
 	.byte	0x56
-	.4byte	0x4987
+	.4byte	0x499d
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF1138
+	.4byte	.LASF1140
 	.byte	0x56
 	.byte	0x58
-	.4byte	0x4a01
+	.4byte	0x4a17
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF1139
+	.4byte	.LASF1141
 	.byte	0x56
 	.byte	0x5a
-	.4byte	0x4a07
+	.4byte	0x4a1d
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF1140
+	.4byte	.LASF1142
 	.byte	0x56
 	.byte	0x5b
-	.4byte	0x4a0d
+	.4byte	0x4a23
 	.byte	0x20
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x4839
+	.4byte	0x484f
 	.uleb128 0x14
 	.4byte	0x20d
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.uleb128 0xf
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.uleb128 0xf
-	.4byte	0x4981
+	.4byte	0x4997
 	.uleb128 0xf
 	.4byte	0xc0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x48a6
+	.4byte	0x48bc
 	.uleb128 0xd
-	.4byte	.LASF1141
+	.4byte	.LASF1143
 	.byte	0x60
 	.byte	0x57
 	.byte	0x42
-	.4byte	0x4981
+	.4byte	0x4997
 	.uleb128 0xc
 	.4byte	.LASF60
 	.byte	0x57
@@ -10340,7 +10350,7 @@ crc32_table:
 	.4byte	0x55
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF732
+	.4byte	.LASF734
 	.byte	0x57
 	.byte	0x44
 	.4byte	0x2d8
@@ -10349,34 +10359,34 @@ crc32_table:
 	.4byte	.LASF63
 	.byte	0x57
 	.byte	0x45
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF1142
+	.4byte	.LASF1144
 	.byte	0x57
 	.byte	0x46
-	.4byte	0x4b6e
+	.4byte	0x4b84
 	.byte	0x20
 	.uleb128 0xc
-	.4byte	.LASF1143
+	.4byte	.LASF1145
 	.byte	0x57
 	.byte	0x47
-	.4byte	0x4bf9
+	.4byte	0x4c0f
 	.byte	0x28
 	.uleb128 0x10
 	.string	"sd"
 	.byte	0x57
 	.byte	0x48
-	.4byte	0x30eb
+	.4byte	0x3101
 	.byte	0x30
 	.uleb128 0xc
-	.4byte	.LASF1144
+	.4byte	.LASF1146
 	.byte	0x57
 	.byte	0x49
-	.4byte	0x4ad2
+	.4byte	0x4ae8
 	.byte	0x38
 	.uleb128 0x37
-	.4byte	.LASF1145
+	.4byte	.LASF1147
 	.byte	0x57
 	.byte	0x4d
 	.4byte	0x6c
@@ -10385,7 +10395,7 @@ crc32_table:
 	.byte	0x1f
 	.byte	0x3c
 	.uleb128 0x37
-	.4byte	.LASF1146
+	.4byte	.LASF1148
 	.byte	0x57
 	.byte	0x4e
 	.4byte	0x6c
@@ -10394,7 +10404,7 @@ crc32_table:
 	.byte	0x1e
 	.byte	0x3c
 	.uleb128 0x37
-	.4byte	.LASF1147
+	.4byte	.LASF1149
 	.byte	0x57
 	.byte	0x4f
 	.4byte	0x6c
@@ -10403,7 +10413,7 @@ crc32_table:
 	.byte	0x1d
 	.byte	0x3c
 	.uleb128 0x37
-	.4byte	.LASF1148
+	.4byte	.LASF1150
 	.byte	0x57
 	.byte	0x50
 	.4byte	0x6c
@@ -10412,7 +10422,7 @@ crc32_table:
 	.byte	0x1c
 	.byte	0x3c
 	.uleb128 0x37
-	.4byte	.LASF1149
+	.4byte	.LASF1151
 	.byte	0x57
 	.byte	0x51
 	.4byte	0x6c
@@ -10447,84 +10457,84 @@ crc32_table:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4814
+	.4byte	0x482a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4887
+	.4byte	0x489d
 	.uleb128 0x14
 	.4byte	0x20d
-	.4byte	0x49a6
+	.4byte	0x49bc
 	.uleb128 0xf
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.uleb128 0xf
-	.4byte	0x49a6
+	.4byte	0x49bc
 	.uleb128 0xf
 	.4byte	0xc0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x49ac
+	.4byte	0x49c2
 	.uleb128 0xd
-	.4byte	.LASF1150
+	.4byte	.LASF1152
 	.byte	0x38
 	.byte	0x56
 	.byte	0xa1
-	.4byte	0x4a01
+	.4byte	0x4a17
 	.uleb128 0xc
-	.4byte	.LASF840
+	.4byte	.LASF842
 	.byte	0x56
 	.byte	0xa2
-	.4byte	0x4814
+	.4byte	0x482a
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF824
+	.4byte	.LASF826
 	.byte	0x56
 	.byte	0xa3
 	.4byte	0x261
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF1151
+	.4byte	.LASF1153
 	.byte	0x56
 	.byte	0xa4
 	.4byte	0x442
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF832
+	.4byte	.LASF834
 	.byte	0x56
 	.byte	0xa5
-	.4byte	0x4a3b
+	.4byte	0x4a51
 	.byte	0x20
 	.uleb128 0xc
-	.4byte	.LASF835
+	.4byte	.LASF837
 	.byte	0x56
 	.byte	0xa7
-	.4byte	0x4a3b
+	.4byte	0x4a51
 	.byte	0x28
 	.uleb128 0xc
-	.4byte	.LASF836
+	.4byte	.LASF838
 	.byte	0x56
 	.byte	0xa9
-	.4byte	0x4a5f
+	.4byte	0x4a75
 	.byte	0x30
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x498d
+	.4byte	0x49a3
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4981
+	.4byte	0x4997
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x49a6
+	.4byte	0x49bc
 	.uleb128 0x14
 	.4byte	0x26c
-	.4byte	0x4a3b
+	.4byte	0x4a51
 	.uleb128 0xf
-	.4byte	0x346c
+	.4byte	0x3482
 	.uleb128 0xf
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.uleb128 0xf
-	.4byte	0x49a6
+	.4byte	0x49bc
 	.uleb128 0xf
 	.4byte	0x1e1
 	.uleb128 0xf
@@ -10534,63 +10544,63 @@ crc32_table:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4a13
+	.4byte	0x4a29
 	.uleb128 0x14
 	.4byte	0xc0
-	.4byte	0x4a5f
+	.4byte	0x4a75
 	.uleb128 0xf
-	.4byte	0x346c
+	.4byte	0x3482
 	.uleb128 0xf
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.uleb128 0xf
-	.4byte	0x49a6
+	.4byte	0x49bc
 	.uleb128 0xf
-	.4byte	0x357a
+	.4byte	0x3590
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4a41
+	.4byte	0x4a57
 	.uleb128 0xd
-	.4byte	.LASF1152
+	.4byte	.LASF1154
 	.byte	0x10
 	.byte	0x56
 	.byte	0xd6
-	.4byte	0x4a8a
+	.4byte	0x4aa0
 	.uleb128 0xc
-	.4byte	.LASF1153
+	.4byte	.LASF1155
 	.byte	0x56
 	.byte	0xd7
-	.4byte	0x4aa8
+	.4byte	0x4abe
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1154
+	.4byte	.LASF1156
 	.byte	0x56
 	.byte	0xd8
-	.4byte	0x4acc
+	.4byte	0x4ae2
 	.byte	0x8
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x4a65
+	.4byte	0x4a7b
 	.uleb128 0x14
 	.4byte	0x26c
-	.4byte	0x4aa8
+	.4byte	0x4abe
 	.uleb128 0xf
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.uleb128 0xf
-	.4byte	0x4981
+	.4byte	0x4997
 	.uleb128 0xf
 	.4byte	0x1e1
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4a8f
+	.4byte	0x4aa5
 	.uleb128 0x14
 	.4byte	0x26c
-	.4byte	0x4acc
+	.4byte	0x4ae2
 	.uleb128 0xf
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.uleb128 0xf
-	.4byte	0x4981
+	.4byte	0x4997
 	.uleb128 0xf
 	.4byte	0x55
 	.uleb128 0xf
@@ -10598,59 +10608,59 @@ crc32_table:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4aae
+	.4byte	0x4ac4
 	.uleb128 0xd
-	.4byte	.LASF1144
+	.4byte	.LASF1146
 	.byte	0x4
 	.byte	0x58
 	.byte	0x15
-	.4byte	0x4aeb
+	.4byte	0x4b01
 	.uleb128 0xc
-	.4byte	.LASF1155
+	.4byte	.LASF1157
 	.byte	0x58
 	.byte	0x16
-	.4byte	0x3760
+	.4byte	0x3776
 	.byte	0
 	.byte	0
 	.uleb128 0x11
-	.4byte	.LASF1156
+	.4byte	.LASF1158
 	.byte	0x57
 	.byte	0x26
 	.4byte	0x4d4
 	.uleb128 0x11
-	.4byte	.LASF1157
+	.4byte	.LASF1159
 	.byte	0x57
 	.byte	0x2a
 	.4byte	0x136
 	.uleb128 0xd
-	.4byte	.LASF1142
+	.4byte	.LASF1144
 	.byte	0xa0
 	.byte	0x57
 	.byte	0xcb
-	.4byte	0x4b6e
+	.4byte	0x4b84
 	.uleb128 0xc
-	.4byte	.LASF854
+	.4byte	.LASF856
 	.byte	0x57
 	.byte	0xcc
 	.4byte	0x2d8
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1158
+	.4byte	.LASF1160
 	.byte	0x57
 	.byte	0xcd
 	.4byte	0x86f
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF1159
+	.4byte	.LASF1161
 	.byte	0x57
 	.byte	0xce
-	.4byte	0x48a6
+	.4byte	0x48bc
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF1160
+	.4byte	.LASF1162
 	.byte	0x57
 	.byte	0xcf
-	.4byte	0x4d94
+	.4byte	0x4daa
 	.byte	0x78
 	.uleb128 0xc
 	.4byte	.LASF66
@@ -10679,48 +10689,48 @@ crc32_table:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4b01
+	.4byte	0x4b17
 	.uleb128 0xd
-	.4byte	.LASF1161
+	.4byte	.LASF1163
 	.byte	0x50
 	.byte	0x57
 	.byte	0x91
-	.4byte	0x4bf9
+	.4byte	0x4c0f
 	.uleb128 0xc
-	.4byte	.LASF827
+	.4byte	.LASF829
 	.byte	0x57
 	.byte	0x92
-	.4byte	0x4c0a
+	.4byte	0x4c20
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1152
+	.4byte	.LASF1154
 	.byte	0x57
 	.byte	0x93
-	.4byte	0x4c10
+	.4byte	0x4c26
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF1162
+	.4byte	.LASF1164
 	.byte	0x57
 	.byte	0x94
-	.4byte	0x4a07
+	.4byte	0x4a1d
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF1163
+	.4byte	.LASF1165
 	.byte	0x57
 	.byte	0x95
-	.4byte	0x4c2b
+	.4byte	0x4c41
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF1164
+	.4byte	.LASF1166
 	.byte	0x57
 	.byte	0x96
-	.4byte	0x4c40
+	.4byte	0x4c56
 	.byte	0x20
 	.uleb128 0xc
-	.4byte	.LASF1165
+	.4byte	.LASF1167
 	.byte	0x57
 	.byte	0x97
-	.4byte	0x4c67
+	.4byte	0x4c7d
 	.byte	0x28
 	.uleb128 0xc
 	.4byte	.LASF66
@@ -10749,77 +10759,77 @@ crc32_table:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4b74
+	.4byte	0x4b8a
 	.uleb128 0xe
-	.4byte	0x4c0a
+	.4byte	0x4c20
 	.uleb128 0xf
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4bff
+	.4byte	0x4c15
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4a8a
+	.4byte	0x4aa0
 	.uleb128 0x14
-	.4byte	0x4c25
-	.4byte	0x4c25
+	.4byte	0x4c3b
+	.4byte	0x4c3b
 	.uleb128 0xf
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x3603
+	.4byte	0x3619
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4c16
+	.4byte	0x4c2c
 	.uleb128 0x14
-	.4byte	0x29fa
-	.4byte	0x4c40
+	.4byte	0x2a10
+	.4byte	0x4c56
 	.uleb128 0xf
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4c31
+	.4byte	0x4c47
 	.uleb128 0xe
-	.4byte	0x4c5b
+	.4byte	0x4c71
 	.uleb128 0xf
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.uleb128 0xf
-	.4byte	0x4c5b
+	.4byte	0x4c71
 	.uleb128 0xf
-	.4byte	0x4c61
+	.4byte	0x4c77
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2f64
+	.4byte	0x2f7a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x2f84
+	.4byte	0x2f9a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4c46
+	.4byte	0x4c5c
 	.uleb128 0x25
-	.4byte	.LASF1166
+	.4byte	.LASF1168
 	.2byte	0x1220
 	.byte	0x57
 	.byte	0x9f
-	.4byte	0x4cba
+	.4byte	0x4cd0
 	.uleb128 0xc
-	.4byte	.LASF1167
+	.4byte	.LASF1169
 	.byte	0x57
 	.byte	0xa0
-	.4byte	0x4cba
+	.4byte	0x4cd0
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1168
+	.4byte	.LASF1170
 	.byte	0x57
 	.byte	0xa1
-	.4byte	0x4cca
+	.4byte	0x4ce0
 	.byte	0x18
 	.uleb128 0x26
-	.4byte	.LASF1169
+	.4byte	.LASF1171
 	.byte	0x57
 	.byte	0xa2
 	.4byte	0xc0
@@ -10828,10 +10838,10 @@ crc32_table:
 	.string	"buf"
 	.byte	0x57
 	.byte	0xa3
-	.4byte	0x4cda
+	.4byte	0x4cf0
 	.2byte	0x21c
 	.uleb128 0x26
-	.4byte	.LASF1170
+	.4byte	.LASF1172
 	.byte	0x57
 	.byte	0xa4
 	.4byte	0xc0
@@ -10839,369 +10849,369 @@ crc32_table:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x1e1
-	.4byte	0x4cca
+	.4byte	0x4ce0
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x1e1
-	.4byte	0x4cda
+	.4byte	0x4cf0
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x3f
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x60
-	.4byte	0x4ceb
+	.4byte	0x4d01
 	.uleb128 0x42
 	.4byte	0x4e
 	.2byte	0xfff
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1171
+	.4byte	.LASF1173
 	.byte	0x18
 	.byte	0x57
 	.byte	0xa7
-	.4byte	0x4d1c
+	.4byte	0x4d32
 	.uleb128 0xc
-	.4byte	.LASF939
+	.4byte	.LASF941
 	.byte	0x57
 	.byte	0xa8
-	.4byte	0x4d3b
+	.4byte	0x4d51
 	.byte	0
 	.uleb128 0xc
 	.4byte	.LASF60
 	.byte	0x57
 	.byte	0xa9
-	.4byte	0x4d5a
+	.4byte	0x4d70
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF1172
+	.4byte	.LASF1174
 	.byte	0x57
 	.byte	0xaa
-	.4byte	0x4d84
+	.4byte	0x4d9a
 	.byte	0x10
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x4ceb
+	.4byte	0x4d01
 	.uleb128 0x14
 	.4byte	0xc0
-	.4byte	0x4d35
+	.4byte	0x4d4b
 	.uleb128 0xf
-	.4byte	0x4b6e
+	.4byte	0x4b84
 	.uleb128 0xf
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4d21
+	.4byte	0x4d37
 	.uleb128 0x3
-	.4byte	0x4d35
+	.4byte	0x4d4b
 	.uleb128 0x14
 	.4byte	0x55
-	.4byte	0x4d54
+	.4byte	0x4d6a
 	.uleb128 0xf
-	.4byte	0x4b6e
+	.4byte	0x4b84
 	.uleb128 0xf
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4d40
+	.4byte	0x4d56
 	.uleb128 0x3
-	.4byte	0x4d54
+	.4byte	0x4d6a
 	.uleb128 0x14
 	.4byte	0xc0
-	.4byte	0x4d78
+	.4byte	0x4d8e
 	.uleb128 0xf
-	.4byte	0x4b6e
+	.4byte	0x4b84
 	.uleb128 0xf
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.uleb128 0xf
-	.4byte	0x4d78
+	.4byte	0x4d8e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4c6d
+	.4byte	0x4c83
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4d5f
+	.4byte	0x4d75
 	.uleb128 0x3
-	.4byte	0x4d7e
+	.4byte	0x4d94
 	.uleb128 0x11
-	.4byte	.LASF1173
+	.4byte	.LASF1175
 	.byte	0x57
 	.byte	0xb6
-	.4byte	0x4a8a
+	.4byte	0x4aa0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4d1c
+	.4byte	0x4d32
 	.uleb128 0x11
-	.4byte	.LASF1174
+	.4byte	.LASF1176
 	.byte	0x57
 	.byte	0xf5
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.uleb128 0x11
-	.4byte	.LASF1175
+	.4byte	.LASF1177
 	.byte	0x57
 	.byte	0xf7
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.uleb128 0x11
-	.4byte	.LASF1176
+	.4byte	.LASF1178
 	.byte	0x57
 	.byte	0xf9
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.uleb128 0x11
-	.4byte	.LASF1177
+	.4byte	.LASF1179
 	.byte	0x57
 	.byte	0xfb
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.uleb128 0x11
-	.4byte	.LASF1178
+	.4byte	.LASF1180
 	.byte	0x57
 	.byte	0xfd
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.uleb128 0xd
-	.4byte	.LASF1179
+	.4byte	.LASF1181
 	.byte	0x20
 	.byte	0x59
 	.byte	0x27
-	.4byte	0x4e02
+	.4byte	0x4e18
 	.uleb128 0xc
-	.4byte	.LASF1180
+	.4byte	.LASF1182
 	.byte	0x59
 	.byte	0x28
 	.4byte	0x442
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1181
+	.4byte	.LASF1183
 	.byte	0x59
 	.byte	0x29
 	.4byte	0x2d8
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF1182
+	.4byte	.LASF1184
 	.byte	0x59
 	.byte	0x2a
-	.4byte	0x4ad2
+	.4byte	0x4ae8
 	.byte	0x18
 	.byte	0
 	.uleb128 0x11
-	.4byte	.LASF1183
+	.4byte	.LASF1185
 	.byte	0x5a
 	.byte	0x22
 	.4byte	0x48b
 	.uleb128 0x11
-	.4byte	.LASF1184
+	.4byte	.LASF1186
 	.byte	0x5a
 	.byte	0x23
 	.4byte	0x48b
 	.uleb128 0x11
-	.4byte	.LASF1185
+	.4byte	.LASF1187
 	.byte	0x5a
 	.byte	0x39
 	.4byte	0x54d
 	.uleb128 0xd
-	.4byte	.LASF1186
+	.4byte	.LASF1188
 	.byte	0x4
 	.byte	0x5a
 	.byte	0x3e
-	.4byte	0x4e3c
+	.4byte	0x4e52
 	.uleb128 0xc
-	.4byte	.LASF853
+	.4byte	.LASF855
 	.byte	0x5a
 	.byte	0x3f
 	.4byte	0xc0
 	.byte	0
 	.byte	0
 	.uleb128 0x8
-	.4byte	.LASF1187
+	.4byte	.LASF1189
 	.byte	0x5a
 	.byte	0x40
-	.4byte	0x4e23
+	.4byte	0x4e39
 	.uleb128 0x19
-	.4byte	.LASF1188
+	.4byte	.LASF1190
 	.byte	0xb8
 	.byte	0x5a
 	.2byte	0x122
-	.4byte	0x4f80
+	.4byte	0x4f96
 	.uleb128 0x1c
-	.4byte	.LASF1189
+	.4byte	.LASF1191
 	.byte	0x5a
 	.2byte	0x123
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1190
+	.4byte	.LASF1192
 	.byte	0x5a
 	.2byte	0x124
-	.4byte	0x5282
+	.4byte	0x5298
 	.byte	0x8
 	.uleb128 0x1c
-	.4byte	.LASF1191
+	.4byte	.LASF1193
 	.byte	0x5a
 	.2byte	0x125
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x10
 	.uleb128 0x1c
-	.4byte	.LASF1192
+	.4byte	.LASF1194
 	.byte	0x5a
 	.2byte	0x126
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x18
 	.uleb128 0x1c
-	.4byte	.LASF1193
+	.4byte	.LASF1195
 	.byte	0x5a
 	.2byte	0x127
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x20
 	.uleb128 0x1c
-	.4byte	.LASF1194
+	.4byte	.LASF1196
 	.byte	0x5a
 	.2byte	0x128
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x28
 	.uleb128 0x1c
-	.4byte	.LASF1195
+	.4byte	.LASF1197
 	.byte	0x5a
 	.2byte	0x129
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x30
 	.uleb128 0x1c
-	.4byte	.LASF1196
+	.4byte	.LASF1198
 	.byte	0x5a
 	.2byte	0x12a
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x38
 	.uleb128 0x1c
-	.4byte	.LASF1197
+	.4byte	.LASF1199
 	.byte	0x5a
 	.2byte	0x12b
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x40
 	.uleb128 0x1c
-	.4byte	.LASF1198
+	.4byte	.LASF1200
 	.byte	0x5a
 	.2byte	0x12c
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x48
 	.uleb128 0x1c
-	.4byte	.LASF1199
+	.4byte	.LASF1201
 	.byte	0x5a
 	.2byte	0x12d
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x50
 	.uleb128 0x1c
-	.4byte	.LASF1200
+	.4byte	.LASF1202
 	.byte	0x5a
 	.2byte	0x12e
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x58
 	.uleb128 0x1c
-	.4byte	.LASF1201
+	.4byte	.LASF1203
 	.byte	0x5a
 	.2byte	0x12f
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x60
 	.uleb128 0x1c
-	.4byte	.LASF1202
+	.4byte	.LASF1204
 	.byte	0x5a
 	.2byte	0x130
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x68
 	.uleb128 0x1c
-	.4byte	.LASF1203
+	.4byte	.LASF1205
 	.byte	0x5a
 	.2byte	0x131
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x70
 	.uleb128 0x1c
-	.4byte	.LASF1204
+	.4byte	.LASF1206
 	.byte	0x5a
 	.2byte	0x132
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x78
 	.uleb128 0x1c
-	.4byte	.LASF1205
+	.4byte	.LASF1207
 	.byte	0x5a
 	.2byte	0x133
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x80
 	.uleb128 0x1c
-	.4byte	.LASF1206
+	.4byte	.LASF1208
 	.byte	0x5a
 	.2byte	0x134
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x88
 	.uleb128 0x1c
-	.4byte	.LASF1207
+	.4byte	.LASF1209
 	.byte	0x5a
 	.2byte	0x135
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x90
 	.uleb128 0x1c
-	.4byte	.LASF1208
+	.4byte	.LASF1210
 	.byte	0x5a
 	.2byte	0x136
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x98
 	.uleb128 0x1c
-	.4byte	.LASF1209
+	.4byte	.LASF1211
 	.byte	0x5a
 	.2byte	0x137
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0xa0
 	.uleb128 0x1c
-	.4byte	.LASF1210
+	.4byte	.LASF1212
 	.byte	0x5a
 	.2byte	0x138
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0xa8
 	.uleb128 0x1c
-	.4byte	.LASF1211
+	.4byte	.LASF1213
 	.byte	0x5a
 	.2byte	0x139
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0xb0
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x4e47
+	.4byte	0x4e5d
 	.uleb128 0x14
 	.4byte	0xc0
-	.4byte	0x4f94
+	.4byte	0x4faa
 	.uleb128 0xf
-	.4byte	0x4f94
+	.4byte	0x4faa
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4f9a
+	.4byte	0x4fb0
 	.uleb128 0x29
-	.4byte	.LASF1212
+	.4byte	.LASF1214
 	.2byte	0x3b0
 	.byte	0x5b
 	.2byte	0x407
-	.4byte	0x5271
+	.4byte	0x5287
 	.uleb128 0x1c
 	.4byte	.LASF63
 	.byte	0x5b
 	.2byte	0x408
-	.4byte	0x4f94
+	.4byte	0x4faa
 	.byte	0
 	.uleb128 0x23
 	.string	"p"
 	.byte	0x5b
 	.2byte	0x40a
-	.4byte	0x5eae
+	.4byte	0x5ec4
 	.byte	0x8
 	.uleb128 0x1c
-	.4byte	.LASF1159
+	.4byte	.LASF1161
 	.byte	0x5b
 	.2byte	0x40c
-	.4byte	0x48a6
+	.4byte	0x48bc
 	.byte	0x10
 	.uleb128 0x1c
-	.4byte	.LASF1213
+	.4byte	.LASF1215
 	.byte	0x5b
 	.2byte	0x40d
 	.4byte	0x55
@@ -11210,154 +11220,154 @@ crc32_table:
 	.4byte	.LASF148
 	.byte	0x5b
 	.2byte	0x40e
-	.4byte	0x5bb8
+	.4byte	0x5bce
 	.byte	0x78
 	.uleb128 0x1c
-	.4byte	.LASF275
+	.4byte	.LASF277
 	.byte	0x5b
 	.2byte	0x410
-	.4byte	0xfbf
+	.4byte	0xfd5
 	.byte	0x80
 	.uleb128 0x23
 	.string	"bus"
 	.byte	0x5b
 	.2byte	0x414
-	.4byte	0x585a
+	.4byte	0x5870
 	.byte	0xa0
 	.uleb128 0x1c
-	.4byte	.LASF1214
+	.4byte	.LASF1216
 	.byte	0x5b
 	.2byte	0x415
-	.4byte	0x59ce
+	.4byte	0x59e4
 	.byte	0xa8
 	.uleb128 0x1c
-	.4byte	.LASF1215
+	.4byte	.LASF1217
 	.byte	0x5b
 	.2byte	0x417
 	.4byte	0x442
 	.byte	0xb0
 	.uleb128 0x1c
-	.4byte	.LASF1216
+	.4byte	.LASF1218
 	.byte	0x5b
 	.2byte	0x419
 	.4byte	0x442
 	.byte	0xb8
 	.uleb128 0x1c
-	.4byte	.LASF1217
+	.4byte	.LASF1219
 	.byte	0x5b
 	.2byte	0x41b
-	.4byte	0x5e19
+	.4byte	0x5e2f
 	.byte	0xc0
 	.uleb128 0x2b
-	.4byte	.LASF1218
+	.4byte	.LASF1220
 	.byte	0x5b
 	.2byte	0x41c
-	.4byte	0x532f
+	.4byte	0x5345
 	.2byte	0x128
 	.uleb128 0x2b
-	.4byte	.LASF1219
+	.4byte	.LASF1221
 	.byte	0x5b
 	.2byte	0x41d
-	.4byte	0x5eb4
+	.4byte	0x5eca
 	.2byte	0x260
 	.uleb128 0x2b
-	.4byte	.LASF1220
+	.4byte	.LASF1222
 	.byte	0x5b
 	.2byte	0x420
-	.4byte	0x5ebf
+	.4byte	0x5ed5
 	.2byte	0x268
 	.uleb128 0x2b
-	.4byte	.LASF1221
+	.4byte	.LASF1223
 	.byte	0x5b
 	.2byte	0x423
-	.4byte	0x5eca
+	.4byte	0x5ee0
 	.2byte	0x270
 	.uleb128 0x2b
-	.4byte	.LASF1222
+	.4byte	.LASF1224
 	.byte	0x5b
 	.2byte	0x426
 	.4byte	0x2d8
 	.2byte	0x278
 	.uleb128 0x2b
-	.4byte	.LASF1223
+	.4byte	.LASF1225
 	.byte	0x5b
 	.2byte	0x42c
-	.4byte	0x5eda
+	.4byte	0x5ef0
 	.2byte	0x288
 	.uleb128 0x2b
-	.4byte	.LASF1224
+	.4byte	.LASF1226
 	.byte	0x5b
 	.2byte	0x42d
-	.4byte	0x466d
+	.4byte	0x4683
 	.2byte	0x290
 	.uleb128 0x2b
-	.4byte	.LASF1225
+	.4byte	.LASF1227
 	.byte	0x5b
 	.2byte	0x42e
 	.4byte	0x136
 	.2byte	0x298
 	.uleb128 0x2b
-	.4byte	.LASF1226
+	.4byte	.LASF1228
 	.byte	0x5b
 	.2byte	0x433
 	.4byte	0x136
 	.2byte	0x2a0
 	.uleb128 0x2b
-	.4byte	.LASF1227
+	.4byte	.LASF1229
 	.byte	0x5b
 	.2byte	0x434
 	.4byte	0x2d
 	.2byte	0x2a8
 	.uleb128 0x2b
-	.4byte	.LASF1228
+	.4byte	.LASF1230
 	.byte	0x5b
 	.2byte	0x436
-	.4byte	0x5ee0
+	.4byte	0x5ef6
 	.2byte	0x2b0
 	.uleb128 0x2b
-	.4byte	.LASF1229
+	.4byte	.LASF1231
 	.byte	0x5b
 	.2byte	0x438
 	.4byte	0x2d8
 	.2byte	0x2b8
 	.uleb128 0x2b
-	.4byte	.LASF1230
+	.4byte	.LASF1232
 	.byte	0x5b
 	.2byte	0x43a
-	.4byte	0x5eeb
+	.4byte	0x5f01
 	.2byte	0x2c8
 	.uleb128 0x2b
-	.4byte	.LASF1231
+	.4byte	.LASF1233
 	.byte	0x5b
 	.2byte	0x43d
-	.4byte	0x5ef6
+	.4byte	0x5f0c
 	.2byte	0x2d0
 	.uleb128 0x2b
-	.4byte	.LASF1232
+	.4byte	.LASF1234
 	.byte	0x5b
 	.2byte	0x440
-	.4byte	0x5f01
+	.4byte	0x5f17
 	.2byte	0x2d8
 	.uleb128 0x2b
-	.4byte	.LASF1233
+	.4byte	.LASF1235
 	.byte	0x5b
 	.2byte	0x442
-	.4byte	0x5835
+	.4byte	0x584b
 	.2byte	0x2e0
 	.uleb128 0x2b
-	.4byte	.LASF1234
+	.4byte	.LASF1236
 	.byte	0x5b
 	.2byte	0x444
-	.4byte	0x5f0c
+	.4byte	0x5f22
 	.2byte	0x2f0
 	.uleb128 0x2b
-	.4byte	.LASF1235
+	.4byte	.LASF1237
 	.byte	0x5b
 	.2byte	0x445
-	.4byte	0x5de9
+	.4byte	0x5dff
 	.2byte	0x2f8
 	.uleb128 0x2b
-	.4byte	.LASF1236
+	.4byte	.LASF1238
 	.byte	0x5b
 	.2byte	0x447
 	.4byte	0x202
@@ -11369,55 +11379,55 @@ crc32_table:
 	.4byte	0x120
 	.2byte	0x304
 	.uleb128 0x2b
-	.4byte	.LASF1237
+	.4byte	.LASF1239
 	.byte	0x5b
 	.2byte	0x44a
 	.4byte	0x86f
 	.2byte	0x308
 	.uleb128 0x2b
-	.4byte	.LASF1238
+	.4byte	.LASF1240
 	.byte	0x5b
 	.2byte	0x44b
 	.4byte	0x2d8
 	.2byte	0x310
 	.uleb128 0x2b
-	.4byte	.LASF1239
+	.4byte	.LASF1241
 	.byte	0x5b
 	.2byte	0x44d
-	.4byte	0x4dd1
+	.4byte	0x4de7
 	.2byte	0x320
 	.uleb128 0x2b
-	.4byte	.LASF1240
+	.4byte	.LASF1242
 	.byte	0x5b
 	.2byte	0x44e
-	.4byte	0x5d44
+	.4byte	0x5d5a
 	.2byte	0x340
 	.uleb128 0x2b
-	.4byte	.LASF1241
+	.4byte	.LASF1243
 	.byte	0x5b
 	.2byte	0x44f
-	.4byte	0x59ae
+	.4byte	0x59c4
 	.2byte	0x348
 	.uleb128 0x2b
-	.4byte	.LASF827
+	.4byte	.LASF829
 	.byte	0x5b
 	.2byte	0x451
-	.4byte	0x5282
+	.4byte	0x5298
 	.2byte	0x350
 	.uleb128 0x2b
-	.4byte	.LASF1242
+	.4byte	.LASF1244
 	.byte	0x5b
 	.2byte	0x452
-	.4byte	0x5f17
+	.4byte	0x5f2d
 	.2byte	0x358
 	.uleb128 0x2b
-	.4byte	.LASF1243
+	.4byte	.LASF1245
 	.byte	0x5b
 	.2byte	0x453
-	.4byte	0x5f22
+	.4byte	0x5f38
 	.2byte	0x360
 	.uleb128 0x2c
-	.4byte	.LASF1244
+	.4byte	.LASF1246
 	.byte	0x5b
 	.2byte	0x455
 	.4byte	0x22e
@@ -11426,7 +11436,7 @@ crc32_table:
 	.byte	0x7
 	.2byte	0x368
 	.uleb128 0x2c
-	.4byte	.LASF1245
+	.4byte	.LASF1247
 	.byte	0x5b
 	.2byte	0x456
 	.4byte	0x22e
@@ -11435,7 +11445,7 @@ crc32_table:
 	.byte	0x6
 	.2byte	0x368
 	.uleb128 0x2c
-	.4byte	.LASF1246
+	.4byte	.LASF1248
 	.byte	0x5b
 	.2byte	0x457
 	.4byte	0x22e
@@ -11444,7 +11454,7 @@ crc32_table:
 	.byte	0x5
 	.2byte	0x368
 	.uleb128 0x2c
-	.4byte	.LASF1247
+	.4byte	.LASF1249
 	.byte	0x5b
 	.2byte	0x458
 	.4byte	0x22e
@@ -11477,25 +11487,25 @@ crc32_table:
 	.4byte	0x136
 	.2byte	0x388
 	.uleb128 0x2b
-	.4byte	.LASF1248
+	.4byte	.LASF1250
 	.byte	0x5b
 	.2byte	0x45e
 	.4byte	0x136
 	.2byte	0x390
 	.uleb128 0x2b
-	.4byte	.LASF1249
+	.4byte	.LASF1251
 	.byte	0x5b
 	.2byte	0x45f
 	.4byte	0x136
 	.2byte	0x398
 	.uleb128 0x2b
-	.4byte	.LASF452
+	.4byte	.LASF454
 	.byte	0x5b
 	.2byte	0x460
 	.4byte	0x136
 	.2byte	0x3a0
 	.uleb128 0x2b
-	.4byte	.LASF453
+	.4byte	.LASF455
 	.byte	0x5b
 	.2byte	0x461
 	.4byte	0x136
@@ -11503,64 +11513,64 @@ crc32_table:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4f85
+	.4byte	0x4f9b
 	.uleb128 0xe
-	.4byte	0x5282
+	.4byte	0x5298
 	.uleb128 0xf
-	.4byte	0x4f94
+	.4byte	0x4faa
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5277
+	.4byte	0x528d
 	.uleb128 0x1a
-	.4byte	.LASF1250
+	.4byte	.LASF1252
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x5a
 	.2byte	0x1fc
-	.4byte	0x52b2
+	.4byte	0x52c8
 	.uleb128 0x1b
-	.4byte	.LASF1251
+	.4byte	.LASF1253
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1252
+	.4byte	.LASF1254
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF1253
+	.4byte	.LASF1255
 	.byte	0x2
 	.uleb128 0x1b
-	.4byte	.LASF1254
+	.4byte	.LASF1256
 	.byte	0x3
 	.byte	0
 	.uleb128 0x1a
-	.4byte	.LASF1255
+	.4byte	.LASF1257
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x5a
 	.2byte	0x212
-	.4byte	0x52e2
+	.4byte	0x52f8
 	.uleb128 0x1b
-	.4byte	.LASF1256
+	.4byte	.LASF1258
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1257
+	.4byte	.LASF1259
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF1258
+	.4byte	.LASF1260
 	.byte	0x2
 	.uleb128 0x1b
-	.4byte	.LASF1259
+	.4byte	.LASF1261
 	.byte	0x3
 	.uleb128 0x1b
-	.4byte	.LASF1260
+	.4byte	.LASF1262
 	.byte	0x4
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1261
+	.4byte	.LASF1263
 	.byte	0x20
 	.byte	0x5a
 	.2byte	0x21e
-	.4byte	0x5324
+	.4byte	0x533a
 	.uleb128 0x1c
 	.4byte	.LASF98
 	.byte	0x5a
@@ -11568,43 +11578,43 @@ crc32_table:
 	.4byte	0x86f
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1155
+	.4byte	.LASF1157
 	.byte	0x5a
 	.2byte	0x220
 	.4byte	0x6c
 	.byte	0x4
 	.uleb128 0x1c
-	.4byte	.LASF1262
+	.4byte	.LASF1264
 	.byte	0x5a
 	.2byte	0x222
 	.4byte	0x2d8
 	.byte	0x8
 	.uleb128 0x1c
-	.4byte	.LASF1263
+	.4byte	.LASF1265
 	.byte	0x5a
 	.2byte	0x225
-	.4byte	0x5329
+	.4byte	0x533f
 	.byte	0x18
 	.byte	0
 	.uleb128 0x18
-	.4byte	.LASF1264
+	.4byte	.LASF1266
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5324
+	.4byte	0x533a
 	.uleb128 0x29
-	.4byte	.LASF1265
+	.4byte	.LASF1267
 	.2byte	0x138
 	.byte	0x5a
 	.2byte	0x249
-	.4byte	0x562a
+	.4byte	0x5640
 	.uleb128 0x1c
-	.4byte	.LASF1266
+	.4byte	.LASF1268
 	.byte	0x5a
 	.2byte	0x24a
-	.4byte	0x4e3c
+	.4byte	0x4e52
 	.byte	0
 	.uleb128 0x39
-	.4byte	.LASF1267
+	.4byte	.LASF1269
 	.byte	0x5a
 	.2byte	0x24b
 	.4byte	0x6c
@@ -11613,7 +11623,7 @@ crc32_table:
 	.byte	0x1f
 	.byte	0x4
 	.uleb128 0x39
-	.4byte	.LASF1268
+	.4byte	.LASF1270
 	.byte	0x5a
 	.2byte	0x24c
 	.4byte	0x6c
@@ -11622,7 +11632,7 @@ crc32_table:
 	.byte	0x1e
 	.byte	0x4
 	.uleb128 0x39
-	.4byte	.LASF1269
+	.4byte	.LASF1271
 	.byte	0x5a
 	.2byte	0x24d
 	.4byte	0x22e
@@ -11631,7 +11641,7 @@ crc32_table:
 	.byte	0x5
 	.byte	0x4
 	.uleb128 0x39
-	.4byte	.LASF1270
+	.4byte	.LASF1272
 	.byte	0x5a
 	.2byte	0x24e
 	.4byte	0x22e
@@ -11640,7 +11650,7 @@ crc32_table:
 	.byte	0x4
 	.byte	0x4
 	.uleb128 0x39
-	.4byte	.LASF1271
+	.4byte	.LASF1273
 	.byte	0x5a
 	.2byte	0x24f
 	.4byte	0x22e
@@ -11649,7 +11659,7 @@ crc32_table:
 	.byte	0x3
 	.byte	0x4
 	.uleb128 0x39
-	.4byte	.LASF1272
+	.4byte	.LASF1274
 	.byte	0x5a
 	.2byte	0x250
 	.4byte	0x22e
@@ -11658,7 +11668,7 @@ crc32_table:
 	.byte	0x2
 	.byte	0x4
 	.uleb128 0x39
-	.4byte	.LASF1273
+	.4byte	.LASF1275
 	.byte	0x5a
 	.2byte	0x251
 	.4byte	0x22e
@@ -11667,7 +11677,7 @@ crc32_table:
 	.byte	0x1
 	.byte	0x4
 	.uleb128 0x39
-	.4byte	.LASF1274
+	.4byte	.LASF1276
 	.byte	0x5a
 	.2byte	0x252
 	.4byte	0x22e
@@ -11676,7 +11686,7 @@ crc32_table:
 	.byte	0
 	.byte	0x4
 	.uleb128 0x39
-	.4byte	.LASF1275
+	.4byte	.LASF1277
 	.byte	0x5a
 	.2byte	0x253
 	.4byte	0x22e
@@ -11685,7 +11695,7 @@ crc32_table:
 	.byte	0x7
 	.byte	0x5
 	.uleb128 0x39
-	.4byte	.LASF1276
+	.4byte	.LASF1278
 	.byte	0x5a
 	.2byte	0x254
 	.4byte	0x22e
@@ -11694,7 +11704,7 @@ crc32_table:
 	.byte	0x6
 	.byte	0x5
 	.uleb128 0x1c
-	.4byte	.LASF1277
+	.4byte	.LASF1279
 	.byte	0x5a
 	.2byte	0x255
 	.4byte	0x120
@@ -11706,25 +11716,25 @@ crc32_table:
 	.4byte	0x86f
 	.byte	0xc
 	.uleb128 0x1c
-	.4byte	.LASF732
+	.4byte	.LASF734
 	.byte	0x5a
 	.2byte	0x258
 	.4byte	0x2d8
 	.byte	0x10
 	.uleb128 0x1c
-	.4byte	.LASF746
+	.4byte	.LASF748
 	.byte	0x5a
 	.2byte	0x259
-	.4byte	0x2bdc
+	.4byte	0x2bf2
 	.byte	0x20
 	.uleb128 0x1c
-	.4byte	.LASF1278
+	.4byte	.LASF1280
 	.byte	0x5a
 	.2byte	0x25a
-	.4byte	0x572c
+	.4byte	0x5742
 	.byte	0x40
 	.uleb128 0x39
-	.4byte	.LASF1279
+	.4byte	.LASF1281
 	.byte	0x5a
 	.2byte	0x25b
 	.4byte	0x22e
@@ -11733,7 +11743,7 @@ crc32_table:
 	.byte	0x7
 	.byte	0x48
 	.uleb128 0x39
-	.4byte	.LASF1280
+	.4byte	.LASF1282
 	.byte	0x5a
 	.2byte	0x25c
 	.4byte	0x22e
@@ -11742,7 +11752,7 @@ crc32_table:
 	.byte	0x6
 	.byte	0x48
 	.uleb128 0x39
-	.4byte	.LASF1281
+	.4byte	.LASF1283
 	.byte	0x5a
 	.2byte	0x25d
 	.4byte	0x22e
@@ -11751,7 +11761,7 @@ crc32_table:
 	.byte	0x5
 	.byte	0x48
 	.uleb128 0x39
-	.4byte	.LASF1282
+	.4byte	.LASF1284
 	.byte	0x5a
 	.2byte	0x25e
 	.4byte	0x6c
@@ -11760,7 +11770,7 @@ crc32_table:
 	.byte	0x1c
 	.byte	0x48
 	.uleb128 0x39
-	.4byte	.LASF1283
+	.4byte	.LASF1285
 	.byte	0x5a
 	.2byte	0x25f
 	.4byte	0x6c
@@ -11769,49 +11779,49 @@ crc32_table:
 	.byte	0x1b
 	.byte	0x48
 	.uleb128 0x1c
-	.4byte	.LASF1284
+	.4byte	.LASF1286
 	.byte	0x5a
 	.2byte	0x264
-	.4byte	0x2a9b
+	.4byte	0x2ab1
 	.byte	0x50
 	.uleb128 0x1c
-	.4byte	.LASF1285
+	.4byte	.LASF1287
 	.byte	0x5a
 	.2byte	0x265
 	.4byte	0x2d
 	.byte	0x88
 	.uleb128 0x1c
-	.4byte	.LASF1286
+	.4byte	.LASF1288
 	.byte	0x5a
 	.2byte	0x266
-	.4byte	0x2b34
+	.4byte	0x2b4a
 	.byte	0x90
 	.uleb128 0x1c
-	.4byte	.LASF1287
+	.4byte	.LASF1289
 	.byte	0x5a
 	.2byte	0x267
-	.4byte	0x1e92
+	.4byte	0x1ea8
 	.byte	0xc0
 	.uleb128 0x1c
-	.4byte	.LASF1288
+	.4byte	.LASF1290
 	.byte	0x5a
 	.2byte	0x268
-	.4byte	0x5737
+	.4byte	0x574d
 	.byte	0xd8
 	.uleb128 0x1c
-	.4byte	.LASF1289
+	.4byte	.LASF1291
 	.byte	0x5a
 	.2byte	0x269
 	.4byte	0x2ad
 	.byte	0xe0
 	.uleb128 0x1c
-	.4byte	.LASF1290
+	.4byte	.LASF1292
 	.byte	0x5a
 	.2byte	0x26a
 	.4byte	0x2ad
 	.byte	0xe4
 	.uleb128 0x39
-	.4byte	.LASF1291
+	.4byte	.LASF1293
 	.byte	0x5a
 	.2byte	0x26b
 	.4byte	0x6c
@@ -11820,7 +11830,7 @@ crc32_table:
 	.byte	0x1d
 	.byte	0xe8
 	.uleb128 0x39
-	.4byte	.LASF1292
+	.4byte	.LASF1294
 	.byte	0x5a
 	.2byte	0x26c
 	.4byte	0x6c
@@ -11829,7 +11839,7 @@ crc32_table:
 	.byte	0x1c
 	.byte	0xe8
 	.uleb128 0x39
-	.4byte	.LASF1293
+	.4byte	.LASF1295
 	.byte	0x5a
 	.2byte	0x26d
 	.4byte	0x6c
@@ -11838,7 +11848,7 @@ crc32_table:
 	.byte	0x1b
 	.byte	0xe8
 	.uleb128 0x39
-	.4byte	.LASF1294
+	.4byte	.LASF1296
 	.byte	0x5a
 	.2byte	0x26e
 	.4byte	0x6c
@@ -11847,7 +11857,7 @@ crc32_table:
 	.byte	0x1a
 	.byte	0xe8
 	.uleb128 0x39
-	.4byte	.LASF1295
+	.4byte	.LASF1297
 	.byte	0x5a
 	.2byte	0x26f
 	.4byte	0x6c
@@ -11856,7 +11866,7 @@ crc32_table:
 	.byte	0x19
 	.byte	0xe8
 	.uleb128 0x39
-	.4byte	.LASF1296
+	.4byte	.LASF1298
 	.byte	0x5a
 	.2byte	0x270
 	.4byte	0x22e
@@ -11865,7 +11875,7 @@ crc32_table:
 	.byte	0
 	.byte	0xe8
 	.uleb128 0x39
-	.4byte	.LASF1297
+	.4byte	.LASF1299
 	.byte	0x5a
 	.2byte	0x271
 	.4byte	0x6c
@@ -11874,7 +11884,7 @@ crc32_table:
 	.byte	0x17
 	.byte	0xe8
 	.uleb128 0x39
-	.4byte	.LASF1298
+	.4byte	.LASF1300
 	.byte	0x5a
 	.2byte	0x272
 	.4byte	0x6c
@@ -11883,7 +11893,7 @@ crc32_table:
 	.byte	0x16
 	.byte	0xe8
 	.uleb128 0x39
-	.4byte	.LASF1299
+	.4byte	.LASF1301
 	.byte	0x5a
 	.2byte	0x273
 	.4byte	0x6c
@@ -11892,7 +11902,7 @@ crc32_table:
 	.byte	0x15
 	.byte	0xe8
 	.uleb128 0x39
-	.4byte	.LASF1300
+	.4byte	.LASF1302
 	.byte	0x5a
 	.2byte	0x274
 	.4byte	0x6c
@@ -11901,7 +11911,7 @@ crc32_table:
 	.byte	0x14
 	.byte	0xe8
 	.uleb128 0x39
-	.4byte	.LASF1301
+	.4byte	.LASF1303
 	.byte	0x5a
 	.2byte	0x275
 	.4byte	0x6c
@@ -11910,84 +11920,84 @@ crc32_table:
 	.byte	0x13
 	.byte	0xe8
 	.uleb128 0x1c
-	.4byte	.LASF1302
+	.4byte	.LASF1304
 	.byte	0x5a
 	.2byte	0x276
 	.4byte	0x6c
 	.byte	0xec
 	.uleb128 0x1c
-	.4byte	.LASF1303
+	.4byte	.LASF1305
 	.byte	0x5a
 	.2byte	0x277
-	.4byte	0x52b2
+	.4byte	0x52c8
 	.byte	0xf0
 	.uleb128 0x1c
-	.4byte	.LASF1304
+	.4byte	.LASF1306
 	.byte	0x5a
 	.2byte	0x278
-	.4byte	0x5288
+	.4byte	0x529e
 	.byte	0xf4
 	.uleb128 0x1c
-	.4byte	.LASF1305
+	.4byte	.LASF1307
 	.byte	0x5a
 	.2byte	0x279
 	.4byte	0xc0
 	.byte	0xf8
 	.uleb128 0x1c
-	.4byte	.LASF1306
+	.4byte	.LASF1308
 	.byte	0x5a
 	.2byte	0x27a
 	.4byte	0xc0
 	.byte	0xfc
 	.uleb128 0x2b
-	.4byte	.LASF1307
+	.4byte	.LASF1309
 	.byte	0x5a
 	.2byte	0x27b
 	.4byte	0x2d
 	.2byte	0x100
 	.uleb128 0x2b
-	.4byte	.LASF1308
+	.4byte	.LASF1310
 	.byte	0x5a
 	.2byte	0x27c
 	.4byte	0x2d
 	.2byte	0x108
 	.uleb128 0x2b
-	.4byte	.LASF1309
+	.4byte	.LASF1311
 	.byte	0x5a
 	.2byte	0x27d
 	.4byte	0x2d
 	.2byte	0x110
 	.uleb128 0x2b
-	.4byte	.LASF1310
+	.4byte	.LASF1312
 	.byte	0x5a
 	.2byte	0x27e
 	.4byte	0x2d
 	.2byte	0x118
 	.uleb128 0x2b
-	.4byte	.LASF1311
+	.4byte	.LASF1313
 	.byte	0x5a
 	.2byte	0x280
-	.4byte	0x573d
+	.4byte	0x5753
 	.2byte	0x120
 	.uleb128 0x2b
-	.4byte	.LASF1312
+	.4byte	.LASF1314
 	.byte	0x5a
 	.2byte	0x281
-	.4byte	0x5753
+	.4byte	0x5769
 	.2byte	0x128
 	.uleb128 0x2a
 	.string	"qos"
 	.byte	0x5a
 	.2byte	0x282
-	.4byte	0x575e
+	.4byte	0x5774
 	.2byte	0x130
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1313
+	.4byte	.LASF1315
 	.byte	0xd0
 	.byte	0x5c
 	.byte	0x38
-	.4byte	0x572c
+	.4byte	0x5742
 	.uleb128 0xc
 	.4byte	.LASF60
 	.byte	0x5c
@@ -12001,7 +12011,7 @@ crc32_table:
 	.4byte	0xc0
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF732
+	.4byte	.LASF734
 	.byte	0x5c
 	.byte	0x3b
 	.4byte	0x2d8
@@ -12013,79 +12023,79 @@ crc32_table:
 	.4byte	0x86f
 	.byte	0x20
 	.uleb128 0xc
-	.4byte	.LASF1288
+	.4byte	.LASF1290
 	.byte	0x5c
 	.byte	0x3d
-	.4byte	0x5737
+	.4byte	0x574d
 	.byte	0x28
 	.uleb128 0xc
-	.4byte	.LASF1314
+	.4byte	.LASF1316
 	.byte	0x5c
 	.byte	0x3e
-	.4byte	0x2a9b
+	.4byte	0x2ab1
 	.byte	0x30
 	.uleb128 0xc
-	.4byte	.LASF1285
+	.4byte	.LASF1287
 	.byte	0x5c
 	.byte	0x3f
 	.4byte	0x2d
 	.byte	0x68
 	.uleb128 0xc
-	.4byte	.LASF1315
+	.4byte	.LASF1317
 	.byte	0x5c
 	.byte	0x40
-	.4byte	0x2a79
+	.4byte	0x2a8f
 	.byte	0x70
 	.uleb128 0xc
-	.4byte	.LASF1316
+	.4byte	.LASF1318
 	.byte	0x5c
 	.byte	0x41
-	.4byte	0x2a79
+	.4byte	0x2a8f
 	.byte	0x78
 	.uleb128 0xc
-	.4byte	.LASF1317
+	.4byte	.LASF1319
 	.byte	0x5c
 	.byte	0x42
-	.4byte	0x2a79
+	.4byte	0x2a8f
 	.byte	0x80
 	.uleb128 0xc
-	.4byte	.LASF1318
+	.4byte	.LASF1320
 	.byte	0x5c
 	.byte	0x43
-	.4byte	0x2a79
+	.4byte	0x2a8f
 	.byte	0x88
 	.uleb128 0xc
-	.4byte	.LASF1319
+	.4byte	.LASF1321
 	.byte	0x5c
 	.byte	0x44
-	.4byte	0x2a79
+	.4byte	0x2a8f
 	.byte	0x90
 	.uleb128 0xc
-	.4byte	.LASF1320
+	.4byte	.LASF1322
 	.byte	0x5c
 	.byte	0x45
 	.4byte	0x2d
 	.byte	0x98
 	.uleb128 0xc
-	.4byte	.LASF1321
+	.4byte	.LASF1323
 	.byte	0x5c
 	.byte	0x46
 	.4byte	0x2d
 	.byte	0xa0
 	.uleb128 0xc
-	.4byte	.LASF1322
+	.4byte	.LASF1324
 	.byte	0x5c
 	.byte	0x47
 	.4byte	0x2d
 	.byte	0xa8
 	.uleb128 0xc
-	.4byte	.LASF1323
+	.4byte	.LASF1325
 	.byte	0x5c
 	.byte	0x48
 	.4byte	0x2d
 	.byte	0xb0
 	.uleb128 0xc
-	.4byte	.LASF1324
+	.4byte	.LASF1326
 	.byte	0x5c
 	.byte	0x49
 	.4byte	0x2d
@@ -12094,10 +12104,10 @@ crc32_table:
 	.string	"dev"
 	.byte	0x5c
 	.byte	0x4a
-	.4byte	0x4f94
+	.4byte	0x4faa
 	.byte	0xc0
 	.uleb128 0x37
-	.4byte	.LASF817
+	.4byte	.LASF819
 	.byte	0x5c
 	.byte	0x4b
 	.4byte	0x22e
@@ -12106,7 +12116,7 @@ crc32_table:
 	.byte	0x7
 	.byte	0xc8
 	.uleb128 0x37
-	.4byte	.LASF1325
+	.4byte	.LASF1327
 	.byte	0x5c
 	.byte	0x4c
 	.4byte	0x22e
@@ -12117,83 +12127,83 @@ crc32_table:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x562a
+	.4byte	0x5640
 	.uleb128 0x18
-	.4byte	.LASF1326
+	.4byte	.LASF1328
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5732
+	.4byte	0x5748
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x52e2
+	.4byte	0x52f8
 	.uleb128 0xe
-	.4byte	0x5753
+	.4byte	0x5769
 	.uleb128 0xf
-	.4byte	0x4f94
+	.4byte	0x4faa
 	.uleb128 0xf
 	.4byte	0x115
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5743
+	.4byte	0x5759
 	.uleb128 0x18
-	.4byte	.LASF1327
+	.4byte	.LASF1329
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5759
+	.4byte	0x576f
 	.uleb128 0x19
-	.4byte	.LASF1328
+	.4byte	.LASF1330
 	.byte	0xd8
 	.byte	0x5a
 	.2byte	0x296
-	.4byte	0x57b3
+	.4byte	0x57c9
 	.uleb128 0x23
 	.string	"ops"
 	.byte	0x5a
 	.2byte	0x297
-	.4byte	0x4e47
+	.4byte	0x4e5d
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1329
+	.4byte	.LASF1331
 	.byte	0x5a
 	.2byte	0x298
-	.4byte	0x57c3
+	.4byte	0x57d9
 	.byte	0xb8
 	.uleb128 0x1c
-	.4byte	.LASF1330
+	.4byte	.LASF1332
 	.byte	0x5a
 	.2byte	0x299
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0xc0
 	.uleb128 0x1c
-	.4byte	.LASF1331
+	.4byte	.LASF1333
 	.byte	0x5a
 	.2byte	0x29a
-	.4byte	0x5282
+	.4byte	0x5298
 	.byte	0xc8
 	.uleb128 0x1c
-	.4byte	.LASF1332
+	.4byte	.LASF1334
 	.byte	0x5a
 	.2byte	0x29b
-	.4byte	0x5282
+	.4byte	0x5298
 	.byte	0xd0
 	.byte	0
 	.uleb128 0xe
-	.4byte	0x57c3
+	.4byte	0x57d9
 	.uleb128 0xf
-	.4byte	0x4f94
+	.4byte	0x4faa
 	.uleb128 0xf
 	.4byte	0x22e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x57b3
+	.4byte	0x57c9
 	.uleb128 0xd
-	.4byte	.LASF1333
+	.4byte	.LASF1335
 	.byte	0x28
 	.byte	0x5d
 	.byte	0xf
-	.4byte	0x582a
+	.4byte	0x5840
 	.uleb128 0xc
 	.4byte	.LASF98
 	.byte	0x5d
@@ -12201,31 +12211,31 @@ crc32_table:
 	.4byte	0x83d
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1334
+	.4byte	.LASF1336
 	.byte	0x5d
 	.byte	0x12
 	.4byte	0xc0
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF1335
+	.4byte	.LASF1337
 	.byte	0x5d
 	.byte	0x13
 	.4byte	0xc0
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF1336
+	.4byte	.LASF1338
 	.byte	0x5d
 	.byte	0x14
 	.4byte	0xc0
 	.byte	0xc
 	.uleb128 0xc
-	.4byte	.LASF1337
+	.4byte	.LASF1339
 	.byte	0x5d
 	.byte	0x15
 	.4byte	0xc0
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF1338
+	.4byte	.LASF1340
 	.byte	0x5d
 	.byte	0x16
 	.4byte	0x2d
@@ -12238,24 +12248,24 @@ crc32_table:
 	.byte	0x20
 	.byte	0
 	.uleb128 0x11
-	.4byte	.LASF1339
+	.4byte	.LASF1341
 	.byte	0x5d
 	.byte	0x4a
-	.4byte	0x57c9
+	.4byte	0x57df
 	.uleb128 0xd
-	.4byte	.LASF1340
+	.4byte	.LASF1342
 	.byte	0x10
 	.byte	0x5e
 	.byte	0x13
-	.4byte	0x585a
+	.4byte	0x5870
 	.uleb128 0xc
-	.4byte	.LASF1341
+	.4byte	.LASF1343
 	.byte	0x5e
 	.byte	0x15
 	.4byte	0x442
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1342
+	.4byte	.LASF1344
 	.byte	0x5e
 	.byte	0x1a
 	.4byte	0x22e
@@ -12263,13 +12273,13 @@ crc32_table:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5860
+	.4byte	0x5876
 	.uleb128 0xd
-	.4byte	.LASF1343
+	.4byte	.LASF1345
 	.byte	0xd0
 	.byte	0x5b
 	.byte	0x7a
-	.4byte	0x59ae
+	.4byte	0x59c4
 	.uleb128 0xc
 	.4byte	.LASF60
 	.byte	0x5b
@@ -12277,133 +12287,133 @@ crc32_table:
 	.4byte	0x55
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1344
+	.4byte	.LASF1346
 	.byte	0x5b
 	.byte	0x7c
 	.4byte	0x55
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF1345
+	.4byte	.LASF1347
 	.byte	0x5b
 	.byte	0x7d
-	.4byte	0x4f94
+	.4byte	0x4faa
 	.byte	0x10
 	.uleb128 0xc
-	.4byte	.LASF1346
+	.4byte	.LASF1348
 	.byte	0x5b
 	.byte	0x7e
-	.4byte	0x59ae
+	.4byte	0x59c4
 	.byte	0x18
 	.uleb128 0xc
-	.4byte	.LASF1347
+	.4byte	.LASF1349
 	.byte	0x5b
 	.byte	0x7f
-	.4byte	0x59ae
+	.4byte	0x59c4
 	.byte	0x20
 	.uleb128 0xc
-	.4byte	.LASF1348
+	.4byte	.LASF1350
 	.byte	0x5b
 	.byte	0x80
-	.4byte	0x59ae
+	.4byte	0x59c4
 	.byte	0x28
 	.uleb128 0xc
-	.4byte	.LASF1349
+	.4byte	.LASF1351
 	.byte	0x5b
 	.byte	0x82
-	.4byte	0x5afd
+	.4byte	0x5b13
 	.byte	0x30
 	.uleb128 0xc
-	.4byte	.LASF1172
+	.4byte	.LASF1174
 	.byte	0x5b
 	.byte	0x83
-	.4byte	0x5b17
+	.4byte	0x5b2d
 	.byte	0x38
 	.uleb128 0xc
-	.4byte	.LASF1350
+	.4byte	.LASF1352
 	.byte	0x5b
 	.byte	0x84
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x40
 	.uleb128 0xc
-	.4byte	.LASF1351
+	.4byte	.LASF1353
 	.byte	0x5b
 	.byte	0x85
-	.4byte	0x5282
+	.4byte	0x5298
 	.byte	0x48
 	.uleb128 0xc
-	.4byte	.LASF1352
+	.4byte	.LASF1354
 	.byte	0x5b
 	.byte	0x86
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x50
 	.uleb128 0xc
-	.4byte	.LASF1353
+	.4byte	.LASF1355
 	.byte	0x5b
 	.byte	0x87
-	.4byte	0x5282
+	.4byte	0x5298
 	.byte	0x58
 	.uleb128 0xc
-	.4byte	.LASF1354
+	.4byte	.LASF1356
 	.byte	0x5b
 	.byte	0x89
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x60
 	.uleb128 0xc
-	.4byte	.LASF1245
+	.4byte	.LASF1247
 	.byte	0x5b
 	.byte	0x8a
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x68
 	.uleb128 0xc
-	.4byte	.LASF1191
+	.4byte	.LASF1193
 	.byte	0x5b
 	.byte	0x8c
-	.4byte	0x5b31
+	.4byte	0x5b47
 	.byte	0x70
 	.uleb128 0xc
-	.4byte	.LASF1192
+	.4byte	.LASF1194
 	.byte	0x5b
 	.byte	0x8d
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x78
 	.uleb128 0xc
-	.4byte	.LASF1355
+	.4byte	.LASF1357
 	.byte	0x5b
 	.byte	0x8f
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x80
 	.uleb128 0xc
-	.4byte	.LASF1356
+	.4byte	.LASF1358
 	.byte	0x5b
 	.byte	0x91
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x88
 	.uleb128 0x10
 	.string	"pm"
 	.byte	0x5b
 	.byte	0x93
-	.4byte	0x5b37
+	.4byte	0x5b4d
 	.byte	0x90
 	.uleb128 0xc
-	.4byte	.LASF1357
+	.4byte	.LASF1359
 	.byte	0x5b
 	.byte	0x95
-	.4byte	0x5b47
+	.4byte	0x5b5d
 	.byte	0x98
 	.uleb128 0x10
 	.string	"p"
 	.byte	0x5b
 	.byte	0x97
-	.4byte	0x5b52
+	.4byte	0x5b68
 	.byte	0xa0
 	.uleb128 0xc
-	.4byte	.LASF1358
+	.4byte	.LASF1360
 	.byte	0x5b
 	.byte	0x98
 	.4byte	0x81b
 	.byte	0xa8
 	.uleb128 0xc
-	.4byte	.LASF1359
+	.4byte	.LASF1361
 	.byte	0x5b
 	.byte	0x9a
 	.4byte	0x22e
@@ -12435,27 +12445,27 @@ crc32_table:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x59b4
+	.4byte	0x59ca
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4882
+	.4byte	0x4898
 	.uleb128 0x14
 	.4byte	0xc0
-	.4byte	0x59ce
+	.4byte	0x59e4
 	.uleb128 0xf
-	.4byte	0x4f94
+	.4byte	0x4faa
 	.uleb128 0xf
-	.4byte	0x59ce
+	.4byte	0x59e4
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x59d4
+	.4byte	0x59ea
 	.uleb128 0x19
-	.4byte	.LASF1360
+	.4byte	.LASF1362
 	.byte	0xa8
 	.byte	0x5b
 	.2byte	0x12a
-	.4byte	0x5afd
+	.4byte	0x5b13
 	.uleb128 0x1c
 	.4byte	.LASF60
 	.byte	0x5b
@@ -12466,103 +12476,103 @@ crc32_table:
 	.string	"bus"
 	.byte	0x5b
 	.2byte	0x12c
-	.4byte	0x585a
+	.4byte	0x5870
 	.byte	0x8
 	.uleb128 0x1c
-	.4byte	.LASF276
+	.4byte	.LASF278
 	.byte	0x5b
 	.2byte	0x12e
-	.4byte	0x5be6
+	.4byte	0x5bfc
 	.byte	0x10
 	.uleb128 0x1c
-	.4byte	.LASF1361
+	.4byte	.LASF1363
 	.byte	0x5b
 	.2byte	0x12f
 	.4byte	0x55
 	.byte	0x18
 	.uleb128 0x1c
-	.4byte	.LASF1362
+	.4byte	.LASF1364
 	.byte	0x5b
 	.2byte	0x131
 	.4byte	0x22e
 	.byte	0x20
 	.uleb128 0x1c
-	.4byte	.LASF1363
+	.4byte	.LASF1365
 	.byte	0x5b
 	.2byte	0x132
-	.4byte	0x5bbe
+	.4byte	0x5bd4
 	.byte	0x24
 	.uleb128 0x1c
-	.4byte	.LASF1364
+	.4byte	.LASF1366
 	.byte	0x5b
 	.2byte	0x134
-	.4byte	0x5bf6
+	.4byte	0x5c0c
 	.byte	0x28
 	.uleb128 0x1c
-	.4byte	.LASF1365
+	.4byte	.LASF1367
 	.byte	0x5b
 	.2byte	0x135
-	.4byte	0x5c06
+	.4byte	0x5c1c
 	.byte	0x30
 	.uleb128 0x1c
-	.4byte	.LASF1350
+	.4byte	.LASF1352
 	.byte	0x5b
 	.2byte	0x137
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x38
 	.uleb128 0x1c
-	.4byte	.LASF1351
+	.4byte	.LASF1353
 	.byte	0x5b
 	.2byte	0x138
-	.4byte	0x5282
+	.4byte	0x5298
 	.byte	0x40
 	.uleb128 0x1c
-	.4byte	.LASF1352
+	.4byte	.LASF1354
 	.byte	0x5b
 	.2byte	0x139
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x48
 	.uleb128 0x1c
-	.4byte	.LASF1353
+	.4byte	.LASF1355
 	.byte	0x5b
 	.2byte	0x13a
-	.4byte	0x5282
+	.4byte	0x5298
 	.byte	0x50
 	.uleb128 0x1c
-	.4byte	.LASF1191
+	.4byte	.LASF1193
 	.byte	0x5b
 	.2byte	0x13b
-	.4byte	0x5b31
+	.4byte	0x5b47
 	.byte	0x58
 	.uleb128 0x1c
-	.4byte	.LASF1192
+	.4byte	.LASF1194
 	.byte	0x5b
 	.2byte	0x13c
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x60
 	.uleb128 0x1c
-	.4byte	.LASF1241
+	.4byte	.LASF1243
 	.byte	0x5b
 	.2byte	0x13d
-	.4byte	0x59ae
+	.4byte	0x59c4
 	.byte	0x68
 	.uleb128 0x23
 	.string	"pm"
 	.byte	0x5b
 	.2byte	0x13f
-	.4byte	0x5b37
+	.4byte	0x5b4d
 	.byte	0x70
 	.uleb128 0x1c
-	.4byte	.LASF1366
+	.4byte	.LASF1368
 	.byte	0x5b
 	.2byte	0x140
-	.4byte	0x5282
+	.4byte	0x5298
 	.byte	0x78
 	.uleb128 0x23
 	.string	"p"
 	.byte	0x5b
 	.2byte	0x142
-	.4byte	0x5c11
+	.4byte	0x5c27
 	.byte	0x80
 	.uleb128 0x1c
 	.4byte	.LASF66
@@ -12591,50 +12601,50 @@ crc32_table:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x59ba
+	.4byte	0x59d0
 	.uleb128 0x14
 	.4byte	0xc0
-	.4byte	0x5b17
+	.4byte	0x5b2d
 	.uleb128 0xf
-	.4byte	0x4f94
+	.4byte	0x4faa
 	.uleb128 0xf
-	.4byte	0x4d78
+	.4byte	0x4d8e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5b03
+	.4byte	0x5b19
 	.uleb128 0x14
 	.4byte	0xc0
-	.4byte	0x5b31
+	.4byte	0x5b47
 	.uleb128 0xf
-	.4byte	0x4f94
+	.4byte	0x4faa
 	.uleb128 0xf
-	.4byte	0x4e3c
+	.4byte	0x4e52
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5b1d
+	.4byte	0x5b33
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x4f80
+	.4byte	0x4f96
 	.uleb128 0x18
-	.4byte	.LASF1357
+	.4byte	.LASF1359
 	.uleb128 0x3
-	.4byte	0x5b3d
+	.4byte	0x5b53
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5b42
+	.4byte	0x5b58
 	.uleb128 0x18
-	.4byte	.LASF1367
+	.4byte	.LASF1369
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5b4d
+	.4byte	0x5b63
 	.uleb128 0x19
-	.4byte	.LASF1368
+	.4byte	.LASF1370
 	.byte	0x30
 	.byte	0x5b
 	.2byte	0x249
-	.4byte	0x5bb3
+	.4byte	0x5bc9
 	.uleb128 0x1c
 	.4byte	.LASF60
 	.byte	0x5b
@@ -12642,88 +12652,88 @@ crc32_table:
 	.4byte	0x55
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1241
+	.4byte	.LASF1243
 	.byte	0x5b
 	.2byte	0x24b
-	.4byte	0x59ae
+	.4byte	0x59c4
 	.byte	0x8
 	.uleb128 0x1c
-	.4byte	.LASF1172
+	.4byte	.LASF1174
 	.byte	0x5b
 	.2byte	0x24c
-	.4byte	0x5b17
+	.4byte	0x5b2d
 	.byte	0x10
 	.uleb128 0x1c
-	.4byte	.LASF1369
+	.4byte	.LASF1371
 	.byte	0x5b
 	.2byte	0x24d
-	.4byte	0x5db6
+	.4byte	0x5dcc
 	.byte	0x18
 	.uleb128 0x1c
-	.4byte	.LASF827
+	.4byte	.LASF829
 	.byte	0x5b
 	.2byte	0x24f
-	.4byte	0x5282
+	.4byte	0x5298
 	.byte	0x20
 	.uleb128 0x23
 	.string	"pm"
 	.byte	0x5b
 	.2byte	0x251
-	.4byte	0x5b37
+	.4byte	0x5b4d
 	.byte	0x28
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x5b58
+	.4byte	0x5b6e
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5bb3
+	.4byte	0x5bc9
 	.uleb128 0x24
-	.4byte	.LASF1363
+	.4byte	.LASF1365
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x5b
 	.byte	0xf9
-	.4byte	0x5be1
+	.4byte	0x5bf7
 	.uleb128 0x1b
-	.4byte	.LASF1370
+	.4byte	.LASF1372
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1371
+	.4byte	.LASF1373
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF1372
+	.4byte	.LASF1374
 	.byte	0x2
 	.byte	0
 	.uleb128 0x18
 	.4byte	.LASF126
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5be1
+	.4byte	0x5bf7
 	.uleb128 0x18
-	.4byte	.LASF1373
+	.4byte	.LASF1375
 	.uleb128 0x3
-	.4byte	0x5bec
+	.4byte	0x5c02
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5bf1
+	.4byte	0x5c07
 	.uleb128 0x18
-	.4byte	.LASF1374
+	.4byte	.LASF1376
 	.uleb128 0x3
-	.4byte	0x5bfc
+	.4byte	0x5c12
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5c01
+	.4byte	0x5c17
 	.uleb128 0x18
-	.4byte	.LASF1375
+	.4byte	.LASF1377
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5c0c
+	.4byte	0x5c22
 	.uleb128 0x19
-	.4byte	.LASF1240
+	.4byte	.LASF1242
 	.byte	0x98
 	.byte	0x5b
 	.2byte	0x1ae
-	.4byte	0x5d19
+	.4byte	0x5d2f
 	.uleb128 0x1c
 	.4byte	.LASF60
 	.byte	0x5b
@@ -12731,88 +12741,88 @@ crc32_table:
 	.4byte	0x55
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF276
+	.4byte	.LASF278
 	.byte	0x5b
 	.2byte	0x1b0
-	.4byte	0x5be6
+	.4byte	0x5bfc
 	.byte	0x8
 	.uleb128 0x1c
-	.4byte	.LASF1376
+	.4byte	.LASF1378
 	.byte	0x5b
 	.2byte	0x1b2
-	.4byte	0x59ae
+	.4byte	0x59c4
 	.byte	0x10
 	.uleb128 0x1c
-	.4byte	.LASF1347
+	.4byte	.LASF1349
 	.byte	0x5b
 	.2byte	0x1b3
-	.4byte	0x59ae
+	.4byte	0x59c4
 	.byte	0x18
 	.uleb128 0x1c
-	.4byte	.LASF1377
+	.4byte	.LASF1379
 	.byte	0x5b
 	.2byte	0x1b4
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.byte	0x20
 	.uleb128 0x1c
-	.4byte	.LASF1378
+	.4byte	.LASF1380
 	.byte	0x5b
 	.2byte	0x1b6
-	.4byte	0x5b17
+	.4byte	0x5b2d
 	.byte	0x28
 	.uleb128 0x1c
-	.4byte	.LASF1369
+	.4byte	.LASF1371
 	.byte	0x5b
 	.2byte	0x1b7
-	.4byte	0x5d33
+	.4byte	0x5d49
 	.byte	0x30
 	.uleb128 0x1c
-	.4byte	.LASF1379
+	.4byte	.LASF1381
 	.byte	0x5b
 	.2byte	0x1b9
-	.4byte	0x5d4a
+	.4byte	0x5d60
 	.byte	0x38
 	.uleb128 0x1c
-	.4byte	.LASF1380
+	.4byte	.LASF1382
 	.byte	0x5b
 	.2byte	0x1ba
-	.4byte	0x5282
+	.4byte	0x5298
 	.byte	0x40
 	.uleb128 0x1c
-	.4byte	.LASF1381
+	.4byte	.LASF1383
 	.byte	0x5b
 	.2byte	0x1bc
-	.4byte	0x5271
+	.4byte	0x5287
 	.byte	0x48
 	.uleb128 0x1c
-	.4byte	.LASF1382
+	.4byte	.LASF1384
 	.byte	0x5b
 	.2byte	0x1be
-	.4byte	0x4c25
+	.4byte	0x4c3b
 	.byte	0x50
 	.uleb128 0x1c
-	.4byte	.LASF1164
+	.4byte	.LASF1166
 	.byte	0x5b
 	.2byte	0x1bf
-	.4byte	0x5d5f
+	.4byte	0x5d75
 	.byte	0x58
 	.uleb128 0x1c
-	.4byte	.LASF1165
+	.4byte	.LASF1167
 	.byte	0x5b
 	.2byte	0x1c1
-	.4byte	0x5d7a
+	.4byte	0x5d90
 	.byte	0x60
 	.uleb128 0x23
 	.string	"pm"
 	.byte	0x5b
 	.2byte	0x1c3
-	.4byte	0x5b37
+	.4byte	0x5b4d
 	.byte	0x68
 	.uleb128 0x23
 	.string	"p"
 	.byte	0x5b
 	.2byte	0x1c5
-	.4byte	0x5b52
+	.4byte	0x5b68
 	.byte	0x70
 	.uleb128 0x1c
 	.4byte	.LASF66
@@ -12841,160 +12851,160 @@ crc32_table:
 	.byte	0
 	.uleb128 0x14
 	.4byte	0x1e1
-	.4byte	0x5d2d
+	.4byte	0x5d43
 	.uleb128 0xf
-	.4byte	0x4f94
+	.4byte	0x4faa
 	.uleb128 0xf
-	.4byte	0x5d2d
+	.4byte	0x5d43
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x20d
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5d19
+	.4byte	0x5d2f
 	.uleb128 0xe
-	.4byte	0x5d44
+	.4byte	0x5d5a
 	.uleb128 0xf
-	.4byte	0x5d44
+	.4byte	0x5d5a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5c17
+	.4byte	0x5c2d
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5d39
+	.4byte	0x5d4f
 	.uleb128 0x14
-	.4byte	0x29fa
-	.4byte	0x5d5f
+	.4byte	0x2a10
+	.4byte	0x5d75
 	.uleb128 0xf
-	.4byte	0x4f94
+	.4byte	0x4faa
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5d50
+	.4byte	0x5d66
 	.uleb128 0xe
-	.4byte	0x5d7a
+	.4byte	0x5d90
 	.uleb128 0xf
-	.4byte	0x4f94
+	.4byte	0x4faa
 	.uleb128 0xf
-	.4byte	0x4c5b
+	.4byte	0x4c71
 	.uleb128 0xf
-	.4byte	0x4c61
+	.4byte	0x4c77
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5d65
+	.4byte	0x5d7b
 	.uleb128 0x15
-	.4byte	.LASF1383
+	.4byte	.LASF1385
 	.byte	0x5b
 	.2byte	0x1d2
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.uleb128 0x15
-	.4byte	.LASF1384
+	.4byte	.LASF1386
 	.byte	0x5b
 	.2byte	0x1d3
-	.4byte	0x48a0
+	.4byte	0x48b6
 	.uleb128 0x14
 	.4byte	0x1e1
-	.4byte	0x5db6
+	.4byte	0x5dcc
 	.uleb128 0xf
-	.4byte	0x4f94
+	.4byte	0x4faa
 	.uleb128 0xf
-	.4byte	0x5d2d
+	.4byte	0x5d43
 	.uleb128 0xf
-	.4byte	0x4c5b
+	.4byte	0x4c71
 	.uleb128 0xf
-	.4byte	0x4c61
+	.4byte	0x4c77
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5d98
+	.4byte	0x5dae
 	.uleb128 0x19
-	.4byte	.LASF1385
+	.4byte	.LASF1387
 	.byte	0x10
 	.byte	0x5b
 	.2byte	0x30b
-	.4byte	0x5de4
+	.4byte	0x5dfa
 	.uleb128 0x1c
-	.4byte	.LASF1386
+	.4byte	.LASF1388
 	.byte	0x5b
 	.2byte	0x310
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1387
+	.4byte	.LASF1389
 	.byte	0x5b
 	.2byte	0x311
 	.4byte	0x2d
 	.byte	0x8
 	.byte	0
 	.uleb128 0x18
-	.4byte	.LASF1388
+	.4byte	.LASF1390
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5de4
+	.4byte	0x5dfa
 	.uleb128 0x1a
-	.4byte	.LASF1389
+	.4byte	.LASF1391
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x5b
 	.2byte	0x396
-	.4byte	0x5e19
+	.4byte	0x5e2f
 	.uleb128 0x1b
-	.4byte	.LASF1390
+	.4byte	.LASF1392
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1391
+	.4byte	.LASF1393
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF1392
+	.4byte	.LASF1394
 	.byte	0x2
 	.uleb128 0x1b
-	.4byte	.LASF1393
+	.4byte	.LASF1395
 	.byte	0x3
 	.byte	0
 	.uleb128 0x19
-	.4byte	.LASF1394
+	.4byte	.LASF1396
 	.byte	0x68
 	.byte	0x5b
 	.2byte	0x3a8
-	.4byte	0x5ea9
+	.4byte	0x5ebf
 	.uleb128 0x1c
-	.4byte	.LASF1395
+	.4byte	.LASF1397
 	.byte	0x5b
 	.2byte	0x3a9
 	.4byte	0x2d8
 	.byte	0
 	.uleb128 0x1c
-	.4byte	.LASF1396
+	.4byte	.LASF1398
 	.byte	0x5b
 	.2byte	0x3aa
 	.4byte	0x2d8
 	.byte	0x10
 	.uleb128 0x1c
-	.4byte	.LASF1397
+	.4byte	.LASF1399
 	.byte	0x5b
 	.2byte	0x3ab
 	.4byte	0x2d8
 	.byte	0x20
 	.uleb128 0x1c
-	.4byte	.LASF1398
+	.4byte	.LASF1400
 	.byte	0x5b
 	.2byte	0x3ac
 	.4byte	0x2d8
 	.byte	0x30
 	.uleb128 0x1c
-	.4byte	.LASF1399
+	.4byte	.LASF1401
 	.byte	0x5b
 	.2byte	0x3ad
 	.4byte	0x22e
 	.byte	0x40
 	.uleb128 0x1c
-	.4byte	.LASF703
+	.4byte	.LASF705
 	.byte	0x5b
 	.2byte	0x3ae
-	.4byte	0x5def
+	.4byte	0x5e05
 	.byte	0x44
 	.uleb128 0x1c
 	.4byte	.LASF66
@@ -13022,98 +13032,98 @@ crc32_table:
 	.byte	0x60
 	.byte	0
 	.uleb128 0x18
-	.4byte	.LASF1400
+	.4byte	.LASF1402
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5ea9
+	.4byte	0x5ebf
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5764
+	.4byte	0x577a
 	.uleb128 0x18
-	.4byte	.LASF1401
+	.4byte	.LASF1403
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5eba
+	.4byte	0x5ed0
 	.uleb128 0x18
-	.4byte	.LASF1402
+	.4byte	.LASF1404
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5ec5
+	.4byte	0x5edb
 	.uleb128 0x18
-	.4byte	.LASF1403
+	.4byte	.LASF1405
 	.uleb128 0x3
-	.4byte	0x5ed0
+	.4byte	0x5ee6
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5ed5
+	.4byte	0x5eeb
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5dbc
+	.4byte	0x5dd2
 	.uleb128 0x18
-	.4byte	.LASF1404
+	.4byte	.LASF1406
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5ee6
+	.4byte	0x5efc
 	.uleb128 0x44
 	.string	"cma"
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5ef1
+	.4byte	0x5f07
 	.uleb128 0x18
-	.4byte	.LASF1405
+	.4byte	.LASF1407
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5efc
+	.4byte	0x5f12
 	.uleb128 0x18
-	.4byte	.LASF1406
+	.4byte	.LASF1408
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5f07
+	.4byte	0x5f1d
 	.uleb128 0x18
-	.4byte	.LASF1242
+	.4byte	.LASF1244
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5f12
+	.4byte	0x5f28
 	.uleb128 0x18
-	.4byte	.LASF1243
+	.4byte	.LASF1245
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5f1d
+	.4byte	0x5f33
 	.uleb128 0x15
-	.4byte	.LASF1407
+	.4byte	.LASF1409
 	.byte	0x5b
 	.2byte	0x590
-	.4byte	0x5271
+	.4byte	0x5287
 	.uleb128 0x15
-	.4byte	.LASF1408
+	.4byte	.LASF1410
 	.byte	0x5b
 	.2byte	0x592
-	.4byte	0x5271
+	.4byte	0x5287
 	.uleb128 0x11
-	.4byte	.LASF1409
+	.4byte	.LASF1411
 	.byte	0x2
 	.byte	0x8c
 	.4byte	0x22e
 	.uleb128 0x1a
-	.4byte	.LASF1410
+	.4byte	.LASF1412
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x2
 	.2byte	0x130
-	.4byte	0x5f6f
+	.4byte	0x5f85
 	.uleb128 0x1b
-	.4byte	.LASF1411
+	.4byte	.LASF1413
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1412
+	.4byte	.LASF1414
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF1413
+	.4byte	.LASF1415
 	.byte	0x2
 	.byte	0
 	.uleb128 0x5
-	.4byte	0x5f85
-	.4byte	0x5f85
+	.4byte	0x5f9b
+	.4byte	0x5f9b
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x1
@@ -13123,814 +13133,814 @@ crc32_table:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5f8b
+	.4byte	0x5fa1
 	.uleb128 0x18
-	.4byte	.LASF1414
+	.4byte	.LASF1416
 	.uleb128 0x15
-	.4byte	.LASF1415
+	.4byte	.LASF1417
 	.byte	0x2
 	.2byte	0x13b
-	.4byte	0x5f6f
+	.4byte	0x5f85
 	.uleb128 0x24
-	.4byte	.LASF1416
+	.4byte	.LASF1418
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x5f
 	.byte	0xb
-	.4byte	0x5ff5
+	.4byte	0x600b
 	.uleb128 0x1b
-	.4byte	.LASF1417
+	.4byte	.LASF1419
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF1418
+	.4byte	.LASF1420
 	.byte	0x2
 	.uleb128 0x1b
-	.4byte	.LASF1419
+	.4byte	.LASF1421
 	.byte	0x3
 	.uleb128 0x1b
-	.4byte	.LASF1420
+	.4byte	.LASF1422
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF1421
+	.4byte	.LASF1423
 	.byte	0x5
 	.uleb128 0x1b
-	.4byte	.LASF1422
+	.4byte	.LASF1424
 	.byte	0x6
 	.uleb128 0x1b
-	.4byte	.LASF1423
+	.4byte	.LASF1425
 	.byte	0x7
 	.uleb128 0x1b
-	.4byte	.LASF1424
+	.4byte	.LASF1426
 	.byte	0x8
 	.uleb128 0x1b
-	.4byte	.LASF1425
+	.4byte	.LASF1427
 	.byte	0x9
 	.uleb128 0x1b
-	.4byte	.LASF1426
+	.4byte	.LASF1428
 	.byte	0xa
 	.uleb128 0x1b
-	.4byte	.LASF1427
+	.4byte	.LASF1429
 	.byte	0xb
 	.uleb128 0x1b
-	.4byte	.LASF1428
+	.4byte	.LASF1430
 	.byte	0xc
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF1429
+	.4byte	.LASF1431
 	.byte	0x18
 	.byte	0x5f
 	.byte	0x27
-	.4byte	0x6026
+	.4byte	0x603c
 	.uleb128 0xc
-	.4byte	.LASF1430
+	.4byte	.LASF1432
 	.byte	0x5f
 	.byte	0x28
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF737
+	.4byte	.LASF739
 	.byte	0x5f
 	.byte	0x29
-	.4byte	0x2d40
+	.4byte	0x2d56
 	.byte	0x8
 	.uleb128 0xc
-	.4byte	.LASF1431
+	.4byte	.LASF1433
 	.byte	0x5f
 	.byte	0x2a
-	.4byte	0x6026
+	.4byte	0x603c
 	.byte	0x10
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x100
 	.uleb128 0x24
-	.4byte	.LASF1432
+	.4byte	.LASF1434
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x1
 	.byte	0x14
-	.4byte	0x6067
+	.4byte	0x607d
 	.uleb128 0x1b
-	.4byte	.LASF1433
+	.4byte	.LASF1435
 	.byte	0
 	.uleb128 0x1b
-	.4byte	.LASF1434
+	.4byte	.LASF1436
 	.byte	0x1
 	.uleb128 0x1b
-	.4byte	.LASF1435
+	.4byte	.LASF1437
 	.byte	0x2
 	.uleb128 0x1b
-	.4byte	.LASF1436
+	.4byte	.LASF1438
 	.byte	0x3
 	.uleb128 0x1b
-	.4byte	.LASF1437
+	.4byte	.LASF1439
 	.byte	0x4
 	.uleb128 0x1b
-	.4byte	.LASF1438
+	.4byte	.LASF1440
 	.byte	0x5
 	.uleb128 0x1b
-	.4byte	.LASF1439
+	.4byte	.LASF1441
 	.byte	0x6
 	.byte	0
 	.uleb128 0x25
-	.4byte	.LASF1440
+	.4byte	.LASF1442
 	.2byte	0x954
 	.byte	0x1
 	.byte	0x1e
-	.4byte	0x617d
+	.4byte	0x6193
 	.uleb128 0xc
-	.4byte	.LASF1441
+	.4byte	.LASF1443
 	.byte	0x1
 	.byte	0x1f
 	.4byte	0xc0
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF1442
+	.4byte	.LASF1444
 	.byte	0x1
 	.byte	0x20
-	.4byte	0x4693
+	.4byte	0x46a9
 	.byte	0x4
 	.uleb128 0xc
-	.4byte	.LASF1443
+	.4byte	.LASF1445
 	.byte	0x1
 	.byte	0x21
-	.4byte	0x4693
+	.4byte	0x46a9
 	.byte	0x14
 	.uleb128 0xc
-	.4byte	.LASF1444
+	.4byte	.LASF1446
 	.byte	0x1
 	.byte	0x22
-	.4byte	0x4693
+	.4byte	0x46a9
 	.byte	0x24
 	.uleb128 0xc
-	.4byte	.LASF1445
+	.4byte	.LASF1447
 	.byte	0x1
 	.byte	0x23
-	.4byte	0x4693
+	.4byte	0x46a9
 	.byte	0x34
 	.uleb128 0xc
-	.4byte	.LASF1446
+	.4byte	.LASF1448
 	.byte	0x1
 	.byte	0x24
-	.4byte	0x4693
+	.4byte	0x46a9
 	.byte	0x44
 	.uleb128 0xc
-	.4byte	.LASF1447
+	.4byte	.LASF1449
 	.byte	0x1
 	.byte	0x25
-	.4byte	0x617d
+	.4byte	0x6193
 	.byte	0x54
 	.uleb128 0xc
-	.4byte	.LASF1448
+	.4byte	.LASF1450
 	.byte	0x1
 	.byte	0x26
-	.4byte	0x617d
+	.4byte	0x6193
 	.byte	0x94
 	.uleb128 0xc
-	.4byte	.LASF1449
+	.4byte	.LASF1451
 	.byte	0x1
 	.byte	0x27
-	.4byte	0x617d
+	.4byte	0x6193
 	.byte	0xd4
 	.uleb128 0x26
-	.4byte	.LASF1450
+	.4byte	.LASF1452
 	.byte	0x1
 	.byte	0x28
-	.4byte	0x617d
+	.4byte	0x6193
 	.2byte	0x114
 	.uleb128 0x26
-	.4byte	.LASF1451
+	.4byte	.LASF1453
 	.byte	0x1
 	.byte	0x29
-	.4byte	0x617d
+	.4byte	0x6193
 	.2byte	0x154
 	.uleb128 0x26
-	.4byte	.LASF1452
+	.4byte	.LASF1454
 	.byte	0x1
 	.byte	0x2a
-	.4byte	0x617d
+	.4byte	0x6193
 	.2byte	0x194
 	.uleb128 0x26
-	.4byte	.LASF1453
+	.4byte	.LASF1455
 	.byte	0x1
 	.byte	0x2b
-	.4byte	0x617d
+	.4byte	0x6193
 	.2byte	0x1d4
 	.uleb128 0x26
-	.4byte	.LASF1454
+	.4byte	.LASF1456
 	.byte	0x1
 	.byte	0x2c
-	.4byte	0x617d
+	.4byte	0x6193
 	.2byte	0x214
 	.uleb128 0x26
-	.4byte	.LASF1455
+	.4byte	.LASF1457
 	.byte	0x1
 	.byte	0x2d
-	.4byte	0x618d
+	.4byte	0x61a3
 	.2byte	0x254
 	.uleb128 0x26
-	.4byte	.LASF1456
+	.4byte	.LASF1458
 	.byte	0x1
 	.byte	0x2e
-	.4byte	0x618d
+	.4byte	0x61a3
 	.2byte	0x354
 	.uleb128 0x26
-	.4byte	.LASF1457
+	.4byte	.LASF1459
 	.byte	0x1
 	.byte	0x2f
-	.4byte	0x618d
+	.4byte	0x61a3
 	.2byte	0x454
 	.uleb128 0x26
-	.4byte	.LASF1458
+	.4byte	.LASF1460
 	.byte	0x1
 	.byte	0x30
-	.4byte	0x618d
+	.4byte	0x61a3
 	.2byte	0x554
 	.uleb128 0x26
-	.4byte	.LASF1459
+	.4byte	.LASF1461
 	.byte	0x1
 	.byte	0x31
-	.4byte	0x618d
+	.4byte	0x61a3
 	.2byte	0x654
 	.uleb128 0x26
-	.4byte	.LASF1460
+	.4byte	.LASF1462
 	.byte	0x1
 	.byte	0x32
-	.4byte	0x618d
+	.4byte	0x61a3
 	.2byte	0x754
 	.uleb128 0x26
-	.4byte	.LASF1461
+	.4byte	.LASF1463
 	.byte	0x1
 	.byte	0x33
-	.4byte	0x618d
+	.4byte	0x61a3
 	.2byte	0x854
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x60
-	.4byte	0x618d
+	.4byte	0x61a3
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x3f
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x6c
-	.4byte	0x619d
+	.4byte	0x61b3
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x3f
 	.byte	0
 	.uleb128 0x45
-	.4byte	.LASF1462
+	.4byte	.LASF1464
 	.byte	0x1
 	.byte	0x37
-	.4byte	0x61b2
+	.4byte	0x61c8
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	global_waveform
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x6067
+	.4byte	0x607d
 	.uleb128 0x5
 	.4byte	0x6c
-	.4byte	0x61c8
+	.4byte	0x61de
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0xff
 	.byte	0
 	.uleb128 0x45
-	.4byte	.LASF1463
+	.4byte	.LASF1465
 	.byte	0x1
 	.byte	0x38
-	.4byte	0x61b8
+	.4byte	0x61ce
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	crc32_table
 	.uleb128 0x46
-	.4byte	.LASF1499
+	.4byte	.LASF1501
 	.byte	0x1
 	.2byte	0x1db
 	.4byte	0xc0
-	.8byte	.LFB1564
-	.8byte	.LFE1564-.LFB1564
+	.8byte	.LFB1565
+	.8byte	.LFE1565-.LFB1565
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6990
+	.4byte	0x69a6
 	.uleb128 0x47
-	.4byte	.LASF1464
+	.4byte	.LASF1466
 	.byte	0x1
 	.2byte	0x1db
-	.4byte	0x6990
+	.4byte	0x69a6
 	.4byte	.LLST13
 	.uleb128 0x47
-	.4byte	.LASF1465
+	.4byte	.LASF1467
 	.byte	0x1
 	.2byte	0x1db
-	.4byte	0x5f9c
+	.4byte	0x5fb2
 	.4byte	.LLST14
 	.uleb128 0x47
-	.4byte	.LASF1466
+	.4byte	.LASF1468
 	.byte	0x1
 	.2byte	0x1db
 	.4byte	0xc0
 	.4byte	.LLST15
 	.uleb128 0x48
-	.4byte	.LASF1467
+	.4byte	.LASF1469
 	.byte	0x1
 	.2byte	0x1dd
-	.4byte	0x5f9c
+	.4byte	0x5fb2
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	stype.16969
+	.8byte	stype.16987
 	.uleb128 0x48
-	.4byte	.LASF1468
+	.4byte	.LASF1470
 	.byte	0x1
 	.2byte	0x1de
 	.4byte	0xc0
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	sftemp.16970
+	.8byte	sftemp.16988
 	.uleb128 0x49
 	.string	"ret"
 	.byte	0x1
 	.2byte	0x1df
 	.4byte	0xc0
 	.uleb128 0x4a
-	.4byte	0x6a5e
+	.4byte	0x6a74
 	.8byte	.LBB332
 	.8byte	.LBE332-.LBB332
 	.byte	0x1
 	.2byte	0x228
-	.4byte	0x64ae
+	.4byte	0x64c4
 	.uleb128 0x4b
-	.4byte	0x6a7b
+	.4byte	0x6a91
 	.uleb128 0x4b
-	.4byte	0x6a6f
+	.4byte	0x6a85
 	.uleb128 0x4c
 	.8byte	.LBB333
 	.8byte	.LBE333-.LBB333
 	.uleb128 0x4d
-	.4byte	0x6a87
+	.4byte	0x6a9d
 	.uleb128 0x4d
-	.4byte	0x6a93
+	.4byte	0x6aa9
 	.uleb128 0x4d
-	.4byte	0x6a9f
+	.4byte	0x6ab5
 	.uleb128 0x4d
-	.4byte	0x6aab
+	.4byte	0x6ac1
 	.uleb128 0x4a
-	.4byte	0x6d88
+	.4byte	0x6d9e
 	.8byte	.LBB334
 	.8byte	.LBE334-.LBB334
 	.byte	0x1
 	.2byte	0x188
-	.4byte	0x6367
+	.4byte	0x637d
 	.uleb128 0x4b
-	.4byte	0x6da3
+	.4byte	0x6db9
 	.uleb128 0x4b
-	.4byte	0x6d98
+	.4byte	0x6dae
 	.uleb128 0x4c
 	.8byte	.LBB335
 	.8byte	.LBE335-.LBB335
 	.uleb128 0x4e
-	.4byte	0x6dae
+	.4byte	0x6dc4
 	.4byte	.LLST16
 	.uleb128 0x4e
-	.4byte	0x6db9
+	.4byte	0x6dcf
 	.4byte	.LLST17
 	.uleb128 0x4e
-	.4byte	0x6dc4
+	.4byte	0x6dda
 	.4byte	.LLST18
 	.uleb128 0x4d
-	.4byte	0x6dcf
+	.4byte	0x6de5
 	.uleb128 0x4d
-	.4byte	0x6dda
+	.4byte	0x6df0
 	.uleb128 0x4d
-	.4byte	0x6de4
+	.4byte	0x6dfa
 	.uleb128 0x4f
-	.4byte	0x6df0
+	.4byte	0x6e06
 	.8byte	.LBB336
 	.4byte	.Ldebug_ranges0+0x1c0
 	.byte	0x1
 	.byte	0xe4
 	.uleb128 0x4b
-	.4byte	0x6e0b
+	.4byte	0x6e21
 	.uleb128 0x4b
-	.4byte	0x6e00
+	.4byte	0x6e16
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x1c0
 	.uleb128 0x4d
-	.4byte	0x6e16
+	.4byte	0x6e2c
 	.uleb128 0x4d
-	.4byte	0x6e21
+	.4byte	0x6e37
 	.uleb128 0x51
 	.4byte	.Ldebug_ranges0+0x210
-	.4byte	0x6353
+	.4byte	0x6369
 	.uleb128 0x4d
-	.4byte	0x6e2f
+	.4byte	0x6e45
 	.uleb128 0x4d
-	.4byte	0x6e3a
+	.4byte	0x6e50
 	.byte	0
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x240
 	.uleb128 0x4d
-	.4byte	0x6e47
+	.4byte	0x6e5d
 	.uleb128 0x4d
-	.4byte	0x6e52
+	.4byte	0x6e68
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4a
-	.4byte	0x6d88
+	.4byte	0x6d9e
 	.8byte	.LBB350
 	.8byte	.LBE350-.LBB350
 	.byte	0x1
 	.2byte	0x195
-	.4byte	0x6408
+	.4byte	0x641e
 	.uleb128 0x4b
-	.4byte	0x6da3
+	.4byte	0x6db9
 	.uleb128 0x4b
-	.4byte	0x6d98
+	.4byte	0x6dae
 	.uleb128 0x4c
 	.8byte	.LBB351
 	.8byte	.LBE351-.LBB351
 	.uleb128 0x4e
-	.4byte	0x6dae
+	.4byte	0x6dc4
 	.4byte	.LLST19
 	.uleb128 0x4e
-	.4byte	0x6db9
+	.4byte	0x6dcf
 	.4byte	.LLST20
 	.uleb128 0x4e
-	.4byte	0x6dc4
+	.4byte	0x6dda
 	.4byte	.LLST21
 	.uleb128 0x4d
-	.4byte	0x6dcf
+	.4byte	0x6de5
 	.uleb128 0x4d
-	.4byte	0x6dda
+	.4byte	0x6df0
 	.uleb128 0x4d
-	.4byte	0x6de4
+	.4byte	0x6dfa
 	.uleb128 0x52
-	.4byte	0x6df0
+	.4byte	0x6e06
 	.8byte	.LBB352
 	.8byte	.LBE352-.LBB352
 	.byte	0x1
 	.byte	0xe4
 	.uleb128 0x4b
-	.4byte	0x6e0b
+	.4byte	0x6e21
 	.uleb128 0x4b
-	.4byte	0x6e00
+	.4byte	0x6e16
 	.uleb128 0x4c
 	.8byte	.LBB353
 	.8byte	.LBE353-.LBB353
 	.uleb128 0x4d
-	.4byte	0x6e16
+	.4byte	0x6e2c
 	.uleb128 0x4d
-	.4byte	0x6e21
+	.4byte	0x6e37
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4a
-	.4byte	0x6d6c
+	.4byte	0x6d82
 	.8byte	.LBB354
 	.8byte	.LBE354-.LBB354
 	.byte	0x1
 	.2byte	0x196
-	.4byte	0x642a
+	.4byte	0x6440
 	.uleb128 0x4b
-	.4byte	0x6d7c
+	.4byte	0x6d92
 	.byte	0
 	.uleb128 0x4a
-	.4byte	0x6bba
+	.4byte	0x6bd0
 	.8byte	.LBB356
 	.8byte	.LBE356-.LBB356
 	.byte	0x1
 	.2byte	0x1a2
-	.4byte	0x6492
+	.4byte	0x64a8
 	.uleb128 0x4b
-	.4byte	0x6bc7
+	.4byte	0x6bdd
 	.uleb128 0x4b
-	.4byte	0x6bc7
+	.4byte	0x6bdd
 	.uleb128 0x4b
-	.4byte	0x6bd3
+	.4byte	0x6be9
 	.uleb128 0x4c
 	.8byte	.LBB357
 	.8byte	.LBE357-.LBB357
 	.uleb128 0x4d
-	.4byte	0x6bdf
+	.4byte	0x6bf5
 	.uleb128 0x4e
-	.4byte	0x6beb
+	.4byte	0x6c01
 	.4byte	.LLST22
 	.uleb128 0x4e
-	.4byte	0x6bf7
+	.4byte	0x6c0d
 	.4byte	.LLST23
 	.uleb128 0x4d
-	.4byte	0x6c03
+	.4byte	0x6c19
 	.uleb128 0x4d
-	.4byte	0x6c0f
+	.4byte	0x6c25
 	.uleb128 0x4e
-	.4byte	0x6c1b
+	.4byte	0x6c31
 	.4byte	.LLST24
 	.byte	0
 	.byte	0
 	.uleb128 0x53
 	.8byte	.LVL69
-	.4byte	0x6cc0
+	.4byte	0x6cd6
 	.uleb128 0x53
 	.8byte	.LVL76
-	.4byte	0x6cc0
+	.4byte	0x6cd6
 	.byte	0
 	.byte	0
 	.uleb128 0x54
-	.4byte	0x6b60
+	.4byte	0x6b76
 	.8byte	.LBB358
 	.4byte	.Ldebug_ranges0+0x290
 	.byte	0x1
 	.2byte	0x1fe
-	.4byte	0x66b5
+	.4byte	0x66cb
 	.uleb128 0x4b
-	.4byte	0x6b71
+	.4byte	0x6b87
 	.uleb128 0x4b
-	.4byte	0x6b71
+	.4byte	0x6b87
 	.uleb128 0x4b
-	.4byte	0x6b7d
+	.4byte	0x6b93
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x290
 	.uleb128 0x4d
-	.4byte	0x6b89
+	.4byte	0x6b9f
 	.uleb128 0x4d
-	.4byte	0x6b95
+	.4byte	0x6bab
 	.uleb128 0x4e
-	.4byte	0x6ba1
+	.4byte	0x6bb7
 	.4byte	.LLST25
 	.uleb128 0x4d
-	.4byte	0x6bad
+	.4byte	0x6bc3
 	.uleb128 0x4a
-	.4byte	0x6d88
+	.4byte	0x6d9e
 	.8byte	.LBB360
 	.8byte	.LBE360-.LBB360
 	.byte	0x1
 	.2byte	0x13f
-	.4byte	0x65a7
+	.4byte	0x65bd
 	.uleb128 0x4b
-	.4byte	0x6da3
+	.4byte	0x6db9
 	.uleb128 0x4b
-	.4byte	0x6d98
+	.4byte	0x6dae
 	.uleb128 0x4c
 	.8byte	.LBB361
 	.8byte	.LBE361-.LBB361
 	.uleb128 0x4e
-	.4byte	0x6dae
+	.4byte	0x6dc4
 	.4byte	.LLST26
 	.uleb128 0x4e
-	.4byte	0x6db9
+	.4byte	0x6dcf
 	.4byte	.LLST27
 	.uleb128 0x4e
-	.4byte	0x6dc4
+	.4byte	0x6dda
 	.4byte	.LLST28
 	.uleb128 0x4d
-	.4byte	0x6dcf
+	.4byte	0x6de5
 	.uleb128 0x4d
-	.4byte	0x6dda
+	.4byte	0x6df0
 	.uleb128 0x4d
-	.4byte	0x6de4
+	.4byte	0x6dfa
 	.uleb128 0x4f
-	.4byte	0x6df0
+	.4byte	0x6e06
 	.8byte	.LBB362
 	.4byte	.Ldebug_ranges0+0x2d0
 	.byte	0x1
 	.byte	0xe4
 	.uleb128 0x4b
-	.4byte	0x6e0b
+	.4byte	0x6e21
 	.uleb128 0x4b
-	.4byte	0x6e00
+	.4byte	0x6e16
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x2d0
 	.uleb128 0x4d
-	.4byte	0x6e16
+	.4byte	0x6e2c
 	.uleb128 0x4d
-	.4byte	0x6e21
+	.4byte	0x6e37
 	.uleb128 0x51
 	.4byte	.Ldebug_ranges0+0x320
-	.4byte	0x6593
+	.4byte	0x65a9
 	.uleb128 0x4d
-	.4byte	0x6e2f
+	.4byte	0x6e45
 	.uleb128 0x4d
-	.4byte	0x6e3a
+	.4byte	0x6e50
 	.byte	0
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x350
 	.uleb128 0x4d
-	.4byte	0x6e47
+	.4byte	0x6e5d
 	.uleb128 0x4d
-	.4byte	0x6e52
+	.4byte	0x6e68
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4a
-	.4byte	0x6c26
+	.4byte	0x6c3c
 	.8byte	.LBB376
 	.8byte	.LBE376-.LBB376
 	.byte	0x1
 	.2byte	0x14c
-	.4byte	0x668c
+	.4byte	0x66a2
 	.uleb128 0x4b
-	.4byte	0x6c36
+	.4byte	0x6c4c
 	.uleb128 0x4b
-	.4byte	0x6c36
+	.4byte	0x6c4c
 	.uleb128 0x4c
 	.8byte	.LBB377
 	.8byte	.LBE377-.LBB377
 	.uleb128 0x4d
-	.4byte	0x6c41
+	.4byte	0x6c57
 	.uleb128 0x4d
-	.4byte	0x6c4d
+	.4byte	0x6c63
 	.uleb128 0x4d
-	.4byte	0x6c59
+	.4byte	0x6c6f
 	.uleb128 0x4d
-	.4byte	0x6c63
+	.4byte	0x6c79
 	.uleb128 0x4d
-	.4byte	0x6c6d
+	.4byte	0x6c83
 	.uleb128 0x4d
-	.4byte	0x6c77
+	.4byte	0x6c8d
 	.uleb128 0x4e
-	.4byte	0x6c81
+	.4byte	0x6c97
 	.4byte	.LLST29
 	.uleb128 0x4d
-	.4byte	0x6c8d
+	.4byte	0x6ca3
 	.uleb128 0x4d
-	.4byte	0x6c99
+	.4byte	0x6caf
 	.uleb128 0x4a
-	.4byte	0x70c9
+	.4byte	0x70df
 	.8byte	.LBB378
 	.8byte	.LBE378-.LBB378
 	.byte	0x1
 	.2byte	0x109
-	.4byte	0x6666
+	.4byte	0x667c
 	.uleb128 0x4b
-	.4byte	0x70e6
+	.4byte	0x70fc
 	.uleb128 0x4b
-	.4byte	0x70da
+	.4byte	0x70f0
 	.uleb128 0x55
-	.4byte	0x70f3
+	.4byte	0x7109
 	.8byte	.LBB379
 	.8byte	.LBE379-.LBB379
 	.byte	0x2
 	.2byte	0x2e7
 	.uleb128 0x4b
-	.4byte	0x7110
+	.4byte	0x7126
 	.uleb128 0x4b
-	.4byte	0x7104
+	.4byte	0x711a
 	.uleb128 0x53
 	.8byte	.LVL109
-	.4byte	0x7306
+	.4byte	0x731c
 	.byte	0
 	.byte	0
 	.uleb128 0x4c
 	.8byte	.LBB381
 	.8byte	.LBE381-.LBB381
 	.uleb128 0x4e
-	.4byte	0x6ca6
+	.4byte	0x6cbc
 	.4byte	.LLST30
 	.uleb128 0x4e
-	.4byte	0x6cb2
+	.4byte	0x6cc8
 	.4byte	.LLST31
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
 	.8byte	.LVL81
-	.4byte	0x7312
+	.4byte	0x7328
 	.uleb128 0x53
 	.8byte	.LVL95
-	.4byte	0x7312
+	.4byte	0x7328
 	.uleb128 0x53
 	.8byte	.LVL108
-	.4byte	0x6cc0
+	.4byte	0x6cd6
 	.byte	0
 	.byte	0
 	.uleb128 0x4a
-	.4byte	0x6996
+	.4byte	0x69ac
 	.8byte	.LBB384
 	.8byte	.LBE384-.LBB384
 	.byte	0x1
 	.2byte	0x237
-	.4byte	0x6728
+	.4byte	0x673e
 	.uleb128 0x4b
-	.4byte	0x69a7
+	.4byte	0x69bd
 	.uleb128 0x4c
 	.8byte	.LBB385
 	.8byte	.LBE385-.LBB385
 	.uleb128 0x4d
-	.4byte	0x69b3
+	.4byte	0x69c9
 	.uleb128 0x4e
-	.4byte	0x69bd
+	.4byte	0x69d3
 	.4byte	.LLST32
 	.uleb128 0x4e
-	.4byte	0x69c9
+	.4byte	0x69df
 	.4byte	.LLST33
 	.uleb128 0x4e
-	.4byte	0x69d5
+	.4byte	0x69eb
 	.4byte	.LLST34
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x3a0
 	.uleb128 0x4e
-	.4byte	0x69e2
+	.4byte	0x69f8
 	.4byte	.LLST35
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x4d
-	.4byte	0x69ef
+	.4byte	0x6a05
 	.uleb128 0x4d
-	.4byte	0x69fb
+	.4byte	0x6a11
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4a
-	.4byte	0x6ab8
+	.4byte	0x6ace
 	.8byte	.LBB391
 	.8byte	.LBE391-.LBB391
 	.byte	0x1
 	.2byte	0x222
-	.4byte	0x683b
+	.4byte	0x6851
 	.uleb128 0x4b
-	.4byte	0x6ac9
+	.4byte	0x6adf
 	.uleb128 0x4b
-	.4byte	0x6ac9
+	.4byte	0x6adf
 	.uleb128 0x4b
-	.4byte	0x6ad5
+	.4byte	0x6aeb
 	.uleb128 0x4c
 	.8byte	.LBB392
 	.8byte	.LBE392-.LBB392
 	.uleb128 0x4d
-	.4byte	0x6ae1
+	.4byte	0x6af7
 	.uleb128 0x4e
-	.4byte	0x6aed
+	.4byte	0x6b03
 	.4byte	.LLST36
 	.uleb128 0x4d
-	.4byte	0x6af9
+	.4byte	0x6b0f
 	.uleb128 0x4a
-	.4byte	0x6d88
+	.4byte	0x6d9e
 	.8byte	.LBB393
 	.8byte	.LBE393-.LBB393
 	.byte	0x1
 	.2byte	0x172
-	.4byte	0x682c
+	.4byte	0x6842
 	.uleb128 0x4b
-	.4byte	0x6da3
+	.4byte	0x6db9
 	.uleb128 0x4b
-	.4byte	0x6d98
+	.4byte	0x6dae
 	.uleb128 0x4c
 	.8byte	.LBB394
 	.8byte	.LBE394-.LBB394
 	.uleb128 0x4e
-	.4byte	0x6dae
+	.4byte	0x6dc4
 	.4byte	.LLST37
 	.uleb128 0x4e
-	.4byte	0x6db9
+	.4byte	0x6dcf
 	.4byte	.LLST38
 	.uleb128 0x4e
-	.4byte	0x6dc4
+	.4byte	0x6dda
 	.4byte	.LLST39
 	.uleb128 0x4d
-	.4byte	0x6dcf
+	.4byte	0x6de5
 	.uleb128 0x4d
-	.4byte	0x6dda
+	.4byte	0x6df0
 	.uleb128 0x4d
-	.4byte	0x6de4
+	.4byte	0x6dfa
 	.uleb128 0x4f
-	.4byte	0x6df0
+	.4byte	0x6e06
 	.8byte	.LBB395
 	.4byte	.Ldebug_ranges0+0x400
 	.byte	0x1
 	.byte	0xe4
 	.uleb128 0x4b
-	.4byte	0x6e0b
+	.4byte	0x6e21
 	.uleb128 0x4b
-	.4byte	0x6e00
+	.4byte	0x6e16
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x400
 	.uleb128 0x4d
-	.4byte	0x6e16
+	.4byte	0x6e2c
 	.uleb128 0x4d
-	.4byte	0x6e21
+	.4byte	0x6e37
 	.uleb128 0x51
 	.4byte	.Ldebug_ranges0+0x450
-	.4byte	0x6818
+	.4byte	0x682e
 	.uleb128 0x4d
-	.4byte	0x6e2f
+	.4byte	0x6e45
 	.uleb128 0x4d
-	.4byte	0x6e3a
+	.4byte	0x6e50
 	.byte	0
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x480
 	.uleb128 0x4d
-	.4byte	0x6e47
+	.4byte	0x6e5d
 	.uleb128 0x4d
-	.4byte	0x6e52
+	.4byte	0x6e68
 	.byte	0
 	.byte	0
 	.byte	0
@@ -13938,91 +13948,91 @@ crc32_table:
 	.byte	0
 	.uleb128 0x53
 	.8byte	.LVL101
-	.4byte	0x6cc0
+	.4byte	0x6cd6
 	.byte	0
 	.byte	0
 	.uleb128 0x4a
-	.4byte	0x6a0a
+	.4byte	0x6a20
 	.8byte	.LBB410
 	.8byte	.LBE410-.LBB410
 	.byte	0x1
 	.2byte	0x22e
-	.4byte	0x694e
+	.4byte	0x6964
 	.uleb128 0x4b
-	.4byte	0x6a1b
+	.4byte	0x6a31
 	.uleb128 0x4b
-	.4byte	0x6a1b
+	.4byte	0x6a31
 	.uleb128 0x4b
-	.4byte	0x6a27
+	.4byte	0x6a3d
 	.uleb128 0x4c
 	.8byte	.LBB411
 	.8byte	.LBE411-.LBB411
 	.uleb128 0x4d
-	.4byte	0x6a33
+	.4byte	0x6a49
 	.uleb128 0x4e
-	.4byte	0x6a3f
+	.4byte	0x6a55
 	.4byte	.LLST40
 	.uleb128 0x4d
-	.4byte	0x6a4b
+	.4byte	0x6a61
 	.uleb128 0x4a
-	.4byte	0x6d88
+	.4byte	0x6d9e
 	.8byte	.LBB412
 	.8byte	.LBE412-.LBB412
 	.byte	0x1
 	.2byte	0x1af
-	.4byte	0x693f
+	.4byte	0x6955
 	.uleb128 0x4b
-	.4byte	0x6da3
+	.4byte	0x6db9
 	.uleb128 0x4b
-	.4byte	0x6d98
+	.4byte	0x6dae
 	.uleb128 0x4c
 	.8byte	.LBB413
 	.8byte	.LBE413-.LBB413
 	.uleb128 0x4e
-	.4byte	0x6dae
+	.4byte	0x6dc4
 	.4byte	.LLST41
 	.uleb128 0x4e
-	.4byte	0x6db9
+	.4byte	0x6dcf
 	.4byte	.LLST42
 	.uleb128 0x4e
-	.4byte	0x6dc4
+	.4byte	0x6dda
 	.4byte	.LLST43
 	.uleb128 0x4d
-	.4byte	0x6dcf
+	.4byte	0x6de5
 	.uleb128 0x4d
-	.4byte	0x6dda
+	.4byte	0x6df0
 	.uleb128 0x4d
-	.4byte	0x6de4
+	.4byte	0x6dfa
 	.uleb128 0x4f
-	.4byte	0x6df0
+	.4byte	0x6e06
 	.8byte	.LBB414
 	.4byte	.Ldebug_ranges0+0x4d0
 	.byte	0x1
 	.byte	0xe4
 	.uleb128 0x4b
-	.4byte	0x6e0b
+	.4byte	0x6e21
 	.uleb128 0x4b
-	.4byte	0x6e00
+	.4byte	0x6e16
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x4d0
 	.uleb128 0x4d
-	.4byte	0x6e16
+	.4byte	0x6e2c
 	.uleb128 0x4d
-	.4byte	0x6e21
+	.4byte	0x6e37
 	.uleb128 0x51
 	.4byte	.Ldebug_ranges0+0x520
-	.4byte	0x692b
+	.4byte	0x6941
 	.uleb128 0x4d
-	.4byte	0x6e2f
+	.4byte	0x6e45
 	.uleb128 0x4d
-	.4byte	0x6e3a
+	.4byte	0x6e50
 	.byte	0
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x550
 	.uleb128 0x4d
-	.4byte	0x6e47
+	.4byte	0x6e5d
 	.uleb128 0x4d
-	.4byte	0x6e52
+	.4byte	0x6e68
 	.byte	0
 	.byte	0
 	.byte	0
@@ -14030,74 +14040,74 @@ crc32_table:
 	.byte	0
 	.uleb128 0x53
 	.8byte	.LVL136
-	.4byte	0x6cc0
+	.4byte	0x6cd6
 	.byte	0
 	.byte	0
 	.uleb128 0x53
 	.8byte	.LVL61
-	.4byte	0x7312
+	.4byte	0x7328
 	.uleb128 0x53
 	.8byte	.LVL118
-	.4byte	0x7209
+	.4byte	0x721f
 	.uleb128 0x53
 	.8byte	.LVL122
-	.4byte	0x7209
+	.4byte	0x721f
 	.uleb128 0x53
 	.8byte	.LVL129
-	.4byte	0x7209
+	.4byte	0x721f
 	.uleb128 0x53
 	.8byte	.LVL139
-	.4byte	0x7209
+	.4byte	0x721f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x5ff5
+	.4byte	0x600b
 	.uleb128 0x56
-	.4byte	.LASF1474
+	.4byte	.LASF1476
 	.byte	0x1
 	.2byte	0x1bd
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6a0a
+	.4byte	0x6a20
 	.uleb128 0x57
-	.4byte	.LASF737
+	.4byte	.LASF739
 	.byte	0x1
 	.2byte	0x1bd
-	.4byte	0x6990
+	.4byte	0x69a6
 	.uleb128 0x49
 	.string	"i"
 	.byte	0x1
 	.2byte	0x1be
 	.4byte	0xc0
 	.uleb128 0x58
-	.4byte	.LASF1469
+	.4byte	.LASF1471
 	.byte	0x1
 	.2byte	0x1bf
 	.4byte	0x120
 	.uleb128 0x58
-	.4byte	.LASF1470
+	.4byte	.LASF1472
 	.byte	0x1
 	.2byte	0x1bf
 	.4byte	0x120
 	.uleb128 0x58
-	.4byte	.LASF1430
+	.4byte	.LASF1432
 	.byte	0x1
 	.2byte	0x1c1
 	.4byte	0xc0
 	.uleb128 0x59
 	.uleb128 0x58
-	.4byte	.LASF1471
+	.4byte	.LASF1473
 	.byte	0x1
 	.2byte	0x1c4
-	.4byte	0x2d40
+	.4byte	0x2d56
 	.uleb128 0x59
 	.uleb128 0x58
-	.4byte	.LASF1472
+	.4byte	.LASF1474
 	.byte	0x1
 	.2byte	0x1c7
 	.4byte	0x100
 	.uleb128 0x58
-	.4byte	.LASF1473
+	.4byte	.LASF1475
 	.byte	0x1
 	.2byte	0x1c8
 	.4byte	0x100
@@ -14105,34 +14115,34 @@ crc32_table:
 	.byte	0
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1475
+	.4byte	.LASF1477
 	.byte	0x1
 	.2byte	0x1a9
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6a58
+	.4byte	0x6a6e
 	.uleb128 0x57
-	.4byte	.LASF1464
+	.4byte	.LASF1466
 	.byte	0x1
 	.2byte	0x1a9
-	.4byte	0x6990
+	.4byte	0x69a6
 	.uleb128 0x57
-	.4byte	.LASF1476
+	.4byte	.LASF1478
 	.byte	0x1
 	.2byte	0x1a9
 	.4byte	0xc0
 	.uleb128 0x58
-	.4byte	.LASF1477
+	.4byte	.LASF1479
 	.byte	0x1
 	.2byte	0x1ab
-	.4byte	0x6a58
+	.4byte	0x6a6e
 	.uleb128 0x58
-	.4byte	.LASF1430
+	.4byte	.LASF1432
 	.byte	0x1
 	.2byte	0x1ac
 	.4byte	0x6c
 	.uleb128 0x58
-	.4byte	.LASF1441
+	.4byte	.LASF1443
 	.byte	0x1
 	.2byte	0x1ad
 	.4byte	0x6c
@@ -14141,190 +14151,190 @@ crc32_table:
 	.byte	0x8
 	.4byte	0x97
 	.uleb128 0x56
-	.4byte	.LASF1478
+	.4byte	.LASF1480
 	.byte	0x1
 	.2byte	0x180
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6ab8
+	.4byte	0x6ace
 	.uleb128 0x57
-	.4byte	.LASF1464
+	.4byte	.LASF1466
 	.byte	0x1
 	.2byte	0x180
-	.4byte	0x6990
+	.4byte	0x69a6
 	.uleb128 0x57
-	.4byte	.LASF1476
+	.4byte	.LASF1478
 	.byte	0x1
 	.2byte	0x180
 	.4byte	0xc0
 	.uleb128 0x58
-	.4byte	.LASF1479
+	.4byte	.LASF1481
 	.byte	0x1
 	.2byte	0x182
-	.4byte	0x5ff5
+	.4byte	0x600b
 	.uleb128 0x58
-	.4byte	.LASF1477
+	.4byte	.LASF1479
 	.byte	0x1
 	.2byte	0x183
-	.4byte	0x6a58
+	.4byte	0x6a6e
 	.uleb128 0x58
-	.4byte	.LASF1430
+	.4byte	.LASF1432
 	.byte	0x1
 	.2byte	0x184
 	.4byte	0x6c
 	.uleb128 0x58
-	.4byte	.LASF1441
+	.4byte	.LASF1443
 	.byte	0x1
 	.2byte	0x185
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1480
+	.4byte	.LASF1482
 	.byte	0x1
 	.2byte	0x16b
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6b06
+	.4byte	0x6b1c
 	.uleb128 0x57
-	.4byte	.LASF1464
+	.4byte	.LASF1466
 	.byte	0x1
 	.2byte	0x16b
-	.4byte	0x6990
+	.4byte	0x69a6
 	.uleb128 0x57
-	.4byte	.LASF1476
+	.4byte	.LASF1478
 	.byte	0x1
 	.2byte	0x16b
 	.4byte	0xc0
 	.uleb128 0x58
-	.4byte	.LASF1477
+	.4byte	.LASF1479
 	.byte	0x1
 	.2byte	0x16d
-	.4byte	0x6a58
+	.4byte	0x6a6e
 	.uleb128 0x58
-	.4byte	.LASF1430
+	.4byte	.LASF1432
 	.byte	0x1
 	.2byte	0x16e
 	.4byte	0x6c
 	.uleb128 0x58
-	.4byte	.LASF1441
+	.4byte	.LASF1443
 	.byte	0x1
 	.2byte	0x16f
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1481
+	.4byte	.LASF1483
 	.byte	0x1
 	.2byte	0x156
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6b60
+	.4byte	0x6b76
 	.uleb128 0x57
-	.4byte	.LASF1464
+	.4byte	.LASF1466
 	.byte	0x1
 	.2byte	0x156
-	.4byte	0x6990
+	.4byte	0x69a6
 	.uleb128 0x57
-	.4byte	.LASF1476
+	.4byte	.LASF1478
 	.byte	0x1
 	.2byte	0x156
 	.4byte	0xc0
 	.uleb128 0x57
-	.4byte	.LASF1465
+	.4byte	.LASF1467
 	.byte	0x1
 	.2byte	0x156
-	.4byte	0x602c
+	.4byte	0x6042
 	.uleb128 0x58
-	.4byte	.LASF1477
+	.4byte	.LASF1479
 	.byte	0x1
 	.2byte	0x158
-	.4byte	0x6a58
+	.4byte	0x6a6e
 	.uleb128 0x58
-	.4byte	.LASF1430
+	.4byte	.LASF1432
 	.byte	0x1
 	.2byte	0x159
 	.4byte	0x6c
 	.uleb128 0x58
-	.4byte	.LASF1441
+	.4byte	.LASF1443
 	.byte	0x1
 	.2byte	0x15a
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1482
+	.4byte	.LASF1484
 	.byte	0x1
 	.2byte	0x137
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6bba
+	.4byte	0x6bd0
 	.uleb128 0x57
-	.4byte	.LASF1464
+	.4byte	.LASF1466
 	.byte	0x1
 	.2byte	0x137
-	.4byte	0x6990
+	.4byte	0x69a6
 	.uleb128 0x57
-	.4byte	.LASF1476
+	.4byte	.LASF1478
 	.byte	0x1
 	.2byte	0x137
 	.4byte	0xc0
 	.uleb128 0x58
-	.4byte	.LASF1479
+	.4byte	.LASF1481
 	.byte	0x1
 	.2byte	0x139
-	.4byte	0x5ff5
+	.4byte	0x600b
 	.uleb128 0x58
-	.4byte	.LASF1477
+	.4byte	.LASF1479
 	.byte	0x1
 	.2byte	0x13a
-	.4byte	0x6a58
+	.4byte	0x6a6e
 	.uleb128 0x58
-	.4byte	.LASF1430
+	.4byte	.LASF1432
 	.byte	0x1
 	.2byte	0x13b
 	.4byte	0x6c
 	.uleb128 0x58
-	.4byte	.LASF1441
+	.4byte	.LASF1443
 	.byte	0x1
 	.2byte	0x13c
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x5a
-	.4byte	.LASF1510
+	.4byte	.LASF1512
 	.byte	0x1
 	.2byte	0x11e
 	.byte	0x1
-	.4byte	0x6c26
+	.4byte	0x6c3c
 	.uleb128 0x57
-	.4byte	.LASF1479
+	.4byte	.LASF1481
 	.byte	0x1
 	.2byte	0x11e
-	.4byte	0x6990
+	.4byte	0x69a6
 	.uleb128 0x57
-	.4byte	.LASF1464
+	.4byte	.LASF1466
 	.byte	0x1
 	.2byte	0x11f
-	.4byte	0x6990
+	.4byte	0x69a6
 	.uleb128 0x58
-	.4byte	.LASF1483
+	.4byte	.LASF1485
 	.byte	0x1
 	.2byte	0x121
 	.4byte	0xc0
 	.uleb128 0x58
-	.4byte	.LASF1484
+	.4byte	.LASF1486
 	.byte	0x1
 	.2byte	0x122
-	.4byte	0x3310
+	.4byte	0x3326
 	.uleb128 0x58
-	.4byte	.LASF1485
+	.4byte	.LASF1487
 	.byte	0x1
 	.2byte	0x122
-	.4byte	0x3310
+	.4byte	0x3326
 	.uleb128 0x58
-	.4byte	.LASF1476
+	.4byte	.LASF1478
 	.byte	0x1
 	.2byte	0x123
 	.4byte	0xc0
 	.uleb128 0x58
-	.4byte	.LASF1486
+	.4byte	.LASF1488
 	.byte	0x1
 	.2byte	0x123
 	.4byte	0xc0
@@ -14335,27 +14345,27 @@ crc32_table:
 	.4byte	0xc0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.LASF1487
+	.4byte	.LASF1489
 	.byte	0x1
 	.byte	0xfe
-	.4byte	0x2d40
+	.4byte	0x2d56
 	.byte	0x1
-	.4byte	0x6cc0
+	.4byte	0x6cd6
 	.uleb128 0x5c
-	.4byte	.LASF1479
+	.4byte	.LASF1481
 	.byte	0x1
 	.byte	0xfe
-	.4byte	0x6990
+	.4byte	0x69a6
 	.uleb128 0x58
-	.4byte	.LASF1484
+	.4byte	.LASF1486
 	.byte	0x1
 	.2byte	0x100
-	.4byte	0x2d40
+	.4byte	0x2d56
 	.uleb128 0x58
-	.4byte	.LASF1485
+	.4byte	.LASF1487
 	.byte	0x1
 	.2byte	0x100
-	.4byte	0x2d40
+	.4byte	0x2d56
 	.uleb128 0x49
 	.string	"i"
 	.byte	0x1
@@ -14377,7 +14387,7 @@ crc32_table:
 	.2byte	0x101
 	.4byte	0xc0
 	.uleb128 0x58
-	.4byte	.LASF1488
+	.4byte	.LASF1490
 	.byte	0x1
 	.2byte	0x102
 	.4byte	0xc0
@@ -14393,35 +14403,35 @@ crc32_table:
 	.4byte	0xc0
 	.uleb128 0x59
 	.uleb128 0x58
-	.4byte	.LASF1476
+	.4byte	.LASF1478
 	.byte	0x1
 	.2byte	0x110
 	.4byte	0xc0
 	.uleb128 0x58
-	.4byte	.LASF1486
+	.4byte	.LASF1488
 	.byte	0x1
 	.2byte	0x111
 	.4byte	0xc0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	.LASF1536
+	.4byte	.LASF1538
 	.byte	0x1
 	.byte	0xf0
-	.4byte	0x2d40
-	.8byte	.LFB1555
-	.8byte	.LFE1555-.LFB1555
+	.4byte	0x2d56
+	.8byte	.LFB1556
+	.8byte	.LFE1556-.LFB1556
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6d66
+	.4byte	0x6d7c
 	.uleb128 0x5e
-	.4byte	.LASF1477
+	.4byte	.LASF1479
 	.byte	0x1
 	.byte	0xf0
-	.4byte	0x6a58
+	.4byte	0x6a6e
 	.4byte	.LLST0
 	.uleb128 0x5e
-	.4byte	.LASF1441
+	.4byte	.LASF1443
 	.byte	0x1
 	.byte	0xf1
 	.4byte	0x6c
@@ -14430,87 +14440,87 @@ crc32_table:
 	.string	"out"
 	.byte	0x1
 	.byte	0xf3
-	.4byte	0x6d66
+	.4byte	0x6d7c
 	.uleb128 0x60
-	.4byte	0x70c9
+	.4byte	0x70df
 	.8byte	.LBB205
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
 	.byte	0xf5
-	.4byte	0x6d58
+	.4byte	0x6d6e
 	.uleb128 0x4b
-	.4byte	0x70e6
+	.4byte	0x70fc
 	.uleb128 0x4b
-	.4byte	0x70da
+	.4byte	0x70f0
 	.uleb128 0x61
-	.4byte	0x70f3
+	.4byte	0x7109
 	.8byte	.LBB206
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x2
 	.2byte	0x2e7
 	.uleb128 0x4b
-	.4byte	0x7110
+	.4byte	0x7126
 	.uleb128 0x4b
-	.4byte	0x7104
+	.4byte	0x711a
 	.uleb128 0x53
 	.8byte	.LVL3
-	.4byte	0x7306
+	.4byte	0x731c
 	.byte	0
 	.byte	0
 	.uleb128 0x53
 	.8byte	.LVL4
-	.4byte	0x731d
+	.4byte	0x7333
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x90
 	.uleb128 0x5b
-	.4byte	.LASF1489
+	.4byte	.LASF1491
 	.byte	0x1
 	.byte	0xeb
 	.4byte	0x90
 	.byte	0x3
-	.4byte	0x6d88
+	.4byte	0x6d9e
 	.uleb128 0x5c
-	.4byte	.LASF1477
+	.4byte	.LASF1479
 	.byte	0x1
 	.byte	0xeb
-	.4byte	0x6a58
+	.4byte	0x6a6e
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.LASF1490
+	.4byte	.LASF1492
 	.byte	0x1
 	.byte	0xba
-	.4byte	0x6a58
+	.4byte	0x6a6e
 	.byte	0x1
-	.4byte	0x6df0
+	.4byte	0x6e06
 	.uleb128 0x5c
-	.4byte	.LASF1476
+	.4byte	.LASF1478
 	.byte	0x1
 	.byte	0xba
 	.4byte	0xc0
 	.uleb128 0x5c
-	.4byte	.LASF820
+	.4byte	.LASF822
 	.byte	0x1
 	.byte	0xba
 	.4byte	0xc0
 	.uleb128 0x62
-	.4byte	.LASF1491
+	.4byte	.LASF1493
 	.byte	0x1
 	.byte	0xbc
-	.4byte	0x61b2
+	.4byte	0x61c8
 	.uleb128 0x62
-	.4byte	.LASF854
+	.4byte	.LASF856
 	.byte	0x1
 	.byte	0xbd
-	.4byte	0x2d40
+	.4byte	0x2d56
 	.uleb128 0x62
-	.4byte	.LASF1492
+	.4byte	.LASF1494
 	.byte	0x1
 	.byte	0xbe
 	.4byte	0x1e1
 	.uleb128 0x62
-	.4byte	.LASF1493
+	.4byte	.LASF1495
 	.byte	0x1
 	.byte	0xbf
 	.4byte	0x6c
@@ -14520,30 +14530,30 @@ crc32_table:
 	.byte	0xc0
 	.4byte	0x6c
 	.uleb128 0x62
-	.4byte	.LASF1477
+	.4byte	.LASF1479
 	.byte	0x1
 	.byte	0xc1
 	.4byte	0x442
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.LASF1494
+	.4byte	.LASF1496
 	.byte	0x1
 	.byte	0xa8
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6e5f
+	.4byte	0x6e75
 	.uleb128 0x5c
-	.4byte	.LASF854
+	.4byte	.LASF856
 	.byte	0x1
 	.byte	0xa8
 	.4byte	0x1e1
 	.uleb128 0x5c
-	.4byte	.LASF1476
+	.4byte	.LASF1478
 	.byte	0x1
 	.byte	0xa8
 	.4byte	0xc0
 	.uleb128 0x62
-	.4byte	.LASF882
+	.4byte	.LASF884
 	.byte	0x1
 	.byte	0xaa
 	.4byte	0xc0
@@ -14553,52 +14563,52 @@ crc32_table:
 	.byte	0xab
 	.4byte	0xc0
 	.uleb128 0x63
-	.4byte	0x6e46
+	.4byte	0x6e5c
 	.uleb128 0x62
-	.4byte	.LASF1495
+	.4byte	.LASF1497
 	.byte	0x1
 	.byte	0xad
 	.4byte	0xc0
 	.uleb128 0x62
-	.4byte	.LASF1496
+	.4byte	.LASF1498
 	.byte	0x1
 	.byte	0xad
 	.4byte	0xc0
 	.byte	0
 	.uleb128 0x59
 	.uleb128 0x62
-	.4byte	.LASF1497
+	.4byte	.LASF1499
 	.byte	0x1
 	.byte	0xae
 	.4byte	0xc0
 	.uleb128 0x62
-	.4byte	.LASF1498
+	.4byte	.LASF1500
 	.byte	0x1
 	.byte	0xae
 	.4byte	0xc0
 	.byte	0
 	.byte	0
 	.uleb128 0x64
-	.4byte	.LASF1537
+	.4byte	.LASF1539
 	.byte	0x1
 	.byte	0xa0
 	.4byte	0x55
-	.8byte	.LFB1551
-	.8byte	.LFE1551-.LFB1551
+	.8byte	.LFB1552
+	.8byte	.LFE1552-.LFB1552
 	.uleb128 0x1
 	.byte	0x9c
 	.uleb128 0x65
-	.4byte	.LASF1500
+	.4byte	.LASF1502
 	.byte	0x1
 	.byte	0x7f
 	.4byte	0xc0
-	.8byte	.LFB1550
-	.8byte	.LFE1550-.LFB1550
+	.8byte	.LFB1551
+	.8byte	.LFE1551-.LFB1551
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6ff5
+	.4byte	0x700b
 	.uleb128 0x5e
-	.4byte	.LASF1501
+	.4byte	.LASF1503
 	.byte	0x1
 	.byte	0x7f
 	.4byte	0x442
@@ -14612,153 +14622,153 @@ crc32_table:
 	.string	"wf"
 	.byte	0x1
 	.byte	0x82
-	.4byte	0x61b2
+	.4byte	0x61c8
 	.uleb128 0x60
-	.4byte	0x7027
+	.4byte	0x703d
 	.8byte	.LBB246
 	.4byte	.Ldebug_ranges0+0x120
 	.byte	0x1
 	.byte	0x87
-	.4byte	0x6ef8
+	.4byte	0x6f0e
 	.uleb128 0x4b
-	.4byte	0x7037
+	.4byte	0x704d
 	.uleb128 0x53
 	.8byte	.LVL35
-	.4byte	0x7326
+	.4byte	0x733c
 	.uleb128 0x53
 	.8byte	.LVL56
-	.4byte	0x7331
+	.4byte	0x7347
 	.byte	0
 	.uleb128 0x60
-	.4byte	0x6ff5
+	.4byte	0x700b
 	.8byte	.LBB249
 	.4byte	.Ldebug_ranges0+0x150
 	.byte	0x1
 	.byte	0x8d
-	.4byte	0x6fcd
+	.4byte	0x6fe3
 	.uleb128 0x4b
-	.4byte	0x7005
+	.4byte	0x701b
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x150
 	.uleb128 0x4d
-	.4byte	0x7010
+	.4byte	0x7026
 	.uleb128 0x4e
-	.4byte	0x701b
+	.4byte	0x7031
 	.4byte	.LLST9
 	.uleb128 0x66
-	.4byte	0x7043
+	.4byte	0x7059
 	.8byte	.LBB251
 	.8byte	.LBE251-.LBB251
 	.byte	0x1
 	.byte	0x6e
-	.4byte	0x6fbe
+	.4byte	0x6fd4
 	.uleb128 0x4b
-	.4byte	0x705e
+	.4byte	0x7074
 	.uleb128 0x4b
-	.4byte	0x7053
+	.4byte	0x7069
 	.uleb128 0x4c
 	.8byte	.LBB252
 	.8byte	.LBE252-.LBB252
 	.uleb128 0x4d
-	.4byte	0x7069
+	.4byte	0x707f
 	.uleb128 0x4e
-	.4byte	0x7072
+	.4byte	0x7088
 	.4byte	.LLST10
 	.uleb128 0x60
-	.4byte	0x707e
+	.4byte	0x7094
 	.8byte	.LBB253
 	.4byte	.Ldebug_ranges0+0x180
 	.byte	0x1
 	.byte	0x54
-	.4byte	0x6faf
+	.4byte	0x6fc5
 	.uleb128 0x4b
-	.4byte	0x7095
+	.4byte	0x70ab
 	.uleb128 0x4b
-	.4byte	0x708a
+	.4byte	0x70a0
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x180
 	.uleb128 0x4d
-	.4byte	0x70a0
+	.4byte	0x70b6
 	.uleb128 0x4d
-	.4byte	0x70a9
+	.4byte	0x70bf
 	.uleb128 0x4e
-	.4byte	0x70b2
+	.4byte	0x70c8
 	.4byte	.LLST11
 	.uleb128 0x4e
-	.4byte	0x70bd
+	.4byte	0x70d3
 	.4byte	.LLST12
 	.byte	0
 	.byte	0
 	.uleb128 0x53
 	.8byte	.LVL36
-	.4byte	0x733c
+	.4byte	0x7352
 	.byte	0
 	.byte	0
 	.uleb128 0x53
 	.8byte	.LVL51
-	.4byte	0x7331
+	.4byte	0x7347
 	.byte	0
 	.byte	0
 	.uleb128 0x53
 	.8byte	.LVL45
-	.4byte	0x7331
+	.4byte	0x7347
 	.uleb128 0x53
 	.8byte	.LVL52
-	.4byte	0x7331
+	.4byte	0x7347
 	.uleb128 0x53
 	.8byte	.LVL57
-	.4byte	0x7331
+	.4byte	0x7347
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.LASF1502
+	.4byte	.LASF1504
 	.byte	0x1
 	.byte	0x65
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x7027
+	.4byte	0x703d
 	.uleb128 0x5c
-	.4byte	.LASF1491
+	.4byte	.LASF1493
 	.byte	0x1
 	.byte	0x65
-	.4byte	0x61b2
+	.4byte	0x61c8
 	.uleb128 0x62
-	.4byte	.LASF1503
+	.4byte	.LASF1505
 	.byte	0x1
 	.byte	0x67
 	.4byte	0x120
 	.uleb128 0x62
-	.4byte	.LASF1504
+	.4byte	.LASF1506
 	.byte	0x1
 	.byte	0x68
 	.4byte	0x120
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.LASF1505
+	.4byte	.LASF1507
 	.byte	0x1
 	.byte	0x5b
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x7043
+	.4byte	0x7059
 	.uleb128 0x67
 	.string	"buf"
 	.byte	0x1
 	.byte	0x5b
-	.4byte	0x6026
+	.4byte	0x603c
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.LASF1506
+	.4byte	.LASF1508
 	.byte	0x1
 	.byte	0x4e
 	.4byte	0x6c
 	.byte	0x1
-	.4byte	0x707e
+	.4byte	0x7094
 	.uleb128 0x5c
-	.4byte	.LASF1507
+	.4byte	.LASF1509
 	.byte	0x1
 	.byte	0x4e
-	.4byte	0x6d66
+	.4byte	0x6d7c
 	.uleb128 0x5c
-	.4byte	.LASF1508
+	.4byte	.LASF1510
 	.byte	0x1
 	.byte	0x4e
 	.4byte	0x6c
@@ -14768,27 +14778,27 @@ crc32_table:
 	.byte	0x50
 	.4byte	0x6c
 	.uleb128 0x62
-	.4byte	.LASF1509
+	.4byte	.LASF1511
 	.byte	0x1
 	.byte	0x51
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x68
-	.4byte	.LASF1511
+	.4byte	.LASF1513
 	.byte	0x1
 	.byte	0x3a
 	.byte	0x1
-	.4byte	0x70c9
+	.4byte	0x70df
 	.uleb128 0x5c
-	.4byte	.LASF1512
+	.4byte	.LASF1514
 	.byte	0x1
 	.byte	0x3a
 	.4byte	0x6c
 	.uleb128 0x5c
-	.4byte	.LASF1513
+	.4byte	.LASF1515
 	.byte	0x1
 	.byte	0x3a
-	.4byte	0x2d40
+	.4byte	0x2d56
 	.uleb128 0x5f
 	.string	"i"
 	.byte	0x1
@@ -14800,25 +14810,25 @@ crc32_table:
 	.byte	0x3c
 	.4byte	0x6c
 	.uleb128 0x62
-	.4byte	.LASF1514
+	.4byte	.LASF1516
 	.byte	0x1
 	.byte	0x3d
 	.4byte	0x6c
 	.uleb128 0x62
-	.4byte	.LASF1509
+	.4byte	.LASF1511
 	.byte	0x1
 	.byte	0x3e
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1515
+	.4byte	.LASF1517
 	.byte	0x2
 	.2byte	0x2e5
 	.4byte	0x442
 	.byte	0x3
-	.4byte	0x70f3
+	.4byte	0x7109
 	.uleb128 0x57
-	.4byte	.LASF824
+	.4byte	.LASF826
 	.byte	0x2
 	.2byte	0x2e5
 	.4byte	0x261
@@ -14829,14 +14839,14 @@ crc32_table:
 	.4byte	0x277
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1516
+	.4byte	.LASF1518
 	.byte	0x2
 	.2byte	0x216
 	.4byte	0x442
 	.byte	0x3
-	.4byte	0x712b
+	.4byte	0x7141
 	.uleb128 0x57
-	.4byte	.LASF824
+	.4byte	.LASF826
 	.byte	0x2
 	.2byte	0x216
 	.4byte	0x261
@@ -14847,21 +14857,21 @@ crc32_table:
 	.4byte	0x277
 	.uleb128 0x59
 	.uleb128 0x58
-	.4byte	.LASF907
+	.4byte	.LASF909
 	.byte	0x2
 	.2byte	0x21a
 	.4byte	0x6c
 	.byte	0
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1517
+	.4byte	.LASF1519
 	.byte	0x2
 	.2byte	0x1dd
 	.4byte	0x442
 	.byte	0x3
-	.4byte	0x7161
+	.4byte	0x7177
 	.uleb128 0x57
-	.4byte	.LASF824
+	.4byte	.LASF826
 	.byte	0x2
 	.2byte	0x1dd
 	.4byte	0x261
@@ -14871,31 +14881,31 @@ crc32_table:
 	.2byte	0x1dd
 	.4byte	0x277
 	.uleb128 0x58
-	.4byte	.LASF1518
+	.4byte	.LASF1520
 	.byte	0x2
 	.2byte	0x1df
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1519
+	.4byte	.LASF1521
 	.byte	0x2
 	.2byte	0x159
 	.4byte	0x6c
 	.byte	0x3
-	.4byte	0x717f
+	.4byte	0x7195
 	.uleb128 0x57
-	.4byte	.LASF824
+	.4byte	.LASF826
 	.byte	0x2
 	.2byte	0x159
 	.4byte	0x261
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1520
+	.4byte	.LASF1522
 	.byte	0x2
 	.2byte	0x13d
-	.4byte	0x5f4b
+	.4byte	0x5f61
 	.byte	0x3
-	.4byte	0x719d
+	.4byte	0x71b3
 	.uleb128 0x57
 	.4byte	.LASF61
 	.byte	0x2
@@ -14903,25 +14913,25 @@ crc32_table:
 	.4byte	0x277
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.LASF1521
+	.4byte	.LASF1523
 	.byte	0x60
 	.byte	0x1d
 	.4byte	0xc0
 	.byte	0x3
-	.4byte	0x71b9
+	.4byte	0x71cf
 	.uleb128 0x5c
-	.4byte	.LASF824
+	.4byte	.LASF826
 	.byte	0x60
 	.byte	0x1d
 	.4byte	0x2d
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.LASF1522
+	.4byte	.LASF1524
 	.byte	0x61
 	.byte	0x22
 	.4byte	0xc0
 	.byte	0x3
-	.4byte	0x71d3
+	.4byte	0x71e9
 	.uleb128 0x67
 	.string	"n"
 	.byte	0x61
@@ -14929,12 +14939,12 @@ crc32_table:
 	.4byte	0x136
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.LASF1523
+	.4byte	.LASF1525
 	.byte	0x62
 	.byte	0x1b
 	.4byte	0xc0
 	.byte	0x3
-	.4byte	0x71ed
+	.4byte	0x7203
 	.uleb128 0x67
 	.string	"x"
 	.byte	0x62
@@ -14942,100 +14952,100 @@ crc32_table:
 	.4byte	0xe4
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.LASF1524
+	.4byte	.LASF1526
 	.byte	0x63
 	.byte	0xb
 	.4byte	0x2d
 	.byte	0x3
-	.4byte	0x7209
+	.4byte	0x721f
 	.uleb128 0x5c
-	.4byte	.LASF1525
+	.4byte	.LASF1527
 	.byte	0x63
 	.byte	0xb
 	.4byte	0x2d
 	.byte	0
 	.uleb128 0x69
-	.4byte	0x6b06
-	.8byte	.LFB1568
-	.8byte	.LFE1568-.LFB1568
+	.4byte	0x6b1c
+	.8byte	.LFB1569
+	.8byte	.LFE1569-.LFB1569
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x7306
+	.4byte	0x731c
 	.uleb128 0x6a
-	.4byte	0x6b23
+	.4byte	0x6b39
 	.4byte	.LLST2
 	.uleb128 0x6a
-	.4byte	0x6b2f
+	.4byte	0x6b45
 	.4byte	.LLST3
 	.uleb128 0x4b
-	.4byte	0x6b17
+	.4byte	0x6b2d
 	.uleb128 0x4b
-	.4byte	0x6b17
+	.4byte	0x6b2d
 	.uleb128 0x4d
-	.4byte	0x6b3b
+	.4byte	0x6b51
 	.uleb128 0x4e
-	.4byte	0x6b47
+	.4byte	0x6b5d
 	.4byte	.LLST4
 	.uleb128 0x4d
-	.4byte	0x6b53
+	.4byte	0x6b69
 	.uleb128 0x54
-	.4byte	0x6d88
+	.4byte	0x6d9e
 	.8byte	.LBB222
 	.4byte	.Ldebug_ranges0+0x40
 	.byte	0x1
 	.2byte	0x15d
-	.4byte	0x72f8
+	.4byte	0x730e
 	.uleb128 0x4b
-	.4byte	0x6da3
+	.4byte	0x6db9
 	.uleb128 0x4b
-	.4byte	0x6d98
+	.4byte	0x6dae
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x40
 	.uleb128 0x4e
-	.4byte	0x6dae
+	.4byte	0x6dc4
 	.4byte	.LLST5
 	.uleb128 0x4e
-	.4byte	0x6db9
+	.4byte	0x6dcf
 	.4byte	.LLST6
 	.uleb128 0x4e
-	.4byte	0x6dc4
+	.4byte	0x6dda
 	.4byte	.LLST7
 	.uleb128 0x4d
-	.4byte	0x6dcf
+	.4byte	0x6de5
 	.uleb128 0x4d
-	.4byte	0x6dda
+	.4byte	0x6df0
 	.uleb128 0x4d
-	.4byte	0x6de4
+	.4byte	0x6dfa
 	.uleb128 0x4f
-	.4byte	0x6df0
+	.4byte	0x6e06
 	.8byte	.LBB224
 	.4byte	.Ldebug_ranges0+0x90
 	.byte	0x1
 	.byte	0xe4
 	.uleb128 0x4b
-	.4byte	0x6e0b
+	.4byte	0x6e21
 	.uleb128 0x4b
-	.4byte	0x6e00
+	.4byte	0x6e16
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0x90
 	.uleb128 0x4d
-	.4byte	0x6e16
+	.4byte	0x6e2c
 	.uleb128 0x4d
-	.4byte	0x6e21
+	.4byte	0x6e37
 	.uleb128 0x51
 	.4byte	.Ldebug_ranges0+0xc0
-	.4byte	0x72e4
+	.4byte	0x72fa
 	.uleb128 0x4d
-	.4byte	0x6e2f
+	.4byte	0x6e45
 	.uleb128 0x4d
-	.4byte	0x6e3a
+	.4byte	0x6e50
 	.byte	0
 	.uleb128 0x50
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x4d
-	.4byte	0x6e47
+	.4byte	0x6e5d
 	.uleb128 0x4d
-	.4byte	0x6e52
+	.4byte	0x6e68
 	.byte	0
 	.byte	0
 	.byte	0
@@ -15043,34 +15053,34 @@ crc32_table:
 	.byte	0
 	.uleb128 0x53
 	.8byte	.LVL19
-	.4byte	0x6cc0
+	.4byte	0x6cd6
 	.byte	0
 	.uleb128 0x6b
-	.4byte	.LASF1526
-	.4byte	.LASF1526
+	.4byte	.LASF1528
+	.4byte	.LASF1528
 	.byte	0x2
 	.2byte	0x184
 	.uleb128 0x6c
-	.4byte	.LASF1527
-	.4byte	.LASF1527
+	.4byte	.LASF1529
+	.4byte	.LASF1529
 	.byte	0x2
 	.byte	0xb9
 	.uleb128 0x6d
+	.4byte	.LASF1532
+	.4byte	.LASF1532
+	.uleb128 0x6c
 	.4byte	.LASF1530
 	.4byte	.LASF1530
-	.uleb128 0x6c
-	.4byte	.LASF1528
-	.4byte	.LASF1528
 	.byte	0x64
 	.byte	0x1e
 	.uleb128 0x6c
-	.4byte	.LASF1529
-	.4byte	.LASF1529
+	.4byte	.LASF1531
+	.4byte	.LASF1531
 	.byte	0xe
 	.byte	0xb0
 	.uleb128 0x6d
-	.4byte	.LASF1531
-	.4byte	.LASF1531
+	.4byte	.LASF1533
+	.4byte	.LASF1533
 	.byte	0
 	.section	.debug_abbrev,"",@progbits
 .Ldebug_abbrev0:
@@ -16556,7 +16566,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL127-.Ltext0
-	.8byte	.LFE1564-.Ltext0
+	.8byte	.LFE1565-.Ltext0
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -16595,7 +16605,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x51
 	.8byte	.LVL127-.Ltext0
-	.8byte	.LFE1564-.Ltext0
+	.8byte	.LFE1565-.Ltext0
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
@@ -16751,7 +16761,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x52
 	.8byte	.LVL141-.Ltext0
-	.8byte	.LFE1564-.Ltext0
+	.8byte	.LFE1565-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
@@ -16762,7 +16772,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x53
 	.8byte	.LVL141-.Ltext0
-	.8byte	.LFE1564-.Ltext0
+	.8byte	.LFE1565-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
@@ -16773,7 +16783,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x55
 	.8byte	.LVL141-.Ltext0
-	.8byte	.LFE1564-.Ltext0
+	.8byte	.LFE1565-.Ltext0
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
@@ -16975,7 +16985,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL55-.Ltext0
-	.8byte	.LFE1550-.Ltext0
+	.8byte	.LFE1551-.Ltext0
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
@@ -17046,7 +17056,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x52
 	.8byte	.LVL21-.Ltext0
-	.8byte	.LFE1568-.Ltext0
+	.8byte	.LFE1569-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
@@ -17061,7 +17071,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x53
 	.8byte	.LVL21-.Ltext0
-	.8byte	.LFE1568-.Ltext0
+	.8byte	.LFE1569-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
@@ -17083,7 +17093,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL20-.Ltext0
-	.8byte	.LFE1568-.Ltext0
+	.8byte	.LFE1569-.Ltext0
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -17114,7 +17124,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x56
 	.8byte	.LVL32-.Ltext0
-	.8byte	.LFE1568-.Ltext0
+	.8byte	.LFE1569-.Ltext0
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
@@ -17145,7 +17155,7 @@ crc32_table:
 	.2byte	0x1
 	.byte	0x54
 	.8byte	.LVL31-.Ltext0
-	.8byte	.LFE1568-.Ltext0
+	.8byte	.LFE1569-.Ltext0
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
@@ -17347,321 +17357,321 @@ crc32_table:
 	.section	.debug_line,"",@progbits
 .Ldebug_line0:
 	.section	.debug_str,"MS",@progbits,1
-.LASF1340:
+.LASF1342:
 	.string	"dev_archdata"
-.LASF1420:
+.LASF1422:
 	.string	"WF_TYPE_GRAY2"
-.LASF1419:
+.LASF1421:
 	.string	"WF_TYPE_GRAY4"
-.LASF641:
+.LASF643:
 	.string	"lru_lock"
-.LASF777:
+.LASF779:
 	.string	"llc_id"
-.LASF996:
+.LASF998:
 	.string	"task_io_accounting"
-.LASF1292:
+.LASF1294:
 	.string	"idle_notification"
-.LASF618:
+.LASF620:
 	.string	"inactive_age"
-.LASF853:
+.LASF855:
 	.string	"event"
-.LASF565:
+.LASF567:
 	.string	"NR_BOUNCE"
-.LASF601:
+.LASF603:
 	.string	"NR_ION_HEAP"
-.LASF704:
+.LASF706:
 	.string	"__early_cpu_boot_status"
-.LASF527:
+.LASF529:
 	.string	"ADDR_NO_RANDOMIZE"
-.LASF761:
+.LASF763:
 	.string	"section_mem_map"
-.LASF556:
+.LASF558:
 	.string	"NR_ZONE_INACTIVE_ANON"
-.LASF1064:
+.LASF1066:
 	.string	"runnable_weight"
-.LASF319:
+.LASF321:
 	.string	"pushable_dl_tasks"
-.LASF699:
+.LASF701:
 	.string	"cpu_number"
 .LASF132:
 	.string	"locked_pending"
-.LASF343:
+.LASF345:
 	.string	"stack_canary"
-.LASF1504:
+.LASF1506:
 	.string	"readcrc"
-.LASF324:
+.LASF326:
 	.string	"exit_code"
-.LASF396:
+.LASF398:
 	.string	"pi_top_task"
-.LASF1269:
+.LASF1271:
 	.string	"in_dpm_list"
-.LASF1458:
+.LASF1460:
 	.string	"glr16_list"
-.LASF1403:
+.LASF1405:
 	.string	"dma_map_ops"
-.LASF879:
+.LASF881:
 	.string	"PIDTYPE_MAX"
 .LASF159:
 	.string	"__stop___jump_table"
 .LASF39:
 	.string	"gid_t"
-.LASF1094:
+.LASF1096:
 	.string	"dl_overrun"
-.LASF1139:
+.LASF1141:
 	.string	"attrs"
-.LASF732:
+.LASF734:
 	.string	"entry"
-.LASF543:
+.LASF545:
 	.string	"MIGRATE_PCPTYPES"
 .LASF110:
 	.string	"sysctl_panic_on_stackoverflow"
-.LASF237:
+.LASF239:
 	.string	"__idmap_text_end"
 .LASF168:
 	.string	"sign"
-.LASF1359:
+.LASF1361:
 	.string	"need_parent_lock"
-.LASF845:
+.LASF847:
 	.string	"mkdir"
-.LASF1499:
+.LASF1501:
 	.string	"rkf_wf_get_lut"
 .LASF37:
 	.string	"_Bool"
 .LASF135:
 	.string	"arch_spinlock_t"
-.LASF787:
+.LASF789:
 	.string	"idr_next"
-.LASF225:
+.LASF227:
 	.string	"__nosave_end"
-.LASF335:
+.LASF337:
 	.string	"in_iowait"
-.LASF1275:
+.LASF1277:
 	.string	"early_init"
-.LASF414:
+.LASF416:
 	.string	"cpuset_slab_spread_rotor"
-.LASF358:
+.LASF360:
 	.string	"gtime"
-.LASF482:
+.LASF484:
 	.string	"mm_segment_t"
-.LASF1271:
+.LASF1273:
 	.string	"is_suspended"
-.LASF811:
+.LASF813:
 	.string	"syscall_ops"
-.LASF365:
+.LASF367:
 	.string	"real_start_time"
-.LASF738:
+.LASF740:
 	.string	"workqueue_struct"
-.LASF949:
+.LASF951:
 	.string	"_tid"
-.LASF995:
+.LASF997:
 	.string	"tlbflush_unmap_batch"
-.LASF1405:
+.LASF1407:
 	.string	"removed_region"
 .LASF130:
 	.string	"locked"
-.LASF708:
+.LASF710:
 	.string	"arch_timer_read_ool_enabled"
-.LASF513:
+.LASF515:
 	.string	"seqcount"
-.LASF462:
+.LASF464:
 	.string	"TT_NONE"
-.LASF765:
+.LASF767:
 	.string	"pcpu_unit_offsets"
 .LASF103:
 	.string	"oops_in_progress"
-.LASF665:
+.LASF667:
 	.string	"nr_reserved_highatomic"
-.LASF561:
+.LASF563:
 	.string	"NR_ZONE_WRITE_PENDING"
-.LASF756:
+.LASF758:
 	.string	"movable_zone"
-.LASF510:
+.LASF512:
 	.string	"__sched_text_end"
-.LASF1227:
+.LASF1229:
 	.string	"dma_pfn_offset"
-.LASF534:
+.LASF536:
 	.string	"WHOLE_SECONDS"
-.LASF1381:
+.LASF1383:
 	.string	"shutdown_pre"
-.LASF293:
+.LASF295:
 	.string	"prio"
 .LASF143:
 	.string	"spinlock_t"
-.LASF577:
+.LASF579:
 	.string	"NR_SLAB_UNRECLAIMABLE"
 .LASF208:
 	.string	"__kprobes_text_start"
-.LASF583:
+.LASF585:
 	.string	"WORKINGSET_NODERECLAIM"
-.LASF747:
+.LASF749:
 	.string	"done"
-.LASF753:
+.LASF755:
 	.string	"blocking_notifier_head"
-.LASF897:
+.LASF899:
 	.string	"hrtimer_restart"
-.LASF507:
+.LASF509:
 	.string	"gfp_mask"
-.LASF374:
+.LASF376:
 	.string	"nameidata"
 .LASF201:
 	.string	"_einittext"
 .LASF139:
 	.string	"raw_lock"
-.LASF488:
+.LASF490:
 	.string	"cpumask_t"
-.LASF829:
+.LASF831:
 	.string	"seq_start"
-.LASF803:
+.LASF805:
 	.string	"kuid_t"
-.LASF1451:
+.LASF1453:
 	.string	"glr16_temp_list"
-.LASF832:
+.LASF834:
 	.string	"read"
-.LASF925:
+.LASF927:
 	.string	"clock_base"
-.LASF685:
+.LASF687:
 	.string	"vm_numa_stat"
-.LASF677:
+.LASF679:
 	.string	"compact_cached_free_pfn"
-.LASF1365:
+.LASF1367:
 	.string	"acpi_match_table"
-.LASF296:
+.LASF298:
 	.string	"rt_priority"
-.LASF1083:
+.LASF1085:
 	.string	"dl_runtime"
-.LASF819:
+.LASF821:
 	.string	"priv"
-.LASF1153:
+.LASF1155:
 	.string	"show"
 .LASF128:
 	.string	"hex_asc"
-.LASF506:
+.LASF508:
 	.string	"xa_lock"
-.LASF280:
+.LASF282:
 	.string	"thread_info"
 .LASF149:
 	.string	"entries"
-.LASF1127:
+.LASF1129:
 	.string	"uprobe_task"
-.LASF465:
+.LASF467:
 	.string	"uaddr"
-.LASF306:
+.LASF308:
 	.string	"cpus_requested"
 .LASF81:
 	.string	"reset_devices"
-.LASF409:
+.LASF411:
 	.string	"acct_vm_mem1"
-.LASF1455:
+.LASF1457:
 	.string	"reset_list"
-.LASF1099:
+.LASF1101:
 	.string	"rcu_special"
 .LASF49:
 	.string	"next"
-.LASF1254:
+.LASF1256:
 	.string	"RPM_SUSPENDING"
-.LASF503:
+.LASF505:
 	.string	"slots"
-.LASF742:
+.LASF744:
 	.string	"system_unbound_wq"
-.LASF1317:
+.LASF1319:
 	.string	"last_time"
 .LASF47:
 	.string	"counter"
-.LASF1069:
+.LASF1071:
 	.string	"prev_sum_exec_runtime"
-.LASF1346:
+.LASF1348:
 	.string	"bus_groups"
-.LASF578:
+.LASF580:
 	.string	"NR_ISOLATED_ANON"
-.LASF968:
+.LASF970:
 	.string	"_arch"
-.LASF325:
+.LASF327:
 	.string	"exit_signal"
-.LASF1223:
+.LASF1225:
 	.string	"dma_ops"
 .LASF54:
 	.string	"hlist_node"
-.LASF1437:
+.LASF1439:
 	.string	"RKF_WF_GLR16"
-.LASF734:
+.LASF736:
 	.string	"sysctl_timer_migration"
-.LASF1006:
+.LASF1008:
 	.string	"RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT_BIT"
-.LASF962:
+.LASF964:
 	.string	"_addr_bnd"
-.LASF404:
+.LASF406:
 	.string	"ptrace_message"
-.LASF806:
+.LASF808:
 	.string	"subdirs"
-.LASF1402:
+.LASF1404:
 	.string	"dev_pin_info"
-.LASF517:
+.LASF519:
 	.string	"_unused_nodemask_arg_"
-.LASF661:
+.LASF663:
 	.string	"ZONE_MOVABLE"
-.LASF1140:
+.LASF1142:
 	.string	"bin_attrs"
-.LASF244:
+.LASF246:
 	.string	"__entry_tramp_text_start"
 .LASF28:
 	.string	"__kernel_timer_t"
-.LASF560:
+.LASF562:
 	.string	"NR_ZONE_UNEVICTABLE"
-.LASF422:
+.LASF424:
 	.string	"perf_event_mutex"
-.LASF1378:
+.LASF1380:
 	.string	"dev_uevent"
-.LASF1004:
+.LASF1006:
 	.string	"cancelled_write_bytes"
-.LASF1074:
+.LASF1076:
 	.string	"my_q"
-.LASF265:
+.LASF267:
 	.string	"sve_vl"
-.LASF379:
+.LASF381:
 	.string	"signal"
 .LASF200:
 	.string	"_sinittext"
-.LASF965:
+.LASF967:
 	.string	"_band"
-.LASF724:
+.LASF726:
 	.string	"tick_nsec"
-.LASF715:
+.LASF717:
 	.string	"read_cntp_tval_el0"
-.LASF1070:
+.LASF1072:
 	.string	"nr_migrations"
-.LASF656:
+.LASF658:
 	.string	"per_cpu_nodestat"
-.LASF663:
+.LASF665:
 	.string	"zone"
-.LASF864:
+.LASF866:
 	.string	"KOBJ_NS_TYPE_NET"
-.LASF791:
+.LASF793:
 	.string	"__rb_parent_color"
-.LASF239:
+.LASF241:
 	.string	"__initdata_end"
-.LASF1524:
+.LASF1526:
 	.string	"__fls"
-.LASF978:
+.LASF980:
 	.string	"si_errno"
-.LASF667:
+.LASF669:
 	.string	"zone_pgdat"
-.LASF650:
+.LASF652:
 	.string	"per_cpu_pages"
 .LASF215:
 	.string	"__irqentry_text_end"
-.LASF423:
+.LASF425:
 	.string	"perf_event_list"
 .LASF36:
 	.string	"bool"
 .LASF169:
 	.string	"visible"
-.LASF1367:
+.LASF1369:
 	.string	"subsys_private"
-.LASF873:
+.LASF875:
 	.string	"compat_time_t"
-.LASF1500:
+.LASF1502:
 	.string	"rkf_wf_input"
-.LASF1276:
+.LASF1278:
 	.string	"direct_complete"
 .LASF101:
 	.string	"vendor_panic_cb"
@@ -17669,881 +17679,883 @@ crc32_table:
 	.string	"_edata"
 .LASF23:
 	.string	"__kernel_size_t"
-.LASF1114:
+.LASF1116:
 	.string	"signal_struct"
 .LASF100:
 	.string	"panic_notifier_list"
-.LASF884:
+.LASF886:
 	.string	"numbers"
-.LASF1417:
+.LASF1419:
 	.string	"WF_TYPE_RESET"
 .LASF166:
 	.string	"FTR_HIGHER_OR_ZERO_SAFE"
-.LASF257:
+.LASF259:
 	.string	"perf_event"
-.LASF1131:
+.LASF1133:
 	.string	"rseq_event_mask_bits"
-.LASF972:
+.LASF974:
 	.string	"_sigchld"
-.LASF1434:
+.LASF1436:
 	.string	"RKF_WF_DU"
-.LASF529:
+.LASF531:
 	.string	"MMAP_PAGE_ZERO"
-.LASF784:
+.LASF786:
 	.string	"gfp_allowed_mask"
 .LASF181:
 	.string	"cpu_hwcaps"
-.LASF892:
+.LASF894:
 	.string	"prio_list"
-.LASF1107:
+.LASF1109:
 	.string	"futex_state"
-.LASF801:
+.LASF803:
 	.string	"user_namespace"
-.LASF958:
+.LASF960:
 	.string	"_upper"
-.LASF1431:
+.LASF1433:
 	.string	"wf_table"
-.LASF557:
+.LASF559:
 	.string	"NR_ZONE_ACTIVE_ANON"
-.LASF1060:
+.LASF1062:
 	.string	"nr_wakeups_passive"
-.LASF589:
+.LASF591:
 	.string	"NR_WRITEBACK_TEMP"
-.LASF547:
+.LASF549:
 	.string	"migratetype_names"
-.LASF393:
+.LASF395:
 	.string	"pi_lock"
-.LASF850:
+.LASF852:
 	.string	"kernfs_open_file"
-.LASF461:
+.LASF463:
 	.string	"timespec_type"
 .LASF74:
 	.string	"initcall_entry_t"
-.LASF991:
+.LASF993:
 	.string	"task_rss_stat"
-.LASF1307:
+.LASF1309:
 	.string	"last_busy"
-.LASF523:
+.LASF525:
 	.string	"N_MEMORY"
-.LASF776:
+.LASF778:
 	.string	"package_id"
-.LASF522:
+.LASF524:
 	.string	"N_HIGH_MEMORY"
-.LASF1368:
+.LASF1370:
 	.string	"device_type"
-.LASF1125:
+.LASF1127:
 	.string	"mem_cgroup"
-.LASF332:
+.LASF334:
 	.string	"sched_remote_wakeup"
-.LASF643:
+.LASF645:
 	.string	"per_cpu_nodestats"
-.LASF1059:
+.LASF1061:
 	.string	"nr_wakeups_affine_attempts"
-.LASF476:
+.LASF478:
 	.string	"has_timeout"
-.LASF676:
+.LASF678:
 	.string	"percpu_drift_mark"
-.LASF331:
+.LASF333:
 	.string	"sched_migrated"
-.LASF905:
+.LASF907:
 	.string	"hrtimer_clock_base"
-.LASF1183:
+.LASF1185:
 	.string	"pm_power_off"
-.LASF711:
+.LASF713:
 	.string	"ate_match_local_cap_id"
-.LASF900:
+.LASF902:
 	.string	"hrtimer"
-.LASF344:
+.LASF346:
 	.string	"real_parent"
-.LASF361:
+.LASF363:
 	.string	"prev_cputime"
-.LASF1244:
+.LASF1246:
 	.string	"offline_disabled"
-.LASF490:
+.LASF492:
 	.string	"__cpu_possible_mask"
-.LASF1019:
+.LASF1021:
 	.string	"load_weight"
-.LASF916:
+.LASF918:
 	.string	"softirq_activated"
-.LASF415:
+.LASF417:
 	.string	"cgroups"
-.LASF1363:
+.LASF1365:
 	.string	"probe_type"
-.LASF1075:
+.LASF1077:
 	.string	"sched_rt_entity"
-.LASF948:
+.LASF950:
 	.string	"_uid"
-.LASF971:
+.LASF973:
 	.string	"_timer"
-.LASF757:
+.LASF759:
 	.string	"sysctl_lowmem_reserve_ratio"
-.LASF886:
+.LASF888:
 	.string	"pidfd_fops"
-.LASF707:
+.LASF709:
 	.string	"arch_timer_read_counter"
-.LASF1036:
+.LASF1038:
 	.string	"wait_max"
-.LASF889:
+.LASF891:
 	.string	"refs"
-.LASF478:
+.LASF480:
 	.string	"futex"
-.LASF860:
+.LASF862:
 	.string	"poll_table_struct"
-.LASF696:
-	.string	"llist_node"
 .LASF698:
+	.string	"llist_node"
+.LASF700:
 	.string	"__per_cpu_offset"
-.LASF1478:
+.LASF1480:
 	.string	"parse_wf_auto"
-.LASF469:
+.LASF471:
 	.string	"rmtp"
-.LASF326:
+.LASF328:
 	.string	"pdeath_signal"
-.LASF1106:
-	.string	"__UNIQUE_ID_android_kabi_hide47"
 .LASF1108:
+	.string	"__UNIQUE_ID_android_kabi_hide47"
+.LASF1110:
 	.string	"__UNIQUE_ID_android_kabi_hide48"
-.LASF930:
+.LASF932:
 	.string	"HRTIMER_BASE_TAI"
-.LASF451:
+.LASF453:
 	.string	"futex_exit_mutex"
-.LASF1408:
+.LASF1410:
 	.string	"platform_notify_remove"
-.LASF795:
+.LASF797:
 	.string	"rb_root_cached"
-.LASF386:
+.LASF388:
 	.string	"sas_ss_flags"
-.LASF680:
+.LASF682:
 	.string	"compact_defer_shift"
-.LASF1226:
+.LASF1228:
 	.string	"bus_dma_mask"
-.LASF653:
+.LASF655:
 	.string	"per_cpu_pageset"
-.LASF967:
+.LASF969:
 	.string	"_syscall"
-.LASF1415:
+.LASF1417:
 	.string	"kmalloc_caches"
-.LASF915:
+.LASF917:
 	.string	"hang_detected"
-.LASF624:
+.LASF626:
 	.string	"nr_zones"
 .LASF193:
 	.string	"_data"
-.LASF798:
+.LASF800:
 	.string	"overflowgid"
-.LASF896:
+.LASF898:
 	.string	"timerqueue_head"
-.LASF1105:
+.LASF1107:
 	.string	"wake_q_node"
-.LASF1450:
+.LASF1452:
 	.string	"gl16_temp_list"
-.LASF838:
+.LASF840:
 	.string	"generation"
-.LASF1456:
+.LASF1458:
 	.string	"gc16_list"
-.LASF380:
+.LASF382:
 	.string	"sighand"
-.LASF526:
+.LASF528:
 	.string	"UNAME26"
-.LASF907:
+.LASF909:
 	.string	"index"
-.LASF1400:
+.LASF1402:
 	.string	"device_private"
 .LASF5:
 	.string	"__s8"
-.LASF843:
+.LASF845:
 	.string	"remount_fs"
-.LASF417:
+.LASF419:
 	.string	"robust_list"
 .LASF62:
 	.string	"desc"
-.LASF936:
+.LASF938:
 	.string	"hrtimer_resolution"
-.LASF847:
+.LASF849:
 	.string	"rename"
-.LASF1485:
+.LASF1487:
 	.string	"odata"
 .LASF52:
 	.string	"hlist_head"
-.LASF1052:
+.LASF1054:
 	.string	"nr_forced_migrations"
-.LASF631:
+.LASF633:
 	.string	"kswapd"
-.LASF1398:
+.LASF1400:
 	.string	"defer_hook"
-.LASF957:
+.LASF959:
 	.string	"_lower"
-.LASF898:
+.LASF900:
 	.string	"HRTIMER_NORESTART"
-.LASF1078:
+.LASF1080:
 	.string	"watchdog_stamp"
-.LASF976:
+.LASF978:
 	.string	"siginfo"
-.LASF1028:
+.LASF1030:
 	.string	"runnable_load_sum"
-.LASF405:
+.LASF407:
 	.string	"last_siginfo"
-.LASF1520:
+.LASF1522:
 	.string	"kmalloc_type"
 .LASF146:
 	.string	"elf_hwcap"
-.LASF808:
+.LASF810:
 	.string	"ino_idr"
-.LASF586:
+.LASF588:
 	.string	"NR_FILE_PAGES"
 .LASF21:
 	.string	"__kernel_uid32_t"
-.LASF1462:
+.LASF1464:
 	.string	"global_waveform"
 .LASF160:
 	.string	"static_key_false"
 .LASF142:
 	.string	"spinlock"
-.LASF970:
+.LASF972:
 	.string	"_kill"
-.LASF1343:
+.LASF1345:
 	.string	"bus_type"
-.LASF1005:
+.LASF1007:
 	.string	"rseq_cs_flags_bit"
-.LASF1151:
+.LASF1153:
 	.string	"private"
 .LASF131:
 	.string	"pending"
-.LASF520:
+.LASF522:
 	.string	"N_ONLINE"
-.LASF1487:
+.LASF1489:
 	.string	"decode_wf_reset"
-.LASF1488:
+.LASF1490:
 	.string	"temp_data"
-.LASF1111:
+.LASF1113:
 	.string	"mm_struct"
 .LASF17:
 	.string	"__kernel_long_t"
-.LASF1146:
+.LASF1148:
 	.string	"state_in_sysfs"
-.LASF445:
+.LASF447:
 	.string	"utask"
-.LASF1352:
+.LASF1354:
 	.string	"remove"
-.LASF274:
+.LASF276:
 	.string	"debug_locks_silent"
-.LASF1523:
+.LASF1525:
 	.string	"fls64"
-.LASF1101:
+.LASF1103:
 	.string	"perf_invalid_context"
-.LASF655:
+.LASF657:
 	.string	"vm_stat_diff"
-.LASF366:
+.LASF368:
 	.string	"min_flt"
-.LASF840:
+.LASF842:
 	.string	"attr"
-.LASF416:
+.LASF418:
 	.string	"cg_list"
-.LASF877:
+.LASF879:
 	.string	"PIDTYPE_PGID"
-.LASF501:
+.LASF503:
 	.string	"exceptional"
 .LASF150:
 	.string	"jump_entry"
-.LASF297:
+.LASF299:
 	.string	"sched_class"
-.LASF1173:
+.LASF1175:
 	.string	"kobj_sysfs_ops"
-.LASF383:
+.LASF385:
 	.string	"saved_sigmask"
-.LASF614:
+.LASF616:
 	.string	"recent_scanned"
 .LASF183:
 	.string	"arm64_const_caps_ready"
-.LASF363:
+.LASF365:
 	.string	"nivcsw"
 .LASF6:
 	.string	"__u8"
-.LASF498:
+.LASF500:
 	.string	"radix_tree_node"
-.LASF491:
+.LASF493:
 	.string	"__cpu_online_mask"
 .LASF115:
 	.string	"SYSTEM_BOOTING"
-.LASF346:
+.LASF348:
 	.string	"group_leader"
-.LASF731:
+.LASF733:
 	.string	"timer_list"
 .LASF20:
 	.string	"__kernel_pid_t"
-.LASF1152:
+.LASF1154:
 	.string	"sysfs_ops"
-.LASF1091:
+.LASF1093:
 	.string	"dl_boosted"
-.LASF289:
+.LASF291:
 	.string	"last_wakee"
-.LASF1215:
+.LASF1217:
 	.string	"platform_data"
-.LASF1347:
+.LASF1349:
 	.string	"dev_groups"
-.LASF920:
+.LASF922:
 	.string	"max_hang_time"
-.LASF355:
+.LASF357:
 	.string	"clear_child_tid"
 .LASF148:
 	.string	"type"
-.LASF535:
+.LASF537:
 	.string	"STICKY_TIMEOUTS"
-.LASF754:
+.LASF756:
 	.string	"rwsem"
-.LASF1128:
+.LASF1130:
 	.string	"vm_struct"
-.LASF599:
+.LASF601:
 	.string	"NR_KERNEL_MISC_RECLAIMABLE"
-.LASF945:
+.LASF947:
 	.string	"sival_ptr"
 .LASF107:
 	.string	"panic_on_io_nmi"
-.LASF1063:
+.LASF1065:
 	.string	"load"
-.LASF1370:
+.LASF1372:
 	.string	"PROBE_DEFAULT_STRATEGY"
-.LASF592:
+.LASF594:
 	.string	"NR_SHMEM_PMDMAPPED"
-.LASF1284:
+.LASF1286:
 	.string	"suspend_timer"
-.LASF1148:
+.LASF1150:
 	.string	"state_remove_uevent_sent"
-.LASF413:
+.LASF415:
 	.string	"cpuset_mem_spread_rotor"
-.LASF339:
+.LASF341:
 	.string	"use_memdelay"
 .LASF30:
 	.string	"__poll_t"
-.LASF540:
+.LASF542:
 	.string	"MIGRATE_MOVABLE"
-.LASF1053:
+.LASF1055:
 	.string	"nr_wakeups"
-.LASF285:
+.LASF287:
 	.string	"wake_entry"
-.LASF1445:
+.LASF1447:
 	.string	"panel_name"
-.LASF390:
+.LASF392:
 	.string	"parent_exec_id"
-.LASF1454:
+.LASF1456:
 	.string	"a2_temp_list"
-.LASF913:
+.LASF915:
 	.string	"hres_active"
-.LASF1236:
+.LASF1238:
 	.string	"devt"
-.LASF1017:
+.LASF1019:
 	.string	"last_arrival"
-.LASF748:
+.LASF750:
 	.string	"wait"
-.LASF994:
+.LASF996:
 	.string	"lock_class_key"
-.LASF628:
+.LASF630:
 	.string	"node_id"
-.LASF284:
+.LASF286:
 	.string	"ptrace"
-.LASF1272:
+.LASF1274:
 	.string	"is_noirq_suspended"
-.LASF1480:
+.LASF1482:
 	.string	"parse_wf_gray2"
-.LASF778:
+.LASF780:
 	.string	"thread_sibling"
-.LASF717:
+.LASF719:
 	.string	"read_cntpct_el0"
-.LASF858:
+.LASF860:
 	.string	"vm_ops"
-.LASF1323:
+.LASF1325:
 	.string	"expire_count"
-.LASF1355:
+.LASF1357:
 	.string	"num_vf"
-.LASF820:
+.LASF822:
 	.string	"mode"
-.LASF1208:
+.LASF1210:
 	.string	"restore_noirq"
-.LASF1422:
+.LASF1424:
 	.string	"WF_TYPE_A2"
-.LASF749:
+.LASF751:
 	.string	"notifier_fn_t"
-.LASF546:
+.LASF548:
 	.string	"MIGRATE_TYPES"
 .LASF25:
 	.string	"__kernel_loff_t"
-.LASF1511:
+.LASF1513:
 	.string	"crc_build_table32"
 .LASF180:
 	.string	"arm64_ftr_reg_ctrel0"
-.LASF876:
+.LASF878:
 	.string	"PIDTYPE_TGID"
-.LASF1159:
+.LASF1161:
 	.string	"kobj"
-.LASF1492:
+.LASF1494:
 	.string	"templist"
 .LASF165:
 	.string	"FTR_HIGHER_SAFE"
-.LASF357:
+.LASF359:
 	.string	"stime"
-.LASF1228:
+.LASF1230:
 	.string	"dma_parms"
-.LASF705:
+.LASF707:
 	.string	"setup_max_cpus"
 .LASF92:
 	.string	"devkmsg_log_str"
-.LASF966:
+.LASF968:
 	.string	"_call_addr"
 .LASF83:
 	.string	"late_time_init"
-.LASF553:
+.LASF555:
 	.string	"zone_stat_item"
-.LASF305:
+.LASF307:
 	.string	"cpus_allowed"
-.LASF1410:
+.LASF1412:
 	.string	"kmalloc_cache_type"
-.LASF712:
+.LASF714:
 	.string	"ate_match_acpi_oem_info"
 .LASF46:
 	.string	"atomic_t"
-.LASF1041:
+.LASF1043:
 	.string	"sleep_start"
 .LASF44:
 	.string	"phys_addr_t"
-.LASF1035:
+.LASF1037:
 	.string	"wait_start"
-.LASF648:
+.LASF650:
 	.string	"WMARK_HIGH"
-.LASF862:
+.LASF864:
 	.string	"kobj_ns_type"
 .LASF167:
 	.string	"arm64_ftr_bits"
-.LASF713:
+.LASF715:
 	.string	"arch_timer_erratum_workaround"
 .LASF136:
 	.string	"prove_locking"
-.LASF590:
+.LASF592:
 	.string	"NR_SHMEM"
 .LASF7:
 	.string	"unsigned char"
-.LASF990:
+.LASF992:
 	.string	"NR_MM_COUNTERS"
 .LASF118:
 	.string	"SYSTEM_HALT"
-.LASF278:
+.LASF280:
 	.string	"wait_list"
-.LASF1042:
+.LASF1044:
 	.string	"sleep_max"
-.LASF406:
+.LASF408:
 	.string	"ioac"
-.LASF938:
+.LASF940:
 	.string	"tick_cpu_device"
-.LASF1058:
+.LASF1060:
 	.string	"nr_wakeups_affine"
-.LASF710:
+.LASF712:
 	.string	"ate_match_dt"
 .LASF31:
 	.string	"__kernel_dev_t"
-.LASF675:
+.LASF677:
 	.string	"initialized"
-.LASF1279:
+.LASF1281:
 	.string	"wakeup_path"
-.LASF849:
+.LASF851:
 	.string	"seq_file"
-.LASF1240:
+.LASF1242:
 	.string	"class"
-.LASF426:
+.LASF428:
 	.string	"rseq_sig"
-.LASF607:
+.LASF609:
 	.string	"LRU_ACTIVE_ANON"
-.LASF258:
+.LASF260:
 	.string	"cpu_context"
-.LASF605:
+.LASF607:
 	.string	"lru_list"
-.LASF1426:
+.LASF1428:
 	.string	"WF_TYPE_GLD16"
-.LASF1033:
+.LASF1035:
 	.string	"util_avg"
-.LASF846:
+.LASF848:
 	.string	"rmdir"
 .LASF182:
 	.string	"cpu_hwcap_keys"
-.LASF1469:
+.LASF1471:
 	.string	"old_gray"
-.LASF502:
+.LASF504:
 	.string	"root"
-.LASF1088:
+.LASF1090:
 	.string	"runtime"
-.LASF329:
+.LASF331:
 	.string	"sched_reset_on_fork"
-.LASF1221:
+.LASF1223:
 	.string	"pins"
-.LASF1318:
+.LASF1320:
 	.string	"start_prevent_time"
-.LASF598:
+.LASF600:
 	.string	"NR_WRITTEN"
-.LASF1465:
+.LASF1467:
 	.string	"lut_type"
-.LASF1345:
+.LASF1347:
 	.string	"dev_root"
-.LASF1342:
+.LASF1344:
 	.string	"dma_coherent"
-.LASF247:
+.LASF249:
 	.string	"memstart_addr"
-.LASF1134:
+.LASF1136:
 	.string	"RSEQ_EVENT_MIGRATE_BIT"
 .LASF56:
 	.string	"callback_head"
-.LASF1328:
+.LASF1330:
 	.string	"dev_pm_domain"
 .LASF152:
 	.string	"target"
-.LASF1413:
+.LASF1415:
 	.string	"NR_KMALLOC_TYPES"
-.LASF1291:
+.LASF1293:
 	.string	"disable_depth"
-.LASF1528:
+.LASF1530:
 	.string	"strncmp"
-.LASF865:
+.LASF867:
 	.string	"KOBJ_NS_TYPES"
-.LASF714:
+.LASF716:
 	.string	"match_type"
-.LASF1043:
+.LASF1045:
 	.string	"sum_sleep_runtime"
-.LASF909:
+.LASF911:
 	.string	"get_time"
-.LASF1376:
+.LASF1378:
 	.string	"class_groups"
-.LASF807:
+.LASF809:
 	.string	"kernfs_root"
-.LASF652:
+.LASF654:
 	.string	"batch"
-.LASF364:
+.LASF366:
 	.string	"start_time"
-.LASF989:
+.LASF991:
 	.string	"MM_UNRECLAIMABLE"
-.LASF542:
+.LASF544:
 	.string	"MIGRATE_CMA"
-.LASF918:
+.LASF920:
 	.string	"nr_retries"
-.LASF1048:
+.LASF1050:
 	.string	"nr_migrations_cold"
-.LASF1396:
+.LASF1398:
 	.string	"consumers"
-.LASF495:
+.LASF497:
 	.string	"cpu_bit_bitmap"
-.LASF1077:
+.LASF1079:
 	.string	"timeout"
-.LASF1527:
+.LASF1529:
 	.string	"kfree"
-.LASF585:
+.LASF587:
 	.string	"NR_FILE_MAPPED"
-.LASF1449:
+.LASF1451:
 	.string	"gc16_temp_list"
-.LASF1461:
+.LASF1463:
 	.string	"a2_list"
-.LASF333:
+.LASF335:
 	.string	"sched_psi_wake_requeue"
 .LASF192:
 	.string	"_etext"
-.LASF1171:
+.LASF1173:
 	.string	"kset_uevent_ops"
-.LASF852:
+.LASF854:
 	.string	"prealloc_mutex"
-.LASF772:
+.LASF774:
 	.string	"pcpu_chosen_fc"
-.LASF651:
+.LASF653:
 	.string	"high"
-.LASF669:
+.LASF671:
 	.string	"cma_alloc"
-.LASF796:
+.LASF798:
 	.string	"rb_leftmost"
-.LASF654:
+.LASF656:
 	.string	"stat_threshold"
-.LASF1116:
+.LASF1118:
 	.string	"rt_mutex_waiter"
-.LASF1534:
+.LASF1536:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
-.LASF701:
+.LASF703:
 	.string	"secondary_data"
-.LASF1024:
+.LASF1026:
 	.string	"ewma"
-.LASF926:
+.LASF928:
 	.string	"hrtimer_base_type"
-.LASF767:
+.LASF769:
 	.string	"PCPU_FC_AUTO"
-.LASF1054:
+.LASF1056:
 	.string	"nr_wakeups_sync"
-.LASF1350:
+.LASF1352:
 	.string	"probe"
-.LASF470:
+.LASF472:
 	.string	"compat_rmtp"
 .LASF210:
 	.string	"__entry_text_start"
 .LASF198:
 	.string	"__init_begin"
-.LASF986:
+.LASF988:
 	.string	"MM_ANONPAGES"
-.LASF1026:
+.LASF1028:
 	.string	"last_update_time"
-.LASF509:
+.LASF511:
 	.string	"__sched_text_start"
-.LASF595:
+.LASF597:
 	.string	"NR_VMSCAN_WRITE"
-.LASF282:
+.LASF284:
 	.string	"stack"
 .LASF64:
 	.string	"sibling"
-.LASF1112:
+.LASF1114:
 	.string	"fs_struct"
-.LASF764:
+.LASF766:
 	.string	"pcpu_base_addr"
-.LASF388:
+.LASF390:
 	.string	"audit_context"
-.LASF640:
+.LASF642:
 	.string	"_pad1_"
-.LASF1170:
+.LASF1172:
 	.string	"buflen"
-.LASF1457:
+.LASF1459:
 	.string	"gl16_list"
-.LASF551:
+.LASF553:
 	.string	"nr_free"
-.LASF1245:
+.LASF1247:
 	.string	"offline"
-.LASF430:
+.LASF432:
 	.string	"task_frag"
-.LASF515:
+.LASF517:
 	.string	"seqcount_t"
-.LASF1040:
+.LASF1042:
 	.string	"iowait_sum"
 .LASF79:
 	.string	"boot_command_line"
-.LASF1326:
+.LASF1328:
 	.string	"wake_irq"
-.LASF823:
+.LASF825:
 	.string	"open"
-.LASF1508:
+.LASF1510:
 	.string	"a_size"
-.LASF505:
+.LASF507:
 	.string	"radix_tree_root"
-.LASF236:
+.LASF238:
 	.string	"__idmap_text_start"
-.LASF779:
+.LASF781:
 	.string	"core_sibling"
-.LASF1394:
+.LASF1396:
 	.string	"dev_links_info"
-.LASF1051:
+.LASF1053:
 	.string	"nr_failed_migrations_hot"
-.LASF568:
+.LASF570:
 	.string	"NR_VM_ZONE_STAT_ITEMS"
-.LASF1362:
+.LASF1364:
 	.string	"suppress_bind_attrs"
-.LASF901:
+.LASF903:
 	.string	"_softexpires"
-.LASF1311:
+.LASF1313:
 	.string	"subsys_data"
-.LASF467:
+.LASF469:
 	.string	"time"
-.LASF1418:
+.LASF1420:
 	.string	"WF_TYPE_GRAY16"
-.LASF453:
+.LASF455:
 	.string	"android_kabi_reserved8"
-.LASF1530:
+.LASF1532:
 	.string	"memcpy"
-.LASF269:
+.LASF271:
 	.string	"debug"
-.LASF1194:
+.LASF1196:
 	.string	"thaw"
-.LASF1444:
+.LASF1446:
 	.string	"timeandday"
+.LASF225:
+	.string	"__noinstr_text_end"
 .LASF222:
 	.string	"__start_opd"
-.LASF317:
+.LASF319:
 	.string	"tasks"
-.LASF769:
+.LASF771:
 	.string	"PCPU_FC_PAGE"
 .LASF223:
 	.string	"__end_opd"
-.LASF1136:
+.LASF1138:
 	.string	"attribute_group"
 .LASF104:
 	.string	"panic_timeout"
-.LASF1497:
+.LASF1499:
 	.string	"__UNIQUE_ID___x55"
-.LASF789:
+.LASF791:
 	.string	"bitmap"
-.LASF1430:
+.LASF1432:
 	.string	"frame_num"
-.LASF525:
+.LASF527:
 	.string	"NR_NODE_STATES"
-.LASF1087:
+.LASF1089:
 	.string	"dl_density"
-.LASF1260:
+.LASF1262:
 	.string	"RPM_REQ_RESUME"
-.LASF1533:
-	.string	"drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform.c"
 .LASF1535:
+	.string	"drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform.c"
+.LASF1537:
 	.string	"frozen"
 .LASF190:
 	.string	"_text"
-.LASF1395:
+.LASF1397:
 	.string	"suppliers"
-.LASF684:
+.LASF686:
 	.string	"_pad3_"
-.LASF1333:
+.LASF1335:
 	.string	"ratelimit_state"
 .LASF171:
 	.string	"shift"
-.LASF275:
+.LASF277:
 	.string	"mutex"
-.LASF824:
+.LASF826:
 	.string	"size"
-.LASF1519:
+.LASF1521:
 	.string	"kmalloc_index"
-.LASF1113:
+.LASF1115:
 	.string	"files_struct"
 .LASF153:
 	.string	"file_operations"
-.LASF228:
+.LASF230:
 	.string	"__exception_text_start"
-.LASF340:
+.LASF342:
 	.string	"atomic_flags"
 .LASF84:
 	.string	"initcall_debug"
-.LASF1452:
+.LASF1454:
 	.string	"gld16_temp_list"
-.LASF956:
+.LASF958:
 	.string	"_dummy_bnd"
-.LASF1065:
+.LASF1067:
 	.string	"run_node"
-.LASF788:
+.LASF790:
 	.string	"ida_bitmap"
-.LASF1312:
+.LASF1314:
 	.string	"set_latency_tolerance"
-.LASF538:
+.LASF540:
 	.string	"migratetype"
-.LASF1098:
+.LASF1100:
 	.string	"exp_need_qs"
 .LASF179:
 	.string	"ftr_bits"
-.LASF304:
+.LASF306:
 	.string	"nr_cpus_allowed"
-.LASF438:
+.LASF440:
 	.string	"trace_recursion"
-.LASF342:
+.LASF344:
 	.string	"tgid"
-.LASF511:
+.LASF513:
 	.string	"wait_queue_head"
-.LASF597:
+.LASF599:
 	.string	"NR_DIRTIED"
-.LASF403:
+.LASF405:
 	.string	"io_context"
-.LASF700:
+.LASF702:
 	.string	"__smp_cross_call"
-.LASF1490:
+.LASF1492:
 	.string	"get_wf_buf"
-.LASF1067:
+.LASF1069:
 	.string	"exec_start"
-.LASF249:
+.LASF251:
 	.string	"kimage_voffset"
-.LASF1222:
+.LASF1224:
 	.string	"msi_list"
 .LASF177:
 	.string	"sys_val"
 .LASF41:
 	.string	"size_t"
-.LASF1466:
+.LASF1468:
 	.string	"temperture"
-.LASF1358:
+.LASF1360:
 	.string	"lock_key"
-.LASF287:
+.LASF289:
 	.string	"wakee_flips"
 .LASF197:
 	.string	"__bss_stop"
 .LASF205:
 	.string	"__per_cpu_load"
-.LASF1251:
+.LASF1253:
 	.string	"RPM_ACTIVE"
-.LASF1416:
+.LASF1418:
 	.string	"epd_lut_type"
-.LASF951:
+.LASF953:
 	.string	"_sigval"
-.LASF888:
+.LASF890:
 	.string	"refcount_struct"
-.LASF273:
+.LASF275:
 	.string	"debug_locks"
-.LASF1175:
+.LASF1177:
 	.string	"mm_kobj"
-.LASF464:
+.LASF466:
 	.string	"TT_COMPAT"
-.LASF1475:
+.LASF1477:
 	.string	"parse_wf_a2"
-.LASF1404:
+.LASF1406:
 	.string	"dma_coherent_mem"
-.LASF1216:
+.LASF1218:
 	.string	"driver_data"
-.LASF1018:
+.LASF1020:
 	.string	"last_queued"
-.LASF447:
+.LASF449:
 	.string	"oom_reaper_list"
-.LASF822:
+.LASF824:
 	.string	"kernfs_elem_attr"
-.LASF537:
+.LASF539:
 	.string	"page"
-.LASF1316:
+.LASF1318:
 	.string	"max_time"
-.LASF635:
+.LASF637:
 	.string	"kcompactd_max_order"
-.LASF792:
+.LASF794:
 	.string	"rb_right"
-.LASF758:
+.LASF760:
 	.string	"numa_zonelist_order"
-.LASF706:
+.LASF708:
 	.string	"__boot_cpu_id"
-.LASF1068:
+.LASF1070:
 	.string	"vruntime"
-.LASF1177:
+.LASF1179:
 	.string	"power_kobj"
-.LASF1185:
+.LASF1187:
 	.string	"power_group_name"
-.LASF573:
+.LASF575:
 	.string	"NR_INACTIVE_FILE"
-.LASF1384:
+.LASF1386:
 	.string	"sysfs_dev_char_kobj"
-.LASF686:
+.LASF688:
 	.string	"ZONELIST_FALLBACK"
-.LASF1219:
+.LASF1221:
 	.string	"pm_domain"
-.LASF368:
+.LASF370:
 	.string	"cputime_expires"
-.LASF1247:
+.LASF1249:
 	.string	"state_synced"
-.LASF1191:
+.LASF1193:
 	.string	"suspend"
-.LASF893:
+.LASF895:
 	.string	"node_list"
-.LASF1253:
+.LASF1255:
 	.string	"RPM_SUSPENDED"
-.LASF961:
+.LASF963:
 	.string	"_addr_lsb"
-.LASF928:
+.LASF930:
 	.string	"HRTIMER_BASE_REALTIME"
-.LASF448:
+.LASF450:
 	.string	"stack_vm_area"
-.LASF908:
+.LASF910:
 	.string	"running"
 .LASF221:
 	.string	"__ctors_end"
-.LASF616:
+.LASF618:
 	.string	"lists"
-.LASF1460:
+.LASF1462:
 	.string	"du_list"
-.LASF816:
+.LASF818:
 	.string	"kernfs_node"
-.LASF421:
+.LASF423:
 	.string	"perf_event_ctxp"
-.LASF1438:
+.LASF1440:
 	.string	"RKF_WF_GLD16"
-.LASF1302:
+.LASF1304:
 	.string	"links_count"
-.LASF721:
+.LASF723:
 	.string	"clock_event_device"
-.LASF541:
+.LASF543:
 	.string	"MIGRATE_RECLAIMABLE"
 .LASF53:
 	.string	"first"
@@ -18553,249 +18565,251 @@ crc32_table:
 	.string	"safe_val"
 .LASF170:
 	.string	"strict"
-.LASF418:
+.LASF420:
 	.string	"compat_robust_list"
-.LASF496:
+.LASF498:
 	.string	"rcu_scheduler_active"
-.LASF1030:
+.LASF1032:
 	.string	"period_contrib"
 .LASF212:
 	.string	"__start_rodata"
-.LASF1238:
+.LASF1240:
 	.string	"devres_head"
-.LASF1484:
+.LASF1486:
 	.string	"idata"
-.LASF382:
+.LASF384:
 	.string	"real_blocked"
-.LASF802:
+.LASF804:
 	.string	"init_user_ns"
-.LASF1100:
+.LASF1102:
 	.string	"perf_event_task_context"
-.LASF1501:
+.LASF1503:
 	.string	"waveform_file"
-.LASF1387:
+.LASF1389:
 	.string	"segment_boundary_mask"
-.LASF851:
+.LASF853:
 	.string	"file"
 .LASF163:
 	.string	"FTR_EXACT"
-.LASF1061:
+.LASF1063:
 	.string	"nr_wakeups_idle"
-.LASF408:
+.LASF410:
 	.string	"acct_rss_mem1"
 .LASF151:
 	.string	"code"
-.LASF587:
+.LASF589:
 	.string	"NR_FILE_DIRTY"
-.LASF1250:
+.LASF1252:
 	.string	"rpm_status"
-.LASF1233:
+.LASF1235:
 	.string	"archdata"
 .LASF27:
 	.string	"__kernel_clock_t"
-.LASF1517:
+.LASF1519:
 	.string	"kmalloc_large"
-.LASF1242:
+.LASF1244:
 	.string	"iommu_group"
-.LASF1472:
+.LASF1474:
 	.string	"pix0"
-.LASF1473:
+.LASF1475:
 	.string	"pix1"
-.LASF267:
+.LASF269:
 	.string	"fault_address"
-.LASF381:
+.LASF383:
 	.string	"blocked"
-.LASF407:
+.LASF409:
 	.string	"psi_flags"
 .LASF11:
 	.string	"__s32"
-.LASF433:
+.LASF435:
 	.string	"nr_dirtied_pause"
-.LASF1507:
+.LASF1509:
 	.string	"a_data"
 .LASF218:
 	.string	"__start_once"
-.LASF310:
+.LASF312:
 	.string	"rcu_blocked_node"
 .LASF75:
 	.string	"__con_initcall_start"
-.LASF256:
+.LASF258:
 	.string	"hbp_watch"
-.LASF245:
+.LASF247:
 	.string	"__entry_tramp_text_end"
-.LASF1255:
+.LASF1257:
 	.string	"rpm_request"
 .LASF97:
 	.string	"atomic_notifier_head"
-.LASF1141:
+.LASF1143:
 	.string	"kobject"
-.LASF1201:
+.LASF1203:
 	.string	"poweroff_late"
-.LASF1354:
+.LASF1356:
 	.string	"online"
-.LASF431:
+.LASF433:
 	.string	"delays"
-.LASF444:
+.LASF446:
 	.string	"throttle_queue"
-.LASF982:
+.LASF984:
 	.string	"sigpending"
-.LASF1338:
+.LASF250:
+	.string	"kimage_vaddr"
+.LASF1340:
 	.string	"begin"
-.LASF1496:
-	.string	"__UNIQUE_ID___y54"
 .LASF1498:
+	.string	"__UNIQUE_ID___y54"
+.LASF1500:
 	.string	"__UNIQUE_ID___y56"
-.LASF1374:
+.LASF1376:
 	.string	"acpi_device_id"
 .LASF120:
 	.string	"SYSTEM_RESTART"
-.LASF942:
+.LASF944:
 	.string	"kernfs_node_id"
-.LASF471:
+.LASF473:
 	.string	"compat_timespec"
-.LASF639:
+.LASF641:
 	.string	"totalreserve_pages"
-.LASF855:
+.LASF857:
 	.string	"prealloc_buf"
-.LASF1176:
+.LASF1178:
 	.string	"hypervisor_kobj"
-.LASF378:
+.LASF380:
 	.string	"nsproxy"
-.LASF837:
+.LASF839:
 	.string	"kernfs_open_node"
-.LASF1178:
+.LASF1180:
 	.string	"firmware_kobj"
-.LASF726:
+.LASF728:
 	.string	"jiffies"
-.LASF1155:
+.LASF1157:
 	.string	"refcount"
-.LASF1202:
+.LASF1204:
 	.string	"restore_early"
-.LASF1186:
+.LASF1188:
 	.string	"pm_message"
-.LASF944:
+.LASF946:
 	.string	"sival_int"
 .LASF158:
 	.string	"__start___jump_table"
-.LASF1383:
+.LASF1385:
 	.string	"sysfs_dev_block_kobj"
-.LASF979:
+.LASF981:
 	.string	"si_code"
-.LASF1032:
+.LASF1034:
 	.string	"runnable_load_avg"
-.LASF1044:
+.LASF1046:
 	.string	"block_start"
-.LASF780:
+.LASF782:
 	.string	"llc_sibling"
-.LASF1235:
+.LASF1237:
 	.string	"fwnode"
-.LASF645:
+.LASF647:
 	.string	"zone_watermarks"
-.LASF370:
+.LASF372:
 	.string	"ptracer_cred"
-.LASF1259:
+.LASF1261:
 	.string	"RPM_REQ_AUTOSUSPEND"
 .LASF48:
 	.string	"atomic64_t"
-.LASF875:
+.LASF877:
 	.string	"PIDTYPE_PID"
 .LASF94:
 	.string	"dmesg_restrict"
-.LASF359:
+.LASF361:
 	.string	"time_in_state"
-.LASF1306:
+.LASF1308:
 	.string	"autosuspend_delay"
-.LASF1303:
+.LASF1305:
 	.string	"request"
-.LASF1536:
+.LASF1538:
 	.string	"decode_wf_data"
-.LASF759:
+.LASF761:
 	.string	"contig_page_data"
-.LASF493:
+.LASF495:
 	.string	"__cpu_active_mask"
-.LASF1145:
+.LASF1147:
 	.string	"state_initialized"
-.LASF1211:
+.LASF1213:
 	.string	"runtime_idle"
-.LASF1150:
+.LASF1152:
 	.string	"bin_attribute"
-.LASF1096:
+.LASF1098:
 	.string	"inactive_timer"
-.LASF485:
+.LASF487:
 	.string	"preempt_count"
-.LASF883:
+.LASF885:
 	.string	"wait_pidfd"
-.LASF729:
+.LASF731:
 	.string	"timekeeping_suspended"
-.LASF809:
+.LASF811:
 	.string	"last_ino"
-.LASF1162:
+.LASF1164:
 	.string	"default_attrs"
-.LASF999:
+.LASF1001:
 	.string	"syscr"
-.LASF929:
+.LASF931:
 	.string	"HRTIMER_BASE_BOOTTIME"
-.LASF1482:
+.LASF1484:
 	.string	"parse_wf_reset"
-.LASF545:
+.LASF547:
 	.string	"MIGRATE_ISOLATE"
-.LASF1000:
+.LASF1002:
 	.string	"syscw"
-.LASF760:
+.LASF762:
 	.string	"mem_section"
-.LASF562:
+.LASF564:
 	.string	"NR_MLOCK"
-.LASF1293:
+.LASF1295:
 	.string	"request_pending"
-.LASF389:
+.LASF391:
 	.string	"seccomp"
-.LASF959:
+.LASF961:
 	.string	"_dummy_pkey"
-.LASF360:
+.LASF362:
 	.string	"max_state"
-.LASF1012:
+.LASF1014:
 	.string	"rseq_cs"
-.LASF455:
+.LASF457:
 	.string	"timespec"
 .LASF13:
 	.string	"__s64"
-.LASF508:
+.LASF510:
 	.string	"rnode"
-.LASF1007:
+.LASF1009:
 	.string	"RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL_BIT"
-.LASF492:
+.LASF494:
 	.string	"__cpu_present_mask"
-.LASF1184:
+.LASF1186:
 	.string	"pm_power_off_prepare"
-.LASF1493:
+.LASF1495:
 	.string	"wf_offset"
-.LASF1160:
+.LASF1162:
 	.string	"uevent_ops"
-.LASF1213:
+.LASF1215:
 	.string	"init_name"
-.LASF313:
+.LASF315:
 	.string	"rcu_tasks_idx"
-.LASF1339:
+.LASF1341:
 	.string	"printk_ratelimit_state"
-.LASF427:
+.LASF429:
 	.string	"rseq_event_mask"
-.LASF730:
+.LASF732:
 	.string	"persistent_clock_is_local"
 .LASF189:
 	.string	"__reserved"
 .LASF129:
 	.string	"hex_asc_upper"
-.LASF1429:
+.LASF1431:
 	.string	"epd_lut_data"
-.LASF690:
+.LASF692:
 	.string	"zonelist"
-.LASF668:
+.LASF670:
 	.string	"pageset"
-.LASF246:
+.LASF248:
 	.string	"__boot_cpu_mode"
-.LASF1122:
+.LASF1124:
 	.string	"perf_event_context"
-.LASF828:
+.LASF830:
 	.string	"seq_show"
 .LASF147:
 	.string	"static_key_initialized"
@@ -18803,629 +18817,629 @@ crc32_table:
 	.string	"rlock"
 .LASF89:
 	.string	"linux_banner_ptr"
-.LASF1210:
+.LASF1212:
 	.string	"runtime_resume"
-.LASF1082:
+.LASF1084:
 	.string	"sched_dl_entity"
-.LASF328:
+.LASF330:
 	.string	"personality"
-.LASF574:
+.LASF576:
 	.string	"NR_ACTIVE_FILE"
-.LASF1295:
+.LASF1297:
 	.string	"runtime_auto"
-.LASF1135:
+.LASF1137:
 	.string	"attribute"
-.LASF1360:
+.LASF1362:
 	.string	"device_driver"
-.LASF740:
+.LASF742:
 	.string	"system_highpri_wq"
-.LASF1016:
+.LASF1018:
 	.string	"run_delay"
-.LASF1505:
+.LASF1507:
 	.string	"check_wf_format"
-.LASF1110:
+.LASF1112:
 	.string	"rcu_node"
-.LASF564:
+.LASF566:
 	.string	"NR_KERNEL_STACK_KB"
-.LASF785:
+.LASF787:
 	.string	"idr_rt"
-.LASF463:
+.LASF465:
 	.string	"TT_NATIVE"
 .LASF194:
 	.string	"_sdata"
-.LASF1289:
+.LASF1291:
 	.string	"usage_count"
-.LASF1266:
+.LASF1268:
 	.string	"power_state"
-.LASF1348:
+.LASF1350:
 	.string	"drv_groups"
 .LASF112:
 	.string	"panic_cpu"
-.LASF1531:
+.LASF1533:
 	.string	"memset"
-.LASF1401:
+.LASF1403:
 	.string	"irq_domain"
-.LASF766:
+.LASF768:
 	.string	"pcpu_fc"
-.LASF571:
+.LASF573:
 	.string	"NR_INACTIVE_ANON"
-.LASF935:
+.LASF937:
 	.string	"HRTIMER_MAX_CLOCK_BASES"
-.LASF227:
+.LASF229:
 	.string	"__alt_instructions_end"
-.LASF882:
+.LASF884:
 	.string	"level"
-.LASF1046:
+.LASF1048:
 	.string	"exec_max"
-.LASF411:
+.LASF413:
 	.string	"mems_allowed"
-.LASF336:
+.LASF338:
 	.string	"in_user_fault"
-.LASF1257:
+.LASF1259:
 	.string	"RPM_REQ_IDLE"
-.LASF718:
+.LASF720:
 	.string	"read_cntvct_el0"
-.LASF657:
+.LASF659:
 	.string	"vm_node_stat_diff"
 .LASF60:
 	.string	"name"
-.LASF611:
+.LASF613:
 	.string	"NR_LRU_LISTS"
-.LASF612:
+.LASF614:
 	.string	"zone_reclaim_stat"
-.LASF1471:
+.LASF1473:
 	.string	"lut_data"
-.LASF283:
+.LASF285:
 	.string	"usage"
-.LASF1393:
+.LASF1395:
 	.string	"DL_DEV_UNBINDING"
 .LASF162:
 	.string	"ftr_type"
 .LASF123:
 	.string	"taint_flag"
-.LASF797:
+.LASF799:
 	.string	"overflowuid"
-.LASF569:
+.LASF571:
 	.string	"node_stat_item"
-.LASF473:
+.LASF475:
 	.string	"expires"
-.LASF993:
+.LASF995:
 	.string	"page_frag"
-.LASF1192:
+.LASF1194:
 	.string	"resume"
 .LASF114:
 	.string	"early_boot_irqs_disabled"
-.LASF425:
+.LASF427:
 	.string	"rseq_len"
 .LASF108:
 	.string	"panic_on_warn"
-.LASF1319:
+.LASF1321:
 	.string	"prevent_sleep_time"
-.LASF1330:
+.LASF1332:
 	.string	"activate"
-.LASF891:
+.LASF893:
 	.string	"plist_node"
-.LASF1294:
+.LASF1296:
 	.string	"deferred_resume"
-.LASF450:
+.LASF452:
 	.string	"security"
 .LASF164:
 	.string	"FTR_LOWER_SAFE"
-.LASF632:
+.LASF634:
 	.string	"kswapd_order"
-.LASF1166:
+.LASF1168:
 	.string	"kobj_uevent_env"
-.LASF969:
+.LASF971:
 	.string	"_pad"
-.LASF376:
+.LASF378:
 	.string	"last_switch_time"
-.LASF773:
+.LASF775:
 	.string	"cpu_topology"
-.LASF954:
+.LASF956:
 	.string	"_utime"
-.LASF250:
+.LASF252:
 	.string	"arm64_dma_phys_limit"
-.LASF899:
+.LASF901:
 	.string	"HRTIMER_RESTART"
-.LASF1432:
+.LASF1434:
 	.string	"rkf_waveform_type"
-.LASF1515:
+.LASF1517:
 	.string	"kzalloc"
-.LASF1265:
+.LASF1267:
 	.string	"dev_pm_info"
-.LASF626:
+.LASF628:
 	.string	"node_present_pages"
-.LASF1489:
+.LASF1491:
 	.string	"get_wf_frm_num"
-.LASF323:
+.LASF325:
 	.string	"exit_state"
-.LASF937:
+.LASF939:
 	.string	"tick_device"
-.LASF813:
+.LASF815:
 	.string	"deactivate_waitq"
-.LASF1287:
+.LASF1289:
 	.string	"wait_queue"
 .LASF1:
 	.string	"sizetype"
 .LASF214:
 	.string	"__irqentry_text_start"
-.LASF988:
+.LASF990:
 	.string	"MM_SHMEMPAGES"
-.LASF1066:
+.LASF1068:
 	.string	"group_node"
-.LASF435:
+.LASF437:
 	.string	"timer_slack_ns"
-.LASF1196:
+.LASF1198:
 	.string	"restore"
-.LASF1386:
+.LASF1388:
 	.string	"max_segment_size"
-.LASF1239:
+.LASF1241:
 	.string	"knode_class"
-.LASF446:
+.LASF448:
 	.string	"pagefault_disabled"
-.LASF232:
+.LASF234:
 	.string	"__hyp_idmap_text_start"
-.LASF1206:
+.LASF1208:
 	.string	"thaw_noirq"
-.LASF1207:
+.LASF1209:
 	.string	"poweroff_noirq"
-.LASF352:
+.LASF354:
 	.string	"thread_node"
-.LASF1392:
+.LASF1394:
 	.string	"DL_DEV_DRIVER_BOUND"
 .LASF10:
 	.string	"short unsigned int"
 .LASF122:
 	.string	"system_state"
-.LASF303:
+.LASF305:
 	.string	"policy"
 .LASF4:
 	.string	"signed char"
-.LASF1278:
+.LASF1280:
 	.string	"wakeup"
-.LASF533:
+.LASF535:
 	.string	"SHORT_INODE"
-.LASF872:
+.LASF874:
 	.string	"sock"
-.LASF856:
+.LASF858:
 	.string	"mmapped"
-.LASF1476:
+.LASF1478:
 	.string	"temp"
-.LASF454:
+.LASF456:
 	.string	"thread"
 .LASF59:
 	.string	"start"
-.LASF1073:
+.LASF1075:
 	.string	"cfs_rq"
-.LASF397:
+.LASF399:
 	.string	"pi_blocked_on"
-.LASF950:
+.LASF952:
 	.string	"_overrun"
-.LASF369:
+.LASF371:
 	.string	"cpu_timers"
-.LASF392:
+.LASF394:
 	.string	"alloc_lock"
-.LASF625:
+.LASF627:
 	.string	"node_start_pfn"
-.LASF904:
+.LASF906:
 	.string	"is_soft"
-.LASF1305:
+.LASF1307:
 	.string	"runtime_error"
-.LASF255:
+.LASF257:
 	.string	"hbp_break"
-.LASF1308:
+.LASF1310:
 	.string	"active_jiffies"
-.LASF1081:
+.LASF1083:
 	.string	"back"
-.LASF703:
+.LASF705:
 	.string	"status"
-.LASF373:
+.LASF375:
 	.string	"comm"
-.LASF235:
+.LASF237:
 	.string	"__hyp_text_end"
-.LASF500:
+.LASF502:
 	.string	"count"
-.LASF692:
+.LASF694:
 	.string	"mem_map"
-.LASF1050:
+.LASF1052:
 	.string	"nr_failed_migrations_running"
-.LASF439:
+.LASF441:
 	.string	"memcg_in_oom"
-.LASF825:
+.LASF827:
 	.string	"notify_next"
-.LASF1332:
+.LASF1334:
 	.string	"dismiss"
 .LASF87:
 	.string	"__icache_flags"
-.LASF1373:
+.LASF1375:
 	.string	"of_device_id"
-.LASF744:
+.LASF746:
 	.string	"system_power_efficient_wq"
-.LASF1119:
+.LASF1121:
 	.string	"robust_list_head"
-.LASF985:
+.LASF987:
 	.string	"MM_FILEPAGES"
-.LASF1428:
+.LASF1430:
 	.string	"WF_TYPE_MAX"
-.LASF494:
+.LASF496:
 	.string	"cpu_all_bits"
-.LASF277:
+.LASF279:
 	.string	"wait_lock"
 .LASF91:
 	.string	"console_printk"
-.LASF519:
+.LASF521:
 	.string	"N_POSSIBLE"
 .LASF96:
 	.string	"kmsg_fops"
-.LASF1502:
+.LASF1504:
 	.string	"check_wf_crc"
-.LASF441:
+.LASF443:
 	.string	"memcg_oom_order"
-.LASF337:
+.LASF339:
 	.string	"memcg_kmem_skip_account"
-.LASF1015:
+.LASF1017:
 	.string	"pcount"
-.LASF1144:
+.LASF1146:
 	.string	"kref"
-.LASF432:
+.LASF434:
 	.string	"nr_dirtied"
-.LASF266:
+.LASF268:
 	.string	"sve_vl_onexec"
 .LASF9:
 	.string	"__u16"
-.LASF582:
+.LASF584:
 	.string	"WORKINGSET_RESTORE"
-.LASF596:
+.LASF598:
 	.string	"NR_VMSCAN_IMMEDIATE"
-.LASF504:
+.LASF506:
 	.string	"tags"
-.LASF486:
+.LASF488:
 	.string	"cpumask"
-.LASF251:
+.LASF253:
 	.string	"debug_info"
-.LASF281:
+.LASF283:
 	.string	"state"
-.LASF941:
+.LASF943:
 	.string	"sigset_t"
-.LASF1252:
+.LASF1254:
 	.string	"RPM_RESUMING"
-.LASF1474:
+.LASF1476:
 	.string	"rkf_lut_init_wf_table"
-.LASF1084:
+.LASF1086:
 	.string	"dl_deadline"
-.LASF814:
+.LASF816:
 	.string	"kernfs_elem_symlink"
-.LASF1027:
+.LASF1029:
 	.string	"load_sum"
-.LASF1011:
+.LASF1013:
 	.string	"cpu_id"
-.LASF923:
+.LASF925:
 	.string	"softirq_expires_next"
-.LASF1102:
+.LASF1104:
 	.string	"perf_hw_context"
-.LASF770:
+.LASF772:
 	.string	"PCPU_FC_NR"
-.LASF1388:
+.LASF1390:
 	.string	"fwnode_handle"
-.LASF1189:
+.LASF1191:
 	.string	"prepare"
-.LASF1097:
+.LASF1099:
 	.string	"need_qs"
-.LASF377:
+.LASF379:
 	.string	"files"
-.LASF1479:
+.LASF1481:
 	.string	"input"
-.LASF1109:
+.LASF1111:
 	.string	"task_group"
-.LASF1093:
+.LASF1095:
 	.string	"dl_non_contending"
-.LASF666:
+.LASF668:
 	.string	"lowmem_reserve"
-.LASF563:
+.LASF565:
 	.string	"NR_PAGETABLE"
-.LASF1234:
+.LASF1236:
 	.string	"of_node"
-.LASF375:
+.LASF377:
 	.string	"last_switch_count"
-.LASF906:
+.LASF908:
 	.string	"cpu_base"
-.LASF1521:
+.LASF1523:
 	.string	"get_order"
 .LASF126:
 	.string	"module"
-.LASF687:
+.LASF689:
 	.string	"MAX_ZONELISTS"
-.LASF733:
+.LASF735:
 	.string	"function"
-.LASF552:
+.LASF554:
 	.string	"zone_padding"
 .LASF57:
 	.string	"func"
 .LASF72:
 	.string	"pstate_check_t"
-.LASF952:
+.LASF954:
 	.string	"_sys_private"
-.LASF1510:
+.LASF1512:
 	.string	"decode_wf_auto"
-.LASF460:
+.LASF462:
 	.string	"tz_dsttime"
 .LASF19:
 	.string	"__kernel_ulong_t"
-.LASF1137:
+.LASF1139:
 	.string	"is_visible"
-.LASF636:
+.LASF638:
 	.string	"kcompactd_classzone_idx"
-.LASF1022:
+.LASF1024:
 	.string	"util_est"
-.LASF268:
+.LASF270:
 	.string	"fault_code"
-.LASF1526:
+.LASF1528:
 	.string	"__kmalloc"
 .LASF88:
 	.string	"linux_banner"
-.LASF812:
+.LASF814:
 	.string	"supers"
-.LASF443:
+.LASF445:
 	.string	"active_memcg"
-.LASF1002:
+.LASF1004:
 	.string	"read_bytes"
 .LASF174:
 	.string	"arm64_ftr_reg"
-.LASF1220:
+.LASF1222:
 	.string	"msi_domain"
 .LASF12:
 	.string	"__u32"
-.LASF782:
+.LASF784:
 	.string	"freq_scale"
-.LASF286:
+.LASF288:
 	.string	"on_cpu"
 .LASF125:
 	.string	"c_false"
-.LASF429:
+.LASF431:
 	.string	"splice_pipe"
-.LASF870:
+.LASF872:
 	.string	"initial_ns"
-.LASF1310:
+.LASF1312:
 	.string	"accounting_timestamp"
-.LASF548:
+.LASF550:
 	.string	"page_group_by_mobility_disabled"
-.LASF932:
+.LASF934:
 	.string	"HRTIMER_BASE_REALTIME_SOFT"
-.LASF841:
+.LASF843:
 	.string	"kernfs_iattrs"
 .LASF71:
 	.string	"iomem_resource"
-.LASF910:
+.LASF912:
 	.string	"hrtimer_cpu_base"
-.LASF351:
+.LASF353:
 	.string	"thread_group"
-.LASF1268:
+.LASF1270:
 	.string	"async_suspend"
-.LASF487:
+.LASF489:
 	.string	"bits"
 .LASF58:
 	.string	"resource"
 .LASF77:
 	.string	"__security_initcall_start"
-.LASF349:
+.LASF351:
 	.string	"thread_pid"
-.LASF1187:
+.LASF1189:
 	.string	"pm_message_t"
-.LASF1425:
+.LASF1427:
 	.string	"WF_TYPE_GLR16"
-.LASF226:
+.LASF228:
 	.string	"__alt_instructions"
-.LASF1356:
+.LASF1358:
 	.string	"dma_configure"
-.LASF660:
+.LASF662:
 	.string	"ZONE_NORMAL"
-.LASF869:
+.LASF871:
 	.string	"netlink_ns"
 .LASF18:
 	.string	"long int"
-.LASF912:
+.LASF914:
 	.string	"clock_was_set_seq"
 .LASF70:
 	.string	"ioport_resource"
-.LASF800:
+.LASF802:
 	.string	"fs_overflowgid"
-.LASF1010:
+.LASF1012:
 	.string	"cpu_id_start"
-.LASF1124:
+.LASF1126:
 	.string	"task_delay_info"
-.LASF691:
+.LASF693:
 	.string	"_zonerefs"
-.LASF1179:
+.LASF1181:
 	.string	"klist_node"
-.LASF933:
+.LASF935:
 	.string	"HRTIMER_BASE_BOOTTIME_SOFT"
-.LASF750:
+.LASF752:
 	.string	"notifier_block"
-.LASF644:
+.LASF646:
 	.string	"vm_stat"
-.LASF697:
+.LASF699:
 	.string	"total_cpus"
-.LASF1442:
+.LASF1444:
 	.string	"format"
-.LASF1117:
+.LASF1119:
 	.string	"blk_plug"
-.LASF783:
+.LASF785:
 	.string	"max_freq_scale"
-.LASF320:
+.LASF322:
 	.string	"active_mm"
 .LASF117:
 	.string	"SYSTEM_RUNNING"
-.LASF307:
+.LASF309:
 	.string	"rcu_read_lock_nesting"
-.LASF681:
+.LASF683:
 	.string	"compact_order_failed"
-.LASF436:
+.LASF438:
 	.string	"default_timer_slack_ns"
-.LASF327:
+.LASF329:
 	.string	"jobctl"
-.LASF1120:
+.LASF1122:
 	.string	"compat_robust_list_head"
-.LASF671:
+.LASF673:
 	.string	"managed_pages"
-.LASF554:
+.LASF556:
 	.string	"NR_FREE_PAGES"
 .LASF78:
 	.string	"__security_initcall_end"
-.LASF1230:
+.LASF1232:
 	.string	"dma_mem"
-.LASF1199:
+.LASF1201:
 	.string	"freeze_late"
-.LASF1055:
+.LASF1057:
 	.string	"nr_wakeups_migrate"
 .LASF203:
 	.string	"__end_ro_after_init"
-.LASF1188:
+.LASF1190:
 	.string	"dev_pm_ops"
-.LASF1039:
+.LASF1041:
 	.string	"iowait_count"
-.LASF720:
+.LASF722:
 	.string	"set_next_event_virt"
-.LASF555:
+.LASF557:
 	.string	"NR_ZONE_LRU_BASE"
-.LASF1123:
+.LASF1125:
 	.string	"pipe_inode_info"
 .LASF207:
 	.string	"__per_cpu_end"
-.LASF867:
+.LASF869:
 	.string	"current_may_mount"
-.LASF835:
+.LASF837:
 	.string	"write"
-.LASF550:
+.LASF552:
 	.string	"free_list"
-.LASF1085:
+.LASF1087:
 	.string	"dl_period"
-.LASF831:
+.LASF833:
 	.string	"seq_stop"
-.LASF1020:
+.LASF1022:
 	.string	"weight"
-.LASF1337:
+.LASF1339:
 	.string	"missed"
-.LASF922:
+.LASF924:
 	.string	"next_timer"
-.LASF309:
+.LASF311:
 	.string	"rcu_node_entry"
-.LASF854:
+.LASF856:
 	.string	"list"
-.LASF395:
+.LASF397:
 	.string	"pi_waiters"
-.LASF1341:
+.LASF1343:
 	.string	"iommu"
-.LASF1129:
+.LASF1131:
 	.string	"cad_pid"
-.LASF437:
+.LASF439:
 	.string	"trace"
-.LASF1126:
+.LASF1128:
 	.string	"request_queue"
-.LASF1353:
+.LASF1355:
 	.string	"shutdown"
-.LASF1209:
+.LASF1211:
 	.string	"runtime_suspend"
-.LASF743:
+.LASF745:
 	.string	"system_freezable_wq"
-.LASF1334:
+.LASF1336:
 	.string	"interval"
 .LASF213:
 	.string	"__end_rodata"
-.LASF627:
+.LASF629:
 	.string	"node_spanned_pages"
-.LASF1003:
+.LASF1005:
 	.string	"write_bytes"
-.LASF903:
+.LASF905:
 	.string	"is_rel"
-.LASF921:
+.LASF923:
 	.string	"expires_next"
-.LASF844:
+.LASF846:
 	.string	"show_options"
 .LASF15:
 	.string	"__u64"
-.LASF947:
+.LASF949:
 	.string	"_pid"
-.LASF722:
+.LASF724:
 	.string	"timer_unstable_counter_workaround"
-.LASF472:
+.LASF474:
 	.string	"clockid"
-.LASF1349:
+.LASF1351:
 	.string	"match"
-.LASF474:
+.LASF476:
 	.string	"ufds"
 .LASF137:
 	.string	"lock_stat"
-.LASF1072:
+.LASF1074:
 	.string	"depth"
 .LASF161:
 	.string	"system_states"
 .LASF24:
 	.string	"__kernel_ssize_t"
-.LASF810:
+.LASF812:
 	.string	"next_generation"
-.LASF566:
+.LASF568:
 	.string	"NR_ZSPAGES"
-.LASF1309:
+.LASF1311:
 	.string	"suspended_jiffies"
-.LASF1132:
+.LASF1134:
 	.string	"RSEQ_EVENT_PREEMPT_BIT"
-.LASF1161:
+.LASF1163:
 	.string	"kobj_type"
-.LASF400:
+.LASF402:
 	.string	"plug"
 .LASF0:
 	.string	"long unsigned int"
-.LASF1414:
+.LASF1416:
 	.string	"kmem_cache"
-.LASF353:
+.LASF355:
 	.string	"vfork_done"
-.LASF1366:
+.LASF1368:
 	.string	"coredump"
-.LASF479:
+.LASF481:
 	.string	"nanosleep"
 .LASF191:
 	.string	"_stext"
-.LASF1025:
+.LASF1027:
 	.string	"sched_avg"
-.LASF940:
+.LASF942:
 	.string	"seccomp_filter"
-.LASF1351:
+.LASF1353:
 	.string	"sync_state"
-.LASF401:
+.LASF403:
 	.string	"reclaim_state"
-.LASF1142:
+.LASF1144:
 	.string	"kset"
-.LASF960:
+.LASF962:
 	.string	"_pkey"
-.LASF674:
+.LASF676:
 	.string	"nr_isolate_pageblock"
 .LASF204:
 	.string	"_end"
-.LASF1225:
+.LASF1227:
 	.string	"coherent_dma_mask"
 .LASF55:
 	.string	"pprev"
-.LASF848:
+.LASF850:
 	.string	"show_path"
 .LASF196:
 	.string	"__bss_start"
-.LASF1377:
+.LASF1379:
 	.string	"dev_kobj"
-.LASF1203:
+.LASF1205:
 	.string	"suspend_noirq"
-.LASF804:
+.LASF806:
 	.string	"kgid_t"
-.LASF781:
+.LASF783:
 	.string	"cpu_scale"
-.LASF834:
+.LASF836:
 	.string	"prealloc"
-.LASF739:
+.LASF741:
 	.string	"system_wq"
-.LASF1181:
+.LASF1183:
 	.string	"n_node"
-.LASF752:
+.LASF754:
 	.string	"priority"
-.LASF1229:
+.LASF1231:
 	.string	"dma_pools"
 .LASF93:
 	.string	"printk_delay_msec"
@@ -19433,85 +19447,85 @@ crc32_table:
 	.string	"char"
 .LASF219:
 	.string	"__end_once"
-.LASF449:
+.LASF451:
 	.string	"stack_refcount"
-.LASF688:
+.LASF690:
 	.string	"zoneref"
-.LASF821:
+.LASF823:
 	.string	"iattr"
-.LASF1047:
+.LASF1049:
 	.string	"slice_max"
-.LASF348:
+.LASF350:
 	.string	"ptrace_entry"
-.LASF531:
+.LASF533:
 	.string	"READ_IMPLIES_EXEC"
-.LASF670:
+.LASF672:
 	.string	"zone_start_pfn"
 .LASF156:
 	.string	"enabled"
 .LASF33:
 	.string	"umode_t"
-.LASF391:
+.LASF393:
 	.string	"self_exec_id"
-.LASF1037:
+.LASF1039:
 	.string	"wait_count"
-.LASF1331:
+.LASF1333:
 	.string	"sync"
-.LASF746:
+.LASF748:
 	.string	"completion"
-.LASF410:
+.LASF412:
 	.string	"acct_timexpd"
-.LASF1076:
+.LASF1078:
 	.string	"run_list"
-.LASF291:
+.LASF293:
 	.string	"wake_cpu"
-.LASF1477:
+.LASF1479:
 	.string	"pbuf"
-.LASF615:
+.LASF617:
 	.string	"lruvec"
 .LASF206:
 	.string	"__per_cpu_start"
-.LASF975:
+.LASF977:
 	.string	"_sigsys"
-.LASF518:
+.LASF520:
 	.string	"node_states"
-.LASF839:
+.LASF841:
 	.string	"symlink"
-.LASF664:
+.LASF666:
 	.string	"watermark"
-.LASF385:
+.LASF387:
 	.string	"sas_ss_size"
-.LASF880:
+.LASF882:
 	.string	"upid"
-.LASF633:
+.LASF635:
 	.string	"kswapd_classzone_idx"
-.LASF321:
+.LASF323:
 	.string	"vmacache"
-.LASF1299:
+.LASF1301:
 	.string	"use_autosuspend"
 .LASF175:
 	.string	"strict_mask"
 .LASF109:
 	.string	"sysctl_panic_on_rcu_stall"
-.LASF483:
+.LASF485:
 	.string	"addr_limit"
-.LASF1322:
+.LASF1324:
 	.string	"relax_count"
-.LASF1168:
+.LASF1170:
 	.string	"envp"
-.LASF231:
+.LASF233:
 	.string	"__hibernate_exit_text_end"
-.LASF725:
+.LASF727:
 	.string	"jiffies_64"
-.LASF818:
+.LASF820:
 	.string	"hash"
-.LASF917:
+.LASF919:
 	.string	"nr_events"
 .LASF85:
 	.string	"alternatives_applied"
-.LASF763:
+.LASF765:
 	.string	"__highest_present_section_nr"
-.LASF895:
+.LASF897:
 	.string	"node"
 .LASF66:
 	.string	"android_kabi_reserved1"
@@ -19521,401 +19535,401 @@ crc32_table:
 	.string	"android_kabi_reserved3"
 .LASF69:
 	.string	"android_kabi_reserved4"
-.LASF372:
+.LASF374:
 	.string	"cred"
-.LASF1249:
+.LASF1251:
 	.string	"android_kabi_reserved6"
-.LASF452:
+.LASF454:
 	.string	"android_kabi_reserved7"
-.LASF412:
+.LASF414:
 	.string	"mems_allowed_seq"
-.LASF974:
+.LASF976:
 	.string	"_sigpoll"
-.LASF1086:
+.LASF1088:
 	.string	"dl_bw"
-.LASF723:
+.LASF725:
 	.string	"tick_usec"
-.LASF1298:
+.LASF1300:
 	.string	"irq_safe"
-.LASF1495:
+.LASF1497:
 	.string	"__UNIQUE_ID___x53"
-.LASF980:
+.LASF982:
 	.string	"_sifields"
-.LASF1525:
+.LASF1527:
 	.string	"word"
 .LASF35:
 	.string	"clockid_t"
-.LASF1013:
+.LASF1015:
 	.string	"task_cputime"
-.LASF362:
+.LASF364:
 	.string	"nvcsw"
-.LASF1424:
+.LASF1426:
 	.string	"WF_TYPE_GL16"
-.LASF1286:
+.LASF1288:
 	.string	"work"
-.LASF693:
+.LASF695:
 	.string	"rw_semaphore"
-.LASF1158:
+.LASF1160:
 	.string	"list_lock"
-.LASF314:
+.LASF316:
 	.string	"rcu_tasks_idle_cpu"
-.LASF384:
+.LASF386:
 	.string	"sas_ss_sp"
-.LASF1049:
+.LASF1051:
 	.string	"nr_failed_migrations_affine"
-.LASF497:
+.LASF499:
 	.string	"private_list"
-.LASF371:
+.LASF373:
 	.string	"real_cred"
-.LASF1261:
+.LASF1263:
 	.string	"pm_subsys_data"
-.LASF1121:
+.LASF1123:
 	.string	"futex_pi_state"
-.LASF1038:
+.LASF1040:
 	.string	"wait_sum"
-.LASF301:
+.LASF303:
 	.string	"boost_expires"
-.LASF330:
+.LASF332:
 	.string	"sched_contributes_to_load"
-.LASF1092:
+.LASF1094:
 	.string	"dl_yielded"
-.LASF1118:
+.LASF1120:
 	.string	"css_set"
-.LASF581:
+.LASF583:
 	.string	"WORKINGSET_ACTIVATE"
-.LASF727:
+.LASF729:
 	.string	"preset_lpj"
-.LASF261:
+.LASF263:
 	.string	"fpsimd_state"
 .LASF186:
 	.string	"vregs"
-.LASF316:
+.LASF318:
 	.string	"sched_info"
-.LASF878:
+.LASF880:
 	.string	"PIDTYPE_SID"
-.LASF1375:
+.LASF1377:
 	.string	"driver_private"
-.LASF1212:
+.LASF1214:
 	.string	"device"
-.LASF512:
+.LASF514:
 	.string	"wait_queue_head_t"
 .LASF98:
 	.string	"lock"
-.LASF1103:
+.LASF1105:
 	.string	"perf_sw_context"
-.LASF608:
+.LASF610:
 	.string	"LRU_INACTIVE_FILE"
-.LASF977:
+.LASF979:
 	.string	"si_signo"
-.LASF1190:
+.LASF1192:
 	.string	"complete"
-.LASF1409:
+.LASF1411:
 	.string	"usercopy_fallback"
-.LASF1256:
+.LASF1258:
 	.string	"RPM_REQ_NONE"
-.LASF253:
+.LASF255:
 	.string	"bps_disabled"
-.LASF751:
+.LASF753:
 	.string	"notifier_call"
-.LASF1486:
+.LASF1488:
 	.string	"temp1"
-.LASF1464:
+.LASF1466:
 	.string	"output"
-.LASF398:
+.LASF400:
 	.string	"journal_info"
-.LASF1062:
+.LASF1064:
 	.string	"sched_entity"
 .LASF43:
 	.string	"gfp_t"
-.LASF270:
+.LASF272:
 	.string	"signal_minsigstksz"
 .LASF82:
 	.string	"rodata_enabled"
 .LASF155:
 	.string	"static_key"
-.LASF622:
+.LASF624:
 	.string	"node_zones"
-.LASF367:
+.LASF369:
 	.string	"maj_flt"
-.LASF1357:
+.LASF1359:
 	.string	"iommu_ops"
-.LASF1157:
+.LASF1159:
 	.string	"uevent_seqnum"
-.LASF964:
+.LASF966:
 	.string	"_addr"
-.LASF300:
+.LASF302:
 	.string	"boost_period"
-.LASF1313:
+.LASF1315:
 	.string	"wakeup_source"
-.LASF1200:
+.LASF1202:
 	.string	"thaw_early"
-.LASF1522:
+.LASF1524:
 	.string	"__ilog2_u64"
-.LASF299:
+.LASF301:
 	.string	"boost"
 .LASF199:
 	.string	"__init_end"
-.LASF1273:
+.LASF1275:
 	.string	"is_late_suspended"
-.LASF1104:
+.LASF1106:
 	.string	"perf_nr_task_contexts"
-.LASF646:
+.LASF648:
 	.string	"WMARK_MIN"
-.LASF1214:
+.LASF1216:
 	.string	"driver"
-.LASF575:
+.LASF577:
 	.string	"NR_UNEVICTABLE"
-.LASF857:
+.LASF859:
 	.string	"released"
-.LASF1468:
+.LASF1470:
 	.string	"sftemp"
-.LASF815:
+.LASF817:
 	.string	"target_kn"
-.LASF1282:
+.LASF1284:
 	.string	"must_resume"
-.LASF647:
+.LASF649:
 	.string	"WMARK_LOW"
-.LASF859:
+.LASF861:
 	.string	"vm_operations_struct"
 .LASF140:
 	.string	"raw_spinlock_t"
-.LASF790:
+.LASF792:
 	.string	"rb_node"
-.LASF1217:
+.LASF1219:
 	.string	"links"
-.LASF695:
+.LASF697:
 	.string	"sys_tz"
 .LASF76:
 	.string	"__con_initcall_end"
-.LASF719:
+.LASF721:
 	.string	"set_next_event_phys"
 .LASF22:
 	.string	"__kernel_gid32_t"
-.LASF1198:
+.LASF1200:
 	.string	"resume_early"
 .LASF45:
 	.string	"resource_size_t"
-.LASF334:
+.LASF336:
 	.string	"in_execve"
-.LASF997:
+.LASF999:
 	.string	"rchar"
-.LASF741:
+.LASF743:
 	.string	"system_long_wq"
-.LASF428:
+.LASF430:
 	.string	"tlb_ubc"
-.LASF1514:
+.LASF1516:
 	.string	"n_data"
-.LASF1071:
+.LASF1073:
 	.string	"statistics"
-.LASF1447:
+.LASF1449:
 	.string	"full_version"
-.LASF345:
+.LASF347:
 	.string	"children"
-.LASF1448:
+.LASF1450:
 	.string	"reset_temp_list"
-.LASF984:
+.LASF986:
 	.string	"vmas"
-.LASF771:
+.LASF773:
 	.string	"pcpu_fc_names"
-.LASF530:
+.LASF532:
 	.string	"ADDR_COMPAT_LAYOUT"
-.LASF292:
+.LASF294:
 	.string	"on_rq"
-.LASF1290:
+.LASF1292:
 	.string	"child_count"
-.LASF1285:
+.LASF1287:
 	.string	"timer_expires"
-.LASF827:
+.LASF829:
 	.string	"release"
 .LASF133:
 	.string	"tail"
-.LASF294:
+.LASF296:
 	.string	"static_prio"
-.LASF354:
+.LASF356:
 	.string	"set_child_tid"
-.LASF861:
+.LASF863:
 	.string	"vm_area_struct"
-.LASF1385:
+.LASF1387:
 	.string	"device_dma_parameters"
-.LASF264:
+.LASF266:
 	.string	"sve_state"
-.LASF866:
+.LASF868:
 	.string	"kobj_ns_type_operations"
-.LASF786:
+.LASF788:
 	.string	"idr_base"
 .LASF102:
 	.string	"panic_blink"
-.LASF311:
+.LASF313:
 	.string	"rcu_tasks_nvcsw"
-.LASF440:
+.LASF442:
 	.string	"memcg_oom_gfp_mask"
-.LASF694:
+.LASF696:
 	.string	"m_count"
-.LASF833:
+.LASF835:
 	.string	"atomic_write_len"
-.LASF322:
+.LASF324:
 	.string	"rss_stat"
-.LASF1320:
+.LASF1322:
 	.string	"event_count"
 .LASF42:
 	.string	"ssize_t"
-.LASF481:
+.LASF483:
 	.string	"current_stack_pointer"
-.LASF1197:
+.LASF1199:
 	.string	"suspend_late"
-.LASF1167:
+.LASF1169:
 	.string	"argv"
-.LASF662:
+.LASF664:
 	.string	"__MAX_NR_ZONES"
-.LASF434:
+.LASF436:
 	.string	"dirty_paused_when"
-.LASF1361:
+.LASF1363:
 	.string	"mod_name"
 .LASF51:
 	.string	"list_head"
-.LASF1324:
+.LASF1326:
 	.string	"wakeup_count"
-.LASF347:
+.LASF349:
 	.string	"ptraced"
 .LASF220:
 	.string	"__ctors_start"
-.LASF1406:
+.LASF1408:
 	.string	"device_node"
-.LASF728:
+.LASF730:
 	.string	"ktime_t"
-.LASF1529:
+.LASF1531:
 	.string	"printk"
-.LASF737:
+.LASF739:
 	.string	"data"
-.LASF1057:
+.LASF1059:
 	.string	"nr_wakeups_remote"
-.LASF716:
+.LASF718:
 	.string	"read_cntv_tval_el0"
-.LASF1045:
+.LASF1047:
 	.string	"block_max"
-.LASF588:
+.LASF590:
 	.string	"NR_WRITEBACK"
 .LASF178:
 	.string	"user_val"
-.LASF919:
+.LASF921:
 	.string	"nr_hangs"
-.LASF874:
+.LASF876:
 	.string	"pid_type"
-.LASF242:
+.LASF244:
 	.string	"__mmuoff_data_start"
 .LASF80:
 	.string	"saved_command_line"
-.LASF638:
+.LASF640:
 	.string	"kcompactd"
 .LASF99:
 	.string	"head"
-.LASF1483:
+.LASF1485:
 	.string	"gray"
-.LASF1397:
+.LASF1399:
 	.string	"needs_suppliers"
-.LASF863:
+.LASF865:
 	.string	"KOBJ_NS_TYPE_NONE"
 .LASF90:
 	.string	"linux_proc_banner"
-.LASF1433:
+.LASF1435:
 	.string	"RKF_WF_RESET"
-.LASF1246:
+.LASF1248:
 	.string	"of_node_reused"
 .LASF119:
 	.string	"SYSTEM_POWER_OFF"
-.LASF480:
+.LASF482:
 	.string	"poll"
-.LASF1506:
+.LASF1508:
 	.string	"crc_32"
 .LASF144:
 	.string	"compat_elf_hwcap"
-.LASF946:
+.LASF948:
 	.string	"sigval_t"
 .LASF172:
 	.string	"width"
-.LASF902:
+.LASF904:
 	.string	"base"
-.LASF420:
+.LASF422:
 	.string	"pi_state_cache"
 .LASF185:
 	.string	"user_fpsimd_state"
-.LASF1009:
+.LASF1011:
 	.string	"ptr64"
-.LASF600:
+.LASF602:
 	.string	"NR_UNRECLAIMABLE_PAGES"
-.LASF1090:
+.LASF1092:
 	.string	"dl_throttled"
-.LASF1182:
+.LASF1184:
 	.string	"n_ref"
-.LASF387:
+.LASF389:
 	.string	"task_works"
-.LASF613:
+.LASF615:
 	.string	"recent_rotated"
-.LASF254:
+.LASF256:
 	.string	"wps_disabled"
-.LASF1427:
+.LASF1429:
 	.string	"WF_TYPE_GCC16"
-.LASF1263:
+.LASF1265:
 	.string	"domain_data"
-.LASF617:
+.LASF619:
 	.string	"reclaim_stat"
-.LASF580:
+.LASF582:
 	.string	"WORKINGSET_REFAULT"
-.LASF1300:
+.LASF1302:
 	.string	"timer_autosuspends"
-.LASF234:
+.LASF236:
 	.string	"__hyp_text_start"
-.LASF775:
+.LASF777:
 	.string	"core_id"
 .LASF26:
 	.string	"__kernel_time_t"
-.LASF1172:
+.LASF1174:
 	.string	"uevent"
-.LASF868:
+.LASF870:
 	.string	"grab_current_ns"
-.LASF252:
+.LASF254:
 	.string	"suspended_step"
-.LASF836:
+.LASF838:
 	.string	"mmap"
-.LASF1089:
+.LASF1091:
 	.string	"deadline"
-.LASF516:
+.LASF518:
 	.string	"nodemask_t"
-.LASF1325:
+.LASF1327:
 	.string	"autosleep_enabled"
-.LASF1467:
+.LASF1469:
 	.string	"stype"
-.LASF768:
+.LASF770:
 	.string	"PCPU_FC_EMBED"
-.LASF233:
+.LASF235:
 	.string	"__hyp_idmap_text_end"
-.LASF1459:
+.LASF1461:
 	.string	"gld16_list"
-.LASF1277:
+.LASF1279:
 	.string	"driver_flags"
-.LASF679:
+.LASF681:
 	.string	"compact_considered"
-.LASF973:
+.LASF975:
 	.string	"_sigfault"
 .LASF217:
 	.string	"__softirqentry_text_end"
-.LASF709:
+.LASF711:
 	.string	"arch_timer_erratum_match_type"
-.LASF276:
+.LASF278:
 	.string	"owner"
 .LASF145:
 	.string	"compat_elf_hwcap2"
-.LASF456:
+.LASF458:
 	.string	"tv_sec"
-.LASF934:
+.LASF936:
 	.string	"HRTIMER_BASE_TAI_SOFT"
 .LASF29:
 	.string	"__kernel_clockid_t"
-.LASF1423:
+.LASF1425:
 	.string	"WF_TYPE_GC16"
-.LASF1243:
+.LASF1245:
 	.string	"iommu_fwspec"
-.LASF887:
+.LASF889:
 	.string	"init_pid_ns"
 .LASF216:
 	.string	"__softirqentry_text_start"
@@ -19923,431 +19937,431 @@ crc32_table:
 	.string	"long long unsigned int"
 .LASF63:
 	.string	"parent"
-.LASF499:
+.LASF501:
 	.string	"offset"
-.LASF1441:
+.LASF1443:
 	.string	"length"
-.LASF475:
+.LASF477:
 	.string	"nfds"
 .LASF34:
 	.string	"pid_t"
-.LASF911:
+.LASF913:
 	.string	"active_bases"
 .LASF202:
 	.string	"__start_ro_after_init"
-.LASF468:
+.LASF470:
 	.string	"uaddr2"
-.LASF1149:
+.LASF1151:
 	.string	"uevent_suppress"
 .LASF38:
 	.string	"uid_t"
-.LASF673:
+.LASF675:
 	.string	"present_pages"
-.LASF1079:
+.LASF1081:
 	.string	"time_slice"
-.LASF532:
+.LASF534:
 	.string	"ADDR_LIMIT_32BIT"
-.LASF271:
+.LASF273:
 	.string	"sve_max_vl"
-.LASF610:
+.LASF612:
 	.string	"LRU_UNEVICTABLE"
-.LASF621:
+.LASF623:
 	.string	"pglist_data"
-.LASF1031:
+.LASF1033:
 	.string	"load_avg"
-.LASF528:
+.LASF530:
 	.string	"FDPIC_FUNCPTRS"
-.LASF1491:
+.LASF1493:
 	.string	"waveform"
-.LASF774:
+.LASF776:
 	.string	"thread_id"
-.LASF881:
+.LASF883:
 	.string	"pid_namespace"
-.LASF593:
+.LASF595:
 	.string	"NR_ANON_THPS"
-.LASF606:
+.LASF608:
 	.string	"LRU_INACTIVE_ANON"
-.LASF1283:
+.LASF1285:
 	.string	"may_skip_resume"
-.LASF1412:
+.LASF1414:
 	.string	"KMALLOC_RECLAIM"
-.LASF826:
+.LASF828:
 	.string	"kernfs_ops"
-.LASF793:
+.LASF795:
 	.string	"rb_left"
-.LASF890:
+.LASF892:
 	.string	"refcount_t"
-.LASF263:
+.LASF265:
 	.string	"fpsimd_cpu"
-.LASF1258:
+.LASF1260:
 	.string	"RPM_REQ_SUSPEND"
-.LASF356:
+.LASF358:
 	.string	"utime"
-.LASF224:
+.LASF226:
 	.string	"__nosave_begin"
-.LASF963:
+.LASF965:
 	.string	"_addr_pkey"
-.LASF1532:
+.LASF1534:
 	.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"
-.LASF1262:
+.LASF1264:
 	.string	"clock_list"
 .LASF134:
 	.string	"qspinlock"
-.LASF939:
+.LASF941:
 	.string	"filter"
-.LASF623:
+.LASF625:
 	.string	"node_zonelists"
-.LASF794:
+.LASF796:
 	.string	"rb_root"
-.LASF943:
+.LASF945:
 	.string	"sigval"
-.LASF1281:
+.LASF1283:
 	.string	"no_pm_callbacks"
-.LASF1218:
+.LASF1220:
 	.string	"power"
-.LASF1399:
+.LASF1401:
 	.string	"need_for_probe"
 .LASF154:
 	.string	"static_key_mod"
-.LASF539:
+.LASF541:
 	.string	"MIGRATE_UNMOVABLE"
-.LASF955:
+.LASF957:
 	.string	"_stime"
 .LASF86:
 	.string	"atomic_long_t"
-.LASF609:
+.LASF611:
 	.string	"LRU_ACTIVE_FILE"
-.LASF1023:
+.LASF1025:
 	.string	"enqueued"
-.LASF1138:
+.LASF1140:
 	.string	"is_bin_visible"
-.LASF477:
+.LASF479:
 	.string	"pollfd"
-.LASF1264:
+.LASF1266:
 	.string	"pm_domain_data"
-.LASF736:
+.LASF738:
 	.string	"work_struct"
-.LASF1453:
+.LASF1455:
 	.string	"du_temp_list"
-.LASF1435:
+.LASF1437:
 	.string	"RKF_WF_GC16"
-.LASF1280:
+.LASF1282:
 	.string	"syscore"
-.LASF871:
+.LASF873:
 	.string	"drop_ns"
-.LASF1512:
+.LASF1514:
 	.string	"a_poly"
-.LASF260:
+.LASF262:
 	.string	"tp2_value"
-.LASF1231:
+.LASF1233:
 	.string	"cma_area"
-.LASF1364:
+.LASF1366:
 	.string	"of_match_table"
-.LASF458:
+.LASF460:
 	.string	"timezone"
-.LASF1304:
+.LASF1306:
 	.string	"runtime_status"
-.LASF1267:
+.LASF1269:
 	.string	"can_wakeup"
-.LASF1439:
+.LASF1441:
 	.string	"RKF_WF_A2"
-.LASF1389:
+.LASF1391:
 	.string	"dl_dev_state"
-.LASF1143:
+.LASF1145:
 	.string	"ktype"
 .LASF106:
 	.string	"panic_on_unrecovered_nmi"
-.LASF1021:
+.LASF1023:
 	.string	"inv_weight"
-.LASF399:
+.LASF401:
 	.string	"bio_list"
-.LASF1380:
+.LASF1382:
 	.string	"dev_release"
-.LASF1513:
+.LASF1515:
 	.string	"crc_table"
-.LASF842:
+.LASF844:
 	.string	"kernfs_syscall_ops"
-.LASF572:
+.LASF574:
 	.string	"NR_ACTIVE_ANON"
-.LASF735:
+.LASF737:
 	.string	"work_func_t"
-.LASF658:
+.LASF660:
 	.string	"zone_type"
-.LASF591:
+.LASF593:
 	.string	"NR_SHMEM_THPS"
-.LASF981:
+.LASF983:
 	.string	"siginfo_t"
-.LASF1154:
+.LASF1156:
 	.string	"store"
 .LASF32:
 	.string	"dev_t"
-.LASF1440:
+.LASF1442:
 	.string	"rkf_waveform"
-.LASF238:
+.LASF240:
 	.string	"__initdata_begin"
-.LASF1382:
+.LASF1384:
 	.string	"ns_type"
-.LASF1195:
+.LASF1197:
 	.string	"poweroff"
-.LASF558:
+.LASF560:
 	.string	"NR_ZONE_INACTIVE_FILE"
-.LASF1288:
+.LASF1290:
 	.string	"wakeirq"
-.LASF1164:
+.LASF1166:
 	.string	"namespace"
-.LASF1274:
+.LASF1276:
 	.string	"no_pm"
 .LASF14:
 	.string	"long long int"
-.LASF1095:
+.LASF1097:
 	.string	"dl_timer"
-.LASF1205:
+.LASF1207:
 	.string	"freeze_noirq"
-.LASF1169:
+.LASF1171:
 	.string	"envp_idx"
-.LASF312:
+.LASF314:
 	.string	"rcu_tasks_holdout"
-.LASF1001:
+.LASF1003:
 	.string	"syscfs"
-.LASF620:
+.LASF622:
 	.string	"pgdat"
 .LASF40:
 	.string	"loff_t"
-.LASF521:
+.LASF523:
 	.string	"N_NORMAL_MEMORY"
-.LASF604:
+.LASF606:
 	.string	"NR_VM_NODE_STAT_ITEMS"
-.LASF1336:
+.LASF1338:
 	.string	"printed"
-.LASF1329:
+.LASF1331:
 	.string	"detach"
 .LASF73:
 	.string	"aarch32_opcode_cond_checks"
-.LASF682:
+.LASF684:
 	.string	"compact_blockskip_flush"
-.LASF457:
+.LASF459:
 	.string	"tv_nsec"
-.LASF1232:
+.LASF1234:
 	.string	"removed_mem"
-.LASF805:
+.LASF807:
 	.string	"kernfs_elem_dir"
-.LASF1407:
+.LASF1409:
 	.string	"platform_notify"
-.LASF1014:
+.LASF1016:
 	.string	"sum_exec_runtime"
-.LASF1248:
+.LASF1250:
 	.string	"android_kabi_reserved5"
-.LASF1115:
+.LASF1117:
 	.string	"sighand_struct"
-.LASF272:
+.LASF274:
 	.string	"optimistic_spin_queue"
-.LASF1174:
+.LASF1176:
 	.string	"kernel_kobj"
-.LASF1193:
+.LASF1195:
 	.string	"freeze"
-.LASF259:
+.LASF261:
 	.string	"tp_value"
-.LASF318:
+.LASF320:
 	.string	"pushable_tasks"
-.LASF637:
+.LASF639:
 	.string	"kcompactd_wait"
-.LASF830:
+.LASF832:
 	.string	"seq_next"
-.LASF524:
+.LASF526:
 	.string	"N_CPU"
-.LASF799:
+.LASF801:
 	.string	"fs_overflowuid"
-.LASF619:
+.LASF621:
 	.string	"refaults"
-.LASF998:
+.LASF1000:
 	.string	"wchar"
-.LASF1503:
+.LASF1505:
 	.string	"crccheck"
-.LASF240:
+.LASF242:
 	.string	"__inittext_begin"
-.LASF1335:
+.LASF1337:
 	.string	"burst"
-.LASF1237:
+.LASF1239:
 	.string	"devres_lock"
-.LASF630:
+.LASF632:
 	.string	"pfmemalloc_wait"
-.LASF642:
+.LASF644:
 	.string	"_pad2_"
-.LASF659:
+.LASF661:
 	.string	"ZONE_DMA32"
-.LASF489:
+.LASF491:
 	.string	"nr_cpu_ids"
-.LASF1314:
+.LASF1316:
 	.string	"timer"
-.LASF927:
+.LASF929:
 	.string	"HRTIMER_BASE_MONOTONIC"
-.LASF1369:
+.LASF1371:
 	.string	"devnode"
-.LASF262:
+.LASF264:
 	.string	"thread_struct"
-.LASF1034:
+.LASF1036:
 	.string	"sched_statistics"
-.LASF702:
+.LASF704:
 	.string	"task"
-.LASF1494:
+.LASF1496:
 	.string	"get_wf_level"
-.LASF576:
+.LASF578:
 	.string	"NR_SLAB_RECLAIMABLE"
-.LASF1391:
+.LASF1393:
 	.string	"DL_DEV_PROBING"
-.LASF290:
+.LASF292:
 	.string	"recent_used_cpu"
 .LASF188:
 	.string	"fpcr"
-.LASF279:
+.LASF281:
 	.string	"task_struct"
 .LASF157:
 	.string	"jump_label_t"
-.LASF914:
+.LASF916:
 	.string	"in_hrtirq"
 .LASF111:
 	.string	"crash_kexec_post_notifiers"
-.LASF1411:
+.LASF1413:
 	.string	"KMALLOC_NORMAL"
-.LASF288:
+.LASF290:
 	.string	"wakee_flip_decay_ts"
-.LASF570:
+.LASF572:
 	.string	"NR_LRU_BASE"
 .LASF95:
 	.string	"kptr_restrict"
-.LASF484:
+.LASF486:
 	.string	"ttbr0"
-.LASF1056:
+.LASF1058:
 	.string	"nr_wakeups_local"
-.LASF634:
+.LASF636:
 	.string	"kswapd_failures"
-.LASF755:
+.LASF757:
 	.string	"reboot_notifier_list"
 .LASF127:
 	.string	"taint_flags"
-.LASF229:
+.LASF231:
 	.string	"__exception_text_end"
-.LASF678:
+.LASF680:
 	.string	"compact_cached_migrate_pfn"
-.LASF602:
+.LASF604:
 	.string	"NR_ION_HEAP_POOL"
-.LASF1344:
+.LASF1346:
 	.string	"dev_name"
-.LASF1130:
+.LASF1132:
 	.string	"init_stack"
-.LASF1390:
+.LASF1392:
 	.string	"DL_DEV_NO_DRIVER"
-.LASF1224:
+.LASF1226:
 	.string	"dma_mask"
-.LASF1379:
+.LASF1381:
 	.string	"class_release"
-.LASF1008:
+.LASF1010:
 	.string	"RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE_BIT"
-.LASF1509:
+.LASF1511:
 	.string	"n_accum"
-.LASF987:
+.LASF989:
 	.string	"MM_SWAPENTS"
-.LASF1446:
+.LASF1448:
 	.string	"panel_info"
-.LASF298:
+.LASF300:
 	.string	"last_sleep_ts"
-.LASF341:
+.LASF343:
 	.string	"restart_block"
-.LASF603:
+.LASF605:
 	.string	"NR_GPU_HEAP"
-.LASF584:
+.LASF586:
 	.string	"NR_ANON_MAPPED"
-.LASF1270:
+.LASF1272:
 	.string	"is_prepared"
-.LASF579:
+.LASF581:
 	.string	"NR_ISOLATED_FILE"
-.LASF894:
+.LASF896:
 	.string	"timerqueue_node"
-.LASF1241:
+.LASF1243:
 	.string	"groups"
-.LASF241:
+.LASF243:
 	.string	"__inittext_end"
-.LASF544:
+.LASF546:
 	.string	"MIGRATE_HIGHATOMIC"
-.LASF1327:
+.LASF1329:
 	.string	"dev_pm_qos"
-.LASF1080:
+.LASF1082:
 	.string	"on_list"
-.LASF315:
+.LASF317:
 	.string	"rcu_tasks_holdout_list"
-.LASF1537:
+.LASF1539:
 	.string	"rkf_wf_get_version"
-.LASF402:
+.LASF404:
 	.string	"backing_dev_info"
-.LASF1163:
+.LASF1165:
 	.string	"child_ns_type"
-.LASF567:
+.LASF569:
 	.string	"NR_FREE_CMA_PAGES"
-.LASF1133:
+.LASF1135:
 	.string	"RSEQ_EVENT_SIGNAL_BIT"
-.LASF683:
+.LASF685:
 	.string	"contiguous"
-.LASF649:
+.LASF651:
 	.string	"NR_WMARK"
-.LASF1301:
+.LASF1303:
 	.string	"memalloc_noio"
-.LASF689:
+.LASF691:
 	.string	"zone_idx"
-.LASF536:
+.LASF538:
 	.string	"ADDR_LIMIT_3GB"
-.LASF1463:
+.LASF1465:
 	.string	"crc32_table"
-.LASF1321:
+.LASF1323:
 	.string	"active_count"
-.LASF338:
+.LASF340:
 	.string	"no_cgroup_migration"
-.LASF924:
+.LASF926:
 	.string	"softirq_next_timer"
-.LASF1443:
+.LASF1445:
 	.string	"version"
-.LASF1147:
+.LASF1149:
 	.string	"state_add_uevent_sent"
-.LASF1372:
+.LASF1374:
 	.string	"PROBE_FORCE_SYNCHRONOUS"
-.LASF1156:
+.LASF1158:
 	.string	"uevent_helper"
-.LASF1421:
+.LASF1423:
 	.string	"WF_TYPE_AUTO"
-.LASF1516:
+.LASF1518:
 	.string	"kmalloc"
-.LASF992:
+.LASF994:
 	.string	"events"
 .LASF176:
 	.string	"user_mask"
 .LASF113:
 	.string	"root_mountflags"
-.LASF1518:
+.LASF1520:
 	.string	"order"
 .LASF3:
 	.string	"unsigned int"
-.LASF549:
+.LASF551:
 	.string	"free_area"
-.LASF302:
+.LASF304:
 	.string	"sched_task_group"
-.LASF1180:
+.LASF1182:
 	.string	"n_klist"
-.LASF672:
+.LASF674:
 	.string	"spanned_pages"
-.LASF1371:
+.LASF1373:
 	.string	"PROBE_PREFER_ASYNCHRONOUS"
-.LASF466:
+.LASF468:
 	.string	"bitset"
-.LASF1165:
+.LASF1167:
 	.string	"get_ownership"
-.LASF885:
+.LASF887:
 	.string	"init_struct_pid"
 .LASF116:
 	.string	"SYSTEM_SCHEDULING"
-.LASF817:
+.LASF819:
 	.string	"active"
 .LASF121:
 	.string	"SYSTEM_SUSPEND"
@@ -20357,73 +20371,73 @@ crc32_table:
 	.string	"raw_spinlock"
 .LASF8:
 	.string	"short int"
-.LASF248:
-	.string	"kimage_vaddr"
+.LASF224:
+	.string	"__noinstr_text_start"
 .LASF65:
 	.string	"child"
-.LASF762:
+.LASF764:
 	.string	"pageblock_flags"
-.LASF419:
+.LASF421:
 	.string	"pi_state_list"
-.LASF931:
+.LASF933:
 	.string	"HRTIMER_BASE_MONOTONIC_SOFT"
-.LASF1029:
+.LASF1031:
 	.string	"util_sum"
-.LASF745:
+.LASF747:
 	.string	"system_freezable_power_efficient_wq"
 .LASF50:
 	.string	"prev"
-.LASF1297:
+.LASF1299:
 	.string	"no_callbacks"
-.LASF308:
+.LASF310:
 	.string	"rcu_read_unlock_special"
-.LASF1481:
+.LASF1483:
 	.string	"parse_wf_gray16"
-.LASF1296:
+.LASF1298:
 	.string	"ignore_children"
-.LASF629:
+.LASF631:
 	.string	"kswapd_wait"
 .LASF124:
 	.string	"c_true"
-.LASF243:
+.LASF245:
 	.string	"__mmuoff_data_end"
-.LASF983:
+.LASF985:
 	.string	"seqnum"
-.LASF295:
+.LASF297:
 	.string	"normal_prio"
 .LASF211:
 	.string	"__entry_text_end"
-.LASF1204:
+.LASF1206:
 	.string	"resume_noirq"
-.LASF394:
+.LASF396:
 	.string	"wake_q"
-.LASF594:
+.LASF596:
 	.string	"NR_UNSTABLE_NFS"
-.LASF953:
+.LASF955:
 	.string	"_status"
-.LASF559:
+.LASF561:
 	.string	"NR_ZONE_ACTIVE_FILE"
 .LASF187:
 	.string	"fpsr"
-.LASF514:
+.LASF516:
 	.string	"sequence"
 .LASF61:
 	.string	"flags"
-.LASF459:
+.LASF461:
 	.string	"tz_minuteswest"
-.LASF424:
+.LASF426:
 	.string	"rseq"
-.LASF1470:
+.LASF1472:
 	.string	"new_gray"
-.LASF442:
+.LASF444:
 	.string	"memcg_nr_pages_over_high"
-.LASF350:
+.LASF352:
 	.string	"pid_links"
-.LASF1436:
+.LASF1438:
 	.string	"RKF_WF_GL16"
-.LASF230:
+.LASF232:
 	.string	"__hibernate_exit_text_start"
-.LASF1315:
+.LASF1317:
 	.string	"total_time"
 .LASF209:
 	.string	"__kprobes_text_end"

commit 536c29c220049b4107b189c28e8d3618ed20e1f1
Author: Yandong Lin <yandong.lin@rock-chips.com>
Date:   Fri Jun 25 10:07:13 2021 +0800

    arm64: dts: rockchip: rk3568: modify rkvdec compatible
    
    Signed-off-by: Yandong Lin <yandong.lin@rock-chips.com>
    Change-Id: I0c0d927bd4c995f2be4570a5c2128acbf7f6cc63

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index f42cf09c5066..f7ef831fc3d7 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -1485,7 +1485,7 @@
 	};
 
 	rkvdec: rkvdec@fdf80200 {
-		compatible = "rockchip,rkv-decoder-v2";
+		compatible = "rockchip,rkv-decoder-rk3568", "rockchip,rkv-decoder-v2";
 		reg = <0x0 0xfdf80200 0x0 0x400>;
 		interrupts = <GIC_SPI 91 IRQ_TYPE_LEVEL_HIGH>;
 		interrupt-names = "irq_dec";

commit c2de227bfca1e46abea92f3e9a7e4d2575b123cb
Author: Yandong Lin <yandong.lin@rock-chips.com>
Date:   Fri Jun 25 10:01:19 2021 +0800

    dt-bindings: video: mpp: add rk3568 codec properties
    
    Signed-off-by: Yandong Lin <yandong.lin@rock-chips.com>
    Change-Id: I53eed4f4f0d444515dcac4c533baa15c8fba6f32

diff --git a/Documentation/devicetree/bindings/video/rockchip_codec.txt b/Documentation/devicetree/bindings/video/rockchip_codec.txt
index a51692d67591..9f51becda38c 100644
--- a/Documentation/devicetree/bindings/video/rockchip_codec.txt
+++ b/Documentation/devicetree/bindings/video/rockchip_codec.txt
@@ -14,6 +14,7 @@ Required properties:
 		"rockchip,hevc-decoder-rk3368",
 		"rockchip,rkv-decoder-v1",
 		"rockchip,rkv-decoder-v2",
+		"rockchip,rkv-decoder-rk3568",
 		"rockchip,rkv-decoder-rk3399",
 		"rockchip,rkv-decoder-rk3328",
 		"rockchip,rkv-jpeg-decoder-v1",

commit 6440e5a3fb415780e983000edf55811a5fb2fc8e
Author: Maciej Żenczykowski <maze@google.com>
Date:   Wed Jun 16 17:09:51 2021 -0700

    FROMGIT: bpf: Do not change gso_size during bpf_skb_change_proto()
    
    This is technically a backwards incompatible change in behaviour, but I'm
    going to argue that it is very unlikely to break things, and likely to fix
    *far* more then it breaks.
    
    In no particular order, various reasons follow:
    
    (a) I've long had a bug assigned to myself to debug a super rare kernel crash
    on Android Pixel phones which can (per stacktrace) be traced back to BPF clat
    IPv6 to IPv4 protocol conversion causing some sort of ugly failure much later
    on during transmit deep in the GSO engine, AFAICT precisely because of this
    change to gso_size, though I've never been able to manually reproduce it. I
    believe it may be related to the particular network offload support of attached
    USB ethernet dongle being used for tethering off of an IPv6-only cellular
    connection. The reason might be we end up with more segments than max permitted,
    or with a GSO packet with only one segment... (either way we break some
    assumption and hit a BUG_ON)
    
    (b) There is no check that the gso_size is > 20 when reducing it by 20, so we
    might end up with a negative (or underflowing) gso_size or a gso_size of 0.
    This can't possibly be good. Indeed this is probably somehow exploitable (or
    at least can result in a kernel crash) by delivering crafted packets and perhaps
    triggering an infinite loop or a divide by zero... As a reminder: gso_size (MSS)
    is related to MTU, but not directly derived from it: gso_size/MSS may be
    significantly smaller then one would get by deriving from local MTU. And on
    some NICs (which do loose MTU checking on receive, it may even potentially be
    larger, for example my work pc with 1500 MTU can receive 1520 byte frames [and
    sometimes does due to bugs in a vendor plat46 implementation]). Indeed even just
    going from 21 to 1 is potentially problematic because it increases the number
    of segments by a factor of 21 (think DoS, or some other crash due to too many
    segments).
    
    (c) It's always safe to not increase the gso_size, because it doesn't result in
    the max packet size increasing.  So the skb_increase_gso_size() call was always
    unnecessary for correctness (and outright undesirable, see later). As such the
    only part which is potentially dangerous (ie. could cause backwards compatibility
    issues) is the removal of the skb_decrease_gso_size() call.
    
    (d) If the packets are ultimately destined to the local device, then there is
    absolutely no benefit to playing around with gso_size. It only matters if the
    packets will egress the device. ie. we're either forwarding, or transmitting
    from the device.
    
    (e) This logic only triggers for packets which are GSO. It does not trigger for
    skbs which are not GSO. It will not convert a non-GSO MTU sized packet into a
    GSO packet (and you don't even know what the MTU is, so you can't even fix it).
    As such your transmit path must *already* be able to handle an MTU 20 bytes
    larger then your receive path (for IPv4 to IPv6 translation) - and indeed 28
    bytes larger due to IPv4 fragments. Thus removing the skb_decrease_gso_size()
    call doesn't actually increase the size of the packets your transmit side must
    be able to handle. ie. to handle non-GSO max-MTU packets, the IPv4/IPv6 device/
    route MTUs must already be set correctly. Since for example with an IPv4 egress
    MTU of 1500, IPv4 to IPv6 translation will already build 1520 byte IPv6 frames,
    so you need a 1520 byte device MTU. This means if your IPv6 device's egress
    MTU is 1280, your IPv4 route must be 1260 (and actually 1252, because of the
    need to handle fragments). This is to handle normal non-GSO packets. Thus the
    reduction is simply not needed for GSO packets, because when they're correctly
    built, they will already be the right size.
    
    (f) TSO/GSO should be able to exactly undo GRO: the number of packets (TCP
    segments) should not be modified, so that TCP's MSS counting works correctly
    (this matters for congestion control). If protocol conversion changes the
    gso_size, then the number of TCP segments may increase or decrease. Packet loss
    after protocol conversion can result in partial loss of MSS segments that the
    sender sent. How's the sending TCP stack going to react to receiving ACKs/SACKs
    in the middle of the segments it sent?
    
    (g) skb_{decrease,increase}_gso_size() are already no-ops for GSO_BY_FRAGS
    case (besides triggering WARN_ON_ONCE). This means you already cannot guarantee
    that gso_size (and thus resulting packet MTU) is changed. ie. you must assume
    it won't be changed.
    
    (h) changing gso_size is outright buggy for UDP GSO packets, where framing
    matters (I believe that's also the case for SCTP, but it's already excluded
    by [g]).  So the only remaining case is TCP, which also doesn't want it
    (see [f]).
    
    (i) see also the reasoning on the previous attempt at fixing this
    (commit fa7b83bf3b156c767f3e4a25bbf3817b08f3ff8e) which shows that the current
    behaviour causes TCP packet loss:
    
      In the forwarding path GRO -> BPF 6 to 4 -> GSO for TCP traffic, the
      coalesced packet payload can be > MSS, but < MSS + 20.
    
      bpf_skb_proto_6_to_4() will upgrade the MSS and it can be > the payload
      length. After then tcp_gso_segment checks for the payload length if it
      is <= MSS. The condition is causing the packet to be dropped.
    
      tcp_gso_segment():
        [...]
        mss = skb_shinfo(skb)->gso_size;
        if (unlikely(skb->len <= mss)) goto out;
        [...]
    
    Thus changing the gso_size is simply a very bad idea. Increasing is unnecessary
    and buggy, and decreasing can go negative.
    
    Fixes: 6578171a7ff0 ("bpf: add bpf_skb_change_proto helper")
    Signed-off-by: Maciej Żenczykowski <maze@google.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Cc: Dongseok Yi <dseok.yi@samsung.com>
    Cc: Willem de Bruijn <willemb@google.com>
    Link: https://lore.kernel.org/bpf/CANP3RGfjLikQ6dg=YpBU0OeHvyv7JOki7CyOUS9modaXAi-9vQ@mail.gmail.com
    Link: https://lore.kernel.org/bpf/20210617000953.2787453-2-zenczykowski@gmail.com
    
    (cherry picked from commit 364745fbe981a4370f50274475da4675661104df https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/commit/?id=364745fbe981a4370f50274475da4675661104df )
    Test: builds, TreeHugger
    Bug: 188690383
    Signed-off-by: Maciej Żenczykowski <maze@google.com>
    Change-Id: I0ef3174cbd3caaa42d5779334a9c0bfdc9ab81f5
    (cherry picked from commit 1bdb208df800d04656edf2d39c82042dac3ce131)

diff --git a/net/core/filter.c b/net/core/filter.c
index 5b3d60f89af9..780c71086d0b 100644
--- a/net/core/filter.c
+++ b/net/core/filter.c
@@ -2639,8 +2639,6 @@ static int bpf_skb_proto_4_to_6(struct sk_buff *skb)
 			shinfo->gso_type |=  SKB_GSO_TCPV6;
 		}
 
-		/* Due to IPv6 header, MSS needs to be downgraded. */
-		skb_decrease_gso_size(shinfo, len_diff);
 		/* Header must be checked, and gso_segs recomputed. */
 		shinfo->gso_type |= SKB_GSO_DODGY;
 		shinfo->gso_segs = 0;
@@ -2680,8 +2678,6 @@ static int bpf_skb_proto_6_to_4(struct sk_buff *skb)
 			shinfo->gso_type |=  SKB_GSO_TCPV4;
 		}
 
-		/* Due to IPv4 header, MSS can be upgraded. */
-		skb_increase_gso_size(shinfo, len_diff);
 		/* Header must be checked, and gso_segs recomputed. */
 		shinfo->gso_type |= SKB_GSO_DODGY;
 		shinfo->gso_segs = 0;

commit c7a7aa3370eea1736e3bbf09e7d08bc586690060
Author: Yandong Lin <yandong.lin@rock-chips.com>
Date:   Mon Jun 7 15:08:43 2021 +0800

    video: rockchip: mpp: Fix 3568 cabac/cavlc switch issue
    
    Signed-off-by: Yandong Lin <yandong.lin@rock-chips.com>
    Change-Id: Ifd54d76470889e4d76d97cd33b2a4af26c7af6ab

diff --git a/drivers/video/rockchip/mpp/hack/mpp_rkvdec2_hack_rk3568.c b/drivers/video/rockchip/mpp/hack/mpp_rkvdec2_hack_rk3568.c
new file mode 100644
index 000000000000..c2bb2687fc3d
--- /dev/null
+++ b/drivers/video/rockchip/mpp/hack/mpp_rkvdec2_hack_rk3568.c
@@ -0,0 +1,732 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co., Ltd
+ *
+ * author:
+ *	Herman Chen <herman.chen@rock-chips.com>
+ */
+
+#include <linux/printk.h>
+
+#define FIX_RK3568_BUF_SIZE	(2 * PAGE_SIZE)
+#define RKDEC_HACK_DATA_RPS_OFFSET (128 * 1)
+#define RKDEC_HACK_DATA_PPS_OFFSET (128 * 2)
+#define RKDEC_HACK_DATA_RLC_OFFSET (128 * 3)
+#define RKDEC_HACK_DATA_OUT_OFFSET (128 * 4)
+#define RKDEC_HACK_DATA_COLMV_OFFSET (128 * 5)
+
+struct hack_info {
+	u32 data;
+	u32 offset;
+};
+
+static const char h264_cabac_tbl[] = {
+	0x14, 0xf1, 0x02, 0x36, 0x03, 0x4a, 0x14, 0xf1,
+	0x02, 0x36, 0x03, 0x4a, 0xe4, 0x7f, 0xe9, 0x68,
+	0xfa, 0x35, 0xff, 0x36, 0x07, 0x33, 0x17, 0x21,
+	0x17, 0x02, 0x15, 0x00, 0x01, 0x09, 0x00, 0x31,
+	0xdb, 0x76, 0x05, 0x39, 0xf3, 0x4e, 0xf5, 0x41,
+	0x01, 0x3e, 0x0c, 0x31, 0xfc, 0x49, 0x11, 0x32,
+	0x12, 0x40, 0x09, 0x2b, 0x1d, 0x00, 0x1a, 0x43,
+	0x10, 0x5a, 0x09, 0x68, 0xd2, 0x7f, 0xec, 0x68,
+	0x01, 0x43, 0xf3, 0x4e, 0xf5, 0x41, 0x01, 0x3e,
+	0xfa, 0x56, 0xef, 0x5f, 0xfa, 0x3d, 0x09, 0x2d,
+	0xfd, 0x45, 0xfa, 0x51, 0xf5, 0x60, 0x06, 0x37,
+	0x07, 0x43, 0xfb, 0x56, 0x02, 0x58, 0x00, 0x3a,
+	0xfd, 0x4c, 0xf6, 0x5e, 0x05, 0x36, 0x04, 0x45,
+	0xfd, 0x51, 0x00, 0x58, 0xf9, 0x43, 0xfb, 0x4a,
+	0xfc, 0x4a, 0xfb, 0x50, 0xf9, 0x48, 0x01, 0x3a,
+	0x00, 0x29, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f,
+	0xf7, 0x53, 0x04, 0x56, 0x00, 0x61, 0xf9, 0x48,
+	0x0d, 0x29, 0x03, 0x3e, 0x00, 0x2d, 0xfc, 0x4e,
+	0xfd, 0x60, 0xe5, 0x7e, 0xe4, 0x62, 0xe7, 0x65,
+	0xe9, 0x43, 0xe4, 0x52, 0xec, 0x5e, 0xf0, 0x53,
+	0xea, 0x6e, 0xeb, 0x5b, 0xee, 0x66, 0xf3, 0x5d,
+	0xe3, 0x7f, 0xf9, 0x5c, 0xfb, 0x59, 0xf9, 0x60,
+	0xf3, 0x6c, 0xfd, 0x2e, 0xff, 0x41, 0xff, 0x39,
+	0xf7, 0x5d, 0xfd, 0x4a, 0xf7, 0x5c, 0xf8, 0x57,
+	0xe9, 0x7e, 0x05, 0x36, 0x06, 0x3c, 0x06, 0x3b,
+	0x06, 0x45, 0xff, 0x30, 0x00, 0x44, 0xfc, 0x45,
+	0xf8, 0x58, 0xfe, 0x55, 0xfa, 0x4e, 0xff, 0x4b,
+	0xf9, 0x4d, 0x02, 0x36, 0x05, 0x32, 0xfd, 0x44,
+	0x01, 0x32, 0x06, 0x2a, 0xfc, 0x51, 0x01, 0x3f,
+	0xfc, 0x46, 0x00, 0x43, 0x02, 0x39, 0xfe, 0x4c,
+	0x0b, 0x23, 0x04, 0x40, 0x01, 0x3d, 0x0b, 0x23,
+	0x12, 0x19, 0x0c, 0x18, 0x0d, 0x1d, 0x0d, 0x24,
+	0xf6, 0x5d, 0xf9, 0x49, 0xfe, 0x49, 0x0d, 0x2e,
+	0x09, 0x31, 0xf9, 0x64, 0x09, 0x35, 0x02, 0x35,
+	0x05, 0x35, 0xfe, 0x3d, 0x00, 0x38, 0x00, 0x38,
+	0xf3, 0x3f, 0xfb, 0x3c, 0xff, 0x3e, 0x04, 0x39,
+	0xfa, 0x45, 0x04, 0x39, 0x0e, 0x27, 0x04, 0x33,
+	0x0d, 0x44, 0x03, 0x40, 0x01, 0x3d, 0x09, 0x3f,
+	0x07, 0x32, 0x10, 0x27, 0x05, 0x2c, 0x04, 0x34,
+	0x0b, 0x30, 0xfb, 0x3c, 0xff, 0x3b, 0x00, 0x3b,
+	0x16, 0x21, 0x05, 0x2c, 0x0e, 0x2b, 0xff, 0x4e,
+	0x00, 0x3c, 0x09, 0x45, 0x0b, 0x1c, 0x02, 0x28,
+	0x03, 0x2c, 0x00, 0x31, 0x00, 0x2e, 0x02, 0x2c,
+	0x02, 0x33, 0x00, 0x2f, 0x04, 0x27, 0x02, 0x3e,
+	0x06, 0x2e, 0x00, 0x36, 0x03, 0x36, 0x02, 0x3a,
+	0x04, 0x3f, 0x06, 0x33, 0x06, 0x39, 0x07, 0x35,
+	0x06, 0x34, 0x06, 0x37, 0x0b, 0x2d, 0x0e, 0x24,
+	0x08, 0x35, 0xff, 0x52, 0x07, 0x37, 0xfd, 0x4e,
+	0x0f, 0x2e, 0x16, 0x1f, 0xff, 0x54, 0x19, 0x07,
+	0x1e, 0xf9, 0x1c, 0x03, 0x1c, 0x04, 0x20, 0x00,
+	0x22, 0xff, 0x1e, 0x06, 0x1e, 0x06, 0x20, 0x09,
+	0x1f, 0x13, 0x1a, 0x1b, 0x1a, 0x1e, 0x25, 0x14,
+	0x1c, 0x22, 0x11, 0x46, 0x01, 0x43, 0x05, 0x3b,
+	0x09, 0x43, 0x10, 0x1e, 0x12, 0x20, 0x12, 0x23,
+	0x16, 0x1d, 0x18, 0x1f, 0x17, 0x26, 0x12, 0x2b,
+	0x14, 0x29, 0x0b, 0x3f, 0x09, 0x3b, 0x09, 0x40,
+	0xff, 0x5e, 0xfe, 0x59, 0xf7, 0x6c, 0xfa, 0x4c,
+	0xfe, 0x2c, 0x00, 0x2d, 0x00, 0x34, 0xfd, 0x40,
+	0xfe, 0x3b, 0xfc, 0x46, 0xfc, 0x4b, 0xf8, 0x52,
+	0xef, 0x66, 0xf7, 0x4d, 0x03, 0x18, 0x00, 0x2a,
+	0x00, 0x30, 0x00, 0x37, 0xfa, 0x3b, 0xf9, 0x47,
+	0xf4, 0x53, 0xf5, 0x57, 0xe2, 0x77, 0x01, 0x3a,
+	0xfd, 0x1d, 0xff, 0x24, 0x01, 0x26, 0x02, 0x2b,
+	0xfa, 0x37, 0x00, 0x3a, 0x00, 0x40, 0xfd, 0x4a,
+	0xf6, 0x5a, 0x00, 0x46, 0xfc, 0x1d, 0x05, 0x1f,
+	0x07, 0x2a, 0x01, 0x3b, 0xfe, 0x3a, 0xfd, 0x48,
+	0xfd, 0x51, 0xf5, 0x61, 0x00, 0x3a, 0x08, 0x05,
+	0x0a, 0x0e, 0x0e, 0x12, 0x0d, 0x1b, 0x02, 0x28,
+	0x00, 0x3a, 0xfd, 0x46, 0xfa, 0x4f, 0xf8, 0x55,
+	0x00, 0x00, 0xf3, 0x6a, 0xf0, 0x6a, 0xf6, 0x57,
+	0xeb, 0x72, 0xee, 0x6e, 0xf2, 0x62, 0xea, 0x6e,
+	0xeb, 0x6a, 0xee, 0x67, 0xeb, 0x6b, 0xe9, 0x6c,
+	0xe6, 0x70, 0xf6, 0x60, 0xf4, 0x5f, 0xfb, 0x5b,
+	0xf7, 0x5d, 0xea, 0x5e, 0xfb, 0x56, 0x09, 0x43,
+	0xfc, 0x50, 0xf6, 0x55, 0xff, 0x46, 0x07, 0x3c,
+	0x09, 0x3a, 0x05, 0x3d, 0x0c, 0x32, 0x0f, 0x32,
+	0x12, 0x31, 0x11, 0x36, 0x0a, 0x29, 0x07, 0x2e,
+	0xff, 0x33, 0x07, 0x31, 0x08, 0x34, 0x09, 0x29,
+	0x06, 0x2f, 0x02, 0x37, 0x0d, 0x29, 0x0a, 0x2c,
+	0x06, 0x32, 0x05, 0x35, 0x0d, 0x31, 0x04, 0x3f,
+	0x06, 0x40, 0xfe, 0x45, 0xfe, 0x3b, 0x06, 0x46,
+	0x0a, 0x2c, 0x09, 0x1f, 0x0c, 0x2b, 0x03, 0x35,
+	0x0e, 0x22, 0x0a, 0x26, 0xfd, 0x34, 0x0d, 0x28,
+	0x11, 0x20, 0x07, 0x2c, 0x07, 0x26, 0x0d, 0x32,
+	0x0a, 0x39, 0x1a, 0x2b, 0x0e, 0x0b, 0x0b, 0x0e,
+	0x09, 0x0b, 0x12, 0x0b, 0x15, 0x09, 0x17, 0xfe,
+	0x20, 0xf1, 0x20, 0xf1, 0x22, 0xeb, 0x27, 0xe9,
+	0x2a, 0xdf, 0x29, 0xe1, 0x2e, 0xe4, 0x26, 0xf4,
+	0x15, 0x1d, 0x2d, 0xe8, 0x35, 0xd3, 0x30, 0xe6,
+	0x41, 0xd5, 0x2b, 0xed, 0x27, 0xf6, 0x1e, 0x09,
+	0x12, 0x1a, 0x14, 0x1b, 0x00, 0x39, 0xf2, 0x52,
+	0xfb, 0x4b, 0xed, 0x61, 0xdd, 0x7d, 0x1b, 0x00,
+	0x1c, 0x00, 0x1f, 0xfc, 0x1b, 0x06, 0x22, 0x08,
+	0x1e, 0x0a, 0x18, 0x16, 0x21, 0x13, 0x16, 0x20,
+	0x1a, 0x1f, 0x15, 0x29, 0x1a, 0x2c, 0x17, 0x2f,
+	0x10, 0x41, 0x0e, 0x47, 0x08, 0x3c, 0x06, 0x3f,
+	0x11, 0x41, 0x15, 0x18, 0x17, 0x14, 0x1a, 0x17,
+	0x1b, 0x20, 0x1c, 0x17, 0x1c, 0x18, 0x17, 0x28,
+	0x18, 0x20, 0x1c, 0x1d, 0x17, 0x2a, 0x13, 0x39,
+	0x16, 0x35, 0x16, 0x3d, 0x0b, 0x56, 0x0c, 0x28,
+	0x0b, 0x33, 0x0e, 0x3b, 0xfc, 0x4f, 0xf9, 0x47,
+	0xfb, 0x45, 0xf7, 0x46, 0xf8, 0x42, 0xf6, 0x44,
+	0xed, 0x49, 0xf4, 0x45, 0xf0, 0x46, 0xf1, 0x43,
+	0xec, 0x3e, 0xed, 0x46, 0xf0, 0x42, 0xea, 0x41,
+	0xec, 0x3f, 0x09, 0xfe, 0x1a, 0xf7, 0x21, 0xf7,
+	0x27, 0xf9, 0x29, 0xfe, 0x2d, 0x03, 0x31, 0x09,
+	0x2d, 0x1b, 0x24, 0x3b, 0xfa, 0x42, 0xf9, 0x23,
+	0xf9, 0x2a, 0xf8, 0x2d, 0xfb, 0x30, 0xf4, 0x38,
+	0xfa, 0x3c, 0xfb, 0x3e, 0xf8, 0x42, 0xf8, 0x4c,
+	0xfb, 0x55, 0xfa, 0x51, 0xf6, 0x4d, 0xf9, 0x51,
+	0xef, 0x50, 0xee, 0x49, 0xfc, 0x4a, 0xf6, 0x53,
+	0xf7, 0x47, 0xf7, 0x43, 0xff, 0x3d, 0xf8, 0x42,
+	0xf2, 0x42, 0x00, 0x3b, 0x02, 0x3b, 0x15, 0xf3,
+	0x21, 0xf2, 0x27, 0xf9, 0x2e, 0xfe, 0x33, 0x02,
+	0x3c, 0x06, 0x3d, 0x11, 0x37, 0x22, 0x2a, 0x3e,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x14, 0xf1, 0x02, 0x36, 0x03, 0x4a, 0x14, 0xf1,
+	0x02, 0x36, 0x03, 0x4a, 0xe4, 0x7f, 0xe9, 0x68,
+	0xfa, 0x35, 0xff, 0x36, 0x07, 0x33, 0x16, 0x19,
+	0x22, 0x00, 0x10, 0x00, 0xfe, 0x09, 0x04, 0x29,
+	0xe3, 0x76, 0x02, 0x41, 0xfa, 0x47, 0xf3, 0x4f,
+	0x05, 0x34, 0x09, 0x32, 0xfd, 0x46, 0x0a, 0x36,
+	0x1a, 0x22, 0x13, 0x16, 0x28, 0x00, 0x39, 0x02,
+	0x29, 0x24, 0x1a, 0x45, 0xd3, 0x7f, 0xf1, 0x65,
+	0xfc, 0x4c, 0xfa, 0x47, 0xf3, 0x4f, 0x05, 0x34,
+	0x06, 0x45, 0xf3, 0x5a, 0x00, 0x34, 0x08, 0x2b,
+	0xfe, 0x45, 0xfb, 0x52, 0xf6, 0x60, 0x02, 0x3b,
+	0x02, 0x4b, 0xfd, 0x57, 0xfd, 0x64, 0x01, 0x38,
+	0xfd, 0x4a, 0xfa, 0x55, 0x00, 0x3b, 0xfd, 0x51,
+	0xf9, 0x56, 0xfb, 0x5f, 0xff, 0x42, 0xff, 0x4d,
+	0x01, 0x46, 0xfe, 0x56, 0xfb, 0x48, 0x00, 0x3d,
+	0x00, 0x29, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f,
+	0xf7, 0x53, 0x04, 0x56, 0x00, 0x61, 0xf9, 0x48,
+	0x0d, 0x29, 0x03, 0x3e, 0x0d, 0x0f, 0x07, 0x33,
+	0x02, 0x50, 0xd9, 0x7f, 0xee, 0x5b, 0xef, 0x60,
+	0xe6, 0x51, 0xdd, 0x62, 0xe8, 0x66, 0xe9, 0x61,
+	0xe5, 0x77, 0xe8, 0x63, 0xeb, 0x6e, 0xee, 0x66,
+	0xdc, 0x7f, 0x00, 0x50, 0xfb, 0x59, 0xf9, 0x5e,
+	0xfc, 0x5c, 0x00, 0x27, 0x00, 0x41, 0xf1, 0x54,
+	0xdd, 0x7f, 0xfe, 0x49, 0xf4, 0x68, 0xf7, 0x5b,
+	0xe1, 0x7f, 0x03, 0x37, 0x07, 0x38, 0x07, 0x37,
+	0x08, 0x3d, 0xfd, 0x35, 0x00, 0x44, 0xf9, 0x4a,
+	0xf7, 0x58, 0xf3, 0x67, 0xf3, 0x5b, 0xf7, 0x59,
+	0xf2, 0x5c, 0xf8, 0x4c, 0xf4, 0x57, 0xe9, 0x6e,
+	0xe8, 0x69, 0xf6, 0x4e, 0xec, 0x70, 0xef, 0x63,
+	0xb2, 0x7f, 0xba, 0x7f, 0xce, 0x7f, 0xd2, 0x7f,
+	0xfc, 0x42, 0xfb, 0x4e, 0xfc, 0x47, 0xf8, 0x48,
+	0x02, 0x3b, 0xff, 0x37, 0xf9, 0x46, 0xfa, 0x4b,
+	0xf8, 0x59, 0xde, 0x77, 0xfd, 0x4b, 0x20, 0x14,
+	0x1e, 0x16, 0xd4, 0x7f, 0x00, 0x36, 0xfb, 0x3d,
+	0x00, 0x3a, 0xff, 0x3c, 0xfd, 0x3d, 0xf8, 0x43,
+	0xe7, 0x54, 0xf2, 0x4a, 0xfb, 0x41, 0x05, 0x34,
+	0x02, 0x39, 0x00, 0x3d, 0xf7, 0x45, 0xf5, 0x46,
+	0x12, 0x37, 0xfc, 0x47, 0x00, 0x3a, 0x07, 0x3d,
+	0x09, 0x29, 0x12, 0x19, 0x09, 0x20, 0x05, 0x2b,
+	0x09, 0x2f, 0x00, 0x2c, 0x00, 0x33, 0x02, 0x2e,
+	0x13, 0x26, 0xfc, 0x42, 0x0f, 0x26, 0x0c, 0x2a,
+	0x09, 0x22, 0x00, 0x59, 0x04, 0x2d, 0x0a, 0x1c,
+	0x0a, 0x1f, 0x21, 0xf5, 0x34, 0xd5, 0x12, 0x0f,
+	0x1c, 0x00, 0x23, 0xea, 0x26, 0xe7, 0x22, 0x00,
+	0x27, 0xee, 0x20, 0xf4, 0x66, 0xa2, 0x00, 0x00,
+	0x38, 0xf1, 0x21, 0xfc, 0x1d, 0x0a, 0x25, 0xfb,
+	0x33, 0xe3, 0x27, 0xf7, 0x34, 0xde, 0x45, 0xc6,
+	0x43, 0xc1, 0x2c, 0xfb, 0x20, 0x07, 0x37, 0xe3,
+	0x20, 0x01, 0x00, 0x00, 0x1b, 0x24, 0x21, 0xe7,
+	0x22, 0xe2, 0x24, 0xe4, 0x26, 0xe4, 0x26, 0xe5,
+	0x22, 0xee, 0x23, 0xf0, 0x22, 0xf2, 0x20, 0xf8,
+	0x25, 0xfa, 0x23, 0x00, 0x1e, 0x0a, 0x1c, 0x12,
+	0x1a, 0x19, 0x1d, 0x29, 0x00, 0x4b, 0x02, 0x48,
+	0x08, 0x4d, 0x0e, 0x23, 0x12, 0x1f, 0x11, 0x23,
+	0x15, 0x1e, 0x11, 0x2d, 0x14, 0x2a, 0x12, 0x2d,
+	0x1b, 0x1a, 0x10, 0x36, 0x07, 0x42, 0x10, 0x38,
+	0x0b, 0x49, 0x0a, 0x43, 0xf6, 0x74, 0xe9, 0x70,
+	0xf1, 0x47, 0xf9, 0x3d, 0x00, 0x35, 0xfb, 0x42,
+	0xf5, 0x4d, 0xf7, 0x50, 0xf7, 0x54, 0xf6, 0x57,
+	0xde, 0x7f, 0xeb, 0x65, 0xfd, 0x27, 0xfb, 0x35,
+	0xf9, 0x3d, 0xf5, 0x4b, 0xf1, 0x4d, 0xef, 0x5b,
+	0xe7, 0x6b, 0xe7, 0x6f, 0xe4, 0x7a, 0xf5, 0x4c,
+	0xf6, 0x2c, 0xf6, 0x34, 0xf6, 0x39, 0xf7, 0x3a,
+	0xf0, 0x48, 0xf9, 0x45, 0xfc, 0x45, 0xfb, 0x4a,
+	0xf7, 0x56, 0x02, 0x42, 0xf7, 0x22, 0x01, 0x20,
+	0x0b, 0x1f, 0x05, 0x34, 0xfe, 0x37, 0xfe, 0x43,
+	0x00, 0x49, 0xf8, 0x59, 0x03, 0x34, 0x07, 0x04,
+	0x0a, 0x08, 0x11, 0x08, 0x10, 0x13, 0x03, 0x25,
+	0xff, 0x3d, 0xfb, 0x49, 0xff, 0x46, 0xfc, 0x4e,
+	0x00, 0x00, 0xeb, 0x7e, 0xe9, 0x7c, 0xec, 0x6e,
+	0xe6, 0x7e, 0xe7, 0x7c, 0xef, 0x69, 0xe5, 0x79,
+	0xe5, 0x75, 0xef, 0x66, 0xe6, 0x75, 0xe5, 0x74,
+	0xdf, 0x7a, 0xf6, 0x5f, 0xf2, 0x64, 0xf8, 0x5f,
+	0xef, 0x6f, 0xe4, 0x72, 0xfa, 0x59, 0xfe, 0x50,
+	0xfc, 0x52, 0xf7, 0x55, 0xf8, 0x51, 0xff, 0x48,
+	0x05, 0x40, 0x01, 0x43, 0x09, 0x38, 0x00, 0x45,
+	0x01, 0x45, 0x07, 0x45, 0xf9, 0x45, 0xfa, 0x43,
+	0xf0, 0x4d, 0xfe, 0x40, 0x02, 0x3d, 0xfa, 0x43,
+	0xfd, 0x40, 0x02, 0x39, 0xfd, 0x41, 0xfd, 0x42,
+	0x00, 0x3e, 0x09, 0x33, 0xff, 0x42, 0xfe, 0x47,
+	0xfe, 0x4b, 0xff, 0x46, 0xf7, 0x48, 0x0e, 0x3c,
+	0x10, 0x25, 0x00, 0x2f, 0x12, 0x23, 0x0b, 0x25,
+	0x0c, 0x29, 0x0a, 0x29, 0x02, 0x30, 0x0c, 0x29,
+	0x0d, 0x29, 0x00, 0x3b, 0x03, 0x32, 0x13, 0x28,
+	0x03, 0x42, 0x12, 0x32, 0x13, 0xfa, 0x12, 0xfa,
+	0x0e, 0x00, 0x1a, 0xf4, 0x1f, 0xf0, 0x21, 0xe7,
+	0x21, 0xea, 0x25, 0xe4, 0x27, 0xe2, 0x2a, 0xe2,
+	0x2f, 0xd6, 0x2d, 0xdc, 0x31, 0xde, 0x29, 0xef,
+	0x20, 0x09, 0x45, 0xb9, 0x3f, 0xc1, 0x42, 0xc0,
+	0x4d, 0xb6, 0x36, 0xd9, 0x34, 0xdd, 0x29, 0xf6,
+	0x24, 0x00, 0x28, 0xff, 0x1e, 0x0e, 0x1c, 0x1a,
+	0x17, 0x25, 0x0c, 0x37, 0x0b, 0x41, 0x25, 0xdf,
+	0x27, 0xdc, 0x28, 0xdb, 0x26, 0xe2, 0x2e, 0xdf,
+	0x2a, 0xe2, 0x28, 0xe8, 0x31, 0xe3, 0x26, 0xf4,
+	0x28, 0xf6, 0x26, 0xfd, 0x2e, 0xfb, 0x1f, 0x14,
+	0x1d, 0x1e, 0x19, 0x2c, 0x0c, 0x30, 0x0b, 0x31,
+	0x1a, 0x2d, 0x16, 0x16, 0x17, 0x16, 0x1b, 0x15,
+	0x21, 0x14, 0x1a, 0x1c, 0x1e, 0x18, 0x1b, 0x22,
+	0x12, 0x2a, 0x19, 0x27, 0x12, 0x32, 0x0c, 0x46,
+	0x15, 0x36, 0x0e, 0x47, 0x0b, 0x53, 0x19, 0x20,
+	0x15, 0x31, 0x15, 0x36, 0xfb, 0x55, 0xfa, 0x51,
+	0xf6, 0x4d, 0xf9, 0x51, 0xef, 0x50, 0xee, 0x49,
+	0xfc, 0x4a, 0xf6, 0x53, 0xf7, 0x47, 0xf7, 0x43,
+	0xff, 0x3d, 0xf8, 0x42, 0xf2, 0x42, 0x00, 0x3b,
+	0x02, 0x3b, 0x11, 0xf6, 0x20, 0xf3, 0x2a, 0xf7,
+	0x31, 0xfb, 0x35, 0x00, 0x40, 0x03, 0x44, 0x0a,
+	0x42, 0x1b, 0x2f, 0x39, 0xfb, 0x47, 0x00, 0x18,
+	0xff, 0x24, 0xfe, 0x2a, 0xfe, 0x34, 0xf7, 0x39,
+	0xfa, 0x3f, 0xfc, 0x41, 0xfc, 0x43, 0xf9, 0x52,
+	0xfd, 0x51, 0xfd, 0x4c, 0xf9, 0x48, 0xfa, 0x4e,
+	0xf4, 0x48, 0xf2, 0x44, 0xfd, 0x46, 0xfa, 0x4c,
+	0xfb, 0x42, 0xfb, 0x3e, 0x00, 0x39, 0xfc, 0x3d,
+	0xf7, 0x3c, 0x01, 0x36, 0x02, 0x3a, 0x11, 0xf6,
+	0x20, 0xf3, 0x2a, 0xf7, 0x31, 0xfb, 0x35, 0x00,
+	0x40, 0x03, 0x44, 0x0a, 0x42, 0x1b, 0x2f, 0x39,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x14, 0xf1, 0x02, 0x36, 0x03, 0x4a, 0x14, 0xf1,
+	0x02, 0x36, 0x03, 0x4a, 0xe4, 0x7f, 0xe9, 0x68,
+	0xfa, 0x35, 0xff, 0x36, 0x07, 0x33, 0x1d, 0x10,
+	0x19, 0x00, 0x0e, 0x00, 0xf6, 0x33, 0xfd, 0x3e,
+	0xe5, 0x63, 0x1a, 0x10, 0xfc, 0x55, 0xe8, 0x66,
+	0x05, 0x39, 0x06, 0x39, 0xef, 0x49, 0x0e, 0x39,
+	0x14, 0x28, 0x14, 0x0a, 0x1d, 0x00, 0x36, 0x00,
+	0x25, 0x2a, 0x0c, 0x61, 0xe0, 0x7f, 0xea, 0x75,
+	0xfe, 0x4a, 0xfc, 0x55, 0xe8, 0x66, 0x05, 0x39,
+	0xfa, 0x5d, 0xf2, 0x58, 0xfa, 0x2c, 0x04, 0x37,
+	0xf5, 0x59, 0xf1, 0x67, 0xeb, 0x74, 0x13, 0x39,
+	0x14, 0x3a, 0x04, 0x54, 0x06, 0x60, 0x01, 0x3f,
+	0xfb, 0x55, 0xf3, 0x6a, 0x05, 0x3f, 0x06, 0x4b,
+	0xfd, 0x5a, 0xff, 0x65, 0x03, 0x37, 0xfc, 0x4f,
+	0xfe, 0x4b, 0xf4, 0x61, 0xf9, 0x32, 0x01, 0x3c,
+	0x00, 0x29, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f,
+	0xf7, 0x53, 0x04, 0x56, 0x00, 0x61, 0xf9, 0x48,
+	0x0d, 0x29, 0x03, 0x3e, 0x07, 0x22, 0xf7, 0x58,
+	0xec, 0x7f, 0xdc, 0x7f, 0xef, 0x5b, 0xf2, 0x5f,
+	0xe7, 0x54, 0xe7, 0x56, 0xf4, 0x59, 0xef, 0x5b,
+	0xe1, 0x7f, 0xf2, 0x4c, 0xee, 0x67, 0xf3, 0x5a,
+	0xdb, 0x7f, 0x0b, 0x50, 0x05, 0x4c, 0x02, 0x54,
+	0x05, 0x4e, 0xfa, 0x37, 0x04, 0x3d, 0xf2, 0x53,
+	0xdb, 0x7f, 0xfb, 0x4f, 0xf5, 0x68, 0xf5, 0x5b,
+	0xe2, 0x7f, 0x00, 0x41, 0xfe, 0x4f, 0x00, 0x48,
+	0xfc, 0x5c, 0xfa, 0x38, 0x03, 0x44, 0xf8, 0x47,
+	0xf3, 0x62, 0xfc, 0x56, 0xf4, 0x58, 0xfb, 0x52,
+	0xfd, 0x48, 0xfc, 0x43, 0xf8, 0x48, 0xf0, 0x59,
+	0xf7, 0x45, 0xff, 0x3b, 0x05, 0x42, 0x04, 0x39,
+	0xfc, 0x47, 0xfe, 0x47, 0x02, 0x3a, 0xff, 0x4a,
+	0xfc, 0x2c, 0xff, 0x45, 0x00, 0x3e, 0xf9, 0x33,
+	0xfc, 0x2f, 0xfa, 0x2a, 0xfd, 0x29, 0xfa, 0x35,
+	0x08, 0x4c, 0xf7, 0x4e, 0xf5, 0x53, 0x09, 0x34,
+	0x00, 0x43, 0xfb, 0x5a, 0x01, 0x43, 0xf1, 0x48,
+	0xfb, 0x4b, 0xf8, 0x50, 0xeb, 0x53, 0xeb, 0x40,
+	0xf3, 0x1f, 0xe7, 0x40, 0xe3, 0x5e, 0x09, 0x4b,
+	0x11, 0x3f, 0xf8, 0x4a, 0xfb, 0x23, 0xfe, 0x1b,
+	0x0d, 0x5b, 0x03, 0x41, 0xf9, 0x45, 0x08, 0x4d,
+	0xf6, 0x42, 0x03, 0x3e, 0xfd, 0x44, 0xec, 0x51,
+	0x00, 0x1e, 0x01, 0x07, 0xfd, 0x17, 0xeb, 0x4a,
+	0x10, 0x42, 0xe9, 0x7c, 0x11, 0x25, 0x2c, 0xee,
+	0x32, 0xde, 0xea, 0x7f, 0x04, 0x27, 0x00, 0x2a,
+	0x07, 0x22, 0x0b, 0x1d, 0x08, 0x1f, 0x06, 0x25,
+	0x07, 0x2a, 0x03, 0x28, 0x08, 0x21, 0x0d, 0x2b,
+	0x0d, 0x24, 0x04, 0x2f, 0x03, 0x37, 0x02, 0x3a,
+	0x06, 0x3c, 0x08, 0x2c, 0x0b, 0x2c, 0x0e, 0x2a,
+	0x07, 0x30, 0x04, 0x38, 0x04, 0x34, 0x0d, 0x25,
+	0x09, 0x31, 0x13, 0x3a, 0x0a, 0x30, 0x0c, 0x2d,
+	0x00, 0x45, 0x14, 0x21, 0x08, 0x3f, 0x23, 0xee,
+	0x21, 0xe7, 0x1c, 0xfd, 0x18, 0x0a, 0x1b, 0x00,
+	0x22, 0xf2, 0x34, 0xd4, 0x27, 0xe8, 0x13, 0x11,
+	0x1f, 0x19, 0x24, 0x1d, 0x18, 0x21, 0x22, 0x0f,
+	0x1e, 0x14, 0x16, 0x49, 0x14, 0x22, 0x13, 0x1f,
+	0x1b, 0x2c, 0x13, 0x10, 0x0f, 0x24, 0x0f, 0x24,
+	0x15, 0x1c, 0x19, 0x15, 0x1e, 0x14, 0x1f, 0x0c,
+	0x1b, 0x10, 0x18, 0x2a, 0x00, 0x5d, 0x0e, 0x38,
+	0x0f, 0x39, 0x1a, 0x26, 0xe8, 0x7f, 0xe8, 0x73,
+	0xea, 0x52, 0xf7, 0x3e, 0x00, 0x35, 0x00, 0x3b,
+	0xf2, 0x55, 0xf3, 0x59, 0xf3, 0x5e, 0xf5, 0x5c,
+	0xe3, 0x7f, 0xeb, 0x64, 0xf2, 0x39, 0xf4, 0x43,
+	0xf5, 0x47, 0xf6, 0x4d, 0xeb, 0x55, 0xf0, 0x58,
+	0xe9, 0x68, 0xf1, 0x62, 0xdb, 0x7f, 0xf6, 0x52,
+	0xf8, 0x30, 0xf8, 0x3d, 0xf8, 0x42, 0xf9, 0x46,
+	0xf2, 0x4b, 0xf6, 0x4f, 0xf7, 0x53, 0xf4, 0x5c,
+	0xee, 0x6c, 0xfc, 0x4f, 0xea, 0x45, 0xf0, 0x4b,
+	0xfe, 0x3a, 0x01, 0x3a, 0xf3, 0x4e, 0xf7, 0x53,
+	0xfc, 0x51, 0xf3, 0x63, 0xf3, 0x51, 0xfa, 0x26,
+	0xf3, 0x3e, 0xfa, 0x3a, 0xfe, 0x3b, 0xf0, 0x49,
+	0xf6, 0x4c, 0xf3, 0x56, 0xf7, 0x53, 0xf6, 0x57,
+	0x00, 0x00, 0xea, 0x7f, 0xe7, 0x7f, 0xe7, 0x78,
+	0xe5, 0x7f, 0xed, 0x72, 0xe9, 0x75, 0xe7, 0x76,
+	0xe6, 0x75, 0xe8, 0x71, 0xe4, 0x76, 0xe1, 0x78,
+	0xdb, 0x7c, 0xf6, 0x5e, 0xf1, 0x66, 0xf6, 0x63,
+	0xf3, 0x6a, 0xce, 0x7f, 0xfb, 0x5c, 0x11, 0x39,
+	0xfb, 0x56, 0xf3, 0x5e, 0xf4, 0x5b, 0xfe, 0x4d,
+	0x00, 0x47, 0xff, 0x49, 0x04, 0x40, 0xf9, 0x51,
+	0x05, 0x40, 0x0f, 0x39, 0x01, 0x43, 0x00, 0x44,
+	0xf6, 0x43, 0x01, 0x44, 0x00, 0x4d, 0x02, 0x40,
+	0x00, 0x44, 0xfb, 0x4e, 0x07, 0x37, 0x05, 0x3b,
+	0x02, 0x41, 0x0e, 0x36, 0x0f, 0x2c, 0x05, 0x3c,
+	0x02, 0x46, 0xfe, 0x4c, 0xee, 0x56, 0x0c, 0x46,
+	0x05, 0x40, 0xf4, 0x46, 0x0b, 0x37, 0x05, 0x38,
+	0x00, 0x45, 0x02, 0x41, 0xfa, 0x4a, 0x05, 0x36,
+	0x07, 0x36, 0xfa, 0x4c, 0xf5, 0x52, 0xfe, 0x4d,
+	0xfe, 0x4d, 0x19, 0x2a, 0x11, 0xf3, 0x10, 0xf7,
+	0x11, 0xf4, 0x1b, 0xeb, 0x25, 0xe2, 0x29, 0xd8,
+	0x2a, 0xd7, 0x30, 0xd1, 0x27, 0xe0, 0x2e, 0xd8,
+	0x34, 0xcd, 0x2e, 0xd7, 0x34, 0xd9, 0x2b, 0xed,
+	0x20, 0x0b, 0x3d, 0xc9, 0x38, 0xd2, 0x3e, 0xce,
+	0x51, 0xbd, 0x2d, 0xec, 0x23, 0xfe, 0x1c, 0x0f,
+	0x22, 0x01, 0x27, 0x01, 0x1e, 0x11, 0x14, 0x26,
+	0x12, 0x2d, 0x0f, 0x36, 0x00, 0x4f, 0x24, 0xf0,
+	0x25, 0xf2, 0x25, 0xef, 0x20, 0x01, 0x22, 0x0f,
+	0x1d, 0x0f, 0x18, 0x19, 0x22, 0x16, 0x1f, 0x10,
+	0x23, 0x12, 0x1f, 0x1c, 0x21, 0x29, 0x24, 0x1c,
+	0x1b, 0x2f, 0x15, 0x3e, 0x12, 0x1f, 0x13, 0x1a,
+	0x24, 0x18, 0x18, 0x17, 0x1b, 0x10, 0x18, 0x1e,
+	0x1f, 0x1d, 0x16, 0x29, 0x16, 0x2a, 0x10, 0x3c,
+	0x0f, 0x34, 0x0e, 0x3c, 0x03, 0x4e, 0xf0, 0x7b,
+	0x15, 0x35, 0x16, 0x38, 0x19, 0x3d, 0x15, 0x21,
+	0x13, 0x32, 0x11, 0x3d, 0xfd, 0x4e, 0xf8, 0x4a,
+	0xf7, 0x48, 0xf6, 0x48, 0xee, 0x4b, 0xf4, 0x47,
+	0xf5, 0x3f, 0xfb, 0x46, 0xef, 0x4b, 0xf2, 0x48,
+	0xf0, 0x43, 0xf8, 0x35, 0xf2, 0x3b, 0xf7, 0x34,
+	0xf5, 0x44, 0x09, 0xfe, 0x1e, 0xf6, 0x1f, 0xfc,
+	0x21, 0xff, 0x21, 0x07, 0x1f, 0x0c, 0x25, 0x17,
+	0x1f, 0x26, 0x14, 0x40, 0xf7, 0x47, 0xf9, 0x25,
+	0xf8, 0x2c, 0xf5, 0x31, 0xf6, 0x38, 0xf4, 0x3b,
+	0xf8, 0x3f, 0xf7, 0x43, 0xfa, 0x44, 0xf6, 0x4f,
+	0xfd, 0x4e, 0xf8, 0x4a, 0xf7, 0x48, 0xf6, 0x48,
+	0xee, 0x4b, 0xf4, 0x47, 0xf5, 0x3f, 0xfb, 0x46,
+	0xef, 0x4b, 0xf2, 0x48, 0xf0, 0x43, 0xf8, 0x35,
+	0xf2, 0x3b, 0xf7, 0x34, 0xf5, 0x44, 0x09, 0xfe,
+	0x1e, 0xf6, 0x1f, 0xfc, 0x21, 0xff, 0x21, 0x07,
+	0x1f, 0x0c, 0x25, 0x17, 0x1f, 0x26, 0x14, 0x40,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x14, 0xf1, 0x02, 0x36, 0x03, 0x4a, 0x14, 0xf1,
+	0x02, 0x36, 0x03, 0x4a, 0xe4, 0x7f, 0xe9, 0x68,
+	0xfa, 0x35, 0xff, 0x36, 0x07, 0x33, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x29, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f,
+	0xf7, 0x53, 0x04, 0x56, 0x00, 0x61, 0xf9, 0x48,
+	0x0d, 0x29, 0x03, 0x3e, 0x00, 0x0b, 0x01, 0x37,
+	0x00, 0x45, 0xef, 0x7f, 0xf3, 0x66, 0x00, 0x52,
+	0xf9, 0x4a, 0xeb, 0x6b, 0xe5, 0x7f, 0xe1, 0x7f,
+	0xe8, 0x7f, 0xee, 0x5f, 0xe5, 0x7f, 0xeb, 0x72,
+	0xe2, 0x7f, 0xef, 0x7b, 0xf4, 0x73, 0xf0, 0x7a,
+	0xf5, 0x73, 0xf4, 0x3f, 0xfe, 0x44, 0xf1, 0x54,
+	0xf3, 0x68, 0xfd, 0x46, 0xf8, 0x5d, 0xf6, 0x5a,
+	0xe2, 0x7f, 0xff, 0x4a, 0xfa, 0x61, 0xf9, 0x5b,
+	0xec, 0x7f, 0xfc, 0x38, 0xfb, 0x52, 0xf9, 0x4c,
+	0xea, 0x7d, 0xf9, 0x5d, 0xf5, 0x57, 0xfd, 0x4d,
+	0xfb, 0x47, 0xfc, 0x3f, 0xfc, 0x44, 0xf4, 0x54,
+	0xf9, 0x3e, 0xf9, 0x41, 0x08, 0x3d, 0x05, 0x38,
+	0xfe, 0x42, 0x01, 0x40, 0x00, 0x3d, 0xfe, 0x4e,
+	0x01, 0x32, 0x07, 0x34, 0x0a, 0x23, 0x00, 0x2c,
+	0x0b, 0x26, 0x01, 0x2d, 0x00, 0x2e, 0x05, 0x2c,
+	0x1f, 0x11, 0x01, 0x33, 0x07, 0x32, 0x1c, 0x13,
+	0x10, 0x21, 0x0e, 0x3e, 0xf3, 0x6c, 0xf1, 0x64,
+	0xf3, 0x65, 0xf3, 0x5b, 0xf4, 0x5e, 0xf6, 0x58,
+	0xf0, 0x54, 0xf6, 0x56, 0xf9, 0x53, 0xf3, 0x57,
+	0xed, 0x5e, 0x01, 0x46, 0x00, 0x48, 0xfb, 0x4a,
+	0x12, 0x3b, 0xf8, 0x66, 0xf1, 0x64, 0x00, 0x5f,
+	0xfc, 0x4b, 0x02, 0x48, 0xf5, 0x4b, 0xfd, 0x47,
+	0x0f, 0x2e, 0xf3, 0x45, 0x00, 0x3e, 0x00, 0x41,
+	0x15, 0x25, 0xf1, 0x48, 0x09, 0x39, 0x10, 0x36,
+	0x00, 0x3e, 0x0c, 0x48, 0x18, 0x00, 0x0f, 0x09,
+	0x08, 0x19, 0x0d, 0x12, 0x0f, 0x09, 0x0d, 0x13,
+	0x0a, 0x25, 0x0c, 0x12, 0x06, 0x1d, 0x14, 0x21,
+	0x0f, 0x1e, 0x04, 0x2d, 0x01, 0x3a, 0x00, 0x3e,
+	0x07, 0x3d, 0x0c, 0x26, 0x0b, 0x2d, 0x0f, 0x27,
+	0x0b, 0x2a, 0x0d, 0x2c, 0x10, 0x2d, 0x0c, 0x29,
+	0x0a, 0x31, 0x1e, 0x22, 0x12, 0x2a, 0x0a, 0x37,
+	0x11, 0x33, 0x11, 0x2e, 0x00, 0x59, 0x1a, 0xed,
+	0x16, 0xef, 0x1a, 0xef, 0x1e, 0xe7, 0x1c, 0xec,
+	0x21, 0xe9, 0x25, 0xe5, 0x21, 0xe9, 0x28, 0xe4,
+	0x26, 0xef, 0x21, 0xf5, 0x28, 0xf1, 0x29, 0xfa,
+	0x26, 0x01, 0x29, 0x11, 0x1e, 0xfa, 0x1b, 0x03,
+	0x1a, 0x16, 0x25, 0xf0, 0x23, 0xfc, 0x26, 0xf8,
+	0x26, 0xfd, 0x25, 0x03, 0x26, 0x05, 0x2a, 0x00,
+	0x23, 0x10, 0x27, 0x16, 0x0e, 0x30, 0x1b, 0x25,
+	0x15, 0x3c, 0x0c, 0x44, 0x02, 0x61, 0xfd, 0x47,
+	0xfa, 0x2a, 0xfb, 0x32, 0xfd, 0x36, 0xfe, 0x3e,
+	0x00, 0x3a, 0x01, 0x3f, 0xfe, 0x48, 0xff, 0x4a,
+	0xf7, 0x5b, 0xfb, 0x43, 0xfb, 0x1b, 0xfd, 0x27,
+	0xfe, 0x2c, 0x00, 0x2e, 0xf0, 0x40, 0xf8, 0x44,
+	0xf6, 0x4e, 0xfa, 0x4d, 0xf6, 0x56, 0xf4, 0x5c,
+	0xf1, 0x37, 0xf6, 0x3c, 0xfa, 0x3e, 0xfc, 0x41,
+	0xf4, 0x49, 0xf8, 0x4c, 0xf9, 0x50, 0xf7, 0x58,
+	0xef, 0x6e, 0xf5, 0x61, 0xec, 0x54, 0xf5, 0x4f,
+	0xfa, 0x49, 0xfc, 0x4a, 0xf3, 0x56, 0xf3, 0x60,
+	0xf5, 0x61, 0xed, 0x75, 0xf8, 0x4e, 0xfb, 0x21,
+	0xfc, 0x30, 0xfe, 0x35, 0xfd, 0x3e, 0xf3, 0x47,
+	0xf6, 0x4f, 0xf4, 0x56, 0xf3, 0x5a, 0xf2, 0x61,
+	0x00, 0x00, 0xfa, 0x5d, 0xfa, 0x54, 0xf8, 0x4f,
+	0x00, 0x42, 0xff, 0x47, 0x00, 0x3e, 0xfe, 0x3c,
+	0xfe, 0x3b, 0xfb, 0x4b, 0xfd, 0x3e, 0xfc, 0x3a,
+	0xf7, 0x42, 0xff, 0x4f, 0x00, 0x47, 0x03, 0x44,
+	0x0a, 0x2c, 0xf9, 0x3e, 0x0f, 0x24, 0x0e, 0x28,
+	0x10, 0x1b, 0x0c, 0x1d, 0x01, 0x2c, 0x14, 0x24,
+	0x12, 0x20, 0x05, 0x2a, 0x01, 0x30, 0x0a, 0x3e,
+	0x11, 0x2e, 0x09, 0x40, 0xf4, 0x68, 0xf5, 0x61,
+	0xf0, 0x60, 0xf9, 0x58, 0xf8, 0x55, 0xf9, 0x55,
+	0xf7, 0x55, 0xf3, 0x58, 0x04, 0x42, 0xfd, 0x4d,
+	0xfd, 0x4c, 0xfa, 0x4c, 0x0a, 0x3a, 0xff, 0x4c,
+	0xff, 0x53, 0xf9, 0x63, 0xf2, 0x5f, 0x02, 0x5f,
+	0x00, 0x4c, 0xfb, 0x4a, 0x00, 0x46, 0xf5, 0x4b,
+	0x01, 0x44, 0x00, 0x41, 0xf2, 0x49, 0x03, 0x3e,
+	0x04, 0x3e, 0xff, 0x44, 0xf3, 0x4b, 0x0b, 0x37,
+	0x05, 0x40, 0x0c, 0x46, 0x0f, 0x06, 0x06, 0x13,
+	0x07, 0x10, 0x0c, 0x0e, 0x12, 0x0d, 0x0d, 0x0b,
+	0x0d, 0x0f, 0x0f, 0x10, 0x0c, 0x17, 0x0d, 0x17,
+	0x0f, 0x14, 0x0e, 0x1a, 0x0e, 0x2c, 0x11, 0x28,
+	0x11, 0x2f, 0x18, 0x11, 0x15, 0x15, 0x19, 0x16,
+	0x1f, 0x1b, 0x16, 0x1d, 0x13, 0x23, 0x0e, 0x32,
+	0x0a, 0x39, 0x07, 0x3f, 0xfe, 0x4d, 0xfc, 0x52,
+	0xfd, 0x5e, 0x09, 0x45, 0xf4, 0x6d, 0x24, 0xdd,
+	0x24, 0xde, 0x20, 0xe6, 0x25, 0xe2, 0x2c, 0xe0,
+	0x22, 0xee, 0x22, 0xf1, 0x28, 0xf1, 0x21, 0xf9,
+	0x23, 0xfb, 0x21, 0x00, 0x26, 0x02, 0x21, 0x0d,
+	0x17, 0x23, 0x0d, 0x3a, 0x1d, 0xfd, 0x1a, 0x00,
+	0x16, 0x1e, 0x1f, 0xf9, 0x23, 0xf1, 0x22, 0xfd,
+	0x22, 0x03, 0x24, 0xff, 0x22, 0x05, 0x20, 0x0b,
+	0x23, 0x05, 0x22, 0x0c, 0x27, 0x0b, 0x1e, 0x1d,
+	0x22, 0x1a, 0x1d, 0x27, 0x13, 0x42, 0x1f, 0x15,
+	0x1f, 0x1f, 0x19, 0x32, 0xef, 0x78, 0xec, 0x70,
+	0xee, 0x72, 0xf5, 0x55, 0xf1, 0x5c, 0xf2, 0x59,
+	0xe6, 0x47, 0xf1, 0x51, 0xf2, 0x50, 0x00, 0x44,
+	0xf2, 0x46, 0xe8, 0x38, 0xe9, 0x44, 0xe8, 0x32,
+	0xf5, 0x4a, 0x17, 0xf3, 0x1a, 0xf3, 0x28, 0xf1,
+	0x31, 0xf2, 0x2c, 0x03, 0x2d, 0x06, 0x2c, 0x22,
+	0x21, 0x36, 0x13, 0x52, 0xfd, 0x4b, 0xff, 0x17,
+	0x01, 0x22, 0x01, 0x2b, 0x00, 0x36, 0xfe, 0x37,
+	0x00, 0x3d, 0x01, 0x40, 0x00, 0x44, 0xf7, 0x5c,
+	0xf2, 0x6a, 0xf3, 0x61, 0xf1, 0x5a, 0xf4, 0x5a,
+	0xee, 0x58, 0xf6, 0x49, 0xf7, 0x4f, 0xf2, 0x56,
+	0xf6, 0x49, 0xf6, 0x46, 0xf6, 0x45, 0xfb, 0x42,
+	0xf7, 0x40, 0xfb, 0x3a, 0x02, 0x3b, 0x15, 0xf6,
+	0x18, 0xf5, 0x1c, 0xf8, 0x1c, 0xff, 0x1d, 0x03,
+	0x1d, 0x09, 0x23, 0x14, 0x1d, 0x24, 0x0e, 0x43,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+static const char h264_fix_data[] = {
+	/* 128 * 0 stream in */
+	0x00, 0x00, 0x01, 0x65, 0x88, 0x81, 0x00, 0x9F,
+	0xFE, 0x6F, 0x5F, 0x32, 0xC5, 0x42, 0x54, 0x26,
+	0x81, 0xD5, 0xE9, 0x71, 0x10, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	/* stuff */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+	/* 128 * 1 rps in */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+	/* 128 * 2 pps in */
+	0xff, 0x3f, 0x80, 0x14, 0x40, 0x00, 0x04, 0x40,
+	0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0xff, 0x3f, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	/* stuff */
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	/* rlc out */
+};
+
+static struct hack_info rkvdec2_3568_hack[] = {
+	{0x00000001, 0x0510},
+	{0x00000001, 0x0550},
+	{0x00000001, 0x0590},
+	{0x00000000, 0x0020},
+	{0x00000001, 0x0024},
+	{0x00000072, 0x002c},
+	{0x00000102, 0x0030},
+	{0x01048201, 0x0034},
+	{0x00000000, 0x0038},
+	{0x00000001, 0x003c},
+	{0x00000030, 0x0040},
+	{0x00003fff, 0x0044},
+	{0x00000001, 0x0048},
+	{0x00000001, 0x004c},
+	{0x00000010, 0x0050},
+	{0x00000006, 0x0054},
+	{0x00000000, 0x0058},
+	{0x00000000, 0x005c},
+	{0xffffdfff, 0x0060},
+	{0x3ffbfbff, 0x0064},
+	{0x800fffff, 0x0068},
+	{0x000000ff, 0x0080},
+	{0x00000000, 0x0100},
+	{0x00000000, 0x0104},
+	{0x00000000, 0x0108},
+	{0x00000000, 0x010c},
+	{0x00000000, 0x0110},
+	{0x00000000, 0x0114},
+	{0x00000000, 0x0118},
+	{0x00000000, 0x011c},
+	{0x00000000, 0x0120},
+	{0x00000000, 0x0124},
+	{0x00000000, 0x0128},
+	{0x00000000, 0x012c},
+	{0x00000000, 0x0130},
+	{0x00000000, 0x0134},
+	{0x00000000, 0x0138},
+	{0x00000000, 0x013c},
+	{0x00000000, 0x0140},
+	{0x00000000, 0x0144},
+	{0x00000000, 0x0148},
+	{0x00000000, 0x014c},
+	{0x00000000, 0x0150},
+	{0x00000000, 0x0154},
+	{0x00000000, 0x0158},
+	{0x00000000, 0x015c},
+	{0x00000000, 0x0160},
+	{0x00000000, 0x0164},
+	{0x00000000, 0x0168},
+	{0x00000000, 0x016c},
+	{0x00000000, 0x0170},
+	{0x00000000, 0x0174},
+	{0x00000000, 0x0178},
+	{0x00000000, 0x017c},
+	{0x00000000, 0x0180},
+	{0x00000000, 0x0184},
+	{0x00000000, 0x0188},
+	{0x00000000, 0x018c},
+	{0x00000000, 0x0190},
+	{0x00000000, 0x0194},
+	{0x00000000, 0x0198},
+	{0x00000000, 0x019c},
+	{0x00000000, 0x01a0},
+	{0x00000000, 0x01a4},
+	{0x00000000, 0x01a8},
+	{0x00000000, 0x01ac},
+	{0x00000000, 0x01b0},
+	{0x00000000, 0x01b4},
+	{0x00000000, 0x01b8},
+	{0x00000000, 0x01bc},
+	{0x00000000, 0x01c0},
+	{0x00000000, 0x0200},
+	{0x00000000, 0x0204},
+	{0x00000000, 0x0208},
+	{0x00000000, 0x020c},
+	{0x00000000, 0x0210},
+	{0x100001c0, 0x0214},
+	{0x100001c0, 0x0218},
+	{0x100001c0, 0x021c},
+	{0x100001c0, 0x0220},
+	{0x10000340, 0x0224},
+	{0x10000340, 0x0228},
+	{0x10000000, 0x022c},
+	{0x10000000, 0x0230},
+	{0x10000000, 0x0234},
+	{0x10000000, 0x0238},
+	{0x00000000, 0x0280},
+	{0x00000000, 0x0284},
+	{0x00000000, 0x0288},
+	{0x00000000, 0x028c},
+	{0x00000000, 0x0290},
+	{0x00000000, 0x0294},
+	{0x00000000, 0x0298},
+	{0x00000000, 0x029c},
+	{0x00000000, 0x02a0},
+	{0x00000000, 0x02a4},
+	{0x00000000, 0x02a8},
+	{0x00000000, 0x02ac},
+	{0x00000000, 0x02b0},
+	{0x00000000, 0x02b4},
+	{0x00000000, 0x02b8},
+	{0x00000000, 0x02bc},
+	{0x00000000, 0x02c0},
+	{0x00000000, 0x02c4},
+	{0x00000000, 0x02c8},
+	{0x00000000, 0x02cc},
+	{0x00000000, 0x02d0},
+	{0x00000000, 0x02d4},
+	{0x00000000, 0x02d8},
+	{0x00000000, 0x02dc},
+	{0x00000000, 0x02e0},
+	{0x00000000, 0x02e4},
+	{0x00000000, 0x02e8},
+	{0x00000000, 0x02ec},
+	{0x00000000, 0x02f0},
+	{0x00000000, 0x02f4},
+	{0x00000000, 0x02f8},
+	{0x00000000, 0x02fc},
+	{0x00000000, 0x0300},
+	{0x00000000, 0x0304},
+	{0x00000000, 0x0308},
+	{0x00000000, 0x030c},
+	{0x00000000, 0x0310},
+	{0x00000000, 0x0314},
+	{0x00000000, 0x0380},
+};
+
+void rkvdec2_3568_hack_data_setup(struct mpp_dma_buffer *fix)
+{
+	u32 iova = fix->iova;
+	u32 i;
+
+	memcpy(fix->vaddr, h264_fix_data, sizeof(h264_fix_data));
+	memcpy(fix->vaddr + PAGE_SIZE, h264_cabac_tbl, sizeof(h264_cabac_tbl));
+
+	/* input stream 0x0200*/
+	rkvdec2_3568_hack[71].data = iova;
+	/* rlc */
+	rkvdec2_3568_hack[72].data = iova + RKDEC_HACK_DATA_RLC_OFFSET;
+	/* output frame 0x0208*/
+	rkvdec2_3568_hack[73].data = iova + RKDEC_HACK_DATA_OUT_OFFSET;
+	/* colmv out 0x020c*/
+	rkvdec2_3568_hack[74].data = iova + RKDEC_HACK_DATA_COLMV_OFFSET;
+
+	/* pps in */
+	rkvdec2_3568_hack[87].data = iova + RKDEC_HACK_DATA_PPS_OFFSET;
+	/* rps in */
+	rkvdec2_3568_hack[89].data = iova + RKDEC_HACK_DATA_RPS_OFFSET;
+	for (i = 0; i < 33; i++)
+		rkvdec2_3568_hack[90 + i].data = iova + RKDEC_HACK_DATA_COLMV_OFFSET;
+	rkvdec2_3568_hack[123].data = iova + PAGE_SIZE;
+}
+
+void rkvdec2_3568_hack_fix(struct mpp_dev *mpp)
+{
+	void __iomem *reg_base = mpp->reg_base;
+	unsigned long flags;
+	u32 reg;
+	u32 cnt = 0;
+	u32 i = 0;
+
+	for (i = 0; i < ARRAY_SIZE(rkvdec2_3568_hack); i++)
+		writel_relaxed(rkvdec2_3568_hack[i].data, reg_base + rkvdec2_3568_hack[i].offset);
+
+	local_irq_save(flags);
+	/* write all data to register before start hardware */
+	wmb();
+	writel(0x00000001, reg_base + 0x0028);
+
+	udelay(5);
+
+	reg = readl(mpp->reg_base + 0x0380);
+	while ((reg & 0x106) != 0x106) {
+		udelay(2);
+		reg = readl(mpp->reg_base + 0x0380);
+		cnt++;
+		if (cnt > 25)
+			break;
+	}
+	/* clear irq */
+	writel(0x00000000, reg_base + 0x0380);
+	local_irq_restore(flags);
+}
diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2.c b/drivers/video/rockchip/mpp/mpp_rkvdec2.c
index f1a1307f1a0e..8b212a081d33 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvdec2.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec2.c
@@ -37,7 +37,7 @@
 #include "mpp_debug.h"
 #include "mpp_common.h"
 #include "mpp_iommu.h"
-
+#include "hack/mpp_rkvdec2_hack_rk3568.c"
 #define RKVDEC_DRIVER_NAME		"mpp_rkvdec2"
 
 #define	RKVDEC_SESSION_MAX_BUFFERS	40
@@ -96,6 +96,8 @@
 #define RKVDEC_CACHE_PERMIT_READ_ALLOCATE	BIT(1)
 #define RKVDEC_CACHE_LINE_SIZE_64_BYTES		BIT(4)
 
+#define RKVDEC_FORMAT_H264 0X1
+
 #define to_rkvdec2_task(task)		\
 		container_of(task, struct rkvdec2_task, mpp_task)
 #define to_rkvdec2_dev(dev)		\
@@ -146,6 +148,7 @@ struct rkvdec2_task {
 	u32 width;
 	u32 height;
 	u32 pixels;
+	u32 need_hack;
 };
 
 struct rkvdec2_session_priv {
@@ -189,6 +192,7 @@ struct rkvdec2_dev {
 	dma_addr_t rcb_iova;
 	struct page *rcb_page;
 	u32 rcb_min_width;
+	struct mpp_dma_buffer *fix;
 };
 
 /*
@@ -426,6 +430,25 @@ static void *rkvdec2_alloc_task(struct mpp_session *session,
 	return NULL;
 }
 
+static void *rkvdec2_rk3568_alloc_task(struct mpp_session *session,
+				struct mpp_task_msgs *msgs)
+{
+	u32 fmt;
+	struct mpp_task *mpp_task = NULL;
+	struct rkvdec2_task *task = NULL;
+
+	mpp_task = rkvdec2_alloc_task(session, msgs);
+	if (!mpp_task)
+		return NULL;
+
+	task = to_rkvdec2_task(mpp_task);
+	fmt = RKVDEC_GET_FORMAT(task->reg[RKVDEC_REG_FORMAT_INDEX]);
+	/* workaround for rk356x, fix the hw bug of cabac/cavlc switch only in h264d */
+	task->need_hack = (fmt == RKVDEC_FORMAT_H264);
+
+	return mpp_task;
+}
+
 static int rkvdec2_run(struct mpp_dev *mpp, struct mpp_task *mpp_task)
 {
 	int i;
@@ -480,6 +503,37 @@ static int rkvdec2_run(struct mpp_dev *mpp, struct mpp_task *mpp_task)
 	return 0;
 }
 
+static int rkvdec2_rk3568_run(struct mpp_dev *mpp, struct mpp_task *mpp_task)
+{
+	struct rkvdec2_dev *dec = NULL;
+	struct rkvdec2_task *task = NULL;
+	int ret = 0;
+
+	mpp_debug_enter();
+
+	dec = to_rkvdec2_dev(mpp);
+	task = to_rkvdec2_task(mpp_task);
+	switch (dec->state) {
+	case RKVDEC_STATE_NORMAL:
+		/*
+		 * run fix before task processing
+		 * workaround for rk356x, fix the hw bug of cabac/cavlc switch only in h264d
+		 */
+		if (task->need_hack)
+			rkvdec2_3568_hack_fix(mpp);
+
+		ret = rkvdec2_run(mpp, mpp_task);
+
+		break;
+	default:
+		break;
+	}
+
+	mpp_debug_leave();
+
+	return ret;
+}
+
 static int rkvdec2_irq(struct mpp_dev *mpp)
 {
 	mpp->irq_status = mpp_read(mpp, RKVDEC_REG_INT_EN);
@@ -835,6 +889,33 @@ static int rkvdec2_init(struct mpp_dev *mpp)
 	return 0;
 }
 
+static int rkvdec2_rk3568_init(struct mpp_dev *mpp)
+{
+	int ret;
+	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
+
+	dec->fix = mpp_dma_alloc(mpp->dev, FIX_RK3568_BUF_SIZE);
+	ret = dec->fix ? 0 : -ENOMEM;
+	if (!ret)
+		rkvdec2_3568_hack_data_setup(dec->fix);
+	else
+		dev_err(mpp->dev, "failed to create buffer for hack\n");
+
+	ret = rkvdec2_init(mpp);
+
+	return ret;
+}
+
+static int rkvdec2_rk3568_exit(struct mpp_dev *mpp)
+{
+	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
+
+	if (dec->fix)
+		mpp_dma_free(dec->fix);
+
+	return 0;
+}
+
 static int rkvdec2_clk_on(struct mpp_dev *mpp)
 {
 	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
@@ -962,6 +1043,17 @@ static struct mpp_hw_ops rkvdec_v2_hw_ops = {
 	.reset = rkvdec2_reset,
 };
 
+static struct mpp_hw_ops rkvdec_rk3568_hw_ops = {
+	.init = rkvdec2_rk3568_init,
+	.exit = rkvdec2_rk3568_exit,
+	.clk_on = rkvdec2_clk_on,
+	.clk_off = rkvdec2_clk_off,
+	.get_freq = rkvdec2_get_freq,
+	.set_freq = rkvdec2_set_freq,
+	.reduce_freq = rkvdec2_reduce_freq,
+	.reset = rkvdec2_reset,
+};
+
 static struct mpp_dev_ops rkvdec_v2_dev_ops = {
 	.alloc_task = rkvdec2_alloc_task,
 	.run = rkvdec2_run,
@@ -975,6 +1067,19 @@ static struct mpp_dev_ops rkvdec_v2_dev_ops = {
 	.free_session = rkvdec2_free_session,
 };
 
+static struct mpp_dev_ops rkvdec_rk3568_dev_ops = {
+	.alloc_task = rkvdec2_rk3568_alloc_task,
+	.run = rkvdec2_rk3568_run,
+	.irq = rkvdec2_irq,
+	.isr = rkvdec2_isr,
+	.finish = rkvdec2_finish,
+	.result = rkvdec2_result,
+	.free_task = rkvdec2_free_task,
+	.ioctl = rkvdec2_control,
+	.init_session = rkvdec2_init_session,
+	.free_session = rkvdec2_free_session,
+};
+
 static const struct mpp_dev_var rkvdec_v2_data = {
 	.device_type = MPP_DEVICE_RKVDEC,
 	.hw_info = &rkvdec_v2_hw_info,
@@ -983,11 +1088,23 @@ static const struct mpp_dev_var rkvdec_v2_data = {
 	.dev_ops = &rkvdec_v2_dev_ops,
 };
 
+static const struct mpp_dev_var rkvdec_rk3568_data = {
+	.device_type = MPP_DEVICE_RKVDEC,
+	.hw_info = &rkvdec_v2_hw_info,
+	.trans_info = rkvdec_v2_trans,
+	.hw_ops = &rkvdec_rk3568_hw_ops,
+	.dev_ops = &rkvdec_rk3568_dev_ops,
+};
+
 static const struct of_device_id mpp_rkvdec2_dt_match[] = {
 	{
 		.compatible = "rockchip,rkv-decoder-v2",
 		.data = &rkvdec_v2_data,
 	},
+	{
+		.compatible = "rockchip,rkv-decoder-rk3568",
+		.data = &rkvdec_rk3568_data,
+	},
 	{},
 };
 

commit cda79c474cf1d2fc622c265fea75d43ff840afa6
Author: Suren Baghdasaryan <surenb@google.com>
Date:   Tue Jun 22 10:46:17 2021 -0700

    ANDROID: gki_config: disable per-cgroup pressure tracking
    
    Disable per-cgroup psi tracking to prevent unnecessary overhead since
    Android does not use per-cgroup psi information.
    
    Bug: 178872719
    Bug: 191734423
    Signed-off-by: Suren Baghdasaryan <surenb@google.com>
    Change-Id: Ic6f84630cd478139fb8cce00410163e4e767c86a

diff --git a/arch/arm64/configs/gki_defconfig b/arch/arm64/configs/gki_defconfig
index 429f829b9d1d..c75699ce5615 100644
--- a/arch/arm64/configs/gki_defconfig
+++ b/arch/arm64/configs/gki_defconfig
@@ -56,6 +56,8 @@ CONFIG_CP15_BARRIER_EMULATION=y
 CONFIG_SETEND_EMULATION=y
 CONFIG_ARM64_SW_TTBR0_PAN=y
 CONFIG_RANDOMIZE_BASE=y
+CONFIG_CMDLINE="cgroup_disable=pressure"
+CONFIG_CMDLINE_EXTEND=y
 # CONFIG_DMI is not set
 CONFIG_COMPAT=y
 CONFIG_PM_WAKELOCKS=y
diff --git a/arch/x86/configs/gki_defconfig b/arch/x86/configs/gki_defconfig
index 0d34c8832a52..1cb8563a1a6c 100644
--- a/arch/x86/configs/gki_defconfig
+++ b/arch/x86/configs/gki_defconfig
@@ -46,6 +46,8 @@ CONFIG_HYPERVISOR_GUEST=y
 CONFIG_PARAVIRT=y
 CONFIG_NR_CPUS=32
 CONFIG_EFI=y
+CONFIG_CMDLINE_BOOL=y
+CONFIG_CMDLINE="cgroup_disable=pressure"
 CONFIG_PM_WAKELOCKS=y
 CONFIG_PM_WAKELOCKS_LIMIT=0
 # CONFIG_PM_WAKELOCKS_GC is not set

commit 92c6dd6a650e1c9161b3e9b37cb7e34b98c32b06
Author: Suren Baghdasaryan <surenb@google.com>
Date:   Mon May 24 12:53:39 2021 -0700

    BACKPORT: cgroup: make per-cgroup pressure stall tracking configurable
    
    PSI accounts stalls for each cgroup separately and aggregates it at each
    level of the hierarchy. This causes additional overhead with psi_avgs_work
    being called for each cgroup in the hierarchy. psi_avgs_work has been
    highly optimized, however on systems with large number of cgroups the
    overhead becomes noticeable.
    Systems which use PSI only at the system level could avoid this overhead
    if PSI can be configured to skip per-cgroup stall accounting.
    Add "cgroup_disable=pressure" kernel command-line option to allow
    requesting system-wide only pressure stall accounting. When set, it
    keeps system-wide accounting under /proc/pressure/ but skips accounting
    for individual cgroups and does not expose PSI nodes in cgroup hierarchy.
    
    Signed-off-by: Suren Baghdasaryan <surenb@google.com>
    Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Acked-by: Johannes Weiner <hannes@cmpxchg.org>
    Signed-off-by: Tejun Heo <tj@kernel.org>
    Link:  https://lore.kernel.org/patchwork/patch/1435705
    (cherry picked from commit 3958e2d0c34e18c41b60dc01832bd670a59ef70f
     https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git tj)
    
    Conflicts:
            include/linux/cgroup-defs.h
            kernel/cgroup/cgroup.c
    
    1. Trivial merge conflict in cgroup-defs.h due to missing CFTYPE_DEBUG
    2. Changed flags to (CFTYPE_NOT_ON_ROOT | CFTYPE_PRESSURE) in cgroup.c
    because in 4.19 psi files were allowed only in non-root cgroups.
    
    Bug: 178872719
    Bug: 191734423
    Signed-off-by: Suren Baghdasaryan <surenb@google.com>
    Change-Id: Ifc8fbc52f9a1131d7c2668edbb44c525c76c3360

diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 184a881b38c5..a6481cd66bb1 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -479,16 +479,21 @@
 	ccw_timeout_log	[S390]
 			See Documentation/s390/CommonIO for details.
 
-	cgroup_disable=	[KNL] Disable a particular controller
-			Format: {name of the controller(s) to disable}
+	cgroup_disable=	[KNL] Disable a particular controller or optional feature
+			Format: {name of the controller(s) or feature(s) to disable}
 			The effects of cgroup_disable=foo are:
 			- foo isn't auto-mounted if you mount all cgroups in
 			  a single hierarchy
 			- foo isn't visible as an individually mountable
 			  subsystem
+			- if foo is an optional feature then the feature is
+			  disabled and corresponding cgroup files are not
+			  created
 			{Currently only "memory" controller deal with this and
 			cut the overhead, others just disable the usage. So
 			only cgroup_disable=memory is actually worthy}
+			Specifying "pressure" disables per-cgroup pressure
+			stall information accounting feature
 
 	cgroup_no_v1=	[KNL] Disable cgroup controllers and named hierarchies in v1
 			Format: { { controller | "all" | "named" }
diff --git a/include/linux/cgroup-defs.h b/include/linux/cgroup-defs.h
index 9f511b3e769b..57ce109f039e 100644
--- a/include/linux/cgroup-defs.h
+++ b/include/linux/cgroup-defs.h
@@ -99,6 +99,7 @@ enum {
 
 	CFTYPE_NO_PREFIX	= (1 << 3),	/* (DON'T USE FOR NEW FILES) no subsys prefix */
 	CFTYPE_WORLD_WRITABLE	= (1 << 4),	/* (DON'T USE FOR NEW FILES) S_IWUGO */
+	CFTYPE_PRESSURE		= (1 << 6),	/* only if pressure feature is enabled */
 
 	/* internal flags, do not use outside cgroup core proper */
 	__CFTYPE_ONLY_ON_DFL	= (1 << 16),	/* only on default hierarchy */
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
index 11003a115508..0d9f2148cb3e 100644
--- a/include/linux/cgroup.h
+++ b/include/linux/cgroup.h
@@ -667,6 +667,8 @@ static inline struct psi_group *cgroup_psi(struct cgroup *cgrp)
 	return &cgrp->psi;
 }
 
+bool cgroup_psi_enabled(void);
+
 static inline void cgroup_init_kthreadd(void)
 {
 	/*
@@ -731,6 +733,11 @@ static inline struct psi_group *cgroup_psi(struct cgroup *cgrp)
 	return NULL;
 }
 
+static inline bool cgroup_psi_enabled(void)
+{
+	return false;
+}
+
 static inline bool task_under_cgroup_hierarchy(struct task_struct *task,
 					       struct cgroup *ancestor)
 {
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index 102ff449af09..9fb4f2fdcc07 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -211,6 +211,22 @@ struct cgroup_namespace init_cgroup_ns = {
 static struct file_system_type cgroup2_fs_type;
 static struct cftype cgroup_base_files[];
 
+/* cgroup optional features */
+enum cgroup_opt_features {
+#ifdef CONFIG_PSI
+	OPT_FEATURE_PRESSURE,
+#endif
+	OPT_FEATURE_COUNT
+};
+
+static const char *cgroup_opt_feature_names[OPT_FEATURE_COUNT] = {
+#ifdef CONFIG_PSI
+	"pressure",
+#endif
+};
+
+static u16 cgroup_feature_disable_mask __read_mostly;
+
 static int cgroup_apply_control(struct cgroup *cgrp);
 static void cgroup_finalize_control(struct cgroup *cgrp, int ret);
 static void css_task_iter_skip(struct css_task_iter *it,
@@ -3535,6 +3551,18 @@ static void cgroup_pressure_release(struct kernfs_open_file *of)
 {
 	psi_trigger_replace(&of->priv, NULL);
 }
+
+bool cgroup_psi_enabled(void)
+{
+	return (cgroup_feature_disable_mask & (1 << OPT_FEATURE_PRESSURE)) == 0;
+}
+
+#else /* CONFIG_PSI */
+bool cgroup_psi_enabled(void)
+{
+	return false;
+}
+
 #endif /* CONFIG_PSI */
 
 static int cgroup_freeze_show(struct seq_file *seq, void *v)
@@ -3782,6 +3810,8 @@ static int cgroup_addrm_files(struct cgroup_subsys_state *css,
 restart:
 	for (cft = cfts; cft != cft_end && cft->name[0] != '\0'; cft++) {
 		/* does cft->flags tell us to skip this file on @cgrp? */
+		if ((cft->flags & CFTYPE_PRESSURE) && !cgroup_psi_enabled())
+			continue;
 		if ((cft->flags & __CFTYPE_ONLY_ON_DFL) && !cgroup_on_dfl(cgrp))
 			continue;
 		if ((cft->flags & __CFTYPE_NOT_ON_DFL) && cgroup_on_dfl(cgrp))
@@ -3858,6 +3888,9 @@ static int cgroup_init_cftypes(struct cgroup_subsys *ss, struct cftype *cfts)
 
 		WARN_ON(cft->ss || cft->kf_ops);
 
+		if ((cft->flags & CFTYPE_PRESSURE) && !cgroup_psi_enabled())
+			continue;
+
 		if (cft->seq_start)
 			kf_ops = &cgroup_kf_ops;
 		else
@@ -4773,7 +4806,7 @@ static struct cftype cgroup_base_files[] = {
 #ifdef CONFIG_PSI
 	{
 		.name = "io.pressure",
-		.flags = CFTYPE_NOT_ON_ROOT,
+		.flags = CFTYPE_NOT_ON_ROOT | CFTYPE_PRESSURE,
 		.seq_show = cgroup_io_pressure_show,
 		.write = cgroup_io_pressure_write,
 		.poll = cgroup_pressure_poll,
@@ -4781,7 +4814,7 @@ static struct cftype cgroup_base_files[] = {
 	},
 	{
 		.name = "memory.pressure",
-		.flags = CFTYPE_NOT_ON_ROOT,
+		.flags = CFTYPE_NOT_ON_ROOT | CFTYPE_PRESSURE,
 		.seq_show = cgroup_memory_pressure_show,
 		.write = cgroup_memory_pressure_write,
 		.poll = cgroup_pressure_poll,
@@ -4789,7 +4822,7 @@ static struct cftype cgroup_base_files[] = {
 	},
 	{
 		.name = "cpu.pressure",
-		.flags = CFTYPE_NOT_ON_ROOT,
+		.flags = CFTYPE_NOT_ON_ROOT | CFTYPE_PRESSURE,
 		.seq_show = cgroup_cpu_pressure_show,
 		.write = cgroup_cpu_pressure_write,
 		.poll = cgroup_pressure_poll,
@@ -6026,6 +6059,15 @@ static int __init cgroup_disable(char *str)
 			pr_info("Disabling %s control group subsystem\n",
 				ss->name);
 		}
+
+		for (i = 0; i < OPT_FEATURE_COUNT; i++) {
+			if (strcmp(token, cgroup_opt_feature_names[i]))
+				continue;
+			cgroup_feature_disable_mask |= 1 << i;
+			pr_info("Disabling %s control group feature\n",
+				cgroup_opt_feature_names[i]);
+			break;
+		}
 	}
 	return 1;
 }
@@ -6316,6 +6358,9 @@ static ssize_t show_delegatable_files(struct cftype *files, char *buf,
 		if (!(cft->flags & CFTYPE_NS_DELEGATABLE))
 			continue;
 
+		if ((cft->flags & CFTYPE_PRESSURE) && !cgroup_psi_enabled())
+			continue;
+
 		if (prefix)
 			ret += snprintf(buf + ret, size - ret, "%s.", prefix);
 
diff --git a/kernel/sched/psi.c b/kernel/sched/psi.c
index 7715071325f9..1ff4904dd4ee 100644
--- a/kernel/sched/psi.c
+++ b/kernel/sched/psi.c
@@ -145,6 +145,7 @@
 static int psi_bug __read_mostly;
 
 DEFINE_STATIC_KEY_FALSE(psi_disabled);
+DEFINE_STATIC_KEY_TRUE(psi_cgroups_enabled);
 
 #ifdef CONFIG_PSI_DEFAULT_DISABLED
 static bool psi_enable;
@@ -209,6 +210,9 @@ void __init psi_init(void)
 		return;
 	}
 
+	if (!cgroup_psi_enabled())
+		static_branch_disable(&psi_cgroups_enabled);
+
 	psi_period = jiffies_to_nsecs(PSI_FREQ);
 	group_init(&psi_system);
 }
@@ -722,23 +726,23 @@ static u32 psi_group_change(struct psi_group *group, int cpu,
 
 static struct psi_group *iterate_groups(struct task_struct *task, void **iter)
 {
+	if (*iter == &psi_system)
+		return NULL;
+
 #ifdef CONFIG_CGROUPS
-	struct cgroup *cgroup = NULL;
+	if (static_branch_likely(&psi_cgroups_enabled)) {
+		struct cgroup *cgroup = NULL;
 
-	if (!*iter)
-		cgroup = task->cgroups->dfl_cgrp;
-	else if (*iter == &psi_system)
-		return NULL;
-	else
-		cgroup = cgroup_parent(*iter);
+		if (!*iter)
+			cgroup = task->cgroups->dfl_cgrp;
+		else
+			cgroup = cgroup_parent(*iter);
 
-	if (cgroup && cgroup_parent(cgroup)) {
-		*iter = cgroup;
-		return cgroup_psi(cgroup);
+		if (cgroup && cgroup_parent(cgroup)) {
+			*iter = cgroup;
+			return cgroup_psi(cgroup);
+		}
 	}
-#else
-	if (*iter)
-		return NULL;
 #endif
 	*iter = &psi_system;
 	return &psi_system;

commit b0868873db1d39f357b75c905ff6fd5e26e57dc9
Author: Yifeng Zhao <yifeng.zhao@rock-chips.com>
Date:   Thu Jun 17 11:13:21 2021 +0800

    mmc: sdhci-of-dwcmshc: rk3568: do not enable DLL while the clock rate less than 52mhz
    
    The DLL may not be able to lock while the clock rate less than 52mhz.
    
    Signed-off-by: Yifeng Zhao <yifeng.zhao@rock-chips.com>
    Change-Id: Ifacc3da516d78f5f242d8b03a60500a7dfe28993

diff --git a/drivers/mmc/host/sdhci-of-dwcmshc.c b/drivers/mmc/host/sdhci-of-dwcmshc.c
index 18c3cf9723be..dd45dcecdac6 100644
--- a/drivers/mmc/host/sdhci-of-dwcmshc.c
+++ b/drivers/mmc/host/sdhci-of-dwcmshc.c
@@ -182,7 +182,7 @@ static void dwcmshc_rk_set_clock(struct sdhci_host *host, unsigned int clock)
 	extra &= ~BIT(0);
 	sdhci_writel(host, extra, DWCMSHC_HOST_CTRL3);
 
-	if (clock <= 400000) {
+	if (clock <= 52000000) {
 		/* Disable DLL and reset both of sample and drive clock */
 		sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_CTRL);
 		sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_RXCLK);

commit 6770b766b4ceed2391ca372203b0a503f89719df
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Mon Jun 28 10:32:47 2021 +0800

    regulator: xz3216: Fix gcc this statement may fall through warning
    
    drivers/regulator/xz3216.c: In function 'xz3216_dcdc_set_suspend_mode':
    drivers/regulator/xz3216.c:112:3: warning: this statement may fall through [-Wimplicit-fallthrough=]
    drivers/regulator/xz3216.c:115:3: warning: this statement may fall through [-Wimplicit-fallthrough=]
    drivers/regulator/xz3216.c:165:3: warning: this statement may fall through [-Wimplicit-fallthrough=]
    drivers/regulator/xz3216.c:168:3: warning: this statement may fall through [-Wimplicit-fallthrough=]
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: I4709021a667a5def61361f27a1675099bcb7b45f

diff --git a/drivers/regulator/xz3216.c b/drivers/regulator/xz3216.c
index 3bcaf898c768..54182559b161 100644
--- a/drivers/regulator/xz3216.c
+++ b/drivers/regulator/xz3216.c
@@ -109,11 +109,11 @@ static int xz3216_dcdc_set_mode(struct regulator_dev *dev, unsigned int mode)
 
 	switch (mode) {
 	case REGULATOR_MODE_FAST:
-		regmap_update_bits(xz3216->regmap, xz3216->vol_reg,
-				VSEL_MODE, VSEL_MODE);
+		return regmap_update_bits(xz3216->regmap, xz3216->vol_reg,
+					  VSEL_MODE, VSEL_MODE);
 	case REGULATOR_MODE_NORMAL:
-		regmap_update_bits(xz3216->regmap, xz3216->vol_reg,
-							VSEL_MODE, 0);
+		return regmap_update_bits(xz3216->regmap, xz3216->vol_reg,
+					  VSEL_MODE, 0);
 	default:
 		DBG("error:dcdc_xz3216 only auto and pwm mode\n");
 		return -EINVAL;
@@ -162,11 +162,11 @@ static int xz3216_dcdc_set_suspend_mode(struct regulator_dev *dev,
 
 	switch (mode) {
 	case REGULATOR_MODE_FAST:
-		regmap_update_bits(xz3216->regmap, xz3216->vol_reg,
-							VSEL_MODE, VSEL_MODE);
+		return regmap_update_bits(xz3216->regmap, xz3216->vol_reg,
+					  VSEL_MODE, VSEL_MODE);
 	case REGULATOR_MODE_NORMAL:
-		regmap_update_bits(xz3216->regmap, xz3216->vol_reg,
-						    VSEL_MODE, 0);
+		return regmap_update_bits(xz3216->regmap, xz3216->vol_reg,
+					  VSEL_MODE, 0);
 	default:
 		DBG_ERR("error:dcdc_xz3216 only auto and pwm mode\n");
 		return -EINVAL;

commit 19c8fef96d5974199756772abc99b0eff91e8931
Author: Bram Bonné <brambonne@google.com>
Date:   Fri Apr 30 11:50:19 2021 +0200

    ANDROID: selinux: modify RTM_GETNEIGH{TBL}
    
    Map the permission gating RTM_GETNEIGH/RTM_GETNEIGHTBL messages to a
    new permission so that it can be distinguished from the other netlink
    route permissions in selinux policy. The new permission is triggered by
    a flag set in system images T and up.
    
    This change is intended to be backported to all kernels that a T system
    image can run on top of.
    
    Bug: 171572148
    Test: atest NetworkInterfaceTest
    Test: atest CtsSelinuxTargetSdkCurrentTestCases
    Test: atest bionic-unit-tests-static
    Test: On Cuttlefish, run combinations of:
        - Policy bit set or omitted (see https://r.android.com/1701847)
        - This patch applied or omitted
        - App having nlmsg_readneigh permission or not
      Verify that only the combination of this patch + the policy bit being
      set + the app not having the nlmsg_readneigh permission prevents the
      app from sending RTM_GETNEIGH messages.
    
    Change-Id: I4bcfce4decb34ea9388eeedfc4be67403de8a980
    Signed-off-by: Bram Bonné <brambonne@google.com>
    (cherry picked from commit fac07550bdac9adea0dbe3edbdbec7a9a690a178)

diff --git a/security/selinux/include/classmap.h b/security/selinux/include/classmap.h
index 06e836b43ebf..648c07581800 100644
--- a/security/selinux/include/classmap.h
+++ b/security/selinux/include/classmap.h
@@ -115,7 +115,8 @@ struct security_class_mapping secclass_map[] = {
 	  { COMMON_IPC_PERMS, NULL } },
 	{ "netlink_route_socket",
 	  { COMMON_SOCK_PERMS,
-	    "nlmsg_read", "nlmsg_write", "nlmsg_readpriv", NULL } },
+	    "nlmsg_read", "nlmsg_write", "nlmsg_readpriv", "nlmsg_getneigh",
+	    NULL } },
 	{ "netlink_tcpdiag_socket",
 	  { COMMON_SOCK_PERMS,
 	    "nlmsg_read", "nlmsg_write", NULL } },
diff --git a/security/selinux/include/security.h b/security/selinux/include/security.h
index f64e33b23cd9..d9a64b3839c6 100644
--- a/security/selinux/include/security.h
+++ b/security/selinux/include/security.h
@@ -105,6 +105,8 @@ struct selinux_state {
 	bool initialized;
 	bool policycap[__POLICYDB_CAPABILITY_MAX];
 	bool android_netlink_route;
+	bool android_netlink_getneigh;
+
 	struct selinux_avc *avc;
 	struct selinux_ss *ss;
 };
@@ -184,6 +186,13 @@ static inline bool selinux_android_nlroute_getlink(void)
 	return state->android_netlink_route;
 }
 
+static inline bool selinux_android_nlroute_getneigh(void)
+{
+	struct selinux_state *state = &selinux_state;
+
+	return state->android_netlink_getneigh;
+}
+
 int security_mls_enabled(struct selinux_state *state);
 int security_load_policy(struct selinux_state *state,
 			 void *data, size_t len);
diff --git a/security/selinux/nlmsgtab.c b/security/selinux/nlmsgtab.c
index 5c4299743e9b..74898884832f 100644
--- a/security/selinux/nlmsgtab.c
+++ b/security/selinux/nlmsgtab.c
@@ -207,12 +207,12 @@ int selinux_nlmsg_lookup(u16 sclass, u16 nlmsg_type, u32 *perm)
 	return err;
 }
 
-static void nlmsg_set_getlink_perm(u32 perm)
+static void nlmsg_set_perm_for_type(u32 perm, u16 type)
 {
 	int i;
 
 	for (i = 0; i < ARRAY_SIZE(nlmsg_route_perms); i++) {
-		if (nlmsg_route_perms[i].nlmsg_type == RTM_GETLINK) {
+		if (nlmsg_route_perms[i].nlmsg_type == type) {
 			nlmsg_route_perms[i].perm = perm;
 			break;
 		}
@@ -222,11 +222,27 @@ static void nlmsg_set_getlink_perm(u32 perm)
 /**
  * Use nlmsg_readpriv as the permission for RTM_GETLINK messages if the
  * netlink_route_getlink policy capability is set. Otherwise use nlmsg_read.
+ * Similarly, use nlmsg_getneigh for RTM_GETNEIGH and RTM_GETNEIGHTBL if the
+ * netlink_route_getneigh policy capability is set. Otherwise use nlmsg_read.
  */
 void selinux_nlmsg_init(void)
 {
 	if (selinux_android_nlroute_getlink())
-		nlmsg_set_getlink_perm(NETLINK_ROUTE_SOCKET__NLMSG_READPRIV);
+		nlmsg_set_perm_for_type(NETLINK_ROUTE_SOCKET__NLMSG_READPRIV,
+					RTM_GETLINK);
 	else
-		nlmsg_set_getlink_perm(NETLINK_ROUTE_SOCKET__NLMSG_READ);
+		nlmsg_set_perm_for_type(NETLINK_ROUTE_SOCKET__NLMSG_READ,
+					RTM_GETLINK);
+
+	if (selinux_android_nlroute_getneigh()) {
+		nlmsg_set_perm_for_type(NETLINK_ROUTE_SOCKET__NLMSG_GETNEIGH,
+					RTM_GETNEIGH);
+		nlmsg_set_perm_for_type(NETLINK_ROUTE_SOCKET__NLMSG_GETNEIGH,
+					RTM_GETNEIGHTBL);
+	} else {
+		nlmsg_set_perm_for_type(NETLINK_ROUTE_SOCKET__NLMSG_READ,
+					RTM_GETNEIGH);
+		nlmsg_set_perm_for_type(NETLINK_ROUTE_SOCKET__NLMSG_READ,
+					RTM_GETNEIGHTBL);
+	}
 }
diff --git a/security/selinux/ss/policydb.c b/security/selinux/ss/policydb.c
index 9fc103c71cf2..3e68f9339caf 100644
--- a/security/selinux/ss/policydb.c
+++ b/security/selinux/ss/policydb.c
@@ -2404,6 +2404,10 @@ int policydb_read(struct policydb *p, void *fp)
 		p->android_netlink_route = 1;
 	}
 
+	if ((le32_to_cpu(buf[1]) & POLICYDB_CONFIG_ANDROID_NETLINK_GETNEIGH)) {
+		p->android_netlink_getneigh = 1;
+	}
+
 	if (p->policyvers >= POLICYDB_VERSION_POLCAP) {
 		rc = ebitmap_read(&p->policycaps, fp);
 		if (rc)
diff --git a/security/selinux/ss/policydb.h b/security/selinux/ss/policydb.h
index dbb0ed57ed8b..9423952faf7b 100644
--- a/security/selinux/ss/policydb.h
+++ b/security/selinux/ss/policydb.h
@@ -239,6 +239,7 @@ struct genfs {
 struct policydb {
 	int mls_enabled;
 	int android_netlink_route;
+	int android_netlink_getneigh;
 
 	/* symbol tables */
 	struct symtab symtab[SYM_NUM];
@@ -326,6 +327,7 @@ extern int policydb_write(struct policydb *p, void *fp);
 
 #define POLICYDB_CONFIG_MLS    1
 #define POLICYDB_CONFIG_ANDROID_NETLINK_ROUTE    (1 << 31)
+#define POLICYDB_CONFIG_ANDROID_NETLINK_GETNEIGH (1 << 30)
 
 /* the config flags related to unknown classes/perms are bits 2 and 3 */
 #define REJECT_UNKNOWN	0x00000002
diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c
index c9c48fc2da7e..1349f9e20987 100644
--- a/security/selinux/ss/services.c
+++ b/security/selinux/ss/services.c
@@ -2115,6 +2115,7 @@ static void security_load_policycaps(struct selinux_state *state)
 	}
 
 	state->android_netlink_route = p->android_netlink_route;
+	state->android_netlink_getneigh = p->android_netlink_getneigh;
 	selinux_nlmsg_init();
 }
 

commit ff7380d3966d6d0e999b9f614a6ab57b251c10ba
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Fri Jun 25 18:08:54 2021 +0800

    media: rockchip: isp: clear rdbk fifo at dmarx stop
    
    Change-Id: If26ebfa218da49d272c1e4aa0a2e8c7e4361ba5f
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/dmarx.c b/drivers/media/platform/rockchip/isp/dmarx.c
index c46007ac12f9..5e7166bc30ac 100644
--- a/drivers/media/platform/rockchip/isp/dmarx.c
+++ b/drivers/media/platform/rockchip/isp/dmarx.c
@@ -560,6 +560,10 @@ static void dmarx_stop_streaming(struct vb2_queue *queue)
 
 	dmarx_stop(stream);
 	destroy_buf_queue(stream, VB2_BUF_STATE_ERROR);
+
+	if (stream->id == RKISP_STREAM_RAWRD2 &&
+	    (stream->ispdev->isp_ver == ISP_V20 || stream->ispdev->isp_ver == ISP_V21))
+		kfifo_reset(&stream->ispdev->rdbk_kfifo);
 }
 
 static int dmarx_start_streaming(struct vb2_queue *queue,

commit 2f3b7899054aa50a65f5905d45b0021722732d6b
Author: Shunqing Chen <csq@rock-chips.com>
Date:   Fri Jun 25 08:52:30 2021 +0800

    media: i2c: rk628csi: workround avi packet probabitity error
    
    If read the same value three times,
    we think this avi patket is correct.
    
    Signed-off-by: Shunqing Chen <csq@rock-chips.com>
    Change-Id: I96154c38a79fe142368a2069175fa58fa2d38b0f

diff --git a/drivers/media/i2c/rk628_csi.c b/drivers/media/i2c/rk628_csi.c
index 1446b33226e5..23ff034bbfb5 100644
--- a/drivers/media/i2c/rk628_csi.c
+++ b/drivers/media/i2c/rk628_csi.c
@@ -38,7 +38,7 @@ static int debug;
 module_param(debug, int, 0644);
 MODULE_PARM_DESC(debug, "debug level (0-3)");
 
-#define DRIVER_VERSION			KERNEL_VERSION(0, 0x0, 0x3)
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x0, 0x4)
 #define RK628_CSI_NAME			"rk628-csi"
 
 #define EDID_NUM_BLOCKS_MAX 		2
@@ -844,7 +844,8 @@ static void rk628_csi_set_csi(struct v4l2_subdev *sd)
 	u8 lanes = csi->csi_lanes_in_use;
 	u8 lane_num;
 	u8 dphy_lane_en;
-	u32 wc_usrdef, val;
+	u32 wc_usrdef, val, avi_pb = 0;
+	u8 cnt = 0;
 
 	lane_num = lanes - 1;
 	dphy_lane_en = (1 << (lanes + 1)) - 1;
@@ -905,16 +906,19 @@ static void rk628_csi_set_csi(struct v4l2_subdev *sd)
 	regmap_write(csi->csi_regmap, CSITX_CONFIG_DONE, CONFIG_DONE_IMD);
 	v4l2_dbg(1, debug, sd, "%s csi cofig done\n", __func__);
 
-	for (i = 0; i < 10; i++) {
-		if (csi->avi_rcv_rdy)
-			break;
-		usleep_range(20*1000, 21*1000);
+	for (i = 0; i < 100; i++) {
+		regmap_read(csi->hdmirx_regmap, HDMI_RX_PDEC_AVI_PB, &val);
+		v4l2_dbg(2, debug, sd, "%s PDEC_AVI_PB:%#x, avi_rcv_rdy:%d\n",
+			 __func__, val, csi->avi_rcv_rdy);
+		if (val == avi_pb && csi->avi_rcv_rdy) {
+			if (++cnt >= 2)
+				break;
+		} else {
+			cnt = 0;
+			avi_pb = val;
+		}
+		msleep(30);
 	}
-
-	if (i == 10)
-		v4l2_err(sd, "%s Have not rcv avi packet!\n", __func__);
-
-	regmap_read(csi->hdmirx_regmap, HDMI_RX_PDEC_AVI_PB, &val);
 	video_fmt = (val & VIDEO_FORMAT_MASK) >> 5;
 	v4l2_dbg(1, debug, sd, "%s PDEC_AVI_PB:%#x, video format:%d\n",
 			__func__, val, video_fmt);
@@ -1398,7 +1402,7 @@ static int rk628_csi_isr(struct v4l2_subdev *sd, u32 status, bool *handled)
 		*handled = true;
 	}
 
-	if ((pdec_ints | AVI_RCV_ISTS) && plugin) {
+	if ((pdec_ints & AVI_RCV_ISTS) && plugin) {
 		v4l2_dbg(1, debug, sd, "%s: AVI RCV INT!\n", __func__);
 		csi->avi_rcv_rdy = true;
 		/* After get the AVI_RCV interrupt state, disable interrupt. */

commit 3fbe548efa32758accba2933fcfc5da220c80c70
Author: Zhihuan He <huan.he@rock-chips.com>
Date:   Fri Jun 18 17:44:17 2021 +0800

    include: linux: rockchip: add share mem page type define
    
    The share mem page type should be corresponded with
    smccc call.
    
    Change-Id: I2fc97fc6841e2fd6ed7080d6af2fa2929ae355fb
    Signed-off-by: Zhihuan He <huan.he@rock-chips.com>

diff --git a/include/linux/rockchip/rockchip_sip.h b/include/linux/rockchip/rockchip_sip.h
index 4331aa089ba0..c77bbb78c830 100644
--- a/include/linux/rockchip/rockchip_sip.h
+++ b/include/linux/rockchip/rockchip_sip.h
@@ -123,6 +123,8 @@ typedef enum {
 	SHARE_PAGE_TYPE_UARTDBG,
 	SHARE_PAGE_TYPE_DDR,
 	SHARE_PAGE_TYPE_DDRDBG,
+	SHARE_PAGE_TYPE_DDRECC,
+	SHARE_PAGE_TYPE_LAST_LOG,
 	SHARE_PAGE_TYPE_MAX,
 } share_page_type_t;
 

commit 93aa3972ad482dd0f52bc30bb25f1c40b022d6a9
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Wed Jun 23 10:06:08 2021 +0800

    media: rockchip: fix isp and ispp share dmabuf release fail
    
    Change-Id: I80d34b89c0dd8965baebbc9cd75b0877f5e4ed9d
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/capture_v20.c b/drivers/media/platform/rockchip/isp/capture_v20.c
index 5d3cc8c3b154..868a02901dcd 100644
--- a/drivers/media/platform/rockchip/isp/capture_v20.c
+++ b/drivers/media/platform/rockchip/isp/capture_v20.c
@@ -1812,10 +1812,6 @@ static void rkisp_stop_streaming(struct vb2_queue *queue)
 	rkisp_destroy_dummy_buf(stream);
 	atomic_dec(&dev->cap_dev.refcnt);
 	stream->start_stream = false;
-	if (stream->id == RKISP_STREAM_SP && stream->out_isp_fmt.fmt_type == FMT_FBCGAIN) {
-		stream->out_isp_fmt.fmt_type = FMT_YUV;
-		stream->out_isp_fmt.fourcc = V4L2_PIX_FMT_NV12;
-	}
 }
 
 static int rkisp_stream_start(struct rkisp_stream *stream)
diff --git a/drivers/media/platform/rockchip/ispp/common.c b/drivers/media/platform/rockchip/ispp/common.c
index 49962c39b81c..efa25aadd66f 100644
--- a/drivers/media/platform/rockchip/ispp/common.c
+++ b/drivers/media/platform/rockchip/ispp/common.c
@@ -271,6 +271,7 @@ static void rkispp_free_pool(struct rkispp_hw_dev *hw)
 			if (buf->mem_priv[j]) {
 				g_ops->unmap_dmabuf(buf->mem_priv[j]);
 				g_ops->detach_dmabuf(buf->mem_priv[j]);
+				dma_buf_put(buf->dbufs->dbuf[j]);
 				buf->mem_priv[j] = NULL;
 			}
 		}
@@ -318,11 +319,12 @@ static int rkispp_init_pool(struct rkispp_hw_dev *hw, struct rkisp_ispp_buf *dbu
 		} else {
 			pool->dma[i] = *((dma_addr_t *)g_ops->cookie(mem));
 		}
+		get_dma_buf(dbufs->dbuf[i]);
+		pool->vaddr[i] = g_ops->vaddr(mem);
 		if (rkispp_debug)
 			dev_info(hw->dev, "%s dma[%d]:0x%x\n",
 				 __func__, i, (u32)pool->dma[i]);
 
-		pool->vaddr[i] = g_ops->vaddr(mem);
 	}
 	rkispp_init_regbuf(hw);
 	hw->is_idle = true;

commit c1baa3321020cdd2ea9248d9b1ec512abf6f1c24
Author: Tor Vic <torvic9@mailbox.org>
Date:   Thu Jun 10 20:58:06 2021 +0000

    BACKPORT: x86, lto: Pass -stack-alignment only on LLD < 13.0.0
    
    Since LLVM commit 3787ee4, the '-stack-alignment' flag has been dropped
    [1], leading to the following error message when building a LTO kernel
    with Clang-13 and LLD-13:
    
        ld.lld: error: -plugin-opt=-: ld.lld: Unknown command line argument
        '-stack-alignment=8'.  Try 'ld.lld --help'
        ld.lld: Did you mean '--stackrealign=8'?
    
    It also appears that the '-code-model' flag is not necessary anymore
    starting with LLVM-9 [2].
    
    Drop '-code-model' and make '-stack-alignment' conditional on LLD < 13.0.0.
    
    These flags were necessary because these flags were not encoded in the
    IR properly, so the link would restart optimizations without them. Now
    there are properly encoded in the IR, and these flags exposing
    implementation details are no longer necessary.
    
    [1] https://reviews.llvm.org/D103048
    [2] https://reviews.llvm.org/D52322
    
    Cc: stable@vger.kernel.org
    Link: https://github.com/ClangBuiltLinux/linux/issues/1377
    Signed-off-by: Tor Vic <torvic9@mailbox.org>
    Reviewed-by: Nathan Chancellor <nathan@kernel.org>
    Tested-by: Nathan Chancellor <nathan@kernel.org>
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Link: https://lore.kernel.org/r/f2c018ee-5999-741e-58d4-e482d5246067@mailbox.org
    (cherry picked from commit 2398ce80152aae33b9501ef54452e09e8e8d4262)
    Change-Id: Icebcd5669e851e2c26e9f807b9d1aeb86e95dcea
    [nathan: Fix conflict due to lack of 587af649bcc0]
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>

diff --git a/arch/x86/Makefile b/arch/x86/Makefile
index 5f4c7c605ece..eb84621481f6 100644
--- a/arch/x86/Makefile
+++ b/arch/x86/Makefile
@@ -221,8 +221,9 @@ KBUILD_LDFLAGS += $(call ld-option, -z max-page-size=0x200000)
 endif
 
 ifdef CONFIG_LTO_CLANG
-KBUILD_LDFLAGS	+= -plugin-opt=-code-model=kernel \
-		   -plugin-opt=-stack-alignment=$(if $(CONFIG_X86_32),4,8)
+ifeq ($(shell test $(CONFIG_LLD_VERSION) -lt 130000; echo $$?),0)
+KBUILD_LDFLAGS	+= -plugin-opt=-stack-alignment=$(if $(CONFIG_X86_32),4,8)
+endif
 endif
 
 # Speed up the build

commit 2d3bb19177028379c00cd3c6f07d42efe55628c7
Author: Nathan Chancellor <nathan@kernel.org>
Date:   Wed Jun 23 11:36:04 2021 -0700

    ANDROID: Add CONFIG_LLD_VERSION
    
    CONFIG_LLD_VERSION was originally added in commit d5750cd3c548 ("kbuild:
    Disable CONFIG_LD_ORPHAN_WARN for ld.lld 10.0.1"), which is not
    applicable to 4.19. Additionally, lld-version.sh was eliminated and
    combined into ld-version.sh in commit 02aff8592204 ("kbuild: check the
    minimum linker version in Kconfig") and there was a follow up fix in
    commit 1f09af062556 ("kbuild: Fix ld-version.sh script if LLD was built
    with LLD_VENDOR"), which is a little large to take into
    android-4.19-stable for the sake of fixing an LTO issue.
    
    Add scripts/lld-version.sh but based on the upstream version of
    ld-version.sh so that we benefit from the fixes but do not have to
    backport a ton of patches just to get access to CONFIG_LLD_VERSION.
    
    Change-Id: I686ce6cc5f503540d8336b914f0fe978951c469b
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>

diff --git a/init/Kconfig b/init/Kconfig
index 512a7623f9f9..544217bbc030 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -26,6 +26,10 @@ config CLANG_VERSION
 	int
 	default $(shell,$(srctree)/scripts/clang-version.sh $(CC))
 
+config LLD_VERSION
+	int
+	default $(shell,$(srctree)/scripts/lld-version.sh $(LD))
+
 config CC_HAS_ASM_GOTO
 	def_bool $(success,$(srctree)/scripts/gcc-goto.sh $(CC))
 
diff --git a/scripts/lld-version.sh b/scripts/lld-version.sh
new file mode 100755
index 000000000000..b6d6f52c5cfa
--- /dev/null
+++ b/scripts/lld-version.sh
@@ -0,0 +1,36 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0
+#
+# Print ld.lld's version in a 5 or 6-digit form.
+
+set -e
+
+# Convert the version string x.y.z to a canonical 5 or 6-digit form.
+get_canonical_version()
+{
+	IFS=.
+	set -- $1
+
+	# If the 2nd or 3rd field is missing, fill it with a zero.
+	echo $((10000 * $1 + 100 * ${2:-0} + ${3:-0}))
+}
+
+orig_args="$@"
+
+# Get the first line of the --version output.
+IFS='
+'
+set -- $(LC_ALL=C "$@" --version)
+
+# Split the line on spaces.
+IFS=' '
+set -- $1
+
+while [ $# -gt 1 -a "$1" != "LLD" ]; do
+	shift
+done
+if [ "$1" = LLD ]; then
+	echo $(get_canonical_version ${2%-*})
+else
+	echo 0
+fi

commit ce02e6a41dc011476b1efee4c5bab1b082ca0620
Author: Cliff Chen <cliff.chen@rock-chips.com>
Date:   Mon Jun 7 11:46:55 2021 +0800

    f2fs: Avoid using empty extent_tree when look up extent cache
    
    If CONFIG_F2FS_CHECK_FS is not enabled, the lookup_extent_tree function will continue to run when
    the extent_tree is NULL, causing the kernel to crash. The dump like this:
    [05-13 09:41:14][ 3309.526262] Unable to handle kernel NULL pointer dereference at virtual a5ddress 0000000000000040
    [05-13 09:41:14][ 3309.715348] Mem abort info:
    [05-13 09:41:14][ 3309.715618]   ESR = 0x96000006
    [05-13 09:41:14][ 3309.715899]   Exception class = DABT (current EL), IL = 32 bits
    [05-13 09:41:14][ 3309.716416]   SET = 0, FnV = 0
    [05-13 09:41:14][ 3309.716693]   EA = 0, S1PTW = 0
    [05-13 09:41:14][ 3309.717003] Data abort info:
    [05-13 09:41:14][ 3309.717260]   ISV = 0, ISS = 0x00000006
    [05-13 09:41:14]  0): Mem abort info:
    [05-13 09:41:14]05-13 01:40:58.784 F/        (    0): ESR = 0x96000006
    [05-13 09:41:14]05-13 01:40:58.784 F/        (    0): Exception class = DABT (current EL), IL = 32 bits
    [05-13 09:41:14]05-13 01:40:58.785 F/        (    0): SET = 0, FnV = 0
    [05-13 09:41:14]05-13 01:40:58.785 F/        (    0): EA = 0, S1PTW = 0
    [05-13 09:41:14]05-13 01:40:58.785 F/        (    0): Data abort info:
    [05-13 09:41:14]05-13 01:40:58.785 F/        (    0): ISV = 0, ISS = 0x00000006
    [05-13 09:41:14]05-13 01:40:58.792 F/Internal error(    0): Oops: 96000006 [#1] PREEMPT SMP
    [05-13 09:41:14][ 3309.726031] Process Binder:382_1 (pid: 396, stack limit = 0x00000000b36c00c5)
    [05-13 09:41:14][ 3309.726670] CPU: 3 PID: 396 Comm: Binder:382_1 Tainted: G        W         4.19.172 #166
    [05-13 09:41:14][ 3309.727380] Hardware name: Rockchip RK3566 RK817 TABLET LP4X Board (DT)
    [05-13 09:41:14][ 3309.727968] pstate: 60400009 (nZCv daif +PAN -UAO)
    [05-13 09:41:14][ 3309.728412] pc : _raw_read_lock+0x20/0x48
    [05-13 09:41:14][ 3309.728779] lr : f2fs_lookup_extent_tree+0xd0/0x330
    [05-13 09:41:14][ 3309.729216] sp : ffffff800cc3b700
    [05-13 09:41:14][ 3309.818050] Call trace:
    [05-13 09:41:14][ 3309.818288]  _raw_read_lock+0x20/0x48
    [05-13 09:41:14][ 3309.818617]  f2fs_lookup_extent_tree+0xd0/0x330
    [05-13 09:41:14][ 3309.819021]  f2fs_lookup_extent_cache+0x4c/0x60
    [05-13 09:41:14][ 3309.819427]  f2fs_map_blocks+0x84/0x9e8
    [05-13 09:41:14][ 3309.819774]  f2fs_mpage_readpages+0x1e8/0x604
    [05-13 09:41:14][ 3309.820166]  f2fs_read_data_pages+0xf4/0x11c
    [05-13 09:41:14][ 3309.820551]  read_pages+0x64/0x148
    [05-13 09:41:14][ 3309.820852]  __do_page_cache_readahead+0x164/0x1c4
    [05-13 09:41:14][ 3309.821278]  ondemand_readahead+0x1e4/0x264
    [05-13 09:41:14][ 3309.821647]  page_cache_async_readahead+0xb4/0xd0
    [05-13 09:41:14][ 3309.822066]  generic_file_read_iter+0x168/0x8b4
    [05-13 09:41:14][ 3309.822474]  f2fs_file_read_iter+0x34/0xa0
    [05-13 09:41:14][ 3309.822848]  generic_file_splice_read+0xc8/0x144
    [05-13 09:41:14][ 3309.823263]  splice_direct_to_actor+0xf8/0x274
    [05-13 09:41:14][ 3309.823655]  do_splice_direct+0x78/0xc8
    [05-13 09:41:14][ 3309.824008]  do_sendfile+0x1cc/0x404
    [05-13 09:41:14][ 3309.824336]  __se_compat_sys_sendfile+0x9c/0x26c
    [05-13 09:41:14][ 3309.824750]  __arm64_compat_sys_sendfile+0x18/0x20
    [05-13 09:41:14][ 3309.825181]  el0_svc_common+0x98/0x160
    [05-13 09:41:14][ 3309.825518]  el0_svc_compat_handler+0x18/0x20
    [05-13 09:41:14][ 3309.825913]  el0_svc_compat+0x8/0x34
    [05-13 09:41:14][ 3309.826244] Code: aa0003e1 52804000 11000529 b9001909 (b8a0003e)
    
    Signed-off-by: Cliff Chen <cliff.chen@rock-chips.com>
    Change-Id: Ic7d144eb2518ecc255428eff1c493dbcb36d7976

diff --git a/fs/f2fs/extent_cache.c b/fs/f2fs/extent_cache.c
index e60078460ad1..e75f01879ce1 100644
--- a/fs/f2fs/extent_cache.c
+++ b/fs/f2fs/extent_cache.c
@@ -383,6 +383,9 @@ static bool f2fs_lookup_extent_tree(struct inode *inode, pgoff_t pgofs,
 
 	f2fs_bug_on(sbi, !et);
 
+	if (!et)
+		return ret;
+
 	trace_f2fs_lookup_extent_tree_start(inode, pgofs);
 
 	read_lock(&et->lock);

commit f8d073dcd376158bb9e26e4463033a5c3965ec82
Author: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Date:   Thu Apr 15 00:41:58 2021 -0700

    UPSTREAM: usb: dwc3: gadget: Remove FS bInterval_m1 limitation
    
    The programming guide incorrectly stated that the DCFG.bInterval_m1 must
    be set to 0 when operating in fullspeed. There's no such limitation for
    all IPs. See DWC_usb3x programming guide section 3.2.2.1.
    
    Fixes: a1679af85b2a ("usb: dwc3: gadget: Fix setting of DEPCFG.bInterval_m1")
    Cc: <stable@vger.kernel.org>
    Acked-by: Felipe Balbi <balbi@kernel.org>
    Signed-off-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
    Link: https://lore.kernel.org/r/5d4139ae89d810eb0a2d8577fb096fc88e87bfab.1618472454.git.Thinh.Nguyen@synopsys.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    (cherry picked from commit 3232a3ce55edfc0d7f8904543b4088a5339c2b2b)
    Change-Id: I3e77e49152bbf85c2ecb01bb490b930a78af18ee
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 2f7bcbe1d484..924cd023636d 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -771,12 +771,14 @@ static int dwc3_gadget_set_ep_config(struct dwc3_ep *dep, unsigned int action)
 		u8 bInterval_m1;
 
 		/*
-		 * Valid range for DEPCFG.bInterval_m1 is from 0 to 13, and it
-		 * must be set to 0 when the controller operates in full-speed.
+		 * Valid range for DEPCFG.bInterval_m1 is from 0 to 13.
+		 *
+		 * NOTE: The programming guide incorrectly stated bInterval_m1
+		 * must be set to 0 when operating in fullspeed. Internally the
+		 * controller does not have this limitation. See DWC_usb3x
+		 * programming guide section 3.2.2.1.
 		 */
 		bInterval_m1 = min_t(u8, desc->bInterval - 1, 13);
-		if (dwc->gadget.speed == USB_SPEED_FULL)
-			bInterval_m1 = 0;
 
 		if (usb_endpoint_type(desc) == USB_ENDPOINT_XFER_INT &&
 		    dwc->gadget.speed == USB_SPEED_FULL)

commit e6ce9c3dedbef39e9d4cb91dd46f4e05d2e72db7
Author: Yifeng Zhao <yifeng.zhao@rock-chips.com>
Date:   Tue Jun 15 17:12:34 2021 +0800

    drivers: rk_nand: set dma mask to 32bits
    
    The nandc's DMA only supports 32bits. When the DDR capacity exceeds 4GB,
    It need to configure DMA mask to 32bits and use API dma_map_single to
    get the physical address.
    
    Signed-off-by: Yifeng Zhao <yifeng.zhao@rock-chips.com>
    Change-Id: I39d7270cfc9ed02770fca5946b57011722ab2d7b

diff --git a/drivers/rk_nand/rk_ftl_arm_v8.S b/drivers/rk_nand/rk_ftl_arm_v8.S
index efe4ddffb715..68b05318eebe 100644
--- a/drivers/rk_nand/rk_ftl_arm_v8.S
+++ b/drivers/rk_nand/rk_ftl_arm_v8.S
@@ -5,92 +5,88 @@
  * 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.
- * date: 2020-09-23
+ * date: 2021-06-16
  */
-	.cpu generic+fp+simd
 	.file	"rk_ftl_arm_v8.S"
 	.text
 	.align	2
-	.type	ftl_set_blk_mode.part.9, %function
-ftl_set_blk_mode.part.9:
-	adrp	x1, .LANCHOR0
-	uxth	w0, w0
-	ubfx	x2, x0, 5, 11
-	lsl	x2, x2, 2
-	ldr	x3, [x1,#:lo12:.LANCHOR0]
-	mov	w1, 1
-	lsl	w0, w1, w0
-	ldr	w1, [x3,x2]
-	orr	w0, w1, w0
-	str	w0, [x3,x2]
-	ret
-	.size	ftl_set_blk_mode.part.9, .-ftl_set_blk_mode.part.9
-	.align	2
 	.type	flash_read_ecc, %function
 flash_read_ecc:
-	adrp	x2, .LANCHOR0
-	ubfiz	x0, x0, 4, 8
 	stp	x29, x30, [sp, -32]!
-	add	x2, x2, :lo12:.LANCHOR0
-	add	x2, x2, 8
+	ubfiz	x0, x0, 4, 8
+	adrp	x1, .LANCHOR0
+	add	x1, x1, :lo12:.LANCHOR0
+	add	x2, x1, x0
 	add	x29, sp, 0
-	add	x1, x2, x0
-	str	x19, [sp,16]
-	ldrb	w1, [x1,8]
-	ldr	x19, [x2,x0]
+	str	x19, [sp, 16]
+	ldr	x0, [x1, x0]
+	ldrb	w19, [x2, 8]
+	add	x19, x0, x19, lsl 8
 	mov	w0, 122
-	add	x19, x19, x1, lsl 8
-	str	w0, [x19,2056]
+	str	w0, [x19, 2056]
 	mov	x0, 400
 	bl	__const_udelay
-	ldr	w1, [x19,2048]
-	ldr	w0, [x19,2048]
-	and	w1, w1, 15
-	and	w0, w0, 15
-	cmp	w0, w1
-	csel	w2, w0, w1, cs
-	ldr	w1, [x19,2048]
-	ldr	w0, [x19,2048]
+	ldr	w1, [x19, 2048]
+	ldr	w0, [x19, 2048]
 	and	w1, w1, 15
-	ldr	x19, [sp,16]
-	cmp	w2, w1
 	and	w0, w0, 15
-	csel	w1, w2, w1, cs
 	cmp	w1, w0
-	csel	w0, w1, w0, cs
+	csel	w1, w1, w0, cs
+	ldr	w0, [x19, 2048]
+	ldr	w2, [x19, 2048]
+	and	w0, w0, 15
+	ldr	x19, [sp, 16]
+	and	w2, w2, 15
+	cmp	w0, w2
+	csel	w0, w0, w2, cs
+	cmp	w0, w1
+	csel	w0, w0, w1, cs
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	flash_read_ecc, .-flash_read_ecc
 	.align	2
+	.type	ftl_set_blk_mode.part.9, %function
+ftl_set_blk_mode.part.9:
+	and	w0, w0, 65535
+	adrp	x2, .LANCHOR0+64
+	ubfx	x1, x0, 5, 11
+	ldr	x3, [x2, #:lo12:.LANCHOR0+64]
+	lsl	x1, x1, 2
+	mov	w2, 1
+	lsl	w2, w2, w0
+	ldr	w0, [x3, x1]
+	orr	w0, w0, w2
+	str	w0, [x3, x1]
+	ret
+	.size	ftl_set_blk_mode.part.9, .-ftl_set_blk_mode.part.9
+	.align	2
 	.global	FlashMemCmp8
 	.type	FlashMemCmp8, %function
 FlashMemCmp8:
-	mov	x5, x0
-	adrp	x0, .LANCHOR0+72
-	ldrb	w0, [x0,#:lo12:.LANCHOR0+72]
-	cbz	w0, .L8
-	ldrb	w4, [x5,1]
-	mov	w0, 0
-	ldrb	w3, [x1,1]
+	adrp	x3, .LANCHOR0+72
+	ldrb	w3, [x3, #:lo12:.LANCHOR0+72]
+	cbz	w3, .L9
+	ldrb	w4, [x0, 1]
+	ldrb	w3, [x1, 1]
 	cmp	w4, w3
-	beq	.L5
-.L8:
+	beq	.L10
+.L9:
 	mov	x3, 0
-.L6:
-	cmp	w3, w2
+.L7:
 	mov	w4, w3
-	bcs	.L12
-	ldrb	w0, [x5,x3]
+	cmp	w3, w2
+	bcc	.L8
+.L10:
+	mov	w0, 0
+	ret
+.L8:
+	ldrb	w5, [x0, x3]
 	add	x3, x3, 1
 	add	x6, x1, x3
-	ldrb	w6, [x6,-1]
-	cmp	w6, w0
-	beq	.L6
+	ldrb	w6, [x6, -1]
+	cmp	w6, w5
+	beq	.L7
 	add	w0, w4, 1
-	b	.L5
-.L12:
-	mov	w0, 0
-.L5:
 	ret
 	.size	FlashMemCmp8, .-FlashMemCmp8
 	.align	2
@@ -98,138 +94,139 @@ FlashMemCmp8:
 	.type	FlashRsvdBlkChk, %function
 FlashRsvdBlkChk:
 	adrp	x2, .LANCHOR0
-	uxtb	w0, w0
 	add	x2, x2, :lo12:.LANCHOR0
-	ldrb	w3, [x2,73]
-	ldr	w2, [x2,76]
+	and	w0, w0, 255
+	ldrb	w3, [x2, 73]
+	ldr	w2, [x2, 76]
 	mul	w2, w3, w2
-	cmp	w1, w2
-	cset	w1, cc
-	cmp	w0, wzr
-	cset	w0, eq
-	and	w0, w1, w0
-	eor	w0, w0, 1
+	cmp	w2, w1
+	bls	.L14
+	cmp	w0, 0
+	cset	w0, ne
+	ret
+.L14:
+	mov	w0, 1
 	ret
 	.size	FlashRsvdBlkChk, .-FlashRsvdBlkChk
 	.align	2
 	.global	FlashGetRandomizer
 	.type	FlashGetRandomizer, %function
 FlashGetRandomizer:
-	stp	x29, x30, [sp, -32]!
+	and	x3, x1, 127
 	adrp	x2, .LANCHOR1
-	and	w3, w1, 127
 	add	x2, x2, :lo12:.LANCHOR1
-	add	x29, sp, 0
-	uxtb	w0, w0
-	str	x19, [sp,16]
-	ldrh	w19, [x2,w3,uxtw 1]
+	ldrh	w4, [x2, x3, lsl 1]
 	adrp	x2, .LANCHOR0+80
-	ldrb	w2, [x2,#:lo12:.LANCHOR0+80]
-	cbz	w2, .L15
+	ldrb	w2, [x2, #:lo12:.LANCHOR0+80]
+	cbz	w2, .L23
+	stp	x29, x30, [sp, -16]!
+	and	w0, w0, 255
+	add	x29, sp, 0
 	bl	FlashRsvdBlkChk
-	cmp	w0, wzr
-	orr	w1, w19, -1073741824
-	csel	w19, w1, w19, ne
-.L15:
-	mov	w0, w19
-	ldr	x19, [sp,16]
-	ldp	x29, x30, [sp], 32
+	cmp	w0, 0
+	orr	w1, w4, -1073741824
+	csel	w4, w1, w4, ne
+	mov	w0, w4
+	ldp	x29, x30, [sp], 16
+	ret
+.L23:
+	mov	w0, w4
 	ret
 	.size	FlashGetRandomizer, .-FlashGetRandomizer
 	.align	2
 	.global	FlashSetRandomizer
 	.type	FlashSetRandomizer, %function
 FlashSetRandomizer:
-	stp	x29, x30, [sp, -48]!
-	and	w2, w1, 127
-	add	x29, sp, 0
-	str	x21, [sp,32]
-	uxtb	w21, w0
+	and	x2, x1, 127
+	and	w6, w0, 255
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	stp	x19, x20, [sp,16]
-	ldrh	w20, [x0,w2,uxtw 1]
-	adrp	x2, .LANCHOR0
-	add	x0, x2, :lo12:.LANCHOR0
-	mov	x19, x2
-	ldrb	w0, [x0,80]
-	cbz	w0, .L22
-	mov	w0, w21
+	ldrh	w5, [x0, x2, lsl 1]
+	adrp	x0, .LANCHOR0
+	add	x2, x0, :lo12:.LANCHOR0
+	mov	x4, x0
+	ldrb	w2, [x2, 80]
+	cbz	w2, .L34
+	stp	x29, x30, [sp, -16]!
+	mov	w0, w6
+	add	x29, sp, 0
 	bl	FlashRsvdBlkChk
-	cmp	w0, wzr
-	orr	w1, w20, -1073741824
-	csel	w20, w1, w20, ne
-.L22:
-	add	x2, x19, :lo12:.LANCHOR0
-	add	x2, x2, w21, sxtw 4
-	ldr	x0, [x2,8]
-	str	w20, [x0,336]
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
-	ldp	x29, x30, [sp], 48
+	cmp	w0, 0
+	sbfiz	x6, x6, 4, 32
+	add	x0, x4, :lo12:.LANCHOR0
+	orr	w1, w5, -1073741824
+	csel	w5, w1, w5, ne
+	ldr	x0, [x0, x6]
+	str	w5, [x0, 336]
+	ldp	x29, x30, [sp], 16
+	ret
+.L34:
+	add	x0, x0, :lo12:.LANCHOR0
+	sbfiz	x6, x6, 4, 32
+	ldr	x0, [x0, x6]
+	str	w5, [x0, 336]
 	ret
 	.size	FlashSetRandomizer, .-FlashSetRandomizer
 	.align	2
 	.global	FlashBlockAlignInit
 	.type	FlashBlockAlignInit, %function
 FlashBlockAlignInit:
-	uxth	w0, w0
+	and	w0, w0, 65535
 	adrp	x1, .LANCHOR0
 	cmp	w0, 512
 	add	x1, x1, :lo12:.LANCHOR0
-	bls	.L29
+	bls	.L38
 	mov	w0, 1024
-	b	.L33
-.L29:
+.L42:
+	str	w0, [x1, 76]
+	ret
+.L38:
 	cmp	w0, 256
-	bls	.L31
+	bls	.L40
 	mov	w0, 512
-	b	.L33
-.L31:
+	b	.L42
+.L40:
 	cmp	w0, 128
-	bls	.L33
+	bls	.L42
 	mov	w0, 256
-.L33:
-	str	w0, [x1,76]
-	ret
+	b	.L42
 	.size	FlashBlockAlignInit, .-FlashBlockAlignInit
 	.align	2
 	.global	FlashReadCmd
 	.type	FlashReadCmd, %function
 FlashReadCmd:
-	adrp	x4, .LANCHOR0
-	uxtb	w0, w0
-	add	x4, x4, :lo12:.LANCHOR0
+	and	w0, w0, 255
+	adrp	x3, .LANCHOR0
 	sbfiz	x2, x0, 4, 32
+	add	x3, x3, :lo12:.LANCHOR0
 	stp	x29, x30, [sp, -16]!
-	add	x3, x4, 8
+	add	x4, x3, x2
 	add	x29, sp, 0
-	ldr	x4, [x4,88]
-	add	x5, x3, x2
-	ldr	x2, [x3,x2]
-	ldrb	w4, [x4,7]
-	ldrb	w3, [x5,8]
-	cmp	w4, 1
-	bne	.L35
-	sxtw	x4, w3
+	ldr	x2, [x3, x2]
+	ldr	x3, [x3, 88]
+	ldrb	w4, [x4, 8]
+	ldrb	w3, [x3, 7]
+	cmp	w3, 1
+	bne	.L44
+	sxtw	x3, w4
 	mov	w5, 38
-	add	x4, x4, 8
-	add	x4, x2, x4, lsl 8
-	str	w5, [x4,8]
-.L35:
-	ubfiz	x3, x3, 8, 8
-	add	x2, x2, x3
+	add	x3, x3, 8
+	add	x3, x2, x3, lsl 8
+	str	w5, [x3, 8]
+.L44:
+	ubfiz	x4, x4, 8, 8
 	and	w3, w1, 255
-	str	wzr, [x2,2056]
-	str	wzr, [x2,2052]
-	str	wzr, [x2,2052]
-	str	w3, [x2,2052]
+	add	x2, x2, x4
+	str	wzr, [x2, 2056]
+	str	wzr, [x2, 2052]
+	str	wzr, [x2, 2052]
+	str	w3, [x2, 2052]
 	lsr	w3, w1, 8
-	str	w3, [x2,2052]
+	str	w3, [x2, 2052]
 	lsr	w3, w1, 16
-	str	w3, [x2,2052]
+	str	w3, [x2, 2052]
 	mov	w3, 48
-	str	w3, [x2,2056]
+	str	w3, [x2, 2056]
 	bl	FlashSetRandomizer
 	ldp	x29, x30, [sp], 16
 	ret
@@ -238,74 +235,72 @@ FlashReadCmd:
 	.global	FlashReadDpDataOutCmd
 	.type	FlashReadDpDataOutCmd, %function
 FlashReadDpDataOutCmd:
+	and	w0, w0, 255
 	adrp	x3, .LANCHOR0
-	uxtb	w0, w0
-	add	x3, x3, :lo12:.LANCHOR0
 	sbfiz	x2, x0, 4, 32
-	add	x4, x3, 8
+	add	x3, x3, :lo12:.LANCHOR0
 	stp	x29, x30, [sp, -16]!
-	add	x5, x4, x2
+	add	x4, x3, x2
+	and	w5, w1, 255
 	add	x29, sp, 0
-	ldr	x6, [x4,x2]
-	lsr	w4, w1, 8
-	ldrb	w2, [x3,112]
+	ldr	x6, [x3, x2]
+	ldrb	w2, [x3, 112]
 	lsr	w3, w1, 16
 	cmp	w2, 1
-	ldrb	w2, [x5,8]
-	and	w5, w1, 255
+	ldrb	w2, [x4, 8]
+	lsr	w4, w1, 8
 	add	x2, x6, x2, lsl 8
-	bne	.L37
+	bne	.L47
 	mov	w6, 6
-	str	w6, [x2,2056]
-	str	wzr, [x2,2052]
-	str	wzr, [x2,2052]
-	str	w5, [x2,2052]
-	str	w4, [x2,2052]
-	str	w3, [x2,2052]
-	b	.L39
-.L37:
-	str	wzr, [x2,2056]
-	str	wzr, [x2,2052]
-	str	wzr, [x2,2052]
-	str	w5, [x2,2052]
-	str	w4, [x2,2052]
-	str	w3, [x2,2052]
-	mov	w3, 5
-	str	w3, [x2,2056]
-	str	wzr, [x2,2052]
-	str	wzr, [x2,2052]
-.L39:
+	str	w6, [x2, 2056]
+	str	wzr, [x2, 2052]
+	str	wzr, [x2, 2052]
+	str	w5, [x2, 2052]
+	str	w4, [x2, 2052]
+	str	w3, [x2, 2052]
+.L50:
 	mov	w3, 224
-	str	w3, [x2,2056]
+	str	w3, [x2, 2056]
 	bl	FlashSetRandomizer
 	ldp	x29, x30, [sp], 16
 	ret
+.L47:
+	str	wzr, [x2, 2056]
+	str	wzr, [x2, 2052]
+	str	wzr, [x2, 2052]
+	str	w5, [x2, 2052]
+	str	w4, [x2, 2052]
+	str	w3, [x2, 2052]
+	mov	w3, 5
+	str	w3, [x2, 2056]
+	str	wzr, [x2, 2052]
+	str	wzr, [x2, 2052]
+	b	.L50
 	.size	FlashReadDpDataOutCmd, .-FlashReadDpDataOutCmd
 	.align	2
 	.global	FlashProgFirstCmd
 	.type	FlashProgFirstCmd, %function
 FlashProgFirstCmd:
-	adrp	x3, .LANCHOR0
-	uxtb	w0, w0
-	add	x3, x3, :lo12:.LANCHOR0
+	and	w0, w0, 255
+	adrp	x4, .LANCHOR0
 	sbfiz	x5, x0, 4, 32
-	add	x3, x3, 8
-	lsr	w4, w1, 16
-	add	x2, x3, x5
+	add	x4, x4, :lo12:.LANCHOR0
+	add	x2, x4, x5
 	stp	x29, x30, [sp, -16]!
+	lsr	w3, w1, 16
 	add	x29, sp, 0
-	ldrb	w2, [x2,8]
-	ldr	x3, [x3,x5]
-	add	x2, x3, x2, lsl 8
-	mov	w3, 128
-	str	w3, [x2,2056]
-	and	w3, w1, 255
-	str	wzr, [x2,2052]
-	str	wzr, [x2,2052]
-	str	w3, [x2,2052]
-	lsr	w3, w1, 8
-	str	w3, [x2,2052]
-	str	w4, [x2,2052]
+	ldr	x4, [x4, x5]
+	ldrb	w2, [x2, 8]
+	add	x2, x4, x2, lsl 8
+	mov	w4, 128
+	str	w4, [x2, 2056]
+	and	w4, w1, 255
+	str	wzr, [x2, 2052]
+	str	wzr, [x2, 2052]
+	str	w4, [x2, 2052]
+	lsr	w4, w1, 8
+	str	w4, [x2, 2052]
+	str	w3, [x2, 2052]
 	bl	FlashSetRandomizer
 	ldp	x29, x30, [sp], 16
 	ret
@@ -314,64 +309,62 @@ FlashProgFirstCmd:
 	.global	FlashEraseCmd
 	.type	FlashEraseCmd, %function
 FlashEraseCmd:
-	adrp	x3, .LANCHOR0
 	ubfiz	x0, x0, 4, 8
+	adrp	x3, .LANCHOR0
 	add	x3, x3, :lo12:.LANCHOR0
-	add	x4, x3, 8
-	add	x5, x4, x0
-	ldr	x4, [x4,x0]
-	ldrb	w0, [x5,8]
-	cbz	w2, .L42
+	add	x5, x3, x0
+	ldr	x4, [x3, x0]
+	ldrb	w0, [x5, 8]
+	cbz	w2, .L54
 	add	x2, x4, x0, lsl 8
 	mov	w5, 96
-	str	w5, [x2,2056]
+	str	w5, [x2, 2056]
 	and	w5, w1, 255
-	str	w5, [x2,2052]
+	str	w5, [x2, 2052]
 	lsr	w5, w1, 8
-	str	w5, [x2,2052]
+	str	w5, [x2, 2052]
 	lsr	w5, w1, 16
-	str	w5, [x2,2052]
-	ldr	w2, [x3,76]
+	str	w5, [x2, 2052]
+	ldr	w2, [x3, 76]
 	add	w1, w1, w2
-.L42:
+.L54:
 	add	x0, x4, x0, lsl 8
 	mov	w2, 96
-	str	w2, [x0,2056]
+	str	w2, [x0, 2056]
 	and	w2, w1, 255
-	str	w2, [x0,2052]
+	str	w2, [x0, 2052]
 	lsr	w2, w1, 8
-	str	w2, [x0,2052]
+	str	w2, [x0, 2052]
 	lsr	w1, w1, 16
-	str	w1, [x0,2052]
+	str	w1, [x0, 2052]
 	mov	w1, 208
-	str	w1, [x0,2056]
+	str	w1, [x0, 2056]
 	ret
 	.size	FlashEraseCmd, .-FlashEraseCmd
 	.align	2
 	.global	FlashProgDpSecondCmd
 	.type	FlashProgDpSecondCmd, %function
 FlashProgDpSecondCmd:
-	adrp	x2, .LANCHOR0
-	uxtb	w0, w0
-	add	x2, x2, :lo12:.LANCHOR0
-	sbfiz	x4, x0, 4, 32
-	add	x5, x2, 8
-	lsr	w3, w1, 16
-	add	x7, x5, x4
+	and	w0, w0, 255
+	adrp	x4, .LANCHOR0
+	sbfiz	x5, x0, 4, 32
+	add	x4, x4, :lo12:.LANCHOR0
+	add	x2, x4, x5
 	stp	x29, x30, [sp, -16]!
+	lsr	w3, w1, 16
 	add	x29, sp, 0
-	ldrb	w6, [x2,107]
-	ldrb	w2, [x7,8]
-	ldr	x4, [x5,x4]
+	ldrb	w6, [x4, 107]
+	ldrb	w2, [x2, 8]
+	ldr	x4, [x4, x5]
 	add	x2, x4, x2, lsl 8
 	and	w4, w1, 255
-	str	w6, [x2,2056]
-	str	wzr, [x2,2052]
-	str	wzr, [x2,2052]
-	str	w4, [x2,2052]
+	str	w6, [x2, 2056]
+	str	wzr, [x2, 2052]
+	str	wzr, [x2, 2052]
+	str	w4, [x2, 2052]
 	lsr	w4, w1, 8
-	str	w4, [x2,2052]
-	str	w3, [x2,2052]
+	str	w4, [x2, 2052]
+	str	w3, [x2, 2052]
 	bl	FlashSetRandomizer
 	ldp	x29, x30, [sp], 16
 	ret
@@ -380,24 +373,23 @@ FlashProgDpSecondCmd:
 	.global	FlashProgSecondCmd
 	.type	FlashProgSecondCmd, %function
 FlashProgSecondCmd:
-	adrp	x1, .LANCHOR0
-	ubfiz	x0, x0, 4, 8
 	stp	x29, x30, [sp, -32]!
+	ubfiz	x0, x0, 4, 8
+	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
-	add	x1, x1, 8
 	add	x29, sp, 0
 	add	x2, x1, x0
-	stp	x19, x20, [sp,16]
-	ldrb	w19, [x2,8]
-	ldr	x20, [x1,x0]
+	stp	x19, x20, [sp, 16]
+	ldr	x20, [x1, x0]
 	mov	x0, 36284
-	add	x19, x19, 8
+	ldrb	w19, [x2, 8]
 	movk	x0, 0x6, lsl 16
-	add	x19, x20, x19, lsl 8
 	bl	__const_udelay
+	add	x19, x19, 8
 	mov	w0, 16
-	str	w0, [x19,8]
-	ldp	x19, x20, [sp,16]
+	add	x19, x20, x19, lsl 8
+	str	w0, [x19, 8]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	FlashProgSecondCmd, .-FlashProgSecondCmd
@@ -405,40 +397,38 @@ FlashProgSecondCmd:
 	.global	FlashProgDpFirstCmd
 	.type	FlashProgDpFirstCmd, %function
 FlashProgDpFirstCmd:
-	adrp	x1, .LANCHOR0
 	ubfiz	x0, x0, 4, 8
+	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
-	add	x2, x1, 8
-	add	x3, x2, x0
-	ldrb	w1, [x1,106]
-	ldr	x2, [x2,x0]
-	ldrb	w0, [x3,8]
+	add	x3, x1, x0
+	ldr	x2, [x1, x0]
+	ldrb	w0, [x3, 8]
+	ldrb	w1, [x1, 106]
 	add	x0, x0, 8
 	add	x0, x2, x0, lsl 8
-	str	w1, [x0,8]
+	str	w1, [x0, 8]
 	ret
 	.size	FlashProgDpFirstCmd, .-FlashProgDpFirstCmd
 	.align	2
 	.global	FlashReadStatus
 	.type	FlashReadStatus, %function
 FlashReadStatus:
-	adrp	x1, .LANCHOR0
-	ubfiz	x0, x0, 4, 8
 	stp	x29, x30, [sp, -32]!
+	ubfiz	x0, x0, 4, 8
+	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
-	add	x1, x1, 8
 	add	x29, sp, 0
 	add	x2, x1, x0
-	str	x19, [sp,16]
-	ldrb	w2, [x2,8]
-	ldr	x19, [x1,x0]
+	str	x19, [sp, 16]
+	ldr	x0, [x1, x0]
+	ldrb	w19, [x2, 8]
+	add	x19, x0, x19, lsl 8
 	mov	w0, 112
-	add	x19, x19, x2, lsl 8
-	str	w0, [x19,2056]
+	str	w0, [x19, 2056]
 	mov	x0, 400
 	bl	__const_udelay
-	ldr	w0, [x19,2048]
-	ldr	x19, [sp,16]
+	ldr	w0, [x19, 2048]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	FlashReadStatus, .-FlashReadStatus
@@ -446,22 +436,22 @@ FlashReadStatus:
 	.global	js_hash
 	.type	js_hash, %function
 js_hash:
-	mov	x5, x0
+	mov	x4, x0
 	mov	w0, 42982
-	mov	x2, 0
+	mov	x3, 0
 	movk	w0, 0x47c6, lsl 16
-.L51:
-	cmp	w1, w2
-	bls	.L53
-	lsl	w3, w0, 5
-	ldrb	w4, [x5,x2]
-	add	w3, w3, w0, lsr 2
-	add	x2, x2, 1
-	add	w3, w3, w4
-	eor	w0, w0, w3
-	b	.L51
-.L53:
+.L66:
+	cmp	w1, w3
+	bhi	.L67
 	ret
+.L67:
+	lsr	w2, w0, 2
+	ldrb	w5, [x4, x3]
+	add	w2, w2, w0, lsl 5
+	add	x3, x3, 1
+	add	w2, w2, w5
+	eor	w0, w0, w2
+	b	.L66
 	.size	js_hash, .-js_hash
 	.align	2
 	.global	FlashLoadIdbInfo
@@ -480,105 +470,104 @@ FlashPrintInfo:
 	.global	ToshibaSetRRPara
 	.type	ToshibaSetRRPara, %function
 ToshibaSetRRPara:
-	uxtb	w1, w1
-	mov	w3, 5
+	stp	x29, x30, [sp, -80]!
+	and	w1, w1, 255
 	add	w2, w1, 1
-	stp	x29, x30, [sp, -96]!
-	smull	x3, w2, w3
-	adrp	x2, .LANCHOR1
 	add	x29, sp, 0
-	add	x2, x2, :lo12:.LANCHOR1
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	add	x23, x2, w1, sxtw
-	add	x24, x2, 256
-	add	x21, x2, 304
-	stp	x19, x20, [sp,16]
-	stp	x25, x26, [sp,64]
-	str	x27, [sp,80]
-	mov	x22, x0
-	add	x24, x24, x3
-	add	x21, x21, x3
+	stp	x21, x22, [sp, 32]
+	mov	x21, x0
+	mov	w0, 5
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	adrp	x22, .LANCHOR0
+	umull	x2, w2, w0
+	adrp	x0, .LANCHOR1
+	add	x0, x0, :lo12:.LANCHOR1
+	stp	x19, x20, [sp, 16]
+	add	x25, x0, 256
+	add	x24, x0, 352
+	add	x25, x25, x2
+	add	x24, x24, x2
+	add	x22, x22, :lo12:.LANCHOR0
+	mov	x19, x0
+	add	x23, x0, w1, sxtw
 	mov	x20, 0
-	adrp	x26, .LANCHOR0
-	mov	w27, 85
-	mov	x19, x2
-.L57:
-	add	x25, x26, :lo12:.LANCHOR0
-	ldrb	w0, [x25,129]
+	mov	w26, 85
+.L71:
+	ldrb	w0, [x22, 129]
 	cmp	w0, w20
-	bls	.L63
-	add	x0, x19, 256
-	str	w27, [x22,8]
-	ldrsb	w0, [x20,x0]
-	str	w0, [x22,4]
+	bhi	.L75
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	ret
+.L75:
+	add	x0, x19, 352
+	str	w26, [x21, 8]
+	ldrsb	w0, [x20, x0]
+	str	w0, [x21, 4]
 	mov	x0, 1000
 	bl	__const_udelay
-	ldrb	w0, [x25,128]
+	ldrb	w0, [x22, 128]
 	cmp	w0, 34
-	bne	.L58
-	ldrsb	w0, [x24,x20]
-	b	.L62
-.L58:
-	cmp	w0, 35
-	bne	.L60
-	ldrsb	w0, [x21,x20]
-	b	.L62
-.L60:
-	ldrsb	w0, [x23,400]
-.L62:
-	str	w0, [x22]
+	bne	.L72
+	ldrsb	w0, [x24, x20]
+.L77:
 	add	x20, x20, 1
-	b	.L57
-.L63:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldr	x27, [sp,80]
-	ldp	x29, x30, [sp], 96
-	ret
+	str	w0, [x21]
+	b	.L71
+.L72:
+	cmp	w0, 35
+	bne	.L74
+	ldrsb	w0, [x25, x20]
+	b	.L77
+.L74:
+	ldrsb	w0, [x23, 400]
+	b	.L77
 	.size	ToshibaSetRRPara, .-ToshibaSetRRPara
 	.align	2
 	.global	SamsungSetRRPara
 	.type	SamsungSetRRPara, %function
 SamsungSetRRPara:
 	stp	x29, x30, [sp, -64]!
-	adrp	x2, .LANCHOR1
-	add	x2, x2, :lo12:.LANCHOR1
 	add	x29, sp, 0
-	add	x1, x2, w1, uxtb 2
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	mov	x21, x0
-	add	x22, x1, 412
-	mov	x20, 0
+	stp	x21, x22, [sp, 32]
+	mov	x22, x0
+	ubfiz	x21, x1, 2, 8
+	adrp	x0, .LANCHOR1
+	add	x0, x0, :lo12:.LANCHOR1
+	add	x21, x21, 4
+	add	x0, x0, 408
+	stp	x19, x20, [sp, 16]
+	stp	x23, x24, [sp, 48]
+	add	x21, x0, x21
 	adrp	x23, .LANCHOR0
+	mov	x19, x0
+	add	x23, x23, :lo12:.LANCHOR0
+	mov	x20, 0
 	mov	w24, 161
-	mov	x19, x2
-.L65:
-	add	x0, x23, :lo12:.LANCHOR0
-	ldrb	w0, [x0,129]
+.L79:
+	ldrb	w0, [x23, 129]
 	cmp	w0, w20
-	bls	.L67
-	str	w24, [x21,8]
-	add	x0, x19, 408
-	str	wzr, [x21]
-	ldrsb	w0, [x20,x0]
-	str	w0, [x21]
-	ldrsb	w0, [x22,x20]
+	bhi	.L80
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 64
+	ret
+.L80:
+	str	w24, [x22, 8]
+	str	wzr, [x22]
+	ldrsb	w0, [x20, x19]
+	str	w0, [x22]
+	ldrsb	w0, [x21, x20]
 	add	x20, x20, 1
-	str	w0, [x21]
+	str	w0, [x22]
 	mov	x0, 1500
 	bl	__const_udelay
-	b	.L65
-.L67:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 64
-	ret
+	b	.L79
 	.size	SamsungSetRRPara, .-SamsungSetRRPara
 	.align	2
 	.global	ftl_flash_suspend
@@ -586,72 +575,73 @@ SamsungSetRRPara:
 ftl_flash_suspend:
 	adrp	x0, .LANCHOR0
 	add	x0, x0, :lo12:.LANCHOR0
-	ldr	x1, [x0,136]
+	ldr	x1, [x0, 136]
 	ldr	w2, [x1]
-	str	w2, [x0,144]
-	ldr	w2, [x1,4]
-	str	w2, [x0,148]
-	ldr	w2, [x1,8]
-	str	w2, [x0,152]
-	ldr	w2, [x1,12]
-	str	w2, [x0,156]
-	ldr	w2, [x1,304]
-	str	w2, [x0,160]
-	ldr	w2, [x1,308]
-	str	w2, [x0,164]
-	ldr	w2, [x1,336]
-	ldr	w1, [x1,344]
-	str	w2, [x0,168]
-	str	w1, [x0,172]
+	str	w2, [x0, 144]
+	ldr	w2, [x1, 4]
+	str	w2, [x0, 148]
+	ldr	w2, [x1, 8]
+	str	w2, [x0, 152]
+	ldr	w2, [x1, 12]
+	str	w2, [x0, 156]
+	ldr	w2, [x1, 304]
+	str	w2, [x0, 160]
+	ldr	w2, [x1, 308]
+	str	w2, [x0, 164]
+	ldr	w2, [x1, 336]
+	ldr	w1, [x1, 344]
+	stp	w2, w1, [x0, 168]
 	ret
 	.size	ftl_flash_suspend, .-ftl_flash_suspend
 	.align	2
 	.global	LogAddr2PhyAddr
 	.type	LogAddr2PhyAddr, %function
 LogAddr2PhyAddr:
-	adrp	x7, .LANCHOR0
-	uxtb	w4, w4
-	add	x6, x7, :lo12:.LANCHOR0
-	ldrh	w8, [x6,190]
-	ldrh	w5, [x6,188]
-	ldrh	w9, [x6,76]
-	ldrb	w6, [x6,72]
-	mul	w5, w5, w8
-	cmp	w6, 1
-	ubfiz	w8, w9, 1, 15
-	csel	w9, w8, w9, eq
-	ldr	w8, [x0,4]
-	uxth	w5, w5
+	adrp	x6, .LANCHOR0
+	add	x7, x6, :lo12:.LANCHOR0
+	and	w4, w4, 255
+	ldrh	w9, [x7, 188]
+	ldrh	w5, [x7, 190]
+	ldrh	w8, [x7, 76]
+	ldrb	w7, [x7, 72]
+	cmp	w7, 1
+	ldr	w7, [x0, 4]
+	mul	w5, w5, w9
+	ubfx	x11, x7, 10, 16
+	and	w9, w5, 65535
+	ubfiz	w5, w8, 1, 15
+	and	w7, w7, 1023
+	csel	w8, w5, w8, eq
 	cmp	w1, 1
-	ubfx	x6, x8, 10, 16
-	and	w8, w8, 1023
-	udiv	w10, w6, w5
-	msub	w5, w10, w5, w6
-	uxth	w6, w5
-	bne	.L71
-	add	x1, x7, :lo12:.LANCHOR0
-	ldrb	w5, [x1,204]
-	cbnz	w5, .L71
+	udiv	w5, w11, w9
+	and	w10, w5, 65535
+	msub	w5, w5, w9, w11
+	and	w5, w5, 65535
+	bne	.L85
+	add	x1, x6, :lo12:.LANCHOR0
+	ldrb	w9, [x1, 204]
+	cbnz	w9, .L85
 	add	x1, x1, 208
-	ldrh	w8, [x1,w8,sxtw 1]
-.L71:
-	add	x7, x7, :lo12:.LANCHOR0
+	ldrh	w7, [x1, w7, sxtw 1]
+.L85:
+	add	x6, x6, :lo12:.LANCHOR0
+	uxtw	x1, w10
+	add	x6, x6, 1232
 	cmp	w4, 1
-	add	x7, x7, 1232
-	mov	w1, 0
-	ldr	w5, [x7,w10,uxtw 2]
-	madd	w5, w6, w9, w5
-	add	w5, w5, w8
+	ldr	w1, [x6, x1, lsl 2]
+	madd	w5, w5, w8, w1
+	add	w5, w5, w7
 	str	w5, [x2]
 	str	w10, [x3]
-	bls	.L72
-	ldr	w1, [x0,4]
-	ldr	w0, [x0,60]
+	bls	.L87
+	ldr	w1, [x0, 4]
+	ldr	w0, [x0, 60]
 	add	w1, w1, 1024
 	cmp	w1, w0
-	cset	w1, eq
-.L72:
-	mov	w0, w1
+	cset	w0, eq
+	ret
+.L87:
+	mov	w0, 0
 	ret
 	.size	LogAddr2PhyAddr, .-LogAddr2PhyAddr
 	.align	2
@@ -659,61 +649,61 @@ LogAddr2PhyAddr:
 	.type	FlashReadStatusEN, %function
 FlashReadStatusEN:
 	stp	x29, x30, [sp, -32]!
-	adrp	x3, .LANCHOR0
 	ubfiz	x0, x0, 4, 8
-	add	x4, x3, :lo12:.LANCHOR0
+	adrp	x4, .LANCHOR0
+	add	x3, x4, :lo12:.LANCHOR0
 	add	x29, sp, 0
-	add	x5, x4, 8
-	stp	x19, x20, [sp,16]
-	add	x6, x5, x0
-	uxtb	w2, w2
-	ldr	x20, [x5,x0]
-	ldr	x0, [x4,88]
-	ldrb	w19, [x6,8]
-	ldrb	w0, [x0,8]
+	stp	x19, x20, [sp, 16]
+	add	x5, x3, x0
+	ldr	x20, [x3, x0]
+	ldr	x0, [x3, 88]
+	ldrb	w19, [x5, 8]
+	ldrb	w0, [x0, 8]
 	cmp	w0, 2
-	bne	.L75
-	add	x4, x4, 96
-	cbnz	w2, .L76
-	ldrb	w2, [x4,13]
-	b	.L84
-.L76:
-	ldrb	w2, [x4,14]
-.L84:
+	bne	.L89
+	and	w2, w2, 255
+	add	x3, x3, 96
+	cbnz	w2, .L90
+	ldrb	w2, [x3, 13]
+.L100:
 	add	x0, x19, 8
-	add	x3, x3, :lo12:.LANCHOR0
+	add	x4, x4, :lo12:.LANCHOR0
 	add	x0, x20, x0, lsl 8
-	str	w2, [x0,8]
-	mov	w2, 0
-	ldrb	w4, [x3,111]
-	cbz	w4, .L79
+	str	w2, [x0, 8]
+	ldrb	w4, [x4, 111]
+	cbz	w4, .L94
 	add	x3, x19, 8
-	lsl	x3, x3, 8
-.L83:
+	mov	w2, 0
+	add	x3, x20, x3, lsl 8
+.L93:
 	cmp	w2, w4
-	bcs	.L79
-	add	x5, x20, x3
-	lsl	w0, w2, 3
-	lsr	w0, w1, w0
-	add	w2, w2, 1
-	and	w0, w0, 255
-	str	w0, [x5,4]
-	b	.L83
-.L75:
-	add	x0, x19, 8
-	mov	w1, 112
-	add	x0, x20, x0, lsl 8
-	str	w1, [x0,8]
-.L79:
+	bcc	.L95
+.L94:
 	add	x19, x19, 8
 	mov	x0, 400
 	lsl	x19, x19, 8
 	bl	__const_udelay
-	ldr	w0, [x20,x19]
-	ldp	x19, x20, [sp,16]
+	ldr	w0, [x20, x19]
+	ldp	x19, x20, [sp, 16]
+	and	w0, w0, 255
 	ldp	x29, x30, [sp], 32
-	uxtb	w0, w0
 	ret
+.L90:
+	ldrb	w2, [x3, 14]
+	b	.L100
+.L95:
+	lsl	w0, w2, 3
+	add	w2, w2, 1
+	lsr	w0, w1, w0
+	and	w0, w0, 255
+	str	w0, [x3, 4]
+	b	.L93
+.L89:
+	add	x0, x19, 8
+	mov	w1, 112
+	add	x0, x20, x0, lsl 8
+	str	w1, [x0, 8]
+	b	.L94
 	.size	FlashReadStatusEN, .-FlashReadStatusEN
 	.align	2
 	.global	FlashWaitReadyEN
@@ -721,27 +711,27 @@ FlashReadStatusEN:
 FlashWaitReadyEN:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	str	x21, [sp,32]
-	uxtb	w19, w0
+	stp	x19, x20, [sp, 16]
+	and	w19, w0, 255
+	str	x21, [sp, 32]
 	mov	w20, w1
-	uxtb	w21, w2
-.L86:
-	mov	w0, w19
+	and	w21, w2, 255
+.L102:
 	mov	w1, w20
 	mov	w2, w21
+	mov	w0, w19
 	bl	FlashReadStatusEN
+	mov	w1, w0
 	cmp	w0, 255
-	mov	w3, w0
-	beq	.L86
-	tbnz	x3, 6, .L87
-	mov	x0, 1
+	beq	.L102
+	tbnz	x1, 6, .L101
 	mov	x1, 3
+	mov	x0, 1
 	bl	usleep_range
-	b	.L86
-.L87:
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
+	b	.L102
+.L101:
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	FlashWaitReadyEN, .-FlashWaitReadyEN
@@ -751,8 +741,8 @@ FlashWaitReadyEN:
 FlashScheduleEnSet:
 	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
-	ldr	w2, [x1,1264]
-	str	w0, [x1,1264]
+	ldr	w2, [x1, 1264]
+	str	w0, [x1, 1264]
 	mov	w0, w2
 	ret
 	.size	FlashScheduleEnSet, .-FlashScheduleEnSet
@@ -761,8 +751,8 @@ FlashScheduleEnSet:
 	.type	FlashGetPageSize, %function
 FlashGetPageSize:
 	adrp	x0, .LANCHOR0+88
-	ldr	x0, [x0,#:lo12:.LANCHOR0+88]
-	ldrb	w0, [x0,9]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+88]
+	ldrb	w0, [x0, 9]
 	ret
 	.size	FlashGetPageSize, .-FlashGetPageSize
 	.align	2
@@ -775,13 +765,12 @@ NandcReadDontCaseBusyEn:
 	.global	NandcGetChipIf
 	.type	NandcGetChipIf, %function
 NandcGetChipIf:
-	adrp	x1, .LANCHOR0
 	ubfiz	x0, x0, 4, 8
+	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
-	add	x1, x1, 8
 	add	x2, x1, x0
-	ldr	x0, [x1,x0]
-	ldrb	w2, [x2,8]
+	ldr	x0, [x1, x0]
+	ldrb	w2, [x2, 8]
 	add	x2, x2, 8
 	add	x0, x0, x2, lsl 8
 	ret
@@ -791,12 +780,12 @@ NandcGetChipIf:
 	.type	NandcSetDdrPara, %function
 NandcSetDdrPara:
 	adrp	x1, .LANCHOR0+136
-	uxtb	w0, w0
+	and	w0, w0, 255
 	lsl	w2, w0, 8
+	ldr	x1, [x1, #:lo12:.LANCHOR0+136]
 	orr	w0, w2, w0, lsl 16
-	ldr	x1, [x1,#:lo12:.LANCHOR0+136]
 	orr	w0, w0, 1
-	str	w0, [x1,304]
+	str	w0, [x1, 304]
 	ret
 	.size	NandcSetDdrPara, .-NandcSetDdrPara
 	.align	2
@@ -804,11 +793,11 @@ NandcSetDdrPara:
 	.type	NandcSetDdrDiv, %function
 NandcSetDdrDiv:
 	adrp	x1, .LANCHOR0+136
-	uxtb	w0, w0
-	ldr	x2, [x1,#:lo12:.LANCHOR0+136]
-	mov	w1, 16640
-	orr	w0, w0, w1
-	str	w0, [x2,344]
+	and	w0, w0, 255
+	mov	w2, 16640
+	orr	w0, w0, w2
+	ldr	x1, [x1, #:lo12:.LANCHOR0+136]
+	str	w0, [x1, 344]
 	ret
 	.size	NandcSetDdrDiv, .-NandcSetDdrDiv
 	.align	2
@@ -816,8 +805,8 @@ NandcSetDdrDiv:
 	.type	NandcSetDdrMode, %function
 NandcSetDdrMode:
 	adrp	x1, .LANCHOR0+136
-	cmp	w0, wzr
-	ldr	x2, [x1,#:lo12:.LANCHOR0+136]
+	cmp	w0, 0
+	ldr	x2, [x1, #:lo12:.LANCHOR0+136]
 	ldr	w1, [x2]
 	and	w3, w1, -8193
 	orr	w1, w1, 253952
@@ -830,47 +819,45 @@ NandcSetDdrMode:
 	.type	NandcSetMode, %function
 NandcSetMode:
 	adrp	x1, .LANCHOR0+136
-	uxtb	w0, w0
+	and	w0, w0, 255
 	tst	w0, 6
-	ldr	x2, [x1,#:lo12:.LANCHOR0+136]
+	ldr	x2, [x1, #:lo12:.LANCHOR0+136]
 	ldr	w1, [x2]
-	beq	.L101
-	and	w0, w0, 4
+	beq	.L118
 	orr	w1, w1, 24576
-	cmp	w0, wzr
-	mov	w0, 8322
+	tst	x0, 4
 	and	w1, w1, -32769
-	str	w0, [x2,344]
-	mov	w0, 4099
+	mov	w0, 8322
 	orr	w1, w1, 196608
-	movk	w0, 0x10, lsl 16
-	str	w0, [x2,304]
+	str	w0, [x2, 344]
+	mov	w0, 4099
 	orr	w3, w1, 32768
-	mov	w0, 38
-	str	w0, [x2,308]
+	movk	w0, 0x10, lsl 16
+	str	w0, [x2, 304]
 	csel	w1, w3, w1, ne
+	mov	w0, 38
+	str	w0, [x2, 308]
 	mov	w0, 39
-	str	w0, [x2,308]
-	b	.L103
-.L101:
-	and	w1, w1, -8193
-.L103:
-	str	w1, [x2]
+	str	w0, [x2, 308]
+.L120:
 	mov	w0, 0
+	str	w1, [x2]
 	ret
+.L118:
+	and	w1, w1, -8193
+	b	.L120
 	.size	NandcSetMode, .-NandcSetMode
 	.align	2
 	.global	NandcFlashCs
 	.type	NandcFlashCs, %function
 NandcFlashCs:
-	adrp	x1, .LANCHOR0
 	ubfiz	x0, x0, 4, 8
+	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
-	add	x1, x1, 8
 	add	x3, x1, x0
-	ldr	x2, [x1,x0]
+	ldr	x2, [x1, x0]
 	mov	w1, 1
-	ldrb	w3, [x3,8]
+	ldrb	w3, [x3, 8]
 	ldr	w0, [x2]
 	lsl	w1, w1, w3
 	bfi	w0, w1, 0, 8
@@ -881,11 +868,10 @@ NandcFlashCs:
 	.global	NandcFlashDeCs
 	.type	NandcFlashDeCs, %function
 NandcFlashDeCs:
-	adrp	x1, .LANCHOR0
 	ubfiz	x0, x0, 4, 8
+	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
-	add	x1, x1, 8
-	ldr	x1, [x1,x0]
+	ldr	x1, [x1, x0]
 	ldr	w0, [x1]
 	and	w0, w0, -256
 	and	w0, w0, -131073
@@ -898,89 +884,92 @@ NandcFlashDeCs:
 HynixSetRRPara:
 	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR0
-	str	x27, [sp,80]
-	add	x19, x20, :lo12:.LANCHOR0
-	uxtb	w27, w1
-	stp	x25, x26, [sp,64]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	uxtb	x24, w0
+	stp	x23, x24, [sp, 48]
+	and	w23, w0, 255
+	add	x0, x20, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	str	x27, [sp, 80]
+	and	w27, w1, 255
+	stp	x25, x26, [sp, 64]
 	mov	x21, x2
-	ldr	x0, [x19,88]
-	mov	x26, x24
-	uxtb	w25, w3
-	ldrb	w0, [x0,19]
-	cmp	w0, 6
-	bne	.L109
-	add	x19, x19, x24, lsl 6
-	lsl	w4, w25, 2
-	add	x19, x19, 1292
-	b	.L115
-.L109:
-	cmp	w0, 7
-	bne	.L111
-	mov	x2, 160
-	mov	w4, 10
-	madd	x19, x24, x2, x19
-	mul	w4, w25, w4
-	add	x19, x19, 1300
-.L115:
-	add	x19, x19, w4, sxtw
-	b	.L110
-.L111:
-	cmp	w0, 8
-	bne	.L112
-	add	x19, x19, 1300
-	add	w4, w25, w25, lsl 2
-	b	.L115
-.L112:
-	lsl	x4, x24, 3
-	add	x4, x4, w25, sxtw
-	add	x19, x19, x4, lsl 3
-	add	x19, x19, 1292
-.L110:
-	add	x2, x20, :lo12:.LANCHOR0
-	lsl	x0, x24, 4
-	add	x2, x2, 8
-	uxtb	x27, w27
-	add	x1, x2, x0
-	ldr	x22, [x2,x0]
-	mov	w0, w26
-	ldrb	w23, [x1,8]
+	and	w22, w3, 255
+	ldr	x1, [x0, 88]
+	ldrb	w1, [x1, 19]
+	cmp	w1, 6
+	bne	.L126
+	ubfiz	x19, x23, 6, 8
+	add	x0, x0, 1272
+	add	x19, x19, 20
+	add	x19, x19, w22, uxtw 2
+.L133:
+	add	x19, x0, x19
+.L127:
+	sxtw	x26, w23
+	add	x0, x20, :lo12:.LANCHOR0
+	lsl	x1, x26, 4
+	and	x27, x27, 255
+	add	x2, x0, x1
+	mov	x25, 0
+	ldr	x24, [x0, x1]
+	mov	w0, w23
+	ldrb	w5, [x2, 8]
 	bl	NandcFlashCs
-	ubfiz	x23, x23, 8, 8
+	ubfiz	x5, x5, 8, 8
+	add	x24, x24, x5
 	mov	w0, 54
-	add	x22, x22, x23
-	mov	x23, 0
-	str	w0, [x22,2056]
-.L113:
-	cmp	x23, x27
-	beq	.L116
-	ldrb	w0, [x21,x23]
-	str	w0, [x22,2052]
-	mov	x0, 1000
-	bl	__const_udelay
-	ldrsb	w0, [x19,x23]
-	add	x23, x23, 1
-	str	w0, [x22,2048]
-	b	.L113
-.L116:
+	str	w0, [x24, 2056]
+.L130:
+	cmp	x25, x27
+	bne	.L131
 	add	x20, x20, :lo12:.LANCHOR0
 	mov	w0, 22
-	add	x24, x20, x24
-	str	w0, [x22,2056]
-	mov	w0, w26
+	add	x20, x20, x26
+	str	w0, [x24, 2056]
+	mov	w0, w23
 	bl	NandcFlashDeCs
-	strb	w25, [x24,2128]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldr	x27, [sp,80]
+	strb	w22, [x20, 2128]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldr	x27, [sp, 80]
 	ldp	x29, x30, [sp], 96
 	ret
+.L126:
+	cmp	w1, 7
+	bne	.L128
+	mov	w19, 160
+	mov	x1, 28
+	add	x0, x0, 1272
+	umaddl	x1, w19, w23, x1
+	mov	w19, 10
+	umaddl	x19, w22, w19, x1
+	b	.L133
+.L128:
+	cmp	w1, 8
+	bne	.L129
+	add	x0, x0, 1300
+	add	w19, w22, w22, lsl 2
+	add	x19, x0, w19, sxtw
+	b	.L127
+.L129:
+	and	x19, x22, 255
+	add	x19, x19, 2
+	add	x19, x19, w23, uxtw 3
+	add	x19, x0, x19, lsl 3
+	add	x19, x19, 1276
+	b	.L127
+.L131:
+	ldrb	w0, [x21, x25]
+	str	w0, [x24, 2052]
+	mov	x0, 1000
+	bl	__const_udelay
+	ldrsb	w0, [x19, x25]
+	add	x25, x25, 1
+	str	w0, [x24, 2048]
+	b	.L130
 	.size	HynixSetRRPara, .-HynixSetRRPara
 	.align	2
 	.global	FlashSetReadRetryDefault
@@ -988,36 +977,36 @@ HynixSetRRPara:
 FlashSetReadRetryDefault:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR0
-	mov	x20, 0
 	add	x19, x19, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	ldr	x0, [x19,88]
-	ldrb	w0, [x0,19]
+	stp	x21, x22, [sp, 32]
+	ldr	x0, [x19, 88]
+	ldrb	w0, [x0, 19]
 	sub	w0, w0, #1
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 7
-	bhi	.L117
+	bhi	.L134
 	add	x21, x19, 2132
 	add	x22, x19, 1276
-.L122:
+	mov	x20, 0
+.L137:
 	lsl	x1, x20, 3
-	uxtb	w0, w20
-	ldrb	w1, [x1,x21]
+	and	w0, w20, 255
+	ldrb	w1, [x1, x21]
 	cmp	w1, 173
-	bne	.L119
-	ldrb	w1, [x19,1273]
-	mov	x2, x22
+	bne	.L136
+	ldrb	w1, [x19, 1273]
 	mov	w3, 0
+	mov	x2, x22
 	bl	HynixSetRRPara
-.L119:
+.L136:
 	add	x20, x20, 1
 	cmp	x20, 4
-	bne	.L122
-.L117:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
+	bne	.L137
+.L134:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	FlashSetReadRetryDefault, .-FlashSetReadRetryDefault
@@ -1025,46 +1014,43 @@ FlashSetReadRetryDefault:
 	.global	FlashWaitCmdDone
 	.type	FlashWaitCmdDone, %function
 FlashWaitCmdDone:
-	stp	x29, x30, [sp, -48]!
-	uxtb	x1, w0
-	mov	x2, 24
+	and	x5, x0, 255
+	mov	x0, 24
+	stp	x29, x30, [sp, -32]!
+	adrp	x4, .LANCHOR0
+	add	x4, x4, :lo12:.LANCHOR0
+	mul	x0, x5, x0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR0
-	stp	x21, x22, [sp,32]
-	add	x20, x20, :lo12:.LANCHOR0
-	mov	x22, x1
-	mul	x1, x1, x2
-	add	x0, x20, 2164
-	add	x19, x0, x1
-	ldrb	w21, [x0,x1]
-	ldr	x0, [x19,8]
-	cbz	x0, .L126
-	mov	w0, w21
-	add	x20, x20, 1232
+	add	x1, x4, 2164
+	stp	x19, x20, [sp, 16]
+	add	x19, x1, x0
+	ldr	x2, [x19, 8]
+	cbz	x2, .L143
+	ldrb	w20, [x1, x0]
+	mov	w0, w20
 	bl	NandcFlashCs
-	ldr	w0, [x20,w22,sxtw 2]
-	ldr	w1, [x19,4]
-	cmp	w0, wzr
-	mov	w0, w21
+	add	x4, x4, 1232
+	ldr	w1, [x19, 4]
+	ldr	w0, [x4, x5, lsl 2]
+	cmp	w0, 0
+	mov	w0, w20
 	cset	w2, ne
 	bl	FlashWaitReadyEN
-	mov	w20, w0
-	mov	w0, w21
+	mov	w2, w0
+	mov	w0, w20
 	bl	NandcFlashDeCs
-	ldr	x1, [x19,8]
-	sbfx	x0, x20, 0, 1
+	sbfx	x0, x2, 0, 1
+	ldr	x1, [x19, 8]
 	str	w0, [x1]
-	str	xzr, [x19,8]
-	ldr	x1, [x19,16]
-	cbz	x1, .L126
+	str	xzr, [x19, 8]
+	ldr	x1, [x19, 16]
+	cbz	x1, .L143
 	str	w0, [x1]
-	str	xzr, [x19,16]
-.L126:
+	str	xzr, [x19, 16]
+.L143:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 48
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
 	ret
 	.size	FlashWaitCmdDone, .-FlashWaitCmdDone
 	.align	2
@@ -1084,97 +1070,92 @@ NandcDelayns:
 	.type	NandcWaitFlashReadyNoDelay, %function
 NandcWaitFlashReadyNoDelay:
 	stp	x29, x30, [sp, -48]!
-	adrp	x1, .LANCHOR0
 	ubfiz	x0, x0, 4, 8
+	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
 	add	x29, sp, 0
-	add	x1, x1, 8
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	w19, 34464
-	ldr	x20, [x1,x0]
 	movk	w19, 0x1, lsl 16
-.L134:
+	ldr	x20, [x1, x0]
+.L153:
 	ldr	w0, [x20]
-	str	w0, [x29,40]
-	ldr	w0, [x29,40]
-	tbnz	x0, 9, .L135
+	str	w0, [x29, 40]
+	ldr	w0, [x29, 40]
+	tbnz	x0, 9, .L154
 	mov	x0, 50
 	bl	__const_udelay
 	subs	w19, w19, #1
-	bne	.L134
+	bne	.L153
 	mov	w0, -1
-	b	.L133
-.L135:
-	mov	w0, 0
-.L133:
-	ldp	x19, x20, [sp,16]
+.L151:
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
+.L154:
+	mov	w0, 0
+	b	.L151
 	.size	NandcWaitFlashReadyNoDelay, .-NandcWaitFlashReadyNoDelay
 	.align	2
 	.global	NandcWaitFlashReady
 	.type	NandcWaitFlashReady, %function
 NandcWaitFlashReady:
 	stp	x29, x30, [sp, -48]!
-	adrp	x1, .LANCHOR0
 	ubfiz	x0, x0, 4, 8
+	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
 	add	x29, sp, 0
-	add	x1, x1, 8
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	w19, 34464
-	ldr	x20, [x1,x0]
 	movk	w19, 0x1, lsl 16
+	ldr	x20, [x1, x0]
 	mov	x0, 650
 	bl	__const_udelay
-.L139:
+.L159:
 	ldr	w0, [x20]
-	str	w0, [x29,40]
-	ldr	w0, [x29,40]
-	tbnz	x0, 9, .L140
-	mov	x0, 1
+	str	w0, [x29, 40]
+	ldr	w0, [x29, 40]
+	tbnz	x0, 9, .L160
 	mov	x1, 2
+	mov	x0, 1
 	bl	usleep_range
 	subs	w19, w19, #1
-	bne	.L139
+	bne	.L159
 	mov	w0, -1
-	b	.L138
-.L140:
-	mov	w0, 0
-.L138:
-	ldp	x19, x20, [sp,16]
+.L157:
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
+.L160:
+	mov	w0, 0
+	b	.L157
 	.size	NandcWaitFlashReady, .-NandcWaitFlashReady
 	.align	2
 	.global	FlashReset
 	.type	FlashReset, %function
 FlashReset:
-	stp	x29, x30, [sp, -48]!
-	adrp	x1, .LANCHOR0
+	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	add	x1, x1, :lo12:.LANCHOR0
-	uxtb	w20, w0
-	add	x1, x1, 8
-	sbfiz	x0, x20, 4, 32
-	add	x2, x1, x0
-	str	x21, [sp,32]
-	ldr	x21, [x1,x0]
-	mov	w0, w20
-	ldrb	w19, [x2,8]
+	str	x19, [sp, 16]
+	and	w19, w0, 255
+	sbfiz	x1, x19, 4, 32
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	add	x2, x0, x1
+	ldr	x5, [x0, x1]
+	mov	w0, w19
+	ldrb	w4, [x2, 8]
 	bl	NandcFlashCs
-	add	x19, x19, 8
+	add	x4, x4, 8
+	add	x4, x5, x4, lsl 8
 	mov	w0, 255
-	add	x19, x21, x19, lsl 8
-	str	w0, [x19,8]
-	mov	w0, w20
+	str	w0, [x4, 8]
+	mov	w0, w19
 	bl	NandcWaitFlashReady
-	mov	w0, w20
+	mov	w0, w19
 	bl	NandcFlashDeCs
-	ldr	x21, [sp,32]
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 48
+	ldr	x19, [sp, 16]
+	ldp	x29, x30, [sp], 32
 	ret
 	.size	FlashReset, .-FlashReset
 	.align	2
@@ -1183,57 +1164,56 @@ FlashReset:
 flash_enter_slc_mode:
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	adrp	x21, .LANCHOR0
-	str	x23, [sp,48]
-	stp	x19, x20, [sp,16]
-	add	x20, x21, :lo12:.LANCHOR0
-	uxtb	w22, w0
-	ldrb	w0, [x20,204]
-	cbz	w0, .L143
+	add	x4, x21, :lo12:.LANCHOR0
+	stp	x19, x20, [sp, 16]
+	str	x23, [sp, 48]
+	and	w22, w0, 255
+	ldrb	w0, [x4, 204]
+	cbz	w0, .L165
 	mov	w0, w22
 	bl	NandcFlashCs
-	sxtw	x1, w22
-	add	x2, x20, 8
-	lsl	x0, x1, 4
-	add	x1, x20, x1, lsl 3
-	add	x3, x2, x0
-	ldr	x23, [x2,x0]
-	ldrb	w0, [x1,2132]
-	ldrb	w19, [x3,8]
+	sxtw	x0, w22
+	lsl	x1, x0, 4
+	add	x0, x4, x0, lsl 3
+	add	x2, x4, x1
+	ldrb	w0, [x0, 2132]
+	ldr	x23, [x4, x1]
+	ldrb	w19, [x2, 8]
 	cmp	w0, 44
-	bne	.L145
+	bne	.L167
 	ubfiz	x20, x19, 8, 8
 	mov	w0, 239
 	add	x20, x23, x20
-	str	w0, [x20,2056]
+	str	w0, [x20, 2056]
 	mov	w0, 145
-	str	w0, [x20,2052]
+	str	w0, [x20, 2052]
 	mov	x0, 250
 	bl	__const_udelay
-	str	wzr, [x20,2048]
+	str	wzr, [x20, 2048]
 	mov	w0, 1
-	str	w0, [x20,2048]
-	str	wzr, [x20,2048]
+	str	w0, [x20, 2048]
+	str	wzr, [x20, 2048]
 	mov	x0, 500
-	str	wzr, [x20,2048]
+	str	wzr, [x20, 2048]
 	bl	__const_udelay
-.L145:
+.L167:
 	add	x19, x19, 8
 	mov	w0, w22
-	add	x21, x21, :lo12:.LANCHOR0
 	add	x19, x23, x19, lsl 8
 	bl	NandcWaitFlashReadyNoDelay
 	mov	w0, 218
-	str	w0, [x19,8]
+	add	x21, x21, :lo12:.LANCHOR0
+	str	w0, [x19, 8]
 	mov	w0, w22
 	bl	NandcWaitFlashReady
 	mov	w0, 2
-	strb	w0, [x21,2356]
-.L143:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldr	x23, [sp,48]
+	strb	w0, [x21, 2356]
+.L165:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldr	x23, [sp, 48]
 	ldp	x29, x30, [sp], 64
 	ret
 	.size	flash_enter_slc_mode, .-flash_enter_slc_mode
@@ -1243,57 +1223,56 @@ flash_enter_slc_mode:
 flash_exit_slc_mode:
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	adrp	x21, .LANCHOR0
-	str	x23, [sp,48]
-	stp	x19, x20, [sp,16]
-	add	x20, x21, :lo12:.LANCHOR0
-	uxtb	w22, w0
-	ldrb	w0, [x20,204]
-	cbz	w0, .L149
+	add	x4, x21, :lo12:.LANCHOR0
+	stp	x19, x20, [sp, 16]
+	str	x23, [sp, 48]
+	and	w22, w0, 255
+	ldrb	w0, [x4, 204]
+	cbz	w0, .L172
 	mov	w0, w22
 	bl	NandcFlashCs
-	sxtw	x1, w22
-	add	x2, x20, 8
-	lsl	x0, x1, 4
-	add	x1, x20, x1, lsl 3
-	add	x3, x2, x0
-	ldr	x23, [x2,x0]
-	ldrb	w0, [x1,2132]
-	ldrb	w19, [x3,8]
+	sxtw	x0, w22
+	lsl	x1, x0, 4
+	add	x0, x4, x0, lsl 3
+	add	x2, x4, x1
+	ldrb	w0, [x0, 2132]
+	ldr	x23, [x4, x1]
+	ldrb	w19, [x2, 8]
 	cmp	w0, 44
-	bne	.L151
+	bne	.L174
 	ubfiz	x20, x19, 8, 8
 	mov	w0, 239
 	add	x20, x23, x20
-	str	w0, [x20,2056]
+	str	w0, [x20, 2056]
 	mov	w0, 145
-	str	w0, [x20,2052]
+	str	w0, [x20, 2052]
 	mov	x0, 250
 	bl	__const_udelay
 	mov	w0, 2
-	str	w0, [x20,2048]
+	str	w0, [x20, 2048]
 	mov	w0, 1
-	str	w0, [x20,2048]
-	str	wzr, [x20,2048]
+	str	w0, [x20, 2048]
+	str	wzr, [x20, 2048]
 	mov	x0, 500
-	str	wzr, [x20,2048]
+	str	wzr, [x20, 2048]
 	bl	__const_udelay
-.L151:
+.L174:
 	add	x19, x19, 8
 	mov	w0, w22
-	add	x21, x21, :lo12:.LANCHOR0
 	add	x19, x23, x19, lsl 8
 	bl	NandcWaitFlashReadyNoDelay
+	add	x21, x21, :lo12:.LANCHOR0
 	mov	w0, 223
-	str	w0, [x19,8]
+	str	w0, [x19, 8]
 	mov	w0, w22
 	bl	NandcWaitFlashReady
-	strb	wzr, [x21,2356]
-.L149:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldr	x23, [sp,48]
+	strb	wzr, [x21, 2356]
+.L172:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldr	x23, [sp, 48]
 	ldp	x29, x30, [sp], 64
 	ret
 	.size	flash_exit_slc_mode, .-flash_exit_slc_mode
@@ -1303,15 +1282,16 @@ flash_exit_slc_mode:
 FlashEraseBlock:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	uxtb	w19, w0
+	stp	x19, x20, [sp, 16]
+	and	w19, w0, 255
 	mov	w20, w1
+	str	x21, [sp, 32]
 	mov	w0, w19
-	str	x2, [x29,40]
+	mov	w21, w2
 	bl	NandcWaitFlashReady
 	mov	w0, w19
 	bl	NandcFlashCs
-	ldr	x2, [x29,40]
+	mov	w2, w21
 	mov	w1, w20
 	mov	w0, w19
 	bl	FlashEraseCmd
@@ -1320,11 +1300,12 @@ FlashEraseBlock:
 	mov	w1, w20
 	mov	w0, w19
 	bl	FlashReadStatus
-	mov	w20, w0
+	mov	w2, w0
 	mov	w0, w19
 	bl	NandcFlashDeCs
-	and	w0, w20, 1
-	ldp	x19, x20, [sp,16]
+	and	w0, w2, 1
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	FlashEraseBlock, .-FlashEraseBlock
@@ -1333,167 +1314,163 @@ FlashEraseBlock:
 	.type	FlashSetInterfaceMode, %function
 FlashSetInterfaceMode:
 	adrp	x1, .LANCHOR0
-	mov	x6, 0
 	add	x1, x1, :lo12:.LANCHOR0
-	mov	w8, 239
 	stp	x29, x30, [sp, -16]!
-	add	x7, x1, 8
-	add	x4, x1, 2132
+	add	x6, x1, 8
+	add	x3, x1, 2132
+	mov	x5, 0
 	add	x29, sp, 0
-	ldrb	w2, [x1,2357]
+	ldrb	w2, [x1, 2357]
+	mov	w12, 69
+	mov	w8, 239
 	mov	w9, 128
+	and	w11, w2, 4
+	and	w7, w2, 1
 	mov	w10, 1
-	mov	w12, 35
-	and	w11, w2, 1
-	and	w2, w2, 4
-	mov	w13, 32
-	mov	w14, 5
-	uxtb	w5, w2
-.L167:
-	ldrb	w3, [x6,x4]
-	ldr	x1, [x7]
-	cmp	w3, 152
-	ldrb	w2, [x7,8]
-	beq	.L157
-	cmp	w3, 69
-	beq	.L157
-	cmp	w3, 173
-	beq	.L157
-	cmp	w3, 44
-	bne	.L158
-.L157:
+	mov	w13, 35
+	mov	w14, 32
+	mov	w15, 5
+	mov	w16, 44
+.L191:
+	ldrb	w2, [x5, x3]
+	ldrb	w4, [x6]
+	cmp	w2, 152
+	ccmp	w2, w12, 4, ne
+	beq	.L182
+	cmp	w2, 173
+	ccmp	w2, w16, 4, ne
+	bne	.L183
+.L182:
 	cmp	w0, 1
-	bne	.L160
-	cbz	w11, .L158
-	ubfiz	x2, x2, 8, 8
-	cmp	w3, 173
-	add	x1, x1, x2
-	str	w8, [x1,2056]
-	bne	.L161
-	str	w0, [x1,2052]
-	b	.L178
-.L161:
-	cmp	w3, 44
-	bne	.L163
-	str	w0, [x1,2052]
-	str	w14, [x1,2048]
-	b	.L165
-.L163:
-	str	w9, [x1,2052]
-	str	w0, [x1,2048]
-	b	.L165
-.L160:
-	cbz	w5, .L158
-	ubfiz	x2, x2, 8, 8
-	cmp	w3, 173
-	add	x1, x1, x2
-	str	w8, [x1,2056]
-	bne	.L164
-	str	w10, [x1,2052]
-	str	w13, [x1,2048]
-	b	.L165
-.L164:
-	cmp	w3, 44
-	bne	.L166
-	str	w10, [x1,2052]
-	str	w12, [x1,2048]
-	b	.L165
-.L166:
-	str	w9, [x1,2052]
-.L178:
-	str	wzr, [x1,2048]
-.L165:
-	str	wzr, [x1,2048]
-	str	wzr, [x1,2048]
-	str	wzr, [x1,2048]
-.L158:
-	add	x6, x6, 8
-	add	x7, x7, 16
-	cmp	x6, 32
-	bne	.L167
+	ldr	x1, [x6, -8]
+	bne	.L184
+	cbz	w7, .L183
+	ubfiz	x4, x4, 8, 8
+	cmp	w2, 173
+	add	x1, x1, x4
+	str	w8, [x1, 2056]
+	bne	.L185
+	str	w0, [x1, 2052]
+.L203:
+	str	wzr, [x1, 2048]
+	b	.L189
+.L185:
+	cmp	w2, 44
+	bne	.L187
+	str	w0, [x1, 2052]
+	str	w15, [x1, 2048]
+.L189:
+	str	wzr, [x1, 2048]
+	str	wzr, [x1, 2048]
+	str	wzr, [x1, 2048]
+.L183:
+	add	x5, x5, 8
+	add	x6, x6, 16
+	cmp	x5, 32
+	bne	.L191
 	mov	w0, 0
 	bl	NandcWaitFlashReady
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	ret
+.L187:
+	str	w9, [x1, 2052]
+	str	w0, [x1, 2048]
+	b	.L189
+.L184:
+	cbz	w11, .L183
+	ubfiz	x4, x4, 8, 8
+	cmp	w2, 173
+	add	x1, x1, x4
+	str	w8, [x1, 2056]
+	bne	.L188
+	str	w10, [x1, 2052]
+	str	w14, [x1, 2048]
+	b	.L189
+.L188:
+	cmp	w2, 44
+	bne	.L190
+	str	w10, [x1, 2052]
+	str	w13, [x1, 2048]
+	b	.L189
+.L190:
+	str	w9, [x1, 2052]
+	b	.L203
 	.size	FlashSetInterfaceMode, .-FlashSetInterfaceMode
 	.align	2
 	.global	FlashReadSpare
 	.type	FlashReadSpare, %function
 FlashReadSpare:
-	adrp	x3, .LANCHOR1+481
-	adrp	x5, .LANCHOR0
-	stp	x29, x30, [sp, -48]!
-	uxtb	w0, w0
-	add	x5, x5, :lo12:.LANCHOR0
-	add	x5, x5, 8
-	sbfiz	x6, x0, 4, 32
+	stp	x29, x30, [sp, -32]!
+	and	w0, w0, 255
+	sbfiz	x5, x0, 4, 32
+	adrp	x4, .LANCHOR0
 	add	x29, sp, 0
-	ldrb	w4, [x3,#:lo12:.LANCHOR1+481]
-	add	x3, x5, x6
-	str	x19, [sp,16]
-	lsl	w4, w4, 9
-	str	x2, [x29,40]
-	ldrb	w3, [x3,8]
-	ldr	x19, [x5,x6]
-	add	x19, x19, x3, lsl 8
-	and	w3, w1, 255
-	str	wzr, [x19,2056]
-	str	w4, [x19,2052]
-	lsr	w4, w4, 8
-	str	w4, [x19,2052]
-	str	w3, [x19,2052]
-	lsr	w3, w1, 8
-	str	w3, [x19,2052]
+	stp	x19, x20, [sp, 16]
+	mov	x20, x2
+	adrp	x2, .LANCHOR1+481
+	add	x4, x4, :lo12:.LANCHOR0
+	ldrb	w3, [x2, #:lo12:.LANCHOR1+481]
+	add	x2, x4, x5
+	ldrb	w19, [x2, 8]
+	lsl	w3, w3, 9
+	ldr	x2, [x4, x5]
+	add	x19, x2, x19, lsl 8
+	and	w2, w1, 255
+	str	wzr, [x19, 2056]
+	str	w3, [x19, 2052]
+	lsr	w3, w3, 8
+	str	w3, [x19, 2052]
+	str	w2, [x19, 2052]
+	lsr	w2, w1, 8
+	str	w2, [x19, 2052]
 	lsr	w1, w1, 16
-	str	w1, [x19,2052]
+	str	w1, [x19, 2052]
 	mov	w1, 48
-	str	w1, [x19,2056]
+	str	w1, [x19, 2056]
 	bl	NandcWaitFlashReady
-	ldr	x2, [x29,40]
-	ldr	w0, [x19,2048]
-	strb	w0, [x2]
-	ldr	x19, [sp,16]
-	ldp	x29, x30, [sp], 48
+	ldr	w0, [x19, 2048]
+	strb	w0, [x20]
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
 	ret
 	.size	FlashReadSpare, .-FlashReadSpare
 	.align	2
 	.global	SandiskProgTestBadBlock
 	.type	SandiskProgTestBadBlock, %function
 SandiskProgTestBadBlock:
-	adrp	x3, .LANCHOR0
-	uxtb	w0, w0
 	stp	x29, x30, [sp, -32]!
-	add	x3, x3, :lo12:.LANCHOR0
-	sbfiz	x4, x0, 4, 32
-	add	x3, x3, 8
+	and	w0, w0, 255
+	sbfiz	x3, x0, 4, 32
+	adrp	x2, .LANCHOR0
+	add	x2, x2, :lo12:.LANCHOR0
 	add	x29, sp, 0
-	add	x2, x3, x4
-	str	x19, [sp,16]
-	ldrb	w2, [x2,8]
-	ldr	x19, [x3,x4]
-	add	x19, x19, x2, lsl 8
+	add	x4, x2, x3
+	str	x19, [sp, 16]
+	ldr	x2, [x2, x3]
+	ldrb	w19, [x4, 8]
+	add	x19, x2, x19, lsl 8
 	mov	w2, 162
-	str	w2, [x19,2056]
+	str	w2, [x19, 2056]
 	mov	w2, 128
-	str	w2, [x19,2056]
+	str	w2, [x19, 2056]
 	and	w2, w1, 255
-	str	wzr, [x19,2052]
-	str	wzr, [x19,2052]
-	str	w2, [x19,2052]
+	str	wzr, [x19, 2052]
+	str	wzr, [x19, 2052]
+	str	w2, [x19, 2052]
 	lsr	w2, w1, 8
-	str	w2, [x19,2052]
+	str	w2, [x19, 2052]
 	lsr	w1, w1, 16
-	str	w1, [x19,2052]
+	str	w1, [x19, 2052]
 	mov	w1, 16
-	str	w1, [x19,2056]
+	str	w1, [x19, 2056]
 	bl	NandcWaitFlashReady
 	mov	w0, 112
-	str	w0, [x19,2056]
+	str	w0, [x19, 2056]
 	mov	x0, 400
 	bl	__const_udelay
-	ldr	w0, [x19,2048]
-	ldr	x19, [sp,16]
+	ldr	w0, [x19, 2048]
+	ldr	x19, [sp, 16]
 	and	w0, w0, 1
 	ldp	x29, x30, [sp], 32
 	ret
@@ -1504,422 +1481,408 @@ SandiskProgTestBadBlock:
 SandiskSetRRPara:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	x20, x0
 	mov	w0, 239
-	uxtb	w19, w1
-	add	w19, w19, 1
-	str	w0, [x20,8]
+	and	w19, w1, 255
+	str	w0, [x20, 8]
 	mov	w0, 17
-	str	w0, [x20,4]
+	str	w0, [x20, 4]
 	mov	x0, 1000
 	bl	__const_udelay
-	mov	w1, 5
-	adrp	x2, .LANCHOR1
-	add	x2, x2, :lo12:.LANCHOR1
-	adrp	x5, .LANCHOR0
-	smull	x1, w19, w1
-	add	x0, x2, 256
-	add	x2, x2, 304
+	add	w1, w19, 1
+	mov	w0, 5
+	adrp	x2, .LANCHOR0
+	add	x2, x2, :lo12:.LANCHOR0
+	umull	x1, w1, w0
+	adrp	x0, .LANCHOR1
+	add	x0, x0, :lo12:.LANCHOR1
+	add	x3, x0, 256
+	add	x0, x0, 352
+	add	x3, x3, x1
 	add	x0, x0, x1
-	add	x1, x2, x1
-	mov	x2, 0
-.L182:
-	add	x3, x5, :lo12:.LANCHOR0
-	ldrb	w4, [x3,129]
-	cmp	w4, w2
-	bls	.L187
-	ldrb	w3, [x3,128]
-	cmp	w3, 67
-	bne	.L183
-	ldrsb	w3, [x0,x2]
-	b	.L186
-.L183:
-	ldrsb	w3, [x1,x2]
-.L186:
-	str	w3, [x20]
-	add	x2, x2, 1
-	b	.L182
-.L187:
+	mov	x1, 0
+.L209:
+	ldrb	w4, [x2, 129]
+	cmp	w4, w1
+	bhi	.L212
 	mov	w0, 0
 	bl	NandcWaitFlashReady
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L212:
+	ldrb	w4, [x2, 128]
+	cmp	w4, 67
+	bne	.L210
+	ldrsb	w4, [x0, x1]
+.L214:
+	add	x1, x1, 1
+	str	w4, [x20]
+	b	.L209
+.L210:
+	ldrsb	w4, [x3, x1]
+	b	.L214
 	.size	SandiskSetRRPara, .-SandiskSetRRPara
 	.align	2
 	.global	micron_auto_read_calibration_config
 	.type	micron_auto_read_calibration_config, %function
 micron_auto_read_calibration_config:
-	stp	x29, x30, [sp, -48]!
+	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	str	x19, [sp,16]
-	uxtb	w19, w0
+	stp	x19, x20, [sp, 16]
+	and	w19, w0, 255
+	mov	w20, w1
 	mov	w0, w19
-	sbfiz	x19, x19, 4, 32
-	str	x1, [x29,40]
 	bl	NandcWaitFlashReady
-	adrp	x3, .LANCHOR0
-	add	x3, x3, :lo12:.LANCHOR0
-	add	x3, x3, 8
-	add	x0, x3, x19
-	ldr	x19, [x3,x19]
-	ldrb	w2, [x0,8]
+	sbfiz	x0, x19, 4, 32
+	adrp	x2, .LANCHOR0
+	add	x2, x2, :lo12:.LANCHOR0
+	add	x1, x2, x0
+	ldr	x0, [x2, x0]
+	ldrb	w19, [x1, 8]
+	add	x19, x0, x19, lsl 8
 	mov	w0, 239
-	add	x19, x19, x2, lsl 8
-	str	w0, [x19,2056]
+	str	w0, [x19, 2056]
 	mov	w0, 150
-	str	w0, [x19,2052]
+	str	w0, [x19, 2052]
 	mov	x0, 1000
 	bl	__const_udelay
-	ldr	x1, [x29,40]
-	str	w1, [x19,2048]
-	str	wzr, [x19,2048]
-	str	wzr, [x19,2048]
-	str	wzr, [x19,2048]
-	ldr	x19, [sp,16]
-	ldp	x29, x30, [sp], 48
+	str	w20, [x19, 2048]
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
 	ret
 	.size	micron_auto_read_calibration_config, .-micron_auto_read_calibration_config
 	.align	2
 	.global	FlashEraseSLc2KBlocks
 	.type	FlashEraseSLc2KBlocks, %function
 FlashEraseSLc2KBlocks:
-	stp	x29, x30, [sp, -96]!
+	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x23, x24, [sp, 48]
+	mov	w23, 56
+	stp	x21, x22, [sp, 32]
 	adrp	x21, .LANCHOR0
-	str	x25, [sp,64]
-	stp	x23, x24, [sp,48]
+	umaddl	x23, w1, w23, x0
 	add	x21, x21, :lo12:.LANCHOR0
-	adrp	x23, .LC0
-	stp	x19, x20, [sp,16]
-	mov	w24, w1
+	stp	x19, x20, [sp, 16]
+	and	w22, w1, 255
 	mov	x20, x0
-	mov	w22, 0
-	add	x25, x21, 2164
-	add	x23, x23, :lo12:.LC0
-.L190:
-	cmp	w22, w24
-	beq	.L199
-	add	x2, x29, 88
-	sub	w4, w24, w22
-	mov	x0, x20
+	add	x24, x21, 2164
+.L218:
+	cmp	x20, x23
+	bne	.L223
+	ldp	x19, x20, [sp, 16]
+	mov	w0, 0
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 80
+	ret
+.L223:
 	mov	w1, 0
-	add	x3, x29, 92
+	mov	w4, w22
+	add	x3, x29, 76
+	add	x2, x29, 72
+	mov	x0, x20
 	bl	LogAddr2PhyAddr
-	ldr	w2, [x29,92]
-	ldrb	w0, [x21,2358]
-	cmp	w2, w0
-	bcc	.L191
+	ldrb	w1, [x21, 2358]
+	ldr	w0, [x29, 76]
+	cmp	w1, w0
+	bhi	.L219
 	mov	w0, -1
 	str	w0, [x20]
-	b	.L192
-.L191:
-	uxtw	x2, w2
-	add	x0, x21, x2
-	ldrb	w19, [x0,2360]
-	mov	x0, 24
-	mul	x2, x2, x0
+.L220:
+	sub	w22, w22, #1
+	add	x20, x20, 56
+	and	w22, w22, 255
+	b	.L218
+.L219:
+	uxtw	x0, w0
+	add	x1, x21, x0
+	ldrb	w19, [x1, 2360]
+	mov	x1, 24
+	mul	x0, x0, x1
+	strb	w19, [x24, x0]
 	mov	w0, w19
-	strb	w19, [x25,x2]
 	bl	NandcWaitFlashReady
 	mov	w0, w19
 	bl	NandcFlashCs
-	ldr	w1, [x29,88]
+	ldr	w1, [x29, 72]
 	mov	w2, 0
 	mov	w0, w19
 	bl	FlashEraseCmd
 	mov	w0, w19
 	bl	NandcWaitFlashReady
-	ldr	w1, [x29,88]
+	ldr	w1, [x29, 72]
 	mov	w0, w19
 	bl	FlashReadStatus
 	sbfx	x0, x0, 0, 1
 	str	w0, [x20]
-	mov	w0, w19
-	ldr	w1, [x29,88]
-	ldr	w2, [x21,76]
-	add	w1, w2, w1
 	mov	w2, 0
+	ldr	w1, [x29, 72]
+	ldr	w0, [x21, 76]
+	add	w1, w1, w0
+	mov	w0, w19
 	bl	FlashEraseCmd
 	mov	w0, w19
 	bl	NandcWaitFlashReady
-	ldr	w1, [x29,88]
+	ldr	w1, [x29, 72]
 	mov	w0, w19
 	bl	FlashReadStatus
-	tbz	x0, 0, .L193
+	tbz	x0, 0, .L221
 	mov	w0, -1
 	str	w0, [x20]
-.L193:
+.L221:
 	ldr	w0, [x20]
 	cmn	w0, #1
-	bne	.L194
-	ldr	w1, [x29,88]
-	mov	x0, x23
+	bne	.L222
+	ldr	w1, [x29, 72]
+	adrp	x0, .LC0
+	add	x0, x0, :lo12:.LC0
 	bl	printk
-.L194:
+.L222:
 	mov	w0, w19
 	bl	NandcFlashDeCs
-.L192:
-	add	w22, w22, 1
-	add	x20, x20, 56
-	b	.L190
-.L199:
-	mov	w0, 0
-	ldr	x25, [sp,64]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 96
-	ret
+	b	.L220
 	.size	FlashEraseSLc2KBlocks, .-FlashEraseSLc2KBlocks
 	.align	2
 	.global	FlashEraseBlocks
 	.type	FlashEraseBlocks, %function
 FlashEraseBlocks:
-	stp	x29, x30, [sp, -128]!
+	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x27, x28, [sp,80]
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR0
+	stp	x21, x22, [sp, 32]
+	add	x21, x19, :lo12:.LANCHOR0
+	stp	x23, x24, [sp, 48]
+	mov	w24, w2
+	stp	x27, x28, [sp, 80]
 	mov	w27, w1
-	adrp	x1, .LANCHOR0
-	stp	x19, x20, [sp,16]
-	add	x19, x1, :lo12:.LANCHOR0
-	str	x1, [x29,104]
-	stp	x23, x24, [sp,48]
-	mov	w23, w2
-	mov	x24, x0
-	ldrb	w2, [x19,72]
-	mov	w20, 0
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	cbz	w2, .L201
-	mov	w1, w23
-	bl	FlashEraseSLc2KBlocks
-	b	.L202
-.L201:
+	stp	x25, x26, [sp, 64]
+	ldrb	w1, [x21, 72]
+	cbnz	w1, .L229
+	mov	x20, x0
+	add	x26, x21, 2164
+	mov	w22, 0
 	mov	w28, 56
-	add	x25, x19, 2164
-	mov	x26, 24
-.L232:
-	cmp	w20, w23
-	bcs	.L233
-	umull	x5, w20, w28
-	mov	w1, 0
-	sub	w4, w23, w20
-	add	x21, x24, x5
-	add	x2, x29, 120
-	mov	x0, x21
-	add	x3, x29, 124
-	str	x5, [x29,96]
-	bl	LogAddr2PhyAddr
-	mov	w22, w0
-	ldrb	w1, [x19,2358]
-	ldr	w0, [x29,124]
-	ldr	x5, [x29,96]
-	cmp	w0, w1
-	bcc	.L203
-	mov	w0, -1
-	str	w0, [x24,x5]
-	b	.L204
-.L203:
-	ldrb	w1, [x19,2368]
-	cmp	w1, wzr
-	uxtw	x1, w0
-	csel	w22, w22, wzr, ne
-	madd	x1, x1, x26, x25
-	ldr	x1, [x1,8]
-	cbz	x1, .L206
-	bl	FlashWaitCmdDone
-.L206:
-	ldr	w0, [x29,124]
-	ldr	w1, [x29,120]
-	madd	x2, x0, x26, x25
-	str	x21, [x2,8]
-	str	xzr, [x2,16]
-	str	w1, [x2,4]
-	cbz	w22, .L207
-	add	w1, w20, 1
-	umull	x1, w1, w28
-	add	x1, x24, x1
-	str	x1, [x2,16]
-.L207:
-	add	x1, x19, x0
-	mul	x0, x0, x26
-	ldrb	w21, [x1,2360]
-	strb	w21, [x25,x0]
-	mov	w0, w21
+.L230:
+	cmp	w22, w24
+	bcc	.L239
+	add	x19, x19, :lo12:.LANCHOR0
+	mov	x21, 0
+	add	x22, x19, 2164
+	mov	x23, 24
+.L240:
+	ldrb	w0, [x19, 2358]
+	cmp	w0, w21
+	bhi	.L242
+	ldr	w0, [x19, 2372]
+	cbnz	w0, .L243
+.L244:
+	mov	w0, 0
+	b	.L228
+.L229:
+	mov	w1, w2
+	bl	FlashEraseSLc2KBlocks
+.L228:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L239:
+	umull	x12, w22, w28
+	mov	w1, 0
+	sub	w4, w24, w22
+	add	x3, x29, 108
+	add	x23, x20, x12
+	add	x2, x29, 104
+	mov	x0, x23
+	bl	LogAddr2PhyAddr
+	mov	w25, w0
+	ldrb	w1, [x21, 2358]
+	ldr	w0, [x29, 108]
+	cmp	w1, w0
+	bhi	.L232
+	mov	w0, -1
+	str	w0, [x20, x12]
+.L233:
+	add	w22, w22, 1
+	b	.L230
+.L232:
+	ldrb	w1, [x21, 2368]
+	mov	x2, 24
+	cmp	w1, 0
+	uxtw	x1, w0
+	csel	w25, w25, wzr, ne
+	madd	x1, x1, x2, x26
+	ldr	x1, [x1, 8]
+	cbz	x1, .L235
+	bl	FlashWaitCmdDone
+.L235:
+	ldp	w2, w1, [x29, 104]
+	mov	x0, 24
+	madd	x0, x1, x0, x26
+	str	w2, [x0, 4]
+	stp	x23, xzr, [x0, 8]
+	cbz	w25, .L236
+	add	w2, w22, 1
+	umaddl	x2, w2, w28, x20
+	str	x2, [x0, 16]
+.L236:
+	add	x0, x21, x1
+	ldrb	w23, [x0, 2360]
+	mov	x0, 24
+	mul	x1, x1, x0
+	mov	w0, w23
+	strb	w23, [x26, x1]
 	bl	NandcFlashCs
 	cmp	w27, 1
-	bne	.L208
-	ldrb	w0, [x19,204]
-	cbz	w0, .L208
-	mov	w0, w21
+	bne	.L237
+	ldrb	w0, [x21, 204]
+	cbz	w0, .L237
+	mov	w0, w23
 	bl	flash_enter_slc_mode
-	b	.L209
-.L208:
-	mov	w0, w21
-	bl	flash_exit_slc_mode
-.L209:
-	ldr	w1, [x29,124]
-	add	x0, x19, 1232
-	add	w20, w20, w22
-	ldr	w0, [x0,x1,lsl 2]
-	ldr	w1, [x29,120]
-	cmp	w0, wzr
-	mov	w0, w21
+.L238:
+	ldr	w1, [x29, 108]
+	add	x0, x21, 1232
+	add	w22, w22, w25
+	ldr	w0, [x0, x1, lsl 2]
+	ldr	w1, [x29, 104]
+	cmp	w0, 0
+	mov	w0, w23
 	cset	w2, ne
 	bl	FlashWaitReadyEN
-	ldr	w1, [x29,120]
-	mov	w0, w21
-	mov	w2, w22
+	ldr	w1, [x29, 104]
+	mov	w2, w25
+	mov	w0, w23
 	bl	FlashEraseCmd
-	mov	w0, w21
+	mov	w0, w23
 	bl	NandcFlashDeCs
-.L204:
-	add	w20, w20, 1
-	b	.L232
-.L233:
-	ldr	x0, [x29,104]
-	mov	x20, 0
-	mov	x22, 24
-	add	x19, x0, :lo12:.LANCHOR0
-	add	x21, x19, 2164
-.L211:
-	ldrb	w0, [x19,2358]
-	cmp	w0, w20
-	bls	.L234
-	mov	w0, w20
+	b	.L233
+.L237:
+	mov	w0, w23
+	bl	flash_exit_slc_mode
+	b	.L238
+.L242:
+	mov	w0, w21
 	bl	FlashWaitCmdDone
 	cmp	w27, 1
-	bne	.L212
-	ldrb	w0, [x19,204]
-	cbz	w0, .L212
-	mul	x0, x20, x22
-	ldrb	w0, [x0,x21]
+	bne	.L241
+	ldrb	w0, [x19, 204]
+	cbz	w0, .L241
+	mul	x0, x21, x23
+	ldrb	w0, [x0, x22]
 	bl	flash_exit_slc_mode
-.L212:
-	add	x20, x20, 1
-	b	.L211
-.L234:
-	ldr	w0, [x19,2372]
-	cbnz	w0, .L214
-.L216:
-	mov	w0, 0
-	b	.L202
-.L214:
-	ldrb	w0, [x19,2132]
+.L241:
+	add	x21, x21, 1
+	b	.L240
+.L243:
+	ldrb	w0, [x19, 2132]
 	cmp	w0, 69
-	bne	.L216
-	mov	x0, 0
-	mov	x1, 56
-.L215:
-	cmp	w23, w0
-	bls	.L216
-	mul	x2, x0, x1
-	add	x0, x0, 1
-	str	wzr, [x24,x2]
-	b	.L215
-.L202:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
-	ret
+	bne	.L244
+	mov	w1, 56
+	mov	x0, x20
+	umaddl	x24, w24, w1, x20
+.L245:
+	cmp	x24, x0
+	beq	.L244
+	str	wzr, [x0], 56
+	b	.L245
 	.size	FlashEraseBlocks, .-FlashEraseBlocks
 	.align	2
 	.global	FlashReadDpCmd
 	.type	FlashReadDpCmd, %function
 FlashReadDpCmd:
-	stp	x29, x30, [sp, -80]!
-	adrp	x3, .LANCHOR0
-	and	w8, w1, 255
+	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	add	x6, x3, :lo12:.LANCHOR0
-	uxtb	w21, w0
-	sbfiz	x0, x21, 4, 32
-	add	x4, x6, 8
-	stp	x19, x20, [sp,16]
-	str	x23, [sp,48]
-	add	x7, x4, x0
-	and	w23, w2, 255
-	lsr	w22, w2, 8
-	ldr	x5, [x4,x0]
+	stp	x21, x22, [sp, 32]
+	and	w22, w0, 255
+	adrp	x0, .LANCHOR0
+	add	x4, x0, :lo12:.LANCHOR0
+	stp	x23, x24, [sp, 48]
+	mov	w21, w1
+	stp	x19, x20, [sp, 16]
+	sbfiz	x1, x22, 4, 32
+	and	w24, w2, 255
+	lsr	w23, w2, 8
 	lsr	w20, w2, 16
-	ldrb	w0, [x6,112]
-	ldr	x2, [x6,88]
-	cmp	w0, 1
-	ldrb	w19, [x7,8]
-	lsr	w0, w1, 16
-	lsr	w7, w1, 8
-	ldrb	w2, [x2,7]
-	bne	.L236
+	ldr	x2, [x4, 88]
+	add	x3, x4, x1
+	ldr	x5, [x4, x1]
+	ldrb	w1, [x4, 112]
+	and	w7, w21, 255
+	lsr	w6, w21, 8
+	cmp	w1, 1
+	ldrb	w19, [x3, 8]
+	lsr	w1, w21, 16
+	ldrb	w2, [x2, 7]
+	bne	.L261
 	cmp	w2, 1
-	bne	.L237
-	sxtw	x4, w19
+	bne	.L262
+	sxtw	x3, w19
 	mov	w2, 38
-	add	x4, x4, 8
-	add	x4, x5, x4, lsl 8
-	str	w2, [x4,8]
-.L237:
-	add	x3, x3, :lo12:.LANCHOR0
+	add	x3, x3, 8
+	add	x3, x5, x3, lsl 8
+	str	w2, [x3, 8]
+.L262:
+	add	x0, x0, :lo12:.LANCHOR0
 	add	x19, x5, x19, lsl 8
-	str	x1, [x29,72]
-	ldrb	w2, [x3,104]
-	str	w2, [x19,2056]
-	str	wzr, [x19,2052]
-	str	wzr, [x19,2052]
-	str	w8, [x19,2052]
-	str	w7, [x19,2052]
-	str	w0, [x19,2052]
-	ldrb	w0, [x3,105]
-	str	w0, [x19,2056]
-	mov	w0, w21
+	add	x0, x0, 96
+	ldrb	w2, [x0, 8]
+	str	w2, [x19, 2056]
+	str	wzr, [x19, 2052]
+	str	wzr, [x19, 2052]
+	str	w7, [x19, 2052]
+	str	w6, [x19, 2052]
+	ldrb	w0, [x0, 9]
+	str	w1, [x19, 2052]
+	str	w0, [x19, 2056]
+	mov	w0, w22
 	bl	NandcWaitFlashReady
-	str	wzr, [x19,2056]
-	str	wzr, [x19,2052]
+	str	wzr, [x19, 2056]
+	str	wzr, [x19, 2052]
+	str	wzr, [x19, 2052]
+.L266:
+	str	w24, [x19, 2052]
 	mov	w0, 48
-	str	wzr, [x19,2052]
-	str	w23, [x19,2052]
-	str	w22, [x19,2052]
-	str	w20, [x19,2052]
-	str	w0, [x19,2056]
-	ldr	x1, [x29,72]
-	b	.L238
-.L236:
+	str	w23, [x19, 2052]
+	mov	w1, w21
+	str	w20, [x19, 2052]
+	str	w0, [x19, 2056]
+	mov	w0, w22
+	bl	FlashSetRandomizer
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 64
+	ret
+.L261:
 	cmp	w2, 1
-	bne	.L239
-	sxtw	x4, w19
+	bne	.L264
+	sxtw	x3, w19
 	mov	w2, 38
-	add	x4, x4, 8
-	add	x4, x5, x4, lsl 8
-	str	w2, [x4,8]
-.L239:
-	add	x3, x3, :lo12:.LANCHOR0
+	add	x3, x3, 8
+	add	x3, x5, x3, lsl 8
+	str	w2, [x3, 8]
+.L264:
+	add	x0, x0, :lo12:.LANCHOR0
 	add	x19, x5, x19, lsl 8
-	ldrb	w2, [x3,104]
-	str	w2, [x19,2056]
-	str	w8, [x19,2052]
-	str	w7, [x19,2052]
-	str	w0, [x19,2052]
-	ldrb	w0, [x3,105]
-	str	w0, [x19,2056]
-	mov	w0, 48
-	str	w23, [x19,2052]
-	str	w22, [x19,2052]
-	str	w20, [x19,2052]
-	str	w0, [x19,2056]
-.L238:
-	mov	w0, w21
-	bl	FlashSetRandomizer
-	ldr	x23, [sp,48]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 80
-	ret
+	add	x0, x0, 96
+	ldrb	w2, [x0, 8]
+	str	w2, [x19, 2056]
+	str	w7, [x19, 2052]
+	str	w6, [x19, 2052]
+	ldrb	w0, [x0, 9]
+	str	w1, [x19, 2052]
+	str	w0, [x19, 2056]
+	b	.L266
 	.size	FlashReadDpCmd, .-FlashReadDpCmd
 	.align	2
 	.global	ftl_flash_de_init
@@ -1928,48 +1891,47 @@ ftl_flash_de_init:
 	stp	x29, x30, [sp, -32]!
 	mov	w0, 0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	bl	NandcWaitFlashReady
-	adrp	x19, .LANCHOR0
 	bl	FlashSetReadRetryDefault
+	adrp	x19, .LANCHOR0
 	add	x0, x19, :lo12:.LANCHOR0
-	ldr	w0, [x0,2376]
-	cbz	w0, .L241
+	ldr	w0, [x0, 2376]
+	cbz	w0, .L268
 	mov	w0, 0
 	bl	flash_enter_slc_mode
-	b	.L242
-.L241:
-	bl	flash_exit_slc_mode
-.L242:
+.L269:
 	add	x20, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x20,2380]
-	cbz	w0, .L243
-	ldrb	w0, [x20,2357]
-	tbz	x0, 0, .L243
+	ldrb	w0, [x20, 2380]
+	cbz	w0, .L270
+	ldrb	w0, [x20, 2357]
+	tbz	x0, 0, .L270
 	mov	w0, 1
 	bl	FlashSetInterfaceMode
 	mov	w0, 1
 	bl	NandcSetMode
-	strb	wzr, [x20,2380]
-.L243:
-	add	x19, x19, :lo12:.LANCHOR0
-	ldr	x0, [x19,8]
-	str	wzr, [x0,336]
+	strb	wzr, [x20, 2380]
+.L270:
+	ldr	x0, [x19, #:lo12:.LANCHOR0]
+	str	wzr, [x0, 336]
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L268:
+	mov	w0, 0
+	bl	flash_exit_slc_mode
+	b	.L269
 	.size	ftl_flash_de_init, .-ftl_flash_de_init
 	.align	2
 	.global	NandcRandmzSel
 	.type	NandcRandmzSel, %function
 NandcRandmzSel:
-	adrp	x2, .LANCHOR0
 	ubfiz	x0, x0, 4, 8
+	adrp	x2, .LANCHOR0
 	add	x2, x2, :lo12:.LANCHOR0
-	add	x2, x2, 8
-	ldr	x0, [x2,x0]
-	str	w1, [x0,336]
+	ldr	x0, [x2, x0]
+	str	w1, [x0, 336]
 	ret
 	.size	NandcRandmzSel, .-NandcRandmzSel
 	.align	2
@@ -1978,73 +1940,77 @@ NandcRandmzSel:
 NandcTimeCfg:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	mov	w19, w0
 	mov	w0, 0
 	bl	rknand_get_clk_rate
-	mov	w2, 16960
+	mov	w1, 16960
+	movk	w1, 0xf, lsl 16
+	sdiv	w0, w0, w1
 	adrp	x1, .LANCHOR0
-	movk	w2, 0xf, lsl 16
 	add	x1, x1, :lo12:.LANCHOR0
-	sdiv	w0, w0, w2
 	cmp	w0, 250
-	ble	.L252
-	ldr	x0, [x1,136]
+	ble	.L280
+	ldr	x0, [x1, 136]
 	mov	w1, 8354
-	b	.L259
-.L252:
+.L288:
+	str	w1, [x0, 4]
+	ldr	x19, [sp, 16]
+	ldp	x29, x30, [sp], 32
+	ret
+.L280:
 	cmp	w0, 220
-	ble	.L254
-	ldr	x0, [x1,136]
-	b	.L260
-.L254:
+	ble	.L282
+	ldr	x0, [x1, 136]
+.L289:
+	mov	w1, 8322
+	b	.L288
+.L282:
 	cmp	w0, 185
-	ble	.L255
-	ldr	x0, [x1,136]
+	ble	.L283
+	ldr	x0, [x1, 136]
 	mov	w1, 4226
-	b	.L259
-.L255:
+	b	.L288
+.L283:
 	cmp	w0, 160
-	ldr	x0, [x1,136]
-	ble	.L256
+	ldr	x0, [x1, 136]
+	ble	.L284
 	mov	w1, 4194
-	b	.L259
-.L256:
+	b	.L288
+.L284:
 	cmp	w19, 35
+	bhi	.L285
 	mov	w1, 4193
-	bls	.L259
+	b	.L288
+.L285:
 	cmp	w19, 99
+	bhi	.L289
 	mov	w1, 4225
-	bls	.L259
-.L260:
-	mov	w1, 8322
-.L259:
-	str	w1, [x0,4]
-	ldr	x19, [sp,16]
-	ldp	x29, x30, [sp], 32
-	ret
+	b	.L288
 	.size	NandcTimeCfg, .-NandcTimeCfg
 	.align	2
 	.global	FlashTimingCfg
 	.type	FlashTimingCfg, %function
 FlashTimingCfg:
-	sub	w1, w0, #4096
-	sub	w1, w1, #97
 	stp	x29, x30, [sp, -16]!
-	and	w1, w1, -33
-	cmp	w1, 1
+	mov	w1, -4193
+	add	w2, w0, w1
+	mov	w3, -4225
 	add	x29, sp, 0
-	bls	.L262
+	add	w1, w0, w3
+	cmp	w2, 1
+	ccmp	w1, 1, 0, hi
+	bls	.L291
 	mov	w1, 8322
 	cmp	w0, w1
-	bne	.L263
-.L262:
+	bne	.L292
+.L291:
 	adrp	x1, .LANCHOR0+136
-	ldr	x1, [x1,#:lo12:.LANCHOR0+136]
-	str	w0, [x1,4]
-.L263:
+	ldr	x1, [x1, #:lo12:.LANCHOR0+136]
+	str	w0, [x1, 4]
+.L292:
 	adrp	x0, .LANCHOR1+493
-	ldrb	w0, [x0,#:lo12:.LANCHOR1+493]
+	ldrb	w0, [x0, #:lo12:.LANCHOR1+493]
 	bl	NandcTimeCfg
 	ldp	x29, x30, [sp], 16
 	ret
@@ -2054,58 +2020,58 @@ FlashTimingCfg:
 	.type	NandcInit, %function
 NandcInit:
 	stp	x29, x30, [sp, -32]!
-	mov	w3, 1
+	mov	w2, 1
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	adrp	x19, .LANCHOR0
 	add	x1, x19, :lo12:.LANCHOR0
-	str	w3, [x1,32]
-	mov	w3, 2
-	str	wzr, [x1,16]
-	str	w3, [x1,48]
-	mov	w3, 3
-	str	x0, [x1,8]
-	str	w3, [x1,64]
-	str	x0, [x1,24]
-	str	x0, [x1,40]
-	str	x0, [x1,56]
-	str	x0, [x1,136]
+	str	x0, [x19, #:lo12:.LANCHOR0]
+	str	w2, [x1, 24]
+	mov	w2, 2
+	str	wzr, [x1, 8]
+	str	w2, [x1, 40]
+	mov	w2, 3
+	str	x0, [x1, 16]
+	str	x0, [x1, 32]
+	str	x0, [x1, 48]
+	str	x0, [x1, 136]
+	str	w2, [x1, 56]
 	ldr	w2, [x0]
 	ubfx	x3, x2, 13, 1
-	str	w3, [x1,2384]
-	ldr	w3, [x0,352]
+	str	w3, [x1, 2384]
+	ldr	w3, [x0, 352]
 	and	w2, w2, 245760
 	orr	w2, w2, 256
 	ubfx	x3, x3, 16, 4
-	str	w3, [x1,2388]
-	ldr	w3, [x0,352]
-	str	w3, [x1,2392]
+	str	w3, [x1, 2388]
+	ldr	w3, [x0, 352]
+	str	w3, [x1, 2392]
 	cmp	w3, 2049
-	bne	.L265
+	bne	.L295
 	mov	w3, 8
-	str	w3, [x1,2388]
-.L265:
+	str	w3, [x1, 2388]
+.L295:
 	add	x19, x19, :lo12:.LANCHOR0
 	str	w2, [x0]
-	ldr	x0, [x19,136]
-	str	wzr, [x0,336]
+	ldr	x0, [x19, 136]
+	str	wzr, [x0, 336]
 	mov	w0, 40
 	bl	NandcTimeCfg
-	ldr	x0, [x19,136]
+	ldr	x0, [x19, 136]
 	mov	w1, 8322
-	str	w1, [x0,344]
+	str	w1, [x0, 344]
 	mov	w1, 6145
 	movk	w1, 0x18, lsl 16
-	str	w1, [x0,304]
+	str	w1, [x0, 304]
 	mov	w0, 36864
 	bl	ftl_malloc
-	str	wzr, [x19,2448]
-	str	x0, [x19,2400]
-	str	x0, [x19,2408]
+	str	wzr, [x19, 2448]
+	str	x0, [x19, 2400]
+	str	x0, [x19, 2408]
 	add	x0, x0, 32768
-	str	wzr, [x19,2456]
-	str	x0, [x19,2416]
-	ldr	x19, [sp,16]
+	str	wzr, [x19, 2456]
+	str	x0, [x19, 2416]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	NandcInit, .-NandcInit
@@ -2115,20 +2081,20 @@ NandcInit:
 NandcGetTimeCfg:
 	adrp	x4, .LANCHOR0
 	add	x4, x4, :lo12:.LANCHOR0
-	ldr	x5, [x4,136]
-	ldr	w5, [x5,4]
+	ldr	x5, [x4, 136]
+	ldr	w5, [x5, 4]
 	str	w5, [x0]
-	ldr	x0, [x4,136]
+	ldr	x0, [x4, 136]
 	ldr	w0, [x0]
 	str	w0, [x1]
-	ldr	x0, [x4,136]
-	ldr	w0, [x0,304]
+	ldr	x0, [x4, 136]
+	ldr	w0, [x0, 304]
 	str	w0, [x2]
-	ldr	x1, [x4,136]
-	ldr	w0, [x1,308]
-	ldr	w1, [x1,344]
-	and	w0, w0, 255
-	orr	w0, w0, w1, lsl 16
+	ldr	x0, [x4, 136]
+	ldr	w1, [x0, 308]
+	ldr	w0, [x0, 344]
+	and	w1, w1, 255
+	orr	w0, w1, w0, lsl 16
 	str	w0, [x3]
 	ret
 	.size	NandcGetTimeCfg, .-NandcGetTimeCfg
@@ -2137,32 +2103,32 @@ NandcGetTimeCfg:
 	.type	NandcBchSel, %function
 NandcBchSel:
 	adrp	x1, .LANCHOR0
-	uxtb	w0, w0
 	add	x1, x1, :lo12:.LANCHOR0
+	and	w0, w0, 255
 	mov	w3, 1
 	cmp	w0, 16
-	ldr	x2, [x1,136]
-	str	w0, [x1,2460]
+	ldr	x2, [x1, 136]
+	str	w0, [x1, 2460]
 	mov	w1, 4096
-	str	w3, [x2,8]
-	bne	.L268
-.L271:
+	str	w3, [x2, 8]
+	bne	.L299
+.L302:
 	and	w1, w1, -17
-	b	.L269
-.L268:
+.L300:
+	orr	w1, w1, 1
+	str	w1, [x2, 12]
+	ret
+.L299:
 	cmp	w0, 24
-	bne	.L270
+	bne	.L301
 	orr	w1, w1, 16
-	b	.L269
-.L270:
-	cmp	w0, 40
+	b	.L300
+.L301:
 	orr	w1, w1, 262144
+	cmp	w0, 40
 	orr	w1, w1, 16
-	beq	.L271
-.L269:
-	orr	w1, w1, 1
-	str	w1, [x2,12]
-	ret
+	bne	.L300
+	b	.L302
 	.size	NandcBchSel, .-NandcBchSel
 	.align	2
 	.global	FlashBchSel
@@ -2170,9 +2136,9 @@ NandcBchSel:
 FlashBchSel:
 	stp	x29, x30, [sp, -16]!
 	adrp	x1, .LANCHOR0+2464
-	uxtb	w0, w0
+	and	w0, w0, 255
 	add	x29, sp, 0
-	strb	w0, [x1,#:lo12:.LANCHOR0+2464]
+	strb	w0, [x1, #:lo12:.LANCHOR0+2464]
 	bl	NandcBchSel
 	ldp	x29, x30, [sp], 16
 	ret
@@ -2183,63 +2149,63 @@ FlashBchSel:
 ftl_flash_resume:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR0
-	str	x21, [sp,32]
 	add	x0, x20, :lo12:.LANCHOR0
-	mov	x21, 0
+	str	x21, [sp, 32]
 	add	x19, x0, 2132
-	ldr	x1, [x0,136]
-	ldr	w2, [x0,144]
+	mov	x21, 0
+	ldr	x1, [x0, 136]
+	ldr	w2, [x0, 144]
 	str	w2, [x1]
-	ldr	w2, [x0,148]
-	ldr	x1, [x0,136]
-	str	w2, [x1,4]
-	ldr	w2, [x0,152]
-	ldr	x1, [x0,136]
-	str	w2, [x1,8]
-	ldr	w2, [x0,156]
-	str	w2, [x1,12]
-	ldr	w2, [x0,160]
-	str	w2, [x1,304]
-	ldr	w2, [x0,164]
-	str	w2, [x1,308]
-	ldr	w2, [x0,168]
-	str	w2, [x1,336]
-	ldr	w2, [x0,172]
-	str	w2, [x1,344]
-.L278:
+	ldr	w2, [x0, 148]
+	ldr	x1, [x0, 136]
+	str	w2, [x1, 4]
+	ldr	w2, [x0, 152]
+	ldr	x1, [x0, 136]
+	str	w2, [x1, 8]
+	ldr	w2, [x0, 156]
+	str	w2, [x1, 12]
+	ldr	w2, [x0, 160]
+	str	w2, [x1, 304]
+	ldr	w2, [x0, 164]
+	str	w2, [x1, 308]
+	ldr	w2, [x0, 168]
+	str	w2, [x1, 336]
+	ldr	w2, [x0, 172]
+	str	w2, [x1, 344]
+.L310:
 	lsl	x0, x21, 3
-	ldrb	w0, [x0,x19]
+	ldrb	w0, [x0, x19]
 	sub	w0, w0, #1
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 253
-	bhi	.L277
+	bhi	.L309
 	mov	w0, w21
 	bl	FlashReset
-.L277:
+.L309:
 	add	x21, x21, 1
 	cmp	x21, 4
-	bne	.L278
+	bne	.L310
 	add	x19, x20, :lo12:.LANCHOR0
-	ldrb	w0, [x19,2380]
-	cbz	w0, .L279
+	ldrb	w0, [x19, 2380]
+	cbz	w0, .L311
 	mov	w0, 1
 	bl	NandcSetMode
-	ldrb	w0, [x19,2357]
+	ldrb	w0, [x19, 2357]
 	bl	FlashSetInterfaceMode
-	ldrb	w0, [x19,2357]
+	ldrb	w0, [x19, 2357]
 	bl	NandcSetMode
-	ldr	w0, [x19,160]
+	ldr	w0, [x19, 160]
 	lsr	w0, w0, 8
 	bl	NandcSetDdrPara
-.L279:
+.L311:
 	add	x20, x20, :lo12:.LANCHOR0
-	ldr	x0, [x20,88]
-	ldrb	w0, [x0,20]
+	ldr	x0, [x20, 88]
+	ldrb	w0, [x0, 20]
 	bl	FlashBchSel
-	ldr	x21, [sp,32]
-	ldp	x19, x20, [sp,16]
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	ftl_flash_resume, .-ftl_flash_resume
@@ -2247,19 +2213,19 @@ ftl_flash_resume:
 	.global	ftl_nandc_get_irq_status
 	.type	ftl_nandc_get_irq_status, %function
 ftl_nandc_get_irq_status:
-	ldr	w0, [x0,372]
+	ldr	w0, [x0, 372]
 	ret
 	.size	ftl_nandc_get_irq_status, .-ftl_nandc_get_irq_status
 	.align	2
 	.global	rk_nandc_flash_ready
 	.type	rk_nandc_flash_ready, %function
 rk_nandc_flash_ready:
-	ldr	w1, [x0,368]
+	ldr	w1, [x0, 368]
 	orr	w1, w1, 2
-	str	w1, [x0,368]
-	ldr	w1, [x0,364]
+	str	w1, [x0, 368]
+	ldr	w1, [x0, 364]
 	and	w1, w1, -3
-	str	w1, [x0,364]
+	str	w1, [x0, 364]
 	ret
 	.size	rk_nandc_flash_ready, .-rk_nandc_flash_ready
 	.align	2
@@ -2272,12 +2238,12 @@ NandcIqrWaitFlashReady:
 	.global	rk_nandc_flash_xfer_completed
 	.type	rk_nandc_flash_xfer_completed, %function
 rk_nandc_flash_xfer_completed:
-	ldr	w1, [x0,368]
+	ldr	w1, [x0, 368]
 	orr	w1, w1, 1
-	str	w1, [x0,368]
-	ldr	w1, [x0,364]
+	str	w1, [x0, 368]
+	ldr	w1, [x0, 364]
 	and	w1, w1, -2
-	str	w1, [x0,364]
+	str	w1, [x0, 364]
 	ret
 	.size	rk_nandc_flash_xfer_completed, .-rk_nandc_flash_xfer_completed
 	.align	2
@@ -2285,23 +2251,19 @@ rk_nandc_flash_xfer_completed:
 	.type	NandcSendDumpDataStart, %function
 NandcSendDumpDataStart:
 	sub	sp, sp, #16
-	mov	w2, 1
-	mov	w1, 10
-	bfi	w1, w2, 5, 2
-	ldr	w2, [x0,16]
-	str	w2, [sp,8]
-	orr	w1, w1, 536870912
-	orr	w1, w1, 1024
-	ldr	w2, [sp,8]
-	orr	w1, w1, 2097152
+	ldr	w2, [x0, 16]
+	mov	w1, 1066
+	movk	w1, 0x2020, lsl 16
+	str	w2, [sp, 8]
+	ldr	w2, [sp, 8]
 	and	w2, w2, -5
-	str	w2, [sp,8]
-	ldr	w2, [sp,8]
-	add	sp, sp, 16
-	str	w2, [x0,16]
-	str	w1, [x0,8]
+	str	w2, [sp, 8]
+	ldr	w2, [sp, 8]
+	str	w2, [x0, 16]
+	str	w1, [x0, 8]
 	orr	w1, w1, 4
-	str	w1, [x0,8]
+	str	w1, [x0, 8]
+	add	sp, sp, 16
 	ret
 	.size	NandcSendDumpDataStart, .-NandcSendDumpDataStart
 	.align	2
@@ -2309,11 +2271,11 @@ NandcSendDumpDataStart:
 	.type	NandcSendDumpDataDone, %function
 NandcSendDumpDataDone:
 	sub	sp, sp, #16
-.L290:
-	ldr	w1, [x0,8]
-	str	w1, [sp,8]
-	ldr	w1, [sp,8]
-	tbz	x1, 20, .L290
+.L324:
+	ldr	w1, [x0, 8]
+	str	w1, [sp, 8]
+	ldr	w1, [sp, 8]
+	tbz	x1, 20, .L324
 	add	sp, sp, 16
 	ret
 	.size	NandcSendDumpDataDone, .-NandcSendDumpDataDone
@@ -2325,144 +2287,142 @@ NandcXferStart:
 	ubfiz	x0, x0, 4, 8
 	ubfx	x3, x3, 1, 7
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR0
-	uxtb	w2, w2
-	stp	x23, x24, [sp,48]
-	uxtb	w23, w1
+	stp	x23, x24, [sp, 48]
+	and	w24, w1, 255
 	add	x1, x19, :lo12:.LANCHOR0
-	add	x6, x1, 8
-	ubfiz	w20, w23, 1, 1
-	stp	x21, x22, [sp,32]
-	add	x7, x6, x0
+	stp	x21, x22, [sp, 32]
+	str	x25, [sp, 64]
+	add	x6, x1, x0
+	ubfiz	w20, w24, 1, 1
+	ldr	x21, [x1, x0]
 	orr	w20, w20, 8
-	ldr	x21, [x6,x0]
+	ldrb	w0, [x6, 8]
 	mov	w6, 16
-	ldrb	w0, [x7,8]
-	ldr	w22, [x21,12]
-	bfi	w22, w6, 8, 8
-	and	w22, w22, -9
-	bfi	w22, w0, 5, 3
+	ldr	w23, [x21, 12]
+	bfi	w23, w6, 8, 8
+	and	w23, w23, -9
+	bfi	w23, w0, 5, 3
 	mov	w0, 1
 	bfi	w20, w0, 5, 2
-	ldr	w0, [x1,2388]
+	ldr	w0, [x1, 2388]
 	orr	w20, w20, 536870912
-	cmp	w0, 3
 	orr	w20, w20, 1024
+	cmp	w0, 3
 	bfi	w20, w3, 4, 1
-	bls	.L294
-	ldr	w0, [x21,16]
-	cmp	x5, xzr
-	str	w0, [x29,88]
-	cset	w9, ne
-	ldr	w0, [x29,88]
+	bls	.L329
+	ldr	w0, [x21, 16]
+	cmp	x5, 0
+	str	w0, [x29, 88]
+	ccmp	x4, 0, 0, eq
+	ldr	w0, [x29, 88]
 	and	w0, w0, -5
-	str	w0, [x29,88]
-	cbnz	w9, .L308
-	cbz	x4, .L295
-.L308:
-	cbnz	w23, .L297
-.L305:
+	str	w0, [x29, 88]
+	beq	.L330
+	and	w2, w2, 255
+	cbnz	w24, .L331
+.L339:
 	add	w2, w2, 1
-	mov	x0, x4
 	asr	w2, w2, 1
 	bfi	w20, w2, 22, 6
-	cbnz	x4, .L299
-	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x0, [x0,2408]
-	b	.L299
-.L297:
-	add	x1, x19, :lo12:.LANCHOR0
-	mov	w7, 128
-	mov	w3, 0
-	lsr	w10, w2, 1
-	mov	w6, w3
-	mov	w11, -1
-	ldr	w0, [x1,2460]
-	cmp	w0, 25
-	mov	w0, 64
-	csel	w7, w0, w7, cc
-.L301:
-	cmp	w6, w10
-	bcs	.L305
-	lsr	w0, w3, 2
-	ubfiz	x0, x0, 2, 30
-	cbz	w9, .L302
-	ldrh	w8, [x5,2]
-	ldr	x12, [x1,2416]
-	ldrh	w13, [x5],4
-	orr	w8, w13, w8, lsl 16
-	str	w8, [x12,x0]
-	b	.L303
-.L302:
-	ldr	x8, [x1,2416]
-	str	w11, [x8,x0]
-.L303:
-	add	w6, w6, 1
-	add	w3, w3, w7
-	b	.L301
-.L299:
+	cbz	x4, .L332
+	mov	x0, x4
+.L333:
 	add	x19, x19, :lo12:.LANCHOR0
-	ubfx	x24, x20, 22, 5
-	mov	w2, w23
-	str	x4, [x29,72]
-	ldr	x1, [x19,2416]
-	str	x1, [x19,2432]
-	lsl	w1, w24, 10
-	str	x0, [x19,2424]
+	ubfx	x25, x20, 22, 5
+	mov	x22, x4
+	mov	w2, w24
+	ldr	x1, [x19, 2416]
+	str	x1, [x19, 2432]
+	lsl	w1, w25, 10
+	str	x0, [x19, 2424]
 	bl	rknand_dma_map_single
-	str	w0, [x19,2440]
-	ldr	x0, [x19,2432]
-	lsl	w1, w24, 7
-	mov	w2, w23
+	str	w0, [x19, 2440]
+	lsl	w1, w25, 7
+	ldr	x0, [x19, 2432]
+	mov	w2, w24
 	bl	rknand_dma_map_single
-	str	w0, [x19,2444]
+	str	w0, [x19, 2444]
 	mov	w0, 1
-	str	w0, [x19,2448]
-	ldr	w0, [x19,2440]
+	str	w0, [x19, 2448]
+	ldr	w0, [x19, 2440]
 	mov	w1, 16
-	str	w0, [x21,20]
-	ldr	x4, [x29,72]
-	ldr	w0, [x19,2444]
-	str	w0, [x21,24]
-	and	x4, x4, 3
-	str	wzr, [x29,88]
-	ldr	w0, [x29,88]
+	str	w0, [x21, 20]
+	tst	x22, 3
+	ldr	w0, [x19, 2444]
+	str	w0, [x21, 24]
+	str	wzr, [x29, 88]
+	ldr	w0, [x29, 88]
 	bfi	w0, w1, 9, 5
-	str	w0, [x29,88]
-	ldr	w0, [x29,88]
+	str	w0, [x29, 88]
+	ldr	w0, [x29, 88]
 	orr	w0, w0, 448
-	str	w0, [x29,88]
-	cbnz	x4, .L306
-	ldr	w0, [x29,88]
+	str	w0, [x29, 88]
+	bne	.L340
+	ldr	w0, [x29, 88]
 	mov	w1, 2
 	bfi	w0, w1, 3, 3
-	str	w0, [x29,88]
-.L306:
-	ldr	w0, [x29,88]
-	cmp	w23, wzr
+	str	w0, [x29, 88]
+.L340:
+	ldr	w0, [x29, 88]
+	cmp	w24, 0
 	cset	w1, eq
 	orr	w0, w0, 4
-	str	w0, [x29,88]
-	ldr	w0, [x29,88]
+	str	w0, [x29, 88]
+	ldr	w0, [x29, 88]
 	bfi	w0, w1, 1, 1
-	str	w0, [x29,88]
-	ldr	w0, [x29,88]
+	str	w0, [x29, 88]
+	ldr	w0, [x29, 88]
 	orr	w0, w0, 1
-	str	w0, [x29,88]
-.L295:
-	ldr	w0, [x29,88]
-	str	w0, [x21,16]
-.L294:
-	str	w22, [x21,12]
-	str	w20, [x21,8]
+	str	w0, [x29, 88]
+.L330:
+	ldr	w0, [x29, 88]
+	str	w0, [x21, 16]
+.L329:
+	str	w23, [x21, 12]
+	str	w20, [x21, 8]
 	orr	w20, w20, 4
-	str	w20, [x21,8]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
+	str	w20, [x21, 8]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldr	x25, [sp, 64]
 	ldp	x29, x30, [sp], 96
 	ret
+.L331:
+	ldr	w0, [x1, 2460]
+	mov	w6, 64
+	lsr	w9, w2, 1
+	mov	x8, x5
+	cmp	w0, 25
+	mov	w0, 128
+	csel	w6, w6, w0, cc
+	mov	w7, 0
+	mov	w3, 0
+	mov	w10, -1
+.L335:
+	cmp	w3, w9
+	bcs	.L339
+	lsr	w0, w7, 2
+	cbz	x5, .L336
+	ldr	x11, [x1, 2416]
+	lsl	w0, w0, 2
+	ldr	w12, [x8], 4
+	str	w12, [x11, x0]
+.L337:
+	add	w3, w3, 1
+	add	w7, w7, w6
+	b	.L335
+.L336:
+	ldr	x11, [x1, 2416]
+	lsl	w0, w0, 2
+	str	w10, [x11, x0]
+	b	.L337
+.L332:
+	add	x0, x19, :lo12:.LANCHOR0
+	ldr	x0, [x0, 2408]
+	b	.L333
 	.size	NandcXferStart, .-NandcXferStart
 	.align	2
 	.global	Ftl_log2
@@ -2470,16 +2430,16 @@ NandcXferStart:
 Ftl_log2:
 	mov	w2, 1
 	mov	w1, 0
-.L313:
+.L347:
 	cmp	w2, w0
-	bhi	.L315
-	add	w1, w1, 1
-	lsl	w2, w2, 1
-	uxth	w1, w1
-	b	.L313
-.L315:
+	bls	.L348
 	sub	w0, w1, #1
 	ret
+.L348:
+	add	w1, w1, 1
+	lsl	w2, w2, 1
+	and	w1, w1, 65535
+	b	.L347
 	.size	Ftl_log2, .-Ftl_log2
 	.align	2
 	.global	FtlPrintInfo
@@ -2491,272 +2451,267 @@ FtlPrintInfo:
 	.global	FtlSysBlkNumInit
 	.type	FtlSysBlkNumInit, %function
 FtlSysBlkNumInit:
-	uxth	w0, w0
+	and	w0, w0, 65535
 	mov	w1, 24
-	cmp	w0, 23
-	csel	w0, w0, w1, hi
+	cmp	w0, 24
+	csel	w0, w0, w1, cs
 	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
-	ldrh	w2, [x1,2472]
-	ldrh	w3, [x1,2482]
-	str	w0, [x1,2468]
-	mul	w2, w0, w2
+	and	w0, w0, 65535
+	ldrh	w2, [x1, 2472]
+	ldrh	w3, [x1, 2482]
+	str	w0, [x1, 2468]
+	mul	w2, w2, w0
 	sub	w0, w3, w0
-	strh	w0, [x1,2480]
-	ldr	w0, [x1,2488]
-	str	w2, [x1,2476]
+	strh	w0, [x1, 2480]
+	ldr	w0, [x1, 2488]
+	str	w2, [x1, 2476]
 	sub	w2, w0, w2
 	mov	w0, 0
-	str	w2, [x1,2484]
+	str	w2, [x1, 2484]
 	ret
 	.size	FtlSysBlkNumInit, .-FtlSysBlkNumInit
 	.align	2
 	.global	FtlConstantsInit
 	.type	FtlConstantsInit, %function
 FtlConstantsInit:
-	stp	x29, x30, [sp, -96]!
-	mov	x3, 0
+	mov	x7, x0
+	stp	x29, x30, [sp, -16]!
+	adrp	x5, .LANCHOR0
+	add	x1, x5, :lo12:.LANCHOR0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	adrp	x20, .LANCHOR0
-	mov	x23, x0
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	str	x27, [sp,80]
-	add	x1, x20, :lo12:.LANCHOR0
-	ldrh	w4, [x23,14]
-	ldrh	w6, [x0,8]
-	ldrh	w2, [x0,10]
-	ldrh	w0, [x0,12]
-	strh	w6, [x1,2492]
-	strh	w2, [x1,2494]
-	strh	w0, [x1,2496]
-	strh	w4, [x1,2482]
-.L320:
-	add	x5, x1, 2504
-	strb	w3, [x3,x5]
+	ldrh	w9, [x0, 8]
+	add	x1, x1, 2504
+	ldrh	w2, [x0, 10]
+	mov	x3, 0
+	ldrh	w0, [x0, 12]
+	ldrh	w4, [x7, 14]
+	strh	w9, [x1, -12]
+	strh	w2, [x1, -10]
+	strh	w0, [x1, -8]
+	strh	w4, [x1, -22]
+.L352:
+	strb	w3, [x3, x1]
 	add	x3, x3, 1
 	cmp	x3, 32
-	bne	.L320
-	ldrh	w3, [x23,20]
-	ldrb	w1, [x23,15]
+	bne	.L352
+	ldrh	w3, [x7, 20]
+	ldrb	w1, [x7, 15]
 	cmp	w3, w1
-	bcs	.L321
-	uxtb	w8, w0
+	bcs	.L353
+	and	w11, w0, 255
+	add	x8, x5, :lo12:.LANCHOR0
+	mul	w13, w0, w2
+	ubfiz	w12, w11, 1, 7
+	add	x8, x8, 2504
 	mov	w3, 0
-	mul	w11, w0, w2
-	ubfiz	w10, w8, 1, 7
-	add	x12, x20, :lo12:.LANCHOR0
-.L322:
+.L354:
 	cmp	w3, w0
-	bcs	.L324
-	uxtb	w1, w3
-	mov	w5, w3
-	mov	w7, 0
-.L325:
-	cmp	w7, w2
-	bcs	.L347
-	add	x9, x12, 2504
-	add	w13, w5, w11
-	add	w14, w1, w8
-	add	w7, w7, 1
-	strb	w1, [x9,w5,uxtw]
-	add	w1, w1, w10
-	strb	w14, [x9,x13]
-	add	w5, w5, w0
-	uxtb	w1, w1
-	b	.L325
-.L347:
+	bcs	.L356
+	and	w1, w3, 255
+	mov	w6, w3
+	mov	w10, 0
+	b	.L357
+.L355:
+	add	w14, w13, w6
+	strb	w1, [x8, w6, uxtw]
+	add	w15, w11, w1
+	add	w1, w12, w1
+	add	w10, w10, 1
+	and	w1, w1, 255
+	add	w6, w6, w0
+	strb	w15, [x8, x14]
+.L357:
+	cmp	w10, w2
+	bcc	.L355
 	add	w3, w3, 1
-	b	.L322
-.L324:
-	add	x1, x20, :lo12:.LANCHOR0
-	lsl	w2, w2, 1
+	b	.L354
+.L356:
+	add	x1, x5, :lo12:.LANCHOR0
+	ubfiz	w2, w2, 1, 15
 	lsr	w4, w4, 1
-	strh	w2, [x1,2494]
-	strh	w4, [x1,2482]
-.L321:
-	add	x1, x20, :lo12:.LANCHOR0
+	strh	w2, [x1, 2494]
+	strh	w4, [x1, 2482]
+.L353:
+	add	x1, x5, :lo12:.LANCHOR0
 	mov	w2, 5
-	cmp	w6, 1
-	strh	w2, [x1,2536]
-	strh	wzr, [x1,2538]
-	bne	.L326
-	strh	w6, [x1,2536]
-.L326:
-	add	x1, x20, :lo12:.LANCHOR0
+	cmp	w9, 1
+	strh	w2, [x1, 2536]
+	strh	wzr, [x1, 2538]
+	bne	.L358
+	strh	w9, [x1, 2536]
+.L358:
+	add	x1, x5, :lo12:.LANCHOR0
 	mov	w2, 4352
-	ldrb	w26, [x1,72]
-	strh	w2, [x1,2540]
-	cbz	w26, .L327
+	ldrb	w11, [x1, 72]
+	strh	w2, [x1, 2540]
+	cbz	w11, .L359
 	mov	w2, 384
-	strh	w2, [x1,2540]
-.L327:
-	add	x21, x20, :lo12:.LANCHOR0
-	ldrh	w25, [x23,16]
-	ldrh	w24, [x23,20]
-	ldrh	w27, [x23,18]
-	ldrh	w22, [x21,2494]
-	ldrh	w19, [x21,2482]
-	strh	w25, [x21,2544]
-	mul	w22, w0, w22
-	mul	w0, w19, w0
-	strh	w0, [x21,2542]
-	uxth	w22, w22
-	strh	w27, [x21,2546]
-	strh	w22, [x21,2472]
-	mul	w0, w22, w25
-	strh	w0, [x21,2548]
-	mov	w0, w24
-	strh	w24, [x21,2550]
+	strh	w2, [x1, 2540]
+.L359:
+	add	x4, x5, :lo12:.LANCHOR0
+	ldrh	w10, [x7, 16]
+	ldrh	w8, [x7, 20]
+	ldrh	w9, [x7, 18]
+	ldrh	w6, [x4, 2494]
+	ldrh	w3, [x4, 2482]
+	strh	w10, [x4, 2544]
+	strh	w9, [x4, 2546]
+	mul	w6, w0, w6
+	strh	w8, [x4, 2550]
+	mul	w0, w0, w3
+	and	w6, w6, 65535
+	strh	w0, [x4, 2542]
+	strh	w6, [x4, 2472]
+	mul	w0, w6, w10
+	strh	w0, [x4, 2548]
+	mov	w0, w8
 	bl	Ftl_log2
-	uxth	w3, w0
-	lsl	w2, w24, 9
-	strh	w0, [x21,2552]
-	ldrh	w0, [x23,26]
-	cmp	w19, 1024
-	strh	w2, [x21,2554]
-	ubfx	x2, x2, 9, 7
-	strh	w0, [x21,2558]
-	lsl	w2, w2, 1
-	mul	w0, w22, w19
-	strh	w2, [x21,2556]
-	str	w0, [x21,2488]
-	bls	.L328
-	and	w0, w19, 255
-	strh	w0, [x21,2538]
-.L328:
-	add	x2, x20, :lo12:.LANCHOR0
-	mul	w0, w24, w27
-	ldrh	w1, [x2,2538]
-	sub	w1, w19, w1
-	mul	w1, w22, w1
-	mul	w1, w1, w24
-	mul	w1, w1, w25
-	asr	w1, w1, 11
-	str	w1, [x2,2560]
-	ldrh	w1, [x2,2540]
-	lsl	w1, w1, 3
-	sdiv	w0, w1, w0
-	uxth	w0, w0
+	and	w2, w0, 65535
+	strh	w0, [x4, 2552]
+	ubfiz	w0, w8, 9, 7
+	strh	w0, [x4, 2554]
+	ubfx	w0, w0, 8, 8
+	strh	w0, [x4, 2556]
+	cmp	w3, 1024
+	ldrh	w0, [x7, 26]
+	strh	w0, [x4, 2558]
+	mul	w0, w6, w3
+	str	w0, [x4, 2488]
+	bls	.L360
+	and	w0, w3, 255
+	strh	w0, [x4, 2538]
+.L360:
+	add	x1, x5, :lo12:.LANCHOR0
+	ldrh	w0, [x1, 2538]
+	sub	w0, w3, w0
+	mul	w0, w0, w6
+	mul	w0, w0, w8
+	mul	w8, w9, w8
+	mul	w0, w0, w10
+	asr	w0, w0, 11
+	str	w0, [x1, 2560]
+	ldrh	w0, [x1, 2540]
+	lsl	w0, w0, 3
+	sdiv	w0, w0, w8
+	and	w0, w0, 65535
 	cmp	w0, 4
-	bhi	.L344
-	mov	w0, 4
-.L344:
-	strh	w0, [x2,2564]
-	cbz	w26, .L331
-	add	x0, x20, :lo12:.LANCHOR0
+	bls	.L361
+.L377:
+	strh	w0, [x1, 2564]
+	cbz	w11, .L363
+	add	x0, x5, :lo12:.LANCHOR0
 	mov	w1, 640
-	strh	w1, [x0,2540]
-.L331:
-	add	x1, x20, :lo12:.LANCHOR0
-	lsl	w19, w19, 6
-	cmp	w22, 1
-	ldrh	w0, [x1,2540]
-	asr	w0, w0, w3
-	add	w3, w3, 9
-	asr	w19, w19, w3
-	strh	w19, [x1,2568]
-	and	w19, w19, 65535
+	strh	w1, [x0, 2540]
+.L363:
+	add	x1, x5, :lo12:.LANCHOR0
+	lsl	w3, w3, 6
+	cmp	w6, 1
+	ldrh	w0, [x1, 2540]
+	asr	w0, w0, w2
+	add	w2, w2, 9
 	add	w0, w0, 2
-	strh	w0, [x1,2566]
-	mul	w0, w19, w22
-	str	w0, [x1,2572]
-	add	w19, w19, 8
-	ldrh	w0, [x1,2564]
-	udiv	w0, w0, w22
-	add	w19, w19, w0
-	bne	.L345
-	add	w19, w19, 4
-.L345:
-	str	w19, [x1,2468]
-	add	x19, x20, :lo12:.LANCHOR0
-	ldrh	w0, [x19,2468]
+	strh	w0, [x1, 2566]
+	asr	w3, w3, w2
+	strh	w3, [x1, 2568]
+	and	w3, w3, 65535
+	mul	w0, w6, w3
+	add	w3, w3, 8
+	str	w0, [x1, 2572]
+	ldrh	w0, [x1, 2564]
+	udiv	w0, w0, w6
+	add	w3, w0, w3
+	beq	.L364
+.L378:
+	add	x4, x5, :lo12:.LANCHOR0
+	str	w3, [x1, 2468]
+	ldrh	w0, [x4, 2468]
 	bl	FtlSysBlkNumInit
-	str	wzr, [x19,2584]
-	ldr	w0, [x19,2468]
-	str	w0, [x19,2576]
-	ldr	w0, [x19,2484]
-	ldrh	w1, [x19,2544]
+	ldr	w0, [x4, 2468]
+	str	w0, [x4, 2576]
+	ldr	w0, [x4, 2484]
+	ldrh	w1, [x4, 2544]
+	ldrh	w3, [x4, 2550]
 	lsl	w0, w0, 2
-	ldrh	w3, [x19,2550]
-	ldrh	w2, [x19,2564]
-	mul	w1, w0, w1
-	ldrh	w0, [x19,2552]
-	ldrb	w5, [x19,204]
-	add	w0, w0, 9
-	lsr	w0, w1, w0
+	ldrh	w2, [x4, 2564]
+	ldrb	w7, [x4, 204]
+	str	wzr, [x4, 2584]
+	mul	w0, w0, w1
+	ldrh	w1, [x4, 2552]
+	add	w1, w1, 9
+	lsr	w0, w0, w1
 	mov	w1, 2048
 	add	w0, w0, 2
 	sdiv	w1, w1, w3
-	strh	w1, [x19,2582]
-	uxth	w0, w0
-	strh	w0, [x19,2580]
+	and	w0, w0, 65535
+	strh	w0, [x4, 2580]
+	strh	w1, [x4, 2582]
 	add	w1, w2, 3
-	strh	w1, [x19,2564]
-	ldr	w1, [x19,2572]
-	add	w4, w1, 3
-	str	w4, [x19,2572]
-	cbz	w5, .L334
-	add	w2, w2, 4
+	strh	w1, [x4, 2564]
+	ldr	w1, [x4, 2572]
+	add	w6, w1, 3
+	str	w6, [x4, 2572]
+	cbz	w7, .L366
 	add	w1, w1, 5
-	strh	w2, [x19,2564]
-	b	.L346
-.L334:
-	cmp	w4, 7
-	bhi	.L335
-	mov	w1, 8
-.L346:
-	str	w1, [x19,2572]
-.L335:
-	add	x20, x20, :lo12:.LANCHOR0
-	ldrh	w1, [x20,2480]
-	strh	wzr, [x20,2588]
-	lsr	w2, w1, 3
-	add	w1, w2, w1, lsl 1
-	add	w1, w1, 52
-	add	w0, w1, w0, lsl 2
+	add	w2, w2, 4
+	strh	w2, [x4, 2564]
+.L379:
+	str	w1, [x4, 2572]
+.L367:
+	add	x5, x5, :lo12:.LANCHOR0
+	ldrh	w1, [x5, 2480]
+	strh	wzr, [x5, 2588]
+	lsl	w2, w1, 1
+	lsr	w1, w1, 3
+	add	w2, w2, 48
+	add	w1, w1, 4
+	add	w0, w2, w0, lsl 2
+	add	w0, w0, w1
 	cmp	w0, w3, lsl 9
-	bcs	.L336
+	bcs	.L368
 	mov	w0, 1
-	strh	w0, [x20,2588]
-.L336:
+	strh	w0, [x5, 2588]
+.L368:
 	mov	w0, 0
-	ldr	x27, [sp,80]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 96
+	ldp	x29, x30, [sp], 16
 	ret
+.L361:
+	mov	w0, 4
+	b	.L377
+.L364:
+	add	w3, w3, 4
+	b	.L378
+.L366:
+	cmp	w6, 7
+	bhi	.L367
+	mov	w1, 8
+	b	.L379
 	.size	FtlConstantsInit, .-FtlConstantsInit
 	.align	2
 	.global	IsBlkInVendorPart
 	.type	IsBlkInVendorPart, %function
 IsBlkInVendorPart:
 	adrp	x1, .LANCHOR0
-	uxth	w4, w0
 	add	x1, x1, :lo12:.LANCHOR0
-	mov	w0, 0
-	ldrh	w2, [x1,2590]
-	cbz	w2, .L349
-	ldrh	w2, [x1,2564]
-	ldr	x3, [x1,2592]
+	and	w0, w0, 65535
+	ldrh	w2, [x1, 2590]
+	cbz	w2, .L384
+	ldrh	w2, [x1, 2564]
+	ldr	x3, [x1, 2592]
 	mov	x1, 0
-.L350:
+.L382:
 	cmp	w2, w1, uxth
-	bls	.L355
+	bhi	.L383
+.L384:
+	mov	w0, 0
+	ret
+.L383:
 	add	x1, x1, 1
-	add	x0, x3, x1, lsl 1
-	ldrh	w0, [x0,-2]
-	cmp	w0, w4
-	bne	.L350
+	add	x4, x3, x1, lsl 1
+	ldrh	w4, [x4, -2]
+	cmp	w4, w0
+	bne	.L382
 	mov	w0, 1
-	b	.L349
-.L355:
-	mov	w0, 0
-.L349:
 	ret
 	.size	IsBlkInVendorPart, .-IsBlkInVendorPart
 	.align	2
@@ -2764,29 +2719,33 @@ IsBlkInVendorPart:
 	.type	FtlCacheMetchLpa, %function
 FtlCacheMetchLpa:
 	adrp	x2, .LANCHOR0
-	mov	w6, w0
 	add	x2, x2, :lo12:.LANCHOR0
+	ldr	w4, [x2, 2600]
+	cbz	w4, .L391
+	mov	x5, 24
+	mov	w6, 56
+	ldr	x2, [x2, 2608]
+	nop // between mem op and mult-accumulate
+	umaddl	x4, w4, w6, x5
+	add	x3, x2, 24
+	add	x2, x2, x4
+.L388:
+	cmp	x3, x2
+	bne	.L390
+.L391:
 	mov	w0, 0
-	ldr	w3, [x2,2600]
-	cbz	w3, .L357
-	ldr	x5, [x2,2608]
-	mov	x0, 56
-	mov	x2, 0
-.L358:
-	cmp	w3, w2
-	bls	.L367
-	madd	x4, x2, x0, x5
-	add	x2, x2, 1
-	ldr	w4, [x4,24]
-	cmp	w4, w6
-	bcc	.L358
+	ret
+.L390:
+	ldr	w4, [x3]
+	cmp	w4, w0
+	bcc	.L389
 	cmp	w4, w1
-	bhi	.L358
+	bls	.L392
+.L389:
+	add	x3, x3, 56
+	b	.L388
+.L392:
 	mov	w0, 1
-	b	.L357
-.L367:
-	mov	w0, 0
-.L357:
 	ret
 	.size	FtlCacheMetchLpa, .-FtlCacheMetchLpa
 	.align	2
@@ -2794,7 +2753,7 @@ FtlCacheMetchLpa:
 	.type	FtlGetCap, %function
 FtlGetCap:
 	adrp	x0, .LANCHOR0+2584
-	ldr	w0, [x0,#:lo12:.LANCHOR0+2584]
+	ldr	w0, [x0, #:lo12:.LANCHOR0+2584]
 	ret
 	.size	FtlGetCap, .-FtlGetCap
 	.align	2
@@ -2802,7 +2761,7 @@ FtlGetCap:
 	.type	FtlGetCapacity, %function
 FtlGetCapacity:
 	adrp	x0, .LANCHOR0+2584
-	ldr	w0, [x0,#:lo12:.LANCHOR0+2584]
+	ldr	w0, [x0, #:lo12:.LANCHOR0+2584]
 	ret
 	.size	FtlGetCapacity, .-FtlGetCapacity
 	.align	2
@@ -2810,7 +2769,7 @@ FtlGetCapacity:
 	.type	ftl_get_density, %function
 ftl_get_density:
 	adrp	x0, .LANCHOR0+2584
-	ldr	w0, [x0,#:lo12:.LANCHOR0+2584]
+	ldr	w0, [x0, #:lo12:.LANCHOR0+2584]
 	ret
 	.size	ftl_get_density, .-ftl_get_density
 	.align	2
@@ -2818,7 +2777,7 @@ ftl_get_density:
 	.type	FtlGetLpn, %function
 FtlGetLpn:
 	adrp	x0, .LANCHOR0+2616
-	ldr	w0, [x0,#:lo12:.LANCHOR0+2616]
+	ldr	w0, [x0, #:lo12:.LANCHOR0+2616]
 	ret
 	.size	FtlGetLpn, .-FtlGetLpn
 	.align	2
@@ -2826,33 +2785,34 @@ FtlGetLpn:
 	.type	FtlBbmMapBadBlock, %function
 FtlBbmMapBadBlock:
 	stp	x29, x30, [sp, -32]!
-	uxth	w1, w0
+	and	w1, w0, 65535
 	mov	w4, 1
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	adrp	x19, .LANCHOR0
 	add	x19, x19, :lo12:.LANCHOR0
 	add	x19, x19, 2624
-	ldrh	w3, [x19,-82]
-	udiv	w2, w1, w3
+	ldrh	w0, [x19, -82]
+	udiv	w3, w1, w0
+	and	w2, w3, 65535
+	msub	w3, w3, w0, w1
 	add	x0, x19, w2, uxth 3
-	ldr	x0, [x0,32]
-	msub	w3, w2, w3, w1
-	uxth	w3, w3
-	ubfx	x6, x3, 5, 11
+	and	w3, w3, 65535
+	ldr	x0, [x0, 32]
+	ubfx	x5, x3, 5, 11
+	lsl	x5, x5, 2
 	lsl	w4, w4, w3
-	lsl	x6, x6, 2
-	ldr	w5, [x0,x6]
-	orr	w4, w4, w5
-	str	w4, [x0,x6]
+	ldr	w6, [x0, x5]
+	orr	w4, w4, w6
+	str	w4, [x0, x5]
 	adrp	x0, .LC1
 	add	x0, x0, :lo12:.LC1
 	bl	printk
-	ldrh	w0, [x19,6]
+	ldrh	w0, [x19, 6]
 	add	w0, w0, 1
-	strh	w0, [x19,6]
+	strh	w0, [x19, 6]
 	mov	w0, 0
-	ldr	x19, [sp,16]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	FtlBbmMapBadBlock, .-FtlBbmMapBadBlock
@@ -2861,16 +2821,16 @@ FtlBbmMapBadBlock:
 	.type	FtlBbmIsBadBlock, %function
 FtlBbmIsBadBlock:
 	adrp	x2, .LANCHOR0
-	uxth	w0, w0
 	add	x3, x2, :lo12:.LANCHOR0
-	ldrh	w1, [x3,2542]
+	and	w0, w0, 65535
+	ldrh	w1, [x3, 2542]
 	udiv	w2, w0, w1
 	msub	w0, w2, w1, w0
 	add	x2, x3, w2, uxth 3
-	ldr	x1, [x2,2656]
-	uxth	w0, w0
+	and	w0, w0, 65535
+	ldr	x1, [x2, 2656]
 	ubfx	x3, x0, 5, 11
-	ldr	w1, [x1,x3,lsl 2]
+	ldr	w1, [x1, x3, lsl 2]
 	lsr	w0, w1, w0
 	and	w0, w0, 1
 	ret
@@ -2885,50 +2845,49 @@ FtlBbtInfoPrint:
 	.global	FtlBbtCalcTotleCnt
 	.type	FtlBbtCalcTotleCnt, %function
 FtlBbtCalcTotleCnt:
-	stp	x29, x30, [sp, -48]!
 	adrp	x0, .LANCHOR0
 	add	x0, x0, :lo12:.LANCHOR0
+	mov	w4, 0
+	mov	w5, 0
+	ldrh	w6, [x0, 2542]
+	ldrh	w0, [x0, 2494]
+	mul	w6, w6, w0
+	cmp	w4, w6
+	blt	.L411
+	mov	w0, w5
+	ret
+.L411:
+	stp	x29, x30, [sp, -16]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	str	x21, [sp,32]
-	mov	w19, 0
-	mov	w20, w19
-	ldrh	w1, [x0,2542]
-	ldrh	w21, [x0,2494]
-	mul	w21, w1, w21
-.L376:
-	cmp	w20, w21
-	bge	.L382
-	mov	w0, w20
+.L404:
+	mov	w0, w4
 	bl	FtlBbmIsBadBlock
-	cbz	w0, .L377
-	add	w19, w19, 1
-	uxth	w19, w19
-.L377:
-	add	w20, w20, 1
-	uxth	w20, w20
-	b	.L376
-.L382:
-	mov	w0, w19
-	ldr	x21, [sp,32]
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 48
+	cbz	w0, .L403
+	add	w5, w5, 1
+	and	w5, w5, 65535
+.L403:
+	add	w4, w4, 1
+	and	w4, w4, 65535
+	cmp	w4, w6
+	blt	.L404
+	mov	w0, w5
+	ldp	x29, x30, [sp], 16
 	ret
 	.size	FtlBbtCalcTotleCnt, .-FtlBbtCalcTotleCnt
 	.align	2
 	.global	V2P_block
 	.type	V2P_block, %function
 V2P_block:
-	adrp	x3, .LANCHOR0
-	uxth	w0, w0
-	add	x3, x3, :lo12:.LANCHOR0
-	uxth	w1, w1
-	ldrh	w4, [x3,2496]
-	udiv	w2, w0, w4
-	msub	w0, w2, w4, w0
-	madd	w0, w1, w4, w0
-	ldrh	w1, [x3,2542]
-	madd	w0, w2, w1, w0
+	adrp	x4, .LANCHOR0
+	add	x4, x4, :lo12:.LANCHOR0
+	and	w0, w0, 65535
+	and	w1, w1, 65535
+	ldrh	w2, [x4, 2496]
+	ldrh	w4, [x4, 2542]
+	udiv	w3, w0, w2
+	msub	w0, w3, w2, w0
+	madd	w2, w2, w1, w0
+	madd	w0, w3, w4, w2
 	ret
 	.size	V2P_block, .-V2P_block
 	.align	2
@@ -2936,28 +2895,28 @@ V2P_block:
 	.type	P2V_plane, %function
 P2V_plane:
 	adrp	x2, .LANCHOR0
-	uxth	w0, w0
 	add	x2, x2, :lo12:.LANCHOR0
-	ldrh	w1, [x2,2496]
-	ldrh	w3, [x2,2542]
-	udiv	w2, w0, w1
-	udiv	w3, w0, w3
-	msub	w0, w2, w1, w0
-	madd	w0, w1, w3, w0
+	and	w3, w0, 65535
+	ldrh	w1, [x2, 2496]
+	ldrh	w2, [x2, 2542]
+	udiv	w0, w3, w1
+	udiv	w2, w3, w2
+	msub	w0, w0, w1, w3
+	madd	w0, w1, w2, w0
 	ret
 	.size	P2V_plane, .-P2V_plane
 	.align	2
 	.global	P2V_block_in_plane
 	.type	P2V_block_in_plane, %function
 P2V_block_in_plane:
-	adrp	x2, .LANCHOR0
-	uxth	w0, w0
-	add	x2, x2, :lo12:.LANCHOR0
-	ldrh	w3, [x2,2542]
-	udiv	w1, w0, w3
-	msub	w0, w1, w3, w0
-	ldrh	w1, [x2,2496]
-	uxth	w0, w0
+	adrp	x1, .LANCHOR0
+	add	x1, x1, :lo12:.LANCHOR0
+	and	w3, w0, 65535
+	ldrh	w2, [x1, 2542]
+	ldrh	w1, [x1, 2496]
+	udiv	w0, w3, w2
+	msub	w0, w0, w2, w3
+	and	w0, w0, 65535
 	udiv	w0, w0, w1
 	ret
 	.size	P2V_block_in_plane, .-P2V_block_in_plane
@@ -2967,16 +2926,15 @@ P2V_block_in_plane:
 ftl_cmp_data_ver:
 	cmp	w0, w1
 	mov	w2, -2147483648
-	bls	.L387
+	bls	.L416
 	sub	w1, w0, w1
 	cmp	w1, w2
 	cset	w0, ls
-	b	.L388
-.L387:
+	ret
+.L416:
 	sub	w1, w1, w0
 	cmp	w1, w2
 	cset	w0, hi
-.L388:
 	ret
 	.size	ftl_cmp_data_ver, .-ftl_cmp_data_ver
 	.align	2
@@ -2984,8 +2942,8 @@ ftl_cmp_data_ver:
 	.type	FtlFreeSysBlkQueueEmpty, %function
 FtlFreeSysBlkQueueEmpty:
 	adrp	x0, .LANCHOR0+2726
-	ldrh	w0, [x0,#:lo12:.LANCHOR0+2726]
-	cmp	w0, wzr
+	ldrh	w0, [x0, #:lo12:.LANCHOR0+2726]
+	cmp	w0, 0
 	cset	w0, eq
 	ret
 	.size	FtlFreeSysBlkQueueEmpty, .-FtlFreeSysBlkQueueEmpty
@@ -2994,7 +2952,7 @@ FtlFreeSysBlkQueueEmpty:
 	.type	FtlFreeSysBlkQueueFull, %function
 FtlFreeSysBlkQueueFull:
 	adrp	x0, .LANCHOR0+2726
-	ldrh	w0, [x0,#:lo12:.LANCHOR0+2726]
+	ldrh	w0, [x0, #:lo12:.LANCHOR0+2726]
 	cmp	w0, 1024
 	cset	w0, eq
 	ret
@@ -3004,59 +2962,59 @@ FtlFreeSysBlkQueueFull:
 	.type	FtlFreeSysBlkQueueIn, %function
 FtlFreeSysBlkQueueIn:
 	stp	x29, x30, [sp, -48]!
-	uxth	w1, w1
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	stp	x19, x20, [sp,16]
-	uxth	w21, w0
-	mov	w0, 65533
+	stp	x21, x22, [sp, 32]
+	and	w21, w0, 65535
+	stp	x19, x20, [sp, 16]
 	sub	w2, w21, #1
+	mov	w0, 65533
 	cmp	w0, w2, uxth
-	bcc	.L391
-	adrp	x2, .LANCHOR0
-	add	x0, x2, :lo12:.LANCHOR0
-	mov	x19, x2
-	ldrh	w0, [x0,2726]
-	cmp	w0, 1024
-	beq	.L391
-	cbz	w1, .L393
+	bcc	.L420
+	adrp	x0, .LANCHOR0
+	add	x2, x0, :lo12:.LANCHOR0
+	mov	x19, x0
+	ldrh	w2, [x2, 2726]
+	cmp	w2, 1024
+	beq	.L420
+	and	w1, w1, 65535
+	cbz	w1, .L422
 	adrp	x20, .LANCHOR2
 	add	x20, x20, :lo12:.LANCHOR2
-	ldr	w0, [x20,424]
-	cbnz	w0, .L393
+	ldr	w0, [x20, 424]
+	cbnz	w0, .L422
 	mov	w0, w21
 	bl	P2V_block_in_plane
-	uxth	w22, w0
-	ldr	x0, [x20,432]
+	and	w22, w0, 65535
+	ldr	x0, [x20, 432]
 	lsl	w1, w21, 10
-	str	w1, [x0,4]
-	mov	w1, 1
-	mov	w2, w1
-	ldr	x0, [x20,432]
+	mov	w2, 1
+	str	w1, [x0, 4]
+	mov	w1, w2
+	ldr	x0, [x20, 432]
 	bl	FlashEraseBlocks
+	ldr	x2, [x20, 440]
 	ubfiz	x0, x22, 1, 16
-	ldr	x2, [x20,440]
-	ldrh	w1, [x2,x0]
+	ldrh	w1, [x2, x0]
 	add	w1, w1, 1
-	strh	w1, [x2,x0]
-	ldr	w0, [x20,448]
+	strh	w1, [x2, x0]
+	ldr	w0, [x20, 448]
 	add	w0, w0, 1
-	str	w0, [x20,448]
-.L393:
-	add	x1, x19, :lo12:.LANCHOR0
-	add	x1, x1, 2720
-	ldrh	w0, [x1,6]
-	ldrh	w2, [x1,4]
-	add	w0, w0, 1
-	strh	w0, [x1,6]
-	add	x0, x1, w2, sxtw 1
-	add	w2, w2, 1
-	and	w2, w2, 1023
-	strh	w21, [x0,8]
-	strh	w2, [x1,4]
-.L391:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
+	str	w0, [x20, 448]
+.L422:
+	add	x0, x19, :lo12:.LANCHOR0
+	add	x0, x0, 2720
+	ldrh	w1, [x0, 6]
+	add	w1, w1, 1
+	strh	w1, [x0, 6]
+	ldrh	w1, [x0, 4]
+	add	x2, x0, w1, sxtw 1
+	add	w1, w1, 1
+	and	w1, w1, 1023
+	strh	w1, [x0, 4]
+	strh	w21, [x2, 8]
+.L420:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	FtlFreeSysBlkQueueIn, .-FtlFreeSysBlkQueueIn
@@ -3064,123 +3022,119 @@ FtlFreeSysBlkQueueIn:
 	.global	FtlFreeSysBLkSort
 	.type	FtlFreeSysBLkSort, %function
 FtlFreeSysBLkSort:
-	adrp	x0, .LANCHOR2+484
-	ldrh	w6, [x0,#:lo12:.LANCHOR2+484]
 	adrp	x0, .LANCHOR0
 	add	x1, x0, :lo12:.LANCHOR0
 	add	x1, x1, 2720
-	ldrh	w2, [x1,6]
-	cbz	w2, .L400
-	mov	w5, 0
-	ldrh	w3, [x1,2]
-	ldrh	w2, [x1,4]
-	mov	w4, w5
-	and	w6, w6, 31
-.L402:
-	cmp	w4, w6
-	bge	.L410
-	add	x5, x1, w3, sxtw 1
-	ldrh	w7, [x5,8]
-	add	x5, x1, w2, sxtw 1
+	ldrh	w2, [x1, 6]
+	cbz	w2, .L430
+	adrp	x2, .LANCHOR2+484
+	ldrh	w3, [x1, 2]
+	mov	w6, 0
+	mov	w4, 0
+	ldrh	w5, [x2, #:lo12:.LANCHOR2+484]
+	ldrh	w2, [x1, 4]
+	and	w5, w5, 31
+.L432:
+	cmp	w5, w4
+	bgt	.L433
+	cbz	w6, .L430
+	add	x0, x0, :lo12:.LANCHOR0
+	strh	w3, [x0, 2722]
+	strh	w2, [x0, 2724]
+.L430:
+	ret
+.L433:
+	add	x6, x1, w3, sxtw 1
 	add	w4, w4, 1
-	strh	w7, [x5,8]
-	mov	w5, 1
 	add	w3, w3, 1
-	add	w2, w2, w5
-	uxth	w4, w4
+	and	w4, w4, 65535
 	and	w3, w3, 1023
+	ldrh	w7, [x6, 8]
+	add	x6, x1, w2, sxtw 1
+	strh	w7, [x6, 8]
+	mov	w6, 1
+	add	w2, w2, w6
 	and	w2, w2, 1023
-	b	.L402
-.L410:
-	cbz	w5, .L400
-	add	x0, x0, :lo12:.LANCHOR0
-	strh	w3, [x0,2722]
-	strh	w2, [x0,2724]
-.L400:
-	ret
+	b	.L432
 	.size	FtlFreeSysBLkSort, .-FtlFreeSysBLkSort
 	.align	2
 	.global	FtlFreeSysBlkQueueOut
 	.type	FtlFreeSysBlkQueueOut, %function
 FtlFreeSysBlkQueueOut:
-	stp	x29, x30, [sp, -96]!
+	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	adrp	x21, .LANCHOR0
-	stp	x23, x24, [sp,48]
 	add	x21, x21, :lo12:.LANCHOR0
-	adrp	x23, .LC3
-	stp	x19, x20, [sp,16]
-	stp	x25, x26, [sp,64]
-	add	x22, x21, 2720
-	add	x23, x23, :lo12:.LC3
-	mov	x24, x21
-.L412:
-	ldrh	w1, [x22,6]
-	cbz	w1, .L413
+	stp	x19, x20, [sp, 16]
+	add	x20, x21, 2720
+	stp	x23, x24, [sp, 48]
+	mov	x22, x20
+.L440:
+	ldrh	w1, [x20, 6]
+	cbz	w1, .L441
+	ldrh	w0, [x20, 2]
 	adrp	x19, .LANCHOR2
-	ldrh	w2, [x22,2]
-	add	x25, x19, :lo12:.LANCHOR2
+	add	x4, x19, :lo12:.LANCHOR2
 	sub	w1, w1, #1
-	add	x0, x22, w2, sxtw 1
-	strh	w1, [x22,6]
-	add	w2, w2, 1
-	ldrh	w20, [x0,8]
-	ldr	w1, [x25,424]
-	and	w2, w2, 1023
-	strh	w2, [x22,2]
-	cbnz	w1, .L414
-	mov	w0, w20
-	str	x1, [x29,88]
+	strh	w1, [x20, 6]
+	add	x2, x20, w0, sxtw 1
+	add	w0, w0, 1
+	and	w0, w0, 1023
+	strh	w0, [x20, 2]
+	ldr	w0, [x4, 424]
+	ldrh	w23, [x2, 8]
+	cbnz	w0, .L442
+	mov	w0, w23
 	bl	P2V_block_in_plane
-	uxth	w26, w0
-	ldr	x0, [x25,432]
-	lsl	w2, w20, 10
-	ldr	x1, [x29,88]
-	str	w2, [x0,4]
-	ldrb	w0, [x21,204]
-	cbz	w0, .L415
-	ldr	x0, [x25,432]
+	and	w24, w0, 65535
+	ldr	x0, [x4, 432]
+	lsl	w1, w23, 10
+	str	w1, [x0, 4]
+	ldrb	w0, [x21, 204]
+	cbz	w0, .L443
+	ldr	x0, [x4, 432]
 	mov	w2, 1
+	mov	w1, 0
 	bl	FlashEraseBlocks
-.L415:
+.L443:
 	add	x19, x19, :lo12:.LANCHOR2
-	mov	w1, 1
-	mov	w2, w1
-	ldr	x0, [x19,432]
+	mov	w2, 1
+	mov	w1, w2
+	ldr	x0, [x19, 432]
 	bl	FlashEraseBlocks
-	ubfiz	x0, x26, 1, 16
-	ldr	x2, [x19,440]
-	ldrh	w1, [x2,x0]
+	ldr	x2, [x19, 440]
+	ubfiz	x0, x24, 1, 16
+	ldrh	w1, [x2, x0]
 	add	w1, w1, 1
-	strh	w1, [x2,x0]
-	ldr	w0, [x19,448]
+	strh	w1, [x2, x0]
+	ldr	w0, [x19, 448]
 	add	w0, w0, 1
-	str	w0, [x19,448]
-	b	.L414
-.L413:
-	adrp	x0, .LC2
-	add	x0, x0, :lo12:.LC2
-	bl	printk
-.L416:
-	b	.L416
-.L414:
-	sub	w0, w20, #1
+	str	w0, [x19, 448]
+.L442:
+	sub	w0, w23, #1
 	mov	w1, 65533
 	cmp	w1, w0, uxth
-	bcs	.L417
-	ldrh	w2, [x24,2726]
-	mov	x0, x23
-	mov	w1, w20
+	bcs	.L445
+	ldrh	w2, [x22, 6]
+	mov	w1, w23
+	adrp	x0, .LC3
+	add	x0, x0, :lo12:.LC3
 	bl	printk
-	b	.L412
-.L417:
-	mov	w0, w20
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 96
+	b	.L440
+.L441:
+	adrp	x0, .LC2
+	mov	w1, 0
+	add	x0, x0, :lo12:.LC2
+	bl	printk
+.L444:
+	b	.L444
+.L445:
+	mov	w0, w23
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 64
 	ret
 	.size	FtlFreeSysBlkQueueOut, .-FtlFreeSysBlkQueueOut
 	.align	2
@@ -3190,29 +3144,28 @@ test_node_in_list:
 	ldr	x2, [x0]
 	adrp	x0, .LANCHOR2+504
 	mov	x4, -6148914691236517206
-	uxth	w1, w1
+	and	w1, w1, 65535
+	ldr	x3, [x0, #:lo12:.LANCHOR2+504]
+	movk	x4, 0xaaab, lsl 0
 	mov	w5, 65535
-	ldr	x3, [x0,#:lo12:.LANCHOR2+504]
 	sub	x0, x2, x3
 	asr	x0, x0, 1
-	madd	x0, x4, x0, x0
+	mul	x0, x0, x4
 	mov	w4, 6
-	uxth	w0, w0
-.L423:
-	cmp	w1, w0
-	beq	.L424
+	and	w0, w0, 65535
+.L452:
+	cmp	w0, w1
+	beq	.L453
 	ldrh	w0, [x2]
 	cmp	w0, w5
-	beq	.L425
-	umull	x2, w0, w4
-	add	x2, x3, x2
-	b	.L423
-.L424:
+	beq	.L454
+	umaddl	x2, w0, w4, x3
+	b	.L452
+.L453:
 	mov	w0, 1
-	b	.L422
-.L425:
+	ret
+.L454:
 	mov	w0, 0
-.L422:
 	ret
 	.size	test_node_in_list, .-test_node_in_list
 	.align	2
@@ -3220,102 +3173,107 @@ test_node_in_list:
 	.type	insert_data_list, %function
 insert_data_list:
 	adrp	x9, .LANCHOR0
-	uxth	w0, w0
 	add	x9, x9, :lo12:.LANCHOR0
-	ldrh	w1, [x9,2480]
+	and	w0, w0, 65535
+	ldrh	w1, [x9, 2480]
 	cmp	w1, w0
-	bls	.L428
+	bls	.L471
 	adrp	x2, .LANCHOR2
-	mov	w7, 6
-	add	x5, x2, :lo12:.LANCHOR2
+	add	x4, x2, :lo12:.LANCHOR2
+	mov	w5, 6
 	mov	w1, -1
-	umull	x10, w0, w7
 	mov	x3, x2
-	ldr	x11, [x5,504]
-	add	x4, x11, x10
-	strh	w1, [x4,2]
-	strh	w1, [x11,x10]
-	ldr	x1, [x5,512]
-	cbnz	x1, .L429
-	str	x4, [x5,512]
-	b	.L428
-.L429:
+	ldr	x12, [x4, 504]
+	umull	x11, w0, w5
+	add	x6, x12, x11
+	strh	w1, [x6, 2]
+	strh	w1, [x12, x11]
+	ldr	x1, [x4, 512]
+	cbnz	x1, .L458
+	str	x6, [x4, 512]
+.L471:
+	mov	w0, 0
+	ret
+.L458:
+	stp	x29, x30, [sp, -16]!
 	ubfiz	x8, x0, 1, 16
-	ldr	x13, [x5,520]
-	ldrh	w2, [x4,4]
-	mov	x14, -6148914691236517206
-	ldr	x12, [x5,504]
-	mov	w18, 65535
-	ldrh	w6, [x13,x8]
-	cmp	w2, wzr
-	ldrh	w17, [x9,2480]
-	mul	w6, w6, w2
-	sub	x2, x1, x12
+	mov	x15, -6148914691236517206
+	mov	w10, -1
+	add	x29, sp, 0
+	ldr	x14, [x4, 520]
+	movk	x15, 0xaaab, lsl 0
+	ldrh	w2, [x6, 4]
+	mov	w30, 65535
+	ldr	x13, [x4, 504]
+	cmp	w2, 0
+	ldrh	w18, [x9, 2480]
+	ldrh	w7, [x14, x8]
+	mul	w7, w7, w2
+	sub	x2, x1, x13
 	asr	x2, x2, 1
-	csinv	w6, w6, wzr, ne
-	madd	x2, x14, x2, x2
-	ldr	x14, [x5,440]
-	mov	w5, 0
-	add	x9, x14, x8
-	uxth	w2, w2
-	mov	w8, w7
-.L437:
-	add	w5, w5, 1
+	csel	w7, w7, w10, ne
+	mul	x2, x2, x15
+	ldr	x15, [x4, 440]
+	mov	w4, 0
+	add	x9, x15, x8
+	and	w2, w2, 65535
+	mov	w8, w5
+.L466:
+	add	w4, w4, 1
+	and	w4, w4, 65535
+	cmp	w4, w18
+	bhi	.L457
 	cmp	w0, w2
-	uxth	w5, w5
-	beq	.L428
-	cmp	w5, w17
-	bhi	.L428
-	ubfiz	x15, x2, 1, 16
-	ldrh	w16, [x1,4]
-	cmp	w16, wzr
-	ldrh	w7, [x13,x15]
-	mul	w7, w7, w16
-	csinv	w7, w7, wzr, ne
-	cmp	w7, w6
-	bne	.L433
-	ldrh	w15, [x14,x15]
-	ldrh	w7, [x9]
-	cmp	w15, w7
-	bcc	.L435
-	b	.L434
-.L433:
-	bhi	.L434
-.L435:
-	ldrh	w7, [x1]
-	cmp	w7, w18
-	bne	.L436
-	strh	w2, [x4,2]
+	beq	.L457
+	ubfiz	x16, x2, 1, 16
+	ldrh	w17, [x1, 4]
+	cmp	w17, 0
+	ldrh	w5, [x14, x16]
+	mul	w5, w5, w17
+	csel	w5, w5, w10, ne
+	cmp	w7, w5
+	bne	.L462
+	ldrh	w16, [x15, x16]
+	ldrh	w5, [x9]
+	cmp	w16, w5
+	bcc	.L464
+.L463:
+	strh	w2, [x12, x11]
+	ldrh	w2, [x1, 2]
+	strh	w2, [x6, 2]
 	add	x2, x3, :lo12:.LANCHOR2
-	strh	w0, [x1]
-	str	x4, [x2,528]
-	b	.L428
-.L436:
-	umull	x1, w7, w8
-	mov	w2, w7
-	add	x1, x12, x1
-	b	.L437
-.L434:
-	strh	w2, [x11,x10]
-	ldrh	w2, [x1,2]
-	strh	w2, [x4,2]
-	add	x2, x3, :lo12:.LANCHOR2
-	ldr	x3, [x2,512]
+	ldr	x3, [x2, 512]
 	cmp	x1, x3
-	bne	.L438
-	strh	w0, [x1,2]
-	str	x4, [x2,512]
-	b	.L428
-.L438:
-	ldrh	w3, [x1,2]
-	mov	w4, 6
-	ldr	x2, [x2,504]
-	umull	x3, w3, w4
-	strh	w0, [x2,x3]
-	strh	w0, [x1,2]
-.L428:
+	bne	.L467
+	strh	w0, [x1, 2]
+	str	x6, [x2, 512]
+	b	.L457
+.L462:
+	bcc	.L463
+.L464:
+	ldrh	w5, [x1]
+	cmp	w5, w30
+	bne	.L465
+	strh	w2, [x6, 2]
+	add	x2, x3, :lo12:.LANCHOR2
+	strh	w0, [x1]
+	str	x6, [x2, 528]
+.L457:
 	mov	w0, 0
+	ldp	x29, x30, [sp], 16
 	ret
+.L465:
+	umaddl	x1, w5, w8, x13
+	mov	w2, w5
+	b	.L466
+.L467:
+	ldrh	w3, [x1, 2]
+	mov	w4, 6
+	ldr	x2, [x2, 504]
+	umull	x3, w3, w4
+	strh	w0, [x2, x3]
+	strh	w0, [x1, 2]
+	b	.L457
 	.size	insert_data_list, .-insert_data_list
 	.align	2
 	.global	INSERT_DATA_LIST
@@ -3326,9 +3284,9 @@ INSERT_DATA_LIST:
 	bl	insert_data_list
 	adrp	x0, .LANCHOR2
 	add	x0, x0, :lo12:.LANCHOR2
-	ldrh	w1, [x0,536]
+	ldrh	w1, [x0, 536]
 	add	w1, w1, 1
-	strh	w1, [x0,536]
+	strh	w1, [x0, 536]
 	ldp	x29, x30, [sp], 16
 	ret
 	.size	INSERT_DATA_LIST, .-INSERT_DATA_LIST
@@ -3336,71 +3294,71 @@ INSERT_DATA_LIST:
 	.global	insert_free_list
 	.type	insert_free_list, %function
 insert_free_list:
-	uxth	w0, w0
+	and	w0, w0, 65535
 	mov	w7, 65535
 	cmp	w0, w7
-	beq	.L443
+	beq	.L476
 	adrp	x2, .LANCHOR2
-	mov	w6, 6
 	add	x5, x2, :lo12:.LANCHOR2
+	mov	w6, 6
 	mov	w1, -1
-	umull	x8, w0, w6
 	mov	x3, x2
-	ldr	x9, [x5,504]
+	ldr	x9, [x5, 504]
+	umull	x8, w0, w6
 	add	x4, x9, x8
-	strh	w1, [x4,2]
-	strh	w1, [x9,x8]
-	ldr	x1, [x5,544]
-	cbnz	x1, .L444
-	str	x4, [x5,544]
-	b	.L443
-.L444:
-	ldr	x11, [x5,440]
+	strh	w1, [x4, 2]
+	strh	w1, [x9, x8]
+	ldr	x1, [x5, 544]
+	cbnz	x1, .L477
+	str	x4, [x5, 544]
+.L476:
+	mov	w0, 0
+	ret
+.L477:
+	ldr	x11, [x5, 440]
 	ubfiz	x2, x0, 1, 16
-	ldr	x10, [x5,504]
+	ldr	x10, [x5, 504]
 	mov	x5, -6148914691236517206
-	ldrh	w12, [x11,x2]
+	movk	x5, 0xaaab, lsl 0
+	ldrh	w12, [x11, x2]
 	sub	x2, x1, x10
 	asr	x2, x2, 1
-	madd	x2, x5, x2, x2
-	uxth	w2, w2
-.L447:
+	mul	x2, x2, x5
+	and	w2, w2, 65535
+.L480:
 	ubfiz	x5, x2, 1, 16
-	ldrh	w5, [x11,x5]
+	ldrh	w5, [x11, x5]
 	cmp	w5, w12
-	bcs	.L445
+	bcs	.L478
 	ldrh	w5, [x1]
 	cmp	w5, w7
-	bne	.L446
-	strh	w2, [x4,2]
+	bne	.L479
+	strh	w2, [x4, 2]
 	strh	w0, [x1]
-	b	.L443
-.L446:
-	umull	x1, w5, w6
+	b	.L476
+.L479:
+	umaddl	x1, w5, w6, x10
 	mov	w2, w5
-	add	x1, x10, x1
-	b	.L447
-.L445:
-	ldrh	w5, [x1,2]
-	strh	w5, [x4,2]
-	strh	w2, [x9,x8]
+	b	.L480
+.L478:
+	ldrh	w5, [x1, 2]
+	strh	w5, [x4, 2]
+	strh	w2, [x9, x8]
 	add	x2, x3, :lo12:.LANCHOR2
-	ldr	x3, [x2,544]
+	ldr	x3, [x2, 544]
 	cmp	x1, x3
-	bne	.L448
-	strh	w0, [x1,2]
-	str	x4, [x2,544]
-	b	.L443
-.L448:
-	ldrh	w3, [x1,2]
+	bne	.L481
+	strh	w0, [x1, 2]
+	str	x4, [x2, 544]
+	b	.L476
+.L481:
+	ldrh	w3, [x1, 2]
 	mov	w4, 6
-	ldr	x2, [x2,504]
+	ldr	x2, [x2, 504]
 	umull	x3, w3, w4
-	strh	w0, [x2,x3]
-	strh	w0, [x1,2]
-.L443:
-	mov	w0, 0
-	ret
+	strh	w0, [x2, x3]
+	strh	w0, [x1, 2]
+	b	.L476
 	.size	insert_free_list, .-insert_free_list
 	.align	2
 	.global	INSERT_FREE_LIST
@@ -3411,9 +3369,9 @@ INSERT_FREE_LIST:
 	bl	insert_free_list
 	adrp	x0, .LANCHOR2
 	add	x0, x0, :lo12:.LANCHOR2
-	ldrh	w1, [x0,552]
+	ldrh	w1, [x0, 552]
 	add	w1, w1, 1
-	strh	w1, [x0,552]
+	strh	w1, [x0, 552]
 	ldp	x29, x30, [sp], 16
 	ret
 	.size	INSERT_FREE_LIST, .-INSERT_FREE_LIST
@@ -3421,195 +3379,194 @@ INSERT_FREE_LIST:
 	.global	List_remove_node
 	.type	List_remove_node, %function
 List_remove_node:
+	and	w1, w1, 65535
 	adrp	x6, .LANCHOR2
-	uxth	w1, w1
 	add	x6, x6, :lo12:.LANCHOR2
-	mov	w5, 6
-	ldr	x3, [x0]
+	mov	w4, 6
+	ldr	x2, [x0]
 	mov	w7, 65535
-	umull	x1, w1, w5
-	ldr	x2, [x6,504]
-	add	x4, x2, x1
-	cmp	x4, x3
-	bne	.L451
-	ldrh	w3, [x2,x1]
-	cmp	w3, w7
-	bne	.L452
+	umull	x1, w1, w4
+	ldr	x3, [x6, 504]
+	add	x5, x3, x1
+	cmp	x5, x2
+	ldrh	w2, [x3, x1]
+	bne	.L485
+	cmp	w2, w7
+	bne	.L486
 	str	xzr, [x0]
-	b	.L453
-.L452:
-	umull	x3, w3, w5
-	add	x3, x2, x3
-	str	x3, [x0]
-	mov	w0, -1
-	strh	w0, [x3,2]
-	b	.L453
-.L451:
-	ldrh	w0, [x2,x1]
-	ldrh	w3, [x4,2]
-	cmp	w0, w7
-	bne	.L454
-	cmp	w3, w0
-	beq	.L453
-	umull	x3, w3, w5
-	mov	w0, -1
-	strh	w0, [x2,x3]
-	b	.L453
-.L454:
-	umull	x0, w0, w5
-	add	x0, x2, x0
-	strh	w3, [x0,2]
-	ldrh	w3, [x4,2]
-	ldr	x0, [x6,504]
-	ldrh	w7, [x2,x1]
-	umull	x3, w3, w5
-	strh	w7, [x0,x3]
-.L453:
+.L487:
 	mov	w0, -1
-	strh	w0, [x2,x1]
-	strh	w0, [x4,2]
+	strh	w0, [x3, x1]
+	strh	w0, [x5, 2]
 	mov	w0, 0
 	ret
+.L486:
+	umaddl	x2, w2, w4, x3
+	str	x2, [x0]
+	mov	w0, -1
+	strh	w0, [x2, 2]
+	b	.L487
+.L485:
+	cmp	w2, w7
+	ldrh	w0, [x5, 2]
+	bne	.L488
+	cmp	w0, w2
+	beq	.L487
+	umull	x2, w0, w4
+	mov	w0, -1
+	strh	w0, [x3, x2]
+	b	.L487
+.L488:
+	umaddl	x2, w2, w4, x3
+	strh	w0, [x2, 2]
+	ldrh	w2, [x5, 2]
+	ldr	x0, [x6, 504]
+	ldrh	w7, [x3, x1]
+	umull	x2, w2, w4
+	strh	w7, [x0, x2]
+	b	.L487
 	.size	List_remove_node, .-List_remove_node
 	.align	2
 	.global	List_pop_index_node
 	.type	List_pop_index_node, %function
 List_pop_index_node:
-	stp	x29, x30, [sp, -32]!
-	uxth	w1, w1
-	add	x29, sp, 0
-	str	x19, [sp,16]
-	mov	w19, 65535
 	ldr	x2, [x0]
-	cbz	x2, .L456
+	cbz	x2, .L495
+	stp	x29, x30, [sp, -16]!
 	adrp	x3, .LANCHOR2+504
-	mov	w5, w19
-	mov	w6, 6
-	ldr	x4, [x3,#:lo12:.LANCHOR2+504]
-.L457:
-	cbnz	w1, .L458
-.L460:
-	sub	x2, x2, x4
-	mov	x1, -6148914691236517206
-	asr	x2, x2, 1
-	madd	x2, x1, x2, x2
-	uxth	w19, w2
-	mov	w1, w19
+	and	w1, w1, 65535
+	mov	w4, 65535
+	add	x29, sp, 0
+	ldr	x8, [x3, #:lo12:.LANCHOR2+504]
+	mov	w5, 6
+.L491:
+	cbnz	w1, .L492
+.L494:
+	sub	x8, x2, x8
+	mov	x2, -6148914691236517206
+	asr	x8, x8, 1
+	movk	x2, 0xaaab, lsl 0
+	mul	x8, x8, x2
+	and	w8, w8, 65535
+	mov	w1, w8
 	bl	List_remove_node
-	b	.L456
-.L458:
+	mov	w0, w8
+	ldp	x29, x30, [sp], 16
+	ret
+.L492:
 	ldrh	w3, [x2]
-	cmp	w3, w5
-	beq	.L460
-	umull	x3, w3, w6
+	cmp	w3, w4
+	beq	.L494
 	sub	w1, w1, #1
-	add	x2, x4, x3
-	uxth	w1, w1
-	b	.L457
-.L456:
-	mov	w0, w19
-	ldr	x19, [sp,16]
-	ldp	x29, x30, [sp], 32
+	umaddl	x2, w3, w5, x8
+	and	w1, w1, 65535
+	b	.L491
+.L495:
+	mov	w0, 65535
 	ret
 	.size	List_pop_index_node, .-List_pop_index_node
 	.align	2
 	.global	List_get_gc_head_node
 	.type	List_get_gc_head_node, %function
 List_get_gc_head_node:
-	adrp	x2, .LANCHOR2
-	uxth	w3, w0
-	add	x2, x2, :lo12:.LANCHOR2
+	and	w2, w0, 65535
+	adrp	x0, .LANCHOR2
+	add	x0, x0, :lo12:.LANCHOR2
+	ldr	x1, [x0, 512]
+	cbz	x1, .L505
+	ldr	x3, [x0, 504]
+	mov	w4, 6
+	mov	w0, 65535
+.L502:
+	cbz	w2, .L503
+	ldrh	w1, [x1]
+	cmp	w1, w0
+	bne	.L504
+	ret
+.L504:
+	sub	w2, w2, #1
+	umaddl	x1, w1, w4, x3
+	and	w2, w2, 65535
+	b	.L502
+.L505:
 	mov	w0, 65535
-	ldr	x1, [x2,512]
-	cbz	x1, .L468
-	ldr	x4, [x2,504]
-	mov	w5, 6
-.L464:
-	cbz	w3, .L465
-	ldrh	w2, [x1]
-	cmp	w2, w0
-	beq	.L468
-	umull	x2, w2, w5
-	sub	w3, w3, #1
-	add	x1, x4, x2
-	uxth	w3, w3
-	b	.L464
-.L465:
-	sub	x1, x1, x4
-	mov	x0, -6148914691236517206
-	asr	x1, x1, 1
-	madd	x1, x0, x1, x1
-	uxth	w0, w1
-.L468:
+	ret
+.L503:
+	sub	x0, x1, x3
+	mov	x1, -6148914691236517206
+	asr	x0, x0, 1
+	movk	x1, 0xaaab, lsl 0
+	mul	x0, x0, x1
+	and	w0, w0, 65535
 	ret
 	.size	List_get_gc_head_node, .-List_get_gc_head_node
 	.align	2
 	.global	List_update_data_list
 	.type	List_update_data_list, %function
 List_update_data_list:
-	stp	x29, x30, [sp, -32]!
-	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x19, .LANCHOR2
-	uxth	w20, w0
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w1, [x0,560]
-	cmp	w1, w20
-	beq	.L470
-	ldrh	w1, [x0,608]
-	cmp	w1, w20
-	beq	.L470
-	ldrh	w1, [x0,656]
-	cmp	w1, w20
-	beq	.L470
-	mov	w3, 6
-	ldr	x4, [x0,504]
-	ldr	x2, [x0,512]
-	umull	x3, w20, w3
-	add	x1, x4, x3
-	cmp	x1, x2
-	beq	.L470
-	ldr	x5, [x0,520]
-	ubfiz	x0, x20, 1, 16
-	ldrh	w2, [x5,x0]
-	ldrh	w0, [x1,4]
-	ldrh	w1, [x1,2]
-	cmp	w0, wzr
-	mul	w2, w2, w0
-	mov	w0, 65535
+	adrp	x8, .LANCHOR2
+	add	x1, x8, :lo12:.LANCHOR2
+	and	w9, w0, 65535
+	ldrh	w0, [x1, 560]
+	cmp	w0, w9
+	beq	.L514
+	ldrh	w0, [x1, 608]
+	cmp	w0, w9
+	beq	.L514
+	ldrh	w0, [x1, 656]
+	cmp	w0, w9
+	beq	.L514
+	mov	w4, 6
+	ldp	x3, x2, [x1, 504]
+	umull	x4, w9, w4
+	add	x0, x3, x4
+	cmp	x0, x2
+	beq	.L514
+	ldr	x5, [x1, 520]
+	ubfiz	x1, x9, 1, 16
+	ldrh	w2, [x5, x1]
+	ldrh	w1, [x0, 4]
+	ldrh	w0, [x0, 2]
+	cmp	w1, 0
+	mul	w2, w2, w1
+	mov	w1, 65535
 	csinv	w2, w2, wzr, ne
-	cmp	w1, w0
-	bne	.L472
-	ldrh	w0, [x4,x3]
 	cmp	w0, w1
-	beq	.L470
-.L472:
-	mov	w0, 6
-	mov	x3, -6148914691236517206
-	umull	x1, w1, w0
-	asr	x0, x1, 1
-	add	x1, x4, x1
-	madd	x0, x3, x0, x0
-	ldrh	w1, [x1,4]
-	ldrh	w0, [x5,x0,lsl 1]
-	cmp	w1, wzr
-	mul	w0, w0, w1
+	bne	.L509
+	ldrh	w1, [x3, x4]
+	cmp	w1, w0
+	beq	.L514
+.L509:
+	mov	w1, 6
+	mov	x4, -6148914691236517206
+	movk	x4, 0xaaab, lsl 0
+	umull	x0, w0, w1
+	asr	x1, x0, 1
+	add	x0, x3, x0
+	mul	x1, x1, x4
+	ldrh	w3, [x0, 4]
+	cmp	w3, 0
+	ldrh	w1, [x5, x1, lsl 1]
+	mul	w0, w1, w3
 	csinv	w0, w0, wzr, ne
 	cmp	w2, w0
-	bcs	.L470
-	add	x19, x19, :lo12:.LANCHOR2
-	mov	w1, w20
-	add	x0, x19, 512
+	bcs	.L514
+	add	x8, x8, :lo12:.LANCHOR2
+	stp	x29, x30, [sp, -16]!
+	mov	w1, w9
+	add	x0, x8, 512
+	add	x29, sp, 0
 	bl	List_remove_node
-	ldrh	w0, [x19,536]
+	ldrh	w0, [x8, 536]
 	sub	w0, w0, #1
-	strh	w0, [x19,536]
-	mov	w0, w20
+	strh	w0, [x8, 536]
+	mov	w0, w9
 	bl	INSERT_DATA_LIST
-.L470:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 32
+	ldp	x29, x30, [sp], 16
+	ret
+.L514:
+	mov	w0, 0
 	ret
 	.size	List_update_data_list, .-List_update_data_list
 	.align	2
@@ -3618,52 +3575,51 @@ List_update_data_list:
 ftl_map_blk_alloc_new_blk:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
+	stp	x19, x20, [sp, 16]
 	mov	w20, 0
-	ldrh	w2, [x0,10]
-	ldr	x1, [x0,16]
-.L477:
+	str	x21, [sp, 32]
+	ldrh	w2, [x0, 10]
+	ldr	x1, [x0, 16]
+.L518:
 	cmp	w20, w2
-	beq	.L481
-	mov	x22, x1
-	ldrh	w21, [x1],2
-	cbnz	w21, .L478
+	beq	.L522
+	mov	x21, x1
+	ldrh	w3, [x1], 2
+	cbnz	w3, .L519
 	mov	x19, x0
 	bl	FtlFreeSysBlkQueueOut
-	strh	w0, [x22]
-	uxth	w1, w0
+	and	w1, w0, 65535
+	strh	w0, [x21]
 	sub	w2, w1, #1
 	mov	w0, 65533
 	cmp	w0, w2, uxth
-	bcs	.L479
-	adrp	x2, .LANCHOR0+2726
+	bcs	.L520
+	adrp	x0, .LANCHOR0+2726
+	ldrh	w2, [x0, #:lo12:.LANCHOR0+2726]
 	adrp	x0, .LC4
 	add	x0, x0, :lo12:.LC4
-	ldrh	w2, [x2,#:lo12:.LANCHOR0+2726]
 	bl	printk
-.L480:
-	b	.L480
-.L479:
-	ldr	w0, [x19,48]
-	strh	w21, [x19,2]
+.L521:
+	b	.L521
+.L520:
+	ldr	w0, [x19, 48]
+	strh	wzr, [x19, 2]
 	add	w0, w0, 1
-	str	w0, [x19,48]
-	ldrh	w0, [x19,8]
+	str	w0, [x19, 48]
+	ldrh	w0, [x19, 8]
 	strh	w20, [x19]
 	add	w0, w0, 1
-	strh	w0, [x19,8]
-	b	.L481
-.L478:
-	add	w20, w20, 1
-	uxth	w20, w20
-	b	.L477
-.L481:
+	strh	w0, [x19, 8]
+.L522:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
+.L519:
+	add	w20, w20, 1
+	and	w20, w20, 65535
+	b	.L518
 	.size	ftl_map_blk_alloc_new_blk, .-ftl_map_blk_alloc_new_blk
 	.align	2
 	.global	select_l2p_ram_region
@@ -3672,69 +3628,64 @@ select_l2p_ram_region:
 	adrp	x0, .LANCHOR0+2582
 	mov	x4, 0
 	mov	w5, 65535
-	ldrh	w2, [x0,#:lo12:.LANCHOR0+2582]
+	ldrh	w2, [x0, #:lo12:.LANCHOR0+2582]
 	adrp	x0, .LANCHOR2
 	add	x1, x0, :lo12:.LANCHOR2
 	mov	x3, x0
-	ldr	x1, [x1,704]
-.L484:
-	uxth	w0, w4
+	ldr	x1, [x1, 704]
+.L526:
+	and	w0, w4, 65535
 	cmp	w0, w2
-	bcs	.L500
-	add	x4, x4, 1
-	add	x6, x1, x4, lsl 4
-	ldrh	w6, [x6,-16]
-	cmp	w6, w5
-	bne	.L484
-	b	.L485
-.L500:
+	bcc	.L528
+	add	x5, x1, 4
 	mov	w0, w2
-	mov	x4, 0
 	mov	w7, -2147483648
-.L487:
-	uxth	w6, w4
-	cmp	w6, w2
-	bcs	.L501
-	add	x5, x1, x4, lsl 4
-	ldr	w5, [x5,4]
-	tbnz	w5, #31, .L496
-	cmp	w5, w7
-	bcc	.L488
-.L496:
-	mov	w5, w7
-	mov	w6, w0
-.L488:
-	add	x4, x4, 1
-	mov	w7, w5
-	mov	w0, w6
-	b	.L487
-.L501:
+	mov	w4, 0
+.L529:
+	cmp	w4, w2
+	bne	.L531
 	cmp	w0, w2
-	bcc	.L485
+	bcc	.L527
 	add	x0, x3, :lo12:.LANCHOR2
-	add	x1, x1, 4
 	mov	w4, -1
 	mov	w3, 0
-	ldrh	w5, [x0,712]
+	ldrh	w5, [x0, 712]
 	mov	w0, w2
-.L491:
+.L532:
 	cmp	w3, w2
-	beq	.L485
-	ldr	w7, [x1]
-	cmp	w7, w4
-	bcs	.L492
-	ldrh	w6, [x1,-4]
+	beq	.L527
+	ldr	w7, [x1, 4]
+	cmp	w4, w7
+	bls	.L533
+	ldrh	w6, [x1]
 	cmp	w6, w5
 	csel	w4, w4, w7, eq
-	cmp	w6, w5
 	csel	w0, w0, w3, eq
-.L492:
+.L533:
 	add	w3, w3, 1
 	add	x1, x1, 16
-	uxth	w3, w3
-	b	.L491
-.L485:
+	and	w3, w3, 65535
+	b	.L532
+.L528:
+	add	x4, x4, 1
+	add	x6, x1, x4, lsl 4
+	ldrh	w6, [x6, -16]
+	cmp	w6, w5
+	bne	.L526
+.L527:
 	ret
+.L531:
+	ldr	w6, [x5]
+	tbnz	w6, #31, .L530
+	cmp	w7, w6
+	bls	.L530
+	mov	w7, w6
+	mov	w0, w4
+.L530:
+	add	w4, w4, 1
+	add	x5, x5, 16
+	and	w4, w4, 65535
+	b	.L529
 	.size	select_l2p_ram_region, .-select_l2p_ram_region
 	.align	2
 	.global	FtlUpdateVaildLpn
@@ -3742,72 +3693,70 @@ select_l2p_ram_region:
 FtlUpdateVaildLpn:
 	adrp	x1, .LANCHOR2
 	add	x3, x1, :lo12:.LANCHOR2
-	ldrh	w2, [x3,714]
-	cbnz	w0, .L503
+	ldrh	w2, [x3, 714]
 	cmp	w2, 4
-	bhi	.L503
+	bhi	.L536
+	cbnz	w0, .L536
 	add	w2, w2, 1
-	strh	w2, [x3,714]
-	b	.L502
-.L503:
-	adrp	x2, .LANCHOR0+2480
-	add	x0, x1, :lo12:.LANCHOR2
-	mov	w7, 65535
-	ldrh	w5, [x2,#:lo12:.LANCHOR0+2480]
-	strh	wzr, [x0,714]
-	str	wzr, [x0,716]
-	ldr	x6, [x0,520]
-	mov	x0, 0
-.L504:
-	cmp	w5, w0, uxth
-	bls	.L502
-	ldrh	w4, [x6,x0,lsl 1]
-	cmp	w4, w7
-	beq	.L505
-	add	x3, x1, :lo12:.LANCHOR2
-	ldr	w2, [x3,716]
-	add	w2, w4, w2
-	str	w2, [x3,716]
-.L505:
-	add	x0, x0, 1
-	b	.L504
-.L502:
+	strh	w2, [x3, 714]
 	ret
+.L536:
+	add	x0, x1, :lo12:.LANCHOR2
+	adrp	x1, .LANCHOR0+2480
+	mov	w6, 65535
+	ldrh	w4, [x1, #:lo12:.LANCHOR0+2480]
+	mov	x1, 0
+	ldr	x5, [x0, 520]
+	strh	wzr, [x0, 714]
+	str	wzr, [x0, 716]
+.L537:
+	cmp	w4, w1, uxth
+	bhi	.L539
+	ret
+.L539:
+	ldrh	w3, [x5, x1, lsl 1]
+	cmp	w3, w6
+	beq	.L538
+	ldr	w2, [x0, 716]
+	add	w2, w2, w3
+	str	w2, [x0, 716]
+.L538:
+	add	x1, x1, 1
+	b	.L537
 	.size	FtlUpdateVaildLpn, .-FtlUpdateVaildLpn
 	.align	2
 	.global	ftl_set_blk_mode
 	.type	ftl_set_blk_mode, %function
 ftl_set_blk_mode:
+	and	w0, w0, 65535
+	cbz	w1, .L542
 	stp	x29, x30, [sp, -16]!
-	uxth	w0, w0
 	add	x29, sp, 0
-	cbz	w1, .L509
 	bl	ftl_set_blk_mode.part.9
-	b	.L508
-.L509:
-	adrp	x1, .LANCHOR0
+	ldp	x29, x30, [sp], 16
+	ret
+.L542:
+	adrp	x1, .LANCHOR0+64
 	ubfx	x2, x0, 5, 11
 	lsl	x2, x2, 2
-	ldr	x3, [x1,#:lo12:.LANCHOR0]
+	ldr	x3, [x1, #:lo12:.LANCHOR0+64]
 	mov	w1, 1
 	lsl	w0, w1, w0
-	ldr	w1, [x3,x2]
+	ldr	w1, [x3, x2]
 	bic	w0, w1, w0
-	str	w0, [x3,x2]
-.L508:
-	ldp	x29, x30, [sp], 16
+	str	w0, [x3, x2]
 	ret
 	.size	ftl_set_blk_mode, .-ftl_set_blk_mode
 	.align	2
 	.global	ftl_get_blk_mode
 	.type	ftl_get_blk_mode, %function
 ftl_get_blk_mode:
-	adrp	x1, .LANCHOR0
-	uxth	w0, w0
-	ubfx	x2, x0, 5, 11
-	ldr	x1, [x1,#:lo12:.LANCHOR0]
-	ldr	w1, [x1,x2,lsl 2]
-	lsr	w0, w1, w0
+	and	w1, w0, 65535
+	adrp	x0, .LANCHOR0+64
+	ldr	x0, [x0, #:lo12:.LANCHOR0+64]
+	ubfx	x2, x1, 5, 11
+	ldr	w0, [x0, x2, lsl 2]
+	lsr	w0, w0, w1
 	and	w0, w0, 1
 	ret
 	.size	ftl_get_blk_mode, .-ftl_get_blk_mode
@@ -3815,188 +3764,219 @@ ftl_get_blk_mode:
 	.global	ftl_sb_update_avl_pages
 	.type	ftl_sb_update_avl_pages, %function
 ftl_sb_update_avl_pages:
-	adrp	x3, .LANCHOR0
-	uxth	w1, w1
-	add	x4, x3, :lo12:.LANCHOR0
-	uxth	w2, w2
-	strh	wzr, [x0,4]
-	mov	w6, 65535
-	ldrh	w4, [x4,2472]
-.L513:
-	cmp	w2, w4
-	bcs	.L519
+	and	w6, w1, 65535
+	adrp	x4, .LANCHOR0
+	add	x1, x4, :lo12:.LANCHOR0
+	and	w2, w2, 65535
+	strh	wzr, [x0, 4]
+	ldrh	w3, [x1, 2472]
+	mov	w1, 65535
+.L550:
+	cmp	w3, w2, uxth
+	bhi	.L552
+	add	x4, x4, :lo12:.LANCHOR0
+	ubfiz	x3, x3, 1, 16
+	add	x3, x3, 16
+	add	x2, x0, 16
+	add	x3, x0, x3
+	mov	w5, 65535
+	ldrh	w1, [x4, 2544]
+	sub	w1, w1, #1
+	and	w1, w1, 65535
+	sub	w1, w1, w6
+.L553:
+	cmp	x2, x3
+	bne	.L555
+	ret
+.L552:
 	add	x5, x0, w2, sxtw 1
-	ldrh	w5, [x5,16]
-	cmp	w5, w6
-	beq	.L514
-	ldrh	w5, [x0,4]
+	ldrh	w5, [x5, 16]
+	cmp	w5, w1
+	beq	.L551
+	ldrh	w5, [x0, 4]
 	add	w5, w5, 1
-	strh	w5, [x0,4]
-.L514:
+	strh	w5, [x0, 4]
+.L551:
 	add	w2, w2, 1
-	uxth	w2, w2
-	b	.L513
-.L519:
-	add	x3, x3, :lo12:.LANCHOR0
-	mov	w6, 65535
-	add	x4, x0, w4, uxth 1
-	ldrh	w5, [x3,2544]
-	mov	x3, x0
-.L516:
-	cmp	x3, x4
-	beq	.L520
-	ldrh	w2, [x3,16]
-	cmp	w2, w6
-	beq	.L517
-	ldrh	w2, [x0,4]
-	add	w2, w5, w2
-	sub	w2, w2, #1
-	sub	w2, w2, w1
-	strh	w2, [x0,4]
-.L517:
-	add	x3, x3, 2
-	b	.L516
-.L520:
-	ret
+	b	.L550
+.L555:
+	ldrh	w4, [x2]
+	cmp	w4, w5
+	beq	.L554
+	ldrh	w4, [x0, 4]
+	add	w4, w1, w4
+	strh	w4, [x0, 4]
+.L554:
+	add	x2, x2, 2
+	b	.L553
 	.size	ftl_sb_update_avl_pages, .-ftl_sb_update_avl_pages
 	.align	2
 	.global	make_superblock
 	.type	make_superblock, %function
 make_superblock:
-	stp	x29, x30, [sp, -80]!
+	mov	x5, x0
+	strh	wzr, [x0, 4]
+	strb	wzr, [x0, 7]
+	adrp	x6, .LANCHOR0
+	add	x0, x6, :lo12:.LANCHOR0
+	mov	x7, 0
+	add	x8, x5, 16
+	add	x9, x0, 2504
+	mov	w11, -1
+	ldrh	w10, [x0, 2472]
+	cmp	w10, w7, uxth
+	bhi	.L576
+	add	x1, x6, :lo12:.LANCHOR0
+	ldrb	w0, [x5, 7]
+	strb	wzr, [x5, 9]
+	ldrh	w2, [x1, 2544]
+	mul	w0, w0, w2
+	strh	w0, [x5, 4]
+	ldr	w0, [x1, 2372]
+	cbz	w0, .L572
+	adrp	x0, .LANCHOR2+440
+	ldrh	w1, [x5]
+	ldr	x0, [x0, #:lo12:.LANCHOR2+440]
+	ldrh	w0, [x0, x1, lsl 1]
+	cmp	w0, 79
+	bhi	.L572
+	mov	w0, 1
+	strb	w0, [x5, 9]
+.L572:
+	add	x6, x6, :lo12:.LANCHOR0
+	ldrb	w0, [x6, 72]
+	cbz	w0, .L575
+	mov	w0, 1
+	strb	w0, [x5, 9]
+.L575:
+	mov	w0, 0
+	ret
+.L576:
+	stp	x29, x30, [sp, -16]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	adrp	x20, .LANCHOR0
-	mov	x19, x0
-	strh	wzr, [x0,4]
-	add	x22, x19, 16
-	strb	wzr, [x0,7]
-	add	x0, x20, :lo12:.LANCHOR0
-	mov	x21, 0
-	mov	x23, x0
-	mov	w25, -1
-	ldrh	w24, [x0,2472]
-.L522:
-	cmp	w24, w21, uxth
-	bls	.L533
-	add	x0, x23, 2504
-	ldrh	w1, [x19]
-	ldrb	w0, [x0,x21]
+.L559:
+	ldrh	w1, [x5]
+	ldrb	w0, [x9, x7]
 	bl	V2P_block
-	strh	w25, [x22]
-	mov	w26, w0
+	mov	w4, w0
+	strh	w11, [x8]
 	bl	FtlBbmIsBadBlock
-	cbnz	w0, .L523
-	strh	w26, [x22]
-	ldrb	w0, [x19,7]
+	cbnz	w0, .L558
+	strh	w4, [x8]
+	ldrb	w0, [x5, 7]
 	add	w0, w0, 1
-	strb	w0, [x19,7]
-.L523:
-	add	x21, x21, 1
-	add	x22, x22, 2
-	b	.L522
-.L533:
-	add	x1, x20, :lo12:.LANCHOR0
-	ldrb	w0, [x19,7]
-	strb	wzr, [x19,9]
-	ldrh	w2, [x1,2544]
+	strb	w0, [x5, 7]
+.L558:
+	add	x7, x7, 1
+	add	x8, x8, 2
+	cmp	w10, w7, uxth
+	bhi	.L559
+	add	x1, x6, :lo12:.LANCHOR0
+	ldrb	w0, [x5, 7]
+	strb	wzr, [x5, 9]
+	ldrh	w2, [x1, 2544]
 	mul	w0, w0, w2
-	strh	w0, [x19,4]
-	ldr	w0, [x1,2372]
-	cbz	w0, .L525
+	strh	w0, [x5, 4]
+	ldr	w0, [x1, 2372]
+	cbz	w0, .L560
 	adrp	x0, .LANCHOR2+440
-	ldrh	w1, [x19]
-	ldr	x0, [x0,#:lo12:.LANCHOR2+440]
-	ldrh	w0, [x0,x1,lsl 1]
+	ldrh	w1, [x5]
+	ldr	x0, [x0, #:lo12:.LANCHOR2+440]
+	ldrh	w0, [x0, x1, lsl 1]
 	cmp	w0, 79
-	bhi	.L525
+	bhi	.L560
 	mov	w0, 1
-	strb	w0, [x19,9]
-.L525:
-	add	x20, x20, :lo12:.LANCHOR0
-	ldrb	w0, [x20,72]
-	cbz	w0, .L526
+	strb	w0, [x5, 9]
+.L560:
+	add	x6, x6, :lo12:.LANCHOR0
+	ldrb	w0, [x6, 72]
+	cbz	w0, .L561
 	mov	w0, 1
-	strb	w0, [x19,9]
-.L526:
+	strb	w0, [x5, 9]
+.L561:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 80
+	ldp	x29, x30, [sp], 16
 	ret
 	.size	make_superblock, .-make_superblock
 	.align	2
 	.global	update_multiplier_value
 	.type	update_multiplier_value, %function
 update_multiplier_value:
-	stp	x29, x30, [sp, -64]!
-	adrp	x1, .LANCHOR0
-	add	x1, x1, :lo12:.LANCHOR0
+	and	w7, w0, 65535
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	mov	x8, 0
+	mov	w6, 0
+	add	x5, x0, 2504
+	ldrh	w9, [x0, 2472]
+	ldrh	w10, [x0, 2544]
+	cmp	w9, w8, uxth
+	bhi	.L589
+	cbz	w6, .L587
+	mov	w0, 32768
+	sdiv	w6, w0, w6
+.L588:
+	adrp	x0, .LANCHOR2+504
+	mov	w1, 6
+	ldr	x0, [x0, #:lo12:.LANCHOR2+504]
+	umaddl	x7, w7, w1, x0
+	mov	w0, 0
+	strh	w6, [x7, 4]
+	ret
+.L582:
+	mov	w6, 0
+	b	.L581
+.L587:
+	mov	w6, 0
+	b	.L588
+.L589:
+	stp	x29, x30, [sp, -16]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	mov	x22, 0
-	uxth	w21, w0
-	ldrh	w23, [x1,2472]
-	mov	w19, w22
-	ldrh	w24, [x1,2544]
-	mov	x20, x1
-.L535:
-	cmp	w23, w22, uxth
-	bls	.L542
-	add	x0, x20, 2504
-	mov	w1, w21
-	ldrb	w0, [x0,x22]
+.L580:
+	ldrb	w0, [x5, x8]
+	mov	w1, w7
 	bl	V2P_block
 	bl	FtlBbmIsBadBlock
-	cbnz	w0, .L536
-	add	w19, w19, w24
-	uxth	w19, w19
-.L536:
-	add	x22, x22, 1
-	b	.L535
-.L542:
-	cbz	w19, .L538
+	cbnz	w0, .L579
+	add	w6, w6, w10
+	and	w6, w6, 65535
+.L579:
+	add	x8, x8, 1
+	cmp	w9, w8, uxth
+	bhi	.L580
+	cbz	w6, .L582
 	mov	w0, 32768
-	sdiv	w19, w0, w19
-.L538:
-	mov	w0, 6
-	umull	x21, w21, w0
+	sdiv	w6, w0, w6
+.L581:
 	adrp	x0, .LANCHOR2+504
-	ldr	x0, [x0,#:lo12:.LANCHOR2+504]
-	add	x21, x0, x21
+	mov	w1, 6
+	ldr	x0, [x0, #:lo12:.LANCHOR2+504]
+	umaddl	x7, w7, w1, x0
 	mov	w0, 0
-	strh	w19, [x21,4]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 64
+	strh	w6, [x7, 4]
+	ldp	x29, x30, [sp], 16
 	ret
 	.size	update_multiplier_value, .-update_multiplier_value
 	.align	2
 	.global	GetFreeBlockMinEraseCount
 	.type	GetFreeBlockMinEraseCount, %function
 GetFreeBlockMinEraseCount:
-	adrp	x2, .LANCHOR2
-	add	x2, x2, :lo12:.LANCHOR2
-	ldr	x1, [x2,544]
-	mov	w0, w1
-	cbz	x1, .L544
-	ldr	x0, [x2,504]
-	sub	x1, x1, x0
-	mov	x0, -6148914691236517206
-	asr	x1, x1, 1
-	madd	x1, x0, x1, x1
-	ldr	x0, [x2,440]
-	and	x1, x1, 65535
-	ldrh	w0, [x0,x1,lsl 1]
-.L544:
+	adrp	x1, .LANCHOR2
+	add	x1, x1, :lo12:.LANCHOR2
+	ldr	x0, [x1, 544]
+	cbz	x0, .L592
+	ldr	x2, [x1, 504]
+	ldr	x1, [x1, 440]
+	sub	x0, x0, x2
+	mov	x2, -6148914691236517206
+	asr	x0, x0, 1
+	movk	x2, 0xaaab, lsl 0
+	mul	x0, x0, x2
+	and	x0, x0, 65535
+	ldrh	w0, [x1, x0, lsl 1]
+	ret
+.L592:
+	mov	w0, 0
 	ret
 	.size	GetFreeBlockMinEraseCount, .-GetFreeBlockMinEraseCount
 	.align	2
@@ -4004,45 +3984,46 @@ GetFreeBlockMinEraseCount:
 	.type	GetFreeBlockMaxEraseCount, %function
 GetFreeBlockMaxEraseCount:
 	adrp	x2, .LANCHOR2
-	uxth	w4, w0
-	add	x5, x2, :lo12:.LANCHOR2
-	ldr	x1, [x5,544]
-	mov	w0, w1
-	cbz	x1, .L547
-	ldrh	w3, [x5,552]
-	mov	w0, 7
+	add	x4, x2, :lo12:.LANCHOR2
+	and	w0, w0, 65535
+	ldr	x1, [x4, 544]
+	cbz	x1, .L600
+	ldrh	w3, [x4, 552]
+	mov	w5, 7
+	ldr	x4, [x4, 504]
 	mov	w6, 6
 	mov	w7, 65535
-	mul	w3, w3, w0
-	ldr	x0, [x5,504]
-	asr	w3, w3, 3
-	cmp	w4, w3
-	sub	x1, x1, x0
-	csel	w4, w3, w4, gt
+	sub	x1, x1, x4
+	mul	w3, w3, w5
 	asr	x1, x1, 1
+	asr	w3, w3, 3
+	cmp	w0, w3
+	csel	w0, w3, w0, gt
 	mov	x3, -6148914691236517206
-	madd	x1, x3, x1, x1
+	movk	x3, 0xaaab, lsl 0
+	mul	x1, x1, x3
 	mov	w3, 0
-	uxth	w1, w1
-.L549:
-	cmp	w3, w4
-	beq	.L552
+	and	w1, w1, 65535
+.L596:
+	cmp	w0, w3
+	beq	.L599
 	umull	x5, w1, w6
-	ldrh	w5, [x0,x5]
+	ldrh	w5, [x4, x5]
 	cmp	w5, w7
-	bne	.L550
-.L552:
+	bne	.L597
+.L599:
 	add	x2, x2, :lo12:.LANCHOR2
 	ubfiz	x1, x1, 1, 16
-	ldr	x0, [x2,440]
-	ldrh	w0, [x0,x1]
-	b	.L547
-.L550:
+	ldr	x0, [x2, 440]
+	ldrh	w0, [x0, x1]
+	ret
+.L597:
 	add	w3, w3, 1
 	mov	w1, w5
-	uxth	w3, w3
-	b	.L549
-.L547:
+	and	w3, w3, 65535
+	b	.L596
+.L600:
+	mov	w0, 0
 	ret
 	.size	GetFreeBlockMaxEraseCount, .-GetFreeBlockMaxEraseCount
 	.align	2
@@ -4051,547 +4032,546 @@ GetFreeBlockMaxEraseCount:
 FtlPrintInfo2buf:
 	stp	x29, x30, [sp, -112]!
 	adrp	x1, .LC5
+	add	x1, x1, :lo12:.LC5
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
+	stp	x23, x24, [sp, 48]
 	adrp	x24, .LANCHOR0
-	add	x1, x1, :lo12:.LC5
 	add	x24, x24, :lo12:.LANCHOR0
-	str	x27, [sp,80]
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
+	add	x20, x0, 12
+	stp	x25, x26, [sp, 64]
 	mov	x22, x0
+	str	x27, [sp, 80]
 	bl	strcpy
-	add	x20, x22, 12
-	ldr	w2, [x24,176]
-	adrp	x1, .LC6
+	ldr	w2, [x24, 176]
 	mov	x0, x20
+	adrp	x1, .LC6
 	add	x1, x1, :lo12:.LC6
 	bl	sprintf
 	add	x20, x20, w0, sxtw
-	adrp	x1, .LC7
-	ldr	w2, [x24,2560]
+	ldr	w2, [x24, 2560]
 	mov	x0, x20
+	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	sprintf
 	add	x20, x20, w0, sxtw
 	adrp	x0, .LANCHOR1+504
-	ldr	w0, [x0,#:lo12:.LANCHOR1+504]
+	ldr	w0, [x0, #:lo12:.LANCHOR1+504]
 	cmp	w0, 1
-	beq	.L555
+	beq	.L602
 	sub	w0, w20, w22
-	b	.L556
-.L555:
-	add	x0, x29, 96
-	add	x1, x29, 100
-	add	x2, x29, 104
+.L601:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldr	x27, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L602:
 	add	x3, x29, 108
-	adrp	x25, .LANCHOR2
+	add	x2, x29, 104
+	add	x1, x29, 100
+	add	x0, x29, 96
 	bl	NandcGetTimeCfg
-	add	x23, x25, :lo12:.LANCHOR2
-	ldr	w4, [x29,104]
+	adrp	x25, .LANCHOR2
+	ldp	w4, w5, [x29, 104]
 	adrp	x1, .LC8
-	ldr	w5, [x29,108]
+	ldp	w2, w3, [x29, 96]
 	add	x1, x1, :lo12:.LC8
-	ldr	w3, [x29,100]
 	mov	x0, x20
-	ldr	w2, [x29,96]
+	add	x23, x25, :lo12:.LANCHOR2
 	bl	sprintf
 	add	x21, x20, w0, sxtw
-	adrp	x1, .LC9
 	mov	x0, x21
+	adrp	x1, .LC9
 	add	x1, x1, :lo12:.LC9
-	add	x21, x21, 10
 	bl	strcpy
-	ldr	w2, [x24,2616]
-	adrp	x1, .LC10
+	ldr	w2, [x24, 2616]
+	add	x21, x21, 10
 	mov	x0, x21
+	adrp	x1, .LC10
 	add	x1, x1, :lo12:.LC10
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x23,716]
-	adrp	x1, .LC11
+	ldr	w2, [x23, 716]
 	mov	x0, x21
+	adrp	x1, .LC11
 	add	x1, x1, :lo12:.LC11
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x23,720]
-	adrp	x1, .LC12
+	ldr	w2, [x23, 720]
 	mov	x0, x21
+	adrp	x1, .LC12
 	add	x1, x1, :lo12:.LC12
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x23,724]
-	adrp	x1, .LC13
+	ldr	w2, [x23, 724]
 	mov	x0, x21
+	adrp	x1, .LC13
 	add	x1, x1, :lo12:.LC13
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x23,728]
-	adrp	x1, .LC14
+	ldr	w2, [x23, 728]
 	mov	x0, x21
+	adrp	x1, .LC14
 	add	x1, x1, :lo12:.LC14
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x23,732]
-	adrp	x1, .LC15
+	ldr	w2, [x23, 732]
 	mov	x0, x21
+	adrp	x1, .LC15
 	add	x1, x1, :lo12:.LC15
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x23,736]
-	adrp	x1, .LC16
+	ldr	w2, [x23, 736]
 	mov	x0, x21
+	adrp	x1, .LC16
 	add	x1, x1, :lo12:.LC16
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x23,740]
-	adrp	x1, .LC17
+	ldr	w2, [x23, 740]
 	mov	x0, x21
+	adrp	x1, .LC17
 	add	x1, x1, :lo12:.LC17
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x23,744]
-	adrp	x1, .LC18
+	ldr	w2, [x23, 744]
 	mov	x0, x21
+	adrp	x1, .LC18
 	add	x1, x1, :lo12:.LC18
 	lsr	w2, w2, 11
 	bl	sprintf
+	ldr	w2, [x23, 748]
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x23,748]
-	adrp	x1, .LC19
 	mov	x0, x21
+	adrp	x1, .LC19
 	add	x1, x1, :lo12:.LC19
 	lsr	w2, w2, 11
 	bl	sprintf
+	ldr	w2, [x23, 752]
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x23,752]
-	adrp	x1, .LC20
 	mov	x0, x21
+	adrp	x1, .LC20
 	add	x1, x1, :lo12:.LC20
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x23,756]
+	ldr	w2, [x23, 756]
 	adrp	x1, .LC21
 	add	x1, x1, :lo12:.LC21
 	mov	x0, x21
 	bl	sprintf
 	add	x21, x21, w0, sxtw
 	bl	FtlBbtCalcTotleCnt
-	uxth	w3, w0
-	ldrh	w2, [x24,2630]
-	adrp	x1, .LC22
+	and	w3, w0, 65535
+	ldrh	w2, [x24, 2630]
 	mov	x0, x21
+	adrp	x1, .LC22
 	add	x1, x1, :lo12:.LC22
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x23,552]
-	adrp	x1, .LC23
+	ldrh	w2, [x23, 552]
 	mov	x0, x21
+	adrp	x1, .LC23
 	add	x1, x1, :lo12:.LC23
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x23,760]
-	adrp	x1, .LC24
+	ldr	w2, [x23, 760]
 	mov	x0, x21
+	adrp	x1, .LC24
 	add	x1, x1, :lo12:.LC24
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x23,764]
-	adrp	x1, .LC25
+	ldr	w2, [x23, 764]
 	mov	x0, x21
+	adrp	x1, .LC25
 	add	x1, x1, :lo12:.LC25
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x23,768]
-	adrp	x1, .LC26
+	ldr	w2, [x23, 768]
 	mov	x0, x21
+	adrp	x1, .LC26
 	add	x1, x1, :lo12:.LC26
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x23,448]
-	adrp	x1, .LC27
+	ldr	w2, [x23, 448]
 	mov	x0, x21
+	adrp	x1, .LC27
 	add	x1, x1, :lo12:.LC27
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x23,772]
-	adrp	x1, .LC28
+	ldr	w2, [x23, 772]
 	mov	x0, x21
+	adrp	x1, .LC28
 	add	x1, x1, :lo12:.LC28
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x23,776]
-	adrp	x1, .LC29
+	ldr	w2, [x23, 776]
 	mov	x0, x21
+	adrp	x1, .LC29
 	add	x1, x1, :lo12:.LC29
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x23,486]
-	adrp	x1, .LC30
+	ldrh	w2, [x23, 486]
 	mov	x0, x21
+	adrp	x1, .LC30
 	add	x1, x1, :lo12:.LC30
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x23,484]
-	adrp	x1, .LC31
+	ldrh	w2, [x23, 484]
 	mov	x0, x21
+	adrp	x1, .LC31
 	add	x1, x1, :lo12:.LC31
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x24,2584]
-	adrp	x1, .LC32
+	ldr	w2, [x24, 2584]
 	mov	x0, x21
+	adrp	x1, .LC32
 	add	x1, x1, :lo12:.LC32
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x24,2576]
-	adrp	x1, .LC33
+	ldr	w2, [x24, 2576]
 	mov	x0, x21
+	adrp	x1, .LC33
 	add	x1, x1, :lo12:.LC33
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x24,2468]
-	adrp	x1, .LC34
+	ldr	w2, [x24, 2468]
 	mov	x0, x21
+	adrp	x1, .LC34
 	add	x1, x1, :lo12:.LC34
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x24,2726]
-	adrp	x1, .LC35
+	ldrh	w2, [x24, 2726]
 	mov	x0, x21
+	adrp	x1, .LC35
 	add	x1, x1, :lo12:.LC35
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x24,2480]
-	adrp	x1, .LC36
+	ldrh	w2, [x24, 2480]
 	mov	x0, x21
+	adrp	x1, .LC36
 	add	x1, x1, :lo12:.LC36
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x23,780]
-	adrp	x1, .LC37
+	ldrh	w2, [x23, 780]
 	mov	x0, x21
+	adrp	x1, .LC37
 	add	x1, x1, :lo12:.LC37
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x24,2484]
-	adrp	x1, .LC38
+	ldr	w2, [x24, 2484]
 	mov	x0, x21
+	adrp	x1, .LC38
 	add	x1, x1, :lo12:.LC38
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x23,784]
-	adrp	x1, .LC39
+	ldrh	w2, [x23, 784]
 	mov	x0, x21
+	adrp	x1, .LC39
 	add	x1, x1, :lo12:.LC39
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x24,2624]
-	adrp	x1, .LC40
+	ldrh	w2, [x24, 2624]
 	mov	x0, x21
+	adrp	x1, .LC40
 	add	x1, x1, :lo12:.LC40
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x23,562]
-	adrp	x1, .LC41
+	ldrh	w2, [x23, 562]
 	mov	x0, x21
+	adrp	x1, .LC41
 	add	x1, x1, :lo12:.LC41
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrb	w2, [x23,566]
-	adrp	x1, .LC42
+	ldrb	w2, [x23, 566]
 	mov	x0, x21
+	adrp	x1, .LC42
 	add	x1, x1, :lo12:.LC42
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x23,560]
-	adrp	x1, .LC43
+	ldrh	w2, [x23, 560]
 	mov	x0, x21
+	adrp	x1, .LC43
 	add	x1, x1, :lo12:.LC43
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrb	w2, [x23,568]
-	adrp	x1, .LC44
+	ldrb	w2, [x23, 568]
 	mov	x0, x21
+	adrp	x1, .LC44
 	add	x1, x1, :lo12:.LC44
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x23,564]
-	adrp	x1, .LC45
+	ldrh	w2, [x23, 564]
 	mov	x0, x21
+	adrp	x1, .LC45
 	add	x1, x1, :lo12:.LC45
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w3, [x23,560]
-	adrp	x1, .LC46
-	ldr	x2, [x23,520]
+	ldrh	w1, [x23, 560]
+	ldr	x0, [x23, 520]
+	ldrh	w2, [x0, x1, lsl 1]
 	mov	x0, x21
+	adrp	x1, .LC46
 	add	x1, x1, :lo12:.LC46
-	ldrh	w2, [x2,x3,lsl 1]
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x23,610]
-	adrp	x1, .LC47
+	ldrh	w2, [x23, 610]
 	mov	x0, x21
+	adrp	x1, .LC47
 	add	x1, x1, :lo12:.LC47
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrb	w2, [x23,614]
-	adrp	x1, .LC48
+	ldrb	w2, [x23, 614]
 	mov	x0, x21
+	adrp	x1, .LC48
 	add	x1, x1, :lo12:.LC48
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x23,608]
-	adrp	x1, .LC49
+	ldrh	w2, [x23, 608]
 	mov	x0, x21
+	adrp	x1, .LC49
 	add	x1, x1, :lo12:.LC49
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrb	w2, [x23,616]
-	adrp	x1, .LC50
+	ldrb	w2, [x23, 616]
 	mov	x0, x21
+	adrp	x1, .LC50
 	add	x1, x1, :lo12:.LC50
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x23,612]
-	adrp	x1, .LC51
+	ldrh	w2, [x23, 612]
 	mov	x0, x21
+	adrp	x1, .LC51
 	add	x1, x1, :lo12:.LC51
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w3, [x23,608]
-	adrp	x1, .LC52
-	ldr	x2, [x23,520]
+	ldrh	w1, [x23, 608]
+	ldr	x0, [x23, 520]
+	ldrh	w2, [x0, x1, lsl 1]
 	mov	x0, x21
+	adrp	x1, .LC52
 	add	x1, x1, :lo12:.LC52
-	ldrh	w2, [x2,x3,lsl 1]
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x23,658]
-	adrp	x1, .LC53
+	ldrh	w2, [x23, 658]
 	mov	x0, x21
+	adrp	x1, .LC53
 	add	x1, x1, :lo12:.LC53
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrb	w2, [x23,662]
-	adrp	x1, .LC54
+	ldrb	w2, [x23, 662]
 	mov	x0, x21
+	adrp	x1, .LC54
 	add	x1, x1, :lo12:.LC54
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x23,656]
-	adrp	x1, .LC55
+	ldrh	w2, [x23, 656]
 	mov	x0, x21
+	adrp	x1, .LC55
 	add	x1, x1, :lo12:.LC55
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrb	w2, [x23,664]
-	adrp	x1, .LC56
+	ldrb	w2, [x23, 664]
 	mov	x0, x21
+	adrp	x1, .LC56
 	add	x1, x1, :lo12:.LC56
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x23,660]
-	adrp	x1, .LC57
+	ldrh	w2, [x23, 660]
 	mov	x0, x21
+	adrp	x1, .LC57
 	add	x1, x1, :lo12:.LC57
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x23,802]
-	adrp	x1, .LC58
+	ldrh	w2, [x23, 802]
 	mov	x0, x21
+	adrp	x1, .LC58
 	add	x1, x1, :lo12:.LC58
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrb	w2, [x23,806]
-	adrp	x1, .LC59
+	ldrb	w2, [x23, 806]
 	mov	x0, x21
+	adrp	x1, .LC59
 	add	x1, x1, :lo12:.LC59
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x23,800]
-	adrp	x1, .LC60
+	ldrh	w2, [x23, 800]
 	mov	x0, x21
+	adrp	x1, .LC60
 	add	x1, x1, :lo12:.LC60
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrb	w2, [x23,808]
-	adrp	x1, .LC61
+	ldrb	w2, [x23, 808]
 	mov	x0, x21
+	adrp	x1, .LC61
 	add	x1, x1, :lo12:.LC61
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x23,804]
-	adrp	x1, .LC62
+	ldrh	w2, [x23, 804]
 	mov	x0, x21
+	adrp	x1, .LC62
 	add	x1, x1, :lo12:.LC62
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w3, [x23,848]
+	ldr	w5, [x23, 924]
 	adrp	x1, .LC63
-	ldr	w2, [x24,2372]
+	ldr	w3, [x23, 928]
 	add	x1, x1, :lo12:.LC63
-	ldr	w4, [x23,940]
+	ldr	w4, [x23, 932]
+	ldr	w0, [x24, 2372]
+	ldr	w2, [x23, 1360]
+	orr	w2, w0, w2, lsl 8
 	mov	x0, x21
-	ldr	w5, [x23,932]
-	orr	w2, w2, w3, lsl 8
-	ldr	w3, [x23,936]
 	bl	sprintf
 	add	x19, x21, w0, sxtw
-	ldr	w2, [x23,928]
-	adrp	x1, .LC64
+	ldr	w2, [x23, 920]
 	mov	x0, x19
+	adrp	x1, .LC64
 	add	x1, x1, :lo12:.LC64
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	w2, [x23,952]
-	adrp	x1, .LC65
+	ldr	w2, [x23, 944]
 	mov	x0, x19
+	adrp	x1, .LC65
 	add	x1, x1, :lo12:.LC65
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldrh	w2, [x23,1368]
-	adrp	x1, .LC66
+	ldrh	w2, [x23, 1364]
 	mov	x0, x19
+	adrp	x1, .LC66
 	add	x1, x1, :lo12:.LC66
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldrh	w2, [x23,1370]
-	adrp	x1, .LC67
+	ldrh	w2, [x23, 1366]
 	mov	x0, x19
+	adrp	x1, .LC67
 	add	x1, x1, :lo12:.LC67
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	w2, [x23,1372]
-	adrp	x1, .LC68
+	ldr	w2, [x23, 1368]
 	mov	x0, x19
+	adrp	x1, .LC68
 	add	x1, x1, :lo12:.LC68
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldrh	w2, [x23,1376]
+	ldrh	w2, [x23, 1372]
 	adrp	x1, .LC69
 	add	x1, x1, :lo12:.LC69
 	mov	x0, x19
 	bl	sprintf
 	add	x19, x19, w0, sxtw
 	bl	GetFreeBlockMinEraseCount
-	uxth	w2, w0
+	and	w2, w0, 65535
 	adrp	x1, .LC70
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC70
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldrh	w0, [x23,552]
+	ldrh	w0, [x23, 552]
 	bl	GetFreeBlockMaxEraseCount
-	uxth	w2, w0
+	and	w2, w0, 65535
 	adrp	x1, .LC71
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC71
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldrh	w0, [x23,800]
+	ldrh	w0, [x23, 800]
 	mov	w1, 65535
 	cmp	w0, w1
-	beq	.L557
-	ubfiz	x2, x0, 1, 16
-	ldr	x3, [x23,520]
-	adrp	x1, .LC72
+	beq	.L604
+	ldr	x1, [x23, 520]
+	ubfiz	x0, x0, 1, 16
+	ldrh	w2, [x1, x0]
 	mov	x0, x19
+	adrp	x1, .LC72
 	add	x1, x1, :lo12:.LC72
-	ldrh	w2, [x3,x2]
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-.L557:
+.L604:
 	mov	w0, 0
 	adrp	x23, .LC73
+	bl	List_get_gc_head_node
+	add	x21, x25, :lo12:.LANCHOR2
+	and	w3, w0, 65535
+	add	x23, x23, :lo12:.LC73
 	mov	w20, 0
 	mov	w27, 65535
-	bl	List_get_gc_head_node
 	mov	w26, 6
-	uxth	w3, w0
-	add	x23, x23, :lo12:.LC73
-.L559:
+.L606:
 	cmp	w3, w27
-	beq	.L558
-	add	x21, x25, :lo12:.LANCHOR2
-	ubfiz	x6, x3, 1, 16
+	beq	.L605
 	umull	x24, w3, w26
+	ldr	x0, [x21, 504]
+	ldr	x4, [x21, 440]
+	ubfiz	x1, x3, 1, 16
+	ldr	x2, [x21, 520]
+	add	x0, x0, x24
+	ldrh	w6, [x4, x1]
+	ldrh	w5, [x0, 4]
 	mov	x0, x19
+	ldrh	w4, [x2, x1]
 	mov	w2, w20
-	ldr	x5, [x21,504]
 	mov	x1, x23
-	ldr	x4, [x21,520]
 	add	w20, w20, 1
-	ldr	x7, [x21,440]
-	add	x5, x5, x24
-	ldrh	w4, [x4,x6]
-	ldrh	w5, [x5,4]
-	ldrh	w6, [x7,x6]
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x0, [x21,504]
+	ldr	x0, [x21, 504]
 	cmp	w20, 16
-	ldrh	w3, [x0,x24]
-	bne	.L559
-.L558:
-	add	x1, x25, :lo12:.LANCHOR2
-	adrp	x23, .LC74
+	ldrh	w3, [x0, x24]
+	bne	.L606
+.L605:
+	add	x25, x25, :lo12:.LANCHOR2
+	adrp	x21, .LC74
+	add	x21, x21, :lo12:.LC74
 	mov	w20, 0
-	mov	w27, 65535
+	mov	w24, 65535
 	mov	w26, 6
-	add	x23, x23, :lo12:.LC74
-	ldr	x0, [x1,544]
-	ldr	x3, [x1,504]
-	sub	x3, x0, x3
+	ldr	x0, [x25, 504]
+	ldr	x3, [x25, 544]
+	sub	x3, x3, x0
 	mov	x0, -6148914691236517206
 	asr	x3, x3, 1
-	madd	x3, x0, x3, x3
-	uxth	w3, w3
-.L561:
-	cmp	w3, w27
-	beq	.L560
-	add	x21, x25, :lo12:.LANCHOR2
-	ubfiz	x5, x3, 1, 16
-	umull	x24, w3, w26
-	mov	x0, x19
+	movk	x0, 0xaaab, lsl 0
+	mul	x3, x3, x0
+	and	w3, w3, 65535
+.L608:
+	cmp	w3, w24
+	beq	.L607
+	umull	x23, w3, w26
+	ldr	x0, [x25, 504]
+	ldr	x2, [x25, 440]
+	ubfiz	x1, x3, 1, 16
+	add	x0, x0, x23
+	ldrh	w5, [x2, x1]
 	mov	w2, w20
-	ldr	x4, [x21,504]
-	mov	x1, x23
-	ldr	x6, [x21,440]
+	ldrh	w4, [x0, 4]
+	mov	x1, x21
+	mov	x0, x19
 	add	w20, w20, 1
-	add	x4, x4, x24
-	ldrh	w5, [x6,x5]
-	ldrh	w4, [x4,4]
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x0, [x21,504]
 	cmp	w20, 4
-	ldrh	w3, [x0,x24]
-	bne	.L561
-.L560:
+	beq	.L607
+	ldr	x0, [x25, 504]
+	ldrh	w3, [x0, x23]
+	b	.L608
+.L607:
 	sub	w0, w19, w22
-.L556:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldr	x27, [sp,80]
-	ldp	x29, x30, [sp], 112
-	ret
+	b	.L601
 	.size	FtlPrintInfo2buf, .-FtlPrintInfo2buf
 	.align	2
 	.global	ftl_proc_ftl_read
 	.type	ftl_proc_ftl_read, %function
 ftl_proc_ftl_read:
 	stp	x29, x30, [sp, -32]!
-	adrp	x1, .LC75
-	adrp	x2, .LC76
+	adrp	x2, .LC75
+	adrp	x1, .LC76
+	add	x2, x2, :lo12:.LC75
 	add	x29, sp, 0
-	add	x1, x1, :lo12:.LC75
-	add	x2, x2, :lo12:.LC76
-	stp	x19, x20, [sp,16]
+	add	x1, x1, :lo12:.LC76
+	stp	x19, x20, [sp, 16]
 	mov	x20, x0
 	bl	sprintf
 	add	x19, x20, w0, sxtw
@@ -4599,7 +4579,7 @@ ftl_proc_ftl_read:
 	bl	FtlPrintInfo2buf
 	add	x0, x19, w0, sxtw
 	sub	w0, w0, w20
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	ftl_proc_ftl_read, .-ftl_proc_ftl_read
@@ -4607,330 +4587,318 @@ ftl_proc_ftl_read:
 	.global	GetSwlReplaceBlock
 	.type	GetSwlReplaceBlock, %function
 GetSwlReplaceBlock:
-	stp	x29, x30, [sp, -96]!
+	stp	x29, x30, [sp, -32]!
+	adrp	x8, .LANCHOR2
+	add	x0, x8, :lo12:.LANCHOR2
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x19, .LANCHOR2
-	add	x0, x19, :lo12:.LANCHOR2
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	ldr	w2, [x0,768]
-	ldr	w1, [x0,776]
+	stp	x19, x20, [sp, 16]
+	ldr	w2, [x0, 768]
+	ldr	w1, [x0, 776]
 	cmp	w2, w1
-	bcs	.L566
+	bcs	.L617
 	adrp	x1, .LANCHOR0
-	str	wzr, [x0,760]
 	add	x2, x1, :lo12:.LANCHOR0
-	ldr	x5, [x0,440]
-	mov	x0, 0
-	ldrh	w3, [x2,2480]
-.L567:
-	cmp	w3, w0
-	bls	.L599
-	add	x4, x19, :lo12:.LANCHOR2
-	ldrh	w6, [x5,x0,lsl 1]
-	add	x0, x0, 1
-	ldr	w2, [x4,760]
-	add	w2, w6, w2
-	str	w2, [x4,760]
-	b	.L567
-.L599:
-	add	x2, x19, :lo12:.LANCHOR2
+	ldr	x5, [x0, 440]
+	str	wzr, [x0, 760]
+	ldrh	w3, [x2, 2480]
+	mov	x2, 0
+.L618:
+	cmp	w3, w2
+	bhi	.L619
+	add	x2, x8, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LANCHOR0
-	ldr	w0, [x2,760]
-	ldrh	w1, [x1,2536]
+	ldr	w0, [x2, 760]
+	ldrh	w1, [x1, 2536]
 	udiv	w3, w0, w3
-	str	w3, [x2,768]
-	ldr	w3, [x2,764]
+	str	w3, [x2, 768]
+	ldr	w3, [x2, 764]
 	sub	w0, w0, w3
 	udiv	w0, w0, w1
-	str	w0, [x2,760]
-	b	.L569
-.L566:
-	ldr	w1, [x0,772]
+	str	w0, [x2, 760]
+.L620:
+	add	x1, x8, :lo12:.LANCHOR2
+	ldr	w9, [x1, 776]
+	ldr	w10, [x1, 768]
+	add	w0, w9, 256
+	cmp	w0, w10
+	bls	.L625
+	ldr	w1, [x1, 772]
+	add	w0, w9, 768
+	cmp	w0, w1
+	bls	.L625
+	adrp	x0, .LANCHOR0+2372
+	ldr	w0, [x0, #:lo12:.LANCHOR0+2372]
+	cbnz	w0, .L626
+.L628:
+	mov	w20, 65535
+.L627:
+	mov	w0, w20
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
+	ret
+.L619:
+	ldrh	w4, [x5, x2, lsl 1]
+	add	x2, x2, 1
+	ldr	w6, [x0, 760]
+	add	w4, w4, w6
+	str	w4, [x0, 760]
+	b	.L618
+.L617:
+	ldr	w1, [x0, 772]
 	cmp	w2, w1
-	bls	.L569
+	bls	.L620
 	add	w1, w1, 1
-	adrp	x4, .LANCHOR0
-	str	w1, [x0,772]
-	mov	w0, 0
-.L571:
-	add	x1, x4, :lo12:.LANCHOR0
-	ldrh	w1, [x1,2480]
-	cmp	w0, w1
-	bcs	.L569
-	add	x1, x19, :lo12:.LANCHOR2
-	ubfiz	x2, x0, 1, 32
-	add	w0, w0, 1
-	ldr	x3, [x1,440]
-	ldrh	w1, [x3,x2]
+	adrp	x2, .LANCHOR0
+	add	x2, x2, :lo12:.LANCHOR0
+	str	w1, [x0, 772]
+	mov	w1, 0
+.L622:
+	ldrh	w3, [x2, 2480]
+	cmp	w1, w3
+	bcs	.L620
+	ldr	x5, [x0, 440]
+	ubfiz	x4, x1, 1, 32
 	add	w1, w1, 1
-	strh	w1, [x3,x2]
-	b	.L571
-.L569:
-	add	x1, x19, :lo12:.LANCHOR2
-	ldr	w21, [x1,776]
-	ldr	w24, [x1,768]
-	add	w0, w21, 256
-	cmp	w0, w24
-	bls	.L574
-	ldr	w1, [x1,772]
-	add	w0, w21, 768
-	cmp	w0, w1
-	bls	.L574
-	adrp	x0, .LANCHOR0+2372
-	ldr	w0, [x0,#:lo12:.LANCHOR0+2372]
-	cbz	w0, .L577
-	cmp	w21, 40
-	bls	.L574
-.L577:
-	mov	w0, 65535
-	b	.L576
-.L574:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x0,552]
+	ldrh	w3, [x5, x4]
+	add	w3, w3, 1
+	strh	w3, [x5, x4]
+	b	.L622
+.L626:
+	cmp	w9, 40
+	bhi	.L628
+.L625:
+	add	x0, x8, :lo12:.LANCHOR2
+	ldrh	w0, [x0, 552]
 	add	w0, w0, w0, lsl 1
 	lsr	w0, w0, 2
 	bl	GetFreeBlockMaxEraseCount
-	uxth	w6, w0
-	add	w0, w21, 64
+	and	w6, w0, 65535
+	add	w0, w9, 64
 	cmp	w6, w0
-	bcs	.L586
-	cmp	w21, 40
-	bhi	.L577
-.L586:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	x3, [x0,512]
-	cbz	x3, .L577
-	adrp	x1, .LANCHOR0+2480
-	mov	w23, 65535
-	ldr	x7, [x0,504]
-	mov	w20, w23
-	ldr	x26, [x0,440]
-	mov	x0, -6148914691236517206
-	ldrh	w9, [x1,#:lo12:.LANCHOR0+2480]
-	mov	w8, w23
+	bcs	.L629
+	cmp	w9, 40
+	bhi	.L628
+.L629:
+	add	x1, x8, :lo12:.LANCHOR2
+	ldr	x0, [x1, 512]
+	cbz	x0, .L628
+	adrp	x2, .LANCHOR0+2480
+	mov	w4, 65535
+	mov	x13, -6148914691236517206
+	mov	w11, w4
+	ldrh	w12, [x2, #:lo12:.LANCHOR0+2480]
+	mov	w2, w4
+	ldr	x5, [x1, 440]
+	movk	x13, 0xaaab, lsl 0
+	ldr	x7, [x1, 504]
+	mov	w14, 6
 	mov	w1, 0
-	add	x0, x0, 1
-	mov	w10, 6
-.L579:
-	ldrh	w2, [x3]
-	cmp	w2, w8
-	beq	.L581
-	add	w1, w1, 1
-	uxth	w1, w1
-	cmp	w1, w9
-	bhi	.L577
-	ldrh	w4, [x3,4]
-	cbz	w4, .L580
-	sub	x4, x3, x7
-	asr	x4, x4, 1
-	mul	x4, x4, x0
-	uxth	w5, w4
-	and	x4, x4, 65535
-	ldrh	w3, [x26,x4,lsl 1]
-	cmp	w3, w21
-	bls	.L585
-	cmp	w3, w23
-	bcs	.L580
-	mov	w23, w3
-	mov	w20, w5
-.L580:
-	umull	x3, w2, w10
-	add	x3, x7, x3
-	b	.L579
-.L585:
-	mov	w20, w5
-.L581:
+.L630:
+	ldrh	w3, [x0]
+	cmp	w3, w11
+	bne	.L633
+	mov	w20, w2
+.L632:
 	mov	w0, 65535
 	cmp	w20, w0
-	beq	.L577
-	ubfiz	x25, x20, 1, 16
-	ldrh	w22, [x26,x25]
-	cmp	w22, w21
-	bls	.L583
-	str	x6, [x29,88]
+	beq	.L628
+	ubfiz	x7, x20, 1, 32
+	ldrh	w3, [x5, x7]
+	cmp	w9, w3
+	bcs	.L634
 	bl	GetFreeBlockMinEraseCount
-	ldr	x6, [x29,88]
-	cmp	w21, w0, uxth
-	bcs	.L583
-	add	x0, x19, :lo12:.LANCHOR2
-	str	w23, [x0,776]
-.L583:
-	cmp	w22, w24
-	bcs	.L577
-	add	w0, w22, 128
+	cmp	w9, w0, uxth
+	bcs	.L634
+	add	x0, x8, :lo12:.LANCHOR2
+	str	w4, [x0, 776]
+.L634:
+	cmp	w10, w3
+	bls	.L628
+	add	w0, w3, 128
 	cmp	w6, w0
-	ble	.L577
-	add	w0, w22, 256
-	cmp	w0, w24
-	bcc	.L584
-	add	x0, x19, :lo12:.LANCHOR2
-	add	w22, w22, 768
-	ldr	w0, [x0,772]
-	cmp	w22, w0
-	bcs	.L577
-.L584:
-	add	x19, x19, :lo12:.LANCHOR2
+	ble	.L628
+	add	w0, w3, 256
+	cmp	w10, w0
+	bhi	.L635
+	add	x0, x8, :lo12:.LANCHOR2
+	add	w3, w3, 768
+	ldr	w0, [x0, 772]
+	cmp	w3, w0
+	bcs	.L628
+.L635:
+	add	x19, x8, :lo12:.LANCHOR2
+	ldrh	w5, [x5, x7]
+	mov	w2, w10
+	mov	w1, w20
+	ldr	x0, [x19, 520]
+	ldr	w3, [x19, 772]
+	ldrh	w4, [x0, x7]
 	adrp	x0, .LC77
-	ldrh	w5, [x26,x25]
 	add	x0, x0, :lo12:.LC77
-	mov	w1, w20
-	mov	w2, w24
-	ldr	x4, [x19,520]
-	ldr	w3, [x19,772]
-	ldrh	w4, [x4,x25]
 	bl	printk
 	mov	w0, 1
-	str	w0, [x19,1380]
-	mov	w0, w20
-.L576:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 96
-	ret
+	str	w0, [x19, 1376]
+	b	.L627
+.L633:
+	add	w1, w1, 1
+	and	w1, w1, 65535
+	cmp	w1, w12
+	bhi	.L628
+	ldrh	w15, [x0, 4]
+	cbz	w15, .L631
+	sub	x0, x0, x7
+	asr	x0, x0, 1
+	mul	x0, x0, x13
+	and	w20, w0, 65535
+	and	x0, x0, 65535
+	ldrh	w0, [x5, x0, lsl 1]
+	cmp	w9, w0
+	bcs	.L632
+	cmp	w4, w0
+	bls	.L631
+	mov	w4, w0
+	mov	w2, w20
+.L631:
+	umaddl	x0, w3, w14, x7
+	b	.L630
 	.size	GetSwlReplaceBlock, .-GetSwlReplaceBlock
 	.align	2
 	.global	free_data_superblock
 	.type	free_data_superblock, %function
 free_data_superblock:
-	stp	x29, x30, [sp, -16]!
-	uxth	w0, w0
+	and	w0, w0, 65535
 	mov	w1, 65535
 	cmp	w0, w1
-	add	x29, sp, 0
-	beq	.L601
+	beq	.L646
+	stp	x29, x30, [sp, -16]!
 	adrp	x2, .LANCHOR2+520
 	ubfiz	x1, x0, 1, 16
-	ldr	x2, [x2,#:lo12:.LANCHOR2+520]
-	strh	wzr, [x2,x1]
+	add	x29, sp, 0
+	ldr	x2, [x2, #:lo12:.LANCHOR2+520]
+	strh	wzr, [x2, x1]
 	bl	INSERT_FREE_LIST
-.L601:
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	ret
+.L646:
+	mov	w0, 0
+	ret
 	.size	free_data_superblock, .-free_data_superblock
 	.align	2
 	.global	FtlGcBufInit
 	.type	FtlGcBufInit, %function
 FtlGcBufInit:
-	adrp	x3, .LANCHOR2
-	mov	w1, 0
-	add	x0, x3, :lo12:.LANCHOR2
-	adrp	x10, .LANCHOR0
-	mov	w11, 24
-	mov	w12, 1
+	adrp	x0, .LANCHOR2
+	add	x1, x0, :lo12:.LANCHOR2
+	adrp	x3, .LANCHOR0
+	mov	x7, x0
+	add	x9, x3, :lo12:.LANCHOR0
+	mov	w8, 0
+	mov	w10, 24
+	mov	w11, 1
+	mov	w4, 4
+	mov	w12, 56
+	str	wzr, [x1, 1380]
+.L650:
+	ldrh	w0, [x9, 2472]
+	cmp	w8, w0
+	bcc	.L651
+	add	x3, x3, :lo12:.LANCHOR0
+	add	x1, x7, :lo12:.LANCHOR2
 	mov	w6, 4
-	mov	w13, 56
-	str	wzr, [x0,1384]
-.L603:
-	add	x5, x10, :lo12:.LANCHOR0
-	adrp	x9, .LANCHOR0
-	ldrh	w0, [x5,2472]
-	cmp	w1, w0
-	bcs	.L607
-	add	x2, x3, :lo12:.LANCHOR2
-	umull	x4, w1, w11
-	ldr	x7, [x2,1392]
-	ldr	x8, [x2,1400]
-	add	x0, x7, x4
-	str	w12, [x0,16]
-	ldrh	w0, [x5,2554]
-	mul	w0, w1, w0
-	sdiv	w0, w0, w6
-	add	x0, x8, w0, sxtw 2
-	str	x0, [x7,x4]
-	ldrh	w0, [x5,2556]
-	ldr	x8, [x2,1392]
-	ldr	x5, [x2,1408]
-	mul	w0, w1, w0
-	add	x7, x8, x4
-	ldr	x2, [x2,1416]
-	sdiv	w0, w0, w6
-	add	x0, x5, w0, sxtw 2
-	str	x0, [x7,8]
-	umull	x0, w1, w13
-	add	w1, w1, 1
-	add	x0, x2, x0
-	ldr	x2, [x8,x4]
-	uxth	w1, w1
-	str	x2, [x0,8]
-	ldr	x2, [x7,8]
-	str	x2, [x0,16]
-	b	.L603
-.L607:
-	mov	w8, 24
-	mov	w5, 4
-.L605:
-	add	x2, x3, :lo12:.LANCHOR2
-	ldr	w1, [x2,1424]
-	cmp	w0, w1
-	bcs	.L608
-	umull	x4, w0, w8
-	ldr	x7, [x2,1392]
-	add	x6, x9, :lo12:.LANCHOR0
-	ldr	x10, [x2,1400]
-	add	x1, x7, x4
-	str	wzr, [x1,16]
-	ldrh	w1, [x6,2554]
-	mul	w1, w0, w1
-	sdiv	w1, w1, w5
-	add	x1, x10, w1, sxtw 2
-	str	x1, [x7,x4]
-	ldrh	w1, [x6,2556]
-	ldr	x6, [x2,1392]
-	ldr	x2, [x2,1408]
-	mul	w1, w0, w1
-	add	x4, x6, x4
+	mov	w7, 24
+.L652:
+	ldr	w2, [x1, 1416]
+	cmp	w0, w2
+	bcc	.L653
+	ret
+.L651:
+	umull	x2, w8, w10
+	ldr	x5, [x1, 1384]
+	ldr	x6, [x1, 1392]
+	add	x0, x5, x2
+	str	w11, [x0, 16]
+	ldrh	w0, [x9, 2554]
+	mul	w0, w0, w8
+	sdiv	w0, w0, w4
+	add	x0, x6, w0, sxtw 2
+	str	x0, [x5, x2]
+	ldrh	w0, [x9, 2556]
+	ldr	x6, [x1, 1384]
+	ldr	x13, [x1, 1400]
+	add	x5, x6, x2
+	mul	w0, w0, w8
+	sdiv	w0, w0, w4
+	add	x0, x13, w0, sxtw 2
+	str	x0, [x5, 8]
+	ldr	x0, [x1, 1408]
+	ldr	x2, [x6, x2]
+	nop // between mem op and mult-accumulate
+	umaddl	x0, w8, w12, x0
+	add	w8, w8, 1
+	and	w8, w8, 65535
+	str	x2, [x0, 8]
+	ldr	x2, [x5, 8]
+	str	x2, [x0, 16]
+	b	.L650
+.L653:
+	umull	x5, w0, w7
+	ldr	x4, [x1, 1384]
+	ldr	x8, [x1, 1392]
+	add	x2, x4, x5
+	str	wzr, [x2, 16]
+	ldrh	w2, [x3, 2554]
+	mul	w2, w2, w0
+	sdiv	w2, w2, w6
+	add	x2, x8, w2, sxtw 2
+	str	x2, [x4, x5]
+	ldrh	w2, [x3, 2556]
+	ldr	x4, [x1, 1384]
+	add	x4, x4, x5
+	ldr	x5, [x1, 1400]
+	mul	w2, w2, w0
 	add	w0, w0, 1
-	sdiv	w1, w1, w5
-	uxth	w0, w0
-	add	x1, x2, w1, sxtw 2
-	str	x1, [x4,8]
-	b	.L605
-.L608:
-	ret
+	and	w0, w0, 65535
+	sdiv	w2, w2, w6
+	add	x2, x5, w2, sxtw 2
+	str	x2, [x4, 8]
+	b	.L652
 	.size	FtlGcBufInit, .-FtlGcBufInit
 	.align	2
 	.global	FtlGcBufFree
 	.type	FtlGcBufFree, %function
 FtlGcBufFree:
 	adrp	x2, .LANCHOR2
-	mov	w3, 0
 	add	x2, x2, :lo12:.LANCHOR2
+	mov	w3, 0
 	mov	w7, 56
 	mov	w9, 24
-	ldr	w8, [x2,1424]
-	ldr	x5, [x2,1392]
-.L610:
+	ldr	w8, [x2, 1416]
+	ldr	x4, [x2, 1384]
+.L655:
 	cmp	w3, w1
-	bcs	.L609
-	umull	x4, w3, w7
+	bcs	.L654
+	umaddl	x6, w3, w7, x0
 	mov	w2, 0
-	add	x4, x0, x4
-.L615:
-	cmp	w2, w8
-	bcs	.L612
-	umull	x6, w2, w9
-	add	x10, x5, x6
-	ldr	x11, [x5,x6]
-	ldr	x6, [x4,8]
-	cmp	x11, x6
-	bne	.L611
-	str	wzr, [x10,16]
-	b	.L612
-.L611:
+	b	.L660
+.L656:
 	add	w2, w2, 1
-	uxth	w2, w2
-	b	.L615
-.L612:
+	and	w2, w2, 65535
+.L660:
+	cmp	w2, w8
+	bcs	.L657
+	umull	x5, w2, w9
+	add	x10, x4, x5
+	ldr	x11, [x4, x5]
+	ldr	x5, [x6, 8]
+	cmp	x11, x5
+	bne	.L656
+	str	wzr, [x10, 16]
+.L657:
 	add	w3, w3, 1
-	uxth	w3, w3
-	b	.L610
-.L609:
+	and	w3, w3, 65535
+	b	.L655
+.L654:
 	ret
 	.size	FtlGcBufFree, .-FtlGcBufFree
 	.align	2
@@ -4938,41 +4906,38 @@ FtlGcBufFree:
 	.type	FtlGcBufAlloc, %function
 FtlGcBufAlloc:
 	adrp	x2, .LANCHOR2
-	mov	w7, 24
 	add	x2, x2, :lo12:.LANCHOR2
+	mov	w3, 0
+	mov	w7, 24
 	mov	w8, 1
 	mov	w9, 56
-	ldr	w5, [x2,1424]
-	ldr	x6, [x2,1392]
+	ldr	w5, [x2, 1416]
+	ldr	x6, [x2, 1384]
+.L662:
+	cmp	w3, w1
+	bcs	.L661
 	mov	w2, 0
-.L617:
-	cmp	w2, w1
-	bcs	.L623
-	mov	w3, 0
-.L621:
-	cmp	w3, w5
-	bcs	.L619
-	umull	x4, w3, w7
-	add	x4, x6, x4
-	ldr	w10, [x4,16]
-	cbnz	w10, .L618
-	umull	x3, w2, w9
-	str	w8, [x4,16]
-	add	x3, x0, x3
+	b	.L667
+.L663:
+	add	w2, w2, 1
+	and	w2, w2, 65535
+.L667:
+	cmp	w2, w5
+	bcs	.L664
+	umaddl	x4, w2, w7, x6
+	ldr	w10, [x4, 16]
+	cbnz	w10, .L663
+	umaddl	x2, w3, w9, x0
 	ldr	x10, [x4]
-	str	x10, [x3,8]
-	ldr	x4, [x4,8]
-	str	x4, [x3,16]
-	b	.L619
-.L618:
+	str	w8, [x4, 16]
+	str	x10, [x2, 8]
+	ldr	x4, [x4, 8]
+	str	x4, [x2, 16]
+.L664:
 	add	w3, w3, 1
-	uxth	w3, w3
-	b	.L621
-.L619:
-	add	w2, w2, 1
-	uxth	w2, w2
-	b	.L617
-.L623:
+	and	w3, w3, 65535
+	b	.L662
+.L661:
 	ret
 	.size	FtlGcBufAlloc, .-FtlGcBufAlloc
 	.align	2
@@ -4980,81 +4945,76 @@ FtlGcBufAlloc:
 	.type	IsBlkInGcList, %function
 IsBlkInGcList:
 	adrp	x1, .LANCHOR2
-	uxth	w0, w0
 	add	x1, x1, :lo12:.LANCHOR2
-	ldrh	w2, [x1,1428]
-	ldr	x3, [x1,1432]
+	and	w0, w0, 65535
+	ldrh	w2, [x1, 1420]
+	ldr	x3, [x1, 1424]
 	mov	x1, 0
-.L625:
+.L669:
 	cmp	w2, w1, uxth
-	bls	.L629
+	bhi	.L671
+	mov	w0, 0
+	ret
+.L671:
 	add	x1, x1, 1
 	add	x4, x3, x1, lsl 1
-	ldrh	w4, [x4,-2]
+	ldrh	w4, [x4, -2]
 	cmp	w4, w0
-	bne	.L625
+	bne	.L669
 	mov	w0, 1
-	b	.L626
-.L629:
-	mov	w0, 0
-.L626:
 	ret
 	.size	IsBlkInGcList, .-IsBlkInGcList
 	.align	2
 	.global	FtlGcUpdatePage
 	.type	FtlGcUpdatePage, %function
 FtlGcUpdatePage:
-	stp	x29, x30, [sp, -48]!
+	mov	w5, w0
+	mov	w8, w1
+	mov	w7, w2
+	stp	x29, x30, [sp, -16]!
+	lsr	w0, w0, 10
 	add	x29, sp, 0
-	str	x19, [sp,16]
-	mov	w19, w0
-	lsr	x0, x19, 10
-	str	x1, [x29,32]
-	str	x2, [x29,40]
 	bl	P2V_block_in_plane
+	and	w9, w0, 65535
 	adrp	x3, .LANCHOR2
-	ldr	x2, [x29,40]
 	add	x4, x3, :lo12:.LANCHOR2
-	ldr	x1, [x29,32]
-	uxth	w8, w0
-	mov	x5, 0
-	ldrh	w7, [x4,1428]
-	ldr	x6, [x4,1432]
-.L631:
-	uxth	w4, w5
-	cmp	w4, w7
-	bcs	.L635
-	add	x5, x5, 1
-	add	x9, x6, x5, lsl 1
-	ldrh	w9, [x9,-2]
-	cmp	w9, w8
-	bne	.L631
-.L635:
-	cmp	w4, w7
-	bne	.L633
-	ubfiz	x4, x4, 1, 16
-	strh	w0, [x6,x4]
-	add	x0, x3, :lo12:.LANCHOR2
-	ldrh	w4, [x0,1428]
-	add	w4, w4, 1
-	strh	w4, [x0,1428]
-.L633:
-	add	x3, x3, :lo12:.LANCHOR2
-	mov	w0, 12
-	ldrh	w4, [x3,1440]
-	ldr	x5, [x3,1448]
-	umull	x4, w4, w0
-	add	x5, x5, x4
-	str	w1, [x5,4]
-	ldr	x1, [x3,1448]
-	add	x0, x1, x4
-	str	w2, [x0,8]
-	str	w19, [x1,x4]
-	ldrh	w0, [x3,1440]
+	ldrh	w1, [x4, 1420]
+	ldr	x6, [x4, 1424]
+	mov	x4, 0
+.L674:
+	and	w2, w4, 65535
+	cmp	w2, w1
+	bcc	.L676
+	bne	.L675
+	and	x4, x4, 65535
+	strh	w0, [x6, x4, lsl 1]
+	add	x4, x3, :lo12:.LANCHOR2
+	ldrh	w0, [x4, 1420]
 	add	w0, w0, 1
-	strh	w0, [x3,1440]
-	ldr	x19, [sp,16]
-	ldp	x29, x30, [sp], 48
+	strh	w0, [x4, 1420]
+	b	.L675
+.L676:
+	add	x4, x4, 1
+	add	x2, x6, x4, lsl 1
+	ldrh	w2, [x2, -2]
+	cmp	w2, w9
+	bne	.L674
+.L675:
+	add	x0, x3, :lo12:.LANCHOR2
+	mov	w1, 12
+	ldrh	w3, [x0, 1432]
+	ldr	x4, [x0, 1440]
+	umull	x3, w3, w1
+	add	x4, x4, x3
+	str	w8, [x4, 4]
+	ldr	x1, [x0, 1440]
+	add	x4, x1, x3
+	str	w7, [x4, 8]
+	str	w5, [x1, x3]
+	ldrh	w1, [x0, 1432]
+	add	w1, w1, 1
+	strh	w1, [x0, 1432]
+	ldp	x29, x30, [sp], 16
 	ret
 	.size	FtlGcUpdatePage, .-FtlGcUpdatePage
 	.align	2
@@ -5063,54 +5023,54 @@ FtlGcUpdatePage:
 FtlGcRefreshOpenBlock:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	uxth	w20, w0
 	add	x19, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x19,1456]
+	and	w20, w0, 65535
+	ldrh	w0, [x19, 1448]
 	cmp	w0, w20
-	beq	.L639
-	ldrh	w0, [x19,1458]
+	beq	.L680
+	ldrh	w0, [x19, 1450]
 	cmp	w0, w20
-	beq	.L639
-	ldrh	w0, [x19,1460]
+	beq	.L680
+	ldrh	w0, [x19, 1452]
 	cmp	w0, w20
-	beq	.L639
-	ldrh	w0, [x19,1462]
+	beq	.L680
+	ldrh	w0, [x19, 1454]
 	cmp	w0, w20
-	beq	.L639
-	adrp	x0, .LC78
+	beq	.L680
 	mov	w1, w20
+	adrp	x0, .LC78
 	add	x0, x0, :lo12:.LC78
 	bl	printk
-	ldrh	w1, [x19,1456]
+	ldrh	w1, [x19, 1448]
 	mov	w0, 65535
 	cmp	w1, w0
-	bne	.L641
-	strh	w20, [x19,1456]
-	b	.L639
-.L641:
-	ldrh	w1, [x19,1458]
-	cmp	w1, w0
-	bne	.L642
-	strh	w20, [x19,1458]
-	b	.L639
-.L642:
-	ldrh	w1, [x19,1460]
-	cmp	w1, w0
-	bne	.L643
-	strh	w20, [x19,1460]
-	b	.L639
-.L643:
-	ldrh	w1, [x19,1462]
-	cmp	w1, w0
-	bne	.L639
-	strh	w20, [x19,1462]
-.L639:
+	bne	.L682
+	strh	w20, [x19, 1448]
+.L680:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L682:
+	ldrh	w1, [x19, 1450]
+	cmp	w1, w0
+	bne	.L683
+	strh	w20, [x19, 1450]
+	b	.L680
+.L683:
+	ldrh	w1, [x19, 1452]
+	cmp	w1, w0
+	bne	.L684
+	strh	w20, [x19, 1452]
+	b	.L680
+.L684:
+	ldrh	w1, [x19, 1454]
+	cmp	w1, w0
+	bne	.L680
+	strh	w20, [x19, 1454]
+	b	.L680
 	.size	FtlGcRefreshOpenBlock, .-FtlGcRefreshOpenBlock
 	.align	2
 	.global	FtlGcRefreshBlock
@@ -5118,60 +5078,63 @@ FtlGcRefreshOpenBlock:
 FtlGcRefreshBlock:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	uxth	w20, w0
 	add	x19, x19, :lo12:.LANCHOR2
-	str	x21, [sp,32]
-	mov	w21, 0
-	ldrh	w0, [x19,1456]
+	and	w20, w0, 65535
+	str	x21, [sp, 32]
+	ldrh	w0, [x19, 1448]
 	cmp	w0, w20
-	beq	.L645
-	ldrh	w0, [x19,1458]
+	beq	.L693
+	ldrh	w0, [x19, 1450]
 	cmp	w0, w20
-	beq	.L645
-	ldrh	w0, [x19,1460]
+	beq	.L693
+	ldrh	w0, [x19, 1452]
 	cmp	w0, w20
-	beq	.L645
-	ldrh	w0, [x19,1462]
+	beq	.L693
+	ldrh	w0, [x19, 1454]
+	mov	w21, 0
 	cmp	w0, w20
-	beq	.L645
-	adrp	x0, .LC78
+	beq	.L686
 	mov	w1, w20
+	adrp	x0, .LC78
 	add	x0, x0, :lo12:.LC78
 	bl	printk
-	ldrh	w1, [x19,1456]
+	ldrh	w1, [x19, 1448]
 	mov	w0, 65535
 	cmp	w1, w0
-	bne	.L646
-	strh	w20, [x19,1456]
-	b	.L645
-.L646:
-	ldrh	w1, [x19,1458]
+	bne	.L688
+	strh	w20, [x19, 1448]
+.L686:
+	mov	w0, w21
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 48
+	ret
+.L688:
+	ldrh	w1, [x19, 1450]
 	cmp	w1, w0
-	bne	.L647
-	strh	w20, [x19,1458]
-	b	.L645
-.L647:
-	ldrh	w1, [x19,1460]
+	bne	.L689
+	strh	w20, [x19, 1450]
+	b	.L686
+.L689:
+	ldrh	w1, [x19, 1452]
 	cmp	w1, w0
-	bne	.L648
-	strh	w20, [x19,1460]
-	b	.L645
-.L648:
-	ldrh	w1, [x19,1462]
+	bne	.L690
+	strh	w20, [x19, 1452]
+	b	.L686
+.L690:
+	ldrh	w1, [x19, 1454]
 	cmp	w1, w0
-	bne	.L653
-	strh	w20, [x19,1462]
-	b	.L645
-.L653:
+	bne	.L695
+	strh	w20, [x19, 1454]
+	b	.L686
+.L693:
+	mov	w21, 0
+	b	.L686
+.L695:
 	mov	w21, -1
-.L645:
-	mov	w0, w21
-	ldr	x21, [sp,32]
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 48
-	ret
+	b	.L686
 	.size	FtlGcRefreshBlock, .-FtlGcRefreshBlock
 	.align	2
 	.global	FtlGcMarkBadPhyBlk
@@ -5179,59 +5142,59 @@ FtlGcRefreshBlock:
 FtlGcMarkBadPhyBlk:
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	uxth	w20, w0
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	stp	x21, x22, [sp,32]
-	mov	w0, w20
+	stp	x21, x22, [sp, 32]
 	add	x22, x19, :lo12:.LANCHOR2
-	str	x23, [sp,48]
+	and	w20, w0, 65535
+	str	x23, [sp, 48]
+	mov	w0, w20
 	bl	P2V_block_in_plane
-	uxth	w21, w0
-	ldrh	w1, [x22,1464]
-	adrp	x0, .LC79
+	ldrh	w1, [x22, 1456]
 	mov	w2, w20
+	and	w21, w0, 65535
+	adrp	x0, .LC79
 	add	x0, x0, :lo12:.LC79
 	bl	printk
 	mov	w0, w21
 	bl	FtlGcRefreshBlock
 	adrp	x0, .LANCHOR0+2372
-	ldr	w0, [x0,#:lo12:.LANCHOR0+2372]
-	cbz	w0, .L655
+	ldr	w0, [x0, #:lo12:.LANCHOR0+2372]
+	cbz	w0, .L698
+	ldr	x2, [x22, 440]
 	ubfiz	x0, x21, 1, 16
-	ldr	x2, [x22,440]
-	ldrh	w1, [x2,x0]
+	ldrh	w1, [x2, x0]
 	cmp	w1, 39
-	bls	.L655
+	bls	.L698
 	sub	w1, w1, #40
-	strh	w1, [x2,x0]
-.L655:
+	strh	w1, [x2, x0]
+.L698:
 	add	x2, x19, :lo12:.LANCHOR2
-	mov	x0, 0
-	add	x2, x2, 1472
-	ldrh	w1, [x2,-8]
-.L656:
-	cmp	w1, w0, uxth
-	bls	.L662
-	add	x0, x0, 1
-	add	x3, x2, x0, lsl 1
-	ldrh	w3, [x3,-2]
-	cmp	w3, w20
-	bne	.L656
-	b	.L657
-.L662:
-	cmp	w1, 15
-	bhi	.L657
+	mov	x1, 0
+	add	x2, x2, 1464
+	ldrh	w0, [x2, -8]
+.L699:
+	cmp	w0, w1, uxth
+	bhi	.L701
+	cmp	w0, 15
+	bhi	.L700
 	add	x19, x19, :lo12:.LANCHOR2
-	add	w0, w1, 1
-	add	x19, x19, 1472
-	strh	w0, [x19,-8]
-	strh	w20, [x19,w1,sxtw 1]
-.L657:
+	add	w1, w0, 1
+	add	x19, x19, 1464
+	strh	w1, [x19, -8]
+	strh	w20, [x19, w0, sxtw 1]
+	b	.L700
+.L701:
+	add	x1, x1, 1
+	add	x3, x2, x1, lsl 1
+	ldrh	w3, [x3, -2]
+	cmp	w3, w20
+	bne	.L699
+.L700:
 	mov	w0, 0
-	ldr	x23, [sp,48]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
+	ldr	x23, [sp, 48]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
 	ldp	x29, x30, [sp], 64
 	ret
 	.size	FtlGcMarkBadPhyBlk, .-FtlGcMarkBadPhyBlk
@@ -5241,32 +5204,32 @@ FtlGcMarkBadPhyBlk:
 FtlGcReFreshBadBlk:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	adrp	x19, .LANCHOR2
 	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w1, [x0,1464]
-	cbz	w1, .L664
-	ldrh	w3, [x0,1456]
+	ldrh	w1, [x0, 1456]
+	cbz	w1, .L707
+	ldrh	w3, [x0, 1448]
 	mov	w2, 65535
 	cmp	w3, w2
-	bne	.L664
-	ldrh	w2, [x0,1506]
+	bne	.L707
+	ldrh	w2, [x0, 1498]
 	cmp	w2, w1
-	bcc	.L665
-	strh	wzr, [x0,1506]
-.L665:
+	bcc	.L708
+	strh	wzr, [x0, 1498]
+.L708:
 	add	x19, x19, :lo12:.LANCHOR2
-	add	x0, x19, 1472
-	ldrh	w1, [x19,1506]
-	ldrh	w0, [x0,w1,sxtw 1]
+	add	x0, x19, 1464
+	ldrh	w1, [x19, 1498]
+	ldrh	w0, [x0, x1, lsl 1]
 	bl	P2V_block_in_plane
 	bl	FtlGcRefreshBlock
-	ldrh	w0, [x19,1506]
+	ldrh	w0, [x19, 1498]
 	add	w0, w0, 1
-	strh	w0, [x19,1506]
-.L664:
+	strh	w0, [x19, 1498]
+.L707:
 	mov	w0, 0
-	ldr	x19, [sp,16]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	FtlGcReFreshBadBlk, .-FtlGcReFreshBadBlk
@@ -5287,448 +5250,423 @@ ftl_memset:
 BuildFlashLsbPageTable:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	w20, w1
-	cbnz	w0, .L671
+	cbnz	w0, .L716
 	adrp	x1, .LANCHOR0
-	mov	x0, 0
 	add	x1, x1, :lo12:.LANCHOR0
-.L672:
-	add	x2, x1, 208
-	strh	w0, [x2,x0,lsl 1]
+	add	x1, x1, 208
+	mov	x0, 0
+.L717:
+	strh	w0, [x1, x0, lsl 1]
 	add	x0, x0, 1
 	cmp	x0, 512
-	bne	.L672
-.L678:
+	bne	.L717
+.L723:
 	adrp	x19, .LANCHOR2
-	mov	w1, 255
 	add	x19, x19, :lo12:.LANCHOR2
+	add	x19, x19, 1500
+	mov	w1, 255
 	mov	w2, 2048
-	add	x19, x19, 1508
-	uxth	w20, w20
 	mov	x0, x19
 	bl	ftl_memset
-	adrp	x1, .LANCHOR0
-	mov	x0, 0
-	add	x1, x1, :lo12:.LANCHOR0
-	b	.L673
-.L671:
+	and	w20, w20, 65535
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	add	x0, x0, 208
+	mov	x1, 0
+.L718:
+	cmp	w20, w1, uxth
+	bhi	.L751
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
+	ret
+.L716:
 	cmp	w0, 1
-	bne	.L674
-	adrp	x3, .LANCHOR0
-	mov	x0, 0
-	mov	w4, 3
-	mov	w5, 2
-	add	x3, x3, :lo12:.LANCHOR0
-.L677:
-	cmp	x0, 3
-	uxth	w2, w0
-	mov	w1, w2
-	bls	.L675
-	ubfiz	w1, w2, 1, 15
-	and	w2, w2, 1
-	cmp	w2, wzr
-	csel	w2, w4, w5, ne
-	sub	w1, w1, w2
-	uxth	w1, w1
-.L675:
-	add	x2, x3, 208
-	strh	w1, [x2,x0,lsl 1]
-	add	x0, x0, 1
-	cmp	x0, 512
-	bne	.L677
-	b	.L678
-.L674:
+	bne	.L719
+	adrp	x2, .LANCHOR0
+	add	x2, x2, :lo12:.LANCHOR0
+	add	x2, x2, 208
+	mov	x1, 0
+.L722:
+	and	w0, w1, 65535
+	cmp	x1, 3
+	bls	.L720
+	ubfiz	w3, w0, 1, 15
+	and	w0, w0, 1
+	add	w0, w0, 2
+	sub	w0, w3, w0
+	and	w0, w0, 65535
+.L720:
+	strh	w0, [x2, x1, lsl 1]
+	add	x1, x1, 1
+	cmp	x1, 512
+	bne	.L722
+	b	.L723
+.L719:
 	cmp	w0, 2
-	bne	.L679
-	adrp	x3, .LANCHOR0
+	bne	.L724
+	adrp	x2, .LANCHOR0
+	add	x2, x2, :lo12:.LANCHOR0
+	add	x2, x2, 208
 	mov	w1, 65535
 	mov	x0, 0
-	add	x3, x3, :lo12:.LANCHOR0
-.L681:
-	add	x4, x3, 208
-	cmp	x0, 1
-	uxth	w2, w0
-	csel	w2, w1, w2, hi
+.L726:
+	cmp	x0, 2
+	and	w3, w0, 65535
+	csel	w3, w3, w1, cc
+	strh	w3, [x2, x0, lsl 1]
 	add	w1, w1, 2
-	strh	w2, [x4,x0,lsl 1]
 	add	x0, x0, 1
+	and	w1, w1, 65535
 	cmp	x0, 512
-	uxth	w1, w1
-	bne	.L681
-	b	.L678
-.L679:
+	bne	.L726
+	b	.L723
+.L724:
 	cmp	w0, 3
-	bne	.L682
-	adrp	x3, .LANCHOR0
-	mov	x0, 0
-	mov	w4, 5
-	mov	w5, 4
-	add	x3, x3, :lo12:.LANCHOR0
-.L685:
-	cmp	x0, 5
-	uxth	w2, w0
-	mov	w1, w2
-	bls	.L683
-	ubfiz	w1, w2, 1, 15
-	and	w2, w2, 1
-	cmp	w2, wzr
-	csel	w2, w4, w5, ne
-	sub	w1, w1, w2
-	uxth	w1, w1
-.L683:
-	add	x2, x3, 208
-	strh	w1, [x2,x0,lsl 1]
-	add	x0, x0, 1
-	cmp	x0, 512
-	bne	.L685
-	b	.L678
-.L682:
+	bne	.L727
+	adrp	x2, .LANCHOR0
+	add	x2, x2, :lo12:.LANCHOR0
+	add	x2, x2, 208
+	mov	x1, 0
+.L730:
+	and	w0, w1, 65535
+	cmp	x1, 5
+	bls	.L728
+	ubfiz	w3, w0, 1, 15
+	and	w0, w0, 1
+	add	w0, w0, 4
+	sub	w0, w3, w0
+	and	w0, w0, 65535
+.L728:
+	strh	w0, [x2, x1, lsl 1]
+	add	x1, x1, 1
+	cmp	x1, 512
+	bne	.L730
+	b	.L723
+.L727:
 	cmp	w0, 4
-	bne	.L686
+	bne	.L731
 	adrp	x1, .LANCHOR0
-	mov	w5, 7
 	add	x1, x1, :lo12:.LANCHOR0
-	mov	w4, 6
-	add	x2, x1, 208
-	strh	w0, [x2,8]
+	mov	w3, 1
+	add	x1, x1, 224
+	strh	w0, [x1, -8]
 	mov	w0, 5
-	strh	wzr, [x1,208]
-	mov	w1, 1
-	strh	w0, [x2,10]
+	strh	w3, [x1, -14]
+	mov	w3, 2
+	strh	w0, [x1, -6]
 	mov	w0, 7
-	strh	w1, [x2,2]
-	mov	w1, 2
-	strh	w0, [x2,12]
+	strh	w3, [x1, -12]
+	mov	w3, 3
+	strh	w0, [x1, -4]
 	mov	w0, 8
-	strh	w1, [x2,4]
-	mov	w1, 3
-	strh	w0, [x2,14]
+	strh	wzr, [x1, -16]
+	strh	w0, [x1, -2]
 	mov	w0, 8
-	strh	w1, [x2,6]
-.L688:
+	strh	w3, [x1, -10]
+.L733:
 	and	w3, w0, 1
-	ubfiz	w1, w0, 1, 15
+	ubfiz	w2, w0, 1, 15
+	add	w3, w3, 6
 	add	w0, w0, 1
-	cmp	w3, wzr
-	csel	w3, w5, w4, ne
-	add	x2, x2, 2
-	uxth	w0, w0
-	sub	w1, w1, w3
+	sub	w2, w2, w3
+	strh	w2, [x1], 2
+	and	w0, w0, 65535
 	cmp	w0, 512
-	strh	w1, [x2,14]
-	bne	.L688
-	b	.L678
-.L686:
+	bne	.L733
+	b	.L723
+.L731:
 	cmp	w0, 5
-	bne	.L689
-	adrp	x2, .LANCHOR0
+	bne	.L734
+	adrp	x1, .LANCHOR0
+	add	x1, x1, :lo12:.LANCHOR0
+	add	x2, x1, 208
 	mov	x0, 0
-	add	x2, x2, :lo12:.LANCHOR0
-.L690:
-	add	x1, x2, 208
-	strh	w0, [x1,x0,lsl 1]
+.L735:
+	strh	w0, [x2, x0, lsl 1]
 	add	x0, x0, 1
 	cmp	x0, 16
-	bne	.L690
-	mov	x0, 0
-.L691:
-	add	x2, x1, x0
-	add	w3, w0, 16
-	add	x0, x0, 2
-	cmp	x0, 992
-	strh	w3, [x2,32]
-	bne	.L691
-	b	.L678
-.L689:
+	bne	.L735
+	add	x1, x1, 240
+.L736:
+	strh	w0, [x1], 2
+	add	w0, w0, 2
+	and	w0, w0, 65535
+	cmp	w0, 1008
+	bne	.L736
+	b	.L723
+.L734:
 	cmp	w0, 6
-	bne	.L692
-	adrp	x1, .LANCHOR0
+	bne	.L737
+	adrp	x3, .LANCHOR0
+	add	x3, x3, :lo12:.LANCHOR0
+	add	x3, x3, 208
+	mov	w1, 0
 	mov	x2, 0
 	mov	w4, 12
 	mov	w5, 10
-	add	x1, x1, :lo12:.LANCHOR0
-.L695:
+.L740:
+	and	w0, w2, 65535
 	cmp	x2, 5
-	uxth	w3, w2
-	mov	w0, w3
-	bls	.L693
-	add	w0, w3, w3, lsl 1
-	and	w3, w3, 1
-	cmp	w3, wzr
-	uxth	w0, w0
-	csel	w3, w4, w5, ne
-	sub	w0, w0, w3
-	uxth	w0, w0
-.L693:
-	add	x3, x1, 208
-	strh	w0, [x3,x2,lsl 1]
+	bls	.L738
+	tst	x0, 1
+	csel	w0, w4, w5, ne
+	sub	w0, w1, w0
+	and	w0, w0, 65535
+.L738:
+	strh	w0, [x3, x2, lsl 1]
+	add	w1, w1, 3
+	and	w1, w1, 65535
 	add	x2, x2, 1
-	cmp	x2, 512
-	bne	.L695
-	b	.L678
-.L692:
+	cmp	w1, 1536
+	bne	.L740
+	b	.L723
+.L737:
 	cmp	w0, 9
-	bne	.L696
+	bne	.L741
 	adrp	x0, .LANCHOR0
 	add	x0, x0, :lo12:.LANCHOR0
-	add	x1, x0, 208
-	strh	wzr, [x0,208]
-	mov	w0, 1
-	strh	w0, [x1,2]
-	mov	w0, 2
-	strh	w0, [x1,4]
-	mov	x0, 0
-.L697:
-	add	x2, x1, x0
-	add	w3, w0, 3
-	add	x0, x0, 2
-	cmp	x0, 1018
-	strh	w3, [x2,6]
-	bne	.L697
-	b	.L678
-.L696:
+	mov	w2, 1
+	add	x0, x0, 214
+	mov	w1, 3
+	strh	w2, [x0, -4]
+	mov	w2, 2
+	strh	wzr, [x0, -6]
+	strh	w2, [x0, -2]
+.L742:
+	strh	w1, [x0], 2
+	add	w1, w1, 2
+	and	w1, w1, 65535
+	cmp	w1, 1021
+	bne	.L742
+	b	.L723
+.L741:
 	cmp	w0, 10
-	bne	.L698
-	adrp	x2, .LANCHOR0
+	bne	.L743
+	adrp	x1, .LANCHOR0
+	add	x1, x1, :lo12:.LANCHOR0
+	add	x2, x1, 208
 	mov	x0, 0
-	add	x2, x2, :lo12:.LANCHOR0
-.L699:
-	add	x1, x2, 208
-	strh	w0, [x1,x0,lsl 1]
+.L744:
+	strh	w0, [x2, x0, lsl 1]
 	add	x0, x0, 1
 	cmp	x0, 63
-	bne	.L699
-	mov	x0, 0
-.L700:
-	add	x2, x1, x0
-	add	w3, w0, 63
-	add	x0, x0, 2
-	cmp	x0, 898
-	strh	w3, [x2,126]
-	bne	.L700
-	b	.L678
-.L698:
+	bne	.L744
+	add	x1, x1, 334
+.L745:
+	strh	w0, [x1], 2
+	add	w0, w0, 2
+	and	w0, w0, 65535
+	cmp	w0, 961
+	bne	.L745
+	b	.L723
+.L743:
 	cmp	w0, 11
-	bne	.L701
+	bne	.L746
 	adrp	x1, .LANCHOR0
-	mov	x0, 0
 	add	x1, x1, :lo12:.LANCHOR0
-.L702:
 	add	x2, x1, 208
-	strh	w0, [x2,x0,lsl 1]
+	mov	x0, 0
+.L747:
+	strh	w0, [x2, x0, lsl 1]
 	add	x0, x0, 1
 	cmp	x0, 8
-	bne	.L702
-	mov	w5, 7
-	mov	w4, 6
-.L704:
+	bne	.L747
+	add	x1, x1, 224
+.L749:
 	and	w3, w0, 1
-	ubfiz	w1, w0, 1, 15
+	ubfiz	w2, w0, 1, 15
+	add	w3, w3, 6
 	add	w0, w0, 1
-	cmp	w3, wzr
-	csel	w3, w5, w4, ne
-	add	x2, x2, 2
-	uxth	w0, w0
-	sub	w1, w1, w3
+	sub	w2, w2, w3
+	strh	w2, [x1], 2
+	and	w0, w0, 65535
 	cmp	w0, 512
-	strh	w1, [x2,14]
-	bne	.L704
-	b	.L678
-.L701:
+	bne	.L749
+	b	.L723
+.L746:
 	cmp	w0, 12
-	bne	.L678
-	adrp	x1, .LANCHOR0
-	mov	w2, 4
-	add	x1, x1, :lo12:.LANCHOR0
-	add	x0, x1, 208
-	strh	wzr, [x1,208]
-	mov	w1, 1
-	strh	w1, [x0,2]
-	mov	w1, 2
-	strh	w1, [x0,4]
-	mov	w1, 3
-	strh	w1, [x0,6]
-.L705:
-	sub	w1, w2, #1
-	add	x0, x0, 2
-	add	w1, w1, w2, lsr 1
-	add	w2, w2, 1
-	strh	w1, [x0,6]
-	uxth	w2, w2
-	cmp	w2, 512
-	bne	.L705
-	b	.L678
-.L673:
-	cmp	w20, w0, uxth
-	bls	.L730
-	add	x2, x1, 208
-	ldrh	w2, [x2,x0,lsl 1]
-	add	x0, x0, 1
-	strh	w2, [x19,w2,sxtw 1]
-	b	.L673
-.L730:
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 32
-	ret
+	bne	.L723
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	mov	w2, 1
+	add	x0, x0, 216
+	mov	w1, 4
+	strh	w2, [x0, -6]
+	mov	w2, 2
+	strh	wzr, [x0, -8]
+	strh	w2, [x0, -4]
+	mov	w2, 3
+	strh	w2, [x0, -2]
+.L750:
+	sub	w2, w1, #1
+	add	w2, w2, w1, lsr 1
+	add	w1, w1, 1
+	strh	w2, [x0], 2
+	and	w1, w1, 65535
+	cmp	w1, 512
+	bne	.L750
+	b	.L723
+.L751:
+	ldrh	w2, [x0, x1, lsl 1]
+	add	x1, x1, 1
+	strh	w2, [x19, w2, sxtw 1]
+	b	.L718
 	.size	BuildFlashLsbPageTable, .-BuildFlashLsbPageTable
 	.align	2
 	.global	FlashDieInfoInit
 	.type	FlashDieInfoInit, %function
 FlashDieInfoInit:
-	stp	x29, x30, [sp, -80]!
+	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	adrp	x22, .LANCHOR2
-	adrp	x21, .LANCHOR0
-	add	x0, x22, :lo12:.LANCHOR2
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	strb	wzr, [x0,3556]
+	stp	x21, x22, [sp, 32]
+	adrp	x21, .LANCHOR2
+	add	x0, x21, :lo12:.LANCHOR2
+	stp	x19, x20, [sp, 16]
+	adrp	x22, .LANCHOR0
+	add	x19, x22, :lo12:.LANCHOR0
+	add	x20, x19, 1232
+	strb	wzr, [x0, 3548]
 	adrp	x0, .LANCHOR1+482
-	add	x19, x21, :lo12:.LANCHOR0
-	mov	x24, 0
-	add	x25, x19, 2132
-	ldrh	w0, [x0,#:lo12:.LANCHOR1+482]
-	strb	wzr, [x19,2358]
+	strb	wzr, [x19, 2358]
+	ldrh	w0, [x0, #:lo12:.LANCHOR1+482]
 	bl	FlashBlockAlignInit
-	mov	w1, 0
 	mov	w2, 8
+	mov	w1, 0
 	add	x0, x19, 2360
 	bl	ftl_memset
-	mov	w1, 0
 	mov	w2, 32
-	add	x0, x19, 1232
-	bl	ftl_memset
-	add	x0, x19, 2164
 	mov	w1, 0
+	mov	x0, x20
+	bl	ftl_memset
 	mov	w2, 192
+	mov	w1, 0
+	add	x0, x19, 2164
 	bl	ftl_memset
-	ldr	x20, [x19,88]
-	add	x23, x20, 1
-.L733:
-	ldrb	w2, [x20]
-	mov	x0, x23
-	add	x1, x25, x24, lsl 3
+	ldr	x7, [x19, 88]
+	add	x11, x19, 2132
+	mov	x8, 0
+	add	x12, x7, 1
+.L775:
+	ldrb	w2, [x7]
+	add	x1, x11, x8, lsl 3
+	mov	x0, x12
 	bl	FlashMemCmp8
-	cbnz	w0, .L732
-	ldrb	w1, [x19,2358]
-	add	x2, x19, 1232
-	str	w0, [x2,w1,sxtw 2]
-	add	w0, w1, 1
-	add	x1, x19, w1, sxtw
-	strb	w0, [x19,2358]
-	strb	w24, [x1,2360]
-.L732:
-	add	x24, x24, 1
-	cmp	x24, 4
-	bne	.L733
-	add	x19, x21, :lo12:.LANCHOR0
-	add	x0, x22, :lo12:.LANCHOR2
-	ldrb	w1, [x19,2358]
-	strb	w1, [x0,3556]
-	ldrb	w0, [x20,8]
+	cbnz	w0, .L774
+	ldrb	w0, [x19, 2358]
+	add	w1, w0, 1
+	strb	w1, [x19, 2358]
+	str	wzr, [x20, x0, lsl 2]
+	add	x0, x19, x0
+	strb	w8, [x0, 2360]
+.L774:
+	add	x8, x8, 1
+	cmp	x8, 4
+	bne	.L775
+	add	x8, x22, :lo12:.LANCHOR0
+	add	x0, x21, :lo12:.LANCHOR2
+	ldrb	w1, [x8, 2358]
+	strb	w1, [x0, 3548]
+	ldrb	w0, [x7, 8]
 	cmp	w0, 2
-	beq	.L734
-.L738:
-	add	x21, x21, :lo12:.LANCHOR0
-	ldrb	w1, [x20,13]
-	add	x22, x22, :lo12:.LANCHOR2
-	ldp	x23, x24, [sp,48]
-	ldrb	w0, [x21,2358]
-	ldp	x25, x26, [sp,64]
+	beq	.L776
+.L780:
+	add	x9, x22, :lo12:.LANCHOR0
+	ldrh	w1, [x7, 14]
+	add	x10, x21, :lo12:.LANCHOR2
+	ldp	x19, x20, [sp, 16]
+	ldrb	w0, [x9, 2358]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 48
 	mul	w0, w0, w1
-	ldrh	w1, [x20,14]
-	ldp	x19, x20, [sp,16]
+	ldrb	w1, [x7, 13]
 	mul	w0, w0, w1
-	strh	w0, [x22,3558]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 80
-	ret
-.L734:
-	ldr	w25, [x19,76]
-	mov	x24, 0
-	add	x26, x19, 2132
-.L737:
-	ldrb	w2, [x20]
-	mov	x0, x23
-	add	x1, x26, x24, lsl 3
+	strh	w0, [x10, 3550]
+	ret
+.L776:
+	ldr	w14, [x8, 76]
+	add	x15, x8, 2132
+	add	x13, x8, 1232
+	mov	x11, 0
+.L779:
+	ldrb	w2, [x7]
+	add	x1, x15, x11, lsl 3
+	mov	x0, x12
 	bl	FlashMemCmp8
-	cbnz	w0, .L735
-	ldrb	w1, [x20,13]
-	add	x4, x19, 1232
-	ldrb	w3, [x19,2358]
-	mul	w0, w1, w25
-	ldrh	w1, [x20,14]
-	mov	x2, x3
-	and	w1, w1, 65280
-	mul	w1, w0, w1
-	str	w1, [x4,w3,sxtw 2]
-	ldrb	w0, [x20,23]
-	cbz	w0, .L736
-	lsl	w1, w1, 1
-	str	w1, [x4,w3,sxtw 2]
-.L736:
-	add	x0, x19, x3
+	cbnz	w0, .L777
+	ldrb	w1, [x7, 13]
+	ldrh	w0, [x7, 14]
+	ldrb	w2, [x8, 2358]
+	and	w0, w0, 65280
+	mul	w1, w1, w14
+	mul	w0, w0, w1
+	sxtw	x1, w2
+	str	w0, [x13, x1, lsl 2]
+	ldrb	w3, [x7, 23]
+	cbz	w3, .L778
+	lsl	w0, w0, 1
+	str	w0, [x13, x1, lsl 2]
+.L778:
+	add	x1, x8, x1
 	add	w2, w2, 1
-	strb	w2, [x19,2358]
-	strb	w24, [x0,2360]
-.L735:
-	add	x24, x24, 1
-	cmp	x24, 4
-	bne	.L737
-	b	.L738
+	strb	w2, [x8, 2358]
+	strb	w11, [x1, 2360]
+.L777:
+	add	x11, x11, 1
+	cmp	x11, 4
+	bne	.L779
+	b	.L780
 	.size	FlashDieInfoInit, .-FlashDieInfoInit
 	.align	2
 	.global	ftl_read_flash_info
 	.type	ftl_read_flash_info, %function
 ftl_read_flash_info:
 	stp	x29, x30, [sp, -32]!
-	mov	w1, 0
 	mov	w2, 11
+	mov	w1, 0
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	mov	x19, x0
 	bl	ftl_memset
-	adrp	x1, .LANCHOR0
-	mov	w5, 1
-	add	x1, x1, :lo12:.LANCHOR0
-	ldr	x0, [x1,88]
-	ldrb	w2, [x0,9]
-	ldr	w0, [x1,76]
-	mul	w0, w0, w2
-	strh	w0, [x19,4]
-	ldrb	w0, [x1,2464]
-	strb	w0, [x19,7]
-	ldr	w0, [x1,2584]
-	str	w0, [x19]
-	ldr	x0, [x1,88]
-	ldrb	w4, [x1,2358]
-	ldrb	w0, [x0,9]
-	strb	w0, [x19,6]
-	mov	w0, 32
-	strb	w0, [x19,8]
-	ldr	x0, [x1,88]
-	ldrb	w0, [x0,7]
-	strb	w0, [x19,9]
-	mov	x0, 0
-	strb	wzr, [x19,10]
-.L746:
-	cmp	w4, w0, uxtb
-	bls	.L748
-	add	x2, x1, 2360
-	ldrb	w3, [x19,10]
-	ldrb	w2, [x0,x2]
-	add	x0, x0, 1
-	lsl	w2, w5, w2
-	orr	w2, w2, w3
-	strb	w2, [x19,10]
-	b	.L746
-.L748:
-	ldr	x19, [sp,16]
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	mov	w4, 1
+	ldr	x1, [x0, 88]
+	ldrb	w2, [x1, 9]
+	ldr	w1, [x0, 76]
+	mul	w1, w1, w2
+	mov	x2, 0
+	strh	w1, [x19, 4]
+	ldrb	w1, [x0, 2464]
+	strb	w1, [x19, 7]
+	ldr	w1, [x0, 2584]
+	str	w1, [x19]
+	ldr	x1, [x0, 88]
+	ldrb	w3, [x0, 2358]
+	ldrb	w1, [x1, 9]
+	strb	w1, [x19, 6]
+	mov	w1, 32
+	strb	w1, [x19, 8]
+	ldr	x1, [x0, 88]
+	add	x0, x0, 2360
+	ldrb	w1, [x1, 7]
+	strb	w1, [x19, 9]
+	strb	wzr, [x19, 10]
+.L789:
+	cmp	w3, w2, uxtb
+	bhi	.L790
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L790:
+	ldrb	w1, [x2, x0]
+	add	x2, x2, 1
+	ldrb	w5, [x19, 10]
+	lsl	w1, w4, w1
+	orr	w1, w1, w5
+	strb	w1, [x19, 10]
+	b	.L789
 	.size	ftl_read_flash_info, .-ftl_read_flash_info
 	.align	2
 	.global	FtlMemInit
@@ -5736,351 +5674,353 @@ ftl_read_flash_info:
 FtlMemInit:
 	stp	x29, x30, [sp, -80]!
 	mov	w1, 65535
+	mov	w2, 1024
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	adrp	x21, .LANCHOR2
-	adrp	x22, .LANCHOR0
 	add	x0, x21, :lo12:.LANCHOR2
-	str	x25, [sp,64]
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	add	x3, x22, :lo12:.LANCHOR0
-	str	w1, [x0,3572]
-	strh	wzr, [x0,3560]
+	stp	x19, x20, [sp, 16]
+	add	x3, x0, 512
+	stp	x23, x24, [sp, 48]
+	str	x25, [sp, 64]
+	add	x4, x0, 512
+	strh	wzr, [x0, 3552]
+	add	x5, x0, 3328
+	str	wzr, [x0, 448]
+	adrp	x22, .LANCHOR0
+	stp	wzr, wzr, [x3, 208]
+	stp	wzr, wzr, [x3, 216]
+	str	wzr, [x0, 736]
+	str	wzr, [x0, 740]
+	stp	wzr, wzr, [x4, 240]
+	stp	wzr, wzr, [x4, 248]
+	str	wzr, [x0, 772]
+	str	wzr, [x0, 776]
+	str	wzr, [x0, 1360]
+	str	wzr, [x0, 1368]
+	str	wzr, [x0, 1376]
+	stp	w1, wzr, [x5, 236]
 	mov	w1, -1
-	str	wzr, [x0,3564]
-	strh	w1, [x0,1456]
-	str	wzr, [x0,848]
-	str	wzr, [x0,752]
-	str	wzr, [x0,756]
-	str	wzr, [x0,740]
-	str	wzr, [x0,728]
-	str	wzr, [x0,724]
-	str	wzr, [x0,732]
-	str	wzr, [x0,736]
-	str	wzr, [x0,720]
-	str	wzr, [x0,760]
-	str	wzr, [x0,764]
-	str	wzr, [x0,448]
-	str	wzr, [x0,772]
-	str	wzr, [x0,776]
-	str	wzr, [x0,3568]
-	str	wzr, [x0,1380]
-	str	wzr, [x0,3576]
-	str	wzr, [x0,1372]
-	str	wzr, [x0,3580]
-	strh	w1, [x0,1458]
-	strh	w1, [x0,1460]
-	strh	w1, [x0,1462]
+	stp	wzr, wzr, [x5, 228]
+	str	wzr, [x0, 3572]
+	strh	w1, [x0, 1448]
+	strh	w1, [x0, 1450]
+	strh	w1, [x0, 1452]
+	strh	w1, [x0, 1454]
 	mov	w1, 32
-	ldrh	w2, [x3,2550]
-	strh	w1, [x0,1368]
+	strh	w1, [x0, 1364]
 	mov	w1, 128
-	strh	w1, [x0,1370]
-	mov	w1, 1024
-	strh	wzr, [x0,1376]
-	sdiv	w2, w1, w2
-	ldrh	w1, [x3,2472]
-	strh	wzr, [x0,1464]
+	strh	w1, [x0, 1366]
+	add	x1, x22, :lo12:.LANCHOR0
+	strh	wzr, [x0, 1372]
+	strh	wzr, [x0, 1456]
+	ldrh	w3, [x1, 2550]
+	ldrh	w1, [x1, 2472]
+	strh	wzr, [x0, 3576]
+	strh	wzr, [x0, 1498]
+	sdiv	w2, w2, w3
 	lsl	w1, w1, 2
-	strh	wzr, [x0,3584]
-	strh	wzr, [x0,1506]
+	str	w2, [x0, 3580]
 	cmp	w2, w1
-	str	w2, [x0,3588]
-	bls	.L750
-	str	w1, [x0,3588]
-.L750:
+	bls	.L793
+	str	w1, [x0, 3580]
+.L793:
 	add	x20, x22, :lo12:.LANCHOR0
 	add	x19, x21, :lo12:.LANCHOR2
 	mov	w24, 56
-	ldrh	w0, [x20,2548]
-	str	wzr, [x20,2600]
+	ldrh	w0, [x20, 2548]
+	str	wzr, [x20, 2600]
 	lsl	w0, w0, 1
 	bl	ftl_malloc
-	str	x0, [x19,1432]
-	ldrh	w1, [x20,2548]
+	ldrh	w1, [x20, 2548]
+	str	x0, [x19, 1424]
 	mov	w0, 12
 	mul	w0, w1, w0
 	bl	ftl_malloc
-	ldrh	w23, [x20,2472]
-	str	x0, [x19,1448]
+	ldrh	w23, [x20, 2472]
+	str	x0, [x19, 1440]
 	mul	w23, w23, w24
 	lsl	w25, w23, 3
 	mov	w0, w25
 	bl	ftl_malloc
-	str	x0, [x19,3592]
+	str	x0, [x19, 3584]
 	mov	w0, w23
 	bl	ftl_malloc
-	str	x0, [x19,3600]
+	str	x0, [x19, 3592]
 	mov	w0, w25
 	bl	ftl_malloc
-	str	x0, [x19,3608]
+	str	x0, [x19, 3600]
 	mov	w0, w23
 	bl	ftl_malloc
-	str	x0, [x19,432]
+	str	x0, [x19, 432]
 	mov	w0, w23
 	bl	ftl_malloc
-	str	x0, [x19,1416]
-	ldr	w0, [x19,3588]
+	str	x0, [x19, 1408]
+	ldr	w0, [x19, 3580]
 	mul	w0, w0, w24
 	bl	ftl_malloc
-	str	x0, [x20,2608]
-	ldrh	w0, [x20,2472]
-	ldrh	w23, [x20,2554]
+	str	x0, [x20, 2608]
+	ldrh	w0, [x20, 2472]
+	ldrh	w23, [x20, 2554]
 	lsl	w0, w0, 1
 	add	w0, w0, 1
-	str	w0, [x19,1424]
+	str	w0, [x19, 1416]
 	mov	w0, w23
 	bl	ftl_malloc
-	str	x0, [x19,3616]
+	str	x0, [x19, 3608]
 	mov	w0, w23
 	bl	ftl_malloc
-	str	x0, [x19,3624]
+	str	x0, [x19, 3616]
 	mov	w0, w23
 	bl	ftl_malloc
-	str	x0, [x19,3632]
-	ldr	w0, [x19,1424]
+	str	x0, [x19, 3624]
+	ldr	w0, [x19, 1416]
 	mul	w0, w23, w0
 	bl	ftl_malloc
-	str	x0, [x19,1400]
-	ldr	w0, [x19,3588]
+	str	x0, [x19, 1392]
+	ldr	w0, [x19, 3580]
 	mul	w0, w23, w0
 	bl	ftl_malloc
-	str	x0, [x19,3640]
+	str	x0, [x19, 3632]
 	mov	w0, w23
 	bl	ftl_malloc
-	str	x0, [x19,3648]
+	str	x0, [x19, 3640]
 	mov	w0, w23
 	bl	ftl_malloc
-	str	x0, [x19,3656]
-	ldr	w1, [x19,1424]
+	str	x0, [x19, 3648]
+	ldr	w1, [x19, 1416]
 	mov	w0, 24
 	mul	w0, w1, w0
 	bl	ftl_malloc
-	ldrh	w23, [x20,2472]
-	str	x0, [x19,1392]
-	ldrh	w0, [x20,2556]
-	mul	w23, w0, w23
+	ldrh	w23, [x20, 2556]
+	str	x0, [x19, 1384]
+	ldrh	w0, [x20, 2472]
+	mul	w23, w23, w0
 	mov	w0, w23
 	bl	ftl_malloc
-	str	x0, [x19,3664]
+	str	x0, [x19, 3656]
 	lsl	w0, w23, 3
 	bl	ftl_malloc
-	str	x0, [x19,3672]
-	ldrh	w1, [x20,2556]
-	ldr	w0, [x19,1424]
+	str	x0, [x19, 3664]
+	ldrh	w1, [x20, 2556]
+	ldr	w0, [x19, 1416]
 	mul	w0, w1, w0
 	bl	ftl_malloc
-	str	x0, [x19,1408]
-	ldrh	w1, [x20,2556]
-	ldr	w0, [x19,3588]
+	str	x0, [x19, 1400]
+	ldrh	w1, [x20, 2556]
+	ldr	w0, [x19, 3580]
 	mul	w0, w1, w0
 	bl	ftl_malloc
-	str	x0, [x19,3680]
-	ldrh	w0, [x20,2482]
-	lsl	w0, w0, 1
-	strh	w0, [x19,3688]
+	str	x0, [x19, 3672]
+	ldrh	w0, [x20, 2482]
+	ubfiz	w0, w0, 1, 15
+	strh	w0, [x19, 3680]
 	and	w0, w0, 65534
 	bl	ftl_malloc
-	str	x0, [x19,3696]
-	ldrh	w0, [x19,3688]
+	str	x0, [x19, 3688]
+	ldrh	w0, [x19, 3680]
 	add	x0, x0, 547
 	lsr	x0, x0, 9
-	strh	w0, [x19,3688]
+	strh	w0, [x19, 3680]
 	lsl	w0, w0, 9
 	bl	ftl_malloc
-	ldrh	w23, [x20,2482]
-	str	x0, [x19,3704]
+	ldrh	w23, [x20, 2482]
+	str	x0, [x19, 3696]
 	add	x0, x0, 32
+	str	x0, [x19, 440]
 	lsl	w23, w23, 1
-	str	x0, [x19,440]
 	mov	w0, w23
 	bl	ftl_malloc
-	str	x0, [x19,3712]
+	str	x0, [x19, 3704]
 	mov	w0, w23
 	bl	ftl_malloc
-	ldr	w23, [x20,2572]
-	str	x0, [x19,520]
+	ldr	w23, [x20, 2572]
+	str	x0, [x19, 520]
 	lsl	w23, w23, 1
 	mov	w0, w23
 	bl	ftl_malloc
-	str	x0, [x19,3720]
+	str	x0, [x19, 3712]
 	mov	w0, w23
 	bl	ftl_malloc
-	str	x0, [x19,3728]
-	ldrh	w0, [x20,2482]
+	str	x0, [x19, 3720]
+	ldrh	w0, [x20, 2482]
 	lsr	w0, w0, 3
 	add	w0, w0, 4
 	bl	ftl_malloc
-	str	x0, [x22,#:lo12:.LANCHOR0]
-	ldrh	w0, [x20,2564]
+	str	x0, [x20, 64]
+	ldrh	w0, [x20, 2564]
 	lsl	w0, w0, 1
 	bl	ftl_malloc
-	str	x0, [x20,2592]
-	ldrh	w0, [x20,2564]
+	str	x0, [x20, 2592]
+	ldrh	w0, [x20, 2564]
 	lsl	w0, w0, 1
 	bl	ftl_malloc
-	str	x0, [x19,3736]
-	ldrh	w0, [x20,2564]
+	str	x0, [x19, 3728]
+	ldrh	w0, [x20, 2564]
 	lsl	w0, w0, 2
 	bl	ftl_malloc
-	str	x0, [x19,3744]
-	ldrh	w0, [x20,2566]
+	str	x0, [x19, 3736]
+	ldrh	w0, [x20, 2566]
 	lsl	w0, w0, 2
 	bl	ftl_malloc
-	str	x0, [x19,3752]
-	ldrh	w2, [x20,2566]
+	ldrh	w2, [x20, 2566]
 	mov	w1, 0
+	str	x0, [x19, 3744]
 	lsl	w2, w2, 2
 	bl	ftl_memset
-	ldrh	w23, [x20,2580]
+	ldrh	w23, [x20, 2580]
 	lsl	w23, w23, 2
 	mov	w0, w23
 	bl	ftl_malloc
-	str	x0, [x19,3760]
+	str	x0, [x19, 3752]
 	mov	w0, w23
 	bl	ftl_malloc
-	str	x0, [x19,3768]
-	ldr	w0, [x20,2572]
+	str	x0, [x19, 3760]
+	ldr	w0, [x20, 2572]
 	lsl	w0, w0, 2
 	bl	ftl_malloc
-	str	x0, [x19,3776]
-	ldrh	w0, [x20,2582]
+	str	x0, [x19, 3768]
+	ldrh	w0, [x20, 2582]
 	lsl	w0, w0, 4
 	bl	ftl_malloc
-	str	x0, [x19,704]
-	ldrh	w1, [x20,2582]
-	ldrh	w0, [x20,2554]
+	ldrh	w1, [x20, 2582]
+	str	x0, [x19, 704]
+	ldrh	w0, [x20, 2554]
 	mul	w0, w1, w0
 	bl	ftl_malloc
-	str	x0, [x19,3784]
-	ldrh	w1, [x20,2482]
+	str	x0, [x19, 3776]
+	ldrh	w1, [x20, 2482]
 	mov	w0, 6
 	mul	w0, w1, w0
 	bl	ftl_malloc
-	str	x0, [x19,504]
-	ldrh	w0, [x20,2542]
-	ldrh	w1, [x20,2494]
+	str	x0, [x19, 504]
+	ldrh	w0, [x20, 2542]
+	ldrh	w1, [x20, 2494]
 	add	w0, w0, 31
 	asr	w0, w0, 5
-	strh	w0, [x19,3792]
-	mul	w0, w0, w1
+	strh	w0, [x19, 3784]
+	mul	w0, w1, w0
 	lsl	w0, w0, 2
 	bl	ftl_malloc
-	str	x0, [x20,2656]
-	add	x1, x20, 2624
-	ldrh	w4, [x19,3792]
-	ldrh	w5, [x20,2494]
-	mov	w0, 1
-	mov	w2, w4
-.L751:
+	ldrh	w3, [x19, 3784]
+	add	x4, x20, 2664
+	ldrh	w5, [x20, 2494]
+	mov	w1, w3
+	str	x0, [x20, 2656]
+	mov	x0, 1
+.L794:
 	cmp	w0, w5
-	add	x1, x1, 8
-	bcs	.L851
-	ldr	x3, [x20,2656]
-	add	w0, w0, 1
-	add	x3, x3, w2, uxtw 2
-	add	w2, w2, w4
-	str	x3, [x1,32]
-	b	.L751
-.L851:
-	add	x1, x22, :lo12:.LANCHOR0
-.L753:
-	cmp	w0, 8
-	beq	.L852
-	add	x2, x1, w0, uxtw 3
-	add	w0, w0, 1
-	str	xzr, [x2,2656]
-	b	.L753
-.L852:
+	bcc	.L795
+	mov	w1, 8
+	add	x3, x22, :lo12:.LANCHOR0
+	sub	w1, w1, w0
+	add	x3, x3, 2624
+	add	x1, x1, 1
+	mov	x2, 0
+.L796:
+	add	x2, x2, 1
+	cmp	x2, x1
+	bne	.L797
 	add	x0, x21, :lo12:.LANCHOR2
-	ldr	x1, [x0,3720]
-	cbnz	x1, .L755
-.L757:
-	adrp	x0, .LC80
+	ldr	x1, [x0, 3712]
+	cbnz	x1, .L798
+.L800:
 	adrp	x1, .LANCHOR3
-	add	x0, x0, :lo12:.LC80
+	adrp	x0, .LC80
 	add	x1, x1, :lo12:.LANCHOR3
+	add	x0, x0, :lo12:.LC80
 	bl	printk
 	mov	w0, -1
-	b	.L756
-.L755:
-	ldr	x1, [x0,3728]
-	cbz	x1, .L757
-	ldr	x1, [x0,3760]
-	cbz	x1, .L757
-	ldr	x1, [x0,3776]
-	cbz	x1, .L757
-	ldr	x1, [x0,704]
-	cbz	x1, .L757
-	ldr	x1, [x0,3784]
-	cbz	x1, .L757
-	ldr	x1, [x0,504]
-	cbz	x1, .L757
+.L792:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldr	x25, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	ret
+.L795:
+	ldr	x2, [x20, 2656]
+	add	w0, w0, 1
+	add	x2, x2, w1, uxtw 2
+	add	w1, w1, w3
+	str	x2, [x4], 8
+	b	.L794
+.L797:
+	add	x4, x0, x2
+	add	x4, x3, x4, lsl 3
+	str	xzr, [x4, 24]
+	b	.L796
+.L798:
+	ldr	x1, [x0, 3720]
+	cbz	x1, .L800
+	ldr	x1, [x0, 3752]
+	cbz	x1, .L800
+	ldr	x1, [x0, 3768]
+	cbz	x1, .L800
+	ldr	x1, [x0, 704]
+	cbz	x1, .L800
+	ldr	x1, [x0, 3776]
+	cbz	x1, .L800
+	ldr	x1, [x0, 504]
+	cbz	x1, .L800
 	add	x22, x22, :lo12:.LANCHOR0
-	ldr	x1, [x22,2656]
-	cbz	x1, .L757
-	ldr	x0, [x0,520]
-	cbz	x0, .L757
+	ldr	x1, [x22, 2656]
+	cbz	x1, .L800
+	ldr	x0, [x0, 520]
+	cbz	x0, .L800
 	add	x0, x21, :lo12:.LANCHOR2
-	ldr	x1, [x0,1432]
-	cbz	x1, .L757
-	ldr	x1, [x0,1448]
-	cbz	x1, .L757
-	ldr	x1, [x0,3592]
-	cbz	x1, .L757
-	ldr	x1, [x0,3608]
-	cbz	x1, .L757
-	ldr	x1, [x0,432]
-	cbz	x1, .L757
-	ldr	x1, [x0,1416]
-	cbz	x1, .L757
-	ldr	x1, [x0,3600]
-	cbz	x1, .L757
-	ldr	x1, [x0,3616]
-	cbz	x1, .L757
-	ldr	x1, [x0,3624]
-	cbz	x1, .L757
-	ldr	x0, [x0,3632]
-	cbz	x0, .L757
+	ldr	x1, [x0, 1424]
+	cbz	x1, .L800
+	ldr	x1, [x0, 1440]
+	cbz	x1, .L800
+	ldr	x1, [x0, 3584]
+	cbz	x1, .L800
+	ldr	x1, [x0, 3600]
+	cbz	x1, .L800
+	ldr	x1, [x0, 432]
+	cbz	x1, .L800
+	ldr	x1, [x0, 1408]
+	cbz	x1, .L800
+	ldr	x1, [x0, 3592]
+	cbz	x1, .L800
+	ldr	x1, [x0, 3608]
+	cbz	x1, .L800
+	ldr	x1, [x0, 3616]
+	cbz	x1, .L800
+	ldr	x0, [x0, 3624]
+	cbz	x0, .L800
 	add	x0, x21, :lo12:.LANCHOR2
-	ldr	x1, [x0,1400]
-	cbz	x1, .L757
-	ldr	x1, [x0,3648]
-	cbz	x1, .L757
-	ldr	x1, [x0,3656]
-	cbz	x1, .L757
-	ldr	x1, [x0,1392]
-	cbz	x1, .L757
-	ldr	x1, [x0,3664]
-	cbz	x1, .L757
-	ldr	x1, [x0,3672]
-	cbz	x1, .L757
-	ldr	x1, [x0,1408]
-	cbz	x1, .L757
-	ldr	x1, [x0,440]
-	cbz	x1, .L757
-	ldr	x0, [x0,3696]
-	cbz	x0, .L757
+	ldr	x1, [x0, 1392]
+	cbz	x1, .L800
+	ldr	x1, [x0, 3640]
+	cbz	x1, .L800
+	ldr	x1, [x0, 3648]
+	cbz	x1, .L800
+	ldr	x1, [x0, 1384]
+	cbz	x1, .L800
+	ldr	x1, [x0, 3656]
+	cbz	x1, .L800
+	ldr	x1, [x0, 3664]
+	cbz	x1, .L800
+	ldr	x1, [x0, 1400]
+	cbz	x1, .L800
+	ldr	x1, [x0, 440]
+	cbz	x1, .L800
+	ldr	x0, [x0, 3688]
+	cbz	x0, .L800
 	adrp	x0, .LANCHOR0+2592
-	ldr	x0, [x0,#:lo12:.LANCHOR0+2592]
-	cbz	x0, .L757
+	ldr	x0, [x0, #:lo12:.LANCHOR0+2592]
+	cbz	x0, .L800
 	adrp	x0, .LANCHOR2
 	add	x0, x0, :lo12:.LANCHOR2
-	ldr	x1, [x0,3736]
-	cbz	x1, .L757
-	ldr	x1, [x0,3744]
-	cbz	x1, .L757
-	ldr	x0, [x0,3752]
-	cbz	x0, .L757
+	ldr	x1, [x0, 3728]
+	cbz	x1, .L800
+	ldr	x1, [x0, 3736]
+	cbz	x1, .L800
+	ldr	x0, [x0, 3744]
+	cbz	x0, .L800
 	mov	w0, 0
-.L756:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldr	x25, [sp,64]
-	ldp	x29, x30, [sp], 80
-	ret
+	b	.L792
 	.size	FtlMemInit, .-FtlMemInit
 	.align	2
 	.global	FtlBbt2Bitmap
@@ -6088,38 +6028,38 @@ FtlMemInit:
 FtlBbt2Bitmap:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	x20, x0
-	adrp	x0, .LANCHOR2+3792
+	adrp	x0, .LANCHOR2+3784
 	mov	x19, x1
-	ldrh	w2, [x0,#:lo12:.LANCHOR2+3792]
-	mov	x0, x1
 	mov	w1, 0
+	ldrh	w2, [x0, #:lo12:.LANCHOR2+3784]
+	mov	x0, x19
 	lsl	w2, w2, 2
 	bl	ftl_memset
-	adrp	x5, .LANCHOR0
-	mov	x3, 0
-	mov	w0, 65535
-	mov	w6, 1
-	add	x5, x5, :lo12:.LANCHOR0
-.L855:
-	ldrh	w2, [x20,x3]
-	cmp	w2, w0
-	beq	.L853
-	ubfx	x4, x2, 5, 11
-	lsl	w2, w6, w2
-	lsl	x4, x4, 2
-	add	x3, x3, 2
-	cmp	x3, 1024
-	ldr	w1, [x19,x4]
-	orr	w2, w1, w2
-	str	w2, [x19,x4]
-	ldrh	w2, [x5,2630]
-	add	w2, w2, 1
-	strh	w2, [x5,2630]
-	bne	.L855
-.L853:
-	ldp	x19, x20, [sp,16]
+	adrp	x3, .LANCHOR0
+	add	x3, x3, :lo12:.LANCHOR0
+	mov	x1, 0
+	mov	w6, 65535
+	mov	w5, 1
+.L897:
+	ldrh	w0, [x20, x1]
+	cmp	w0, w6
+	beq	.L895
+	ubfx	x2, x0, 5, 11
+	lsl	w0, w5, w0
+	lsl	x2, x2, 2
+	add	x1, x1, 2
+	cmp	x1, 1024
+	ldr	w4, [x19, x2]
+	orr	w0, w4, w0
+	str	w0, [x19, x2]
+	ldrh	w0, [x3, 2630]
+	add	w0, w0, 1
+	strh	w0, [x3, 2630]
+	bne	.L897
+.L895:
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	FtlBbt2Bitmap, .-FtlBbt2Bitmap
@@ -6127,16 +6067,16 @@ FtlBbt2Bitmap:
 	.global	FtlBbtMemInit
 	.type	FtlBbtMemInit, %function
 FtlBbtMemInit:
-	adrp	x0, .LANCHOR0
-	mov	w1, -1
 	stp	x29, x30, [sp, -16]!
+	adrp	x0, .LANCHOR0
 	add	x0, x0, :lo12:.LANCHOR0
-	mov	w2, 16
+	mov	w1, -1
 	add	x29, sp, 0
+	mov	w2, 16
 	add	x0, x0, 2636
-	strh	w1, [x0,-12]
+	strh	w1, [x0, -12]
 	mov	w1, 255
-	strh	wzr, [x0,-6]
+	strh	wzr, [x0, -6]
 	bl	ftl_memset
 	ldp	x29, x30, [sp], 16
 	ret
@@ -6145,17 +6085,17 @@ FtlBbtMemInit:
 	.global	FtlFreeSysBlkQueueInit
 	.type	FtlFreeSysBlkQueueInit, %function
 FtlFreeSysBlkQueueInit:
-	adrp	x1, .LANCHOR0
-	mov	w2, 2048
 	stp	x29, x30, [sp, -16]!
-	add	x1, x1, :lo12:.LANCHOR0
+	adrp	x3, .LANCHOR0
+	add	x3, x3, :lo12:.LANCHOR0
+	mov	w2, 2048
 	add	x29, sp, 0
-	strh	w0, [x1,2720]
-	add	x0, x1, 2728
-	strh	wzr, [x1,2722]
-	strh	wzr, [x1,2724]
-	strh	wzr, [x1,2726]
 	mov	w1, 0
+	strh	w0, [x3, 2720]
+	add	x0, x3, 2728
+	strh	wzr, [x3, 2722]
+	strh	wzr, [x3, 2724]
+	strh	wzr, [x3, 2726]
 	bl	ftl_memset
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
@@ -6168,96 +6108,98 @@ ftl_free_no_use_map_blk:
 	stp	x29, x30, [sp, -80]!
 	mov	w1, 0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	str	x25, [sp,64]
+	stp	x19, x20, [sp, 16]
 	mov	x19, x0
-	ldrh	w2, [x0,10]
-	ldr	x21, [x0,32]
-	ldr	x22, [x0,16]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	str	x25, [sp, 64]
+	ldrh	w2, [x0, 10]
+	ldp	x21, x20, [x0, 32]
+	ldr	x22, [x0, 16]
 	lsl	w2, w2, 1
-	ldr	x20, [x0,40]
 	mov	x0, x21
 	bl	ftl_memset
 	mov	w0, 0
-.L861:
-	ldrh	w1, [x19,6]
+.L906:
+	ldrh	w1, [x19, 6]
 	cmp	w1, w0
-	bls	.L883
+	bhi	.L910
+	adrp	x0, .LANCHOR0+2546
+	mov	w23, 0
+	mov	w20, 0
+	ldrh	w1, [x0, #:lo12:.LANCHOR0+2546]
+	ldrh	w0, [x19]
+	strh	w1, [x21, x0, lsl 1]
+	ldrh	w24, [x21]
+.L911:
+	ldrh	w0, [x19, 10]
+	cmp	w0, w20
+	bhi	.L915
+	mov	w0, w23
+	ldr	x25, [sp, 64]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 80
+	ret
+.L910:
 	ubfiz	x1, x0, 2, 16
-	ldr	w2, [x20,x1]
+	ldr	w2, [x20, x1]
 	mov	w1, 0
 	ubfx	x2, x2, 10, 16
-.L862:
-	ldrh	w3, [x19,10]
+.L907:
+	ldrh	w3, [x19, 10]
 	cmp	w3, w1
-	bls	.L884
+	bhi	.L909
+	add	w0, w0, 1
+	and	w0, w0, 65535
+	b	.L906
+.L909:
 	ubfiz	x3, x1, 1, 16
-	ldrh	w4, [x22,x3]
-	cmp	w2, w4
-	bne	.L863
-	cbz	w4, .L863
-	ldrh	w4, [x21,x3]
+	ldrh	w4, [x22, x3]
+	cmp	w4, w2
+	bne	.L908
+	cbz	w2, .L908
+	ldrh	w4, [x21, x3]
 	add	w4, w4, 1
-	strh	w4, [x21,x3]
-.L863:
+	strh	w4, [x21, x3]
+.L908:
 	add	w1, w1, 1
-	uxth	w1, w1
-	b	.L862
-.L884:
-	add	w0, w0, 1
-	uxth	w0, w0
-	b	.L861
-.L883:
-	adrp	x0, .LANCHOR0+2546
-	mov	w23, 0
-	mov	w20, w23
-	ldrh	w1, [x0,#:lo12:.LANCHOR0+2546]
-	ldrh	w0, [x19]
-	strh	w1, [x21,x0,lsl 1]
-	ldrh	w24, [x21]
-.L866:
-	ldrh	w0, [x19,10]
-	cmp	w0, w20
-	bls	.L885
-	ubfiz	x2, x20, 1, 16
-	ldrh	w1, [x21,x2]
+	and	w1, w1, 65535
+	b	.L907
+.L915:
+	ubfiz	x0, x20, 1, 16
+	ldrh	w1, [x21, x0]
 	cmp	w24, w1
-	bls	.L867
-	ldrh	w0, [x22,x2]
-	add	x25, x22, x2
-	cbnz	w0, .L868
-	b	.L869
-.L867:
-	cbnz	w1, .L869
-	ldrh	w0, [x22,x2]
-	add	x25, x22, x2
-	cbz	w0, .L869
-.L871:
+	bls	.L912
+	add	x25, x22, x0
+	ldrh	w0, [x22, x0]
+	cbnz	w0, .L913
+.L914:
+	add	w20, w20, 1
+	and	w20, w20, 65535
+	b	.L911
+.L912:
+	cbnz	w1, .L914
+	add	x25, x22, x0
+	ldrh	w0, [x22, x0]
+	cbz	w0, .L914
+.L916:
 	mov	w1, 1
 	bl	FtlFreeSysBlkQueueIn
 	strh	wzr, [x25]
-	ldrh	w0, [x19,8]
+	ldrh	w0, [x19, 8]
 	sub	w0, w0, #1
-	strh	w0, [x19,8]
-.L869:
-	add	w20, w20, 1
-	uxth	w20, w20
-	b	.L866
-.L868:
+	strh	w0, [x19, 8]
+	b	.L914
+.L917:
+	mov	w24, 0
+	b	.L916
+.L913:
 	mov	w23, w20
+	cbz	w1, .L917
 	mov	w24, w1
-	cbz	w1, .L871
-	b	.L869
-.L885:
-	mov	w0, w23
-	ldr	x25, [sp,64]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 80
-	ret
+	b	.L914
 	.size	ftl_free_no_use_map_blk, .-ftl_free_no_use_map_blk
 	.align	2
 	.global	FtlL2PDataInit
@@ -6266,74 +6208,73 @@ FtlL2PDataInit:
 	stp	x29, x30, [sp, -48]!
 	mov	w1, 0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR0
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	stp	x21, x22, [sp,32]
-	add	x21, x20, :lo12:.LANCHOR0
-	add	x22, x19, :lo12:.LANCHOR2
-	ldr	w2, [x21,2572]
-	ldr	x0, [x22,3728]
+	str	x21, [sp, 32]
+	add	x21, x19, :lo12:.LANCHOR2
+	adrp	x20, .LANCHOR0
+	add	x20, x20, :lo12:.LANCHOR0
+	ldr	x0, [x21, 3720]
+	ldr	w2, [x20, 2572]
 	lsl	w2, w2, 1
 	bl	ftl_memset
-	ldrh	w3, [x21,2554]
+	ldrh	w0, [x20, 2582]
 	mov	w1, 255
-	ldrh	w2, [x21,2582]
-	ldr	x0, [x22,3784]
-	mul	w2, w3, w2
+	ldrh	w2, [x20, 2554]
+	mul	w2, w2, w0
+	ldr	x0, [x21, 3776]
 	bl	ftl_memset
+	mov	x0, x21
 	mov	w1, 0
 	mov	w5, -1
-.L887:
-	add	x3, x20, :lo12:.LANCHOR0
-	ldrh	w0, [x3,2582]
-	cmp	w0, w1
-	bls	.L889
-	add	x4, x19, :lo12:.LANCHOR2
-	ubfiz	x0, x1, 4, 16
-	ldr	x2, [x4,704]
-	add	x2, x2, x0
-	str	wzr, [x2,4]
-	ldr	x2, [x4,704]
-	strh	w5, [x2,x0]
-	ldr	x2, [x4,704]
-	add	x2, x2, x0
-	ldrh	w0, [x3,2554]
-	ldr	x3, [x4,3784]
-	mul	w0, w0, w1
-	add	w1, w1, 1
-	sxtw	x0, w0
-	uxth	w1, w1
-	and	x0, x0, -4
-	add	x0, x3, x0
-	str	x0, [x2,8]
-	b	.L887
-.L889:
+.L927:
+	ldrh	w2, [x20, 2582]
+	cmp	w2, w1
+	bhi	.L928
 	add	x0, x19, :lo12:.LANCHOR2
 	mov	w2, -1
-	add	x1, x0, 3800
-	strh	w2, [x0,3802]
-	strh	w2, [x0,3800]
-	ldr	w2, [x3,2572]
-	strh	w2, [x0,3810]
+	add	x1, x0, 3792
+	strh	w2, [x0, 3794]
+	strh	w2, [x0, 3792]
+	ldr	w2, [x20, 2572]
+	strh	w2, [x0, 3802]
 	mov	w2, -3902
-	strh	w2, [x0,3804]
-	ldrh	w2, [x0,3864]
-	strh	w2, [x0,3808]
-	ldrh	w2, [x3,2580]
-	strh	w2, [x0,3806]
-	ldr	x2, [x0,3720]
-	str	x2, [x0,3816]
-	ldr	x2, [x0,3776]
-	str	x2, [x0,3824]
-	ldr	x2, [x0,3728]
-	str	x2, [x0,3832]
-	ldr	x0, [x0,3760]
-	str	x0, [x1,40]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
+	strh	w2, [x0, 3796]
+	ldrh	w2, [x0, 3856]
+	strh	w2, [x0, 3800]
+	ldrh	w2, [x20, 2580]
+	strh	w2, [x0, 3798]
+	ldr	x2, [x0, 3712]
+	str	x2, [x0, 3808]
+	ldr	x2, [x0, 3768]
+	str	x2, [x0, 3816]
+	ldr	x2, [x0, 3720]
+	str	x2, [x0, 3824]
+	ldr	x0, [x0, 3752]
+	str	x0, [x1, 40]
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
+.L928:
+	ldr	x3, [x0, 704]
+	ubfiz	x2, x1, 4, 16
+	add	x3, x3, x2
+	str	wzr, [x3, 4]
+	ldr	x3, [x0, 704]
+	strh	w5, [x3, x2]
+	ldr	x3, [x0, 704]
+	ldr	x4, [x0, 3776]
+	add	x3, x3, x2
+	ldrh	w2, [x20, 2554]
+	mul	w2, w2, w1
+	add	w1, w1, 1
+	and	w1, w1, 65535
+	sxtw	x2, w2
+	and	x2, x2, -4
+	add	x2, x4, x2
+	str	x2, [x3, 8]
+	b	.L927
 	.size	FtlL2PDataInit, .-FtlL2PDataInit
 	.align	2
 	.global	FtlVariablesInit
@@ -6343,45 +6284,45 @@ FtlVariablesInit:
 	mov	w0, -1
 	mov	w1, 0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	adrp	x20, .LANCHOR0
 	add	x19, x19, :lo12:.LANCHOR2
+	adrp	x20, .LANCHOR0
 	add	x20, x20, :lo12:.LANCHOR0
-	strh	w0, [x19,3880]
+	strh	w0, [x19, 3872]
 	mov	w0, -1
-	ldrh	w2, [x20,2564]
-	str	w0, [x19,3892]
-	ldr	x0, [x20,2592]
+	str	w0, [x19, 3884]
+	ldr	x0, [x20, 2592]
+	ldrh	w2, [x20, 2564]
+	strh	wzr, [x20, 2590]
+	str	xzr, [x19, 3864]
 	lsl	w2, w2, 1
-	str	xzr, [x19,3872]
-	str	wzr, [x19,3884]
-	str	wzr, [x19,3888]
-	str	wzr, [x20,2372]
-	strh	wzr, [x20,2590]
+	str	wzr, [x19, 3876]
+	str	wzr, [x19, 3880]
+	str	wzr, [x20, 2372]
 	bl	ftl_memset
-	ldrh	w2, [x20,2482]
+	ldr	x0, [x19, 440]
 	mov	w1, 0
-	ldr	x0, [x19,440]
+	ldrh	w2, [x20, 2482]
 	lsl	w2, w2, 1
 	bl	ftl_memset
-	ldrh	w2, [x20,2482]
+	ldr	x0, [x19, 3688]
 	mov	w1, 0
-	ldr	x0, [x19,3696]
+	ldrh	w2, [x20, 2482]
 	lsl	w2, w2, 1
 	bl	ftl_memset
-	add	x0, x19, 456
-	mov	w1, 0
 	mov	w2, 48
-	bl	ftl_memset
 	mov	w1, 0
+	add	x0, x19, 456
+	bl	ftl_memset
 	mov	w2, 512
-	add	x0, x19, 856
+	mov	w1, 0
+	add	x0, x19, 848
 	bl	ftl_memset
 	bl	FtlGcBufInit
 	bl	FtlL2PDataInit
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	FtlVariablesInit, .-FtlVariablesInit
@@ -6389,114 +6330,105 @@ FtlVariablesInit:
 	.global	SupperBlkListInit
 	.type	SupperBlkListInit, %function
 SupperBlkListInit:
-	stp	x29, x30, [sp, -112]!
+	stp	x29, x30, [sp, -64]!
+	mov	w0, 6
 	mov	w1, 0
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	adrp	x23, .LANCHOR0
-	mov	w24, 6
-	add	x0, x23, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	stp	x19, x20, [sp,16]
-	stp	x27, x28, [sp,80]
-	adrp	x21, .LANCHOR2
-	mov	w25, 0
-	add	x19, x21, :lo12:.LANCHOR2
-	ldrh	w2, [x0,2482]
-	mov	w22, w25
-	mov	w26, 32768
-	ldr	x0, [x19,504]
-	mul	w2, w2, w24
+	stp	x21, x22, [sp, 32]
+	adrp	x21, .LANCHOR0
+	add	x21, x21, :lo12:.LANCHOR0
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR2
+	add	x19, x20, :lo12:.LANCHOR2
+	stp	x23, x24, [sp, 48]
+	add	x24, x21, 2504
+	ldrh	w2, [x21, 2482]
+	mov	w22, 0
+	mov	w23, 0
+	mul	w2, w2, w0
+	ldr	x0, [x19, 504]
 	bl	ftl_memset
-	str	xzr, [x19,544]
-	str	xzr, [x19,512]
-	str	xzr, [x19,528]
-	strh	wzr, [x19,536]
-	strh	wzr, [x19,552]
-	strh	wzr, [x19,3560]
-	mov	w19, w25
-.L892:
-	add	x0, x23, :lo12:.LANCHOR0
-	ldrh	w1, [x0,2480]
-	cmp	w19, w1
-	bge	.L899
-	mov	w20, 0
-	ldrh	w3, [x0,2472]
-	ldrh	w2, [x0,2544]
-	mov	w28, w20
-	mov	x27, x0
-.L900:
-	cmp	w28, w3
-	bge	.L901
-	add	x0, x27, 2504
+	strh	wzr, [x19, 536]
+	strh	wzr, [x19, 552]
+	strh	wzr, [x19, 3552]
+	str	xzr, [x19, 512]
+	str	xzr, [x19, 528]
+	str	xzr, [x19, 544]
+	mov	w19, 0
+.L933:
+	ldrh	w0, [x21, 2480]
+	cmp	w19, w0
+	bge	.L940
+	ldrh	w8, [x21, 2472]
+	mov	w5, 0
+	ldrh	w7, [x21, 2544]
+	mov	w6, 0
+	b	.L941
+.L935:
+	ldrb	w0, [x24, w6, sxtw]
 	mov	w1, w19
-	str	x2, [x29,96]
-	str	x3, [x29,104]
-	ldrb	w0, [x0,w28,sxtw]
 	bl	V2P_block
 	bl	FtlBbmIsBadBlock
-	ldr	x3, [x29,104]
-	ldr	x2, [x29,96]
-	cbnz	w0, .L893
-	add	w20, w2, w20
-	sxth	w20, w20
-.L893:
-	add	w28, w28, 1
-	sxth	w28, w28
-	b	.L900
-.L901:
-	cbz	w20, .L895
-	sdiv	w20, w26, w20
-	sxth	w20, w20
-	b	.L896
-.L895:
-	add	x0, x21, :lo12:.LANCHOR2
-	mov	w1, -1
-	ldr	x0, [x0,520]
-	strh	w1, [x0,w19,sxtw 1]
-.L896:
-	add	x0, x21, :lo12:.LANCHOR2
-	ldr	x1, [x0,504]
-	smaddl	x1, w19, w24, x1
-	strh	w20, [x1,4]
-	ldrh	w1, [x0,560]
+	cbnz	w0, .L934
+	add	w5, w7, w5
+	sxth	w5, w5
+.L934:
+	add	w6, w6, 1
+	sxth	w6, w6
+.L941:
+	cmp	w6, w8
+	blt	.L935
+	cbz	w5, .L936
+	mov	w0, 32768
+	sdiv	w5, w0, w5
+	sxth	w5, w5
+.L937:
+	add	x0, x20, :lo12:.LANCHOR2
+	mov	w1, 6
+	ldr	x2, [x0, 504]
+	smaddl	x1, w19, w1, x2
+	strh	w5, [x1, 4]
+	ldrh	w1, [x0, 560]
 	cmp	w19, w1
-	beq	.L897
-	ldrh	w1, [x0,608]
+	beq	.L938
+	ldrh	w1, [x0, 608]
 	cmp	w19, w1
-	beq	.L897
-	ldrh	w1, [x0,656]
+	beq	.L938
+	ldrh	w1, [x0, 656]
 	cmp	w19, w1
-	beq	.L897
-	ldr	x0, [x0,520]
-	ldrh	w0, [x0,w19,sxtw 1]
-	cbnz	w0, .L898
-	add	w4, w25, 1
-	mov	w0, w19
-	uxth	w25, w4
-	bl	INSERT_FREE_LIST
-	b	.L897
-.L898:
+	beq	.L938
+	ldr	x0, [x0, 520]
+	ldrh	w0, [x0, w19, sxtw 1]
+	cbnz	w0, .L939
 	add	w22, w22, 1
 	mov	w0, w19
-	uxth	w22, w22
-	bl	INSERT_DATA_LIST
-.L897:
+	and	w22, w22, 65535
+	bl	INSERT_FREE_LIST
+.L938:
 	add	w19, w19, 1
 	sxth	w19, w19
-	b	.L892
-.L899:
-	add	x21, x21, :lo12:.LANCHOR2
+	b	.L933
+.L936:
+	add	x0, x20, :lo12:.LANCHOR2
+	mov	w1, -1
+	ldr	x0, [x0, 520]
+	strh	w1, [x0, w19, sxtw 1]
+	b	.L937
+.L939:
+	add	w23, w23, 1
+	mov	w0, w19
+	and	w23, w23, 65535
+	bl	INSERT_DATA_LIST
+	b	.L938
+.L940:
+	add	x20, x20, :lo12:.LANCHOR2
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x23, x24, [sp,48]
-	strh	w25, [x21,552]
-	strh	w22, [x21,536]
-	ldp	x25, x26, [sp,64]
-	ldp	x21, x22, [sp,32]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 112
+	strh	w23, [x20, 536]
+	strh	w22, [x20, 552]
+	ldp	x23, x24, [sp, 48]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 64
 	ret
 	.size	SupperBlkListInit, .-SupperBlkListInit
 	.align	2
@@ -6506,25 +6438,25 @@ FtlGcPageVarInit:
 	stp	x29, x30, [sp, -32]!
 	mov	w1, 255
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR0
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	add	x20, x20, :lo12:.LANCHOR0
 	add	x19, x19, :lo12:.LANCHOR2
-	ldrh	w2, [x20,2548]
-	ldr	x0, [x19,1432]
+	adrp	x20, .LANCHOR0
+	add	x20, x20, :lo12:.LANCHOR0
+	ldr	x0, [x19, 1424]
+	ldrh	w2, [x20, 2548]
+	strh	wzr, [x19, 1420]
+	strh	wzr, [x19, 1432]
 	lsl	w2, w2, 1
-	strh	wzr, [x19,1428]
-	strh	wzr, [x19,1440]
 	bl	ftl_memset
-	ldrh	w3, [x20,2548]
-	mov	w2, 12
-	ldr	x0, [x19,1448]
+	ldrh	w2, [x20, 2548]
+	mov	w0, 12
 	mov	w1, 255
-	mul	w2, w3, w2
+	mul	w2, w2, w0
+	ldr	x0, [x19, 1440]
 	bl	ftl_memset
 	bl	FtlGcBufInit
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	FtlGcPageVarInit, .-FtlGcPageVarInit
@@ -6545,10 +6477,10 @@ ftl_memcpy:
 FlashReadIdbData:
 	stp	x29, x30, [sp, -16]!
 	adrp	x1, .LANCHOR2
-	mov	w2, 2048
 	add	x1, x1, :lo12:.LANCHOR2
+	mov	w2, 2048
 	add	x29, sp, 0
-	add	x1, x1, 3896
+	add	x1, x1, 3888
 	bl	ftl_memcpy
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
@@ -6558,76 +6490,73 @@ FlashReadIdbData:
 	.global	FlashLoadPhyInfoInRam
 	.type	FlashLoadPhyInfoInRam, %function
 FlashLoadPhyInfoInRam:
-	stp	x29, x30, [sp, -64]!
+	stp	x29, x30, [sp, -48]!
+	adrp	x0, .LANCHOR0
+	add	x10, x0, :lo12:.LANCHOR0
+	mov	x7, x0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR1
-	adrp	x22, .LANCHOR0
-	add	x21, x19, :lo12:.LANCHOR1
-	add	x22, x22, :lo12:.LANCHOR0
-	str	x23, [sp,48]
-	add	x21, x21, 512
-	mov	w20, 0
-	add	x22, x22, 2132
-.L909:
-	ldrb	w2, [x21]
-	add	x0, x21, 1
-	mov	x1, x22
+	add	x8, x19, :lo12:.LANCHOR1
+	add	x10, x10, 2132
+	add	x8, x8, 513
+	mov	x9, 0
+	str	x21, [sp, 32]
+.L952:
+	ldrb	w2, [x8, -1]
+	mov	w11, w9
+	lsl	x21, x9, 5
+	mov	x1, x10
+	mov	x0, x8
 	bl	FlashMemCmp8
-	mov	w23, w0
-	cbnz	w0, .L906
-	add	x0, x19, :lo12:.LANCHOR1
-	ubfiz	x20, x20, 5, 32
-	add	x1, x0, 512
-	adds	x20, x1, x20
-	beq	.L912
-	ldrb	w3, [x20,22]
-	mov	x2, 0
-	mov	x1, x0
-	b	.L911
-.L906:
-	add	w20, w20, 1
-	add	x21, x21, 32
-	cmp	w20, 86
-	bne	.L909
-	b	.L912
-.L911:
-	add	x4, x1, x2, lsl 5
-	mov	w0, w2
-	ldrb	w4, [x4,3264]
+	mov	w20, w0
+	cbnz	w0, .L950
+	add	x2, x19, :lo12:.LANCHOR1
+	ubfiz	x11, x11, 5, 32
+	add	x0, x2, 512
+	add	x1, x2, 3264
+	add	x21, x0, x21
+	add	x0, x0, x11
+	ldrb	w3, [x0, 22]
+	mov	x0, 0
+.L951:
+	lsl	x4, x0, 5
+	mov	w2, w0
+	ldrb	w4, [x4, x1]
 	cmp	w4, w3
-	beq	.L910
-	add	x2, x2, 1
-	cmp	x2, 4
-	bne	.L911
-	mov	w0, w2
-.L910:
+	beq	.L954
+	add	x0, x0, 1
+	cmp	x0, 4
+	bne	.L951
+	mov	w2, w0
+.L954:
 	add	x19, x19, :lo12:.LANCHOR1
-	ubfiz	x1, x0, 5, 32
-	adrp	x0, .LANCHOR0
-	add	x2, x19, 3264
-	add	x0, x0, :lo12:.LANCHOR0
-	add	x1, x2, x1
-	add	x0, x0, 96
-	mov	w2, 32
+	add	x0, x7, :lo12:.LANCHOR0
+	add	x3, x19, 3264
+	ubfiz	x1, x2, 5, 32
 	add	x19, x19, 472
+	add	x1, x3, x1
+	mov	w2, 32
+	add	x0, x0, 96
 	bl	ftl_memcpy
-	mov	x0, x19
-	mov	x1, x20
 	mov	w2, 32
+	mov	x1, x21
+	mov	x0, x19
 	bl	ftl_memcpy
-	ldrh	w0, [x19,10]
+	ldrh	w0, [x19, 10]
 	bl	FlashBlockAlignInit
-	b	.L907
-.L912:
-	mov	w23, -1
-.L907:
-	mov	w0, w23
-	ldr	x23, [sp,48]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 64
+	b	.L949
+.L950:
+	add	x9, x9, 1
+	add	x8, x8, 32
+	cmp	x9, 86
+	bne	.L952
+	mov	w20, -1
+.L949:
+	mov	w0, w20
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 48
 	ret
 	.size	FlashLoadPhyInfoInRam, .-FlashLoadPhyInfoInRam
 	.align	2
@@ -6635,79 +6564,71 @@ FlashLoadPhyInfoInRam:
 	.type	NandcCopy1KB, %function
 NandcCopy1KB:
 	stp	x29, x30, [sp, -48]!
-	uxtb	w1, w1
-	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	str	x21, [sp,32]
-	uxtb	w19, w2
+	and	w1, w1, 255
 	cmp	w1, 1
-	mov	x20, x4
-	ubfiz	x2, x19, 9, 8
-	add	x4, x0, 4096
+	add	x29, sp, 0
+	stp	x19, x20, [sp, 16]
+	and	w19, w2, 255
+	str	x21, [sp, 32]
+	add	x2, x0, 4096
 	add	x21, x0, 512
-	add	x2, x4, x2
-	bne	.L917
-	cbz	x3, .L918
-	mov	x0, x2
-	mov	x1, x3
+	ubfiz	x0, x19, 9, 8
+	mov	x20, x4
+	add	x0, x2, x0
+	bne	.L959
+	cbz	x3, .L960
 	mov	w2, 1024
+	mov	x1, x3
 	bl	ftl_memcpy
-.L918:
-	cbz	x20, .L916
-	mov	w0, 48
+.L960:
+	cbz	x20, .L958
 	lsr	w19, w19, 1
-	ldrb	w1, [x20,1]
-	mul	w19, w19, w0
-	ldrb	w0, [x20,2]
-	asr	w19, w19, 2
-	lsl	w0, w0, 16
-	orr	w0, w0, w1, lsl 8
-	ldrb	w1, [x20]
-	orr	w0, w0, w1
-	ldrb	w1, [x20,3]
-	orr	w0, w0, w1, lsl 24
-	str	w0, [x21,w19,sxtw 2]
-	b	.L916
-.L917:
-	cbz	x3, .L921
-	mov	x1, x2
-	mov	x0, x3
+	mov	w1, 48
+	ldr	w0, [x20]
+	mul	w19, w19, w1
+	and	x19, x19, 8176
+	str	w0, [x21, x19]
+.L958:
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	ret
+.L959:
+	cbz	x3, .L963
+	mov	x1, x0
 	mov	w2, 1024
+	mov	x0, x3
 	bl	ftl_memcpy
-.L921:
-	cbz	x20, .L916
-	mov	w0, 48
+.L963:
+	cbz	x20, .L958
 	lsr	w19, w19, 1
+	mov	w0, 48
 	mul	w19, w19, w0
-	asr	w19, w19, 2
-	ldr	w0, [x21,w19,sxtw 2]
+	and	x19, x19, 8176
+	ldr	w0, [x21, x19]
 	strb	w0, [x20]
 	lsr	w1, w0, 8
-	strb	w1, [x20,1]
+	strb	w1, [x20, 1]
 	lsr	w1, w0, 16
 	lsr	w0, w0, 24
-	strb	w1, [x20,2]
-	strb	w0, [x20,3]
-.L916:
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
-	ldp	x29, x30, [sp], 48
-	ret
+	strb	w1, [x20, 2]
+	strb	w0, [x20, 3]
+	b	.L958
 	.size	NandcCopy1KB, .-NandcCopy1KB
 	.align	2
 	.global	ftl_memcpy32
 	.type	ftl_memcpy32, %function
 ftl_memcpy32:
 	mov	x3, 0
-.L933:
+.L976:
 	cmp	w2, w3
-	bls	.L935
-	ldr	w4, [x1,x3,lsl 2]
-	str	w4, [x0,x3,lsl 2]
-	add	x3, x3, 1
-	b	.L933
-.L935:
+	bhi	.L977
 	ret
+.L977:
+	ldr	w4, [x1, x3, lsl 2]
+	str	w4, [x0, x3, lsl 2]
+	add	x3, x3, 1
+	b	.L976
 	.size	ftl_memcpy32, .-ftl_memcpy32
 	.align	2
 	.global	ftl_memcmp
@@ -6724,10 +6645,10 @@ ftl_memcmp:
 	.global	timer_get_time
 	.type	timer_get_time, %function
 timer_get_time:
-	adrp	x0, jiffies
 	stp	x29, x30, [sp, -16]!
+	adrp	x0, jiffies
 	add	x29, sp, 0
-	ldr	x0, [x0,#:lo12:jiffies]
+	ldr	x0, [x0, #:lo12:jiffies]
 	bl	jiffies_to_msecs
 	ldp	x29, x30, [sp], 16
 	ret
@@ -6736,24 +6657,24 @@ timer_get_time:
 	.global	FlashSramLoadStore
 	.type	FlashSramLoadStore, %function
 FlashSramLoadStore:
-	adrp	x4, .LANCHOR4+1592
-	mov	x6, x0
 	stp	x29, x30, [sp, -16]!
-	uxtw	x1, w1
+	adrp	x4, .LANCHOR4+1584
+	uxtw	x5, w1
 	add	x29, sp, 0
-	ldr	x4, [x4,#:lo12:.LANCHOR4+1592]
+	ldr	x4, [x4, #:lo12:.LANCHOR4+1584]
 	add	x4, x4, 4096
-	cbnz	w2, .L939
-	add	x1, x4, x1
-	b	.L941
-.L939:
-	add	x0, x4, x1
-	mov	x1, x6
-.L941:
+	cbnz	w2, .L983
 	mov	w2, w3
+	add	x1, x4, x5
+.L986:
 	bl	ftl_memcpy
 	ldp	x29, x30, [sp], 16
 	ret
+.L983:
+	mov	x1, x0
+	mov	w2, w3
+	add	x0, x4, x5
+	b	.L986
 	.size	FlashSramLoadStore, .-FlashSramLoadStore
 	.align	2
 	.global	FlashCs123Init
@@ -6762,6 +6683,46 @@ FlashCs123Init:
 	ret
 	.size	FlashCs123Init, .-FlashCs123Init
 	.align	2
+	.global	ftl_dma32_malloc
+	.type	ftl_dma32_malloc, %function
+ftl_dma32_malloc:
+	stp	x29, x30, [sp, -48]!
+	cmp	w0, 8192
+	add	x29, sp, 0
+	stp	x19, x20, [sp, 16]
+	str	x21, [sp, 32]
+	ble	.L989
+	bl	ftl_malloc
+.L988:
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	ret
+.L989:
+	adrp	x1, .LANCHOR4
+	add	x21, x1, :lo12:.LANCHOR4
+	add	w19, w0, 63
+	mov	x20, x1
+	and	w19, w19, -64
+	ldr	w0, [x21, 1592]
+	cmp	w19, w0
+	ble	.L991
+	mov	w0, 16384
+	bl	ftl_malloc
+	str	x0, [x21, 1600]
+	mov	w0, 16384
+	str	w0, [x21, 1592]
+.L991:
+	add	x1, x20, :lo12:.LANCHOR4
+	ldr	w0, [x1, 1592]
+	sub	w0, w0, w19
+	str	w0, [x1, 1592]
+	ldr	x0, [x1, 1600]
+	add	x19, x0, w19, sxtw
+	str	x19, [x1, 1600]
+	b	.L988
+	.size	ftl_dma32_malloc, .-ftl_dma32_malloc
+	.align	2
 	.global	rk_nand_suspend
 	.type	rk_nand_suspend, %function
 rk_nand_suspend:
@@ -6786,14 +6747,14 @@ rk_nand_resume:
 	.type	rk_ftl_get_capacity, %function
 rk_ftl_get_capacity:
 	adrp	x0, .LANCHOR0+2584
-	ldr	w0, [x0,#:lo12:.LANCHOR0+2584]
+	ldr	w0, [x0, #:lo12:.LANCHOR0+2584]
 	ret
 	.size	rk_ftl_get_capacity, .-rk_ftl_get_capacity
 	.align	2
 	.global	rk_nandc_get_irq_status
 	.type	rk_nandc_get_irq_status, %function
 rk_nandc_get_irq_status:
-	ldr	w0, [x0,372]
+	ldr	w0, [x0, 372]
 	ret
 	.size	rk_nandc_get_irq_status, .-rk_nandc_get_irq_status
 	.align	2
@@ -6822,757 +6783,745 @@ ReadFlashInfo:
 rknand_print_hex:
 	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	mov	x19, 0
-	adrp	x23, .LC81
+	stp	x21, x22, [sp, 32]
 	adrp	x21, .LC82
-	adrp	x24, .LC75
-	stp	x25, x26, [sp,64]
-	str	x27, [sp,80]
+	stp	x23, x24, [sp, 48]
 	mov	x22, x1
-	mov	x27, x0
-	mov	w25, w2
-	uxtw	x26, w3
-	mov	w20, w19
+	stp	x25, x26, [sp, 64]
+	adrp	x23, .LC81
+	mov	x26, x0
+	mov	w24, w2
+	uxtw	x25, w3
 	add	x23, x23, :lo12:.LC81
 	add	x21, x21, :lo12:.LC82
-	add	x24, x24, :lo12:.LC75
-.L950:
-	cmp	x19, x26
-	beq	.L958
-	cbnz	w20, .L951
-	mov	x0, x23
-	mov	x1, x27
-	mov	x2, x22
+	stp	x19, x20, [sp, 16]
+	str	x27, [sp, 80]
+	mov	x19, 0
+	mov	w20, 0
+	adrp	x27, .LC83
+.L1004:
+	cmp	x25, x19
+	bne	.L1010
+	adrp	x1, .LC83
+	adrp	x0, .LC76
+	add	x1, x1, :lo12:.LC83
+	add	x0, x0, :lo12:.LC76
+	bl	printk
+	ldr	x27, [sp, 80]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 96
+	ret
+.L1010:
+	cbnz	w20, .L1005
 	mov	w3, w19
+	mov	x2, x22
+	mov	x1, x26
+	mov	x0, x23
 	bl	printk
-.L951:
-	cmp	w25, 4
+.L1005:
+	cmp	w24, 4
+	bne	.L1006
+	ldr	w1, [x22, x19, lsl 2]
+.L1012:
 	mov	x0, x21
-	bne	.L952
-	ldr	w1, [x22,x19,lsl 2]
-	b	.L957
-.L952:
-	cmp	w25, 2
-	bne	.L954
-	ldrsh	w1, [x22,x19,lsl 1]
-	b	.L957
-.L954:
-	ldrb	w1, [x22,x19]
-.L957:
-	bl	printk
 	add	w20, w20, 1
+	bl	printk
 	cmp	w20, 15
-	bls	.L955
-	adrp	x1, .LC83
-	mov	x0, x24
-	add	x1, x1, :lo12:.LC83
+	bls	.L1009
 	mov	w20, 0
+	add	x1, x27, :lo12:.LC83
+	adrp	x0, .LC76
+	add	x0, x0, :lo12:.LC76
 	bl	printk
-.L955:
+.L1009:
 	add	x19, x19, 1
-	b	.L950
-.L958:
-	adrp	x0, .LC75
-	adrp	x1, .LC83
-	add	x1, x1, :lo12:.LC83
-	add	x0, x0, :lo12:.LC75
-	bl	printk
-	ldr	x27, [sp,80]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 96
-	ret
+	b	.L1004
+.L1006:
+	cmp	w24, 2
+	bne	.L1008
+	ldrsh	w1, [x22, x19, lsl 1]
+	b	.L1012
+.L1008:
+	ldrb	w1, [x22, x19]
+	b	.L1012
 	.size	rknand_print_hex, .-rknand_print_hex
 	.align	2
 	.global	HynixGetReadRetryDefault
 	.type	HynixGetReadRetryDefault, %function
 HynixGetReadRetryDefault:
-	stp	x29, x30, [sp, -144]!
-	mov	w4, -83
+	stp	x29, x30, [sp, -128]!
+	mov	w3, -83
 	mov	w2, -82
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x19, .LANCHOR0
-	stp	x27, x28, [sp,80]
-	mov	w27, w0
-	add	x0, x19, :lo12:.LANCHOR0
-	add	x1, x0, 1272
-	cmp	w27, 2
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	strb	w27, [x0,1272]
-	mov	w0, -84
-	strb	w4, [x1,5]
-	strb	w0, [x1,4]
-	mov	w0, -81
-	strb	w2, [x1,6]
-	strb	w0, [x1,7]
-	bne	.L960
-	mov	w0, -89
-	strb	w0, [x1,4]
+	stp	x21, x22, [sp, 32]
+	adrp	x21, .LANCHOR0
+	add	x1, x21, :lo12:.LANCHOR0
+	stp	x19, x20, [sp, 16]
+	mov	w20, w0
+	add	x0, x1, 1272
+	stp	x23, x24, [sp, 48]
+	cmp	w20, 2
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	strb	w20, [x1, 1272]
+	mov	w1, -84
+	strb	w3, [x0, 5]
+	strb	w1, [x0, 4]
+	mov	w1, -81
+	strb	w2, [x0, 6]
+	strb	w1, [x0, 7]
+	bne	.L1014
+	mov	w1, -89
+	strb	w1, [x0, 4]
 	adrp	x0, .LANCHOR1+3409
 	mov	w1, -9
-	strb	w1, [x0,#:lo12:.LANCHOR1+3409]
-	b	.L1023
-.L960:
-	cmp	w27, 3
-	bne	.L962
-	mov	w0, -80
-	strb	w0, [x1,4]
-	mov	w0, -79
-	strb	w0, [x1,5]
-	mov	w0, -78
-	strb	w0, [x1,6]
-	mov	w0, -77
-	strb	w0, [x1,7]
-	mov	w0, -76
-	strb	w0, [x1,8]
-	mov	w0, -75
-	strb	w0, [x1,9]
-	mov	w0, -74
-	strb	w0, [x1,10]
-	mov	w0, -73
-	b	.L1063
-.L962:
-	cmp	w27, 4
-	bne	.L963
-	mov	w5, -52
-	strb	w5, [x1,4]
-	mov	w5, -65
-	strb	w5, [x1,5]
-	mov	w5, -86
-	strb	w5, [x1,6]
-	mov	w5, -85
-	strb	w4, [x1,9]
-	strb	w5, [x1,7]
-	mov	w5, -51
-	strb	w2, [x1,10]
-	strb	w5, [x1,8]
-.L1063:
-	mov	w26, 8
-	strb	w0, [x1,11]
-	mov	w28, w26
-	b	.L961
-.L963:
-	cmp	w27, 5
-	bne	.L964
-	mov	w0, 56
-	strb	w0, [x1,4]
-	mov	w0, 57
-	strb	w0, [x1,5]
-	mov	w0, 58
-	mov	w26, 8
-	strb	w0, [x1,6]
-	mov	w0, 59
-	strb	w0, [x1,7]
-	b	.L1064
-.L964:
-	cmp	w27, 6
-	bne	.L965
-	mov	w0, 14
-	strb	w0, [x1,4]
-	mov	w0, 15
-	strb	w0, [x1,5]
-	mov	w0, 16
-	mov	w26, 12
-	strb	w0, [x1,6]
-	mov	w0, 17
-	strb	w0, [x1,7]
-	b	.L1064
-.L965:
-	cmp	w27, 7
-	bne	.L966
-	mov	w0, -80
-	strb	w0, [x1,4]
-	mov	w0, -79
-	strb	w0, [x1,5]
-	mov	w0, -78
-	strb	w0, [x1,6]
-	mov	w0, -77
-	strb	w0, [x1,7]
-	mov	w0, -76
-	strb	w0, [x1,8]
-	mov	w0, -75
-	strb	w0, [x1,9]
-	mov	w0, -74
-	strb	w0, [x1,10]
-	mov	w0, -73
-	strb	w0, [x1,11]
-	mov	w0, -44
-	mov	w26, 12
-	strb	w0, [x1,12]
+	strb	w1, [x0, #:lo12:.LANCHOR1+3409]
+.L1079:
+	mov	w27, 7
+	b	.L1123
+.L1014:
+	cmp	w20, 3
+	bne	.L1016
+	mov	w1, -80
+	strb	w1, [x0, 4]
+	mov	w1, -79
+	strb	w1, [x0, 5]
+	mov	w1, -78
+	strb	w1, [x0, 6]
+	mov	w1, -77
+	strb	w1, [x0, 7]
+	mov	w1, -76
+	strb	w1, [x0, 8]
+	mov	w1, -75
+	strb	w1, [x0, 9]
+	mov	w1, -74
+	strb	w1, [x0, 10]
+	mov	w1, -73
+.L1122:
+	mov	w27, 8
+	mov	w28, w27
+	strb	w1, [x0, 11]
+.L1015:
+	sub	w0, w20, #1
+	cmp	w0, 1
+	bhi	.L1021
+	add	x25, x21, :lo12:.LANCHOR0
+	adrp	x24, .LANCHOR1
+	add	x24, x24, :lo12:.LANCHOR1
+	add	x26, x25, 1272
+	add	x24, x24, 3392
+	mov	w23, 0
+.L1022:
+	ldrb	w0, [x25, 2358]
+	cmp	w0, w23
+	bhi	.L1028
+.L1029:
+	add	x21, x21, :lo12:.LANCHOR0
+	ldp	x19, x20, [sp, 16]
+	strb	w28, [x21, 1273]
+	strb	w27, [x21, 1274]
+	ldp	x23, x24, [sp, 48]
+	ldp	x21, x22, [sp, 32]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 128
+	ret
+.L1016:
+	cmp	w20, 4
+	bne	.L1017
+	mov	w4, -52
+	strb	w4, [x0, 4]
+	mov	w4, -65
+	strb	w4, [x0, 5]
+	mov	w4, -86
+	strb	w4, [x0, 6]
+	mov	w4, -85
+	strb	w3, [x0, 9]
+	strb	w4, [x0, 7]
+	mov	w4, -51
+	strb	w2, [x0, 10]
+	strb	w4, [x0, 8]
+	b	.L1122
+.L1017:
+	cmp	w20, 5
+	bne	.L1018
+	mov	w1, 56
+	strb	w1, [x0, 4]
+	mov	w1, 57
+	strb	w1, [x0, 5]
+	mov	w1, 58
+	mov	w27, 8
+	strb	w1, [x0, 6]
+	mov	w1, 59
+	strb	w1, [x0, 7]
+.L1123:
+	mov	w28, 4
+	b	.L1015
+.L1018:
+	cmp	w20, 6
+	bne	.L1019
+	mov	w1, 14
+	strb	w1, [x0, 4]
+	mov	w1, 15
+	strb	w1, [x0, 5]
+	mov	w1, 16
+	mov	w27, 12
+	strb	w1, [x0, 6]
+	mov	w1, 17
+	strb	w1, [x0, 7]
+	b	.L1123
+.L1019:
+	cmp	w20, 7
+	bne	.L1020
+	mov	w1, -80
+	strb	w1, [x0, 4]
+	mov	w1, -79
+	strb	w1, [x0, 5]
+	mov	w1, -78
+	strb	w1, [x0, 6]
+	mov	w1, -77
+	strb	w1, [x0, 7]
+	mov	w1, -76
+	strb	w1, [x0, 8]
+	mov	w1, -75
+	strb	w1, [x0, 9]
+	mov	w1, -74
+	strb	w1, [x0, 10]
+	mov	w1, -73
+	strb	w1, [x0, 11]
+	mov	w1, -44
+	mov	w27, 12
+	strb	w1, [x0, 12]
 	mov	w28, 10
-	mov	w0, -43
-	strb	w0, [x1,13]
-	b	.L961
-.L966:
-	cmp	w27, 8
-	bne	.L1023
-	mov	w0, 6
-	strb	w0, [x1,4]
-	mov	w0, 7
-	strb	w0, [x1,5]
-	mov	w0, 9
-	strb	w27, [x1,6]
-	strb	w0, [x1,7]
-	mov	w26, 50
-	mov	w0, 10
+	mov	w1, -43
+	strb	w1, [x0, 13]
+	b	.L1015
+.L1020:
+	cmp	w20, 8
+	bne	.L1079
+	mov	w1, 6
+	strb	w1, [x0, 4]
+	mov	w1, 7
+	strb	w1, [x0, 5]
+	mov	w1, 9
+	strb	w20, [x0, 6]
+	strb	w1, [x0, 7]
+	mov	w27, 50
+	mov	w1, 10
 	mov	w28, 5
-	strb	w0, [x1,8]
-	b	.L961
-.L1023:
-	mov	w26, 7
-.L1064:
-	mov	w28, 4
-.L961:
-	sub	w0, w27, #1
-	cmp	w0, 1
-	bhi	.L1060
-	adrp	x22, .LANCHOR1
-	add	x25, x19, :lo12:.LANCHOR0
-	add	x22, x22, :lo12:.LANCHOR1
-	mov	w21, 0
-	add	x4, x25, 1272
-	add	x27, x25, 8
-	add	x22, x22, 3392
-.L967:
-	ldrb	w0, [x25,2358]
-	cmp	w0, w21
-	bls	.L974
-	add	x0, x25, w21, sxtw
-	ldrb	w0, [x0,2360]
-	mov	x23, 0
-	add	x20, x4, x0, lsl 6
-	lsl	x0, x0, 4
-	add	x1, x27, x0
-	add	x20, x20, 20
-	ldr	x24, [x27,x0]
-	ldrb	w0, [x1,8]
+	strb	w1, [x0, 8]
+	b	.L1015
+.L1028:
+	add	x0, x25, w23, sxtw
+	mov	x20, 0
+	ldrb	w0, [x0, 2360]
+	ubfiz	x19, x0, 6, 8
+	sbfiz	x0, x0, 4, 32
+	add	x1, x25, x0
+	add	x19, x19, 20
+	add	x19, x26, x19
+	ldr	x0, [x25, x0]
+	ldrb	w22, [x1, 8]
 	mov	w1, 55
-	add	x24, x24, x0, lsl 8
-.L969:
-	add	x0, x4, x23
-	str	w1, [x24,2056]
-	str	x1, [x29,128]
-	str	x4, [x29,136]
-	ldrb	w0, [x0,4]
-	str	w0, [x24,2052]
+	add	x22, x0, x22, lsl 8
+.L1023:
+	add	x0, x26, x20
+	str	w1, [x22, 2056]
+	str	w1, [x29, 124]
+	ldrb	w0, [x0, 4]
+	str	w0, [x22, 2052]
 	mov	x0, 400
 	bl	__const_udelay
-	ldr	w0, [x24,2048]
-	strb	w0, [x20,x23]
-	add	x23, x23, 1
-	ldr	x4, [x29,136]
-	cmp	w28, w23, uxtb
-	ldr	x1, [x29,128]
-	bhi	.L969
+	ldr	w0, [x22, 2048]
+	strb	w0, [x19, x20]
+	add	x20, x20, 1
+	cmp	w28, w20, uxtb
+	ldr	w1, [x29, 124]
+	bhi	.L1023
 	mov	x0, 0
-.L970:
-	add	w2, w0, 8
-	mov	x1, 0
-.L971:
-	add	x3, x1, x0
-	add	x1, x1, 4
-	add	x3, x22, x3
-	cmp	x1, 24
-	ldrb	w6, [x3,4]
-	ldrb	w3, [x20,x0]
-	add	w3, w6, w3
-	strb	w3, [x20,w2,sxtw]
-	add	w2, w2, 8
-	bne	.L971
+.L1026:
+	add	x1, x0, 4
+	add	x4, x0, 28
+	add	w5, w0, 8
+	add	x1, x24, x1
+	add	x4, x24, x4
+.L1025:
+	ldrb	w6, [x19, x0]
+	ldrb	w7, [x1], 4
+	add	w6, w6, w7
+	strb	w6, [x19, w5, sxtw]
+	cmp	x4, x1
+	add	w5, w5, 8
+	bne	.L1025
 	add	x0, x0, 1
 	cmp	x0, 4
-	bne	.L970
-	add	w21, w21, 1
-	strb	wzr, [x20,16]
-	strb	wzr, [x20,24]
-	strb	wzr, [x20,32]
-	uxtb	w21, w21
-	strb	wzr, [x20,40]
-	strb	wzr, [x20,48]
-	strb	wzr, [x20,41]
-	strb	wzr, [x20,49]
-	b	.L967
-.L1060:
-	sub	w0, w27, #3
-	cmp	w0, 5
-	bhi	.L974
-	mul	w25, w28, w26
-	sub	w24, w28, #1
-	add	x20, x19, :lo12:.LANCHOR0
-	lsl	w0, w25, 4
-	asr	w23, w25, 1
-	str	w0, [x29,128]
-	lsl	w0, w23, 1
-	uxtb	x24, w24
-	str	w0, [x29,124]
-	sub	w0, w27, #5
-	mov	w21, 0
-	str	w0, [x29,136]
-	add	x25, x20, 8
-	add	x0, x24, 1
-	str	x0, [x29,112]
-.L975:
-	ldrb	w0, [x20,2358]
-	cmp	w0, w21
-	bhi	.L1021
-.L974:
-	add	x19, x19, :lo12:.LANCHOR0
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	strb	w28, [x19,1273]
-	strb	w26, [x19,1274]
-	ldp	x27, x28, [sp,80]
-	ldp	x19, x20, [sp,16]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 144
-	ret
+	bne	.L1026
+	add	w23, w23, 1
+	strb	wzr, [x19, 16]
+	strb	wzr, [x19, 24]
+	and	w23, w23, 255
+	strb	wzr, [x19, 32]
+	strb	wzr, [x19, 40]
+	strb	wzr, [x19, 48]
+	strb	wzr, [x19, 41]
+	strb	wzr, [x19, 49]
+	b	.L1022
 .L1021:
-	add	x0, x20, w21, sxtw
-	ldrb	w6, [x0,2360]
-	str	x6, [x29,104]
-	lsl	x0, x6, 4
-	mov	x22, x6
-	add	x1, x25, x0
-	ldr	x0, [x25,x0]
-	ldrb	w2, [x1,8]
-	add	x24, x0, x2, lsl 8
+	sub	w0, w20, #3
+	cmp	w0, 5
+	bhi	.L1029
+	mul	w26, w28, w27
+	sub	w25, w28, #1
+	and	x25, x25, 255
+	add	x22, x21, :lo12:.LANCHOR0
+	mov	w23, 0
+	lsl	w0, w26, 4
+	asr	w24, w26, 1
+	str	w0, [x29, 120]
+	sub	w26, w20, #5
+	lsl	w0, w24, 1
+	str	w0, [x29, 124]
+	add	x0, x25, 1
+	str	x0, [x29, 112]
+.L1030:
+	ldrb	w0, [x22, 2358]
+	cmp	w0, w23
+	bls	.L1029
+	add	x0, x22, w23, sxtw
+	ldrb	w25, [x0, 2360]
+	sbfiz	x0, x25, 4, 32
+	add	x1, x22, x0
+	ldr	x0, [x22, x0]
+	ldrb	w19, [x1, 8]
+	add	x19, x0, x19, lsl 8
 	mov	w0, 255
-	str	w0, [x24,2056]
-	mov	w0, w6
+	str	w0, [x19, 2056]
+	mov	w0, w25
 	bl	NandcWaitFlashReady
-	cmp	w27, 7
-	ldr	x6, [x29,104]
-	bne	.L976
-	mov	x0, 160
-	madd	x6, x6, x0, x20
-	add	x6, x6, 1300
-	b	.L977
-.L976:
-	cmp	w27, 8
-	beq	.L978
-	add	x6, x20, x6, lsl 6
-	add	x6, x6, 1292
-.L977:
+	cmp	w20, 7
+	bne	.L1031
+	mov	x1, 28
+	mov	w0, 160
+	add	x4, x22, 1272
+	umaddl	x0, w0, w25, x1
+	add	x4, x4, x0
+.L1032:
 	mov	w0, 54
-	cmp	w27, 4
-	str	w0, [x24,2056]
-	bne	.L979
+	str	w0, [x19, 2056]
+	cmp	w20, 4
+	bne	.L1034
 	mov	w0, 255
-	str	w0, [x24,2052]
+	str	w0, [x19, 2052]
 	mov	w0, 64
-	str	w0, [x24,2048]
+	str	w0, [x19, 2048]
 	mov	w0, 204
-	b	.L1065
-.L979:
-	ldr	w0, [x29,136]
-	cmp	w0, 1
-	bhi	.L981
-	ldrb	w0, [x20,1276]
-	str	w0, [x24,2052]
-	mov	w0, 82
-	b	.L1066
-.L981:
-	cmp	w27, 7
-	bne	.L980
-	mov	w0, 174
-	str	w0, [x24,2052]
-	str	wzr, [x24,2048]
-	mov	w0, 176
-.L1065:
-	str	w0, [x24,2052]
+.L1124:
+	str	w0, [x19, 2052]
 	mov	w0, 77
-.L1066:
-	str	w0, [x24,2048]
-.L980:
+	b	.L1125
+.L1031:
+	cmp	w20, 8
+	beq	.L1033
+	ubfiz	x4, x25, 6, 8
+	add	x4, x22, x4
+	add	x4, x4, 1292
+	b	.L1032
+.L1034:
+	cmp	w26, 1
+	bhi	.L1036
+	ldrb	w0, [x22, 1276]
+	str	w0, [x19, 2052]
+	mov	w0, 82
+.L1125:
+	str	w0, [x19, 2048]
+.L1035:
 	mov	w0, 22
-	str	w0, [x24,2056]
+	str	w0, [x19, 2056]
 	mov	w0, 23
-	str	w0, [x24,2056]
+	str	w0, [x19, 2056]
 	mov	w0, 4
-	str	w0, [x24,2056]
+	str	w0, [x19, 2056]
 	mov	w0, 25
-	str	w0, [x24,2056]
-	str	wzr, [x24,2056]
-	cmp	w27, 6
-	str	wzr, [x24,2052]
-	str	wzr, [x24,2052]
-	bne	.L982
+	str	w0, [x19, 2056]
+	str	wzr, [x19, 2056]
+	cmp	w20, 6
+	str	wzr, [x19, 2052]
+	str	wzr, [x19, 2052]
+	bne	.L1037
 	mov	w0, 31
-	str	w0, [x24,2052]
-	b	.L983
-.L982:
-	str	wzr, [x24,2052]
-.L983:
+	str	w0, [x19, 2052]
+.L1038:
 	mov	w0, 2
-	str	w0, [x24,2052]
-	str	wzr, [x24,2052]
-.L1022:
+	str	w0, [x19, 2052]
+	str	wzr, [x19, 2052]
+.L1078:
 	mov	w0, 48
-	str	w0, [x24,2056]
-	mov	w0, w22
-	str	x6, [x29,104]
+	str	w0, [x19, 2056]
+	str	x4, [x29, 104]
+	mov	w0, w25
 	bl	NandcWaitFlashReady
-	ldr	w0, [x29,136]
-	ldr	x6, [x29,104]
-	cmp	w0, 1
-	cset	w9, ls
-	cmp	w27, 8
-	cset	w8, eq
-	cbnz	w9, .L1025
-	cbnz	w8, .L1025
-	cmp	w27, 7
-	mov	w7, 32
+	cmp	w26, 1
+	ldr	x4, [x29, 104]
+	ccmp	w20, 8, 4, hi
+	beq	.L1080
+	cmp	w20, 7
 	mov	w0, 2
-	csel	w7, w0, w7, ne
-	b	.L984
-.L1025:
-	mov	w7, 16
-.L984:
+	mov	w6, 32
+	csel	w6, w6, w0, eq
+.L1039:
 	adrp	x1, .LANCHOR4
-	mov	x10, 0
 	add	x0, x1, :lo12:.LANCHOR4
-	ldr	x0, [x0,1600]
-.L985:
-	ldr	w11, [x24,2048]
-	strb	w11, [x0,x10]
-	add	x10, x10, 1
-	cmp	w7, w10, uxtb
-	bhi	.L985
-	cbz	w8, .L986
-	mov	w7, 0
-.L988:
-	ldrb	w10, [x0]
-	cmp	w10, 50
-	beq	.L987
-	ldrb	w10, [x0,1]
-	cmp	w10, 5
-	beq	.L987
-	add	w7, w7, 1
-	add	x0, x0, 4
-	uxtb	w7, w7
-	cmp	w7, 8
-	bne	.L988
-	b	.L989
-.L987:
-	cmp	w7, 6
-	bls	.L990
-.L989:
-	adrp	x0, .LC84
-	mov	w1, 0
-	add	x0, x0, :lo12:.LC84
-	bl	printk
-.L991:
-	b	.L991
-.L986:
-	cmp	w27, 7
-	bne	.L992
-	mov	w7, w8
-.L994:
-	ldrb	w10, [x0]
-	cmp	w10, 12
-	beq	.L993
-	ldrb	w10, [x0,1]
-	cmp	w10, 10
-	beq	.L993
-	add	w7, w7, 1
-	add	x0, x0, 4
-	uxtb	w7, w7
-	cmp	w7, 8
-	bne	.L994
-	b	.L995
-.L993:
-	cmp	w7, 7
-	bne	.L990
-.L995:
-	adrp	x0, .LC84
-	mov	w1, 0
-	add	x0, x0, :lo12:.LC84
-	bl	printk
-.L996:
-	b	.L996
-.L992:
-	cmp	w27, 6
-	bne	.L990
 	mov	x7, 0
-.L997:
-	ldrb	w10, [x0,x7]
-	cmp	w10, 12
-	beq	.L990
-	add	x10, x0, x7
-	ldrb	w10, [x10,8]
-	cmp	w10, 4
-	beq	.L990
+	ldr	x0, [x0, 1608]
+.L1040:
+	ldr	w8, [x19, 2048]
+	strb	w8, [x0, x7]
 	add	x7, x7, 1
-	cmp	x7, 8
-	bne	.L997
+	cmp	w6, w7, uxtb
+	bhi	.L1040
+	cmp	w20, 8
+	bne	.L1041
+	mov	w6, 0
+.L1043:
+	ldrb	w7, [x0]
+	cmp	w7, 50
+	beq	.L1042
+	ldrb	w7, [x0, 1]
+	cmp	w7, 5
+	beq	.L1042
+	add	w6, w6, 1
+	add	x0, x0, 4
+	and	w6, w6, 255
+	cmp	w6, 8
+	bne	.L1043
+.L1044:
 	adrp	x0, .LC84
 	mov	w1, 0
 	add	x0, x0, :lo12:.LC84
 	bl	printk
-.L999:
-	b	.L999
-.L990:
+.L1046:
+	b	.L1046
+.L1036:
+	cmp	w20, 7
+	bne	.L1035
+	mov	w0, 174
+	str	w0, [x19, 2052]
+	str	wzr, [x19, 2048]
+	mov	w0, 176
+	b	.L1124
+.L1037:
+	str	wzr, [x19, 2052]
+	b	.L1038
+.L1080:
+	mov	w6, 16
+	b	.L1039
+.L1042:
+	cmp	w6, 6
+	bhi	.L1044
+.L1045:
 	add	x0, x1, :lo12:.LANCHOR4
-	ldr	x11, [x0,1600]
+	ldr	x8, [x0, 1608]
 	mov	x0, 0
-.L1000:
-	ldr	w2, [x29,128]
+.L1055:
+	ldr	w2, [x29, 120]
 	cmp	w2, w0
-	ble	.L1068
-	ldr	w7, [x24,2048]
-	strb	w7, [x11,x0]
-	add	x0, x0, 1
-	b	.L1000
-.L1068:
+	bgt	.L1056
 	add	x0, x1, :lo12:.LANCHOR4
-	mov	w12, w23
-	mov	w10, 8
-	ldr	x13, [x0,1600]
-.L1003:
+	mov	w9, w24
+	mov	w7, 8
+	ldr	x10, [x0, 1608]
+.L1058:
 	mov	w0, 0
-.L1002:
-	add	w7, w0, w12
+.L1057:
+	add	w6, w0, w9
 	add	w0, w0, 1
-	sbfiz	x7, x7, 1, 32
-	cmp	w0, w23
-	ldrh	w14, [x13,x7]
-	mvn	w14, w14
-	strh	w14, [x13,x7]
-	bne	.L1002
-	ldr	w0, [x29,124]
-	subs	w10, w10, #1
-	add	w12, w12, w0
-	bne	.L1003
-	mov	x10, 0
-	mov	w18, 1
-.L1004:
-	mov	w7, 0
+	sbfiz	x6, x6, 1, 32
+	cmp	w24, w0
+	ldrh	w11, [x10, x6]
+	mvn	w11, w11
+	strh	w11, [x10, x6]
+	bgt	.L1057
+	ldr	w0, [x29, 124]
+	subs	w7, w7, #1
+	add	w9, w9, w0
+	bne	.L1058
+	mov	x7, 0
+	mov	w14, 1
+.L1064:
+	mov	w6, 0
+	mov	w9, 0
+.L1063:
 	mov	w12, w7
-.L1008:
-	lsl	w14, w18, w12
-	mov	w16, w10
+	lsl	w13, w14, w9
 	mov	w0, 16
-	mov	w15, 0
-.L1006:
-	ldrh	w17, [x13,w16,sxtw 1]
-	add	w16, w16, w23
-	and	w17, w17, w14
-	cmp	w17, w14
-	csinc	w15, w15, w15, ne
+	mov	w11, 0
+.L1061:
+	ldrh	w15, [x10, w12, sxtw 1]
+	add	w12, w12, w24
+	bics	wzr, w13, w15
+	cinc	w11, w11, eq
 	subs	w0, w0, #1
-	bne	.L1006
-	cmp	w15, 8
-	bls	.L1007
-	orr	w7, w7, w14
-	uxth	w7, w7
-.L1007:
-	add	w12, w12, 1
-	cmp	w12, 16
-	bne	.L1008
-	strh	w7, [x13,x10,lsl 1]
-	add	x10, x10, 1
-	cmp	w23, w10
-	bgt	.L1004
+	bne	.L1061
+	cmp	w11, 8
+	bls	.L1062
+	orr	w6, w6, w13
+	and	w6, w6, 65535
+.L1062:
+	add	w9, w9, 1
+	cmp	w9, 16
+	bne	.L1063
+	strh	w6, [x10, x7, lsl 1]
+	add	x7, x7, 1
+	cmp	w24, w7
+	bgt	.L1064
 	add	x1, x1, :lo12:.LANCHOR4
-	mov	x7, 0
-	mov	w10, w7
-	ldr	x1, [x1,1600]
-.L1011:
-	ldr	w12, [x1,x7]
-	add	x7, x7, 4
-	cmp	w12, wzr
-	csinc	w10, w10, w10, ne
-	cmp	x7, 32
-	bne	.L1011
-	cmp	w10, 7
-	ble	.L1012
-	adrp	x0, .LC85
+	mov	x6, 0
+	mov	w7, 0
+	ldr	x1, [x1, 1608]
+.L1067:
+	ldr	w9, [x1, x6]
+	add	x6, x6, 4
+	cmp	w9, 0
+	cinc	w7, w7, eq
+	cmp	x6, 32
+	bne	.L1067
+	cmp	w7, 7
+	ble	.L1068
+	mov	w3, 1024
 	mov	w2, 1
+	adrp	x0, .LC85
 	add	x0, x0, :lo12:.LC85
-	mov	w3, 1024
 	bl	rknand_print_hex
 	adrp	x0, .LC84
 	mov	w1, 0
 	add	x0, x0, :lo12:.LC84
 	bl	printk
-.L1013:
-	b	.L1013
-.L1012:
-	cmp	w27, 6
-	mov	w7, 4
-	beq	.L1014
-	cmp	w27, 7
-	mov	w7, 10
-	beq	.L1014
-	cmp	w8, wzr
-	mov	w7, 5
+.L1069:
+	b	.L1069
+.L1041:
+	cmp	w20, 7
+	bne	.L1047
+	mov	w6, 0
+.L1049:
+	ldrb	w7, [x0]
+	cmp	w7, 12
+	beq	.L1048
+	ldrb	w7, [x0, 1]
+	cmp	w7, 10
+	beq	.L1048
+	add	w6, w6, 1
+	add	x0, x0, 4
+	and	w6, w6, 255
+	cmp	w6, 8
+	bne	.L1049
+.L1050:
+	adrp	x0, .LC84
+	mov	w1, 0
+	add	x0, x0, :lo12:.LC84
+	bl	printk
+.L1051:
+	b	.L1051
+.L1048:
+	cmp	w6, 6
+	bls	.L1045
+	b	.L1050
+.L1047:
+	cmp	w20, 6
+	bne	.L1045
+	mov	x6, 0
+.L1052:
+	ldrb	w7, [x0, x6]
+	cmp	w7, 12
+	beq	.L1045
+	add	x7, x0, x6
+	ldrb	w7, [x7, 8]
+	cmp	w7, 4
+	beq	.L1045
+	add	x6, x6, 1
+	cmp	x6, 8
+	bne	.L1052
+	adrp	x0, .LC84
+	mov	w1, 0
+	add	x0, x0, :lo12:.LC84
+	bl	printk
+.L1054:
+	b	.L1054
+.L1056:
+	ldr	w6, [x19, 2048]
+	strb	w6, [x8, x0]
+	add	x0, x0, 1
+	b	.L1055
+.L1068:
+	cmp	w20, 6
+	beq	.L1082
+	cmp	w20, 7
+	beq	.L1083
+	cmp	w20, 8
 	mov	w1, 8
-	csel	w7, w1, w7, eq
-.L1014:
-	mov	w10, 0
-.L1015:
+	mov	w6, 5
+	csel	w6, w6, w1, eq
+.L1070:
+	mov	w7, 0
+.L1071:
 	mov	x1, 0
-.L1016:
-	add	w12, w0, w1
-	ldrb	w13, [x11,x1]
+.L1072:
+	add	w9, w0, w1
+	ldrb	w10, [x8, x1]
 	add	x1, x1, 1
 	cmp	w28, w1, uxtb
-	strb	w13, [x6,w12,sxtw]
-	bhi	.L1016
-	add	w10, w10, 1
-	ldr	x1, [x29,112]
-	cmp	w10, w26
-	add	w0, w0, w7
-	add	x11, x11, x1
-	blt	.L1015
+	strb	w10, [x4, w9, sxtw]
+	bhi	.L1072
+	ldr	x1, [x29, 112]
+	add	w7, w7, 1
+	add	w0, w0, w6
+	cmp	w27, w7
+	add	x8, x8, x1
+	bgt	.L1071
 	mov	w0, 255
-	str	w0, [x24,2056]
-	mov	w0, w22
-	str	x8, [x29,96]
-	str	x9, [x29,104]
+	str	w0, [x19, 2056]
+	mov	w0, w25
 	bl	NandcWaitFlashReady
-	ldr	x9, [x29,104]
-	ldr	x8, [x29,96]
-	cbz	w9, .L1018
+	cmp	w26, 1
+	bhi	.L1074
 	mov	w0, 54
-	str	w0, [x24,2056]
+	str	w0, [x19, 2056]
 	adrp	x0, .LANCHOR0+1276
 	mov	w1, -1
-	ldrb	w0, [x0,#:lo12:.LANCHOR0+1276]
-	str	w0, [x24,2052]
+	ldrb	w0, [x0, #:lo12:.LANCHOR0+1276]
+	str	w0, [x19, 2052]
+	str	wzr, [x19, 2048]
 	mov	w0, 22
-	str	wzr, [x24,2048]
-	str	w0, [x24,2056]
-	mov	w0, w21
+	str	w0, [x19, 2056]
+	mov	w0, w23
 	bl	FlashReadCmd
-	b	.L1019
-.L1018:
+.L1075:
+	add	w23, w23, 1
+	mov	w0, w25
+	and	w23, w23, 255
+	bl	NandcWaitFlashReady
+	b	.L1030
+.L1082:
+	mov	w6, 4
+	b	.L1070
+.L1083:
+	mov	w6, 10
+	b	.L1070
+.L1074:
+	cmp	w20, 8
+	bne	.L1076
 	mov	w0, 190
-	cbnz	w8, .L1067
+.L1126:
+	str	w0, [x19, 2056]
+	b	.L1075
+.L1076:
 	mov	w0, 56
-.L1067:
-	str	w0, [x24,2056]
-.L1019:
-	mov	w0, w22
-	add	w21, w21, 1
-	bl	NandcWaitFlashReady
-	uxtb	w21, w21
-	b	.L975
-.L978:
+	b	.L1126
+.L1033:
 	mov	w0, 120
-	str	w0, [x24,2056]
-	str	wzr, [x24,2052]
+	str	w0, [x19, 2056]
+	str	wzr, [x19, 2052]
 	mov	w0, 23
-	str	wzr, [x24,2052]
+	str	wzr, [x19, 2052]
 	mov	w1, 25
-	str	wzr, [x24,2052]
-	add	x6, x20, 1300
-	str	w0, [x24,2056]
+	str	wzr, [x19, 2052]
+	add	x4, x22, 1300
+	str	w0, [x19, 2056]
 	mov	w0, 4
-	str	w0, [x24,2056]
-	str	w1, [x24,2056]
+	str	w0, [x19, 2056]
+	str	w1, [x19, 2056]
 	mov	w1, 218
-	str	w1, [x24,2056]
+	str	w1, [x19, 2056]
 	mov	w1, 21
-	str	wzr, [x24,2056]
-	str	wzr, [x24,2052]
-	str	wzr, [x24,2052]
-	str	w1, [x24,2052]
-	str	w0, [x24,2052]
-	str	wzr, [x24,2052]
-	b	.L1022
+	str	wzr, [x19, 2056]
+	str	wzr, [x19, 2052]
+	str	wzr, [x19, 2052]
+	str	w1, [x19, 2052]
+	str	w0, [x19, 2052]
+	str	wzr, [x19, 2052]
+	b	.L1078
 	.size	HynixGetReadRetryDefault, .-HynixGetReadRetryDefault
 	.align	2
 	.global	FlashGetReadRetryDefault
 	.type	FlashGetReadRetryDefault, %function
 FlashGetReadRetryDefault:
+	cbz	w0, .L1140
 	stp	x29, x30, [sp, -16]!
-	mov	w1, w0
-	add	x29, sp, 0
-	cbz	w0, .L1069
 	sub	w2, w0, #1
+	mov	w1, w0
 	cmp	w2, 7
-	bhi	.L1071
+	add	x29, sp, 0
+	bhi	.L1129
 	bl	HynixGetReadRetryDefault
-	b	.L1069
-.L1071:
+.L1127:
+	ldp	x29, x30, [sp], 16
+	ret
+.L1129:
 	cmp	w0, 49
-	bne	.L1072
+	bne	.L1130
 	adrp	x0, .LANCHOR0
-	mov	w2, 64
 	add	x0, x0, :lo12:.LANCHOR0
-	add	x0, x0, 1276
-	strb	w1, [x0,-4]
+	mov	w2, 64
+	strb	w1, [x0, 1272]
 	mov	w1, 4
-	strb	w1, [x0,-3]
+	strb	w1, [x0, 1273]
 	mov	w1, 15
-	strb	w1, [x0,-2]
+	strb	w1, [x0, 1274]
 	adrp	x1, .LANCHOR1
 	add	x1, x1, :lo12:.LANCHOR1
 	add	x1, x1, 408
-	b	.L1087
-.L1072:
+.L1143:
+	add	x0, x0, 1276
+	bl	ftl_memcpy
+	b	.L1127
+.L1130:
 	sub	w0, w0, #65
-	cmp	w0, 1
-	bls	.L1078
 	cmp	w1, 33
-	bne	.L1073
-.L1078:
+	ccmp	w0, 1, 0, ne
+	bhi	.L1131
 	adrp	x0, .LANCHOR0
 	add	x0, x0, :lo12:.LANCHOR0
-	strb	w1, [x0,1272]
+	strb	w1, [x0, 1272]
 	mov	w1, 4
-	b	.L1088
-.L1073:
-	cmp	w1, 67
-	beq	.L1079
-	cmp	w1, 34
-	bne	.L1075
-.L1079:
-	adrp	x0, .LANCHOR0
-	add	x0, x0, :lo12:.LANCHOR0
-	strb	w1, [x0,1272]
-	mov	w1, 5
-.L1088:
-	strb	w1, [x0,1273]
+.L1144:
+	strb	w1, [x0, 1273]
 	mov	w1, 7
-	strb	w1, [x0,1274]
+	strb	w1, [x0, 1274]
 	adrp	x1, .LANCHOR1
 	add	x1, x1, :lo12:.LANCHOR1
-	add	x0, x0, 1276
-	add	x1, x1, 256
 	mov	w2, 45
-	b	.L1087
-.L1075:
-	cmp	w1, 68
-	beq	.L1080
+	add	x1, x1, 352
+	b	.L1143
+.L1131:
+	cmp	w1, 34
+	mov	w0, 67
+	ccmp	w1, w0, 4, ne
+	bne	.L1132
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	strb	w1, [x0, 1272]
+	mov	w1, 5
+	b	.L1144
+.L1132:
 	cmp	w1, 35
-	bne	.L1069
-.L1080:
+	mov	w0, 68
+	ccmp	w1, w0, 4, ne
+	bne	.L1127
 	adrp	x0, .LANCHOR0
-	mov	w2, 95
 	add	x0, x0, :lo12:.LANCHOR0
-	add	x0, x0, 1276
-	strb	w1, [x0,-4]
+	mov	w2, 95
+	strb	w1, [x0, 1272]
 	mov	w1, 5
-	strb	w1, [x0,-3]
+	strb	w1, [x0, 1273]
 	mov	w1, 17
-	strb	w1, [x0,-2]
+	strb	w1, [x0, 1274]
 	adrp	x1, .LANCHOR1
 	add	x1, x1, :lo12:.LANCHOR1
-	add	x1, x1, 304
-.L1087:
-	bl	ftl_memcpy
-.L1069:
-	ldp	x29, x30, [sp], 16
+	add	x1, x1, 256
+	b	.L1143
+.L1140:
 	ret
 	.size	FlashGetReadRetryDefault, .-FlashGetReadRetryDefault
 	.align	2
@@ -7582,476 +7531,495 @@ NandcXferComp:
 	stp	x29, x30, [sp, -80]!
 	ubfiz	x0, x0, 4, 8
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR0
-	str	x23, [sp,48]
 	add	x1, x20, :lo12:.LANCHOR0
-	add	x2, x1, 8
-	stp	x21, x22, [sp,32]
-	ldr	x19, [x2,x0]
-	ldr	w0, [x1,2388]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	ldr	x19, [x1, x0]
+	ldr	w0, [x1, 2388]
 	cmp	w0, 3
-	bls	.L1120
-	ldr	w0, [x19,16]
-	tbz	x0, 2, .L1120
-	ldr	w21, [x19,16]
-	ldr	w0, [x19,8]
-	ubfx	x21, x21, 1, 1
-	str	w0, [x29,64]
-	cbz	w21, .L1091
+	bls	.L1176
+	ldr	w0, [x19, 16]
+	tbz	x0, 2, .L1176
+	ldr	w0, [x19, 16]
+	tbz	x0, 1, .L1147
 	adrp	x22, .LC86
 	adrp	x23, .LC87
-	mov	w21, 0
+	ldr	w0, [x19, 8]
+	mov	x24, x1
 	add	x22, x22, :lo12:.LC86
 	add	x23, x23, :lo12:.LC87
-.L1092:
-	ldr	w2, [x19,28]
-	ldr	w1, [x29,64]
-	ubfx	x2, x2, 16, 5
-	ubfx	x1, x1, 22, 6
-	cmp	w2, w1
-	bge	.L1100
-	add	x0, x20, :lo12:.LANCHOR0
-	ldr	w0, [x0,2388]
+	mov	w21, 0
+	str	w0, [x29, 64]
+.L1148:
+	ldr	w1, [x19, 28]
+	ldr	w0, [x29, 64]
+	ubfx	x1, x1, 16, 5
+	ubfx	x0, x0, 22, 6
+	cmp	w1, w0
+	bge	.L1156
+	ldr	w0, [x24, 2388]
 	cmp	w0, 5
-	bhi	.L1093
-.L1096:
+	bhi	.L1149
+.L1152:
 	add	w21, w21, 1
-	and	w0, w21, 16777215
-	cbnz	w0, .L1095
-	ldr	w2, [x19,28]
+	tst	x21, 16777215
+	bne	.L1151
+	ldr	w2, [x19, 28]
 	mov	w1, w21
-	ldr	w3, [x29,64]
+	ldr	w3, [x29, 64]
 	mov	x0, x22
 	ubfx	x2, x2, 16, 5
 	ubfx	x3, x3, 22, 6
 	bl	printk
-	mov	x0, x23
-	mov	x1, x19
-	mov	w2, 4
 	mov	w3, 512
+	mov	w2, 4
+	mov	x1, x19
+	mov	x0, x23
 	bl	rknand_print_hex
-	b	.L1095
-.L1093:
+.L1151:
+	mov	x1, 5
+	mov	x0, 1
+	bl	usleep_range
+	b	.L1148
+.L1149:
 	ldr	w0, [x19]
-	str	w0, [x29,72]
-	ldr	w0, [x29,72]
-	tbz	x0, 13, .L1096
-	ldr	w0, [x29,72]
-	tbz	x0, 17, .L1096
-.L1100:
+	str	w0, [x29, 72]
+	ldr	w0, [x29, 72]
+	tbz	x0, 13, .L1152
+	ldr	w0, [x29, 72]
+	tbz	x0, 17, .L1152
+.L1156:
 	add	x19, x20, :lo12:.LANCHOR0
 	add	x19, x19, 2408
-	ldr	w0, [x19,40]
-	cbz	w0, .L1101
-	ldr	w1, [x29,64]
+	ldr	w0, [x19, 40]
+	cbz	w0, .L1157
+	ldr	w0, [x19, 32]
 	mov	w2, 0
-	ldr	w0, [x19,32]
+	ldr	w1, [x29, 64]
 	ubfx	x1, x1, 22, 5
 	lsl	w1, w1, 10
 	bl	rknand_dma_unmap_single
-	ldr	w1, [x29,64]
+	ldr	w1, [x29, 64]
 	mov	w2, 0
-	ldr	w0, [x19,36]
+	ldr	w0, [x19, 36]
 	ubfx	x1, x1, 22, 5
 	lsl	w1, w1, 7
 	bl	rknand_dma_unmap_single
-	b	.L1101
-.L1095:
-	mov	x0, 1
-	mov	x1, 5
-	bl	usleep_range
-	b	.L1092
-.L1091:
+.L1157:
+	add	x20, x20, :lo12:.LANCHOR0
+	str	wzr, [x20, 2448]
+.L1145:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 80
+	ret
+.L1147:
 	adrp	x22, .LC88
 	adrp	x23, .LC87
+	ldr	w0, [x19, 8]
 	add	x22, x22, :lo12:.LC88
 	add	x23, x23, :lo12:.LC87
-.L1102:
-	ldr	w0, [x29,64]
-	tbnz	x0, 20, .L1128
-	ldr	w0, [x19,8]
-	add	w21, w21, 1
-	str	w0, [x29,64]
-	and	w0, w21, 16777215
-	cbnz	w0, .L1103
-	ldr	w2, [x29,64]
-	mov	w1, w21
-	ldr	w3, [x19,28]
-	mov	x0, x22
-	ubfx	x3, x3, 16, 5
-	bl	printk
-	mov	x0, x23
-	mov	x1, x19
-	mov	w2, 4
-	mov	w3, 512
-	bl	rknand_print_hex
-.L1103:
-	mov	x0, 1
-	mov	x1, 5
-	bl	usleep_range
-	b	.L1102
-.L1128:
+	mov	w21, 0
+	str	w0, [x29, 64]
+.L1158:
+	ldr	w0, [x29, 64]
+	tbz	x0, 20, .L1160
 	add	x0, x20, :lo12:.LANCHOR0
-	ldr	w0, [x0,2456]
-	cbz	w0, .L1105
+	ldr	w0, [x0, 2456]
+	cbz	w0, .L1161
 	mov	x0, x19
 	bl	NandcSendDumpDataStart
-.L1105:
+.L1161:
 	add	x21, x20, :lo12:.LANCHOR0
 	add	x21, x21, 2408
-	ldr	w0, [x21,40]
-	cbz	w0, .L1106
-	ldr	w1, [x29,64]
+	ldr	w0, [x21, 40]
+	cbz	w0, .L1162
+	ldr	w0, [x21, 32]
 	mov	w2, 1
-	ldr	w0, [x21,32]
+	ldr	w1, [x29, 64]
 	ubfx	x1, x1, 22, 5
 	lsl	w1, w1, 10
 	bl	rknand_dma_unmap_single
-	ldr	w1, [x29,64]
+	ldr	w1, [x29, 64]
 	mov	w2, 1
-	ldr	w0, [x21,36]
+	ldr	w0, [x21, 36]
 	ubfx	x1, x1, 22, 5
 	lsl	w1, w1, 7
 	bl	rknand_dma_unmap_single
-.L1106:
+.L1162:
 	add	x0, x20, :lo12:.LANCHOR0
-	ldr	w0, [x0,2456]
-	cbz	w0, .L1101
+	ldr	w0, [x0, 2456]
+	cbz	w0, .L1157
 	mov	x0, x19
 	bl	NandcSendDumpDataDone
-.L1101:
-	add	x20, x20, :lo12:.LANCHOR0
-	str	wzr, [x20,2448]
-	b	.L1089
-.L1120:
-	ldr	w0, [x19,8]
-	str	w0, [x29,64]
-	ldr	w0, [x29,64]
-	tbz	x0, 20, .L1120
-.L1089:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldr	x23, [sp,48]
-	ldp	x29, x30, [sp], 80
-	ret
+	b	.L1157
+.L1160:
+	ldr	w0, [x19, 8]
+	add	w21, w21, 1
+	str	w0, [x29, 64]
+	tst	x21, 16777215
+	bne	.L1159
+	ldr	w2, [x29, 64]
+	mov	w1, w21
+	ldr	w3, [x19, 28]
+	mov	x0, x22
+	ubfx	x3, x3, 16, 5
+	bl	printk
+	mov	w3, 512
+	mov	w2, 4
+	mov	x1, x19
+	mov	x0, x23
+	bl	rknand_print_hex
+.L1159:
+	mov	x1, 5
+	mov	x0, 1
+	bl	usleep_range
+	b	.L1158
+.L1176:
+	ldr	w0, [x19, 8]
+	str	w0, [x29, 64]
+	ldr	w0, [x29, 64]
+	tbz	x0, 20, .L1176
+	b	.L1145
 	.size	NandcXferComp, .-NandcXferComp
 	.align	2
 	.global	NandcXferData
 	.type	NandcXferData, %function
 NandcXferData:
-	stp	x29, x30, [sp, -176]!
+	stp	x29, x30, [sp, -192]!
+	tst	x3, 63
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	stp	x27, x28, [sp,80]
+	stp	x25, x26, [sp, 64]
+	and	w25, w0, 255
+	stp	x21, x22, [sp, 32]
+	sbfiz	x0, x25, 4, 32
+	stp	x19, x20, [sp, 16]
+	and	w21, w1, 255
 	adrp	x19, .LANCHOR0
-	uxtb	w25, w0
-	add	x0, x19, :lo12:.LANCHOR0
-	add	x0, x0, w25, sxtw 4
-	ldr	x20, [x0,8]
-	and	x0, x3, 63
-	uxtb	w21, w1
-	uxtb	w24, w2
+	add	x1, x19, :lo12:.LANCHOR0
+	stp	x23, x24, [sp, 48]
 	mov	x26, x3
+	stp	x27, x28, [sp, 80]
+	and	w24, w2, 255
 	mov	x22, x4
-	cbnz	x0, .L1130
-	cbnz	x4, .L1131
-	add	x0, x29, 112
-	mov	w1, 255
+	ldr	x20, [x1, x0]
+	bne	.L1186
+	cbnz	x4, .L1187
+	add	x22, x29, 128
 	mov	w2, 64
-	add	x22, x29, 112
+	mov	w1, 255
+	add	x0, x29, 128
 	bl	ftl_memset
-.L1131:
-	mov	w0, w25
-	mov	w1, w21
+.L1187:
+	mov	x5, x22
+	mov	x4, x26
 	mov	w2, w24
 	mov	w3, 0
-	mov	x4, x26
-	mov	x5, x22
-	mov	w23, 0
-	bl	NandcXferStart
+	mov	w1, w21
 	mov	w0, w25
+	bl	NandcXferStart
 	mov	w1, w21
+	mov	w0, w25
 	bl	NandcXferComp
-	cbnz	w21, .L1132
+	cbnz	w21, .L1211
 	add	x1, x19, :lo12:.LANCHOR0
 	ubfx	x2, x24, 1, 7
-	mov	w3, 128
 	add	x2, x22, x2, lsl 2
-	ldr	w0, [x1,2460]
+	mov	w3, 64
+	ldr	w0, [x1, 2460]
 	cmp	w0, 25
-	mov	w0, 64
-	csel	w3, w0, w3, cc
-	mov	w0, w21
-.L1134:
+	mov	w0, 128
+	csel	w3, w3, w0, cc
+	mov	w0, 0
+.L1190:
+	add	w4, w3, w0
 	cmp	x22, x2
-	add	w4, w0, w3
-	beq	.L1176
-	ldr	x5, [x1,2416]
+	bne	.L1191
+	add	x0, x19, :lo12:.LANCHOR0
+	lsr	w24, w24, 2
+	mov	w2, 0
+	mov	w23, 0
+	ldr	w3, [x0, 2388]
+	ldr	w4, [x0, 2460]
+.L1192:
+	cmp	w2, w24
+	bcs	.L1188
+	cbnz	w4, .L1198
+.L1188:
+	str	wzr, [x20, 16]
+.L1199:
+	add	x19, x19, :lo12:.LANCHOR0
+	ldr	w0, [x19, 2388]
+	cmp	w0, 5
+	bls	.L1185
+	cbnz	w21, .L1185
+	ldr	w0, [x20]
+	mov	w1, 8192
+	movk	w1, 0x2, lsl 16
+	and	w1, w0, w1
+	cmp	w1, 139264
+	bne	.L1185
+	orr	w0, w0, 131072
+	mov	w23, -1
+	str	w0, [x20]
+.L1185:
+	mov	w0, w23
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 192
+	ret
+.L1191:
+	ldr	x5, [x1, 2416]
 	and	x0, x0, 4294967292
 	add	x22, x22, 4
-	ldr	w0, [x5,x0]
-	strb	w0, [x22,-4]
+	ldr	w0, [x5, x0]
+	strb	w0, [x22, -4]
 	lsr	w5, w0, 8
-	strb	w5, [x22,-3]
+	strb	w5, [x22, -3]
 	lsr	w5, w0, 16
-	strb	w5, [x22,-2]
+	strb	w5, [x22, -2]
 	lsr	w0, w0, 24
-	strb	w0, [x22,-1]
+	strb	w0, [x22, -1]
 	mov	w0, w4
-	b	.L1134
-.L1176:
-	add	x0, x19, :lo12:.LANCHOR0
-	lsr	w24, w24, 2
-	ldr	w5, [x0,2460]
-	ldr	w4, [x0,2388]
-	mov	w0, 0
-	mov	w23, w0
-.L1136:
-	cmp	w0, w24
-	bcs	.L1132
-	cbz	w5, .L1132
-	uxtw	x1, w0
-	add	x1, x1, 8
-	ldr	w1, [x20,x1,lsl 2]
-	str	w1, [x29,104]
-	ldr	w1, [x29,104]
-	tbnz	x1, 2, .L1160
-	ldr	w3, [x29,104]
-	ubfx	x3, x3, 15, 1
-	cbnz	w3, .L1160
-	cmp	w4, 5
-	bls	.L1138
-	ldr	w2, [x29,104]
-	ubfx	x6, x2, 3, 5
-	ldr	w2, [x29,104]
-	ldr	w1, [x29,104]
-	ubfx	x2, x2, 27, 1
-	ubfx	x3, x1, 16, 5
-	ldr	w1, [x29,104]
-	orr	w2, w6, w2, lsl 5
-	ubfx	x1, x1, 29, 1
-	orr	w1, w3, w1, lsl 5
-	ldr	w3, [x29,104]
-	cmp	w2, w1
-	bls	.L1139
-	ldr	w1, [x29,104]
-	ubfx	x3, x3, 3, 5
+	b	.L1190
+.L1198:
+	uxtw	x0, w2
+	add	x0, x0, 8
+	ldr	w0, [x20, x0, lsl 2]
+	str	w0, [x29, 120]
+	ldr	w0, [x29, 120]
+	tbnz	x0, 2, .L1214
+	ldr	w0, [x29, 120]
+	tbnz	x0, 15, .L1214
+	cmp	w3, 5
+	bls	.L1194
+	ldr	w1, [x29, 120]
+	ubfx	x6, x1, 3, 5
+	ldr	w1, [x29, 120]
+	ldr	w0, [x29, 120]
 	ubfx	x1, x1, 27, 1
-	orr	w3, w3, w1, lsl 5
-	b	.L1140
-.L1139:
-	ubfx	x1, x3, 16, 5
-	ldr	w3, [x29,104]
-	ubfx	x3, x3, 29, 1
-	b	.L1175
-.L1138:
-	cmp	w4, 3
-	bls	.L1140
-	ldr	w2, [x29,104]
-	ubfx	x6, x2, 3, 5
-	ldr	w2, [x29,104]
-	ldr	w1, [x29,104]
-	ubfx	x2, x2, 28, 1
-	ubfx	x3, x1, 16, 5
-	ldr	w1, [x29,104]
-	orr	w2, w6, w2, lsl 5
-	ubfx	x1, x1, 30, 1
-	orr	w1, w3, w1, lsl 5
-	ldr	w3, [x29,104]
-	cmp	w2, w1
-	bls	.L1141
-	ubfx	x1, x3, 3, 5
-	ldr	w3, [x29,104]
-	ubfx	x3, x3, 28, 1
-	b	.L1175
-.L1141:
-	ubfx	x1, x3, 16, 5
-	ldr	w3, [x29,104]
-	ubfx	x3, x3, 30, 1
-.L1175:
-	orr	w3, w1, w3, lsl 5
-.L1140:
-	cmp	w23, w3
-	csel	w23, w23, w3, cs
-	b	.L1137
-.L1160:
+	ubfx	x5, x0, 16, 5
+	ldr	w0, [x29, 120]
+	orr	w1, w6, w1, lsl 5
+	ubfx	x0, x0, 29, 1
+	orr	w0, w5, w0, lsl 5
+	cmp	w1, w0
+	ldr	w0, [x29, 120]
+	bls	.L1195
+	ubfx	x1, x0, 3, 5
+	ldr	w0, [x29, 120]
+	ubfx	x0, x0, 27, 1
+.L1220:
+	orr	w0, w1, w0, lsl 5
+.L1196:
+	cmp	w23, w0
+	csel	w23, w23, w0, cs
+.L1193:
+	add	w2, w2, 1
+	b	.L1192
+.L1195:
+	ubfx	x1, x0, 16, 5
+	ldr	w0, [x29, 120]
+	ubfx	x0, x0, 29, 1
+	b	.L1220
+.L1194:
+	cmp	w3, 3
+	bls	.L1215
+	ldr	w1, [x29, 120]
+	ubfx	x6, x1, 3, 5
+	ldr	w1, [x29, 120]
+	ldr	w0, [x29, 120]
+	ubfx	x1, x1, 28, 1
+	ubfx	x5, x0, 16, 5
+	ldr	w0, [x29, 120]
+	orr	w1, w6, w1, lsl 5
+	ubfx	x0, x0, 30, 1
+	orr	w0, w5, w0, lsl 5
+	cmp	w1, w0
+	ldr	w0, [x29, 120]
+	bls	.L1197
+	ubfx	x1, x0, 3, 5
+	ldr	w0, [x29, 120]
+	ubfx	x0, x0, 28, 1
+	b	.L1220
+.L1197:
+	ubfx	x1, x0, 16, 5
+	ldr	w0, [x29, 120]
+	ubfx	x0, x0, 30, 1
+	b	.L1220
+.L1215:
+	mov	w0, 0
+	b	.L1196
+.L1214:
 	mov	w23, -1
-.L1137:
-	add	w0, w0, 1
-	b	.L1136
-.L1132:
-	str	wzr, [x20,16]
-	b	.L1143
-.L1130:
+	b	.L1193
+.L1211:
+	mov	w23, 0
+	b	.L1188
+.L1186:
 	cmp	w21, 1
-	bne	.L1174
+	bne	.L1200
+	cmp	x4, 0
+	mov	w27, 2
+	csel	w27, w27, wzr, ne
+	mov	w28, 0
+	lsl	w27, w27, 1
 	mov	w23, 0
-	mov	w28, 2
-.L1144:
+.L1201:
 	cmp	w23, w24
-	bcs	.L1177
-	and	w27, w23, 3
-	mov	x3, x26
-	cbz	x26, .L1146
-	ubfiz	x0, x23, 9, 23
-	add	x3, x26, x0
-.L1146:
-	cmp	x22, xzr
+	bcc	.L1203
+	mov	w23, 0
+	b	.L1199
+.L1203:
+	and	w6, w23, 3
+	cbz	x26, .L1216
+	lsl	w3, w23, 9
+	add	x3, x26, x3
+.L1202:
+	add	x4, x22, w28, uxtw
+	mov	w2, w6
 	mov	x0, x20
-	csel	w4, w28, wzr, ne
+	str	w6, [x29, 108]
 	mov	w1, 1
-	mov	w2, w27
-	mul	w4, w4, w23
-	add	w23, w23, 2
-	add	x4, x22, x4
 	bl	NandcCopy1KB
+	ldr	w6, [x29, 108]
+	mov	x5, 0
 	mov	x4, 0
+	mov	w2, 2
+	mov	w3, w6
 	mov	w0, w25
 	mov	w1, 1
-	mov	w2, 2
-	mov	w3, w27
-	mov	x5, x4
+	add	w23, w23, 2
 	bl	NandcXferStart
-	mov	w0, w25
+	add	w28, w28, w27
 	mov	w1, 1
+	mov	w0, w25
 	bl	NandcXferComp
-	b	.L1144
-.L1177:
-	mov	w23, 0
-	b	.L1143
-.L1174:
-	mov	w1, 0
-	mov	x4, 0
-	mov	w27, 0
+	b	.L1201
+.L1216:
+	mov	x3, 0
+	b	.L1202
+.L1200:
 	mov	w0, w25
+	mov	x5, 0
+	mov	x4, 0
+	mov	w3, 0
 	mov	w2, 2
-	mov	w3, w1
-	mov	x5, x4
-	mov	w23, w27
+	mov	w1, 0
 	bl	NandcXferStart
-.L1149:
-	cmp	w27, w24
-	bcs	.L1143
+	mov	w27, 2
+	cmp	x22, 0
+	mov	w28, 0
+	csel	w27, w27, wzr, ne
+	mov	w23, 0
+	lsl	w0, w27, 1
+	mov	w27, 0
+	str	w0, [x29, 108]
+.L1204:
+	cmp	w24, w27
+	bls	.L1199
 	mov	w0, w25
 	mov	w1, w21
-	add	w28, w27, 2
 	bl	NandcXferComp
-	ldr	w0, [x20,32]
-	cmp	w28, w24
-	str	w0, [x29,104]
-	bcs	.L1150
+	ldr	w0, [x20, 32]
+	add	w7, w27, 2
+	str	w0, [x29, 120]
+	cmp	w24, w7
+	bls	.L1205
+	and	w3, w7, 3
+	str	w7, [x29, 104]
+	mov	x5, 0
 	mov	x4, 0
-	mov	w0, w25
-	mov	w1, 0
 	mov	w2, 2
-	and	w3, w28, 3
-	mov	x5, x4
+	mov	w1, 0
+	mov	w0, w25
 	bl	NandcXferStart
-.L1150:
-	ldr	w0, [x29,104]
-	tbnz	x0, 2, .L1165
-	ldr	w0, [x29,104]
+	ldr	w7, [x29, 104]
+.L1205:
+	ldr	w0, [x29, 120]
+	tbnz	x0, 2, .L1217
+	ldr	w0, [x29, 120]
 	ubfx	x1, x0, 3, 5
-	ldr	w0, [x29,104]
+	ldr	w0, [x29, 120]
 	ubfx	x0, x0, 27, 1
 	orr	w0, w1, w0, lsl 5
 	cmp	w23, w0
 	csel	w23, w23, w0, cs
-	b	.L1151
-.L1165:
-	mov	w23, -1
-.L1151:
+.L1206:
 	and	w2, w27, 3
-	mov	x3, x26
-	cbz	x26, .L1152
-	ubfiz	x3, x27, 9, 23
+	cbz	x26, .L1218
+	lsl	w3, w27, 9
 	add	x3, x26, x3
-.L1152:
-	cmp	x22, xzr
-	mov	w0, 2
-	csel	w4, w0, wzr, ne
-	mov	w1, 0
+.L1207:
+	add	x4, x22, w28, uxtw
 	mov	x0, x20
-	mul	w4, w4, w27
-	mov	w27, w28
-	add	x4, x22, x4
+	str	w7, [x29, 104]
+	mov	w1, 0
 	bl	NandcCopy1KB
-	b	.L1149
-.L1143:
-	cbnz	w21, .L1155
-	add	x19, x19, :lo12:.LANCHOR0
-	ldr	w0, [x19,2388]
-	cmp	w0, 5
-	bls	.L1155
-	ldr	w0, [x20]
-	mov	w1, 8192
-	movk	w1, 0x2, lsl 16
-	and	w1, w0, w1
-	cmp	w1, 139264
-	bne	.L1155
-	orr	w0, w0, 131072
+	ldp	w7, w0, [x29, 104]
+	add	w28, w28, w0
+	mov	w27, w7
+	b	.L1204
+.L1217:
 	mov	w23, -1
-	str	w0, [x20]
-.L1155:
-	mov	w0, w23
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 176
-	ret
+	b	.L1206
+.L1218:
+	mov	x3, 0
+	b	.L1207
 	.size	NandcXferData, .-NandcXferData
 	.align	2
 	.global	FlashReadRawPage
 	.type	FlashReadRawPage, %function
 FlashReadRawPage:
 	stp	x29, x30, [sp, -64]!
-	mov	x4, x3
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	uxtb	w19, w0
-	adrp	x0, .LANCHOR1+481
-	str	x21, [sp,32]
-	mov	x21, x2
-	ldrb	w20, [x0,#:lo12:.LANCHOR1+481]
-	cbnz	w19, .L1179
+	stp	x19, x20, [sp, 16]
+	ands	w19, w0, 255
+	stp	x21, x22, [sp, 32]
+	mov	w21, w1
+	str	x23, [sp, 48]
+	adrp	x1, .LANCHOR1+481
+	mov	x22, x2
+	mov	x23, x3
+	ldrb	w20, [x1, #:lo12:.LANCHOR1+481]
+	bne	.L1222
 	adrp	x0, .LANCHOR0
 	add	x0, x0, :lo12:.LANCHOR0
-	ldrb	w5, [x0,73]
-	ldr	w0, [x0,76]
+	ldrb	w5, [x0, 73]
+	ldr	w0, [x0, 76]
 	mul	w0, w5, w0
-	cmp	w1, w0
+	cmp	w0, w21
 	mov	w0, 4
-	csel	w20, w20, w0, cs
-.L1179:
+	csel	w20, w20, w0, ls
+.L1222:
 	mov	w0, w19
-	str	x4, [x29,48]
-	str	x1, [x29,56]
 	bl	NandcWaitFlashReady
 	mov	w0, w19
 	bl	NandcFlashCs
-	ldr	x1, [x29,56]
+	mov	w1, w21
 	mov	w0, w19
 	bl	FlashReadCmd
 	mov	w0, w19
 	bl	NandcWaitFlashReady
-	ldr	x4, [x29,48]
 	mov	w2, w20
-	mov	x3, x21
+	mov	x4, x23
+	mov	x3, x22
 	mov	w1, 0
 	mov	w0, w19
 	bl	NandcXferData
-	mov	w20, w0
+	mov	w2, w0
 	mov	w0, w19
 	bl	NandcFlashDeCs
-	ldr	x21, [sp,32]
-	mov	w0, w20
-	ldp	x19, x20, [sp,16]
+	mov	w0, w2
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldr	x23, [sp, 48]
 	ldp	x29, x30, [sp], 64
 	ret
 	.size	FlashReadRawPage, .-FlashReadRawPage
@@ -8059,161 +8027,160 @@ FlashReadRawPage:
 	.global	FlashDdrTunningRead
 	.type	FlashDdrTunningRead, %function
 FlashDdrTunningRead:
-	stp	x29, x30, [sp, -128]!
+	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR0
 	add	x19, x19, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x27, x28, [sp,80]
-	stp	x25, x26, [sp,64]
-	uxtb	w23, w0
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	and	w23, w0, 255
+	stp	x21, x22, [sp, 32]
+	mov	w25, w1
+	stp	x27, x28, [sp, 80]
 	mov	w22, 6
-	ldr	x0, [x19,136]
-	mov	w24, w1
-	mov	x28, x2
-	mov	x27, x3
-	mov	w25, w4
-	mov	w21, 1024
-	ldr	w0, [x0,304]
-	str	w0, [x29,124]
-	ldr	w0, [x19,2388]
+	mov	x24, x2
+	mov	x28, x3
+	ldr	x0, [x19, 136]
+	mov	w26, w4
+	ldr	w0, [x0, 304]
+	str	w0, [x29, 108]
+	ldr	w0, [x19, 2388]
 	cmp	w0, 8
 	mov	w0, 12
 	csel	w22, w22, w0, cc
-	cbz	w4, .L1182
+	cbz	w4, .L1238
 	mov	w0, 1
 	bl	FlashSetInterfaceMode
 	mov	w0, 1
 	bl	NandcSetMode
 	mov	w0, w23
 	bl	FlashReset
-	mov	w1, w24
-	mov	x2, x28
-	mov	x3, x27
+	mov	x3, x28
+	mov	x2, x24
+	mov	w1, w25
 	mov	w0, w23
 	bl	FlashReadRawPage
-	mov	w21, w0
-	ldrb	w0, [x19,2357]
+	mov	w20, w0
+	ldrb	w0, [x19, 2357]
 	bl	FlashSetInterfaceMode
-	ldrb	w0, [x19,2357]
+	ldrb	w0, [x19, 2357]
 	bl	NandcSetMode
-	cmn	w21, #1
-	bne	.L1183
-.L1192:
-	mov	w21, -1
-	b	.L1184
-.L1183:
+	cmn	w20, #1
+	bne	.L1227
+.L1236:
+	mov	w20, -1
+.L1224:
+	mov	w0, w20
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L1227:
+	mov	w2, w20
+	mov	w1, w25
 	adrp	x0, .LC89
-	mov	w1, w24
 	add	x0, x0, :lo12:.LC89
-	mov	w2, w21
 	bl	printk
-	cmp	w21, 9
-	bhi	.L1185
-	add	x19, x19, w23, sxtw 4
-	ldr	x0, [x19,8]
-	ldr	w1, [x0,3840]
+	cmp	w20, 9
+	bhi	.L1229
+	sbfiz	x0, x23, 4, 32
+	ldr	x0, [x19, x0]
+	ldr	w1, [x0, 3840]
 	ldr	w1, [x0]
 	orr	w1, w1, 131072
 	str	w1, [x0]
-.L1185:
+.L1229:
 	adrp	x0, .LANCHOR4
 	add	x0, x0, :lo12:.LANCHOR4
-	ldr	w1, [x0,1608]
+	ldr	w1, [x0, 1616]
 	add	w1, w1, 1
-	str	w1, [x0,1608]
+	str	w1, [x0, 1616]
 	cmp	w1, 2047
-	bls	.L1184
-	mov	x27, 0
-	str	wzr, [x0,1608]
-	mov	x28, x27
-.L1182:
+	bls	.L1224
+	mov	x28, 0
+	mov	x24, 0
+	str	wzr, [x0, 1616]
+.L1226:
+	mov	w5, 0
+	mov	w21, 0
+	mov	w6, 0
 	mov	w19, 0
-	mov	w26, -1
-	mov	w5, w19
-	mov	w6, w19
-	mov	w20, w19
-.L1190:
+	mov	w27, -1
+.L1234:
+	stp	w5, w6, [x29, 100]
 	mov	w0, w22
-	str	x5, [x29,104]
-	str	x6, [x29,112]
 	bl	NandcSetDdrPara
-	mov	w1, w24
+	mov	w1, w25
+	mov	x3, x28
+	mov	x2, x24
 	mov	w0, w23
-	mov	x2, x28
-	mov	x3, x27
 	bl	FlashReadRawPage
-	add	w1, w21, 1
-	ldr	x6, [x29,112]
+	add	w1, w20, 1
 	cmp	w0, w1
-	ldr	x5, [x29,104]
-	bhi	.L1186
+	ldp	w5, w6, [x29, 100]
+	bhi	.L1230
 	cmp	w0, 2
-	bhi	.L1196
-	add	w20, w20, 1
-	cmp	w20, 9
-	bls	.L1196
-	sub	w19, w22, w20
-	mov	w21, w0
-	mov	w26, 0
-	b	.L1188
-.L1186:
-	cmp	w6, w20
-	bcs	.L1197
-	cmp	w20, 7
-	sub	w5, w19, w20
-	bhi	.L1198
-	mov	w6, w20
-	b	.L1197
-.L1196:
-	mov	x27, 0
-	mov	w19, w22
-	mov	w21, w0
-	mov	w26, 0
-	mov	x28, x27
-	b	.L1187
-.L1197:
-	mov	w20, 0
-.L1187:
-	add	w22, w22, 2
-	cmp	w22, 69
-	bls	.L1190
-.L1188:
-	cmp	w6, w20
-	csel	w19, w19, w5, cc
-	b	.L1189
-.L1198:
-	mov	w19, w5
-.L1189:
-	cbz	w19, .L1191
+	bhi	.L1240
+	add	w19, w19, 1
+	cmp	w19, 9
+	bls	.L1240
+	mov	w1, w21
+	mov	w20, w0
+	sub	w21, w22, w19
+	mov	w27, 0
+.L1232:
+	cmp	w19, w6
+	csel	w21, w21, w1, hi
+.L1233:
+	cbz	w21, .L1235
+	mov	w1, w21
 	adrp	x0, .LC90
-	mov	w1, w19
 	add	x0, x0, :lo12:.LC90
 	bl	printk
-	mov	w0, w19
+	mov	w0, w21
 	bl	NandcSetDdrPara
-.L1191:
-	cbz	w26, .L1184
+.L1235:
+	cbz	w27, .L1224
 	adrp	x0, .LC91
+	mov	w2, w25
 	mov	w1, w23
 	add	x0, x0, :lo12:.LC91
-	mov	w2, w24
 	bl	printk
-	cbz	w25, .L1192
-	ldr	w0, [x29,124]
-	lsr	w0, w0, 8
+	cbz	w26, .L1236
+	ldr	w1, [x29, 108]
+	lsr	w0, w1, 8
 	bl	NandcSetDdrPara
-.L1184:
-	mov	w0, w21
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
-	ret
+	b	.L1224
+.L1238:
+	mov	w20, 1024
+	b	.L1226
+.L1230:
+	cmp	w19, w6
+	bls	.L1241
+	sub	w21, w5, w19
+	cmp	w19, 7
+	bhi	.L1233
+	mov	w6, w19
+.L1241:
+	mov	w19, 0
+	b	.L1231
+.L1240:
+	mov	w5, w22
+	mov	w20, w0
+	mov	w27, 0
+	mov	x28, 0
+	mov	x24, 0
+.L1231:
+	add	w22, w22, 2
+	cmp	w22, 69
+	bls	.L1234
+	mov	w1, w21
+	mov	w21, w5
+	b	.L1232
 	.size	FlashDdrTunningRead, .-FlashDdrTunningRead
 	.align	2
 	.global	FlashReadPage
@@ -8221,99 +8188,97 @@ FlashDdrTunningRead:
 FlashReadPage:
 	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	uxtb	w20, w0
+	stp	x19, x20, [sp, 16]
+	and	w20, w0, 255
+	stp	x23, x24, [sp, 48]
 	mov	w0, w20
-	stp	x23, x24, [sp,48]
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
+	stp	x21, x22, [sp, 32]
+	mov	x23, x2
+	stp	x25, x26, [sp, 64]
 	mov	w22, w1
-	mov	x24, x2
-	mov	x23, x3
+	mov	x24, x3
 	bl	FlashReadRawPage
-	cmn	w0, #1
 	mov	w19, w0
-	bne	.L1208
+	cmn	w0, #1
+	bne	.L1251
 	adrp	x21, .LANCHOR0
 	add	x25, x21, :lo12:.LANCHOR0
-	ldrb	w26, [x25,80]
-	cbnz	w26, .L1209
-.L1211:
+	ldrb	w26, [x25, 80]
+	cbnz	w26, .L1252
+.L1254:
 	add	x21, x21, :lo12:.LANCHOR0
-	ldrb	w0, [x21,2380]
-	cbz	w0, .L1208
-	b	.L1229
-.L1209:
-	mov	w0, w20
-	mov	w1, w22
-	mov	x2, x24
-	mov	x3, x23
-	strb	wzr, [x25,80]
-	bl	FlashReadRawPage
-	strb	w26, [x25,80]
-	cmn	w0, #1
-	beq	.L1211
-	mov	w19, w0
-	b	.L1208
-.L1229:
-	ldr	x0, [x21,136]
-	mov	w1, w22
-	mov	x2, x24
-	mov	x3, x23
+	ldrb	w0, [x21, 2380]
+	cbz	w0, .L1251
+	ldr	x0, [x21, 136]
 	mov	w4, 1
-	ldr	w25, [x0,304]
+	mov	x3, x24
+	mov	x2, x23
+	mov	w1, w22
+	ldr	w25, [x0, 304]
 	mov	w0, w20
 	bl	FlashDdrTunningRead
-	cmn	w0, #1
 	mov	w19, w0
-	beq	.L1212
-	ldrb	w0, [x21,2464]
+	cmn	w0, #1
+	beq	.L1255
+	ldrb	w0, [x21, 2464]
 	cmp	w19, w0, lsr 1
-	bls	.L1208
-.L1212:
+	bls	.L1251
+.L1255:
 	lsr	w0, w25, 8
 	bl	NandcSetDdrPara
-.L1208:
+	b	.L1251
+.L1252:
+	strb	wzr, [x25, 80]
+	mov	x3, x24
+	mov	x2, x23
+	mov	w1, w22
+	mov	w0, w20
+	bl	FlashReadRawPage
+	strb	w26, [x25, 80]
+	cmn	w0, #1
+	beq	.L1254
+	mov	w19, w0
+.L1251:
 	adrp	x21, .LANCHOR4
-	cmn	w19, #1
 	add	x21, x21, :lo12:.LANCHOR4
-	ldr	x4, [x21,1616]
-	bne	.L1213
-	cbz	x4, .L1213
+	ldr	x4, [x21, 1624]
+	cbz	x4, .L1250
+	cmn	w19, #1
+	bne	.L1250
+	mov	x3, x24
+	mov	x2, x23
 	mov	w1, w22
-	mov	x2, x24
-	mov	x3, x23
 	mov	w0, w20
 	blr	x4
 	mov	w19, w0
+	mov	w1, w0
+	mov	w3, w22
+	mov	w2, w20
 	adrp	x0, .LC92
-	mov	w1, w19
 	add	x0, x0, :lo12:.LC92
-	mov	w2, w20
-	mov	w3, w22
 	bl	printk
 	cmn	w19, #1
-	bne	.L1213
+	bne	.L1250
 	adrp	x0, .LANCHOR0+204
-	ldrb	w0, [x0,#:lo12:.LANCHOR0+204]
-	cbz	w0, .L1213
+	ldrb	w0, [x0, #:lo12:.LANCHOR0+204]
+	cbz	w0, .L1250
 	mov	w0, w20
 	bl	flash_enter_slc_mode
-	ldr	x4, [x21,1616]
-	mov	w0, w20
+	ldr	x4, [x21, 1624]
+	mov	x3, x24
+	mov	x2, x23
 	mov	w1, w22
-	mov	x2, x24
-	mov	x3, x23
+	mov	w0, w20
 	blr	x4
 	mov	w19, w0
 	mov	w0, w20
 	bl	flash_exit_slc_mode
-.L1213:
+.L1250:
 	mov	w0, w19
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
 	ldp	x29, x30, [sp], 80
 	ret
 	.size	FlashReadPage, .-FlashReadPage
@@ -8323,52 +8288,52 @@ FlashReadPage:
 FlashDdrParaScan:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR0
-	mov	w20, w1
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	add	x22, x19, :lo12:.LANCHOR0
-	uxtb	w21, w0
-	ldrb	w0, [x22,2357]
+	and	w20, w0, 255
+	mov	w21, w1
+	ldrb	w0, [x22, 2357]
 	bl	FlashSetInterfaceMode
-	ldrb	w0, [x22,2357]
+	ldrb	w0, [x22, 2357]
 	bl	NandcSetMode
+	mov	w4, 0
+	mov	x3, 0
 	mov	x2, 0
-	mov	w1, w20
-	mov	x3, x2
-	mov	w4, w2
-	mov	w0, w21
+	mov	w1, w21
+	mov	w0, w20
 	bl	FlashDdrTunningRead
+	mov	x3, 0
 	mov	w22, w0
 	mov	x2, 0
-	mov	w0, w21
-	mov	w1, w20
-	mov	x3, x2
+	mov	w1, w21
+	mov	w0, w20
 	bl	FlashReadRawPage
 	cmn	w0, #1
-	beq	.L1234
+	beq	.L1271
 	cmn	w22, #1
-	bne	.L1231
-.L1234:
+	bne	.L1272
+.L1271:
 	add	x20, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x20,2357]
-	tbz	x0, 0, .L1231
+	ldrb	w0, [x20, 2357]
+	tbz	x0, 0, .L1272
 	mov	w0, 1
 	bl	FlashSetInterfaceMode
 	mov	w0, 1
 	bl	NandcSetMode
-	strb	wzr, [x20,2380]
-	b	.L1233
-.L1231:
-	add	x19, x19, :lo12:.LANCHOR0
-	mov	w0, 1
-	strb	w0, [x19,2380]
-.L1233:
+	strb	wzr, [x20, 2380]
+.L1273:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
+.L1272:
+	add	x19, x19, :lo12:.LANCHOR0
+	mov	w0, 1
+	strb	w0, [x19, 2380]
+	b	.L1273
 	.size	FlashDdrParaScan, .-FlashDdrParaScan
 	.align	2
 	.global	FlashLoadPhyInfo
@@ -8377,142 +8342,137 @@ FlashLoadPhyInfo:
 	stp	x29, x30, [sp, -128]!
 	mov	w0, 60
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	adrp	x23, .LANCHOR4
-	adrp	x24, .LANCHOR1
-	strb	w0, [x29,120]
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR0
+	stp	x21, x22, [sp, 32]
+	adrp	x21, .LANCHOR4
+	strb	w0, [x29, 120]
 	mov	w0, 40
-	strb	w0, [x29,121]
+	strb	w0, [x29, 121]
 	mov	w0, 24
-	strb	w0, [x29,122]
+	strb	w0, [x29, 122]
 	mov	w0, 16
-	strb	w0, [x29,123]
-	add	x0, x23, :lo12:.LANCHOR4
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	stp	x19, x20, [sp,16]
-	adrp	x22, .LANCHOR0
-	add	x24, x24, :lo12:.LANCHOR1
-	ldr	x1, [x0,1600]
-	add	x21, x22, :lo12:.LANCHOR0
-	str	x1, [x0,1624]
-	mov	w20, 0
-	str	wzr, [x0,1632]
-	mov	w25, 4
+	strb	w0, [x29, 123]
+	add	x0, x20, :lo12:.LANCHOR0
+	stp	x23, x24, [sp, 48]
+	adrp	x22, .LANCHOR1
+	stp	x27, x28, [sp, 80]
+	add	x22, x22, :lo12:.LANCHOR1
+	stp	x25, x26, [sp, 64]
+	mov	w27, 20036
+	mov	w19, 0
+	mov	w24, 4
+	ldr	w0, [x0, 76]
+	mov	w23, -1
+	str	w0, [x29, 108]
+	add	x0, x21, :lo12:.LANCHOR4
+	movk	w27, 0x4e41, lsl 16
+	add	x22, x22, 472
+	ldr	x1, [x0, 1608]
+	str	x1, [x0, 1632]
+	str	wzr, [x0, 1640]
 	mov	w0, 0
-	mov	w28, -1
-	add	x24, x24, 472
-	add	x27, x21, 96
-	ldr	w26, [x21,76]
 	bl	flash_enter_slc_mode
-.L1242:
-	add	w0, w20, 1
-	mov	x19, 0
-	str	w0, [x29,104]
-.L1244:
+.L1282:
+	add	w28, w19, 1
+	add	x25, x21, :lo12:.LANCHOR4
+	mov	x26, 0
+.L1284:
 	add	x0, x29, 120
-	ldrb	w0, [x19,x0]
+	ldrb	w0, [x0, x26]
 	bl	FlashBchSel
-	add	x5, x23, :lo12:.LANCHOR4
-	mov	w0, 0
-	mov	w1, w20
+	ldr	x2, [x25, 1608]
 	mov	x3, 0
-	str	x5, [x29,96]
-	ldr	x2, [x5,1600]
+	mov	w1, w19
+	mov	w0, 0
 	bl	FlashReadRawPage
 	cmn	w0, #1
-	bne	.L1243
-	ldr	x5, [x29,96]
-	mov	w0, 0
-	ldr	w1, [x29,104]
+	bne	.L1283
+	ldr	x2, [x25, 1608]
 	mov	x3, 0
-	ldr	x2, [x5,1600]
+	mov	w1, w28
+	mov	w0, 0
 	bl	FlashReadRawPage
 	cmn	w0, #1
-	bne	.L1243
-	add	x19, x19, 1
-	cmp	x19, 4
-	beq	.L1245
-	b	.L1244
-.L1246:
-	add	x0, x2, 12
+	bne	.L1283
+	add	x26, x26, 1
+	cmp	x26, 4
+	bne	.L1284
+.L1285:
+	ldr	w0, [x29, 108]
+	subs	w24, w24, #1
+	add	w19, w19, w0
+	bne	.L1282
+	b	.L1290
+.L1286:
 	mov	w1, 2036
-	str	x2, [x29,104]
-	mov	w28, -1
+	add	x0, x6, 12
 	bl	js_hash
-	ldr	x2, [x29,104]
-	ldr	w1, [x2,8]
+	ldr	w1, [x6, 8]
 	cmp	w1, w0
-	beq	.L1256
-.L1245:
-	subs	w25, w25, #1
-	add	w20, w20, w26
-	bne	.L1242
-	mov	w0, w25
-.L1255:
-	bl	flash_exit_slc_mode
-	mov	w0, w28
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
-	ret
-.L1243:
-	add	x19, x23, :lo12:.LANCHOR4
-	mov	w0, 20036
-	movk	w0, 0x4e41, lsl 16
-	ldr	x2, [x19,1624]
-	ldr	w1, [x2]
-	cmp	w1, w0
-	bne	.L1245
-	cbnz	w28, .L1246
-	add	x22, x22, :lo12:.LANCHOR0
-	ldr	w0, [x22,76]
-	udiv	w20, w20, w0
-	mov	w0, w28
-	add	w20, w20, 1
-	str	w20, [x19,1636]
-	b	.L1255
-.L1256:
-	add	x1, x2, 160
-	mov	x0, x24
+	bne	.L1292
+	add	x1, x6, 160
 	mov	w2, 32
+	mov	x0, x22
 	bl	ftl_memcpy
-	ldr	x1, [x19,1624]
+	ldr	x1, [x25, 1632]
+	add	x23, x20, :lo12:.LANCHOR0
 	mov	w2, 32
-	mov	x0, x27
+	add	x0, x23, 96
 	add	x1, x1, 192
 	bl	ftl_memcpy
-	ldr	x1, [x19,1624]
+	ldr	x1, [x25, 1632]
 	mov	w2, 852
-	add	x0, x21, 1272
+	add	x0, x23, 1272
 	add	x1, x1, 224
 	bl	ftl_memcpy
-	ldrh	w0, [x24,10]
+	ldrh	w0, [x22, 10]
 	bl	FlashBlockAlignInit
-	str	w20, [x19,1632]
-	ldr	w1, [x21,76]
-	ldr	x2, [x19,1624]
-	udiv	w1, w20, w1
-	ldr	w0, [x2,1076]
-	add	w1, w1, 1
-	strb	w0, [x21,2380]
-	cmp	w1, 1
-	bls	.L1248
-	str	w1, [x19,1636]
-	b	.L1249
-.L1248:
+	str	w19, [x25, 1640]
+	ldr	x1, [x25, 1632]
+	ldr	w0, [x1, 1076]
+	strb	w0, [x23, 2380]
+	ldr	w0, [x23, 76]
+	udiv	w0, w19, w0
+	add	w0, w0, 1
+	cmp	w0, 1
+	bls	.L1288
+.L1295:
+	str	w0, [x25, 1644]
+	add	x0, x21, :lo12:.LANCHOR4
+	ldrh	w1, [x1, 14]
+	mov	w23, 0
+	strb	w1, [x0, 1648]
+	b	.L1285
+.L1288:
 	mov	w0, 2
-	str	w0, [x19,1636]
-.L1249:
-	add	x0, x23, :lo12:.LANCHOR4
-	ldrh	w1, [x2,14]
-	mov	w28, 0
-	strb	w1, [x0,1640]
-	b	.L1245
+	b	.L1295
+.L1292:
+	mov	w23, -1
+	b	.L1285
+.L1283:
+	add	x25, x21, :lo12:.LANCHOR4
+	ldr	x6, [x25, 1632]
+	ldr	w0, [x6]
+	cmp	w0, w27
+	bne	.L1285
+	cbnz	w23, .L1286
+	add	x20, x20, :lo12:.LANCHOR0
+	ldr	w0, [x20, 76]
+	udiv	w19, w19, w0
+	add	w19, w19, 1
+	str	w19, [x25, 1644]
+.L1290:
+	mov	w0, 0
+	bl	flash_exit_slc_mode
+	mov	w0, w23
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 128
+	ret
 	.size	FlashLoadPhyInfo, .-FlashLoadPhyInfo
 	.align	2
 	.global	ToshibaReadRetrial
@@ -8520,174 +8480,172 @@ FlashLoadPhyInfo:
 ToshibaReadRetrial:
 	stp	x29, x30, [sp, -128]!
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	uxtb	w23, w0
-	mov	w0, w23
-	str	w1, [x29,116]
-	stp	x19, x20, [sp,16]
-	stp	x27, x28, [sp,80]
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	mov	x27, x2
-	mov	x26, x3
+	stp	x21, x22, [sp, 32]
+	and	w22, w0, 255
+	stp	x19, x20, [sp, 16]
+	mov	w0, w22
+	stp	x27, x28, [sp, 80]
+	mov	x27, x3
+	stp	x23, x24, [sp, 48]
 	adrp	x19, .LANCHOR0
+	str	x2, [x29, 112]
+	str	w1, [x29, 120]
+	stp	x25, x26, [sp, 64]
 	bl	NandcWaitFlashReady
-	add	x2, x19, :lo12:.LANCHOR0
-	sbfiz	x0, x23, 4, 32
-	add	x1, x2, 8
-	mov	w22, 0
-	add	x3, x1, x0
-	ldr	x24, [x1,x0]
-	ldrb	w0, [x3,8]
-	str	x0, [x29,120]
-	add	x20, x0, 8
-	mov	x28, x0
-	ldrb	w0, [x2,128]
-	add	x20, x24, x20, lsl 8
+	add	x1, x19, :lo12:.LANCHOR0
+	sbfiz	x0, x22, 4, 32
+	add	x2, x1, x0
+	ldr	x23, [x1, x0]
+	ldrb	w0, [x1, 128]
+	ldrb	w28, [x2, 8]
 	sub	w0, w0, #67
-	uxtb	w0, w0
+	str	w28, [x29, 124]
+	add	x20, x28, 8
+	and	w0, w0, 255
+	add	x20, x23, x20, lsl 8
 	cmp	w0, 1
-	bls	.L1258
-	ldrb	w0, [x2,2380]
-	cbz	w0, .L1259
-	mov	w0, w22
-	mov	w22, 1
+	bls	.L1313
+	ldrb	w0, [x1, 2380]
+	cbz	w0, .L1314
+	mov	w24, 1
+	mov	w0, 0
 	bl	NandcSetDdrMode
-.L1259:
-	ubfiz	x0, x28, 8, 8
-	mov	w2, 92
-	add	x0, x24, x0
-	str	w2, [x0,2056]
-	mov	w2, 197
-	str	w2, [x0,2056]
-.L1258:
-	ldr	x0, [x29,120]
+.L1298:
+	add	x0, x23, x28, lsl 8
+	mov	w1, 92
+	str	w1, [x0, 2056]
+	mov	w1, 197
+	str	w1, [x0, 2056]
+.L1297:
+	ldrsw	x0, [x29, 124]
 	mov	w21, 1
 	mov	w25, -1
 	add	x0, x0, 8
-	lsl	x0, x0, 8
-	str	x0, [x29,104]
-	ubfiz	x0, x28, 8, 8
-	str	x0, [x29,96]
-.L1260:
+	add	x0, x23, x0, lsl 8
+	str	x0, [x29, 104]
+.L1299:
 	adrp	x0, .LANCHOR4
 	add	x0, x0, :lo12:.LANCHOR4
-	ldrb	w0, [x0,1641]
+	ldrb	w0, [x0, 1649]
 	add	w0, w0, 1
 	cmp	w21, w0
-	bcs	.L1285
+	bcc	.L1308
+	mov	w26, w25
+.L1307:
+	add	x0, x19, :lo12:.LANCHOR0
+	mov	w1, 0
+	ldrb	w0, [x0, 128]
+	sub	w0, w0, #67
+	and	w0, w0, 255
+	cmp	w0, 1
+	mov	x0, x20
+	bhi	.L1309
+	bl	SandiskSetRRPara
+.L1310:
+	ldrsw	x0, [x29, 124]
+	add	x19, x19, :lo12:.LANCHOR0
+	add	x0, x0, 8
+	add	x23, x23, x0, lsl 8
+	mov	w0, 255
+	str	w0, [x23, 8]
+	ldrb	w0, [x19, 2464]
+	add	w0, w0, w0, lsl 1
+	cmp	w26, w0, lsr 2
+	bcc	.L1311
+	cmn	w26, #1
+	mov	w0, 256
+	csel	w26, w26, w0, eq
+.L1311:
+	mov	w0, w22
+	bl	NandcWaitFlashReady
+	cbz	w24, .L1296
+	mov	w0, 4
+	bl	NandcSetDdrMode
+.L1296:
+	mov	w0, w26
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 128
+	ret
+.L1314:
+	mov	w24, 0
+	b	.L1298
+.L1313:
+	mov	w24, 0
+	b	.L1297
+.L1308:
 	add	x0, x19, :lo12:.LANCHOR0
 	mov	w1, w21
-	ldrb	w0, [x0,128]
+	ldrb	w0, [x0, 128]
 	sub	w0, w0, #67
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 1
 	mov	x0, x20
-	bhi	.L1261
+	bhi	.L1300
 	bl	SandiskSetRRPara
-	b	.L1262
-.L1261:
-	bl	ToshibaSetRRPara
-.L1262:
+.L1301:
 	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x0,128]
+	ldrb	w0, [x0, 128]
 	cmp	w0, 34
-	bne	.L1263
+	bne	.L1302
 	adrp	x0, .LANCHOR4
 	add	x0, x0, :lo12:.LANCHOR4
-	ldrb	w0, [x0,1641]
+	ldrb	w0, [x0, 1649]
 	sub	w0, w0, #3
 	cmp	w21, w0
-	bne	.L1263
-	ldr	x0, [x29,104]
-	mov	w1, 179
-	add	x0, x24, x0
-	str	w1, [x0,8]
-.L1263:
-	ldr	x0, [x29,96]
+	bne	.L1302
+	ldr	x1, [x29, 104]
+	mov	w0, 179
+	str	w0, [x1, 8]
+.L1302:
+	add	x0, x23, x28, lsl 8
 	mov	w1, 38
-	add	x0, x24, x0
-	str	w1, [x0,2056]
+	str	w1, [x0, 2056]
 	mov	w1, 93
-	str	w1, [x0,2056]
-	cbz	w22, .L1264
+	str	w1, [x0, 2056]
+	cbz	w24, .L1303
 	mov	w0, 4
 	bl	NandcSetDdrMode
-	ldr	w1, [x29,116]
-	mov	w0, w23
-	mov	x2, x27
-	mov	x3, x26
+	ldr	w1, [x29, 120]
+	mov	x3, x27
+	ldr	x2, [x29, 112]
+	mov	w0, w22
 	bl	FlashReadRawPage
-	mov	w28, w0
+	mov	w26, w0
 	mov	w0, 0
 	bl	NandcSetDdrMode
-	b	.L1265
-.L1264:
-	ldr	w1, [x29,116]
-	mov	w0, w23
-	mov	x2, x27
-	mov	x3, x26
-	bl	FlashReadRawPage
-	mov	w28, w0
-.L1265:
-	cmn	w28, #1
-	beq	.L1266
+.L1304:
+	cmn	w26, #1
+	beq	.L1305
 	add	x0, x19, :lo12:.LANCHOR0
 	cmn	w25, #1
-	csel	w25, w25, w28, ne
-	ldrb	w0, [x0,2464]
+	csel	w25, w25, w26, ne
+	ldrb	w0, [x0, 2464]
 	add	w0, w0, w0, lsl 1
-	cmp	w28, w0, lsr 2
-	bcc	.L1268
-	mov	x26, 0
-	mov	x27, x26
-.L1266:
+	cmp	w26, w0, lsr 2
+	bcc	.L1307
+	mov	x27, 0
+	str	xzr, [x29, 112]
+.L1305:
 	add	w21, w21, 1
-	b	.L1260
-.L1285:
-	mov	w28, w25
-.L1268:
-	add	x0, x19, :lo12:.LANCHOR0
-	mov	w1, 0
-	ldrb	w0, [x0,128]
-	sub	w0, w0, #67
-	uxtb	w0, w0
-	cmp	w0, 1
-	mov	x0, x20
-	bhi	.L1270
-	bl	SandiskSetRRPara
-	b	.L1271
-.L1270:
+	b	.L1299
+.L1300:
 	bl	ToshibaSetRRPara
-.L1271:
-	ldr	x0, [x29,120]
-	add	x19, x19, :lo12:.LANCHOR0
-	add	x0, x0, 8
-	add	x24, x24, x0, lsl 8
-	mov	w0, 255
-	str	w0, [x24,8]
-	ldrb	w0, [x19,2464]
-	add	w0, w0, w0, lsl 1
-	cmp	w28, w0, lsr 2
-	bcc	.L1272
-	cmn	w28, #1
-	mov	w0, 256
-	csel	w28, w28, w0, eq
-.L1272:
-	mov	w0, w23
-	bl	NandcWaitFlashReady
-	cbz	w22, .L1273
-	mov	w0, 4
-	bl	NandcSetDdrMode
-.L1273:
-	mov	w0, w28
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
-	ret
+	b	.L1301
+.L1303:
+	ldr	w1, [x29, 120]
+	mov	x3, x27
+	ldr	x2, [x29, 112]
+	mov	w0, w22
+	bl	FlashReadRawPage
+	mov	w26, w0
+	b	.L1304
+.L1309:
+	bl	ToshibaSetRRPara
+	b	.L1310
 	.size	ToshibaReadRetrial, .-ToshibaReadRetrial
 	.align	2
 	.global	SamsungReadRetrial
@@ -8695,80 +8653,81 @@ ToshibaReadRetrial:
 SamsungReadRetrial:
 	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	uxtb	w22, w0
-	str	x27, [sp,80]
+	stp	x21, x22, [sp, 32]
+	and	w22, w0, 255
+	stp	x19, x20, [sp, 16]
 	mov	w0, w22
-	adrp	x27, .LANCHOR4
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	mov	x24, x2
+	stp	x23, x24, [sp, 48]
+	mov	x23, x2
+	stp	x25, x26, [sp, 64]
+	mov	x24, x3
+	stp	x27, x28, [sp, 80]
 	mov	w25, w1
-	mov	x23, x3
-	adrp	x20, .LANCHOR0
 	bl	NandcWaitFlashReady
-	mov	w26, 1
-	add	x0, x20, :lo12:.LANCHOR0
+	adrp	x20, .LANCHOR0
 	sbfiz	x1, x22, 4, 32
-	add	x0, x0, 8
-	mov	w19, -1
+	add	x0, x20, :lo12:.LANCHOR0
 	add	x2, x0, x1
-	ldr	x0, [x0,x1]
-	ldrb	w21, [x2,8]
+	adrp	x28, .LANCHOR4
+	mov	x26, x0
+	add	x28, x28, :lo12:.LANCHOR4
+	ldr	x1, [x0, x1]
+	mov	w27, 1
+	ldrb	w21, [x2, 8]
+	mov	w19, -1
 	add	x21, x21, 8
-	add	x21, x0, x21, lsl 8
-.L1287:
-	add	x0, x27, :lo12:.LANCHOR4
-	ldrb	w0, [x0,1641]
+	add	x21, x1, x21, lsl 8
+.L1325:
+	ldrb	w0, [x28, 1649]
 	add	w0, w0, 1
-	cmp	w26, w0
-	bcs	.L1290
+	cmp	w27, w0
+	bcc	.L1329
+.L1328:
+	add	x20, x20, :lo12:.LANCHOR0
 	mov	x0, x21
-	mov	w1, w26
+	mov	w1, 0
 	bl	SamsungSetRRPara
-	mov	w0, w22
-	mov	w1, w25
-	mov	x2, x24
-	mov	x3, x23
-	bl	FlashReadRawPage
-	cmn	w0, #1
-	beq	.L1288
-	add	x1, x20, :lo12:.LANCHOR0
-	cmn	w19, #1
-	csel	w19, w19, w0, ne
-	ldrb	w1, [x1,2464]
-	add	w1, w1, w1, lsl 1
-	cmp	w0, w1, lsr 2
-	bcc	.L1293
-	mov	x23, 0
-	mov	x24, x23
-.L1288:
-	add	w26, w26, 1
-	b	.L1287
-.L1293:
-	mov	w19, w0
-.L1290:
-	mov	x0, x21
-	mov	w1, 0
-	add	x20, x20, :lo12:.LANCHOR0
-	bl	SamsungSetRRPara
-	ldrb	w0, [x20,2464]
+	ldrb	w0, [x20, 2464]
 	add	w0, w0, w0, lsl 1
 	cmp	w19, w0, lsr 2
-	bcc	.L1292
+	bcc	.L1324
 	cmn	w19, #1
 	mov	w0, 256
 	csel	w19, w19, w0, eq
-.L1292:
+.L1324:
 	mov	w0, w19
-	ldr	x27, [sp,80]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 96
 	ret
+.L1329:
+	mov	w1, w27
+	mov	x0, x21
+	bl	SamsungSetRRPara
+	mov	x3, x24
+	mov	x2, x23
+	mov	w1, w25
+	mov	w0, w22
+	bl	FlashReadRawPage
+	cmn	w0, #1
+	beq	.L1326
+	ldrb	w1, [x26, 2464]
+	cmn	w19, #1
+	csel	w19, w19, w0, ne
+	add	w1, w1, w1, lsl 1
+	cmp	w0, w1, lsr 2
+	bcc	.L1331
+	mov	x24, 0
+	mov	x23, 0
+.L1326:
+	add	w27, w27, 1
+	b	.L1325
+.L1331:
+	mov	w19, w0
+	b	.L1328
 	.size	SamsungReadRetrial, .-SamsungReadRetrial
 	.align	2
 	.global	MicronReadRetrial
@@ -8776,160 +8735,148 @@ SamsungReadRetrial:
 MicronReadRetrial:
 	stp	x29, x30, [sp, -160]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR0
-	stp	x21, x22, [sp,32]
-	uxtb	w21, w0
-	add	x0, x20, :lo12:.LANCHOR0
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	stp	x23, x24, [sp,48]
-	mov	w28, w1
-	mov	x26, x2
-	ldrb	w19, [x0,2464]
-	mov	x22, x3
-	ldrb	w0, [x0,204]
-	cbnz	w0, .L1300
+	stp	x19, x20, [sp, 16]
+	and	w20, w0, 255
+	adrp	x0, .LANCHOR0
+	stp	x23, x24, [sp, 48]
+	str	w1, [x29, 156]
+	add	x1, x0, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	mov	x23, x2
+	stp	x25, x26, [sp, 64]
+	mov	x24, x3
+	stp	x27, x28, [sp, 80]
+	ldrb	w19, [x1, 2464]
+	ldrb	w1, [x1, 204]
+	cbnz	w1, .L1339
 	add	w19, w19, w19, lsl 1
-	ubfx	x19, x19, 2, 8
-	b	.L1301
-.L1300:
-	mov	w0, 3
-	sdiv	w19, w19, w0
-.L1301:
-	adrp	x27, .LC93
-	mov	w25, 0
-	add	x0, x27, :lo12:.LC93
-	str	x0, [x29,152]
-	add	x20, x20, :lo12:.LANCHOR0
-	add	x23, x20, 8
-	add	x23, x23, w21, sxtw 4
-.L1312:
-	mov	w0, w21
-	mov	w24, 0
-	mov	w27, -1
+	asr	w19, w19, 2
+.L1340:
+	add	x0, x0, :lo12:.LANCHOR0
+	mov	w22, 0
+	str	x0, [x29, 144]
+	mov	w27, 239
+	add	x0, x0, w20, sxtw 4
+	mov	w28, 137
+	str	x0, [x29, 136]
+.L1350:
+	mov	w0, w20
 	bl	NandcWaitFlashReady
-	ldrb	w4, [x23,8]
-	mov	w9, 239
-	ldr	x6, [x23]
-	mov	w10, 137
-	lsl	x8, x4, 8
-.L1302:
-	adrp	x0, .LANCHOR4
-	add	x0, x0, :lo12:.LANCHOR4
-	ldrb	w0, [x0,1641]
-	cmp	w24, w0
-	bcs	.L1305
-	add	x2, x6, x8
-	mov	x0, 1000
-	str	x4, [x29,104]
-	str	x8, [x29,112]
-	str	w9, [x2,2056]
-	str	w10, [x2,2052]
-	str	x6, [x29,120]
-	str	x9, [x29,128]
-	str	x10, [x29,136]
-	str	x2, [x29,144]
-	bl	__const_udelay
-	ldr	x2, [x29,144]
-	add	w7, w24, 1
-	mov	w0, w21
-	mov	w1, w28
-	mov	x3, x22
-	str	x7, [x29,144]
-	str	w7, [x2,2048]
-	str	wzr, [x2,2048]
-	str	wzr, [x2,2048]
-	str	wzr, [x2,2048]
-	mov	x2, x26
-	bl	FlashReadRawPage
-	cmn	w0, #1
-	ldr	x7, [x29,144]
-	ldr	x10, [x29,136]
-	ldr	x9, [x29,128]
-	ldr	x6, [x29,120]
-	ldr	x8, [x29,112]
-	ldr	x4, [x29,104]
-	beq	.L1303
-	cmn	w27, #1
-	csel	w27, w27, w0, ne
-	cmp	w0, w19
-	bcc	.L1314
-	mov	x22, 0
-	mov	x26, x22
-.L1303:
-	mov	w24, w7
-	b	.L1302
-.L1314:
-	mov	x22, 0
-	mov	w27, w0
-	mov	x26, x22
-.L1305:
-	add	x1, x6, x4, lsl 8
-	mov	w0, 239
-	str	x1, [x29,144]
-	str	w0, [x1,2056]
-	mov	w0, 137
-	str	w0, [x1,2052]
+	ldr	x0, [x29, 136]
+	adrp	x7, .LANCHOR4
+	add	x7, x7, :lo12:.LANCHOR4
+	mov	w21, 0
+	mov	w25, -1
+	ldrb	w4, [x0, 8]
+	ldr	x8, [x0]
+	add	x26, x8, x4, lsl 8
+.L1341:
+	ldrb	w0, [x7, 1649]
+	cmp	w21, w0
+	bcc	.L1345
+.L1344:
+	add	x4, x8, x4, lsl 8
 	mov	x0, 1000
+	str	x4, [x29, 128]
+	str	w27, [x4, 2056]
+	str	w28, [x4, 2052]
 	bl	__const_udelay
-	ldr	x1, [x29,144]
-	cmp	w27, w19
-	str	wzr, [x1,2048]
-	str	wzr, [x1,2048]
-	str	wzr, [x1,2048]
-	str	wzr, [x1,2048]
-	bcc	.L1307
-	cmn	w27, #1
+	ldr	x4, [x29, 128]
+	cmp	w25, w19
+	str	wzr, [x4, 2048]
+	str	wzr, [x4, 2048]
+	str	wzr, [x4, 2048]
+	str	wzr, [x4, 2048]
+	bcc	.L1346
+	cmn	w25, #1
 	mov	w0, 256
-	csel	w27, w27, w0, eq
-.L1307:
-	cmn	w27, #1
-	cset	w6, eq
-	cbnz	w6, .L1316
-	cmp	w27, 256
-	cset	w1, eq
-	cbz	w1, .L1308
-.L1316:
-	ldr	x0, [x29,152]
-	mov	w1, w24
-	mov	w2, w28
-	mov	w3, w24
-	mov	w4, w27
-	str	x6, [x29,144]
+	csel	w25, w25, w0, eq
+.L1346:
+	cmp	w25, 256
+	ccmn	w25, #1, 4, ne
+	bne	.L1347
+	ldr	w2, [x29, 156]
+	adrp	x0, .LC93
+	mov	w4, w25
+	mov	w3, w21
+	mov	w1, w21
+	add	x0, x0, :lo12:.LC93
 	bl	printk
-	cbnz	w25, .L1310
-	ldr	x6, [x29,144]
-	cbz	w6, .L1321
-	ldrb	w0, [x20,204]
-	cbz	w0, .L1321
-	mov	w0, w21
+	cbnz	w22, .L1348
+	ldr	x0, [x29, 144]
+	ldrb	w0, [x0, 204]
+	cbz	w0, .L1338
+	cmn	w25, #1
+	bne	.L1338
 	mov	w1, 3
-	mov	w25, 1
+	mov	w0, w20
+	mov	w22, 1
 	bl	micron_auto_read_calibration_config
-	b	.L1312
-.L1310:
-	mov	w0, w21
+	b	.L1350
+.L1339:
+	mov	w1, 3
+	sdiv	w19, w19, w1
+	b	.L1340
+.L1345:
+	str	w27, [x26, 2056]
+	mov	x0, 1000
+	str	w28, [x26, 2052]
+	stp	x4, x7, [x29, 104]
+	str	x8, [x29, 120]
+	bl	__const_udelay
+	add	w9, w21, 1
+	str	w9, [x26, 2048]
+	str	wzr, [x26, 2048]
+	mov	x3, x24
+	ldr	w1, [x29, 156]
+	mov	x2, x23
+	str	wzr, [x26, 2048]
+	mov	w0, w20
+	str	wzr, [x26, 2048]
+	str	w9, [x29, 128]
+	bl	FlashReadRawPage
+	cmn	w0, #1
+	ldr	w9, [x29, 128]
+	ldp	x4, x7, [x29, 104]
+	ldr	x8, [x29, 120]
+	beq	.L1342
+	cmn	w25, #1
+	csel	w25, w25, w0, ne
+	cmp	w0, w19
+	bcc	.L1352
+	mov	x24, 0
+	mov	x23, 0
+.L1342:
+	mov	w21, w9
+	b	.L1341
+.L1352:
+	mov	w25, w0
+	mov	x24, 0
+	mov	x23, 0
+	b	.L1344
+.L1348:
+	mov	w0, w20
 	mov	w1, 0
 	bl	micron_auto_read_calibration_config
-	cmn	w27, #1
+	cmn	w25, #1
 	mov	w0, 256
-	csel	w27, w27, w0, eq
-	b	.L1321
-.L1308:
-	cbz	w25, .L1321
-	mov	w0, w21
-	mov	w27, 256
-	bl	micron_auto_read_calibration_config
-.L1321:
-	mov	w0, w27
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+	csel	w25, w25, w0, eq
+.L1338:
+	mov	w0, w25
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 160
 	ret
+.L1347:
+	cbz	w22, .L1338
+	mov	w1, 0
+	mov	w0, w20
+	mov	w25, 256
+	bl	micron_auto_read_calibration_config
+	b	.L1338
 	.size	MicronReadRetrial, .-MicronReadRetrial
 	.align	2
 	.global	HynixReadRetrial
@@ -8937,321 +8884,306 @@ MicronReadRetrial:
 HynixReadRetrial:
 	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	adrp	x21, .LANCHOR0
-	uxtb	x22, w0
+	stp	x27, x28, [sp, 80]
+	and	x27, x0, 255
 	add	x0, x21, :lo12:.LANCHOR0
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	stp	x19, x20, [sp,16]
-	mov	x26, x2
+	stp	x25, x26, [sp, 64]
+	stp	x23, x24, [sp, 48]
+	mov	x24, x2
+	stp	x19, x20, [sp, 16]
 	add	x2, x0, 1272
-	ldrb	w25, [x0,1274]
-	mov	w27, w1
-	ldr	x0, [x0,88]
-	add	x1, x2, x22
-	mov	x23, x22
-	mov	x24, x3
-	ldrb	w0, [x0,19]
-	ldrb	w19, [x1,12]
+	mov	w26, w1
+	add	x1, x2, x27
+	ldrb	w23, [x0, 1274]
+	mov	x22, x27
+	ldr	x0, [x0, 88]
+	mov	x25, x3
+	ldrb	w19, [x1, 12]
+	ldrb	w0, [x0, 19]
 	sub	w0, w0, #7
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 1
-	bhi	.L1330
-	ldrb	w19, [x1,20]
-.L1330:
-	mov	w0, w23
-	mov	w28, 0
-	mov	w20, -1
+	bhi	.L1364
+	ldrb	w19, [x1, 20]
+.L1364:
+	mov	w0, w22
 	bl	NandcWaitFlashReady
 	add	x4, x21, :lo12:.LANCHOR0
+	mov	w28, 0
 	add	x5, x4, 1276
-.L1331:
-	cmp	w28, w25
-	bcs	.L1335
-	add	w19, w19, 1
-	ldrb	w1, [x4,1273]
-	mov	x2, x5
-	mov	w0, w23
-	uxtb	w19, w19
-	str	x4, [x29,96]
-	cmp	w19, w25
-	str	x5, [x29,104]
-	csel	w19, w19, wzr, cc
-	mov	w3, w19
-	bl	HynixSetRRPara
-	mov	w0, w23
-	mov	w1, w27
-	mov	x2, x26
-	mov	x3, x24
-	bl	FlashReadRawPage
-	cmn	w0, #1
-	ldr	x5, [x29,104]
-	ldr	x4, [x29,96]
-	beq	.L1333
-	ldrb	w1, [x4,2464]
-	cmn	w20, #1
-	csel	w20, w20, w0, ne
-	add	w1, w1, w1, lsl 1
-	cmp	w0, w1, lsr 2
-	bcc	.L1340
-	mov	x24, 0
-	mov	x26, x24
-.L1333:
-	add	w28, w28, 1
-	b	.L1331
-.L1340:
-	mov	w20, w0
-.L1335:
+	mov	w20, -1
+.L1365:
+	cmp	w28, w23
+	bcc	.L1370
+.L1369:
 	add	x0, x21, :lo12:.LANCHOR0
-	ldr	x1, [x0,88]
+	ldr	x1, [x0, 88]
 	add	x0, x0, 1272
-	add	x0, x0, x22
-	ldrb	w1, [x1,19]
+	add	x0, x0, x27
+	ldrb	w1, [x1, 19]
 	sub	w1, w1, #7
-	uxtb	w1, w1
+	and	w1, w1, 255
 	cmp	w1, 1
-	bhi	.L1337
-	strb	w19, [x0,20]
-	b	.L1338
-.L1337:
-	strb	w19, [x0,12]
-.L1338:
+	bhi	.L1371
+	strb	w19, [x0, 20]
+.L1372:
 	add	x21, x21, :lo12:.LANCHOR0
-	ldrb	w0, [x21,2464]
+	ldrb	w0, [x21, 2464]
 	add	w0, w0, w0, lsl 1
 	cmp	w20, w0, lsr 2
-	bcc	.L1339
+	bcc	.L1363
 	cmn	w20, #1
 	mov	w0, 256
 	csel	w20, w20, w0, eq
-.L1339:
+.L1363:
 	mov	w0, w20
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 112
 	ret
+.L1370:
+	add	w19, w19, 1
+	ldrb	w1, [x4, 1273]
+	and	w19, w19, 255
+	mov	x2, x5
+	cmp	w23, w19
+	stp	x5, x4, [x29, 96]
+	csel	w19, w19, wzr, hi
+	mov	w0, w22
+	mov	w3, w19
+	bl	HynixSetRRPara
+	mov	x3, x25
+	mov	x2, x24
+	mov	w1, w26
+	mov	w0, w22
+	bl	FlashReadRawPage
+	cmn	w0, #1
+	ldp	x5, x4, [x29, 96]
+	beq	.L1367
+	ldrb	w1, [x4, 2464]
+	cmn	w20, #1
+	csel	w20, w20, w0, ne
+	add	w1, w1, w1, lsl 1
+	cmp	w0, w1, lsr 2
+	bcc	.L1374
+	mov	x25, 0
+	mov	x24, 0
+.L1367:
+	add	w28, w28, 1
+	b	.L1365
+.L1374:
+	mov	w20, w0
+	b	.L1369
+.L1371:
+	strb	w19, [x0, 12]
+	b	.L1372
 	.size	HynixReadRetrial, .-HynixReadRetrial
 	.align	2
 	.type	samsung_read_retrial, %function
 samsung_read_retrial:
-	stp	x29, x30, [sp, -128]!
+	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	uxtb	w22, w0
-	adrp	x21, .LANCHOR3
-	mov	w0, w22
-	stp	x23, x24, [sp,48]
-	stp	x19, x20, [sp,16]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	mov	w23, w1
+	stp	x23, x24, [sp, 48]
+	and	w23, w0, 255
+	stp	x21, x22, [sp, 32]
 	mov	x24, x2
-	mov	x27, x3
-	adrp	x25, .LANCHOR0
+	stp	x25, x26, [sp, 64]
+	mov	w0, w23
+	stp	x19, x20, [sp, 16]
+	mov	w26, w1
+	mov	x25, x3
+	stp	x27, x28, [sp, 80]
 	bl	NandcWaitFlashReady
-	add	x0, x25, :lo12:.LANCHOR0
-	sbfiz	x1, x22, 4, 32
-	add	x2, x0, 8
-	add	x3, x2, x1
-	ldrb	w0, [x0,2356]
-	ldr	x5, [x2,x1]
-	ldrb	w19, [x3,8]
-	cbnz	w0, .L1347
-	lsl	x19, x19, 8
+	adrp	x22, .LANCHOR0
+	add	x0, x22, :lo12:.LANCHOR0
+	sbfiz	x1, x23, 4, 32
+	add	x3, x0, x1
+	adrp	x21, .LANCHOR3
+	ldrb	w2, [x0, 2356]
+	ldr	x1, [x0, x1]
+	ldrb	w19, [x3, 8]
+	cbnz	w2, .L1382
 	add	x21, x21, :lo12:.LANCHOR3
+	add	x19, x1, x19, lsl 8
+	add	x21, x21, 16
+	mov	x27, x0
 	mov	x4, 0
 	mov	w20, -1
-	add	x28, x5, x19
 	mov	w6, 239
-	mov	w7, 141
-	add	x21, x21, 16
-.L1351:
-	str	w6, [x28,2056]
+	mov	w5, 141
+.L1386:
+	str	w6, [x19, 2056]
 	add	x0, x21, x4
-	str	w7, [x28,2052]
-	mov	w1, w23
+	str	w5, [x19, 2052]
+	add	w28, w4, 1
+	stp	w6, w5, [x29, 96]
+	mov	x3, x25
+	ldrsb	w0, [x0, 1]
 	mov	x2, x24
-	mov	x3, x27
-	ldrsb	w0, [x0,1]
-	add	w26, w4, 1
-	str	w0, [x28,2048]
-	mov	w0, w22
-	str	wzr, [x28,2048]
-	str	wzr, [x28,2048]
-	str	wzr, [x28,2048]
-	str	x5, [x29,96]
-	str	x6, [x29,104]
-	str	x7, [x29,112]
-	str	x4, [x29,120]
+	str	w0, [x19, 2048]
+	mov	w1, w26
+	str	wzr, [x19, 2048]
+	mov	w0, w23
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
+	str	x4, [x29, 104]
 	bl	FlashReadRawPage
 	cmn	w0, #1
-	ldr	x4, [x29,120]
-	ldr	x7, [x29,112]
-	ldr	x6, [x29,104]
-	ldr	x5, [x29,96]
-	beq	.L1348
-	add	x1, x25, :lo12:.LANCHOR0
+	ldp	w6, w5, [x29, 96]
+	ldr	x4, [x29, 104]
+	beq	.L1383
+	ldrb	w1, [x27, 2464]
 	cmn	w20, #1
 	csel	w20, w20, w0, ne
-	ldrb	w1, [x1,2464]
 	add	w1, w1, w1, lsl 1
 	cmp	w0, w1, lsr 2
-	bcc	.L1360
-	mov	x27, 0
-	mov	x24, x27
-.L1348:
+	bcc	.L1394
+	mov	x25, 0
+	mov	x24, 0
+.L1383:
 	add	x4, x4, 1
 	cmp	x4, 25
-	bne	.L1351
-	mov	w26, 26
-	b	.L1350
-.L1360:
-	mov	w20, w0
-.L1350:
-	add	x3, x5, x19
+	bne	.L1386
+	mov	w28, 26
+.L1385:
 	mov	w0, 239
-	str	w0, [x3,2056]
+	str	w0, [x19, 2056]
 	mov	w0, 141
-	b	.L1376
-.L1347:
-	add	x21, x21, :lo12:.LANCHOR3
-	lsl	x19, x19, 8
-	add	x21, x21, 48
-	mov	w20, -1
-	mov	w26, 1
-	add	x28, x5, x19
-	mov	w4, 239
-	mov	w6, 137
-.L1356:
-	str	w4, [x28,2056]
-	mov	w1, w23
-	str	w6, [x28,2052]
-	mov	x2, x24
-	mov	x3, x27
-	str	x5, [x29,104]
-	ldrb	w0, [x21,4]
-	str	w0, [x28,2048]
-	str	x4, [x29,112]
-	ldrb	w0, [x21,5]
-	str	w0, [x28,2048]
-	str	x6, [x29,120]
-	ldrb	w0, [x21,6]
-	str	w0, [x28,2048]
-	ldrb	w0, [x21,7]
-	str	w0, [x28,2048]
-	mov	w0, w22
-	bl	FlashReadRawPage
-	cmn	w0, #1
-	ldr	x6, [x29,120]
-	ldr	x4, [x29,112]
-	ldr	x5, [x29,104]
-	beq	.L1353
-	add	x1, x25, :lo12:.LANCHOR0
-	cmn	w20, #1
-	csel	w20, w20, w0, ne
-	ldrb	w1, [x1,2464]
-	add	w1, w1, w1, lsl 1
-	cmp	w0, w1, lsr 2
-	bcc	.L1361
-	mov	x27, 0
-	mov	x24, x27
-.L1353:
-	add	w26, w26, 1
-	add	x21, x21, 4
-	cmp	w26, 26
-	bne	.L1356
-	b	.L1355
-.L1361:
-	mov	w20, w0
-.L1355:
-	add	x3, x5, x19
-	mov	w0, 239
-	str	w0, [x3,2056]
-	mov	w0, 137
-.L1376:
-	str	w0, [x3,2052]
-	add	x25, x25, :lo12:.LANCHOR0
-	str	wzr, [x3,2048]
-	str	wzr, [x3,2048]
-	str	wzr, [x3,2048]
-	str	wzr, [x3,2048]
-	ldrb	w0, [x25,2464]
+.L1410:
+	str	w0, [x19, 2052]
+	add	x22, x22, :lo12:.LANCHOR0
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
+	ldrb	w0, [x22, 2464]
 	add	w0, w0, w0, lsl 1
 	cmp	w20, w0, lsr 2
-	bcc	.L1357
+	bcc	.L1392
 	cmn	w20, #1
 	mov	w0, 256
 	csel	w20, w20, w0, eq
-.L1357:
-	cmn	w20, #1
-	beq	.L1362
+.L1392:
 	cmp	w20, 256
-	bne	.L1358
-.L1362:
+	ccmn	w20, #1, 4, ne
+	bne	.L1393
 	adrp	x0, .LC94
-	mov	w1, w26
-	add	x0, x0, :lo12:.LC94
-	mov	w2, w23
-	mov	w3, w26
 	mov	w4, w20
+	mov	w3, w28
+	mov	w2, w26
+	mov	w1, w28
+	add	x0, x0, :lo12:.LC94
 	bl	printk
-.L1358:
-	mov	w0, w22
+.L1393:
+	mov	w0, w23
 	bl	NandcWaitFlashReady
 	mov	w0, w20
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 112
 	ret
-	.size	samsung_read_retrial, .-samsung_read_retrial
-	.align	2
-	.global	FlashProgPage
+.L1394:
+	mov	w20, w0
+	b	.L1385
+.L1382:
+	add	x21, x21, :lo12:.LANCHOR3
+	add	x19, x1, x19, lsl 8
+	add	x21, x21, 52
+	mov	x27, x0
+	mov	w20, -1
+	mov	w28, 1
+	mov	w5, 239
+	mov	w4, 137
+.L1391:
+	str	w5, [x19, 2056]
+	mov	x3, x25
+	str	w4, [x19, 2052]
+	mov	x2, x24
+	stp	w5, w4, [x29, 100]
+	mov	w1, w26
+	ldrb	w0, [x21]
+	str	w0, [x19, 2048]
+	ldrb	w0, [x21, 1]
+	str	w0, [x19, 2048]
+	ldrb	w0, [x21, 2]
+	str	w0, [x19, 2048]
+	ldrb	w0, [x21, 3]
+	str	w0, [x19, 2048]
+	mov	w0, w23
+	bl	FlashReadRawPage
+	cmn	w0, #1
+	ldp	w5, w4, [x29, 100]
+	beq	.L1388
+	ldrb	w1, [x27, 2464]
+	cmn	w20, #1
+	csel	w20, w20, w0, ne
+	add	w1, w1, w1, lsl 1
+	cmp	w0, w1, lsr 2
+	bcc	.L1395
+	mov	x25, 0
+	mov	x24, 0
+.L1388:
+	add	w28, w28, 1
+	add	x21, x21, 4
+	cmp	w28, 26
+	bne	.L1391
+.L1390:
+	mov	w0, 239
+	str	w0, [x19, 2056]
+	mov	w0, 137
+	b	.L1410
+.L1395:
+	mov	w20, w0
+	b	.L1390
+	.size	samsung_read_retrial, .-samsung_read_retrial
+	.align	2
+	.global	FlashProgPage
 	.type	FlashProgPage, %function
 FlashProgPage:
 	stp	x29, x30, [sp, -64]!
-	mov	x4, x3
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	uxtb	w19, w0
-	adrp	x0, .LANCHOR1+481
-	stp	x21, x22, [sp,32]
+	stp	x19, x20, [sp, 16]
 	mov	w20, w1
+	stp	x21, x22, [sp, 32]
+	adrp	x1, .LANCHOR1+481
+	str	x23, [sp, 48]
 	mov	x22, x2
-	ldrb	w21, [x0,#:lo12:.LANCHOR1+481]
-	cbnz	w19, .L1378
+	ldrb	w21, [x1, #:lo12:.LANCHOR1+481]
+	ands	w19, w0, 255
+	mov	x23, x3
+	bne	.L1412
 	adrp	x0, .LANCHOR0
 	add	x0, x0, :lo12:.LANCHOR0
-	ldrb	w1, [x0,73]
-	ldr	w2, [x0,76]
+	ldrb	w1, [x0, 73]
+	ldr	w2, [x0, 76]
 	mul	w1, w1, w2
-	cmp	w20, w1
-	bcs	.L1378
-	ldrb	w0, [x0,72]
-	cmp	w0, wzr
+	cmp	w1, w20
+	bls	.L1412
+	ldrb	w0, [x0, 72]
+	cmp	w0, 0
 	mov	w0, 4
 	csel	w21, w21, w0, eq
-.L1378:
+.L1412:
 	mov	w0, w19
-	str	x4, [x29,56]
 	bl	NandcWaitFlashReady
 	mov	w0, w19
 	bl	NandcFlashCs
-	mov	w0, w19
 	mov	w1, w20
+	mov	w0, w19
 	bl	FlashProgFirstCmd
-	ldr	x4, [x29,56]
-	mov	w2, w21
+	mov	x4, x23
 	mov	x3, x22
-	mov	w0, w19
+	mov	w2, w21
 	mov	w1, 1
+	mov	w0, w19
 	bl	NandcXferData
 	mov	w1, w20
 	mov	w0, w19
@@ -9261,12 +9193,13 @@ FlashProgPage:
 	mov	w1, w20
 	mov	w0, w19
 	bl	FlashReadStatus
-	mov	w20, w0
+	mov	w2, w0
 	mov	w0, w19
 	bl	NandcFlashDeCs
-	and	w0, w20, 1
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
+	and	w0, w2, 1
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldr	x23, [sp, 48]
 	ldp	x29, x30, [sp], 64
 	ret
 	.size	FlashProgPage, .-FlashProgPage
@@ -9274,167 +9207,156 @@ FlashProgPage:
 	.global	FlashSavePhyInfo
 	.type	FlashSavePhyInfo, %function
 FlashSavePhyInfo:
-	stp	x29, x30, [sp, -80]!
+	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	adrp	x23, .LANCHOR4
-	stp	x19, x20, [sp,16]
-	add	x19, x23, :lo12:.LANCHOR4
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	adrp	x21, .LANCHOR0
-	ldr	x0, [x19,1600]
-	add	x20, x21, :lo12:.LANCHOR0
-	str	x0, [x19,1624]
-	ldrb	w0, [x19,1642]
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR4
+	add	x20, x20, :lo12:.LANCHOR4
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	mov	w23, 20036
+	movk	w23, 0x4e41, lsl 16
+	adrp	x19, .LANCHOR0
+	ldr	x0, [x20, 1608]
+	add	x19, x19, :lo12:.LANCHOR0
+	str	x0, [x20, 1632]
+	mov	w22, 0
+	ldrb	w0, [x20, 1650]
+	mov	w21, 0
 	bl	FlashBchSel
-	ldr	x0, [x19,1600]
-	mov	w1, 0
+	ldr	x0, [x20, 1608]
 	mov	w2, 2048
+	mov	w1, 0
 	bl	ftl_memset
-	ldr	x1, [x19,1624]
-	mov	w0, 20036
-	movk	w0, 0x4e41, lsl 16
+	ldr	x0, [x20, 1632]
 	mov	w2, 32
-	str	w0, [x1]
-	ldr	x0, [x19,1624]
-	ldrb	w1, [x20,2358]
+	str	w23, [x0]
+	ldr	x0, [x20, 1632]
+	ldrb	w1, [x19, 2358]
 	add	x0, x0, 16
-	strh	w1, [x0,-4]
-	ldrb	w1, [x20,73]
-	strh	w1, [x0,-2]
-	ldrb	w1, [x20,2380]
-	str	w1, [x0,1060]
-	add	x1, x20, 2132
+	strh	w1, [x0, -4]
+	ldrb	w1, [x19, 73]
+	strh	w1, [x0, -2]
+	ldrb	w1, [x19, 2380]
+	str	w1, [x0, 1060]
+	add	x1, x19, 2132
 	bl	ftl_memcpy
-	ldr	x0, [x19,1624]
-	add	x1, x20, 2360
+	ldr	x0, [x20, 1632]
 	mov	w2, 8
+	add	x1, x19, 2360
 	add	x0, x0, 80
 	bl	ftl_memcpy
-	ldr	x0, [x19,1624]
-	add	x1, x20, 1232
+	ldr	x0, [x20, 1632]
 	mov	w2, 32
+	add	x1, x19, 1232
 	add	x0, x0, 96
 	bl	ftl_memcpy
-	ldr	x0, [x19,1624]
+	ldr	x0, [x20, 1632]
 	adrp	x1, .LANCHOR1
 	add	x1, x1, :lo12:.LANCHOR1
 	mov	w2, 32
 	add	x1, x1, 472
 	add	x0, x0, 160
 	bl	ftl_memcpy
-	ldr	x0, [x19,1624]
-	add	x1, x20, 96
+	ldr	x0, [x20, 1632]
 	mov	w2, 32
+	add	x1, x19, 96
 	add	x0, x0, 192
 	bl	ftl_memcpy
-	ldr	x0, [x19,1624]
-	add	x1, x20, 1272
+	ldr	x0, [x20, 1632]
 	mov	w2, 852
-	mov	x20, x23
+	add	x1, x19, 1272
 	add	x0, x0, 224
 	bl	ftl_memcpy
-	ldr	x22, [x19,1624]
+	ldr	x6, [x20, 1632]
 	mov	w1, 2036
-	add	x0, x22, 12
+	add	x0, x6, 12
 	bl	js_hash
-	str	w0, [x22,8]
+	str	w0, [x6, 8]
 	mov	w0, 1592
-	str	w0, [x22,4]
-	mov	w22, 0
-	ldr	x0, [x19,1648]
-	str	x0, [x19,1624]
+	str	w0, [x6, 4]
+	ldr	x0, [x20, 1656]
+	str	x0, [x20, 1632]
 	mov	w0, 0
-	mov	w19, w22
 	bl	flash_enter_slc_mode
-.L1386:
-	add	x24, x21, :lo12:.LANCHOR0
-	mov	w0, 0
+.L1421:
+	ldr	w1, [x19, 76]
 	mov	w2, 0
-	ldr	w1, [x24,76]
-	mul	w1, w19, w1
+	mov	w0, 0
+	mul	w1, w21, w1
 	bl	FlashEraseBlock
-	ldrb	w25, [x24,204]
-	cbz	w25, .L1381
-	mov	w23, 0
-.L1382:
-	add	x0, x21, :lo12:.LANCHOR0
-	add	x2, x20, :lo12:.LANCHOR4
+	ldrb	w0, [x19, 204]
+	cbz	w0, .L1416
+	mov	w24, 0
+.L1417:
+	ldr	w1, [x19, 76]
 	mov	x3, 0
-	ldr	w1, [x0,76]
+	ldr	x2, [x20, 1608]
 	mov	w0, 0
-	ldr	x2, [x2,1600]
-	madd	w1, w19, w1, w23
-	add	w23, w23, 1
-	bl	FlashProgPage
-	cmp	w23, 10
-	bne	.L1382
-	b	.L1383
-.L1381:
-	ldr	w1, [x24,76]
-	add	x23, x20, :lo12:.LANCHOR4
-	mov	x3, 0
-	mov	w0, w25
-	mul	w1, w19, w1
-	ldr	x2, [x23,1600]
+	madd	w1, w21, w1, w24
+	add	w24, w24, 1
 	bl	FlashProgPage
-	ldr	w1, [x24,76]
-	mov	w0, w25
-	ldr	x2, [x23,1600]
+	cmp	w24, 10
+	bne	.L1417
+.L1418:
+	ldr	w1, [x19, 76]
 	mov	x3, 0
-	mul	w1, w19, w1
-	add	w1, w1, 1
-	bl	FlashProgPage
-.L1383:
-	add	x26, x21, :lo12:.LANCHOR0
-	add	x23, x20, :lo12:.LANCHOR4
+	ldr	x2, [x20, 1656]
 	mov	w0, 0
-	mov	x3, 0
-	add	w25, w19, 1
-	ldr	w1, [x26,76]
-	ldr	x2, [x23,1648]
-	mul	w1, w19, w1
+	mul	w1, w21, w1
 	bl	FlashReadRawPage
 	cmn	w0, #1
-	beq	.L1384
-	ldr	x24, [x23,1624]
-	mov	w0, 20036
-	movk	w0, 0x4e41, lsl 16
-	ldr	w1, [x24]
-	cmp	w1, w0
-	bne	.L1384
+	add	w7, w21, 1
+	beq	.L1419
+	ldr	x6, [x20, 1632]
+	ldr	w0, [x6]
+	cmp	w0, w23
+	bne	.L1419
 	mov	w1, 2036
-	add	x0, x24, 12
+	add	x0, x6, 12
 	bl	js_hash
-	ldr	w1, [x24,8]
+	ldr	w1, [x6, 8]
 	cmp	w1, w0
-	bne	.L1384
-	ldr	w0, [x26,76]
+	bne	.L1419
+	ldr	w0, [x19, 76]
 	cmp	w22, 1
-	str	w25, [x23,1636]
-	mul	w19, w19, w0
-	str	w19, [x23,1632]
-	beq	.L1387
+	str	w7, [x20, 1644]
+	mul	w21, w0, w21
+	str	w21, [x20, 1640]
+	beq	.L1422
 	mov	w22, 1
-.L1384:
-	cmp	w25, 4
-	mov	w19, w25
-	bne	.L1386
-	b	.L1385
-.L1387:
-	mov	w22, 2
-.L1385:
+.L1419:
+	mov	w21, w7
+	cmp	w7, 4
+	bne	.L1421
+.L1420:
 	mov	w0, 0
 	bl	flash_exit_slc_mode
-	cmp	w22, wzr
+	cmp	w22, 0
 	csetm	w0, eq
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 80
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 64
 	ret
+.L1416:
+	ldr	w1, [x19, 76]
+	mov	x3, 0
+	ldr	x2, [x20, 1608]
+	mov	w0, 0
+	mul	w1, w21, w1
+	bl	FlashProgPage
+	ldr	w1, [x19, 76]
+	mov	x3, 0
+	ldr	x2, [x20, 1608]
+	mov	w0, 0
+	mul	w1, w21, w1
+	add	w1, w1, 1
+	bl	FlashProgPage
+	b	.L1418
+.L1422:
+	mov	w22, 2
+	b	.L1420
 	.size	FlashSavePhyInfo, .-FlashSavePhyInfo
 	.align	2
 	.global	FlashReadIdbDataRaw
@@ -9442,108 +9364,109 @@ FlashSavePhyInfo:
 FlashReadIdbDataRaw:
 	stp	x29, x30, [sp, -128]!
 	add	x29, sp, 0
-	stp	x25, x26, [sp,64]
-	mov	x26, x0
+	stp	x25, x26, [sp, 64]
+	mov	x25, x0
 	mov	w0, 60
-	strb	w0, [x29,120]
+	stp	x19, x20, [sp, 16]
+	strb	w0, [x29, 120]
 	mov	w0, 40
-	strb	w0, [x29,121]
+	strb	w0, [x29, 121]
 	mov	w0, 24
-	stp	x19, x20, [sp,16]
-	strb	w0, [x29,122]
-	adrp	x19, .LANCHOR0
+	strb	w0, [x29, 122]
 	mov	w0, 16
-	strb	w0, [x29,123]
-	add	x0, x19, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x27, x28, [sp,80]
-	ldrb	w27, [x0,2464]
-	ldr	w0, [x0,2376]
-	cbz	w0, .L1394
+	adrp	x20, .LANCHOR0
+	strb	w0, [x29, 123]
+	add	x0, x20, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x27, x28, [sp, 80]
+	ldrb	w26, [x0, 2464]
+	ldr	w0, [x0, 2376]
+	cbz	w0, .L1430
 	mov	w0, 0
 	bl	flash_enter_slc_mode
-.L1394:
-	mov	x0, x26
-	mov	w1, 0
-	mov	w2, 2048
-	adrp	x24, .LC95
+.L1430:
+	adrp	x19, .LANCHOR4
+	mov	w28, 35899
+	add	x24, x20, :lo12:.LANCHOR0
+	add	x27, x29, 120
+	add	x19, x19, :lo12:.LANCHOR4
 	mov	w23, -1
-	mov	w20, 2
+	mov	w21, 2
+	movk	w28, 0xfcdc, lsl 16
+	mov	w2, 2048
+	mov	w1, 0
+	mov	x0, x25
 	bl	ftl_memset
-	adrp	x28, .LANCHOR4
-	add	x0, x24, :lo12:.LC95
-	str	x0, [x29,104]
-.L1395:
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x0,73]
-	cmp	w20, w0
-	bcs	.L1399
-	mov	x22, 0
-.L1397:
-	add	x0, x29, 120
-	add	x24, x19, :lo12:.LANCHOR0
-	add	x21, x28, :lo12:.LANCHOR4
-	ldrb	w25, [x22,x0]
-	mov	w0, w25
+.L1431:
+	ldrb	w0, [x24, 73]
+	cmp	w21, w0
+	bcc	.L1436
+.L1435:
+	add	x20, x20, :lo12:.LANCHOR0
+	mov	w0, w26
 	bl	FlashBchSel
-	ldr	w1, [x24,76]
+	ldr	w0, [x20, 2376]
+	cbz	w0, .L1429
 	mov	w0, 0
-	ldr	x2, [x21,1600]
+	bl	flash_exit_slc_mode
+.L1429:
+	mov	w0, w23
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 128
+	ret
+.L1436:
+	mov	x22, 0
+.L1433:
+	ldrb	w4, [x22, x27]
+	str	w4, [x29, 108]
+	mov	w0, w4
+	bl	FlashBchSel
+	ldr	w1, [x24, 76]
 	mov	x3, 0
-	mul	w1, w20, w1
+	ldr	x2, [x19, 1608]
+	mov	w0, 0
+	mul	w1, w21, w1
 	bl	FlashReadRawPage
 	cmn	w0, #1
-	bne	.L1396
+	ldr	w4, [x29, 108]
+	bne	.L1432
 	add	x22, x22, 1
 	cmp	x22, 4
-	bne	.L1397
-	b	.L1398
-.L1396:
-	ldr	x0, [x21,1600]
-	ldr	w1, [x0]
-	mov	w0, 35899
-	movk	w0, 0xfcdc, lsl 16
-	cmp	w1, w0
-	bne	.L1398
-	ldr	x0, [x29,104]
-	mov	w1, w25
+	bne	.L1433
+.L1434:
+	add	w21, w21, 1
+	b	.L1431
+.L1439:
+	mov	w23, 0
+	b	.L1435
+.L1432:
+	ldr	x0, [x19, 1608]
+	ldr	w0, [x0]
+	cmp	w0, w28
+	bne	.L1434
+	mov	w1, w4
+	adrp	x0, .LC95
+	add	x0, x0, :lo12:.LC95
 	bl	printk
-	ldr	x1, [x21,1600]
-	mov	x0, x26
+	ldr	x1, [x19, 1608]
 	mov	w2, 2048
+	mov	x0, x25
 	bl	ftl_memcpy
-	ldr	x0, [x21,1600]
-	ldr	w0, [x0,512]
-	strb	w0, [x24,73]
-	ldr	w0, [x21,1636]
-	cmp	w0, w20
-	bls	.L1402
+	ldr	x0, [x19, 1608]
+	ldr	w0, [x0, 512]
+	strb	w0, [x24, 73]
+	ldr	w0, [x19, 1644]
+	cmp	w21, w0
+	bcs	.L1439
 	mov	w23, 0
-	str	w20, [x21,1636]
+	str	w21, [x19, 1644]
 	bl	FlashSavePhyInfo
-.L1398:
-	add	w20, w20, 1
-	b	.L1395
-.L1402:
-	mov	w23, 0
-.L1399:
-	mov	w0, w27
-	add	x19, x19, :lo12:.LANCHOR0
-	bl	FlashBchSel
-	ldr	w0, [x19,2376]
-	cbz	w0, .L1406
-	mov	w0, 0
-	bl	flash_exit_slc_mode
-.L1406:
-	mov	w0, w23
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
-	ret
+	b	.L1434
 	.size	FlashReadIdbDataRaw, .-FlashReadIdbDataRaw
 	.align	2
 	.global	FlashInit
@@ -9551,1705 +9474,1640 @@ FlashReadIdbDataRaw:
 FlashInit:
 	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	adrp	x21, .LANCHOR4
-	add	x22, x21, :lo12:.LANCHOR4
-	stp	x23, x24, [sp,48]
-	mov	x23, x0
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR0
+	stp	x23, x24, [sp, 48]
+	adrp	x23, .LANCHOR4
+	add	x20, x23, :lo12:.LANCHOR4
+	stp	x21, x22, [sp, 32]
+	stp	x27, x28, [sp, 80]
+	mov	x21, x0
+	stp	x25, x26, [sp, 64]
 	mov	w0, 32768
-	stp	x19, x20, [sp,16]
-	stp	x27, x28, [sp,80]
-	stp	x25, x26, [sp,64]
 	bl	ftl_malloc
-	str	x0, [x22,1600]
+	str	x0, [x20, 1608]
 	mov	w0, 32768
-	adrp	x19, .LANCHOR0
-	add	x20, x19, :lo12:.LANCHOR0
-	adrp	x24, .LC96
 	bl	ftl_malloc
-	str	x0, [x22,1648]
+	str	x0, [x20, 1656]
 	mov	w0, 4096
-	mov	w27, 144
-	mov	w28, 239
-	bl	ftl_malloc
-	str	x0, [x22,1656]
+	bl	ftl_dma32_malloc
+	add	x22, x19, :lo12:.LANCHOR0
+	str	x0, [x20, 1664]
 	mov	w0, 32768
 	bl	ftl_malloc
-	str	x0, [x22,1664]
+	str	x0, [x20, 1672]
 	mov	w0, 4096
-	bl	ftl_malloc
-	str	x0, [x22,1672]
+	bl	ftl_dma32_malloc
+	str	x0, [x20, 1680]
+	mov	w0, 50
+	strb	w0, [x20, 1648]
+	adrp	x25, .LC96
+	strb	w0, [x22, 73]
 	mov	w0, 128
-	str	w0, [x20,76]
+	strb	wzr, [x20, 1688]
+	add	x25, x25, :lo12:.LC96
+	str	wzr, [x20, 1616]
+	mov	w24, 0
+	str	wzr, [x20, 1644]
+	mov	w28, 144
+	str	w0, [x22, 76]
 	mov	w0, 60
-	mov	w1, 50
-	strb	w0, [x22,1642]
-	mov	x0, x23
-	strb	wzr, [x20,2380]
-	add	x23, x20, 8
-	strb	w1, [x20,73]
-	strb	w1, [x22,1640]
-	str	wzr, [x22,1636]
-	str	wzr, [x22,1608]
-	strb	wzr, [x20,72]
-	add	x20, x20, 2132
-	strb	wzr, [x22,1680]
+	strb	w0, [x20, 1650]
+	add	x20, x22, 2132
+	mov	x27, x20
+	strb	wzr, [x22, 2380]
+	strb	wzr, [x22, 72]
+	mov	x0, x21
 	bl	NandcInit
-	add	x0, x24, :lo12:.LC96
-	mov	w22, 0
-	str	x0, [x29,104]
-	mov	x26, x20
-.L1418:
-	ldrb	w2, [x23,8]
-	uxtb	w25, w22
-	mov	w0, w25
-	str	x2, [x29,96]
-	ldr	x24, [x23]
+.L1454:
+	ldrb	w1, [x22, 8]
+	and	w26, w24, 255
+	str	w1, [x29, 108]
+	mov	w0, w26
+	ldr	x21, [x22]
 	bl	FlashReset
-	mov	w0, w25
+	mov	w0, w26
 	bl	NandcFlashCs
-	ldr	x2, [x29,96]
+	ldr	w1, [x29, 108]
 	mov	x0, 1000
-	ubfiz	x2, x2, 8, 8
-	add	x24, x24, x2
-	str	w27, [x24,2056]
-	str	wzr, [x24,2052]
+	ubfiz	x1, x1, 8, 8
+	add	x21, x21, x1
+	str	w28, [x21, 2056]
+	str	wzr, [x21, 2052]
 	bl	__const_udelay
-	ldr	w0, [x24,2048]
-	uxtb	w0, w0
+	ldr	w0, [x21, 2048]
+	and	w0, w0, 255
 	strb	w0, [x20]
 	cmp	w0, 44
-	ldr	w2, [x24,2048]
-	strb	w2, [x20,1]
-	ldr	w2, [x24,2048]
-	strb	w2, [x20,2]
-	ldr	w2, [x24,2048]
-	strb	w2, [x20,3]
-	ldr	w2, [x24,2048]
-	strb	w2, [x20,4]
-	ldr	w2, [x24,2048]
-	strb	w2, [x20,5]
-	bne	.L1413
-	str	w28, [x24,2056]
+	ldr	w1, [x21, 2048]
+	strb	w1, [x20, 1]
+	ldr	w1, [x21, 2048]
+	strb	w1, [x20, 2]
+	ldr	w1, [x21, 2048]
+	strb	w1, [x20, 3]
+	ldr	w1, [x21, 2048]
+	strb	w1, [x20, 4]
+	ldr	w1, [x21, 2048]
+	strb	w1, [x20, 5]
+	bne	.L1449
+	mov	w0, 239
+	str	w0, [x21, 2056]
 	mov	w0, 1
-	str	w0, [x24,2052]
+	str	w0, [x21, 2052]
 	mov	x0, 1000
 	bl	__const_udelay
 	mov	w0, 4
-	str	w0, [x24,2048]
-	str	wzr, [x24,2048]
-	str	wzr, [x24,2048]
-	str	wzr, [x24,2048]
-.L1413:
-	mov	w0, w25
+	str	w0, [x21, 2048]
+	str	wzr, [x21, 2048]
+	str	wzr, [x21, 2048]
+	str	wzr, [x21, 2048]
+.L1449:
+	mov	w0, w26
 	bl	NandcFlashDeCs
 	ldrb	w2, [x20]
 	sub	w0, w2, #1
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 253
-	bhi	.L1414
-	ldr	x0, [x29,104]
-	add	w1, w22, 1
-	ldrb	w3, [x20,1]
-	ldrb	w4, [x20,2]
-	ldrb	w5, [x20,3]
-	ldrb	w6, [x20,4]
-	ldrb	w7, [x20,5]
+	bhi	.L1450
+	ldrb	w7, [x20, 5]
+	add	w1, w24, 1
+	ldrb	w6, [x20, 4]
+	mov	x0, x25
+	ldrb	w5, [x20, 3]
+	ldrb	w4, [x20, 2]
+	ldrb	w3, [x20, 1]
 	bl	printk
-.L1414:
-	cbnz	w22, .L1415
-	ldrb	w0, [x26]
+.L1450:
+	cbnz	w24, .L1451
+	ldrb	w0, [x27]
 	sub	w0, w0, #1
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 253
-	bhi	.L1470
-	ldrb	w0, [x26,1]
+	bhi	.L1502
+	ldrb	w0, [x27, 1]
 	cmp	w0, 255
-	beq	.L1470
-.L1415:
+	beq	.L1502
+.L1451:
 	ldrb	w0, [x20]
 	cmp	w0, 181
-	bne	.L1417
+	bne	.L1453
 	mov	w0, 44
 	strb	w0, [x20]
-.L1417:
-	add	w22, w22, 1
-	add	x23, x23, 16
-	cmp	w22, 4
+.L1453:
+	add	w24, w24, 1
+	add	x22, x22, 16
 	add	x20, x20, 8
-	bne	.L1418
+	cmp	w24, 4
+	bne	.L1454
 	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w1, [x0,2132]
+	ldrb	w1, [x0, 2132]
 	cmp	w1, 173
-	beq	.L1419
-	ldr	w0, [x0,2384]
+	beq	.L1455
+	ldr	w0, [x0, 2384]
 	bl	NandcSetDdrMode
-.L1419:
+.L1455:
 	add	x20, x19, :lo12:.LANCHOR0
-	mov	w1, 0
 	mov	w2, 852
+	mov	w1, 0
 	add	x0, x20, 1272
 	bl	ftl_memset
-	strb	wzr, [x20,80]
-	adrp	x1, .LANCHOR1
-	ldr	w4, [x20,2392]
+	adrp	x0, .LANCHOR1
+	add	x1, x0, :lo12:.LANCHOR1
+	add	x1, x1, 472
+	ldr	w4, [x20, 2392]
+	strb	wzr, [x20, 80]
 	mov	w2, 12336
-	add	x0, x1, :lo12:.LANCHOR1
+	str	x1, [x20, 88]
 	movk	w2, 0x5638, lsl 16
-	add	x0, x0, 472
 	cmp	w4, w2
-	str	x0, [x20,88]
-	bne	.L1420
-	ldrb	w0, [x0,19]
-	cmp	w0, 50
-	beq	.L1420
-	mov	w0, 1
-	str	w0, [x20,2376]
-.L1420:
-	add	x3, x19, :lo12:.LANCHOR0
-	add	x3, x3, 2132
-	ldrb	w0, [x3,1]
-	cmp	w0, 218
-	cset	w6, eq
-	cmp	w0, 241
-	cset	w5, eq
-	cmp	w0, 161
-	cset	w2, eq
-	orr	w2, w5, w2
-	orr	w2, w6, w2
-	cbnz	w2, .L1421
-	and	w2, w0, -3
-	cmp	w2, 209
-	beq	.L1421
-	cmp	w0, 220
-	bne	.L1422
-	ldrb	w2, [x3,3]
-	cmp	w2, 149
-	bne	.L1422
-.L1421:
-	add	x2, x19, :lo12:.LANCHOR0
-	add	x3, x21, :lo12:.LANCHOR4
-	mov	w7, 16
+	bne	.L1456
+	ldrb	w1, [x1, 19]
+	cmp	w1, 50
+	beq	.L1456
+	mov	w1, 1
+	str	w1, [x20, 2376]
+.L1456:
+	add	x1, x19, :lo12:.LANCHOR0
+	ldrb	w2, [x1, 2133]
+	add	w1, w2, 95
+	and	w3, w1, 255
+	mov	x1, 1
+	cmp	w3, 57
+	bhi	.L1457
+	movk	x1, 0x205, lsl 48
+	lsr	x1, x1, x3
+	mvn	x1, x1
+.L1457:
+	and	w1, w1, 1
+	cmp	w2, 241
+	eor	w1, w1, 1
+	cset	w3, eq
+	orr	w1, w3, w1
+	cbnz	w1, .L1458
+	cmp	w2, 220
+	bne	.L1459
+	add	x1, x19, :lo12:.LANCHOR0
+	ldrb	w1, [x1, 2135]
+	cmp	w1, 149
+	bne	.L1459
+.L1458:
+	add	x1, x19, :lo12:.LANCHOR0
+	add	x3, x23, :lo12:.LANCHOR4
+	mov	w6, 16
 	mov	w5, 1
-	add	x8, x2, 2132
-	strb	w7, [x2,73]
-	strb	w5, [x2,72]
-	strb	w7, [x3,1642]
-	ldrb	w7, [x2,2132]
-	add	x2, x1, :lo12:.LANCHOR1
-	cmp	w7, 152
-	strb	w7, [x2,3425]
-	strb	w0, [x2,3426]
-	bne	.L1424
-	ldrsb	w2, [x8,4]
-	tbnz	w2, #31, .L1425
-	mov	w2, 24
-	strb	w2, [x3,1642]
-.L1424:
+	add	x7, x1, 2132
+	strb	w6, [x1, 73]
+	strb	w5, [x1, 72]
+	strb	w6, [x3, 1650]
+	ldrb	w6, [x1, 2132]
+	add	x1, x0, :lo12:.LANCHOR1
+	cmp	w6, 152
+	strb	w6, [x1, 3425]
+	strb	w2, [x1, 3426]
+	bne	.L1461
+	ldrsb	w1, [x7, 4]
+	tbnz	w1, #31, .L1462
+	mov	w1, 24
+	strb	w1, [x3, 1650]
+.L1461:
 	cmp	w4, 2049
-	beq	.L1473
-	mov	w2, 12336
-	movk	w2, 0x5638, lsl 16
-	cmp	w4, w2
-	bne	.L1427
-.L1473:
-	add	x2, x21, :lo12:.LANCHOR4
+	mov	w1, 12336
+	movk	w1, 0x5638, lsl 16
+	ccmp	w4, w1, 4, ne
+	bne	.L1464
+	add	x1, x23, :lo12:.LANCHOR4
 	mov	w3, 16
-	strb	w3, [x2,1642]
-.L1427:
-	cbz	w6, .L1429
-	add	x0, x1, :lo12:.LANCHOR1
+	strb	w3, [x1, 1650]
+.L1464:
+	cmp	w2, 218
+	bne	.L1465
+	add	x1, x0, :lo12:.LANCHOR1
 	mov	w2, 2048
-	strh	w2, [x0,3438]
+	strh	w2, [x1, 3438]
 	mov	w2, -38
-	b	.L1517
-.L1429:
-	cmp	w0, 220
-	bne	.L1431
-	add	x0, x1, :lo12:.LANCHOR1
-	mov	w2, 4096
-	strh	w2, [x0,3438]
-	mov	w2, -36
-.L1517:
-	strb	w2, [x0,3426]
-	b	.L1430
-.L1431:
-	cmp	w0, 211
-	bne	.L1430
-	add	x0, x1, :lo12:.LANCHOR1
-	mov	w2, 4096
-	strh	w2, [x0,3438]
-	mov	w2, 2
-	strb	w2, [x0,3437]
-.L1430:
-	add	x20, x1, :lo12:.LANCHOR1
+.L1548:
+	strb	w2, [x1, 3426]
+.L1466:
+	add	x20, x0, :lo12:.LANCHOR1
 	add	x0, x19, :lo12:.LANCHOR0
-	add	x1, x20, 3296
 	mov	w2, 32
+	add	x1, x20, 3296
 	add	x0, x0, 96
 	bl	ftl_memcpy
-	add	x0, x20, 472
-	add	x1, x20, 3424
 	mov	w2, 32
+	add	x1, x20, 3424
+	add	x0, x20, 472
 	bl	ftl_memcpy
-.L1422:
+.L1459:
 	add	x20, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x20,72]
-	cbnz	w0, .L1432
+	ldrb	w0, [x20, 72]
+	cbnz	w0, .L1469
 	bl	FlashLoadPhyInfoInRam
-	cbnz	w0, .L1434
-	ldr	x0, [x20,88]
-	ldrb	w1, [x0,17]
+	cbnz	w0, .L1471
+	ldr	x0, [x20, 88]
+	ldrb	w1, [x0, 17]
 	and	w0, w1, 7
-	strb	w0, [x20,2357]
-	tbnz	x1, 0, .L1434
+	strb	w0, [x20, 2357]
+	tbnz	x1, 0, .L1471
 	mov	w1, 1
-	strb	w1, [x20,2380]
+	strb	w1, [x20, 2380]
 	bl	FlashSetInterfaceMode
-	ldrb	w0, [x20,2357]
+	ldrb	w0, [x20, 2357]
 	bl	NandcSetMode
-.L1434:
+.L1471:
 	add	x20, x19, :lo12:.LANCHOR0
-	ldr	x0, [x20,88]
-	ldrb	w0, [x0,26]
-	strb	w0, [x20,204]
+	ldr	x0, [x20, 88]
+	ldrb	w0, [x0, 26]
+	strb	w0, [x20, 204]
 	bl	FlashLoadPhyInfo
-	cbz	w0, .L1432
-	ldr	w0, [x20,2384]
-	cbz	w0, .L1437
+	cbz	w0, .L1469
+	ldr	w0, [x20, 2384]
+	cbz	w0, .L1474
 	mov	w0, 1
 	bl	FlashSetInterfaceMode
 	mov	w0, 1
-	b	.L1514
-.L1437:
-	ldrb	w0, [x20,2357]
-	bl	FlashSetInterfaceMode
-	ldrb	w0, [x20,2357]
-.L1514:
+.L1543:
 	bl	NandcSetMode
 	bl	FlashLoadPhyInfo
-	cbz	w0, .L1432
-	mov	w0, 1
+	cbz	w0, .L1469
 	add	x20, x19, :lo12:.LANCHOR0
+	mov	w0, 1
 	bl	FlashSetInterfaceMode
 	mov	w0, 1
 	bl	NandcSetMode
-	ldr	x1, [x20,88]
+	ldr	x0, [x20, 88]
+	ldrh	w1, [x0, 14]
 	adrp	x0, .LC97
 	add	x0, x0, :lo12:.LC97
-	ldrh	w1, [x1,14]
 	bl	printk
 	bl	FlashLoadPhyInfoInRam
 	cmn	w0, #1
-	beq	.L1488
+	beq	.L1448
 	bl	FlashDieInfoInit
-	ldr	x0, [x20,88]
-	ldrb	w0, [x0,19]
+	ldr	x0, [x20, 88]
+	ldrb	w0, [x0, 19]
 	bl	FlashGetReadRetryDefault
-	adrp	x1, .LANCHOR2+3558
-	ldr	x0, [x20,88]
-	ldrh	w1, [x1,#:lo12:.LANCHOR2+3558]
-	ldrb	w2, [x0,9]
+	ldr	x0, [x20, 88]
+	adrp	x1, .LANCHOR2+3550
+	ldrh	w1, [x1, #:lo12:.LANCHOR2+3550]
+	ldrb	w2, [x0, 9]
 	add	w1, w1, 4095
 	cmp	w2, w1, lsr 12
-	blt	.L1439
-	ldrh	w1, [x0,14]
+	blt	.L1476
+	ldrh	w1, [x0, 14]
 	add	w1, w1, 255
 	cmp	w2, w1, lsr 8
-	bge	.L1440
-.L1439:
-	ldrh	w1, [x0,14]
+	bge	.L1477
+.L1476:
+	ldrh	w1, [x0, 14]
 	and	w1, w1, -256
-	strh	w1, [x0,14]
-.L1440:
+	strh	w1, [x0, 14]
+.L1477:
 	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x0,2357]
+	ldrb	w0, [x0, 2357]
 	tst	w0, 6
-	beq	.L1441
+	beq	.L1478
 	bl	FlashSavePhyInfo
 	mov	w0, 0
 	bl	flash_enter_slc_mode
-	add	x1, x21, :lo12:.LANCHOR4
+	add	x0, x23, :lo12:.LANCHOR4
+	ldr	w1, [x0, 1640]
 	mov	w0, 0
-	ldr	w1, [x1,1632]
 	bl	FlashDdrParaScan
 	mov	w0, 0
 	bl	flash_exit_slc_mode
-.L1441:
+.L1478:
 	bl	FlashSavePhyInfo
-.L1432:
-	add	x20, x19, :lo12:.LANCHOR0
-	add	x22, x21, :lo12:.LANCHOR4
-	ldr	x2, [x20,88]
-	str	xzr, [x22,1616]
-	ldrb	w0, [x2,26]
-	strb	w0, [x20,204]
-	ldrh	w0, [x2,16]
-	ldrh	w3, [x2,10]
+.L1469:
+	add	x21, x19, :lo12:.LANCHOR0
+	add	x20, x23, :lo12:.LANCHOR4
+	ldr	x2, [x21, 88]
+	str	xzr, [x20, 1624]
+	ldrb	w0, [x2, 26]
+	strb	w0, [x21, 204]
+	ldrh	w0, [x2, 16]
 	ubfx	x1, x0, 7, 1
-	strb	w1, [x20,80]
+	strb	w1, [x21, 80]
 	ubfx	x1, x0, 3, 1
-	strb	w1, [x22,1681]
+	strb	w1, [x20, 1689]
 	ubfx	x1, x0, 4, 1
-	strb	w1, [x20,2368]
-	ldrb	w1, [x2,12]
 	ubfx	x0, x0, 8, 3
-	strb	w0, [x20,2357]
-	ldrb	w0, [x2,18]
-	sdiv	w1, w3, w1
+	strb	w1, [x21, 2368]
+	strb	w0, [x21, 2357]
+	ldrh	w1, [x2, 10]
+	ldrb	w0, [x2, 12]
+	sdiv	w1, w1, w0
+	ldrb	w0, [x2, 18]
 	bl	BuildFlashLsbPageTable
 	bl	FlashDieInfoInit
-	ldr	x0, [x20,88]
-	ldrh	w1, [x0,16]
-	tbz	x1, 6, .L1443
-	ldrb	w0, [x0,19]
-	ldrb	w1, [x20,1274]
-	strb	w1, [x22,1641]
+	ldr	x0, [x21, 88]
+	ldrh	w1, [x0, 16]
+	tbz	x1, 6, .L1480
+	ldrb	w0, [x0, 19]
+	ldrb	w1, [x21, 1274]
+	ldrb	w2, [x21, 1273]
+	strb	w1, [x20, 1649]
 	sub	w1, w0, #1
-	ldrb	w2, [x20,1273]
-	uxtb	w1, w1
-	strb	w0, [x20,128]
-	strb	w2, [x20,129]
+	strb	w0, [x21, 128]
+	and	w1, w1, 255
+	strb	w2, [x21, 129]
 	cmp	w1, 7
-	bhi	.L1444
+	bhi	.L1481
 	adrp	x1, HynixReadRetrial
-	cmp	w0, 8
 	add	x1, x1, :lo12:HynixReadRetrial
-	str	x1, [x22,1616]
+	str	x1, [x20, 1624]
 	sub	w1, w0, #5
-	cset	w2, eq
-	uxtb	w1, w1
+	and	w1, w1, 255
 	cmp	w1, 1
-	bls	.L1474
-	cbz	w2, .L1445
-.L1474:
+	ccmp	w0, 8, 4, hi
+	bne	.L1482
+	mov	w1, 1
+	str	w1, [x21, 2456]
+.L1482:
 	add	x1, x19, :lo12:.LANCHOR0
-	mov	w3, 1
-	str	w3, [x1,2456]
-.L1445:
 	cmp	w0, 7
-	add	x1, x19, :lo12:.LANCHOR0
-	beq	.L1472
-	cbnz	w2, .L1472
-	add	x1, x1, 1292
-	b	.L1448
-.L1472:
+	beq	.L1544
+	cmp	w0, 8
+	bne	.L1505
+.L1544:
 	add	x1, x1, 1300
-.L1448:
+.L1483:
 	mov	x2, 0
-	mov	w3, w2
-.L1450:
-	ldrsb	w4, [x1,x2]
+	mov	w3, 0
+.L1485:
+	ldrsb	w4, [x1, x2]
 	add	x2, x2, 1
-	cmp	w4, wzr
-	csinc	w3, w3, w3, ne
+	cmp	w4, 0
+	cinc	w3, w3, eq
 	cmp	x2, 32
-	bne	.L1450
+	bne	.L1485
 	cmp	w3, 27
-	bls	.L1443
+	bls	.L1480
 	bl	FlashGetReadRetryDefault
 	bl	FlashSavePhyInfo
-	b	.L1443
-.L1444:
-	sub	w1, w0, #17
-	uxtb	w1, w1
-	cmp	w1, 2
-	bhi	.L1452
-	adrp	x1, MicronReadRetrial
-	cmp	w0, 19
-	add	x1, x1, :lo12:MicronReadRetrial
-	str	x1, [x22,1616]
-	beq	.L1453
-	mov	w0, 7
-	b	.L1515
-.L1453:
-	mov	w0, 15
-.L1515:
-	strb	w0, [x22,1641]
-	b	.L1443
-.L1452:
-	sub	w1, w0, #65
-	uxtb	w1, w1
-	cmp	w1, 1
-	bls	.L1475
-	cmp	w0, 33
-	bne	.L1454
-.L1475:
-	add	x0, x21, :lo12:.LANCHOR4
-	adrp	x1, ToshibaReadRetrial
-	add	x1, x1, :lo12:ToshibaReadRetrial
-	mov	w2, 4
-	str	x1, [x0,1616]
-	add	x1, x19, :lo12:.LANCHOR0
-	strb	w2, [x1,129]
-	mov	w1, 7
-	strb	w1, [x0,1641]
-	b	.L1443
-.L1454:
-	sub	w1, w0, #67
-	sub	w2, w0, #34
-	uxtb	w1, w1
-	uxtb	w2, w2
-	cmp	w1, 1
-	cset	w1, ls
-	cmp	w2, 1
-	bls	.L1476
-	cbz	w1, .L1456
-.L1476:
-	add	x3, x21, :lo12:.LANCHOR4
-	adrp	x2, ToshibaReadRetrial
-	add	x2, x2, :lo12:ToshibaReadRetrial
-	cmp	w0, 35
-	str	x2, [x3,1616]
-	beq	.L1458
-	cmp	w0, 68
-	beq	.L1458
-	mov	w0, 7
-	strb	w0, [x3,1641]
-	b	.L1459
-.L1458:
-	add	x0, x21, :lo12:.LANCHOR4
-	mov	w2, 17
-	strb	w2, [x0,1641]
-.L1459:
-	add	x0, x19, :lo12:.LANCHOR0
-	cbz	w1, .L1460
-	mov	w1, 4
-	b	.L1516
-.L1460:
-	mov	w1, 5
-.L1516:
-	strb	w1, [x0,129]
-	b	.L1443
-.L1456:
-	cmp	w0, 49
-	bne	.L1461
-	adrp	x0, SamsungReadRetrial
-	add	x0, x0, :lo12:SamsungReadRetrial
-	str	x0, [x22,1616]
-	b	.L1443
-.L1461:
-	cmp	w0, 50
-	bne	.L1443
-	adrp	x0, samsung_read_retrial
-	str	w1, [x20,2376]
-	add	x0, x0, :lo12:samsung_read_retrial
-	str	x0, [x22,1616]
-.L1443:
+.L1480:
 	add	x0, x19, :lo12:.LANCHOR0
-	mov	w1, 12336
-	movk	w1, 0x5638, lsl 16
-	ldr	w2, [x0,2392]
-	cmp	w2, w1
-	bne	.L1462
-	ldrb	w1, [x0,204]
-	cbz	w1, .L1462
-	ldr	x0, [x0,88]
-	strb	wzr, [x0,18]
-.L1462:
+	mov	w2, 12336
+	movk	w2, 0x5638, lsl 16
+	ldr	w1, [x0, 2392]
+	cmp	w1, w2
+	bne	.L1495
+	ldrb	w2, [x0, 204]
+	cbz	w2, .L1495
+	ldr	x0, [x0, 88]
+	strb	wzr, [x0, 18]
+.L1495:
 	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w1, [x0,2132]
-	cmp	w1, 44
-	bne	.L1463
-	ldrb	w1, [x0,2380]
-	cbz	w1, .L1463
-	mov	w1, 12336
-	movk	w1, 0x5638, lsl 16
-	cmp	w2, w1
-	bne	.L1464
-	ldrb	w0, [x0,204]
-	cbnz	w0, .L1463
-.L1464:
+	ldrb	w2, [x0, 2132]
+	cmp	w2, 44
+	bne	.L1496
+	ldrb	w2, [x0, 2380]
+	cbz	w2, .L1496
+	mov	w2, 12336
+	movk	w2, 0x5638, lsl 16
+	cmp	w1, w2
+	bne	.L1497
+	ldrb	w0, [x0, 204]
+	cbnz	w0, .L1496
+.L1497:
 	add	x0, x19, :lo12:.LANCHOR0
-	strb	wzr, [x0,2380]
+	strb	wzr, [x0, 2380]
 	mov	w0, 1
 	bl	FlashSetInterfaceMode
 	mov	w0, 1
 	bl	NandcSetMode
-.L1463:
+.L1496:
 	add	x1, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x1,2357]
+	ldrb	w0, [x1, 2357]
 	tst	w0, 6
-	beq	.L1465
-	ldrb	w1, [x1,2380]
-	cbnz	w1, .L1466
-	tbnz	x0, 0, .L1465
-.L1466:
+	beq	.L1498
+	ldrb	w1, [x1, 2380]
+	cbnz	w1, .L1499
+	tbnz	x0, 0, .L1498
+.L1499:
+	add	x23, x23, :lo12:.LANCHOR4
 	mov	w0, 0
-	add	x21, x21, :lo12:.LANCHOR4
 	bl	flash_enter_slc_mode
-	ldr	w1, [x21,1632]
 	mov	w0, 0
+	ldr	w1, [x23, 1640]
 	bl	FlashDdrParaScan
 	mov	w0, 0
 	bl	flash_exit_slc_mode
-.L1465:
+.L1498:
 	add	x19, x19, :lo12:.LANCHOR0
 	mov	w20, 16
-	ldr	x0, [x19,88]
-	ldrb	w0, [x0,20]
+	ldr	x0, [x19, 88]
+	ldrb	w0, [x0, 20]
 	bl	FlashBchSel
 	adrp	x0, .LANCHOR2
 	add	x0, x0, :lo12:.LANCHOR2
-	add	x0, x0, 3896
+	add	x0, x0, 3888
 	bl	FlashReadIdbDataRaw
-	strb	w20, [x19,73]
 	mov	w0, 18928
+	strb	w20, [x19, 73]
 	movk	w0, 0x2, lsl 16
 	bl	FlashTimingCfg
-	ldr	x1, [x19,88]
-	ldrb	w2, [x1,12]
-	strh	w2, [x19,184]
-	ldrh	w4, [x1,14]
-	ldrb	w2, [x1,7]
-	str	w2, [x19,180]
-	ldrb	w2, [x19,2133]
-	lsl	w3, w2, w20
-	orr	w2, w3, w2, lsl 8
-	ldrb	w3, [x19,2132]
+	ldr	x1, [x19, 88]
+	ldrb	w3, [x19, 2133]
+	ldrb	w4, [x19, 2132]
+	ldrb	w2, [x1, 12]
+	strh	w2, [x19, 184]
+	ldrb	w2, [x1, 7]
+	str	w2, [x19, 180]
+	ldrb	w2, [x19, 2135]
+	orr	w2, w4, w2, lsl 24
+	lsl	w4, w3, w20
+	orr	w3, w4, w3, lsl 8
+	ldrh	w4, [x1, 14]
 	orr	w2, w2, w3
-	ldrb	w3, [x19,2135]
-	orr	w2, w2, w3, lsl 24
-	str	w2, [x19,176]
-	ldrb	w2, [x19,2358]
-	strh	w2, [x19,186]
-	ldrb	w2, [x1,13]
-	strh	w2, [x19,188]
-	strh	w4, [x19,190]
-	ldrh	w2, [x1,10]
-	strh	w2, [x19,192]
-	ldrb	w3, [x1,12]
-	ldrh	w2, [x1,10]
+	str	w2, [x19, 176]
+	ldrb	w2, [x19, 2358]
+	strh	w2, [x19, 186]
+	ldrb	w2, [x1, 13]
+	strh	w2, [x19, 188]
+	strh	w4, [x19, 190]
+	ldrh	w2, [x1, 10]
+	strh	w2, [x19, 192]
+	ldrb	w3, [x1, 12]
+	ldrh	w2, [x1, 10]
 	sdiv	w2, w2, w3
-	strh	w2, [x19,194]
-	ldrb	w3, [x1,9]
-	strh	w3, [x19,196]
-	ldrh	w5, [x1,10]
-	ldrb	w2, [x1,9]
+	strh	w2, [x19, 194]
+	ldrb	w3, [x1, 9]
+	strh	w3, [x19, 196]
+	ldrh	w5, [x1, 10]
+	ldrb	w2, [x1, 9]
 	mul	w2, w2, w5
 	mov	w5, 512
-	strh	w5, [x19,200]
-	ldrb	w5, [x19,73]
-	strh	w5, [x19,202]
-	uxth	w2, w2
-	ldrb	w5, [x19,72]
-	strh	w2, [x19,198]
+	strh	w5, [x19, 200]
+	ldrb	w5, [x19, 73]
+	and	w2, w2, 65535
+	strh	w5, [x19, 202]
+	strh	w2, [x19, 198]
+	ldrb	w5, [x19, 72]
 	cmp	w5, 1
-	bne	.L1468
-	lsl	w2, w2, 1
+	bne	.L1500
+	ubfiz	w2, w2, 1, 15
 	lsr	w4, w4, 1
-	lsl	w3, w3, 1
-	strh	w2, [x19,198]
-	strb	w20, [x19,73]
+	ubfiz	w3, w3, 1, 15
+	strh	w2, [x19, 198]
+	strb	w20, [x19, 73]
 	mov	w2, 8
-	strh	w4, [x19,190]
-	strh	w3, [x19,196]
-	strh	w2, [x19,202]
-.L1468:
-	ldrb	w0, [x1,20]
+	strh	w4, [x19, 190]
+	strh	w3, [x19, 196]
+	strh	w2, [x19, 202]
+.L1500:
+	ldrb	w0, [x1, 20]
 	bl	FlashBchSel
 	bl	ftl_flash_suspend
 	mov	w0, 0
-	b	.L1488
-.L1470:
-	mov	w0, -2
-	b	.L1488
-.L1425:
-	strb	w5, [x3,1680]
-	b	.L1424
-.L1488:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+.L1448:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 112
 	ret
+.L1465:
+	cmp	w2, 220
+	bne	.L1467
+	add	x1, x0, :lo12:.LANCHOR1
+	mov	w2, 4096
+	strh	w2, [x1, 3438]
+	mov	w2, -36
+	b	.L1548
+.L1467:
+	cmp	w2, 211
+	bne	.L1466
+	add	x1, x0, :lo12:.LANCHOR1
+	mov	w2, 4096
+	strh	w2, [x1, 3438]
+	mov	w2, 2
+	strb	w2, [x1, 3437]
+	b	.L1466
+.L1474:
+	ldrb	w0, [x20, 2357]
+	bl	FlashSetInterfaceMode
+	ldrb	w0, [x20, 2357]
+	b	.L1543
+.L1505:
+	add	x1, x1, 1292
+	b	.L1483
+.L1481:
+	sub	w1, w0, #17
+	and	w1, w1, 255
+	cmp	w1, 2
+	bhi	.L1487
+	adrp	x1, MicronReadRetrial
+	add	x1, x1, :lo12:MicronReadRetrial
+	str	x1, [x20, 1624]
+	cmp	w0, 19
+	beq	.L1488
+.L1549:
+	mov	w0, 7
+	b	.L1546
+.L1488:
+	mov	w0, 15
+.L1546:
+	strb	w0, [x20, 1649]
+	b	.L1480
+.L1487:
+	sub	w1, w0, #65
+	cmp	w0, 33
+	and	w1, w1, 255
+	ccmp	w1, 1, 0, ne
+	bhi	.L1489
+	adrp	x0, ToshibaReadRetrial
+	add	x0, x0, :lo12:ToshibaReadRetrial
+	str	x0, [x20, 1624]
+	mov	w0, 4
+	strb	w0, [x21, 129]
+	b	.L1549
+.L1489:
+	sub	w2, w0, #34
+	sub	w1, w0, #67
+	and	w2, w2, 255
+	and	w1, w1, 255
+	cmp	w2, 1
+	ccmp	w1, 1, 0, hi
+	bhi	.L1490
+	adrp	x2, ToshibaReadRetrial
+	add	x2, x2, :lo12:ToshibaReadRetrial
+	str	x2, [x20, 1624]
+	cmp	w0, 35
+	mov	w2, 68
+	ccmp	w0, w2, 4, ne
+	beq	.L1491
+	mov	w0, 7
+.L1545:
+	strb	w0, [x20, 1649]
+	cmp	w1, 1
+	add	x0, x19, :lo12:.LANCHOR0
+	bhi	.L1493
+	mov	w1, 4
+.L1547:
+	strb	w1, [x0, 129]
+	b	.L1480
+.L1491:
+	mov	w0, 17
+	b	.L1545
+.L1493:
+	mov	w1, 5
+	b	.L1547
+.L1490:
+	cmp	w0, 49
+	bne	.L1494
+	adrp	x0, SamsungReadRetrial
+	add	x0, x0, :lo12:SamsungReadRetrial
+	str	x0, [x20, 1624]
+	b	.L1480
+.L1494:
+	cmp	w0, 50
+	bne	.L1480
+	adrp	x0, samsung_read_retrial
+	str	wzr, [x21, 2376]
+	add	x0, x0, :lo12:samsung_read_retrial
+	str	x0, [x20, 1624]
+	b	.L1480
+.L1502:
+	mov	w0, -2
+	b	.L1448
+.L1462:
+	strb	w5, [x3, 1688]
+	b	.L1461
 	.size	FlashInit, .-FlashInit
 	.align	2
 	.global	FlashPageProgMsbFFData
 	.type	FlashPageProgMsbFFData, %function
 FlashPageProgMsbFFData:
-	stp	x29, x30, [sp, -80]!
+	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	uxth	w19, w2
-	adrp	x2, .LANCHOR0
-	stp	x21, x22, [sp,32]
-	uxtb	w21, w0
-	add	x0, x2, :lo12:.LANCHOR0
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	mov	x23, x2
-	ldr	x3, [x0,88]
-	ldrb	w4, [x0,204]
-	ldrb	w3, [x3,19]
-	cbz	w4, .L1519
-	ldr	w0, [x0,2376]
-	cbnz	w0, .L1518
-.L1519:
-	sub	w2, w3, #5
-	uxtb	w2, w2
-	cmp	w2, 2
-	bls	.L1520
-	cmp	w3, 50
-	beq	.L1520
-	sub	w2, w3, #19
-	and	w2, w2, -17
-	uxtb	w2, w2
-	cbz	w2, .L1520
-	cmp	w3, 68
-	bne	.L1518
-.L1520:
-	adrp	x20, .LANCHOR2
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR0
+	stp	x23, x24, [sp, 48]
+	and	w23, w0, 255
+	add	x0, x20, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	and	w19, w2, 65535
+	ldrb	w2, [x0, 204]
+	cbz	w2, .L1551
+	ldr	w0, [x0, 2376]
+	cbnz	w0, .L1550
+.L1551:
+	add	x0, x20, :lo12:.LANCHOR0
+	ldr	x0, [x0, 88]
+	ldrb	w0, [x0, 19]
+	sub	w0, w0, #5
+	and	w3, w0, 255
+	cmp	w3, 63
+	bhi	.L1550
+	mov	x2, 16391
+	movk	x2, 0x4000, lsl 16
+	movk	x2, 0x2000, lsl 32
+	movk	x2, 0x8000, lsl 48
+	lsr	x0, x2, x3
+	tbz	x0, 0, .L1550
+	adrp	x21, .LANCHOR2
+	add	x21, x21, :lo12:.LANCHOR2
+	adrp	x22, .LANCHOR4
 	mov	w24, w1
-	add	x20, x20, :lo12:.LANCHOR2
-	mov	w25, 65535
-	add	x20, x20, 1508
-	adrp	x26, .LANCHOR4
-.L1523:
-	add	x0, x23, :lo12:.LANCHOR0
-	ldr	x0, [x0,88]
-	ldrh	w0, [x0,10]
+	add	x21, x21, 1500
+	add	x22, x22, :lo12:.LANCHOR4
+.L1553:
+	add	x0, x20, :lo12:.LANCHOR0
+	ldr	x0, [x0, 88]
+	ldrh	w0, [x0, 10]
 	cmp	w0, w19
-	bls	.L1518
-	ldrh	w0, [x20,w19,sxtw 1]
-	cmp	w0, w25
-	bne	.L1518
-	add	x22, x26, :lo12:.LANCHOR4
-	mov	w1, 255
+	bhi	.L1554
+.L1550:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 64
+	ret
+.L1554:
+	ldrh	w1, [x21, w19, sxtw 1]
+	mov	w0, 65535
+	cmp	w1, w0
+	bne	.L1550
+	ldr	x0, [x22, 1656]
 	mov	w2, 32768
-	ldr	x0, [x22,1648]
+	mov	w1, 255
 	bl	ftl_memset
-	ldr	x2, [x22,1648]
+	ldr	x3, [x22, 1656]
 	add	w1, w19, w24
-	mov	w0, w21
 	add	w19, w19, 1
-	mov	x3, x2
-	uxth	w19, w19
+	mov	w0, w23
+	and	w19, w19, 65535
+	mov	x2, x3
 	bl	FlashProgPage
-	b	.L1523
-.L1518:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 80
-	ret
+	b	.L1553
 	.size	FlashPageProgMsbFFData, .-FlashPageProgMsbFFData
 	.align	2
 	.global	FlashReadSlc2KPages
 	.type	FlashReadSlc2KPages, %function
 FlashReadSlc2KPages:
-	stp	x29, x30, [sp, -144]!
+	stp	x29, x30, [sp, -128]!
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	adrp	x23, .LANCHOR0
-	mov	w24, w1
-	stp	x19, x20, [sp,16]
-	adrp	x1, .LANCHOR1+481
+	stp	x19, x20, [sp, 16]
 	mov	x19, x0
-	add	x0, x23, :lo12:.LANCHOR0
-	str	x0, [x29,120]
-	adrp	x0, .LC98
-	str	w2, [x29,116]
-	add	x0, x0, :lo12:.LC98
-	str	x0, [x29,104]
-	stp	x25, x26, [sp,64]
-	adrp	x0, .LC100
-	ldrb	w25, [x1,#:lo12:.LANCHOR1+481]
-	stp	x21, x22, [sp,32]
-	add	x0, x0, :lo12:.LC100
-	mov	w22, 0
-	stp	x27, x28, [sp,80]
-	str	x0, [x29,96]
-.L1535:
-	cmp	w22, w24
-	beq	.L1599
-	ldr	w1, [x29,116]
-	sub	w4, w24, w22
+	mov	w0, 56
+	stp	x21, x22, [sp, 32]
+	str	w2, [x29, 104]
+	adrp	x2, .LANCHOR1+481
+	stp	x23, x24, [sp, 48]
+	nop // between mem op and mult-accumulate
+	umaddl	x0, w1, w0, x19
+	stp	x25, x26, [sp, 64]
+	and	w22, w1, 255
+	adrp	x25, .LANCHOR0
+	ldrb	w2, [x2, #:lo12:.LANCHOR1+481]
+	add	x23, x25, :lo12:.LANCHOR0
+	stp	x27, x28, [sp, 80]
+	str	x0, [x29, 96]
+	str	w2, [x29, 108]
+.L1560:
+	ldr	x0, [x29, 96]
+	cmp	x19, x0
+	bne	.L1580
+	ldp	x19, x20, [sp, 16]
+	mov	w0, 0
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 128
+	ret
+.L1580:
+	ldr	w1, [x29, 104]
+	add	x2, x29, 124
+	mov	w4, w22
+	add	x3, x29, 120
 	mov	x0, x19
-	add	x2, x29, 140
-	add	x3, x29, 136
-	adrp	x21, .LANCHOR0
 	bl	LogAddr2PhyAddr
-	ldr	x1, [x29,120]
-	ldr	w0, [x29,136]
-	ldrb	w1, [x1,2358]
-	cmp	w0, w1
-	bcc	.L1536
+	add	x1, x25, :lo12:.LANCHOR0
+	ldr	w0, [x29, 120]
+	ldrb	w2, [x1, 2358]
+	cmp	w2, w0
+	bhi	.L1561
 	mov	w0, -1
 	str	w0, [x19]
-	b	.L1537
-.L1536:
-	ldr	x1, [x29,120]
+.L1562:
+	sub	w22, w22, #1
+	add	x19, x19, 56
+	and	w22, w22, 255
+	b	.L1560
+.L1561:
 	add	x0, x1, w0, uxtw
-	ldrb	w20, [x0,2360]
-	mov	w23, 0
-	adrp	x27, .LANCHOR4
+	adrp	x21, .LANCHOR4
+	add	x27, x21, :lo12:.LANCHOR4
+	mov	w24, 0
 	mov	w28, 256
+	ldrb	w20, [x0, 2360]
 	mov	w0, w20
 	bl	NandcWaitFlashReady
 	mov	w0, w20
 	bl	NandcFlashCs
-.L1538:
-	ldr	w1, [x29,140]
+.L1563:
+	ldr	w1, [x29, 124]
 	mov	w0, w20
 	bl	FlashReadCmd
 	mov	w0, w20
 	bl	NandcWaitFlashReady
-	ldr	x3, [x19,8]
-	mov	w0, w20
-	ldr	x4, [x19,16]
+	ldrb	w2, [x29, 108]
 	mov	w1, 0
-	mov	w2, w25
+	ldp	x3, x4, [x19, 8]
+	mov	w0, w20
 	bl	NandcXferData
 	mov	w26, w0
-	add	x0, x27, :lo12:.LANCHOR4
-	ldrb	w0, [x0,1680]
-	cbz	w0, .L1539
+	ldrb	w0, [x27, 1688]
+	cbz	w0, .L1564
 	mov	w0, w20
 	bl	flash_read_ecc
 	cmp	w0, 5
 	csel	w26, w26, w28, ls
-.L1539:
-	cmn	w26, #1
-	bne	.L1540
-	cmp	w23, 9
-	bhi	.L1540
-	add	w23, w23, 1
-	b	.L1538
-.L1540:
-	cmp	w23, wzr
+.L1564:
+	cmp	w24, 9
+	ccmn	w26, #1, 0, ls
+	bne	.L1565
+	add	w24, w24, 1
+	b	.L1563
+.L1565:
+	cmp	w24, 0
 	mov	w27, 256
+	add	x21, x21, :lo12:.LANCHOR4
 	csel	w26, w26, w27, eq
-	mov	w23, 0
-.L1542:
-	add	x0, x21, :lo12:.LANCHOR0
-	ldr	w1, [x29,140]
-	ldr	w2, [x0,76]
+	mov	w24, 0
+.L1567:
+	ldr	w0, [x23, 76]
+	ldr	w1, [x29, 124]
+	add	w1, w1, w0
 	mov	w0, w20
-	add	w1, w2, w1
 	bl	FlashReadCmd
 	mov	w0, w20
 	bl	NandcWaitFlashReady
-	ldr	x0, [x19,8]
+	ldr	x0, [x19, 8]
 	mov	w1, 0
-	mov	w2, w25
-	cmp	x0, xzr
+	ldrb	w2, [x29, 108]
+	cmp	x0, 0
 	add	x3, x0, 2048
-	ldr	x0, [x19,16]
+	ldr	x0, [x19, 16]
 	csel	x3, x3, xzr, ne
+	cmp	x0, 0
 	add	x4, x0, 8
-	cmp	x0, xzr
 	csel	x4, x4, xzr, ne
 	mov	w0, w20
 	bl	NandcXferData
 	mov	w28, w0
-	adrp	x0, .LANCHOR4
-	add	x0, x0, :lo12:.LANCHOR4
-	ldrb	w0, [x0,1680]
-	cbz	w0, .L1545
+	ldrb	w0, [x21, 1688]
+	cbz	w0, .L1570
 	mov	w0, w20
 	bl	flash_read_ecc
 	cmp	w0, 5
 	csel	w28, w28, w27, ls
-.L1545:
-	cmn	w28, #1
-	bne	.L1546
-	cmp	w23, 9
-	bhi	.L1546
-	add	w23, w23, 1
-	b	.L1542
-.L1546:
-	cmp	w23, wzr
+.L1570:
+	cmp	w24, 9
+	ccmn	w28, #1, 0, ls
+	bne	.L1571
+	add	w24, w24, 1
+	b	.L1567
+.L1571:
+	cmp	w24, 0
+	mov	w2, 256
 	mov	w0, w20
-	mov	w27, 256
-	csel	w28, w28, w27, eq
+	csel	w28, w28, w2, eq
 	bl	NandcFlashDeCs
-	add	x0, x21, :lo12:.LANCHOR0
-	cmp	w28, w26
-	csel	w28, w28, w26, cs
-	ldrb	w0, [x0,2464]
+	ldrb	w0, [x23, 2464]
+	cmp	w26, w28
+	csel	w5, w26, w28, cs
 	add	w0, w0, w0, lsl 1
-	cmp	w28, w0, lsr 2
-	bls	.L1548
-	cmn	w28, #1
-	csel	w28, w28, w27, eq
-.L1548:
-	cmp	w28, 256
-	beq	.L1559
-	cmn	w28, #1
-	bne	.L1549
-.L1559:
-	str	w28, [x19]
-	b	.L1551
-.L1549:
-	str	wzr, [x19]
-.L1551:
-	ldr	x0, [x19,16]
-	cbz	x0, .L1552
-	ldr	w1, [x0,12]
+	cmp	w5, w0, lsr 2
+	bls	.L1573
+	cmn	w5, #1
+	csel	w5, w5, w2, eq
+.L1573:
+	cmp	w5, 256
+	ldr	x0, [x19, 16]
+	ccmn	w5, #1, 4, ne
+	csel	w5, w5, wzr, eq
+	str	w5, [x19]
+	cbz	x0, .L1576
+	ldr	w1, [x0, 12]
 	cmn	w1, #1
-	bne	.L1552
-	ldr	w1, [x0,8]
+	bne	.L1576
+	ldr	w1, [x0, 8]
 	cmn	w1, #1
-	bne	.L1552
+	bne	.L1576
 	ldr	w0, [x0]
 	cmn	w0, #1
-	beq	.L1552
+	beq	.L1576
 	str	w1, [x19]
-.L1552:
+.L1576:
 	ldr	w3, [x19]
 	cmn	w3, #1
-	bne	.L1537
-	add	x21, x21, :lo12:.LANCHOR0
-	ldr	w1, [x19,4]
-	ldr	x0, [x29,104]
-	ldrb	w2, [x21,2464]
+	bne	.L1562
+	ldr	w1, [x19, 4]
+	adrp	x0, .LC98
+	ldrb	w2, [x23, 2464]
+	add	x0, x0, :lo12:.LC98
 	bl	printk
-	ldr	x1, [x19,8]
-	cbz	x1, .L1554
+	ldr	x1, [x19, 8]
+	cbz	x1, .L1578
 	adrp	x0, .LC99
+	mov	w3, 8
 	mov	w2, 4
 	add	x0, x0, :lo12:.LC99
-	mov	w3, 8
 	bl	rknand_print_hex
-.L1554:
-	ldr	x1, [x19,16]
-	cbz	x1, .L1537
-	mov	w2, 4
-	ldr	x0, [x29,96]
-	mov	w3, w2
+.L1578:
+	ldr	x1, [x19, 16]
+	cbz	x1, .L1562
+	mov	w3, 4
+	adrp	x0, .LC100
+	mov	w2, w3
+	add	x0, x0, :lo12:.LC100
 	bl	rknand_print_hex
-.L1537:
-	add	w22, w22, 1
-	add	x19, x19, 56
-	b	.L1535
-.L1599:
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 144
-	ret
+	b	.L1562
 	.size	FlashReadSlc2KPages, .-FlashReadSlc2KPages
 	.align	2
 	.global	FlashReadPages
 	.type	FlashReadPages, %function
 FlashReadPages:
-	stp	x29, x30, [sp, -176]!
-	adrp	x3, .LANCHOR1+481
+	stp	x29, x30, [sp, -144]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	ldrb	w3, [x3,#:lo12:.LANCHOR1+481]
+	stp	x21, x22, [sp, 32]
 	adrp	x22, .LANCHOR0
-	str	w3, [x29,148]
 	add	x3, x22, :lo12:.LANCHOR0
-	stp	x25, x26, [sp,64]
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	stp	x27, x28, [sp,80]
-	str	w1, [x29,144]
-	mov	x26, x0
-	ldrb	w4, [x3,80]
-	ldrb	w23, [x3,72]
-	str	w2, [x29,140]
-	str	w4, [x29,136]
-	cbz	w23, .L1640
+	stp	x19, x20, [sp, 16]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	stp	w2, w1, [x29, 104]
+	ldrb	w4, [x3, 72]
+	cbnz	w4, .L1609
+	mov	x25, x0
+	adrp	x0, .LANCHOR1+481
+	mov	w24, 0
+	mov	w23, 0
+	ldrb	w0, [x0, #:lo12:.LANCHOR1+481]
+	str	w0, [x29, 120]
+	ldrb	w0, [x3, 80]
+	str	w0, [x29, 100]
+	adrp	x0, .LANCHOR4
+	add	x27, x0, :lo12:.LANCHOR4
+.L1610:
+	ldr	w0, [x29, 108]
+	cmp	w23, w0
+	bcc	.L1644
+	mov	w0, 0
+	b	.L1608
+.L1609:
 	bl	FlashReadSlc2KPages
-	b	.L1689
-.L1640:
-	adrp	x0, .LC98
-	mov	w24, w23
-	add	x0, x0, :lo12:.LC98
-	str	x0, [x29,128]
-	adrp	x0, .LC100
-	add	x0, x0, :lo12:.LC100
-	str	x0, [x29,120]
-	adrp	x0, .LC101
-	add	x0, x0, :lo12:.LC101
-	str	x0, [x29,112]
-.L1601:
-	ldr	w0, [x29,144]
-	cmp	w24, w0
-	bcs	.L1691
-	mov	w27, 56
-	ldr	w0, [x29,144]
-	ldr	w1, [x29,140]
-	add	x2, x29, 172
-	umull	x27, w24, w27
-	sub	w4, w0, w24
-	add	x3, x29, 168
-	add	x21, x26, x27
-	mov	x0, x21
-	ldr	w28, [x21,4]
-	bl	LogAddr2PhyAddr
-	add	x1, x22, :lo12:.LANCHOR0
-	mov	w20, w0
-	ldr	w0, [x29,168]
-	ldrb	w2, [x1,2358]
-	cmp	w0, w2
-	bcc	.L1603
+.L1608:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 144
+	ret
+.L1644:
+	mov	w26, 56
+	ldr	w1, [x29, 104]
+	add	x2, x29, 140
+	add	x3, x29, 136
+	umull	x0, w23, w26
+	add	x26, x22, :lo12:.LANCHOR0
+	str	x0, [x29, 112]
+	add	x21, x25, x0
+	ldr	w0, [x29, 108]
+	sub	w4, w0, w23
+	mov	x0, x21
+	ldr	w28, [x21, 4]
+	bl	LogAddr2PhyAddr
+	ldrb	w2, [x26, 2358]
+	mov	w20, w0
+	ldr	w0, [x29, 136]
+	cmp	w2, w0
+	bhi	.L1612
+	ldr	x1, [x29, 112]
 	mov	w0, -1
-	str	w0, [x26,x27]
-	b	.L1604
-.L1603:
-	add	x0, x1, w0, uxtw
-	adrp	x25, .LANCHOR4
-	ldrb	w19, [x0,2360]
-	add	x0, x25, :lo12:.LANCHOR4
-	str	x1, [x29,152]
-	ldrb	w0, [x0,1681]
-	cmp	w0, wzr
+	str	w0, [x25, x1]
+.L1613:
+	add	w23, w23, 1
+	b	.L1610
+.L1612:
+	add	x0, x26, w0, uxtw
+	ldrb	w19, [x0, 2360]
+	adrp	x0, .LANCHOR4
+	add	x0, x0, :lo12:.LANCHOR4
+	ldrb	w0, [x0, 1689]
+	cmp	w0, 0
 	mov	w0, w19
 	csel	w20, w20, wzr, ne
 	bl	NandcWaitFlashReady
-	ldr	x1, [x29,152]
-	ldr	x0, [x1,88]
-	ldrb	w0, [x0,19]
+	ldr	x0, [x26, 88]
+	ldrb	w0, [x0, 19]
 	sub	w2, w0, #1
-	uxtb	w2, w2
+	and	w2, w2, 255
 	cmp	w2, 7
-	bhi	.L1606
+	bhi	.L1615
+	add	x1, x26, 1272
+	sxtw	x2, w19
+	add	x1, x1, x2
 	sub	w0, w0, #7
-	add	x1, x1, 1272
-	sxtw	x4, w19
-	add	x1, x1, x4
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 1
-	ldrb	w3, [x1,12]
-	bhi	.L1607
-	ldrb	w3, [x1,20]
-.L1607:
-	add	x2, x22, :lo12:.LANCHOR0
-	add	x4, x2, x4
-	ldrb	w0, [x4,2128]
-	cmp	w0, w3
-	beq	.L1606
-	ldrb	w1, [x2,1273]
+	ldrb	w3, [x1, 12]
+	bhi	.L1616
+	ldrb	w3, [x1, 20]
+.L1616:
+	add	x0, x22, :lo12:.LANCHOR0
+	add	x2, x0, x2
+	ldrb	w1, [x2, 2128]
+	cmp	w1, w3
+	beq	.L1615
+	ldrb	w1, [x0, 1273]
+	add	x2, x0, 1276
 	mov	w0, w19
-	add	x2, x2, 1276
 	bl	HynixSetRRPara
-.L1606:
+.L1615:
 	mov	w0, w19
 	bl	NandcFlashCs
-	ldr	w0, [x29,140]
+	ldr	w0, [x29, 104]
 	cmp	w0, 1
 	cset	w0, eq
 	orr	w0, w0, w28, lsr 31
-	str	w0, [x29,152]
-	cbz	w0, .L1608
+	str	w0, [x29, 124]
+	cbz	w0, .L1617
 	add	x0, x22, :lo12:.LANCHOR0
-	ldrb	w0, [x0,204]
-	cbz	w0, .L1608
+	ldrb	w0, [x0, 204]
+	cbz	w0, .L1617
 	mov	w0, w19
 	bl	flash_enter_slc_mode
-	b	.L1609
-.L1608:
-	mov	w0, w19
-	bl	flash_exit_slc_mode
-.L1609:
-	cmp	w19, 255
-	ldr	w1, [x29,172]
-	bne	.L1647
+.L1618:
+	add	x28, x22, :lo12:.LANCHOR0
+.L1624:
+	ldr	w1, [x29, 140]
 	cmn	w1, #1
-	cset	w0, ne
-	cbz	w0, .L1641
-.L1647:
-	cbz	w20, .L1613
-	add	x0, x22, :lo12:.LANCHOR0
-	ldr	w2, [x0,76]
+	bne	.L1619
+	cmp	w19, 255
+	beq	.L1646
+.L1619:
+	cbz	w20, .L1621
+	ldr	w2, [x28, 76]
 	mov	w0, w19
 	add	w2, w1, w2
 	bl	FlashReadDpCmd
-	b	.L1614
-.L1613:
+.L1622:
 	mov	w0, w19
-	bl	FlashReadCmd
-	b	.L1614
-.L1641:
-	mov	w20, w0
-.L1611:
-	ldrb	w2, [x29,148]
+	bl	NandcWaitFlashReady
+	cbz	w20, .L1620
+	ldr	w1, [x29, 140]
 	mov	w0, w19
-	ldr	x3, [x21,8]
+	bl	FlashReadDpDataOutCmd
+.L1620:
+	ldrb	w2, [x29, 120]
 	mov	w1, 0
-	ldr	x4, [x21,16]
+	ldp	x3, x4, [x21, 8]
+	mov	w0, w19
 	bl	NandcXferData
-	cmn	w0, #1
-	mov	w28, w0
-	bne	.L1615
-	add	x0, x22, :lo12:.LANCHOR0
-	ldrb	w1, [x0,80]
-	cbz	w1, .L1615
-	strb	wzr, [x0,80]
+	mov	w26, w0
+	ldrb	w0, [x28, 80]
+	cbz	w0, .L1623
+	cmn	w26, #1
+	bne	.L1623
+	strb	wzr, [x28, 80]
 	mov	w20, 0
-	b	.L1609
-.L1615:
-	cbz	w20, .L1616
+	b	.L1624
+.L1617:
+	mov	w0, w19
+	bl	flash_exit_slc_mode
+	b	.L1618
+.L1621:
+	mov	w0, w19
+	bl	FlashReadCmd
+	b	.L1622
+.L1646:
+	mov	w20, 0
+	b	.L1620
+.L1623:
+	cbz	w20, .L1625
 	add	x0, x22, :lo12:.LANCHOR0
-	ldr	w1, [x29,172]
-	ldr	w2, [x0,76]
+	ldr	w1, [x29, 140]
+	ldr	w0, [x0, 76]
+	add	w1, w1, w0
 	mov	w0, w19
-	add	w1, w2, w1
 	bl	FlashReadDpDataOutCmd
-	add	w0, w24, 1
-	mov	w4, 56
-	ldrb	w2, [x29,148]
+	add	w0, w23, 1
+	mov	w1, 56
+	ldrb	w2, [x29, 120]
+	nop // between mem op and mult-accumulate
+	umaddl	x0, w0, w1, x25
 	mov	w1, 0
-	umull	x4, w0, w4
+	ldp	x3, x4, [x0, 8]
 	mov	w0, w19
-	add	x4, x26, x4
-	ldr	x3, [x4,8]
-	ldr	x4, [x4,16]
 	bl	NandcXferData
 	cmn	w0, #1
-	mov	w23, w0
+	mov	w24, w0
 	csel	w20, w20, wzr, ne
-.L1616:
+.L1625:
+	add	x28, x22, :lo12:.LANCHOR0
 	mov	w0, w19
 	bl	NandcFlashDeCs
-	add	x6, x22, :lo12:.LANCHOR0
-	ldrb	w0, [x29,136]
-	cmn	w28, #1
-	strb	w0, [x6,80]
-	bne	.L1623
-	ldrb	w0, [x6,2380]
-	cbnz	w0, .L1618
-.L1622:
-	add	x0, x25, :lo12:.LANCHOR4
-	ldr	x20, [x0,1616]
-	cbnz	x20, .L1619
-	b	.L1692
-.L1618:
-	ldr	x0, [x6,136]
+	ldrb	w0, [x29, 100]
+	cmn	w26, #1
+	strb	w0, [x28, 80]
+	bne	.L1626
+	ldrb	w0, [x28, 2380]
+	cbnz	w0, .L1627
+.L1631:
+	ldr	x4, [x27, 1624]
+	cbnz	x4, .L1628
+	ldr	w1, [x29, 140]
+	mov	w0, w19
+	ldp	x2, x3, [x21, 8]
+	bl	FlashReadRawPage
+	b	.L1683
+.L1627:
+	ldr	x0, [x28, 136]
 	mov	w4, 1
-	ldr	w1, [x29,172]
-	ldr	x2, [x21,8]
-	ldr	x3, [x21,16]
-	ldr	w20, [x0,304]
+	ldr	w1, [x29, 140]
+	ldp	x2, x3, [x21, 8]
+	ldr	w20, [x0, 304]
 	mov	w0, w19
-	str	x6, [x29,104]
 	bl	FlashDdrTunningRead
+	mov	w26, w0
 	cmn	w0, #1
-	mov	w28, w0
-	beq	.L1621
-	ldr	x6, [x29,104]
-	ldrb	w0, [x6,2464]
-	cmp	w28, w0, lsr 1
-	bls	.L1643
-.L1621:
+	beq	.L1630
+	ldrb	w0, [x28, 2464]
+	cmp	w26, w0, lsr 1
+	bls	.L1647
+.L1630:
 	lsr	w0, w20, 8
 	bl	NandcSetDdrPara
-	cmn	w28, #1
-	beq	.L1622
-	b	.L1643
-.L1619:
-	ldr	w1, [x29,172]
-	mov	w0, w19
-	ldr	x2, [x21,8]
-	ldr	x3, [x21,16]
-	blr	x20
-	cmn	w0, #1
-	mov	w28, w0
-	mov	w20, 0
-	bne	.L1624
-	add	x2, x22, :lo12:.LANCHOR0
-	ldr	x0, [x2,88]
-	ldrb	w0, [x0,19]
-	sub	w0, w0, #1
-	uxtb	w0, w0
-	cmp	w0, 7
-	bhi	.L1625
-	ldrb	w1, [x2,1273]
-	mov	w0, w19
-	add	x2, x2, 1276
-	mov	w3, w20
-	bl	HynixSetRRPara
-.L1625:
-	ldr	w1, [x29,172]
-	mov	w0, w19
-	ldr	x2, [x21,8]
+	cmn	w26, #1
+	beq	.L1631
+.L1647:
 	mov	w20, 0
-	ldr	x3, [x21,16]
-	bl	FlashReadRawPage
-	mov	w28, w0
-	add	x4, x22, :lo12:.LANCHOR0
-	ldr	x0, [x29,112]
-	ldr	w1, [x21,4]
-	mov	w3, w28
-	str	x4, [x29,104]
-	ldrb	w2, [x4,2464]
-	bl	printk
-	cmn	w28, #1
-	ldr	x4, [x29,104]
-	bne	.L1624
-	ldrb	w0, [x4,204]
-	cbz	w0, .L1624
-	ldr	w0, [x29,152]
-	cbz	w0, .L1626
-	mov	w0, w19
-	bl	flash_enter_slc_mode
-	b	.L1627
 .L1626:
-	mov	w0, w19
-	bl	flash_exit_slc_mode
-.L1627:
-	add	x0, x25, :lo12:.LANCHOR4
-	ldr	w1, [x29,172]
-	ldr	x2, [x21,8]
-	mov	w20, 0
-	ldr	x3, [x21,16]
-	ldr	x4, [x0,1616]
-	mov	w0, w19
-	blr	x4
-	mov	w28, w0
-	b	.L1624
-.L1692:
-	ldr	w1, [x29,172]
-	mov	w0, w19
-	ldr	x2, [x21,8]
-	ldr	x3, [x21,16]
-	bl	FlashReadRawPage
-	mov	w28, w0
-	b	.L1624
-.L1643:
-	mov	w20, 0
-.L1623:
 	add	x0, x22, :lo12:.LANCHOR0
-	ldrb	w0, [x0,2464]
+	ldrb	w0, [x0, 2464]
 	add	w0, w0, w0, lsl 1
-	cmp	w28, w0, lsr 2
-	bls	.L1624
-	add	x0, x25, :lo12:.LANCHOR4
-	ldr	x0, [x0,1616]
-	cmp	x0, xzr
+	cmp	w26, w0, lsr 2
+	bls	.L1632
+	ldr	x0, [x27, 1624]
+	cmp	x0, 0
 	mov	w0, 256
-	csel	w28, w28, w0, ne
-.L1624:
-	cmp	w28, 256
-	beq	.L1648
-	cmn	w28, #1
-	bne	.L1628
-.L1648:
-	str	w28, [x26,x27]
-	b	.L1630
-.L1628:
-	str	wzr, [x26,x27]
-.L1630:
-	ldr	w3, [x26,x27]
+	csel	w26, w26, w0, ne
+.L1632:
+	ldr	x0, [x29, 112]
+	cmp	w26, 256
+	ccmn	w26, #1, 4, ne
+	csel	w3, w26, wzr, eq
 	cmn	w3, #1
-	bne	.L1632
-	add	x2, x22, :lo12:.LANCHOR0
-	ldr	w1, [x21,4]
-	ldr	x0, [x29,128]
-	ldrb	w2, [x2,2464]
+	str	w3, [x25, x0]
+	bne	.L1639
+	add	x0, x22, :lo12:.LANCHOR0
+	ldr	w1, [x21, 4]
+	ldrb	w2, [x0, 2464]
+	adrp	x0, .LC98
+	add	x0, x0, :lo12:.LC98
 	bl	printk
-	ldr	x1, [x21,16]
-	cbz	x1, .L1632
-	mov	w2, 4
-	ldr	x0, [x29,120]
-	mov	w3, w2
+	ldr	x1, [x21, 16]
+	cbz	x1, .L1639
+	mov	w3, 4
+	adrp	x0, .LC100
+	mov	w2, w3
+	add	x0, x0, :lo12:.LC100
 	bl	rknand_print_hex
-.L1632:
-	cbz	w20, .L1634
+.L1639:
+	cbz	w20, .L1641
 	add	x0, x22, :lo12:.LANCHOR0
-	ldrb	w0, [x0,2464]
+	ldrb	w0, [x0, 2464]
 	add	w0, w0, w0, lsl 1
-	cmp	w23, w0, lsr 2
-	bls	.L1635
-	add	x25, x25, :lo12:.LANCHOR4
-	ldr	x0, [x25,1616]
-	cmp	x0, xzr
+	cmp	w24, w0, lsr 2
+	bls	.L1642
+	ldr	x0, [x27, 1624]
+	cmp	x0, 0
 	mov	w0, 256
-	csel	w23, w23, w0, ne
-.L1635:
-	add	w0, w24, 1
+	csel	w24, w24, w0, ne
+.L1642:
+	add	w0, w23, 1
 	mov	w1, 56
-	cmp	w23, 256
+	cmp	w24, 256
+	ccmn	w24, #1, 4, ne
 	umull	x0, w0, w1
-	beq	.L1649
-	cmn	w23, #1
-	bne	.L1636
-.L1649:
-	str	w23, [x26,x0]
-	b	.L1634
-.L1636:
-	str	wzr, [x26,x0]
-.L1634:
-	ldr	w0, [x29,152]
-	add	w24, w24, w20
-	cbz	w0, .L1604
+	csel	w1, w24, wzr, eq
+	str	w1, [x25, x0]
+.L1641:
+	ldr	w0, [x29, 124]
+	add	w23, w23, w20
+	cbz	w0, .L1613
 	add	x0, x22, :lo12:.LANCHOR0
-	ldrb	w0, [x0,204]
-	cbz	w0, .L1604
+	ldrb	w0, [x0, 204]
+	cbz	w0, .L1613
 	mov	w0, w19
 	bl	flash_exit_slc_mode
-.L1604:
-	add	w24, w24, 1
-	b	.L1601
-.L1691:
-	mov	w0, 0
-	b	.L1689
-.L1614:
+	b	.L1613
+.L1628:
+	ldr	w1, [x29, 140]
 	mov	w0, w19
-	bl	NandcWaitFlashReady
-	cbz	w20, .L1611
-	ldr	w1, [x29,172]
+	ldp	x2, x3, [x21, 8]
+	mov	w20, 0
+	blr	x4
+	mov	w26, w0
+	cmn	w0, #1
+	bne	.L1632
+	add	x1, x22, :lo12:.LANCHOR0
+	ldr	x0, [x1, 88]
+	ldrb	w0, [x0, 19]
+	sub	w0, w0, #1
+	and	w0, w0, 255
+	cmp	w0, 7
+	bhi	.L1633
+	add	x2, x1, 1276
+	ldrb	w1, [x1, 1273]
+	mov	w3, 0
 	mov	w0, w19
-	bl	FlashReadDpDataOutCmd
-	b	.L1611
-.L1689:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 176
-	ret
+	bl	HynixSetRRPara
+.L1633:
+	ldp	x2, x3, [x21, 8]
+	add	x20, x22, :lo12:.LANCHOR0
+	ldr	w1, [x29, 140]
+	mov	w0, w19
+	bl	FlashReadRawPage
+	mov	w26, w0
+	ldrb	w2, [x20, 2464]
+	mov	w3, w0
+	ldr	w1, [x21, 4]
+	adrp	x0, .LC101
+	add	x0, x0, :lo12:.LC101
+	bl	printk
+	cmn	w26, #1
+	bne	.L1650
+	ldrb	w0, [x20, 204]
+	cbz	w0, .L1650
+	ldr	w0, [x29, 124]
+	cbz	w0, .L1634
+	mov	w0, w19
+	bl	flash_enter_slc_mode
+.L1635:
+	ldr	w1, [x29, 140]
+	mov	w0, w19
+	ldp	x2, x3, [x21, 8]
+	ldr	x4, [x27, 1624]
+	blr	x4
+.L1683:
+	mov	w26, w0
+.L1650:
+	mov	w20, 0
+	b	.L1632
+.L1634:
+	mov	w0, w19
+	bl	flash_exit_slc_mode
+	b	.L1635
 	.size	FlashReadPages, .-FlashReadPages
 	.align	2
 	.global	FlashLoadFactorBbt
 	.type	FlashLoadFactorBbt, %function
 FlashLoadFactorBbt:
-	stp	x29, x30, [sp, -192]!
+	stp	x29, x30, [sp, -176]!
 	mov	w2, 16
+	mov	w1, 0
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	adrp	x22, .LANCHOR0
 	add	x0, x22, :lo12:.LANCHOR0
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
+	stp	x25, x26, [sp, 64]
+	stp	x19, x20, [sp, 16]
+	add	x0, x0, 176
+	stp	x23, x24, [sp, 48]
 	adrp	x23, .LANCHOR4
-	mov	w27, -1
-	ldrh	w1, [x0,188]
+	stp	x27, x28, [sp, 80]
 	add	x19, x23, :lo12:.LANCHOR4
-	ldrh	w21, [x0,190]
-	add	x0, x19, 1688
-	mov	w28, 0
-	adrp	x26, .LC102
-	add	x26, x26, :lo12:.LC102
-	mul	w21, w1, w21
-	mov	w1, 0
-	uxth	w21, w21
+	mov	w26, -1
+	mov	w27, 0
+	ldrh	w21, [x0, 14]
+	ldrh	w0, [x0, 12]
+	mul	w21, w21, w0
+	add	x0, x19, 1696
 	bl	ftl_memset
-	add	w25, w21, w27
-	ldr	x0, [x19,1656]
-	str	x0, [x29,152]
-	mov	w19, w28
+	and	w21, w21, 65535
+	ldr	x0, [x19, 1664]
+	add	w25, w21, w26
+	stp	xzr, x0, [x29, 128]
+	and	w25, w25, 65535
 	sub	w0, w21, #12
-	str	xzr, [x29,144]
-	uxth	w25, w25
-	str	w0, [x29,124]
-.L1694:
-	add	x1, x22, :lo12:.LANCHOR0
-	ldrb	w1, [x1,2358]
-	cmp	w1, w19
-	bls	.L1704
-	mul	w3, w19, w21
+	mov	w19, 0
+	str	w0, [x29, 108]
+.L1685:
+	add	x0, x22, :lo12:.LANCHOR0
+	ldrb	w0, [x0, 2358]
+	cmp	w0, w19
+	bhi	.L1691
+	mov	w0, w26
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 176
+	ret
+.L1691:
+	mul	w28, w21, w19
 	mov	w20, w25
-	mov	w4, 61664
-.L1695:
-	ldr	w0, [x29,124]
+	add	x24, x23, :lo12:.LANCHOR4
+	mov	w3, 61664
+.L1686:
+	ldr	w0, [x29, 108]
 	cmp	w20, w0
-	ble	.L1697
-	add	w1, w3, w20
-	add	x0, x29, 136
-	lsl	w1, w1, 10
-	str	w1, [x29,140]
-	mov	w1, 1
-	str	x4, [x29,104]
-	mov	w2, w1
-	str	x3, [x29,112]
+	ble	.L1688
+	add	w0, w20, w28
+	mov	w2, 1
+	lsl	w0, w0, 10
+	str	w3, [x29, 104]
+	str	w0, [x29, 124]
+	mov	w1, w2
+	add	x0, x29, 120
 	bl	FlashReadPages
-	ldr	w0, [x29,136]
-	ldr	x3, [x29,112]
+	ldr	w0, [x29, 120]
+	ldr	w3, [x29, 104]
 	cmn	w0, #1
-	ldr	x4, [x29,104]
-	beq	.L1696
-	add	x24, x23, :lo12:.LANCHOR4
-	ldr	x0, [x24,1656]
+	beq	.L1687
+	ldr	x0, [x24, 1664]
 	ldrh	w0, [x0]
-	cmp	w0, w4
-	bne	.L1696
-	add	x24, x24, 1688
-	mov	x0, x26
-	mov	w1, w19
+	cmp	w0, w3
+	bne	.L1687
+	add	x24, x24, 1696
+	add	w27, w27, 1
+	and	w27, w27, 65535
 	mov	w2, w20
-	add	w28, w28, 1
+	mov	w1, w19
+	adrp	x0, .LC102
+	add	x0, x0, :lo12:.LC102
 	bl	printk
-	strh	w20, [x24,w19,sxtw 1]
-	uxth	w28, w28
-	b	.L1697
-.L1696:
-	sub	w20, w20, #1
-	uxth	w20, w20
-	b	.L1695
-.L1697:
-	add	x1, x22, :lo12:.LANCHOR0
+	strh	w20, [x24, w19, sxtw 1]
+.L1688:
+	add	x0, x22, :lo12:.LANCHOR0
 	add	w19, w19, 1
-	uxtb	w19, w19
-	ldrb	w1, [x1,2358]
-	cmp	w1, w28
-	csel	w27, w27, wzr, ne
-	b	.L1694
-.L1704:
-	mov	w0, w27
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 192
-	ret
+	and	w19, w19, 255
+	ldrb	w0, [x0, 2358]
+	cmp	w0, w27
+	csel	w26, w26, wzr, ne
+	b	.L1685
+.L1687:
+	sub	w20, w20, #1
+	and	w20, w20, 65535
+	b	.L1686
 	.size	FlashLoadFactorBbt, .-FlashLoadFactorBbt
 	.align	2
 	.global	FlashProgSlc2KPages
 	.type	FlashProgSlc2KPages, %function
 FlashProgSlc2KPages:
-	stp	x29, x30, [sp, -160]!
+	stp	x29, x30, [sp, -176]!
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	mov	w23, w1
-	adrp	x1, .LANCHOR1+481
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	adrp	x22, .LANCHOR0
-	ldrb	w26, [x1,#:lo12:.LANCHOR1+481]
-	stp	x19, x20, [sp,16]
-	str	x27, [sp,80]
-	mov	w24, w2
-	mov	x19, x0
+	stp	x23, x24, [sp, 48]
+	mov	w24, 56
+	stp	x25, x26, [sp, 64]
+	mov	w25, w2
+	adrp	x2, .LANCHOR1+481
+	stp	x21, x22, [sp, 32]
+	nop // between mem op and mult-accumulate
+	umaddl	x24, w1, w24, x0
+	and	w22, w1, 255
+	ldrb	w26, [x2, #:lo12:.LANCHOR1+481]
+	mov	w23, w22
+	stp	x27, x28, [sp, 80]
 	mov	x21, x0
-	mov	w25, 0
-	add	x22, x22, :lo12:.LANCHOR0
-	mov	w27, -1
-.L1706:
-	cmp	w25, w23
-	beq	.L1732
-	mov	w1, w24
-	sub	w4, w23, w25
+	stp	x19, x20, [sp, 16]
+	adrp	x27, .LANCHOR0
+	mov	x19, x0
+	add	x28, x27, :lo12:.LANCHOR0
+.L1697:
+	cmp	x21, x24
+	bne	.L1703
+	adrp	x23, .LANCHOR4
+	add	x24, x23, :lo12:.LANCHOR4
+.L1704:
+	cmp	x19, x21
+	bne	.L1711
+	ldp	x19, x20, [sp, 16]
+	mov	w0, 0
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 176
+	ret
+.L1703:
+	mov	w1, w25
+	mov	w4, w23
+	add	x3, x29, 116
+	add	x2, x29, 112
 	mov	x0, x21
-	add	x2, x29, 96
-	add	x3, x29, 100
 	bl	LogAddr2PhyAddr
-	ldr	w0, [x29,100]
-	ldrb	w1, [x22,2358]
-	cmp	w0, w1
-	bcc	.L1707
-	str	w27, [x21]
-	b	.L1708
-.L1707:
-	add	x0, x22, w0, uxtw
-	ldrb	w20, [x0,2360]
+	add	x5, x27, :lo12:.LANCHOR0
+	ldr	w0, [x29, 116]
+	ldrb	w1, [x5, 2358]
+	cmp	w1, w0
+	bhi	.L1698
+	mov	w0, -1
+	str	w0, [x21]
+.L1699:
+	sub	w23, w23, #1
+	add	x21, x21, 56
+	and	w23, w23, 255
+	b	.L1697
+.L1698:
+	add	x0, x5, w0, uxtw
+	str	x5, [x29, 104]
+	ldrb	w20, [x0, 2360]
 	mov	w0, w20
 	bl	NandcWaitFlashReady
 	mov	w0, w20
 	bl	NandcFlashCs
-	ldr	w1, [x29,96]
+	ldr	w1, [x29, 112]
 	mov	w0, w20
 	bl	FlashProgFirstCmd
-	ldr	x3, [x21,8]
+	ldp	x3, x4, [x21, 8]
 	mov	w2, w26
-	ldr	x4, [x21,16]
 	mov	w1, 1
 	mov	w0, w20
 	bl	NandcXferData
-	ldr	w1, [x29,96]
+	ldr	w1, [x29, 112]
 	mov	w0, w20
 	bl	FlashProgSecondCmd
 	mov	w0, w20
 	bl	NandcWaitFlashReady
-	ldr	w1, [x29,96]
+	ldr	w1, [x29, 112]
 	mov	w0, w20
 	bl	FlashReadStatus
 	sbfx	x0, x0, 0, 1
+	ldr	x5, [x29, 104]
 	str	w0, [x21]
+	ldr	w1, [x29, 112]
+	ldr	w0, [x5, 76]
+	add	w1, w1, w0
 	mov	w0, w20
-	ldr	w1, [x29,96]
-	ldr	w2, [x22,76]
-	add	w1, w2, w1
 	bl	FlashProgFirstCmd
-	ldr	x0, [x21,8]
-	mov	w1, 1
+	ldr	x0, [x21, 8]
 	mov	w2, w26
-	cmp	x0, xzr
+	mov	w1, 1
+	cmp	x0, 0
 	add	x3, x0, 2048
-	ldr	x0, [x21,16]
+	ldr	x0, [x21, 16]
 	csel	x3, x3, xzr, ne
+	cmp	x0, 0
 	add	x4, x0, 8
-	cmp	x0, xzr
 	csel	x4, x4, xzr, ne
 	mov	w0, w20
 	bl	NandcXferData
-	adrp	x0, .LANCHOR0
-	ldr	w1, [x29,96]
-	add	x0, x0, :lo12:.LANCHOR0
-	ldr	w2, [x0,76]
+	ldr	w0, [x28, 76]
+	ldr	w1, [x29, 112]
+	add	w1, w1, w0
 	mov	w0, w20
-	add	w1, w2, w1
 	bl	FlashProgSecondCmd
 	mov	w0, w20
 	bl	NandcWaitFlashReady
-	ldr	w1, [x29,96]
+	ldr	w1, [x29, 112]
 	mov	w0, w20
 	bl	FlashReadStatus
-	tbz	x0, 0, .L1711
-	str	w27, [x21]
-.L1711:
+	tbz	x0, 0, .L1702
+	mov	w0, -1
+	str	w0, [x21]
+.L1702:
 	mov	w0, w20
 	bl	NandcFlashDeCs
-.L1708:
-	add	w25, w25, 1
-	add	x21, x21, 56
-	b	.L1706
-.L1732:
-	adrp	x25, .LC107
-	adrp	x26, .LC106
-	adrp	x27, .LC105
-	mov	w21, 0
-	add	x25, x25, :lo12:.LC107
-	add	x26, x26, :lo12:.LC106
-	add	x27, x27, :lo12:.LC105
-.L1713:
-	cmp	w21, w23
-	beq	.L1733
+	b	.L1699
+.L1711:
 	ldr	w0, [x19]
 	cmn	w0, #1
-	bne	.L1714
+	bne	.L1705
+	ldr	w1, [x19, 4]
 	adrp	x0, .LC103
-	ldr	w1, [x19,4]
 	add	x0, x0, :lo12:.LC103
 	bl	printk
-	b	.L1715
-.L1714:
-	adrp	x20, .LANCHOR4
-	sub	w4, w23, w21
-	add	x22, x20, :lo12:.LANCHOR4
-	add	x3, x29, 100
-	mov	w1, w24
-	add	x2, x29, 96
+.L1706:
+	sub	w22, w22, #1
+	add	x19, x19, 56
+	and	w22, w22, 255
+	b	.L1704
+.L1705:
+	add	x20, x23, :lo12:.LANCHOR4
+	mov	w4, w22
+	add	x3, x29, 116
+	add	x2, x29, 112
+	mov	w1, w25
 	mov	x0, x19
 	bl	LogAddr2PhyAddr
-	ldr	x0, [x22,1664]
-	mov	x1, x19
+	ldr	x0, [x20, 1672]
 	mov	x2, 56
+	mov	x1, x19
 	str	wzr, [x0]
-	ldr	x0, [x22,1672]
+	ldr	x0, [x20, 1680]
 	str	wzr, [x0]
-	add	x0, x29, 104
+	add	x0, x29, 120
 	bl	memcpy
-	ldr	x0, [x22,1664]
+	ldr	x0, [x20, 1672]
+	mov	w2, w25
+	str	x0, [x29, 128]
 	mov	w1, 1
-	str	x0, [x29,112]
-	mov	w2, w24
-	ldr	x0, [x22,1672]
-	str	x0, [x29,120]
-	add	x0, x29, 104
+	ldr	x0, [x20, 1680]
+	str	x0, [x29, 136]
+	add	x0, x29, 120
 	bl	FlashReadPages
-	ldr	w22, [x29,104]
-	cmn	w22, #1
-	bne	.L1716
+	ldr	w20, [x29, 120]
+	cmn	w20, #1
+	bne	.L1707
+	ldr	w1, [x19, 4]
 	adrp	x0, .LC104
-	ldr	w1, [x19,4]
 	add	x0, x0, :lo12:.LC104
 	bl	printk
-	str	w22, [x19]
-.L1716:
-	ldr	w22, [x29,104]
-	cmp	w22, 256
-	bne	.L1717
-	ldr	w1, [x19,4]
-	mov	x0, x27
+	str	w20, [x19]
+.L1707:
+	ldr	w20, [x29, 120]
+	cmp	w20, 256
+	bne	.L1708
+	ldr	w1, [x19, 4]
+	adrp	x0, .LC105
+	add	x0, x0, :lo12:.LC105
 	bl	printk
-	str	w22, [x19]
-.L1717:
-	ldr	x0, [x19,16]
-	cbz	x0, .L1718
+	str	w20, [x19]
+.L1708:
+	ldr	x0, [x19, 16]
+	cbz	x0, .L1709
 	ldr	w2, [x0]
-	add	x0, x20, :lo12:.LANCHOR4
-	ldr	x0, [x0,1672]
+	ldr	x0, [x24, 1680]
 	ldr	w3, [x0]
 	cmp	w2, w3
-	beq	.L1718
-	ldr	w1, [x19,4]
-	mov	x0, x26
+	beq	.L1709
+	ldr	w1, [x19, 4]
+	adrp	x0, .LC106
+	add	x0, x0, :lo12:.LC106
 	bl	printk
 	mov	w0, -1
 	str	w0, [x19]
-.L1718:
-	ldr	x0, [x19,8]
-	cbz	x0, .L1715
-	add	x20, x20, :lo12:.LANCHOR4
+.L1709:
+	ldr	x0, [x19, 8]
+	cbz	x0, .L1706
 	ldr	w2, [x0]
-	ldr	x0, [x20,1664]
+	ldr	x0, [x24, 1672]
 	ldr	w3, [x0]
 	cmp	w2, w3
-	beq	.L1715
-	ldr	w1, [x19,4]
-	mov	x0, x25
+	beq	.L1706
+	ldr	w1, [x19, 4]
+	adrp	x0, .LC107
+	add	x0, x0, :lo12:.LC107
 	bl	printk
 	mov	w0, -1
 	str	w0, [x19]
-.L1715:
-	add	w21, w21, 1
-	add	x19, x19, 56
-	b	.L1713
-.L1733:
-	mov	w0, 0
-	ldr	x27, [sp,80]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 160
-	ret
+	b	.L1706
 	.size	FlashProgSlc2KPages, .-FlashProgSlc2KPages
 	.align	2
 	.global	FtlLoadFactoryBbt
 	.type	FtlLoadFactoryBbt, %function
 FtlLoadFactoryBbt:
-	stp	x29, x30, [sp, -80]!
+	stp	x29, x30, [sp, -96]!
 	adrp	x0, .LANCHOR2
-	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x19, .LANCHOR4
 	add	x0, x0, :lo12:.LANCHOR2
-	add	x19, x19, :lo12:.LANCHOR4
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	stp	x23, x24, [sp,48]
-	add	x19, x19, 1704
-	adrp	x22, .LANCHOR0
-	ldr	x1, [x0,3616]
-	add	x21, x22, :lo12:.LANCHOR0
-	ldr	x24, [x0,3664]
-	add	x21, x21, 2624
-	str	x1, [x19,8]
+	add	x29, sp, 0
+	stp	x23, x24, [sp, 48]
 	mov	w23, 0
-	str	x24, [x19,16]
-	mov	w25, -1
-	mov	w26, 61664
-.L1735:
-	add	x0, x22, :lo12:.LANCHOR0
-	ldrh	w1, [x0,2494]
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR4
+	stp	x21, x22, [sp, 32]
+	add	x20, x20, :lo12:.LANCHOR4
+	stp	x25, x26, [sp, 64]
+	add	x20, x20, 1712
+	str	x27, [sp, 80]
+	mov	x26, x20
+	mov	w27, 61664
+	ldr	x1, [x0, 3608]
+	ldr	x25, [x0, 3656]
+	adrp	x0, .LANCHOR0
+	add	x21, x0, :lo12:.LANCHOR0
+	mov	x24, x0
+	add	x21, x21, 2636
+	stp	x1, x25, [x20, 8]
+.L1725:
+	add	x0, x24, :lo12:.LANCHOR0
+	ldrh	w1, [x0, 2494]
 	cmp	w23, w1
-	bcs	.L1744
-	ldrh	w20, [x0,2542]
-	strh	w25, [x21,12]
-.L1737:
-	add	x0, x22, :lo12:.LANCHOR0
-	sub	w20, w20, #1
-	uxth	w20, w20
-	ldrh	w0, [x0,2542]
+	bcc	.L1730
+	mov	w0, 0
+	ldr	x27, [sp, 80]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 96
+	ret
+.L1730:
+	ldrh	w19, [x0, 2542]
+	mov	x22, x0
+	mov	w1, -1
+	strh	w1, [x21]
+	sub	w19, w19, #1
+	and	w19, w19, 65535
+.L1726:
+	ldrh	w0, [x22, 2542]
 	sub	w1, w0, #16
-	cmp	w20, w1
-	ble	.L1738
-	madd	w0, w23, w0, w20
-	mov	w1, 1
+	cmp	w19, w1
+	ble	.L1728
+	madd	w0, w0, w23, w19
+	mov	w2, 1
+	mov	w1, w2
 	lsl	w0, w0, 10
-	mov	w2, w1
-	str	w0, [x19,4]
-	mov	x0, x19
+	str	w0, [x26, 4]
+	mov	x0, x20
 	bl	FlashReadPages
-	ldr	w0, [x19]
+	ldr	w0, [x26]
 	cmn	w0, #1
-	beq	.L1737
-	ldrh	w0, [x24]
-	cmp	w0, w26
-	bne	.L1737
-	strh	w20, [x21,12]
-.L1738:
+	beq	.L1727
+	ldrh	w0, [x25]
+	cmp	w0, w27
+	bne	.L1727
+	strh	w19, [x21]
+.L1728:
 	add	w23, w23, 1
 	add	x21, x21, 2
-	b	.L1735
-.L1744:
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 80
-	ret
+	b	.L1725
+.L1727:
+	sub	w19, w19, #1
+	and	w19, w19, 65535
+	b	.L1726
 	.size	FtlLoadFactoryBbt, .-FtlLoadFactoryBbt
 	.align	2
 	.global	FtlGetLastWrittenPage
 	.type	FtlGetLastWrittenPage, %function
 FtlGetLastWrittenPage:
-	stp	x29, x30, [sp, -208]!
+	stp	x29, x30, [sp, -192]!
 	cmp	w1, 1
-	adrp	x3, .LANCHOR0
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	str	x25, [sp,64]
+	stp	x23, x24, [sp, 48]
 	mov	w23, w1
-	add	x3, x3, :lo12:.LANCHOR0
-	bne	.L1746
-	ldrh	w19, [x3,2546]
-	b	.L1747
-.L1746:
-	ldrh	w19, [x3,2544]
-.L1747:
+	stp	x19, x20, [sp, 16]
+	adrp	x1, .LANCHOR0
+	stp	x21, x22, [sp, 32]
+	add	x1, x1, :lo12:.LANCHOR0
+	bne	.L1736
+	ldrh	w19, [x1, 2546]
+.L1737:
 	sub	w19, w19, #1
 	lsl	w21, w0, 10
-	mov	w1, 1
-	mov	w2, w23
 	sxth	w19, w19
-	str	xzr, [x29,96]
+	add	x1, x29, 128
 	orr	w0, w19, w21
-	str	w0, [x29,92]
-	add	x0, x29, 88
-	add	x24, x29, 144
-	str	x24, [x29,104]
+	stp	xzr, x1, [x29, 80]
+	str	w0, [x29, 76]
+	mov	w2, w23
+	mov	w1, 1
+	add	x0, x29, 72
 	bl	FlashReadPages
-	ldr	w0, [x29,144]
+	ldr	w0, [x29, 128]
 	cmn	w0, #1
-	bne	.L1748
+	bne	.L1738
 	mov	w22, 0
-	mov	w25, 2
-.L1749:
+	mov	w24, 2
+.L1739:
 	cmp	w22, w19
-	bgt	.L1748
-	add	w3, w22, w19
-	mov	w1, 1
+	ble	.L1742
+.L1738:
+	mov	w0, w19
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 192
+	ret
+.L1736:
+	ldrh	w19, [x1, 2544]
+	b	.L1737
+.L1742:
+	add	w20, w22, w19
 	mov	w2, w23
-	sdiv	w20, w3, w25
+	mov	w1, 1
+	sdiv	w20, w20, w24
 	sxth	w0, w20
 	orr	w0, w0, w21
-	str	w0, [x29,92]
-	add	x0, x29, 88
+	str	w0, [x29, 76]
+	add	x0, x29, 72
 	bl	FlashReadPages
-	ldr	w0, [x24]
+	ldr	w0, [x29, 128]
 	cmn	w0, #1
-	bne	.L1750
-	ldr	w0, [x24,4]
+	bne	.L1740
+	ldr	w0, [x29, 132]
 	cmn	w0, #1
-	bne	.L1750
-	ldr	w0, [x29,88]
+	bne	.L1740
+	ldr	w0, [x29, 72]
 	cmn	w0, #1
-	beq	.L1750
+	beq	.L1740
 	sub	w19, w20, #1
 	sxth	w19, w19
-	b	.L1749
-.L1750:
+	b	.L1739
+.L1740:
 	add	w20, w20, 1
 	sxth	w22, w20
-	b	.L1749
-.L1748:
-	mov	w0, w19
-	ldr	x25, [sp,64]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 208
-	ret
+	b	.L1739
 	.size	FtlGetLastWrittenPage, .-FtlGetLastWrittenPage
 	.align	2
 	.global	FtlLoadBbt
@@ -11257,183 +11115,180 @@ FtlGetLastWrittenPage:
 FtlLoadBbt:
 	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
+	stp	x23, x24, [sp, 48]
 	adrp	x24, .LANCHOR2
-	adrp	x23, .LANCHOR4
 	add	x0, x24, :lo12:.LANCHOR2
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	add	x19, x23, :lo12:.LANCHOR4
-	adrp	x20, .LANCHOR0
-	ldr	x1, [x0,3616]
-	add	x19, x19, 1704
-	ldr	x22, [x0,3664]
-	mov	w25, 61649
-	str	x1, [x19,8]
-	str	x22, [x19,16]
+	stp	x19, x20, [sp, 16]
+	stp	x25, x26, [sp, 64]
+	adrp	x23, .LANCHOR4
+	stp	x21, x22, [sp, 32]
+	add	x20, x23, :lo12:.LANCHOR4
+	add	x20, x20, 1712
+	adrp	x19, .LANCHOR0
+	ldr	x1, [x0, 3608]
+	add	x25, x19, :lo12:.LANCHOR0
+	ldr	x22, [x0, 3656]
+	mov	w26, 61649
+	stp	x1, x22, [x20, 8]
 	bl	FtlBbtMemInit
-	add	x0, x20, :lo12:.LANCHOR0
-	ldrh	w21, [x0,2542]
+	ldrh	w21, [x25, 2542]
 	sub	w21, w21, #1
-	uxth	w21, w21
-.L1757:
-	add	x0, x20, :lo12:.LANCHOR0
-	ldrh	w0, [x0,2542]
+	and	w21, w21, 65535
+.L1748:
+	ldrh	w0, [x25, 2542]
 	sub	w0, w0, #48
 	cmp	w21, w0
-	ble	.L1760
+	ble	.L1751
 	lsl	w0, w21, 10
-	mov	w1, 1
-	str	w0, [x19,4]
-	mov	w2, w1
-	mov	x0, x19
+	mov	w2, 1
+	str	w0, [x20, 4]
+	mov	w1, w2
+	mov	x0, x20
 	bl	FlashReadPages
-	ldr	w0, [x19]
+	ldr	w0, [x20]
 	cmn	w0, #1
-	bne	.L1758
-	ldr	w0, [x19,4]
-	mov	w1, 1
-	mov	w2, w1
+	bne	.L1749
+	ldr	w0, [x20, 4]
+	mov	w2, 1
+	mov	w1, w2
 	add	w0, w0, 1
-	str	w0, [x19,4]
-	mov	x0, x19
+	str	w0, [x20, 4]
+	mov	x0, x20
 	bl	FlashReadPages
-.L1758:
-	ldr	w0, [x19]
+.L1749:
+	ldr	w0, [x20]
 	cmn	w0, #1
-	beq	.L1759
+	beq	.L1750
 	ldrh	w0, [x22]
-	cmp	w0, w25
-	bne	.L1759
-	add	x1, x20, :lo12:.LANCHOR0
+	cmp	w0, w26
+	bne	.L1750
+	add	x1, x19, :lo12:.LANCHOR0
 	add	x0, x1, 2624
-	strh	w21, [x1,2624]
-	ldr	w1, [x22,4]
-	str	w1, [x0,8]
-	ldrh	w1, [x22,8]
-	strh	w1, [x0,4]
-	b	.L1760
-.L1759:
-	sub	w21, w21, #1
-	uxth	w21, w21
-	b	.L1757
-.L1760:
-	add	x21, x20, :lo12:.LANCHOR0
-	mov	w2, 65535
-	mov	w0, -1
-	ldrh	w1, [x21,2624]
-	cmp	w1, w2
-	beq	.L1762
-	ldrh	w1, [x21,2628]
-	cmp	w1, w2
-	beq	.L1764
+	strh	w21, [x1, 2624]
+	ldr	w1, [x22, 4]
+	str	w1, [x0, 8]
+	ldrh	w1, [x22, 8]
+	strh	w1, [x0, 4]
+.L1751:
+	add	x21, x19, :lo12:.LANCHOR0
+	mov	w0, 65535
+	ldrh	w1, [x21, 2624]
+	cmp	w1, w0
+	beq	.L1765
+	ldrh	w1, [x21, 2628]
+	cmp	w1, w0
+	beq	.L1755
 	add	x25, x23, :lo12:.LANCHOR4
 	lsl	w1, w1, 10
-	add	x0, x25, 1704
-	str	w1, [x0,4]
-	mov	w1, 1
-	mov	w2, w1
+	add	x0, x25, 1712
+	mov	w2, 1
+	str	w1, [x0, 4]
+	mov	w1, w2
 	bl	FlashReadPages
-	ldr	w0, [x25,1704]
+	ldr	w0, [x25, 1712]
 	cmn	w0, #1
-	beq	.L1764
+	beq	.L1755
 	ldrh	w1, [x22]
 	mov	w0, 61649
 	cmp	w1, w0
-	bne	.L1764
-	ldr	w0, [x22,4]
-	ldr	w1, [x21,2632]
+	bne	.L1755
+	ldr	w1, [x21, 2632]
+	ldr	w0, [x22, 4]
 	cmp	w0, w1
-	bls	.L1764
-	str	w0, [x21,2632]
-	ldrh	w1, [x21,2628]
-	ldrh	w0, [x22,8]
-	strh	w1, [x21,2624]
-	strh	w0, [x21,2628]
-.L1764:
-	add	x25, x20, :lo12:.LANCHOR0
-	mov	w1, 1
+	bls	.L1755
+	str	w0, [x21, 2632]
+	ldrh	w1, [x21, 2628]
+	ldrh	w0, [x22, 8]
+	strh	w1, [x21, 2624]
+	strh	w0, [x21, 2628]
+.L1755:
+	add	x25, x19, :lo12:.LANCHOR0
 	add	x21, x23, :lo12:.LANCHOR4
-	mov	w26, 61649
-	add	x21, x21, 1704
-	ldrh	w0, [x25,2624]
+	add	x21, x21, 1712
+	add	x26, x24, :lo12:.LANCHOR2
+	mov	w1, 1
+	ldrh	w0, [x25, 2624]
 	bl	FtlGetLastWrittenPage
-	sxth	w19, w0
+	sxth	w20, w0
 	add	w0, w0, 1
-	strh	w0, [x25,2626]
-.L1766:
-	tbnz	w19, #31, .L1771
-	ldrh	w0, [x25,2624]
-	mov	w1, 1
-	mov	w2, w1
-	orr	w0, w19, w0, lsl 10
-	str	w0, [x21,4]
-	add	x0, x24, :lo12:.LANCHOR2
-	ldr	x0, [x0,3616]
-	str	x0, [x21,8]
+	strh	w0, [x25, 2626]
+.L1757:
+	tbnz	w20, #31, .L1762
+	ldrh	w0, [x25, 2624]
+	mov	w2, 1
+	mov	w1, w2
+	orr	w0, w20, w0, lsl 10
+	str	w0, [x21, 4]
+	ldr	x0, [x26, 3608]
+	str	x0, [x21, 8]
 	mov	x0, x21
 	bl	FlashReadPages
 	ldr	w0, [x21]
 	cmn	w0, #1
-	beq	.L1767
-	ldrh	w0, [x22]
-	cmp	w0, w26
-	bne	.L1767
-.L1771:
-	add	x1, x20, :lo12:.LANCHOR0
-	ldrh	w0, [x22,10]
+	beq	.L1758
+	ldrh	w1, [x22]
+	mov	w0, 61649
+	cmp	w1, w0
+	bne	.L1758
+.L1762:
+	add	x1, x19, :lo12:.LANCHOR0
+	ldrh	w0, [x22, 10]
 	mov	w2, 65535
-	strh	w0, [x1,2630]
-	ldrh	w0, [x22,12]
+	strh	w0, [x1, 2630]
+	ldrh	w0, [x22, 12]
 	cmp	w0, w2
-	bne	.L1768
-	b	.L1769
-.L1767:
-	sub	w19, w19, #1
-	sxth	w19, w19
-	b	.L1766
-.L1768:
-	ldr	w2, [x1,2468]
+	bne	.L1759
+.L1760:
+	add	x19, x19, :lo12:.LANCHOR0
+	add	x24, x24, :lo12:.LANCHOR2
+	add	x21, x19, 2656
+	add	x23, x23, :lo12:.LANCHOR4
+	mov	w20, 0
+.L1763:
+	ldrh	w0, [x19, 2494]
+	cmp	w20, w0
+	bcc	.L1764
+	mov	w0, 0
+.L1747:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	ret
+.L1750:
+	sub	w21, w21, #1
+	and	w21, w21, 65535
+	b	.L1748
+.L1758:
+	sub	w20, w20, #1
+	sxth	w20, w20
+	b	.L1757
+.L1759:
+	ldr	w2, [x1, 2468]
 	cmp	w0, w2
-	beq	.L1769
-	ldrh	w1, [x1,2482]
+	beq	.L1760
+	ldrh	w1, [x1, 2482]
 	lsr	w1, w1, 2
-	cmp	w0, w1
-	bcs	.L1769
 	cmp	w2, w1
-	bcs	.L1769
+	bcs	.L1760
+	cmp	w0, w1
+	bcs	.L1760
 	bl	FtlSysBlkNumInit
-.L1769:
-	add	x20, x20, :lo12:.LANCHOR0
-	mov	x19, 0
-	add	x21, x20, 2624
-	add	x23, x23, :lo12:.LANCHOR4
-.L1772:
-	ldrh	w0, [x20,2494]
-	mov	w1, w19
-	add	x19, x19, 1
-	cmp	w1, w0
-	bcs	.L1790
-	add	x0, x24, :lo12:.LANCHOR2
-	ldr	x3, [x23,1712]
-	ldrh	w2, [x0,3792]
-	add	x0, x21, x19, lsl 3
-	mul	w1, w1, w2
-	ldr	x0, [x0,24]
+	b	.L1760
+.L1764:
+	ldrh	w2, [x24, 3784]
+	ldr	x0, [x23, 1720]
+	mul	w1, w2, w20
 	lsl	w2, w2, 2
-	add	x1, x3, x1, lsl 2
+	add	w20, w20, 1
+	add	x1, x0, x1, lsl 2
+	ldr	x0, [x21], 8
 	bl	ftl_memcpy
-	b	.L1772
-.L1790:
-	mov	w0, 0
-.L1762:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 80
-	ret
+	b	.L1763
+.L1765:
+	mov	w0, -1
+	b	.L1747
 	.size	FtlLoadBbt, .-FtlLoadBbt
 	.align	2
 	.global	FtlScanSysBlk
@@ -11442,909 +11297,846 @@ FtlScanSysBlk:
 	stp	x29, x30, [sp, -128]!
 	mov	w1, 0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x19, .LANCHOR0
-	stp	x21, x22, [sp,32]
-	add	x20, x19, :lo12:.LANCHOR0
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
 	adrp	x22, .LANCHOR2
-	add	x21, x22, :lo12:.LANCHOR2
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	strh	wzr, [x21,3864]
-	mov	x24, x22
-	ldr	w2, [x20,2572]
-	mov	w22, 65535
-	ldr	x0, [x21,3776]
+	add	x19, x22, :lo12:.LANCHOR2
+	stp	x23, x24, [sp, 48]
+	adrp	x23, .LANCHOR0
+	add	x20, x23, :lo12:.LANCHOR0
+	stp	x25, x26, [sp, 64]
+	mov	w25, 56
+	ldr	x0, [x19, 3768]
+	ldr	w2, [x20, 2572]
+	stp	x27, x28, [sp, 80]
+	strh	wzr, [x19, 3856]
 	lsl	w2, w2, 2
-	strh	wzr, [x20,2590]
+	strh	wzr, [x20, 2590]
 	bl	ftl_memset
-	ldr	w2, [x20,2572]
+	ldr	x0, [x19, 3712]
 	mov	w1, 0
-	ldr	x0, [x21,3720]
+	ldr	w2, [x20, 2572]
 	lsl	w2, w2, 1
 	bl	ftl_memset
-	ldrh	w2, [x20,2564]
+	ldr	x0, [x19, 3736]
 	mov	w1, 0
-	ldr	x0, [x21,3744]
+	ldrh	w2, [x20, 2564]
 	lsl	w2, w2, 2
 	bl	ftl_memset
-	ldrh	w2, [x20,2564]
+	ldr	x0, [x20, 2592]
 	mov	w1, 0
-	ldr	x0, [x20,2592]
+	ldrh	w2, [x20, 2564]
 	lsl	w2, w2, 1
 	bl	ftl_memset
-	add	x0, x21, 784
-	mov	w1, 255
 	mov	w2, 16
+	mov	w1, 255
+	add	x0, x19, 784
 	bl	ftl_memset
-	ldrh	w21, [x20,2480]
-.L1792:
-	add	x1, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x1,2482]
-	cmp	w0, w21
-	bls	.L1833
-	mov	x27, 0
-	ldrh	w5, [x1,2472]
-	ldrh	w4, [x1,2556]
-	mov	w20, w27
-	mov	x23, x1
-.L1834:
-	cmp	w5, w27, uxth
-	bls	.L1867
-	add	x0, x23, 2504
-	mov	w1, w21
-	str	x4, [x29,112]
-	str	x5, [x29,120]
-	ldrb	w0, [x0,x27]
+	ldrh	w24, [x20, 2480]
+	add	x0, x20, 2504
+	str	x0, [x29, 112]
+.L1777:
+	ldrh	w0, [x20, 2482]
+	cmp	w0, w24
+	bls	.L1816
+	ldrh	w9, [x20, 2472]
+	mov	x6, 0
+	ldrh	w8, [x20, 2556]
+	mov	w21, 0
+	add	x5, x22, :lo12:.LANCHOR2
+	mov	w7, 4
+	b	.L1817
+.L1779:
+	ldr	x0, [x29, 112]
+	mov	w1, w24
+	ldrb	w0, [x0, x6]
 	bl	V2P_block
-	uxth	w28, w0
+	and	w4, w0, 65535
 	bl	FtlBbmIsBadBlock
-	ldr	x5, [x29,120]
-	ldr	x4, [x29,112]
-	cbnz	w0, .L1793
-	add	x2, x24, :lo12:.LANCHOR2
-	mov	w0, 56
-	lsl	w28, w28, 10
-	mov	w3, 4
-	umull	x0, w20, w0
-	ldr	x1, [x2,3592]
-	add	x1, x1, x0
-	str	w28, [x1,4]
-	ldr	x1, [x2,3592]
-	add	x0, x1, x0
-	ldr	x1, [x2,1400]
-	ldr	x2, [x2,1408]
-	str	x1, [x0,8]
-	mul	w1, w20, w4
-	add	w20, w20, 1
-	sdiv	w1, w1, w3
-	uxth	w20, w20
-	add	x1, x2, w1, sxtw 2
-	str	x1, [x0,16]
-.L1793:
-	add	x27, x27, 1
-	b	.L1834
-.L1867:
-	cbz	w20, .L1796
-	add	x0, x24, :lo12:.LANCHOR2
-	mov	w1, w20
+	cbnz	w0, .L1778
+	umull	x2, w21, w25
+	ldr	x0, [x5, 3584]
+	lsl	w4, w4, 10
+	add	x0, x0, x2
+	str	w4, [x0, 4]
+	ldr	x1, [x5, 3584]
+	ldr	x0, [x5, 1392]
+	add	x1, x1, x2
+	ldr	x2, [x5, 1400]
+	str	x0, [x1, 8]
+	mul	w0, w21, w8
+	add	w21, w21, 1
+	and	w21, w21, 65535
+	sdiv	w0, w0, w7
+	add	x0, x2, w0, sxtw 2
+	str	x0, [x1, 16]
+.L1778:
+	add	x6, x6, 1
+.L1817:
+	cmp	w9, w6, uxth
+	bhi	.L1779
+	cbnz	w21, .L1780
+.L1815:
+	add	w24, w24, 1
+	and	w24, w24, 65535
+	b	.L1777
+.L1780:
+	add	x19, x22, :lo12:.LANCHOR2
 	mov	w2, 1
-	mov	x23, 0
-	mov	w27, -1
-	mov	w28, 61604
-	ldr	x0, [x0,3592]
+	mov	w1, w21
+	add	x27, x19, 784
+	mov	x26, 0
+	ldr	x0, [x19, 3584]
 	bl	FlashReadPages
-.L1797:
-	cmp	w20, w23, uxth
-	bls	.L1796
-	mov	x0, 56
-	mul	x6, x23, x0
-	add	x0, x24, :lo12:.LANCHOR2
-	ldr	x0, [x0,3592]
-	add	x1, x0, x6
-	ldr	w0, [x0,x6]
-	ldr	w5, [x1,4]
+	umull	x0, w21, w25
+	str	x0, [x29, 120]
+.L1814:
+	ldr	x0, [x19, 3584]
+	add	x1, x0, x26
+	ldr	w0, [x0, x26]
+	ldr	w28, [x1, 4]
 	cmn	w0, #1
-	ldr	x26, [x1,16]
-	ubfx	x25, x5, 10, 16
-	bne	.L1799
-	mov	w7, 16
-.L1798:
-	add	x8, x24, :lo12:.LANCHOR2
-	str	x7, [x29,104]
-	str	x8, [x29,112]
-	str	x6, [x29,120]
-	ldr	x0, [x8,3592]
-	add	x0, x0, x6
-	ldr	w1, [x0,4]
+	ldr	x21, [x1, 16]
+	ubfx	x28, x28, 10, 16
+	bne	.L1783
+	mov	w6, 16
+	mov	w7, 65535
+.L1785:
+	ldr	x0, [x19, 3584]
+	mov	w2, 1
+	stp	w7, w6, [x29, 104]
+	add	x0, x0, x26
+	ldr	w1, [x0, 4]
 	add	w1, w1, 1
-	str	w1, [x0,4]
-	mov	w1, 1
-	ldr	x0, [x8,3592]
-	mov	w2, w1
-	add	x0, x0, x6
+	str	w1, [x0, 4]
+	mov	w1, w2
+	ldr	x0, [x19, 3584]
+	add	x0, x0, x26
 	bl	FlashReadPages
-	ldrh	w0, [x26]
-	ldr	x8, [x29,112]
-	cmp	w0, w22
-	ldr	x6, [x29,120]
-	ldr	x7, [x29,104]
-	ldr	x0, [x8,3592]
-	bne	.L1800
-	str	w27, [x0,x6]
-	b	.L1799
-.L1800:
-	ldr	w0, [x0,x6]
-	cmn	w0, #1
-	bne	.L1799
-	sub	w7, w7, #1
-	uxth	w7, w7
-	cbnz	w7, .L1798
-.L1799:
-	add	x0, x24, :lo12:.LANCHOR2
-	ldr	x1, [x0,3592]
-	ldr	w1, [x1,x6]
-	cmn	w1, #1
-	beq	.L1802
-	ldr	w0, [x0,752]
-	cmn	w0, #1
-	beq	.L1803
-	ldr	w1, [x26,4]
+	ldp	w7, w6, [x29, 104]
+	ldrh	w0, [x21]
+	cmp	w0, w7
+	ldr	x0, [x19, 3584]
+	bne	.L1782
+	mov	w1, -1
+	str	w1, [x0, x26]
+	ldr	x0, [x19, 3584]
+	ldr	w0, [x0, x26]
 	cmp	w0, w1
-	bhi	.L1804
-.L1803:
-	ldr	w0, [x26,4]
+	beq	.L1851
+.L1783:
+	ldr	w0, [x19, 752]
+	ldr	w10, [x21, 4]
 	cmn	w0, #1
-	beq	.L1804
-	add	x1, x24, :lo12:.LANCHOR2
-	add	w0, w0, 1
-	str	w0, [x1,752]
-.L1804:
-	ldrh	w0, [x26]
-	cmp	w0, w28
-	beq	.L1806
-	bhi	.L1807
+	beq	.L1786
+	cmp	w0, w10
+	bhi	.L1787
+.L1786:
+	cmn	w10, #1
+	beq	.L1787
+	add	w0, w10, 1
+	str	w0, [x19, 752]
+.L1787:
+	ldrh	w0, [x21]
+	mov	w1, 61604
+	cmp	w0, w1
+	beq	.L1789
+	bhi	.L1790
 	mov	w1, 61574
 	cmp	w0, w1
-	bne	.L1805
-	add	x0, x19, :lo12:.LANCHOR0
-	add	x7, x24, :lo12:.LANCHOR2
-	ldrh	w6, [x0,2564]
-	ldrh	w0, [x0,2590]
-	sub	w2, w6, #1
-	ldr	x7, [x7,3744]
-	sxth	x1, w2
-	sub	w2, w2, w0
-	b	.L1820
-.L1807:
+	beq	.L1791
+.L1788:
+	ldr	x0, [x29, 120]
+	add	x26, x26, 56
+	cmp	x26, x0
+	bne	.L1814
+	b	.L1815
+.L1782:
+	ldr	w0, [x0, x26]
+	cmn	w0, #1
+	bne	.L1783
+	sub	w6, w6, #1
+	ands	w6, w6, 65535
+	bne	.L1785
+.L1851:
+	mov	w1, 0
+	mov	w0, w28
+	bl	FtlFreeSysBlkQueueIn
+	b	.L1788
+.L1790:
 	mov	w1, 61634
 	cmp	w0, w1
-	beq	.L1809
-	cmp	w0, w22
-	bne	.L1805
-	mov	w0, w25
-	b	.L1866
-.L1809:
-	add	x0, x19, :lo12:.LANCHOR0
-	add	x7, x24, :lo12:.LANCHOR2
-	ldr	w6, [x0,2572]
-	ldrh	w0, [x7,3864]
-	ldr	x7, [x7,3776]
-	uxth	w2, w6
-	sub	w1, w2, #1
-	sub	w2, w2, w0
+	beq	.L1792
+	mov	w1, 65535
+	cmp	w0, w1
+	beq	.L1851
+	b	.L1788
+.L1792:
+	ldr	w6, [x20, 2572]
+	ldrh	w1, [x19, 3856]
+	and	w2, w6, 65535
+	ldr	x7, [x19, 3768]
+	sub	w0, w2, #1
+	sub	w2, w2, w1
 	sub	w2, w2, #1
-	sxth	x1, w1
+	sxth	x0, w0
 	sxth	w2, w2
-.L1811:
-	cmp	w1, w2
-	ble	.L1868
-	sbfiz	x8, x1, 2, 32
-	ldr	w11, [x26,4]
-	sxth	x9, w1
-	ldr	w10, [x7,x8]
-	cmp	w11, w10
-	bls	.L1812
+.L1794:
+	cmp	w0, w2
+	bgt	.L1800
+	tbz	w0, #31, .L1832
+	b	.L1788
+.L1800:
+	sxtw	x8, w0
+	lsl	x9, x8, 2
+	ldr	w11, [x7, x9]
+	cmp	w10, w11
+	bls	.L1795
 	ldr	w2, [x7]
-	cbnz	w2, .L1813
-	cmp	w0, w6
-	beq	.L1813
-	add	x2, x24, :lo12:.LANCHOR2
-	add	w0, w0, 1
-	strh	w0, [x2,3864]
-.L1813:
-	mov	w0, 0
-.L1814:
-	cmp	w0, w1
-	beq	.L1869
-	add	x6, x24, :lo12:.LANCHOR2
-	sxtw	x2, w0
-	lsl	x7, x2, 2
+	cbnz	w2, .L1796
+	cmp	w6, w1
+	beq	.L1796
+	add	w1, w1, 1
+	strh	w1, [x19, 3856]
+.L1796:
+	mov	w1, 0
+.L1797:
+	cmp	w1, w0
+	bne	.L1798
+	ldr	x1, [x19, 3768]
+	ldr	w2, [x21, 4]
+	str	w2, [x1, x9]
+	ldr	x1, [x19, 3712]
+	strh	w28, [x1, x8, lsl 1]
+	tbnz	w0, #31, .L1788
+	ldrh	w1, [x19, 3856]
+	ldr	w2, [x20, 2572]
+	sub	w2, w2, w1
+	sub	w2, w2, #1
+	cmp	w0, w2, sxth
+	bgt	.L1788
+.L1832:
+	add	w1, w1, 1
+	strh	w1, [x19, 3856]
+	ldr	x1, [x19, 3768]
+	ldr	w2, [x21, 4]
+	str	w2, [x1, x0, lsl 2]
+	ldr	x1, [x19, 3712]
+.L1850:
+	strh	w28, [x1, x0, lsl 1]
+	b	.L1788
+.L1798:
+	ldr	x7, [x19, 3768]
+	sxtw	x2, w1
+	lsl	x6, x2, 2
 	lsl	x2, x2, 1
-	add	w0, w0, 1
-	ldr	x10, [x6,3776]
-	sxth	w0, w0
-	add	x11, x10, x7
-	ldr	w11, [x11,4]
-	str	w11, [x10,x7]
-	ldr	x6, [x6,3720]
+	add	x10, x7, x6
+	add	w1, w1, 1
+	sxth	w1, w1
+	ldr	w10, [x10, 4]
+	str	w10, [x7, x6]
+	ldr	x6, [x19, 3712]
 	add	x7, x6, x2
-	ldrh	w7, [x7,2]
-	strh	w7, [x6,x2]
-	b	.L1814
-.L1869:
-	add	x0, x24, :lo12:.LANCHOR2
-	ldr	w6, [x26,4]
-	ldr	x2, [x0,3776]
-	str	w6, [x2,x8]
-	ldr	x2, [x0,3720]
-	strh	w25, [x2,x9,lsl 1]
-	tbz	w1, #31, .L1816
-	b	.L1805
-.L1812:
-	sub	w1, w1, #1
-	sxth	x1, w1
-	b	.L1811
-.L1868:
-	tbz	w1, #31, .L1849
-	b	.L1805
-.L1816:
-	add	x2, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x0,3864]
-	ldr	w2, [x2,2572]
-	sub	w2, w2, w0
-	sub	w2, w2, #1
-	cmp	w1, w2, sxth
-	bgt	.L1805
-.L1849:
-	add	x2, x24, :lo12:.LANCHOR2
-	add	w0, w0, 1
-	ldr	w4, [x26,4]
-	strh	w0, [x2,3864]
-	ldr	x0, [x2,3776]
-	str	w4, [x0,x1,lsl 2]
-	ldr	x0, [x2,3720]
-	b	.L1865
-.L1826:
-	sbfiz	x8, x1, 2, 32
-	ldr	w11, [x26,4]
-	sxth	x9, w1
-	ldr	w10, [x7,x8]
-	cmp	w11, w10
-	bhi	.L1870
-	sub	w1, w1, #1
-	sxth	x1, w1
-.L1820:
-	cmp	w1, w2
-	bgt	.L1826
-	b	.L1825
-.L1870:
+	ldrh	w7, [x7, 2]
+	strh	w7, [x6, x2]
+	b	.L1797
+.L1795:
+	sub	w0, w0, #1
+	sxth	x0, w0
+	b	.L1794
+.L1791:
+	ldrh	w6, [x20, 2564]
+	ldrh	w1, [x20, 2590]
+	sub	w2, w6, #1
+	ldr	x7, [x19, 3736]
+	sxth	x0, w2
+	sub	w2, w2, w1
+.L1803:
+	cmp	w0, w2
+	ble	.L1808
+	sxtw	x8, w0
+	lsl	x9, x8, 2
+	ldr	w11, [x7, x9]
+	cmp	w10, w11
+	bls	.L1804
 	ldr	w2, [x7]
-	cbnz	w2, .L1822
-	cmp	w0, w6
-	beq	.L1822
-	add	x2, x19, :lo12:.LANCHOR0
-	add	w0, w0, 1
-	strh	w0, [x2,2590]
-.L1822:
-	mov	w0, 0
-.L1823:
-	cmp	w0, w1
-	beq	.L1871
-	add	x2, x24, :lo12:.LANCHOR2
-	ldr	x7, [x2,3744]
-	sxtw	x2, w0
+	cbnz	w2, .L1805
+	cmp	w6, w1
+	beq	.L1805
+	add	w1, w1, 1
+	strh	w1, [x20, 2590]
+.L1805:
+	mov	w1, 0
+.L1806:
+	cmp	w1, w0
+	bne	.L1807
+	ldr	x1, [x19, 3736]
+	ldr	w2, [x21, 4]
+	str	w2, [x1, x9]
+	ldr	x1, [x20, 2592]
+	strh	w28, [x1, x8, lsl 1]
+.L1808:
+	tbnz	w0, #31, .L1788
+	ldrh	w1, [x20, 2564]
+	ldrh	w2, [x20, 2590]
+	sub	w1, w1, #1
+	sub	w1, w1, w2
+	cmp	w0, w1, sxth
+	bgt	.L1788
+	ldr	x1, [x19, 3736]
+	add	w2, w2, 1
+	strh	w2, [x20, 2590]
+	ldr	w2, [x21, 4]
+	str	w2, [x1, x0, lsl 2]
+	ldr	x1, [x20, 2592]
+	b	.L1850
+.L1807:
+	ldr	x7, [x19, 3736]
+	sxtw	x2, w1
 	lsl	x6, x2, 2
 	lsl	x2, x2, 1
 	add	x10, x7, x6
-	add	w0, w0, 1
-	sxth	w0, w0
-	ldr	w10, [x10,4]
-	str	w10, [x7,x6]
-	add	x6, x19, :lo12:.LANCHOR0
-	ldr	x6, [x6,2592]
+	add	w1, w1, 1
+	sxth	w1, w1
+	ldr	w10, [x10, 4]
+	str	w10, [x7, x6]
+	ldr	x6, [x20, 2592]
 	add	x7, x6, x2
-	ldrh	w7, [x7,2]
-	strh	w7, [x6,x2]
-	b	.L1823
-.L1871:
-	add	x0, x24, :lo12:.LANCHOR2
-	ldr	w2, [x26,4]
-	ldr	x0, [x0,3744]
-	str	w2, [x0,x8]
-	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x0, [x0,2592]
-	strh	w25, [x0,x9,lsl 1]
-.L1825:
-	tbnz	w1, #31, .L1805
-	add	x2, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x2,2564]
-	ldrh	w6, [x2,2590]
+	ldrh	w7, [x7, 2]
+	strh	w7, [x6, x2]
+	b	.L1806
+.L1804:
 	sub	w0, w0, #1
-	sub	w0, w0, w6
-	cmp	w1, w0, sxth
-	bgt	.L1805
-	add	x0, x24, :lo12:.LANCHOR2
-	add	w6, w6, 1
-	ldr	w4, [x26,4]
-	strh	w6, [x2,2590]
-	ldr	x0, [x0,3744]
-	str	w4, [x0,x1,lsl 2]
-	ldr	x0, [x2,2592]
-.L1865:
-	strh	w25, [x0,x1,lsl 1]
-	b	.L1805
-.L1806:
-	add	x0, x24, :lo12:.LANCHOR2
-	add	x1, x0, 784
-	ldrh	w2, [x0,784]
-	cmp	w2, w22
-	bne	.L1827
-	strh	w25, [x0,784]
-	ldr	w0, [x26,4]
-	str	w0, [x1,8]
-	b	.L1805
-.L1827:
-	ldrh	w0, [x1,4]
-	cmp	w0, w22
-	beq	.L1828
-	mov	w1, 1
-	bl	FtlFreeSysBlkQueueIn
-.L1828:
-	add	x1, x24, :lo12:.LANCHOR2
-	ldr	w2, [x26,4]
-	add	x0, x1, 784
-	ldr	w6, [x0,8]
-	cmp	w6, w2
-	bcs	.L1829
-	ldrh	w2, [x1,784]
-	strh	w2, [x0,4]
-	strh	w25, [x1,784]
-	ldr	w1, [x26,4]
-	str	w1, [x0,8]
-	b	.L1805
-.L1829:
-	strh	w25, [x0,4]
-	b	.L1805
-.L1802:
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w1, [x0,204]
-	mov	w0, w25
-	cbz	w1, .L1830
-.L1866:
-	mov	w1, 0
-.L1830:
-	bl	FtlFreeSysBlkQueueIn
-.L1805:
-	add	x23, x23, 1
-	b	.L1797
-.L1796:
-	add	w21, w21, 1
-	uxth	w21, w21
-	b	.L1792
-.L1833:
-	add	x4, x24, :lo12:.LANCHOR2
-	ldr	x2, [x4,3720]
-	ldrh	w0, [x2]
-	cbz	w0, .L1835
-.L1838:
-	add	x1, x19, :lo12:.LANCHOR0
-	ldr	x2, [x1,2592]
-	ldrh	w0, [x2]
-	cbz	w0, .L1836
-	b	.L1859
-.L1835:
-	ldrh	w4, [x4,3864]
-	cbz	w4, .L1838
-	ldr	w1, [x1,2572]
-.L1839:
+	sxth	x0, w0
+	b	.L1803
+.L1789:
+	ldrh	w0, [x27]
+	mov	w1, 65535
 	cmp	w0, w1
-	bcs	.L1838
-	ldrh	w4, [x2,w0,sxtw 1]
-	cbz	w4, .L1840
-	mov	w7, w0
-.L1841:
-	add	x1, x19, :lo12:.LANCHOR0
-	ldr	w1, [x1,2572]
+	bne	.L1810
+	strh	w28, [x27]
+	str	w10, [x27, 8]
+	b	.L1788
+.L1810:
+	ldrh	w0, [x27, 4]
 	cmp	w0, w1
-	bcs	.L1838
-	add	x2, x24, :lo12:.LANCHOR2
-	sxtw	x6, w0
-	sub	w1, w0, w7
+	beq	.L1811
+	mov	w1, 1
+	bl	FtlFreeSysBlkQueueIn
+.L1811:
+	ldr	w0, [x21, 4]
+	ldr	w1, [x27, 8]
+	cmp	w1, w0
+	bcs	.L1812
+	ldrh	w0, [x27]
+	strh	w0, [x27, 4]
+	strh	w28, [x27]
+	ldr	w0, [x21, 4]
+	str	w0, [x27, 8]
+	b	.L1788
+.L1812:
+	strh	w28, [x27, 4]
+	b	.L1788
+.L1816:
+	add	x0, x22, :lo12:.LANCHOR2
+	ldr	x1, [x0, 3712]
+	ldrh	w2, [x1]
+	cbz	w2, .L1818
+.L1821:
+	add	x0, x23, :lo12:.LANCHOR0
+	ldr	x1, [x0, 2592]
+	ldrh	w2, [x1]
+	cbz	w2, .L1819
+.L1837:
+	ldp	x19, x20, [sp, 16]
+	mov	w0, 0
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 128
+	ret
+.L1818:
+	ldrh	w0, [x0, 3856]
+	cbz	w0, .L1821
+	ldr	w2, [x20, 2572]
+	mov	w0, 0
+.L1822:
+	cmp	w0, w2
+	bcs	.L1821
+	ldrh	w3, [x1, w0, sxtw 1]
+	cbz	w3, .L1823
+	mov	w1, w0
+	add	x7, x23, :lo12:.LANCHOR0
+	add	x3, x22, :lo12:.LANCHOR2
+.L1824:
+	ldr	w2, [x7, 2572]
+	cmp	w1, w2
+	bcs	.L1821
+	ldr	x5, [x3, 3712]
+	sxtw	x6, w1
 	lsl	x4, x6, 1
-	add	w0, w0, 1
-	ldr	x5, [x2,3720]
-	sxtw	x1, w1
-	sxth	w0, w0
-	ldrh	w8, [x5,x4]
-	strh	w8, [x5,x1,lsl 1]
-	ldr	x5, [x2,3776]
-	ldr	w6, [x5,x6,lsl 2]
-	str	w6, [x5,x1,lsl 2]
-	ldr	x1, [x2,3720]
-	strh	wzr, [x1,x4]
-	b	.L1841
-.L1840:
+	sub	w2, w1, w0
+	sxtw	x2, w2
+	add	w1, w1, 1
+	sxth	w1, w1
+	ldrh	w8, [x5, x4]
+	strh	w8, [x5, x2, lsl 1]
+	ldr	x5, [x3, 3768]
+	ldr	w6, [x5, x6, lsl 2]
+	str	w6, [x5, x2, lsl 2]
+	ldr	x2, [x3, 3712]
+	strh	wzr, [x2, x4]
+	b	.L1824
+.L1823:
 	add	w0, w0, 1
 	sxth	w0, w0
-	b	.L1839
-.L1836:
-	ldrh	w4, [x1,2590]
-	cbz	w4, .L1859
-	ldrh	w1, [x1,2564]
-.L1844:
-	cmp	w0, w1
-	mov	w7, w0
-	bge	.L1859
-	ldrh	w4, [x2,w0,sxtw 1]
-	cbz	w4, .L1845
-.L1846:
-	add	x2, x19, :lo12:.LANCHOR0
-	ldrh	w1, [x2,2564]
+	b	.L1822
+.L1819:
+	ldrh	w2, [x0, 2590]
+	cbz	w2, .L1837
+	ldrh	w2, [x0, 2564]
+	mov	w0, 0
+.L1827:
+	mov	w5, w0
+	cmp	w0, w2
+	bge	.L1837
+	ldrh	w3, [x1, w0, sxtw 1]
+	cbz	w3, .L1828
+	add	x23, x23, :lo12:.LANCHOR0
+	add	x22, x22, :lo12:.LANCHOR2
+.L1829:
+	ldrh	w1, [x23, 2564]
 	cmp	w0, w1
-	bge	.L1859
-	sxtw	x6, w0
-	sub	w1, w0, w7
-	ldr	x5, [x2,2592]
-	lsl	x4, x6, 1
+	bge	.L1837
+	ldr	x3, [x23, 2592]
+	sxtw	x4, w0
+	lsl	x2, x4, 1
+	sub	w1, w0, w5
 	sxtw	x1, w1
 	add	w0, w0, 1
-	ldrh	w8, [x5,x4]
 	sxth	w0, w0
-	strh	w8, [x5,x1,lsl 1]
-	add	x5, x24, :lo12:.LANCHOR2
-	ldr	x5, [x5,3744]
-	ldr	w6, [x5,x6,lsl 2]
-	str	w6, [x5,x1,lsl 2]
-	ldr	x1, [x2,2592]
-	strh	wzr, [x1,x4]
-	b	.L1846
-.L1845:
+	ldrh	w6, [x3, x2]
+	strh	w6, [x3, x1, lsl 1]
+	ldr	x3, [x22, 3736]
+	ldr	w4, [x3, x4, lsl 2]
+	str	w4, [x3, x1, lsl 2]
+	ldr	x1, [x23, 2592]
+	strh	wzr, [x1, x2]
+	b	.L1829
+.L1828:
 	add	w0, w0, 1
 	sxth	w0, w0
-	b	.L1844
-.L1859:
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
-	ret
+	b	.L1827
 	.size	FtlScanSysBlk, .-FtlScanSysBlk
 	.align	2
 	.global	FtlLoadSysInfo
 	.type	FtlLoadSysInfo, %function
 FtlLoadSysInfo:
-	sub	sp, sp, #144
+	sub	sp, sp, #112
 	mov	w1, 0
-	stp	x29, x30, [sp,16]
+	stp	x29, x30, [sp, 16]
 	add	x29, sp, 16
-	stp	x23, x24, [sp,64]
-	stp	x21, x22, [sp,48]
+	stp	x19, x20, [sp, 32]
+	adrp	x20, .LANCHOR0
+	stp	x23, x24, [sp, 64]
 	adrp	x23, .LANCHOR4
+	stp	x21, x22, [sp, 48]
+	add	x19, x23, :lo12:.LANCHOR4
 	adrp	x21, .LANCHOR2
-	stp	x19, x20, [sp,32]
 	add	x24, x21, :lo12:.LANCHOR2
-	add	x19, x23, :lo12:.LANCHOR4
-	add	x19, x19, 1704
-	adrp	x20, .LANCHOR0
-	stp	x25, x26, [sp,80]
-	stp	x27, x28, [sp,96]
-	ldr	x0, [x24,3616]
-	add	x25, x24, 784
-	str	x0, [x19,8]
-	ldr	x0, [x24,3664]
-	str	x0, [x19,16]
+	add	x19, x19, 1712
+	stp	x25, x26, [sp, 80]
+	stp	x27, x28, [sp, 96]
+	ldr	x0, [x24, 3608]
+	str	x0, [x19, 8]
+	ldr	x0, [x24, 3656]
+	str	x0, [x19, 16]
 	add	x0, x20, :lo12:.LANCHOR0
-	ldrh	w2, [x0,2480]
-	ldr	x0, [x24,520]
+	ldrh	w2, [x0, 2480]
+	ldr	x0, [x24, 520]
 	lsl	w2, w2, 1
 	bl	ftl_memset
-	str	x23, [x29,120]
-	ldrh	w0, [x24,784]
+	ldrh	w0, [x24, 784]
 	mov	w1, 65535
 	cmp	w0, w1
-	bne	.L1873
-.L1884:
-	mov	w19, -1
-	b	.L1874
-.L1873:
+	bne	.L1853
+.L1864:
+	mov	w0, -1
+.L1852:
+	ldp	x19, x20, [sp, 32]
+	ldp	x21, x22, [sp, 48]
+	ldp	x23, x24, [sp, 64]
+	ldp	x25, x26, [sp, 80]
+	ldp	x27, x28, [sp, 96]
+	ldp	x29, x30, [sp, 16]
+	add	sp, sp, 112
+	ret
+.L1853:
+	add	x25, x24, 784
 	mov	w1, 1
-	adrp	x26, .LC108
-	add	x26, x26, :lo12:.LC108
 	bl	FtlGetLastWrittenPage
-	ldrsh	w23, [x24,784]
+	ldrsh	w28, [x24, 784]
+	mov	w26, 19539
 	sxth	w22, w0
+	movk	w26, 0x4654, lsl 16
 	add	w0, w0, 1
-	strh	w0, [x25,2]
-.L1875:
-	tbnz	w22, #31, .L1883
-	orr	w0, w22, w23, lsl 10
-	mov	w1, 1
-	str	w0, [x19,4]
-	mov	w2, w1
-	ldr	x0, [x24,3616]
+	strh	w0, [x25, 2]
+.L1855:
+	tbnz	w22, #31, .L1863
+	orr	w0, w22, w28, lsl 10
 	add	x27, x20, :lo12:.LANCHOR0
-	str	x0, [x19,8]
+	str	w0, [x19, 4]
+	mov	w2, 1
+	ldr	x0, [x24, 3608]
+	mov	w1, w2
+	str	x0, [x19, 8]
 	mov	x0, x19
 	bl	FlashReadPages
-	ldrb	w0, [x27,72]
-	cbz	w0, .L1876
-	ldr	x25, [x19,16]
-	ldr	w7, [x25,12]
-	cbz	w7, .L1876
-	ldr	x2, [x19,8]
-	ldrh	w1, [x27,2554]
-	mov	x0, x2
-	str	x7, [x29,104]
-	str	x2, [x29,112]
+	ldrb	w0, [x27, 72]
+	cbz	w0, .L1856
+	ldr	x8, [x19, 16]
+	ldr	w7, [x8, 12]
+	cbz	w7, .L1856
+	ldr	x6, [x19, 8]
+	ldrh	w1, [x27, 2554]
+	mov	x0, x6
 	bl	js_hash
-	ldr	x7, [x29,104]
 	cmp	w7, w0
-	beq	.L1876
-	ldr	x2, [x29,112]
-	cbnz	w22, .L1877
-	ldrh	w0, [x24,788]
-	cmp	w23, w0
-	beq	.L1877
-	ldr	w0, [x2]
+	beq	.L1856
+	cbnz	w22, .L1857
+	ldrh	w0, [x25, 4]
+	cmp	w28, w0
+	beq	.L1857
+	ldr	w0, [x6]
+	ldrh	w1, [x25]
 	str	w0, [sp]
-	mov	x0, x26
-	ldrh	w1, [x24,784]
-	ldr	w2, [x19]
-	ldr	w3, [x19,4]
-	ldr	w4, [x25]
-	ldr	w5, [x25,4]
-	ldr	w6, [x25,8]
+	adrp	x0, .LC108
+	add	x0, x0, :lo12:.LC108
+	ldp	w4, w5, [x8]
+	ldr	w6, [x8, 8]
+	ldp	w2, w3, [x19]
 	bl	printk
-	ldrsh	w23, [x24,788]
-	ldrh	w22, [x27,2546]
-	b	.L1879
-.L1877:
+	ldrsh	w28, [x25, 4]
+	ldrh	w22, [x27, 2546]
+.L1859:
+	sub	w22, w22, #1
+	sxth	w22, w22
+	b	.L1855
+.L1857:
 	mov	w0, -1
 	str	w0, [x19]
-.L1876:
+.L1856:
 	ldr	w0, [x19]
 	cmn	w0, #1
-	beq	.L1879
-	ldr	x0, [x24,3616]
-	ldr	w1, [x0]
-	mov	w0, 19539
-	movk	w0, 0x4654, lsl 16
-	cmp	w1, w0
-	bne	.L1879
-	ldr	x0, [x24,3664]
+	beq	.L1859
+	ldr	x0, [x24, 3608]
+	ldr	w0, [x0]
+	cmp	w0, w26
+	bne	.L1859
+	ldr	x0, [x24, 3656]
 	ldrh	w1, [x0]
 	mov	w0, 61604
 	cmp	w1, w0
-	bne	.L1879
-.L1883:
-	ldr	x0, [x29,120]
+	bne	.L1859
+.L1863:
+	add	x19, x23, :lo12:.LANCHOR4
 	add	x24, x21, :lo12:.LANCHOR2
+	add	x19, x19, 1712
 	add	x22, x20, :lo12:.LANCHOR0
 	mov	w2, 48
-	add	x19, x0, :lo12:.LANCHOR4
 	add	x0, x24, 456
-	add	x19, x19, 1704
-	ldr	x1, [x19,8]
+	ldr	x1, [x19, 8]
 	bl	ftl_memcpy
-	ldr	x1, [x19,8]
-	ldrh	w2, [x22,2480]
-	ldr	x0, [x24,520]
-	add	x1, x1, 48
+	ldr	x0, [x24, 520]
+	ldrh	w2, [x22, 2480]
+	ldr	x1, [x19, 8]
 	lsl	w2, w2, 1
+	add	x1, x1, 48
 	bl	ftl_memcpy
-	ldrh	w2, [x22,2480]
-	ldr	x3, [x19,8]
-	ubfiz	x1, x2, 1, 16
-	ldr	x0, [x20,#:lo12:.LANCHOR0]
+	ldrh	w1, [x22, 2480]
+	ldr	x0, [x19, 8]
+	lsr	w2, w1, 3
+	ubfiz	x1, x1, 1, 16
 	add	x1, x1, 51
-	lsr	w2, w2, 3
-	and	x1, x1, 262140
 	add	w2, w2, 4
-	add	x1, x3, x1
+	and	x1, x1, -4
+	add	x1, x0, x1
+	ldr	x0, [x22, 64]
 	bl	ftl_memcpy
-	ldrh	w0, [x22,2588]
-	cbz	w0, .L1881
-	ldrh	w0, [x22,2480]
-	ldr	x3, [x19,8]
-	lsr	w1, w0, 3
-	ldrh	w2, [x22,2580]
-	add	w1, w1, w0, lsl 1
-	ldr	x0, [x24,3768]
+	ldrh	w0, [x22, 2588]
+	cbz	w0, .L1861
+	ldrh	w1, [x22, 2480]
+	ldrh	w2, [x22, 2580]
+	lsr	w0, w1, 3
+	add	w1, w0, w1, lsl 1
+	ldr	x0, [x19, 8]
 	add	w1, w1, 52
 	lsl	w2, w2, 2
 	and	x1, x1, 65532
-	add	x1, x3, x1
+	add	x1, x0, x1
+	ldr	x0, [x24, 3760]
 	bl	ftl_memcpy
-	b	.L1881
-.L1879:
-	sub	w22, w22, #1
-	sxth	w22, w22
-	b	.L1875
-.L1881:
+.L1861:
 	add	x0, x21, :lo12:.LANCHOR2
 	mov	w1, 19539
 	movk	w1, 0x4654, lsl 16
-	ldr	w2, [x0,456]
+	ldr	w2, [x0, 456]
 	cmp	w2, w1
-	bne	.L1884
+	bne	.L1864
 	add	x1, x20, :lo12:.LANCHOR0
-	ldrb	w3, [x0,466]
-	ldrh	w5, [x0,464]
-	strh	w5, [x0,790]
-	ldrh	w2, [x1,2494]
-	cmp	w3, w2
-	bne	.L1884
-	ldrh	w3, [x1,2544]
-	ldr	x2, [x29,120]
-	strh	wzr, [x0,802]
-	mul	w3, w3, w5
-	add	x23, x2, :lo12:.LANCHOR4
-	ldrh	w2, [x1,2550]
-	str	w3, [x1,2616]
-	strb	wzr, [x0,806]
-	mul	w3, w3, w2
-	str	w3, [x1,2584]
-	ldrh	w2, [x1,2630]
-	ldr	w3, [x1,2484]
-	ldrh	w1, [x1,2472]
-	sub	w2, w3, w2
-	str	w5, [x23,1760]
+	ldrh	w4, [x0, 464]
+	ldrb	w5, [x0, 466]
+	strh	w4, [x0, 790]
+	ldrh	w2, [x1, 2494]
+	cmp	w5, w2
+	bne	.L1864
+	ldrh	w2, [x1, 2544]
+	add	x23, x23, :lo12:.LANCHOR4
+	ldrh	w5, [x1, 2550]
+	add	x3, x0, 512
+	strh	wzr, [x0, 802]
+	str	w4, [x23, 1768]
+	mul	w2, w2, w4
+	strb	wzr, [x0, 806]
+	str	w2, [x1, 2616]
+	strb	wzr, [x0, 808]
+	mul	w2, w5, w2
+	ldrh	w5, [x1, 2630]
+	str	w2, [x1, 2584]
+	ldr	w2, [x1, 2484]
+	ldrh	w1, [x1, 2472]
 	sub	w2, w2, w5
-	ldrh	w3, [x0,470]
-	strh	w3, [x0,560]
+	sub	w2, w2, w4
+	ldrh	w4, [x0, 470]
+	strh	w4, [x0, 560]
 	udiv	w1, w2, w1
-	ldrh	w2, [x0,472]
-	strh	w1, [x0,780]
+	ldrh	w2, [x0, 472]
 	lsr	w5, w2, 6
 	and	w2, w2, 63
-	strb	w2, [x0,566]
-	ldrb	w2, [x0,467]
-	strb	w2, [x0,568]
+	strb	w2, [x0, 566]
+	ldrb	w2, [x0, 467]
+	strb	w2, [x0, 568]
 	mov	w2, -1
-	strh	w2, [x0,800]
-	ldrh	w2, [x0,474]
-	strh	w2, [x0,608]
-	ldrh	w2, [x0,476]
-	strh	w5, [x0,562]
+	strh	w2, [x0, 800]
+	ldrh	w2, [x0, 474]
+	strh	w2, [x0, 608]
+	ldrh	w2, [x0, 476]
+	strh	w5, [x0, 562]
+	strh	w1, [x0, 780]
 	lsr	w5, w2, 6
 	and	w2, w2, 63
-	strb	w2, [x0,614]
-	ldrb	w2, [x0,468]
-	strb	w2, [x0,616]
-	ldrh	w2, [x0,478]
-	strh	w2, [x0,656]
-	ldrh	w2, [x0,480]
-	strh	w5, [x0,610]
+	strb	w2, [x0, 614]
+	ldrb	w2, [x0, 468]
+	strb	w2, [x0, 616]
+	ldrh	w2, [x0, 478]
+	strh	w2, [x0, 656]
+	ldrh	w2, [x0, 480]
+	strh	w5, [x0, 610]
 	lsr	w5, w2, 6
 	and	w2, w2, 63
-	strb	wzr, [x0,808]
-	strh	w5, [x0,658]
-	strb	w2, [x0,662]
-	ldrb	w2, [x0,469]
-	ldr	w1, [x0,488]
-	strb	w2, [x0,664]
-	str	w1, [x0,760]
-	ldr	w2, [x0,752]
-	ldr	w1, [x0,496]
-	str	wzr, [x0,740]
-	str	wzr, [x0,728]
+	strh	w5, [x0, 658]
+	strb	w2, [x0, 662]
+	ldrb	w2, [x0, 469]
+	strb	w2, [x0, 664]
+	str	wzr, [x0, 720]
+	ldr	w1, [x0, 488]
+	ldr	w2, [x0, 752]
+	stp	wzr, wzr, [x3, 216]
+	stp	wzr, wzr, [x3, 224]
+	str	w1, [x0, 760]
+	str	wzr, [x0, 764]
+	ldr	w1, [x0, 496]
+	str	wzr, [x0, 772]
 	cmp	w1, w2
-	str	wzr, [x0,720]
-	str	wzr, [x0,736]
-	str	wzr, [x0,764]
-	str	wzr, [x0,772]
-	str	wzr, [x0,732]
-	bls	.L1885
-	str	w1, [x0,752]
-.L1885:
+	bls	.L1865
+	str	w1, [x0, 752]
+.L1865:
 	add	x0, x21, :lo12:.LANCHOR2
-	ldr	w1, [x0,492]
-	ldr	w2, [x0,756]
+	ldr	w1, [x0, 492]
+	ldr	w2, [x0, 756]
 	cmp	w1, w2
-	bls	.L1886
-	str	w1, [x0,756]
-.L1886:
+	bls	.L1866
+	str	w1, [x0, 756]
+.L1866:
 	mov	w0, 65535
-	cmp	w3, w0
-	beq	.L1887
+	cmp	w4, w0
+	beq	.L1867
 	add	x0, x21, :lo12:.LANCHOR2
 	add	x0, x0, 560
 	bl	make_superblock
-.L1887:
+.L1867:
 	add	x1, x21, :lo12:.LANCHOR2
 	add	x0, x1, 608
-	ldrh	w2, [x1,608]
+	ldrh	w2, [x1, 608]
 	mov	w1, 65535
 	cmp	w2, w1
-	beq	.L1888
+	beq	.L1868
 	bl	make_superblock
-.L1888:
+.L1868:
 	add	x1, x21, :lo12:.LANCHOR2
 	add	x0, x1, 656
-	ldrh	w2, [x1,656]
+	ldrh	w2, [x1, 656]
 	mov	w1, 65535
 	cmp	w2, w1
-	beq	.L1889
+	beq	.L1869
 	bl	make_superblock
-.L1889:
+.L1869:
 	add	x21, x21, :lo12:.LANCHOR2
 	mov	w1, 65535
 	add	x0, x21, 800
-	mov	w19, 0
-	ldrh	w2, [x21,800]
+	ldrh	w2, [x21, 800]
 	cmp	w2, w1
-	beq	.L1874
+	beq	.L1870
 	bl	make_superblock
-.L1874:
-	sub	sp, x29, #16
-	mov	w0, w19
-	ldp	x19, x20, [sp,32]
-	ldp	x21, x22, [sp,48]
-	ldp	x23, x24, [sp,64]
-	ldp	x25, x26, [sp,80]
-	ldp	x27, x28, [sp,96]
-	ldp	x29, x30, [sp,16]
-	add	sp, sp, 144
-	ret
+.L1870:
+	mov	w0, 0
+	b	.L1852
 	.size	FtlLoadSysInfo, .-FtlLoadSysInfo
 	.align	2
 	.global	FtlDumpBlockInfo
 	.type	FtlDumpBlockInfo, %function
 FtlDumpBlockInfo:
-	sub	sp, sp, #176
-	lsr	x0, x0, 10
-	stp	x29, x30, [sp,16]
+	sub	sp, sp, #160
+	lsr	w0, w0, 10
+	stp	x29, x30, [sp, 16]
 	add	x29, sp, 16
-	stp	x21, x22, [sp,48]
-	stp	x19, x20, [sp,32]
-	stp	x23, x24, [sp,64]
-	stp	x25, x26, [sp,80]
-	stp	x27, x28, [sp,96]
-	uxtb	w25, w1
+	stp	x19, x20, [sp, 32]
+	adrp	x19, .LANCHOR2
+	stp	x23, x24, [sp, 64]
+	adrp	x23, .LANCHOR0
+	add	x20, x23, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 48]
+	stp	x25, x26, [sp, 80]
+	and	w24, w1, 255
+	stp	x27, x28, [sp, 96]
 	bl	P2V_block_in_plane
-	adrp	x2, .LANCHOR3
-	adrp	x22, .LANCHOR0
-	uxth	w23, w0
-	add	x1, x2, :lo12:.LANCHOR3
-	add	x19, x22, :lo12:.LANCHOR0
-	adrp	x0, .LC109
+	adrp	x1, .LANCHOR3
+	add	x1, x1, :lo12:.LANCHOR3
+	and	w22, w0, 65535
 	add	x1, x1, 152
+	ldrh	w26, [x20, 2544]
+	adrp	x0, .LC109
 	add	x0, x0, :lo12:.LC109
-	adrp	x21, .LANCHOR2
-	ldrh	w24, [x19,2544]
 	bl	printk
-	add	x0, x21, :lo12:.LANCHOR2
-	ubfiz	x2, x23, 1, 16
-	mov	w1, w23
-	ldr	x3, [x0,520]
+	add	x1, x19, :lo12:.LANCHOR2
+	ubfiz	x0, x22, 1, 16
+	add	x25, x29, 144
+	ldr	x1, [x1, 520]
+	ldrh	w2, [x1, x0]
+	mov	w1, w22
 	adrp	x0, .LC110
 	add	x0, x0, :lo12:.LC110
-	ldrh	w2, [x3,x2]
 	bl	printk
-	strh	w23, [x29,112]
-	add	x0, x29, 112
+	strh	w22, [x25, -48]!
+	mov	x0, x25
 	bl	make_superblock
-	cbnz	w25, .L1909
-	ldrb	w0, [x19,204]
-	cbz	w0, .L1909
-	mov	w0, w23
+	ldrb	w0, [x20, 204]
+	cbz	w0, .L1891
+	cbnz	w24, .L1891
+	mov	w0, w22
 	bl	ftl_get_blk_mode
+	mov	w22, w0
 	cmp	w0, 1
-	mov	w23, w0
-	bne	.L1901
-	ldrh	w24, [x19,2546]
-	b	.L1901
-.L1909:
-	mov	w23, 0
-.L1901:
-	add	x3, x22, :lo12:.LANCHOR0
+	bne	.L1882
+	ldrh	w26, [x20, 2546]
+.L1882:
+	add	x0, x23, :lo12:.LANCHOR0
+	add	x19, x19, :lo12:.LANCHOR2
+	mov	w21, 0
+	mov	w27, 56
+	mov	w2, w26
+	mov	w1, w22
+	ldrh	w3, [x0, 2544]
 	adrp	x0, .LC111
-	adrp	x25, .LC112
 	add	x0, x0, :lo12:.LC111
-	mov	w1, w23
-	mov	w2, w24
-	ldrh	w3, [x3,2544]
-	mov	w20, 0
-	mov	w27, 65535
-	mov	w28, 56
-	mov	w26, 4
-	add	x25, x25, :lo12:.LC112
 	bl	printk
-.L1902:
-	add	x0, x22, :lo12:.LANCHOR0
-	ldrh	w5, [x0,2472]
-	ldrh	w6, [x0,2554]
-	ldrh	w7, [x0,2556]
-	mov	x0, 0
-	mov	w19, w0
-.L1903:
-	cmp	w5, w0, uxth
-	bls	.L1917
-	add	x1, x29, 112
-	add	x1, x1, x0, lsl 1
-	ldrh	w2, [x1,16]
-	cmp	w2, w27
-	beq	.L1904
-	add	x3, x21, :lo12:.LANCHOR2
-	orr	w2, w20, w2, lsl 10
-	umull	x1, w19, w28
-	ldr	x4, [x3,3592]
-	add	x4, x4, x1
-	str	w2, [x4,4]
-	ldr	x2, [x3,3592]
-	ldr	x4, [x3,1400]
-	add	x1, x2, x1
-	ldr	x3, [x3,1408]
-	mul	w2, w19, w6
-	sdiv	w2, w2, w26
-	add	x2, x4, w2, sxtw 2
-	str	x2, [x1,8]
-	mul	w2, w19, w7
-	add	w19, w19, 1
-	uxth	w19, w19
-	sdiv	w2, w2, w26
-	add	x2, x3, w2, sxtw 2
-	str	x2, [x1,16]
-.L1904:
-	add	x0, x0, 1
-	b	.L1903
-.L1917:
-	add	x0, x21, :lo12:.LANCHOR2
-	mov	w1, w19
-	mov	w2, w23
-	ldr	x0, [x0,3592]
+.L1883:
+	add	x0, x23, :lo12:.LANCHOR0
+	add	x5, x25, 16
+	mov	w20, 0
+	mov	w10, 65535
+	mov	w6, 4
+	ldrh	w7, [x0, 2472]
+	ldrh	w8, [x0, 2554]
+	ldrh	w9, [x0, 2556]
+	mov	w0, 0
+.L1884:
+	cmp	w0, w7
+	bne	.L1886
+	ldr	x0, [x19, 3584]
+	mov	w1, w20
+	adrp	x28, .LC112
+	mov	w2, w22
+	umull	x20, w20, w27
+	mov	x24, 0
+	add	x28, x28, :lo12:.LC112
 	bl	FlashReadPages
-	mov	x8, 0
-	mov	x9, 56
-.L1906:
-	cmp	w19, w8, uxth
-	bls	.L1918
-	add	x0, x21, :lo12:.LANCHOR2
-	ldrh	w1, [x29,112]
-	mul	x2, x8, x9
-	str	x9, [x29,96]
-	ldr	x4, [x0,3592]
-	str	x8, [x29,104]
-	add	x3, x4, x2
-	ldr	x0, [x3,8]
-	ldr	x7, [x3,16]
-	ldr	w5, [x0]
-	str	w5, [sp]
-	ldr	w0, [x0,4]
-	str	w0, [sp,8]
-	mov	x0, x25
-	ldr	w2, [x4,x2]
-	ldr	w5, [x7,4]
-	ldr	w4, [x7]
-	ldr	w6, [x7,8]
-	ldr	w3, [x3,4]
-	ldr	w7, [x7,12]
-	bl	printk
-	ldr	x8, [x29,104]
-	ldr	x9, [x29,96]
-	add	x8, x8, 1
-	b	.L1906
-.L1918:
-	add	w20, w20, 1
-	uxth	w20, w20
-	cmp	w20, w24
-	bne	.L1902
-.L1908:
-	sub	sp, x29, #16
+.L1887:
+	cmp	x24, x20
+	bne	.L1888
+	add	w21, w21, 1
+	and	w21, w21, 65535
+	cmp	w26, w21
+	bne	.L1883
+.L1889:
+	ldp	x19, x20, [sp, 32]
 	mov	w0, 0
-	ldp	x19, x20, [sp,32]
-	ldp	x21, x22, [sp,48]
-	ldp	x23, x24, [sp,64]
-	ldp	x25, x26, [sp,80]
-	ldp	x27, x28, [sp,96]
-	ldp	x29, x30, [sp,16]
-	add	sp, sp, 176
-	ret
+	ldp	x21, x22, [sp, 48]
+	ldp	x23, x24, [sp, 64]
+	ldp	x25, x26, [sp, 80]
+	ldp	x27, x28, [sp, 96]
+	ldp	x29, x30, [sp, 16]
+	add	sp, sp, 160
+	ret
+.L1891:
+	mov	w22, 0
+	b	.L1882
+.L1886:
+	ldrh	w1, [x5]
+	cmp	w1, w10
+	beq	.L1885
+	umull	x4, w20, w27
+	ldr	x3, [x19, 3584]
+	orr	w1, w21, w1, lsl 10
+	add	x3, x3, x4
+	str	w1, [x3, 4]
+	mul	w1, w20, w8
+	ldr	x2, [x19, 3584]
+	ldr	x3, [x19, 1392]
+	sdiv	w1, w1, w6
+	add	x2, x2, x4
+	add	x1, x3, w1, sxtw 2
+	str	x1, [x2, 8]
+	mul	w1, w20, w9
+	ldr	x3, [x19, 1400]
+	add	w20, w20, 1
+	and	w20, w20, 65535
+	sdiv	w1, w1, w6
+	add	x1, x3, w1, sxtw 2
+	str	x1, [x2, 16]
+.L1885:
+	add	w0, w0, 1
+	add	x5, x5, 2
+	and	w0, w0, 65535
+	b	.L1884
+.L1888:
+	ldr	x8, [x19, 3584]
+	ldrh	w1, [x29, 96]
+	add	x2, x8, x24
+	ldp	x3, x0, [x2, 8]
+	ldr	w4, [x3, 4]
+	str	w4, [sp, 8]
+	ldr	w3, [x3]
+	str	w3, [sp]
+	ldp	w4, w5, [x0]
+	ldp	w6, w7, [x0, 8]
+	mov	x0, x28
+	ldr	w3, [x2, 4]
+	ldr	w2, [x8, x24]
+	add	x24, x24, 56
+	bl	printk
+	b	.L1887
 	.size	FtlDumpBlockInfo, .-FtlDumpBlockInfo
 	.align	2
 	.global	FtlScanAllBlock
@@ -12352,615 +12144,582 @@ FtlDumpBlockInfo:
 FtlScanAllBlock:
 	sub	sp, sp, #144
 	adrp	x1, .LANCHOR3
-	adrp	x0, .LC109
 	add	x1, x1, :lo12:.LANCHOR3
-	add	x0, x0, :lo12:.LC109
+	adrp	x0, .LC109
 	add	x1, x1, 176
-	stp	x29, x30, [sp,16]
+	add	x0, x0, :lo12:.LC109
+	stp	x29, x30, [sp, 16]
 	add	x29, sp, 16
-	stp	x23, x24, [sp,64]
-	stp	x21, x22, [sp,48]
-	adrp	x23, .LC114
-	adrp	x22, .LC113
-	adrp	x24, .LC115
-	add	x22, x22, :lo12:.LC113
-	stp	x19, x20, [sp,32]
-	add	x23, x23, :lo12:.LC114
+	stp	x21, x22, [sp, 48]
+	adrp	x22, .LANCHOR0
+	stp	x23, x24, [sp, 64]
+	add	x22, x22, :lo12:.LANCHOR0
+	adrp	x24, .LANCHOR2
+	add	x21, x24, :lo12:.LANCHOR2
+	stp	x19, x20, [sp, 32]
 	mov	w20, 0
-	add	x24, x24, :lo12:.LC115
-	stp	x25, x26, [sp,80]
+	stp	x25, x26, [sp, 80]
 	bl	printk
-.L1920:
-	adrp	x19, .LANCHOR0
-	add	x19, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x19,2482]
+.L1895:
+	ldrh	w0, [x22, 2482]
 	cmp	w0, w20
-	bls	.L1929
+	bhi	.L1903
+	ldp	x19, x20, [sp, 32]
+	mov	w0, 0
+	ldp	x21, x22, [sp, 48]
+	ldp	x23, x24, [sp, 64]
+	ldp	x25, x26, [sp, 80]
+	ldp	x29, x30, [sp, 16]
+	add	sp, sp, 144
+	ret
+.L1903:
+	add	x19, x29, 128
 	mov	w0, w20
-	strh	w20, [x29,80]
-	adrp	x21, .LANCHOR2
+	strh	w20, [x19, -48]!
 	bl	ftl_get_blk_mode
+	add	x2, x24, :lo12:.LANCHOR2
+	ubfiz	x1, x20, 1, 16
 	mov	w3, w0
-	add	x0, x21, :lo12:.LANCHOR2
-	ubfiz	x2, x20, 1, 16
+	adrp	x0, .LC113
+	add	x0, x0, :lo12:.LC113
+	ldr	x2, [x2, 520]
+	ldrh	w2, [x2, x1]
 	mov	w1, w20
-	ldr	x4, [x0,520]
-	mov	x0, x22
-	ldrh	w2, [x4,x2]
 	bl	printk
-	add	x0, x29, 80
+	mov	x0, x19
 	bl	make_superblock
-	mov	x1, 0
-	ldrh	w6, [x19,2472]
-	ldrh	w7, [x19,2554]
-	mov	w9, 65535
-	ldrh	w8, [x19,2556]
-	mov	w10, 56
-	mov	w19, w1
+	ldrh	w7, [x22, 2472]
+	add	x0, x19, 16
+	ldrh	w8, [x22, 2554]
+	mov	w19, 0
+	ldrh	w9, [x22, 2556]
+	mov	w1, 0
+	mov	w10, 65535
+	mov	w11, 56
 	mov	w5, 4
-.L1921:
-	cmp	w6, w1, uxth
-	bls	.L1930
-	add	x0, x29, 80
-	add	x0, x0, x1, lsl 1
-	ldrh	w2, [x0,16]
-	cmp	w2, w9
-	beq	.L1922
-	add	x3, x21, :lo12:.LANCHOR2
-	lsl	w2, w2, 10
-	umull	x0, w19, w10
-	ldr	x4, [x3,3592]
-	add	x4, x4, x0
-	str	w2, [x4,4]
-	ldr	x2, [x3,3592]
-	ldr	x4, [x3,1400]
-	add	x2, x2, x0
-	ldr	x3, [x3,1408]
-	mul	w0, w19, w7
-	sdiv	w0, w0, w5
-	add	x0, x4, w0, sxtw 2
-	str	x0, [x2,8]
-	mul	w0, w19, w8
-	add	w19, w19, 1
-	uxth	w19, w19
-	sdiv	w0, w0, w5
-	add	x0, x3, w0, sxtw 2
-	str	x0, [x2,16]
-.L1922:
-	add	x1, x1, 1
-	b	.L1921
-.L1930:
-	add	x0, x21, :lo12:.LANCHOR2
-	mov	w1, w19
+.L1896:
+	cmp	w1, w7
+	bne	.L1898
+	ldr	x0, [x21, 3584]
+	mov	w25, 56
+	adrp	x26, .LC114
 	mov	w2, 0
-	mov	x25, 0
-	mov	x26, 56
-	ldr	x0, [x0,3592]
+	mov	w1, w19
+	umull	x25, w19, w25
+	mov	x23, 0
+	add	x26, x26, :lo12:.LC114
 	bl	FlashReadPages
-.L1924:
-	add	x0, x21, :lo12:.LANCHOR2
-	cmp	w19, w25, uxth
-	bls	.L1931
-	ldr	x4, [x0,3592]
-	mul	x2, x25, x26
-	ldrh	w1, [x29,80]
-	add	x25, x25, 1
-	add	x3, x4, x2
-	ldr	x0, [x3,8]
-	ldr	x7, [x3,16]
-	ldr	w5, [x0]
-	str	w5, [sp]
-	ldr	w0, [x0,4]
-	str	w0, [sp,8]
-	mov	x0, x23
-	ldr	w2, [x4,x2]
-	ldr	w5, [x7,4]
-	ldr	w4, [x7]
-	ldr	w6, [x7,8]
-	ldr	w3, [x3,4]
-	ldr	w7, [x7,12]
-	bl	printk
-	b	.L1924
-.L1931:
-	ldr	x0, [x0,3592]
+.L1899:
+	cmp	x23, x25
+	bne	.L1900
+	ldr	x0, [x21, 3584]
 	mov	w1, w19
+	adrp	x25, .LC115
 	mov	w2, 1
-	mov	x25, 0
-	mov	x26, 56
+	mov	x19, 0
+	add	x25, x25, :lo12:.LC115
 	bl	FlashReadPages
-.L1926:
-	cmp	w19, w25, uxth
-	bls	.L1932
-	add	x0, x21, :lo12:.LANCHOR2
-	ldrh	w1, [x29,80]
-	mul	x2, x25, x26
-	add	x25, x25, 1
-	ldr	x4, [x0,3592]
-	add	x3, x4, x2
-	ldr	x0, [x3,8]
-	ldr	x7, [x3,16]
-	ldr	w5, [x0]
-	str	w5, [sp]
-	ldr	w0, [x0,4]
-	str	w0, [sp,8]
-	mov	x0, x24
-	ldr	w2, [x4,x2]
-	ldr	w5, [x7,4]
-	ldr	w4, [x7]
-	ldr	w6, [x7,8]
-	ldr	w3, [x3,4]
-	ldr	w7, [x7,12]
-	bl	printk
-	b	.L1926
-.L1932:
+.L1901:
+	cmp	x23, x19
+	bne	.L1902
 	add	w20, w20, 1
-	uxth	w20, w20
-	b	.L1920
-.L1929:
-	sub	sp, x29, #16
-	mov	w0, 0
-	ldp	x19, x20, [sp,32]
-	ldp	x21, x22, [sp,48]
-	ldp	x23, x24, [sp,64]
-	ldp	x25, x26, [sp,80]
-	ldp	x29, x30, [sp,16]
-	add	sp, sp, 144
-	ret
+	and	w20, w20, 65535
+	b	.L1895
+.L1898:
+	ldrh	w2, [x0]
+	cmp	w2, w10
+	beq	.L1897
+	umull	x6, w19, w11
+	ldr	x4, [x21, 3584]
+	lsl	w2, w2, 10
+	add	x4, x4, x6
+	str	w2, [x4, 4]
+	mul	w2, w19, w8
+	ldr	x3, [x21, 3584]
+	ldr	x4, [x21, 1392]
+	sdiv	w2, w2, w5
+	add	x3, x3, x6
+	add	x2, x4, w2, sxtw 2
+	str	x2, [x3, 8]
+	mul	w2, w19, w9
+	ldr	x4, [x21, 1400]
+	add	w19, w19, 1
+	and	w19, w19, 65535
+	sdiv	w2, w2, w5
+	add	x2, x4, w2, sxtw 2
+	str	x2, [x3, 16]
+.L1897:
+	add	w1, w1, 1
+	add	x0, x0, 2
+	and	w1, w1, 65535
+	b	.L1896
+.L1900:
+	ldr	x8, [x21, 3584]
+	ldrh	w1, [x29, 80]
+	add	x2, x8, x23
+	ldp	x3, x0, [x2, 8]
+	ldr	w4, [x3, 4]
+	str	w4, [sp, 8]
+	ldr	w3, [x3]
+	str	w3, [sp]
+	ldp	w4, w5, [x0]
+	ldp	w6, w7, [x0, 8]
+	mov	x0, x26
+	ldr	w3, [x2, 4]
+	ldr	w2, [x8, x23]
+	add	x23, x23, 56
+	bl	printk
+	b	.L1899
+.L1902:
+	ldr	x8, [x21, 3584]
+	ldrh	w1, [x29, 80]
+	add	x2, x8, x19
+	ldp	x3, x0, [x2, 8]
+	ldr	w4, [x3, 4]
+	str	w4, [sp, 8]
+	ldr	w3, [x3]
+	str	w3, [sp]
+	ldp	w4, w5, [x0]
+	ldp	w6, w7, [x0, 8]
+	mov	x0, x25
+	ldr	w3, [x2, 4]
+	ldr	w2, [x8, x19]
+	add	x19, x19, 56
+	bl	printk
+	b	.L1901
 	.size	FtlScanAllBlock, .-FtlScanAllBlock
 	.align	2
 	.global	ftl_scan_all_ppa
 	.type	ftl_scan_all_ppa, %function
 ftl_scan_all_ppa:
 	sub	sp, sp, #96
-	stp	x29, x30, [sp,16]
+	stp	x29, x30, [sp, 16]
 	add	x29, sp, 16
-	stp	x19, x20, [sp,32]
+	stp	x19, x20, [sp, 32]
 	adrp	x20, .LANCHOR0
+	add	x20, x20, :lo12:.LANCHOR0
+	stp	x25, x26, [sp, 80]
 	adrp	x19, .LANCHOR4
-	add	x0, x20, :lo12:.LANCHOR0
 	add	x19, x19, :lo12:.LANCHOR4
-	stp	x23, x24, [sp,64]
-	stp	x21, x22, [sp,48]
-	stp	x25, x26, [sp,80]
-	adrp	x23, .LC116
-	add	x19, x19, 1704
-	ldrh	w26, [x0,2542]
-	add	x23, x23, :lo12:.LC116
+	add	x19, x19, 1712
+	stp	x21, x22, [sp, 48]
+	ldrh	w26, [x20, 2542]
+	stp	x23, x24, [sp, 64]
 	sub	w26, w26, #16
-.L1934:
-	add	x21, x20, :lo12:.LANCHOR0
-	ldrh	w0, [x21,2542]
+	lsl	w25, w26, 10
+.L1906:
+	ldrh	w0, [x20, 2542]
 	cmp	w26, w0
-	bge	.L1949
-	uxth	w22, w26
-	mov	w0, w22
+	blt	.L1914
+	adrp	x1, .LANCHOR3
+	add	x1, x1, :lo12:.LANCHOR3
+	add	x1, x1, 192
+	adrp	x0, .LC119
+	add	x0, x0, :lo12:.LC119
+	bl	printk
+	ldp	x19, x20, [sp, 32]
+	ldp	x21, x22, [sp, 48]
+	ldp	x23, x24, [sp, 64]
+	ldp	x25, x26, [sp, 80]
+	ldp	x29, x30, [sp, 16]
+	add	sp, sp, 96
+	ret
+.L1914:
+	and	w21, w26, 65535
+	mov	w0, w21
 	bl	ftl_get_blk_mode
-	ldrb	w1, [x21,204]
-	cbz	w1, .L1935
-	ldrh	w1, [x21,2480]
+	ldrb	w1, [x20, 204]
+	cbz	w1, .L1907
+	ldrh	w1, [x20, 2480]
 	cmp	w26, w1
-	bge	.L1936
-	ldrh	w1, [x21,2558]
+	bge	.L1908
+	ldrh	w1, [x20, 2558]
 	cmp	w26, w1
-	blt	.L1936
-.L1935:
+	blt	.L1908
+.L1907:
 	cmp	w0, 1
-	bne	.L1937
-.L1936:
-	add	x0, x20, :lo12:.LANCHOR0
-	mov	w21, -2147483648
-	ldrh	w24, [x0,2546]
-	b	.L1938
-.L1937:
-	add	x0, x20, :lo12:.LANCHOR0
-	mov	w21, 0
-	ldrh	w24, [x0,2544]
-.L1938:
-	mov	x0, x23
+	bne	.L1909
+.L1908:
+	ldrh	w23, [x20, 2546]
+	mov	w24, -2147483648
+.L1910:
+	mov	w3, w24
+	mov	w2, w23
 	mov	w1, w26
-	mov	w2, w24
-	mov	w3, w21
+	adrp	x0, .LC116
+	add	x0, x0, :lo12:.LC116
 	bl	printk
-	mov	w0, w22
+	mov	w0, w21
 	bl	FtlBbmIsBadBlock
-	cbz	w0, .L1939
+	cbz	w0, .L1911
 	adrp	x0, .LC117
+	mov	w3, w24
+	mov	w2, w23
 	mov	w1, w26
 	add	x0, x0, :lo12:.LC117
-	mov	w2, w24
-	mov	w3, w21
 	bl	printk
-.L1939:
-	adrp	x25, .LC118
-	mov	w22, 0
-	add	w21, w21, w26, lsl 10
-	add	x25, x25, :lo12:.LC118
-.L1940:
-	cmp	w22, w24
-	beq	.L1950
-	adrp	x3, .LANCHOR2
-	add	w0, w21, w22
-	add	x3, x3, :lo12:.LANCHOR2
-	str	w0, [x19,4]
-	mov	w1, 1
+.L1911:
+	adrp	x22, .LANCHOR2
+	add	x22, x22, :lo12:.LANCHOR2
+	mov	w21, 0
+.L1912:
+	cmp	w21, w23
+	bne	.L1913
+	add	w26, w26, 1
+	add	w25, w25, 1024
+	b	.L1906
+.L1909:
+	ldrh	w23, [x20, 2544]
+	mov	w24, 0
+	b	.L1910
+.L1913:
+	add	w0, w24, w25
 	mov	w2, 0
-	str	wzr, [x19]
-	add	w22, w22, 1
-	ldr	x0, [x3,3616]
-	str	x0, [x19,8]
-	ldr	x0, [x3,3664]
-	str	x0, [x19,16]
+	add	w0, w0, w21
+	stp	wzr, w0, [x19]
+	ldr	x0, [x22, 3608]
+	mov	w1, 1
+	str	x0, [x19, 8]
+	add	w21, w21, 1
+	ldr	x0, [x22, 3656]
+	str	x0, [x19, 16]
 	mov	x0, x19
 	bl	FlashReadPages
-	ldr	x7, [x19,8]
-	ldr	x6, [x19,16]
-	ldr	w0, [x7,4]
-	str	w0, [sp]
-	mov	x0, x25
-	ldr	w3, [x6]
-	ldr	w4, [x6,4]
-	ldr	w5, [x6,8]
-	ldr	w1, [x19,4]
-	ldr	w2, [x19]
-	ldr	w6, [x6,12]
-	ldr	w7, [x7]
-	bl	printk
-	b	.L1940
-.L1950:
-	add	w26, w26, 1
-	b	.L1934
-.L1949:
-	adrp	x1, .LANCHOR3
-	adrp	x0, .LC119
-	add	x1, x1, :lo12:.LANCHOR3
-	add	x0, x0, :lo12:.LC119
-	add	x1, x1, 192
+	ldp	x1, x0, [x19, 8]
+	ldr	w2, [x1, 4]
+	str	w2, [sp]
+	ldp	w3, w4, [x0]
+	ldp	w5, w6, [x0, 8]
+	adrp	x0, .LC118
+	ldr	w7, [x1]
+	add	x0, x0, :lo12:.LC118
+	ldp	w2, w1, [x19]
 	bl	printk
-	sub	sp, x29, #16
-	ldp	x19, x20, [sp,32]
-	ldp	x21, x22, [sp,48]
-	ldp	x23, x24, [sp,64]
-	ldp	x25, x26, [sp,80]
-	ldp	x29, x30, [sp,16]
-	add	sp, sp, 96
-	ret
+	b	.L1912
 	.size	ftl_scan_all_ppa, .-ftl_scan_all_ppa
 	.align	2
 	.global	FlashProgPages
 	.type	FlashProgPages, %function
 FlashProgPages:
-	stp	x29, x30, [sp, -192]!
-	adrp	x6, .LANCHOR1+481
+	stp	x29, x30, [sp, -176]!
+	adrp	x4, .LANCHOR0
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	adrp	x21, .LANCHOR0
-	ldrb	w6, [x6,#:lo12:.LANCHOR1+481]
-	add	x4, x21, :lo12:.LANCHOR0
-	str	w3, [x29,120]
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	str	w6, [x29,124]
+	stp	x21, x22, [sp, 32]
+	add	x21, x4, :lo12:.LANCHOR0
+	stp	x19, x20, [sp, 16]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	str	x4, [x29, 96]
+	ldr	x5, [x21, 88]
+	ldrb	w6, [x21, 72]
+	str	w3, [x29, 108]
+	ldrb	w5, [x5, 19]
+	cbnz	w6, .L1923
 	mov	x19, x0
-	ldr	x5, [x4,88]
+	adrp	x0, .LANCHOR1+481
 	mov	w25, w1
-	ldrb	w4, [x4,72]
 	mov	w23, w2
+	add	x27, x21, 2164
+	ldrb	w28, [x0, #:lo12:.LANCHOR1+481]
 	mov	w22, 0
-	ldrb	w5, [x5,19]
-	cbz	w4, .L1952
-	bl	FlashProgSlc2KPages
-	b	.L1953
-.L1952:
 	sub	w0, w5, #1
-	mov	w27, 56
-	mov	x28, 24
-	str	w0, [x29,116]
-.L2003:
+	str	w0, [x29, 104]
+.L1924:
 	cmp	w22, w25
-	bcs	.L2004
-	umull	x20, w22, w27
+	bcc	.L1937
+	ldr	x0, [x29, 96]
+	mov	x20, 0
+	mov	x24, 24
+	add	x21, x0, :lo12:.LANCHOR0
+	add	x22, x21, 2164
+.L1938:
+	ldrb	w0, [x21, 2358]
+	cmp	w0, w20
+	bhi	.L1940
+	ldr	w0, [x29, 108]
+	cbnz	w0, .L1941
+.L1949:
+	mov	w0, 0
+	b	.L1922
+.L1923:
+	bl	FlashProgSlc2KPages
+.L1922:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 176
+	ret
+.L1937:
+	mov	w12, 56
 	mov	w1, w23
-	add	x2, x29, 128
-	add	x26, x19, x20
 	sub	w4, w25, w22
+	add	x3, x29, 116
+	umull	x12, w22, w12
+	add	x2, x29, 112
+	add	x26, x19, x12
 	mov	x0, x26
-	add	x3, x29, 132
 	bl	LogAddr2PhyAddr
 	mov	w24, w0
-	add	x1, x21, :lo12:.LANCHOR0
-	ldr	w0, [x29,132]
-	ldrb	w2, [x1,2358]
-	cmp	w0, w2
-	bcc	.L1954
+	ldrb	w1, [x21, 2358]
+	ldr	w0, [x29, 116]
+	cmp	w1, w0
+	bhi	.L1926
 	mov	w0, -1
-	str	w0, [x19,x20]
-	b	.L1955
-.L1954:
-	ldrb	w2, [x1,2368]
-	add	x1, x1, 2164
-	cmp	w2, wzr
-	uxtw	x2, w0
+	str	w0, [x19, x12]
+.L1927:
+	add	w22, w22, 1
+	b	.L1924
+.L1926:
+	ldrb	w1, [x21, 2368]
+	mov	x2, 24
+	cmp	w1, 0
+	uxtw	x1, w0
 	csel	w24, w24, wzr, ne
-	madd	x1, x2, x28, x1
-	ldr	x1, [x1,8]
-	cbz	x1, .L1957
+	madd	x1, x1, x2, x27
+	ldr	x1, [x1, 8]
+	cbz	x1, .L1929
 	bl	FlashWaitCmdDone
-.L1957:
-	add	x0, x21, :lo12:.LANCHOR0
-	ldr	w2, [x29,132]
-	add	x0, x0, 2164
-	ldr	w1, [x29,128]
-	madd	x0, x2, x28, x0
-	str	x26, [x0,8]
-	str	xzr, [x0,16]
-	str	w1, [x0,4]
-	cbz	w24, .L1958
-	add	w1, w22, 1
-	umull	x1, w1, w27
-	add	x1, x19, x1
-	str	x1, [x0,16]
-.L1958:
-	add	x1, x21, :lo12:.LANCHOR0
-	add	x0, x1, x2
-	madd	x2, x2, x28, x1
-	ldrb	w20, [x0,2360]
-	ldrb	w0, [x1,2358]
-	strb	w20, [x2,2164]
-	cmp	w0, 1
-	bne	.L1959
-	mov	w0, w20
-	bl	NandcWaitFlashReady
-	b	.L1960
-.L1959:
-	mov	w0, w20
-	str	x1, [x29,104]
-	bl	NandcFlashCs
-	ldr	x1, [x29,104]
-	ldr	w0, [x29,132]
-	add	x1, x1, 1232
-	ldr	w0, [x1,x0,lsl 2]
-	ldr	w1, [x29,128]
-	cmp	w0, wzr
-	mov	w0, w20
-	cset	w2, ne
-	bl	FlashWaitReadyEN
+.L1929:
+	ldp	w2, w1, [x29, 112]
+	mov	x0, 24
+	madd	x0, x1, x0, x27
+	str	w2, [x0, 4]
+	stp	x26, xzr, [x0, 8]
+	cbz	w24, .L1930
+	add	w2, w22, 1
+	mov	w3, 56
+	umaddl	x2, w2, w3, x19
+	str	x2, [x0, 16]
+.L1930:
+	add	x0, x21, x1
+	ldrb	w20, [x0, 2360]
+	mov	x0, 24
+	mul	x1, x1, x0
+	ldrb	w0, [x21, 2358]
+	cmp	w0, 1
 	mov	w0, w20
-	bl	NandcFlashDeCs
-.L1960:
-	ldr	w0, [x29,116]
+	strb	w20, [x27, x1]
+	bne	.L1931
+	bl	NandcWaitFlashReady
+.L1932:
+	ldr	w0, [x29, 104]
 	cmp	w0, 7
-	bhi	.L1961
-	add	x2, x21, :lo12:.LANCHOR0
-	add	x0, x2, w20, sxtw
-	ldrb	w0, [x0,2128]
-	cbz	w0, .L1961
-	ldrb	w1, [x2,1273]
-	mov	w0, w20
-	add	x2, x2, 1276
+	bhi	.L1933
+	add	x0, x21, w20, sxtw
+	ldrb	w0, [x0, 2128]
+	cbz	w0, .L1933
+	ldrb	w1, [x21, 1273]
 	mov	w3, 0
+	add	x2, x21, 1276
+	mov	w0, w20
 	bl	HynixSetRRPara
-.L1961:
+.L1933:
 	mov	w0, w20
 	bl	NandcFlashCs
 	cmp	w23, 1
-	bne	.L1962
-	add	x0, x21, :lo12:.LANCHOR0
-	ldrb	w0, [x0,204]
-	cbz	w0, .L1962
+	bne	.L1934
+	ldrb	w0, [x21, 204]
+	cbz	w0, .L1934
 	mov	w0, w20
 	bl	flash_enter_slc_mode
-	b	.L1963
-.L1962:
-	mov	w0, w20
-	bl	flash_exit_slc_mode
-.L1963:
-	ldr	w1, [x29,128]
+.L1935:
+	ldr	w1, [x29, 112]
 	mov	w0, w20
 	bl	FlashProgFirstCmd
-	ldrb	w2, [x29,124]
-	mov	w0, w20
-	ldr	x3, [x26,8]
+	ldp	x3, x4, [x26, 8]
+	mov	w2, w28
 	mov	w1, 1
-	ldr	x4, [x26,16]
+	mov	w0, w20
 	bl	NandcXferData
-	cbz	w24, .L1964
-	ldr	w1, [x29,128]
+	cbz	w24, .L1936
+	ldr	w1, [x29, 112]
 	mov	w0, w20
-	add	x26, x21, :lo12:.LANCHOR0
 	bl	FlashProgDpFirstCmd
-	ldr	w1, [x29,132]
-	add	x0, x26, 1232
-	ldr	w0, [x0,x1,lsl 2]
-	ldr	w1, [x29,128]
-	cmp	w0, wzr
+	ldr	w1, [x29, 116]
+	add	x0, x21, 1232
+	ldr	w0, [x0, x1, lsl 2]
+	ldr	w1, [x29, 112]
+	cmp	w0, 0
 	mov	w0, w20
 	cset	w2, ne
 	bl	FlashWaitReadyEN
-	ldr	w2, [x26,76]
+	ldr	w0, [x21, 76]
+	ldr	w1, [x29, 112]
+	add	w1, w1, w0
 	mov	w0, w20
-	ldr	w1, [x29,128]
-	add	w1, w2, w1
 	bl	FlashProgDpSecondCmd
-	add	w4, w22, 1
-	ldrb	w2, [x29,124]
-	mov	w0, w20
+	add	w0, w22, 1
+	mov	w1, 56
+	mov	w2, w28
+	umaddl	x0, w0, w1, x19
 	mov	w1, 1
-	umull	x4, w4, w27
-	add	x4, x19, x4
-	ldr	x3, [x4,8]
-	ldr	x4, [x4,16]
+	ldp	x3, x4, [x0, 8]
+	mov	w0, w20
 	bl	NandcXferData
-.L1964:
-	ldr	w1, [x29,128]
+.L1936:
+	ldr	w1, [x29, 112]
 	mov	w0, w20
 	add	w22, w22, w24
 	bl	FlashProgSecondCmd
 	mov	w0, w20
 	bl	NandcFlashDeCs
-.L1955:
-	add	w22, w22, 1
-	b	.L2003
-.L2004:
-	add	x21, x21, :lo12:.LANCHOR0
-	mov	x20, 0
-	add	x22, x21, 2164
-	mov	x24, 24
-.L1966:
-	ldrb	w0, [x21,2358]
-	cmp	w0, w20
-	bls	.L2005
+	b	.L1927
+.L1931:
+	bl	NandcFlashCs
+	ldr	w1, [x29, 116]
+	add	x0, x21, 1232
+	ldr	w0, [x0, x1, lsl 2]
+	ldr	w1, [x29, 112]
+	cmp	w0, 0
+	mov	w0, w20
+	cset	w2, ne
+	bl	FlashWaitReadyEN
+	mov	w0, w20
+	bl	NandcFlashDeCs
+	b	.L1932
+.L1934:
+	mov	w0, w20
+	bl	flash_exit_slc_mode
+	b	.L1935
+.L1940:
 	mov	w0, w20
 	bl	FlashWaitCmdDone
 	cmp	w23, 1
-	bne	.L1967
-	ldrb	w0, [x21,204]
-	cbz	w0, .L1967
+	bne	.L1939
+	ldrb	w0, [x21, 204]
+	cbz	w0, .L1939
 	mul	x0, x20, x24
-	ldrb	w0, [x0,x22]
+	ldrb	w0, [x0, x22]
 	bl	flash_exit_slc_mode
-.L1967:
+.L1939:
 	add	x20, x20, 1
-	b	.L1966
-.L2005:
-	ldr	w0, [x29,120]
-	cbnz	w0, .L1969
-.L1977:
-	mov	w0, 0
-	b	.L1953
-.L1969:
-	adrp	x24, .LC107
-	adrp	x26, .LC106
-	adrp	x27, .LC104
-	mov	w21, 0
-	add	x24, x24, :lo12:.LC107
-	add	x26, x26, :lo12:.LC106
-	add	x27, x27, :lo12:.LC104
-.L1970:
-	cmp	w21, w25
-	beq	.L1977
+	b	.L1938
+.L1941:
+	mov	w0, 56
+	and	w20, w25, 255
+	adrp	x22, .LANCHOR4
+	add	x24, x22, :lo12:.LANCHOR4
+	umaddl	x25, w25, w0, x19
+.L1942:
+	cmp	x25, x19
+	beq	.L1949
 	ldr	w0, [x19]
 	cmn	w0, #1
-	bne	.L1971
+	bne	.L1943
+	ldr	w1, [x19, 4]
 	adrp	x0, .LC103
-	ldr	w1, [x19,4]
 	add	x0, x0, :lo12:.LC103
 	bl	printk
-	b	.L1972
-.L1971:
-	adrp	x20, .LANCHOR4
-	sub	w4, w25, w21
-	add	x22, x20, :lo12:.LANCHOR4
-	add	x3, x29, 132
+.L1944:
+	sub	w20, w20, #1
+	add	x19, x19, 56
+	and	w20, w20, 255
+	b	.L1942
+.L1943:
+	add	x21, x22, :lo12:.LANCHOR4
+	mov	w4, w20
+	add	x3, x29, 116
+	add	x2, x29, 112
 	mov	w1, w23
-	add	x2, x29, 128
 	mov	x0, x19
 	bl	LogAddr2PhyAddr
-	ldr	x0, [x22,1664]
-	mov	x1, x19
+	ldr	x0, [x21, 1672]
 	mov	x2, 56
+	mov	x1, x19
 	str	wzr, [x0]
-	ldr	x0, [x22,1672]
+	ldr	x0, [x21, 1680]
 	str	wzr, [x0]
-	add	x0, x29, 136
+	add	x0, x29, 120
 	bl	memcpy
-	ldr	x0, [x22,1664]
-	mov	w1, 1
-	str	x0, [x29,144]
+	ldr	x0, [x21, 1672]
 	mov	w2, w23
-	ldr	x0, [x22,1672]
-	str	x0, [x29,152]
-	add	x0, x29, 136
+	str	x0, [x29, 128]
+	mov	w1, 1
+	ldr	x0, [x21, 1680]
+	str	x0, [x29, 136]
+	add	x0, x29, 120
 	bl	FlashReadPages
-	ldr	w22, [x29,136]
-	cmn	w22, #1
-	bne	.L1973
-	ldr	w1, [x19,4]
-	mov	x0, x27
+	ldr	w21, [x29, 120]
+	cmn	w21, #1
+	bne	.L1945
+	ldr	w1, [x19, 4]
+	adrp	x0, .LC104
+	add	x0, x0, :lo12:.LC104
 	bl	printk
-	str	w22, [x19]
-.L1973:
-	ldr	x0, [x19,16]
-	cbz	x0, .L1974
+	str	w21, [x19]
+.L1945:
+	ldr	x0, [x19, 16]
+	cbz	x0, .L1946
 	ldr	w2, [x0]
-	add	x0, x20, :lo12:.LANCHOR4
-	ldr	x0, [x0,1672]
+	ldr	x0, [x24, 1680]
 	ldr	w3, [x0]
 	cmp	w2, w3
-	beq	.L1974
-	ldr	w1, [x19,4]
-	mov	x0, x26
+	beq	.L1946
+	ldr	w1, [x19, 4]
+	adrp	x0, .LC106
+	add	x0, x0, :lo12:.LC106
 	bl	printk
 	mov	w0, -1
 	str	w0, [x19]
-.L1974:
-	ldr	x0, [x19,8]
-	cbz	x0, .L1972
-	add	x20, x20, :lo12:.LANCHOR4
+.L1946:
+	ldr	x0, [x19, 8]
+	cbz	x0, .L1944
 	ldr	w2, [x0]
-	ldr	x0, [x20,1664]
+	ldr	x0, [x24, 1672]
 	ldr	w3, [x0]
 	cmp	w2, w3
-	beq	.L1972
-	ldr	w1, [x19,4]
-	mov	x0, x24
+	beq	.L1944
+	ldr	w1, [x19, 4]
+	adrp	x0, .LC107
+	add	x0, x0, :lo12:.LC107
 	bl	printk
 	mov	w0, -1
 	str	w0, [x19]
-.L1972:
-	add	w21, w21, 1
-	add	x19, x19, 56
-	b	.L1970
-.L1953:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 192
-	ret
+	b	.L1944
 	.size	FlashProgPages, .-FlashProgPages
 	.align	2
 	.type	FlashTestBlk.part.18, %function
 FlashTestBlk.part.18:
 	stp	x29, x30, [sp, -160]!
-	mov	w1, 165
 	mov	w2, 32
+	mov	w1, 165
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR4
-	uxth	w20, w0
 	add	x19, x19, :lo12:.LANCHOR4
+	and	w20, w0, 65535
 	lsl	w20, w20, 10
-	ldr	x0, [x19,1648]
-	str	x0, [x29,48]
+	ldr	x0, [x19, 1656]
+	str	x0, [x29, 48]
 	add	x0, x29, 96
-	str	x0, [x29,56]
+	str	x0, [x29, 56]
 	bl	ftl_memset
-	ldr	x0, [x19,1648]
-	mov	w1, 90
+	ldr	x0, [x19, 1656]
 	mov	w2, 8
+	mov	w1, 90
 	bl	ftl_memset
-	str	w20, [x29,44]
-	mov	w1, 1
+	str	w20, [x29, 44]
+	mov	w2, 1
 	add	x0, x29, 40
-	mov	w2, w1
+	mov	w1, w2
 	bl	FlashEraseBlocks
-	mov	w1, 1
+	mov	w3, 1
 	add	x0, x29, 40
-	mov	w3, w1
-	mov	w2, w1
+	mov	w2, w3
+	mov	w1, w3
 	bl	FlashProgPages
-	ldr	w0, [x29,40]
-	mov	w1, 0
+	ldr	w0, [x29, 40]
 	mov	w2, 1
-	cmp	w0, wzr
+	mov	w1, 0
+	cmp	w0, 0
 	add	x0, x29, 40
 	csetm	w19, ne
 	bl	FlashEraseBlocks
 	mov	w0, w19
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 160
 	ret
 	.size	FlashTestBlk.part.18, .-FlashTestBlk.part.18
@@ -12968,626 +12727,596 @@ FlashTestBlk.part.18:
 	.global	FlashTestBlk
 	.type	FlashTestBlk, %function
 FlashTestBlk:
-	uxth	w1, w0
-	adrp	x0, .LANCHOR4+1636
+	adrp	x1, .LANCHOR4+1644
+	and	w0, w0, 65535
+	ldr	w1, [x1, #:lo12:.LANCHOR4+1644]
+	cmp	w0, w1
+	bcc	.L1979
 	stp	x29, x30, [sp, -16]!
 	add	x29, sp, 0
-	ldr	w2, [x0,#:lo12:.LANCHOR4+1636]
-	mov	w0, 0
-	cmp	w1, w2
-	bcc	.L2008
-	mov	w0, w1
 	bl	FlashTestBlk.part.18
-.L2008:
 	ldp	x29, x30, [sp], 16
 	ret
+.L1979:
+	mov	w0, 0
+	ret
 	.size	FlashTestBlk, .-FlashTestBlk
 	.align	2
 	.global	FlashMakeFactorBbt
 	.type	FlashMakeFactorBbt, %function
 FlashMakeFactorBbt:
-	stp	x29, x30, [sp, -224]!
+	stp	x29, x30, [sp, -240]!
+	adrp	x1, .LANCHOR0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR4
+	stp	x21, x22, [sp, 32]
+	adrp	x21, .LANCHOR4
+	add	x0, x21, :lo12:.LANCHOR4
+	stp	x19, x20, [sp, 16]
+	stp	x23, x24, [sp, 48]
 	mov	w19, 0
-	add	x0, x20, :lo12:.LANCHOR4
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	adrp	x21, .LANCHOR0
-	ldr	x0, [x0,1656]
-	str	x0, [x29,136]
-	add	x0, x21, :lo12:.LANCHOR0
-	ldrh	w1, [x0,188]
-	ldrh	w23, [x0,190]
-	ldrh	w26, [x0,76]
-	mul	w23, w1, w23
-	ldr	x1, [x0,88]
-	ldrb	w0, [x0,72]
-	uxth	w23, w23
-	ldrb	w1, [x1,24]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldr	x0, [x0, 1664]
+	stp	x0, x1, [x29, 152]
+	add	x0, x1, :lo12:.LANCHOR0
+	ldrh	w2, [x0, 188]
+	ldrh	w22, [x0, 190]
+	mul	w22, w22, w2
+	ldr	x2, [x0, 88]
+	and	w22, w22, 65535
+	ldrb	w2, [x2, 24]
+	str	w2, [x29, 128]
+	ldrh	w2, [x0, 76]
+	ldrb	w0, [x0, 72]
+	uxtw	x1, w2
 	cmp	w0, 1
-	str	w1, [x29,132]
+	ubfiz	w2, w2, 1, 15
+	csel	w0, w2, w1, eq
+	mov	w1, 1
+	str	w0, [x29, 168]
 	adrp	x0, .LC120
-	ubfiz	w1, w26, 1, 15
 	add	x0, x0, :lo12:.LC120
-	csel	w26, w1, w26, eq
-	mov	w1, 1
 	bl	printk
-	add	x0, x20, :lo12:.LANCHOR4
-	mov	w1, 0
+	add	x0, x21, :lo12:.LANCHOR4
 	mov	w2, 4096
-	ldr	x0, [x0,1656]
+	mov	w1, 0
+	ldr	x0, [x0, 1664]
 	bl	ftl_memset
-	lsr	w0, w23, 4
-	str	w0, [x29,128]
-	ldr	w0, [x29,132]
-	and	w0, w0, 1
-	str	w0, [x29,116]
-	ldr	w0, [x29,132]
-	and	w0, w0, 2
-	uxtb	w0, w0
-	str	w0, [x29,112]
-	sub	w0, w23, #1
-	uxth	w0, w0
-	str	w0, [x29,124]
-.L2012:
-	add	x24, x21, :lo12:.LANCHOR0
-	ldrb	w0, [x24,2358]
+	lsr	w0, w22, 4
+	str	w0, [x29, 148]
+	sub	w0, w22, #1
+	and	w0, w0, 65535
+	str	w0, [x29, 144]
+	adrp	x0, .LC123
+	add	x0, x0, :lo12:.LC123
+	str	x0, [x29, 104]
+.L1986:
+	ldr	x0, [x29, 160]
+	add	x20, x0, :lo12:.LANCHOR0
+	ldrb	w0, [x20, 2358]
 	cmp	w0, w19
-	bls	.L2062
-	add	x0, x20, :lo12:.LANCHOR4
-	sxtw	x25, w19
-	add	x1, x0, 1688
-	ldrh	w22, [x1,w19,sxtw 1]
-	cbnz	w22, .L2042
-	ldrh	w2, [x24,196]
-	mov	w1, w22
-	ldr	x0, [x0,1600]
-	add	x24, x24, x25
+	bhi	.L2013
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 240
+	ret
+.L2013:
+	add	x0, x21, :lo12:.LANCHOR4
+	sxtw	x24, w19
+	add	x1, x0, 1696
+	ldrh	w1, [x1, x24, lsl 1]
+	str	w1, [x29, 172]
+	cbnz	w1, .L1987
+	ldr	x0, [x0, 1608]
+	add	x28, x20, 1232
+	ldrh	w2, [x20, 196]
+	mov	w23, 0
+	mov	w25, 0
+	mov	w26, 0
 	lsl	w2, w2, 9
-	mov	w27, w22
 	bl	ftl_memset
-	ldrb	w28, [x24,2360]
-	ldr	w0, [x29,132]
-	mov	w24, w22
-	and	w0, w0, 4
-	uxtb	w0, w0
-	str	w0, [x29,120]
-.L2014:
-	uxth	w0, w27
-	str	w0, [x29,144]
-	cmp	w0, w23
-	bcs	.L2024
+	add	x0, x20, x24
+	ldrb	w27, [x0, 2360]
+	ldr	w0, [x29, 128]
+	and	w0, w0, 1
+	str	w0, [x29, 100]
+.L1988:
+	and	w0, w26, 65535
+	str	w0, [x29, 112]
+	cmp	w0, w22
+	bcc	.L1999
+.L1998:
+	mov	w2, w23
+	mov	w1, w19
+	adrp	x0, .LC122
+	add	x0, x0, :lo12:.LC122
+	bl	printk
+	ldr	x0, [x29, 160]
+	ldr	w2, [x29, 148]
+	add	x1, x0, :lo12:.LANCHOR0
+	ldrb	w0, [x1, 2358]
+	mul	w0, w0, w2
+	cmp	w23, w0
+	blt	.L2000
+	add	x0, x21, :lo12:.LANCHOR4
+	ldrh	w2, [x1, 196]
+	mov	w1, 0
+	ldr	x0, [x0, 1608]
+	lsl	w2, w2, 9
+	bl	ftl_memset
+.L2000:
+	cbnz	w19, .L2002
+	add	x20, x21, :lo12:.LANCHOR4
+	ldr	x0, [x29, 160]
+	mov	w23, 1
+	add	x25, x0, :lo12:.LANCHOR0
+	ldrh	w26, [x20, 1644]
+.L2003:
+	ldrb	w0, [x25, 73]
+	cmp	w0, w26
+	bhi	.L2005
+	ldr	w26, [x29, 144]
+	sub	w25, w22, #50
+	add	x20, x21, :lo12:.LANCHOR4
+	mov	w23, 1
+.L2006:
+	cmp	w26, w25
+	bgt	.L2008
+	ldr	x0, [x29, 160]
+	add	x3, x21, :lo12:.LANCHOR4
+	add	x1, x0, :lo12:.LANCHOR0
+	ldr	w2, [x3, 1644]
+	ldrb	w0, [x1, 73]
+	sub	w0, w0, w2
+	ldr	w2, [x29, 172]
+	cmp	w2, w0
+	bcc	.L2002
+	ldr	x0, [x3, 1608]
+	ldrh	w2, [x1, 196]
+	mov	w1, 0
+	lsl	w2, w2, 9
+	bl	ftl_memset
+.L2002:
+	add	x27, x21, :lo12:.LANCHOR4
+	mul	w25, w19, w22
+	ldr	w26, [x29, 144]
+	adrp	x23, .LC124
+	add	x20, x27, 1696
+	add	x23, x23, :lo12:.LC124
+.L2010:
+	mov	w1, w19
+	mov	w2, w26
+	mov	x0, x23
+	bl	printk
+	ldr	x1, [x27, 1608]
+.L2011:
+	ubfx	x0, x26, 5, 11
+	ldr	w0, [x1, x0, lsl 2]
+	lsr	w0, w0, w26
+	tbnz	x0, 0, .L2012
+	ldr	x1, [x29, 152]
+	mov	w0, -3872
+	strh	w26, [x20, x24, lsl 1]
+	mov	w2, 1
+	strh	w0, [x1]
+	strh	w26, [x1, 2]
+	strh	wzr, [x1, 8]
+	mov	w1, w2
+	ldr	x0, [x27, 1608]
+	str	x0, [x29, 192]
+	ldr	x0, [x27, 1664]
+	str	x0, [x29, 200]
+	add	w0, w26, w25
+	lsl	w0, w0, 10
+	str	w0, [x29, 188]
+	add	x0, x29, 184
+	bl	FlashEraseBlocks
+	mov	w3, 1
+	add	x0, x29, 184
+	mov	w2, w3
+	mov	w1, w3
+	bl	FlashProgPages
+	ldr	w0, [x29, 184]
+	cbz	w0, .L1987
+	sub	w26, w26, #1
+	and	w26, w26, 65535
+	b	.L2010
+.L1999:
 	mov	w0, -1
-	strb	w0, [x29,166]
-	strb	w0, [x29,167]
-	ldr	w0, [x29,116]
-	cbz	w0, .L2016
-	add	x4, x21, :lo12:.LANCHOR0
-	add	x2, x29, 166
-	add	x0, x4, 1232
-	str	x4, [x29,96]
-	ldr	w3, [x0,x25,lsl 2]
-	mov	w0, w28
-	add	w3, w22, w3
-	str	x3, [x29,104]
+	strb	w0, [x29, 182]
+	strb	w0, [x29, 183]
+	ldr	w0, [x29, 100]
+	cbz	w0, .L1990
+	ldr	w3, [x28, x24, lsl 2]
+	mov	w0, w27
+	add	x2, x29, 182
+	add	w3, w25, w3
+	str	w3, [x29, 96]
 	mov	w1, w3
 	bl	FlashReadSpare
-	ldr	x4, [x29,96]
-	ldr	x3, [x29,104]
-	ldrb	w0, [x4,72]
+	ldrb	w0, [x20, 72]
+	ldr	w3, [x29, 96]
 	cmp	w0, 1
-	bne	.L2016
-	ldr	w1, [x4,76]
-	mov	w0, w28
-	add	x2, x29, 167
+	bne	.L1990
+	ldr	w1, [x20, 76]
+	mov	w0, w27
+	add	x2, x29, 183
 	add	w1, w3, w1
 	bl	FlashReadSpare
-	ldrb	w0, [x29,166]
-	ldrb	w1, [x29,167]
-	and	w0, w1, w0
-	strb	w0, [x29,166]
-.L2016:
-	ldr	w0, [x29,112]
-	cbz	w0, .L2018
-	add	x0, x21, :lo12:.LANCHOR0
-	add	x2, x29, 167
-	ldr	x1, [x0,88]
-	add	x0, x0, 1232
-	ldrh	w1, [x1,10]
-	ldr	w0, [x0,x25,lsl 2]
+	ldrb	w0, [x29, 182]
+	ldrb	w1, [x29, 183]
+	and	w0, w0, w1
+	strb	w0, [x29, 182]
+.L1990:
+	ldr	x0, [x29, 128]
+	tbz	x0, 1, .L1992
+	ldr	x0, [x20, 88]
+	add	x2, x29, 183
+	ldrh	w1, [x0, 10]
+	ldr	w0, [x28, x24, lsl 2]
 	sub	w1, w1, #1
+	add	w0, w25, w0
 	add	w1, w1, w0
-	mov	w0, w28
-	add	w1, w1, w22
+	mov	w0, w27
 	bl	FlashReadSpare
-.L2018:
-	add	x0, x21, :lo12:.LANCHOR0
-	ldrb	w1, [x29,166]
-	ldr	x0, [x0,88]
-	ldrb	w2, [x0,7]
-	cmp	w2, 8
-	beq	.L2019
-	cmp	w2, 1
-	beq	.L2019
-	ldrb	w0, [x0,18]
-	cmp	w0, 12
-	bne	.L2020
-.L2019:
-	mov	w0, 1
-	cbz	w1, .L2021
-	ldrb	w0, [x29,167]
-	cmp	w0, wzr
+.L1992:
+	ldr	x1, [x20, 88]
+	ldrb	w0, [x1, 7]
+	cmp	w0, 1
+	ccmp	w0, 8, 4, ne
+	ldrb	w0, [x29, 182]
+	beq	.L1993
+	ldrb	w1, [x1, 18]
+	cmp	w1, 12
+	bne	.L1994
+.L1993:
+	cbz	w0, .L2015
+	ldrb	w0, [x29, 183]
+	cmp	w0, 0
 	cset	w0, eq
-	b	.L2021
-.L2020:
-	cmp	w1, 255
-	mov	w0, 1
-	bne	.L2021
-	ldrb	w0, [x29,167]
-	cmp	w0, 255
-	cset	w0, ne
-.L2021:
-	ldr	w1, [x29,120]
-	cbz	w1, .L2022
-	add	x0, x21, :lo12:.LANCHOR0
-	add	x0, x0, 1232
-	ldr	w1, [x0,x25,lsl 2]
-	mov	w0, w28
-	add	w1, w22, w1
+.L1995:
+	ldr	x1, [x29, 128]
+	tbz	x1, 2, .L1996
+	ldr	w1, [x28, x24, lsl 2]
+	mov	w0, w27
+	add	w1, w25, w1
 	bl	SandiskProgTestBadBlock
-.L2022:
-	cbz	w0, .L2023
-	adrp	x0, .LC121
+.L1996:
+	cbz	w0, .L1997
+	mov	w2, w26
 	mov	w1, w19
-	mov	w2, w27
+	adrp	x0, .LC121
 	add	x0, x0, :lo12:.LC121
-	add	w24, w24, 1
 	bl	printk
-	add	x0, x20, :lo12:.LANCHOR4
-	ldr	x1, [x29,144]
-	ldrb	w3, [x29,144]
-	uxth	w24, w24
-	ubfx	x1, x1, 5, 11
-	lsl	x1, x1, 2
-	ldr	x2, [x0,1600]
+	add	w23, w23, 1
+	add	x1, x21, :lo12:.LANCHOR4
+	ldr	x0, [x29, 112]
+	ldrb	w2, [x29, 112]
+	and	w23, w23, 65535
+	ldr	x3, [x1, 1608]
+	ubfx	x0, x0, 5, 11
+	lsl	x0, x0, 2
+	mov	w1, 1
+	lsl	w2, w1, w2
+	ldr	w1, [x3, x0]
+	orr	w1, w1, w2
+	str	w1, [x3, x0]
+	ldr	w1, [x29, 148]
+	ldrb	w0, [x20, 2358]
+	mul	w0, w0, w1
+	cmp	w23, w0
+	bgt	.L1998
+.L1997:
+	ldr	w0, [x29, 168]
+	add	w26, w26, 1
+	add	w25, w25, w0
+	b	.L1988
+.L1994:
+	cmp	w0, 255
+	bne	.L2015
+	ldrb	w0, [x29, 183]
+	cmp	w0, 255
+	cset	w0, ne
+	b	.L1995
+.L2015:
 	mov	w0, 1
-	lsl	w0, w0, w3
-	ldr	w3, [x2,x1]
-	orr	w0, w3, w0
-	str	w0, [x2,x1]
-	add	x0, x21, :lo12:.LANCHOR0
-	ldr	w1, [x29,128]
-	ldrb	w0, [x0,2358]
-	mul	w0, w1, w0
-	cmp	w24, w0
-	bgt	.L2024
-.L2023:
-	add	w27, w27, 1
-	add	w22, w22, w26
-	b	.L2014
-.L2024:
-	adrp	x0, .LC122
-	mov	w1, w19
-	mov	w2, w24
-	add	x0, x0, :lo12:.LC122
-	bl	printk
-	add	x1, x21, :lo12:.LANCHOR0
-	ldr	w2, [x29,128]
-	ldrb	w0, [x1,2358]
-	mul	w0, w2, w0
-	cmp	w24, w0
-	blt	.L2026
-	add	x0, x20, :lo12:.LANCHOR4
-	ldrh	w2, [x1,196]
-	mov	w1, 0
-	lsl	w2, w2, 9
-	ldr	x0, [x0,1600]
-	bl	ftl_memset
-.L2026:
-	cbnz	w19, .L2028
-	add	x0, x20, :lo12:.LANCHOR4
-	adrp	x27, .LC123
-	mov	w22, w19
-	add	x27, x27, :lo12:.LC123
-	mov	w24, 1
-	ldrh	w28, [x0,1636]
-.L2029:
-	add	x0, x21, :lo12:.LANCHOR0
-	ldrb	w0, [x0,73]
-	cmp	w0, w28
-	bls	.L2063
-	mov	w0, w28
+	b	.L1995
+.L2005:
+	mov	w0, w26
 	bl	FlashTestBlk
-	cbz	w0, .L2030
-	mov	w1, w28
-	mov	x0, x27
-	add	w22, w22, 1
+	cbz	w0, .L2004
+	ldr	x0, [x29, 104]
+	mov	w1, w26
 	bl	printk
-	add	x0, x20, :lo12:.LANCHOR4
-	ubfx	x1, x28, 5, 11
-	lsl	x1, x1, 2
-	uxth	w22, w22
-	ldr	x2, [x0,1600]
-	lsl	w0, w24, w28
-	ldr	w3, [x2,x1]
-	orr	w0, w3, w0
-	str	w0, [x2,x1]
-.L2030:
-	add	w28, w28, 1
-	uxth	w28, w28
-	b	.L2029
-.L2063:
-	adrp	x27, .LC123
-	ldr	w24, [x29,124]
-	sub	w28, w23, #50
-	add	x27, x27, :lo12:.LC123
-.L2032:
-	cmp	w24, w28
-	ble	.L2064
-	mov	w0, w24
+	ldr	x3, [x20, 1608]
+	ubfx	x0, x26, 5, 11
+	lsl	x0, x0, 2
+	lsl	w1, w23, w26
+	ldr	w2, [x3, x0]
+	orr	w1, w2, w1
+	str	w1, [x3, x0]
+	ldr	w0, [x29, 172]
+	add	w0, w0, 1
+	and	w0, w0, 65535
+	str	w0, [x29, 172]
+.L2004:
+	add	w26, w26, 1
+	and	w26, w26, 65535
+	b	.L2003
+.L2008:
+	mov	w0, w26
 	bl	FlashTestBlk
-	cbz	w0, .L2033
-	mov	w1, w24
-	mov	x0, x27
+	cbz	w0, .L2007
+	ldr	x0, [x29, 104]
+	mov	w1, w26
 	bl	printk
-	add	x0, x20, :lo12:.LANCHOR4
-	ubfx	x1, x24, 5, 11
-	lsl	x1, x1, 2
-	ldr	x3, [x0,1600]
-	mov	w0, 1
-	lsl	w0, w0, w24
-	ldr	w4, [x3,x1]
-	orr	w0, w4, w0
-	str	w0, [x3,x1]
-.L2033:
-	sub	w2, w24, #1
-	uxth	w24, w2
-	b	.L2032
-.L2064:
-	add	x2, x21, :lo12:.LANCHOR0
-	add	x1, x20, :lo12:.LANCHOR4
-	ldrb	w0, [x2,73]
-	ldr	w3, [x1,1636]
-	sub	w0, w0, w3
-	cmp	w22, w0
-	bcc	.L2028
-	ldrh	w2, [x2,196]
-	ldr	x0, [x1,1600]
-	mov	w1, 0
-	lsl	w2, w2, 9
-	bl	ftl_memset
-.L2028:
-	adrp	x24, .LC124
-	ldr	w28, [x29,124]
-	mul	w27, w19, w23
-	add	x24, x24, :lo12:.LC124
-	mov	w22, -3872
-.L2036:
-	mov	w2, w28
-	mov	x0, x24
-	mov	w1, w19
-	bl	printk
-	add	x0, x20, :lo12:.LANCHOR4
-	ldr	x2, [x0,1600]
-.L2037:
-	ubfx	x0, x28, 5, 11
-	ldr	w0, [x2,x0,lsl 2]
-	lsr	w0, w0, w28
-	and	w1, w0, 1
-	tbz	x0, 0, .L2065
-	sub	w28, w28, #1
-	uxth	w28, w28
-	b	.L2037
-.L2065:
-	add	x0, x20, :lo12:.LANCHOR4
-	add	x2, x0, 1688
-	strh	w28, [x2,x25,lsl 1]
-	ldr	x2, [x29,136]
-	strh	w22, [x2]
-	strh	w28, [x2,2]
-	strh	w1, [x2,8]
-	ldr	x1, [x0,1600]
-	ldr	x0, [x0,1656]
-	str	x0, [x29,184]
-	add	w0, w28, w27
-	str	x1, [x29,176]
-	lsl	w0, w0, 10
-	mov	w1, 1
-	str	w0, [x29,172]
-	mov	w2, w1
-	add	x0, x29, 168
-	bl	FlashEraseBlocks
-	mov	w1, 1
-	add	x0, x29, 168
-	mov	w2, w1
-	mov	w3, w1
-	bl	FlashProgPages
-	ldr	w0, [x29,168]
-	cbz	w0, .L2042
-	sub	w28, w28, #1
-	uxth	w28, w28
-	b	.L2036
-.L2042:
+	ldr	x3, [x20, 1608]
+	ubfx	x0, x26, 5, 11
+	lsl	x0, x0, 2
+	lsl	w1, w23, w26
+	ldr	w2, [x3, x0]
+	orr	w1, w2, w1
+	str	w1, [x3, x0]
+.L2007:
+	sub	w26, w26, #1
+	and	w26, w26, 65535
+	b	.L2006
+.L2012:
+	sub	w26, w26, #1
+	and	w26, w26, 65535
+	b	.L2011
+.L1987:
 	add	w19, w19, 1
-	uxtb	w19, w19
-	b	.L2012
-.L2062:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 224
-	ret
+	and	w19, w19, 255
+	b	.L1986
 	.size	FlashMakeFactorBbt, .-FlashMakeFactorBbt
 	.align	2
 	.global	FtlLowFormatEraseBlock
 	.type	FtlLowFormatEraseBlock, %function
 FtlLowFormatEraseBlock:
-	stp	x29, x30, [sp, -128]!
+	stp	x29, x30, [sp, -144]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	adrp	x20, .LANCHOR2
-	adrp	x22, .LANCHOR0
-	stp	x25, x26, [sp,64]
-	stp	x23, x24, [sp,48]
-	uxtb	w25, w1
-	add	x24, x22, :lo12:.LANCHOR0
-	add	x1, x20, :lo12:.LANCHOR2
-	uxth	w26, w0
-	stp	x27, x28, [sp,80]
-	ldrb	w0, [x24,2368]
-	ldr	w2, [x1,424]
-	str	w0, [x29,120]
-	mov	w0, 0
-	cbnz	w2, .L2067
-	ldrb	w0, [x24,204]
-	mov	w28, w2
-	str	w0, [x29,124]
-	mov	w21, w2
-	str	w26, [x1,3580]
-	mov	w19, w2
-	mov	w27, 56
-.L2068:
-	ldrh	w0, [x24,2472]
-	cmp	w0, w28
-	bls	.L2112
-	add	x1, x20, :lo12:.LANCHOR2
-	umull	x0, w28, w27
-	ldr	x1, [x1,432]
-	str	wzr, [x1,x0]
-	add	x0, x24, 2504
-	mov	w1, w26
-	ldrb	w0, [x0,w28,sxtw]
-	bl	V2P_block
-	uxth	w23, w0
-	mov	w1, w23
-	cbz	w25, .L2069
-	str	x1, [x29,112]
-	bl	IsBlkInVendorPart
-	ldr	x1, [x29,112]
-	cbnz	w0, .L2070
-.L2069:
-	mov	w0, w1
-	bl	FtlBbmIsBadBlock
-	cbnz	w0, .L2071
-	add	x3, x20, :lo12:.LANCHOR2
-	lsl	w23, w23, 10
-	umull	x0, w21, w27
-	mov	w2, 4
-	ldr	x1, [x3,432]
-	add	x1, x1, x0
-	str	w23, [x1,4]
-	ldr	x1, [x3,432]
-	ldr	x3, [x3,3672]
-	add	x1, x1, x0
-	ldrh	w0, [x24,2556]
-	mul	w0, w21, w0
-	add	w21, w21, 1
-	str	xzr, [x1,8]
-	sdiv	w0, w0, w2
-	uxth	w21, w21
-	add	x0, x3, w0, sxtw 2
-	str	x0, [x1,16]
-	b	.L2070
-.L2071:
-	add	w19, w19, 1
-	uxth	w19, w19
-.L2070:
-	add	w2, w28, 1
-	uxth	w28, w2
-	b	.L2068
-.L2112:
-	cbz	w21, .L2091
-	ldr	w0, [x29,124]
-	mov	w2, w21
-	strb	wzr, [x24,2368]
-	mov	x27, 56
-	cmp	w0, wzr
-	add	x0, x20, :lo12:.LANCHOR2
+	stp	x21, x22, [sp, 32]
+	adrp	x22, .LANCHOR2
+	add	x5, x22, :lo12:.LANCHOR2
+	stp	x25, x26, [sp, 64]
+	stp	x19, x20, [sp, 16]
+	and	w26, w0, 65535
+	stp	x23, x24, [sp, 48]
+	stp	x27, x28, [sp, 80]
+	ldr	w0, [x5, 424]
+	cbnz	w0, .L2058
+	adrp	x20, .LANCHOR0
+	add	x24, x20, :lo12:.LANCHOR0
+	and	w25, w1, 255
+	add	x9, x24, 2504
+	mov	w6, 0
+	mov	w21, 0
+	ldrb	w8, [x24, 204]
+	mov	w19, 0
+	ldrb	w0, [x24, 2368]
+	mov	w7, 56
+	mov	w10, 4
+	str	w26, [x5, 3572]
+	str	w0, [x29, 132]
+.L2037:
+	ldrh	w0, [x24, 2472]
+	cmp	w0, w6
+	bhi	.L2041
+	cbz	w21, .L2035
+	add	x27, x22, :lo12:.LANCHOR2
+	cmp	w8, 0
 	cset	w23, ne
+	strb	wzr, [x24, 2368]
+	mov	w2, w21
 	mov	w1, w23
-	ldr	x0, [x0,432]
+	ldr	x0, [x27, 432]
 	bl	FlashEraseBlocks
-	ldrb	w0, [x29,120]
-	strb	w0, [x24,2368]
+	ldrb	w0, [x29, 132]
+	strb	w0, [x24, 2368]
 	mov	x24, 0
-.L2074:
-	cmp	w21, w24, uxth
-	bls	.L2113
-	add	x1, x20, :lo12:.LANCHOR2
-	mul	x0, x24, x27
-	ldr	x1, [x1,432]
-	add	x2, x1, x0
-	ldr	w0, [x1,x0]
+	mov	w0, 56
+	umull	x21, w21, w0
+.L2044:
+	ldr	x0, [x27, 432]
+	add	x1, x0, x24
+	ldr	w0, [x0, x24]
 	cmn	w0, #1
-	bne	.L2075
-	ldr	w0, [x2,4]
+	bne	.L2043
+	ldr	w0, [x1, 4]
 	add	w19, w19, 1
+	and	w19, w19, 65535
 	lsr	w0, w0, 10
-	uxth	w19, w19
 	bl	FtlBbmMapBadBlock
-.L2075:
-	add	x24, x24, 1
-	b	.L2074
-.L2113:
-	cbnz	w25, .L2077
+.L2043:
+	add	x24, x24, 56
+	cmp	x21, x24
+	bne	.L2044
+	cbnz	w25, .L2045
+	and	w23, w23, 65535
 	mov	w0, 1
-	uxth	w23, w23
 	mov	w28, 6
-	str	w0, [x29,124]
-	b	.L2078
-.L2077:
-	add	x0, x22, :lo12:.LANCHOR0
-	ldrh	w1, [x0,2546]
-	ldrb	w0, [x0,204]
-	str	w1, [x29,124]
-	cbnz	w0, .L2094
-	uxtw	x0, w1
-	mov	w23, 1
-	lsr	w28, w0, 2
-	b	.L2078
-.L2094:
-	mov	w23, 1
-	mov	w28, w23
-.L2078:
+	str	w0, [x29, 136]
+.L2046:
+	add	x20, x20, :lo12:.LANCHOR0
+	add	x27, x22, :lo12:.LANCHOR2
+	add	x0, x20, 2504
 	mov	w24, 0
-	add	x22, x22, :lo12:.LANCHOR0
-.L2087:
-	mov	w27, 0
-	mov	w21, w27
-.L2079:
-	ldrh	w0, [x22,2472]
-	cmp	w0, w27
-	bls	.L2114
-	add	x1, x20, :lo12:.LANCHOR2
-	mov	w0, 56
-	umull	x0, w27, w0
-	ldr	x1, [x1,432]
-	str	wzr, [x1,x0]
-	add	x0, x22, 2504
-	mov	w1, w26
-	ldrb	w0, [x0,w27,sxtw]
-	bl	V2P_block
-	uxth	w2, w0
-	str	w2, [x29,112]
-	mov	w1, w2
-	cbz	w25, .L2080
-	str	x1, [x29,104]
-	bl	IsBlkInVendorPart
-	ldr	x1, [x29,104]
-	cbnz	w0, .L2081
-.L2080:
-	mov	w0, w1
-	bl	FtlBbmIsBadBlock
-	cbnz	w0, .L2081
-	add	x2, x20, :lo12:.LANCHOR2
-	mov	w0, 56
-	ldr	w3, [x29,112]
-	umull	x0, w21, w0
-	ldr	x1, [x2,432]
-	add	w3, w24, w3, lsl 10
-	add	x1, x1, x0
-	str	w3, [x1,4]
-	mov	w3, 4
-	ldr	x1, [x2,432]
-	add	x1, x1, x0
-	ldr	x0, [x2,3648]
-	ldr	x2, [x2,3656]
-	str	x0, [x1,8]
-	ldrh	w0, [x22,2556]
-	mul	w0, w21, w0
-	add	w21, w21, 1
-	sdiv	w0, w0, w3
-	uxth	w21, w21
-	add	x0, x2, w0, sxtw 2
-	str	x0, [x1,16]
-.L2081:
-	add	w4, w27, 1
-	uxth	w27, w4
-	b	.L2079
-.L2114:
-	cbz	w21, .L2091
-	add	x0, x20, :lo12:.LANCHOR2
-	mov	w1, w21
+	str	x0, [x29, 120]
+.L2054:
+	mov	w5, 0
+	mov	w21, 0
+	mov	w6, 56
+	mov	w7, 4
+.L2047:
+	ldrh	w0, [x20, 2472]
+	cmp	w0, w5
+	bhi	.L2050
+	cbz	w21, .L2035
+	ldr	x0, [x27, 432]
 	mov	w2, w23
+	mov	w1, w21
+	strb	wzr, [x20, 2368]
 	mov	w3, 1
-	strb	wzr, [x22,2368]
-	ldr	x0, [x0,432]
 	bl	FlashProgPages
-	ldrb	w0, [x29,120]
-	mov	x1, 0
-	strb	w0, [x22,2368]
-.L2084:
-	cmp	w21, w1, uxth
-	bls	.L2115
-	add	x2, x20, :lo12:.LANCHOR2
-	mov	x0, 56
-	mul	x0, x1, x0
-	ldr	x2, [x2,432]
-	add	x3, x2, x0
-	ldr	w0, [x2,x0]
-	cbz	w0, .L2085
-	ldr	w0, [x3,4]
+	mov	w1, 56
+	ldrb	w0, [x29, 132]
+	strb	w0, [x20, 2368]
+	mov	x2, 0
+	umull	x1, w21, w1
+.L2053:
+	ldr	x0, [x27, 432]
+	add	x3, x0, x2
+	ldr	w0, [x0, x2]
+	cbz	w0, .L2052
+	ldr	w0, [x3, 4]
 	add	w19, w19, 1
-	str	x1, [x29,112]
+	stp	x2, x1, [x29, 104]
+	and	w19, w19, 65535
 	lsr	w0, w0, 10
-	uxth	w19, w19
 	bl	FtlBbmMapBadBlock
-	ldr	x1, [x29,112]
-.L2085:
-	add	x1, x1, 1
-	b	.L2084
-.L2115:
+	ldp	x2, x1, [x29, 104]
+.L2052:
+	add	x2, x2, 56
+	cmp	x1, x2
+	bne	.L2053
 	add	w24, w24, w28
-	ldr	w0, [x29,124]
-	uxth	w24, w24
-	cmp	w24, w0
-	bcc	.L2087
-	mov	x22, 0
-	mov	x24, 56
-.L2088:
-	cmp	w21, w22, uxth
-	bls	.L2116
-	cbz	w25, .L2089
-	add	x1, x20, :lo12:.LANCHOR2
-	mul	x0, x22, x24
-	ldr	x1, [x1,432]
-	add	x2, x1, x0
-	ldr	w0, [x1,x0]
-	cbnz	w0, .L2089
-	ldr	w0, [x2,4]
+	ldr	w0, [x29, 136]
+	and	w24, w24, 65535
+	cmp	w0, w24
+	bhi	.L2054
+	add	x24, x22, :lo12:.LANCHOR2
+	mov	x20, 0
+.L2056:
+	cbz	w25, .L2055
+	ldr	x0, [x24, 432]
+	add	x1, x0, x20
+	ldr	w0, [x0, x20]
+	cbnz	w0, .L2055
+	ldr	w0, [x1, 4]
 	mov	w1, 1
+	str	x2, [x29, 136]
 	lsr	w0, w0, 10
 	bl	FtlFreeSysBlkQueueIn
-.L2089:
-	add	x22, x22, 1
-	b	.L2088
-.L2116:
+	ldr	x2, [x29, 136]
+.L2055:
+	add	x20, x20, 56
+	cmp	x20, x2
+	bne	.L2056
 	cmp	w26, 63
-	bls	.L2095
-	cbz	w25, .L2091
-.L2095:
-	add	x20, x20, :lo12:.LANCHOR2
-	mov	w1, w23
+	ccmp	w25, 0, 0, hi
+	beq	.L2035
+	add	x22, x22, :lo12:.LANCHOR2
 	mov	w2, w21
-	ldr	x0, [x20,432]
+	mov	w1, w23
+	ldr	x0, [x22, 432]
 	bl	FlashEraseBlocks
-.L2091:
+.L2035:
 	mov	w0, w19
-.L2067:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 144
 	ret
+.L2041:
+	umull	x0, w6, w7
+	ldr	x1, [x5, 432]
+	str	wzr, [x1, x0]
+	mov	w1, w26
+	ldrb	w0, [x9, w6, sxtw]
+	bl	V2P_block
+	and	w11, w0, 65535
+	mov	w12, w11
+	cbz	w25, .L2038
+	bl	IsBlkInVendorPart
+	cbnz	w0, .L2039
+.L2038:
+	mov	w0, w12
+	bl	FtlBbmIsBadBlock
+	cbnz	w0, .L2040
+	umull	x2, w21, w7
+	ldr	x0, [x5, 432]
+	lsl	w11, w11, 10
+	add	x0, x0, x2
+	str	w11, [x0, 4]
+	ldrh	w0, [x24, 2556]
+	ldr	x1, [x5, 432]
+	add	x1, x1, x2
+	ldr	x2, [x5, 3664]
+	mul	w0, w0, w21
+	add	w21, w21, 1
+	and	w21, w21, 65535
+	sdiv	w0, w0, w10
+	add	x0, x2, w0, sxtw 2
+	stp	xzr, x0, [x1, 8]
+.L2039:
+	add	w6, w6, 1
+	and	w6, w6, 65535
+	b	.L2037
+.L2040:
+	add	w19, w19, 1
+	and	w19, w19, 65535
+	b	.L2039
+.L2045:
+	add	x0, x20, :lo12:.LANCHOR0
+	ldrh	w1, [x0, 2546]
+	ldrb	w0, [x0, 204]
+	str	w1, [x29, 136]
+	cbnz	w0, .L2059
+	uxtw	x0, w1
+	mov	w23, 1
+	lsr	w28, w0, 2
+	b	.L2046
+.L2059:
+	mov	w23, 1
+	mov	w28, w23
+	b	.L2046
+.L2050:
+	umull	x0, w5, w6
+	ldr	x1, [x27, 432]
+	str	wzr, [x1, x0]
+	mov	w1, w26
+	ldr	x0, [x29, 120]
+	ldrb	w0, [x0, w5, sxtw]
+	bl	V2P_block
+	and	w8, w0, 65535
+	mov	w9, w8
+	cbz	w25, .L2048
+	bl	IsBlkInVendorPart
+	cbnz	w0, .L2049
+.L2048:
+	mov	w0, w9
+	bl	FtlBbmIsBadBlock
+	cbnz	w0, .L2049
+	umull	x2, w21, w6
+	ldr	x0, [x27, 432]
+	add	w8, w24, w8, lsl 10
+	add	x0, x0, x2
+	str	w8, [x0, 4]
+	ldr	x1, [x27, 432]
+	ldr	x0, [x27, 3640]
+	add	x1, x1, x2
+	ldr	x2, [x27, 3648]
+	str	x0, [x1, 8]
+	ldrh	w0, [x20, 2556]
+	mul	w0, w0, w21
+	add	w21, w21, 1
+	and	w21, w21, 65535
+	sdiv	w0, w0, w7
+	add	x0, x2, w0, sxtw 2
+	str	x0, [x1, 16]
+.L2049:
+	add	w5, w5, 1
+	and	w5, w5, 65535
+	b	.L2047
+.L2058:
+	mov	w19, 0
+	b	.L2035
 	.size	FtlLowFormatEraseBlock, .-FtlLowFormatEraseBlock
 	.align	2
 	.global	FtlBbmTblFlush
@@ -13595,562 +13324,556 @@ FtlLowFormatEraseBlock:
 FtlBbmTblFlush:
 	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
 	adrp	x22, .LANCHOR2
-	add	x2, x22, :lo12:.LANCHOR2
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	ldr	w1, [x2,424]
-	cbnz	w1, .L2119
-	adrp	x19, .LANCHOR4
-	adrp	x20, .LANCHOR0
-	add	x24, x19, :lo12:.LANCHOR4
-	add	x20, x20, :lo12:.LANCHOR0
-	ldr	x0, [x2,3616]
-	mov	x21, 0
-	ldr	x2, [x2,3664]
-	add	x23, x20, 2624
-	str	x2, [x24,1720]
-	ldrh	w2, [x20,2554]
-	str	x0, [x24,1712]
+	add	x19, x22, :lo12:.LANCHOR2
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldr	w0, [x19, 424]
+	cbnz	w0, .L2082
+	adrp	x20, .LANCHOR4
+	adrp	x23, .LANCHOR0
+	add	x25, x20, :lo12:.LANCHOR4
+	add	x21, x23, :lo12:.LANCHOR0
+	ldr	x2, [x19, 3656]
+	mov	w1, 0
+	ldr	x0, [x19, 3608]
+	add	x26, x21, 2656
+	str	x2, [x25, 1728]
+	mov	w24, 0
+	ldrh	w2, [x21, 2554]
+	str	x0, [x25, 1720]
 	bl	ftl_memset
-.L2120:
-	ldrh	w1, [x20,2494]
-	mov	w0, w21
-	add	x21, x21, 1
-	cmp	w0, w1
-	bge	.L2133
-	add	x1, x22, :lo12:.LANCHOR2
-	ldr	x3, [x24,1712]
-	ldrh	w2, [x1,3792]
-	add	x1, x23, x21, lsl 3
-	ldr	x1, [x1,24]
-	mul	w0, w0, w2
-	add	x0, x3, w0, sxtw 2
-	lsl	w2, w2, 2
-	bl	ftl_memcpy
-	b	.L2120
-.L2133:
-	add	x19, x19, :lo12:.LANCHOR4
-	mov	w1, 255
-	add	x19, x19, 1704
+.L2083:
+	ldrh	w0, [x21, 2494]
+	cmp	w24, w0
+	blt	.L2084
+	add	x20, x20, :lo12:.LANCHOR4
+	add	x19, x21, 2624
 	mov	w2, 16
-	mov	w24, 0
+	mov	w1, 255
 	adrp	x26, .LC125
-	ldr	x21, [x19,16]
-	adrp	x27, .LC126
-	mov	w25, w24
+	add	x23, x23, :lo12:.LANCHOR0
+	ldr	x28, [x20, 1728]
 	add	x26, x26, :lo12:.LC125
-	mov	x0, x21
-	add	x27, x27, :lo12:.LC126
+	mov	w24, 0
+	mov	x0, x28
 	bl	ftl_memset
 	mov	w0, -3887
-	strh	w0, [x21]
-	ldr	w0, [x23,8]
-	str	w0, [x21,4]
-	ldrh	w0, [x20,2624]
-	strh	w0, [x21,2]
-	ldrh	w0, [x23,4]
-	strh	w0, [x21,8]
-	ldrh	w0, [x23,6]
-	strh	w0, [x21,10]
-	ldr	w0, [x20,2468]
-	strh	w0, [x21,12]
-.L2122:
-	add	x28, x22, :lo12:.LANCHOR2
-	ldrh	w1, [x20,2624]
-	ldrh	w2, [x20,2626]
-	ldrh	w3, [x20,2628]
-	ldr	x0, [x28,3616]
-	str	x0, [x19,8]
-	ldr	x0, [x28,3664]
-	str	x0, [x19,16]
+	strh	w0, [x28]
+	ldr	w0, [x19, 8]
+	str	w0, [x28, 4]
+	ldrh	w0, [x21, 2624]
+	strh	w0, [x28, 2]
+	ldrh	w0, [x19, 4]
+	strh	w0, [x28, 8]
+	ldrh	w0, [x19, 6]
+	strh	w0, [x28, 10]
+	ldr	w0, [x21, 2468]
+	mov	w21, 0
+	strh	w0, [x28, 12]
+.L2085:
+	add	x25, x22, :lo12:.LANCHOR2
+	ldrh	w1, [x19]
+	ldrh	w2, [x19, 2]
+	ldrh	w3, [x19, 4]
+	ldr	x0, [x25, 3608]
+	str	x0, [x20, 1720]
+	ldr	x0, [x25, 3656]
+	str	x0, [x20, 1728]
 	orr	w0, w2, w1, lsl 10
-	str	w0, [x19,4]
+	str	wzr, [x20, 1712]
+	ldrh	w4, [x28, 10]
+	str	w0, [x20, 1716]
 	mov	x0, x26
-	ldrh	w4, [x21,10]
-	str	wzr, [x19]
 	bl	printk
-	ldrh	w0, [x20,2546]
-	ldrh	w1, [x20,2626]
+	ldrh	w0, [x23, 2546]
+	ldrh	w1, [x19, 2]
 	sub	w0, w0, #1
 	cmp	w1, w0
-	blt	.L2123
-	ldr	w0, [x20,2632]
-	strh	wzr, [x20,2626]
+	blt	.L2086
+	ldr	w0, [x19, 8]
+	mov	w2, 1
+	ldrh	w1, [x19]
 	add	w0, w0, 1
-	str	w0, [x20,2632]
-	str	w0, [x21,4]
-	ldrh	w0, [x20,2624]
-	ldrh	w1, [x20,2628]
-	strh	w0, [x21,8]
-	strh	w0, [x20,2628]
-	ldr	x0, [x28,432]
-	strh	w1, [x20,2624]
-	lsl	w1, w1, 10
-	str	w1, [x19,4]
-	str	w1, [x0,4]
-	mov	w1, 1
-	mov	w2, w1
-	ldr	x0, [x28,432]
+	str	w0, [x19, 8]
+	str	w0, [x28, 4]
+	strh	w1, [x28, 8]
+	ldrh	w0, [x19, 4]
+	strh	w1, [x19, 4]
+	ldr	x1, [x25, 432]
+	strh	w0, [x19]
+	lsl	w0, w0, 10
+	str	w0, [x20, 1716]
+	strh	wzr, [x19, 2]
+	str	w0, [x1, 4]
+	mov	w1, w2
+	ldr	x0, [x25, 432]
 	bl	FlashEraseBlocks
-.L2123:
-	mov	w1, 1
-	mov	x0, x19
-	mov	w2, w1
-	mov	w3, w1
+.L2086:
+	add	x25, x20, 1712
+	mov	w3, 1
+	mov	x0, x25
+	mov	w2, w3
+	mov	w1, w3
 	bl	FlashProgPages
-	ldrh	w0, [x20,2626]
+	ldrh	w0, [x19, 2]
 	add	w0, w0, 1
-	strh	w0, [x20,2626]
-	ldr	w0, [x19]
+	strh	w0, [x19, 2]
+	ldr	w0, [x20, 1712]
 	cmn	w0, #1
-	bne	.L2124
-	ldr	w1, [x19,4]
-	mov	x0, x27
-	add	w24, w24, 1
+	bne	.L2087
+	ldr	w1, [x20, 1716]
+	add	w21, w21, 1
+	adrp	x0, .LC126
+	and	w21, w21, 65535
+	add	x0, x0, :lo12:.LC126
 	bl	printk
-	uxth	w24, w24
-	cmp	w24, 3
-	bls	.L2122
+	cmp	w21, 3
+	bls	.L2085
+	ldr	w1, [x20, 1716]
+	add	x22, x22, :lo12:.LANCHOR2
+	mov	w2, w21
 	adrp	x0, .LC127
-	ldr	w1, [x19,4]
 	add	x0, x0, :lo12:.LC127
-	mov	w2, w24
-	add	x22, x22, :lo12:.LANCHOR2
 	bl	printk
 	mov	w0, 1
-	str	w0, [x22,424]
-	b	.L2119
-.L2124:
-	add	w25, w25, 1
-	cmp	w25, 1
-	beq	.L2122
-	cmp	w0, 256
-	beq	.L2122
-.L2119:
+	str	w0, [x22, 424]
+.L2082:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 96
 	ret
+.L2084:
+	ldrh	w2, [x19, 3784]
+	ldr	x1, [x26], 8
+	ldr	x0, [x25, 1720]
+	mul	w3, w2, w24
+	lsl	w2, w2, 2
+	add	w24, w24, 1
+	add	x0, x0, w3, sxtw 2
+	bl	ftl_memcpy
+	b	.L2083
+.L2090:
+	mov	w24, 1
+	b	.L2085
+.L2087:
+	add	w24, w24, 1
+	cmp	w24, 1
+	ble	.L2090
+	cmp	w0, 256
+	bne	.L2082
+	b	.L2085
 	.size	FtlBbmTblFlush, .-FtlBbmTblFlush
 	.align	2
 	.global	allocate_data_superblock
 	.type	allocate_data_superblock, %function
 allocate_data_superblock:
-	stp	x29, x30, [sp, -144]!
+	stp	x29, x30, [sp, -128]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	adrp	x21, .LANCHOR2
-	stp	x19, x20, [sp,16]
-	add	x19, x21, :lo12:.LANCHOR2
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	ldr	w1, [x19,424]
-	stp	x27, x28, [sp,80]
-	cbnz	w1, .L2135
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
+	adrp	x22, .LANCHOR2
+	add	x19, x22, :lo12:.LANCHOR2
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldr	w1, [x19, 424]
+	cbnz	w1, .L2096
+	adrp	x23, .LANCHOR0
 	mov	x20, x0
-	add	x23, x19, 656
-	adrp	x22, .LANCHOR0
-	mov	w24, 7
-	add	x25, x19, 544
-.L2136:
-	cmp	x20, x23
-	bne	.L2137
-	ldrh	w2, [x19,552]
-	ldr	w4, [x19,1380]
-	lsr	w3, w2, 1
-	add	w1, w3, 1
-	mul	w0, w2, w4
-	add	w1, w1, w0, lsr 2
-	add	x0, x22, :lo12:.LANCHOR0
-	uxth	w1, w1
-	ldr	w0, [x0,2372]
-	cbz	w0, .L2138
-	ldr	w0, [x19,776]
-	cmp	w0, 39
-	bhi	.L2138
-	cmp	w0, 2
-	mov	w1, 0
-	bls	.L2139
-	tbz	x2, 0, .L2166
-	cbz	w4, .L2139
-.L2166:
-	mov	w1, w3
-	b	.L2138
-.L2137:
-	ldrb	w0, [x20,8]
-	mov	w1, 0
+	add	x24, x19, 656
+	add	x21, x23, :lo12:.LANCHOR0
+.L2097:
+	cmp	x20, x24
+	bne	.L2098
+	ldrh	w2, [x19, 552]
+	ldr	w3, [x19, 1376]
+	lsr	w0, w2, 1
+	add	w4, w0, 1
+	mul	w1, w2, w3
+	add	w1, w4, w1, lsr 2
+	ldr	w4, [x21, 2372]
+	and	w1, w1, 65535
+	cbz	w4, .L2099
+	ldr	w4, [x19, 776]
+	cmp	w4, 39
+	bhi	.L2099
+	cmp	w4, 2
+	bls	.L2126
+	tbz	x2, 0, .L2122
+	cbz	w3, .L2126
+.L2122:
+	mov	w1, w0
+	b	.L2099
+.L2098:
+	ldrb	w0, [x20, 8]
 	cmp	w0, 1
-	bne	.L2139
-	add	x2, x22, :lo12:.LANCHOR0
-	ldrh	w0, [x2,2492]
+	bne	.L2126
+	ldrh	w0, [x21, 2492]
 	cmp	w0, 1
-	beq	.L2139
-	ldrb	w0, [x2,204]
-	cbnz	w0, .L2139
-	ldr	w2, [x2,2372]
-	ldrh	w0, [x19,552]
+	beq	.L2126
+	ldrb	w0, [x21, 204]
+	cbnz	w0, .L2126
+	ldr	w2, [x21, 2372]
+	ldrh	w0, [x19, 552]
 	lsr	w1, w0, 3
-	cbz	w2, .L2138
-	ldr	w2, [x19,776]
+	cbz	w2, .L2099
+	ldr	w2, [x19, 776]
 	cmp	w2, 1
-	bhi	.L2138
-	mul	w1, w0, w24
+	bhi	.L2099
+	mov	w1, 7
+	mul	w1, w0, w1
 	lsr	w1, w1, 3
-.L2138:
-	cbz	w1, .L2139
+.L2099:
+	cbz	w1, .L2100
 	sub	w1, w1, #1
-	uxth	w1, w1
-.L2139:
-	ldrb	w2, [x20,8]
-	mov	x0, x25
-	add	x27, x22, :lo12:.LANCHOR0
+	and	w1, w1, 65535
+.L2100:
+	ldrb	w2, [x20, 8]
+	add	x0, x19, 544
 	bl	List_pop_index_node
-	uxth	w28, w0
-	ldrh	w0, [x19,552]
+	and	w27, w0, 65535
+	ldrh	w0, [x19, 552]
 	sub	w0, w0, #1
-	strh	w0, [x19,552]
-	ldrh	w0, [x27,2480]
-	cmp	w0, w28
-	bls	.L2136
-	ubfiz	x26, x28, 1, 16
-	ldr	x0, [x19,520]
-	ldrh	w0, [x0,x26]
-	cbnz	w0, .L2136
-	strh	w28, [x20]
+	strh	w0, [x19, 552]
+	ldrh	w0, [x21, 2480]
+	cmp	w0, w27
+	bls	.L2097
+	ldr	x0, [x19, 520]
+	ubfiz	x26, x27, 1, 16
+	ldrh	w25, [x0, x26]
+	cbnz	w25, .L2097
+	strh	w27, [x20]
 	mov	x0, x20
 	bl	make_superblock
-	ldrb	w0, [x20,7]
-	cbz	w0, .L2191
+	ldrb	w0, [x20, 7]
+	cbz	w0, .L2143
+	add	x28, x20, 16
+	ldrh	w5, [x21, 2472]
+	mov	x3, x28
 	mov	x0, 0
-	ldrh	w5, [x27,2472]
-	mov	x3, 56
-	mov	w27, w0
+	mov	x4, 56
 	mov	w6, 65535
-.L2143:
+.L2103:
 	cmp	w5, w0, uxth
-	bls	.L2194
-	ldr	x4, [x19,432]
-	madd	x1, x0, x3, x4
-	str	xzr, [x1,16]
-	str	xzr, [x1,8]
-	add	x1, x20, x0, lsl 1
-	ldrh	w1, [x1,16]
-	cmp	w1, w6
-	beq	.L2144
-	umull	x2, w27, w3
-	add	w27, w27, 1
-	lsl	w1, w1, 10
-	add	x2, x4, x2
-	uxth	w27, w27
-	str	w1, [x2,4]
-.L2144:
-	add	x0, x0, 1
-	b	.L2143
-.L2194:
+	bhi	.L2105
+	ldr	w0, [x21, 2372]
+	cbz	w0, .L2106
 	add	x0, x19, 560
 	cmp	x20, x0
-	bne	.L2146
-	add	x1, x22, :lo12:.LANCHOR0
-	ldr	w1, [x1,2372]
-	cbz	w1, .L2146
-	ldr	x1, [x19,440]
-	ldrh	w1, [x1,x26]
-	cmp	w1, 40
-	bls	.L2146
-	strb	wzr, [x19,568]
-.L2146:
-	ldrb	w0, [x20,8]
-	cbnz	w0, .L2147
-	ldr	x0, [x19,440]
-	mov	w1, 2
-	ldrh	w2, [x0,x26]
-	cbz	w2, .L2192
-	add	x1, x22, :lo12:.LANCHOR0
-	ldrh	w1, [x1,2536]
-	add	w1, w2, w1
-.L2192:
-	strh	w1, [x0,x26]
+	bne	.L2106
+	ldr	x0, [x19, 440]
+	ldrh	w0, [x0, x26]
+	cmp	w0, 40
+	bls	.L2106
+	strb	wzr, [x20, 8]
+.L2106:
+	ldrb	w0, [x20, 8]
+	ldr	x1, [x19, 440]
+	cbnz	w0, .L2107
+	ldrh	w0, [x1, x26]
+	cbz	w0, .L2108
+	ldrh	w2, [x21, 2536]
+	add	w0, w0, w2
+.L2144:
+	strh	w0, [x1, x26]
 	mov	w1, 0
-	ldr	w0, [x19,760]
+	ldr	w0, [x19, 760]
 	add	w0, w0, 1
-	str	w0, [x19,760]
-	mov	w0, w28
+	str	w0, [x19, 760]
+	mov	w0, w27
 	bl	ftl_set_blk_mode
-	b	.L2150
-.L2147:
-	ldr	x1, [x19,440]
-	ldrh	w0, [x1,x26]
-	add	w0, w0, 1
-	strh	w0, [x1,x26]
-	ldr	w0, [x19,764]
-	add	w0, w0, 1
-	str	w0, [x19,764]
-	mov	w0, w28
-	bl	ftl_set_blk_mode.part.9
-.L2150:
-	ldr	x0, [x19,440]
-	ldr	w1, [x19,772]
-	ldrh	w0, [x0,x26]
+.L2110:
+	ldr	x0, [x19, 440]
+	ldr	w1, [x19, 772]
+	ldrh	w0, [x0, x26]
 	cmp	w0, w1
-	bls	.L2151
-	str	w0, [x19,772]
-.L2151:
-	add	x2, x22, :lo12:.LANCHOR0
-	ldr	w3, [x19,760]
-	ldr	w0, [x19,764]
-	ldrh	w1, [x2,2536]
-	madd	w0, w1, w3, w0
-	ldrh	w1, [x2,2480]
-	mov	x3, 56
+	bls	.L2111
+	str	w0, [x19, 772]
+.L2111:
+	ldr	w2, [x19, 760]
+	ldr	w1, [x19, 764]
+	ldrh	w0, [x21, 2536]
+	madd	w0, w0, w2, w1
+	ldrh	w1, [x21, 2480]
+	mov	w2, 56
+	umull	x2, w25, w2
 	udiv	w0, w0, w1
-	ldr	x1, [x19,3704]
-	str	w0, [x19,768]
-	ldr	w0, [x1,16]
+	ldr	x1, [x19, 3696]
+	str	w0, [x19, 768]
+	ldr	w0, [x1, 16]
 	add	w0, w0, 1
-	str	w0, [x1,16]
+	str	w0, [x1, 16]
 	mov	x0, 0
-.L2152:
-	cmp	w27, w0, uxth
-	bls	.L2195
-	ldr	x1, [x19,432]
-	madd	x1, x0, x3, x1
-	add	x0, x0, 1
-	ldr	w2, [x1,4]
-	and	w2, w2, -1024
-	str	w2, [x1,4]
-	b	.L2152
-.L2195:
-	add	x0, x22, :lo12:.LANCHOR0
-	ldrb	w0, [x0,204]
-	cbz	w0, .L2154
-	ldrb	w0, [x20,8]
+.L2112:
+	cmp	x2, x0
+	bne	.L2113
+	ldrb	w0, [x21, 204]
+	cbz	w0, .L2114
+	ldrb	w0, [x20, 8]
+	mov	w2, w25
 	cmp	w0, 1
-	ldr	x0, [x19,432]
-	bne	.L2155
+	bne	.L2115
 	mov	w1, 0
-	b	.L2193
-.L2155:
-	mov	w1, 1
-.L2193:
-	mov	w2, w27
+.L2145:
+	ldr	x0, [x19, 432]
 	bl	FlashEraseBlocks
-.L2154:
-	ldrb	w1, [x20,8]
-	mov	w2, w27
-	ldr	x0, [x19,432]
+.L2114:
+	ldrb	w1, [x20, 8]
+	mov	w2, w25
+	ldr	x0, [x19, 432]
 	bl	FlashEraseBlocks
 	mov	x1, 0
+	mov	w2, 0
 	mov	x4, 56
-	mov	w2, w1
-.L2156:
-	cmp	w27, w1, uxth
-	bls	.L2196
+.L2116:
+	cmp	w25, w1, uxth
+	bhi	.L2118
+	cmp	w2, 0
+	ble	.L2119
+	mov	w0, w27
+	bl	update_multiplier_value
+	bl	FtlBbmTblFlush
+.L2119:
+	ldrb	w0, [x20, 7]
+	cbnz	w0, .L2120
+.L2143:
+	ldr	x0, [x19, 520]
+	mov	w1, -1
+	strh	w1, [x0, x26]
+	b	.L2097
+.L2126:
+	mov	w1, 0
+	b	.L2100
+.L2105:
+	ldr	x1, [x19, 432]
+	madd	x2, x0, x4, x1
+	stp	xzr, xzr, [x2, 8]
+	ldrh	w2, [x3]
+	cmp	w2, w6
+	beq	.L2104
+	umull	x7, w25, w4
+	add	w25, w25, 1
+	and	w25, w25, 65535
+	lsl	w2, w2, 10
+	add	x1, x1, x7
+	str	w2, [x1, 4]
+.L2104:
+	add	x0, x0, 1
+	add	x3, x3, 2
+	b	.L2103
+.L2108:
+	mov	w0, 2
+	b	.L2144
+.L2107:
+	ldrh	w0, [x1, x26]
+	add	w0, w0, 1
+	strh	w0, [x1, x26]
+	ldr	w0, [x19, 764]
+	add	w0, w0, 1
+	str	w0, [x19, 764]
+	mov	w0, w27
+	bl	ftl_set_blk_mode.part.9
+	b	.L2110
+.L2113:
+	ldr	x1, [x19, 432]
+	add	x1, x1, x0
+	add	x0, x0, 56
+	ldr	w3, [x1, 4]
+	and	w3, w3, -1024
+	str	w3, [x1, 4]
+	b	.L2112
+.L2115:
+	mov	w1, 1
+	b	.L2145
+.L2118:
 	mul	x0, x1, x4
-	ldr	x3, [x19,432]
+	ldr	x3, [x19, 432]
 	add	x5, x3, x0
-	ldr	w3, [x3,x0]
+	ldr	w3, [x3, x0]
 	cmn	w3, #1
-	bne	.L2157
-	ldr	w0, [x5,4]
+	bne	.L2117
 	add	w2, w2, 1
-	str	x4, [x29,104]
+	ldr	w0, [x5, 4]
+	stp	x4, x1, [x29, 104]
+	stp	w3, w2, [x29, 120]
 	lsr	w0, w0, 10
-	str	x3, [x29,112]
-	str	x1, [x29,120]
-	str	x2, [x29,128]
-	str	x2, [x29,136]
 	bl	FtlBbmMapBadBlock
-	ldr	x1, [x29,120]
-	ldr	x3, [x29,112]
-	ldr	x4, [x29,104]
-	add	x0, x20, x1, lsl 1
-	ldr	x2, [x29,136]
-	strh	w3, [x0,16]
-	ldrb	w0, [x20,7]
+	ldp	w3, w2, [x29, 120]
+	strh	w3, [x28]
+	ldp	x4, x1, [x29, 104]
+	ldrb	w0, [x20, 7]
 	sub	w0, w0, #1
-	strb	w0, [x20,7]
-.L2157:
+	strb	w0, [x20, 7]
+.L2117:
 	add	x1, x1, 1
-	b	.L2156
-.L2196:
-	cbz	w2, .L2159
-	mov	w0, w28
-	bl	update_multiplier_value
-	bl	FtlBbmTblFlush
-.L2159:
-	ldrb	w0, [x20,7]
-	cbnz	w0, .L2160
-.L2191:
-	ldr	x0, [x19,520]
-	mov	w1, -1
-	strh	w1, [x0,x26]
-	b	.L2136
-.L2160:
-	adrp	x1, .LANCHOR0
-	add	x21, x21, :lo12:.LANCHOR2
-	add	x1, x1, :lo12:.LANCHOR0
-	strh	wzr, [x20,2]
-	strb	wzr, [x20,6]
-	ldrh	w1, [x1,2544]
-	strh	w28, [x20]
+	add	x28, x28, 2
+	b	.L2116
+.L2120:
+	add	x23, x23, :lo12:.LANCHOR0
+	add	x22, x22, :lo12:.LANCHOR2
+	strh	wzr, [x20, 2]
+	strb	wzr, [x20, 6]
+	ldrh	w1, [x23, 2544]
+	strh	w27, [x20]
 	mul	w0, w0, w1
-	ldr	w1, [x21,752]
-	str	w1, [x20,12]
-	uxth	w0, w0
+	ldr	w1, [x22, 752]
+	str	w1, [x20, 12]
+	and	w0, w0, 65535
 	add	w1, w1, 1
-	strh	w0, [x20,4]
-	str	w1, [x21,752]
-	ldr	x1, [x21,520]
+	strh	w0, [x20, 4]
+	str	w1, [x22, 752]
+	ldr	x1, [x22, 520]
 	ldrh	w2, [x20]
-	strh	w0, [x1,x2,lsl 1]
-.L2135:
+	strh	w0, [x1, x2, lsl 1]
+.L2096:
+	ldp	x19, x20, [sp, 16]
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 144
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 128
 	ret
 	.size	allocate_data_superblock, .-allocate_data_superblock
 	.align	2
 	.global	FtlGcFreeBadSuperBlk
 	.type	FtlGcFreeBadSuperBlk, %function
 FtlGcFreeBadSuperBlk:
-	stp	x29, x30, [sp, -80]!
+	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x19, .LANCHOR2
-	str	x25, [sp,64]
-	add	x19, x19, :lo12:.LANCHOR2
-	stp	x23, x24, [sp,48]
-	uxth	w23, w0
-	ldrh	w0, [x19,1464]
-	stp	x21, x22, [sp,32]
-	mov	w21, 0
-	cbz	w0, .L2199
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR2
+	add	x20, x20, :lo12:.LANCHOR2
+	stp	x23, x24, [sp, 48]
+	and	w23, w0, 65535
+	stp	x21, x22, [sp, 32]
+	stp	x25, x26, [sp, 64]
+	ldrh	w0, [x20, 1456]
+	str	x27, [sp, 80]
+	cbz	w0, .L2147
 	adrp	x22, .LANCHOR0
-	adrp	x24, .LC128
+	add	x24, x20, 1464
 	add	x22, x22, :lo12:.LANCHOR0
-	add	x24, x24, :lo12:.LC128
-.L2207:
-	ldrh	w0, [x22,2472]
+	mov	w21, 0
+.L2148:
+	ldrh	w0, [x22, 2472]
 	cmp	w0, w21
-	bls	.L2208
+	bhi	.L2154
+	bl	FtlGcReFreshBadBlk
+.L2147:
+	mov	w0, 0
+	ldr	x27, [sp, 80]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 96
+	ret
+.L2154:
 	add	x0, x22, 2504
 	mov	w1, w23
-	mov	w20, 0
-	ldrb	w0, [x0,w21,sxtw]
+	adrp	x26, .LC128
+	add	x26, x26, :lo12:.LC128
+	mov	w19, 0
+	ldrb	w0, [x0, w21, sxtw]
 	bl	V2P_block
-	uxth	w25, w0
-.L2200:
-	ldrh	w0, [x19,1464]
-	cmp	w0, w20
-	bls	.L2209
-	add	x0, x19, 1472
-	ldrh	w0, [x0,w20,sxtw 1]
+	and	w25, w0, 65535
+.L2149:
+	ldrh	w0, [x20, 1456]
+	cmp	w0, w19
+	bhi	.L2153
+	add	w21, w21, 1
+	and	w21, w21, 65535
+	b	.L2148
+.L2153:
+	ldrh	w0, [x24, w19, sxtw 1]
+	add	w27, w19, 1
 	cmp	w0, w25
-	bne	.L2201
+	bne	.L2150
 	mov	w1, w25
-	mov	x0, x24
+	mov	x0, x26
 	bl	printk
 	mov	w0, w25
 	bl	FtlBbmMapBadBlock
 	bl	FtlBbmTblFlush
-	ldrh	w2, [x19,1464]
-	mov	w3, w20
-.L2202:
-	cmp	w3, w2
-	bcs	.L2210
-	add	x4, x19, 1472
-	add	w0, w3, 1
-	ldrh	w1, [x4,w0,sxtw 1]
-	strh	w1, [x4,w3,sxtw 1]
-	uxth	w3, w0
-	b	.L2202
-.L2210:
-	sub	w2, w2, #1
-	strh	w2, [x19,1464]
-.L2201:
-	add	w20, w20, 1
-	uxth	w20, w20
-	b	.L2200
-.L2209:
-	add	w21, w21, 1
-	uxth	w21, w21
-	b	.L2207
-.L2208:
-	bl	FtlGcReFreshBadBlk
-.L2199:
-	mov	w0, 0
-	ldr	x25, [sp,64]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 80
-	ret
+	ldrh	w0, [x20, 1456]
+	mov	w1, w27
+.L2151:
+	cmp	w19, w0
+	bcc	.L2152
+	sub	w0, w0, #1
+	strh	w0, [x20, 1456]
+.L2150:
+	and	w19, w27, 65535
+	b	.L2149
+.L2152:
+	sub	w2, w1, #1
+	ldrh	w3, [x24, w1, sxtw 1]
+	add	w19, w19, 1
+	add	w1, w1, 1
+	and	w19, w19, 65535
+	strh	w3, [x24, w2, sxtw 1]
+	b	.L2151
 	.size	FtlGcFreeBadSuperBlk, .-FtlGcFreeBadSuperBlk
 	.align	2
 	.global	update_vpc_list
 	.type	update_vpc_list, %function
 update_vpc_list:
-	stp	x29, x30, [sp, -32]!
+	and	w13, w0, 65535
+	adrp	x8, .LANCHOR2
+	add	x0, x8, :lo12:.LANCHOR2
+	stp	x29, x30, [sp, -16]!
+	ubfiz	x1, x13, 1, 16
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR2
-	uxth	w19, w0
-	add	x1, x20, :lo12:.LANCHOR2
-	ubfiz	x0, x19, 1, 16
-	ldr	x2, [x1,520]
-	ldrh	w2, [x2,x0]
-	cbnz	w2, .L2212
-	ldrh	w0, [x1,800]
-	cmp	w0, w19
-	bne	.L2213
-	mov	w0, -1
-	strh	w0, [x1,800]
-	b	.L2214
-.L2213:
-	ldrh	w3, [x1,560]
-	mov	w0, w2
-	cmp	w3, w19
-	beq	.L2215
-	ldrh	w3, [x1,608]
-	cmp	w3, w19
-	beq	.L2215
-	ldrh	w1, [x1,656]
-	cmp	w1, w19
-	beq	.L2215
-.L2214:
-	add	x20, x20, :lo12:.LANCHOR2
-	mov	w1, w19
-	add	x0, x20, 512
+	ldr	x2, [x0, 520]
+	ldrh	w1, [x2, x1]
+	cbnz	w1, .L2160
+	ldrh	w1, [x0, 800]
+	cmp	w1, w13
+	bne	.L2161
+	mov	w1, -1
+	strh	w1, [x0, 800]
+.L2162:
+	add	x8, x8, :lo12:.LANCHOR2
+	mov	w1, w13
+	add	x0, x8, 512
 	bl	List_remove_node
-	ldrh	w0, [x20,536]
+	ldrh	w0, [x8, 536]
 	sub	w0, w0, #1
-	strh	w0, [x20,536]
-	mov	w0, w19
+	strh	w0, [x8, 536]
+	mov	w0, w13
 	bl	free_data_superblock
-	mov	w0, w19
+	mov	w0, w13
 	bl	FtlGcFreeBadSuperBlk
 	mov	w0, 1
-	b	.L2215
-.L2212:
-	mov	w0, w19
-	bl	List_update_data_list
-	mov	w0, 0
-.L2215:
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 32
+.L2159:
+	ldp	x29, x30, [sp], 16
 	ret
+.L2161:
+	ldrh	w1, [x0, 560]
+	cmp	w1, w13
+	beq	.L2166
+	ldrh	w1, [x0, 608]
+	cmp	w1, w13
+	beq	.L2166
+	ldrh	w0, [x0, 656]
+	cmp	w0, w13
+	bne	.L2162
+.L2166:
+	mov	w0, 0
+	b	.L2159
+.L2160:
+	mov	w0, w13
+	bl	List_update_data_list
+	b	.L2166
 	.size	update_vpc_list, .-update_vpc_list
 	.align	2
 	.global	decrement_vpc_count
@@ -14158,73 +13881,72 @@ update_vpc_list:
 decrement_vpc_count:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	uxth	w19, w0
+	stp	x19, x20, [sp, 16]
+	and	w19, w0, 65535
+	stp	x21, x22, [sp, 32]
 	mov	w0, 65535
-	stp	x21, x22, [sp,32]
-	cmp	w19, w0
 	adrp	x20, .LANCHOR2
-	beq	.L2220
+	cmp	w19, w0
+	beq	.L2169
 	add	x21, x20, :lo12:.LANCHOR2
 	ubfiz	x22, x19, 1, 16
-	ldr	x0, [x21,520]
-	ldrh	w2, [x0,x22]
-	cbnz	w2, .L2221
-	adrp	x0, .LC129
+	ldr	x1, [x21, 520]
+	ldrh	w0, [x1, x22]
+	cbnz	w0, .L2170
 	mov	w1, w19
+	mov	w2, 0
+	adrp	x0, .LC129
 	add	x0, x0, :lo12:.LC129
-	add	x20, x21, 544
 	bl	printk
-	ldr	x0, [x21,520]
+	ldr	x0, [x21, 520]
+	add	x6, x21, 544
 	mov	w1, 32
-	strh	w1, [x0,x22]
-	mov	x0, x20
+	strh	w1, [x0, x22]
 	mov	w1, w19
+	mov	x0, x6
 	bl	test_node_in_list
-	cbz	w0, .L2222
+	cbz	w0, .L2171
 	mov	w1, w19
-	mov	x0, x20
+	mov	x0, x6
 	bl	List_remove_node
-	ldrh	w0, [x21,552]
+	ldrh	w0, [x21, 552]
 	sub	w0, w0, #1
-	strh	w0, [x21,552]
+	strh	w0, [x21, 552]
 	mov	w0, w19
 	bl	INSERT_DATA_LIST
-	ldr	x2, [x21,520]
+	ldr	x0, [x21, 520]
+	mov	w1, w19
+	ldrh	w2, [x0, x22]
 	adrp	x0, .LC130
 	add	x0, x0, :lo12:.LC130
-	mov	w1, w19
-	ldrh	w2, [x2,x22]
 	bl	printk
-.L2222:
+.L2171:
 	mov	w0, w19
 	bl	FtlGcRefreshBlock
-	b	.L2229
-.L2221:
-	sub	w2, w2, #1
-	strh	w2, [x0,x22]
-.L2220:
-	add	x20, x20, :lo12:.LANCHOR2
-	mov	w0, 65535
-	ldrh	w1, [x20,3880]
-	cmp	w1, w0
-	bne	.L2224
-	strh	w19, [x20,3880]
-.L2229:
+.L2174:
 	mov	w0, 0
-	b	.L2223
-.L2224:
-	cmp	w1, w19
-	mov	w0, 0
-	beq	.L2223
-	mov	w0, w1
+	b	.L2168
+.L2170:
+	sub	w0, w0, #1
+	strh	w0, [x1, x22]
+.L2169:
+	add	x20, x20, :lo12:.LANCHOR2
+	mov	w1, 65535
+	ldrh	w0, [x20, 3872]
+	cmp	w0, w1
+	bne	.L2173
+	strh	w19, [x20, 3872]
+	b	.L2174
+.L2173:
+	cmp	w19, w0
+	beq	.L2174
 	bl	update_vpc_list
-	cmp	w0, wzr
+	cmp	w0, 0
 	cset	w0, ne
-	strh	w19, [x20,3880]
-.L2223:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
+	strh	w19, [x20, 3872]
+.L2168:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	decrement_vpc_count, .-decrement_vpc_count
@@ -14232,95 +13954,94 @@ decrement_vpc_count:
 	.global	FtlSlcSuperblockCheck
 	.type	FtlSlcSuperblockCheck, %function
 FtlSlcSuperblockCheck:
+	ldrh	w1, [x0, 4]
+	cbz	w1, .L2191
+	ldrh	w2, [x0]
+	mov	w1, 65535
+	cmp	w2, w1
+	beq	.L2191
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	ldrh	w1, [x0,4]
-	cbz	w1, .L2230
-	ldrh	w1, [x0]
-	mov	w20, 65535
-	cmp	w1, w20
-	beq	.L2230
+	stp	x19, x20, [sp, 16]
 	mov	x19, x0
-	ldrb	w0, [x0,6]
+	stp	x21, x22, [sp, 32]
 	adrp	x21, .LANCHOR2
-	adrp	x22, .LANCHOR0
-	add	x0, x0, 8
 	add	x21, x21, :lo12:.LANCHOR2
-	add	x21, x21, 1508
-	ldrh	w0, [x19,x0,lsl 1]
-.L2234:
-	cmp	w0, w20
-	bne	.L2241
-.L2236:
-	ldrb	w0, [x19,6]
-	add	x1, x22, :lo12:.LANCHOR0
-	add	w0, w0, 1
-	ldrh	w1, [x1,2472]
-	uxtb	w0, w0
-	strb	w0, [x19,6]
-	cmp	w1, w0
-	bne	.L2235
-	ldrh	w0, [x19,2]
-	strb	wzr, [x19,6]
-	add	w0, w0, 1
-	strh	w0, [x19,2]
-.L2235:
-	ldrb	w0, [x19,6]
+	adrp	x20, .LANCHOR0
+	ldrb	w0, [x0, 6]
+	add	x22, x20, :lo12:.LANCHOR0
+	add	x21, x21, 1500
 	add	x0, x0, 8
-	ldrh	w0, [x19,x0,lsl 1]
-	b	.L2234
-.L2241:
-	ldrb	w1, [x19,8]
+	ldrh	w1, [x19, x0, lsl 1]
+.L2183:
+	mov	w0, 65535
+	cmp	w1, w0
+	beq	.L2185
+	ldrb	w1, [x19, 8]
 	cmp	w1, 1
-	bne	.L2237
-	add	x0, x22, :lo12:.LANCHOR0
-	ldrb	w0, [x0,204]
-	cbnz	w0, .L2237
-	ldrh	w0, [x19,2]
-	ldrh	w0, [x21,w0,sxtw 1]
-	cmp	w0, w20
-	bne	.L2237
-	ldrh	w0, [x19,4]
+	bne	.L2186
+	ldrb	w2, [x22, 204]
+	cbnz	w2, .L2186
+	ldrh	w2, [x19, 2]
+	ldrh	w2, [x21, x2, lsl 1]
+	cmp	w2, w0
+	bne	.L2186
+	ldrh	w0, [x19, 4]
 	sub	w0, w0, #1
-	strh	w0, [x19,4]
+	strh	w0, [x19, 4]
 	ldrh	w0, [x19]
 	bl	decrement_vpc_count
-	ldrh	w1, [x19,4]
-	cbnz	w1, .L2236
-	ldrh	w0, [x19,2]
-	strb	w1, [x19,6]
+	ldrh	w0, [x19, 4]
+	cbnz	w0, .L2185
+	ldrh	w0, [x19, 2]
 	add	w0, w0, 1
-	strh	w0, [x19,2]
-	b	.L2230
-.L2237:
-	adrp	x0, .LANCHOR0
-	add	x0, x0, :lo12:.LANCHOR0
-	ldrb	w2, [x0,204]
-	cbz	w2, .L2230
+.L2194:
+	strh	w0, [x19, 2]
+	strb	wzr, [x19, 6]
+.L2179:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	ret
+.L2185:
+	ldrb	w0, [x19, 6]
+	ldrh	w1, [x22, 2472]
+	add	w0, w0, 1
+	and	w0, w0, 255
+	strb	w0, [x19, 6]
+	cmp	w1, w0
+	bne	.L2184
+	ldrh	w0, [x19, 2]
+	strb	wzr, [x19, 6]
+	add	w0, w0, 1
+	strh	w0, [x19, 2]
+.L2184:
+	ldrb	w0, [x19, 6]
+	add	x0, x0, 8
+	ldrh	w1, [x19, x0, lsl 1]
+	b	.L2183
+.L2186:
+	add	x0, x20, :lo12:.LANCHOR0
+	ldrb	w2, [x0, 204]
+	cbz	w2, .L2179
 	cmp	w1, 1
-	bne	.L2230
-	ldrh	w2, [x19,2]
-	ldrh	w1, [x0,2546]
+	bne	.L2179
+	ldrh	w2, [x19, 2]
+	ldrh	w1, [x0, 2546]
 	cmp	w2, w1
-	bcc	.L2230
-	adrp	x2, .LANCHOR2+520
+	bcc	.L2179
 	ldrh	w1, [x19]
-	ldrh	w4, [x19,4]
+	adrp	x2, .LANCHOR2+520
+	ldrh	w4, [x19, 4]
+	ldr	x3, [x2, #:lo12:.LANCHOR2+520]
 	lsl	x1, x1, 1
-	ldr	x3, [x2,#:lo12:.LANCHOR2+520]
-	ldrh	w2, [x3,x1]
+	ldrh	w2, [x3, x1]
 	sub	w2, w2, w4
-	strh	w2, [x3,x1]
-	strh	wzr, [x19,4]
-	ldrh	w0, [x0,2544]
-	strh	w0, [x19,2]
-	strb	wzr, [x19,6]
-.L2230:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 48
+	strh	w2, [x3, x1]
+	strh	wzr, [x19, 4]
+	ldrh	w0, [x0, 2544]
+	b	.L2194
+.L2191:
 	ret
 	.size	FtlSlcSuperblockCheck, .-FtlSlcSuperblockCheck
 	.align	2
@@ -14329,130 +14050,118 @@ FtlSlcSuperblockCheck:
 get_new_active_ppa:
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
+	stp	x19, x20, [sp, 16]
 	mov	x19, x0
-	strb	wzr, [x0,10]
-	ldrb	w0, [x0,6]
+	stp	x21, x22, [sp, 32]
 	adrp	x21, .LANCHOR2
+	str	x23, [sp, 48]
 	add	x21, x21, :lo12:.LANCHOR2
-	mov	w22, 65535
-	add	x0, x0, 8
-	adrp	x23, .LANCHOR0
-	add	x21, x21, 1508
-	ldrh	w0, [x19,x0,lsl 1]
-.L2243:
-	cmp	w0, w22
+	strb	wzr, [x0, 10]
 	adrp	x20, .LANCHOR0
-	bne	.L2258
-.L2244:
-	ldrb	w0, [x19,6]
-	add	x1, x23, :lo12:.LANCHOR0
-	add	w0, w0, 1
-	ldrh	w1, [x1,2472]
-	uxtb	w0, w0
-	strb	w0, [x19,6]
-	cmp	w1, w0
-	bne	.L2245
-	ldrh	w0, [x19,2]
-	strb	wzr, [x19,6]
-	add	w0, w0, 1
-	strh	w0, [x19,2]
-.L2245:
-	ldrb	w0, [x19,6]
+	ldrb	w0, [x0, 6]
+	add	x21, x21, 1500
+	add	x23, x20, :lo12:.LANCHOR0
 	add	x0, x0, 8
-	ldrh	w0, [x19,x0,lsl 1]
-	b	.L2243
-.L2258:
-	ldrb	w1, [x19,8]
+	ldrh	w0, [x19, x0, lsl 1]
+.L2196:
+	mov	w2, 65535
+	cmp	w0, w2
+	beq	.L2197
+	ldrb	w1, [x19, 8]
+	ldrh	w22, [x19, 2]
 	cmp	w1, 1
-	bne	.L2246
-	add	x1, x23, :lo12:.LANCHOR0
-	ldrb	w1, [x1,204]
-	cbnz	w1, .L2246
-	ldrh	w1, [x19,2]
-	ldrh	w1, [x21,w1,sxtw 1]
-	cmp	w1, w22
-	bne	.L2246
-	ldrh	w0, [x19,4]
-	sub	w0, w0, #1
-	strh	w0, [x19,4]
+	ldrh	w1, [x19, 4]
+	bne	.L2199
+	ldrb	w3, [x23, 204]
+	cbnz	w3, .L2199
+	ldrh	w3, [x21, w22, sxtw 1]
+	cmp	w3, w2
+	bne	.L2199
 	ldrh	w0, [x19]
+	sub	w1, w1, #1
+	strh	w1, [x19, 4]
 	bl	decrement_vpc_count
-	b	.L2244
-.L2246:
-	ldrh	w1, [x19,4]
+.L2197:
+	ldrb	w0, [x19, 6]
+	ldrh	w1, [x23, 2472]
+	add	w0, w0, 1
+	and	w0, w0, 255
+	strb	w0, [x19, 6]
+	cmp	w1, w0
+	bne	.L2198
+	ldrh	w0, [x19, 2]
+	strb	wzr, [x19, 6]
+	add	w0, w0, 1
+	strh	w0, [x19, 2]
+.L2198:
+	ldrb	w0, [x19, 6]
+	add	x0, x0, 8
+	ldrh	w0, [x19, x0, lsl 1]
+	b	.L2196
+.L2199:
 	adrp	x21, .LANCHOR2
-	ldrh	w22, [x19,2]
-	mov	w23, 65535
 	add	x21, x21, :lo12:.LANCHOR2
-	sub	w1, w1, #1
 	orr	w22, w22, w0, lsl 10
-	strh	w1, [x19,4]
-	mov	w24, w23
-	add	x21, x21, 1508
-.L2247:
-	add	x0, x20, :lo12:.LANCHOR0
-	ldrb	w1, [x19,6]
-	ldrh	w2, [x0,2472]
-.L2249:
-	add	w1, w1, 1
-	uxtb	w1, w1
-	cmp	w1, w2
-	bne	.L2248
-	ldrh	w1, [x19,2]
-	add	w1, w1, 1
-	strh	w1, [x19,2]
-	mov	w1, 0
-.L2248:
-	add	x0, x19, w1, sxtw 1
-	ldrh	w0, [x0,16]
-	cmp	w0, w23
-	beq	.L2249
-	ldrb	w0, [x19,8]
-	strb	w1, [x19,6]
+	add	x20, x20, :lo12:.LANCHOR0
+	add	x21, x21, 1500
+	sub	w1, w1, #1
+	strh	w1, [x19, 4]
+.L2200:
+	ldrb	w0, [x19, 6]
+	mov	w1, 65535
+	ldrh	w3, [x20, 2472]
+.L2202:
+	add	w0, w0, 1
+	and	w0, w0, 255
+	cmp	w0, w3
+	bne	.L2201
+	ldrh	w0, [x19, 2]
+	add	w0, w0, 1
+	strh	w0, [x19, 2]
+	mov	w0, 0
+.L2201:
+	add	x2, x19, w0, sxtw 1
+	ldrh	w2, [x2, 16]
+	cmp	w2, w1
+	beq	.L2202
+	strb	w0, [x19, 6]
+	ldrb	w0, [x19, 8]
 	cmp	w0, 1
-	bne	.L2254
-	add	x0, x20, :lo12:.LANCHOR0
-	ldrb	w0, [x0,204]
-	cbnz	w0, .L2251
-	ldrh	w0, [x19,2]
-	ldrh	w0, [x21,w0,sxtw 1]
-	cmp	w0, w24
-	bne	.L2251
-	ldrh	w1, [x19,4]
-	cbz	w1, .L2251
+	bne	.L2195
+	ldrb	w2, [x20, 204]
+	ldrh	w0, [x19, 2]
+	cbnz	w2, .L2204
+	ldrh	w0, [x21, w0, sxtw 1]
+	cmp	w0, w1
+	bne	.L2195
+	ldrh	w0, [x19, 4]
+	cbz	w0, .L2195
+	sub	w0, w0, #1
+	strh	w0, [x19, 4]
 	ldrh	w0, [x19]
-	sub	w1, w1, #1
-	strh	w1, [x19,4]
 	bl	decrement_vpc_count
-	b	.L2247
-.L2251:
-	add	x20, x20, :lo12:.LANCHOR0
-	ldrb	w0, [x20,204]
-	cbz	w0, .L2254
-	ldrh	w1, [x19,2]
-	ldrh	w0, [x20,2546]
-	cmp	w1, w0
-	bcc	.L2254
-	adrp	x0, .LANCHOR2+520
-	ldrh	w1, [x19]
-	ldrh	w3, [x19,4]
-	lsl	x1, x1, 1
-	ldr	x0, [x0,#:lo12:.LANCHOR2+520]
-	ldrh	w2, [x0,x1]
-	sub	w2, w2, w3
-	strh	w2, [x0,x1]
-	strh	wzr, [x19,4]
-	ldrh	w0, [x20,2544]
-	strh	w0, [x19,2]
-	strb	wzr, [x19,6]
-.L2254:
+	b	.L2200
+.L2204:
+	ldrh	w1, [x20, 2546]
+	cmp	w0, w1
+	bcc	.L2195
+	ldrh	w0, [x19]
+	adrp	x1, .LANCHOR2+520
+	ldrh	w3, [x19, 4]
+	ldr	x2, [x1, #:lo12:.LANCHOR2+520]
+	lsl	x0, x0, 1
+	ldrh	w1, [x2, x0]
+	sub	w1, w1, w3
+	strh	w1, [x2, x0]
+	strh	wzr, [x19, 4]
+	ldrh	w0, [x20, 2544]
+	strh	w0, [x19, 2]
+	strb	wzr, [x19, 6]
+.L2195:
 	mov	w0, w22
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
+	ldr	x23, [sp, 48]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
 	ldp	x29, x30, [sp], 64
 	ret
 	.size	get_new_active_ppa, .-get_new_active_ppa
@@ -14462,430 +14171,426 @@ get_new_active_ppa:
 FtlVpcTblFlush:
 	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
+	stp	x19, x20, [sp, 16]
+	stp	x23, x24, [sp, 48]
 	adrp	x23, .LANCHOR2
-	stp	x19, x20, [sp,16]
 	add	x19, x23, :lo12:.LANCHOR2
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	ldr	w0, [x19,424]
-	stp	x27, x28, [sp,80]
-	cbnz	w0, .L2261
-	adrp	x26, .LANCHOR4
-	ldr	x21, [x19,3664]
-	add	x22, x26, :lo12:.LANCHOR4
-	ldr	x1, [x19,3616]
-	ldrh	w2, [x19,784]
+	stp	x21, x22, [sp, 32]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldr	w0, [x19, 424]
+	cbnz	w0, .L2213
+	ldr	x21, [x19, 3656]
+	adrp	x24, .LANCHOR4
+	add	x22, x24, :lo12:.LANCHOR4
+	ldr	x0, [x19, 3608]
+	ldrh	w1, [x19, 784]
 	add	x20, x19, 456
-	adrp	x24, .LANCHOR0
-	add	x22, x22, 1704
-	str	x1, [x22,8]
-	add	x25, x24, :lo12:.LANCHOR0
-	str	x21, [x22,16]
-	strh	w2, [x21,2]
-	mov	w2, -3932
-	strh	w2, [x21]
-	str	w0, [x21,12]
-	ldr	w2, [x19,792]
-	str	w2, [x21,4]
-	str	w0, [x21,8]
-	mov	w0, 19539
-	ldrh	w1, [x19,560]
-	movk	w0, 0x4654, lsl 16
-	strh	w1, [x20,14]
-	ldrh	w1, [x19,562]
-	ldrb	w2, [x19,566]
-	str	w0, [x19,456]
-	mov	w0, 99
+	adrp	x26, .LANCHOR0
+	add	x25, x26, :lo12:.LANCHOR0
+	str	x0, [x22, 1720]
+	add	x22, x22, 1712
+	str	x21, [x22, 16]
+	strh	w1, [x21, 2]
+	mov	w1, -3932
+	strh	w1, [x21]
+	str	wzr, [x21, 12]
+	ldr	w1, [x19, 792]
+	stp	w1, wzr, [x21, 4]
+	mov	w1, 19539
+	movk	w1, 0x4654, lsl 16
+	str	w1, [x19, 456]
+	mov	w1, 99
+	ldrb	w2, [x19, 566]
+	movk	w1, 0x5000, lsl 16
+	str	w1, [x20, 4]
+	ldrh	w1, [x19, 560]
+	strh	w1, [x20, 14]
+	ldrh	w1, [x19, 562]
+	ldrh	w0, [x19, 790]
+	strh	w0, [x20, 8]
 	orr	w1, w2, w1, lsl 6
-	strh	w1, [x20,16]
-	ldrh	w1, [x19,608]
-	movk	w0, 0x5000, lsl 16
-	strh	w1, [x20,18]
-	ldrh	w1, [x19,610]
-	str	w0, [x20,4]
-	ldrb	w2, [x19,614]
-	ldrh	w0, [x19,790]
-	strh	w0, [x20,8]
+	strh	w1, [x20, 16]
+	ldrh	w1, [x19, 608]
+	strh	w1, [x20, 18]
+	ldrb	w2, [x19, 614]
+	ldrh	w1, [x19, 610]
+	ldrh	w0, [x25, 2494]
+	strb	w0, [x20, 10]
+	ldrb	w0, [x19, 568]
 	orr	w1, w2, w1, lsl 6
-	ldrh	w0, [x25,2494]
-	strb	w0, [x20,10]
-	ldrb	w0, [x19,568]
-	strb	w0, [x20,11]
-	strh	w1, [x20,20]
-	ldrb	w0, [x19,616]
-	ldrh	w1, [x19,656]
-	strb	w0, [x20,12]
-	strh	w1, [x20,22]
-	ldrh	w1, [x19,658]
-	ldrb	w0, [x19,664]
-	strb	w0, [x20,13]
-	ldr	w0, [x19,760]
-	str	w0, [x20,32]
-	ldr	w0, [x19,752]
-	str	w0, [x20,40]
-	ldr	w0, [x19,756]
-	ldrb	w2, [x19,662]
-	str	w0, [x20,36]
-	ldrh	w0, [x19,1456]
+	strb	w0, [x20, 11]
+	ldrb	w0, [x19, 616]
+	strb	w0, [x20, 12]
+	strh	w1, [x20, 20]
+	ldrh	w1, [x19, 656]
+	strh	w1, [x20, 22]
+	ldrb	w0, [x19, 664]
+	strb	w0, [x20, 13]
+	ldr	w0, [x19, 760]
+	str	w0, [x20, 32]
+	ldr	w0, [x19, 752]
+	ldrb	w2, [x19, 662]
+	str	w0, [x20, 40]
+	ldrh	w1, [x19, 658]
+	ldr	w0, [x19, 756]
+	str	w0, [x20, 36]
+	ldrh	w0, [x19, 1448]
 	orr	w1, w2, w1, lsl 6
-	strh	w0, [x20,44]
-	ldrh	w0, [x19,1458]
-	strh	w0, [x20,46]
-	ldrh	w2, [x25,2554]
-	ldr	x0, [x22,8]
-	strh	w1, [x20,24]
+	strh	w0, [x20, 44]
+	ldrh	w0, [x19, 1450]
+	strh	w0, [x20, 46]
+	ldrh	w2, [x25, 2554]
+	ldr	x0, [x22, 8]
+	strh	w1, [x20, 24]
 	mov	w1, 255
 	bl	ftl_memset
-	ldr	x0, [x22,8]
+	ldr	x0, [x22, 8]
 	mov	x1, x20
 	mov	w2, 48
 	mov	x20, x26
 	bl	ftl_memcpy
-	ldr	x0, [x22,8]
-	ldrh	w2, [x25,2480]
-	ldr	x1, [x19,520]
-	add	x0, x0, 48
+	ldr	x1, [x19, 520]
+	ldrh	w2, [x25, 2480]
+	ldr	x0, [x22, 8]
 	lsl	w2, w2, 1
+	add	x0, x0, 48
 	bl	ftl_memcpy
-	ldrh	w2, [x25,2480]
-	ldr	x1, [x22,8]
-	ubfiz	x0, x2, 1, 16
-	lsr	w2, w2, 3
+	ldrh	w0, [x25, 2480]
+	ldr	x3, [x22, 8]
+	ldr	x1, [x25, 64]
+	lsr	w2, w0, 3
+	ubfiz	x0, x0, 1, 16
 	add	x0, x0, 51
 	add	w2, w2, 4
-	and	x0, x0, 262140
-	add	x0, x1, x0
-	ldr	x1, [x24,#:lo12:.LANCHOR0]
+	and	x0, x0, -4
+	add	x0, x3, x0
 	bl	ftl_memcpy
-	ldrh	w0, [x25,2588]
-	cbz	w0, .L2262
-	ldrh	w0, [x25,2480]
-	ldrh	w2, [x25,2580]
+	ldrh	w0, [x25, 2588]
+	cbz	w0, .L2214
+	ldrh	w0, [x25, 2480]
+	ldr	x3, [x22, 8]
+	ldrh	w2, [x25, 2580]
 	lsr	w1, w0, 3
 	add	w0, w1, w0, lsl 1
-	ldr	x1, [x22,8]
+	ldr	x1, [x19, 3752]
 	add	w0, w0, 52
 	lsl	w2, w2, 2
 	and	x0, x0, 65532
-	add	x0, x1, x0
-	ldr	x1, [x19,3760]
+	add	x0, x3, x0
 	bl	ftl_memcpy
-.L2262:
-	mov	w0, 0
+.L2214:
+	add	x27, x23, :lo12:.LANCHOR2
+	add	x26, x24, :lo12:.LANCHOR4
+	add	x19, x27, 784
+	add	x20, x20, :lo12:.LANCHOR0
 	mov	w22, 0
 	mov	w25, 65535
-	add	x26, x20, :lo12:.LANCHOR4
-	add	x19, x23, :lo12:.LANCHOR2
+	mov	w0, 0
 	bl	FtlUpdateVaildLpn
-.L2263:
-	ldrh	w1, [x19,784]
-	ldr	x0, [x19,3616]
-	ldrh	w2, [x19,786]
-	str	x0, [x26,1712]
-	ldr	x0, [x19,3664]
-	str	x0, [x26,1720]
+.L2215:
+	ldrh	w2, [x19, 2]
+	ldrh	w1, [x19]
+	ldr	x0, [x27, 3608]
+	str	x0, [x26, 1720]
+	ldr	x0, [x27, 3656]
+	str	x0, [x26, 1728]
 	orr	w0, w2, w1, lsl 10
-	str	w0, [x26,1708]
-	add	x0, x24, :lo12:.LANCHOR0
-	ldrh	w0, [x0,2546]
+	str	w0, [x26, 1716]
+	ldrh	w0, [x20, 2546]
 	sub	w0, w0, #1
 	cmp	w2, w0
-	blt	.L2264
-	ldrh	w25, [x19,788]
-	strh	wzr, [x19,786]
-	strh	w1, [x19,788]
+	blt	.L2216
+	ldrh	w25, [x19, 4]
+	strh	wzr, [x19, 2]
+	strh	w1, [x19, 4]
 	bl	FtlFreeSysBlkQueueOut
-	ldr	w1, [x19,752]
-	str	w1, [x19,792]
+	ldr	w1, [x27, 752]
+	str	w1, [x19, 8]
 	add	w2, w1, 1
-	str	w2, [x19,752]
+	str	w2, [x27, 752]
 	ubfiz	w2, w0, 10, 16
-	str	w2, [x26,1708]
-	strh	w0, [x19,784]
-	str	w1, [x21,4]
-	strh	w0, [x21,2]
-.L2264:
-	add	x1, x24, :lo12:.LANCHOR0
-	ldrb	w0, [x1,72]
-	cbz	w0, .L2265
-	ldr	x0, [x19,3616]
-	ldrh	w1, [x1,2554]
+	str	w2, [x26, 1716]
+	strh	w0, [x19]
+	strh	w0, [x21, 2]
+	str	w1, [x21, 4]
+.L2216:
+	ldrb	w0, [x20, 72]
+	cbz	w0, .L2217
+	ldrh	w1, [x20, 2554]
+	ldr	x0, [x27, 3608]
 	bl	js_hash
-	str	w0, [x21,12]
-.L2265:
-	mov	w1, 1
-	add	x0, x26, 1704
-	mov	w2, w1
-	mov	w3, w1
+	str	w0, [x21, 12]
+.L2217:
+	mov	w3, 1
+	add	x0, x26, 1712
+	mov	w1, w3
+	mov	w2, w3
 	bl	FlashProgPages
-	ldrh	w1, [x19,786]
-	ldr	w2, [x26,1704]
-	add	w1, w1, 1
-	cmn	w2, #1
-	uxth	w1, w1
-	strh	w1, [x19,786]
-	bne	.L2266
-	cmp	w1, 1
-	bne	.L2267
-	add	x1, x24, :lo12:.LANCHOR0
-	ldrh	w1, [x1,2546]
-	sub	w1, w1, #1
-	strh	w1, [x19,786]
-.L2267:
+	ldrh	w0, [x19, 2]
+	ldr	w1, [x26, 1712]
+	add	w0, w0, 1
+	and	w0, w0, 65535
+	strh	w0, [x19, 2]
+	cmn	w1, #1
+	bne	.L2218
+	cmp	w0, 1
+	bne	.L2219
+	ldrh	w0, [x20, 2546]
+	sub	w0, w0, #1
+	strh	w0, [x19, 2]
+.L2219:
 	add	w22, w22, 1
-	uxth	w22, w22
+	and	w22, w22, 65535
 	cmp	w22, 3
-	bls	.L2263
-	add	x20, x20, :lo12:.LANCHOR4
+	bls	.L2215
+	add	x24, x24, :lo12:.LANCHOR4
+	add	x23, x23, :lo12:.LANCHOR2
+	mov	w2, w22
 	adrp	x0, .LC131
 	add	x0, x0, :lo12:.LC131
-	mov	w2, w22
-	add	x23, x23, :lo12:.LANCHOR2
-	ldr	w1, [x20,1708]
+	ldr	w1, [x24, 1716]
 	bl	printk
 	mov	w0, 1
-	str	w0, [x23,424]
-	b	.L2261
-.L2266:
-	cmp	w1, 1
-	beq	.L2263
-	cmp	w2, 256
-	beq	.L2263
+	str	w0, [x23, 424]
+.L2213:
+	mov	w0, 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 96
+	ret
+.L2218:
+	cmp	w0, 1
+	beq	.L2215
+	cmp	w1, 256
+	beq	.L2215
 	mov	w0, 65535
 	cmp	w25, w0
-	beq	.L2261
-	mov	w0, w25
+	beq	.L2213
 	mov	w1, 1
+	mov	w0, w25
 	bl	FtlFreeSysBlkQueueIn
-.L2261:
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 96
-	ret
+	b	.L2213
 	.size	FtlVpcTblFlush, .-FtlVpcTblFlush
 	.align	2
 	.global	FtlSuperblockPowerLostFix
 	.type	FtlSuperblockPowerLostFix, %function
 FtlSuperblockPowerLostFix:
-	stp	x29, x30, [sp, -128]!
+	stp	x29, x30, [sp, -144]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR2
-	add	x1, x20, :lo12:.LANCHOR2
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	ldr	w1, [x1,424]
-	cbnz	w1, .L2276
-	adrp	x21, .LANCHOR0
-	add	x2, x21, :lo12:.LANCHOR0
-	ldrb	w22, [x2,204]
-	cbz	w22, .L2291
-	ldrb	w22, [x0,8]
-	cmp	w22, 1
-	bne	.L2287
-	ldrh	w24, [x0,4]
-	b	.L2278
-.L2287:
-	mov	w22, w1
-.L2291:
-	mov	w24, 12
-.L2278:
+	stp	x21, x22, [sp, 32]
+	adrp	x21, .LANCHOR2
+	add	x1, x21, :lo12:.LANCHOR2
+	stp	x19, x20, [sp, 16]
+	stp	x23, x24, [sp, 48]
+	str	x25, [sp, 64]
+	ldr	w25, [x1, 424]
+	cbnz	w25, .L2235
+	adrp	x22, .LANCHOR0
+	add	x1, x22, :lo12:.LANCHOR0
+	ldrb	w1, [x1, 204]
+	cbz	w1, .L2246
+	ldrb	w1, [x0, 8]
+	cmp	w1, 1
+	bne	.L2246
+	ldrh	w24, [x0, 4]
+	mov	w25, w1
+.L2237:
 	mov	x19, x0
 	mov	w0, -1
-	str	w0, [x29,96]
-	add	x0, x20, :lo12:.LANCHOR2
+	str	w0, [x29, 112]
+	add	x0, x21, :lo12:.LANCHOR2
 	mov	w2, 61589
-	ldr	x23, [x0,3664]
-	ldr	x1, [x0,3616]
-	str	x1, [x29,80]
+	mov	x20, x0
+	ldr	x23, [x0, 3656]
+	ldr	x1, [x0, 3608]
+	stp	x1, x23, [x29, 96]
 	mov	w1, -3
-	str	x23, [x29,88]
-	str	w1, [x23,8]
+	str	w1, [x23, 8]
 	mov	w1, -2
-	str	w1, [x23,12]
+	str	w1, [x23, 12]
 	ldrh	w1, [x19]
-	strh	w1, [x23,2]
+	strh	w1, [x23, 2]
 	strh	wzr, [x23]
-	ldr	x1, [x0,3616]
+	ldr	x1, [x0, 3608]
 	str	w2, [x1]
-	ldr	x1, [x0,3616]
-	mov	w0, 22136
-	movk	w0, 0x1234, lsl 16
-	str	w0, [x1,4]
-.L2279:
+	mov	w2, 22136
+	movk	w2, 0x1234, lsl 16
+	ldr	x1, [x0, 3608]
+	str	w2, [x1, 4]
+.L2238:
 	sub	w24, w24, #1
 	cmn	w24, #1
-	beq	.L2282
-	ldrh	w0, [x19,4]
-	cbnz	w0, .L2280
-.L2282:
-	add	x20, x20, :lo12:.LANCHOR2
+	beq	.L2241
+	ldrh	w0, [x19, 4]
+	cbnz	w0, .L2239
+.L2241:
+	add	x21, x21, :lo12:.LANCHOR2
 	ldrh	w0, [x19]
-	ldrh	w3, [x19,4]
-	add	x21, x21, :lo12:.LANCHOR0
+	ldrh	w3, [x19, 4]
+	add	x22, x22, :lo12:.LANCHOR0
+	ldr	x2, [x21, 520]
 	lsl	x0, x0, 1
-	ldr	x2, [x20,520]
-	ldrh	w1, [x2,x0]
+	ldrh	w1, [x2, x0]
 	sub	w1, w1, w3
-	strh	w1, [x2,x0]
-	strb	wzr, [x19,6]
-	ldrh	w0, [x21,2544]
-	strh	w0, [x19,2]
-	strh	wzr, [x19,4]
-	b	.L2276
-.L2280:
+	strh	w1, [x2, x0]
+	strb	wzr, [x19, 6]
+	ldrh	w0, [x22, 2544]
+	strh	w0, [x19, 2]
+	strh	wzr, [x19, 4]
+.L2235:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldr	x25, [sp, 64]
+	ldp	x29, x30, [sp], 144
+	ret
+.L2246:
+	mov	w24, 12
+	b	.L2237
+.L2239:
 	mov	x0, x19
 	bl	get_new_active_ppa
-	str	w0, [x29,76]
+	str	w0, [x29, 92]
 	cmn	w0, #1
-	beq	.L2282
-	add	x1, x20, :lo12:.LANCHOR2
-	mov	w2, w22
+	beq	.L2241
+	ldr	w0, [x20, 756]
 	mov	w3, 0
-	ldr	w0, [x1,756]
-	str	w0, [x23,4]
+	str	w0, [x23, 4]
+	mov	w2, w25
 	add	w0, w0, 1
+	mov	w1, 1
 	cmn	w0, #1
 	csel	w0, w0, wzr, ne
-	str	w0, [x1,756]
-	add	x0, x29, 72
-	mov	w1, 1
+	str	w0, [x20, 756]
+	add	x0, x29, 88
 	bl	FlashProgPages
 	ldrh	w0, [x19]
 	bl	decrement_vpc_count
-	b	.L2279
-.L2276:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 128
-	ret
+	b	.L2238
 	.size	FtlSuperblockPowerLostFix, .-FtlSuperblockPowerLostFix
 	.align	2
 	.global	ftl_map_blk_gc
 	.type	ftl_map_blk_gc, %function
 ftl_map_blk_gc:
-	stp	x29, x30, [sp, -96]!
+	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	str	x27, [sp,80]
+	stp	x19, x20, [sp, 16]
 	mov	x19, x0
+	stp	x21, x22, [sp, 32]
 	adrp	x22, .LANCHOR0
-	ldr	x20, [x0,16]
-	ldr	x25, [x0,40]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldr	x20, [x0, 16]
+	ldr	x26, [x0, 40]
 	bl	ftl_free_no_use_map_blk
-	ldrh	w1, [x19,10]
-	ldrh	w2, [x19,8]
+	ldrh	w1, [x19, 10]
+	ldrh	w2, [x19, 8]
 	sub	w1, w1, #4
 	cmp	w2, w1
-	blt	.L2293
+	blt	.L2252
 	ubfiz	x0, x0, 1, 16
-	ldrh	w24, [x20,x0]
-	cbz	w24, .L2293
-	ldr	w1, [x19,52]
-	cbnz	w1, .L2293
-	mov	w2, 1
-	str	w2, [x19,52]
-	strh	w1, [x20,x0]
-	ldrh	w0, [x19,8]
-	ldrh	w1, [x19,2]
+	ldrh	w25, [x20, x0]
+	cbz	w25, .L2252
+	ldr	w1, [x19, 52]
+	cbnz	w1, .L2252
+	mov	w1, 1
+	str	w1, [x19, 52]
+	strh	wzr, [x20, x0]
+	ldrh	w0, [x19, 8]
+	ldrh	w1, [x19, 2]
 	sub	w0, w0, #1
-	strh	w0, [x19,8]
+	strh	w0, [x19, 8]
 	add	x0, x22, :lo12:.LANCHOR0
-	ldrh	w0, [x0,2546]
+	ldrh	w0, [x0, 2546]
 	cmp	w1, w0
-	bcc	.L2294
+	bcc	.L2253
 	mov	x0, x19
 	bl	ftl_map_blk_alloc_new_blk
-.L2294:
-	adrp	x20, .LANCHOR4
-	mov	w21, 0
-	add	x20, x20, :lo12:.LANCHOR4
-	adrp	x26, .LANCHOR2
-	add	x20, x20, 1704
-.L2295:
-	ldrh	w0, [x19,6]
-	cmp	w0, w21
-	bls	.L2304
-	ubfiz	x0, x21, 2, 16
-	add	x27, x25, x0
-	ldr	w1, [x25,x0]
-	cmp	w24, w1, lsr 10
-	bne	.L2296
-	add	x1, x26, :lo12:.LANCHOR2
-	ldr	x2, [x1,3624]
-	ldr	x23, [x1,3664]
+.L2253:
+	adrp	x23, .LANCHOR4
+	add	x21, x23, :lo12:.LANCHOR4
+	adrp	x24, .LANCHOR2
+	add	x21, x21, 1712
+	add	x28, x24, :lo12:.LANCHOR2
+	mov	w20, 0
+.L2254:
+	ldrh	w0, [x19, 6]
+	cmp	w0, w20
+	bhi	.L2259
 	mov	w1, 1
-	str	x2, [x20,8]
-	mov	w2, w1
-	str	x23, [x20,16]
-	ldr	w0, [x25,x0]
-	str	w0, [x20,4]
-	mov	x0, x20
+	mov	w0, w25
+	bl	FtlFreeSysBlkQueueIn
+	str	wzr, [x19, 52]
+.L2252:
+	add	x22, x22, :lo12:.LANCHOR0
+	ldrh	w1, [x19, 2]
+	ldrh	w0, [x22, 2546]
+	cmp	w1, w0
+	bcc	.L2257
+	mov	x0, x19
+	bl	ftl_map_blk_alloc_new_blk
+	b	.L2257
+.L2259:
+	ubfiz	x0, x20, 2, 16
+	add	x3, x26, x0
+	ldr	w1, [x26, x0]
+	cmp	w25, w1, lsr 10
+	bne	.L2255
+	ldr	x1, [x28, 3616]
+	mov	w2, 1
+	ldr	x27, [x28, 3656]
+	stp	x1, x27, [x21, 8]
+	mov	w1, w2
+	str	x3, [x29, 104]
+	ldr	w0, [x26, x0]
+	str	w0, [x21, 4]
+	mov	x0, x21
 	bl	FlashReadPages
-	ldr	w0, [x20]
+	ldr	w0, [x21]
+	ldr	x3, [x29, 104]
 	cmn	w0, #1
-	bne	.L2297
-.L2299:
-	adrp	x1, .LANCHOR4
-	str	wzr, [x27]
-	add	x1, x1, :lo12:.LANCHOR4
+	bne	.L2256
+.L2258:
+	add	x23, x23, :lo12:.LANCHOR4
+	str	wzr, [x3]
+	add	x24, x24, :lo12:.LANCHOR2
 	adrp	x0, .LC132
-	ldrh	w2, [x23,8]
+	ldrh	w2, [x27, 8]
 	add	x0, x0, :lo12:.LC132
-	ldr	w1, [x1,1708]
+	ldr	w1, [x23, 1716]
 	bl	printk
-	adrp	x0, .LANCHOR2
-	mov	w1, 1
-	add	x0, x0, :lo12:.LANCHOR2
-	str	w1, [x0,424]
-	b	.L2298
-.L2297:
-	ldrh	w0, [x23,8]
-	cmp	w0, w21
-	bne	.L2299
-	ldrh	w1, [x23]
-	ldrh	w0, [x19,4]
+	mov	w0, 1
+	str	w0, [x24, 424]
+.L2257:
+	ldp	x19, x20, [sp, 16]
+	mov	w0, 0
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L2256:
+	ldrh	w0, [x27, 8]
+	cmp	w0, w20
+	bne	.L2258
+	ldrh	w1, [x27]
+	ldrh	w0, [x19, 4]
 	cmp	w1, w0
-	bne	.L2299
-	ldr	x2, [x20,8]
+	bne	.L2258
+	ldr	x2, [x21, 8]
+	mov	w1, w20
 	mov	x0, x19
-	mov	w1, w21
 	bl	FtlMapWritePage
-.L2296:
-	add	w21, w21, 1
-	uxth	w21, w21
-	b	.L2295
-.L2304:
-	mov	w0, w24
-	mov	w1, 1
-	bl	FtlFreeSysBlkQueueIn
-	str	wzr, [x19,52]
-.L2293:
-	add	x22, x22, :lo12:.LANCHOR0
-	ldrh	w1, [x19,2]
-	ldrh	w0, [x22,2546]
-	cmp	w1, w0
-	bcc	.L2298
-	mov	x0, x19
-	bl	ftl_map_blk_alloc_new_blk
-.L2298:
-	mov	w0, 0
-	ldr	x27, [sp,80]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 96
-	ret
+.L2255:
+	add	w20, w20, 1
+	and	w20, w20, 65535
+	b	.L2254
 	.size	ftl_map_blk_gc, .-ftl_map_blk_gc
 	.align	2
 	.global	Ftl_write_map_blk_to_last_page
@@ -14893,110 +14598,110 @@ ftl_map_blk_gc:
 Ftl_write_map_blk_to_last_page:
 	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	adrp	x24, .LANCHOR2
-	add	x1, x24, :lo12:.LANCHOR2
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	ldr	w20, [x1,424]
-	ldr	x21, [x0,16]
-	ldr	x26, [x0,40]
-	cbnz	w20, .L2306
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR2
+	add	x20, x20, :lo12:.LANCHOR2
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	str	x25, [sp, 64]
+	ldr	w1, [x20, 424]
+	cbnz	w1, .L2265
 	mov	x19, x0
 	ldrh	w0, [x0]
-	mov	w2, 65535
-	cmp	w0, w2
-	bne	.L2307
-	ldrh	w0, [x19,8]
+	mov	w1, 65535
+	cmp	w0, w1
+	ldr	x21, [x19, 16]
+	bne	.L2266
+	ldrh	w0, [x19, 8]
 	add	w0, w0, 1
-	strh	w0, [x19,8]
+	strh	w0, [x19, 8]
 	bl	FtlFreeSysBlkQueueOut
 	strh	w0, [x21]
-	strh	w20, [x19,2]
-	ldr	w0, [x19,48]
-	strh	w20, [x19]
+	strh	wzr, [x19, 2]
+	ldr	w0, [x19, 48]
+	strh	wzr, [x19]
 	add	w0, w0, 1
-	str	w0, [x19,48]
-	b	.L2306
-.L2307:
+	str	w0, [x19, 48]
+.L2265:
+	mov	w0, 0
+	ldr	x25, [sp, 64]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 80
+	ret
+.L2266:
 	ubfiz	x0, x0, 1, 16
-	ldrh	w2, [x19,2]
-	ldr	x23, [x1,3664]
+	ldrh	w1, [x19, 2]
+	ldr	x23, [x20, 3656]
 	adrp	x22, .LANCHOR0
-	ldrh	w25, [x21,x0]
+	ldr	x25, [x19, 40]
+	ldrh	w24, [x21, x0]
 	adrp	x21, .LANCHOR4
 	add	x0, x21, :lo12:.LANCHOR4
-	orr	w2, w2, w25, lsl 10
-	str	w2, [x0,1708]
-	ldr	x2, [x1,3616]
-	str	x2, [x0,1712]
-	str	x23, [x0,1720]
-	ldr	w0, [x19,48]
-	str	w0, [x23,4]
+	orr	w1, w1, w24, lsl 10
+	str	w1, [x0, 1716]
+	ldr	x1, [x20, 3608]
+	str	x1, [x0, 1720]
+	str	x23, [x0, 1728]
+	mov	w1, 255
+	ldr	w0, [x19, 48]
+	str	w0, [x23, 4]
 	mov	w0, -1291
-	strh	w0, [x23,8]
-	ldrh	w0, [x19,4]
+	strh	w0, [x23, 8]
+	ldrh	w0, [x19, 4]
 	strh	w0, [x23]
 	add	x0, x22, :lo12:.LANCHOR0
-	strh	w25, [x23,2]
-	ldrh	w2, [x0,2546]
-	ldr	x0, [x1,3616]
-	mov	w1, 255
+	strh	w24, [x23, 2]
+	ldrh	w2, [x0, 2546]
+	ldr	x0, [x20, 3608]
 	lsl	w2, w2, 3
 	bl	ftl_memset
-	mov	w0, w20
-.L2308:
-	ldrh	w1, [x19,6]
-	cmp	w1, w0
-	bls	.L2315
-	ubfiz	x3, x0, 2, 32
-	ldr	w1, [x26,x3]
-	cmp	w25, w1, lsr 10
-	bne	.L2309
-	add	x2, x24, :lo12:.LANCHOR2
-	add	w20, w20, 1
-	uxth	w20, w20
-	ldr	x4, [x2,3616]
-	ubfiz	x1, x20, 3, 16
-	str	w0, [x4,x1]
-	ldr	x2, [x2,3616]
-	ldr	w3, [x26,x3]
-	add	x1, x2, x1
-	str	w3, [x1,4]
-.L2309:
-	add	w0, w0, 1
-	uxth	w0, w0
-	b	.L2308
-.L2315:
+	mov	w1, 0
+	mov	w0, 0
+.L2267:
+	ldrh	w2, [x19, 6]
+	cmp	w2, w0
+	bhi	.L2269
 	add	x22, x22, :lo12:.LANCHOR0
-	ldrb	w0, [x22,72]
-	cbz	w0, .L2311
+	ldrb	w0, [x22, 72]
+	cbz	w0, .L2270
 	add	x0, x21, :lo12:.LANCHOR4
-	ldrh	w1, [x22,2554]
-	ldr	x0, [x0,1712]
+	ldrh	w1, [x22, 2554]
+	ldr	x0, [x0, 1720]
 	bl	js_hash
-	str	w0, [x23,12]
-.L2311:
-	mov	w1, 1
-	add	x0, x21, :lo12:.LANCHOR4
-	add	x0, x0, 1704
-	mov	w2, w1
+	str	w0, [x23, 12]
+.L2270:
+	add	x21, x21, :lo12:.LANCHOR4
+	mov	w2, 1
 	mov	w3, 0
+	mov	w1, w2
+	add	x0, x21, 1712
 	bl	FlashProgPages
-	ldrh	w0, [x19,2]
+	ldrh	w0, [x19, 2]
 	add	w0, w0, 1
-	strh	w0, [x19,2]
+	strh	w0, [x19, 2]
 	mov	x0, x19
 	bl	ftl_map_blk_gc
-.L2306:
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 80
-	ret
+	b	.L2265
+.L2269:
+	ubfiz	x2, x0, 2, 16
+	ldr	w3, [x25, x2]
+	cmp	w24, w3, lsr 10
+	bne	.L2268
+	add	w1, w1, 1
+	ldr	x4, [x20, 3608]
+	and	w1, w1, 65535
+	ubfiz	x3, x1, 3, 16
+	str	w0, [x4, x3]
+	ldr	w4, [x25, x2]
+	ldr	x2, [x20, 3608]
+	add	x2, x2, x3
+	str	w4, [x2, 4]
+.L2268:
+	add	w0, w0, 1
+	and	w0, w0, 65535
+	b	.L2267
 	.size	Ftl_write_map_blk_to_last_page, .-Ftl_write_map_blk_to_last_page
 	.align	2
 	.global	FtlMapWritePage
@@ -15004,166 +14709,166 @@ Ftl_write_map_blk_to_last_page:
 FtlMapWritePage:
 	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x27, x28, [sp,80]
-	adrp	x27, .LANCHOR4
-	mov	x28, x0
-	stp	x23, x24, [sp,48]
-	add	x23, x27, :lo12:.LANCHOR4
-	adrp	x24, .LC133
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	stp	x19, x20, [sp,16]
-	mov	w26, w1
-	str	x2, [x29,104]
-	mov	w22, 0
-	add	x23, x23, 1704
-	add	x24, x24, :lo12:.LC133
-.L2317:
-	adrp	x19, .LANCHOR2
+	stp	x23, x24, [sp, 48]
+	adrp	x23, .LANCHOR2
+	stp	x25, x26, [sp, 64]
+	adrp	x25, .LANCHOR4
+	add	x24, x25, :lo12:.LANCHOR4
+	stp	x21, x22, [sp, 32]
+	stp	x27, x28, [sp, 80]
+	mov	x22, x25
+	stp	x19, x20, [sp, 16]
+	mov	w27, w1
+	mov	x19, x0
+	mov	x28, x2
+	add	x24, x24, 1712
+	mov	w21, 0
+.L2276:
+	add	x1, x23, :lo12:.LANCHOR2
 	adrp	x20, .LANCHOR0
-	add	x1, x19, :lo12:.LANCHOR2
-	ldr	w0, [x1,736]
+	ldr	w0, [x1, 736]
 	add	w0, w0, 1
-	str	w0, [x1,736]
+	str	w0, [x1, 736]
 	add	x0, x20, :lo12:.LANCHOR0
-	ldrh	w1, [x28,2]
-	ldrh	w0, [x0,2546]
+	ldrh	w1, [x19, 2]
+	ldrh	w0, [x0, 2546]
 	sub	w0, w0, #1
 	cmp	w1, w0
-	bge	.L2318
-	ldrh	w1, [x28]
+	bge	.L2277
+	ldrh	w1, [x19]
 	mov	w0, 65535
 	cmp	w1, w0
-	bne	.L2319
-.L2318:
-	mov	x0, x28
+	bne	.L2278
+.L2277:
+	mov	x0, x19
 	bl	Ftl_write_map_blk_to_last_page
-.L2319:
-	add	x2, x19, :lo12:.LANCHOR2
-	ldr	w1, [x2,424]
-	cbnz	w1, .L2320
-	ldrh	w3, [x28]
-	adrp	x21, .LANCHOR4
-	ldr	x0, [x28,16]
-	ldrh	w25, [x0,x3,lsl 1]
-	add	x3, x27, :lo12:.LANCHOR4
-	ldrh	w0, [x28,2]
-	add	x3, x3, 1704
-	orr	w0, w0, w25, lsl 10
-	str	w0, [x3,4]
-	ldr	x0, [x29,104]
-	str	x0, [x3,8]
-	ldr	x0, [x2,3664]
+.L2278:
+	add	x1, x23, :lo12:.LANCHOR2
+	ldr	w0, [x1, 424]
+	cbnz	w0, .L2291
+	ldrh	w2, [x19]
+	add	x3, x25, :lo12:.LANCHOR4
+	ldr	x0, [x19, 16]
+	add	x3, x3, 1712
+	ldrh	w26, [x0, x2, lsl 1]
 	mov	w2, 16
-	str	x0, [x3,16]
-	str	x3, [x29,96]
+	ldrh	w0, [x19, 2]
+	str	x28, [x3, 8]
+	orr	w0, w0, w26, lsl 10
+	str	w0, [x3, 4]
+	ldr	x0, [x1, 3656]
+	mov	w1, 0
+	str	x0, [x3, 16]
+	str	x3, [x29, 104]
 	bl	ftl_memset
-	ldr	x3, [x29,96]
-	add	x1, x20, :lo12:.LANCHOR0
-	ldr	w0, [x28,48]
-	ldr	x2, [x3,16]
-	str	w0, [x2,4]
-	strh	w26, [x2,8]
-	ldrh	w0, [x28,4]
-	strh	w0, [x2]
-	strh	w25, [x2,2]
-	ldrb	w0, [x1,72]
-	cbz	w0, .L2321
-	ldr	x0, [x3,8]
-	ldrh	w1, [x1,2554]
-	str	x2, [x29,96]
+	ldr	x3, [x29, 104]
+	ldr	w0, [x19, 48]
+	ldr	x6, [x3, 16]
+	strh	w27, [x6, 8]
+	str	w0, [x6, 4]
+	ldrh	w0, [x19, 4]
+	strh	w0, [x6]
+	add	x0, x20, :lo12:.LANCHOR0
+	strh	w26, [x6, 2]
+	ldrb	w1, [x0, 72]
+	cbz	w1, .L2280
+	ldrh	w1, [x0, 2554]
+	ldr	x0, [x3, 8]
 	bl	js_hash
-	ldr	x2, [x29,96]
-	str	w0, [x2,12]
-.L2321:
-	mov	w1, 1
-	mov	x0, x23
-	mov	w2, w1
-	mov	w3, w1
+	str	w0, [x6, 12]
+.L2280:
+	mov	w3, 1
+	mov	x0, x24
+	mov	w1, w3
+	mov	w2, w3
 	bl	FlashProgPages
-	ldrh	w0, [x28,2]
+	ldrh	w0, [x19, 2]
 	add	w0, w0, 1
-	uxth	w0, w0
-	strh	w0, [x28,2]
-	ldr	w1, [x23]
+	and	w0, w0, 65535
+	strh	w0, [x19, 2]
+	ldr	w1, [x24]
 	cmn	w1, #1
-	bne	.L2322
-	ldr	w1, [x23,4]
-	mov	x0, x24
-	add	w22, w22, 1
+	bne	.L2281
+	ldr	w1, [x24, 4]
+	adrp	x0, .LC133
+	add	x0, x0, :lo12:.LC133
+	add	w21, w21, 1
+	and	w21, w21, 65535
 	bl	printk
-	uxth	w22, w22
-	ldrh	w0, [x28,2]
+	ldrh	w0, [x19, 2]
 	cmp	w0, 2
-	bhi	.L2323
+	bhi	.L2282
 	add	x20, x20, :lo12:.LANCHOR0
-	ldrh	w0, [x20,2546]
+	ldrh	w0, [x20, 2546]
 	sub	w0, w0, #1
-	strh	w0, [x28,2]
-.L2323:
-	cmp	w22, 3
-	bls	.L2317
-	add	x21, x21, :lo12:.LANCHOR4
+	strh	w0, [x19, 2]
+.L2282:
+	cmp	w21, 3
+	bls	.L2276
+	add	x22, x22, :lo12:.LANCHOR4
+	add	x23, x23, :lo12:.LANCHOR2
+	mov	w2, w21
 	adrp	x0, .LC134
 	add	x0, x0, :lo12:.LC134
-	mov	w2, w22
-	add	x19, x19, :lo12:.LANCHOR2
-	ldr	w1, [x21,1708]
+	ldr	w1, [x22, 1716]
 	bl	printk
 	mov	w0, 1
-	str	w0, [x19,424]
-	b	.L2320
-.L2322:
-	cbz	w1, .L2325
-	strh	w25, [x28,60]
-.L2325:
-	cmp	w0, 1
-	beq	.L2326
-	cmp	w1, 256
-	beq	.L2326
-	ldr	w0, [x28,56]
-	cbz	w0, .L2327
-.L2326:
-	str	wzr, [x28,56]
-	b	.L2317
-.L2327:
-	add	x21, x21, :lo12:.LANCHOR4
-	ldr	x0, [x28,40]
-	ldr	w1, [x21,1708]
-	str	w1, [x0,w26,uxtw 2]
-.L2320:
+	str	w0, [x23, 424]
+.L2291:
+	ldp	x19, x20, [sp, 16]
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 112
 	ret
-	.size	FtlMapWritePage, .-FtlMapWritePage
+.L2281:
+	cbz	w1, .L2284
+	strh	w26, [x19, 60]
+	cmp	w0, 1
+	bne	.L2285
+.L2286:
+	str	wzr, [x19, 56]
+	b	.L2276
+.L2285:
+	cmp	w1, 256
+.L2299:
+	beq	.L2286
+	ldr	w0, [x19, 56]
+	cbnz	w0, .L2286
+	add	x22, x22, :lo12:.LANCHOR4
+	ldr	x0, [x19, 40]
+	ldr	w1, [x22, 1716]
+	str	w1, [x0, w27, uxtw 2]
+	b	.L2291
+.L2284:
+	cmp	w0, 1
+	b	.L2299
+	.size	FtlMapWritePage, .-FtlMapWritePage
 	.align	2
 	.global	flush_l2p_region
 	.type	flush_l2p_region, %function
 flush_l2p_region:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR2
-	ubfiz	x19, x0, 4, 16
-	add	x20, x20, :lo12:.LANCHOR2
-	add	x0, x20, 3800
-	ldr	x1, [x20,704]
-	add	x2, x1, x19
-	ldrh	w1, [x1,x19]
-	ldr	x2, [x2,8]
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR2
+	add	x19, x19, :lo12:.LANCHOR2
+	ubfiz	x20, x0, 4, 16
+	ldr	x0, [x19, 704]
+	add	x1, x0, x20
+	ldr	x2, [x1, 8]
+	ldrh	w1, [x0, x20]
+	add	x0, x19, 3792
 	bl	FtlMapWritePage
-	ldr	x0, [x20,704]
-	add	x19, x0, x19
-	ldr	w0, [x19,4]
-	and	w0, w0, 2147483647
-	str	w0, [x19,4]
+	ldr	x0, [x19, 704]
+	add	x0, x0, x20
+	ldr	w1, [x0, 4]
+	and	w1, w1, 2147483647
+	str	w1, [x0, 4]
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	flush_l2p_region, .-flush_l2p_region
@@ -15174,272 +14879,263 @@ FtlMapTblRecovery:
 	stp	x29, x30, [sp, -144]!
 	mov	w1, 0
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	mov	x23, x0
-	stp	x19, x20, [sp,16]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	stp	x21, x22, [sp,32]
-	ldrh	w25, [x23,6]
-	adrp	x21, .LANCHOR2
-	ldr	x0, [x0,40]
+	stp	x19, x20, [sp, 16]
 	mov	w19, 0
-	lsl	w2, w25, 2
-	ldrh	w27, [x23,8]
-	str	x0, [x29,136]
-	adrp	x26, .LANCHOR0
-	ldr	x24, [x23,16]
-	ldr	x28, [x23,24]
+	stp	x25, x26, [sp, 64]
+	stp	x21, x22, [sp, 32]
+	mov	x22, x0
+	stp	x23, x24, [sp, 48]
+	stp	x27, x28, [sp, 80]
+	ldrh	w24, [x0, 6]
+	ldr	x21, [x0, 40]
+	ldr	x23, [x0, 16]
+	ldr	x0, [x0, 24]
+	lsl	w2, w24, 2
+	str	x0, [x29, 128]
+	ldrh	w0, [x22, 8]
+	str	w0, [x29, 140]
+	mov	x0, x21
 	bl	ftl_memset
-	add	x1, x21, :lo12:.LANCHOR2
-	adrp	x0, .LANCHOR4
-	add	x4, x0, :lo12:.LANCHOR4
-	str	x0, [x29,112]
-	add	x4, x4, 1704
-	str	x21, [x29,128]
-	ldr	x2, [x1,3616]
-	sub	w0, w27, #1
-	ldr	x20, [x1,3664]
-	mov	w1, -1
-	str	x2, [x4,8]
-	str	x20, [x4,16]
-	mov	x21, x4
-	strh	w1, [x23]
-	strh	w1, [x23,2]
-	mov	w1, 1
-	str	wzr, [x23,52]
-	str	wzr, [x23,48]
-	str	w1, [x23,56]
-	str	w0, [x29,108]
-.L2336:
-	cmp	w19, w27
-	adrp	x22, .LANCHOR0
-	bge	.L2354
-	ldr	w0, [x29,108]
-	sxtw	x2, w19
+	stp	wzr, wzr, [x22, 48]
+	adrp	x0, .LANCHOR2
+	add	x2, x0, :lo12:.LANCHOR2
+	adrp	x1, .LANCHOR4
+	add	x4, x1, :lo12:.LANCHOR4
+	stp	x0, x1, [x29, 104]
+	add	x4, x4, 1712
+	ldr	w0, [x29, 140]
+	ldr	x5, [x2, 3608]
+	ldr	x20, [x2, 3656]
+	sub	w0, w0, #1
+	str	x5, [x4, 8]
+	mov	w2, -1
+	str	x20, [x4, 16]
+	mov	x25, x4
+	str	w0, [x29, 136]
+	adrp	x0, .LANCHOR0
+	add	x26, x0, :lo12:.LANCHOR0
+	strh	w2, [x22]
+	strh	w2, [x22, 2]
+	mov	w2, 1
+	str	w2, [x22, 56]
+.L2303:
+	ldr	w0, [x29, 140]
+	cmp	w19, w0
+	bge	.L2322
+	ldr	w0, [x29, 136]
+	sxtw	x27, w19
 	cmp	w19, w0
-	bne	.L2337
-	lsl	x0, x2, 1
+	bne	.L2304
+	lsl	x0, x27, 1
 	mov	w1, 1
-	add	x21, x24, x0
-	str	x2, [x29,128]
+	add	x25, x23, x0
 	mov	w26, 0
-	mov	w27, -1
-	ldrh	w0, [x24,x0]
+	ldrh	w0, [x23, x0]
 	bl	FtlGetLastWrittenPage
-	strh	w19, [x23]
-	ldr	x2, [x29,128]
-	sxth	w24, w0
+	sxth	w23, w0
 	add	w0, w0, 1
-	strh	w0, [x23,2]
-	add	w24, w24, 1
-	ldr	w0, [x28,x2,lsl 2]
-	str	w0, [x23,48]
-	ldr	x0, [x29,112]
+	strh	w0, [x22, 2]
+	ldr	x0, [x29, 128]
+	add	w23, w23, 1
+	strh	w19, [x22]
+	ldr	w0, [x0, x27, lsl 2]
+	str	w0, [x22, 48]
+	ldr	x0, [x29, 112]
 	add	x19, x0, :lo12:.LANCHOR4
-	add	x19, x19, 1704
-.L2338:
-	cmp	w26, w24
-	bge	.L2354
-	ldrh	w0, [x21]
-	mov	w1, 1
-	mov	w2, w1
+	adrp	x0, .LANCHOR0
+	add	x19, x19, 1712
+	add	x27, x0, :lo12:.LANCHOR0
+.L2305:
+	cmp	w26, w23
+	blt	.L2308
+.L2322:
+	mov	x0, x22
+	bl	ftl_free_no_use_map_blk
+	adrp	x0, .LANCHOR0
+	add	x21, x0, :lo12:.LANCHOR0
+	ldrh	w1, [x22, 2]
+	ldrh	w0, [x21, 2546]
+	cmp	w1, w0
+	bne	.L2310
+	mov	x0, x22
+	bl	ftl_map_blk_alloc_new_blk
+.L2310:
+	mov	x0, x22
+	bl	ftl_map_blk_gc
+	mov	x0, x22
+	bl	ftl_map_blk_gc
+	mov	w0, 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 144
+	ret
+.L2308:
+	ldrh	w0, [x25]
+	mov	w2, 1
+	mov	w1, w2
 	orr	w0, w26, w0, lsl 10
-	str	w0, [x19,4]
+	str	w0, [x19, 4]
 	mov	x0, x19
 	bl	FlashReadPages
-	add	x1, x22, :lo12:.LANCHOR0
-	ldrb	w0, [x1,72]
-	cbz	w0, .L2339
-	ldr	x0, [x19,16]
-	ldr	w28, [x0,12]
-	cbz	w28, .L2339
-	ldr	x0, [x19,8]
-	ldrh	w1, [x1,2554]
+	ldrb	w0, [x27, 72]
+	cbz	w0, .L2306
+	ldr	x0, [x19, 16]
+	ldr	w6, [x0, 12]
+	cbz	w6, .L2306
+	ldrh	w1, [x27, 2554]
+	ldr	x0, [x19, 8]
 	bl	js_hash
-	cmp	w28, w0
-	beq	.L2339
-	str	w27, [x19]
-.L2339:
+	cmp	w6, w0
+	beq	.L2306
+	mov	w0, -1
+	str	w0, [x19]
+.L2306:
 	ldr	w0, [x19]
 	cmn	w0, #1
-	beq	.L2340
-	ldrh	w0, [x20,8]
-	cmp	w0, w25
-	bcs	.L2340
+	beq	.L2307
+	ldrh	w0, [x20, 8]
+	cmp	w24, w0
+	bls	.L2307
 	ldrh	w2, [x20]
-	ldrh	w1, [x23,4]
+	ldrh	w1, [x22, 4]
 	cmp	w2, w1
-	bne	.L2340
+	bne	.L2307
 	ubfiz	x0, x0, 2, 16
-	ldr	x2, [x29,136]
-	ldr	w1, [x19,4]
-	str	w1, [x2,x0]
-.L2340:
+	ldr	w1, [x19, 4]
+	str	w1, [x21, x0]
+.L2307:
 	add	w26, w26, 1
 	sxth	w26, w26
-	b	.L2338
-.L2354:
-	mov	x0, x23
-	add	x22, x22, :lo12:.LANCHOR0
-	bl	ftl_free_no_use_map_blk
-	ldrh	w1, [x23,2]
-	ldrh	w0, [x22,2546]
-	cmp	w1, w0
-	bne	.L2343
-	mov	x0, x23
-	bl	ftl_map_blk_alloc_new_blk
-	b	.L2343
-.L2337:
-	ldr	x0, [x29,128]
-	lsl	x2, x2, 1
-	add	x0, x0, :lo12:.LANCHOR2
-	ldr	x0, [x0,3616]
-	str	x0, [x21,8]
-	add	x0, x24, x2
-	str	x0, [x29,120]
-	add	x0, x26, :lo12:.LANCHOR0
-	ldrh	w1, [x24,x2]
-	ldrh	w0, [x0,2546]
-	sub	w0, w0, #1
-	orr	w0, w0, w1, lsl 10
-	mov	w1, 1
-	str	w0, [x21,4]
-	mov	w2, w1
-	mov	x0, x21
+	b	.L2305
+.L2304:
+	ldr	x0, [x29, 104]
+	mov	w2, 1
+	add	x28, x0, :lo12:.LANCHOR2
+	ldr	x0, [x28, 3608]
+	str	x0, [x25, 8]
+	lsl	x0, x27, 1
+	add	x1, x23, x0
+	str	x1, [x29, 120]
+	ldrh	w1, [x26, 2546]
+	ldrh	w0, [x23, x0]
+	sub	w1, w1, #1
+	orr	w0, w1, w0, lsl 10
+	mov	w1, w2
+	str	w0, [x25, 4]
+	mov	x0, x25
 	bl	FlashReadPages
-	ldr	w0, [x21]
+	ldr	w0, [x25]
 	cmn	w0, #1
-	beq	.L2355
+	beq	.L2324
 	ldrh	w1, [x20]
-	mov	w22, 0
-	ldrh	w0, [x23,4]
+	ldrh	w0, [x22, 4]
 	cmp	w1, w0
-	bne	.L2376
-	ldrh	w1, [x20,8]
+	bne	.L2324
+	ldrh	w1, [x20, 8]
 	mov	w0, 64245
 	cmp	w1, w0
-	bne	.L2376
-	mov	w5, w22
-.L2345:
-	add	x0, x26, :lo12:.LANCHOR0
-	ldrh	w0, [x0,2546]
-	sub	w0, w0, #1
-	cmp	w5, w0
-	bge	.L2348
-	ldr	x0, [x29,128]
-	sbfiz	x1, x5, 3, 32
-	add	x0, x0, :lo12:.LANCHOR2
-	ldr	x2, [x0,3616]
-	ldrh	w0, [x2,x1]
-	cmp	w0, w25
-	bcs	.L2346
-	add	x1, x2, x1
-	ubfiz	x0, x0, 2, 16
-	ldr	x2, [x29,136]
-	ldr	w1, [x1,4]
-	str	w1, [x2,x0]
-.L2346:
-	add	w5, w5, 1
-	sxth	w5, w5
-	b	.L2345
-.L2355:
-	mov	w22, 0
-.L2376:
-	add	x6, x26, :lo12:.LANCHOR0
-	ldrh	w0, [x6,2546]
-	cmp	w22, w0
-	bge	.L2348
-	ldr	x0, [x29,120]
-	mov	w1, 1
-	mov	w2, w1
-	str	x6, [x29,96]
+	beq	.L2312
+.L2324:
+	mov	w27, 0
+	mov	w28, -1
+.L2313:
+	ldrh	w0, [x26, 2546]
+	cmp	w27, w0
+	bge	.L2320
+	ldr	x0, [x29, 120]
+	mov	w2, 1
+	mov	w1, w2
 	ldrh	w0, [x0]
-	orr	w0, w22, w0, lsl 10
-	str	w0, [x21,4]
-	mov	x0, x21
+	orr	w0, w27, w0, lsl 10
+	str	w0, [x25, 4]
+	mov	x0, x25
 	bl	FlashReadPages
-	ldr	x6, [x29,96]
-	ldrb	w0, [x6,72]
-	cbz	w0, .L2349
-	ldr	x0, [x21,16]
-	ldr	w2, [x0,12]
-	cbz	w2, .L2349
-	ldr	x0, [x21,8]
-	ldrh	w1, [x6,2554]
-	str	x2, [x29,96]
+	ldrb	w0, [x26, 72]
+	cbz	w0, .L2317
+	ldr	x0, [x25, 16]
+	ldr	w7, [x0, 12]
+	cbz	w7, .L2317
+	ldrh	w1, [x26, 2554]
+	ldr	x0, [x25, 8]
 	bl	js_hash
-	ldr	x2, [x29,96]
-	cmp	w2, w0
-	beq	.L2349
-	mov	w0, -1
-	str	w0, [x21]
-.L2349:
-	ldr	w0, [x21]
+	cmp	w7, w0
+	beq	.L2317
+	str	w28, [x25]
+.L2317:
+	ldr	w0, [x25]
 	cmn	w0, #1
-	beq	.L2350
-	ldrh	w0, [x20,8]
-	cmp	w0, w25
-	bcs	.L2350
+	beq	.L2318
+	ldrh	w0, [x20, 8]
+	cmp	w24, w0
+	bls	.L2318
 	ldrh	w2, [x20]
-	ldrh	w1, [x23,4]
+	ldrh	w1, [x22, 4]
 	cmp	w2, w1
-	bne	.L2350
+	bne	.L2318
 	ubfiz	x0, x0, 2, 16
-	ldr	x2, [x29,136]
-	ldr	w1, [x21,4]
-	str	w1, [x2,x0]
-.L2350:
-	add	w5, w22, 1
-	sxth	w22, w5
-	b	.L2376
-.L2348:
+	ldr	w1, [x25, 4]
+	str	w1, [x21, x0]
+.L2318:
+	add	w5, w27, 1
+	sxth	w27, w5
+	b	.L2313
+.L2312:
+	mov	w0, 0
+.L2314:
+	ldrh	w1, [x26, 2546]
+	sub	w1, w1, #1
+	cmp	w0, w1
+	blt	.L2316
+.L2320:
 	add	w19, w19, 1
 	sxth	w19, w19
-	b	.L2336
-.L2343:
-	mov	x0, x23
-	bl	ftl_map_blk_gc
-	mov	x0, x23
-	bl	ftl_map_blk_gc
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 144
-	ret
+	b	.L2303
+.L2316:
+	ldr	x2, [x28, 3608]
+	sbfiz	x5, x0, 3, 32
+	ldrh	w1, [x2, x5]
+	cmp	w24, w1
+	bls	.L2315
+	add	x2, x2, x5
+	ubfiz	x1, x1, 2, 16
+	ldr	w2, [x2, 4]
+	str	w2, [x21, x1]
+.L2315:
+	add	w0, w0, 1
+	sxth	w0, w0
+	b	.L2314
 	.size	FtlMapTblRecovery, .-FtlMapTblRecovery
 	.align	2
 	.global	FtlLoadVonderInfo
 	.type	FtlLoadVonderInfo, %function
 FtlLoadVonderInfo:
-	adrp	x0, .LANCHOR4
 	adrp	x1, .LANCHOR0
-	add	x0, x0, :lo12:.LANCHOR4
 	add	x1, x1, :lo12:.LANCHOR0
 	stp	x29, x30, [sp, -16]!
-	add	x0, x0, 1768
+	adrp	x0, .LANCHOR4
+	add	x0, x0, :lo12:.LANCHOR4
+	add	x0, x0, 1776
 	add	x29, sp, 0
-	ldrh	w2, [x1,2564]
-	strh	w2, [x0,10]
+	ldrh	w2, [x1, 2564]
+	strh	w2, [x0, 10]
 	mov	w2, -3962
-	strh	w2, [x0,4]
-	ldrh	w2, [x1,2590]
-	strh	w2, [x0,8]
-	ldrh	w2, [x1,2566]
-	ldr	x1, [x1,2592]
-	str	x1, [x0,16]
+	strh	w2, [x0, 4]
+	ldrh	w2, [x1, 2590]
+	strh	w2, [x0, 8]
+	ldrh	w2, [x1, 2566]
+	ldr	x1, [x1, 2592]
+	str	x1, [x0, 16]
 	adrp	x1, .LANCHOR2
 	add	x1, x1, :lo12:.LANCHOR2
-	strh	w2, [x0,6]
-	ldr	x2, [x1,3744]
-	str	x2, [x0,24]
-	ldr	x2, [x1,3736]
-	ldr	x1, [x1,3752]
-	str	x2, [x0,32]
-	str	x1, [x0,40]
+	strh	w2, [x0, 6]
+	ldr	x2, [x1, 3736]
+	str	x2, [x0, 24]
+	ldr	x2, [x1, 3728]
+	ldr	x1, [x1, 3744]
+	stp	x2, x1, [x0, 32]
 	bl	FtlMapTblRecovery
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
@@ -15454,7 +15150,7 @@ FtlLoadMapInfo:
 	bl	FtlL2PDataInit
 	adrp	x0, .LANCHOR2
 	add	x0, x0, :lo12:.LANCHOR2
-	add	x0, x0, 3800
+	add	x0, x0, 3792
 	bl	FtlMapTblRecovery
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
@@ -15466,313 +15162,314 @@ FtlLoadMapInfo:
 FtlVendorPartWrite:
 	stp	x29, x30, [sp, -176]!
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
+	stp	x27, x28, [sp, 80]
+	mov	w28, w0
+	stp	x23, x24, [sp, 48]
+	mov	x27, x2
 	adrp	x23, .LANCHOR0
-	stp	x25, x26, [sp,64]
-	mov	w26, w0
+	add	w2, w0, w1
 	add	x0, x23, :lo12:.LANCHOR0
-	stp	x19, x20, [sp,16]
-	stp	x27, x28, [sp,80]
-	stp	x21, x22, [sp,32]
-	mov	w28, w1
-	add	w1, w26, w1
-	ldrh	w21, [x0,2552]
-	mov	x25, x2
-	ldrh	w0, [x0,2540]
-	mov	w20, -1
-	cmp	w1, w0
-	bhi	.L2380
-	adrp	x24, .LANCHOR4
-	lsr	w21, w26, w21
-	add	x24, x24, :lo12:.LANCHOR4
-	mov	w20, 0
-	adrp	x27, .LANCHOR2
-	add	x24, x24, 1768
-.L2381:
-	cbz	w28, .L2380
-	adrp	x0, .LANCHOR2
-	add	x2, x0, :lo12:.LANCHOR2
-	ldr	x0, [x2,3752]
-	ldr	w4, [x0,w21,uxtw 2]
+	stp	x21, x22, [sp, 32]
+	stp	x19, x20, [sp, 16]
+	mov	w21, w1
+	stp	x25, x26, [sp, 64]
+	ldrh	w1, [x0, 2540]
+	cmp	w2, w1
+	bhi	.L2356
+	ldrh	w22, [x0, 2552]
+	adrp	x25, .LANCHOR2
+	add	x25, x25, :lo12:.LANCHOR2
+	mov	w24, 0
+	mov	x26, x25
+	lsr	w22, w28, w22
+.L2350:
+	cbnz	w21, .L2355
+.L2348:
+	mov	w0, w24
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 176
+	ret
+.L2355:
+	ldr	x0, [x25, 3744]
+	ldr	w2, [x0, w22, uxtw 2]
 	add	x0, x23, :lo12:.LANCHOR0
-	ldrh	w1, [x0,2550]
-	uxth	w0, w28
-	udiv	w22, w26, w1
-	msub	w22, w22, w1, w26
-	sub	w19, w1, w22
-	uxth	w19, w19
-	cmp	w19, w28
-	csel	w19, w0, w19, hi
+	ldrh	w1, [x0, 2550]
+	and	w0, w21, 65535
+	udiv	w20, w28, w1
+	msub	w20, w20, w1, w28
+	sub	w19, w1, w20
+	and	w19, w19, 65535
+	cmp	w21, w19
+	csel	w19, w0, w19, cc
+	cbz	w2, .L2352
 	cmp	w19, w1
-	beq	.L2383
-	cbz	w4, .L2383
-	ldr	x0, [x2,3632]
-	mov	w1, 1
-	str	x0, [x29,128]
-	mov	w2, w1
+	beq	.L2352
+	ldr	x0, [x26, 3624]
+	str	w2, [x29, 124]
+	mov	w2, 1
+	stp	x0, xzr, [x29, 128]
+	mov	w1, w2
 	add	x0, x29, 120
-	str	w4, [x29,124]
-	str	xzr, [x29,136]
 	bl	FlashReadPages
-	b	.L2384
-.L2383:
-	add	x0, x27, :lo12:.LANCHOR2
-	add	x2, x23, :lo12:.LANCHOR0
-	mov	w1, 0
-	ldr	x0, [x0,3632]
-	ldrh	w2, [x2,2554]
-	bl	ftl_memset
-.L2384:
-	add	x5, x27, :lo12:.LANCHOR2
-	lsl	w4, w19, 9
-	ubfiz	x22, x22, 9, 16
-	mov	w2, w4
-	mov	x1, x25
-	str	x4, [x29,104]
-	ldr	x0, [x5,3632]
-	sub	w28, w28, w19
-	str	x5, [x29,96]
-	add	w26, w26, w19
-	add	x0, x0, x22
+.L2353:
+	lsl	w3, w19, 9
+	ldr	x0, [x26, 3624]
+	lsl	w20, w20, 9
+	mov	w2, w3
+	asr	w20, w20, 2
+	mov	x1, x27
+	str	w3, [x29, 108]
+	add	x0, x0, w20, sxtw 2
 	bl	ftl_memcpy
-	ldr	x5, [x29,96]
-	mov	w1, w21
-	mov	x0, x24
-	add	w21, w21, 1
-	ldr	x2, [x5,3632]
+	sub	w21, w21, w19
+	ldr	x2, [x26, 3624]
+	adrp	x0, .LANCHOR4
+	add	x0, x0, :lo12:.LANCHOR4
+	mov	w1, w22
+	add	x0, x0, 1776
+	add	w28, w28, w19
+	add	w22, w22, 1
 	bl	FtlMapWritePage
 	cmn	w0, #1
-	ldr	x4, [x29,104]
-	csinv	w20, w20, wzr, ne
-	add	x25, x25, w4, sxtw
-	b	.L2381
-.L2380:
-	mov	w0, w20
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 176
-	ret
+	ldr	w3, [x29, 108]
+	csinv	w24, w24, wzr, ne
+	add	x27, x27, w3, sxtw
+	b	.L2350
+.L2352:
+	add	x0, x23, :lo12:.LANCHOR0
+	mov	w1, 0
+	ldrh	w2, [x0, 2554]
+	ldr	x0, [x26, 3624]
+	bl	ftl_memset
+	b	.L2353
+.L2356:
+	mov	w24, -1
+	b	.L2348
 	.size	FtlVendorPartWrite, .-FtlVendorPartWrite
 	.align	2
 	.global	Ftl_save_ext_data
 	.type	Ftl_save_ext_data, %function
 Ftl_save_ext_data:
 	adrp	x0, .LANCHOR2
-	mov	w1, 19539
 	add	x0, x0, :lo12:.LANCHOR2
+	mov	w1, 19539
 	movk	w1, 0x4654, lsl 16
-	stp	x29, x30, [sp, -16]!
-	add	x2, x0, 856
-	add	x29, sp, 0
-	ldr	w3, [x0,856]
+	ldr	w3, [x0, 848]
 	cmp	w3, w1
-	bne	.L2394
+	bne	.L2364
+	stp	x29, x30, [sp, -16]!
+	add	x2, x0, 848
 	mov	w1, 99
+	add	x29, sp, 0
 	movk	w1, 0x5000, lsl 16
-	str	w1, [x2,4]
-	ldr	w1, [x0,744]
-	str	w1, [x2,88]
-	ldr	w1, [x0,748]
-	str	w1, [x2,92]
-	ldr	w1, [x0,740]
-	str	w1, [x2,8]
-	ldr	w1, [x0,728]
-	str	w1, [x2,12]
-	ldr	w1, [x0,720]
-	str	w1, [x2,16]
-	ldr	w1, [x0,736]
-	str	w1, [x2,20]
-	ldr	w1, [x0,764]
-	str	w1, [x2,28]
-	ldr	w1, [x0,448]
-	str	w1, [x2,32]
-	ldr	w1, [x0,724]
-	str	w1, [x2,36]
-	ldr	w1, [x0,732]
-	str	w1, [x2,40]
-	ldr	w1, [x0,772]
-	str	w1, [x2,44]
-	ldr	w1, [x0,776]
-	str	w1, [x2,48]
-	ldr	w1, [x0,848]
-	ldr	w0, [x0,3564]
-	str	w1, [x2,60]
+	str	w1, [x2, 4]
+	ldr	w1, [x0, 744]
+	str	w1, [x2, 88]
+	ldr	w1, [x0, 748]
+	str	w1, [x2, 92]
+	ldr	w1, [x0, 740]
+	str	w1, [x2, 8]
+	ldr	w1, [x0, 728]
+	str	w1, [x2, 12]
+	ldr	w1, [x0, 720]
+	str	w1, [x2, 16]
+	ldr	w1, [x0, 736]
+	str	w1, [x2, 20]
+	ldr	w1, [x0, 764]
+	str	w1, [x2, 28]
+	ldr	w1, [x0, 448]
+	str	w1, [x2, 32]
+	ldr	w1, [x0, 724]
+	str	w1, [x2, 36]
+	ldr	w1, [x0, 732]
+	str	w1, [x2, 40]
+	ldr	w1, [x0, 772]
+	str	w1, [x2, 44]
+	ldr	w1, [x0, 776]
+	str	w1, [x2, 48]
+	ldr	w1, [x0, 1360]
+	ldr	w0, [x0, 3556]
+	stp	w1, w0, [x2, 60]
 	mov	w1, 1
-	str	w0, [x2,64]
 	mov	w0, 0
 	bl	FtlVendorPartWrite
-.L2394:
 	ldp	x29, x30, [sp], 16
 	ret
+.L2364:
+	ret
 	.size	Ftl_save_ext_data, .-Ftl_save_ext_data
 	.align	2
 	.global	FtlEctTblFlush
 	.type	FtlEctTblFlush, %function
 FtlEctTblFlush:
 	adrp	x1, .LANCHOR0+2372
-	adrp	x2, .LANCHOR2
-	stp	x29, x30, [sp, -16]!
-	add	x29, sp, 0
-	ldr	w3, [x1,#:lo12:.LANCHOR0+2372]
-	mov	w1, 32
-	cbz	w3, .L2397
-	add	x3, x2, :lo12:.LANCHOR2
-	ldr	w3, [x3,776]
-	cmp	w3, 39
+	ldr	w2, [x1, #:lo12:.LANCHOR0+2372]
+	adrp	x1, .LANCHOR2
+	cbz	w2, .L2372
+	add	x2, x1, :lo12:.LANCHOR2
 	mov	w3, 4
-	csel	w1, w1, w3, hi
-.L2397:
+	ldr	w2, [x2, 776]
+	cmp	w2, 39
+	mov	w2, 32
+	csel	w2, w2, w3, hi
+.L2368:
 	adrp	x3, .LANCHOR4
 	add	x3, x3, :lo12:.LANCHOR4
-	ldrh	w4, [x3,1832]
+	ldrh	w4, [x3, 1840]
 	cmp	w4, 31
-	bhi	.L2398
+	bhi	.L2369
 	add	w4, w4, 1
-	mov	w1, 1
-	strh	w4, [x3,1832]
-.L2398:
-	cbnz	w0, .L2399
-	add	x0, x2, :lo12:.LANCHOR2
-	ldr	x3, [x0,3704]
-	ldr	w0, [x3,20]
-	add	w1, w1, w0
-	ldr	w0, [x3,16]
-	cmp	w0, w1
-	bcc	.L2400
-.L2399:
-	add	x2, x2, :lo12:.LANCHOR2
-	ldr	x0, [x2,3704]
-	ldr	w1, [x0,16]
-	str	w1, [x0,20]
-	mov	w1, 17221
-	movk	w1, 0x4254, lsl 16
-	str	w1, [x0]
-	ldr	x0, [x2,3704]
-	ldrh	w1, [x2,3688]
-	str	wzr, [x0,4]
+	mov	w2, 1
+	strh	w4, [x3, 1840]
+.L2369:
+	cbnz	w0, .L2370
+	add	x0, x1, :lo12:.LANCHOR2
+	ldr	x0, [x0, 3696]
+	ldr	w3, [x0, 20]
+	ldr	w0, [x0, 16]
+	add	w2, w2, w3
+	cmp	w0, w2
+	bcc	.L2375
+.L2370:
+	add	x0, x1, :lo12:.LANCHOR2
+	stp	x29, x30, [sp, -16]!
+	add	x29, sp, 0
+	ldr	x1, [x0, 3696]
+	ldr	w2, [x1, 16]
+	str	w2, [x1, 20]
+	mov	w2, 17221
+	movk	w2, 0x4254, lsl 16
+	str	w2, [x1]
+	ldr	x2, [x0, 3696]
+	ldrh	w1, [x0, 3680]
 	lsl	w3, w1, 9
-	str	w3, [x0,12]
-	ldr	w3, [x0,8]
-	ldr	x2, [x2,3704]
+	str	wzr, [x2, 4]
+	str	w3, [x2, 12]
+	ldr	w3, [x2, 8]
 	add	w3, w3, 1
-	str	w3, [x0,8]
+	str	w3, [x2, 8]
+	ldr	x2, [x0, 3696]
 	mov	w0, 64
 	bl	FtlVendorPartWrite
 	bl	Ftl_save_ext_data
-.L2400:
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	ret
+.L2372:
+	mov	w2, 32
+	b	.L2368
+.L2375:
+	mov	w0, 0
+	ret
 	.size	FtlEctTblFlush, .-FtlEctTblFlush
 	.align	2
 	.global	FtlVendorPartRead
 	.type	FtlVendorPartRead, %function
 FtlVendorPartRead:
-	stp	x29, x30, [sp, -208]!
+	stp	x29, x30, [sp, -176]!
+	add	w3, w0, w1
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	mov	w22, w1
+	stp	x23, x24, [sp, 48]
 	adrp	x1, .LANCHOR0
-	stp	x23, x24, [sp,48]
 	mov	w23, w0
 	add	x0, x1, :lo12:.LANCHOR0
-	stp	x25, x26, [sp,64]
-	stp	x19, x20, [sp,16]
-	stp	x27, x28, [sp,80]
-	mov	x26, x2
-	add	w3, w23, w22
-	ldrh	w2, [x0,2540]
-	str	x1, [x29,136]
+	stp	x25, x26, [sp, 64]
+	mov	x25, x2
+	stp	x19, x20, [sp, 16]
+	stp	x27, x28, [sp, 80]
+	str	x1, [x29, 104]
+	ldrh	w2, [x0, 2540]
 	cmp	w3, w2
-	ldrh	w20, [x0,2552]
-	mov	w0, -1
-	bhi	.L2405
-	adrp	x27, .LANCHOR4
-	adrp	x0, .LC135
-	add	x0, x0, :lo12:.LC135
-	add	x27, x27, :lo12:.LANCHOR4
-	str	x0, [x29,128]
-	lsr	w20, w23, w20
-	add	x0, x27, 1768
-	mov	w21, 0
-	str	x0, [x29,120]
-.L2406:
-	cbz	w22, .L2414
-	adrp	x25, .LANCHOR2
-	add	x4, x25, :lo12:.LANCHOR2
-	ldr	x0, [x4,3752]
-	ldr	w3, [x0,w20,uxtw 2]
-	ldr	x0, [x29,136]
+	bhi	.L2386
+	ldrh	w21, [x0, 2552]
+	adrp	x26, .LANCHOR2
+	add	x26, x26, :lo12:.LANCHOR2
+	mov	w24, 0
+	mov	x27, x26
+	lsr	w21, w23, w21
+.L2379:
+	cbnz	w22, .L2385
+.L2377:
+	mov	w0, w24
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 176
+	ret
+.L2385:
+	ldr	x0, [x26, 3744]
+	ldr	w4, [x0, w21, uxtw 2]
+	ldr	x0, [x29, 104]
 	add	x0, x0, :lo12:.LANCHOR0
-	ldrh	w19, [x0,2550]
-	uxth	w0, w22
-	udiv	w24, w23, w19
-	msub	w24, w24, w19, w23
-	sub	w19, w19, w24
-	uxth	w19, w19
-	cmp	w19, w22
-	csel	w19, w0, w19, hi
+	ldrh	w19, [x0, 2550]
+	and	w0, w22, 65535
+	udiv	w20, w23, w19
+	msub	w20, w20, w19, w23
+	sub	w19, w19, w20
+	and	w19, w19, 65535
+	cmp	w22, w19
+	csel	w19, w0, w19, cc
 	lsl	w28, w19, 9
-	cbz	w3, .L2408
-	ldr	x0, [x4,3632]
-	mov	w1, 1
-	str	x0, [x29,160]
-	mov	w2, w1
-	add	x0, x29, 152
-	str	w3, [x29,156]
-	str	x3, [x29,104]
-	str	x4, [x29,112]
-	str	xzr, [x29,168]
+	cbz	w4, .L2381
+	ldr	x0, [x27, 3624]
+	mov	w2, 1
+	str	w4, [x29, 96]
+	mov	w1, w2
+	str	w4, [x29, 124]
+	stp	x0, xzr, [x29, 128]
+	add	x0, x29, 120
 	bl	FlashReadPages
-	ldr	w0, [x29,152]
-	ldr	x3, [x29,104]
+	adrp	x3, .LANCHOR4
+	add	x3, x3, :lo12:.LANCHOR4
+	ldr	w0, [x29, 120]
+	ldr	w4, [x29, 96]
 	cmn	w0, #1
-	ldr	w0, [x27,1704]
-	csinv	w21, w21, wzr, ne
+	ldr	w0, [x3, 1712]
+	csinv	w24, w24, wzr, ne
 	cmp	w0, 256
-	bne	.L2410
-	ldr	x0, [x29,128]
-	mov	w1, w20
-	mov	w2, w3
+	bne	.L2383
+	mov	w2, w4
+	mov	w1, w21
+	str	x3, [x29, 96]
+	adrp	x0, .LC135
+	add	x0, x0, :lo12:.LC135
 	bl	printk
-	ldr	x4, [x29,112]
-	mov	w1, w20
-	ldr	x0, [x29,120]
-	ldr	x2, [x4,3632]
+	ldr	x3, [x29, 96]
+	mov	w1, w21
+	ldr	x2, [x27, 3624]
+	add	x0, x3, 1776
 	bl	FtlMapWritePage
-.L2410:
-	add	x25, x25, :lo12:.LANCHOR2
-	ubfiz	x24, x24, 9, 16
-	mov	x0, x26
+.L2383:
+	ldr	x1, [x27, 3624]
+	lsl	w20, w20, 9
+	asr	w20, w20, 2
 	mov	w2, w28
-	ldr	x1, [x25,3632]
-	add	x1, x1, x24
+	mov	x0, x25
+	add	x1, x1, w20, sxtw 2
 	bl	ftl_memcpy
-	b	.L2411
-.L2408:
-	mov	x0, x26
-	mov	w1, w3
-	mov	w2, w28
-	bl	ftl_memset
-.L2411:
-	add	w20, w20, 1
+.L2384:
+	add	w21, w21, 1
 	sub	w22, w22, w19
 	add	w23, w23, w19
-	add	x26, x26, w28, sxtw
-	b	.L2406
-.L2414:
-	mov	w0, w21
-.L2405:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 208
-	ret
+	add	x25, x25, w28, sxtw
+	b	.L2379
+.L2381:
+	mov	w2, w28
+	mov	w1, 0
+	mov	x0, x25
+	bl	ftl_memset
+	b	.L2384
+.L2386:
+	mov	w24, -1
+	b	.L2377
 	.size	FtlVendorPartRead, .-FtlVendorPartRead
 	.align	2
 	.global	FtlLoadEctTbl
@@ -15781,31 +15478,31 @@ FtlLoadEctTbl:
 	stp	x29, x30, [sp, -32]!
 	mov	w0, 64
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	adrp	x19, .LANCHOR2
 	add	x19, x19, :lo12:.LANCHOR2
-	ldrh	w1, [x19,3688]
-	ldr	x2, [x19,3704]
+	ldrh	w1, [x19, 3680]
+	ldr	x2, [x19, 3696]
 	bl	FtlVendorPartRead
-	ldr	x0, [x19,3704]
+	ldr	x0, [x19, 3696]
 	ldr	w1, [x0]
 	mov	w0, 17221
 	movk	w0, 0x4254, lsl 16
 	cmp	w1, w0
-	beq	.L2416
-	adrp	x0, .LC75
+	beq	.L2389
 	adrp	x1, .LC136
+	adrp	x0, .LC76
 	add	x1, x1, :lo12:.LC136
-	add	x0, x0, :lo12:.LC75
+	add	x0, x0, :lo12:.LC76
 	bl	printk
-	ldrh	w2, [x19,3688]
+	ldr	x0, [x19, 3696]
 	mov	w1, 0
-	ldr	x0, [x19,3704]
+	ldrh	w2, [x19, 3680]
 	lsl	w2, w2, 9
 	bl	ftl_memset
-.L2416:
+.L2389:
 	mov	w0, 0
-	ldr	x19, [sp,16]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	FtlLoadEctTbl, .-FtlLoadEctTbl
@@ -15817,262 +15514,265 @@ Ftl_load_ext_data:
 	mov	w1, 1
 	mov	w0, 0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	str	x21, [sp,32]
 	add	x20, x19, :lo12:.LANCHOR2
-	add	x21, x20, 856
-	mov	x2, x21
+	stp	x21, x22, [sp, 32]
+	add	x22, x20, 848
+	mov	w21, 19539
+	mov	x2, x22
 	bl	FtlVendorPartRead
-	ldr	w1, [x20,856]
-	mov	w0, 19539
-	movk	w0, 0x4654, lsl 16
-	cmp	w1, w0
-	beq	.L2418
-	mov	x0, x21
-	mov	w1, 0
+	ldr	w0, [x20, 848]
+	movk	w21, 0x4654, lsl 16
+	cmp	w0, w21
+	beq	.L2392
 	mov	w2, 512
+	mov	w1, 0
+	mov	x0, x22
 	bl	ftl_memset
-	mov	w0, 19539
-	movk	w0, 0x4654, lsl 16
-	str	w0, [x20,856]
-.L2418:
+	str	w21, [x20, 848]
+.L2392:
 	add	x0, x19, :lo12:.LANCHOR2
 	mov	w2, 19539
 	movk	w2, 0x4654, lsl 16
-	ldr	w3, [x0,856]
+	ldr	w3, [x0, 848]
 	cmp	w3, w2
-	bne	.L2419
-	ldr	w2, [x0,944]
-	str	w2, [x0,744]
-	ldr	w2, [x0,948]
-	str	w2, [x0,748]
-	ldr	w2, [x0,864]
-	str	w2, [x0,740]
-	ldr	w2, [x0,868]
-	str	w2, [x0,728]
-	ldr	w2, [x0,872]
-	str	w2, [x0,720]
-	ldr	w2, [x0,876]
-	str	w2, [x0,736]
-	ldr	w2, [x0,884]
-	str	w2, [x0,764]
-	ldr	w2, [x0,888]
-	str	w2, [x0,448]
-	ldr	w2, [x0,892]
-	str	w2, [x0,724]
-	ldr	w2, [x0,896]
-	str	w2, [x0,732]
-	ldr	w2, [x0,900]
-	str	w2, [x0,772]
-	ldr	w1, [x0,916]
-	ldr	w2, [x0,904]
-	str	w2, [x0,776]
-	str	w1, [x0,848]
-.L2419:
+	bne	.L2393
+	ldr	w2, [x0, 936]
+	str	w2, [x0, 744]
+	ldr	w2, [x0, 940]
+	str	w2, [x0, 748]
+	ldr	w2, [x0, 856]
+	str	w2, [x0, 740]
+	ldr	w2, [x0, 860]
+	str	w2, [x0, 728]
+	ldr	w2, [x0, 864]
+	str	w2, [x0, 720]
+	ldr	w2, [x0, 868]
+	str	w2, [x0, 736]
+	ldr	w2, [x0, 876]
+	str	w2, [x0, 764]
+	ldr	w2, [x0, 880]
+	str	w2, [x0, 448]
+	ldr	w2, [x0, 884]
+	str	w2, [x0, 724]
+	ldr	w2, [x0, 888]
+	str	w2, [x0, 732]
+	ldr	w2, [x0, 892]
+	ldr	w1, [x0, 908]
+	str	w2, [x0, 772]
+	ldr	w2, [x0, 896]
+	str	w1, [x0, 1360]
+	str	w2, [x0, 776]
+.L2393:
 	add	x0, x19, :lo12:.LANCHOR2
 	mov	w1, 34661
 	movk	w1, 0x1234, lsl 16
-	add	x0, x0, 856
 	adrp	x20, .LANCHOR0
-	ldr	w2, [x0,68]
-	str	wzr, [x0,2708]
+	add	x0, x0, 848
+	ldr	w2, [x0, 68]
+	str	wzr, [x0, 2708]
 	cmp	w2, w1
-	bne	.L2420
+	bne	.L2394
 	add	x1, x20, :lo12:.LANCHOR0
-	ldrb	w2, [x1,204]
-	cbz	w2, .L2421
-	str	wzr, [x0,68]
+	ldrb	w2, [x1, 204]
+	cbz	w2, .L2395
+	str	wzr, [x0, 68]
 	bl	Ftl_save_ext_data
-	b	.L2420
-.L2421:
-	mov	w0, 1
-	str	w0, [x1,2372]
-	adrp	x0, .LC75
-	adrp	x1, .LC137
-	add	x0, x0, :lo12:.LC75
-	add	x1, x1, :lo12:.LC137
-	bl	printk
-.L2420:
+.L2394:
 	add	x19, x19, :lo12:.LANCHOR2
 	add	x20, x20, :lo12:.LANCHOR0
-	ldr	x21, [sp,32]
-	ldrh	w1, [x20,2536]
-	ldr	w2, [x19,760]
-	ldr	w0, [x19,764]
-	madd	w0, w1, w2, w0
-	ldrh	w1, [x20,2480]
+	ldp	x21, x22, [sp, 32]
+	ldr	w1, [x19, 764]
+	ldrh	w0, [x20, 2536]
+	ldr	w2, [x19, 760]
+	madd	w0, w0, w2, w1
+	ldrh	w1, [x20, 2480]
 	udiv	w0, w0, w1
-	str	w0, [x19,768]
-	ldp	x19, x20, [sp,16]
+	str	w0, [x19, 768]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
+.L2395:
+	mov	w0, 1
+	str	w0, [x1, 2372]
+	adrp	x1, .LC137
+	adrp	x0, .LC76
+	add	x1, x1, :lo12:.LC137
+	add	x0, x0, :lo12:.LC76
+	bl	printk
+	b	.L2394
 	.size	Ftl_load_ext_data, .-Ftl_load_ext_data
 	.align	2
 	.global	FtlMapBlkWriteDumpData
 	.type	FtlMapBlkWriteDumpData, %function
 FtlMapBlkWriteDumpData:
+	ldr	w1, [x0, 56]
+	cbz	w1, .L2404
 	stp	x29, x30, [sp, -48]!
+	adrp	x2, .LANCHOR2
+	add	x2, x2, :lo12:.LANCHOR2
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	str	x21, [sp,32]
-	ldr	w1, [x0,56]
-	ldrh	w20, [x0,6]
-	ldr	x4, [x0,40]
-	cbz	w1, .L2422
-	adrp	x3, .LANCHOR2
-	str	wzr, [x0,56]
-	add	x3, x3, :lo12:.LANCHOR2
-	ldr	w1, [x3,424]
-	cbnz	w1, .L2422
-	adrp	x2, .LANCHOR4
-	sub	w20, w20, #1
-	add	x1, x2, :lo12:.LANCHOR4
+	stp	x19, x20, [sp, 16]
+	str	x21, [sp, 32]
+	str	wzr, [x0, 56]
+	ldr	w1, [x2, 424]
+	ldrh	w19, [x0, 6]
+	ldr	x4, [x0, 40]
+	cbnz	w1, .L2397
+	adrp	x1, .LANCHOR4
+	add	x3, x1, :lo12:.LANCHOR4
+	sub	w19, w19, #1
 	mov	x21, x0
-	uxth	w20, w20
-	ldr	x0, [x3,3624]
-	ldr	x3, [x3,3664]
-	add	x1, x1, 1704
-	str	x3, [x1,16]
-	ubfiz	x3, x20, 2, 16
-	str	x0, [x1,8]
-	mov	x19, x2
-	ldr	w3, [x4,x3]
-	str	w3, [x1,4]
-	cbz	w3, .L2426
-	mov	x0, x1
-	mov	w1, 1
-	mov	w2, w1
+	and	w19, w19, 65535
+	ldr	x0, [x2, 3616]
+	ldr	x2, [x2, 3656]
+	mov	x20, x1
+	str	x2, [x3, 1728]
+	ubfiz	x2, x19, 2, 16
+	str	x0, [x3, 1720]
+	add	x3, x3, 1712
+	ldr	w2, [x4, x2]
+	str	w2, [x3, 4]
+	cbz	w2, .L2401
+	mov	w2, 1
+	mov	x0, x3
+	mov	w1, w2
 	bl	FlashReadPages
-	b	.L2427
-.L2426:
-	adrp	x2, .LANCHOR0+2554
-	mov	w1, 255
-	ldrh	w2, [x2,#:lo12:.LANCHOR0+2554]
-	bl	ftl_memset
-.L2427:
-	add	x2, x19, :lo12:.LANCHOR4
+.L2402:
+	add	x1, x20, :lo12:.LANCHOR4
 	mov	x0, x21
-	mov	w1, w20
-	ldr	x2, [x2,1712]
+	ldr	x2, [x1, 1720]
+	mov	w1, w19
 	bl	FtlMapWritePage
-.L2422:
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
+.L2397:
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
+.L2401:
+	adrp	x1, .LANCHOR0+2554
+	ldrh	w2, [x1, #:lo12:.LANCHOR0+2554]
+	mov	w1, 255
+	bl	ftl_memset
+	b	.L2402
+.L2404:
+	ret
 	.size	FtlMapBlkWriteDumpData, .-FtlMapBlkWriteDumpData
 	.align	2
 	.type	FlashReadFacBbtData.part.17, %function
 FlashReadFacBbtData.part.17:
 	stp	x29, x30, [sp, -32]!
-	mov	w3, 0
-	adrp	x4, .LANCHOR4
+	adrp	x3, .LANCHOR4
 	add	x29, sp, 0
-	str	x19, [sp,16]
-	mov	w7, 1
+	str	x19, [sp, 16]
 	mov	x19, x0
-	cbnz	w1, .L2431
-.L2433:
-	add	x0, x4, :lo12:.LANCHOR4
-	ldr	w1, [x0,1636]
-	cmp	w3, w1
-	bcs	.L2431
-	ubfx	x5, x3, 5, 11
-	ldr	x0, [x0,1600]
-	lsl	x5, x5, 2
-	lsl	w6, w7, w3
-	add	w3, w3, 1
-	ldr	w1, [x0,x5]
-	uxth	w3, w3
-	orr	w6, w1, w6
-	str	w6, [x0,x5]
-	b	.L2433
-.L2431:
-	add	x4, x4, :lo12:.LANCHOR4
+	cbnz	w1, .L2408
+	add	x5, x3, :lo12:.LANCHOR4
+	mov	w0, 0
+	mov	w7, 1
+.L2409:
+	ldr	w1, [x5, 1644]
+	cmp	w0, w1
+	bcc	.L2410
+.L2408:
+	add	x3, x3, :lo12:.LANCHOR4
 	mov	x0, x19
-	ldr	x1, [x4,1600]
+	ldr	x1, [x3, 1608]
 	bl	ftl_memcpy
-	mov	w2, 4
-	adrp	x0, .LC138
+	mov	w3, 4
 	mov	x1, x19
+	mov	w2, w3
+	adrp	x0, .LC138
 	add	x0, x0, :lo12:.LC138
-	mov	w3, w2
 	bl	rknand_print_hex
-	ldr	x19, [sp,16]
 	mov	w0, 0
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L2410:
+	ubfx	x1, x0, 5, 11
+	ldr	x6, [x5, 1608]
+	lsl	x1, x1, 2
+	lsl	w8, w7, w0
+	add	w0, w0, 1
+	and	w0, w0, 65535
+	ldr	w4, [x6, x1]
+	orr	w4, w4, w8
+	str	w4, [x6, x1]
+	b	.L2409
 	.size	FlashReadFacBbtData.part.17, .-FlashReadFacBbtData.part.17
 	.align	2
 	.global	FlashReadFacBbtData
 	.type	FlashReadFacBbtData, %function
 FlashReadFacBbtData:
 	stp	x29, x30, [sp, -144]!
-	adrp	x4, .LANCHOR0
 	add	x29, sp, 0
-	add	x4, x4, :lo12:.LANCHOR0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	mov	x22, x0
+	stp	x23, x24, [sp, 48]
 	mov	w23, w1
-	ldrh	w0, [x4,190]
+	adrp	x1, .LANCHOR0
+	add	x1, x1, :lo12:.LANCHOR0
+	stp	x19, x20, [sp, 16]
+	add	x1, x1, 176
+	stp	x21, x22, [sp, 32]
+	mov	x22, x0
+	stp	x25, x26, [sp, 64]
 	mov	w25, w2
-	ldrh	w3, [x4,188]
-	adrp	x4, .LANCHOR4
-	mov	x21, x4
 	mov	w26, 61664
-	mul	w3, w3, w0
-	add	x0, x4, :lo12:.LANCHOR4
-	uxth	w3, w3
-	sub	w20, w3, #1
-	ldr	x1, [x0,1600]
-	mul	w24, w23, w3
-	ldr	x0, [x0,1656]
-	uxth	w20, w20
-	str	x1, [x29,96]
-	sub	w19, w3, #16
-	str	x0, [x29,104]
-.L2436:
+	ldrh	w0, [x1, 14]
+	ldrh	w1, [x1, 12]
+	mul	w0, w0, w1
+	adrp	x1, .LANCHOR4
+	add	x1, x1, :lo12:.LANCHOR4
+	and	w0, w0, 65535
+	mov	x21, x1
+	sub	w20, w0, #1
+	sub	w19, w0, #16
+	ldr	x2, [x1, 1608]
+	and	w20, w20, 65535
+	mul	w24, w0, w23
+	str	x2, [x29, 96]
+	ldr	x2, [x1, 1664]
+	str	x2, [x29, 104]
+.L2414:
 	cmp	w20, w19
-	ble	.L2444
+	bgt	.L2417
+	mov	w0, -1
+	b	.L2413
+.L2417:
 	add	w0, w20, w24
-	mov	w1, 1
+	mov	w2, 1
 	lsl	w0, w0, 10
-	mov	w2, w1
-	str	w0, [x29,92]
+	mov	w1, w2
+	str	w0, [x29, 92]
 	add	x0, x29, 88
 	bl	FlashReadPages
-	ldr	w0, [x29,88]
+	ldr	w0, [x29, 88]
 	cmn	w0, #1
-	beq	.L2437
-	add	x0, x21, :lo12:.LANCHOR4
-	ldr	x0, [x0,1656]
+	beq	.L2415
+	ldr	x0, [x21, 1664]
 	ldrh	w0, [x0]
 	cmp	w0, w26
-	bne	.L2437
-	mov	w0, w22
-	cbz	x22, .L2438
-	mov	x0, x22
-	mov	w1, w23
+	bne	.L2415
+	cbz	x22, .L2418
 	mov	w2, w25
+	mov	w1, w23
+	mov	x0, x22
 	bl	FlashReadFacBbtData.part.17
-	b	.L2438
-.L2437:
-	sub	w20, w20, #1
-	uxth	w20, w20
-	b	.L2436
-.L2444:
-	mov	w0, -1
-.L2438:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
+.L2413:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
 	ldp	x29, x30, [sp], 144
 	ret
+.L2415:
+	sub	w20, w20, #1
+	and	w20, w20, 65535
+	b	.L2414
+.L2418:
+	mov	w0, 0
+	b	.L2413
 	.size	FlashReadFacBbtData, .-FlashReadFacBbtData
 	.align	2
 	.global	FlashGetBadBlockList
@@ -16080,261 +15780,255 @@ FlashReadFacBbtData:
 FlashGetBadBlockList:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	str	x21, [sp,32]
+	str	x21, [sp, 32]
 	mov	x21, x0
 	adrp	x0, .LANCHOR0+88
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR4
-	ldr	x0, [x0,#:lo12:.LANCHOR0+88]
-	ldrb	w2, [x0,13]
-	ldrh	w19, [x0,14]
-	add	x0, x20, :lo12:.LANCHOR4
-	mul	w19, w2, w19
-	ldr	x0, [x0,1648]
-	uxth	w19, w19
+	add	x20, x20, :lo12:.LANCHOR4
+	ldr	x0, [x0, #:lo12:.LANCHOR0+88]
+	ldrb	w2, [x0, 13]
+	ldrh	w19, [x0, 14]
+	ldr	x0, [x20, 1656]
+	mul	w19, w19, w2
+	and	w19, w19, 65535
 	add	w2, w19, 7
 	lsr	w2, w2, 3
 	bl	FlashReadFacBbtData
 	cmn	w0, #1
-	bne	.L2446
-.L2450:
-	mov	w1, 0
-	b	.L2447
-.L2446:
-	mov	w2, 0
-	lsr	w0, w19, 4
-	mov	w1, w2
-	sub	w19, w19, #1
-	mov	w5, 1
-.L2448:
-	cmp	w2, w19
-	bge	.L2447
-	add	x3, x20, :lo12:.LANCHOR4
-	ubfx	x4, x2, 5, 11
-	ldr	x6, [x3,1648]
-	lsl	w3, w5, w2
-	ldr	w4, [x6,x4,lsl 2]
-	tst	w3, w4
-	beq	.L2449
-	add	w3, w1, 1
-	ubfiz	x1, x1, 1, 16
-	strh	w2, [x21,x1]
-	uxth	w1, w3
-.L2449:
-	cmp	w1, w0
-	bcs	.L2450
-	add	w2, w2, 1
-	uxth	w2, w2
-	b	.L2448
-.L2447:
-	ubfiz	x1, x1, 1, 16
-	mov	w0, -1
-	ldp	x19, x20, [sp,16]
-	strh	w0, [x21,x1]
+	bne	.L2424
+.L2428:
+	mov	w0, 0
+.L2425:
+	ubfiz	x0, x0, 1, 16
+	mov	w1, -1
+	strh	w1, [x21, x0]
 	mov	w0, 0
-	ldr	x21, [sp,32]
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
+.L2424:
+	lsr	w4, w19, 4
+	sub	w19, w19, #1
+	mov	w1, 0
+	mov	w0, 0
+	mov	w5, 1
+.L2426:
+	cmp	w1, w19
+	bge	.L2425
+	ldr	x6, [x20, 1656]
+	ubfx	x3, x1, 5, 11
+	lsl	w2, w5, w1
+	ldr	w3, [x6, x3, lsl 2]
+	tst	w2, w3
+	beq	.L2427
+	add	w2, w0, 1
+	ubfiz	x0, x0, 1, 16
+	strh	w1, [x21, x0]
+	and	w0, w2, 65535
+.L2427:
+	cmp	w0, w4
+	bcs	.L2428
+	add	w1, w1, 1
+	and	w1, w1, 65535
+	b	.L2426
 	.size	FlashGetBadBlockList, .-FlashGetBadBlockList
 	.align	2
 	.global	FtlMakeBbt
 	.type	FtlMakeBbt, %function
 FtlMakeBbt:
 	stp	x29, x30, [sp, -112]!
+	adrp	x0, .LANCHOR2
+	add	x1, x0, :lo12:.LANCHOR2
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	adrp	x23, .LANCHOR2
-	add	x0, x23, :lo12:.LANCHOR2
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	ldr	w21, [x0,424]
-	cbnz	w21, .L2456
-	adrp	x19, .LANCHOR0
-	adrp	x20, .LANCHOR4
-	add	x24, x19, :lo12:.LANCHOR0
-	add	x20, x20, :lo12:.LANCHOR4
-	add	x24, x24, 2624
-	add	x20, x20, 1704
-	mov	x25, x24
-	mov	x26, x20
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	str	x0, [x29, 104]
+	ldr	w23, [x1, 424]
+	cbnz	w23, .L2435
 	bl	FtlBbtMemInit
+	adrp	x20, .LANCHOR0
 	bl	FtlLoadFactoryBbt
-.L2457:
-	add	x22, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x22,2494]
+	add	x22, x20, :lo12:.LANCHOR0
+	adrp	x0, .LANCHOR4
+	add	x24, x0, :lo12:.LANCHOR4
+	add	x26, x22, 2656
+	add	x24, x24, 1712
+	add	x22, x22, 2636
+.L2436:
+	add	x19, x20, :lo12:.LANCHOR0
+	ldrh	w0, [x19, 2494]
+	cmp	w23, w0
+	bcc	.L2442
+	mov	w21, 0
+.L2443:
+	ldrh	w0, [x19, 2558]
+	cmp	w0, w21
+	bhi	.L2444
+	add	x19, x19, 2624
+	ldrh	w21, [x19, 12]
+	mov	w22, 65535
+	sub	w21, w21, #1
+	and	w21, w21, 65535
+.L2445:
+	ldrh	w0, [x19, 12]
+	sub	w0, w0, #48
 	cmp	w21, w0
-	bcs	.L2475
-	add	x1, x23, :lo12:.LANCHOR2
-	ldrh	w28, [x25,12]
-	ldr	x0, [x1,3616]
-	ldr	x27, [x1,3664]
-	mov	w1, 65535
-	str	x0, [x20,8]
-	cmp	w28, w1
-	str	x27, [x20,16]
-	beq	.L2458
-	ldrh	w0, [x22,2542]
-	mov	w1, 1
-	mov	w2, w1
-	madd	w28, w21, w0, w28
+	ble	.L2449
+	mov	w0, w21
+	bl	FtlBbmIsBadBlock
+	cmp	w0, 1
+	beq	.L2446
+	mov	w0, w21
+	bl	FlashTestBlk
+	cbz	w0, .L2447
+	mov	w0, w21
+	bl	FtlBbmMapBadBlock
+.L2446:
+	sub	w21, w21, #1
+	and	w21, w21, 65535
+	b	.L2445
+.L2442:
+	ldr	x0, [x29, 104]
+	adrp	x1, .LANCHOR4
+	add	x21, x1, :lo12:.LANCHOR4
+	ldrh	w1, [x22]
+	add	x25, x0, :lo12:.LANCHOR2
+	add	x21, x21, 1712
+	mov	w2, 65535
+	cmp	w1, w2
+	ldr	x0, [x25, 3608]
+	ldr	x27, [x25, 3656]
+	stp	x0, x27, [x21, 8]
+	beq	.L2437
+	ldrh	w4, [x19, 2542]
+	mov	w2, 1
+	madd	w28, w4, w23, w1
+	mov	w1, w2
 	lsl	w0, w28, 10
-	str	w0, [x20,4]
-	mov	x0, x20
+	str	w0, [x21, 4]
+	mov	x0, x21
 	bl	FlashReadPages
-	ldrh	w2, [x22,2542]
-	ldr	x0, [x24,32]
+	ldr	x1, [x21, 8]
+	ldr	x0, [x26]
+	ldrh	w2, [x19, 2542]
 	add	w2, w2, 7
-	ldr	x1, [x20,8]
 	lsr	w2, w2, 3
 	bl	ftl_memcpy
-	b	.L2459
-.L2458:
-	mov	w1, w21
+.L2438:
+	mov	w0, w28
+	add	w23, w23, 1
+	bl	FtlBbmMapBadBlock
+	add	x26, x26, 8
+	add	x22, x22, 2
+	b	.L2436
+.L2437:
+	mov	w1, w23
 	bl	FlashGetBadBlockList
-	ldr	x0, [x20,8]
-	ldr	x1, [x24,32]
+	ldr	x0, [x21, 8]
+	ldr	x1, [x26]
 	bl	FtlBbt2Bitmap
-	ldrh	w22, [x22,2542]
-.L2461:
-	sub	w22, w22, #1
-	uxth	w22, w22
-.L2460:
-	add	x28, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x28,2542]
-	madd	w0, w21, w0, w22
+	ldrh	w21, [x19, 2542]
+.L2440:
+	sub	w21, w21, #1
+	and	w21, w21, 65535
+.L2439:
+	ldrh	w0, [x19, 2542]
+	madd	w0, w23, w0, w21
 	bl	FtlBbmIsBadBlock
 	cmp	w0, 1
-	beq	.L2461
-	add	x3, x23, :lo12:.LANCHOR2
-	mov	w1, 0
+	beq	.L2440
+	ldr	x0, [x25, 3656]
 	mov	w2, 16
-	strh	w22, [x25,12]
-	str	x3, [x29,104]
-	ldr	x0, [x3,3664]
+	strh	w21, [x22]
+	mov	w1, 0
 	bl	ftl_memset
-	str	wzr, [x27,4]
+	str	wzr, [x27, 4]
 	mov	w0, -3872
 	strh	w0, [x27]
-	ldr	x3, [x29,104]
-	ldrh	w0, [x25,12]
-	strh	w0, [x27,2]
-	ldrh	w0, [x28,2542]
-	ldrh	w1, [x25,12]
-	ldrh	w2, [x3,3792]
-	madd	w28, w21, w0, w1
-	ldr	x1, [x24,32]
+	ldrh	w0, [x22]
+	strh	w0, [x27, 2]
+	ldrh	w4, [x19, 2542]
+	ldrh	w0, [x22]
+	ldr	x1, [x26]
+	ldrh	w2, [x25, 3784]
+	madd	w28, w4, w23, w0
 	lsl	w2, w2, 2
 	lsl	w0, w28, 10
-	str	w0, [x26,4]
-	ldr	x0, [x26,8]
+	str	w0, [x24, 4]
+	ldr	x0, [x24, 8]
 	bl	ftl_memcpy
-	mov	w1, 1
-	mov	x0, x26
-	mov	w2, w1
+	mov	w2, 1
+	mov	x0, x24
+	mov	w1, w2
 	bl	FlashEraseBlocks
-	mov	w1, 1
-	mov	x0, x26
-	mov	w2, w1
-	mov	w3, w1
+	mov	w3, 1
+	mov	x0, x24
+	mov	w2, w3
+	mov	w1, w3
 	bl	FlashProgPages
-	ldr	w0, [x26]
+	ldr	w0, [x24]
 	cmn	w0, #1
-	bne	.L2459
+	bne	.L2438
 	mov	w0, w28
 	bl	FtlBbmMapBadBlock
-	b	.L2460
-.L2459:
-	mov	w0, w28
+	b	.L2439
+.L2444:
+	mov	w0, w21
 	add	w21, w21, 1
-	add	x24, x24, 8
-	add	x25, x25, 2
 	bl	FtlBbmMapBadBlock
-	b	.L2457
-.L2475:
-	mov	w20, 0
-.L2464:
-	add	x21, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x21,2558]
-	cmp	w0, w20
-	bls	.L2476
-	mov	w0, w20
-	add	w20, w20, 1
+	and	w21, w21, 65535
+	b	.L2443
+.L2447:
+	ldrh	w0, [x19]
+	cmp	w0, w22
+	bne	.L2448
+	strh	w21, [x19]
+	b	.L2446
+.L2448:
+	strh	w21, [x19, 4]
+.L2449:
+	ldr	x0, [x29, 104]
+	add	x20, x20, :lo12:.LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR2
+	ldrh	w1, [x20, 2624]
+	str	wzr, [x20, 2632]
+	ldr	x2, [x0, 432]
+	lsl	w1, w1, 10
+	strh	wzr, [x20, 2626]
+	str	w1, [x2, 4]
+	mov	w2, 2
+	ldr	x0, [x0, 432]
+	ldrh	w1, [x20, 2628]
+	lsl	w1, w1, 10
+	str	w1, [x0, 60]
+	mov	w1, 1
+	bl	FlashEraseBlocks
+	ldrh	w0, [x20, 2624]
 	bl	FtlBbmMapBadBlock
-	uxth	w20, w20
-	b	.L2464
-.L2476:
-	ldrh	w20, [x21,2636]
-	mov	w24, 65535
-	sub	w20, w20, #1
-	uxth	w20, w20
-.L2466:
-	add	x22, x21, 2624
-	ldrh	w0, [x22,12]
-	sub	w0, w0, #48
-	cmp	w20, w0
-	ble	.L2470
-	mov	w0, w20
-	bl	FtlBbmIsBadBlock
-	cmp	w0, 1
-	beq	.L2467
-	mov	w0, w20
-	bl	FlashTestBlk
-	cbz	w0, .L2468
-	mov	w0, w20
-	bl	FtlBbmMapBadBlock
-	b	.L2467
-.L2468:
-	ldrh	w0, [x21,2624]
-	cmp	w0, w24
-	bne	.L2469
-	strh	w20, [x21,2624]
-	b	.L2467
-.L2469:
-	strh	w20, [x22,4]
-	b	.L2470
-.L2467:
-	sub	w20, w20, #1
-	uxth	w20, w20
-	b	.L2466
-.L2470:
-	add	x23, x23, :lo12:.LANCHOR2
-	add	x19, x19, :lo12:.LANCHOR0
-	mov	w2, 2
-	ldr	x1, [x23,432]
-	ldrh	w0, [x19,2624]
-	str	wzr, [x19,2632]
-	lsl	w0, w0, 10
-	str	w0, [x1,4]
-	strh	wzr, [x19,2626]
-	ldr	x0, [x23,432]
-	ldrh	w1, [x19,2628]
-	lsl	w1, w1, 10
-	str	w1, [x0,60]
-	mov	w1, 1
-	bl	FlashEraseBlocks
-	ldrh	w0, [x19,2624]
-	bl	FtlBbmMapBadBlock
-	ldrh	w0, [x19,2628]
+	ldrh	w0, [x20, 2628]
 	bl	FtlBbmMapBadBlock
 	bl	FtlBbmTblFlush
-	strh	wzr, [x19,2626]
-	ldr	w0, [x19,2632]
-	ldrh	w1, [x19,2628]
+	strh	wzr, [x20, 2626]
+	ldr	w0, [x20, 2632]
+	ldrh	w1, [x20, 2628]
 	add	w0, w0, 1
-	str	w0, [x19,2632]
-	ldrh	w0, [x19,2624]
-	strh	w0, [x19,2628]
-	strh	w1, [x19,2624]
+	str	w0, [x20, 2632]
+	ldrh	w0, [x20, 2624]
+	strh	w0, [x20, 2628]
+	strh	w1, [x20, 2624]
 	bl	FtlBbmTblFlush
-.L2456:
+.L2435:
+	ldp	x19, x20, [sp, 16]
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 112
 	ret
 	.size	FtlMakeBbt, .-FtlMakeBbt
@@ -16344,193 +16038,192 @@ FtlMakeBbt:
 log2phys:
 	stp	x29, x30, [sp, -128]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	adrp	x22, .LANCHOR0
 	add	x3, x22, :lo12:.LANCHOR0
-	str	x22, [x29,120]
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	ldr	w4, [x3,2616]
-	ldrh	w27, [x3,2552]
+	stp	x19, x20, [sp, 16]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldr	w4, [x3, 2616]
 	cmp	w0, w4
-	bcs	.L2478
-	add	w27, w27, 7
+	bcs	.L2456
+	ldrh	w27, [x3, 2552]
+	mov	w25, w0
 	adrp	x20, .LANCHOR2
+	str	x1, [x29, 120]
+	add	w27, w27, 7
+	ldrh	w1, [x3, 2582]
+	str	w2, [x29, 116]
 	lsr	w24, w0, w27
-	str	w0, [x29,116]
 	add	x0, x20, :lo12:.LANCHOR2
-	str	w2, [x29,112]
-	mov	x26, x1
-	uxth	w23, w24
-	ldrh	w2, [x3,2582]
-	ldr	x22, [x0,704]
+	and	w23, w24, 65535
+	ldr	x8, [x0, 704]
 	mov	x0, 0
-	b	.L2479
-.L2478:
-	mov	w0, -1
-	cbnz	w2, .L2480
-	str	w0, [x1]
-	b	.L2480
-.L2484:
-	add	x0, x0, 1
-	add	x3, x22, x0, lsl 4
-	ldrh	w3, [x3,-16]
-	cmp	w3, w23
-	beq	.L2481
-.L2479:
-	uxth	x19, w0
-	cmp	w19, w2
-	bcc	.L2484
+.L2457:
+	and	x19, x0, 65535
+	cmp	w19, w1
+	bcc	.L2462
 	bl	select_l2p_ram_region
-	uxth	x19, w0
+	and	x19, x0, 65535
 	ubfiz	x21, x19, 4, 16
-	mov	w1, 65535
-	add	x2, x22, x21
-	ldrh	w3, [x22,x21]
-	cmp	w3, w1
-	bne	.L2492
-.L2485:
+	mov	w2, 65535
+	add	x1, x8, x21
+	ldrh	w3, [x8, x21]
+	cmp	w3, w2
+	beq	.L2463
+	ldr	w1, [x1, 4]
+	tbz	w1, #31, .L2463
+	bl	flush_l2p_region
+.L2463:
 	add	x28, x20, :lo12:.LANCHOR2
 	ubfiz	x0, x23, 2, 16
-	ldr	x1, [x28,3760]
-	ldr	w25, [x1,x0]
-	cbnz	w25, .L2486
-	ldr	x1, [x29,120]
-	ldr	x0, [x28,704]
-	add	x22, x1, :lo12:.LANCHOR0
+	ldr	x1, [x28, 3752]
+	ldr	w3, [x1, x0]
+	cbnz	w3, .L2464
+	ldr	x0, [x28, 704]
+	add	x22, x22, :lo12:.LANCHOR0
 	mov	w1, 255
 	add	x0, x0, x21
-	ldrh	w2, [x22,2554]
-	ldr	x0, [x0,8]
+	ldrh	w2, [x22, 2554]
+	ldr	x0, [x0, 8]
 	bl	ftl_memset
-	ldr	x0, [x28,704]
-	strh	w23, [x0,x21]
-	ldr	x0, [x28,704]
+	ldr	x0, [x28, 704]
+	strh	w23, [x0, x21]
+	ldr	x0, [x28, 704]
 	add	x21, x0, x21
-	str	w25, [x21,4]
-.L2481:
+	str	wzr, [x21, 4]
+	b	.L2459
+.L2456:
+	mov	w0, -1
+	cbnz	w2, .L2455
+	str	w0, [x1]
+.L2455:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 128
+	ret
+.L2462:
+	add	x0, x0, 1
+	add	x2, x8, x0, lsl 4
+	ldrh	w2, [x2, -16]
+	cmp	w2, w23
+	bne	.L2457
+.L2459:
 	mov	x0, 1
 	lsl	x27, x0, x27
-	ldr	w0, [x29,116]
+	ldr	w0, [x29, 116]
 	sub	w27, w27, #1
-	and	w25, w0, w27
-	ldr	w0, [x29,112]
-	uxth	x25, w25
-	cbnz	w0, .L2482
+	and	w25, w27, w25
+	and	x25, x25, 65535
+	cbnz	w0, .L2460
 	add	x0, x20, :lo12:.LANCHOR2
-	ldr	x0, [x0,704]
+	ldr	x1, [x29, 120]
+	ldr	x0, [x0, 704]
 	add	x0, x0, x19, lsl 4
-	ldr	x0, [x0,8]
-	ldr	w0, [x0,x25,lsl 2]
-	str	w0, [x26]
-	b	.L2483
-.L2482:
-	add	x1, x20, :lo12:.LANCHOR2
-	lsl	x0, x19, 4
-	ldr	w3, [x26]
-	ldr	x2, [x1,704]
-	add	x2, x2, x0
-	ldr	x2, [x2,8]
-	str	w3, [x2,x25,lsl 2]
-	strh	w23, [x1,712]
-	ldr	x2, [x1,704]
-	add	x0, x2, x0
-	ldr	w2, [x0,4]
-	orr	w2, w2, -2147483648
-	str	w2, [x0,4]
-.L2483:
+	ldr	x0, [x0, 8]
+	ldr	w0, [x0, x25, lsl 2]
+	str	w0, [x1]
+.L2461:
 	add	x20, x20, :lo12:.LANCHOR2
-	ldr	x0, [x20,704]
+	ldr	x0, [x20, 704]
 	add	x19, x0, x19, lsl 4
+	ldr	w0, [x19, 4]
+	cmn	w0, #1
+	beq	.L2468
+	add	w0, w0, 1
+	str	w0, [x19, 4]
+.L2468:
 	mov	w0, 0
-	ldr	w1, [x19,4]
-	cmn	w1, #1
-	beq	.L2480
-	add	w1, w1, 1
-	str	w1, [x19,4]
-	b	.L2480
-.L2492:
-	ldr	w1, [x2,4]
-	tbz	w1, #31, .L2485
-	bl	flush_l2p_region
-	b	.L2485
-.L2486:
-	ldr	x0, [x28,704]
+	b	.L2455
+.L2460:
+	add	x2, x20, :lo12:.LANCHOR2
+	ldr	x1, [x29, 120]
+	lsl	x0, x19, 4
+	ldr	x3, [x2, 704]
+	ldr	w4, [x1]
+	mov	x1, x0
+	add	x0, x3, x0
+	ldr	x0, [x0, 8]
+	str	w4, [x0, x25, lsl 2]
+	strh	w23, [x2, 712]
+	ldr	x0, [x2, 704]
+	add	x0, x0, x1
+	ldr	w1, [x0, 4]
+	orr	w1, w1, -2147483648
+	str	w1, [x0, 4]
+	b	.L2461
+.L2464:
+	ldr	x0, [x28, 704]
 	adrp	x6, .LANCHOR4
 	add	x6, x6, :lo12:.LANCHOR4
-	mov	w1, 1
+	mov	w2, 1
 	add	x0, x0, x21
-	add	x22, x6, 1704
-	mov	w2, w1
-	str	x6, [x29,104]
-	str	w25, [x6,1708]
-	ldr	x0, [x0,8]
-	str	x0, [x6,1712]
-	ldr	x0, [x28,3664]
-	str	x0, [x6,1720]
-	mov	x0, x22
+	add	x26, x6, 1712
+	str	x6, [x29, 104]
+	mov	w1, w2
+	str	w3, [x6, 1716]
+	ldr	x0, [x0, 8]
+	str	x0, [x6, 1720]
+	ldr	x0, [x28, 3656]
+	str	x0, [x6, 1728]
+	mov	x0, x26
+	str	w3, [x29, 112]
 	bl	FlashReadPages
-	ldr	x0, [x22,16]
-	ldr	x6, [x29,104]
-	ldrh	w0, [x0,8]
+	ldr	x0, [x26, 16]
+	ldr	w3, [x29, 112]
+	ldr	x6, [x29, 104]
+	ldrh	w0, [x0, 8]
 	cmp	w0, w23
-	beq	.L2487
+	beq	.L2465
+	mov	w2, w3
+	and	w1, w24, 65535
 	adrp	x0, .LC139
-	uxth	w1, w24
-	mov	w2, w25
 	add	x0, x0, :lo12:.LC139
 	bl	printk
-	ldr	x1, [x22,16]
-	mov	w2, 4
+	add	x22, x22, :lo12:.LANCHOR0
+	ldr	x1, [x26, 16]
+	mov	w3, 4
 	adrp	x0, .LC100
-	mov	w3, w2
+	mov	w2, w3
 	add	x0, x0, :lo12:.LC100
 	bl	rknand_print_hex
-	ldr	x0, [x29,120]
+	ldrh	w3, [x22, 2580]
 	mov	w2, 4
-	ldr	x1, [x28,3760]
-	add	x22, x0, :lo12:.LANCHOR0
+	ldr	x1, [x28, 3752]
 	adrp	x0, .LC140
 	add	x0, x0, :lo12:.LC140
-	ldrh	w3, [x22,2580]
 	bl	rknand_print_hex
 	mov	w0, 1
-	str	w0, [x28,424]
-	b	.L2488
-.L2487:
-	ldr	w0, [x6,1704]
+	str	w0, [x28, 424]
+.L2466:
+	add	x1, x20, :lo12:.LANCHOR2
+	ldr	x0, [x1, 704]
+	add	x0, x0, x21
+	str	wzr, [x0, 4]
+	ldr	x0, [x1, 704]
+	strh	w23, [x0, x21]
+	b	.L2459
+.L2465:
+	ldr	w0, [x6, 1712]
 	cmp	w0, 256
-	bne	.L2488
+	bne	.L2466
 	and	w24, w24, 65535
-	adrp	x0, .LC141
+	mov	w2, w3
 	mov	w1, w24
-	mov	w2, w25
+	adrp	x0, .LC141
 	add	x0, x0, :lo12:.LC141
 	bl	printk
-	ldr	x2, [x28,704]
-	add	x0, x28, 3800
+	ldr	x0, [x28, 704]
 	mov	w1, w24
-	add	x2, x2, x21
-	ldr	x2, [x2,8]
-	bl	FtlMapWritePage
-.L2488:
-	add	x1, x20, :lo12:.LANCHOR2
-	ldr	x0, [x1,704]
 	add	x0, x0, x21
-	str	wzr, [x0,4]
-	ldr	x0, [x1,704]
-	strh	w23, [x0,x21]
-	b	.L2481
-.L2480:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
-	ret
+	ldr	x2, [x0, 8]
+	add	x0, x28, 3792
+	bl	FtlMapWritePage
+	b	.L2466
 	.size	log2phys, .-log2phys
 	.align	2
 	.global	FtlWriteDumpData
@@ -16538,104 +16231,103 @@ log2phys:
 FtlWriteDumpData:
 	stp	x29, x30, [sp, -144]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	str	x25, [sp,64]
-	stp	x23, x24, [sp,48]
+	stp	x23, x24, [sp, 48]
 	add	x23, x19, :lo12:.LANCHOR2
-	stp	x21, x22, [sp,32]
-	ldr	w0, [x23,424]
-	cbnz	w0, .L2493
-	ldrh	w2, [x23,564]
-	cbz	w2, .L2495
-	ldrb	w1, [x23,568]
-	cbnz	w1, .L2495
+	stp	x21, x22, [sp, 32]
+	str	x25, [sp, 64]
+	ldr	w0, [x23, 424]
+	cbnz	w0, .L2471
+	ldrh	w2, [x23, 564]
+	cbz	w2, .L2473
+	ldrb	w1, [x23, 568]
+	cbnz	w1, .L2473
 	adrp	x21, .LANCHOR0
-	ldrb	w1, [x23,567]
 	add	x21, x21, :lo12:.LANCHOR0
-	ldrh	w3, [x21,2544]
+	ldrb	w1, [x23, 567]
+	ldrh	w3, [x21, 2544]
 	mul	w1, w1, w3
 	cmp	w2, w1
-	beq	.L2495
-	ldrb	w24, [x23,570]
-	ldr	w22, [x21,2616]
-	ldrh	w25, [x21,2472]
-	cbnz	w24, .L2493
-	sub	w22, w22, #1
+	beq	.L2473
+	ldrb	w0, [x23, 570]
+	cbnz	w0, .L2471
+	ldr	w22, [x21, 2616]
 	add	x1, x29, 84
+	ldrh	w24, [x21, 2472]
+	mov	w2, 0
+	sub	w22, w22, #1
 	mov	w0, w22
-	mov	w2, w24
 	bl	log2phys
-	ldr	x20, [x23,3664]
-	ldr	w0, [x29,84]
-	ldr	x1, [x23,3616]
-	str	w0, [x29,92]
+	ldr	x20, [x23, 3656]
+	ldr	w0, [x29, 84]
+	ldr	x1, [x23, 3608]
+	str	w0, [x29, 92]
 	cmn	w0, #1
-	str	w22, [x29,112]
-	str	x1, [x29,96]
-	str	x20, [x29,104]
-	str	w24, [x20,4]
-	beq	.L2497
-	add	x0, x29, 88
+	stp	x1, x20, [x29, 96]
+	str	w22, [x29, 112]
+	str	wzr, [x20, 4]
+	beq	.L2475
+	mov	w2, 0
 	mov	w1, 1
-	mov	w2, w24
+	add	x0, x29, 88
 	bl	FlashReadPages
-	b	.L2498
-.L2497:
-	ldr	x0, [x23,3616]
-	mov	w1, 255
-	ldrh	w2, [x21,2554]
-	bl	ftl_memset
-.L2498:
-	add	x24, x19, :lo12:.LANCHOR2
+.L2476:
+	add	x25, x19, :lo12:.LANCHOR2
+	lsl	w24, w24, 2
+	add	x21, x25, 560
 	mov	w0, -3947
-	lsl	w25, w25, 2
-	strh	w0, [x20]
 	mov	w23, 0
-	add	x21, x24, 560
-.L2499:
-	cmp	w23, w25
-	beq	.L2500
-	ldrh	w0, [x21,4]
-	cbz	w0, .L2500
-	ldr	w0, [x29,92]
+	strh	w0, [x20]
+.L2477:
+	cmp	w24, w23
+	bne	.L2481
+.L2478:
+	add	x19, x19, :lo12:.LANCHOR2
+	mov	w0, 1
+	strb	w0, [x19, 570]
+.L2471:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldr	x25, [sp, 64]
+	ldp	x29, x30, [sp], 144
+	ret
+.L2475:
+	ldrh	w2, [x21, 2554]
+	mov	w1, 255
+	ldr	x0, [x23, 3608]
+	bl	ftl_memset
+	b	.L2476
+.L2481:
+	ldrh	w0, [x21, 4]
+	cbz	w0, .L2478
+	ldr	w0, [x29, 92]
 	add	w23, w23, 1
-	str	w0, [x20,12]
+	stp	w22, w0, [x20, 8]
 	ldrh	w0, [x21]
-	strh	w0, [x20,2]
+	strh	w0, [x20, 2]
 	mov	x0, x21
-	str	w22, [x20,8]
 	bl	get_new_active_ppa
-	str	w0, [x29,92]
-	ldr	w1, [x24,756]
+	str	w0, [x29, 92]
+	ldr	w0, [x25, 756]
+	mov	w3, 0
+	str	w0, [x20, 4]
 	mov	w2, 0
-	str	w1, [x20,4]
-	mov	w3, w2
-	add	w1, w1, 1
-	add	x0, x29, 88
-	cmn	w1, #1
-	csel	w1, w1, wzr, ne
-	str	w1, [x24,756]
+	add	w0, w0, 1
 	mov	w1, 1
+	cmn	w0, #1
+	csel	w0, w0, wzr, ne
+	str	w0, [x25, 756]
+	add	x0, x29, 88
 	bl	FlashProgPages
 	ldrh	w0, [x21]
 	bl	decrement_vpc_count
-	b	.L2499
-.L2500:
-	add	x19, x19, :lo12:.LANCHOR2
-	mov	w0, 1
-	strb	w0, [x19,570]
-	b	.L2493
-.L2495:
+	b	.L2477
+.L2473:
 	add	x19, x19, :lo12:.LANCHOR2
-	strb	wzr, [x19,570]
-.L2493:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldr	x25, [sp,64]
-	ldp	x29, x30, [sp], 144
-	ret
+	strb	wzr, [x19, 570]
+	b	.L2471
 	.size	FtlWriteDumpData, .-FtlWriteDumpData
 	.align	2
 	.global	l2p_flush
@@ -16643,35 +16335,35 @@ FtlWriteDumpData:
 l2p_flush:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	str	x21, [sp,32]
-	mov	w19, 0
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR0
+	str	x21, [sp, 32]
+	add	x20, x20, :lo12:.LANCHOR0
 	adrp	x21, .LANCHOR2
+	add	x21, x21, :lo12:.LANCHOR2
+	mov	w19, 0
 	bl	FtlWriteDumpData
-.L2511:
-	add	x0, x20, :lo12:.LANCHOR0
-	ldrh	w0, [x0,2582]
+.L2490:
+	ldrh	w0, [x20, 2582]
 	cmp	w0, w19
-	bls	.L2514
-	add	x1, x21, :lo12:.LANCHOR2
+	bhi	.L2492
+	mov	w0, 0
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 48
+	ret
+.L2492:
+	ldr	x1, [x21, 704]
 	ubfiz	x0, x19, 4, 16
-	ldr	x1, [x1,704]
 	add	x0, x1, x0
-	ldr	w0, [x0,4]
-	tbz	w0, #31, .L2512
+	ldr	w0, [x0, 4]
+	tbz	w0, #31, .L2491
 	mov	w0, w19
 	bl	flush_l2p_region
-.L2512:
+.L2491:
 	add	w19, w19, 1
-	uxth	w19, w19
-	b	.L2511
-.L2514:
-	mov	w0, 0
-	ldr	x21, [sp,32]
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 48
-	ret
+	and	w19, w19, 65535
+	b	.L2490
 	.size	l2p_flush, .-l2p_flush
 	.align	2
 	.global	allocate_new_data_superblock
@@ -16679,330 +16371,315 @@ l2p_flush:
 allocate_new_data_superblock:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	str	x21, [sp,32]
 	add	x2, x19, :lo12:.LANCHOR2
+	str	x21, [sp, 32]
+	ldr	w1, [x2, 424]
+	cbnz	w1, .L2495
 	ldrh	w20, [x0]
-	ldr	w1, [x2,424]
-	cbnz	w1, .L2516
 	mov	x21, x0
 	mov	w0, 65535
 	cmp	w20, w0
-	beq	.L2517
+	beq	.L2496
+	ldr	x0, [x2, 520]
 	ubfiz	x1, x20, 1, 16
-	ldr	x0, [x2,520]
-	ldrh	w0, [x0,x1]
-	cbz	w0, .L2518
+	ldrh	w0, [x0, x1]
+	cbz	w0, .L2497
 	mov	w0, w20
 	bl	INSERT_DATA_LIST
-	b	.L2517
-.L2518:
-	mov	w0, w20
-	bl	INSERT_FREE_LIST
-.L2517:
+.L2496:
 	add	x2, x19, :lo12:.LANCHOR2
-	strb	wzr, [x21,8]
+	strb	wzr, [x21, 8]
 	add	x0, x2, 608
 	cmp	x21, x0
-	beq	.L2519
+	beq	.L2498
 	adrp	x1, .LANCHOR0
 	add	x4, x1, :lo12:.LANCHOR0
-	ldrh	w3, [x4,2492]
+	ldrh	w3, [x4, 2492]
 	cmp	w3, 1
-	beq	.L2519
-	ldrb	w0, [x4,204]
-	cbz	w0, .L2520
-.L2519:
+	beq	.L2498
+	ldrb	w0, [x4, 204]
+	cbz	w0, .L2499
+.L2498:
 	mov	w0, 1
-	strb	w0, [x21,8]
-	b	.L2521
-.L2520:
-	add	x0, x2, 560
-	cmp	x21, x0
-	bne	.L2521
-	cmp	w3, 3
-	beq	.L2523
-	ldr	w0, [x2,848]
-	cmp	w0, 1
-	bne	.L2524
-.L2523:
+	strb	w0, [x21, 8]
+.L2500:
 	add	x2, x19, :lo12:.LANCHOR2
-	mov	w0, 1
-	strb	w0, [x2,568]
-.L2524:
-	add	x1, x1, :lo12:.LANCHOR0
-	ldr	w0, [x1,2372]
-	cbz	w0, .L2521
-	add	x1, x19, :lo12:.LANCHOR2
-	ldr	w0, [x1,776]
-	cmp	w0, 39
-	bhi	.L2521
-	mov	w0, 1
-	strb	w0, [x1,568]
-.L2521:
-	add	x3, x19, :lo12:.LANCHOR2
-	mov	w0, 65535
-	ldrh	w1, [x3,3880]
-	cmp	w1, w0
-	beq	.L2526
-	cmp	w20, w1
-	bne	.L2527
-	ubfiz	x2, x1, 1, 16
-	ldr	x0, [x3,520]
-	ldrh	w0, [x0,x2]
-	cbz	w0, .L2528
-.L2527:
-	mov	w0, w1
+	mov	w1, 65535
+	ldrh	w0, [x2, 3872]
+	cmp	w0, w1
+	beq	.L2505
+	cmp	w20, w0
+	bne	.L2506
+	ldr	x2, [x2, 520]
+	ubfiz	x1, x0, 1, 16
+	ldrh	w1, [x2, x1]
+	cbz	w1, .L2507
+.L2506:
 	bl	update_vpc_list
-.L2528:
+.L2507:
 	add	x19, x19, :lo12:.LANCHOR2
 	mov	w0, -1
-	strh	w0, [x19,3880]
-.L2526:
+	strh	w0, [x19, 3872]
+.L2505:
 	mov	x0, x21
 	bl	allocate_data_superblock
 	bl	l2p_flush
 	mov	w0, 0
 	bl	FtlEctTblFlush
 	bl	FtlVpcTblFlush
-.L2516:
+.L2495:
 	mov	w0, 0
-	ldr	x21, [sp,32]
-	ldp	x19, x20, [sp,16]
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
+.L2497:
+	mov	w0, w20
+	bl	INSERT_FREE_LIST
+	b	.L2496
+.L2499:
+	add	x0, x2, 560
+	cmp	x21, x0
+	bne	.L2500
+	cmp	w3, 3
+	beq	.L2502
+	ldr	w0, [x2, 1360]
+	cmp	w0, 1
+	bne	.L2503
+.L2502:
+	add	x2, x19, :lo12:.LANCHOR2
+	mov	w0, 1
+	strb	w0, [x2, 568]
+.L2503:
+	add	x1, x1, :lo12:.LANCHOR0
+	ldr	w0, [x1, 2372]
+	cbz	w0, .L2500
+	add	x1, x19, :lo12:.LANCHOR2
+	ldr	w0, [x1, 776]
+	cmp	w0, 39
+	bhi	.L2500
+	mov	w0, 1
+	strb	w0, [x1, 568]
+	b	.L2500
 	.size	allocate_new_data_superblock, .-allocate_new_data_superblock
 	.align	2
 	.global	FtlCheckVpc
 	.type	FtlCheckVpc, %function
 FtlCheckVpc:
-	stp	x29, x30, [sp, -128]!
+	stp	x29, x30, [sp, -112]!
 	adrp	x1, .LANCHOR3
-	adrp	x0, .LC109
 	add	x1, x1, :lo12:.LANCHOR3
+	adrp	x0, .LC109
 	add	x29, sp, 0
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR0
+	stp	x23, x24, [sp, 48]
+	add	x23, x19, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	mov	w22, 0
 	add	x1, x1, 216
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
 	add	x0, x0, :lo12:.LC109
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR4
-	mov	w19, 0
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	add	x21, x20, :lo12:.LANCHOR4
+	adrp	x21, check_valid_page_count_table
 	bl	printk
-	add	x0, x21, 1840
-	mov	w1, 0
+	add	x20, x21, :lo12:check_valid_page_count_table
 	mov	x2, 8192
-	adrp	x22, .LANCHOR0
+	mov	w1, 0
+	mov	x0, x20
 	bl	memset
-.L2542:
-	add	x0, x22, :lo12:.LANCHOR0
-	adrp	x26, .LANCHOR0
-	ldr	w0, [x0,2616]
-	cmp	w19, w0
-	bcs	.L2561
-	mov	w0, w19
-	add	x1, x29, 124
+.L2522:
+	ldr	w0, [x23, 2616]
+	cmp	w22, w0
+	bcc	.L2524
+	add	x22, x19, :lo12:.LANCHOR0
+	adrp	x23, .LC142
+	adrp	x19, .LANCHOR2
+	add	x26, x21, :lo12:check_valid_page_count_table
+	add	x25, x19, :lo12:.LANCHOR2
+	add	x23, x23, :lo12:.LC142
+	mov	w24, 0
+	mov	w20, 0
+.L2525:
+	ldrh	w0, [x22, 2480]
+	cmp	w0, w20
+	bhi	.L2527
+	add	x0, x19, :lo12:.LANCHOR2
+	ldr	x19, [x0, 544]
+	cbz	x19, .L2528
+	ldr	x1, [x0, 504]
+	adrp	x23, .LC143
+	ldrh	w25, [x0, 552]
+	mov	x20, x0
+	sub	x19, x19, x1
+	mov	x1, -6148914691236517206
+	asr	x19, x19, 1
+	movk	x1, 0xaaab, lsl 0
+	add	x21, x21, :lo12:check_valid_page_count_table
+	add	x23, x23, :lo12:.LC143
+	mov	w22, 0
+	mov	w26, 6
+	mul	x19, x19, x1
+	and	w19, w19, 65535
+.L2529:
+	cmp	w22, w25
+	bne	.L2531
+.L2528:
+	mov	w1, w24
+	adrp	x0, .LC144
+	add	x0, x0, :lo12:.LC144
+	bl	printk
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L2524:
 	mov	w2, 0
+	add	x1, x29, 108
+	mov	w0, w22
 	bl	log2phys
-	ldr	w0, [x29,124]
+	ldr	w0, [x29, 108]
 	cmn	w0, #1
-	beq	.L2543
+	beq	.L2523
 	lsr	w0, w0, 10
 	bl	P2V_block_in_plane
-	uxth	w0, w0
-	add	x2, x21, 1840
-	ldrh	w1, [x2,w0,sxtw 1]
+	and	x0, x0, 65535
+	ldrh	w1, [x20, x0, lsl 1]
 	add	w1, w1, 1
-	strh	w1, [x2,w0,sxtw 1]
-.L2543:
-	add	w19, w19, 1
-	b	.L2542
-.L2561:
-	mov	w21, 0
-	adrp	x22, .LC142
-	mov	w19, w21
-	adrp	x27, .LANCHOR2
-	add	x28, x20, :lo12:.LANCHOR4
-	add	x22, x22, :lo12:.LC142
-	mov	w4, 65535
-.L2545:
-	add	x0, x26, :lo12:.LANCHOR0
-	adrp	x23, .LANCHOR2
-	ldrh	w0, [x0,2480]
-	cmp	w0, w19
-	bls	.L2562
-	add	x25, x27, :lo12:.LANCHOR2
-	ubfiz	x24, x19, 1, 16
-	add	x23, x28, 1840
-	sxtw	x5, w19
-	ldr	x0, [x25,520]
-	ldrh	w3, [x23,w19,sxtw 1]
-	ldrh	w2, [x0,x24]
+	strh	w1, [x20, x0, lsl 1]
+.L2523:
+	add	w22, w22, 1
+	b	.L2522
+.L2527:
+	ldr	x0, [x25, 520]
+	ubfiz	x28, x20, 1, 16
+	sxtw	x27, w20
+	ldrh	w2, [x0, x28]
+	ldrh	w3, [x26, x27, lsl 1]
 	cmp	w2, w3
-	beq	.L2546
-	mov	x0, x22
-	mov	w1, w19
-	str	x4, [x29,96]
-	str	x5, [x29,104]
+	beq	.L2526
+	mov	w1, w20
+	mov	x0, x23
 	bl	printk
-	ldr	x0, [x25,520]
-	ldr	x4, [x29,96]
-	ldrh	w0, [x0,x24]
-	cmp	w0, w4
-	beq	.L2546
-	ldr	x5, [x29,104]
-	ldrh	w1, [x23,x5,lsl 1]
+	ldr	x0, [x25, 520]
+	mov	w1, 65535
+	ldrh	w0, [x0, x28]
+	cmp	w0, w1
+	beq	.L2526
+	ldrh	w1, [x26, x27, lsl 1]
 	cmp	w1, w0
-	csinc	w21, w21, wzr, ls
-.L2546:
-	add	w19, w19, 1
-	uxth	w19, w19
-	b	.L2545
-.L2562:
-	add	x1, x23, :lo12:.LANCHOR2
-	ldr	x0, [x1,544]
-	cbz	x0, .L2548
-	ldr	x19, [x1,504]
-	adrp	x24, .LC143
-	ldrh	w25, [x1,552]
-	mov	w22, 0
-	sub	x19, x0, x19
-	mov	x0, -6148914691236517206
-	asr	x19, x19, 1
-	add	x24, x24, :lo12:.LC143
-	add	x20, x20, :lo12:.LANCHOR4
-	mov	w26, 6
-	madd	x19, x0, x19, x19
-	mov	w27, 65535
-	uxth	w19, w19
-.L2549:
-	cmp	w22, w25
-	beq	.L2548
-	add	x1, x23, :lo12:.LANCHOR2
+	csinc	w24, w24, wzr, ls
+.L2526:
+	add	w20, w20, 1
+	and	w20, w20, 65535
+	b	.L2525
+.L2531:
+	ldr	x1, [x20, 520]
 	ubfiz	x0, x19, 1, 16
-	ldr	x1, [x1,520]
-	ldrh	w2, [x1,x0]
-	cbz	w2, .L2550
-	add	x3, x20, 1840
-	mov	x0, x24
+	ldrh	w2, [x1, x0]
+	cbz	w2, .L2530
+	ldrh	w3, [x21, w19, sxtw 1]
+	mov	w24, 1
 	mov	w1, w19
-	mov	w21, 1
-	ldrh	w3, [x3,w19,sxtw 1]
+	mov	x0, x23
 	bl	printk
-.L2550:
-	add	x0, x23, :lo12:.LANCHOR2
+.L2530:
+	ldr	x0, [x20, 504]
 	umull	x19, w19, w26
-	ldr	x0, [x0,504]
-	ldrh	w19, [x0,x19]
-	cmp	w19, w27
-	beq	.L2548
+	ldrh	w19, [x0, x19]
+	mov	w0, 65535
+	cmp	w19, w0
+	beq	.L2528
 	add	w22, w22, 1
-	uxth	w22, w22
-	b	.L2549
-.L2548:
-	adrp	x0, .LC144
-	mov	w1, w21
-	add	x0, x0, :lo12:.LC144
-	bl	printk
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
-	ret
+	and	w22, w22, 65535
+	b	.L2529
 	.size	FtlCheckVpc, .-FtlCheckVpc
 	.align	2
 	.global	Ftlscanalldata
 	.type	Ftlscanalldata, %function
 Ftlscanalldata:
-	sub	sp, sp, #80
+	sub	sp, sp, #96
 	adrp	x0, .LC145
-	add	x0, x0, :lo12:.LC145
 	mov	w1, 0
-	stp	x29, x30, [sp,16]
+	add	x0, x0, :lo12:.LC145
+	stp	x29, x30, [sp, 16]
 	add	x29, sp, 16
-	stp	x19, x20, [sp,32]
-	adrp	x19, .LANCHOR4
-	mov	w20, 0
-	stp	x21, x22, [sp,48]
-	add	x19, x19, :lo12:.LANCHOR4
-	adrp	x21, .LC146
-	add	x21, x21, :lo12:.LC146
-	add	x19, x19, 1704
+	stp	x19, x20, [sp, 32]
+	mov	w19, 0
+	stp	x21, x22, [sp, 48]
+	adrp	x22, .LANCHOR4
+	add	x20, x22, :lo12:.LANCHOR4
+	adrp	x21, .LANCHOR0
+	add	x20, x20, 1712
+	add	x21, x21, :lo12:.LANCHOR0
+	str	x23, [sp, 64]
 	bl	printk
-.L2564:
-	adrp	x0, .LANCHOR0+2616
-	ldr	w0, [x0,#:lo12:.LANCHOR0+2616]
-	cmp	w20, w0
-	bcs	.L2571
-	mov	w0, w20
-	add	x1, x29, 60
+.L2543:
+	ldr	w0, [x21, 2616]
+	cmp	w19, w0
+	bcc	.L2549
+	ldp	x19, x20, [sp, 32]
+	ldp	x21, x22, [sp, 48]
+	ldp	x29, x30, [sp, 16]
+	ldr	x23, [sp, 64]
+	add	sp, sp, 96
+	ret
+.L2549:
 	mov	w2, 0
+	add	x1, x29, 76
+	mov	w0, w19
 	bl	log2phys
-	and	w0, w20, 2047
-	cbnz	w0, .L2565
-	ldr	w2, [x29,60]
-	mov	x0, x21
-	mov	w1, w20
+	tst	x19, 2047
+	bne	.L2544
+	ldr	w2, [x29, 76]
+	adrp	x0, .LC146
+	mov	w1, w19
+	add	x0, x0, :lo12:.LC146
 	bl	printk
-.L2565:
-	ldr	w0, [x29,60]
+.L2544:
+	ldr	w0, [x29, 76]
 	cmn	w0, #1
-	beq	.L2567
-	adrp	x1, .LANCHOR2
-	str	w0, [x19,4]
-	add	x1, x1, :lo12:.LANCHOR2
+	beq	.L2546
+	stp	wzr, w0, [x20]
+	adrp	x0, .LANCHOR2
+	add	x0, x0, :lo12:.LANCHOR2
 	mov	w2, 0
-	str	w20, [x19,24]
-	str	wzr, [x19]
-	ldr	x0, [x1,3616]
-	ldr	x22, [x1,3664]
+	str	w19, [x20, 24]
+	ldr	x1, [x0, 3608]
+	ldr	x23, [x0, 3656]
+	mov	x0, x20
+	stp	x1, x23, [x20, 8]
 	mov	w1, 1
-	str	x0, [x19,8]
-	mov	x0, x19
-	str	x22, [x19,16]
 	bl	FlashReadPages
-	ldr	w0, [x19]
-	cmn	w0, #1
-	beq	.L2568
+	ldr	w0, [x20]
 	cmp	w0, 256
-	beq	.L2568
-	ldr	w0, [x22,8]
-	cmp	w0, w20
-	beq	.L2567
-.L2568:
-	adrp	x2, .LANCHOR4
-	mov	w1, w20
-	add	x2, x2, :lo12:.LANCHOR4
-	add	x2, x2, 1704
-	ldr	x7, [x2,8]
-	ldr	x6, [x2,16]
-	ldr	w0, [x7,4]
-	str	w0, [sp]
+	ccmn	w0, #1, 4, ne
+	beq	.L2547
+	ldr	w0, [x23, 8]
+	cmp	w19, w0
+	beq	.L2546
+.L2547:
+	add	x0, x22, :lo12:.LANCHOR4
+	ldr	x2, [x0, 1720]
+	ldr	x1, [x0, 1728]
+	ldr	w3, [x2, 4]
+	str	w3, [sp]
+	ldp	w3, w4, [x1]
+	ldp	w5, w6, [x1, 8]
+	mov	w1, w19
+	ldr	w7, [x2]
+	ldr	w2, [x0, 1716]
 	adrp	x0, .LC147
 	add	x0, x0, :lo12:.LC147
-	ldr	w3, [x6]
-	ldr	w4, [x6,4]
-	ldr	w5, [x6,8]
-	ldr	w2, [x2,4]
-	ldr	w6, [x6,12]
-	ldr	w7, [x7]
 	bl	printk
-.L2567:
-	add	w20, w20, 1
-	b	.L2564
-.L2571:
-	sub	sp, x29, #16
-	ldp	x19, x20, [sp,32]
-	ldp	x21, x22, [sp,48]
-	ldp	x29, x30, [sp,16]
-	add	sp, sp, 80
-	ret
+.L2546:
+	add	w19, w19, 1
+	b	.L2543
 	.size	Ftlscanalldata, .-Ftlscanalldata
 	.align	2
 	.global	FtlReUsePrevPpa
@@ -17010,827 +16687,793 @@ Ftlscanalldata:
 FtlReUsePrevPpa:
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	mov	w20, w0
-	lsr	x0, x1, 10
-	stp	x21, x22, [sp,32]
-	str	w1, [x29,60]
-	adrp	x21, .LANCHOR2
+	stp	x19, x20, [sp, 16]
+	mov	w19, w0
+	str	x21, [sp, 32]
+	lsr	w0, w1, 10
+	str	w1, [x29, 60]
 	bl	P2V_block_in_plane
-	uxth	w0, w0
-	add	x2, x21, :lo12:.LANCHOR2
-	ubfiz	x22, x0, 1, 16
-	ldr	x3, [x2,520]
-	ldrh	w1, [x3,x22]
-	cbnz	w1, .L2573
-	ldr	x19, [x2,544]
-	cbz	x19, .L2574
-	ldrh	w3, [x2,552]
+	adrp	x20, .LANCHOR2
+	add	x2, x20, :lo12:.LANCHOR2
+	and	w0, w0, 65535
+	ubfiz	x21, x0, 1, 16
+	ldr	x3, [x2, 520]
+	ldrh	w1, [x3, x21]
+	cbnz	w1, .L2552
+	ldr	x8, [x2, 544]
+	cbz	x8, .L2553
+	ldrh	w3, [x2, 552]
 	mov	x4, -6148914691236517206
-	ldr	x2, [x2,504]
+	ldr	x2, [x2, 504]
+	movk	x4, 0xaaab, lsl 0
 	mov	w5, 65535
-	sub	x19, x19, x2
-	asr	x19, x19, 1
-	madd	x19, x4, x19, x19
+	sub	x8, x8, x2
+	asr	x8, x8, 1
+	mul	x8, x8, x4
 	mov	w4, 6
-	uxth	w19, w19
-.L2575:
+	and	w8, w8, 65535
+.L2554:
 	cmp	w1, w3
-	beq	.L2574
-	cmp	w19, w0
-	bne	.L2576
-	add	x21, x21, :lo12:.LANCHOR2
-	mov	w1, w19
-	add	x0, x21, 544
+	beq	.L2553
+	cmp	w8, w0
+	bne	.L2555
+	add	x20, x20, :lo12:.LANCHOR2
+	mov	w1, w8
+	add	x0, x20, 544
 	bl	List_remove_node
-	ldrh	w0, [x21,552]
+	ldrh	w0, [x20, 552]
 	sub	w0, w0, #1
-	strh	w0, [x21,552]
-	mov	w0, w19
+	strh	w0, [x20, 552]
+	mov	w0, w8
 	bl	INSERT_DATA_LIST
-	ldr	x1, [x21,520]
-	ldrh	w0, [x1,x22]
+	ldr	x1, [x20, 520]
+	ldrh	w0, [x1, x21]
 	add	w0, w0, 1
-	strh	w0, [x1,x22]
-	b	.L2574
-.L2576:
-	umull	x19, w19, w4
-	ldrh	w19, [x2,x19]
-	cmp	w19, w5
-	beq	.L2574
-	add	w1, w1, 1
-	uxth	w1, w1
-	b	.L2575
-.L2573:
-	add	w1, w1, 1
-	strh	w1, [x3,x22]
-.L2574:
+	strh	w0, [x1, x21]
+.L2553:
 	add	x1, x29, 60
-	mov	w0, w20
 	mov	w2, 1
+	mov	w0, w19
 	bl	log2phys
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 64
 	ret
+.L2555:
+	umull	x8, w8, w4
+	ldrh	w8, [x2, x8]
+	cmp	w8, w5
+	beq	.L2553
+	add	w1, w1, 1
+	and	w1, w1, 65535
+	b	.L2554
+.L2552:
+	add	w1, w1, 1
+	strh	w1, [x3, x21]
+	b	.L2553
 	.size	FtlReUsePrevPpa, .-FtlReUsePrevPpa
 	.align	2
 	.global	FtlRecoverySuperblock
 	.type	FtlRecoverySuperblock, %function
 FtlRecoverySuperblock:
-	stp	x29, x30, [sp, -208]!
+	stp	x29, x30, [sp, -192]!
 	mov	w2, 65535
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	mov	x19, x0
+	stp	x19, x20, [sp, 16]
+	mov	x20, x0
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
 	ldrh	w0, [x0]
 	cmp	w0, w2
-	beq	.L2742
-	ldrh	w0, [x19,2]
+	beq	.L2707
 	adrp	x23, .LANCHOR0
-	str	w0, [x29,188]
-	ldrb	w0, [x19,6]
-	str	w0, [x29,176]
 	add	x0, x23, :lo12:.LANCHOR0
-	ldr	w1, [x29,188]
-	ldrh	w0, [x0,2544]
-	cmp	w0, w1
-	bne	.L2584
-	strh	wzr, [x19,4]
-	b	.L2748
-.L2584:
-	ldrh	w0, [x19,16]
+	ldrh	w28, [x20, 2]
+	ldrh	w0, [x0, 2544]
+	cmp	w0, w28
+	bne	.L2564
+	strh	wzr, [x20, 4]
+.L2714:
+	strb	wzr, [x20, 6]
+.L2707:
+	ldp	x19, x20, [sp, 16]
+	mov	w0, 0
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 192
+	ret
+.L2564:
+	ldrh	w0, [x20, 16]
 	mov	w1, 0
-.L2585:
+.L2565:
 	cmp	w0, w2
-	bne	.L2751
-	add	w1, w1, 1
-	uxth	w1, w1
-	add	x0, x19, w1, sxtw 1
-	ldrh	w0, [x0,16]
-	b	.L2585
-.L2751:
-	ldrb	w1, [x19,8]
+	beq	.L2566
+	ldrb	w1, [x20, 6]
+	str	w1, [x29, 152]
+	ldrb	w1, [x20, 8]
 	cmp	w1, 1
-	bne	.L2587
+	bne	.L2567
 	bl	FtlGetLastWrittenPage
+	mov	w21, w0
 	cmn	w0, #1
-	mov	w20, w0
-	beq	.L2588
+	beq	.L2568
 	add	x0, x23, :lo12:.LANCHOR0
-	mov	w24, w20
-	ldrb	w1, [x0,204]
-	cbnz	w1, .L2662
+	ldrb	w1, [x0, 204]
+	cbnz	w1, .L2640
 	add	x0, x0, 208
-	ldrh	w24, [x0,w20,sxtw 1]
-	b	.L2662
-.L2587:
-	mov	w1, 0
-	bl	FtlGetLastWrittenPage
-	cmn	w0, #1
-	mov	w20, w0
-	beq	.L2588
-	mov	w24, w0
-.L2662:
+	ldrh	w24, [x0, w21, sxtw 1]
+.L2569:
 	add	x0, x23, :lo12:.LANCHOR0
-	mov	x2, x19
+	add	x1, x20, 16
+	mov	x4, x1
+	str	x1, [x29, 168]
+	adrp	x1, .LANCHOR2
+	add	x1, x1, :lo12:.LANCHOR2
+	ldrh	w8, [x0, 2556]
 	mov	w26, 0
-	mov	w8, 65535
-	mov	w9, 56
-	adrp	x10, .LANCHOR2
-	ldrh	w4, [x0,2472]
+	ldrh	w0, [x0, 2472]
+	mov	w9, 65535
+	mov	w10, 56
 	mov	w11, 4
-	ldrh	w7, [x0,2556]
-	add	x4, x19, x4, lsl 1
-	b	.L2590
-.L2588:
-	strh	wzr, [x19,2]
-.L2748:
-	strb	wzr, [x19,6]
-	b	.L2742
-.L2592:
-	ldrh	w1, [x2,16]
-	cmp	w1, w8
-	beq	.L2591
-	add	x5, x10, :lo12:.LANCHOR2
-	orr	w1, w24, w1, lsl 10
-	umull	x0, w26, w9
-	add	w3, w26, 1
-	ldr	x6, [x5,3592]
-	add	x6, x6, x0
-	str	w1, [x6,4]
-	ldr	x1, [x5,3592]
-	ldr	x5, [x5,1408]
-	add	x0, x1, x0
-	mul	w1, w26, w7
-	uxth	w26, w3
-	str	xzr, [x0,8]
-	sdiv	w1, w1, w11
-	add	x1, x5, w1, sxtw 2
-	str	x1, [x0,16]
-.L2591:
-	add	x2, x2, 2
-.L2590:
-	cmp	x2, x4
-	bne	.L2592
-	ldrb	w0, [x19,8]
-	str	wzr, [x29,184]
+	add	x0, x0, 8
+	add	x0, x20, x0, lsl 1
+.L2570:
+	cmp	x4, x0
+	bne	.L2572
+	ldrb	w0, [x20, 8]
 	cmp	w0, 1
-	bne	.L2593
+	bne	.L2641
 	add	x0, x23, :lo12:.LANCHOR0
-	ldrb	w0, [x0,204]
-	cmp	w0, wzr
+	ldrb	w0, [x0, 204]
+	cmp	w0, 0
 	cset	w0, ne
-	str	w0, [x29,184]
-.L2593:
-	adrp	x21, .LANCHOR2
-	ldr	w2, [x29,184]
-	add	x22, x21, :lo12:.LANCHOR2
+	str	w0, [x29, 164]
+.L2573:
+	adrp	x19, .LANCHOR2
+	add	x25, x19, :lo12:.LANCHOR2
+	ldr	w2, [x29, 164]
 	mov	w1, w26
 	mov	x27, 0
-	mov	w25, 65535
-	mov	x28, 56
-	ldr	x0, [x22,3592]
+	ldr	x0, [x25, 3584]
 	bl	FlashReadPages
-	ldr	w0, [x22,756]
-	adrp	x22, .LC148
-	str	w0, [x29,168]
-	add	x22, x22, :lo12:.LC148
-	uxth	w0, w24
-	str	w0, [x29,160]
-.L2594:
-	uxth	w2, w27
-	cmp	w2, w26
-	bcs	.L2601
-	add	x6, x21, :lo12:.LANCHOR2
-	mul	x0, x27, x28
-	ldr	x4, [x6,3592]
+	ldr	w22, [x25, 756]
+	adrp	x0, .LC148
+	add	x0, x0, :lo12:.LC148
+	sub	w22, w22, #1
+	str	x0, [x29, 144]
+	mov	w5, 65535
+	adrp	x0, .LANCHOR4
+	add	x0, x0, :lo12:.LANCHOR4
+	str	x0, [x29, 136]
+.L2574:
+	and	w0, w27, 65535
+	cmp	w26, w0
+	bhi	.L2579
+	bne	.L2577
+	add	x0, x19, :lo12:.LANCHOR2
+	add	w21, w21, 1
+	and	w21, w21, 65535
+	ldr	x0, [x0, 3584]
+	ldr	w0, [x0, 4]
+.L2709:
+	lsr	w0, w0, 10
+	bl	P2V_plane
+	ldrb	w1, [x20, 8]
+	and	w27, w0, 65535
+	cmp	w1, 1
+	bne	.L2581
+	add	x0, x23, :lo12:.LANCHOR0
+	ldrb	w2, [x0, 204]
+	cbnz	w2, .L2581
+	add	x0, x0, 208
+	ldrh	w21, [x0, w21, sxtw 1]
+.L2581:
+	add	x0, x23, :lo12:.LANCHOR0
+	ldrh	w0, [x0, 2544]
+	cmp	w0, w21
+	bne	.L2582
+	strh	w21, [x20, 2]
+	strb	wzr, [x20, 6]
+	strh	wzr, [x20, 4]
+.L2582:
+	ldrh	w0, [x29, 152]
+	cmp	w21, w28
+	str	w0, [x29, 144]
+	ccmp	w27, w0, 0, eq
+	bne	.L2583
+.L2715:
+	mov	w2, w27
+	mov	w1, w21
+	mov	x0, x20
+	bl	ftl_sb_update_avl_pages
+	b	.L2707
+.L2566:
+	add	w1, w1, 1
+	and	w1, w1, 65535
+	add	x0, x20, w1, sxtw 1
+	ldrh	w0, [x0, 16]
+	b	.L2565
+.L2567:
+	mov	w1, 0
+	bl	FtlGetLastWrittenPage
+	mov	w21, w0
+	cmn	w0, #1
+	beq	.L2568
+.L2640:
+	mov	w24, w21
+	b	.L2569
+.L2568:
+	strh	wzr, [x20, 2]
+	b	.L2714
+.L2572:
+	ldrh	w2, [x4]
+	cmp	w2, w9
+	beq	.L2571
+	umull	x7, w26, w10
+	ldr	x6, [x1, 3584]
+	orr	w2, w24, w2, lsl 10
+	add	w3, w26, 1
+	add	x6, x6, x7
+	str	w2, [x6, 4]
+	mul	w2, w26, w8
+	and	w26, w3, 65535
+	ldr	x5, [x1, 3584]
+	ldr	x6, [x1, 1400]
+	sdiv	w2, w2, w11
+	add	x5, x5, x7
+	add	x2, x6, w2, sxtw 2
+	stp	xzr, x2, [x5, 8]
+.L2571:
+	add	x4, x4, 2
+	b	.L2570
+.L2641:
+	str	wzr, [x29, 164]
+	b	.L2573
+.L2579:
+	mov	x0, 56
+	ldr	x4, [x25, 3584]
+	mul	x0, x27, x0
 	add	x1, x4, x0
-	ldr	w0, [x4,x0]
-	cbnz	w0, .L2595
-	ldr	x7, [x1,16]
-	ldr	w4, [x7,4]
+	ldr	w0, [x4, x0]
+	cbnz	w0, .L2575
+	ldr	x6, [x1, 16]
+	ldr	w4, [x6, 4]
 	cmn	w4, #1
-	beq	.L2596
-	ldr	w1, [x6,756]
+	beq	.L2576
+	ldr	w1, [x25, 756]
 	mov	w0, w4
-	str	x7, [x29,128]
-	str	x2, [x29,136]
-	str	x4, [x29,144]
-	str	x6, [x29,152]
 	bl	ftl_cmp_data_ver
-	ldr	x6, [x29,152]
-	ldr	x4, [x29,144]
-	ldr	x2, [x29,136]
-	ldr	x7, [x29,128]
-	cbz	w0, .L2596
+	cbz	w0, .L2576
 	add	w4, w4, 1
-	str	w4, [x6,756]
-.L2596:
-	ldr	w0, [x7]
+	str	w4, [x25, 756]
+.L2576:
+	ldr	w0, [x6]
 	cmn	w0, #1
-	bne	.L2597
-.L2601:
-	cmp	w2, w26
-	bne	.L2743
-	add	x0, x21, :lo12:.LANCHOR2
-	add	w20, w20, 1
-	uxth	w20, w20
-	ldr	x0, [x0,3592]
-	ldr	w0, [x0,4]
-	b	.L2744
-.L2595:
-	ldr	w1, [x1,4]
-	mov	x0, x22
+	bne	.L2578
+.L2577:
+	add	x0, x19, :lo12:.LANCHOR2
+	and	x27, x27, 65535
+	mov	x1, 56
+	and	w21, w21, 65535
+	ldr	x0, [x0, 3584]
+	madd	x27, x27, x1, x0
+	ldr	w0, [x27, 4]
+	b	.L2709
+.L2575:
+	ldr	w1, [x1, 4]
+	ldr	x0, [x29, 144]
 	bl	printk
-	ldr	w25, [x29,160]
-	adrp	x0, .LANCHOR5
-	ldrh	w1, [x19]
-	add	x0, x0, :lo12:.LANCHOR5
-	strh	w1, [x0,1328]
-.L2597:
+	ldr	x1, [x29, 136]
+	and	w5, w24, 65535
+	ldrh	w0, [x20]
+	strh	w0, [x1, 1842]
+.L2578:
 	add	x27, x27, 1
-	b	.L2594
-.L2743:
-	add	x0, x21, :lo12:.LANCHOR2
-	mov	w1, 56
-	uxth	w20, w20
-	umull	x2, w2, w1
-	ldr	x0, [x0,3592]
-	add	x2, x0, x2
-	ldr	w0, [x2,4]
-.L2744:
-	lsr	x0, x0, 10
-	bl	P2V_plane
-	uxth	w26, w0
-	ldrb	w1, [x19,8]
-	cmp	w1, 1
-	bne	.L2603
-	add	x0, x23, :lo12:.LANCHOR0
-	ldrb	w2, [x0,204]
-	cbnz	w2, .L2603
-	add	x0, x0, 208
-	ldrh	w20, [x0,w20,sxtw 1]
-.L2603:
-	add	x0, x23, :lo12:.LANCHOR0
-	ldrh	w0, [x0,2544]
-	cmp	w0, w20
-	bne	.L2604
-	strh	w20, [x19,2]
-	strb	wzr, [x19,6]
-	strh	wzr, [x19,4]
-.L2604:
-	ldrh	w0, [x29,176]
-	str	w0, [x29,152]
-	ldr	w0, [x29,188]
-	cmp	w20, w0
-	bne	.L2605
-	ldr	w0, [x29,152]
-	cmp	w26, w0
-	beq	.L2749
-.L2605:
-	ldr	w0, [x29,168]
-	sub	w22, w0, #1
+	b	.L2574
+.L2583:
 	mov	w0, 65535
-	cmp	w25, w0
-	bne	.L2606
-	cbnz	w1, .L2607
-.L2606:
-	add	x0, x21, :lo12:.LANCHOR2
-	uxth	w5, w24
-	ldr	w1, [x0,3892]
+	cmp	w5, w0
+	bne	.L2584
+	cbnz	w1, .L2585
+.L2584:
+	add	x0, x19, :lo12:.LANCHOR2
+	and	w6, w24, 65535
+	ldr	w1, [x0, 3884]
 	cmn	w1, #1
-	bne	.L2608
-	str	w22, [x0,3892]
-.L2608:
-	add	x0, x21, :lo12:.LANCHOR2
-	ldr	w25, [x29,188]
-	ldr	w6, [x0,3892]
-	ldr	w0, [x29,188]
-	add	w0, w0, 7
+	bne	.L2586
+	str	w22, [x0, 3884]
+.L2586:
+	add	x0, x19, :lo12:.LANCHOR2
+	ldr	w7, [x0, 3884]
+	add	w0, w28, 7
 	cmp	w0, w24, uxth
-	bge	.L2609
-	sub	w25, w5, #7
-	uxth	w25, w25
-.L2609:
+	bge	.L2642
+	sub	w24, w6, #7
+	and	w24, w24, 65535
+.L2587:
+	add	x4, x19, :lo12:.LANCHOR2
 	mov	w3, -1
-	add	x28, x21, :lo12:.LANCHOR2
-	mov	w27, w3
-	mov	w4, 65535
-	mov	w7, 56
-	add	x8, x28, 1508
-.L2610:
-	cmp	w25, w5
-	bhi	.L2623
+	add	x8, x4, 1500
+	mov	w26, w3
+	mov	w5, 65535
+.L2588:
+	cmp	w24, w6
+	bhi	.L2601
 	add	x0, x23, :lo12:.LANCHOR0
-	mov	w24, 0
-	ldrh	w2, [x0,2472]
-	mov	x0, x19
-	add	x2, x19, x2, lsl 1
-.L2624:
-	cmp	x0, x2
-	beq	.L2752
-	ldrh	w1, [x0,16]
-	cmp	w1, w4
-	beq	.L2611
-	umull	x9, w24, w7
-	ldr	x10, [x28,3592]
-	add	w24, w24, 1
-	orr	w1, w25, w1, lsl 10
-	add	x9, x10, x9
-	uxth	w24, w24
-	str	w1, [x9,4]
-.L2611:
-	add	x0, x0, 2
-	b	.L2624
-.L2752:
-	ldr	x0, [x28,3592]
-	mov	w1, w24
-	ldr	w2, [x29,184]
-	str	x8, [x29,128]
-	str	x7, [x29,136]
-	str	x4, [x29,144]
-	str	x6, [x29,160]
-	str	x5, [x29,168]
-	str	x3, [x29,176]
+	mov	w25, 0
+	mov	w10, 56
+	ldr	x1, [x29, 168]
+	ldrh	w0, [x0, 2472]
+	add	x0, x0, 8
+	add	x0, x20, x0, lsl 1
+	b	.L2602
+.L2642:
+	mov	w24, w28
+	b	.L2587
+.L2590:
+	ldrh	w2, [x1]
+	cmp	w2, w5
+	beq	.L2589
+	ldr	x9, [x4, 3584]
+	orr	w2, w24, w2, lsl 10
+	umaddl	x9, w25, w10, x9
+	add	w25, w25, 1
+	and	w25, w25, 65535
+	str	w2, [x9, 4]
+.L2589:
+	add	x1, x1, 2
+.L2602:
+	cmp	x0, x1
+	bne	.L2590
+	ldr	w2, [x29, 164]
+	mov	w1, w25
+	ldr	x0, [x4, 3584]
+	str	x8, [x29, 104]
+	str	w5, [x29, 112]
+	str	w7, [x29, 120]
+	str	w6, [x29, 128]
+	str	w3, [x29, 136]
+	str	x4, [x29, 152]
 	bl	FlashReadPages
+	ldr	x4, [x29, 152]
 	add	x0, x23, :lo12:.LANCHOR0
-	ldr	x3, [x29,176]
-	ldr	x5, [x29,168]
-	mov	w1, 0
-	ldr	x6, [x29,160]
-	sxtw	x10, w25
-	ldrb	w9, [x0,204]
-	ldr	x0, [x28,3592]
-	ldr	x4, [x29,144]
-	ldr	x7, [x29,136]
-	add	x0, x0, 16
-	ldr	x8, [x29,128]
-.L2613:
-	cmp	w1, w24
-	beq	.L2753
-	ldr	w2, [x0,-16]
-	cbnz	w2, .L2614
-	ldr	x2, [x0]
-	ldrh	w11, [x2]
-	cmp	w11, w4
-	beq	.L2615
-	ldr	w2, [x2,4]
-	cmn	w2, #1
-	beq	.L2615
-	ldr	w27, [x28,3892]
+	mov	w1, 56
+	ldr	w5, [x29, 112]
+	ldr	w7, [x29, 120]
+	sxtw	x9, w24
+	ldrb	w2, [x0, 204]
+	ldr	x0, [x4, 3584]
+	ldr	w6, [x29, 128]
+	ldr	w3, [x29, 136]
+	ldr	x8, [x29, 104]
+	nop // between mem op and mult-accumulate
+	umaddl	x25, w25, w1, x0
+.L2591:
+	cmp	x25, x0
+	bne	.L2600
+	add	w24, w24, 1
+	and	w24, w24, 65535
+	b	.L2588
+.L2600:
+	ldr	w1, [x0]
+	cbnz	w1, .L2592
+	ldr	x1, [x0, 16]
+	ldrh	w10, [x1]
+	cmp	w10, w5
+	beq	.L2593
+	ldr	w1, [x1, 4]
+	cmn	w1, #1
+	beq	.L2593
+	ldr	w26, [x4, 3884]
 	cmn	w3, #1
-	str	w2, [x28,3892]
-	bne	.L2615
-	ldrh	w2, [x8,x10,lsl 1]
-	cmp	w2, w4
-	bne	.L2616
-	cbz	w9, .L2615
-.L2616:
-	cmp	w27, w22
-	csinv	w3, w27, wzr, ne
-	b	.L2615
-.L2614:
-	adrp	x0, .LANCHOR5+1328
-	ldrh	w1, [x19]
-	strh	w1, [x0,#:lo12:.LANCHOR5+1328]
-	ldrb	w0, [x19,8]
-	cbnz	w0, .L2607
-	add	x0, x21, :lo12:.LANCHOR2
-	add	x1, x0, 1508
-	ldrh	w2, [x1,w25,sxtw 1]
+	str	w1, [x4, 3884]
+	bne	.L2593
+	ldrh	w1, [x8, x9, lsl 1]
+	cmp	w1, w5
+	bne	.L2594
+	cbz	w2, .L2593
+.L2594:
+	cmp	w22, w26
+	csel	w3, w3, w26, eq
+.L2593:
+	add	x0, x0, 56
+	b	.L2591
+.L2592:
+	adrp	x0, .LANCHOR4+1842
+	ldrh	w1, [x20]
+	strh	w1, [x0, #:lo12:.LANCHOR4+1842]
+	ldrb	w0, [x20, 8]
+	cbnz	w0, .L2585
+	add	x0, x19, :lo12:.LANCHOR2
+	add	x1, x0, 1500
+	ldrh	w2, [x1, w24, sxtw 1]
 	mov	w1, 65535
 	cmp	w2, w1
-	bne	.L2618
+	bne	.L2596
 	cmn	w3, #1
-	beq	.L2619
-	str	w3, [x0,3892]
-	b	.L2607
-.L2619:
-	cmp	w6, w22
-	beq	.L2620
-	str	w6, [x0,3892]
-	b	.L2607
-.L2620:
-	ldr	w1, [x0,3892]
-	b	.L2750
-.L2618:
-	cmp	w27, w22
-	beq	.L2621
-	cmn	w27, #1
-	beq	.L2607
-	str	w27, [x0,3892]
-	b	.L2607
-.L2621:
-	ldr	w1, [x0,3892]
-	cmp	w1, w22
-	beq	.L2607
-.L2750:
-	sub	w1, w1, #1
-	b	.L2745
-.L2615:
-	add	w1, w1, 1
-	add	x0, x0, 56
-	uxth	w1, w1
-	b	.L2613
-.L2753:
-	add	w25, w25, 1
-	uxth	w25, w25
-	b	.L2610
-.L2623:
-	add	x0, x21, :lo12:.LANCHOR2
-	mov	w1, -1
-.L2745:
-	str	w1, [x0,3892]
-.L2607:
-	adrp	x0, .LANCHOR5
-	str	x0, [x29,136]
-	add	x1, x0, :lo12:.LANCHOR5
-	adrp	x0, .LC150
-	add	x0, x0, :lo12:.LC150
-	ldr	w24, [x29,188]
-	str	x0, [x29,128]
-	adrp	x0, .LC149
+	beq	.L2597
+	str	w3, [x0, 3884]
+.L2585:
+	adrp	x0, .LANCHOR4
+	add	x1, x0, :lo12:.LANCHOR4
+	mov	w24, w28
+	add	x19, x19, :lo12:.LANCHOR2
 	mov	w2, 1
-	add	x0, x0, :lo12:.LC149
-	strh	w2, [x1,1330]
-	str	x0, [x29,120]
-.L2625:
+	str	x0, [x29, 120]
+	strh	w2, [x1, 1844]
+.L2603:
 	add	x0, x23, :lo12:.LANCHOR0
-	mov	x1, x19
-	str	wzr, [x29,176]
+	ldr	x1, [x29, 168]
+	mov	w25, 0
 	mov	w7, 65535
-	mov	w8, 56
-	ldrh	w3, [x0,2472]
-	ldrb	w6, [x0,204]
-	add	x3, x19, x3, lsl 1
-.L2626:
-	cmp	x1, x3
-	beq	.L2754
-	ldrh	w2, [x1,16]
-	cmp	w2, w7
-	beq	.L2627
-	ldr	w0, [x29,176]
-	add	x5, x21, :lo12:.LANCHOR2
-	orr	w2, w24, w2, lsl 10
-	ldr	x4, [x5,3592]
-	umull	x0, w0, w8
-	add	x4, x4, x0
-	str	w2, [x4,4]
-	ldrb	w2, [x19,8]
+	ldrb	w6, [x0, 204]
+	ldrh	w0, [x0, 2472]
+	add	x0, x0, 8
+	add	x0, x20, x0, lsl 1
+.L2604:
+	cmp	x0, x1
+	bne	.L2607
+	ldr	w2, [x29, 164]
+	mov	w1, w25
+	ldr	x0, [x19, 3584]
+	bl	FlashReadPages
+	mov	w0, 56
+	umull	x0, w25, w0
+	mov	x25, 0
+	str	x0, [x29, 128]
+	ldr	x0, [x29, 120]
+	add	x0, x0, :lo12:.LANCHOR4
+	str	x0, [x29, 152]
+	adrp	x0, .LC150
+	add	x0, x0, :lo12:.LC150
+	str	x0, [x29, 112]
+	ldr	x0, [x29, 152]
+	add	x0, x0, 1856
+	str	x0, [x29, 104]
+.L2608:
+	ldr	x0, [x29, 128]
+	cmp	x0, x25
+	bne	.L2633
+	ldrb	w0, [x20, 8]
+	add	w24, w24, 1
+	and	w24, w24, 65535
+	cmp	w0, 1
+	bne	.L2634
+	add	x0, x23, :lo12:.LANCHOR0
+	ldrb	w1, [x0, 204]
+	cbz	w1, .L2634
+	ldrh	w0, [x0, 2546]
+	cmp	w0, w24
+	bne	.L2634
+	cmp	w21, w24
+	beq	.L2610
+.L2634:
+	add	x0, x23, :lo12:.LANCHOR0
+	ldrh	w1, [x0, 2544]
+	cmp	w1, w24
+	bne	.L2603
+	ldrh	w1, [x0, 2472]
+	mov	w2, 65535
+	strh	w24, [x20, 2]
+	mov	w0, 0
+	strh	wzr, [x20, 4]
+.L2635:
+	cmp	w0, w1
+	beq	.L2707
+	ldr	x4, [x29, 168]
+	ldrh	w3, [x4], 2
+	str	x4, [x29, 168]
+	cmp	w3, w2
+	beq	.L2636
+	strb	w0, [x20, 6]
+	b	.L2707
+.L2597:
+	cmp	w22, w7
+	beq	.L2598
+	str	w7, [x0, 3884]
+	b	.L2585
+.L2598:
+	ldr	w1, [x0, 3884]
+.L2716:
+	sub	w1, w1, #1
+.L2710:
+	str	w1, [x0, 3884]
+	b	.L2585
+.L2596:
+	cmp	w26, w22
+	beq	.L2599
+	cmn	w26, #1
+	beq	.L2585
+	str	w26, [x0, 3884]
+	b	.L2585
+.L2599:
+	ldr	w1, [x0, 3884]
+	cmp	w22, w1
+	bne	.L2716
+	b	.L2585
+.L2601:
+	add	x0, x19, :lo12:.LANCHOR2
+	mov	w1, -1
+	b	.L2710
+.L2607:
+	ldrh	w3, [x1]
+	cmp	w3, w7
+	beq	.L2605
+	mov	w2, 56
+	ldr	x4, [x19, 3584]
+	orr	w3, w24, w3, lsl 10
+	umull	x5, w25, w2
+	add	x4, x4, x5
+	str	w3, [x4, 4]
+	ldrb	w2, [x20, 8]
 	cmp	w2, 1
-	bne	.L2628
-	cbz	w6, .L2628
-	ldr	x2, [x5,3592]
-	add	x0, x2, x0
-	ldr	w2, [x0,4]
-	orr	w2, w2, -2147483648
-	str	w2, [x0,4]
-.L2628:
-	ldr	w0, [x29,176]
-	add	w0, w0, 1
-	uxth	w0, w0
-	str	w0, [x29,176]
-.L2627:
+	bne	.L2606
+	cbz	w6, .L2606
+	ldr	x2, [x19, 3584]
+	add	x2, x2, x5
+	ldr	w3, [x2, 4]
+	orr	w3, w3, -2147483648
+	str	w3, [x2, 4]
+.L2606:
+	add	w25, w25, 1
+	and	w25, w25, 65535
+.L2605:
 	add	x1, x1, 2
-	b	.L2626
-.L2754:
-	add	x0, x21, :lo12:.LANCHOR2
-	ldr	w1, [x29,176]
-	ldr	w2, [x29,184]
-	ldr	x0, [x0,3592]
-	bl	FlashReadPages
-	str	xzr, [x29,160]
-.L2630:
-	ldrh	w0, [x29,160]
-	ldr	w1, [x29,176]
-	cmp	w1, w0, uxth
-	bls	.L2755
-	ldr	x0, [x29,160]
-	mov	x25, 56
-	mul	x25, x0, x25
-	add	x0, x21, :lo12:.LANCHOR2
-	ldr	x28, [x0,3592]
-	add	x27, x28, x25
-	ldr	w1, [x27,4]
-	str	w1, [x29,204]
-	lsr	x0, x1, 10
-	str	x1, [x29,168]
+	b	.L2604
+.L2633:
+	ldr	x4, [x19, 3584]
+	add	x4, x4, x25
+	ldr	w5, [x4, 4]
+	str	w5, [x29, 188]
+	lsr	w0, w5, 10
 	bl	P2V_plane
-	uxth	w0, w0
-	ldr	w1, [x29,188]
-	cmp	w24, w1
-	ldr	x1, [x29,168]
-	bcc	.L2631
-	ldr	w2, [x29,152]
-	cmp	w0, w2
-	bcs	.L2666
-	ldr	w2, [x29,188]
-	cmp	w24, w2
-	beq	.L2631
-.L2666:
-	cmp	w0, w26
-	bne	.L2667
-	cmp	w24, w20
-	beq	.L2633
-.L2667:
-	ldr	w0, [x28,x25]
+	and	w0, w0, 65535
+	cmp	w24, w28
+	bcc	.L2609
+	ldr	w1, [x29, 144]
+	ccmp	w1, w0, 0, eq
+	bhi	.L2609
+	cmp	w24, w21
+	ccmp	w27, w0, 0, eq
+	beq	.L2610
+	ldr	w0, [x4]
 	cmn	w0, #1
-	beq	.L2635
-	ldr	x28, [x27,16]
+	beq	.L2611
+	ldr	x3, [x4, 16]
 	mov	w0, 61589
-	ldrh	w1, [x28]
+	ldrh	w1, [x3]
 	cmp	w1, w0
-	beq	.L2636
-	ldrh	w0, [x19]
-	b	.L2746
-.L2636:
-	ldr	w22, [x28,4]
+	beq	.L2612
+	ldrh	w0, [x20]
+.L2712:
+	bl	decrement_vpc_count
+	b	.L2609
+.L2612:
+	ldr	w22, [x3, 4]
 	cmn	w22, #1
-	beq	.L2637
-	add	x27, x21, :lo12:.LANCHOR2
+	beq	.L2613
+	ldr	w1, [x19, 756]
 	mov	w0, w22
-	ldr	w1, [x27,756]
 	bl	ftl_cmp_data_ver
-	cbz	w0, .L2637
+	cbz	w0, .L2613
 	add	w0, w22, 1
-	str	w0, [x27,756]
-.L2637:
-	ldr	w27, [x28,8]
-	add	x1, x29, 200
-	ldr	w0, [x28,12]
+	str	w0, [x19, 756]
+.L2613:
+	ldp	w26, w0, [x3, 8]
+	add	x1, x29, 184
+	str	w0, [x29, 180]
 	mov	w2, 0
-	str	w0, [x29,196]
-	mov	w0, w27
+	mov	w0, w26
 	bl	log2phys
-	ldr	w28, [x29,196]
-	add	x3, x21, :lo12:.LANCHOR2
-	str	x3, [x29,168]
-	ldr	w1, [x3,3892]
+	ldr	w1, [x19, 3884]
+	ldr	w3, [x29, 180]
 	cmn	w1, #1
-	beq	.L2638
+	beq	.L2614
 	mov	w0, w22
 	bl	ftl_cmp_data_ver
-	ldr	x3, [x29,168]
-	cbz	w0, .L2638
-	cmn	w28, #1
-	beq	.L2639
-	ldr	x0, [x3,3592]
+	cbz	w0, .L2614
+	cmn	w3, #1
+	beq	.L2615
+	ldr	x0, [x19, 3584]
 	mov	w2, 0
-	str	x3, [x29,112]
-	add	x0, x0, x25
-	str	w28, [x0,4]
-	ldr	x1, [x0,16]
-	ldr	x0, [x3,3592]
-	str	x1, [x29,168]
 	mov	w1, 1
 	add	x0, x0, x25
+	ldr	x4, [x0, 16]
+	str	w3, [x0, 4]
+	str	x4, [x29, 136]
+	ldr	x0, [x19, 3584]
+	add	x0, x0, x25
 	bl	FlashReadPages
-	ldr	x3, [x29,112]
-	ldr	x0, [x29,168]
-	ldr	x2, [x3,3592]
-	ldr	w0, [x0,4]
-	str	w0, [x29,144]
-	add	x4, x2, x25
-	ldr	w0, [x2,x25]
+	ldr	x0, [x19, 3584]
+	ldr	x4, [x29, 136]
+	add	x3, x0, x25
+	ldr	w0, [x0, x25]
 	cmn	w0, #1
-	bne	.L2640
-	b	.L2641
+	bne	.L2616
+.L2617:
+	mov	w0, -1
+	str	w0, [x29, 180]
+.L2624:
+	ldr	w4, [x29, 180]
+	cmn	w4, #1
+	beq	.L2609
 .L2639:
-	ldr	w0, [x29,204]
-	ldr	w1, [x29,200]
+	lsr	w0, w4, 10
+	bl	P2V_block_in_plane
+	ldr	x3, [x19, 520]
+	and	w1, w0, 65535
+	ubfiz	x2, x1, 1, 16
+	ldrh	w2, [x3, x2]
+	cbnz	w2, .L2712
+	adrp	x0, .LC149
+	add	x0, x0, :lo12:.LC149
+	bl	printk
+	b	.L2609
+.L2615:
+	ldp	w1, w0, [x29, 184]
 	cmp	w1, w0
-	bne	.L2631
-	mov	w0, w27
-	add	x1, x29, 196
+	bne	.L2609
 	mov	w2, 1
+	add	x1, x29, 180
+	mov	w0, w26
 	bl	log2phys
-	b	.L2631
-.L2640:
-	ldr	x0, [x29,168]
-	ldr	w28, [x0,8]
-	cmp	w28, w27
-	bne	.L2641
-	ldr	w0, [x3,3892]
-	ldr	w1, [x29,144]
-	str	x2, [x29,96]
-	str	x4, [x29,104]
-	str	x3, [x29,112]
+.L2609:
+	add	x25, x25, 56
+	b	.L2608
+.L2616:
+	ldr	w0, [x4, 8]
+	cmp	w26, w0
+	bne	.L2617
+	ldr	w0, [x4, 4]
+	str	w0, [x29, 136]
+	str	x4, [x29, 96]
+	uxtw	x1, w0
+	ldr	w0, [x19, 3884]
 	bl	ftl_cmp_data_ver
-	ldr	x3, [x29,112]
-	ldr	x4, [x29,104]
-	ldr	x2, [x29,96]
-	cbz	w0, .L2641
-	ldr	w0, [x29,200]
-	ldr	w1, [x29,204]
+	cbz	w0, .L2617
+	ldp	w0, w1, [x29, 184]
+	ldr	x4, [x29, 96]
 	cmp	w0, w1
-	beq	.L2646
-	ldr	w1, [x29,196]
+	ldr	w1, [x29, 180]
+	bne	.L2619
+.L2711:
+	mov	w0, w26
+	bl	FtlReUsePrevPpa
+	b	.L2617
+.L2619:
 	cmp	w0, w1
-	beq	.L2641
+	beq	.L2617
 	cmn	w0, #1
-	beq	.L2644
-	str	w0, [x4,4]
+	beq	.L2620
+	ldr	x4, [x3, 16]
 	mov	w2, 0
-	ldr	x1, [x4,16]
-	ldr	x0, [x3,3592]
-	str	x1, [x29,168]
+	str	w0, [x3, 4]
 	mov	w1, 1
+	str	x4, [x29, 96]
+	ldr	x0, [x19, 3584]
 	add	x0, x0, x25
 	bl	FlashReadPages
-	b	.L2645
-.L2644:
-	str	w0, [x2,x25]
-.L2645:
-	add	x0, x21, :lo12:.LANCHOR2
-	ldr	x1, [x0,3592]
-	ldr	w1, [x1,x25]
-	cmn	w1, #1
-	beq	.L2646
-	ldr	x1, [x29,168]
-	ldr	w0, [x0,3892]
-	ldr	w25, [x1,4]
-	mov	w1, w25
+	ldr	x4, [x29, 96]
+.L2621:
+	ldr	x0, [x19, 3584]
+	ldr	w0, [x0, x25]
+	cmn	w0, #1
+	beq	.L2622
+	ldr	w3, [x4, 4]
+	ldr	w0, [x19, 3884]
+	mov	w1, w3
 	bl	ftl_cmp_data_ver
-	cbz	w0, .L2646
-	ldr	w0, [x29,144]
-	mov	w1, w25
+	cbz	w0, .L2622
+	ldr	w0, [x29, 136]
+	mov	w1, w3
 	bl	ftl_cmp_data_ver
-	cbz	w0, .L2641
-.L2646:
-	ldr	w1, [x29,196]
-	mov	w0, w28
-	bl	FtlReUsePrevPpa
-.L2641:
-	mov	w0, -1
-	str	w0, [x29,196]
-	b	.L2648
-.L2638:
-	ldr	w0, [x29,204]
-	ldr	w1, [x29,200]
+	cbz	w0, .L2617
+.L2622:
+	ldr	w1, [x29, 180]
+	b	.L2711
+.L2620:
+	str	w0, [x3]
+	b	.L2621
+.L2614:
+	ldp	w1, w0, [x29, 184]
 	cmp	w1, w0
-	beq	.L2648
-	cmn	w28, #1
-	beq	.L2650
+	beq	.L2624
+	cmn	w3, #1
+	beq	.L2626
 	add	x0, x23, :lo12:.LANCHOR0
-	ubfx	x28, x28, 10, 21
-	ldr	w0, [x0,2488]
-	cmp	w28, w0
-	bcs	.L2631
-.L2650:
-	mov	w0, w27
-	add	x1, x29, 204
+	ubfx	x3, x3, 10, 21
+	ldr	w0, [x0, 2488]
+	cmp	w3, w0
+	bcs	.L2609
+.L2626:
 	mov	w2, 1
+	add	x1, x29, 188
+	mov	w0, w26
 	bl	log2phys
-	ldr	w25, [x29,200]
-	cmn	w25, #1
-	beq	.L2648
-	ldr	w0, [x29,196]
-	cmp	w25, w0
-	beq	.L2648
-	lsr	x0, x25, 10
+	ldr	w4, [x29, 184]
+	cmn	w4, #1
+	beq	.L2624
+	ldr	w0, [x29, 180]
+	cmp	w4, w0
+	beq	.L2639
+	lsr	w0, w4, 10
 	bl	P2V_block_in_plane
-	uxth	w0, w0
-	add	x1, x21, :lo12:.LANCHOR2
-	ldrh	w2, [x1,560]
-	cmp	w2, w0
-	beq	.L2652
-	ldrh	w2, [x1,608]
-	cmp	w2, w0
-	beq	.L2652
-	ldrh	w1, [x1,656]
+	ldrh	w1, [x19, 560]
+	and	w0, w0, 65535
 	cmp	w1, w0
-	bne	.L2648
-.L2652:
-	add	x28, x21, :lo12:.LANCHOR2
-	mov	w1, 1
+	beq	.L2629
+	ldrh	w1, [x19, 608]
+	cmp	w1, w0
+	beq	.L2629
+	ldrh	w1, [x19, 656]
+	cmp	w1, w0
+	bne	.L2624
+.L2629:
+	ldr	x0, [x19, 3584]
 	mov	w2, 0
-	ldr	x0, [x28,3592]
-	str	w25, [x0,4]
-	ldr	x3, [x0,16]
-	ldr	x0, [x28,3592]
-	str	x3, [x29,168]
+	mov	w1, 1
+	str	w4, [x0, 4]
+	ldr	x3, [x0, 16]
+	ldr	x0, [x19, 3584]
+	str	x3, [x29, 136]
 	bl	FlashReadPages
-	ldr	x0, [x28,3592]
-	ldr	x3, [x29,168]
+	ldr	x0, [x19, 3584]
 	ldr	w0, [x0]
-	ldr	w1, [x3,4]
 	cmn	w0, #1
-	beq	.L2648
+	beq	.L2624
+	ldr	x3, [x29, 136]
 	mov	w0, w22
+	ldr	w1, [x3, 4]
 	bl	ftl_cmp_data_ver
-	cbnz	w0, .L2648
-	mov	w0, w27
-	add	x1, x29, 200
+	cbnz	w0, .L2624
 	mov	w2, 1
+	add	x1, x29, 184
+	mov	w0, w26
 	bl	log2phys
-.L2648:
-	ldr	w0, [x29,196]
-	cmn	w0, #1
-	beq	.L2631
-	lsr	x0, x0, 10
-	bl	P2V_block_in_plane
-	uxth	w1, w0
-	add	x2, x21, :lo12:.LANCHOR2
-	ubfiz	x3, x1, 1, 16
-	ldr	x2, [x2,520]
-	ldrh	w2, [x2,x3]
-	cbz	w2, .L2653
-.L2746:
-	bl	decrement_vpc_count
-	b	.L2631
-.L2653:
-	ldr	x0, [x29,120]
-	bl	printk
-	b	.L2631
-.L2635:
-	ldr	x2, [x29,136]
-	ldrh	w0, [x19]
-	add	x25, x2, :lo12:.LANCHOR5
+	b	.L2624
+.L2611:
+	ldr	x1, [x29, 152]
 	mov	w2, w22
-	strh	w0, [x25,1328]
-	ldr	x0, [x29,128]
+	ldrh	w0, [x20]
+	strh	w0, [x1, 1842]
+	mov	w1, w5
+	ldr	x0, [x29, 112]
 	bl	printk
-	ldr	w0, [x25,1332]
+	ldr	x0, [x29, 152]
+	ldr	w0, [x0, 1848]
 	cmp	w0, 31
-	bhi	.L2654
-	add	x1, x25, 1336
-	ldr	w2, [x29,204]
-	str	w2, [x1,w0,uxtw 2]
+	bhi	.L2631
+	ldr	x2, [x29, 104]
+	ldr	w1, [x29, 188]
+	str	w1, [x2, w0, uxtw 2]
 	add	w0, w0, 1
-	str	w0, [x25,1332]
-.L2654:
-	ldrh	w0, [x19]
-	bl	decrement_vpc_count
-	add	x0, x21, :lo12:.LANCHOR2
-	ldr	w1, [x0,3892]
-	cmn	w1, #1
-	beq	.L2747
-	cmp	w1, w22
-	bls	.L2631
-.L2747:
-	str	w22, [x0,3892]
+	ldr	x1, [x29, 152]
+	str	w0, [x1, 1848]
 .L2631:
-	ldr	x0, [x29,160]
-	add	x0, x0, 1
-	str	x0, [x29,160]
-	b	.L2630
-.L2755:
-	ldrb	w0, [x19,8]
-	add	w24, w24, 1
-	cmp	w0, 1
-	uxth	w24, w24
-	bne	.L2657
-	add	x0, x23, :lo12:.LANCHOR0
-	ldrb	w1, [x0,204]
-	cbz	w1, .L2657
-	cmp	w20, w24
-	bne	.L2657
-	ldrh	w0, [x0,2546]
-	cmp	w0, w24
-	beq	.L2633
-.L2657:
-	add	x0, x23, :lo12:.LANCHOR0
-	ldrh	w1, [x0,2544]
-	cmp	w24, w1
-	bne	.L2625
-	ldrh	w2, [x0,2472]
-	mov	w3, 65535
-	strh	w24, [x19,2]
-	mov	x0, 0
-	strh	wzr, [x19,4]
-.L2659:
-	uxth	w1, w0
-	cmp	w1, w2
-	bcs	.L2742
-	add	x0, x0, 1
-	add	x4, x19, x0, lsl 1
-	ldrh	w4, [x4,14]
-	cmp	w4, w3
-	beq	.L2659
-	strb	w1, [x19,6]
-	b	.L2742
-.L2633:
-	strb	w26, [x19,6]
-	strh	w20, [x19,2]
-.L2749:
-	mov	x0, x19
-	mov	w1, w20
-	mov	w2, w26
-	bl	ftl_sb_update_avl_pages
-.L2742:
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 208
-	ret
+	ldrh	w0, [x20]
+	bl	decrement_vpc_count
+	ldr	w0, [x19, 3884]
+	cmn	w0, #1
+	bne	.L2632
+.L2713:
+	str	w22, [x19, 3884]
+	b	.L2609
+.L2632:
+	cmp	w22, w0
+	bcs	.L2609
+	b	.L2713
+.L2636:
+	add	w0, w0, 1
+	and	w0, w0, 65535
+	b	.L2635
+.L2610:
+	strb	w27, [x20, 6]
+	strh	w21, [x20, 2]
+	b	.L2715
 	.size	FtlRecoverySuperblock, .-FtlRecoverySuperblock
 	.align	2
 	.global	FtlVpcCheckAndModify
@@ -17838,727 +17481,706 @@ FtlRecoverySuperblock:
 FtlVpcCheckAndModify:
 	stp	x29, x30, [sp, -80]!
 	adrp	x1, .LANCHOR3
-	adrp	x0, .LC109
 	add	x1, x1, :lo12:.LANCHOR3
+	adrp	x0, .LC109
 	add	x29, sp, 0
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR2
+	stp	x23, x24, [sp, 48]
+	add	x23, x20, :lo12:.LANCHOR2
+	stp	x21, x22, [sp, 32]
+	adrp	x21, .LANCHOR0
+	add	x22, x21, :lo12:.LANCHOR0
 	add	x1, x1, 232
 	add	x0, x0, :lo12:.LC109
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	adrp	x22, .LANCHOR0
 	bl	printk
-	add	x1, x22, :lo12:.LANCHOR0
-	adrp	x20, .LANCHOR2
-	add	x0, x20, :lo12:.LANCHOR2
-	mov	w19, 0
-	ldrh	w2, [x1,2482]
+	ldr	x0, [x23, 3704]
 	mov	w1, 0
-	ldr	x0, [x0,3712]
+	ldrh	w2, [x22, 2482]
+	mov	w19, 0
 	lsl	w2, w2, 1
 	bl	ftl_memset
-.L2757:
-	add	x0, x22, :lo12:.LANCHOR0
-	ldr	w0, [x0,2616]
+.L2718:
+	ldr	w0, [x22, 2616]
 	cmp	w19, w0
-	bcs	.L2773
-	mov	w0, w19
-	add	x1, x29, 76
+	bcc	.L2720
+	adrp	x22, .LC151
+	add	x23, x21, :lo12:.LANCHOR0
+	add	x20, x20, :lo12:.LANCHOR2
+	add	x22, x22, :lo12:.LC151
+	mov	w19, 0
+	mov	w24, 65535
+.L2721:
+	ldrh	w0, [x23, 2480]
+	cmp	w0, w19
+	bhi	.L2724
+	bl	l2p_flush
+	bl	FtlVpcTblFlush
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 80
+	ret
+.L2720:
 	mov	w2, 0
+	add	x1, x29, 76
+	mov	w0, w19
 	bl	log2phys
-	ldr	w0, [x29,76]
+	ldr	w0, [x29, 76]
 	cmn	w0, #1
-	beq	.L2758
-	lsr	x0, x0, 10
+	beq	.L2719
+	lsr	w0, w0, 10
 	bl	P2V_block_in_plane
+	ldr	x2, [x23, 3704]
 	ubfiz	x0, x0, 1, 16
-	add	x1, x20, :lo12:.LANCHOR2
-	ldr	x2, [x1,3712]
-	ldrh	w1, [x2,x0]
+	ldrh	w1, [x2, x0]
 	add	w1, w1, 1
-	strh	w1, [x2,x0]
-.L2758:
+	strh	w1, [x2, x0]
+.L2719:
 	add	w19, w19, 1
-	b	.L2757
-.L2773:
-	adrp	x23, .LC151
-	mov	w19, 0
-	add	x20, x20, :lo12:.LANCHOR2
-	mov	w24, 65535
-	add	x23, x23, :lo12:.LC151
-.L2760:
-	add	x0, x22, :lo12:.LANCHOR0
-	ldrh	w0, [x0,2480]
-	cmp	w0, w19
-	bls	.L2774
+	b	.L2718
+.L2724:
+	ldr	x0, [x20, 520]
 	ubfiz	x21, x19, 1, 16
-	ldr	x0, [x20,520]
-	ldrh	w2, [x0,x21]
-	ldr	x0, [x20,3712]
-	cmp	w2, w24
-	ldrh	w3, [x0,x21]
-	beq	.L2761
+	ldrh	w2, [x0, x21]
+	ldr	x0, [x20, 3704]
+	ldrh	w3, [x0, x21]
 	cmp	w2, w3
-	beq	.L2761
-	ldrh	w0, [x20,560]
+	beq	.L2722
+	cmp	w2, w24
+	beq	.L2722
+	ldrh	w0, [x20, 560]
 	cmp	w0, w19
-	beq	.L2761
-	ldrh	w0, [x20,656]
+	beq	.L2722
+	ldrh	w0, [x20, 656]
 	cmp	w0, w19
-	beq	.L2761
-	ldrh	w0, [x20,608]
+	beq	.L2722
+	ldrh	w0, [x20, 608]
 	cmp	w0, w19
-	beq	.L2761
+	beq	.L2722
 	mov	w1, w19
-	mov	x0, x23
+	mov	x0, x22
 	bl	printk
-	ldr	x0, [x20,520]
-	ldrh	w1, [x0,x21]
-	cbnz	w1, .L2762
-	ldr	x1, [x20,3712]
-	ldrh	w1, [x1,x21]
-	strh	w1, [x0,x21]
-	b	.L2761
-.L2762:
-	ldr	x1, [x20,3712]
-	ldrh	w1, [x1,x21]
-	strh	w1, [x0,x21]
+	ldr	x0, [x20, 520]
+	ldrh	w1, [x0, x21]
+	cbnz	w1, .L2723
+	ldr	x1, [x20, 3704]
+	ldrh	w1, [x1, x21]
+	strh	w1, [x0, x21]
+.L2722:
+	add	w19, w19, 1
+	and	w19, w19, 65535
+	b	.L2721
+.L2723:
+	ldr	x1, [x20, 3704]
+	ldrh	w1, [x1, x21]
+	strh	w1, [x0, x21]
 	mov	w0, w19
 	bl	update_vpc_list
-.L2761:
-	add	w19, w19, 1
-	uxth	w19, w19
-	b	.L2760
-.L2774:
-	bl	l2p_flush
-	bl	FtlVpcTblFlush
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 80
-	ret
+	b	.L2722
 	.size	FtlVpcCheckAndModify, .-FtlVpcCheckAndModify
 	.align	2
 	.global	FtlGcScanTempBlk
 	.type	FtlGcScanTempBlk, %function
 FtlGcScanTempBlk:
-	stp	x29, x30, [sp, -224]!
+	stp	x29, x30, [sp, -208]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	mov	x20, x0
+	stp	x19, x20, [sp, 16]
+	mov	x19, x0
 	adrp	x0, .LANCHOR1
-	str	w1, [x29,148]
+	stp	x21, x22, [sp, 32]
+	str	w1, [x29, 132]
 	add	x1, x0, :lo12:.LANCHOR1
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	str	x0, [x29,136]
-	ldrh	w27, [x1,3456]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	str	x0, [x29, 120]
+	ldrh	w28, [x1, 3456]
 	mov	w1, 65535
-	cmp	w27, w1
-	beq	.L2808
-	cbnz	w27, .L2776
-	b	.L2777
-.L2808:
-	mov	w27, 0
-.L2776:
-	adrp	x0, .LANCHOR0+2544
-	ldr	w1, [x29,148]
-	ldrh	w0, [x0,#:lo12:.LANCHOR0+2544]
-	cmp	w1, w0
-	bne	.L2778
-.L2777:
+	cmp	w28, w1
+	beq	.L2760
+	cbnz	w28, .L2730
+.L2731:
 	bl	FtlGcPageVarInit
-.L2778:
+	b	.L2732
+.L2760:
+	mov	w28, 0
+.L2730:
+	adrp	x0, .LANCHOR0+2544
+	ldr	w1, [x29, 132]
+	ldrh	w0, [x0, #:lo12:.LANCHOR0+2544]
+	cmp	w0, w1
+	beq	.L2731
+.L2732:
+	adrp	x25, .LANCHOR2
+	mov	x21, x25
+	add	x26, x25, :lo12:.LANCHOR2
 	mov	w0, -1
-	str	w0, [x29,152]
-	adrp	x0, .LC153
-	mov	w23, 0
-	add	x0, x0, :lo12:.LC153
-	adrp	x28, .LANCHOR0
-	str	x0, [x29,128]
-.L2779:
-	ldrh	w1, [x20]
-	mov	w0, 65535
-	strb	wzr, [x20,8]
-	cmp	w1, w0
-	beq	.L2809
-.L2781:
-	str	w0, [x29,156]
-.L2805:
-	adrp	x0, .LANCHOR0
-	mov	x2, x20
-	add	x0, x0, :lo12:.LANCHOR0
-	mov	w21, 0
+	mov	w24, 0
+	str	w0, [x29, 136]
+.L2733:
+	ldrh	w0, [x19]
+	mov	w23, 65535
+	strb	wzr, [x19, 8]
+	cmp	w0, w23
+	beq	.L2761
+.L2757:
+	adrp	x20, .LANCHOR0
+	add	x0, x20, :lo12:.LANCHOR0
+	add	x2, x19, 16
+	add	x4, x25, :lo12:.LANCHOR2
+	mov	w22, 0
 	mov	w10, 56
-	adrp	x11, .LANCHOR2
+	ldrh	w8, [x0, 2554]
 	mov	w7, 4
-	ldrh	w5, [x0,2472]
-	ldrh	w8, [x0,2554]
-	ldrh	w9, [x0,2556]
-	add	x5, x20, x5, lsl 1
-.L2782:
-	cmp	x2, x5
-	beq	.L2828
-	ldrh	w1, [x2,16]
-	ldr	w0, [x29,156]
-	cmp	w1, w0
-	beq	.L2783
-	add	x4, x11, :lo12:.LANCHOR2
-	orr	w1, w27, w1, lsl 10
-	umull	x0, w21, w10
-	ldr	x6, [x4,3592]
-	add	x6, x6, x0
-	str	w1, [x6,4]
-	ldr	x1, [x4,3592]
-	ldr	x6, [x4,1400]
-	add	x0, x1, x0
-	ldr	x4, [x4,1408]
-	mul	w1, w21, w8
+	ldrh	w9, [x0, 2556]
+	ldrh	w0, [x0, 2472]
+	add	x0, x0, 8
+	add	x0, x19, x0, lsl 1
+.L2735:
+	cmp	x2, x0
+	bne	.L2737
+	add	x0, x25, :lo12:.LANCHOR2
+	mov	w1, w22
+	mov	w2, 0
+	add	x27, x20, :lo12:.LANCHOR0
+	ldr	x0, [x0, 3584]
+	bl	FlashReadPages
+	mov	w0, 56
+	umull	x0, w22, w0
+	mov	x22, 0
+	str	x0, [x29, 112]
+.L2738:
+	ldr	x0, [x29, 112]
+	cmp	x0, x22
+	bne	.L2755
+	ldr	w0, [x29, 132]
+	add	w3, w28, 1
+	add	w24, w24, 1
+	and	w28, w3, 65535
+	cmp	w0, w24
+	bls	.L2756
+.L2758:
+	add	x20, x20, :lo12:.LANCHOR0
+	ldrh	w0, [x20, 2544]
+	cmp	w0, w28
+	bhi	.L2757
+.L2761:
+	mov	w2, 0
+	b	.L2734
+.L2737:
+	ldrh	w1, [x2]
+	cmp	w1, w23
+	beq	.L2736
+	umull	x11, w22, w10
+	ldr	x6, [x4, 3584]
+	orr	w1, w28, w1, lsl 10
+	add	x6, x6, x11
+	str	w1, [x6, 4]
+	mul	w1, w22, w8
+	ldr	x5, [x4, 3584]
+	ldr	x6, [x4, 1392]
 	sdiv	w1, w1, w7
+	add	x5, x5, x11
 	add	x1, x6, w1, sxtw 2
-	str	x1, [x0,8]
-	mul	w1, w21, w9
-	add	w21, w21, 1
-	uxth	w21, w21
+	str	x1, [x5, 8]
+	mul	w1, w22, w9
+	ldr	x6, [x4, 1400]
+	add	w22, w22, 1
+	and	w22, w22, 65535
 	sdiv	w1, w1, w7
-	add	x1, x4, w1, sxtw 2
-	str	x1, [x0,16]
-.L2783:
+	add	x1, x6, w1, sxtw 2
+	str	x1, [x5, 16]
+.L2736:
 	add	x2, x2, 2
-	b	.L2782
-.L2828:
-	adrp	x19, .LANCHOR2
-	mov	w1, w21
-	add	x0, x19, :lo12:.LANCHOR2
-	mov	w2, 0
-	mov	x24, 0
-	ldr	x0, [x0,3592]
-	bl	FlashReadPages
-.L2785:
-	cmp	w21, w24, uxth
-	bls	.L2829
-	add	x25, x19, :lo12:.LANCHOR2
-	mov	x0, 56
-	mul	x22, x24, x0
-	ldr	x1, [x25,3592]
-	str	x1, [x29,112]
-	add	x2, x1, x22
-	str	x2, [x29,120]
-	ldr	w26, [x2,4]
-	lsr	x0, x26, 10
+	b	.L2735
+.L2755:
+	ldr	x5, [x26, 3584]
+	add	x4, x5, x22
+	ldr	w0, [x4, 4]
+	str	w0, [x29, 140]
+	uxtw	x1, w0
+	lsr	w0, w1, 10
 	bl	P2V_plane
-	uxth	w5, w0
-	ldr	x1, [x29,112]
-	ldr	x2, [x29,120]
-	ldr	w8, [x1,x22]
-	ldr	x4, [x2,16]
-	cbnz	w8, .L2786
+	and	w2, w0, 65535
+	ldr	w0, [x5, x22]
+	ldr	x4, [x4, 16]
+	cbnz	w0, .L2739
 	ldrh	w0, [x4]
-	ldr	w1, [x29,156]
-	cmp	w0, w1
-	bne	.L2787
-.L2790:
-	adrp	x0, .LANCHOR0
-	add	x0, x0, :lo12:.LANCHOR0
-	ldrb	w0, [x0,204]
-	cbz	w0, .L2824
-	add	x19, x19, :lo12:.LANCHOR2
+	cmp	w0, w23
+	bne	.L2740
+.L2743:
+	add	x20, x20, :lo12:.LANCHOR0
+	ldrb	w0, [x20, 204]
+	cbz	w0, .L2777
+	add	x21, x21, :lo12:.LANCHOR2
 	mov	w0, 1
-	str	w0, [x19,3888]
-	b	.L2780
-.L2787:
-	add	x7, x28, :lo12:.LANCHOR0
-	ldr	w0, [x4,8]
-	ldr	w1, [x7,2616]
+	str	w0, [x21, 3880]
+.L2734:
+	ldr	x0, [x29, 120]
+	mov	w1, -1
+	strh	w28, [x19, 2]
+	add	x0, x0, :lo12:.LANCHOR1
+	strb	w2, [x19, 6]
+	strh	w1, [x0, 3456]
+	mov	w1, w28
+	mov	x0, x19
+	bl	ftl_sb_update_avl_pages
+	b	.L2729
+.L2740:
+	ldr	w0, [x4, 8]
+	ldr	w1, [x27, 2616]
 	cmp	w0, w1
-	bls	.L2825
-	b	.L2790
-.L2824:
-	add	x19, x19, :lo12:.LANCHOR2
-	ldrh	w2, [x20]
-	ldr	x1, [x19,520]
-	strh	w0, [x1,x2,lsl 1]
-	b	.L2827
-.L2825:
-	ldrb	w1, [x7,72]
-	cbz	w1, .L2794
-	add	x1, x29, 164
-	mov	w2, w8
-	str	x4, [x29,120]
-	str	x7, [x29,104]
-	str	x8, [x29,112]
+	bhi	.L2743
+	ldrb	w1, [x27, 72]
+	cbnz	w1, .L2746
+.L2747:
+	ldp	w2, w0, [x4, 8]
+	add	x22, x22, 56
+	ldr	w1, [x29, 140]
+	bl	FtlGcUpdatePage
+	b	.L2738
+.L2746:
+	add	x1, x29, 148
+	str	x4, [x29, 104]
+	mov	w2, 0
 	bl	log2phys
-	ldr	x4, [x29,120]
-	ldr	w1, [x29,164]
-	ldr	w0, [x4,12]
-	cmp	w1, w0
-	bne	.L2794
-	cmn	w1, #1
-	beq	.L2794
-	str	w0, [x29,172]
+	ldr	x4, [x29, 104]
+	ldr	w1, [x29, 148]
+	ldr	w0, [x4, 12]
+	cmp	w0, w1
+	bne	.L2747
+	cmn	w0, #1
+	beq	.L2747
+	str	w0, [x29, 156]
+	mov	w2, 0
+	ldr	x0, [x26, 3648]
 	mov	w1, 1
-	ldr	x0, [x25,3656]
-	ldr	x8, [x29,112]
-	str	x0, [x29,176]
-	ldr	x0, [x25,3672]
-	mov	w2, w8
-	str	x0, [x29,184]
-	add	x0, x29, 168
+	str	x0, [x29, 160]
+	ldr	x0, [x26, 3664]
+	str	x0, [x29, 168]
+	add	x0, x29, 152
 	bl	FlashReadPages
-	ldr	x7, [x29,104]
-	ldr	x0, [x25,3592]
-	ldr	x5, [x29,176]
-	ldrh	w2, [x7,2550]
-	add	x22, x0, x22
-	ldr	x4, [x29,120]
+	ldrh	w1, [x27, 2550]
 	mov	x0, 0
-	lsl	w2, w2, 7
-.L2796:
-	cmp	w2, w0
-	bls	.L2794
-	lsl	x1, x0, 2
-	ldr	x6, [x22,8]
-	add	x0, x0, 1
-	ldr	w6, [x6,x1]
-	ldr	w1, [x5,x1]
-	cmp	w6, w1
-	beq	.L2796
-	ldrh	w1, [x20]
+	ldr	x2, [x26, 3584]
+	ldr	x4, [x29, 104]
+	ldr	x5, [x29, 160]
+	ubfiz	x1, x1, 9, 16
+	add	x2, x2, x22
+.L2748:
+	cmp	x0, x1
+	beq	.L2747
+	ldr	x6, [x2, 8]
+	ldr	w7, [x6, x0]
+	add	x0, x0, 4
+	add	x6, x5, x0
+	ldr	w6, [x6, -4]
+	cmp	w7, w6
+	beq	.L2748
+	ldrh	w1, [x19]
 	adrp	x0, .LC152
-	ldr	w2, [x29,172]
+	ldr	w2, [x29, 156]
 	add	x0, x0, :lo12:.LC152
-	add	x19, x19, :lo12:.LANCHOR2
 	bl	printk
-	ldrh	w1, [x20]
-	ldr	x0, [x19,520]
-	strh	wzr, [x0,x1,lsl 1]
-.L2827:
-	ldrh	w0, [x20]
+.L2777:
+	add	x13, x21, :lo12:.LANCHOR2
+	ldrh	w1, [x19]
+	ldr	x0, [x13, 520]
+	strh	wzr, [x0, x1, lsl 1]
+	ldrh	w0, [x19]
 	bl	INSERT_FREE_LIST
 	mov	w0, -1
-	strh	w0, [x20]
-	strh	w0, [x19,800]
-	b	.L2826
-.L2794:
-	ldr	w0, [x4,12]
-	mov	w1, w26
-	ldr	w2, [x4,8]
-	add	x24, x24, 1
-	bl	FtlGcUpdatePage
-	b	.L2785
-.L2786:
-	ldrh	w1, [x20]
-	mov	w2, w26
-	ldr	x0, [x29,128]
+	strh	w0, [x19]
+	strh	w0, [x13, 800]
+.L2776:
+	bl	FtlGcPageVarInit
+	mov	w28, 0
+	b	.L2733
+.L2739:
+	ldrh	w1, [x19]
+	add	x20, x20, :lo12:.LANCHOR0
+	ldr	w2, [x29, 140]
+	adrp	x0, .LC153
+	add	x0, x0, :lo12:.LC153
 	bl	printk
-	adrp	x0, .LANCHOR0
-	add	x0, x0, :lo12:.LANCHOR0
-	ldr	w1, [x0,2372]
-	cbnz	w1, .L2799
-	ldrb	w0, [x0,204]
-	cbz	w0, .L2800
-.L2799:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w1, [x20]
-	ldr	x0, [x0,440]
-	ldrh	w0, [x0,x1,lsl 1]
-	cmp	w0, 159
-	bls	.L2801
-.L2800:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	x0, [x0,3592]
-	ldr	w0, [x0,x22]
-	cmn	w0, #1
-	bne	.L2802
-.L2801:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	x0, [x0,3592]
-	add	x22, x0, x22
-	ldr	w0, [x22,4]
-	str	w0, [x29,152]
-.L2802:
-	add	x19, x19, :lo12:.LANCHOR2
-	ldrh	w1, [x20]
-	ldr	x0, [x19,520]
-	strh	wzr, [x0,x1,lsl 1]
-	ldrh	w0, [x20]
+	ldr	w1, [x20, 2372]
+	ldrh	w0, [x19]
+	cbnz	w1, .L2751
+	ldrb	w1, [x20, 204]
+	cbz	w1, .L2752
+.L2751:
+	add	x2, x21, :lo12:.LANCHOR2
+	ubfiz	x1, x0, 1, 16
+	ldr	x2, [x2, 440]
+	ldrh	w1, [x2, x1]
+	cmp	w1, 159
+	bls	.L2753
+.L2752:
+	add	x1, x21, :lo12:.LANCHOR2
+	ldr	x1, [x1, 3584]
+	ldr	w1, [x1, x22]
+	cmn	w1, #1
+	bne	.L2754
+.L2753:
+	add	x1, x21, :lo12:.LANCHOR2
+	ldr	x1, [x1, 3584]
+	add	x22, x1, x22
+	ldr	w1, [x22, 4]
+	str	w1, [x29, 136]
+.L2754:
+	add	x1, x21, :lo12:.LANCHOR2
+	ubfiz	x0, x0, 1, 16
+	ldr	x1, [x1, 520]
+	strh	wzr, [x1, x0]
+	ldrh	w0, [x19]
 	bl	INSERT_FREE_LIST
 	mov	w0, -1
-	strh	w0, [x20]
-.L2826:
-	bl	FtlGcPageVarInit
-	mov	w27, 0
-	b	.L2779
-.L2829:
-	ldr	w0, [x29,148]
-	add	w23, w23, 1
-	add	w3, w27, 1
-	cmp	w23, w0
-	uxth	w27, w3
-	bcs	.L2804
-.L2806:
-	add	x0, x28, :lo12:.LANCHOR0
-	ldrh	w0, [x0,2544]
-	cmp	w0, w27
-	bhi	.L2805
-	b	.L2809
-.L2804:
-	ldr	x0, [x29,136]
-	ldr	w2, [x29,156]
+	strh	w0, [x19]
+	b	.L2776
+.L2756:
+	ldr	x0, [x29, 120]
 	add	x1, x0, :lo12:.LANCHOR1
-	ldrh	w0, [x1,3456]
-	cmp	w0, w2
-	beq	.L2806
-	add	w0, w0, w23
-	strh	w0, [x1,3456]
-	add	x0, x28, :lo12:.LANCHOR0
-	ldrh	w0, [x0,2544]
-	cmp	w0, w27
-	bls	.L2806
-	b	.L2807
-.L2809:
-	mov	w5, 0
-.L2780:
-	ldr	x0, [x29,136]
-	mov	w1, -1
-	strh	w27, [x20,2]
-	mov	w2, w5
-	add	x0, x0, :lo12:.LANCHOR1
-	strb	w5, [x20,6]
-	strh	w1, [x0,3456]
-	mov	x0, x20
-	mov	w1, w27
-	bl	ftl_sb_update_avl_pages
-.L2807:
-	ldr	w0, [x29,152]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 224
+	ldrh	w0, [x1, 3456]
+	cmp	w0, w23
+	beq	.L2758
+	add	w0, w0, w24
+	strh	w0, [x1, 3456]
+	add	x0, x20, :lo12:.LANCHOR0
+	ldrh	w0, [x0, 2544]
+	cmp	w0, w28
+	bls	.L2758
+.L2729:
+	ldr	w0, [x29, 136]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 208
 	ret
 	.size	FtlGcScanTempBlk, .-FtlGcScanTempBlk
 	.align	2
 	.global	FtlReadRefresh
 	.type	FtlReadRefresh, %function
 FtlReadRefresh:
+	adrp	x1, .LANCHOR2
+	add	x0, x1, :lo12:.LANCHOR2
+	add	x2, x0, 848
+	ldr	w3, [x2, 80]
+	cbz	w3, .L2779
+	adrp	x1, .LANCHOR0
+	add	x1, x1, :lo12:.LANCHOR0
+	ldr	w4, [x2, 84]
+	ldr	w3, [x1, 2616]
+	cmp	w4, w3
+	bcs	.L2780
 	stp	x29, x30, [sp, -112]!
-	adrp	x2, .LANCHOR2
-	add	x1, x2, :lo12:.LANCHOR2
 	add	x29, sp, 0
-	add	x3, x1, 856
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	adrp	x20, .LANCHOR0
-	ldr	w0, [x3,80]
-	cbz	w0, .L2831
-	add	x0, x20, :lo12:.LANCHOR0
-	ldr	w2, [x3,84]
-	ldr	w0, [x0,2616]
-	cmp	w2, w0
-	bcs	.L2832
+	stp	x19, x20, [sp, 16]
+	mov	x19, x0
+	mov	x20, x1
+	stp	x21, x22, [sp, 32]
 	mov	w21, 2048
-	mov	x19, x1
-.L2837:
-	add	x22, x19, 856
-	add	x1, x20, :lo12:.LANCHOR0
-	ldr	w0, [x22,84]
-	ldr	w1, [x1,2616]
+.L2785:
+	add	x22, x19, 848
+	ldr	w1, [x20, 2616]
+	ldr	w0, [x22, 84]
 	cmp	w0, w1
-	bcs	.L2836
+	bcc	.L2781
+.L2784:
+	ldp	x19, x20, [sp, 16]
+	mov	w0, -1
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 112
+	ret
+.L2781:
 	add	x1, x29, 52
 	mov	w2, 0
 	bl	log2phys
-	ldr	w0, [x22,84]
-	ldr	w1, [x29,52]
+	ldr	w0, [x22, 84]
+	ldr	w1, [x29, 52]
 	add	w0, w0, 1
-	str	w0, [x22,84]
+	str	w0, [x22, 84]
 	cmn	w1, #1
-	beq	.L2835
-	str	w1, [x29,60]
+	beq	.L2783
+	str	w0, [x29, 80]
+	add	x0, x29, 112
+	str	w1, [x29, 60]
 	mov	w2, 0
-	str	w0, [x29,80]
+	stp	xzr, xzr, [x29, 64]
 	mov	w1, 1
-	add	x0, x29, 56
-	str	xzr, [x29,64]
-	str	xzr, [x29,72]
-	str	wzr, [x29,56]
+	str	wzr, [x0, -56]!
 	bl	FlashReadPages
-	ldr	w0, [x29,56]
+	ldr	w0, [x29, 56]
 	cmp	w0, 256
-	bne	.L2836
-	ldr	w0, [x29,52]
-	lsr	x0, x0, 10
+	bne	.L2784
+	ldr	w0, [x29, 52]
+	lsr	w0, w0, 10
 	bl	P2V_block_in_plane
 	bl	FtlGcRefreshBlock
-.L2836:
-	mov	w0, -1
-	b	.L2839
-.L2835:
+	b	.L2784
+.L2783:
 	subs	w21, w21, #1
-	bne	.L2837
-	b	.L2836
-.L2832:
-	ldr	w0, [x1,720]
-	str	wzr, [x3,80]
-	str	wzr, [x3,84]
-	str	w0, [x3,76]
-	b	.L2846
-.L2831:
-	ldr	w4, [x1,772]
-	mov	w6, 10000
-	mov	w8, 63
-	ldr	w7, [x1,720]
-	cmp	w4, w6
+	bne	.L2785
+	b	.L2784
+.L2780:
+	ldr	w0, [x0, 720]
+	stp	w0, wzr, [x2, 76]
+	str	wzr, [x2, 84]
+.L2792:
+	mov	w0, 0
+	ret
+.L2779:
+	ldr	w4, [x0, 772]
+	mov	w3, 10000
+	ldr	w5, [x0, 720]
 	mov	w6, 31
-	csel	w8, w6, w8, hi
-	ldr	w6, [x3,76]
-	add	x20, x20, :lo12:.LANCHOR0
-	add	w9, w7, 1048576
-	cmp	w6, w9
-	ldr	w5, [x20,2616]
-	bhi	.L2841
-	mov	w9, 1000
+	cmp	w4, w3
+	ldr	w7, [x2, 76]
+	mov	w3, 63
+	csel	w6, w6, w3, hi
+	add	w3, w5, 1048576
+	cmp	w7, w3
+	bhi	.L2789
+	adrp	x3, .LANCHOR0+2616
+	mov	w8, 1000
 	lsr	w4, w4, 10
+	ldr	w3, [x3, #:lo12:.LANCHOR0+2616]
 	add	w4, w4, 1
-	mul	w5, w5, w9
-	udiv	w4, w5, w4
-	add	w4, w4, w6
-	cmp	w4, w7
-	bcc	.L2841
-	ldrh	w1, [x1,484]
-	tst	w8, w1
-	bne	.L2839
-	ldr	w3, [x3,100]
-	cmp	w3, w1
-	beq	.L2839
-.L2841:
-	add	x0, x2, :lo12:.LANCHOR2
-	add	x1, x0, 856
-	ldrh	w0, [x0,484]
-	str	w0, [x1,100]
+	mul	w3, w3, w8
+	udiv	w3, w3, w4
+	add	w3, w3, w7
+	cmp	w5, w3
+	bhi	.L2789
+	ldrh	w0, [x0, 484]
+	tst	w6, w0
+	bne	.L2792
+	ldr	w2, [x2, 100]
+	cmp	w0, w2
+	beq	.L2792
+.L2789:
+	add	x0, x1, :lo12:.LANCHOR2
+	add	x1, x0, 848
+	ldrh	w0, [x0, 484]
+	str	w0, [x1, 100]
+	str	w5, [x1, 76]
 	mov	w0, 1
-	str	wzr, [x1,84]
-	str	w0, [x1,80]
-	str	w7, [x1,76]
-.L2846:
-	mov	w0, 0
-.L2839:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 112
-	ret
+	str	wzr, [x1, 84]
+	str	w0, [x1, 80]
+	b	.L2792
 	.size	FtlReadRefresh, .-FtlReadRefresh
 	.align	2
 	.global	FtlGcFreeTempBlock
 	.type	FtlGcFreeTempBlock, %function
 FtlGcFreeTempBlock:
-	stp	x29, x30, [sp, -96]!
+	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
 	add	x2, x19, :lo12:.LANCHOR2
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
 	adrp	x21, .LANCHOR0
+	stp	x25, x26, [sp, 64]
 	add	x1, x21, :lo12:.LANCHOR0
-	ldr	w3, [x2,424]
-	ldrh	w1, [x1,2544]
-	cbnz	w3, .L2883
-	ldrh	w20, [x2,656]
-	mov	w4, 65535
-	cmp	w20, w4
-	bne	.L2850
-.L2859:
-	add	x20, x19, :lo12:.LANCHOR2
-	mov	w0, 65535
-	add	x22, x20, 656
-	ldrh	w1, [x20,656]
-	str	wzr, [x20,3888]
-	cmp	w1, w0
-	beq	.L2883
+	str	x27, [sp, 80]
+	ldr	w3, [x2, 424]
+	ldrh	w1, [x1, 2544]
+	cbz	w3, .L2799
+.L2836:
+	mov	w0, 0
+.L2798:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldr	x27, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L2799:
+	ldrh	w20, [x2, 656]
+	mov	w3, 65535
+	cmp	w20, w3
+	bne	.L2801
+.L2810:
+	add	x20, x19, :lo12:.LANCHOR2
+	mov	w0, 65535
+	add	x22, x20, 656
+	ldrh	w1, [x20, 656]
+	str	wzr, [x20, 3880]
+	cmp	w1, w0
+	beq	.L2836
+	add	x23, x21, :lo12:.LANCHOR0
 	bl	FtlCacheWriteBack
+	ldrb	w0, [x22, 7]
 	mov	w26, 12
-	add	x3, x21, :lo12:.LANCHOR0
-	ldrb	w0, [x22,7]
-	ldr	x1, [x20,520]
+	ldr	x1, [x20, 520]
 	mov	w22, 0
-	ldrh	w2, [x20,656]
-	ldrh	w3, [x3,2544]
+	ldrh	w3, [x23, 2544]
+	ldrh	w2, [x20, 656]
 	mul	w0, w0, w3
-	strh	w0, [x1,x2,lsl 1]
-	ldr	w0, [x20,740]
-	ldrh	w1, [x20,1440]
-	add	w0, w1, w0
-	str	w0, [x20,740]
-	b	.L2860
-.L2850:
-	cbz	w0, .L2853
+	strh	w0, [x1, x2, lsl 1]
+	ldr	w1, [x20, 740]
+	ldrh	w0, [x20, 1432]
+	add	w0, w0, w1
+	str	w0, [x20, 740]
+.L2811:
+	ldrh	w0, [x20, 1432]
+	cmp	w0, w22
+	bhi	.L2815
+	mov	w0, -1
+	bl	decrement_vpc_count
+	add	x0, x21, :lo12:.LANCHOR0
+	ldrb	w0, [x0, 204]
+	cbz	w0, .L2816
+	ldrh	w1, [x20, 656]
+	adrp	x0, .LC154
+	add	x0, x0, :lo12:.LC154
+	bl	printk
+.L2816:
+	add	x1, x19, :lo12:.LANCHOR2
+	ldrh	w0, [x1, 656]
+	ldr	x1, [x1, 520]
+	ubfiz	x2, x0, 1, 16
+	ldrh	w1, [x1, x2]
+	cbz	w1, .L2817
+	bl	INSERT_DATA_LIST
+.L2818:
+	add	x20, x19, :lo12:.LANCHOR2
+	mov	w22, -1
+	strh	wzr, [x20, 1432]
+	strh	w22, [x20, 656]
+	strh	wzr, [x20, 1420]
+	bl	l2p_flush
+	bl	FtlVpcTblFlush
+	strh	w22, [x20, 800]
+	add	x0, x21, :lo12:.LANCHOR0
+	ldr	w0, [x0, 2372]
+	cbz	w0, .L2819
+	ldr	w0, [x20, 776]
+	cmp	w0, 39
+	bhi	.L2819
+	ldrh	w0, [x20, 780]
+	ldrh	w1, [x20, 552]
+	cmp	w1, w0
+	bcs	.L2836
+	ubfiz	w0, w0, 1, 15
+	strh	w0, [x20, 1364]
+	b	.L2836
+.L2801:
+	cbz	w0, .L2804
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	ldrh	w5, [x0,3456]
-	cmp	w5, w4
-	beq	.L2854
-.L2855:
+	ldrh	w4, [x0, 3456]
+	cmp	w4, w3
+	beq	.L2805
+.L2806:
 	mov	w1, 2
-	b	.L2853
-.L2854:
-	strh	w3, [x0,3456]
-	ldrh	w0, [x2,552]
-	cmp	w0, 17
-	bhi	.L2855
-.L2853:
+.L2804:
 	add	x22, x19, :lo12:.LANCHOR2
 	add	x0, x22, 656
 	bl	FtlGcScanTempBlk
-	str	w0, [x29,92]
+	str	w0, [x29, 108]
 	cmn	w0, #1
-	beq	.L2856
+	beq	.L2807
+	ldr	x1, [x22, 440]
 	ubfiz	x20, x20, 1, 16
-	ldr	x1, [x22,440]
-	ldrh	w0, [x1,x20]
+	ldrh	w0, [x1, x20]
 	cmp	w0, 4
-	bls	.L2857
+	bls	.L2808
 	sub	w0, w0, #5
-	strh	w0, [x1,x20]
+	strh	w0, [x1, x20]
 	mov	w0, 1
 	bl	FtlEctTblFlush
-.L2857:
+.L2808:
 	add	x0, x19, :lo12:.LANCHOR2
-	ldr	w1, [x0,3888]
-	cbnz	w1, .L2858
-	ldr	w1, [x0,952]
+	ldr	w1, [x0, 3880]
+	cbnz	w1, .L2809
+	ldr	w1, [x0, 944]
 	add	w1, w1, 1
-	str	w1, [x0,952]
-	ldr	w0, [x29,92]
+	str	w1, [x0, 944]
+	ldr	w0, [x29, 108]
 	lsr	w0, w0, 10
 	bl	FtlBbmMapBadBlock
 	bl	FtlBbmTblFlush
-.L2858:
+.L2809:
 	add	x19, x19, :lo12:.LANCHOR2
+	str	wzr, [x19, 3880]
+.L2821:
 	mov	w0, 1
-	str	wzr, [x19,3888]
-	b	.L2849
-.L2856:
+	b	.L2798
+.L2805:
+	strh	wzr, [x0, 3456]
+	ldrh	w0, [x2, 552]
+	cmp	w0, 17
+	bhi	.L2806
+	b	.L2804
+.L2807:
 	adrp	x0, .LANCHOR1+3456
-	mov	w1, 65535
-	ldrh	w2, [x0,#:lo12:.LANCHOR1+3456]
-	mov	w0, 1
-	cmp	w2, w1
-	bne	.L2849
-	b	.L2859
-.L2863:
-	ldr	w1, [x23,4]
-	cmp	w0, w1
-	bne	.L2881
-.L2862:
-	add	w22, w22, 1
-	uxth	w22, w22
-.L2860:
-	ldrh	w0, [x20,1440]
-	cmp	w0, w22
-	bls	.L2884
-	umull	x24, w22, w26
-	ldr	x25, [x20,1448]
-	add	x1, x21, :lo12:.LANCHOR0
-	add	x23, x25, x24
-	ldr	w1, [x1,2616]
-	ldr	w0, [x23,8]
+	ldrh	w1, [x0, #:lo12:.LANCHOR1+3456]
+	mov	w0, 65535
+	cmp	w1, w0
+	bne	.L2821
+	b	.L2810
+.L2815:
+	umull	x25, w22, w26
+	ldr	x27, [x20, 1440]
+	ldr	w1, [x23, 2616]
+	add	x24, x27, x25
+	ldr	w0, [x24, 8]
 	cmp	w0, w1
-	bcs	.L2881
-	add	x1, x29, 92
+	bcc	.L2812
+.L2833:
+	ldrh	w0, [x20, 656]
+	b	.L2834
+.L2812:
+	add	x1, x29, 108
 	mov	w2, 0
 	bl	log2phys
-	ldr	w0, [x29,92]
-	ldr	w1, [x25,x24]
+	ldr	w0, [x27, x25]
+	ldr	w1, [x29, 108]
 	cmp	w0, w1
-	bne	.L2863
-	lsr	x0, x0, 10
+	bne	.L2814
+	lsr	w0, w0, 10
 	bl	P2V_block_in_plane
-	mov	w24, w0
-	ldr	w0, [x23,8]
-	add	x1, x23, 4
+	mov	w25, w0
+	ldr	w0, [x24, 8]
 	mov	w2, 1
+	add	x1, x24, 4
 	bl	log2phys
-	mov	w0, w24
-	b	.L2882
-.L2881:
-	ldrh	w0, [x20,656]
-.L2882:
-	bl	decrement_vpc_count
-	b	.L2862
-.L2884:
-	mov	w0, -1
+	mov	w0, w25
+.L2834:
 	bl	decrement_vpc_count
-	add	x0, x21, :lo12:.LANCHOR0
-	ldrb	w0, [x0,204]
-	cbz	w0, .L2865
-	adrp	x0, .LC154
-	ldrh	w1, [x20,656]
-	add	x0, x0, :lo12:.LC154
-	bl	printk
-.L2865:
-	add	x1, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x1,656]
-	ldr	x1, [x1,520]
-	ubfiz	x2, x0, 1, 16
-	ldrh	w1, [x1,x2]
-	cbz	w1, .L2866
-	bl	INSERT_DATA_LIST
-	b	.L2867
-.L2866:
-	bl	INSERT_FREE_LIST
-.L2867:
-	add	x20, x19, :lo12:.LANCHOR2
-	mov	w22, -1
-	strh	wzr, [x20,1440]
-	strh	w22, [x20,656]
-	strh	wzr, [x20,1428]
-	bl	l2p_flush
-	bl	FtlVpcTblFlush
-	strh	w22, [x20,800]
-	add	x0, x21, :lo12:.LANCHOR0
-	ldr	w0, [x0,2372]
-	cbz	w0, .L2868
-	ldr	w0, [x20,776]
-	cmp	w0, 39
-	bhi	.L2868
-	ldrh	w0, [x20,780]
-	ldrh	w1, [x20,552]
+	b	.L2813
+.L2814:
+	ldr	w0, [x24, 4]
 	cmp	w1, w0
-	bcs	.L2883
-	lsl	w0, w0, 1
-	strh	w0, [x20,1368]
-.L2883:
-	mov	w0, 0
-	b	.L2849
-.L2868:
+	bne	.L2833
+.L2813:
+	add	w22, w22, 1
+	and	w22, w22, 65535
+	b	.L2811
+.L2817:
+	bl	INSERT_FREE_LIST
+	b	.L2818
+.L2819:
 	add	x19, x19, :lo12:.LANCHOR2
-	ldrh	w1, [x19,780]
-	ldrh	w0, [x19,552]
-	add	w2, w1, w1, lsl 1
-	cmp	w0, w2, lsr 2
-	ble	.L2883
+	ldrh	w0, [x19, 780]
+	ldrh	w1, [x19, 552]
+	add	w2, w0, w0, lsl 1
+	cmp	w1, w2, lsr 2
+	ble	.L2836
 	add	x21, x21, :lo12:.LANCHOR0
-	ldrb	w0, [x21,204]
-	cbz	w0, .L2869
-	sub	w1, w1, #2
-	strh	w1, [x19,1368]
-	b	.L2883
-.L2869:
-	mov	w1, 20
-	strh	w1, [x19,1368]
-.L2849:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 96
-	ret
+	ldrb	w1, [x21, 204]
+	cbz	w1, .L2820
+	sub	w0, w0, #2
+.L2835:
+	strh	w0, [x19, 1364]
+	b	.L2836
+.L2820:
+	mov	w0, 20
+	b	.L2835
 	.size	FtlGcFreeTempBlock, .-FtlGcFreeTempBlock
 	.align	2
 	.global	FtlGcPageRecovery
@@ -18566,28 +18188,28 @@ FtlGcFreeTempBlock:
 FtlGcPageRecovery:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR0
-	adrp	x19, .LANCHOR2
 	add	x20, x20, :lo12:.LANCHOR0
+	adrp	x19, .LANCHOR2
 	add	x19, x19, :lo12:.LANCHOR2
-	str	x21, [sp,32]
+	str	x21, [sp, 32]
 	add	x21, x19, 656
+	ldrh	w1, [x20, 2544]
 	mov	x0, x21
-	ldrh	w1, [x20,2544]
 	bl	FtlGcScanTempBlk
-	ldrh	w1, [x19,658]
-	ldrh	w0, [x20,2544]
+	ldrh	w1, [x19, 658]
+	ldrh	w0, [x20, 2544]
 	cmp	w1, w0
-	bcc	.L2885
-	add	x0, x19, 3800
+	bcc	.L2837
+	add	x0, x19, 3792
 	bl	FtlMapBlkWriteDumpData
 	mov	w0, 0
 	bl	FtlGcFreeTempBlock
-	str	wzr, [x19,3888]
-.L2885:
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
+	str	wzr, [x19, 3880]
+.L2837:
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	FtlGcPageRecovery, .-FtlGcPageRecovery
@@ -18596,12 +18218,12 @@ FtlGcPageRecovery:
 	.type	FtlPowerLostRecovery, %function
 FtlPowerLostRecovery:
 	stp	x29, x30, [sp, -32]!
-	adrp	x0, .LANCHOR5+1332
+	adrp	x0, .LANCHOR4+1848
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	str	wzr, [x0,#:lo12:.LANCHOR5+1332]
 	add	x19, x19, :lo12:.LANCHOR2
+	str	wzr, [x0, #:lo12:.LANCHOR4+1848]
 	add	x20, x19, 560
 	add	x19, x19, 608
 	mov	x0, x20
@@ -18616,7 +18238,7 @@ FtlPowerLostRecovery:
 	mov	w0, -1
 	bl	decrement_vpc_count
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	FtlPowerLostRecovery, .-FtlPowerLostRecovery
@@ -18627,31 +18249,37 @@ FtlSysBlkInit:
 	stp	x29, x30, [sp, -64]!
 	mov	w1, -1
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR0
-	adrp	x21, .LANCHOR5
-	stp	x23, x24, [sp,48]
-	add	x0, x21, :lo12:.LANCHOR5
+	stp	x23, x24, [sp, 48]
 	add	x24, x20, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	adrp	x21, .LANCHOR4
+	add	x0, x21, :lo12:.LANCHOR4
 	adrp	x19, .LANCHOR2
 	add	x23, x19, :lo12:.LANCHOR2
-	strh	w1, [x0,1328]
-	strh	wzr, [x0,1330]
-	ldrh	w0, [x24,2476]
+	strh	w1, [x0, 1842]
+	strh	wzr, [x0, 1844]
+	ldrh	w0, [x24, 2476]
 	bl	FtlFreeSysBlkQueueInit
 	bl	FtlScanSysBlk
-	ldrh	w1, [x23,784]
+	ldrh	w1, [x23, 784]
 	mov	w0, 65535
 	cmp	w1, w0
-	bne	.L2889
-.L2891:
+	bne	.L2843
+.L2845:
 	mov	w22, -1
-	b	.L2890
-.L2889:
+.L2842:
+	mov	w0, w22
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 64
+	ret
+.L2843:
 	bl	FtlLoadSysInfo
 	mov	w22, w0
-	cbnz	w0, .L2891
+	cbnz	w0, .L2845
 	bl	FtlLoadMapInfo
 	bl	FtlLoadVonderInfo
 	bl	Ftl_load_ext_data
@@ -18661,95 +18289,92 @@ FtlSysBlkInit:
 	bl	FtlPowerLostRecovery
 	mov	w0, 1
 	bl	FtlUpdateVaildLpn
-	ldrh	w2, [x24,2582]
-	mov	x1, 0
-	ldr	x0, [x23,704]
-.L2892:
-	cmp	w1, w2
-	mov	w3, w1
-	bge	.L2896
-	add	x4, x0, x1, lsl 4
-	add	x1, x1, 1
-	ldr	w4, [x4,4]
-	tbz	w4, #31, .L2892
-.L2896:
-	add	x0, x19, :lo12:.LANCHOR2
-	cmp	w3, w2
-	ldrh	w1, [x0,484]
-	add	w1, w1, 1
-	strh	w1, [x0,484]
-	blt	.L2893
-	add	x21, x21, :lo12:.LANCHOR5
-	ldrh	w0, [x21,1330]
-	cbz	w0, .L2897
-.L2893:
+	ldr	x1, [x23, 704]
+	mov	w0, 0
+	ldrh	w3, [x24, 2582]
+	add	x1, x1, 4
+.L2846:
+	cmp	w0, w3
+	bge	.L2851
+	ldr	w2, [x1], 16
+	tbz	w2, #31, .L2847
+.L2851:
 	add	x1, x19, :lo12:.LANCHOR2
-	ldrh	w2, [x1,560]
-	ldr	x4, [x1,520]
+	cmp	w0, w3
+	ldrh	w2, [x1, 484]
+	add	w2, w2, 1
+	strh	w2, [x1, 484]
+	bge	.L2858
+.L2848:
+	add	x0, x19, :lo12:.LANCHOR2
+	ldrh	w2, [x0, 560]
+	ldr	x4, [x0, 520]
+	ldrh	w5, [x0, 564]
 	lsl	x2, x2, 1
-	ldrh	w5, [x1,564]
-	ldrh	w3, [x4,x2]
+	ldrh	w3, [x4, x2]
 	sub	w3, w3, w5
-	strh	w3, [x4,x2]
+	strh	w3, [x4, x2]
 	add	x4, x20, :lo12:.LANCHOR0
-	strb	wzr, [x1,566]
-	ldr	x5, [x1,520]
-	strh	wzr, [x1,564]
-	ldrh	w2, [x4,2544]
-	strh	w2, [x1,562]
-	ldrh	w2, [x1,608]
-	ldrh	w6, [x1,612]
+	strb	wzr, [x0, 566]
+	ldr	x5, [x0, 520]
+	strh	wzr, [x0, 564]
+	ldrh	w2, [x4, 2544]
+	strh	w2, [x0, 562]
+	ldrh	w2, [x0, 608]
+	ldrh	w6, [x0, 612]
 	lsl	x2, x2, 1
-	ldrh	w3, [x5,x2]
+	ldrh	w3, [x5, x2]
 	sub	w3, w3, w6
-	strh	w3, [x5,x2]
-	strb	wzr, [x1,614]
-	ldrh	w0, [x1,486]
-	ldrh	w2, [x4,2544]
-	add	w0, w0, 1
-	strh	w2, [x1,610]
-	strh	wzr, [x1,612]
-	strh	w0, [x1,486]
+	strh	w3, [x5, x2]
+	strb	wzr, [x0, 614]
+	ldrh	w1, [x0, 486]
+	ldrh	w2, [x4, 2544]
+	add	w1, w1, 1
+	strh	w2, [x0, 610]
+	strh	w1, [x0, 486]
+	strh	wzr, [x0, 612]
 	bl	l2p_flush
 	bl	FtlVpcTblFlush
 	bl	FtlVpcTblFlush
-.L2897:
+	b	.L2852
+.L2847:
+	add	w0, w0, 1
+	b	.L2846
+.L2858:
+	add	x21, x21, :lo12:.LANCHOR4
+	ldrh	w0, [x21, 1844]
+	cbnz	w0, .L2848
+.L2852:
 	add	x21, x19, :lo12:.LANCHOR2
 	mov	w1, 65535
 	add	x24, x21, 560
-	ldrh	w0, [x21,560]
+	ldrh	w0, [x21, 560]
 	cmp	w0, w1
-	beq	.L2898
-	ldrh	w1, [x21,564]
-	cbnz	w1, .L2898
-	ldrh	w1, [x21,612]
+	beq	.L2853
+	ldrh	w1, [x21, 564]
+	cbnz	w1, .L2853
+	ldrh	w1, [x21, 612]
 	add	x23, x21, 608
-	cbnz	w1, .L2898
+	cbnz	w1, .L2853
 	bl	FtlGcRefreshOpenBlock
-	ldrh	w0, [x21,608]
+	ldrh	w0, [x21, 608]
 	bl	FtlGcRefreshOpenBlock
 	bl	FtlVpcTblFlush
 	mov	x0, x24
 	bl	allocate_new_data_superblock
 	mov	x0, x23
 	bl	allocate_new_data_superblock
-.L2898:
+.L2853:
 	add	x20, x20, :lo12:.LANCHOR0
-	ldrb	w0, [x20,72]
-	cbnz	w0, .L2899
+	ldrb	w0, [x20, 72]
+	cbnz	w0, .L2854
 	add	x19, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x19,484]
-	and	w0, w0, 31
-	cbnz	w0, .L2890
-.L2899:
+	ldrh	w0, [x19, 484]
+	tst	x0, 31
+	bne	.L2842
+.L2854:
 	bl	FtlVpcCheckAndModify
-.L2890:
-	mov	w0, w22
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 64
-	ret
+	b	.L2842
 	.size	FtlSysBlkInit, .-FtlSysBlkInit
 	.align	2
 	.global	FtlLowFormat
@@ -18757,295 +18382,299 @@ FtlSysBlkInit:
 FtlLowFormat:
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	add	x20, x19, :lo12:.LANCHOR2
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	ldr	w21, [x20,424]
-	cbnz	w21, .L2907
-	adrp	x22, .LANCHOR0
-	ldr	x0, [x20,3768]
-	add	x23, x22, :lo12:.LANCHOR0
-	mov	w1, w21
-	ldrh	w2, [x23,2580]
+	stp	x21, x22, [sp, 32]
+	add	x21, x19, :lo12:.LANCHOR2
+	stp	x23, x24, [sp, 48]
+	ldr	w0, [x21, 424]
+	cbnz	w0, .L2862
+	adrp	x20, .LANCHOR0
+	add	x22, x20, :lo12:.LANCHOR0
+	ldr	x0, [x21, 3760]
+	mov	w1, 0
+	ldrh	w2, [x22, 2580]
 	lsl	w2, w2, 2
 	bl	ftl_memset
-	ldrh	w2, [x23,2580]
-	mov	w1, w21
-	ldr	x0, [x20,3760]
+	ldr	x0, [x21, 3752]
+	mov	w1, 0
+	ldrh	w2, [x22, 2580]
 	lsl	w2, w2, 2
 	bl	ftl_memset
-	str	w21, [x20,752]
-	ldrh	w0, [x23,2476]
-	str	w21, [x20,756]
+	ldrh	w0, [x22, 2476]
+	str	wzr, [x21, 752]
+	str	wzr, [x21, 756]
 	bl	FtlFreeSysBlkQueueInit
 	bl	FtlLoadBbt
-	cbz	w0, .L2908
+	cbz	w0, .L2863
 	bl	FtlMakeBbt
-.L2908:
-	mov	w0, 0
-.L2909:
-	add	x1, x22, :lo12:.LANCHOR0
-	ldrh	w2, [x1,2550]
-	cmp	w0, w2, lsl 7
-	bge	.L2936
+.L2863:
+	mov	w5, 23752
+	add	x2, x20, :lo12:.LANCHOR0
 	add	x3, x19, :lo12:.LANCHOR2
-	ubfiz	x2, x0, 2, 16
-	mvn	w1, w0
-	ldr	x4, [x3,3648]
-	orr	w1, w0, w1, lsl 16
-	add	w0, w0, 1
-	str	w1, [x4,x2]
-	mov	w1, 23752
-	movk	w1, 0xa0f, lsl 16
-	uxth	w0, w0
-	ldr	x3, [x3,3656]
-	str	w1, [x3,x2]
-	b	.L2909
-.L2936:
-	ldrh	w21, [x1,2480]
-	mov	w20, 0
-.L2911:
-	add	x23, x22, :lo12:.LANCHOR0
-	ldrh	w0, [x23,2482]
-	cmp	w0, w21
-	bls	.L2937
-	mov	w0, w21
-	mov	w1, 1
-	add	w21, w21, 1
-	bl	FtlLowFormatEraseBlock
-	add	w0, w20, w0
-	uxth	w21, w21
-	uxth	w20, w0
-	b	.L2911
-.L2937:
-	ldrh	w0, [x23,2472]
-	sub	w1, w20, #3
+	mov	w0, 0
+	movk	w5, 0xa0f, lsl 16
+.L2864:
+	ldrh	w1, [x2, 2550]
+	cmp	w0, w1, lsl 7
+	blt	.L2865
+	ldrh	w22, [x2, 2480]
+	add	x23, x20, :lo12:.LANCHOR0
+	mov	w21, 0
+.L2866:
+	ldrh	w0, [x23, 2482]
+	cmp	w0, w22
+	bhi	.L2867
+	ldrh	w0, [x23, 2472]
+	sub	w1, w21, #3
 	cmp	w1, w0, lsl 1
-	blt	.L2913
-	udiv	w0, w20, w0
-	ldr	w20, [x23,2576]
-	add	w0, w0, w20
-	mov	w20, 0
+	blt	.L2868
+	udiv	w0, w21, w0
+	ldr	w21, [x23, 2576]
+	add	w0, w0, w21
 	bl	FtlSysBlkNumInit
-	ldrh	w0, [x23,2476]
+	ldrh	w0, [x23, 2476]
+	mov	w21, 0
 	bl	FtlFreeSysBlkQueueInit
-	ldrh	w21, [x23,2480]
-.L2914:
-	add	x0, x22, :lo12:.LANCHOR0
-	ldrh	w0, [x0,2482]
-	cmp	w0, w21
-	bls	.L2913
-	mov	w0, w21
-	mov	w1, 1
-	add	w21, w21, 1
-	bl	FtlLowFormatEraseBlock
-	add	w0, w20, w0
-	uxth	w21, w21
-	uxth	w20, w0
-	b	.L2914
-.L2913:
-	mov	w23, 0
-	mov	w21, w23
-.L2916:
-	add	x0, x22, :lo12:.LANCHOR0
-	ldrh	w1, [x0,2480]
-	cmp	w1, w21
-	bls	.L2938
-	mov	w0, w21
-	mov	w1, 0
-	add	w21, w21, 1
-	bl	FtlLowFormatEraseBlock
-	add	w0, w23, w0
-	uxth	w21, w21
-	uxth	w23, w0
-	b	.L2916
-.L2938:
-	add	x4, x19, :lo12:.LANCHOR2
-	ldrh	w1, [x0,2482]
-	ldrh	w2, [x0,2472]
-	str	w1, [x4,3580]
-	ldr	w1, [x0,2484]
-	udiv	w3, w1, w2
-	str	w3, [x0,2616]
-	ubfx	x6, x3, 5, 16
-	add	w5, w6, 36
-	strh	w5, [x4,780]
+	ldrh	w22, [x23, 2480]
+	add	x23, x20, :lo12:.LANCHOR0
+.L2869:
+	ldrh	w0, [x23, 2482]
+	cmp	w0, w22
+	bhi	.L2870
+.L2868:
+	add	x23, x20, :lo12:.LANCHOR0
+	mov	w22, 0
+	mov	w24, 0
+.L2871:
+	ldrh	w0, [x23, 2480]
+	cmp	w0, w24
+	bhi	.L2872
+	add	x1, x19, :lo12:.LANCHOR2
+	ldrh	w0, [x23, 2482]
+	ldr	w2, [x23, 2484]
+	str	w0, [x1, 3572]
+	ldrh	w0, [x23, 2472]
+	udiv	w4, w2, w0
+	ubfx	x3, x4, 5, 16
+	str	w4, [x23, 2616]
+	add	w5, w3, 36
+	strh	w5, [x1, 780]
 	mov	w5, 24
-	mul	w5, w2, w5
-	cmp	w23, w5
-	ble	.L2918
-	sub	w1, w1, w23
-	udiv	w1, w1, w2
-	str	w1, [x0,2616]
-	lsr	w1, w1, 5
-	add	w1, w1, 24
-	strh	w1, [x4,780]
-.L2918:
-	add	x0, x22, :lo12:.LANCHOR0
-	ldr	w0, [x0,2372]
-	cmp	w0, 1
-	bne	.L2919
+	mul	w5, w0, w5
+	cmp	w22, w5
+	ble	.L2873
+	sub	w2, w2, w22
+	udiv	w2, w2, w0
+	str	w2, [x23, 2616]
+	lsr	w2, w2, 5
+	add	w2, w2, 24
+	strh	w2, [x1, 780]
+.L2873:
+	add	x1, x20, :lo12:.LANCHOR0
+	ldr	w1, [x1, 2372]
+	cmp	w1, 1
+	bne	.L2874
+	udiv	w2, w22, w0
 	add	x1, x19, :lo12:.LANCHOR2
-	udiv	w0, w23, w2
-	ldrh	w4, [x1,780]
-	add	w0, w4, w0
-	add	w0, w4, w0, asr 2
-	strh	w0, [x1,780]
-.L2919:
-	add	x0, x22, :lo12:.LANCHOR0
-	ldrb	w0, [x0,204]
-	cbz	w0, .L2920
+	ldrh	w5, [x1, 780]
+	add	w2, w2, w5
+	add	w2, w5, w2, asr 2
+	strh	w2, [x1, 780]
+.L2874:
+	add	x1, x20, :lo12:.LANCHOR0
+	ldrb	w1, [x1, 204]
+	cbz	w1, .L2875
+	udiv	w2, w22, w0
 	add	x1, x19, :lo12:.LANCHOR2
-	udiv	w0, w23, w2
-	ldrh	w4, [x1,780]
-	add	w0, w4, w0
-	add	w0, w4, w0, asr 2
-	strh	w0, [x1,780]
-.L2920:
-	add	x5, x22, :lo12:.LANCHOR0
-	ldrh	w1, [x5,2538]
-	cbz	w1, .L2922
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w4, [x0,780]
-	add	w4, w4, w1, lsr 1
-	strh	w4, [x0,780]
-	mul	w4, w1, w2
-	cmp	w4, w23
-	ble	.L2922
+	ldrh	w5, [x1, 780]
+	add	w2, w2, w5
+	add	w2, w5, w2, asr 2
+	strh	w2, [x1, 780]
+.L2875:
+	add	x6, x20, :lo12:.LANCHOR0
+	ldrh	w1, [x6, 2538]
+	cbz	w1, .L2877
+	add	x2, x19, :lo12:.LANCHOR2
+	ldrh	w5, [x2, 780]
+	add	w5, w5, w1, lsr 1
+	strh	w5, [x2, 780]
+	mul	w5, w1, w0
+	cmp	w22, w5
+	bge	.L2877
 	add	w1, w1, 32
-	str	w3, [x5,2616]
-	add	w1, w6, w1
-	strh	w1, [x0,780]
-.L2922:
-	add	x24, x22, :lo12:.LANCHOR0
-	add	x0, x19, :lo12:.LANCHOR2
-	adrp	x21, .LANCHOR4
-	ldr	w1, [x24,2616]
-	ldrh	w0, [x0,780]
-	sub	w0, w1, w0
-	add	x1, x21, :lo12:.LANCHOR4
-	mul	w0, w0, w2
-	str	w0, [x1,1760]
-	ldrh	w1, [x24,2544]
-	mul	w0, w0, w1
-	ldrh	w1, [x24,2550]
-	str	w0, [x24,2616]
-	mul	w0, w0, w1
-	str	w0, [x24,2584]
+	str	w4, [x6, 2616]
+	add	w1, w3, w1
+	strh	w1, [x2, 780]
+.L2877:
+	add	x24, x20, :lo12:.LANCHOR0
+	add	x1, x19, :lo12:.LANCHOR2
+	adrp	x23, .LANCHOR4
+	ldrh	w2, [x1, 780]
+	ldr	w1, [x24, 2616]
+	sub	w1, w1, w2
+	mul	w0, w1, w0
+	add	x1, x23, :lo12:.LANCHOR4
+	str	w0, [x1, 1768]
+	ldrh	w1, [x24, 2544]
+	mul	w0, w1, w0
+	ldrh	w1, [x24, 2550]
+	str	w0, [x24, 2616]
+	mul	w0, w1, w0
+	str	w0, [x24, 2584]
 	bl	FtlBbmTblFlush
-	ldr	w2, [x24,2488]
-	add	w1, w23, w20
-	ldrh	w0, [x24,2558]
+	ldrh	w0, [x24, 2558]
+	add	w1, w21, w22
+	ldr	w2, [x24, 2488]
 	add	w0, w0, w2, lsr 3
 	cmp	w1, w0
-	bls	.L2924
+	bls	.L2879
 	adrp	x0, .LC155
 	lsr	w2, w2, 5
 	add	x0, x0, :lo12:.LC155
 	bl	printk
-.L2924:
-	add	x24, x22, :lo12:.LANCHOR0
-	add	x19, x19, :lo12:.LANCHOR2
+.L2879:
+	add	x22, x20, :lo12:.LANCHOR0
+	add	x20, x19, :lo12:.LANCHOR2
+	add	x21, x20, 560
 	mov	w1, 0
-	add	x20, x19, 560
-	mov	w23, -1
-	ldrh	w2, [x24,2482]
-	ldr	x0, [x19,520]
+	mov	w24, -1
+	ldr	x0, [x20, 520]
+	ldrh	w2, [x22, 2482]
 	lsl	w2, w2, 1
 	bl	ftl_memset
-	str	wzr, [x19,716]
 	mov	w0, 1
-	ldrh	w2, [x24,2480]
-	strb	w0, [x20,8]
+	strb	w0, [x21, 8]
+	ldr	x0, [x22, 64]
 	mov	w1, 255
-	ldr	x0, [x22,#:lo12:.LANCHOR0]
+	ldrh	w2, [x22, 2480]
+	strh	w24, [x20, 800]
+	strh	wzr, [x20, 802]
+	strb	wzr, [x20, 806]
 	lsr	w2, w2, 3
-	strh	w23, [x19,800]
-	strh	wzr, [x19,802]
-	strb	wzr, [x19,806]
-	strb	wzr, [x19,808]
-	strh	wzr, [x20,2]
-	strb	wzr, [x20,6]
-	strh	wzr, [x19,560]
+	strb	wzr, [x20, 808]
+	strh	wzr, [x21, 2]
+	strb	wzr, [x21, 6]
+	strh	wzr, [x20, 560]
+	str	wzr, [x20, 716]
 	bl	ftl_memset
-.L2925:
-	mov	x0, x20
+.L2880:
+	mov	x0, x21
 	bl	make_superblock
-	ldrb	w0, [x20,7]
-	cbnz	w0, .L2926
-	ldrh	w1, [x20]
-	ldr	x0, [x19,520]
-	strh	w23, [x0,x1,lsl 1]
-	ldrh	w0, [x20]
+	ldrb	w1, [x21, 7]
+	ldrh	w0, [x21]
+	cbnz	w1, .L2881
+	ldr	x1, [x20, 520]
+	ubfiz	x0, x0, 1, 16
+	strh	w24, [x1, x0]
+	ldrh	w0, [x21]
 	add	w0, w0, 1
-	strh	w0, [x20]
-	b	.L2925
-.L2926:
-	ldr	w0, [x19,752]
-	mov	w22, -1
-	str	w0, [x20,12]
+	strh	w0, [x21]
+	b	.L2880
+.L2865:
+	ldr	x6, [x3, 3640]
+	ubfiz	x4, x0, 2, 16
+	mvn	w1, w0
+	orr	w1, w0, w1, lsl 16
 	add	w0, w0, 1
-	ldrh	w1, [x20]
-	str	w0, [x19,752]
-	ldr	x0, [x19,520]
-	ldrh	w2, [x20,4]
-	strh	w2, [x0,x1,lsl 1]
-	add	x0, x19, 608
-	strh	wzr, [x19,610]
-	ldrh	w1, [x20]
-	mov	x20, x0
-	strb	wzr, [x19,614]
+	and	w0, w0, 65535
+	str	w1, [x6, x4]
+	ldr	x1, [x3, 3648]
+	str	w5, [x1, x4]
+	b	.L2864
+.L2867:
+	mov	w0, w22
+	mov	w1, 1
+	add	w22, w22, 1
+	bl	FtlLowFormatEraseBlock
+	add	w21, w21, w0
+	and	w22, w22, 65535
+	and	w21, w21, 65535
+	b	.L2866
+.L2870:
+	mov	w0, w22
+	mov	w1, 1
+	add	w22, w22, 1
+	bl	FtlLowFormatEraseBlock
+	add	w21, w21, w0
+	and	w22, w22, 65535
+	and	w21, w21, 65535
+	b	.L2869
+.L2872:
+	mov	w0, w24
+	mov	w1, 0
+	add	w24, w24, 1
+	bl	FtlLowFormatEraseBlock
+	add	w22, w22, w0
+	and	w24, w24, 65535
+	and	w22, w22, 65535
+	b	.L2871
+.L2881:
+	ldr	w1, [x20, 752]
+	ubfiz	x0, x0, 1, 16
+	str	w1, [x21, 12]
+	add	x19, x19, :lo12:.LANCHOR2
+	add	w1, w1, 1
+	str	w1, [x20, 752]
+	ldr	x1, [x20, 520]
+	mov	w13, -1
+	ldrh	w2, [x21, 4]
+	strh	w2, [x1, x0]
+	add	x0, x20, 608
+	mov	x12, x0
+	strh	wzr, [x20, 610]
+	ldrh	w1, [x21]
+	strb	wzr, [x20, 614]
 	add	w1, w1, 1
-	strh	w1, [x19,608]
+	strh	w1, [x20, 608]
 	mov	w1, 1
-	strb	w1, [x19,616]
-.L2927:
-	mov	x0, x20
+	strb	w1, [x20, 616]
+.L2882:
+	mov	x0, x12
 	bl	make_superblock
-	ldrb	w0, [x20,7]
-	cbnz	w0, .L2928
-	ldrh	w1, [x20]
-	ldr	x0, [x19,520]
-	strh	w22, [x0,x1,lsl 1]
-	ldrh	w0, [x20]
+	ldrb	w1, [x12, 7]
+	ldrh	w0, [x12]
+	cbnz	w1, .L2883
+	ldr	x1, [x19, 520]
+	ubfiz	x0, x0, 1, 16
+	strh	w13, [x1, x0]
+	ldrh	w0, [x12]
 	add	w0, w0, 1
-	strh	w0, [x20]
-	b	.L2927
-.L2928:
-	ldr	w0, [x19,752]
-	add	x21, x21, :lo12:.LANCHOR4
-	str	w0, [x20,12]
-	add	w0, w0, 1
-	ldrh	w1, [x20]
-	str	w0, [x19,752]
-	ldr	x0, [x19,520]
-	ldrh	w2, [x20,4]
+	strh	w0, [x12]
+	b	.L2882
+.L2883:
+	ldr	w1, [x19, 752]
+	ubfiz	x0, x0, 1, 16
+	str	w1, [x12, 12]
+	add	x23, x23, :lo12:.LANCHOR4
+	add	w1, w1, 1
+	str	w1, [x19, 752]
+	ldr	x1, [x19, 520]
 	mov	w20, -1
-	strh	w2, [x0,x1,lsl 1]
-	strh	w20, [x19,656]
+	ldrh	w2, [x12, 4]
+	strh	w2, [x1, x0]
+	strh	w20, [x19, 656]
 	bl	FtlFreeSysBlkQueueOut
-	strh	w0, [x19,784]
-	ldr	w0, [x21,1760]
-	strh	w0, [x19,790]
-	ldr	w0, [x19,752]
-	str	w0, [x19,792]
+	strh	w0, [x19, 784]
+	ldr	w0, [x23, 1768]
+	strh	w0, [x19, 790]
+	ldr	w0, [x19, 752]
+	str	w0, [x19, 792]
 	add	w0, w0, 1
-	strh	wzr, [x19,786]
-	strh	w20, [x19,788]
-	str	w0, [x19,752]
+	strh	wzr, [x19, 786]
+	strh	w20, [x19, 788]
+	str	w0, [x19, 752]
 	bl	FtlVpcTblFlush
 	bl	FtlSysBlkInit
-	cbnz	w0, .L2907
+	cbnz	w0, .L2862
 	adrp	x0, .LANCHOR1+504
 	mov	w1, 1
-	str	w1, [x0,#:lo12:.LANCHOR1+504]
-.L2907:
+	str	w1, [x0, #:lo12:.LANCHOR1+504]
+.L2862:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
 	ldp	x29, x30, [sp], 64
 	ret
 	.size	FtlLowFormat, .-FtlLowFormat
@@ -19053,188 +18682,189 @@ FtlLowFormat:
 	.global	FtlReInitForSDUpdata
 	.type	FtlReInitForSDUpdata, %function
 FtlReInitForSDUpdata:
-	stp	x29, x30, [sp, -48]!
+	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR0
 	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x0,204]
-	cbz	w0, .L2940
-.L2942:
-	mov	w0, 0
-	b	.L2941
-.L2940:
+	str	x21, [sp, 32]
+	ldrb	w0, [x0, 204]
+	cbz	w0, .L2893
+.L2895:
+	mov	w21, 0
+.L2892:
+	mov	w0, w21
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 64
+	ret
+.L2893:
 	adrp	x20, .LANCHOR4
 	add	x0, x20, :lo12:.LANCHOR4
-	ldr	x0, [x0,1592]
+	ldr	x0, [x0, 1584]
 	bl	FlashInit
-	cbnz	w0, .L2942
+	mov	w21, w0
+	cbnz	w0, .L2895
 	bl	FlashLoadFactorBbt
-	cbz	w0, .L2943
+	cbz	w0, .L2896
 	bl	FlashMakeFactorBbt
-.L2943:
+.L2896:
 	add	x20, x20, :lo12:.LANCHOR4
-	ldr	x0, [x20,1648]
+	ldr	x0, [x20, 1656]
 	bl	FlashReadIdbDataRaw
-	cbz	w0, .L2944
-	mov	w1, 0
+	cbz	w0, .L2897
 	mov	w2, 16
-	add	x0, x29, 32
+	mov	w1, 0
+	add	x0, x29, 48
 	bl	FlashReadFacBbtData
+	ldr	w2, [x29, 48]
 	mov	w0, 0
-	ldr	w2, [x29,32]
-	mov	w1, w0
+	mov	w1, 0
 	mov	w4, 1
-.L2946:
+.L2899:
 	lsl	w3, w4, w1
 	add	w1, w1, 1
 	tst	w3, w2
-	cset	w3, ne
+	cinc	w0, w0, ne
 	cmp	w1, 16
-	add	w0, w0, w3
-	bne	.L2946
+	bne	.L2899
 	cmp	w0, 6
-	bhi	.L2947
-	add	x0, x19, :lo12:.LANCHOR0
-	b	.L2969
-.L2947:
-	mov	w1, 0
-	mov	w4, 1
-.L2950:
-	lsl	w3, w4, w1
-	add	w1, w1, 1
-	tst	w3, w2
-	cset	w3, ne
-	cmp	w1, 24
-	add	w0, w0, w3
-	bne	.L2950
-	cmp	w0, 17
+	bhi	.L2900
 	add	x0, x19, :lo12:.LANCHOR0
-	bls	.L2969
-	mov	w1, 36
-.L2969:
-	strb	w1, [x0,73]
+.L2923:
+	strb	w1, [x0, 73]
 	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w1, [x0,73]
-	strh	w1, [x0,202]
-.L2944:
-	adrp	x0, .LC75
-	adrp	x1, .LC76
-	add	x1, x1, :lo12:.LC76
-	add	x0, x0, :lo12:.LC75
+	ldrb	w1, [x0, 73]
+	strh	w1, [x0, 202]
+.L2897:
+	adrp	x1, .LC75
+	add	x1, x1, :lo12:.LC75
 	add	x19, x19, :lo12:.LANCHOR0
+	adrp	x0, .LC76
+	add	x0, x0, :lo12:.LC76
 	bl	printk
 	add	x0, x19, 176
 	bl	FtlConstantsInit
 	bl	FtlVariablesInit
-	ldrh	w0, [x19,2476]
+	ldrh	w0, [x19, 2476]
 	mov	w19, 1
 	bl	FtlFreeSysBlkQueueInit
-.L2952:
+.L2905:
 	bl	FtlLoadBbt
-	cbz	w0, .L2953
-.L2971:
+	cbz	w0, .L2906
+.L2925:
 	bl	FtlLowFormat
 	cmp	w19, 3
-	bhi	.L2972
+	bls	.L2907
+	mov	w21, -1
+	b	.L2892
+.L2900:
+	mov	w1, 0
+	mov	w4, 1
+.L2903:
+	lsl	w3, w4, w1
+	add	w1, w1, 1
+	tst	w3, w2
+	cinc	w0, w0, ne
+	cmp	w1, 24
+	bne	.L2903
+	cmp	w0, 17
+	add	x0, x19, :lo12:.LANCHOR0
+	bls	.L2923
+	mov	w1, 36
+	b	.L2923
+.L2907:
 	add	w19, w19, 1
-	b	.L2952
-.L2972:
-	mov	w0, -1
-	b	.L2941
-.L2953:
+	b	.L2905
+.L2906:
 	bl	FtlSysBlkInit
-	cbnz	w0, .L2971
-	adrp	x1, .LANCHOR1+504
-	mov	w2, 1
-	str	w2, [x1,#:lo12:.LANCHOR1+504]
-.L2941:
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 48
-	ret
+	cbnz	w0, .L2925
+	adrp	x0, .LANCHOR1+504
+	mov	w1, 1
+	str	w1, [x0, #:lo12:.LANCHOR1+504]
+	b	.L2892
 	.size	FtlReInitForSDUpdata, .-FtlReInitForSDUpdata
 	.align	2
 	.global	Ftl_gc_temp_data_write_back
 	.type	Ftl_gc_temp_data_write_back, %function
 Ftl_gc_temp_data_write_back:
-	stp	x29, x30, [sp, -48]!
-	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	adrp	x21, .LANCHOR2
-	add	x0, x21, :lo12:.LANCHOR2
-	stp	x19, x20, [sp,16]
-	ldr	w1, [x0,424]
-	cbz	w1, .L2974
-.L2977:
+	adrp	x12, .LANCHOR2
+	add	x0, x12, :lo12:.LANCHOR2
+	ldr	w1, [x0, 424]
+	cbz	w1, .L2927
+.L2941:
 	mov	w0, 0
-	b	.L2975
-.L2974:
+	ret
+.L2930:
+	mov	w0, 0
+.L2926:
+	ldr	x19, [sp, 16]
+	ldp	x29, x30, [sp], 32
+	ret
+.L2927:
 	adrp	x1, .LANCHOR0+204
-	ldrb	w1, [x1,#:lo12:.LANCHOR0+204]
-	cbz	w1, .L2976
-	ldr	w1, [x0,1384]
-	tbz	x1, 0, .L2976
-	ldrh	w0, [x0,660]
-	cbnz	w0, .L2977
-.L2976:
-	add	x1, x21, :lo12:.LANCHOR2
+	ldrb	w1, [x1, #:lo12:.LANCHOR0+204]
+	cbz	w1, .L2929
+	ldr	w1, [x0, 1380]
+	tbz	x1, 0, .L2929
+	ldrh	w0, [x0, 660]
+	cbnz	w0, .L2941
+.L2929:
+	stp	x29, x30, [sp, -32]!
+	mov	w3, 0
 	mov	w2, 0
-	mov	w3, w2
-	mov	w20, 0
-	mov	w22, 56
-	ldr	x0, [x1,3600]
-	ldr	w1, [x1,1384]
+	add	x29, sp, 0
+	str	x19, [sp, 16]
+	add	x19, x12, :lo12:.LANCHOR2
+	ldr	w1, [x19, 1380]
+	ldr	x0, [x19, 3592]
 	bl	FlashProgPages
-.L2978:
-	add	x19, x21, :lo12:.LANCHOR2
-	ldr	w1, [x19,1384]
-	cmp	w20, w1
-	bcs	.L2988
-	umull	x0, w20, w22
-	ldr	x3, [x19,3600]
-	add	x1, x3, x0
-	ldr	w3, [x3,x0]
-	cmn	w3, #1
-	ldr	x2, [x1,16]
-	bne	.L2979
-	ldrh	w2, [x19,656]
-	ldr	x1, [x19,520]
-	strh	wzr, [x1,x2,lsl 1]
-	strh	w3, [x19,656]
-	ldr	w1, [x19,952]
-	add	w1, w1, 1
-	str	w1, [x19,952]
-	ldr	x1, [x19,3600]
-	add	x0, x1, x0
-	ldr	w0, [x0,4]
+	mov	w10, 0
+	mov	w11, 56
+.L2931:
+	ldr	w1, [x19, 1380]
+	cmp	w10, w1
+	bcc	.L2933
+	ldr	x0, [x19, 3592]
+	bl	FtlGcBufFree
+	str	wzr, [x19, 1380]
+	ldrh	w0, [x19, 660]
+	cbnz	w0, .L2930
+	mov	w0, 1
+	bl	FtlGcFreeTempBlock
+	b	.L2943
+.L2933:
+	umull	x1, w10, w11
+	ldr	x2, [x19, 3592]
+	add	x3, x2, x1
+	ldr	w2, [x2, x1]
+	ldr	x0, [x3, 16]
+	cmn	w2, #1
+	bne	.L2932
+	ldrh	w3, [x19, 656]
+	ldr	x0, [x19, 520]
+	strh	wzr, [x0, x3, lsl 1]
+	strh	w2, [x19, 656]
+	ldr	w0, [x19, 944]
+	add	w0, w0, 1
+	str	w0, [x19, 944]
+	ldr	x0, [x19, 3592]
+	add	x0, x0, x1
+	ldr	w0, [x0, 4]
 	lsr	w0, w0, 10
 	bl	FtlBbmMapBadBlock
 	bl	FtlBbmTblFlush
 	bl	FtlGcPageVarInit
-	b	.L2987
-.L2979:
-	ldr	w0, [x2,12]
-	add	w20, w20, 1
-	ldr	w1, [x1,4]
-	ldr	w2, [x2,8]
-	uxth	w20, w20
-	bl	FtlGcUpdatePage
-	b	.L2978
-.L2988:
-	ldr	x0, [x19,3600]
-	bl	FtlGcBufFree
-	str	wzr, [x19,1384]
-	ldrh	w0, [x19,660]
-	cbnz	w0, .L2977
-	mov	w0, 1
-	bl	FtlGcFreeTempBlock
-.L2987:
+.L2943:
 	mov	w0, 1
-.L2975:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 48
-	ret
+	b	.L2926
+.L2932:
+	ldp	w2, w0, [x0, 8]
+	ldr	w1, [x3, 4]
+	bl	FtlGcUpdatePage
+	add	w10, w10, 1
+	and	w10, w10, 65535
+	b	.L2931
 	.size	Ftl_gc_temp_data_write_back, .-Ftl_gc_temp_data_write_back
 	.align	2
 	.global	Ftl_get_new_temp_ppa
@@ -19242,35 +18872,35 @@ Ftl_gc_temp_data_write_back:
 Ftl_get_new_temp_ppa:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
 	add	x0, x19, :lo12:.LANCHOR2
 	add	x1, x0, 656
-	ldrh	w2, [x0,656]
+	ldrh	w2, [x0, 656]
 	mov	w0, 65535
 	cmp	w2, w0
-	beq	.L2990
-	ldrh	w0, [x1,4]
-	cbnz	w0, .L2991
-.L2990:
+	beq	.L2945
+	ldrh	w0, [x1, 4]
+	cbnz	w0, .L2946
+.L2945:
 	bl	FtlCacheWriteBack
 	add	x20, x19, :lo12:.LANCHOR2
 	mov	w0, 0
 	bl	FtlGcFreeTempBlock
-	strb	wzr, [x20,664]
 	add	x0, x20, 656
+	strb	wzr, [x0, 8]
 	bl	allocate_data_superblock
-	strh	wzr, [x20,1428]
-	strh	wzr, [x20,1440]
+	strh	wzr, [x20, 1420]
+	strh	wzr, [x20, 1432]
 	bl	l2p_flush
 	mov	w0, 0
 	bl	FtlEctTblFlush
 	bl	FtlVpcTblFlush
-.L2991:
+.L2946:
 	add	x0, x19, :lo12:.LANCHOR2
 	add	x0, x0, 656
 	bl	get_new_active_ppa
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	Ftl_get_new_temp_ppa, .-Ftl_get_new_temp_ppa
@@ -19278,1182 +18908,1188 @@ Ftl_get_new_temp_ppa:
 	.global	ftl_do_gc
 	.type	ftl_do_gc, %function
 ftl_do_gc:
-	stp	x29, x30, [sp, -144]!
-	mov	w2, 0
+	stp	x29, x30, [sp, -160]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	add	x3, x19, :lo12:.LANCHOR2
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	ldr	w4, [x3,424]
-	cbnz	w4, .L3145
-	adrp	x4, .LANCHOR1
-	add	x4, x4, :lo12:.LANCHOR1
-	ldr	w20, [x4,504]
+	add	x2, x19, :lo12:.LANCHOR2
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldr	w3, [x2, 424]
+	cbnz	w3, .L3047
+	adrp	x3, .LANCHOR1
+	add	x3, x3, :lo12:.LANCHOR1
+	ldr	w20, [x3, 504]
 	cmp	w20, 1
-	bne	.L3145
-	ldr	w5, [x3,3568]
-	cbnz	w5, .L3145
-	ldrh	w5, [x3,536]
-	cmp	w5, 47
-	bls	.L3145
+	bne	.L3047
+	ldr	w4, [x2, 3560]
+	cbnz	w4, .L3047
+	ldrh	w4, [x2, 536]
+	cmp	w4, 47
+	bls	.L3047
 	mov	w22, w1
-	ldrh	w1, [x4,3456]
-	str	w0, [x29,124]
+	ldrh	w1, [x3, 3456]
+	mov	w23, w0
 	mov	w0, 65535
 	cmp	w1, w0
-	bne	.L2994
-.L2997:
+	bne	.L2950
+.L2953:
 	add	x0, x19, :lo12:.LANCHOR2
 	mov	w2, 65535
-	ldrh	w4, [x0,1458]
+	ldrh	w4, [x0, 1450]
 	cmp	w4, w2
-	bne	.L2995
-	b	.L2996
-.L2994:
-	ldrh	w1, [x3,656]
-	cmp	w1, w0
-	beq	.L2997
-	mov	w0, w20
-	bl	FtlGcFreeTempBlock
-	mov	w2, w20
-	cbz	w0, .L2997
-	b	.L3145
-.L2995:
-	ldrh	w1, [x0,1456]
-	cmp	w1, w2
-	bne	.L2996
-	ldrh	w3, [x0,1460]
-	cmp	w3, w1
-	beq	.L2996
-	ldrh	w2, [x0,1462]
-	cmp	w2, w1
-	beq	.L2996
-	mov	w1, -1
-	strh	w4, [x0,1456]
-	strh	w3, [x0,1458]
-	strh	w2, [x0,1460]
-	strh	w1, [x0,1462]
-.L2996:
+	bne	.L2951
+.L2952:
 	add	x1, x19, :lo12:.LANCHOR2
-	ldr	w2, [x29,124]
-	cmp	w2, 1
-	ldr	w0, [x1,1372]
+	cmp	w23, 1
+	ldr	w0, [x1, 1368]
 	add	w0, w0, 1
-	add	w0, w0, w2, lsl 7
-	str	w0, [x1,1372]
-	bne	.L3008
+	add	w0, w0, w23, lsl 7
+	str	w0, [x1, 1368]
+	bne	.L2954
 	adrp	x2, .LANCHOR0
 	add	x1, x2, :lo12:.LANCHOR0
-	mov	x26, x2
-	ldr	w3, [x1,2372]
-	cbnz	w3, .L2999
-	ldrb	w1, [x1,204]
-	cbz	w1, .L3008
-.L2999:
-	add	x20, x19, :lo12:.LANCHOR2
-	ldr	w1, [x20,776]
+	mov	x25, x2
+	ldr	w3, [x1, 2372]
+	cbnz	w3, .L2955
+	ldrb	w1, [x1, 204]
+	cbz	w1, .L2954
+.L2955:
+	add	x24, x19, :lo12:.LANCHOR2
+	ldr	w1, [x24, 776]
 	cmp	w1, 39
-	bhi	.L3008
-	adrp	x21, .LANCHOR5
-	add	x1, x21, :lo12:.LANCHOR5
-	ldrh	w1, [x1,1464]
-	add	w0, w0, w1
-	str	w0, [x20,1372]
+	bhi	.L2954
+	adrp	x21, .LANCHOR4
+	add	x1, x21, :lo12:.LANCHOR4
+	mov	w20, 65535
+	ldrh	w1, [x1, 1984]
+	add	w0, w1, w0
+	str	w0, [x24, 1368]
 	bl	FtlGcReFreshBadBlk
-	ldrh	w0, [x20,800]
-	mov	w1, 65535
-	cmp	w0, w1
-	bne	.L3008
-	ldrh	w1, [x20,1456]
+	ldrh	w0, [x24, 800]
+	cmp	w0, w20
+	bne	.L2956
+	ldrh	w1, [x24, 1448]
 	cmp	w1, w0
-	bne	.L3008
-	ldr	w0, [x20,1372]
+	bne	.L3043
+	ldr	w0, [x24, 1368]
 	cmp	w0, 1024
-	bhi	.L3000
-	ldrh	w0, [x20,552]
+	bhi	.L2958
+	ldrh	w0, [x24, 552]
 	cmp	w0, 63
-	bhi	.L3008
-.L3000:
+	bhi	.L3043
+.L2958:
 	add	x0, x19, :lo12:.LANCHOR2
-	add	x1, x21, :lo12:.LANCHOR5
-	ldrh	w2, [x0,1370]
-	ldrh	w3, [x0,552]
+	add	x1, x21, :lo12:.LANCHOR4
+	ldrh	w2, [x0, 1366]
+	ldrh	w3, [x0, 552]
+	strh	wzr, [x1, 1984]
 	add	w2, w2, 64
-	strh	wzr, [x1,1464]
 	cmp	w3, w2
-	bgt	.L3008
-	str	wzr, [x0,1372]
-	ldr	w0, [x0,776]
-	cbnz	w0, .L3001
+	bgt	.L3043
+	str	wzr, [x0, 1368]
+	ldr	w0, [x0, 776]
+	cbnz	w0, .L2959
 	mov	w0, 6
-	b	.L3167
-.L3001:
-	cmp	w0, 5
-	bhi	.L3002
-	mov	w0, 18
-.L3167:
-	strh	w0, [x1,1464]
-.L3002:
+.L3096:
+	strh	w0, [x1, 1984]
+.L2960:
 	mov	w0, 32
-	mov	w28, 65535
 	bl	List_get_gc_head_node
-	uxth	w25, w0
-	cmp	w25, w28
-	beq	.L3007
-	add	x23, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x23,1376]
-	cbz	w0, .L3004
-	add	x2, x26, :lo12:.LANCHOR0
-	ldr	x27, [x23,520]
-	ubfiz	x25, x25, 1, 16
-	ldrh	w1, [x2,2546]
-	ldrh	w2, [x2,2472]
-	ldrh	w3, [x27,x25]
+	and	w5, w0, 65535
+	mov	w8, 65535
+	cmp	w5, w8
+	beq	.L2964
+	add	x24, x19, :lo12:.LANCHOR2
+	ldrh	w0, [x24, 1372]
+	cbz	w0, .L2962
+	add	x2, x25, :lo12:.LANCHOR0
+	ldr	x7, [x24, 520]
+	ubfiz	x5, x5, 1, 16
+	ldrh	w1, [x2, 2546]
+	ldrh	w2, [x2, 2472]
+	ldrh	w3, [x7, x5]
 	mul	w1, w1, w2
 	add	w1, w1, 1
 	cmp	w3, w1
-	bgt	.L3007
-	add	w1, w0, 1
-	str	wzr, [x23,1380]
-	uxth	w1, w1
-	strh	w1, [x23,1376]
-	str	x1, [x29,112]
+	bgt	.L2964
+	add	w6, w0, 1
+	str	wzr, [x24, 1376]
+	and	w6, w6, 65535
+	strh	w6, [x24, 1372]
 	bl	List_get_gc_head_node
-	uxth	w20, w0
-	cmp	w20, w28
-	ldr	x1, [x29,112]
-	beq	.L3007
-	ubfiz	x26, x20, 1, 16
+	and	w20, w0, 65535
+	cmp	w20, w8
+	beq	.L2964
+	ubfiz	x25, x20, 1, 16
+	ldrh	w4, [x7, x5]
+	mov	w2, w20
+	mov	w1, w6
 	adrp	x0, .LC156
-	ldrh	w4, [x27,x25]
 	add	x0, x0, :lo12:.LC156
-	mov	w2, w20
-	ldrh	w3, [x27,x26]
+	ldrh	w3, [x7, x25]
 	bl	printk
-	ldrh	w0, [x23,1376]
+	ldrh	w0, [x24, 1372]
 	cmp	w0, 40
-	bls	.L3005
-	ldr	x0, [x23,520]
-	ldrh	w0, [x0,x26]
+	bls	.L2963
+	ldr	x0, [x24, 520]
+	ldrh	w0, [x0, x25]
 	cmp	w0, 32
-	bls	.L3005
-	strh	wzr, [x23,1376]
-.L3005:
-	add	x21, x21, :lo12:.LANCHOR5
+	bls	.L2963
+	strh	wzr, [x24, 1372]
+.L2963:
+	add	x21, x21, :lo12:.LANCHOR4
 	mov	w0, 6
-	strh	w0, [x21,1464]
-	b	.L3009
-.L3004:
+	strh	w0, [x21, 1984]
+.L2956:
+	cmp	w23, 0
+	mov	w1, 65535
+	add	x0, x19, :lo12:.LANCHOR2
+	ccmp	w20, w1, 0, eq
+	bne	.L2978
+	ldrh	w2, [x0, 552]
+	cmp	w2, 24
+	bhi	.L3055
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	cmp	w2, 16
+	ldrh	w21, [x0, 2544]
+	bls	.L2980
+	lsr	w21, w21, 5
+.L2979:
+	add	x1, x19, :lo12:.LANCHOR2
+	ldrh	w0, [x1, 1364]
+	cmp	w0, w2
+	bcs	.L2983
+	ldrh	w0, [x1, 656]
+	mov	w2, 65535
+	cmp	w0, w2
+	bne	.L2984
+	ldrh	w2, [x1, 1448]
+	cmp	w2, w0
+	bne	.L2984
+	adrp	x0, .LANCHOR4+1984
+	ldrh	w0, [x0, #:lo12:.LANCHOR4+1984]
+	cbnz	w0, .L2985
+	adrp	x2, .LANCHOR0+2616
+	ldr	w3, [x1, 716]
+	ldr	w2, [x2, #:lo12:.LANCHOR0+2616]
+	add	w2, w2, w2, lsl 1
+	cmp	w3, w2, lsr 2
+	bcs	.L2986
+.L2985:
+	add	x2, x19, :lo12:.LANCHOR2
+	ldrh	w1, [x2, 780]
+	add	w1, w1, w1, lsl 1
+	asr	w1, w1, 2
+	strh	w1, [x2, 1364]
+.L2987:
+	add	x19, x19, :lo12:.LANCHOR2
+	str	wzr, [x19, 1376]
+.L2948:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 160
+	ret
+.L2950:
+	ldrh	w1, [x2, 656]
+	cmp	w1, w0
+	beq	.L2953
+	mov	w0, w20
+	bl	FtlGcFreeTempBlock
+	cbz	w0, .L2953
+	mov	w0, w20
+	b	.L2948
+.L2951:
+	ldrh	w1, [x0, 1448]
+	cmp	w1, w2
+	bne	.L2952
+	ldrh	w3, [x0, 1452]
+	cmp	w3, w1
+	beq	.L2952
+	ldrh	w2, [x0, 1454]
+	cmp	w2, w1
+	beq	.L2952
+	mov	w1, -1
+	strh	w4, [x0, 1448]
+	strh	w3, [x0, 1450]
+	strh	w2, [x0, 1452]
+	strh	w1, [x0, 1454]
+	b	.L2952
+.L2959:
+	cmp	w0, 5
+	bhi	.L2960
+	mov	w0, 18
+	b	.L3096
+.L2962:
 	mov	w0, 1
-	strh	w0, [x23,1376]
-.L3007:
+	strh	w0, [x24, 1372]
+.L2964:
 	bl	GetSwlReplaceBlock
-	uxth	w20, w0
+	and	w20, w0, 65535
 	mov	w0, 65535
 	cmp	w20, w0
-	bne	.L3009
-	add	x21, x21, :lo12:.LANCHOR5
-	strh	wzr, [x21,1464]
-.L3008:
-	add	x21, x19, :lo12:.LANCHOR2
+	bne	.L2956
+	add	x21, x21, :lo12:.LANCHOR4
+	strh	wzr, [x21, 1984]
+.L2954:
+	add	x0, x19, :lo12:.LANCHOR2
+	mov	w20, 65535
+	ldrh	w0, [x0, 800]
+	cmp	w0, w20
+	bne	.L2956
+.L3043:
+	add	x24, x19, :lo12:.LANCHOR2
 	mov	w0, 65535
-	ldrh	w20, [x21,800]
+	ldrh	w20, [x24, 656]
 	cmp	w20, w0
-	bne	.L3171
-	ldrh	w0, [x21,656]
+	bne	.L3050
+	ldrh	w25, [x24, 1448]
+	cmp	w25, w20
+	bne	.L2956
+	ldrh	w0, [x24, 552]
+	mov	w1, 1024
+	cmp	w0, 24
+	mov	w0, 5120
+	csel	w0, w0, w1, cc
+	ldr	w1, [x24, 1368]
+	cmp	w1, w0
+	bls	.L2956
+	adrp	x0, .LANCHOR4+1984
+	str	wzr, [x24, 1368]
+	strh	wzr, [x0, #:lo12:.LANCHOR4+1984]
+	bl	GetSwlReplaceBlock
+	and	w20, w0, 65535
+	cmp	w20, w25
+	bne	.L3053
+	ldrh	w1, [x24, 552]
+	ldrh	w0, [x24, 1366]
+	cmp	w1, w0
+	bcs	.L2967
+	mov	w0, 64
+	bl	List_get_gc_head_node
+	and	x0, x0, 65535
 	cmp	w0, w20
-	beq	.L3172
-.L3009:
+	beq	.L2969
+	ldr	w1, [x24, 3556]
+	adrp	x5, .LANCHOR0
+	cbnz	w1, .L2970
+	add	x1, x5, :lo12:.LANCHOR0
+	ldrh	w2, [x1, 2492]
+	cmp	w2, 3
+	beq	.L2970
+	ldr	w2, [x24, 1360]
+	cbnz	w2, .L2970
+	ldr	w2, [x1, 2372]
+	cbnz	w2, .L2970
+	ldrb	w1, [x1, 204]
+	cbz	w1, .L2971
+.L2970:
+	add	x1, x19, :lo12:.LANCHOR2
+	add	x2, x5, :lo12:.LANCHOR0
+	ldr	x1, [x1, 520]
+	ldrh	w3, [x1, x0, lsl 1]
+	ldrh	w0, [x2, 2546]
+	ldrh	w1, [x2, 2472]
+	ldrh	w2, [x2, 2492]
+	cmp	w2, 3
+	mul	w1, w1, w0
+	lsr	w0, w0, 1
+	csel	w0, w0, wzr, eq
+	add	w0, w0, w1
+	cmp	w3, w0
+	bgt	.L2973
+	mov	w0, 0
+	bl	List_get_gc_head_node
+	add	x5, x5, :lo12:.LANCHOR0
+	add	x1, x19, :lo12:.LANCHOR2
+	and	w21, w0, 65535
+	ldr	w0, [x5, 2616]
+	ldr	w2, [x1, 716]
+	add	w0, w0, w0, lsl 1
+	cmp	w2, w0, lsr 2
+	bls	.L2974
+	mov	w0, 128
+.L3097:
+	strh	w0, [x1, 1366]
+.L2975:
 	mov	w0, 65535
-	cmp	w20, w0
-	cset	w2, eq
-	cbz	w2, .L3022
-	ldr	w0, [x29,124]
-	cbnz	w0, .L3022
+	cmp	w21, w0
+	beq	.L2969
+.L2966:
 	add	x0, x19, :lo12:.LANCHOR2
-	mov	w21, 1
-	ldrh	w1, [x0,552]
-	cmp	w1, 24
-	bhi	.L3023
-	adrp	x0, .LANCHOR0
-	cmp	w1, 16
-	add	x0, x0, :lo12:.LANCHOR0
-	ldrh	w21, [x0,2544]
-	bls	.L3024
-	lsr	w21, w21, 5
-	b	.L3023
-.L3024:
-	cmp	w1, 12
-	bls	.L3025
-	lsr	w21, w21, 4
-	b	.L3023
-.L3025:
-	cmp	w1, 8
-	bls	.L3023
-	lsr	w21, w21, 2
-.L3023:
+	ubfiz	x1, x21, 1, 32
+	mov	w20, w21
+	ldr	x3, [x0, 440]
+	ldr	x2, [x0, 520]
+	ldrh	w5, [x0, 1364]
+	ldrh	w4, [x3, x1]
+	ldrh	w3, [x2, x1]
+	mov	w1, w21
+	ldrh	w2, [x0, 552]
+	adrp	x0, .LC157
+	add	x0, x0, :lo12:.LC157
+	bl	printk
+	b	.L2969
+.L2974:
+	mov	w0, 160
+	b	.L3097
+.L2973:
 	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w2, [x0,1368]
-	cmp	w2, w1
-	bcs	.L3027
-	ldrh	w1, [x0,656]
-	mov	w2, 65535
-	cmp	w1, w2
-	bne	.L3028
-	ldrh	w2, [x0,1456]
-	cmp	w2, w1
-	bne	.L3028
-	adrp	x1, .LANCHOR5+1464
-	ldrh	w2, [x1,#:lo12:.LANCHOR5+1464]
-	cbnz	w2, .L3029
-	adrp	x1, .LANCHOR0+2616
-	ldr	w3, [x0,716]
-	ldr	w1, [x1,#:lo12:.LANCHOR0+2616]
-	add	w1, w1, w1, lsl 1
-	cmp	w3, w1, lsr 2
-	bcs	.L3030
-.L3029:
-	add	x1, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x1,780]
-	add	w0, w0, w0, lsl 1
-	asr	w0, w0, 2
-	strh	w0, [x1,1368]
-	b	.L3031
-.L3030:
-	mov	w1, 18
-	strh	w1, [x0,1368]
-.L3031:
-	add	x19, x19, :lo12:.LANCHOR2
-	str	wzr, [x19,1380]
-	b	.L3145
-.L3028:
+	mov	w1, 128
+.L3098:
+	strh	w1, [x0, 1366]
+.L2969:
+	bl	FtlGcReFreshBadBlk
+	b	.L2956
+.L2971:
+	ldr	x1, [x24, 520]
+	ldrh	w0, [x1, x0, lsl 1]
+	cmp	w0, 7
+	bhi	.L2976
+	mov	w0, 0
+	bl	List_get_gc_head_node
+	and	w21, w0, 65535
+	add	x0, x19, :lo12:.LANCHOR2
+	mov	w1, 128
+	strh	w1, [x0, 1366]
+	b	.L2975
+.L2976:
+	add	x0, x19, :lo12:.LANCHOR2
+	mov	w1, 64
+	b	.L3098
+.L2967:
+	mov	w0, 80
+	strh	w0, [x24, 1366]
+	b	.L2969
+.L3053:
+	mov	w21, w20
+	b	.L2966
+.L3050:
+	mov	w20, w0
+	b	.L2956
+.L2980:
+	cmp	w2, 12
+	bls	.L2981
+	lsr	w21, w21, 4
+	b	.L2979
+.L2981:
+	cmp	w2, 8
+	bls	.L2979
+	lsr	w21, w21, 2
+	b	.L2979
+.L3055:
+	mov	w21, 1
+	b	.L2979
+.L2986:
+	mov	w2, 18
+	strh	w2, [x1, 1364]
+	b	.L2987
+.L2984:
 	add	x1, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x1,780]
+	ldrh	w0, [x1, 780]
 	add	w0, w0, w0, lsl 1
 	asr	w0, w0, 2
-	strh	w0, [x1,1368]
-.L3027:
-	cmp	w22, 2
-	bhi	.L3099
+	strh	w0, [x1, 1364]
+.L2983:
 	adrp	x0, .LANCHOR0+2372
-	ldr	w0, [x0,#:lo12:.LANCHOR0+2372]
-	cbz	w0, .L3099
+	ldr	w0, [x0, #:lo12:.LANCHOR0+2372]
+	cbz	w0, .L3057
+	cmp	w22, 2
+	bhi	.L3057
 	add	w21, w21, 1
-	uxth	w21, w21
-	b	.L3099
-.L3022:
-	add	x0, x19, :lo12:.LANCHOR2
-	mov	w3, 65535
-	ldrh	w1, [x0,656]
-	cmp	w1, w3
-	bne	.L3034
-	cbz	w2, .L3034
-	ldrh	w2, [x0,1456]
-	cmp	w2, w1
-	bne	.L3034
-	ldrh	w2, [x0,800]
-	cmp	w2, w1
-	beq	.L3035
-.L3040:
+	and	w21, w21, 65535
+.L3057:
 	mov	w20, 65535
-	b	.L3034
-.L3035:
-	ldrh	w2, [x0,552]
-	adrp	x20, .LANCHOR5
-	ldrh	w1, [x0,1368]
-	str	wzr, [x0,1380]
+	b	.L2989
+.L2978:
+	ldrh	w2, [x0, 656]
+	cmp	w2, w1
+	bne	.L2990
+	ldrh	w1, [x0, 1448]
+	cmp	w1, w2
+	bne	.L2990
+	cmp	w20, w1
+	bne	.L2990
+	ldrh	w1, [x0, 800]
+	cmp	w1, w20
+	bne	.L2990
+	ldrh	w2, [x0, 552]
+	adrp	x21, .LANCHOR4
+	ldrh	w1, [x0, 1364]
+	str	wzr, [x0, 1376]
 	cmp	w2, w1
-	bls	.L3036
-	add	x1, x20, :lo12:.LANCHOR5
-	ldrh	w1, [x1,1464]
-	cbnz	w1, .L3037
+	bls	.L2992
+	add	x1, x21, :lo12:.LANCHOR4
+	ldrh	w1, [x1, 1984]
+	cbnz	w1, .L2993
 	adrp	x1, .LANCHOR0+2616
-	ldr	w2, [x0,716]
-	ldr	w1, [x1,#:lo12:.LANCHOR0+2616]
+	ldr	w2, [x0, 716]
+	ldr	w1, [x1, #:lo12:.LANCHOR0+2616]
 	add	w1, w1, w1, lsl 1
 	cmp	w2, w1, lsr 2
-	bcs	.L3038
-.L3037:
+	bcs	.L2994
+.L2993:
 	add	x1, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x1,780]
+	ldrh	w0, [x1, 780]
 	add	w0, w0, w0, lsl 1
 	asr	w0, w0, 2
-	strh	w0, [x1,1368]
-	b	.L3039
-.L3038:
-	mov	w1, 18
-	strh	w1, [x0,1368]
-.L3039:
+	strh	w0, [x1, 1364]
+.L2995:
 	bl	FtlReadRefresh
 	mov	w0, 0
 	bl	List_get_gc_head_node
-	ubfiz	x0, x0, 1, 16
 	add	x1, x19, :lo12:.LANCHOR2
-	ldr	x1, [x1,520]
-	ldrh	w0, [x1,x0]
+	ubfiz	x0, x0, 1, 16
+	ldr	x1, [x1, 520]
+	ldrh	w0, [x1, x0]
 	cmp	w0, 4
-	bls	.L3036
-	add	x20, x20, :lo12:.LANCHOR5
-	ldrh	w2, [x20,1464]
-	b	.L3145
-.L3036:
-	add	x21, x20, :lo12:.LANCHOR5
-	ldrh	w0, [x21,1464]
-	cbnz	w0, .L3040
-	add	x22, x19, :lo12:.LANCHOR2
-	ldrh	w20, [x22,780]
-	add	w1, w20, w20, lsl 1
-	asr	w1, w1, 2
-	strh	w1, [x22,1368]
+	bls	.L2992
+.L3099:
+	add	x21, x21, :lo12:.LANCHOR4
+	b	.L3100
+.L2994:
+	mov	w1, 18
+	strh	w1, [x0, 1364]
+	b	.L2995
+.L2992:
+	add	x21, x21, :lo12:.LANCHOR4
+	ldrh	w0, [x21, 1984]
+	cbnz	w0, .L2990
+	add	x6, x19, :lo12:.LANCHOR2
+	ldrh	w5, [x6, 780]
+	add	w0, w5, w5, lsl 1
+	asr	w0, w0, 2
+	strh	w0, [x6, 1364]
+	mov	w0, 0
 	bl	List_get_gc_head_node
+	ldr	x1, [x6, 520]
 	ubfiz	x0, x0, 1, 16
-	ldr	x1, [x22,520]
-	ldrh	w2, [x1,x0]
+	ldrh	w2, [x1, x0]
 	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
-	ldrh	w0, [x1,2546]
-	ldrh	w1, [x1,2472]
+	ldrh	w0, [x1, 2546]
+	ldrh	w1, [x1, 2472]
 	mul	w0, w0, w1
 	mov	w1, 2
 	sdiv	w0, w0, w1
 	cmp	w2, w0
-	ble	.L3041
-	ldrh	w0, [x22,552]
-	sub	w20, w20, #1
-	cmp	w0, w20
-	blt	.L3041
+	ble	.L2997
+	ldrh	w0, [x6, 552]
+	sub	w5, w5, #1
+	cmp	w0, w5
+	blt	.L2997
 	bl	FtlReadRefresh
-	b	.L3170
-.L3041:
-	cbnz	w2, .L3040
-	mov	w0, -1
+.L3100:
+	ldrh	w0, [x21, 1984]
+	b	.L2948
+.L2997:
+	cbnz	w2, .L2990
 	add	x19, x19, :lo12:.LANCHOR2
+	mov	w0, -1
 	bl	decrement_vpc_count
-	ldrh	w2, [x19,552]
-	add	w2, w2, 1
-	b	.L3145
-.L3034:
+	ldrh	w0, [x19, 552]
+	add	w0, w0, 1
+	b	.L2948
+.L2990:
 	adrp	x0, .LANCHOR0+2372
-	mov	w21, 2
-	ldr	w0, [x0,#:lo12:.LANCHOR0+2372]
-	cmp	w0, wzr
-	csinc	w21, w21, wzr, ne
-	b	.L3033
-.L3099:
-	mov	w20, 65535
-.L3033:
+	ldr	w0, [x0, #:lo12:.LANCHOR0+2372]
+	cmp	w0, 0
+	cset	w21, ne
+	add	w21, w21, 1
+.L2989:
 	add	x0, x19, :lo12:.LANCHOR2
 	mov	w2, 65535
-	ldrh	w1, [x0,800]
+	ldrh	w1, [x0, 800]
 	cmp	w1, w2
-	bne	.L3043
+	bne	.L2999
 	cmp	w20, w1
-	beq	.L3044
-	strh	w20, [x0,800]
-	b	.L3045
-.L3044:
-	ldrh	w1, [x0,1456]
-	cmp	w1, w20
-	beq	.L3045
-	ubfiz	x1, x1, 1, 16
-	ldr	x2, [x0,520]
-	ldrh	w1, [x2,x1]
-	cbnz	w1, .L3046
-	mov	w1, -1
-	strh	w1, [x0,1456]
-.L3046:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w1, [x0,1456]
-	strh	w1, [x0,800]
-	mov	w1, -1
-	strh	w1, [x0,1456]
-.L3045:
-	add	x22, x19, :lo12:.LANCHOR2
+	beq	.L3000
+	strh	w20, [x0, 800]
+.L3001:
+	add	x5, x19, :lo12:.LANCHOR2
 	mov	w1, 65535
-	ldrh	w0, [x22,800]
-	strb	wzr, [x22,808]
+	ldrh	w0, [x5, 800]
+	strb	wzr, [x5, 808]
 	cmp	w0, w1
-	beq	.L3043
+	beq	.L2999
 	bl	IsBlkInGcList
-	cbz	w0, .L3048
+	cbz	w0, .L3004
 	mov	w0, -1
-	strh	w0, [x22,800]
-.L3048:
+	strh	w0, [x5, 800]
+.L3004:
 	adrp	x0, .LANCHOR0+204
-	ldrb	w0, [x0,#:lo12:.LANCHOR0+204]
-	cbz	w0, .L3049
+	ldrb	w0, [x0, #:lo12:.LANCHOR0+204]
+	cbz	w0, .L3005
 	add	x0, x19, :lo12:.LANCHOR2
-	add	x22, x0, 800
-	ldrh	w0, [x0,800]
+	add	x3, x0, 800
+	ldrh	w0, [x0, 800]
 	bl	ftl_get_blk_mode
-	strb	w0, [x22,8]
-.L3049:
-	add	x22, x19, :lo12:.LANCHOR2
+	strb	w0, [x3, 8]
+.L3005:
+	add	x12, x19, :lo12:.LANCHOR2
 	mov	w0, 65535
-	add	x23, x22, 800
-	ldrh	w1, [x22,800]
+	add	x13, x12, 800
+	ldrh	w1, [x12, 800]
 	cmp	w1, w0
-	beq	.L3043
-	mov	x0, x23
+	beq	.L2999
+	mov	x0, x13
 	bl	make_superblock
-	strh	wzr, [x22,802]
-	adrp	x0, .LANCHOR5
-	ldrh	w2, [x22,800]
-	add	x0, x0, :lo12:.LANCHOR5
-	ldr	x1, [x22,520]
-	strb	wzr, [x22,806]
-	strh	wzr, [x0,1466]
-	ldrh	w1, [x1,x2,lsl 1]
-	strh	w1, [x0,1468]
-.L3043:
+	adrp	x0, .LANCHOR4
+	add	x0, x0, :lo12:.LANCHOR4
+	ldrh	w2, [x12, 800]
+	ldr	x1, [x12, 520]
+	strh	wzr, [x12, 802]
+	strb	wzr, [x12, 806]
+	strh	wzr, [x0, 1986]
+	ldrh	w1, [x1, x2, lsl 1]
+	strh	w1, [x0, 1988]
+.L2999:
 	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w1, [x0,800]
-	ldrh	w2, [x0,560]
+	ldrh	w1, [x0, 800]
+	ldrh	w2, [x0, 560]
 	cmp	w2, w1
-	beq	.L3050
-	ldrh	w2, [x0,608]
+	beq	.L3006
+	ldrh	w2, [x0, 608]
 	cmp	w2, w1
-	beq	.L3050
-	ldrh	w0, [x0,656]
+	beq	.L3006
+	ldrh	w0, [x0, 656]
 	cmp	w0, w1
-	bne	.L3051
-.L3050:
+	bne	.L3040
+.L3006:
 	add	x0, x19, :lo12:.LANCHOR2
 	mov	w1, -1
-	strh	w1, [x0,800]
-.L3051:
-	add	x24, x19, :lo12:.LANCHOR2
-	mov	w25, 65535
-.L3084:
-	ldrh	w0, [x24,800]
-	cmp	w0, w25
-	bne	.L3052
-	str	wzr, [x24,1380]
-.L3053:
-	ldrh	w22, [x24,1376]
-	mov	w0, w22
+	strh	w1, [x0, 800]
+.L3040:
+	add	x22, x19, :lo12:.LANCHOR2
+	mov	w0, 65535
+	ldrh	w24, [x22, 800]
+	cmp	w24, w0
+	bne	.L3008
+	adrp	x25, .LANCHOR0
+	add	x26, x25, :lo12:.LANCHOR0
+	mov	w27, 2
+	str	wzr, [x22, 1376]
+.L3009:
+	ldrh	w5, [x22, 1372]
+	mov	w0, w5
 	bl	List_get_gc_head_node
-	uxth	w23, w0
-	cmp	w23, w25
-	strh	w23, [x24,800]
-	bne	.L3054
-	strh	wzr, [x24,1376]
-	mov	w2, 8
-	b	.L3145
-.L3054:
-	mov	w0, w23
-	add	w22, w22, 1
+	and	w6, w0, 65535
+	strh	w6, [x22, 800]
+	cmp	w6, w24
+	bne	.L3010
+	strh	wzr, [x22, 1372]
+	mov	w0, 8
+	b	.L2948
+.L3000:
+	ldrh	w1, [x0, 1448]
+	cmp	w1, w20
+	beq	.L3001
+	ldr	x2, [x0, 520]
+	ubfiz	x1, x1, 1, 16
+	ldrh	w1, [x2, x1]
+	cbnz	w1, .L3002
+	mov	w1, -1
+	strh	w1, [x0, 1448]
+.L3002:
+	add	x0, x19, :lo12:.LANCHOR2
+	ldrh	w1, [x0, 1448]
+	strh	w1, [x0, 800]
+	mov	w1, -1
+	strh	w1, [x0, 1448]
+	b	.L3001
+.L3010:
+	mov	w0, w6
 	bl	IsBlkInGcList
-	cbz	w0, .L3055
-	strh	w22, [x24,1376]
-	b	.L3053
-.L3055:
-	adrp	x0, .LANCHOR0
-	ubfiz	x1, x23, 1, 16
-	add	x5, x0, :lo12:.LANCHOR0
-	ldr	x2, [x24,520]
-	uxth	w22, w22
-	mov	w3, 2
-	strh	w22, [x24,1376]
-	ldrh	w0, [x5,2544]
-	ldrh	w5, [x5,2472]
-	ldrh	w4, [x2,x1]
-	mul	w0, w0, w5
-	sdiv	w5, w0, w3
-	cmp	w4, w5
-	bgt	.L3057
-	cmp	w4, 8
-	bls	.L3058
-	cmp	w22, 48
-	bls	.L3058
-	ldrh	w4, [x24,1428]
-	cmp	w4, 35
-	bhi	.L3058
-.L3057:
-	strh	wzr, [x24,1376]
-.L3058:
-	cmp	w20, w25
-	ldrh	w1, [x2,x1]
-	bne	.L3059
-	cmp	w1, w0
-	blt	.L3059
-	ldrh	w0, [x24,1376]
+	add	w5, w5, 1
+	cbz	w0, .L3011
+	strh	w5, [x22, 1372]
+	b	.L3009
+.L3011:
+	ldrh	w4, [x26, 2472]
+	ubfiz	x1, x6, 1, 16
+	ldrh	w0, [x26, 2544]
+	and	w5, w5, 65535
+	ldr	x2, [x22, 520]
+	strh	w5, [x22, 1372]
+	mul	w0, w0, w4
+	ldrh	w3, [x2, x1]
+	sdiv	w4, w0, w27
+	cmp	w3, w4
+	bgt	.L3013
+	cmp	w5, 48
+	bls	.L3014
+	cmp	w3, 8
+	bls	.L3014
+	ldrh	w3, [x22, 1420]
+	cmp	w3, 35
+	bhi	.L3014
+.L3013:
+	strh	wzr, [x22, 1372]
+.L3014:
+	ldrh	w1, [x2, x1]
+	cmp	w0, w1
+	bgt	.L3015
+	cmp	w20, w24
+	bne	.L3015
+	ldrh	w0, [x22, 1372]
 	cmp	w0, 3
-	bhi	.L3059
+	bhi	.L3015
 	mov	w0, -1
-	strh	w0, [x24,800]
-	adrp	x0, .LANCHOR5+1464
-	strh	wzr, [x24,1376]
-	ldrh	w2, [x0,#:lo12:.LANCHOR5+1464]
-	b	.L3145
-.L3059:
-	cbnz	w1, .L3060
+	strh	w0, [x22, 800]
+	adrp	x0, .LANCHOR4+1984
+	strh	wzr, [x22, 1372]
+	ldrh	w0, [x0, #:lo12:.LANCHOR4+1984]
+	b	.L2948
+.L3015:
+	cbnz	w1, .L3016
 	mov	w0, -1
 	bl	decrement_vpc_count
-	ldrh	w0, [x24,1376]
+	ldrh	w0, [x22, 1372]
 	add	w0, w0, 1
-	strh	w0, [x24,1376]
-	b	.L3053
-.L3060:
-	adrp	x0, .LANCHOR0
-	strb	wzr, [x24,808]
-	add	x0, x0, :lo12:.LANCHOR0
-	ldrb	w0, [x0,204]
-	cbz	w0, .L3061
-	mov	w0, w23
+	strh	w0, [x22, 1372]
+	b	.L3009
+.L3016:
+	add	x25, x25, :lo12:.LANCHOR0
+	add	x3, x19, :lo12:.LANCHOR2
+	add	x3, x3, 800
+	ldrb	w0, [x25, 204]
+	strb	wzr, [x3, 8]
+	cbz	w0, .L3017
+	mov	w0, w6
 	bl	ftl_get_blk_mode
-	strb	w0, [x24,808]
-.L3061:
-	add	x22, x24, 800
-	mov	x0, x22
+	strb	w0, [x3, 8]
+.L3017:
+	add	x13, x19, :lo12:.LANCHOR2
+	add	x12, x13, 800
+	mov	x0, x12
 	bl	make_superblock
-	adrp	x1, .LANCHOR5
-	ldrh	w2, [x24,800]
-	add	x1, x1, :lo12:.LANCHOR5
-	ldr	x0, [x24,520]
-	strh	wzr, [x1,1466]
-	ldrh	w0, [x0,x2,lsl 1]
-	strh	w0, [x1,1468]
-	strh	wzr, [x24,802]
-	strb	wzr, [x24,806]
-.L3052:
-	ldr	w0, [x29,124]
-	cmp	w0, 1
-	bne	.L3062
+	ldrh	w2, [x13, 800]
+	adrp	x0, .LANCHOR4
+	add	x0, x0, :lo12:.LANCHOR4
+	ldr	x1, [x13, 520]
+	strh	wzr, [x0, 1986]
+	ldrh	w1, [x1, x2, lsl 1]
+	strh	w1, [x0, 1988]
+	strh	wzr, [x13, 802]
+	strb	wzr, [x13, 806]
+.L3008:
+	cmp	w23, 1
+	bne	.L3018
 	bl	FtlReadRefresh
-.L3062:
+.L3018:
+	add	x1, x19, :lo12:.LANCHOR2
 	mov	w0, 1
-	str	w0, [x24,3568]
-	adrp	x0, .LANCHOR0
 	adrp	x22, .LANCHOR0
-	add	x0, x0, :lo12:.LANCHOR0
-	ldrb	w1, [x0,204]
-	ldrh	w26, [x0,2544]
-	cbz	w1, .L3063
-	ldrb	w1, [x24,808]
+	str	w0, [x1, 3560]
+	add	x0, x22, :lo12:.LANCHOR0
+	ldrb	w2, [x0, 204]
+	ldrh	w24, [x0, 2544]
+	cbz	w2, .L3019
+	ldrb	w1, [x1, 808]
 	cmp	w1, 1
-	bne	.L3063
-	ldrh	w26, [x0,2546]
-.L3063:
-	ldrh	w0, [x24,802]
+	bne	.L3019
+	ldrh	w24, [x0, 2546]
+.L3019:
+	add	x0, x19, :lo12:.LANCHOR2
+	ldrh	w0, [x0, 802]
 	add	w1, w0, w21
-	cmp	w1, w26
-	ble	.L3064
-	sub	w21, w26, w0
-	uxth	w21, w21
-.L3064:
-	mov	w27, 0
-.L3065:
-	cmp	w21, w27, uxth
-	bls	.L3072
-	add	x1, x24, 800
+	cmp	w1, w24
+	ble	.L3020
+	sub	w21, w24, w0
+	and	w21, w21, 65535
+.L3020:
+	adrp	x0, .LANCHOR4
+	mov	w25, 0
+	add	x0, x0, :lo12:.LANCHOR4
+	str	x0, [x29, 136]
+.L3021:
+	cmp	w21, w25, uxth
+	bls	.L3028
 	add	x0, x22, :lo12:.LANCHOR0
-	ldrh	w4, [x1,2]
-	ldrh	w6, [x0,2472]
-	mov	x0, 0
-	add	w4, w4, w27
-	mov	w23, w0
-.L3073:
-	cmp	w6, w0, uxth
-	bls	.L3173
-	add	x2, x1, x0, lsl 1
-	ldrh	w2, [x2,16]
-	cmp	w2, w25
-	beq	.L3066
-	mov	w3, 56
-	ldr	x7, [x24,1416]
-	orr	w2, w4, w2, lsl 10
-	umull	x5, w23, w3
-	add	w23, w23, 1
-	add	x5, x7, x5
-	uxth	w23, w23
-	str	w2, [x5,4]
-.L3066:
-	add	x0, x0, 1
-	b	.L3073
-.L3173:
-	ldr	x0, [x24,1416]
-	mov	w1, w23
-	ldrb	w2, [x24,808]
+	mov	w6, 0
+	mov	w2, 0
+	mov	w8, 65535
+	mov	w7, 56
+	ldrh	w9, [x0, 2472]
+	add	x0, x19, :lo12:.LANCHOR2
+	add	x3, x0, 816
+	ldrh	w4, [x0, 802]
+	add	w4, w4, w25
+	b	.L3029
+.L3023:
+	ldrh	w1, [x3]
+	cmp	w1, w8
+	beq	.L3022
+	ldr	x5, [x0, 1408]
+	orr	w1, w4, w1, lsl 10
+	umaddl	x5, w6, w7, x5
+	add	w6, w6, 1
+	and	w6, w6, 65535
+	str	w1, [x5, 4]
+.L3022:
+	add	w2, w2, 1
+	add	x3, x3, 2
+	and	w2, w2, 65535
+.L3029:
+	cmp	w2, w9
+	bne	.L3023
+	add	x26, x19, :lo12:.LANCHOR2
+	mov	w1, w6
+	str	w6, [x29, 128]
+	add	x27, x26, 656
 	mov	x28, 0
+	ldrb	w2, [x26, 808]
+	ldr	x0, [x26, 1408]
 	bl	FlashReadPages
-.L3068:
-	cmp	w23, w28, uxth
-	bls	.L3174
-	mov	x0, 56
-	mul	x4, x28, x0
-	ldr	x0, [x24,1416]
-	add	x1, x0, x4
-	ldr	w0, [x0,x4]
+	ldr	w6, [x29, 128]
+	mov	w0, 56
+	umull	x0, w6, w0
+	str	x0, [x29, 128]
+.L3024:
+	ldr	x0, [x29, 128]
+	cmp	x0, x28
+	bne	.L3027
+	add	w25, w25, 1
+	b	.L3021
+.L3027:
+	ldr	x0, [x26, 1408]
+	add	x1, x0, x28
+	ldr	w0, [x0, x28]
 	cmn	w0, #1
-	ldr	x5, [x1,16]
-	beq	.L3102
-	ldrh	w0, [x5]
-	mov	w1, 61589
-	cmp	w0, w1
-	bne	.L3102
-	ldr	w0, [x5,8]
-	add	x1, x29, 136
+	beq	.L3025
+	ldr	x5, [x1, 16]
+	mov	w0, 61589
+	ldrh	w1, [x5]
+	cmp	w1, w0
+	bne	.L3025
+	ldr	w0, [x5, 8]
 	mov	w2, 0
-	str	x4, [x29,104]
-	str	x5, [x29,112]
+	add	x1, x29, 152
+	str	x5, [x29, 120]
 	bl	log2phys
-	ldr	x2, [x24,1416]
-	ldr	x4, [x29,104]
-	ldr	w0, [x29,136]
-	add	x2, x2, x4
-	ldr	x5, [x29,112]
-	and	w0, w0, 2147483647
-	ldr	w1, [x2,4]
-	cmp	w0, w1
-	bne	.L3102
-	adrp	x0, .LANCHOR5
-	mov	x3, 56
-	add	x1, x0, :lo12:.LANCHOR5
-	str	x4, [x29,96]
-	str	x5, [x29,104]
-	ldrh	w0, [x1,1466]
-	add	w0, w0, 1
-	strh	w0, [x1,1466]
-	ldr	w0, [x24,1384]
-	ldr	x1, [x24,3600]
-	madd	x1, x0, x3, x1
-	ldr	w0, [x2,24]
-	str	x1, [x29,112]
-	str	w0, [x1,24]
+	ldr	x0, [x26, 1408]
+	ldr	w1, [x29, 152]
+	add	x0, x0, x28
+	ldr	x5, [x29, 120]
+	and	w1, w1, 2147483647
+	ldr	w2, [x0, 4]
+	cmp	w1, w2
+	bne	.L3025
+	ldr	x1, [x29, 136]
+	ldr	x2, [x29, 136]
+	ldr	x6, [x26, 3592]
+	ldr	w0, [x0, 24]
+	ldrh	w1, [x1, 1986]
+	str	x5, [x29, 104]
+	add	w1, w1, 1
+	strh	w1, [x2, 1986]
+	ldr	w1, [x26, 1380]
+	mov	w2, 56
+	str	w2, [x29, 116]
+	nop // between mem op and mult-accumulate
+	umaddl	x1, w1, w2, x6
+	str	x1, [x29, 120]
+	str	w0, [x1, 24]
 	bl	Ftl_get_new_temp_ppa
-	ldr	x1, [x29,112]
-	mov	x2, 56
-	ldr	x4, [x29,96]
-	ldr	x5, [x29,104]
-	str	w0, [x1,4]
-	ldr	w0, [x24,1384]
-	ldr	x1, [x24,3600]
-	madd	x0, x0, x2, x1
-	ldr	x1, [x24,1416]
-	add	x1, x1, x4
-	ldr	x2, [x1,8]
-	str	x2, [x0,8]
-	add	x2, x24, 656
-	str	x2, [x29,112]
-	ldr	x1, [x1,16]
-	str	x1, [x0,16]
+	ldr	x1, [x29, 120]
+	ldr	w2, [x29, 116]
+	ldr	x5, [x29, 104]
+	str	w0, [x1, 4]
+	ldr	w0, [x26, 1380]
+	ldr	x1, [x26, 3592]
+	umaddl	x0, w0, w2, x1
+	ldr	x1, [x26, 1408]
+	add	x1, x1, x28
+	ldr	x2, [x1, 8]
+	str	x2, [x0, 8]
+	ldr	x1, [x1, 16]
+	str	x1, [x0, 16]
+	ldr	w0, [x29, 152]
 	mov	w1, 1
-	ldr	w0, [x29,136]
-	str	w0, [x5,12]
-	ldrh	w0, [x24,656]
-	strh	w0, [x5,2]
-	ldr	w0, [x24,756]
-	str	w0, [x5,4]
-	ldr	w0, [x24,1384]
+	str	w0, [x5, 12]
+	ldrh	w0, [x27]
+	strh	w0, [x5, 2]
+	ldr	w0, [x26, 756]
+	str	w0, [x5, 4]
+	ldr	w0, [x26, 1380]
 	add	w0, w0, 1
-	str	w0, [x24,1384]
-	ldr	x0, [x24,1416]
-	add	x0, x0, x4
+	str	w0, [x26, 1380]
+	ldr	x0, [x26, 1408]
+	add	x0, x0, x28
 	bl	FtlGcBufAlloc
 	add	x0, x22, :lo12:.LANCHOR0
-	ldrb	w0, [x0,204]
-	cbnz	w0, .L3070
-	ldr	x2, [x29,112]
-	ldr	w1, [x24,1384]
-	ldrb	w0, [x2,7]
+	ldrb	w0, [x0, 204]
+	cbnz	w0, .L3026
+	ldrb	w1, [x27, 7]
+	ldr	w0, [x26, 1380]
 	cmp	w1, w0
-	beq	.L3070
-	ldrh	w0, [x2,4]
-	cbnz	w0, .L3102
-.L3070:
+	beq	.L3026
+	ldrh	w0, [x27, 4]
+	cbnz	w0, .L3025
+.L3026:
 	bl	Ftl_gc_temp_data_write_back
-	cbz	w0, .L3102
+	cbz	w0, .L3025
 	add	x19, x19, :lo12:.LANCHOR2
 	mov	w0, -1
-	strh	w0, [x19,800]
-	adrp	x0, .LANCHOR5
-	add	x0, x0, :lo12:.LANCHOR5
-	str	wzr, [x19,3568]
-	strh	wzr, [x19,802]
-	ldrh	w2, [x0,1464]
-	b	.L3145
-.L3102:
-	add	x28, x28, 1
-	b	.L3068
-.L3174:
-	add	w27, w27, 1
-	b	.L3065
-.L3072:
-	ldrh	w0, [x24,802]
+	strh	w0, [x19, 800]
+	adrp	x0, .LANCHOR4
+	add	x26, x0, :lo12:.LANCHOR4
+	strh	wzr, [x19, 802]
+	str	wzr, [x19, 3560]
+	ldrh	w0, [x26, 1984]
+	b	.L2948
+.L3025:
+	add	x28, x28, 56
+	b	.L3024
+.L3028:
+	add	x25, x19, :lo12:.LANCHOR2
+	ldrh	w0, [x25, 802]
 	add	w21, w21, w0
-	uxth	w21, w21
-	strh	w21, [x24,802]
-	cmp	w21, w26
-	bcc	.L3074
-	ldr	w0, [x24,1384]
-	adrp	x21, .LANCHOR5
-	cbz	w0, .L3075
+	and	w21, w21, 65535
+	strh	w21, [x25, 802]
+	cmp	w24, w21
+	bhi	.L3030
+	ldr	w0, [x25, 1380]
+	adrp	x21, .LANCHOR4
+	cbz	w0, .L3031
 	bl	Ftl_gc_temp_data_write_back
-	cbz	w0, .L3075
-	str	wzr, [x24,3568]
-	add	x21, x21, :lo12:.LANCHOR5
-.L3170:
-	ldrh	w2, [x21,1464]
-	b	.L3145
-.L3075:
-	add	x21, x21, :lo12:.LANCHOR5
-	ldrh	w21, [x21,1466]
-	cbnz	w21, .L3076
-	ldrh	w1, [x24,800]
-	ldr	x0, [x24,520]
-	ldrh	w0, [x0,x1,lsl 1]
-	cbz	w0, .L3076
-.L3077:
-	add	x0, x22, :lo12:.LANCHOR0
-	ldr	w0, [x0,2616]
+	cbz	w0, .L3031
+	str	wzr, [x25, 3560]
+	b	.L3099
+.L3031:
+	add	x21, x21, :lo12:.LANCHOR4
+	ldrh	w0, [x21, 1986]
+	cbnz	w0, .L3032
+	add	x0, x19, :lo12:.LANCHOR2
+	ldrh	w2, [x0, 800]
+	ldr	x1, [x0, 520]
+	ldrh	w1, [x1, x2, lsl 1]
+	cbz	w1, .L3032
+	add	x25, x22, :lo12:.LANCHOR0
+	mov	x24, x0
+	mov	w21, 0
+.L3033:
+	ldr	w0, [x25, 2616]
 	cmp	w21, w0
-	bcs	.L3082
-	mov	w0, w21
-	add	x1, x29, 140
+	bcs	.L3038
 	mov	w2, 0
+	add	x1, x29, 156
+	mov	w0, w21
 	bl	log2phys
-	ldr	w0, [x29,140]
+	ldr	w0, [x29, 156]
 	cmn	w0, #1
-	beq	.L3078
+	beq	.L3034
 	lsr	w0, w0, 10
 	bl	P2V_block_in_plane
-	ldrh	w1, [x24,800]
+	ldrh	w1, [x24, 800]
 	cmp	w1, w0, uxth
-	bne	.L3078
-.L3082:
+	bne	.L3034
+.L3038:
 	add	x0, x22, :lo12:.LANCHOR0
-	ldr	w0, [x0,2616]
+	ldr	w0, [x0, 2616]
 	cmp	w21, w0
-	bcc	.L3076
-	ldrh	w1, [x24,800]
-	ldr	x0, [x24,520]
-	strh	wzr, [x0,x1,lsl 1]
-	ldrh	w0, [x24,800]
+	bcc	.L3032
+	add	x0, x19, :lo12:.LANCHOR2
+	ldrh	w2, [x0, 800]
+	ldr	x1, [x0, 520]
+	strh	wzr, [x1, x2, lsl 1]
+	ldrh	w0, [x0, 800]
 	bl	update_vpc_list
 	bl	FtlCacheWriteBack
 	bl	l2p_flush
 	bl	FtlVpcTblFlush
-	b	.L3076
-.L3078:
-	add	w21, w21, 1
-	b	.L3077
-.L3076:
-	mov	w0, -1
-	strh	w0, [x24,800]
-.L3074:
-	ldrh	w0, [x24,552]
+.L3032:
+	add	x0, x19, :lo12:.LANCHOR2
+	mov	w1, -1
+	strh	w1, [x0, 800]
+.L3030:
+	add	x1, x19, :lo12:.LANCHOR2
+	ldrh	w0, [x1, 552]
 	cmp	w0, 2
-	bhi	.L3083
+	bhi	.L3039
 	add	x22, x22, :lo12:.LANCHOR0
-	ldrh	w21, [x22,2544]
-	b	.L3084
-.L3083:
-	adrp	x1, .LANCHOR5+1464
-	str	wzr, [x24,3568]
-	ldrh	w2, [x1,#:lo12:.LANCHOR5+1464]
-	cmp	w2, wzr
-	csinc	w2, w2, w0, ne
-	b	.L3145
-.L3172:
-	ldrh	w25, [x21,1456]
-	cmp	w25, w20
-	bne	.L3009
-	ldrh	w0, [x21,552]
-	mov	w2, 1024
-	ldr	w1, [x21,1372]
-	cmp	w0, 24
-	mov	w0, 5120
-	csel	w0, w0, w2, cc
-	cmp	w1, w0
-	bls	.L3009
-	adrp	x0, .LANCHOR5+1464
-	str	wzr, [x21,1372]
-	mov	x23, x21
-	strh	wzr, [x0,#:lo12:.LANCHOR5+1464]
-	bl	GetSwlReplaceBlock
-	uxth	w20, w0
-	cmp	w20, w25
-	bne	.L3011
-	ldrh	w1, [x21,552]
-	ldrh	w0, [x21,1370]
-	cmp	w1, w0
-	bcs	.L3012
-	mov	w0, 64
-	bl	List_get_gc_head_node
-	uxth	w0, w0
-	cmp	w0, w20
-	beq	.L3021
-	ldr	w2, [x21,3564]
-	uxtw	x1, w0
-	adrp	x21, .LANCHOR0
-	cbnz	w2, .L3014
-	add	x0, x21, :lo12:.LANCHOR0
-	ldrh	w2, [x0,2492]
-	cmp	w2, 3
-	beq	.L3014
-	ldr	w2, [x23,848]
-	cbnz	w2, .L3014
-	ldr	w2, [x0,2372]
-	cbnz	w2, .L3014
-	ldrb	w0, [x0,204]
-	cbz	w0, .L3015
-.L3014:
-	add	x0, x19, :lo12:.LANCHOR2
-	add	x3, x21, :lo12:.LANCHOR0
-	ldr	x0, [x0,520]
-	ldrh	w4, [x0,x1,lsl 1]
-	ldrh	w1, [x3,2546]
-	ldrh	w0, [x3,2472]
-	ldrh	w3, [x3,2492]
-	mul	w2, w1, w0
-	cmp	w3, 3
-	mov	w0, 0
-	lsr	w1, w1, 1
-	csel	w0, w1, w0, eq
-	add	w0, w2, w0
-	cmp	w4, w0
-	bgt	.L3017
+	ldrh	w21, [x22, 2544]
+	b	.L3040
+.L3034:
+	add	w21, w21, 1
+	b	.L3033
+.L3039:
+	str	wzr, [x1, 3560]
+	adrp	x1, .LANCHOR4+1984
+	ldrh	w1, [x1, #:lo12:.LANCHOR4+1984]
+	cmp	w1, 0
+	csinc	w0, w1, w0, ne
+	b	.L2948
+.L3047:
 	mov	w0, 0
-	add	x21, x21, :lo12:.LANCHOR0
-	bl	List_get_gc_head_node
-	uxth	w20, w0
-	add	x1, x19, :lo12:.LANCHOR2
-	ldr	w0, [x21,2616]
-	ldr	w2, [x1,716]
-	add	w0, w0, w0, lsl 1
-	cmp	w2, w0, lsr 2
-	bls	.L3018
-	mov	w0, 128
-	b	.L3168
-.L3018:
-	mov	w0, 160
-.L3168:
-	strh	w0, [x1,1370]
-	b	.L3019
-.L3017:
-	add	x0, x19, :lo12:.LANCHOR2
-	mov	w1, 128
-	b	.L3169
-.L3015:
-	ldr	x2, [x23,520]
-	ldrh	w1, [x2,x1,lsl 1]
-	cmp	w1, 7
-	bhi	.L3020
-	bl	List_get_gc_head_node
-	uxth	w20, w0
-	add	x0, x19, :lo12:.LANCHOR2
-	mov	w1, 128
-	strh	w1, [x0,1370]
-	b	.L3019
-.L3020:
-	add	x0, x19, :lo12:.LANCHOR2
-	mov	w1, 64
-.L3169:
-	strh	w1, [x0,1370]
-	b	.L3021
-.L3012:
-	mov	w0, 80
-	strh	w0, [x21,1370]
-	b	.L3021
-.L3019:
-	mov	w0, 65535
-	cmp	w20, w0
-	beq	.L3021
-.L3011:
-	add	x5, x19, :lo12:.LANCHOR2
-	ubfiz	x4, x20, 1, 32
-	adrp	x0, .LC157
-	mov	w1, w20
-	add	x0, x0, :lo12:.LC157
-	ldr	x3, [x5,520]
-	ldr	x6, [x5,440]
-	ldrh	w2, [x5,552]
-	ldrh	w3, [x3,x4]
-	ldrh	w5, [x5,1368]
-	ldrh	w4, [x6,x4]
-	bl	printk
-.L3021:
-	bl	FtlGcReFreshBadBlk
-	b	.L3009
-.L3171:
-	mov	w20, w0
-	b	.L3009
-.L3145:
-	mov	w0, w2
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 144
-	ret
+	b	.L2948
 	.size	ftl_do_gc, .-ftl_do_gc
 	.align	2
 	.global	FtlCacheWriteBack
 	.type	FtlCacheWriteBack, %function
 FtlCacheWriteBack:
-	stp	x29, x30, [sp, -128]!
-	adrp	x0, .LANCHOR5+1472
+	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	adrp	x22, .LANCHOR2
-	stp	x19, x20, [sp,16]
-	ldr	x20, [x0,#:lo12:.LANCHOR5+1472]
-	add	x0, x22, :lo12:.LANCHOR2
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	ldr	w23, [x0,424]
-	cbnz	w23, .L3177
-	adrp	x19, .LANCHOR0
-	add	x0, x19, :lo12:.LANCHOR0
-	ldr	w1, [x0,2600]
-	cbz	w1, .L3177
-	ldrb	w0, [x0,204]
-	cbz	w0, .L3179
-	ldrb	w0, [x20,8]
+	stp	x23, x24, [sp, 48]
+	adrp	x23, .LANCHOR2
+	add	x0, x23, :lo12:.LANCHOR2
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldr	w24, [x0, 424]
+	cbnz	w24, .L3103
+	adrp	x22, .LANCHOR0
+	add	x0, x22, :lo12:.LANCHOR0
+	ldr	w1, [x0, 2600]
+	cbz	w1, .L3103
+	ldrb	w0, [x0, 204]
+	adrp	x2, .LANCHOR4+1992
+	ldr	x19, [x2, #:lo12:.LANCHOR4+1992]
+	cbz	w0, .L3128
+	ldrb	w0, [x19, 8]
 	cmp	w0, 1
-	cset	w23, eq
-.L3179:
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w3, [x20,9]
+	cset	w25, eq
+.L3105:
+	add	x20, x22, :lo12:.LANCHOR0
+	ldrb	w3, [x19, 9]
 	adrp	x26, .LC158
-	mov	w2, w23
-	mov	w24, 0
+	mov	w2, w25
+	mov	w21, 0
 	mov	w27, 56
-	ldr	x0, [x0,2608]
+	ldr	x0, [x20, 2608]
 	add	x26, x26, :lo12:.LC158
 	bl	FlashProgPages
-.L3180:
-	add	x0, x19, :lo12:.LANCHOR0
-	ldr	w1, [x0,2600]
-	cmp	w24, w1
-	bcs	.L3198
-	umull	x21, w24, w27
-	ldr	x1, [x0,2608]
-	add	x0, x1, x21
-	ldr	w25, [x1,x21]
-	cmn	w25, #1
-	beq	.L3201
-	ldr	w1, [x0,4]
-	cbz	w23, .L3215
-	orr	w1, w1, -2147483648
-.L3215:
-	ldr	w0, [x0,24]
+.L3106:
+	ldr	w0, [x20, 2600]
+	cmp	w21, w0
+	bcc	.L3113
+.L3125:
+	add	x22, x22, :lo12:.LANCHOR0
+	str	wzr, [x22, 2600]
+.L3103:
+	ldp	x19, x20, [sp, 16]
+	mov	w0, 0
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L3128:
+	mov	w25, 0
+	b	.L3105
+.L3113:
+	umull	x28, w21, w27
+	ldr	x0, [x20, 2608]
+	add	x3, x0, x28
+	ldr	w0, [x0, x28]
+	cmn	w0, #1
+	bne	.L3107
+	add	x21, x22, :lo12:.LANCHOR0
+	add	x26, x23, :lo12:.LANCHOR2
+.L3108:
+	ldr	w0, [x21, 2600]
+	cmp	w24, w0
+	bcc	.L3123
+	add	x23, x23, :lo12:.LANCHOR2
+	mov	w19, 16386
+.L3126:
+	ldrh	w0, [x23, 1456]
+	cbz	w0, .L3125
+	mov	w1, 1
+	mov	w0, w1
+	bl	ftl_do_gc
+	subs	w19, w19, #1
+	bne	.L3126
+	b	.L3125
+.L3107:
+	ldr	w0, [x3, 4]
+	cbnz	w25, .L3109
+.L3142:
+	str	w0, [x29, 108]
 	mov	w2, 1
-	str	w1, [x29,124]
-	add	x1, x29, 124
+	ldr	w0, [x3, 24]
+	add	x1, x29, 108
 	bl	log2phys
-	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x0, [x0,2608]
-	add	x21, x0, x21
-	ldr	x0, [x21,16]
-	ldr	w0, [x0,12]
+	ldr	x0, [x20, 2608]
+	add	x0, x0, x28
+	ldr	x0, [x0, 16]
+	ldr	w0, [x0, 12]
 	cmn	w0, #1
-	beq	.L3184
-	lsr	x0, x0, 10
+	beq	.L3111
+	lsr	w0, w0, 10
 	bl	P2V_block_in_plane
-	uxth	w1, w0
-	add	x2, x22, :lo12:.LANCHOR2
-	ubfiz	x0, x1, 1, 16
-	mov	w21, w1
-	ldr	x2, [x2,520]
-	ldrh	w2, [x2,x0]
-	cbnz	w2, .L3185
+	and	w1, w0, 65535
+	add	x0, x23, :lo12:.LANCHOR2
+	ubfiz	x2, x1, 1, 16
+	mov	w28, w1
+	ldr	x0, [x0, 520]
+	ldrh	w0, [x0, x2]
+	cbnz	w0, .L3112
+	mov	w2, 0
 	mov	x0, x26
 	bl	printk
-.L3185:
-	mov	w0, w21
+.L3112:
+	mov	w0, w28
 	bl	decrement_vpc_count
-.L3184:
-	add	w24, w24, 1
-	b	.L3180
-.L3217:
-	mov	w20, 16386
-.L3197:
-	add	x0, x22, :lo12:.LANCHOR2
-	ldrh	w0, [x0,1464]
-	cbz	w0, .L3198
-	mov	w0, 1
-	mov	w1, w0
-	bl	ftl_do_gc
-	subs	w20, w20, #1
-	bne	.L3197
-.L3198:
-	add	x19, x19, :lo12:.LANCHOR0
-	str	wzr, [x19,2600]
-	b	.L3177
-.L3201:
-	adrp	x26, .LC158
-	mov	w24, 0
-	mov	w27, 56
-	str	w25, [x29,108]
-	mov	w28, 1
-	add	x26, x26, :lo12:.LC158
-.L3181:
-	add	x0, x19, :lo12:.LANCHOR0
-	ldr	w1, [x0,2600]
-	cmp	w24, w1
-	bcs	.L3217
-	umull	x21, w24, w27
-	ldr	x0, [x0,2608]
-	ldr	w1, [x29,108]
-	str	w1, [x0,x21]
-.L3187:
-	add	x2, x19, :lo12:.LANCHOR0
-	ldr	x0, [x2,2608]
-	add	x1, x0, x21
-	ldr	w0, [x0,x21]
+.L3111:
+	add	w21, w21, 1
+	b	.L3106
+.L3109:
+	orr	w0, w0, -2147483648
+	b	.L3142
+.L3123:
+	mov	w20, 56
+	ldr	x0, [x21, 2608]
+	mov	w1, -1
+	mov	w27, 1
+	umull	x20, w24, w20
+	str	w1, [x0, x20]
+.L3114:
+	ldr	x0, [x21, 2608]
+	add	x3, x0, x20
+	ldr	w0, [x0, x20]
+	cmn	w0, #1
+	ldr	w0, [x3, 4]
+	beq	.L3118
+	cbnz	w25, .L3119
+.L3143:
+	str	w0, [x29, 108]
+	mov	w2, 1
+	ldr	w0, [x3, 24]
+	add	x1, x29, 108
+	bl	log2phys
+	ldr	x0, [x21, 2608]
+	add	x20, x0, x20
+	ldr	x0, [x20, 16]
+	ldr	w0, [x0, 12]
 	cmn	w0, #1
-	bne	.L3218
-	ldr	w0, [x1,4]
-	str	x2, [x29,96]
-	lsr	x0, x0, 10
+	beq	.L3121
+	lsr	w0, w0, 10
 	bl	P2V_block_in_plane
-	ldrh	w1, [x20]
+	ldr	x2, [x26, 520]
+	and	w1, w0, 65535
+	ubfiz	x0, x1, 1, 16
+	mov	w20, w1
+	ldrh	w0, [x2, x0]
+	cbnz	w0, .L3122
+	adrp	x0, .LC158
+	mov	w2, 0
+	add	x0, x0, :lo12:.LC158
+	bl	printk
+.L3122:
+	mov	w0, w20
+	bl	decrement_vpc_count
+.L3121:
+	add	w24, w24, 1
+	b	.L3108
+.L3118:
+	lsr	w0, w0, 10
+	bl	P2V_block_in_plane
+	ldrh	w1, [x19]
 	cmp	w1, w0, uxth
-	ldr	x2, [x29,96]
-	bne	.L3188
-	add	x0, x22, :lo12:.LANCHOR2
+	bne	.L3115
+	ldr	x2, [x26, 520]
 	ubfiz	x1, x1, 1, 16
-	ldrh	w4, [x20,4]
-	ldr	x3, [x0,520]
-	ldrh	w0, [x3,x1]
-	sub	w0, w0, w4
-	strh	w0, [x3,x1]
-	strb	wzr, [x20,6]
-	ldrh	w0, [x2,2544]
-	strh	w0, [x20,2]
-	strh	wzr, [x20,4]
-.L3188:
-	ldrh	w0, [x20,4]
-	cbnz	w0, .L3189
-	mov	x0, x20
+	ldrh	w3, [x19, 4]
+	ldrh	w0, [x2, x1]
+	sub	w0, w0, w3
+	strh	w0, [x2, x1]
+	strb	wzr, [x19, 6]
+	ldrh	w0, [x21, 2544]
+	strh	w0, [x19, 2]
+	strh	wzr, [x19, 4]
+.L3115:
+	ldrh	w0, [x19, 4]
+	cbnz	w0, .L3116
+	mov	x0, x19
 	bl	allocate_new_data_superblock
-.L3189:
-	add	x5, x22, :lo12:.LANCHOR2
-	add	x25, x19, :lo12:.LANCHOR0
-	str	x5, [x29,96]
-	ldr	w0, [x5,952]
+.L3116:
+	ldr	w0, [x26, 944]
 	add	w0, w0, 1
-	str	w0, [x5,952]
-	ldr	x0, [x25,2608]
-	add	x0, x0, x21
-	ldr	w0, [x0,4]
-	lsr	x0, x0, 10
+	str	w0, [x26, 944]
+	ldr	x0, [x21, 2608]
+	add	x0, x0, x20
+	ldr	w0, [x0, 4]
+	lsr	w0, w0, 10
 	bl	FtlGcMarkBadPhyBlk
-	mov	x0, x20
+	mov	x0, x19
 	bl	get_new_active_ppa
-	str	w0, [x29,124]
-	ldr	x1, [x25,2608]
-	mov	w2, w23
-	add	x1, x1, x21
-	str	w0, [x1,4]
+	ldr	x1, [x21, 2608]
+	mov	w2, w25
+	str	w0, [x29, 108]
+	add	x1, x1, x20
+	str	w0, [x1, 4]
 	mov	w1, 1
-	ldr	x0, [x25,2608]
-	ldrb	w3, [x20,9]
-	add	x0, x0, x21
+	ldrb	w3, [x19, 9]
+	ldr	x0, [x21, 2608]
+	add	x0, x0, x20
 	bl	FlashProgPages
-	ldr	x0, [x25,2608]
-	ldr	x5, [x29,96]
-	ldr	w0, [x0,x21]
+	ldr	x0, [x21, 2608]
+	ldr	w0, [x0, x20]
 	cmn	w0, #1
-	bne	.L3190
-	str	w28, [x5,424]
-.L3190:
-	add	x0, x22, :lo12:.LANCHOR2
-	ldr	w0, [x0,424]
-	cbz	w0, .L3187
-	b	.L3177
-.L3218:
-	ldr	w0, [x1,4]
-	cbz	w23, .L3216
+	bne	.L3117
+	str	w27, [x26, 424]
+.L3117:
+	ldr	w0, [x26, 424]
+	cbz	w0, .L3114
+	b	.L3103
+.L3119:
 	orr	w0, w0, -2147483648
-.L3216:
-	str	w0, [x29,124]
-	mov	w2, 1
-	ldr	w0, [x1,24]
-	add	x1, x29, 124
-	bl	log2phys
-	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x0, [x0,2608]
-	add	x21, x0, x21
-	ldr	x0, [x21,16]
-	ldr	w0, [x0,12]
-	cmn	w0, #1
-	beq	.L3194
-	lsr	x0, x0, 10
-	bl	P2V_block_in_plane
-	uxth	w1, w0
-	add	x2, x22, :lo12:.LANCHOR2
-	ubfiz	x0, x1, 1, 16
-	mov	w21, w1
-	ldr	x2, [x2,520]
-	ldrh	w2, [x2,x0]
-	cbnz	w2, .L3195
-	mov	x0, x26
-	bl	printk
-.L3195:
-	mov	w0, w21
-	bl	decrement_vpc_count
-.L3194:
-	add	w24, w24, 1
-	b	.L3181
-.L3177:
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
-	ret
+	b	.L3143
 	.size	FtlCacheWriteBack, .-FtlCacheWriteBack
 	.align	2
 	.global	FtlSysFlush
 	.type	FtlSysFlush, %function
 FtlSysFlush:
 	adrp	x0, .LANCHOR2+424
+	ldr	w0, [x0, #:lo12:.LANCHOR2+424]
+	cbnz	w0, .L3147
 	stp	x29, x30, [sp, -32]!
-	add	x29, sp, 0
-	ldr	w0, [x0,#:lo12:.LANCHOR2+424]
-	str	x19, [sp,16]
-	cbnz	w0, .L3220
 	adrp	x0, .LANCHOR1+504
-	ldr	w19, [x0,#:lo12:.LANCHOR1+504]
+	add	x29, sp, 0
+	str	x19, [sp, 16]
+	ldr	w19, [x0, #:lo12:.LANCHOR1+504]
 	cmp	w19, 1
-	bne	.L3220
+	bne	.L3145
 	bl	FtlCacheWriteBack
 	bl	l2p_flush
 	mov	w0, w19
 	bl	FtlEctTblFlush
 	bl	FtlVpcTblFlush
-.L3220:
+.L3145:
 	mov	w0, 0
-	ldr	x19, [sp,16]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L3147:
+	mov	w0, 0
+	ret
 	.size	FtlSysFlush, .-FtlSysFlush
 	.align	2
 	.global	FtlDeInit
 	.type	FtlDeInit, %function
 FtlDeInit:
 	adrp	x0, .LANCHOR1+504
+	ldr	w0, [x0, #:lo12:.LANCHOR1+504]
+	cmp	w0, 1
+	bne	.L3153
 	stp	x29, x30, [sp, -16]!
 	add	x29, sp, 0
-	ldr	w0, [x0,#:lo12:.LANCHOR1+504]
-	cmp	w0, 1
-	bne	.L3222
 	bl	FtlSysFlush
-.L3222:
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	ret
+.L3153:
+	mov	w0, 0
+	ret
 	.size	FtlDeInit, .-FtlDeInit
 	.align	2
 	.global	ftl_deinit
@@ -20472,10 +20108,10 @@ ftl_deinit:
 	.type	rk_ftl_de_init, %function
 rk_ftl_de_init:
 	stp	x29, x30, [sp, -16]!
-	adrp	x0, .LC159
 	mov	w1, 0
-	add	x29, sp, 0
+	adrp	x0, .LC159
 	add	x0, x0, :lo12:.LC159
+	add	x29, sp, 0
 	bl	printk
 	bl	ftl_deinit
 	ldp	x29, x30, [sp], 16
@@ -20507,98 +20143,94 @@ rk_ftl_cache_write_back:
 ftl_discard:
 	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	adrp	x22, .LANCHOR0
-	str	x23, [sp,48]
-	add	x21, x22, :lo12:.LANCHOR0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	w20, w0
+	stp	x21, x22, [sp, 32]
+	adrp	x0, .LANCHOR0
+	add	x21, x0, :lo12:.LANCHOR0
+	str	x23, [sp, 48]
 	mov	w19, w1
-	ldr	w2, [x21,2584]
-	cmp	w1, w2
-	bhi	.L3234
-	cmp	w0, w2
-	cset	w1, cs
-	cbnz	w1, .L3234
-	add	w3, w0, w19
-	mov	w0, -1
-	cmp	w3, w2
-	bhi	.L3228
+	ldr	w1, [x21, 2584]
+	cmp	w1, w20
+	bls	.L3173
+	cmp	w1, w19
+	bcc	.L3173
+	mov	x23, x0
+	add	w0, w20, w19
+	cmp	w1, w0
+	bcc	.L3173
 	cmp	w19, 31
-	mov	w0, w1
-	bls	.L3228
-	adrp	x23, .LANCHOR2
-	add	x0, x23, :lo12:.LANCHOR2
-	ldr	w2, [x0,424]
-	mov	w0, w1
-	cbnz	w2, .L3228
+	bls	.L3175
+	adrp	x22, .LANCHOR2
+	add	x0, x22, :lo12:.LANCHOR2
+	ldr	w0, [x0, 424]
+	cbnz	w0, .L3175
 	bl	FtlCacheWriteBack
-	ldrh	w1, [x21,2550]
-	udiv	w21, w20, w1
-	msub	w20, w1, w21, w20
-	uxth	w20, w20
-	cbz	w20, .L3229
-	sub	w20, w1, w20
+	ldrh	w0, [x21, 2550]
+	udiv	w21, w20, w0
+	msub	w20, w0, w21, w20
+	ands	w20, w20, 65535
+	beq	.L3166
+	sub	w20, w0, w20
 	add	w21, w21, 1
 	cmp	w20, w19
 	csel	w20, w20, w19, ls
 	sub	w19, w19, w20, uxth
-.L3229:
+.L3166:
+	add	x20, x23, :lo12:.LANCHOR0
+	adrp	x23, .LANCHOR4
+	add	x23, x23, :lo12:.LANCHOR4
 	mov	w0, -1
-	adrp	x20, .LANCHOR5
-	str	w0, [x29,76]
-.L3230:
-	add	x0, x22, :lo12:.LANCHOR0
-	ldrh	w0, [x0,2550]
+	str	w0, [x29, 76]
+.L3167:
+	ldrh	w0, [x20, 2550]
 	cmp	w19, w0
-	bcc	.L3244
-	mov	w0, w21
-	add	x1, x29, 72
+	bcs	.L3169
+	adrp	x0, .LANCHOR4
+	add	x0, x0, :lo12:.LANCHOR4
+	ldr	w1, [x0, 2000]
+	cmp	w1, 32
+	bls	.L3175
+	str	wzr, [x0, 2000]
+	bl	l2p_flush
+	bl	FtlVpcTblFlush
+.L3175:
+	mov	w0, 0
+	b	.L3164
+.L3169:
 	mov	w2, 0
+	add	x1, x29, 72
+	mov	w0, w21
 	bl	log2phys
-	ldr	w0, [x29,72]
+	ldr	w0, [x29, 72]
 	cmn	w0, #1
-	beq	.L3231
-	add	x1, x20, :lo12:.LANCHOR5
+	beq	.L3168
+	add	x1, x22, :lo12:.LANCHOR2
+	ldr	w0, [x23, 2000]
 	mov	w2, 1
-	ldr	w0, [x1,1480]
 	add	w0, w0, 1
-	str	w0, [x1,1480]
-	add	x1, x23, :lo12:.LANCHOR2
-	ldr	w0, [x1,724]
+	str	w0, [x23, 2000]
+	ldr	w0, [x1, 724]
 	add	w0, w0, 1
-	str	w0, [x1,724]
+	str	w0, [x1, 724]
 	add	x1, x29, 76
 	mov	w0, w21
 	bl	log2phys
-	ldr	w0, [x29,72]
-	lsr	x0, x0, 10
+	ldr	w0, [x29, 72]
+	lsr	w0, w0, 10
 	bl	P2V_block_in_plane
 	bl	decrement_vpc_count
-.L3231:
-	add	x0, x22, :lo12:.LANCHOR0
+.L3168:
+	ldrh	w0, [x20, 2550]
 	add	w21, w21, 1
-	ldrh	w0, [x0,2550]
 	sub	w19, w19, w0
-	b	.L3230
-.L3244:
-	adrp	x0, .LANCHOR5
-	add	x0, x0, :lo12:.LANCHOR5
-	ldr	w1, [x0,1480]
-	cmp	w1, 32
-	bls	.L3233
-	str	wzr, [x0,1480]
-	bl	l2p_flush
-	bl	FtlVpcTblFlush
-.L3233:
-	mov	w0, 0
-	b	.L3228
-.L3234:
+	b	.L3167
+.L3173:
 	mov	w0, -1
-.L3228:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldr	x23, [sp,48]
+.L3164:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldr	x23, [sp, 48]
 	ldp	x29, x30, [sp], 80
 	ret
 	.size	ftl_discard, .-ftl_discard
@@ -20617,322 +20249,312 @@ FtlDiscard:
 	.type	ftl_read, %function
 ftl_read:
 	sub	sp, sp, #208
-	mov	w4, w0
-	adrp	x0, .LANCHOR1+504
-	stp	x29, x30, [sp,16]
+	adrp	x4, .LANCHOR1+504
+	stp	x29, x30, [sp, 16]
 	add	x29, sp, 16
-	stp	x21, x22, [sp,48]
-	ldr	w21, [x0,#:lo12:.LANCHOR1+504]
-	mov	w0, -1
-	stp	x19, x20, [sp,32]
-	stp	x23, x24, [sp,64]
-	stp	x25, x26, [sp,80]
-	stp	x27, x28, [sp,96]
-	cmp	w21, 1
-	bne	.L3247
-	cmp	w4, 16
-	mov	x25, x3
-	mov	w26, w2
-	mov	w20, w1
-	bne	.L3248
-	add	w0, w1, 256
-	mov	w1, w2
-	mov	x2, x3
-	bl	FtlVendorPartRead
-	b	.L3247
-.L3248:
-	adrp	x22, .LANCHOR0
-	add	x2, x22, :lo12:.LANCHOR0
-	ldr	w1, [x2,2584]
-	cmp	w20, w1
-	bcs	.L3271
-	cmp	w26, w1
-	bhi	.L3271
+	stp	x19, x20, [sp, 32]
+	stp	x21, x22, [sp, 48]
+	ldr	w20, [x4, #:lo12:.LANCHOR1+504]
+	stp	x23, x24, [sp, 64]
+	stp	x25, x26, [sp, 80]
+	cmp	w20, 1
+	stp	x27, x28, [sp, 96]
+	bne	.L3210
+	mov	x23, x3
+	mov	w24, w2
+	mov	w19, w1
+	cmp	w0, 16
+	bne	.L3187
+	mov	x2, x3
+	mov	w1, w24
+	add	w0, w19, 256
+	bl	FtlVendorPartRead
+	mov	w25, w0
+.L3185:
+	mov	w0, w25
+	ldp	x19, x20, [sp, 32]
+	ldp	x21, x22, [sp, 48]
+	ldp	x23, x24, [sp, 64]
+	ldp	x25, x26, [sp, 80]
+	ldp	x27, x28, [sp, 96]
+	ldp	x29, x30, [sp, 16]
+	add	sp, sp, 208
+	ret
+.L3187:
+	adrp	x21, .LANCHOR0
+	add	x1, x21, :lo12:.LANCHOR0
+	ldr	w0, [x1, 2584]
+	cmp	w19, w0
+	bcs	.L3210
+	cmp	w2, w0
+	bhi	.L3210
+	add	w2, w19, w2
+	str	w2, [x29, 148]
+	cmp	w0, w2
+	bcc	.L3210
+	ldrh	w0, [x1, 2550]
+	sub	w26, w2, #1
+	adrp	x7, .LANCHOR2
+	udiv	w27, w19, w0
+	udiv	w26, w26, w0
+	sub	w20, w20, w27
 	add	w0, w20, w26
-	str	w0, [x29,168]
-	mov	w0, -1
-	ldr	w3, [x29,168]
-	cmp	w3, w1
-	bhi	.L3247
-	ldrh	w0, [x2,2550]
-	sub	w27, w3, #1
-	adrp	x19, .LANCHOR2
-	udiv	w1, w20, w0
-	str	w1, [x29,172]
-	udiv	w27, w27, w0
-	ldr	w0, [x29,172]
-	sub	w21, w21, w0
-	add	x0, x19, :lo12:.LANCHOR2
-	add	w21, w21, w27
-	ldr	w1, [x0,748]
-	add	w1, w26, w1
-	str	w1, [x0,748]
-	ldr	w1, [x0,720]
-	add	w1, w21, w1
-	str	w1, [x0,720]
-	ldr	w0, [x29,172]
-	mov	w1, w27
+	str	w0, [x29, 172]
+	add	x0, x7, :lo12:.LANCHOR2
+	ldr	w2, [x29, 172]
+	ldr	w1, [x0, 748]
+	add	w1, w1, w24
+	str	w1, [x0, 748]
+	ldr	w1, [x0, 720]
+	add	w1, w1, w2
+	str	w1, [x0, 720]
+	mov	w1, w26
+	mov	w0, w27
 	bl	FtlCacheMetchLpa
-	cbz	w0, .L3249
+	str	x7, [x29, 160]
+	cbz	w0, .L3188
 	bl	FtlCacheWriteBack
-.L3249:
-	mov	w28, 0
+.L3188:
+	mov	w22, w27
 	adrp	x0, .LC147
-	ldr	w23, [x29,172]
+	mov	w28, 0
 	add	x0, x0, :lo12:.LC147
-	str	w28, [x29,156]
-	mov	w24, w28
-	str	w28, [x29,152]
-	str	x0, [x29,112]
-.L3250:
-	cbz	w21, .L3295
-	mov	w0, w23
-	add	x1, x29, 188
+	mov	w25, 0
+	str	x0, [x29, 104]
+	str	wzr, [x29, 156]
+	str	wzr, [x29, 168]
+.L3189:
+	ldr	w0, [x29, 172]
+	cbnz	w0, .L3206
+	ldr	x0, [x29, 160]
+	add	x0, x0, :lo12:.LANCHOR2
+	ldrh	w0, [x0, 1456]
+	cbz	w0, .L3185
+	mov	w1, 1
+	mov	w0, 0
+	bl	ftl_do_gc
+	b	.L3185
+.L3206:
 	mov	w2, 0
+	add	x1, x29, 188
+	mov	w0, w22
 	bl	log2phys
-	ldr	w3, [x29,188]
-	cmn	w3, #1
-	bne	.L3292
-	mov	w3, 0
-.L3251:
-	add	x0, x22, :lo12:.LANCHOR0
-	ldrh	w0, [x0,2550]
-	cmp	w3, w0
-	bcs	.L3255
-	madd	w0, w23, w0, w3
-	cmp	w0, w20
-	bcc	.L3253
-	ldr	w1, [x29,168]
-	cmp	w0, w1
-	bcs	.L3253
-	sub	w0, w0, w20
-	mov	w1, 0
-	ubfiz	x0, x0, 9, 23
-	mov	w2, 512
-	add	x0, x25, x0
-	str	x3, [x29,160]
-	bl	ftl_memset
-	ldr	x3, [x29,160]
-.L3253:
-	add	w3, w3, 1
-	b	.L3251
-.L3292:
-	mov	w0, 56
-	umull	x1, w24, w0
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	x2, [x0,3592]
-	add	x2, x2, x1
-	str	w3, [x2,4]
-	ldr	w2, [x29,172]
-	cmp	w23, w2
-	ldr	x2, [x0,3592]
-	add	x2, x2, x1
-	bne	.L3256
-	ldr	x0, [x0,3648]
-	str	x0, [x2,8]
-	add	x0, x22, :lo12:.LANCHOR0
-	ldrh	w0, [x0,2550]
-	udiv	w3, w20, w0
-	msub	w3, w3, w0, w20
-	str	w3, [x29,128]
-	sub	w3, w0, w3
-	cmp	w3, w26
-	csel	w3, w3, w26, ls
-	str	w3, [x29,156]
-	cmp	w3, w0
-	bne	.L3257
-	str	x25, [x2,8]
-	b	.L3257
-.L3256:
-	cmp	w23, w27
-	bne	.L3258
-	ldr	x0, [x0,3656]
-	str	x0, [x2,8]
-	add	x0, x22, :lo12:.LANCHOR0
-	ldr	w4, [x29,168]
-	ldrh	w3, [x0,2550]
-	mul	w0, w23, w3
-	sub	w28, w4, w0
-	cmp	w28, w3
-	bne	.L3257
-	b	.L3293
-.L3258:
-	add	x0, x22, :lo12:.LANCHOR0
-	ldrh	w0, [x0,2550]
-	mul	w0, w23, w0
-.L3293:
-	sub	w0, w0, w20
-	ubfiz	x0, x0, 9, 23
-	add	x0, x25, x0
-	str	x0, [x2,8]
-.L3257:
-	add	x2, x19, :lo12:.LANCHOR2
-	ldr	x0, [x2,3592]
-	ldr	x2, [x2,3672]
-	add	x1, x0, x1
-	add	x0, x22, :lo12:.LANCHOR0
-	ldrh	w0, [x0,2556]
-	str	w23, [x1,24]
-	mul	w0, w24, w0
-	add	w24, w24, 1
-	and	x0, x0, 4294967292
-	add	x0, x2, x0
-	str	x0, [x1,16]
-.L3255:
-	subs	w21, w21, #1
-	add	w23, w23, 1
-	beq	.L3259
-	add	x0, x22, :lo12:.LANCHOR0
-	ldrh	w0, [x0,2472]
-	cmp	w24, w0, lsl 3
-	bne	.L3250
-.L3259:
-	cbz	w24, .L3250
-	add	x0, x19, :lo12:.LANCHOR2
-	mov	w1, w24
+	ldr	w4, [x29, 188]
+	cmn	w4, #1
+	bne	.L3190
+	add	x5, x21, :lo12:.LANCHOR0
+	mov	w20, 0
+.L3191:
+	ldrh	w0, [x5, 2550]
+	cmp	w20, w0
+	bcc	.L3193
+.L3194:
+	ldr	w0, [x29, 172]
+	add	w22, w22, 1
+	subs	w0, w0, #1
+	str	w0, [x29, 172]
+	beq	.L3198
+	add	x0, x21, :lo12:.LANCHOR0
+	ldrh	w0, [x0, 2472]
+	cmp	w28, w0, lsl 3
+	bne	.L3189
+.L3198:
+	cbz	w28, .L3189
+	ldr	x0, [x29, 160]
+	mov	w1, w28
 	mov	w2, 0
-	ldr	x0, [x0,3592]
+	add	x8, x0, :lo12:.LANCHOR2
+	mov	x20, x8
+	ldr	x0, [x8, 3584]
 	bl	FlashReadPages
-	str	xzr, [x29,160]
-	ldr	x0, [x29,128]
-	ubfiz	x0, x0, 9, 23
-	str	x0, [x29,144]
-	ldr	w0, [x29,156]
+	ldr	w0, [x29, 156]
 	lsl	w0, w0, 9
-	str	w0, [x29,124]
-	lsl	w0, w28, 9
-	str	w0, [x29,120]
-.L3261:
-	ldr	w0, [x29,160]
-	cmp	w24, w0
-	bls	.L3296
-	ldr	x0, [x29,160]
-	add	x2, x19, :lo12:.LANCHOR2
-	mov	x1, 56
-	ldr	w3, [x29,172]
-	mul	x8, x0, x1
-	ldr	x0, [x2,3592]
-	add	x0, x0, x8
-	ldr	w1, [x0,24]
-	cmp	w1, w3
-	bne	.L3262
-	ldr	x1, [x0,8]
-	ldr	x0, [x2,3648]
-	cmp	x1, x0
-	bne	.L3263
-	ldr	x2, [x29,144]
-	mov	x0, x25
-	str	x8, [x29,104]
-	add	x1, x1, x2
-	ldr	w2, [x29,124]
-	b	.L3294
-.L3262:
-	cmp	w1, w27
-	bne	.L3263
-	ldr	x1, [x0,8]
-	ldr	x0, [x2,3656]
+	str	w0, [x29, 132]
+	ldr	w0, [x29, 152]
+	lsl	w0, w0, 9
+	str	x0, [x29, 136]
+	ldr	w0, [x29, 168]
+	lsl	w0, w0, 9
+	str	w0, [x29, 144]
+	mov	w0, 56
+	umull	x0, w28, w0
+	mov	x28, 0
+	str	x0, [x29, 120]
+	add	x0, x21, :lo12:.LANCHOR0
+	str	x0, [x29, 112]
+.L3205:
+	ldr	x0, [x20, 3584]
+	add	x0, x0, x28
+	ldr	w1, [x0, 24]
+	cmp	w27, w1
+	bne	.L3200
+	ldr	x1, [x0, 8]
+	ldr	x0, [x20, 3640]
 	cmp	x1, x0
-	bne	.L3263
-	add	x0, x22, :lo12:.LANCHOR0
-	ldr	w2, [x29,120]
-	str	x8, [x29,104]
-	ldrh	w0, [x0,2550]
-	mul	w0, w27, w0
-	sub	w0, w0, w20
-	ubfiz	x0, x0, 9, 23
-	add	x0, x25, x0
-.L3294:
+	bne	.L3201
+	ldr	x0, [x29, 136]
+	ldr	w2, [x29, 144]
+	add	x1, x1, x0
+	mov	x0, x23
+.L3226:
 	bl	ftl_memcpy
-	ldr	x8, [x29,104]
-.L3263:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	x1, [x0,3592]
-	add	x2, x1, x8
-	ldr	w3, [x1,x8]
-	cmn	w3, #1
-	bne	.L3264
-	ldr	w1, [x0,928]
-	str	w3, [x29,152]
+.L3201:
+	ldr	x1, [x20, 3584]
+	add	x0, x1, x28
+	ldr	w2, [x1, x28]
+	cmn	w2, #1
+	bne	.L3202
+	ldr	w1, [x20, 920]
+	mov	w25, w2
 	add	w1, w1, 1
-	str	w1, [x0,928]
-.L3264:
-	ldr	x0, [x2,16]
-	ldr	w1, [x2,24]
-	ldr	w0, [x0,8]
-	cmp	w1, w0
-	beq	.L3265
-	add	x0, x19, :lo12:.LANCHOR2
-	str	x8, [x29,104]
-	ldr	w1, [x0,928]
+	str	w1, [x20, 920]
+.L3202:
+	ldr	x1, [x0, 16]
+	ldr	w2, [x0, 24]
+	ldr	w1, [x1, 8]
+	cmp	w2, w1
+	beq	.L3203
+	ldr	w1, [x20, 920]
 	add	w1, w1, 1
-	str	w1, [x0,928]
-	ldr	x7, [x2,8]
-	ldr	x6, [x2,16]
-	ldr	w0, [x7,4]
-	str	w0, [sp]
-	ldr	x0, [x29,112]
-	ldr	w1, [x2,24]
-	ldr	w3, [x6]
-	ldr	w4, [x6,4]
-	ldr	w5, [x6,8]
-	ldr	w2, [x2,4]
-	ldr	w6, [x6,12]
-	ldr	w7, [x7]
+	str	w1, [x20, 920]
+	ldp	x2, x1, [x0, 8]
+	ldr	w3, [x2, 4]
+	str	w3, [sp]
+	ldp	w3, w4, [x1]
+	ldp	w5, w6, [x1, 8]
+	ldr	w7, [x2]
+	ldr	w1, [x0, 24]
+	ldr	w2, [x0, 4]
+	ldr	x0, [x29, 104]
 	bl	printk
-	ldr	x8, [x29,104]
-.L3265:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	x0, [x0,3592]
-	add	x1, x0, x8
-	ldr	w0, [x0,x8]
+.L3203:
+	ldr	x0, [x20, 3584]
+	add	x1, x0, x28
+	ldr	w0, [x0, x28]
 	cmp	w0, 256
-	bne	.L3266
-	ldr	w0, [x1,4]
-	lsr	x0, x0, 10
+	bne	.L3204
+	ldr	w0, [x1, 4]
+	lsr	w0, w0, 10
 	bl	P2V_block_in_plane
 	bl	FtlGcRefreshBlock
-.L3266:
-	ldr	x0, [x29,160]
-	add	x0, x0, 1
-	str	x0, [x29,160]
-	b	.L3261
-.L3296:
-	mov	w24, 0
-	b	.L3250
-.L3295:
-	add	x19, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x19,1464]
-	cbz	w0, .L3269
-	mov	w0, w21
-	mov	w1, 1
-	bl	ftl_do_gc
-.L3269:
-	ldr	w0, [x29,152]
-	b	.L3247
-.L3271:
-	mov	w0, -1
-.L3247:
-	sub	sp, x29, #16
-	ldp	x19, x20, [sp,32]
-	ldp	x21, x22, [sp,48]
-	ldp	x23, x24, [sp,64]
-	ldp	x25, x26, [sp,80]
-	ldp	x27, x28, [sp,96]
-	ldp	x29, x30, [sp,16]
-	add	sp, sp, 208
-	ret
+.L3204:
+	ldr	x0, [x29, 120]
+	add	x28, x28, 56
+	cmp	x0, x28
+	bne	.L3205
+	mov	w28, 0
+	b	.L3189
+.L3193:
+	madd	w0, w22, w0, w20
+	cmp	w19, w0
+	bhi	.L3192
+	ldr	w1, [x29, 148]
+	cmp	w1, w0
+	bls	.L3192
+	sub	w0, w0, w19
+	str	x5, [x29, 136]
+	lsl	w0, w0, 9
+	mov	w2, 512
+	mov	w1, 0
+	add	x0, x23, x0
+	bl	ftl_memset
+	ldr	x5, [x29, 136]
+.L3192:
+	add	w20, w20, 1
+	b	.L3191
+.L3190:
+	mov	w0, 56
+	cmp	w22, w27
+	umull	x1, w28, w0
+	ldr	x0, [x29, 160]
+	add	x0, x0, :lo12:.LANCHOR2
+	ldr	x2, [x0, 3584]
+	add	x2, x2, x1
+	str	w4, [x2, 4]
+	ldr	x2, [x0, 3584]
+	add	x2, x2, x1
+	bne	.L3195
+	ldr	x0, [x0, 3640]
+	str	x0, [x2, 8]
+	add	x0, x21, :lo12:.LANCHOR0
+	ldrh	w0, [x0, 2550]
+	udiv	w4, w19, w0
+	msub	w3, w4, w0, w19
+	str	w3, [x29, 152]
+	sub	w4, w0, w3
+	cmp	w24, w4
+	csel	w3, w24, w4, ls
+	str	w3, [x29, 168]
+	cmp	w3, w0
+	bne	.L3196
+	str	x23, [x2, 8]
+.L3196:
+	ldr	x0, [x29, 160]
+	add	x2, x0, :lo12:.LANCHOR2
+	ldr	x0, [x2, 3584]
+	ldr	x2, [x2, 3664]
+	add	x1, x0, x1
+	add	x0, x21, :lo12:.LANCHOR0
+	ldrh	w0, [x0, 2556]
+	str	w22, [x1, 24]
+	mul	w0, w0, w28
+	add	w28, w28, 1
+	and	x0, x0, 4294967292
+	add	x0, x2, x0
+	str	x0, [x1, 16]
+	b	.L3194
+.L3195:
+	cmp	w22, w26
+	bne	.L3197
+	ldr	x0, [x0, 3648]
+	str	x0, [x2, 8]
+	add	x0, x21, :lo12:.LANCHOR0
+	ldr	w3, [x29, 148]
+	ldrh	w4, [x0, 2550]
+	mul	w0, w22, w4
+	sub	w3, w3, w0
+	str	w3, [x29, 156]
+	cmp	w4, w3
+	bne	.L3196
+.L3225:
+	sub	w0, w0, w19
+	lsl	w0, w0, 9
+	add	x0, x23, x0
+	str	x0, [x2, 8]
+	b	.L3196
+.L3197:
+	add	x0, x21, :lo12:.LANCHOR0
+	ldrh	w0, [x0, 2550]
+	mul	w0, w0, w22
+	b	.L3225
+.L3200:
+	cmp	w26, w1
+	bne	.L3201
+	ldr	x1, [x0, 8]
+	ldr	x0, [x20, 3648]
+	cmp	x1, x0
+	bne	.L3201
+	ldr	x0, [x29, 112]
+	ldr	w2, [x29, 132]
+	ldrh	w0, [x0, 2550]
+	mul	w0, w0, w26
+	sub	w0, w0, w19
+	lsl	w0, w0, 9
+	add	x0, x23, x0
+	b	.L3226
+.L3210:
+	mov	w25, -1
+	b	.L3185
 	.size	ftl_read, .-ftl_read
 	.align	2
 	.global	ftl_vendor_read
 	.type	ftl_vendor_read, %function
 ftl_vendor_read:
 	stp	x29, x30, [sp, -16]!
-	mov	w5, w0
-	mov	w4, w1
-	add	x29, sp, 0
 	mov	x3, x2
-	mov	w1, w5
-	mov	w2, w4
+	mov	w2, w1
+	mov	w1, w0
+	add	x29, sp, 0
 	mov	w0, 16
 	bl	ftl_read
 	ldp	x29, x30, [sp], 16
@@ -20942,40 +20564,43 @@ ftl_vendor_read:
 	.global	FlashBootVendorRead
 	.type	FlashBootVendorRead, %function
 FlashBootVendorRead:
-	stp	x29, x30, [sp, -64]!
+	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	str	x19, [sp,16]
-	mov	w19, -1
-	str	x0, [x29,40]
-	str	x1, [x29,48]
-	str	x2, [x29,56]
+	stp	x19, x20, [sp, 16]
+	mov	w19, w0
+	str	x21, [sp, 32]
+	mov	w20, w1
+	mov	x21, x2
 	bl	rknand_device_lock
-	adrp	x3, .LANCHOR1+504
-	ldr	x2, [x29,56]
-	ldr	x1, [x29,48]
-	ldr	x0, [x29,40]
-	ldr	w3, [x3,#:lo12:.LANCHOR1+504]
-	cmp	w3, 1
-	bne	.L3299
+	adrp	x0, .LANCHOR1+504
+	ldr	w0, [x0, #:lo12:.LANCHOR1+504]
+	cmp	w0, 1
+	bne	.L3231
+	mov	w0, w19
+	mov	x2, x21
+	mov	w1, w20
 	bl	ftl_vendor_read
 	mov	w19, w0
-.L3299:
+.L3230:
 	bl	rknand_device_unlock
+	ldr	x21, [sp, 32]
 	mov	w0, w19
-	ldr	x19, [sp,16]
-	ldp	x29, x30, [sp], 64
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 48
 	ret
+.L3231:
+	mov	w19, -1
+	b	.L3230
 	.size	FlashBootVendorRead, .-FlashBootVendorRead
 	.align	2
 	.global	ftl_sys_read
 	.type	ftl_sys_read, %function
 ftl_sys_read:
 	stp	x29, x30, [sp, -16]!
-	mov	w4, w1
 	mov	x3, x2
-	add	x29, sp, 0
+	mov	w2, w1
 	add	w1, w0, 256
-	mov	w2, w4
+	add	x29, sp, 0
 	mov	w0, 16
 	bl	ftl_read
 	ldp	x29, x30, [sp], 16
@@ -20985,25 +20610,25 @@ ftl_sys_read:
 	.global	StorageSysDataLoad
 	.type	StorageSysDataLoad, %function
 StorageSysDataLoad:
-	stp	x29, x30, [sp, -48]!
+	stp	x29, x30, [sp, -32]!
 	mov	w2, 512
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	mov	w20, w0
+	stp	x19, x20, [sp, 16]
 	mov	x19, x1
-	mov	x0, x1
 	mov	w1, 0
+	mov	w20, w0
+	mov	x0, x19
 	bl	ftl_memset
 	bl	rknand_device_lock
 	mov	x2, x19
 	mov	w1, 1
 	mov	w0, w20
 	bl	ftl_sys_read
-	str	x0, [x29,40]
+	mov	w19, w0
 	bl	rknand_device_unlock
-	ldr	x0, [x29,40]
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 48
+	mov	w0, w19
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
 	ret
 	.size	StorageSysDataLoad, .-StorageSysDataLoad
 	.align	2
@@ -21011,7 +20636,7 @@ StorageSysDataLoad:
 	.type	FtlRead, %function
 FtlRead:
 	stp	x29, x30, [sp, -16]!
-	uxtb	w0, w0
+	and	w0, w0, 255
 	add	x29, sp, 0
 	bl	ftl_read
 	ldp	x29, x30, [sp], 16
@@ -21023,96 +20648,99 @@ FtlRead:
 FtlInit:
 	stp	x29, x30, [sp, -48]!
 	mov	w0, -1
-	adrp	x1, .LC76
+	adrp	x1, .LC75
+	add	x1, x1, :lo12:.LC75
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	adrp	x22, .LANCHOR1
-	add	x1, x1, :lo12:.LC76
-	add	x22, x22, :lo12:.LANCHOR1
-	adrp	x21, .LANCHOR0
-	stp	x19, x20, [sp,16]
+	stp	x21, x22, [sp, 32]
+	adrp	x21, .LANCHOR1
+	add	x21, x21, :lo12:.LANCHOR1
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	add	x21, x21, :lo12:.LANCHOR0
-	str	w0, [x22,504]
-	adrp	x0, .LANCHOR5+1484
 	add	x19, x19, :lo12:.LANCHOR2
-	str	wzr, [x0,#:lo12:.LANCHOR5+1484]
-	adrp	x0, .LC75
-	add	x0, x0, :lo12:.LC75
-	str	wzr, [x19,424]
+	adrp	x20, .LANCHOR0
+	add	x20, x20, :lo12:.LANCHOR0
+	str	w0, [x21, 504]
+	adrp	x0, .LANCHOR4+2004
+	str	wzr, [x19, 424]
+	str	wzr, [x0, #:lo12:.LANCHOR4+2004]
+	adrp	x0, .LC76
+	add	x0, x0, :lo12:.LC76
 	bl	printk
-	add	x0, x21, 176
+	add	x0, x20, 176
 	bl	FtlConstantsInit
 	bl	FtlMemInit
 	bl	FtlVariablesInit
-	ldrh	w0, [x21,2476]
+	ldrh	w0, [x20, 2476]
 	bl	FtlFreeSysBlkQueueInit
 	bl	FtlLoadBbt
-	cbz	w0, .L3305
+	cbz	w0, .L3240
+	adrp	x1, .LANCHOR3
+	add	x1, x1, :lo12:.LANCHOR3
 	adrp	x0, .LC160
+	add	x1, x1, 256
 	add	x0, x0, :lo12:.LC160
-	b	.L3319
-.L3305:
+.L3255:
+	bl	printk
+.L3241:
+	mov	w0, 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	ret
+.L3240:
 	bl	FtlSysBlkInit
-	mov	w20, w0
-	cbz	w0, .L3307
-	adrp	x0, .LC161
-	add	x0, x0, :lo12:.LC161
-.L3319:
+	cbz	w0, .L3242
 	adrp	x1, .LANCHOR3
 	add	x1, x1, :lo12:.LANCHOR3
+	adrp	x0, .LC161
 	add	x1, x1, 256
-	bl	printk
-	b	.L3306
-.L3307:
+	add	x0, x0, :lo12:.LC161
+	b	.L3255
+.L3242:
 	mov	w1, 1
-	str	w1, [x22,504]
+	str	w1, [x21, 504]
 	bl	ftl_do_gc
-	ldrh	w0, [x19,552]
+	ldrh	w0, [x19, 552]
 	cmp	w0, 15
-	bhi	.L3308
-	mov	w22, 65535
+	bhi	.L3243
 	add	w21, w0, 2
-.L3311:
-	ldrh	w0, [x19,800]
+	mov	w20, 0
+	mov	w22, 65535
+.L3246:
+	ldrh	w0, [x19, 800]
 	cmp	w0, w22
-	bne	.L3309
-	ldrh	w0, [x19,1456]
+	bne	.L3244
+	ldrh	w0, [x19, 1448]
 	cmp	w0, w22
-	bne	.L3309
+	bne	.L3244
 	and	w0, w20, 63
 	bl	List_get_gc_head_node
 	bl	FtlGcRefreshBlock
-.L3309:
-	mov	w0, 1
-	mov	w1, w0
+.L3244:
+	mov	w1, 1
+	mov	w0, w1
 	bl	ftl_do_gc
-	mov	w0, 0
 	mov	w1, 1
+	mov	w0, 0
 	bl	ftl_do_gc
-	ldrh	w0, [x19,552]
+	ldrh	w0, [x19, 552]
 	cmp	w0, w21
-	bhi	.L3306
+	bhi	.L3241
 	add	w20, w20, 1
 	cmp	w20, 4096
-	bne	.L3311
-	b	.L3306
-.L3308:
-	ldrb	w0, [x21,204]
-	cbz	w0, .L3306
+	bne	.L3246
+	b	.L3241
+.L3243:
+	ldrb	w0, [x20, 204]
+	cbz	w0, .L3241
 	mov	w19, 128
-.L3313:
-	mov	w0, 1
-	mov	w1, w0
+.L3248:
+	mov	w1, 1
+	mov	w0, w1
 	bl	ftl_do_gc
 	subs	w19, w19, #1
-	bne	.L3313
-.L3306:
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 48
-	ret
+	bne	.L3248
+	b	.L3241
 	.size	FtlInit, .-FtlInit
 	.align	2
 	.global	rk_ftl_init
@@ -21121,43 +20749,44 @@ rk_ftl_init:
 	stp	x29, x30, [sp, -32]!
 	mov	w0, 2048
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR5
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR4
-	add	x20, x20, :lo12:.LANCHOR5
-	bl	ftl_malloc
 	add	x19, x19, :lo12:.LANCHOR4
-	add	x1, x20, 1496
-	str	x0, [x20,1488]
-	add	x0, x19, 1592
-	str	xzr, [x19,1592]
-	str	xzr, [x20,1496]
+	bl	ftl_dma32_malloc
+	add	x1, x19, 2016
+	str	x0, [x19, 2008]
+	add	x0, x19, 1584
+	str	xzr, [x19, 1584]
+	str	wzr, [x19, 1592]
+	str	xzr, [x19, 2016]
 	bl	rknand_get_reg_addr
-	ldr	x1, [x19,1592]
-	mov	w0, -1
-	cbz	x1, .L3321
+	ldr	x0, [x19, 1584]
+	cbz	x0, .L3261
 	bl	rk_nandc_irq_init
-	mov	w1, 0
-	ldr	x0, [x20,1488]
-	mov	w2, w1
+	ldr	x0, [x19, 2008]
 	mov	w3, 2048
+	mov	w2, 0
+	mov	w1, 0
 	bl	FlashSramLoadStore
 	bl	rknand_flash_cs_init
-	ldr	x0, [x19,1592]
+	ldr	x0, [x19, 1584]
 	bl	FlashInit
-	mov	w19, w0
-	cbnz	w0, .L3322
+	mov	w20, w0
+	cbnz	w0, .L3258
 	bl	FtlInit
-.L3322:
+.L3258:
 	adrp	x0, .LC162
-	mov	w1, w19
+	mov	w1, w20
 	add	x0, x0, :lo12:.LC162
 	bl	printk
-	mov	w0, w19
-.L3321:
-	ldp	x19, x20, [sp,16]
+.L3256:
+	mov	w0, w20
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L3261:
+	mov	w20, -1
+	b	.L3256
 	.size	rk_ftl_init, .-rk_ftl_init
 	.align	2
 	.global	ftl_fix_nand_power_lost_error
@@ -21165,118 +20794,117 @@ rk_ftl_init:
 ftl_fix_nand_power_lost_error:
 	stp	x29, x30, [sp, -144]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR0
-	str	x27, [sp,80]
-	add	x0, x20, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	ldrb	w0, [x0,204]
-	cbz	w0, .L3325
-	adrp	x21, .LANCHOR5
-	adrp	x19, .LANCHOR2
-	add	x0, x21, :lo12:.LANCHOR5
-	add	x24, x19, :lo12:.LANCHOR2
-	adrp	x25, .LC163
-	add	x27, x24, 560
-	add	x26, x24, 608
-	ldrh	w23, [x0,1328]
-	add	x0, x25, :lo12:.LC163
-	ldr	x2, [x24,520]
-	ubfiz	x22, x23, 1, 16
-	mov	w1, w23
-	ldrh	w2, [x2,x22]
+	stp	x25, x26, [sp, 64]
+	adrp	x25, .LANCHOR0
+	add	x0, x25, :lo12:.LANCHOR0
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	str	x27, [sp, 80]
+	ldrb	w0, [x0, 204]
+	cbz	w0, .L3263
+	adrp	x21, .LANCHOR4
+	add	x0, x21, :lo12:.LANCHOR4
+	adrp	x20, .LANCHOR2
+	add	x19, x20, :lo12:.LANCHOR2
+	adrp	x24, .LC163
+	add	x27, x19, 560
+	ldrh	w22, [x0, 1842]
+	add	x26, x19, 608
+	ldr	x0, [x19, 520]
+	mov	w1, w22
+	ubfiz	x23, x22, 1, 16
+	ldrh	w2, [x0, x23]
+	add	x0, x24, :lo12:.LC163
 	bl	printk
-	ldrh	w0, [x24,560]
+	ldrh	w0, [x19, 560]
 	bl	FtlGcRefreshOpenBlock
-	ldrh	w0, [x24,608]
-	mov	w24, 4097
+	ldrh	w0, [x19, 608]
 	bl	FtlGcRefreshOpenBlock
 	mov	x0, x27
 	bl	allocate_new_data_superblock
 	mov	x0, x26
+	mov	x26, x24
+	mov	w27, 4097
 	bl	allocate_new_data_superblock
-.L3327:
-	subs	w24, w24, #1
-	beq	.L3331
-	mov	w0, 1
-	mov	w1, w0
+.L3265:
+	subs	w27, w27, #1
+	beq	.L3269
+	mov	w1, 1
+	mov	w0, w1
 	bl	ftl_do_gc
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	x0, [x0,520]
-	ldrh	w0, [x0,x22]
-	cbnz	w0, .L3327
-.L3331:
-	add	x24, x19, :lo12:.LANCHOR2
-	add	x0, x25, :lo12:.LC163
-	mov	w1, w23
-	ldr	x2, [x24,520]
-	ldrh	w2, [x2,x22]
+	ldr	x0, [x19, 520]
+	ldrh	w0, [x0, x23]
+	cbnz	w0, .L3265
+.L3269:
+	add	x24, x20, :lo12:.LANCHOR2
+	mov	w1, w22
+	ldr	x0, [x24, 520]
+	ldrh	w2, [x0, x23]
+	add	x0, x26, :lo12:.LC163
 	bl	printk
-	ldr	x0, [x24,520]
-	ldrh	w0, [x0,x22]
-	cbnz	w0, .L3329
-	add	x0, x29, 96
-	add	x20, x20, :lo12:.LANCHOR0
-	strh	w23, [x29,96]
+	ldr	x0, [x24, 520]
+	ldrh	w19, [x0, x23]
+	cbnz	w19, .L3267
+	add	x12, x29, 144
+	add	x25, x25, :lo12:.LANCHOR0
+	strh	w22, [x12, -48]!
+	mov	x0, x12
 	bl	make_superblock
-	mov	x0, 0
-	ldrh	w5, [x20,2472]
+	ldrh	w5, [x25, 2472]
+	add	x12, x12, 16
+	mov	w0, 0
 	mov	w6, 65535
-	mov	w20, w0
 	mov	w7, 56
-.L3332:
-	cmp	w5, w0, uxth
-	bls	.L3339
-	add	x1, x29, 96
-	add	x1, x1, x0, lsl 1
-	ldrh	w2, [x1,16]
-	cmp	w2, w6
-	beq	.L3333
-	add	x4, x19, :lo12:.LANCHOR2
-	lsl	w2, w2, 10
-	umull	x1, w20, w7
-	add	w20, w20, 1
-	ldr	x3, [x4,432]
-	uxth	w20, w20
-	add	x3, x3, x1
-	str	w2, [x3,4]
-	ldr	x2, [x4,432]
-	add	x1, x2, x1
-	str	xzr, [x1,8]
-	str	xzr, [x1,16]
-.L3333:
-	add	x0, x0, 1
-	b	.L3332
-.L3339:
-	add	x19, x19, :lo12:.LANCHOR2
+.L3270:
+	cmp	w0, w5
+	bne	.L3272
+	add	x20, x20, :lo12:.LANCHOR2
+	mov	w1, w22
+	ldr	x0, [x20, 520]
+	ldrh	w2, [x0, x23]
 	adrp	x0, .LC164
-	mov	w1, w23
 	add	x0, x0, :lo12:.LC164
-	ldr	x2, [x19,520]
-	ldrh	w2, [x2,x22]
 	bl	printk
-	ldr	x0, [x19,432]
+	ldr	x0, [x20, 432]
+	mov	w2, w19
 	mov	w1, 0
-	mov	w2, w20
 	bl	FlashEraseBlocks
-	ldr	x0, [x19,432]
+	ldr	x0, [x20, 432]
+	mov	w2, w19
 	mov	w1, 1
-	mov	w2, w20
 	bl	FlashEraseBlocks
-.L3329:
-	add	x21, x21, :lo12:.LANCHOR5
+.L3267:
+	add	x21, x21, :lo12:.LANCHOR4
 	mov	w0, -1
-	strh	w0, [x21,1328]
-.L3325:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldr	x27, [sp,80]
+	strh	w0, [x21, 1842]
+.L3263:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldr	x27, [sp, 80]
 	ldp	x29, x30, [sp], 144
 	ret
+.L3272:
+	ldrh	w2, [x12]
+	cmp	w2, w6
+	beq	.L3271
+	umull	x4, w19, w7
+	ldr	x3, [x24, 432]
+	lsl	w2, w2, 10
+	add	w19, w19, 1
+	add	x3, x3, x4
+	and	w19, w19, 65535
+	str	w2, [x3, 4]
+	ldr	x1, [x24, 432]
+	add	x1, x1, x4
+	stp	xzr, xzr, [x1, 8]
+.L3271:
+	add	w0, w0, 1
+	add	x12, x12, 2
+	and	w0, w0, 65535
+	b	.L3270
 	.size	ftl_fix_nand_power_lost_error, .-ftl_fix_nand_power_lost_error
 	.align	2
 	.global	rk_ftl_garbage_collect
@@ -21292,534 +20920,521 @@ rk_ftl_garbage_collect:
 	.global	ftl_write
 	.type	ftl_write, %function
 ftl_write:
-	stp	x29, x30, [sp, -288]!
-	mov	w4, w0
-	mov	w0, 0
+	stp	x29, x30, [sp, -272]!
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	mov	w23, w1
+	stp	x21, x22, [sp, 32]
+	mov	w22, w1
 	adrp	x1, .LANCHOR2
-	stp	x25, x26, [sp,64]
-	mov	w25, w2
-	add	x2, x1, :lo12:.LANCHOR2
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x27, x28, [sp,80]
-	mov	x26, x3
-	str	x1, [x29,176]
-	ldr	w3, [x2,424]
-	cbnz	w3, .L3342
+	add	x4, x1, :lo12:.LANCHOR2
+	stp	x23, x24, [sp, 48]
+	mov	w24, w2
+	stp	x19, x20, [sp, 16]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	str	x1, [x29, 168]
+	ldr	w2, [x4, 424]
+	cbnz	w2, .L3322
 	adrp	x1, .LANCHOR1
-	str	x1, [x29,152]
-	add	x3, x1, :lo12:.LANCHOR1
-	ldr	w3, [x3,504]
-	cmp	w3, 1
-	bne	.L3342
-	cmp	w4, 16
-	bne	.L3343
-	add	w0, w23, 256
-	mov	w1, w25
-	mov	x2, x26
+	add	x2, x1, :lo12:.LANCHOR1
+	str	x1, [x29, 160]
+	ldr	w2, [x2, 504]
+	cmp	w2, 1
+	bne	.L3322
+	mov	x23, x3
+	cmp	w0, 16
+	bne	.L3282
+	mov	x2, x3
+	mov	w1, w24
+	add	w0, w22, 256
 	bl	FtlVendorPartWrite
-	b	.L3342
-.L3343:
-	adrp	x21, .LANCHOR0
-	add	x4, x21, :lo12:.LANCHOR0
-	ldr	w1, [x4,2584]
-	cmp	w23, w1
-	bcs	.L3385
-	cmp	w25, w1
-	bhi	.L3385
-	add	w3, w23, w25
-	mov	w0, -1
-	cmp	w3, w1
-	bhi	.L3342
-	adrp	x5, .LANCHOR5
-	ldrh	w1, [x4,2550]
-	add	x22, x5, :lo12:.LANCHOR5
-	sub	w3, w3, #1
-	mov	w0, 2048
-	str	x5, [x29,144]
-	udiv	w27, w23, w1
-	cmp	w25, w1, lsl 1
-	str	w0, [x22,1504]
-	udiv	w0, w3, w1
-	ldr	w3, [x4,2600]
-	str	w0, [x29,208]
-	sub	w24, w0, w27
-	add	w20, w24, 1
-	ldr	w0, [x2,728]
-	add	w0, w20, w0
-	str	w0, [x2,728]
-	ldr	w0, [x2,744]
-	add	w0, w25, w0
-	str	w0, [x2,744]
-	cset	w0, cs
-	str	w0, [x29,212]
-	cbz	w3, .L3345
-	mov	w0, 56
-	sub	w3, w3, #1
-	umull	x3, w3, w0
-	ldr	x0, [x4,2608]
-	add	x3, x0, x3
-	ldr	w0, [x3,24]
+.L3280:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 272
+	ret
+.L3282:
+	adrp	x20, .LANCHOR0
+	add	x0, x20, :lo12:.LANCHOR0
+	ldr	w1, [x0, 2584]
+	cmp	w22, w1
+	bcs	.L3325
+	cmp	w24, w1
+	bhi	.L3325
+	add	w2, w22, w24
+	cmp	w1, w2
+	bcc	.L3325
+	adrp	x3, .LANCHOR4
+	add	x25, x3, :lo12:.LANCHOR4
+	mov	w1, 2048
+	sub	w2, w2, #1
+	str	x3, [x29, 152]
+	str	w1, [x25, 2024]
+	ldrh	w1, [x0, 2550]
+	cmp	w24, w1, lsl 1
+	udiv	w2, w2, w1
+	udiv	w27, w22, w1
+	str	w2, [x29, 196]
+	sub	w28, w2, w27
+	ldr	w2, [x4, 728]
+	add	w26, w28, 1
+	add	w2, w2, w26
+	str	w2, [x4, 728]
+	ldr	w2, [x4, 744]
+	add	w2, w2, w24
+	str	w2, [x4, 744]
+	cset	w2, cs
+	str	w2, [x29, 204]
+	ldr	w2, [x0, 2600]
+	cbz	w2, .L3284
+	ldr	x0, [x0, 2608]
+	sub	w2, w2, #1
+	mov	w3, 56
+	umaddl	x2, w2, w3, x0
+	ldr	w0, [x2, 24]
 	cmp	w27, w0
-	bne	.L3346
-	ldr	w0, [x2,732]
+	bne	.L3285
+	ldr	w0, [x4, 732]
+	ldr	x3, [x2, 8]
 	add	w0, w0, 1
-	str	w0, [x2,732]
-	ldr	w0, [x22,1508]
+	str	w0, [x4, 732]
+	ldr	w0, [x25, 2028]
 	add	w0, w0, 1
-	str	w0, [x22,1508]
-	msub	w0, w27, w1, w23
+	str	w0, [x25, 2028]
+	msub	w0, w27, w1, w22
 	sub	w1, w1, w0
-	ubfiz	x0, x0, 9, 23
-	cmp	w1, w25
-	csel	w19, w1, w25, ls
-	ldr	x1, [x3,8]
-	lsl	w20, w19, 9
-	add	x0, x1, x0
-	mov	w2, w20
-	mov	x1, x26
+	cmp	w24, w1
+	lsl	w0, w0, 9
+	csel	w19, w24, w1, ls
+	add	x0, x3, x0
+	lsl	w21, w19, 9
+	mov	x1, x23
+	mov	w2, w21
 	bl	ftl_memcpy
-	cbnz	w24, .L3347
-	ldr	w0, [x22,1508]
+	cbnz	w28, .L3286
+	ldr	w0, [x25, 2028]
 	cmp	w0, 2
-	bgt	.L3347
-.L3381:
+	bgt	.L3286
+.L3322:
 	mov	w0, 0
-	b	.L3342
-.L3347:
-	add	x26, x26, x20
-	sub	w25, w25, w19
-	add	w23, w23, w19
+	b	.L3280
+.L3286:
+	sub	w24, w24, w19
+	add	w22, w22, w19
+	add	x23, x23, x21
 	add	w27, w27, 1
-	mov	w20, w24
-.L3346:
-	ldr	x0, [x29,144]
-	add	x0, x0, :lo12:.LANCHOR5
-	str	wzr, [x0,1508]
-.L3345:
-	ldr	w1, [x29,208]
+	mov	w26, w28
+.L3285:
+	ldr	x0, [x29, 152]
+	add	x0, x0, :lo12:.LANCHOR4
+	str	wzr, [x0, 2028]
+.L3284:
+	ldr	w1, [x29, 196]
 	mov	w0, w27
 	bl	FtlCacheMetchLpa
-	cbz	w0, .L3348
+	cbz	w0, .L3287
 	bl	FtlCacheWriteBack
-.L3348:
-	ldr	x0, [x29,144]
-	ldr	x1, [x29,176]
-	add	x0, x0, :lo12:.LANCHOR5
-	str	w27, [x29,192]
-	add	x24, x1, :lo12:.LANCHOR2
-	add	x22, x24, 560
-	str	x22, [x29,184]
-	str	x22, [x0,1472]
-	adrp	x0, .LC165
-	add	x0, x0, :lo12:.LC165
-	str	x0, [x29,104]
-.L3349:
-	cbz	w20, .L3413
-	ldrh	w0, [x22,4]
-	cbnz	w0, .L3350
-	ldr	x1, [x29,184]
-	cmp	x22, x1
-	bne	.L3351
-	add	x0, x24, 608
-	ldrh	w19, [x0,4]
-	cbnz	w19, .L3352
+.L3287:
+	ldr	x1, [x29, 168]
+	mov	w19, w27
+	ldr	x0, [x29, 152]
+	add	x25, x1, :lo12:.LANCHOR2
+	add	x0, x0, :lo12:.LANCHOR4
+	add	x1, x25, 560
+	mov	x21, x1
+	str	x1, [x29, 128]
+	str	x1, [x29, 176]
+	str	x1, [x0, 1992]
+.L3288:
+	cbnz	w26, .L3316
+	ldr	w0, [x29, 196]
+	sub	w1, w0, w27
+	mov	w0, 0
+	bl	ftl_do_gc
+	ldr	x0, [x29, 168]
+	add	x0, x0, :lo12:.LANCHOR2
+	ldrh	w0, [x0, 552]
+	cmp	w0, 5
+	bls	.L3317
+	cmp	w0, 31
+	bhi	.L3322
+	add	x20, x20, :lo12:.LANCHOR0
+	ldrb	w0, [x20, 72]
+	cbnz	w0, .L3322
+.L3317:
+	ldr	x0, [x29, 168]
+	mov	w20, 65535
+	mov	w21, 128
+	add	x19, x0, :lo12:.LANCHOR2
+.L3320:
+	ldrh	w0, [x19, 800]
+	cmp	w0, w20
+	bne	.L3319
+	ldrh	w0, [x19, 1448]
+	cmp	w0, w20
+	bne	.L3319
+	ldrh	w0, [x19, 1450]
+	cmp	w0, w20
+	bne	.L3319
+	and	w0, w26, 7
+	bl	List_get_gc_head_node
+	bl	FtlGcRefreshBlock
+.L3319:
+	mov	w1, 1
+	strh	w21, [x19, 1366]
+	mov	w0, w1
+	strh	w21, [x19, 1364]
+	bl	ftl_do_gc
+	mov	w1, 1
+	mov	w0, 0
+	bl	ftl_do_gc
+	ldr	w0, [x19, 424]
+	cbnz	w0, .L3322
+	ldrh	w0, [x19, 552]
+	cmp	w0, 2
+	bhi	.L3322
+	add	w26, w26, 1
+	cmp	w26, 256
+	bne	.L3320
+	b	.L3322
+.L3316:
+	ldrh	w0, [x21, 4]
+	cbnz	w0, .L3289
+	ldr	x0, [x29, 128]
+	cmp	x21, x0
+	bne	.L3290
+	add	x0, x25, 608
+	ldrh	w1, [x0, 4]
+	cbnz	w1, .L3291
 	bl	allocate_new_data_superblock
-	ldr	x0, [x29,152]
+	ldr	x0, [x29, 160]
 	add	x0, x0, :lo12:.LANCHOR1
-	str	w19, [x0,3460]
-.L3352:
-	ldr	x0, [x29,184]
-	add	x22, x24, 608
+	str	wzr, [x0, 3460]
+.L3291:
+	ldr	x0, [x29, 176]
+	add	x21, x25, 608
 	bl	allocate_new_data_superblock
-	ldr	x0, [x29,152]
+	ldr	x0, [x29, 160]
 	add	x0, x0, :lo12:.LANCHOR1
-	ldr	w0, [x0,3460]
-	cbnz	w0, .L3353
-.L3354:
-	ldr	x22, [x29,184]
-	b	.L3353
-.L3351:
-	ldr	x1, [x29,152]
-	add	x1, x1, :lo12:.LANCHOR1
-	str	w0, [x1,3460]
-	ldr	x0, [x29,184]
-	ldrh	w0, [x0,4]
-	cbnz	w0, .L3354
-	mov	x0, x22
-	bl	allocate_new_data_superblock
-.L3353:
-	ldrh	w0, [x22,4]
-	cbnz	w0, .L3355
-	mov	x0, x22
+	ldr	w0, [x0, 3460]
+	cmp	w0, 0
+	ldr	x0, [x29, 176]
+	csel	x21, x21, x0, ne
+.L3292:
+	ldrh	w0, [x21, 4]
+	cbnz	w0, .L3293
+	mov	x0, x21
 	bl	allocate_new_data_superblock
-.L3355:
-	ldr	x0, [x29,144]
-	add	x0, x0, :lo12:.LANCHOR5
-	str	x22, [x0,1472]
-.L3350:
-	add	x2, x21, :lo12:.LANCHOR0
-	ldr	w0, [x24,3588]
-	ldrh	w1, [x22,4]
-	str	xzr, [x29,200]
-	ldr	w2, [x2,2600]
-	sub	w0, w0, w2
+.L3293:
+	ldr	x0, [x29, 152]
+	add	x0, x0, :lo12:.LANCHOR4
+	str	x21, [x0, 1992]
+.L3289:
+	add	x1, x20, :lo12:.LANCHOR0
+	ldr	w0, [x25, 3580]
+	str	wzr, [x29, 200]
+	ldr	w1, [x1, 2600]
+	sub	w0, w0, w1
+	ldrh	w1, [x21, 4]
+	cmp	w0, w26
+	csel	w0, w0, w26, ls
 	cmp	w1, w0
 	csel	w0, w1, w0, ls
-	cmp	w0, w20
-	csel	w0, w0, w20, ls
-	str	w0, [x29,140]
-	ldr	w0, [x29,212]
+	str	w0, [x29, 124]
+	ldr	w0, [x29, 204]
 	and	w0, w0, 1
-	str	w0, [x29,116]
-	add	w0, w25, w23
-	str	w0, [x29,136]
-.L3356:
-	ldr	w0, [x29,200]
-	ldr	w2, [x29,140]
-	ldr	w1, [x29,192]
-	cmp	w0, w2
-	add	w28, w1, w0
-	bcs	.L3414
-	ldrh	w1, [x22,4]
-	cbz	w1, .L3389
-	ldr	w1, [x29,208]
-	cmp	w28, w1
-	cset	w6, eq
-	cbz	w0, .L3358
-	ldr	w1, [x29,116]
-	tst	w6, w1
-	beq	.L3358
-	add	x1, x21, :lo12:.LANCHOR0
-	ldr	w2, [x29,136]
-	ldrh	w1, [x1,2550]
-	msub	w2, w28, w1, w2
-	cmp	w2, w1
-	bne	.L3389
-.L3358:
-	add	x1, x29, 228
+	str	w0, [x29, 120]
+	adrp	x0, .LC165
+	add	x0, x0, :lo12:.LC165
+	str	x0, [x29, 112]
+.L3294:
+	ldr	w1, [x29, 124]
+	ldr	w0, [x29, 200]
+	cmp	w0, w1
+	bne	.L3312
+.L3295:
+	ldr	w0, [x29, 200]
+	sub	w26, w26, w0
+	add	x0, x20, :lo12:.LANCHOR0
+	ldr	w1, [x0, 2600]
+	ldr	w0, [x25, 3580]
+	cmp	w1, w0
+	bcs	.L3313
+	ldr	w0, [x29, 204]
+	cbnz	w0, .L3313
+	ldrh	w0, [x21, 4]
+	cbz	w0, .L3313
+.L3315:
+	str	wzr, [x29, 204]
+	b	.L3288
+.L3290:
+	ldr	x0, [x29, 160]
+	add	x0, x0, :lo12:.LANCHOR1
+	str	wzr, [x0, 3460]
+	ldr	x0, [x29, 128]
+	ldrh	w0, [x0, 4]
+	cbnz	w0, .L3329
+	mov	x0, x21
+	bl	allocate_new_data_superblock
+	b	.L3292
+.L3329:
+	ldr	x21, [x29, 176]
+	b	.L3293
+.L3312:
+	ldrh	w0, [x21, 4]
+	cbz	w0, .L3295
+	ldr	w0, [x29, 196]
+	cmp	w0, w19
+	ldr	w0, [x29, 120]
+	cset	w4, eq
+	tst	w4, w0
+	beq	.L3296
+	ldr	w0, [x29, 200]
+	cbz	w0, .L3296
+	add	x0, x20, :lo12:.LANCHOR0
+	ldrh	w1, [x0, 2550]
+	add	w0, w22, w24
+	msub	w0, w19, w1, w0
+	cmp	w1, w0
+	bne	.L3295
+.L3296:
+	add	x1, x29, 212
 	mov	w2, 0
-	mov	w0, w28
-	str	x6, [x29,96]
-	add	x19, x21, :lo12:.LANCHOR0
+	str	w4, [x29, 108]
+	mov	w0, w19
 	bl	log2phys
-	mov	x0, x22
+	mov	x0, x21
 	bl	get_new_active_ppa
-	ldr	w5, [x19,2600]
-	mov	w4, 56
-	ldr	x2, [x19,2608]
-	str	x4, [x29,160]
-	umull	x1, w5, w4
-	add	x2, x2, x1
-	str	w0, [x2,4]
-	ldrh	w2, [x19,2556]
-	ldr	x0, [x19,2608]
-	add	x1, x0, x1
-	mul	w0, w2, w5
-	and	x0, x0, 4294967292
-	str	x0, [x29,128]
-	ldr	x0, [x24,3680]
-	ldr	x3, [x29,128]
-	str	x0, [x29,120]
-	add	x0, x0, x3
-	str	x0, [x29,216]
-	str	x0, [x1,16]
-	ldrh	w0, [x19,2554]
-	str	w28, [x1,24]
-	mul	w0, w0, w5
-	ldr	x5, [x24,3640]
-	and	x0, x0, 4294967292
-	add	x0, x5, x0
-	str	x0, [x1,8]
-	ldr	x0, [x29,216]
+	add	x3, x20, :lo12:.LANCHOR0
+	mov	w5, 56
+	str	x3, [x29, 184]
+	str	w5, [x29, 192]
+	ldr	w6, [x3, 2600]
+	ldr	x1, [x3, 2608]
+	umull	x2, w6, w5
+	add	x1, x1, x2
+	str	w0, [x1, 4]
+	ldr	x0, [x3, 2608]
+	add	x0, x0, x2
+	ldrh	w2, [x3, 2556]
+	str	w19, [x0, 24]
+	mul	w1, w6, w2
+	and	x1, x1, 4294967292
+	str	x1, [x29, 144]
+	ldr	x1, [x25, 3672]
+	ldr	x4, [x29, 144]
+	str	x1, [x29, 136]
+	add	x28, x1, x4
+	ldrh	w1, [x3, 2554]
+	str	x28, [x0, 16]
+	mul	w1, w1, w6
+	ldr	x6, [x25, 3632]
+	and	x1, x1, 4294967292
+	add	x1, x6, x1
+	str	x1, [x0, 8]
 	mov	w1, 0
+	mov	x0, x28
 	bl	ftl_memset
-	cmp	w28, w27
+	cmp	w27, w19
+	ldr	w4, [x29, 108]
 	cset	w0, eq
-	str	w0, [x29,196]
-	cbnz	w0, .L3393
-	ldr	x6, [x29,96]
-	ldr	x4, [x29,160]
-	cbz	w6, .L3359
-	ldr	w0, [x29,136]
-	ldrh	w19, [x19,2550]
-	msub	w19, w28, w19, w0
-	ldr	w0, [x29,196]
-	str	w0, [x29,160]
-	uxth	w19, w19
-	b	.L3362
-.L3393:
-	ldrh	w19, [x19,2550]
-	udiv	w0, w23, w19
-	msub	w0, w0, w19, w23
-	str	w0, [x29,160]
-	sub	w19, w19, w0
-	cmp	w19, w25
-	csel	w19, w19, w25, ls
-.L3362:
-	add	x2, x21, :lo12:.LANCHOR0
-	ldrh	w0, [x2,2550]
-	cmp	w19, w0
-	bne	.L3363
-	ldr	w0, [x29,196]
-	mov	x1, x26
-	cbnz	w0, .L3364
-	mul	w1, w19, w28
-	sub	w1, w1, w23
-	ubfiz	x1, x1, 9, 23
-	add	x1, x26, x1
-.L3364:
-	ldr	w2, [x29,212]
-	mov	w0, 56
-	add	x4, x21, :lo12:.LANCHOR0
-	cbz	w2, .L3365
-	ldr	w2, [x4,2600]
-	umull	x0, w2, w0
-	ldr	x2, [x4,2608]
-	add	x0, x2, x0
-	b	.L3411
-.L3365:
-	ldr	w2, [x4,2600]
-	umull	x0, w2, w0
-	ldr	x2, [x4,2608]
-	add	x0, x2, x0
-	ldrh	w2, [x4,2554]
-	ldr	x0, [x0,8]
-	b	.L3412
-.L3363:
-	ldr	w0, [x29,228]
+	ldr	w5, [x29, 192]
+	orr	w4, w4, w0
+	ldr	x3, [x29, 184]
+	cbz	w4, .L3297
+	bne	.L3298
+	ldrh	w2, [x3, 2550]
+	udiv	w0, w22, w2
+	msub	w0, w0, w2, w22
+	str	w0, [x29, 192]
+	sub	w2, w2, w0
+	cmp	w2, w24
+	csel	w0, w2, w24, ls
+	str	w0, [x29, 184]
+.L3299:
+	add	x0, x20, :lo12:.LANCHOR0
+	ldr	w2, [x29, 184]
+	ldrh	w1, [x0, 2550]
+	cmp	w1, w2
+	bne	.L3300
+	cmp	w27, w19
+	beq	.L3330
+	mul	w1, w19, w2
+	sub	w1, w1, w22
+	lsl	w1, w1, 9
+	add	x1, x23, x1
+.L3301:
+	ldr	w0, [x29, 204]
+	add	x2, x20, :lo12:.LANCHOR0
+	cbz	w0, .L3302
+	ldr	w0, [x2, 2600]
+	mov	w3, 56
+	ldr	x2, [x2, 2608]
+	umaddl	x0, w0, w3, x2
+.L3348:
+	str	x1, [x0, 8]
+.L3303:
+	ldp	x1, x2, [x29, 136]
+	mov	w0, -3947
+	strh	w0, [x1, x2]
+	add	x1, x20, :lo12:.LANCHOR0
+	ldr	w0, [x25, 756]
+	stp	w0, w19, [x28, 4]
+	add	w19, w19, 1
+	add	w0, w0, 1
 	cmn	w0, #1
-	beq	.L3367
-	str	w0, [x29,236]
-	mov	w1, 56
-	ldr	w0, [x2,2600]
-	str	w28, [x29,256]
-	umull	x0, w0, w1
-	ldr	x1, [x2,2608]
+	csel	w0, w0, wzr, ne
+	str	w0, [x25, 756]
+	ldr	w0, [x29, 212]
+	str	w0, [x28, 12]
+	ldrh	w0, [x21]
+	strh	w0, [x28, 2]
+	ldr	w0, [x1, 2600]
+	add	w0, w0, 1
+	str	w0, [x1, 2600]
+	ldr	w0, [x29, 200]
+	add	w0, w0, 1
+	str	w0, [x29, 200]
+	b	.L3294
+.L3298:
+	ldrh	w0, [x3, 2550]
+	add	w2, w22, w24
+	str	wzr, [x29, 192]
+	msub	w2, w19, w0, w2
+	and	w0, w2, 65535
+	str	w0, [x29, 184]
+	b	.L3299
+.L3330:
+	mov	x1, x23
+	b	.L3301
+.L3302:
+	ldr	w0, [x2, 2600]
+	mov	w4, 56
+	ldr	x3, [x2, 2608]
+	ldrh	w2, [x2, 2554]
+	nop // between mem op and mult-accumulate
+	umaddl	x0, w0, w4, x3
+.L3349:
+	ldr	x0, [x0, 8]
+	b	.L3351
+.L3300:
+	ldr	w1, [x29, 212]
+	mov	w2, 56
+	cmn	w1, #1
+	beq	.L3304
+	str	w1, [x29, 220]
+	ldr	w1, [x0, 2600]
+	ldr	x0, [x0, 2608]
+	str	w19, [x29, 240]
+	nop // between mem op and mult-accumulate
+	umaddl	x0, w1, w2, x0
 	mov	w2, 0
-	add	x0, x1, x0
-	ldr	x1, [x0,8]
-	ldr	x0, [x0,16]
-	str	x1, [x29,240]
+	ldp	x1, x0, [x0, 8]
+	stp	x1, x0, [x29, 224]
 	mov	w1, 1
-	str	x0, [x29,248]
-	add	x0, x29, 232
+	add	x0, x29, 216
 	bl	FlashReadPages
-	ldr	w0, [x29,232]
+	ldr	w0, [x29, 216]
 	cmn	w0, #1
-	bne	.L3368
-	ldr	w0, [x24,928]
-	add	w0, w0, 1
-	str	w0, [x24,928]
-	b	.L3370
-.L3368:
-	ldr	x0, [x29,216]
-	ldr	w0, [x0,8]
-	cmp	w0, w28
-	beq	.L3370
-	ldr	w0, [x24,928]
-	mov	w2, w28
-	ldr	x1, [x29,216]
+	bne	.L3305
+	ldr	w0, [x25, 920]
 	add	w0, w0, 1
-	str	w0, [x24,928]
-	ldr	x0, [x29,104]
-	ldr	w1, [x1,8]
-	bl	printk
-	b	.L3370
-.L3367:
-	ldr	w0, [x2,2600]
-	mov	w1, 56
-	umull	x0, w0, w1
-	ldr	x1, [x2,2608]
-	ldrh	w2, [x2,2554]
-	add	x0, x1, x0
-	mov	w1, 0
-	ldr	x0, [x0,8]
-	bl	ftl_memset
-.L3370:
-	ldr	w1, [x29,196]
-	mov	w0, 56
-	lsl	w2, w19, 9
-	cbz	w1, .L3371
-	add	x1, x21, :lo12:.LANCHOR0
-	ldr	w4, [x1,2600]
-	umull	x0, w4, w0
-	ldr	x4, [x1,2608]
-	add	x4, x4, x0
-	ldr	x0, [x29,160]
-	ubfiz	x0, x0, 9, 23
-	ldr	x1, [x4,8]
-	add	x0, x1, x0
-	mov	x1, x26
-	b	.L3412
-.L3371:
-	add	x5, x21, :lo12:.LANCHOR0
-	ldr	w4, [x5,2600]
-	ldr	x1, [x5,2608]
-	umull	x0, w4, w0
-	add	x0, x1, x0
-	ldrh	w1, [x5,2550]
-	mul	w1, w28, w1
-	ldr	x0, [x0,8]
-	sub	w1, w1, w23
-	ubfiz	x1, x1, 9, 23
-	add	x1, x26, x1
-	b	.L3412
-.L3359:
-	ldr	w0, [x29,212]
-	ldrh	w1, [x19,2550]
-	ldr	w2, [x19,2600]
-	cbz	w0, .L3372
-	mul	w1, w28, w1
-	umull	x0, w2, w4
-	sub	w1, w1, w23
-	ldr	x2, [x19,2608]
-	ubfiz	x1, x1, 9, 23
-	add	x0, x2, x0
-	add	x1, x26, x1
-.L3411:
-	str	x1, [x0,8]
-	b	.L3366
-.L3372:
-	umull	x0, w2, w4
-	ldr	x2, [x19,2608]
-	mul	w1, w28, w1
-	add	x0, x2, x0
-	ldrh	w2, [x19,2554]
-	sub	w1, w1, w23
-	ubfiz	x1, x1, 9, 23
-	ldr	x0, [x0,8]
-	add	x1, x26, x1
-.L3412:
+	str	w0, [x25, 920]
+.L3307:
+	ldr	w0, [x29, 184]
+	cmp	w27, w19
+	lsl	w2, w0, 9
+	bne	.L3308
+	add	x0, x20, :lo12:.LANCHOR0
+	mov	w3, 56
+	ldr	w1, [x0, 2600]
+	ldr	x0, [x0, 2608]
+	umaddl	x1, w1, w3, x0
+	ldr	w0, [x29, 192]
+	lsl	w0, w0, 9
+	ldr	x3, [x1, 8]
+	mov	x1, x23
+	add	x0, x3, x0
+.L3351:
 	bl	ftl_memcpy
-.L3366:
-	ldr	x1, [x29,120]
-	mov	w0, -3947
-	ldr	x2, [x29,128]
-	strh	w0, [x1,x2]
-	ldr	x1, [x29,216]
-	ldr	w0, [x24,756]
-	str	w0, [x1,4]
-	add	w0, w0, 1
-	cmn	w0, #1
-	str	w28, [x1,8]
-	csel	w0, w0, wzr, ne
-	str	w0, [x24,756]
-	ldr	w0, [x29,228]
-	str	w0, [x1,12]
-	ldrh	w0, [x22]
-	strh	w0, [x1,2]
-	add	x1, x21, :lo12:.LANCHOR0
-	ldr	w0, [x1,2600]
+	b	.L3303
+.L3305:
+	ldr	w0, [x28, 8]
+	cmp	w19, w0
+	beq	.L3307
+	ldr	w0, [x25, 920]
+	mov	w2, w19
 	add	w0, w0, 1
-	str	w0, [x1,2600]
-	ldr	x0, [x29,200]
-	add	x0, x0, 1
-	str	x0, [x29,200]
-	b	.L3356
-.L3414:
-	str	w28, [x29,192]
-	mov	x0, x2
-	b	.L3357
-.L3389:
-	str	w28, [x29,192]
-.L3357:
-	sub	w20, w20, w0
-	ldr	w0, [x29,212]
-	cbnz	w0, .L3376
-	add	x0, x21, :lo12:.LANCHOR0
-	ldr	w1, [x0,2600]
-	ldr	w0, [x24,3588]
-	cmp	w1, w0
-	bcs	.L3376
-	ldrh	w0, [x22,4]
-	cbz	w0, .L3376
-.L3378:
-	str	wzr, [x29,212]
+	str	w0, [x25, 920]
+	ldr	x0, [x29, 112]
+	ldr	w1, [x28, 8]
+	bl	printk
+	b	.L3307
+.L3304:
+	ldr	x1, [x0, 2608]
+	ldr	w3, [x0, 2600]
+	umaddl	x3, w3, w2, x1
+	ldrh	w2, [x0, 2554]
+	mov	w1, 0
+	ldr	x0, [x3, 8]
+	bl	ftl_memset
+	b	.L3307
+.L3308:
+	add	x3, x20, :lo12:.LANCHOR0
+	mov	w4, 56
+	ldrh	w1, [x3, 2550]
+	ldr	w0, [x3, 2600]
+	ldr	x3, [x3, 2608]
+	mul	w1, w1, w19
+	umaddl	x0, w0, w4, x3
+	sub	w1, w1, w22
+	lsl	w1, w1, 9
+.L3350:
+	add	x1, x23, x1
 	b	.L3349
-.L3376:
+.L3297:
+	ldr	w0, [x29, 204]
+	ldrh	w1, [x3, 2550]
+	cbz	w0, .L3309
+	mul	w1, w1, w19
+	ldr	w0, [x3, 2600]
+	ldr	x2, [x3, 2608]
+	sub	w1, w1, w22
+	lsl	w1, w1, 9
+	add	x1, x23, x1
+	umaddl	x0, w0, w5, x2
+	b	.L3348
+.L3309:
+	ldr	x2, [x3, 2608]
+	mul	w1, w1, w19
+	ldr	w0, [x3, 2600]
+	sub	w1, w1, w22
+	lsl	w1, w1, 9
+	umaddl	x0, w0, w5, x2
+	ldrh	w2, [x3, 2554]
+	b	.L3350
+.L3313:
 	bl	FtlCacheWriteBack
-	add	x0, x21, :lo12:.LANCHOR0
-	cmp	w20, 1
-	str	wzr, [x0,2600]
-	bhi	.L3349
-	b	.L3378
-.L3413:
-	ldr	w1, [x29,208]
-	mov	w0, w20
-	sub	w1, w1, w27
-	bl	ftl_do_gc
-	ldr	x0, [x29,176]
-	add	x0, x0, :lo12:.LANCHOR2
-	ldrh	w0, [x0,552]
-	cmp	w0, 5
-	bls	.L3380
-	cmp	w0, 31
-	bhi	.L3381
-	add	x21, x21, :lo12:.LANCHOR0
-	ldrb	w0, [x21,72]
-	cbnz	w0, .L3381
-.L3380:
-	ldr	x0, [x29,176]
-	mov	w21, 65535
-	mov	w22, 128
-	add	x19, x0, :lo12:.LANCHOR2
-.L3404:
-	ldrh	w0, [x19,800]
-	cmp	w0, w21
-	bne	.L3382
-	ldrh	w0, [x19,1456]
-	cmp	w0, w21
-	bne	.L3382
-	ldrh	w0, [x19,1458]
-	cmp	w0, w21
-	bne	.L3382
-	and	w0, w20, 7
-	bl	List_get_gc_head_node
-	bl	FtlGcRefreshBlock
-.L3382:
-	mov	w0, 1
-	strh	w22, [x19,1370]
-	mov	w1, w0
-	strh	w22, [x19,1368]
-	bl	ftl_do_gc
-	mov	w0, 0
-	mov	w1, 1
-	bl	ftl_do_gc
-	ldr	w0, [x19,424]
-	cbnz	w0, .L3381
-	ldrh	w0, [x19,552]
-	cmp	w0, 2
-	bhi	.L3381
-	add	w20, w20, 1
-	cmp	w20, 256
-	bne	.L3404
-	b	.L3381
-.L3385:
+	add	x0, x20, :lo12:.LANCHOR0
+	cmp	w26, 1
+	str	wzr, [x0, 2600]
+	bhi	.L3288
+	b	.L3315
+.L3325:
 	mov	w0, -1
-.L3342:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 288
-	ret
+	b	.L3280
 	.size	ftl_write, .-ftl_write
 	.align	2
 	.global	ftl_vendor_write
 	.type	ftl_vendor_write, %function
 ftl_vendor_write:
 	stp	x29, x30, [sp, -16]!
-	mov	w5, w0
-	mov	w4, w1
-	add	x29, sp, 0
 	mov	x3, x2
-	mov	w1, w5
-	mov	w2, w4
+	mov	w2, w1
+	mov	w1, w0
+	add	x29, sp, 0
 	mov	w0, 16
 	bl	ftl_write
 	ldp	x29, x30, [sp], 16
@@ -21829,40 +21444,43 @@ ftl_vendor_write:
 	.global	FlashBootVendorWrite
 	.type	FlashBootVendorWrite, %function
 FlashBootVendorWrite:
-	stp	x29, x30, [sp, -64]!
+	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	str	x19, [sp,16]
-	mov	w19, -1
-	str	x0, [x29,40]
-	str	x1, [x29,48]
-	str	x2, [x29,56]
+	stp	x19, x20, [sp, 16]
+	mov	w19, w0
+	str	x21, [sp, 32]
+	mov	w20, w1
+	mov	x21, x2
 	bl	rknand_device_lock
-	adrp	x3, .LANCHOR1+504
-	ldr	x2, [x29,56]
-	ldr	x1, [x29,48]
-	ldr	x0, [x29,40]
-	ldr	w3, [x3,#:lo12:.LANCHOR1+504]
-	cmp	w3, 1
-	bne	.L3417
+	adrp	x0, .LANCHOR1+504
+	ldr	w0, [x0, #:lo12:.LANCHOR1+504]
+	cmp	w0, 1
+	bne	.L3356
+	mov	w0, w19
+	mov	x2, x21
+	mov	w1, w20
 	bl	ftl_vendor_write
 	mov	w19, w0
-.L3417:
+.L3355:
 	bl	rknand_device_unlock
+	ldr	x21, [sp, 32]
 	mov	w0, w19
-	ldr	x19, [sp,16]
-	ldp	x29, x30, [sp], 64
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 48
 	ret
+.L3356:
+	mov	w19, -1
+	b	.L3355
 	.size	FlashBootVendorWrite, .-FlashBootVendorWrite
 	.align	2
 	.global	ftl_sys_write
 	.type	ftl_sys_write, %function
 ftl_sys_write:
 	stp	x29, x30, [sp, -16]!
-	mov	w4, w1
 	mov	x3, x2
-	add	x29, sp, 0
+	mov	w2, w1
 	add	w1, w0, 256
-	mov	w2, w4
+	add	x29, sp, 0
 	mov	w0, 16
 	bl	ftl_write
 	ldp	x29, x30, [sp], 16
@@ -21874,16 +21492,18 @@ ftl_sys_write:
 StorageSysDataStore:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	str	x0, [x29,16]
-	str	x1, [x29,24]
+	stp	x19, x20, [sp, 16]
+	mov	x20, x1
+	mov	w19, w0
 	bl	rknand_device_lock
-	ldr	x2, [x29,24]
+	mov	x2, x20
 	mov	w1, 1
-	ldr	x0, [x29,16]
+	mov	w0, w19
 	bl	ftl_sys_write
-	str	x0, [x29,24]
+	mov	w19, w0
 	bl	rknand_device_unlock
-	ldr	x0, [x29,24]
+	mov	w0, w19
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	StorageSysDataStore, .-StorageSysDataStore
@@ -21892,256 +21512,237 @@ StorageSysDataStore:
 	.type	FtlDumpSysBlock, %function
 FtlDumpSysBlock:
 	sub	sp, sp, #96
-	stp	x29, x30, [sp,16]
+	stp	x29, x30, [sp, 16]
 	add	x29, sp, 16
-	stp	x19, x20, [sp,32]
-	stp	x21, x22, [sp,48]
+	stp	x19, x20, [sp, 32]
 	adrp	x19, .LANCHOR4
-	adrp	x21, .LANCHOR2
-	stp	x23, x24, [sp,64]
+	stp	x21, x22, [sp, 48]
 	add	x19, x19, :lo12:.LANCHOR4
-	uxth	w23, w0
+	stp	x23, x24, [sp, 64]
+	adrp	x21, .LANCHOR2
+	and	w24, w0, 65535
 	add	x0, x21, :lo12:.LANCHOR2
-	str	x25, [sp,80]
-	add	x19, x19, 1704
-	adrp	x22, .LC166
-	adrp	x24, .LC167
-	lsl	w25, w23, 10
-	ldr	x1, [x0,3616]
+	str	x25, [sp, 80]
+	add	x19, x19, 1712
+	adrp	x22, .LANCHOR0
+	adrp	x23, .LC166
+	ldr	x1, [x0, 3608]
+	add	x22, x22, :lo12:.LANCHOR0
+	ldr	x0, [x0, 3656]
+	add	x23, x23, :lo12:.LC166
+	lsl	w25, w24, 10
 	mov	w20, 0
-	ldr	x0, [x0,3664]
-	add	x22, x22, :lo12:.LC166
-	str	x1, [x19,8]
-	add	x24, x24, :lo12:.LC167
-	str	x0, [x19,16]
-.L3422:
-	adrp	x0, .LANCHOR0+2546
-	ldrh	w0, [x0,#:lo12:.LANCHOR0+2546]
+	stp	x1, x0, [x19, 8]
+.L3363:
+	ldrh	w0, [x22, 2546]
 	cmp	w20, w0
-	bge	.L3428
-	mov	w1, 1
+	blt	.L3365
+	ldp	x19, x20, [sp, 32]
+	ldp	x21, x22, [sp, 48]
+	ldp	x23, x24, [sp, 64]
+	ldp	x29, x30, [sp, 16]
+	ldr	x25, [sp, 80]
+	add	sp, sp, 96
+	ret
+.L3365:
 	orr	w0, w20, w25
-	mov	w2, w1
-	str	w0, [x19,4]
+	mov	w2, 1
+	str	w0, [x19, 4]
+	mov	w1, w2
 	mov	x0, x19
 	bl	FlashReadPages
-	ldr	x0, [x19,8]
-	mov	w1, w23
-	ldr	x7, [x19,16]
-	ldr	w0, [x0]
-	str	w0, [sp]
-	mov	x0, x22
-	ldr	w4, [x7]
-	ldr	w5, [x7,4]
-	ldr	w6, [x7,8]
-	ldr	w2, [x19]
-	ldr	w3, [x19,4]
-	ldr	w7, [x7,12]
+	ldp	x1, x0, [x19, 8]
+	ldr	w1, [x1]
+	str	w1, [sp]
+	mov	w1, w24
+	ldp	w4, w5, [x0]
+	ldp	w6, w7, [x0, 8]
+	mov	x0, x23
+	ldp	w2, w3, [x19]
 	bl	printk
-	ldr	x0, [x19,16]
+	ldr	x0, [x19, 16]
 	ldr	w0, [x0]
 	cmn	w0, #1
-	beq	.L3423
-	add	x1, x21, :lo12:.LANCHOR2
-	mov	x0, x24
-	mov	w2, 4
+	beq	.L3364
+	add	x0, x21, :lo12:.LANCHOR2
 	mov	w3, 768
-	ldr	x1, [x1,3616]
+	mov	w2, 4
+	ldr	x1, [x0, 3608]
+	adrp	x0, .LC167
+	add	x0, x0, :lo12:.LC167
 	bl	rknand_print_hex
-.L3423:
+.L3364:
 	add	w20, w20, 1
 	sxth	w20, w20
-	b	.L3422
-.L3428:
-	sub	sp, x29, #16
-	ldp	x19, x20, [sp,32]
-	ldp	x21, x22, [sp,48]
-	ldp	x23, x24, [sp,64]
-	ldr	x25, [sp,80]
-	ldp	x29, x30, [sp,16]
-	add	sp, sp, 96
-	ret
+	b	.L3363
 	.size	FtlDumpSysBlock, .-FtlDumpSysBlock
 	.align	2
 	.global	dump_map_info
 	.type	dump_map_info, %function
 dump_map_info:
-	sub	sp, sp, #128
-	stp	x29, x30, [sp,16]
+	sub	sp, sp, #112
+	stp	x29, x30, [sp, 16]
 	add	x29, sp, 16
-	stp	x19, x20, [sp,32]
+	stp	x19, x20, [sp, 32]
 	adrp	x19, .LANCHOR0
-	add	x0, x19, :lo12:.LANCHOR0
-	stp	x23, x24, [sp,64]
-	stp	x25, x26, [sp,80]
-	stp	x21, x22, [sp,48]
-	stp	x27, x28, [sp,96]
-	adrp	x23, .LC168
-	mov	w25, 56
-	ldrh	w21, [x0,2480]
-	adrp	x24, .LANCHOR2
-	mov	w26, 4
-	add	x23, x23, :lo12:.LC168
-.L3430:
-	add	x2, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x2,2482]
-	cmp	w0, w21
-	bls	.L3443
-	mov	x22, 0
-	ldrh	w5, [x2,2472]
-	ldrh	w4, [x2,2556]
-	mov	w27, w22
-	mov	x20, x2
-.L3439:
-	cmp	w5, w22, uxth
-	bls	.L3444
-	add	x0, x20, 2504
-	mov	w1, w21
-	str	x4, [x29,96]
-	str	x5, [x29,104]
-	ldrb	w0, [x0,x22]
+	add	x20, x19, :lo12:.LANCHOR0
+	stp	x23, x24, [sp, 64]
+	stp	x21, x22, [sp, 48]
+	adrp	x23, .LANCHOR2
+	stp	x25, x26, [sp, 80]
+	mov	x21, x19
+	stp	x27, x28, [sp, 96]
+	add	x24, x20, 2504
+	add	x26, x23, :lo12:.LANCHOR2
+	ldrh	w22, [x20, 2480]
+.L3371:
+	ldrh	w0, [x20, 2482]
+	cmp	w0, w22
+	bhi	.L3377
+	adrp	x19, .LANCHOR4
+	add	x19, x19, :lo12:.LANCHOR4
+	add	x19, x19, 1712
+	mov	w22, 0
+	adrp	x26, .LANCHOR2
+.L3378:
+	add	x20, x26, :lo12:.LANCHOR2
+	ldrh	w0, [x20, 3856]
+	cmp	w22, w0
+	bge	.L3381
+	adrp	x23, .LC112
+	sbfiz	x24, x22, 1, 32
+	mov	w20, 0
+	add	x23, x23, :lo12:.LC112
+	b	.L3382
+.L3373:
+	ldrb	w0, [x24, x5]
+	mov	w1, w22
 	bl	V2P_block
-	uxth	w28, w0
+	and	w4, w0, 65535
 	bl	FtlBbmIsBadBlock
-	ldr	x5, [x29,104]
-	ldr	x4, [x29,96]
-	cbnz	w0, .L3431
-	add	x3, x24, :lo12:.LANCHOR2
-	lsl	w28, w28, 10
-	umull	x0, w27, w25
-	mul	w2, w27, w4
-	ldr	x1, [x3,3592]
-	add	w27, w27, 1
-	add	x1, x1, x0
-	uxth	w27, w27
-	sdiv	w2, w2, w26
-	str	w28, [x1,4]
-	ldr	x1, [x3,3592]
-	add	x0, x1, x0
-	ldr	x1, [x3,1400]
-	str	x1, [x0,8]
-	ldr	x1, [x3,1408]
-	add	x2, x1, w2, sxtw 2
-	str	x2, [x0,16]
-.L3431:
-	add	x22, x22, 1
-	b	.L3439
-.L3444:
-	cbz	w27, .L3434
-	add	x0, x24, :lo12:.LANCHOR2
-	mov	w1, w27
+	cbnz	w0, .L3372
+	umull	x2, w19, w7
+	ldr	x0, [x26, 3584]
+	lsl	w4, w4, 10
+	add	x0, x0, x2
+	str	w4, [x0, 4]
+	ldr	x1, [x26, 3584]
+	ldr	x0, [x26, 1392]
+	add	x1, x1, x2
+	ldr	x2, [x26, 1400]
+	str	x0, [x1, 8]
+	mul	w0, w19, w8
+	add	w19, w19, 1
+	and	w19, w19, 65535
+	sdiv	w0, w0, w6
+	add	x0, x2, w0, sxtw 2
+	str	x0, [x1, 16]
+.L3372:
+	add	x5, x5, 1
+.L3379:
+	cmp	w9, w5, uxth
+	bhi	.L3373
+	cbnz	w19, .L3374
+.L3376:
+	add	w22, w22, 1
+	and	w22, w22, 65535
+	b	.L3371
+.L3374:
+	ldr	x0, [x26, 3584]
+	mov	w1, w19
 	mov	w2, 1
-	mov	x20, 0
-	adrp	x22, .LANCHOR2
-	mov	x28, 56
-	ldr	x0, [x0,3592]
+	adrp	x27, .LC168
+	add	x28, x23, :lo12:.LANCHOR2
+	add	x27, x27, :lo12:.LC168
+	mov	x25, 0
 	bl	FlashReadPages
-.L3435:
-	cmp	w27, w20, uxth
-	bls	.L3434
-	add	x0, x22, :lo12:.LANCHOR2
-	ldr	x3, [x0,3592]
-	madd	x3, x20, x28, x3
-	add	x20, x20, 1
-	ldr	x7, [x3,8]
-	ldr	x6, [x3,16]
-	ldr	w2, [x3,4]
-	ldr	w0, [x7,4]
-	str	w0, [sp]
+	mov	w0, 56
+	umull	x19, w19, w0
+.L3375:
+	ldr	x0, [x28, 3584]
+	add	x0, x0, x25
+	add	x25, x25, 56
+	ldr	x1, [x0, 16]
+	ldr	w2, [x0, 4]
+	ldr	x0, [x0, 8]
+	ldr	w3, [x0, 4]
+	str	w3, [sp]
+	ldr	w7, [x0]
+	mov	x0, x27
+	ldp	w3, w4, [x1]
+	ldp	w5, w6, [x1, 8]
 	ubfx	x1, x2, 10, 16
-	mov	x0, x23
-	ldr	w3, [x6]
-	ldr	w4, [x6,4]
-	ldr	w5, [x6,8]
-	ldr	w7, [x7]
-	ldr	w6, [x6,12]
 	bl	printk
-	b	.L3435
-.L3434:
-	add	w21, w21, 1
-	uxth	w21, w21
-	b	.L3430
-.L3443:
-	adrp	x20, .LANCHOR4
-	adrp	x23, .LC112
-	add	x20, x20, :lo12:.LANCHOR4
-	mov	w22, 0
-	adrp	x27, .LANCHOR2
-	add	x20, x20, 1704
-	add	x23, x23, :lo12:.LC112
-.L3438:
-	add	x21, x27, :lo12:.LANCHOR2
-	adrp	x26, .LANCHOR2
-	ldrh	w0, [x21,3864]
-	cmp	w22, w0
-	bge	.L3441
-	sbfiz	x24, x22, 1, 32
-	mov	w21, 0
-.L3442:
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x0,2546]
-	cmp	w21, w0
-	bge	.L3445
+	cmp	x25, x19
+	beq	.L3376
+	b	.L3375
+.L3377:
+	ldrh	w9, [x20, 2472]
+	mov	x5, 0
+	ldrh	w8, [x20, 2556]
+	mov	w19, 0
+	mov	w7, 56
+	mov	w6, 4
+	b	.L3379
+.L3380:
 	add	x25, x26, :lo12:.LANCHOR2
-	mov	w1, 1
-	mov	w2, w1
-	ldr	x0, [x25,3720]
-	ldrh	w0, [x0,x24]
-	orr	w0, w21, w0, lsl 10
-	str	w0, [x20,4]
-	mov	x0, x20
-	add	w21, w21, 1
+	mov	w2, 1
+	mov	w1, w2
+	ldr	x0, [x25, 3712]
+	ldrh	w0, [x0, x24]
+	orr	w0, w20, w0, lsl 10
+	str	w0, [x19, 4]
+	mov	x0, x19
 	bl	FlashReadPages
-	sxth	w21, w21
-	ldr	x0, [x20,8]
-	ldr	x1, [x25,3720]
-	ldr	x7, [x20,16]
-	ldr	w2, [x0]
-	ldrh	w1, [x1,x24]
+	ldp	x2, x0, [x19, 8]
+	add	w20, w20, 1
+	ldr	x1, [x25, 3712]
+	sxth	w20, w20
+	ldr	w3, [x2, 4]
+	ldrh	w1, [x1, x24]
+	str	w3, [sp, 8]
+	ldr	w2, [x2]
 	str	w2, [sp]
-	ldr	w0, [x0,4]
-	str	w0, [sp,8]
+	ldp	w4, w5, [x0]
+	ldp	w6, w7, [x0, 8]
 	mov	x0, x23
-	ldr	w4, [x7]
-	ldr	w5, [x7,4]
-	ldr	w6, [x7,8]
-	ldr	w2, [x20]
-	ldr	w3, [x20,4]
-	ldr	w7, [x7,12]
+	ldp	w2, w3, [x19]
 	bl	printk
-	b	.L3442
-.L3445:
+.L3382:
+	add	x0, x21, :lo12:.LANCHOR0
+	ldrh	w0, [x0, 2546]
+	cmp	w20, w0
+	blt	.L3380
 	add	w22, w22, 1
 	sxth	w22, w22
-	b	.L3438
-.L3441:
-	add	x19, x19, :lo12:.LANCHOR0
-	ldr	x1, [x21,3720]
-	adrp	x0, .LC169
+	b	.L3378
+.L3381:
+	add	x21, x21, :lo12:.LANCHOR0
+	ldr	x1, [x20, 3712]
 	mov	w2, 2
+	adrp	x0, .LC169
 	add	x0, x0, :lo12:.LC169
-	ldr	w3, [x19,2572]
+	ldr	w3, [x21, 2572]
 	bl	rknand_print_hex
-	ldr	x1, [x21,3760]
+	ldrh	w3, [x21, 2580]
+	mov	w2, 4
+	ldr	x1, [x20, 3752]
 	adrp	x0, .LC170
-	ldrh	w3, [x19,2580]
 	add	x0, x0, :lo12:.LC170
-	mov	w2, 4
 	bl	rknand_print_hex
-	ldr	x1, [x21,3768]
+	ldrh	w3, [x21, 2580]
+	mov	w2, 4
+	ldr	x1, [x20, 3760]
 	adrp	x0, .LC171
-	ldrh	w3, [x19,2580]
 	add	x0, x0, :lo12:.LC171
-	mov	w2, 4
 	bl	rknand_print_hex
-	sub	sp, x29, #16
-	ldp	x19, x20, [sp,32]
-	ldp	x21, x22, [sp,48]
-	ldp	x23, x24, [sp,64]
-	ldp	x25, x26, [sp,80]
-	ldp	x27, x28, [sp,96]
-	ldp	x29, x30, [sp,16]
-	add	sp, sp, 128
+	ldp	x19, x20, [sp, 32]
+	ldp	x21, x22, [sp, 48]
+	ldp	x23, x24, [sp, 64]
+	ldp	x25, x26, [sp, 80]
+	ldp	x27, x28, [sp, 96]
+	ldp	x29, x30, [sp, 16]
+	add	sp, sp, 112
 	ret
 	.size	dump_map_info, .-dump_map_info
 	.align	2
@@ -22149,495 +21750,470 @@ dump_map_info:
 	.type	flash_boot_enter_slc_mode, %function
 flash_boot_enter_slc_mode:
 	adrp	x1, .LANCHOR0+2392
-	uxtb	w0, w0
-	stp	x29, x30, [sp, -16]!
-	add	x29, sp, 0
-	ldr	w2, [x1,#:lo12:.LANCHOR0+2392]
+	ldr	w2, [x1, #:lo12:.LANCHOR0+2392]
 	mov	w1, 12336
 	movk	w1, 0x5638, lsl 16
 	cmp	w2, w1
-	bne	.L3446
+	bne	.L3388
+	stp	x29, x30, [sp, -16]!
+	and	w0, w0, 255
+	add	x29, sp, 0
 	bl	flash_enter_slc_mode
-.L3446:
 	ldp	x29, x30, [sp], 16
 	ret
+.L3388:
+	ret
 	.size	flash_boot_enter_slc_mode, .-flash_boot_enter_slc_mode
 	.align	2
 	.global	flash_boot_exit_slc_mode
 	.type	flash_boot_exit_slc_mode, %function
 flash_boot_exit_slc_mode:
 	adrp	x1, .LANCHOR0+2392
-	uxtb	w0, w0
-	stp	x29, x30, [sp, -16]!
-	add	x29, sp, 0
-	ldr	w2, [x1,#:lo12:.LANCHOR0+2392]
+	ldr	w2, [x1, #:lo12:.LANCHOR0+2392]
 	mov	w1, 12336
 	movk	w1, 0x5638, lsl 16
 	cmp	w2, w1
-	bne	.L3448
+	bne	.L3394
+	stp	x29, x30, [sp, -16]!
+	and	w0, w0, 255
+	add	x29, sp, 0
 	bl	flash_exit_slc_mode
-.L3448:
 	ldp	x29, x30, [sp], 16
 	ret
+.L3394:
+	ret
 	.size	flash_boot_exit_slc_mode, .-flash_boot_exit_slc_mode
 	.align	2
 	.global	write_idblock
 	.type	write_idblock, %function
 write_idblock:
-	stp	x29, x30, [sp, -304]!
+	stp	x29, x30, [sp, -240]!
 	add	x29, sp, 0
-	stp	x25, x26, [sp,64]
-	adrp	x25, .LANCHOR0
-	stp	x19, x20, [sp,16]
+	stp	x23, x24, [sp, 48]
+	adrp	x24, .LANCHOR0
+	stp	x19, x20, [sp, 16]
 	mov	w19, w0
-	add	x0, x25, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x27, x28, [sp,80]
+	add	x0, x24, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	stp	x25, x26, [sp, 64]
 	mov	x22, x1
+	stp	x27, x28, [sp, 80]
 	mov	x23, x2
-	ldr	x1, [x0,88]
-	ldr	w21, [x0,76]
+	ldr	x1, [x0, 88]
+	ldr	w20, [x0, 76]
 	mov	w0, 59392
 	movk	w0, 0x3, lsl 16
-	ldrb	w20, [x1,9]
+	ldrb	w21, [x1, 9]
 	bl	ftl_malloc
-	mov	x27, x0
-	mov	w0, -1
-	cbz	x27, .L3493
+	cbz	x0, .L3421
 	add	w19, w19, 511
+	mov	x26, x0
 	lsr	w19, w19, 9
 	cmp	w19, 8
-	bls	.L3475
+	bls	.L3422
+	mov	w0, -1
 	cmp	w19, 500
-	bhi	.L3493
-	b	.L3452
-.L3475:
-	mov	w19, 8
-.L3452:
+	bhi	.L3397
+.L3399:
 	ldr	w2, [x22]
 	mov	w1, 35899
 	movk	w1, 0xfcdc, lsl 16
 	mov	w0, -1
 	cmp	w2, w1
-	bne	.L3493
-	mul	w21, w20, w21
-	mov	w3, 0
+	bne	.L3397
+	mul	w21, w21, w20
+	add	x3, x22, 253952
+	add	x3, x3, 1532
 	mov	w2, 63871
+	and	w21, w21, 65535
 	mov	w4, 4097
-	uxth	w21, w21
 	add	w0, w21, w0
 	add	w0, w0, w19
 	udiv	w0, w0, w21
-	str	w0, [x29,216]
-	add	x0, x22, 253952
-	add	x0, x0, 1532
-.L3456:
-	ldr	w1, [x0]
-	cbnz	w1, .L3453
-	ldr	w1, [x22,w3,uxtw 2]
-	add	w3, w3, 1
-	cmp	w3, w4
+	str	w0, [x29, 168]
+	mov	w0, 0
+.L3403:
+	ldr	w1, [x3]
+	cbnz	w1, .L3400
+	ldr	w1, [x22, w0, uxtw 2]
+	add	w0, w0, 1
+	str	w1, [x3, 512]
+	cmp	w0, w4
 	sub	w2, w2, #1
-	str	w1, [x0,512]
-	csel	w3, w3, wzr, cc
+	csel	w0, w0, wzr, cc
+	sub	x3, x3, #4
 	cmp	w2, 4096
-	sub	x0, x0, #4
-	bne	.L3456
-	b	.L3455
-.L3453:
-	adrp	x0, .LC172
-	add	x0, x0, :lo12:.LC172
-	bl	printk
-.L3455:
-	adrp	x0, .LC173
+	bne	.L3403
+.L3402:
+	add	x20, x24, :lo12:.LANCHOR0
 	mov	w3, 5
-	add	x20, x25, :lo12:.LANCHOR0
-	add	x0, x0, :lo12:.LC173
-	mov	x1, x23
 	mov	w2, 4
-	adrp	x24, .LANCHOR4
+	mov	x1, x23
+	adrp	x0, .LC173
+	add	x0, x0, :lo12:.LC173
 	bl	rknand_print_hex
-	ldr	w1, [x22,512]
+	adrp	x25, .LANCHOR4
+	ldrb	w2, [x20, 73]
 	adrp	x0, .LC174
-	ldrb	w2, [x20,73]
+	ldr	w1, [x22, 512]
 	add	x0, x0, :lo12:.LC174
 	bl	printk
-	add	x4, x24, :lo12:.LANCHOR4
-	adrp	x0, .LC175
-	ldrh	w3, [x20,202]
+	add	x0, x25, :lo12:.LANCHOR4
+	ldrh	w3, [x20, 202]
 	mov	w1, w19
-	add	x0, x0, :lo12:.LC175
 	mov	w2, w19
-	ldr	w4, [x4,1636]
+	ldr	w4, [x0, 1644]
+	adrp	x0, .LC175
+	add	x0, x0, :lo12:.LC175
 	bl	printk
-	str	x24, [x29,224]
-	ldrb	w0, [x20,73]
-	ldr	w1, [x22,512]
+	str	x25, [x29, 160]
+	ldrb	w0, [x20, 73]
+	ldr	w1, [x22, 512]
 	cmp	w1, w0
-	bls	.L3457
-	str	w0, [x22,512]
-.L3457:
+	bls	.L3404
+	str	w0, [x22, 512]
+.L3404:
 	lsl	w0, w19, 7
-	str	w0, [x29,204]
-	adrp	x0, .LC176
+	add	x28, x24, :lo12:.LANCHOR0
+	str	w0, [x29, 140]
 	mov	x20, 0
-	add	x0, x0, :lo12:.LC176
-	str	x0, [x29,192]
-	adrp	x0, .LC177
-	str	w20, [x29,236]
-	add	x0, x0, :lo12:.LC177
-	str	x0, [x29,184]
-	adrp	x0, .LC178
-	add	x0, x0, :lo12:.LC178
-	str	x0, [x29,176]
-.L3473:
-	add	x0, x25, :lo12:.LANCHOR0
-	ldr	w1, [x23,x20,lsl 2]
-	str	w20, [x29,232]
-	ldrb	w0, [x0,73]
+	add	x0, x28, 208
+	str	wzr, [x29, 172]
+	str	x0, [x29, 152]
+.L3420:
+	ldr	w1, [x23, x20, lsl 2]
+	ldrb	w0, [x28, 73]
+	str	w20, [x29, 136]
 	cmp	w1, w0
-	bcs	.L3458
-	ldr	x0, [x29,224]
+	bcs	.L3405
+	ldr	x0, [x29, 160]
 	add	x0, x0, :lo12:.LANCHOR4
-	ldr	w0, [x0,1636]
+	ldr	w0, [x0, 1644]
 	cmp	w1, w0
-	bcc	.L3458
-	ldr	w0, [x29,216]
-	cmp	w0, 1
-	cset	w0, hi
-	str	w0, [x29,220]
-	uxtw	x0, w20
-	cbz	w0, .L3459
-	ldr	w0, [x29,220]
-	cbz	w0, .L3459
-	uxtw	x0, w20
-	sub	w0, w0, #1
-	ldr	w0, [x23,x0,lsl 2]
+	bcc	.L3405
+	ldr	w0, [x29, 168]
+	cmp	w20, 0
+	ccmp	w0, 1, 0, ne
+	bls	.L3406
+	sub	w0, w20, #1
+	ldr	w0, [x23, x0, lsl 2]
 	add	w0, w0, 1
 	cmp	w1, w0
-	beq	.L3458
-.L3459:
-	mov	w1, 0
+	beq	.L3405
+.L3406:
 	mov	x2, 512
-	mov	x0, x27
+	mov	w1, 0
+	mov	x0, x26
 	bl	memset
-	ldr	w24, [x23,x20,lsl 2]
-	add	x0, x25, :lo12:.LANCHOR0
+	ldr	w24, [x23, x20, lsl 2]
 	mov	w2, w19
+	ldr	x0, [x28, 88]
+	ldr	w25, [x28, 76]
 	mul	w24, w21, w24
-	ldr	x1, [x0,88]
-	ldr	w26, [x0,76]
-	ldr	x0, [x29,192]
-	ldrb	w28, [x1,9]
+	ldrb	w27, [x0, 9]
+	adrp	x0, .LC176
 	mov	w1, w24
+	add	x0, x0, :lo12:.LC176
 	bl	printk
 	mov	w0, 0
-	mul	w26, w26, w28
 	bl	flash_boot_enter_slc_mode
-	udiv	w1, w24, w28
+	mul	w25, w25, w27
+	udiv	w1, w24, w27
 	mov	w2, 0
+	and	w25, w25, 65535
 	mov	w0, 0
-	uxth	w26, w26
 	bl	FlashEraseBlock
-	cmp	w19, w26
-	mov	w2, 1
-	bls	.L3460
+	cmp	w25, w19
+	bcs	.L3425
+	add	w1, w24, w25
 	mov	w2, 0
 	mov	w0, 0
-	add	w1, w24, w26
 	bl	FlashEraseBlock
-	mov	w2, 2
-.L3460:
+	mov	w1, 2
+.L3407:
 	mov	w0, 0
-	str	x2, [x29,208]
+	str	w1, [x29, 144]
 	bl	flash_boot_exit_slc_mode
-	add	x4, x25, :lo12:.LANCHOR0
-	ldr	x2, [x29,208]
-	udiv	w8, w24, w26
-	mov	w6, 0
+	ldr	x0, [x28, 88]
+	mov	w5, 0
+	ldr	w1, [x29, 144]
 	mov	w10, 1073741823
-	mov	w11, 61424
-	ldr	x1, [x4,88]
-	ldrh	w0, [x1,10]
-	ldrb	w5, [x1,12]
-	lsl	w0, w0, 2
-	msub	w8, w8, w26, w24
-	mul	w0, w0, w2
-	mov	x26, x22
-	sdiv	w5, w0, w5
+	udiv	w8, w24, w25
+	ldrh	w4, [x0, 10]
+	ldrb	w0, [x0, 12]
+	msub	w8, w8, w25, w24
+	mov	x25, x22
+	lsl	w4, w4, 2
+	mul	w4, w4, w1
+	sdiv	w4, w4, w0
 	sub	w0, w24, w8
-	str	w0, [x29,208]
-.L3461:
-	cmp	w6, w5
-	bcs	.L3505
-	add	w0, w6, w8
-	lsr	w0, w0, 2
-	uxth	w1, w0
-	and	w0, w0, 65535
-	cbz	w1, .L3462
-	add	w2, w0, 1
-	add	x1, x4, 208
-	ldrb	w3, [x4,204]
-	ldrh	w1, [x1,w2,sxtw 1]
-	cbz	w3, .L3463
-	ldr	w7, [x4,2392]
-	mov	w3, 12336
-	movk	w3, 0x5638, lsl 16
-	cmp	w7, w3
-	csel	w1, w1, w2, ne
-.L3463:
-	add	w1, w1, w10
-	lsl	w1, w1, 2
-	str	w1, [x29,240]
-.L3462:
-	add	x1, x4, 208
-	str	w11, [x29,244]
-	ldrh	w7, [x1,w0,sxtw 1]
-	ldrb	w1, [x4,204]
-	cbz	w1, .L3464
-	ldr	w2, [x4,2392]
-	mov	w1, 12336
-	movk	w1, 0x5638, lsl 16
-	cmp	w2, w1
-	csel	w7, w7, w0, ne
-.L3464:
-	ldr	w0, [x29,208]
-	ldrb	w12, [x4,2464]
-	str	x11, [x29,104]
-	madd	w2, w7, w28, w0
-	ldr	x0, [x29,224]
-	str	x10, [x29,112]
+	str	w0, [x29, 144]
+.L3408:
+	cmp	w4, w5
+	bhi	.L3412
+	mov	w1, w24
+	mov	w3, 0
+	mov	w2, w19
+	adrp	x0, .LC177
+	add	x0, x0, :lo12:.LC177
+	bl	printk
+	ldr	x0, [x28, 88]
+	mov	w2, w19
+	ldr	w25, [x28, 76]
+	ldr	w24, [x23, x20, lsl 2]
+	ldrb	w5, [x0, 9]
+	adrp	x0, .LC178
+	str	w5, [x29, 144]
+	add	x0, x0, :lo12:.LC178
+	mul	w24, w21, w24
+	mul	w25, w25, w5
+	mov	w1, w24
+	bl	printk
+	and	w25, w25, 65535
+	ldr	w5, [x29, 144]
+	ldr	x1, [x29, 160]
+	mov	x7, x26
+	mov	w4, 0
+	mov	w9, 4
+	udiv	w27, w24, w25
+	add	x10, x1, :lo12:.LANCHOR4
+	msub	w27, w27, w25, w24
+	sub	w8, w24, w27
+	mul	w0, w27, w5
+	ubfx	x0, x0, 2, 2
+.L3413:
+	cmp	w4, w19
+	bcc	.L3415
+	mov	w1, w24
+	mov	w3, 0
+	mov	w2, w19
+	adrp	x0, .LC179
+	add	x0, x0, :lo12:.LC179
+	bl	printk
+	mov	x1, x26
+	mov	x0, x22
+	mov	x24, 0
+.L3416:
+	ldr	w2, [x29, 140]
+	cmp	w24, w2
+	bcc	.L3418
+	ldr	w0, [x29, 172]
+	add	w0, w0, 1
+	str	w0, [x29, 172]
+	b	.L3405
+.L3422:
+	mov	w19, 8
+	b	.L3399
+.L3400:
+	adrp	x0, .LC172
+	add	x0, x0, :lo12:.LC172
+	bl	printk
+	b	.L3402
+.L3425:
+	mov	w1, 1
+	b	.L3407
+.L3412:
+	add	w1, w8, w5
+	lsr	w1, w1, 2
+	cbz	w1, .L3409
+	ldr	x0, [x29, 152]
+	add	w2, w1, 1
+	ldrb	w3, [x28, 204]
+	ldrh	w0, [x0, w2, sxtw 1]
+	cbz	w3, .L3410
+	ldr	w3, [x28, 2392]
+	mov	w6, 12336
+	movk	w6, 0x5638, lsl 16
+	cmp	w3, w6
+	csel	w0, w0, w2, ne
+.L3410:
+	add	w0, w0, w10
+	lsl	w0, w0, 2
+	str	w0, [x29, 176]
+.L3409:
+	mov	w0, 61424
+	str	w0, [x29, 180]
+	ldr	x0, [x29, 152]
+	ldrh	w7, [x0, w1, sxtw 1]
+	ldrb	w0, [x28, 204]
+	cbz	w0, .L3411
+	ldr	w0, [x28, 2392]
+	mov	w2, 12336
+	movk	w2, 0x5638, lsl 16
+	cmp	w0, w2
+	csel	w7, w7, w1, ne
+.L3411:
+	ldr	w0, [x29, 144]
+	ldrb	w11, [x28, 2464]
+	stp	w10, w5, [x29, 104]
+	stp	w8, w4, [x29, 112]
+	madd	w1, w27, w7, w0
+	ldr	x0, [x29, 160]
+	stp	w7, w1, [x29, 120]
 	add	x0, x0, :lo12:.LANCHOR4
-	str	x6, [x29,120]
-	str	x8, [x29,128]
-	str	x5, [x29,136]
-	ldrb	w0, [x0,1642]
-	str	x7, [x29,144]
-	str	x12, [x29,160]
-	str	x2, [x29,152]
-	str	x4, [x29,168]
+	str	w11, [x29, 128]
+	ldrb	w0, [x0, 1650]
 	bl	FlashBchSel
 	mov	w0, 0
 	bl	flash_boot_enter_slc_mode
-	ldr	x4, [x29,168]
-	add	x3, x29, 240
-	ldr	x2, [x29,152]
-	ldr	x0, [x4,88]
-	ldrb	w1, [x0,9]
+	ldr	x0, [x28, 88]
+	mov	x2, x25
+	ldr	w1, [x29, 124]
+	add	x3, x29, 176
+	add	x25, x25, 2048
+	ldrb	w0, [x0, 9]
+	udiv	w1, w1, w0
 	mov	w0, 0
-	udiv	w1, w2, w1
-	mov	x2, x26
-	add	x26, x26, 2048
 	bl	FlashProgPage
 	mov	w0, 0
 	bl	flash_boot_exit_slc_mode
-	ldr	x12, [x29,160]
-	mov	w0, w12
+	ldr	w11, [x29, 128]
+	mov	w0, w11
 	bl	FlashBchSel
-	ldr	w1, [x29,208]
-	mov	w0, 0
-	ldr	x7, [x29,144]
-	udiv	w1, w1, w28
+	ldr	w0, [x29, 144]
+	ldr	w7, [x29, 120]
 	add	w2, w7, 1
+	udiv	w1, w0, w27
+	mov	w0, 0
 	bl	FlashPageProgMsbFFData
-	ldr	x6, [x29,120]
-	ldr	x11, [x29,104]
-	add	w6, w6, 4
-	ldr	x10, [x29,112]
-	ldr	x8, [x29,128]
-	uxth	w6, w6
-	ldr	x5, [x29,136]
-	ldr	x4, [x29,168]
-	b	.L3461
-.L3505:
-	ldr	x0, [x29,184]
-	mov	w1, w24
-	mov	w2, w19
-	mov	w3, 0
-	add	x24, x25, :lo12:.LANCHOR0
-	bl	printk
-	ldr	w5, [x23,x20,lsl 2]
-	mov	w2, w19
-	ldr	x0, [x24,88]
-	ldr	w26, [x24,76]
-	mul	w5, w21, w5
-	ldrb	w7, [x0,9]
-	ldr	x0, [x29,176]
-	mov	w1, w5
-	str	x7, [x29,168]
-	mul	w26, w26, w7
-	str	x5, [x29,208]
-	bl	printk
-	ldr	x5, [x29,208]
-	mov	w12, 0
-	uxth	w26, w26
-	ldr	x7, [x29,168]
-	mov	w11, 4
-	udiv	w8, w5, w26
-	msub	w8, w8, w26, w5
-	mov	x26, x27
-	sub	w10, w5, w8
-	mul	w0, w8, w7
-	ubfx	x0, x0, 2, 2
-.L3466:
-	cmp	w12, w19
-	bcs	.L3506
-	add	w4, w12, w8
-	add	x1, x24, 208
-	ubfx	x4, x4, 2, 16
-	sub	w6, w11, w0
-	uxth	w6, w6
-	ldrh	w3, [x1,w4,sxtw 1]
-	ldrb	w1, [x24,204]
-	cbz	w1, .L3467
-	ldr	w2, [x24,2392]
-	mov	w1, 12336
-	movk	w1, 0x5638, lsl 16
-	cmp	w2, w1
-	csel	w3, w3, w4, ne
-.L3467:
-	add	w0, w0, w10
-	ldrb	w4, [x24,2464]
-	str	x11, [x29,112]
-	madd	w28, w3, w7, w0
-	ldr	x0, [x24,88]
-	str	x12, [x29,120]
-	str	x6, [x29,128]
-	ldrb	w1, [x0,9]
-	ldr	x0, [x29,224]
-	str	x8, [x29,136]
-	add	x0, x0, :lo12:.LANCHOR4
-	str	x5, [x29,144]
-	str	x10, [x29,152]
-	str	x7, [x29,160]
-	ldrb	w0, [x0,1642]
-	str	x4, [x29,208]
-	str	x1, [x29,168]
+	ldp	w10, w5, [x29, 104]
+	ldp	w8, w4, [x29, 112]
+	add	w5, w5, 4
+	and	w5, w5, 65535
+	b	.L3408
+.L3415:
+	add	w2, w27, w4
+	ldr	x1, [x29, 152]
+	ldrb	w3, [x28, 204]
+	lsr	w2, w2, 2
+	sub	w25, w9, w0
+	and	w25, w25, 65535
+	ldrh	w1, [x1, w2, sxtw 1]
+	cbz	w3, .L3414
+	ldr	w3, [x28, 2392]
+	mov	w6, 12336
+	movk	w6, 0x5638, lsl 16
+	cmp	w3, w6
+	csel	w1, w1, w2, ne
+.L3414:
+	add	w0, w0, w8
+	ldrb	w11, [x28, 2464]
+	stp	w9, w4, [x29, 100]
+	stp	w8, w5, [x29, 108]
+	madd	w1, w5, w1, w0
+	ldr	x0, [x28, 88]
+	str	x10, [x29, 128]
+	str	w11, [x29, 124]
+	str	x7, [x29, 144]
+	ldrb	w12, [x0, 9]
+	ldrb	w0, [x10, 1650]
+	stp	w1, w12, [x29, 116]
 	bl	FlashBchSel
 	mov	w0, 0
 	bl	flash_boot_enter_slc_mode
-	ldr	x1, [x29,168]
-	mov	x2, x26
+	ldp	w1, w12, [x29, 116]
 	mov	x3, 0
+	ldr	x7, [x29, 144]
 	mov	w0, 0
-	udiv	w1, w28, w1
+	udiv	w1, w1, w12
+	mov	x2, x7
 	bl	FlashReadPage
 	mov	w0, 0
 	bl	flash_boot_exit_slc_mode
-	ldr	x4, [x29,208]
-	mov	w0, w4
+	ldr	w11, [x29, 124]
+	mov	w0, w11
 	bl	FlashBchSel
-	ldr	x6, [x29,128]
-	ldr	x12, [x29,120]
-	ubfiz	x0, x6, 9, 16
-	ldr	x11, [x29,112]
-	add	x26, x26, x0
-	add	w0, w6, w12
-	ldr	x8, [x29,136]
-	uxth	w12, w0
-	ldr	x5, [x29,144]
+	ldp	w9, w4, [x29, 100]
+	ubfiz	x0, x25, 9, 16
+	ldr	x7, [x29, 144]
+	add	w4, w25, w4
+	ldr	x10, [x29, 128]
+	add	x7, x7, x0
+	and	w4, w4, 65535
+	ldp	w8, w5, [x29, 108]
 	mov	w0, 0
-	ldr	x10, [x29,152]
-	ldr	x7, [x29,160]
-	b	.L3466
-.L3506:
-	adrp	x0, .LC179
-	mov	w1, w5
-	mov	w2, w19
-	add	x0, x0, :lo12:.LC179
-	mov	w3, 0
-	bl	printk
-	mov	x2, x27
-	mov	x1, x22
-	mov	x0, 0
-.L3469:
-	ldr	w4, [x29,204]
-	mov	w3, w0
-	cmp	w0, w4
-	bcs	.L3507
-	mov	x4, x2
-	mov	x26, x1
-	mov	x24, x0
-	add	x2, x2, 4
-	add	x0, x0, 1
+	b	.L3413
+.L3418:
+	mov	x25, x1
+	mov	x27, x0
+	add	x2, x24, 1
 	add	x1, x1, 4
-	ldr	w6, [x4]
-	ldr	w5, [x26]
-	cmp	w6, w5
-	beq	.L3469
-	mov	w1, 0
+	add	x0, x0, 4
+	ldr	w4, [x25]
+	ldr	w3, [x27]
+	cmp	w4, w3
+	beq	.L3426
 	mov	x2, 512
-	mov	x0, x27
-	str	x4, [x29,168]
-	str	x3, [x29,208]
-	and	x24, x24, -256
+	mov	w1, 0
+	mov	x0, x26
 	bl	memset
+	ldr	w4, [x25]
+	mov	w3, w24
+	ldr	w5, [x27]
+	and	x24, x24, -256
+	ldr	w2, [x23, x20, lsl 2]
 	lsl	x24, x24, 2
-	ldr	x4, [x29,168]
+	ldr	w1, [x29, 136]
 	adrp	x0, .LC180
-	ldr	w5, [x26]
 	add	x0, x0, :lo12:.LC180
-	ldr	w1, [x29,232]
-	ldr	w4, [x4]
-	ldr	w2, [x23,x20,lsl 2]
-	ldr	x3, [x29,208]
 	bl	printk
-	adrp	x0, .LC181
+	mov	w3, 256
+	mov	w2, 4
 	add	x1, x22, x24
+	adrp	x0, .LC181
 	add	x0, x0, :lo12:.LC181
-	mov	w2, 4
-	mov	w3, 256
 	bl	rknand_print_hex
-	adrp	x0, .LC182
-	add	x1, x27, x24
-	mov	w2, 4
+	add	x1, x26, x24
 	mov	w3, 256
+	mov	w2, 4
+	adrp	x0, .LC182
 	add	x0, x0, :lo12:.LC182
 	bl	rknand_print_hex
 	mov	w0, 0
 	bl	flash_boot_enter_slc_mode
-	ldr	w1, [x23,x20,lsl 2]
-	mov	w0, 0
+	ldr	w1, [x23, x20, lsl 2]
 	mov	w2, 0
+	mov	w0, 0
 	mul	w1, w21, w1
 	bl	FlashEraseBlock
-	ldr	w0, [x29,220]
-	cbz	w0, .L3470
-	ldr	w1, [x23,x20,lsl 2]
-	mov	w0, 0
+	ldr	w0, [x29, 168]
+	cmp	w0, 1
+	bls	.L3417
+	ldr	w1, [x23, x20, lsl 2]
 	mov	w2, 0
+	mov	w0, 0
 	madd	w1, w1, w21, w21
 	bl	FlashEraseBlock
-.L3470:
+.L3417:
 	mov	w0, 0
 	bl	flash_boot_exit_slc_mode
+	ldr	w1, [x23, x20, lsl 2]
 	adrp	x0, .LC183
-	ldr	w1, [x23,x20,lsl 2]
 	add	x0, x0, :lo12:.LC183
 	bl	printk
-	b	.L3458
-.L3507:
-	ldr	w0, [x29,236]
-	add	w0, w0, 1
-	str	w0, [x29,236]
-.L3458:
+.L3405:
 	add	x20, x20, 1
 	cmp	x20, 5
-	bne	.L3473
-	mov	x0, x27
+	bne	.L3420
+	mov	x0, x26
 	bl	ftl_free
-	ldr	w0, [x29,236]
-	cmp	w0, wzr
+	ldr	w0, [x29, 172]
+	cmp	w0, 0
 	csetm	w0, eq
-.L3493:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 304
-	ret
+.L3397:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 240
+	ret
+.L3426:
+	mov	x24, x2
+	b	.L3416
+.L3421:
+	mov	w0, -1
+	b	.L3397
 	.size	write_idblock, .-write_idblock
 	.align	2
 	.global	write_loader_lba
@@ -22646,769 +22222,730 @@ write_loader_lba:
 	stp	x29, x30, [sp, -112]!
 	cmp	w0, 64
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
+	stp	x19, x20, [sp, 16]
 	mov	w19, w0
+	stp	x21, x22, [sp, 32]
+	adrp	x20, .LANCHOR4
+	stp	x23, x24, [sp, 48]
 	mov	w21, w1
 	mov	x24, x2
-	adrp	x20, .LANCHOR5
-	bne	.L3509
+	bne	.L3447
 	ldr	w1, [x2]
 	mov	w0, 35899
 	movk	w0, 0xfcdc, lsl 16
 	cmp	w1, w0
-	bne	.L3509
-	add	x22, x20, :lo12:.LANCHOR5
+	bne	.L3447
+	add	x22, x20, :lo12:.LANCHOR4
 	mov	w0, 1
-	strb	w0, [x22,1512]
+	strb	w0, [x22, 2032]
 	mov	w0, 59392
 	movk	w0, 0x3, lsl 16
 	bl	ftl_malloc
-	str	x0, [x22,1520]
 	mov	w2, 59392
 	mov	w1, 0
 	movk	w2, 0x3, lsl 16
+	str	x0, [x22, 2040]
 	bl	ftl_memset
-	str	w19, [x22,1528]
-.L3509:
-	add	x23, x20, :lo12:.LANCHOR5
-	adrp	x0, .LC184
+	str	w19, [x22, 2048]
+.L3447:
+	add	x23, x20, :lo12:.LANCHOR4
 	ldr	w2, [x24]
-	add	x0, x0, :lo12:.LC184
-	mov	w3, w19
 	mov	w4, w21
-	ldr	x1, [x23,1520]
+	mov	w3, w19
+	adrp	x0, .LC184
+	add	x0, x0, :lo12:.LC184
+	ldr	x1, [x23, 2040]
 	bl	printk
-	ldrb	w0, [x23,1512]
-	cbz	w0, .L3508
+	ldrb	w0, [x23, 2032]
+	cbz	w0, .L3446
 	sub	w0, w19, #64
-	ldr	x22, [x23,1520]
+	ldr	x22, [x23, 2040]
 	cmp	w0, 499
-	bhi	.L3511
-	mov	w3, 564
+	bhi	.L3449
+	mov	w2, 564
+	sub	w2, w2, w19
+	cmp	w21, w2
 	ubfiz	x0, x0, 9, 25
-	sub	w3, w3, w19
-	add	x0, x22, x0
-	cmp	w3, w21
+	csel	w2, w21, w2, ls
 	mov	x1, x24
-	csel	w2, w3, w21, ls
 	lsl	w2, w2, 9
+	add	x0, x22, x0
 	bl	ftl_memcpy
-	b	.L3512
-.L3511:
-	cmp	w19, 563
-	bhi	.L3522
-.L3512:
-	add	x0, x20, :lo12:.LANCHOR5
-	ldr	w1, [x0,1528]
-	cmp	w1, w19
-	beq	.L3520
-	strb	wzr, [x0,1512]
-	cbz	x22, .L3521
+.L3450:
+	add	x0, x20, :lo12:.LANCHOR4
+	ldr	w1, [x0, 2048]
+	cmp	w19, w1
+	beq	.L3459
+	strb	wzr, [x0, 2032]
+	cbz	x22, .L3460
 	mov	x0, x22
 	bl	ftl_free
-.L3521:
-	add	x0, x20, :lo12:.LANCHOR5
-	str	xzr, [x0,1520]
-.L3520:
-	add	x20, x20, :lo12:.LANCHOR5
-	add	w19, w19, w21
-	str	w19, [x20,1528]
-	b	.L3508
-.L3522:
-	ldr	w2, [x23,1528]
-	mov	w0, 500
-	sub	w2, w2, #64
-	cmp	w2, 500
-	csel	w2, w2, w0, ls
-	adrp	x0, .LANCHOR0+88
-	ldr	x0, [x0,#:lo12:.LANCHOR0+88]
-	ldrb	w0, [x0,9]
-	cmp	w0, 4
-	beq	.L3523
-	mov	w0, 2
-	str	w0, [x29,72]
-	mov	w0, 3
-	str	w0, [x29,76]
-	mov	w0, 4
-	str	w0, [x29,80]
-	mov	w0, 5
-	str	w0, [x29,84]
-	mov	w0, 6
-	str	w0, [x29,88]
-	b	.L3514
-.L3523:
-	mov	x3, 0
-.L3513:
-	cmp	w2, 256
-	add	x0, x29, 72
-	bls	.L3515
-	lsl	w1, w3, 1
-	str	w1, [x0,x3,lsl 2]
-	b	.L3516
-.L3515:
-	str	w3, [x0,x3,lsl 2]
-.L3516:
-	add	x3, x3, 1
-	cmp	x3, 5
-	bne	.L3513
-.L3514:
-	add	x0, x22, 253952
-	mov	w3, 63872
-	add	x0, x0, 1536
-.L3519:
-	ldr	w1, [x0]
-	cbz	w1, .L3517
-	add	w3, w3, 128
-	lsl	w0, w3, 2
-	b	.L3518
-.L3517:
-	sub	w3, w3, #1
-	sub	x0, x0, #4
-	cmp	w3, 4096
-	bne	.L3519
-	lsl	w0, w2, 9
-.L3518:
+.L3460:
+	add	x0, x20, :lo12:.LANCHOR4
+	str	xzr, [x0, 2040]
+	b	.L3459
+.L3449:
+	cmp	w19, 563
+	bls	.L3450
+	ldr	w0, [x23, 2048]
+	mov	w1, 500
+	sub	w0, w0, #64
+	cmp	w0, 500
+	csel	w0, w0, w1, ls
+	adrp	x1, .LANCHOR0+88
+	ldr	x1, [x1, #:lo12:.LANCHOR0+88]
+	ldrb	w1, [x1, 9]
+	cmp	w1, 4
+	beq	.L3451
+	mov	w1, 2
+	str	w1, [x29, 72]
+	mov	w1, 3
+	str	w1, [x29, 76]
+	mov	w1, 4
+	str	w1, [x29, 80]
+	mov	w1, 5
+	str	w1, [x29, 84]
+	mov	w1, 6
+	str	w1, [x29, 88]
+.L3452:
+	add	x2, x22, 253952
+	mov	w1, 63872
+	add	x2, x2, 1536
+.L3458:
+	ldr	w3, [x2]
+	cbz	w3, .L3456
+	add	w0, w1, 128
+	lsl	w0, w0, 2
+.L3457:
 	mov	x1, x22
+	add	x22, x20, :lo12:.LANCHOR4
 	add	x2, x29, 72
-	add	x22, x20, :lo12:.LANCHOR5
 	bl	write_idblock
-	ldr	x0, [x22,1520]
-	strb	wzr, [x22,1512]
+	ldr	x0, [x22, 2040]
+	strb	wzr, [x22, 2032]
 	bl	ftl_free
-	str	xzr, [x22,1520]
-	b	.L3520
-.L3508:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
+	str	xzr, [x22, 2040]
+.L3459:
+	add	x20, x20, :lo12:.LANCHOR4
+	add	w19, w19, w21
+	str	w19, [x20, 2048]
+.L3446:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
 	ldp	x29, x30, [sp], 112
 	ret
+.L3451:
+	add	x2, x29, 72
+	mov	x1, 0
+.L3455:
+	cmp	w0, 256
+	bls	.L3453
+	lsl	w3, w1, 1
+	str	w3, [x2, x1, lsl 2]
+.L3454:
+	add	x1, x1, 1
+	cmp	x1, 5
+	bne	.L3455
+	b	.L3452
+.L3453:
+	str	w1, [x2, x1, lsl 2]
+	b	.L3454
+.L3456:
+	sub	w1, w1, #1
+	sub	x2, x2, #4
+	cmp	w1, 4096
+	bne	.L3458
+	lsl	w0, w0, 9
+	b	.L3457
 	.size	write_loader_lba, .-write_loader_lba
 	.align	2
 	.global	FtlWrite
 	.type	FtlWrite, %function
 FtlWrite:
-	stp	x29, x30, [sp, -64]!
+	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	str	x21, [sp,32]
-	uxtb	w21, w0
+	stp	x19, x20, [sp, 16]
+	and	w20, w0, 255
+	stp	x21, x22, [sp, 32]
 	sub	w0, w1, #64
-	stp	x19, x20, [sp,16]
-	cmp	w0, 1983
 	mov	w19, w1
-	mov	w20, w2
-	bhi	.L3533
-	cbnz	w21, .L3533
-	mov	w0, w1
-	mov	w1, w2
+	mov	w21, w2
+	mov	x22, x3
+	cmp	w0, 1983
+	bhi	.L3471
+	cbnz	w20, .L3471
 	mov	x2, x3
-	str	x3, [x29,56]
+	mov	w1, w21
+	mov	w0, w19
 	bl	write_loader_lba
-	ldr	x3, [x29,56]
-.L3533:
+.L3471:
+	mov	x3, x22
+	mov	w2, w21
 	mov	w1, w19
-	mov	w2, w20
-	mov	w0, w21
+	mov	w0, w20
 	bl	ftl_write
-	ldr	x21, [sp,32]
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 64
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 48
 	ret
 	.size	FtlWrite, .-FtlWrite
 	.align	2
 	.global	rknand_sys_storage_ioctl
 	.type	rknand_sys_storage_ioctl, %function
 rknand_sys_storage_ioctl:
-	sub	sp, sp, #528
+	sub	sp, sp, #560
 	mov	w0, 27688
 	movk	w0, 0x4004, lsl 16
 	cmp	w1, w0
-	stp	x29, x30, [sp, -32]!
+	stp	x29, x30, [sp]
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	w19, w1
 	mov	x20, x2
-	beq	.L3542
-	mov	w0, 27688
-	movk	w0, 0x4004, lsl 16
-	cmp	w1, w0
-	bhi	.L3543
-	mov	w0, 25602
-	movk	w0, 0x4004, lsl 16
-	cmp	w1, w0
-	beq	.L3544
+	beq	.L3475
+	bhi	.L3476
 	mov	w0, 25602
 	movk	w0, 0x4004, lsl 16
 	cmp	w1, w0
-	bhi	.L3545
+	beq	.L3477
+	bhi	.L3478
 	mov	w0, 25364
 	movk	w0, 0x4004, lsl 16
 	cmp	w1, w0
-	beq	.L3546
-	mov	w0, 25601
-	movk	w0, 0x4004, lsl 16
+	beq	.L3479
+	add	w0, w0, 237
 	cmp	w1, w0
-	beq	.L3547
-	b	.L3578
-.L3545:
+	beq	.L3480
+.L3510:
+	mov	x19, -22
+	b	.L3473
+.L3478:
 	mov	w0, 25726
 	movk	w0, 0x4004, lsl 16
 	cmp	w1, w0
-	beq	.L3548
-	mov	w0, 25727
-	movk	w0, 0x4004, lsl 16
+	beq	.L3481
+	add	w0, w0, 1
 	cmp	w1, w0
-	beq	.L3549
+	beq	.L3482
 	mov	w0, 25603
 	movk	w0, 0x4004, lsl 16
 	cmp	w1, w0
-	bne	.L3578
-	b	.L3600
-.L3543:
+	bne	.L3510
+	adrp	x0, .LC190
+	add	x0, x0, :lo12:.LC190
+	bl	printk
+	mov	x2, 520
+	mov	x1, x20
+	add	x0, x29, 40
+	bl	rk_copy_from_user
+	cbnz	x0, .L3493
+	ldr	w1, [x29, 40]
+	mov	w0, 20051
+	movk	w0, 0x4144, lsl 16
+	cmp	w1, w0
+	bne	.L3490
+	ldr	w2, [x29, 44]
+	cmp	w2, 512
+	bhi	.L3490
+	adrp	x1, .LANCHOR4
+	add	x1, x1, :lo12:.LANCHOR4
+	uxtw	x2, w2
+	add	x1, x1, 2080
+	add	x0, x29, 48
+.L3531:
+	bl	memcpy
+	b	.L3525
+.L3476:
 	mov	w0, 30224
 	movk	w0, 0x4004, lsl 16
 	cmp	w1, w0
-	beq	.L3551
-	mov	w0, 30224
+	beq	.L3484
+	bhi	.L3485
+	mov	w0, 27698
 	movk	w0, 0x4004, lsl 16
 	cmp	w1, w0
-	bhi	.L3552
+	beq	.L3475
+	add	w0, w0, 10
+	cmp	w1, w0
+	bne	.L3510
+.L3475:
 	mov	w0, 27698
 	movk	w0, 0x4004, lsl 16
+	cmp	w19, w0
+	bne	.L3500
+	adrp	x0, .LC191
+	add	x0, x0, :lo12:.LC191
+.L3527:
+	bl	printk
+	mov	x2, 520
+	mov	x1, x20
+	add	x0, x29, 40
+	bl	rk_copy_from_user
+	cbnz	x0, .L3493
+	ldr	w1, [x29, 40]
+	mov	w0, 17227
+	movk	w0, 0x4c4f, lsl 16
 	cmp	w1, w0
-	beq	.L3542
+	bne	.L3530
 	mov	w0, 27708
 	movk	w0, 0x4004, lsl 16
-	cmp	w1, w0
-	beq	.L3542
-	b	.L3578
-.L3552:
+	cmp	w19, w0
+	adrp	x0, .LANCHOR4
+	bne	.L3503
+	add	x0, x0, :lo12:.LANCHOR4
+	mov	x2, 16
+	add	x1, x29, 40
+	ldr	x0, [x0, 2056]
+	ldr	w0, [x0, 20]
+	strb	w0, [x29, 48]
+	str	w0, [x29, 44]
+	mov	x0, x20
+	bl	rk_copy_to_user
+	cbnz	x0, .L3530
+.L3494:
+	mov	x19, 0
+.L3473:
+	mov	x0, x19
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp]
+	add	sp, sp, 560
+	ret
+.L3485:
 	mov	w0, 30226
 	movk	w0, 0x4004, lsl 16
 	cmp	w1, w0
-	beq	.L3551
-	mov	w0, 30226
-	movk	w0, 0x4004, lsl 16
+	beq	.L3484
+	bcc	.L3486
+	add	w0, w0, 1
 	cmp	w1, w0
-	bcc	.L3553
-	mov	w0, 30227
-	movk	w0, 0x4004, lsl 16
+	bne	.L3510
+.L3486:
+	adrp	x0, .LC196
+	add	x0, x0, :lo12:.LC196
+	bl	printk
+	mov	x2, 520
+	mov	x1, x20
+	add	x0, x29, 40
+	bl	rk_copy_from_user
+	cbnz	x0, .L3493
+	ldr	w1, [x29, 40]
+	mov	w0, 17750
+	movk	w0, 0x444e, lsl 16
 	cmp	w1, w0
-	beq	.L3553
-	b	.L3578
-.L3547:
+	bne	.L3490
+	ldr	w2, [x29, 44]
+	cmp	w2, 504
+	bhi	.L3490
+	mov	w0, 30225
+	add	w2, w2, 8
+	movk	w0, 0x4004, lsl 16
+	add	x1, x29, 40
+	cmp	w19, w0
+	adrp	x19, .LANCHOR4
+	add	x19, x19, :lo12:.LANCHOR4
+	bne	.L3509
+	ldr	x0, [x19, 2600]
+	bl	memcpy
+	mov	w0, 2
+	ldr	x1, [x19, 2600]
+	b	.L3529
+.L3480:
 	adrp	x0, .LC185
 	add	x0, x0, :lo12:.LC185
 	bl	printk
-	add	x0, x29, 40
-	mov	x1, x20
 	mov	x2, 520
+	mov	x1, x20
+	add	x0, x29, 40
 	bl	rk_copy_from_user
-	cbz	x0, .L3554
-.L3560:
+	cbz	x0, .L3487
+.L3493:
 	adrp	x0, .LC186
 	add	x0, x0, :lo12:.LC186
 	bl	printk
-	b	.L3597
-.L3554:
-	ldr	w1, [x29,40]
+.L3530:
+	mov	x19, -14
+	b	.L3473
+.L3487:
+	ldr	w1, [x29, 40]
 	mov	w0, 21060
 	movk	w0, 0x4b4d, lsl 16
 	cmp	w1, w0
-	beq	.L3555
-.L3557:
+	beq	.L3488
+.L3490:
 	mov	x19, -1
-	b	.L3556
-.L3555:
-	ldr	w0, [x29,44]
+.L3489:
+	mov	x1, x19
+	adrp	x0, .LC197
+	add	x0, x0, :lo12:.LC197
+	bl	printk
+	b	.L3473
+.L3488:
+	ldr	w0, [x29, 44]
 	cmp	w0, 512
-	bhi	.L3557
-	adrp	x19, .LANCHOR5
-	add	x0, x29, 40
-	add	x19, x19, :lo12:.LANCHOR5
+	bhi	.L3490
+	adrp	x19, .LANCHOR4
+	add	x19, x19, :lo12:.LANCHOR4
 	mov	x2, 512
-	ldr	x1, [x19,1536]
+	add	x0, x29, 40
+	ldr	x1, [x19, 2056]
 	bl	memcpy
-	ldr	w1, [x19,1544]
+	ldr	w1, [x19, 2064]
 	mov	w0, 5161
 	movk	w0, 0xc059, lsl 16
 	cmp	w1, w0
-	beq	.L3558
-	add	x0, x29, 104
-	mov	w1, 0
+	beq	.L3491
 	mov	x2, 128
-	str	wzr, [x29,48]
-	str	wzr, [x29,52]
-	bl	memset
-.L3558:
-	add	x0, x29, 296
 	mov	w1, 0
+	add	x0, x29, 104
+	stp	wzr, wzr, [x29, 48]
+	bl	memset
+.L3491:
+	add	x0, x29, 40
 	mov	x2, 256
-	str	wzr, [x29,56]
+	mov	w1, 0
+	add	x0, x0, x2
+	str	wzr, [x29, 56]
 	bl	memset
-.L3592:
-	mov	x0, x20
-	add	x1, x29, 40
+.L3525:
 	mov	x2, 520
+	add	x1, x29, 40
+	mov	x0, x20
 	bl	rk_copy_to_user
-	cbnz	x0, .L3597
-	b	.L3595
-.L3544:
+	cbnz	x0, .L3530
+.L3528:
+	mov	x19, 0
+	b	.L3489
+.L3477:
 	adrp	x0, .LC187
 	add	x0, x0, :lo12:.LC187
 	bl	printk
-	add	x0, x29, 40
-	mov	x1, x20
 	mov	x2, 520
+	mov	x1, x20
+	add	x0, x29, 40
 	bl	rk_copy_from_user
-	cbnz	x0, .L3560
-	ldr	w1, [x29,40]
+	cbnz	x0, .L3493
+	ldr	w1, [x29, 40]
 	mov	w0, 21060
 	movk	w0, 0x4b4d, lsl 16
 	cmp	w1, w0
-	bne	.L3557
-	ldr	w0, [x29,44]
+	bne	.L3490
+	ldr	w0, [x29, 44]
 	cmp	w0, 512
-	bhi	.L3557
-	adrp	x1, .LANCHOR5
-	mov	w2, 5161
-	add	x1, x1, :lo12:.LANCHOR5
-	movk	w2, 0xc059, lsl 16
-	mov	x0, -2
-	ldr	w3, [x1,1544]
-	cmp	w3, w2
-	bne	.L3541
-	ldr	w2, [x29,52]
-	mov	x0, -3
-	sub	w3, w2, #1
-	cmp	w3, 127
-	bhi	.L3541
-	ldr	x19, [x1,1536]
-	add	x1, x29, 104
+	bhi	.L3490
+	adrp	x0, .LANCHOR4
+	add	x0, x0, :lo12:.LANCHOR4
+	mov	w1, 5161
+	movk	w1, 0xc059, lsl 16
+	ldr	w2, [x0, 2064]
+	cmp	w2, w1
+	bne	.L3511
+	ldr	w1, [x29, 52]
+	mov	x19, -3
+	sub	w2, w1, #1
+	cmp	w2, 127
+	bhi	.L3473
+	ldr	x19, [x0, 2056]
 	add	x0, x19, 64
-	str	w2, [x19,12]
-	ldr	w2, [x29,52]
+	str	w1, [x19, 12]
+	add	x1, x29, 104
+	ldr	w2, [x29, 52]
 	bl	memcpy
-	mov	w0, 1
 	mov	x1, x19
-	b	.L3596
-.L3549:
+	mov	w0, 1
+.L3529:
+	bl	StorageSysDataStore
+	uxtw	x19, w0
+	b	.L3489
+.L3482:
 	adrp	x0, .LC188
 	add	x0, x0, :lo12:.LC188
 	bl	printk
-	add	x0, x29, 40
-	mov	x1, x20
 	mov	x2, 520
+	mov	x1, x20
+	add	x0, x29, 40
 	bl	rk_copy_from_user
-	cbnz	x0, .L3560
-	ldr	w1, [x29,40]
+	cbnz	x0, .L3493
+	ldr	w1, [x29, 40]
 	mov	w0, 17476
 	movk	w0, 0x4253, lsl 16
 	cmp	w1, w0
-	bne	.L3557
-	ldr	w0, [x29,44]
+	bne	.L3490
+	ldr	w0, [x29, 44]
 	cmp	w0, 512
-	bhi	.L3557
-	adrp	x19, .LANCHOR5
-	add	x0, x19, :lo12:.LANCHOR5
-	ldr	w0, [x0,1548]
-	cbnz	w0, .L3561
-.L3564:
-	mov	x0, 0
-	b	.L3541
-.L3561:
-	add	x0, x19, :lo12:.LANCHOR5
+	bhi	.L3490
+	adrp	x19, .LANCHOR4
+	add	x0, x19, :lo12:.LANCHOR4
+	ldr	w0, [x0, 2068]
+	cbz	w0, .L3494
+	add	x0, x19, :lo12:.LANCHOR4
 	mov	w2, 22867
 	movk	w2, 0x4453, lsl 16
-	ldr	x1, [x0,1552]
+	ldr	x1, [x0, 2072]
 	ldr	w3, [x1]
 	cmp	w3, w2
-	beq	.L3562
-	mov	w2, 22867
-	movk	w2, 0x4453, lsl 16
+	beq	.L3495
 	str	w2, [x1]
 	mov	w2, 504
-	ldr	x1, [x0,1552]
-	str	w2, [x1,4]
-	ldr	x0, [x0,1552]
-	str	wzr, [x0,8]
-	str	wzr, [x0,12]
-.L3562:
-	add	x20, x19, :lo12:.LANCHOR5
+	ldr	x1, [x0, 2072]
+	str	w2, [x1, 4]
+	ldr	x0, [x0, 2072]
+	stp	wzr, wzr, [x0, 8]
+.L3495:
+	add	x20, x19, :lo12:.LANCHOR4
 	mov	w0, 0
-	ldr	x1, [x20,1552]
-	str	wzr, [x1,16]
+	ldr	x1, [x20, 2072]
+	str	wzr, [x1, 16]
 	bl	StorageSysDataStore
-	ldr	x0, [x20,1536]
+	ldr	x0, [x20, 2056]
 	mov	w1, 21060
 	movk	w1, 0x4b4d, lsl 16
 	ldr	w2, [x0]
 	cmp	w2, w1
-	beq	.L3563
-	mov	w1, 21060
-	movk	w1, 0x4b4d, lsl 16
+	beq	.L3496
 	str	w1, [x0]
 	mov	w1, 504
-	ldr	x0, [x20,1536]
-	str	w1, [x0,4]
-	ldr	x0, [x20,1536]
-	str	wzr, [x0,8]
-.L3563:
-	add	x19, x19, :lo12:.LANCHOR5
-	mov	w1, 0
+	ldr	x0, [x20, 2056]
+	str	w1, [x0, 4]
+	ldr	x0, [x20, 2056]
+	str	wzr, [x0, 8]
+.L3496:
+	add	x19, x19, :lo12:.LANCHOR4
 	mov	x2, 128
-	ldr	x20, [x19,1536]
+	mov	w1, 0
+	ldr	x20, [x19, 2056]
 	add	x0, x20, 64
-	str	wzr, [x20,12]
+	str	wzr, [x20, 12]
 	bl	memset
-	mov	w0, 1
 	mov	x1, x20
+	mov	w0, 1
 	bl	StorageSysDataStore
-	str	wzr, [x19,1548]
-	str	wzr, [x19,1544]
-	b	.L3595
-.L3548:
+	str	wzr, [x19, 2064]
+	str	wzr, [x19, 2068]
+	b	.L3528
+.L3481:
 	adrp	x0, .LC189
 	add	x0, x0, :lo12:.LC189
 	bl	printk
-	add	x0, x29, 40
-	mov	x1, x20
 	mov	x2, 520
+	mov	x1, x20
+	add	x0, x29, 40
 	bl	rk_copy_from_user
-	cbnz	x0, .L3560
-	ldr	w1, [x29,40]
+	cbnz	x0, .L3493
+	ldr	w1, [x29, 40]
 	mov	w0, 20037
 	movk	w0, 0x4253, lsl 16
 	cmp	w1, w0
-	bne	.L3557
-	ldr	w0, [x29,44]
+	bne	.L3490
+	ldr	w0, [x29, 44]
 	cmp	w0, 512
-	bhi	.L3557
-	adrp	x19, .LANCHOR5
-	add	x0, x19, :lo12:.LANCHOR5
-	ldr	w1, [x0,1548]
+	bhi	.L3490
+	adrp	x19, .LANCHOR4
+	add	x0, x19, :lo12:.LANCHOR4
+	ldr	w1, [x0, 2068]
 	cmp	w1, 1
-	beq	.L3564
-	ldr	x0, [x0,1552]
-	mov	w1, 22867
-	movk	w1, 0x4453, lsl 16
-	ldr	w2, [x0]
-	cmp	w2, w1
-	beq	.L3565
-	mov	w1, 22867
+	beq	.L3494
+	ldr	x1, [x0, 2072]
+	mov	w0, 22867
+	movk	w0, 0x4453, lsl 16
+	ldr	w2, [x1]
+	cmp	w2, w0
+	beq	.L3497
+	str	w0, [x1]
+	add	x0, x19, :lo12:.LANCHOR4
 	mov	w2, 504
-	movk	w1, 0x4453, lsl 16
-	str	w1, [x0]
-	add	x0, x19, :lo12:.LANCHOR5
-	ldr	x1, [x0,1552]
-	str	w2, [x1,4]
-	ldr	x0, [x0,1552]
-	str	wzr, [x0,8]
-	str	wzr, [x0,12]
-.L3565:
-	add	x20, x19, :lo12:.LANCHOR5
+	ldr	x1, [x0, 2072]
+	str	w2, [x1, 4]
+	ldr	x0, [x0, 2072]
+	stp	wzr, wzr, [x0, 8]
+.L3497:
+	add	x20, x19, :lo12:.LANCHOR4
 	mov	w0, 1
-	ldr	x1, [x20,1552]
-	str	w0, [x1,16]
+	ldr	x1, [x20, 2072]
+	str	w0, [x1, 16]
 	mov	w0, 0
 	bl	StorageSysDataStore
-	ldr	x0, [x20,1536]
+	ldr	x0, [x20, 2056]
 	mov	w1, 21060
 	movk	w1, 0x4b4d, lsl 16
 	ldr	w2, [x0]
 	cmp	w2, w1
-	beq	.L3566
-	mov	w1, 21060
-	movk	w1, 0x4b4d, lsl 16
+	beq	.L3498
 	str	w1, [x0]
 	mov	w1, 504
-	ldr	x0, [x20,1536]
-	str	w1, [x0,4]
-	ldr	x0, [x20,1536]
-	str	wzr, [x0,8]
-.L3566:
-	add	x19, x19, :lo12:.LANCHOR5
-	mov	w1, 0
+	ldr	x0, [x20, 2056]
+	str	w1, [x0, 4]
+	ldr	x0, [x20, 2056]
+	str	wzr, [x0, 8]
+.L3498:
+	add	x19, x19, :lo12:.LANCHOR4
 	mov	x2, 128
-	ldr	x20, [x19,1536]
+	mov	w1, 0
+	ldr	x20, [x19, 2056]
 	add	x0, x20, 64
-	str	wzr, [x20,12]
+	str	wzr, [x20, 12]
 	bl	memset
-	mov	w0, 1
 	mov	x1, x20
+	mov	w0, 1
 	bl	StorageSysDataStore
 	mov	w0, 1
-	str	w0, [x19,1548]
-	b	.L3595
-.L3600:
-	adrp	x0, .LC190
-	add	x0, x0, :lo12:.LC190
-	bl	printk
-	add	x0, x29, 40
-	mov	x1, x20
-	mov	x2, 520
-	bl	rk_copy_from_user
-	cbnz	x0, .L3560
-	ldr	w1, [x29,40]
-	mov	w0, 20051
-	movk	w0, 0x4144, lsl 16
-	cmp	w1, w0
-	bne	.L3557
-	ldr	w2, [x29,44]
-	cmp	w2, 512
-	bhi	.L3557
-	adrp	x1, .LANCHOR5
-	add	x0, x29, 48
-	add	x1, x1, :lo12:.LANCHOR5
-	uxtw	x2, w2
-	add	x1, x1, 1560
-	b	.L3598
-.L3542:
-	mov	w0, 27698
-	movk	w0, 0x4004, lsl 16
-	cmp	w19, w0
-	bne	.L3568
-	adrp	x0, .LC191
-	add	x0, x0, :lo12:.LC191
-	b	.L3594
-.L3568:
+	str	w0, [x19, 2068]
+	b	.L3528
+.L3500:
 	mov	w0, 27708
 	movk	w0, 0x4004, lsl 16
 	cmp	w19, w0
-	bne	.L3570
+	bne	.L3502
 	adrp	x0, .LC192
 	add	x0, x0, :lo12:.LC192
-	b	.L3594
-.L3570:
+	b	.L3527
+.L3502:
 	adrp	x0, .LC193
 	add	x0, x0, :lo12:.LC193
-.L3594:
-	bl	printk
-	add	x0, x29, 40
-	mov	x1, x20
-	mov	x2, 520
-	bl	rk_copy_from_user
-	cbnz	x0, .L3560
-	ldr	w1, [x29,40]
-	mov	w0, 17227
-	movk	w0, 0x4c4f, lsl 16
-	cmp	w1, w0
-	bne	.L3597
-	mov	w0, 27708
-	movk	w0, 0x4004, lsl 16
-	cmp	w19, w0
-	adrp	x0, .LANCHOR5
-	bne	.L3571
-	add	x0, x0, :lo12:.LANCHOR5
-	add	x1, x29, 40
-	mov	x2, 16
-	ldr	x0, [x0,1536]
-	ldr	w0, [x0,20]
-	str	w0, [x29,44]
-	strb	w0, [x29,48]
-	mov	x0, x20
-	bl	rk_copy_to_user
-	cbz	x0, .L3541
-	b	.L3597
-.L3571:
-	add	x20, x0, :lo12:.LANCHOR5
-	ldr	w1, [x20,2072]
+	b	.L3527
+.L3503:
+	add	x20, x0, :lo12:.LANCHOR4
+	ldr	w1, [x20, 2592]
 	cmp	w1, 10
-	bhi	.L3597
-	ldr	x1, [x20,1536]
-	ldr	w2, [x29,44]
-	ldr	w3, [x1,24]
+	bhi	.L3530
+	ldr	x1, [x20, 2056]
+	ldr	w2, [x29, 44]
+	ldr	w3, [x1, 24]
 	cmp	w3, w2
-	beq	.L3572
-	cbz	w3, .L3572
-	adrp	x0, .LC194
+	beq	.L3504
+	cbz	w3, .L3504
 	mov	w1, w2
+	adrp	x0, .LC194
 	add	x0, x0, :lo12:.LC194
 	bl	printk
-	ldr	w0, [x20,2072]
+	ldr	w0, [x20, 2592]
 	add	w0, w0, 1
-	str	w0, [x20,2072]
-.L3597:
-	mov	x0, -14
-	b	.L3541
-.L3572:
-	add	x0, x0, :lo12:.LANCHOR5
-	str	wzr, [x0,2072]
+	str	w0, [x20, 2592]
+	b	.L3530
+.L3504:
+	add	x0, x0, :lo12:.LANCHOR4
+	str	wzr, [x0, 2592]
 	mov	w0, 27698
 	movk	w0, 0x4004, lsl 16
 	cmp	w19, w0
-	bne	.L3573
-	str	wzr, [x1,20]
-	str	wzr, [x1,24]
-	b	.L3574
-.L3573:
-	mov	w0, 1
-	str	w2, [x1,24]
-	str	w0, [x1,20]
-.L3574:
+	bne	.L3505
+	stp	wzr, wzr, [x1, 20]
+.L3506:
 	mov	w0, 1
-	mov	x19, -2
 	bl	StorageSysDataStore
 	cmn	w0, #1
-	bne	.L3595
-	b	.L3556
-.L3551:
+	bne	.L3528
+	mov	x19, -2
+	b	.L3489
+.L3505:
+	mov	w0, 1
+	stp	w0, w2, [x1, 20]
+	b	.L3506
+.L3484:
 	adrp	x0, .LC195
 	add	x0, x0, :lo12:.LC195
 	bl	printk
-	add	x0, x29, 40
-	mov	x1, x20
 	mov	x2, 520
+	mov	x1, x20
+	add	x0, x29, 40
 	bl	rk_copy_from_user
-	cbnz	x0, .L3560
-	ldr	w1, [x29,40]
+	cbnz	x0, .L3493
+	ldr	w1, [x29, 40]
 	mov	w0, 17750
 	movk	w0, 0x444e, lsl 16
 	cmp	w1, w0
-	bne	.L3557
-	ldr	w2, [x29,44]
+	bne	.L3490
+	ldr	w2, [x29, 44]
 	cmp	w2, 504
-	bhi	.L3557
+	bhi	.L3490
 	mov	w0, 30224
-	adrp	x1, .LANCHOR5
+	adrp	x1, .LANCHOR4
 	movk	w0, 0x4004, lsl 16
 	uxtw	x2, w2
 	cmp	w19, w0
-	add	x1, x1, :lo12:.LANCHOR5
+	add	x1, x1, :lo12:.LANCHOR4
 	add	x0, x29, 48
-	bne	.L3575
-	ldr	x1, [x1,2080]
-	b	.L3599
-.L3575:
-	ldr	x1, [x1,2088]
-.L3599:
+	bne	.L3507
+	ldr	x1, [x1, 2600]
+.L3532:
 	add	x1, x1, 8
-.L3598:
-	bl	memcpy
-	b	.L3592
-.L3553:
-	adrp	x0, .LC196
-	add	x0, x0, :lo12:.LC196
-	bl	printk
-	add	x0, x29, 40
-	mov	x1, x20
-	mov	x2, 520
-	bl	rk_copy_from_user
-	cbnz	x0, .L3560
-	ldr	w1, [x29,40]
-	mov	w0, 17750
-	movk	w0, 0x444e, lsl 16
-	cmp	w1, w0
-	bne	.L3557
-	ldr	w2, [x29,44]
-	cmp	w2, 504
-	bhi	.L3557
-	mov	w0, 30225
-	add	w2, w2, 8
-	movk	w0, 0x4004, lsl 16
-	cmp	w19, w0
-	adrp	x19, .LANCHOR5
-	add	x19, x19, :lo12:.LANCHOR5
-	bne	.L3577
-	ldr	x0, [x19,2080]
-	add	x1, x29, 40
-	bl	memcpy
-	mov	w0, 2
-	ldr	x1, [x19,2080]
-	b	.L3596
-.L3577:
-	ldr	x0, [x19,2088]
-	add	x1, x29, 40
+	b	.L3531
+.L3507:
+	ldr	x1, [x1, 2608]
+	b	.L3532
+.L3509:
+	ldr	x0, [x19, 2608]
 	bl	memcpy
-	ldr	x1, [x19,2088]
 	mov	w0, 3
-.L3596:
-	bl	StorageSysDataStore
-	uxtw	x19, w0
-	b	.L3556
-.L3546:
+	ldr	x1, [x19, 2608]
+	b	.L3529
+.L3479:
 	bl	rknand_dev_flush
-.L3595:
-	mov	x19, 0
-.L3556:
-	adrp	x0, .LC197
-	mov	x1, x19
-	add	x0, x0, :lo12:.LC197
-	bl	printk
-	mov	x0, x19
-	b	.L3541
-.L3578:
-	mov	x0, -22
-.L3541:
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 32
-	add	sp, sp, 528
-	ret
+	b	.L3528
+.L3511:
+	mov	x19, -2
+	b	.L3473
 	.size	rknand_sys_storage_ioctl, .-rknand_sys_storage_ioctl
 	.align	2
 	.global	rk_ftl_storage_sys_init
 	.type	rk_ftl_storage_sys_init, %function
 rk_ftl_storage_sys_init:
-	stp	x29, x30, [sp, -48]!
+	stp	x29, x30, [sp, -32]!
 	mov	w0, -1
 	mov	w2, 512
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR5
-	add	x19, x20, :lo12:.LANCHOR5
-	stp	x21, x22, [sp,32]
-	ldr	x1, [x19,1488]
-	str	w0, [x19,1528]
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR4
+	add	x19, x20, :lo12:.LANCHOR4
+	ldr	x1, [x19, 2008]
+	str	w0, [x19, 2048]
 	add	x0, x1, 512
-	str	x0, [x19,1536]
+	str	x0, [x19, 2056]
 	add	x0, x1, 1024
-	str	x1, [x19,1552]
-	str	x0, [x19,2080]
+	str	x1, [x19, 2072]
+	str	x0, [x19, 2600]
 	add	x1, x1, 1536
-	add	x0, x19, 1560
-	strb	wzr, [x19,1512]
-	str	xzr, [x19,1520]
-	str	xzr, [x19,2096]
-	str	x1, [x19,2088]
+	strb	wzr, [x19, 2032]
+	add	x0, x19, 2080
+	str	xzr, [x19, 2040]
+	str	xzr, [x19, 2616]
+	str	x1, [x19, 2608]
 	bl	ftl_memcpy
-	ldr	x21, [x19,1552]
-	str	wzr, [x19,1544]
-	str	wzr, [x19,2072]
-	ldr	w0, [x21,16]
-	ldr	w22, [x21,508]
-	str	w0, [x19,1548]
-	cbz	w22, .L3602
-	mov	x0, x21
+	ldr	x6, [x19, 2072]
+	str	wzr, [x19, 2064]
+	str	wzr, [x19, 2592]
+	ldr	w7, [x6, 508]
+	ldr	w0, [x6, 16]
+	str	w0, [x19, 2068]
+	cbz	w7, .L3534
 	mov	w1, 508
+	mov	x0, x6
 	bl	js_hash
-	cmp	w22, w0
-	beq	.L3602
+	cmp	w7, w0
+	beq	.L3534
+	str	wzr, [x6, 16]
 	adrp	x0, .LC198
-	str	wzr, [x21,16]
+	str	wzr, [x19, 2068]
 	add	x0, x0, :lo12:.LC198
-	str	wzr, [x19,1548]
 	bl	printk
-.L3602:
-	add	x0, x20, :lo12:.LANCHOR5
-	ldr	w1, [x0,1548]
-	cbz	w1, .L3603
+.L3534:
+	add	x0, x20, :lo12:.LANCHOR4
+	ldr	w1, [x0, 2068]
+	cbz	w1, .L3535
 	mov	w1, 5161
 	movk	w1, 0xc059, lsl 16
-	str	w1, [x0,1544]
-.L3603:
-	add	x20, x20, :lo12:.LANCHOR5
+	str	w1, [x0, 2064]
+.L3535:
+	add	x20, x20, :lo12:.LANCHOR4
 	mov	w0, 2
-	ldr	x1, [x20,2080]
+	ldr	x1, [x20, 2600]
 	bl	StorageSysDataLoad
-	ldr	x1, [x20,2088]
+	ldr	x1, [x20, 2608]
 	mov	w0, 3
 	bl	StorageSysDataLoad
 	bl	rknand_sys_storage_init
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 48
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
 	ret
 	.size	rk_ftl_storage_sys_init, .-rk_ftl_storage_sys_init
 	.align	2
@@ -23422,375 +22959,374 @@ StorageSysDataDeInit:
 	.global	rk_ftl_vendor_storage_init
 	.type	rk_ftl_vendor_storage_init, %function
 rk_ftl_vendor_storage_init:
-	stp	x29, x30, [sp, -64]!
+	stp	x29, x30, [sp, -80]!
 	mov	w0, 65536
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	adrp	x21, .LANCHOR5
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR4
+	add	x20, x19, :lo12:.LANCHOR4
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
 	bl	ftl_malloc
-	add	x1, x21, :lo12:.LANCHOR5
-	mov	w19, -12
-	str	x0, [x1,2104]
-	cbz	x0, .L3612
-	mov	w23, 0
+	str	x0, [x20, 2624]
+	cbz	x0, .L3550
 	adrp	x24, .LC199
-	mov	w19, w23
-	mov	w22, w23
+	mov	w26, 22084
+	mov	x22, x19
 	add	x24, x24, :lo12:.LC199
-.L3616:
-	add	x20, x21, :lo12:.LANCHOR5
-	lsl	w0, w22, 7
+	mov	w25, 0
+	mov	w23, 0
+	mov	w21, 0
+	movk	w26, 0x524b, lsl 16
+.L3548:
+	ldr	x2, [x20, 2624]
 	mov	w1, 128
-	ldr	x2, [x20,2104]
+	lsl	w0, w21, 7
 	bl	FlashBootVendorRead
-	cbnz	w0, .L3613
-	ldr	x3, [x20,2104]
+	cbnz	w0, .L3546
+	ldr	x0, [x20, 2624]
+	add	x1, x0, 61440
+	ldr	w3, [x0, 4]
+	ldr	w2, [x1, 4092]
+	ldr	w1, [x0]
 	mov	x0, x24
-	add	x2, x3, 61440
-	ldr	w1, [x3]
-	ldr	w3, [x3,4]
-	ldr	w2, [x2,4092]
 	bl	printk
-	ldr	x20, [x20,2104]
-	mov	w0, 22084
-	movk	w0, 0x524b, lsl 16
-	ldr	w1, [x20]
-	cmp	w1, w0
-	bne	.L3614
-	ldr	w0, [x20,4]
-	cmp	w19, w0
-	bcs	.L3614
-	add	x1, x20, 61440
-	ldr	w1, [x1,4092]
-	cmp	w1, w0
-	csel	w23, w23, w22, ne
-	csel	w19, w19, w0, ne
-.L3614:
-	cbnz	w22, .L3624
-	mov	w22, 1
-	b	.L3616
-.L3624:
-	cbz	w19, .L3617
-	lsl	w0, w23, 7
+	ldr	x19, [x20, 2624]
+	ldr	w0, [x19]
+	cmp	w0, w26
+	bne	.L3547
+	add	x0, x19, 61440
+	ldr	w1, [x19, 4]
+	ldr	w0, [x0, 4092]
+	cmp	w0, w1
+	bne	.L3547
+	cmp	w0, w23
+	bls	.L3547
+	mov	w25, w21
+	mov	w23, w0
+.L3547:
+	add	w21, w21, 1
+	cmp	w21, 2
+	bne	.L3548
+	cbz	w23, .L3549
+	mov	x2, x19
 	mov	w1, 128
-	mov	x2, x20
+	lsl	w0, w25, 7
 	bl	FlashBootVendorRead
-	mov	w19, w0
-	cbz	w0, .L3612
-	b	.L3613
-.L3617:
-	mov	x0, x20
-	mov	w1, w19
+	cbnz	w0, .L3546
+.L3544:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	ret
+.L3549:
+	mov	w1, 0
 	mov	x2, 65536
+	mov	x0, x19
 	bl	memset
-	str	w22, [x20,4]
-	mov	w0, 22084
-	movk	w0, 0x524b, lsl 16
-	str	w0, [x20]
-	add	x0, x20, 61440
-	str	w22, [x0,4092]
+	mov	w1, 22084
+	mov	w0, 1
+	movk	w1, 0x524b, lsl 16
+	stp	w1, w0, [x19]
+	add	x1, x19, 61440
+	str	w0, [x1, 4092]
 	mov	w0, -1032
-	strh	w19, [x20,12]
-	strh	w0, [x20,14]
-	b	.L3612
-.L3613:
-	add	x21, x21, :lo12:.LANCHOR5
-	mov	w19, -1
-	ldr	x0, [x21,2104]
+	strh	w0, [x19, 14]
+	mov	w0, 0
+	b	.L3544
+.L3546:
+	add	x22, x22, :lo12:.LANCHOR4
+	ldr	x0, [x22, 2624]
 	bl	kfree
-	str	xzr, [x21,2104]
-.L3612:
-	mov	w0, w19
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 64
-	ret
+	str	xzr, [x22, 2624]
+	mov	w0, -1
+	b	.L3544
+.L3550:
+	mov	w0, -12
+	b	.L3544
 	.size	rk_ftl_vendor_storage_init, .-rk_ftl_vendor_storage_init
 	.align	2
 	.global	rk_ftl_vendor_read
 	.type	rk_ftl_vendor_read, %function
 rk_ftl_vendor_read:
-	adrp	x3, .LANCHOR5+2104
-	stp	x29, x30, [sp, -32]!
-	add	x29, sp, 0
-	ldr	x5, [x3,#:lo12:.LANCHOR5+2104]
-	mov	w3, -1
-	str	x19, [sp,16]
-	cbz	x5, .L3626
-	ldrh	w3, [x5,10]
-	mov	x4, 0
-.L3627:
-	cmp	w4, w3
-	mov	w6, w4
-	bcs	.L3631
-	add	x7, x5, x4, lsl 3
-	add	x4, x4, 1
-	ldrh	w7, [x7,16]
+	adrp	x3, .LANCHOR4+2624
+	ldr	x4, [x3, #:lo12:.LANCHOR4+2624]
+	cbz	x4, .L3558
+	ldrh	w6, [x4, 10]
+	add	x5, x4, 16
+	mov	w3, 0
+.L3555:
+	cmp	w3, w6
+	bcc	.L3557
+.L3558:
+	mov	w0, -1
+	ret
+.L3557:
+	ldrh	w7, [x5], 8
 	cmp	w7, w0
-	bne	.L3627
-	add	x6, x5, w6, uxtw 3
-	ldrh	w4, [x6,20]
+	bne	.L3556
+	stp	x29, x30, [sp, -32]!
+	add	x3, x4, w3, uxtw 3
 	mov	x0, x1
-	ldrh	w1, [x6,18]
-	cmp	w2, w4
-	csel	w19, w2, w4, ls
+	add	x29, sp, 0
+	str	x19, [sp, 16]
+	ldrh	w19, [x3, 20]
+	ldrh	w1, [x3, 18]
+	cmp	w19, w2
+	csel	w19, w19, w2, ls
 	add	x1, x1, 1024
-	add	x1, x5, x1
 	uxtw	x2, w19
+	add	x1, x4, x1
 	bl	memcpy
-	mov	w3, w19
-	b	.L3626
-.L3631:
-	mov	w3, -1
-.L3626:
-	mov	w0, w3
-	ldr	x19, [sp,16]
+	mov	w0, w19
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L3556:
+	add	w3, w3, 1
+	b	.L3555
 	.size	rk_ftl_vendor_read, .-rk_ftl_vendor_read
 	.align	2
 	.global	rk_ftl_vendor_write
 	.type	rk_ftl_vendor_write, %function
 rk_ftl_vendor_write:
 	stp	x29, x30, [sp, -112]!
-	mov	w6, w0
-	adrp	x0, .LANCHOR5+2104
+	adrp	x3, .LANCHOR4+2624
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	ldr	x19, [x0,#:lo12:.LANCHOR5+2104]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	mov	w26, w2
+	stp	x19, x20, [sp, 16]
+	ldr	x19, [x3, #:lo12:.LANCHOR4+2624]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	cbz	x19, .L3578
+	add	w4, w2, 63
+	ldrh	w3, [x19, 10]
+	ldrh	w24, [x19, 8]
 	mov	x28, x1
-	mov	w2, -1
-	cbz	x19, .L3633
-	add	w20, w26, 63
-	ldrh	w3, [x19,10]
-	ldrh	w23, [x19,8]
-	and	w20, w20, -64
-	mov	x2, 0
-.L3634:
-	cmp	w2, w3
-	mov	w4, w2
-	bcs	.L3649
-	add	x0, x19, x2, lsl 3
-	add	x2, x2, 1
-	ldrh	w0, [x0,16]
-	cmp	w0, w6
-	bne	.L3634
-	add	x21, x19, w4, uxtw 3
-	ldrh	w24, [x21,20]
-	add	x5, x19, 1024
-	add	w24, w24, 63
-	and	w24, w24, -64
-	cmp	w26, w24
-	bls	.L3635
-	ldrh	w0, [x19,14]
-	mov	w2, -1
-	cmp	w0, w20
-	bcc	.L3633
-	ldrh	w21, [x21,18]
-	add	w22, w3, w2
-.L3636:
-	cmp	w4, w22
-	uxtw	x3, w4
-	bcs	.L3650
-	add	x3, x19, x3, lsl 3
-	add	w25, w4, 1
-	add	x1, x19, w25, uxtw 3
-	ldrh	w0, [x1,16]
-	str	x6, [x29,96]
-	strh	w0, [x3,16]
-	str	x5, [x29,104]
-	ldrh	w0, [x1,20]
-	strh	w0, [x3,20]
-	strh	w21, [x3,18]
-	add	x0, x5, w21, uxtw
-	ldrh	w27, [x1,20]
-	ldrh	w1, [x1,18]
-	add	w27, w27, 63
-	and	w27, w27, -64
-	add	x1, x5, x1
-	and	x2, x27, 131008
-	add	w21, w21, w27
-	bl	memcpy
-	mov	w4, w25
-	ldr	x6, [x29,96]
-	ldr	x5, [x29,104]
-	b	.L3636
-.L3650:
-	add	x3, x19, x3, lsl 3
-	uxth	w21, w21
-	mov	x1, x28
-	uxtw	x2, w26
-	add	x0, x5, w21, uxth
-	uxth	w20, w20
-	strh	w21, [x3,18]
-	add	w21, w21, w20
-	strh	w6, [x3,16]
-	strh	w26, [x3,20]
-	bl	memcpy
-	strh	w21, [x19,12]
-	ldrh	w0, [x19,14]
-	add	w24, w24, w0
-	sub	w24, w24, w20
-	strh	w24, [x19,14]
-	b	.L3648
-.L3635:
-	ldrh	w0, [x21,18]
-	mov	x1, x28
-	uxtw	x2, w26
-	add	x0, x5, x0
-	bl	memcpy
-	strh	w26, [x21,20]
-	b	.L3648
-.L3649:
-	ldrh	w4, [x19,14]
-	mov	w2, -1
-	cmp	w4, w20
-	bcc	.L3633
+	mov	w26, w2
+	and	w22, w4, -64
+	add	x1, x19, 16
+	mov	w20, 0
+.L3565:
+	cmp	w20, w3
+	bcc	.L3573
+	ldrh	w1, [x19, 14]
+	cmp	w22, w1
+	bhi	.L3578
 	add	x3, x19, w3, uxth 3
-	strh	w6, [x3,16]
-	uxth	w20, w20
-	mov	x1, x28
-	ldrh	w0, [x19,12]
+	strh	w0, [x3, 16]
+	and	w0, w22, 65535
+	ldrh	w2, [x19, 12]
+	strh	w2, [x3, 18]
+	strh	w26, [x3, 20]
+	add	w2, w2, w0
+	sub	w0, w1, w0
+	strh	w2, [x19, 12]
+	strh	w0, [x19, 14]
 	uxtw	x2, w26
-	strh	w0, [x3,18]
-	strh	w26, [x3,20]
-	add	w0, w20, w0
-	sub	w20, w4, w20
-	strh	w0, [x19,12]
-	strh	w20, [x19,14]
-	ldrh	w0, [x3,18]
+	mov	x1, x28
+	ldrh	w0, [x3, 18]
 	add	x0, x0, 1024
 	add	x0, x19, x0
 	bl	memcpy
-	ldrh	w0, [x19,10]
+	ldrh	w0, [x19, 10]
 	add	w0, w0, 1
-	strh	w0, [x19,10]
-.L3648:
-	ldr	w0, [x19,4]
+	strh	w0, [x19, 10]
+	b	.L3580
+.L3573:
+	ldrh	w6, [x1], 8
+	cmp	w6, w0
+	bne	.L3566
+	uxtw	x23, w20
+	add	x5, x19, 1024
+	add	x21, x19, x23, lsl 3
+	ldrh	w25, [x21, 20]
+	add	w25, w25, 63
+	and	w25, w25, -64
+	cmp	w26, w25
+	bls	.L3567
+	ldrh	w0, [x19, 14]
+	cmp	w22, w0
+	bhi	.L3578
+	add	x23, x23, 2
+	ldrh	w21, [x21, 18]
+	add	x23, x19, x23, lsl 3
+	sub	w3, w3, #1
+.L3568:
+	cmp	w20, w3
+	bcc	.L3569
+	add	x20, x19, w20, uxtw 3
+	and	w21, w21, 65535
+	add	x0, x5, w21, uxth
+	uxtw	x2, w26
+	mov	x1, x28
+	strh	w21, [x20, 18]
+	strh	w6, [x20, 16]
+	strh	w26, [x20, 20]
+	bl	memcpy
+	ldrh	w0, [x19, 14]
+	and	w4, w22, 65535
+	add	w21, w21, w4
+	strh	w21, [x19, 12]
+	sub	w0, w0, w4
+	add	w25, w0, w25
+	strh	w25, [x19, 14]
+.L3580:
+	ldr	w0, [x19, 4]
 	add	x1, x19, 61440
 	mov	x2, x19
 	add	w0, w0, 1
-	str	w0, [x19,4]
-	str	w0, [x1,4092]
+	str	w0, [x19, 4]
+	str	w0, [x1, 4092]
 	mov	w1, 128
-	ldrh	w0, [x19,8]
+	ldrh	w0, [x19, 8]
 	add	w0, w0, 1
-	uxth	w0, w0
+	and	w0, w0, 65535
 	cmp	w0, 1
 	csel	w0, w0, wzr, ls
-	strh	w0, [x19,8]
-	lsl	w0, w23, 7
+	strh	w0, [x19, 8]
+	lsl	w0, w24, 7
 	bl	FlashBootVendorWrite
-	mov	w2, 0
-.L3633:
-	mov	w0, w2
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+	mov	w0, 0
+.L3563:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 112
 	ret
+.L3569:
+	add	w20, w20, 1
+	stp	w3, w6, [x29, 96]
+	add	x0, x19, w20, uxtw 3
+	str	x5, [x29, 104]
+	add	x23, x23, 8
+	ldrh	w1, [x0, 16]
+	strh	w1, [x23, -8]
+	ldrh	w1, [x0, 20]
+	strh	w1, [x23, -4]
+	strh	w21, [x23, -6]
+	ldrh	w27, [x0, 20]
+	ldrh	w1, [x0, 18]
+	add	x0, x5, w21, uxtw
+	add	w27, w27, 63
+	and	w27, w27, -64
+	add	x1, x5, x1
+	and	x2, x27, 131008
+	bl	memcpy
+	add	w21, w21, w27
+	ldr	x5, [x29, 104]
+	ldp	w3, w6, [x29, 96]
+	b	.L3568
+.L3567:
+	ldrh	w0, [x21, 18]
+	uxtw	x2, w26
+	mov	x1, x28
+	add	x0, x5, x0
+	bl	memcpy
+	strh	w26, [x21, 20]
+	b	.L3580
+.L3566:
+	add	w20, w20, 1
+	b	.L3565
+.L3578:
+	mov	w0, -1
+	b	.L3563
 	.size	rk_ftl_vendor_write, .-rk_ftl_vendor_write
 	.align	2
 	.global	rk_ftl_vendor_storage_ioctl
 	.type	rk_ftl_vendor_storage_ioctl, %function
 rk_ftl_vendor_storage_ioctl:
-	stp	x29, x30, [sp, -64]!
+	stp	x29, x30, [sp, -48]!
 	mov	w0, 4096
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	str	x21, [sp,32]
-	mov	x20, -1
-	str	x1, [x29,56]
-	mov	x21, x2
+	stp	x19, x20, [sp, 16]
+	mov	x20, x2
+	str	x21, [sp, 32]
+	mov	w21, w1
 	bl	ftl_malloc
+	cbz	x0, .L3589
+	mov	w1, 30209
 	mov	x19, x0
-	cbz	x0, .L3652
-	mov	w2, 30209
-	ldr	x1, [x29,56]
-	movk	w2, 0x4004, lsl 16
-	cmp	w1, w2
-	beq	.L3654
-	mov	w2, 30210
-	movk	w2, 0x4004, lsl 16
-	cmp	w1, w2
-	beq	.L3655
-	b	.L3666
-.L3654:
-	mov	x1, x21
+	movk	w1, 0x4004, lsl 16
+	cmp	w21, w1
+	beq	.L3584
+	add	w1, w1, 1
+	cmp	w21, w1
+	beq	.L3585
+.L3595:
+	mov	x20, -14
+	b	.L3583
+.L3584:
 	mov	x2, 8
+	mov	x1, x20
 	bl	rk_copy_from_user
-	cbnz	x0, .L3666
+	cbnz	x0, .L3595
 	ldr	w1, [x19]
 	mov	w0, 17745
 	movk	w0, 0x5652, lsl 16
 	cmp	w1, w0
-	beq	.L3657
-.L3658:
+	beq	.L3587
+.L3588:
 	mov	x20, -1
-	b	.L3653
-.L3657:
-	ldrh	w0, [x19,4]
+.L3583:
+	mov	x0, x19
+	bl	kfree
+.L3581:
+	mov	x0, x20
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 48
+	ret
+.L3587:
+	ldrh	w2, [x19, 6]
 	add	x1, x19, 8
-	ldrh	w2, [x19,6]
+	ldrh	w0, [x19, 4]
 	bl	rk_ftl_vendor_read
 	cmn	w0, #1
-	beq	.L3658
-	uxth	x2, w0
-	strh	w0, [x19,6]
+	beq	.L3588
+	strh	w0, [x19, 6]
+	and	x0, x0, 65535
+	add	x2, x0, 8
 	mov	x1, x19
-	mov	x0, x21
-	add	x2, x2, 8
-	mov	x20, -14
+	mov	x0, x20
 	bl	rk_copy_to_user
-	cmp	x0, xzr
-	csel	x20, xzr, x20, eq
-	b	.L3653
-.L3655:
-	mov	x1, x21
+	cbnz	x0, .L3595
+	mov	x20, 0
+	b	.L3583
+.L3585:
 	mov	x2, 8
+	mov	x1, x20
 	bl	rk_copy_from_user
-	cbnz	x0, .L3666
+	cbnz	x0, .L3595
 	ldr	w1, [x19]
 	mov	w0, 17745
 	movk	w0, 0x5652, lsl 16
 	cmp	w1, w0
-	bne	.L3658
-	ldrh	w3, [x19,6]
-	cmp	w3, 4087
-	bhi	.L3658
-	add	w2, w3, 8
-	mov	x0, x19
-	mov	x1, x21
+	bne	.L3588
+	ldrh	w2, [x19, 6]
+	cmp	w2, 4087
+	bhi	.L3588
+	add	w2, w2, 8
+	mov	x1, x20
 	sxtw	x2, w2
+	mov	x0, x19
 	bl	rk_copy_from_user
-	cbnz	x0, .L3666
-	ldrh	w0, [x19,4]
+	cbnz	x0, .L3595
+	ldrh	w2, [x19, 6]
 	add	x1, x19, 8
-	ldrh	w2, [x19,6]
+	ldrh	w0, [x19, 4]
 	bl	rk_ftl_vendor_write
 	sxtw	x20, w0
-	b	.L3653
-.L3666:
-	mov	x20, -14
-.L3653:
-	mov	x0, x19
-	bl	kfree
-.L3652:
-	mov	x0, x20
-	ldr	x21, [sp,32]
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 64
-	ret
+	b	.L3583
+.L3589:
+	mov	x20, -1
+	b	.L3581
 	.size	rk_ftl_vendor_storage_ioctl, .-rk_ftl_vendor_storage_ioctl
 	.global	SecureBootUnlockTryCount
 	.global	SecureBootCheckOK
@@ -23801,6 +23337,8 @@ rk_ftl_vendor_storage_ioctl:
 	.global	gSnSectorData
 	.global	gpDrmKeyInfo
 	.global	gpBootConfig
+	.global	ftl_dma32_buffer_size
+	.global	ftl_dma32_buffer
 	.global	gLoaderBootInfo
 	.global	RK29_NANDC1_REG_BASE
 	.global	RK29_NANDC_REG_BASE
@@ -24037,10 +23575,10 @@ rk_ftl_vendor_storage_ioctl:
 	.global	read_retry_cur_offset
 	.section	.rodata
 	.align	3
-.LANCHOR3 = . + 0
-	.type	__func__.20995, %object
-	.size	__func__.20995, 11
-__func__.20995:
+	.set	.LANCHOR3,. + 0
+	.type	__func__.21189, %object
+	.size	__func__.21189, 11
+__func__.21189:
 	.string	"FtlMemInit"
 	.zero	5
 	.type	samsung_14nm_slc_rr, %object
@@ -24180,438 +23718,37 @@ samsung_14nm_mlc_rr:
 	.byte	18
 	.byte	9
 	.byte	8
-	.type	__func__.21774, %object
-	.size	__func__.21774, 17
-__func__.21774:
+	.type	__func__.21968, %object
+	.size	__func__.21968, 17
+__func__.21968:
 	.string	"FtlDumpBlockInfo"
 	.zero	7
-	.type	__func__.21793, %object
-	.size	__func__.21793, 16
-__func__.21793:
+	.type	__func__.21987, %object
+	.size	__func__.21987, 16
+__func__.21987:
 	.string	"FtlScanAllBlock"
-	.type	__func__.22061, %object
-	.size	__func__.22061, 17
-__func__.22061:
+	.type	__func__.22255, %object
+	.size	__func__.22255, 17
+__func__.22255:
 	.string	"ftl_scan_all_ppa"
 	.zero	7
-	.type	__func__.21742, %object
-	.size	__func__.21742, 12
-__func__.21742:
+	.type	__func__.21936, %object
+	.size	__func__.21936, 12
+__func__.21936:
 	.string	"FtlCheckVpc"
 	.zero	4
-	.type	__func__.22041, %object
-	.size	__func__.22041, 21
-__func__.22041:
+	.type	__func__.22235, %object
+	.size	__func__.22235, 21
+__func__.22235:
 	.string	"FtlVpcCheckAndModify"
 	.zero	3
-	.type	__func__.21068, %object
-	.size	__func__.21068, 8
-__func__.21068:
+	.type	__func__.21262, %object
+	.size	__func__.21262, 8
+__func__.21262:
 	.string	"FtlInit"
-	.section	.rodata.str1.1,"aMS",%progbits,1
-.LC0:
-	.string	"FlashEraseBlocks pageAddr error %x\n"
-.LC1:
-	.string	"phyBlk = 0x%x die = %d block_in_die = 0x%x 0x%8x\n"
-.LC2:
-	.string	"FtlFreeSysBlkQueueOut free count = %d\n"
-.LC3:
-	.string	"FtlFreeSysBlkQueueOut = %x, free count = %d, error\n"
-.LC4:
-	.string	"FtlFreeSysBlkQueueOut = %x, free count = %d\n"
-.LC5:
-	.string	"FLASH INFO:\n"
-.LC6:
-	.string	"FLASH ID: %x\n"
-.LC7:
-	.string	"Device Capacity: %d MB\n"
-.LC8:
-	.string	"FMWAIT: %x %x %x %x\n"
-.LC9:
-	.string	"FTL INFO:\n"
-.LC10:
-	.string	"g_MaxLpn = 0x%x\n"
-.LC11:
-	.string	"g_VaildLpn = 0x%x\n"
-.LC12:
-	.string	"read_page_count = 0x%x\n"
-.LC13:
-	.string	"discard_page_count = 0x%x\n"
-.LC14:
-	.string	"write_page_count = 0x%x\n"
-.LC15:
-	.string	"cache_write_count = 0x%x\n"
-.LC16:
-	.string	"l2p_write_count = 0x%x\n"
-.LC17:
-	.string	"gc_page_count = 0x%x\n"
-.LC18:
-	.string	"totle_write = %d MB\n"
-.LC19:
-	.string	"totle_read = %d MB\n"
-.LC20:
-	.string	"GSV = 0x%x\n"
-.LC21:
-	.string	"GDV = 0x%x\n"
-.LC22:
-	.string	"bad blk num = %d %d\n"
-.LC23:
-	.string	"free_superblocks = 0x%x\n"
-.LC24:
-	.string	"mlc_EC = 0x%x\n"
-.LC25:
-	.string	"slc_EC = 0x%x\n"
-.LC26:
-	.string	"avg_EC = 0x%x\n"
-.LC27:
-	.string	"sys_EC = 0x%x\n"
-.LC28:
-	.string	"max_EC = 0x%x\n"
-.LC29:
-	.string	"min_EC = 0x%x\n"
-.LC30:
-	.string	"PLT = 0x%x\n"
-.LC31:
-	.string	"POT = 0x%x\n"
-.LC32:
-	.string	"MaxSector = 0x%x\n"
-.LC33:
-	.string	"init_sys_blks_pp = 0x%x\n"
-.LC34:
-	.string	"sys_blks_pp = 0x%x\n"
-.LC35:
-	.string	"free sysblock = 0x%x\n"
-.LC36:
-	.string	"data_blks_pp = 0x%x\n"
-.LC37:
-	.string	"data_op_blks_pp = 0x%x\n"
-.LC38:
-	.string	"max_data_blks = 0x%x\n"
-.LC39:
-	.string	"Sys.id = 0x%x\n"
-.LC40:
-	.string	"Bbt.id = 0x%x\n"
-.LC41:
-	.string	"ACT.page = 0x%x\n"
-.LC42:
-	.string	"ACT.plane = 0x%x\n"
-.LC43:
-	.string	"ACT.id = 0x%x\n"
-.LC44:
-	.string	"ACT.mode = 0x%x\n"
-.LC45:
-	.string	"ACT.a_pages = 0x%x\n"
-.LC46:
-	.string	"ACT VPC = 0x%x\n"
-.LC47:
-	.string	"BUF.page = 0x%x\n"
-.LC48:
-	.string	"BUF.plane = 0x%x\n"
-.LC49:
-	.string	"BUF.id = 0x%x\n"
-.LC50:
-	.string	"BUF.mode = 0x%x\n"
-.LC51:
-	.string	"BUF.a_pages = 0x%x\n"
-.LC52:
-	.string	"BUF VPC = 0x%x\n"
-.LC53:
-	.string	"TMP.page = 0x%x\n"
-.LC54:
-	.string	"TMP.plane = 0x%x\n"
-.LC55:
-	.string	"TMP.id = 0x%x\n"
-.LC56:
-	.string	"TMP.mode = 0x%x\n"
-.LC57:
-	.string	"TMP.a_pages = 0x%x\n"
-.LC58:
-	.string	"GC.page = 0x%x\n"
-.LC59:
-	.string	"GC.plane = 0x%x\n"
-.LC60:
-	.string	"GC.id = 0x%x\n"
-.LC61:
-	.string	"GC.mode = 0x%x\n"
-.LC62:
-	.string	"GC.a_pages = 0x%x\n"
-.LC63:
-	.string	"WR_CHK = 0x%x %x %x %x\n"
-.LC64:
-	.string	"Read Err = 0x%x\n"
-.LC65:
-	.string	"Prog Err = 0x%x\n"
-.LC66:
-	.string	"gc_free_blk_th= 0x%x\n"
-.LC67:
-	.string	"gc_merge_free_blk_th= 0x%x\n"
-.LC68:
-	.string	"gc_skip_write_count= 0x%x\n"
-.LC69:
-	.string	"gc_blk_index= 0x%x\n"
-.LC70:
-	.string	"free min EC= 0x%x\n"
-.LC71:
-	.string	"free max EC= 0x%x\n"
-.LC72:
-	.string	"GC__SB VPC = 0x%x\n"
-.LC73:
-	.string	"%d. [0x%x]=0x%x 0x%x  0x%x\n"
-.LC74:
-	.string	"free %d. [0x%x] 0x%x  0x%x\n"
-.LC75:
-	.string	"%s\n"
-.LC76:
-	.string	"FTL version: 5.0.63 20200923"
-.LC77:
-	.string	"swblk %x ,avg = %x max= %x vpc= %x,ec=%x ,max ec=%x\n"
-.LC78:
-	.string	"FtlGcRefreshBlock  0x%x\n"
-.LC79:
-	.string	"FtlGcMarkBadPhyBlk %d 0x%x\n"
-.LC80:
-	.string	"%s error allocating memory. return -1\n"
-.LC81:
-	.string	"%s %p:0x%x:"
-.LC82:
-	.string	"%x "
-.LC83:
-	.string	""
-.LC84:
-	.string	"otp error! %d"
-.LC85:
-	.string	"rr"
-.LC86:
-	.string	"%d statReg->V6.mtrans_cnt=%d flReg.V6.page_num=%d\n"
-.LC87:
-	.string	"nandc:"
-.LC88:
-	.string	"%d flReg.d32=%x %x\n"
-.LC89:
-	.string	"sdr read ok %x ecc=%d\n"
-.LC90:
-	.string	"sync para %d\n"
-.LC91:
-	.string	"TOG mode Read error %x %x\n"
-.LC92:
-	.string	"read retry status %x %x %x\n"
-.LC93:
-	.string	"micron RR %d row=%x,count %d,status=%d\n"
-.LC94:
-	.string	"samsung RR %d row=%x,count %d,status=%d\n"
-.LC95:
-	.string	"ECC:%d\n"
-.LC96:
-	.string	"No.%d FLASH ID:%x %x %x %x %x %x\n"
-.LC97:
-	.string	"FlashLoadPhyInfo fail %x!!\n"
-.LC98:
-	.string	"Read pageadd=%x  ecc=%x err=%x\n"
-.LC99:
-	.string	"data:"
-.LC100:
-	.string	"spare:"
-.LC101:
-	.string	"ReadRetry pageadd=%x ecc=%x err=%x\n"
-.LC102:
-	.string	"FLFB:%d %d\n"
-.LC103:
-	.string	"prog error: = %x\n"
-.LC104:
-	.string	"prog read error: = %x\n"
-.LC105:
-	.string	"prog read REFRESH: = %x\n"
-.LC106:
-	.string	"prog read s error: = %x %x %x\n"
-.LC107:
-	.string	"prog read d error: = %x %x %x\n"
-.LC108:
-	.string	"id = %x,%x addr= %x,spare= %x %x %x %x data= %x\n"
-.LC109:
-	.string	"...%s enter...\n"
-.LC110:
-	.string	"superBlkID = %x vpc=%x\n"
-.LC111:
-	.string	"flashmode = %x pagenum = %x %x\n"
-.LC112:
-	.string	"id = %x,%x addr= %x,spare= %x %x %x %x data=%x %x\n"
-.LC113:
-	.string	"blk = %x vpc=%x mode = %x\n"
-.LC114:
-	.string	"mlc id = %x,%x addr= %x,spare= %x %x %x %x data=%x %x\n"
-.LC115:
-	.string	"slc id = %x,%x addr= %x,spare= %x %x %x %x data=%x %x\n"
-.LC116:
-	.string	"ftl_scan_all_ppa blk %x page %x flag: %x\n"
-.LC117:
-	.string	"ftl_scan_all_ppa blk %x page %x flag: %x ............... is bad block\n"
-.LC118:
-	.string	"addr= %x, status= %d,spare= %x %x %x %x data=%x %x\n"
-.LC119:
-	.string	"%s finished\n"
-.LC120:
-	.string	"FlashMakeFactorBbt %d\n"
-.LC121:
-	.string	"bad block:%d %d\n"
-.LC122:
-	.string	"FMFB:%d %d\n"
-.LC123:
-	.string	"E:bad block:%d\n"
-.LC124:
-	.string	"FMFB:Save %d %d\n"
-.LC125:
-	.string	"FtlBbmTblFlush id=%x,page=%x,previd=%x cnt=%d\n"
-.LC126:
-	.string	"FtlBbmTblFlush error:%x\n"
-.LC127:
-	.string	"FtlBbmTblFlush error = %x error count = %d\n"
-.LC128:
-	.string	"FtlGcFreeBadSuperBlk 0x%x\n"
-.LC129:
-	.string	"decrement_vpc_count %x = %d\n"
-.LC130:
-	.string	"decrement_vpc_count %x = %d in free list\n"
-.LC131:
-	.string	"FtlVpcTblFlush error = %x error count = %d\n"
-.LC132:
-	.string	"page map lost: %x %x\n"
-.LC133:
-	.string	"FtlMapWritePage error = %x\n"
-.LC134:
-	.string	"FtlMapWritePage error = %x error count = %d\n"
-.LC135:
-	.string	"FtlVendorPartRead refresh = %x phyAddr = %x\n"
-.LC136:
-	.string	"no ect"
-.LC137:
-	.string	"slc mode"
-.LC138:
-	.string	"BBT:"
-.LC139:
-	.string	"region_id = %x phyAddr = %x\n"
-.LC140:
-	.string	"map_ppn:"
-.LC141:
-	.string	"load_l2p_region refresh = %x phyAddr = %x\n"
-.LC142:
-	.string	"FtlCheckVpc2 %x = %x  %x\n"
-.LC143:
-	.string	"free blk vpc error %x = %x  %x\n"
-.LC144:
-	.string	"error_flag %x\n"
-.LC145:
-	.string	"Ftlscanalldata = %x\n"
-.LC146:
-	.string	"scan lpa = %x ppa= %x\n"
-.LC147:
-	.string	"lba = %x,addr= %x,spare= %x %x %x %x data=%x %x\n"
-.LC148:
-	.string	"RSB refresh addr %x\n"
-.LC149:
-	.string	"spuer block %x vpn is 0\n "
-.LC150:
-	.string	"g_recovery_ppa %x ver %x\n "
-.LC151:
-	.string	"FtlCheckVpc %x = %x  %x\n"
-.LC152:
-	.string	"FtlGcScanTempBlk Error ID %x %x!!!!!!! \n"
-.LC153:
-	.string	"FtlGcScanTempBlkError ID %x %x!!!!!!!\n"
-.LC154:
-	.string	"GC des block %x done\n"
-.LC155:
-	.string	"too many bad block  = %d %d\n"
-.LC156:
-	.string	"%d GC datablk  = %x vpc %x %x\n"
-.LC157:
-	.string	"SWL %x, FSB = %x vpc= %x,ec=%x th=%x\n"
-.LC158:
-	.string	"Ftlwrite decrement_vpc_count %x = %d\n"
-.LC159:
-	.string	"rk_ftl_de_init %x\n"
-.LC160:
-	.string	"...%s: no bad block mapping table, format device\n"
-.LC161:
-	.string	"...%s FtlSysBlkInit error ,format device!\n"
-.LC162:
-	.string	"FtlInit %x\n"
-.LC163:
-	.string	"fix power lost blk = %x vpc=%x\n"
-.LC164:
-	.string	"erase power lost blk = %x vpc=%x\n"
-.LC165:
-	.string	"FtlWrite: lpa error:%x %x\n"
-.LC166:
-	.string	"id = %x,%x addr= %x,spare= %x %x %x %x data = %x\n"
-.LC167:
-	.string	":"
-.LC168:
-	.string	"phyBlk = %x,addr= %x,spare= %x %x %x %x data=%x %x\n"
-.LC169:
-	.string	"Mblk:"
-.LC170:
-	.string	"L2P:"
-.LC171:
-	.string	"L2PC:"
-.LC172:
-	.string	"write_idblock fix data %x %x\n"
-.LC173:
-	.string	"idblk:"
-.LC174:
-	.string	"idb reverse %x %x\n"
-.LC175:
-	.string	"write_idblock totle_sec %x %x %x %x\n"
-.LC176:
-	.string	"IDBlockWriteData %x %x\n"
-.LC177:
-	.string	"IDBlockWriteData %x %x ret= %x\n"
-.LC178:
-	.string	"IdBlockReadData %x %x\n"
-.LC179:
-	.string	"IdBlockReadData %x %x ret= %x\n"
-.LC180:
-	.string	"write and check error:%d idb=%x,offset=%x,r=%x,w=%x\n"
-.LC181:
-	.string	"write"
-.LC182:
-	.string	"read"
-.LC183:
-	.string	"write_idblock error %d\n"
-.LC184:
-	.string	"wl_lba %p %x %x %x\n"
-.LC185:
-	.string	"RKNAND_GET_DRM_KEY\n"
-.LC186:
-	.string	"rk_copy_from_user error\n"
-.LC187:
-	.string	"RKNAND_STORE_DRM_KEY\n"
-.LC188:
-	.string	"RKNAND_DIASBLE_SECURE_BOOT\n"
-.LC189:
-	.string	"RKNAND_ENASBLE_SECURE_BOOT\n"
-.LC190:
-	.string	"RKNAND_GET_SN_SECTOR\n"
-.LC191:
-	.string	"RKNAND_LOADER_UNLOCK\n"
-.LC192:
-	.string	"RKNAND_LOADER_STATUS\n"
-.LC193:
-	.string	"RKNAND_LOADER_LOCK\n"
-.LC194:
-	.string	"LockKey not match %d\n"
-.LC195:
-	.string	"RKNAND_GET_VENDOR_SECTOR\n"
-.LC196:
-	.string	"RKNAND_STORE_VENDOR_SECTOR\n"
-.LC197:
-	.string	"return ret = %lx\n"
-.LC198:
-	.string	"secureBootEn check error\n"
-.LC199:
-	.string	"\0013vendor storage %x,%x,%x\n"
 	.data
 	.align	3
-.LANCHOR1 = . + 0
+	.set	.LANCHOR1,. + 0
 	.type	random_seed, %object
 	.size	random_seed, 256
 random_seed:
@@ -24711,87 +23848,38 @@ random_seed:
 	.hword	22363
 	.hword	24978
 	.hword	14584
-	.hword	12138
-	.hword	3092
-	.hword	17916
-	.hword	16863
-	.hword	14554
-	.hword	31457
-	.hword	29474
-	.hword	25311
-	.hword	24121
-	.hword	3684
-	.hword	28037
-	.hword	22865
-	.hword	22839
-	.hword	25217
-	.hword	13217
-	.hword	27186
-	.hword	14938
-	.hword	11180
-	.hword	29754
-	.hword	24180
-	.hword	15150
-	.hword	32455
-	.hword	20434
-	.hword	23848
-	.hword	29983
-	.hword	16120
-	.hword	14769
-	.hword	20041
-	.hword	29803
-	.hword	28406
-	.hword	17598
-	.hword	28087
-	.type	ToshibaA19RefValue, %object
-	.size	ToshibaA19RefValue, 45
-ToshibaA19RefValue:
-	.byte	4
-	.byte	5
-	.byte	6
-	.byte	7
-	.byte	13
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	4
-	.byte	4
-	.byte	124
-	.byte	126
-	.byte	0
-	.byte	0
-	.byte	124
-	.byte	120
-	.byte	120
-	.byte	0
-	.byte	124
-	.byte	118
-	.byte	116
-	.byte	114
-	.byte	0
-	.byte	8
-	.byte	8
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	11
-	.byte	126
-	.byte	118
-	.byte	116
-	.byte	0
-	.byte	16
-	.byte	118
-	.byte	114
-	.byte	112
-	.byte	0
-	.byte	2
-	.byte	0
-	.byte	126
-	.byte	124
-	.byte	0
-	.zero	3
+	.hword	12138
+	.hword	3092
+	.hword	17916
+	.hword	16863
+	.hword	14554
+	.hword	31457
+	.hword	29474
+	.hword	25311
+	.hword	24121
+	.hword	3684
+	.hword	28037
+	.hword	22865
+	.hword	22839
+	.hword	25217
+	.hword	13217
+	.hword	27186
+	.hword	14938
+	.hword	11180
+	.hword	29754
+	.hword	24180
+	.hword	15150
+	.hword	32455
+	.hword	20434
+	.hword	23848
+	.hword	29983
+	.hword	16120
+	.hword	14769
+	.hword	20041
+	.hword	29803
+	.hword	28406
+	.hword	17598
+	.hword	28087
 	.type	Toshiba15RefValue, %object
 	.size	Toshiba15RefValue, 95
 Toshiba15RefValue:
@@ -24891,6 +23979,55 @@ Toshiba15RefValue:
 	.byte	114
 	.byte	0
 	.zero	1
+	.type	ToshibaA19RefValue, %object
+	.size	ToshibaA19RefValue, 45
+ToshibaA19RefValue:
+	.byte	4
+	.byte	5
+	.byte	6
+	.byte	7
+	.byte	13
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	4
+	.byte	4
+	.byte	124
+	.byte	126
+	.byte	0
+	.byte	0
+	.byte	124
+	.byte	120
+	.byte	120
+	.byte	0
+	.byte	124
+	.byte	118
+	.byte	116
+	.byte	114
+	.byte	0
+	.byte	8
+	.byte	8
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	11
+	.byte	126
+	.byte	118
+	.byte	116
+	.byte	0
+	.byte	16
+	.byte	118
+	.byte	114
+	.byte	112
+	.byte	0
+	.byte	2
+	.byte	0
+	.byte	126
+	.byte	124
+	.byte	0
+	.zero	3
 	.type	ToshibaRefValue, %object
 	.size	ToshibaRefValue, 8
 ToshibaRefValue:
@@ -27389,18 +26526,17 @@ power_up_flag:
 	.word	1
 	.bss
 	.align	3
-.LANCHOR0 = . + 0
-.LANCHOR2 = . + 4352
-.LANCHOR4 = . + 8704
-.LANCHOR5 = . + 17408
-	.type	p_blk_mode_table, %object
-	.size	p_blk_mode_table, 8
-p_blk_mode_table:
-	.zero	8
+	.set	.LANCHOR0,. + 0
+	.set	.LANCHOR2,. + 4352
+	.set	.LANCHOR4,. + 8704
 	.type	gNandChipMap, %object
 	.size	gNandChipMap, 64
 gNandChipMap:
 	.zero	64
+	.type	p_blk_mode_table, %object
+	.size	p_blk_mode_table, 8
+p_blk_mode_table:
+	.zero	8
 	.type	g_slc2KBNand, %object
 	.size	g_slc2KBNand, 1
 g_slc2KBNand:
@@ -27898,15 +27034,14 @@ gSysInfo:
 	.size	g_gc_superblock, 48
 g_gc_superblock:
 	.zero	48
-	.type	g_all_blk_used_slc_mode, %object
-	.size	g_all_blk_used_slc_mode, 4
-g_all_blk_used_slc_mode:
-	.zero	4
-	.zero	4
 	.type	g_sys_ext_data, %object
 	.size	g_sys_ext_data, 512
 g_sys_ext_data:
 	.zero	512
+	.type	g_all_blk_used_slc_mode, %object
+	.size	g_all_blk_used_slc_mode, 4
+g_all_blk_used_slc_mode:
+	.zero	4
 	.type	g_gc_free_blk_threshold, %object
 	.size	g_gc_free_blk_threshold, 2
 g_gc_free_blk_threshold:
@@ -27931,7 +27066,6 @@ g_in_swl_replace:
 	.type	g_gc_num_req, %object
 	.size	g_gc_num_req, 4
 g_gc_num_req:
-	.zero	4
 	.zero	4
 	.type	gp_gc_page_buf_info, %object
 	.size	gp_gc_page_buf_info, 8
@@ -28190,6 +27324,15 @@ gNandIDataBuf:
 	.type	RK29_NANDC_REG_BASE, %object
 	.size	RK29_NANDC_REG_BASE, 8
 RK29_NANDC_REG_BASE:
+	.zero	8
+	.type	ftl_dma32_buffer_size, %object
+	.size	ftl_dma32_buffer_size, 4
+ftl_dma32_buffer_size:
+	.zero	4
+	.zero	4
+	.type	ftl_dma32_buffer, %object
+	.size	ftl_dma32_buffer, 8
+ftl_dma32_buffer:
 	.zero	8
 	.type	gFlashPageBuffer0, %object
 	.size	gFlashPageBuffer0, 8
@@ -28275,11 +27418,6 @@ gVendorBlkInfo:
 	.size	g_ect_tbl_power_up_flush, 2
 g_ect_tbl_power_up_flush:
 	.zero	2
-	.zero	6
-	.type	check_valid_page_count_table, %object
-	.size	check_valid_page_count_table, 8192
-check_valid_page_count_table:
-	.zero	8192
 	.type	g_power_lost_ecc_error_blk, %object
 	.size	g_power_lost_ecc_error_blk, 2
 g_power_lost_ecc_error_blk:
@@ -28287,10 +27425,12 @@ g_power_lost_ecc_error_blk:
 	.type	g_power_lost_recovery_flag, %object
 	.size	g_power_lost_recovery_flag, 2
 g_power_lost_recovery_flag:
+	.zero	2
 	.zero	2
 	.type	g_recovery_page_num, %object
 	.size	g_recovery_page_num, 4
 g_recovery_page_num:
+	.zero	4
 	.zero	4
 	.type	g_recovery_ppa_tbl, %object
 	.size	g_recovery_ppa_tbl, 128
@@ -28392,6 +27532,10 @@ g_idb_buffer:
 	.size	g_vendor, 8
 g_vendor:
 	.zero	8
+	.type	check_valid_page_count_table, %object
+	.size	check_valid_page_count_table, 8192
+check_valid_page_count_table:
+	.zero	8192
 	.type	g_gc_refresh_block_temp_tbl, %object
 	.size	g_gc_refresh_block_temp_tbl, 34
 g_gc_refresh_block_temp_tbl:
@@ -28421,3 +27565,404 @@ gFlashOnfiModeEn:
 	.size	gFlashSdrModeEn, 1
 gFlashSdrModeEn:
 	.zero	1
+	.section	.rodata.str1.1,"aMS",@progbits,1
+.LC0:
+	.string	"FlashEraseBlocks pageAddr error %x\n"
+.LC1:
+	.string	"phyBlk = 0x%x die = %d block_in_die = 0x%x 0x%8x\n"
+.LC2:
+	.string	"FtlFreeSysBlkQueueOut free count = %d\n"
+.LC3:
+	.string	"FtlFreeSysBlkQueueOut = %x, free count = %d, error\n"
+.LC4:
+	.string	"FtlFreeSysBlkQueueOut = %x, free count = %d\n"
+.LC5:
+	.string	"FLASH INFO:\n"
+.LC6:
+	.string	"FLASH ID: %x\n"
+.LC7:
+	.string	"Device Capacity: %d MB\n"
+.LC8:
+	.string	"FMWAIT: %x %x %x %x\n"
+.LC9:
+	.string	"FTL INFO:\n"
+.LC10:
+	.string	"g_MaxLpn = 0x%x\n"
+.LC11:
+	.string	"g_VaildLpn = 0x%x\n"
+.LC12:
+	.string	"read_page_count = 0x%x\n"
+.LC13:
+	.string	"discard_page_count = 0x%x\n"
+.LC14:
+	.string	"write_page_count = 0x%x\n"
+.LC15:
+	.string	"cache_write_count = 0x%x\n"
+.LC16:
+	.string	"l2p_write_count = 0x%x\n"
+.LC17:
+	.string	"gc_page_count = 0x%x\n"
+.LC18:
+	.string	"totle_write = %d MB\n"
+.LC19:
+	.string	"totle_read = %d MB\n"
+.LC20:
+	.string	"GSV = 0x%x\n"
+.LC21:
+	.string	"GDV = 0x%x\n"
+.LC22:
+	.string	"bad blk num = %d %d\n"
+.LC23:
+	.string	"free_superblocks = 0x%x\n"
+.LC24:
+	.string	"mlc_EC = 0x%x\n"
+.LC25:
+	.string	"slc_EC = 0x%x\n"
+.LC26:
+	.string	"avg_EC = 0x%x\n"
+.LC27:
+	.string	"sys_EC = 0x%x\n"
+.LC28:
+	.string	"max_EC = 0x%x\n"
+.LC29:
+	.string	"min_EC = 0x%x\n"
+.LC30:
+	.string	"PLT = 0x%x\n"
+.LC31:
+	.string	"POT = 0x%x\n"
+.LC32:
+	.string	"MaxSector = 0x%x\n"
+.LC33:
+	.string	"init_sys_blks_pp = 0x%x\n"
+.LC34:
+	.string	"sys_blks_pp = 0x%x\n"
+.LC35:
+	.string	"free sysblock = 0x%x\n"
+.LC36:
+	.string	"data_blks_pp = 0x%x\n"
+.LC37:
+	.string	"data_op_blks_pp = 0x%x\n"
+.LC38:
+	.string	"max_data_blks = 0x%x\n"
+.LC39:
+	.string	"Sys.id = 0x%x\n"
+.LC40:
+	.string	"Bbt.id = 0x%x\n"
+.LC41:
+	.string	"ACT.page = 0x%x\n"
+.LC42:
+	.string	"ACT.plane = 0x%x\n"
+.LC43:
+	.string	"ACT.id = 0x%x\n"
+.LC44:
+	.string	"ACT.mode = 0x%x\n"
+.LC45:
+	.string	"ACT.a_pages = 0x%x\n"
+.LC46:
+	.string	"ACT VPC = 0x%x\n"
+.LC47:
+	.string	"BUF.page = 0x%x\n"
+.LC48:
+	.string	"BUF.plane = 0x%x\n"
+.LC49:
+	.string	"BUF.id = 0x%x\n"
+.LC50:
+	.string	"BUF.mode = 0x%x\n"
+.LC51:
+	.string	"BUF.a_pages = 0x%x\n"
+.LC52:
+	.string	"BUF VPC = 0x%x\n"
+.LC53:
+	.string	"TMP.page = 0x%x\n"
+.LC54:
+	.string	"TMP.plane = 0x%x\n"
+.LC55:
+	.string	"TMP.id = 0x%x\n"
+.LC56:
+	.string	"TMP.mode = 0x%x\n"
+.LC57:
+	.string	"TMP.a_pages = 0x%x\n"
+.LC58:
+	.string	"GC.page = 0x%x\n"
+.LC59:
+	.string	"GC.plane = 0x%x\n"
+.LC60:
+	.string	"GC.id = 0x%x\n"
+.LC61:
+	.string	"GC.mode = 0x%x\n"
+.LC62:
+	.string	"GC.a_pages = 0x%x\n"
+.LC63:
+	.string	"WR_CHK = 0x%x %x %x %x\n"
+.LC64:
+	.string	"Read Err = 0x%x\n"
+.LC65:
+	.string	"Prog Err = 0x%x\n"
+.LC66:
+	.string	"gc_free_blk_th= 0x%x\n"
+.LC67:
+	.string	"gc_merge_free_blk_th= 0x%x\n"
+.LC68:
+	.string	"gc_skip_write_count= 0x%x\n"
+.LC69:
+	.string	"gc_blk_index= 0x%x\n"
+.LC70:
+	.string	"free min EC= 0x%x\n"
+.LC71:
+	.string	"free max EC= 0x%x\n"
+.LC72:
+	.string	"GC__SB VPC = 0x%x\n"
+.LC73:
+	.string	"%d. [0x%x]=0x%x 0x%x  0x%x\n"
+.LC74:
+	.string	"free %d. [0x%x] 0x%x  0x%x\n"
+.LC75:
+	.string	"FTL version: 5.0.63 20210616"
+.LC76:
+	.string	"%s\n"
+.LC77:
+	.string	"swblk %x ,avg = %x max= %x vpc= %x,ec=%x ,max ec=%x\n"
+.LC78:
+	.string	"FtlGcRefreshBlock  0x%x\n"
+.LC79:
+	.string	"FtlGcMarkBadPhyBlk %d 0x%x\n"
+.LC80:
+	.string	"%s error allocating memory. return -1\n"
+.LC81:
+	.string	"%s %p:0x%x:"
+.LC82:
+	.string	"%x "
+.LC83:
+	.string	""
+.LC84:
+	.string	"otp error! %d"
+.LC85:
+	.string	"rr"
+.LC86:
+	.string	"%d statReg->V6.mtrans_cnt=%d flReg.V6.page_num=%d\n"
+.LC87:
+	.string	"nandc:"
+.LC88:
+	.string	"%d flReg.d32=%x %x\n"
+.LC89:
+	.string	"sdr read ok %x ecc=%d\n"
+.LC90:
+	.string	"sync para %d\n"
+.LC91:
+	.string	"TOG mode Read error %x %x\n"
+.LC92:
+	.string	"read retry status %x %x %x\n"
+.LC93:
+	.string	"micron RR %d row=%x,count %d,status=%d\n"
+.LC94:
+	.string	"samsung RR %d row=%x,count %d,status=%d\n"
+.LC95:
+	.string	"ECC:%d\n"
+.LC96:
+	.string	"No.%d FLASH ID:%x %x %x %x %x %x\n"
+.LC97:
+	.string	"FlashLoadPhyInfo fail %x!!\n"
+.LC98:
+	.string	"Read pageadd=%x  ecc=%x err=%x\n"
+.LC99:
+	.string	"data:"
+.LC100:
+	.string	"spare:"
+.LC101:
+	.string	"ReadRetry pageadd=%x ecc=%x err=%x\n"
+.LC102:
+	.string	"FLFB:%d %d\n"
+.LC103:
+	.string	"prog error: = %x\n"
+.LC104:
+	.string	"prog read error: = %x\n"
+.LC105:
+	.string	"prog read REFRESH: = %x\n"
+.LC106:
+	.string	"prog read s error: = %x %x %x\n"
+.LC107:
+	.string	"prog read d error: = %x %x %x\n"
+.LC108:
+	.string	"id = %x,%x addr= %x,spare= %x %x %x %x data= %x\n"
+.LC109:
+	.string	"...%s enter...\n"
+.LC110:
+	.string	"superBlkID = %x vpc=%x\n"
+.LC111:
+	.string	"flashmode = %x pagenum = %x %x\n"
+.LC112:
+	.string	"id = %x,%x addr= %x,spare= %x %x %x %x data=%x %x\n"
+.LC113:
+	.string	"blk = %x vpc=%x mode = %x\n"
+.LC114:
+	.string	"mlc id = %x,%x addr= %x,spare= %x %x %x %x data=%x %x\n"
+.LC115:
+	.string	"slc id = %x,%x addr= %x,spare= %x %x %x %x data=%x %x\n"
+.LC116:
+	.string	"ftl_scan_all_ppa blk %x page %x flag: %x\n"
+.LC117:
+	.string	"ftl_scan_all_ppa blk %x page %x flag: %x ............... is bad block\n"
+.LC118:
+	.string	"addr= %x, status= %d,spare= %x %x %x %x data=%x %x\n"
+.LC119:
+	.string	"%s finished\n"
+.LC120:
+	.string	"FlashMakeFactorBbt %d\n"
+.LC121:
+	.string	"bad block:%d %d\n"
+.LC122:
+	.string	"FMFB:%d %d\n"
+.LC123:
+	.string	"E:bad block:%d\n"
+.LC124:
+	.string	"FMFB:Save %d %d\n"
+.LC125:
+	.string	"FtlBbmTblFlush id=%x,page=%x,previd=%x cnt=%d\n"
+.LC126:
+	.string	"FtlBbmTblFlush error:%x\n"
+.LC127:
+	.string	"FtlBbmTblFlush error = %x error count = %d\n"
+.LC128:
+	.string	"FtlGcFreeBadSuperBlk 0x%x\n"
+.LC129:
+	.string	"decrement_vpc_count %x = %d\n"
+.LC130:
+	.string	"decrement_vpc_count %x = %d in free list\n"
+.LC131:
+	.string	"FtlVpcTblFlush error = %x error count = %d\n"
+.LC132:
+	.string	"page map lost: %x %x\n"
+.LC133:
+	.string	"FtlMapWritePage error = %x\n"
+.LC134:
+	.string	"FtlMapWritePage error = %x error count = %d\n"
+.LC135:
+	.string	"FtlVendorPartRead refresh = %x phyAddr = %x\n"
+.LC136:
+	.string	"no ect"
+.LC137:
+	.string	"slc mode"
+.LC138:
+	.string	"BBT:"
+.LC139:
+	.string	"region_id = %x phyAddr = %x\n"
+.LC140:
+	.string	"map_ppn:"
+.LC141:
+	.string	"load_l2p_region refresh = %x phyAddr = %x\n"
+.LC142:
+	.string	"FtlCheckVpc2 %x = %x  %x\n"
+.LC143:
+	.string	"free blk vpc error %x = %x  %x\n"
+.LC144:
+	.string	"error_flag %x\n"
+.LC145:
+	.string	"Ftlscanalldata = %x\n"
+.LC146:
+	.string	"scan lpa = %x ppa= %x\n"
+.LC147:
+	.string	"lba = %x,addr= %x,spare= %x %x %x %x data=%x %x\n"
+.LC148:
+	.string	"RSB refresh addr %x\n"
+.LC149:
+	.string	"spuer block %x vpn is 0\n "
+.LC150:
+	.string	"g_recovery_ppa %x ver %x\n "
+.LC151:
+	.string	"FtlCheckVpc %x = %x  %x\n"
+.LC152:
+	.string	"FtlGcScanTempBlk Error ID %x %x!!!!!!! \n"
+.LC153:
+	.string	"FtlGcScanTempBlkError ID %x %x!!!!!!!\n"
+.LC154:
+	.string	"GC des block %x done\n"
+.LC155:
+	.string	"too many bad block  = %d %d\n"
+.LC156:
+	.string	"%d GC datablk  = %x vpc %x %x\n"
+.LC157:
+	.string	"SWL %x, FSB = %x vpc= %x,ec=%x th=%x\n"
+.LC158:
+	.string	"Ftlwrite decrement_vpc_count %x = %d\n"
+.LC159:
+	.string	"rk_ftl_de_init %x\n"
+.LC160:
+	.string	"...%s: no bad block mapping table, format device\n"
+.LC161:
+	.string	"...%s FtlSysBlkInit error ,format device!\n"
+.LC162:
+	.string	"FtlInit %x\n"
+.LC163:
+	.string	"fix power lost blk = %x vpc=%x\n"
+.LC164:
+	.string	"erase power lost blk = %x vpc=%x\n"
+.LC165:
+	.string	"FtlWrite: lpa error:%x %x\n"
+.LC166:
+	.string	"id = %x,%x addr= %x,spare= %x %x %x %x data = %x\n"
+.LC167:
+	.string	":"
+.LC168:
+	.string	"phyBlk = %x,addr= %x,spare= %x %x %x %x data=%x %x\n"
+.LC169:
+	.string	"Mblk:"
+.LC170:
+	.string	"L2P:"
+.LC171:
+	.string	"L2PC:"
+.LC172:
+	.string	"write_idblock fix data %x %x\n"
+.LC173:
+	.string	"idblk:"
+.LC174:
+	.string	"idb reverse %x %x\n"
+.LC175:
+	.string	"write_idblock totle_sec %x %x %x %x\n"
+.LC176:
+	.string	"IDBlockWriteData %x %x\n"
+.LC177:
+	.string	"IDBlockWriteData %x %x ret= %x\n"
+.LC178:
+	.string	"IdBlockReadData %x %x\n"
+.LC179:
+	.string	"IdBlockReadData %x %x ret= %x\n"
+.LC180:
+	.string	"write and check error:%d idb=%x,offset=%x,r=%x,w=%x\n"
+.LC181:
+	.string	"write"
+.LC182:
+	.string	"read"
+.LC183:
+	.string	"write_idblock error %d\n"
+.LC184:
+	.string	"wl_lba %p %x %x %x\n"
+.LC185:
+	.string	"RKNAND_GET_DRM_KEY\n"
+.LC186:
+	.string	"rk_copy_from_user error\n"
+.LC187:
+	.string	"RKNAND_STORE_DRM_KEY\n"
+.LC188:
+	.string	"RKNAND_DIASBLE_SECURE_BOOT\n"
+.LC189:
+	.string	"RKNAND_ENASBLE_SECURE_BOOT\n"
+.LC190:
+	.string	"RKNAND_GET_SN_SECTOR\n"
+.LC191:
+	.string	"RKNAND_LOADER_UNLOCK\n"
+.LC192:
+	.string	"RKNAND_LOADER_STATUS\n"
+.LC193:
+	.string	"RKNAND_LOADER_LOCK\n"
+.LC194:
+	.string	"LockKey not match %d\n"
+.LC195:
+	.string	"RKNAND_GET_VENDOR_SECTOR\n"
+.LC196:
+	.string	"RKNAND_STORE_VENDOR_SECTOR\n"
+.LC197:
+	.string	"return ret = %lx\n"
+.LC198:
+	.string	"secureBootEn check error\n"
+.LC199:
+	.string	"\0013vendor storage %x,%x,%x\n"
diff --git a/drivers/rk_nand/rk_ftlv5_arm64.S b/drivers/rk_nand/rk_ftlv5_arm64.S
index 2a1c30de9cc4..d412680030a9 100644
--- a/drivers/rk_nand/rk_ftlv5_arm64.S
+++ b/drivers/rk_nand/rk_ftlv5_arm64.S
@@ -5,134 +5,132 @@
  * 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.
- * date: 2020-09-23
+ * date: 2021-06-16
  * function: rk ftl v5 for rockchip soc base on arm v8 to support MLC NAND.
  */
-	.cpu generic+fp+simd
 	.file	"rk_ftlv5_arm64.S"
 	.text
 	.align	2
+	.type	flash_read_ecc, %function
+flash_read_ecc:
+	stp	x29, x30, [sp, -32]!
+	ubfiz	x0, x0, 4, 8
+	adrp	x1, .LANCHOR0
+	add	x1, x1, :lo12:.LANCHOR0
+	add	x2, x1, x0
+	add	x29, sp, 0
+	str	x19, [sp, 16]
+	ldr	x0, [x1, x0]
+	ldrb	w19, [x2, 8]
+	add	x19, x0, x19, lsl 8
+	mov	w0, 122
+	str	w0, [x19, 2056]
+	mov	x0, 400
+	bl	__const_udelay
+	ldr	w1, [x19, 2048]
+	ldr	w0, [x19, 2048]
+	and	w1, w1, 15
+	and	w0, w0, 15
+	cmp	w1, w0
+	csel	w1, w1, w0, cs
+	ldr	w0, [x19, 2048]
+	ldr	w2, [x19, 2048]
+	and	w0, w0, 15
+	ldr	x19, [sp, 16]
+	and	w2, w2, 15
+	cmp	w0, w2
+	csel	w0, w0, w2, cs
+	cmp	w0, w1
+	csel	w0, w0, w1, cs
+	ldp	x29, x30, [sp], 32
+	ret
+	.size	flash_read_ecc, .-flash_read_ecc
+	.align	2
 	.type	FlashReadFacBbtData.part.6, %function
 FlashReadFacBbtData.part.6:
 	stp	x29, x30, [sp, -32]!
-	mov	w3, 0
-	adrp	x5, .LANCHOR0
+	adrp	x3, .LANCHOR0
 	add	x29, sp, 0
-	str	x19, [sp,16]
-	mov	w7, 1
+	str	x19, [sp, 16]
 	mov	x19, x0
 	cbnz	w1, .L4
-.L6:
-	add	x0, x5, :lo12:.LANCHOR0
-	ldr	w0, [x0,8]
-	cmp	w3, w0
-	bcs	.L4
-	ubfx	x4, x3, 5, 11
-	ldr	x0, [x5,#:lo12:.LANCHOR0]
-	lsl	x4, x4, 2
-	lsl	w6, w7, w3
-	add	w3, w3, 1
-	ldr	w1, [x0,x4]
-	uxth	w3, w3
-	orr	w6, w1, w6
-	str	w6, [x0,x4]
-	b	.L6
+	add	x5, x3, :lo12:.LANCHOR0
+	mov	w0, 0
+	mov	w7, 1
+.L5:
+	ldr	w1, [x5, 72]
+	cmp	w0, w1
+	bcc	.L6
 .L4:
-	ldr	x1, [x5,#:lo12:.LANCHOR0]
+	add	x3, x3, :lo12:.LANCHOR0
 	mov	x0, x19
+	ldr	x1, [x3, 64]
 	bl	ftl_memcpy
-	mov	w2, 4
-	adrp	x0, .LC0
+	mov	w3, 4
 	mov	x1, x19
+	mov	w2, w3
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
-	mov	w3, w2
 	bl	rknand_print_hex
-	ldr	x19, [sp,16]
 	mov	w0, 0
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L6:
+	ubfx	x1, x0, 5, 11
+	ldr	x6, [x5, 64]
+	lsl	x1, x1, 2
+	lsl	w8, w7, w0
+	add	w0, w0, 1
+	and	w0, w0, 65535
+	ldr	w4, [x6, x1]
+	orr	w4, w4, w8
+	str	w4, [x6, x1]
+	b	.L5
 	.size	FlashReadFacBbtData.part.6, .-FlashReadFacBbtData.part.6
 	.align	2
 	.type	ftl_set_blk_mode.part.17, %function
 ftl_set_blk_mode.part.17:
-	adrp	x1, .LANCHOR0+16
-	uxth	w0, w0
-	ubfx	x2, x0, 5, 11
-	lsl	x2, x2, 2
-	ldr	x3, [x1,#:lo12:.LANCHOR0+16]
-	mov	w1, 1
-	lsl	w0, w1, w0
-	ldr	w1, [x3,x2]
-	orr	w0, w1, w0
-	str	w0, [x3,x2]
+	and	w0, w0, 65535
+	adrp	x2, .LANCHOR0+80
+	ubfx	x1, x0, 5, 11
+	ldr	x3, [x2, #:lo12:.LANCHOR0+80]
+	lsl	x1, x1, 2
+	mov	w2, 1
+	lsl	w2, w2, w0
+	ldr	w0, [x3, x1]
+	orr	w0, w0, w2
+	str	w0, [x3, x1]
 	ret
 	.size	ftl_set_blk_mode.part.17, .-ftl_set_blk_mode.part.17
 	.align	2
-	.type	flash_read_ecc, %function
-flash_read_ecc:
-	adrp	x2, .LANCHOR0
-	ubfiz	x0, x0, 4, 8
-	stp	x29, x30, [sp, -32]!
-	add	x2, x2, :lo12:.LANCHOR0
-	add	x2, x2, 24
-	add	x29, sp, 0
-	add	x1, x2, x0
-	str	x19, [sp,16]
-	ldrb	w1, [x1,8]
-	ldr	x19, [x2,x0]
-	mov	w0, 122
-	add	x19, x19, x1, lsl 8
-	str	w0, [x19,2056]
-	mov	x0, 400
-	bl	__const_udelay
-	ldr	w1, [x19,2048]
-	ldr	w0, [x19,2048]
-	and	w1, w1, 15
-	and	w0, w0, 15
-	cmp	w0, w1
-	csel	w2, w0, w1, cs
-	ldr	w1, [x19,2048]
-	ldr	w0, [x19,2048]
-	and	w1, w1, 15
-	ldr	x19, [sp,16]
-	cmp	w2, w1
-	and	w0, w0, 15
-	csel	w1, w2, w1, cs
-	cmp	w1, w0
-	csel	w0, w1, w0, cs
-	ldp	x29, x30, [sp], 32
-	ret
-	.size	flash_read_ecc, .-flash_read_ecc
-	.align	2
 	.global	FlashMemCmp8
 	.type	FlashMemCmp8, %function
 FlashMemCmp8:
-	mov	x5, x0
-	adrp	x0, .LANCHOR0+88
-	ldrb	w0, [x0,#:lo12:.LANCHOR0+88]
-	cbz	w0, .L16
-	ldrb	w4, [x5,1]
-	mov	w0, 0
-	ldrb	w3, [x1,1]
+	adrp	x3, .LANCHOR0+88
+	ldrb	w3, [x3, #:lo12:.LANCHOR0+88]
+	cbz	w3, .L15
+	ldrb	w4, [x0, 1]
+	ldrb	w3, [x1, 1]
 	cmp	w4, w3
-	beq	.L13
-.L16:
+	beq	.L16
+.L15:
 	mov	x3, 0
-.L14:
-	cmp	w3, w2
+.L13:
 	mov	w4, w3
-	bcs	.L19
-	ldrb	w0, [x5,x3]
+	cmp	w3, w2
+	bcc	.L14
+.L16:
+	mov	w0, 0
+	ret
+.L14:
+	ldrb	w5, [x0, x3]
 	add	x3, x3, 1
 	add	x6, x1, x3
-	ldrb	w6, [x6,-1]
-	cmp	w6, w0
-	beq	.L14
+	ldrb	w6, [x6, -1]
+	cmp	w6, w5
+	beq	.L13
 	add	w0, w4, 1
-	b	.L13
-.L19:
-	mov	w0, 0
-.L13:
 	ret
 	.size	FlashMemCmp8, .-FlashMemCmp8
 	.align	2
@@ -140,138 +138,139 @@ FlashMemCmp8:
 	.type	FlashRsvdBlkChk, %function
 FlashRsvdBlkChk:
 	adrp	x2, .LANCHOR0
-	uxtb	w0, w0
 	add	x2, x2, :lo12:.LANCHOR0
-	ldrb	w3, [x2,89]
-	ldr	w2, [x2,92]
+	and	w0, w0, 255
+	ldrb	w3, [x2, 89]
+	ldr	w2, [x2, 92]
 	mul	w2, w3, w2
-	cmp	w1, w2
-	cset	w1, cc
-	cmp	w0, wzr
-	cset	w0, eq
-	and	w0, w1, w0
-	eor	w0, w0, 1
+	cmp	w2, w1
+	bls	.L20
+	cmp	w0, 0
+	cset	w0, ne
+	ret
+.L20:
+	mov	w0, 1
 	ret
 	.size	FlashRsvdBlkChk, .-FlashRsvdBlkChk
 	.align	2
 	.global	FlashGetRandomizer
 	.type	FlashGetRandomizer, %function
 FlashGetRandomizer:
-	stp	x29, x30, [sp, -32]!
+	and	x3, x1, 127
 	adrp	x2, .LANCHOR1
-	and	w3, w1, 127
 	add	x2, x2, :lo12:.LANCHOR1
-	add	x29, sp, 0
-	uxtb	w0, w0
-	str	x19, [sp,16]
-	ldrh	w19, [x2,w3,uxtw 1]
+	ldrh	w4, [x2, x3, lsl 1]
 	adrp	x2, .LANCHOR0+96
-	ldrb	w2, [x2,#:lo12:.LANCHOR0+96]
-	cbz	w2, .L22
+	ldrb	w2, [x2, #:lo12:.LANCHOR0+96]
+	cbz	w2, .L29
+	stp	x29, x30, [sp, -16]!
+	and	w0, w0, 255
+	add	x29, sp, 0
 	bl	FlashRsvdBlkChk
-	cmp	w0, wzr
-	orr	w1, w19, -1073741824
-	csel	w19, w1, w19, ne
-.L22:
-	mov	w0, w19
-	ldr	x19, [sp,16]
-	ldp	x29, x30, [sp], 32
+	cmp	w0, 0
+	orr	w1, w4, -1073741824
+	csel	w4, w1, w4, ne
+	mov	w0, w4
+	ldp	x29, x30, [sp], 16
+	ret
+.L29:
+	mov	w0, w4
 	ret
 	.size	FlashGetRandomizer, .-FlashGetRandomizer
 	.align	2
 	.global	FlashSetRandomizer
 	.type	FlashSetRandomizer, %function
 FlashSetRandomizer:
-	stp	x29, x30, [sp, -48]!
-	and	w2, w1, 127
-	add	x29, sp, 0
-	str	x21, [sp,32]
-	uxtb	w21, w0
+	and	x2, x1, 127
+	and	w6, w0, 255
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	stp	x19, x20, [sp,16]
-	ldrh	w20, [x0,w2,uxtw 1]
-	adrp	x2, .LANCHOR0
-	add	x0, x2, :lo12:.LANCHOR0
-	mov	x19, x2
-	ldrb	w0, [x0,96]
-	cbz	w0, .L29
-	mov	w0, w21
+	ldrh	w5, [x0, x2, lsl 1]
+	adrp	x0, .LANCHOR0
+	add	x2, x0, :lo12:.LANCHOR0
+	mov	x4, x0
+	ldrb	w2, [x2, 96]
+	cbz	w2, .L40
+	stp	x29, x30, [sp, -16]!
+	mov	w0, w6
+	add	x29, sp, 0
 	bl	FlashRsvdBlkChk
-	cmp	w0, wzr
-	orr	w1, w20, -1073741824
-	csel	w20, w1, w20, ne
-.L29:
-	add	x2, x19, :lo12:.LANCHOR0
-	add	x2, x2, w21, sxtw 4
-	ldr	x0, [x2,24]
-	str	w20, [x0,336]
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
-	ldp	x29, x30, [sp], 48
+	cmp	w0, 0
+	sbfiz	x6, x6, 4, 32
+	add	x0, x4, :lo12:.LANCHOR0
+	orr	w1, w5, -1073741824
+	csel	w5, w1, w5, ne
+	ldr	x0, [x0, x6]
+	str	w5, [x0, 336]
+	ldp	x29, x30, [sp], 16
+	ret
+.L40:
+	add	x0, x0, :lo12:.LANCHOR0
+	sbfiz	x6, x6, 4, 32
+	ldr	x0, [x0, x6]
+	str	w5, [x0, 336]
 	ret
 	.size	FlashSetRandomizer, .-FlashSetRandomizer
 	.align	2
 	.global	FlashBlockAlignInit
 	.type	FlashBlockAlignInit, %function
 FlashBlockAlignInit:
-	uxth	w0, w0
+	and	w0, w0, 65535
 	adrp	x1, .LANCHOR0
 	cmp	w0, 512
 	add	x1, x1, :lo12:.LANCHOR0
-	bls	.L36
+	bls	.L44
 	mov	w0, 1024
-	b	.L40
-.L36:
+.L48:
+	str	w0, [x1, 92]
+	ret
+.L44:
 	cmp	w0, 256
-	bls	.L38
+	bls	.L46
 	mov	w0, 512
-	b	.L40
-.L38:
+	b	.L48
+.L46:
 	cmp	w0, 128
-	bls	.L40
+	bls	.L48
 	mov	w0, 256
-.L40:
-	str	w0, [x1,92]
-	ret
+	b	.L48
 	.size	FlashBlockAlignInit, .-FlashBlockAlignInit
 	.align	2
 	.global	FlashReadCmd
 	.type	FlashReadCmd, %function
 FlashReadCmd:
-	adrp	x4, .LANCHOR0
-	uxtb	w0, w0
-	add	x4, x4, :lo12:.LANCHOR0
+	and	w0, w0, 255
+	adrp	x3, .LANCHOR0
 	sbfiz	x2, x0, 4, 32
+	add	x3, x3, :lo12:.LANCHOR0
 	stp	x29, x30, [sp, -16]!
-	add	x3, x4, 24
+	add	x4, x3, x2
 	add	x29, sp, 0
-	ldr	x4, [x4,104]
-	add	x5, x3, x2
-	ldr	x2, [x3,x2]
-	ldrb	w4, [x4,7]
-	ldrb	w3, [x5,8]
-	cmp	w4, 1
-	bne	.L42
-	sxtw	x4, w3
+	ldr	x2, [x3, x2]
+	ldr	x3, [x3, 104]
+	ldrb	w4, [x4, 8]
+	ldrb	w3, [x3, 7]
+	cmp	w3, 1
+	bne	.L50
+	sxtw	x3, w4
 	mov	w5, 38
-	add	x4, x4, 8
-	add	x4, x2, x4, lsl 8
-	str	w5, [x4,8]
-.L42:
-	ubfiz	x3, x3, 8, 8
-	add	x2, x2, x3
+	add	x3, x3, 8
+	add	x3, x2, x3, lsl 8
+	str	w5, [x3, 8]
+.L50:
+	ubfiz	x4, x4, 8, 8
 	and	w3, w1, 255
-	str	wzr, [x2,2056]
-	str	wzr, [x2,2052]
-	str	wzr, [x2,2052]
-	str	w3, [x2,2052]
+	add	x2, x2, x4
+	str	wzr, [x2, 2056]
+	str	wzr, [x2, 2052]
+	str	wzr, [x2, 2052]
+	str	w3, [x2, 2052]
 	lsr	w3, w1, 8
-	str	w3, [x2,2052]
+	str	w3, [x2, 2052]
 	lsr	w3, w1, 16
-	str	w3, [x2,2052]
+	str	w3, [x2, 2052]
 	mov	w3, 48
-	str	w3, [x2,2056]
+	str	w3, [x2, 2056]
 	bl	FlashSetRandomizer
 	ldp	x29, x30, [sp], 16
 	ret
@@ -280,74 +279,72 @@ FlashReadCmd:
 	.global	FlashReadDpDataOutCmd
 	.type	FlashReadDpDataOutCmd, %function
 FlashReadDpDataOutCmd:
+	and	w0, w0, 255
 	adrp	x3, .LANCHOR0
-	uxtb	w0, w0
-	add	x3, x3, :lo12:.LANCHOR0
 	sbfiz	x2, x0, 4, 32
-	add	x4, x3, 24
+	add	x3, x3, :lo12:.LANCHOR0
 	stp	x29, x30, [sp, -16]!
-	add	x5, x4, x2
+	add	x4, x3, x2
+	and	w5, w1, 255
 	add	x29, sp, 0
-	ldr	x6, [x4,x2]
-	lsr	w4, w1, 8
-	ldrb	w2, [x3,128]
+	ldr	x6, [x3, x2]
+	ldrb	w2, [x3, 128]
 	lsr	w3, w1, 16
 	cmp	w2, 1
-	ldrb	w2, [x5,8]
-	and	w5, w1, 255
+	ldrb	w2, [x4, 8]
+	lsr	w4, w1, 8
 	add	x2, x6, x2, lsl 8
-	bne	.L44
+	bne	.L53
 	mov	w6, 6
-	str	w6, [x2,2056]
-	str	wzr, [x2,2052]
-	str	wzr, [x2,2052]
-	str	w5, [x2,2052]
-	str	w4, [x2,2052]
-	str	w3, [x2,2052]
-	b	.L46
-.L44:
-	str	wzr, [x2,2056]
-	str	wzr, [x2,2052]
-	str	wzr, [x2,2052]
-	str	w5, [x2,2052]
-	str	w4, [x2,2052]
-	str	w3, [x2,2052]
-	mov	w3, 5
-	str	w3, [x2,2056]
-	str	wzr, [x2,2052]
-	str	wzr, [x2,2052]
-.L46:
+	str	w6, [x2, 2056]
+	str	wzr, [x2, 2052]
+	str	wzr, [x2, 2052]
+	str	w5, [x2, 2052]
+	str	w4, [x2, 2052]
+	str	w3, [x2, 2052]
+.L56:
 	mov	w3, 224
-	str	w3, [x2,2056]
+	str	w3, [x2, 2056]
 	bl	FlashSetRandomizer
 	ldp	x29, x30, [sp], 16
 	ret
+.L53:
+	str	wzr, [x2, 2056]
+	str	wzr, [x2, 2052]
+	str	wzr, [x2, 2052]
+	str	w5, [x2, 2052]
+	str	w4, [x2, 2052]
+	str	w3, [x2, 2052]
+	mov	w3, 5
+	str	w3, [x2, 2056]
+	str	wzr, [x2, 2052]
+	str	wzr, [x2, 2052]
+	b	.L56
 	.size	FlashReadDpDataOutCmd, .-FlashReadDpDataOutCmd
 	.align	2
 	.global	FlashProgFirstCmd
 	.type	FlashProgFirstCmd, %function
 FlashProgFirstCmd:
-	adrp	x3, .LANCHOR0
-	uxtb	w0, w0
-	add	x3, x3, :lo12:.LANCHOR0
+	and	w0, w0, 255
+	adrp	x4, .LANCHOR0
 	sbfiz	x5, x0, 4, 32
-	add	x3, x3, 24
-	lsr	w4, w1, 16
-	add	x2, x3, x5
+	add	x4, x4, :lo12:.LANCHOR0
+	add	x2, x4, x5
 	stp	x29, x30, [sp, -16]!
+	lsr	w3, w1, 16
 	add	x29, sp, 0
-	ldrb	w2, [x2,8]
-	ldr	x3, [x3,x5]
-	add	x2, x3, x2, lsl 8
-	mov	w3, 128
-	str	w3, [x2,2056]
-	and	w3, w1, 255
-	str	wzr, [x2,2052]
-	str	wzr, [x2,2052]
-	str	w3, [x2,2052]
-	lsr	w3, w1, 8
-	str	w3, [x2,2052]
-	str	w4, [x2,2052]
+	ldr	x4, [x4, x5]
+	ldrb	w2, [x2, 8]
+	add	x2, x4, x2, lsl 8
+	mov	w4, 128
+	str	w4, [x2, 2056]
+	and	w4, w1, 255
+	str	wzr, [x2, 2052]
+	str	wzr, [x2, 2052]
+	str	w4, [x2, 2052]
+	lsr	w4, w1, 8
+	str	w4, [x2, 2052]
+	str	w3, [x2, 2052]
 	bl	FlashSetRandomizer
 	ldp	x29, x30, [sp], 16
 	ret
@@ -356,64 +353,62 @@ FlashProgFirstCmd:
 	.global	FlashEraseCmd
 	.type	FlashEraseCmd, %function
 FlashEraseCmd:
-	adrp	x3, .LANCHOR0
 	ubfiz	x0, x0, 4, 8
+	adrp	x3, .LANCHOR0
 	add	x3, x3, :lo12:.LANCHOR0
-	add	x4, x3, 24
-	add	x5, x4, x0
-	ldr	x4, [x4,x0]
-	ldrb	w0, [x5,8]
-	cbz	w2, .L49
+	add	x5, x3, x0
+	ldr	x4, [x3, x0]
+	ldrb	w0, [x5, 8]
+	cbz	w2, .L60
 	add	x2, x4, x0, lsl 8
 	mov	w5, 96
-	str	w5, [x2,2056]
+	str	w5, [x2, 2056]
 	and	w5, w1, 255
-	str	w5, [x2,2052]
+	str	w5, [x2, 2052]
 	lsr	w5, w1, 8
-	str	w5, [x2,2052]
+	str	w5, [x2, 2052]
 	lsr	w5, w1, 16
-	str	w5, [x2,2052]
-	ldr	w2, [x3,92]
+	str	w5, [x2, 2052]
+	ldr	w2, [x3, 92]
 	add	w1, w1, w2
-.L49:
+.L60:
 	add	x0, x4, x0, lsl 8
 	mov	w2, 96
-	str	w2, [x0,2056]
+	str	w2, [x0, 2056]
 	and	w2, w1, 255
-	str	w2, [x0,2052]
+	str	w2, [x0, 2052]
 	lsr	w2, w1, 8
-	str	w2, [x0,2052]
+	str	w2, [x0, 2052]
 	lsr	w1, w1, 16
-	str	w1, [x0,2052]
+	str	w1, [x0, 2052]
 	mov	w1, 208
-	str	w1, [x0,2056]
+	str	w1, [x0, 2056]
 	ret
 	.size	FlashEraseCmd, .-FlashEraseCmd
 	.align	2
 	.global	FlashProgDpSecondCmd
 	.type	FlashProgDpSecondCmd, %function
 FlashProgDpSecondCmd:
-	adrp	x2, .LANCHOR0
-	uxtb	w0, w0
-	add	x2, x2, :lo12:.LANCHOR0
-	sbfiz	x4, x0, 4, 32
-	add	x5, x2, 24
-	lsr	w3, w1, 16
-	add	x7, x5, x4
+	and	w0, w0, 255
+	adrp	x4, .LANCHOR0
+	sbfiz	x5, x0, 4, 32
+	add	x4, x4, :lo12:.LANCHOR0
+	add	x2, x4, x5
 	stp	x29, x30, [sp, -16]!
+	lsr	w3, w1, 16
 	add	x29, sp, 0
-	ldrb	w6, [x2,123]
-	ldrb	w2, [x7,8]
-	ldr	x4, [x5,x4]
+	ldrb	w6, [x4, 123]
+	ldrb	w2, [x2, 8]
+	ldr	x4, [x4, x5]
 	add	x2, x4, x2, lsl 8
 	and	w4, w1, 255
-	str	w6, [x2,2056]
-	str	wzr, [x2,2052]
-	str	wzr, [x2,2052]
-	str	w4, [x2,2052]
+	str	w6, [x2, 2056]
+	str	wzr, [x2, 2052]
+	str	wzr, [x2, 2052]
+	str	w4, [x2, 2052]
 	lsr	w4, w1, 8
-	str	w4, [x2,2052]
-	str	w3, [x2,2052]
+	str	w4, [x2, 2052]
+	str	w3, [x2, 2052]
 	bl	FlashSetRandomizer
 	ldp	x29, x30, [sp], 16
 	ret
@@ -422,24 +417,23 @@ FlashProgDpSecondCmd:
 	.global	FlashProgSecondCmd
 	.type	FlashProgSecondCmd, %function
 FlashProgSecondCmd:
-	adrp	x1, .LANCHOR0
-	ubfiz	x0, x0, 4, 8
 	stp	x29, x30, [sp, -32]!
+	ubfiz	x0, x0, 4, 8
+	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
-	add	x1, x1, 24
 	add	x29, sp, 0
 	add	x2, x1, x0
-	stp	x19, x20, [sp,16]
-	ldrb	w19, [x2,8]
-	ldr	x20, [x1,x0]
+	stp	x19, x20, [sp, 16]
+	ldr	x20, [x1, x0]
 	mov	x0, 36284
-	add	x19, x19, 8
+	ldrb	w19, [x2, 8]
 	movk	x0, 0x6, lsl 16
-	add	x19, x20, x19, lsl 8
 	bl	__const_udelay
+	add	x19, x19, 8
 	mov	w0, 16
-	str	w0, [x19,8]
-	ldp	x19, x20, [sp,16]
+	add	x19, x20, x19, lsl 8
+	str	w0, [x19, 8]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	FlashProgSecondCmd, .-FlashProgSecondCmd
@@ -447,40 +441,38 @@ FlashProgSecondCmd:
 	.global	FlashProgDpFirstCmd
 	.type	FlashProgDpFirstCmd, %function
 FlashProgDpFirstCmd:
-	adrp	x1, .LANCHOR0
 	ubfiz	x0, x0, 4, 8
+	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
-	add	x2, x1, 24
-	add	x3, x2, x0
-	ldrb	w1, [x1,122]
-	ldr	x2, [x2,x0]
-	ldrb	w0, [x3,8]
+	add	x3, x1, x0
+	ldr	x2, [x1, x0]
+	ldrb	w0, [x3, 8]
+	ldrb	w1, [x1, 122]
 	add	x0, x0, 8
 	add	x0, x2, x0, lsl 8
-	str	w1, [x0,8]
+	str	w1, [x0, 8]
 	ret
 	.size	FlashProgDpFirstCmd, .-FlashProgDpFirstCmd
 	.align	2
 	.global	FlashReadStatus
 	.type	FlashReadStatus, %function
 FlashReadStatus:
-	adrp	x1, .LANCHOR0
-	ubfiz	x0, x0, 4, 8
 	stp	x29, x30, [sp, -32]!
+	ubfiz	x0, x0, 4, 8
+	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
-	add	x1, x1, 24
 	add	x29, sp, 0
 	add	x2, x1, x0
-	str	x19, [sp,16]
-	ldrb	w2, [x2,8]
-	ldr	x19, [x1,x0]
+	str	x19, [sp, 16]
+	ldr	x0, [x1, x0]
+	ldrb	w19, [x2, 8]
+	add	x19, x0, x19, lsl 8
 	mov	w0, 112
-	add	x19, x19, x2, lsl 8
-	str	w0, [x19,2056]
+	str	w0, [x19, 2056]
 	mov	x0, 400
 	bl	__const_udelay
-	ldr	w0, [x19,2048]
-	ldr	x19, [sp,16]
+	ldr	w0, [x19, 2048]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	FlashReadStatus, .-FlashReadStatus
@@ -488,22 +480,22 @@ FlashReadStatus:
 	.global	js_hash
 	.type	js_hash, %function
 js_hash:
-	mov	x5, x0
+	mov	x4, x0
 	mov	w0, 42982
-	mov	x2, 0
+	mov	x3, 0
 	movk	w0, 0x47c6, lsl 16
-.L58:
-	cmp	w1, w2
-	bls	.L60
-	lsl	w3, w0, 5
-	ldrb	w4, [x5,x2]
-	add	w3, w3, w0, lsr 2
-	add	x2, x2, 1
-	add	w3, w3, w4
-	eor	w0, w0, w3
-	b	.L58
-.L60:
+.L72:
+	cmp	w1, w3
+	bhi	.L73
 	ret
+.L73:
+	lsr	w2, w0, 2
+	ldrb	w5, [x4, x3]
+	add	w2, w2, w0, lsl 5
+	add	x3, x3, 1
+	add	w2, w2, w5
+	eor	w0, w0, w2
+	b	.L72
 	.size	js_hash, .-js_hash
 	.align	2
 	.global	FlashLoadIdbInfo
@@ -516,280 +508,260 @@ FlashLoadIdbInfo:
 	.global	BuildFlashLsbPageTable
 	.type	BuildFlashLsbPageTable, %function
 BuildFlashLsbPageTable:
-	stp	x29, x30, [sp, -32]!
-	adrp	x2, .LANCHOR0
+	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	w19, w1
-	cbnz	w0, .L63
+	str	x21, [sp, 32]
+	adrp	x1, .LANCHOR0
+	cbnz	w0, .L76
+	add	x2, x1, :lo12:.LANCHOR0
 	mov	x0, 0
-	add	x3, x2, :lo12:.LANCHOR0
-.L64:
-	add	x1, x3, 144
-	strh	w0, [x1,x0,lsl 1]
+	add	x2, x2, 144
+.L77:
+	strh	w0, [x2, x0, lsl 1]
 	add	x0, x0, 1
 	cmp	x0, 512
-	bne	.L64
-.L70:
-	add	x20, x2, :lo12:.LANCHOR0
-	mov	w1, 255
+	bne	.L77
+.L83:
+	add	x20, x1, :lo12:.LANCHOR0
 	mov	w2, 2048
-	add	x0, x20, 1168
-	uxth	w19, w19
+	add	x21, x20, 1168
+	mov	w1, 255
+	mov	x0, x21
 	bl	ftl_memset
-	mov	x0, 0
-	mov	x2, x20
-	b	.L65
-.L63:
+	and	w19, w19, 65535
+	add	x1, x20, 144
+	mov	x2, 0
+.L78:
+	cmp	w19, w2, uxth
+	bhi	.L111
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	ret
+.L76:
 	cmp	w0, 1
-	bne	.L66
-	mov	x0, 0
-	mov	w5, 3
-	mov	w6, 2
-	add	x4, x2, :lo12:.LANCHOR0
-.L69:
-	cmp	x0, 3
-	uxth	w3, w0
-	mov	w1, w3
-	bls	.L67
-	ubfiz	w1, w3, 1, 15
-	and	w3, w3, 1
-	cmp	w3, wzr
-	csel	w3, w5, w6, ne
-	sub	w1, w1, w3
-	uxth	w1, w1
-.L67:
-	add	x3, x4, 144
-	strh	w1, [x3,x0,lsl 1]
-	add	x0, x0, 1
-	cmp	x0, 512
-	bne	.L69
-	b	.L70
-.L66:
+	bne	.L79
+	add	x3, x1, :lo12:.LANCHOR0
+	mov	x2, 0
+	add	x3, x3, 144
+.L82:
+	and	w0, w2, 65535
+	cmp	x2, 3
+	bls	.L80
+	ubfiz	w4, w0, 1, 15
+	and	w0, w0, 1
+	add	w0, w0, 2
+	sub	w0, w4, w0
+	and	w0, w0, 65535
+.L80:
+	strh	w0, [x3, x2, lsl 1]
+	add	x2, x2, 1
+	cmp	x2, 512
+	bne	.L82
+	b	.L83
+.L79:
 	cmp	w0, 2
-	bne	.L71
-	mov	w1, 65535
+	bne	.L84
+	add	x3, x1, :lo12:.LANCHOR0
+	mov	w2, 65535
+	add	x3, x3, 144
 	mov	x0, 0
-	add	x5, x2, :lo12:.LANCHOR0
-.L73:
-	add	x4, x5, 144
-	cmp	x0, 1
-	uxth	w3, w0
-	csel	w3, w1, w3, hi
-	add	w1, w1, 2
-	strh	w3, [x4,x0,lsl 1]
+.L86:
+	cmp	x0, 2
+	and	w4, w0, 65535
+	csel	w4, w4, w2, cc
+	strh	w4, [x3, x0, lsl 1]
+	add	w2, w2, 2
 	add	x0, x0, 1
+	and	w2, w2, 65535
 	cmp	x0, 512
-	uxth	w1, w1
-	bne	.L73
-	b	.L70
-.L71:
+	bne	.L86
+	b	.L83
+.L84:
 	cmp	w0, 3
-	bne	.L74
-	mov	x0, 0
-	mov	w6, 5
-	mov	w7, 4
-	add	x5, x2, :lo12:.LANCHOR0
-.L77:
-	cmp	x0, 5
-	uxth	w4, w0
-	mov	w3, w4
-	bls	.L75
-	ubfiz	w1, w4, 1, 15
-	and	w4, w4, 1
-	cmp	w4, wzr
-	csel	w3, w6, w7, ne
-	sub	w3, w1, w3
-	uxth	w3, w3
-.L75:
-	add	x1, x5, 144
-	strh	w3, [x1,x0,lsl 1]
-	add	x0, x0, 1
-	cmp	x0, 512
-	bne	.L77
-	b	.L70
-.L74:
+	bne	.L87
+	add	x3, x1, :lo12:.LANCHOR0
+	mov	x2, 0
+	add	x3, x3, 144
+.L90:
+	and	w0, w2, 65535
+	cmp	x2, 5
+	bls	.L88
+	ubfiz	w4, w0, 1, 15
+	and	w0, w0, 1
+	add	w0, w0, 4
+	sub	w0, w4, w0
+	and	w0, w0, 65535
+.L88:
+	strh	w0, [x3, x2, lsl 1]
+	add	x2, x2, 1
+	cmp	x2, 512
+	bne	.L90
+	b	.L83
+.L87:
 	cmp	w0, 4
-	bne	.L78
-	add	x1, x2, :lo12:.LANCHOR0
-	mov	w6, 7
-	add	x3, x1, 144
-	mov	w5, 6
-	strh	w0, [x3,8]
+	bne	.L91
+	add	x3, x1, :lo12:.LANCHOR0
+	mov	w4, 1
+	add	x3, x3, 160
+	strh	w0, [x3, -8]
 	mov	w0, 5
-	strh	wzr, [x1,144]
-	mov	w1, 1
-	strh	w0, [x3,10]
+	strh	w4, [x3, -14]
+	mov	w4, 2
+	strh	w0, [x3, -6]
 	mov	w0, 7
-	strh	w1, [x3,2]
-	mov	w1, 2
-	strh	w0, [x3,12]
+	strh	w4, [x3, -12]
+	mov	w4, 3
+	strh	w0, [x3, -4]
 	mov	w0, 8
-	strh	w1, [x3,4]
-	mov	w1, 3
-	strh	w0, [x3,14]
+	strh	wzr, [x3, -16]
+	strh	w0, [x3, -2]
 	mov	w0, 8
-	strh	w1, [x3,6]
-.L80:
+	strh	w4, [x3, -10]
+.L93:
 	and	w4, w0, 1
-	ubfiz	w1, w0, 1, 15
+	ubfiz	w2, w0, 1, 15
+	add	w4, w4, 6
 	add	w0, w0, 1
-	cmp	w4, wzr
-	csel	w4, w6, w5, ne
-	add	x3, x3, 2
-	uxth	w0, w0
-	sub	w1, w1, w4
+	sub	w2, w2, w4
+	strh	w2, [x3], 2
+	and	w0, w0, 65535
 	cmp	w0, 512
-	strh	w1, [x3,14]
-	bne	.L80
-	b	.L70
-.L78:
-	cmp	w0, 5
-	bne	.L81
+	bne	.L93
+	b	.L83
+.L91:
+	cmp	w0, 5
+	bne	.L94
+	add	x2, x1, :lo12:.LANCHOR0
 	mov	x0, 0
-	add	x3, x2, :lo12:.LANCHOR0
-.L82:
-	add	x1, x3, 144
-	strh	w0, [x1,x0,lsl 1]
+	add	x3, x2, 144
+.L95:
+	strh	w0, [x3, x0, lsl 1]
 	add	x0, x0, 1
 	cmp	x0, 16
-	bne	.L82
-	mov	x0, 0
-.L83:
-	add	x3, x1, x0
-	add	w4, w0, 16
-	add	x0, x0, 2
-	cmp	x0, 992
-	strh	w4, [x3,32]
-	bne	.L83
-	b	.L70
-.L81:
+	bne	.L95
+	add	x2, x2, 176
+.L96:
+	strh	w0, [x2], 2
+	add	w0, w0, 2
+	and	w0, w0, 65535
+	cmp	w0, 1008
+	bne	.L96
+	b	.L83
+.L94:
 	cmp	w0, 6
-	bne	.L84
+	bne	.L97
+	add	x4, x1, :lo12:.LANCHOR0
+	mov	w2, 0
+	add	x4, x4, 144
 	mov	x3, 0
-	mov	w6, 12
-	mov	w7, 10
-	add	x5, x2, :lo12:.LANCHOR0
-.L87:
+	mov	w5, 12
+	mov	w6, 10
+.L100:
+	and	w0, w3, 65535
 	cmp	x3, 5
-	uxth	w4, w3
-	mov	w0, w4
-	bls	.L85
-	add	w0, w4, w4, lsl 1
-	and	w4, w4, 1
-	cmp	w4, wzr
-	uxth	w0, w0
-	csel	w1, w6, w7, ne
-	sub	w0, w0, w1
-	uxth	w0, w0
-.L85:
-	add	x1, x5, 144
-	strh	w0, [x1,x3,lsl 1]
+	bls	.L98
+	tst	x0, 1
+	csel	w0, w5, w6, ne
+	sub	w0, w2, w0
+	and	w0, w0, 65535
+.L98:
+	strh	w0, [x4, x3, lsl 1]
+	add	w2, w2, 3
+	and	w2, w2, 65535
 	add	x3, x3, 1
-	cmp	x3, 512
-	bne	.L87
-	b	.L70
-.L84:
+	cmp	w2, 1536
+	bne	.L100
+	b	.L83
+.L97:
 	cmp	w0, 9
-	bne	.L88
-	add	x0, x2, :lo12:.LANCHOR0
-	add	x1, x0, 144
-	strh	wzr, [x0,144]
-	mov	w0, 1
-	strh	w0, [x1,2]
-	mov	w0, 2
-	strh	w0, [x1,4]
-	mov	x0, 0
-.L89:
-	add	x3, x1, x0
-	add	w4, w0, 3
-	add	x0, x0, 2
-	cmp	x0, 1018
-	strh	w4, [x3,6]
-	bne	.L89
-	b	.L70
-.L88:
+	bne	.L101
+	add	x0, x1, :lo12:.LANCHOR0
+	mov	w3, 1
+	add	x2, x0, 150
+	strh	w3, [x0, 146]
+	mov	w3, 2
+	strh	wzr, [x0, 144]
+	strh	w3, [x0, 148]
+	mov	w0, 3
+.L102:
+	strh	w0, [x2], 2
+	add	w0, w0, 2
+	and	w0, w0, 65535
+	cmp	w0, 1021
+	bne	.L102
+	b	.L83
+.L101:
 	cmp	w0, 10
-	bne	.L90
+	bne	.L103
+	add	x2, x1, :lo12:.LANCHOR0
 	mov	x0, 0
-	add	x3, x2, :lo12:.LANCHOR0
-.L91:
-	add	x1, x3, 144
-	strh	w0, [x1,x0,lsl 1]
+	add	x3, x2, 144
+.L104:
+	strh	w0, [x3, x0, lsl 1]
 	add	x0, x0, 1
 	cmp	x0, 63
-	bne	.L91
-	mov	x0, 0
-.L92:
-	add	x3, x1, x0
-	add	w4, w0, 63
-	add	x0, x0, 2
-	cmp	x0, 898
-	strh	w4, [x3,126]
-	bne	.L92
-	b	.L70
-.L90:
+	bne	.L104
+	add	x2, x2, 270
+.L105:
+	strh	w0, [x2], 2
+	add	w0, w0, 2
+	and	w0, w0, 65535
+	cmp	w0, 961
+	bne	.L105
+	b	.L83
+.L103:
 	cmp	w0, 11
-	bne	.L93
+	bne	.L106
+	add	x2, x1, :lo12:.LANCHOR0
 	mov	x0, 0
-	add	x1, x2, :lo12:.LANCHOR0
-.L94:
-	add	x3, x1, 144
-	strh	w0, [x3,x0,lsl 1]
+	add	x3, x2, 144
+.L107:
+	strh	w0, [x3, x0, lsl 1]
 	add	x0, x0, 1
 	cmp	x0, 8
-	bne	.L94
-	mov	w6, 7
-	mov	w5, 6
-.L96:
+	bne	.L107
+	add	x2, x2, 160
+.L109:
 	and	w4, w0, 1
-	ubfiz	w1, w0, 1, 15
+	ubfiz	w3, w0, 1, 15
+	add	w4, w4, 6
 	add	w0, w0, 1
-	cmp	w4, wzr
-	csel	w4, w6, w5, ne
-	add	x3, x3, 2
-	uxth	w0, w0
-	sub	w1, w1, w4
+	sub	w3, w3, w4
+	strh	w3, [x2], 2
+	and	w0, w0, 65535
 	cmp	w0, 512
-	strh	w1, [x3,14]
-	bne	.L96
-	b	.L70
-.L93:
+	bne	.L109
+	b	.L83
+.L106:
 	cmp	w0, 12
-	bne	.L70
-	add	x1, x2, :lo12:.LANCHOR0
-	mov	w3, 4
-	add	x0, x1, 144
-	strh	wzr, [x1,144]
-	mov	w1, 1
-	strh	w1, [x0,2]
-	mov	w1, 2
-	strh	w1, [x0,4]
-	mov	w1, 3
-	strh	w1, [x0,6]
-.L97:
-	sub	w1, w3, #1
-	add	x0, x0, 2
-	add	w1, w1, w3, lsr 1
-	add	w3, w3, 1
-	strh	w1, [x0,6]
-	uxth	w3, w3
-	cmp	w3, 512
-	bne	.L97
-	b	.L70
-.L65:
-	cmp	w19, w0, uxth
-	bls	.L122
-	add	x1, x2, 144
-	add	x3, x2, 1168
-	ldrh	w1, [x1,x0,lsl 1]
-	add	x0, x0, 1
-	strh	w1, [x3,w1,sxtw 1]
-	b	.L65
-.L122:
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 32
-	ret
+	bne	.L83
+	add	x0, x1, :lo12:.LANCHOR0
+	mov	w3, 1
+	add	x2, x0, 152
+	strh	w3, [x0, 146]
+	mov	w3, 2
+	strh	wzr, [x0, 144]
+	strh	w3, [x0, 148]
+	mov	w3, 3
+	strh	w3, [x0, 150]
+	mov	w0, 4
+.L110:
+	sub	w3, w0, #1
+	add	w3, w3, w0, lsr 1
+	add	w0, w0, 1
+	strh	w3, [x2], 2
+	and	w0, w0, 65535
+	cmp	w0, 512
+	bne	.L110
+	b	.L83
+.L111:
+	ldrh	w0, [x1, x2, lsl 1]
+	add	x2, x2, 1
+	strh	w0, [x21, w0, sxtw 1]
+	b	.L78
 	.size	BuildFlashLsbPageTable, .-BuildFlashLsbPageTable
 	.align	2
 	.global	FlashPrintInfo
@@ -801,213 +773,209 @@ FlashPrintInfo:
 	.global	ToshibaSetRRPara
 	.type	ToshibaSetRRPara, %function
 ToshibaSetRRPara:
-	uxtb	w1, w1
-	mov	w3, 5
-	add	w2, w1, 1
 	stp	x29, x30, [sp, -80]!
-	smull	x3, w2, w3
-	adrp	x2, .LANCHOR1
+	and	w1, w1, 255
+	add	w2, w1, 1
 	add	x29, sp, 0
-	add	x2, x2, :lo12:.LANCHOR1
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	add	x23, x2, w1, sxtw
-	stp	x25, x26, [sp,64]
-	add	x21, x2, 304
-	add	x25, x2, 256
-	adrp	x24, g_maxRegNum
-	adrp	x26, g_retryMode
-	stp	x19, x20, [sp,16]
-	mov	x22, x0
-	add	x25, x25, x3
-	add	x21, x21, x3
+	stp	x21, x22, [sp, 32]
+	mov	x21, x0
+	mov	w0, 5
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	adrp	x23, g_maxRegNum
+	umull	x2, w2, w0
+	adrp	x0, .LANCHOR1
+	add	x0, x0, :lo12:.LANCHOR1
+	stp	x19, x20, [sp, 16]
+	add	x25, x0, 256
+	add	x24, x0, 352
+	add	x25, x25, x2
+	add	x24, x24, x2
+	add	x23, x23, :lo12:g_maxRegNum
+	mov	x19, x0
+	add	x22, x0, w1, sxtw
 	mov	x20, 0
-	add	x24, x24, :lo12:g_maxRegNum
-	mov	x19, x2
-	add	x26, x26, :lo12:g_retryMode
-.L125:
-	ldrb	w0, [x24]
+	mov	w26, 85
+.L135:
+	ldrb	w0, [x23]
 	cmp	w0, w20
-	bls	.L131
-	mov	w0, 85
-	str	w0, [x22,8]
-	add	x0, x19, 256
-	ldrsb	w0, [x20,x0]
-	str	w0, [x22,4]
+	bhi	.L139
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	ret
+.L139:
+	add	x0, x19, 352
+	str	w26, [x21, 8]
+	ldrsb	w0, [x20, x0]
+	str	w0, [x21, 4]
 	mov	x0, 1000
 	bl	__const_udelay
-	ldrb	w0, [x26]
+	adrp	x0, g_retryMode
+	ldrb	w0, [x0, #:lo12:g_retryMode]
 	cmp	w0, 34
-	bne	.L126
-	ldrsb	w0, [x25,x20]
-	b	.L130
-.L126:
-	cmp	w0, 35
-	bne	.L128
-	ldrsb	w0, [x21,x20]
-	b	.L130
-.L128:
-	ldrsb	w0, [x23,400]
-.L130:
-	str	w0, [x22]
+	bne	.L136
+	ldrsb	w0, [x24, x20]
+.L141:
 	add	x20, x20, 1
-	b	.L125
-.L131:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 80
-	ret
+	str	w0, [x21]
+	b	.L135
+.L136:
+	cmp	w0, 35
+	bne	.L138
+	ldrsb	w0, [x25, x20]
+	b	.L141
+.L138:
+	ldrsb	w0, [x22, 400]
+	b	.L141
 	.size	ToshibaSetRRPara, .-ToshibaSetRRPara
 	.align	2
 	.global	SamsungSetRRPara
 	.type	SamsungSetRRPara, %function
 SamsungSetRRPara:
 	stp	x29, x30, [sp, -64]!
-	adrp	x2, .LANCHOR1
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	add	x2, x2, :lo12:.LANCHOR1
-	adrp	x22, g_maxRegNum
-	stp	x19, x20, [sp,16]
-	add	x1, x2, w1, uxtb 2
-	stp	x23, x24, [sp,48]
-	mov	x21, x0
-	add	x23, x1, 412
+	stp	x21, x22, [sp, 32]
+	mov	x22, x0
+	ubfiz	x21, x1, 2, 8
+	adrp	x0, .LANCHOR1
+	add	x0, x0, :lo12:.LANCHOR1
+	add	x21, x21, 4
+	add	x0, x0, 408
+	stp	x19, x20, [sp, 16]
+	stp	x23, x24, [sp, 48]
+	add	x21, x0, x21
+	adrp	x23, g_maxRegNum
+	mov	x19, x0
+	add	x23, x23, :lo12:g_maxRegNum
 	mov	x20, 0
-	add	x22, x22, :lo12:g_maxRegNum
 	mov	w24, 161
-	mov	x19, x2
-.L133:
-	ldrb	w0, [x22]
+.L143:
+	ldrb	w0, [x23]
 	cmp	w0, w20
-	bls	.L135
-	str	w24, [x21,8]
-	add	x0, x19, 408
-	str	wzr, [x21]
-	ldrsb	w0, [x20,x0]
-	str	w0, [x21]
-	ldrsb	w0, [x23,x20]
+	bhi	.L144
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 64
+	ret
+.L144:
+	str	w24, [x22, 8]
+	str	wzr, [x22]
+	ldrsb	w0, [x20, x19]
+	str	w0, [x22]
+	ldrsb	w0, [x21, x20]
 	add	x20, x20, 1
-	str	w0, [x21]
+	str	w0, [x22]
 	mov	x0, 1500
 	bl	__const_udelay
-	b	.L133
-.L135:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 64
-	ret
+	b	.L143
 	.size	SamsungSetRRPara, .-SamsungSetRRPara
 	.align	2
 	.global	FlashDieInfoInit
 	.type	FlashDieInfoInit, %function
 FlashDieInfoInit:
-	stp	x29, x30, [sp, -96]!
+	stp	x29, x30, [sp, -48]!
 	adrp	x0, .LANCHOR1+482
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	ldrh	w0, [x0, #:lo12:.LANCHOR1+482]
+	stp	x19, x20, [sp, 16]
+	str	x21, [sp, 32]
 	adrp	x21, .LANCHOR0
-	ldrh	w0, [x0,#:lo12:.LANCHOR1+482]
-	stp	x19, x20, [sp,16]
 	add	x19, x21, :lo12:.LANCHOR0
-	str	x27, [sp,80]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	strb	wzr, [x19,3216]
-	add	x25, x19, 3220
-	strb	wzr, [x19,3217]
+	add	x20, x19, 3228
+	strb	wzr, [x19, 3216]
+	strb	wzr, [x19, 3217]
 	bl	FlashBlockAlignInit
-	mov	w1, 0
 	mov	w2, 8
-	mov	x0, x25
-	add	x24, x19, 3228
-	adrp	x26, IDByte
-	mov	x23, 0
-	bl	ftl_memset
-	add	x26, x26, :lo12:IDByte
 	mov	w1, 0
-	mov	w2, 32
-	mov	x0, x24
+	add	x0, x19, 3220
 	bl	ftl_memset
-	add	x0, x19, 3260
+	mov	w2, 32
 	mov	w1, 0
+	mov	x0, x20
+	bl	ftl_memset
 	mov	w2, 192
+	mov	w1, 0
+	add	x0, x19, 3260
 	bl	ftl_memset
-	ldr	x20, [x19,104]
-	add	x22, x20, 1
-.L138:
-	ldrb	w2, [x20]
-	mov	x0, x22
-	add	x1, x26, x23, lsl 3
+	ldr	x7, [x19, 104]
+	adrp	x0, IDByte
+	add	x13, x19, 3072
+	add	x11, x0, :lo12:IDByte
+	mov	x10, x0
+	add	x12, x7, 1
+	mov	x8, 0
+.L148:
+	ldrb	w2, [x7]
+	add	x1, x11, x8, lsl 3
+	mov	x0, x12
 	bl	FlashMemCmp8
-	cbnz	w0, .L137
-	ldrb	w1, [x19,3216]
-	str	w0, [x24,w1,sxtw 2]
-	add	w0, w1, 1
-	strb	w23, [x25,w1,sxtw]
-	strb	w0, [x19,3216]
-.L137:
-	add	x23, x23, 1
-	cmp	x23, 4
-	bne	.L138
-	add	x19, x21, :lo12:.LANCHOR0
-	ldrb	w0, [x19,3216]
-	strb	w0, [x19,3217]
-	ldrb	w0, [x20,8]
+	cbnz	w0, .L147
+	ldrb	w0, [x19, 3216]
+	add	w1, w0, 1
+	strb	w1, [x19, 3216]
+	str	wzr, [x20, x0, lsl 2]
+	add	x0, x13, x0
+	strb	w8, [x0, 148]
+.L147:
+	add	x8, x8, 1
+	cmp	x8, 4
+	bne	.L148
+	add	x8, x21, :lo12:.LANCHOR0
+	ldrb	w0, [x8, 3216]
+	strb	w0, [x8, 3217]
+	ldrb	w0, [x7, 8]
 	cmp	w0, 2
-	beq	.L139
-.L143:
-	add	x21, x21, :lo12:.LANCHOR0
-	ldrb	w1, [x20,13]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldrb	w0, [x21,3216]
-	ldr	x27, [sp,80]
+	beq	.L149
+.L153:
+	add	x9, x21, :lo12:.LANCHOR0
+	ldrh	w1, [x7, 14]
+	ldp	x19, x20, [sp, 16]
+	ldrb	w0, [x9, 3216]
+	ldr	x21, [sp, 32]
+	ldp	x29, x30, [sp], 48
 	mul	w0, w0, w1
-	ldrh	w1, [x20,14]
-	ldp	x19, x20, [sp,16]
+	ldrb	w1, [x7, 13]
 	mul	w0, w0, w1
-	strh	w0, [x21,3452]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 96
+	strh	w0, [x9, 3452]
 	ret
-.L139:
-	adrp	x24, IDByte
-	ldr	w26, [x19,92]
-	mov	x23, 0
-	add	x24, x24, :lo12:IDByte
-	add	x25, x19, 3228
-	add	x27, x19, 3220
-.L142:
-	ldrb	w2, [x20]
-	mov	x0, x22
-	add	x1, x24, x23, lsl 3
+.L149:
+	ldr	w14, [x8, 92]
+	add	x10, x10, :lo12:IDByte
+	add	x13, x8, 3228
+	add	x15, x8, 3072
+	mov	x11, 0
+.L152:
+	ldrb	w2, [x7]
+	add	x1, x10, x11, lsl 3
+	mov	x0, x12
 	bl	FlashMemCmp8
-	cbnz	w0, .L140
-	ldrb	w1, [x20,13]
-	ldrb	w3, [x19,3216]
-	mul	w2, w1, w26
-	ldrh	w1, [x20,14]
-	mov	x0, x3
-	and	w1, w1, 65280
-	mul	w1, w2, w1
-	str	w1, [x25,w3,sxtw 2]
-	ldrb	w2, [x20,23]
-	cbz	w2, .L141
-	lsl	w1, w1, 1
-	str	w1, [x25,w3,sxtw 2]
-.L141:
-	add	w0, w0, 1
-	strb	w23, [x27,x3]
-	strb	w0, [x19,3216]
-.L140:
-	add	x23, x23, 1
-	cmp	x23, 4
-	bne	.L142
-	b	.L143
+	cbnz	w0, .L150
+	ldrb	w1, [x7, 13]
+	ldrh	w0, [x7, 14]
+	ldrb	w2, [x8, 3216]
+	and	w0, w0, 65280
+	mul	w1, w1, w14
+	mul	w0, w0, w1
+	sxtw	x1, w2
+	str	w0, [x13, x1, lsl 2]
+	ldrb	w3, [x7, 23]
+	cbz	w3, .L151
+	lsl	w0, w0, 1
+	str	w0, [x13, x1, lsl 2]
+.L151:
+	add	x1, x15, x1
+	add	w2, w2, 1
+	strb	w2, [x8, 3216]
+	strb	w11, [x1, 148]
+.L150:
+	add	x11, x11, 1
+	cmp	x11, 4
+	bne	.L152
+	b	.L153
 	.size	FlashDieInfoInit, .-FlashDieInfoInit
 	.align	2
 	.global	FlashReadIdbData
@@ -1015,8 +983,8 @@ FlashDieInfoInit:
 FlashReadIdbData:
 	stp	x29, x30, [sp, -16]!
 	adrp	x1, .LANCHOR0
-	mov	w2, 2048
 	add	x1, x1, :lo12:.LANCHOR0
+	mov	w2, 2048
 	add	x29, sp, 0
 	add	x1, x1, 3456
 	bl	ftl_memcpy
@@ -1028,75 +996,72 @@ FlashReadIdbData:
 	.global	FlashLoadPhyInfoInRam
 	.type	FlashLoadPhyInfoInRam, %function
 FlashLoadPhyInfoInRam:
-	stp	x29, x30, [sp, -64]!
+	stp	x29, x30, [sp, -48]!
+	adrp	x9, IDByte
+	add	x9, x9, :lo12:IDByte
+	mov	x8, 0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR1
-	str	x23, [sp,48]
-	stp	x21, x22, [sp,32]
-	adrp	x23, IDByte
-	add	x21, x19, :lo12:.LANCHOR1
-	add	x21, x21, 504
-	mov	w20, 0
-	add	x23, x23, :lo12:IDByte
-.L155:
-	ldrb	w2, [x21]
-	add	x0, x21, 1
-	mov	x1, x23
+	add	x7, x19, :lo12:.LANCHOR1
+	str	x21, [sp, 32]
+	add	x7, x7, 505
+.L166:
+	ldrb	w2, [x7, -1]
+	mov	w10, w8
+	lsl	x21, x8, 5
+	mov	x1, x9
+	mov	x0, x7
 	bl	FlashMemCmp8
-	mov	w22, w0
-	cbnz	w0, .L152
-	add	x0, x19, :lo12:.LANCHOR1
-	ubfiz	x20, x20, 5, 32
-	add	x1, x0, 504
-	adds	x20, x1, x20
-	beq	.L158
-	ldrb	w3, [x20,22]
-	mov	x2, 0
-	mov	x1, x0
-	b	.L157
-.L152:
-	add	w20, w20, 1
-	add	x21, x21, 32
-	cmp	w20, 86
-	bne	.L155
-	b	.L158
-.L157:
-	add	x4, x1, x2, lsl 5
-	mov	w0, w2
-	ldrb	w4, [x4,3256]
+	mov	w20, w0
+	cbnz	w0, .L164
+	add	x2, x19, :lo12:.LANCHOR1
+	ubfiz	x10, x10, 5, 32
+	add	x0, x2, 504
+	add	x1, x2, 3256
+	add	x21, x0, x21
+	add	x0, x0, x10
+	ldrb	w3, [x0, 22]
+	mov	x0, 0
+.L165:
+	lsl	x4, x0, 5
+	mov	w2, w0
+	ldrb	w4, [x4, x1]
 	cmp	w4, w3
-	beq	.L156
-	add	x2, x2, 1
-	cmp	x2, 4
-	bne	.L157
-	mov	w0, w2
-.L156:
+	beq	.L168
+	add	x0, x0, 1
+	cmp	x0, 4
+	bne	.L165
+	mov	w2, w0
+.L168:
 	add	x19, x19, :lo12:.LANCHOR1
-	ubfiz	x1, x0, 5, 32
+	ubfiz	x1, x2, 5, 32
+	add	x0, x19, 3256
+	add	x19, x19, 472
+	add	x1, x0, x1
 	adrp	x0, .LANCHOR0
-	add	x2, x19, 3256
 	add	x0, x0, :lo12:.LANCHOR0
-	add	x1, x2, x1
-	add	x0, x0, 112
 	mov	w2, 32
-	add	x19, x19, 472
+	add	x0, x0, 112
 	bl	ftl_memcpy
-	mov	x0, x19
-	mov	x1, x20
 	mov	w2, 32
+	mov	x1, x21
+	mov	x0, x19
 	bl	ftl_memcpy
-	ldrh	w0, [x19,10]
+	ldrh	w0, [x19, 10]
 	bl	FlashBlockAlignInit
-	b	.L153
-.L158:
-	mov	w22, -1
-.L153:
-	mov	w0, w22
-	ldr	x23, [sp,48]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 64
+	b	.L163
+.L164:
+	add	x8, x8, 1
+	add	x7, x7, 32
+	cmp	x8, 86
+	bne	.L166
+	mov	w20, -1
+.L163:
+	mov	w0, w20
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 48
 	ret
 	.size	FlashLoadPhyInfoInRam, .-FlashLoadPhyInfoInRam
 	.align	2
@@ -1105,77 +1070,78 @@ FlashLoadPhyInfoInRam:
 ftl_flash_suspend:
 	adrp	x0, .LANCHOR2
 	add	x0, x0, :lo12:.LANCHOR2
-	ldr	x1, [x0,1152]
+	ldr	x1, [x0, 1152]
 	ldr	w2, [x1]
-	str	w2, [x0,1160]
-	ldr	w2, [x1,4]
-	str	w2, [x0,1164]
-	ldr	w2, [x1,8]
-	str	w2, [x0,1168]
-	ldr	w2, [x1,12]
-	str	w2, [x0,1172]
-	ldr	w2, [x1,304]
-	str	w2, [x0,1176]
-	ldr	w2, [x1,308]
-	str	w2, [x0,1180]
-	ldr	w2, [x1,336]
-	ldr	w1, [x1,344]
-	str	w2, [x0,1184]
-	str	w1, [x0,1188]
+	str	w2, [x0, 1160]
+	ldr	w2, [x1, 4]
+	str	w2, [x0, 1164]
+	ldr	w2, [x1, 8]
+	str	w2, [x0, 1168]
+	ldr	w2, [x1, 12]
+	str	w2, [x0, 1172]
+	ldr	w2, [x1, 304]
+	str	w2, [x0, 1176]
+	ldr	w2, [x1, 308]
+	str	w2, [x0, 1180]
+	ldr	w2, [x1, 336]
+	ldr	w1, [x1, 344]
+	str	w2, [x0, 1184]
+	str	w1, [x0, 1188]
 	ret
 	.size	ftl_flash_suspend, .-ftl_flash_suspend
 	.align	2
 	.global	LogAddr2PhyAddr
 	.type	LogAddr2PhyAddr, %function
 LogAddr2PhyAddr:
-	adrp	x6, .LANCHOR2
-	uxtb	w4, w4
-	add	x7, x6, :lo12:.LANCHOR2
-	mov	x9, x6
-	add	x7, x7, 1192
-	ldrh	w5, [x7,12]
-	ldrh	w7, [x7,14]
-	mul	w5, w5, w7
-	adrp	x7, .LANCHOR0
-	add	x8, x7, :lo12:.LANCHOR0
-	uxth	w5, w5
-	ldrh	w10, [x8,92]
-	ldrb	w8, [x8,88]
-	ubfiz	w6, w10, 1, 15
-	cmp	w8, 1
-	ldr	w8, [x0,4]
-	csel	w10, w6, w10, eq
+	adrp	x7, .LANCHOR2
+	add	x6, x7, :lo12:.LANCHOR2
+	mov	x9, x7
+	ldr	w7, [x0, 4]
+	and	w4, w4, 255
+	ldrh	w10, [x6, 1204]
+	ldrh	w5, [x6, 1206]
+	adrp	x6, .LANCHOR0
+	ubfx	x12, x7, 10, 16
+	and	w7, w7, 1023
+	mul	w5, w5, w10
+	and	w10, w5, 65535
+	add	x5, x6, :lo12:.LANCHOR0
+	ldrh	w8, [x5, 92]
+	ldrb	w11, [x5, 88]
+	ubfiz	w5, w8, 1, 15
+	cmp	w11, 1
+	csel	w8, w5, w8, eq
 	cmp	w1, 1
-	ubfx	x6, x8, 10, 16
-	and	w8, w8, 1023
-	udiv	w11, w6, w5
-	msub	w5, w11, w5, w6
-	uxth	w6, w5
-	bne	.L165
+	udiv	w5, w12, w10
+	and	w11, w5, 65535
+	msub	w5, w5, w10, w12
+	and	w5, w5, 65535
+	bne	.L175
 	add	x1, x9, :lo12:.LANCHOR2
-	ldrb	w1, [x1,1220]
-	cbnz	w1, .L165
-	add	x1, x7, :lo12:.LANCHOR0
+	ldrb	w1, [x1, 1220]
+	cbnz	w1, .L175
+	add	x1, x6, :lo12:.LANCHOR0
 	add	x1, x1, 144
-	ldrh	w8, [x1,w8,sxtw 1]
-.L165:
-	add	x7, x7, :lo12:.LANCHOR0
+	ldrh	w7, [x1, w7, sxtw 1]
+.L175:
+	add	x6, x6, :lo12:.LANCHOR0
+	uxtw	x1, w11
+	add	x6, x6, 3228
 	cmp	w4, 1
-	add	x7, x7, 3228
-	mov	w1, 0
-	ldr	w5, [x7,w11,uxtw 2]
-	madd	w5, w6, w10, w5
-	add	w5, w5, w8
+	ldr	w1, [x6, x1, lsl 2]
+	madd	w5, w5, w8, w1
+	add	w5, w5, w7
 	str	w5, [x2]
 	str	w11, [x3]
-	bls	.L166
-	ldr	w1, [x0,4]
-	ldr	w0, [x0,60]
+	bls	.L177
+	ldr	w1, [x0, 4]
+	ldr	w0, [x0, 60]
 	add	w1, w1, 1024
 	cmp	w1, w0
-	cset	w1, eq
-.L166:
-	mov	w0, w1
+	cset	w0, eq
+	ret
+.L177:
+	mov	w0, 0
 	ret
 	.size	LogAddr2PhyAddr, .-LogAddr2PhyAddr
 	.align	2
@@ -1183,61 +1149,61 @@ LogAddr2PhyAddr:
 	.type	FlashReadStatusEN, %function
 FlashReadStatusEN:
 	stp	x29, x30, [sp, -32]!
-	adrp	x3, .LANCHOR0
 	ubfiz	x0, x0, 4, 8
-	add	x4, x3, :lo12:.LANCHOR0
+	adrp	x4, .LANCHOR0
+	add	x3, x4, :lo12:.LANCHOR0
 	add	x29, sp, 0
-	add	x5, x4, 24
-	stp	x19, x20, [sp,16]
-	add	x6, x5, x0
-	uxtb	w2, w2
-	ldr	x20, [x5,x0]
-	ldr	x0, [x4,104]
-	ldrb	w19, [x6,8]
-	ldrb	w0, [x0,8]
+	stp	x19, x20, [sp, 16]
+	add	x5, x3, x0
+	ldr	x20, [x3, x0]
+	ldr	x0, [x3, 104]
+	ldrb	w19, [x5, 8]
+	ldrb	w0, [x0, 8]
 	cmp	w0, 2
-	bne	.L169
-	add	x4, x4, 112
-	cbnz	w2, .L170
-	ldrb	w2, [x4,13]
-	b	.L178
-.L170:
-	ldrb	w2, [x4,14]
-.L178:
+	bne	.L179
+	and	w2, w2, 255
+	add	x3, x3, 112
+	cbnz	w2, .L180
+	ldrb	w2, [x3, 13]
+.L190:
 	add	x0, x19, 8
-	add	x3, x3, :lo12:.LANCHOR0
+	add	x4, x4, :lo12:.LANCHOR0
 	add	x0, x20, x0, lsl 8
-	str	w2, [x0,8]
-	mov	w2, 0
-	ldrb	w4, [x3,127]
-	cbz	w4, .L173
+	str	w2, [x0, 8]
+	ldrb	w4, [x4, 127]
+	cbz	w4, .L184
 	add	x3, x19, 8
-	lsl	x3, x3, 8
-.L177:
+	mov	w2, 0
+	add	x3, x20, x3, lsl 8
+.L183:
 	cmp	w2, w4
-	bcs	.L173
-	add	x5, x20, x3
-	lsl	w0, w2, 3
-	lsr	w0, w1, w0
-	add	w2, w2, 1
-	and	w0, w0, 255
-	str	w0, [x5,4]
-	b	.L177
-.L169:
-	add	x0, x19, 8
-	mov	w1, 112
-	add	x0, x20, x0, lsl 8
-	str	w1, [x0,8]
-.L173:
+	bcc	.L185
+.L184:
 	add	x19, x19, 8
 	mov	x0, 400
 	lsl	x19, x19, 8
 	bl	__const_udelay
-	ldr	w0, [x20,x19]
-	ldp	x19, x20, [sp,16]
+	ldr	w0, [x20, x19]
+	ldp	x19, x20, [sp, 16]
+	and	w0, w0, 255
 	ldp	x29, x30, [sp], 32
-	uxtb	w0, w0
 	ret
+.L180:
+	ldrb	w2, [x3, 14]
+	b	.L190
+.L185:
+	lsl	w0, w2, 3
+	add	w2, w2, 1
+	lsr	w0, w1, w0
+	and	w0, w0, 255
+	str	w0, [x3, 4]
+	b	.L183
+.L179:
+	add	x0, x19, 8
+	mov	w1, 112
+	add	x0, x20, x0, lsl 8
+	str	w1, [x0, 8]
+	b	.L184
 	.size	FlashReadStatusEN, .-FlashReadStatusEN
 	.align	2
 	.global	FlashWaitReadyEN
@@ -1245,27 +1211,27 @@ FlashReadStatusEN:
 FlashWaitReadyEN:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	str	x21, [sp,32]
-	uxtb	w19, w0
+	stp	x19, x20, [sp, 16]
+	and	w19, w0, 255
+	str	x21, [sp, 32]
 	mov	w20, w1
-	uxtb	w21, w2
-.L180:
-	mov	w0, w19
+	and	w21, w2, 255
+.L192:
 	mov	w1, w20
 	mov	w2, w21
+	mov	w0, w19
 	bl	FlashReadStatusEN
+	mov	w1, w0
 	cmp	w0, 255
-	mov	w3, w0
-	beq	.L180
-	tbnz	x3, 6, .L181
-	mov	x0, 1
+	beq	.L192
+	tbnz	x1, 6, .L191
 	mov	x1, 3
+	mov	x0, 1
 	bl	usleep_range
-	b	.L180
-.L181:
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
+	b	.L192
+.L191:
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	FlashWaitReadyEN, .-FlashWaitReadyEN
@@ -1274,52 +1240,52 @@ FlashWaitReadyEN:
 	.type	ftl_read_flash_info, %function
 ftl_read_flash_info:
 	stp	x29, x30, [sp, -32]!
-	mov	w1, 0
 	mov	w2, 11
+	mov	w1, 0
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	mov	x19, x0
 	bl	ftl_memset
-	adrp	x1, .LANCHOR0
-	mov	w5, 1
-	add	x1, x1, :lo12:.LANCHOR0
-	ldr	x0, [x1,104]
-	ldrb	w2, [x0,9]
-	ldr	w0, [x1,92]
-	mul	w0, w0, w2
-	strh	w0, [x19,4]
-	adrp	x0, .LANCHOR2
-	add	x0, x0, :lo12:.LANCHOR2
-	ldrb	w2, [x0,1221]
-	ldr	w0, [x0,1224]
-	str	w0, [x19]
-	strb	w2, [x19,7]
-	ldrb	w4, [x1,3216]
-	ldr	x0, [x1,104]
-	ldrb	w0, [x0,9]
-	strb	w0, [x19,6]
-	mov	w0, 32
-	strb	w0, [x19,8]
-	ldr	x0, [x1,104]
-	add	x1, x1, 3220
-	ldrb	w0, [x0,7]
-	strb	w0, [x19,9]
-	mov	x0, 0
-	strb	wzr, [x19,10]
-.L186:
-	cmp	w4, w0, uxtb
-	bls	.L188
-	ldrb	w2, [x0,x1]
-	add	x0, x0, 1
-	ldrb	w3, [x19,10]
-	lsl	w2, w5, w2
-	orr	w2, w2, w3
-	strb	w2, [x19,10]
-	b	.L186
-.L188:
-	ldr	x19, [sp,16]
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	mov	w4, 1
+	ldr	x1, [x0, 104]
+	ldrb	w2, [x1, 9]
+	ldr	w1, [x0, 92]
+	mul	w1, w1, w2
+	strh	w1, [x19, 4]
+	adrp	x1, .LANCHOR2
+	add	x1, x1, :lo12:.LANCHOR2
+	ldrb	w2, [x1, 1221]
+	ldr	w1, [x1, 1224]
+	strb	w2, [x19, 7]
+	mov	x2, 0
+	str	w1, [x19]
+	ldr	x1, [x0, 104]
+	ldrb	w3, [x0, 3216]
+	ldrb	w1, [x1, 9]
+	strb	w1, [x19, 6]
+	mov	w1, 32
+	strb	w1, [x19, 8]
+	ldr	x1, [x0, 104]
+	add	x0, x0, 3220
+	ldrb	w1, [x1, 7]
+	strb	w1, [x19, 9]
+	strb	wzr, [x19, 10]
+.L199:
+	cmp	w3, w2, uxtb
+	bhi	.L200
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L200:
+	ldrb	w1, [x2, x0]
+	add	x2, x2, 1
+	ldrb	w5, [x19, 10]
+	lsl	w1, w4, w1
+	orr	w1, w1, w5
+	strb	w1, [x19, 10]
+	b	.L199
 	.size	ftl_read_flash_info, .-ftl_read_flash_info
 	.align	2
 	.global	FlashScheduleEnSet
@@ -1327,8 +1293,8 @@ ftl_read_flash_info:
 FlashScheduleEnSet:
 	adrp	x1, .LANCHOR2
 	add	x1, x1, :lo12:.LANCHOR2
-	ldr	w2, [x1,1228]
-	str	w0, [x1,1228]
+	ldr	w2, [x1, 1228]
+	str	w0, [x1, 1228]
 	mov	w0, w2
 	ret
 	.size	FlashScheduleEnSet, .-FlashScheduleEnSet
@@ -1337,8 +1303,8 @@ FlashScheduleEnSet:
 	.type	FlashGetPageSize, %function
 FlashGetPageSize:
 	adrp	x0, .LANCHOR0+104
-	ldr	x0, [x0,#:lo12:.LANCHOR0+104]
-	ldrb	w0, [x0,9]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+104]
+	ldrb	w0, [x0, 9]
 	ret
 	.size	FlashGetPageSize, .-FlashGetPageSize
 	.align	2
@@ -1351,13 +1317,12 @@ NandcReadDontCaseBusyEn:
 	.global	NandcGetChipIf
 	.type	NandcGetChipIf, %function
 NandcGetChipIf:
-	adrp	x1, .LANCHOR0
 	ubfiz	x0, x0, 4, 8
+	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
-	add	x1, x1, 24
 	add	x2, x1, x0
-	ldr	x0, [x1,x0]
-	ldrb	w2, [x2,8]
+	ldr	x0, [x1, x0]
+	ldrb	w2, [x2, 8]
 	add	x2, x2, 8
 	add	x0, x0, x2, lsl 8
 	ret
@@ -1367,12 +1332,12 @@ NandcGetChipIf:
 	.type	NandcSetDdrPara, %function
 NandcSetDdrPara:
 	adrp	x1, .LANCHOR2+1152
-	uxtb	w0, w0
+	and	w0, w0, 255
 	lsl	w2, w0, 8
+	ldr	x1, [x1, #:lo12:.LANCHOR2+1152]
 	orr	w0, w2, w0, lsl 16
-	ldr	x1, [x1,#:lo12:.LANCHOR2+1152]
 	orr	w0, w0, 1
-	str	w0, [x1,304]
+	str	w0, [x1, 304]
 	ret
 	.size	NandcSetDdrPara, .-NandcSetDdrPara
 	.align	2
@@ -1380,11 +1345,11 @@ NandcSetDdrPara:
 	.type	NandcSetDdrDiv, %function
 NandcSetDdrDiv:
 	adrp	x1, .LANCHOR2+1152
-	uxtb	w0, w0
-	ldr	x2, [x1,#:lo12:.LANCHOR2+1152]
-	mov	w1, 16640
-	orr	w0, w0, w1
-	str	w0, [x2,344]
+	and	w0, w0, 255
+	mov	w2, 16640
+	orr	w0, w0, w2
+	ldr	x1, [x1, #:lo12:.LANCHOR2+1152]
+	str	w0, [x1, 344]
 	ret
 	.size	NandcSetDdrDiv, .-NandcSetDdrDiv
 	.align	2
@@ -1392,8 +1357,8 @@ NandcSetDdrDiv:
 	.type	NandcSetDdrMode, %function
 NandcSetDdrMode:
 	adrp	x1, .LANCHOR2+1152
-	cmp	w0, wzr
-	ldr	x2, [x1,#:lo12:.LANCHOR2+1152]
+	cmp	w0, 0
+	ldr	x2, [x1, #:lo12:.LANCHOR2+1152]
 	ldr	w1, [x2]
 	and	w3, w1, -8193
 	orr	w1, w1, 253952
@@ -1406,47 +1371,45 @@ NandcSetDdrMode:
 	.type	NandcSetMode, %function
 NandcSetMode:
 	adrp	x1, .LANCHOR2+1152
-	uxtb	w0, w0
+	and	w0, w0, 255
 	tst	w0, 6
-	ldr	x2, [x1,#:lo12:.LANCHOR2+1152]
+	ldr	x2, [x1, #:lo12:.LANCHOR2+1152]
 	ldr	w1, [x2]
-	beq	.L199
-	and	w0, w0, 4
+	beq	.L212
 	orr	w1, w1, 24576
-	cmp	w0, wzr
-	mov	w0, 8322
+	tst	x0, 4
 	and	w1, w1, -32769
-	str	w0, [x2,344]
-	mov	w0, 4099
+	mov	w0, 8322
 	orr	w1, w1, 196608
-	movk	w0, 0x10, lsl 16
-	str	w0, [x2,304]
+	str	w0, [x2, 344]
+	mov	w0, 4099
 	orr	w3, w1, 32768
-	mov	w0, 38
-	str	w0, [x2,308]
+	movk	w0, 0x10, lsl 16
+	str	w0, [x2, 304]
 	csel	w1, w3, w1, ne
+	mov	w0, 38
+	str	w0, [x2, 308]
 	mov	w0, 39
-	str	w0, [x2,308]
-	b	.L201
-.L199:
-	and	w1, w1, -8193
-.L201:
-	str	w1, [x2]
+	str	w0, [x2, 308]
+.L214:
 	mov	w0, 0
+	str	w1, [x2]
 	ret
+.L212:
+	and	w1, w1, -8193
+	b	.L214
 	.size	NandcSetMode, .-NandcSetMode
 	.align	2
 	.global	NandcFlashCs
 	.type	NandcFlashCs, %function
 NandcFlashCs:
-	adrp	x1, .LANCHOR0
 	ubfiz	x0, x0, 4, 8
+	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
-	add	x1, x1, 24
 	add	x3, x1, x0
-	ldr	x2, [x1,x0]
+	ldr	x2, [x1, x0]
 	mov	w1, 1
-	ldrb	w3, [x3,8]
+	ldrb	w3, [x3, 8]
 	ldr	w0, [x2]
 	lsl	w1, w1, w3
 	bfi	w0, w1, 0, 8
@@ -1457,11 +1420,10 @@ NandcFlashCs:
 	.global	NandcFlashDeCs
 	.type	NandcFlashDeCs, %function
 NandcFlashDeCs:
-	adrp	x1, .LANCHOR0
 	ubfiz	x0, x0, 4, 8
+	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
-	add	x1, x1, 24
-	ldr	x1, [x1,x0]
+	ldr	x1, [x1, x0]
 	ldr	w0, [x1]
 	and	w0, w0, -256
 	and	w0, w0, -131073
@@ -1473,179 +1435,180 @@ NandcFlashDeCs:
 	.type	HynixSetRRPara, %function
 HynixSetRRPara:
 	stp	x29, x30, [sp, -96]!
-	adrp	x4, .LANCHOR0
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	uxtb	x23, w0
-	add	x0, x4, :lo12:.LANCHOR0
-	stp	x19, x20, [sp,16]
-	stp	x25, x26, [sp,64]
-	str	x27, [sp,80]
-	adrp	x24, .LANCHOR2
-	stp	x21, x22, [sp,32]
+	stp	x23, x24, [sp, 48]
+	and	w23, w0, 255
+	str	x27, [sp, 80]
+	adrp	x0, .LANCHOR0
+	and	w27, w1, 255
+	add	x1, x0, :lo12:.LANCHOR0
+	stp	x19, x20, [sp, 16]
 	mov	x20, x2
-	mov	x26, x23
-	ldr	x0, [x0,104]
-	uxtb	w27, w1
-	uxtb	w25, w3
-	mov	x2, x4
-	add	x19, x24, :lo12:.LANCHOR2
-	ldrb	w0, [x0,19]
-	cmp	w0, 6
-	bne	.L207
-	add	x19, x19, x23, lsl 6
-	lsl	w4, w25, 2
-	add	x19, x19, 1252
-	b	.L213
-.L207:
-	cmp	w0, 7
-	bne	.L209
-	mov	x3, 160
-	mov	w4, 10
-	madd	x19, x23, x3, x19
-	mul	w4, w25, w4
-	add	x19, x19, 1260
-.L213:
-	add	x19, x19, w4, sxtw
-	b	.L208
-.L209:
-	cmp	w0, 8
-	bne	.L210
-	add	x19, x19, 1260
-	add	w4, w25, w25, lsl 2
-	b	.L213
-.L210:
-	lsl	x4, x23, 3
-	add	x4, x4, w25, sxtw
-	add	x19, x19, x4, lsl 3
-	add	x19, x19, 1252
-.L208:
-	add	x4, x2, :lo12:.LANCHOR0
-	lsl	x0, x23, 4
-	add	x4, x4, 24
-	uxtb	x27, w27
-	add	x1, x4, x0
-	ldr	x21, [x4,x0]
-	mov	w0, w26
-	ldrb	w22, [x1,8]
+	stp	x21, x22, [sp, 32]
+	mov	x2, x0
+	stp	x25, x26, [sp, 64]
+	adrp	x21, .LANCHOR2
+	and	w22, w3, 255
+	add	x19, x21, :lo12:.LANCHOR2
+	ldr	x1, [x1, 104]
+	ldrb	w1, [x1, 19]
+	cmp	w1, 6
+	bne	.L220
+	ubfiz	x0, x23, 6, 8
+	add	x19, x19, 1232
+	add	x0, x0, 20
+	add	x0, x0, w22, uxtw 2
+.L227:
+	add	x19, x19, x0
+.L221:
+	sxtw	x25, w23
+	add	x0, x2, :lo12:.LANCHOR0
+	lsl	x1, x25, 4
+	and	x27, x27, 255
+	add	x2, x0, x1
+	mov	x26, 0
+	ldr	x24, [x0, x1]
+	mov	w0, w23
+	ldrb	w5, [x2, 8]
 	bl	NandcFlashCs
-	ubfiz	x22, x22, 8, 8
+	ubfiz	x5, x5, 8, 8
+	add	x24, x24, x5
 	mov	w0, 54
-	add	x21, x21, x22
-	mov	x22, 0
-	str	w0, [x21,2056]
-.L211:
-	cmp	x22, x27
-	beq	.L214
-	ldrb	w0, [x20,x22]
-	str	w0, [x21,2052]
-	mov	x0, 1000
-	bl	__const_udelay
-	ldrsb	w0, [x19,x22]
-	add	x22, x22, 1
-	str	w0, [x21,2048]
-	b	.L211
-.L214:
-	add	x24, x24, :lo12:.LANCHOR2
+	str	w0, [x24, 2056]
+.L224:
+	cmp	x26, x27
+	bne	.L225
+	add	x21, x21, :lo12:.LANCHOR2
 	mov	w0, 22
-	add	x23, x24, x23
-	str	w0, [x21,2056]
-	mov	w0, w26
+	add	x21, x21, x25
+	str	w0, [x24, 2056]
+	mov	w0, w23
 	bl	NandcFlashDeCs
-	strb	w25, [x23,2088]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldr	x27, [sp,80]
+	strb	w22, [x21, 2088]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldr	x27, [sp, 80]
 	ldp	x29, x30, [sp], 96
 	ret
+.L220:
+	cmp	w1, 7
+	bne	.L222
+	mov	w0, 160
+	mov	x1, 28
+	add	x19, x19, 1232
+	umaddl	x1, w0, w23, x1
+	mov	w0, 10
+	umaddl	x0, w22, w0, x1
+	b	.L227
+.L222:
+	cmp	w1, 8
+	bne	.L223
+	add	x0, x19, 1260
+	add	w19, w22, w22, lsl 2
+	add	x19, x0, w19, sxtw
+	b	.L221
+.L223:
+	and	x0, x22, 255
+	add	x0, x0, 2
+	add	x0, x0, w23, uxtw 3
+	add	x19, x19, x0, lsl 3
+	add	x19, x19, 1236
+	b	.L221
+.L225:
+	ldrb	w0, [x20, x26]
+	str	w0, [x24, 2052]
+	mov	x0, 1000
+	bl	__const_udelay
+	ldrsb	w0, [x19, x26]
+	add	x26, x26, 1
+	str	w0, [x24, 2048]
+	b	.L224
 	.size	HynixSetRRPara, .-HynixSetRRPara
 	.align	2
 	.global	FlashSetReadRetryDefault
 	.type	FlashSetReadRetryDefault, %function
 FlashSetReadRetryDefault:
 	adrp	x0, .LANCHOR0+104
-	stp	x29, x30, [sp, -48]!
-	add	x29, sp, 0
-	ldr	x0, [x0,#:lo12:.LANCHOR0+104]
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	mov	x19, 0
-	ldrb	w0, [x0,19]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+104]
+	ldrb	w0, [x0, 19]
 	sub	w0, w0, #1
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 7
-	bhi	.L215
+	bhi	.L235
+	stp	x29, x30, [sp, -48]!
+	add	x29, sp, 0
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR2
-	adrp	x21, IDByte
 	add	x20, x20, :lo12:.LANCHOR2
-	add	x21, x21, :lo12:IDByte
+	stp	x21, x22, [sp, 32]
+	adrp	x21, IDByte
 	add	x22, x20, 1236
-.L220:
+	add	x21, x21, :lo12:IDByte
+	mov	x19, 0
+.L231:
 	lsl	x1, x19, 3
-	uxtb	w0, w19
-	ldrb	w1, [x1,x21]
+	and	w0, w19, 255
+	ldrb	w1, [x1, x21]
 	cmp	w1, 173
-	bne	.L217
-	ldrb	w1, [x20,1233]
-	mov	x2, x22
+	bne	.L230
+	ldrb	w1, [x20, 1233]
 	mov	w3, 0
+	mov	x2, x22
 	bl	HynixSetRRPara
-.L217:
+.L230:
 	add	x19, x19, 1
 	cmp	x19, 4
-	bne	.L220
-.L215:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
+	bne	.L231
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
+.L235:
+	ret
 	.size	FlashSetReadRetryDefault, .-FlashSetReadRetryDefault
 	.align	2
 	.global	FlashWaitCmdDone
 	.type	FlashWaitCmdDone, %function
 FlashWaitCmdDone:
-	stp	x29, x30, [sp, -48]!
-	uxtb	x1, w0
-	mov	x2, 24
+	and	x5, x0, 255
+	mov	x0, 24
+	stp	x29, x30, [sp, -32]!
+	adrp	x4, .LANCHOR0
+	add	x4, x4, :lo12:.LANCHOR0
+	mul	x0, x5, x0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR0
-	stp	x21, x22, [sp,32]
-	add	x20, x20, :lo12:.LANCHOR0
-	mov	x22, x1
-	mul	x1, x1, x2
-	add	x0, x20, 3260
-	add	x19, x0, x1
-	ldrb	w21, [x0,x1]
-	ldr	x0, [x19,8]
-	cbz	x0, .L224
-	mov	w0, w21
-	add	x20, x20, 3228
+	add	x1, x4, 3260
+	stp	x19, x20, [sp, 16]
+	add	x19, x1, x0
+	ldr	x2, [x19, 8]
+	cbz	x2, .L240
+	ldrb	w20, [x1, x0]
+	mov	w0, w20
 	bl	NandcFlashCs
-	ldr	w0, [x20,w22,sxtw 2]
-	ldr	w1, [x19,4]
-	cmp	w0, wzr
-	mov	w0, w21
+	add	x4, x4, 3228
+	ldr	w1, [x19, 4]
+	ldr	w0, [x4, x5, lsl 2]
+	cmp	w0, 0
+	mov	w0, w20
 	cset	w2, ne
 	bl	FlashWaitReadyEN
-	mov	w20, w0
-	mov	w0, w21
+	mov	w2, w0
+	mov	w0, w20
 	bl	NandcFlashDeCs
-	ldr	x1, [x19,8]
-	sbfx	x0, x20, 0, 1
+	sbfx	x0, x2, 0, 1
+	ldr	x1, [x19, 8]
 	str	w0, [x1]
-	str	xzr, [x19,8]
-	ldr	x1, [x19,16]
-	cbz	x1, .L224
+	str	xzr, [x19, 8]
+	ldr	x1, [x19, 16]
+	cbz	x1, .L240
 	str	w0, [x1]
-	str	xzr, [x19,16]
-.L224:
+	str	xzr, [x19, 16]
+.L240:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 48
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
 	ret
 	.size	FlashWaitCmdDone, .-FlashWaitCmdDone
 	.align	2
@@ -1665,97 +1628,92 @@ NandcDelayns:
 	.type	NandcWaitFlashReadyNoDelay, %function
 NandcWaitFlashReadyNoDelay:
 	stp	x29, x30, [sp, -48]!
-	adrp	x1, .LANCHOR0
 	ubfiz	x0, x0, 4, 8
+	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
 	add	x29, sp, 0
-	add	x1, x1, 24
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	w19, 34464
-	ldr	x20, [x1,x0]
 	movk	w19, 0x1, lsl 16
-.L232:
+	ldr	x20, [x1, x0]
+.L250:
 	ldr	w0, [x20]
-	str	w0, [x29,40]
-	ldr	w0, [x29,40]
-	tbnz	x0, 9, .L233
+	str	w0, [x29, 40]
+	ldr	w0, [x29, 40]
+	tbnz	x0, 9, .L251
 	mov	x0, 50
 	bl	__const_udelay
 	subs	w19, w19, #1
-	bne	.L232
+	bne	.L250
 	mov	w0, -1
-	b	.L231
-.L233:
-	mov	w0, 0
-.L231:
-	ldp	x19, x20, [sp,16]
+.L248:
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
+.L251:
+	mov	w0, 0
+	b	.L248
 	.size	NandcWaitFlashReadyNoDelay, .-NandcWaitFlashReadyNoDelay
 	.align	2
 	.global	NandcWaitFlashReady
 	.type	NandcWaitFlashReady, %function
 NandcWaitFlashReady:
 	stp	x29, x30, [sp, -48]!
-	adrp	x1, .LANCHOR0
 	ubfiz	x0, x0, 4, 8
+	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
 	add	x29, sp, 0
-	add	x1, x1, 24
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	w19, 34464
-	ldr	x20, [x1,x0]
 	movk	w19, 0x1, lsl 16
+	ldr	x20, [x1, x0]
 	mov	x0, 650
 	bl	__const_udelay
-.L237:
+.L256:
 	ldr	w0, [x20]
-	str	w0, [x29,40]
-	ldr	w0, [x29,40]
-	tbnz	x0, 9, .L238
-	mov	x0, 1
+	str	w0, [x29, 40]
+	ldr	w0, [x29, 40]
+	tbnz	x0, 9, .L257
 	mov	x1, 2
+	mov	x0, 1
 	bl	usleep_range
 	subs	w19, w19, #1
-	bne	.L237
+	bne	.L256
 	mov	w0, -1
-	b	.L236
-.L238:
-	mov	w0, 0
-.L236:
-	ldp	x19, x20, [sp,16]
+.L254:
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
+.L257:
+	mov	w0, 0
+	b	.L254
 	.size	NandcWaitFlashReady, .-NandcWaitFlashReady
 	.align	2
 	.global	FlashReset
 	.type	FlashReset, %function
 FlashReset:
-	stp	x29, x30, [sp, -48]!
-	adrp	x1, .LANCHOR0
+	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	add	x1, x1, :lo12:.LANCHOR0
-	uxtb	w20, w0
-	add	x1, x1, 24
-	sbfiz	x0, x20, 4, 32
-	add	x2, x1, x0
-	str	x21, [sp,32]
-	ldr	x21, [x1,x0]
-	mov	w0, w20
-	ldrb	w19, [x2,8]
+	str	x19, [sp, 16]
+	and	w19, w0, 255
+	sbfiz	x1, x19, 4, 32
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	add	x2, x0, x1
+	ldr	x5, [x0, x1]
+	mov	w0, w19
+	ldrb	w4, [x2, 8]
 	bl	NandcFlashCs
-	add	x19, x19, 8
+	add	x4, x4, 8
+	add	x4, x5, x4, lsl 8
 	mov	w0, 255
-	add	x19, x21, x19, lsl 8
-	str	w0, [x19,8]
-	mov	w0, w20
+	str	w0, [x4, 8]
+	mov	w0, w19
 	bl	NandcWaitFlashReady
-	mov	w0, w20
+	mov	w0, w19
 	bl	NandcFlashDeCs
-	ldr	x21, [sp,32]
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 48
+	ldr	x19, [sp, 16]
+	ldp	x29, x30, [sp], 32
 	ret
 	.size	FlashReset, .-FlashReset
 	.align	2
@@ -1764,61 +1722,60 @@ FlashReset:
 flash_enter_slc_mode:
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
+	and	w22, w0, 255
 	adrp	x21, .LANCHOR2
-	uxtb	w22, w0
 	add	x0, x21, :lo12:.LANCHOR2
-	str	x23, [sp,48]
-	stp	x19, x20, [sp,16]
-	ldrb	w0, [x0,1220]
-	cbz	w0, .L241
+	stp	x19, x20, [sp, 16]
+	str	x23, [sp, 48]
+	ldrb	w0, [x0, 1220]
+	cbz	w0, .L262
 	mov	w0, w22
 	bl	NandcFlashCs
-	adrp	x1, .LANCHOR0
 	sxtw	x0, w22
-	add	x1, x1, :lo12:.LANCHOR0
+	adrp	x1, .LANCHOR0
 	lsl	x2, x0, 4
-	add	x1, x1, 24
-	lsl	x0, x0, 3
+	add	x1, x1, :lo12:.LANCHOR0
 	add	x3, x1, x2
-	ldr	x23, [x1,x2]
+	lsl	x0, x0, 3
+	ldr	x23, [x1, x2]
 	adrp	x1, IDByte
 	add	x1, x1, :lo12:IDByte
-	ldrb	w19, [x3,8]
-	ldrb	w0, [x1,x0]
+	ldrb	w19, [x3, 8]
+	ldrb	w0, [x1, x0]
 	cmp	w0, 44
-	bne	.L243
+	bne	.L264
 	ubfiz	x20, x19, 8, 8
 	mov	w0, 239
 	add	x20, x23, x20
-	str	w0, [x20,2056]
+	str	w0, [x20, 2056]
 	mov	w0, 145
-	str	w0, [x20,2052]
+	str	w0, [x20, 2052]
 	mov	x0, 250
 	bl	__const_udelay
-	str	wzr, [x20,2048]
+	str	wzr, [x20, 2048]
 	mov	w0, 1
-	str	w0, [x20,2048]
-	str	wzr, [x20,2048]
+	str	w0, [x20, 2048]
+	str	wzr, [x20, 2048]
 	mov	x0, 500
-	str	wzr, [x20,2048]
+	str	wzr, [x20, 2048]
 	bl	__const_udelay
-.L243:
+.L264:
 	add	x19, x19, 8
 	mov	w0, w22
-	add	x21, x21, :lo12:.LANCHOR2
 	add	x19, x23, x19, lsl 8
 	bl	NandcWaitFlashReadyNoDelay
 	mov	w0, 218
-	str	w0, [x19,8]
+	add	x21, x21, :lo12:.LANCHOR2
+	str	w0, [x19, 8]
 	mov	w0, w22
 	bl	NandcWaitFlashReady
 	mov	w0, 2
-	strb	w0, [x21,2092]
-.L241:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldr	x23, [sp,48]
+	strb	w0, [x21, 2092]
+.L262:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldr	x23, [sp, 48]
 	ldp	x29, x30, [sp], 64
 	ret
 	.size	flash_enter_slc_mode, .-flash_enter_slc_mode
@@ -1828,61 +1785,60 @@ flash_enter_slc_mode:
 flash_exit_slc_mode:
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
+	and	w22, w0, 255
 	adrp	x21, .LANCHOR2
-	uxtb	w22, w0
 	add	x0, x21, :lo12:.LANCHOR2
-	str	x23, [sp,48]
-	stp	x19, x20, [sp,16]
-	ldrb	w0, [x0,1220]
-	cbz	w0, .L247
+	stp	x19, x20, [sp, 16]
+	str	x23, [sp, 48]
+	ldrb	w0, [x0, 1220]
+	cbz	w0, .L269
 	mov	w0, w22
 	bl	NandcFlashCs
-	adrp	x1, .LANCHOR0
 	sxtw	x0, w22
-	add	x1, x1, :lo12:.LANCHOR0
+	adrp	x1, .LANCHOR0
 	lsl	x2, x0, 4
-	add	x1, x1, 24
-	lsl	x0, x0, 3
+	add	x1, x1, :lo12:.LANCHOR0
 	add	x3, x1, x2
-	ldr	x23, [x1,x2]
+	lsl	x0, x0, 3
+	ldr	x23, [x1, x2]
 	adrp	x1, IDByte
 	add	x1, x1, :lo12:IDByte
-	ldrb	w19, [x3,8]
-	ldrb	w0, [x1,x0]
+	ldrb	w19, [x3, 8]
+	ldrb	w0, [x1, x0]
 	cmp	w0, 44
-	bne	.L249
+	bne	.L271
 	ubfiz	x20, x19, 8, 8
 	mov	w0, 239
 	add	x20, x23, x20
-	str	w0, [x20,2056]
+	str	w0, [x20, 2056]
 	mov	w0, 145
-	str	w0, [x20,2052]
+	str	w0, [x20, 2052]
 	mov	x0, 250
 	bl	__const_udelay
 	mov	w0, 2
-	str	w0, [x20,2048]
+	str	w0, [x20, 2048]
 	mov	w0, 1
-	str	w0, [x20,2048]
-	str	wzr, [x20,2048]
+	str	w0, [x20, 2048]
+	str	wzr, [x20, 2048]
 	mov	x0, 500
-	str	wzr, [x20,2048]
+	str	wzr, [x20, 2048]
 	bl	__const_udelay
-.L249:
+.L271:
 	add	x19, x19, 8
 	mov	w0, w22
-	add	x21, x21, :lo12:.LANCHOR2
 	add	x19, x23, x19, lsl 8
 	bl	NandcWaitFlashReadyNoDelay
+	add	x21, x21, :lo12:.LANCHOR2
 	mov	w0, 223
-	str	w0, [x19,8]
+	str	w0, [x19, 8]
 	mov	w0, w22
 	bl	NandcWaitFlashReady
-	strb	wzr, [x21,2092]
-.L247:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldr	x23, [sp,48]
+	strb	wzr, [x21, 2092]
+.L269:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldr	x23, [sp, 48]
 	ldp	x29, x30, [sp], 64
 	ret
 	.size	flash_exit_slc_mode, .-flash_exit_slc_mode
@@ -1892,15 +1848,16 @@ flash_exit_slc_mode:
 FlashEraseBlock:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	uxtb	w19, w0
+	stp	x19, x20, [sp, 16]
+	and	w19, w0, 255
 	mov	w20, w1
+	str	x21, [sp, 32]
 	mov	w0, w19
-	str	x2, [x29,40]
+	mov	w21, w2
 	bl	NandcWaitFlashReady
 	mov	w0, w19
 	bl	NandcFlashCs
-	ldr	x2, [x29,40]
+	mov	w2, w21
 	mov	w1, w20
 	mov	w0, w19
 	bl	FlashEraseCmd
@@ -1909,11 +1866,12 @@ FlashEraseBlock:
 	mov	w1, w20
 	mov	w0, w19
 	bl	FlashReadStatus
-	mov	w20, w0
+	mov	w2, w0
 	mov	w0, w19
 	bl	NandcFlashDeCs
-	and	w0, w20, 1
-	ldp	x19, x20, [sp,16]
+	and	w0, w2, 1
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	FlashEraseBlock, .-FlashEraseBlock
@@ -1921,170 +1879,166 @@ FlashEraseBlock:
 	.global	FlashSetInterfaceMode
 	.type	FlashSetInterfaceMode, %function
 FlashSetInterfaceMode:
-	adrp	x1, .LANCHOR2+2093
-	adrp	x3, .LANCHOR0
 	stp	x29, x30, [sp, -16]!
-	add	x3, x3, :lo12:.LANCHOR0
-	adrp	x7, IDByte
+	adrp	x1, .LANCHOR2+2093
+	adrp	x2, .LANCHOR0
+	add	x2, x2, :lo12:.LANCHOR0
 	add	x29, sp, 0
-	ldrb	w1, [x1,#:lo12:.LANCHOR2+2093]
-	add	x3, x3, 24
-	mov	x6, 0
+	ldrb	w1, [x1, #:lo12:.LANCHOR2+2093]
+	adrp	x7, IDByte
+	add	x2, x2, 8
 	add	x7, x7, :lo12:IDByte
-	and	w11, w1, 1
-	and	w1, w1, 4
+	and	w11, w1, 4
+	and	w6, w1, 1
+	mov	x5, 0
+	mov	w12, 69
 	mov	w8, 239
 	mov	w9, 128
-	uxtb	w5, w1
 	mov	w10, 1
-	mov	w12, 35
-	mov	w13, 32
-	mov	w14, 5
-.L265:
-	ldrb	w4, [x6,x7]
-	ldr	x1, [x3]
-	cmp	w4, 152
-	ldrb	w2, [x3,8]
-	beq	.L255
-	cmp	w4, 69
-	beq	.L255
-	cmp	w4, 173
-	beq	.L255
-	cmp	w4, 44
-	bne	.L256
-.L255:
+	mov	w13, 35
+	mov	w14, 32
+	mov	w15, 5
+	mov	w16, 44
+.L288:
+	ldrb	w3, [x5, x7]
+	ldrb	w4, [x2]
+	cmp	w3, 152
+	ccmp	w3, w12, 4, ne
+	beq	.L279
+	cmp	w3, 173
+	ccmp	w3, w16, 4, ne
+	bne	.L280
+.L279:
 	cmp	w0, 1
-	bne	.L258
-	cbz	w11, .L256
-	ubfiz	x2, x2, 8, 8
-	cmp	w4, 173
-	add	x1, x1, x2
-	str	w8, [x1,2056]
-	bne	.L259
-	str	w0, [x1,2052]
-	b	.L276
-.L259:
-	cmp	w4, 44
-	bne	.L261
-	str	w0, [x1,2052]
-	str	w14, [x1,2048]
-	b	.L263
-.L261:
-	str	w9, [x1,2052]
-	str	w0, [x1,2048]
-	b	.L263
-.L258:
-	cbz	w5, .L256
-	ubfiz	x2, x2, 8, 8
-	cmp	w4, 173
-	add	x1, x1, x2
-	str	w8, [x1,2056]
-	bne	.L262
-	str	w10, [x1,2052]
-	str	w13, [x1,2048]
-	b	.L263
-.L262:
-	cmp	w4, 44
-	bne	.L264
-	str	w10, [x1,2052]
-	str	w12, [x1,2048]
-	b	.L263
-.L264:
-	str	w9, [x1,2052]
-.L276:
-	str	wzr, [x1,2048]
-.L263:
-	str	wzr, [x1,2048]
-	str	wzr, [x1,2048]
-	str	wzr, [x1,2048]
-.L256:
-	add	x6, x6, 8
-	add	x3, x3, 16
-	cmp	x6, 32
-	bne	.L265
+	ldr	x1, [x2, -8]
+	bne	.L281
+	cbz	w6, .L280
+	ubfiz	x4, x4, 8, 8
+	cmp	w3, 173
+	add	x1, x1, x4
+	str	w8, [x1, 2056]
+	bne	.L282
+	str	w0, [x1, 2052]
+.L300:
+	str	wzr, [x1, 2048]
+	b	.L286
+.L282:
+	cmp	w3, 44
+	bne	.L284
+	str	w0, [x1, 2052]
+	str	w15, [x1, 2048]
+.L286:
+	str	wzr, [x1, 2048]
+	str	wzr, [x1, 2048]
+	str	wzr, [x1, 2048]
+.L280:
+	add	x5, x5, 8
+	add	x2, x2, 16
+	cmp	x5, 32
+	bne	.L288
 	mov	w0, 0
 	bl	NandcWaitFlashReady
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	ret
+.L284:
+	str	w9, [x1, 2052]
+	str	w0, [x1, 2048]
+	b	.L286
+.L281:
+	cbz	w11, .L280
+	ubfiz	x4, x4, 8, 8
+	cmp	w3, 173
+	add	x1, x1, x4
+	str	w8, [x1, 2056]
+	bne	.L285
+	str	w10, [x1, 2052]
+	str	w14, [x1, 2048]
+	b	.L286
+.L285:
+	cmp	w3, 44
+	bne	.L287
+	str	w10, [x1, 2052]
+	str	w13, [x1, 2048]
+	b	.L286
+.L287:
+	str	w9, [x1, 2052]
+	b	.L300
 	.size	FlashSetInterfaceMode, .-FlashSetInterfaceMode
 	.align	2
 	.global	FlashReadSpare
 	.type	FlashReadSpare, %function
 FlashReadSpare:
-	adrp	x3, .LANCHOR1+481
-	adrp	x5, .LANCHOR0
-	stp	x29, x30, [sp, -48]!
-	uxtb	w0, w0
-	add	x5, x5, :lo12:.LANCHOR0
-	add	x5, x5, 24
-	sbfiz	x6, x0, 4, 32
+	stp	x29, x30, [sp, -32]!
+	and	w0, w0, 255
+	sbfiz	x5, x0, 4, 32
+	adrp	x4, .LANCHOR0
 	add	x29, sp, 0
-	ldrb	w4, [x3,#:lo12:.LANCHOR1+481]
-	add	x3, x5, x6
-	str	x19, [sp,16]
-	lsl	w4, w4, 9
-	str	x2, [x29,40]
-	ldrb	w3, [x3,8]
-	ldr	x19, [x5,x6]
-	add	x19, x19, x3, lsl 8
-	and	w3, w1, 255
-	str	wzr, [x19,2056]
-	str	w4, [x19,2052]
-	lsr	w4, w4, 8
-	str	w4, [x19,2052]
-	str	w3, [x19,2052]
-	lsr	w3, w1, 8
-	str	w3, [x19,2052]
+	stp	x19, x20, [sp, 16]
+	mov	x20, x2
+	adrp	x2, .LANCHOR1+481
+	add	x4, x4, :lo12:.LANCHOR0
+	ldrb	w3, [x2, #:lo12:.LANCHOR1+481]
+	add	x2, x4, x5
+	ldrb	w19, [x2, 8]
+	lsl	w3, w3, 9
+	ldr	x2, [x4, x5]
+	add	x19, x2, x19, lsl 8
+	and	w2, w1, 255
+	str	wzr, [x19, 2056]
+	str	w3, [x19, 2052]
+	lsr	w3, w3, 8
+	str	w3, [x19, 2052]
+	str	w2, [x19, 2052]
+	lsr	w2, w1, 8
+	str	w2, [x19, 2052]
 	lsr	w1, w1, 16
-	str	w1, [x19,2052]
+	str	w1, [x19, 2052]
 	mov	w1, 48
-	str	w1, [x19,2056]
+	str	w1, [x19, 2056]
 	bl	NandcWaitFlashReady
-	ldr	x2, [x29,40]
-	ldr	w0, [x19,2048]
-	strb	w0, [x2]
-	ldr	x19, [sp,16]
-	ldp	x29, x30, [sp], 48
+	ldr	w0, [x19, 2048]
+	strb	w0, [x20]
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
 	ret
 	.size	FlashReadSpare, .-FlashReadSpare
 	.align	2
 	.global	SandiskProgTestBadBlock
 	.type	SandiskProgTestBadBlock, %function
 SandiskProgTestBadBlock:
-	adrp	x3, .LANCHOR0
-	uxtb	w0, w0
 	stp	x29, x30, [sp, -32]!
-	add	x3, x3, :lo12:.LANCHOR0
-	sbfiz	x4, x0, 4, 32
-	add	x3, x3, 24
+	and	w0, w0, 255
+	sbfiz	x3, x0, 4, 32
+	adrp	x2, .LANCHOR0
+	add	x2, x2, :lo12:.LANCHOR0
 	add	x29, sp, 0
-	add	x2, x3, x4
-	str	x19, [sp,16]
-	ldrb	w2, [x2,8]
-	ldr	x19, [x3,x4]
-	add	x19, x19, x2, lsl 8
+	add	x4, x2, x3
+	str	x19, [sp, 16]
+	ldr	x2, [x2, x3]
+	ldrb	w19, [x4, 8]
+	add	x19, x2, x19, lsl 8
 	mov	w2, 162
-	str	w2, [x19,2056]
+	str	w2, [x19, 2056]
 	mov	w2, 128
-	str	w2, [x19,2056]
+	str	w2, [x19, 2056]
 	and	w2, w1, 255
-	str	wzr, [x19,2052]
-	str	wzr, [x19,2052]
-	str	w2, [x19,2052]
+	str	wzr, [x19, 2052]
+	str	wzr, [x19, 2052]
+	str	w2, [x19, 2052]
 	lsr	w2, w1, 8
-	str	w2, [x19,2052]
+	str	w2, [x19, 2052]
 	lsr	w1, w1, 16
-	str	w1, [x19,2052]
+	str	w1, [x19, 2052]
 	mov	w1, 16
-	str	w1, [x19,2056]
+	str	w1, [x19, 2056]
 	bl	NandcWaitFlashReady
 	mov	w0, 112
-	str	w0, [x19,2056]
+	str	w0, [x19, 2056]
 	mov	x0, 400
 	bl	__const_udelay
-	ldr	w0, [x19,2048]
-	ldr	x19, [sp,16]
+	ldr	w0, [x19, 2048]
+	ldr	x19, [sp, 16]
 	and	w0, w0, 1
 	ldp	x29, x30, [sp], 32
 	ret
@@ -2095,1128 +2049,1115 @@ SandiskProgTestBadBlock:
 SandiskSetRRPara:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	x20, x0
 	mov	w0, 239
-	uxtb	w19, w1
-	add	w19, w19, 1
-	str	w0, [x20,8]
+	and	w19, w1, 255
+	str	w0, [x20, 8]
 	mov	w0, 17
-	str	w0, [x20,4]
+	str	w0, [x20, 4]
 	mov	x0, 1000
 	bl	__const_udelay
-	mov	w1, 5
-	adrp	x2, .LANCHOR1
-	add	x2, x2, :lo12:.LANCHOR1
-	adrp	x0, g_maxRegNum
-	smull	x1, w19, w1
-	add	x3, x2, 256
+	add	w1, w19, 1
+	mov	w0, 5
+	adrp	x2, g_maxRegNum
 	adrp	x4, g_retryMode
-	add	x2, x2, 304
-	add	x3, x3, x1
-	add	x0, x0, :lo12:g_maxRegNum
-	add	x1, x2, x1
+	add	x2, x2, :lo12:g_maxRegNum
 	add	x4, x4, :lo12:g_retryMode
-	mov	x2, 0
-.L280:
-	ldrb	w5, [x0]
-	cmp	w5, w2
-	bls	.L285
-	ldrb	w5, [x4]
-	cmp	w5, 67
-	bne	.L281
-	ldrsb	w5, [x3,x2]
-	b	.L284
-.L281:
-	ldrsb	w5, [x1,x2]
-.L284:
-	str	w5, [x20]
-	add	x2, x2, 1
-	b	.L280
-.L285:
+	umull	x1, w1, w0
+	adrp	x0, .LANCHOR1
+	add	x0, x0, :lo12:.LANCHOR1
+	add	x3, x0, 256
+	add	x0, x0, 352
+	add	x3, x3, x1
+	add	x0, x0, x1
+	mov	x1, 0
+.L306:
+	ldrb	w5, [x2]
+	cmp	w5, w1
+	bhi	.L309
 	mov	w0, 0
 	bl	NandcWaitFlashReady
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L309:
+	ldrb	w5, [x4]
+	cmp	w5, 67
+	bne	.L307
+	ldrsb	w5, [x0, x1]
+.L311:
+	add	x1, x1, 1
+	str	w5, [x20]
+	b	.L306
+.L307:
+	ldrsb	w5, [x3, x1]
+	b	.L311
 	.size	SandiskSetRRPara, .-SandiskSetRRPara
 	.align	2
 	.global	micron_auto_read_calibration_config
 	.type	micron_auto_read_calibration_config, %function
 micron_auto_read_calibration_config:
-	stp	x29, x30, [sp, -48]!
+	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	str	x19, [sp,16]
-	uxtb	w19, w0
+	stp	x19, x20, [sp, 16]
+	and	w19, w0, 255
+	mov	w20, w1
 	mov	w0, w19
-	sbfiz	x19, x19, 4, 32
-	str	x1, [x29,40]
 	bl	NandcWaitFlashReady
-	adrp	x3, .LANCHOR0
-	add	x3, x3, :lo12:.LANCHOR0
-	add	x3, x3, 24
-	add	x0, x3, x19
-	ldr	x19, [x3,x19]
-	ldrb	w2, [x0,8]
+	sbfiz	x0, x19, 4, 32
+	adrp	x2, .LANCHOR0
+	add	x2, x2, :lo12:.LANCHOR0
+	add	x1, x2, x0
+	ldr	x0, [x2, x0]
+	ldrb	w19, [x1, 8]
+	add	x19, x0, x19, lsl 8
 	mov	w0, 239
-	add	x19, x19, x2, lsl 8
-	str	w0, [x19,2056]
+	str	w0, [x19, 2056]
 	mov	w0, 150
-	str	w0, [x19,2052]
+	str	w0, [x19, 2052]
 	mov	x0, 1000
 	bl	__const_udelay
-	ldr	x1, [x29,40]
-	str	w1, [x19,2048]
-	str	wzr, [x19,2048]
-	str	wzr, [x19,2048]
-	str	wzr, [x19,2048]
-	ldr	x19, [sp,16]
-	ldp	x29, x30, [sp], 48
+	str	w20, [x19, 2048]
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
 	ret
 	.size	micron_auto_read_calibration_config, .-micron_auto_read_calibration_config
 	.align	2
 	.global	FlashEraseSLc2KBlocks
 	.type	FlashEraseSLc2KBlocks, %function
 FlashEraseSLc2KBlocks:
-	stp	x29, x30, [sp, -96]!
+	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x23, x24, [sp, 48]
+	mov	w23, 56
+	stp	x21, x22, [sp, 32]
 	adrp	x21, .LANCHOR0
-	str	x25, [sp,64]
-	stp	x23, x24, [sp,48]
+	umaddl	x23, w1, w23, x0
 	add	x21, x21, :lo12:.LANCHOR0
-	adrp	x23, .LC1
-	stp	x19, x20, [sp,16]
-	mov	w24, w1
+	stp	x19, x20, [sp, 16]
+	and	w22, w1, 255
 	mov	x20, x0
-	mov	w22, 0
-	add	x25, x21, 3220
-	add	x23, x23, :lo12:.LC1
-.L288:
-	cmp	w22, w24
-	beq	.L297
-	add	x2, x29, 88
-	sub	w4, w24, w22
-	mov	x0, x20
+	add	x24, x21, 3072
+.L315:
+	cmp	x20, x23
+	bne	.L320
+	ldp	x19, x20, [sp, 16]
+	mov	w0, 0
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 80
+	ret
+.L320:
 	mov	w1, 0
-	add	x3, x29, 92
+	mov	w4, w22
+	add	x3, x29, 76
+	add	x2, x29, 72
+	mov	x0, x20
 	bl	LogAddr2PhyAddr
-	ldr	w2, [x29,92]
-	ldrb	w0, [x21,3216]
-	cmp	w2, w0
-	bcc	.L289
+	ldrb	w1, [x21, 3216]
+	ldr	w0, [x29, 76]
+	cmp	w1, w0
+	bhi	.L316
 	mov	w0, -1
 	str	w0, [x20]
-	b	.L290
-.L289:
-	uxtw	x2, w2
-	mov	x0, 24
-	ldrb	w19, [x25,x2]
-	madd	x2, x2, x0, x21
+.L317:
+	sub	w22, w22, #1
+	add	x20, x20, 56
+	and	w22, w22, 255
+	b	.L315
+.L316:
+	uxtw	x0, w0
+	mov	x2, 24
+	add	x1, x24, x0
+	mul	x0, x0, x2
+	ldrb	w19, [x1, 148]
+	add	x1, x21, 3260
+	strb	w19, [x1, x0]
 	mov	w0, w19
-	strb	w19, [x2,3260]
 	bl	NandcWaitFlashReady
 	mov	w0, w19
 	bl	NandcFlashCs
-	ldr	w1, [x29,88]
+	ldr	w1, [x29, 72]
 	mov	w2, 0
 	mov	w0, w19
 	bl	FlashEraseCmd
 	mov	w0, w19
 	bl	NandcWaitFlashReady
-	ldr	w1, [x29,88]
+	ldr	w1, [x29, 72]
 	mov	w0, w19
 	bl	FlashReadStatus
 	sbfx	x0, x0, 0, 1
 	str	w0, [x20]
-	mov	w0, w19
-	ldr	w1, [x29,88]
-	ldr	w2, [x21,92]
-	add	w1, w2, w1
 	mov	w2, 0
+	ldr	w1, [x29, 72]
+	ldr	w0, [x21, 92]
+	add	w1, w1, w0
+	mov	w0, w19
 	bl	FlashEraseCmd
 	mov	w0, w19
 	bl	NandcWaitFlashReady
-	ldr	w1, [x29,88]
+	ldr	w1, [x29, 72]
 	mov	w0, w19
 	bl	FlashReadStatus
-	tbz	x0, 0, .L291
+	tbz	x0, 0, .L318
 	mov	w0, -1
 	str	w0, [x20]
-.L291:
+.L318:
 	ldr	w0, [x20]
 	cmn	w0, #1
-	bne	.L292
-	ldr	w1, [x29,88]
-	mov	x0, x23
+	bne	.L319
+	ldr	w1, [x29, 72]
+	adrp	x0, .LC1
+	add	x0, x0, :lo12:.LC1
 	bl	printk
-.L292:
+.L319:
 	mov	w0, w19
 	bl	NandcFlashDeCs
-.L290:
-	add	w22, w22, 1
-	add	x20, x20, 56
-	b	.L288
-.L297:
-	mov	w0, 0
-	ldr	x25, [sp,64]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 96
-	ret
+	b	.L317
 	.size	FlashEraseSLc2KBlocks, .-FlashEraseSLc2KBlocks
 	.align	2
 	.global	FlashEraseBlocks
 	.type	FlashEraseBlocks, %function
 FlashEraseBlocks:
-	stp	x29, x30, [sp, -128]!
+	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR0
-	mov	w20, 0
-	stp	x25, x26, [sp,64]
-	mov	w26, w1
+	stp	x25, x26, [sp, 64]
+	mov	w25, w1
 	add	x1, x19, :lo12:.LANCHOR0
-	stp	x23, x24, [sp,48]
-	stp	x21, x22, [sp,32]
-	stp	x27, x28, [sp,80]
-	mov	x24, x0
+	stp	x23, x24, [sp, 48]
+	stp	x21, x22, [sp, 32]
 	mov	w23, w2
-	ldrb	w1, [x1,88]
-	cbz	w1, .L299
+	str	x27, [sp, 80]
+	ldrb	w1, [x1, 88]
+	cbnz	w1, .L326
+	adrp	x26, .LANCHOR2
+	mov	x20, x0
+	add	x27, x26, :lo12:.LANCHOR2
+	mov	w21, 0
+.L327:
+	cmp	w21, w23
+	bcc	.L336
+	add	x19, x19, :lo12:.LANCHOR0
+	adrp	x22, .LANCHOR2
+	add	x24, x19, 3260
+	add	x22, x22, :lo12:.LANCHOR2
+	mov	x21, 0
+	mov	x26, 24
+.L337:
+	ldrb	w0, [x19, 3216]
+	cmp	w0, w21
+	bhi	.L339
+	adrp	x0, .LANCHOR2+2096
+	ldr	w0, [x0, #:lo12:.LANCHOR2+2096]
+	cbnz	w0, .L340
+.L341:
+	mov	w0, 0
+	b	.L325
+.L326:
 	mov	w1, w2
 	bl	FlashEraseSLc2KBlocks
-	b	.L300
-.L299:
-	mov	w27, 56
-	adrp	x28, .LANCHOR2
-	mov	x25, 24
-.L330:
-	cmp	w20, w23
-	bcs	.L331
-	umull	x5, w20, w27
+.L325:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldr	x27, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L336:
+	mov	w13, 56
+	add	x2, x29, 104
 	mov	w1, 0
-	add	x2, x29, 120
-	add	x21, x24, x5
-	sub	w4, w23, w20
-	mov	x0, x21
-	add	x3, x29, 124
-	str	x5, [x29,104]
+	sub	w4, w23, w21
+	umull	x13, w21, w13
+	add	x3, x29, 108
+	add	x22, x20, x13
+	mov	x0, x22
 	bl	LogAddr2PhyAddr
-	mov	w22, w0
+	mov	w24, w0
 	add	x1, x19, :lo12:.LANCHOR0
-	ldr	w0, [x29,124]
-	ldr	x5, [x29,104]
-	ldrb	w2, [x1,3216]
-	cmp	w0, w2
-	bcc	.L301
+	ldr	w0, [x29, 108]
+	ldrb	w2, [x1, 3216]
+	cmp	w2, w0
+	bhi	.L329
 	mov	w0, -1
-	str	w0, [x24,x5]
-	b	.L302
-.L301:
-	add	x2, x28, :lo12:.LANCHOR2
-	add	x1, x1, 3260
-	ldrb	w2, [x2,2094]
-	cmp	w2, wzr
-	uxtw	x2, w0
-	csel	w22, w22, wzr, ne
-	madd	x1, x2, x25, x1
-	ldr	x1, [x1,8]
-	cbz	x1, .L304
+	str	w0, [x20, x13]
+.L330:
+	add	w21, w21, 1
+	b	.L327
+.L329:
+	add	x2, x26, :lo12:.LANCHOR2
+	mov	x3, 24
+	ldrb	w2, [x2, 2094]
+	cmp	w2, 0
+	add	x2, x1, 3260
+	uxtw	x1, w0
+	csel	w24, w24, wzr, ne
+	madd	x1, x1, x3, x2
+	ldr	x1, [x1, 8]
+	cbz	x1, .L332
 	bl	FlashWaitCmdDone
-.L304:
+.L332:
 	add	x0, x19, :lo12:.LANCHOR0
-	ldr	w1, [x29,124]
-	add	x0, x0, 3260
-	ldr	w2, [x29,120]
-	madd	x0, x1, x25, x0
-	str	x21, [x0,8]
-	str	xzr, [x0,16]
-	str	w2, [x0,4]
-	cbz	w22, .L305
-	add	w2, w20, 1
-	umull	x2, w2, w27
-	add	x2, x24, x2
-	str	x2, [x0,16]
-.L305:
+	ldr	w1, [x29, 108]
+	add	x2, x0, 3260
+	mov	x0, 24
+	madd	x0, x1, x0, x2
+	ldr	w2, [x29, 104]
+	str	w2, [x0, 4]
+	stp	x22, xzr, [x0, 8]
+	cbz	w24, .L333
+	add	w2, w21, 1
+	mov	w3, 56
+	umaddl	x2, w2, w3, x20
+	str	x2, [x0, 16]
+.L333:
 	add	x0, x19, :lo12:.LANCHOR0
-	add	x2, x0, 3220
-	ldrb	w21, [x2,x1]
-	madd	x1, x1, x25, x0
-	mov	w0, w21
-	strb	w21, [x1,3260]
+	add	x2, x0, x1
+	add	x0, x0, 3260
+	ldrb	w22, [x2, 3220]
+	mov	x2, 24
+	mul	x1, x1, x2
+	strb	w22, [x0, x1]
+	mov	w0, w22
 	bl	NandcFlashCs
-	cmp	w26, 1
-	bne	.L306
-	adrp	x0, .LANCHOR2
-	add	x0, x0, :lo12:.LANCHOR2
-	ldrb	w0, [x0,1220]
-	cbz	w0, .L306
-	mov	w0, w21
+	cmp	w25, 1
+	bne	.L334
+	ldrb	w0, [x27, 1220]
+	cbz	w0, .L334
+	mov	w0, w22
 	bl	flash_enter_slc_mode
-	b	.L307
-.L306:
-	mov	w0, w21
-	bl	flash_exit_slc_mode
-.L307:
+.L335:
+	ldr	w1, [x29, 108]
 	add	x0, x19, :lo12:.LANCHOR0
-	ldr	w1, [x29,124]
 	add	x0, x0, 3228
-	add	w20, w20, w22
-	ldr	w0, [x0,x1,lsl 2]
-	ldr	w1, [x29,120]
-	cmp	w0, wzr
-	mov	w0, w21
+	add	w21, w21, w24
+	ldr	w0, [x0, x1, lsl 2]
+	ldr	w1, [x29, 104]
+	cmp	w0, 0
+	mov	w0, w22
 	cset	w2, ne
 	bl	FlashWaitReadyEN
-	ldr	w1, [x29,120]
-	mov	w0, w21
-	mov	w2, w22
+	ldr	w1, [x29, 104]
+	mov	w2, w24
+	mov	w0, w22
 	bl	FlashEraseCmd
-	mov	w0, w21
+	mov	w0, w22
 	bl	NandcFlashDeCs
-.L302:
-	add	w20, w20, 1
 	b	.L330
-.L331:
-	add	x19, x19, :lo12:.LANCHOR0
-	mov	x20, 0
-	adrp	x21, .LANCHOR2
-	add	x22, x19, 3260
-	mov	x25, 24
-.L309:
-	ldrb	w0, [x19,3216]
-	cmp	w0, w20
-	bls	.L332
-	mov	w0, w20
+.L334:
+	mov	w0, w22
+	bl	flash_exit_slc_mode
+	b	.L335
+.L339:
+	mov	w0, w21
 	bl	FlashWaitCmdDone
-	cmp	w26, 1
-	bne	.L310
-	add	x0, x21, :lo12:.LANCHOR2
-	ldrb	w0, [x0,1220]
-	cbz	w0, .L310
-	mul	x0, x20, x25
-	ldrb	w0, [x0,x22]
+	cmp	w25, 1
+	bne	.L338
+	ldrb	w0, [x22, 1220]
+	cbz	w0, .L338
+	mul	x0, x21, x26
+	ldrb	w0, [x0, x24]
 	bl	flash_exit_slc_mode
-.L310:
-	add	x20, x20, 1
-	b	.L309
-.L332:
-	adrp	x0, .LANCHOR2+2096
-	ldr	w0, [x0,#:lo12:.LANCHOR2+2096]
-	cbnz	w0, .L312
-.L314:
-	mov	w0, 0
-	b	.L300
-.L312:
+.L338:
+	add	x21, x21, 1
+	b	.L337
+.L340:
 	adrp	x0, IDByte
-	ldrb	w0, [x0,#:lo12:IDByte]
+	ldrb	w0, [x0, #:lo12:IDByte]
 	cmp	w0, 69
-	bne	.L314
-	mov	x0, 0
-	mov	x1, 56
-.L313:
-	cmp	w23, w0
-	bls	.L314
-	mul	x2, x0, x1
-	add	x0, x0, 1
-	str	wzr, [x24,x2]
-	b	.L313
-.L300:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
-	ret
+	bne	.L341
+	mov	w0, 56
+	umaddl	x23, w23, w0, x20
+.L342:
+	cmp	x23, x20
+	beq	.L341
+	str	wzr, [x20], 56
+	b	.L342
 	.size	FlashEraseBlocks, .-FlashEraseBlocks
 	.align	2
 	.global	HynixGetReadRetryDefault
 	.type	HynixGetReadRetryDefault, %function
 HynixGetReadRetryDefault:
-	stp	x29, x30, [sp, -144]!
-	mov	w4, -83
-	mov	w3, -82
+	stp	x29, x30, [sp, -128]!
+	mov	w3, -83
+	mov	w2, -82
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR2
-	stp	x25, x26, [sp,64]
-	mov	w26, w0
-	add	x0, x20, :lo12:.LANCHOR2
-	add	x1, x0, 1232
-	cmp	w26, 2
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x27, x28, [sp,80]
-	strb	w26, [x0,1232]
-	mov	w0, -84
-	strb	w4, [x1,5]
-	strb	w0, [x1,4]
-	mov	w0, -81
-	strb	w3, [x1,6]
-	strb	w0, [x1,7]
-	bne	.L334
-	mov	w0, -89
-	strb	w0, [x1,4]
+	stp	x21, x22, [sp, 32]
+	adrp	x21, .LANCHOR2
+	add	x1, x21, :lo12:.LANCHOR2
+	stp	x19, x20, [sp, 16]
+	mov	w20, w0
+	add	x0, x1, 1232
+	stp	x23, x24, [sp, 48]
+	cmp	w20, 2
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	strb	w20, [x1, 1232]
+	mov	w1, -84
+	strb	w3, [x0, 5]
+	strb	w1, [x0, 4]
+	mov	w1, -81
+	strb	w2, [x0, 6]
+	strb	w1, [x0, 7]
+	bne	.L358
+	mov	w1, -89
+	strb	w1, [x0, 4]
 	adrp	x0, .LANCHOR1+3401
 	mov	w1, -9
-	strb	w1, [x0,#:lo12:.LANCHOR1+3401]
-	b	.L397
-.L334:
-	cmp	w26, 3
-	bne	.L336
-	mov	w0, -80
-	strb	w0, [x1,4]
-	mov	w0, -79
-	strb	w0, [x1,5]
-	mov	w0, -78
-	strb	w0, [x1,6]
-	mov	w0, -77
-	strb	w0, [x1,7]
-	mov	w0, -76
-	strb	w0, [x1,8]
-	mov	w0, -75
-	strb	w0, [x1,9]
-	mov	w0, -74
-	strb	w0, [x1,10]
-	mov	w0, -73
-	b	.L437
-.L336:
-	cmp	w26, 4
-	bne	.L337
-	mov	w5, -52
-	strb	w5, [x1,4]
-	mov	w5, -65
-	strb	w5, [x1,5]
-	mov	w5, -86
-	strb	w5, [x1,6]
-	mov	w5, -85
-	strb	w4, [x1,9]
-	strb	w5, [x1,7]
-	mov	w5, -51
-	strb	w3, [x1,10]
-	strb	w5, [x1,8]
-.L437:
-	mov	w28, 8
-	strb	w0, [x1,11]
-	mov	w27, w28
-	b	.L335
-.L337:
-	cmp	w26, 5
-	bne	.L338
-	mov	w0, 56
-	strb	w0, [x1,4]
-	mov	w0, 57
-	strb	w0, [x1,5]
-	mov	w0, 58
-	mov	w28, 8
-	strb	w0, [x1,6]
-	mov	w0, 59
-	strb	w0, [x1,7]
-	b	.L438
-.L338:
-	cmp	w26, 6
-	bne	.L339
-	mov	w0, 14
-	strb	w0, [x1,4]
-	mov	w0, 15
-	strb	w0, [x1,5]
-	mov	w0, 16
-	mov	w28, 12
-	strb	w0, [x1,6]
-	mov	w0, 17
-	strb	w0, [x1,7]
-	b	.L438
-.L339:
-	cmp	w26, 7
-	bne	.L340
-	mov	w0, -80
-	strb	w0, [x1,4]
-	mov	w0, -79
-	strb	w0, [x1,5]
-	mov	w0, -78
-	strb	w0, [x1,6]
-	mov	w0, -77
-	strb	w0, [x1,7]
-	mov	w0, -76
-	strb	w0, [x1,8]
-	mov	w0, -75
-	strb	w0, [x1,9]
-	mov	w0, -74
-	strb	w0, [x1,10]
-	mov	w0, -73
-	strb	w0, [x1,11]
-	mov	w0, -44
-	mov	w28, 12
-	strb	w0, [x1,12]
-	mov	w27, 10
-	mov	w0, -43
-	strb	w0, [x1,13]
-	b	.L335
-.L340:
-	cmp	w26, 8
-	bne	.L397
-	mov	w0, 6
-	strb	w0, [x1,4]
-	mov	w0, 7
-	strb	w0, [x1,5]
-	mov	w0, 9
-	strb	w26, [x1,6]
-	strb	w0, [x1,7]
-	mov	w28, 50
-	mov	w0, 10
-	mov	w27, 5
-	strb	w0, [x1,8]
-	b	.L335
-.L397:
-	mov	w28, 7
-.L438:
-	mov	w27, 4
-.L335:
-	sub	w0, w26, #1
+	strb	w1, [x0, #:lo12:.LANCHOR1+3401]
+.L423:
+	mov	w27, 7
+	b	.L467
+.L358:
+	cmp	w20, 3
+	bne	.L360
+	mov	w1, -80
+	strb	w1, [x0, 4]
+	mov	w1, -79
+	strb	w1, [x0, 5]
+	mov	w1, -78
+	strb	w1, [x0, 6]
+	mov	w1, -77
+	strb	w1, [x0, 7]
+	mov	w1, -76
+	strb	w1, [x0, 8]
+	mov	w1, -75
+	strb	w1, [x0, 9]
+	mov	w1, -74
+	strb	w1, [x0, 10]
+	mov	w1, -73
+.L466:
+	mov	w27, 8
+	mov	w28, w27
+	strb	w1, [x0, 11]
+.L359:
+	sub	w0, w20, #1
 	cmp	w0, 1
-	bhi	.L434
-	adrp	x23, .LANCHOR0
-	adrp	x24, .LANCHOR1
-	add	x23, x23, :lo12:.LANCHOR0
-	add	x24, x24, :lo12:.LANCHOR1
-	mov	w21, 0
-	add	x4, x23, 3220
-	add	x5, x20, :lo12:.LANCHOR2
-	add	x24, x24, 3384
-.L341:
-	ldrb	w0, [x23,3216]
-	cmp	w0, w21
-	bls	.L348
-	ldrb	w1, [x4,w21,sxtw]
-	add	x0, x5, 1232
-	add	x2, x23, 24
-	mov	x25, 0
-	mov	x22, x0
-	add	x19, x0, x1, lsl 6
-	lsl	x1, x1, 4
-	add	x3, x2, x1
+	bhi	.L365
+	adrp	x25, .LANCHOR0
+	adrp	x26, .LANCHOR1
+	add	x25, x25, :lo12:.LANCHOR0
+	add	x26, x26, :lo12:.LANCHOR1
+	add	x3, x25, 3072
+	add	x26, x26, 3384
+	mov	w24, 0
+.L366:
+	ldrb	w0, [x25, 3216]
+	cmp	w0, w24
+	bhi	.L372
+.L373:
+	add	x21, x21, :lo12:.LANCHOR2
+	ldp	x19, x20, [sp, 16]
+	strb	w28, [x21, 1233]
+	strb	w27, [x21, 1234]
+	ldp	x23, x24, [sp, 48]
+	ldp	x21, x22, [sp, 32]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 128
+	ret
+.L360:
+	cmp	w20, 4
+	bne	.L361
+	mov	w4, -52
+	strb	w4, [x0, 4]
+	mov	w4, -65
+	strb	w4, [x0, 5]
+	mov	w4, -86
+	strb	w4, [x0, 6]
+	mov	w4, -85
+	strb	w3, [x0, 9]
+	strb	w4, [x0, 7]
+	mov	w4, -51
+	strb	w2, [x0, 10]
+	strb	w4, [x0, 8]
+	b	.L466
+.L361:
+	cmp	w20, 5
+	bne	.L362
+	mov	w1, 56
+	strb	w1, [x0, 4]
+	mov	w1, 57
+	strb	w1, [x0, 5]
+	mov	w1, 58
+	mov	w27, 8
+	strb	w1, [x0, 6]
+	mov	w1, 59
+	strb	w1, [x0, 7]
+.L467:
+	mov	w28, 4
+	b	.L359
+.L362:
+	cmp	w20, 6
+	bne	.L363
+	mov	w1, 14
+	strb	w1, [x0, 4]
+	mov	w1, 15
+	strb	w1, [x0, 5]
+	mov	w1, 16
+	mov	w27, 12
+	strb	w1, [x0, 6]
+	mov	w1, 17
+	strb	w1, [x0, 7]
+	b	.L467
+.L363:
+	cmp	w20, 7
+	bne	.L364
+	mov	w1, -80
+	strb	w1, [x0, 4]
+	mov	w1, -79
+	strb	w1, [x0, 5]
+	mov	w1, -78
+	strb	w1, [x0, 6]
+	mov	w1, -77
+	strb	w1, [x0, 7]
+	mov	w1, -76
+	strb	w1, [x0, 8]
+	mov	w1, -75
+	strb	w1, [x0, 9]
+	mov	w1, -74
+	strb	w1, [x0, 10]
+	mov	w1, -73
+	strb	w1, [x0, 11]
+	mov	w1, -44
+	mov	w27, 12
+	strb	w1, [x0, 12]
+	mov	w28, 10
+	mov	w1, -43
+	strb	w1, [x0, 13]
+	b	.L359
+.L364:
+	cmp	w20, 8
+	bne	.L423
+	mov	w1, 6
+	strb	w1, [x0, 4]
+	mov	w1, 7
+	strb	w1, [x0, 5]
+	mov	w1, 9
+	strb	w20, [x0, 6]
+	strb	w1, [x0, 7]
+	mov	w27, 50
+	mov	w1, 10
+	mov	w28, 5
+	strb	w1, [x0, 8]
+	b	.L359
+.L372:
+	add	x0, x3, w24, sxtw
+	mov	x22, 0
+	ldrb	w1, [x0, 148]
+	add	x0, x21, :lo12:.LANCHOR2
+	add	x0, x0, 1232
+	mov	x20, x0
+	ubfiz	x19, x1, 6, 8
+	sbfiz	x1, x1, 4, 32
+	add	x2, x25, x1
 	add	x19, x19, 20
-	ldr	x26, [x2,x1]
-	ldrb	w1, [x3,8]
-	add	x26, x26, x1, lsl 8
+	add	x19, x0, x19
+	ldr	x1, [x25, x1]
+	ldrb	w23, [x2, 8]
+	add	x23, x1, x23, lsl 8
 	mov	w1, 55
-.L343:
-	add	x0, x22, x25
-	str	w1, [x26,2056]
-	str	x5, [x29,120]
-	str	x4, [x29,128]
-	ldrb	w0, [x0,4]
-	str	w0, [x26,2052]
+.L367:
+	add	x0, x20, x22
+	str	w1, [x23, 2056]
+	str	x3, [x29, 112]
+	str	w1, [x29, 124]
+	ldrb	w0, [x0, 4]
+	str	w0, [x23, 2052]
 	mov	x0, 400
-	str	x1, [x29,136]
 	bl	__const_udelay
-	ldr	w0, [x26,2048]
-	strb	w0, [x19,x25]
-	add	x25, x25, 1
-	ldr	x1, [x29,136]
-	cmp	w27, w25, uxtb
-	ldr	x4, [x29,128]
-	ldr	x5, [x29,120]
-	bhi	.L343
+	ldr	w0, [x23, 2048]
+	strb	w0, [x19, x22]
+	add	x22, x22, 1
+	cmp	w28, w22, uxtb
+	ldr	w1, [x29, 124]
+	ldr	x3, [x29, 112]
+	bhi	.L367
 	mov	x0, 0
-.L344:
-	add	w2, w0, 8
-	mov	x1, 0
-.L345:
-	add	x3, x1, x0
-	add	x1, x1, 4
-	add	x3, x24, x3
-	cmp	x1, 24
-	ldrb	w6, [x3,4]
-	ldrb	w3, [x19,x0]
-	add	w3, w6, w3
-	strb	w3, [x19,w2,sxtw]
-	add	w2, w2, 8
-	bne	.L345
+.L370:
+	add	x1, x0, 4
+	add	x2, x0, 28
+	add	w5, w0, 8
+	add	x1, x26, x1
+	add	x2, x26, x2
+.L369:
+	ldrb	w6, [x19, x0]
+	ldrb	w7, [x1], 4
+	add	w6, w6, w7
+	strb	w6, [x19, w5, sxtw]
+	cmp	x2, x1
+	add	w5, w5, 8
+	bne	.L369
 	add	x0, x0, 1
 	cmp	x0, 4
-	bne	.L344
-	add	w21, w21, 1
-	strb	wzr, [x19,16]
-	strb	wzr, [x19,24]
-	strb	wzr, [x19,32]
-	uxtb	w21, w21
-	strb	wzr, [x19,40]
-	strb	wzr, [x19,48]
-	strb	wzr, [x19,41]
-	strb	wzr, [x19,49]
-	b	.L341
-.L434:
-	sub	w0, w26, #3
+	bne	.L370
+	add	w24, w24, 1
+	strb	wzr, [x19, 16]
+	strb	wzr, [x19, 24]
+	and	w24, w24, 255
+	strb	wzr, [x19, 32]
+	strb	wzr, [x19, 40]
+	strb	wzr, [x19, 48]
+	strb	wzr, [x19, 41]
+	strb	wzr, [x19, 49]
+	b	.L366
+.L365:
+	sub	w0, w20, #3
 	cmp	w0, 5
-	bhi	.L348
-	mul	w0, w27, w28
+	bhi	.L373
+	mul	w26, w28, w27
+	sub	w25, w28, #1
 	adrp	x24, .LANCHOR0
-	sub	w25, w27, #1
-	asr	w23, w0, 1
-	lsl	w0, w0, 4
-	add	x24, x24, :lo12:.LANCHOR0
-	str	w0, [x29,136]
+	and	x25, x25, 255
+	mov	w22, 0
+	lsl	w0, w26, 4
+	asr	w23, w26, 1
+	str	w0, [x29, 112]
+	add	x26, x24, :lo12:.LANCHOR0
 	lsl	w0, w23, 1
-	uxtb	x25, w25
-	str	w0, [x29,128]
-	add	x0, x24, 3220
-	mov	w21, 0
-	str	x0, [x29,120]
+	str	w0, [x29, 124]
 	add	x0, x25, 1
-	str	x0, [x29,112]
-.L349:
-	ldrb	w0, [x24,3216]
-	adrp	x25, .LANCHOR0
-	cmp	w0, w21
-	bhi	.L395
-.L348:
-	add	x20, x20, :lo12:.LANCHOR2
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	strb	w27, [x20,1233]
-	strb	w28, [x20,1234]
-	ldp	x25, x26, [sp,64]
-	ldp	x19, x20, [sp,16]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 144
-	ret
-.L395:
-	ldr	x0, [x29,120]
-	ldrb	w1, [x0,w21,sxtw]
-	add	x0, x24, 24
-	str	x1, [x29,104]
-	lsl	x3, x1, 4
-	mov	x22, x1
-	add	x7, x0, x3
-	ldr	x0, [x0,x3]
-	ldrb	w19, [x7,8]
+	str	x0, [x29, 104]
+.L374:
+	ldrb	w0, [x26, 3216]
+	cmp	w0, w22
+	bls	.L373
+	add	x0, x26, w22, sxtw
+	ldrb	w25, [x0, 3220]
+	sbfiz	x0, x25, 4, 32
+	add	x1, x26, x0
+	ldr	x0, [x26, x0]
+	ldrb	w19, [x1, 8]
 	add	x19, x0, x19, lsl 8
 	mov	w0, 255
-	str	w0, [x19,2056]
-	mov	w0, w1
+	str	w0, [x19, 2056]
+	mov	w0, w25
 	bl	NandcWaitFlashReady
-	cmp	w26, 7
-	sub	w7, w26, #5
-	ldr	x1, [x29,104]
-	bne	.L350
-	add	x3, x20, :lo12:.LANCHOR2
-	mov	x0, 160
-	madd	x3, x1, x0, x3
-	add	x3, x3, 1260
-	b	.L351
-.L350:
-	cmp	w26, 8
-	beq	.L352
-	add	x3, x20, :lo12:.LANCHOR2
-	add	x3, x3, x1, lsl 6
-	add	x3, x3, 1252
-.L351:
+	cmp	w20, 7
+	sub	w6, w20, #5
+	bne	.L375
+	mov	x1, 28
+	mov	w0, 160
+	add	x2, x21, :lo12:.LANCHOR2
+	umaddl	x0, w0, w25, x1
+	add	x2, x2, 1232
+	add	x2, x2, x0
+.L376:
 	mov	w0, 54
-	cmp	w26, 4
-	str	w0, [x19,2056]
-	bne	.L353
+	str	w0, [x19, 2056]
+	cmp	w20, 4
+	bne	.L378
 	mov	w0, 255
-	str	w0, [x19,2052]
+	str	w0, [x19, 2052]
 	mov	w0, 64
-	str	w0, [x19,2048]
+	str	w0, [x19, 2048]
 	mov	w0, 204
-	b	.L439
-.L353:
-	cmp	w7, 1
-	bhi	.L355
-	add	x0, x20, :lo12:.LANCHOR2
-	ldrb	w0, [x0,1236]
-	str	w0, [x19,2052]
-	mov	w0, 82
-	b	.L440
-.L355:
-	cmp	w26, 7
-	bne	.L354
-	mov	w0, 174
-	str	w0, [x19,2052]
-	str	wzr, [x19,2048]
-	mov	w0, 176
-.L439:
-	str	w0, [x19,2052]
+.L468:
+	str	w0, [x19, 2052]
 	mov	w0, 77
-.L440:
-	str	w0, [x19,2048]
-.L354:
+	b	.L469
+.L375:
+	cmp	w20, 8
+	beq	.L377
+	add	x2, x21, :lo12:.LANCHOR2
+	ubfiz	x0, x25, 6, 8
+	add	x2, x2, x0
+	add	x2, x2, 1252
+	b	.L376
+.L378:
+	cmp	w6, 1
+	bhi	.L380
+	add	x0, x21, :lo12:.LANCHOR2
+	ldrb	w0, [x0, 1236]
+	str	w0, [x19, 2052]
+	mov	w0, 82
+.L469:
+	str	w0, [x19, 2048]
+.L379:
 	mov	w0, 22
-	str	w0, [x19,2056]
+	str	w0, [x19, 2056]
 	mov	w0, 23
-	str	w0, [x19,2056]
+	str	w0, [x19, 2056]
 	mov	w0, 4
-	str	w0, [x19,2056]
+	str	w0, [x19, 2056]
 	mov	w0, 25
-	str	w0, [x19,2056]
-	str	wzr, [x19,2056]
-	cmp	w26, 6
-	str	wzr, [x19,2052]
-	str	wzr, [x19,2052]
-	bne	.L356
+	str	w0, [x19, 2056]
+	str	wzr, [x19, 2056]
+	cmp	w20, 6
+	str	wzr, [x19, 2052]
+	str	wzr, [x19, 2052]
+	bne	.L381
 	mov	w0, 31
-	str	w0, [x19,2052]
-	b	.L357
-.L356:
-	str	wzr, [x19,2052]
-.L357:
+	str	w0, [x19, 2052]
+.L382:
 	mov	w0, 2
-	str	w0, [x19,2052]
-	str	wzr, [x19,2052]
-.L396:
+	str	w0, [x19, 2052]
+	str	wzr, [x19, 2052]
+.L422:
 	mov	w0, 48
-	str	w0, [x19,2056]
-	mov	w0, w22
-	str	x7, [x29,96]
-	str	x3, [x29,104]
+	str	w0, [x19, 2056]
+	str	x2, [x29, 96]
+	mov	w0, w25
+	str	w6, [x29, 120]
 	bl	NandcWaitFlashReady
-	ldr	x7, [x29,96]
-	ldr	x3, [x29,104]
-	cmp	w7, 1
-	cset	w8, ls
-	cmp	w26, 8
-	cset	w7, eq
-	cbnz	w8, .L399
-	cbnz	w7, .L399
-	cmp	w26, 7
-	mov	w1, 32
+	ldr	w6, [x29, 120]
+	ldr	x2, [x29, 96]
+	cmp	w6, 1
+	ccmp	w20, 8, 4, hi
+	beq	.L424
+	cmp	w20, 7
 	mov	w0, 2
-	csel	w1, w0, w1, ne
-	b	.L358
-.L399:
-	mov	w1, 16
-.L358:
-	ldr	x0, [x25,#:lo12:.LANCHOR0]
-	mov	x9, 0
-.L359:
-	ldr	w10, [x19,2048]
-	strb	w10, [x0,x9]
-	add	x9, x9, 1
-	cmp	w1, w9, uxtb
-	bhi	.L359
-	cbz	w7, .L360
+	mov	w1, 32
+	csel	w1, w1, w0, eq
+.L383:
+	add	x0, x24, :lo12:.LANCHOR0
+	mov	x7, 0
+	ldr	x0, [x0, 64]
+.L384:
+	ldr	w8, [x19, 2048]
+	strb	w8, [x0, x7]
+	add	x7, x7, 1
+	cmp	w1, w7, uxtb
+	bhi	.L384
+	cmp	w20, 8
+	bne	.L385
 	mov	w1, 0
-.L362:
-	ldrb	w9, [x0]
-	cmp	w9, 50
-	beq	.L361
-	ldrb	w9, [x0,1]
-	cmp	w9, 5
-	beq	.L361
+.L387:
+	ldrb	w7, [x0]
+	cmp	w7, 50
+	beq	.L386
+	ldrb	w7, [x0, 1]
+	cmp	w7, 5
+	beq	.L386
 	add	w1, w1, 1
 	add	x0, x0, 4
-	uxtb	w1, w1
+	and	w1, w1, 255
 	cmp	w1, 8
-	bne	.L362
-	b	.L363
-.L361:
+	bne	.L387
+.L388:
+	adrp	x0, .LC2
+	mov	w1, 0
+	add	x0, x0, :lo12:.LC2
+	bl	printk
+.L390:
+	b	.L390
+.L380:
+	cmp	w20, 7
+	bne	.L379
+	mov	w0, 174
+	str	w0, [x19, 2052]
+	str	wzr, [x19, 2048]
+	mov	w0, 176
+	b	.L468
+.L381:
+	str	wzr, [x19, 2052]
+	b	.L382
+.L424:
+	mov	w1, 16
+	b	.L383
+.L386:
 	cmp	w1, 6
-	bls	.L364
-.L363:
+	bhi	.L388
+.L389:
+	add	x0, x24, :lo12:.LANCHOR0
+	ldr	x7, [x0, 64]
+	mov	x0, 0
+.L399:
+	ldr	w1, [x29, 112]
+	cmp	w1, w0
+	bgt	.L400
+	add	x0, x24, :lo12:.LANCHOR0
+	mov	w9, w23
+	mov	w8, 8
+	ldr	x11, [x0, 64]
+.L402:
+	mov	w0, 0
+.L401:
+	add	w1, w0, w9
+	add	w0, w0, 1
+	sbfiz	x1, x1, 1, 32
+	cmp	w23, w0
+	ldrh	w10, [x11, x1]
+	mvn	w10, w10
+	strh	w10, [x11, x1]
+	bgt	.L401
+	ldr	w0, [x29, 124]
+	subs	w8, w8, #1
+	add	w9, w9, w0
+	bne	.L402
+	mov	x1, 0
+	mov	w14, 1
+.L408:
+	mov	w0, 0
+	mov	w8, 0
+.L407:
+	mov	w10, w1
+	lsl	w13, w14, w8
+	mov	w12, 16
+	mov	w9, 0
+.L405:
+	ldrh	w15, [x11, w10, sxtw 1]
+	add	w10, w10, w23
+	bics	wzr, w13, w15
+	cinc	w9, w9, eq
+	subs	w12, w12, #1
+	bne	.L405
+	cmp	w9, 8
+	bls	.L406
+	orr	w0, w0, w13
+	and	w0, w0, 65535
+.L406:
+	add	w8, w8, 1
+	cmp	w8, 16
+	bne	.L407
+	strh	w0, [x11, x1, lsl 1]
+	add	x1, x1, 1
+	cmp	w23, w1
+	bgt	.L408
+	add	x0, x24, :lo12:.LANCHOR0
+	mov	w8, 0
+	ldr	x1, [x0, 64]
+	mov	x0, 0
+.L411:
+	ldr	w9, [x1, x0]
+	add	x0, x0, 4
+	cmp	w9, 0
+	cinc	w8, w8, eq
+	cmp	x0, 32
+	bne	.L411
+	cmp	w8, 7
+	ble	.L412
+	mov	w3, 1024
+	mov	w2, 1
+	adrp	x0, .LC3
+	add	x0, x0, :lo12:.LC3
+	bl	rknand_print_hex
 	adrp	x0, .LC2
 	mov	w1, 0
 	add	x0, x0, :lo12:.LC2
 	bl	printk
-.L365:
-	b	.L365
-.L360:
-	cmp	w26, 7
-	bne	.L366
-	mov	w1, w7
-.L368:
-	ldrb	w9, [x0]
-	cmp	w9, 12
-	beq	.L367
-	ldrb	w9, [x0,1]
-	cmp	w9, 10
-	beq	.L367
+.L413:
+	b	.L413
+.L385:
+	cmp	w20, 7
+	bne	.L391
+	mov	w1, 0
+.L393:
+	ldrb	w7, [x0]
+	cmp	w7, 12
+	beq	.L392
+	ldrb	w7, [x0, 1]
+	cmp	w7, 10
+	beq	.L392
 	add	w1, w1, 1
 	add	x0, x0, 4
-	uxtb	w1, w1
+	and	w1, w1, 255
 	cmp	w1, 8
-	bne	.L368
-	b	.L369
-.L367:
-	cmp	w1, 7
-	bne	.L364
-.L369:
+	bne	.L393
+.L394:
 	adrp	x0, .LC2
 	mov	w1, 0
 	add	x0, x0, :lo12:.LC2
 	bl	printk
-.L370:
-	b	.L370
-.L366:
-	cmp	w26, 6
-	bne	.L364
+.L395:
+	b	.L395
+.L392:
+	cmp	w1, 6
+	bls	.L389
+	b	.L394
+.L391:
+	cmp	w20, 6
+	bne	.L389
 	mov	x1, 0
-.L371:
-	ldrb	w9, [x0,x1]
-	cmp	w9, 12
-	beq	.L364
-	add	x9, x0, x1
-	ldrb	w9, [x9,8]
-	cmp	w9, 4
-	beq	.L364
+.L396:
+	ldrb	w7, [x0, x1]
+	cmp	w7, 12
+	beq	.L389
+	add	x7, x0, x1
+	ldrb	w7, [x7, 8]
+	cmp	w7, 4
+	beq	.L389
 	add	x1, x1, 1
 	cmp	x1, 8
-	bne	.L371
+	bne	.L396
 	adrp	x0, .LC2
 	mov	w1, 0
 	add	x0, x0, :lo12:.LC2
 	bl	printk
-.L373:
-	b	.L373
-.L364:
-	ldr	x10, [x25,#:lo12:.LANCHOR0]
+.L398:
+	b	.L398
+.L400:
+	ldr	w1, [x19, 2048]
+	strb	w1, [x7, x0]
+	add	x0, x0, 1
+	b	.L399
+.L412:
+	cmp	w20, 6
+	beq	.L426
+	cmp	w20, 7
+	beq	.L427
+	cmp	w20, 8
+	mov	w0, 8
+	mov	w1, 5
+	csel	w1, w1, w0, eq
+.L414:
+	mov	w8, 0
+.L415:
 	mov	x0, 0
-.L374:
-	ldr	w1, [x29,136]
-	cmp	w1, w0
-	ble	.L442
-	ldr	w1, [x19,2048]
-	strb	w1, [x10,x0]
+.L416:
+	add	w9, w12, w0
+	ldrb	w10, [x7, x0]
 	add	x0, x0, 1
-	b	.L374
-.L442:
-	ldr	x12, [x25,#:lo12:.LANCHOR0]
-	mov	w11, w23
-	mov	w9, 8
-.L377:
-	mov	w0, 0
-.L376:
-	add	w1, w0, w11
-	add	w0, w0, 1
-	sbfiz	x1, x1, 1, 32
-	cmp	w0, w23
-	ldrh	w13, [x12,x1]
-	mvn	w13, w13
-	strh	w13, [x12,x1]
-	bne	.L376
-	ldr	w0, [x29,128]
-	subs	w9, w9, #1
-	add	w11, w11, w0
-	bne	.L377
-	mov	x9, 0
-	mov	w17, 1
-.L378:
-	mov	w1, 0
-	mov	w11, w1
-.L382:
-	lsl	w13, w17, w11
-	mov	w15, w9
-	mov	w0, 16
-	mov	w14, 0
-.L380:
-	ldrh	w16, [x12,w15,sxtw 1]
-	add	w15, w15, w23
-	and	w16, w16, w13
-	cmp	w16, w13
-	csinc	w14, w14, w14, ne
-	subs	w0, w0, #1
-	bne	.L380
-	cmp	w14, 8
-	bls	.L381
-	orr	w1, w1, w13
-	uxth	w1, w1
-.L381:
-	add	w11, w11, 1
-	cmp	w11, 16
-	bne	.L382
-	strh	w1, [x12,x9,lsl 1]
-	add	x9, x9, 1
-	cmp	w23, w9
-	bgt	.L378
-	mov	x6, 0
-	ldr	x1, [x25,#:lo12:.LANCHOR0]
-	mov	w9, w6
-.L385:
-	ldr	w11, [x1,x6]
-	add	x6, x6, 4
-	cmp	w11, wzr
-	csinc	w9, w9, w9, ne
-	cmp	x6, 32
-	bne	.L385
-	cmp	w9, 7
-	ble	.L386
-	adrp	x0, .LC3
-	mov	w2, 1
-	add	x0, x0, :lo12:.LC3
-	mov	w3, 1024
-	bl	rknand_print_hex
-	adrp	x0, .LC2
-	mov	w1, 0
-	add	x0, x0, :lo12:.LC2
-	bl	printk
-.L387:
-	b	.L387
-.L386:
-	cmp	w26, 6
-	mov	w6, 4
-	beq	.L388
-	cmp	w26, 7
-	mov	w6, 10
-	beq	.L388
-	cmp	w7, wzr
-	mov	w6, 5
-	mov	w1, 8
-	csel	w6, w1, w6, eq
-.L388:
-	mov	w9, 0
-.L389:
-	mov	x1, 0
-.L390:
-	add	w11, w0, w1
-	ldrb	w12, [x10,x1]
-	add	x1, x1, 1
-	cmp	w27, w1, uxtb
-	strb	w12, [x3,w11,sxtw]
-	bhi	.L390
-	add	w9, w9, 1
-	ldr	x1, [x29,112]
-	cmp	w9, w28
-	add	w0, w0, w6
-	add	x10, x10, x1
-	blt	.L389
+	cmp	w28, w0, uxtb
+	strb	w10, [x2, w9, sxtw]
+	bhi	.L416
+	ldr	x0, [x29, 104]
+	add	w8, w8, 1
+	add	w12, w12, w1
+	cmp	w27, w8
+	add	x7, x7, x0
+	bgt	.L415
 	mov	w0, 255
-	str	w0, [x19,2056]
-	mov	w0, w22
-	str	x7, [x29,96]
-	str	x8, [x29,104]
+	str	w0, [x19, 2056]
+	str	w6, [x29, 96]
+	mov	w0, w25
 	bl	NandcWaitFlashReady
-	ldr	x8, [x29,104]
-	ldr	x7, [x29,96]
-	cbz	w8, .L392
+	ldr	w6, [x29, 96]
+	cmp	w6, 1
+	bhi	.L418
 	mov	w0, 54
-	str	w0, [x19,2056]
+	str	w0, [x19, 2056]
 	adrp	x0, .LANCHOR2+1236
 	mov	w1, -1
-	ldrb	w0, [x0,#:lo12:.LANCHOR2+1236]
-	str	w0, [x19,2052]
+	ldrb	w0, [x0, #:lo12:.LANCHOR2+1236]
+	str	w0, [x19, 2052]
+	str	wzr, [x19, 2048]
 	mov	w0, 22
-	str	wzr, [x19,2048]
-	str	w0, [x19,2056]
-	mov	w0, w21
+	str	w0, [x19, 2056]
+	mov	w0, w22
 	bl	FlashReadCmd
-	b	.L393
-.L392:
+.L419:
+	add	w22, w22, 1
+	mov	w0, w25
+	and	w22, w22, 255
+	bl	NandcWaitFlashReady
+	b	.L374
+.L426:
+	mov	w1, 4
+	b	.L414
+.L427:
+	mov	w1, 10
+	b	.L414
+.L418:
+	cmp	w20, 8
+	bne	.L420
 	mov	w0, 190
-	cbnz	w7, .L441
+.L470:
+	str	w0, [x19, 2056]
+	b	.L419
+.L420:
 	mov	w0, 56
-.L441:
-	str	w0, [x19,2056]
-.L393:
-	mov	w0, w22
-	add	w21, w21, 1
-	bl	NandcWaitFlashReady
-	uxtb	w21, w21
-	b	.L349
-.L352:
+	b	.L470
+.L377:
 	mov	w0, 120
-	str	w0, [x19,2056]
-	str	wzr, [x19,2052]
+	str	w0, [x19, 2056]
+	str	wzr, [x19, 2052]
 	mov	w0, 23
-	str	wzr, [x19,2052]
+	str	wzr, [x19, 2052]
 	mov	w1, 25
-	str	wzr, [x19,2052]
-	add	x3, x20, :lo12:.LANCHOR2
-	str	w0, [x19,2056]
+	str	wzr, [x19, 2052]
+	add	x2, x21, :lo12:.LANCHOR2
+	str	w0, [x19, 2056]
 	mov	w0, 4
-	str	w0, [x19,2056]
-	add	x3, x3, 1260
-	str	w1, [x19,2056]
+	str	w0, [x19, 2056]
+	add	x2, x2, 1260
+	str	w1, [x19, 2056]
 	mov	w1, 218
-	str	w1, [x19,2056]
+	str	w1, [x19, 2056]
 	mov	w1, 21
-	str	wzr, [x19,2056]
-	str	wzr, [x19,2052]
-	str	wzr, [x19,2052]
-	str	w1, [x19,2052]
-	str	w0, [x19,2052]
-	str	wzr, [x19,2052]
-	b	.L396
+	str	wzr, [x19, 2056]
+	str	wzr, [x19, 2052]
+	str	wzr, [x19, 2052]
+	str	w1, [x19, 2052]
+	str	w0, [x19, 2052]
+	str	wzr, [x19, 2052]
+	b	.L422
 	.size	HynixGetReadRetryDefault, .-HynixGetReadRetryDefault
 	.align	2
 	.global	FlashGetReadRetryDefault
 	.type	FlashGetReadRetryDefault, %function
 FlashGetReadRetryDefault:
+	cbz	w0, .L484
 	stp	x29, x30, [sp, -16]!
-	mov	w1, w0
-	add	x29, sp, 0
-	cbz	w0, .L443
 	sub	w2, w0, #1
+	mov	w1, w0
 	cmp	w2, 7
-	bhi	.L445
+	add	x29, sp, 0
+	bhi	.L473
 	bl	HynixGetReadRetryDefault
-	b	.L443
-.L445:
+.L471:
+	ldp	x29, x30, [sp], 16
+	ret
+.L473:
 	cmp	w0, 49
-	bne	.L446
+	bne	.L474
 	adrp	x0, .LANCHOR2
-	mov	w2, 64
 	add	x0, x0, :lo12:.LANCHOR2
-	add	x0, x0, 1236
-	strb	w1, [x0,-4]
+	mov	w2, 64
+	strb	w1, [x0, 1232]
 	mov	w1, 4
-	strb	w1, [x0,-3]
+	strb	w1, [x0, 1233]
 	mov	w1, 15
-	strb	w1, [x0,-2]
+	strb	w1, [x0, 1234]
 	adrp	x1, .LANCHOR1
 	add	x1, x1, :lo12:.LANCHOR1
 	add	x1, x1, 408
-	b	.L461
-.L446:
+.L487:
+	add	x0, x0, 1236
+	bl	ftl_memcpy
+	b	.L471
+.L474:
 	sub	w0, w0, #65
-	cmp	w0, 1
-	bls	.L452
 	cmp	w1, 33
-	bne	.L447
-.L452:
+	ccmp	w0, 1, 0, ne
+	bhi	.L475
 	adrp	x0, .LANCHOR2
 	add	x0, x0, :lo12:.LANCHOR2
-	strb	w1, [x0,1232]
+	strb	w1, [x0, 1232]
 	mov	w1, 4
-	b	.L462
-.L447:
-	cmp	w1, 67
-	beq	.L453
-	cmp	w1, 34
-	bne	.L449
-.L453:
-	adrp	x0, .LANCHOR2
-	add	x0, x0, :lo12:.LANCHOR2
-	strb	w1, [x0,1232]
-	mov	w1, 5
-.L462:
-	strb	w1, [x0,1233]
+.L488:
+	strb	w1, [x0, 1233]
 	mov	w1, 7
-	strb	w1, [x0,1234]
+	strb	w1, [x0, 1234]
 	adrp	x1, .LANCHOR1
 	add	x1, x1, :lo12:.LANCHOR1
-	add	x0, x0, 1236
-	add	x1, x1, 256
 	mov	w2, 45
-	b	.L461
-.L449:
-	cmp	w1, 68
-	beq	.L454
+	add	x1, x1, 352
+	b	.L487
+.L475:
+	cmp	w1, 34
+	mov	w0, 67
+	ccmp	w1, w0, 4, ne
+	bne	.L476
+	adrp	x0, .LANCHOR2
+	add	x0, x0, :lo12:.LANCHOR2
+	strb	w1, [x0, 1232]
+	mov	w1, 5
+	b	.L488
+.L476:
 	cmp	w1, 35
-	bne	.L443
-.L454:
+	mov	w0, 68
+	ccmp	w1, w0, 4, ne
+	bne	.L471
 	adrp	x0, .LANCHOR2
-	mov	w2, 95
 	add	x0, x0, :lo12:.LANCHOR2
-	add	x0, x0, 1236
-	strb	w1, [x0,-4]
+	mov	w2, 95
+	strb	w1, [x0, 1232]
 	mov	w1, 5
-	strb	w1, [x0,-3]
+	strb	w1, [x0, 1233]
 	mov	w1, 17
-	strb	w1, [x0,-2]
+	strb	w1, [x0, 1234]
 	adrp	x1, .LANCHOR1
 	add	x1, x1, :lo12:.LANCHOR1
-	add	x1, x1, 304
-.L461:
-	bl	ftl_memcpy
-.L443:
-	ldp	x29, x30, [sp], 16
+	add	x1, x1, 256
+	b	.L487
+.L484:
 	ret
 	.size	FlashGetReadRetryDefault, .-FlashGetReadRetryDefault
 	.align	2
 	.global	FlashReadDpCmd
 	.type	FlashReadDpCmd, %function
 FlashReadDpCmd:
-	stp	x29, x30, [sp, -80]!
-	adrp	x3, .LANCHOR0
-	and	w8, w1, 255
+	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	add	x6, x3, :lo12:.LANCHOR0
-	uxtb	w21, w0
-	sbfiz	x0, x21, 4, 32
-	add	x4, x6, 24
-	stp	x19, x20, [sp,16]
-	str	x23, [sp,48]
-	add	x7, x4, x0
-	and	w23, w2, 255
-	lsr	w22, w2, 8
-	ldr	x5, [x4,x0]
+	stp	x21, x22, [sp, 32]
+	and	w22, w0, 255
+	adrp	x0, .LANCHOR0
+	add	x4, x0, :lo12:.LANCHOR0
+	stp	x23, x24, [sp, 48]
+	mov	w21, w1
+	stp	x19, x20, [sp, 16]
+	sbfiz	x1, x22, 4, 32
+	and	w24, w2, 255
+	lsr	w23, w2, 8
 	lsr	w20, w2, 16
-	ldrb	w0, [x6,128]
-	ldr	x2, [x6,104]
-	cmp	w0, 1
-	ldrb	w19, [x7,8]
-	lsr	w0, w1, 16
-	lsr	w7, w1, 8
-	ldrb	w2, [x2,7]
-	bne	.L464
+	ldr	x2, [x4, 104]
+	add	x3, x4, x1
+	ldr	x5, [x4, x1]
+	ldrb	w1, [x4, 128]
+	and	w7, w21, 255
+	lsr	w6, w21, 8
+	cmp	w1, 1
+	ldrb	w19, [x3, 8]
+	lsr	w1, w21, 16
+	ldrb	w2, [x2, 7]
+	bne	.L490
 	cmp	w2, 1
-	bne	.L465
-	sxtw	x4, w19
+	bne	.L491
+	sxtw	x3, w19
 	mov	w2, 38
-	add	x4, x4, 8
-	add	x4, x5, x4, lsl 8
-	str	w2, [x4,8]
-.L465:
-	add	x3, x3, :lo12:.LANCHOR0
+	add	x3, x3, 8
+	add	x3, x5, x3, lsl 8
+	str	w2, [x3, 8]
+.L491:
+	add	x0, x0, :lo12:.LANCHOR0
 	add	x19, x5, x19, lsl 8
-	str	x1, [x29,72]
-	ldrb	w2, [x3,120]
-	str	w2, [x19,2056]
-	str	wzr, [x19,2052]
-	str	wzr, [x19,2052]
-	str	w8, [x19,2052]
-	str	w7, [x19,2052]
-	str	w0, [x19,2052]
-	ldrb	w0, [x3,121]
-	str	w0, [x19,2056]
-	mov	w0, w21
+	add	x0, x0, 112
+	ldrb	w2, [x0, 8]
+	str	w2, [x19, 2056]
+	str	wzr, [x19, 2052]
+	str	wzr, [x19, 2052]
+	str	w7, [x19, 2052]
+	str	w6, [x19, 2052]
+	ldrb	w0, [x0, 9]
+	str	w1, [x19, 2052]
+	str	w0, [x19, 2056]
+	mov	w0, w22
 	bl	NandcWaitFlashReady
-	str	wzr, [x19,2056]
-	str	wzr, [x19,2052]
+	str	wzr, [x19, 2056]
+	str	wzr, [x19, 2052]
+	str	wzr, [x19, 2052]
+.L495:
+	str	w24, [x19, 2052]
 	mov	w0, 48
-	str	wzr, [x19,2052]
-	str	w23, [x19,2052]
-	str	w22, [x19,2052]
-	str	w20, [x19,2052]
-	str	w0, [x19,2056]
-	ldr	x1, [x29,72]
-	b	.L466
-.L464:
+	str	w23, [x19, 2052]
+	mov	w1, w21
+	str	w20, [x19, 2052]
+	str	w0, [x19, 2056]
+	mov	w0, w22
+	bl	FlashSetRandomizer
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 64
+	ret
+.L490:
 	cmp	w2, 1
-	bne	.L467
-	sxtw	x4, w19
+	bne	.L493
+	sxtw	x3, w19
 	mov	w2, 38
-	add	x4, x4, 8
-	add	x4, x5, x4, lsl 8
-	str	w2, [x4,8]
-.L467:
-	add	x3, x3, :lo12:.LANCHOR0
+	add	x3, x3, 8
+	add	x3, x5, x3, lsl 8
+	str	w2, [x3, 8]
+.L493:
+	add	x0, x0, :lo12:.LANCHOR0
 	add	x19, x5, x19, lsl 8
-	ldrb	w2, [x3,120]
-	str	w2, [x19,2056]
-	str	w8, [x19,2052]
-	str	w7, [x19,2052]
-	str	w0, [x19,2052]
-	ldrb	w0, [x3,121]
-	str	w0, [x19,2056]
-	mov	w0, 48
-	str	w23, [x19,2052]
-	str	w22, [x19,2052]
-	str	w20, [x19,2052]
-	str	w0, [x19,2056]
-.L466:
-	mov	w0, w21
-	bl	FlashSetRandomizer
-	ldr	x23, [sp,48]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 80
-	ret
+	add	x0, x0, 112
+	ldrb	w2, [x0, 8]
+	str	w2, [x19, 2056]
+	str	w7, [x19, 2052]
+	str	w6, [x19, 2052]
+	ldrb	w0, [x0, 9]
+	str	w1, [x19, 2052]
+	str	w0, [x19, 2056]
+	b	.L495
 	.size	FlashReadDpCmd, .-FlashReadDpCmd
 	.align	2
 	.global	ftl_flash_de_init
@@ -3225,48 +3166,48 @@ ftl_flash_de_init:
 	stp	x29, x30, [sp, -32]!
 	mov	w0, 0
 	add	x29, sp, 0
-	str	x19, [sp,16]
-	adrp	x19, .LANCHOR2
+	str	x19, [sp, 16]
 	bl	NandcWaitFlashReady
 	bl	FlashSetReadRetryDefault
+	adrp	x19, .LANCHOR2
 	add	x0, x19, :lo12:.LANCHOR2
-	ldr	w0, [x0,2100]
-	cbz	w0, .L469
+	ldr	w0, [x0, 2100]
+	cbz	w0, .L497
 	mov	w0, 0
 	bl	flash_enter_slc_mode
-	b	.L470
-.L469:
-	bl	flash_exit_slc_mode
-.L470:
+.L498:
 	add	x19, x19, :lo12:.LANCHOR2
-	ldrb	w0, [x19,2104]
-	cbz	w0, .L471
-	ldrb	w0, [x19,2093]
-	tbz	x0, 0, .L471
+	ldrb	w0, [x19, 2104]
+	cbz	w0, .L499
+	ldrb	w0, [x19, 2093]
+	tbz	x0, 0, .L499
 	mov	w0, 1
 	bl	FlashSetInterfaceMode
 	mov	w0, 1
 	bl	NandcSetMode
-	strb	wzr, [x19,2104]
-.L471:
-	adrp	x0, .LANCHOR0+24
-	ldr	x0, [x0,#:lo12:.LANCHOR0+24]
-	str	wzr, [x0,336]
+	strb	wzr, [x19, 2104]
+.L499:
+	adrp	x0, .LANCHOR0
+	ldr	x0, [x0, #:lo12:.LANCHOR0]
+	str	wzr, [x0, 336]
 	mov	w0, 0
-	ldr	x19, [sp,16]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L497:
+	mov	w0, 0
+	bl	flash_exit_slc_mode
+	b	.L498
 	.size	ftl_flash_de_init, .-ftl_flash_de_init
 	.align	2
 	.global	NandcRandmzSel
 	.type	NandcRandmzSel, %function
 NandcRandmzSel:
-	adrp	x2, .LANCHOR0
 	ubfiz	x0, x0, 4, 8
+	adrp	x2, .LANCHOR0
 	add	x2, x2, :lo12:.LANCHOR0
-	add	x2, x2, 24
-	ldr	x0, [x2,x0]
-	str	w1, [x0,336]
+	ldr	x0, [x2, x0]
+	str	w1, [x0, 336]
 	ret
 	.size	NandcRandmzSel, .-NandcRandmzSel
 	.align	2
@@ -3275,73 +3216,77 @@ NandcRandmzSel:
 NandcTimeCfg:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	mov	w19, w0
 	mov	w0, 0
 	bl	rknand_get_clk_rate
-	mov	w2, 16960
+	mov	w1, 16960
+	movk	w1, 0xf, lsl 16
+	sdiv	w0, w0, w1
 	adrp	x1, .LANCHOR2
-	movk	w2, 0xf, lsl 16
 	add	x1, x1, :lo12:.LANCHOR2
-	sdiv	w0, w0, w2
 	cmp	w0, 250
-	ble	.L480
-	ldr	x0, [x1,1152]
+	ble	.L509
+	ldr	x0, [x1, 1152]
 	mov	w1, 8354
-	b	.L487
-.L480:
+.L517:
+	str	w1, [x0, 4]
+	ldr	x19, [sp, 16]
+	ldp	x29, x30, [sp], 32
+	ret
+.L509:
 	cmp	w0, 220
-	ble	.L482
-	ldr	x0, [x1,1152]
-	b	.L488
-.L482:
+	ble	.L511
+	ldr	x0, [x1, 1152]
+.L518:
+	mov	w1, 8322
+	b	.L517
+.L511:
 	cmp	w0, 185
-	ble	.L483
-	ldr	x0, [x1,1152]
+	ble	.L512
+	ldr	x0, [x1, 1152]
 	mov	w1, 4226
-	b	.L487
-.L483:
+	b	.L517
+.L512:
 	cmp	w0, 160
-	ldr	x0, [x1,1152]
-	ble	.L484
+	ldr	x0, [x1, 1152]
+	ble	.L513
 	mov	w1, 4194
-	b	.L487
-.L484:
+	b	.L517
+.L513:
 	cmp	w19, 35
+	bhi	.L514
 	mov	w1, 4193
-	bls	.L487
+	b	.L517
+.L514:
 	cmp	w19, 99
+	bhi	.L518
 	mov	w1, 4225
-	bls	.L487
-.L488:
-	mov	w1, 8322
-.L487:
-	str	w1, [x0,4]
-	ldr	x19, [sp,16]
-	ldp	x29, x30, [sp], 32
-	ret
+	b	.L517
 	.size	NandcTimeCfg, .-NandcTimeCfg
 	.align	2
 	.global	FlashTimingCfg
 	.type	FlashTimingCfg, %function
 FlashTimingCfg:
-	sub	w1, w0, #4096
-	sub	w1, w1, #97
 	stp	x29, x30, [sp, -16]!
-	and	w1, w1, -33
-	cmp	w1, 1
+	mov	w1, -4193
+	add	w2, w0, w1
+	mov	w3, -4225
 	add	x29, sp, 0
-	bls	.L490
+	add	w1, w0, w3
+	cmp	w2, 1
+	ccmp	w1, 1, 0, hi
+	bls	.L520
 	mov	w1, 8322
 	cmp	w0, w1
-	bne	.L491
-.L490:
+	bne	.L521
+.L520:
 	adrp	x1, .LANCHOR2+1152
-	ldr	x1, [x1,#:lo12:.LANCHOR2+1152]
-	str	w0, [x1,4]
-.L491:
+	ldr	x1, [x1, #:lo12:.LANCHOR2+1152]
+	str	w0, [x1, 4]
+.L521:
 	adrp	x0, .LANCHOR1+493
-	ldrb	w0, [x0,#:lo12:.LANCHOR1+493]
+	ldrb	w0, [x0, #:lo12:.LANCHOR1+493]
 	bl	NandcTimeCfg
 	ldp	x29, x30, [sp], 16
 	ret
@@ -3352,60 +3297,59 @@ FlashTimingCfg:
 NandcInit:
 	stp	x29, x30, [sp, -32]!
 	adrp	x2, .LANCHOR0
-	add	x2, x2, :lo12:.LANCHOR0
+	add	x1, x2, :lo12:.LANCHOR0
 	add	x29, sp, 0
-	add	x1, x2, 24
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	adrp	x19, .LANCHOR2
-	str	wzr, [x2,32]
-	str	x0, [x2,24]
+	str	x0, [x2, #:lo12:.LANCHOR0]
 	mov	w2, 1
-	str	w2, [x1,24]
+	str	w2, [x1, 24]
 	mov	w2, 2
-	str	w2, [x1,40]
+	str	w2, [x1, 40]
 	mov	w2, 3
-	str	w2, [x1,56]
+	str	w2, [x1, 56]
 	add	x2, x19, :lo12:.LANCHOR2
-	str	x0, [x1,16]
-	str	x0, [x1,32]
-	str	x0, [x1,48]
-	str	x0, [x2,1152]
+	str	wzr, [x1, 8]
+	str	x0, [x1, 16]
+	str	x0, [x1, 32]
+	str	x0, [x1, 48]
+	str	x0, [x2, 1152]
 	ldr	w1, [x0]
 	ubfx	x3, x1, 13, 1
-	str	w3, [x2,2108]
-	ldr	w3, [x0,352]
+	str	w3, [x2, 2108]
+	ldr	w3, [x0, 352]
 	and	w1, w1, 245760
 	orr	w1, w1, 256
 	ubfx	x3, x3, 16, 4
-	str	w3, [x2,2112]
-	ldr	w3, [x0,352]
-	str	w3, [x2,2116]
+	str	w3, [x2, 2112]
+	ldr	w3, [x0, 352]
+	str	w3, [x2, 2116]
 	cmp	w3, 2049
-	bne	.L493
+	bne	.L524
 	mov	w3, 8
-	str	w3, [x2,2112]
-.L493:
+	str	w3, [x2, 2112]
+.L524:
 	add	x19, x19, :lo12:.LANCHOR2
 	str	w1, [x0]
-	ldr	x0, [x19,1152]
-	str	wzr, [x0,336]
+	ldr	x0, [x19, 1152]
+	str	wzr, [x0, 336]
 	mov	w0, 40
 	bl	NandcTimeCfg
-	ldr	x0, [x19,1152]
+	ldr	x0, [x19, 1152]
 	mov	w1, 8322
-	str	w1, [x0,344]
+	str	w1, [x0, 344]
 	mov	w1, 6145
 	movk	w1, 0x18, lsl 16
-	str	w1, [x0,304]
+	str	w1, [x0, 304]
 	mov	w0, 36864
-	bl	ftl_malloc
-	str	wzr, [x19,2168]
-	str	x0, [x19,2120]
-	str	x0, [x19,2128]
+	bl	ftl_dma32_malloc
+	str	wzr, [x19, 2168]
+	str	x0, [x19, 2120]
+	str	x0, [x19, 2128]
 	add	x0, x0, 32768
-	str	wzr, [x19,2176]
-	str	x0, [x19,2136]
-	ldr	x19, [sp,16]
+	str	wzr, [x19, 2176]
+	str	x0, [x19, 2136]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	NandcInit, .-NandcInit
@@ -3415,20 +3359,20 @@ NandcInit:
 NandcGetTimeCfg:
 	adrp	x4, .LANCHOR2
 	add	x4, x4, :lo12:.LANCHOR2
-	ldr	x5, [x4,1152]
-	ldr	w5, [x5,4]
+	ldr	x5, [x4, 1152]
+	ldr	w5, [x5, 4]
 	str	w5, [x0]
-	ldr	x0, [x4,1152]
+	ldr	x0, [x4, 1152]
 	ldr	w0, [x0]
 	str	w0, [x1]
-	ldr	x0, [x4,1152]
-	ldr	w0, [x0,304]
+	ldr	x0, [x4, 1152]
+	ldr	w0, [x0, 304]
 	str	w0, [x2]
-	ldr	x1, [x4,1152]
-	ldr	w0, [x1,308]
-	ldr	w1, [x1,344]
-	and	w0, w0, 255
-	orr	w0, w0, w1, lsl 16
+	ldr	x0, [x4, 1152]
+	ldr	w1, [x0, 308]
+	ldr	w0, [x0, 344]
+	and	w1, w1, 255
+	orr	w0, w1, w0, lsl 16
 	str	w0, [x3]
 	ret
 	.size	NandcGetTimeCfg, .-NandcGetTimeCfg
@@ -3437,32 +3381,32 @@ NandcGetTimeCfg:
 	.type	NandcBchSel, %function
 NandcBchSel:
 	adrp	x1, .LANCHOR2
-	uxtb	w0, w0
 	add	x1, x1, :lo12:.LANCHOR2
+	and	w0, w0, 255
 	mov	w3, 1
 	cmp	w0, 16
-	ldr	x2, [x1,1152]
-	str	w0, [x1,2180]
+	ldr	x2, [x1, 1152]
+	str	w0, [x1, 2180]
 	mov	w1, 4096
-	str	w3, [x2,8]
-	bne	.L496
-.L499:
+	str	w3, [x2, 8]
+	bne	.L528
+.L531:
 	and	w1, w1, -17
-	b	.L497
-.L496:
+.L529:
+	orr	w1, w1, 1
+	str	w1, [x2, 12]
+	ret
+.L528:
 	cmp	w0, 24
-	bne	.L498
+	bne	.L530
 	orr	w1, w1, 16
-	b	.L497
-.L498:
-	cmp	w0, 40
+	b	.L529
+.L530:
 	orr	w1, w1, 262144
+	cmp	w0, 40
 	orr	w1, w1, 16
-	beq	.L499
-.L497:
-	orr	w1, w1, 1
-	str	w1, [x2,12]
-	ret
+	bne	.L529
+	b	.L531
 	.size	NandcBchSel, .-NandcBchSel
 	.align	2
 	.global	FlashBchSel
@@ -3470,9 +3414,9 @@ NandcBchSel:
 FlashBchSel:
 	stp	x29, x30, [sp, -16]!
 	adrp	x1, .LANCHOR2+1221
-	uxtb	w0, w0
+	and	w0, w0, 255
 	add	x29, sp, 0
-	strb	w0, [x1,#:lo12:.LANCHOR2+1221]
+	strb	w0, [x1, #:lo12:.LANCHOR2+1221]
 	bl	NandcBchSel
 	ldp	x29, x30, [sp], 16
 	ret
@@ -3483,64 +3427,64 @@ FlashBchSel:
 ftl_flash_resume:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	str	x21, [sp,32]
 	add	x0, x19, :lo12:.LANCHOR2
+	str	x21, [sp, 32]
 	adrp	x21, IDByte
-	mov	x20, 0
 	add	x21, x21, :lo12:IDByte
-	ldr	x1, [x0,1152]
-	ldr	w2, [x0,1160]
+	mov	x20, 0
+	ldr	x1, [x0, 1152]
+	ldr	w2, [x0, 1160]
 	str	w2, [x1]
-	ldr	w2, [x0,1164]
-	ldr	x1, [x0,1152]
-	str	w2, [x1,4]
-	ldr	w2, [x0,1168]
-	ldr	x1, [x0,1152]
-	str	w2, [x1,8]
-	ldr	w2, [x0,1172]
-	str	w2, [x1,12]
-	ldr	w2, [x0,1176]
-	str	w2, [x1,304]
-	ldr	w2, [x0,1180]
-	str	w2, [x1,308]
-	ldr	w2, [x0,1184]
-	str	w2, [x1,336]
-	ldr	w0, [x0,1188]
-	str	w0, [x1,344]
-.L506:
+	ldr	w2, [x0, 1164]
+	ldr	x1, [x0, 1152]
+	str	w2, [x1, 4]
+	ldr	w2, [x0, 1168]
+	ldr	x1, [x0, 1152]
+	str	w2, [x1, 8]
+	ldr	w2, [x0, 1172]
+	str	w2, [x1, 12]
+	ldr	w2, [x0, 1176]
+	str	w2, [x1, 304]
+	ldr	w2, [x0, 1180]
+	str	w2, [x1, 308]
+	ldr	w2, [x0, 1184]
+	str	w2, [x1, 336]
+	ldr	w0, [x0, 1188]
+	str	w0, [x1, 344]
+.L539:
 	lsl	x0, x20, 3
-	ldrb	w0, [x0,x21]
+	ldrb	w0, [x0, x21]
 	sub	w0, w0, #1
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 253
-	bhi	.L505
+	bhi	.L538
 	mov	w0, w20
 	bl	FlashReset
-.L505:
+.L538:
 	add	x20, x20, 1
 	cmp	x20, 4
-	bne	.L506
+	bne	.L539
 	add	x19, x19, :lo12:.LANCHOR2
-	ldrb	w0, [x19,2104]
-	cbz	w0, .L507
+	ldrb	w0, [x19, 2104]
+	cbz	w0, .L540
 	mov	w0, 1
 	bl	NandcSetMode
-	ldrb	w0, [x19,2093]
+	ldrb	w0, [x19, 2093]
 	bl	FlashSetInterfaceMode
-	ldrb	w0, [x19,2093]
+	ldrb	w0, [x19, 2093]
 	bl	NandcSetMode
-	ldr	w0, [x19,1176]
+	ldr	w0, [x19, 1176]
 	lsr	w0, w0, 8
 	bl	NandcSetDdrPara
-.L507:
+.L540:
 	adrp	x0, .LANCHOR0+104
-	ldr	x0, [x0,#:lo12:.LANCHOR0+104]
-	ldrb	w0, [x0,20]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+104]
+	ldrb	w0, [x0, 20]
 	bl	FlashBchSel
-	ldr	x21, [sp,32]
-	ldp	x19, x20, [sp,16]
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	ftl_flash_resume, .-ftl_flash_resume
@@ -3548,7 +3492,7 @@ ftl_flash_resume:
 	.global	ftl_nandc_get_irq_status
 	.type	ftl_nandc_get_irq_status, %function
 ftl_nandc_get_irq_status:
-	ldr	w0, [x0,372]
+	ldr	w0, [x0, 372]
 	ret
 	.size	ftl_nandc_get_irq_status, .-ftl_nandc_get_irq_status
 	.align	2
@@ -3562,23 +3506,19 @@ NandcIqrWaitFlashReady:
 	.type	NandcSendDumpDataStart, %function
 NandcSendDumpDataStart:
 	sub	sp, sp, #16
-	mov	w2, 1
-	mov	w1, 10
-	bfi	w1, w2, 5, 2
-	ldr	w2, [x0,16]
-	str	w2, [sp,8]
-	orr	w1, w1, 536870912
-	orr	w1, w1, 1024
-	ldr	w2, [sp,8]
-	orr	w1, w1, 2097152
+	ldr	w2, [x0, 16]
+	mov	w1, 1066
+	movk	w1, 0x2020, lsl 16
+	str	w2, [sp, 8]
+	ldr	w2, [sp, 8]
 	and	w2, w2, -5
-	str	w2, [sp,8]
-	ldr	w2, [sp,8]
-	add	sp, sp, 16
-	str	w2, [x0,16]
-	str	w1, [x0,8]
+	str	w2, [sp, 8]
+	ldr	w2, [sp, 8]
+	str	w2, [x0, 16]
+	str	w1, [x0, 8]
 	orr	w1, w1, 4
-	str	w1, [x0,8]
+	str	w1, [x0, 8]
+	add	sp, sp, 16
 	ret
 	.size	NandcSendDumpDataStart, .-NandcSendDumpDataStart
 	.align	2
@@ -3586,11 +3526,11 @@ NandcSendDumpDataStart:
 	.type	NandcSendDumpDataDone, %function
 NandcSendDumpDataDone:
 	sub	sp, sp, #16
-.L516:
-	ldr	w1, [x0,8]
-	str	w1, [sp,8]
-	ldr	w1, [sp,8]
-	tbz	x1, 20, .L516
+.L551:
+	ldr	w1, [x0, 8]
+	str	w1, [sp, 8]
+	ldr	w1, [sp, 8]
+	tbz	x1, 20, .L551
 	add	sp, sp, 16
 	ret
 	.size	NandcSendDumpDataDone, .-NandcSendDumpDataDone
@@ -3599,694 +3539,698 @@ NandcSendDumpDataDone:
 	.type	NandcXferStart, %function
 NandcXferStart:
 	stp	x29, x30, [sp, -96]!
-	adrp	x6, .LANCHOR0
 	ubfiz	x0, x0, 4, 8
-	add	x6, x6, :lo12:.LANCHOR0
+	ubfx	x3, x3, 1, 7
 	add	x29, sp, 0
-	add	x6, x6, 24
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	stp	x21, x22, [sp,32]
-	uxtb	w23, w1
-	add	x1, x6, x0
-	ldr	x21, [x6,x0]
-	ubfiz	w20, w23, 1, 1
+	stp	x23, x24, [sp, 48]
+	and	w24, w1, 255
+	adrp	x1, .LANCHOR0
+	add	x1, x1, :lo12:.LANCHOR0
+	stp	x19, x20, [sp, 16]
+	add	x6, x1, x0
+	stp	x21, x22, [sp, 32]
+	ubfiz	w20, w24, 1, 1
+	str	x25, [sp, 64]
 	orr	w20, w20, 8
 	adrp	x19, .LANCHOR2
-	ldrb	w0, [x1,8]
+	ldr	x21, [x1, x0]
 	mov	w1, 16
-	ldr	w22, [x21,12]
-	ubfx	x3, x3, 1, 7
-	uxtb	w2, w2
-	bfi	w22, w1, 8, 8
-	and	w22, w22, -9
-	bfi	w22, w0, 5, 3
+	ldrb	w0, [x6, 8]
+	ldr	w23, [x21, 12]
+	bfi	w23, w1, 8, 8
+	and	w23, w23, -9
+	bfi	w23, w0, 5, 3
 	mov	w0, 1
 	bfi	w20, w0, 5, 2
 	add	x0, x19, :lo12:.LANCHOR2
 	orr	w20, w20, 536870912
 	orr	w20, w20, 1024
-	ldr	w0, [x0,2112]
+	ldr	w1, [x0, 2112]
 	bfi	w20, w3, 4, 1
-	cmp	w0, 3
-	bls	.L520
-	ldr	w0, [x21,16]
-	cmp	x5, xzr
-	str	w0, [x29,88]
-	cset	w9, ne
-	ldr	w0, [x29,88]
-	and	w0, w0, -5
-	str	w0, [x29,88]
-	cbnz	w9, .L534
-	cbz	x4, .L521
-.L534:
-	cbnz	w23, .L523
-.L531:
+	cmp	w1, 3
+	bls	.L556
+	ldr	w1, [x21, 16]
+	cmp	x5, 0
+	str	w1, [x29, 88]
+	ccmp	x4, 0, 0, eq
+	ldr	w1, [x29, 88]
+	and	w1, w1, -5
+	str	w1, [x29, 88]
+	beq	.L557
+	and	w2, w2, 255
+	cbnz	w24, .L558
+.L566:
 	add	w2, w2, 1
-	mov	x0, x4
 	asr	w2, w2, 1
 	bfi	w20, w2, 22, 6
-	cbnz	x4, .L525
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	x0, [x0,2128]
-	b	.L525
-.L523:
-	add	x1, x19, :lo12:.LANCHOR2
-	mov	w7, 128
-	mov	w3, 0
-	lsr	w10, w2, 1
-	mov	w6, w3
-	mov	w11, -1
-	ldr	w0, [x1,2180]
-	cmp	w0, 25
-	mov	w0, 64
-	csel	w7, w0, w7, cc
-.L527:
-	cmp	w6, w10
-	bcs	.L531
-	lsr	w0, w3, 2
-	ubfiz	x0, x0, 2, 30
-	cbz	w9, .L528
-	ldrh	w8, [x5,2]
-	ldr	x12, [x1,2136]
-	ldrh	w13, [x5],4
-	orr	w8, w13, w8, lsl 16
-	str	w8, [x12,x0]
-	b	.L529
-.L528:
-	ldr	x8, [x1,2136]
-	str	w11, [x8,x0]
-.L529:
-	add	w6, w6, 1
-	add	w3, w3, w7
-	b	.L527
-.L525:
+	cbz	x4, .L559
+	mov	x0, x4
+.L560:
 	add	x19, x19, :lo12:.LANCHOR2
-	ubfx	x24, x20, 22, 5
-	mov	w2, w23
-	str	x4, [x29,72]
-	ldr	x1, [x19,2136]
-	str	x1, [x19,2152]
-	lsl	w1, w24, 10
-	str	x0, [x19,2144]
+	ubfx	x25, x20, 22, 5
+	mov	x22, x4
+	mov	w2, w24
+	ldr	x1, [x19, 2136]
+	str	x1, [x19, 2152]
+	lsl	w1, w25, 10
+	str	x0, [x19, 2144]
 	bl	rknand_dma_map_single
-	str	w0, [x19,2160]
-	ldr	x0, [x19,2152]
-	lsl	w1, w24, 7
-	mov	w2, w23
+	str	w0, [x19, 2160]
+	lsl	w1, w25, 7
+	ldr	x0, [x19, 2152]
+	mov	w2, w24
 	bl	rknand_dma_map_single
-	str	w0, [x19,2164]
+	str	w0, [x19, 2164]
 	mov	w0, 1
-	str	w0, [x19,2168]
-	ldr	w0, [x19,2160]
+	str	w0, [x19, 2168]
+	ldr	w0, [x19, 2160]
 	mov	w1, 16
-	str	w0, [x21,20]
-	ldr	x4, [x29,72]
-	ldr	w0, [x19,2164]
-	str	w0, [x21,24]
-	and	x4, x4, 3
-	str	wzr, [x29,88]
-	ldr	w0, [x29,88]
+	str	w0, [x21, 20]
+	tst	x22, 3
+	ldr	w0, [x19, 2164]
+	str	w0, [x21, 24]
+	str	wzr, [x29, 88]
+	ldr	w0, [x29, 88]
 	bfi	w0, w1, 9, 5
-	str	w0, [x29,88]
-	ldr	w0, [x29,88]
+	str	w0, [x29, 88]
+	ldr	w0, [x29, 88]
 	orr	w0, w0, 448
-	str	w0, [x29,88]
-	cbnz	x4, .L532
-	ldr	w0, [x29,88]
+	str	w0, [x29, 88]
+	bne	.L567
+	ldr	w0, [x29, 88]
 	mov	w1, 2
 	bfi	w0, w1, 3, 3
-	str	w0, [x29,88]
-.L532:
-	ldr	w0, [x29,88]
-	cmp	w23, wzr
+	str	w0, [x29, 88]
+.L567:
+	ldr	w0, [x29, 88]
+	cmp	w24, 0
 	cset	w1, eq
 	orr	w0, w0, 4
-	str	w0, [x29,88]
-	ldr	w0, [x29,88]
+	str	w0, [x29, 88]
+	ldr	w0, [x29, 88]
 	bfi	w0, w1, 1, 1
-	str	w0, [x29,88]
-	ldr	w0, [x29,88]
+	str	w0, [x29, 88]
+	ldr	w0, [x29, 88]
 	orr	w0, w0, 1
-	str	w0, [x29,88]
-.L521:
-	ldr	w0, [x29,88]
-	str	w0, [x21,16]
-.L520:
-	str	w22, [x21,12]
-	str	w20, [x21,8]
+	str	w0, [x29, 88]
+.L557:
+	ldr	w0, [x29, 88]
+	str	w0, [x21, 16]
+.L556:
+	str	w23, [x21, 12]
+	str	w20, [x21, 8]
 	orr	w20, w20, 4
-	str	w20, [x21,8]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
+	str	w20, [x21, 8]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldr	x25, [sp, 64]
 	ldp	x29, x30, [sp], 96
 	ret
+.L558:
+	ldr	w1, [x0, 2180]
+	mov	w6, 64
+	lsr	w9, w2, 1
+	mov	x8, x5
+	cmp	w1, 25
+	mov	w1, 128
+	csel	w6, w6, w1, cc
+	mov	w7, 0
+	mov	w3, 0
+	mov	w10, -1
+.L562:
+	cmp	w3, w9
+	bcs	.L566
+	lsr	w1, w7, 2
+	cbz	x5, .L563
+	ldr	x11, [x0, 2136]
+	lsl	w1, w1, 2
+	ldr	w12, [x8], 4
+	str	w12, [x11, x1]
+.L564:
+	add	w3, w3, 1
+	add	w7, w7, w6
+	b	.L562
+.L563:
+	ldr	x11, [x0, 2136]
+	lsl	w1, w1, 2
+	str	w10, [x11, x1]
+	b	.L564
+.L559:
+	add	x0, x19, :lo12:.LANCHOR2
+	ldr	x0, [x0, 2128]
+	b	.L560
 	.size	NandcXferStart, .-NandcXferStart
 	.align	2
 	.global	NandcXferComp
 	.type	NandcXferComp, %function
 NandcXferComp:
 	stp	x29, x30, [sp, -80]!
-	adrp	x1, .LANCHOR0
 	ubfiz	x0, x0, 4, 8
+	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
 	add	x29, sp, 0
-	add	x1, x1, 24
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	str	x23, [sp,48]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR2
-	ldr	x19, [x1,x0]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	ldr	x19, [x1, x0]
 	add	x0, x20, :lo12:.LANCHOR2
-	ldr	w0, [x0,2112]
-	cmp	w0, 3
-	bls	.L569
-	ldr	w0, [x19,16]
-	tbz	x0, 2, .L569
-	ldr	w21, [x19,16]
-	ldr	w0, [x19,8]
-	ubfx	x21, x21, 1, 1
-	str	w0, [x29,64]
-	cbz	w21, .L540
+	ldr	w1, [x0, 2112]
+	cmp	w1, 3
+	bls	.L604
+	ldr	w1, [x19, 16]
+	tbz	x1, 2, .L604
+	ldr	w1, [x19, 16]
+	tbz	x1, 1, .L575
 	adrp	x22, .LC4
 	adrp	x23, .LC5
-	mov	w21, 0
+	ldr	w1, [x19, 8]
+	mov	x24, x0
 	add	x22, x22, :lo12:.LC4
 	add	x23, x23, :lo12:.LC5
-.L541:
-	ldr	w2, [x19,28]
-	ldr	w1, [x29,64]
-	ubfx	x2, x2, 16, 5
-	ubfx	x1, x1, 22, 6
-	cmp	w2, w1
-	bge	.L549
-	add	x0, x20, :lo12:.LANCHOR2
-	ldr	w0, [x0,2112]
+	mov	w21, 0
+	str	w1, [x29, 64]
+.L576:
+	ldr	w1, [x19, 28]
+	ldr	w0, [x29, 64]
+	ubfx	x1, x1, 16, 5
+	ubfx	x0, x0, 22, 6
+	cmp	w1, w0
+	bge	.L584
+	ldr	w0, [x24, 2112]
 	cmp	w0, 5
-	bhi	.L542
-.L545:
+	bhi	.L577
+.L580:
 	add	w21, w21, 1
-	and	w0, w21, 16777215
-	cbnz	w0, .L544
-	ldr	w2, [x19,28]
+	tst	x21, 16777215
+	bne	.L579
+	ldr	w2, [x19, 28]
 	mov	w1, w21
-	ldr	w3, [x29,64]
+	ldr	w3, [x29, 64]
 	mov	x0, x22
 	ubfx	x2, x2, 16, 5
 	ubfx	x3, x3, 22, 6
 	bl	printk
-	mov	x0, x23
-	mov	x1, x19
-	mov	w2, 4
 	mov	w3, 512
+	mov	w2, 4
+	mov	x1, x19
+	mov	x0, x23
 	bl	rknand_print_hex
-	b	.L544
-.L542:
+.L579:
+	mov	x1, 5
+	mov	x0, 1
+	bl	usleep_range
+	b	.L576
+.L577:
 	ldr	w0, [x19]
-	str	w0, [x29,72]
-	ldr	w0, [x29,72]
-	tbz	x0, 13, .L545
-	ldr	w0, [x29,72]
-	tbz	x0, 17, .L545
-.L549:
+	str	w0, [x29, 72]
+	ldr	w0, [x29, 72]
+	tbz	x0, 13, .L580
+	ldr	w0, [x29, 72]
+	tbz	x0, 17, .L580
+.L584:
 	add	x19, x20, :lo12:.LANCHOR2
 	add	x19, x19, 2128
-	ldr	w0, [x19,40]
-	cbz	w0, .L550
-	ldr	w1, [x29,64]
+	ldr	w0, [x19, 40]
+	cbz	w0, .L585
+	ldr	w0, [x19, 32]
 	mov	w2, 0
-	ldr	w0, [x19,32]
+	ldr	w1, [x29, 64]
 	ubfx	x1, x1, 22, 5
 	lsl	w1, w1, 10
 	bl	rknand_dma_unmap_single
-	ldr	w1, [x29,64]
+	ldr	w1, [x29, 64]
 	mov	w2, 0
-	ldr	w0, [x19,36]
+	ldr	w0, [x19, 36]
 	ubfx	x1, x1, 22, 5
 	lsl	w1, w1, 7
 	bl	rknand_dma_unmap_single
-	b	.L550
-.L544:
-	mov	x0, 1
-	mov	x1, 5
-	bl	usleep_range
-	b	.L541
-.L540:
+.L585:
+	add	x20, x20, :lo12:.LANCHOR2
+	str	wzr, [x20, 2168]
+.L573:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 80
+	ret
+.L575:
 	adrp	x22, .LC6
 	adrp	x23, .LC5
+	ldr	w0, [x19, 8]
 	add	x22, x22, :lo12:.LC6
 	add	x23, x23, :lo12:.LC5
-.L551:
-	ldr	w0, [x29,64]
-	tbnz	x0, 20, .L577
-	ldr	w0, [x19,8]
-	add	w21, w21, 1
-	str	w0, [x29,64]
-	and	w0, w21, 16777215
-	cbnz	w0, .L552
-	ldr	w2, [x29,64]
-	mov	w1, w21
-	ldr	w3, [x19,28]
-	mov	x0, x22
-	ubfx	x3, x3, 16, 5
-	bl	printk
-	mov	x0, x23
-	mov	x1, x19
-	mov	w2, 4
-	mov	w3, 512
-	bl	rknand_print_hex
-.L552:
-	mov	x0, 1
-	mov	x1, 5
-	bl	usleep_range
-	b	.L551
-.L577:
+	mov	w21, 0
+	str	w0, [x29, 64]
+.L586:
+	ldr	w0, [x29, 64]
+	tbz	x0, 20, .L588
 	add	x0, x20, :lo12:.LANCHOR2
-	ldr	w0, [x0,2176]
-	cbz	w0, .L554
+	ldr	w0, [x0, 2176]
+	cbz	w0, .L589
 	mov	x0, x19
 	bl	NandcSendDumpDataStart
-.L554:
+.L589:
 	add	x21, x20, :lo12:.LANCHOR2
 	add	x21, x21, 2128
-	ldr	w0, [x21,40]
-	cbz	w0, .L555
-	ldr	w1, [x29,64]
+	ldr	w0, [x21, 40]
+	cbz	w0, .L590
+	ldr	w0, [x21, 32]
 	mov	w2, 1
-	ldr	w0, [x21,32]
+	ldr	w1, [x29, 64]
 	ubfx	x1, x1, 22, 5
 	lsl	w1, w1, 10
 	bl	rknand_dma_unmap_single
-	ldr	w1, [x29,64]
+	ldr	w1, [x29, 64]
 	mov	w2, 1
-	ldr	w0, [x21,36]
+	ldr	w0, [x21, 36]
 	ubfx	x1, x1, 22, 5
 	lsl	w1, w1, 7
 	bl	rknand_dma_unmap_single
-.L555:
+.L590:
 	add	x0, x20, :lo12:.LANCHOR2
-	ldr	w0, [x0,2176]
-	cbz	w0, .L550
+	ldr	w0, [x0, 2176]
+	cbz	w0, .L585
 	mov	x0, x19
 	bl	NandcSendDumpDataDone
-.L550:
-	add	x20, x20, :lo12:.LANCHOR2
-	str	wzr, [x20,2168]
-	b	.L538
-.L569:
-	ldr	w0, [x19,8]
-	str	w0, [x29,64]
-	ldr	w0, [x29,64]
-	tbz	x0, 20, .L569
-.L538:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldr	x23, [sp,48]
-	ldp	x29, x30, [sp], 80
-	ret
+	b	.L585
+.L588:
+	ldr	w0, [x19, 8]
+	add	w21, w21, 1
+	str	w0, [x29, 64]
+	tst	x21, 16777215
+	bne	.L587
+	ldr	w2, [x29, 64]
+	mov	w1, w21
+	ldr	w3, [x19, 28]
+	mov	x0, x22
+	ubfx	x3, x3, 16, 5
+	bl	printk
+	mov	w3, 512
+	mov	w2, 4
+	mov	x1, x19
+	mov	x0, x23
+	bl	rknand_print_hex
+.L587:
+	mov	x1, 5
+	mov	x0, 1
+	bl	usleep_range
+	b	.L586
+.L604:
+	ldr	w0, [x19, 8]
+	str	w0, [x29, 64]
+	ldr	w0, [x29, 64]
+	tbz	x0, 20, .L604
+	b	.L573
 	.size	NandcXferComp, .-NandcXferComp
 	.align	2
 	.global	NandcCopy1KB
 	.type	NandcCopy1KB, %function
 NandcCopy1KB:
 	stp	x29, x30, [sp, -48]!
-	uxtb	w1, w1
-	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	str	x21, [sp,32]
-	uxtb	w19, w2
+	and	w1, w1, 255
 	cmp	w1, 1
-	mov	x20, x4
-	ubfiz	x2, x19, 9, 8
-	add	x4, x0, 4096
+	add	x29, sp, 0
+	stp	x19, x20, [sp, 16]
+	and	w19, w2, 255
+	str	x21, [sp, 32]
+	add	x2, x0, 4096
 	add	x21, x0, 512
-	add	x2, x4, x2
-	bne	.L579
-	cbz	x3, .L580
-	mov	x0, x2
-	mov	x1, x3
+	ubfiz	x0, x19, 9, 8
+	mov	x20, x4
+	add	x0, x2, x0
+	bne	.L614
+	cbz	x3, .L615
 	mov	w2, 1024
+	mov	x1, x3
 	bl	ftl_memcpy
-.L580:
-	cbz	x20, .L578
-	mov	w0, 48
+.L615:
+	cbz	x20, .L613
 	lsr	w19, w19, 1
-	ldrb	w1, [x20,1]
-	mul	w19, w19, w0
-	ldrb	w0, [x20,2]
-	asr	w19, w19, 2
-	lsl	w0, w0, 16
-	orr	w0, w0, w1, lsl 8
-	ldrb	w1, [x20]
-	orr	w0, w0, w1
-	ldrb	w1, [x20,3]
-	orr	w0, w0, w1, lsl 24
-	str	w0, [x21,w19,sxtw 2]
-	b	.L578
-.L579:
-	cbz	x3, .L583
-	mov	x1, x2
-	mov	x0, x3
+	mov	w1, 48
+	ldr	w0, [x20]
+	mul	w19, w19, w1
+	and	x19, x19, 8176
+	str	w0, [x21, x19]
+.L613:
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	ret
+.L614:
+	cbz	x3, .L618
+	mov	x1, x0
 	mov	w2, 1024
+	mov	x0, x3
 	bl	ftl_memcpy
-.L583:
-	cbz	x20, .L578
-	mov	w0, 48
+.L618:
+	cbz	x20, .L613
 	lsr	w19, w19, 1
+	mov	w0, 48
 	mul	w19, w19, w0
-	asr	w19, w19, 2
-	ldr	w0, [x21,w19,sxtw 2]
+	and	x19, x19, 8176
+	ldr	w0, [x21, x19]
 	strb	w0, [x20]
 	lsr	w1, w0, 8
-	strb	w1, [x20,1]
+	strb	w1, [x20, 1]
 	lsr	w1, w0, 16
 	lsr	w0, w0, 24
-	strb	w1, [x20,2]
-	strb	w0, [x20,3]
-.L578:
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
-	ldp	x29, x30, [sp], 48
-	ret
+	strb	w1, [x20, 2]
+	strb	w0, [x20, 3]
+	b	.L613
 	.size	NandcCopy1KB, .-NandcCopy1KB
 	.align	2
 	.global	NandcXferData
 	.type	NandcXferData, %function
 NandcXferData:
-	stp	x29, x30, [sp, -176]!
+	stp	x29, x30, [sp, -192]!
+	tst	x3, 63
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	uxtb	w24, w0
+	stp	x25, x26, [sp, 64]
+	and	w25, w0, 255
+	stp	x19, x20, [sp, 16]
 	adrp	x0, .LANCHOR0
-	stp	x27, x28, [sp,80]
+	and	w20, w1, 255
 	add	x0, x0, :lo12:.LANCHOR0
-	add	x0, x0, w24, sxtw 4
-	ldr	x19, [x0,24]
-	and	x0, x3, 63
-	uxtb	w20, w1
-	uxtb	w23, w2
-	mov	x25, x3
+	sbfiz	x1, x25, 4, 32
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	mov	x26, x3
+	stp	x27, x28, [sp, 80]
+	and	w24, w2, 255
 	mov	x21, x4
-	cbnz	x0, .L595
-	cbnz	x4, .L596
-	add	x0, x29, 112
-	mov	w1, 255
+	ldr	x19, [x0, x1]
+	bne	.L631
+	cbnz	x4, .L632
+	add	x21, x29, 128
 	mov	w2, 64
-	add	x21, x29, 112
+	mov	w1, 255
+	add	x0, x29, 128
 	bl	ftl_memset
-.L596:
-	mov	w0, w24
-	mov	w1, w20
-	mov	w2, w23
-	mov	w3, 0
-	mov	x4, x25
+.L632:
 	mov	x5, x21
-	mov	w22, 0
+	mov	x4, x26
+	mov	w2, w24
+	mov	w3, 0
+	mov	w1, w20
+	mov	w0, w25
 	bl	NandcXferStart
-	mov	w0, w24
 	mov	w1, w20
+	mov	w0, w25
 	bl	NandcXferComp
-	cbnz	w20, .L597
+	cbnz	w20, .L656
 	adrp	x0, .LANCHOR2
-	ubfx	x3, x23, 1, 7
 	add	x2, x0, :lo12:.LANCHOR2
-	mov	w4, 128
+	ubfx	x3, x24, 1, 7
+	mov	w4, 64
 	add	x3, x21, x3, lsl 2
-	ldr	w1, [x2,2180]
+	ldr	w1, [x2, 2180]
 	cmp	w1, 25
-	mov	w1, 64
-	csel	w4, w1, w4, cc
-	mov	w1, w20
-.L599:
+	mov	w1, 128
+	csel	w4, w4, w1, cc
+	mov	w1, 0
+.L635:
+	add	w5, w4, w1
 	cmp	x21, x3
-	add	w5, w1, w4
-	beq	.L641
-	ldr	x6, [x2,2136]
+	bne	.L636
+	add	x0, x0, :lo12:.LANCHOR2
+	lsr	w24, w24, 2
+	mov	w2, 0
+	mov	w22, 0
+	ldr	w4, [x0, 2112]
+	ldr	w3, [x0, 2180]
+.L637:
+	cmp	w2, w24
+	bcs	.L633
+	cbnz	w3, .L643
+.L633:
+	str	wzr, [x19, 16]
+.L644:
+	adrp	x0, .LANCHOR2+2112
+	ldr	w0, [x0, #:lo12:.LANCHOR2+2112]
+	cmp	w0, 5
+	bls	.L630
+	cbnz	w20, .L630
+	ldr	w0, [x19]
+	mov	w1, 8192
+	movk	w1, 0x2, lsl 16
+	and	w1, w0, w1
+	cmp	w1, 139264
+	bne	.L630
+	orr	w0, w0, 131072
+	mov	w22, -1
+	str	w0, [x19]
+.L630:
+	mov	w0, w22
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 192
+	ret
+.L636:
+	ldr	x6, [x2, 2136]
 	and	x1, x1, 4294967292
 	add	x21, x21, 4
-	ldr	w1, [x6,x1]
-	strb	w1, [x21,-4]
+	ldr	w1, [x6, x1]
+	strb	w1, [x21, -4]
 	lsr	w6, w1, 8
-	strb	w6, [x21,-3]
+	strb	w6, [x21, -3]
 	lsr	w6, w1, 16
-	strb	w6, [x21,-2]
+	strb	w6, [x21, -2]
 	lsr	w1, w1, 24
-	strb	w1, [x21,-1]
+	strb	w1, [x21, -1]
 	mov	w1, w5
-	b	.L599
-.L641:
-	add	x0, x0, :lo12:.LANCHOR2
-	lsr	w23, w23, 2
-	ldr	w4, [x0,2180]
-	ldr	w5, [x0,2112]
-	mov	w0, 0
-	mov	w22, w0
-.L601:
-	cmp	w0, w23
-	bcs	.L597
-	cbz	w4, .L597
-	uxtw	x1, w0
-	add	x1, x1, 8
-	ldr	w1, [x19,x1,lsl 2]
-	str	w1, [x29,104]
-	ldr	w1, [x29,104]
-	tbnz	x1, 2, .L625
-	ldr	w3, [x29,104]
-	ubfx	x3, x3, 15, 1
-	cbnz	w3, .L625
-	cmp	w5, 5
-	bls	.L603
-	ldr	w2, [x29,104]
-	ubfx	x6, x2, 3, 5
-	ldr	w2, [x29,104]
-	ldr	w1, [x29,104]
-	ubfx	x2, x2, 27, 1
-	ubfx	x3, x1, 16, 5
-	ldr	w1, [x29,104]
-	orr	w2, w6, w2, lsl 5
-	ubfx	x1, x1, 29, 1
-	orr	w1, w3, w1, lsl 5
-	ldr	w3, [x29,104]
-	cmp	w2, w1
-	bls	.L604
-	ldr	w1, [x29,104]
-	ubfx	x3, x3, 3, 5
+	b	.L635
+.L643:
+	uxtw	x0, w2
+	add	x0, x0, 8
+	ldr	w0, [x19, x0, lsl 2]
+	str	w0, [x29, 120]
+	ldr	w0, [x29, 120]
+	tbnz	x0, 2, .L659
+	ldr	w0, [x29, 120]
+	tbnz	x0, 15, .L659
+	cmp	w4, 5
+	bls	.L639
+	ldr	w1, [x29, 120]
+	ubfx	x6, x1, 3, 5
+	ldr	w1, [x29, 120]
+	ldr	w0, [x29, 120]
 	ubfx	x1, x1, 27, 1
-	orr	w3, w3, w1, lsl 5
-	b	.L605
-.L604:
-	ubfx	x1, x3, 16, 5
-	ldr	w3, [x29,104]
-	ubfx	x3, x3, 29, 1
-	b	.L640
-.L603:
-	cmp	w5, 3
-	bls	.L605
-	ldr	w2, [x29,104]
-	ubfx	x6, x2, 3, 5
-	ldr	w2, [x29,104]
-	ldr	w1, [x29,104]
-	ubfx	x2, x2, 28, 1
-	ubfx	x3, x1, 16, 5
-	ldr	w1, [x29,104]
-	orr	w2, w6, w2, lsl 5
-	ubfx	x1, x1, 30, 1
-	orr	w1, w3, w1, lsl 5
-	ldr	w3, [x29,104]
-	cmp	w2, w1
-	bls	.L606
-	ubfx	x1, x3, 3, 5
-	ldr	w3, [x29,104]
-	ubfx	x3, x3, 28, 1
-	b	.L640
-.L606:
-	ubfx	x1, x3, 16, 5
-	ldr	w3, [x29,104]
-	ubfx	x3, x3, 30, 1
+	ubfx	x5, x0, 16, 5
+	ldr	w0, [x29, 120]
+	orr	w1, w6, w1, lsl 5
+	ubfx	x0, x0, 29, 1
+	orr	w0, w5, w0, lsl 5
+	cmp	w1, w0
+	ldr	w0, [x29, 120]
+	bls	.L640
+	ubfx	x1, x0, 3, 5
+	ldr	w0, [x29, 120]
+	ubfx	x0, x0, 27, 1
+.L665:
+	orr	w0, w1, w0, lsl 5
+.L641:
+	cmp	w22, w0
+	csel	w22, w22, w0, cs
+.L638:
+	add	w2, w2, 1
+	b	.L637
 .L640:
-	orr	w3, w1, w3, lsl 5
-.L605:
-	cmp	w22, w3
-	csel	w22, w22, w3, cs
-	b	.L602
-.L625:
+	ubfx	x1, x0, 16, 5
+	ldr	w0, [x29, 120]
+	ubfx	x0, x0, 29, 1
+	b	.L665
+.L639:
+	cmp	w4, 3
+	bls	.L660
+	ldr	w1, [x29, 120]
+	ubfx	x6, x1, 3, 5
+	ldr	w1, [x29, 120]
+	ldr	w0, [x29, 120]
+	ubfx	x1, x1, 28, 1
+	ubfx	x5, x0, 16, 5
+	ldr	w0, [x29, 120]
+	orr	w1, w6, w1, lsl 5
+	ubfx	x0, x0, 30, 1
+	orr	w0, w5, w0, lsl 5
+	cmp	w1, w0
+	ldr	w0, [x29, 120]
+	bls	.L642
+	ubfx	x1, x0, 3, 5
+	ldr	w0, [x29, 120]
+	ubfx	x0, x0, 28, 1
+	b	.L665
+.L642:
+	ubfx	x1, x0, 16, 5
+	ldr	w0, [x29, 120]
+	ubfx	x0, x0, 30, 1
+	b	.L665
+.L660:
+	mov	w0, 0
+	b	.L641
+.L659:
 	mov	w22, -1
-.L602:
-	add	w0, w0, 1
-	b	.L601
-.L597:
-	str	wzr, [x19,16]
-	b	.L608
-.L595:
+	b	.L638
+.L656:
+	mov	w22, 0
+	b	.L633
+.L631:
 	cmp	w20, 1
-	bne	.L639
+	bne	.L645
+	cmp	x4, 0
+	mov	w23, 2
+	csel	w23, w23, wzr, ne
+	mov	w27, 0
+	lsl	w23, w23, 1
 	mov	w22, 0
-	mov	w27, 2
-.L609:
-	cmp	w22, w23
-	bcs	.L642
-	and	w26, w22, 3
-	mov	x3, x25
-	cbz	x25, .L611
-	ubfiz	x0, x22, 9, 23
-	add	x3, x25, x0
-.L611:
-	cmp	x21, xzr
-	mov	x0, x19
-	csel	w4, w27, wzr, ne
+.L646:
+	cmp	w22, w24
+	bcc	.L648
+	mov	w22, 0
+	b	.L644
+.L648:
+	and	w28, w22, 3
+	cbz	x26, .L661
+	lsl	w3, w22, 9
+	add	x3, x26, x3
+.L647:
+	add	x4, x21, w27, uxtw
+	mov	w2, w28
 	mov	w1, 1
-	mov	w2, w26
-	mul	w4, w4, w22
-	add	w22, w22, 2
-	add	x4, x21, x4
+	mov	x0, x19
 	bl	NandcCopy1KB
+	add	w22, w22, 2
+	mov	w3, w28
+	mov	x5, 0
 	mov	x4, 0
-	mov	w0, w24
-	mov	w1, 1
 	mov	w2, 2
-	mov	w3, w26
-	mov	x5, x4
+	mov	w1, 1
+	mov	w0, w25
 	bl	NandcXferStart
-	mov	w0, w24
+	add	w27, w27, w23
 	mov	w1, 1
+	mov	w0, w25
 	bl	NandcXferComp
-	b	.L609
-.L642:
-	mov	w22, 0
-	b	.L608
-.L639:
-	mov	w1, 0
+	b	.L646
+.L661:
+	mov	x3, 0
+	b	.L647
+.L645:
+	mov	w0, w25
+	mov	x5, 0
 	mov	x4, 0
-	mov	w26, 0
-	mov	w0, w24
+	mov	w3, 0
 	mov	w2, 2
-	mov	w3, w1
-	mov	x5, x4
-	mov	w22, w26
-	mov	w27, 2
+	mov	w1, 0
 	bl	NandcXferStart
-.L614:
-	cmp	w26, w23
-	bcs	.L608
-	mov	w0, w24
+	mov	w27, 2
+	cmp	x21, 0
+	mov	w28, 0
+	csel	w27, w27, wzr, ne
+	mov	w23, 0
+	lsl	w0, w27, 1
+	mov	w22, 0
+	str	w0, [x29, 108]
+.L649:
+	cmp	w24, w23
+	bls	.L644
+	mov	w0, w25
 	mov	w1, w20
-	add	w28, w26, 2
 	bl	NandcXferComp
-	ldr	w0, [x19,32]
-	cmp	w28, w23
-	str	w0, [x29,104]
-	bcs	.L615
+	add	w27, w23, 2
+	ldr	w0, [x19, 32]
+	cmp	w24, w27
+	str	w0, [x29, 120]
+	bls	.L650
+	mov	x5, 0
 	mov	x4, 0
-	mov	w0, w24
-	mov	w1, 0
+	and	w3, w27, 3
 	mov	w2, 2
-	and	w3, w28, 3
-	mov	x5, x4
+	mov	w1, 0
+	mov	w0, w25
 	bl	NandcXferStart
-.L615:
-	ldr	w0, [x29,104]
-	tbnz	x0, 2, .L630
-	ldr	w0, [x29,104]
+.L650:
+	ldr	w0, [x29, 120]
+	tbnz	x0, 2, .L662
+	ldr	w0, [x29, 120]
 	ubfx	x1, x0, 3, 5
-	ldr	w0, [x29,104]
+	ldr	w0, [x29, 120]
 	ubfx	x0, x0, 27, 1
 	orr	w0, w1, w0, lsl 5
 	cmp	w22, w0
 	csel	w22, w22, w0, cs
-	b	.L616
-.L630:
-	mov	w22, -1
-.L616:
-	and	w2, w26, 3
-	mov	x3, x25
-	cbz	x25, .L617
-	ubfiz	x3, x26, 9, 23
-	add	x3, x25, x3
-.L617:
-	cmp	x21, xzr
+.L651:
+	and	w2, w23, 3
+	cbz	x26, .L663
+	lsl	w3, w23, 9
+	add	x3, x26, x3
+.L652:
+	add	x4, x21, w28, uxtw
 	mov	x0, x19
-	csel	w4, w27, wzr, ne
 	mov	w1, 0
-	mul	w4, w4, w26
-	mov	w26, w28
-	add	x4, x21, x4
 	bl	NandcCopy1KB
-	b	.L614
-.L608:
-	cbnz	w20, .L620
-	adrp	x0, .LANCHOR2+2112
-	ldr	w0, [x0,#:lo12:.LANCHOR2+2112]
-	cmp	w0, 5
-	bls	.L620
-	ldr	w0, [x19]
-	mov	w1, 8192
-	movk	w1, 0x2, lsl 16
-	and	w1, w0, w1
-	cmp	w1, 139264
-	bne	.L620
-	orr	w0, w0, 131072
+	ldr	w0, [x29, 108]
+	mov	w23, w27
+	add	w28, w28, w0
+	b	.L649
+.L662:
 	mov	w22, -1
-	str	w0, [x19]
-.L620:
-	mov	w0, w22
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 176
-	ret
+	b	.L651
+.L663:
+	mov	x3, 0
+	b	.L652
 	.size	NandcXferData, .-NandcXferData
 	.align	2
 	.global	FlashReadRawPage
 	.type	FlashReadRawPage, %function
 FlashReadRawPage:
 	stp	x29, x30, [sp, -64]!
-	mov	x4, x3
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	uxtb	w19, w0
-	adrp	x0, .LANCHOR1+481
-	str	x21, [sp,32]
-	mov	x21, x2
-	ldrb	w20, [x0,#:lo12:.LANCHOR1+481]
-	cbnz	w19, .L644
+	stp	x19, x20, [sp, 16]
+	ands	w19, w0, 255
+	stp	x21, x22, [sp, 32]
+	mov	w21, w1
+	str	x23, [sp, 48]
+	adrp	x1, .LANCHOR1+481
+	mov	x22, x2
+	mov	x23, x3
+	ldrb	w20, [x1, #:lo12:.LANCHOR1+481]
+	bne	.L667
 	adrp	x0, .LANCHOR0
 	add	x0, x0, :lo12:.LANCHOR0
-	ldrb	w5, [x0,89]
-	ldr	w0, [x0,92]
+	ldrb	w5, [x0, 89]
+	ldr	w0, [x0, 92]
 	mul	w0, w5, w0
-	cmp	w1, w0
+	cmp	w0, w21
 	mov	w0, 4
-	csel	w20, w20, w0, cs
-.L644:
+	csel	w20, w20, w0, ls
+.L667:
 	mov	w0, w19
-	str	x4, [x29,48]
-	str	x1, [x29,56]
 	bl	NandcWaitFlashReady
 	mov	w0, w19
 	bl	NandcFlashCs
-	ldr	x1, [x29,56]
+	mov	w1, w21
 	mov	w0, w19
 	bl	FlashReadCmd
 	mov	w0, w19
 	bl	NandcWaitFlashReady
-	ldr	x4, [x29,48]
 	mov	w2, w20
-	mov	x3, x21
+	mov	x4, x23
+	mov	x3, x22
 	mov	w1, 0
 	mov	w0, w19
 	bl	NandcXferData
-	mov	w20, w0
+	mov	w2, w0
 	mov	w0, w19
 	bl	NandcFlashDeCs
-	ldr	x21, [sp,32]
-	mov	w0, w20
-	ldp	x19, x20, [sp,16]
+	mov	w0, w2
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldr	x23, [sp, 48]
 	ldp	x29, x30, [sp], 64
 	ret
 	.size	FlashReadRawPage, .-FlashReadRawPage
@@ -4294,163 +4238,162 @@ FlashReadRawPage:
 	.global	FlashDdrTunningRead
 	.type	FlashDdrTunningRead, %function
 FlashDdrTunningRead:
-	stp	x29, x30, [sp, -128]!
+	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	uxtb	w24, w0
+	stp	x21, x22, [sp, 32]
+	mov	w22, 6
+	stp	x23, x24, [sp, 48]
+	and	w23, w0, 255
 	adrp	x0, .LANCHOR2
-	stp	x19, x20, [sp,16]
-	add	x20, x0, :lo12:.LANCHOR2
-	mov	x19, x0
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
+	add	x21, x0, :lo12:.LANCHOR2
+	stp	x25, x26, [sp, 64]
 	mov	w26, w1
+	stp	x19, x20, [sp, 16]
+	mov	x24, x2
+	stp	x27, x28, [sp, 80]
+	mov	x19, x0
+	mov	x25, x3
 	mov	w0, 12
-	ldr	x1, [x20,1152]
-	mov	w22, 6
-	mov	x25, x2
-	mov	x23, x3
+	ldr	x1, [x21, 1152]
 	mov	w27, w4
-	mov	w21, 1024
-	ldr	w1, [x1,304]
-	str	w1, [x29,124]
-	ldr	w1, [x20,2112]
+	ldr	w1, [x1, 304]
+	str	w1, [x29, 108]
+	ldr	w1, [x21, 2112]
 	cmp	w1, 8
 	csel	w22, w22, w0, cc
-	cbz	w4, .L647
+	cbz	w4, .L683
 	mov	w0, 1
 	bl	FlashSetInterfaceMode
 	mov	w0, 1
 	bl	NandcSetMode
-	mov	w0, w24
+	mov	w0, w23
 	bl	FlashReset
+	mov	x3, x25
+	mov	x2, x24
 	mov	w1, w26
-	mov	x2, x25
-	mov	x3, x23
-	mov	w0, w24
+	mov	w0, w23
 	bl	FlashReadRawPage
-	mov	w21, w0
-	ldrb	w0, [x20,2093]
+	mov	w20, w0
+	ldrb	w0, [x21, 2093]
 	bl	FlashSetInterfaceMode
-	ldrb	w0, [x20,2093]
+	ldrb	w0, [x21, 2093]
 	bl	NandcSetMode
-	cmn	w21, #1
-	bne	.L648
-.L657:
-	mov	w21, -1
-	b	.L649
-.L648:
-	adrp	x0, .LC7
+	cmn	w20, #1
+	bne	.L672
+.L681:
+	mov	w20, -1
+.L669:
+	mov	w0, w20
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L672:
+	mov	w2, w20
 	mov	w1, w26
+	adrp	x0, .LC7
 	add	x0, x0, :lo12:.LC7
-	mov	w2, w21
 	bl	printk
-	cmp	w21, 9
-	bhi	.L650
-	adrp	x0, .LANCHOR0
-	add	x0, x0, :lo12:.LANCHOR0
-	add	x0, x0, w24, sxtw 4
-	ldr	x0, [x0,24]
-	ldr	w1, [x0,3840]
+	cmp	w20, 9
+	bhi	.L674
+	sbfiz	x0, x23, 4, 32
+	adrp	x1, .LANCHOR0
+	add	x1, x1, :lo12:.LANCHOR0
+	ldr	x0, [x1, x0]
+	ldr	w1, [x0, 3840]
 	ldr	w1, [x0]
 	orr	w1, w1, 131072
 	str	w1, [x0]
-.L650:
+.L674:
 	add	x0, x19, :lo12:.LANCHOR2
-	ldr	w1, [x0,2184]
+	ldr	w1, [x0, 2184]
 	add	w1, w1, 1
-	str	w1, [x0,2184]
+	str	w1, [x0, 2184]
 	cmp	w1, 2047
-	bls	.L649
-	mov	x23, 0
-	str	wzr, [x0,2184]
-	mov	x25, x23
-.L647:
+	bls	.L669
+	mov	x25, 0
+	mov	x24, 0
+	str	wzr, [x0, 2184]
+.L671:
+	mov	w5, 0
+	mov	w21, 0
+	mov	w6, 0
 	mov	w19, 0
 	mov	w28, -1
-	mov	w5, w19
-	mov	w6, w19
-	mov	w20, w19
-.L655:
+.L679:
+	stp	w5, w6, [x29, 100]
 	mov	w0, w22
-	str	x5, [x29,104]
-	str	x6, [x29,112]
 	bl	NandcSetDdrPara
 	mov	w1, w26
-	mov	w0, w24
-	mov	x2, x25
-	mov	x3, x23
+	mov	x3, x25
+	mov	x2, x24
+	mov	w0, w23
 	bl	FlashReadRawPage
-	add	w1, w21, 1
-	ldr	x6, [x29,112]
+	add	w1, w20, 1
 	cmp	w0, w1
-	ldr	x5, [x29,104]
-	bhi	.L651
+	ldp	w5, w6, [x29, 100]
+	bhi	.L675
 	cmp	w0, 2
-	bhi	.L661
-	add	w20, w20, 1
-	cmp	w20, 9
-	bls	.L661
-	sub	w19, w22, w20
-	mov	w21, w0
-	mov	w28, 0
-	b	.L653
-.L651:
-	cmp	w6, w20
-	bcs	.L662
-	cmp	w20, 7
-	sub	w5, w19, w20
-	bhi	.L663
-	mov	w6, w20
-	b	.L662
-.L661:
-	mov	x23, 0
-	mov	w19, w22
-	mov	w21, w0
+	bhi	.L685
+	add	w19, w19, 1
+	cmp	w19, 9
+	bls	.L685
+	mov	w1, w21
+	mov	w20, w0
+	sub	w21, w22, w19
 	mov	w28, 0
-	mov	x25, x23
-	b	.L652
-.L662:
-	mov	w20, 0
-.L652:
-	add	w22, w22, 2
-	cmp	w22, 69
-	bls	.L655
-.L653:
-	cmp	w6, w20
-	csel	w19, w19, w5, cc
-	b	.L654
-.L663:
-	mov	w19, w5
-.L654:
-	cbz	w19, .L656
+.L677:
+	cmp	w19, w6
+	csel	w21, w21, w1, hi
+.L678:
+	cbz	w21, .L680
+	mov	w1, w21
 	adrp	x0, .LC8
-	mov	w1, w19
 	add	x0, x0, :lo12:.LC8
 	bl	printk
-	mov	w0, w19
+	mov	w0, w21
 	bl	NandcSetDdrPara
-.L656:
-	cbz	w28, .L649
+.L680:
+	cbz	w28, .L669
 	adrp	x0, .LC9
-	mov	w1, w24
-	add	x0, x0, :lo12:.LC9
 	mov	w2, w26
+	mov	w1, w23
+	add	x0, x0, :lo12:.LC9
 	bl	printk
-	cbz	w27, .L657
-	ldr	w0, [x29,124]
-	lsr	w0, w0, 8
+	cbz	w27, .L681
+	ldr	w1, [x29, 108]
+	lsr	w0, w1, 8
 	bl	NandcSetDdrPara
-.L649:
-	mov	w0, w21
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
-	ret
+	b	.L669
+.L683:
+	mov	w20, 1024
+	b	.L671
+.L675:
+	cmp	w19, w6
+	bls	.L686
+	sub	w21, w5, w19
+	cmp	w19, 7
+	bhi	.L678
+	mov	w6, w19
+.L686:
+	mov	w19, 0
+	b	.L676
+.L685:
+	mov	w5, w22
+	mov	w20, w0
+	mov	w28, 0
+	mov	x25, 0
+	mov	x24, 0
+.L676:
+	add	w22, w22, 2
+	cmp	w22, 69
+	bls	.L679
+	mov	w1, w21
+	mov	w21, w5
+	b	.L677
 	.size	FlashDdrTunningRead, .-FlashDdrTunningRead
 	.align	2
 	.global	FlashReadPage
@@ -4458,98 +4401,96 @@ FlashDdrTunningRead:
 FlashReadPage:
 	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	uxtb	w20, w0
+	stp	x19, x20, [sp, 16]
+	and	w20, w0, 255
+	stp	x21, x22, [sp, 32]
 	mov	w0, w20
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
+	stp	x23, x24, [sp, 48]
 	mov	w22, w1
-	mov	x25, x2
-	mov	x24, x3
+	stp	x25, x26, [sp, 64]
+	mov	x24, x2
+	mov	x25, x3
+	adrp	x21, .LANCHOR2
 	bl	FlashReadRawPage
-	cmn	w0, #1
 	mov	w19, w0
-	adrp	x21, .LANCHOR2
-	bne	.L673
+	cmn	w0, #1
+	bne	.L696
 	adrp	x23, .LANCHOR0
 	add	x23, x23, :lo12:.LANCHOR0
-	ldrb	w26, [x23,96]
-	cbnz	w26, .L674
-.L676:
+	ldrb	w26, [x23, 96]
+	cbnz	w26, .L697
+.L699:
 	add	x23, x21, :lo12:.LANCHOR2
-	ldrb	w0, [x23,2104]
-	cbz	w0, .L673
-	b	.L694
-.L674:
-	mov	w0, w20
-	mov	w1, w22
-	mov	x2, x25
-	mov	x3, x24
-	strb	wzr, [x23,96]
-	bl	FlashReadRawPage
-	strb	w26, [x23,96]
-	cmn	w0, #1
-	beq	.L676
-	mov	w19, w0
-	b	.L673
-.L694:
-	ldr	x0, [x23,1152]
-	mov	w1, w22
-	mov	x2, x25
-	mov	x3, x24
+	ldrb	w0, [x23, 2104]
+	cbz	w0, .L696
+	ldr	x0, [x23, 1152]
 	mov	w4, 1
-	ldr	w26, [x0,304]
+	mov	x3, x25
+	mov	x2, x24
+	mov	w1, w22
+	ldr	w26, [x0, 304]
 	mov	w0, w20
 	bl	FlashDdrTunningRead
-	cmn	w0, #1
 	mov	w19, w0
-	beq	.L677
-	ldrb	w0, [x23,1221]
+	cmn	w0, #1
+	beq	.L700
+	ldrb	w0, [x23, 1221]
 	cmp	w19, w0, lsr 1
-	bls	.L673
-.L677:
+	bls	.L696
+.L700:
 	lsr	w0, w26, 8
 	bl	NandcSetDdrPara
-.L673:
+	b	.L696
+.L697:
+	strb	wzr, [x23, 96]
+	mov	x3, x25
+	mov	x2, x24
+	mov	w1, w22
+	mov	w0, w20
+	bl	FlashReadRawPage
+	strb	w26, [x23, 96]
+	cmn	w0, #1
+	beq	.L699
+	mov	w19, w0
+.L696:
 	add	x21, x21, :lo12:.LANCHOR2
+	ldr	x4, [x21, 2192]
+	cbz	x4, .L695
 	cmn	w19, #1
-	ldr	x4, [x21,2192]
-	bne	.L678
-	cbz	x4, .L678
+	bne	.L695
+	mov	x3, x25
+	mov	x2, x24
 	mov	w1, w22
-	mov	x2, x25
-	mov	x3, x24
 	mov	w0, w20
 	blr	x4
 	mov	w19, w0
+	mov	w1, w0
+	mov	w3, w22
+	mov	w2, w20
 	adrp	x0, .LC10
-	mov	w1, w19
 	add	x0, x0, :lo12:.LC10
-	mov	w2, w20
-	mov	w3, w22
 	bl	printk
 	cmn	w19, #1
-	bne	.L678
-	ldrb	w0, [x21,1220]
-	cbz	w0, .L678
+	bne	.L695
+	ldrb	w0, [x21, 1220]
+	cbz	w0, .L695
 	mov	w0, w20
 	bl	flash_enter_slc_mode
-	ldr	x4, [x21,2192]
-	mov	w0, w20
+	ldr	x4, [x21, 2192]
+	mov	x3, x25
+	mov	x2, x24
 	mov	w1, w22
-	mov	x2, x25
-	mov	x3, x24
+	mov	w0, w20
 	blr	x4
 	mov	w19, w0
 	mov	w0, w20
 	bl	flash_exit_slc_mode
-.L678:
+.L695:
 	mov	w0, w19
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
 	ldp	x29, x30, [sp], 80
 	ret
 	.size	FlashReadPage, .-FlashReadPage
@@ -4559,361 +4500,365 @@ FlashReadPage:
 FlashDdrParaScan:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	mov	w20, w1
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	add	x22, x19, :lo12:.LANCHOR2
-	uxtb	w21, w0
-	ldrb	w0, [x22,2093]
+	and	w20, w0, 255
+	mov	w21, w1
+	ldrb	w0, [x22, 2093]
 	bl	FlashSetInterfaceMode
-	ldrb	w0, [x22,2093]
+	ldrb	w0, [x22, 2093]
 	bl	NandcSetMode
+	mov	w4, 0
+	mov	x3, 0
 	mov	x2, 0
-	mov	w1, w20
-	mov	x3, x2
-	mov	w4, w2
-	mov	w0, w21
+	mov	w1, w21
+	mov	w0, w20
 	bl	FlashDdrTunningRead
+	mov	x3, 0
 	mov	w22, w0
 	mov	x2, 0
-	mov	w0, w21
-	mov	w1, w20
-	mov	x3, x2
+	mov	w1, w21
+	mov	w0, w20
 	bl	FlashReadRawPage
 	cmn	w0, #1
-	beq	.L699
+	beq	.L716
 	cmn	w22, #1
-	bne	.L696
-.L699:
+	bne	.L717
+.L716:
 	add	x20, x19, :lo12:.LANCHOR2
-	ldrb	w0, [x20,2093]
-	tbz	x0, 0, .L696
+	ldrb	w0, [x20, 2093]
+	tbz	x0, 0, .L717
 	mov	w0, 1
 	bl	FlashSetInterfaceMode
 	mov	w0, 1
 	bl	NandcSetMode
-	strb	wzr, [x20,2104]
-	b	.L698
-.L696:
-	add	x19, x19, :lo12:.LANCHOR2
-	mov	w0, 1
-	strb	w0, [x19,2104]
-.L698:
+	strb	wzr, [x20, 2104]
+.L718:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
+.L717:
+	add	x19, x19, :lo12:.LANCHOR2
+	mov	w0, 1
+	strb	w0, [x19, 2104]
+	b	.L718
 	.size	FlashDdrParaScan, .-FlashDdrParaScan
 	.align	2
 	.global	FlashLoadPhyInfo
 	.type	FlashLoadPhyInfo, %function
 FlashLoadPhyInfo:
-	stp	x29, x30, [sp, -112]!
+	stp	x29, x30, [sp, -128]!
 	mov	w0, 60
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR0
-	adrp	x19, .LANCHOR2
-	strb	w0, [x29,104]
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR0
+	add	x1, x19, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	strb	w0, [x29, 120]
 	mov	w0, 40
-	strb	w0, [x29,105]
+	stp	x23, x24, [sp, 48]
+	adrp	x22, .LANCHOR2
+	stp	x27, x28, [sp, 80]
+	adrp	x21, .LANCHOR1
+	stp	x25, x26, [sp, 64]
+	mov	w27, 20036
+	strb	w0, [x29, 121]
 	mov	w0, 24
-	strb	w0, [x29,106]
+	strb	w0, [x29, 122]
 	mov	w0, 16
-	strb	w0, [x29,107]
-	add	x0, x20, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	stp	x23, x24, [sp,48]
-	add	x19, x19, :lo12:.LANCHOR2
-	adrp	x22, .LANCHOR1
-	stp	x27, x28, [sp,80]
-	add	x22, x22, :lo12:.LANCHOR1
-	mov	w21, 0
-	ldr	w24, [x0,92]
-	mov	w23, 4
-	ldr	x0, [x20,#:lo12:.LANCHOR0]
-	mov	w26, -1
-	str	x0, [x19,2200]
-	add	x22, x22, 472
+	strb	w0, [x29, 123]
+	add	x21, x21, :lo12:.LANCHOR1
+	ldr	w0, [x1, 92]
+	mov	w20, 0
+	ldr	x1, [x1, 64]
+	mov	w24, 4
+	str	w0, [x29, 108]
+	add	x0, x22, :lo12:.LANCHOR2
+	mov	w23, -1
+	movk	w27, 0x4e41, lsl 16
+	add	x21, x21, 472
+	str	x1, [x0, 2200]
+	str	wzr, [x0, 2208]
 	mov	w0, 0
-	add	x25, x19, 1232
-	str	wzr, [x19,2208]
 	bl	flash_enter_slc_mode
-.L707:
-	add	w28, w21, 1
-	mov	x27, 0
-.L709:
-	add	x0, x29, 104
-	ldrb	w0, [x27,x0]
+.L727:
+	add	w28, w20, 1
+	add	x25, x19, :lo12:.LANCHOR0
+	mov	x26, 0
+.L729:
+	add	x0, x29, 120
+	ldrb	w0, [x0, x26]
 	bl	FlashBchSel
-	ldr	x2, [x20,#:lo12:.LANCHOR0]
-	mov	w0, 0
-	mov	w1, w21
+	ldr	x2, [x25, 64]
 	mov	x3, 0
+	mov	w1, w20
+	mov	w0, 0
 	bl	FlashReadRawPage
 	cmn	w0, #1
-	bne	.L708
-	ldr	x2, [x20,#:lo12:.LANCHOR0]
-	mov	w0, 0
-	mov	w1, w28
+	bne	.L728
+	ldr	x2, [x25, 64]
 	mov	x3, 0
+	mov	w1, w28
+	mov	w0, 0
 	bl	FlashReadRawPage
 	cmn	w0, #1
-	bne	.L708
-	add	x27, x27, 1
-	cmp	x27, 4
-	beq	.L710
-	b	.L709
-.L711:
+	bne	.L728
+	add	x26, x26, 1
+	cmp	x26, 4
+	bne	.L729
+.L730:
+	ldr	w0, [x29, 108]
+	subs	w24, w24, #1
+	add	w20, w20, w0
+	bne	.L727
+	b	.L735
+.L731:
 	mov	w1, 2036
-	add	x0, x27, 12
-	mov	w26, -1
+	add	x0, x6, 12
 	bl	js_hash
-	ldr	w1, [x27,8]
-	cmp	w1, w0
-	beq	.L722
-.L710:
-	subs	w23, w23, #1
-	add	w21, w21, w24
-	bne	.L707
-	mov	w0, w23
-.L721:
-	bl	flash_exit_slc_mode
-	mov	w0, w26
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 112
-	ret
-.L708:
-	ldr	x27, [x19,2200]
-	mov	w0, 20036
-	movk	w0, 0x4e41, lsl 16
-	ldr	w1, [x27]
+	ldr	w1, [x6, 8]
 	cmp	w1, w0
-	bne	.L710
-	cbnz	w26, .L711
-	add	x20, x20, :lo12:.LANCHOR0
-	ldr	w0, [x20,92]
-	udiv	w21, w21, w0
-	mov	w0, w26
-	add	w21, w21, 1
-	str	w21, [x20,8]
-	b	.L721
-.L722:
-	add	x1, x27, 160
+	bne	.L737
+	add	x1, x6, 160
 	mov	w2, 32
-	mov	x0, x22
-	add	x26, x20, :lo12:.LANCHOR0
+	mov	x0, x21
 	bl	ftl_memcpy
-	ldr	x1, [x19,2200]
+	ldr	x1, [x25, 2200]
+	add	x23, x19, :lo12:.LANCHOR0
 	mov	w2, 32
-	add	x0, x26, 112
+	add	x0, x23, 112
 	add	x1, x1, 192
 	bl	ftl_memcpy
-	ldr	x1, [x19,2200]
+	ldr	x1, [x25, 2200]
 	mov	w2, 852
-	mov	x0, x25
+	add	x0, x25, 1232
 	add	x1, x1, 224
 	bl	ftl_memcpy
-	ldrh	w0, [x22,10]
+	ldrh	w0, [x21, 10]
 	bl	FlashBlockAlignInit
-	str	w21, [x19,2208]
-	ldr	x0, [x19,2200]
-	ldr	w1, [x0,1076]
-	strb	w1, [x19,2104]
-	ldr	w1, [x26,92]
-	udiv	w1, w21, w1
-	add	w1, w1, 1
-	cmp	w1, 1
-	bhi	.L720
-	mov	w1, 2
-.L720:
-	ldrh	w0, [x0,14]
-	str	w1, [x26,8]
-	mov	w26, 0
-	strb	w0, [x19,2212]
-	b	.L710
+	str	w20, [x25, 2208]
+	ldr	x1, [x25, 2200]
+	ldr	w0, [x1, 1076]
+	strb	w0, [x25, 2104]
+	ldr	w0, [x23, 92]
+	udiv	w0, w20, w0
+	add	w0, w0, 1
+	cmp	w0, 1
+	bls	.L733
+.L740:
+	str	w0, [x23, 72]
+	add	x0, x22, :lo12:.LANCHOR2
+	ldrh	w1, [x1, 14]
+	mov	w23, 0
+	strb	w1, [x0, 2212]
+	b	.L730
+.L733:
+	mov	w0, 2
+	b	.L740
+.L737:
+	mov	w23, -1
+	b	.L730
+.L728:
+	add	x25, x22, :lo12:.LANCHOR2
+	ldr	x6, [x25, 2200]
+	ldr	w0, [x6]
+	cmp	w0, w27
+	bne	.L730
+	cbnz	w23, .L731
+	add	x19, x19, :lo12:.LANCHOR0
+	ldr	w0, [x19, 92]
+	udiv	w20, w20, w0
+	add	w20, w20, 1
+	str	w20, [x19, 72]
+.L735:
+	mov	w0, 0
+	bl	flash_exit_slc_mode
+	mov	w0, w23
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 128
+	ret
 	.size	FlashLoadPhyInfo, .-FlashLoadPhyInfo
 	.align	2
 	.global	ToshibaReadRetrial
 	.type	ToshibaReadRetrial, %function
 ToshibaReadRetrial:
-	stp	x29, x30, [sp, -144]!
+	stp	x29, x30, [sp, -128]!
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	uxtb	w23, w0
-	mov	w0, w23
-	str	w1, [x29,132]
-	stp	x19, x20, [sp,16]
-	stp	x27, x28, [sp,80]
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	mov	x27, x2
+	stp	x21, x22, [sp, 32]
+	and	w21, w0, 255
+	stp	x25, x26, [sp, 64]
+	mov	w0, w21
+	stp	x19, x20, [sp, 16]
+	mov	x25, x2
+	stp	x27, x28, [sp, 80]
 	mov	x26, x3
+	str	w1, [x29, 120]
+	stp	x23, x24, [sp, 48]
 	bl	NandcWaitFlashReady
-	adrp	x20, g_retryMode
+	sbfiz	x1, x21, 4, 32
 	adrp	x0, .LANCHOR0
-	sbfiz	x1, x23, 4, 32
 	add	x0, x0, :lo12:.LANCHOR0
-	mov	w22, 0
-	add	x0, x0, 24
 	add	x2, x0, x1
-	ldr	x24, [x0,x1]
-	ldrb	w0, [x2,8]
-	str	x0, [x29,136]
-	add	x19, x0, 8
-	mov	x28, x0
-	ldrb	w0, [x20,#:lo12:g_retryMode]
-	add	x19, x24, x19, lsl 8
+	ldr	x22, [x0, x1]
+	adrp	x1, g_retryMode
+	ldrb	w27, [x2, 8]
+	ldrb	w0, [x1, #:lo12:g_retryMode]
+	str	x1, [x29, 112]
+	add	x19, x27, 8
 	sub	w0, w0, #67
-	uxtb	w0, w0
+	str	w27, [x29, 124]
+	and	w0, w0, 255
+	add	x19, x22, x19, lsl 8
 	cmp	w0, 1
-	bls	.L724
+	bls	.L758
 	adrp	x0, .LANCHOR2+2104
-	ldrb	w0, [x0,#:lo12:.LANCHOR2+2104]
-	cbz	w0, .L725
-	mov	w0, w22
-	mov	w22, 1
+	ldrb	w0, [x0, #:lo12:.LANCHOR2+2104]
+	cbz	w0, .L759
+	mov	w23, 1
+	mov	w0, 0
 	bl	NandcSetDdrMode
-.L725:
-	ubfiz	x0, x28, 8, 8
-	mov	w2, 92
-	add	x0, x24, x0
-	str	w2, [x0,2056]
-	mov	w2, 197
-	str	w2, [x0,2056]
-.L724:
-	adrp	x0, g_maxRetryCount
-	mov	w21, 1
-	add	x0, x0, :lo12:g_maxRetryCount
-	str	x0, [x29,120]
-	ldr	x0, [x29,136]
-	mov	w25, -1
+.L743:
+	add	x0, x22, x27, lsl 8
+	mov	w1, 92
+	str	w1, [x0, 2056]
+	mov	w1, 197
+	str	w1, [x0, 2056]
+.L742:
+	ldrsw	x0, [x29, 124]
+	mov	w20, 1
+	mov	w24, -1
 	add	x0, x0, 8
-	lsl	x0, x0, 8
-	str	x0, [x29,112]
-	ubfiz	x0, x28, 8, 8
-	str	x0, [x29,104]
-.L726:
+	add	x0, x22, x0, lsl 8
+	str	x0, [x29, 104]
+.L744:
 	adrp	x0, g_maxRetryCount
-	ldrb	w0, [x0,#:lo12:g_maxRetryCount]
+	ldrb	w0, [x0, #:lo12:g_maxRetryCount]
 	add	w0, w0, 1
-	cmp	w21, w0
-	bcs	.L751
-	ldrb	w0, [x20,#:lo12:g_retryMode]
-	mov	w1, w21
+	cmp	w20, w0
+	bcc	.L753
+	mov	w28, w24
+.L752:
+	ldr	x0, [x29, 112]
+	mov	w1, 0
+	ldrb	w0, [x0, #:lo12:g_retryMode]
 	sub	w0, w0, #67
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 1
 	mov	x0, x19
-	bhi	.L727
+	bhi	.L754
 	bl	SandiskSetRRPara
-	b	.L728
-.L727:
-	bl	ToshibaSetRRPara
-.L728:
-	ldrb	w0, [x20,#:lo12:g_retryMode]
+.L755:
+	ldrsw	x0, [x29, 124]
+	add	x0, x0, 8
+	add	x22, x22, x0, lsl 8
+	mov	w0, 255
+	str	w0, [x22, 8]
+	adrp	x0, .LANCHOR2+1221
+	ldrb	w0, [x0, #:lo12:.LANCHOR2+1221]
+	add	w0, w0, w0, lsl 1
+	cmp	w28, w0, lsr 2
+	bcc	.L756
+	cmn	w28, #1
+	mov	w0, 256
+	csel	w28, w28, w0, eq
+.L756:
+	mov	w0, w21
+	bl	NandcWaitFlashReady
+	cbz	w23, .L741
+	mov	w0, 4
+	bl	NandcSetDdrMode
+.L741:
+	mov	w0, w28
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 128
+	ret
+.L759:
+	mov	w23, 0
+	b	.L743
+.L758:
+	mov	w23, 0
+	b	.L742
+.L753:
+	ldr	x0, [x29, 112]
+	mov	w1, w20
+	ldrb	w0, [x0, #:lo12:g_retryMode]
+	sub	w0, w0, #67
+	and	w0, w0, 255
+	cmp	w0, 1
+	mov	x0, x19
+	bhi	.L745
+	bl	SandiskSetRRPara
+.L746:
+	ldr	x0, [x29, 112]
+	ldrb	w0, [x0, #:lo12:g_retryMode]
 	cmp	w0, 34
-	bne	.L729
-	ldr	x0, [x29,120]
-	ldrb	w0, [x0]
+	bne	.L747
+	adrp	x0, g_maxRetryCount
+	ldrb	w0, [x0, #:lo12:g_maxRetryCount]
 	sub	w0, w0, #3
-	cmp	w21, w0
-	bne	.L729
-	ldr	x0, [x29,112]
-	mov	w1, 179
-	add	x0, x24, x0
-	str	w1, [x0,8]
-.L729:
-	ldr	x0, [x29,104]
+	cmp	w20, w0
+	bne	.L747
+	ldr	x1, [x29, 104]
+	mov	w0, 179
+	str	w0, [x1, 8]
+.L747:
+	add	x0, x22, x27, lsl 8
 	mov	w1, 38
-	add	x0, x24, x0
-	str	w1, [x0,2056]
+	str	w1, [x0, 2056]
 	mov	w1, 93
-	str	w1, [x0,2056]
-	cbz	w22, .L730
+	str	w1, [x0, 2056]
+	cbz	w23, .L748
 	mov	w0, 4
 	bl	NandcSetDdrMode
-	ldr	w1, [x29,132]
-	mov	w0, w23
-	mov	x2, x27
+	ldr	w1, [x29, 120]
 	mov	x3, x26
+	mov	x2, x25
+	mov	w0, w21
 	bl	FlashReadRawPage
 	mov	w28, w0
 	mov	w0, 0
 	bl	NandcSetDdrMode
-	b	.L731
-.L730:
-	ldr	w1, [x29,132]
-	mov	w0, w23
-	mov	x2, x27
-	mov	x3, x26
-	bl	FlashReadRawPage
-	mov	w28, w0
-.L731:
+.L749:
 	cmn	w28, #1
-	beq	.L732
+	beq	.L750
 	adrp	x0, .LANCHOR2+1221
-	cmn	w25, #1
-	csel	w25, w25, w28, ne
-	ldrb	w0, [x0,#:lo12:.LANCHOR2+1221]
+	cmn	w24, #1
+	csel	w24, w24, w28, ne
+	ldrb	w0, [x0, #:lo12:.LANCHOR2+1221]
 	add	w0, w0, w0, lsl 1
 	cmp	w28, w0, lsr 2
-	bcc	.L734
+	bcc	.L752
 	mov	x26, 0
-	mov	x27, x26
-.L732:
-	add	w21, w21, 1
-	b	.L726
-.L751:
-	mov	w28, w25
-.L734:
-	ldrb	w0, [x20,#:lo12:g_retryMode]
-	mov	w1, 0
-	sub	w0, w0, #67
-	uxtb	w0, w0
-	cmp	w0, 1
-	mov	x0, x19
-	bhi	.L736
-	bl	SandiskSetRRPara
-	b	.L737
-.L736:
+	mov	x25, 0
+.L750:
+	add	w20, w20, 1
+	b	.L744
+.L745:
 	bl	ToshibaSetRRPara
-.L737:
-	ldr	x0, [x29,136]
-	add	x0, x0, 8
-	add	x24, x24, x0, lsl 8
-	mov	w0, 255
-	str	w0, [x24,8]
-	adrp	x0, .LANCHOR2+1221
-	ldrb	w0, [x0,#:lo12:.LANCHOR2+1221]
-	add	w0, w0, w0, lsl 1
-	cmp	w28, w0, lsr 2
-	bcc	.L738
-	cmn	w28, #1
-	mov	w0, 256
-	csel	w28, w28, w0, eq
-.L738:
-	mov	w0, w23
-	bl	NandcWaitFlashReady
-	cbz	w22, .L739
-	mov	w0, 4
-	bl	NandcSetDdrMode
-.L739:
-	mov	w0, w28
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 144
-	ret
+	b	.L746
+.L748:
+	ldr	w1, [x29, 120]
+	mov	x3, x26
+	mov	x2, x25
+	mov	w0, w21
+	bl	FlashReadRawPage
+	mov	w28, w0
+	b	.L749
+.L754:
+	bl	ToshibaSetRRPara
+	b	.L755
 	.size	ToshibaReadRetrial, .-ToshibaReadRetrial
 	.align	2
 	.global	SamsungReadRetrial
@@ -4921,247 +4866,232 @@ ToshibaReadRetrial:
 SamsungReadRetrial:
 	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	uxtb	w21, w0
-	str	x27, [sp,80]
-	mov	w0, w21
-	mov	x22, x3
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	mov	w24, w1
-	mov	x23, x2
+	stp	x21, x22, [sp, 32]
+	and	w22, w0, 255
+	stp	x19, x20, [sp, 16]
+	mov	w0, w22
+	stp	x23, x24, [sp, 48]
+	mov	w23, w1
+	stp	x25, x26, [sp, 64]
+	mov	x24, x2
+	str	x27, [sp, 80]
+	mov	x25, x3
 	bl	NandcWaitFlashReady
 	adrp	x26, g_maxRetryCount
-	adrp	x4, .LANCHOR0
-	sbfiz	x0, x21, 4, 32
-	add	x4, x4, :lo12:.LANCHOR0
-	mov	w25, 1
-	add	x4, x4, 24
-	mov	w19, -1
-	add	x1, x4, x0
-	add	x26, x26, :lo12:g_maxRetryCount
+	sbfiz	x1, x22, 4, 32
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
 	adrp	x27, .LANCHOR2
-	ldr	x0, [x4,x0]
-	ldrb	w20, [x1,8]
+	add	x2, x0, x1
+	add	x26, x26, :lo12:g_maxRetryCount
+	add	x27, x27, :lo12:.LANCHOR2
+	mov	w21, 1
+	ldr	x0, [x0, x1]
+	mov	w19, -1
+	ldrb	w20, [x2, 8]
 	add	x20, x20, 8
 	add	x20, x0, x20, lsl 8
-.L753:
+.L770:
 	ldrb	w0, [x26]
 	add	w0, w0, 1
-	cmp	w25, w0
-	bcs	.L756
-	mov	x0, x20
-	mov	w1, w25
-	bl	SamsungSetRRPara
-	mov	w0, w21
-	mov	w1, w24
-	mov	x2, x23
-	mov	x3, x22
-	bl	FlashReadRawPage
-	cmn	w0, #1
-	beq	.L754
-	add	x1, x27, :lo12:.LANCHOR2
-	cmn	w19, #1
-	csel	w19, w19, w0, ne
-	ldrb	w1, [x1,1221]
-	add	w1, w1, w1, lsl 1
-	cmp	w0, w1, lsr 2
-	bcc	.L759
-	mov	x22, 0
-	mov	x23, x22
-.L754:
-	add	w25, w25, 1
-	b	.L753
-.L759:
-	mov	w19, w0
-.L756:
+	cmp	w21, w0
+	bcc	.L774
+.L773:
 	mov	x0, x20
 	mov	w1, 0
 	bl	SamsungSetRRPara
 	adrp	x0, .LANCHOR2+1221
-	ldrb	w0, [x0,#:lo12:.LANCHOR2+1221]
+	ldrb	w0, [x0, #:lo12:.LANCHOR2+1221]
 	add	w0, w0, w0, lsl 1
 	cmp	w19, w0, lsr 2
-	bcc	.L758
+	bcc	.L769
 	cmn	w19, #1
 	mov	w0, 256
 	csel	w19, w19, w0, eq
-.L758:
+.L769:
 	mov	w0, w19
-	ldr	x27, [sp,80]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
+	ldr	x27, [sp, 80]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
 	ldp	x29, x30, [sp], 96
 	ret
+.L774:
+	mov	w1, w21
+	mov	x0, x20
+	bl	SamsungSetRRPara
+	mov	x3, x25
+	mov	x2, x24
+	mov	w1, w23
+	mov	w0, w22
+	bl	FlashReadRawPage
+	cmn	w0, #1
+	beq	.L771
+	ldrb	w1, [x27, 1221]
+	cmn	w19, #1
+	csel	w19, w19, w0, ne
+	add	w1, w1, w1, lsl 1
+	cmp	w0, w1, lsr 2
+	bcc	.L776
+	mov	x25, 0
+	mov	x24, 0
+.L771:
+	add	w21, w21, 1
+	b	.L770
+.L776:
+	mov	w19, w0
+	b	.L773
 	.size	SamsungReadRetrial, .-SamsungReadRetrial
 	.align	2
 	.global	MicronReadRetrial
 	.type	MicronReadRetrial, %function
 MicronReadRetrial:
-	stp	x29, x30, [sp, -160]!
+	stp	x29, x30, [sp, -144]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	uxtb	w21, w0
+	stp	x19, x20, [sp, 16]
+	and	w20, w0, 255
 	adrp	x0, .LANCHOR2
-	stp	x27, x28, [sp,80]
-	mov	w28, w1
+	stp	x23, x24, [sp, 48]
+	str	w1, [x29, 140]
 	add	x1, x0, :lo12:.LANCHOR2
-	stp	x25, x26, [sp,64]
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	str	x0, [x29,152]
-	mov	x25, x2
-	ldrb	w19, [x1,1221]
-	mov	x22, x3
-	ldrb	w1, [x1,1220]
-	cbnz	w1, .L766
+	stp	x25, x26, [sp, 64]
+	mov	x24, x2
+	stp	x21, x22, [sp, 32]
+	mov	x25, x3
+	stp	x27, x28, [sp, 80]
+	str	x0, [x29, 128]
+	ldrb	w19, [x1, 1221]
+	ldrb	w1, [x1, 1220]
+	cbnz	w1, .L784
 	add	w19, w19, w19, lsl 1
-	ubfx	x19, x19, 2, 8
-	b	.L767
-.L766:
-	mov	w0, 3
-	sdiv	w19, w19, w0
-.L767:
-	adrp	x26, g_maxRetryCount
-	adrp	x27, .LC11
-	adrp	x20, .LANCHOR0
-	add	x0, x26, :lo12:g_maxRetryCount
-	mov	w24, 0
-	str	x0, [x29,144]
-	add	x27, x27, :lo12:.LC11
-	add	x20, x20, :lo12:.LANCHOR0
-	add	x20, x20, 24
-	add	x20, x20, w21, sxtw 4
-.L778:
-	mov	w0, w21
+	asr	w19, w19, 2
+.L785:
+	adrp	x21, .LANCHOR0
+	add	x21, x21, :lo12:.LANCHOR0
+	add	x21, x21, w20, sxtw 4
 	mov	w23, 0
-	mov	w26, -1
+	mov	w28, 137
+.L795:
+	mov	w0, w20
 	bl	NandcWaitFlashReady
-	ldrb	w4, [x20,8]
-	mov	w9, 239
-	ldr	x6, [x20]
-	mov	w10, 137
-	lsl	x8, x4, 8
-.L768:
-	ldr	x0, [x29,144]
-	ldrb	w0, [x0]
-	cmp	w23, w0
-	bcs	.L771
-	add	x2, x6, x8
-	mov	x0, 1000
-	str	x4, [x29,96]
-	str	x8, [x29,104]
-	str	w9, [x2,2056]
-	str	w10, [x2,2052]
-	str	x6, [x29,112]
-	str	x9, [x29,120]
-	str	x10, [x29,128]
-	str	x2, [x29,136]
-	bl	__const_udelay
-	ldr	x2, [x29,136]
-	add	w7, w23, 1
-	mov	w0, w21
-	mov	w1, w28
-	mov	x3, x22
-	str	x7, [x29,136]
-	str	w7, [x2,2048]
-	str	wzr, [x2,2048]
-	str	wzr, [x2,2048]
-	str	wzr, [x2,2048]
-	mov	x2, x25
-	bl	FlashReadRawPage
-	cmn	w0, #1
-	ldr	x7, [x29,136]
-	ldr	x10, [x29,128]
-	ldr	x9, [x29,120]
-	ldr	x6, [x29,112]
-	ldr	x8, [x29,104]
-	ldr	x4, [x29,96]
-	beq	.L769
-	cmn	w26, #1
-	csel	w26, w26, w0, ne
-	cmp	w0, w19
-	bcc	.L780
-	mov	x22, 0
-	mov	x25, x22
-.L769:
-	mov	w23, w7
-	b	.L768
-.L780:
-	mov	x22, 0
-	mov	w26, w0
-	mov	x25, x22
-.L771:
-	add	x1, x6, x4, lsl 8
+	ldrb	w4, [x21, 8]
+	adrp	x7, g_maxRetryCount
+	ldr	x8, [x21]
+	add	x7, x7, :lo12:g_maxRetryCount
+	mov	w22, 0
+	mov	w26, -1
+	add	x27, x8, x4, lsl 8
+.L786:
+	ldrb	w0, [x7]
+	cmp	w22, w0
+	bcc	.L790
+.L789:
+	add	x4, x8, x4, lsl 8
 	mov	w0, 239
-	str	x1, [x29,136]
-	str	w0, [x1,2056]
-	mov	w0, 137
-	str	w0, [x1,2052]
+	str	x4, [x29, 120]
+	str	w0, [x4, 2056]
 	mov	x0, 1000
+	str	w28, [x4, 2052]
 	bl	__const_udelay
-	ldr	x1, [x29,136]
+	ldr	x4, [x29, 120]
 	cmp	w26, w19
-	str	wzr, [x1,2048]
-	str	wzr, [x1,2048]
-	str	wzr, [x1,2048]
-	str	wzr, [x1,2048]
-	bcc	.L773
+	str	wzr, [x4, 2048]
+	str	wzr, [x4, 2048]
+	str	wzr, [x4, 2048]
+	str	wzr, [x4, 2048]
+	bcc	.L791
 	cmn	w26, #1
 	mov	w0, 256
 	csel	w26, w26, w0, eq
-.L773:
-	cmn	w26, #1
-	cset	w6, eq
-	cbnz	w6, .L782
+.L791:
 	cmp	w26, 256
-	cset	w1, eq
-	cbz	w1, .L774
-.L782:
-	mov	x0, x27
-	mov	w1, w23
-	mov	w2, w28
-	mov	w3, w23
+	ccmn	w26, #1, 4, ne
+	bne	.L792
+	ldr	w2, [x29, 140]
+	adrp	x0, .LC11
 	mov	w4, w26
-	str	x6, [x29,136]
+	mov	w3, w22
+	mov	w1, w22
+	add	x0, x0, :lo12:.LC11
 	bl	printk
-	cbnz	w24, .L776
-	ldr	x6, [x29,136]
-	cbz	w6, .L787
-	ldr	x0, [x29,152]
+	cbnz	w23, .L793
+	ldr	x0, [x29, 128]
 	add	x0, x0, :lo12:.LANCHOR2
-	ldrb	w0, [x0,1220]
-	cbz	w0, .L787
-	mov	w0, w21
+	ldrb	w0, [x0, 1220]
+	cbz	w0, .L783
+	cmn	w26, #1
+	bne	.L783
 	mov	w1, 3
-	mov	w24, 1
-	bl	micron_auto_read_calibration_config
-	b	.L778
-.L776:
-	mov	w0, w21
-	mov	w1, 0
+	mov	w0, w20
+	mov	w23, 1
 	bl	micron_auto_read_calibration_config
+	b	.L795
+.L784:
+	mov	w0, 3
+	sdiv	w19, w19, w0
+	b	.L785
+.L790:
+	mov	w0, 239
+	str	w0, [x27, 2056]
+	str	w28, [x27, 2052]
+	mov	x0, 1000
+	stp	x4, x7, [x29, 96]
+	str	x8, [x29, 112]
+	bl	__const_udelay
+	add	w9, w22, 1
+	str	w9, [x27, 2048]
+	str	wzr, [x27, 2048]
+	mov	x3, x25
+	ldr	w1, [x29, 140]
+	mov	x2, x24
+	str	wzr, [x27, 2048]
+	mov	w0, w20
+	str	wzr, [x27, 2048]
+	str	w9, [x29, 120]
+	bl	FlashReadRawPage
+	cmn	w0, #1
+	ldr	w9, [x29, 120]
+	ldp	x4, x7, [x29, 96]
+	ldr	x8, [x29, 112]
+	beq	.L787
 	cmn	w26, #1
-	mov	w0, 256
-	csel	w26, w26, w0, eq
-	b	.L787
-.L774:
-	cbz	w24, .L787
-	mov	w0, w21
-	mov	w26, 256
-	bl	micron_auto_read_calibration_config
+	csel	w26, w26, w0, ne
+	cmp	w0, w19
+	bcc	.L797
+	mov	x25, 0
+	mov	x24, 0
 .L787:
+	mov	w22, w9
+	b	.L786
+.L797:
+	mov	w26, w0
+	mov	x25, 0
+	mov	x24, 0
+	b	.L789
+.L793:
+	mov	w0, w20
+	mov	w1, 0
+	bl	micron_auto_read_calibration_config
+	cmn	w26, #1
+	mov	w0, 256
+	csel	w26, w26, w0, eq
+.L783:
 	mov	w0, w26
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 160
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 144
 	ret
+.L792:
+	cbz	w23, .L783
+	mov	w1, 0
+	mov	w0, w20
+	mov	w26, 256
+	bl	micron_auto_read_calibration_config
+	b	.L783
 	.size	MicronReadRetrial, .-MicronReadRetrial
 	.align	2
 	.global	HynixReadRetrial
@@ -5169,326 +5099,311 @@ MicronReadRetrial:
 HynixReadRetrial:
 	stp	x29, x30, [sp, -128]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	adrp	x21, .LANCHOR2
-	adrp	x22, .LANCHOR0
-	stp	x23, x24, [sp,48]
-	uxtb	x23, w0
+	stp	x27, x28, [sp, 80]
+	and	x28, x0, 255
 	add	x0, x21, :lo12:.LANCHOR2
+	stp	x25, x26, [sp, 64]
 	add	x0, x0, 1232
-	mov	x24, x23
-	stp	x27, x28, [sp,80]
-	stp	x25, x26, [sp,64]
-	stp	x19, x20, [sp,16]
-	mov	w28, w1
-	add	x1, x0, x23
-	ldrb	w26, [x0,2]
+	stp	x23, x24, [sp, 48]
+	stp	x19, x20, [sp, 16]
+	mov	w27, w1
+	adrp	x22, .LANCHOR0
+	add	x1, x0, x28
+	ldrb	w24, [x0, 2]
 	add	x0, x22, :lo12:.LANCHOR0
-	mov	x27, x2
-	mov	x25, x3
-	ldrb	w19, [x1,12]
-	ldr	x0, [x0,104]
-	ldrb	w0, [x0,19]
+	mov	x23, x28
+	mov	x25, x2
+	mov	x26, x3
+	ldrb	w19, [x1, 12]
+	ldr	x0, [x0, 104]
+	ldrb	w0, [x0, 19]
 	sub	w0, w0, #7
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 1
-	bhi	.L796
-	ldrb	w19, [x1,20]
-.L796:
-	mov	w0, w24
-	mov	w20, -1
+	bhi	.L809
+	ldrb	w19, [x1, 20]
+.L809:
+	mov	w0, w23
 	bl	NandcWaitFlashReady
 	add	x5, x21, :lo12:.LANCHOR2
 	mov	w4, 0
 	add	x6, x5, 1236
-.L797:
-	cmp	w4, w26
-	bcs	.L801
-	add	w19, w19, 1
-	ldrb	w1, [x5,1233]
-	mov	x2, x6
-	mov	w0, w24
-	uxtb	w19, w19
-	str	x4, [x29,104]
-	cmp	w19, w26
-	str	x5, [x29,112]
-	csel	w19, w19, wzr, cc
-	str	x6, [x29,120]
-	mov	w3, w19
-	bl	HynixSetRRPara
-	mov	w0, w24
-	mov	w1, w28
-	mov	x2, x27
-	mov	x3, x25
-	bl	FlashReadRawPage
-	cmn	w0, #1
-	ldr	x6, [x29,120]
-	ldr	x5, [x29,112]
-	ldr	x4, [x29,104]
-	beq	.L799
-	ldrb	w1, [x5,1221]
-	cmn	w20, #1
-	csel	w20, w20, w0, ne
-	add	w1, w1, w1, lsl 1
-	cmp	w0, w1, lsr 2
-	bcc	.L806
-	mov	x25, 0
-	mov	x27, x25
-.L799:
-	add	w4, w4, 1
-	b	.L797
-.L806:
-	mov	w20, w0
-.L801:
+	mov	w20, -1
+.L810:
+	cmp	w4, w24
+	bcc	.L815
+.L814:
 	add	x22, x22, :lo12:.LANCHOR0
-	ldr	x0, [x22,104]
-	ldrb	w0, [x0,19]
+	ldr	x0, [x22, 104]
+	ldrb	w0, [x0, 19]
 	sub	w0, w0, #7
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 1
 	add	x0, x21, :lo12:.LANCHOR2
-	add	x23, x0, x23
-	bhi	.L803
-	strb	w19, [x23,1252]
-	b	.L804
-.L803:
-	strb	w19, [x23,1244]
-.L804:
+	add	x0, x0, x28
+	bhi	.L816
+	strb	w19, [x0, 1252]
+.L817:
 	add	x21, x21, :lo12:.LANCHOR2
-	ldrb	w0, [x21,1221]
+	ldrb	w0, [x21, 1221]
 	add	w0, w0, w0, lsl 1
 	cmp	w20, w0, lsr 2
-	bcc	.L805
+	bcc	.L808
 	cmn	w20, #1
 	mov	w0, 256
 	csel	w20, w20, w0, eq
-.L805:
+.L808:
 	mov	w0, w20
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 128
 	ret
+.L815:
+	add	w19, w19, 1
+	ldrb	w1, [x5, 1233]
+	and	w19, w19, 255
+	mov	x2, x6
+	cmp	w24, w19
+	str	w4, [x29, 108]
+	csel	w19, w19, wzr, hi
+	stp	x6, x5, [x29, 112]
+	mov	w3, w19
+	mov	w0, w23
+	bl	HynixSetRRPara
+	mov	x3, x26
+	mov	x2, x25
+	mov	w1, w27
+	mov	w0, w23
+	bl	FlashReadRawPage
+	cmn	w0, #1
+	ldr	w4, [x29, 108]
+	ldp	x6, x5, [x29, 112]
+	beq	.L812
+	ldrb	w1, [x5, 1221]
+	cmn	w20, #1
+	csel	w20, w20, w0, ne
+	add	w1, w1, w1, lsl 1
+	cmp	w0, w1, lsr 2
+	bcc	.L819
+	mov	x26, 0
+	mov	x25, 0
+.L812:
+	add	w4, w4, 1
+	b	.L810
+.L819:
+	mov	w20, w0
+	b	.L814
+.L816:
+	strb	w19, [x0, 1244]
+	b	.L817
 	.size	HynixReadRetrial, .-HynixReadRetrial
 	.align	2
 	.type	samsung_read_retrial, %function
 samsung_read_retrial:
-	stp	x29, x30, [sp, -128]!
+	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	uxtb	w22, w0
-	adrp	x21, .LANCHOR3
-	mov	w0, w22
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x19, x20, [sp,16]
-	mov	w23, w1
+	stp	x23, x24, [sp, 48]
+	and	w23, w0, 255
+	stp	x21, x22, [sp, 32]
 	mov	x24, x2
-	stp	x27, x28, [sp,80]
-	mov	x26, x3
+	stp	x25, x26, [sp, 64]
+	mov	w0, w23
+	stp	x19, x20, [sp, 16]
+	mov	w26, w1
+	mov	x25, x3
+	stp	x27, x28, [sp, 80]
 	bl	NandcWaitFlashReady
+	adrp	x22, .LANCHOR2
+	sbfiz	x1, x23, 4, 32
 	adrp	x0, .LANCHOR0
-	sbfiz	x1, x22, 4, 32
 	add	x0, x0, :lo12:.LANCHOR0
-	adrp	x25, .LANCHOR2
-	add	x0, x0, 24
-	add	x2, x0, x1
-	ldr	x5, [x0,x1]
-	add	x0, x25, :lo12:.LANCHOR2
-	ldrb	w19, [x2,8]
-	ldrb	w0, [x0,2092]
-	cbnz	w0, .L813
-	lsl	x19, x19, 8
+	adrp	x21, .LANCHOR3
+	add	x3, x0, x1
+	ldr	x1, [x0, x1]
+	add	x0, x22, :lo12:.LANCHOR2
+	ldrb	w19, [x3, 8]
+	ldrb	w2, [x0, 2092]
+	cbnz	w2, .L827
+	add	x19, x1, x19, lsl 8
+	add	x21, x21, :lo12:.LANCHOR3
+	mov	x27, x0
 	mov	x4, 0
 	mov	w20, -1
-	add	x27, x5, x19
 	mov	w6, 239
-	mov	w7, 141
-	add	x21, x21, :lo12:.LANCHOR3
-.L817:
-	str	w6, [x27,2056]
+	mov	w5, 141
+.L831:
+	str	w6, [x19, 2056]
 	add	x0, x21, x4
-	str	w7, [x27,2052]
-	mov	w1, w23
-	mov	x2, x24
-	mov	x3, x26
-	ldrsb	w0, [x0,1]
+	str	w5, [x19, 2052]
 	add	w28, w4, 1
-	str	w0, [x27,2048]
-	mov	w0, w22
-	str	wzr, [x27,2048]
-	str	wzr, [x27,2048]
-	str	wzr, [x27,2048]
-	str	x5, [x29,96]
-	str	x6, [x29,104]
-	str	x7, [x29,112]
-	str	x4, [x29,120]
+	stp	w6, w5, [x29, 96]
+	mov	x3, x25
+	ldrsb	w0, [x0, 1]
+	mov	x2, x24
+	str	w0, [x19, 2048]
+	mov	w1, w26
+	str	wzr, [x19, 2048]
+	mov	w0, w23
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
+	str	x4, [x29, 104]
 	bl	FlashReadRawPage
 	cmn	w0, #1
-	ldr	x4, [x29,120]
-	ldr	x7, [x29,112]
-	ldr	x6, [x29,104]
-	ldr	x5, [x29,96]
-	beq	.L814
-	add	x1, x25, :lo12:.LANCHOR2
+	ldp	w6, w5, [x29, 96]
+	ldr	x4, [x29, 104]
+	beq	.L828
+	ldrb	w1, [x27, 1221]
 	cmn	w20, #1
 	csel	w20, w20, w0, ne
-	ldrb	w1, [x1,1221]
 	add	w1, w1, w1, lsl 1
 	cmp	w0, w1, lsr 2
-	bcc	.L826
-	mov	x26, 0
-	mov	x24, x26
-.L814:
+	bcc	.L839
+	mov	x25, 0
+	mov	x24, 0
+.L828:
 	add	x4, x4, 1
 	cmp	x4, 25
-	bne	.L817
+	bne	.L831
 	mov	w28, 26
-	b	.L816
-.L826:
-	mov	w20, w0
-.L816:
-	add	x3, x5, x19
+.L830:
 	mov	w0, 239
-	str	w0, [x3,2056]
+	str	w0, [x19, 2056]
 	mov	w0, 141
-	b	.L842
-.L813:
+.L855:
+	str	w0, [x19, 2052]
+	add	x22, x22, :lo12:.LANCHOR2
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
+	ldrb	w0, [x22, 1221]
+	add	w0, w0, w0, lsl 1
+	cmp	w20, w0, lsr 2
+	bcc	.L837
+	cmn	w20, #1
+	mov	w0, 256
+	csel	w20, w20, w0, eq
+.L837:
+	cmp	w20, 256
+	ccmn	w20, #1, 4, ne
+	bne	.L838
+	adrp	x0, .LC12
+	mov	w4, w20
+	mov	w3, w28
+	mov	w2, w26
+	mov	w1, w28
+	add	x0, x0, :lo12:.LC12
+	bl	printk
+.L838:
+	mov	w0, w23
+	bl	NandcWaitFlashReady
+	mov	w0, w20
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L839:
+	mov	w20, w0
+	b	.L830
+.L827:
 	add	x21, x21, :lo12:.LANCHOR3
-	lsl	x19, x19, 8
-	add	x21, x21, 32
+	add	x19, x1, x19, lsl 8
+	add	x21, x21, 36
+	mov	x27, x0
 	mov	w20, -1
 	mov	w28, 1
-	add	x27, x5, x19
-	mov	w4, 239
-	mov	w6, 137
-.L822:
-	str	w4, [x27,2056]
-	mov	w1, w23
-	str	w6, [x27,2052]
+	mov	w5, 239
+	mov	w4, 137
+.L836:
+	str	w5, [x19, 2056]
+	mov	x3, x25
+	str	w4, [x19, 2052]
 	mov	x2, x24
-	mov	x3, x26
-	str	x5, [x29,104]
-	ldrb	w0, [x21,4]
-	str	w0, [x27,2048]
-	str	x4, [x29,112]
-	ldrb	w0, [x21,5]
-	str	w0, [x27,2048]
-	str	x6, [x29,120]
-	ldrb	w0, [x21,6]
-	str	w0, [x27,2048]
-	ldrb	w0, [x21,7]
-	str	w0, [x27,2048]
-	mov	w0, w22
+	stp	w5, w4, [x29, 100]
+	mov	w1, w26
+	ldrb	w0, [x21]
+	str	w0, [x19, 2048]
+	ldrb	w0, [x21, 1]
+	str	w0, [x19, 2048]
+	ldrb	w0, [x21, 2]
+	str	w0, [x19, 2048]
+	ldrb	w0, [x21, 3]
+	str	w0, [x19, 2048]
+	mov	w0, w23
 	bl	FlashReadRawPage
 	cmn	w0, #1
-	ldr	x6, [x29,120]
-	ldr	x4, [x29,112]
-	ldr	x5, [x29,104]
-	beq	.L819
-	add	x1, x25, :lo12:.LANCHOR2
+	ldp	w5, w4, [x29, 100]
+	beq	.L833
+	ldrb	w1, [x27, 1221]
 	cmn	w20, #1
 	csel	w20, w20, w0, ne
-	ldrb	w1, [x1,1221]
 	add	w1, w1, w1, lsl 1
 	cmp	w0, w1, lsr 2
-	bcc	.L827
-	mov	x26, 0
-	mov	x24, x26
-.L819:
+	bcc	.L840
+	mov	x25, 0
+	mov	x24, 0
+.L833:
 	add	w28, w28, 1
 	add	x21, x21, 4
 	cmp	w28, 26
-	bne	.L822
-	b	.L821
-.L827:
-	mov	w20, w0
-.L821:
-	add	x3, x5, x19
+	bne	.L836
+.L835:
 	mov	w0, 239
-	str	w0, [x3,2056]
+	str	w0, [x19, 2056]
 	mov	w0, 137
-.L842:
-	str	w0, [x3,2052]
-	add	x25, x25, :lo12:.LANCHOR2
-	str	wzr, [x3,2048]
-	str	wzr, [x3,2048]
-	str	wzr, [x3,2048]
-	str	wzr, [x3,2048]
-	ldrb	w0, [x25,1221]
-	add	w0, w0, w0, lsl 1
-	cmp	w20, w0, lsr 2
-	bcc	.L823
-	cmn	w20, #1
-	mov	w0, 256
-	csel	w20, w20, w0, eq
-.L823:
-	cmn	w20, #1
-	beq	.L828
-	cmp	w20, 256
-	bne	.L824
-.L828:
-	adrp	x0, .LC12
-	mov	w1, w28
-	add	x0, x0, :lo12:.LC12
-	mov	w2, w23
-	mov	w3, w28
-	mov	w4, w20
-	bl	printk
-.L824:
-	mov	w0, w22
-	bl	NandcWaitFlashReady
-	mov	w0, w20
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
-	ret
+	b	.L855
+.L840:
+	mov	w20, w0
+	b	.L835
 	.size	samsung_read_retrial, .-samsung_read_retrial
 	.align	2
 	.global	FlashProgPage
 	.type	FlashProgPage, %function
 FlashProgPage:
 	stp	x29, x30, [sp, -64]!
-	mov	x4, x3
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	uxtb	w19, w0
-	adrp	x0, .LANCHOR1+481
-	stp	x21, x22, [sp,32]
+	stp	x19, x20, [sp, 16]
 	mov	w20, w1
+	stp	x21, x22, [sp, 32]
+	adrp	x1, .LANCHOR1+481
+	str	x23, [sp, 48]
 	mov	x22, x2
-	ldrb	w21, [x0,#:lo12:.LANCHOR1+481]
-	cbnz	w19, .L844
+	ldrb	w21, [x1, #:lo12:.LANCHOR1+481]
+	ands	w19, w0, 255
+	mov	x23, x3
+	bne	.L857
 	adrp	x0, .LANCHOR0
 	add	x0, x0, :lo12:.LANCHOR0
-	ldrb	w1, [x0,89]
-	ldr	w2, [x0,92]
+	ldrb	w1, [x0, 89]
+	ldr	w2, [x0, 92]
 	mul	w1, w1, w2
-	cmp	w20, w1
-	bcs	.L844
-	ldrb	w0, [x0,88]
-	cmp	w0, wzr
+	cmp	w1, w20
+	bls	.L857
+	ldrb	w0, [x0, 88]
+	cmp	w0, 0
 	mov	w0, 4
 	csel	w21, w21, w0, eq
-.L844:
+.L857:
 	mov	w0, w19
-	str	x4, [x29,56]
 	bl	NandcWaitFlashReady
 	mov	w0, w19
 	bl	NandcFlashCs
-	mov	w0, w19
 	mov	w1, w20
+	mov	w0, w19
 	bl	FlashProgFirstCmd
-	ldr	x4, [x29,56]
-	mov	w2, w21
+	mov	x4, x23
 	mov	x3, x22
-	mov	w0, w19
+	mov	w2, w21
 	mov	w1, 1
+	mov	w0, w19
 	bl	NandcXferData
 	mov	w1, w20
 	mov	w0, w19
@@ -5498,12 +5413,13 @@ FlashProgPage:
 	mov	w1, w20
 	mov	w0, w19
 	bl	FlashReadStatus
-	mov	w20, w0
+	mov	w2, w0
 	mov	w0, w19
 	bl	NandcFlashDeCs
-	and	w0, w20, 1
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
+	and	w0, w2, 1
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldr	x23, [sp, 48]
 	ldp	x29, x30, [sp], 64
 	ret
 	.size	FlashProgPage, .-FlashProgPage
@@ -5511,167 +5427,157 @@ FlashProgPage:
 	.global	FlashSavePhyInfo
 	.type	FlashSavePhyInfo, %function
 FlashSavePhyInfo:
-	stp	x29, x30, [sp, -80]!
+	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	adrp	x21, .LANCHOR0
-	adrp	x24, .LANCHOR2
-	stp	x19, x20, [sp,16]
-	add	x19, x24, :lo12:.LANCHOR2
-	add	x20, x21, :lo12:.LANCHOR0
-	stp	x25, x26, [sp,64]
-	ldr	x0, [x21,#:lo12:.LANCHOR0]
-	mov	w23, 0
-	str	x0, [x19,2200]
-	mov	w22, w23
-	ldrb	w0, [x19,2213]
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR0
+	add	x19, x19, :lo12:.LANCHOR0
+	adrp	x20, .LANCHOR2
+	add	x20, x20, :lo12:.LANCHOR2
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	mov	w23, 20036
+	ldr	x0, [x19, 64]
+	movk	w23, 0x4e41, lsl 16
+	str	x0, [x20, 2200]
+	mov	w22, 0
+	ldrb	w0, [x20, 2213]
+	mov	w21, 0
 	bl	FlashBchSel
-	ldr	x0, [x21,#:lo12:.LANCHOR0]
-	mov	w1, 0
+	ldr	x0, [x19, 64]
 	mov	w2, 2048
+	mov	w1, 0
 	bl	ftl_memset
-	ldr	x1, [x19,2200]
-	mov	w0, 20036
-	movk	w0, 0x4e41, lsl 16
+	ldr	x0, [x20, 2200]
 	mov	w2, 32
-	str	w0, [x1]
-	ldr	x0, [x19,2200]
-	ldrb	w1, [x20,3216]
+	str	w23, [x0]
+	ldr	x0, [x20, 2200]
+	ldrb	w1, [x19, 3216]
 	add	x0, x0, 16
-	strh	w1, [x0,-4]
-	ldrb	w1, [x20,89]
-	strh	w1, [x0,-2]
-	ldrb	w1, [x19,2104]
-	str	w1, [x0,1060]
+	strh	w1, [x0, -4]
+	ldrb	w1, [x19, 89]
+	strh	w1, [x0, -2]
+	ldrb	w1, [x20, 2104]
+	str	w1, [x0, 1060]
 	adrp	x1, IDByte
 	add	x1, x1, :lo12:IDByte
 	bl	ftl_memcpy
-	ldr	x0, [x19,2200]
-	add	x1, x20, 3220
+	ldr	x0, [x20, 2200]
 	mov	w2, 8
+	add	x1, x19, 3220
 	add	x0, x0, 80
 	bl	ftl_memcpy
-	ldr	x0, [x19,2200]
-	add	x1, x20, 3228
+	ldr	x0, [x20, 2200]
 	mov	w2, 32
+	add	x1, x19, 3228
 	add	x0, x0, 96
 	bl	ftl_memcpy
-	ldr	x0, [x19,2200]
+	ldr	x0, [x20, 2200]
 	adrp	x1, .LANCHOR1
 	add	x1, x1, :lo12:.LANCHOR1
 	mov	w2, 32
 	add	x1, x1, 472
 	add	x0, x0, 160
 	bl	ftl_memcpy
-	ldr	x0, [x19,2200]
-	add	x1, x20, 112
+	ldr	x0, [x20, 2200]
 	mov	w2, 32
+	add	x1, x19, 112
 	add	x0, x0, 192
 	bl	ftl_memcpy
-	ldr	x0, [x19,2200]
-	add	x1, x19, 1232
+	ldr	x0, [x20, 2200]
 	mov	w2, 852
+	add	x1, x20, 1232
 	add	x0, x0, 224
 	bl	ftl_memcpy
-	ldr	x20, [x19,2200]
+	ldr	x6, [x20, 2200]
 	mov	w1, 2036
-	add	x0, x20, 12
+	add	x0, x6, 12
 	bl	js_hash
-	str	w0, [x20,8]
+	str	w0, [x6, 8]
 	mov	w0, 1592
-	str	w0, [x20,4]
-	ldr	x0, [x19,2216]
-	str	x0, [x19,2200]
+	str	w0, [x6, 4]
+	ldr	x0, [x20, 2216]
+	str	x0, [x20, 2200]
 	mov	w0, 0
-	mov	x19, x21
 	bl	flash_enter_slc_mode
-.L852:
-	add	x21, x19, :lo12:.LANCHOR0
-	mov	w0, 0
+.L866:
+	ldr	w1, [x19, 92]
 	mov	w2, 0
-	ldr	w1, [x21,92]
-	mul	w1, w22, w1
+	mov	w0, 0
+	mul	w1, w21, w1
 	bl	FlashEraseBlock
-	add	x0, x24, :lo12:.LANCHOR2
-	ldrb	w20, [x0,1220]
-	cbz	w20, .L847
-	mov	w20, 0
-.L848:
-	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x2, [x19,#:lo12:.LANCHOR0]
+	ldrb	w0, [x20, 1220]
+	cbz	w0, .L861
+	mov	w24, 0
+.L862:
+	ldr	w1, [x19, 92]
 	mov	x3, 0
-	ldr	w1, [x0,92]
+	ldr	x2, [x19, 64]
 	mov	w0, 0
-	madd	w1, w22, w1, w20
-	add	w20, w20, 1
-	bl	FlashProgPage
-	cmp	w20, 10
-	bne	.L848
-	b	.L849
-.L847:
-	ldr	w1, [x21,92]
-	mov	x3, 0
-	ldr	x2, [x19,#:lo12:.LANCHOR0]
-	mov	w0, w20
-	mul	w1, w22, w1
+	madd	w1, w21, w1, w24
+	add	w24, w24, 1
 	bl	FlashProgPage
-	ldr	w1, [x21,92]
-	mov	w0, w20
-	ldr	x2, [x19,#:lo12:.LANCHOR0]
+	cmp	w24, 10
+	bne	.L862
+.L863:
+	ldr	w1, [x19, 92]
 	mov	x3, 0
-	mul	w1, w22, w1
-	add	w1, w1, 1
-	bl	FlashProgPage
-.L849:
-	add	x21, x19, :lo12:.LANCHOR0
-	add	x20, x24, :lo12:.LANCHOR2
+	ldr	x2, [x20, 2216]
 	mov	w0, 0
-	mov	x3, 0
-	add	w26, w22, 1
-	ldr	w1, [x21,92]
-	ldr	x2, [x20,2216]
-	mul	w1, w22, w1
+	mul	w1, w21, w1
 	bl	FlashReadRawPage
 	cmn	w0, #1
-	beq	.L850
-	ldr	x25, [x20,2200]
-	mov	w0, 20036
-	movk	w0, 0x4e41, lsl 16
-	ldr	w1, [x25]
-	cmp	w1, w0
-	bne	.L850
+	add	w7, w21, 1
+	beq	.L864
+	ldr	x6, [x20, 2200]
+	ldr	w0, [x6]
+	cmp	w0, w23
+	bne	.L864
 	mov	w1, 2036
-	add	x0, x25, 12
+	add	x0, x6, 12
 	bl	js_hash
-	ldr	w1, [x25,8]
+	ldr	w1, [x6, 8]
 	cmp	w1, w0
-	bne	.L850
-	ldr	w0, [x21,92]
-	cmp	w23, 1
-	str	w26, [x21,8]
-	mul	w22, w22, w0
-	str	w22, [x20,2208]
-	beq	.L853
-	mov	w23, 1
-.L850:
-	cmp	w26, 4
-	mov	w22, w26
-	bne	.L852
-	b	.L851
-.L853:
-	mov	w23, 2
-.L851:
+	bne	.L864
+	ldr	w0, [x19, 92]
+	cmp	w22, 1
+	str	w7, [x19, 72]
+	mul	w21, w0, w21
+	str	w21, [x20, 2208]
+	beq	.L867
+	mov	w22, 1
+.L864:
+	mov	w21, w7
+	cmp	w7, 4
+	bne	.L866
+.L865:
 	mov	w0, 0
 	bl	flash_exit_slc_mode
-	cmp	w23, wzr
+	cmp	w22, 0
 	csetm	w0, eq
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 80
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 64
 	ret
+.L861:
+	ldr	w1, [x19, 92]
+	mov	x3, 0
+	ldr	x2, [x19, 64]
+	mov	w0, 0
+	mul	w1, w21, w1
+	bl	FlashProgPage
+	ldr	w1, [x19, 92]
+	mov	x3, 0
+	ldr	x2, [x19, 64]
+	mov	w0, 0
+	mul	w1, w21, w1
+	add	w1, w1, 1
+	bl	FlashProgPage
+	b	.L863
+.L867:
+	mov	w22, 2
+	b	.L865
 	.size	FlashSavePhyInfo, .-FlashSavePhyInfo
 	.align	2
 	.global	FlashReadIdbDataRaw
@@ -5679,109 +5585,109 @@ FlashSavePhyInfo:
 FlashReadIdbDataRaw:
 	stp	x29, x30, [sp, -128]!
 	add	x29, sp, 0
-	stp	x25, x26, [sp,64]
+	stp	x25, x26, [sp, 64]
 	mov	x25, x0
 	mov	w0, 60
-	strb	w0, [x29,120]
+	stp	x21, x22, [sp, 32]
+	strb	w0, [x29, 120]
 	mov	w0, 40
-	strb	w0, [x29,121]
+	strb	w0, [x29, 121]
 	mov	w0, 24
-	stp	x21, x22, [sp,32]
-	strb	w0, [x29,122]
-	adrp	x21, .LANCHOR2
+	strb	w0, [x29, 122]
 	mov	w0, 16
-	strb	w0, [x29,123]
+	adrp	x21, .LANCHOR2
+	strb	w0, [x29, 123]
 	add	x0, x21, :lo12:.LANCHOR2
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	stp	x27, x28, [sp,80]
-	ldrb	w28, [x0,1221]
-	ldr	w0, [x0,2100]
-	cbz	w0, .L860
+	stp	x19, x20, [sp, 16]
+	stp	x23, x24, [sp, 48]
+	stp	x27, x28, [sp, 80]
+	ldrb	w26, [x0, 1221]
+	ldr	w0, [x0, 2100]
+	cbz	w0, .L875
 	mov	w0, 0
 	bl	flash_enter_slc_mode
-.L860:
-	adrp	x26, .LANCHOR0
-	adrp	x24, .LC13
-	mov	x0, x25
-	mov	w1, 0
-	mov	w2, 2048
-	mov	w23, -1
+.L875:
+	adrp	x22, .LANCHOR0
+	add	x22, x22, :lo12:.LANCHOR0
+	mov	w28, 35899
+	add	x27, x29, 120
+	mov	x19, x22
+	mov	w24, -1
 	mov	w20, 2
-	mov	x27, x26
-	add	x24, x24, :lo12:.LC13
+	movk	w28, 0xfcdc, lsl 16
+	mov	w2, 2048
+	mov	w1, 0
+	mov	x0, x25
 	bl	ftl_memset
-.L861:
-	add	x0, x26, :lo12:.LANCHOR0
-	ldrb	w0, [x0,89]
+.L876:
+	ldrb	w0, [x22, 89]
 	cmp	w20, w0
-	bcs	.L865
-	mov	x22, 0
-.L863:
-	add	x0, x29, 120
-	add	x19, x27, :lo12:.LANCHOR0
-	ldrb	w4, [x22,x0]
-	str	x4, [x29,104]
-	mov	w0, w4
-	bl	FlashBchSel
-	ldr	w1, [x19,92]
+	bcc	.L881
+.L880:
+	add	x21, x21, :lo12:.LANCHOR2
+	mov	w0, w26
+	bl	FlashBchSel
+	ldr	w0, [x21, 2100]
+	cbz	w0, .L874
 	mov	w0, 0
-	ldr	x2, [x27,#:lo12:.LANCHOR0]
+	bl	flash_exit_slc_mode
+.L874:
+	mov	w0, w24
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 128
+	ret
+.L881:
+	mov	x23, 0
+.L878:
+	ldrb	w4, [x23, x27]
+	str	w4, [x29, 108]
+	mov	w0, w4
+	bl	FlashBchSel
+	ldr	w1, [x19, 92]
 	mov	x3, 0
+	ldr	x2, [x19, 64]
+	mov	w0, 0
 	mul	w1, w20, w1
 	bl	FlashReadRawPage
 	cmn	w0, #1
-	ldr	x4, [x29,104]
-	bne	.L862
-	add	x22, x22, 1
-	cmp	x22, 4
-	bne	.L863
-	b	.L864
-.L862:
-	ldr	x0, [x19]
-	ldr	w1, [x0]
-	mov	w0, 35899
-	movk	w0, 0xfcdc, lsl 16
-	cmp	w1, w0
-	bne	.L864
+	ldr	w4, [x29, 108]
+	bne	.L877
+	add	x23, x23, 1
+	cmp	x23, 4
+	bne	.L878
+.L879:
+	add	w20, w20, 1
+	b	.L876
+.L884:
+	mov	w24, 0
+	b	.L880
+.L877:
+	ldr	x0, [x19, 64]
+	ldr	w0, [x0]
+	cmp	w0, w28
+	bne	.L879
 	mov	w1, w4
-	mov	x0, x24
+	adrp	x0, .LC13
+	add	x0, x0, :lo12:.LC13
 	bl	printk
-	ldr	x1, [x19]
-	mov	x0, x25
+	ldr	x1, [x19, 64]
 	mov	w2, 2048
+	mov	x0, x25
 	bl	ftl_memcpy
-	ldr	x0, [x19]
-	ldr	w0, [x0,512]
-	strb	w0, [x19,89]
-	ldr	w0, [x19,8]
-	cmp	w0, w20
-	bls	.L868
-	mov	w23, 0
-	str	w20, [x19,8]
+	ldr	x0, [x19, 64]
+	ldr	w0, [x0, 512]
+	strb	w0, [x19, 89]
+	ldr	w0, [x19, 72]
+	cmp	w20, w0
+	bcs	.L884
+	mov	w24, 0
+	str	w20, [x19, 72]
 	bl	FlashSavePhyInfo
-.L864:
-	add	w20, w20, 1
-	b	.L861
-.L868:
-	mov	w23, 0
-.L865:
-	mov	w0, w28
-	add	x21, x21, :lo12:.LANCHOR2
-	bl	FlashBchSel
-	ldr	w0, [x21,2100]
-	cbz	w0, .L872
-	mov	w0, 0
-	bl	flash_exit_slc_mode
-.L872:
-	mov	w0, w23
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
-	ret
+	b	.L879
 	.size	FlashReadIdbDataRaw, .-FlashReadIdbDataRaw
 	.align	2
 	.global	FlashInit
@@ -5789,691 +5695,680 @@ FlashReadIdbDataRaw:
 FlashInit:
 	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR0
-	mov	x23, x0
-	mov	w0, 32768
+	stp	x23, x24, [sp, 48]
+	add	x23, x20, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
 	adrp	x19, .LANCHOR2
-	stp	x21, x22, [sp,32]
-	stp	x27, x28, [sp,80]
-	stp	x25, x26, [sp,64]
-	bl	ftl_malloc
 	add	x21, x19, :lo12:.LANCHOR2
-	str	x0, [x20,#:lo12:.LANCHOR0]
+	mov	x22, x0
+	stp	x25, x26, [sp, 64]
 	mov	w0, 32768
-	add	x22, x20, :lo12:.LANCHOR0
-	adrp	x24, .LC14
-	bl	ftl_malloc
-	str	x0, [x21,2216]
+	stp	x27, x28, [sp, 80]
+	bl	ftl_dma32_malloc
+	str	x0, [x23, 64]
+	mov	w0, 32768
+	bl	ftl_dma32_malloc
+	str	x0, [x21, 2216]
 	mov	w0, 4096
-	add	x22, x22, 24
-	mov	w27, 1
-	mov	w28, 4
-	bl	ftl_malloc
-	str	x0, [x21,2224]
+	bl	ftl_dma32_malloc
+	str	x0, [x21, 2224]
 	mov	w0, 32768
-	bl	ftl_malloc
-	str	x0, [x21,2232]
+	bl	ftl_dma32_malloc
+	str	x0, [x21, 2232]
 	mov	w0, 4096
-	bl	ftl_malloc
-	str	x0, [x21,2240]
+	bl	ftl_dma32_malloc
+	str	x0, [x21, 2240]
+	mov	w0, 50
+	strb	w0, [x21, 2212]
+	adrp	x25, .LC14
+	strb	w0, [x23, 89]
 	mov	w0, 128
-	str	w0, [x22,68]
+	str	w0, [x23, 92]
 	mov	w0, 60
-	mov	w1, 50
-	strb	w0, [x21,2213]
-	mov	x0, x23
-	strb	w1, [x22,65]
-	mov	w23, 0
-	strb	w1, [x21,2212]
-	str	wzr, [x22,-16]
-	strb	wzr, [x21,2104]
-	str	wzr, [x21,2184]
-	strb	wzr, [x22,64]
-	strb	wzr, [x21,2248]
+	strb	wzr, [x21, 2104]
+	add	x25, x25, :lo12:.LC14
+	strb	w0, [x21, 2213]
+	mov	x0, x22
+	strb	wzr, [x21, 2248]
+	adrp	x22, IDByte
+	str	wzr, [x21, 2184]
+	add	x21, x22, :lo12:IDByte
+	mov	w24, 0
+	mov	w28, 239
+	strb	wzr, [x23, 88]
+	str	wzr, [x23, 72]
 	bl	NandcInit
-	adrp	x21, IDByte
-	add	x0, x24, :lo12:.LC14
-	add	x26, x21, :lo12:IDByte
-	str	x0, [x29,104]
-.L884:
-	ldrb	w2, [x22,8]
-	uxtb	w25, w23
-	mov	w0, w25
-	str	x2, [x29,96]
-	ldr	x24, [x22]
+.L899:
+	ldrb	w2, [x23, 8]
+	and	w26, w24, 255
+	str	w2, [x29, 108]
+	mov	w0, w26
+	ldr	x27, [x23]
 	bl	FlashReset
-	mov	w0, w25
+	mov	w0, w26
 	bl	NandcFlashCs
-	ldr	x2, [x29,96]
+	ldr	w2, [x29, 108]
 	mov	w0, 144
 	ubfiz	x2, x2, 8, 8
-	add	x24, x24, x2
-	str	w0, [x24,2056]
+	add	x27, x27, x2
+	str	w0, [x27, 2056]
 	mov	x0, 1000
-	str	wzr, [x24,2052]
+	str	wzr, [x27, 2052]
 	bl	__const_udelay
-	ldr	w0, [x24,2048]
-	uxtb	w0, w0
-	strb	w0, [x26]
+	ldr	w0, [x27, 2048]
+	and	w0, w0, 255
+	strb	w0, [x21]
 	cmp	w0, 44
-	ldr	w2, [x24,2048]
-	strb	w2, [x26,1]
-	ldr	w2, [x24,2048]
-	strb	w2, [x26,2]
-	ldr	w2, [x24,2048]
-	strb	w2, [x26,3]
-	ldr	w2, [x24,2048]
-	strb	w2, [x26,4]
-	ldr	w2, [x24,2048]
-	strb	w2, [x26,5]
-	bne	.L879
-	mov	w0, 239
-	str	w0, [x24,2056]
-	str	w27, [x24,2052]
+	ldr	w2, [x27, 2048]
+	strb	w2, [x21, 1]
+	ldr	w2, [x27, 2048]
+	strb	w2, [x21, 2]
+	ldr	w2, [x27, 2048]
+	strb	w2, [x21, 3]
+	ldr	w2, [x27, 2048]
+	strb	w2, [x21, 4]
+	ldr	w2, [x27, 2048]
+	strb	w2, [x21, 5]
+	bne	.L894
+	str	w28, [x27, 2056]
+	mov	w0, 1
+	str	w0, [x27, 2052]
 	mov	x0, 1000
 	bl	__const_udelay
-	str	w28, [x24,2048]
-	str	wzr, [x24,2048]
-	str	wzr, [x24,2048]
-	str	wzr, [x24,2048]
-.L879:
-	mov	w0, w25
+	mov	w0, 4
+	str	w0, [x27, 2048]
+	str	wzr, [x27, 2048]
+	str	wzr, [x27, 2048]
+	str	wzr, [x27, 2048]
+.L894:
+	mov	w0, w26
 	bl	NandcFlashDeCs
-	ldrb	w2, [x26]
+	ldrb	w2, [x21]
 	sub	w0, w2, #1
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 253
-	bhi	.L880
-	ldr	x0, [x29,104]
-	add	w1, w23, 1
-	ldrb	w3, [x26,1]
-	ldrb	w4, [x26,2]
-	ldrb	w5, [x26,3]
-	ldrb	w6, [x26,4]
-	ldrb	w7, [x26,5]
+	bhi	.L895
+	ldrb	w7, [x21, 5]
+	add	w1, w24, 1
+	ldrb	w6, [x21, 4]
+	mov	x0, x25
+	ldrb	w5, [x21, 3]
+	ldrb	w4, [x21, 2]
+	ldrb	w3, [x21, 1]
 	bl	printk
-.L880:
-	cbnz	w23, .L881
-	ldrb	w0, [x21,#:lo12:IDByte]
-	add	x1, x21, :lo12:IDByte
+.L895:
+	cbnz	w24, .L896
+	ldrb	w0, [x22, #:lo12:IDByte]
+	add	x1, x22, :lo12:IDByte
 	sub	w0, w0, #1
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 253
-	bhi	.L936
-	ldrb	w0, [x1,1]
+	bhi	.L947
+	ldrb	w0, [x1, 1]
 	cmp	w0, 255
-	beq	.L936
+	beq	.L947
 	bl	FlashCs123Init
-.L881:
-	ldrb	w0, [x26]
+.L896:
+	ldrb	w0, [x21]
 	cmp	w0, 181
-	bne	.L883
+	bne	.L898
 	mov	w0, 44
-	strb	w0, [x26]
-.L883:
-	add	w23, w23, 1
-	add	x22, x22, 16
-	cmp	w23, 4
-	add	x26, x26, 8
-	bne	.L884
-	ldrb	w0, [x21,#:lo12:IDByte]
+	strb	w0, [x21]
+.L898:
+	add	w24, w24, 1
+	add	x23, x23, 16
+	add	x21, x21, 8
+	cmp	w24, 4
+	bne	.L899
+	ldrb	w0, [x22, #:lo12:IDByte]
 	cmp	w0, 173
-	beq	.L885
+	beq	.L900
 	add	x0, x19, :lo12:.LANCHOR2
-	ldr	w0, [x0,2108]
+	ldr	w0, [x0, 2108]
 	bl	NandcSetDdrMode
-.L885:
-	add	x22, x19, :lo12:.LANCHOR2
-	mov	w1, 0
+.L900:
+	add	x21, x19, :lo12:.LANCHOR2
 	mov	w2, 852
-	add	x0, x22, 1232
+	mov	w1, 0
+	add	x0, x21, 1232
 	bl	ftl_memset
 	add	x2, x20, :lo12:.LANCHOR0
-	adrp	x1, .LANCHOR1
-	add	x0, x1, :lo12:.LANCHOR1
-	ldr	w4, [x22,2116]
-	add	x0, x0, 472
-	strb	wzr, [x2,96]
-	str	x0, [x2,104]
+	adrp	x0, .LANCHOR1
+	add	x1, x0, :lo12:.LANCHOR1
+	ldr	w4, [x21, 2116]
+	add	x1, x1, 472
+	strb	wzr, [x2, 96]
+	str	x1, [x2, 104]
 	mov	w2, 12336
 	movk	w2, 0x5638, lsl 16
 	cmp	w4, w2
-	bne	.L886
-	ldrb	w0, [x0,19]
-	cmp	w0, 50
-	beq	.L886
-	mov	w0, 1
-	str	w0, [x22,2100]
-.L886:
-	add	x3, x21, :lo12:IDByte
-	ldrb	w0, [x3,1]
-	cmp	w0, 218
-	cset	w6, eq
-	cmp	w0, 241
-	cset	w5, eq
-	cmp	w0, 161
-	cset	w2, eq
-	orr	w2, w5, w2
-	orr	w2, w6, w2
-	cbnz	w2, .L887
-	and	w2, w0, -3
-	cmp	w2, 209
-	beq	.L887
-	cmp	w0, 220
-	bne	.L888
-	ldrb	w2, [x3,3]
-	cmp	w2, 149
-	bne	.L888
-.L887:
-	add	x2, x20, :lo12:.LANCHOR0
+	bne	.L901
+	ldrb	w1, [x1, 19]
+	cmp	w1, 50
+	beq	.L901
+	mov	w1, 1
+	str	w1, [x21, 2100]
+.L901:
+	add	x1, x22, :lo12:IDByte
+	ldrb	w2, [x1, 1]
+	add	w1, w2, 95
+	and	w3, w1, 255
+	mov	x1, 1
+	cmp	w3, 57
+	bhi	.L902
+	movk	x1, 0x205, lsl 48
+	lsr	x1, x1, x3
+	mvn	x1, x1
+.L902:
+	and	w1, w1, 1
+	cmp	w2, 241
+	eor	w1, w1, 1
+	cset	w3, eq
+	orr	w1, w3, w1
+	cbnz	w1, .L903
+	cmp	w2, 220
+	bne	.L904
+	add	x1, x22, :lo12:IDByte
+	ldrb	w1, [x1, 3]
+	cmp	w1, 149
+	bne	.L904
+.L903:
+	add	x1, x20, :lo12:.LANCHOR0
 	add	x3, x19, :lo12:.LANCHOR2
-	mov	w7, 16
+	mov	w6, 16
 	mov	w5, 1
-	add	x8, x21, :lo12:IDByte
-	strb	w7, [x2,89]
-	strb	w5, [x2,88]
-	add	x2, x1, :lo12:.LANCHOR1
-	strb	w7, [x3,2213]
-	ldrb	w7, [x21,#:lo12:IDByte]
-	strb	w7, [x2,3417]
-	strb	w0, [x2,3418]
-	cmp	w7, 152
-	bne	.L890
-	ldrsb	w2, [x8,4]
-	tbnz	w2, #31, .L891
-	mov	w2, 24
-	strb	w2, [x3,2213]
-.L890:
+	add	x7, x22, :lo12:IDByte
+	strb	w6, [x1, 89]
+	strb	w5, [x1, 88]
+	add	x1, x0, :lo12:.LANCHOR1
+	strb	w6, [x3, 2213]
+	ldrb	w6, [x22, #:lo12:IDByte]
+	strb	w6, [x1, 3417]
+	strb	w2, [x1, 3418]
+	cmp	w6, 152
+	bne	.L906
+	ldrsb	w1, [x7, 4]
+	tbnz	w1, #31, .L907
+	mov	w1, 24
+	strb	w1, [x3, 2213]
+.L906:
 	cmp	w4, 2049
-	beq	.L939
-	mov	w2, 12336
-	movk	w2, 0x5638, lsl 16
-	cmp	w4, w2
-	bne	.L893
-.L939:
-	add	x2, x19, :lo12:.LANCHOR2
+	mov	w1, 12336
+	movk	w1, 0x5638, lsl 16
+	ccmp	w4, w1, 4, ne
+	bne	.L909
+	add	x1, x19, :lo12:.LANCHOR2
 	mov	w3, 16
-	strb	w3, [x2,2213]
-.L893:
-	cbz	w6, .L895
-	add	x0, x1, :lo12:.LANCHOR1
+	strb	w3, [x1, 2213]
+.L909:
+	cmp	w2, 218
+	bne	.L910
+	add	x1, x0, :lo12:.LANCHOR1
 	mov	w2, 2048
-	strh	w2, [x0,3430]
+	strh	w2, [x1, 3430]
 	mov	w2, -38
-	b	.L984
-.L895:
-	cmp	w0, 220
-	bne	.L897
-	add	x0, x1, :lo12:.LANCHOR1
-	mov	w2, 4096
-	strh	w2, [x0,3430]
-	mov	w2, -36
-.L984:
-	strb	w2, [x0,3418]
-	b	.L896
-.L897:
-	cmp	w0, 211
-	bne	.L896
-	add	x0, x1, :lo12:.LANCHOR1
-	mov	w2, 4096
-	strh	w2, [x0,3430]
-	mov	w2, 2
-	strb	w2, [x0,3429]
-.L896:
-	add	x22, x1, :lo12:.LANCHOR1
+.L993:
+	strb	w2, [x1, 3418]
+.L911:
+	add	x21, x0, :lo12:.LANCHOR1
 	add	x0, x20, :lo12:.LANCHOR0
-	add	x1, x22, 3288
 	mov	w2, 32
+	add	x1, x21, 3288
 	add	x0, x0, 112
 	bl	ftl_memcpy
-	add	x0, x22, 472
-	add	x1, x22, 3416
 	mov	w2, 32
+	add	x1, x21, 3416
+	add	x0, x21, 472
 	bl	ftl_memcpy
-.L888:
-	add	x22, x20, :lo12:.LANCHOR0
-	ldrb	w0, [x22,88]
-	cbnz	w0, .L898
+.L904:
+	add	x21, x20, :lo12:.LANCHOR0
+	ldrb	w0, [x21, 88]
+	cbnz	w0, .L914
 	bl	FlashLoadPhyInfoInRam
-	cbnz	w0, .L900
-	ldr	x0, [x22,104]
-	add	x22, x19, :lo12:.LANCHOR2
-	ldrb	w1, [x0,17]
+	cbnz	w0, .L916
+	ldr	x0, [x21, 104]
+	add	x21, x19, :lo12:.LANCHOR2
+	ldrb	w1, [x0, 17]
 	and	w0, w1, 7
-	strb	w0, [x22,2093]
-	tbnz	x1, 0, .L900
+	strb	w0, [x21, 2093]
+	tbnz	x1, 0, .L916
 	mov	w1, 1
-	strb	w1, [x22,2104]
+	strb	w1, [x21, 2104]
 	bl	FlashSetInterfaceMode
-	ldrb	w0, [x22,2093]
+	ldrb	w0, [x21, 2093]
 	bl	NandcSetMode
-.L900:
+.L916:
 	add	x0, x20, :lo12:.LANCHOR0
-	add	x22, x19, :lo12:.LANCHOR2
-	ldr	x0, [x0,104]
-	ldrb	w0, [x0,26]
-	strb	w0, [x22,1220]
+	add	x21, x19, :lo12:.LANCHOR2
+	ldr	x0, [x0, 104]
+	ldrb	w0, [x0, 26]
+	strb	w0, [x21, 1220]
 	bl	FlashLoadPhyInfo
-	cbz	w0, .L898
-	ldr	w0, [x22,2108]
-	cbz	w0, .L903
+	cbz	w0, .L914
+	ldr	w0, [x21, 2108]
+	cbz	w0, .L919
 	mov	w0, 1
 	bl	FlashSetInterfaceMode
 	mov	w0, 1
-	b	.L980
-.L903:
-	ldrb	w0, [x22,2093]
-	bl	FlashSetInterfaceMode
-	ldrb	w0, [x22,2093]
-.L980:
+.L988:
 	bl	NandcSetMode
 	bl	FlashLoadPhyInfo
-	cbz	w0, .L898
+	cbz	w0, .L914
+	add	x21, x20, :lo12:.LANCHOR0
 	mov	w0, 1
-	add	x22, x20, :lo12:.LANCHOR0
 	bl	FlashSetInterfaceMode
 	mov	w0, 1
 	bl	NandcSetMode
-	ldr	x1, [x22,104]
+	ldr	x0, [x21, 104]
+	ldrh	w1, [x0, 14]
 	adrp	x0, .LC15
 	add	x0, x0, :lo12:.LC15
-	ldrh	w1, [x1,14]
 	bl	printk
 	bl	FlashLoadPhyInfoInRam
 	cmn	w0, #1
-	beq	.L954
+	beq	.L893
 	bl	FlashDieInfoInit
-	ldr	x0, [x22,104]
-	ldrb	w0, [x0,19]
+	ldr	x0, [x21, 104]
+	ldrb	w0, [x0, 19]
 	bl	FlashGetReadRetryDefault
-	ldr	x0, [x22,104]
-	ldrh	w1, [x22,3452]
-	ldrb	w2, [x0,9]
+	ldr	x0, [x21, 104]
+	ldrh	w1, [x21, 3452]
 	add	w1, w1, 4095
+	ldrb	w2, [x0, 9]
 	cmp	w2, w1, lsr 12
-	blt	.L905
-	ldrh	w1, [x0,14]
+	blt	.L921
+	ldrh	w1, [x0, 14]
 	add	w1, w1, 255
 	cmp	w2, w1, lsr 8
-	bge	.L906
-.L905:
-	ldrh	w1, [x0,14]
+	bge	.L922
+.L921:
+	ldrh	w1, [x0, 14]
 	and	w1, w1, -256
-	strh	w1, [x0,14]
-.L906:
-	add	x22, x19, :lo12:.LANCHOR2
-	ldrb	w0, [x22,2093]
+	strh	w1, [x0, 14]
+.L922:
+	add	x21, x19, :lo12:.LANCHOR2
+	ldrb	w0, [x21, 2093]
 	tst	w0, 6
-	beq	.L907
+	beq	.L923
 	bl	FlashSavePhyInfo
 	mov	w0, 0
 	bl	flash_enter_slc_mode
-	ldr	w1, [x22,2208]
+	ldr	w1, [x21, 2208]
 	mov	w0, 0
 	bl	FlashDdrParaScan
 	mov	w0, 0
 	bl	flash_exit_slc_mode
-.L907:
+.L923:
 	bl	FlashSavePhyInfo
-.L898:
+.L914:
 	add	x23, x20, :lo12:.LANCHOR0
-	add	x22, x19, :lo12:.LANCHOR2
-	ldr	x2, [x23,104]
-	str	xzr, [x22,2192]
-	ldrb	w0, [x2,26]
-	strb	w0, [x22,1220]
-	ldrh	w0, [x2,16]
-	ldrh	w3, [x2,10]
+	add	x21, x19, :lo12:.LANCHOR2
+	ldr	x2, [x23, 104]
+	str	xzr, [x21, 2192]
+	ldrb	w0, [x2, 26]
+	strb	w0, [x21, 1220]
+	ldrh	w0, [x2, 16]
 	ubfx	x1, x0, 7, 1
-	strb	w1, [x23,96]
+	strb	w1, [x23, 96]
 	ubfx	x1, x0, 3, 1
-	strb	w1, [x22,2249]
+	strb	w1, [x21, 2249]
 	ubfx	x1, x0, 4, 1
-	strb	w1, [x22,2094]
-	ldrb	w1, [x2,12]
 	ubfx	x0, x0, 8, 3
-	strb	w0, [x22,2093]
-	ldrb	w0, [x2,18]
-	sdiv	w1, w3, w1
+	strb	w1, [x21, 2094]
+	strb	w0, [x21, 2093]
+	ldrh	w1, [x2, 10]
+	ldrb	w0, [x2, 12]
+	sdiv	w1, w1, w0
+	ldrb	w0, [x2, 18]
 	bl	BuildFlashLsbPageTable
 	bl	FlashDieInfoInit
-	ldr	x0, [x23,104]
-	ldrh	w1, [x0,16]
-	tbz	x1, 6, .L909
+	ldr	x0, [x23, 104]
+	ldrh	w1, [x0, 16]
+	tbz	x1, 6, .L925
 	adrp	x1, g_retryMode
-	ldrb	w0, [x0,19]
-	ldrb	w2, [x22,1233]
-	ldrb	w3, [x22,1234]
-	strb	w0, [x1,#:lo12:g_retryMode]
-	adrp	x1, g_maxRegNum
-	strb	w2, [x1,#:lo12:g_maxRegNum]
-	adrp	x2, g_maxRetryCount
-	strb	w3, [x2,#:lo12:g_maxRetryCount]
+	ldrb	w0, [x0, 19]
+	adrp	x2, g_maxRegNum
+	ldrb	w3, [x21, 1234]
+	strb	w0, [x1, #:lo12:g_retryMode]
+	mov	x4, x2
+	ldrb	w1, [x21, 1233]
+	strb	w1, [x2, #:lo12:g_maxRegNum]
+	adrp	x1, g_maxRetryCount
+	strb	w3, [x1, #:lo12:g_maxRetryCount]
 	sub	w3, w0, #1
-	uxtb	w3, w3
+	and	w3, w3, 255
 	cmp	w3, 7
-	mov	x3, x2
-	bhi	.L910
+	bhi	.L926
 	adrp	x1, HynixReadRetrial
-	cmp	w0, 8
 	add	x1, x1, :lo12:HynixReadRetrial
-	str	x1, [x22,2192]
+	str	x1, [x21, 2192]
 	sub	w1, w0, #5
-	cset	w2, eq
-	uxtb	w1, w1
+	and	w1, w1, 255
 	cmp	w1, 1
-	bls	.L940
-	cbz	w2, .L911
-.L940:
+	ccmp	w0, 8, 4, hi
+	bne	.L927
+	mov	w1, 1
+	str	w1, [x21, 2176]
+.L927:
 	add	x1, x19, :lo12:.LANCHOR2
-	mov	w3, 1
-	str	w3, [x1,2176]
-.L911:
 	cmp	w0, 7
-	add	x1, x19, :lo12:.LANCHOR2
-	beq	.L938
-	cbnz	w2, .L938
-	add	x1, x1, 1252
-	b	.L914
-.L938:
+	beq	.L989
+	cmp	w0, 8
+	bne	.L950
+.L989:
 	add	x1, x1, 1260
-.L914:
+.L928:
 	mov	x2, 0
-	mov	w3, w2
-.L916:
-	ldrsb	w4, [x1,x2]
+	mov	w3, 0
+.L930:
+	ldrsb	w4, [x1, x2]
 	add	x2, x2, 1
-	cmp	w4, wzr
-	csinc	w3, w3, w3, ne
+	cmp	w4, 0
+	cinc	w3, w3, eq
 	cmp	x2, 32
-	bne	.L916
+	bne	.L930
 	cmp	w3, 27
-	bls	.L909
+	bls	.L925
 	bl	FlashGetReadRetryDefault
 	bl	FlashSavePhyInfo
-	b	.L909
-.L910:
-	sub	w4, w0, #17
-	uxtb	w4, w4
-	cmp	w4, 2
-	bhi	.L918
-	adrp	x1, MicronReadRetrial
-	cmp	w0, 19
-	add	x1, x1, :lo12:MicronReadRetrial
-	str	x1, [x22,2192]
-	beq	.L919
-	mov	w0, 7
-	b	.L982
-.L919:
-	mov	w0, 15
-.L982:
-	strb	w0, [x2,#:lo12:g_maxRetryCount]
-	b	.L909
-.L918:
-	sub	w2, w0, #65
-	uxtb	w2, w2
-	cmp	w2, 1
-	bls	.L941
-	cmp	w0, 33
-	bne	.L920
-.L941:
-	add	x0, x19, :lo12:.LANCHOR2
-	adrp	x2, ToshibaReadRetrial
-	add	x2, x2, :lo12:ToshibaReadRetrial
-	str	x2, [x0,2192]
-	mov	w0, 4
-	strb	w0, [x1,#:lo12:g_maxRegNum]
-	mov	w0, 7
-	strb	w0, [x3,#:lo12:g_maxRetryCount]
-	b	.L909
-.L920:
-	sub	w2, w0, #67
-	sub	w4, w0, #34
-	uxtb	w2, w2
-	uxtb	w4, w4
-	cmp	w2, 1
-	cset	w2, ls
-	cmp	w4, 1
-	bls	.L942
-	cbz	w2, .L922
-.L942:
-	add	x4, x19, :lo12:.LANCHOR2
-	adrp	x5, ToshibaReadRetrial
-	add	x5, x5, :lo12:ToshibaReadRetrial
-	cmp	w0, 35
-	str	x5, [x4,2192]
-	beq	.L924
-	cmp	w0, 68
-	beq	.L924
-	mov	w0, 7
-	b	.L981
-.L924:
-	mov	w0, 17
-.L981:
-	strb	w0, [x3,#:lo12:g_maxRetryCount]
-	mov	w0, 4
-	cbnz	w2, .L983
-	mov	w0, 5
-.L983:
-	strb	w0, [x1,#:lo12:g_maxRegNum]
-	b	.L909
-.L922:
-	cmp	w0, 49
-	bne	.L927
-	adrp	x0, SamsungReadRetrial
-	add	x0, x0, :lo12:SamsungReadRetrial
-	str	x0, [x22,2192]
-	b	.L909
-.L927:
-	cmp	w0, 50
-	bne	.L909
-	adrp	x0, samsung_read_retrial
-	str	w2, [x22,2100]
-	add	x0, x0, :lo12:samsung_read_retrial
-	str	x0, [x22,2192]
-.L909:
+.L925:
 	add	x0, x19, :lo12:.LANCHOR2
-	mov	w1, 12336
-	movk	w1, 0x5638, lsl 16
-	ldr	w2, [x0,2116]
-	cmp	w2, w1
-	bne	.L928
-	ldrb	w0, [x0,1220]
-	cbz	w0, .L928
+	mov	w2, 12336
+	movk	w2, 0x5638, lsl 16
+	ldr	w1, [x0, 2116]
+	cmp	w1, w2
+	bne	.L940
+	ldrb	w0, [x0, 1220]
+	cbz	w0, .L940
 	add	x0, x20, :lo12:.LANCHOR0
-	ldr	x0, [x0,104]
-	strb	wzr, [x0,18]
-.L928:
-	ldrb	w0, [x21,#:lo12:IDByte]
+	ldr	x0, [x0, 104]
+	strb	wzr, [x0, 18]
+.L940:
+	ldrb	w0, [x22, #:lo12:IDByte]
 	cmp	w0, 44
-	bne	.L929
+	bne	.L941
 	add	x0, x19, :lo12:.LANCHOR2
-	ldrb	w1, [x0,2104]
-	cbz	w1, .L929
-	mov	w1, 12336
-	movk	w1, 0x5638, lsl 16
-	cmp	w2, w1
-	bne	.L930
-	ldrb	w0, [x0,1220]
-	cbnz	w0, .L929
-.L930:
+	ldrb	w2, [x0, 2104]
+	cbz	w2, .L941
+	mov	w2, 12336
+	movk	w2, 0x5638, lsl 16
+	cmp	w1, w2
+	bne	.L942
+	ldrb	w0, [x0, 1220]
+	cbnz	w0, .L941
+.L942:
 	add	x0, x19, :lo12:.LANCHOR2
-	strb	wzr, [x0,2104]
+	strb	wzr, [x0, 2104]
 	mov	w0, 1
 	bl	FlashSetInterfaceMode
 	mov	w0, 1
 	bl	NandcSetMode
-.L929:
+.L941:
 	add	x1, x19, :lo12:.LANCHOR2
-	ldrb	w0, [x1,2093]
+	ldrb	w0, [x1, 2093]
 	tst	w0, 6
-	beq	.L931
-	ldrb	w1, [x1,2104]
-	cbnz	w1, .L932
-	tbnz	x0, 0, .L931
-.L932:
+	beq	.L943
+	ldrb	w1, [x1, 2104]
+	cbnz	w1, .L944
+	tbnz	x0, 0, .L943
+.L944:
 	mov	w0, 0
 	bl	flash_enter_slc_mode
-	add	x1, x19, :lo12:.LANCHOR2
+	add	x0, x19, :lo12:.LANCHOR2
+	ldr	w1, [x0, 2208]
 	mov	w0, 0
-	ldr	w1, [x1,2208]
 	bl	FlashDdrParaScan
 	mov	w0, 0
 	bl	flash_exit_slc_mode
-.L931:
+.L943:
 	add	x20, x20, :lo12:.LANCHOR0
-	mov	w22, 16
+	mov	w21, 16
 	add	x19, x19, :lo12:.LANCHOR2
-	ldr	x0, [x20,104]
-	ldrb	w0, [x0,20]
+	ldr	x0, [x20, 104]
+	ldrb	w0, [x0, 20]
 	bl	FlashBchSel
 	add	x0, x20, 3456
 	bl	FlashReadIdbDataRaw
-	strb	w22, [x20,89]
 	mov	w0, 18928
+	strb	w21, [x20, 89]
 	movk	w0, 0x2, lsl 16
 	bl	FlashTimingCfg
-	ldr	x1, [x20,104]
-	add	x4, x21, :lo12:IDByte
-	ldrb	w2, [x1,12]
-	strh	w2, [x19,1200]
-	ldrb	w2, [x1,7]
-	str	w2, [x19,1196]
-	ldrb	w2, [x4,1]
-	lsl	w3, w2, w22
-	orr	w2, w3, w2, lsl 8
-	ldrb	w3, [x21,#:lo12:IDByte]
+	ldr	x1, [x20, 104]
+	ldrb	w4, [x22, #:lo12:IDByte]
+	ldrb	w2, [x1, 12]
+	strh	w2, [x19, 1200]
+	ldrb	w2, [x1, 7]
+	str	w2, [x19, 1196]
+	add	x2, x22, :lo12:IDByte
+	ldrb	w3, [x2, 1]
+	ldrb	w2, [x2, 3]
+	orr	w2, w4, w2, lsl 24
+	lsl	w4, w3, w21
+	orr	w3, w4, w3, lsl 8
+	ldrh	w4, [x1, 14]
 	orr	w2, w2, w3
-	ldrb	w3, [x4,3]
-	ldrh	w4, [x1,14]
-	orr	w2, w2, w3, lsl 24
-	str	w2, [x19,1192]
-	ldrb	w2, [x20,3216]
-	strh	w2, [x19,1202]
-	ldrb	w2, [x1,13]
-	strh	w2, [x19,1204]
-	strh	w4, [x19,1206]
-	ldrh	w2, [x1,10]
-	strh	w2, [x19,1208]
-	ldrb	w3, [x1,12]
-	ldrh	w2, [x1,10]
+	str	w2, [x19, 1192]
+	ldrb	w2, [x20, 3216]
+	strh	w2, [x19, 1202]
+	ldrb	w2, [x1, 13]
+	strh	w2, [x19, 1204]
+	strh	w4, [x19, 1206]
+	ldrh	w2, [x1, 10]
+	strh	w2, [x19, 1208]
+	ldrb	w3, [x1, 12]
+	ldrh	w2, [x1, 10]
 	sdiv	w2, w2, w3
-	strh	w2, [x19,1210]
-	ldrb	w3, [x1,9]
-	strh	w3, [x19,1212]
-	ldrh	w5, [x1,10]
-	ldrb	w2, [x1,9]
+	strh	w2, [x19, 1210]
+	ldrb	w3, [x1, 9]
+	strh	w3, [x19, 1212]
+	ldrh	w5, [x1, 10]
+	ldrb	w2, [x1, 9]
 	mul	w2, w2, w5
 	mov	w5, 512
-	strh	w5, [x19,1216]
-	ldrb	w5, [x20,89]
-	strh	w5, [x19,1218]
-	uxth	w2, w2
-	ldrb	w5, [x20,88]
-	strh	w2, [x19,1214]
+	strh	w5, [x19, 1216]
+	ldrb	w5, [x20, 89]
+	and	w2, w2, 65535
+	strh	w5, [x19, 1218]
+	strh	w2, [x19, 1214]
+	ldrb	w5, [x20, 88]
 	cmp	w5, 1
-	bne	.L934
-	lsl	w2, w2, 1
+	bne	.L945
+	ubfiz	w2, w2, 1, 15
 	lsr	w4, w4, 1
-	lsl	w3, w3, 1
-	strh	w2, [x19,1214]
-	strb	w22, [x20,89]
+	ubfiz	w3, w3, 1, 15
+	strh	w2, [x19, 1214]
+	strb	w21, [x20, 89]
 	mov	w2, 8
-	strh	w4, [x19,1206]
-	strh	w3, [x19,1212]
-	strh	w2, [x19,1218]
-.L934:
-	ldrb	w0, [x1,20]
+	strh	w4, [x19, 1206]
+	strh	w3, [x19, 1212]
+	strh	w2, [x19, 1218]
+.L945:
+	ldrb	w0, [x1, 20]
 	bl	FlashBchSel
 	bl	ftl_flash_suspend
 	mov	w0, 0
-	b	.L954
-.L936:
-	mov	w0, -2
-	b	.L954
-.L891:
-	strb	w5, [x3,2248]
-	b	.L890
-.L954:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+.L893:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 112
 	ret
-	.size	FlashInit, .-FlashInit
-	.align	2
-	.global	FlashPageProgMsbFFData
-	.type	FlashPageProgMsbFFData, %function
-FlashPageProgMsbFFData:
-	stp	x29, x30, [sp, -80]!
-	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	uxth	w19, w2
-	adrp	x20, .LANCHOR0
-	adrp	x2, .LANCHOR2
-	str	x25, [sp,64]
-	stp	x21, x22, [sp,32]
-	add	x3, x2, :lo12:.LANCHOR2
-	uxtb	w22, w0
-	add	x0, x20, :lo12:.LANCHOR0
-	mov	x21, x2
-	stp	x23, x24, [sp,48]
-	ldr	x0, [x0,104]
-	ldrb	w4, [x3,1220]
-	ldrb	w0, [x0,19]
-	cbz	w4, .L986
-	ldr	w2, [x3,2100]
-	cbnz	w2, .L985
-.L986:
-	sub	w2, w0, #5
-	uxtb	w2, w2
-	cmp	w2, 2
-	bls	.L987
-	cmp	w0, 50
-	beq	.L987
-	sub	w2, w0, #19
-	and	w2, w2, -17
-	uxtb	w2, w2
-	cbz	w2, .L987
-	cmp	w0, 68
-	bne	.L985
-.L987:
-	mov	w23, w1
-	add	x20, x20, :lo12:.LANCHOR0
-	mov	w25, 65535
-.L990:
-	ldr	x0, [x20,104]
-	ldrh	w0, [x0,10]
-	cmp	w0, w19
-	bls	.L985
-	add	x0, x20, 1168
-	ldrh	w0, [x0,w19,sxtw 1]
-	cmp	w0, w25
-	bne	.L985
-	add	x24, x21, :lo12:.LANCHOR2
-	mov	w1, 255
-	mov	w2, 32768
-	ldr	x0, [x24,2216]
-	bl	ftl_memset
-	ldr	x2, [x24,2216]
-	add	w1, w19, w23
-	mov	w0, w22
-	add	w19, w19, 1
-	mov	x3, x2
-	uxth	w19, w19
-	bl	FlashProgPage
-	b	.L990
-.L985:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldr	x25, [sp,64]
-	ldp	x29, x30, [sp], 80
-	ret
+.L910:
+	cmp	w2, 220
+	bne	.L912
+	add	x1, x0, :lo12:.LANCHOR1
+	mov	w2, 4096
+	strh	w2, [x1, 3430]
+	mov	w2, -36
+	b	.L993
+.L912:
+	cmp	w2, 211
+	bne	.L911
+	add	x1, x0, :lo12:.LANCHOR1
+	mov	w2, 4096
+	strh	w2, [x1, 3430]
+	mov	w2, 2
+	strb	w2, [x1, 3429]
+	b	.L911
+.L919:
+	ldrb	w0, [x21, 2093]
+	bl	FlashSetInterfaceMode
+	ldrb	w0, [x21, 2093]
+	b	.L988
+.L950:
+	add	x1, x1, 1252
+	b	.L928
+.L926:
+	sub	w3, w0, #17
+	and	w3, w3, 255
+	cmp	w3, 2
+	bhi	.L932
+	adrp	x2, MicronReadRetrial
+	add	x2, x2, :lo12:MicronReadRetrial
+	str	x2, [x21, 2192]
+	cmp	w0, 19
+	beq	.L933
+.L994:
+	mov	w0, 7
+	b	.L991
+.L933:
+	mov	w0, 15
+.L991:
+	strb	w0, [x1, #:lo12:g_maxRetryCount]
+	b	.L925
+.L932:
+	sub	w3, w0, #65
+	cmp	w0, 33
+	and	w3, w3, 255
+	ccmp	w3, 1, 0, ne
+	bhi	.L934
+	adrp	x0, ToshibaReadRetrial
+	add	x0, x0, :lo12:ToshibaReadRetrial
+	str	x0, [x21, 2192]
+	mov	w0, 4
+	strb	w0, [x2, #:lo12:g_maxRegNum]
+	b	.L994
+.L934:
+	sub	w3, w0, #34
+	sub	w2, w0, #67
+	and	w3, w3, 255
+	and	w2, w2, 255
+	cmp	w3, 1
+	ccmp	w2, 1, 0, hi
+	bhi	.L935
+	adrp	x3, ToshibaReadRetrial
+	add	x3, x3, :lo12:ToshibaReadRetrial
+	str	x3, [x21, 2192]
+	cmp	w0, 35
+	mov	w3, 68
+	ccmp	w0, w3, 4, ne
+	beq	.L936
+	mov	w0, 7
+.L990:
+	strb	w0, [x1, #:lo12:g_maxRetryCount]
+	cmp	w2, 1
+	bhi	.L938
+	mov	w0, 4
+.L992:
+	strb	w0, [x4, #:lo12:g_maxRegNum]
+	b	.L925
+.L936:
+	mov	w0, 17
+	b	.L990
+.L938:
+	mov	w0, 5
+	b	.L992
+.L935:
+	cmp	w0, 49
+	bne	.L939
+	adrp	x0, SamsungReadRetrial
+	add	x0, x0, :lo12:SamsungReadRetrial
+	str	x0, [x21, 2192]
+	b	.L925
+.L939:
+	cmp	w0, 50
+	bne	.L925
+	adrp	x0, samsung_read_retrial
+	str	wzr, [x21, 2100]
+	add	x0, x0, :lo12:samsung_read_retrial
+	str	x0, [x21, 2192]
+	b	.L925
+.L947:
+	mov	w0, -2
+	b	.L893
+.L907:
+	strb	w5, [x3, 2248]
+	b	.L906
+	.size	FlashInit, .-FlashInit
+	.align	2
+	.global	FlashPageProgMsbFFData
+	.type	FlashPageProgMsbFFData, %function
+FlashPageProgMsbFFData:
+	stp	x29, x30, [sp, -80]!
+	add	x29, sp, 0
+	stp	x21, x22, [sp, 32]
+	and	w22, w0, 255
+	adrp	x21, .LANCHOR2
+	add	x0, x21, :lo12:.LANCHOR2
+	stp	x19, x20, [sp, 16]
+	and	w19, w2, 65535
+	stp	x23, x24, [sp, 48]
+	str	x25, [sp, 64]
+	ldrb	w2, [x0, 1220]
+	cbz	w2, .L996
+	ldr	w0, [x0, 2100]
+	cbnz	w0, .L995
+.L996:
+	adrp	x20, .LANCHOR0
+	add	x20, x20, :lo12:.LANCHOR0
+	ldr	x0, [x20, 104]
+	ldrb	w0, [x0, 19]
+	sub	w0, w0, #5
+	and	w3, w0, 255
+	cmp	w3, 63
+	bhi	.L995
+	mov	x2, 16391
+	movk	x2, 0x4000, lsl 16
+	movk	x2, 0x2000, lsl 32
+	movk	x2, 0x8000, lsl 48
+	lsr	x0, x2, x3
+	tbz	x0, 0, .L995
+	mov	w23, w1
+	add	x24, x20, 1168
+	add	x21, x21, :lo12:.LANCHOR2
+	mov	w25, 65535
+.L998:
+	ldr	x0, [x20, 104]
+	ldrh	w0, [x0, 10]
+	cmp	w0, w19
+	bhi	.L999
+.L995:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldr	x25, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	ret
+.L999:
+	ldrh	w0, [x24, w19, sxtw 1]
+	cmp	w0, w25
+	bne	.L995
+	ldr	x0, [x21, 2216]
+	mov	w2, 32768
+	mov	w1, 255
+	bl	ftl_memset
+	ldr	x3, [x21, 2216]
+	add	w1, w19, w23
+	add	w19, w19, 1
+	mov	w0, w22
+	and	w19, w19, 65535
+	mov	x2, x3
+	bl	FlashProgPage
+	b	.L998
 	.size	FlashPageProgMsbFFData, .-FlashPageProgMsbFFData
 	.align	2
 	.global	FlashReadSlc2KPages
@@ -6481,715 +6376,686 @@ FlashPageProgMsbFFData:
 FlashReadSlc2KPages:
 	stp	x29, x30, [sp, -144]!
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	mov	w24, w1
-	adrp	x23, .LANCHOR0
-	adrp	x1, .LANCHOR1+481
-	str	w2, [x29,116]
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	x19, x0
-	add	x0, x23, :lo12:.LANCHOR0
-	str	x0, [x29,120]
-	add	x0, x0, 3220
-	stp	x25, x26, [sp,64]
-	str	x0, [x29,104]
-	adrp	x0, .LC16
-	ldrb	w25, [x1,#:lo12:.LANCHOR1+481]
-	add	x0, x0, :lo12:.LC16
-	stp	x21, x22, [sp,32]
-	stp	x27, x28, [sp,80]
-	mov	w22, 0
-	str	x0, [x29,96]
-.L1002:
-	cmp	w22, w24
-	beq	.L1066
-	ldr	w1, [x29,116]
-	sub	w4, w24, w22
-	mov	x0, x19
-	add	x2, x29, 140
+	mov	w0, 56
+	stp	x21, x22, [sp, 32]
+	str	w2, [x29, 120]
+	adrp	x2, .LANCHOR1+481
+	umaddl	x0, w1, w0, x19
+	stp	x25, x26, [sp, 64]
+	str	x0, [x29, 112]
+	and	w22, w1, 255
+	adrp	x0, .LANCHOR0
+	ldrb	w2, [x2, #:lo12:.LANCHOR1+481]
+	add	x26, x0, :lo12:.LANCHOR0
+	stp	x23, x24, [sp, 48]
+	add	x0, x26, 3072
+	stp	x27, x28, [sp, 80]
+	str	x0, [x29, 96]
+	str	w2, [x29, 124]
+.L1005:
+	ldr	x0, [x29, 112]
+	cmp	x19, x0
+	bne	.L1025
+	ldp	x19, x20, [sp, 16]
+	mov	w0, 0
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 144
+	ret
+.L1025:
+	ldr	w1, [x29, 120]
+	mov	w4, w22
 	add	x3, x29, 136
+	add	x2, x29, 140
+	mov	x0, x19
 	bl	LogAddr2PhyAddr
-	ldr	x1, [x29,120]
-	ldr	w0, [x29,136]
-	ldrb	w1, [x1,3216]
-	cmp	w0, w1
-	bcc	.L1003
+	ldrb	w1, [x26, 3216]
+	ldr	w0, [x29, 136]
+	cmp	w1, w0
+	bhi	.L1006
 	mov	w0, -1
 	str	w0, [x19]
-	b	.L1004
-.L1003:
-	ldr	x1, [x29,104]
-	mov	w23, 0
-	adrp	x27, .LANCHOR2
+.L1007:
+	sub	w22, w22, #1
+	add	x19, x19, 56
+	and	w22, w22, 255
+	b	.L1005
+.L1006:
+	ldr	x1, [x29, 96]
+	adrp	x21, .LANCHOR2
+	mov	w25, 0
+	add	x23, x21, :lo12:.LANCHOR2
 	mov	w28, 256
-	ldrb	w20, [x1,w0,uxtw]
+	add	x0, x1, w0, uxtw
+	ldrb	w20, [x0, 148]
 	mov	w0, w20
 	bl	NandcWaitFlashReady
 	mov	w0, w20
 	bl	NandcFlashCs
-.L1005:
-	ldr	w1, [x29,140]
+.L1008:
+	ldr	w1, [x29, 140]
 	mov	w0, w20
-	adrp	x21, .LANCHOR2
 	bl	FlashReadCmd
 	mov	w0, w20
 	bl	NandcWaitFlashReady
-	ldr	x3, [x19,8]
-	mov	w0, w20
-	ldr	x4, [x19,16]
+	ldrb	w2, [x29, 124]
 	mov	w1, 0
-	mov	w2, w25
+	ldp	x3, x4, [x19, 8]
+	mov	w0, w20
 	bl	NandcXferData
-	mov	w26, w0
-	add	x0, x27, :lo12:.LANCHOR2
-	ldrb	w0, [x0,2248]
-	cbz	w0, .L1006
+	mov	w24, w0
+	ldrb	w0, [x23, 2248]
+	cbz	w0, .L1009
 	mov	w0, w20
 	bl	flash_read_ecc
 	cmp	w0, 5
-	csel	w26, w26, w28, ls
-.L1006:
-	cmn	w26, #1
-	bne	.L1007
-	cmp	w23, 9
-	bhi	.L1007
-	add	w23, w23, 1
-	b	.L1005
-.L1007:
-	cmp	w23, wzr
-	mov	w27, 256
-	csel	w26, w26, w27, eq
-	mov	w23, 0
+	csel	w24, w24, w28, ls
 .L1009:
+	cmp	w25, 9
+	ccmn	w24, #1, 0, ls
+	bne	.L1010
+	add	w25, w25, 1
+	b	.L1008
+.L1010:
+	cmp	w25, 0
 	adrp	x0, .LANCHOR0
-	ldr	w1, [x29,140]
-	add	x0, x0, :lo12:.LANCHOR0
-	ldr	w2, [x0,92]
+	mov	w23, 256
+	csel	w24, w24, w23, eq
+	add	x28, x0, :lo12:.LANCHOR0
+	mov	w25, 0
+	add	x0, x21, :lo12:.LANCHOR2
+	str	x0, [x29, 104]
+.L1012:
+	ldr	w0, [x28, 92]
+	ldr	w1, [x29, 140]
+	add	w1, w1, w0
 	mov	w0, w20
-	add	w1, w2, w1
 	bl	FlashReadCmd
 	mov	w0, w20
 	bl	NandcWaitFlashReady
-	ldr	x0, [x19,8]
+	ldr	x0, [x19, 8]
 	mov	w1, 0
-	mov	w2, w25
-	cmp	x0, xzr
+	ldrb	w2, [x29, 124]
+	cmp	x0, 0
 	add	x3, x0, 2048
-	ldr	x0, [x19,16]
+	ldr	x0, [x19, 16]
 	csel	x3, x3, xzr, ne
+	cmp	x0, 0
 	add	x4, x0, 8
-	cmp	x0, xzr
 	csel	x4, x4, xzr, ne
 	mov	w0, w20
 	bl	NandcXferData
-	mov	w28, w0
-	add	x0, x21, :lo12:.LANCHOR2
-	ldrb	w0, [x0,2248]
-	cbz	w0, .L1012
+	mov	w27, w0
+	ldr	x0, [x29, 104]
+	ldrb	w0, [x0, 2248]
+	cbz	w0, .L1015
 	mov	w0, w20
 	bl	flash_read_ecc
 	cmp	w0, 5
-	csel	w28, w28, w27, ls
-.L1012:
-	cmn	w28, #1
-	bne	.L1013
-	cmp	w23, 9
-	bhi	.L1013
-	add	w23, w23, 1
-	b	.L1009
-.L1013:
-	cmp	w23, wzr
+	csel	w27, w27, w23, ls
+.L1015:
+	cmp	w25, 9
+	ccmn	w27, #1, 0, ls
+	bne	.L1016
+	add	w25, w25, 1
+	b	.L1012
+.L1016:
+	cmp	w25, 0
+	mov	w2, 256
 	mov	w0, w20
-	mov	w27, 256
-	csel	w28, w28, w27, eq
+	csel	w27, w27, w2, eq
 	bl	NandcFlashDeCs
 	add	x0, x21, :lo12:.LANCHOR2
-	cmp	w28, w26
-	csel	w28, w28, w26, cs
-	ldrb	w0, [x0,1221]
+	cmp	w24, w27
+	csel	w5, w24, w27, cs
+	ldrb	w0, [x0, 1221]
 	add	w0, w0, w0, lsl 1
-	cmp	w28, w0, lsr 2
-	bls	.L1015
-	cmn	w28, #1
-	csel	w28, w28, w27, eq
-.L1015:
-	cmp	w28, 256
-	beq	.L1026
-	cmn	w28, #1
-	bne	.L1016
-.L1026:
-	str	w28, [x19]
-	b	.L1018
-.L1016:
-	str	wzr, [x19]
+	cmp	w5, w0, lsr 2
+	bls	.L1018
+	cmn	w5, #1
+	csel	w5, w5, w2, eq
 .L1018:
-	ldr	x0, [x19,16]
-	cbz	x0, .L1019
-	ldr	w1, [x0,12]
+	cmp	w5, 256
+	ldr	x0, [x19, 16]
+	ccmn	w5, #1, 4, ne
+	csel	w5, w5, wzr, eq
+	str	w5, [x19]
+	cbz	x0, .L1021
+	ldr	w1, [x0, 12]
 	cmn	w1, #1
-	bne	.L1019
-	ldr	w1, [x0,8]
+	bne	.L1021
+	ldr	w1, [x0, 8]
 	cmn	w1, #1
-	bne	.L1019
+	bne	.L1021
 	ldr	w0, [x0]
 	cmn	w0, #1
-	beq	.L1019
+	beq	.L1021
 	str	w1, [x19]
-.L1019:
+.L1021:
 	ldr	w3, [x19]
 	cmn	w3, #1
-	bne	.L1004
+	bne	.L1007
 	add	x21, x21, :lo12:.LANCHOR2
-	ldr	w1, [x19,4]
-	ldr	x0, [x29,96]
-	ldrb	w2, [x21,1221]
+	ldr	w1, [x19, 4]
+	adrp	x0, .LC16
+	add	x0, x0, :lo12:.LC16
+	ldrb	w2, [x21, 1221]
 	bl	printk
-	ldr	x1, [x19,8]
-	cbz	x1, .L1021
+	ldr	x1, [x19, 8]
+	cbz	x1, .L1023
 	adrp	x0, .LC17
+	mov	w3, 8
 	mov	w2, 4
 	add	x0, x0, :lo12:.LC17
-	mov	w3, 8
 	bl	rknand_print_hex
-.L1021:
-	ldr	x1, [x19,16]
-	cbz	x1, .L1004
+.L1023:
+	ldr	x1, [x19, 16]
+	cbz	x1, .L1007
+	mov	w3, 4
 	adrp	x0, .LC18
-	mov	w2, 4
+	mov	w2, w3
 	add	x0, x0, :lo12:.LC18
-	mov	w3, w2
 	bl	rknand_print_hex
-.L1004:
-	add	w22, w22, 1
-	add	x19, x19, 56
-	b	.L1002
-.L1066:
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 144
-	ret
+	b	.L1007
 	.size	FlashReadSlc2KPages, .-FlashReadSlc2KPages
 	.align	2
 	.global	FlashReadPages
 	.type	FlashReadPages, %function
 FlashReadPages:
 	stp	x29, x30, [sp, -160]!
-	adrp	x3, .LANCHOR1+481
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	adrp	x23, .LANCHOR0
-	ldrb	w3, [x3,#:lo12:.LANCHOR1+481]
-	add	x23, x23, :lo12:.LANCHOR0
-	str	w3, [x29,136]
-	stp	x25, x26, [sp,64]
-	stp	x19, x20, [sp,16]
-	ldrb	w3, [x23,96]
+	stp	x25, x26, [sp, 64]
+	adrp	x25, .LANCHOR0
+	add	x3, x25, :lo12:.LANCHOR0
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x27, x28, [sp, 80]
+	stp	w2, w1, [x29, 120]
+	ldrb	w4, [x3, 88]
+	cbnz	w4, .L1054
 	mov	x26, x0
-	ldrb	w24, [x23,88]
-	stp	x21, x22, [sp,32]
-	stp	x27, x28, [sp,80]
-	str	w1, [x29,132]
-	str	w2, [x29,128]
-	str	w3, [x29,116]
-	cbz	w24, .L1107
-	bl	FlashReadSlc2KPages
-	b	.L1156
-.L1107:
-	add	x0, x23, 3220
-	str	x0, [x29,104]
+	adrp	x0, .LANCHOR1+481
+	mov	w24, 0
+	mov	w23, 0
+	ldrb	w0, [x0, #:lo12:.LANCHOR1+481]
+	str	w0, [x29, 136]
+	ldrb	w0, [x3, 96]
+	str	w0, [x29, 108]
 	adrp	x0, .LANCHOR2
-	mov	w25, w24
-	add	x21, x0, :lo12:.LANCHOR2
-	add	x0, x21, 1236
-	str	x0, [x29,120]
-.L1068:
-	ldr	w0, [x29,132]
-	cmp	w25, w0
-	bcs	.L1158
+	add	x20, x0, :lo12:.LANCHOR2
+	add	x0, x20, 1236
+	str	x0, [x29, 112]
+.L1055:
+	ldr	w0, [x29, 124]
+	cmp	w23, w0
+	bcc	.L1089
+	mov	w0, 0
+	b	.L1053
+.L1054:
+	bl	FlashReadSlc2KPages
+.L1053:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 160
+	ret
+.L1089:
 	mov	w27, 56
-	ldr	w0, [x29,132]
-	ldr	w1, [x29,128]
+	ldr	w1, [x29, 120]
 	add	x2, x29, 156
-	umull	x27, w25, w27
-	sub	w4, w0, w25
 	add	x3, x29, 152
-	add	x22, x26, x27
+	umull	x0, w23, w27
+	add	x27, x25, :lo12:.LANCHOR0
+	str	x0, [x29, 128]
+	add	x22, x26, x0
+	ldr	w0, [x29, 124]
+	sub	w4, w0, w23
 	mov	x0, x22
-	ldr	w28, [x22,4]
+	ldr	w28, [x22, 4]
 	bl	LogAddr2PhyAddr
-	ldrb	w1, [x23,3216]
-	mov	w20, w0
-	ldr	w0, [x29,152]
-	cmp	w0, w1
-	bcc	.L1070
+	ldrb	w2, [x27, 3216]
+	mov	w21, w0
+	ldr	w0, [x29, 152]
+	cmp	w2, w0
+	bhi	.L1057
+	ldr	x1, [x29, 128]
 	mov	w0, -1
-	str	w0, [x26,x27]
-	b	.L1071
-.L1070:
-	ldr	x1, [x29,104]
-	ldrb	w19, [x1,w0,uxtw]
+	str	w0, [x26, x1]
+.L1058:
+	add	w23, w23, 1
+	b	.L1055
+.L1057:
+	add	x0, x27, w0, uxtw
+	ldrb	w19, [x0, 3220]
 	adrp	x0, .LANCHOR2
 	add	x0, x0, :lo12:.LANCHOR2
-	ldrb	w0, [x0,2249]
-	cmp	w0, wzr
+	ldrb	w0, [x0, 2249]
+	cmp	w0, 0
 	mov	w0, w19
-	csel	w20, w20, wzr, ne
+	csel	w21, w21, wzr, ne
 	bl	NandcWaitFlashReady
-	ldr	x0, [x23,104]
-	ldrb	w1, [x0,19]
+	ldr	x0, [x27, 104]
+	ldrb	w1, [x0, 19]
 	sub	w0, w1, #1
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 7
-	bhi	.L1073
-	sub	w1, w1, #7
-	add	x0, x21, 1232
+	bhi	.L1060
+	add	x0, x20, 1232
 	sxtw	x2, w19
 	add	x0, x0, x2
-	uxtb	w1, w1
+	sub	w1, w1, #7
+	and	w1, w1, 255
 	cmp	w1, 1
-	ldrb	w3, [x0,12]
-	bhi	.L1074
-	ldrb	w3, [x0,20]
-.L1074:
-	add	x2, x21, x2
-	ldrb	w0, [x2,2088]
+	ldrb	w3, [x0, 12]
+	bhi	.L1061
+	ldrb	w3, [x0, 20]
+.L1061:
+	add	x2, x20, x2
+	ldrb	w0, [x2, 2088]
 	cmp	w0, w3
-	beq	.L1073
-	ldrb	w1, [x21,1233]
+	beq	.L1060
+	ldrb	w1, [x20, 1233]
 	mov	w0, w19
-	ldr	x2, [x29,120]
+	ldr	x2, [x29, 112]
 	bl	HynixSetRRPara
-.L1073:
+.L1060:
 	mov	w0, w19
 	bl	NandcFlashCs
-	ldr	w0, [x29,128]
+	ldr	w0, [x29, 120]
 	cmp	w0, 1
 	cset	w0, eq
 	orr	w0, w0, w28, lsr 31
-	str	w0, [x29,140]
-	cbz	w0, .L1075
-	ldrb	w0, [x21,1220]
-	cbz	w0, .L1075
+	str	w0, [x29, 140]
+	cbz	w0, .L1062
+	ldrb	w0, [x20, 1220]
+	cbz	w0, .L1062
 	mov	w0, w19
 	bl	flash_enter_slc_mode
-	b	.L1076
-.L1075:
-	mov	w0, w19
-	bl	flash_exit_slc_mode
-.L1076:
-	cmp	w19, 255
-	ldr	w1, [x29,156]
-	bne	.L1114
+.L1063:
+	add	x28, x25, :lo12:.LANCHOR0
+.L1069:
+	ldr	w1, [x29, 156]
 	cmn	w1, #1
-	cset	w0, ne
-	cbz	w0, .L1108
-.L1114:
-	cbz	w20, .L1080
-	ldr	w2, [x23,92]
+	bne	.L1064
+	cmp	w19, 255
+	beq	.L1091
+.L1064:
+	cbz	w21, .L1066
+	ldr	w2, [x28, 92]
 	mov	w0, w19
 	add	w2, w1, w2
 	bl	FlashReadDpCmd
-	b	.L1081
-.L1080:
+.L1067:
 	mov	w0, w19
-	bl	FlashReadCmd
-	b	.L1081
-.L1108:
-	mov	w20, w0
-.L1078:
-	ldrb	w2, [x29,136]
+	bl	NandcWaitFlashReady
+	cbz	w21, .L1065
+	ldr	w1, [x29, 156]
 	mov	w0, w19
-	ldr	x3, [x22,8]
+	bl	FlashReadDpDataOutCmd
+.L1065:
+	ldrb	w2, [x29, 136]
 	mov	w1, 0
-	ldr	x4, [x22,16]
+	ldp	x3, x4, [x22, 8]
+	mov	w0, w19
 	bl	NandcXferData
-	cmn	w0, #1
-	mov	w28, w0
-	bne	.L1082
-	ldrb	w0, [x23,96]
-	cbz	w0, .L1082
-	strb	wzr, [x23,96]
-	mov	w20, 0
-	b	.L1076
-.L1082:
-	cbz	w20, .L1083
-	ldr	w2, [x23,92]
+	mov	w27, w0
+	ldrb	w0, [x28, 96]
+	cbz	w0, .L1068
+	cmn	w27, #1
+	bne	.L1068
+	strb	wzr, [x28, 96]
+	mov	w21, 0
+	b	.L1069
+.L1062:
+	mov	w0, w19
+	bl	flash_exit_slc_mode
+	b	.L1063
+.L1066:
+	mov	w0, w19
+	bl	FlashReadCmd
+	b	.L1067
+.L1091:
+	mov	w21, 0
+	b	.L1065
+.L1068:
+	cbz	w21, .L1070
+	add	x0, x25, :lo12:.LANCHOR0
+	ldr	w1, [x29, 156]
+	ldr	w0, [x0, 92]
+	add	w1, w1, w0
 	mov	w0, w19
-	ldr	w1, [x29,156]
-	add	w1, w2, w1
 	bl	FlashReadDpDataOutCmd
-	add	w0, w25, 1
-	mov	w4, 56
-	ldrb	w2, [x29,136]
+	add	w0, w23, 1
+	mov	w1, 56
+	ldrb	w2, [x29, 136]
+	nop // between mem op and mult-accumulate
+	umaddl	x0, w0, w1, x26
 	mov	w1, 0
-	umull	x4, w0, w4
+	ldp	x3, x4, [x0, 8]
 	mov	w0, w19
-	add	x4, x26, x4
-	ldr	x3, [x4,8]
-	ldr	x4, [x4,16]
 	bl	NandcXferData
 	cmn	w0, #1
 	mov	w24, w0
-	csel	w20, w20, wzr, ne
-.L1083:
+	csel	w21, w21, wzr, ne
+.L1070:
 	mov	w0, w19
 	bl	NandcFlashDeCs
-	ldrb	w0, [x29,116]
-	cmn	w28, #1
-	strb	w0, [x23,96]
-	bne	.L1090
-	ldrb	w0, [x21,2104]
-	cbnz	w0, .L1085
-.L1089:
-	ldr	x20, [x21,2192]
-	cbnz	x20, .L1086
-	b	.L1159
-.L1085:
-	ldr	x0, [x21,1152]
+	add	x0, x25, :lo12:.LANCHOR0
+	ldrb	w1, [x29, 108]
+	cmn	w27, #1
+	strb	w1, [x0, 96]
+	bne	.L1071
+	ldrb	w0, [x20, 2104]
+	cbnz	w0, .L1072
+.L1076:
+	ldr	x4, [x20, 2192]
+	cbnz	x4, .L1073
+	ldr	w1, [x29, 156]
+	mov	w0, w19
+	ldp	x2, x3, [x22, 8]
+	bl	FlashReadRawPage
+	b	.L1128
+.L1072:
+	ldr	x0, [x20, 1152]
 	mov	w4, 1
-	ldr	w1, [x29,156]
-	ldr	x2, [x22,8]
-	ldr	x3, [x22,16]
-	ldr	w20, [x0,304]
+	ldr	w1, [x29, 156]
+	ldp	x2, x3, [x22, 8]
+	ldr	w21, [x0, 304]
 	mov	w0, w19
 	bl	FlashDdrTunningRead
+	mov	w27, w0
 	cmn	w0, #1
-	mov	w28, w0
-	beq	.L1088
-	ldrb	w0, [x21,1221]
-	cmp	w28, w0, lsr 1
-	bls	.L1110
-.L1088:
-	lsr	w0, w20, 8
+	beq	.L1075
+	ldrb	w0, [x20, 1221]
+	cmp	w27, w0, lsr 1
+	bls	.L1092
+.L1075:
+	lsr	w0, w21, 8
 	bl	NandcSetDdrPara
-	cmn	w28, #1
-	beq	.L1089
-	b	.L1110
-.L1086:
-	ldr	w1, [x29,156]
-	mov	w0, w19
-	ldr	x2, [x22,8]
-	ldr	x3, [x22,16]
-	blr	x20
-	cmn	w0, #1
-	mov	w28, w0
-	mov	w20, 0
-	bne	.L1091
-	ldr	x0, [x23,104]
-	ldrb	w0, [x0,19]
-	sub	w0, w0, #1
-	uxtb	w0, w0
-	cmp	w0, 7
-	bhi	.L1092
-	ldrb	w1, [x21,1233]
-	mov	w0, w19
-	ldr	x2, [x29,120]
-	mov	w3, w20
-	bl	HynixSetRRPara
+	cmn	w27, #1
+	beq	.L1076
 .L1092:
-	ldr	w1, [x29,156]
-	mov	w0, w19
-	ldr	x2, [x22,8]
-	mov	w20, 0
-	ldr	x3, [x22,16]
-	bl	FlashReadRawPage
-	mov	w28, w0
-	ldr	w1, [x22,4]
-	adrp	x0, .LC19
-	ldrb	w2, [x21,1221]
-	add	x0, x0, :lo12:.LC19
-	mov	w3, w28
-	bl	printk
-	cmn	w28, #1
-	bne	.L1091
-	ldrb	w0, [x21,1220]
-	cbz	w0, .L1091
-	ldr	w0, [x29,140]
-	cbz	w0, .L1093
-	mov	w0, w19
-	bl	flash_enter_slc_mode
-	b	.L1094
-.L1093:
-	mov	w0, w19
-	bl	flash_exit_slc_mode
-.L1094:
-	ldr	x4, [x21,2192]
-	mov	w0, w19
-	ldr	w1, [x29,156]
-	mov	w20, 0
-	ldr	x2, [x22,8]
-	ldr	x3, [x22,16]
-	blr	x4
-	mov	w28, w0
-	b	.L1091
-.L1159:
-	ldr	w1, [x29,156]
-	mov	w0, w19
-	ldr	x2, [x22,8]
-	ldr	x3, [x22,16]
-	bl	FlashReadRawPage
-	mov	w28, w0
-	b	.L1091
-.L1110:
-	mov	w20, 0
-.L1090:
-	ldrb	w0, [x21,1221]
+	mov	w21, 0
+.L1071:
+	ldrb	w0, [x20, 1221]
 	add	w0, w0, w0, lsl 1
-	cmp	w28, w0, lsr 2
-	bls	.L1091
-	ldr	x0, [x21,2192]
-	cmp	x0, xzr
+	cmp	w27, w0, lsr 2
+	bls	.L1077
+	ldr	x0, [x20, 2192]
+	cmp	x0, 0
 	mov	w0, 256
-	csel	w28, w28, w0, ne
-.L1091:
-	cmp	w28, 256
-	beq	.L1115
-	cmn	w28, #1
-	bne	.L1095
-.L1115:
-	str	w28, [x26,x27]
-	b	.L1097
-.L1095:
-	str	wzr, [x26,x27]
-.L1097:
-	ldr	w3, [x26,x27]
+	csel	w27, w27, w0, ne
+.L1077:
+	ldr	x0, [x29, 128]
+	cmp	w27, 256
+	ccmn	w27, #1, 4, ne
+	csel	w3, w27, wzr, eq
 	cmn	w3, #1
-	bne	.L1099
-	ldr	w1, [x22,4]
+	str	w3, [x26, x0]
+	bne	.L1084
+	ldr	w1, [x22, 4]
 	adrp	x0, .LC16
-	ldrb	w2, [x21,1221]
+	ldrb	w2, [x20, 1221]
 	add	x0, x0, :lo12:.LC16
 	bl	printk
-	ldr	x1, [x22,16]
-	cbz	x1, .L1099
+	ldr	x1, [x22, 16]
+	cbz	x1, .L1084
+	mov	w3, 4
 	adrp	x0, .LC18
-	mov	w2, 4
+	mov	w2, w3
 	add	x0, x0, :lo12:.LC18
-	mov	w3, w2
 	bl	rknand_print_hex
-.L1099:
-	cbz	w20, .L1101
-	ldrb	w0, [x21,1221]
+.L1084:
+	cbz	w21, .L1086
+	ldrb	w0, [x20, 1221]
 	add	w0, w0, w0, lsl 1
 	cmp	w24, w0, lsr 2
-	bls	.L1102
-	ldr	x0, [x21,2192]
-	cmp	x0, xzr
+	bls	.L1087
+	ldr	x0, [x20, 2192]
+	cmp	x0, 0
 	mov	w0, 256
 	csel	w24, w24, w0, ne
-.L1102:
-	add	w0, w25, 1
+.L1087:
+	add	w0, w23, 1
 	mov	w1, 56
 	cmp	w24, 256
+	ccmn	w24, #1, 4, ne
 	umull	x0, w0, w1
-	beq	.L1116
-	cmn	w24, #1
-	bne	.L1103
-.L1116:
-	str	w24, [x26,x0]
-	b	.L1101
-.L1103:
-	str	wzr, [x26,x0]
-.L1101:
-	ldr	w0, [x29,140]
-	add	w25, w25, w20
-	cbz	w0, .L1071
-	ldrb	w0, [x21,1220]
-	cbz	w0, .L1071
+	csel	w1, w24, wzr, eq
+	str	w1, [x26, x0]
+.L1086:
+	ldr	w0, [x29, 140]
+	add	w23, w23, w21
+	cbz	w0, .L1058
+	ldrb	w0, [x20, 1220]
+	cbz	w0, .L1058
 	mov	w0, w19
 	bl	flash_exit_slc_mode
-.L1071:
-	add	w25, w25, 1
-	b	.L1068
-.L1158:
-	mov	w0, 0
-	b	.L1156
-.L1081:
+	b	.L1058
+.L1073:
+	ldr	w1, [x29, 156]
 	mov	w0, w19
-	bl	NandcWaitFlashReady
-	cbz	w20, .L1078
-	ldr	w1, [x29,156]
+	ldp	x2, x3, [x22, 8]
+	mov	w21, 0
+	blr	x4
+	mov	w27, w0
+	cmn	w0, #1
+	bne	.L1077
+	add	x0, x25, :lo12:.LANCHOR0
+	ldr	x0, [x0, 104]
+	ldrb	w0, [x0, 19]
+	sub	w0, w0, #1
+	and	w0, w0, 255
+	cmp	w0, 7
+	bhi	.L1078
+	ldrb	w1, [x20, 1233]
+	mov	w3, 0
+	ldr	x2, [x29, 112]
 	mov	w0, w19
-	bl	FlashReadDpDataOutCmd
-	b	.L1078
-.L1156:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 160
-	ret
+	bl	HynixSetRRPara
+.L1078:
+	ldp	x2, x3, [x22, 8]
+	mov	w0, w19
+	ldr	w1, [x29, 156]
+	bl	FlashReadRawPage
+	mov	w27, w0
+	ldrb	w2, [x20, 1221]
+	mov	w3, w0
+	ldr	w1, [x22, 4]
+	adrp	x0, .LC19
+	add	x0, x0, :lo12:.LC19
+	bl	printk
+	cmn	w27, #1
+	bne	.L1095
+	ldrb	w0, [x20, 1220]
+	cbz	w0, .L1095
+	ldr	w0, [x29, 140]
+	cbz	w0, .L1079
+	mov	w0, w19
+	bl	flash_enter_slc_mode
+.L1080:
+	ldr	w1, [x29, 156]
+	mov	w0, w19
+	ldr	x4, [x20, 2192]
+	ldp	x2, x3, [x22, 8]
+	blr	x4
+.L1128:
+	mov	w27, w0
+.L1095:
+	mov	w21, 0
+	b	.L1077
+.L1079:
+	mov	w0, w19
+	bl	flash_exit_slc_mode
+	b	.L1080
 	.size	FlashReadPages, .-FlashReadPages
 	.align	2
 	.global	FlashLoadFactorBbt
 	.type	FlashLoadFactorBbt, %function
 FlashLoadFactorBbt:
-	stp	x29, x30, [sp, -192]!
-	mov	w1, 0
+	stp	x29, x30, [sp, -176]!
 	mov	w2, 16
+	mov	w1, 0
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	adrp	x22, .LANCHOR2
-	stp	x19, x20, [sp,16]
-	add	x19, x22, :lo12:.LANCHOR2
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	stp	x23, x24, [sp,48]
-	mov	w27, -1
-	mov	w28, 0
-	ldrh	w0, [x19,1204]
-	adrp	x25, .LC20
-	ldrh	w21, [x19,1206]
-	adrp	x26, .LANCHOR0
-	add	x25, x25, :lo12:.LC20
-	mul	w21, w0, w21
+	stp	x19, x20, [sp, 16]
+	stp	x23, x24, [sp, 48]
+	adrp	x23, .LANCHOR2
+	add	x19, x23, :lo12:.LANCHOR2
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	mov	w26, -1
+	stp	x21, x22, [sp, 32]
+	mov	w27, 0
+	ldrh	w0, [x19, 1204]
+	ldrh	w21, [x19, 1206]
+	mul	w21, w21, w0
 	add	x0, x19, 2256
-	uxth	w21, w21
 	bl	ftl_memset
-	add	w24, w21, w27
-	ldr	x0, [x19,2224]
-	str	xzr, [x29,144]
-	mov	w19, w28
-	str	x0, [x29,152]
-	uxth	w24, w24
-.L1161:
-	add	x1, x26, :lo12:.LANCHOR0
-	ldrb	w1, [x1,3216]
-	cmp	w1, w19
-	bls	.L1171
-	mul	w4, w19, w21
-	mov	w20, w24
-	sub	w3, w21, #12
-	mov	w5, 61664
-.L1162:
-	cmp	w20, w3
-	ble	.L1164
-	add	w1, w4, w20
-	add	x0, x29, 136
-	lsl	w1, w1, 10
-	str	w1, [x29,140]
-	mov	w1, 1
-	str	x5, [x29,104]
-	mov	w2, w1
-	str	x3, [x29,112]
-	str	x4, [x29,120]
+	and	w21, w21, 65535
+	ldr	x0, [x19, 2224]
+	add	w25, w21, w26
+	stp	xzr, x0, [x29, 128]
+	and	w25, w25, 65535
+	sub	w0, w21, #12
+	mov	w19, 0
+	str	w0, [x29, 108]
+.L1130:
+	adrp	x22, .LANCHOR0
+	add	x0, x22, :lo12:.LANCHOR0
+	ldrb	w0, [x0, 3216]
+	cmp	w0, w19
+	bhi	.L1136
+	mov	w0, w26
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 176
+	ret
+.L1136:
+	mul	w28, w21, w19
+	mov	w20, w25
+	add	x24, x23, :lo12:.LANCHOR2
+	mov	w3, 61664
+.L1131:
+	ldr	w0, [x29, 108]
+	cmp	w20, w0
+	ble	.L1133
+	add	w0, w20, w28
+	mov	w2, 1
+	lsl	w0, w0, 10
+	str	w3, [x29, 104]
+	str	w0, [x29, 124]
+	mov	w1, w2
+	add	x0, x29, 120
 	bl	FlashReadPages
-	ldr	w0, [x29,136]
-	ldr	x4, [x29,120]
+	ldr	w0, [x29, 120]
+	ldr	w3, [x29, 104]
 	cmn	w0, #1
-	ldr	x3, [x29,112]
-	ldr	x5, [x29,104]
-	beq	.L1163
-	add	x23, x22, :lo12:.LANCHOR2
-	ldr	x0, [x23,2224]
+	beq	.L1132
+	ldr	x0, [x24, 2224]
 	ldrh	w0, [x0]
-	cmp	w0, w5
-	bne	.L1163
-	add	x23, x23, 2256
-	mov	x0, x25
-	mov	w1, w19
+	cmp	w0, w3
+	bne	.L1132
+	add	x24, x24, w19, sxtw 1
+	add	w27, w27, 1
+	and	w27, w27, 65535
 	mov	w2, w20
-	add	w28, w28, 1
+	mov	w1, w19
+	adrp	x0, .LC20
+	add	x0, x0, :lo12:.LC20
 	bl	printk
-	strh	w20, [x23,w19,sxtw 1]
-	uxth	w28, w28
-	b	.L1164
-.L1163:
-	sub	w20, w20, #1
-	uxth	w20, w20
-	b	.L1162
-.L1164:
-	adrp	x0, .LANCHOR0
+	strh	w20, [x24, 2256]
+.L1133:
+	add	x22, x22, :lo12:.LANCHOR0
 	add	w19, w19, 1
-	add	x1, x0, :lo12:.LANCHOR0
-	uxtb	w19, w19
-	ldrb	w1, [x1,3216]
-	cmp	w1, w28
-	csel	w27, w27, wzr, ne
-	b	.L1161
-.L1171:
-	mov	w0, w27
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 192
-	ret
+	and	w19, w19, 255
+	ldrb	w0, [x22, 3216]
+	cmp	w0, w27
+	csel	w26, w26, wzr, ne
+	b	.L1130
+.L1132:
+	sub	w20, w20, #1
+	and	w20, w20, 65535
+	b	.L1131
 	.size	FlashLoadFactorBbt, .-FlashLoadFactorBbt
 	.align	2
 	.global	FlashReadFacBbtData
 	.type	FlashReadFacBbtData, %function
 FlashReadFacBbtData:
 	stp	x29, x30, [sp, -144]!
-	adrp	x4, .LANCHOR2
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	mov	x22, x0
-	add	x0, x4, :lo12:.LANCHOR2
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
+	stp	x23, x24, [sp, 48]
 	mov	w23, w1
+	adrp	x1, .LANCHOR2
+	add	x1, x1, :lo12:.LANCHOR2
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
+	mov	x22, x0
+	stp	x25, x26, [sp, 64]
 	mov	w25, w2
-	ldrh	w1, [x0,1206]
-	mov	x21, x4
-	ldrh	w3, [x0,1204]
+	mov	x21, x1
 	mov	w26, 61664
-	ldr	x0, [x0,2224]
-	str	x0, [x29,104]
-	mul	w3, w3, w1
-	adrp	x1, .LANCHOR0
-	uxth	w3, w3
-	sub	w20, w3, #1
-	ldr	x1, [x1,#:lo12:.LANCHOR0]
-	mul	w24, w23, w3
-	str	x1, [x29,96]
-	uxth	w20, w20
-	sub	w19, w3, #16
-.L1173:
+	ldrh	w2, [x1, 1204]
+	ldrh	w0, [x1, 1206]
+	mul	w0, w0, w2
+	adrp	x2, .LANCHOR0+64
+	and	w0, w0, 65535
+	ldr	x2, [x2, #:lo12:.LANCHOR0+64]
+	sub	w20, w0, #1
+	str	x2, [x29, 96]
+	and	w20, w20, 65535
+	ldr	x2, [x1, 2224]
+	mul	w24, w0, w23
+	sub	w19, w0, #16
+	str	x2, [x29, 104]
+.L1142:
 	cmp	w20, w19
-	ble	.L1181
+	bgt	.L1145
+	mov	w0, -1
+	b	.L1141
+.L1145:
 	add	w0, w20, w24
-	mov	w1, 1
+	mov	w2, 1
 	lsl	w0, w0, 10
-	mov	w2, w1
-	str	w0, [x29,92]
+	mov	w1, w2
+	str	w0, [x29, 92]
 	add	x0, x29, 88
 	bl	FlashReadPages
-	ldr	w0, [x29,88]
+	ldr	w0, [x29, 88]
 	cmn	w0, #1
-	beq	.L1174
-	add	x0, x21, :lo12:.LANCHOR2
-	ldr	x0, [x0,2224]
+	beq	.L1143
+	ldr	x0, [x21, 2224]
 	ldrh	w0, [x0]
 	cmp	w0, w26
-	bne	.L1174
-	mov	w0, w22
-	cbz	x22, .L1175
-	mov	x0, x22
-	mov	w1, w23
+	bne	.L1143
+	cbz	x22, .L1146
 	mov	w2, w25
+	mov	w1, w23
+	mov	x0, x22
 	bl	FlashReadFacBbtData.part.6
-	b	.L1175
-.L1174:
-	sub	w20, w20, #1
-	uxth	w20, w20
-	b	.L1173
-.L1181:
-	mov	w0, -1
-.L1175:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
+.L1141:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
 	ldp	x29, x30, [sp], 144
 	ret
+.L1143:
+	sub	w20, w20, #1
+	and	w20, w20, 65535
+	b	.L1142
+.L1146:
+	mov	w0, 0
+	b	.L1141
 	.size	FlashReadFacBbtData, .-FlashReadFacBbtData
 	.align	2
 	.global	FlashGetBadBlockList
@@ -7197,264 +7063,262 @@ FlashReadFacBbtData:
 FlashGetBadBlockList:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	str	x21, [sp,32]
+	str	x21, [sp, 32]
 	mov	x21, x0
 	adrp	x0, .LANCHOR0+104
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR2
-	ldr	x0, [x0,#:lo12:.LANCHOR0+104]
-	ldrb	w2, [x0,13]
-	ldrh	w19, [x0,14]
-	add	x0, x20, :lo12:.LANCHOR2
-	mul	w19, w2, w19
-	ldr	x0, [x0,2216]
-	uxth	w19, w19
+	add	x20, x20, :lo12:.LANCHOR2
+	ldr	x0, [x0, #:lo12:.LANCHOR0+104]
+	ldrb	w2, [x0, 13]
+	ldrh	w19, [x0, 14]
+	ldr	x0, [x20, 2216]
+	mul	w19, w19, w2
+	and	w19, w19, 65535
 	add	w2, w19, 7
 	lsr	w2, w2, 3
 	bl	FlashReadFacBbtData
 	cmn	w0, #1
-	bne	.L1183
-.L1187:
-	mov	w1, 0
-	b	.L1184
-.L1183:
-	mov	w2, 0
-	lsr	w0, w19, 4
-	mov	w1, w2
-	sub	w19, w19, #1
-	mov	w5, 1
-.L1185:
-	cmp	w2, w19
-	bge	.L1184
-	add	x3, x20, :lo12:.LANCHOR2
-	ubfx	x4, x2, 5, 11
-	ldr	x6, [x3,2216]
-	lsl	w3, w5, w2
-	ldr	w4, [x6,x4,lsl 2]
-	tst	w3, w4
-	beq	.L1186
-	add	w3, w1, 1
-	ubfiz	x1, x1, 1, 16
-	strh	w2, [x21,x1]
-	uxth	w1, w3
-.L1186:
-	cmp	w1, w0
-	bcs	.L1187
-	add	w2, w2, 1
-	uxth	w2, w2
-	b	.L1185
-.L1184:
-	ubfiz	x1, x1, 1, 16
-	mov	w0, -1
-	ldp	x19, x20, [sp,16]
-	strh	w0, [x21,x1]
+	bne	.L1152
+.L1156:
+	mov	w0, 0
+.L1153:
+	ubfiz	x0, x0, 1, 16
+	mov	w1, -1
+	strh	w1, [x21, x0]
 	mov	w0, 0
-	ldr	x21, [sp,32]
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
+.L1152:
+	lsr	w4, w19, 4
+	sub	w19, w19, #1
+	mov	w1, 0
+	mov	w0, 0
+	mov	w5, 1
+.L1154:
+	cmp	w1, w19
+	bge	.L1153
+	ldr	x6, [x20, 2216]
+	ubfx	x3, x1, 5, 11
+	lsl	w2, w5, w1
+	ldr	w3, [x6, x3, lsl 2]
+	tst	w2, w3
+	beq	.L1155
+	add	w2, w0, 1
+	ubfiz	x0, x0, 1, 16
+	strh	w1, [x21, x0]
+	and	w0, w2, 65535
+.L1155:
+	cmp	w0, w4
+	bcs	.L1156
+	add	w1, w1, 1
+	and	w1, w1, 65535
+	b	.L1154
 	.size	FlashGetBadBlockList, .-FlashGetBadBlockList
 	.align	2
 	.global	FlashProgSlc2KPages
 	.type	FlashProgSlc2KPages, %function
 FlashProgSlc2KPages:
-	stp	x29, x30, [sp, -160]!
+	stp	x29, x30, [sp, -176]!
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	mov	w23, w1
-	adrp	x1, .LANCHOR1+481
-	stp	x21, x22, [sp,32]
-	adrp	x22, .LANCHOR0
-	str	x27, [sp,80]
-	stp	x25, x26, [sp,64]
-	add	x22, x22, :lo12:.LANCHOR0
-	ldrb	w26, [x1,#:lo12:.LANCHOR1+481]
-	stp	x19, x20, [sp,16]
+	stp	x23, x24, [sp, 48]
 	mov	w24, w2
-	mov	x19, x0
-	mov	x21, x0
-	mov	w25, 0
-	add	x27, x22, 3220
-.L1193:
-	cmp	w25, w23
-	beq	.L1219
+	adrp	x2, .LANCHOR1+481
+	stp	x21, x22, [sp, 32]
+	stp	x25, x26, [sp, 64]
+	and	w21, w1, 255
+	mov	w23, 56
+	ldrb	w26, [x2, #:lo12:.LANCHOR1+481]
+	stp	x27, x28, [sp, 80]
+	mov	w22, w21
+	adrp	x27, .LANCHOR0
+	add	x25, x27, :lo12:.LANCHOR0
+	stp	x19, x20, [sp, 16]
+	mov	x28, x0
+	umaddl	x23, w1, w23, x0
+	mov	x20, x0
+	add	x0, x25, 3072
+	str	x0, [x29, 104]
+.L1163:
+	cmp	x20, x23
+	bne	.L1169
+	adrp	x22, .LANCHOR2
+	add	x23, x22, :lo12:.LANCHOR2
+.L1170:
+	cmp	x28, x20
+	bne	.L1177
+	ldp	x19, x20, [sp, 16]
+	mov	w0, 0
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 176
+	ret
+.L1169:
 	mov	w1, w24
-	sub	w4, w23, w25
-	mov	x0, x21
-	add	x2, x29, 96
-	add	x3, x29, 100
+	mov	w4, w22
+	add	x3, x29, 116
+	add	x2, x29, 112
+	mov	x0, x20
 	bl	LogAddr2PhyAddr
-	ldr	w0, [x29,100]
-	ldrb	w1, [x22,3216]
-	cmp	w0, w1
-	bcc	.L1194
+	ldrb	w1, [x25, 3216]
+	ldr	w0, [x29, 116]
+	cmp	w1, w0
+	bhi	.L1164
 	mov	w0, -1
-	str	w0, [x21]
-	b	.L1195
-.L1194:
-	ldrb	w20, [x27,w0,uxtw]
-	mov	w0, w20
+	str	w0, [x20]
+.L1165:
+	sub	w22, w22, #1
+	add	x20, x20, 56
+	and	w22, w22, 255
+	b	.L1163
+.L1164:
+	ldr	x1, [x29, 104]
+	add	x0, x1, w0, uxtw
+	ldrb	w19, [x0, 148]
+	mov	w0, w19
 	bl	NandcWaitFlashReady
-	mov	w0, w20
+	mov	w0, w19
 	bl	NandcFlashCs
-	ldr	w1, [x29,96]
-	mov	w0, w20
+	ldr	w1, [x29, 112]
+	mov	w0, w19
 	bl	FlashProgFirstCmd
-	ldr	x3, [x21,8]
+	ldp	x3, x4, [x20, 8]
 	mov	w2, w26
-	ldr	x4, [x21,16]
 	mov	w1, 1
-	mov	w0, w20
+	mov	w0, w19
 	bl	NandcXferData
-	ldr	w1, [x29,96]
-	mov	w0, w20
+	ldr	w1, [x29, 112]
+	mov	w0, w19
 	bl	FlashProgSecondCmd
-	mov	w0, w20
+	mov	w0, w19
 	bl	NandcWaitFlashReady
-	ldr	w1, [x29,96]
-	mov	w0, w20
+	ldr	w1, [x29, 112]
+	mov	w0, w19
 	bl	FlashReadStatus
 	sbfx	x0, x0, 0, 1
-	str	w0, [x21]
-	mov	w0, w20
-	ldr	w1, [x29,96]
-	ldr	w2, [x22,92]
-	add	w1, w2, w1
+	str	w0, [x20]
+	ldr	w1, [x29, 112]
+	ldr	w0, [x25, 92]
+	add	w1, w1, w0
+	mov	w0, w19
 	bl	FlashProgFirstCmd
-	ldr	x0, [x21,8]
-	mov	w1, 1
+	ldr	x0, [x20, 8]
 	mov	w2, w26
-	cmp	x0, xzr
+	mov	w1, 1
+	cmp	x0, 0
 	add	x3, x0, 2048
-	ldr	x0, [x21,16]
+	ldr	x0, [x20, 16]
 	csel	x3, x3, xzr, ne
+	cmp	x0, 0
 	add	x4, x0, 8
-	cmp	x0, xzr
 	csel	x4, x4, xzr, ne
-	mov	w0, w20
+	mov	w0, w19
 	bl	NandcXferData
-	adrp	x0, .LANCHOR0
-	ldr	w1, [x29,96]
-	add	x0, x0, :lo12:.LANCHOR0
-	ldr	w2, [x0,92]
-	mov	w0, w20
-	add	w1, w2, w1
+	add	x0, x27, :lo12:.LANCHOR0
+	ldr	w1, [x29, 112]
+	ldr	w0, [x0, 92]
+	add	w1, w1, w0
+	mov	w0, w19
 	bl	FlashProgSecondCmd
-	mov	w0, w20
+	mov	w0, w19
 	bl	NandcWaitFlashReady
-	ldr	w1, [x29,96]
-	mov	w0, w20
+	ldr	w1, [x29, 112]
+	mov	w0, w19
 	bl	FlashReadStatus
-	tbz	x0, 0, .L1198
+	tbz	x0, 0, .L1168
 	mov	w0, -1
-	str	w0, [x21]
-.L1198:
-	mov	w0, w20
+	str	w0, [x20]
+.L1168:
+	mov	w0, w19
 	bl	NandcFlashDeCs
-.L1195:
-	add	w25, w25, 1
-	add	x21, x21, 56
-	b	.L1193
-.L1219:
-	adrp	x25, .LC25
-	adrp	x26, .LC24
-	adrp	x27, .LC23
-	mov	w21, 0
-	add	x25, x25, :lo12:.LC25
-	add	x26, x26, :lo12:.LC24
-	add	x27, x27, :lo12:.LC23
-.L1200:
-	cmp	w21, w23
-	beq	.L1220
-	ldr	w0, [x19]
+	b	.L1165
+.L1177:
+	ldr	w0, [x28]
 	cmn	w0, #1
-	bne	.L1201
+	bne	.L1171
+	ldr	w1, [x28, 4]
 	adrp	x0, .LC21
-	ldr	w1, [x19,4]
 	add	x0, x0, :lo12:.LC21
 	bl	printk
-	b	.L1202
-.L1201:
-	adrp	x20, .LANCHOR2
-	sub	w4, w23, w21
-	add	x22, x20, :lo12:.LANCHOR2
-	add	x3, x29, 100
+.L1172:
+	sub	w21, w21, #1
+	add	x28, x28, 56
+	and	w21, w21, 255
+	b	.L1170
+.L1171:
+	add	x19, x22, :lo12:.LANCHOR2
+	mov	w4, w21
+	add	x3, x29, 116
+	add	x2, x29, 112
 	mov	w1, w24
-	add	x2, x29, 96
-	mov	x0, x19
+	mov	x0, x28
 	bl	LogAddr2PhyAddr
-	ldr	x0, [x22,2232]
-	mov	x1, x19
+	ldr	x0, [x19, 2232]
 	mov	x2, 56
+	mov	x1, x28
 	str	wzr, [x0]
-	ldr	x0, [x22,2240]
+	ldr	x0, [x19, 2240]
 	str	wzr, [x0]
-	add	x0, x29, 104
+	add	x0, x29, 120
 	bl	memcpy
-	ldr	x0, [x22,2232]
-	mov	w1, 1
-	str	x0, [x29,112]
+	ldr	x0, [x19, 2232]
 	mov	w2, w24
-	ldr	x0, [x22,2240]
-	str	x0, [x29,120]
-	add	x0, x29, 104
+	str	x0, [x29, 128]
+	mov	w1, 1
+	ldr	x0, [x19, 2240]
+	str	x0, [x29, 136]
+	add	x0, x29, 120
 	bl	FlashReadPages
-	ldr	w22, [x29,104]
-	cmn	w22, #1
-	bne	.L1203
+	ldr	w19, [x29, 120]
+	cmn	w19, #1
+	bne	.L1173
+	ldr	w1, [x28, 4]
 	adrp	x0, .LC22
-	ldr	w1, [x19,4]
 	add	x0, x0, :lo12:.LC22
 	bl	printk
-	str	w22, [x19]
-.L1203:
-	ldr	w22, [x29,104]
-	cmp	w22, 256
-	bne	.L1204
-	ldr	w1, [x19,4]
-	mov	x0, x27
+	str	w19, [x28]
+.L1173:
+	ldr	w19, [x29, 120]
+	cmp	w19, 256
+	bne	.L1174
+	ldr	w1, [x28, 4]
+	adrp	x0, .LC23
+	add	x0, x0, :lo12:.LC23
 	bl	printk
-	str	w22, [x19]
-.L1204:
-	ldr	x0, [x19,16]
-	cbz	x0, .L1205
+	str	w19, [x28]
+.L1174:
+	ldr	x0, [x28, 16]
+	cbz	x0, .L1175
 	ldr	w2, [x0]
-	add	x0, x20, :lo12:.LANCHOR2
-	ldr	x0, [x0,2240]
+	ldr	x0, [x23, 2240]
 	ldr	w3, [x0]
 	cmp	w2, w3
-	beq	.L1205
-	ldr	w1, [x19,4]
-	mov	x0, x26
+	beq	.L1175
+	ldr	w1, [x28, 4]
+	adrp	x0, .LC24
+	add	x0, x0, :lo12:.LC24
 	bl	printk
 	mov	w0, -1
-	str	w0, [x19]
-.L1205:
-	ldr	x0, [x19,8]
-	cbz	x0, .L1202
-	add	x20, x20, :lo12:.LANCHOR2
+	str	w0, [x28]
+.L1175:
+	ldr	x0, [x28, 8]
+	cbz	x0, .L1172
 	ldr	w2, [x0]
-	ldr	x0, [x20,2232]
+	ldr	x0, [x23, 2232]
 	ldr	w3, [x0]
 	cmp	w2, w3
-	beq	.L1202
-	ldr	w1, [x19,4]
-	mov	x0, x25
+	beq	.L1172
+	ldr	w1, [x28, 4]
+	adrp	x0, .LC25
+	add	x0, x0, :lo12:.LC25
 	bl	printk
 	mov	w0, -1
-	str	w0, [x19]
-.L1202:
-	add	w21, w21, 1
-	add	x19, x19, 56
-	b	.L1200
-.L1220:
-	mov	w0, 0
-	ldr	x27, [sp,80]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 160
-	ret
+	str	w0, [x28]
+	b	.L1172
 	.size	FlashProgSlc2KPages, .-FlashProgSlc2KPages
 	.align	2
 	.global	FlashProgPages
@@ -7462,345 +7326,335 @@ FlashProgSlc2KPages:
 FlashProgPages:
 	stp	x29, x30, [sp, -192]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	adrp	x21, .LANCHOR0
-	mov	w22, 0
 	add	x4, x21, :lo12:.LANCHOR0
-	str	w3, [x29,116]
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
+	stp	x19, x20, [sp, 16]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldr	x5, [x4, 104]
+	ldrb	w4, [x4, 88]
+	ldrb	w5, [x5, 19]
+	stp	w3, w5, [x29, 116]
+	cbnz	w4, .L1191
 	mov	x19, x0
-	mov	w25, w1
-	ldr	x5, [x4,104]
-	mov	w23, w2
-	ldrb	w4, [x4,88]
-	ldrb	w5, [x5,19]
-	str	w5, [x29,120]
-	adrp	x5, .LANCHOR1+481
-	ldrb	w5, [x5,#:lo12:.LANCHOR1+481]
-	str	w5, [x29,124]
-	cbz	w4, .L1222
-	bl	FlashProgSlc2KPages
-	b	.L1223
-.L1222:
+	adrp	x0, .LANCHOR1+481
 	adrp	x28, .LANCHOR2
+	mov	w25, w1
+	ldrb	w0, [x0, #:lo12:.LANCHOR1+481]
 	add	x26, x28, :lo12:.LANCHOR2
+	mov	w23, w2
+	str	w0, [x29, 124]
+	mov	w22, 0
 	add	x0, x26, 1236
-	str	x0, [x29,104]
-.L1273:
+	str	x0, [x29, 104]
+.L1192:
 	cmp	w22, w25
-	bcs	.L1274
-	mov	w20, 56
-	mov	w1, w23
+	bcc	.L1205
+	add	x21, x21, :lo12:.LANCHOR0
+	adrp	x22, .LANCHOR2
+	add	x24, x21, 3260
+	add	x22, x22, :lo12:.LANCHOR2
+	mov	x20, 0
+	mov	x26, 24
+.L1206:
+	ldrb	w0, [x21, 3216]
+	cmp	w0, w20
+	bhi	.L1208
+	ldr	w0, [x29, 116]
+	cbnz	w0, .L1209
+.L1217:
+	mov	w0, 0
+	b	.L1190
+.L1191:
+	bl	FlashProgSlc2KPages
+.L1190:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 192
+	ret
+.L1205:
+	mov	w13, 56
 	add	x2, x29, 128
+	mov	w1, w23
 	sub	w4, w25, w22
-	umull	x20, w22, w20
+	umull	x13, w22, w13
 	add	x3, x29, 132
-	add	x27, x19, x20
+	add	x27, x19, x13
 	mov	x0, x27
 	bl	LogAddr2PhyAddr
 	mov	w24, w0
 	add	x1, x21, :lo12:.LANCHOR0
-	ldr	w0, [x29,132]
-	ldrb	w2, [x1,3216]
-	cmp	w0, w2
-	bcc	.L1224
+	ldr	w0, [x29, 132]
+	ldrb	w2, [x1, 3216]
+	cmp	w2, w0
+	bhi	.L1194
 	mov	w0, -1
-	str	w0, [x19,x20]
-	b	.L1225
-.L1224:
+	str	w0, [x19, x13]
+.L1195:
+	add	w22, w22, 1
+	b	.L1192
+.L1194:
 	add	x2, x28, :lo12:.LANCHOR2
-	add	x1, x1, 3260
 	mov	x3, 24
-	ldrb	w2, [x2,2094]
-	cmp	w2, wzr
-	uxtw	x2, w0
+	ldrb	w2, [x2, 2094]
+	cmp	w2, 0
+	add	x2, x1, 3260
+	uxtw	x1, w0
 	csel	w24, w24, wzr, ne
-	madd	x1, x2, x3, x1
-	ldr	x1, [x1,8]
-	cbz	x1, .L1227
+	madd	x1, x1, x3, x2
+	ldr	x1, [x1, 8]
+	cbz	x1, .L1197
 	bl	FlashWaitCmdDone
-.L1227:
+.L1197:
 	add	x0, x21, :lo12:.LANCHOR0
-	ldr	w2, [x29,132]
-	mov	x1, 24
-	add	x0, x0, 3260
-	madd	x0, x2, x1, x0
-	ldr	w1, [x29,128]
-	str	x27, [x0,8]
-	str	xzr, [x0,16]
-	str	w1, [x0,4]
-	cbz	w24, .L1228
-	add	w1, w22, 1
-	mov	w3, 56
-	umull	x1, w1, w3
-	add	x1, x19, x1
-	str	x1, [x0,16]
-.L1228:
-	add	x1, x21, :lo12:.LANCHOR0
-	add	x0, x1, 3220
-	ldrb	w20, [x0,x2]
+	ldr	w1, [x29, 132]
+	add	x2, x0, 3260
 	mov	x0, 24
-	madd	x2, x2, x0, x1
-	ldrb	w0, [x1,3216]
-	strb	w20, [x2,3260]
+	madd	x0, x1, x0, x2
+	ldr	w2, [x29, 128]
+	str	w2, [x0, 4]
+	stp	x27, xzr, [x0, 8]
+	cbz	w24, .L1198
+	add	w2, w22, 1
+	mov	w3, 56
+	umaddl	x2, w2, w3, x19
+	str	x2, [x0, 16]
+.L1198:
+	add	x4, x21, :lo12:.LANCHOR0
+	mov	x2, 24
+	add	x0, x4, x1
+	mul	x1, x1, x2
+	ldrb	w20, [x0, 3220]
+	add	x0, x4, 3260
+	strb	w20, [x0, x1]
+	ldrb	w0, [x4, 3216]
 	cmp	w0, 1
-	bne	.L1229
 	mov	w0, w20
+	bne	.L1199
 	bl	NandcWaitFlashReady
-	b	.L1230
-.L1229:
-	mov	w0, w20
-	str	x1, [x29,96]
-	bl	NandcFlashCs
-	ldr	x1, [x29,96]
-	ldr	w0, [x29,132]
-	add	x1, x1, 3228
-	ldr	w0, [x1,x0,lsl 2]
-	ldr	w1, [x29,128]
-	cmp	w0, wzr
-	mov	w0, w20
-	cset	w2, ne
-	bl	FlashWaitReadyEN
-	mov	w0, w20
-	bl	NandcFlashDeCs
-.L1230:
-	ldr	w0, [x29,120]
+.L1200:
+	ldr	w0, [x29, 120]
 	sub	w0, w0, #1
 	cmp	w0, 7
-	bhi	.L1231
+	bhi	.L1201
 	add	x0, x26, w20, sxtw
-	ldrb	w0, [x0,2088]
-	cbz	w0, .L1231
-	ldrb	w1, [x26,1233]
-	mov	w0, w20
-	ldr	x2, [x29,104]
+	ldrb	w0, [x0, 2088]
+	cbz	w0, .L1201
+	ldrb	w1, [x26, 1233]
 	mov	w3, 0
+	ldr	x2, [x29, 104]
+	mov	w0, w20
 	bl	HynixSetRRPara
-.L1231:
+.L1201:
 	mov	w0, w20
 	bl	NandcFlashCs
 	cmp	w23, 1
-	bne	.L1232
-	ldrb	w0, [x26,1220]
-	cbz	w0, .L1232
+	bne	.L1202
+	ldrb	w0, [x26, 1220]
+	cbz	w0, .L1202
 	mov	w0, w20
 	bl	flash_enter_slc_mode
-	b	.L1233
-.L1232:
-	mov	w0, w20
-	bl	flash_exit_slc_mode
-.L1233:
-	ldr	w1, [x29,128]
+.L1203:
+	ldr	w1, [x29, 128]
 	mov	w0, w20
 	bl	FlashProgFirstCmd
-	ldrb	w2, [x29,124]
-	mov	w0, w20
-	ldr	x3, [x27,8]
+	ldrb	w2, [x29, 124]
 	mov	w1, 1
-	ldr	x4, [x27,16]
+	ldp	x3, x4, [x27, 8]
+	mov	w0, w20
 	bl	NandcXferData
-	cbz	w24, .L1234
-	ldr	w1, [x29,128]
+	cbz	w24, .L1204
+	ldr	w1, [x29, 128]
 	mov	w0, w20
 	add	x27, x21, :lo12:.LANCHOR0
 	bl	FlashProgDpFirstCmd
-	ldr	w1, [x29,132]
+	ldr	w1, [x29, 132]
 	add	x0, x27, 3228
-	ldr	w0, [x0,x1,lsl 2]
-	ldr	w1, [x29,128]
-	cmp	w0, wzr
+	ldr	w0, [x0, x1, lsl 2]
+	ldr	w1, [x29, 128]
+	cmp	w0, 0
 	mov	w0, w20
 	cset	w2, ne
 	bl	FlashWaitReadyEN
-	ldr	w2, [x27,92]
+	ldr	w0, [x27, 92]
+	ldr	w1, [x29, 128]
+	add	w1, w1, w0
 	mov	w0, w20
-	ldr	w1, [x29,128]
-	add	w1, w2, w1
 	bl	FlashProgDpSecondCmd
 	add	w0, w22, 1
-	mov	w4, 56
-	ldrb	w2, [x29,124]
+	mov	w1, 56
+	ldrb	w2, [x29, 124]
+	nop // between mem op and mult-accumulate
+	umaddl	x0, w0, w1, x19
 	mov	w1, 1
-	umull	x4, w0, w4
+	ldp	x3, x4, [x0, 8]
 	mov	w0, w20
-	add	x4, x19, x4
-	ldr	x3, [x4,8]
-	ldr	x4, [x4,16]
 	bl	NandcXferData
-.L1234:
-	ldr	w1, [x29,128]
+.L1204:
+	ldr	w1, [x29, 128]
 	mov	w0, w20
 	add	w22, w22, w24
 	bl	FlashProgSecondCmd
 	mov	w0, w20
 	bl	NandcFlashDeCs
-.L1225:
-	add	w22, w22, 1
-	b	.L1273
-.L1274:
-	add	x21, x21, :lo12:.LANCHOR0
-	mov	x20, 0
-	adrp	x22, .LANCHOR2
-	add	x24, x21, 3260
-	mov	x26, 24
-.L1236:
-	ldrb	w0, [x21,3216]
-	cmp	w0, w20
-	bls	.L1275
+	b	.L1195
+.L1199:
+	bl	NandcFlashCs
+	add	x4, x4, 3228
+	ldp	w1, w0, [x29, 128]
+	ldr	w0, [x4, x0, lsl 2]
+	cmp	w0, 0
+	mov	w0, w20
+	cset	w2, ne
+	bl	FlashWaitReadyEN
+	mov	w0, w20
+	bl	NandcFlashDeCs
+	b	.L1200
+.L1202:
+	mov	w0, w20
+	bl	flash_exit_slc_mode
+	b	.L1203
+.L1208:
 	mov	w0, w20
 	bl	FlashWaitCmdDone
 	cmp	w23, 1
-	bne	.L1237
-	add	x0, x22, :lo12:.LANCHOR2
-	ldrb	w0, [x0,1220]
-	cbz	w0, .L1237
+	bne	.L1207
+	ldrb	w0, [x22, 1220]
+	cbz	w0, .L1207
 	mul	x0, x20, x26
-	ldrb	w0, [x0,x24]
+	ldrb	w0, [x0, x24]
 	bl	flash_exit_slc_mode
-.L1237:
+.L1207:
 	add	x20, x20, 1
-	b	.L1236
-.L1275:
-	ldr	w0, [x29,116]
-	cbnz	w0, .L1239
-.L1247:
-	mov	w0, 0
-	b	.L1223
-.L1239:
-	adrp	x24, .LC25
-	adrp	x26, .LC24
-	adrp	x27, .LC22
-	mov	w21, 0
-	add	x24, x24, :lo12:.LC25
-	add	x26, x26, :lo12:.LC24
-	add	x27, x27, :lo12:.LC22
-.L1240:
-	cmp	w21, w25
-	beq	.L1247
+	b	.L1206
+.L1209:
+	mov	w0, 56
+	and	w20, w25, 255
+	adrp	x22, .LANCHOR2
+	add	x24, x22, :lo12:.LANCHOR2
+	umaddl	x25, w25, w0, x19
+.L1210:
+	cmp	x25, x19
+	beq	.L1217
 	ldr	w0, [x19]
 	cmn	w0, #1
-	bne	.L1241
+	bne	.L1211
+	ldr	w1, [x19, 4]
 	adrp	x0, .LC21
-	ldr	w1, [x19,4]
 	add	x0, x0, :lo12:.LC21
 	bl	printk
-	b	.L1242
-.L1241:
-	adrp	x20, .LANCHOR2
-	sub	w4, w25, w21
-	add	x22, x20, :lo12:.LANCHOR2
+.L1212:
+	sub	w20, w20, #1
+	add	x19, x19, 56
+	and	w20, w20, 255
+	b	.L1210
+.L1211:
+	add	x21, x22, :lo12:.LANCHOR2
+	mov	w4, w20
 	add	x3, x29, 132
-	mov	w1, w23
 	add	x2, x29, 128
+	mov	w1, w23
 	mov	x0, x19
 	bl	LogAddr2PhyAddr
-	ldr	x0, [x22,2232]
-	mov	x1, x19
+	ldr	x0, [x21, 2232]
 	mov	x2, 56
+	mov	x1, x19
 	str	wzr, [x0]
-	ldr	x0, [x22,2240]
+	ldr	x0, [x21, 2240]
 	str	wzr, [x0]
 	add	x0, x29, 136
 	bl	memcpy
-	ldr	x0, [x22,2232]
-	mov	w1, 1
-	str	x0, [x29,144]
+	ldr	x0, [x21, 2232]
 	mov	w2, w23
-	ldr	x0, [x22,2240]
-	str	x0, [x29,152]
+	str	x0, [x29, 144]
+	mov	w1, 1
+	ldr	x0, [x21, 2240]
+	str	x0, [x29, 152]
 	add	x0, x29, 136
 	bl	FlashReadPages
-	ldr	w22, [x29,136]
-	cmn	w22, #1
-	bne	.L1243
-	ldr	w1, [x19,4]
-	mov	x0, x27
+	ldr	w21, [x29, 136]
+	cmn	w21, #1
+	bne	.L1213
+	ldr	w1, [x19, 4]
+	adrp	x0, .LC22
+	add	x0, x0, :lo12:.LC22
 	bl	printk
-	str	w22, [x19]
-.L1243:
-	ldr	x0, [x19,16]
-	cbz	x0, .L1244
+	str	w21, [x19]
+.L1213:
+	ldr	x0, [x19, 16]
+	cbz	x0, .L1214
 	ldr	w2, [x0]
-	add	x0, x20, :lo12:.LANCHOR2
-	ldr	x0, [x0,2240]
+	ldr	x0, [x24, 2240]
 	ldr	w3, [x0]
 	cmp	w2, w3
-	beq	.L1244
-	ldr	w1, [x19,4]
-	mov	x0, x26
+	beq	.L1214
+	ldr	w1, [x19, 4]
+	adrp	x0, .LC24
+	add	x0, x0, :lo12:.LC24
 	bl	printk
 	mov	w0, -1
 	str	w0, [x19]
-.L1244:
-	ldr	x0, [x19,8]
-	cbz	x0, .L1242
-	add	x20, x20, :lo12:.LANCHOR2
+.L1214:
+	ldr	x0, [x19, 8]
+	cbz	x0, .L1212
 	ldr	w2, [x0]
-	ldr	x0, [x20,2232]
+	ldr	x0, [x24, 2232]
 	ldr	w3, [x0]
 	cmp	w2, w3
-	beq	.L1242
-	ldr	w1, [x19,4]
-	mov	x0, x24
+	beq	.L1212
+	ldr	w1, [x19, 4]
+	adrp	x0, .LC25
+	add	x0, x0, :lo12:.LC25
 	bl	printk
 	mov	w0, -1
 	str	w0, [x19]
-.L1242:
-	add	w21, w21, 1
-	add	x19, x19, 56
-	b	.L1240
-.L1223:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 192
-	ret
+	b	.L1212
 	.size	FlashProgPages, .-FlashProgPages
 	.align	2
 	.type	FlashTestBlk.part.7, %function
 FlashTestBlk.part.7:
 	stp	x29, x30, [sp, -160]!
-	mov	w1, 165
 	mov	w2, 32
+	mov	w1, 165
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	uxth	w20, w0
 	add	x19, x19, :lo12:.LANCHOR2
+	and	w20, w0, 65535
 	lsl	w20, w20, 10
-	ldr	x0, [x19,2216]
-	str	x0, [x29,48]
+	ldr	x0, [x19, 2216]
+	str	x0, [x29, 48]
 	add	x0, x29, 96
-	str	x0, [x29,56]
+	str	x0, [x29, 56]
 	bl	ftl_memset
-	ldr	x0, [x19,2216]
-	mov	w1, 90
+	ldr	x0, [x19, 2216]
 	mov	w2, 8
+	mov	w1, 90
 	bl	ftl_memset
-	str	w20, [x29,44]
-	mov	w1, 1
+	str	w20, [x29, 44]
+	mov	w2, 1
 	add	x0, x29, 40
-	mov	w2, w1
+	mov	w1, w2
 	bl	FlashEraseBlocks
-	mov	w1, 1
+	mov	w3, 1
 	add	x0, x29, 40
-	mov	w3, w1
-	mov	w2, w1
+	mov	w2, w3
+	mov	w1, w3
 	bl	FlashProgPages
-	ldr	w0, [x29,40]
-	mov	w1, 0
+	ldr	w0, [x29, 40]
 	mov	w2, 1
-	cmp	w0, wzr
+	mov	w1, 0
+	cmp	w0, 0
 	add	x0, x29, 40
 	csetm	w19, ne
 	bl	FlashEraseBlocks
 	mov	w0, w19
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 160
 	ret
 	.size	FlashTestBlk.part.7, .-FlashTestBlk.part.7
@@ -7808,19 +7662,19 @@ FlashTestBlk.part.7:
 	.global	FlashTestBlk
 	.type	FlashTestBlk, %function
 FlashTestBlk:
-	uxth	w1, w0
-	adrp	x0, .LANCHOR0+8
+	adrp	x1, .LANCHOR0+72
+	and	w0, w0, 65535
+	ldr	w1, [x1, #:lo12:.LANCHOR0+72]
+	cmp	w0, w1
+	bcc	.L1247
 	stp	x29, x30, [sp, -16]!
 	add	x29, sp, 0
-	ldr	w2, [x0,#:lo12:.LANCHOR0+8]
-	mov	w0, 0
-	cmp	w1, w2
-	bcc	.L1278
-	mov	w0, w1
 	bl	FlashTestBlk.part.7
-.L1278:
 	ldp	x29, x30, [sp], 16
 	ret
+.L1247:
+	mov	w0, 0
+	ret
 	.size	FlashTestBlk, .-FlashTestBlk
 	.align	2
 	.global	FlashMakeFactorBbt
@@ -7828,326 +7682,330 @@ FlashTestBlk:
 FlashMakeFactorBbt:
 	stp	x29, x30, [sp, -240]!
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	adrp	x23, .LANCHOR2
-	add	x0, x23, :lo12:.LANCHOR2
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	adrp	x19, .LANCHOR0
-	mov	w20, 0
-	ldr	x1, [x0,2224]
-	ldrh	w22, [x0,1206]
-	str	x1, [x29,160]
-	ldrh	w1, [x0,1204]
-	add	x0, x19, :lo12:.LANCHOR0
-	add	x19, x19, :lo12:.LANCHOR0
-	mul	w22, w1, w22
-	ldr	x1, [x0,104]
-	uxth	w22, w22
-	ldrb	w1, [x1,24]
-	str	w1, [x29,128]
-	ldrh	w1, [x0,92]
-	str	w1, [x29,172]
-	ldrb	w0, [x0,88]
-	ubfiz	w1, w1, 1, 15
+	stp	x21, x22, [sp, 32]
+	adrp	x22, .LANCHOR2
+	add	x0, x22, :lo12:.LANCHOR2
+	stp	x19, x20, [sp, 16]
+	stp	x23, x24, [sp, 48]
+	add	x0, x0, 1192
+	stp	x25, x26, [sp, 64]
+	adrp	x20, .LANCHOR0
+	stp	x27, x28, [sp, 80]
+	mov	w19, 0
+	ldr	x1, [x0, 1032]
+	ldrh	w21, [x0, 14]
+	ldrh	w0, [x0, 12]
+	str	x1, [x29, 136]
+	mul	w21, w21, w0
+	add	x0, x20, :lo12:.LANCHOR0
+	and	w21, w21, 65535
+	ldr	x1, [x0, 104]
+	ldrh	w2, [x0, 92]
+	ldrb	w0, [x0, 88]
+	ldrb	w1, [x1, 24]
 	cmp	w0, 1
-	ldr	w0, [x29,172]
-	csel	w0, w1, w0, eq
-	str	w0, [x29,172]
-	adrp	x0, .LC26
+	str	w1, [x29, 112]
+	mov	x1, x2
+	ubfiz	w2, w2, 1, 15
+	csel	w0, w2, w1, eq
 	mov	w1, 1
+	str	w0, [x29, 168]
+	adrp	x0, .LC26
 	add	x0, x0, :lo12:.LC26
 	bl	printk
-	add	x0, x23, :lo12:.LANCHOR2
-	mov	w1, 0
+	add	x0, x22, :lo12:.LANCHOR2
 	mov	w2, 4096
-	ldr	x0, [x0,2224]
+	mov	w1, 0
+	ldr	x0, [x0, 2224]
 	bl	ftl_memset
-	lsr	w0, w22, 4
-	str	w0, [x29,168]
-	add	x0, x19, 3220
-	str	x0, [x29,112]
-	ldr	w0, [x29,128]
+	lsr	w0, w21, 4
+	str	w0, [x29, 132]
+	sub	w0, w21, #1
+	and	w0, w0, 65535
+	str	w0, [x29, 128]
+	adrp	x0, .LC29
+	add	x0, x0, :lo12:.LC29
+	str	x0, [x29, 104]
+.L1254:
+	add	x28, x20, :lo12:.LANCHOR0
+	ldrb	w0, [x28, 3216]
+	cmp	w0, w19
+	bhi	.L1281
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 240
+	ret
+.L1281:
+	add	x0, x22, :lo12:.LANCHOR2
+	sxtw	x24, w19
+	add	x1, x0, x24, lsl 1
+	ldrh	w1, [x1, 2256]
+	str	w1, [x29, 172]
+	cbnz	w1, .L1255
+	ldrh	w2, [x0, 1212]
+	mov	x26, x28
+	ldr	x0, [x28, 64]
+	mov	w23, 0
+	mov	w25, 0
+	lsl	w2, w2, 9
+	bl	ftl_memset
+	add	x0, x28, x24
+	add	x28, x28, 3228
+	ldrb	w27, [x0, 3220]
+	ldr	w0, [x29, 112]
 	and	w0, w0, 1
-	str	w0, [x29,108]
-	sub	w0, w22, #1
-	uxth	w0, w0
-	str	w0, [x29,124]
-.L1282:
-	ldrb	w0, [x19,3216]
-	cmp	w0, w20
-	bls	.L1332
-	add	x0, x23, :lo12:.LANCHOR2
-	sxtw	x25, w20
-	add	x1, x0, 2256
-	ldrh	w21, [x1,w20,sxtw 1]
-	cbnz	w21, .L1312
-	ldrh	w2, [x0,1212]
-	mov	w1, w21
-	ldr	x0, [x19]
-	mov	w26, w21
+	stp	w0, wzr, [x29, 160]
+.L1256:
+	ldrh	w0, [x29, 164]
+	str	w0, [x29, 144]
+	cmp	w0, w21
+	bcc	.L1267
+.L1266:
+	mov	w1, w19
+	mov	w2, w23
+	adrp	x0, .LC28
+	add	x0, x0, :lo12:.LC28
+	bl	printk
+	add	x3, x20, :lo12:.LANCHOR0
+	ldr	w1, [x29, 132]
+	ldrb	w0, [x3, 3216]
+	mul	w0, w0, w1
+	cmp	w23, w0
+	blt	.L1268
+	add	x0, x22, :lo12:.LANCHOR2
+	mov	w1, 0
+	ldrh	w2, [x0, 1212]
+	ldr	x0, [x3, 64]
 	lsl	w2, w2, 9
-	mov	w24, w21
-	add	x28, x19, 3228
 	bl	ftl_memset
-	ldr	x0, [x29,112]
-	ldrb	w27, [x0,x25]
-	ldr	w0, [x29,128]
-	and	w0, w0, 2
-	uxtb	w0, w0
-	str	w0, [x29,120]
-.L1284:
-	uxth	w0, w26
-	str	w0, [x29,144]
-	cmp	w0, w22
-	bcs	.L1294
+.L1268:
+	cbnz	w19, .L1270
+	add	x26, x20, :lo12:.LANCHOR0
+	mov	w23, 1
+	ldrh	w25, [x26, 72]
+.L1271:
+	ldrb	w0, [x26, 89]
+	cmp	w0, w25
+	bhi	.L1273
+	ldr	w27, [x29, 128]
+	sub	w26, w21, #50
+	add	x23, x20, :lo12:.LANCHOR0
+	mov	w25, 1
+.L1274:
+	cmp	w27, w26
+	bgt	.L1276
+	add	x0, x20, :lo12:.LANCHOR0
+	ldr	w2, [x0, 72]
+	ldrb	w1, [x0, 89]
+	sub	w1, w1, w2
+	ldr	w2, [x29, 172]
+	cmp	w2, w1
+	bcc	.L1270
+	add	x1, x22, :lo12:.LANCHOR2
+	ldr	x0, [x0, 64]
+	ldrh	w2, [x1, 1212]
+	mov	w1, 0
+	lsl	w2, w2, 9
+	bl	ftl_memset
+.L1270:
+	add	x28, x22, :lo12:.LANCHOR2
+	mul	w25, w19, w21
+	add	x0, x28, 2048
+	ldr	w26, [x29, 128]
+	adrp	x23, .LC30
+	add	x27, x20, :lo12:.LANCHOR0
+	add	x23, x23, :lo12:.LC30
+	add	x24, x0, x24, lsl 1
+.L1278:
+	mov	w1, w19
+	mov	w2, w26
+	mov	x0, x23
+	bl	printk
+	ldr	x1, [x27, 64]
+.L1279:
+	ubfx	x0, x26, 5, 11
+	ldr	w0, [x1, x0, lsl 2]
+	lsr	w0, w0, w26
+	tbnz	x0, 0, .L1280
+	ldr	x1, [x29, 136]
+	mov	w0, -3872
+	strh	w26, [x24, 208]
+	mov	w2, 1
+	strh	w0, [x1]
+	strh	w26, [x1, 2]
+	strh	wzr, [x1, 8]
+	mov	w1, w2
+	ldr	x0, [x27, 64]
+	str	x0, [x29, 192]
+	ldr	x0, [x28, 2224]
+	str	x0, [x29, 200]
+	add	w0, w26, w25
+	lsl	w0, w0, 10
+	str	w0, [x29, 188]
+	add	x0, x29, 184
+	bl	FlashEraseBlocks
+	mov	w3, 1
+	add	x0, x29, 184
+	mov	w2, w3
+	mov	w1, w3
+	bl	FlashProgPages
+	ldr	w0, [x29, 184]
+	cbz	w0, .L1255
+	sub	w26, w26, #1
+	and	w26, w26, 65535
+	b	.L1278
+.L1267:
 	mov	w0, -1
-	strb	w0, [x29,182]
-	strb	w0, [x29,183]
-	ldr	w0, [x29,108]
-	cbz	w0, .L1286
-	ldr	w3, [x28,x25,lsl 2]
+	strb	w0, [x29, 182]
+	strb	w0, [x29, 183]
+	ldr	w0, [x29, 160]
+	cbz	w0, .L1258
+	ldr	w4, [x28, x24, lsl 2]
 	mov	w0, w27
 	add	x2, x29, 182
-	add	w3, w21, w3
-	str	x3, [x29,96]
-	mov	w1, w3
+	add	w4, w25, w4
+	str	w4, [x29, 100]
+	mov	w1, w4
 	bl	FlashReadSpare
-	ldrb	w0, [x19,88]
-	ldr	x3, [x29,96]
+	ldrb	w0, [x26, 88]
+	ldr	w4, [x29, 100]
 	cmp	w0, 1
-	bne	.L1286
-	ldr	w1, [x19,92]
+	bne	.L1258
+	ldr	w1, [x26, 92]
 	mov	w0, w27
 	add	x2, x29, 183
-	add	w1, w3, w1
+	add	w1, w4, w1
 	bl	FlashReadSpare
-	ldrb	w0, [x29,182]
-	ldrb	w1, [x29,183]
-	and	w0, w1, w0
-	strb	w0, [x29,182]
-.L1286:
-	ldr	w0, [x29,120]
-	cbz	w0, .L1288
-	ldr	x0, [x19,104]
+	ldrb	w0, [x29, 182]
+	ldrb	w1, [x29, 183]
+	and	w0, w0, w1
+	strb	w0, [x29, 182]
+.L1258:
+	ldr	x0, [x29, 112]
+	tbz	x0, 1, .L1260
+	ldr	x0, [x26, 104]
 	add	x2, x29, 183
-	ldrh	w1, [x0,10]
-	ldr	w0, [x28,x25,lsl 2]
+	ldrh	w1, [x0, 10]
+	ldr	w0, [x28, x24, lsl 2]
 	sub	w1, w1, #1
+	add	w0, w25, w0
 	add	w1, w1, w0
 	mov	w0, w27
-	add	w1, w1, w21
 	bl	FlashReadSpare
-.L1288:
-	ldr	x0, [x19,104]
-	ldrb	w1, [x29,182]
-	ldrb	w2, [x0,7]
-	cmp	w2, 8
-	beq	.L1289
-	cmp	w2, 1
-	beq	.L1289
-	ldrb	w0, [x0,18]
-	cmp	w0, 12
-	bne	.L1290
-.L1289:
-	mov	w0, 1
-	cbz	w1, .L1291
-	ldrb	w0, [x29,183]
-	cmp	w0, wzr
+.L1260:
+	ldr	x1, [x26, 104]
+	ldrb	w0, [x1, 7]
+	cmp	w0, 1
+	ccmp	w0, 8, 4, ne
+	ldrb	w0, [x29, 182]
+	beq	.L1261
+	ldrb	w1, [x1, 18]
+	cmp	w1, 12
+	bne	.L1262
+.L1261:
+	cbz	w0, .L1283
+	ldrb	w0, [x29, 183]
+	cmp	w0, 0
 	cset	w0, eq
-	b	.L1291
-.L1290:
-	cmp	w1, 255
-	mov	w0, 1
-	bne	.L1291
-	ldrb	w0, [x29,183]
-	cmp	w0, 255
-	cset	w0, ne
-.L1291:
-	ldr	x1, [x29,128]
-	tbz	x1, 2, .L1292
-	ldr	w1, [x28,x25,lsl 2]
+.L1263:
+	ldr	x1, [x29, 112]
+	tbz	x1, 2, .L1264
+	ldr	w1, [x28, x24, lsl 2]
 	mov	w0, w27
-	add	w1, w21, w1
+	add	w1, w25, w1
 	bl	SandiskProgTestBadBlock
-.L1292:
-	cbz	w0, .L1293
+.L1264:
+	cbz	w0, .L1265
+	ldr	w2, [x29, 164]
+	mov	w1, w19
 	adrp	x0, .LC27
-	mov	w1, w20
-	mov	w2, w26
 	add	x0, x0, :lo12:.LC27
-	add	w24, w24, 1
+	add	w23, w23, 1
+	and	w23, w23, 65535
 	bl	printk
-	ldr	x0, [x29,144]
-	uxth	w24, w24
-	ldr	x2, [x19]
-	ubfx	x1, x0, 5, 11
-	ldrb	w3, [x29,144]
-	lsl	x1, x1, 2
+	ldr	x0, [x29, 144]
+	mov	w1, 1
+	ldr	x4, [x26, 64]
+	ldrb	w2, [x29, 144]
+	ubfx	x0, x0, 5, 11
+	lsl	x0, x0, 2
+	lsl	w2, w1, w2
+	ldr	w1, [x4, x0]
+	orr	w1, w1, w2
+	str	w1, [x4, x0]
+	ldr	w1, [x29, 132]
+	ldrb	w0, [x26, 3216]
+	mul	w0, w0, w1
+	cmp	w23, w0
+	bgt	.L1266
+.L1265:
+	ldr	w0, [x29, 164]
+	add	w0, w0, 1
+	str	w0, [x29, 164]
+	ldr	w0, [x29, 168]
+	add	w25, w25, w0
+	b	.L1256
+.L1262:
+	cmp	w0, 255
+	bne	.L1283
+	ldrb	w0, [x29, 183]
+	cmp	w0, 255
+	cset	w0, ne
+	b	.L1263
+.L1283:
 	mov	w0, 1
-	lsl	w0, w0, w3
-	ldr	w3, [x2,x1]
-	orr	w0, w3, w0
-	str	w0, [x2,x1]
-	ldr	w1, [x29,168]
-	ldrb	w0, [x19,3216]
-	mul	w0, w1, w0
-	cmp	w24, w0
-	bgt	.L1294
-.L1293:
-	ldr	w0, [x29,172]
-	add	w26, w26, 1
-	add	w21, w21, w0
-	b	.L1284
-.L1294:
-	adrp	x0, .LC28
-	mov	w1, w20
-	add	x0, x0, :lo12:.LC28
-	mov	w2, w24
+	b	.L1263
+.L1273:
+	mov	w0, w25
+	bl	FlashTestBlk
+	cbz	w0, .L1272
+	ldr	x0, [x29, 104]
+	mov	w1, w25
 	bl	printk
-	ldrb	w0, [x19,3216]
-	ldr	w1, [x29,168]
-	mul	w0, w1, w0
-	cmp	w24, w0
-	blt	.L1296
-	add	x0, x23, :lo12:.LANCHOR2
-	mov	w1, 0
-	ldrh	w2, [x0,1212]
-	ldr	x0, [x19]
-	lsl	w2, w2, 9
-	bl	ftl_memset
-.L1296:
-	cbnz	w20, .L1298
-	adrp	x26, .LC29
-	ldrh	w27, [x19,8]
-	mov	w21, w20
-	add	x26, x26, :lo12:.LC29
-	mov	w24, 1
-.L1299:
-	ldrb	w0, [x19,89]
-	cmp	w0, w27
-	bls	.L1333
+	ldr	x3, [x26, 64]
+	ubfx	x0, x25, 5, 11
+	lsl	x0, x0, 2
+	lsl	w1, w23, w25
+	ldr	w2, [x3, x0]
+	orr	w1, w2, w1
+	str	w1, [x3, x0]
+	ldr	w0, [x29, 172]
+	add	w0, w0, 1
+	and	w0, w0, 65535
+	str	w0, [x29, 172]
+.L1272:
+	add	w25, w25, 1
+	and	w25, w25, 65535
+	b	.L1271
+.L1276:
 	mov	w0, w27
 	bl	FlashTestBlk
-	cbz	w0, .L1300
+	cbz	w0, .L1275
+	ldr	x0, [x29, 104]
 	mov	w1, w27
-	mov	x0, x26
-	add	w21, w21, 1
 	bl	printk
-	ubfx	x1, x27, 5, 11
-	ldr	x2, [x19]
-	lsl	x1, x1, 2
-	lsl	w0, w24, w27
-	uxth	w21, w21
-	ldr	w3, [x2,x1]
-	orr	w0, w3, w0
-	str	w0, [x2,x1]
-.L1300:
-	add	w27, w27, 1
-	uxth	w27, w27
-	b	.L1299
-.L1333:
-	adrp	x26, .LC29
-	ldr	w28, [x29,124]
-	sub	w27, w22, #50
-	add	x26, x26, :lo12:.LC29
-	mov	w24, 1
-.L1302:
-	cmp	w28, w27
-	ble	.L1334
-	mov	w0, w28
-	bl	FlashTestBlk
-	cbz	w0, .L1303
-	mov	w1, w28
-	mov	x0, x26
-	bl	printk
-	ubfx	x1, x28, 5, 11
-	ldr	x2, [x19]
-	lsl	x1, x1, 2
-	lsl	w0, w24, w28
-	ldr	w3, [x2,x1]
-	orr	w0, w3, w0
-	str	w0, [x2,x1]
-.L1303:
-	sub	w28, w28, #1
-	uxth	w28, w28
-	b	.L1302
-.L1334:
-	ldrb	w0, [x19,89]
-	ldr	w1, [x19,8]
-	sub	w0, w0, w1
-	cmp	w21, w0
-	bcc	.L1298
-	add	x0, x23, :lo12:.LANCHOR2
-	mov	w1, 0
-	ldrh	w2, [x0,1212]
-	ldr	x0, [x19]
-	lsl	w2, w2, 9
-	bl	ftl_memset
-.L1298:
-	adrp	x24, .LC30
-	ldr	w27, [x29,124]
-	mul	w26, w20, w22
-	add	x24, x24, :lo12:.LC30
-	add	x28, x23, :lo12:.LANCHOR2
-	mov	w21, -3872
-.L1306:
-	mov	w2, w27
-	mov	x0, x24
-	mov	w1, w20
-	bl	printk
-	ldr	x2, [x19]
-.L1307:
+	ldr	x3, [x23, 64]
 	ubfx	x0, x27, 5, 11
-	ldr	w0, [x2,x0,lsl 2]
-	lsr	w0, w0, w27
-	and	w1, w0, 1
-	tbz	x0, 0, .L1335
-	sub	w27, w27, #1
-	uxth	w27, w27
-	b	.L1307
-.L1335:
-	add	x0, x28, 2256
-	strh	w27, [x0,x25,lsl 1]
-	ldr	x0, [x29,160]
-	strh	w21, [x0]
-	strh	w27, [x0,2]
-	strh	w1, [x0,8]
-	mov	w1, 1
-	ldr	x0, [x19]
-	mov	w2, w1
-	str	x0, [x29,192]
-	ldr	x0, [x28,2224]
-	str	x0, [x29,200]
-	add	w0, w27, w26
-	lsl	w0, w0, 10
-	str	w0, [x29,188]
-	add	x0, x29, 184
-	bl	FlashEraseBlocks
-	mov	w1, 1
-	add	x0, x29, 184
-	mov	w2, w1
-	mov	w3, w1
-	bl	FlashProgPages
-	ldr	w0, [x29,184]
-	cbz	w0, .L1312
+	lsl	x0, x0, 2
+	lsl	w1, w25, w27
+	ldr	w2, [x3, x0]
+	orr	w1, w2, w1
+	str	w1, [x3, x0]
+.L1275:
 	sub	w27, w27, #1
-	uxth	w27, w27
-	b	.L1306
-.L1312:
-	add	w20, w20, 1
-	uxtb	w20, w20
-	b	.L1282
-.L1332:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 240
-	ret
+	and	w27, w27, 65535
+	b	.L1274
+.L1280:
+	sub	w26, w26, #1
+	and	w26, w26, 65535
+	b	.L1279
+.L1255:
+	add	w19, w19, 1
+	and	w19, w19, 255
+	b	.L1254
 	.size	FlashMakeFactorBbt, .-FlashMakeFactorBbt
 	.align	2
 	.global	Ftl_log2
@@ -8155,16 +8013,16 @@ FlashMakeFactorBbt:
 Ftl_log2:
 	mov	w2, 1
 	mov	w1, 0
-.L1337:
+.L1304:
 	cmp	w2, w0
-	bhi	.L1339
-	add	w1, w1, 1
-	lsl	w2, w2, 1
-	uxth	w1, w1
-	b	.L1337
-.L1339:
+	bls	.L1305
 	sub	w0, w1, #1
 	ret
+.L1305:
+	add	w1, w1, 1
+	lsl	w2, w2, 1
+	and	w1, w1, 65535
+	b	.L1304
 	.size	Ftl_log2, .-Ftl_log2
 	.align	2
 	.global	FtlPrintInfo
@@ -8176,246 +8034,242 @@ FtlPrintInfo:
 	.global	FtlSysBlkNumInit
 	.type	FtlSysBlkNumInit, %function
 FtlSysBlkNumInit:
-	uxth	w0, w0
+	and	w0, w0, 65535
 	mov	w1, 24
-	cmp	w0, 23
-	csel	w0, w0, w1, hi
+	cmp	w0, 24
+	csel	w0, w0, w1, cs
 	adrp	x1, .LANCHOR2
 	add	x1, x1, :lo12:.LANCHOR2
-	ldrh	w2, [x1,2276]
-	ldrh	w3, [x1,2286]
-	str	w0, [x1,2272]
-	mul	w2, w0, w2
+	and	w0, w0, 65535
+	ldrh	w2, [x1, 2276]
+	ldrh	w3, [x1, 2286]
+	str	w0, [x1, 2272]
+	mul	w2, w2, w0
 	sub	w0, w3, w0
-	strh	w0, [x1,2284]
-	ldr	w0, [x1,2292]
-	str	w2, [x1,2280]
+	strh	w0, [x1, 2284]
+	ldr	w0, [x1, 2292]
+	str	w2, [x1, 2280]
 	sub	w2, w0, w2
 	mov	w0, 0
-	str	w2, [x1,2288]
+	str	w2, [x1, 2288]
 	ret
 	.size	FtlSysBlkNumInit, .-FtlSysBlkNumInit
 	.align	2
 	.global	FtlConstantsInit
 	.type	FtlConstantsInit, %function
 FtlConstantsInit:
-	stp	x29, x30, [sp, -96]!
-	mov	x3, 0
+	mov	x7, x0
+	stp	x29, x30, [sp, -16]!
+	adrp	x5, .LANCHOR2
+	add	x1, x5, :lo12:.LANCHOR2
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	adrp	x20, .LANCHOR2
-	mov	x23, x0
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	str	x27, [sp,80]
-	add	x1, x20, :lo12:.LANCHOR2
-	ldrh	w4, [x23,14]
-	ldrh	w6, [x0,8]
-	ldrh	w2, [x0,10]
-	ldrh	w0, [x0,12]
-	strh	w6, [x1,2296]
-	strh	w2, [x1,2298]
-	strh	w0, [x1,2300]
-	strh	w4, [x1,2286]
-.L1344:
-	add	x5, x1, 2304
-	strb	w3, [x3,x5]
+	ldrh	w9, [x0, 8]
+	add	x1, x1, 2304
+	ldrh	w2, [x0, 10]
+	mov	x3, 0
+	ldrh	w0, [x0, 12]
+	ldrh	w4, [x7, 14]
+	strh	w9, [x1, -8]
+	strh	w2, [x1, -6]
+	strh	w0, [x1, -4]
+	strh	w4, [x1, -18]
+.L1309:
+	strb	w3, [x3, x1]
 	add	x3, x3, 1
 	cmp	x3, 32
-	bne	.L1344
-	ldrh	w3, [x23,20]
-	ldrb	w1, [x23,15]
+	bne	.L1309
+	ldrh	w3, [x7, 20]
+	ldrb	w1, [x7, 15]
 	cmp	w3, w1
-	bcs	.L1345
-	uxtb	w8, w0
+	bcs	.L1310
+	and	w11, w0, 255
+	add	x8, x5, :lo12:.LANCHOR2
+	mul	w13, w0, w2
+	ubfiz	w12, w11, 1, 7
+	add	x8, x8, 2304
 	mov	w3, 0
-	mul	w11, w0, w2
-	ubfiz	w10, w8, 1, 7
-	add	x12, x20, :lo12:.LANCHOR2
-.L1346:
+.L1311:
 	cmp	w3, w0
-	bcs	.L1348
-	uxtb	w1, w3
-	mov	w5, w3
-	mov	w7, 0
-.L1349:
-	cmp	w7, w2
-	bcs	.L1371
-	add	x9, x12, 2304
-	add	w13, w5, w11
-	add	w14, w1, w8
-	add	w7, w7, 1
-	strb	w1, [x9,w5,uxtw]
-	add	w1, w1, w10
-	strb	w14, [x9,x13]
-	add	w5, w5, w0
-	uxtb	w1, w1
-	b	.L1349
-.L1371:
+	bcs	.L1313
+	and	w1, w3, 255
+	mov	w6, w3
+	mov	w10, 0
+	b	.L1314
+.L1312:
+	add	w14, w13, w6
+	strb	w1, [x8, w6, uxtw]
+	add	w15, w11, w1
+	add	w1, w12, w1
+	add	w10, w10, 1
+	and	w1, w1, 255
+	add	w6, w6, w0
+	strb	w15, [x8, x14]
+.L1314:
+	cmp	w10, w2
+	bcc	.L1312
 	add	w3, w3, 1
-	b	.L1346
-.L1348:
-	add	x1, x20, :lo12:.LANCHOR2
-	lsl	w2, w2, 1
+	b	.L1311
+.L1313:
+	add	x1, x5, :lo12:.LANCHOR2
+	ubfiz	w2, w2, 1, 15
 	lsr	w4, w4, 1
-	strh	w2, [x1,2298]
-	strh	w4, [x1,2286]
-.L1345:
-	add	x1, x20, :lo12:.LANCHOR2
+	strh	w2, [x1, 2298]
+	strh	w4, [x1, 2286]
+.L1310:
+	add	x1, x5, :lo12:.LANCHOR2
 	mov	w2, 5
-	cmp	w6, 1
-	strh	w2, [x1,2336]
-	strh	wzr, [x1,2338]
-	bne	.L1350
-	strh	w6, [x1,2336]
-.L1350:
-	add	x1, x20, :lo12:.LANCHOR2
+	cmp	w9, 1
+	strh	w2, [x1, 2336]
+	strh	wzr, [x1, 2338]
+	bne	.L1315
+	strh	w9, [x1, 2336]
+.L1315:
+	add	x1, x5, :lo12:.LANCHOR2
 	mov	w2, 4352
-	strh	w2, [x1,2340]
+	strh	w2, [x1, 2340]
 	adrp	x2, .LANCHOR0+88
-	ldrb	w26, [x2,#:lo12:.LANCHOR0+88]
-	cbz	w26, .L1351
+	ldrb	w11, [x2, #:lo12:.LANCHOR0+88]
+	cbz	w11, .L1316
 	mov	w2, 384
-	strh	w2, [x1,2340]
-.L1351:
-	add	x21, x20, :lo12:.LANCHOR2
-	ldrh	w25, [x23,16]
-	ldrh	w24, [x23,20]
-	ldrh	w27, [x23,18]
-	ldrh	w22, [x21,2298]
-	ldrh	w19, [x21,2286]
-	strh	w25, [x21,2344]
-	mul	w22, w0, w22
-	mul	w0, w19, w0
-	strh	w0, [x21,2342]
-	uxth	w22, w22
-	strh	w27, [x21,2346]
-	strh	w22, [x21,2276]
-	mul	w0, w22, w25
-	strh	w0, [x21,2348]
-	mov	w0, w24
-	strh	w24, [x21,2350]
+	strh	w2, [x1, 2340]
+.L1316:
+	add	x4, x5, :lo12:.LANCHOR2
+	ldrh	w10, [x7, 16]
+	ldrh	w8, [x7, 20]
+	ldrh	w9, [x7, 18]
+	ldrh	w6, [x4, 2298]
+	ldrh	w3, [x4, 2286]
+	strh	w10, [x4, 2344]
+	strh	w9, [x4, 2346]
+	mul	w6, w0, w6
+	strh	w8, [x4, 2350]
+	mul	w0, w0, w3
+	and	w6, w6, 65535
+	strh	w0, [x4, 2342]
+	strh	w6, [x4, 2276]
+	mul	w0, w6, w10
+	strh	w0, [x4, 2348]
+	mov	w0, w8
 	bl	Ftl_log2
-	uxth	w3, w0
-	lsl	w2, w24, 9
-	strh	w0, [x21,2352]
-	ldrh	w0, [x23,26]
-	cmp	w19, 1024
-	strh	w2, [x21,2354]
-	ubfx	x2, x2, 9, 7
-	strh	w0, [x21,2358]
-	lsl	w2, w2, 1
-	mul	w0, w22, w19
-	strh	w2, [x21,2356]
-	str	w0, [x21,2292]
-	bls	.L1352
-	and	w0, w19, 255
-	strh	w0, [x21,2338]
-.L1352:
-	add	x2, x20, :lo12:.LANCHOR2
-	mul	w0, w24, w27
-	ldrh	w1, [x2,2338]
-	sub	w1, w19, w1
-	mul	w1, w22, w1
-	mul	w1, w1, w24
-	mul	w1, w1, w25
-	asr	w1, w1, 11
-	str	w1, [x2,2360]
-	ldrh	w1, [x2,2340]
-	lsl	w1, w1, 3
-	sdiv	w0, w1, w0
-	uxth	w0, w0
+	and	w2, w0, 65535
+	strh	w0, [x4, 2352]
+	ubfiz	w0, w8, 9, 7
+	strh	w0, [x4, 2354]
+	ubfx	w0, w0, 8, 8
+	strh	w0, [x4, 2356]
+	cmp	w3, 1024
+	ldrh	w0, [x7, 26]
+	strh	w0, [x4, 2358]
+	mul	w0, w6, w3
+	str	w0, [x4, 2292]
+	bls	.L1317
+	and	w0, w3, 255
+	strh	w0, [x4, 2338]
+.L1317:
+	add	x1, x5, :lo12:.LANCHOR2
+	ldrh	w0, [x1, 2338]
+	sub	w0, w3, w0
+	mul	w0, w0, w6
+	mul	w0, w0, w8
+	mul	w8, w9, w8
+	mul	w0, w0, w10
+	asr	w0, w0, 11
+	str	w0, [x1, 2360]
+	ldrh	w0, [x1, 2340]
+	lsl	w0, w0, 3
+	sdiv	w0, w0, w8
+	and	w0, w0, 65535
 	cmp	w0, 4
-	bhi	.L1368
-	mov	w0, 4
-.L1368:
-	strh	w0, [x2,2364]
-	cbz	w26, .L1355
-	add	x0, x20, :lo12:.LANCHOR2
+	bls	.L1318
+.L1334:
+	strh	w0, [x1, 2364]
+	cbz	w11, .L1320
+	add	x0, x5, :lo12:.LANCHOR2
 	mov	w1, 640
-	strh	w1, [x0,2340]
-.L1355:
-	add	x1, x20, :lo12:.LANCHOR2
-	lsl	w19, w19, 6
-	cmp	w22, 1
-	ldrh	w0, [x1,2340]
-	asr	w0, w0, w3
-	add	w3, w3, 9
-	asr	w19, w19, w3
-	strh	w19, [x1,2368]
-	and	w19, w19, 65535
+	strh	w1, [x0, 2340]
+.L1320:
+	add	x1, x5, :lo12:.LANCHOR2
+	lsl	w3, w3, 6
+	cmp	w6, 1
+	ldrh	w0, [x1, 2340]
+	asr	w0, w0, w2
+	add	w2, w2, 9
 	add	w0, w0, 2
-	strh	w0, [x1,2366]
-	mul	w0, w19, w22
-	str	w0, [x1,2372]
-	add	w19, w19, 8
-	ldrh	w0, [x1,2364]
-	udiv	w0, w0, w22
-	add	w19, w19, w0
-	bne	.L1369
-	add	w19, w19, 4
-.L1369:
-	str	w19, [x1,2272]
-	add	x19, x20, :lo12:.LANCHOR2
-	ldrh	w0, [x19,2272]
+	strh	w0, [x1, 2366]
+	asr	w3, w3, w2
+	strh	w3, [x1, 2368]
+	and	w3, w3, 65535
+	mul	w0, w6, w3
+	add	w3, w3, 8
+	str	w0, [x1, 2372]
+	ldrh	w0, [x1, 2364]
+	udiv	w0, w0, w6
+	add	w3, w0, w3
+	beq	.L1321
+.L1335:
+	add	x4, x5, :lo12:.LANCHOR2
+	str	w3, [x1, 2272]
+	ldrh	w0, [x4, 2272]
 	bl	FtlSysBlkNumInit
-	str	wzr, [x19,1224]
-	ldr	w0, [x19,2272]
-	str	w0, [x19,2376]
-	ldr	w0, [x19,2288]
-	ldrh	w1, [x19,2344]
+	ldr	w0, [x4, 2272]
+	str	w0, [x4, 2376]
+	ldr	w0, [x4, 2288]
+	ldrh	w1, [x4, 2344]
+	ldrh	w3, [x4, 2350]
 	lsl	w0, w0, 2
-	ldrh	w3, [x19,2350]
-	ldrh	w2, [x19,2364]
-	mul	w1, w0, w1
-	ldrh	w0, [x19,2352]
-	ldrb	w5, [x19,1220]
-	add	w0, w0, 9
-	lsr	w0, w1, w0
+	ldrh	w2, [x4, 2364]
+	ldrb	w7, [x4, 1220]
+	str	wzr, [x4, 1224]
+	mul	w0, w0, w1
+	ldrh	w1, [x4, 2352]
+	add	w1, w1, 9
+	lsr	w0, w0, w1
 	mov	w1, 2048
 	add	w0, w0, 2
 	sdiv	w1, w1, w3
-	strh	w1, [x19,2382]
-	uxth	w0, w0
-	strh	w0, [x19,2380]
+	and	w0, w0, 65535
+	strh	w0, [x4, 2380]
+	strh	w1, [x4, 2382]
 	add	w1, w2, 3
-	strh	w1, [x19,2364]
-	ldr	w1, [x19,2372]
-	add	w4, w1, 3
-	str	w4, [x19,2372]
-	cbz	w5, .L1358
-	add	w2, w2, 4
+	strh	w1, [x4, 2364]
+	ldr	w1, [x4, 2372]
+	add	w6, w1, 3
+	str	w6, [x4, 2372]
+	cbz	w7, .L1323
 	add	w1, w1, 5
-	strh	w2, [x19,2364]
-	b	.L1370
-.L1358:
-	cmp	w4, 7
-	bhi	.L1359
-	mov	w1, 8
-.L1370:
-	str	w1, [x19,2372]
-.L1359:
-	add	x20, x20, :lo12:.LANCHOR2
-	ldrh	w1, [x20,2284]
-	strh	wzr, [x20,2384]
-	lsr	w2, w1, 3
-	add	w1, w2, w1, lsl 1
-	add	w1, w1, 52
-	add	w0, w1, w0, lsl 2
+	add	w2, w2, 4
+	strh	w2, [x4, 2364]
+.L1336:
+	str	w1, [x4, 2372]
+.L1324:
+	add	x5, x5, :lo12:.LANCHOR2
+	ldrh	w1, [x5, 2284]
+	strh	wzr, [x5, 2384]
+	lsl	w2, w1, 1
+	lsr	w1, w1, 3
+	add	w2, w2, 48
+	add	w1, w1, 4
+	add	w0, w2, w0, lsl 2
+	add	w0, w0, w1
 	cmp	w0, w3, lsl 9
-	bcs	.L1360
+	bcs	.L1325
 	mov	w0, 1
-	strh	w0, [x20,2384]
-.L1360:
+	strh	w0, [x5, 2384]
+.L1325:
 	mov	w0, 0
-	ldr	x27, [sp,80]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 96
+	ldp	x29, x30, [sp], 16
 	ret
+.L1318:
+	mov	w0, 4
+	b	.L1334
+.L1321:
+	add	w3, w3, 4
+	b	.L1335
+.L1323:
+	cmp	w6, 7
+	bhi	.L1324
+	mov	w1, 8
+	b	.L1336
 	.size	FtlConstantsInit, .-FtlConstantsInit
 	.align	2
 	.global	FtlMemInit
@@ -8423,373 +8277,372 @@ FtlConstantsInit:
 FtlMemInit:
 	stp	x29, x30, [sp, -64]!
 	mov	w1, 65535
+	mov	w2, 1024
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR2
-	str	x23, [sp,48]
 	add	x0, x20, :lo12:.LANCHOR2
-	stp	x21, x22, [sp,32]
-	str	w1, [x0,2456]
+	stp	x21, x22, [sp, 32]
+	add	x3, x0, 2304
+	str	x23, [sp, 48]
+	add	x4, x0, 2304
+	add	x5, x0, 2304
+	strh	wzr, [x0, 2386]
+	add	x6, x0, 2304
+	stp	wzr, wzr, [x3, 84]
+	add	x7, x0, 2304
+	stp	wzr, wzr, [x3, 92]
+	stp	wzr, wzr, [x4, 100]
+	stp	wzr, wzr, [x4, 108]
+	stp	wzr, wzr, [x5, 116]
+	stp	wzr, wzr, [x5, 124]
+	stp	wzr, wzr, [x6, 132]
+	stp	wzr, wzr, [x6, 140]
+	stp	wzr, w1, [x7, 148]
 	mov	w1, -1
-	strh	wzr, [x0,2386]
-	strh	w1, [x0,2472]
-	strh	w1, [x0,2474]
-	strh	w1, [x0,2476]
-	str	wzr, [x0,2388]
-	str	wzr, [x0,2392]
-	str	wzr, [x0,2396]
-	str	wzr, [x0,2400]
-	str	wzr, [x0,2404]
-	str	wzr, [x0,2408]
-	str	wzr, [x0,2412]
-	str	wzr, [x0,2416]
-	str	wzr, [x0,2420]
-	str	wzr, [x0,2424]
-	str	wzr, [x0,2428]
-	str	wzr, [x0,2432]
-	str	wzr, [x0,2436]
-	str	wzr, [x0,2440]
-	str	wzr, [x0,2444]
-	str	wzr, [x0,2448]
-	str	wzr, [x0,2452]
-	str	wzr, [x0,2460]
-	str	wzr, [x0,2464]
-	str	wzr, [x0,2468]
-	strh	w1, [x0,2478]
+	stp	wzr, wzr, [x7, 156]
+	strh	w1, [x0, 2472]
+	strh	w1, [x0, 2474]
+	str	wzr, [x0, 2468]
+	strh	w1, [x0, 2476]
+	strh	w1, [x0, 2478]
 	mov	w1, 32
-	ldrh	w2, [x0,2350]
-	strh	w1, [x0,2480]
+	strh	w1, [x0, 2480]
 	mov	w1, 128
-	strh	w1, [x0,2482]
-	mov	w1, 1024
-	strh	wzr, [x0,2484]
-	sdiv	w2, w1, w2
-	ldrh	w1, [x0,2276]
-	strh	wzr, [x0,2486]
+	strh	w1, [x0, 2482]
+	ldrh	w1, [x0, 2350]
+	strh	wzr, [x0, 2484]
+	strh	wzr, [x0, 2486]
+	strh	wzr, [x0, 2488]
+	sdiv	w2, w2, w1
+	ldrh	w1, [x0, 2276]
+	strh	wzr, [x0, 2490]
 	lsl	w1, w1, 2
-	strh	wzr, [x0,2488]
-	strh	wzr, [x0,2490]
+	str	w2, [x0, 2492]
 	cmp	w2, w1
-	str	w2, [x0,2492]
-	bls	.L1373
-	str	w1, [x0,2492]
-.L1373:
+	bls	.L1338
+	str	w1, [x0, 2492]
+.L1338:
 	add	x19, x20, :lo12:.LANCHOR2
 	mov	w22, 56
-	ldrh	w0, [x19,2348]
-	str	wzr, [x19,2496]
+	ldrh	w0, [x19, 2348]
+	str	wzr, [x19, 2496]
 	lsl	w0, w0, 1
 	bl	ftl_malloc
-	str	x0, [x19,2504]
-	ldrh	w1, [x19,2348]
+	ldrh	w1, [x19, 2348]
+	str	x0, [x19, 2504]
 	mov	w0, 12
 	mul	w0, w1, w0
 	bl	ftl_malloc
-	ldrh	w21, [x19,2276]
-	str	x0, [x19,2512]
+	ldrh	w21, [x19, 2276]
+	str	x0, [x19, 2512]
 	mul	w21, w21, w22
 	lsl	w23, w21, 3
 	mov	w0, w23
 	bl	ftl_malloc
-	str	x0, [x19,2520]
+	str	x0, [x19, 2520]
 	mov	w0, w21
 	bl	ftl_malloc
-	str	x0, [x19,2528]
+	str	x0, [x19, 2528]
 	mov	w0, w23
 	bl	ftl_malloc
-	str	x0, [x19,2536]
+	str	x0, [x19, 2536]
 	mov	w0, w21
 	bl	ftl_malloc
-	str	x0, [x19,2544]
+	str	x0, [x19, 2544]
 	mov	w0, w21
 	bl	ftl_malloc
-	str	x0, [x19,2552]
-	ldr	w0, [x19,2492]
+	str	x0, [x19, 2552]
+	ldr	w0, [x19, 2492]
 	mul	w0, w0, w22
 	bl	ftl_malloc
-	str	x0, [x19,2560]
-	ldrh	w0, [x19,2276]
-	ldrh	w21, [x19,2354]
+	str	x0, [x19, 2560]
+	ldrh	w0, [x19, 2276]
+	ldrh	w21, [x19, 2354]
 	lsl	w0, w0, 1
 	add	w0, w0, 1
-	str	w0, [x19,2568]
+	str	w0, [x19, 2568]
 	mov	w0, w21
 	bl	ftl_malloc
-	str	x0, [x19,2576]
+	str	x0, [x19, 2576]
 	mov	w0, w21
 	bl	ftl_malloc
-	str	x0, [x19,2584]
+	str	x0, [x19, 2584]
 	mov	w0, w21
 	bl	ftl_malloc
-	str	x0, [x19,2592]
-	ldr	w0, [x19,2568]
+	str	x0, [x19, 2592]
+	ldr	w0, [x19, 2568]
 	mul	w0, w21, w0
 	bl	ftl_malloc
-	str	x0, [x19,2600]
-	ldr	w0, [x19,2492]
+	str	x0, [x19, 2600]
+	ldr	w0, [x19, 2492]
 	mul	w0, w21, w0
 	bl	ftl_malloc
-	str	x0, [x19,2608]
+	str	x0, [x19, 2608]
 	mov	w0, w21
 	bl	ftl_malloc
-	str	x0, [x19,2616]
+	str	x0, [x19, 2616]
 	mov	w0, w21
 	bl	ftl_malloc
-	str	x0, [x19,2624]
-	ldr	w1, [x19,2568]
+	str	x0, [x19, 2624]
+	ldr	w1, [x19, 2568]
 	mov	w0, 24
 	mul	w0, w1, w0
 	bl	ftl_malloc
-	ldrh	w21, [x19,2276]
-	str	x0, [x19,2632]
-	ldrh	w0, [x19,2356]
-	mul	w21, w0, w21
+	ldrh	w21, [x19, 2356]
+	str	x0, [x19, 2632]
+	ldrh	w0, [x19, 2276]
+	mul	w21, w21, w0
 	mov	w0, w21
 	bl	ftl_malloc
-	str	x0, [x19,2640]
+	str	x0, [x19, 2640]
 	lsl	w0, w21, 3
 	bl	ftl_malloc
-	str	x0, [x19,2648]
-	ldrh	w1, [x19,2356]
-	ldr	w0, [x19,2568]
+	str	x0, [x19, 2648]
+	ldrh	w1, [x19, 2356]
+	ldr	w0, [x19, 2568]
 	mul	w0, w1, w0
 	bl	ftl_malloc
-	str	x0, [x19,2656]
-	ldrh	w1, [x19,2356]
-	ldr	w0, [x19,2492]
+	str	x0, [x19, 2656]
+	ldrh	w1, [x19, 2356]
+	ldr	w0, [x19, 2492]
 	mul	w0, w1, w0
 	bl	ftl_malloc
-	str	x0, [x19,2664]
-	ldrh	w0, [x19,2286]
-	lsl	w0, w0, 1
-	strh	w0, [x19,2672]
+	str	x0, [x19, 2664]
+	ldrh	w0, [x19, 2286]
+	ubfiz	w0, w0, 1, 15
+	strh	w0, [x19, 2672]
 	and	w0, w0, 65534
 	bl	ftl_malloc
-	str	x0, [x19,2680]
-	ldrh	w0, [x19,2672]
+	str	x0, [x19, 2680]
+	ldrh	w0, [x19, 2672]
 	add	x0, x0, 547
 	lsr	x0, x0, 9
-	strh	w0, [x19,2672]
+	strh	w0, [x19, 2672]
 	lsl	w0, w0, 9
 	bl	ftl_malloc
-	ldrh	w21, [x19,2286]
-	str	x0, [x19,2688]
+	ldrh	w21, [x19, 2286]
+	str	x0, [x19, 2688]
 	add	x0, x0, 32
+	str	x0, [x19, 2696]
 	lsl	w21, w21, 1
-	str	x0, [x19,2696]
 	mov	w0, w21
 	bl	ftl_malloc
-	str	x0, [x19,2704]
+	str	x0, [x19, 2704]
 	mov	w0, w21
 	bl	ftl_malloc
-	ldr	w21, [x19,2372]
-	str	x0, [x19,2712]
+	ldr	w21, [x19, 2372]
+	str	x0, [x19, 2712]
 	lsl	w21, w21, 1
 	mov	w0, w21
 	bl	ftl_malloc
-	str	x0, [x19,2720]
+	str	x0, [x19, 2720]
 	mov	w0, w21
 	bl	ftl_malloc
-	str	x0, [x19,2728]
-	ldrh	w0, [x19,2286]
+	str	x0, [x19, 2728]
+	ldrh	w0, [x19, 2286]
 	lsr	w0, w0, 3
 	add	w0, w0, 4
 	bl	ftl_malloc
-	adrp	x1, .LANCHOR0+16
-	str	x0, [x1,#:lo12:.LANCHOR0+16]
-	ldrh	w0, [x19,2364]
+	adrp	x1, .LANCHOR0+80
+	str	x0, [x1, #:lo12:.LANCHOR0+80]
+	ldrh	w0, [x19, 2364]
 	lsl	w0, w0, 1
 	bl	ftl_malloc
-	str	x0, [x19,2736]
-	ldrh	w0, [x19,2364]
+	str	x0, [x19, 2736]
+	ldrh	w0, [x19, 2364]
 	lsl	w0, w0, 1
 	bl	ftl_malloc
-	str	x0, [x19,2744]
-	ldrh	w0, [x19,2364]
+	str	x0, [x19, 2744]
+	ldrh	w0, [x19, 2364]
 	lsl	w0, w0, 2
 	bl	ftl_malloc
-	str	x0, [x19,2752]
-	ldrh	w0, [x19,2366]
+	str	x0, [x19, 2752]
+	ldrh	w0, [x19, 2366]
 	lsl	w0, w0, 2
 	bl	ftl_malloc
-	str	x0, [x19,2760]
-	ldrh	w2, [x19,2366]
+	ldrh	w2, [x19, 2366]
 	mov	w1, 0
+	str	x0, [x19, 2760]
 	lsl	w2, w2, 2
 	bl	ftl_memset
-	ldrh	w21, [x19,2380]
+	ldrh	w21, [x19, 2380]
 	lsl	w21, w21, 2
 	mov	w0, w21
 	bl	ftl_malloc
-	str	x0, [x19,2768]
+	str	x0, [x19, 2768]
 	mov	w0, w21
 	bl	ftl_malloc
-	str	x0, [x19,2776]
-	ldr	w0, [x19,2372]
+	str	x0, [x19, 2776]
+	ldr	w0, [x19, 2372]
 	lsl	w0, w0, 2
 	bl	ftl_malloc
-	str	x0, [x19,2784]
-	ldrh	w0, [x19,2382]
+	str	x0, [x19, 2784]
+	ldrh	w0, [x19, 2382]
 	lsl	w0, w0, 4
 	bl	ftl_malloc
-	str	x0, [x19,2792]
-	ldrh	w1, [x19,2382]
-	ldrh	w0, [x19,2354]
+	ldrh	w1, [x19, 2382]
+	str	x0, [x19, 2792]
+	ldrh	w0, [x19, 2354]
 	mul	w0, w1, w0
 	bl	ftl_malloc
-	str	x0, [x19,2800]
-	ldrh	w1, [x19,2286]
+	str	x0, [x19, 2800]
+	ldrh	w1, [x19, 2286]
 	mov	w0, 6
 	mul	w0, w1, w0
 	bl	ftl_malloc
-	str	x0, [x19,2808]
-	ldrh	w0, [x19,2342]
-	ldrh	w1, [x19,2298]
+	str	x0, [x19, 2808]
+	ldrh	w0, [x19, 2342]
+	ldrh	w1, [x19, 2298]
 	add	w0, w0, 31
 	asr	w0, w0, 5
-	strh	w0, [x19,2816]
-	mul	w0, w0, w1
+	strh	w0, [x19, 2816]
+	mul	w0, w1, w0
 	lsl	w0, w0, 2
 	bl	ftl_malloc
-	str	x0, [x19,2856]
-	add	x1, x19, 2824
-	ldrh	w4, [x19,2816]
-	ldrh	w5, [x19,2298]
-	mov	w0, 1
-	mov	w2, w4
-.L1374:
+	ldrh	w3, [x19, 2816]
+	add	x4, x19, 2864
+	ldrh	w5, [x19, 2298]
+	mov	w1, w3
+	str	x0, [x19, 2856]
+	mov	x0, 1
+.L1339:
 	cmp	w0, w5
-	add	x1, x1, 8
-	bcs	.L1474
-	ldr	x3, [x19,2856]
-	add	w0, w0, 1
-	add	x3, x3, w2, uxtw 2
-	add	w2, w2, w4
-	str	x3, [x1,32]
-	b	.L1374
-.L1474:
-	add	x1, x20, :lo12:.LANCHOR2
-.L1376:
-	cmp	w0, 8
-	beq	.L1475
-	add	x2, x1, w0, uxtw 3
-	add	w0, w0, 1
-	str	xzr, [x2,2856]
-	b	.L1376
-.L1475:
+	bcc	.L1340
+	mov	w1, 8
+	add	x3, x20, :lo12:.LANCHOR2
+	sub	w1, w1, w0
+	add	x3, x3, 2824
+	add	x1, x1, 1
+	mov	x2, 0
+.L1341:
+	add	x2, x2, 1
+	cmp	x2, x1
+	bne	.L1342
 	add	x0, x20, :lo12:.LANCHOR2
-	ldr	x1, [x0,2720]
-	cbnz	x1, .L1378
-.L1380:
+	ldr	x1, [x0, 2720]
+	cbnz	x1, .L1343
+.L1345:
 	adrp	x1, .LANCHOR3
-	adrp	x0, .LC31
 	add	x1, x1, :lo12:.LANCHOR3
-	add	x0, x0, :lo12:.LC31
 	add	x1, x1, 136
+	adrp	x0, .LC31
+	add	x0, x0, :lo12:.LC31
 	bl	printk
 	mov	w0, -1
-	b	.L1379
-.L1378:
-	ldr	x1, [x0,2728]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2768]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2784]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2792]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2800]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2808]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2856]
-	cbz	x1, .L1380
-	ldr	x0, [x0,2712]
-	cbz	x0, .L1380
+.L1337:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldr	x23, [sp, 48]
+	ldp	x29, x30, [sp], 64
+	ret
+.L1340:
+	ldr	x2, [x19, 2856]
+	add	w0, w0, 1
+	add	x2, x2, w1, uxtw 2
+	add	w1, w1, w3
+	str	x2, [x4], 8
+	b	.L1339
+.L1342:
+	add	x4, x0, x2
+	add	x4, x3, x4, lsl 3
+	str	xzr, [x4, 24]
+	b	.L1341
+.L1343:
+	ldr	x1, [x0, 2728]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2768]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2784]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2792]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2800]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2808]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2856]
+	cbz	x1, .L1345
+	ldr	x0, [x0, 2712]
+	cbz	x0, .L1345
 	add	x0, x20, :lo12:.LANCHOR2
-	ldr	x1, [x0,2504]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2512]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2520]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2536]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2544]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2552]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2528]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2576]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2584]
-	cbz	x1, .L1380
-	ldr	x0, [x0,2592]
-	cbz	x0, .L1380
+	ldr	x1, [x0, 2504]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2512]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2520]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2536]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2544]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2552]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2528]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2576]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2584]
+	cbz	x1, .L1345
+	ldr	x0, [x0, 2592]
+	cbz	x0, .L1345
 	add	x0, x20, :lo12:.LANCHOR2
-	ldr	x1, [x0,2600]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2616]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2624]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2632]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2640]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2648]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2656]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2696]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2680]
-	cbz	x1, .L1380
-	ldr	x0, [x0,2736]
-	cbz	x0, .L1380
+	ldr	x1, [x0, 2600]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2616]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2624]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2632]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2640]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2648]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2656]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2696]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2680]
+	cbz	x1, .L1345
+	ldr	x0, [x0, 2736]
+	cbz	x0, .L1345
 	adrp	x0, .LANCHOR2
 	add	x0, x0, :lo12:.LANCHOR2
-	ldr	x1, [x0,2744]
-	cbz	x1, .L1380
-	ldr	x1, [x0,2752]
-	cbz	x1, .L1380
-	ldr	x0, [x0,2760]
-	cbz	x0, .L1380
+	ldr	x1, [x0, 2744]
+	cbz	x1, .L1345
+	ldr	x1, [x0, 2752]
+	cbz	x1, .L1345
+	ldr	x0, [x0, 2760]
+	cbz	x0, .L1345
 	mov	w0, 0
-.L1379:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldr	x23, [sp,48]
-	ldp	x29, x30, [sp], 64
-	ret
+	b	.L1337
 	.size	FtlMemInit, .-FtlMemInit
 	.align	2
 	.global	IsBlkInVendorPart
 	.type	IsBlkInVendorPart, %function
 IsBlkInVendorPart:
 	adrp	x1, .LANCHOR2
-	uxth	w4, w0
 	add	x1, x1, :lo12:.LANCHOR2
-	mov	w0, 0
-	ldrh	w2, [x1,2920]
-	cbz	w2, .L1477
-	ldrh	w2, [x1,2364]
-	ldr	x3, [x1,2736]
+	and	w0, w0, 65535
+	ldrh	w2, [x1, 2920]
+	cbz	w2, .L1444
+	ldrh	w2, [x1, 2364]
+	ldr	x3, [x1, 2736]
 	mov	x1, 0
-.L1478:
+.L1442:
 	cmp	w2, w1, uxth
-	bls	.L1483
+	bhi	.L1443
+.L1444:
+	mov	w0, 0
+	ret
+.L1443:
 	add	x1, x1, 1
-	add	x0, x3, x1, lsl 1
-	ldrh	w0, [x0,-2]
-	cmp	w0, w4
-	bne	.L1478
+	add	x4, x3, x1, lsl 1
+	ldrh	w4, [x4, -2]
+	cmp	w4, w0
+	bne	.L1442
 	mov	w0, 1
-	b	.L1477
-.L1483:
-	mov	w0, 0
-.L1477:
 	ret
 	.size	IsBlkInVendorPart, .-IsBlkInVendorPart
 	.align	2
@@ -8797,29 +8650,33 @@ IsBlkInVendorPart:
 	.type	FtlCacheMetchLpa, %function
 FtlCacheMetchLpa:
 	adrp	x2, .LANCHOR2
-	mov	w6, w0
 	add	x2, x2, :lo12:.LANCHOR2
+	ldr	w4, [x2, 2496]
+	cbz	w4, .L1451
+	mov	x5, 24
+	mov	w6, 56
+	ldr	x2, [x2, 2560]
+	nop // between mem op and mult-accumulate
+	umaddl	x4, w4, w6, x5
+	add	x3, x2, 24
+	add	x2, x2, x4
+.L1448:
+	cmp	x3, x2
+	bne	.L1450
+.L1451:
 	mov	w0, 0
-	ldr	w3, [x2,2496]
-	cbz	w3, .L1485
-	ldr	x5, [x2,2560]
-	mov	x0, 56
-	mov	x2, 0
-.L1486:
-	cmp	w3, w2
-	bls	.L1495
-	madd	x4, x2, x0, x5
-	add	x2, x2, 1
-	ldr	w4, [x4,24]
-	cmp	w4, w6
-	bcc	.L1486
+	ret
+.L1450:
+	ldr	w4, [x3]
+	cmp	w4, w0
+	bcc	.L1449
 	cmp	w4, w1
-	bhi	.L1486
+	bls	.L1452
+.L1449:
+	add	x3, x3, 56
+	b	.L1448
+.L1452:
 	mov	w0, 1
-	b	.L1485
-.L1495:
-	mov	w0, 0
-.L1485:
 	ret
 	.size	FtlCacheMetchLpa, .-FtlCacheMetchLpa
 	.align	2
@@ -8827,7 +8684,7 @@ FtlCacheMetchLpa:
 	.type	FtlGetCap, %function
 FtlGetCap:
 	adrp	x0, .LANCHOR2+1224
-	ldr	w0, [x0,#:lo12:.LANCHOR2+1224]
+	ldr	w0, [x0, #:lo12:.LANCHOR2+1224]
 	ret
 	.size	FtlGetCap, .-FtlGetCap
 	.align	2
@@ -8835,7 +8692,7 @@ FtlGetCap:
 	.type	FtlGetCapacity, %function
 FtlGetCapacity:
 	adrp	x0, .LANCHOR2+1224
-	ldr	w0, [x0,#:lo12:.LANCHOR2+1224]
+	ldr	w0, [x0, #:lo12:.LANCHOR2+1224]
 	ret
 	.size	FtlGetCapacity, .-FtlGetCapacity
 	.align	2
@@ -8843,7 +8700,7 @@ FtlGetCapacity:
 	.type	ftl_get_density, %function
 ftl_get_density:
 	adrp	x0, .LANCHOR2+1224
-	ldr	w0, [x0,#:lo12:.LANCHOR2+1224]
+	ldr	w0, [x0, #:lo12:.LANCHOR2+1224]
 	ret
 	.size	ftl_get_density, .-ftl_get_density
 	.align	2
@@ -8851,7 +8708,7 @@ ftl_get_density:
 	.type	FtlGetLpn, %function
 FtlGetLpn:
 	adrp	x0, .LANCHOR2+2924
-	ldr	w0, [x0,#:lo12:.LANCHOR2+2924]
+	ldr	w0, [x0, #:lo12:.LANCHOR2+2924]
 	ret
 	.size	FtlGetLpn, .-FtlGetLpn
 	.align	2
@@ -8859,33 +8716,34 @@ FtlGetLpn:
 	.type	FtlBbmMapBadBlock, %function
 FtlBbmMapBadBlock:
 	stp	x29, x30, [sp, -32]!
-	uxth	w1, w0
+	and	w1, w0, 65535
 	mov	w4, 1
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	adrp	x19, .LANCHOR2
 	add	x19, x19, :lo12:.LANCHOR2
-	ldrh	w3, [x19,2342]
+	ldrh	w0, [x19, 2342]
 	add	x19, x19, 2824
-	udiv	w2, w1, w3
+	udiv	w3, w1, w0
+	and	w2, w3, 65535
+	msub	w3, w3, w0, w1
 	add	x0, x19, w2, uxth 3
-	ldr	x0, [x0,32]
-	msub	w3, w2, w3, w1
-	uxth	w3, w3
-	ubfx	x6, x3, 5, 11
+	and	w3, w3, 65535
+	ldr	x0, [x0, 32]
+	ubfx	x5, x3, 5, 11
+	lsl	x5, x5, 2
 	lsl	w4, w4, w3
-	lsl	x6, x6, 2
-	ldr	w5, [x0,x6]
-	orr	w4, w4, w5
-	str	w4, [x0,x6]
+	ldr	w6, [x0, x5]
+	orr	w4, w4, w6
+	str	w4, [x0, x5]
 	adrp	x0, .LC32
 	add	x0, x0, :lo12:.LC32
 	bl	printk
-	ldrh	w0, [x19,6]
+	ldrh	w0, [x19, 6]
 	add	w0, w0, 1
-	strh	w0, [x19,6]
+	strh	w0, [x19, 6]
 	mov	w0, 0
-	ldr	x19, [sp,16]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	FtlBbmMapBadBlock, .-FtlBbmMapBadBlock
@@ -8894,16 +8752,16 @@ FtlBbmMapBadBlock:
 	.type	FtlBbmIsBadBlock, %function
 FtlBbmIsBadBlock:
 	adrp	x2, .LANCHOR2
-	uxth	w0, w0
 	add	x3, x2, :lo12:.LANCHOR2
-	ldrh	w1, [x3,2342]
+	and	w0, w0, 65535
+	ldrh	w1, [x3, 2342]
 	udiv	w2, w0, w1
 	msub	w0, w2, w1, w0
 	add	x2, x3, w2, uxth 3
-	ldr	x1, [x2,2856]
-	uxth	w0, w0
+	and	w0, w0, 65535
+	ldr	x1, [x2, 2856]
 	ubfx	x3, x0, 5, 11
-	ldr	w1, [x1,x3,lsl 2]
+	ldr	w1, [x1, x3, lsl 2]
 	lsr	w0, w1, w0
 	and	w0, w0, 1
 	ret
@@ -8920,39 +8778,39 @@ FtlBbtInfoPrint:
 FtlBbt2Bitmap:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	str	x21, [sp,32]
 	add	x19, x19, :lo12:.LANCHOR2
-	mov	x21, x0
 	mov	x20, x1
-	mov	x0, x1
+	str	x21, [sp, 32]
 	mov	w1, 0
-	ldrh	w2, [x19,2816]
+	mov	x21, x0
+	mov	x0, x20
+	ldrh	w2, [x19, 2816]
 	lsl	w2, w2, 2
 	bl	ftl_memset
-	mov	x3, 0
-	mov	w0, 65535
-	mov	w5, 1
-.L1505:
-	ldrh	w2, [x21,x3]
-	cmp	w2, w0
-	beq	.L1503
-	ubfx	x4, x2, 5, 11
-	lsl	w2, w5, w2
-	lsl	x4, x4, 2
-	add	x3, x3, 2
-	cmp	x3, 1024
-	ldr	w1, [x20,x4]
-	orr	w2, w1, w2
-	str	w2, [x20,x4]
-	ldrh	w2, [x19,2830]
-	add	w2, w2, 1
-	strh	w2, [x19,2830]
-	bne	.L1505
-.L1503:
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
+	mov	x1, 0
+	mov	w5, 65535
+	mov	w4, 1
+.L1463:
+	ldrh	w0, [x21, x1]
+	cmp	w0, w5
+	beq	.L1461
+	ubfx	x2, x0, 5, 11
+	lsl	w0, w4, w0
+	lsl	x2, x2, 2
+	add	x1, x1, 2
+	cmp	x1, 1024
+	ldr	w3, [x20, x2]
+	orr	w0, w3, w0
+	str	w0, [x20, x2]
+	ldrh	w0, [x19, 2830]
+	add	w0, w0, 1
+	strh	w0, [x19, 2830]
+	bne	.L1463
+.L1461:
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	FtlBbt2Bitmap, .-FtlBbt2Bitmap
@@ -8962,217 +8820,222 @@ FtlBbt2Bitmap:
 FtlBbmTblFlush:
 	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x19, .LANCHOR2
-	add	x19, x19, :lo12:.LANCHOR2
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	ldr	w1, [x19,2928]
-	stp	x25, x26, [sp,64]
-	cbnz	w1, .L1510
-	ldr	x0, [x19,2576]
-	mov	x22, 0
-	ldr	x3, [x19,2640]
-	add	x21, x19, 2824
-	ldrh	w2, [x19,2354]
-	str	x0, [x19,2944]
-	str	x3, [x19,2952]
+	stp	x19, x20, [sp, 16]
+	stp	x25, x26, [sp, 64]
+	adrp	x25, .LANCHOR2
+	add	x19, x25, :lo12:.LANCHOR2
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	ldr	w0, [x19, 2928]
+	cbnz	w0, .L1469
+	ldr	x2, [x19, 2640]
+	mov	w1, 0
+	ldr	x0, [x19, 2576]
+	add	x21, x19, 2856
+	str	x2, [x19, 2952]
+	mov	w20, 0
+	ldrh	w2, [x19, 2354]
+	str	x0, [x19, 2944]
 	bl	ftl_memset
-.L1511:
-	ldrh	w1, [x19,2298]
-	mov	w0, w22
-	add	x20, x19, 2936
-	add	x22, x22, 1
-	cmp	w0, w1
-	bge	.L1524
-	add	x1, x21, x22, lsl 3
-	ldrh	w2, [x19,2816]
-	ldr	x3, [x20,8]
-	ldr	x1, [x1,24]
-	mul	w0, w0, w2
-	add	x0, x3, w0, sxtw 2
-	lsl	w2, w2, 2
-	bl	ftl_memcpy
-	b	.L1511
-.L1524:
-	ldr	x26, [x20,16]
-	mov	w1, 255
+.L1470:
+	ldrh	w0, [x19, 2298]
+	add	x1, x19, 2936
+	cmp	w20, w0
+	blt	.L1471
+	ldr	x26, [x1, 16]
 	mov	w2, 16
-	mov	w22, 0
+	mov	w1, 255
+	adrp	x23, .LC33
 	mov	x0, x26
-	adrp	x24, .LC33
-	adrp	x25, .LC34
-	mov	w23, w22
 	bl	ftl_memset
-	add	x24, x24, :lo12:.LC33
 	mov	w0, -3887
+	add	x25, x25, :lo12:.LANCHOR2
 	strh	w0, [x26]
-	add	x25, x25, :lo12:.LC34
-	ldr	w0, [x21,8]
-	str	w0, [x26,4]
-	ldrh	w0, [x19,2824]
-	strh	w0, [x26,2]
-	ldrh	w0, [x21,4]
-	strh	w0, [x26,8]
-	ldrh	w0, [x21,6]
-	strh	w0, [x26,10]
-	ldr	w0, [x19,2272]
-	strh	w0, [x26,12]
-.L1513:
-	ldr	x0, [x19,2576]
-	str	x0, [x20,8]
-	ldrh	w1, [x19,2824]
-	ldr	x0, [x19,2640]
-	str	x0, [x20,16]
-	ldrh	w2, [x19,2826]
-	ldrh	w3, [x19,2828]
+	add	x0, x19, 2824
+	add	x23, x23, :lo12:.LC33
+	mov	w21, 0
+	ldr	w1, [x19, 2832]
+	mov	w22, 0
+	str	w1, [x26, 4]
+	adrp	x24, .LC34
+	ldrh	w1, [x19, 2824]
+	strh	w1, [x26, 2]
+	ldrh	w1, [x19, 2828]
+	strh	w1, [x26, 8]
+	ldrh	w1, [x19, 2830]
+	strh	w1, [x26, 10]
+	ldr	w1, [x19, 2272]
+	mov	x19, x0
+	strh	w1, [x26, 12]
+.L1472:
+	ldr	x0, [x25, 2576]
+	str	x0, [x25, 2944]
+	ldr	x0, [x25, 2640]
+	str	x0, [x25, 2952]
+	ldrh	w1, [x19]
+	ldrh	w2, [x19, 2]
+	ldrh	w3, [x19, 4]
+	ldrh	w4, [x26, 10]
 	orr	w0, w2, w1, lsl 10
-	ldrh	w4, [x26,10]
-	str	w0, [x20,4]
-	mov	x0, x24
-	str	wzr, [x20]
+	str	wzr, [x25, 2936]
+	str	w0, [x25, 2940]
+	mov	x0, x23
 	bl	printk
-	ldrh	w1, [x19,2346]
-	ldrh	w0, [x19,2826]
-	sub	w1, w1, #1
-	cmp	w0, w1
-	blt	.L1514
-	ldr	w1, [x19,2832]
-	ldrh	w0, [x19,2824]
-	add	w1, w1, 1
-	str	w1, [x19,2832]
-	str	w1, [x26,4]
-	strh	w0, [x26,8]
-	ldrh	w1, [x19,2828]
-	strh	w0, [x19,2828]
-	ldr	x0, [x19,2544]
-	strh	w1, [x19,2824]
-	lsl	w1, w1, 10
-	str	w1, [x20,4]
-	str	w1, [x0,4]
-	mov	w1, 1
-	mov	w2, w1
-	strh	wzr, [x19,2826]
-	ldr	x0, [x19,2544]
+	ldrh	w0, [x25, 2346]
+	ldrh	w1, [x19, 2]
+	sub	w0, w0, #1
+	cmp	w1, w0
+	blt	.L1473
+	ldr	w0, [x19, 8]
+	mov	w2, 1
+	ldrh	w1, [x19]
+	add	w0, w0, 1
+	str	w0, [x19, 8]
+	str	w0, [x26, 4]
+	strh	w1, [x26, 8]
+	ldrh	w0, [x19, 4]
+	strh	w1, [x19, 4]
+	ldr	x1, [x25, 2544]
+	strh	w0, [x19]
+	lsl	w0, w0, 10
+	str	w0, [x25, 2940]
+	strh	wzr, [x19, 2]
+	str	w0, [x1, 4]
+	mov	w1, w2
+	ldr	x0, [x25, 2544]
 	bl	FlashEraseBlocks
-.L1514:
-	mov	w1, 1
+.L1473:
+	add	x20, x25, 2936
+	mov	w3, 1
 	mov	x0, x20
-	mov	w2, w1
-	mov	w3, w1
+	mov	w2, w3
+	mov	w1, w3
 	bl	FlashProgPages
-	ldrh	w1, [x19,2826]
-	ldr	w0, [x20]
-	add	w1, w1, 1
-	strh	w1, [x19,2826]
+	ldrh	w0, [x19, 2]
+	add	w0, w0, 1
+	strh	w0, [x19, 2]
+	ldr	w0, [x25, 2936]
 	cmn	w0, #1
-	bne	.L1515
-	ldr	w1, [x20,4]
-	mov	x0, x25
-	add	w22, w22, 1
+	bne	.L1474
+	ldr	w1, [x25, 2940]
+	add	w21, w21, 1
+	add	x0, x24, :lo12:.LC34
+	and	w21, w21, 65535
 	bl	printk
-	uxth	w22, w22
-	cmp	w22, 3
-	bls	.L1513
+	cmp	w21, 3
+	bls	.L1472
+	ldr	w1, [x25, 2940]
+	mov	w2, w21
 	adrp	x0, .LC35
-	ldr	w1, [x20,4]
 	add	x0, x0, :lo12:.LC35
-	mov	w2, w22
 	bl	printk
 	mov	w0, 1
-	str	w0, [x19,2928]
-	b	.L1510
-.L1515:
-	add	w23, w23, 1
-	cmp	w23, 1
-	beq	.L1513
-	cmp	w0, 256
-	beq	.L1513
-.L1510:
+	str	w0, [x25, 2928]
+.L1469:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
 	ldp	x29, x30, [sp], 80
 	ret
+.L1471:
+	ldrh	w2, [x19, 2816]
+	ldr	x0, [x1, 8]
+	ldr	x1, [x21], 8
+	mul	w3, w2, w20
+	lsl	w2, w2, 2
+	add	w20, w20, 1
+	add	x0, x0, w3, sxtw 2
+	bl	ftl_memcpy
+	b	.L1470
+.L1477:
+	mov	w22, 1
+	b	.L1472
+.L1474:
+	add	w22, w22, 1
+	cmp	w22, 1
+	ble	.L1477
+	cmp	w0, 256
+	bne	.L1469
+	b	.L1472
 	.size	FtlBbmTblFlush, .-FtlBbmTblFlush
 	.align	2
 	.global	FtlLoadFactoryBbt
 	.type	FtlLoadFactoryBbt, %function
 FtlLoadFactoryBbt:
 	stp	x29, x30, [sp, -80]!
-	adrp	x1, .LANCHOR2
-	add	x1, x1, :lo12:.LANCHOR2
+	adrp	x0, .LANCHOR2
+	add	x0, x0, :lo12:.LANCHOR2
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	add	x21, x1, 2936
-	add	x23, x1, 2824
-	ldr	x0, [x1,2576]
-	mov	w22, 0
-	ldr	x24, [x1,2640]
-	mov	x19, x1
-	str	x0, [x21,8]
-	mov	w25, -1
-	str	x24, [x21,16]
+	stp	x21, x22, [sp, 32]
+	add	x22, x0, 2836
+	stp	x25, x26, [sp, 64]
+	mov	w21, 0
+	stp	x19, x20, [sp, 16]
+	mov	x19, x0
+	stp	x23, x24, [sp, 48]
+	add	x23, x0, 2936
+	mov	x25, x23
 	mov	w26, 61664
-.L1526:
-	ldrh	w0, [x19,2298]
-	cmp	w22, w0
-	bcs	.L1535
-	ldrh	w20, [x19,2342]
-	strh	w25, [x23,12]
-.L1528:
+	ldr	x1, [x0, 2576]
+	ldr	x24, [x0, 2640]
+	stp	x1, x24, [x23, 8]
+.L1483:
+	ldrh	w0, [x19, 2298]
+	cmp	w21, w0
+	bcc	.L1488
+	mov	w0, 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	ret
+.L1488:
+	ldrh	w20, [x19, 2342]
+	mov	w0, -1
+	strh	w0, [x22]
+.L1485:
+	ldrh	w0, [x19, 2342]
 	sub	w20, w20, #1
-	ldrh	w0, [x19,2342]
-	uxth	w20, w20
+	and	w20, w20, 65535
 	sub	w1, w0, #16
 	cmp	w20, w1
-	ble	.L1529
-	madd	w0, w22, w0, w20
-	mov	w1, 1
+	ble	.L1486
+	madd	w0, w0, w21, w20
+	mov	w2, 1
+	mov	w1, w2
 	lsl	w0, w0, 10
-	mov	w2, w1
-	str	w0, [x21,4]
-	mov	x0, x21
+	str	w0, [x25, 4]
+	mov	x0, x23
 	bl	FlashReadPages
-	ldr	w0, [x21]
+	ldr	w0, [x25]
 	cmn	w0, #1
-	beq	.L1528
+	beq	.L1485
 	ldrh	w0, [x24]
 	cmp	w0, w26
-	bne	.L1528
-	strh	w20, [x23,12]
-.L1529:
-	add	w22, w22, 1
-	add	x23, x23, 2
-	b	.L1526
-.L1535:
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 80
-	ret
+	bne	.L1485
+	strh	w20, [x22]
+.L1486:
+	add	w21, w21, 1
+	add	x22, x22, 2
+	b	.L1483
 	.size	FtlLoadFactoryBbt, .-FtlLoadFactoryBbt
 	.align	2
 	.global	FtlBbtMemInit
 	.type	FtlBbtMemInit, %function
 FtlBbtMemInit:
-	adrp	x0, .LANCHOR2
-	mov	w1, -1
 	stp	x29, x30, [sp, -16]!
+	adrp	x0, .LANCHOR2
 	add	x0, x0, :lo12:.LANCHOR2
-	mov	w2, 16
+	mov	w1, -1
 	add	x29, sp, 0
+	mov	w2, 16
 	add	x0, x0, 2836
-	strh	w1, [x0,-12]
+	strh	w1, [x0, -12]
 	mov	w1, 255
-	strh	wzr, [x0,-6]
+	strh	wzr, [x0, -6]
 	bl	ftl_memset
 	ldp	x29, x30, [sp], 16
 	ret
@@ -9181,34 +9044,33 @@ FtlBbtMemInit:
 	.global	FtlBbtCalcTotleCnt
 	.type	FtlBbtCalcTotleCnt, %function
 FtlBbtCalcTotleCnt:
-	stp	x29, x30, [sp, -48]!
 	adrp	x0, .LANCHOR2
 	add	x0, x0, :lo12:.LANCHOR2
+	mov	w4, 0
+	mov	w5, 0
+	ldrh	w6, [x0, 2342]
+	ldrh	w0, [x0, 2298]
+	mul	w6, w6, w0
+	cmp	w4, w6
+	blt	.L1505
+	mov	w0, w5
+	ret
+.L1505:
+	stp	x29, x30, [sp, -16]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	str	x21, [sp,32]
-	mov	w19, 0
-	mov	w20, w19
-	ldrh	w1, [x0,2342]
-	ldrh	w21, [x0,2298]
-	mul	w21, w1, w21
-.L1538:
-	cmp	w20, w21
-	bge	.L1544
-	mov	w0, w20
+.L1498:
+	mov	w0, w4
 	bl	FtlBbmIsBadBlock
-	cbz	w0, .L1539
-	add	w19, w19, 1
-	uxth	w19, w19
-.L1539:
-	add	w20, w20, 1
-	uxth	w20, w20
-	b	.L1538
-.L1544:
-	mov	w0, w19
-	ldr	x21, [sp,32]
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 48
+	cbz	w0, .L1497
+	add	w5, w5, 1
+	and	w5, w5, 65535
+.L1497:
+	add	w4, w4, 1
+	and	w4, w4, 65535
+	cmp	w4, w6
+	blt	.L1498
+	mov	w0, w5
+	ldp	x29, x30, [sp], 16
 	ret
 	.size	FtlBbtCalcTotleCnt, .-FtlBbtCalcTotleCnt
 	.align	2
@@ -9217,189 +9079,185 @@ FtlBbtCalcTotleCnt:
 FtlMakeBbt:
 	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
 	add	x20, x19, :lo12:.LANCHOR2
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldr	w24, [x20, 2928]
+	cbnz	w24, .L1507
 	mov	x21, x19
-	ldr	w22, [x20,2928]
-	cbnz	w22, .L1546
-	add	x24, x20, 2824
+	add	x26, x20, 2856
+	add	x25, x20, 2836
 	mov	x19, x20
-	mov	x25, x24
 	add	x20, x20, 2936
 	mov	w28, -3872
 	bl	FtlBbtMemInit
 	bl	FtlLoadFactoryBbt
-.L1547:
-	ldrh	w0, [x19,2298]
-	cmp	w22, w0
-	bcs	.L1565
-	ldrh	w4, [x25,12]
-	mov	w1, 65535
-	ldr	x0, [x19,2576]
-	ldr	x26, [x19,2640]
-	cmp	w4, w1
-	str	x0, [x20,8]
-	str	x26, [x20,16]
-	beq	.L1548
-	ldrh	w0, [x19,2342]
-	mov	w1, 1
-	mov	w2, w1
-	madd	w27, w22, w0, w4
-	lsl	w0, w27, 10
-	str	w0, [x20,4]
+.L1508:
+	ldrh	w0, [x19, 2298]
+	cmp	w24, w0
+	bcc	.L1514
+	add	x20, x21, :lo12:.LANCHOR2
+	mov	w19, 0
+.L1515:
+	ldrh	w0, [x20, 2358]
+	cmp	w0, w19
+	bhi	.L1516
+	add	x20, x20, 2824
+	ldrh	w19, [x20, 12]
+	mov	w22, 65535
+	sub	w19, w19, #1
+	and	w19, w19, 65535
+.L1517:
+	ldrh	w0, [x20, 12]
+	sub	w0, w0, #48
+	cmp	w19, w0
+	ble	.L1521
+	mov	w0, w19
+	bl	FtlBbmIsBadBlock
+	cmp	w0, 1
+	beq	.L1518
+	mov	w0, w19
+	bl	FlashTestBlk
+	cbz	w0, .L1519
+	mov	w0, w19
+	bl	FtlBbmMapBadBlock
+.L1518:
+	sub	w19, w19, #1
+	and	w19, w19, 65535
+	b	.L1517
+.L1514:
+	ldr	x0, [x19, 2576]
+	mov	w2, 65535
+	ldr	x27, [x19, 2640]
+	ldrh	w1, [x25]
+	stp	x0, x27, [x20, 8]
+	cmp	w1, w2
+	beq	.L1509
+	ldrh	w23, [x19, 2342]
+	mov	w2, 1
+	madd	w23, w23, w24, w1
+	mov	w1, w2
+	lsl	w0, w23, 10
+	str	w0, [x20, 4]
 	mov	x0, x20
 	bl	FlashReadPages
-	ldrh	w2, [x19,2342]
-	ldr	x0, [x24,32]
+	ldr	x1, [x20, 8]
+	ldr	x0, [x26]
+	ldrh	w2, [x19, 2342]
 	add	w2, w2, 7
-	ldr	x1, [x20,8]
 	lsr	w2, w2, 3
 	bl	ftl_memcpy
-	b	.L1549
-.L1548:
-	mov	w1, w22
+.L1510:
+	mov	w0, w23
+	add	w24, w24, 1
+	bl	FtlBbmMapBadBlock
+	add	x26, x26, 8
+	add	x25, x25, 2
+	b	.L1508
+.L1509:
+	mov	w1, w24
 	bl	FlashGetBadBlockList
-	ldr	x0, [x20,8]
-	ldr	x1, [x24,32]
+	ldr	x0, [x20, 8]
+	ldr	x1, [x26]
 	bl	FtlBbt2Bitmap
-	ldrh	w23, [x19,2342]
-.L1551:
-	sub	w23, w23, #1
-	uxth	w23, w23
-.L1550:
-	ldrh	w0, [x19,2342]
-	madd	w0, w22, w0, w23
+	ldrh	w22, [x19, 2342]
+.L1512:
+	sub	w22, w22, #1
+	and	w22, w22, 65535
+.L1511:
+	ldrh	w0, [x19, 2342]
+	madd	w0, w24, w0, w22
 	bl	FtlBbmIsBadBlock
 	cmp	w0, 1
-	beq	.L1551
-	ldr	x0, [x19,2640]
-	mov	w1, 0
+	beq	.L1512
+	ldr	x0, [x19, 2640]
 	mov	w2, 16
-	strh	w23, [x25,12]
+	strh	w22, [x25]
+	mov	w1, 0
 	bl	ftl_memset
-	strh	w28, [x26]
-	str	wzr, [x26,4]
-	ldrh	w2, [x19,2816]
-	ldrh	w0, [x25,12]
-	strh	w0, [x26,2]
+	strh	w28, [x27]
+	str	wzr, [x27, 4]
+	ldrh	w23, [x19, 2342]
+	ldrh	w0, [x25]
+	strh	w0, [x27, 2]
+	ldrh	w2, [x19, 2816]
+	ldrh	w0, [x25]
+	ldr	x1, [x26]
 	lsl	w2, w2, 2
-	ldrh	w0, [x19,2342]
-	ldrh	w4, [x25,12]
-	ldr	x1, [x24,32]
-	madd	w27, w22, w0, w4
-	lsl	w0, w27, 10
-	str	w0, [x20,4]
-	ldr	x0, [x20,8]
+	madd	w23, w23, w24, w0
+	lsl	w0, w23, 10
+	str	w0, [x20, 4]
+	ldr	x0, [x20, 8]
 	bl	ftl_memcpy
-	mov	w1, 1
+	mov	w2, 1
 	mov	x0, x20
-	mov	w2, w1
+	mov	w1, w2
 	bl	FlashEraseBlocks
-	mov	w1, 1
+	mov	w3, 1
 	mov	x0, x20
-	mov	w2, w1
-	mov	w3, w1
+	mov	w2, w3
+	mov	w1, w3
 	bl	FlashProgPages
 	ldr	w0, [x20]
 	cmn	w0, #1
-	bne	.L1549
-	mov	w0, w27
-	bl	FtlBbmMapBadBlock
-	b	.L1550
-.L1549:
-	mov	w0, w27
-	add	w22, w22, 1
-	add	x24, x24, 8
-	add	x25, x25, 2
+	bne	.L1510
+	mov	w0, w23
 	bl	FtlBbmMapBadBlock
-	b	.L1547
-.L1565:
-	mov	w19, 0
-.L1554:
-	add	x20, x21, :lo12:.LANCHOR2
-	ldrh	w0, [x20,2358]
-	cmp	w0, w19
-	bls	.L1566
+	b	.L1511
+.L1516:
 	mov	w0, w19
 	add	w19, w19, 1
 	bl	FtlBbmMapBadBlock
-	uxth	w19, w19
-	b	.L1554
-.L1566:
-	ldrh	w19, [x20,2836]
-	mov	w23, 65535
-	sub	w19, w19, #1
-	uxth	w19, w19
-.L1556:
-	add	x22, x20, 2824
-	ldrh	w0, [x22,12]
-	sub	w0, w0, #48
-	cmp	w19, w0
-	ble	.L1560
-	mov	w0, w19
-	bl	FtlBbmIsBadBlock
-	cmp	w0, 1
-	beq	.L1557
-	mov	w0, w19
-	bl	FlashTestBlk
-	cbz	w0, .L1558
-	mov	w0, w19
-	bl	FtlBbmMapBadBlock
-	b	.L1557
-.L1558:
-	ldrh	w0, [x20,2824]
-	cmp	w0, w23
-	bne	.L1559
-	strh	w19, [x20,2824]
-	b	.L1557
-.L1559:
-	strh	w19, [x22,4]
-	b	.L1560
-.L1557:
-	sub	w19, w19, #1
-	uxth	w19, w19
-	b	.L1556
-.L1560:
-	add	x19, x21, :lo12:.LANCHOR2
+	and	w19, w19, 65535
+	b	.L1515
+.L1519:
+	ldrh	w0, [x20]
+	cmp	w0, w22
+	bne	.L1520
+	strh	w19, [x20]
+	b	.L1518
+.L1520:
+	strh	w19, [x20, 4]
+.L1521:
+	add	x21, x21, :lo12:.LANCHOR2
 	mov	w2, 2
-	ldr	x1, [x19,2544]
-	ldrh	w0, [x19,2824]
-	str	wzr, [x19,2832]
+	ldr	x1, [x21, 2544]
+	ldrh	w0, [x21, 2824]
+	str	wzr, [x21, 2832]
+	strh	wzr, [x21, 2826]
 	lsl	w0, w0, 10
-	str	w0, [x1,4]
-	strh	wzr, [x19,2826]
-	ldr	x0, [x19,2544]
-	ldrh	w1, [x19,2828]
+	str	w0, [x1, 4]
+	ldr	x0, [x21, 2544]
+	ldrh	w1, [x21, 2828]
 	lsl	w1, w1, 10
-	str	w1, [x0,60]
+	str	w1, [x0, 60]
 	mov	w1, 1
 	bl	FlashEraseBlocks
-	ldrh	w0, [x19,2824]
+	ldrh	w0, [x21, 2824]
 	bl	FtlBbmMapBadBlock
-	ldrh	w0, [x19,2828]
+	ldrh	w0, [x21, 2828]
 	bl	FtlBbmMapBadBlock
 	bl	FtlBbmTblFlush
-	strh	wzr, [x19,2826]
-	ldr	w0, [x19,2832]
-	ldrh	w1, [x19,2828]
+	strh	wzr, [x21, 2826]
+	ldr	w0, [x21, 2832]
+	ldrh	w1, [x21, 2828]
 	add	w0, w0, 1
-	str	w0, [x19,2832]
-	ldrh	w0, [x19,2824]
-	strh	w0, [x19,2828]
-	strh	w1, [x19,2824]
+	str	w0, [x21, 2832]
+	ldrh	w0, [x21, 2824]
+	strh	w0, [x21, 2828]
+	strh	w1, [x21, 2824]
 	bl	FtlBbmTblFlush
-.L1546:
+.L1507:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 96
 	ret
 	.size	FtlMakeBbt, .-FtlMakeBbt
@@ -9407,16 +9265,16 @@ FtlMakeBbt:
 	.global	V2P_block
 	.type	V2P_block, %function
 V2P_block:
-	adrp	x3, .LANCHOR2
-	uxth	w0, w0
-	add	x3, x3, :lo12:.LANCHOR2
-	uxth	w1, w1
-	ldrh	w4, [x3,2300]
-	udiv	w2, w0, w4
-	msub	w0, w2, w4, w0
-	madd	w0, w1, w4, w0
-	ldrh	w1, [x3,2342]
-	madd	w0, w2, w1, w0
+	adrp	x4, .LANCHOR2
+	add	x4, x4, :lo12:.LANCHOR2
+	and	w0, w0, 65535
+	and	w1, w1, 65535
+	ldrh	w2, [x4, 2300]
+	ldrh	w4, [x4, 2342]
+	udiv	w3, w0, w2
+	msub	w0, w3, w2, w0
+	madd	w2, w2, w1, w0
+	madd	w0, w3, w4, w2
 	ret
 	.size	V2P_block, .-V2P_block
 	.align	2
@@ -9424,28 +9282,28 @@ V2P_block:
 	.type	P2V_plane, %function
 P2V_plane:
 	adrp	x2, .LANCHOR2
-	uxth	w0, w0
 	add	x2, x2, :lo12:.LANCHOR2
-	ldrh	w1, [x2,2300]
-	ldrh	w3, [x2,2342]
-	udiv	w2, w0, w1
-	udiv	w3, w0, w3
-	msub	w0, w2, w1, w0
-	madd	w0, w1, w3, w0
+	and	w3, w0, 65535
+	ldrh	w1, [x2, 2300]
+	ldrh	w2, [x2, 2342]
+	udiv	w0, w3, w1
+	udiv	w2, w3, w2
+	msub	w0, w0, w1, w3
+	madd	w0, w1, w2, w0
 	ret
 	.size	P2V_plane, .-P2V_plane
 	.align	2
 	.global	P2V_block_in_plane
 	.type	P2V_block_in_plane, %function
 P2V_block_in_plane:
-	adrp	x2, .LANCHOR2
-	uxth	w0, w0
-	add	x2, x2, :lo12:.LANCHOR2
-	ldrh	w3, [x2,2342]
-	udiv	w1, w0, w3
-	msub	w0, w1, w3, w0
-	ldrh	w1, [x2,2300]
-	uxth	w0, w0
+	adrp	x1, .LANCHOR2
+	add	x1, x1, :lo12:.LANCHOR2
+	and	w3, w0, 65535
+	ldrh	w2, [x1, 2342]
+	ldrh	w1, [x1, 2300]
+	udiv	w0, w3, w2
+	msub	w0, w0, w2, w3
+	and	w0, w0, 65535
 	udiv	w0, w0, w1
 	ret
 	.size	P2V_block_in_plane, .-P2V_block_in_plane
@@ -9455,91 +9313,88 @@ P2V_block_in_plane:
 ftl_cmp_data_ver:
 	cmp	w0, w1
 	mov	w2, -2147483648
-	bls	.L1571
+	bls	.L1531
 	sub	w1, w0, w1
 	cmp	w1, w2
 	cset	w0, ls
-	b	.L1572
-.L1571:
+	ret
+.L1531:
 	sub	w1, w1, w0
 	cmp	w1, w2
 	cset	w0, hi
-.L1572:
 	ret
 	.size	ftl_cmp_data_ver, .-ftl_cmp_data_ver
 	.align	2
 	.global	FtlGetLastWrittenPage
 	.type	FtlGetLastWrittenPage, %function
 FtlGetLastWrittenPage:
-	stp	x29, x30, [sp, -208]!
+	stp	x29, x30, [sp, -192]!
 	cmp	w1, 1
-	adrp	x3, .LANCHOR2
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	str	x25, [sp,64]
+	stp	x23, x24, [sp, 48]
 	mov	w23, w1
-	add	x3, x3, :lo12:.LANCHOR2
-	bne	.L1574
-	ldrh	w19, [x3,2346]
-	b	.L1575
-.L1574:
-	ldrh	w19, [x3,2344]
-.L1575:
+	stp	x19, x20, [sp, 16]
+	adrp	x1, .LANCHOR2
+	stp	x21, x22, [sp, 32]
+	add	x1, x1, :lo12:.LANCHOR2
+	bne	.L1534
+	ldrh	w19, [x1, 2346]
+.L1535:
 	sub	w19, w19, #1
 	lsl	w21, w0, 10
-	mov	w1, 1
-	mov	w2, w23
 	sxth	w19, w19
-	str	xzr, [x29,96]
+	add	x1, x29, 128
 	orr	w0, w19, w21
-	str	w0, [x29,92]
-	add	x0, x29, 88
-	add	x24, x29, 144
-	str	x24, [x29,104]
+	stp	xzr, x1, [x29, 80]
+	str	w0, [x29, 76]
+	mov	w2, w23
+	mov	w1, 1
+	add	x0, x29, 72
 	bl	FlashReadPages
-	ldr	w0, [x29,144]
+	ldr	w0, [x29, 128]
 	cmn	w0, #1
-	bne	.L1576
+	bne	.L1536
 	mov	w22, 0
-	mov	w25, 2
-.L1577:
+	mov	w24, 2
+.L1537:
 	cmp	w22, w19
-	bgt	.L1576
-	add	w3, w22, w19
-	mov	w1, 1
+	ble	.L1540
+.L1536:
+	mov	w0, w19
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 192
+	ret
+.L1534:
+	ldrh	w19, [x1, 2344]
+	b	.L1535
+.L1540:
+	add	w20, w22, w19
 	mov	w2, w23
-	sdiv	w20, w3, w25
+	mov	w1, 1
+	sdiv	w20, w20, w24
 	sxth	w0, w20
 	orr	w0, w0, w21
-	str	w0, [x29,92]
-	add	x0, x29, 88
+	str	w0, [x29, 76]
+	add	x0, x29, 72
 	bl	FlashReadPages
-	ldr	w0, [x24]
+	ldr	w0, [x29, 128]
 	cmn	w0, #1
-	bne	.L1578
-	ldr	w0, [x24,4]
+	bne	.L1538
+	ldr	w0, [x29, 132]
 	cmn	w0, #1
-	bne	.L1578
-	ldr	w0, [x29,88]
+	bne	.L1538
+	ldr	w0, [x29, 72]
 	cmn	w0, #1
-	beq	.L1578
+	beq	.L1538
 	sub	w19, w20, #1
 	sxth	w19, w19
-	b	.L1577
-.L1578:
+	b	.L1537
+.L1538:
 	add	w20, w20, 1
 	sxth	w22, w20
-	b	.L1577
-.L1576:
-	mov	w0, w19
-	ldr	x25, [sp,64]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 208
-	ret
+	b	.L1537
 	.size	FtlGetLastWrittenPage, .-FtlGetLastWrittenPage
 	.align	2
 	.global	FtlLoadBbt
@@ -9547,185 +9402,183 @@ FtlGetLastWrittenPage:
 FtlLoadBbt:
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	stp	x23, x24, [sp,48]
+	stp	x23, x24, [sp, 48]
 	add	x23, x19, :lo12:.LANCHOR2
-	mov	w24, 61649
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	add	x21, x23, 2936
-	ldr	x0, [x23,2576]
-	ldr	x22, [x23,2640]
-	str	x0, [x21,8]
-	str	x22, [x21,16]
+	mov	w24, 61649
+	ldr	x0, [x23, 2576]
+	ldr	x22, [x23, 2640]
+	stp	x0, x22, [x21, 8]
 	bl	FtlBbtMemInit
-	ldrh	w20, [x23,2342]
+	ldrh	w20, [x23, 2342]
 	sub	w20, w20, #1
-	uxth	w20, w20
-.L1585:
-	ldrh	w0, [x23,2342]
+	and	w20, w20, 65535
+.L1546:
+	ldrh	w0, [x23, 2342]
 	sub	w0, w0, #48
 	cmp	w20, w0
-	ble	.L1588
+	ble	.L1549
 	lsl	w0, w20, 10
-	mov	w1, 1
-	str	w0, [x21,4]
-	mov	w2, w1
+	mov	w2, 1
+	str	w0, [x21, 4]
+	mov	w1, w2
 	mov	x0, x21
 	bl	FlashReadPages
 	ldr	w0, [x21]
 	cmn	w0, #1
-	bne	.L1586
-	ldr	w0, [x21,4]
-	mov	w1, 1
-	mov	w2, w1
+	bne	.L1547
+	ldr	w0, [x21, 4]
+	mov	w2, 1
+	mov	w1, w2
 	add	w0, w0, 1
-	str	w0, [x21,4]
+	str	w0, [x21, 4]
 	mov	x0, x21
 	bl	FlashReadPages
-.L1586:
+.L1547:
 	ldr	w0, [x21]
 	cmn	w0, #1
-	beq	.L1587
+	beq	.L1548
 	ldrh	w0, [x22]
 	cmp	w0, w24
-	bne	.L1587
-	ldr	w1, [x22,4]
-	str	w1, [x23,2832]
-	strh	w20, [x23,2824]
-	ldrh	w1, [x22,8]
-	strh	w1, [x23,2828]
-	b	.L1588
-.L1587:
-	sub	w20, w20, #1
-	uxth	w20, w20
-	b	.L1585
-.L1588:
+	bne	.L1548
+	ldr	w1, [x22, 4]
+	str	w1, [x23, 2832]
+	strh	w20, [x23, 2824]
+	ldrh	w1, [x22, 8]
+	strh	w1, [x23, 2828]
+.L1549:
 	add	x21, x19, :lo12:.LANCHOR2
-	mov	w2, 65535
-	mov	w0, -1
-	ldrh	w1, [x21,2824]
-	cmp	w1, w2
-	beq	.L1590
-	ldrh	w1, [x21,2828]
-	cmp	w1, w2
-	beq	.L1592
+	mov	w0, 65535
+	ldrh	w1, [x21, 2824]
+	cmp	w1, w0
+	beq	.L1563
+	ldrh	w1, [x21, 2828]
+	cmp	w1, w0
+	beq	.L1553
 	add	x0, x21, 2936
 	lsl	w1, w1, 10
-	str	w1, [x0,4]
-	mov	w1, 1
-	mov	w2, w1
+	mov	w2, 1
+	str	w1, [x0, 4]
+	mov	w1, w2
 	bl	FlashReadPages
-	ldr	w0, [x21,2936]
+	ldr	w0, [x21, 2936]
 	cmn	w0, #1
-	beq	.L1592
+	beq	.L1553
 	ldrh	w1, [x22]
 	mov	w0, 61649
 	cmp	w1, w0
-	bne	.L1592
-	ldr	w0, [x22,4]
-	ldr	w1, [x21,2832]
+	bne	.L1553
+	ldr	w1, [x21, 2832]
+	ldr	w0, [x22, 4]
 	cmp	w0, w1
-	bls	.L1592
-	str	w0, [x21,2832]
-	ldrh	w1, [x21,2828]
-	ldrh	w0, [x22,8]
-	strh	w1, [x21,2824]
-	strh	w0, [x21,2828]
-.L1592:
+	bls	.L1553
+	str	w0, [x21, 2832]
+	ldrh	w1, [x21, 2828]
+	ldrh	w0, [x22, 8]
+	strh	w1, [x21, 2824]
+	strh	w0, [x21, 2828]
+.L1553:
 	add	x20, x19, :lo12:.LANCHOR2
 	mov	w1, 1
 	add	x23, x20, 2936
 	mov	w24, 61649
-	ldrh	w0, [x20,2824]
+	ldrh	w0, [x20, 2824]
 	bl	FtlGetLastWrittenPage
 	sxth	w21, w0
 	add	w0, w0, 1
-	strh	w0, [x20,2826]
-.L1594:
-	tbnz	w21, #31, .L1599
-	ldrh	w0, [x20,2824]
-	mov	w1, 1
-	mov	w2, w1
+	strh	w0, [x20, 2826]
+.L1555:
+	tbnz	w21, #31, .L1560
+	ldrh	w0, [x20, 2824]
+	mov	w2, 1
+	mov	w1, w2
 	orr	w0, w21, w0, lsl 10
-	str	w0, [x23,4]
-	ldr	x0, [x20,2576]
-	str	x0, [x23,8]
+	str	w0, [x23, 4]
+	ldr	x0, [x20, 2576]
+	str	x0, [x23, 8]
 	mov	x0, x23
 	bl	FlashReadPages
 	ldr	w0, [x23]
 	cmn	w0, #1
-	beq	.L1595
+	beq	.L1556
 	ldrh	w0, [x22]
 	cmp	w0, w24
-	bne	.L1595
-.L1599:
+	bne	.L1556
+.L1560:
 	add	x1, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x22,10]
+	ldrh	w0, [x22, 10]
 	mov	w2, 65535
-	strh	w0, [x1,2830]
-	ldrh	w0, [x22,12]
+	strh	w0, [x1, 2830]
+	ldrh	w0, [x22, 12]
 	cmp	w0, w2
-	bne	.L1596
-	b	.L1597
-.L1595:
+	bne	.L1557
+.L1558:
+	add	x19, x19, :lo12:.LANCHOR2
+	mov	w20, 0
+	add	x21, x19, 2856
+.L1561:
+	ldrh	w0, [x19, 2298]
+	cmp	w20, w0
+	bcc	.L1562
+	mov	w0, 0
+.L1545:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 64
+	ret
+.L1548:
+	sub	w20, w20, #1
+	and	w20, w20, 65535
+	b	.L1546
+.L1556:
 	sub	w21, w21, #1
 	sxth	w21, w21
-	b	.L1594
-.L1596:
-	ldr	w2, [x1,2272]
+	b	.L1555
+.L1557:
+	ldr	w2, [x1, 2272]
 	cmp	w0, w2
-	beq	.L1597
-	ldrh	w1, [x1,2286]
+	beq	.L1558
+	ldrh	w1, [x1, 2286]
 	lsr	w1, w1, 2
-	cmp	w0, w1
-	bcs	.L1597
 	cmp	w2, w1
-	bcs	.L1597
+	bcs	.L1558
+	cmp	w0, w1
+	bcs	.L1558
 	bl	FtlSysBlkNumInit
-.L1597:
-	add	x19, x19, :lo12:.LANCHOR2
-	mov	x20, 0
-	add	x21, x19, 2824
-.L1600:
-	ldrh	w0, [x19,2298]
-	mov	w1, w20
-	add	x20, x20, 1
-	cmp	w1, w0
-	bcs	.L1618
-	ldrh	w2, [x19,2816]
-	add	x0, x21, x20, lsl 3
-	ldr	x3, [x19,2944]
-	mul	w1, w1, w2
-	ldr	x0, [x0,24]
+	b	.L1558
+.L1562:
+	ldrh	w2, [x19, 2816]
+	ldr	x0, [x19, 2944]
+	mul	w1, w2, w20
 	lsl	w2, w2, 2
-	add	x1, x3, x1, lsl 2
+	add	w20, w20, 1
+	add	x1, x0, x1, lsl 2
+	ldr	x0, [x21], 8
 	bl	ftl_memcpy
-	b	.L1600
-.L1618:
-	mov	w0, 0
-.L1590:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 64
-	ret
+	b	.L1561
+.L1563:
+	mov	w0, -1
+	b	.L1545
 	.size	FtlLoadBbt, .-FtlLoadBbt
 	.align	2
 	.global	FtlFreeSysBlkQueueInit
 	.type	FtlFreeSysBlkQueueInit, %function
 FtlFreeSysBlkQueueInit:
-	adrp	x1, .LANCHOR2
-	mov	w2, 2048
 	stp	x29, x30, [sp, -16]!
-	add	x1, x1, :lo12:.LANCHOR2
+	adrp	x3, .LANCHOR2
+	add	x3, x3, :lo12:.LANCHOR2
+	mov	w2, 2048
 	add	x29, sp, 0
-	strh	w0, [x1,2992]
-	add	x0, x1, 3000
-	strh	wzr, [x1,2994]
-	strh	wzr, [x1,2996]
-	strh	wzr, [x1,2998]
 	mov	w1, 0
+	strh	w0, [x3, 2992]
+	add	x0, x3, 3000
+	strh	wzr, [x3, 2994]
+	strh	wzr, [x3, 2996]
+	strh	wzr, [x3, 2998]
 	bl	ftl_memset
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
@@ -9736,8 +9589,8 @@ FtlFreeSysBlkQueueInit:
 	.type	FtlFreeSysBlkQueueEmpty, %function
 FtlFreeSysBlkQueueEmpty:
 	adrp	x0, .LANCHOR2+2998
-	ldrh	w0, [x0,#:lo12:.LANCHOR2+2998]
-	cmp	w0, wzr
+	ldrh	w0, [x0, #:lo12:.LANCHOR2+2998]
+	cmp	w0, 0
 	cset	w0, eq
 	ret
 	.size	FtlFreeSysBlkQueueEmpty, .-FtlFreeSysBlkQueueEmpty
@@ -9746,7 +9599,7 @@ FtlFreeSysBlkQueueEmpty:
 	.type	FtlFreeSysBlkQueueFull, %function
 FtlFreeSysBlkQueueFull:
 	adrp	x0, .LANCHOR2+2998
-	ldrh	w0, [x0,#:lo12:.LANCHOR2+2998]
+	ldrh	w0, [x0, #:lo12:.LANCHOR2+2998]
 	cmp	w0, 1024
 	cset	w0, eq
 	ret
@@ -9756,57 +9609,57 @@ FtlFreeSysBlkQueueFull:
 	.type	FtlFreeSysBlkQueueIn, %function
 FtlFreeSysBlkQueueIn:
 	stp	x29, x30, [sp, -48]!
-	uxth	w1, w1
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	stp	x19, x20, [sp,16]
-	uxth	w21, w0
-	mov	w0, 65533
+	stp	x21, x22, [sp, 32]
+	and	w21, w0, 65535
+	stp	x19, x20, [sp, 16]
 	sub	w2, w21, #1
+	mov	w0, 65533
 	cmp	w0, w2, uxth
-	bcc	.L1622
-	adrp	x2, .LANCHOR2
-	add	x20, x2, :lo12:.LANCHOR2
-	mov	x19, x2
-	ldrh	w0, [x20,2998]
-	cmp	w0, 1024
-	beq	.L1622
-	cbz	w1, .L1624
-	ldr	w0, [x20,2928]
-	cbnz	w0, .L1624
+	bcc	.L1578
+	adrp	x0, .LANCHOR2
+	add	x20, x0, :lo12:.LANCHOR2
+	mov	x19, x0
+	ldrh	w2, [x20, 2998]
+	cmp	w2, 1024
+	beq	.L1578
+	and	w1, w1, 65535
+	cbz	w1, .L1580
+	ldr	w0, [x20, 2928]
+	cbnz	w0, .L1580
 	mov	w0, w21
 	bl	P2V_block_in_plane
-	uxth	w22, w0
-	ldr	x0, [x20,2544]
+	and	w22, w0, 65535
+	ldr	x0, [x20, 2544]
 	lsl	w1, w21, 10
-	str	w1, [x0,4]
-	mov	w1, 1
-	mov	w2, w1
-	ldr	x0, [x20,2544]
+	mov	w2, 1
+	str	w1, [x0, 4]
+	mov	w1, w2
+	ldr	x0, [x20, 2544]
 	bl	FlashEraseBlocks
+	ldr	x2, [x20, 2696]
 	ubfiz	x0, x22, 1, 16
-	ldr	x2, [x20,2696]
-	ldrh	w1, [x2,x0]
+	ldrh	w1, [x2, x0]
 	add	w1, w1, 1
-	strh	w1, [x2,x0]
-	ldr	w0, [x20,2436]
-	add	w0, w0, 1
-	str	w0, [x20,2436]
-.L1624:
-	add	x1, x19, :lo12:.LANCHOR2
-	add	x1, x1, 2992
-	ldrh	w0, [x1,6]
-	ldrh	w2, [x1,4]
+	strh	w1, [x2, x0]
+	ldr	w0, [x20, 2436]
 	add	w0, w0, 1
-	strh	w0, [x1,6]
-	add	x0, x1, w2, sxtw 1
-	add	w2, w2, 1
-	and	w2, w2, 1023
-	strh	w21, [x0,8]
-	strh	w2, [x1,4]
-.L1622:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
+	str	w0, [x20, 2436]
+.L1580:
+	add	x0, x19, :lo12:.LANCHOR2
+	add	x0, x0, 2992
+	ldrh	w1, [x0, 6]
+	add	w1, w1, 1
+	strh	w1, [x0, 6]
+	ldrh	w1, [x0, 4]
+	add	x2, x0, w1, sxtw 1
+	add	w1, w1, 1
+	and	w1, w1, 1023
+	strh	w1, [x0, 4]
+	strh	w21, [x2, 8]
+.L1578:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	FtlFreeSysBlkQueueIn, .-FtlFreeSysBlkQueueIn
@@ -9814,378 +9667,358 @@ FtlFreeSysBlkQueueIn:
 	.global	FtlLowFormatEraseBlock
 	.type	FtlLowFormatEraseBlock, %function
 FtlLowFormatEraseBlock:
-	stp	x29, x30, [sp, -128]!
+	stp	x29, x30, [sp, -144]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	adrp	x21, .LANCHOR2
-	stp	x27, x28, [sp,80]
-	add	x28, x21, :lo12:.LANCHOR2
-	stp	x25, x26, [sp,64]
-	uxth	w25, w0
-	ldr	w2, [x28,2928]
-	ldrb	w0, [x28,2094]
-	stp	x23, x24, [sp,48]
-	str	w0, [x29,120]
-	uxtb	w24, w1
-	stp	x19, x20, [sp,16]
-	mov	w0, 0
-	cbnz	w2, .L1632
-	ldrb	w0, [x28,1220]
-	mov	w26, w2
-	str	w0, [x29,124]
-	mov	w20, w2
-	str	w25, [x28,2468]
-	mov	w19, w2
-	mov	w23, 56
-	mov	w27, 4
-.L1633:
-	ldrh	w0, [x28,2276]
-	cmp	w0, w26
-	bls	.L1677
-	umull	x0, w26, w23
-	ldr	x1, [x28,2544]
-	str	wzr, [x1,x0]
-	add	x0, x28, 2304
-	mov	w1, w25
-	ldrb	w0, [x0,w26,sxtw]
-	bl	V2P_block
-	uxth	w22, w0
-	mov	w1, w22
-	cbz	w24, .L1634
-	str	x1, [x29,112]
-	bl	IsBlkInVendorPart
-	ldr	x1, [x29,112]
-	cbnz	w0, .L1635
-.L1634:
-	mov	w0, w1
-	bl	FtlBbmIsBadBlock
-	cbnz	w0, .L1636
-	umull	x0, w20, w23
-	ldr	x1, [x28,2544]
-	lsl	w22, w22, 10
-	add	x1, x1, x0
-	str	w22, [x1,4]
-	ldr	x1, [x28,2544]
-	ldr	x3, [x28,2648]
-	add	x1, x1, x0
-	ldrh	w0, [x28,2356]
-	mul	w0, w20, w0
-	add	w20, w20, 1
-	str	xzr, [x1,8]
-	sdiv	w0, w0, w27
-	uxth	w20, w20
-	add	x0, x3, w0, sxtw 2
-	str	x0, [x1,16]
-	b	.L1635
-.L1636:
-	add	w19, w19, 1
-	uxth	w19, w19
-.L1635:
-	add	w2, w26, 1
-	uxth	w26, w2
-	b	.L1633
-.L1677:
-	cbz	w20, .L1656
-	ldr	w0, [x29,124]
-	mov	w2, w20
-	strb	wzr, [x28,2094]
-	mov	x23, 0
-	cmp	w0, wzr
-	ldr	x0, [x28,2544]
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR2
+	stp	x21, x22, [sp, 32]
+	add	x21, x20, :lo12:.LANCHOR2
+	stp	x25, x26, [sp, 64]
+	and	w25, w0, 65535
+	stp	x23, x24, [sp, 48]
+	stp	x27, x28, [sp, 80]
+	ldr	w0, [x21, 2928]
+	cbnz	w0, .L1611
+	ldrb	w8, [x21, 1220]
+	and	w24, w1, 255
+	ldrb	w0, [x21, 2094]
+	add	x9, x21, 2304
+	mov	w5, 0
+	mov	w23, 0
+	mov	w19, 0
+	mov	w7, 56
+	mov	w10, 4
+	str	w25, [x21, 2468]
+	str	w0, [x29, 132]
+.L1590:
+	ldrh	w0, [x21, 2276]
+	cmp	w0, w5
+	bhi	.L1594
+	cbz	w23, .L1588
+	ldr	x0, [x21, 2544]
+	cmp	w8, 0
 	cset	w22, ne
-	mov	x26, 56
+	strb	wzr, [x21, 2094]
+	mov	w2, w23
 	mov	w1, w22
+	add	x26, x20, :lo12:.LANCHOR2
 	bl	FlashEraseBlocks
-	ldrb	w0, [x29,120]
-	strb	w0, [x28,2094]
-.L1639:
-	cmp	w20, w23, uxth
-	bls	.L1678
-	add	x1, x21, :lo12:.LANCHOR2
-	mul	x0, x23, x26
-	ldr	x1, [x1,2544]
-	add	x2, x1, x0
-	ldr	w0, [x1,x0]
+	ldrb	w0, [x29, 132]
+	strb	w0, [x21, 2094]
+	mov	w21, 56
+	umull	x21, w23, w21
+	mov	x23, 0
+.L1597:
+	ldr	x0, [x26, 2544]
+	add	x1, x0, x23
+	ldr	w0, [x0, x23]
 	cmn	w0, #1
-	bne	.L1640
-	ldr	w0, [x2,4]
+	bne	.L1596
+	ldr	w0, [x1, 4]
 	add	w19, w19, 1
+	and	w19, w19, 65535
 	lsr	w0, w0, 10
-	uxth	w19, w19
 	bl	FtlBbmMapBadBlock
-.L1640:
-	add	x23, x23, 1
-	b	.L1639
-.L1678:
-	cbnz	w24, .L1642
+.L1596:
+	add	x23, x23, 56
+	cmp	x21, x23
+	bne	.L1597
+	cbnz	w24, .L1598
+	and	w22, w22, 65535
 	mov	w0, 1
-	uxth	w22, w22
 	mov	w27, 6
-	str	w0, [x29,124]
-	b	.L1643
-.L1642:
-	add	x0, x21, :lo12:.LANCHOR2
-	ldrh	w1, [x0,2346]
-	ldrb	w0, [x0,1220]
-	str	w1, [x29,124]
-	cbnz	w0, .L1659
-	uxtw	x0, w1
-	mov	w22, 1
-	lsr	w27, w0, 2
-	b	.L1643
-.L1659:
-	mov	w22, 1
-	mov	w27, w22
-.L1643:
+	str	w0, [x29, 136]
+.L1599:
+	add	x26, x20, :lo12:.LANCHOR2
 	mov	w23, 0
-	add	x28, x21, :lo12:.LANCHOR2
-.L1652:
-	mov	w26, 0
-	mov	w20, w26
-.L1644:
-	ldrh	w0, [x28,2276]
-	cmp	w0, w26
-	bls	.L1679
-	mov	w0, 56
-	ldr	x1, [x28,2544]
-	umull	x0, w26, w0
-	str	wzr, [x1,x0]
-	add	x0, x28, 2304
-	mov	w1, w25
-	ldrb	w0, [x0,w26,sxtw]
-	bl	V2P_block
-	uxth	w2, w0
-	str	w2, [x29,112]
-	mov	w1, w2
-	cbz	w24, .L1645
-	str	x1, [x29,104]
-	bl	IsBlkInVendorPart
-	ldr	x1, [x29,104]
-	cbnz	w0, .L1646
-.L1645:
-	mov	w0, w1
-	bl	FtlBbmIsBadBlock
-	cbnz	w0, .L1646
-	mov	w0, 56
-	ldr	x1, [x28,2544]
-	ldr	w2, [x29,112]
-	umull	x0, w20, w0
-	add	x1, x1, x0
-	add	w2, w23, w2, lsl 10
-	str	w2, [x1,4]
-	mov	w2, 4
-	ldr	x1, [x28,2544]
-	add	x1, x1, x0
-	ldr	x0, [x28,2616]
-	str	x0, [x1,8]
-	ldrh	w0, [x28,2356]
-	mul	w0, w20, w0
-	add	w20, w20, 1
-	sdiv	w0, w0, w2
-	uxth	w20, w20
-	ldr	x2, [x28,2624]
-	add	x0, x2, w0, sxtw 2
-	str	x0, [x1,16]
-.L1646:
-	add	w3, w26, 1
-	uxth	w26, w3
-	b	.L1644
-.L1679:
-	cbz	w20, .L1656
-	ldr	x0, [x28,2544]
-	mov	w1, w20
+	add	x0, x26, 2304
+	mov	w28, 56
+	str	x0, [x29, 120]
+.L1607:
+	mov	w5, 0
+	mov	w21, 0
+	mov	w7, 4
+.L1600:
+	ldrh	w0, [x26, 2276]
+	cmp	w0, w5
+	bhi	.L1603
+	cbz	w21, .L1588
+	ldr	x0, [x26, 2544]
 	mov	w2, w22
+	mov	w1, w21
+	strb	wzr, [x26, 2094]
 	mov	w3, 1
-	strb	wzr, [x28,2094]
 	bl	FlashProgPages
-	ldrb	w0, [x29,120]
-	mov	x1, 0
-	strb	w0, [x28,2094]
-.L1649:
-	cmp	w20, w1, uxth
-	bls	.L1680
-	mov	x0, 56
-	ldr	x2, [x28,2544]
-	mul	x0, x1, x0
-	add	x3, x2, x0
-	ldr	w0, [x2,x0]
-	cbz	w0, .L1650
-	ldr	w0, [x3,4]
+	umull	x1, w21, w28
+	ldrb	w0, [x29, 132]
+	strb	w0, [x26, 2094]
+	mov	x2, 0
+.L1606:
+	ldr	x0, [x26, 2544]
+	add	x3, x0, x2
+	ldr	w0, [x0, x2]
+	cbz	w0, .L1605
+	ldr	w0, [x3, 4]
 	add	w19, w19, 1
-	str	x1, [x29,112]
+	stp	x2, x1, [x29, 104]
+	and	w19, w19, 65535
 	lsr	w0, w0, 10
-	uxth	w19, w19
 	bl	FtlBbmMapBadBlock
-	ldr	x1, [x29,112]
-.L1650:
-	add	x1, x1, 1
-	b	.L1649
-.L1680:
+	ldp	x2, x1, [x29, 104]
+.L1605:
+	add	x2, x2, 56
+	cmp	x1, x2
+	bne	.L1606
 	add	w23, w23, w27
-	ldr	w0, [x29,124]
-	uxth	w23, w23
-	cmp	w23, w0
-	bcc	.L1652
+	ldr	w0, [x29, 136]
+	and	w23, w23, 65535
+	cmp	w0, w23
+	bhi	.L1607
+	add	x26, x20, :lo12:.LANCHOR2
 	mov	x23, 0
-	mov	x26, 56
-.L1653:
-	cmp	w20, w23, uxth
-	bls	.L1681
-	cbz	w24, .L1654
-	add	x1, x21, :lo12:.LANCHOR2
-	mul	x0, x23, x26
-	ldr	x1, [x1,2544]
-	add	x2, x1, x0
-	ldr	w0, [x1,x0]
-	cbnz	w0, .L1654
-	ldr	w0, [x2,4]
+.L1609:
+	cbz	w24, .L1608
+	ldr	x0, [x26, 2544]
+	add	x1, x0, x23
+	ldr	w0, [x0, x23]
+	cbnz	w0, .L1608
+	ldr	w0, [x1, 4]
 	mov	w1, 1
+	str	x2, [x29, 136]
 	lsr	w0, w0, 10
 	bl	FtlFreeSysBlkQueueIn
-.L1654:
-	add	x23, x23, 1
-	b	.L1653
-.L1681:
+	ldr	x2, [x29, 136]
+.L1608:
+	add	x23, x23, 56
+	cmp	x23, x2
+	bne	.L1609
 	cmp	w25, 63
-	bls	.L1660
-	cbz	w24, .L1656
-.L1660:
-	add	x21, x21, :lo12:.LANCHOR2
+	ccmp	w24, 0, 0, hi
+	beq	.L1588
+	add	x20, x20, :lo12:.LANCHOR2
+	mov	w2, w21
 	mov	w1, w22
-	mov	w2, w20
-	ldr	x0, [x21,2544]
+	ldr	x0, [x20, 2544]
 	bl	FlashEraseBlocks
-.L1656:
+.L1588:
 	mov	w0, w19
-.L1632:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 144
 	ret
+.L1594:
+	umull	x0, w5, w7
+	ldr	x1, [x21, 2544]
+	str	wzr, [x1, x0]
+	mov	w1, w25
+	ldrb	w0, [x9, w5, sxtw]
+	bl	V2P_block
+	and	w6, w0, 65535
+	mov	w11, w6
+	cbz	w24, .L1591
+	bl	IsBlkInVendorPart
+	cbnz	w0, .L1592
+.L1591:
+	mov	w0, w11
+	bl	FtlBbmIsBadBlock
+	cbnz	w0, .L1593
+	umull	x2, w23, w7
+	ldr	x0, [x21, 2544]
+	lsl	w6, w6, 10
+	add	x0, x0, x2
+	str	w6, [x0, 4]
+	ldrh	w0, [x21, 2356]
+	ldr	x1, [x21, 2544]
+	add	x1, x1, x2
+	ldr	x2, [x21, 2648]
+	mul	w0, w0, w23
+	add	w23, w23, 1
+	and	w23, w23, 65535
+	sdiv	w0, w0, w10
+	add	x0, x2, w0, sxtw 2
+	stp	xzr, x0, [x1, 8]
+.L1592:
+	add	w5, w5, 1
+	and	w5, w5, 65535
+	b	.L1590
+.L1593:
+	add	w19, w19, 1
+	and	w19, w19, 65535
+	b	.L1592
+.L1598:
+	add	x0, x20, :lo12:.LANCHOR2
+	ldrh	w1, [x0, 2346]
+	ldrb	w0, [x0, 1220]
+	str	w1, [x29, 136]
+	cbnz	w0, .L1612
+	uxtw	x0, w1
+	mov	w22, 1
+	lsr	w27, w0, 2
+	b	.L1599
+.L1612:
+	mov	w22, 1
+	mov	w27, w22
+	b	.L1599
+.L1603:
+	umull	x0, w5, w28
+	ldr	x1, [x26, 2544]
+	str	wzr, [x1, x0]
+	mov	w1, w25
+	ldr	x0, [x29, 120]
+	ldrb	w0, [x0, w5, sxtw]
+	bl	V2P_block
+	and	w6, w0, 65535
+	mov	w8, w6
+	cbz	w24, .L1601
+	bl	IsBlkInVendorPart
+	cbnz	w0, .L1602
+.L1601:
+	mov	w0, w8
+	bl	FtlBbmIsBadBlock
+	cbnz	w0, .L1602
+	umull	x2, w21, w28
+	ldr	x0, [x26, 2544]
+	add	w6, w23, w6, lsl 10
+	add	x0, x0, x2
+	str	w6, [x0, 4]
+	ldr	x1, [x26, 2544]
+	ldr	x0, [x26, 2616]
+	add	x1, x1, x2
+	ldr	x2, [x26, 2624]
+	str	x0, [x1, 8]
+	ldrh	w0, [x26, 2356]
+	mul	w0, w0, w21
+	add	w21, w21, 1
+	and	w21, w21, 65535
+	sdiv	w0, w0, w7
+	add	x0, x2, w0, sxtw 2
+	str	x0, [x1, 16]
+.L1602:
+	add	w5, w5, 1
+	and	w5, w5, 65535
+	b	.L1600
+.L1611:
+	mov	w19, 0
+	b	.L1588
 	.size	FtlLowFormatEraseBlock, .-FtlLowFormatEraseBlock
 	.align	2
 	.global	FtlFreeSysBLkSort
 	.type	FtlFreeSysBLkSort, %function
 FtlFreeSysBLkSort:
-	adrp	x0, .LANCHOR4+724
-	ldrh	w6, [x0,#:lo12:.LANCHOR4+724]
 	adrp	x0, .LANCHOR2
 	add	x1, x0, :lo12:.LANCHOR2
 	add	x1, x1, 2992
-	ldrh	w2, [x1,6]
-	cbz	w2, .L1682
-	mov	w5, 0
-	ldrh	w3, [x1,2]
-	ldrh	w2, [x1,4]
-	mov	w4, w5
-	and	w6, w6, 31
-.L1684:
-	cmp	w4, w6
-	bge	.L1692
-	add	x5, x1, w3, sxtw 1
-	ldrh	w7, [x5,8]
-	add	x5, x1, w2, sxtw 1
+	ldrh	w2, [x1, 6]
+	cbz	w2, .L1633
+	adrp	x2, .LANCHOR4+724
+	ldrh	w3, [x1, 2]
+	mov	w6, 0
+	mov	w4, 0
+	ldrh	w5, [x2, #:lo12:.LANCHOR4+724]
+	ldrh	w2, [x1, 4]
+	and	w5, w5, 31
+.L1635:
+	cmp	w5, w4
+	bgt	.L1636
+	cbz	w6, .L1633
+	add	x0, x0, :lo12:.LANCHOR2
+	strh	w3, [x0, 2994]
+	strh	w2, [x0, 2996]
+.L1633:
+	ret
+.L1636:
+	add	x6, x1, w3, sxtw 1
 	add	w4, w4, 1
-	strh	w7, [x5,8]
-	mov	w5, 1
 	add	w3, w3, 1
-	add	w2, w2, w5
-	uxth	w4, w4
+	and	w4, w4, 65535
 	and	w3, w3, 1023
+	ldrh	w7, [x6, 8]
+	add	x6, x1, w2, sxtw 1
+	strh	w7, [x6, 8]
+	mov	w6, 1
+	add	w2, w2, w6
 	and	w2, w2, 1023
-	b	.L1684
-.L1692:
-	cbz	w5, .L1682
-	add	x0, x0, :lo12:.LANCHOR2
-	strh	w3, [x0,2994]
-	strh	w2, [x0,2996]
-.L1682:
-	ret
+	b	.L1635
 	.size	FtlFreeSysBLkSort, .-FtlFreeSysBLkSort
 	.align	2
 	.global	FtlFreeSysBlkQueueOut
 	.type	FtlFreeSysBlkQueueOut, %function
 FtlFreeSysBlkQueueOut:
-	stp	x29, x30, [sp, -96]!
+	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	stp	x23, x24, [sp,48]
 	add	x19, x19, :lo12:.LANCHOR2
-	adrp	x23, .LC37
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	add	x21, x19, 2992
-	mov	w24, 65533
-	add	x23, x23, :lo12:.LC37
-.L1694:
-	ldrh	w1, [x21,6]
-	adrp	x22, .LANCHOR2
-	cbz	w1, .L1695
-	ldrh	w2, [x21,2]
-	sub	w1, w1, #1
-	add	x0, x21, w2, sxtw 1
-	strh	w1, [x21,6]
-	add	w2, w2, 1
-	ldr	w1, [x19,2928]
-	and	w2, w2, 1023
-	strh	w2, [x21,2]
-	ldrh	w20, [x0,8]
-	cbnz	w1, .L1696
+	stp	x21, x22, [sp, 32]
+	str	x23, [sp, 48]
+	mov	x21, x19
+	add	x23, x19, 2992
+.L1643:
+	ldrh	w2, [x19, 2998]
+	add	x1, x19, 2992
+	cbz	w2, .L1644
+	ldrh	w0, [x19, 2994]
+	sub	w2, w2, #1
+	strh	w2, [x19, 2998]
+	add	x3, x1, w0, sxtw 1
+	add	w0, w0, 1
+	and	w0, w0, 1023
+	strh	w0, [x19, 2994]
+	ldr	w0, [x19, 2928]
+	ldrh	w20, [x3, 8]
+	cbnz	w0, .L1645
 	mov	w0, w20
-	str	x1, [x29,88]
 	bl	P2V_block_in_plane
-	uxth	w26, w0
-	ldr	x0, [x19,2544]
-	lsl	w2, w20, 10
-	ldr	x1, [x29,88]
-	str	w2, [x0,4]
-	ldrb	w0, [x19,1220]
-	cbz	w0, .L1697
-	ldr	x0, [x19,2544]
+	and	w22, w0, 65535
+	ldr	x0, [x19, 2544]
+	lsl	w1, w20, 10
+	str	w1, [x0, 4]
+	ldrb	w0, [x19, 1220]
+	cbz	w0, .L1646
+	ldr	x0, [x19, 2544]
 	mov	w2, 1
+	mov	w1, 0
 	bl	FlashEraseBlocks
-.L1697:
-	add	x25, x22, :lo12:.LANCHOR2
-	mov	w1, 1
-	mov	w2, w1
-	ldr	x0, [x25,2544]
+.L1646:
+	ldr	x0, [x21, 2544]
+	mov	w2, 1
+	mov	w1, w2
 	bl	FlashEraseBlocks
-	ubfiz	x0, x26, 1, 16
-	ldr	x2, [x25,2696]
-	ldrh	w1, [x2,x0]
+	ldr	x2, [x21, 2696]
+	ubfiz	x0, x22, 1, 16
+	ldrh	w1, [x2, x0]
 	add	w1, w1, 1
-	strh	w1, [x2,x0]
-	ldr	w0, [x25,2436]
+	strh	w1, [x2, x0]
+	ldr	w0, [x21, 2436]
 	add	w0, w0, 1
-	str	w0, [x25,2436]
-	b	.L1696
-.L1695:
-	adrp	x0, .LC36
-	add	x0, x0, :lo12:.LC36
-	bl	printk
-.L1698:
-	b	.L1698
-.L1696:
+	str	w0, [x21, 2436]
+.L1645:
 	sub	w0, w20, #1
-	cmp	w24, w0, uxth
-	bcs	.L1699
-	add	x22, x22, :lo12:.LANCHOR2
-	mov	x0, x23
+	mov	w1, 65533
+	cmp	w1, w0, uxth
+	bcs	.L1648
+	ldrh	w2, [x23, 6]
 	mov	w1, w20
-	ldrh	w2, [x22,2998]
+	adrp	x0, .LC37
+	add	x0, x0, :lo12:.LC37
 	bl	printk
-	b	.L1694
-.L1699:
+	b	.L1643
+.L1644:
+	adrp	x0, .LC36
+	mov	w1, 0
+	add	x0, x0, :lo12:.LC36
+	bl	printk
+.L1647:
+	b	.L1647
+.L1648:
 	mov	w0, w20
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 96
+	ldr	x23, [sp, 48]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 64
 	ret
 	.size	FtlFreeSysBlkQueueOut, .-FtlFreeSysBlkQueueOut
 	.align	2
@@ -10195,137 +10028,138 @@ test_node_in_list:
 	ldr	x2, [x0]
 	adrp	x0, .LANCHOR2+2808
 	mov	x4, -6148914691236517206
-	uxth	w1, w1
+	and	w1, w1, 65535
+	ldr	x3, [x0, #:lo12:.LANCHOR2+2808]
+	movk	x4, 0xaaab, lsl 0
 	mov	w5, 65535
-	ldr	x3, [x0,#:lo12:.LANCHOR2+2808]
 	sub	x0, x2, x3
 	asr	x0, x0, 1
-	madd	x0, x4, x0, x0
+	mul	x0, x0, x4
 	mov	w4, 6
-	uxth	w0, w0
-.L1705:
-	cmp	w1, w0
-	beq	.L1706
+	and	w0, w0, 65535
+.L1655:
+	cmp	w0, w1
+	beq	.L1656
 	ldrh	w0, [x2]
 	cmp	w0, w5
-	beq	.L1707
-	umull	x2, w0, w4
-	add	x2, x3, x2
-	b	.L1705
-.L1706:
+	beq	.L1657
+	umaddl	x2, w0, w4, x3
+	b	.L1655
+.L1656:
 	mov	w0, 1
-	b	.L1704
-.L1707:
+	ret
+.L1657:
 	mov	w0, 0
-.L1704:
 	ret
 	.size	test_node_in_list, .-test_node_in_list
 	.align	2
 	.global	insert_data_list
 	.type	insert_data_list, %function
 insert_data_list:
-	sub	sp, sp, #16
-	adrp	x10, .LANCHOR2
-	add	x3, x10, :lo12:.LANCHOR2
-	uxth	w0, w0
-	str	x19, [sp]
-	ldrh	w1, [x3,2284]
+	adrp	x11, .LANCHOR2
+	add	x3, x11, :lo12:.LANCHOR2
+	and	w0, w0, 65535
+	ldrh	w1, [x3, 2284]
 	cmp	w1, w0
-	bls	.L1710
-	mov	w7, 6
-	ldr	x12, [x3,2808]
-	adrp	x2, .LANCHOR4
+	bls	.L1674
+	mov	w8, 6
+	ldr	x13, [x3, 2808]
 	mov	w1, -1
-	umull	x11, w0, w7
-	add	x6, x2, :lo12:.LANCHOR4
-	mov	x4, x2
-	add	x5, x12, x11
-	strh	w1, [x5,2]
-	strh	w1, [x12,x11]
-	ldr	x1, [x6,744]
-	cbnz	x1, .L1711
-	str	x5, [x6,744]
-	b	.L1710
-.L1711:
-	ubfiz	x8, x0, 1, 16
-	ldr	x14, [x3,2712]
-	ldrh	w2, [x5,4]
-	mov	x9, -6148914691236517206
-	ldr	x13, [x3,2808]
+	adrp	x2, .LANCHOR4
+	umull	x12, w0, w8
+	add	x4, x2, :lo12:.LANCHOR4
+	mov	x5, x2
+	add	x6, x13, x12
+	strh	w1, [x6, 2]
+	strh	w1, [x13, x12]
+	ldr	x1, [x4, 744]
+	cbnz	x1, .L1661
+	str	x6, [x4, 744]
+.L1674:
+	mov	w0, 0
+	ret
+.L1661:
+	stp	x29, x30, [sp, -32]!
+	ubfiz	x9, x0, 1, 16
+	mov	w10, -1
+	add	x29, sp, 0
+	str	x19, [sp, 16]
 	mov	w19, 65535
-	ldrh	w6, [x14,x8]
-	cmp	w2, wzr
-	ldr	x15, [x3,2696]
-	ldrh	w18, [x3,2284]
+	ldr	x15, [x3, 2712]
+	ldrh	w2, [x6, 4]
+	ldr	x14, [x3, 2808]
+	cmp	w2, 0
+	ldr	x16, [x3, 2696]
+	ldrh	w7, [x15, x9]
+	sub	x4, x1, x14
+	asr	x4, x4, 1
+	add	x9, x16, x9
+	ldrh	w30, [x3, 2284]
 	mov	w3, 0
-	mul	w6, w6, w2
-	sub	x2, x1, x13
-	asr	x2, x2, 1
-	csinv	w6, w6, wzr, ne
-	madd	x2, x9, x2, x2
-	add	x9, x15, x8
-	mov	w8, w7
-	uxth	w2, w2
-.L1719:
+	mul	w7, w7, w2
+	mov	x2, -6148914691236517206
+	movk	x2, 0xaaab, lsl 0
+	csel	w7, w7, w10, ne
+	mul	x4, x4, x2
+	and	w2, w4, 65535
+.L1669:
 	add	w3, w3, 1
+	and	w3, w3, 65535
+	cmp	w3, w30
+	bhi	.L1660
 	cmp	w0, w2
-	uxth	w3, w3
-	beq	.L1710
-	cmp	w3, w18
-	bhi	.L1710
-	ubfiz	x16, x2, 1, 16
-	ldrh	w17, [x1,4]
-	cmp	w17, wzr
-	ldrh	w7, [x14,x16]
-	mul	w7, w7, w17
-	csinv	w7, w7, wzr, ne
-	cmp	w7, w6
-	bne	.L1715
-	ldrh	w16, [x15,x16]
-	ldrh	w7, [x9]
-	cmp	w16, w7
-	bcc	.L1717
-	b	.L1716
-.L1715:
-	bhi	.L1716
-.L1717:
-	ldrh	w7, [x1]
-	cmp	w7, w19
-	bne	.L1718
-	strh	w2, [x5,2]
-	add	x2, x4, :lo12:.LANCHOR4
-	strh	w0, [x1]
-	str	x5, [x2,752]
-	b	.L1710
-.L1718:
-	umull	x1, w7, w8
-	mov	w2, w7
-	add	x1, x13, x1
-	b	.L1719
-.L1716:
-	strh	w2, [x12,x11]
-	ldrh	w2, [x1,2]
-	strh	w2, [x5,2]
-	add	x2, x4, :lo12:.LANCHOR4
-	ldr	x3, [x2,744]
+	beq	.L1660
+	ubfiz	x17, x2, 1, 16
+	ldrh	w18, [x1, 4]
+	cmp	w18, 0
+	ldrh	w4, [x15, x17]
+	mul	w4, w4, w18
+	csel	w4, w4, w10, ne
+	cmp	w7, w4
+	bne	.L1665
+	ldrh	w17, [x16, x17]
+	ldrh	w4, [x9]
+	cmp	w17, w4
+	bcc	.L1667
+.L1666:
+	strh	w2, [x13, x12]
+	ldrh	w2, [x1, 2]
+	strh	w2, [x6, 2]
+	add	x2, x5, :lo12:.LANCHOR4
+	ldr	x3, [x2, 744]
 	cmp	x1, x3
-	bne	.L1720
-	strh	w0, [x1,2]
-	str	x5, [x2,744]
-	b	.L1710
-.L1720:
-	ldrh	w2, [x1,2]
-	add	x3, x10, :lo12:.LANCHOR2
-	mov	w4, 6
-	ldr	x3, [x3,2808]
-	umull	x2, w2, w4
-	strh	w0, [x3,x2]
-	strh	w0, [x1,2]
-.L1710:
+	bne	.L1670
+	strh	w0, [x1, 2]
+	str	x6, [x2, 744]
+	b	.L1660
+.L1665:
+	bcc	.L1666
+.L1667:
+	ldrh	w4, [x1]
+	cmp	w4, w19
+	bne	.L1668
+	strh	w2, [x6, 2]
+	add	x2, x5, :lo12:.LANCHOR4
+	strh	w0, [x1]
+	str	x6, [x2, 752]
+.L1660:
 	mov	w0, 0
-	ldr	x19, [sp]
-	add	sp, sp, 16
+	ldr	x19, [sp, 16]
+	ldp	x29, x30, [sp], 32
 	ret
+.L1668:
+	umaddl	x1, w4, w8, x14
+	mov	w2, w4
+	b	.L1669
+.L1670:
+	ldrh	w2, [x1, 2]
+	add	x3, x11, :lo12:.LANCHOR2
+	mov	w4, 6
+	ldr	x3, [x3, 2808]
+	umull	x2, w2, w4
+	strh	w0, [x3, x2]
+	strh	w0, [x1, 2]
+	b	.L1660
 	.size	insert_data_list, .-insert_data_list
 	.align	2
 	.global	INSERT_DATA_LIST
@@ -10336,9 +10170,9 @@ INSERT_DATA_LIST:
 	bl	insert_data_list
 	adrp	x0, .LANCHOR4
 	add	x0, x0, :lo12:.LANCHOR4
-	ldrh	w1, [x0,760]
+	ldrh	w1, [x0, 760]
 	add	w1, w1, 1
-	strh	w1, [x0,760]
+	strh	w1, [x0, 760]
 	ldp	x29, x30, [sp], 16
 	ret
 	.size	INSERT_DATA_LIST, .-INSERT_DATA_LIST
@@ -10346,75 +10180,75 @@ INSERT_DATA_LIST:
 	.global	insert_free_list
 	.type	insert_free_list, %function
 insert_free_list:
-	uxth	w0, w0
-	mov	w5, 65535
-	cmp	w0, w5
-	beq	.L1725
+	and	w0, w0, 65535
+	mov	w7, 65535
+	cmp	w0, w7
+	beq	.L1679
 	adrp	x3, .LANCHOR2
-	mov	w4, 6
-	add	x8, x3, :lo12:.LANCHOR2
-	adrp	x2, .LANCHOR4
-	umull	x6, w0, w4
+	add	x10, x3, :lo12:.LANCHOR2
+	mov	w6, 6
 	mov	w1, -1
-	add	x9, x2, :lo12:.LANCHOR4
-	ldr	x7, [x8,2808]
-	mov	x11, x3
+	adrp	x2, .LANCHOR4
+	add	x11, x2, :lo12:.LANCHOR4
+	ldr	x9, [x10, 2808]
+	umull	x8, w0, w6
+	mov	x4, x3
 	mov	x3, x2
-	add	x12, x7, x6
-	strh	w1, [x12,2]
-	strh	w1, [x7,x6]
-	ldr	x1, [x9,768]
-	cbnz	x1, .L1726
-	str	x12, [x9,768]
-	b	.L1725
-.L1726:
-	ldr	x10, [x8,2696]
+	add	x5, x9, x8
+	strh	w1, [x5, 2]
+	strh	w1, [x9, x8]
+	ldr	x1, [x11, 768]
+	cbnz	x1, .L1680
+	str	x5, [x11, 768]
+.L1679:
+	mov	w0, 0
+	ret
+.L1680:
+	ldr	x12, [x10, 2696]
 	ubfiz	x2, x0, 1, 16
-	ldr	x9, [x8,2808]
-	mov	x8, -6148914691236517206
-	ldrh	w13, [x10,x2]
-	sub	x2, x1, x9
+	ldr	x11, [x10, 2808]
+	mov	x10, -6148914691236517206
+	movk	x10, 0xaaab, lsl 0
+	ldrh	w13, [x12, x2]
+	sub	x2, x1, x11
 	asr	x2, x2, 1
-	madd	x2, x8, x2, x2
-	uxth	w2, w2
-.L1729:
-	ubfiz	x8, x2, 1, 16
-	ldrh	w8, [x10,x8]
-	cmp	w8, w13
-	bcs	.L1727
-	ldrh	w8, [x1]
-	cmp	w8, w5
-	bne	.L1728
-	strh	w2, [x12,2]
+	mul	x2, x2, x10
+	and	w2, w2, 65535
+.L1683:
+	ubfiz	x10, x2, 1, 16
+	ldrh	w10, [x12, x10]
+	cmp	w10, w13
+	bcs	.L1681
+	ldrh	w10, [x1]
+	cmp	w10, w7
+	bne	.L1682
+	strh	w2, [x5, 2]
 	strh	w0, [x1]
-	b	.L1725
-.L1728:
-	umull	x1, w8, w4
-	mov	w2, w8
-	add	x1, x9, x1
-	b	.L1729
-.L1727:
-	ldrh	w4, [x1,2]
-	strh	w4, [x12,2]
-	strh	w2, [x7,x6]
+	b	.L1679
+.L1682:
+	umaddl	x1, w10, w6, x11
+	mov	w2, w10
+	b	.L1683
+.L1681:
+	ldrh	w6, [x1, 2]
+	strh	w6, [x5, 2]
+	strh	w2, [x9, x8]
 	add	x2, x3, :lo12:.LANCHOR4
-	ldr	x3, [x2,768]
+	ldr	x3, [x2, 768]
 	cmp	x1, x3
-	bne	.L1730
-	strh	w0, [x1,2]
-	str	x12, [x2,768]
-	b	.L1725
-.L1730:
-	ldrh	w2, [x1,2]
-	add	x3, x11, :lo12:.LANCHOR2
+	bne	.L1684
+	strh	w0, [x1, 2]
+	str	x5, [x2, 768]
+	b	.L1679
+.L1684:
+	ldrh	w2, [x1, 2]
+	add	x3, x4, :lo12:.LANCHOR2
 	mov	w4, 6
-	ldr	x3, [x3,2808]
+	ldr	x3, [x3, 2808]
 	umull	x2, w2, w4
-	strh	w0, [x3,x2]
-	strh	w0, [x1,2]
-.L1725:
-	mov	w0, 0
-	ret
+	strh	w0, [x3, x2]
+	strh	w0, [x1, 2]
+	b	.L1679
 	.size	insert_free_list, .-insert_free_list
 	.align	2
 	.global	INSERT_FREE_LIST
@@ -10425,9 +10259,9 @@ INSERT_FREE_LIST:
 	bl	insert_free_list
 	adrp	x0, .LANCHOR4
 	add	x0, x0, :lo12:.LANCHOR4
-	ldrh	w1, [x0,776]
+	ldrh	w1, [x0, 776]
 	add	w1, w1, 1
-	strh	w1, [x0,776]
+	strh	w1, [x0, 776]
 	ldp	x29, x30, [sp], 16
 	ret
 	.size	INSERT_FREE_LIST, .-INSERT_FREE_LIST
@@ -10435,198 +10269,197 @@ INSERT_FREE_LIST:
 	.global	List_remove_node
 	.type	List_remove_node, %function
 List_remove_node:
+	and	w1, w1, 65535
 	adrp	x6, .LANCHOR2
-	uxth	w1, w1
 	add	x6, x6, :lo12:.LANCHOR2
-	mov	w5, 6
-	ldr	x3, [x0]
+	mov	w4, 6
+	ldr	x2, [x0]
 	mov	w7, 65535
-	umull	x1, w1, w5
-	ldr	x2, [x6,2808]
-	add	x4, x2, x1
-	cmp	x4, x3
-	bne	.L1733
-	ldrh	w3, [x2,x1]
-	cmp	w3, w7
-	bne	.L1734
+	umull	x1, w1, w4
+	ldr	x3, [x6, 2808]
+	add	x5, x3, x1
+	cmp	x5, x2
+	ldrh	w2, [x3, x1]
+	bne	.L1688
+	cmp	w2, w7
+	bne	.L1689
 	str	xzr, [x0]
-	b	.L1735
-.L1734:
-	umull	x3, w3, w5
-	add	x3, x2, x3
-	str	x3, [x0]
-	mov	w0, -1
-	strh	w0, [x3,2]
-	b	.L1735
-.L1733:
-	ldrh	w0, [x2,x1]
-	ldrh	w3, [x4,2]
-	cmp	w0, w7
-	bne	.L1736
-	cmp	w3, w0
-	beq	.L1735
-	umull	x3, w3, w5
-	mov	w0, -1
-	strh	w0, [x2,x3]
-	b	.L1735
-.L1736:
-	umull	x0, w0, w5
-	add	x0, x2, x0
-	strh	w3, [x0,2]
-	ldrh	w3, [x4,2]
-	ldr	x0, [x6,2808]
-	ldrh	w7, [x2,x1]
-	umull	x3, w3, w5
-	strh	w7, [x0,x3]
-.L1735:
+.L1690:
 	mov	w0, -1
-	strh	w0, [x2,x1]
-	strh	w0, [x4,2]
+	strh	w0, [x3, x1]
+	strh	w0, [x5, 2]
 	mov	w0, 0
 	ret
+.L1689:
+	umaddl	x2, w2, w4, x3
+	str	x2, [x0]
+	mov	w0, -1
+	strh	w0, [x2, 2]
+	b	.L1690
+.L1688:
+	cmp	w2, w7
+	ldrh	w0, [x5, 2]
+	bne	.L1691
+	cmp	w0, w2
+	beq	.L1690
+	umull	x2, w0, w4
+	mov	w0, -1
+	strh	w0, [x3, x2]
+	b	.L1690
+.L1691:
+	umaddl	x2, w2, w4, x3
+	strh	w0, [x2, 2]
+	ldrh	w2, [x5, 2]
+	ldr	x0, [x6, 2808]
+	ldrh	w7, [x3, x1]
+	umull	x2, w2, w4
+	strh	w7, [x0, x2]
+	b	.L1690
 	.size	List_remove_node, .-List_remove_node
 	.align	2
 	.global	List_pop_index_node
 	.type	List_pop_index_node, %function
 List_pop_index_node:
-	stp	x29, x30, [sp, -32]!
-	uxth	w1, w1
-	add	x29, sp, 0
-	str	x19, [sp,16]
-	mov	w19, 65535
 	ldr	x2, [x0]
-	cbz	x2, .L1738
+	cbz	x2, .L1698
+	stp	x29, x30, [sp, -16]!
 	adrp	x3, .LANCHOR2+2808
-	mov	w5, w19
-	mov	w6, 6
-	ldr	x4, [x3,#:lo12:.LANCHOR2+2808]
-.L1739:
-	cbnz	w1, .L1740
-.L1742:
-	sub	x2, x2, x4
-	mov	x1, -6148914691236517206
-	asr	x2, x2, 1
-	madd	x2, x1, x2, x2
-	uxth	w19, w2
-	mov	w1, w19
+	and	w1, w1, 65535
+	mov	w4, 65535
+	add	x29, sp, 0
+	ldr	x8, [x3, #:lo12:.LANCHOR2+2808]
+	mov	w5, 6
+.L1694:
+	cbnz	w1, .L1695
+.L1697:
+	sub	x8, x2, x8
+	mov	x2, -6148914691236517206
+	asr	x8, x8, 1
+	movk	x2, 0xaaab, lsl 0
+	mul	x8, x8, x2
+	and	w8, w8, 65535
+	mov	w1, w8
 	bl	List_remove_node
-	b	.L1738
-.L1740:
+	mov	w0, w8
+	ldp	x29, x30, [sp], 16
+	ret
+.L1695:
 	ldrh	w3, [x2]
-	cmp	w3, w5
-	beq	.L1742
-	umull	x3, w3, w6
+	cmp	w3, w4
+	beq	.L1697
 	sub	w1, w1, #1
-	add	x2, x4, x3
-	uxth	w1, w1
-	b	.L1739
-.L1738:
-	mov	w0, w19
-	ldr	x19, [sp,16]
-	ldp	x29, x30, [sp], 32
+	umaddl	x2, w3, w5, x8
+	and	w1, w1, 65535
+	b	.L1694
+.L1698:
+	mov	w0, 65535
 	ret
 	.size	List_pop_index_node, .-List_pop_index_node
 	.align	2
 	.global	List_get_gc_head_node
 	.type	List_get_gc_head_node, %function
 List_get_gc_head_node:
-	uxth	w3, w0
+	and	w2, w0, 65535
 	adrp	x0, .LANCHOR4+744
-	ldr	x1, [x0,#:lo12:.LANCHOR4+744]
-	mov	w0, 65535
-	cbz	x1, .L1750
+	ldr	x1, [x0, #:lo12:.LANCHOR4+744]
+	cbz	x1, .L1708
 	adrp	x0, .LANCHOR2+2808
-	mov	w5, 6
-	ldr	x4, [x0,#:lo12:.LANCHOR2+2808]
+	mov	w4, 6
+	ldr	x3, [x0, #:lo12:.LANCHOR2+2808]
+	mov	w0, 65535
+.L1705:
+	cbz	w2, .L1706
+	ldrh	w1, [x1]
+	cmp	w1, w0
+	bne	.L1707
+	ret
+.L1707:
+	sub	w2, w2, #1
+	umaddl	x1, w1, w4, x3
+	and	w2, w2, 65535
+	b	.L1705
+.L1708:
 	mov	w0, 65535
-.L1746:
-	cbz	w3, .L1747
-	ldrh	w2, [x1]
-	cmp	w2, w0
-	beq	.L1750
-	umull	x2, w2, w5
-	sub	w3, w3, #1
-	add	x1, x4, x2
-	uxth	w3, w3
-	b	.L1746
-.L1747:
-	sub	x1, x1, x4
-	mov	x0, -6148914691236517206
-	asr	x1, x1, 1
-	madd	x1, x0, x1, x1
-	uxth	w0, w1
-.L1750:
+	ret
+.L1706:
+	sub	x0, x1, x3
+	mov	x1, -6148914691236517206
+	asr	x0, x0, 1
+	movk	x1, 0xaaab, lsl 0
+	mul	x0, x0, x1
+	and	w0, w0, 65535
 	ret
 	.size	List_get_gc_head_node, .-List_get_gc_head_node
 	.align	2
 	.global	List_update_data_list
 	.type	List_update_data_list, %function
 List_update_data_list:
-	stp	x29, x30, [sp, -32]!
-	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x19, .LANCHOR4
-	uxth	w20, w0
-	add	x4, x19, :lo12:.LANCHOR4
-	ldrh	w0, [x4,784]
-	cmp	w0, w20
-	beq	.L1752
-	ldrh	w0, [x4,832]
-	cmp	w0, w20
-	beq	.L1752
-	ldrh	w0, [x4,880]
-	cmp	w0, w20
-	beq	.L1752
-	adrp	x3, .LANCHOR2
-	mov	w2, 6
-	add	x3, x3, :lo12:.LANCHOR2
-	ldr	x0, [x4,744]
-	umull	x2, w20, w2
-	ldr	x5, [x3,2808]
-	add	x1, x5, x2
-	cmp	x1, x0
-	beq	.L1752
-	ubfiz	x0, x20, 1, 16
-	ldr	x4, [x3,2712]
-	ldrh	w6, [x1,4]
-	ldrh	w1, [x1,2]
-	ldrh	w3, [x4,x0]
-	cmp	w6, wzr
-	mov	w0, 65535
-	mul	w3, w3, w6
-	csinv	w3, w3, wzr, ne
+	adrp	x8, .LANCHOR4
+	add	x2, x8, :lo12:.LANCHOR4
+	and	w9, w0, 65535
+	ldrh	w0, [x2, 784]
+	cmp	w0, w9
+	beq	.L1717
+	ldrh	w0, [x2, 832]
+	cmp	w0, w9
+	beq	.L1717
+	ldrh	w0, [x2, 880]
+	cmp	w0, w9
+	beq	.L1717
+	adrp	x0, .LANCHOR2
+	add	x0, x0, :lo12:.LANCHOR2
+	mov	w1, 6
+	ldr	x2, [x2, 744]
+	umull	x1, w9, w1
+	ldr	x3, [x0, 2808]
+	add	x4, x3, x1
+	cmp	x4, x2
+	beq	.L1717
+	ldr	x5, [x0, 2712]
+	ubfiz	x0, x9, 1, 16
+	ldrh	w2, [x5, x0]
+	ldrh	w0, [x4, 4]
+	cmp	w0, 0
+	mul	w2, w2, w0
+	ldrh	w0, [x4, 2]
+	mov	w4, 65535
+	csinv	w2, w2, wzr, ne
+	cmp	w0, w4
+	bne	.L1712
+	ldrh	w1, [x3, x1]
 	cmp	w1, w0
-	bne	.L1754
-	ldrh	w0, [x5,x2]
-	cmp	w0, w1
-	beq	.L1752
-.L1754:
-	mov	w0, 6
-	umull	x1, w1, w0
-	mov	x0, -6148914691236517206
-	asr	x2, x1, 1
-	add	x1, x5, x1
-	madd	x2, x0, x2, x2
-	ldrh	w2, [x4,x2,lsl 1]
-	ldrh	w4, [x1,4]
-	cmp	w4, wzr
-	mul	w1, w2, w4
-	csinv	w1, w1, wzr, ne
-	cmp	w3, w1
-	bcs	.L1752
-	add	x19, x19, :lo12:.LANCHOR4
-	mov	w1, w20
-	add	x0, x19, 744
+	beq	.L1717
+.L1712:
+	mov	w1, 6
+	mov	x4, -6148914691236517206
+	movk	x4, 0xaaab, lsl 0
+	umull	x0, w0, w1
+	asr	x1, x0, 1
+	add	x0, x3, x0
+	mul	x1, x1, x4
+	ldrh	w3, [x0, 4]
+	cmp	w3, 0
+	ldrh	w1, [x5, x1, lsl 1]
+	mul	w0, w1, w3
+	csinv	w0, w0, wzr, ne
+	cmp	w2, w0
+	bcs	.L1717
+	add	x8, x8, :lo12:.LANCHOR4
+	stp	x29, x30, [sp, -16]!
+	mov	w1, w9
+	add	x0, x8, 744
+	add	x29, sp, 0
 	bl	List_remove_node
-	ldrh	w1, [x19,760]
-	mov	w0, w20
-	sub	w1, w1, #1
-	strh	w1, [x19,760]
+	ldrh	w0, [x8, 760]
+	sub	w0, w0, #1
+	strh	w0, [x8, 760]
+	mov	w0, w9
 	bl	INSERT_DATA_LIST
-.L1752:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 32
+	ldp	x29, x30, [sp], 16
+	ret
+.L1717:
+	mov	w0, 0
 	ret
 	.size	List_update_data_list, .-List_update_data_list
 	.align	2
@@ -10636,96 +10469,98 @@ ftl_free_no_use_map_blk:
 	stp	x29, x30, [sp, -80]!
 	mov	w1, 0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	str	x25, [sp,64]
+	stp	x19, x20, [sp, 16]
 	mov	x19, x0
-	ldrh	w2, [x0,10]
-	ldr	x21, [x0,32]
-	ldr	x22, [x0,16]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	str	x25, [sp, 64]
+	ldrh	w2, [x0, 10]
+	ldp	x21, x20, [x0, 32]
+	ldr	x22, [x0, 16]
 	lsl	w2, w2, 1
-	ldr	x20, [x0,40]
 	mov	x0, x21
 	bl	ftl_memset
 	mov	w0, 0
-.L1759:
-	ldrh	w1, [x19,6]
+.L1721:
+	ldrh	w1, [x19, 6]
 	cmp	w1, w0
-	bls	.L1781
+	bhi	.L1725
+	adrp	x0, .LANCHOR2+2346
+	mov	w23, 0
+	mov	w20, 0
+	ldrh	w1, [x0, #:lo12:.LANCHOR2+2346]
+	ldrh	w0, [x19]
+	strh	w1, [x21, x0, lsl 1]
+	ldrh	w24, [x21]
+.L1726:
+	ldrh	w0, [x19, 10]
+	cmp	w0, w20
+	bhi	.L1730
+	mov	w0, w23
+	ldr	x25, [sp, 64]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 80
+	ret
+.L1725:
 	ubfiz	x1, x0, 2, 16
-	ldr	w2, [x20,x1]
+	ldr	w2, [x20, x1]
 	mov	w1, 0
 	ubfx	x2, x2, 10, 16
-.L1760:
-	ldrh	w3, [x19,10]
+.L1722:
+	ldrh	w3, [x19, 10]
 	cmp	w3, w1
-	bls	.L1782
+	bhi	.L1724
+	add	w0, w0, 1
+	and	w0, w0, 65535
+	b	.L1721
+.L1724:
 	ubfiz	x3, x1, 1, 16
-	ldrh	w4, [x22,x3]
-	cmp	w2, w4
-	bne	.L1761
-	cbz	w4, .L1761
-	ldrh	w4, [x21,x3]
+	ldrh	w4, [x22, x3]
+	cmp	w4, w2
+	bne	.L1723
+	cbz	w2, .L1723
+	ldrh	w4, [x21, x3]
 	add	w4, w4, 1
-	strh	w4, [x21,x3]
-.L1761:
+	strh	w4, [x21, x3]
+.L1723:
 	add	w1, w1, 1
-	uxth	w1, w1
-	b	.L1760
-.L1782:
-	add	w0, w0, 1
-	uxth	w0, w0
-	b	.L1759
-.L1781:
-	adrp	x0, .LANCHOR2+2346
-	mov	w23, 0
-	mov	w20, w23
-	ldrh	w1, [x0,#:lo12:.LANCHOR2+2346]
-	ldrh	w0, [x19]
-	strh	w1, [x21,x0,lsl 1]
-	ldrh	w24, [x21]
-.L1764:
-	ldrh	w0, [x19,10]
-	cmp	w0, w20
-	bls	.L1783
-	ubfiz	x2, x20, 1, 16
-	ldrh	w1, [x21,x2]
+	and	w1, w1, 65535
+	b	.L1722
+.L1730:
+	ubfiz	x0, x20, 1, 16
+	ldrh	w1, [x21, x0]
 	cmp	w24, w1
-	bls	.L1765
-	ldrh	w0, [x22,x2]
-	add	x25, x22, x2
-	cbnz	w0, .L1766
-	b	.L1767
-.L1765:
-	cbnz	w1, .L1767
-	ldrh	w0, [x22,x2]
-	add	x25, x22, x2
-	cbz	w0, .L1767
-.L1769:
+	bls	.L1727
+	add	x25, x22, x0
+	ldrh	w0, [x22, x0]
+	cbnz	w0, .L1728
+.L1729:
+	add	w20, w20, 1
+	and	w20, w20, 65535
+	b	.L1726
+.L1727:
+	cbnz	w1, .L1729
+	add	x25, x22, x0
+	ldrh	w0, [x22, x0]
+	cbz	w0, .L1729
+.L1731:
 	mov	w1, 1
 	bl	FtlFreeSysBlkQueueIn
 	strh	wzr, [x25]
-	ldrh	w0, [x19,8]
+	ldrh	w0, [x19, 8]
 	sub	w0, w0, #1
-	strh	w0, [x19,8]
-.L1767:
-	add	w20, w20, 1
-	uxth	w20, w20
-	b	.L1764
-.L1766:
+	strh	w0, [x19, 8]
+	b	.L1729
+.L1732:
+	mov	w24, 0
+	b	.L1731
+.L1728:
 	mov	w23, w20
+	cbz	w1, .L1732
 	mov	w24, w1
-	cbz	w1, .L1769
-	b	.L1767
-.L1783:
-	mov	w0, w23
-	ldr	x25, [sp,64]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 80
-	ret
+	b	.L1729
 	.size	ftl_free_no_use_map_blk, .-ftl_free_no_use_map_blk
 	.align	2
 	.global	ftl_map_blk_alloc_new_blk
@@ -10733,189 +10568,185 @@ ftl_free_no_use_map_blk:
 ftl_map_blk_alloc_new_blk:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
+	stp	x19, x20, [sp, 16]
 	mov	w20, 0
-	ldrh	w2, [x0,10]
-	ldr	x1, [x0,16]
-.L1785:
+	str	x21, [sp, 32]
+	ldrh	w2, [x0, 10]
+	ldr	x1, [x0, 16]
+.L1742:
 	cmp	w20, w2
-	beq	.L1789
-	mov	x22, x1
-	ldrh	w21, [x1],2
-	cbnz	w21, .L1786
+	beq	.L1746
+	mov	x21, x1
+	ldrh	w3, [x1], 2
+	cbnz	w3, .L1743
 	mov	x19, x0
 	bl	FtlFreeSysBlkQueueOut
-	strh	w0, [x22]
-	uxth	w1, w0
+	and	w1, w0, 65535
+	strh	w0, [x21]
 	sub	w2, w1, #1
 	mov	w0, 65533
 	cmp	w0, w2, uxth
-	bcs	.L1787
-	adrp	x2, .LANCHOR2+2998
+	bcs	.L1744
+	adrp	x0, .LANCHOR2+2998
+	ldrh	w2, [x0, #:lo12:.LANCHOR2+2998]
 	adrp	x0, .LC38
 	add	x0, x0, :lo12:.LC38
-	ldrh	w2, [x2,#:lo12:.LANCHOR2+2998]
 	bl	printk
-.L1788:
-	b	.L1788
-.L1787:
-	ldr	w0, [x19,48]
-	strh	w21, [x19,2]
+.L1745:
+	b	.L1745
+.L1744:
+	ldr	w0, [x19, 48]
+	strh	wzr, [x19, 2]
 	add	w0, w0, 1
-	str	w0, [x19,48]
-	ldrh	w0, [x19,8]
+	str	w0, [x19, 48]
+	ldrh	w0, [x19, 8]
 	strh	w20, [x19]
 	add	w0, w0, 1
-	strh	w0, [x19,8]
-	b	.L1789
-.L1786:
-	add	w20, w20, 1
-	uxth	w20, w20
-	b	.L1785
-.L1789:
+	strh	w0, [x19, 8]
+.L1746:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
+.L1743:
+	add	w20, w20, 1
+	and	w20, w20, 65535
+	b	.L1742
 	.size	ftl_map_blk_alloc_new_blk, .-ftl_map_blk_alloc_new_blk
 	.align	2
 	.global	FtlMapWritePage
 	.type	FtlMapWritePage, %function
 FtlMapWritePage:
-	stp	x29, x30, [sp, -112]!
+	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x25, x26, [sp,64]
-	stp	x23, x24, [sp,48]
-	adrp	x26, .LANCHOR2
-	adrp	x23, .LC39
-	stp	x21, x22, [sp,32]
-	stp	x27, x28, [sp,80]
-	stp	x19, x20, [sp,16]
-	mov	w25, w1
+	stp	x19, x20, [sp, 16]
 	mov	x19, x0
-	mov	x27, x2
+	stp	x21, x22, [sp, 32]
 	mov	w22, 0
-	mov	w28, 65535
-	add	x21, x26, :lo12:.LANCHOR2
-	add	x23, x23, :lo12:.LC39
-.L1792:
-	add	x0, x26, :lo12:.LANCHOR2
-	adrp	x20, .LANCHOR2
-	ldr	w1, [x0,2420]
+	stp	x23, x24, [sp, 48]
+	adrp	x23, .LANCHOR2
+	stp	x25, x26, [sp, 64]
+	adrp	x24, .LANCHOR0
+	stp	x27, x28, [sp, 80]
+	mov	w26, w1
+	mov	x27, x2
+	mov	x21, x23
+	add	x20, x23, :lo12:.LANCHOR2
+	add	x24, x24, :lo12:.LANCHOR0
+.L1750:
+	add	x0, x23, :lo12:.LANCHOR2
+	ldr	w1, [x0, 2420]
 	add	w1, w1, 1
-	str	w1, [x0,2420]
-	ldrh	w0, [x0,2346]
-	ldrh	w1, [x19,2]
+	str	w1, [x0, 2420]
+	ldrh	w0, [x0, 2346]
+	ldrh	w1, [x19, 2]
 	sub	w0, w0, #1
 	cmp	w1, w0
-	bge	.L1793
-	ldrh	w0, [x19]
-	cmp	w0, w28
-	bne	.L1794
-.L1793:
+	bge	.L1751
+	ldrh	w1, [x19]
+	mov	w0, 65535
+	cmp	w1, w0
+	bne	.L1752
+.L1751:
 	mov	x0, x19
 	bl	Ftl_write_map_blk_to_last_page
-.L1794:
-	ldr	w1, [x21,2928]
-	cbnz	w1, .L1795
-	ldrh	w2, [x19]
-	add	x3, x21, 2936
-	ldr	x0, [x19,16]
-	str	x3, [x29,104]
-	ldrh	w24, [x0,x2,lsl 1]
+.L1752:
+	ldr	w0, [x20, 2928]
+	cbnz	w0, .L1765
+	ldrh	w1, [x19]
 	mov	w2, 16
-	ldrh	w0, [x19,2]
-	str	x27, [x21,2944]
-	orr	w0, w0, w24, lsl 10
-	str	w0, [x21,2940]
-	ldr	x0, [x21,2640]
-	str	x0, [x21,2952]
+	ldr	x0, [x19, 16]
+	ldrh	w25, [x0, x1, lsl 1]
+	mov	w1, 0
+	ldrh	w0, [x19, 2]
+	str	x27, [x20, 2944]
+	orr	w0, w0, w25, lsl 10
+	str	w0, [x20, 2940]
+	ldr	x0, [x20, 2640]
+	str	x0, [x20, 2952]
 	bl	ftl_memset
-	ldr	x3, [x29,104]
-	ldr	w0, [x19,48]
-	ldr	x2, [x3,16]
-	str	w0, [x2,4]
-	strh	w25, [x2,8]
-	ldrh	w0, [x19,4]
-	strh	w0, [x2]
-	adrp	x0, .LANCHOR0+88
-	strh	w24, [x2,2]
-	ldrb	w0, [x0,#:lo12:.LANCHOR0+88]
-	cbz	w0, .L1796
-	ldr	x0, [x3,8]
-	ldrh	w1, [x21,2354]
-	str	x2, [x29,104]
+	ldr	x6, [x20, 2952]
+	ldr	w0, [x19, 48]
+	str	w0, [x6, 4]
+	strh	w26, [x6, 8]
+	ldrh	w0, [x19, 4]
+	strh	w0, [x6]
+	strh	w25, [x6, 2]
+	ldrb	w0, [x24, 88]
+	cbz	w0, .L1754
+	ldr	x0, [x20, 2944]
+	ldrh	w1, [x20, 2354]
 	bl	js_hash
-	ldr	x2, [x29,104]
-	str	w0, [x2,12]
-.L1796:
-	add	x4, x21, 2936
-	mov	w1, 1
-	mov	w2, w1
-	mov	x0, x4
-	mov	w3, w1
-	str	x4, [x29,104]
+	str	w0, [x6, 12]
+.L1754:
+	add	x28, x20, 2936
+	mov	w3, 1
+	mov	x0, x28
+	mov	w1, w3
+	mov	w2, w3
 	bl	FlashProgPages
-	ldrh	w1, [x19,2]
-	ldr	x4, [x29,104]
-	add	w1, w1, 1
-	uxth	w1, w1
-	strh	w1, [x19,2]
-	ldr	w2, [x21,2936]
-	cmn	w2, #1
-	bne	.L1797
-	ldr	w1, [x4,4]
-	mov	x0, x23
+	ldrh	w0, [x19, 2]
+	add	w0, w0, 1
+	and	w0, w0, 65535
+	strh	w0, [x19, 2]
+	ldr	w1, [x20, 2936]
+	cmn	w1, #1
+	bne	.L1755
+	ldr	w1, [x20, 2940]
+	adrp	x0, .LC39
+	add	x0, x0, :lo12:.LC39
 	add	w22, w22, 1
+	and	w22, w22, 65535
 	bl	printk
-	uxth	w22, w22
-	ldrh	w0, [x19,2]
+	ldrh	w0, [x19, 2]
 	cmp	w0, 2
-	bhi	.L1798
-	ldrh	w0, [x21,2346]
+	bhi	.L1756
+	ldrh	w0, [x20, 2346]
 	sub	w0, w0, #1
-	strh	w0, [x19,2]
-.L1798:
+	strh	w0, [x19, 2]
+.L1756:
 	cmp	w22, 3
-	bls	.L1792
-	add	x20, x20, :lo12:.LANCHOR2
+	bls	.L1750
+	add	x21, x21, :lo12:.LANCHOR2
+	mov	w2, w22
 	adrp	x0, .LC40
 	add	x0, x0, :lo12:.LC40
-	mov	w2, w22
-	ldr	w1, [x20,2940]
+	ldr	w1, [x21, 2940]
 	bl	printk
 	mov	w0, 1
-	str	w0, [x20,2928]
-	b	.L1795
-.L1797:
-	cbz	w2, .L1800
-	strh	w24, [x19,60]
-.L1800:
-	cmp	w1, 1
-	beq	.L1801
-	cmp	w2, 256
-	beq	.L1801
-	ldr	w0, [x19,56]
-	cbz	w0, .L1802
-.L1801:
-	str	wzr, [x19,56]
-	b	.L1792
-.L1802:
-	add	x20, x20, :lo12:.LANCHOR2
-	ldr	x0, [x19,40]
-	ldr	w1, [x20,2940]
-	str	w1, [x0,w25,uxtw 2]
-.L1795:
+	str	w0, [x21, 2928]
+.L1765:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 112
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 96
 	ret
+.L1755:
+	cbz	w1, .L1758
+	strh	w25, [x19, 60]
+	cmp	w0, 1
+	bne	.L1759
+.L1760:
+	str	wzr, [x19, 56]
+	b	.L1750
+.L1759:
+	cmp	w1, 256
+.L1773:
+	beq	.L1760
+	ldr	w0, [x19, 56]
+	cbnz	w0, .L1760
+	add	x21, x21, :lo12:.LANCHOR2
+	ldr	x0, [x19, 40]
+	ldr	w1, [x21, 2940]
+	str	w1, [x0, w26, uxtw 2]
+	b	.L1765
+.L1758:
+	cmp	w0, 1
+	b	.L1773
 	.size	FtlMapWritePage, .-FtlMapWritePage
 	.align	2
 	.global	ftl_map_blk_gc
@@ -10923,114 +10754,113 @@ FtlMapWritePage:
 ftl_map_blk_gc:
 	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	str	x27, [sp,80]
+	stp	x19, x20, [sp, 16]
 	mov	x19, x0
+	stp	x21, x22, [sp, 32]
 	adrp	x20, .LANCHOR2
-	ldr	x21, [x0,16]
-	ldr	x25, [x0,40]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	str	x27, [sp, 80]
+	ldr	x21, [x0, 16]
+	ldr	x25, [x0, 40]
 	bl	ftl_free_no_use_map_blk
-	ldrh	w1, [x19,10]
-	ldrh	w2, [x19,8]
+	ldrh	w1, [x19, 10]
+	ldrh	w2, [x19, 8]
 	sub	w1, w1, #4
 	cmp	w2, w1
-	blt	.L1810
-	ubfiz	x1, x0, 1, 16
-	ldrh	w24, [x21,x1]
-	cbz	w24, .L1810
-	ldr	w0, [x19,52]
-	cbnz	w0, .L1810
-	mov	w2, 1
-	str	w2, [x19,52]
-	strh	w0, [x21,x1]
-	ldrh	w0, [x19,8]
-	ldrh	w1, [x19,2]
+	blt	.L1775
+	ubfiz	x0, x0, 1, 16
+	ldrh	w24, [x21, x0]
+	cbz	w24, .L1775
+	ldr	w1, [x19, 52]
+	cbnz	w1, .L1775
+	mov	w1, 1
+	str	w1, [x19, 52]
+	strh	wzr, [x21, x0]
+	ldrh	w0, [x19, 8]
+	ldrh	w1, [x19, 2]
 	sub	w0, w0, #1
-	strh	w0, [x19,8]
+	strh	w0, [x19, 8]
 	add	x0, x20, :lo12:.LANCHOR2
-	ldrh	w0, [x0,2346]
+	ldrh	w0, [x0, 2346]
 	cmp	w1, w0
-	bcc	.L1811
+	bcc	.L1776
 	mov	x0, x19
 	bl	ftl_map_blk_alloc_new_blk
-.L1811:
+.L1776:
 	add	x26, x20, :lo12:.LANCHOR2
 	mov	w21, 0
 	add	x22, x26, 2936
-.L1812:
-	ldrh	w0, [x19,6]
+.L1777:
+	ldrh	w0, [x19, 6]
 	cmp	w0, w21
-	bls	.L1821
+	bhi	.L1782
+	mov	w1, 1
+	mov	w0, w24
+	bl	FtlFreeSysBlkQueueIn
+	str	wzr, [x19, 52]
+.L1775:
+	add	x20, x20, :lo12:.LANCHOR2
+	ldrh	w1, [x19, 2]
+	ldrh	w0, [x20, 2346]
+	cmp	w1, w0
+	bcc	.L1780
+	mov	x0, x19
+	bl	ftl_map_blk_alloc_new_blk
+	b	.L1780
+.L1782:
 	ubfiz	x0, x21, 2, 16
 	add	x27, x25, x0
-	ldr	w1, [x25,x0]
+	ldr	w1, [x25, x0]
 	cmp	w24, w1, lsr 10
-	bne	.L1813
-	ldr	x1, [x26,2584]
-	ldr	x23, [x26,2640]
-	str	x1, [x22,8]
-	mov	w1, 1
-	str	x23, [x22,16]
-	mov	w2, w1
-	ldr	w0, [x25,x0]
-	str	w0, [x22,4]
+	bne	.L1778
+	ldr	x1, [x26, 2584]
+	mov	w2, 1
+	ldr	x23, [x26, 2640]
+	stp	x1, x23, [x22, 8]
+	mov	w1, w2
+	ldr	w0, [x25, x0]
+	str	w0, [x22, 4]
 	mov	x0, x22
 	bl	FlashReadPages
 	ldr	w0, [x22]
 	cmn	w0, #1
-	bne	.L1814
-.L1816:
+	bne	.L1779
+.L1781:
 	add	x20, x20, :lo12:.LANCHOR2
 	str	wzr, [x27]
 	adrp	x0, .LC41
-	ldrh	w2, [x23,8]
 	add	x0, x0, :lo12:.LC41
-	ldr	w1, [x20,2940]
+	ldrh	w2, [x23, 8]
+	ldr	w1, [x20, 2940]
 	bl	printk
 	mov	w0, 1
-	str	w0, [x20,2928]
-	b	.L1815
-.L1814:
-	ldrh	w0, [x23,8]
+	str	w0, [x20, 2928]
+.L1780:
+	mov	w0, 0
+	ldr	x27, [sp, 80]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 96
+	ret
+.L1779:
+	ldrh	w0, [x23, 8]
 	cmp	w0, w21
-	bne	.L1816
+	bne	.L1781
 	ldrh	w1, [x23]
-	ldrh	w0, [x19,4]
+	ldrh	w0, [x19, 4]
 	cmp	w1, w0
-	bne	.L1816
-	ldr	x2, [x22,8]
-	mov	x0, x19
+	bne	.L1781
+	ldr	x2, [x22, 8]
 	mov	w1, w21
+	mov	x0, x19
 	bl	FtlMapWritePage
-.L1813:
+.L1778:
 	add	w21, w21, 1
-	uxth	w21, w21
-	b	.L1812
-.L1821:
-	mov	w0, w24
-	mov	w1, 1
-	bl	FtlFreeSysBlkQueueIn
-	str	wzr, [x19,52]
-.L1810:
-	add	x20, x20, :lo12:.LANCHOR2
-	ldrh	w1, [x19,2]
-	ldrh	w0, [x20,2346]
-	cmp	w1, w0
-	bcc	.L1815
-	mov	x0, x19
-	bl	ftl_map_blk_alloc_new_blk
-.L1815:
-	mov	w0, 0
-	ldr	x27, [sp,80]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 96
-	ret
+	and	w21, w21, 65535
+	b	.L1777
 	.size	ftl_map_blk_gc, .-ftl_map_blk_gc
 	.align	2
 	.global	Ftl_write_map_blk_to_last_page
@@ -11038,104 +10868,104 @@ ftl_map_blk_gc:
 Ftl_write_map_blk_to_last_page:
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
 	adrp	x21, .LANCHOR2
-	add	x1, x21, :lo12:.LANCHOR2
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	ldr	w20, [x1,2928]
-	ldr	x22, [x0,16]
-	ldr	x24, [x0,40]
-	cbnz	w20, .L1823
+	add	x20, x21, :lo12:.LANCHOR2
+	stp	x23, x24, [sp, 48]
+	ldr	w1, [x20, 2928]
+	cbnz	w1, .L1788
 	mov	x19, x0
 	ldrh	w0, [x0]
-	mov	w2, 65535
-	cmp	w0, w2
-	bne	.L1824
-	ldrh	w0, [x19,8]
+	mov	w1, 65535
+	cmp	w0, w1
+	ldr	x22, [x19, 16]
+	bne	.L1789
+	ldrh	w0, [x19, 8]
 	add	w0, w0, 1
-	strh	w0, [x19,8]
+	strh	w0, [x19, 8]
 	bl	FtlFreeSysBlkQueueOut
 	strh	w0, [x22]
-	strh	w20, [x19,2]
-	ldr	w0, [x19,48]
-	strh	w20, [x19]
+	strh	wzr, [x19, 2]
+	ldr	w0, [x19, 48]
+	strh	wzr, [x19]
 	add	w0, w0, 1
-	str	w0, [x19,48]
-	b	.L1823
-.L1824:
+	str	w0, [x19, 48]
+.L1788:
+	mov	w0, 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 64
+	ret
+.L1789:
 	ubfiz	x0, x0, 1, 16
-	ldrh	w2, [x19,2]
-	ldrh	w23, [x22,x0]
-	ldr	x22, [x1,2640]
-	str	x22, [x1,2952]
-	orr	w2, w2, w23, lsl 10
-	str	w2, [x1,2940]
-	ldr	x2, [x1,2576]
-	str	x2, [x1,2944]
-	ldr	w0, [x19,48]
-	str	w0, [x22,4]
+	ldrh	w1, [x19, 2]
+	ldr	x24, [x19, 40]
+	ldrh	w23, [x22, x0]
+	ldr	x22, [x20, 2640]
+	ldr	w0, [x19, 48]
+	orr	w1, w1, w23, lsl 10
+	str	w1, [x20, 2940]
+	ldr	x1, [x20, 2576]
+	str	x1, [x20, 2944]
+	str	x22, [x20, 2952]
+	mov	w1, 255
+	str	w0, [x22, 4]
 	mov	w0, -1291
-	strh	w0, [x22,8]
-	ldrh	w0, [x19,4]
+	strh	w0, [x22, 8]
+	ldrh	w0, [x19, 4]
 	strh	w0, [x22]
-	strh	w23, [x22,2]
-	ldrh	w2, [x1,2346]
-	ldr	x0, [x1,2576]
-	mov	w1, 255
+	strh	w23, [x22, 2]
+	ldrh	w2, [x20, 2346]
+	ldr	x0, [x20, 2576]
 	lsl	w2, w2, 3
 	bl	ftl_memset
-	mov	w0, w20
-.L1825:
-	ldrh	w1, [x19,6]
-	cmp	w1, w0
-	bls	.L1832
-	ubfiz	x3, x0, 2, 32
-	ldr	w1, [x24,x3]
-	cmp	w23, w1, lsr 10
-	bne	.L1826
-	add	x2, x21, :lo12:.LANCHOR2
-	add	w20, w20, 1
-	uxth	w20, w20
-	ldr	x4, [x2,2576]
-	ubfiz	x1, x20, 3, 16
-	str	w0, [x4,x1]
-	ldr	x2, [x2,2576]
-	ldr	w3, [x24,x3]
-	add	x1, x2, x1
-	str	w3, [x1,4]
-.L1826:
-	add	w0, w0, 1
-	uxth	w0, w0
-	b	.L1825
-.L1832:
+	mov	w1, 0
+	mov	w0, 0
+.L1790:
+	ldrh	w2, [x19, 6]
+	cmp	w2, w0
+	bhi	.L1792
 	adrp	x0, .LANCHOR0+88
-	ldrb	w0, [x0,#:lo12:.LANCHOR0+88]
-	cbz	w0, .L1828
-	add	x1, x21, :lo12:.LANCHOR2
-	ldr	x0, [x1,2944]
-	ldrh	w1, [x1,2354]
+	ldrb	w0, [x0, #:lo12:.LANCHOR0+88]
+	cbz	w0, .L1793
+	add	x0, x21, :lo12:.LANCHOR2
+	ldrh	w1, [x0, 2354]
+	ldr	x0, [x0, 2944]
 	bl	js_hash
-	str	w0, [x22,12]
-.L1828:
-	mov	w1, 1
+	str	w0, [x22, 12]
+.L1793:
 	add	x0, x21, :lo12:.LANCHOR2
-	add	x0, x0, 2936
-	mov	w2, w1
+	mov	w2, 1
 	mov	w3, 0
+	mov	w1, w2
+	add	x0, x0, 2936
 	bl	FlashProgPages
-	ldrh	w0, [x19,2]
+	ldrh	w0, [x19, 2]
 	add	w0, w0, 1
-	strh	w0, [x19,2]
+	strh	w0, [x19, 2]
 	mov	x0, x19
 	bl	ftl_map_blk_gc
-.L1823:
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 64
-	ret
+	b	.L1788
+.L1792:
+	ubfiz	x2, x0, 2, 16
+	ldr	w3, [x24, x2]
+	cmp	w23, w3, lsr 10
+	bne	.L1791
+	add	w1, w1, 1
+	ldr	x4, [x20, 2576]
+	and	w1, w1, 65535
+	ubfiz	x3, x1, 3, 16
+	str	w0, [x4, x3]
+	ldr	w4, [x24, x2]
+	ldr	x2, [x20, 2576]
+	add	x2, x2, x3
+	str	w4, [x2, 4]
+.L1791:
+	add	w0, w0, 1
+	and	w0, w0, 65535
+	b	.L1790
 	.size	Ftl_write_map_blk_to_last_page, .-Ftl_write_map_blk_to_last_page
 	.align	2
 	.global	flush_l2p_region
@@ -11143,25 +10973,25 @@ Ftl_write_map_blk_to_last_page:
 flush_l2p_region:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR2
-	ubfiz	x19, x0, 4, 16
-	add	x20, x20, :lo12:.LANCHOR2
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR2
+	add	x19, x19, :lo12:.LANCHOR2
+	ubfiz	x20, x0, 4, 16
+	ldr	x0, [x19, 2792]
+	add	x1, x0, x20
+	ldr	x2, [x1, 8]
+	ldrh	w1, [x0, x20]
 	adrp	x0, .LANCHOR4
 	add	x0, x0, :lo12:.LANCHOR4
 	add	x0, x0, 928
-	ldr	x1, [x20,2792]
-	add	x2, x1, x19
-	ldrh	w1, [x1,x19]
-	ldr	x2, [x2,8]
 	bl	FtlMapWritePage
-	ldr	x0, [x20,2792]
-	add	x19, x0, x19
-	ldr	w0, [x19,4]
-	and	w0, w0, 2147483647
-	str	w0, [x19,4]
+	ldr	x0, [x19, 2792]
+	add	x0, x0, x20
+	ldr	w1, [x0, 4]
+	and	w1, w1, 2147483647
+	str	w1, [x0, 4]
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	flush_l2p_region, .-flush_l2p_region
@@ -11170,69 +11000,64 @@ flush_l2p_region:
 	.type	select_l2p_ram_region, %function
 select_l2p_ram_region:
 	adrp	x0, .LANCHOR2
-	mov	x3, 0
 	add	x0, x0, :lo12:.LANCHOR2
+	mov	x3, 0
 	mov	w4, 65535
-	ldrh	w2, [x0,2382]
-	ldr	x1, [x0,2792]
-.L1835:
-	uxth	w0, w3
+	ldrh	w2, [x0, 2382]
+	ldr	x1, [x0, 2792]
+.L1801:
+	and	w0, w3, 65535
 	cmp	w0, w2
-	bcs	.L1851
-	add	x3, x3, 1
-	add	x5, x1, x3, lsl 4
-	ldrh	w5, [x5,-16]
-	cmp	w5, w4
-	bne	.L1835
-	b	.L1836
-.L1851:
+	bcc	.L1803
+	add	x4, x1, 4
 	mov	w0, w2
-	mov	x3, 0
 	mov	w6, -2147483648
-.L1838:
-	uxth	w5, w3
-	cmp	w5, w2
-	bcs	.L1852
-	add	x4, x1, x3, lsl 4
-	ldr	w4, [x4,4]
-	tbnz	w4, #31, .L1847
-	cmp	w4, w6
-	bcc	.L1839
-.L1847:
-	mov	w4, w6
-	mov	w5, w0
-.L1839:
-	add	x3, x3, 1
-	mov	w6, w4
-	mov	w0, w5
-	b	.L1838
-.L1852:
+	mov	w3, 0
+.L1804:
+	cmp	w3, w2
+	bne	.L1806
 	cmp	w0, w2
-	bcc	.L1836
+	bcc	.L1802
 	adrp	x0, .LANCHOR4+992
-	add	x1, x1, 4
 	mov	w4, -1
 	mov	w3, 0
-	ldrh	w5, [x0,#:lo12:.LANCHOR4+992]
+	ldrh	w5, [x0, #:lo12:.LANCHOR4+992]
 	mov	w0, w2
-.L1842:
+.L1807:
 	cmp	w3, w2
-	beq	.L1836
-	ldr	w7, [x1]
-	cmp	w7, w4
-	bcs	.L1843
-	ldrh	w6, [x1,-4]
+	beq	.L1802
+	ldr	w7, [x1, 4]
+	cmp	w4, w7
+	bls	.L1808
+	ldrh	w6, [x1]
 	cmp	w6, w5
 	csel	w4, w4, w7, eq
-	cmp	w6, w5
 	csel	w0, w0, w3, eq
-.L1843:
+.L1808:
 	add	w3, w3, 1
 	add	x1, x1, 16
-	uxth	w3, w3
-	b	.L1842
-.L1836:
+	and	w3, w3, 65535
+	b	.L1807
+.L1803:
+	add	x3, x3, 1
+	add	x5, x1, x3, lsl 4
+	ldrh	w5, [x5, -16]
+	cmp	w5, w4
+	bne	.L1801
+.L1802:
 	ret
+.L1806:
+	ldr	w5, [x4]
+	tbnz	w5, #31, .L1805
+	cmp	w6, w5
+	bls	.L1805
+	mov	w6, w5
+	mov	w0, w3
+.L1805:
+	add	w3, w3, 1
+	add	x4, x4, 16
+	and	w3, w3, 65535
+	b	.L1804
 	.size	select_l2p_ram_region, .-select_l2p_ram_region
 	.align	2
 	.global	log2phys
@@ -11240,377 +11065,370 @@ select_l2p_ram_region:
 log2phys:
 	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	adrp	x21, .LANCHOR2
-	add	x4, x21, :lo12:.LANCHOR2
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	ldr	w5, [x4,2924]
-	ldrh	w3, [x4,2352]
-	cmp	w0, w5
-	bcs	.L1854
-	add	w27, w3, 7
-	str	x1, [x29,104]
-	lsr	w28, w0, w27
+	add	x3, x21, :lo12:.LANCHOR2
+	stp	x19, x20, [sp, 16]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldr	w4, [x3, 2924]
+	cmp	w0, w4
+	bcs	.L1811
 	mov	w25, w0
-	str	w2, [x29,100]
+	ldrh	w0, [x3, 2352]
+	mov	x23, x1
+	ldr	x8, [x3, 2792]
+	add	w27, w0, 7
+	ldrh	w1, [x3, 2382]
 	mov	x0, 0
-	uxth	w22, w28
-	ldrh	w1, [x4,2382]
-	ldr	x19, [x4,2792]
-	b	.L1855
-.L1854:
-	mov	w0, -1
-	cbnz	w2, .L1856
-	str	w0, [x1]
-	b	.L1856
-.L1860:
-	add	x0, x0, 1
-	add	x2, x19, x0, lsl 4
-	ldrh	w2, [x2,-16]
-	cmp	w2, w22
-	beq	.L1857
-.L1855:
-	uxth	x20, w0
+	str	w2, [x29, 108]
+	lsr	w28, w25, w27
+	and	w22, w28, 65535
+.L1812:
+	and	x20, x0, 65535
 	cmp	w20, w1
-	bcc	.L1860
+	bcc	.L1817
 	bl	select_l2p_ram_region
-	uxth	x20, w0
+	and	x20, x0, 65535
 	ubfiz	x26, x20, 4, 16
 	mov	w2, 65535
-	add	x1, x19, x26
-	ldrh	w3, [x19,x26]
+	add	x1, x8, x26
+	ldrh	w3, [x8, x26]
 	cmp	w3, w2
-	bne	.L1868
-.L1861:
+	beq	.L1818
+	ldr	w1, [x1, 4]
+	tbz	w1, #31, .L1818
+	bl	flush_l2p_region
+.L1818:
 	add	x19, x21, :lo12:.LANCHOR2
 	ubfiz	x0, x22, 2, 16
-	ldr	x1, [x19,2768]
-	ldr	w24, [x1,x0]
-	cbnz	w24, .L1862
-	ldr	x0, [x19,2792]
+	ldr	x1, [x19, 2768]
+	ldr	w3, [x1, x0]
+	cbnz	w3, .L1819
+	ldr	x0, [x19, 2792]
 	mov	w1, 255
-	ldrh	w2, [x19,2354]
+	ldrh	w2, [x19, 2354]
 	add	x0, x0, x26
-	ldr	x0, [x0,8]
+	ldr	x0, [x0, 8]
 	bl	ftl_memset
-	ldr	x0, [x19,2792]
-	strh	w22, [x0,x26]
-	ldr	x0, [x19,2792]
+	ldr	x0, [x19, 2792]
+	strh	w22, [x0, x26]
+	ldr	x0, [x19, 2792]
 	add	x26, x0, x26
-	str	w24, [x26,4]
-.L1857:
-	mov	x1, 1
-	lsl	x3, x1, x27
-	ldr	w1, [x29,100]
-	sub	w3, w3, #1
-	and	w0, w25, w3
-	uxth	x0, w0
-	cbnz	w1, .L1858
+	str	wzr, [x26, 4]
+	b	.L1814
+.L1811:
+	mov	w0, -1
+	cbnz	w2, .L1810
+	str	w0, [x1]
+.L1810:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L1817:
+	add	x0, x0, 1
+	add	x2, x8, x0, lsl 4
+	ldrh	w2, [x2, -16]
+	cmp	w2, w22
+	bne	.L1812
+.L1814:
+	ldr	w1, [x29, 108]
+	mov	x0, 1
+	lsl	x0, x0, x27
+	sub	w0, w0, #1
+	and	w0, w0, w25
+	and	x0, x0, 65535
+	cbnz	w1, .L1815
 	add	x1, x21, :lo12:.LANCHOR2
-	ldr	x1, [x1,2792]
+	ldr	x1, [x1, 2792]
 	add	x1, x1, x20, lsl 4
-	ldr	x1, [x1,8]
-	ldr	w0, [x1,x0,lsl 2]
-	ldr	x1, [x29,104]
-	str	w0, [x1]
-	b	.L1859
-.L1858:
-	ldr	x2, [x29,104]
+	ldr	x1, [x1, 8]
+	ldr	w0, [x1, x0, lsl 2]
+	str	w0, [x23]
+.L1816:
+	add	x21, x21, :lo12:.LANCHOR2
+	ldr	x0, [x21, 2792]
+	add	x20, x0, x20, lsl 4
+	ldr	w0, [x20, 4]
+	cmn	w0, #1
+	beq	.L1823
+	add	w0, w0, 1
+	str	w0, [x20, 4]
+.L1823:
+	mov	w0, 0
+	b	.L1810
+.L1815:
 	add	x3, x21, :lo12:.LANCHOR2
 	lsl	x1, x20, 4
-	ldr	w4, [x2]
-	ldr	x2, [x3,2792]
+	ldr	w4, [x23]
+	ldr	x2, [x3, 2792]
 	add	x2, x2, x1
-	ldr	x2, [x2,8]
-	str	w4, [x2,x0,lsl 2]
-	ldr	x0, [x3,2792]
+	ldr	x2, [x2, 8]
+	str	w4, [x2, x0, lsl 2]
+	ldr	x0, [x3, 2792]
 	add	x0, x0, x1
-	ldr	w1, [x0,4]
+	ldr	w1, [x0, 4]
 	orr	w1, w1, -2147483648
-	str	w1, [x0,4]
+	str	w1, [x0, 4]
 	adrp	x0, .LANCHOR4+992
-	strh	w22, [x0,#:lo12:.LANCHOR4+992]
-.L1859:
-	add	x21, x21, :lo12:.LANCHOR2
-	ldr	x0, [x21,2792]
-	add	x20, x0, x20, lsl 4
-	mov	w0, 0
-	ldr	w1, [x20,4]
-	cmn	w1, #1
-	beq	.L1856
-	add	w1, w1, 1
-	str	w1, [x20,4]
-	b	.L1856
-.L1868:
-	ldr	w1, [x1,4]
-	tbz	w1, #31, .L1861
-	bl	flush_l2p_region
-	b	.L1861
-.L1862:
-	ldr	x0, [x19,2792]
-	mov	w1, 1
-	add	x23, x19, 2936
-	mov	w2, w1
+	strh	w22, [x0, #:lo12:.LANCHOR4+992]
+	b	.L1816
+.L1819:
+	ldr	x0, [x19, 2792]
+	add	x24, x19, 2936
+	mov	w2, 1
+	str	w3, [x19, 2940]
 	add	x0, x0, x26
-	str	w24, [x19,2940]
-	ldr	x0, [x0,8]
-	str	x0, [x19,2944]
-	ldr	x0, [x19,2640]
-	str	x0, [x19,2952]
-	mov	x0, x23
+	str	w3, [x29, 104]
+	mov	w1, w2
+	ldr	x0, [x0, 8]
+	str	x0, [x19, 2944]
+	ldr	x0, [x19, 2640]
+	str	x0, [x19, 2952]
+	mov	x0, x24
 	bl	FlashReadPages
-	ldr	x0, [x19,2952]
-	ldrh	w0, [x0,8]
+	ldr	x0, [x19, 2952]
+	ldr	w3, [x29, 104]
+	ldrh	w0, [x0, 8]
 	cmp	w0, w22
-	beq	.L1863
+	beq	.L1820
+	mov	w2, w3
+	and	w1, w28, 65535
 	adrp	x0, .LC42
-	uxth	w1, w28
-	mov	w2, w24
 	add	x0, x0, :lo12:.LC42
 	bl	printk
-	mov	w2, 4
-	ldr	x1, [x19,2952]
+	ldr	x1, [x19, 2952]
+	mov	w3, 4
 	adrp	x0, .LC18
-	mov	w3, w2
+	mov	w2, w3
 	add	x0, x0, :lo12:.LC18
 	bl	rknand_print_hex
+	ldrh	w3, [x19, 2380]
+	mov	w2, 4
+	ldr	x1, [x19, 2768]
 	adrp	x0, .LC43
-	ldr	x1, [x19,2768]
-	ldrh	w3, [x19,2380]
 	add	x0, x0, :lo12:.LC43
-	mov	w2, 4
 	bl	rknand_print_hex
 	mov	w0, 1
-	str	w0, [x19,2928]
-	b	.L1864
-.L1863:
-	ldr	w0, [x19,2936]
+	str	w0, [x19, 2928]
+.L1821:
+	add	x1, x21, :lo12:.LANCHOR2
+	ldr	x0, [x1, 2792]
+	add	x0, x0, x26
+	str	wzr, [x0, 4]
+	ldr	x0, [x1, 2792]
+	strh	w22, [x0, x26]
+	b	.L1814
+.L1820:
+	ldr	w0, [x19, 2936]
 	cmp	w0, 256
-	bne	.L1864
+	bne	.L1821
 	and	w28, w28, 65535
-	adrp	x0, .LC44
+	mov	w2, w3
 	mov	w1, w28
-	mov	w2, w24
+	adrp	x0, .LC44
 	add	x0, x0, :lo12:.LC44
 	bl	printk
-	ldr	x2, [x19,2792]
+	ldr	x0, [x19, 2792]
+	mov	w1, w28
+	add	x0, x0, x26
+	ldr	x2, [x0, 8]
 	adrp	x0, .LANCHOR4
 	add	x0, x0, :lo12:.LANCHOR4
-	mov	w1, w28
-	add	x2, x2, x26
 	add	x0, x0, 928
-	ldr	x2, [x2,8]
 	bl	FtlMapWritePage
-.L1864:
-	add	x1, x21, :lo12:.LANCHOR2
-	ldr	x0, [x1,2792]
-	add	x0, x0, x26
-	str	wzr, [x0,4]
-	ldr	x0, [x1,2792]
-	strh	w22, [x0,x26]
-	b	.L1857
-.L1856:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 112
-	ret
+	b	.L1821
 	.size	log2phys, .-log2phys
 	.align	2
 	.global	FtlVendorPartWrite
 	.type	FtlVendorPartWrite, %function
 FtlVendorPartWrite:
-	stp	x29, x30, [sp, -176]!
+	stp	x29, x30, [sp, -160]!
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	adrp	x24, .LANCHOR2
-	mov	w23, w0
-	add	x0, x24, :lo12:.LANCHOR2
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	mov	w21, w1
-	add	w1, w23, w1
-	ldrh	w22, [x0,2352]
-	mov	x26, x2
-	ldrh	w0, [x0,2340]
-	mov	w20, -1
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR2
+	add	x19, x19, :lo12:.LANCHOR2
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	mov	w22, w1
+	mov	w24, w0
+	add	w1, w0, w1
+	stp	x25, x26, [sp, 64]
+	ldrh	w0, [x19, 2340]
+	stp	x27, x28, [sp, 80]
 	cmp	w1, w0
-	bhi	.L1870
+	bhi	.L1834
+	ldrh	w23, [x19, 2352]
 	adrp	x27, .LANCHOR4
-	lsr	w22, w23, w22
 	add	x27, x27, :lo12:.LANCHOR4
-	mov	w20, 0
+	mov	x25, x2
 	add	x27, x27, 1000
-.L1871:
-	cbz	w21, .L1870
-	add	x2, x24, :lo12:.LANCHOR2
-	ldrh	w1, [x2,2350]
-	ldr	x0, [x2,2760]
-	udiv	w25, w23, w1
-	ldr	w3, [x0,w22,uxtw 2]
-	uxth	w0, w21
-	msub	w25, w25, w1, w23
-	sub	w19, w1, w25
-	uxth	w19, w19
-	cmp	w19, w21
-	csel	w19, w0, w19, hi
-	cmp	w19, w1
-	beq	.L1873
-	cbz	w3, .L1873
-	ldr	x0, [x2,2592]
-	mov	w1, 1
-	str	x0, [x29,128]
-	mov	w2, w1
-	add	x0, x29, 120
-	str	w3, [x29,124]
-	str	xzr, [x29,136]
+	mov	w26, 0
+	lsr	w23, w24, w23
+.L1828:
+	cbnz	w22, .L1833
+.L1826:
+	mov	w0, w26
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 160
+	ret
+.L1833:
+	ldrh	w1, [x19, 2350]
+	ldr	x0, [x19, 2760]
+	udiv	w21, w24, w1
+	ldr	w2, [x0, w23, uxtw 2]
+	and	w0, w22, 65535
+	msub	w21, w21, w1, w24
+	sub	w20, w1, w21
+	and	w20, w20, 65535
+	cmp	w22, w20
+	csel	w20, w0, w20, cc
+	cbz	w2, .L1830
+	cmp	w20, w1
+	beq	.L1830
+	ldr	x0, [x19, 2592]
+	str	w2, [x29, 108]
+	mov	w2, 1
+	stp	x0, xzr, [x29, 112]
+	mov	w1, w2
+	add	x0, x29, 104
 	bl	FlashReadPages
-	b	.L1874
-.L1873:
-	add	x2, x24, :lo12:.LANCHOR2
-	mov	w1, 0
-	ldr	x0, [x2,2592]
-	ldrh	w2, [x2,2354]
-	bl	ftl_memset
-.L1874:
-	add	x3, x24, :lo12:.LANCHOR2
-	lsl	w28, w19, 9
-	ubfiz	x25, x25, 9, 16
-	mov	x1, x26
+.L1831:
+	ldr	x0, [x19, 2592]
+	lsl	w21, w21, 9
+	lsl	w28, w20, 9
+	asr	w21, w21, 2
+	mov	x1, x25
 	mov	w2, w28
-	str	x3, [x29,104]
-	ldr	x0, [x3,2592]
-	sub	w21, w21, w19
-	add	w23, w23, w19
-	add	x26, x26, w28, sxtw
-	add	x0, x0, x25
+	add	x0, x0, w21, sxtw 2
 	bl	ftl_memcpy
-	ldr	x3, [x29,104]
-	mov	w1, w22
+	ldr	x2, [x19, 2592]
+	mov	w1, w23
 	mov	x0, x27
-	add	w22, w22, 1
-	ldr	x2, [x3,2592]
+	sub	w22, w22, w20
+	add	w24, w24, w20
+	add	x25, x25, w28, sxtw
+	add	w23, w23, 1
 	bl	FtlMapWritePage
 	cmn	w0, #1
-	csinv	w20, w20, wzr, ne
-	b	.L1871
-.L1870:
-	mov	w0, w20
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 176
-	ret
+	csinv	w26, w26, wzr, ne
+	b	.L1828
+.L1830:
+	ldrh	w2, [x19, 2354]
+	mov	w1, 0
+	ldr	x0, [x19, 2592]
+	bl	ftl_memset
+	b	.L1831
+.L1834:
+	mov	w26, -1
+	b	.L1826
 	.size	FtlVendorPartWrite, .-FtlVendorPartWrite
 	.align	2
 	.global	FtlVendorPartRead
 	.type	FtlVendorPartRead, %function
 FtlVendorPartRead:
-	stp	x29, x30, [sp, -192]!
+	stp	x29, x30, [sp, -176]!
 	add	x29, sp, 0
-	stp	x25, x26, [sp,64]
-	adrp	x25, .LANCHOR2
-	stp	x23, x24, [sp,48]
-	mov	w23, w0
-	add	x0, x25, :lo12:.LANCHOR2
-	stp	x21, x22, [sp,32]
-	stp	x27, x28, [sp,80]
-	stp	x19, x20, [sp,16]
-	mov	w22, w1
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR2
+	add	x19, x19, :lo12:.LANCHOR2
+	stp	x23, x24, [sp, 48]
+	stp	x21, x22, [sp, 32]
+	mov	w24, w0
+	mov	w23, w1
+	stp	x25, x26, [sp, 64]
+	add	w1, w0, w1
+	stp	x27, x28, [sp, 80]
+	ldrh	w0, [x19, 2340]
+	cmp	w1, w0
+	bhi	.L1848
+	ldrh	w22, [x19, 2352]
+	adrp	x25, .LANCHOR4
+	add	x25, x25, :lo12:.LANCHOR4
 	mov	x27, x2
-	add	w2, w23, w1
-	ldrh	w1, [x0,2340]
-	ldrh	w20, [x0,2352]
-	mov	w0, -1
-	cmp	w2, w1
-	bhi	.L1885
-	adrp	x0, .LC45
-	adrp	x26, .LANCHOR4
-	add	x0, x0, :lo12:.LC45
-	add	x26, x26, :lo12:.LANCHOR4
-	str	x0, [x29,120]
-	lsr	w20, w23, w20
-	add	x0, x26, 1000
-	mov	w21, 0
-	str	x0, [x29,112]
-.L1886:
-	cbz	w22, .L1894
-	add	x26, x25, :lo12:.LANCHOR2
-	ldrh	w19, [x26,2350]
-	ldr	x0, [x26,2760]
-	udiv	w24, w23, w19
-	ldr	w4, [x0,w20,uxtw 2]
-	uxth	w0, w22
-	msub	w24, w24, w19, w23
-	sub	w19, w19, w24
-	uxth	w19, w19
-	cmp	w19, w22
-	csel	w19, w0, w19, hi
-	lsl	w28, w19, 9
-	cbz	w4, .L1888
-	ldr	x0, [x26,2592]
-	mov	w1, 1
-	str	x0, [x29,144]
-	mov	w2, w1
-	add	x0, x29, 136
-	str	w4, [x29,140]
-	str	x4, [x29,104]
-	str	xzr, [x29,152]
+	add	x25, x25, 1000
+	mov	w26, 0
+	lsr	w22, w24, w22
+.L1841:
+	cbnz	w23, .L1847
+.L1839:
+	mov	w0, w26
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 176
+	ret
+.L1847:
+	ldrh	w20, [x19, 2350]
+	ldr	x0, [x19, 2760]
+	udiv	w21, w24, w20
+	ldr	w3, [x0, w22, uxtw 2]
+	and	w0, w23, 65535
+	msub	w21, w21, w20, w24
+	sub	w20, w20, w21
+	and	w20, w20, 65535
+	cmp	w23, w20
+	csel	w20, w0, w20, cc
+	lsl	w28, w20, 9
+	cbz	w3, .L1843
+	ldr	x0, [x19, 2592]
+	mov	w2, 1
+	str	w3, [x29, 108]
+	mov	w1, w2
+	str	w3, [x29, 124]
+	stp	x0, xzr, [x29, 128]
+	add	x0, x29, 120
 	bl	FlashReadPages
-	ldr	w0, [x29,136]
-	ldr	x4, [x29,104]
+	ldr	w0, [x29, 120]
+	ldr	w3, [x29, 108]
 	cmn	w0, #1
-	ldr	w0, [x26,2936]
-	csinv	w21, w21, wzr, ne
+	ldr	w0, [x19, 2936]
+	csinv	w26, w26, wzr, ne
 	cmp	w0, 256
-	bne	.L1890
-	ldr	x0, [x29,120]
-	mov	w1, w20
-	mov	w2, w4
+	bne	.L1845
+	mov	w2, w3
+	mov	w1, w22
+	adrp	x0, .LC45
+	add	x0, x0, :lo12:.LC45
 	bl	printk
-	ldr	x0, [x29,112]
-	mov	w1, w20
-	ldr	x2, [x26,2592]
+	ldr	x2, [x19, 2592]
+	mov	w1, w22
+	mov	x0, x25
 	bl	FtlMapWritePage
-.L1890:
-	add	x0, x25, :lo12:.LANCHOR2
-	ubfiz	x24, x24, 9, 16
+.L1845:
+	ldr	x1, [x19, 2592]
+	lsl	w21, w21, 9
+	asr	w21, w21, 2
 	mov	w2, w28
-	ldr	x1, [x0,2592]
 	mov	x0, x27
-	add	x1, x1, x24
+	add	x1, x1, w21, sxtw 2
 	bl	ftl_memcpy
-	b	.L1891
-.L1888:
-	mov	x0, x27
-	mov	w1, w4
+.L1846:
+	add	w22, w22, 1
+	sub	w23, w23, w20
+	add	w24, w24, w20
+	add	x27, x27, w28, sxtw
+	b	.L1841
+.L1843:
 	mov	w2, w28
+	mov	w1, 0
+	mov	x0, x27
 	bl	ftl_memset
-.L1891:
-	add	w20, w20, 1
-	sub	w22, w22, w19
-	add	w23, w23, w19
-	add	x27, x27, w28, sxtw
-	b	.L1886
-.L1894:
-	mov	w0, w21
-.L1885:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 192
-	ret
+	b	.L1846
+.L1848:
+	mov	w26, -1
+	b	.L1839
 	.size	FtlVendorPartRead, .-FtlVendorPartRead
 	.align	2
 	.global	FtlUpdateVaildLpn
@@ -11618,298 +11436,296 @@ FtlVendorPartRead:
 FtlUpdateVaildLpn:
 	adrp	x1, .LANCHOR4
 	add	x3, x1, :lo12:.LANCHOR4
-	ldrh	w2, [x3,1064]
-	cbnz	w0, .L1896
+	ldrh	w2, [x3, 1064]
 	cmp	w2, 4
-	bhi	.L1896
+	bhi	.L1851
+	cbnz	w0, .L1851
 	add	w2, w2, 1
-	strh	w2, [x3,1064]
-	b	.L1895
-.L1896:
+	strh	w2, [x3, 1064]
+	ret
+.L1851:
 	add	x0, x1, :lo12:.LANCHOR4
-	mov	w7, 65535
-	strh	wzr, [x0,1064]
-	str	wzr, [x0,1068]
-	adrp	x0, .LANCHOR2
-	add	x0, x0, :lo12:.LANCHOR2
-	ldrh	w5, [x0,2284]
-	ldr	x6, [x0,2712]
-	mov	x0, 0
-.L1897:
-	cmp	w5, w0, uxth
-	bls	.L1895
-	ldrh	w4, [x6,x0,lsl 1]
-	cmp	w4, w7
-	beq	.L1898
-	add	x3, x1, :lo12:.LANCHOR4
-	ldr	w2, [x3,1068]
-	add	w2, w4, w2
-	str	w2, [x3,1068]
-.L1898:
-	add	x0, x0, 1
-	b	.L1897
-.L1895:
+	adrp	x1, .LANCHOR2
+	add	x1, x1, :lo12:.LANCHOR2
+	mov	w6, 65535
+	strh	wzr, [x0, 1064]
+	ldrh	w4, [x1, 2284]
+	ldr	x5, [x1, 2712]
+	mov	x1, 0
+	str	wzr, [x0, 1068]
+.L1852:
+	cmp	w4, w1, uxth
+	bhi	.L1854
 	ret
+.L1854:
+	ldrh	w3, [x5, x1, lsl 1]
+	cmp	w3, w6
+	beq	.L1853
+	ldr	w2, [x0, 1068]
+	add	w2, w2, w3
+	str	w2, [x0, 1068]
+.L1853:
+	add	x1, x1, 1
+	b	.L1852
 	.size	FtlUpdateVaildLpn, .-FtlUpdateVaildLpn
 	.align	2
 	.global	FtlMapBlkWriteDumpData
 	.type	FtlMapBlkWriteDumpData, %function
 FtlMapBlkWriteDumpData:
+	ldr	w1, [x0, 56]
+	cbz	w1, .L1863
 	stp	x29, x30, [sp, -48]!
+	adrp	x2, .LANCHOR2
+	add	x1, x2, :lo12:.LANCHOR2
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	str	x21, [sp,32]
-	ldr	w1, [x0,56]
-	ldrh	w19, [x0,6]
-	ldr	x4, [x0,40]
-	cbz	w1, .L1901
-	adrp	x1, .LANCHOR2
-	str	wzr, [x0,56]
-	add	x2, x1, :lo12:.LANCHOR2
-	mov	x21, x1
-	ldr	w3, [x2,2928]
-	cbnz	w3, .L1901
+	str	x21, [sp, 32]
+	mov	x21, x2
+	stp	x19, x20, [sp, 16]
+	str	wzr, [x0, 56]
+	ldr	w3, [x1, 2928]
+	ldrh	w19, [x0, 6]
+	ldr	x4, [x0, 40]
+	cbnz	w3, .L1856
 	mov	x20, x0
+	add	x0, x1, 2936
 	sub	w19, w19, #1
-	add	x0, x2, 2936
-	ldr	x3, [x2,2640]
-	uxth	w19, w19
-	ldr	x1, [x2,2584]
-	str	x3, [x0,16]
-	ubfiz	x3, x19, 2, 16
-	str	x1, [x0,8]
-	ldr	w3, [x4,x3]
-	str	w3, [x0,4]
-	cbz	w3, .L1905
-	mov	w1, 1
-	mov	w2, w1
+	ldr	x2, [x1, 2640]
+	and	w19, w19, 65535
+	ldr	x3, [x1, 2584]
+	stp	x3, x2, [x0, 8]
+	ubfiz	x2, x19, 2, 16
+	ldr	w2, [x4, x2]
+	str	w2, [x0, 4]
+	cbz	w2, .L1860
+	mov	w2, 1
+	mov	w1, w2
 	bl	FlashReadPages
-	b	.L1906
-.L1905:
-	ldrh	w2, [x2,2354]
-	mov	x0, x1
-	mov	w1, 255
-	bl	ftl_memset
-.L1906:
-	add	x2, x21, :lo12:.LANCHOR2
-	mov	x0, x20
+.L1861:
+	add	x0, x21, :lo12:.LANCHOR2
 	mov	w1, w19
-	ldr	x2, [x2,2944]
+	ldr	x2, [x0, 2944]
+	mov	x0, x20
 	bl	FtlMapWritePage
-.L1901:
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
+.L1856:
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
+.L1860:
+	ldrh	w2, [x1, 2354]
+	mov	x0, x3
+	mov	w1, 255
+	bl	ftl_memset
+	b	.L1861
+.L1863:
+	ret
 	.size	FtlMapBlkWriteDumpData, .-FtlMapBlkWriteDumpData
 	.align	2
 	.global	FtlVpcTblFlush
 	.type	FtlVpcTblFlush, %function
 FtlVpcTblFlush:
-	stp	x29, x30, [sp, -96]!
+	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
 	adrp	x22, .LANCHOR2
-	str	x27, [sp,80]
-	stp	x19, x20, [sp,16]
 	add	x19, x22, :lo12:.LANCHOR2
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	ldr	w1, [x19,2928]
-	cbnz	w1, .L1909
-	ldr	x0, [x19,2576]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	ldr	w0, [x19, 2928]
+	cbnz	w0, .L1868
+	ldr	x0, [x19, 2576]
 	adrp	x25, .LANCHOR4
-	str	x0, [x19,2944]
+	str	x0, [x19, 2944]
 	add	x0, x25, :lo12:.LANCHOR4
-	ldr	x21, [x19,2640]
+	ldr	x21, [x19, 2640]
 	add	x20, x0, 696
-	str	x21, [x19,2952]
+	str	x21, [x19, 2952]
 	adrp	x23, .LANCHOR0
-	ldrh	w3, [x0,1072]
-	strh	w3, [x21,2]
-	mov	w3, -3932
-	strh	w3, [x21]
-	str	w1, [x21,12]
-	ldr	w3, [x0,1080]
-	str	w1, [x21,8]
-	mov	w1, 19539
-	movk	w1, 0x4654, lsl 16
-	str	w3, [x21,4]
-	ldrh	w2, [x0,784]
-	str	w1, [x0,696]
-	mov	w1, 99
-	strh	w2, [x20,14]
-	movk	w1, 0x5000, lsl 16
-	ldrh	w2, [x0,786]
-	ldrb	w3, [x0,790]
-	str	w1, [x20,4]
-	ldrh	w1, [x0,1078]
+	ldrh	w2, [x0, 1072]
+	strh	w2, [x21, 2]
+	mov	w2, -3932
+	strh	w2, [x21]
+	str	wzr, [x21, 12]
+	ldr	w2, [x0, 1080]
+	stp	w2, wzr, [x21, 4]
+	mov	w2, 19539
+	movk	w2, 0x4654, lsl 16
+	str	w2, [x0, 696]
+	mov	w2, 99
+	ldrb	w3, [x0, 790]
+	movk	w2, 0x5000, lsl 16
+	str	w2, [x20, 4]
+	ldrh	w2, [x0, 784]
+	strh	w2, [x20, 14]
+	ldrh	w2, [x0, 786]
+	ldrh	w1, [x0, 1078]
+	strh	w1, [x20, 8]
 	orr	w2, w3, w2, lsl 6
-	strh	w1, [x20,8]
-	ldrh	w1, [x19,2298]
-	strb	w1, [x20,10]
-	ldrb	w1, [x0,792]
-	strh	w2, [x20,16]
-	strb	w1, [x20,11]
-	ldrh	w2, [x0,832]
-	ldrb	w1, [x0,840]
-	strb	w1, [x20,12]
+	ldrh	w1, [x19, 2298]
+	strb	w1, [x20, 10]
+	strh	w2, [x20, 16]
+	ldrb	w1, [x0, 792]
+	ldrh	w2, [x0, 832]
+	ldrb	w3, [x0, 838]
+	strb	w1, [x20, 11]
+	strh	w2, [x20, 18]
+	ldrb	w1, [x0, 840]
+	ldrh	w2, [x0, 834]
+	strb	w1, [x20, 12]
 	add	x1, x0, 880
-	strh	w2, [x20,18]
-	ldrh	w2, [x0,834]
-	ldrb	w3, [x0,838]
-	ldrh	w0, [x0,880]
+	ldrh	w0, [x0, 880]
 	orr	w2, w3, w2, lsl 6
-	strh	w0, [x20,22]
-	strh	w2, [x20,20]
-	ldrh	w0, [x1,2]
-	ldrb	w2, [x1,6]
+	strh	w2, [x20, 20]
+	strh	w0, [x20, 22]
+	ldrb	w2, [x1, 6]
+	ldrh	w0, [x1, 2]
 	orr	w0, w2, w0, lsl 6
-	strh	w0, [x20,24]
-	ldrb	w0, [x1,8]
+	strh	w0, [x20, 24]
+	ldrb	w0, [x1, 8]
 	mov	w1, 255
-	strb	w0, [x20,13]
-	ldr	w0, [x19,2428]
-	str	w0, [x20,32]
-	ldr	w0, [x19,2396]
-	str	w0, [x20,40]
-	ldr	w0, [x19,2400]
-	str	w0, [x20,36]
-	ldrh	w0, [x19,2472]
-	strh	w0, [x20,44]
-	ldrh	w0, [x19,2474]
-	strh	w0, [x20,46]
-	ldrh	w2, [x19,2354]
-	ldr	x0, [x19,2944]
+	strb	w0, [x20, 13]
+	ldr	w0, [x19, 2428]
+	str	w0, [x20, 32]
+	ldr	w0, [x19, 2396]
+	str	w0, [x20, 40]
+	ldr	w0, [x19, 2400]
+	str	w0, [x20, 36]
+	ldrh	w0, [x19, 2472]
+	strh	w0, [x20, 44]
+	ldrh	w0, [x19, 2474]
+	strh	w0, [x20, 46]
+	ldrh	w2, [x19, 2354]
+	ldr	x0, [x19, 2944]
 	bl	ftl_memset
-	ldr	x0, [x19,2944]
+	ldr	x0, [x19, 2944]
 	mov	x1, x20
 	mov	w2, 48
 	mov	x20, x25
 	bl	ftl_memcpy
-	ldr	x0, [x19,2944]
-	ldrh	w2, [x19,2284]
-	ldr	x1, [x19,2712]
-	add	x0, x0, 48
+	ldr	x1, [x19, 2712]
+	ldrh	w2, [x19, 2284]
+	ldr	x0, [x19, 2944]
 	lsl	w2, w2, 1
+	add	x0, x0, 48
 	bl	ftl_memcpy
-	ldrh	w2, [x19,2284]
 	add	x1, x23, :lo12:.LANCHOR0
-	ldr	x3, [x19,2944]
-	ubfiz	x0, x2, 1, 16
-	lsr	w2, w2, 3
-	add	x0, x0, 51
-	ldr	x1, [x1,16]
-	and	x0, x0, 262140
+	ldrh	w0, [x19, 2284]
+	ldr	x3, [x19, 2944]
+	ldr	x1, [x1, 80]
+	lsr	w2, w0, 3
+	ubfiz	x0, x0, 1, 16
 	add	w2, w2, 4
+	add	x0, x0, 51
+	and	x0, x0, -4
 	add	x0, x3, x0
 	bl	ftl_memcpy
-	ldrh	w0, [x19,2384]
-	cbz	w0, .L1910
-	ldrh	w0, [x19,2284]
-	ldrh	w2, [x19,2380]
+	ldrh	w0, [x19, 2384]
+	cbz	w0, .L1869
+	ldrh	w0, [x19, 2284]
+	ldr	x3, [x19, 2944]
+	ldrh	w2, [x19, 2380]
 	lsr	w1, w0, 3
 	add	w0, w1, w0, lsl 1
-	ldr	x1, [x19,2944]
+	ldr	x1, [x19, 2768]
 	add	w0, w0, 52
 	lsl	w2, w2, 2
 	and	x0, x0, 65532
-	add	x0, x1, x0
-	ldr	x1, [x19,2768]
+	add	x0, x3, x0
 	bl	ftl_memcpy
-.L1910:
-	mov	w0, 0
+.L1869:
+	add	x19, x20, :lo12:.LANCHOR4
+	add	x26, x22, :lo12:.LANCHOR2
+	add	x19, x19, 1072
+	add	x23, x23, :lo12:.LANCHOR0
 	mov	w24, 0
 	mov	w25, 65535
-	add	x19, x22, :lo12:.LANCHOR2
-	add	x20, x20, :lo12:.LANCHOR4
+	mov	w0, 0
 	bl	FtlUpdateVaildLpn
-.L1911:
-	ldrh	w1, [x20,1072]
-	ldr	x0, [x19,2576]
-	ldrh	w2, [x20,1074]
-	str	x0, [x19,2944]
-	ldr	x0, [x19,2640]
-	str	x0, [x19,2952]
+.L1870:
+	ldrh	w2, [x19, 2]
+	ldrh	w1, [x19]
+	ldr	x0, [x26, 2576]
+	str	x0, [x26, 2944]
+	ldr	x0, [x26, 2640]
+	str	x0, [x26, 2952]
 	orr	w0, w2, w1, lsl 10
-	str	w0, [x19,2940]
-	ldrh	w0, [x19,2346]
+	str	w0, [x26, 2940]
+	ldrh	w0, [x26, 2346]
 	sub	w0, w0, #1
 	cmp	w2, w0
-	blt	.L1912
-	ldrh	w25, [x20,1076]
-	strh	wzr, [x20,1074]
-	strh	w1, [x20,1076]
+	blt	.L1871
+	ldrh	w25, [x19, 4]
+	strh	wzr, [x19, 2]
+	strh	w1, [x19, 4]
 	bl	FtlFreeSysBlkQueueOut
-	ldr	w1, [x19,2396]
-	str	w1, [x20,1080]
+	ldr	w1, [x26, 2396]
+	str	w1, [x19, 8]
 	add	w2, w1, 1
-	str	w2, [x19,2396]
+	str	w2, [x26, 2396]
 	ubfiz	w2, w0, 10, 16
-	str	w2, [x19,2940]
-	strh	w0, [x20,1072]
-	str	w1, [x21,4]
-	strh	w0, [x21,2]
-.L1912:
-	add	x0, x23, :lo12:.LANCHOR0
-	ldrb	w0, [x0,88]
-	cbz	w0, .L1913
-	ldr	x0, [x19,2576]
-	ldrh	w1, [x19,2354]
+	str	w2, [x26, 2940]
+	strh	w0, [x19]
+	strh	w0, [x21, 2]
+	str	w1, [x21, 4]
+.L1871:
+	ldrb	w0, [x23, 88]
+	cbz	w0, .L1872
+	ldrh	w1, [x26, 2354]
+	ldr	x0, [x26, 2576]
 	bl	js_hash
-	str	w0, [x21,12]
-.L1913:
-	mov	w1, 1
-	add	x0, x19, 2936
-	mov	w2, w1
-	mov	w3, w1
+	str	w0, [x21, 12]
+.L1872:
+	mov	w3, 1
+	add	x0, x26, 2936
+	mov	w1, w3
+	mov	w2, w3
 	bl	FlashProgPages
-	ldrh	w1, [x20,1074]
-	ldr	w2, [x19,2936]
-	add	w1, w1, 1
-	cmn	w2, #1
-	uxth	w1, w1
-	strh	w1, [x20,1074]
-	bne	.L1914
-	cmp	w1, 1
-	bne	.L1915
-	ldrh	w1, [x19,2346]
-	sub	w1, w1, #1
-	strh	w1, [x20,1074]
-.L1915:
+	ldrh	w0, [x19, 2]
+	ldr	w1, [x26, 2936]
+	add	w0, w0, 1
+	and	w0, w0, 65535
+	strh	w0, [x19, 2]
+	cmn	w1, #1
+	bne	.L1873
+	cmp	w0, 1
+	bne	.L1874
+	ldrh	w0, [x26, 2346]
+	sub	w0, w0, #1
+	strh	w0, [x19, 2]
+.L1874:
 	add	w24, w24, 1
-	uxth	w24, w24
+	and	w24, w24, 65535
 	cmp	w24, 3
-	bls	.L1911
+	bls	.L1870
 	add	x22, x22, :lo12:.LANCHOR2
+	mov	w2, w24
 	adrp	x0, .LC46
 	add	x0, x0, :lo12:.LC46
-	mov	w2, w24
-	ldr	w1, [x22,2940]
+	ldr	w1, [x22, 2940]
 	bl	printk
 	mov	w0, 1
-	str	w0, [x22,2928]
-	b	.L1909
-.L1914:
-	cmp	w1, 1
-	beq	.L1911
-	cmp	w2, 256
-	beq	.L1911
+	str	w0, [x22, 2928]
+.L1868:
+	mov	w0, 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	ret
+.L1873:
+	cmp	w0, 1
+	beq	.L1870
+	cmp	w1, 256
+	beq	.L1870
 	mov	w0, 65535
 	cmp	w25, w0
-	beq	.L1909
-	mov	w0, w25
+	beq	.L1868
 	mov	w1, 1
+	mov	w0, w25
 	bl	FtlFreeSysBlkQueueIn
-.L1909:
-	mov	w0, 0
-	ldr	x27, [sp,80]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 96
-	ret
+	b	.L1868
 	.size	FtlVpcTblFlush, .-FtlVpcTblFlush
 	.align	2
 	.global	FtlScanSysBlk
@@ -11918,470 +11734,434 @@ FtlScanSysBlk:
 	stp	x29, x30, [sp, -128]!
 	mov	w1, 0
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	adrp	x22, .LANCHOR2
-	stp	x19, x20, [sp,16]
-	add	x20, x22, :lo12:.LANCHOR2
-	adrp	x19, .LANCHOR4
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	add	x21, x19, :lo12:.LANCHOR4
-	strh	wzr, [x20,2920]
-	ldr	w2, [x20,2372]
-	mov	x24, x22
-	ldr	x0, [x20,2784]
-	mov	w22, 65535
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
+	adrp	x21, .LANCHOR2
+	add	x19, x21, :lo12:.LANCHOR2
+	adrp	x22, .LANCHOR4
+	add	x20, x22, :lo12:.LANCHOR4
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	mov	w25, 56
+	ldr	x0, [x19, 2784]
+	ldr	w2, [x19, 2372]
+	stp	x27, x28, [sp, 80]
+	strh	wzr, [x20, 1088]
 	lsl	w2, w2, 2
-	strh	wzr, [x21,1088]
+	strh	wzr, [x19, 2920]
 	bl	ftl_memset
-	ldr	w2, [x20,2372]
+	ldr	x0, [x19, 2720]
 	mov	w1, 0
-	ldr	x0, [x20,2720]
+	ldr	w2, [x19, 2372]
 	lsl	w2, w2, 1
 	bl	ftl_memset
-	ldrh	w2, [x20,2364]
+	ldr	x0, [x19, 2752]
 	mov	w1, 0
-	ldr	x0, [x20,2752]
+	ldrh	w2, [x19, 2364]
 	lsl	w2, w2, 2
 	bl	ftl_memset
-	ldrh	w2, [x20,2364]
+	ldr	x0, [x19, 2736]
 	mov	w1, 0
-	ldr	x0, [x20,2736]
+	ldrh	w2, [x19, 2364]
 	lsl	w2, w2, 1
 	bl	ftl_memset
-	add	x0, x21, 1072
-	mov	w1, 255
 	mov	w2, 16
+	mov	w1, 255
+	add	x0, x20, 1072
 	bl	ftl_memset
-	ldrh	w21, [x20,2284]
-.L1925:
-	add	x1, x24, :lo12:.LANCHOR2
-	ldrh	w0, [x1,2286]
-	cmp	w0, w21
-	bls	.L1966
-	mov	x27, 0
-	ldrh	w4, [x1,2276]
-	ldrh	w2, [x1,2356]
-	mov	w20, w27
-	mov	x23, x1
-.L1967:
-	cmp	w4, w27, uxth
-	bls	.L2000
-	add	x0, x23, 2304
-	mov	w1, w21
-	str	x2, [x29,112]
-	str	x4, [x29,120]
-	ldrb	w0, [x0,x27]
+	ldrh	w23, [x19, 2284]
+	add	x0, x19, 2304
+	str	x0, [x29, 112]
+.L1891:
+	ldrh	w0, [x19, 2286]
+	cmp	w0, w23
+	bls	.L1930
+	ldrh	w8, [x19, 2276]
+	mov	x5, 0
+	ldrh	w7, [x19, 2356]
+	mov	w20, 0
+	mov	w6, 4
+	b	.L1931
+.L1893:
+	ldr	x0, [x29, 112]
+	mov	w1, w23
+	ldrb	w0, [x0, x5]
 	bl	V2P_block
-	uxth	w28, w0
+	and	w4, w0, 65535
 	bl	FtlBbmIsBadBlock
-	ldr	x4, [x29,120]
-	ldr	x2, [x29,112]
-	cbnz	w0, .L1926
-	mov	w0, 56
-	ldr	x1, [x23,2520]
-	lsl	w28, w28, 10
-	mov	w3, 4
-	umull	x0, w20, w0
-	add	x1, x1, x0
-	str	w28, [x1,4]
-	ldr	x1, [x23,2520]
-	ldr	x5, [x23,2656]
-	add	x0, x1, x0
-	ldr	x1, [x23,2600]
-	str	x1, [x0,8]
-	mul	w1, w20, w2
+	cbnz	w0, .L1892
+	umull	x2, w20, w25
+	ldr	x0, [x19, 2520]
+	lsl	w4, w4, 10
+	add	x0, x0, x2
+	str	w4, [x0, 4]
+	ldr	x1, [x19, 2520]
+	ldr	x0, [x19, 2600]
+	add	x1, x1, x2
+	ldr	x2, [x19, 2656]
+	str	x0, [x1, 8]
+	mul	w0, w20, w7
 	add	w20, w20, 1
-	sdiv	w1, w1, w3
-	uxth	w20, w20
-	add	x1, x5, w1, sxtw 2
-	str	x1, [x0,16]
-.L1926:
-	add	x27, x27, 1
-	b	.L1967
-.L2000:
-	cbz	w20, .L1929
-	add	x0, x24, :lo12:.LANCHOR2
-	mov	w1, w20
+	and	w20, w20, 65535
+	sdiv	w0, w0, w6
+	add	x0, x2, w0, sxtw 2
+	str	x0, [x1, 16]
+.L1892:
+	add	x5, x5, 1
+.L1931:
+	cmp	w8, w5, uxth
+	bhi	.L1893
+	cbnz	w20, .L1894
+.L1929:
+	add	w23, w23, 1
+	and	w23, w23, 65535
+	b	.L1891
+.L1894:
+	ldr	x0, [x19, 2520]
 	mov	w2, 1
-	mov	x23, 0
-	mov	w27, -1
-	mov	w28, 61604
-	ldr	x0, [x0,2520]
+	mov	w1, w20
+	add	x24, x22, :lo12:.LANCHOR4
+	add	x27, x24, 1072
+	mov	x26, 0
 	bl	FlashReadPages
-.L1930:
-	cmp	w20, w23, uxth
-	bls	.L1929
-	mov	x0, 56
-	mul	x6, x23, x0
-	add	x0, x24, :lo12:.LANCHOR2
-	ldr	x0, [x0,2520]
-	add	x1, x0, x6
-	ldr	w0, [x0,x6]
-	ldr	w5, [x1,4]
+	umull	x0, w20, w25
+	str	x0, [x29, 120]
+.L1928:
+	ldr	x0, [x19, 2520]
+	add	x1, x0, x26
+	ldr	w0, [x0, x26]
+	ldr	w28, [x1, 4]
 	cmn	w0, #1
-	ldr	x26, [x1,16]
-	ubfx	x25, x5, 10, 16
-	bne	.L1932
-	mov	w7, 16
-.L1931:
-	add	x8, x24, :lo12:.LANCHOR2
-	str	x7, [x29,104]
-	str	x8, [x29,112]
-	str	x6, [x29,120]
-	ldr	x0, [x8,2520]
-	add	x0, x0, x6
-	ldr	w1, [x0,4]
+	ldr	x20, [x1, 16]
+	ubfx	x28, x28, 10, 16
+	bne	.L1897
+	mov	w6, 16
+	mov	w7, 65535
+.L1899:
+	ldr	x0, [x19, 2520]
+	mov	w2, 1
+	stp	w7, w6, [x29, 104]
+	add	x0, x0, x26
+	ldr	w1, [x0, 4]
 	add	w1, w1, 1
-	str	w1, [x0,4]
-	mov	w1, 1
-	ldr	x0, [x8,2520]
-	mov	w2, w1
-	add	x0, x0, x6
+	str	w1, [x0, 4]
+	mov	w1, w2
+	ldr	x0, [x19, 2520]
+	add	x0, x0, x26
 	bl	FlashReadPages
-	ldrh	w0, [x26]
-	ldr	x8, [x29,112]
-	cmp	w0, w22
-	ldr	x6, [x29,120]
-	ldr	x7, [x29,104]
-	ldr	x0, [x8,2520]
-	bne	.L1933
-	str	w27, [x0,x6]
-	b	.L1932
-.L1933:
-	ldr	w0, [x0,x6]
-	cmn	w0, #1
-	bne	.L1932
-	sub	w7, w7, #1
-	uxth	w7, w7
-	cbnz	w7, .L1931
-.L1932:
-	add	x0, x24, :lo12:.LANCHOR2
-	ldr	x1, [x0,2520]
-	ldr	w1, [x1,x6]
-	cmn	w1, #1
-	beq	.L1935
-	ldr	w0, [x0,2396]
-	cmn	w0, #1
-	beq	.L1936
-	ldr	w1, [x26,4]
+	ldp	w7, w6, [x29, 104]
+	ldrh	w0, [x20]
+	cmp	w0, w7
+	ldr	x0, [x19, 2520]
+	bne	.L1896
+	mov	w1, -1
+	str	w1, [x0, x26]
+	ldr	x0, [x19, 2520]
+	ldr	w0, [x0, x26]
 	cmp	w0, w1
-	bhi	.L1937
-.L1936:
-	ldr	w0, [x26,4]
+	beq	.L1965
+.L1897:
+	ldr	w0, [x19, 2396]
+	ldr	w10, [x20, 4]
 	cmn	w0, #1
-	beq	.L1937
-	add	x1, x24, :lo12:.LANCHOR2
-	add	w0, w0, 1
-	str	w0, [x1,2396]
-.L1937:
-	ldrh	w0, [x26]
-	cmp	w0, w28
-	beq	.L1939
-	bhi	.L1940
+	beq	.L1900
+	cmp	w0, w10
+	bhi	.L1901
+.L1900:
+	cmn	w10, #1
+	beq	.L1901
+	add	w0, w10, 1
+	str	w0, [x19, 2396]
+.L1901:
+	ldrh	w0, [x20]
+	mov	w1, 61604
+	cmp	w0, w1
+	beq	.L1903
+	bhi	.L1904
 	mov	w1, 61574
 	cmp	w0, w1
-	bne	.L1938
-	add	x6, x24, :lo12:.LANCHOR2
-	ldrh	w7, [x6,2364]
-	ldrh	w0, [x6,2920]
-	sub	w2, w7, #1
-	ldr	x6, [x6,2752]
-	sxth	x1, w2
-	sub	w2, w2, w0
-	b	.L1953
-.L1940:
+	beq	.L1905
+.L1902:
+	ldr	x0, [x29, 120]
+	add	x26, x26, 56
+	cmp	x26, x0
+	bne	.L1928
+	b	.L1929
+.L1896:
+	ldr	w0, [x0, x26]
+	cmn	w0, #1
+	bne	.L1897
+	sub	w6, w6, #1
+	ands	w6, w6, 65535
+	bne	.L1899
+.L1965:
+	mov	w1, 0
+	mov	w0, w28
+	bl	FtlFreeSysBlkQueueIn
+	b	.L1902
+.L1904:
 	mov	w1, 61634
 	cmp	w0, w1
-	beq	.L1942
-	cmp	w0, w22
-	bne	.L1938
-	mov	w0, w25
-	b	.L1999
-.L1942:
-	add	x7, x24, :lo12:.LANCHOR2
-	add	x0, x19, :lo12:.LANCHOR4
-	ldr	w6, [x7,2372]
-	ldrh	w0, [x0,1088]
-	ldr	x7, [x7,2784]
-	uxth	w2, w6
-	sub	w1, w2, #1
-	sub	w2, w2, w0
+	beq	.L1906
+	mov	w1, 65535
+	cmp	w0, w1
+	beq	.L1965
+	b	.L1902
+.L1906:
+	ldr	w6, [x19, 2372]
+	ldrh	w1, [x24, 1088]
+	and	w2, w6, 65535
+	ldr	x7, [x19, 2784]
+	sub	w0, w2, #1
+	sub	w2, w2, w1
 	sub	w2, w2, #1
-	sxth	x1, w1
+	sxth	x0, w0
 	sxth	w2, w2
-.L1944:
-	cmp	w1, w2
-	ble	.L2001
-	sbfiz	x8, x1, 2, 32
-	ldr	w11, [x26,4]
-	sxth	x9, w1
-	ldr	w10, [x7,x8]
-	cmp	w11, w10
-	bls	.L1945
+.L1908:
+	cmp	w0, w2
+	bgt	.L1914
+	tbz	w0, #31, .L1946
+	b	.L1902
+.L1914:
+	sxtw	x8, w0
+	lsl	x9, x8, 2
+	ldr	w11, [x7, x9]
+	cmp	w10, w11
+	bls	.L1909
 	ldr	w2, [x7]
-	cbnz	w2, .L1946
-	cmp	w0, w6
-	beq	.L1946
-	add	x2, x19, :lo12:.LANCHOR4
-	add	w0, w0, 1
-	strh	w0, [x2,1088]
+	cbnz	w2, .L1910
+	cmp	w6, w1
+	beq	.L1910
+	add	w1, w1, 1
+	strh	w1, [x24, 1088]
+.L1910:
+	mov	w1, 0
+.L1911:
+	cmp	w1, w0
+	bne	.L1912
+	ldr	x1, [x19, 2784]
+	ldr	w2, [x20, 4]
+	str	w2, [x1, x9]
+	ldr	x1, [x19, 2720]
+	strh	w28, [x1, x8, lsl 1]
+	tbnz	w0, #31, .L1902
+	ldrh	w1, [x24, 1088]
+	ldr	w2, [x19, 2372]
+	sub	w2, w2, w1
+	sub	w2, w2, #1
+	cmp	w0, w2, sxth
+	bgt	.L1902
 .L1946:
-	mov	w0, 0
-.L1947:
-	cmp	w0, w1
-	beq	.L2002
-	add	x6, x24, :lo12:.LANCHOR2
-	sxtw	x2, w0
-	lsl	x7, x2, 2
+	add	w1, w1, 1
+	strh	w1, [x24, 1088]
+	ldr	x1, [x19, 2784]
+	ldr	w2, [x20, 4]
+	str	w2, [x1, x0, lsl 2]
+	ldr	x1, [x19, 2720]
+.L1964:
+	strh	w28, [x1, x0, lsl 1]
+	b	.L1902
+.L1912:
+	ldr	x7, [x19, 2784]
+	sxtw	x2, w1
+	lsl	x6, x2, 2
 	lsl	x2, x2, 1
-	add	w0, w0, 1
-	ldr	x10, [x6,2784]
-	sxth	w0, w0
-	add	x11, x10, x7
-	ldr	w11, [x11,4]
-	str	w11, [x10,x7]
-	ldr	x6, [x6,2720]
+	add	x10, x7, x6
+	add	w1, w1, 1
+	sxth	w1, w1
+	ldr	w10, [x10, 4]
+	str	w10, [x7, x6]
+	ldr	x6, [x19, 2720]
 	add	x7, x6, x2
-	ldrh	w7, [x7,2]
-	strh	w7, [x6,x2]
-	b	.L1947
-.L2002:
-	add	x2, x24, :lo12:.LANCHOR2
-	ldr	w6, [x26,4]
-	ldr	x0, [x2,2784]
-	str	w6, [x0,x8]
-	ldr	x0, [x2,2720]
-	strh	w25, [x0,x9,lsl 1]
-	tbz	w1, #31, .L1949
-	b	.L1938
-.L1945:
-	sub	w1, w1, #1
-	sxth	x1, w1
-	b	.L1944
-.L2001:
-	tbz	w1, #31, .L1982
-	b	.L1938
-.L1949:
-	add	x0, x19, :lo12:.LANCHOR4
-	ldr	w2, [x2,2372]
-	ldrh	w0, [x0,1088]
-	sub	w2, w2, w0
-	sub	w2, w2, #1
-	cmp	w1, w2, sxth
-	bgt	.L1938
-.L1982:
-	add	x2, x19, :lo12:.LANCHOR4
-	add	w0, w0, 1
-	ldr	w4, [x26,4]
-	strh	w0, [x2,1088]
-	add	x0, x24, :lo12:.LANCHOR2
-	ldr	x2, [x0,2784]
-	str	w4, [x2,x1,lsl 2]
-	ldr	x0, [x0,2720]
-	b	.L1998
-.L1959:
-	sbfiz	x8, x1, 2, 32
-	ldr	w11, [x26,4]
-	sxth	x9, w1
-	ldr	w10, [x6,x8]
-	cmp	w11, w10
-	bhi	.L2003
+	ldrh	w7, [x7, 2]
+	strh	w7, [x6, x2]
+	b	.L1911
+.L1909:
+	sub	w0, w0, #1
+	sxth	x0, w0
+	b	.L1908
+.L1905:
+	ldrh	w6, [x19, 2364]
+	ldrh	w1, [x19, 2920]
+	sub	w2, w6, #1
+	ldr	x7, [x19, 2752]
+	sxth	x0, w2
+	sub	w2, w2, w1
+.L1917:
+	cmp	w0, w2
+	ble	.L1922
+	sxtw	x8, w0
+	lsl	x9, x8, 2
+	ldr	w11, [x7, x9]
+	cmp	w10, w11
+	bls	.L1918
+	ldr	w2, [x7]
+	cbnz	w2, .L1919
+	cmp	w6, w1
+	beq	.L1919
+	add	w1, w1, 1
+	strh	w1, [x19, 2920]
+.L1919:
+	mov	w1, 0
+.L1920:
+	cmp	w1, w0
+	bne	.L1921
+	ldr	x1, [x19, 2752]
+	ldr	w2, [x20, 4]
+	str	w2, [x1, x9]
+	ldr	x1, [x19, 2736]
+	strh	w28, [x1, x8, lsl 1]
+.L1922:
+	tbnz	w0, #31, .L1902
+	ldrh	w1, [x19, 2364]
+	ldrh	w2, [x19, 2920]
 	sub	w1, w1, #1
-	sxth	x1, w1
-.L1953:
-	cmp	w1, w2
-	bgt	.L1959
-	b	.L1958
-.L2003:
-	ldr	w2, [x6]
-	cbnz	w2, .L1955
-	cmp	w0, w7
-	beq	.L1955
-	add	x2, x24, :lo12:.LANCHOR2
-	add	w0, w0, 1
-	strh	w0, [x2,2920]
-.L1955:
-	mov	w0, 0
-.L1956:
-	cmp	w0, w1
-	beq	.L2004
-	add	x6, x24, :lo12:.LANCHOR2
-	sxtw	x2, w0
-	lsl	x7, x2, 2
+	sub	w1, w1, w2
+	cmp	w0, w1, sxth
+	bgt	.L1902
+	ldr	x1, [x19, 2752]
+	add	w2, w2, 1
+	strh	w2, [x19, 2920]
+	ldr	w2, [x20, 4]
+	str	w2, [x1, x0, lsl 2]
+	ldr	x1, [x19, 2736]
+	b	.L1964
+.L1921:
+	ldr	x7, [x19, 2752]
+	sxtw	x2, w1
+	lsl	x6, x2, 2
 	lsl	x2, x2, 1
-	add	w0, w0, 1
-	ldr	x10, [x6,2752]
-	sxth	w0, w0
-	add	x11, x10, x7
-	ldr	w11, [x11,4]
-	str	w11, [x10,x7]
-	ldr	x6, [x6,2736]
+	add	x10, x7, x6
+	add	w1, w1, 1
+	sxth	w1, w1
+	ldr	w10, [x10, 4]
+	str	w10, [x7, x6]
+	ldr	x6, [x19, 2736]
 	add	x7, x6, x2
-	ldrh	w7, [x7,2]
-	strh	w7, [x6,x2]
-	b	.L1956
-.L2004:
-	add	x0, x24, :lo12:.LANCHOR2
-	ldr	w6, [x26,4]
-	ldr	x2, [x0,2752]
-	str	w6, [x2,x8]
-	ldr	x0, [x0,2736]
-	strh	w25, [x0,x9,lsl 1]
-.L1958:
-	tbnz	w1, #31, .L1938
-	add	x0, x24, :lo12:.LANCHOR2
-	ldrh	w2, [x0,2364]
-	ldrh	w6, [x0,2920]
-	sub	w2, w2, #1
-	sub	w2, w2, w6
-	cmp	w1, w2, sxth
-	bgt	.L1938
-	ldr	x2, [x0,2752]
-	add	w6, w6, 1
-	ldr	w4, [x26,4]
-	strh	w6, [x0,2920]
-	str	w4, [x2,x1,lsl 2]
-	ldr	x0, [x0,2736]
-.L1998:
-	strh	w25, [x0,x1,lsl 1]
-	b	.L1938
-.L1939:
-	add	x0, x19, :lo12:.LANCHOR4
-	add	x1, x0, 1072
-	ldrh	w2, [x0,1072]
-	cmp	w2, w22
-	bne	.L1960
-	strh	w25, [x0,1072]
-	ldr	w0, [x26,4]
-	str	w0, [x1,8]
-	b	.L1938
-.L1960:
-	ldrh	w0, [x1,4]
-	cmp	w0, w22
-	beq	.L1961
+	ldrh	w7, [x7, 2]
+	strh	w7, [x6, x2]
+	b	.L1920
+.L1918:
+	sub	w0, w0, #1
+	sxth	x0, w0
+	b	.L1917
+.L1903:
+	ldrh	w0, [x27]
+	mov	w1, 65535
+	cmp	w0, w1
+	bne	.L1924
+	strh	w28, [x27]
+	str	w10, [x27, 8]
+	b	.L1902
+.L1924:
+	ldrh	w0, [x27, 4]
+	cmp	w0, w1
+	beq	.L1925
 	mov	w1, 1
 	bl	FtlFreeSysBlkQueueIn
-.L1961:
-	add	x1, x19, :lo12:.LANCHOR4
-	ldr	w2, [x26,4]
-	add	x0, x1, 1072
-	ldr	w6, [x0,8]
-	cmp	w6, w2
-	bcs	.L1962
-	ldrh	w2, [x1,1072]
-	strh	w2, [x0,4]
-	strh	w25, [x1,1072]
-	ldr	w1, [x26,4]
-	str	w1, [x0,8]
-	b	.L1938
-.L1962:
-	strh	w25, [x0,4]
-	b	.L1938
+.L1925:
+	ldr	w0, [x20, 4]
+	ldr	w1, [x27, 8]
+	cmp	w1, w0
+	bcs	.L1926
+	ldrh	w0, [x27]
+	strh	w0, [x27, 4]
+	strh	w28, [x27]
+	ldr	w0, [x20, 4]
+	str	w0, [x27, 8]
+	b	.L1902
+.L1926:
+	strh	w28, [x27, 4]
+	b	.L1902
+.L1930:
+	ldr	x1, [x19, 2720]
+	ldrh	w0, [x1]
+	cbz	w0, .L1932
 .L1935:
-	ldrb	w1, [x0,1220]
-	mov	w0, w25
-	cbz	w1, .L1963
-.L1999:
-	mov	w1, 0
-.L1963:
-	bl	FtlFreeSysBlkQueueIn
-.L1938:
-	add	x23, x23, 1
-	b	.L1930
-.L1929:
-	add	w21, w21, 1
-	uxth	w21, w21
-	b	.L1925
-.L1966:
-	ldr	x2, [x1,2720]
-	ldrh	w0, [x2]
-	cbz	w0, .L1968
-.L1971:
-	add	x1, x24, :lo12:.LANCHOR2
-	ldr	x2, [x1,2736]
-	ldrh	w0, [x2]
-	cbz	w0, .L1969
-	b	.L1992
-.L1968:
-	add	x19, x19, :lo12:.LANCHOR4
-	ldrh	w4, [x19,1088]
-	cbz	w4, .L1971
-	ldr	w1, [x1,2372]
-.L1972:
-	cmp	w0, w1
-	bcs	.L1971
-	ldrh	w4, [x2,w0,sxtw 1]
-	cbz	w4, .L1973
-	mov	w7, w0
-.L1974:
-	add	x1, x24, :lo12:.LANCHOR2
-	ldr	w2, [x1,2372]
+	add	x0, x21, :lo12:.LANCHOR2
+	ldr	x1, [x0, 2736]
+	ldrh	w2, [x1]
+	cbz	w2, .L1933
+.L1951:
+	ldp	x19, x20, [sp, 16]
+	mov	w0, 0
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 128
+	ret
+.L1932:
+	add	x22, x22, :lo12:.LANCHOR4
+	ldrh	w0, [x22, 1088]
+	cbz	w0, .L1935
+	ldr	w2, [x19, 2372]
+	mov	w0, 0
+.L1936:
 	cmp	w0, w2
-	bcs	.L1971
-	sxtw	x6, w0
-	sub	w2, w0, w7
-	ldr	x5, [x1,2720]
+	bcs	.L1935
+	ldrh	w3, [x1, w0, sxtw 1]
+	cbz	w3, .L1937
+	mov	w1, w0
+	add	x2, x21, :lo12:.LANCHOR2
+.L1938:
+	ldr	w3, [x2, 2372]
+	cmp	w1, w3
+	bcs	.L1935
+	ldr	x5, [x2, 2720]
+	sxtw	x6, w1
 	lsl	x4, x6, 1
-	sxtw	x2, w2
-	add	w0, w0, 1
-	ldrh	w8, [x5,x4]
-	sxth	w0, w0
-	strh	w8, [x5,x2,lsl 1]
-	ldr	x5, [x1,2784]
-	ldr	w6, [x5,x6,lsl 2]
-	str	w6, [x5,x2,lsl 2]
-	ldr	x1, [x1,2720]
-	strh	wzr, [x1,x4]
-	b	.L1974
-.L1973:
+	sub	w3, w1, w0
+	sxtw	x3, w3
+	add	w1, w1, 1
+	sxth	w1, w1
+	ldrh	w7, [x5, x4]
+	strh	w7, [x5, x3, lsl 1]
+	ldr	x5, [x2, 2784]
+	ldr	w6, [x5, x6, lsl 2]
+	str	w6, [x5, x3, lsl 2]
+	ldr	x3, [x2, 2720]
+	strh	wzr, [x3, x4]
+	b	.L1938
+.L1937:
 	add	w0, w0, 1
 	sxth	w0, w0
-	b	.L1972
-.L1969:
-	ldrh	w4, [x1,2920]
-	cbz	w4, .L1992
-	ldrh	w1, [x1,2364]
-.L1977:
-	cmp	w0, w1
-	mov	w7, w0
-	bge	.L1992
-	ldrh	w4, [x2,w0,sxtw 1]
-	cbz	w4, .L1978
-.L1979:
-	add	x1, x24, :lo12:.LANCHOR2
-	ldrh	w2, [x1,2364]
+	b	.L1936
+.L1933:
+	ldrh	w2, [x0, 2920]
+	cbz	w2, .L1951
+	ldrh	w2, [x0, 2364]
+	mov	w0, 0
+.L1941:
+	mov	w5, w0
 	cmp	w0, w2
-	bge	.L1992
-	sxtw	x6, w0
-	sub	w2, w0, w7
-	ldr	x5, [x1,2736]
-	lsl	x4, x6, 1
-	sxtw	x2, w2
+	bge	.L1951
+	ldrh	w3, [x1, w0, sxtw 1]
+	cbz	w3, .L1942
+	add	x21, x21, :lo12:.LANCHOR2
+.L1943:
+	ldrh	w1, [x21, 2364]
+	cmp	w0, w1
+	bge	.L1951
+	ldr	x3, [x21, 2736]
+	sxtw	x4, w0
+	lsl	x2, x4, 1
+	sub	w1, w0, w5
+	sxtw	x1, w1
 	add	w0, w0, 1
-	ldrh	w8, [x5,x4]
 	sxth	w0, w0
-	strh	w8, [x5,x2,lsl 1]
-	ldr	x5, [x1,2752]
-	ldr	w6, [x5,x6,lsl 2]
-	str	w6, [x5,x2,lsl 2]
-	ldr	x1, [x1,2736]
-	strh	wzr, [x1,x4]
-	b	.L1979
-.L1978:
+	ldrh	w6, [x3, x2]
+	strh	w6, [x3, x1, lsl 1]
+	ldr	x3, [x21, 2752]
+	ldr	w4, [x3, x4, lsl 2]
+	str	w4, [x3, x1, lsl 2]
+	ldr	x1, [x21, 2736]
+	strh	wzr, [x1, x2]
+	b	.L1943
+.L1942:
 	add	w0, w0, 1
 	sxth	w0, w0
-	b	.L1977
-.L1992:
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
-	ret
+	b	.L1941
 	.size	FtlScanSysBlk, .-FtlScanSysBlk
 	.align	2
 	.global	FtlLoadEctTbl
@@ -12390,31 +12170,31 @@ FtlLoadEctTbl:
 	stp	x29, x30, [sp, -32]!
 	mov	w0, 64
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	adrp	x19, .LANCHOR2
 	add	x19, x19, :lo12:.LANCHOR2
-	ldrh	w1, [x19,2672]
-	ldr	x2, [x19,2688]
+	ldrh	w1, [x19, 2672]
+	ldr	x2, [x19, 2688]
 	bl	FtlVendorPartRead
-	ldr	x0, [x19,2688]
+	ldr	x0, [x19, 2688]
 	ldr	w1, [x0]
 	mov	w0, 17221
 	movk	w0, 0x4254, lsl 16
 	cmp	w1, w0
-	beq	.L2006
-	adrp	x0, .LC47
-	adrp	x1, .LC48
-	add	x1, x1, :lo12:.LC48
-	add	x0, x0, :lo12:.LC47
+	beq	.L1967
+	adrp	x1, .LC47
+	adrp	x0, .LC48
+	add	x1, x1, :lo12:.LC47
+	add	x0, x0, :lo12:.LC48
 	bl	printk
-	ldrh	w2, [x19,2672]
+	ldr	x0, [x19, 2688]
 	mov	w1, 0
-	ldr	x0, [x19,2688]
+	ldrh	w2, [x19, 2672]
 	lsl	w2, w2, 9
 	bl	ftl_memset
-.L2006:
+.L1967:
 	mov	w0, 0
-	ldr	x19, [sp,16]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	FtlLoadEctTbl, .-FtlLoadEctTbl
@@ -12422,36 +12202,35 @@ FtlLoadEctTbl:
 	.global	ftl_set_blk_mode
 	.type	ftl_set_blk_mode, %function
 ftl_set_blk_mode:
+	and	w0, w0, 65535
+	cbz	w1, .L1970
 	stp	x29, x30, [sp, -16]!
-	uxth	w0, w0
 	add	x29, sp, 0
-	cbz	w1, .L2008
 	bl	ftl_set_blk_mode.part.17
-	b	.L2007
-.L2008:
-	adrp	x1, .LANCHOR0+16
+	ldp	x29, x30, [sp], 16
+	ret
+.L1970:
+	adrp	x1, .LANCHOR0+80
 	ubfx	x2, x0, 5, 11
 	lsl	x2, x2, 2
-	ldr	x3, [x1,#:lo12:.LANCHOR0+16]
+	ldr	x3, [x1, #:lo12:.LANCHOR0+80]
 	mov	w1, 1
 	lsl	w0, w1, w0
-	ldr	w1, [x3,x2]
+	ldr	w1, [x3, x2]
 	bic	w0, w1, w0
-	str	w0, [x3,x2]
-.L2007:
-	ldp	x29, x30, [sp], 16
+	str	w0, [x3, x2]
 	ret
 	.size	ftl_set_blk_mode, .-ftl_set_blk_mode
 	.align	2
 	.global	ftl_get_blk_mode
 	.type	ftl_get_blk_mode, %function
 ftl_get_blk_mode:
-	adrp	x1, .LANCHOR0+16
-	uxth	w0, w0
-	ubfx	x2, x0, 5, 11
-	ldr	x1, [x1,#:lo12:.LANCHOR0+16]
-	ldr	w1, [x1,x2,lsl 2]
-	lsr	w0, w1, w0
+	and	w1, w0, 65535
+	adrp	x0, .LANCHOR0+80
+	ldr	x0, [x0, #:lo12:.LANCHOR0+80]
+	ubfx	x2, x1, 5, 11
+	ldr	w0, [x0, x2, lsl 2]
+	lsr	w0, w0, w1
 	and	w0, w0, 1
 	ret
 	.size	ftl_get_blk_mode, .-ftl_get_blk_mode
@@ -12459,211 +12238,199 @@ ftl_get_blk_mode:
 	.global	FtlCheckVpc
 	.type	FtlCheckVpc, %function
 FtlCheckVpc:
-	stp	x29, x30, [sp, -128]!
+	stp	x29, x30, [sp, -112]!
 	adrp	x1, .LANCHOR3
-	adrp	x0, .LC49
 	add	x1, x1, :lo12:.LANCHOR3
+	adrp	x0, .LC49
 	add	x29, sp, 0
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR2
+	stp	x23, x24, [sp, 48]
+	add	x23, x20, :lo12:.LANCHOR2
+	stp	x21, x22, [sp, 32]
+	mov	w22, 0
 	add	x1, x1, 152
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
 	add	x0, x0, :lo12:.LC49
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR4
-	mov	w19, 0
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	add	x21, x20, :lo12:.LANCHOR4
+	adrp	x21, check_valid_page_count_table
 	bl	printk
-	add	x0, x21, 1096
-	mov	w1, 0
+	add	x19, x21, :lo12:check_valid_page_count_table
 	mov	x2, 8192
-	adrp	x22, .LANCHOR2
+	mov	w1, 0
+	mov	x0, x19
 	bl	memset
-.L2012:
-	add	x0, x22, :lo12:.LANCHOR2
-	adrp	x23, .LANCHOR2
-	ldr	w0, [x0,2924]
-	cmp	w19, w0
-	bcs	.L2031
-	mov	w0, w19
-	add	x1, x29, 124
+.L1978:
+	ldr	w0, [x23, 2924]
+	cmp	w22, w0
+	bcc	.L1980
+	adrp	x24, .LC50
+	add	x22, x20, :lo12:.LANCHOR2
+	add	x25, x21, :lo12:check_valid_page_count_table
+	add	x24, x24, :lo12:.LC50
+	mov	w23, 0
+	mov	w19, 0
+	mov	w28, 65535
+.L1981:
+	ldrh	w0, [x22, 2284]
+	cmp	w0, w19
+	bhi	.L1983
+	adrp	x0, .LANCHOR4
+	add	x0, x0, :lo12:.LANCHOR4
+	ldr	x19, [x0, 768]
+	cbz	x19, .L1984
+	ldrh	w25, [x0, 776]
+	adrp	x24, .LC51
+	ldr	x0, [x22, 2808]
+	add	x20, x20, :lo12:.LANCHOR2
+	add	x21, x21, :lo12:check_valid_page_count_table
+	add	x24, x24, :lo12:.LC51
+	sub	x19, x19, x0
+	mov	x0, -6148914691236517206
+	asr	x19, x19, 1
+	movk	x0, 0xaaab, lsl 0
+	mov	w26, 6
+	mov	w22, 0
+	mul	x19, x19, x0
+	and	w19, w19, 65535
+.L1985:
+	cmp	w22, w25
+	bne	.L1987
+.L1984:
+	mov	w1, w23
+	adrp	x0, .LC52
+	add	x0, x0, :lo12:.LC52
+	bl	printk
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L1980:
 	mov	w2, 0
+	add	x1, x29, 108
+	mov	w0, w22
 	bl	log2phys
-	ldr	w0, [x29,124]
+	ldr	w0, [x29, 108]
 	cmn	w0, #1
-	beq	.L2013
+	beq	.L1979
 	lsr	w0, w0, 10
 	bl	P2V_block_in_plane
-	uxth	w0, w0
-	add	x2, x21, 1096
-	ldrh	w1, [x2,w0,sxtw 1]
+	and	x0, x0, 65535
+	ldrh	w1, [x19, x0, lsl 1]
 	add	w1, w1, 1
-	strh	w1, [x2,w0,sxtw 1]
-.L2013:
-	add	w19, w19, 1
-	b	.L2012
-.L2031:
-	mov	w21, 0
-	adrp	x24, .LC50
-	mov	w19, w21
-	add	x27, x20, :lo12:.LANCHOR4
-	add	x24, x24, :lo12:.LC50
-	mov	w28, 65535
-.L2015:
-	add	x22, x23, :lo12:.LANCHOR2
-	ldrh	w0, [x22,2284]
-	cmp	w0, w19
-	bls	.L2032
-	ubfiz	x26, x19, 1, 16
-	ldr	x0, [x22,2712]
-	add	x25, x27, 1096
-	sxtw	x4, w19
-	ldrh	w2, [x0,x26]
-	ldrh	w3, [x25,w19,sxtw 1]
+	strh	w1, [x19, x0, lsl 1]
+.L1979:
+	add	w22, w22, 1
+	b	.L1978
+.L1983:
+	ldr	x0, [x22, 2712]
+	ubfiz	x27, x19, 1, 16
+	sxtw	x26, w19
+	ldrh	w2, [x0, x27]
+	ldrh	w3, [x25, x26, lsl 1]
 	cmp	w2, w3
-	beq	.L2016
-	mov	x0, x24
+	beq	.L1982
 	mov	w1, w19
-	str	x4, [x29,104]
+	mov	x0, x24
 	bl	printk
-	ldr	x0, [x22,2712]
-	ldrh	w0, [x0,x26]
+	ldr	x0, [x22, 2712]
+	ldrh	w0, [x0, x27]
 	cmp	w0, w28
-	beq	.L2016
-	ldr	x4, [x29,104]
-	ldrh	w1, [x25,x4,lsl 1]
+	beq	.L1982
+	ldrh	w1, [x25, x26, lsl 1]
 	cmp	w1, w0
-	csinc	w21, w21, wzr, ls
-.L2016:
+	csinc	w23, w23, wzr, ls
+.L1982:
 	add	w19, w19, 1
-	uxth	w19, w19
-	b	.L2015
-.L2032:
-	add	x2, x20, :lo12:.LANCHOR4
-	ldr	x0, [x2,768]
-	cbz	x0, .L2018
-	ldr	x19, [x22,2808]
-	adrp	x24, .LC51
-	ldrh	w25, [x2,776]
-	mov	w22, 0
-	sub	x19, x0, x19
-	mov	x0, -6148914691236517206
-	asr	x19, x19, 1
-	add	x24, x24, :lo12:.LC51
-	mov	x20, x2
-	mov	w26, 6
-	madd	x19, x0, x19, x19
-	mov	w27, 65535
-	uxth	w19, w19
-.L2019:
-	cmp	w22, w25
-	beq	.L2018
-	add	x1, x23, :lo12:.LANCHOR2
+	and	w19, w19, 65535
+	b	.L1981
+.L1987:
+	ldr	x1, [x20, 2712]
 	ubfiz	x0, x19, 1, 16
-	ldr	x1, [x1,2712]
-	ldrh	w2, [x1,x0]
-	cbz	w2, .L2020
-	add	x3, x20, 1096
-	mov	x0, x24
+	ldrh	w2, [x1, x0]
+	cbz	w2, .L1986
+	ldrh	w3, [x21, w19, sxtw 1]
+	mov	w23, 1
 	mov	w1, w19
-	mov	w21, 1
-	ldrh	w3, [x3,w19,sxtw 1]
+	mov	x0, x24
 	bl	printk
-.L2020:
-	add	x0, x23, :lo12:.LANCHOR2
+.L1986:
+	ldr	x0, [x20, 2808]
 	umull	x19, w19, w26
-	ldr	x0, [x0,2808]
-	ldrh	w19, [x0,x19]
-	cmp	w19, w27
-	beq	.L2018
+	ldrh	w19, [x0, x19]
+	mov	w0, 65535
+	cmp	w19, w0
+	beq	.L1984
 	add	w22, w22, 1
-	uxth	w22, w22
-	b	.L2019
-.L2018:
-	adrp	x0, .LC52
-	mov	w1, w21
-	add	x0, x0, :lo12:.LC52
-	bl	printk
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
-	ret
+	and	w22, w22, 65535
+	b	.L1985
 	.size	FtlCheckVpc, .-FtlCheckVpc
 	.align	2
 	.global	FtlDumpSysBlock
 	.type	FtlDumpSysBlock, %function
 FtlDumpSysBlock:
-	sub	sp, sp, #96
-	adrp	x2, .LANCHOR2
-	add	x2, x2, :lo12:.LANCHOR2
-	stp	x29, x30, [sp,16]
+	sub	sp, sp, #80
+	stp	x29, x30, [sp, 16]
 	add	x29, sp, 16
-	stp	x19, x20, [sp,32]
-	stp	x21, x22, [sp,48]
-	stp	x23, x24, [sp,64]
-	str	x25, [sp,80]
-	add	x19, x2, 2936
-	uxth	w23, w0
-	adrp	x22, .LC53
-	ldr	x0, [x2,2576]
-	adrp	x25, .LC54
-	str	x0, [x19,8]
+	stp	x23, x24, [sp, 64]
+	and	w23, w0, 65535
+	adrp	x0, .LANCHOR2
+	add	x0, x0, :lo12:.LANCHOR2
+	stp	x19, x20, [sp, 32]
+	add	x19, x0, 2936
+	stp	x21, x22, [sp, 48]
 	lsl	w24, w23, 10
-	ldr	x0, [x2,2640]
-	mov	w20, 0
-	str	x0, [x19,16]
-	mov	x21, x2
+	adrp	x22, .LC53
+	mov	x21, x0
+	ldr	x1, [x0, 2576]
 	add	x22, x22, :lo12:.LC53
-	add	x25, x25, :lo12:.LC54
-.L2034:
-	ldrh	w0, [x21,2346]
+	str	x1, [x19, 8]
+	mov	w20, 0
+	ldr	x1, [x0, 2640]
+	str	x1, [x19, 16]
+.L1999:
+	ldrh	w0, [x21, 2346]
 	cmp	w20, w0
-	bge	.L2040
-	mov	w1, 1
+	blt	.L2001
+	ldp	x19, x20, [sp, 32]
+	ldp	x21, x22, [sp, 48]
+	ldp	x23, x24, [sp, 64]
+	ldp	x29, x30, [sp, 16]
+	add	sp, sp, 80
+	ret
+.L2001:
 	orr	w0, w20, w24
-	mov	w2, w1
-	str	w0, [x19,4]
+	mov	w2, 1
+	str	w0, [x19, 4]
+	mov	w1, w2
 	mov	x0, x19
 	bl	FlashReadPages
-	ldr	x0, [x19,8]
+	ldp	x1, x0, [x19, 8]
+	ldr	w1, [x1]
+	str	w1, [sp]
 	mov	w1, w23
-	ldr	x7, [x19,16]
-	ldr	w0, [x0]
-	str	w0, [sp]
+	ldp	w4, w5, [x0]
+	ldp	w6, w7, [x0, 8]
 	mov	x0, x22
-	ldr	w4, [x7]
-	ldr	w5, [x7,4]
-	ldr	w6, [x7,8]
-	ldr	w2, [x19]
-	ldr	w3, [x19,4]
-	ldr	w7, [x7,12]
+	ldp	w2, w3, [x19]
 	bl	printk
-	ldr	x0, [x19,16]
+	ldr	x0, [x19, 16]
 	ldr	w0, [x0]
 	cmn	w0, #1
-	beq	.L2035
-	ldr	x1, [x21,2576]
-	mov	x0, x25
-	mov	w2, 4
+	beq	.L2000
+	ldr	x1, [x21, 2576]
+	adrp	x0, .LC54
 	mov	w3, 768
+	mov	w2, 4
+	add	x0, x0, :lo12:.LC54
 	bl	rknand_print_hex
-.L2035:
+.L2000:
 	add	w20, w20, 1
 	sxth	w20, w20
-	b	.L2034
-.L2040:
-	sub	sp, x29, #16
-	ldp	x19, x20, [sp,32]
-	ldp	x21, x22, [sp,48]
-	ldp	x23, x24, [sp,64]
-	ldr	x25, [sp,80]
-	ldp	x29, x30, [sp,16]
-	add	sp, sp, 96
-	ret
+	b	.L1999
 	.size	FtlDumpSysBlock, .-FtlDumpSysBlock
 	.align	2
 	.global	Ftlscanalldata
@@ -12671,520 +12438,497 @@ FtlDumpSysBlock:
 Ftlscanalldata:
 	sub	sp, sp, #96
 	adrp	x0, .LC55
-	add	x0, x0, :lo12:.LC55
 	mov	w1, 0
-	stp	x29, x30, [sp,16]
+	add	x0, x0, :lo12:.LC55
+	stp	x29, x30, [sp, 16]
 	add	x29, sp, 16
-	stp	x23, x24, [sp,64]
-	adrp	x23, .LANCHOR2
-	stp	x21, x22, [sp,48]
-	adrp	x21, .LC56
-	add	x22, x23, :lo12:.LANCHOR2
-	stp	x19, x20, [sp,32]
-	add	x21, x21, :lo12:.LC56
+	stp	x21, x22, [sp, 48]
+	adrp	x22, .LANCHOR2
+	add	x21, x22, :lo12:.LANCHOR2
+	stp	x19, x20, [sp, 32]
+	str	x23, [sp, 64]
 	mov	w20, 0
-	add	x19, x22, 2936
+	add	x19, x21, 2936
 	bl	printk
-.L2042:
-	add	x0, x23, :lo12:.LANCHOR2
-	ldr	w0, [x0,2924]
+.L2007:
+	add	x0, x22, :lo12:.LANCHOR2
+	ldr	w0, [x0, 2924]
 	cmp	w20, w0
-	bcs	.L2049
-	mov	w0, w20
-	add	x1, x29, 76
+	bcc	.L2013
+	ldp	x19, x20, [sp, 32]
+	ldp	x21, x22, [sp, 48]
+	ldp	x29, x30, [sp, 16]
+	ldr	x23, [sp, 64]
+	add	sp, sp, 96
+	ret
+.L2013:
 	mov	w2, 0
+	add	x1, x29, 76
+	mov	w0, w20
 	bl	log2phys
-	and	w0, w20, 2047
-	cbnz	w0, .L2043
-	ldr	w2, [x29,76]
-	mov	x0, x21
+	tst	x20, 2047
+	bne	.L2008
+	ldr	w2, [x29, 76]
+	adrp	x0, .LC56
 	mov	w1, w20
+	add	x0, x0, :lo12:.LC56
 	bl	printk
-.L2043:
-	ldr	w0, [x29,76]
+.L2008:
+	ldr	w0, [x29, 76]
 	cmn	w0, #1
-	beq	.L2045
-	str	w0, [x19,4]
-	mov	w1, 1
-	ldr	x0, [x22,2576]
+	beq	.L2010
+	ldr	x23, [x21, 2640]
 	mov	w2, 0
-	str	x0, [x19,8]
+	stp	wzr, w0, [x19]
+	mov	w1, 1
+	ldr	x0, [x21, 2576]
+	str	x0, [x19, 8]
 	mov	x0, x19
-	ldr	x24, [x22,2640]
-	str	w20, [x19,24]
-	str	x24, [x19,16]
-	str	wzr, [x19]
+	str	x23, [x19, 16]
+	str	w20, [x19, 24]
 	bl	FlashReadPages
 	ldr	w0, [x19]
-	cmn	w0, #1
-	beq	.L2046
 	cmp	w0, 256
-	beq	.L2046
-	ldr	w0, [x24,8]
-	cmp	w0, w20
-	beq	.L2045
-.L2046:
-	ldr	x7, [x19,8]
-	mov	w1, w20
-	ldr	x6, [x19,16]
-	ldr	w0, [x7,4]
-	str	w0, [sp]
+	ccmn	w0, #1, 4, ne
+	beq	.L2011
+	ldr	w0, [x23, 8]
+	cmp	w20, w0
+	beq	.L2010
+.L2011:
+	ldp	x1, x0, [x19, 8]
+	ldr	w2, [x1, 4]
+	str	w2, [sp]
+	ldp	w3, w4, [x0]
+	ldp	w5, w6, [x0, 8]
 	adrp	x0, .LC57
+	ldr	w7, [x1]
 	add	x0, x0, :lo12:.LC57
-	ldr	w3, [x6]
-	ldr	w4, [x6,4]
-	ldr	w5, [x6,8]
-	ldr	w2, [x19,4]
-	ldr	w6, [x6,12]
-	ldr	w7, [x7]
+	ldr	w2, [x19, 4]
+	mov	w1, w20
 	bl	printk
-.L2045:
+.L2010:
 	add	w20, w20, 1
-	b	.L2042
-.L2049:
-	sub	sp, x29, #16
-	ldp	x19, x20, [sp,32]
-	ldp	x21, x22, [sp,48]
-	ldp	x23, x24, [sp,64]
-	ldp	x29, x30, [sp,16]
-	add	sp, sp, 96
-	ret
+	b	.L2007
 	.size	Ftlscanalldata, .-Ftlscanalldata
 	.align	2
 	.global	dump_map_info
 	.type	dump_map_info, %function
 dump_map_info:
-	sub	sp, sp, #128
-	stp	x29, x30, [sp,16]
+	sub	sp, sp, #96
+	stp	x29, x30, [sp, 16]
 	add	x29, sp, 16
-	stp	x19, x20, [sp,32]
+	stp	x19, x20, [sp, 32]
 	adrp	x19, .LANCHOR2
 	add	x0, x19, :lo12:.LANCHOR2
-	stp	x25, x26, [sp,80]
-	stp	x23, x24, [sp,64]
-	stp	x27, x28, [sp,96]
-	stp	x21, x22, [sp,48]
-	adrp	x24, .LC58
-	mov	w25, 56
-	ldrh	w22, [x0,2284]
-	mov	w26, 4
-	mov	x27, 56
-	add	x24, x24, :lo12:.LC58
-.L2051:
-	add	x20, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x20,2286]
+	stp	x23, x24, [sp, 64]
+	stp	x21, x22, [sp, 48]
+	add	x24, x0, 2304
+	stp	x25, x26, [sp, 80]
+	mov	x21, x19
+	mov	x19, x0
+	mov	w23, 56
+	ldrh	w22, [x0, 2284]
+.L2016:
+	ldrh	w0, [x19, 2286]
 	cmp	w0, w22
-	bls	.L2064
-	mov	x23, 0
-	ldrh	w3, [x20,2276]
-	ldrh	w2, [x20,2356]
-	mov	w21, w23
-.L2060:
-	cmp	w3, w23, uxth
-	bls	.L2065
-	add	x0, x20, 2304
+	bhi	.L2022
+	add	x25, x21, :lo12:.LANCHOR2
+	adrp	x26, .LANCHOR4
+	add	x24, x25, 2936
+	add	x26, x26, :lo12:.LANCHOR4
+	mov	w20, 0
+.L2023:
+	ldrh	w0, [x26, 1088]
+	cmp	w20, w0
+	bge	.L2026
+	adrp	x0, .LC59
+	sbfiz	x22, x20, 1, 32
+	mov	w19, 0
+	add	x23, x0, :lo12:.LC59
+	b	.L2027
+.L2018:
+	ldrb	w0, [x24, x5]
 	mov	w1, w22
-	str	x2, [x29,96]
-	str	x3, [x29,104]
-	ldrb	w0, [x0,x23]
 	bl	V2P_block
-	uxth	w28, w0
+	and	w4, w0, 65535
 	bl	FtlBbmIsBadBlock
-	ldr	x3, [x29,104]
-	ldr	x2, [x29,96]
-	cbnz	w0, .L2052
-	umull	x0, w21, w25
-	ldr	x1, [x20,2520]
-	lsl	w28, w28, 10
-	add	x1, x1, x0
-	str	w28, [x1,4]
-	ldr	x1, [x20,2520]
-	ldr	x4, [x20,2656]
-	add	x0, x1, x0
-	ldr	x1, [x20,2600]
-	str	x1, [x0,8]
-	mul	w1, w21, w2
-	add	w21, w21, 1
-	sdiv	w1, w1, w26
-	uxth	w21, w21
-	add	x1, x4, w1, sxtw 2
-	str	x1, [x0,16]
-.L2052:
-	add	x23, x23, 1
-	b	.L2060
-.L2065:
-	cbz	w21, .L2055
-	add	x0, x19, :lo12:.LANCHOR2
-	mov	w1, w21
+	cbnz	w0, .L2017
+	umull	x2, w20, w23
+	ldr	x0, [x19, 2520]
+	lsl	w4, w4, 10
+	add	x0, x0, x2
+	str	w4, [x0, 4]
+	ldr	x1, [x19, 2520]
+	ldr	x0, [x19, 2600]
+	add	x1, x1, x2
+	ldr	x2, [x19, 2656]
+	str	x0, [x1, 8]
+	mul	w0, w20, w7
+	add	w20, w20, 1
+	and	w20, w20, 65535
+	sdiv	w0, w0, w6
+	add	x0, x2, w0, sxtw 2
+	str	x0, [x1, 16]
+.L2017:
+	add	x5, x5, 1
+.L2024:
+	cmp	w8, w5, uxth
+	bhi	.L2018
+	cbnz	w20, .L2019
+.L2021:
+	add	w22, w22, 1
+	and	w22, w22, 65535
+	b	.L2016
+.L2019:
+	ldr	x0, [x19, 2520]
+	mov	w1, w20
+	adrp	x26, .LC58
 	mov	w2, 1
-	mov	x20, 0
-	ldr	x0, [x0,2520]
+	umull	x20, w20, w23
+	mov	x25, 0
+	add	x26, x26, :lo12:.LC58
 	bl	FlashReadPages
-.L2056:
-	cmp	w21, w20, uxth
-	bls	.L2055
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	x0, [x0,2520]
-	madd	x0, x20, x27, x0
-	add	x20, x20, 1
-	ldr	x7, [x0,8]
-	ldr	x6, [x0,16]
-	ldr	w2, [x0,4]
-	ldr	w0, [x7,4]
-	str	w0, [sp]
+.L2020:
+	ldr	x0, [x19, 2520]
+	add	x0, x0, x25
+	add	x25, x25, 56
+	ldr	x1, [x0, 16]
+	ldr	w2, [x0, 4]
+	ldr	x0, [x0, 8]
+	ldr	w3, [x0, 4]
+	str	w3, [sp]
+	ldr	w7, [x0]
+	mov	x0, x26
+	ldp	w3, w4, [x1]
+	ldp	w5, w6, [x1, 8]
 	ubfx	x1, x2, 10, 16
-	mov	x0, x24
-	ldr	w3, [x6]
-	ldr	w4, [x6,4]
-	ldr	w5, [x6,8]
-	ldr	w7, [x7]
-	ldr	w6, [x6,12]
 	bl	printk
-	b	.L2056
-.L2055:
-	add	w22, w22, 1
-	uxth	w22, w22
-	b	.L2051
-.L2064:
-	adrp	x23, .LC59
-	mov	w22, 0
-	adrp	x26, .LANCHOR4
-	add	x25, x20, 2936
-	add	x23, x23, :lo12:.LC59
-.L2059:
-	add	x1, x26, :lo12:.LANCHOR4
-	ldrh	w1, [x1,1088]
-	cmp	w22, w1
-	bge	.L2062
-	sbfiz	x24, x22, 1, 32
-	mov	w21, 0
-.L2063:
-	ldrh	w0, [x20,2346]
-	cmp	w21, w0
-	bge	.L2066
-	ldr	x0, [x20,2720]
-	ldrh	w1, [x0,x24]
-	mov	x0, x25
-	orr	w1, w21, w1, lsl 10
-	str	w1, [x25,4]
-	mov	w1, 1
-	add	w21, w21, 1
-	mov	w2, w1
-	sxth	w21, w21
+	cmp	x25, x20
+	beq	.L2021
+	b	.L2020
+.L2022:
+	ldrh	w8, [x19, 2276]
+	mov	x5, 0
+	ldrh	w7, [x19, 2356]
+	mov	w20, 0
+	mov	w6, 4
+	b	.L2024
+.L2025:
+	ldr	x0, [x25, 2720]
+	mov	w2, 1
+	mov	w1, w2
+	ldrh	w0, [x0, x22]
+	orr	w0, w19, w0, lsl 10
+	str	w0, [x24, 4]
+	mov	x0, x24
 	bl	FlashReadPages
-	ldr	x2, [x25,8]
-	ldr	x0, [x20,2720]
-	ldr	x7, [x25,16]
-	ldrh	w1, [x0,x24]
-	ldr	w0, [x2]
-	str	w0, [sp]
-	ldr	w0, [x2,4]
-	str	w0, [sp,8]
+	ldp	x2, x0, [x24, 8]
+	add	w19, w19, 1
+	ldr	x1, [x25, 2720]
+	sxth	w19, w19
+	ldr	w3, [x2, 4]
+	ldrh	w1, [x1, x22]
+	str	w3, [sp, 8]
+	ldr	w2, [x2]
+	str	w2, [sp]
+	ldp	w4, w5, [x0]
+	ldp	w6, w7, [x0, 8]
 	mov	x0, x23
-	ldr	w4, [x7]
-	ldr	w5, [x7,4]
-	ldr	w6, [x7,8]
-	ldr	w2, [x25]
-	ldr	w3, [x25,4]
-	ldr	w7, [x7,12]
+	ldp	w2, w3, [x24]
 	bl	printk
-	b	.L2063
-.L2066:
-	add	w22, w22, 1
-	sxth	w22, w22
-	b	.L2059
-.L2062:
-	add	x19, x19, :lo12:.LANCHOR2
+.L2027:
+	ldrh	w0, [x25, 2346]
+	cmp	w19, w0
+	blt	.L2025
+	add	w20, w20, 1
+	sxth	w20, w20
+	b	.L2023
+.L2026:
+	add	x21, x21, :lo12:.LANCHOR2
+	mov	w2, 2
 	adrp	x0, .LC60
 	add	x0, x0, :lo12:.LC60
-	mov	w2, 2
-	ldr	x1, [x19,2720]
-	ldr	w3, [x19,2372]
+	ldr	w3, [x21, 2372]
+	ldr	x1, [x21, 2720]
 	bl	rknand_print_hex
-	ldr	x1, [x19,2768]
+	ldrh	w3, [x21, 2380]
+	mov	w2, 4
+	ldr	x1, [x21, 2768]
 	adrp	x0, .LC61
-	ldrh	w3, [x19,2380]
 	add	x0, x0, :lo12:.LC61
-	mov	w2, 4
 	bl	rknand_print_hex
-	ldr	x1, [x19,2776]
+	ldrh	w3, [x21, 2380]
+	mov	w2, 4
+	ldr	x1, [x21, 2776]
 	adrp	x0, .LC62
-	ldrh	w3, [x19,2380]
 	add	x0, x0, :lo12:.LC62
-	mov	w2, 4
 	bl	rknand_print_hex
-	sub	sp, x29, #16
-	ldp	x19, x20, [sp,32]
-	ldp	x21, x22, [sp,48]
-	ldp	x23, x24, [sp,64]
-	ldp	x25, x26, [sp,80]
-	ldp	x27, x28, [sp,96]
-	ldp	x29, x30, [sp,16]
-	add	sp, sp, 128
+	ldp	x19, x20, [sp, 32]
+	ldp	x21, x22, [sp, 48]
+	ldp	x23, x24, [sp, 64]
+	ldp	x25, x26, [sp, 80]
+	ldp	x29, x30, [sp, 16]
+	add	sp, sp, 96
 	ret
 	.size	dump_map_info, .-dump_map_info
 	.align	2
 	.global	FtlMapTblRecovery
 	.type	FtlMapTblRecovery, %function
 FtlMapTblRecovery:
-	stp	x29, x30, [sp, -144]!
+	stp	x29, x30, [sp, -128]!
 	mov	w1, 0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	stp	x23, x24, [sp,48]
-	mov	x27, x0
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR2
-	ldr	x22, [x0,40]
+	stp	x21, x22, [sp, 32]
+	mov	x22, x0
+	stp	x25, x26, [sp, 64]
 	mov	w19, 0
-	ldrh	w24, [x0,6]
-	ldr	x23, [x0,16]
-	ldr	x26, [x0,24]
+	stp	x23, x24, [sp, 48]
+	adrp	x25, .LANCHOR0
+	stp	x27, x28, [sp, 80]
+	ldrh	w24, [x0, 6]
+	ldr	x0, [x0, 40]
+	str	x0, [x29, 120]
+	ldrh	w0, [x22, 8]
 	lsl	w2, w24, 2
-	ldrh	w0, [x0,8]
-	str	w0, [x29,136]
-	mov	x0, x22
+	str	w0, [x29, 116]
+	ldr	x0, [x29, 120]
+	ldp	x23, x27, [x22, 16]
 	bl	ftl_memset
-	str	x20, [x29,128]
-	add	x6, x20, :lo12:.LANCHOR2
-	str	wzr, [x27,52]
-	add	x4, x6, 2936
-	str	wzr, [x27,48]
-	mov	x20, x6
-	mov	x25, x4
-	ldr	x0, [x6,2576]
-	ldr	x21, [x6,2640]
-	str	x0, [x6,2944]
+	stp	wzr, wzr, [x22, 48]
+	add	x4, x20, :lo12:.LANCHOR2
 	mov	w0, -1
-	str	x21, [x6,2952]
-	strh	w0, [x27]
-	strh	w0, [x27,2]
+	mov	x26, x4
+	ldr	x1, [x4, 2576]
+	ldr	x21, [x4, 2640]
+	str	x1, [x4, 2944]
+	str	x21, [x4, 2952]
+	strh	w0, [x22]
+	strh	w0, [x22, 2]
 	mov	w0, 1
-	str	w0, [x27,56]
-	ldr	w0, [x29,136]
+	str	w0, [x22, 56]
+	ldr	w0, [x29, 116]
 	sub	w0, w0, #1
-	str	w0, [x29,116]
-.L2068:
-	ldr	w0, [x29,136]
+	str	w0, [x29, 112]
+	add	x0, x25, :lo12:.LANCHOR0
+	str	x0, [x29, 96]
+.L2031:
+	ldr	w0, [x29, 116]
 	cmp	w19, w0
-	bge	.L2086
-	ldr	w0, [x29,116]
+	bge	.L2050
+	ldr	w0, [x29, 112]
 	sxtw	x28, w19
 	cmp	w19, w0
-	bne	.L2069
+	bne	.L2032
 	lsl	x0, x28, 1
 	mov	w1, 1
 	add	x25, x23, x0
-	mov	w20, 0
-	ldrh	w0, [x23,x0]
+	adrp	x26, .LANCHOR0
+	add	x26, x26, :lo12:.LANCHOR0
+	ldrh	w0, [x23, x0]
 	bl	FtlGetLastWrittenPage
-	strh	w19, [x27]
-	sxth	w1, w0
+	strh	w19, [x22]
+	sxth	w23, w0
 	add	w0, w0, 1
-	strh	w0, [x27,2]
-	add	w19, w1, 1
-	ldr	w0, [x26,x28,lsl 2]
-	adrp	x26, .LANCHOR0
-	str	w0, [x27,48]
-	ldr	x0, [x29,128]
-	add	x23, x0, :lo12:.LANCHOR2
-	add	x28, x23, 2936
-.L2070:
-	cmp	w20, w19
-	bge	.L2086
+	strh	w0, [x22, 2]
+	add	w23, w23, 1
+	ldr	w0, [x27, x28, lsl 2]
+	add	x27, x20, :lo12:.LANCHOR2
+	add	x19, x27, 2936
+	mov	w28, 0
+	str	w0, [x22, 48]
+.L2033:
+	cmp	w28, w23
+	blt	.L2036
+.L2050:
+	add	x20, x20, :lo12:.LANCHOR2
+	mov	x0, x22
+	bl	ftl_free_no_use_map_blk
+	ldrh	w1, [x22, 2]
+	ldrh	w0, [x20, 2346]
+	cmp	w1, w0
+	bne	.L2038
+	mov	x0, x22
+	bl	ftl_map_blk_alloc_new_blk
+.L2038:
+	mov	x0, x22
+	bl	ftl_map_blk_gc
+	mov	x0, x22
+	bl	ftl_map_blk_gc
+	mov	w0, 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 128
+	ret
+.L2036:
 	ldrh	w0, [x25]
-	mov	w1, 1
-	mov	w2, w1
-	orr	w0, w20, w0, lsl 10
-	str	w0, [x28,4]
-	mov	x0, x28
+	mov	w2, 1
+	mov	w1, w2
+	orr	w0, w28, w0, lsl 10
+	str	w0, [x19, 4]
+	mov	x0, x19
 	bl	FlashReadPages
-	add	x0, x26, :lo12:.LANCHOR0
-	ldrb	w0, [x0,88]
-	cbz	w0, .L2071
-	ldr	x0, [x28,16]
-	ldr	w2, [x0,12]
-	cbz	w2, .L2071
-	ldr	x0, [x28,8]
-	ldrh	w1, [x23,2354]
-	str	x2, [x29,136]
+	ldrb	w0, [x26, 88]
+	cbz	w0, .L2034
+	ldr	x0, [x19, 16]
+	ldr	w6, [x0, 12]
+	cbz	w6, .L2034
+	ldrh	w1, [x27, 2354]
+	ldr	x0, [x19, 8]
 	bl	js_hash
-	ldr	x2, [x29,136]
-	cmp	w2, w0
-	beq	.L2071
+	cmp	w6, w0
+	beq	.L2034
 	mov	w0, -1
-	str	w0, [x28]
-.L2071:
-	ldr	w0, [x28]
+	str	w0, [x19]
+.L2034:
+	ldr	w0, [x19]
 	cmn	w0, #1
-	beq	.L2072
-	ldrh	w0, [x21,8]
-	cmp	w0, w24
-	bcs	.L2072
+	beq	.L2035
+	ldrh	w0, [x21, 8]
+	cmp	w24, w0
+	bls	.L2035
 	ldrh	w2, [x21]
-	ldrh	w1, [x27,4]
+	ldrh	w1, [x22, 4]
 	cmp	w2, w1
-	bne	.L2072
+	bne	.L2035
+	ldr	x2, [x29, 120]
 	ubfiz	x0, x0, 2, 16
-	ldr	w1, [x28,4]
-	str	w1, [x22,x0]
-.L2072:
-	add	w4, w20, 1
-	sxth	w20, w4
-	b	.L2070
-.L2086:
-	mov	x0, x27
-	bl	ftl_free_no_use_map_blk
-	ldr	x0, [x29,128]
-	ldrh	w1, [x27,2]
-	add	x20, x0, :lo12:.LANCHOR2
-	ldrh	w0, [x20,2346]
-	cmp	w1, w0
-	bne	.L2075
-	mov	x0, x27
-	bl	ftl_map_blk_alloc_new_blk
-	b	.L2075
-.L2069:
-	ldr	x0, [x20,2576]
-	str	x0, [x25,8]
-	lsl	x0, x28, 1
-	add	x1, x23, x0
-	str	x1, [x29,120]
-	ldrh	w1, [x23,x0]
-	ldrh	w0, [x20,2346]
-	sub	w0, w0, #1
-	orr	w0, w0, w1, lsl 10
-	mov	w1, 1
-	str	w0, [x25,4]
-	mov	w2, w1
-	mov	x0, x25
+	ldr	w1, [x19, 4]
+	str	w1, [x2, x0]
+.L2035:
+	add	w28, w28, 1
+	sxth	w28, w28
+	b	.L2033
+.L2032:
+	add	x0, x26, 2936
+	ldr	x1, [x26, 2576]
+	str	x1, [x0, 8]
+	lsl	x1, x28, 1
+	add	x2, x23, x1
+	str	x2, [x29, 104]
+	ldrh	w2, [x26, 2346]
+	ldrh	w1, [x23, x1]
+	sub	w2, w2, #1
+	orr	w1, w2, w1, lsl 10
+	mov	w2, 1
+	str	w1, [x0, 4]
+	mov	w1, w2
 	bl	FlashReadPages
-	ldr	w0, [x25]
+	ldr	w0, [x26, 2936]
 	cmn	w0, #1
-	beq	.L2087
+	beq	.L2052
 	ldrh	w1, [x21]
-	mov	w28, 0
-	ldrh	w0, [x27,4]
+	ldrh	w0, [x22, 4]
 	cmp	w1, w0
-	bne	.L2108
-	ldrh	w1, [x21,8]
+	bne	.L2052
+	ldrh	w1, [x21, 8]
 	mov	w0, 64245
 	cmp	w1, w0
-	bne	.L2108
-	mov	w5, w28
-.L2077:
-	ldrh	w0, [x20,2346]
-	sub	w0, w0, #1
-	cmp	w5, w0
-	bge	.L2080
-	ldr	x2, [x20,2576]
-	sbfiz	x1, x5, 3, 32
-	ldrh	w0, [x2,x1]
-	cmp	w0, w24
-	bcs	.L2078
-	add	x1, x2, x1
-	ubfiz	x0, x0, 2, 16
-	ldr	w1, [x1,4]
-	str	w1, [x22,x0]
-.L2078:
-	add	w5, w5, 1
-	sxth	w5, w5
-	b	.L2077
-.L2087:
+	beq	.L2040
+.L2052:
+	add	x25, x26, 2936
 	mov	w28, 0
-.L2108:
-	ldrh	w0, [x20,2346]
+.L2041:
+	ldrh	w0, [x26, 2346]
 	cmp	w28, w0
-	bge	.L2080
-	ldr	x0, [x29,120]
-	mov	w1, 1
-	mov	w2, w1
+	bge	.L2048
+	ldr	x0, [x29, 104]
+	mov	w2, 1
+	mov	w1, w2
 	ldrh	w0, [x0]
 	orr	w0, w28, w0, lsl 10
-	str	w0, [x25,4]
+	str	w0, [x25, 4]
 	mov	x0, x25
 	bl	FlashReadPages
-	adrp	x0, .LANCHOR0
-	add	x0, x0, :lo12:.LANCHOR0
-	ldrb	w0, [x0,88]
-	cbz	w0, .L2081
-	ldr	x0, [x25,16]
-	ldr	w2, [x0,12]
-	cbz	w2, .L2081
-	ldr	x0, [x25,8]
-	ldrh	w1, [x20,2354]
-	str	x2, [x29,104]
+	ldr	x0, [x29, 96]
+	ldrb	w0, [x0, 88]
+	cbz	w0, .L2045
+	ldr	x0, [x25, 16]
+	ldr	w6, [x0, 12]
+	cbz	w6, .L2045
+	ldrh	w1, [x26, 2354]
+	ldr	x0, [x25, 8]
 	bl	js_hash
-	ldr	x2, [x29,104]
-	cmp	w2, w0
-	beq	.L2081
+	cmp	w6, w0
+	beq	.L2045
 	mov	w0, -1
 	str	w0, [x25]
-.L2081:
+.L2045:
 	ldr	w0, [x25]
 	cmn	w0, #1
-	beq	.L2082
-	ldrh	w0, [x21,8]
-	cmp	w0, w24
-	bcs	.L2082
+	beq	.L2046
+	ldrh	w0, [x21, 8]
+	cmp	w24, w0
+	bls	.L2046
 	ldrh	w2, [x21]
-	ldrh	w1, [x27,4]
+	ldrh	w1, [x22, 4]
 	cmp	w2, w1
-	bne	.L2082
+	bne	.L2046
+	ldr	x2, [x29, 120]
 	ubfiz	x0, x0, 2, 16
-	ldr	w1, [x25,4]
-	str	w1, [x22,x0]
-.L2082:
+	ldr	w1, [x25, 4]
+	str	w1, [x2, x0]
+.L2046:
 	add	w5, w28, 1
 	sxth	w28, w5
-	b	.L2108
-.L2080:
+	b	.L2041
+.L2040:
+	mov	w0, 0
+.L2042:
+	ldrh	w1, [x26, 2346]
+	sub	w1, w1, #1
+	cmp	w0, w1
+	blt	.L2044
+.L2048:
 	add	w19, w19, 1
 	sxth	w19, w19
-	b	.L2068
-.L2075:
-	mov	x0, x27
-	bl	ftl_map_blk_gc
-	mov	x0, x27
-	bl	ftl_map_blk_gc
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 144
-	ret
+	b	.L2031
+.L2044:
+	ldr	x2, [x26, 2576]
+	sbfiz	x5, x0, 3, 32
+	ldrh	w1, [x2, x5]
+	cmp	w24, w1
+	bls	.L2043
+	add	x2, x2, x5
+	ldr	x3, [x29, 120]
+	ubfiz	x1, x1, 2, 16
+	ldr	w2, [x2, 4]
+	str	w2, [x3, x1]
+.L2043:
+	add	w0, w0, 1
+	sxth	w0, w0
+	b	.L2042
 	.size	FtlMapTblRecovery, .-FtlMapTblRecovery
 	.align	2
 	.global	FtlLoadVonderInfo
 	.type	FtlLoadVonderInfo, %function
 FtlLoadVonderInfo:
-	adrp	x0, .LANCHOR4
 	adrp	x1, .LANCHOR2
-	add	x0, x0, :lo12:.LANCHOR4
 	add	x1, x1, :lo12:.LANCHOR2
 	stp	x29, x30, [sp, -16]!
+	adrp	x0, .LANCHOR4
+	add	x0, x0, :lo12:.LANCHOR4
 	add	x0, x0, 1000
 	add	x29, sp, 0
-	ldrh	w2, [x1,2364]
-	strh	w2, [x0,10]
+	ldrh	w2, [x1, 2364]
+	strh	w2, [x0, 10]
 	mov	w2, -3962
-	strh	w2, [x0,4]
-	ldrh	w2, [x1,2920]
-	strh	w2, [x0,8]
-	ldrh	w2, [x1,2366]
-	strh	w2, [x0,6]
-	ldr	x2, [x1,2736]
-	str	x2, [x0,16]
-	ldr	x2, [x1,2752]
-	str	x2, [x0,24]
-	ldr	x2, [x1,2744]
-	ldr	x1, [x1,2760]
-	str	x2, [x0,32]
-	str	x1, [x0,40]
+	strh	w2, [x0, 4]
+	ldrh	w2, [x1, 2920]
+	strh	w2, [x0, 8]
+	ldrh	w2, [x1, 2366]
+	strh	w2, [x0, 6]
+	ldr	x2, [x1, 2736]
+	str	x2, [x0, 16]
+	ldr	x2, [x1, 2752]
+	str	x2, [x0, 24]
+	ldr	x2, [x1, 2744]
+	ldr	x1, [x1, 2760]
+	stp	x2, x1, [x0, 32]
 	bl	FtlMapTblRecovery
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
@@ -13195,72 +12939,71 @@ FtlLoadVonderInfo:
 	.type	FtlL2PDataInit, %function
 FtlL2PDataInit:
 	stp	x29, x30, [sp, -32]!
+	adrp	x0, .LANCHOR2
 	mov	w1, 0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR2
-	add	x19, x20, :lo12:.LANCHOR2
-	ldr	w2, [x19,2372]
-	ldr	x0, [x19,2728]
+	str	x19, [sp, 16]
+	add	x19, x0, :lo12:.LANCHOR2
+	ldr	x0, [x19, 2728]
+	ldr	w2, [x19, 2372]
 	lsl	w2, w2, 1
 	bl	ftl_memset
-	ldrh	w3, [x19,2354]
+	ldrh	w0, [x19, 2382]
 	mov	w1, 255
-	ldrh	w2, [x19,2382]
-	ldr	x0, [x19,2800]
-	mul	w2, w3, w2
+	ldrh	w2, [x19, 2354]
+	mul	w2, w2, w0
+	ldr	x0, [x19, 2800]
 	bl	ftl_memset
-	mov	w2, 0
-	mov	w4, -1
-.L2111:
-	add	x0, x20, :lo12:.LANCHOR2
-	ldrh	w1, [x0,2382]
-	cmp	w1, w2
-	bls	.L2113
-	ldr	x3, [x0,2792]
-	ubfiz	x1, x2, 4, 16
-	add	x3, x3, x1
-	str	wzr, [x3,4]
-	ldr	x3, [x0,2792]
-	strh	w4, [x3,x1]
-	ldr	x3, [x0,2792]
-	add	x3, x3, x1
-	ldrh	w1, [x0,2354]
-	ldr	x0, [x0,2800]
-	mul	w1, w1, w2
-	add	w2, w2, 1
-	sxtw	x1, w1
-	uxth	w2, w2
-	and	x1, x1, -4
-	add	x0, x0, x1
-	str	x0, [x3,8]
-	b	.L2111
-.L2113:
+	mov	x0, x19
+	mov	w1, 0
+	mov	w5, -1
+.L2075:
+	ldrh	w2, [x0, 2382]
+	cmp	w2, w1
+	bhi	.L2076
 	adrp	x2, .LANCHOR4
-	mov	w3, -1
 	add	x2, x2, :lo12:.LANCHOR4
+	mov	w3, -1
 	add	x1, x2, 928
-	strh	w3, [x2,930]
-	strh	w3, [x2,928]
-	ldr	w3, [x0,2372]
-	strh	w3, [x2,938]
+	strh	w3, [x2, 930]
+	strh	w3, [x2, 928]
+	ldr	w3, [x0, 2372]
+	strh	w3, [x2, 938]
 	mov	w3, -3902
-	strh	w3, [x2,932]
-	ldrh	w2, [x2,1088]
-	strh	w2, [x1,8]
-	ldrh	w2, [x0,2380]
-	strh	w2, [x1,6]
-	ldr	x2, [x0,2720]
-	str	x2, [x1,16]
-	ldr	x2, [x0,2784]
-	str	x2, [x1,24]
-	ldr	x2, [x0,2728]
-	ldr	x0, [x0,2768]
-	str	x2, [x1,32]
-	str	x0, [x1,40]
-	ldp	x19, x20, [sp,16]
+	strh	w3, [x2, 932]
+	ldrh	w2, [x2, 1088]
+	strh	w2, [x1, 8]
+	ldrh	w2, [x0, 2380]
+	strh	w2, [x1, 6]
+	ldr	x2, [x0, 2720]
+	str	x2, [x1, 16]
+	ldr	x2, [x0, 2784]
+	str	x2, [x1, 24]
+	ldr	x2, [x0, 2728]
+	ldr	x0, [x0, 2768]
+	stp	x2, x0, [x1, 32]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L2076:
+	ldr	x3, [x0, 2792]
+	ubfiz	x2, x1, 4, 16
+	add	x3, x3, x2
+	str	wzr, [x3, 4]
+	ldr	x3, [x0, 2792]
+	strh	w5, [x3, x2]
+	ldr	x3, [x0, 2792]
+	ldr	x4, [x0, 2800]
+	add	x3, x3, x2
+	ldrh	w2, [x0, 2354]
+	mul	w2, w2, w1
+	add	w1, w1, 1
+	and	w1, w1, 65535
+	sxtw	x2, w2
+	and	x2, x2, -4
+	add	x2, x4, x2
+	str	x2, [x3, 8]
+	b	.L2075
 	.size	FtlL2PDataInit, .-FtlL2PDataInit
 	.align	2
 	.global	FtlLoadMapInfo
@@ -13281,624 +13024,621 @@ FtlLoadMapInfo:
 	.global	ftl_sb_update_avl_pages
 	.type	ftl_sb_update_avl_pages, %function
 ftl_sb_update_avl_pages:
-	adrp	x3, .LANCHOR2
-	uxth	w1, w1
-	add	x4, x3, :lo12:.LANCHOR2
-	uxth	w2, w2
-	strh	wzr, [x0,4]
-	mov	w6, 65535
-	ldrh	w4, [x4,2276]
-.L2116:
-	cmp	w2, w4
-	bcs	.L2122
+	and	w6, w1, 65535
+	adrp	x4, .LANCHOR2
+	add	x1, x4, :lo12:.LANCHOR2
+	and	w2, w2, 65535
+	strh	wzr, [x0, 4]
+	ldrh	w3, [x1, 2276]
+	mov	w1, 65535
+.L2081:
+	cmp	w3, w2, uxth
+	bhi	.L2083
+	add	x4, x4, :lo12:.LANCHOR2
+	ubfiz	x3, x3, 1, 16
+	add	x3, x3, 16
+	add	x2, x0, 16
+	add	x3, x0, x3
+	mov	w5, 65535
+	ldrh	w1, [x4, 2344]
+	sub	w1, w1, #1
+	and	w1, w1, 65535
+	sub	w1, w1, w6
+.L2084:
+	cmp	x2, x3
+	bne	.L2086
+	ret
+.L2083:
 	add	x5, x0, w2, sxtw 1
-	ldrh	w5, [x5,16]
-	cmp	w5, w6
-	beq	.L2117
-	ldrh	w5, [x0,4]
+	ldrh	w5, [x5, 16]
+	cmp	w5, w1
+	beq	.L2082
+	ldrh	w5, [x0, 4]
 	add	w5, w5, 1
-	strh	w5, [x0,4]
-.L2117:
+	strh	w5, [x0, 4]
+.L2082:
 	add	w2, w2, 1
-	uxth	w2, w2
-	b	.L2116
-.L2122:
-	add	x3, x3, :lo12:.LANCHOR2
-	mov	w6, 65535
-	add	x4, x0, w4, uxth 1
-	ldrh	w5, [x3,2344]
-	mov	x3, x0
-.L2119:
-	cmp	x3, x4
-	beq	.L2123
-	ldrh	w2, [x3,16]
-	cmp	w2, w6
-	beq	.L2120
-	ldrh	w2, [x0,4]
-	add	w2, w5, w2
-	sub	w2, w2, #1
-	sub	w2, w2, w1
-	strh	w2, [x0,4]
-.L2120:
-	add	x3, x3, 2
-	b	.L2119
-.L2123:
-	ret
+	b	.L2081
+.L2086:
+	ldrh	w4, [x2]
+	cmp	w4, w5
+	beq	.L2085
+	ldrh	w4, [x0, 4]
+	add	w4, w1, w4
+	strh	w4, [x0, 4]
+.L2085:
+	add	x2, x2, 2
+	b	.L2084
 	.size	ftl_sb_update_avl_pages, .-ftl_sb_update_avl_pages
 	.align	2
 	.global	FtlReUsePrevPpa
 	.type	FtlReUsePrevPpa, %function
 FtlReUsePrevPpa:
-	stp	x29, x30, [sp, -80]!
+	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	mov	w20, w0
-	lsr	x0, x1, 10
-	stp	x21, x22, [sp,32]
-	str	x23, [sp,48]
-	str	w1, [x29,76]
+	stp	x19, x20, [sp, 16]
+	mov	w19, w0
+	str	x21, [sp, 32]
+	lsr	w0, w1, 10
+	str	w1, [x29, 60]
 	bl	P2V_block_in_plane
 	adrp	x2, .LANCHOR2
-	uxth	w0, w0
 	add	x4, x2, :lo12:.LANCHOR2
-	ubfiz	x23, x0, 1, 16
-	mov	x22, x2
-	ldr	x3, [x4,2712]
-	ldrh	w1, [x3,x23]
-	cbnz	w1, .L2125
-	adrp	x21, .LANCHOR4
-	add	x2, x21, :lo12:.LANCHOR4
-	ldr	x19, [x2,768]
-	cbz	x19, .L2126
-	ldrh	w3, [x2,776]
+	and	w0, w0, 65535
+	ubfiz	x21, x0, 1, 16
+	ldr	x3, [x4, 2712]
+	ldrh	w1, [x3, x21]
+	cbnz	w1, .L2088
+	mov	x20, x2
+	adrp	x9, .LANCHOR4
+	add	x2, x9, :lo12:.LANCHOR4
+	ldr	x8, [x2, 768]
+	cbz	x8, .L2089
+	ldrh	w3, [x2, 776]
 	mov	w5, 65535
-	ldr	x2, [x4,2808]
+	ldr	x2, [x4, 2808]
 	mov	x4, -6148914691236517206
-	sub	x19, x19, x2
-	asr	x19, x19, 1
-	madd	x19, x4, x19, x19
+	movk	x4, 0xaaab, lsl 0
+	sub	x8, x8, x2
+	asr	x8, x8, 1
+	mul	x8, x8, x4
 	mov	w4, 6
-	uxth	w19, w19
-.L2127:
+	and	w8, w8, 65535
+.L2090:
 	cmp	w1, w3
-	beq	.L2126
-	cmp	w19, w0
-	bne	.L2128
-	add	x21, x21, :lo12:.LANCHOR4
-	mov	w1, w19
-	add	x0, x21, 768
+	beq	.L2089
+	cmp	w8, w0
+	bne	.L2091
+	add	x9, x9, :lo12:.LANCHOR4
+	mov	w1, w8
+	add	x0, x9, 768
 	bl	List_remove_node
-	ldrh	w0, [x21,776]
+	ldrh	w0, [x9, 776]
 	sub	w0, w0, #1
-	strh	w0, [x21,776]
-	mov	w0, w19
+	strh	w0, [x9, 776]
+	mov	w0, w8
 	bl	INSERT_DATA_LIST
-	add	x2, x22, :lo12:.LANCHOR2
-	ldr	x1, [x2,2712]
-	ldrh	w0, [x1,x23]
+	add	x2, x20, :lo12:.LANCHOR2
+	ldr	x1, [x2, 2712]
+	ldrh	w0, [x1, x21]
 	add	w0, w0, 1
-	strh	w0, [x1,x23]
-	b	.L2126
-.L2128:
-	umull	x19, w19, w4
-	ldrh	w19, [x2,x19]
-	cmp	w19, w5
-	beq	.L2126
-	add	w1, w1, 1
-	uxth	w1, w1
-	b	.L2127
-.L2125:
-	add	w1, w1, 1
-	strh	w1, [x3,x23]
-.L2126:
-	add	x1, x29, 76
-	mov	w0, w20
+	strh	w0, [x1, x21]
+.L2089:
+	add	x1, x29, 60
 	mov	w2, 1
+	mov	w0, w19
 	bl	log2phys
-	ldr	x23, [sp,48]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 80
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
+	ldp	x29, x30, [sp], 64
 	ret
+.L2091:
+	umull	x8, w8, w4
+	ldrh	w8, [x2, x8]
+	cmp	w8, w5
+	beq	.L2089
+	add	w1, w1, 1
+	and	w1, w1, 65535
+	b	.L2090
+.L2088:
+	add	w1, w1, 1
+	strh	w1, [x3, x21]
+	b	.L2089
 	.size	FtlReUsePrevPpa, .-FtlReUsePrevPpa
 	.align	2
 	.global	make_superblock
 	.type	make_superblock, %function
 make_superblock:
-	stp	x29, x30, [sp, -80]!
-	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	mov	x19, x0
-	strh	wzr, [x0,4]
-	strb	wzr, [x0,7]
+	mov	x5, x0
+	strh	wzr, [x0, 4]
+	strb	wzr, [x0, 7]
 	adrp	x0, .LANCHOR2
 	add	x1, x0, :lo12:.LANCHOR2
-	add	x22, x19, 16
-	mov	x21, 0
-	mov	x20, x0
-	mov	x23, x1
-	mov	w25, -1
-	ldrh	w24, [x1,2276]
-.L2134:
-	cmp	w24, w21, uxth
-	bls	.L2145
-	add	x0, x23, 2304
-	ldrh	w1, [x19]
-	ldrb	w0, [x0,x21]
+	mov	x7, 0
+	add	x8, x5, 16
+	mov	x6, x0
+	add	x9, x1, 2304
+	mov	w11, -1
+	ldrh	w10, [x1, 2276]
+	cmp	w10, w7, uxth
+	bhi	.L2117
+	add	x0, x0, :lo12:.LANCHOR2
+	ldrb	w1, [x5, 7]
+	strb	wzr, [x5, 9]
+	ldrh	w2, [x0, 2344]
+	mul	w1, w1, w2
+	strh	w1, [x5, 4]
+	ldr	w1, [x0, 2096]
+	cbz	w1, .L2113
+	ldrh	w1, [x5]
+	ldr	x0, [x0, 2696]
+	ldrh	w0, [x0, x1, lsl 1]
+	cmp	w0, 79
+	bhi	.L2113
+	mov	w0, 1
+	strb	w0, [x5, 9]
+.L2113:
+	adrp	x0, .LANCHOR0+88
+	ldrb	w0, [x0, #:lo12:.LANCHOR0+88]
+	cbz	w0, .L2116
+	mov	w0, 1
+	strb	w0, [x5, 9]
+.L2116:
+	mov	w0, 0
+	ret
+.L2117:
+	stp	x29, x30, [sp, -16]!
+	add	x29, sp, 0
+.L2100:
+	ldrh	w1, [x5]
+	ldrb	w0, [x9, x7]
 	bl	V2P_block
-	strh	w25, [x22]
-	mov	w26, w0
+	mov	w4, w0
+	strh	w11, [x8]
 	bl	FtlBbmIsBadBlock
-	cbnz	w0, .L2135
-	strh	w26, [x22]
-	ldrb	w0, [x19,7]
+	cbnz	w0, .L2099
+	strh	w4, [x8]
+	ldrb	w0, [x5, 7]
 	add	w0, w0, 1
-	strb	w0, [x19,7]
-.L2135:
-	add	x21, x21, 1
-	add	x22, x22, 2
-	b	.L2134
-.L2145:
-	add	x0, x20, :lo12:.LANCHOR2
-	ldrb	w1, [x19,7]
-	strb	wzr, [x19,9]
-	ldrh	w2, [x0,2344]
+	strb	w0, [x5, 7]
+.L2099:
+	add	x7, x7, 1
+	add	x8, x8, 2
+	cmp	w10, w7, uxth
+	bhi	.L2100
+	add	x0, x6, :lo12:.LANCHOR2
+	ldrb	w1, [x5, 7]
+	strb	wzr, [x5, 9]
+	ldrh	w2, [x0, 2344]
 	mul	w1, w1, w2
-	strh	w1, [x19,4]
-	ldr	w1, [x0,2096]
-	cbz	w1, .L2137
-	ldrh	w1, [x19]
-	ldr	x0, [x0,2696]
-	ldrh	w0, [x0,x1,lsl 1]
+	strh	w1, [x5, 4]
+	ldr	w1, [x0, 2096]
+	cbz	w1, .L2101
+	ldrh	w1, [x5]
+	ldr	x0, [x0, 2696]
+	ldrh	w0, [x0, x1, lsl 1]
 	cmp	w0, 79
-	bhi	.L2137
+	bhi	.L2101
 	mov	w0, 1
-	strb	w0, [x19,9]
-.L2137:
+	strb	w0, [x5, 9]
+.L2101:
 	adrp	x0, .LANCHOR0+88
-	ldrb	w0, [x0,#:lo12:.LANCHOR0+88]
-	cbz	w0, .L2138
+	ldrb	w0, [x0, #:lo12:.LANCHOR0+88]
+	cbz	w0, .L2102
 	mov	w0, 1
-	strb	w0, [x19,9]
-.L2138:
+	strb	w0, [x5, 9]
+.L2102:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 80
+	ldp	x29, x30, [sp], 16
 	ret
 	.size	make_superblock, .-make_superblock
 	.align	2
 	.global	FtlLoadSysInfo
 	.type	FtlLoadSysInfo, %function
 FtlLoadSysInfo:
-	sub	sp, sp, #128
+	sub	sp, sp, #112
 	mov	w1, 0
-	stp	x29, x30, [sp,16]
+	stp	x29, x30, [sp, 16]
 	add	x29, sp, 16
-	stp	x21, x22, [sp,48]
+	stp	x23, x24, [sp, 64]
+	stp	x21, x22, [sp, 48]
 	adrp	x22, .LANCHOR2
-	stp	x23, x24, [sp,64]
-	add	x23, x22, :lo12:.LANCHOR2
-	stp	x19, x20, [sp,32]
-	add	x20, x23, 2936
+	add	x24, x22, :lo12:.LANCHOR2
+	stp	x19, x20, [sp, 32]
+	add	x20, x24, 2936
+	stp	x25, x26, [sp, 80]
+	stp	x27, x28, [sp, 96]
 	adrp	x19, .LANCHOR4
-	stp	x25, x26, [sp,80]
-	stp	x27, x28, [sp,96]
-	ldr	x0, [x23,2576]
-	add	x24, x19, :lo12:.LANCHOR4
-	str	x0, [x20,8]
-	add	x25, x24, 1072
-	ldr	x0, [x23,2640]
-	ldrh	w2, [x23,2284]
-	str	x0, [x20,16]
-	ldr	x0, [x23,2712]
+	ldr	x0, [x24, 2576]
+	add	x23, x19, :lo12:.LANCHOR4
+	str	x0, [x20, 8]
+	ldr	x0, [x24, 2640]
+	str	x0, [x20, 16]
+	ldr	x0, [x24, 2712]
+	ldrh	w2, [x24, 2284]
 	lsl	w2, w2, 1
 	bl	ftl_memset
-	ldrh	w0, [x24,1072]
+	ldrh	w0, [x23, 1072]
 	mov	w1, 65535
 	cmp	w0, w1
-	bne	.L2147
-.L2158:
-	mov	w19, -1
-	b	.L2148
-.L2147:
+	bne	.L2119
+.L2130:
+	mov	w0, -1
+.L2118:
+	ldp	x19, x20, [sp, 32]
+	ldp	x21, x22, [sp, 48]
+	ldp	x23, x24, [sp, 64]
+	ldp	x25, x26, [sp, 80]
+	ldp	x27, x28, [sp, 96]
+	ldp	x29, x30, [sp, 16]
+	add	sp, sp, 112
+	ret
+.L2119:
+	add	x25, x23, 1072
 	mov	w1, 1
-	adrp	x26, .LC63
-	add	x26, x26, :lo12:.LC63
+	mov	w26, 19539
 	bl	FtlGetLastWrittenPage
+	ldrsh	w28, [x23, 1072]
 	sxth	w21, w0
+	adrp	x23, .LANCHOR0
 	add	w0, w0, 1
-	strh	w0, [x25,2]
-	ldrsh	w25, [x24,1072]
-.L2149:
-	tbnz	w21, #31, .L2157
-	orr	w0, w21, w25, lsl 10
-	mov	w1, 1
-	str	w0, [x20,4]
-	mov	w2, w1
-	ldr	x0, [x23,2576]
-	str	x0, [x20,8]
+	strh	w0, [x25, 2]
+	add	x25, x23, :lo12:.LANCHOR0
+	movk	w26, 0x4654, lsl 16
+.L2121:
+	tbnz	w21, #31, .L2129
+	orr	w0, w21, w28, lsl 10
+	str	w0, [x20, 4]
+	ldr	x0, [x24, 2576]
+	mov	w2, 1
+	str	x0, [x20, 8]
+	mov	w1, w2
 	mov	x0, x20
 	bl	FlashReadPages
-	adrp	x0, .LANCHOR0
-	add	x0, x0, :lo12:.LANCHOR0
-	ldrb	w0, [x0,88]
-	cbz	w0, .L2150
-	ldr	x24, [x20,16]
-	ldr	w7, [x24,12]
-	cbz	w7, .L2150
-	ldr	x28, [x20,8]
-	ldrh	w1, [x23,2354]
-	mov	x0, x28
-	str	x7, [x29,104]
+	ldrb	w0, [x25, 88]
+	cbz	w0, .L2122
+	ldr	x8, [x20, 16]
+	ldr	w7, [x8, 12]
+	cbz	w7, .L2122
+	ldr	x6, [x20, 8]
+	ldrh	w1, [x24, 2354]
+	mov	x0, x6
 	bl	js_hash
-	ldr	x7, [x29,104]
 	cmp	w7, w0
-	beq	.L2150
-	cbnz	w21, .L2151
+	beq	.L2122
+	cbnz	w21, .L2123
 	add	x0, x19, :lo12:.LANCHOR4
 	add	x27, x0, 1072
-	ldrh	w1, [x0,1076]
-	cmp	w25, w1
-	beq	.L2151
-	ldrh	w1, [x0,1072]
-	ldr	w0, [x28]
+	ldrh	w1, [x0, 1076]
+	cmp	w28, w1
+	beq	.L2123
+	ldrh	w1, [x0, 1072]
+	ldr	w0, [x6]
 	str	w0, [sp]
-	mov	x0, x26
-	ldr	w2, [x20]
-	ldr	w3, [x20,4]
-	ldr	w4, [x24]
-	ldr	w5, [x24,4]
-	ldr	w6, [x24,8]
+	adrp	x0, .LC63
+	add	x0, x0, :lo12:.LC63
+	ldp	w4, w5, [x8]
+	ldr	w6, [x8, 8]
+	ldp	w2, w3, [x20]
 	bl	printk
-	ldrsh	w25, [x27,4]
-	ldrh	w21, [x23,2346]
-	b	.L2153
-.L2151:
+	ldrsh	w28, [x27, 4]
+	ldrh	w21, [x24, 2346]
+.L2125:
+	sub	w21, w21, #1
+	sxth	w21, w21
+	b	.L2121
+.L2123:
 	mov	w0, -1
 	str	w0, [x20]
-.L2150:
+.L2122:
 	ldr	w0, [x20]
 	cmn	w0, #1
-	beq	.L2153
-	ldr	x0, [x23,2576]
-	ldr	w1, [x0]
-	mov	w0, 19539
-	movk	w0, 0x4654, lsl 16
-	cmp	w1, w0
-	bne	.L2153
-	ldr	x0, [x23,2640]
+	beq	.L2125
+	ldr	x0, [x24, 2576]
+	ldr	w0, [x0]
+	cmp	w0, w26
+	bne	.L2125
+	ldr	x0, [x24, 2640]
 	ldrh	w1, [x0]
 	mov	w0, 61604
 	cmp	w1, w0
-	bne	.L2153
-.L2157:
+	bne	.L2125
+.L2129:
 	add	x20, x22, :lo12:.LANCHOR2
 	add	x0, x19, :lo12:.LANCHOR4
 	add	x21, x20, 2936
 	mov	w2, 48
 	add	x0, x0, 696
-	ldr	x1, [x21,8]
+	add	x23, x23, :lo12:.LANCHOR0
+	ldr	x1, [x21, 8]
 	bl	ftl_memcpy
-	ldr	x1, [x21,8]
-	ldrh	w2, [x20,2284]
-	ldr	x0, [x20,2712]
-	add	x1, x1, 48
+	ldr	x0, [x20, 2712]
+	ldrh	w2, [x20, 2284]
+	ldr	x1, [x21, 8]
 	lsl	w2, w2, 1
+	add	x1, x1, 48
 	bl	ftl_memcpy
-	ldrh	w2, [x20,2284]
-	adrp	x0, .LANCHOR0
-	add	x0, x0, :lo12:.LANCHOR0
-	ldr	x3, [x21,8]
-	ubfiz	x1, x2, 1, 16
-	lsr	w2, w2, 3
+	ldrh	w1, [x20, 2284]
+	ldr	x0, [x21, 8]
+	lsr	w2, w1, 3
+	ubfiz	x1, x1, 1, 16
 	add	x1, x1, 51
 	add	w2, w2, 4
-	and	x1, x1, 262140
-	ldr	x0, [x0,16]
-	add	x1, x3, x1
+	and	x1, x1, -4
+	add	x1, x0, x1
+	ldr	x0, [x23, 80]
 	bl	ftl_memcpy
-	ldrh	w0, [x20,2384]
-	cbz	w0, .L2155
-	ldrh	w0, [x20,2284]
-	ldr	x3, [x21,8]
-	lsr	w1, w0, 3
-	ldrh	w2, [x20,2380]
-	add	w1, w1, w0, lsl 1
-	ldr	x0, [x20,2776]
+	ldrh	w0, [x20, 2384]
+	cbz	w0, .L2127
+	ldrh	w1, [x20, 2284]
+	ldrh	w2, [x20, 2380]
+	lsr	w0, w1, 3
+	add	w1, w0, w1, lsl 1
+	ldr	x0, [x21, 8]
 	add	w1, w1, 52
 	lsl	w2, w2, 2
 	and	x1, x1, 65532
-	add	x1, x3, x1
+	add	x1, x0, x1
+	ldr	x0, [x20, 2776]
 	bl	ftl_memcpy
-	b	.L2155
-.L2153:
-	sub	w21, w21, #1
-	sxth	w21, w21
-	b	.L2149
-.L2155:
-	add	x6, x19, :lo12:.LANCHOR4
+.L2127:
+	add	x2, x19, :lo12:.LANCHOR4
 	mov	w0, 19539
 	movk	w0, 0x4654, lsl 16
-	ldr	w2, [x6,696]
-	cmp	w2, w0
-	bne	.L2158
+	add	x1, x2, 696
+	ldr	w3, [x2, 696]
+	cmp	w3, w0
+	bne	.L2130
 	add	x0, x22, :lo12:.LANCHOR2
-	ldrb	w3, [x6,706]
-	ldrh	w5, [x6,704]
-	strh	w5, [x6,1078]
-	ldrh	w2, [x0,2298]
-	cmp	w3, w2
-	bne	.L2158
-	ldrh	w3, [x0,2344]
-	adrp	x7, .LANCHOR5
-	ldrh	w2, [x0,2350]
-	add	x4, x7, :lo12:.LANCHOR5
-	mov	x20, x7
-	mul	w3, w3, w5
-	str	w3, [x0,2924]
-	str	w5, [x4,584]
-	mul	w3, w3, w2
-	str	w3, [x0,1224]
-	ldrh	w2, [x0,2830]
-	ldr	w3, [x0,2288]
-	strh	wzr, [x4,594]
-	sub	w2, w3, w2
-	ldrh	w3, [x0,2276]
-	sub	w2, w2, w5
-	strb	wzr, [x4,598]
-	strb	wzr, [x4,600]
-	udiv	w2, w2, w3
-	mov	w3, -1
-	strh	w2, [x4,588]
-	strh	w3, [x4,592]
-	ldrh	w5, [x6,710]
-	strh	w5, [x6,784]
-	ldrh	w2, [x6,712]
-	lsr	w8, w2, 6
-	and	w2, w2, 63
-	strb	w2, [x6,790]
-	ldrb	w2, [x6,707]
-	strb	w2, [x6,792]
-	ldrh	w2, [x6,714]
-	strh	w2, [x6,832]
-	ldrh	w2, [x6,716]
-	strh	w8, [x6,786]
-	lsr	w4, w2, 6
-	and	w2, w2, 63
-	strb	w2, [x6,838]
-	ldrb	w2, [x6,708]
-	strb	w2, [x6,840]
-	ldrh	w2, [x6,718]
-	strh	w2, [x6,880]
-	ldrh	w2, [x6,720]
-	strh	w4, [x6,834]
+	ldrh	w4, [x2, 704]
+	ldrb	w5, [x2, 706]
+	strh	w4, [x2, 1078]
+	ldrh	w3, [x0, 2298]
+	cmp	w5, w3
+	bne	.L2130
+	ldrh	w3, [x0, 2344]
+	ldrh	w5, [x0, 2350]
+	str	w4, [x2, 1092]
+	strh	wzr, [x2, 1106]
+	mul	w3, w3, w4
+	strb	wzr, [x2, 1110]
+	str	w3, [x0, 2924]
+	strb	wzr, [x2, 1112]
+	mul	w3, w5, w3
+	ldrh	w5, [x0, 2830]
+	str	w3, [x0, 1224]
+	ldr	w3, [x0, 2288]
+	sub	w3, w3, w5
+	ldrh	w5, [x2, 710]
+	sub	w3, w3, w4
+	ldrh	w4, [x0, 2276]
+	strh	w5, [x2, 784]
+	udiv	w3, w3, w4
+	mov	w4, -1
+	strh	w4, [x2, 1104]
+	ldrh	w4, [x2, 718]
+	strh	w4, [x2, 880]
+	strh	w3, [x2, 1096]
+	ldrh	w3, [x2, 712]
+	lsr	w6, w3, 6
+	and	w3, w3, 63
+	strb	w3, [x2, 790]
+	ldrb	w3, [x2, 707]
+	strb	w3, [x2, 792]
+	ldrh	w3, [x2, 714]
+	strh	w3, [x2, 832]
+	ldrh	w3, [x2, 716]
+	strh	w6, [x2, 786]
+	lsr	w6, w3, 6
+	and	w3, w3, 63
+	strb	w3, [x2, 838]
+	ldrb	w3, [x2, 708]
+	strb	w3, [x2, 840]
+	add	x3, x2, 880
+	strh	w6, [x2, 834]
+	ldrh	w2, [x2, 720]
 	lsr	w4, w2, 6
 	and	w2, w2, 63
-	strh	w4, [x6,882]
-	strb	w2, [x6,886]
-	ldrb	w2, [x6,709]
-	strb	w2, [x6,888]
-	ldr	w2, [x6,728]
-	str	w2, [x0,2428]
-	ldr	w1, [x0,2396]
-	ldr	w2, [x6,736]
-	str	wzr, [x0,2404]
-	str	wzr, [x0,2408]
-	cmp	w2, w1
-	str	wzr, [x0,2424]
-	str	wzr, [x0,2420]
-	str	wzr, [x0,2432]
-	str	wzr, [x0,2440]
-	str	wzr, [x0,2416]
-	bls	.L2159
-	str	w2, [x0,2396]
-.L2159:
+	strh	w4, [x3, 2]
+	strb	w2, [x3, 6]
+	ldrb	w2, [x1, 13]
+	strb	w2, [x3, 8]
+	add	x3, x0, 2304
+	ldr	w2, [x1, 32]
+	str	wzr, [x0, 2404]
+	str	wzr, [x0, 2408]
+	ldr	w1, [x1, 40]
+	stp	wzr, wzr, [x3, 112]
+	stp	wzr, w2, [x3, 120]
+	str	wzr, [x0, 2432]
+	ldr	w2, [x0, 2396]
+	str	wzr, [x0, 2440]
+	cmp	w1, w2
+	bls	.L2131
+	str	w1, [x0, 2396]
+.L2131:
 	add	x0, x19, :lo12:.LANCHOR4
 	add	x22, x22, :lo12:.LANCHOR2
-	ldr	w0, [x0,732]
-	ldr	w1, [x22,2400]
+	ldr	w0, [x0, 732]
+	ldr	w1, [x22, 2400]
 	cmp	w0, w1
-	bls	.L2160
-	str	w0, [x22,2400]
-.L2160:
+	bls	.L2132
+	str	w0, [x22, 2400]
+.L2132:
 	mov	w0, 65535
 	cmp	w5, w0
-	beq	.L2161
+	beq	.L2133
 	add	x0, x19, :lo12:.LANCHOR4
 	add	x0, x0, 784
 	bl	make_superblock
-.L2161:
-	add	x2, x19, :lo12:.LANCHOR4
+.L2133:
+	add	x1, x19, :lo12:.LANCHOR4
+	add	x0, x1, 832
+	ldrh	w2, [x1, 832]
 	mov	w1, 65535
-	add	x0, x2, 832
-	ldrh	w2, [x2,832]
 	cmp	w2, w1
-	beq	.L2162
+	beq	.L2134
 	bl	make_superblock
-.L2162:
-	add	x19, x19, :lo12:.LANCHOR4
+.L2134:
+	add	x1, x19, :lo12:.LANCHOR4
+	add	x0, x1, 880
+	ldrh	w2, [x1, 880]
 	mov	w1, 65535
-	add	x0, x19, 880
-	ldrh	w2, [x19,880]
 	cmp	w2, w1
-	beq	.L2163
+	beq	.L2135
 	bl	make_superblock
-.L2163:
-	add	x1, x20, :lo12:.LANCHOR5
-	mov	w19, 0
-	add	x0, x1, 592
-	ldrh	w2, [x1,592]
+.L2135:
+	add	x19, x19, :lo12:.LANCHOR4
 	mov	w1, 65535
+	add	x0, x19, 1104
+	ldrh	w2, [x19, 1104]
 	cmp	w2, w1
-	beq	.L2148
+	beq	.L2136
 	bl	make_superblock
-.L2148:
-	sub	sp, x29, #16
-	mov	w0, w19
-	ldp	x19, x20, [sp,32]
-	ldp	x21, x22, [sp,48]
-	ldp	x23, x24, [sp,64]
-	ldp	x25, x26, [sp,80]
-	ldp	x27, x28, [sp,96]
-	ldp	x29, x30, [sp,16]
-	add	sp, sp, 128
-	ret
+.L2136:
+	mov	w0, 0
+	b	.L2118
 	.size	FtlLoadSysInfo, .-FtlLoadSysInfo
 	.align	2
 	.global	FtlDumpBlockInfo
 	.type	FtlDumpBlockInfo, %function
 FtlDumpBlockInfo:
-	sub	sp, sp, #176
-	lsr	x0, x0, 10
-	stp	x29, x30, [sp,16]
+	sub	sp, sp, #160
+	lsr	w0, w0, 10
+	stp	x29, x30, [sp, 16]
 	add	x29, sp, 16
-	stp	x19, x20, [sp,32]
-	stp	x21, x22, [sp,48]
-	stp	x23, x24, [sp,64]
-	stp	x25, x26, [sp,80]
-	stp	x27, x28, [sp,96]
-	uxtb	w24, w1
+	stp	x19, x20, [sp, 32]
+	adrp	x19, .LANCHOR2
+	add	x20, x19, :lo12:.LANCHOR2
+	stp	x21, x22, [sp, 48]
+	stp	x23, x24, [sp, 64]
+	add	x23, x29, 144
+	stp	x25, x26, [sp, 80]
+	and	w25, w1, 255
+	str	x27, [sp, 96]
 	bl	P2V_block_in_plane
-	adrp	x2, .LANCHOR3
-	adrp	x20, .LANCHOR2
-	uxth	w22, w0
-	add	x1, x2, :lo12:.LANCHOR3
-	add	x19, x20, :lo12:.LANCHOR2
-	adrp	x0, .LC49
+	adrp	x1, .LANCHOR3
+	add	x1, x1, :lo12:.LANCHOR3
+	and	w22, w0, 65535
 	add	x1, x1, 168
+	ldrh	w24, [x20, 2344]
+	adrp	x0, .LC49
 	add	x0, x0, :lo12:.LC49
-	ldrh	w23, [x19,2344]
 	bl	printk
-	ldr	x3, [x19,2712]
-	ubfiz	x2, x22, 1, 16
-	adrp	x0, .LC64
+	ldr	x1, [x20, 2712]
+	ubfiz	x0, x22, 1, 16
+	ldrh	w2, [x1, x0]
 	mov	w1, w22
+	adrp	x0, .LC64
 	add	x0, x0, :lo12:.LC64
-	ldrh	w2, [x3,x2]
 	bl	printk
-	strh	w22, [x29,112]
-	add	x0, x29, 112
+	strh	w22, [x23, -48]!
+	mov	x0, x23
 	bl	make_superblock
-	cbnz	w24, .L2183
-	ldrb	w0, [x19,1220]
-	cbz	w0, .L2183
+	ldrb	w0, [x20, 1220]
+	cbz	w0, .L2157
+	cbnz	w25, .L2157
 	mov	w0, w22
 	bl	ftl_get_blk_mode
-	cmp	w0, 1
 	mov	w22, w0
-	bne	.L2175
-	ldrh	w23, [x19,2346]
-	b	.L2175
-.L2183:
-	mov	w22, 0
-.L2175:
-	add	x3, x20, :lo12:.LANCHOR2
+	cmp	w0, 1
+	bne	.L2148
+	ldrh	w24, [x20, 2346]
+.L2148:
+	add	x19, x19, :lo12:.LANCHOR2
+	mov	w21, 0
+	mov	w26, 56
+	mov	w2, w24
+	mov	w1, w22
 	adrp	x0, .LC65
-	adrp	x24, .LC59
+	ldrh	w3, [x19, 2344]
 	add	x0, x0, :lo12:.LC65
-	mov	w1, w22
-	mov	w2, w23
-	ldrh	w3, [x3,2344]
-	mov	w21, 0
-	mov	w26, 65535
-	mov	w27, 56
-	mov	w25, 4
-	add	x24, x24, :lo12:.LC59
 	bl	printk
-.L2176:
-	add	x0, x20, :lo12:.LANCHOR2
-	mov	x3, 0
-	mov	w19, w3
-	ldrh	w5, [x0,2276]
-	ldrh	w6, [x0,2354]
-	ldrh	w7, [x0,2356]
-.L2177:
-	cmp	w5, w3, uxth
-	bls	.L2191
-	add	x0, x29, 112
-	add	x0, x0, x3, lsl 1
-	ldrh	w1, [x0,16]
-	cmp	w1, w26
-	beq	.L2178
-	add	x2, x20, :lo12:.LANCHOR2
-	orr	w1, w21, w1, lsl 10
-	umull	x0, w19, w27
-	ldr	x4, [x2,2520]
-	add	x4, x4, x0
-	str	w1, [x4,4]
-	ldr	x1, [x2,2520]
-	ldr	x4, [x2,2600]
-	add	x0, x1, x0
-	ldr	x2, [x2,2656]
-	mul	w1, w19, w6
-	sdiv	w1, w1, w25
-	add	x1, x4, w1, sxtw 2
-	str	x1, [x0,8]
-	mul	w1, w19, w7
-	add	w19, w19, 1
-	uxth	w19, w19
-	sdiv	w1, w1, w25
-	add	x1, x2, w1, sxtw 2
-	str	x1, [x0,16]
-.L2178:
-	add	x3, x3, 1
-	b	.L2177
-.L2191:
-	add	x0, x20, :lo12:.LANCHOR2
-	mov	w1, w19
+.L2149:
+	ldrh	w7, [x19, 2276]
+	add	x3, x23, 16
+	ldrh	w8, [x19, 2354]
+	mov	w20, 0
+	ldrh	w9, [x19, 2356]
+	mov	w0, 0
+	mov	w10, 65535
+	mov	w5, 4
+.L2150:
+	cmp	w0, w7
+	bne	.L2152
+	ldr	x0, [x19, 2520]
+	mov	w1, w20
+	adrp	x27, .LC59
 	mov	w2, w22
-	mov	x28, 0
-	ldr	x0, [x0,2520]
+	umull	x20, w20, w26
+	mov	x25, 0
+	add	x27, x27, :lo12:.LC59
 	bl	FlashReadPages
-	mov	x8, 56
-.L2180:
-	cmp	w19, w28, uxth
-	bls	.L2192
-	add	x0, x20, :lo12:.LANCHOR2
-	ldrh	w1, [x29,112]
-	mul	x2, x28, x8
-	str	x8, [x29,104]
-	add	x28, x28, 1
-	ldr	x4, [x0,2520]
-	add	x3, x4, x2
-	ldr	x0, [x3,8]
-	ldr	x7, [x3,16]
-	ldr	w5, [x0]
-	str	w5, [sp]
-	ldr	w0, [x0,4]
-	str	w0, [sp,8]
-	mov	x0, x24
-	ldr	w2, [x4,x2]
-	ldr	w5, [x7,4]
-	ldr	w4, [x7]
-	ldr	w6, [x7,8]
-	ldr	w3, [x3,4]
-	ldr	w7, [x7,12]
-	bl	printk
-	ldr	x8, [x29,104]
-	b	.L2180
-.L2192:
+.L2153:
+	cmp	x25, x20
+	bne	.L2154
 	add	w21, w21, 1
-	uxth	w21, w21
-	cmp	w21, w23
-	bne	.L2176
-.L2182:
-	sub	sp, x29, #16
+	and	w21, w21, 65535
+	cmp	w24, w21
+	bne	.L2149
+.L2155:
+	ldp	x19, x20, [sp, 32]
 	mov	w0, 0
-	ldp	x19, x20, [sp,32]
-	ldp	x21, x22, [sp,48]
-	ldp	x23, x24, [sp,64]
-	ldp	x25, x26, [sp,80]
-	ldp	x27, x28, [sp,96]
-	ldp	x29, x30, [sp,16]
-	add	sp, sp, 176
+	ldp	x21, x22, [sp, 48]
+	ldp	x23, x24, [sp, 64]
+	ldp	x25, x26, [sp, 80]
+	ldp	x29, x30, [sp, 16]
+	ldr	x27, [sp, 96]
+	add	sp, sp, 160
 	ret
+.L2157:
+	mov	w22, 0
+	b	.L2148
+.L2152:
+	ldrh	w1, [x3]
+	cmp	w1, w10
+	beq	.L2151
+	umull	x6, w20, w26
+	ldr	x4, [x19, 2520]
+	orr	w1, w21, w1, lsl 10
+	add	x4, x4, x6
+	str	w1, [x4, 4]
+	mul	w1, w20, w8
+	ldr	x2, [x19, 2520]
+	ldr	x4, [x19, 2600]
+	sdiv	w1, w1, w5
+	add	x2, x2, x6
+	add	x1, x4, w1, sxtw 2
+	str	x1, [x2, 8]
+	mul	w1, w20, w9
+	ldr	x4, [x19, 2656]
+	add	w20, w20, 1
+	and	w20, w20, 65535
+	sdiv	w1, w1, w5
+	add	x1, x4, w1, sxtw 2
+	str	x1, [x2, 16]
+.L2151:
+	add	w0, w0, 1
+	add	x3, x3, 2
+	and	w0, w0, 65535
+	b	.L2150
+.L2154:
+	ldr	x8, [x19, 2520]
+	ldrh	w1, [x29, 96]
+	add	x2, x8, x25
+	ldp	x3, x0, [x2, 8]
+	ldr	w4, [x3, 4]
+	str	w4, [sp, 8]
+	ldr	w3, [x3]
+	str	w3, [sp]
+	ldp	w4, w5, [x0]
+	ldp	w6, w7, [x0, 8]
+	mov	x0, x27
+	ldr	w3, [x2, 4]
+	ldr	w2, [x8, x25]
+	add	x25, x25, 56
+	bl	printk
+	b	.L2153
 	.size	FtlDumpBlockInfo, .-FtlDumpBlockInfo
 	.align	2
 	.global	FtlScanAllBlock
@@ -13906,388 +13646,366 @@ FtlDumpBlockInfo:
 FtlScanAllBlock:
 	sub	sp, sp, #144
 	adrp	x1, .LANCHOR3
-	adrp	x0, .LC49
 	add	x1, x1, :lo12:.LANCHOR3
-	add	x0, x0, :lo12:.LC49
+	adrp	x0, .LC49
 	add	x1, x1, 192
-	stp	x29, x30, [sp,16]
+	add	x0, x0, :lo12:.LC49
+	stp	x29, x30, [sp, 16]
 	add	x29, sp, 16
-	stp	x23, x24, [sp,64]
-	stp	x21, x22, [sp,48]
-	adrp	x23, .LC67
-	adrp	x22, .LC66
-	adrp	x24, .LC68
-	add	x22, x22, :lo12:.LC66
-	stp	x19, x20, [sp,32]
-	add	x23, x23, :lo12:.LC67
+	stp	x19, x20, [sp, 32]
 	mov	w20, 0
-	add	x24, x24, :lo12:.LC68
-	stp	x25, x26, [sp,80]
+	stp	x21, x22, [sp, 48]
+	stp	x23, x24, [sp, 64]
+	adrp	x23, .LANCHOR2
+	str	x25, [sp, 80]
+	add	x21, x23, :lo12:.LANCHOR2
 	bl	printk
-.L2194:
-	adrp	x21, .LANCHOR2
-	add	x19, x21, :lo12:.LANCHOR2
-	ldrh	w0, [x19,2286]
+.L2161:
+	add	x19, x23, :lo12:.LANCHOR2
+	ldrh	w0, [x19, 2286]
 	cmp	w0, w20
-	bls	.L2203
+	bhi	.L2169
+	ldp	x19, x20, [sp, 32]
+	mov	w0, 0
+	ldp	x21, x22, [sp, 48]
+	ldp	x23, x24, [sp, 64]
+	ldp	x29, x30, [sp, 16]
+	ldr	x25, [sp, 80]
+	add	sp, sp, 144
+	ret
+.L2169:
+	strh	w20, [x29, 80]
 	mov	w0, w20
-	strh	w20, [x29,80]
 	bl	ftl_get_blk_mode
 	mov	w3, w0
-	ldr	x4, [x19,2712]
-	ubfiz	x2, x20, 1, 16
+	ldr	x2, [x19, 2712]
+	ubfiz	x1, x20, 1, 16
+	adrp	x0, .LC66
+	add	x0, x0, :lo12:.LC66
+	ldrh	w2, [x2, x1]
 	mov	w1, w20
-	mov	x0, x22
-	ldrh	w2, [x4,x2]
 	bl	printk
 	add	x0, x29, 80
 	bl	make_superblock
-	mov	x1, 0
-	ldrh	w6, [x19,2276]
-	ldrh	w7, [x19,2354]
-	mov	w9, 65535
-	ldrh	w8, [x19,2356]
-	mov	w10, 56
-	mov	w19, w1
+	add	x3, x29, 96
+	ldrh	w7, [x19, 2276]
+	ldrh	w8, [x19, 2354]
+	mov	w0, 0
+	ldrh	w9, [x19, 2356]
+	mov	w10, 65535
+	mov	w19, 0
+	mov	w11, 56
 	mov	w5, 4
-.L2195:
-	cmp	w6, w1, uxth
-	bls	.L2204
-	add	x0, x29, 80
-	add	x0, x0, x1, lsl 1
-	ldrh	w0, [x0,16]
-	cmp	w0, w9
-	beq	.L2196
-	add	x3, x21, :lo12:.LANCHOR2
-	lsl	w0, w0, 10
-	umull	x2, w19, w10
-	ldr	x4, [x3,2520]
-	add	x4, x4, x2
-	str	w0, [x4,4]
-	ldr	x0, [x3,2520]
-	ldr	x4, [x3,2600]
-	add	x2, x0, x2
-	ldr	x3, [x3,2656]
-	mul	w0, w19, w7
-	sdiv	w0, w0, w5
-	add	x0, x4, w0, sxtw 2
-	str	x0, [x2,8]
-	mul	w0, w19, w8
-	add	w19, w19, 1
-	uxth	w19, w19
-	sdiv	w0, w0, w5
-	add	x0, x3, w0, sxtw 2
-	str	x0, [x2,16]
-.L2196:
-	add	x1, x1, 1
-	b	.L2195
-.L2204:
-	add	x0, x21, :lo12:.LANCHOR2
-	mov	w1, w19
+.L2162:
+	cmp	w0, w7
+	bne	.L2164
+	ldr	x0, [x21, 2520]
+	mov	w24, 56
+	adrp	x25, .LC67
 	mov	w2, 0
-	mov	x25, 0
-	mov	x26, 56
-	ldr	x0, [x0,2520]
+	mov	w1, w19
+	umull	x24, w19, w24
+	mov	x22, 0
+	add	x25, x25, :lo12:.LC67
 	bl	FlashReadPages
-.L2198:
-	add	x0, x21, :lo12:.LANCHOR2
-	cmp	w19, w25, uxth
-	bls	.L2205
-	ldr	x4, [x0,2520]
-	mul	x2, x25, x26
-	ldrh	w1, [x29,80]
-	add	x25, x25, 1
-	add	x3, x4, x2
-	ldr	x0, [x3,8]
-	ldr	x7, [x3,16]
-	ldr	w5, [x0]
-	str	w5, [sp]
-	ldr	w0, [x0,4]
-	str	w0, [sp,8]
-	mov	x0, x23
-	ldr	w2, [x4,x2]
-	ldr	w5, [x7,4]
-	ldr	w4, [x7]
-	ldr	w6, [x7,8]
-	ldr	w3, [x3,4]
-	ldr	w7, [x7,12]
-	bl	printk
-	b	.L2198
-.L2205:
-	ldr	x0, [x0,2520]
+.L2165:
+	cmp	x22, x24
+	bne	.L2166
+	ldr	x0, [x21, 2520]
 	mov	w1, w19
+	adrp	x24, .LC68
 	mov	w2, 1
-	mov	x25, 0
-	mov	x26, 56
+	mov	x19, 0
+	add	x24, x24, :lo12:.LC68
 	bl	FlashReadPages
-.L2200:
-	cmp	w19, w25, uxth
-	bls	.L2206
-	add	x0, x21, :lo12:.LANCHOR2
-	ldrh	w1, [x29,80]
-	mul	x2, x25, x26
-	add	x25, x25, 1
-	ldr	x4, [x0,2520]
-	add	x3, x4, x2
-	ldr	x0, [x3,8]
-	ldr	x7, [x3,16]
-	ldr	w5, [x0]
-	str	w5, [sp]
-	ldr	w0, [x0,4]
-	str	w0, [sp,8]
+.L2167:
+	cmp	x22, x19
+	bne	.L2168
+	add	w20, w20, 1
+	and	w20, w20, 65535
+	b	.L2161
+.L2164:
+	ldrh	w1, [x3]
+	cmp	w1, w10
+	beq	.L2163
+	umull	x6, w19, w11
+	ldr	x4, [x21, 2520]
+	lsl	w1, w1, 10
+	add	x4, x4, x6
+	str	w1, [x4, 4]
+	mul	w1, w19, w8
+	ldr	x2, [x21, 2520]
+	ldr	x4, [x21, 2600]
+	sdiv	w1, w1, w5
+	add	x2, x2, x6
+	add	x1, x4, w1, sxtw 2
+	str	x1, [x2, 8]
+	mul	w1, w19, w9
+	ldr	x4, [x21, 2656]
+	add	w19, w19, 1
+	and	w19, w19, 65535
+	sdiv	w1, w1, w5
+	add	x1, x4, w1, sxtw 2
+	str	x1, [x2, 16]
+.L2163:
+	add	w0, w0, 1
+	add	x3, x3, 2
+	and	w0, w0, 65535
+	b	.L2162
+.L2166:
+	ldr	x8, [x21, 2520]
+	ldrh	w1, [x29, 80]
+	add	x2, x8, x22
+	ldp	x3, x0, [x2, 8]
+	ldr	w4, [x3, 4]
+	str	w4, [sp, 8]
+	ldr	w3, [x3]
+	str	w3, [sp]
+	ldp	w4, w5, [x0]
+	ldp	w6, w7, [x0, 8]
+	mov	x0, x25
+	ldr	w3, [x2, 4]
+	ldr	w2, [x8, x22]
+	add	x22, x22, 56
+	bl	printk
+	b	.L2165
+.L2168:
+	ldr	x8, [x21, 2520]
+	ldrh	w1, [x29, 80]
+	add	x2, x8, x19
+	ldp	x3, x0, [x2, 8]
+	ldr	w4, [x3, 4]
+	str	w4, [sp, 8]
+	ldr	w3, [x3]
+	str	w3, [sp]
+	ldp	w4, w5, [x0]
+	ldp	w6, w7, [x0, 8]
 	mov	x0, x24
-	ldr	w2, [x4,x2]
-	ldr	w5, [x7,4]
-	ldr	w4, [x7]
-	ldr	w6, [x7,8]
-	ldr	w3, [x3,4]
-	ldr	w7, [x7,12]
+	ldr	w3, [x2, 4]
+	ldr	w2, [x8, x19]
+	add	x19, x19, 56
 	bl	printk
-	b	.L2200
-.L2206:
-	add	w20, w20, 1
-	uxth	w20, w20
-	b	.L2194
-.L2203:
-	sub	sp, x29, #16
-	mov	w0, 0
-	ldp	x19, x20, [sp,32]
-	ldp	x21, x22, [sp,48]
-	ldp	x23, x24, [sp,64]
-	ldp	x25, x26, [sp,80]
-	ldp	x29, x30, [sp,16]
-	add	sp, sp, 144
-	ret
+	b	.L2167
 	.size	FtlScanAllBlock, .-FtlScanAllBlock
 	.align	2
 	.global	SupperBlkListInit
 	.type	SupperBlkListInit, %function
 SupperBlkListInit:
-	stp	x29, x30, [sp, -128]!
+	stp	x29, x30, [sp, -64]!
+	mov	w0, 6
 	mov	w1, 0
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	adrp	x23, .LANCHOR2
-	stp	x19, x20, [sp,16]
-	add	x19, x23, :lo12:.LANCHOR2
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	mov	w25, 6
-	adrp	x22, .LANCHOR4
-	ldrh	w2, [x19,2286]
-	add	x21, x22, :lo12:.LANCHOR4
-	ldr	x0, [x19,2808]
-	mov	w28, 0
-	mov	w24, w28
-	mov	w26, -1
-	mul	w2, w2, w25
-	mov	w27, 32768
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR2
+	add	x19, x19, :lo12:.LANCHOR2
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	adrp	x20, .LANCHOR4
+	add	x23, x19, 2304
+	mov	w21, 0
+	ldrh	w2, [x19, 2286]
+	mov	w22, 0
+	mov	w24, 0
+	mul	w2, w2, w0
+	ldr	x0, [x19, 2808]
 	bl	ftl_memset
-	strh	wzr, [x19,2386]
-	str	xzr, [x21,768]
-	mov	w19, w28
-	str	xzr, [x21,744]
-	str	xzr, [x21,752]
-	strh	wzr, [x21,760]
-	strh	wzr, [x21,776]
-.L2208:
-	add	x0, x23, :lo12:.LANCHOR2
-	ldrh	w1, [x0,2284]
-	cmp	w19, w1
-	bge	.L2215
-	mov	w20, 0
-	ldrh	w5, [x0,2276]
-	ldrh	w4, [x0,2344]
-	mov	w3, w20
-	mov	x2, x0
-.L2216:
-	cmp	w3, w5
-	bge	.L2217
-	add	x0, x2, 2304
-	mov	w1, w19
-	str	x4, [x29,96]
-	str	x5, [x29,104]
-	ldrb	w0, [x0,w3,sxtw]
-	str	x2, [x29,112]
-	str	x3, [x29,120]
+	strh	wzr, [x19, 2386]
+	add	x0, x20, :lo12:.LANCHOR4
+	strh	wzr, [x0, 760]
+	strh	wzr, [x0, 776]
+	str	xzr, [x0, 744]
+	str	xzr, [x0, 752]
+	str	xzr, [x0, 768]
+.L2172:
+	ldrh	w0, [x19, 2284]
+	cmp	w24, w0
+	bge	.L2179
+	ldrh	w8, [x19, 2276]
+	mov	w5, 0
+	ldrh	w7, [x19, 2344]
+	mov	w6, 0
+	b	.L2180
+.L2174:
+	ldrb	w0, [x23, w6, sxtw]
+	mov	w1, w24
 	bl	V2P_block
 	bl	FtlBbmIsBadBlock
-	ldr	x3, [x29,120]
-	ldr	x2, [x29,112]
-	ldr	x5, [x29,104]
-	ldr	x4, [x29,96]
-	cbnz	w0, .L2209
-	add	w20, w4, w20
-	sxth	w20, w20
-.L2209:
-	add	w3, w3, 1
-	sxth	w3, w3
-	b	.L2216
-.L2217:
-	cbz	w20, .L2211
-	sdiv	w20, w27, w20
-	sxth	w20, w20
-	b	.L2212
-.L2211:
-	add	x0, x23, :lo12:.LANCHOR2
-	ldr	x0, [x0,2712]
-	strh	w26, [x0,w19,sxtw 1]
-.L2212:
-	add	x1, x23, :lo12:.LANCHOR2
-	ldr	x0, [x1,2808]
-	smaddl	x0, w19, w25, x0
-	strh	w20, [x0,4]
-	ldrh	w0, [x21,784]
-	cmp	w19, w0
-	beq	.L2213
-	ldrh	w0, [x21,832]
-	cmp	w19, w0
-	beq	.L2213
-	ldrh	w0, [x21,880]
-	cmp	w19, w0
-	beq	.L2213
-	ldr	x0, [x1,2712]
-	ldrh	w0, [x0,w19,sxtw 1]
-	cbnz	w0, .L2214
-	add	w28, w28, 1
-	mov	w0, w19
-	uxth	w28, w28
+	cbnz	w0, .L2173
+	add	w5, w7, w5
+	sxth	w5, w5
+.L2173:
+	add	w6, w6, 1
+	sxth	w6, w6
+.L2180:
+	cmp	w6, w8
+	blt	.L2174
+	cbz	w5, .L2175
+	mov	w0, 32768
+	sdiv	w5, w0, w5
+	sxth	w5, w5
+.L2176:
+	ldr	x1, [x19, 2808]
+	mov	w0, 6
+	smaddl	x0, w24, w0, x1
+	strh	w5, [x0, 4]
+	add	x0, x20, :lo12:.LANCHOR4
+	ldrh	w1, [x0, 784]
+	cmp	w24, w1
+	beq	.L2177
+	ldrh	w1, [x0, 832]
+	cmp	w24, w1
+	beq	.L2177
+	ldrh	w0, [x0, 880]
+	cmp	w24, w0
+	beq	.L2177
+	ldr	x0, [x19, 2712]
+	ldrh	w0, [x0, w24, sxtw 1]
+	cbnz	w0, .L2178
+	add	w21, w21, 1
+	mov	w0, w24
+	and	w21, w21, 65535
 	bl	INSERT_FREE_LIST
-	b	.L2213
-.L2214:
+.L2177:
 	add	w24, w24, 1
-	mov	w0, w19
-	uxth	w24, w24
+	sxth	w24, w24
+	b	.L2172
+.L2175:
+	ldr	x0, [x19, 2712]
+	mov	w1, -1
+	strh	w1, [x0, w24, sxtw 1]
+	b	.L2176
+.L2178:
+	add	w22, w22, 1
+	mov	w0, w24
+	and	w22, w22, 65535
 	bl	INSERT_DATA_LIST
-.L2213:
-	add	w19, w19, 1
-	sxth	w19, w19
-	b	.L2208
-.L2215:
-	add	x22, x22, :lo12:.LANCHOR4
+	b	.L2177
+.L2179:
+	add	x20, x20, :lo12:.LANCHOR4
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x25, x26, [sp,64]
-	strh	w24, [x22,760]
-	strh	w28, [x22,776]
-	ldp	x23, x24, [sp,48]
-	ldp	x21, x22, [sp,32]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
+	ldp	x23, x24, [sp, 48]
+	strh	w22, [x20, 760]
+	strh	w21, [x20, 776]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 64
 	ret
 	.size	SupperBlkListInit, .-SupperBlkListInit
 	.align	2
 	.global	Ftl_save_ext_data
 	.type	Ftl_save_ext_data, %function
 Ftl_save_ext_data:
-	adrp	x0, .LANCHOR5
+	adrp	x0, .LANCHOR4
+	add	x0, x0, :lo12:.LANCHOR4
 	mov	w1, 19539
-	add	x0, x0, :lo12:.LANCHOR5
 	movk	w1, 0x4654, lsl 16
-	stp	x29, x30, [sp, -16]!
-	add	x2, x0, 640
-	add	x29, sp, 0
-	ldr	w3, [x0,640]
+	ldr	w3, [x0, 1152]
 	cmp	w3, w1
-	bne	.L2218
+	bne	.L2185
+	stp	x29, x30, [sp, -16]!
+	add	x2, x0, 1152
 	mov	w1, 99
+	add	x29, sp, 0
 	movk	w1, 0x5000, lsl 16
-	str	w1, [x2,4]
-	ldr	w1, [x0,1152]
-	ldr	w0, [x0,1156]
-	str	w0, [x2,92]
+	str	w1, [x2, 4]
+	ldr	w1, [x0, 1664]
+	ldr	w0, [x0, 1668]
+	stp	w1, w0, [x2, 88]
 	adrp	x0, .LANCHOR2
 	add	x0, x0, :lo12:.LANCHOR2
-	str	w1, [x2,88]
-	ldr	w1, [x0,2404]
-	str	w1, [x2,8]
-	ldr	w1, [x0,2408]
-	str	w1, [x2,12]
-	ldr	w1, [x0,2424]
-	str	w1, [x2,16]
-	ldr	w1, [x0,2420]
-	str	w1, [x2,20]
-	ldr	w1, [x0,2432]
-	str	w1, [x2,28]
-	ldr	w1, [x0,2436]
-	str	w1, [x2,32]
-	ldr	w1, [x0,2412]
-	str	w1, [x2,36]
-	ldr	w1, [x0,2416]
-	str	w1, [x2,40]
-	ldr	w1, [x0,2440]
-	str	w1, [x2,44]
-	ldr	w1, [x0,2444]
-	str	w1, [x2,48]
-	ldr	w1, [x0,2392]
-	ldr	w0, [x0,2388]
-	str	w1, [x2,60]
+	ldr	w1, [x0, 2404]
+	str	w1, [x2, 8]
+	ldr	w1, [x0, 2408]
+	str	w1, [x2, 12]
+	ldr	w1, [x0, 2424]
+	str	w1, [x2, 16]
+	ldr	w1, [x0, 2420]
+	str	w1, [x2, 20]
+	ldr	w1, [x0, 2432]
+	str	w1, [x2, 28]
+	ldr	w1, [x0, 2436]
+	str	w1, [x2, 32]
+	ldr	w1, [x0, 2412]
+	str	w1, [x2, 36]
+	ldr	w1, [x0, 2416]
+	str	w1, [x2, 40]
+	ldr	w1, [x0, 2440]
+	str	w1, [x2, 44]
+	ldr	w1, [x0, 2444]
+	str	w1, [x2, 48]
+	ldr	w1, [x0, 2392]
+	ldr	w0, [x0, 2388]
+	stp	w1, w0, [x2, 60]
 	mov	w1, 1
-	str	w0, [x2,64]
 	mov	w0, 0
 	bl	FtlVendorPartWrite
-.L2218:
 	ldp	x29, x30, [sp], 16
 	ret
+.L2185:
+	ret
 	.size	Ftl_save_ext_data, .-Ftl_save_ext_data
 	.align	2
 	.global	FtlEctTblFlush
 	.type	FtlEctTblFlush, %function
 FtlEctTblFlush:
-	adrp	x2, .LANCHOR2
-	mov	w1, 32
-	add	x3, x2, :lo12:.LANCHOR2
-	stp	x29, x30, [sp, -16]!
-	add	x29, sp, 0
-	ldr	w4, [x3,2096]
-	cbz	w4, .L2221
-	ldr	w3, [x3,2444]
-	cmp	w3, 39
+	adrp	x1, .LANCHOR2
+	add	x2, x1, :lo12:.LANCHOR2
+	ldr	w3, [x2, 2096]
+	cbz	w3, .L2193
+	ldr	w2, [x2, 2444]
 	mov	w3, 4
-	csel	w1, w1, w3, hi
-.L2221:
-	adrp	x3, .LANCHOR5
-	add	x3, x3, :lo12:.LANCHOR5
-	ldrh	w4, [x3,1160]
+	cmp	w2, 39
+	mov	w2, 32
+	csel	w2, w2, w3, hi
+.L2189:
+	adrp	x3, .LANCHOR4
+	add	x3, x3, :lo12:.LANCHOR4
+	ldrh	w4, [x3, 1672]
 	cmp	w4, 31
-	bhi	.L2222
+	bhi	.L2190
 	add	w4, w4, 1
-	mov	w1, 1
-	strh	w4, [x3,1160]
-.L2222:
-	cbnz	w0, .L2223
-	add	x0, x2, :lo12:.LANCHOR2
-	ldr	x3, [x0,2688]
-	ldr	w0, [x3,20]
-	add	w1, w1, w0
-	ldr	w0, [x3,16]
-	cmp	w0, w1
-	bcc	.L2224
-.L2223:
-	add	x2, x2, :lo12:.LANCHOR2
-	ldr	x0, [x2,2688]
-	ldr	w1, [x0,16]
-	str	w1, [x0,20]
-	mov	w1, 17221
-	movk	w1, 0x4254, lsl 16
-	str	w1, [x0]
-	ldr	x0, [x2,2688]
-	ldrh	w1, [x2,2672]
-	str	wzr, [x0,4]
+	mov	w2, 1
+	strh	w4, [x3, 1672]
+.L2190:
+	cbnz	w0, .L2191
+	add	x0, x1, :lo12:.LANCHOR2
+	ldr	x0, [x0, 2688]
+	ldr	w3, [x0, 20]
+	ldr	w0, [x0, 16]
+	add	w2, w2, w3
+	cmp	w0, w2
+	bcc	.L2196
+.L2191:
+	add	x0, x1, :lo12:.LANCHOR2
+	stp	x29, x30, [sp, -16]!
+	add	x29, sp, 0
+	ldr	x1, [x0, 2688]
+	ldr	w2, [x1, 16]
+	str	w2, [x1, 20]
+	mov	w2, 17221
+	movk	w2, 0x4254, lsl 16
+	str	w2, [x1]
+	ldr	x2, [x0, 2688]
+	ldrh	w1, [x0, 2672]
 	lsl	w3, w1, 9
-	str	w3, [x0,12]
-	ldr	w3, [x0,8]
-	ldr	x2, [x2,2688]
+	str	wzr, [x2, 4]
+	str	w3, [x2, 12]
+	ldr	w3, [x2, 8]
 	add	w3, w3, 1
-	str	w3, [x0,8]
+	str	w3, [x2, 8]
+	ldr	x2, [x0, 2688]
 	mov	w0, 64
 	bl	FtlVendorPartWrite
 	bl	Ftl_save_ext_data
-.L2224:
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	ret
+.L2193:
+	mov	w2, 32
+	b	.L2189
+.L2196:
+	mov	w0, 0
+	ret
 	.size	FtlEctTblFlush, .-FtlEctTblFlush
 	.align	2
 	.global	Ftl_load_ext_data
@@ -14297,267 +14015,264 @@ Ftl_load_ext_data:
 	mov	w1, 1
 	mov	w0, 0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x19, .LANCHOR5
-	str	x21, [sp,32]
-	add	x20, x19, :lo12:.LANCHOR5
-	add	x21, x20, 640
-	mov	x2, x21
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR4
+	add	x20, x19, :lo12:.LANCHOR4
+	stp	x21, x22, [sp, 32]
+	add	x22, x20, 1152
+	mov	w21, 19539
+	mov	x2, x22
 	bl	FtlVendorPartRead
-	ldr	w1, [x20,640]
-	mov	w0, 19539
-	movk	w0, 0x4654, lsl 16
-	cmp	w1, w0
-	beq	.L2229
-	mov	x0, x21
-	mov	w1, 0
+	ldr	w0, [x20, 1152]
+	movk	w21, 0x4654, lsl 16
+	cmp	w0, w21
+	beq	.L2199
 	mov	w2, 512
+	mov	w1, 0
+	mov	x0, x22
 	bl	ftl_memset
-	mov	w0, 19539
-	movk	w0, 0x4654, lsl 16
-	str	w0, [x20,640]
-.L2229:
-	add	x1, x19, :lo12:.LANCHOR5
+	str	w21, [x20, 1152]
+.L2199:
+	add	x1, x19, :lo12:.LANCHOR4
 	mov	w2, 19539
 	movk	w2, 0x4654, lsl 16
-	add	x0, x1, 640
+	add	x0, x1, 1152
 	adrp	x20, .LANCHOR2
-	ldr	w3, [x1,640]
+	ldr	w3, [x1, 1152]
 	cmp	w3, w2
-	bne	.L2230
-	ldr	w2, [x1,728]
-	str	w2, [x1,1152]
-	ldr	w2, [x1,732]
-	str	w2, [x1,1156]
+	bne	.L2200
+	ldr	w2, [x1, 1240]
+	str	w2, [x1, 1664]
+	ldr	w2, [x1, 1244]
+	str	w2, [x1, 1668]
 	add	x1, x20, :lo12:.LANCHOR2
-	ldr	w2, [x0,8]
-	str	w2, [x1,2404]
-	ldr	w2, [x0,12]
-	str	w2, [x1,2408]
-	ldr	w2, [x0,16]
-	str	w2, [x1,2424]
-	ldr	w2, [x0,20]
-	str	w2, [x1,2420]
-	ldr	w2, [x0,28]
-	str	w2, [x1,2432]
-	ldr	w2, [x0,32]
-	str	w2, [x1,2436]
-	ldr	w2, [x0,36]
-	str	w2, [x1,2412]
-	ldr	w2, [x0,40]
-	str	w2, [x1,2416]
-	ldr	w2, [x0,44]
-	str	w2, [x1,2440]
-	ldr	w2, [x0,48]
-	ldr	w0, [x0,60]
-	str	w2, [x1,2444]
-	str	w0, [x1,2392]
-.L2230:
-	add	x0, x19, :lo12:.LANCHOR5
+	ldr	w2, [x0, 8]
+	str	w2, [x1, 2404]
+	ldr	w2, [x0, 12]
+	str	w2, [x1, 2408]
+	ldr	w2, [x0, 16]
+	str	w2, [x1, 2424]
+	ldr	w2, [x0, 20]
+	str	w2, [x1, 2420]
+	ldr	w2, [x0, 28]
+	str	w2, [x1, 2432]
+	ldr	w2, [x0, 32]
+	str	w2, [x1, 2436]
+	ldr	w2, [x0, 36]
+	str	w2, [x1, 2412]
+	ldr	w2, [x0, 40]
+	str	w2, [x1, 2416]
+	ldr	w2, [x0, 44]
+	str	w2, [x1, 2440]
+	ldr	w2, [x0, 48]
+	ldr	w0, [x0, 60]
+	str	w0, [x1, 2392]
+	str	w2, [x1, 2444]
+.L2200:
+	add	x0, x19, :lo12:.LANCHOR4
 	add	x1, x20, :lo12:.LANCHOR2
 	mov	w2, 34661
-	add	x0, x0, 640
+	add	x0, x0, 1152
 	movk	w2, 0x1234, lsl 16
-	ldr	w3, [x0,68]
-	str	wzr, [x1,2388]
+	ldr	w3, [x0, 68]
+	str	wzr, [x1, 2388]
 	cmp	w3, w2
-	bne	.L2231
-	ldrb	w2, [x1,1220]
-	cbz	w2, .L2232
-	str	wzr, [x0,68]
+	bne	.L2201
+	ldrb	w2, [x1, 1220]
+	cbz	w2, .L2202
+	str	wzr, [x0, 68]
 	bl	Ftl_save_ext_data
-	b	.L2231
-.L2232:
-	mov	w0, 1
-	str	w0, [x1,2096]
-	adrp	x0, .LC47
-	adrp	x1, .LC69
-	add	x0, x0, :lo12:.LC47
-	add	x1, x1, :lo12:.LC69
-	bl	printk
-.L2231:
+.L2201:
 	add	x0, x20, :lo12:.LANCHOR2
-	add	x19, x19, :lo12:.LANCHOR5
-	ldr	x21, [sp,32]
-	ldrh	w2, [x0,2336]
-	ldr	w3, [x0,2428]
-	ldr	w1, [x0,2432]
-	ldrh	w0, [x0,2284]
-	madd	w1, w2, w3, w1
+	add	x19, x19, :lo12:.LANCHOR4
+	ldp	x21, x22, [sp, 32]
+	ldrh	w1, [x0, 2336]
+	ldr	w3, [x0, 2428]
+	ldr	w2, [x0, 2432]
+	ldrh	w0, [x0, 2284]
+	madd	w1, w1, w3, w2
 	udiv	w0, w1, w0
-	str	w0, [x19,1164]
-	ldp	x19, x20, [sp,16]
+	str	w0, [x19, 1676]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
+.L2202:
+	mov	w0, 1
+	str	w0, [x1, 2096]
+	adrp	x1, .LC69
+	adrp	x0, .LC48
+	add	x1, x1, :lo12:.LC69
+	add	x0, x0, :lo12:.LC48
+	bl	printk
+	b	.L2201
 	.size	Ftl_load_ext_data, .-Ftl_load_ext_data
 	.align	2
 	.global	ftl_scan_all_ppa
 	.type	ftl_scan_all_ppa, %function
 ftl_scan_all_ppa:
 	sub	sp, sp, #112
-	stp	x29, x30, [sp,16]
+	stp	x29, x30, [sp, 16]
 	add	x29, sp, 16
-	stp	x21, x22, [sp,48]
-	adrp	x21, .LANCHOR2
-	add	x0, x21, :lo12:.LANCHOR2
-	stp	x25, x26, [sp,80]
-	stp	x23, x24, [sp,64]
-	stp	x19, x20, [sp,32]
-	stp	x27, x28, [sp,96]
-	adrp	x24, .LC70
-	adrp	x25, .LC71
-	ldrh	w19, [x0,2342]
-	adrp	x26, .LC72
-	add	x24, x24, :lo12:.LC70
-	add	x25, x25, :lo12:.LC71
-	sub	w19, w19, #16
-	add	x26, x26, :lo12:.LC72
-.L2234:
-	add	x20, x21, :lo12:.LANCHOR2
-	ldrh	w0, [x20,2342]
-	cmp	w19, w0
-	bge	.L2249
-	uxth	w27, w19
-	mov	w0, w27
+	stp	x19, x20, [sp, 32]
+	adrp	x19, .LANCHOR2
+	add	x19, x19, :lo12:.LANCHOR2
+	stp	x23, x24, [sp, 64]
+	stp	x25, x26, [sp, 80]
+	add	x20, x19, 2936
+	adrp	x26, .LC70
+	add	x26, x26, :lo12:.LC70
+	ldrh	w23, [x19, 2342]
+	stp	x21, x22, [sp, 48]
+	sub	w23, w23, #16
+	str	x27, [sp, 96]
+	lsl	w25, w23, 10
+.L2205:
+	ldrh	w0, [x19, 2342]
+	cmp	w23, w0
+	blt	.L2213
+	adrp	x1, .LANCHOR3
+	add	x1, x1, :lo12:.LANCHOR3
+	add	x1, x1, 208
+	adrp	x0, .LC73
+	add	x0, x0, :lo12:.LC73
+	bl	printk
+	ldp	x19, x20, [sp, 32]
+	ldp	x21, x22, [sp, 48]
+	ldp	x23, x24, [sp, 64]
+	ldp	x25, x26, [sp, 80]
+	ldp	x29, x30, [sp, 16]
+	ldr	x27, [sp, 96]
+	add	sp, sp, 112
+	ret
+.L2213:
+	and	w22, w23, 65535
+	mov	w0, w22
 	bl	ftl_get_blk_mode
-	ldrb	w1, [x20,1220]
-	cbz	w1, .L2235
-	ldrh	w1, [x20,2284]
-	cmp	w19, w1
-	bge	.L2236
-	ldrh	w1, [x20,2358]
-	cmp	w19, w1
-	blt	.L2236
-.L2235:
+	ldrb	w1, [x19, 1220]
+	cbz	w1, .L2206
+	ldrh	w1, [x19, 2284]
+	cmp	w23, w1
+	bge	.L2207
+	ldrh	w1, [x19, 2358]
+	cmp	w23, w1
+	blt	.L2207
+.L2206:
 	cmp	w0, 1
-	bne	.L2237
-.L2236:
-	add	x0, x21, :lo12:.LANCHOR2
-	mov	w22, -2147483648
-	ldrh	w23, [x0,2346]
-	b	.L2238
-.L2237:
-	add	x0, x21, :lo12:.LANCHOR2
-	mov	w22, 0
-	ldrh	w23, [x0,2344]
-.L2238:
-	mov	x0, x24
-	mov	w1, w19
-	mov	w2, w23
-	mov	w3, w22
+	bne	.L2208
+.L2207:
+	ldrh	w24, [x19, 2346]
+	mov	w21, -2147483648
+.L2209:
+	mov	w3, w21
+	mov	w2, w24
+	mov	w1, w23
+	mov	x0, x26
 	bl	printk
-	mov	w0, w27
+	mov	w0, w22
 	bl	FtlBbmIsBadBlock
-	cbz	w0, .L2239
-	mov	x0, x25
-	mov	w1, w19
-	mov	w2, w23
-	mov	w3, w22
+	cbz	w0, .L2210
+	adrp	x0, .LC71
+	mov	w3, w21
+	mov	w2, w24
+	mov	w1, w23
+	add	x0, x0, :lo12:.LC71
 	bl	printk
-.L2239:
-	add	x28, x21, :lo12:.LANCHOR2
-	mov	w27, 0
-	add	x20, x28, 2936
-	add	w22, w22, w19, lsl 10
-.L2240:
-	cmp	w27, w23
-	beq	.L2250
-	add	w0, w22, w27
-	str	w0, [x20,4]
-	ldr	x0, [x28,2576]
-	mov	w1, 1
-	str	x0, [x20,8]
+.L2210:
+	adrp	x27, .LC72
+	add	w21, w21, w25
+	add	x27, x27, :lo12:.LC72
+	mov	w22, 0
+.L2211:
+	cmp	w22, w24
+	bne	.L2212
+	add	w23, w23, 1
+	add	w25, w25, 1024
+	b	.L2205
+.L2208:
+	ldrh	w24, [x19, 2344]
+	mov	w21, 0
+	b	.L2209
+.L2212:
+	add	w0, w21, w22
+	stp	wzr, w0, [x20]
+	ldr	x0, [x19, 2576]
 	mov	w2, 0
-	ldr	x0, [x28,2640]
-	add	w27, w27, 1
-	str	x0, [x20,16]
+	str	x0, [x20, 8]
+	mov	w1, 1
+	ldr	x0, [x19, 2640]
+	add	w22, w22, 1
+	str	x0, [x20, 16]
 	mov	x0, x20
-	str	wzr, [x20]
 	bl	FlashReadPages
-	ldr	x7, [x20,8]
-	ldr	x6, [x20,16]
-	ldr	w0, [x7,4]
-	str	w0, [sp]
-	mov	x0, x26
-	ldr	w3, [x6]
-	ldr	w4, [x6,4]
-	ldr	w5, [x6,8]
-	ldr	w1, [x20,4]
-	ldr	w2, [x20]
-	ldr	w6, [x6,12]
-	ldr	w7, [x7]
-	bl	printk
-	b	.L2240
-.L2250:
-	add	w19, w19, 1
-	b	.L2234
-.L2249:
-	adrp	x1, .LANCHOR3
-	adrp	x0, .LC73
-	add	x1, x1, :lo12:.LANCHOR3
-	add	x0, x0, :lo12:.LC73
-	add	x1, x1, 208
+	ldp	x1, x0, [x20, 8]
+	ldr	w2, [x1, 4]
+	str	w2, [sp]
+	ldp	w3, w4, [x0]
+	ldp	w5, w6, [x0, 8]
+	mov	x0, x27
+	ldr	w7, [x1]
+	ldp	w2, w1, [x20]
 	bl	printk
-	sub	sp, x29, #16
-	ldp	x19, x20, [sp,32]
-	ldp	x21, x22, [sp,48]
-	ldp	x23, x24, [sp,64]
-	ldp	x25, x26, [sp,80]
-	ldp	x27, x28, [sp,96]
-	ldp	x29, x30, [sp,16]
-	add	sp, sp, 112
-	ret
+	b	.L2211
 	.size	ftl_scan_all_ppa, .-ftl_scan_all_ppa
 	.align	2
 	.global	update_multiplier_value
 	.type	update_multiplier_value, %function
 update_multiplier_value:
-	stp	x29, x30, [sp, -80]!
-	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	uxth	w20, w0
+	and	w8, w0, 65535
 	adrp	x0, .LANCHOR2
 	add	x1, x0, :lo12:.LANCHOR2
-	str	x25, [sp,64]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	mov	x22, 0
-	mov	x21, x0
-	ldrh	w24, [x1,2276]
-	mov	w19, w22
-	ldrh	w25, [x1,2344]
-	mov	x23, x1
-.L2252:
-	cmp	w24, w22, uxth
-	bls	.L2259
-	add	x0, x23, 2304
-	mov	w1, w20
-	ldrb	w0, [x0,x22]
+	mov	x9, 0
+	mov	w6, 0
+	mov	x5, x0
+	add	x7, x1, 2304
+	ldrh	w10, [x1, 2276]
+	ldrh	w11, [x1, 2344]
+	cmp	w10, w9, uxth
+	bhi	.L2233
+	cbz	w6, .L2231
+	mov	w0, 32768
+	sdiv	w6, w0, w6
+.L2232:
+	add	x0, x5, :lo12:.LANCHOR2
+	mov	w1, 6
+	ldr	x0, [x0, 2808]
+	umaddl	x8, w8, w1, x0
+	mov	w0, 0
+	strh	w6, [x8, 4]
+	ret
+.L2226:
+	mov	w6, 0
+	b	.L2225
+.L2231:
+	mov	w6, 0
+	b	.L2232
+.L2233:
+	stp	x29, x30, [sp, -16]!
+	add	x29, sp, 0
+.L2224:
+	ldrb	w0, [x7, x9]
+	mov	w1, w8
 	bl	V2P_block
 	bl	FtlBbmIsBadBlock
-	cbnz	w0, .L2253
-	add	w19, w19, w25
-	uxth	w19, w19
-.L2253:
-	add	x22, x22, 1
-	b	.L2252
-.L2259:
-	cbz	w19, .L2255
+	cbnz	w0, .L2223
+	add	w6, w6, w11
+	and	w6, w6, 65535
+.L2223:
+	add	x9, x9, 1
+	cmp	w10, w9, uxth
+	bhi	.L2224
+	cbz	w6, .L2226
 	mov	w0, 32768
-	sdiv	w19, w0, w19
-.L2255:
-	add	x0, x21, :lo12:.LANCHOR2
+	sdiv	w6, w0, w6
+.L2225:
+	add	x0, x5, :lo12:.LANCHOR2
 	mov	w1, 6
-	umull	x20, w20, w1
-	ldr	x0, [x0,2808]
-	add	x20, x0, x20
+	ldr	x0, [x0, 2808]
+	umaddl	x8, w8, w1, x0
 	mov	w0, 0
-	strh	w19, [x20,4]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldr	x25, [sp,64]
-	ldp	x29, x30, [sp], 80
+	strh	w6, [x8, 4]
+	ldp	x29, x30, [sp], 16
 	ret
 	.size	update_multiplier_value, .-update_multiplier_value
 	.align	2
@@ -14565,20 +14280,22 @@ update_multiplier_value:
 	.type	GetFreeBlockMinEraseCount, %function
 GetFreeBlockMinEraseCount:
 	adrp	x0, .LANCHOR4+768
-	ldr	x1, [x0,#:lo12:.LANCHOR4+768]
-	mov	w0, w1
-	cbz	x1, .L2261
-	adrp	x0, .LANCHOR2
-	add	x0, x0, :lo12:.LANCHOR2
-	ldr	x2, [x0,2808]
-	ldr	x0, [x0,2696]
-	sub	x1, x1, x2
+	ldr	x0, [x0, #:lo12:.LANCHOR4+768]
+	cbz	x0, .L2236
+	adrp	x1, .LANCHOR2
+	add	x1, x1, :lo12:.LANCHOR2
+	ldr	x2, [x1, 2808]
+	ldr	x1, [x1, 2696]
+	sub	x0, x0, x2
 	mov	x2, -6148914691236517206
-	asr	x1, x1, 1
-	madd	x1, x2, x1, x1
-	and	x1, x1, 65535
-	ldrh	w0, [x0,x1,lsl 1]
-.L2261:
+	asr	x0, x0, 1
+	movk	x2, 0xaaab, lsl 0
+	mul	x0, x0, x2
+	and	x0, x0, 65535
+	ldrh	w0, [x1, x0, lsl 1]
+	ret
+.L2236:
+	mov	w0, 0
 	ret
 	.size	GetFreeBlockMinEraseCount, .-GetFreeBlockMinEraseCount
 	.align	2
@@ -14586,47 +14303,48 @@ GetFreeBlockMinEraseCount:
 	.type	GetFreeBlockMaxEraseCount, %function
 GetFreeBlockMaxEraseCount:
 	adrp	x2, .LANCHOR4
-	uxth	w4, w0
 	add	x2, x2, :lo12:.LANCHOR4
-	ldr	x1, [x2,768]
-	mov	w0, w1
-	cbz	x1, .L2264
-	ldrh	w2, [x2,776]
-	mov	w0, 7
-	mov	x3, -6148914691236517206
+	and	w0, w0, 65535
+	ldr	x1, [x2, 768]
+	cbz	x1, .L2244
+	ldrh	w2, [x2, 776]
+	mov	w3, 7
 	mov	w6, 6
 	mov	w7, 65535
-	mul	w2, w2, w0
+	mul	w2, w2, w3
 	asr	w2, w2, 3
-	cmp	w4, w2
-	csel	w4, w2, w4, gt
+	cmp	w0, w2
+	csel	w0, w2, w0, gt
 	adrp	x2, .LANCHOR2
-	add	x0, x2, :lo12:.LANCHOR2
-	ldr	x0, [x0,2808]
-	sub	x1, x1, x0
+	add	x3, x2, :lo12:.LANCHOR2
+	ldr	x4, [x3, 2808]
+	mov	x3, -6148914691236517206
+	movk	x3, 0xaaab, lsl 0
+	sub	x1, x1, x4
 	asr	x1, x1, 1
-	madd	x1, x3, x1, x1
+	mul	x1, x1, x3
 	mov	w3, 0
-	uxth	w1, w1
-.L2266:
-	cmp	w3, w4
-	beq	.L2269
+	and	w1, w1, 65535
+.L2240:
+	cmp	w0, w3
+	beq	.L2243
 	umull	x5, w1, w6
-	ldrh	w5, [x0,x5]
+	ldrh	w5, [x4, x5]
 	cmp	w5, w7
-	bne	.L2267
-.L2269:
+	bne	.L2241
+.L2243:
 	add	x2, x2, :lo12:.LANCHOR2
 	ubfiz	x1, x1, 1, 16
-	ldr	x0, [x2,2696]
-	ldrh	w0, [x0,x1]
-	b	.L2264
-.L2267:
+	ldr	x0, [x2, 2696]
+	ldrh	w0, [x0, x1]
+	ret
+.L2241:
 	add	w3, w3, 1
 	mov	w1, w5
-	uxth	w3, w3
-	b	.L2266
-.L2264:
+	and	w3, w3, 65535
+	b	.L2240
+.L2244:
+	mov	w0, 0
 	ret
 	.size	GetFreeBlockMaxEraseCount, .-GetFreeBlockMaxEraseCount
 	.align	2
@@ -14635,550 +14353,547 @@ GetFreeBlockMaxEraseCount:
 FtlPrintInfo2buf:
 	stp	x29, x30, [sp, -112]!
 	adrp	x1, .LC74
-	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	adrp	x24, .LANCHOR2
 	add	x1, x1, :lo12:.LC74
-	stp	x21, x22, [sp,32]
-	add	x22, x24, :lo12:.LANCHOR2
-	mov	x23, x0
-	stp	x19, x20, [sp,16]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
+	add	x29, sp, 0
+	stp	x23, x24, [sp, 48]
+	adrp	x23, .LANCHOR2
+	stp	x21, x22, [sp, 32]
+	add	x22, x23, :lo12:.LANCHOR2
+	stp	x19, x20, [sp, 16]
+	mov	x24, x0
+	stp	x25, x26, [sp, 64]
+	add	x20, x24, 12
+	stp	x27, x28, [sp, 80]
 	bl	strcpy
-	add	x20, x23, 12
-	ldr	w2, [x22,1192]
-	adrp	x1, .LC75
+	ldr	w2, [x22, 1192]
 	mov	x0, x20
+	adrp	x1, .LC75
 	add	x1, x1, :lo12:.LC75
 	bl	sprintf
 	add	x20, x20, w0, sxtw
-	adrp	x1, .LC76
-	ldr	w2, [x22,2360]
+	ldr	w2, [x22, 2360]
 	mov	x0, x20
+	adrp	x1, .LC76
 	add	x1, x1, :lo12:.LC76
 	bl	sprintf
 	add	x20, x20, w0, sxtw
 	adrp	x0, .LANCHOR1+3448
-	ldr	w0, [x0,#:lo12:.LANCHOR1+3448]
+	ldr	w0, [x0, #:lo12:.LANCHOR1+3448]
 	cmp	w0, 1
-	beq	.L2272
-	sub	w0, w20, w23
-	b	.L2273
-.L2272:
-	add	x0, x29, 96
-	add	x1, x29, 100
-	add	x2, x29, 104
+	beq	.L2246
+	sub	w0, w20, w24
+.L2245:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L2246:
 	add	x3, x29, 108
-	adrp	x26, .LANCHOR4
+	add	x2, x29, 104
+	add	x1, x29, 100
+	add	x0, x29, 96
 	bl	NandcGetTimeCfg
-	add	x25, x26, :lo12:.LANCHOR4
-	ldr	w4, [x29,104]
+	adrp	x26, .LANCHOR4
+	ldp	w4, w5, [x29, 104]
 	adrp	x1, .LC77
-	ldr	w5, [x29,108]
-	mov	x0, x20
-	ldr	w3, [x29,100]
+	ldp	w2, w3, [x29, 96]
 	add	x1, x1, :lo12:.LC77
-	ldr	w2, [x29,96]
+	mov	x0, x20
+	add	x25, x26, :lo12:.LANCHOR4
 	bl	sprintf
 	add	x21, x20, w0, sxtw
-	adrp	x1, .LC78
 	mov	x0, x21
+	adrp	x1, .LC78
 	add	x1, x1, :lo12:.LC78
-	add	x21, x21, 10
-	adrp	x20, .LANCHOR5
 	bl	strcpy
-	add	x20, x20, :lo12:.LANCHOR5
-	ldr	w2, [x22,2924]
-	adrp	x1, .LC79
+	ldr	w2, [x22, 2924]
+	add	x21, x21, 10
 	mov	x0, x21
+	adrp	x1, .LC79
 	add	x1, x1, :lo12:.LC79
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x25,1068]
-	adrp	x1, .LC80
+	ldr	w2, [x25, 1068]
 	mov	x0, x21
+	adrp	x1, .LC80
 	add	x1, x1, :lo12:.LC80
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x22,2424]
-	adrp	x1, .LC81
+	ldr	w2, [x22, 2424]
 	mov	x0, x21
+	adrp	x1, .LC81
 	add	x1, x1, :lo12:.LC81
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x22,2412]
-	adrp	x1, .LC82
+	ldr	w2, [x22, 2412]
 	mov	x0, x21
+	adrp	x1, .LC82
 	add	x1, x1, :lo12:.LC82
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x22,2408]
-	adrp	x1, .LC83
+	ldr	w2, [x22, 2408]
 	mov	x0, x21
+	adrp	x1, .LC83
 	add	x1, x1, :lo12:.LC83
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x22,2416]
-	adrp	x1, .LC84
+	ldr	w2, [x22, 2416]
 	mov	x0, x21
+	adrp	x1, .LC84
 	add	x1, x1, :lo12:.LC84
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x22,2420]
-	adrp	x1, .LC85
+	ldr	w2, [x22, 2420]
 	mov	x0, x21
+	adrp	x1, .LC85
 	add	x1, x1, :lo12:.LC85
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x22,2404]
-	adrp	x1, .LC86
+	ldr	w2, [x22, 2404]
 	mov	x0, x21
+	adrp	x1, .LC86
 	add	x1, x1, :lo12:.LC86
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x20,1152]
-	adrp	x1, .LC87
+	ldr	w2, [x25, 1664]
 	mov	x0, x21
+	adrp	x1, .LC87
 	add	x1, x1, :lo12:.LC87
 	lsr	w2, w2, 11
 	bl	sprintf
+	ldr	w2, [x25, 1668]
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x20,1156]
-	adrp	x1, .LC88
 	mov	x0, x21
+	adrp	x1, .LC88
 	add	x1, x1, :lo12:.LC88
 	lsr	w2, w2, 11
 	bl	sprintf
+	ldr	w2, [x22, 2396]
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x22,2396]
-	adrp	x1, .LC89
 	mov	x0, x21
+	adrp	x1, .LC89
 	add	x1, x1, :lo12:.LC89
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x22,2400]
+	ldr	w2, [x22, 2400]
 	adrp	x1, .LC90
 	add	x1, x1, :lo12:.LC90
 	mov	x0, x21
 	bl	sprintf
 	add	x21, x21, w0, sxtw
 	bl	FtlBbtCalcTotleCnt
-	uxth	w3, w0
-	ldrh	w2, [x22,2830]
-	adrp	x1, .LC91
+	and	w3, w0, 65535
+	ldrh	w2, [x22, 2830]
 	mov	x0, x21
+	adrp	x1, .LC91
 	add	x1, x1, :lo12:.LC91
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x25,776]
-	adrp	x1, .LC92
+	ldrh	w2, [x25, 776]
 	mov	x0, x21
+	adrp	x1, .LC92
 	add	x1, x1, :lo12:.LC92
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x22,2428]
-	adrp	x1, .LC93
+	ldr	w2, [x22, 2428]
 	mov	x0, x21
+	adrp	x1, .LC93
 	add	x1, x1, :lo12:.LC93
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x22,2432]
-	adrp	x1, .LC94
+	ldr	w2, [x22, 2432]
 	mov	x0, x21
+	adrp	x1, .LC94
 	add	x1, x1, :lo12:.LC94
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x20,1164]
-	adrp	x1, .LC95
+	ldr	w2, [x25, 1676]
 	mov	x0, x21
+	adrp	x1, .LC95
 	add	x1, x1, :lo12:.LC95
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x22,2436]
-	adrp	x1, .LC96
+	ldr	w2, [x22, 2436]
 	mov	x0, x21
+	adrp	x1, .LC96
 	add	x1, x1, :lo12:.LC96
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x22,2440]
-	adrp	x1, .LC97
+	ldr	w2, [x22, 2440]
 	mov	x0, x21
+	adrp	x1, .LC97
 	add	x1, x1, :lo12:.LC97
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x22,2444]
-	adrp	x1, .LC98
+	ldr	w2, [x22, 2444]
 	mov	x0, x21
+	adrp	x1, .LC98
 	add	x1, x1, :lo12:.LC98
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x25,726]
-	adrp	x1, .LC99
+	ldrh	w2, [x25, 726]
 	mov	x0, x21
+	adrp	x1, .LC99
 	add	x1, x1, :lo12:.LC99
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x25,724]
-	adrp	x1, .LC100
+	ldrh	w2, [x25, 724]
 	mov	x0, x21
+	adrp	x1, .LC100
 	add	x1, x1, :lo12:.LC100
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x22,1224]
-	adrp	x1, .LC101
+	ldr	w2, [x22, 1224]
 	mov	x0, x21
+	adrp	x1, .LC101
 	add	x1, x1, :lo12:.LC101
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x22,2376]
-	adrp	x1, .LC102
+	ldr	w2, [x22, 2376]
 	mov	x0, x21
+	adrp	x1, .LC102
 	add	x1, x1, :lo12:.LC102
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x22,2272]
-	adrp	x1, .LC103
+	ldr	w2, [x22, 2272]
 	mov	x0, x21
+	adrp	x1, .LC103
 	add	x1, x1, :lo12:.LC103
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x22,2998]
-	adrp	x1, .LC104
+	ldrh	w2, [x22, 2998]
 	mov	x0, x21
+	adrp	x1, .LC104
 	add	x1, x1, :lo12:.LC104
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x22,2284]
-	adrp	x1, .LC105
+	ldrh	w2, [x22, 2284]
 	mov	x0, x21
+	adrp	x1, .LC105
 	add	x1, x1, :lo12:.LC105
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x20,588]
-	adrp	x1, .LC106
+	ldrh	w2, [x25, 1096]
 	mov	x0, x21
+	adrp	x1, .LC106
 	add	x1, x1, :lo12:.LC106
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w2, [x22,2288]
-	adrp	x1, .LC107
+	ldr	w2, [x22, 2288]
 	mov	x0, x21
+	adrp	x1, .LC107
 	add	x1, x1, :lo12:.LC107
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x25,1072]
-	adrp	x1, .LC108
+	ldrh	w2, [x25, 1072]
 	mov	x0, x21
+	adrp	x1, .LC108
 	add	x1, x1, :lo12:.LC108
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x22,2824]
-	adrp	x1, .LC109
+	ldrh	w2, [x22, 2824]
 	mov	x0, x21
+	adrp	x1, .LC109
 	add	x1, x1, :lo12:.LC109
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x25,786]
-	adrp	x1, .LC110
+	ldrh	w2, [x25, 786]
 	mov	x0, x21
+	adrp	x1, .LC110
 	add	x1, x1, :lo12:.LC110
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrb	w2, [x25,790]
-	adrp	x1, .LC111
+	ldrb	w2, [x25, 790]
 	mov	x0, x21
+	adrp	x1, .LC111
 	add	x1, x1, :lo12:.LC111
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x25,784]
-	adrp	x1, .LC112
+	ldrh	w2, [x25, 784]
 	mov	x0, x21
+	adrp	x1, .LC112
 	add	x1, x1, :lo12:.LC112
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrb	w2, [x25,792]
-	adrp	x1, .LC113
+	ldrb	w2, [x25, 792]
 	mov	x0, x21
+	adrp	x1, .LC113
 	add	x1, x1, :lo12:.LC113
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x25,788]
-	adrp	x1, .LC114
+	ldrh	w2, [x25, 788]
 	mov	x0, x21
+	adrp	x1, .LC114
 	add	x1, x1, :lo12:.LC114
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w3, [x25,784]
-	adrp	x1, .LC115
-	ldr	x2, [x22,2712]
+	ldrh	w1, [x25, 784]
+	ldr	x0, [x22, 2712]
+	ldrh	w2, [x0, x1, lsl 1]
 	mov	x0, x21
+	adrp	x1, .LC115
 	add	x1, x1, :lo12:.LC115
-	ldrh	w2, [x2,x3,lsl 1]
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x25,834]
-	adrp	x1, .LC116
+	ldrh	w2, [x25, 834]
 	mov	x0, x21
+	adrp	x1, .LC116
 	add	x1, x1, :lo12:.LC116
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrb	w2, [x25,838]
-	adrp	x1, .LC117
+	ldrb	w2, [x25, 838]
 	mov	x0, x21
+	adrp	x1, .LC117
 	add	x1, x1, :lo12:.LC117
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x25,832]
-	adrp	x1, .LC118
+	ldrh	w2, [x25, 832]
 	mov	x0, x21
+	adrp	x1, .LC118
 	add	x1, x1, :lo12:.LC118
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrb	w2, [x25,840]
-	adrp	x1, .LC119
+	ldrb	w2, [x25, 840]
 	mov	x0, x21
+	adrp	x1, .LC119
 	add	x1, x1, :lo12:.LC119
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x25,836]
-	adrp	x1, .LC120
+	ldrh	w2, [x25, 836]
 	mov	x0, x21
+	adrp	x1, .LC120
 	add	x1, x1, :lo12:.LC120
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w3, [x25,832]
-	adrp	x1, .LC121
-	ldr	x2, [x22,2712]
+	ldrh	w1, [x25, 832]
+	ldr	x0, [x22, 2712]
+	ldrh	w2, [x0, x1, lsl 1]
 	mov	x0, x21
+	adrp	x1, .LC121
 	add	x1, x1, :lo12:.LC121
-	ldrh	w2, [x2,x3,lsl 1]
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x25,882]
-	adrp	x1, .LC122
+	ldrh	w2, [x25, 882]
 	mov	x0, x21
+	adrp	x1, .LC122
 	add	x1, x1, :lo12:.LC122
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrb	w2, [x25,886]
-	adrp	x1, .LC123
+	ldrb	w2, [x25, 886]
 	mov	x0, x21
+	adrp	x1, .LC123
 	add	x1, x1, :lo12:.LC123
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x25,880]
-	adrp	x1, .LC124
+	ldrh	w2, [x25, 880]
 	mov	x0, x21
+	adrp	x1, .LC124
 	add	x1, x1, :lo12:.LC124
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrb	w2, [x25,888]
-	adrp	x1, .LC125
+	ldrb	w2, [x25, 888]
 	mov	x0, x21
+	adrp	x1, .LC125
 	add	x1, x1, :lo12:.LC125
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x25,884]
-	adrp	x1, .LC126
+	ldrh	w2, [x25, 884]
 	mov	x0, x21
+	adrp	x1, .LC126
 	add	x1, x1, :lo12:.LC126
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x20,594]
-	adrp	x1, .LC127
+	ldrh	w2, [x25, 1106]
 	mov	x0, x21
+	adrp	x1, .LC127
 	add	x1, x1, :lo12:.LC127
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrb	w2, [x20,598]
-	adrp	x1, .LC128
+	ldrb	w2, [x25, 1110]
 	mov	x0, x21
+	adrp	x1, .LC128
 	add	x1, x1, :lo12:.LC128
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x20,592]
-	adrp	x1, .LC129
+	ldrh	w2, [x25, 1104]
 	mov	x0, x21
+	adrp	x1, .LC129
 	add	x1, x1, :lo12:.LC129
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrb	w2, [x20,600]
-	adrp	x1, .LC130
+	ldrb	w2, [x25, 1112]
 	mov	x0, x21
+	adrp	x1, .LC130
 	add	x1, x1, :lo12:.LC130
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldrh	w2, [x20,596]
-	adrp	x1, .LC131
+	ldrh	w2, [x25, 1108]
 	mov	x0, x21
+	adrp	x1, .LC131
 	add	x1, x1, :lo12:.LC131
 	bl	sprintf
 	add	x21, x21, w0, sxtw
-	ldr	w3, [x22,2392]
+	ldr	w5, [x25, 1228]
 	adrp	x1, .LC132
-	ldr	w2, [x22,2096]
+	ldr	w3, [x25, 1232]
 	add	x1, x1, :lo12:.LC132
-	ldr	w4, [x20,724]
+	ldr	w4, [x25, 1236]
+	ldr	w0, [x22, 2096]
+	ldr	w2, [x22, 2392]
+	orr	w2, w0, w2, lsl 8
 	mov	x0, x21
-	ldr	w5, [x20,716]
-	orr	w2, w2, w3, lsl 8
-	ldr	w3, [x20,720]
 	bl	sprintf
 	add	x19, x21, w0, sxtw
-	ldr	w2, [x20,712]
-	adrp	x1, .LC133
+	ldr	w2, [x25, 1224]
 	mov	x0, x19
+	adrp	x1, .LC133
 	add	x1, x1, :lo12:.LC133
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	w2, [x20,736]
-	adrp	x1, .LC134
+	ldr	w2, [x25, 1248]
 	mov	x0, x19
+	adrp	x1, .LC134
 	add	x1, x1, :lo12:.LC134
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldrh	w2, [x22,2480]
-	adrp	x1, .LC135
+	ldrh	w2, [x22, 2480]
 	mov	x0, x19
+	adrp	x1, .LC135
 	add	x1, x1, :lo12:.LC135
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldrh	w2, [x22,2482]
-	adrp	x1, .LC136
+	ldrh	w2, [x22, 2482]
 	mov	x0, x19
+	adrp	x1, .LC136
 	add	x1, x1, :lo12:.LC136
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	w2, [x22,2464]
-	adrp	x1, .LC137
+	ldr	w2, [x22, 2464]
 	mov	x0, x19
+	adrp	x1, .LC137
 	add	x1, x1, :lo12:.LC137
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldrh	w2, [x22,2484]
+	ldrh	w2, [x22, 2484]
 	adrp	x1, .LC138
 	add	x1, x1, :lo12:.LC138
 	mov	x0, x19
 	bl	sprintf
 	add	x19, x19, w0, sxtw
 	bl	GetFreeBlockMinEraseCount
-	uxth	w2, w0
+	and	w2, w0, 65535
 	adrp	x1, .LC139
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC139
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldrh	w0, [x25,776]
+	ldrh	w0, [x25, 776]
 	bl	GetFreeBlockMaxEraseCount
-	uxth	w2, w0
+	and	w2, w0, 65535
 	adrp	x1, .LC140
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC140
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldrh	w0, [x20,592]
+	ldrh	w0, [x25, 1104]
 	mov	w1, 65535
 	cmp	w0, w1
-	beq	.L2274
-	ubfiz	x2, x0, 1, 16
-	ldr	x3, [x22,2712]
-	adrp	x1, .LC141
+	beq	.L2248
+	ldr	x1, [x22, 2712]
+	ubfiz	x0, x0, 1, 16
+	ldrh	w2, [x1, x0]
 	mov	x0, x19
+	adrp	x1, .LC141
 	add	x1, x1, :lo12:.LC141
-	ldrh	w2, [x3,x2]
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-.L2274:
+.L2248:
 	mov	w0, 0
 	adrp	x22, .LC142
+	bl	List_get_gc_head_node
+	add	x21, x23, :lo12:.LANCHOR2
+	and	w3, w0, 65535
+	add	x22, x22, :lo12:.LC142
 	mov	w20, 0
 	mov	w28, 65535
-	bl	List_get_gc_head_node
 	mov	w27, 6
-	uxth	w3, w0
-	add	x22, x22, :lo12:.LC142
-.L2276:
+.L2250:
 	cmp	w3, w28
-	beq	.L2275
-	add	x21, x24, :lo12:.LANCHOR2
-	ubfiz	x6, x3, 1, 16
+	beq	.L2249
 	umull	x25, w3, w27
+	ldr	x0, [x21, 2808]
+	ldr	x4, [x21, 2696]
+	ubfiz	x1, x3, 1, 16
+	ldr	x2, [x21, 2712]
+	add	x0, x0, x25
+	ldrh	w6, [x4, x1]
+	ldrh	w5, [x0, 4]
 	mov	x0, x19
+	ldrh	w4, [x2, x1]
 	mov	w2, w20
-	ldr	x5, [x21,2808]
 	mov	x1, x22
-	ldr	x4, [x21,2712]
 	add	w20, w20, 1
-	ldr	x7, [x21,2696]
-	add	x5, x5, x25
-	ldrh	w4, [x4,x6]
-	ldrh	w5, [x5,4]
-	ldrh	w6, [x7,x6]
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x0, [x21,2808]
+	ldr	x0, [x21, 2808]
 	cmp	w20, 16
-	ldrh	w3, [x0,x25]
-	bne	.L2276
-.L2275:
+	ldrh	w3, [x0, x25]
+	bne	.L2250
+.L2249:
 	add	x26, x26, :lo12:.LANCHOR4
-	add	x1, x24, :lo12:.LANCHOR2
-	adrp	x22, .LC143
+	add	x23, x23, :lo12:.LANCHOR2
+	adrp	x21, .LC143
+	add	x21, x21, :lo12:.LC143
 	mov	w20, 0
-	mov	w27, 65535
-	add	x22, x22, :lo12:.LC143
-	ldr	x0, [x26,768]
+	mov	w25, 65535
+	ldr	x0, [x23, 2808]
+	ldr	x3, [x26, 768]
 	mov	w26, 6
-	ldr	x3, [x1,2808]
-	sub	x3, x0, x3
+	sub	x3, x3, x0
 	mov	x0, -6148914691236517206
 	asr	x3, x3, 1
-	madd	x3, x0, x3, x3
-	uxth	w3, w3
-.L2278:
-	cmp	w3, w27
-	beq	.L2277
-	add	x21, x24, :lo12:.LANCHOR2
-	ubfiz	x5, x3, 1, 16
-	umull	x25, w3, w26
-	mov	x0, x19
+	movk	x0, 0xaaab, lsl 0
+	mul	x3, x3, x0
+	and	w3, w3, 65535
+.L2252:
+	cmp	w3, w25
+	beq	.L2251
+	umull	x22, w3, w26
+	ldr	x0, [x23, 2808]
+	ldr	x2, [x23, 2696]
+	ubfiz	x1, x3, 1, 16
+	add	x0, x0, x22
+	ldrh	w5, [x2, x1]
 	mov	w2, w20
-	ldr	x4, [x21,2808]
-	mov	x1, x22
-	ldr	x6, [x21,2696]
+	ldrh	w4, [x0, 4]
+	mov	x1, x21
+	mov	x0, x19
 	add	w20, w20, 1
-	add	x4, x4, x25
-	ldrh	w5, [x6,x5]
-	ldrh	w4, [x4,4]
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x0, [x21,2808]
 	cmp	w20, 4
-	ldrh	w3, [x0,x25]
-	bne	.L2278
-.L2277:
-	sub	w0, w19, w23
-.L2273:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 112
-	ret
+	beq	.L2251
+	ldr	x0, [x23, 2808]
+	ldrh	w3, [x0, x22]
+	b	.L2252
+.L2251:
+	sub	w0, w19, w24
+	b	.L2245
 	.size	FtlPrintInfo2buf, .-FtlPrintInfo2buf
 	.align	2
 	.global	ftl_proc_ftl_read
 	.type	ftl_proc_ftl_read, %function
 ftl_proc_ftl_read:
 	stp	x29, x30, [sp, -32]!
-	adrp	x1, .LC47
 	adrp	x2, .LC144
-	add	x29, sp, 0
-	add	x1, x1, :lo12:.LC47
+	adrp	x1, .LC48
 	add	x2, x2, :lo12:.LC144
-	stp	x19, x20, [sp,16]
+	add	x29, sp, 0
+	add	x1, x1, :lo12:.LC48
+	stp	x19, x20, [sp, 16]
 	mov	x20, x0
 	bl	sprintf
 	add	x19, x20, w0, sxtw
@@ -15186,7 +14901,7 @@ ftl_proc_ftl_read:
 	bl	FtlPrintInfo2buf
 	add	x0, x19, w0, sxtw
 	sub	w0, w0, w20
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	ftl_proc_ftl_read, .-ftl_proc_ftl_read
@@ -15194,210 +14909,200 @@ ftl_proc_ftl_read:
 	.global	GetSwlReplaceBlock
 	.type	GetSwlReplaceBlock, %function
 GetSwlReplaceBlock:
-	stp	x29, x30, [sp, -96]!
-	adrp	x0, .LANCHOR5
-	add	x1, x0, :lo12:.LANCHOR5
+	stp	x29, x30, [sp, -32]!
+	adrp	x9, .LANCHOR4
+	add	x0, x9, :lo12:.LANCHOR4
+	adrp	x8, .LANCHOR2
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	adrp	x19, .LANCHOR2
-	ldr	w3, [x1,1164]
-	add	x1, x19, :lo12:.LANCHOR2
-	ldr	w2, [x1,2444]
-	cmp	w3, w2
-	bcs	.L2283
-	str	wzr, [x1,2428]
-	ldrh	w3, [x1,2284]
-	ldr	x5, [x1,2696]
+	stp	x19, x20, [sp, 16]
+	ldr	w2, [x0, 1676]
+	add	x0, x8, :lo12:.LANCHOR2
+	ldr	w1, [x0, 2444]
+	cmp	w2, w1
+	bcs	.L2261
+	ldrh	w2, [x0, 2284]
 	mov	x1, 0
-.L2284:
-	cmp	w3, w1
-	bls	.L2316
-	add	x4, x19, :lo12:.LANCHOR2
-	ldrh	w6, [x5,x1,lsl 1]
+	ldr	x4, [x0, 2696]
+	str	wzr, [x0, 2428]
+.L2262:
+	cmp	w2, w1
+	bhi	.L2263
+	add	x1, x8, :lo12:.LANCHOR2
+	add	x3, x9, :lo12:.LANCHOR4
+	ldr	w0, [x1, 2428]
+	udiv	w2, w0, w2
+	str	w2, [x3, 1676]
+	ldr	w2, [x1, 2432]
+	sub	w0, w0, w2
+	ldrh	w2, [x1, 2336]
+	udiv	w0, w0, w2
+	str	w0, [x1, 2428]
+.L2264:
+	add	x0, x8, :lo12:.LANCHOR2
+	add	x1, x9, :lo12:.LANCHOR4
+	ldr	w10, [x0, 2444]
+	ldr	w11, [x1, 1676]
+	add	w1, w10, 256
+	cmp	w1, w11
+	bls	.L2269
+	ldr	w2, [x0, 2440]
+	add	w1, w10, 768
+	cmp	w1, w2
+	bls	.L2269
+	ldr	w0, [x0, 2096]
+	cbnz	w0, .L2270
+.L2272:
+	mov	w20, 65535
+.L2271:
+	mov	w0, w20
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
+	ret
+.L2263:
+	ldrh	w3, [x4, x1, lsl 1]
 	add	x1, x1, 1
-	ldr	w2, [x4,2428]
-	add	w2, w6, w2
-	str	w2, [x4,2428]
-	b	.L2284
-.L2316:
-	add	x2, x19, :lo12:.LANCHOR2
-	add	x4, x0, :lo12:.LANCHOR5
-	ldr	w1, [x2,2428]
-	udiv	w3, w1, w3
-	str	w3, [x4,1164]
-	ldr	w3, [x2,2432]
-	sub	w1, w1, w3
-	ldrh	w3, [x2,2336]
-	udiv	w1, w1, w3
-	str	w1, [x2,2428]
-	b	.L2286
-.L2283:
-	ldr	w2, [x1,2440]
-	cmp	w3, w2
-	bls	.L2286
-	add	w2, w2, 1
-	str	w2, [x1,2440]
+	ldr	w5, [x0, 2428]
+	add	w3, w3, w5
+	str	w3, [x0, 2428]
+	b	.L2262
+.L2261:
+	ldr	w1, [x0, 2440]
+	cmp	w2, w1
+	bls	.L2264
+	add	w1, w1, 1
+	str	w1, [x0, 2440]
 	mov	w1, 0
-.L2288:
-	add	x2, x19, :lo12:.LANCHOR2
-	ldrh	w3, [x2,2284]
-	cmp	w1, w3
-	bcs	.L2286
+.L2266:
+	ldrh	w2, [x0, 2284]
+	cmp	w1, w2
+	bcs	.L2264
+	ldr	x4, [x0, 2696]
 	ubfiz	x3, x1, 1, 32
-	ldr	x4, [x2,2696]
 	add	w1, w1, 1
-	ldrh	w2, [x4,x3]
+	ldrh	w2, [x4, x3]
 	add	w2, w2, 1
-	strh	w2, [x4,x3]
-	b	.L2288
-.L2286:
-	add	x1, x19, :lo12:.LANCHOR2
-	add	x0, x0, :lo12:.LANCHOR5
-	ldr	w21, [x1,2444]
-	ldr	w23, [x0,1164]
-	add	w0, w21, 256
-	cmp	w0, w23
-	bls	.L2291
-	ldr	w2, [x1,2440]
-	add	w0, w21, 768
-	cmp	w0, w2
-	bls	.L2291
-	ldr	w0, [x1,2096]
-	cbz	w0, .L2294
-	cmp	w21, 40
-	bls	.L2291
-.L2294:
-	mov	w0, 65535
-	b	.L2293
-.L2291:
-	adrp	x20, .LANCHOR4
-	add	x0, x20, :lo12:.LANCHOR4
-	ldrh	w0, [x0,776]
+	strh	w2, [x4, x3]
+	b	.L2266
+.L2270:
+	cmp	w10, 40
+	bhi	.L2272
+.L2269:
+	add	x0, x9, :lo12:.LANCHOR4
+	ldrh	w0, [x0, 776]
 	add	w0, w0, w0, lsl 1
 	lsr	w0, w0, 2
 	bl	GetFreeBlockMaxEraseCount
-	uxth	w6, w0
-	add	w0, w21, 64
+	and	w6, w0, 65535
+	add	w0, w10, 64
 	cmp	w6, w0
-	bcs	.L2303
-	cmp	w21, 40
-	bhi	.L2294
-.L2303:
-	add	x20, x20, :lo12:.LANCHOR4
-	ldr	x3, [x20,744]
-	cbz	x3, .L2294
-	add	x0, x19, :lo12:.LANCHOR2
-	mov	w26, 65535
+	bcs	.L2273
+	cmp	w10, 40
+	bhi	.L2272
+.L2273:
+	add	x9, x9, :lo12:.LANCHOR4
+	ldr	x0, [x9, 744]
+	cbz	x0, .L2272
+	add	x1, x8, :lo12:.LANCHOR2
+	mov	w4, 65535
+	mov	x13, -6148914691236517206
+	mov	w2, w4
+	mov	w9, w4
+	movk	x13, 0xaaab, lsl 0
+	ldrh	w12, [x1, 2284]
+	mov	w14, 6
+	ldr	x5, [x1, 2696]
+	ldr	x7, [x1, 2808]
 	mov	w1, 0
-	mov	w20, w26
-	mov	w8, w26
-	mov	w10, 6
-	ldrh	w9, [x0,2284]
-	ldr	x7, [x0,2808]
-	ldr	x25, [x0,2696]
-	mov	x0, -6148914691236517206
-	add	x0, x0, 1
-.L2296:
-	ldrh	w5, [x3]
-	cmp	w5, w8
-	beq	.L2298
-	add	w1, w1, 1
-	uxth	w1, w1
-	cmp	w1, w9
-	bhi	.L2294
-	ldrh	w2, [x3,4]
-	cbz	w2, .L2297
-	sub	x4, x3, x7
-	asr	x4, x4, 1
-	mul	x4, x4, x0
-	uxth	w3, w4
-	and	x4, x4, 65535
-	ldrh	w2, [x25,x4,lsl 1]
-	cmp	w2, w21
-	bls	.L2302
-	cmp	w2, w26
-	bcs	.L2297
-	mov	w26, w2
-	mov	w20, w3
-.L2297:
-	umull	x3, w5, w10
-	add	x3, x7, x3
-	b	.L2296
-.L2302:
-	mov	w20, w3
-.L2298:
+.L2274:
+	ldrh	w3, [x0]
+	cmp	w3, w9
+	bne	.L2277
+	mov	w20, w2
+.L2276:
 	mov	w0, 65535
 	cmp	w20, w0
-	beq	.L2294
-	ubfiz	x24, x20, 1, 16
-	ldrh	w22, [x25,x24]
-	cmp	w22, w21
-	bls	.L2300
-	str	x6, [x29,88]
+	beq	.L2272
+	ubfiz	x7, x20, 1, 32
+	ldrh	w3, [x5, x7]
+	cmp	w10, w3
+	bcs	.L2278
 	bl	GetFreeBlockMinEraseCount
-	ldr	x6, [x29,88]
-	cmp	w21, w0, uxth
-	bcs	.L2300
-	add	x0, x19, :lo12:.LANCHOR2
-	str	w26, [x0,2444]
-.L2300:
-	cmp	w22, w23
-	bcs	.L2294
-	add	w0, w22, 128
+	cmp	w10, w0, uxth
+	bcs	.L2278
+	add	x0, x8, :lo12:.LANCHOR2
+	str	w4, [x0, 2444]
+.L2278:
+	cmp	w11, w3
+	bls	.L2272
+	add	w0, w3, 128
 	cmp	w6, w0
-	ble	.L2294
-	add	w0, w22, 256
-	cmp	w0, w23
-	bcc	.L2301
-	add	x0, x19, :lo12:.LANCHOR2
-	add	w22, w22, 768
-	ldr	w0, [x0,2440]
-	cmp	w22, w0
-	bcs	.L2294
-.L2301:
-	add	x19, x19, :lo12:.LANCHOR2
+	ble	.L2272
+	add	w0, w3, 256
+	cmp	w11, w0
+	bhi	.L2279
+	add	x0, x8, :lo12:.LANCHOR2
+	add	w3, w3, 768
+	ldr	w0, [x0, 2440]
+	cmp	w3, w0
+	bcs	.L2272
+.L2279:
+	add	x19, x8, :lo12:.LANCHOR2
+	ldrh	w5, [x5, x7]
+	mov	w2, w11
+	mov	w1, w20
+	ldr	x0, [x19, 2712]
+	ldr	w3, [x19, 2440]
+	ldrh	w4, [x0, x7]
 	adrp	x0, .LC145
-	ldrh	w5, [x25,x24]
 	add	x0, x0, :lo12:.LC145
-	mov	w1, w20
-	mov	w2, w23
-	ldr	x4, [x19,2712]
-	ldr	w3, [x19,2440]
-	ldrh	w4, [x4,x24]
 	bl	printk
 	mov	w0, 1
-	str	w0, [x19,2452]
-	mov	w0, w20
-.L2293:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 96
-	ret
+	str	w0, [x19, 2452]
+	b	.L2271
+.L2277:
+	add	w1, w1, 1
+	and	w1, w1, 65535
+	cmp	w1, w12
+	bhi	.L2272
+	ldrh	w15, [x0, 4]
+	cbz	w15, .L2275
+	sub	x0, x0, x7
+	asr	x0, x0, 1
+	mul	x0, x0, x13
+	and	w20, w0, 65535
+	and	x0, x0, 65535
+	ldrh	w0, [x5, x0, lsl 1]
+	cmp	w10, w0
+	bcs	.L2276
+	cmp	w4, w0
+	bls	.L2275
+	mov	w4, w0
+	mov	w2, w20
+.L2275:
+	umaddl	x0, w3, w14, x7
+	b	.L2274
 	.size	GetSwlReplaceBlock, .-GetSwlReplaceBlock
 	.align	2
 	.global	free_data_superblock
 	.type	free_data_superblock, %function
 free_data_superblock:
-	stp	x29, x30, [sp, -16]!
-	uxth	w0, w0
+	and	w0, w0, 65535
 	mov	w1, 65535
 	cmp	w0, w1
-	add	x29, sp, 0
-	beq	.L2318
+	beq	.L2290
+	stp	x29, x30, [sp, -16]!
 	adrp	x2, .LANCHOR2+2712
 	ubfiz	x1, x0, 1, 16
-	ldr	x2, [x2,#:lo12:.LANCHOR2+2712]
-	strh	wzr, [x2,x1]
+	add	x29, sp, 0
+	ldr	x2, [x2, #:lo12:.LANCHOR2+2712]
+	strh	wzr, [x2, x1]
 	bl	INSERT_FREE_LIST
-.L2318:
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	ret
+.L2290:
+	mov	w0, 0
+	ret
 	.size	free_data_superblock, .-free_data_superblock
 	.align	2
 	.global	allocate_data_superblock
@@ -15405,290 +15110,270 @@ free_data_superblock:
 allocate_data_superblock:
 	stp	x29, x30, [sp, -128]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x19, .LANCHOR2
-	add	x1, x19, :lo12:.LANCHOR2
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	ldr	w1, [x1,2928]
-	cbnz	w1, .L2320
-	adrp	x21, .LANCHOR4
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
+	adrp	x21, .LANCHOR2
+	add	x19, x21, :lo12:.LANCHOR2
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldr	w1, [x19, 2928]
+	cbnz	w1, .L2294
+	adrp	x23, .LANCHOR4
+	add	x22, x23, :lo12:.LANCHOR4
 	mov	x20, x0
-	add	x21, x21, :lo12:.LANCHOR4
-	add	x23, x21, 880
-	mov	x22, x21
-	add	x24, x21, 768
-.L2321:
-	cmp	x20, x23
-	bne	.L2322
-	add	x2, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x21,776]
-	lsr	w3, w0, 1
-	ldr	w4, [x2,2452]
-	add	w5, w3, 1
-	mul	w1, w0, w4
-	add	w1, w5, w1, lsr 2
-	ldr	w5, [x2,2096]
-	uxth	w1, w1
-	cbz	w5, .L2323
-	ldr	w2, [x2,2444]
-	cmp	w2, 39
-	bhi	.L2323
-	cmp	w2, 2
-	mov	w1, 0
+	add	x24, x22, 768
+.L2295:
+	add	x0, x23, :lo12:.LANCHOR4
+	add	x1, x0, 880
+	cmp	x20, x1
+	bne	.L2296
+	ldrh	w2, [x0, 776]
+	ldr	w3, [x19, 2452]
+	lsr	w0, w2, 1
+	add	w4, w0, 1
+	mul	w1, w2, w3
+	add	w1, w4, w1, lsr 2
+	ldr	w4, [x19, 2096]
+	and	w1, w1, 65535
+	cbz	w4, .L2297
+	ldr	w4, [x19, 2444]
+	cmp	w4, 39
+	bhi	.L2297
+	cmp	w4, 2
 	bls	.L2324
-	tbz	x0, 0, .L2351
-	cbz	w4, .L2324
-.L2351:
-	mov	w1, w3
-	b	.L2323
-.L2322:
-	ldrb	w0, [x20,8]
-	mov	w1, 0
-	cmp	w0, 1
+	tbz	x2, 0, .L2320
+	cbz	w3, .L2324
+.L2320:
+	mov	w1, w0
+	b	.L2297
+.L2296:
+	ldrb	w1, [x20, 8]
+	cmp	w1, 1
 	bne	.L2324
-	add	x2, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x2,2296]
-	cmp	w0, 1
+	ldrh	w1, [x19, 2296]
+	cmp	w1, 1
 	beq	.L2324
-	ldrb	w0, [x2,1220]
-	cbnz	w0, .L2324
-	ldr	w3, [x2,2096]
-	ldrh	w0, [x21,776]
+	ldrb	w1, [x19, 1220]
+	cbnz	w1, .L2324
+	ldr	w2, [x19, 2096]
+	ldrh	w0, [x0, 776]
 	lsr	w1, w0, 3
-	cbz	w3, .L2323
-	ldr	w2, [x2,2444]
+	cbz	w2, .L2297
+	ldr	w2, [x19, 2444]
 	cmp	w2, 1
-	bhi	.L2323
+	bhi	.L2297
 	mov	w1, 7
 	mul	w1, w0, w1
 	lsr	w1, w1, 3
-.L2323:
-	cbz	w1, .L2324
+.L2297:
+	cbz	w1, .L2298
 	sub	w1, w1, #1
-	uxth	w1, w1
-.L2324:
-	ldrb	w2, [x20,8]
+	and	w1, w1, 65535
+.L2298:
+	ldrb	w2, [x20, 8]
 	mov	x0, x24
-	add	x26, x19, :lo12:.LANCHOR2
 	bl	List_pop_index_node
-	uxth	w27, w0
-	ldrh	w0, [x22,776]
+	and	w27, w0, 65535
+	ldrh	w0, [x22, 776]
 	sub	w0, w0, #1
-	strh	w0, [x22,776]
-	ldrh	w0, [x26,2284]
+	strh	w0, [x22, 776]
+	ldrh	w0, [x19, 2284]
 	cmp	w0, w27
-	bls	.L2321
-	ubfiz	x25, x27, 1, 16
-	ldr	x0, [x26,2712]
-	ldrh	w0, [x0,x25]
-	cbnz	w0, .L2321
+	bls	.L2295
+	ldr	x0, [x19, 2712]
+	ubfiz	x26, x27, 1, 16
+	ldrh	w25, [x0, x26]
+	cbnz	w25, .L2295
 	strh	w27, [x20]
 	mov	x0, x20
 	bl	make_superblock
-	ldrb	w0, [x20,7]
-	cbz	w0, .L2327
+	ldrb	w0, [x20, 7]
+	cbz	w0, .L2341
+	add	x28, x20, 16
+	ldrh	w5, [x19, 2276]
+	mov	x3, x28
 	mov	x0, 0
-	ldrh	w5, [x26,2276]
-	mov	x3, 56
-	mov	w26, w0
+	mov	x4, 56
 	mov	w6, 65535
-	b	.L2328
-.L2327:
-	ldr	x0, [x26,2712]
-	b	.L2376
-.L2330:
-	add	x1, x19, :lo12:.LANCHOR2
-	ldr	x4, [x1,2544]
-	madd	x1, x0, x3, x4
-	str	xzr, [x1,16]
-	str	xzr, [x1,8]
-	add	x1, x20, x0, lsl 1
-	ldrh	w1, [x1,16]
-	cmp	w1, w6
-	beq	.L2329
-	umull	x2, w26, w3
-	add	w26, w26, 1
-	lsl	w1, w1, 10
-	add	x2, x4, x2
-	uxth	w26, w26
-	str	w1, [x2,4]
-.L2329:
-	add	x0, x0, 1
-.L2328:
+.L2301:
 	cmp	w5, w0, uxth
-	bhi	.L2330
+	bhi	.L2303
+	ldr	w0, [x19, 2096]
+	cbz	w0, .L2304
 	add	x0, x22, 784
 	cmp	x20, x0
-	bne	.L2331
-	add	x1, x19, :lo12:.LANCHOR2
-	ldr	w2, [x1,2096]
-	cbz	w2, .L2331
-	ldr	x1, [x1,2696]
-	ldrh	w1, [x1,x25]
-	cmp	w1, 40
-	bls	.L2331
-	strb	wzr, [x22,792]
-.L2331:
-	ldrb	w0, [x20,8]
-	cbnz	w0, .L2332
-	add	x1, x19, :lo12:.LANCHOR2
-	ldr	x0, [x1,2696]
-	ldrh	w2, [x0,x25]
-	cbz	w2, .L2333
-	ldrh	w1, [x1,2336]
-	add	w1, w2, w1
-	b	.L2377
-.L2333:
-	mov	w1, 2
-.L2377:
-	strh	w1, [x0,x25]
-	add	x1, x19, :lo12:.LANCHOR2
-	ldr	w0, [x1,2428]
+	bne	.L2304
+	ldr	x0, [x19, 2696]
+	ldrh	w0, [x0, x26]
+	cmp	w0, 40
+	bls	.L2304
+	strb	wzr, [x20, 8]
+.L2304:
+	ldrb	w0, [x20, 8]
+	ldr	x1, [x19, 2696]
+	cbnz	w0, .L2305
+	ldrh	w0, [x1, x26]
+	cbz	w0, .L2306
+	ldrh	w2, [x19, 2336]
+	add	w0, w0, w2
+.L2342:
+	strh	w0, [x1, x26]
+	mov	w1, 0
+	ldr	w0, [x19, 2428]
 	add	w0, w0, 1
-	str	w0, [x1,2428]
+	str	w0, [x19, 2428]
 	mov	w0, w27
-	mov	w1, 0
 	bl	ftl_set_blk_mode
-	b	.L2335
-.L2332:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	x2, [x0,2696]
-	ldrh	w1, [x2,x25]
-	add	w1, w1, 1
-	strh	w1, [x2,x25]
-	ldr	w1, [x0,2432]
-	add	w1, w1, 1
-	str	w1, [x0,2432]
-	mov	w0, w27
-	bl	ftl_set_blk_mode.part.17
-.L2335:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	x1, [x0,2696]
-	ldr	w2, [x0,2440]
-	ldrh	w1, [x1,x25]
-	cmp	w1, w2
-	bls	.L2336
-	str	w1, [x0,2440]
-.L2336:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w2, [x0,2336]
-	ldr	w3, [x0,2428]
-	ldr	w1, [x0,2432]
-	madd	w1, w2, w3, w1
-	ldrh	w2, [x0,2284]
-	mov	x3, 56
-	udiv	w1, w1, w2
-	adrp	x2, .LANCHOR5+1164
-	str	w1, [x2,#:lo12:.LANCHOR5+1164]
-	ldr	x1, [x0,2688]
-	ldr	w0, [x1,16]
+.L2308:
+	ldr	x0, [x19, 2696]
+	ldr	w1, [x19, 2440]
+	ldrh	w0, [x0, x26]
+	cmp	w0, w1
+	bls	.L2309
+	str	w0, [x19, 2440]
+.L2309:
+	ldr	w2, [x19, 2428]
+	ldr	w1, [x19, 2432]
+	ldrh	w0, [x19, 2336]
+	madd	w0, w0, w2, w1
+	ldrh	w1, [x19, 2284]
+	mov	w2, 56
+	umull	x2, w25, w2
+	udiv	w0, w0, w1
+	ldr	x1, [x19, 2688]
+	str	w0, [x22, 1676]
+	ldr	w0, [x1, 16]
 	add	w0, w0, 1
-	str	w0, [x1,16]
+	str	w0, [x1, 16]
 	mov	x0, 0
-.L2337:
-	cmp	w26, w0, uxth
-	bls	.L2379
-	add	x1, x19, :lo12:.LANCHOR2
-	ldr	x1, [x1,2544]
-	madd	x1, x0, x3, x1
-	add	x0, x0, 1
-	ldr	w2, [x1,4]
-	and	w2, w2, -1024
-	str	w2, [x1,4]
-	b	.L2337
-.L2379:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrb	w1, [x0,1220]
-	cbz	w1, .L2339
-	ldrb	w1, [x20,8]
-	ldr	x0, [x0,2544]
-	cmp	w1, 1
-	bne	.L2340
+.L2310:
+	cmp	x2, x0
+	bne	.L2311
+	ldrb	w0, [x19, 1220]
+	cbz	w0, .L2312
+	ldrb	w0, [x20, 8]
+	mov	w2, w25
+	cmp	w0, 1
+	bne	.L2313
 	mov	w1, 0
-	b	.L2378
-.L2340:
-	mov	w1, 1
-.L2378:
-	mov	w2, w26
+.L2343:
+	ldr	x0, [x19, 2544]
 	bl	FlashEraseBlocks
-.L2339:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrb	w1, [x20,8]
-	mov	w2, w26
-	mov	x28, 0
-	ldr	x0, [x0,2544]
+.L2312:
+	ldrb	w1, [x20, 8]
+	mov	w2, w25
+	ldr	x0, [x19, 2544]
 	bl	FlashEraseBlocks
-	mov	w1, w28
-	mov	x3, 56
-.L2341:
-	cmp	w26, w28, uxth
-	bls	.L2380
-	add	x2, x19, :lo12:.LANCHOR2
-	mul	x0, x28, x3
-	ldr	x2, [x2,2544]
-	add	x4, x2, x0
-	ldr	w2, [x2,x0]
-	cmn	w2, #1
-	bne	.L2342
-	ldr	w0, [x4,4]
-	add	w1, w1, 1
-	str	x3, [x29,96]
-	lsr	w0, w0, 10
-	str	x2, [x29,104]
-	str	x1, [x29,112]
-	str	x1, [x29,120]
-	bl	FtlBbmMapBadBlock
-	add	x0, x20, x28, lsl 1
-	ldr	x2, [x29,104]
-	ldr	x3, [x29,96]
-	ldr	x1, [x29,120]
-	strh	w2, [x0,16]
-	ldrb	w0, [x20,7]
-	sub	w0, w0, #1
-	strb	w0, [x20,7]
-.L2342:
-	add	x28, x28, 1
-	b	.L2341
-.L2380:
-	cbz	w1, .L2344
+	mov	x1, 0
+	mov	w2, 0
+	mov	x4, 56
+.L2314:
+	cmp	w25, w1, uxth
+	bhi	.L2316
+	cmp	w2, 0
+	ble	.L2317
 	mov	w0, w27
 	bl	update_multiplier_value
 	bl	FtlBbmTblFlush
-.L2344:
-	ldrb	w0, [x20,7]
-	cbnz	w0, .L2345
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	x0, [x0,2712]
-.L2376:
+.L2317:
+	ldrb	w0, [x20, 7]
+	cbnz	w0, .L2318
+.L2341:
+	ldr	x0, [x19, 2712]
 	mov	w1, -1
-	strh	w1, [x0,x25]
-	b	.L2321
-.L2345:
-	add	x19, x19, :lo12:.LANCHOR2
-	strh	wzr, [x20,2]
-	strb	wzr, [x20,6]
-	ldrh	w1, [x19,2344]
+	strh	w1, [x0, x26]
+	b	.L2295
+.L2324:
+	mov	w1, 0
+	b	.L2298
+.L2303:
+	ldr	x1, [x19, 2544]
+	madd	x2, x0, x4, x1
+	stp	xzr, xzr, [x2, 8]
+	ldrh	w2, [x3]
+	cmp	w2, w6
+	beq	.L2302
+	umull	x7, w25, w4
+	add	w25, w25, 1
+	and	w25, w25, 65535
+	lsl	w2, w2, 10
+	add	x1, x1, x7
+	str	w2, [x1, 4]
+.L2302:
+	add	x0, x0, 1
+	add	x3, x3, 2
+	b	.L2301
+.L2306:
+	mov	w0, 2
+	b	.L2342
+.L2305:
+	ldrh	w0, [x1, x26]
+	add	w0, w0, 1
+	strh	w0, [x1, x26]
+	ldr	w0, [x19, 2432]
+	add	w0, w0, 1
+	str	w0, [x19, 2432]
+	mov	w0, w27
+	bl	ftl_set_blk_mode.part.17
+	b	.L2308
+.L2311:
+	ldr	x1, [x19, 2544]
+	add	x1, x1, x0
+	add	x0, x0, 56
+	ldr	w3, [x1, 4]
+	and	w3, w3, -1024
+	str	w3, [x1, 4]
+	b	.L2310
+.L2313:
+	mov	w1, 1
+	b	.L2343
+.L2316:
+	mul	x0, x1, x4
+	ldr	x3, [x19, 2544]
+	add	x5, x3, x0
+	ldr	w3, [x3, x0]
+	cmn	w3, #1
+	bne	.L2315
+	add	w2, w2, 1
+	ldr	w0, [x5, 4]
+	stp	x4, x1, [x29, 104]
+	stp	w3, w2, [x29, 120]
+	lsr	w0, w0, 10
+	bl	FtlBbmMapBadBlock
+	ldp	w3, w2, [x29, 120]
+	strh	w3, [x28]
+	ldp	x4, x1, [x29, 104]
+	ldrb	w0, [x20, 7]
+	sub	w0, w0, #1
+	strb	w0, [x20, 7]
+.L2315:
+	add	x1, x1, 1
+	add	x28, x28, 2
+	b	.L2314
+.L2318:
+	add	x21, x21, :lo12:.LANCHOR2
+	strh	wzr, [x20, 2]
+	strb	wzr, [x20, 6]
+	ldrh	w1, [x21, 2344]
 	strh	w27, [x20]
 	mul	w0, w0, w1
-	ldr	w1, [x19,2396]
-	str	w1, [x20,12]
-	uxth	w0, w0
+	ldr	w1, [x21, 2396]
+	str	w1, [x20, 12]
+	and	w0, w0, 65535
 	add	w1, w1, 1
-	strh	w0, [x20,4]
-	str	w1, [x19,2396]
-	ldr	x1, [x19,2712]
+	strh	w0, [x20, 4]
+	str	w1, [x21, 2396]
+	ldr	x1, [x21, 2712]
 	ldrh	w2, [x20]
-	strh	w0, [x1,x2,lsl 1]
-.L2320:
+	strh	w0, [x1, x2, lsl 1]
+.L2294:
+	ldp	x19, x20, [sp, 16]
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 128
 	ret
 	.size	allocate_data_superblock, .-allocate_data_superblock
@@ -15696,79 +15381,78 @@ allocate_data_superblock:
 	.global	FtlGcBufInit
 	.type	FtlGcBufInit, %function
 FtlGcBufInit:
-	adrp	x0, .LANCHOR5+1168
-	mov	w1, 0
-	adrp	x7, .LANCHOR2
+	adrp	x0, .LANCHOR4+1680
+	mov	w2, 0
 	mov	w8, 24
 	mov	w9, 1
-	mov	w4, 4
-	str	wzr, [x0,#:lo12:.LANCHOR5+1168]
+	str	wzr, [x0, #:lo12:.LANCHOR4+1680]
+	adrp	x0, .LANCHOR2
+	add	x3, x0, :lo12:.LANCHOR2
+	mov	w5, 4
 	mov	w10, 56
-.L2382:
-	add	x2, x7, :lo12:.LANCHOR2
-	adrp	x6, .LANCHOR2
-	ldrh	w0, [x2,2276]
-	cmp	w1, w0
-	bcs	.L2386
-	umull	x3, w1, w8
-	ldr	x5, [x2,2632]
-	ldr	x6, [x2,2600]
-	add	x0, x5, x3
-	str	w9, [x0,16]
-	ldrh	w0, [x2,2354]
-	mul	w0, w1, w0
-	sdiv	w0, w0, w4
-	add	x0, x6, w0, sxtw 2
-	str	x0, [x5,x3]
-	ldrh	w0, [x2,2356]
-	ldr	x6, [x2,2632]
-	ldr	x11, [x2,2656]
-	mul	w0, w1, w0
-	add	x5, x6, x3
-	ldr	x2, [x2,2552]
-	sdiv	w0, w0, w4
-	add	x0, x11, w0, sxtw 2
-	str	x0, [x5,8]
-	umull	x0, w1, w10
-	add	w1, w1, 1
-	add	x0, x2, x0
-	ldr	x2, [x6,x3]
-	uxth	w1, w1
-	str	x2, [x0,8]
-	ldr	x2, [x5,8]
-	str	x2, [x0,16]
-	b	.L2382
-.L2386:
-	mov	w7, 24
-	mov	w4, 4
-.L2384:
-	add	x1, x6, :lo12:.LANCHOR2
-	ldr	w2, [x1,2568]
-	cmp	w0, w2
-	bcs	.L2387
-	umull	x3, w0, w7
-	ldr	x5, [x1,2632]
-	ldr	x8, [x1,2600]
-	add	x2, x5, x3
-	str	wzr, [x2,16]
-	ldrh	w2, [x1,2354]
-	mul	w2, w0, w2
-	sdiv	w2, w2, w4
-	add	x2, x8, w2, sxtw 2
-	str	x2, [x5,x3]
-	ldrh	w2, [x1,2356]
-	ldr	x5, [x1,2632]
-	ldr	x1, [x1,2656]
-	mul	w2, w0, w2
-	add	x3, x5, x3
-	add	w0, w0, 1
-	sdiv	w2, w2, w4
-	uxth	w0, w0
-	add	x1, x1, w2, sxtw 2
-	str	x1, [x3,8]
-	b	.L2384
-.L2387:
+.L2345:
+	ldrh	w1, [x3, 2276]
+	cmp	w2, w1
+	bcc	.L2346
+	add	x0, x0, :lo12:.LANCHOR2
+	mov	w6, 24
+	mov	w5, 4
+.L2347:
+	ldr	w2, [x0, 2568]
+	cmp	w1, w2
+	bcc	.L2348
 	ret
+.L2346:
+	umull	x4, w2, w8
+	ldr	x6, [x3, 2632]
+	ldr	x7, [x3, 2600]
+	add	x1, x6, x4
+	str	w9, [x1, 16]
+	ldrh	w1, [x3, 2354]
+	mul	w1, w1, w2
+	sdiv	w1, w1, w5
+	add	x1, x7, w1, sxtw 2
+	str	x1, [x6, x4]
+	ldrh	w1, [x3, 2356]
+	ldr	x7, [x3, 2632]
+	ldr	x11, [x3, 2656]
+	add	x6, x7, x4
+	mul	w1, w1, w2
+	sdiv	w1, w1, w5
+	add	x1, x11, w1, sxtw 2
+	str	x1, [x6, 8]
+	ldr	x1, [x3, 2552]
+	ldr	x4, [x7, x4]
+	nop // between mem op and mult-accumulate
+	umaddl	x1, w2, w10, x1
+	add	w2, w2, 1
+	and	w2, w2, 65535
+	str	x4, [x1, 8]
+	ldr	x4, [x6, 8]
+	str	x4, [x1, 16]
+	b	.L2345
+.L2348:
+	umull	x4, w1, w6
+	ldr	x3, [x0, 2632]
+	ldr	x7, [x0, 2600]
+	add	x2, x3, x4
+	str	wzr, [x2, 16]
+	ldrh	w2, [x0, 2354]
+	mul	w2, w2, w1
+	sdiv	w2, w2, w5
+	add	x2, x7, w2, sxtw 2
+	str	x2, [x3, x4]
+	ldrh	w2, [x0, 2356]
+	ldr	x3, [x0, 2632]
+	add	x3, x3, x4
+	ldr	x4, [x0, 2656]
+	mul	w2, w2, w1
+	add	w1, w1, 1
+	and	w1, w1, 65535
+	sdiv	w2, w2, w5
+	add	x2, x4, w2, sxtw 2
+	str	x2, [x3, 8]
+	b	.L2347
 	.size	FtlGcBufInit, .-FtlGcBufInit
 	.align	2
 	.global	FtlVariablesInit
@@ -15778,47 +15462,45 @@ FtlVariablesInit:
 	mov	w0, -1
 	mov	w1, 0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR5
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR4
+	add	x20, x20, :lo12:.LANCHOR4
 	adrp	x19, .LANCHOR2
 	add	x19, x19, :lo12:.LANCHOR2
-	add	x20, x20, :lo12:.LANCHOR5
-	ldrh	w2, [x19,2364]
-	strh	w0, [x20,1184]
+	strh	w0, [x20, 1696]
 	mov	w0, -1
-	str	w0, [x20,1196]
+	str	w0, [x20, 1708]
+	ldr	x0, [x19, 2736]
+	ldrh	w2, [x19, 2364]
+	strh	wzr, [x19, 2920]
+	str	wzr, [x19, 2096]
 	lsl	w2, w2, 1
-	ldr	x0, [x19,2736]
-	str	xzr, [x20,1176]
-	str	wzr, [x20,1188]
-	str	wzr, [x20,1192]
-	str	wzr, [x19,2096]
-	strh	wzr, [x19,2920]
+	str	xzr, [x20, 1688]
+	str	wzr, [x20, 1700]
+	str	wzr, [x20, 1704]
 	bl	ftl_memset
-	ldrh	w2, [x19,2286]
+	ldr	x0, [x19, 2696]
 	mov	w1, 0
-	ldr	x0, [x19,2696]
+	ldrh	w2, [x19, 2286]
 	lsl	w2, w2, 1
 	bl	ftl_memset
-	ldrh	w2, [x19,2286]
+	ldr	x0, [x19, 2680]
 	mov	w1, 0
-	ldr	x0, [x19,2680]
+	ldrh	w2, [x19, 2286]
 	lsl	w2, w2, 1
 	bl	ftl_memset
-	adrp	x0, .LANCHOR4
-	mov	w1, 0
-	add	x0, x0, :lo12:.LANCHOR4
 	mov	w2, 48
-	add	x0, x0, 696
-	bl	ftl_memset
 	mov	w1, 0
+	add	x0, x20, 696
+	bl	ftl_memset
 	mov	w2, 512
-	add	x0, x20, 640
+	mov	w1, 0
+	add	x0, x20, 1152
 	bl	ftl_memset
 	bl	FtlGcBufInit
 	bl	FtlL2PDataInit
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	FtlVariablesInit, .-FtlVariablesInit
@@ -15827,38 +15509,36 @@ FtlVariablesInit:
 	.type	FtlGcBufFree, %function
 FtlGcBufFree:
 	adrp	x2, .LANCHOR2
-	mov	w3, 0
 	add	x2, x2, :lo12:.LANCHOR2
+	mov	w3, 0
 	mov	w7, 56
 	mov	w9, 24
-	ldr	w8, [x2,2568]
-	ldr	x5, [x2,2632]
-.L2390:
+	ldr	w8, [x2, 2568]
+	ldr	x4, [x2, 2632]
+.L2352:
 	cmp	w3, w1
-	bcs	.L2389
-	umull	x4, w3, w7
+	bcs	.L2351
+	umaddl	x6, w3, w7, x0
 	mov	w2, 0
-	add	x4, x0, x4
-.L2395:
-	cmp	w2, w8
-	bcs	.L2392
-	umull	x6, w2, w9
-	add	x10, x5, x6
-	ldr	x11, [x5,x6]
-	ldr	x6, [x4,8]
-	cmp	x11, x6
-	bne	.L2391
-	str	wzr, [x10,16]
-	b	.L2392
-.L2391:
+	b	.L2357
+.L2353:
 	add	w2, w2, 1
-	uxth	w2, w2
-	b	.L2395
-.L2392:
+	and	w2, w2, 65535
+.L2357:
+	cmp	w2, w8
+	bcs	.L2354
+	umull	x5, w2, w9
+	add	x10, x4, x5
+	ldr	x11, [x4, x5]
+	ldr	x5, [x6, 8]
+	cmp	x11, x5
+	bne	.L2353
+	str	wzr, [x10, 16]
+.L2354:
 	add	w3, w3, 1
-	uxth	w3, w3
-	b	.L2390
-.L2389:
+	and	w3, w3, 65535
+	b	.L2352
+.L2351:
 	ret
 	.size	FtlGcBufFree, .-FtlGcBufFree
 	.align	2
@@ -15866,126 +15546,118 @@ FtlGcBufFree:
 	.type	FtlGcBufAlloc, %function
 FtlGcBufAlloc:
 	adrp	x2, .LANCHOR2
-	mov	w7, 24
 	add	x2, x2, :lo12:.LANCHOR2
+	mov	w3, 0
+	mov	w7, 24
 	mov	w8, 1
 	mov	w9, 56
-	ldr	w5, [x2,2568]
-	ldr	x6, [x2,2632]
+	ldr	w5, [x2, 2568]
+	ldr	x6, [x2, 2632]
+.L2359:
+	cmp	w3, w1
+	bcs	.L2358
 	mov	w2, 0
-.L2397:
-	cmp	w2, w1
-	bcs	.L2403
-	mov	w3, 0
-.L2401:
-	cmp	w3, w5
-	bcs	.L2399
-	umull	x4, w3, w7
-	add	x4, x6, x4
-	ldr	w10, [x4,16]
-	cbnz	w10, .L2398
-	umull	x3, w2, w9
-	str	w8, [x4,16]
-	add	x3, x0, x3
+	b	.L2364
+.L2360:
+	add	w2, w2, 1
+	and	w2, w2, 65535
+.L2364:
+	cmp	w2, w5
+	bcs	.L2361
+	umaddl	x4, w2, w7, x6
+	ldr	w10, [x4, 16]
+	cbnz	w10, .L2360
+	umaddl	x2, w3, w9, x0
 	ldr	x10, [x4]
-	str	x10, [x3,8]
-	ldr	x4, [x4,8]
-	str	x4, [x3,16]
-	b	.L2399
-.L2398:
+	str	w8, [x4, 16]
+	str	x10, [x2, 8]
+	ldr	x4, [x4, 8]
+	str	x4, [x2, 16]
+.L2361:
 	add	w3, w3, 1
-	uxth	w3, w3
-	b	.L2401
-.L2399:
-	add	w2, w2, 1
-	uxth	w2, w2
-	b	.L2397
-.L2403:
+	and	w3, w3, 65535
+	b	.L2359
+.L2358:
 	ret
 	.size	FtlGcBufAlloc, .-FtlGcBufAlloc
 	.align	2
 	.global	IsBlkInGcList
 	.type	IsBlkInGcList, %function
 IsBlkInGcList:
-	adrp	x1, .LANCHOR5+1200
-	uxth	w0, w0
-	ldrh	w2, [x1,#:lo12:.LANCHOR5+1200]
+	adrp	x1, .LANCHOR4+1712
+	and	w0, w0, 65535
+	ldrh	w2, [x1, #:lo12:.LANCHOR4+1712]
 	adrp	x1, .LANCHOR2+2504
-	ldr	x3, [x1,#:lo12:.LANCHOR2+2504]
+	ldr	x3, [x1, #:lo12:.LANCHOR2+2504]
 	mov	x1, 0
-.L2405:
+.L2366:
 	cmp	w2, w1, uxth
-	bls	.L2409
+	bhi	.L2368
+	mov	w0, 0
+	ret
+.L2368:
 	add	x1, x1, 1
 	add	x4, x3, x1, lsl 1
-	ldrh	w4, [x4,-2]
+	ldrh	w4, [x4, -2]
 	cmp	w4, w0
-	bne	.L2405
+	bne	.L2366
 	mov	w0, 1
-	b	.L2406
-.L2409:
-	mov	w0, 0
-.L2406:
 	ret
 	.size	IsBlkInGcList, .-IsBlkInGcList
 	.align	2
 	.global	FtlGcUpdatePage
 	.type	FtlGcUpdatePage, %function
 FtlGcUpdatePage:
-	stp	x29, x30, [sp, -48]!
+	mov	w6, w0
+	mov	w9, w1
+	mov	w8, w2
+	stp	x29, x30, [sp, -16]!
+	lsr	w0, w0, 10
 	add	x29, sp, 0
-	str	x19, [sp,16]
-	mov	w19, w0
-	lsr	x0, x19, 10
-	str	x1, [x29,32]
-	str	x2, [x29,40]
 	bl	P2V_block_in_plane
-	adrp	x3, .LANCHOR5
-	ldr	x2, [x29,40]
-	add	x4, x3, :lo12:.LANCHOR5
-	ldr	x1, [x29,32]
-	uxth	w9, w0
-	mov	x6, 0
-	ldrh	w8, [x4,1200]
+	and	w10, w0, 65535
+	adrp	x3, .LANCHOR4
 	adrp	x4, .LANCHOR2
-	add	x5, x4, :lo12:.LANCHOR2
-	ldr	x7, [x5,2504]
-.L2411:
-	uxth	w5, w6
-	cmp	w5, w8
-	bcs	.L2415
-	add	x6, x6, 1
-	add	x10, x7, x6, lsl 1
-	ldrh	w10, [x10,-2]
-	cmp	w10, w9
-	bne	.L2411
-.L2415:
-	cmp	w5, w8
-	bne	.L2413
-	ubfiz	x5, x5, 1, 16
-	strh	w0, [x7,x5]
-	add	x0, x3, :lo12:.LANCHOR5
-	ldrh	w5, [x0,1200]
-	add	w5, w5, 1
-	strh	w5, [x0,1200]
-.L2413:
-	add	x3, x3, :lo12:.LANCHOR5
-	add	x4, x4, :lo12:.LANCHOR2
-	mov	w0, 12
-	ldrh	w5, [x3,1202]
-	ldr	x6, [x4,2512]
-	umull	x5, w5, w0
-	add	x6, x6, x5
-	str	w1, [x6,4]
-	ldr	x1, [x4,2512]
-	add	x0, x1, x5
-	str	w2, [x0,8]
-	str	w19, [x1,x5]
-	ldrh	w0, [x3,1202]
+	add	x1, x3, :lo12:.LANCHOR4
+	add	x2, x4, :lo12:.LANCHOR2
+	mov	x5, 0
+	ldrh	w1, [x1, 1712]
+	ldr	x7, [x2, 2504]
+.L2371:
+	and	w2, w5, 65535
+	cmp	w2, w1
+	bcc	.L2373
+	bne	.L2372
+	and	x5, x5, 65535
+	strh	w0, [x7, x5, lsl 1]
+	add	x5, x3, :lo12:.LANCHOR4
+	ldrh	w0, [x5, 1712]
 	add	w0, w0, 1
-	strh	w0, [x3,1202]
-	ldr	x19, [sp,16]
-	ldp	x29, x30, [sp], 48
+	strh	w0, [x5, 1712]
+	b	.L2372
+.L2373:
+	add	x5, x5, 1
+	add	x2, x7, x5, lsl 1
+	ldrh	w2, [x2, -2]
+	cmp	w2, w10
+	bne	.L2371
+.L2372:
+	add	x0, x3, :lo12:.LANCHOR4
+	add	x3, x4, :lo12:.LANCHOR2
+	mov	w1, 12
+	ldrh	w5, [x0, 1714]
+	ldr	x4, [x3, 2512]
+	umull	x5, w5, w1
+	add	x4, x4, x5
+	str	w9, [x4, 4]
+	ldr	x1, [x3, 2512]
+	add	x3, x1, x5
+	str	w8, [x3, 8]
+	str	w6, [x1, x5]
+	ldrh	w1, [x0, 1714]
+	add	w1, w1, 1
+	strh	w1, [x0, 1714]
+	ldp	x29, x30, [sp], 16
 	ret
 	.size	FtlGcUpdatePage, .-FtlGcUpdatePage
 	.align	2
@@ -15993,27 +15665,27 @@ FtlGcUpdatePage:
 	.type	FtlGcPageVarInit, %function
 FtlGcPageVarInit:
 	stp	x29, x30, [sp, -32]!
-	adrp	x0, .LANCHOR5
+	adrp	x0, .LANCHOR4
+	add	x0, x0, :lo12:.LANCHOR4
 	mov	w1, 255
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	adrp	x19, .LANCHOR2
 	add	x19, x19, :lo12:.LANCHOR2
-	add	x0, x0, :lo12:.LANCHOR5
-	ldrh	w2, [x19,2348]
-	strh	wzr, [x0,1200]
-	strh	wzr, [x0,1202]
+	strh	wzr, [x0, 1712]
+	strh	wzr, [x0, 1714]
+	ldr	x0, [x19, 2504]
+	ldrh	w2, [x19, 2348]
 	lsl	w2, w2, 1
-	ldr	x0, [x19,2504]
 	bl	ftl_memset
-	ldrh	w3, [x19,2348]
-	mov	w2, 12
-	ldr	x0, [x19,2512]
+	ldrh	w2, [x19, 2348]
+	mov	w0, 12
 	mov	w1, 255
-	mul	w2, w3, w2
+	mul	w2, w2, w0
+	ldr	x0, [x19, 2512]
 	bl	ftl_memset
 	bl	FtlGcBufInit
-	ldr	x19, [sp,16]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	FtlGcPageVarInit, .-FtlGcPageVarInit
@@ -16021,303 +15693,276 @@ FtlGcPageVarInit:
 	.global	FtlGcScanTempBlk
 	.type	FtlGcScanTempBlk, %function
 FtlGcScanTempBlk:
-	stp	x29, x30, [sp, -224]!
+	stp	x29, x30, [sp, -176]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	x19, x0
-	adrp	x0, .LANCHOR1
-	str	w1, [x29,136]
-	add	x1, x0, :lo12:.LANCHOR1
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	str	x0, [x29,128]
-	ldrh	w27, [x1,3452]
-	mov	w1, 65535
-	cmp	w27, w1
-	beq	.L2451
-	cbnz	w27, .L2419
-	b	.L2420
-.L2451:
-	mov	w27, 0
-.L2419:
-	adrp	x0, .LANCHOR2+2344
-	ldr	w1, [x29,136]
-	ldrh	w0, [x0,#:lo12:.LANCHOR2+2344]
-	cmp	w1, w0
-	bne	.L2421
-.L2420:
+	stp	x21, x22, [sp, 32]
+	adrp	x22, .LANCHOR1
+	add	x0, x22, :lo12:.LANCHOR1
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	str	w1, [x29, 104]
+	ldrh	w26, [x0, 3452]
+	mov	w0, 65535
+	cmp	w26, w0
+	beq	.L2408
+	cbnz	w26, .L2378
+.L2379:
 	bl	FtlGcPageVarInit
-.L2421:
+	b	.L2380
+.L2408:
+	mov	w26, 0
+.L2378:
+	adrp	x0, .LANCHOR2+2344
+	ldr	w1, [x29, 104]
+	ldrh	w0, [x0, #:lo12:.LANCHOR2+2344]
+	cmp	w0, w1
+	beq	.L2379
+.L2380:
+	adrp	x28, .LANCHOR2
+	add	x27, x28, :lo12:.LANCHOR2
 	mov	w0, -1
-	adrp	x23, .LANCHOR2
-	str	w0, [x29,140]
-	adrp	x0, .LC147
-	add	x0, x0, :lo12:.LC147
-	mov	w24, 0
-	mov	x22, x23
-	str	x0, [x29,120]
-.L2422:
+	mov	w23, 0
+	str	w0, [x29, 108]
+.L2381:
 	ldrh	w1, [x19]
 	mov	w0, 65535
-	strb	wzr, [x19,8]
+	strb	wzr, [x19, 8]
 	cmp	w1, w0
-	beq	.L2452
-.L2424:
-	mov	w28, w0
-.L2448:
-	adrp	x0, .LANCHOR2
-	mov	x2, x19
-	add	x0, x0, :lo12:.LANCHOR2
+	beq	.L2409
+.L2405:
+	add	x0, x28, :lo12:.LANCHOR2
+	add	x6, x19, 16
 	mov	w20, 0
-	mov	w10, 56
+	mov	w11, 65535
+	mov	w12, 56
 	mov	w7, 4
-	ldrh	w5, [x0,2276]
-	ldrh	w8, [x0,2354]
-	ldrh	w9, [x0,2356]
-	add	x5, x19, x5, lsl 1
-.L2425:
-	cmp	x2, x5
-	beq	.L2470
-	ldrh	w1, [x2,16]
-	cmp	w1, w28
-	beq	.L2426
-	add	x4, x23, :lo12:.LANCHOR2
-	orr	w1, w27, w1, lsl 10
-	umull	x0, w20, w10
-	ldr	x6, [x4,2520]
-	add	x6, x6, x0
-	str	w1, [x6,4]
-	ldr	x1, [x4,2520]
-	ldr	x6, [x4,2600]
-	add	x0, x1, x0
-	ldr	x4, [x4,2656]
-	mul	w1, w20, w8
-	sdiv	w1, w1, w7
-	add	x1, x6, w1, sxtw 2
-	str	x1, [x0,8]
+	ldrh	w9, [x0, 2354]
+	ldrh	w10, [x0, 2356]
+	ldrh	w0, [x0, 2276]
+	add	x0, x0, 8
+	add	x0, x19, x0, lsl 1
+.L2383:
+	cmp	x6, x0
+	bne	.L2385
+	ldr	x0, [x27, 2520]
+	mov	w2, 0
+	mov	w1, w20
+	adrp	x24, .LANCHOR0
+	add	x24, x24, :lo12:.LANCHOR0
+	mov	x21, 0
+	bl	FlashReadPages
+	mov	w0, 56
+	umull	x0, w20, w0
+	str	x0, [x29, 96]
+.L2386:
+	ldr	x0, [x29, 96]
+	cmp	x0, x21
+	bne	.L2403
+	ldr	w0, [x29, 104]
+	add	w4, w26, 1
+	add	w23, w23, 1
+	and	w26, w4, 65535
+	cmp	w0, w23
+	bls	.L2404
+.L2406:
+	ldrh	w0, [x27, 2344]
+	cmp	w0, w26
+	bhi	.L2405
+.L2409:
+	mov	w2, 0
+	b	.L2382
+.L2385:
+	ldrh	w1, [x6]
+	cmp	w1, w11
+	beq	.L2384
+	umull	x8, w20, w12
+	ldr	x5, [x27, 2520]
+	orr	w1, w26, w1, lsl 10
+	add	x5, x5, x8
+	str	w1, [x5, 4]
 	mul	w1, w20, w9
+	ldr	x2, [x27, 2520]
+	ldr	x5, [x27, 2600]
+	sdiv	w1, w1, w7
+	add	x2, x2, x8
+	add	x1, x5, w1, sxtw 2
+	str	x1, [x2, 8]
+	mul	w1, w20, w10
+	ldr	x5, [x27, 2656]
 	add	w20, w20, 1
-	uxth	w20, w20
+	and	w20, w20, 65535
 	sdiv	w1, w1, w7
-	add	x1, x4, w1, sxtw 2
-	str	x1, [x0,16]
-.L2426:
-	add	x2, x2, 2
-	b	.L2425
-.L2470:
-	add	x0, x23, :lo12:.LANCHOR2
-	mov	w1, w20
-	mov	w2, 0
-	mov	x25, 0
-	ldr	x0, [x0,2520]
-	bl	FlashReadPages
-.L2428:
-	cmp	w20, w25, uxth
-	bls	.L2471
-	add	x26, x23, :lo12:.LANCHOR2
-	mov	x0, 56
-	mul	x21, x25, x0
-	ldr	x1, [x26,2520]
-	str	x1, [x29,104]
-	add	x2, x1, x21
-	str	x2, [x29,112]
-	ldr	w0, [x2,4]
-	str	w0, [x29,144]
-	ldr	x0, [x29,144]
-	lsr	x0, x0, 10
+	add	x1, x5, w1, sxtw 2
+	str	x1, [x2, 16]
+.L2384:
+	add	x6, x6, 2
+	b	.L2383
+.L2403:
+	ldr	x6, [x27, 2520]
+	add	x5, x6, x21
+	ldr	w25, [x5, 4]
+	lsr	w0, w25, 10
 	bl	P2V_plane
-	uxth	w6, w0
-	ldr	x1, [x29,104]
-	ldr	x2, [x29,112]
-	ldr	w7, [x1,x21]
-	ldr	x5, [x2,16]
-	cbnz	w7, .L2429
-	ldrh	w0, [x5]
-	cmp	w0, w28
-	bne	.L2430
-.L2433:
-	add	x1, x22, :lo12:.LANCHOR2
-	adrp	x20, .LANCHOR5
-	ldrb	w0, [x1,1220]
-	cbz	w0, .L2467
-	add	x20, x20, :lo12:.LANCHOR5
+	and	w2, w0, 65535
+	ldr	w0, [x6, x21]
+	ldr	x20, [x5, 16]
+	cbnz	w0, .L2387
+	ldrh	w1, [x20]
+	mov	w0, 65535
+	cmp	w1, w0
+	bne	.L2388
+.L2391:
+	ldrb	w0, [x27, 1220]
+	adrp	x14, .LANCHOR4
+	cbz	w0, .L2421
+	add	x14, x14, :lo12:.LANCHOR4
 	mov	w0, 1
-	str	w0, [x20,1192]
-	b	.L2423
-.L2430:
-	ldr	w0, [x5,8]
-	ldr	w1, [x26,2924]
+	str	w0, [x14, 1704]
+.L2382:
+	add	x22, x22, :lo12:.LANCHOR1
+	strh	w26, [x19, 2]
+	strb	w2, [x19, 6]
+	mov	w0, -1
+	mov	w1, w26
+	strh	w0, [x22, 3452]
+	mov	x0, x19
+	bl	ftl_sb_update_avl_pages
+	b	.L2377
+.L2388:
+	ldr	w0, [x20, 8]
+	ldr	w1, [x27, 2924]
 	cmp	w0, w1
-	bls	.L2468
-	b	.L2433
-.L2467:
-	ldrh	w2, [x19]
-	add	x20, x20, :lo12:.LANCHOR5
-	ldr	x1, [x1,2712]
-	strh	w0, [x1,x2,lsl 1]
+	bhi	.L2391
+	ldrb	w1, [x24, 88]
+	cbnz	w1, .L2394
+.L2395:
+	ldp	w2, w0, [x20, 8]
+	mov	w1, w25
+	add	x21, x21, 56
+	bl	FtlGcUpdatePage
+	b	.L2386
+.L2421:
+	ldr	x0, [x27, 2712]
+	ldrh	w1, [x19]
+	strh	wzr, [x0, x1, lsl 1]
 	ldrh	w0, [x19]
 	bl	INSERT_FREE_LIST
+	add	x14, x14, :lo12:.LANCHOR4
 	mov	w0, -1
 	strh	w0, [x19]
-	strh	w0, [x20,592]
-	b	.L2469
-.L2468:
-	adrp	x1, .LANCHOR0
-	add	x1, x1, :lo12:.LANCHOR0
-	ldrb	w1, [x1,88]
-	cbz	w1, .L2437
-	add	x1, x29, 164
-	mov	w2, w7
-	str	x5, [x29,112]
-	str	x7, [x29,104]
+	strh	w0, [x14, 1104]
+.L2424:
+	bl	FtlGcPageVarInit
+	mov	w26, 0
+	b	.L2381
+.L2394:
+	add	x1, x29, 116
+	mov	w2, 0
 	bl	log2phys
-	ldr	x5, [x29,112]
-	ldr	w1, [x29,164]
-	ldr	w0, [x5,12]
-	cmp	w1, w0
-	bne	.L2437
-	cmn	w1, #1
-	beq	.L2437
-	str	w0, [x29,172]
+	ldr	w0, [x20, 12]
+	ldr	w1, [x29, 116]
+	cmp	w0, w1
+	bne	.L2395
+	cmn	w0, #1
+	beq	.L2395
+	str	w0, [x29, 124]
+	mov	w2, 0
+	ldr	x0, [x27, 2624]
 	mov	w1, 1
-	ldr	x0, [x26,2624]
-	ldr	x7, [x29,104]
-	str	x0, [x29,176]
-	ldr	x0, [x26,2648]
-	mov	w2, w7
-	str	x0, [x29,184]
-	add	x0, x29, 168
+	str	x0, [x29, 128]
+	ldr	x0, [x27, 2648]
+	str	x0, [x29, 136]
+	add	x0, x29, 120
 	bl	FlashReadPages
-	ldr	x0, [x26,2520]
-	ldrh	w2, [x26,2350]
-	ldr	x4, [x29,176]
-	add	x21, x0, x21
-	ldr	x5, [x29,112]
-	lsl	w2, w2, 7
+	ldrh	w1, [x27, 2350]
 	mov	x0, 0
-.L2439:
-	cmp	w2, w0
-	bls	.L2437
-	lsl	x1, x0, 2
-	ldr	x6, [x21,8]
-	add	x0, x0, 1
-	ldr	w6, [x6,x1]
-	ldr	w1, [x4,x1]
-	cmp	w6, w1
-	beq	.L2439
+	ldr	x2, [x27, 2520]
+	ldr	x6, [x29, 128]
+	ubfiz	x1, x1, 9, 16
+	add	x2, x2, x21
+.L2396:
+	cmp	x0, x1
+	beq	.L2395
+	ldr	x7, [x2, 8]
+	ldr	w8, [x7, x0]
+	add	x0, x0, 4
+	add	x7, x6, x0
+	ldr	w7, [x7, -4]
+	cmp	w8, w7
+	beq	.L2396
 	ldrh	w1, [x19]
 	adrp	x0, .LC146
-	ldr	w2, [x29,172]
+	ldr	w2, [x29, 124]
 	add	x0, x0, :lo12:.LC146
 	bl	printk
-	add	x0, x22, :lo12:.LANCHOR2
 	ldrh	w1, [x19]
-	ldr	x0, [x0,2712]
-	strh	wzr, [x0,x1,lsl 1]
+	ldr	x0, [x27, 2712]
+	strh	wzr, [x0, x1, lsl 1]
 	ldrh	w0, [x19]
 	bl	INSERT_FREE_LIST
-	adrp	x1, .LANCHOR5+592
+	adrp	x1, .LANCHOR4+1104
 	mov	w0, -1
 	strh	w0, [x19]
-	strh	w0, [x1,#:lo12:.LANCHOR5+592]
-	b	.L2469
-.L2437:
-	ldr	w0, [x5,12]
-	add	x25, x25, 1
-	ldr	w1, [x29,144]
-	ldr	w2, [x5,8]
-	bl	FtlGcUpdatePage
-	b	.L2428
-.L2429:
-	ldr	x0, [x29,120]
+	strh	w0, [x1, #:lo12:.LANCHOR4+1104]
+	b	.L2424
+.L2387:
 	ldrh	w1, [x19]
-	ldr	w2, [x29,144]
+	mov	w2, w25
+	adrp	x0, .LC147
+	add	x0, x0, :lo12:.LC147
 	bl	printk
-	ldr	w0, [x26,2096]
-	cbnz	w0, .L2442
-	ldrb	w0, [x26,1220]
-	cbz	w0, .L2443
-.L2442:
-	add	x0, x22, :lo12:.LANCHOR2
-	ldrh	w1, [x19]
-	ldr	x0, [x0,2696]
-	ldrh	w0, [x0,x1,lsl 1]
-	cmp	w0, 159
-	bls	.L2444
-.L2443:
-	add	x0, x22, :lo12:.LANCHOR2
-	ldr	x0, [x0,2520]
-	ldr	w0, [x0,x21]
-	cmn	w0, #1
-	bne	.L2445
-.L2444:
-	add	x0, x22, :lo12:.LANCHOR2
-	ldr	x0, [x0,2520]
-	add	x21, x0, x21
-	ldr	w0, [x21,4]
-	str	w0, [x29,140]
-.L2445:
-	add	x0, x22, :lo12:.LANCHOR2
-	ldrh	w1, [x19]
-	ldr	x0, [x0,2712]
-	strh	wzr, [x0,x1,lsl 1]
+	ldr	w1, [x27, 2096]
+	ldrh	w0, [x19]
+	cbnz	w1, .L2399
+	ldrb	w1, [x27, 1220]
+	cbz	w1, .L2400
+.L2399:
+	ldr	x2, [x27, 2696]
+	ubfiz	x1, x0, 1, 16
+	ldrh	w1, [x2, x1]
+	cmp	w1, 159
+	bls	.L2401
+.L2400:
+	ldr	x1, [x27, 2520]
+	ldr	w1, [x1, x21]
+	cmn	w1, #1
+	bne	.L2402
+.L2401:
+	ldr	x1, [x27, 2520]
+	add	x21, x1, x21
+	ldr	w1, [x21, 4]
+	str	w1, [x29, 108]
+.L2402:
+	ldr	x1, [x27, 2712]
+	ubfiz	x0, x0, 1, 16
+	strh	wzr, [x1, x0]
 	ldrh	w0, [x19]
 	bl	INSERT_FREE_LIST
 	mov	w0, -1
 	strh	w0, [x19]
-.L2469:
-	bl	FtlGcPageVarInit
-	mov	w27, 0
-	b	.L2422
-.L2471:
-	ldr	w0, [x29,136]
-	add	w24, w24, 1
-	add	w3, w27, 1
-	cmp	w24, w0
-	uxth	w27, w3
-	bcs	.L2447
-.L2449:
-	add	x0, x23, :lo12:.LANCHOR2
-	ldrh	w0, [x0,2344]
-	cmp	w0, w27
-	bhi	.L2448
-	b	.L2452
-.L2447:
-	ldr	x0, [x29,128]
-	add	x1, x0, :lo12:.LANCHOR1
-	ldrh	w0, [x1,3452]
-	cmp	w0, w28
-	beq	.L2449
-	add	w0, w0, w24
-	strh	w0, [x1,3452]
-	add	x0, x23, :lo12:.LANCHOR2
-	ldrh	w0, [x0,2344]
-	cmp	w0, w27
-	bls	.L2449
-	b	.L2450
-.L2452:
-	mov	w6, 0
-.L2423:
-	ldr	x0, [x29,128]
-	mov	w1, -1
-	strh	w27, [x19,2]
-	mov	w2, w6
-	add	x0, x0, :lo12:.LANCHOR1
-	strb	w6, [x19,6]
-	strh	w1, [x0,3452]
-	mov	x0, x19
-	mov	w1, w27
-	bl	ftl_sb_update_avl_pages
-.L2450:
-	ldr	w0, [x29,140]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 224
+	b	.L2424
+.L2404:
+	add	x1, x22, :lo12:.LANCHOR1
+	mov	w2, 65535
+	ldrh	w0, [x1, 3452]
+	cmp	w0, w2
+	beq	.L2406
+	add	w0, w0, w23
+	strh	w0, [x1, 3452]
+	ldrh	w0, [x27, 2344]
+	cmp	w0, w26
+	bls	.L2406
+.L2377:
+	ldr	w0, [x29, 108]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 176
 	ret
 	.size	FtlGcScanTempBlk, .-FtlGcScanTempBlk
 	.align	2
@@ -16326,54 +15971,54 @@ FtlGcScanTempBlk:
 FtlGcRefreshOpenBlock:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	uxth	w20, w0
 	add	x19, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x19,2472]
+	and	w20, w0, 65535
+	ldrh	w0, [x19, 2472]
 	cmp	w0, w20
-	beq	.L2474
-	ldrh	w0, [x19,2474]
+	beq	.L2427
+	ldrh	w0, [x19, 2474]
 	cmp	w0, w20
-	beq	.L2474
-	ldrh	w0, [x19,2476]
+	beq	.L2427
+	ldrh	w0, [x19, 2476]
 	cmp	w0, w20
-	beq	.L2474
-	ldrh	w0, [x19,2478]
+	beq	.L2427
+	ldrh	w0, [x19, 2478]
 	cmp	w0, w20
-	beq	.L2474
-	adrp	x0, .LC148
+	beq	.L2427
 	mov	w1, w20
+	adrp	x0, .LC148
 	add	x0, x0, :lo12:.LC148
 	bl	printk
-	ldrh	w1, [x19,2472]
+	ldrh	w1, [x19, 2472]
 	mov	w0, 65535
 	cmp	w1, w0
-	bne	.L2476
-	strh	w20, [x19,2472]
-	b	.L2474
-.L2476:
-	ldrh	w1, [x19,2474]
-	cmp	w1, w0
-	bne	.L2477
-	strh	w20, [x19,2474]
-	b	.L2474
-.L2477:
-	ldrh	w1, [x19,2476]
-	cmp	w1, w0
-	bne	.L2478
-	strh	w20, [x19,2476]
-	b	.L2474
-.L2478:
-	ldrh	w1, [x19,2478]
-	cmp	w1, w0
-	bne	.L2474
-	strh	w20, [x19,2478]
-.L2474:
+	bne	.L2429
+	strh	w20, [x19, 2472]
+.L2427:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L2429:
+	ldrh	w1, [x19, 2474]
+	cmp	w1, w0
+	bne	.L2430
+	strh	w20, [x19, 2474]
+	b	.L2427
+.L2430:
+	ldrh	w1, [x19, 2476]
+	cmp	w1, w0
+	bne	.L2431
+	strh	w20, [x19, 2476]
+	b	.L2427
+.L2431:
+	ldrh	w1, [x19, 2478]
+	cmp	w1, w0
+	bne	.L2427
+	strh	w20, [x19, 2478]
+	b	.L2427
 	.size	FtlGcRefreshOpenBlock, .-FtlGcRefreshOpenBlock
 	.align	2
 	.global	FtlGcRefreshBlock
@@ -16381,60 +16026,63 @@ FtlGcRefreshOpenBlock:
 FtlGcRefreshBlock:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	uxth	w20, w0
 	add	x19, x19, :lo12:.LANCHOR2
-	str	x21, [sp,32]
-	mov	w21, 0
-	ldrh	w0, [x19,2472]
+	and	w20, w0, 65535
+	str	x21, [sp, 32]
+	ldrh	w0, [x19, 2472]
 	cmp	w0, w20
-	beq	.L2480
-	ldrh	w0, [x19,2474]
+	beq	.L2440
+	ldrh	w0, [x19, 2474]
 	cmp	w0, w20
-	beq	.L2480
-	ldrh	w0, [x19,2476]
+	beq	.L2440
+	ldrh	w0, [x19, 2476]
 	cmp	w0, w20
-	beq	.L2480
-	ldrh	w0, [x19,2478]
+	beq	.L2440
+	ldrh	w0, [x19, 2478]
+	mov	w21, 0
 	cmp	w0, w20
-	beq	.L2480
-	adrp	x0, .LC148
+	beq	.L2433
 	mov	w1, w20
+	adrp	x0, .LC148
 	add	x0, x0, :lo12:.LC148
 	bl	printk
-	ldrh	w1, [x19,2472]
+	ldrh	w1, [x19, 2472]
 	mov	w0, 65535
 	cmp	w1, w0
-	bne	.L2481
-	strh	w20, [x19,2472]
-	b	.L2480
-.L2481:
-	ldrh	w1, [x19,2474]
+	bne	.L2435
+	strh	w20, [x19, 2472]
+.L2433:
+	mov	w0, w21
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 48
+	ret
+.L2435:
+	ldrh	w1, [x19, 2474]
 	cmp	w1, w0
-	bne	.L2482
-	strh	w20, [x19,2474]
-	b	.L2480
-.L2482:
-	ldrh	w1, [x19,2476]
+	bne	.L2436
+	strh	w20, [x19, 2474]
+	b	.L2433
+.L2436:
+	ldrh	w1, [x19, 2476]
 	cmp	w1, w0
-	bne	.L2483
-	strh	w20, [x19,2476]
-	b	.L2480
-.L2483:
-	ldrh	w1, [x19,2478]
+	bne	.L2437
+	strh	w20, [x19, 2476]
+	b	.L2433
+.L2437:
+	ldrh	w1, [x19, 2478]
 	cmp	w1, w0
-	bne	.L2488
-	strh	w20, [x19,2478]
-	b	.L2480
-.L2488:
+	bne	.L2442
+	strh	w20, [x19, 2478]
+	b	.L2433
+.L2440:
+	mov	w21, 0
+	b	.L2433
+.L2442:
 	mov	w21, -1
-.L2480:
-	mov	w0, w21
-	ldr	x21, [sp,32]
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 48
-	ret
+	b	.L2433
 	.size	FtlGcRefreshBlock, .-FtlGcRefreshBlock
 	.align	2
 	.global	FtlGcMarkBadPhyBlk
@@ -16442,62 +16090,62 @@ FtlGcRefreshBlock:
 FtlGcMarkBadPhyBlk:
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	uxth	w20, w0
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	stp	x21, x22, [sp,32]
-	mov	w0, w20
+	stp	x21, x22, [sp, 32]
 	add	x22, x19, :lo12:.LANCHOR2
-	str	x23, [sp,48]
+	and	w20, w0, 65535
+	str	x23, [sp, 48]
+	mov	w0, w20
 	bl	P2V_block_in_plane
-	uxth	w21, w0
-	ldrh	w1, [x22,2486]
-	adrp	x0, .LC149
+	ldrh	w1, [x22, 2486]
 	mov	w2, w20
+	and	w21, w0, 65535
+	adrp	x0, .LC149
 	add	x0, x0, :lo12:.LC149
 	bl	printk
 	mov	w0, w21
 	bl	FtlGcRefreshBlock
-	ldr	w0, [x22,2096]
-	cbz	w0, .L2490
+	ldr	w0, [x22, 2096]
+	cbz	w0, .L2445
+	ldr	x2, [x22, 2696]
 	ubfiz	x0, x21, 1, 16
-	ldr	x2, [x22,2696]
-	ldrh	w1, [x2,x0]
+	ldrh	w1, [x2, x0]
 	cmp	w1, 39
-	bls	.L2490
+	bls	.L2445
 	sub	w1, w1, #40
-	strh	w1, [x2,x0]
-.L2490:
+	strh	w1, [x2, x0]
+.L2445:
 	add	x0, x19, :lo12:.LANCHOR2
-	adrp	x1, .LANCHOR5
-	add	x1, x1, :lo12:.LANCHOR5
-	add	x1, x1, 1208
-	ldrh	w3, [x0,2486]
-	mov	x0, 0
-.L2491:
-	cmp	w3, w0, uxth
-	bls	.L2497
-	add	x0, x0, 1
-	add	x2, x1, x0, lsl 1
-	ldrh	w2, [x2,-2]
-	cmp	w2, w20
-	bne	.L2491
-	b	.L2492
-.L2497:
-	cmp	w3, 15
-	bhi	.L2492
-	adrp	x1, .LANCHOR5
+	mov	x2, 0
+	ldrh	w1, [x0, 2486]
+	adrp	x0, .LANCHOR4
+	add	x0, x0, :lo12:.LANCHOR4
+	add	x0, x0, 1720
+.L2446:
+	cmp	w1, w2, uxth
+	bhi	.L2448
+	cmp	w1, 15
+	bhi	.L2447
 	add	x19, x19, :lo12:.LANCHOR2
-	add	x1, x1, :lo12:.LANCHOR5
-	add	w0, w3, 1
-	add	x1, x1, 1208
-	strh	w0, [x19,2486]
-	strh	w20, [x1,w3,sxtw 1]
-.L2492:
+	add	w0, w1, 1
+	strh	w0, [x19, 2486]
+	adrp	x0, .LANCHOR4
+	add	x0, x0, :lo12:.LANCHOR4
+	add	x0, x0, 1720
+	strh	w20, [x0, w1, sxtw 1]
+	b	.L2447
+.L2448:
+	add	x2, x2, 1
+	add	x3, x0, x2, lsl 1
+	ldrh	w3, [x3, -2]
+	cmp	w3, w20
+	bne	.L2446
+.L2447:
 	mov	w0, 0
-	ldr	x23, [sp,48]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
+	ldr	x23, [sp, 48]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
 	ldp	x29, x30, [sp], 64
 	ret
 	.size	FtlGcMarkBadPhyBlk, .-FtlGcMarkBadPhyBlk
@@ -16507,34 +16155,34 @@ FtlGcMarkBadPhyBlk:
 FtlGcReFreshBadBlk:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	adrp	x19, .LANCHOR2
 	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w1, [x0,2486]
-	cbz	w1, .L2499
-	ldrh	w3, [x0,2472]
+	ldrh	w1, [x0, 2486]
+	cbz	w1, .L2454
+	ldrh	w3, [x0, 2472]
 	mov	w2, 65535
 	cmp	w3, w2
-	bne	.L2499
-	ldrh	w2, [x0,2490]
+	bne	.L2454
+	ldrh	w2, [x0, 2490]
 	cmp	w2, w1
-	bcc	.L2500
-	strh	wzr, [x0,2490]
-.L2500:
+	bcc	.L2455
+	strh	wzr, [x0, 2490]
+.L2455:
 	add	x19, x19, :lo12:.LANCHOR2
-	adrp	x0, .LANCHOR5
-	add	x0, x0, :lo12:.LANCHOR5
-	add	x0, x0, 1208
-	ldrh	w1, [x19,2490]
-	ldrh	w0, [x0,w1,sxtw 1]
+	adrp	x0, .LANCHOR4
+	add	x0, x0, :lo12:.LANCHOR4
+	add	x0, x0, 1720
+	ldrh	w1, [x19, 2490]
+	ldrh	w0, [x0, x1, lsl 1]
 	bl	P2V_block_in_plane
 	bl	FtlGcRefreshBlock
-	ldrh	w0, [x19,2490]
+	ldrh	w0, [x19, 2490]
 	add	w0, w0, 1
-	strh	w0, [x19,2490]
-.L2499:
+	strh	w0, [x19, 2490]
+.L2454:
 	mov	w0, 0
-	ldr	x19, [sp,16]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	FtlGcReFreshBadBlk, .-FtlGcReFreshBadBlk
@@ -16544,1080 +16192,1022 @@ FtlGcReFreshBadBlk:
 FtlGcFreeBadSuperBlk:
 	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x19, .LANCHOR2
-	str	x27, [sp,80]
-	add	x19, x19, :lo12:.LANCHOR2
-	stp	x23, x24, [sp,48]
-	uxth	w23, w0
-	ldrh	w0, [x19,2486]
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	mov	w21, 0
-	cbz	w0, .L2506
-	adrp	x24, .LANCHOR5
-	adrp	x22, .LC150
-	add	x22, x22, :lo12:.LC150
-	add	x25, x24, :lo12:.LANCHOR5
-.L2514:
-	ldrh	w0, [x19,2276]
-	cmp	w0, w21
-	bls	.L2515
-	add	x0, x19, 2304
-	mov	w1, w23
+	stp	x23, x24, [sp, 48]
+	and	w23, w0, 65535
+	adrp	x0, .LANCHOR2
+	add	x1, x0, :lo12:.LANCHOR2
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
+	stp	x25, x26, [sp, 64]
+	str	x27, [sp, 80]
+	ldrh	w1, [x1, 2486]
+	cbz	w1, .L2461
+	adrp	x22, .LANCHOR4
+	add	x21, x22, :lo12:.LANCHOR4
+	mov	x27, x0
+	add	x21, x21, 1720
 	mov	w20, 0
-	add	x27, x24, :lo12:.LANCHOR5
-	ldrb	w0, [x0,w21,sxtw]
-	bl	V2P_block
-	uxth	w26, w0
-.L2507:
-	ldrh	w0, [x19,2486]
-	cmp	w0, w20
-	bls	.L2516
-	add	x0, x27, 1208
-	ldrh	w0, [x0,w20,sxtw 1]
-	cmp	w0, w26
-	bne	.L2508
-	mov	w1, w26
-	mov	x0, x22
-	bl	printk
-	mov	w0, w26
-	bl	FtlBbmMapBadBlock
-	bl	FtlBbmTblFlush
-	ldrh	w2, [x19,2486]
-	mov	w3, w20
-.L2509:
-	cmp	w3, w2
-	bcs	.L2517
-	add	x4, x25, 1208
-	add	w0, w3, 1
-	ldrh	w1, [x4,w0,sxtw 1]
-	strh	w1, [x4,w3,sxtw 1]
-	uxth	w3, w0
-	b	.L2509
-.L2517:
-	sub	w2, w2, #1
-	strh	w2, [x19,2486]
-.L2508:
-	add	w20, w20, 1
-	uxth	w20, w20
-	b	.L2507
-.L2516:
-	add	w21, w21, 1
-	uxth	w21, w21
-	b	.L2514
-.L2515:
+.L2462:
+	add	x0, x27, :lo12:.LANCHOR2
+	ldrh	w1, [x0, 2276]
+	cmp	w1, w20
+	bhi	.L2468
 	bl	FtlGcReFreshBadBlk
-.L2506:
+.L2461:
 	mov	w0, 0
-	ldr	x27, [sp,80]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
+	ldr	x27, [sp, 80]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
 	ldp	x29, x30, [sp], 96
 	ret
+.L2468:
+	add	x0, x0, 2304
+	mov	w1, w23
+	mov	w19, 0
+	ldrb	w0, [x0, w20, sxtw]
+	bl	V2P_block
+	and	w24, w0, 65535
+.L2463:
+	add	x25, x27, :lo12:.LANCHOR2
+	ldrh	w0, [x25, 2486]
+	cmp	w0, w19
+	bhi	.L2467
+	add	w20, w20, 1
+	and	w20, w20, 65535
+	b	.L2462
+.L2467:
+	add	x0, x22, :lo12:.LANCHOR4
+	add	w26, w19, 1
+	add	x0, x0, 1720
+	ldrh	w0, [x0, w19, sxtw 1]
+	cmp	w0, w24
+	bne	.L2464
+	mov	w1, w24
+	adrp	x0, .LC150
+	add	x0, x0, :lo12:.LC150
+	bl	printk
+	mov	w0, w24
+	bl	FtlBbmMapBadBlock
+	bl	FtlBbmTblFlush
+	ldrh	w0, [x25, 2486]
+	mov	w1, w26
+.L2465:
+	cmp	w19, w0
+	bcc	.L2466
+	add	x1, x27, :lo12:.LANCHOR2
+	sub	w0, w0, #1
+	strh	w0, [x1, 2486]
+.L2464:
+	and	w19, w26, 65535
+	b	.L2463
+.L2466:
+	sub	w2, w1, #1
+	ldrh	w3, [x21, w1, sxtw 1]
+	add	w19, w19, 1
+	add	w1, w1, 1
+	and	w19, w19, 65535
+	strh	w3, [x21, w2, sxtw 1]
+	b	.L2465
 	.size	FtlGcFreeBadSuperBlk, .-FtlGcFreeBadSuperBlk
 	.align	2
 	.global	update_vpc_list
 	.type	update_vpc_list, %function
 update_vpc_list:
-	stp	x29, x30, [sp, -32]!
+	stp	x29, x30, [sp, -16]!
 	adrp	x1, .LANCHOR2+2712
+	and	w14, w0, 65535
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	uxth	w19, w0
-	ldr	x1, [x1,#:lo12:.LANCHOR2+2712]
-	ubfiz	x0, x19, 1, 16
-	ldrh	w1, [x1,x0]
-	cbnz	w1, .L2519
-	adrp	x0, .LANCHOR5
-	adrp	x20, .LANCHOR4
-	add	x0, x0, :lo12:.LANCHOR5
-	ldrh	w2, [x0,592]
-	cmp	w2, w19
-	bne	.L2520
+	ldr	x1, [x1, #:lo12:.LANCHOR2+2712]
+	ubfiz	x0, x14, 1, 16
+	ldrh	w0, [x1, x0]
+	cbnz	w0, .L2474
+	adrp	x8, .LANCHOR4
+	add	x0, x8, :lo12:.LANCHOR4
+	ldrh	w1, [x0, 1104]
+	cmp	w1, w14
+	bne	.L2475
 	mov	w1, -1
-	strh	w1, [x0,592]
-	b	.L2521
-.L2520:
-	add	x2, x20, :lo12:.LANCHOR4
-	mov	w0, w1
-	ldrh	w3, [x2,784]
-	cmp	w3, w19
-	beq	.L2522
-	ldrh	w3, [x2,832]
-	cmp	w3, w19
-	beq	.L2522
-	ldrh	w2, [x2,880]
-	cmp	w2, w19
-	beq	.L2522
-.L2521:
-	add	x20, x20, :lo12:.LANCHOR4
-	mov	w1, w19
-	add	x0, x20, 744
+	strh	w1, [x0, 1104]
+.L2476:
+	add	x8, x8, :lo12:.LANCHOR4
+	mov	w1, w14
+	add	x0, x8, 744
 	bl	List_remove_node
-	ldrh	w0, [x20,760]
+	ldrh	w0, [x8, 760]
 	sub	w0, w0, #1
-	strh	w0, [x20,760]
-	mov	w0, w19
+	strh	w0, [x8, 760]
+	mov	w0, w14
 	bl	free_data_superblock
-	mov	w0, w19
+	mov	w0, w14
 	bl	FtlGcFreeBadSuperBlk
 	mov	w0, 1
-	b	.L2522
-.L2519:
-	mov	w0, w19
-	bl	List_update_data_list
-	mov	w0, 0
-.L2522:
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 32
+.L2473:
+	ldp	x29, x30, [sp], 16
 	ret
+.L2475:
+	ldrh	w1, [x0, 784]
+	cmp	w1, w14
+	beq	.L2480
+	ldrh	w1, [x0, 832]
+	cmp	w1, w14
+	beq	.L2480
+	ldrh	w0, [x0, 880]
+	cmp	w0, w14
+	bne	.L2476
+.L2480:
+	mov	w0, 0
+	b	.L2473
+.L2474:
+	mov	w0, w14
+	bl	List_update_data_list
+	b	.L2480
 	.size	update_vpc_list, .-update_vpc_list
 	.align	2
 	.global	decrement_vpc_count
 	.type	decrement_vpc_count, %function
 decrement_vpc_count:
-	stp	x29, x30, [sp, -64]!
+	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	uxth	w19, w0
+	stp	x19, x20, [sp, 16]
+	and	w19, w0, 65535
+	stp	x21, x22, [sp, 32]
 	mov	w0, 65535
-	stp	x21, x22, [sp,32]
-	str	x23, [sp,48]
+	adrp	x20, .LANCHOR4
 	cmp	w19, w0
-	beq	.L2527
-	adrp	x20, .LANCHOR2
+	beq	.L2483
+	adrp	x21, .LANCHOR2
+	add	x21, x21, :lo12:.LANCHOR2
 	ubfiz	x22, x19, 1, 16
-	add	x20, x20, :lo12:.LANCHOR2
-	ldr	x0, [x20,2712]
-	ldrh	w2, [x0,x22]
-	cbnz	w2, .L2528
-	adrp	x0, .LC151
+	ldr	x1, [x21, 2712]
+	ldrh	w0, [x1, x22]
+	cbnz	w0, .L2484
 	mov	w1, w19
+	mov	w2, 0
+	adrp	x0, .LC151
 	add	x0, x0, :lo12:.LC151
-	adrp	x21, .LANCHOR4
-	add	x21, x21, :lo12:.LANCHOR4
 	bl	printk
-	add	x23, x21, 768
-	ldr	x0, [x20,2712]
+	add	x20, x20, :lo12:.LANCHOR4
+	ldr	x0, [x21, 2712]
+	add	x6, x20, 768
 	mov	w1, 32
-	strh	w1, [x0,x22]
-	mov	x0, x23
+	strh	w1, [x0, x22]
 	mov	w1, w19
+	mov	x0, x6
 	bl	test_node_in_list
-	cbz	w0, .L2529
+	cbz	w0, .L2485
 	mov	w1, w19
-	mov	x0, x23
+	mov	x0, x6
 	bl	List_remove_node
-	ldrh	w0, [x21,776]
+	ldrh	w0, [x20, 776]
 	sub	w0, w0, #1
-	strh	w0, [x21,776]
+	strh	w0, [x20, 776]
 	mov	w0, w19
 	bl	INSERT_DATA_LIST
-	ldr	x2, [x20,2712]
+	ldr	x0, [x21, 2712]
+	mov	w1, w19
+	ldrh	w2, [x0, x22]
 	adrp	x0, .LC152
 	add	x0, x0, :lo12:.LC152
-	mov	w1, w19
-	ldrh	w2, [x2,x22]
 	bl	printk
-.L2529:
+.L2485:
 	mov	w0, w19
 	bl	FtlGcRefreshBlock
-	b	.L2536
-.L2528:
-	sub	w2, w2, #1
-	strh	w2, [x0,x22]
-.L2527:
-	adrp	x20, .LANCHOR5
-	mov	w0, 65535
-	add	x20, x20, :lo12:.LANCHOR5
-	ldrh	w1, [x20,1184]
-	cmp	w1, w0
-	bne	.L2531
-	strh	w19, [x20,1184]
-.L2536:
-	mov	w0, 0
-	b	.L2530
-.L2531:
-	cmp	w1, w19
+.L2488:
 	mov	w0, 0
-	beq	.L2530
-	mov	w0, w1
+	b	.L2482
+.L2484:
+	sub	w0, w0, #1
+	strh	w0, [x1, x22]
+.L2483:
+	add	x20, x20, :lo12:.LANCHOR4
+	mov	w1, 65535
+	ldrh	w0, [x20, 1696]
+	cmp	w0, w1
+	bne	.L2487
+	strh	w19, [x20, 1696]
+	b	.L2488
+.L2487:
+	cmp	w19, w0
+	beq	.L2488
 	bl	update_vpc_list
-	cmp	w0, wzr
+	cmp	w0, 0
 	cset	w0, ne
-	strh	w19, [x20,1184]
-.L2530:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldr	x23, [sp,48]
-	ldp	x29, x30, [sp], 64
+	strh	w19, [x20, 1696]
+.L2482:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 48
 	ret
 	.size	decrement_vpc_count, .-decrement_vpc_count
 	.align	2
 	.global	FtlRecoverySuperblock
 	.type	FtlRecoverySuperblock, %function
 FtlRecoverySuperblock:
-	stp	x29, x30, [sp, -224]!
+	stp	x29, x30, [sp, -176]!
 	mov	w2, 65535
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
+	stp	x19, x20, [sp, 16]
 	mov	x19, x0
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
 	ldrh	w0, [x0]
 	cmp	w0, w2
-	beq	.L2698
-	ldrh	w0, [x19,2]
+	beq	.L2639
+	ldrh	w0, [x19, 2]
 	adrp	x20, .LANCHOR2
-	str	w0, [x29,204]
+	str	w0, [x29, 156]
 	add	x0, x20, :lo12:.LANCHOR2
-	ldrb	w28, [x19,6]
-	ldr	w1, [x29,204]
-	ldrh	w0, [x0,2344]
+	ldr	w1, [x29, 156]
+	ldrh	w0, [x0, 2344]
 	cmp	w0, w1
-	bne	.L2540
-	strh	wzr, [x19,4]
-	b	.L2704
-.L2540:
-	ldrh	w0, [x19,16]
+	bne	.L2496
+	strh	wzr, [x19, 4]
+.L2646:
+	strb	wzr, [x19, 6]
+.L2639:
+	ldp	x19, x20, [sp, 16]
+	mov	w0, 0
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 176
+	ret
+.L2496:
+	ldrh	w0, [x19, 16]
 	mov	w1, 0
-.L2541:
+.L2497:
 	cmp	w0, w2
-	bne	.L2707
-	add	w1, w1, 1
-	uxth	w1, w1
-	add	x0, x19, w1, sxtw 1
-	ldrh	w0, [x0,16]
-	b	.L2541
-.L2707:
-	ldrb	w1, [x19,8]
+	beq	.L2498
+	ldrb	w1, [x19, 6]
+	str	w1, [x29, 140]
+	ldrb	w1, [x19, 8]
 	cmp	w1, 1
-	bne	.L2543
+	bne	.L2499
 	bl	FtlGetLastWrittenPage
-	cmn	w0, #1
 	mov	w21, w0
-	beq	.L2544
+	cmn	w0, #1
+	beq	.L2500
 	add	x0, x20, :lo12:.LANCHOR2
-	mov	w23, w21
-	ldrb	w0, [x0,1220]
-	cbnz	w0, .L2618
+	ldrb	w0, [x0, 1220]
+	cbnz	w0, .L2572
 	adrp	x0, .LANCHOR0
 	add	x0, x0, :lo12:.LANCHOR0
 	add	x0, x0, 144
-	ldrh	w23, [x0,w21,sxtw 1]
-	b	.L2618
-.L2543:
-	mov	w1, 0
-	bl	FtlGetLastWrittenPage
-	cmn	w0, #1
-	mov	w21, w0
-	beq	.L2544
-	mov	w23, w0
-.L2618:
+	ldrh	w23, [x0, w21, sxtw 1]
+.L2501:
 	add	x0, x20, :lo12:.LANCHOR2
-	mov	x2, x19
-	mov	w25, 0
+	add	x1, x19, 16
+	str	x1, [x29, 144]
+	add	x3, x19, 16
+	mov	w28, 0
 	mov	w8, 65535
+	ldrh	w1, [x0, 2276]
 	mov	w9, 56
+	ldrh	w7, [x0, 2356]
 	mov	w10, 4
-	ldrh	w4, [x0,2276]
-	ldrh	w7, [x0,2356]
-	add	x4, x19, x4, lsl 1
-	b	.L2546
-.L2544:
-	strh	wzr, [x19,2]
-.L2704:
-	strb	wzr, [x19,6]
-	b	.L2698
-.L2548:
-	ldrh	w1, [x2,16]
-	cmp	w1, w8
-	beq	.L2547
-	add	x5, x20, :lo12:.LANCHOR2
-	orr	w1, w23, w1, lsl 10
-	umull	x0, w25, w9
-	add	w3, w25, 1
-	ldr	x6, [x5,2520]
-	add	x6, x6, x0
-	str	w1, [x6,4]
-	ldr	x1, [x5,2520]
-	ldr	x5, [x5,2656]
-	add	x0, x1, x0
-	mul	w1, w25, w7
-	uxth	w25, w3
-	str	xzr, [x0,8]
-	sdiv	w1, w1, w10
-	add	x1, x5, w1, sxtw 2
-	str	x1, [x0,16]
-.L2547:
-	add	x2, x2, 2
-.L2546:
-	cmp	x2, x4
-	bne	.L2548
-	ldrb	w0, [x19,8]
-	str	wzr, [x29,200]
+	add	x1, x1, 8
+	add	x1, x19, x1, lsl 1
+.L2502:
+	cmp	x3, x1
+	bne	.L2504
+	ldrb	w0, [x19, 8]
 	cmp	w0, 1
-	bne	.L2549
+	bne	.L2573
 	add	x0, x20, :lo12:.LANCHOR2
-	ldrb	w0, [x0,1220]
-	cmp	w0, wzr
+	ldrb	w0, [x0, 1220]
+	cmp	w0, 0
 	cset	w0, ne
-	str	w0, [x29,200]
-.L2549:
-	add	x22, x20, :lo12:.LANCHOR2
-	ldr	w2, [x29,200]
-	mov	w1, w25
-	mov	x26, 0
-	mov	w24, 65535
-	adrp	x27, .LANCHOR5
-	ldr	x0, [x22,2520]
+	str	w0, [x29, 152]
+.L2505:
+	add	x24, x20, :lo12:.LANCHOR2
+	ldr	w2, [x29, 152]
+	mov	w1, w28
+	adrp	x25, .LC153
+	adrp	x26, .LANCHOR4
+	add	x25, x25, :lo12:.LC153
+	ldr	x0, [x24, 2520]
+	add	x26, x26, :lo12:.LANCHOR4
+	mov	x27, 0
 	bl	FlashReadPages
-	ldr	w0, [x22,2400]
-	adrp	x22, .LC153
-	str	w0, [x29,192]
-	add	x22, x22, :lo12:.LC153
-	uxth	w0, w23
-	str	w0, [x29,184]
-.L2550:
-	uxth	w2, w26
-	cmp	w2, w25
-	bcs	.L2557
-	add	x6, x20, :lo12:.LANCHOR2
-	mov	x0, 56
-	mul	x0, x26, x0
-	ldr	x4, [x6,2520]
-	add	x1, x4, x0
-	ldr	w0, [x4,x0]
-	cbnz	w0, .L2551
-	ldr	x7, [x1,16]
-	ldr	w4, [x7,4]
-	cmn	w4, #1
-	beq	.L2552
-	ldr	w1, [x6,2400]
-	mov	w0, w4
-	str	x7, [x29,152]
-	str	x2, [x29,160]
-	str	x4, [x29,168]
-	str	x6, [x29,176]
-	bl	ftl_cmp_data_ver
-	ldr	x6, [x29,176]
-	ldr	x4, [x29,168]
-	ldr	x2, [x29,160]
-	ldr	x7, [x29,152]
-	cbz	w0, .L2552
-	add	w4, w4, 1
-	str	w4, [x6,2400]
-.L2552:
-	ldr	w0, [x7]
-	cmn	w0, #1
-	bne	.L2553
-.L2557:
-	cmp	w2, w25
-	bne	.L2699
+	ldr	w22, [x24, 2400]
+	mov	w4, 65535
+	sub	w22, w22, #1
+.L2506:
+	and	w0, w27, 65535
+	cmp	w28, w0
+	bhi	.L2511
+	bne	.L2509
 	add	x0, x20, :lo12:.LANCHOR2
 	add	w21, w21, 1
-	uxth	w21, w21
-	ldr	x0, [x0,2520]
-	ldr	w0, [x0,4]
-	b	.L2700
-.L2551:
-	ldr	w1, [x1,4]
-	mov	x0, x22
-	bl	printk
-	ldr	w24, [x29,184]
-	add	x0, x27, :lo12:.LANCHOR5
-	ldrh	w1, [x19]
-	strh	w1, [x0,1242]
-.L2553:
-	add	x26, x26, 1
-	b	.L2550
-.L2699:
-	add	x0, x20, :lo12:.LANCHOR2
-	mov	w1, 56
-	uxth	w21, w21
-	umull	x2, w2, w1
-	ldr	x0, [x0,2520]
-	add	x2, x0, x2
-	ldr	w0, [x2,4]
-.L2700:
-	lsr	x0, x0, 10
+	and	w21, w21, 65535
+	ldr	x0, [x0, 2520]
+	ldr	w0, [x0, 4]
+.L2641:
+	lsr	w0, w0, 10
 	bl	P2V_plane
-	uxth	w26, w0
-	ldrb	w1, [x19,8]
+	ldrb	w1, [x19, 8]
+	and	w28, w0, 65535
 	cmp	w1, 1
-	bne	.L2559
+	bne	.L2513
 	add	x0, x20, :lo12:.LANCHOR2
-	ldrb	w0, [x0,1220]
-	cbnz	w0, .L2559
+	ldrb	w0, [x0, 1220]
+	cbnz	w0, .L2513
 	adrp	x0, .LANCHOR0
 	add	x0, x0, :lo12:.LANCHOR0
 	add	x0, x0, 144
-	ldrh	w21, [x0,w21,sxtw 1]
-.L2559:
+	ldrh	w21, [x0, w21, sxtw 1]
+.L2513:
 	add	x0, x20, :lo12:.LANCHOR2
-	ldrh	w0, [x0,2344]
+	ldrh	w0, [x0, 2344]
 	cmp	w0, w21
-	bne	.L2560
-	strh	w21, [x19,2]
-	strb	wzr, [x19,6]
-	strh	wzr, [x19,4]
-.L2560:
-	uxth	w0, w28
-	str	w0, [x29,160]
-	ldr	w0, [x29,204]
+	bne	.L2514
+	strh	w21, [x19, 2]
+	strb	wzr, [x19, 6]
+	strh	wzr, [x19, 4]
+.L2514:
+	ldrh	w0, [x29, 140]
+	str	w0, [x29, 140]
+	ldr	w0, [x29, 156]
 	cmp	w21, w0
-	bne	.L2561
-	ldr	w0, [x29,160]
-	cmp	w26, w0
-	beq	.L2705
-.L2561:
-	ldr	w0, [x29,192]
-	adrp	x25, .LANCHOR5
-	sub	w22, w0, #1
+	ldr	w0, [x29, 140]
+	ccmp	w28, w0, 0, eq
+	bne	.L2515
+.L2647:
+	mov	w2, w28
+	mov	w1, w21
+	mov	x0, x19
+	bl	ftl_sb_update_avl_pages
+	b	.L2639
+.L2498:
+	add	w1, w1, 1
+	and	w1, w1, 65535
+	add	x0, x19, w1, sxtw 1
+	ldrh	w0, [x0, 16]
+	b	.L2497
+.L2499:
+	mov	w1, 0
+	bl	FtlGetLastWrittenPage
+	mov	w21, w0
+	cmn	w0, #1
+	beq	.L2500
+.L2572:
+	mov	w23, w21
+	b	.L2501
+.L2500:
+	strh	wzr, [x19, 2]
+	b	.L2646
+.L2504:
+	ldrh	w2, [x3]
+	cmp	w2, w8
+	beq	.L2503
+	umull	x6, w28, w9
+	ldr	x5, [x0, 2520]
+	orr	w2, w23, w2, lsl 10
+	add	x5, x5, x6
+	str	w2, [x5, 4]
+	mul	w2, w28, w7
+	add	w28, w28, 1
+	ldr	x4, [x0, 2520]
+	and	w28, w28, 65535
+	ldr	x5, [x0, 2656]
+	sdiv	w2, w2, w10
+	add	x4, x4, x6
+	add	x2, x5, w2, sxtw 2
+	stp	xzr, x2, [x4, 8]
+.L2503:
+	add	x3, x3, 2
+	b	.L2502
+.L2573:
+	str	wzr, [x29, 152]
+	b	.L2505
+.L2511:
+	mov	x0, 56
+	ldr	x3, [x24, 2520]
+	mul	x0, x27, x0
+	add	x1, x3, x0
+	ldr	w0, [x3, x0]
+	cbnz	w0, .L2507
+	ldr	x5, [x1, 16]
+	ldr	w3, [x5, 4]
+	cmn	w3, #1
+	beq	.L2508
+	ldr	w1, [x24, 2400]
+	mov	w0, w3
+	bl	ftl_cmp_data_ver
+	cbz	w0, .L2508
+	add	w3, w3, 1
+	str	w3, [x24, 2400]
+.L2508:
+	ldr	w0, [x5]
+	cmn	w0, #1
+	bne	.L2510
+.L2509:
+	add	x0, x20, :lo12:.LANCHOR2
+	and	x27, x27, 65535
+	mov	x1, 56
+	and	w21, w21, 65535
+	ldr	x0, [x0, 2520]
+	madd	x27, x27, x1, x0
+	ldr	w0, [x27, 4]
+	b	.L2641
+.L2507:
+	ldr	w1, [x1, 4]
+	mov	x0, x25
+	bl	printk
+	ldrh	w0, [x19]
+	and	w4, w23, 65535
+	strh	w0, [x26, 1754]
+.L2510:
+	add	x27, x27, 1
+	b	.L2506
+.L2515:
 	mov	w0, 65535
-	cmp	w24, w0
-	bne	.L2562
-	cbnz	w1, .L2563
-.L2562:
-	add	x0, x25, :lo12:.LANCHOR5
-	uxth	w6, w23
-	ldr	w1, [x0,1196]
+	adrp	x27, .LANCHOR4
+	cmp	w4, w0
+	bne	.L2516
+	cbnz	w1, .L2517
+.L2516:
+	add	x0, x27, :lo12:.LANCHOR4
+	and	w6, w23, 65535
+	ldr	w1, [x0, 1708]
 	cmn	w1, #1
-	bne	.L2564
-	str	w22, [x0,1196]
-.L2564:
-	add	x0, x25, :lo12:.LANCHOR5
-	ldr	w24, [x29,204]
-	ldr	w3, [x0,1196]
-	ldr	w0, [x29,204]
+	bne	.L2518
+	str	w22, [x0, 1708]
+.L2518:
+	add	x0, x27, :lo12:.LANCHOR4
+	ldr	w5, [x0, 1708]
+	ldr	w0, [x29, 156]
 	add	w0, w0, 7
 	cmp	w0, w23, uxth
-	bge	.L2565
-	sub	w24, w6, #7
-	uxth	w24, w24
-.L2565:
-	mov	w28, -1
-	adrp	x5, .LANCHOR0
-	mov	w27, w28
-	mov	w4, 65535
-	mov	w7, 56
-	add	x5, x5, :lo12:.LANCHOR0
-.L2566:
-	cmp	w24, w6
-	bhi	.L2579
-	add	x0, x20, :lo12:.LANCHOR2
-	mov	w23, 0
-	ldrh	w2, [x0,2276]
-	mov	x0, x19
-	add	x2, x19, x2, lsl 1
-.L2580:
-	cmp	x0, x2
-	beq	.L2708
-	ldrh	w1, [x0,16]
-	cmp	w1, w4
-	beq	.L2567
-	add	x9, x20, :lo12:.LANCHOR2
-	orr	w1, w24, w1, lsl 10
-	umull	x8, w23, w7
-	add	w23, w23, 1
-	ldr	x9, [x9,2520]
-	uxth	w23, w23
-	add	x8, x9, x8
-	str	w1, [x8,4]
-.L2567:
-	add	x0, x0, 2
-	b	.L2580
-.L2708:
-	add	x8, x20, :lo12:.LANCHOR2
-	ldr	w2, [x29,200]
-	mov	w1, w23
-	str	x5, [x29,144]
-	str	x7, [x29,152]
-	ldr	x0, [x8,2520]
-	str	x4, [x29,168]
-	str	x3, [x29,176]
-	str	x6, [x29,184]
-	str	x8, [x29,192]
+	bge	.L2574
+	sub	w23, w6, #7
+	and	w23, w23, 65535
+.L2519:
+	adrp	x4, .LANCHOR0
+	add	x4, x4, :lo12:.LANCHOR0
+	mov	w26, -1
+	add	x3, x20, :lo12:.LANCHOR2
+	mov	w25, w26
+	add	x4, x4, 1168
+.L2520:
+	cmp	w23, w6
+	bhi	.L2533
+	ldrh	w0, [x3, 2276]
+	mov	w24, 0
+	mov	w9, 65535
+	mov	w8, 56
+	add	x0, x0, 8
+	ldr	x1, [x29, 144]
+	add	x0, x19, x0, lsl 1
+	b	.L2534
+.L2574:
+	ldr	w23, [x29, 156]
+	b	.L2519
+.L2522:
+	ldrh	w2, [x1]
+	cmp	w2, w9
+	beq	.L2521
+	ldr	x7, [x3, 2520]
+	orr	w2, w23, w2, lsl 10
+	umaddl	x7, w24, w8, x7
+	add	w24, w24, 1
+	and	w24, w24, 65535
+	str	w2, [x7, 4]
+.L2521:
+	add	x1, x1, 2
+.L2534:
+	cmp	x0, x1
+	bne	.L2522
+	ldr	w2, [x29, 152]
+	mov	w1, w24
+	ldr	x0, [x3, 2520]
+	str	x4, [x29, 104]
+	str	w5, [x29, 112]
+	str	w6, [x29, 120]
+	str	x3, [x29, 128]
 	bl	FlashReadPages
-	ldr	x8, [x29,192]
-	mov	w1, 0
-	ldr	x6, [x29,184]
-	sxtw	x10, w24
-	ldr	x3, [x29,176]
-	ldr	x0, [x8,2520]
-	ldrb	w9, [x8,1220]
-	ldr	x4, [x29,168]
-	add	x0, x0, 16
-	ldr	x7, [x29,152]
-	ldr	x5, [x29,144]
-.L2569:
-	cmp	w1, w23
-	beq	.L2709
-	ldr	w2, [x0,-16]
-	cbnz	w2, .L2570
-	ldr	x2, [x0]
-	ldrh	w8, [x2]
-	cmp	w8, w4
-	beq	.L2571
-	ldr	w8, [x2,4]
-	cmn	w8, #1
-	beq	.L2571
-	add	x2, x25, :lo12:.LANCHOR5
-	cmn	w28, #1
-	ldr	w27, [x2,1196]
-	str	w8, [x2,1196]
-	bne	.L2571
-	add	x2, x5, 1168
-	ldrh	w2, [x2,x10,lsl 1]
-	cmp	w2, w4
-	bne	.L2572
-	cbz	w9, .L2571
-.L2572:
-	cmp	w27, w22
-	csinv	w28, w27, wzr, ne
-	b	.L2571
-.L2570:
-	add	x0, x25, :lo12:.LANCHOR5
+	ldr	x3, [x29, 128]
+	mov	w1, 56
+	ldr	w5, [x29, 112]
+	add	x2, x27, :lo12:.LANCHOR4
+	ldr	w6, [x29, 120]
+	sxtw	x9, w23
+	ldr	x4, [x29, 104]
+	ldr	x0, [x3, 2520]
+	ldrb	w8, [x3, 1220]
+	nop // between mem op and mult-accumulate
+	umaddl	x24, w24, w1, x0
+	mov	w1, 65535
+.L2523:
+	cmp	x24, x0
+	bne	.L2532
+	add	w23, w23, 1
+	and	w23, w23, 65535
+	b	.L2520
+.L2532:
+	ldr	w7, [x0]
+	cbnz	w7, .L2524
+	ldr	x7, [x0, 16]
+	ldrh	w10, [x7]
+	cmp	w10, w1
+	beq	.L2525
+	ldr	w7, [x7, 4]
+	cmn	w7, #1
+	beq	.L2525
+	ldr	w25, [x2, 1708]
+	cmn	w26, #1
+	str	w7, [x2, 1708]
+	bne	.L2525
+	ldrh	w7, [x4, x9, lsl 1]
+	cmp	w7, w1
+	bne	.L2526
+	cbz	w8, .L2525
+.L2526:
+	cmp	w22, w25
+	csel	w26, w26, w25, eq
+.L2525:
+	add	x0, x0, 56
+	b	.L2523
+.L2524:
+	add	x0, x27, :lo12:.LANCHOR4
 	ldrh	w1, [x19]
-	strh	w1, [x0,1242]
-	ldrb	w1, [x19,8]
-	cbnz	w1, .L2563
+	strh	w1, [x0, 1754]
+	ldrb	w1, [x19, 8]
+	cbnz	w1, .L2517
 	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
 	add	x1, x1, 1168
-	ldrh	w2, [x1,w24,sxtw 1]
+	ldrh	w2, [x1, w23, sxtw 1]
 	mov	w1, 65535
 	cmp	w2, w1
-	bne	.L2574
-	cmn	w28, #1
-	beq	.L2575
-	str	w28, [x0,1196]
-	b	.L2563
-.L2575:
-	cmp	w3, w22
-	beq	.L2576
-	str	w3, [x0,1196]
-	b	.L2563
-.L2576:
-	ldr	w1, [x0,1196]
-	b	.L2706
-.L2574:
-	cmp	w27, w22
-	beq	.L2577
-	cmn	w27, #1
-	beq	.L2563
-	str	w27, [x0,1196]
-	b	.L2563
-.L2577:
-	ldr	w1, [x0,1196]
-	cmp	w1, w22
-	beq	.L2563
-.L2706:
-	sub	w1, w1, #1
-	b	.L2701
-.L2571:
-	add	w1, w1, 1
-	add	x0, x0, 56
-	uxth	w1, w1
-	b	.L2569
-.L2709:
-	add	w24, w24, 1
-	uxth	w24, w24
-	b	.L2566
-.L2579:
-	add	x0, x25, :lo12:.LANCHOR5
-	mov	w1, -1
-.L2701:
-	str	w1, [x0,1196]
-.L2563:
-	add	x0, x25, :lo12:.LANCHOR5
+	bne	.L2528
+	cmn	w26, #1
+	beq	.L2529
+	str	w26, [x0, 1708]
+.L2517:
+	add	x0, x27, :lo12:.LANCHOR4
+	ldr	w24, [x29, 156]
+	add	x20, x20, :lo12:.LANCHOR2
 	mov	w1, 1
-	ldr	w23, [x29,204]
-	strh	w1, [x0,1244]
+	strh	w1, [x0, 1756]
+.L2535:
+	ldrh	w0, [x20, 2276]
+	mov	w23, 0
+	ldrb	w6, [x20, 1220]
+	mov	w7, 65535
+	add	x0, x0, 8
+	ldr	x1, [x29, 144]
+	add	x0, x19, x0, lsl 1
+.L2536:
+	cmp	x0, x1
+	bne	.L2539
+	ldr	w2, [x29, 152]
+	mov	w1, w23
+	ldr	x0, [x20, 2520]
+	mov	x25, 0
+	bl	FlashReadPages
+	mov	w0, 56
+	umull	x0, w23, w0
+	add	x23, x27, :lo12:.LANCHOR4
+	str	x0, [x29, 120]
 	adrp	x0, .LC155
 	add	x0, x0, :lo12:.LC155
-	str	x0, [x29,136]
-	adrp	x0, .LC154
-	add	x0, x0, :lo12:.LC154
-	str	x0, [x29,128]
-	adrp	x0, .LANCHOR4
-	add	x0, x0, :lo12:.LANCHOR4
-	str	x0, [x29,168]
-.L2581:
-	add	x0, x20, :lo12:.LANCHOR2
-	mov	x1, x19
-	str	wzr, [x29,192]
-	mov	w7, 65535
-	mov	w8, 56
-	ldrh	w3, [x0,2276]
-	ldrb	w6, [x0,1220]
-	add	x3, x19, x3, lsl 1
-.L2582:
-	cmp	x1, x3
-	beq	.L2710
-	ldrh	w2, [x1,16]
-	cmp	w2, w7
-	beq	.L2583
-	ldr	w0, [x29,192]
-	add	x5, x20, :lo12:.LANCHOR2
-	orr	w2, w23, w2, lsl 10
-	ldr	x4, [x5,2520]
-	umull	x0, w0, w8
-	add	x4, x4, x0
-	str	w2, [x4,4]
-	ldrb	w2, [x19,8]
+	str	x0, [x29, 112]
+	add	x0, x23, 1768
+	str	x0, [x29, 104]
+.L2540:
+	ldr	x0, [x29, 120]
+	cmp	x0, x25
+	bne	.L2565
+	ldrb	w0, [x19, 8]
+	add	w24, w24, 1
+	and	w24, w24, 65535
+	cmp	w0, 1
+	bne	.L2566
+	ldrb	w0, [x20, 1220]
+	cbz	w0, .L2566
+	ldrh	w0, [x20, 2346]
+	cmp	w0, w24
+	bne	.L2566
+	cmp	w21, w24
+	beq	.L2542
+.L2566:
+	ldrh	w0, [x20, 2344]
+	cmp	w0, w24
+	bne	.L2535
+	ldrh	w1, [x20, 2276]
+	mov	w0, 0
+	strh	w24, [x19, 2]
+	mov	w2, 65535
+	strh	wzr, [x19, 4]
+.L2567:
+	cmp	w0, w1
+	beq	.L2639
+	ldr	x4, [x29, 144]
+	ldrh	w3, [x4], 2
+	str	x4, [x29, 144]
+	cmp	w3, w2
+	beq	.L2568
+	strb	w0, [x19, 6]
+	b	.L2639
+.L2529:
+	cmp	w22, w5
+	beq	.L2530
+	str	w5, [x0, 1708]
+	b	.L2517
+.L2530:
+	ldr	w1, [x0, 1708]
+.L2648:
+	sub	w1, w1, #1
+.L2642:
+	str	w1, [x0, 1708]
+	b	.L2517
+.L2528:
+	cmp	w25, w22
+	beq	.L2531
+	cmn	w25, #1
+	beq	.L2517
+	str	w25, [x0, 1708]
+	b	.L2517
+.L2531:
+	ldr	w1, [x0, 1708]
+	cmp	w22, w1
+	bne	.L2648
+	b	.L2517
+.L2533:
+	add	x0, x27, :lo12:.LANCHOR4
+	mov	w1, -1
+	b	.L2642
+.L2539:
+	ldrh	w3, [x1]
+	cmp	w3, w7
+	beq	.L2537
+	mov	w2, 56
+	ldr	x4, [x20, 2520]
+	orr	w3, w24, w3, lsl 10
+	umull	x5, w23, w2
+	add	x4, x4, x5
+	str	w3, [x4, 4]
+	ldrb	w2, [x19, 8]
 	cmp	w2, 1
-	bne	.L2584
-	cbz	w6, .L2584
-	ldr	x2, [x5,2520]
-	add	x0, x2, x0
-	ldr	w2, [x0,4]
-	orr	w2, w2, -2147483648
-	str	w2, [x0,4]
-.L2584:
-	ldr	w0, [x29,192]
-	add	w0, w0, 1
-	uxth	w0, w0
-	str	w0, [x29,192]
-.L2583:
+	bne	.L2538
+	cbz	w6, .L2538
+	ldr	x2, [x20, 2520]
+	add	x2, x2, x5
+	ldr	w3, [x2, 4]
+	orr	w3, w3, -2147483648
+	str	w3, [x2, 4]
+.L2538:
+	add	w23, w23, 1
+	and	w23, w23, 65535
+.L2537:
 	add	x1, x1, 2
-	b	.L2582
-.L2710:
-	add	x0, x20, :lo12:.LANCHOR2
-	ldr	w1, [x29,192]
-	ldr	w2, [x29,200]
-	ldr	x0, [x0,2520]
-	bl	FlashReadPages
-	str	xzr, [x29,176]
-.L2586:
-	ldrh	w0, [x29,176]
-	ldr	w1, [x29,192]
-	cmp	w1, w0, uxth
-	bls	.L2711
-	ldr	x0, [x29,176]
-	mov	x24, 56
-	mul	x24, x0, x24
-	add	x0, x20, :lo12:.LANCHOR2
-	ldr	x28, [x0,2520]
-	add	x27, x28, x24
-	ldr	w1, [x27,4]
-	str	w1, [x29,220]
-	lsr	x0, x1, 10
-	str	x1, [x29,184]
+	b	.L2536
+.L2565:
+	ldr	x4, [x20, 2520]
+	add	x4, x4, x25
+	ldr	w5, [x4, 4]
+	str	w5, [x29, 172]
+	lsr	w0, w5, 10
 	bl	P2V_plane
-	uxth	w0, w0
-	ldr	w1, [x29,204]
-	cmp	w23, w1
-	ldr	x1, [x29,184]
-	bcc	.L2587
-	ldr	w2, [x29,160]
-	cmp	w0, w2
-	bcs	.L2622
-	ldr	w2, [x29,204]
-	cmp	w23, w2
-	beq	.L2587
-.L2622:
-	cmp	w0, w26
-	bne	.L2623
-	cmp	w23, w21
-	beq	.L2589
-.L2623:
-	ldr	w0, [x28,x24]
+	and	w0, w0, 65535
+	ldr	w1, [x29, 156]
+	cmp	w24, w1
+	bcc	.L2541
+	ldr	w1, [x29, 140]
+	ccmp	w1, w0, 0, eq
+	bhi	.L2541
+	cmp	w24, w21
+	ccmp	w28, w0, 0, eq
+	beq	.L2542
+	ldr	w0, [x4]
 	cmn	w0, #1
-	beq	.L2591
-	ldr	x28, [x27,16]
+	beq	.L2543
+	ldr	x3, [x4, 16]
 	mov	w0, 61589
-	ldrh	w1, [x28]
+	ldrh	w1, [x3]
 	cmp	w1, w0
-	beq	.L2592
+	beq	.L2544
 	ldrh	w0, [x19]
-	b	.L2702
-.L2592:
-	ldr	w22, [x28,4]
+.L2644:
+	bl	decrement_vpc_count
+	b	.L2541
+.L2544:
+	ldr	w22, [x3, 4]
 	cmn	w22, #1
-	beq	.L2593
-	add	x27, x20, :lo12:.LANCHOR2
+	beq	.L2545
+	ldr	w1, [x20, 2400]
 	mov	w0, w22
-	ldr	w1, [x27,2400]
 	bl	ftl_cmp_data_ver
-	cbz	w0, .L2593
+	cbz	w0, .L2545
 	add	w0, w22, 1
-	str	w0, [x27,2400]
-.L2593:
-	ldr	w27, [x28,8]
-	add	x1, x29, 216
-	ldr	w0, [x28,12]
+	str	w0, [x20, 2400]
+.L2545:
+	ldp	w26, w0, [x3, 8]
+	add	x1, x29, 168
+	str	w0, [x29, 164]
 	mov	w2, 0
-	str	w0, [x29,212]
-	mov	w0, w27
+	mov	w0, w26
 	bl	log2phys
-	ldr	w28, [x29,212]
-	add	x0, x25, :lo12:.LANCHOR5
-	str	x0, [x29,144]
-	ldr	w1, [x0,1196]
+	ldr	w1, [x23, 1708]
+	ldr	w3, [x29, 164]
 	cmn	w1, #1
-	beq	.L2594
+	beq	.L2546
 	mov	w0, w22
 	bl	ftl_cmp_data_ver
-	cbz	w0, .L2594
-	cmn	w28, #1
-	beq	.L2595
-	add	x3, x20, :lo12:.LANCHOR2
+	cbz	w0, .L2546
+	cmn	w3, #1
+	beq	.L2547
+	ldr	x0, [x20, 2520]
 	mov	w2, 0
-	str	x3, [x29,120]
-	ldr	x0, [x3,2520]
-	add	x0, x0, x24
-	str	w28, [x0,4]
-	ldr	x1, [x0,16]
-	ldr	x0, [x3,2520]
-	str	x1, [x29,184]
 	mov	w1, 1
-	add	x0, x0, x24
+	add	x0, x0, x25
+	ldr	x4, [x0, 16]
+	str	w3, [x0, 4]
+	str	x4, [x29, 128]
+	ldr	x0, [x20, 2520]
+	add	x0, x0, x25
 	bl	FlashReadPages
-	ldr	x3, [x29,120]
-	ldr	x0, [x29,184]
-	ldr	x2, [x3,2520]
-	ldr	w0, [x0,4]
-	str	w0, [x29,152]
-	add	x4, x2, x24
-	ldr	w0, [x2,x24]
+	ldr	x0, [x20, 2520]
+	ldr	x4, [x29, 128]
+	add	x3, x0, x25
+	ldr	w0, [x0, x25]
 	cmn	w0, #1
-	bne	.L2596
-	b	.L2597
-.L2595:
-	ldr	w0, [x29,220]
-	ldr	w1, [x29,216]
+	bne	.L2548
+.L2549:
+	mov	w0, -1
+	str	w0, [x29, 164]
+.L2556:
+	ldr	w4, [x29, 164]
+	cmn	w4, #1
+	beq	.L2541
+.L2571:
+	lsr	w0, w4, 10
+	bl	P2V_block_in_plane
+	ldr	x3, [x20, 2712]
+	and	w1, w0, 65535
+	ubfiz	x2, x1, 1, 16
+	ldrh	w2, [x3, x2]
+	cbnz	w2, .L2644
+	adrp	x0, .LC154
+	add	x0, x0, :lo12:.LC154
+	bl	printk
+	b	.L2541
+.L2547:
+	ldp	w1, w0, [x29, 168]
 	cmp	w1, w0
-	bne	.L2587
-	mov	w0, w27
-	add	x1, x29, 212
+	bne	.L2541
 	mov	w2, 1
+	add	x1, x29, 164
+	mov	w0, w26
 	bl	log2phys
-	b	.L2587
-.L2596:
-	ldr	x0, [x29,184]
-	ldr	w28, [x0,8]
-	cmp	w28, w27
-	bne	.L2597
-	ldr	x0, [x29,144]
-	ldr	w1, [x29,152]
-	str	x2, [x29,104]
-	ldr	w0, [x0,1196]
-	str	x3, [x29,112]
-	str	x4, [x29,120]
+.L2541:
+	add	x25, x25, 56
+	b	.L2540
+.L2548:
+	ldr	w0, [x4, 8]
+	cmp	w26, w0
+	bne	.L2549
+	ldr	w0, [x4, 4]
+	str	w0, [x29, 128]
+	str	x4, [x29, 96]
+	uxtw	x1, w0
+	ldr	w0, [x23, 1708]
 	bl	ftl_cmp_data_ver
-	ldr	x4, [x29,120]
-	ldr	x3, [x29,112]
-	ldr	x2, [x29,104]
-	cbz	w0, .L2597
-	ldr	w0, [x29,216]
-	ldr	w1, [x29,220]
+	cbz	w0, .L2549
+	ldp	w0, w1, [x29, 168]
+	ldr	x4, [x29, 96]
 	cmp	w0, w1
-	beq	.L2602
-	ldr	w1, [x29,212]
+	ldr	w1, [x29, 164]
+	bne	.L2551
+.L2643:
+	mov	w0, w26
+	bl	FtlReUsePrevPpa
+	b	.L2549
+.L2551:
 	cmp	w0, w1
-	beq	.L2597
+	beq	.L2549
 	cmn	w0, #1
-	beq	.L2600
-	str	w0, [x4,4]
+	beq	.L2552
+	ldr	x4, [x3, 16]
 	mov	w2, 0
-	ldr	x1, [x4,16]
-	ldr	x0, [x3,2520]
-	str	x1, [x29,184]
+	str	w0, [x3, 4]
 	mov	w1, 1
-	add	x0, x0, x24
+	str	x4, [x29, 96]
+	ldr	x0, [x20, 2520]
+	add	x0, x0, x25
 	bl	FlashReadPages
-	b	.L2601
-.L2600:
-	str	w0, [x2,x24]
-.L2601:
-	adrp	x0, .LANCHOR2
-	add	x0, x0, :lo12:.LANCHOR2
-	ldr	x0, [x0,2520]
-	ldr	w0, [x0,x24]
+	ldr	x4, [x29, 96]
+.L2553:
+	adrp	x0, .LANCHOR2+2520
+	ldr	x0, [x0, #:lo12:.LANCHOR2+2520]
+	ldr	w0, [x0, x25]
 	cmn	w0, #1
-	beq	.L2602
-	ldr	x0, [x29,184]
-	ldr	w24, [x0,4]
-	add	x0, x25, :lo12:.LANCHOR5
-	mov	w1, w24
-	ldr	w0, [x0,1196]
+	beq	.L2554
+	ldr	w3, [x4, 4]
+	ldr	w0, [x23, 1708]
+	mov	w1, w3
 	bl	ftl_cmp_data_ver
-	cbz	w0, .L2602
-	ldr	w0, [x29,152]
-	mov	w1, w24
+	cbz	w0, .L2554
+	ldr	w0, [x29, 128]
+	mov	w1, w3
 	bl	ftl_cmp_data_ver
-	cbz	w0, .L2597
-.L2602:
-	ldr	w1, [x29,212]
-	mov	w0, w28
-	bl	FtlReUsePrevPpa
-.L2597:
-	mov	w0, -1
-	str	w0, [x29,212]
-	b	.L2604
-.L2594:
-	ldr	w0, [x29,220]
-	ldr	w1, [x29,216]
+	cbz	w0, .L2549
+.L2554:
+	ldr	w1, [x29, 164]
+	b	.L2643
+.L2552:
+	str	w0, [x3]
+	b	.L2553
+.L2546:
+	ldp	w1, w0, [x29, 168]
 	cmp	w1, w0
-	beq	.L2604
-	cmn	w28, #1
-	beq	.L2606
-	add	x0, x20, :lo12:.LANCHOR2
-	ubfx	x28, x28, 10, 21
-	ldr	w0, [x0,2292]
-	cmp	w28, w0
-	bcs	.L2587
-.L2606:
-	mov	w0, w27
-	add	x1, x29, 220
+	beq	.L2556
+	cmn	w3, #1
+	beq	.L2558
+	ldr	w0, [x20, 2292]
+	ubfx	x3, x3, 10, 21
+	cmp	w3, w0
+	bcs	.L2541
+.L2558:
 	mov	w2, 1
+	add	x1, x29, 172
+	mov	w0, w26
 	bl	log2phys
-	ldr	w28, [x29,216]
-	cmn	w28, #1
-	beq	.L2604
-	ldr	w0, [x29,212]
-	cmp	w28, w0
-	beq	.L2604
-	lsr	x0, x28, 10
+	ldr	w4, [x29, 168]
+	cmn	w4, #1
+	beq	.L2556
+	ldr	w0, [x29, 164]
+	cmp	w4, w0
+	beq	.L2571
+	lsr	w0, w4, 10
 	bl	P2V_block_in_plane
-	uxth	w0, w0
-	ldr	x1, [x29,168]
-	ldrh	w1, [x1,784]
+	ldrh	w1, [x23, 784]
+	and	w0, w0, 65535
 	cmp	w1, w0
-	beq	.L2608
-	ldr	x1, [x29,168]
-	ldrh	w1, [x1,832]
+	beq	.L2561
+	ldrh	w1, [x23, 832]
 	cmp	w1, w0
-	beq	.L2608
-	ldr	x1, [x29,168]
-	ldrh	w1, [x1,880]
+	beq	.L2561
+	ldrh	w1, [x23, 880]
 	cmp	w1, w0
-	bne	.L2604
-.L2608:
-	adrp	x0, .LANCHOR2
-	mov	w1, 1
-	add	x24, x0, :lo12:.LANCHOR2
+	bne	.L2556
+.L2561:
+	ldr	x0, [x20, 2520]
 	mov	w2, 0
-	ldr	x0, [x24,2520]
-	str	w28, [x0,4]
-	ldr	x3, [x0,16]
-	ldr	x0, [x24,2520]
-	str	x3, [x29,184]
+	mov	w1, 1
+	str	w4, [x0, 4]
+	ldr	x3, [x0, 16]
+	ldr	x0, [x20, 2520]
+	str	x3, [x29, 128]
 	bl	FlashReadPages
-	ldr	x0, [x24,2520]
-	ldr	x3, [x29,184]
+	ldr	x0, [x20, 2520]
 	ldr	w0, [x0]
-	ldr	w1, [x3,4]
 	cmn	w0, #1
-	beq	.L2604
+	beq	.L2556
+	ldr	x3, [x29, 128]
 	mov	w0, w22
+	ldr	w1, [x3, 4]
 	bl	ftl_cmp_data_ver
-	cbnz	w0, .L2604
-	mov	w0, w27
-	add	x1, x29, 216
+	cbnz	w0, .L2556
 	mov	w2, 1
+	add	x1, x29, 168
+	mov	w0, w26
 	bl	log2phys
-.L2604:
-	ldr	w0, [x29,212]
-	cmn	w0, #1
-	beq	.L2587
-	lsr	x0, x0, 10
-	bl	P2V_block_in_plane
-	uxth	w1, w0
-	add	x2, x20, :lo12:.LANCHOR2
-	ubfiz	x3, x1, 1, 16
-	ldr	x2, [x2,2712]
-	ldrh	w2, [x2,x3]
-	cbz	w2, .L2609
-.L2702:
-	bl	decrement_vpc_count
-	b	.L2587
-.L2609:
-	ldr	x0, [x29,128]
-	bl	printk
-	b	.L2587
-.L2591:
-	add	x24, x25, :lo12:.LANCHOR5
+	b	.L2556
+.L2543:
 	ldrh	w0, [x19]
 	mov	w2, w22
-	strh	w0, [x24,1242]
-	ldr	x0, [x29,136]
+	strh	w0, [x23, 1754]
+	mov	w1, w5
+	ldr	x0, [x29, 112]
 	bl	printk
-	ldr	w0, [x24,1248]
+	ldr	w0, [x23, 1760]
 	cmp	w0, 31
-	bhi	.L2610
-	add	x1, x24, 1256
-	ldr	w2, [x29,220]
-	str	w2, [x1,w0,uxtw 2]
+	bhi	.L2563
+	ldr	x2, [x29, 104]
+	ldr	w1, [x29, 172]
+	str	w1, [x2, w0, uxtw 2]
 	add	w0, w0, 1
-	str	w0, [x24,1248]
-.L2610:
+	str	w0, [x23, 1760]
+.L2563:
 	ldrh	w0, [x19]
 	bl	decrement_vpc_count
-	add	x0, x25, :lo12:.LANCHOR5
-	ldr	w1, [x0,1196]
-	cmn	w1, #1
-	beq	.L2703
-	cmp	w1, w22
-	bls	.L2587
-.L2703:
-	str	w22, [x0,1196]
-.L2587:
-	ldr	x0, [x29,176]
-	add	x0, x0, 1
-	str	x0, [x29,176]
-	b	.L2586
-.L2711:
-	ldrb	w0, [x19,8]
-	add	w23, w23, 1
-	cmp	w0, 1
-	uxth	w23, w23
-	bne	.L2613
-	add	x0, x20, :lo12:.LANCHOR2
-	ldrb	w1, [x0,1220]
-	cbz	w1, .L2613
-	cmp	w21, w23
-	bne	.L2613
-	ldrh	w0, [x0,2346]
-	cmp	w0, w23
-	beq	.L2589
-.L2613:
-	add	x0, x20, :lo12:.LANCHOR2
-	ldrh	w1, [x0,2344]
-	cmp	w23, w1
-	bne	.L2581
-	ldrh	w2, [x0,2276]
-	mov	w3, 65535
-	strh	w23, [x19,2]
-	mov	x0, 0
-	strh	wzr, [x19,4]
-.L2615:
-	uxth	w1, w0
-	cmp	w1, w2
-	bcs	.L2698
-	add	x0, x0, 1
-	add	x4, x19, x0, lsl 1
-	ldrh	w4, [x4,14]
-	cmp	w4, w3
-	beq	.L2615
-	strb	w1, [x19,6]
-	b	.L2698
-.L2589:
-	strb	w26, [x19,6]
-	strh	w21, [x19,2]
-.L2705:
-	mov	x0, x19
-	mov	w1, w21
-	mov	w2, w26
-	bl	ftl_sb_update_avl_pages
-.L2698:
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 224
-	ret
+	ldr	w0, [x23, 1708]
+	cmn	w0, #1
+	bne	.L2564
+.L2645:
+	str	w22, [x23, 1708]
+	b	.L2541
+.L2564:
+	cmp	w22, w0
+	bcs	.L2541
+	b	.L2645
+.L2568:
+	add	w0, w0, 1
+	and	w0, w0, 65535
+	b	.L2567
+.L2542:
+	strb	w28, [x19, 6]
+	strh	w21, [x19, 2]
+	b	.L2647
 	.size	FtlRecoverySuperblock, .-FtlRecoverySuperblock
 	.align	2
 	.global	FtlSlcSuperblockCheck
 	.type	FtlSlcSuperblockCheck, %function
 FtlSlcSuperblockCheck:
+	ldrh	w1, [x0, 4]
+	cbz	w1, .L2661
+	ldrh	w2, [x0]
+	mov	w1, 65535
+	cmp	w2, w1
+	beq	.L2661
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	ldrh	w1, [x0,4]
-	cbz	w1, .L2712
-	ldrh	w1, [x0]
-	mov	w20, 65535
-	cmp	w1, w20
-	beq	.L2712
+	stp	x19, x20, [sp, 16]
 	mov	x19, x0
-	ldrb	w0, [x0,6]
+	stp	x21, x22, [sp, 32]
 	adrp	x21, .LANCHOR0
-	adrp	x22, .LANCHOR2
-	add	x0, x0, 8
 	add	x21, x21, :lo12:.LANCHOR0
-	ldrh	w0, [x19,x0,lsl 1]
-.L2716:
-	cmp	w0, w20
-	bne	.L2723
-.L2718:
-	ldrb	w0, [x19,6]
-	add	x1, x22, :lo12:.LANCHOR2
-	add	w0, w0, 1
-	ldrh	w1, [x1,2276]
-	uxtb	w0, w0
-	strb	w0, [x19,6]
-	cmp	w1, w0
-	bne	.L2717
-	ldrh	w0, [x19,2]
-	strb	wzr, [x19,6]
-	add	w0, w0, 1
-	strh	w0, [x19,2]
-.L2717:
-	ldrb	w0, [x19,6]
+	adrp	x20, .LANCHOR2
+	ldrb	w0, [x0, 6]
+	add	x22, x20, :lo12:.LANCHOR2
+	add	x21, x21, 1168
 	add	x0, x0, 8
-	ldrh	w0, [x19,x0,lsl 1]
-	b	.L2716
-.L2723:
-	ldrb	w1, [x19,8]
+	ldrh	w1, [x19, x0, lsl 1]
+.L2653:
+	mov	w0, 65535
+	cmp	w1, w0
+	beq	.L2655
+	ldrb	w1, [x19, 8]
 	cmp	w1, 1
-	bne	.L2719
-	add	x0, x22, :lo12:.LANCHOR2
-	ldrb	w0, [x0,1220]
-	cbnz	w0, .L2719
-	ldrh	w2, [x19,2]
-	add	x0, x21, 1168
-	ldrh	w0, [x0,w2,sxtw 1]
-	cmp	w0, w20
-	bne	.L2719
-	ldrh	w0, [x19,4]
+	bne	.L2656
+	ldrb	w2, [x22, 1220]
+	cbnz	w2, .L2656
+	ldrh	w2, [x19, 2]
+	ldrh	w2, [x21, x2, lsl 1]
+	cmp	w2, w0
+	bne	.L2656
+	ldrh	w0, [x19, 4]
 	sub	w0, w0, #1
-	strh	w0, [x19,4]
+	strh	w0, [x19, 4]
 	ldrh	w0, [x19]
 	bl	decrement_vpc_count
-	ldrh	w1, [x19,4]
-	cbnz	w1, .L2718
-	ldrh	w0, [x19,2]
-	strb	w1, [x19,6]
+	ldrh	w0, [x19, 4]
+	cbnz	w0, .L2655
+	ldrh	w0, [x19, 2]
 	add	w0, w0, 1
-	strh	w0, [x19,2]
-	b	.L2712
-.L2719:
-	adrp	x0, .LANCHOR2
-	add	x0, x0, :lo12:.LANCHOR2
-	ldrb	w2, [x0,1220]
-	cbz	w2, .L2712
+.L2664:
+	strh	w0, [x19, 2]
+	strb	wzr, [x19, 6]
+.L2649:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	ret
+.L2655:
+	ldrb	w0, [x19, 6]
+	ldrh	w1, [x22, 2276]
+	add	w0, w0, 1
+	and	w0, w0, 255
+	strb	w0, [x19, 6]
+	cmp	w1, w0
+	bne	.L2654
+	ldrh	w0, [x19, 2]
+	strb	wzr, [x19, 6]
+	add	w0, w0, 1
+	strh	w0, [x19, 2]
+.L2654:
+	ldrb	w0, [x19, 6]
+	add	x0, x0, 8
+	ldrh	w1, [x19, x0, lsl 1]
+	b	.L2653
+.L2656:
+	add	x0, x20, :lo12:.LANCHOR2
+	ldrb	w2, [x0, 1220]
+	cbz	w2, .L2649
 	cmp	w1, 1
-	bne	.L2712
-	ldrh	w2, [x19,2]
-	ldrh	w1, [x0,2346]
+	bne	.L2649
+	ldrh	w2, [x19, 2]
+	ldrh	w1, [x0, 2346]
 	cmp	w2, w1
-	bcc	.L2712
+	bcc	.L2649
 	ldrh	w1, [x19]
-	ldr	x3, [x0,2712]
+	ldr	x3, [x0, 2712]
+	ldrh	w4, [x19, 4]
 	lsl	x1, x1, 1
-	ldrh	w4, [x19,4]
-	ldrh	w2, [x3,x1]
+	ldrh	w2, [x3, x1]
 	sub	w2, w2, w4
-	strh	w2, [x3,x1]
-	strh	wzr, [x19,4]
-	ldrh	w0, [x0,2344]
-	strh	w0, [x19,2]
-	strb	wzr, [x19,6]
-.L2712:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 48
+	strh	w2, [x3, x1]
+	strh	wzr, [x19, 4]
+	ldrh	w0, [x0, 2344]
+	b	.L2664
+.L2661:
 	ret
 	.size	FtlSlcSuperblockCheck, .-FtlSlcSuperblockCheck
 	.align	2
@@ -17626,129 +17216,117 @@ FtlSlcSuperblockCheck:
 get_new_active_ppa:
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
+	stp	x19, x20, [sp, 16]
 	mov	x19, x0
-	strb	wzr, [x0,10]
-	ldrb	w0, [x0,6]
+	stp	x21, x22, [sp, 32]
 	adrp	x21, .LANCHOR0
-	mov	w22, 65535
-	adrp	x23, .LANCHOR2
-	add	x0, x0, 8
+	str	x23, [sp, 48]
 	add	x21, x21, :lo12:.LANCHOR0
-	ldrh	w0, [x19,x0,lsl 1]
-.L2725:
-	cmp	w0, w22
+	strb	wzr, [x0, 10]
 	adrp	x20, .LANCHOR2
-	bne	.L2740
-.L2726:
-	ldrb	w0, [x19,6]
-	add	x1, x23, :lo12:.LANCHOR2
-	add	w0, w0, 1
-	ldrh	w1, [x1,2276]
-	uxtb	w0, w0
-	strb	w0, [x19,6]
-	cmp	w1, w0
-	bne	.L2727
-	ldrh	w0, [x19,2]
-	strb	wzr, [x19,6]
-	add	w0, w0, 1
-	strh	w0, [x19,2]
-.L2727:
-	ldrb	w0, [x19,6]
+	ldrb	w0, [x0, 6]
+	add	x21, x21, 1168
+	add	x23, x20, :lo12:.LANCHOR2
 	add	x0, x0, 8
-	ldrh	w0, [x19,x0,lsl 1]
-	b	.L2725
-.L2740:
-	ldrb	w1, [x19,8]
+	ldrh	w0, [x19, x0, lsl 1]
+.L2666:
+	mov	w2, 65535
+	cmp	w0, w2
+	beq	.L2667
+	ldrb	w1, [x19, 8]
+	ldrh	w22, [x19, 2]
 	cmp	w1, 1
-	bne	.L2728
-	add	x1, x23, :lo12:.LANCHOR2
-	ldrb	w1, [x1,1220]
-	cbnz	w1, .L2728
-	ldrh	w2, [x19,2]
-	add	x1, x21, 1168
-	ldrh	w1, [x1,w2,sxtw 1]
-	cmp	w1, w22
-	bne	.L2728
-	ldrh	w0, [x19,4]
-	sub	w0, w0, #1
-	strh	w0, [x19,4]
+	ldrh	w1, [x19, 4]
+	bne	.L2669
+	ldrb	w3, [x23, 1220]
+	cbnz	w3, .L2669
+	ldrh	w3, [x21, w22, sxtw 1]
+	cmp	w3, w2
+	bne	.L2669
 	ldrh	w0, [x19]
+	sub	w1, w1, #1
+	strh	w1, [x19, 4]
 	bl	decrement_vpc_count
-	b	.L2726
-.L2728:
-	ldrh	w1, [x19,4]
-	mov	w23, 65535
-	ldrh	w22, [x19,2]
+.L2667:
+	ldrb	w0, [x19, 6]
+	ldrh	w1, [x23, 2276]
+	add	w0, w0, 1
+	and	w0, w0, 255
+	strb	w0, [x19, 6]
+	cmp	w1, w0
+	bne	.L2668
+	ldrh	w0, [x19, 2]
+	strb	wzr, [x19, 6]
+	add	w0, w0, 1
+	strh	w0, [x19, 2]
+.L2668:
+	ldrb	w0, [x19, 6]
+	add	x0, x0, 8
+	ldrh	w0, [x19, x0, lsl 1]
+	b	.L2666
+.L2669:
 	adrp	x21, .LANCHOR0
-	sub	w1, w1, #1
-	mov	w24, w23
-	orr	w22, w22, w0, lsl 10
-	strh	w1, [x19,4]
 	add	x21, x21, :lo12:.LANCHOR0
-.L2729:
-	add	x0, x20, :lo12:.LANCHOR2
-	ldrb	w1, [x19,6]
-	ldrh	w2, [x0,2276]
-.L2731:
-	add	w1, w1, 1
-	uxtb	w1, w1
-	cmp	w1, w2
-	bne	.L2730
-	ldrh	w1, [x19,2]
-	add	w1, w1, 1
-	strh	w1, [x19,2]
-	mov	w1, 0
-.L2730:
-	add	x0, x19, w1, sxtw 1
-	ldrh	w0, [x0,16]
-	cmp	w0, w23
-	beq	.L2731
-	ldrb	w0, [x19,8]
-	strb	w1, [x19,6]
+	orr	w22, w22, w0, lsl 10
+	add	x20, x20, :lo12:.LANCHOR2
+	add	x21, x21, 1168
+	sub	w1, w1, #1
+	strh	w1, [x19, 4]
+.L2670:
+	ldrb	w0, [x19, 6]
+	mov	w1, 65535
+	ldrh	w3, [x20, 2276]
+.L2672:
+	add	w0, w0, 1
+	and	w0, w0, 255
+	cmp	w0, w3
+	bne	.L2671
+	ldrh	w0, [x19, 2]
+	add	w0, w0, 1
+	strh	w0, [x19, 2]
+	mov	w0, 0
+.L2671:
+	add	x2, x19, w0, sxtw 1
+	ldrh	w2, [x2, 16]
+	cmp	w2, w1
+	beq	.L2672
+	strb	w0, [x19, 6]
+	ldrb	w0, [x19, 8]
 	cmp	w0, 1
-	bne	.L2736
-	add	x0, x20, :lo12:.LANCHOR2
-	ldrb	w0, [x0,1220]
-	cbnz	w0, .L2733
-	ldrh	w1, [x19,2]
-	add	x0, x21, 1168
-	ldrh	w0, [x0,w1,sxtw 1]
-	cmp	w0, w24
-	bne	.L2733
-	ldrh	w1, [x19,4]
-	cbz	w1, .L2733
+	bne	.L2665
+	ldrb	w2, [x20, 1220]
+	ldrh	w0, [x19, 2]
+	cbnz	w2, .L2674
+	ldrh	w0, [x21, w0, sxtw 1]
+	cmp	w0, w1
+	bne	.L2665
+	ldrh	w0, [x19, 4]
+	cbz	w0, .L2665
+	sub	w0, w0, #1
+	strh	w0, [x19, 4]
 	ldrh	w0, [x19]
-	sub	w1, w1, #1
-	strh	w1, [x19,4]
 	bl	decrement_vpc_count
-	b	.L2729
-.L2733:
-	add	x1, x20, :lo12:.LANCHOR2
-	ldrb	w0, [x1,1220]
-	cbz	w0, .L2736
-	ldrh	w2, [x19,2]
-	ldrh	w0, [x1,2346]
-	cmp	w2, w0
-	bcc	.L2736
-	ldrh	w2, [x19]
-	ldr	x0, [x1,2712]
-	lsl	x2, x2, 1
-	ldrh	w4, [x19,4]
-	ldrh	w3, [x0,x2]
-	sub	w3, w3, w4
-	strh	w3, [x0,x2]
-	strh	wzr, [x19,4]
-	ldrh	w0, [x1,2344]
-	strh	w0, [x19,2]
-	strb	wzr, [x19,6]
-.L2736:
+	b	.L2670
+.L2674:
+	ldrh	w1, [x20, 2346]
+	cmp	w0, w1
+	bcc	.L2665
+	ldrh	w0, [x19]
+	ldr	x2, [x20, 2712]
+	ldrh	w3, [x19, 4]
+	lsl	x0, x0, 1
+	ldrh	w1, [x2, x0]
+	sub	w1, w1, w3
+	strh	w1, [x2, x0]
+	strh	wzr, [x19, 4]
+	ldrh	w0, [x20, 2344]
+	strh	w0, [x19, 2]
+	strb	wzr, [x19, 6]
+.L2665:
 	mov	w0, w22
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
+	ldr	x23, [sp, 48]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
 	ldp	x29, x30, [sp], 64
 	ret
 	.size	get_new_active_ppa, .-get_new_active_ppa
@@ -17758,106 +17336,105 @@ get_new_active_ppa:
 FtlWriteDumpData:
 	stp	x29, x30, [sp, -144]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
 	adrp	x22, .LANCHOR2
-	str	x25, [sp,64]
-	stp	x19, x20, [sp,16]
 	add	x20, x22, :lo12:.LANCHOR2
-	stp	x23, x24, [sp,48]
-	ldr	w0, [x20,2928]
-	cbnz	w0, .L2741
+	stp	x23, x24, [sp, 48]
+	str	x25, [sp, 64]
+	ldr	w0, [x20, 2928]
+	cbnz	w0, .L2681
 	adrp	x19, .LANCHOR4
-	add	x1, x19, :lo12:.LANCHOR4
-	add	x1, x1, 784
-	ldrh	w2, [x1,4]
-	cbz	w2, .L2743
-	ldrb	w0, [x1,8]
-	cbnz	w0, .L2743
-	ldrb	w0, [x1,7]
-	ldrh	w3, [x20,2344]
-	mul	w0, w0, w3
-	cmp	w2, w0
-	beq	.L2743
-	ldrb	w24, [x1,10]
-	ldr	w23, [x20,2924]
-	ldrh	w25, [x20,2276]
-	cbnz	w24, .L2741
-	sub	w23, w23, #1
+	add	x0, x19, :lo12:.LANCHOR4
+	add	x0, x0, 784
+	ldrh	w2, [x0, 4]
+	cbz	w2, .L2683
+	ldrb	w1, [x0, 8]
+	cbnz	w1, .L2683
+	ldrb	w1, [x0, 7]
+	ldrh	w3, [x20, 2344]
+	mul	w1, w1, w3
+	cmp	w2, w1
+	beq	.L2683
+	ldrb	w0, [x0, 10]
+	cbnz	w0, .L2681
+	ldr	w23, [x20, 2924]
 	add	x1, x29, 84
+	ldrh	w25, [x20, 2276]
+	mov	w2, 0
+	sub	w23, w23, #1
 	mov	w0, w23
-	mov	w2, w24
 	bl	log2phys
-	ldr	x21, [x20,2640]
-	ldr	w0, [x29,84]
-	ldr	x1, [x20,2576]
-	str	w0, [x29,92]
+	ldr	x21, [x20, 2640]
+	ldr	w0, [x29, 84]
+	ldr	x1, [x20, 2576]
+	str	w0, [x29, 92]
 	cmn	w0, #1
-	str	w23, [x29,112]
-	str	x1, [x29,96]
-	str	x21, [x29,104]
-	str	w24, [x21,4]
-	beq	.L2745
-	add	x0, x29, 88
+	stp	x1, x21, [x29, 96]
+	str	w23, [x29, 112]
+	str	wzr, [x21, 4]
+	beq	.L2685
+	mov	w2, 0
 	mov	w1, 1
-	mov	w2, w24
+	add	x0, x29, 88
 	bl	FlashReadPages
-	b	.L2746
-.L2745:
-	ldr	x0, [x20,2576]
-	mov	w1, 255
-	ldrh	w2, [x20,2354]
-	bl	ftl_memset
-.L2746:
+.L2686:
 	add	x20, x19, :lo12:.LANCHOR4
-	mov	w0, -3947
 	lsl	w25, w25, 2
-	strh	w0, [x21]
-	mov	w24, 0
 	add	x20, x20, 784
-.L2747:
-	cmp	w24, w25
-	beq	.L2748
-	ldrh	w0, [x20,4]
-	cbz	w0, .L2748
-	ldr	w0, [x29,92]
+	add	x22, x22, :lo12:.LANCHOR2
+	mov	w0, -3947
+	mov	w24, 0
+	strh	w0, [x21]
+.L2687:
+	cmp	w25, w24
+	bne	.L2691
+.L2688:
+	add	x19, x19, :lo12:.LANCHOR4
+	mov	w0, 1
+	strb	w0, [x19, 794]
+.L2681:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldr	x25, [sp, 64]
+	ldp	x29, x30, [sp], 144
+	ret
+.L2685:
+	ldrh	w2, [x20, 2354]
+	mov	w1, 255
+	ldr	x0, [x20, 2576]
+	bl	ftl_memset
+	b	.L2686
+.L2691:
+	ldrh	w0, [x20, 4]
+	cbz	w0, .L2688
+	ldr	w0, [x29, 92]
 	add	w24, w24, 1
-	str	w0, [x21,12]
+	stp	w23, w0, [x21, 8]
 	ldrh	w0, [x20]
-	strh	w0, [x21,2]
+	strh	w0, [x21, 2]
 	mov	x0, x20
-	str	w23, [x21,8]
 	bl	get_new_active_ppa
-	str	w0, [x29,92]
-	add	x0, x22, :lo12:.LANCHOR2
+	str	w0, [x29, 92]
+	ldr	w0, [x22, 2400]
+	mov	w3, 0
+	str	w0, [x21, 4]
 	mov	w2, 0
-	mov	w3, w2
-	ldr	w1, [x0,2400]
-	str	w1, [x21,4]
-	add	w1, w1, 1
-	cmn	w1, #1
-	csel	w1, w1, wzr, ne
-	str	w1, [x0,2400]
+	add	w0, w0, 1
 	mov	w1, 1
+	cmn	w0, #1
+	csel	w0, w0, wzr, ne
+	str	w0, [x22, 2400]
 	add	x0, x29, 88
 	bl	FlashProgPages
 	ldrh	w0, [x20]
 	bl	decrement_vpc_count
-	b	.L2747
-.L2748:
-	add	x19, x19, :lo12:.LANCHOR4
-	mov	w0, 1
-	strb	w0, [x19,794]
-	b	.L2741
-.L2743:
+	b	.L2687
+.L2683:
 	add	x19, x19, :lo12:.LANCHOR4
-	strb	wzr, [x19,794]
-.L2741:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldr	x25, [sp,64]
-	ldp	x29, x30, [sp], 144
-	ret
+	strb	wzr, [x19, 794]
+	b	.L2681
 	.size	FtlWriteDumpData, .-FtlWriteDumpData
 	.align	2
 	.global	l2p_flush
@@ -17865,31 +17442,31 @@ FtlWriteDumpData:
 l2p_flush:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	mov	w19, 0
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR2
+	add	x20, x20, :lo12:.LANCHOR2
+	mov	w19, 0
 	bl	FtlWriteDumpData
-.L2759:
-	add	x1, x20, :lo12:.LANCHOR2
-	ldrh	w0, [x1,2382]
+.L2700:
+	ldrh	w0, [x20, 2382]
 	cmp	w0, w19
-	bls	.L2762
-	ldr	x1, [x1,2792]
+	bhi	.L2702
+	mov	w0, 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
+	ret
+.L2702:
+	ldr	x1, [x20, 2792]
 	ubfiz	x0, x19, 4, 16
 	add	x0, x1, x0
-	ldr	w0, [x0,4]
-	tbz	w0, #31, .L2760
+	ldr	w0, [x0, 4]
+	tbz	w0, #31, .L2701
 	mov	w0, w19
 	bl	flush_l2p_region
-.L2760:
+.L2701:
 	add	w19, w19, 1
-	uxth	w19, w19
-	b	.L2759
-.L2762:
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 32
-	ret
+	and	w19, w19, 65535
+	b	.L2700
 	.size	l2p_flush, .-l2p_flush
 	.align	2
 	.global	FtlSuperblockPowerLostFix
@@ -17897,200 +17474,194 @@ l2p_flush:
 FtlSuperblockPowerLostFix:
 	stp	x29, x30, [sp, -128]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR2
-	str	x23, [sp,48]
-	add	x2, x20, :lo12:.LANCHOR2
-	stp	x21, x22, [sp,32]
-	ldr	w1, [x2,2928]
-	cbnz	w1, .L2763
-	ldrb	w21, [x2,1220]
-	cbz	w21, .L2778
-	ldrb	w21, [x0,8]
-	cmp	w21, 1
-	bne	.L2774
-	ldrh	w23, [x0,4]
-	b	.L2765
-.L2774:
-	mov	w21, w1
-.L2778:
-	mov	w23, 12
-.L2765:
+	add	x1, x20, :lo12:.LANCHOR2
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	ldr	w24, [x1, 2928]
+	cbnz	w24, .L2704
+	ldrb	w1, [x1, 1220]
+	cbz	w1, .L2715
+	ldrb	w1, [x0, 8]
+	cmp	w1, 1
+	bne	.L2715
+	ldrh	w23, [x0, 4]
+	mov	w24, w1
+.L2706:
 	mov	x19, x0
 	mov	w0, -1
-	str	w0, [x29,96]
+	str	w0, [x29, 96]
 	add	x0, x20, :lo12:.LANCHOR2
 	mov	w2, 61589
-	ldr	x22, [x0,2640]
-	ldr	x1, [x0,2576]
-	str	x1, [x29,80]
+	mov	x21, x0
+	ldr	x22, [x0, 2640]
+	ldr	x1, [x0, 2576]
+	stp	x1, x22, [x29, 80]
 	mov	w1, -3
-	str	x22, [x29,88]
-	str	w1, [x22,8]
+	str	w1, [x22, 8]
 	mov	w1, -2
-	str	w1, [x22,12]
+	str	w1, [x22, 12]
 	ldrh	w1, [x19]
-	strh	w1, [x22,2]
+	strh	w1, [x22, 2]
 	strh	wzr, [x22]
-	ldr	x1, [x0,2576]
+	ldr	x1, [x0, 2576]
 	str	w2, [x1]
-	ldr	x1, [x0,2576]
-	mov	w0, 22136
-	movk	w0, 0x1234, lsl 16
-	str	w0, [x1,4]
-.L2766:
+	mov	w2, 22136
+	movk	w2, 0x1234, lsl 16
+	ldr	x1, [x0, 2576]
+	str	w2, [x1, 4]
+.L2707:
 	sub	w23, w23, #1
 	cmn	w23, #1
-	beq	.L2769
-	ldrh	w0, [x19,4]
-	cbnz	w0, .L2767
-.L2769:
+	beq	.L2710
+	ldrh	w0, [x19, 4]
+	cbnz	w0, .L2708
+.L2710:
 	add	x20, x20, :lo12:.LANCHOR2
 	ldrh	w0, [x19]
-	ldrh	w3, [x19,4]
+	ldrh	w3, [x19, 4]
+	ldr	x2, [x20, 2712]
 	lsl	x0, x0, 1
-	ldr	x2, [x20,2712]
-	ldrh	w1, [x2,x0]
+	ldrh	w1, [x2, x0]
 	sub	w1, w1, w3
-	strh	w1, [x2,x0]
-	strb	wzr, [x19,6]
-	ldrh	w0, [x20,2344]
-	strh	w0, [x19,2]
-	strh	wzr, [x19,4]
-	b	.L2763
-.L2767:
+	strh	w1, [x2, x0]
+	strb	wzr, [x19, 6]
+	ldrh	w0, [x20, 2344]
+	strh	w0, [x19, 2]
+	strh	wzr, [x19, 4]
+.L2704:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 128
+	ret
+.L2715:
+	mov	w23, 12
+	b	.L2706
+.L2708:
 	mov	x0, x19
 	bl	get_new_active_ppa
-	str	w0, [x29,76]
+	str	w0, [x29, 76]
 	cmn	w0, #1
-	beq	.L2769
-	add	x1, x20, :lo12:.LANCHOR2
-	mov	w2, w21
+	beq	.L2710
+	ldr	w0, [x21, 2400]
 	mov	w3, 0
-	ldr	w0, [x1,2400]
-	str	w0, [x22,4]
+	str	w0, [x22, 4]
+	mov	w2, w24
 	add	w0, w0, 1
+	mov	w1, 1
 	cmn	w0, #1
 	csel	w0, w0, wzr, ne
-	str	w0, [x1,2400]
+	str	w0, [x21, 2400]
 	add	x0, x29, 72
-	mov	w1, 1
 	bl	FlashProgPages
 	ldrh	w0, [x19]
 	bl	decrement_vpc_count
-	b	.L2766
-.L2763:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldr	x23, [sp,48]
-	ldp	x29, x30, [sp], 128
-	ret
+	b	.L2707
 	.size	FtlSuperblockPowerLostFix, .-FtlSuperblockPowerLostFix
 	.align	2
 	.global	FtlVpcCheckAndModify
 	.type	FtlVpcCheckAndModify, %function
 FtlVpcCheckAndModify:
-	stp	x29, x30, [sp, -96]!
+	stp	x29, x30, [sp, -80]!
 	adrp	x1, .LANCHOR3
-	adrp	x0, .LC49
 	add	x1, x1, :lo12:.LANCHOR3
+	adrp	x0, .LC49
 	add	x29, sp, 0
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR2
+	add	x19, x20, :lo12:.LANCHOR2
+	stp	x21, x22, [sp, 32]
 	add	x1, x1, 232
 	add	x0, x0, :lo12:.LC49
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	str	x25, [sp,64]
-	adrp	x22, .LANCHOR2
+	str	x23, [sp, 48]
 	bl	printk
-	mov	w19, 0
-	add	x0, x22, :lo12:.LANCHOR2
+	ldr	x0, [x19, 2704]
+	mov	w21, 0
+	ldrh	w2, [x19, 2286]
 	mov	w1, 0
-	ldrh	w2, [x0,2286]
-	ldr	x0, [x0,2704]
 	lsl	w2, w2, 1
 	bl	ftl_memset
-.L2780:
-	add	x20, x22, :lo12:.LANCHOR2
-	ldr	w0, [x20,2924]
-	cmp	w19, w0
-	bcs	.L2796
-	mov	w0, w19
-	add	x1, x29, 92
+.L2721:
+	ldr	w0, [x19, 2924]
+	cmp	w21, w0
+	bcc	.L2723
+	adrp	x22, .LANCHOR4
+	adrp	x23, .LC156
+	add	x20, x20, :lo12:.LANCHOR2
+	add	x22, x22, :lo12:.LANCHOR4
+	add	x23, x23, :lo12:.LC156
+	mov	w19, 0
+.L2724:
+	ldrh	w0, [x20, 2284]
+	cmp	w0, w19
+	bhi	.L2727
+	bl	l2p_flush
+	bl	FtlVpcTblFlush
+	ldr	x23, [sp, 48]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 80
+	ret
+.L2723:
 	mov	w2, 0
+	add	x1, x29, 76
+	mov	w0, w21
 	bl	log2phys
-	ldr	w0, [x29,92]
+	ldr	w0, [x29, 76]
 	cmn	w0, #1
-	beq	.L2781
-	lsr	x0, x0, 10
+	beq	.L2722
+	lsr	w0, w0, 10
 	bl	P2V_block_in_plane
+	ldr	x2, [x19, 2704]
 	ubfiz	x0, x0, 1, 16
-	ldr	x2, [x20,2704]
-	ldrh	w1, [x2,x0]
+	ldrh	w1, [x2, x0]
 	add	w1, w1, 1
-	strh	w1, [x2,x0]
-.L2781:
-	add	w19, w19, 1
-	b	.L2780
-.L2796:
-	adrp	x23, .LANCHOR4
-	adrp	x24, .LC156
-	mov	w19, 0
-	mov	w25, 65535
-	add	x23, x23, :lo12:.LANCHOR4
-	add	x24, x24, :lo12:.LC156
-.L2783:
-	add	x21, x22, :lo12:.LANCHOR2
-	ldrh	w0, [x21,2284]
-	cmp	w0, w19
-	bls	.L2797
-	ubfiz	x20, x19, 1, 16
-	ldr	x0, [x21,2712]
-	ldrh	w2, [x0,x20]
-	ldr	x0, [x21,2704]
-	cmp	w2, w25
-	ldrh	w3, [x0,x20]
-	beq	.L2784
+	strh	w1, [x2, x0]
+.L2722:
+	add	w21, w21, 1
+	b	.L2721
+.L2727:
+	ldr	x0, [x20, 2712]
+	ubfiz	x21, x19, 1, 16
+	ldrh	w2, [x0, x21]
+	ldr	x0, [x20, 2704]
+	ldrh	w3, [x0, x21]
 	cmp	w2, w3
-	beq	.L2784
-	ldrh	w0, [x23,784]
+	beq	.L2725
+	mov	w0, 65535
+	cmp	w2, w0
+	beq	.L2725
+	ldrh	w0, [x22, 784]
 	cmp	w0, w19
-	beq	.L2784
-	ldrh	w0, [x23,880]
+	beq	.L2725
+	ldrh	w0, [x22, 880]
 	cmp	w0, w19
-	beq	.L2784
-	ldrh	w0, [x23,832]
+	beq	.L2725
+	ldrh	w0, [x22, 832]
 	cmp	w0, w19
-	beq	.L2784
+	beq	.L2725
 	mov	w1, w19
-	mov	x0, x24
+	mov	x0, x23
 	bl	printk
-	ldr	x0, [x21,2712]
-	ldrh	w1, [x0,x20]
-	cbnz	w1, .L2785
-	ldr	x1, [x21,2704]
-	ldrh	w1, [x1,x20]
-	strh	w1, [x0,x20]
-	b	.L2784
-.L2785:
-	ldr	x1, [x21,2704]
-	ldrh	w1, [x1,x20]
-	strh	w1, [x0,x20]
+	ldr	x0, [x20, 2712]
+	ldrh	w1, [x0, x21]
+	cbnz	w1, .L2726
+	ldr	x1, [x20, 2704]
+	ldrh	w1, [x1, x21]
+	strh	w1, [x0, x21]
+.L2725:
+	add	w19, w19, 1
+	and	w19, w19, 65535
+	b	.L2724
+.L2726:
+	ldr	x1, [x20, 2704]
+	ldrh	w1, [x1, x21]
+	strh	w1, [x0, x21]
 	mov	w0, w19
 	bl	update_vpc_list
-.L2784:
-	add	w19, w19, 1
-	uxth	w19, w19
-	b	.L2783
-.L2797:
-	bl	l2p_flush
-	bl	FtlVpcTblFlush
-	ldr	x25, [sp,64]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 96
-	ret
+	b	.L2725
 	.size	FtlVpcCheckAndModify, .-FtlVpcCheckAndModify
 	.align	2
 	.global	allocate_new_data_superblock
@@ -18098,1397 +17669,1377 @@ FtlVpcCheckAndModify:
 allocate_new_data_superblock:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR2
-	add	x1, x20, :lo12:.LANCHOR2
-	stp	x21, x22, [sp,32]
-	ldr	w2, [x1,2928]
-	ldrh	w22, [x0]
-	cbnz	w2, .L2799
-	mov	x19, x0
+	add	x2, x20, :lo12:.LANCHOR2
+	stp	x21, x22, [sp, 32]
+	ldr	w1, [x2, 2928]
+	cbnz	w1, .L2733
+	ldrh	w21, [x0]
+	mov	x22, x0
 	mov	w0, 65535
-	cmp	w22, w0
-	beq	.L2800
-	ubfiz	x0, x22, 1, 16
-	ldr	x1, [x1,2712]
-	ldrh	w0, [x1,x0]
-	cbz	w0, .L2801
-	mov	w0, w22
+	cmp	w21, w0
+	beq	.L2734
+	ldr	x0, [x2, 2712]
+	ubfiz	x1, x21, 1, 16
+	ldrh	w0, [x0, x1]
+	cbz	w0, .L2735
+	mov	w0, w21
 	bl	INSERT_DATA_LIST
-	b	.L2800
-.L2801:
-	mov	w0, w22
-	bl	INSERT_FREE_LIST
-.L2800:
-	adrp	x0, .LANCHOR4
-	strb	wzr, [x19,8]
-	add	x1, x0, :lo12:.LANCHOR4
-	add	x2, x1, 832
-	cmp	x19, x2
-	beq	.L2802
+.L2734:
+	adrp	x19, .LANCHOR4
+	strb	wzr, [x22, 8]
+	add	x1, x19, :lo12:.LANCHOR4
+	add	x0, x1, 832
+	cmp	x22, x0
+	beq	.L2736
 	add	x2, x20, :lo12:.LANCHOR2
-	ldrh	w3, [x2,2296]
+	ldrh	w3, [x2, 2296]
 	cmp	w3, 1
-	beq	.L2802
-	ldrb	w4, [x2,1220]
-	cbz	w4, .L2803
-.L2802:
+	beq	.L2736
+	ldrb	w0, [x2, 1220]
+	cbz	w0, .L2737
+.L2736:
 	mov	w0, 1
-	strb	w0, [x19,8]
-	b	.L2804
-.L2803:
-	add	x1, x1, 784
-	cmp	x19, x1
-	bne	.L2804
-	cmp	w3, 3
-	beq	.L2806
-	ldr	w1, [x2,2392]
-	cmp	w1, 1
-	bne	.L2807
-.L2806:
-	add	x1, x0, :lo12:.LANCHOR4
-	mov	w2, 1
-	strb	w2, [x1,792]
-.L2807:
-	add	x1, x20, :lo12:.LANCHOR2
-	ldr	w2, [x1,2096]
-	cbz	w2, .L2804
-	ldr	w1, [x1,2444]
-	cmp	w1, 39
-	bhi	.L2804
-	add	x0, x0, :lo12:.LANCHOR4
-	mov	w1, 1
-	strb	w1, [x0,792]
-.L2804:
-	adrp	x1, .LANCHOR5
-	mov	w2, 65535
-	add	x0, x1, :lo12:.LANCHOR5
-	mov	x21, x1
-	ldrh	w0, [x0,1184]
-	cmp	w0, w2
-	beq	.L2809
-	cmp	w22, w0
-	bne	.L2810
+	strb	w0, [x22, 8]
+.L2738:
+	add	x0, x19, :lo12:.LANCHOR4
+	mov	w1, 65535
+	ldrh	w0, [x0, 1696]
+	cmp	w0, w1
+	beq	.L2743
+	cmp	w21, w0
+	bne	.L2744
 	add	x20, x20, :lo12:.LANCHOR2
 	ubfiz	x1, x0, 1, 16
-	ldr	x2, [x20,2712]
-	ldrh	w1, [x2,x1]
-	cbz	w1, .L2811
-.L2810:
+	ldr	x2, [x20, 2712]
+	ldrh	w1, [x2, x1]
+	cbz	w1, .L2745
+.L2744:
 	bl	update_vpc_list
-.L2811:
-	add	x1, x21, :lo12:.LANCHOR5
+.L2745:
+	add	x19, x19, :lo12:.LANCHOR4
 	mov	w0, -1
-	strh	w0, [x1,1184]
-.L2809:
-	mov	x0, x19
+	strh	w0, [x19, 1696]
+.L2743:
+	mov	x0, x22
 	bl	allocate_data_superblock
 	bl	l2p_flush
 	mov	w0, 0
 	bl	FtlEctTblFlush
 	bl	FtlVpcTblFlush
-.L2799:
+.L2733:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
+.L2735:
+	mov	w0, w21
+	bl	INSERT_FREE_LIST
+	b	.L2734
+.L2737:
+	add	x1, x1, 784
+	cmp	x22, x1
+	bne	.L2738
+	cmp	w3, 3
+	beq	.L2740
+	ldr	w0, [x2, 2392]
+	cmp	w0, 1
+	bne	.L2741
+.L2740:
+	add	x1, x19, :lo12:.LANCHOR4
+	mov	w0, 1
+	strb	w0, [x1, 792]
+.L2741:
+	add	x1, x20, :lo12:.LANCHOR2
+	ldr	w0, [x1, 2096]
+	cbz	w0, .L2738
+	ldr	w0, [x1, 2444]
+	cmp	w0, 39
+	bhi	.L2738
+	add	x1, x19, :lo12:.LANCHOR4
+	mov	w0, 1
+	strb	w0, [x1, 792]
+	b	.L2738
 	.size	allocate_new_data_superblock, .-allocate_new_data_superblock
 	.align	2
 	.global	FtlReadRefresh
 	.type	FtlReadRefresh, %function
 FtlReadRefresh:
+	adrp	x0, .LANCHOR4
+	add	x4, x0, :lo12:.LANCHOR4
+	add	x2, x4, 1152
+	mov	x1, x0
+	adrp	x0, .LANCHOR2
+	add	x0, x0, :lo12:.LANCHOR2
+	ldr	w3, [x2, 80]
+	cbz	w3, .L2760
+	ldr	w1, [x0, 2924]
+	ldr	w3, [x2, 84]
+	cmp	w3, w1
+	bcs	.L2761
 	stp	x29, x30, [sp, -112]!
-	adrp	x1, .LANCHOR5
-	add	x3, x1, :lo12:.LANCHOR5
 	add	x29, sp, 0
-	add	x2, x3, 640
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	adrp	x19, .LANCHOR2
-	ldr	w0, [x2,80]
-	cbz	w0, .L2825
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	w4, [x2,84]
-	ldr	w1, [x0,2924]
-	cmp	w4, w1
-	bcs	.L2826
+	stp	x19, x20, [sp, 16]
+	mov	x20, x4
+	mov	x19, x0
+	stp	x21, x22, [sp, 32]
 	mov	w21, 2048
-	mov	x20, x3
-.L2831:
-	add	x22, x20, 640
-	add	x1, x19, :lo12:.LANCHOR2
-	ldr	w0, [x22,84]
-	ldr	w1, [x1,2924]
+.L2766:
+	add	x22, x20, 1152
+	ldr	w1, [x19, 2924]
+	ldr	w0, [x22, 84]
 	cmp	w0, w1
-	bcs	.L2830
+	bcc	.L2762
+.L2765:
+	ldp	x19, x20, [sp, 16]
+	mov	w0, -1
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 112
+	ret
+.L2762:
 	add	x1, x29, 52
 	mov	w2, 0
 	bl	log2phys
-	ldr	w0, [x22,84]
-	ldr	w1, [x29,52]
+	ldr	w0, [x22, 84]
+	ldr	w1, [x29, 52]
 	add	w0, w0, 1
-	str	w0, [x22,84]
+	str	w0, [x22, 84]
 	cmn	w1, #1
-	beq	.L2829
-	str	w1, [x29,60]
+	beq	.L2764
+	str	w0, [x29, 80]
+	add	x0, x29, 112
+	str	w1, [x29, 60]
 	mov	w2, 0
-	str	w0, [x29,80]
+	stp	xzr, xzr, [x29, 64]
 	mov	w1, 1
-	add	x0, x29, 56
-	str	xzr, [x29,64]
-	str	xzr, [x29,72]
-	str	wzr, [x29,56]
+	str	wzr, [x0, -56]!
 	bl	FlashReadPages
-	ldr	w0, [x29,56]
+	ldr	w0, [x29, 56]
 	cmp	w0, 256
-	bne	.L2830
-	ldr	w0, [x29,52]
-	lsr	x0, x0, 10
+	bne	.L2765
+	ldr	w0, [x29, 52]
+	lsr	w0, w0, 10
 	bl	P2V_block_in_plane
 	bl	FtlGcRefreshBlock
-.L2830:
-	mov	w0, -1
-	b	.L2833
-.L2829:
+	b	.L2765
+.L2764:
 	subs	w21, w21, #1
-	bne	.L2831
-	b	.L2830
-.L2826:
-	ldr	w0, [x0,2424]
-	str	wzr, [x2,80]
-	str	wzr, [x2,84]
-	str	w0, [x2,76]
-	b	.L2840
-.L2825:
-	add	x19, x19, :lo12:.LANCHOR2
+	bne	.L2766
+	b	.L2765
+.L2761:
+	ldr	w0, [x0, 2424]
+	stp	w0, wzr, [x2, 76]
+	str	wzr, [x2, 84]
+.L2773:
+	mov	w0, 0
+	ret
+.L2760:
+	ldr	w3, [x0, 2440]
 	mov	w5, 10000
-	mov	w8, 63
-	ldr	w6, [x2,76]
-	ldr	w3, [x19,2440]
-	ldr	w7, [x19,2424]
+	mov	w6, 31
+	ldr	w7, [x2, 76]
 	cmp	w3, w5
-	mov	w5, 31
-	csel	w8, w5, w8, hi
-	add	w5, w7, 1048576
-	cmp	w6, w5
-	ldr	w4, [x19,2924]
-	adrp	x5, .LANCHOR4
-	bhi	.L2835
-	mov	w9, 1000
+	mov	w5, 63
+	csel	w6, w6, w5, hi
+	ldr	w5, [x0, 2424]
+	add	w8, w5, 1048576
+	cmp	w7, w8
+	bhi	.L2770
+	ldr	w0, [x0, 2924]
+	mov	w8, 1000
 	lsr	w3, w3, 10
 	add	w3, w3, 1
-	mul	w4, w4, w9
-	udiv	w3, w4, w3
-	add	w3, w3, w6
-	cmp	w3, w7
-	bcc	.L2835
-	add	x3, x5, :lo12:.LANCHOR4
-	ldrh	w3, [x3,724]
-	tst	w8, w3
-	bne	.L2833
-	ldr	w2, [x2,100]
-	cmp	w2, w3
-	beq	.L2833
-.L2835:
-	add	x5, x5, :lo12:.LANCHOR4
-	add	x0, x1, :lo12:.LANCHOR5
-	ldrh	w1, [x5,724]
-	str	w1, [x0,740]
-	mov	w1, 1
-	str	wzr, [x0,724]
-	str	w1, [x0,720]
-	str	w7, [x0,716]
-.L2840:
-	mov	w0, 0
-.L2833:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 112
-	ret
+	mul	w0, w0, w8
+	udiv	w0, w0, w3
+	add	w0, w0, w7
+	cmp	w5, w0
+	bhi	.L2770
+	ldrh	w0, [x4, 724]
+	tst	w6, w0
+	bne	.L2773
+	ldr	w2, [x2, 100]
+	cmp	w0, w2
+	beq	.L2773
+.L2770:
+	add	x0, x1, :lo12:.LANCHOR4
+	add	x1, x0, 1152
+	ldrh	w0, [x0, 724]
+	str	w0, [x1, 100]
+	str	w5, [x1, 76]
+	mov	w0, 1
+	str	wzr, [x1, 84]
+	str	w0, [x1, 80]
+	b	.L2773
 	.size	FtlReadRefresh, .-FtlReadRefresh
 	.align	2
 	.global	ftl_do_gc
 	.type	ftl_do_gc, %function
 ftl_do_gc:
-	stp	x29, x30, [sp, -160]!
-	mov	w2, 0
+	stp	x29, x30, [sp, -144]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	add	x4, x19, :lo12:.LANCHOR2
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	ldr	w3, [x4,2928]
-	cbnz	w3, .L2994
-	adrp	x3, .LANCHOR1
-	add	x3, x3, :lo12:.LANCHOR1
-	ldr	w20, [x3,3448]
-	cmp	w20, 1
-	bne	.L2994
-	ldr	w4, [x4,2448]
-	cbnz	w4, .L2994
-	adrp	x23, .LANCHOR4
-	add	x4, x23, :lo12:.LANCHOR4
-	ldrh	w5, [x4,760]
-	cmp	w5, 47
-	bls	.L2994
-	mov	w24, w1
-	ldrh	w1, [x3,3452]
-	str	w0, [x29,132]
+	add	x3, x19, :lo12:.LANCHOR2
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldr	w2, [x3, 2928]
+	cbnz	w2, .L2878
+	adrp	x2, .LANCHOR1
+	add	x2, x2, :lo12:.LANCHOR1
+	ldr	w21, [x2, 3448]
+	cmp	w21, 1
+	bne	.L2878
+	ldr	w3, [x3, 2448]
+	cbnz	w3, .L2878
+	adrp	x20, .LANCHOR4
+	add	x3, x20, :lo12:.LANCHOR4
+	ldrh	w4, [x3, 760]
+	cmp	w4, 47
+	bls	.L2878
+	mov	w23, w1
+	str	w0, [x29, 124]
+	ldrh	w1, [x2, 3452]
 	mov	w0, 65535
 	cmp	w1, w0
-	bne	.L2843
-.L2846:
+	bne	.L2781
+.L2784:
 	add	x0, x19, :lo12:.LANCHOR2
 	mov	w2, 65535
-	ldrh	w4, [x0,2474]
+	ldrh	w4, [x0, 2474]
 	cmp	w4, w2
-	bne	.L2844
-	b	.L2845
-.L2843:
-	ldrh	w1, [x4,880]
-	cmp	w1, w0
-	beq	.L2846
-	mov	w0, w20
-	bl	FtlGcFreeTempBlock
-	mov	w2, w20
-	cbz	w0, .L2846
-	b	.L2994
-.L2844:
-	ldrh	w1, [x0,2472]
-	cmp	w1, w2
-	bne	.L2845
-	ldrh	w3, [x0,2476]
-	cmp	w3, w1
-	beq	.L2845
-	ldrh	w2, [x0,2478]
-	cmp	w2, w1
-	beq	.L2845
-	mov	w1, -1
-	strh	w4, [x0,2472]
-	strh	w3, [x0,2474]
-	strh	w2, [x0,2476]
-	strh	w1, [x0,2478]
-.L2845:
+	bne	.L2782
+.L2783:
 	add	x1, x19, :lo12:.LANCHOR2
-	ldr	w2, [x29,132]
-	adrp	x20, .LANCHOR5
+	ldr	w2, [x29, 124]
 	cmp	w2, 1
-	ldr	w0, [x1,2464]
+	ldr	w0, [x1, 2464]
 	add	w0, w0, 1
 	add	w0, w0, w2, lsl 7
-	str	w0, [x1,2464]
-	bne	.L2857
-	ldr	w2, [x1,2096]
-	cbnz	w2, .L2848
-	ldrb	w1, [x1,1220]
-	cbz	w1, .L2857
-.L2848:
-	add	x21, x19, :lo12:.LANCHOR2
-	ldr	w1, [x21,2444]
+	str	w0, [x1, 2464]
+	bne	.L2785
+	ldr	w2, [x1, 2096]
+	cbnz	w2, .L2786
+	ldrb	w1, [x1, 1220]
+	cbz	w1, .L2785
+.L2786:
+	add	x22, x19, :lo12:.LANCHOR2
+	ldr	w1, [x22, 2444]
 	cmp	w1, 39
-	bhi	.L2857
-	add	x22, x20, :lo12:.LANCHOR5
-	ldrh	w1, [x22,1384]
-	add	w0, w0, w1
-	str	w0, [x21,2464]
+	bhi	.L2785
+	add	x25, x20, :lo12:.LANCHOR4
+	mov	w21, 65535
+	ldrh	w1, [x25, 1896]
+	add	w0, w1, w0
+	str	w0, [x22, 2464]
 	bl	FtlGcReFreshBadBlk
-	ldrh	w0, [x22,592]
-	mov	w1, 65535
-	cmp	w0, w1
-	bne	.L2857
-	ldrh	w1, [x21,2472]
+	ldrh	w0, [x25, 1104]
+	cmp	w0, w21
+	bne	.L2787
+	ldrh	w1, [x22, 2472]
 	cmp	w1, w0
-	bne	.L2857
-	ldr	w0, [x21,2464]
+	bne	.L2874
+	ldr	w0, [x22, 2464]
 	cmp	w0, 1024
-	bhi	.L2849
-	add	x0, x23, :lo12:.LANCHOR4
-	ldrh	w0, [x0,776]
+	bhi	.L2789
+	ldrh	w0, [x25, 776]
 	cmp	w0, 63
-	bhi	.L2857
-.L2849:
-	add	x1, x23, :lo12:.LANCHOR4
-	add	x0, x20, :lo12:.LANCHOR5
-	ldrh	w3, [x1,776]
+	bhi	.L2874
+.L2789:
 	add	x1, x19, :lo12:.LANCHOR2
-	strh	wzr, [x0,1384]
-	ldrh	w2, [x1,2482]
+	add	x0, x20, :lo12:.LANCHOR4
+	ldrh	w2, [x1, 2482]
+	ldrh	w3, [x0, 776]
+	strh	wzr, [x0, 1896]
 	add	w2, w2, 64
 	cmp	w3, w2
-	bgt	.L2857
-	str	wzr, [x1,2464]
-	ldr	w1, [x1,2444]
-	cbnz	w1, .L2850
+	bgt	.L2874
+	str	wzr, [x1, 2464]
+	ldr	w1, [x1, 2444]
+	cbnz	w1, .L2790
 	mov	w1, 6
-	b	.L3016
-.L2850:
-	cmp	w1, 5
-	bhi	.L2851
-	mov	w1, 18
-.L3016:
-	strh	w1, [x0,1384]
-.L2851:
+.L2927:
+	strh	w1, [x0, 1896]
+.L2791:
 	mov	w0, 32
-	mov	w27, 65535
 	bl	List_get_gc_head_node
-	uxth	w25, w0
-	cmp	w25, w27
-	beq	.L2856
+	and	w5, w0, 65535
+	mov	w8, 65535
+	cmp	w5, w8
+	beq	.L2795
 	add	x22, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x22,2484]
-	cbz	w0, .L2853
-	ldrh	w1, [x22,2346]
-	ubfiz	x25, x25, 1, 16
-	ldrh	w3, [x22,2276]
-	ldr	x26, [x22,2712]
+	ldrh	w0, [x22, 2484]
+	cbz	w0, .L2793
+	ldrh	w1, [x22, 2346]
+	ubfiz	x5, x5, 1, 16
+	ldrh	w3, [x22, 2276]
+	ldr	x7, [x22, 2712]
 	mul	w1, w1, w3
-	ldrh	w2, [x26,x25]
+	ldrh	w2, [x7, x5]
 	add	w1, w1, 1
 	cmp	w2, w1
-	bgt	.L2856
-	add	w1, w0, 1
-	str	wzr, [x22,2452]
-	uxth	w1, w1
-	strh	w1, [x22,2484]
-	str	x1, [x29,136]
+	bgt	.L2795
+	add	w6, w0, 1
+	str	wzr, [x22, 2452]
+	and	w6, w6, 65535
+	strh	w6, [x22, 2484]
 	bl	List_get_gc_head_node
-	uxth	w21, w0
-	cmp	w21, w27
-	ldr	x1, [x29,136]
-	beq	.L2856
-	ubfiz	x27, x21, 1, 16
+	and	w21, w0, 65535
+	cmp	w21, w8
+	beq	.L2795
+	ubfiz	x25, x21, 1, 16
+	ldrh	w4, [x7, x5]
+	mov	w2, w21
+	mov	w1, w6
 	adrp	x0, .LC157
-	ldrh	w4, [x26,x25]
 	add	x0, x0, :lo12:.LC157
-	mov	w2, w21
-	ldrh	w3, [x26,x27]
+	ldrh	w3, [x7, x25]
 	bl	printk
-	ldrh	w0, [x22,2484]
+	ldrh	w0, [x22, 2484]
 	cmp	w0, 40
-	bls	.L2854
-	ldr	x0, [x22,2712]
-	ldrh	w0, [x0,x27]
+	bls	.L2794
+	ldr	x0, [x22, 2712]
+	ldrh	w0, [x0, x25]
 	cmp	w0, 32
-	bls	.L2854
-	strh	wzr, [x22,2484]
-.L2854:
-	add	x0, x20, :lo12:.LANCHOR5
+	bls	.L2794
+	strh	wzr, [x22, 2484]
+.L2794:
+	add	x0, x20, :lo12:.LANCHOR4
 	mov	w1, 6
-	strh	w1, [x0,1384]
-	b	.L2858
-.L2853:
-	mov	w0, 1
-	strh	w0, [x22,2484]
-.L2856:
-	bl	GetSwlReplaceBlock
-	uxth	w21, w0
-	mov	w0, 65535
-	cmp	w21, w0
-	bne	.L2858
-	add	x0, x20, :lo12:.LANCHOR5
-	strh	wzr, [x0,1384]
-.L2857:
-	add	x1, x20, :lo12:.LANCHOR5
-	mov	w0, 65535
-	ldrh	w21, [x1,592]
-	cmp	w21, w0
-	bne	.L3021
-	add	x26, x23, :lo12:.LANCHOR4
-	ldrh	w0, [x26,880]
-	cmp	w0, w21
-	beq	.L3022
-.L2858:
+	strh	w1, [x0, 1896]
+.L2787:
+	ldr	w1, [x29, 124]
 	mov	w0, 65535
-	cmp	w21, w0
-	cset	w0, eq
-	cbz	w0, .L2871
-	ldr	w1, [x29,132]
-	cbnz	w1, .L2871
-	add	x0, x23, :lo12:.LANCHOR4
-	mov	w22, 1
-	ldrh	w0, [x0,776]
+	cmp	w1, 0
+	ccmp	w21, w0, 0, eq
+	bne	.L2809
+	add	x0, x20, :lo12:.LANCHOR4
+	ldrh	w0, [x0, 776]
 	cmp	w0, 24
-	bhi	.L2872
+	bhi	.L2886
 	add	x1, x19, :lo12:.LANCHOR2
 	cmp	w0, 16
-	ldrh	w22, [x1,2344]
-	bls	.L2873
+	ldrh	w22, [x1, 2344]
+	bls	.L2811
 	lsr	w22, w22, 5
-	b	.L2872
-.L2873:
-	cmp	w0, 12
-	bls	.L2874
-	lsr	w22, w22, 4
-	b	.L2872
-.L2874:
-	cmp	w0, 8
-	bls	.L2872
-	lsr	w22, w22, 2
-.L2872:
+.L2810:
 	add	x1, x19, :lo12:.LANCHOR2
-	ldrh	w2, [x1,2480]
+	ldrh	w2, [x1, 2480]
 	cmp	w2, w0
-	bcs	.L2876
-	add	x3, x23, :lo12:.LANCHOR4
+	bcs	.L2814
+	add	x3, x20, :lo12:.LANCHOR4
 	mov	w2, 65535
-	ldrh	w0, [x3,880]
+	ldrh	w0, [x3, 880]
 	cmp	w0, w2
-	bne	.L2877
-	ldrh	w2, [x1,2472]
+	bne	.L2815
+	ldrh	w2, [x1, 2472]
 	cmp	w2, w0
-	bne	.L2877
-	add	x0, x20, :lo12:.LANCHOR5
-	ldrh	w2, [x0,1384]
-	cbnz	w2, .L2878
-	ldr	w0, [x1,2924]
-	ldr	w3, [x3,1068]
-	add	w0, w0, w0, lsl 1
-	cmp	w3, w0, lsr 2
-	bcs	.L2879
-.L2878:
-	add	x20, x20, :lo12:.LANCHOR5
-	add	x1, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x20,588]
-	add	w0, w0, w0, lsl 1
-	asr	w0, w0, 2
-	b	.L3019
-.L2879:
-	mov	w0, 18
-.L3019:
+	bne	.L2815
+	ldrh	w0, [x3, 1896]
+	cbnz	w0, .L2816
+	ldr	w2, [x1, 2924]
+	ldr	w3, [x3, 1068]
+	add	w2, w2, w2, lsl 1
+	cmp	w3, w2, lsr 2
+	bcs	.L2817
+.L2816:
+	add	x20, x20, :lo12:.LANCHOR4
+	add	x2, x19, :lo12:.LANCHOR2
+	ldrh	w1, [x20, 1096]
+	add	w1, w1, w1, lsl 1
+	asr	w1, w1, 2
+	strh	w1, [x2, 2480]
+.L2818:
 	add	x19, x19, :lo12:.LANCHOR2
-	strh	w0, [x1,2480]
-	str	wzr, [x19,2452]
-	b	.L2994
-.L2877:
-	add	x0, x20, :lo12:.LANCHOR5
-	add	x1, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x0,588]
+	str	wzr, [x19, 2452]
+.L2779:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 144
+	ret
+.L2781:
+	ldrh	w1, [x3, 880]
+	cmp	w1, w0
+	beq	.L2784
+	mov	w0, w21
+	bl	FtlGcFreeTempBlock
+	cbz	w0, .L2784
+	mov	w0, w21
+	b	.L2779
+.L2782:
+	ldrh	w1, [x0, 2472]
+	cmp	w1, w2
+	bne	.L2783
+	ldrh	w3, [x0, 2476]
+	cmp	w3, w1
+	beq	.L2783
+	ldrh	w2, [x0, 2478]
+	cmp	w2, w1
+	beq	.L2783
+	mov	w1, -1
+	strh	w4, [x0, 2472]
+	strh	w3, [x0, 2474]
+	strh	w2, [x0, 2476]
+	strh	w1, [x0, 2478]
+	b	.L2783
+.L2790:
+	cmp	w1, 5
+	bhi	.L2791
+	mov	w1, 18
+	b	.L2927
+.L2793:
+	mov	w0, 1
+	strh	w0, [x22, 2484]
+.L2795:
+	bl	GetSwlReplaceBlock
+	and	w21, w0, 65535
+	mov	w0, 65535
+	cmp	w21, w0
+	bne	.L2787
+	add	x0, x20, :lo12:.LANCHOR4
+	strh	wzr, [x0, 1896]
+.L2785:
+	add	x0, x20, :lo12:.LANCHOR4
+	mov	w21, 65535
+	ldrh	w0, [x0, 1104]
+	cmp	w0, w21
+	bne	.L2787
+.L2874:
+	add	x25, x20, :lo12:.LANCHOR4
+	mov	w0, 65535
+	ldrh	w21, [x25, 880]
+	cmp	w21, w0
+	bne	.L2881
+	add	x26, x19, :lo12:.LANCHOR2
+	ldrh	w27, [x26, 2472]
+	cmp	w27, w21
+	bne	.L2787
+	ldrh	w0, [x25, 776]
+	mov	w1, 1024
+	cmp	w0, 24
+	mov	w0, 5120
+	csel	w0, w0, w1, cc
+	ldr	w1, [x26, 2464]
+	cmp	w1, w0
+	bls	.L2787
+	strh	wzr, [x25, 1896]
+	str	wzr, [x26, 2464]
+	bl	GetSwlReplaceBlock
+	and	w21, w0, 65535
+	cmp	w21, w27
+	bne	.L2884
+	ldrh	w1, [x25, 776]
+	ldrh	w0, [x26, 2482]
+	cmp	w1, w0
+	bcs	.L2798
+	mov	w0, 64
+	bl	List_get_gc_head_node
+	and	x0, x0, 65535
+	cmp	w0, w21
+	beq	.L2800
+	ldr	w1, [x26, 2388]
+	cbnz	w1, .L2801
+	ldrh	w1, [x26, 2296]
+	cmp	w1, 3
+	beq	.L2801
+	ldr	w1, [x26, 2392]
+	cbnz	w1, .L2801
+	ldr	w1, [x26, 2096]
+	cbnz	w1, .L2801
+	ldrb	w1, [x26, 1220]
+	cbz	w1, .L2802
+.L2801:
+	add	x1, x19, :lo12:.LANCHOR2
+	ldr	x2, [x1, 2712]
+	ldrh	w3, [x2, x0, lsl 1]
+	ldrh	w0, [x1, 2346]
+	ldrh	w2, [x1, 2276]
+	ldrh	w1, [x1, 2296]
+	cmp	w1, 3
+	mul	w2, w2, w0
+	lsr	w0, w0, 1
+	csel	w0, w0, wzr, eq
+	add	w0, w0, w2
+	cmp	w3, w0
+	bgt	.L2804
+	mov	w0, 0
+	bl	List_get_gc_head_node
+	add	x1, x19, :lo12:.LANCHOR2
+	add	x2, x20, :lo12:.LANCHOR4
+	and	w22, w0, 65535
+	ldr	w0, [x1, 2924]
+	ldr	w2, [x2, 1068]
 	add	w0, w0, w0, lsl 1
-	asr	w0, w0, 2
-	strh	w0, [x1,2480]
-.L2876:
-	cmp	w24, 2
-	bhi	.L2948
+	cmp	w2, w0, lsr 2
+	bls	.L2805
+	mov	w0, 128
+.L2928:
+	strh	w0, [x1, 2482]
+.L2806:
+	mov	w0, 65535
+	cmp	w22, w0
+	beq	.L2800
+.L2797:
+	add	x1, x19, :lo12:.LANCHOR2
+	ubfiz	x2, x22, 1, 32
+	add	x0, x20, :lo12:.LANCHOR4
+	mov	w21, w22
+	ldr	x4, [x1, 2696]
+	ldr	x3, [x1, 2712]
+	ldrh	w5, [x1, 2480]
+	mov	w1, w22
+	ldrh	w4, [x4, x2]
+	ldrh	w3, [x3, x2]
+	ldrh	w2, [x0, 776]
+	adrp	x0, .LC158
+	add	x0, x0, :lo12:.LC158
+	bl	printk
+	b	.L2800
+.L2805:
+	mov	w0, 160
+	b	.L2928
+.L2804:
 	add	x0, x19, :lo12:.LANCHOR2
-	ldr	w0, [x0,2096]
-	cbz	w0, .L2948
-	add	w22, w22, 1
-	uxth	w22, w22
-	b	.L2948
-.L2871:
-	add	x2, x23, :lo12:.LANCHOR4
-	mov	w3, 65535
-	ldrh	w1, [x2,880]
-	cmp	w1, w3
-	bne	.L2883
-	cbz	w0, .L2883
+	mov	w1, 128
+.L2929:
+	strh	w1, [x0, 2482]
+.L2800:
+	bl	FtlGcReFreshBadBlk
+	b	.L2787
+.L2802:
+	ldr	x1, [x26, 2712]
+	ldrh	w0, [x1, x0, lsl 1]
+	cmp	w0, 7
+	bhi	.L2807
+	mov	w0, 0
+	bl	List_get_gc_head_node
+	and	w22, w0, 65535
 	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w3, [x0,2472]
-	cmp	w3, w1
-	bne	.L2883
-	add	x3, x20, :lo12:.LANCHOR5
-	ldrh	w4, [x3,592]
-	cmp	w4, w1
-	beq	.L2884
-.L2889:
-	mov	w21, 65535
-	b	.L2883
+	mov	w1, 128
+	strh	w1, [x0, 2482]
+	b	.L2806
+.L2807:
+	add	x0, x19, :lo12:.LANCHOR2
+	mov	w1, 64
+	b	.L2929
+.L2798:
+	mov	w0, 80
+	strh	w0, [x26, 2482]
+	b	.L2800
 .L2884:
-	ldrh	w4, [x2,776]
-	ldrh	w1, [x0,2480]
-	str	wzr, [x0,2452]
-	cmp	w4, w1
-	bls	.L2885
-	ldrh	w1, [x3,1384]
-	cbnz	w1, .L2886
-	ldr	w1, [x0,2924]
-	ldr	w2, [x2,1068]
-	add	w1, w1, w1, lsl 1
-	cmp	w2, w1, lsr 2
-	bcs	.L2887
+	mov	w22, w21
+	b	.L2797
+.L2881:
+	mov	w21, w0
+	b	.L2787
+.L2811:
+	cmp	w0, 12
+	bls	.L2812
+	lsr	w22, w22, 4
+	b	.L2810
+.L2812:
+	cmp	w0, 8
+	bls	.L2810
+	lsr	w22, w22, 2
+	b	.L2810
 .L2886:
-	add	x0, x20, :lo12:.LANCHOR5
+	mov	w22, 1
+	b	.L2810
+.L2817:
+	mov	w2, 18
+	strh	w2, [x1, 2480]
+	b	.L2818
+.L2815:
+	add	x0, x20, :lo12:.LANCHOR4
 	add	x1, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x0,588]
+	ldrh	w0, [x0, 1096]
 	add	w0, w0, w0, lsl 1
 	asr	w0, w0, 2
-	strh	w0, [x1,2480]
-	b	.L2888
-.L2887:
-	mov	w1, 18
-	strh	w1, [x0,2480]
+	strh	w0, [x1, 2480]
+.L2814:
+	add	x0, x19, :lo12:.LANCHOR2
+	ldr	w0, [x0, 2096]
+	cbz	w0, .L2888
+	cmp	w23, 2
+	bhi	.L2888
+	add	w22, w22, 1
+	and	w22, w22, 65535
 .L2888:
+	mov	w21, 65535
+	b	.L2820
+.L2809:
+	add	x1, x20, :lo12:.LANCHOR4
+	ldrh	w3, [x1, 880]
+	cmp	w3, w0
+	bne	.L2821
+	add	x0, x19, :lo12:.LANCHOR2
+	ldrh	w2, [x0, 2472]
+	cmp	w2, w3
+	bne	.L2821
+	cmp	w21, w2
+	bne	.L2821
+	ldrh	w2, [x1, 1104]
+	cmp	w2, w21
+	bne	.L2821
+	ldrh	w3, [x1, 776]
+	ldrh	w2, [x0, 2480]
+	str	wzr, [x0, 2452]
+	cmp	w3, w2
+	bls	.L2823
+	ldrh	w2, [x1, 1896]
+	cbnz	w2, .L2824
+	ldr	w2, [x0, 2924]
+	ldr	w1, [x1, 1068]
+	add	w2, w2, w2, lsl 1
+	cmp	w1, w2, lsr 2
+	bcs	.L2825
+.L2824:
+	add	x0, x20, :lo12:.LANCHOR4
+	add	x1, x19, :lo12:.LANCHOR2
+	ldrh	w0, [x0, 1096]
+	add	w0, w0, w0, lsl 1
+	asr	w0, w0, 2
+	strh	w0, [x1, 2480]
+.L2826:
 	bl	FtlReadRefresh
 	mov	w0, 0
 	bl	List_get_gc_head_node
-	ubfiz	x0, x0, 1, 16
 	add	x1, x19, :lo12:.LANCHOR2
-	ldr	x1, [x1,2712]
-	ldrh	w0, [x1,x0]
+	ubfiz	x0, x0, 1, 16
+	ldr	x1, [x1, 2712]
+	ldrh	w0, [x1, x0]
 	cmp	w0, 4
-	bls	.L2885
-	add	x20, x20, :lo12:.LANCHOR5
-	b	.L3020
-.L2885:
-	add	x24, x20, :lo12:.LANCHOR5
-	ldrh	w0, [x24,1384]
-	cbnz	w0, .L2889
-	ldrh	w21, [x24,588]
-	add	x22, x19, :lo12:.LANCHOR2
-	add	w1, w21, w21, lsl 1
-	asr	w1, w1, 2
-	strh	w1, [x22,2480]
+	bls	.L2823
+	add	x20, x20, :lo12:.LANCHOR4
+.L2930:
+	ldrh	w0, [x20, 1896]
+	b	.L2779
+.L2825:
+	mov	w1, 18
+	strh	w1, [x0, 2480]
+	b	.L2826
+.L2823:
+	add	x22, x20, :lo12:.LANCHOR4
+	ldrh	w0, [x22, 1896]
+	cbnz	w0, .L2821
+	ldrh	w5, [x22, 1096]
+	add	x6, x19, :lo12:.LANCHOR2
+	add	w0, w5, w5, lsl 1
+	asr	w0, w0, 2
+	strh	w0, [x6, 2480]
+	mov	w0, 0
 	bl	List_get_gc_head_node
+	ldr	x1, [x6, 2712]
 	ubfiz	x0, x0, 1, 16
-	ldr	x1, [x22,2712]
-	ldrh	w2, [x22,2276]
-	ldrh	w1, [x1,x0]
-	ldrh	w0, [x22,2346]
+	ldrh	w2, [x6, 2276]
+	ldrh	w1, [x1, x0]
+	ldrh	w0, [x6, 2346]
 	mul	w0, w0, w2
 	mov	w2, 2
 	sdiv	w0, w0, w2
 	cmp	w1, w0
-	ble	.L2890
-	add	x0, x23, :lo12:.LANCHOR4
-	sub	w21, w21, #1
-	ldrh	w0, [x0,776]
-	cmp	w0, w21
-	blt	.L2890
+	ble	.L2828
+	ldrh	w0, [x22, 776]
+	sub	w5, w5, #1
+	cmp	w0, w5
+	blt	.L2828
 	bl	FtlReadRefresh
-	ldrh	w2, [x24,1384]
-	b	.L2994
-.L2890:
-	cbnz	w1, .L2889
+	ldrh	w0, [x22, 1896]
+	b	.L2779
+.L2828:
+	cbnz	w1, .L2821
+	add	x20, x20, :lo12:.LANCHOR4
 	mov	w0, -1
-	add	x23, x23, :lo12:.LANCHOR4
 	bl	decrement_vpc_count
-	ldrh	w2, [x23,776]
-	add	w2, w2, 1
-	b	.L2994
-.L2883:
+	ldrh	w0, [x20, 776]
+	add	w0, w0, 1
+	b	.L2779
+.L2821:
 	add	x0, x19, :lo12:.LANCHOR2
-	mov	w22, 2
-	ldr	w0, [x0,2096]
-	cmp	w0, wzr
-	csinc	w22, w22, wzr, ne
-	b	.L2882
-.L2948:
-	mov	w21, 65535
-.L2882:
-	add	x0, x20, :lo12:.LANCHOR5
+	ldr	w0, [x0, 2096]
+	cmp	w0, 0
+	cset	w22, ne
+	add	w22, w22, 1
+.L2820:
+	add	x0, x20, :lo12:.LANCHOR4
 	mov	w2, 65535
-	ldrh	w1, [x0,592]
+	ldrh	w1, [x0, 1104]
 	cmp	w1, w2
-	bne	.L2892
+	bne	.L2830
 	cmp	w21, w1
-	beq	.L2893
-	strh	w21, [x0,592]
-	b	.L2894
-.L2893:
-	add	x1, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x1,2472]
-	cmp	w0, w21
-	beq	.L2894
-	ubfiz	x0, x0, 1, 16
-	ldr	x2, [x1,2712]
-	ldrh	w0, [x2,x0]
-	cbnz	w0, .L2895
-	mov	w0, -1
-	strh	w0, [x1,2472]
-.L2895:
-	add	x1, x19, :lo12:.LANCHOR2
-	add	x0, x20, :lo12:.LANCHOR5
-	ldrh	w2, [x1,2472]
-	strh	w2, [x0,592]
-	mov	w0, -1
-	strh	w0, [x1,2472]
-.L2894:
-	add	x24, x20, :lo12:.LANCHOR5
+	beq	.L2831
+	strh	w21, [x0, 1104]
+.L2832:
+	add	x5, x20, :lo12:.LANCHOR4
 	mov	w1, 65535
-	ldrh	w0, [x24,592]
-	strb	wzr, [x24,600]
+	ldrh	w0, [x5, 1104]
+	strb	wzr, [x5, 1112]
 	cmp	w0, w1
-	beq	.L2892
+	beq	.L2830
 	bl	IsBlkInGcList
-	cbz	w0, .L2897
+	cbz	w0, .L2835
 	mov	w0, -1
-	strh	w0, [x24,592]
-.L2897:
+	strh	w0, [x5, 1104]
+.L2835:
 	add	x0, x19, :lo12:.LANCHOR2
-	ldrb	w0, [x0,1220]
-	cbz	w0, .L2898
-	add	x0, x20, :lo12:.LANCHOR5
-	add	x24, x0, 592
-	ldrh	w0, [x0,592]
+	ldrb	w0, [x0, 1220]
+	cbz	w0, .L2836
+	add	x0, x20, :lo12:.LANCHOR4
+	add	x3, x0, 1104
+	ldrh	w0, [x0, 1104]
 	bl	ftl_get_blk_mode
-	strb	w0, [x24,8]
-.L2898:
-	add	x24, x20, :lo12:.LANCHOR5
+	strb	w0, [x3, 8]
+.L2836:
+	add	x12, x20, :lo12:.LANCHOR4
 	mov	w0, 65535
-	add	x25, x24, 592
-	ldrh	w1, [x24,592]
+	add	x13, x12, 1104
+	ldrh	w1, [x12, 1104]
 	cmp	w1, w0
-	beq	.L2892
-	mov	x0, x25
+	beq	.L2830
+	mov	x0, x13
 	bl	make_superblock
-	strh	wzr, [x24,594]
 	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w1, [x24,592]
-	strb	wzr, [x24,598]
-	strh	wzr, [x24,1386]
-	ldr	x0, [x0,2712]
-	ldrh	w0, [x0,x1,lsl 1]
-	strh	w0, [x24,1388]
-.L2892:
-	add	x0, x20, :lo12:.LANCHOR5
-	add	x1, x23, :lo12:.LANCHOR4
-	ldrh	w0, [x0,592]
-	ldrh	w2, [x1,784]
-	cmp	w2, w0
-	beq	.L2899
-	ldrh	w2, [x1,832]
-	cmp	w2, w0
-	beq	.L2899
-	ldrh	w1, [x1,880]
-	cmp	w1, w0
-	bne	.L2900
-.L2899:
-	add	x0, x20, :lo12:.LANCHOR5
-	mov	w1, -1
-	strh	w1, [x0,592]
-.L2900:
-	add	x25, x20, :lo12:.LANCHOR5
-.L2933:
-	ldrh	w0, [x25,592]
-	mov	w1, 65535
+	ldrh	w1, [x12, 1104]
+	strh	wzr, [x12, 1106]
+	strb	wzr, [x12, 1110]
+	ldr	x0, [x0, 2712]
+	strh	wzr, [x12, 1898]
+	ldrh	w0, [x0, x1, lsl 1]
+	strh	w0, [x12, 1900]
+.L2830:
+	add	x0, x20, :lo12:.LANCHOR4
+	ldrh	w1, [x0, 1104]
+	ldrh	w2, [x0, 784]
+	cmp	w2, w1
+	beq	.L2837
+	ldrh	w2, [x0, 832]
+	cmp	w2, w1
+	beq	.L2837
+	ldrh	w0, [x0, 880]
 	cmp	w0, w1
-	bne	.L2901
-	add	x0, x19, :lo12:.LANCHOR2
-	str	wzr, [x0,2452]
-.L2902:
-	add	x26, x19, :lo12:.LANCHOR2
-	ldrh	w24, [x26,2484]
-	mov	w0, w24
-	bl	List_get_gc_head_node
-	uxth	w27, w0
+	bne	.L2871
+.L2837:
+	add	x0, x20, :lo12:.LANCHOR4
+	mov	w1, -1
+	strh	w1, [x0, 1104]
+.L2871:
+	add	x25, x20, :lo12:.LANCHOR4
 	mov	w0, 65535
-	strh	w27, [x25,592]
-	cmp	w27, w0
-	bne	.L2903
-	strh	wzr, [x26,2484]
-	mov	w2, 8
-	b	.L2994
-.L2903:
-	mov	w0, w27
-	add	w24, w24, 1
+	ldrh	w26, [x25, 1104]
+	cmp	w26, w0
+	bne	.L2839
+	add	x23, x19, :lo12:.LANCHOR2
+	mov	w27, 2
+	str	wzr, [x23, 2452]
+.L2840:
+	ldrh	w5, [x23, 2484]
+	mov	w0, w5
+	bl	List_get_gc_head_node
+	and	w6, w0, 65535
+	strh	w6, [x25, 1104]
+	cmp	w6, w26
+	bne	.L2841
+	strh	wzr, [x23, 2484]
+	mov	w0, 8
+	b	.L2779
+.L2831:
+	add	x1, x19, :lo12:.LANCHOR2
+	ldrh	w0, [x1, 2472]
+	cmp	w0, w21
+	beq	.L2832
+	ldr	x2, [x1, 2712]
+	ubfiz	x0, x0, 1, 16
+	ldrh	w0, [x2, x0]
+	cbnz	w0, .L2833
+	mov	w0, -1
+	strh	w0, [x1, 2472]
+.L2833:
+	add	x1, x19, :lo12:.LANCHOR2
+	add	x0, x20, :lo12:.LANCHOR4
+	ldrh	w2, [x1, 2472]
+	strh	w2, [x0, 1104]
+	mov	w0, -1
+	strh	w0, [x1, 2472]
+	b	.L2832
+.L2841:
+	mov	w0, w6
 	bl	IsBlkInGcList
-	cbz	w0, .L2904
-	strh	w24, [x26,2484]
-	b	.L2902
-.L2904:
-	ldrh	w5, [x26,2276]
-	ubfiz	x1, x27, 1, 16
-	ldrh	w0, [x26,2344]
-	uxth	w24, w24
-	ldr	x2, [x26,2712]
-	mov	w3, 2
-	strh	w24, [x26,2484]
-	mul	w0, w0, w5
-	ldrh	w4, [x2,x1]
-	sdiv	w5, w0, w3
-	cmp	w4, w5
-	bgt	.L2906
-	cmp	w4, 8
-	bls	.L2907
-	cmp	w24, 48
-	bls	.L2907
-	ldrh	w4, [x25,1200]
-	cmp	w4, 35
-	bhi	.L2907
-.L2906:
-	add	x4, x19, :lo12:.LANCHOR2
-	strh	wzr, [x4,2484]
-.L2907:
-	ldrh	w1, [x2,x1]
-	mov	w2, 65535
-	cmp	w21, w2
-	bne	.L2908
-	cmp	w1, w0
-	blt	.L2908
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w2, [x0,2484]
-	cmp	w2, 3
-	bhi	.L2908
-	add	x20, x20, :lo12:.LANCHOR5
-	mov	w1, -1
-	strh	wzr, [x0,2484]
-	strh	w1, [x20,592]
-.L3020:
-	ldrh	w2, [x20,1384]
-	b	.L2994
-.L2908:
-	cbnz	w1, .L2909
+	add	w5, w5, 1
+	cbz	w0, .L2842
+	strh	w5, [x23, 2484]
+	b	.L2840
+.L2842:
+	ldrh	w4, [x23, 2276]
+	ubfiz	x1, x6, 1, 16
+	ldrh	w0, [x23, 2344]
+	and	w5, w5, 65535
+	ldr	x2, [x23, 2712]
+	strh	w5, [x23, 2484]
+	mul	w0, w0, w4
+	ldrh	w3, [x2, x1]
+	sdiv	w4, w0, w27
+	cmp	w3, w4
+	bgt	.L2844
+	cmp	w5, 48
+	bls	.L2845
+	cmp	w3, 8
+	bls	.L2845
+	ldrh	w3, [x25, 1712]
+	cmp	w3, 35
+	bhi	.L2845
+.L2844:
+	strh	wzr, [x23, 2484]
+.L2845:
+	ldrh	w1, [x2, x1]
+	cmp	w0, w1
+	bgt	.L2846
+	cmp	w21, w26
+	bne	.L2846
+	ldrh	w0, [x23, 2484]
+	cmp	w0, 3
+	bhi	.L2846
+	add	x20, x20, :lo12:.LANCHOR4
+	mov	w0, -1
+	strh	wzr, [x23, 2484]
+	strh	w0, [x20, 1104]
+	b	.L2930
+.L2846:
+	cbnz	w1, .L2847
 	mov	w0, -1
 	bl	decrement_vpc_count
-	add	x1, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x1,2484]
+	ldrh	w0, [x23, 2484]
 	add	w0, w0, 1
-	strh	w0, [x1,2484]
-	b	.L2902
-.L2909:
+	strh	w0, [x23, 2484]
+	b	.L2840
+.L2847:
 	add	x0, x19, :lo12:.LANCHOR2
-	strb	wzr, [x25,600]
-	ldrb	w0, [x0,1220]
-	cbz	w0, .L2910
-	mov	w0, w27
+	add	x3, x20, :lo12:.LANCHOR4
+	add	x3, x3, 1104
+	ldrb	w0, [x0, 1220]
+	strb	wzr, [x3, 8]
+	cbz	w0, .L2848
+	mov	w0, w6
 	bl	ftl_get_blk_mode
-	strb	w0, [x25,600]
-.L2910:
-	add	x24, x25, 592
-	mov	x0, x24
+	strb	w0, [x3, 8]
+.L2848:
+	add	x12, x20, :lo12:.LANCHOR4
+	add	x13, x12, 1104
+	mov	x0, x13
 	bl	make_superblock
-	strh	wzr, [x25,1386]
+	ldrh	w1, [x12, 1104]
 	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w1, [x25,592]
-	ldr	x0, [x0,2712]
-	ldrh	w0, [x0,x1,lsl 1]
-	strh	w0, [x25,1388]
-	strh	wzr, [x25,594]
-	strb	wzr, [x25,598]
-.L2901:
-	ldr	w0, [x29,132]
+	strh	wzr, [x12, 1898]
+	ldr	x0, [x0, 2712]
+	ldrh	w0, [x0, x1, lsl 1]
+	strh	w0, [x12, 1900]
+	strh	wzr, [x12, 1106]
+	strb	wzr, [x12, 1110]
+.L2839:
+	ldr	w0, [x29, 124]
 	cmp	w0, 1
-	bne	.L2911
+	bne	.L2849
 	bl	FtlReadRefresh
-.L2911:
+.L2849:
 	add	x0, x19, :lo12:.LANCHOR2
 	mov	w1, 1
-	str	w1, [x0,2448]
-	ldrh	w1, [x0,2344]
-	str	w1, [x29,136]
-	ldrb	w1, [x0,1220]
-	cbz	w1, .L2912
-	ldrb	w1, [x25,600]
+	str	w1, [x0, 2448]
+	ldrb	w1, [x0, 1220]
+	ldrh	w25, [x0, 2344]
+	cbz	w1, .L2850
+	add	x1, x20, :lo12:.LANCHOR4
+	ldrb	w1, [x1, 1112]
 	cmp	w1, 1
-	bne	.L2912
-	ldrh	w0, [x0,2346]
-	str	w0, [x29,136]
-.L2912:
-	ldrh	w0, [x25,594]
-	ldr	w2, [x29,136]
+	bne	.L2850
+	ldrh	w25, [x0, 2346]
+.L2850:
+	add	x0, x20, :lo12:.LANCHOR4
+	ldrh	w0, [x0, 1106]
 	add	w1, w0, w22
-	cmp	w1, w2
-	ble	.L2913
-	sub	w22, w2, w0
-	uxth	w22, w22
-.L2913:
-	mov	w27, 0
-.L2914:
-	cmp	w22, w27, uxth
-	bls	.L2921
-	add	x1, x25, 592
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w4, [x1,2]
-	ldrh	w7, [x0,2276]
-	mov	x0, 0
-	add	w4, w4, w27
-	mov	w24, w0
-.L2922:
-	cmp	w7, w0, uxth
-	bls	.L3023
-	add	x2, x1, x0, lsl 1
-	mov	w3, 65535
-	ldrh	w2, [x2,16]
-	cmp	w2, w3
-	beq	.L2915
-	add	x6, x19, :lo12:.LANCHOR2
-	mov	w3, 56
-	orr	w2, w4, w2, lsl 10
-	umull	x5, w24, w3
-	ldr	x6, [x6,2552]
-	add	w24, w24, 1
-	add	x5, x6, x5
-	uxth	w24, w24
-	str	w2, [x5,4]
-.L2915:
-	add	x0, x0, 1
-	b	.L2922
-.L3023:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrb	w2, [x25,600]
-	mov	w1, w24
-	mov	x28, 0
-	ldr	x0, [x0,2552]
+	cmp	w1, w25
+	ble	.L2851
+	sub	w22, w25, w0
+	and	w22, w22, 65535
+.L2851:
+	add	x24, x20, :lo12:.LANCHOR4
+	mov	w26, 0
+	add	x27, x24, 880
+.L2852:
+	cmp	w22, w26, uxth
+	bls	.L2859
+	add	x1, x19, :lo12:.LANCHOR2
+	ldrh	w5, [x24, 1106]
+	add	x3, x24, 1120
+	mov	w23, 0
+	add	w5, w5, w26
+	mov	w0, 0
+	ldrh	w9, [x1, 2276]
+	mov	w8, 65535
+	mov	w7, 56
+	b	.L2860
+.L2854:
+	ldrh	w2, [x3]
+	cmp	w2, w8
+	beq	.L2853
+	ldr	x6, [x1, 2552]
+	orr	w2, w5, w2, lsl 10
+	umaddl	x6, w23, w7, x6
+	add	w23, w23, 1
+	and	w23, w23, 65535
+	str	w2, [x6, 4]
+.L2853:
+	add	w0, w0, 1
+	add	x3, x3, 2
+	and	w0, w0, 65535
+.L2860:
+	cmp	w0, w9
+	bne	.L2854
+	add	x3, x19, :lo12:.LANCHOR2
+	ldrb	w2, [x24, 1112]
+	mov	w1, w23
+	mov	x28, x3
+	ldr	x0, [x3, 2552]
 	bl	FlashReadPages
-	add	x0, x23, :lo12:.LANCHOR4
-	str	x0, [x29,120]
-.L2917:
-	cmp	w24, w28, uxth
-	bls	.L3024
-	add	x26, x19, :lo12:.LANCHOR2
-	mov	x0, 56
-	mul	x5, x28, x0
-	ldr	x0, [x26,2552]
-	add	x1, x0, x5
-	ldr	w0, [x0,x5]
+	mov	w0, 56
+	umull	x0, w23, w0
+	mov	x23, 0
+	str	x0, [x29, 112]
+.L2855:
+	ldr	x0, [x29, 112]
+	cmp	x0, x23
+	bne	.L2858
+	add	w26, w26, 1
+	b	.L2852
+.L2858:
+	ldr	x0, [x28, 2552]
+	add	x1, x0, x23
+	ldr	w0, [x0, x23]
 	cmn	w0, #1
-	ldr	x6, [x1,16]
-	beq	.L2951
-	ldrh	w0, [x6]
+	beq	.L2856
+	ldr	x5, [x1, 16]
 	mov	w1, 61589
+	ldrh	w0, [x5]
 	cmp	w0, w1
-	bne	.L2951
-	ldr	w0, [x6,8]
-	add	x1, x29, 152
+	bne	.L2856
+	ldr	w0, [x5, 8]
 	mov	w2, 0
-	str	x5, [x29,104]
-	str	x6, [x29,112]
+	add	x1, x29, 136
+	str	x5, [x29, 104]
 	bl	log2phys
-	ldr	x2, [x26,2552]
-	ldr	x5, [x29,104]
-	ldr	w0, [x29,152]
-	add	x2, x2, x5
-	ldr	x6, [x29,112]
-	and	w0, w0, 2147483647
-	ldr	w1, [x2,4]
-	cmp	w0, w1
-	bne	.L2951
-	ldrh	w0, [x25,1386]
-	mov	x3, 56
-	ldr	x1, [x26,2528]
-	add	w0, w0, 1
-	strh	w0, [x25,1386]
-	ldr	w0, [x25,1168]
-	str	x5, [x29,96]
-	str	x6, [x29,104]
-	madd	x1, x0, x3, x1
-	ldr	w0, [x2,24]
-	str	x1, [x29,112]
-	str	w0, [x1,24]
+	ldr	x0, [x28, 2552]
+	ldr	w1, [x29, 136]
+	add	x0, x0, x23
+	ldr	x5, [x29, 104]
+	and	w1, w1, 2147483647
+	ldr	w2, [x0, 4]
+	cmp	w1, w2
+	bne	.L2856
+	ldrh	w1, [x24, 1898]
+	mov	w2, 56
+	ldr	x7, [x28, 2528]
+	add	w1, w1, 1
+	strh	w1, [x24, 1898]
+	ldr	w1, [x24, 1680]
+	ldr	w0, [x0, 24]
+	str	w2, [x29, 120]
+	nop // between mem op and mult-accumulate
+	umaddl	x1, w1, w2, x7
+	stp	x5, x1, [x29, 96]
+	str	w0, [x1, 24]
 	bl	Ftl_get_new_temp_ppa
-	ldr	x1, [x29,112]
-	mov	x2, 56
-	ldr	x5, [x29,96]
-	ldr	x6, [x29,104]
-	str	w0, [x1,4]
-	ldr	w0, [x25,1168]
-	ldr	x1, [x26,2528]
-	madd	x0, x0, x2, x1
-	ldr	x1, [x26,2552]
-	add	x1, x1, x5
-	ldr	x2, [x1,8]
-	str	x2, [x0,8]
-	ldr	x1, [x1,16]
-	str	x1, [x0,16]
+	ldp	x5, x1, [x29, 96]
+	ldr	w2, [x29, 120]
+	str	w0, [x1, 4]
+	ldr	w0, [x24, 1680]
+	ldr	x1, [x28, 2528]
+	umaddl	x0, w0, w2, x1
+	ldr	x1, [x28, 2552]
+	add	x1, x1, x23
+	ldr	x2, [x1, 8]
+	str	x2, [x0, 8]
+	ldr	x1, [x1, 16]
+	str	x1, [x0, 16]
+	ldr	w0, [x29, 136]
 	mov	w1, 1
-	ldr	w0, [x29,152]
-	str	w0, [x6,12]
-	ldr	x0, [x29,120]
-	add	x2, x0, 880
-	str	x2, [x29,112]
-	ldrh	w0, [x0,880]
-	strh	w0, [x6,2]
-	ldr	w0, [x26,2400]
-	str	w0, [x6,4]
-	ldr	w0, [x25,1168]
+	str	w0, [x5, 12]
+	ldrh	w0, [x27]
+	strh	w0, [x5, 2]
+	ldr	w0, [x28, 2400]
+	str	w0, [x5, 4]
+	ldr	w0, [x24, 1680]
 	add	w0, w0, 1
-	str	w0, [x25,1168]
-	ldr	x0, [x26,2552]
-	add	x0, x0, x5
+	str	w0, [x24, 1680]
+	ldr	x0, [x28, 2552]
+	add	x0, x0, x23
 	bl	FtlGcBufAlloc
-	ldrb	w0, [x26,1220]
-	cbnz	w0, .L2919
-	ldr	x2, [x29,112]
-	ldr	w1, [x25,1168]
-	ldrb	w0, [x2,7]
+	ldrb	w0, [x28, 1220]
+	cbnz	w0, .L2857
+	ldrb	w1, [x27, 7]
+	ldr	w0, [x24, 1680]
 	cmp	w1, w0
-	beq	.L2919
-	ldrh	w0, [x2,4]
-	cbnz	w0, .L2951
-.L2919:
+	beq	.L2857
+	ldrh	w0, [x27, 4]
+	cbnz	w0, .L2856
+.L2857:
 	bl	Ftl_gc_temp_data_write_back
-	cbz	w0, .L2951
-	add	x20, x20, :lo12:.LANCHOR5
+	cbz	w0, .L2856
+	add	x20, x20, :lo12:.LANCHOR4
 	add	x19, x19, :lo12:.LANCHOR2
 	mov	w0, -1
-	str	wzr, [x19,2448]
-	strh	w0, [x20,592]
-	strh	wzr, [x20,594]
-	b	.L3020
-.L2951:
-	add	x28, x28, 1
-	b	.L2917
-.L3024:
-	add	w27, w27, 1
-	b	.L2914
-.L2921:
-	ldrh	w0, [x25,594]
+	strh	wzr, [x20, 1106]
+	strh	w0, [x20, 1104]
+	str	wzr, [x19, 2448]
+	b	.L2930
+.L2856:
+	add	x23, x23, 56
+	b	.L2855
+.L2859:
+	add	x23, x20, :lo12:.LANCHOR4
+	ldrh	w0, [x23, 1106]
 	add	w22, w22, w0
-	ldr	w0, [x29,136]
-	uxth	w22, w22
-	strh	w22, [x25,594]
-	cmp	w22, w0
-	bcc	.L2923
-	ldr	w0, [x25,1168]
-	cbz	w0, .L2924
+	and	w22, w22, 65535
+	strh	w22, [x23, 1106]
+	cmp	w25, w22
+	bhi	.L2861
+	ldr	w0, [x23, 1680]
+	cbz	w0, .L2862
 	bl	Ftl_gc_temp_data_write_back
-	cbz	w0, .L2924
+	cbz	w0, .L2862
 	add	x19, x19, :lo12:.LANCHOR2
-	ldrh	w2, [x25,1384]
-	str	wzr, [x19,2448]
-	b	.L2994
-.L2924:
-	ldrh	w22, [x25,1386]
-	cbnz	w22, .L2925
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w1, [x25,592]
-	ldr	x0, [x0,2712]
-	ldrh	w0, [x0,x1,lsl 1]
-	cbz	w0, .L2925
-.L2926:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	w0, [x0,2924]
+	ldrh	w0, [x23, 1896]
+	str	wzr, [x19, 2448]
+	b	.L2779
+.L2862:
+	add	x0, x20, :lo12:.LANCHOR4
+	ldrh	w1, [x0, 1898]
+	cbnz	w1, .L2863
+	add	x1, x19, :lo12:.LANCHOR2
+	ldrh	w3, [x0, 1104]
+	ldr	x2, [x1, 2712]
+	ldrh	w2, [x2, x3, lsl 1]
+	cbz	w2, .L2863
+	mov	x25, x1
+	mov	x23, x0
+	mov	w22, 0
+.L2864:
+	ldr	w0, [x25, 2924]
 	cmp	w22, w0
-	bcs	.L2931
-	mov	w0, w22
-	add	x1, x29, 156
+	bcs	.L2869
 	mov	w2, 0
+	add	x1, x29, 140
+	mov	w0, w22
 	bl	log2phys
-	ldr	w0, [x29,156]
+	ldr	w0, [x29, 140]
 	cmn	w0, #1
-	beq	.L2927
+	beq	.L2865
 	lsr	w0, w0, 10
 	bl	P2V_block_in_plane
-	ldrh	w1, [x25,592]
+	ldrh	w1, [x23, 1104]
 	cmp	w1, w0, uxth
-	bne	.L2927
-.L2931:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	w1, [x0,2924]
-	cmp	w22, w1
-	bcc	.L2925
-	ldrh	w1, [x25,592]
-	ldr	x0, [x0,2712]
-	strh	wzr, [x0,x1,lsl 1]
-	ldrh	w0, [x25,592]
+	bne	.L2865
+.L2869:
+	add	x1, x19, :lo12:.LANCHOR2
+	ldr	w0, [x1, 2924]
+	cmp	w22, w0
+	bcc	.L2863
+	add	x0, x20, :lo12:.LANCHOR4
+	ldr	x1, [x1, 2712]
+	ldrh	w2, [x0, 1104]
+	strh	wzr, [x1, x2, lsl 1]
+	ldrh	w0, [x0, 1104]
 	bl	update_vpc_list
 	bl	FtlCacheWriteBack
 	bl	l2p_flush
 	bl	FtlVpcTblFlush
-	b	.L2925
-.L2927:
-	add	w22, w22, 1
-	b	.L2926
-.L2925:
-	mov	w0, -1
-	strh	w0, [x25,592]
-.L2923:
-	add	x0, x23, :lo12:.LANCHOR4
-	ldrh	w0, [x0,776]
-	cmp	w0, 2
-	bhi	.L2932
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w22, [x0,2344]
-	b	.L2933
-.L2932:
-	add	x20, x20, :lo12:.LANCHOR5
-	add	x19, x19, :lo12:.LANCHOR2
-	ldrh	w2, [x20,1384]
-	str	wzr, [x19,2448]
-	cmp	w2, wzr
-	csinc	w2, w2, w0, ne
-	b	.L2994
-.L3022:
-	add	x25, x19, :lo12:.LANCHOR2
-	ldrh	w27, [x25,2472]
-	cmp	w27, w21
-	bne	.L2858
-	ldrh	w0, [x26,776]
-	mov	w3, 1024
-	ldr	w2, [x25,2464]
-	cmp	w0, 24
-	mov	w0, 5120
-	csel	w0, w0, w3, cc
-	cmp	w2, w0
-	bls	.L2858
-	str	wzr, [x25,2464]
-	strh	wzr, [x1,1384]
-	bl	GetSwlReplaceBlock
-	uxth	w21, w0
-	cmp	w21, w27
-	bne	.L2860
-	ldrh	w1, [x26,776]
-	ldrh	w0, [x25,2482]
-	cmp	w1, w0
-	bcs	.L2861
-	mov	w0, 64
-	bl	List_get_gc_head_node
-	uxth	w0, w0
-	cmp	w0, w21
-	beq	.L2870
-	ldr	w2, [x25,2388]
-	uxtw	x1, w0
-	cbnz	w2, .L2863
-	ldrh	w0, [x25,2296]
-	cmp	w0, 3
-	beq	.L2863
-	ldr	w0, [x25,2392]
-	cbnz	w0, .L2863
-	ldr	w0, [x25,2096]
-	cbnz	w0, .L2863
-	ldrb	w0, [x25,1220]
-	cbz	w0, .L2864
 .L2863:
-	add	x2, x19, :lo12:.LANCHOR2
-	ldr	x0, [x2,2712]
-	ldrh	w4, [x0,x1,lsl 1]
-	ldrh	w1, [x2,2346]
-	ldrh	w0, [x2,2276]
-	ldrh	w2, [x2,2296]
-	mul	w3, w1, w0
-	cmp	w2, 3
-	mov	w0, 0
-	lsr	w1, w1, 1
-	csel	w0, w1, w0, eq
-	add	w0, w3, w0
-	cmp	w4, w0
-	bgt	.L2866
-	mov	w0, 0
-	bl	List_get_gc_head_node
-	uxth	w21, w0
-	add	x1, x19, :lo12:.LANCHOR2
-	add	x2, x23, :lo12:.LANCHOR4
-	ldr	w0, [x1,2924]
-	ldr	w2, [x2,1068]
-	add	w0, w0, w0, lsl 1
-	cmp	w2, w0, lsr 2
-	bls	.L2867
-	mov	w0, 128
-	b	.L3017
-.L2867:
-	mov	w0, 160
-.L3017:
-	strh	w0, [x1,2482]
-	b	.L2868
-.L2866:
-	add	x0, x19, :lo12:.LANCHOR2
-	mov	w1, 128
-	b	.L3018
-.L2864:
-	ldr	x2, [x25,2712]
-	ldrh	w1, [x2,x1,lsl 1]
-	cmp	w1, 7
-	bhi	.L2869
-	bl	List_get_gc_head_node
-	uxth	w21, w0
-	add	x0, x19, :lo12:.LANCHOR2
-	mov	w1, 128
-	strh	w1, [x0,2482]
-	b	.L2868
-.L2869:
-	add	x0, x19, :lo12:.LANCHOR2
-	mov	w1, 64
-.L3018:
-	strh	w1, [x0,2482]
-	b	.L2870
+	add	x0, x20, :lo12:.LANCHOR4
+	mov	w1, -1
+	strh	w1, [x0, 1104]
 .L2861:
-	mov	w0, 80
-	strh	w0, [x25,2482]
-	b	.L2870
-.L2868:
-	mov	w0, 65535
-	cmp	w21, w0
-	beq	.L2870
-.L2860:
-	add	x5, x19, :lo12:.LANCHOR2
-	ubfiz	x4, x21, 1, 32
-	add	x2, x23, :lo12:.LANCHOR4
-	adrp	x0, .LC158
-	add	x0, x0, :lo12:.LC158
-	mov	w1, w21
-	ldr	x3, [x5,2712]
-	ldr	x6, [x5,2696]
-	ldrh	w2, [x2,776]
-	ldrh	w3, [x3,x4]
-	ldrh	w5, [x5,2480]
-	ldrh	w4, [x6,x4]
-	bl	printk
+	add	x0, x20, :lo12:.LANCHOR4
+	ldrh	w1, [x0, 776]
+	cmp	w1, 2
+	bhi	.L2870
+	add	x0, x19, :lo12:.LANCHOR2
+	ldrh	w22, [x0, 2344]
+	b	.L2871
+.L2865:
+	add	w22, w22, 1
+	b	.L2864
 .L2870:
-	bl	FtlGcReFreshBadBlk
-	b	.L2858
-.L3021:
-	mov	w21, w0
-	b	.L2858
-.L2994:
-	mov	w0, w2
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 160
-	ret
+	ldrh	w0, [x0, 1896]
+	add	x19, x19, :lo12:.LANCHOR2
+	cmp	w0, 0
+	csinc	w0, w0, w1, ne
+	str	wzr, [x19, 2448]
+	b	.L2779
+.L2878:
+	mov	w0, 0
+	b	.L2779
 	.size	ftl_do_gc, .-ftl_do_gc
 	.align	2
 	.global	FtlCacheWriteBack
 	.type	FtlCacheWriteBack, %function
 FtlCacheWriteBack:
-	stp	x29, x30, [sp, -128]!
+	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	adrp	x23, .LANCHOR5
-	add	x0, x23, :lo12:.LANCHOR5
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	adrp	x19, .LANCHOR2
-	ldr	x20, [x0,1392]
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	w22, [x0,2928]
-	cbnz	w22, .L3027
-	ldr	w1, [x0,2496]
-	cbz	w1, .L3027
-	ldrb	w0, [x0,1220]
-	cbz	w0, .L3029
-	ldrb	w0, [x20,8]
+	stp	x21, x22, [sp, 32]
+	adrp	x22, .LANCHOR2
+	add	x0, x22, :lo12:.LANCHOR2
+	stp	x19, x20, [sp, 16]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldr	w24, [x0, 2928]
+	cbnz	w24, .L2933
+	ldr	w1, [x0, 2496]
+	cbz	w1, .L2933
+	ldrb	w0, [x0, 1220]
+	adrp	x23, .LANCHOR4
+	add	x2, x23, :lo12:.LANCHOR4
+	ldr	x20, [x2, 1904]
+	cbz	w0, .L2958
+	ldrb	w0, [x20, 8]
 	cmp	w0, 1
-	cset	w22, eq
-.L3029:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrb	w3, [x20,9]
+	cset	w25, eq
+.L2935:
+	add	x19, x22, :lo12:.LANCHOR2
+	ldrb	w3, [x20, 9]
 	adrp	x26, .LC159
-	mov	w2, w22
-	mov	w24, 0
+	mov	w2, w25
+	mov	w21, 0
 	mov	w27, 56
-	ldr	x0, [x0,2560]
+	ldr	x0, [x19, 2560]
 	add	x26, x26, :lo12:.LC159
 	bl	FlashProgPages
-.L3030:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	w1, [x0,2496]
-	cmp	w24, w1
-	bcs	.L3048
-	umull	x21, w24, w27
-	ldr	x1, [x0,2560]
-	add	x0, x1, x21
-	ldr	w25, [x1,x21]
-	cmn	w25, #1
-	beq	.L3051
-	ldr	w1, [x0,4]
-	cbz	w22, .L3065
-	orr	w1, w1, -2147483648
-.L3065:
-	ldr	w0, [x0,24]
+.L2936:
+	ldr	w0, [x19, 2496]
+	cmp	w21, w0
+	bcc	.L2943
+.L2955:
+	add	x22, x22, :lo12:.LANCHOR2
+	str	wzr, [x22, 2496]
+.L2933:
+	ldp	x19, x20, [sp, 16]
+	mov	w0, 0
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L2958:
+	mov	w25, 0
+	b	.L2935
+.L2943:
+	umull	x28, w21, w27
+	ldr	x0, [x19, 2560]
+	add	x3, x0, x28
+	ldr	w0, [x0, x28]
+	cmn	w0, #1
+	bne	.L2937
+	add	x19, x22, :lo12:.LANCHOR2
+	add	x23, x23, :lo12:.LANCHOR4
+.L2938:
+	ldr	w0, [x19, 2496]
+	cmp	w24, w0
+	bcc	.L2953
+	add	x20, x22, :lo12:.LANCHOR2
+	mov	w19, 16386
+.L2956:
+	ldrh	w0, [x20, 2486]
+	cbz	w0, .L2955
+	mov	w1, 1
+	mov	w0, w1
+	bl	ftl_do_gc
+	subs	w19, w19, #1
+	bne	.L2956
+	b	.L2955
+.L2937:
+	ldr	w0, [x3, 4]
+	cbnz	w25, .L2939
+.L2972:
+	str	w0, [x29, 108]
+	mov	w2, 1
+	ldr	w0, [x3, 24]
+	add	x1, x29, 108
+	bl	log2phys
+	ldr	x0, [x19, 2560]
+	add	x0, x0, x28
+	ldr	x0, [x0, 16]
+	ldr	w0, [x0, 12]
+	cmn	w0, #1
+	beq	.L2941
+	lsr	w0, w0, 10
+	bl	P2V_block_in_plane
+	ldr	x2, [x19, 2712]
+	and	w1, w0, 65535
+	ubfiz	x0, x1, 1, 16
+	mov	w28, w1
+	ldrh	w0, [x2, x0]
+	cbnz	w0, .L2942
+	mov	w2, 0
+	mov	x0, x26
+	bl	printk
+.L2942:
+	mov	w0, w28
+	bl	decrement_vpc_count
+.L2941:
+	add	w21, w21, 1
+	b	.L2936
+.L2939:
+	orr	w0, w0, -2147483648
+	b	.L2972
+.L2953:
+	mov	w21, 56
+	ldr	x0, [x19, 2560]
+	mov	w1, -1
+	mov	w26, 1
+	umull	x21, w24, w21
+	str	w1, [x0, x21]
+.L2944:
+	ldr	x0, [x19, 2560]
+	add	x3, x0, x21
+	ldr	w0, [x0, x21]
+	cmn	w0, #1
+	ldr	w0, [x3, 4]
+	beq	.L2948
+	cbnz	w25, .L2949
+.L2973:
+	str	w0, [x29, 108]
 	mov	w2, 1
-	str	w1, [x29,124]
-	add	x25, x19, :lo12:.LANCHOR2
-	add	x1, x29, 124
+	ldr	w0, [x3, 24]
+	add	x1, x29, 108
 	bl	log2phys
-	ldr	x0, [x25,2560]
+	ldr	x0, [x19, 2560]
 	add	x21, x0, x21
-	ldr	x0, [x21,16]
-	ldr	w0, [x0,12]
+	ldr	x0, [x21, 16]
+	ldr	w0, [x0, 12]
 	cmn	w0, #1
-	beq	.L3034
-	lsr	x0, x0, 10
+	beq	.L2951
+	lsr	w0, w0, 10
 	bl	P2V_block_in_plane
-	uxth	w1, w0
+	ldr	x2, [x19, 2712]
+	and	w1, w0, 65535
 	ubfiz	x0, x1, 1, 16
-	ldr	x2, [x25,2712]
 	mov	w21, w1
-	ldrh	w2, [x2,x0]
-	cbnz	w2, .L3035
-	mov	x0, x26
+	ldrh	w0, [x2, x0]
+	cbnz	w0, .L2952
+	adrp	x0, .LC159
+	mov	w2, 0
+	add	x0, x0, :lo12:.LC159
 	bl	printk
-.L3035:
+.L2952:
 	mov	w0, w21
 	bl	decrement_vpc_count
-.L3034:
+.L2951:
 	add	w24, w24, 1
-	b	.L3030
-.L3067:
-	mov	w20, 16386
-.L3047:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x0,2486]
-	cbz	w0, .L3048
-	mov	w0, 1
-	mov	w1, w0
-	bl	ftl_do_gc
-	subs	w20, w20, #1
-	bne	.L3047
-.L3048:
-	add	x19, x19, :lo12:.LANCHOR2
-	str	wzr, [x19,2496]
-	b	.L3027
-.L3051:
-	adrp	x26, .LC159
-	add	x0, x23, :lo12:.LANCHOR5
-	mov	w24, 0
-	mov	w27, 56
-	str	x0, [x29,104]
-	add	x26, x26, :lo12:.LC159
-.L3031:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	w1, [x0,2496]
-	cmp	w24, w1
-	bcs	.L3067
-	umull	x21, w24, w27
-	ldr	x0, [x0,2560]
-	mov	w28, 1
-	str	w25, [x0,x21]
-.L3037:
-	add	x2, x19, :lo12:.LANCHOR2
-	ldr	x0, [x2,2560]
-	add	x1, x0, x21
-	ldr	w0, [x0,x21]
-	cmn	w0, #1
-	bne	.L3068
-	ldr	w0, [x1,4]
-	str	x2, [x29,96]
-	lsr	x0, x0, 10
+	b	.L2938
+.L2948:
+	lsr	w0, w0, 10
 	bl	P2V_block_in_plane
 	ldrh	w1, [x20]
 	cmp	w1, w0, uxth
-	ldr	x2, [x29,96]
-	bne	.L3038
-	ldr	x3, [x2,2712]
+	bne	.L2945
+	ldr	x2, [x19, 2712]
 	ubfiz	x1, x1, 1, 16
-	ldrh	w4, [x20,4]
-	ldrh	w0, [x3,x1]
-	sub	w0, w0, w4
-	strh	w0, [x3,x1]
-	strb	wzr, [x20,6]
-	ldrh	w0, [x2,2344]
-	strh	w0, [x20,2]
-	strh	wzr, [x20,4]
-.L3038:
-	ldrh	w0, [x20,4]
-	cbnz	w0, .L3039
+	ldrh	w3, [x20, 4]
+	ldrh	w0, [x2, x1]
+	sub	w0, w0, w3
+	strh	w0, [x2, x1]
+	strb	wzr, [x20, 6]
+	ldrh	w0, [x19, 2344]
+	strh	w0, [x20, 2]
+	strh	wzr, [x20, 4]
+.L2945:
+	ldrh	w0, [x20, 4]
+	cbnz	w0, .L2946
 	mov	x0, x20
 	bl	allocate_new_data_superblock
-.L3039:
-	ldr	x0, [x29,104]
-	add	x23, x19, :lo12:.LANCHOR2
-	add	x1, x0, 640
-	ldr	w0, [x0,736]
+.L2946:
+	ldr	w0, [x23, 1248]
 	add	w0, w0, 1
-	str	w0, [x1,96]
-	ldr	x0, [x23,2560]
+	str	w0, [x23, 1248]
+	ldr	x0, [x19, 2560]
 	add	x0, x0, x21
-	ldr	w0, [x0,4]
-	lsr	x0, x0, 10
+	ldr	w0, [x0, 4]
+	lsr	w0, w0, 10
 	bl	FtlGcMarkBadPhyBlk
 	mov	x0, x20
 	bl	get_new_active_ppa
-	str	w0, [x29,124]
-	ldr	x1, [x23,2560]
-	mov	w2, w22
+	ldr	x1, [x19, 2560]
+	mov	w2, w25
+	str	w0, [x29, 108]
 	add	x1, x1, x21
-	str	w0, [x1,4]
+	str	w0, [x1, 4]
 	mov	w1, 1
-	ldr	x0, [x23,2560]
-	ldrb	w3, [x20,9]
+	ldrb	w3, [x20, 9]
+	ldr	x0, [x19, 2560]
 	add	x0, x0, x21
 	bl	FlashProgPages
-	ldr	x0, [x23,2560]
-	ldr	w0, [x0,x21]
+	ldr	x0, [x19, 2560]
+	ldr	w0, [x0, x21]
 	cmn	w0, #1
-	bne	.L3040
-	str	w28, [x23,2928]
-.L3040:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	w0, [x0,2928]
-	cbz	w0, .L3037
-	b	.L3027
-.L3068:
-	ldr	w0, [x1,4]
-	cbz	w22, .L3066
+	bne	.L2947
+	str	w26, [x19, 2928]
+.L2947:
+	ldr	w0, [x19, 2928]
+	cbz	w0, .L2944
+	b	.L2933
+.L2949:
 	orr	w0, w0, -2147483648
-.L3066:
-	str	w0, [x29,124]
-	mov	w2, 1
-	ldr	w0, [x1,24]
-	add	x28, x19, :lo12:.LANCHOR2
-	add	x1, x29, 124
-	bl	log2phys
-	ldr	x0, [x28,2560]
-	add	x21, x0, x21
-	ldr	x0, [x21,16]
-	ldr	w0, [x0,12]
-	cmn	w0, #1
-	beq	.L3044
-	lsr	x0, x0, 10
-	bl	P2V_block_in_plane
-	uxth	w1, w0
-	ubfiz	x0, x1, 1, 16
-	ldr	x2, [x28,2712]
-	mov	w21, w1
-	ldrh	w2, [x2,x0]
-	cbnz	w2, .L3045
-	mov	x0, x26
-	bl	printk
-.L3045:
-	mov	w0, w21
-	bl	decrement_vpc_count
-.L3044:
-	add	w24, w24, 1
-	b	.L3031
-.L3027:
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
-	ret
+	b	.L2973
 	.size	FtlCacheWriteBack, .-FtlCacheWriteBack
 	.align	2
 	.global	FtlSysFlush
 	.type	FtlSysFlush, %function
 FtlSysFlush:
 	adrp	x0, .LANCHOR2+2928
+	ldr	w0, [x0, #:lo12:.LANCHOR2+2928]
+	cbnz	w0, .L2977
 	stp	x29, x30, [sp, -32]!
-	add	x29, sp, 0
-	ldr	w0, [x0,#:lo12:.LANCHOR2+2928]
-	str	x19, [sp,16]
-	cbnz	w0, .L3070
 	adrp	x0, .LANCHOR1+3448
-	ldr	w19, [x0,#:lo12:.LANCHOR1+3448]
+	add	x29, sp, 0
+	str	x19, [sp, 16]
+	ldr	w19, [x0, #:lo12:.LANCHOR1+3448]
 	cmp	w19, 1
-	bne	.L3070
+	bne	.L2975
 	bl	FtlCacheWriteBack
 	bl	l2p_flush
 	mov	w0, w19
 	bl	FtlEctTblFlush
 	bl	FtlVpcTblFlush
-.L3070:
+.L2975:
 	mov	w0, 0
-	ldr	x19, [sp,16]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L2977:
+	mov	w0, 0
+	ret
 	.size	FtlSysFlush, .-FtlSysFlush
 	.align	2
 	.global	FtlDeInit
 	.type	FtlDeInit, %function
 FtlDeInit:
 	adrp	x0, .LANCHOR1+3448
+	ldr	w0, [x0, #:lo12:.LANCHOR1+3448]
+	cmp	w0, 1
+	bne	.L2983
 	stp	x29, x30, [sp, -16]!
 	add	x29, sp, 0
-	ldr	w0, [x0,#:lo12:.LANCHOR1+3448]
-	cmp	w0, 1
-	bne	.L3072
 	bl	FtlSysFlush
-.L3072:
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	ret
+.L2983:
+	mov	w0, 0
+	ret
 	.size	FtlDeInit, .-FtlDeInit
 	.align	2
 	.global	ftl_deinit
@@ -19516,96 +19067,94 @@ ftl_cache_flush:
 	.global	ftl_discard
 	.type	ftl_discard, %function
 ftl_discard:
-	stp	x29, x30, [sp, -80]!
+	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	adrp	x22, .LANCHOR2
-	str	x23, [sp,48]
-	add	x21, x22, :lo12:.LANCHOR2
-	stp	x19, x20, [sp,16]
+	stp	x21, x22, [sp, 32]
+	mov	w21, w0
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR2
+	add	x22, x20, :lo12:.LANCHOR2
+	ldr	w0, [x22, 1224]
+	cmp	w0, w21
+	bls	.L3000
 	mov	w19, w1
-	mov	w20, w0
-	ldr	w1, [x21,1224]
-	cmp	w19, w1
-	bhi	.L3083
 	cmp	w0, w1
-	bcs	.L3083
-	add	w2, w0, w19
-	mov	w0, -1
-	cmp	w2, w1
-	bhi	.L3076
+	bcc	.L3000
+	add	w1, w21, w1
+	cmp	w0, w1
+	bcc	.L3000
 	cmp	w19, 31
-	bls	.L3091
-	ldr	w0, [x21,2928]
-	cbnz	w0, .L3091
+	bhi	.L2992
+.L3008:
+	mov	w0, 0
+.L2990:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 64
+	ret
+.L2992:
+	ldr	w0, [x22, 2928]
+	cbnz	w0, .L3008
 	bl	FtlCacheWriteBack
-	ldrh	w1, [x21,2350]
-	udiv	w21, w20, w1
-	msub	w20, w1, w21, w20
-	uxth	w20, w20
-	cbz	w20, .L3079
-	sub	w20, w1, w20
-	add	w21, w21, 1
-	cmp	w20, w19
-	csel	w20, w20, w19, ls
-	sub	w19, w19, w20, uxth
-.L3079:
+	ldrh	w0, [x22, 2350]
+	udiv	w22, w21, w0
+	msub	w21, w0, w22, w21
+	ands	w21, w21, 65535
+	beq	.L2994
+	sub	w21, w0, w21
+	add	w22, w22, 1
+	cmp	w21, w19
+	csel	w21, w21, w19, ls
+	sub	w19, w19, w21, uxth
+.L2994:
+	adrp	x21, .LANCHOR4
+	add	x20, x20, :lo12:.LANCHOR2
+	add	x21, x21, :lo12:.LANCHOR4
 	mov	w0, -1
-	adrp	x23, .LANCHOR5
-	str	w0, [x29,76]
-.L3080:
-	add	x20, x22, :lo12:.LANCHOR2
-	ldrh	w0, [x20,2350]
+	str	w0, [x29, 60]
+.L2995:
+	ldrh	w0, [x20, 2350]
 	cmp	w19, w0
-	bcc	.L3092
-	mov	w0, w21
-	add	x1, x29, 72
+	bcs	.L2997
+	adrp	x0, .LANCHOR4
+	add	x0, x0, :lo12:.LANCHOR4
+	ldr	w1, [x0, 1912]
+	cmp	w1, 32
+	bls	.L3008
+	str	wzr, [x0, 1912]
+	bl	l2p_flush
+	bl	FtlVpcTblFlush
+	b	.L3008
+.L2997:
 	mov	w2, 0
+	add	x1, x29, 56
+	mov	w0, w22
 	bl	log2phys
-	ldr	w0, [x29,72]
+	ldr	w0, [x29, 56]
 	cmn	w0, #1
-	beq	.L3081
-	add	x1, x23, :lo12:.LANCHOR5
+	beq	.L2996
+	ldr	w0, [x21, 1912]
 	mov	w2, 1
-	ldr	w0, [x1,1400]
+	add	x1, x29, 60
 	add	w0, w0, 1
-	str	w0, [x1,1400]
-	ldr	w0, [x20,2412]
-	add	x1, x29, 76
+	str	w0, [x21, 1912]
+	ldr	w0, [x20, 2412]
 	add	w0, w0, 1
-	str	w0, [x20,2412]
-	mov	w0, w21
+	str	w0, [x20, 2412]
+	mov	w0, w22
 	bl	log2phys
-	ldr	w0, [x29,72]
-	lsr	x0, x0, 10
+	ldr	w0, [x29, 56]
+	lsr	w0, w0, 10
 	bl	P2V_block_in_plane
 	bl	decrement_vpc_count
-.L3081:
-	add	x0, x22, :lo12:.LANCHOR2
-	add	w21, w21, 1
-	ldrh	w0, [x0,2350]
+.L2996:
+	ldrh	w0, [x20, 2350]
+	add	w22, w22, 1
 	sub	w19, w19, w0
-	b	.L3080
-.L3092:
-	adrp	x0, .LANCHOR5
-	add	x0, x0, :lo12:.LANCHOR5
-	ldr	w1, [x0,1400]
-	cmp	w1, 32
-	bls	.L3091
-	str	wzr, [x0,1400]
-	bl	l2p_flush
-	bl	FtlVpcTblFlush
-.L3091:
-	mov	w0, 0
-	b	.L3076
-.L3083:
+	b	.L2995
+.L3000:
 	mov	w0, -1
-.L3076:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldr	x23, [sp,48]
-	ldp	x29, x30, [sp], 80
-	ret
+	b	.L2990
 	.size	ftl_discard, .-ftl_discard
 	.align	2
 	.global	FtlGcFreeTempBlock
@@ -19613,220 +19162,214 @@ ftl_discard:
 FtlGcFreeTempBlock:
 	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	str	x27, [sp,80]
 	add	x2, x19, :lo12:.LANCHOR2
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	ldr	w3, [x2,2928]
-	ldrh	w1, [x2,2344]
-	cbnz	w3, .L3129
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	str	x27, [sp, 80]
+	ldrh	w1, [x2, 2344]
+	ldr	w2, [x2, 2928]
+	cbz	w2, .L3010
+.L3047:
+	mov	w0, 0
+.L3009:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldr	x27, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L3010:
 	adrp	x20, .LANCHOR4
-	mov	w4, 65535
 	add	x2, x20, :lo12:.LANCHOR4
-	ldrh	w21, [x2,880]
-	cmp	w21, w4
-	bne	.L3096
-.L3105:
-	add	x22, x20, :lo12:.LANCHOR4
-	adrp	x21, .LANCHOR5
-	add	x23, x21, :lo12:.LANCHOR5
+	mov	w3, 65535
+	ldrh	w21, [x2, 880]
+	cmp	w21, w3
+	bne	.L3012
+.L3021:
+	add	x21, x20, :lo12:.LANCHOR4
 	mov	w0, 65535
-	add	x24, x22, 880
-	ldrh	w1, [x22,880]
-	str	wzr, [x23,1192]
+	add	x22, x21, 880
+	ldrh	w1, [x21, 880]
+	str	wzr, [x21, 1704]
 	cmp	w1, w0
-	beq	.L3129
+	beq	.L3047
 	bl	FtlCacheWriteBack
-	mov	w25, 12
+	mov	w23, 0
 	add	x0, x19, :lo12:.LANCHOR2
-	ldrb	w1, [x24,7]
-	ldrh	w3, [x22,880]
-	mov	w24, 0
-	ldrh	w4, [x0,2344]
-	ldr	x2, [x0,2712]
+	ldrb	w1, [x22, 7]
+	ldrh	w3, [x21, 880]
+	mov	x22, x0
+	mov	w26, 12
+	ldrh	w4, [x0, 2344]
+	ldr	x2, [x0, 2712]
 	mul	w1, w1, w4
-	strh	w1, [x2,x3,lsl 1]
-	ldrh	w2, [x23,1202]
-	mov	x23, x22
-	ldr	w1, [x0,2404]
-	add	w1, w2, w1
-	str	w1, [x0,2404]
-	b	.L3106
-.L3096:
-	cbz	w0, .L3099
+	strh	w1, [x2, x3, lsl 1]
+	ldr	w2, [x0, 2404]
+	ldrh	w1, [x21, 1714]
+	add	w1, w1, w2
+	str	w1, [x0, 2404]
+.L3022:
+	ldrh	w0, [x21, 1714]
+	cmp	w0, w23
+	bhi	.L3026
+	mov	w0, -1
+	bl	decrement_vpc_count
+	add	x0, x19, :lo12:.LANCHOR2
+	ldrb	w0, [x0, 1220]
+	cbz	w0, .L3027
+	ldrh	w1, [x21, 880]
+	adrp	x0, .LC160
+	add	x0, x0, :lo12:.LC160
+	bl	printk
+.L3027:
+	add	x0, x20, :lo12:.LANCHOR4
+	add	x1, x19, :lo12:.LANCHOR2
+	ldrh	w0, [x0, 880]
+	ldr	x1, [x1, 2712]
+	ubfiz	x2, x0, 1, 16
+	ldrh	w1, [x1, x2]
+	cbz	w1, .L3028
+	bl	INSERT_DATA_LIST
+.L3029:
+	add	x21, x20, :lo12:.LANCHOR4
+	mov	w22, -1
+	strh	wzr, [x21, 1714]
+	strh	w22, [x21, 880]
+	strh	wzr, [x21, 1712]
+	bl	l2p_flush
+	bl	FtlVpcTblFlush
+	strh	w22, [x21, 1104]
+	add	x1, x19, :lo12:.LANCHOR2
+	ldr	w0, [x1, 2096]
+	cbz	w0, .L3030
+	ldr	w0, [x1, 2444]
+	cmp	w0, 39
+	bhi	.L3030
+	ldrh	w0, [x21, 1096]
+	ldrh	w2, [x21, 776]
+	cmp	w2, w0
+	bcs	.L3047
+	ubfiz	w0, w0, 1, 15
+	strh	w0, [x1, 2480]
+	b	.L3047
+.L3012:
+	cbz	w0, .L3015
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	ldrh	w5, [x0,3452]
-	cmp	w5, w4
-	beq	.L3100
-.L3101:
+	ldrh	w4, [x0, 3452]
+	cmp	w4, w3
+	beq	.L3016
+.L3017:
 	mov	w1, 2
-	b	.L3099
-.L3100:
-	strh	w3, [x0,3452]
-	ldrh	w0, [x2,776]
-	cmp	w0, 17
-	bhi	.L3101
-.L3099:
+.L3015:
 	add	x0, x20, :lo12:.LANCHOR4
 	add	x0, x0, 880
 	bl	FtlGcScanTempBlk
-	str	w0, [x29,108]
+	str	w0, [x29, 108]
 	cmn	w0, #1
-	beq	.L3102
+	beq	.L3018
 	add	x19, x19, :lo12:.LANCHOR2
 	ubfiz	x21, x21, 1, 16
-	ldr	x1, [x19,2696]
-	ldrh	w0, [x1,x21]
+	ldr	x1, [x19, 2696]
+	ldrh	w0, [x1, x21]
 	cmp	w0, 4
-	bls	.L3103
+	bls	.L3019
 	sub	w0, w0, #5
-	strh	w0, [x1,x21]
+	strh	w0, [x1, x21]
 	mov	w0, 1
 	bl	FtlEctTblFlush
-.L3103:
-	adrp	x0, .LANCHOR5
-	add	x1, x0, :lo12:.LANCHOR5
-	mov	x19, x0
-	ldr	w2, [x1,1192]
-	cbnz	w2, .L3104
-	ldr	w0, [x1,736]
-	add	w0, w0, 1
-	str	w0, [x1,736]
-	ldr	w0, [x29,108]
+.L3019:
+	add	x0, x20, :lo12:.LANCHOR4
+	ldr	w1, [x0, 1704]
+	cbnz	w1, .L3020
+	ldr	w1, [x0, 1248]
+	add	w1, w1, 1
+	str	w1, [x0, 1248]
+	ldr	w0, [x29, 108]
 	lsr	w0, w0, 10
 	bl	FtlBbmMapBadBlock
 	bl	FtlBbmTblFlush
-.L3104:
-	add	x0, x19, :lo12:.LANCHOR5
-	str	wzr, [x0,1192]
+.L3020:
+	add	x20, x20, :lo12:.LANCHOR4
+	str	wzr, [x20, 1704]
+.L3032:
 	mov	w0, 1
-	b	.L3095
-.L3102:
+	b	.L3009
+.L3016:
+	strh	wzr, [x0, 3452]
+	ldrh	w0, [x2, 776]
+	cmp	w0, 17
+	bhi	.L3017
+	b	.L3015
+.L3018:
 	adrp	x0, .LANCHOR1+3452
-	mov	w1, 65535
-	ldrh	w2, [x0,#:lo12:.LANCHOR1+3452]
-	mov	w0, 1
-	cmp	w2, w1
-	bne	.L3095
-	b	.L3105
-.L3109:
-	ldr	w1, [x22,4]
-	cmp	w0, w1
-	bne	.L3127
-.L3108:
-	add	w24, w24, 1
-	uxth	w24, w24
-.L3106:
-	add	x0, x21, :lo12:.LANCHOR5
-	ldrh	w0, [x0,1202]
-	cmp	w0, w24
-	bls	.L3130
-	add	x1, x19, :lo12:.LANCHOR2
-	umull	x26, w24, w25
-	ldr	x27, [x1,2512]
-	ldr	w1, [x1,2924]
-	add	x22, x27, x26
-	ldr	w0, [x22,8]
+	ldrh	w1, [x0, #:lo12:.LANCHOR1+3452]
+	mov	w0, 65535
+	cmp	w1, w0
+	bne	.L3032
+	b	.L3021
+.L3026:
+	umull	x25, w23, w26
+	ldr	x27, [x22, 2512]
+	ldr	w1, [x22, 2924]
+	add	x24, x27, x25
+	ldr	w0, [x24, 8]
 	cmp	w0, w1
-	bcs	.L3127
+	bcc	.L3023
+.L3044:
+	ldrh	w0, [x21, 880]
+	b	.L3045
+.L3023:
 	add	x1, x29, 108
 	mov	w2, 0
 	bl	log2phys
-	ldr	w0, [x29,108]
-	ldr	w1, [x27,x26]
+	ldr	w0, [x27, x25]
+	ldr	w1, [x29, 108]
 	cmp	w0, w1
-	bne	.L3109
-	lsr	x0, x0, 10
+	bne	.L3025
+	lsr	w0, w0, 10
 	bl	P2V_block_in_plane
-	mov	w26, w0
-	ldr	w0, [x22,8]
-	add	x1, x22, 4
+	mov	w25, w0
+	ldr	w0, [x24, 8]
 	mov	w2, 1
+	add	x1, x24, 4
 	bl	log2phys
-	mov	w0, w26
-	b	.L3128
-.L3127:
-	ldrh	w0, [x23,880]
-.L3128:
-	bl	decrement_vpc_count
-	b	.L3108
-.L3130:
-	mov	w0, -1
+	mov	w0, w25
+.L3045:
 	bl	decrement_vpc_count
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrb	w0, [x0,1220]
-	cbz	w0, .L3111
-	add	x1, x20, :lo12:.LANCHOR4
-	adrp	x0, .LC160
-	add	x0, x0, :lo12:.LC160
-	ldrh	w1, [x1,880]
-	bl	printk
-.L3111:
-	add	x0, x20, :lo12:.LANCHOR4
-	add	x1, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x0,880]
-	ldr	x1, [x1,2712]
-	ubfiz	x2, x0, 1, 16
-	ldrh	w1, [x1,x2]
-	cbz	w1, .L3112
-	bl	INSERT_DATA_LIST
-	b	.L3113
-.L3112:
+	b	.L3024
+.L3025:
+	ldr	w0, [x24, 4]
+	cmp	w1, w0
+	bne	.L3044
+.L3024:
+	add	w23, w23, 1
+	and	w23, w23, 65535
+	b	.L3022
+.L3028:
 	bl	INSERT_FREE_LIST
-.L3113:
-	add	x22, x21, :lo12:.LANCHOR5
-	add	x23, x20, :lo12:.LANCHOR4
-	mov	w24, -1
-	strh	wzr, [x22,1202]
-	strh	w24, [x23,880]
-	strh	wzr, [x22,1200]
-	bl	l2p_flush
-	bl	FtlVpcTblFlush
-	strh	w24, [x22,592]
-	add	x1, x19, :lo12:.LANCHOR2
-	ldr	w0, [x1,2096]
-	cbz	w0, .L3114
-	ldr	w0, [x1,2444]
-	cmp	w0, 39
-	bhi	.L3114
-	ldrh	w0, [x22,588]
-	ldrh	w2, [x23,776]
-	cmp	w2, w0
-	bcs	.L3129
-	lsl	w0, w0, 1
-	strh	w0, [x1,2480]
-.L3129:
-	mov	w0, 0
-	b	.L3095
-.L3114:
-	add	x21, x21, :lo12:.LANCHOR5
+	b	.L3029
+.L3030:
 	add	x20, x20, :lo12:.LANCHOR4
-	ldrh	w1, [x21,588]
-	ldrh	w0, [x20,776]
-	add	w2, w1, w1, lsl 1
-	cmp	w0, w2, lsr 2
-	ble	.L3129
+	ldrh	w0, [x20, 1096]
+	ldrh	w1, [x20, 776]
+	add	w2, w0, w0, lsl 1
+	cmp	w1, w2, lsr 2
+	ble	.L3047
 	add	x19, x19, :lo12:.LANCHOR2
-	ldrb	w0, [x19,1220]
-	cbz	w0, .L3115
-	sub	w1, w1, #2
-	strh	w1, [x19,2480]
-	b	.L3129
-.L3115:
-	mov	w1, 20
-	strh	w1, [x19,2480]
-.L3095:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldr	x27, [sp,80]
-	ldp	x29, x30, [sp], 112
-	ret
+	ldrb	w1, [x19, 1220]
+	cbz	w1, .L3031
+	sub	w0, w0, #2
+.L3046:
+	strh	w0, [x19, 2480]
+	b	.L3047
+.L3031:
+	mov	w0, 20
+	b	.L3046
 	.size	FtlGcFreeTempBlock, .-FtlGcFreeTempBlock
 	.align	2
 	.global	FtlGcPageRecovery
@@ -19834,29 +19377,28 @@ FtlGcFreeTempBlock:
 FtlGcPageRecovery:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR2
-	adrp	x19, .LANCHOR4
 	add	x20, x20, :lo12:.LANCHOR2
+	adrp	x19, .LANCHOR4
 	add	x19, x19, :lo12:.LANCHOR4
-	str	x21, [sp,32]
+	str	x21, [sp, 32]
 	add	x21, x19, 880
+	ldrh	w1, [x20, 2344]
 	mov	x0, x21
-	ldrh	w1, [x20,2344]
 	bl	FtlGcScanTempBlk
-	ldrh	w1, [x19,882]
-	ldrh	w0, [x20,2344]
+	ldrh	w1, [x19, 882]
+	ldrh	w0, [x20, 2344]
 	cmp	w1, w0
-	bcc	.L3131
+	bcc	.L3048
 	add	x0, x19, 928
 	bl	FtlMapBlkWriteDumpData
 	mov	w0, 0
 	bl	FtlGcFreeTempBlock
-	adrp	x0, .LANCHOR5+1192
-	str	wzr, [x0,#:lo12:.LANCHOR5+1192]
-.L3131:
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
+	str	wzr, [x19, 1704]
+.L3048:
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	FtlGcPageRecovery, .-FtlGcPageRecovery
@@ -19865,15 +19407,14 @@ FtlGcPageRecovery:
 	.type	FtlPowerLostRecovery, %function
 FtlPowerLostRecovery:
 	stp	x29, x30, [sp, -32]!
-	adrp	x0, .LANCHOR5+1248
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR4
-	str	wzr, [x0,#:lo12:.LANCHOR5+1248]
 	add	x19, x19, :lo12:.LANCHOR4
 	add	x20, x19, 784
 	add	x19, x19, 832
 	mov	x0, x20
+	str	wzr, [x19, 928]
 	bl	FtlRecoverySuperblock
 	mov	x0, x20
 	bl	FtlSlcSuperblockCheck
@@ -19885,7 +19426,7 @@ FtlPowerLostRecovery:
 	mov	w0, -1
 	bl	decrement_vpc_count
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	FtlPowerLostRecovery, .-FtlPowerLostRecovery
@@ -19894,33 +19435,37 @@ FtlPowerLostRecovery:
 	.type	FtlSysBlkInit, %function
 FtlSysBlkInit:
 	stp	x29, x30, [sp, -64]!
-	mov	w1, -1
+	mov	w0, -1
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	adrp	x20, .LANCHOR2
-	adrp	x21, .LANCHOR5
-	str	x23, [sp,48]
-	add	x0, x21, :lo12:.LANCHOR5
-	add	x23, x20, :lo12:.LANCHOR2
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR4
-	strh	w1, [x0,1242]
-	strh	wzr, [x0,1244]
-	ldrh	w0, [x23,2280]
+	stp	x21, x22, [sp, 32]
+	adrp	x20, .LANCHOR2
+	add	x21, x19, :lo12:.LANCHOR4
+	add	x22, x20, :lo12:.LANCHOR2
+	str	x23, [sp, 48]
+	strh	w0, [x21, 1754]
+	ldrh	w0, [x22, 2280]
+	strh	wzr, [x21, 1756]
 	bl	FtlFreeSysBlkQueueInit
 	bl	FtlScanSysBlk
-	add	x0, x19, :lo12:.LANCHOR4
-	ldrh	w1, [x0,1072]
+	ldrh	w1, [x21, 1072]
 	mov	w0, 65535
 	cmp	w1, w0
-	bne	.L3135
-.L3137:
-	mov	w22, -1
-	b	.L3136
-.L3135:
+	bne	.L3054
+.L3056:
+	mov	w21, -1
+.L3053:
+	mov	w0, w21
+	ldr	x23, [sp, 48]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 64
+	ret
+.L3054:
 	bl	FtlLoadSysInfo
-	mov	w22, w0
-	cbnz	w0, .L3137
+	mov	w21, w0
+	cbnz	w0, .L3056
 	bl	FtlLoadMapInfo
 	bl	FtlLoadVonderInfo
 	bl	Ftl_load_ext_data
@@ -19930,95 +19475,91 @@ FtlSysBlkInit:
 	bl	FtlPowerLostRecovery
 	mov	w0, 1
 	bl	FtlUpdateVaildLpn
-	ldrh	w2, [x23,2382]
-	mov	x1, 0
-	ldr	x0, [x23,2792]
-.L3138:
-	cmp	w1, w2
-	mov	w3, w1
-	bge	.L3142
-	add	x4, x0, x1, lsl 4
-	add	x1, x1, 1
-	ldr	w4, [x4,4]
-	tbz	w4, #31, .L3138
-.L3142:
-	add	x0, x19, :lo12:.LANCHOR4
-	cmp	w3, w2
-	ldrh	w1, [x0,724]
+	ldr	x1, [x22, 2792]
+	mov	w0, 0
+	ldrh	w3, [x22, 2382]
+	add	x1, x1, 4
+.L3057:
+	cmp	w0, w3
+	bge	.L3062
+	ldr	w2, [x1], 16
+	tbz	w2, #31, .L3058
+.L3062:
+	add	x2, x19, :lo12:.LANCHOR4
+	cmp	w0, w3
+	ldrh	w1, [x2, 724]
 	add	w1, w1, 1
-	strh	w1, [x0,724]
-	blt	.L3139
-	add	x21, x21, :lo12:.LANCHOR5
-	ldrh	w0, [x21,1244]
-	cbz	w0, .L3143
-.L3139:
-	add	x1, x19, :lo12:.LANCHOR4
-	add	x2, x20, :lo12:.LANCHOR2
-	ldrh	w3, [x1,784]
-	ldr	x5, [x2,2712]
+	strh	w1, [x2, 724]
+	bge	.L3069
+.L3059:
+	add	x0, x19, :lo12:.LANCHOR4
+	add	x1, x20, :lo12:.LANCHOR2
+	ldrh	w3, [x0, 784]
+	ldr	x5, [x1, 2712]
+	ldrh	w6, [x0, 788]
 	lsl	x3, x3, 1
-	ldrh	w6, [x1,788]
-	ldrh	w4, [x5,x3]
+	ldrh	w4, [x5, x3]
 	sub	w4, w4, w6
-	strh	w4, [x5,x3]
-	strb	wzr, [x1,790]
-	ldrh	w3, [x2,2344]
-	strh	w3, [x1,786]
-	ldrh	w3, [x1,832]
-	ldr	x5, [x2,2712]
+	strh	w4, [x5, x3]
+	strb	wzr, [x0, 790]
+	ldrh	w3, [x1, 2344]
+	strh	w3, [x0, 786]
+	ldrh	w3, [x0, 832]
+	ldr	x5, [x1, 2712]
+	strh	wzr, [x0, 788]
 	lsl	x3, x3, 1
-	strh	wzr, [x1,788]
-	ldrh	w6, [x1,836]
-	ldrh	w4, [x5,x3]
+	ldrh	w6, [x0, 836]
+	ldrh	w4, [x5, x3]
 	sub	w4, w4, w6
-	strh	w4, [x5,x3]
-	strb	wzr, [x1,838]
-	ldrh	w0, [x1,726]
-	ldrh	w2, [x2,2344]
-	add	w0, w0, 1
-	strh	w2, [x1,834]
-	strh	wzr, [x1,836]
-	strh	w0, [x1,726]
+	strh	w4, [x5, x3]
+	strb	wzr, [x0, 838]
+	ldrh	w1, [x1, 2344]
+	strh	w1, [x0, 834]
+	ldrh	w1, [x0, 726]
+	strh	wzr, [x0, 836]
+	add	w1, w1, 1
+	strh	w1, [x0, 726]
 	bl	l2p_flush
 	bl	FtlVpcTblFlush
 	bl	FtlVpcTblFlush
-.L3143:
+	b	.L3063
+.L3058:
+	add	w0, w0, 1
+	b	.L3057
+.L3069:
+	ldrh	w0, [x2, 1756]
+	cbnz	w0, .L3059
+.L3063:
 	add	x20, x19, :lo12:.LANCHOR4
 	mov	w1, 65535
 	add	x23, x20, 784
-	ldrh	w0, [x20,784]
+	ldrh	w0, [x20, 784]
 	cmp	w0, w1
-	beq	.L3144
-	ldrh	w1, [x20,788]
-	cbnz	w1, .L3144
-	ldrh	w1, [x20,836]
-	add	x21, x20, 832
-	cbnz	w1, .L3144
+	beq	.L3064
+	ldrh	w1, [x20, 788]
+	cbnz	w1, .L3064
+	ldrh	w1, [x20, 836]
+	add	x22, x20, 832
+	cbnz	w1, .L3064
 	bl	FtlGcRefreshOpenBlock
-	ldrh	w0, [x20,832]
+	ldrh	w0, [x20, 832]
 	bl	FtlGcRefreshOpenBlock
 	bl	FtlVpcTblFlush
 	mov	x0, x23
 	bl	allocate_new_data_superblock
-	mov	x0, x21
+	mov	x0, x22
 	bl	allocate_new_data_superblock
-.L3144:
+.L3064:
 	adrp	x0, .LANCHOR0+88
-	ldrb	w0, [x0,#:lo12:.LANCHOR0+88]
-	cbnz	w0, .L3145
+	ldrb	w0, [x0, #:lo12:.LANCHOR0+88]
+	cbnz	w0, .L3065
 	add	x19, x19, :lo12:.LANCHOR4
-	ldrh	w0, [x19,724]
-	and	w0, w0, 31
-	cbnz	w0, .L3136
-.L3145:
+	ldrh	w0, [x19, 724]
+	tst	x0, 31
+	bne	.L3053
+.L3065:
 	bl	FtlVpcCheckAndModify
-.L3136:
-	mov	w0, w22
-	ldr	x23, [sp,48]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 64
-	ret
+	b	.L3053
 	.size	FtlSysBlkInit, .-FtlSysBlkInit
 	.align	2
 	.global	FtlLowFormat
@@ -20026,298 +19567,298 @@ FtlSysBlkInit:
 FtlLowFormat:
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
 	add	x20, x19, :lo12:.LANCHOR2
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	ldr	w21, [x20,2928]
-	cbnz	w21, .L3153
-	ldrh	w2, [x20,2380]
-	mov	w1, w21
-	ldr	x0, [x20,2776]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	ldr	w0, [x20, 2928]
+	cbnz	w0, .L3073
+	ldr	x0, [x20, 2776]
+	mov	w1, 0
+	ldrh	w2, [x20, 2380]
 	lsl	w2, w2, 2
 	bl	ftl_memset
-	ldrh	w2, [x20,2380]
-	mov	w1, w21
-	ldr	x0, [x20,2768]
+	ldr	x0, [x20, 2768]
+	mov	w1, 0
+	ldrh	w2, [x20, 2380]
 	lsl	w2, w2, 2
 	bl	ftl_memset
-	str	w21, [x20,2396]
-	ldrh	w0, [x20,2280]
-	str	w21, [x20,2400]
+	ldrh	w0, [x20, 2280]
+	str	wzr, [x20, 2396]
+	str	wzr, [x20, 2400]
 	bl	FtlFreeSysBlkQueueInit
 	bl	FtlLoadBbt
-	cbz	w0, .L3154
+	cbz	w0, .L3074
 	bl	FtlMakeBbt
-.L3154:
-	mov	w0, 0
-.L3155:
+.L3074:
+	mov	w4, 23752
 	add	x1, x19, :lo12:.LANCHOR2
-	ldrh	w2, [x1,2350]
+	mov	w0, 0
+	movk	w4, 0xa0f, lsl 16
+.L3075:
+	ldrh	w2, [x1, 2350]
 	cmp	w0, w2, lsl 7
-	bge	.L3182
-	ubfiz	x3, x0, 2, 16
-	ldr	x4, [x1,2616]
-	mvn	w2, w0
-	orr	w2, w0, w2, lsl 16
-	str	w2, [x4,x3]
-	add	w0, w0, 1
-	ldr	x2, [x1,2624]
-	mov	w1, 23752
-	movk	w1, 0xa0f, lsl 16
-	uxth	w0, w0
-	str	w1, [x2,x3]
-	b	.L3155
-.L3182:
-	ldrh	w21, [x1,2284]
-	mov	w20, 0
-.L3157:
+	blt	.L3076
+	ldrh	w21, [x1, 2284]
 	add	x22, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x22,2286]
+	mov	w20, 0
+.L3077:
+	ldrh	w0, [x22, 2286]
 	cmp	w0, w21
-	bls	.L3183
-	mov	w0, w21
-	mov	w1, 1
-	add	w21, w21, 1
-	bl	FtlLowFormatEraseBlock
-	add	w0, w20, w0
-	uxth	w21, w21
-	uxth	w20, w0
-	b	.L3157
-.L3183:
-	ldrh	w0, [x22,2276]
+	bhi	.L3078
+	ldrh	w0, [x22, 2276]
 	sub	w1, w20, #3
 	cmp	w1, w0, lsl 1
-	blt	.L3159
+	blt	.L3079
 	udiv	w0, w20, w0
-	ldr	w20, [x22,2376]
+	ldr	w20, [x22, 2376]
 	add	w0, w0, w20
-	mov	w20, 0
 	bl	FtlSysBlkNumInit
-	ldrh	w0, [x22,2280]
+	ldrh	w0, [x22, 2280]
+	mov	w20, 0
 	bl	FtlFreeSysBlkQueueInit
-	ldrh	w21, [x22,2284]
-.L3160:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x0,2286]
+	ldrh	w21, [x22, 2284]
+	add	x22, x19, :lo12:.LANCHOR2
+.L3080:
+	ldrh	w0, [x22, 2286]
 	cmp	w0, w21
-	bls	.L3159
-	mov	w0, w21
-	mov	w1, 1
-	add	w21, w21, 1
-	bl	FtlLowFormatEraseBlock
-	add	w0, w20, w0
-	uxth	w21, w21
-	uxth	w20, w0
-	b	.L3160
-.L3159:
+	bhi	.L3081
+.L3079:
+	add	x23, x19, :lo12:.LANCHOR2
+	mov	w22, 0
 	mov	w21, 0
-	mov	w22, w21
-.L3162:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w1, [x0,2284]
-	cmp	w1, w22
-	bls	.L3184
-	mov	w0, w22
-	mov	w1, 0
-	add	w22, w22, 1
-	bl	FtlLowFormatEraseBlock
-	add	w0, w21, w0
-	uxth	w22, w22
-	uxth	w21, w0
-	b	.L3162
-.L3184:
-	ldrh	w1, [x0,2286]
-	adrp	x22, .LANCHOR5
-	ldrh	w2, [x0,2276]
-	add	x6, x22, :lo12:.LANCHOR5
-	str	w1, [x0,2468]
-	ldr	w1, [x0,2288]
-	udiv	w3, w1, w2
-	str	w3, [x0,2924]
-	ubfx	x5, x3, 5, 16
-	add	w4, w5, 36
-	strh	w4, [x6,588]
-	mov	w4, 24
-	mul	w4, w2, w4
-	cmp	w21, w4
-	ble	.L3164
-	sub	w1, w1, w21
-	udiv	w1, w1, w2
-	str	w1, [x0,2924]
-	lsr	w1, w1, 5
-	add	w1, w1, 24
-	strh	w1, [x6,588]
-.L3164:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	w0, [x0,2096]
-	cmp	w0, 1
-	bne	.L3165
-	add	x1, x22, :lo12:.LANCHOR5
-	udiv	w0, w21, w2
-	ldrh	w4, [x1,588]
-	add	w0, w4, w0
-	add	w0, w4, w0, asr 2
-	strh	w0, [x1,588]
-.L3165:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrb	w0, [x0,1220]
-	cbz	w0, .L3166
-	add	x1, x22, :lo12:.LANCHOR5
-	udiv	w0, w21, w2
-	ldrh	w4, [x1,588]
-	add	w0, w4, w0
-	add	w0, w4, w0, asr 2
-	strh	w0, [x1,588]
-.L3166:
+.L3082:
+	ldrh	w0, [x23, 2284]
+	cmp	w0, w21
+	bhi	.L3083
+	ldrh	w0, [x23, 2286]
+	adrp	x21, .LANCHOR4
+	ldr	w2, [x23, 2288]
+	add	x5, x21, :lo12:.LANCHOR4
+	str	w0, [x23, 2468]
+	ldrh	w0, [x23, 2276]
+	udiv	w4, w2, w0
+	ubfx	x3, x4, 5, 16
+	str	w4, [x23, 2924]
+	add	w1, w3, 36
+	strh	w1, [x5, 1096]
+	mov	w1, 24
+	mul	w1, w0, w1
+	cmp	w22, w1
+	ble	.L3084
+	sub	w2, w2, w22
+	udiv	w2, w2, w0
+	str	w2, [x23, 2924]
+	lsr	w2, w2, 5
+	add	w2, w2, 24
+	strh	w2, [x5, 1096]
+.L3084:
+	add	x1, x19, :lo12:.LANCHOR2
+	ldr	w1, [x1, 2096]
+	cmp	w1, 1
+	bne	.L3085
+	udiv	w2, w22, w0
+	add	x1, x21, :lo12:.LANCHOR4
+	ldrh	w5, [x1, 1096]
+	add	w2, w2, w5
+	add	w2, w5, w2, asr 2
+	strh	w2, [x1, 1096]
+.L3085:
+	add	x1, x19, :lo12:.LANCHOR2
+	ldrb	w1, [x1, 1220]
+	cbz	w1, .L3086
+	udiv	w2, w22, w0
+	add	x1, x21, :lo12:.LANCHOR4
+	ldrh	w5, [x1, 1096]
+	add	w2, w2, w5
+	add	w2, w5, w2, asr 2
+	strh	w2, [x1, 1096]
+.L3086:
 	add	x6, x19, :lo12:.LANCHOR2
-	ldrh	w1, [x6,2338]
-	cbz	w1, .L3168
-	add	x0, x22, :lo12:.LANCHOR5
-	ldrh	w4, [x0,588]
-	add	w4, w4, w1, lsr 1
-	strh	w4, [x0,588]
-	mul	w4, w1, w2
-	cmp	w4, w21
-	ble	.L3168
+	ldrh	w1, [x6, 2338]
+	cbz	w1, .L3088
+	add	x2, x21, :lo12:.LANCHOR4
+	ldrh	w5, [x2, 1096]
+	add	w5, w5, w1, lsr 1
+	strh	w5, [x2, 1096]
+	mul	w5, w1, w0
+	cmp	w22, w5
+	bge	.L3088
 	add	w1, w1, 32
-	str	w3, [x6,2924]
-	add	w1, w5, w1
-	strh	w1, [x0,588]
-.L3168:
+	str	w4, [x6, 2924]
+	add	w1, w3, w1
+	strh	w1, [x2, 1096]
+.L3088:
 	add	x23, x19, :lo12:.LANCHOR2
-	add	x3, x22, :lo12:.LANCHOR5
-	ldr	w1, [x23,2924]
-	ldrh	w0, [x3,588]
-	sub	w0, w1, w0
-	ldrh	w1, [x23,2344]
-	mul	w0, w0, w2
-	str	w0, [x3,584]
-	mul	w0, w0, w1
-	ldrh	w1, [x23,2350]
-	str	w0, [x23,2924]
-	mul	w0, w0, w1
-	str	w0, [x23,1224]
+	add	x2, x21, :lo12:.LANCHOR4
+	ldr	w1, [x23, 2924]
+	ldrh	w3, [x2, 1096]
+	sub	w1, w1, w3
+	mul	w0, w1, w0
+	ldrh	w1, [x23, 2344]
+	str	w0, [x2, 1092]
+	mul	w0, w1, w0
+	ldrh	w1, [x23, 2350]
+	str	w0, [x23, 2924]
+	mul	w0, w1, w0
+	str	w0, [x23, 1224]
 	bl	FtlBbmTblFlush
-	ldr	w2, [x23,2292]
-	add	w1, w21, w20
-	ldrh	w0, [x23,2358]
+	ldrh	w0, [x23, 2358]
+	add	w1, w20, w22
+	ldr	w2, [x23, 2292]
 	add	w0, w0, w2, lsr 3
 	cmp	w1, w0
-	bls	.L3170
+	bls	.L3090
 	adrp	x0, .LC161
 	lsr	w2, w2, 5
 	add	x0, x0, :lo12:.LC161
 	bl	printk
-.L3170:
-	add	x24, x19, :lo12:.LANCHOR2
-	adrp	x20, .LANCHOR4
-	add	x20, x20, :lo12:.LANCHOR4
+.L3090:
+	add	x23, x19, :lo12:.LANCHOR2
+	add	x22, x21, :lo12:.LANCHOR4
+	add	x20, x22, 784
 	mov	w1, 0
-	add	x21, x20, 784
-	mov	w23, -1
-	ldrh	w2, [x24,2286]
-	ldr	x0, [x24,2712]
+	mov	w24, -1
+	ldr	x0, [x23, 2712]
+	ldrh	w2, [x23, 2286]
 	lsl	w2, w2, 1
 	bl	ftl_memset
-	str	wzr, [x20,1068]
 	mov	w0, 1
-	strb	w0, [x21,8]
-	adrp	x0, .LANCHOR0+16
-	add	x1, x22, :lo12:.LANCHOR5
-	ldrh	w2, [x24,2284]
-	strh	wzr, [x21,2]
-	ldr	x0, [x0,#:lo12:.LANCHOR0+16]
-	lsr	w2, w2, 3
-	strh	w23, [x1,592]
-	strh	wzr, [x1,594]
-	strb	wzr, [x1,598]
-	strb	wzr, [x1,600]
+	strb	w0, [x20, 8]
+	adrp	x0, .LANCHOR0+80
+	ldrh	w2, [x23, 2284]
+	strh	w24, [x22, 1104]
 	mov	w1, 255
-	strb	wzr, [x21,6]
-	strh	wzr, [x20,784]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+80]
+	strh	wzr, [x22, 1106]
+	lsr	w2, w2, 3
+	strb	wzr, [x22, 1110]
+	strb	wzr, [x22, 1112]
+	strh	wzr, [x20, 2]
+	strb	wzr, [x20, 6]
+	strh	wzr, [x22, 784]
+	str	wzr, [x22, 1068]
 	bl	ftl_memset
-.L3171:
-	mov	x0, x21
+.L3091:
+	mov	x0, x20
 	bl	make_superblock
-	ldrb	w0, [x21,7]
-	cbnz	w0, .L3172
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w1, [x21]
-	ldr	x0, [x0,2712]
-	strh	w23, [x0,x1,lsl 1]
-	ldrh	w0, [x21]
+	ldrb	w1, [x20, 7]
+	ldrh	w0, [x20]
+	cbnz	w1, .L3092
+	ldr	x1, [x23, 2712]
+	ubfiz	x0, x0, 1, 16
+	strh	w24, [x1, x0]
+	ldrh	w0, [x20]
 	add	w0, w0, 1
-	strh	w0, [x21]
-	b	.L3171
-.L3172:
-	add	x1, x19, :lo12:.LANCHOR2
-	ldrh	w2, [x21]
-	ldrh	w3, [x21,4]
-	mov	w23, -1
-	ldr	w0, [x1,2396]
-	str	w0, [x21,12]
+	strh	w0, [x20]
+	b	.L3091
+.L3076:
+	ldr	x5, [x1, 2616]
+	ubfiz	x3, x0, 2, 16
+	mvn	w2, w0
+	orr	w2, w0, w2, lsl 16
 	add	w0, w0, 1
-	str	w0, [x1,2396]
-	ldr	x0, [x1,2712]
-	strh	w3, [x0,x2,lsl 1]
-	add	x0, x20, 832
-	strh	wzr, [x20,834]
-	ldrh	w1, [x21]
-	mov	x21, x0
-	strb	wzr, [x20,838]
-	add	w1, w1, 1
-	strh	w1, [x20,832]
+	and	w0, w0, 65535
+	str	w2, [x5, x3]
+	ldr	x2, [x1, 2624]
+	str	w4, [x2, x3]
+	b	.L3075
+.L3078:
+	mov	w0, w21
 	mov	w1, 1
-	strb	w1, [x20,840]
-.L3173:
-	mov	x0, x21
+	add	w21, w21, 1
+	bl	FtlLowFormatEraseBlock
+	add	w20, w20, w0
+	and	w21, w21, 65535
+	and	w20, w20, 65535
+	b	.L3077
+.L3081:
+	mov	w0, w21
+	mov	w1, 1
+	add	w21, w21, 1
+	bl	FtlLowFormatEraseBlock
+	add	w20, w20, w0
+	and	w21, w21, 65535
+	and	w20, w20, 65535
+	b	.L3080
+.L3083:
+	mov	w0, w21
+	mov	w1, 0
+	add	w21, w21, 1
+	bl	FtlLowFormatEraseBlock
+	add	w22, w22, w0
+	and	w21, w21, 65535
+	and	w22, w22, 65535
+	b	.L3082
+.L3092:
+	add	x1, x19, :lo12:.LANCHOR2
+	ubfiz	x0, x0, 1, 16
+	ldrh	w3, [x20, 4]
+	mov	x13, x1
+	mov	w14, -1
+	ldr	w2, [x1, 2396]
+	str	w2, [x20, 12]
+	add	w2, w2, 1
+	str	w2, [x1, 2396]
+	ldr	x2, [x1, 2712]
+	strh	w3, [x2, x0]
+	add	x0, x22, 832
+	mov	x12, x0
+	strh	wzr, [x22, 834]
+	ldrh	w2, [x20]
+	add	x20, x21, :lo12:.LANCHOR4
+	strb	wzr, [x22, 838]
+	add	w2, w2, 1
+	strh	w2, [x22, 832]
+	mov	w2, 1
+	strb	w2, [x22, 840]
+.L3093:
+	mov	x0, x12
 	bl	make_superblock
-	ldrb	w0, [x21,7]
-	cbnz	w0, .L3174
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w1, [x21]
-	ldr	x0, [x0,2712]
-	strh	w23, [x0,x1,lsl 1]
-	ldrh	w0, [x21]
+	ldrb	w1, [x12, 7]
+	ldrh	w0, [x12]
+	cbnz	w1, .L3094
+	ldr	x1, [x13, 2712]
+	ubfiz	x0, x0, 1, 16
+	strh	w14, [x1, x0]
+	ldrh	w0, [x12]
 	add	w0, w0, 1
-	strh	w0, [x21]
-	b	.L3173
-.L3174:
+	strh	w0, [x12]
+	b	.L3093
+.L3094:
 	add	x19, x19, :lo12:.LANCHOR2
-	ldrh	w1, [x21]
-	ldrh	w2, [x21,4]
-	add	x22, x22, :lo12:.LANCHOR5
-	ldr	w0, [x19,2396]
-	str	w0, [x21,12]
+	ubfiz	x0, x0, 1, 16
+	ldrh	w2, [x12, 4]
 	mov	w21, -1
-	add	w0, w0, 1
-	str	w0, [x19,2396]
-	ldr	x0, [x19,2712]
-	strh	w2, [x0,x1,lsl 1]
-	strh	w21, [x20,880]
+	ldr	w1, [x19, 2396]
+	str	w1, [x12, 12]
+	add	w1, w1, 1
+	str	w1, [x19, 2396]
+	ldr	x1, [x19, 2712]
+	strh	w2, [x1, x0]
+	strh	w21, [x20, 880]
 	bl	FtlFreeSysBlkQueueOut
-	strh	w0, [x20,1072]
-	ldr	w0, [x22,584]
-	strh	w0, [x20,1078]
-	ldr	w0, [x19,2396]
-	str	w0, [x20,1080]
+	strh	w0, [x20, 1072]
+	ldr	w0, [x20, 1092]
+	strh	w0, [x20, 1078]
+	ldr	w0, [x19, 2396]
+	str	w0, [x20, 1080]
 	add	w0, w0, 1
-	strh	wzr, [x20,1074]
-	strh	w21, [x20,1076]
-	str	w0, [x19,2396]
+	strh	wzr, [x20, 1074]
+	strh	w21, [x20, 1076]
+	str	w0, [x19, 2396]
 	bl	FtlVpcTblFlush
 	bl	FtlSysBlkInit
-	cbnz	w0, .L3153
+	cbnz	w0, .L3073
 	adrp	x0, .LANCHOR1+3448
 	mov	w1, 1
-	str	w1, [x0,#:lo12:.LANCHOR1+3448]
-.L3153:
+	str	w1, [x0, #:lo12:.LANCHOR1+3448]
+.L3073:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
 	ldp	x29, x30, [sp], 64
 	ret
 	.size	FtlLowFormat, .-FtlLowFormat
@@ -20327,199 +19868,193 @@ FtlLowFormat:
 FtlReInitForSDUpdata:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
 	add	x0, x19, :lo12:.LANCHOR2
-	ldrb	w0, [x0,1220]
-	cbz	w0, .L3186
-.L3188:
-	mov	w0, 0
-	b	.L3187
-.L3186:
+	ldrb	w0, [x0, 1220]
+	cbz	w0, .L3104
+.L3106:
+	mov	w20, 0
+.L3103:
+	mov	w0, w20
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 48
+	ret
+.L3104:
 	adrp	x0, RK29_NANDC_REG_BASE
-	ldr	x0, [x0,#:lo12:RK29_NANDC_REG_BASE]
+	ldr	x0, [x0, #:lo12:RK29_NANDC_REG_BASE]
 	bl	FlashInit
-	cbnz	w0, .L3188
+	mov	w20, w0
+	cbnz	w0, .L3106
 	bl	FlashLoadFactorBbt
-	cbz	w0, .L3189
+	cbz	w0, .L3107
 	bl	FlashMakeFactorBbt
-.L3189:
+.L3107:
 	add	x0, x19, :lo12:.LANCHOR2
-	ldr	x0, [x0,2216]
+	ldr	x0, [x0, 2216]
 	bl	FlashReadIdbDataRaw
-	cbz	w0, .L3190
-	mov	w1, 0
+	cbz	w0, .L3108
 	mov	w2, 16
+	mov	w1, 0
 	add	x0, x29, 32
 	bl	FlashReadFacBbtData
+	ldr	w2, [x29, 32]
 	mov	w0, 0
-	ldr	w2, [x29,32]
-	mov	w1, w0
+	mov	w1, 0
 	mov	w4, 1
-.L3192:
+.L3110:
 	lsl	w3, w4, w1
 	add	w1, w1, 1
 	tst	w3, w2
-	cset	w3, ne
+	cinc	w0, w0, ne
 	cmp	w1, 16
-	add	w0, w0, w3
-	bne	.L3192
+	bne	.L3110
 	cmp	w0, 6
-	bhi	.L3193
+	bhi	.L3111
 	adrp	x0, .LANCHOR0+89
-	strb	w1, [x0,#:lo12:.LANCHOR0+89]
-	b	.L3194
-.L3193:
-	mov	w1, 0
-	mov	w4, 1
-.L3196:
-	lsl	w3, w4, w1
-	add	w1, w1, 1
-	tst	w3, w2
-	cset	w3, ne
-	cmp	w1, 24
-	add	w0, w0, w3
-	bne	.L3196
-	cmp	w0, 17
-	adrp	x0, .LANCHOR0
-	add	x0, x0, :lo12:.LANCHOR0
-	bls	.L3215
-	mov	w1, 36
-.L3215:
-	strb	w1, [x0,89]
-.L3194:
-	adrp	x1, .LANCHOR0+89
+	strb	w1, [x0, #:lo12:.LANCHOR0+89]
+.L3112:
 	add	x0, x19, :lo12:.LANCHOR2
-	ldrb	w1, [x1,#:lo12:.LANCHOR0+89]
-	strh	w1, [x0,1218]
-.L3190:
-	adrp	x0, .LC47
+	adrp	x1, .LANCHOR0+89
+	ldrb	w1, [x1, #:lo12:.LANCHOR0+89]
+	strh	w1, [x0, 1218]
+.L3108:
 	adrp	x1, .LC144
 	add	x1, x1, :lo12:.LC144
-	add	x0, x0, :lo12:.LC47
 	add	x19, x19, :lo12:.LANCHOR2
+	adrp	x0, .LC48
+	add	x0, x0, :lo12:.LC48
 	bl	printk
 	add	x0, x19, 1192
 	bl	FtlConstantsInit
 	bl	FtlVariablesInit
-	ldrh	w0, [x19,2280]
+	ldrh	w0, [x19, 2280]
 	mov	w19, 1
 	bl	FtlFreeSysBlkQueueInit
-.L3198:
+.L3116:
 	bl	FtlLoadBbt
-	cbz	w0, .L3199
-.L3217:
+	cbz	w0, .L3117
+.L3136:
 	bl	FtlLowFormat
 	cmp	w19, 3
-	bhi	.L3218
+	bls	.L3118
+	mov	w20, -1
+	b	.L3103
+.L3111:
+	mov	w1, 0
+	mov	w4, 1
+.L3114:
+	lsl	w3, w4, w1
+	add	w1, w1, 1
+	tst	w3, w2
+	cinc	w0, w0, ne
+	cmp	w1, 24
+	bne	.L3114
+	cmp	w0, 17
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	bhi	.L3115
+.L3134:
+	strb	w1, [x0, 89]
+	b	.L3112
+.L3115:
+	mov	w1, 36
+	b	.L3134
+.L3118:
 	add	w19, w19, 1
-	b	.L3198
-.L3218:
-	mov	w0, -1
-	b	.L3187
-.L3199:
+	b	.L3116
+.L3117:
 	bl	FtlSysBlkInit
-	cbnz	w0, .L3217
-	adrp	x1, .LANCHOR1+3448
-	mov	w2, 1
-	str	w2, [x1,#:lo12:.LANCHOR1+3448]
-.L3187:
-	ldr	x19, [sp,16]
-	ldp	x29, x30, [sp], 48
-	ret
+	cbnz	w0, .L3136
+	adrp	x0, .LANCHOR1+3448
+	mov	w1, 1
+	str	w1, [x0, #:lo12:.LANCHOR1+3448]
+	b	.L3103
 	.size	FtlReInitForSDUpdata, .-FtlReInitForSDUpdata
 	.align	2
 	.global	Ftl_gc_temp_data_write_back
 	.type	Ftl_gc_temp_data_write_back, %function
 Ftl_gc_temp_data_write_back:
-	stp	x29, x30, [sp, -64]!
+	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x19, .LANCHOR2
-	str	x23, [sp,48]
-	add	x0, x19, :lo12:.LANCHOR2
-	stp	x21, x22, [sp,32]
-	ldr	w1, [x0,2928]
-	cbz	w1, .L3220
-.L3223:
+	str	x21, [sp, 32]
+	adrp	x21, .LANCHOR2
+	add	x0, x21, :lo12:.LANCHOR2
+	stp	x19, x20, [sp, 16]
+	ldr	w1, [x0, 2928]
+	cbz	w1, .L3138
+.L3141:
 	mov	w0, 0
-	b	.L3221
-.L3220:
-	ldrb	w0, [x0,1220]
-	adrp	x22, .LANCHOR5
-	cbz	w0, .L3222
-	add	x0, x22, :lo12:.LANCHOR5
-	ldr	w0, [x0,1168]
-	tbz	x0, 0, .L3222
-	adrp	x0, .LANCHOR4+884
-	ldrh	w0, [x0,#:lo12:.LANCHOR4+884]
-	cbnz	w0, .L3223
-.L3222:
-	add	x0, x19, :lo12:.LANCHOR2
-	add	x1, x22, :lo12:.LANCHOR5
+.L3137:
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	ret
+.L3138:
+	ldrb	w0, [x0, 1220]
+	adrp	x12, .LANCHOR4
+	cbz	w0, .L3140
+	add	x0, x12, :lo12:.LANCHOR4
+	ldr	w1, [x0, 1680]
+	tbz	x1, 0, .L3140
+	ldrh	w0, [x0, 884]
+	cbnz	w0, .L3141
+.L3140:
+	add	x11, x21, :lo12:.LANCHOR2
+	add	x19, x12, :lo12:.LANCHOR4
+	mov	w3, 0
 	mov	w2, 0
-	mov	w21, 0
-	mov	w3, w2
-	mov	w23, 56
-	ldr	x0, [x0,2528]
-	ldr	w1, [x1,1168]
+	mov	x20, x11
+	ldr	w1, [x19, 1680]
+	ldr	x0, [x11, 2528]
 	bl	FlashProgPages
-.L3224:
-	add	x20, x22, :lo12:.LANCHOR5
-	ldr	w1, [x20,1168]
-	cmp	w21, w1
-	bcs	.L3234
-	add	x2, x19, :lo12:.LANCHOR2
-	umull	x0, w21, w23
-	ldr	x4, [x2,2528]
-	add	x1, x4, x0
-	ldr	w4, [x4,x0]
-	cmn	w4, #1
-	ldr	x3, [x1,16]
-	bne	.L3225
-	adrp	x1, .LANCHOR4
-	ldr	x3, [x2,2712]
-	add	x1, x1, :lo12:.LANCHOR4
-	ldrh	w5, [x1,880]
-	strh	wzr, [x3,x5,lsl 1]
-	strh	w4, [x1,880]
-	ldr	w1, [x20,736]
-	add	w1, w1, 1
-	str	w1, [x20,736]
-	ldr	x1, [x2,2528]
-	add	x0, x1, x0
-	ldr	w0, [x0,4]
+	mov	w13, 0
+	mov	w14, 56
+.L3142:
+	ldr	w1, [x19, 1680]
+	cmp	w13, w1
+	bcc	.L3144
+	add	x21, x21, :lo12:.LANCHOR2
+	ldr	x0, [x21, 2528]
+	bl	FtlGcBufFree
+	str	wzr, [x19, 1680]
+	ldrh	w0, [x19, 884]
+	cbnz	w0, .L3141
+	mov	w0, 1
+	bl	FtlGcFreeTempBlock
+	b	.L3152
+.L3144:
+	umull	x1, w13, w14
+	ldr	x2, [x20, 2528]
+	add	x3, x2, x1
+	ldr	w2, [x2, x1]
+	ldr	x0, [x3, 16]
+	cmn	w2, #1
+	bne	.L3143
+	ldrh	w3, [x19, 880]
+	ldr	x0, [x20, 2712]
+	strh	wzr, [x0, x3, lsl 1]
+	strh	w2, [x19, 880]
+	ldr	w0, [x19, 1248]
+	add	w0, w0, 1
+	str	w0, [x19, 1248]
+	ldr	x0, [x20, 2528]
+	add	x0, x0, x1
+	ldr	w0, [x0, 4]
 	lsr	w0, w0, 10
 	bl	FtlBbmMapBadBlock
 	bl	FtlBbmTblFlush
 	bl	FtlGcPageVarInit
-	b	.L3233
-.L3225:
-	ldr	w0, [x3,12]
-	add	w21, w21, 1
-	ldr	w1, [x1,4]
-	ldr	w2, [x3,8]
-	uxth	w21, w21
-	bl	FtlGcUpdatePage
-	b	.L3224
-.L3234:
-	add	x19, x19, :lo12:.LANCHOR2
-	ldr	x0, [x19,2528]
-	bl	FtlGcBufFree
-	str	wzr, [x20,1168]
-	adrp	x0, .LANCHOR4+884
-	ldrh	w0, [x0,#:lo12:.LANCHOR4+884]
-	cbnz	w0, .L3223
-	mov	w0, 1
-	bl	FtlGcFreeTempBlock
-.L3233:
+.L3152:
 	mov	w0, 1
-.L3221:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldr	x23, [sp,48]
-	ldp	x29, x30, [sp], 64
-	ret
+	b	.L3137
+.L3143:
+	ldp	w2, w0, [x0, 8]
+	ldr	w1, [x3, 4]
+	bl	FtlGcUpdatePage
+	add	w13, w13, 1
+	and	w13, w13, 65535
+	b	.L3142
 	.size	Ftl_gc_temp_data_write_back, .-Ftl_gc_temp_data_write_back
 	.align	2
 	.global	Ftl_get_new_temp_ppa
@@ -20527,37 +20062,35 @@ Ftl_gc_temp_data_write_back:
 Ftl_get_new_temp_ppa:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR4
 	add	x0, x19, :lo12:.LANCHOR4
 	add	x1, x0, 880
-	ldrh	w2, [x0,880]
+	ldrh	w2, [x0, 880]
 	mov	w0, 65535
 	cmp	w2, w0
-	beq	.L3236
-	ldrh	w0, [x1,4]
-	cbnz	w0, .L3237
-.L3236:
+	beq	.L3154
+	ldrh	w0, [x1, 4]
+	cbnz	w0, .L3155
+.L3154:
 	bl	FtlCacheWriteBack
+	add	x20, x19, :lo12:.LANCHOR4
 	mov	w0, 0
 	bl	FtlGcFreeTempBlock
-	add	x0, x19, :lo12:.LANCHOR4
-	add	x0, x0, 880
-	strb	wzr, [x0,8]
+	add	x0, x20, 880
+	strb	wzr, [x0, 8]
 	bl	allocate_data_superblock
-	adrp	x0, .LANCHOR5
-	add	x0, x0, :lo12:.LANCHOR5
-	strh	wzr, [x0,1200]
-	strh	wzr, [x0,1202]
+	strh	wzr, [x20, 1712]
+	strh	wzr, [x20, 1714]
 	bl	l2p_flush
 	mov	w0, 0
 	bl	FtlEctTblFlush
 	bl	FtlVpcTblFlush
-.L3237:
+.L3155:
 	add	x0, x19, :lo12:.LANCHOR4
 	add	x0, x0, 880
 	bl	get_new_active_ppa
-	ldr	x19, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	Ftl_get_new_temp_ppa, .-Ftl_get_new_temp_ppa
@@ -20565,326 +20098,313 @@ Ftl_get_new_temp_ppa:
 	.global	ftl_read
 	.type	ftl_read, %function
 ftl_read:
-	sub	sp, sp, #224
-	mov	w4, w0
-	adrp	x0, .LANCHOR1+3448
-	stp	x29, x30, [sp,16]
+	sub	sp, sp, #208
+	adrp	x4, .LANCHOR1+3448
+	stp	x29, x30, [sp, 16]
 	add	x29, sp, 16
-	stp	x21, x22, [sp,48]
-	ldr	w21, [x0,#:lo12:.LANCHOR1+3448]
-	mov	w0, -1
-	stp	x19, x20, [sp,32]
-	stp	x23, x24, [sp,64]
-	stp	x25, x26, [sp,80]
-	stp	x27, x28, [sp,96]
+	stp	x21, x22, [sp, 48]
+	stp	x19, x20, [sp, 32]
+	ldr	w21, [x4, #:lo12:.LANCHOR1+3448]
+	stp	x23, x24, [sp, 64]
+	stp	x25, x26, [sp, 80]
 	cmp	w21, 1
-	bne	.L3239
-	cmp	w4, 16
-	mov	x24, x3
-	mov	w25, w2
-	mov	w20, w1
-	bne	.L3240
-	add	w0, w1, 256
-	mov	w1, w2
+	stp	x27, x28, [sp, 96]
+	bne	.L3182
+	mov	x23, x3
+	mov	w24, w2
+	mov	w19, w1
+	cmp	w0, 16
+	bne	.L3159
 	mov	x2, x3
+	mov	w1, w24
+	add	w0, w19, 256
 	bl	FtlVendorPartRead
-	b	.L3239
-.L3240:
-	adrp	x19, .LANCHOR2
-	add	x1, x19, :lo12:.LANCHOR2
-	ldr	w2, [x1,1224]
-	cmp	w20, w2
-	bcs	.L3263
-	cmp	w25, w2
-	bhi	.L3263
-	add	w0, w20, w25
-	str	w0, [x29,188]
-	mov	w0, -1
-	ldr	w3, [x29,188]
-	cmp	w3, w2
-	bhi	.L3239
-	adrp	x22, .LANCHOR5
-	ldrh	w0, [x1,2350]
-	add	x2, x22, :lo12:.LANCHOR5
-	sub	w26, w3, #1
-	udiv	w28, w20, w0
-	sub	w21, w21, w28
-	udiv	w26, w26, w0
-	ldr	w0, [x2,1156]
-	add	w0, w25, w0
-	str	w0, [x2,1156]
-	ldr	w0, [x1,2424]
-	add	w21, w21, w26
-	add	w0, w21, w0
-	str	w0, [x1,2424]
-	mov	w0, w28
+	mov	w25, w0
+.L3157:
+	mov	w0, w25
+	ldp	x19, x20, [sp, 32]
+	ldp	x21, x22, [sp, 48]
+	ldp	x23, x24, [sp, 64]
+	ldp	x25, x26, [sp, 80]
+	ldp	x27, x28, [sp, 96]
+	ldp	x29, x30, [sp, 16]
+	add	sp, sp, 208
+	ret
+.L3159:
+	adrp	x20, .LANCHOR2
+	add	x0, x20, :lo12:.LANCHOR2
+	ldr	w1, [x0, 1224]
+	cmp	w19, w1
+	bcs	.L3182
+	cmp	w2, w1
+	bhi	.L3182
+	add	w2, w19, w2
+	str	w2, [x29, 156]
+	cmp	w1, w2
+	bcc	.L3182
+	ldrh	w1, [x0, 2350]
+	sub	w26, w2, #1
+	adrp	x7, .LANCHOR4
+	add	x2, x7, :lo12:.LANCHOR4
+	udiv	w27, w19, w1
+	udiv	w26, w26, w1
+	sub	w21, w21, w27
+	add	w1, w21, w26
+	str	w1, [x29, 172]
+	ldr	w1, [x2, 1668]
+	add	w1, w1, w24
+	str	w1, [x2, 1668]
+	ldr	w2, [x29, 172]
+	ldr	w1, [x0, 2424]
+	add	w1, w1, w2
+	str	w1, [x0, 2424]
 	mov	w1, w26
+	mov	w0, w27
 	bl	FtlCacheMetchLpa
-	str	x22, [x29,120]
-	cbz	w0, .L3241
+	str	x7, [x29, 112]
+	cbz	w0, .L3160
 	bl	FtlCacheWriteBack
-.L3241:
-	mov	w27, 0
+.L3160:
+	mov	w22, w27
 	adrp	x0, .LC57
+	mov	w28, 0
 	add	x0, x0, :lo12:.LC57
-	mov	w22, w28
-	str	w27, [x29,184]
-	mov	w23, w27
-	str	w27, [x29,172]
-	str	x0, [x29,112]
-.L3242:
-	cbz	w21, .L3286
-	mov	w0, w22
-	add	x1, x29, 204
+	mov	w25, 0
+	str	x0, [x29, 104]
+	stp	wzr, wzr, [x29, 164]
+.L3161:
+	ldr	w0, [x29, 172]
+	cbnz	w0, .L3178
+	add	x20, x20, :lo12:.LANCHOR2
+	ldrh	w0, [x20, 2486]
+	cbz	w0, .L3157
+	mov	w1, 1
+	mov	w0, 0
+	bl	ftl_do_gc
+	b	.L3157
+.L3178:
 	mov	w2, 0
+	add	x1, x29, 188
+	mov	w0, w22
 	bl	log2phys
-	ldr	w3, [x29,204]
-	cmn	w3, #1
-	bne	.L3284
-	mov	w3, 0
-.L3243:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x0,2350]
-	cmp	w3, w0
-	bcs	.L3247
-	madd	w0, w22, w0, w3
-	cmp	w0, w20
-	bcc	.L3245
-	ldr	w1, [x29,188]
-	cmp	w0, w1
-	bcs	.L3245
-	sub	w0, w0, w20
-	mov	w1, 0
-	ubfiz	x0, x0, 9, 23
-	mov	w2, 512
-	add	x0, x24, x0
-	str	x3, [x29,176]
-	bl	ftl_memset
-	ldr	x3, [x29,176]
-.L3245:
-	add	w3, w3, 1
-	b	.L3243
-.L3284:
-	add	x2, x19, :lo12:.LANCHOR2
-	mov	w0, 56
-	cmp	w22, w28
-	umull	x1, w23, w0
-	ldr	x0, [x2,2520]
-	add	x0, x0, x1
-	str	w3, [x0,4]
-	ldrh	w0, [x2,2350]
-	bne	.L3248
-	ldr	x3, [x2,2520]
-	ldr	x2, [x2,2616]
-	add	x3, x3, x1
-	str	x2, [x3,8]
-	udiv	w2, w20, w0
-	msub	w2, w2, w0, w20
-	str	w2, [x29,144]
-	sub	w2, w0, w2
-	cmp	w2, w25
-	csel	w2, w2, w25, ls
-	str	w2, [x29,184]
-	cmp	w2, w0
-	bne	.L3249
-	str	x24, [x3,8]
-	b	.L3249
-.L3248:
-	cmp	w22, w26
-	bne	.L3250
-	ldr	x3, [x2,2520]
-	ldr	x2, [x2,2624]
-	add	x3, x3, x1
-	ldr	w4, [x29,188]
-	str	x2, [x3,8]
-	mul	w2, w22, w0
-	sub	w27, w4, w2
-	cmp	w27, w0
-	bne	.L3249
-	sub	w2, w2, w20
-	ubfiz	x2, x2, 9, 23
-	add	x2, x24, x2
-	str	x2, [x3,8]
-	b	.L3249
-.L3250:
-	ldr	x2, [x2,2520]
-	mul	w0, w22, w0
-	add	x2, x2, x1
-	sub	w0, w0, w20
-	ubfiz	x0, x0, 9, 23
-	add	x0, x24, x0
-	str	x0, [x2,8]
-.L3249:
-	add	x2, x19, :lo12:.LANCHOR2
-	ldr	x0, [x2,2520]
-	add	x1, x0, x1
-	ldrh	w0, [x2,2356]
-	ldr	x2, [x2,2648]
-	mul	w0, w23, w0
-	str	w22, [x1,24]
-	add	w23, w23, 1
-	and	x0, x0, 4294967292
-	add	x0, x2, x0
-	str	x0, [x1,16]
-.L3247:
-	subs	w21, w21, #1
+	ldr	w4, [x29, 188]
+	cmn	w4, #1
+	bne	.L3162
+	add	x5, x20, :lo12:.LANCHOR2
+	mov	w21, 0
+.L3163:
+	ldrh	w0, [x5, 2350]
+	cmp	w21, w0
+	bcc	.L3165
+.L3166:
+	ldr	w0, [x29, 172]
 	add	w22, w22, 1
-	beq	.L3251
-	add	x0, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x0,2276]
-	cmp	w23, w0, lsl 3
-	bne	.L3242
-.L3251:
-	cbz	w23, .L3242
-	add	x0, x19, :lo12:.LANCHOR2
-	mov	w1, w23
+	subs	w0, w0, #1
+	str	w0, [x29, 172]
+	beq	.L3170
+	add	x0, x20, :lo12:.LANCHOR2
+	ldrh	w0, [x0, 2276]
+	cmp	w28, w0, lsl 3
+	bne	.L3161
+.L3170:
+	cbz	w28, .L3161
+	add	x8, x20, :lo12:.LANCHOR2
+	mov	w1, w28
 	mov	w2, 0
-	ldr	x0, [x0,2520]
+	mov	x21, x8
+	ldr	x0, [x8, 2520]
 	bl	FlashReadPages
-	str	xzr, [x29,176]
-	ldr	x0, [x29,144]
-	ubfiz	x0, x0, 9, 23
-	str	x0, [x29,136]
-	ldr	w0, [x29,184]
+	ldr	w0, [x29, 164]
 	lsl	w0, w0, 9
-	str	w0, [x29,168]
-	lsl	w0, w27, 9
-	str	w0, [x29,132]
-	ldr	x0, [x29,120]
-	add	x0, x0, :lo12:.LANCHOR5
-	str	x0, [x29,160]
-.L3253:
-	ldr	w0, [x29,176]
-	cmp	w23, w0
-	bls	.L3287
-	ldr	x0, [x29,176]
-	add	x2, x19, :lo12:.LANCHOR2
-	mov	x1, 56
-	mul	x8, x0, x1
-	ldr	x0, [x2,2520]
-	add	x0, x0, x8
-	ldr	w1, [x0,24]
-	cmp	w1, w28
-	bne	.L3254
-	ldr	x1, [x0,8]
-	ldr	x0, [x2,2616]
-	cmp	x1, x0
-	bne	.L3255
-	ldr	x2, [x29,136]
-	mov	x0, x24
-	str	x8, [x29,104]
-	add	x1, x1, x2
-	ldr	w2, [x29,168]
-	b	.L3285
-.L3254:
-	cmp	w1, w26
-	bne	.L3255
-	ldr	x1, [x0,8]
-	ldr	x0, [x2,2624]
+	str	w0, [x29, 132]
+	ldr	w0, [x29, 160]
+	lsl	w0, w0, 9
+	str	x0, [x29, 136]
+	ldr	w0, [x29, 168]
+	lsl	w0, w0, 9
+	str	w0, [x29, 152]
+	mov	w0, 56
+	umull	x0, w28, w0
+	mov	x28, 0
+	str	x0, [x29, 120]
+	ldr	x0, [x29, 112]
+	add	x0, x0, :lo12:.LANCHOR4
+	str	x0, [x29, 144]
+.L3177:
+	ldr	x0, [x21, 2520]
+	add	x0, x0, x28
+	ldr	w1, [x0, 24]
+	cmp	w27, w1
+	bne	.L3172
+	ldr	x1, [x0, 8]
+	ldr	x0, [x21, 2616]
 	cmp	x1, x0
-	bne	.L3255
-	ldrh	w0, [x2,2350]
-	ldr	w2, [x29,132]
-	str	x8, [x29,104]
-	mul	w0, w26, w0
-	sub	w0, w0, w20
-	ubfiz	x0, x0, 9, 23
-	add	x0, x24, x0
-.L3285:
+	bne	.L3173
+	ldr	x0, [x29, 136]
+	ldr	w2, [x29, 152]
+	add	x1, x1, x0
+	mov	x0, x23
+.L3197:
 	bl	ftl_memcpy
-	ldr	x8, [x29,104]
-.L3255:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	x0, [x0,2520]
-	add	x2, x0, x8
-	ldr	w1, [x0,x8]
-	cmn	w1, #1
-	bne	.L3256
-	ldr	x0, [x29,160]
-	str	w1, [x29,172]
-	add	x3, x0, 640
-	ldr	w0, [x0,712]
-	add	w0, w0, 1
-	str	w0, [x3,72]
-.L3256:
-	ldr	x0, [x2,16]
-	ldr	w1, [x2,24]
-	ldr	w0, [x0,8]
-	cmp	w1, w0
-	beq	.L3257
-	ldr	x0, [x29,160]
-	str	x8, [x29,104]
-	add	x1, x0, 640
-	ldr	w0, [x0,712]
-	add	w0, w0, 1
-	str	w0, [x1,72]
-	ldr	x7, [x2,8]
-	ldr	x6, [x2,16]
-	ldr	w0, [x7,4]
-	str	w0, [sp]
-	ldr	x0, [x29,112]
-	ldr	w1, [x2,24]
-	ldr	w3, [x6]
-	ldr	w4, [x6,4]
-	ldr	w5, [x6,8]
-	ldr	w2, [x2,4]
-	ldr	w6, [x6,12]
-	ldr	w7, [x7]
-	bl	printk
-	ldr	x8, [x29,104]
-.L3257:
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	x0, [x0,2520]
-	add	x1, x0, x8
-	ldr	w0, [x0,x8]
+.L3173:
+	ldr	x1, [x21, 2520]
+	add	x0, x1, x28
+	ldr	w2, [x1, x28]
+	cmn	w2, #1
+	bne	.L3174
+	ldr	x1, [x29, 144]
+	mov	w25, w2
+	add	x3, x1, 1152
+	ldr	w1, [x1, 1224]
+	add	w1, w1, 1
+	str	w1, [x3, 72]
+.L3174:
+	ldr	x1, [x0, 16]
+	ldr	w2, [x0, 24]
+	ldr	w1, [x1, 8]
+	cmp	w2, w1
+	beq	.L3175
+	ldr	x1, [x29, 144]
+	add	x2, x1, 1152
+	ldr	w1, [x1, 1224]
+	add	w1, w1, 1
+	str	w1, [x2, 72]
+	ldp	x2, x1, [x0, 8]
+	ldr	w3, [x2, 4]
+	str	w3, [sp]
+	ldp	w3, w4, [x1]
+	ldp	w5, w6, [x1, 8]
+	ldr	w7, [x2]
+	ldr	w1, [x0, 24]
+	ldr	w2, [x0, 4]
+	ldr	x0, [x29, 104]
+	bl	printk
+.L3175:
+	ldr	x0, [x21, 2520]
+	add	x1, x0, x28
+	ldr	w0, [x0, x28]
 	cmp	w0, 256
-	bne	.L3258
-	ldr	w0, [x1,4]
-	lsr	x0, x0, 10
+	bne	.L3176
+	ldr	w0, [x1, 4]
+	lsr	w0, w0, 10
 	bl	P2V_block_in_plane
 	bl	FtlGcRefreshBlock
-.L3258:
-	ldr	x0, [x29,176]
-	add	x0, x0, 1
-	str	x0, [x29,176]
-	b	.L3253
-.L3287:
-	mov	w23, 0
-	b	.L3242
-.L3286:
-	add	x19, x19, :lo12:.LANCHOR2
-	ldrh	w0, [x19,2486]
-	cbz	w0, .L3261
-	mov	w0, w21
-	mov	w1, 1
-	bl	ftl_do_gc
-.L3261:
-	ldr	w0, [x29,172]
-	b	.L3239
-.L3263:
-	mov	w0, -1
-.L3239:
-	sub	sp, x29, #16
-	ldp	x19, x20, [sp,32]
-	ldp	x21, x22, [sp,48]
-	ldp	x23, x24, [sp,64]
-	ldp	x25, x26, [sp,80]
-	ldp	x27, x28, [sp,96]
-	ldp	x29, x30, [sp,16]
-	add	sp, sp, 224
-	ret
+.L3176:
+	ldr	x0, [x29, 120]
+	add	x28, x28, 56
+	cmp	x0, x28
+	bne	.L3177
+	mov	w28, 0
+	b	.L3161
+.L3165:
+	madd	w0, w22, w0, w21
+	cmp	w19, w0
+	bhi	.L3164
+	ldr	w1, [x29, 156]
+	cmp	w1, w0
+	bls	.L3164
+	sub	w0, w0, w19
+	str	x5, [x29, 144]
+	lsl	w0, w0, 9
+	mov	w2, 512
+	mov	w1, 0
+	add	x0, x23, x0
+	bl	ftl_memset
+	ldr	x5, [x29, 144]
+.L3164:
+	add	w21, w21, 1
+	b	.L3163
+.L3162:
+	add	x1, x20, :lo12:.LANCHOR2
+	mov	w0, 56
+	cmp	w22, w27
+	umull	x2, w28, w0
+	ldr	x0, [x1, 2520]
+	add	x0, x0, x2
+	str	w4, [x0, 4]
+	ldrh	w0, [x1, 2350]
+	bne	.L3167
+	ldr	x4, [x1, 2520]
+	ldr	x1, [x1, 2616]
+	add	x4, x4, x2
+	str	x1, [x4, 8]
+	udiv	w1, w19, w0
+	msub	w1, w1, w0, w19
+	str	w1, [x29, 160]
+	sub	w1, w0, w1
+	cmp	w24, w1
+	csel	w1, w24, w1, ls
+	str	w1, [x29, 168]
+	cmp	w1, w0
+	bne	.L3168
+	str	x23, [x4, 8]
+.L3168:
+	add	x1, x20, :lo12:.LANCHOR2
+	ldr	x0, [x1, 2520]
+	add	x2, x0, x2
+	ldrh	w0, [x1, 2356]
+	ldr	x1, [x1, 2648]
+	str	w22, [x2, 24]
+	mul	w0, w0, w28
+	add	w28, w28, 1
+	and	x0, x0, 4294967292
+	add	x0, x1, x0
+	str	x0, [x2, 16]
+	b	.L3166
+.L3167:
+	cmp	w22, w26
+	bne	.L3169
+	ldr	x4, [x1, 2520]
+	ldr	x1, [x1, 2624]
+	add	x4, x4, x2
+	ldr	w3, [x29, 156]
+	str	x1, [x4, 8]
+	mul	w1, w22, w0
+	sub	w3, w3, w1
+	str	w3, [x29, 164]
+	cmp	w0, w3
+	bne	.L3168
+	sub	w1, w1, w19
+	lsl	w1, w1, 9
+	add	x1, x23, x1
+	str	x1, [x4, 8]
+	b	.L3168
+.L3169:
+	ldr	x1, [x1, 2520]
+	mul	w0, w0, w22
+	add	x1, x1, x2
+	sub	w0, w0, w19
+	lsl	w0, w0, 9
+	add	x0, x23, x0
+	str	x0, [x1, 8]
+	b	.L3168
+.L3172:
+	cmp	w26, w1
+	bne	.L3173
+	ldr	x1, [x0, 8]
+	ldr	x0, [x21, 2624]
+	cmp	x1, x0
+	bne	.L3173
+	ldrh	w0, [x21, 2350]
+	ldr	w2, [x29, 132]
+	mul	w0, w0, w26
+	sub	w0, w0, w19
+	lsl	w0, w0, 9
+	add	x0, x23, x0
+	b	.L3197
+.L3182:
+	mov	w25, -1
+	b	.L3157
 	.size	ftl_read, .-ftl_read
 	.align	2
 	.global	ftl_vendor_read
 	.type	ftl_vendor_read, %function
 ftl_vendor_read:
 	stp	x29, x30, [sp, -16]!
-	mov	w5, w0
-	mov	w4, w1
-	add	x29, sp, 0
 	mov	x3, x2
-	mov	w1, w5
-	mov	w2, w4
+	mov	w2, w1
+	mov	w1, w0
+	add	x29, sp, 0
 	mov	w0, 16
 	bl	ftl_read
 	ldp	x29, x30, [sp], 16
@@ -20895,11 +20415,10 @@ ftl_vendor_read:
 	.type	ftl_sys_read, %function
 ftl_sys_read:
 	stp	x29, x30, [sp, -16]!
-	mov	w4, w1
 	mov	x3, x2
-	add	x29, sp, 0
+	mov	w2, w1
 	add	w1, w0, 256
-	mov	w2, w4
+	add	x29, sp, 0
 	mov	w0, 16
 	bl	ftl_read
 	ldp	x29, x30, [sp], 16
@@ -20910,641 +20429,617 @@ ftl_sys_read:
 	.type	FtlInit, %function
 FtlInit:
 	stp	x29, x30, [sp, -64]!
-	mov	w0, -1
 	adrp	x1, .LC144
-	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	adrp	x23, .LANCHOR1
 	add	x1, x1, :lo12:.LC144
-	add	x23, x23, :lo12:.LANCHOR1
-	stp	x21, x22, [sp,32]
-	stp	x19, x20, [sp,16]
-	adrp	x22, .LANCHOR2
-	adrp	x20, .LANCHOR5
-	add	x21, x22, :lo12:.LANCHOR2
-	str	w0, [x23,3448]
-	add	x20, x20, :lo12:.LANCHOR5
-	adrp	x0, .LC47
-	add	x0, x0, :lo12:.LC47
-	str	wzr, [x21,2928]
-	str	wzr, [x20,1404]
+	mov	w0, -1
+	add	x29, sp, 0
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR4
+	stp	x21, x22, [sp, 32]
+	add	x20, x20, :lo12:.LANCHOR4
+	adrp	x21, .LANCHOR1
+	adrp	x19, .LANCHOR2
+	add	x21, x21, :lo12:.LANCHOR1
+	add	x19, x19, :lo12:.LANCHOR2
+	str	x23, [sp, 48]
+	str	wzr, [x20, 1916]
+	str	w0, [x21, 3448]
+	adrp	x0, .LC48
+	str	wzr, [x19, 2928]
+	add	x0, x0, :lo12:.LC48
 	bl	printk
-	add	x0, x21, 1192
+	add	x0, x19, 1192
 	bl	FtlConstantsInit
 	bl	FtlMemInit
 	bl	FtlVariablesInit
-	ldrh	w0, [x21,2280]
+	ldrh	w0, [x19, 2280]
 	bl	FtlFreeSysBlkQueueInit
 	bl	FtlLoadBbt
-	cbz	w0, .L3291
+	cbz	w0, .L3203
+	adrp	x1, .LANCHOR3
+	add	x1, x1, :lo12:.LANCHOR3
 	adrp	x0, .LC162
+	add	x1, x1, 256
 	add	x0, x0, :lo12:.LC162
-	b	.L3305
-.L3291:
+.L3218:
+	bl	printk
+.L3204:
+	mov	w0, 0
+	ldr	x23, [sp, 48]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 64
+	ret
+.L3203:
 	bl	FtlSysBlkInit
-	mov	w19, w0
-	cbz	w0, .L3293
-	adrp	x0, .LC163
-	add	x0, x0, :lo12:.LC163
-.L3305:
+	cbz	w0, .L3205
 	adrp	x1, .LANCHOR3
 	add	x1, x1, :lo12:.LANCHOR3
+	adrp	x0, .LC163
 	add	x1, x1, 256
-	bl	printk
-	b	.L3292
-.L3293:
+	add	x0, x0, :lo12:.LC163
+	b	.L3218
+.L3205:
 	mov	w1, 1
-	str	w1, [x23,3448]
+	str	w1, [x21, 3448]
 	bl	ftl_do_gc
-	adrp	x1, .LANCHOR4
-	add	x0, x1, :lo12:.LANCHOR4
-	mov	x24, x1
-	ldrh	w0, [x0,776]
+	ldrh	w0, [x20, 776]
 	cmp	w0, 15
-	bhi	.L3294
+	bhi	.L3206
+	add	w22, w0, 2
+	mov	w21, 0
 	mov	w23, 65535
-	add	w21, w0, 2
-.L3297:
-	ldrh	w0, [x20,592]
+.L3209:
+	ldrh	w0, [x20, 1104]
 	cmp	w0, w23
-	bne	.L3295
-	add	x0, x22, :lo12:.LANCHOR2
-	ldrh	w0, [x0,2472]
+	bne	.L3207
+	ldrh	w0, [x19, 2472]
 	cmp	w0, w23
-	bne	.L3295
-	and	w0, w19, 63
+	bne	.L3207
+	and	w0, w21, 63
 	bl	List_get_gc_head_node
 	bl	FtlGcRefreshBlock
-.L3295:
-	mov	w0, 1
-	mov	w1, w0
+.L3207:
+	mov	w1, 1
+	mov	w0, w1
 	bl	ftl_do_gc
-	mov	w0, 0
 	mov	w1, 1
+	mov	w0, 0
 	bl	ftl_do_gc
-	add	x0, x24, :lo12:.LANCHOR4
-	ldrh	w0, [x0,776]
-	cmp	w0, w21
-	bhi	.L3292
-	add	w19, w19, 1
-	cmp	w19, 4096
-	bne	.L3297
-	b	.L3292
-.L3294:
-	ldrb	w0, [x21,1220]
-	cbz	w0, .L3292
+	ldrh	w0, [x20, 776]
+	cmp	w0, w22
+	bhi	.L3204
+	add	w21, w21, 1
+	cmp	w21, 4096
+	bne	.L3209
+	b	.L3204
+.L3206:
+	ldrb	w0, [x19, 1220]
+	cbz	w0, .L3204
 	mov	w19, 128
-.L3299:
-	mov	w0, 1
-	mov	w1, w0
+.L3211:
+	mov	w1, 1
+	mov	w0, w1
 	bl	ftl_do_gc
 	subs	w19, w19, #1
-	bne	.L3299
-.L3292:
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 64
-	ret
+	bne	.L3211
+	b	.L3204
 	.size	FtlInit, .-FtlInit
 	.align	2
 	.global	ftl_write
 	.type	ftl_write, %function
 ftl_write:
-	stp	x29, x30, [sp, -288]!
-	mov	w4, w0
-	mov	w0, 0
+	stp	x29, x30, [sp, -256]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	adrp	x22, .LANCHOR2
-	stp	x23, x24, [sp,48]
-	mov	w24, w2
-	add	x2, x22, :lo12:.LANCHOR2
-	stp	x25, x26, [sp,64]
-	stp	x19, x20, [sp,16]
-	stp	x27, x28, [sp,80]
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR2
+	stp	x25, x26, [sp, 64]
+	mov	w25, w2
+	add	x2, x20, :lo12:.LANCHOR2
+	stp	x23, x24, [sp, 48]
+	stp	x21, x22, [sp, 32]
 	mov	w23, w1
-	mov	x25, x3
-	ldr	w1, [x2,2928]
-	cbnz	w1, .L3307
+	stp	x27, x28, [sp, 80]
+	ldr	w1, [x2, 2928]
+	cbnz	w1, .L3261
 	adrp	x1, .LANCHOR1
-	str	x1, [x29,176]
+	mov	x24, x3
 	add	x3, x1, :lo12:.LANCHOR1
-	ldr	w3, [x3,3448]
+	str	x1, [x29, 144]
+	ldr	w3, [x3, 3448]
 	cmp	w3, 1
-	bne	.L3307
-	cmp	w4, 16
-	bne	.L3308
+	bne	.L3261
+	cmp	w0, 16
+	bne	.L3221
+	mov	x2, x24
+	mov	w1, w25
 	add	w0, w23, 256
-	mov	w1, w24
-	mov	x2, x25
 	bl	FtlVendorPartWrite
-	b	.L3307
-.L3308:
-	ldr	w1, [x2,1224]
+.L3219:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 256
+	ret
+.L3221:
+	ldr	w1, [x2, 1224]
 	cmp	w23, w1
-	bcs	.L3350
-	cmp	w24, w1
-	bhi	.L3350
-	add	w3, w23, w24
-	mov	w0, -1
-	cmp	w3, w1
-	bhi	.L3307
-	adrp	x4, .LANCHOR5
-	ldrh	w1, [x2,2350]
-	add	x21, x4, :lo12:.LANCHOR5
-	sub	w3, w3, #1
-	mov	w0, 2048
-	str	x4, [x29,216]
-	udiv	w26, w23, w1
-	cmp	w24, w1, lsl 1
-	str	w0, [x21,1408]
-	udiv	w0, w3, w1
-	ldr	w3, [x2,2496]
-	str	w0, [x29,208]
-	sub	w27, w0, w26
-	add	w20, w27, 1
-	ldr	w0, [x2,2408]
-	add	w0, w20, w0
-	str	w0, [x2,2408]
-	ldr	w0, [x21,1152]
-	add	w0, w24, w0
-	str	w0, [x21,1152]
+	bcs	.L3264
+	cmp	w25, w1
+	bhi	.L3264
+	add	w0, w23, w25
+	cmp	w1, w0
+	bcc	.L3264
+	adrp	x3, .LANCHOR4
+	add	x21, x3, :lo12:.LANCHOR4
+	mov	w1, 2048
+	sub	w0, w0, #1
+	ldr	w4, [x2, 2496]
+	str	w1, [x21, 1920]
+	ldrh	w1, [x2, 2350]
+	str	x3, [x29, 152]
+	cmp	w25, w1, lsl 1
+	udiv	w0, w0, w1
+	udiv	w27, w23, w1
+	str	w0, [x29, 172]
+	sub	w28, w0, w27
+	ldr	w0, [x2, 2408]
+	add	w26, w28, 1
+	add	w0, w0, w26
+	str	w0, [x2, 2408]
+	ldr	w0, [x21, 1664]
+	add	w0, w0, w25
+	str	w0, [x21, 1664]
 	cset	w0, cs
-	str	w0, [x29,212]
-	cbz	w3, .L3310
-	mov	w0, 56
-	sub	w3, w3, #1
-	umull	x3, w3, w0
-	ldr	x0, [x2,2560]
-	add	x3, x0, x3
-	ldr	w0, [x3,24]
-	cmp	w26, w0
-	bne	.L3311
-	ldr	w0, [x2,2416]
+	str	w0, [x29, 188]
+	cbz	w4, .L3223
+	ldr	x0, [x2, 2560]
+	sub	w4, w4, #1
+	mov	w3, 56
+	umaddl	x4, w4, w3, x0
+	ldr	w0, [x4, 24]
+	cmp	w27, w0
+	bne	.L3224
+	ldr	w0, [x2, 2416]
+	ldr	x3, [x4, 8]
 	add	w0, w0, 1
-	str	w0, [x2,2416]
-	ldr	w0, [x21,1412]
+	str	w0, [x2, 2416]
+	ldr	w0, [x21, 1924]
 	add	w0, w0, 1
-	str	w0, [x21,1412]
-	msub	w0, w26, w1, w23
+	str	w0, [x21, 1924]
+	msub	w0, w27, w1, w23
 	sub	w1, w1, w0
-	ubfiz	x0, x0, 9, 23
-	cmp	w1, w24
-	csel	w19, w1, w24, ls
-	ldr	x1, [x3,8]
-	lsl	w20, w19, 9
-	add	x0, x1, x0
-	mov	w2, w20
-	mov	x1, x25
+	cmp	w25, w1
+	lsl	w0, w0, 9
+	csel	w19, w25, w1, ls
+	add	x0, x3, x0
+	lsl	w22, w19, 9
+	mov	x1, x24
+	mov	w2, w22
 	bl	ftl_memcpy
-	cbnz	w27, .L3312
-	ldr	w0, [x21,1412]
+	cbnz	w28, .L3225
+	ldr	w0, [x21, 1924]
 	cmp	w0, 2
-	bgt	.L3312
-.L3346:
+	bgt	.L3225
+.L3261:
 	mov	w0, 0
-	b	.L3307
-.L3312:
-	add	x25, x25, x20
-	sub	w24, w24, w19
+	b	.L3219
+.L3225:
+	sub	w25, w25, w19
 	add	w23, w23, w19
-	add	w26, w26, 1
-	mov	w20, w27
-.L3311:
-	ldr	x0, [x29,216]
-	add	x0, x0, :lo12:.LANCHOR5
-	str	wzr, [x0,1412]
-.L3310:
-	ldr	w1, [x29,208]
-	mov	w0, w26
+	add	x24, x24, x22
+	add	w27, w27, 1
+	mov	w26, w28
+.L3224:
+	ldr	x0, [x29, 152]
+	add	x0, x0, :lo12:.LANCHOR4
+	str	wzr, [x0, 1924]
+.L3223:
+	ldr	w1, [x29, 172]
+	mov	w0, w27
 	bl	FtlCacheMetchLpa
-	cbz	w0, .L3313
+	cbz	w0, .L3226
 	bl	FtlCacheWriteBack
-.L3313:
-	ldr	x0, [x29,216]
-	adrp	x2, .LANCHOR4
-	add	x1, x2, :lo12:.LANCHOR4
-	str	w26, [x29,192]
-	add	x0, x0, :lo12:.LANCHOR5
-	add	x21, x1, 784
-	str	x2, [x29,128]
-	str	x1, [x29,120]
-	str	x21, [x0,1392]
-	adrp	x0, .LC164
-	add	x0, x0, :lo12:.LC164
-	str	x21, [x29,184]
-	str	x0, [x29,104]
-.L3314:
-	cbz	w20, .L3378
-	ldrh	w0, [x21,4]
-	cbnz	w0, .L3315
-	ldr	x1, [x29,184]
-	cmp	x21, x1
-	bne	.L3316
-	ldr	x0, [x29,120]
+.L3226:
+	ldr	x0, [x29, 152]
+	mov	w21, w27
+	add	x0, x0, :lo12:.LANCHOR4
+	str	x0, [x29, 176]
+	add	x1, x0, 784
+	str	x1, [x29, 160]
+	mov	x22, x1
+	str	x1, [x29, 120]
+	str	x1, [x0, 1904]
+.L3227:
+	cbnz	w26, .L3255
+	ldr	w0, [x29, 172]
+	sub	w1, w0, w27
+	mov	w0, 0
+	bl	ftl_do_gc
+	ldr	x0, [x29, 152]
+	add	x0, x0, :lo12:.LANCHOR4
+	ldrh	w0, [x0, 776]
+	cmp	w0, 5
+	bls	.L3256
+	cmp	w0, 31
+	bhi	.L3261
+	adrp	x0, .LANCHOR0+88
+	ldrb	w0, [x0, #:lo12:.LANCHOR0+88]
+	cbnz	w0, .L3261
+.L3256:
+	ldr	x0, [x29, 152]
+	add	x20, x20, :lo12:.LANCHOR2
+	mov	w19, 65535
+	mov	w22, 128
+	add	x21, x0, :lo12:.LANCHOR4
+.L3259:
+	ldrh	w0, [x21, 1104]
+	cmp	w0, w19
+	bne	.L3258
+	ldrh	w0, [x20, 2472]
+	cmp	w0, w19
+	bne	.L3258
+	ldrh	w0, [x20, 2474]
+	cmp	w0, w19
+	bne	.L3258
+	and	w0, w26, 7
+	bl	List_get_gc_head_node
+	bl	FtlGcRefreshBlock
+.L3258:
+	mov	w1, 1
+	strh	w22, [x20, 2482]
+	mov	w0, w1
+	strh	w22, [x20, 2480]
+	bl	ftl_do_gc
+	mov	w1, 1
+	mov	w0, 0
+	bl	ftl_do_gc
+	ldr	w0, [x20, 2928]
+	cbnz	w0, .L3261
+	ldrh	w0, [x21, 776]
+	cmp	w0, 2
+	bhi	.L3261
+	add	w26, w26, 1
+	cmp	w26, 256
+	bne	.L3259
+	b	.L3261
+.L3255:
+	ldrh	w0, [x22, 4]
+	cbnz	w0, .L3228
+	ldr	x0, [x29, 120]
+	cmp	x22, x0
+	bne	.L3229
+	ldr	x0, [x29, 176]
 	add	x0, x0, 832
-	ldrh	w19, [x0,4]
-	cbnz	w19, .L3317
+	ldrh	w1, [x0, 4]
+	cbnz	w1, .L3230
 	bl	allocate_new_data_superblock
-	ldr	x0, [x29,176]
+	ldr	x0, [x29, 144]
 	add	x0, x0, :lo12:.LANCHOR1
-	str	w19, [x0,3456]
-.L3317:
-	ldr	x0, [x29,184]
+	str	wzr, [x0, 3456]
+.L3230:
+	ldr	x0, [x29, 160]
 	bl	allocate_new_data_superblock
-	ldr	x0, [x29,176]
-	ldr	x1, [x29,120]
+	ldr	x0, [x29, 144]
+	ldr	x1, [x29, 176]
 	add	x0, x0, :lo12:.LANCHOR1
-	add	x21, x1, 832
-	ldr	w0, [x0,3456]
-	cbnz	w0, .L3318
-.L3319:
-	ldr	x21, [x29,184]
-	b	.L3318
-.L3316:
-	ldr	x1, [x29,176]
-	add	x1, x1, :lo12:.LANCHOR1
-	str	w0, [x1,3456]
-	ldr	x0, [x29,184]
-	ldrh	w0, [x0,4]
-	cbnz	w0, .L3319
-	mov	x0, x21
-	bl	allocate_new_data_superblock
-.L3318:
-	ldrh	w0, [x21,4]
-	cbnz	w0, .L3320
-	mov	x0, x21
+	add	x22, x1, 832
+	ldr	w0, [x0, 3456]
+	cmp	w0, 0
+	ldr	x0, [x29, 160]
+	csel	x22, x22, x0, ne
+.L3231:
+	ldrh	w0, [x22, 4]
+	cbnz	w0, .L3232
+	mov	x0, x22
 	bl	allocate_new_data_superblock
-.L3320:
-	ldr	x0, [x29,216]
-	add	x0, x0, :lo12:.LANCHOR5
-	str	x21, [x0,1392]
-.L3315:
-	add	x2, x22, :lo12:.LANCHOR2
-	ldrh	w1, [x21,4]
-	str	xzr, [x29,200]
-	ldr	w0, [x2,2492]
-	ldr	w2, [x2,2496]
-	sub	w0, w0, w2
+.L3232:
+	ldr	x0, [x29, 176]
+	str	x22, [x0, 1904]
+.L3228:
+	add	x1, x20, :lo12:.LANCHOR2
+	str	wzr, [x29, 184]
+	ldr	w0, [x1, 2492]
+	ldr	w1, [x1, 2496]
+	sub	w0, w0, w1
+	ldrh	w1, [x22, 4]
+	cmp	w0, w26
+	csel	w0, w0, w26, ls
 	cmp	w1, w0
 	csel	w0, w1, w0, ls
-	cmp	w0, w20
-	csel	w0, w0, w20, ls
-	str	w0, [x29,156]
-	ldr	w0, [x29,212]
+	str	w0, [x29, 116]
+	ldr	w0, [x29, 188]
 	and	w0, w0, 1
-	str	w0, [x29,116]
-	add	w0, w24, w23
-	str	w0, [x29,152]
-.L3321:
-	ldr	w0, [x29,200]
-	ldr	w2, [x29,156]
-	ldr	w1, [x29,192]
-	cmp	w0, w2
-	add	w28, w1, w0
-	bcs	.L3379
-	ldrh	w1, [x21,4]
-	cbz	w1, .L3354
-	ldr	w1, [x29,208]
-	cmp	w28, w1
-	cset	w6, eq
-	cbz	w0, .L3323
-	ldr	w1, [x29,116]
-	tst	w6, w1
-	beq	.L3323
-	add	x1, x22, :lo12:.LANCHOR2
-	ldr	w2, [x29,152]
-	ldrh	w1, [x1,2350]
-	msub	w2, w28, w1, w2
-	cmp	w2, w1
-	bne	.L3354
-.L3323:
-	add	x1, x29, 228
+	str	w0, [x29, 112]
+	adrp	x0, .LC164
+	add	x0, x0, :lo12:.LC164
+	str	x0, [x29, 104]
+.L3233:
+	ldr	w1, [x29, 116]
+	ldr	w0, [x29, 184]
+	cmp	w0, w1
+	bne	.L3251
+.L3234:
+	ldr	w0, [x29, 184]
+	sub	w26, w26, w0
+	add	x0, x20, :lo12:.LANCHOR2
+	ldr	w1, [x0, 2496]
+	ldr	w0, [x0, 2492]
+	cmp	w1, w0
+	bcs	.L3252
+	ldr	w0, [x29, 188]
+	cbnz	w0, .L3252
+	ldrh	w0, [x22, 4]
+	cbz	w0, .L3252
+.L3254:
+	str	wzr, [x29, 188]
+	b	.L3227
+.L3229:
+	ldr	x0, [x29, 144]
+	add	x0, x0, :lo12:.LANCHOR1
+	str	wzr, [x0, 3456]
+	ldr	x0, [x29, 120]
+	ldrh	w0, [x0, 4]
+	cbnz	w0, .L3268
+	mov	x0, x22
+	bl	allocate_new_data_superblock
+	b	.L3231
+.L3268:
+	ldr	x22, [x29, 160]
+	b	.L3232
+.L3251:
+	ldrh	w0, [x22, 4]
+	cbz	w0, .L3234
+	ldr	w0, [x29, 172]
+	cmp	w0, w21
+	ldr	w0, [x29, 112]
+	cset	w3, eq
+	tst	w3, w0
+	beq	.L3235
+	ldr	w0, [x29, 184]
+	cbz	w0, .L3235
+	add	x0, x20, :lo12:.LANCHOR2
+	ldrh	w1, [x0, 2350]
+	add	w0, w23, w25
+	msub	w0, w21, w1, w0
+	cmp	w1, w0
+	bne	.L3234
+.L3235:
+	add	x1, x29, 196
+	add	x19, x20, :lo12:.LANCHOR2
 	mov	w2, 0
-	mov	w0, w28
-	str	x6, [x29,96]
-	add	x19, x22, :lo12:.LANCHOR2
+	str	w3, [x29, 100]
+	mov	w0, w21
 	bl	log2phys
-	mov	x0, x21
+	mov	x0, x22
 	bl	get_new_active_ppa
-	ldr	w5, [x19,2496]
+	ldr	w5, [x19, 2496]
 	mov	w4, 56
-	ldr	x2, [x19,2560]
-	str	x4, [x29,160]
-	umull	x1, w5, w4
-	add	x2, x2, x1
-	str	w0, [x2,4]
-	ldrh	w2, [x19,2356]
-	ldr	x0, [x19,2560]
-	add	x1, x0, x1
-	mul	w0, w2, w5
-	and	x0, x0, 4294967292
-	str	x0, [x29,144]
-	ldr	x0, [x19,2664]
-	ldr	x3, [x29,144]
-	str	x0, [x29,136]
-	add	x27, x0, x3
-	ldrh	w0, [x19,2354]
-	str	x27, [x1,16]
-	str	w28, [x1,24]
-	mul	w0, w0, w5
-	ldr	x5, [x19,2608]
-	and	x0, x0, 4294967292
-	add	x0, x5, x0
-	str	x0, [x1,8]
-	mov	x0, x27
+	ldr	x1, [x19, 2560]
+	str	w4, [x29, 168]
+	umull	x2, w5, w4
+	add	x1, x1, x2
+	str	w0, [x1, 4]
+	ldr	x0, [x19, 2560]
+	add	x0, x0, x2
+	ldrh	w2, [x19, 2356]
+	str	w21, [x0, 24]
+	mul	w1, w5, w2
+	and	x1, x1, 4294967292
+	str	x1, [x29, 136]
+	ldr	x1, [x19, 2664]
+	ldr	x3, [x29, 136]
+	str	x1, [x29, 128]
+	add	x28, x1, x3
+	ldrh	w1, [x19, 2354]
+	str	x28, [x0, 16]
+	mul	w1, w1, w5
+	ldr	x5, [x19, 2608]
+	and	x1, x1, 4294967292
+	add	x1, x5, x1
+	str	x1, [x0, 8]
 	mov	w1, 0
+	mov	x0, x28
 	bl	ftl_memset
-	cmp	w28, w26
+	cmp	w27, w21
+	ldr	w3, [x29, 100]
 	cset	w0, eq
-	str	w0, [x29,196]
-	cbnz	w0, .L3358
-	ldr	x6, [x29,96]
-	ldr	x4, [x29,160]
-	cbz	w6, .L3324
-	ldr	w0, [x29,152]
-	ldrh	w19, [x19,2350]
-	msub	w19, w28, w19, w0
-	ldr	w0, [x29,196]
-	str	w0, [x29,160]
-	uxth	w19, w19
-	b	.L3327
-.L3358:
-	ldrh	w19, [x19,2350]
+	ldr	w4, [x29, 168]
+	orr	w3, w3, w0
+	cbz	w3, .L3236
+	bne	.L3237
+	ldrh	w19, [x19, 2350]
 	udiv	w0, w23, w19
 	msub	w0, w0, w19, w23
-	str	w0, [x29,160]
+	str	w0, [x29, 168]
 	sub	w19, w19, w0
-	cmp	w19, w24
-	csel	w19, w19, w24, ls
-.L3327:
-	add	x2, x22, :lo12:.LANCHOR2
-	ldrh	w0, [x2,2350]
-	cmp	w19, w0
-	bne	.L3328
-	ldr	w0, [x29,196]
-	mov	x1, x25
-	cbnz	w0, .L3329
-	mul	w1, w19, w28
+	cmp	w19, w25
+	csel	w19, w19, w25, ls
+.L3238:
+	add	x0, x20, :lo12:.LANCHOR2
+	ldrh	w1, [x0, 2350]
+	cmp	w1, w19
+	bne	.L3239
+	cmp	w27, w21
+	beq	.L3269
+	mul	w1, w21, w19
 	sub	w1, w1, w23
-	ubfiz	x1, x1, 9, 23
-	add	x1, x25, x1
-.L3329:
-	ldr	w2, [x29,212]
-	mov	w0, 56
-	add	x4, x22, :lo12:.LANCHOR2
-	cbz	w2, .L3330
-	ldr	w2, [x4,2496]
-	umull	x0, w2, w0
-	ldr	x2, [x4,2560]
-	add	x0, x2, x0
-	b	.L3376
-.L3330:
-	ldr	w2, [x4,2496]
-	umull	x0, w2, w0
-	ldr	x2, [x4,2560]
-	add	x0, x2, x0
-	ldrh	w2, [x4,2354]
-	ldr	x0, [x0,8]
-	b	.L3377
-.L3328:
-	ldr	w0, [x29,228]
+	lsl	w1, w1, 9
+	add	x1, x24, x1
+.L3240:
+	ldr	w0, [x29, 188]
+	add	x2, x20, :lo12:.LANCHOR2
+	cbz	w0, .L3241
+	ldr	w0, [x2, 2496]
+	mov	w3, 56
+	ldr	x2, [x2, 2560]
+	umaddl	x0, w0, w3, x2
+.L3287:
+	str	x1, [x0, 8]
+.L3242:
+	ldp	x1, x2, [x29, 128]
+	mov	w0, -3947
+	strh	w0, [x1, x2]
+	add	x1, x20, :lo12:.LANCHOR2
+	ldr	w0, [x1, 2400]
+	stp	w0, w21, [x28, 4]
+	add	w21, w21, 1
+	add	w0, w0, 1
 	cmn	w0, #1
-	beq	.L3332
-	str	w0, [x29,236]
-	mov	w1, 56
-	ldr	w0, [x2,2496]
-	str	w28, [x29,256]
-	umull	x0, w0, w1
-	ldr	x1, [x2,2560]
+	csel	w0, w0, wzr, ne
+	str	w0, [x1, 2400]
+	ldr	w0, [x29, 196]
+	str	w0, [x28, 12]
+	ldrh	w0, [x22]
+	strh	w0, [x28, 2]
+	ldr	w0, [x1, 2496]
+	add	w0, w0, 1
+	str	w0, [x1, 2496]
+	ldr	w0, [x29, 184]
+	add	w0, w0, 1
+	str	w0, [x29, 184]
+	b	.L3233
+.L3237:
+	ldrh	w0, [x19, 2350]
+	add	w2, w23, w25
+	str	wzr, [x29, 168]
+	msub	w19, w21, w0, w2
+	and	w19, w19, 65535
+	b	.L3238
+.L3269:
+	mov	x1, x24
+	b	.L3240
+.L3241:
+	ldr	w0, [x2, 2496]
+	mov	w4, 56
+	ldr	x3, [x2, 2560]
+	ldrh	w2, [x2, 2354]
+	nop // between mem op and mult-accumulate
+	umaddl	x0, w0, w4, x3
+.L3288:
+	ldr	x0, [x0, 8]
+	b	.L3290
+.L3239:
+	ldr	w1, [x29, 196]
+	mov	w2, 56
+	cmn	w1, #1
+	beq	.L3243
+	str	w1, [x29, 204]
+	ldr	w1, [x0, 2496]
+	ldr	x0, [x0, 2560]
+	str	w21, [x29, 224]
+	nop // between mem op and mult-accumulate
+	umaddl	x0, w1, w2, x0
 	mov	w2, 0
-	add	x0, x1, x0
-	ldr	x1, [x0,8]
-	ldr	x0, [x0,16]
-	str	x1, [x29,240]
+	ldp	x1, x0, [x0, 8]
+	stp	x1, x0, [x29, 208]
 	mov	w1, 1
-	str	x0, [x29,248]
-	add	x0, x29, 232
+	add	x0, x29, 200
 	bl	FlashReadPages
-	ldr	w0, [x29,232]
+	ldr	w0, [x29, 200]
 	cmn	w0, #1
-	bne	.L3333
-	ldr	x0, [x29,216]
-	add	x0, x0, :lo12:.LANCHOR5
-	ldr	w1, [x0,712]
-	add	w1, w1, 1
-	str	w1, [x0,712]
-	b	.L3335
-.L3333:
-	ldr	w0, [x27,8]
-	cmp	w0, w28
-	beq	.L3335
-	ldr	x0, [x29,216]
-	mov	w2, w28
-	add	x0, x0, :lo12:.LANCHOR5
-	ldr	w1, [x0,712]
-	add	w1, w1, 1
-	str	w1, [x0,712]
-	ldr	x0, [x29,104]
-	ldr	w1, [x27,8]
+	bne	.L3244
+	ldr	x0, [x29, 176]
+	add	x1, x0, 1152
+	ldr	w0, [x0, 1224]
+	add	w0, w0, 1
+	str	w0, [x1, 72]
+.L3246:
+	cmp	w27, w21
+	lsl	w2, w19, 9
+	bne	.L3247
+	add	x0, x20, :lo12:.LANCHOR2
+	mov	w3, 56
+	ldr	w1, [x0, 2496]
+	ldr	x0, [x0, 2560]
+	umaddl	x1, w1, w3, x0
+	ldr	w0, [x29, 168]
+	lsl	w0, w0, 9
+	ldr	x3, [x1, 8]
+	mov	x1, x24
+	add	x0, x3, x0
+.L3290:
+	bl	ftl_memcpy
+	b	.L3242
+.L3244:
+	ldr	w0, [x28, 8]
+	cmp	w21, w0
+	beq	.L3246
+	ldr	x0, [x29, 176]
+	mov	w2, w21
+	add	x1, x0, 1152
+	ldr	w0, [x0, 1224]
+	add	w0, w0, 1
+	str	w0, [x1, 72]
+	ldr	x0, [x29, 104]
+	ldr	w1, [x28, 8]
 	bl	printk
-	b	.L3335
-.L3332:
-	ldr	w0, [x2,2496]
-	mov	w1, 56
-	umull	x0, w0, w1
-	ldr	x1, [x2,2560]
-	ldrh	w2, [x2,2354]
-	add	x0, x1, x0
+	b	.L3246
+.L3243:
+	ldr	x1, [x0, 2560]
+	ldr	w3, [x0, 2496]
+	umaddl	x3, w3, w2, x1
+	ldrh	w2, [x0, 2354]
 	mov	w1, 0
-	ldr	x0, [x0,8]
+	ldr	x0, [x3, 8]
 	bl	ftl_memset
-.L3335:
-	ldr	w1, [x29,196]
-	mov	w0, 56
-	lsl	w2, w19, 9
-	cbz	w1, .L3336
-	add	x1, x22, :lo12:.LANCHOR2
-	ldr	w4, [x1,2496]
-	umull	x0, w4, w0
-	ldr	x4, [x1,2560]
-	add	x4, x4, x0
-	ldr	x0, [x29,160]
-	ubfiz	x0, x0, 9, 23
-	ldr	x1, [x4,8]
-	add	x0, x1, x0
-	mov	x1, x25
-	b	.L3377
-.L3336:
-	add	x5, x22, :lo12:.LANCHOR2
-	ldr	w4, [x5,2496]
-	ldr	x1, [x5,2560]
-	umull	x0, w4, w0
-	add	x0, x1, x0
-	ldrh	w1, [x5,2350]
-	mul	w1, w28, w1
-	ldr	x0, [x0,8]
+	b	.L3246
+.L3247:
+	add	x3, x20, :lo12:.LANCHOR2
+	mov	w4, 56
+	ldrh	w1, [x3, 2350]
+	ldr	w0, [x3, 2496]
+	ldr	x3, [x3, 2560]
+	mul	w1, w1, w21
+	umaddl	x0, w0, w4, x3
 	sub	w1, w1, w23
-	ubfiz	x1, x1, 9, 23
-	add	x1, x25, x1
-	b	.L3377
-.L3324:
-	ldr	w0, [x29,212]
-	ldrh	w1, [x19,2350]
-	ldr	w2, [x19,2496]
-	cbz	w0, .L3337
-	mul	w1, w28, w1
-	umull	x0, w2, w4
+	lsl	w1, w1, 9
+.L3289:
+	add	x1, x24, x1
+	b	.L3288
+.L3236:
+	ldr	w0, [x29, 188]
+	ldrh	w1, [x19, 2350]
+	cbz	w0, .L3248
+	mul	w1, w1, w21
+	ldr	w0, [x19, 2496]
+	ldr	x2, [x19, 2560]
 	sub	w1, w1, w23
-	ldr	x2, [x19,2560]
-	ubfiz	x1, x1, 9, 23
-	add	x0, x2, x0
-	add	x1, x25, x1
-.L3376:
-	str	x1, [x0,8]
-	b	.L3331
-.L3337:
-	umull	x0, w2, w4
-	ldr	x2, [x19,2560]
-	mul	w1, w28, w1
-	add	x0, x2, x0
-	ldrh	w2, [x19,2354]
+	lsl	w1, w1, 9
+	add	x1, x24, x1
+	umaddl	x0, w0, w4, x2
+	b	.L3287
+.L3248:
+	ldr	x2, [x19, 2560]
+	mul	w1, w1, w21
+	ldr	w0, [x19, 2496]
 	sub	w1, w1, w23
-	ubfiz	x1, x1, 9, 23
-	ldr	x0, [x0,8]
-	add	x1, x25, x1
-.L3377:
-	bl	ftl_memcpy
-.L3331:
-	ldr	x1, [x29,136]
-	mov	w0, -3947
-	ldr	x2, [x29,144]
-	strh	w0, [x1,x2]
-	add	x1, x22, :lo12:.LANCHOR2
-	str	w28, [x27,8]
-	ldr	w0, [x1,2400]
-	str	w0, [x27,4]
-	add	w0, w0, 1
-	cmn	w0, #1
-	csel	w0, w0, wzr, ne
-	str	w0, [x1,2400]
-	ldr	w0, [x29,228]
-	str	w0, [x27,12]
-	ldrh	w0, [x21]
-	strh	w0, [x27,2]
-	ldr	w0, [x1,2496]
-	add	w0, w0, 1
-	str	w0, [x1,2496]
-	ldr	x0, [x29,200]
-	add	x0, x0, 1
-	str	x0, [x29,200]
-	b	.L3321
-.L3379:
-	str	w28, [x29,192]
-	mov	x0, x2
-	b	.L3322
-.L3354:
-	str	w28, [x29,192]
-.L3322:
-	sub	w20, w20, w0
-	ldr	w0, [x29,212]
-	cbnz	w0, .L3341
-	add	x0, x22, :lo12:.LANCHOR2
-	ldr	w1, [x0,2496]
-	ldr	w0, [x0,2492]
-	cmp	w1, w0
-	bcs	.L3341
-	ldrh	w0, [x21,4]
-	cbz	w0, .L3341
-.L3343:
-	str	wzr, [x29,212]
-	b	.L3314
-.L3341:
+	lsl	w1, w1, 9
+	umaddl	x0, w0, w4, x2
+	ldrh	w2, [x19, 2354]
+	b	.L3289
+.L3252:
 	bl	FtlCacheWriteBack
-	add	x0, x22, :lo12:.LANCHOR2
-	cmp	w20, 1
-	str	wzr, [x0,2496]
-	bhi	.L3314
-	b	.L3343
-.L3378:
-	ldr	w1, [x29,208]
-	mov	w0, w20
-	sub	w1, w1, w26
-	bl	ftl_do_gc
-	ldr	x0, [x29,128]
-	add	x0, x0, :lo12:.LANCHOR4
-	ldrh	w0, [x0,776]
-	cmp	w0, 5
-	bls	.L3345
-	cmp	w0, 31
-	bhi	.L3346
-	adrp	x0, .LANCHOR0+88
-	ldrb	w0, [x0,#:lo12:.LANCHOR0+88]
-	cbnz	w0, .L3346
-.L3345:
-	ldr	x0, [x29,216]
-	mov	w19, 65535
-	mov	w23, 128
-	add	x24, x0, :lo12:.LANCHOR5
-.L3369:
-	ldrh	w0, [x24,592]
-	cmp	w0, w19
-	bne	.L3347
-	add	x0, x22, :lo12:.LANCHOR2
-	ldrh	w1, [x0,2472]
-	cmp	w1, w19
-	bne	.L3347
-	ldrh	w0, [x0,2474]
-	cmp	w0, w19
-	bne	.L3347
-	and	w0, w20, 7
-	bl	List_get_gc_head_node
-	bl	FtlGcRefreshBlock
-.L3347:
-	add	x21, x22, :lo12:.LANCHOR2
-	mov	w0, 1
-	mov	w1, w0
-	strh	w23, [x21,2482]
-	strh	w23, [x21,2480]
-	bl	ftl_do_gc
-	mov	w0, 0
-	mov	w1, 1
-	bl	ftl_do_gc
-	ldr	w0, [x21,2928]
-	cbnz	w0, .L3346
-	ldr	x0, [x29,128]
-	add	x0, x0, :lo12:.LANCHOR4
-	ldrh	w0, [x0,776]
-	cmp	w0, 2
-	bhi	.L3346
-	add	w20, w20, 1
-	cmp	w20, 256
-	bne	.L3369
-	b	.L3346
-.L3350:
+	add	x0, x20, :lo12:.LANCHOR2
+	cmp	w26, 1
+	str	wzr, [x0, 2496]
+	bhi	.L3227
+	b	.L3254
+.L3264:
 	mov	w0, -1
-.L3307:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 288
-	ret
+	b	.L3219
 	.size	ftl_write, .-ftl_write
 	.align	2
 	.global	ftl_vendor_write
 	.type	ftl_vendor_write, %function
 ftl_vendor_write:
 	stp	x29, x30, [sp, -16]!
-	mov	w5, w0
-	mov	w4, w1
-	add	x29, sp, 0
 	mov	x3, x2
-	mov	w1, w5
-	mov	w2, w4
+	mov	w2, w1
+	mov	w1, w0
+	add	x29, sp, 0
 	mov	w0, 16
 	bl	ftl_write
 	ldp	x29, x30, [sp], 16
@@ -21555,11 +21050,10 @@ ftl_vendor_write:
 	.type	ftl_sys_write, %function
 ftl_sys_write:
 	stp	x29, x30, [sp, -16]!
-	mov	w4, w1
 	mov	x3, x2
-	add	x29, sp, 0
+	mov	w2, w1
 	add	w1, w0, 256
-	mov	w2, w4
+	add	x29, sp, 0
 	mov	w0, 16
 	bl	ftl_write
 	ldp	x29, x30, [sp], 16
@@ -21569,117 +21063,116 @@ ftl_sys_write:
 	.global	ftl_fix_nand_power_lost_error
 	.type	ftl_fix_nand_power_lost_error, %function
 ftl_fix_nand_power_lost_error:
-	stp	x29, x30, [sp, -128]!
+	stp	x29, x30, [sp, -144]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x19, .LANCHOR2
-	add	x0, x19, :lo12:.LANCHOR2
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	ldrb	w1, [x0,1220]
-	cbz	w1, .L3382
-	adrp	x21, .LANCHOR5
-	ldr	x2, [x0,2712]
-	add	x1, x21, :lo12:.LANCHOR5
-	adrp	x24, .LC165
-	adrp	x20, .LANCHOR4
-	add	x0, x24, :lo12:.LC165
-	add	x20, x20, :lo12:.LANCHOR4
-	ldrh	w23, [x1,1242]
-	add	x26, x20, 784
-	add	x25, x20, 832
-	ubfiz	x22, x23, 1, 16
-	mov	w1, w23
-	ldrh	w2, [x2,x22]
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR2
+	add	x19, x20, :lo12:.LANCHOR2
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	str	x27, [sp, 80]
+	ldrb	w0, [x19, 1220]
+	cbz	w0, .L3295
+	mov	x24, x20
+	adrp	x21, .LANCHOR4
+	add	x20, x21, :lo12:.LANCHOR4
+	ldr	x0, [x19, 2712]
+	adrp	x25, .LC165
+	add	x27, x20, 784
+	add	x26, x20, 832
+	ldrh	w22, [x20, 1754]
+	mov	w1, w22
+	ubfiz	x23, x22, 1, 16
+	ldrh	w2, [x0, x23]
+	add	x0, x25, :lo12:.LC165
 	bl	printk
-	ldrh	w0, [x20,784]
+	ldrh	w0, [x20, 784]
 	bl	FtlGcRefreshOpenBlock
-	ldrh	w0, [x20,832]
+	ldrh	w0, [x20, 832]
 	mov	w20, 4097
 	bl	FtlGcRefreshOpenBlock
-	mov	x0, x26
+	mov	x0, x27
 	bl	allocate_new_data_superblock
-	mov	x0, x25
+	mov	x0, x26
 	bl	allocate_new_data_superblock
-.L3384:
+.L3297:
 	subs	w20, w20, #1
-	beq	.L3388
-	mov	w0, 1
-	mov	w1, w0
+	beq	.L3301
+	mov	w1, 1
+	mov	w0, w1
 	bl	ftl_do_gc
-	add	x0, x19, :lo12:.LANCHOR2
-	ldr	x0, [x0,2712]
-	ldrh	w0, [x0,x22]
-	cbnz	w0, .L3384
-.L3388:
-	add	x20, x19, :lo12:.LANCHOR2
-	add	x0, x24, :lo12:.LC165
-	mov	w1, w23
-	ldr	x2, [x20,2712]
-	ldrh	w2, [x2,x22]
+	ldr	x0, [x19, 2712]
+	ldrh	w0, [x0, x23]
+	cbnz	w0, .L3297
+.L3301:
+	add	x20, x24, :lo12:.LANCHOR2
+	mov	w1, w22
+	ldr	x0, [x20, 2712]
+	ldrh	w2, [x0, x23]
+	add	x0, x25, :lo12:.LC165
 	bl	printk
-	ldr	x0, [x20,2712]
-	ldrh	w0, [x0,x22]
-	cbnz	w0, .L3386
-	add	x0, x29, 80
-	strh	w23, [x29,80]
+	ldr	x0, [x20, 2712]
+	ldrh	w19, [x0, x23]
+	cbnz	w19, .L3299
+	add	x12, x29, 144
+	strh	w22, [x12, -48]!
+	mov	x0, x12
 	bl	make_superblock
-	mov	x0, 0
-	ldrh	w5, [x20,2276]
+	ldrh	w5, [x20, 2276]
+	add	x12, x12, 16
+	mov	w0, 0
 	mov	w6, 65535
-	mov	w20, w0
 	mov	w7, 56
-.L3389:
-	cmp	w5, w0, uxth
-	bls	.L3396
-	add	x1, x29, 80
-	add	x1, x1, x0, lsl 1
-	ldrh	w2, [x1,16]
-	cmp	w2, w6
-	beq	.L3390
-	add	x4, x19, :lo12:.LANCHOR2
-	lsl	w2, w2, 10
-	umull	x1, w20, w7
-	add	w20, w20, 1
-	ldr	x3, [x4,2544]
-	uxth	w20, w20
-	add	x3, x3, x1
-	str	w2, [x3,4]
-	ldr	x2, [x4,2544]
-	add	x1, x2, x1
-	str	xzr, [x1,8]
-	str	xzr, [x1,16]
-.L3390:
-	add	x0, x0, 1
-	b	.L3389
-.L3396:
-	add	x19, x19, :lo12:.LANCHOR2
+.L3302:
+	cmp	w0, w5
+	bne	.L3304
+	add	x24, x24, :lo12:.LANCHOR2
+	mov	w1, w22
+	ldr	x0, [x24, 2712]
+	ldrh	w2, [x0, x23]
 	adrp	x0, .LC166
-	mov	w1, w23
 	add	x0, x0, :lo12:.LC166
-	ldr	x2, [x19,2712]
-	ldrh	w2, [x2,x22]
 	bl	printk
-	ldr	x0, [x19,2544]
+	ldr	x0, [x24, 2544]
+	mov	w2, w19
 	mov	w1, 0
-	mov	w2, w20
 	bl	FlashEraseBlocks
-	ldr	x0, [x19,2544]
+	ldr	x0, [x24, 2544]
+	mov	w2, w19
 	mov	w1, 1
-	mov	w2, w20
 	bl	FlashEraseBlocks
-.L3386:
-	add	x21, x21, :lo12:.LANCHOR5
+.L3299:
+	add	x21, x21, :lo12:.LANCHOR4
 	mov	w0, -1
-	strh	w0, [x21,1242]
-.L3382:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 128
+	strh	w0, [x21, 1754]
+.L3295:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldr	x27, [sp, 80]
+	ldp	x29, x30, [sp], 144
 	ret
+.L3304:
+	ldrh	w2, [x12]
+	cmp	w2, w6
+	beq	.L3303
+	umull	x4, w19, w7
+	ldr	x3, [x20, 2544]
+	lsl	w2, w2, 10
+	add	w19, w19, 1
+	add	x3, x3, x4
+	and	w19, w19, 65535
+	str	w2, [x3, 4]
+	ldr	x1, [x20, 2544]
+	add	x1, x1, x4
+	stp	xzr, xzr, [x1, 8]
+.L3303:
+	add	w0, w0, 1
+	add	x12, x12, 2
+	and	w0, w0, 65535
+	b	.L3302
 	.size	ftl_fix_nand_power_lost_error, .-ftl_fix_nand_power_lost_error
 	.global	gc_ink_free_return_value
 	.global	check_valid_page_count_table
@@ -21910,7 +21403,7 @@ ftl_fix_nand_power_lost_error:
 	.global	read_retry_cur_offset
 	.section	.rodata
 	.align	3
-.LANCHOR3 = . + 0
+	.set	.LANCHOR3,. + 0
 	.type	samsung_14nm_slc_rr, %object
 	.size	samsung_14nm_slc_rr, 26
 samsung_14nm_slc_rr:
@@ -22048,377 +21541,42 @@ samsung_14nm_mlc_rr:
 	.byte	18
 	.byte	9
 	.byte	8
-	.type	__func__.20983, %object
-	.size	__func__.20983, 11
-__func__.20983:
+	.type	__func__.21177, %object
+	.size	__func__.21177, 11
+__func__.21177:
 	.string	"FtlMemInit"
 	.zero	5
-	.type	__func__.21730, %object
-	.size	__func__.21730, 12
-__func__.21730:
+	.type	__func__.21924, %object
+	.size	__func__.21924, 12
+__func__.21924:
 	.string	"FtlCheckVpc"
 	.zero	4
-	.type	__func__.21762, %object
-	.size	__func__.21762, 17
-__func__.21762:
+	.type	__func__.21956, %object
+	.size	__func__.21956, 17
+__func__.21956:
 	.string	"FtlDumpBlockInfo"
 	.zero	7
-	.type	__func__.21781, %object
-	.size	__func__.21781, 16
-__func__.21781:
+	.type	__func__.21975, %object
+	.size	__func__.21975, 16
+__func__.21975:
 	.string	"FtlScanAllBlock"
-	.type	__func__.22049, %object
-	.size	__func__.22049, 17
-__func__.22049:
+	.type	__func__.22243, %object
+	.size	__func__.22243, 17
+__func__.22243:
 	.string	"ftl_scan_all_ppa"
 	.zero	7
-	.type	__func__.22029, %object
-	.size	__func__.22029, 21
-__func__.22029:
+	.type	__func__.22223, %object
+	.size	__func__.22223, 21
+__func__.22223:
 	.string	"FtlVpcCheckAndModify"
 	.zero	3
-	.type	__func__.21056, %object
-	.size	__func__.21056, 8
-__func__.21056:
+	.type	__func__.21250, %object
+	.size	__func__.21250, 8
+__func__.21250:
 	.string	"FtlInit"
-	.section	.rodata.str1.1,"aMS",%progbits,1
-.LC0:
-	.string	"BBT:"
-.LC1:
-	.string	"FlashEraseBlocks pageAddr error %x\n"
-.LC2:
-	.string	"otp error! %d"
-.LC3:
-	.string	"rr"
-.LC4:
-	.string	"%d statReg->V6.mtrans_cnt=%d flReg.V6.page_num=%d\n"
-.LC5:
-	.string	"nandc:"
-.LC6:
-	.string	"%d flReg.d32=%x %x\n"
-.LC7:
-	.string	"sdr read ok %x ecc=%d\n"
-.LC8:
-	.string	"sync para %d\n"
-.LC9:
-	.string	"TOG mode Read error %x %x\n"
-.LC10:
-	.string	"read retry status %x %x %x\n"
-.LC11:
-	.string	"micron RR %d row=%x,count %d,status=%d\n"
-.LC12:
-	.string	"samsung RR %d row=%x,count %d,status=%d\n"
-.LC13:
-	.string	"ECC:%d\n"
-.LC14:
-	.string	"No.%d FLASH ID:%x %x %x %x %x %x\n"
-.LC15:
-	.string	"FlashLoadPhyInfo fail %x!!\n"
-.LC16:
-	.string	"Read pageadd=%x  ecc=%x err=%x\n"
-.LC17:
-	.string	"data:"
-.LC18:
-	.string	"spare:"
-.LC19:
-	.string	"ReadRetry pageadd=%x ecc=%x err=%x\n"
-.LC20:
-	.string	"FLFB:%d %d\n"
-.LC21:
-	.string	"prog error: = %x\n"
-.LC22:
-	.string	"prog read error: = %x\n"
-.LC23:
-	.string	"prog read REFRESH: = %x\n"
-.LC24:
-	.string	"prog read s error: = %x %x %x\n"
-.LC25:
-	.string	"prog read d error: = %x %x %x\n"
-.LC26:
-	.string	"FlashMakeFactorBbt %d\n"
-.LC27:
-	.string	"bad block:%d %d\n"
-.LC28:
-	.string	"FMFB:%d %d\n"
-.LC29:
-	.string	"E:bad block:%d\n"
-.LC30:
-	.string	"FMFB:Save %d %d\n"
-.LC31:
-	.string	"%s error allocating memory. return -1\n"
-.LC32:
-	.string	"phyBlk = 0x%x die = %d block_in_die = 0x%x 0x%8x\n"
-.LC33:
-	.string	"FtlBbmTblFlush id=%x,page=%x,previd=%x cnt=%d\n"
-.LC34:
-	.string	"FtlBbmTblFlush error:%x\n"
-.LC35:
-	.string	"FtlBbmTblFlush error = %x error count = %d\n"
-.LC36:
-	.string	"FtlFreeSysBlkQueueOut free count = %d\n"
-.LC37:
-	.string	"FtlFreeSysBlkQueueOut = %x, free count = %d, error\n"
-.LC38:
-	.string	"FtlFreeSysBlkQueueOut = %x, free count = %d\n"
-.LC39:
-	.string	"FtlMapWritePage error = %x\n"
-.LC40:
-	.string	"FtlMapWritePage error = %x error count = %d\n"
-.LC41:
-	.string	"page map lost: %x %x\n"
-.LC42:
-	.string	"region_id = %x phyAddr = %x\n"
-.LC43:
-	.string	"map_ppn:"
-.LC44:
-	.string	"load_l2p_region refresh = %x phyAddr = %x\n"
-.LC45:
-	.string	"FtlVendorPartRead refresh = %x phyAddr = %x\n"
-.LC46:
-	.string	"FtlVpcTblFlush error = %x error count = %d\n"
-.LC47:
-	.string	"%s\n"
-.LC48:
-	.string	"no ect"
-.LC49:
-	.string	"...%s enter...\n"
-.LC50:
-	.string	"FtlCheckVpc2 %x = %x  %x\n"
-.LC51:
-	.string	"free blk vpc error %x = %x  %x\n"
-.LC52:
-	.string	"error_flag %x\n"
-.LC53:
-	.string	"id = %x,%x addr= %x,spare= %x %x %x %x data = %x\n"
-.LC54:
-	.string	":"
-.LC55:
-	.string	"Ftlscanalldata = %x\n"
-.LC56:
-	.string	"scan lpa = %x ppa= %x\n"
-.LC57:
-	.string	"lba = %x,addr= %x,spare= %x %x %x %x data=%x %x\n"
-.LC58:
-	.string	"phyBlk = %x,addr= %x,spare= %x %x %x %x data=%x %x\n"
-.LC59:
-	.string	"id = %x,%x addr= %x,spare= %x %x %x %x data=%x %x\n"
-.LC60:
-	.string	"Mblk:"
-.LC61:
-	.string	"L2P:"
-.LC62:
-	.string	"L2PC:"
-.LC63:
-	.string	"id = %x,%x addr= %x,spare= %x %x %x %x data= %x\n"
-.LC64:
-	.string	"superBlkID = %x vpc=%x\n"
-.LC65:
-	.string	"flashmode = %x pagenum = %x %x\n"
-.LC66:
-	.string	"blk = %x vpc=%x mode = %x\n"
-.LC67:
-	.string	"mlc id = %x,%x addr= %x,spare= %x %x %x %x data=%x %x\n"
-.LC68:
-	.string	"slc id = %x,%x addr= %x,spare= %x %x %x %x data=%x %x\n"
-.LC69:
-	.string	"slc mode"
-.LC70:
-	.string	"ftl_scan_all_ppa blk %x page %x flag: %x\n"
-.LC71:
-	.string	"ftl_scan_all_ppa blk %x page %x flag: %x ............... is bad block\n"
-.LC72:
-	.string	"addr= %x, status= %d,spare= %x %x %x %x data=%x %x\n"
-.LC73:
-	.string	"%s finished\n"
-.LC74:
-	.string	"FLASH INFO:\n"
-.LC75:
-	.string	"FLASH ID: %x\n"
-.LC76:
-	.string	"Device Capacity: %d MB\n"
-.LC77:
-	.string	"FMWAIT: %x %x %x %x\n"
-.LC78:
-	.string	"FTL INFO:\n"
-.LC79:
-	.string	"g_MaxLpn = 0x%x\n"
-.LC80:
-	.string	"g_VaildLpn = 0x%x\n"
-.LC81:
-	.string	"read_page_count = 0x%x\n"
-.LC82:
-	.string	"discard_page_count = 0x%x\n"
-.LC83:
-	.string	"write_page_count = 0x%x\n"
-.LC84:
-	.string	"cache_write_count = 0x%x\n"
-.LC85:
-	.string	"l2p_write_count = 0x%x\n"
-.LC86:
-	.string	"gc_page_count = 0x%x\n"
-.LC87:
-	.string	"totle_write = %d MB\n"
-.LC88:
-	.string	"totle_read = %d MB\n"
-.LC89:
-	.string	"GSV = 0x%x\n"
-.LC90:
-	.string	"GDV = 0x%x\n"
-.LC91:
-	.string	"bad blk num = %d %d\n"
-.LC92:
-	.string	"free_superblocks = 0x%x\n"
-.LC93:
-	.string	"mlc_EC = 0x%x\n"
-.LC94:
-	.string	"slc_EC = 0x%x\n"
-.LC95:
-	.string	"avg_EC = 0x%x\n"
-.LC96:
-	.string	"sys_EC = 0x%x\n"
-.LC97:
-	.string	"max_EC = 0x%x\n"
-.LC98:
-	.string	"min_EC = 0x%x\n"
-.LC99:
-	.string	"PLT = 0x%x\n"
-.LC100:
-	.string	"POT = 0x%x\n"
-.LC101:
-	.string	"MaxSector = 0x%x\n"
-.LC102:
-	.string	"init_sys_blks_pp = 0x%x\n"
-.LC103:
-	.string	"sys_blks_pp = 0x%x\n"
-.LC104:
-	.string	"free sysblock = 0x%x\n"
-.LC105:
-	.string	"data_blks_pp = 0x%x\n"
-.LC106:
-	.string	"data_op_blks_pp = 0x%x\n"
-.LC107:
-	.string	"max_data_blks = 0x%x\n"
-.LC108:
-	.string	"Sys.id = 0x%x\n"
-.LC109:
-	.string	"Bbt.id = 0x%x\n"
-.LC110:
-	.string	"ACT.page = 0x%x\n"
-.LC111:
-	.string	"ACT.plane = 0x%x\n"
-.LC112:
-	.string	"ACT.id = 0x%x\n"
-.LC113:
-	.string	"ACT.mode = 0x%x\n"
-.LC114:
-	.string	"ACT.a_pages = 0x%x\n"
-.LC115:
-	.string	"ACT VPC = 0x%x\n"
-.LC116:
-	.string	"BUF.page = 0x%x\n"
-.LC117:
-	.string	"BUF.plane = 0x%x\n"
-.LC118:
-	.string	"BUF.id = 0x%x\n"
-.LC119:
-	.string	"BUF.mode = 0x%x\n"
-.LC120:
-	.string	"BUF.a_pages = 0x%x\n"
-.LC121:
-	.string	"BUF VPC = 0x%x\n"
-.LC122:
-	.string	"TMP.page = 0x%x\n"
-.LC123:
-	.string	"TMP.plane = 0x%x\n"
-.LC124:
-	.string	"TMP.id = 0x%x\n"
-.LC125:
-	.string	"TMP.mode = 0x%x\n"
-.LC126:
-	.string	"TMP.a_pages = 0x%x\n"
-.LC127:
-	.string	"GC.page = 0x%x\n"
-.LC128:
-	.string	"GC.plane = 0x%x\n"
-.LC129:
-	.string	"GC.id = 0x%x\n"
-.LC130:
-	.string	"GC.mode = 0x%x\n"
-.LC131:
-	.string	"GC.a_pages = 0x%x\n"
-.LC132:
-	.string	"WR_CHK = 0x%x %x %x %x\n"
-.LC133:
-	.string	"Read Err = 0x%x\n"
-.LC134:
-	.string	"Prog Err = 0x%x\n"
-.LC135:
-	.string	"gc_free_blk_th= 0x%x\n"
-.LC136:
-	.string	"gc_merge_free_blk_th= 0x%x\n"
-.LC137:
-	.string	"gc_skip_write_count= 0x%x\n"
-.LC138:
-	.string	"gc_blk_index= 0x%x\n"
-.LC139:
-	.string	"free min EC= 0x%x\n"
-.LC140:
-	.string	"free max EC= 0x%x\n"
-.LC141:
-	.string	"GC__SB VPC = 0x%x\n"
-.LC142:
-	.string	"%d. [0x%x]=0x%x 0x%x  0x%x\n"
-.LC143:
-	.string	"free %d. [0x%x] 0x%x  0x%x\n"
-.LC144:
-	.string	"FTL version: 5.0.63 20200923"
-.LC145:
-	.string	"swblk %x ,avg = %x max= %x vpc= %x,ec=%x ,max ec=%x\n"
-.LC146:
-	.string	"FtlGcScanTempBlk Error ID %x %x!!!!!!! \n"
-.LC147:
-	.string	"FtlGcScanTempBlkError ID %x %x!!!!!!!\n"
-.LC148:
-	.string	"FtlGcRefreshBlock  0x%x\n"
-.LC149:
-	.string	"FtlGcMarkBadPhyBlk %d 0x%x\n"
-.LC150:
-	.string	"FtlGcFreeBadSuperBlk 0x%x\n"
-.LC151:
-	.string	"decrement_vpc_count %x = %d\n"
-.LC152:
-	.string	"decrement_vpc_count %x = %d in free list\n"
-.LC153:
-	.string	"RSB refresh addr %x\n"
-.LC154:
-	.string	"spuer block %x vpn is 0\n "
-.LC155:
-	.string	"g_recovery_ppa %x ver %x\n "
-.LC156:
-	.string	"FtlCheckVpc %x = %x  %x\n"
-.LC157:
-	.string	"%d GC datablk  = %x vpc %x %x\n"
-.LC158:
-	.string	"SWL %x, FSB = %x vpc= %x,ec=%x th=%x\n"
-.LC159:
-	.string	"Ftlwrite decrement_vpc_count %x = %d\n"
-.LC160:
-	.string	"GC des block %x done\n"
-.LC161:
-	.string	"too many bad block  = %d %d\n"
-.LC162:
-	.string	"...%s: no bad block mapping table, format device\n"
-.LC163:
-	.string	"...%s FtlSysBlkInit error ,format device!\n"
-.LC164:
-	.string	"FtlWrite: lpa error:%x %x\n"
-.LC165:
-	.string	"fix power lost blk = %x vpc=%x\n"
-.LC166:
-	.string	"erase power lost blk = %x vpc=%x\n"
 	.data
 	.align	3
-.LANCHOR1 = . + 0
+	.set	.LANCHOR1,. + 0
 	.type	random_seed, %object
 	.size	random_seed, 256
 random_seed:
@@ -22550,58 +21708,9 @@ random_seed:
 	.hword	28406
 	.hword	17598
 	.hword	28087
-	.type	ToshibaA19RefValue, %object
-	.size	ToshibaA19RefValue, 45
-ToshibaA19RefValue:
-	.byte	4
-	.byte	5
-	.byte	6
-	.byte	7
-	.byte	13
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	4
-	.byte	4
-	.byte	124
-	.byte	126
-	.byte	0
-	.byte	0
-	.byte	124
-	.byte	120
-	.byte	120
-	.byte	0
-	.byte	124
-	.byte	118
-	.byte	116
-	.byte	114
-	.byte	0
-	.byte	8
-	.byte	8
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	11
-	.byte	126
-	.byte	118
-	.byte	116
-	.byte	0
-	.byte	16
-	.byte	118
-	.byte	114
-	.byte	112
-	.byte	0
-	.byte	2
-	.byte	0
-	.byte	126
-	.byte	124
-	.byte	0
-	.zero	3
-	.type	Toshiba15RefValue, %object
-	.size	Toshiba15RefValue, 95
-Toshiba15RefValue:
+	.type	Toshiba15RefValue, %object
+	.size	Toshiba15RefValue, 95
+Toshiba15RefValue:
 	.byte	4
 	.byte	5
 	.byte	6
@@ -22698,6 +21807,55 @@ Toshiba15RefValue:
 	.byte	114
 	.byte	0
 	.zero	1
+	.type	ToshibaA19RefValue, %object
+	.size	ToshibaA19RefValue, 45
+ToshibaA19RefValue:
+	.byte	4
+	.byte	5
+	.byte	6
+	.byte	7
+	.byte	13
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	4
+	.byte	4
+	.byte	124
+	.byte	126
+	.byte	0
+	.byte	0
+	.byte	124
+	.byte	120
+	.byte	120
+	.byte	0
+	.byte	124
+	.byte	118
+	.byte	116
+	.byte	114
+	.byte	0
+	.byte	8
+	.byte	8
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	11
+	.byte	126
+	.byte	118
+	.byte	116
+	.byte	0
+	.byte	16
+	.byte	118
+	.byte	114
+	.byte	112
+	.byte	0
+	.byte	2
+	.byte	0
+	.byte	126
+	.byte	124
+	.byte	0
+	.zero	3
 	.type	ToshibaRefValue, %object
 	.size	ToshibaRefValue, 8
 ToshibaRefValue:
@@ -25195,10 +24353,13 @@ power_up_flag:
 	.word	1
 	.bss
 	.align	3
-.LANCHOR0 = . + 0
-.LANCHOR2 = . + 4352
-.LANCHOR4 = . + 8704
-.LANCHOR5 = . + 17408
+	.set	.LANCHOR0,. + 0
+	.set	.LANCHOR2,. + 4352
+	.set	.LANCHOR4,. + 8704
+	.type	gNandChipMap, %object
+	.size	gNandChipMap, 64
+gNandChipMap:
+	.zero	64
 	.type	gFlashPageBuffer0, %object
 	.size	gFlashPageBuffer0, 8
 gFlashPageBuffer0:
@@ -25212,10 +24373,6 @@ gNandFlashIdbBlockAddr:
 	.size	p_blk_mode_table, 8
 p_blk_mode_table:
 	.zero	8
-	.type	gNandChipMap, %object
-	.size	gNandChipMap, 64
-gNandChipMap:
-	.zero	64
 	.type	g_slc2KBNand, %object
 	.size	g_slc2KBNand, 1
 g_slc2KBNand:
@@ -25980,11 +25137,7 @@ gSysInfo:
 	.size	g_totle_map_block, 2
 g_totle_map_block:
 	.zero	2
-	.zero	6
-	.type	check_valid_page_count_table, %object
-	.size	check_valid_page_count_table, 8192
-check_valid_page_count_table:
-	.zero	8192
+	.zero	2
 	.type	g_MaxLbn, %object
 	.size	g_MaxLbn, 4
 g_MaxLbn:
@@ -25993,7 +25146,7 @@ g_MaxLbn:
 	.size	c_ftl_nand_data_op_blks_per_plane, 2
 c_ftl_nand_data_op_blks_per_plane:
 	.zero	2
-	.zero	2
+	.zero	6
 	.type	g_gc_superblock, %object
 	.size	g_gc_superblock, 48
 g_gc_superblock:
@@ -26109,6 +25262,10 @@ g_ftl_nand_free_count:
 	.size	last_cache_match_count, 4
 last_cache_match_count:
 	.zero	4
+	.type	check_valid_page_count_table, %object
+	.size	check_valid_page_count_table, 8192
+check_valid_page_count_table:
+	.zero	8192
 	.type	g_gc_refresh_block_temp_tbl, %object
 	.size	g_gc_refresh_block_temp_tbl, 34
 g_gc_refresh_block_temp_tbl:
@@ -26138,3 +25295,338 @@ gFlashOnfiModeEn:
 	.size	gFlashSdrModeEn, 1
 gFlashSdrModeEn:
 	.zero	1
+	.section	.rodata.str1.1,"aMS",@progbits,1
+.LC0:
+	.string	"BBT:"
+.LC1:
+	.string	"FlashEraseBlocks pageAddr error %x\n"
+.LC2:
+	.string	"otp error! %d"
+.LC3:
+	.string	"rr"
+.LC4:
+	.string	"%d statReg->V6.mtrans_cnt=%d flReg.V6.page_num=%d\n"
+.LC5:
+	.string	"nandc:"
+.LC6:
+	.string	"%d flReg.d32=%x %x\n"
+.LC7:
+	.string	"sdr read ok %x ecc=%d\n"
+.LC8:
+	.string	"sync para %d\n"
+.LC9:
+	.string	"TOG mode Read error %x %x\n"
+.LC10:
+	.string	"read retry status %x %x %x\n"
+.LC11:
+	.string	"micron RR %d row=%x,count %d,status=%d\n"
+.LC12:
+	.string	"samsung RR %d row=%x,count %d,status=%d\n"
+.LC13:
+	.string	"ECC:%d\n"
+.LC14:
+	.string	"No.%d FLASH ID:%x %x %x %x %x %x\n"
+.LC15:
+	.string	"FlashLoadPhyInfo fail %x!!\n"
+.LC16:
+	.string	"Read pageadd=%x  ecc=%x err=%x\n"
+.LC17:
+	.string	"data:"
+.LC18:
+	.string	"spare:"
+.LC19:
+	.string	"ReadRetry pageadd=%x ecc=%x err=%x\n"
+.LC20:
+	.string	"FLFB:%d %d\n"
+.LC21:
+	.string	"prog error: = %x\n"
+.LC22:
+	.string	"prog read error: = %x\n"
+.LC23:
+	.string	"prog read REFRESH: = %x\n"
+.LC24:
+	.string	"prog read s error: = %x %x %x\n"
+.LC25:
+	.string	"prog read d error: = %x %x %x\n"
+.LC26:
+	.string	"FlashMakeFactorBbt %d\n"
+.LC27:
+	.string	"bad block:%d %d\n"
+.LC28:
+	.string	"FMFB:%d %d\n"
+.LC29:
+	.string	"E:bad block:%d\n"
+.LC30:
+	.string	"FMFB:Save %d %d\n"
+.LC31:
+	.string	"%s error allocating memory. return -1\n"
+.LC32:
+	.string	"phyBlk = 0x%x die = %d block_in_die = 0x%x 0x%8x\n"
+.LC33:
+	.string	"FtlBbmTblFlush id=%x,page=%x,previd=%x cnt=%d\n"
+.LC34:
+	.string	"FtlBbmTblFlush error:%x\n"
+.LC35:
+	.string	"FtlBbmTblFlush error = %x error count = %d\n"
+.LC36:
+	.string	"FtlFreeSysBlkQueueOut free count = %d\n"
+.LC37:
+	.string	"FtlFreeSysBlkQueueOut = %x, free count = %d, error\n"
+.LC38:
+	.string	"FtlFreeSysBlkQueueOut = %x, free count = %d\n"
+.LC39:
+	.string	"FtlMapWritePage error = %x\n"
+.LC40:
+	.string	"FtlMapWritePage error = %x error count = %d\n"
+.LC41:
+	.string	"page map lost: %x %x\n"
+.LC42:
+	.string	"region_id = %x phyAddr = %x\n"
+.LC43:
+	.string	"map_ppn:"
+.LC44:
+	.string	"load_l2p_region refresh = %x phyAddr = %x\n"
+.LC45:
+	.string	"FtlVendorPartRead refresh = %x phyAddr = %x\n"
+.LC46:
+	.string	"FtlVpcTblFlush error = %x error count = %d\n"
+.LC47:
+	.string	"no ect"
+.LC48:
+	.string	"%s\n"
+.LC49:
+	.string	"...%s enter...\n"
+.LC50:
+	.string	"FtlCheckVpc2 %x = %x  %x\n"
+.LC51:
+	.string	"free blk vpc error %x = %x  %x\n"
+.LC52:
+	.string	"error_flag %x\n"
+.LC53:
+	.string	"id = %x,%x addr= %x,spare= %x %x %x %x data = %x\n"
+.LC54:
+	.string	":"
+.LC55:
+	.string	"Ftlscanalldata = %x\n"
+.LC56:
+	.string	"scan lpa = %x ppa= %x\n"
+.LC57:
+	.string	"lba = %x,addr= %x,spare= %x %x %x %x data=%x %x\n"
+.LC58:
+	.string	"phyBlk = %x,addr= %x,spare= %x %x %x %x data=%x %x\n"
+.LC59:
+	.string	"id = %x,%x addr= %x,spare= %x %x %x %x data=%x %x\n"
+.LC60:
+	.string	"Mblk:"
+.LC61:
+	.string	"L2P:"
+.LC62:
+	.string	"L2PC:"
+.LC63:
+	.string	"id = %x,%x addr= %x,spare= %x %x %x %x data= %x\n"
+.LC64:
+	.string	"superBlkID = %x vpc=%x\n"
+.LC65:
+	.string	"flashmode = %x pagenum = %x %x\n"
+.LC66:
+	.string	"blk = %x vpc=%x mode = %x\n"
+.LC67:
+	.string	"mlc id = %x,%x addr= %x,spare= %x %x %x %x data=%x %x\n"
+.LC68:
+	.string	"slc id = %x,%x addr= %x,spare= %x %x %x %x data=%x %x\n"
+.LC69:
+	.string	"slc mode"
+.LC70:
+	.string	"ftl_scan_all_ppa blk %x page %x flag: %x\n"
+.LC71:
+	.string	"ftl_scan_all_ppa blk %x page %x flag: %x ............... is bad block\n"
+.LC72:
+	.string	"addr= %x, status= %d,spare= %x %x %x %x data=%x %x\n"
+.LC73:
+	.string	"%s finished\n"
+.LC74:
+	.string	"FLASH INFO:\n"
+.LC75:
+	.string	"FLASH ID: %x\n"
+.LC76:
+	.string	"Device Capacity: %d MB\n"
+.LC77:
+	.string	"FMWAIT: %x %x %x %x\n"
+.LC78:
+	.string	"FTL INFO:\n"
+.LC79:
+	.string	"g_MaxLpn = 0x%x\n"
+.LC80:
+	.string	"g_VaildLpn = 0x%x\n"
+.LC81:
+	.string	"read_page_count = 0x%x\n"
+.LC82:
+	.string	"discard_page_count = 0x%x\n"
+.LC83:
+	.string	"write_page_count = 0x%x\n"
+.LC84:
+	.string	"cache_write_count = 0x%x\n"
+.LC85:
+	.string	"l2p_write_count = 0x%x\n"
+.LC86:
+	.string	"gc_page_count = 0x%x\n"
+.LC87:
+	.string	"totle_write = %d MB\n"
+.LC88:
+	.string	"totle_read = %d MB\n"
+.LC89:
+	.string	"GSV = 0x%x\n"
+.LC90:
+	.string	"GDV = 0x%x\n"
+.LC91:
+	.string	"bad blk num = %d %d\n"
+.LC92:
+	.string	"free_superblocks = 0x%x\n"
+.LC93:
+	.string	"mlc_EC = 0x%x\n"
+.LC94:
+	.string	"slc_EC = 0x%x\n"
+.LC95:
+	.string	"avg_EC = 0x%x\n"
+.LC96:
+	.string	"sys_EC = 0x%x\n"
+.LC97:
+	.string	"max_EC = 0x%x\n"
+.LC98:
+	.string	"min_EC = 0x%x\n"
+.LC99:
+	.string	"PLT = 0x%x\n"
+.LC100:
+	.string	"POT = 0x%x\n"
+.LC101:
+	.string	"MaxSector = 0x%x\n"
+.LC102:
+	.string	"init_sys_blks_pp = 0x%x\n"
+.LC103:
+	.string	"sys_blks_pp = 0x%x\n"
+.LC104:
+	.string	"free sysblock = 0x%x\n"
+.LC105:
+	.string	"data_blks_pp = 0x%x\n"
+.LC106:
+	.string	"data_op_blks_pp = 0x%x\n"
+.LC107:
+	.string	"max_data_blks = 0x%x\n"
+.LC108:
+	.string	"Sys.id = 0x%x\n"
+.LC109:
+	.string	"Bbt.id = 0x%x\n"
+.LC110:
+	.string	"ACT.page = 0x%x\n"
+.LC111:
+	.string	"ACT.plane = 0x%x\n"
+.LC112:
+	.string	"ACT.id = 0x%x\n"
+.LC113:
+	.string	"ACT.mode = 0x%x\n"
+.LC114:
+	.string	"ACT.a_pages = 0x%x\n"
+.LC115:
+	.string	"ACT VPC = 0x%x\n"
+.LC116:
+	.string	"BUF.page = 0x%x\n"
+.LC117:
+	.string	"BUF.plane = 0x%x\n"
+.LC118:
+	.string	"BUF.id = 0x%x\n"
+.LC119:
+	.string	"BUF.mode = 0x%x\n"
+.LC120:
+	.string	"BUF.a_pages = 0x%x\n"
+.LC121:
+	.string	"BUF VPC = 0x%x\n"
+.LC122:
+	.string	"TMP.page = 0x%x\n"
+.LC123:
+	.string	"TMP.plane = 0x%x\n"
+.LC124:
+	.string	"TMP.id = 0x%x\n"
+.LC125:
+	.string	"TMP.mode = 0x%x\n"
+.LC126:
+	.string	"TMP.a_pages = 0x%x\n"
+.LC127:
+	.string	"GC.page = 0x%x\n"
+.LC128:
+	.string	"GC.plane = 0x%x\n"
+.LC129:
+	.string	"GC.id = 0x%x\n"
+.LC130:
+	.string	"GC.mode = 0x%x\n"
+.LC131:
+	.string	"GC.a_pages = 0x%x\n"
+.LC132:
+	.string	"WR_CHK = 0x%x %x %x %x\n"
+.LC133:
+	.string	"Read Err = 0x%x\n"
+.LC134:
+	.string	"Prog Err = 0x%x\n"
+.LC135:
+	.string	"gc_free_blk_th= 0x%x\n"
+.LC136:
+	.string	"gc_merge_free_blk_th= 0x%x\n"
+.LC137:
+	.string	"gc_skip_write_count= 0x%x\n"
+.LC138:
+	.string	"gc_blk_index= 0x%x\n"
+.LC139:
+	.string	"free min EC= 0x%x\n"
+.LC140:
+	.string	"free max EC= 0x%x\n"
+.LC141:
+	.string	"GC__SB VPC = 0x%x\n"
+.LC142:
+	.string	"%d. [0x%x]=0x%x 0x%x  0x%x\n"
+.LC143:
+	.string	"free %d. [0x%x] 0x%x  0x%x\n"
+.LC144:
+	.string	"FTL version: 5.0.63 20210616"
+.LC145:
+	.string	"swblk %x ,avg = %x max= %x vpc= %x,ec=%x ,max ec=%x\n"
+.LC146:
+	.string	"FtlGcScanTempBlk Error ID %x %x!!!!!!! \n"
+.LC147:
+	.string	"FtlGcScanTempBlkError ID %x %x!!!!!!!\n"
+.LC148:
+	.string	"FtlGcRefreshBlock  0x%x\n"
+.LC149:
+	.string	"FtlGcMarkBadPhyBlk %d 0x%x\n"
+.LC150:
+	.string	"FtlGcFreeBadSuperBlk 0x%x\n"
+.LC151:
+	.string	"decrement_vpc_count %x = %d\n"
+.LC152:
+	.string	"decrement_vpc_count %x = %d in free list\n"
+.LC153:
+	.string	"RSB refresh addr %x\n"
+.LC154:
+	.string	"spuer block %x vpn is 0\n "
+.LC155:
+	.string	"g_recovery_ppa %x ver %x\n "
+.LC156:
+	.string	"FtlCheckVpc %x = %x  %x\n"
+.LC157:
+	.string	"%d GC datablk  = %x vpc %x %x\n"
+.LC158:
+	.string	"SWL %x, FSB = %x vpc= %x,ec=%x th=%x\n"
+.LC159:
+	.string	"Ftlwrite decrement_vpc_count %x = %d\n"
+.LC160:
+	.string	"GC des block %x done\n"
+.LC161:
+	.string	"too many bad block  = %d %d\n"
+.LC162:
+	.string	"...%s: no bad block mapping table, format device\n"
+.LC163:
+	.string	"...%s FtlSysBlkInit error ,format device!\n"
+.LC164:
+	.string	"FtlWrite: lpa error:%x %x\n"
+.LC165:
+	.string	"fix power lost blk = %x vpc=%x\n"
+.LC166:
+	.string	"erase power lost blk = %x vpc=%x\n"
diff --git a/drivers/rk_nand/rk_nand_base.c b/drivers/rk_nand/rk_nand_base.c
index c6192c13759b..67137d18f80c 100644
--- a/drivers/rk_nand/rk_nand_base.c
+++ b/drivers/rk_nand/rk_nand_base.c
@@ -51,7 +51,7 @@ static int rk_timer_add;
 
 void *ftl_malloc(int size)
 {
-	return kmalloc(size, GFP_KERNEL | GFP_DMA);
+	return kmalloc(size, GFP_KERNEL | GFP_DMA32);
 }
 
 void ftl_free(void *buf)
@@ -96,24 +96,15 @@ EXPORT_SYMBOL(rknand_dma_flush_dcache);
 
 unsigned long rknand_dma_map_single(unsigned long ptr, int size, int dir)
 {
-#ifdef CONFIG_ARM64
-	__dma_map_area((void *)ptr, size, dir);
-	return ((unsigned long)virt_to_phys((void *)ptr));
-#else
-	return dma_map_single(NULL, (void *)ptr, size
+	return dma_map_single(g_nand_device, (void *)ptr, size
 		, dir ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
-#endif
 }
 EXPORT_SYMBOL(rknand_dma_map_single);
 
 void rknand_dma_unmap_single(unsigned long ptr, int size, int dir)
 {
-#ifdef CONFIG_ARM64
-	__dma_unmap_area(phys_to_virt(ptr), size, dir);
-#else
-	dma_unmap_single(NULL, (dma_addr_t)ptr, size
+	dma_unmap_single(g_nand_device, (dma_addr_t)ptr, size
 		, dir ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
-#endif
 }
 EXPORT_SYMBOL(rknand_dma_unmap_single);
 
@@ -392,7 +383,7 @@ static int rknand_probe(struct platform_device *pdev)
 	pm_runtime_enable(&pdev->dev);
 	pm_runtime_get_sync(&pdev->dev);
 
-	return 0;
+	return dma_set_mask(g_nand_device, DMA_BIT_MASK(32));
 }
 
 static int rknand_suspend(struct platform_device *pdev, pm_message_t state)
diff --git a/drivers/rk_nand/rk_zftl_arm64.S b/drivers/rk_nand/rk_zftl_arm64.S
index 12045b051a46..e2ded818efc9 100644
--- a/drivers/rk_nand/rk_zftl_arm64.S
+++ b/drivers/rk_nand/rk_zftl_arm64.S
@@ -5,7 +5,7 @@
  * 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.
- * date: 2021-01-07
+ * date: 2021-06-16
  * function: rk ftl v6 for rockchip soc base on arm v8 to support 3D/2D
  *	     TLC and MLC.
  */
@@ -17,20 +17,19 @@
 flash_mem_cmp8:
 	mov	x3, 0
 .L2:
-	cmp	w3, w2
 	mov	w4, w3
-	bcs	.L7
-	ldrb	w5, [x0,x3]
+	cmp	w3, w2
+	bcc	.L4
+	mov	w0, 0
+	ret
+.L4:
+	ldrb	w5, [x0, x3]
 	add	x3, x3, 1
 	add	x6, x1, x3
-	ldrb	w6, [x6,-1]
+	ldrb	w6, [x6, -1]
 	cmp	w6, w5
 	beq	.L2
 	add	w0, w4, 1
-	b	.L3
-.L7:
-	mov	w0, 0
-.L3:
 	ret
 	.size	flash_mem_cmp8, .-flash_mem_cmp8
 	.align	2
@@ -38,25 +37,25 @@ flash_mem_cmp8:
 slc_phy_page_address_calc:
 	adrp	x1, .LANCHOR0
 	add	x2, x1, :lo12:.LANCHOR0
-	ldrb	w3, [x1,#:lo12:.LANCHOR0]
-	cbz	w3, .L9
-	ldrb	w2, [x2,1]
-	cbz	w2, .L10
-.L9:
+	ldrb	w3, [x1, #:lo12:.LANCHOR0]
+	cbz	w3, .L7
+	ldrb	w2, [x2, 1]
+	cbz	w2, .L8
+.L7:
 	add	x1, x1, :lo12:.LANCHOR0
-	ldrh	w3, [x1,2]
+	ldrh	w3, [x1, 2]
 	udiv	w2, w0, w3
 	mul	w2, w2, w3
-	ldrb	w3, [x1,1]
+	ldrb	w3, [x1, 1]
 	sub	w0, w0, w2
-	cbz	w3, .L11
+	cbz	w3, .L9
 	add	w0, w2, w0, lsl 1
-	b	.L10
-.L11:
+	ret
+.L9:
 	add	x1, x1, 4
-	ldrh	w0, [x1,w0,uxtw 1]
+	ldrh	w0, [x1, w0, uxtw 1]
 	add	w0, w0, w2
-.L10:
+.L8:
 	ret
 	.size	slc_phy_page_address_calc, .-slc_phy_page_address_calc
 	.align	2
@@ -64,30 +63,29 @@ slc_phy_page_address_calc:
 	.type	zftl_nandc_get_irq_status, %function
 zftl_nandc_get_irq_status:
 	adrp	x1, .LANCHOR0+1028
-	ldrb	w1, [x1,#:lo12:.LANCHOR0+1028]
+	ldrb	w1, [x1, #:lo12:.LANCHOR0+1028]
 	cmp	w1, 9
-	bne	.L19
-	ldr	w0, [x0,296]
-	b	.L20
-.L19:
-	ldr	w0, [x0,372]
-.L20:
+	bne	.L17
+	ldr	w0, [x0, 296]
+	ret
+.L17:
+	ldr	w0, [x0, 372]
 	ret
 	.size	zftl_nandc_get_irq_status, .-zftl_nandc_get_irq_status
-	.section	.text.unlikely,"ax",%progbits
+	.section	.text.unlikely,"ax",@progbits
 	.align	2
 	.type	isxdigit, %function
 isxdigit:
 	and	w1, w0, -33
-	mov	w2, 1
 	sub	w1, w1, #65
 	cmp	w1, 25
-	bls	.L22
+	bls	.L21
 	sub	w0, w0, #48
 	cmp	w0, 9
-	cset	w2, ls
-.L22:
-	mov	w0, w2
+	cset	w0, ls
+	ret
+.L21:
+	mov	w0, 1
 	ret
 	.size	isxdigit, .-isxdigit
 	.text
@@ -95,133 +93,178 @@ isxdigit:
 	.global	zftl_get_density
 	.type	zftl_get_density, %function
 zftl_get_density:
-	cbnz	w0, .L25
+	cbnz	w0, .L23
 	adrp	x0, .LANCHOR0+1032
-	ldr	w0, [x0,#:lo12:.LANCHOR0+1032]
-	b	.L26
-.L25:
+	ldr	w0, [x0, #:lo12:.LANCHOR0+1032]
+	ret
+.L23:
 	cmp	w0, 4
-	mov	w0, 8192
-	csel	w0, w0, wzr, cc
-.L26:
+	cset	w0, cc
+	lsl	w0, w0, 13
 	ret
 	.size	zftl_get_density, .-zftl_get_density
 	.align	2
 	.type	_list_remove_node, %function
 _list_remove_node:
 	stp	x29, x30, [sp, -64]!
-	uxth	w1, w1
+	and	w1, w1, 65535
 	mov	w4, 6
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR0
 	add	x3, x19, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
 	umull	x21, w1, w4
-	ldr	x23, [x3,1040]
-	mov	w3, 65535
+	mov	w1, 65535
+	ldr	x23, [x3, 1040]
 	add	x20, x23, x21
-	ldrh	w1, [x23,x21]
-	cmp	w1, w3
-	bne	.L29
-	ldrh	w3, [x20,2]
-	cmp	w3, w1
-	bne	.L29
+	ldrh	w4, [x23, x21]
+	ldrh	w3, [x20, 2]
+	cmp	w4, w1
 	ldr	x1, [x0]
+	bne	.L27
+	cmp	w3, w4
+	bne	.L27
 	cmp	x20, x1
-	bne	.L28
-.L29:
-	ldrh	w1, [x20,2]
+	bne	.L26
+.L27:
 	mov	x22, x0
-	mov	w0, 65535
 	mov	x24, x2
-	cmp	w1, w0
-	bne	.L31
-	ldr	x0, [x22]
-	cmp	x20, x0
-	beq	.L31
-	adrp	x0, .LC0
+	mov	w0, 65535
+	cmp	w3, w0
+	bne	.L29
+	cmp	x20, x1
+	beq	.L29
 	adrp	x1, .LANCHOR1
 	add	x1, x1, :lo12:.LANCHOR1
 	mov	w2, 202
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L31:
+.L29:
 	ldr	x0, [x22]
-	mov	w2, 65535
+	ldrh	w3, [x23, x21]
 	cmp	x20, x0
-	bne	.L32
-	ldrh	w1, [x23,x21]
-	cmp	w1, w2
-	bne	.L33
+	mov	w0, 65535
+	bne	.L30
+	cmp	w3, w0
+	bne	.L31
 	str	xzr, [x22]
-	b	.L34
-.L33:
+.L32:
+	mov	w0, -1
+	strh	w0, [x23, x21]
+	strh	w0, [x20, 2]
+	ldrh	w0, [x24]
+	sub	w0, w0, #1
+	strh	w0, [x24]
+.L26:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 64
+	ret
+.L31:
 	add	x19, x19, :lo12:.LANCHOR0
-	mov	w0, 6
-	umull	x1, w1, w0
-	ldr	x0, [x19,1040]
-	add	x1, x0, x1
-	str	x1, [x22]
+	mov	w1, 6
+	ldr	x0, [x19, 1040]
+	umaddl	x3, w3, w1, x0
 	mov	w0, -1
-	strh	w0, [x1,2]
-	b	.L34
-.L32:
-	ldrh	w0, [x23,x21]
-	cmp	w0, w2
-	bne	.L35
-	ldrh	w1, [x20,2]
-	cmp	w1, w0
-	beq	.L34
+	str	x3, [x22]
+	strh	w0, [x3, 2]
+	b	.L32
+.L30:
+	cmp	w3, w0
+	ldrh	w0, [x20, 2]
+	bne	.L33
+	cmp	w0, w3
+	beq	.L32
 	add	x19, x19, :lo12:.LANCHOR0
-	mov	w0, 6
+	mov	w1, 6
 	mov	w2, -1
-	umull	x1, w1, w0
-	ldr	x0, [x19,1040]
-	b	.L36
+	umull	x0, w0, w1
+	ldr	x1, [x19, 1040]
 .L35:
+	strh	w2, [x1, x0]
+	b	.L32
+.L33:
 	add	x19, x19, :lo12:.LANCHOR0
 	mov	w1, 6
-	ldrh	w2, [x20,2]
-	umull	x0, w0, w1
-	ldr	x3, [x19,1040]
-	add	x0, x3, x0
-	strh	w2, [x0,2]
-	ldrh	w0, [x20,2]
-	ldrh	w2, [x23,x21]
+	ldr	x2, [x19, 1040]
+	umaddl	x3, w3, w1, x2
+	strh	w0, [x3, 2]
+	ldrh	w0, [x20, 2]
+	ldrh	w2, [x23, x21]
 	umull	x0, w0, w1
-	ldr	x1, [x19,1040]
-.L36:
-	strh	w2, [x1,x0]
-.L34:
-	mov	w0, -1
-	strh	w0, [x23,x21]
-	strh	w0, [x20,2]
-	ldrh	w0, [x24]
-	sub	w0, w0, #1
-	strh	w0, [x24]
-.L28:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
+	ldr	x1, [x19, 1040]
+	b	.L35
+	.size	_list_remove_node, .-_list_remove_node
+	.align	2
+	.type	hynix_set_rr_para, %function
+hynix_set_rr_para:
+	stp	x29, x30, [sp, -64]!
+	adrp	x3, .LANCHOR0
+	add	x3, x3, :lo12:.LANCHOR0
+	and	w1, w1, 255
+	add	x29, sp, 0
+	stp	x21, x22, [sp, 32]
+	and	w0, w0, 255
+	str	x23, [sp, 48]
+	stp	x19, x20, [sp, 16]
+	ldr	x2, [x3, 1048]
+	ldr	x19, [x3, 1056]
+	add	x23, x2, 128
+	add	x21, x2, 112
+	ldrb	w22, [x2, 113]
+	ldrb	w2, [x2, 112]
+	cmp	w2, 8
+	mov	x2, 32
+	umaddl	x1, w1, w22, x2
+	beq	.L37
+	mov	w2, 160
+	umaddl	x1, w2, w0, x1
+.L37:
+	ubfiz	x0, x0, 8, 8
+	add	x21, x21, x1
+	add	x19, x19, x0
+	mov	x20, 0
+	mov	w0, 54
+	str	w0, [x19, 2056]
+.L39:
+	cmp	w22, w20, uxtb
+	bhi	.L40
+	mov	w0, 22
+	str	w0, [x19, 2056]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldr	x23, [sp, 48]
 	ldp	x29, x30, [sp], 64
 	ret
-	.size	_list_remove_node, .-_list_remove_node
+.L40:
+	ldrb	w0, [x23, x20]
+	str	w0, [x19, 2052]
+	mov	x0, 600
+	bl	__const_udelay
+	ldrsb	w0, [x21, x20]
+	add	x20, x20, 1
+	str	w0, [x19, 2048]
+	b	.L39
+	.size	hynix_set_rr_para, .-hynix_set_rr_para
 	.align	2
 	.type	zftl_debug_proc_open, %function
 zftl_debug_proc_open:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	str	x1, [x29,24]
+	str	x19, [sp, 16]
+	mov	x19, x1
 	bl	PDE_DATA
-	ldr	x1, [x29,24]
 	mov	x2, x0
-	mov	x0, x1
 	adrp	x1, zftl_debug_proc_show
+	mov	x0, x19
 	add	x1, x1, :lo12:zftl_debug_proc_show
 	bl	single_open
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	zftl_debug_proc_open, .-zftl_debug_proc_open
@@ -229,21 +272,21 @@ zftl_debug_proc_open:
 	.type	zftl_debug_proc_show, %function
 zftl_debug_proc_show:
 	stp	x29, x30, [sp, -32]!
-	adrp	x1, .LC1
-	adrp	x2, .LC2
+	adrp	x2, .LC1
+	adrp	x1, .LC2
+	add	x2, x2, :lo12:.LC1
 	add	x29, sp, 0
-	add	x1, x1, :lo12:.LC1
-	add	x2, x2, :lo12:.LC2
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
+	add	x1, x1, :lo12:.LC2
 	mov	x19, x0
 	bl	seq_printf
-	adrp	x2, .LANCHOR2
+	adrp	x0, .LANCHOR2
 	adrp	x1, .LC3
-	mov	x0, x19
 	add	x1, x1, :lo12:.LC3
-	ldr	w2, [x2,#:lo12:.LANCHOR2]
+	ldr	w2, [x0, #:lo12:.LANCHOR2]
+	mov	x0, x19
 	bl	seq_printf
-	ldr	x19, [sp,16]
+	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
 	ret
@@ -254,260 +297,263 @@ zftl_debug_proc_show:
 zftl_flash_suspend:
 	adrp	x0, .LANCHOR0
 	add	x0, x0, :lo12:.LANCHOR0
-	ldrb	w1, [x0,1028]
+	ldrb	w1, [x0, 1028]
 	cmp	w1, 9
-	ldr	x1, [x0,1048]
+	ldr	x1, [x0, 1056]
 	ldr	w2, [x1]
-	str	w2, [x0,1056]
-	ldr	w2, [x1,4]
-	str	w2, [x0,1060]
-	bne	.L40
-	ldr	w2, [x1,16]
-	str	w2, [x0,1064]
-	ldr	w2, [x1,32]
-	str	w2, [x0,1068]
-	ldr	w2, [x1,80]
-	str	w2, [x0,1072]
-	ldr	w2, [x1,84]
-	str	w2, [x0,1076]
-	ldr	w2, [x1,520]
-	str	w2, [x0,1080]
-	ldr	w1, [x1,8]
-	b	.L42
-.L40:
-	ldr	w2, [x1,8]
-	str	w2, [x0,1064]
-	ldr	w2, [x1,12]
-	str	w2, [x0,1068]
-	ldr	w2, [x1,304]
-	str	w2, [x0,1072]
-	ldr	w2, [x1,308]
-	str	w2, [x0,1076]
-	ldr	w2, [x1,336]
-	ldr	w1, [x1,344]
-	str	w2, [x0,1080]
-.L42:
-	str	w1, [x0,1084]
-	ret
+	str	w2, [x0, 1064]
+	ldr	w2, [x1, 4]
+	str	w2, [x0, 1068]
+	bne	.L47
+	ldr	w2, [x1, 16]
+	str	w2, [x0, 1072]
+	ldr	w2, [x1, 32]
+	str	w2, [x0, 1076]
+	ldr	w2, [x1, 80]
+	str	w2, [x0, 1080]
+	ldr	w2, [x1, 84]
+	str	w2, [x0, 1084]
+	ldr	w2, [x1, 520]
+	ldr	w1, [x1, 8]
+	str	w2, [x0, 1088]
+.L49:
+	str	w1, [x0, 1092]
+	ret
+.L47:
+	ldr	w2, [x1, 8]
+	str	w2, [x0, 1072]
+	ldr	w2, [x1, 12]
+	str	w2, [x0, 1076]
+	ldr	w2, [x1, 304]
+	str	w2, [x0, 1080]
+	ldr	w2, [x1, 308]
+	str	w2, [x0, 1084]
+	ldr	w2, [x1, 336]
+	str	w2, [x0, 1088]
+	ldr	w1, [x1, 344]
+	b	.L49
 	.size	zftl_flash_suspend, .-zftl_flash_suspend
 	.align	2
 	.type	nandc_irq_disable, %function
 nandc_irq_disable:
 	adrp	x2, .LANCHOR0+1028
-	ldrb	w2, [x2,#:lo12:.LANCHOR0+1028]
+	ldrb	w2, [x2, #:lo12:.LANCHOR0+1028]
 	cmp	w2, 9
 	mov	x2, 1
-	bne	.L44
-	ldr	w3, [x0,292]
+	bne	.L51
+	ldr	w3, [x0, 292]
 	lsl	x1, x2, x1
 	orr	w2, w3, w1
-	str	w2, [x0,292]
-	ldr	w2, [x0,288]
+	str	w2, [x0, 292]
+	ldr	w2, [x0, 288]
 	bic	w1, w2, w1
-	str	w1, [x0,288]
-	b	.L43
-.L44:
-	ldr	w3, [x0,368]
+	str	w1, [x0, 288]
+	ret
+.L51:
+	ldr	w3, [x0, 368]
 	lsl	x1, x2, x1
 	orr	w2, w3, w1
-	str	w2, [x0,368]
-	ldr	w2, [x0,364]
+	str	w2, [x0, 368]
+	ldr	w2, [x0, 364]
 	bic	w1, w2, w1
-	str	w1, [x0,364]
-.L43:
+	str	w1, [x0, 364]
 	ret
 	.size	nandc_irq_disable, .-nandc_irq_disable
 	.align	2
 	.type	_insert_free_list, %function
 _insert_free_list:
-	adrp	x3, .LANCHOR0
-	uxth	w1, w1
-	add	x6, x3, :lo12:.LANCHOR0
-	mov	x10, x3
-	ldrh	w4, [x6,1088]
+	adrp	x9, .LANCHOR0
+	add	x3, x9, :lo12:.LANCHOR0
+	and	w1, w1, 65535
+	ldrh	w4, [x3, 1096]
 	cmp	w4, w1
-	bls	.L46
-	ldrh	w3, [x2]
-	mov	w7, 6
-	add	w3, w3, 1
-	strh	w3, [x2]
-	umull	x11, w1, w7
-	ldr	x12, [x6,1040]
+	bls	.L53
+	ldrh	w4, [x2]
+	mov	w6, 6
+	add	w4, w4, 1
+	strh	w4, [x2]
+	umull	x10, w1, w6
 	mov	w2, -1
-	add	x5, x12, x11
-	strh	w2, [x5,2]
-	strh	w2, [x12,x11]
+	ldr	x11, [x3, 1040]
+	add	x5, x11, x10
+	strh	w2, [x5, 2]
+	strh	w2, [x11, x10]
 	ldr	x2, [x0]
-	cbz	x2, .L53
-	ldr	x9, [x6,1096]
-	ubfiz	x8, x1, 2, 16
-	ldrh	w13, [x6,1104]
-	mov	w16, 65535
-	ldr	x14, [x6,1040]
-	mov	x6, -6148914691236517206
-	ldr	w4, [x9,x8]
-	ubfx	x3, x4, 11, 8
-	ldrh	w4, [x9,x8]
-	mov	w8, w7
-	ubfx	x4, x4, 0, 11
-	madd	w4, w13, w3, w4
+	cbnz	x2, .L55
+.L60:
+	str	x5, [x0]
+	ret
+.L55:
+	ldr	x8, [x3, 1104]
+	ubfiz	x7, x1, 2, 16
+	ldrh	w13, [x3, 1112]
+	mov	w15, 65535
+	ldr	x14, [x3, 1040]
+	ldr	w4, [x8, x7]
 	sub	x3, x2, x14
+	ldrh	w7, [x8, x7]
 	asr	x3, x3, 1
-	uxth	w4, w4
-	madd	x3, x6, x3, x3
-	uxth	w3, w3
-.L51:
-	ubfiz	x15, x3, 2, 16
-	ldr	w6, [x9,x15]
-	ubfx	x7, x6, 11, 8
-	ldrh	w6, [x9,x15]
-	ubfx	x6, x6, 0, 11
-	madd	w6, w13, w7, w6
+	and	w7, w7, 2047
+	ubfx	x4, x4, 11, 8
+	madd	w4, w13, w4, w7
+	mov	x7, -6148914691236517206
+	movk	x7, 0xaaab, lsl 0
+	and	w4, w4, 65535
+	mul	x3, x3, x7
+	mov	w7, w6
+	and	w3, w3, 65535
+.L58:
+	ubfiz	x12, x3, 2, 16
+	ldr	w6, [x8, x12]
+	ldrh	w12, [x8, x12]
+	ubfx	x6, x6, 11, 8
+	and	w12, w12, 2047
+	madd	w6, w13, w6, w12
 	cmp	w4, w6, uxth
-	bls	.L49
+	bls	.L56
 	ldrh	w6, [x2]
-	cmp	w6, w16
-	bne	.L50
-	strh	w3, [x5,2]
+	cmp	w6, w15
+	bne	.L57
+	strh	w3, [x5, 2]
 	strh	w1, [x2]
-	b	.L46
-.L50:
-	umull	x2, w6, w8
+	ret
+.L57:
+	umaddl	x2, w6, w7, x14
 	mov	w3, w6
-	add	x2, x14, x2
-	b	.L51
-.L49:
-	ldrh	w4, [x2,2]
-	strh	w4, [x5,2]
-	strh	w3, [x12,x11]
+	b	.L58
+.L56:
+	ldrh	w4, [x2, 2]
+	strh	w4, [x5, 2]
+	strh	w3, [x11, x10]
 	ldr	x3, [x0]
 	cmp	x2, x3
-	bne	.L52
-	strh	w1, [x2,2]
-.L53:
-	str	x5, [x0]
-	b	.L46
-.L52:
-	ldrh	w0, [x2,2]
-	add	x3, x10, :lo12:.LANCHOR0
+	bne	.L59
+	strh	w1, [x2, 2]
+	b	.L60
+.L59:
+	ldrh	w0, [x2, 2]
+	add	x3, x9, :lo12:.LANCHOR0
 	mov	w4, 6
-	ldr	x3, [x3,1040]
+	ldr	x3, [x3, 1040]
 	umull	x0, w0, w4
-	strh	w1, [x3,x0]
-	strh	w1, [x2,2]
-.L46:
+	strh	w1, [x3, x0]
+	strh	w1, [x2, 2]
+.L53:
 	ret
 	.size	_insert_free_list, .-_insert_free_list
 	.align	2
 	.type	_insert_data_list, %function
 _insert_data_list:
-	sub	sp, sp, #32
-	adrp	x6, .LANCHOR0
-	add	x10, x6, :lo12:.LANCHOR0
-	uxth	w1, w1
-	stp	x19, x20, [sp]
-	str	x21, [sp,16]
-	ldrh	w3, [x10,1088]
+	adrp	x9, .LANCHOR0
+	add	x5, x9, :lo12:.LANCHOR0
+	and	w1, w1, 65535
+	ldrh	w3, [x5, 1096]
 	cmp	w3, w1
-	bls	.L54
+	bls	.L83
 	ldrh	w3, [x2]
-	mov	w8, 6
+	mov	w11, 6
 	add	w3, w3, 1
 	strh	w3, [x2]
-	umull	x8, w1, w8
-	ldr	x14, [x10,1040]
+	umull	x11, w1, w11
 	mov	w2, -1
-	add	x7, x14, x8
-	strh	w2, [x7,2]
-	strh	w2, [x14,x8]
+	ldr	x13, [x5, 1040]
+	add	x10, x13, x11
+	strh	w2, [x10, 2]
+	strh	w2, [x13, x11]
 	ldr	x2, [x0]
-	cbz	x2, .L72
-	uxtw	x9, w1
-	ldr	x15, [x10,1112]
-	ldr	x13, [x10,1096]
-	ldrh	w11, [x7,4]
-	ldrh	w5, [x15,x9,lsl 1]
-	lsl	x9, x9, 2
-	ldrh	w16, [x10,1104]
-	ldr	w3, [x13,x9]
-	mul	w5, w5, w11
-	ubfx	x4, x3, 11, 8
-	ldrh	w3, [x13,x9]
-	and	w3, w3, 2047
-	cbz	w5, .L58
-	madd	w3, w16, w4, w3
-	add	w5, w5, w3, uxth
-.L58:
-	add	x4, x6, :lo12:.LANCHOR0
-	mov	x9, -6148914691236517206
-	cmp	w11, wzr
-	mov	w21, 65535
-	csinv	w5, w5, wzr, ne
-	mov	w19, 6
-	ldr	x17, [x4,1040]
-	ldrh	w20, [x4,1088]
-	sub	x3, x2, x17
-	asr	x3, x3, 1
-	madd	x3, x9, x3, x3
-	mov	w9, 0
-	uxth	w3, w3
+	cbnz	x2, .L64
+	str	x10, [x0]
+	ret
 .L64:
-	add	w9, w9, 1
+	stp	x29, x30, [sp, -32]!
+	uxtw	x4, w1
+	add	x29, sp, 0
+	str	x19, [sp, 16]
+	ldr	x14, [x5, 1120]
+	ldrh	w6, [x10, 4]
+	ldr	x12, [x5, 1104]
+	ldrh	w15, [x5, 1112]
+	ldrh	w8, [x14, x4, lsl 1]
+	lsl	x4, x4, 2
+	ldr	w3, [x12, x4]
+	mul	w8, w8, w6
+	ldrh	w4, [x12, x4]
+	ubfx	x3, x3, 11, 8
+	and	w4, w4, 2047
+	cbz	w8, .L65
+	madd	w3, w15, w3, w4
+	add	w8, w8, w3, uxth
+.L65:
+	add	x4, x9, :lo12:.LANCHOR0
+	mov	x5, -6148914691236517206
+	movk	x5, 0xaaab, lsl 0
+	cmp	w6, 0
+	csinv	w8, w8, wzr, ne
+	mov	w19, 65535
+	ldr	x16, [x4, 1040]
+	mov	w18, 6
+	ldrh	w30, [x4, 1096]
+	sub	x3, x2, x16
+	asr	x3, x3, 1
+	mul	x3, x3, x5
+	mov	w5, 0
+	and	w3, w3, 65535
+.L71:
+	add	w5, w5, 1
+	and	w5, w5, 65535
+	cmp	w5, w30
+	bhi	.L61
 	cmp	w1, w3
-	uxth	w9, w9
-	beq	.L54
-	cmp	w9, w20
-	bhi	.L54
-	uxtw	x12, w3
-	ldrh	w18, [x2,4]
-	ldrh	w4, [x15,x12,lsl 1]
-	lsl	x12, x12, 2
-	ldr	w10, [x13,x12]
-	mul	w4, w4, w18
-	ubfx	x11, x10, 11, 8
-	ldrh	w10, [x13,x12]
-	and	w10, w10, 2047
-	cbz	w4, .L61
-	madd	w10, w16, w11, w10
-	add	w4, w4, w10, uxth
-.L61:
-	cmp	w4, w5
-	bcs	.L62
-	cbz	w18, .L62
+	beq	.L61
+	uxtw	x7, w3
+	ldrh	w17, [x2, 4]
+	ldrh	w4, [x14, x7, lsl 1]
+	lsl	x7, x7, 2
+	ldr	w6, [x12, x7]
+	mul	w4, w4, w17
+	ldrh	w7, [x12, x7]
+	ubfx	x6, x6, 11, 8
+	and	w7, w7, 2047
+	cbz	w4, .L68
+	madd	w6, w15, w6, w7
+	add	w4, w4, w6, uxth
+.L68:
+	cbz	w17, .L69
+	cmp	w8, w4
+	bls	.L69
 	ldrh	w4, [x2]
-	cmp	w4, w21
-	bne	.L63
-	strh	w3, [x7,2]
+	cmp	w4, w19
+	bne	.L70
+	strh	w3, [x10, 2]
 	strh	w1, [x2]
-	b	.L54
-.L63:
-	umull	x2, w4, w19
+.L61:
+	ldr	x19, [sp, 16]
+	ldp	x29, x30, [sp], 32
+	ret
+.L70:
+	umaddl	x2, w4, w18, x16
 	mov	w3, w4
-	add	x2, x17, x2
-	b	.L64
-.L62:
-	ldrh	w4, [x2,2]
-	strh	w4, [x7,2]
-	strh	w3, [x14,x8]
+	b	.L71
+.L69:
+	ldrh	w4, [x2, 2]
+	strh	w4, [x10, 2]
+	strh	w3, [x13, x11]
 	ldr	x3, [x0]
 	cmp	x2, x3
-	bne	.L65
-	strh	w1, [x2,2]
+	bne	.L72
+	strh	w1, [x2, 2]
+	str	x10, [x0]
+	b	.L61
 .L72:
-	str	x7, [x0]
-	b	.L54
-.L65:
-	ldrh	w0, [x2,2]
-	add	x6, x6, :lo12:.LANCHOR0
+	ldrh	w0, [x2, 2]
+	add	x9, x9, :lo12:.LANCHOR0
 	mov	w3, 6
 	umull	x0, w0, w3
-	ldr	x3, [x6,1040]
-	strh	w1, [x3,x0]
-	strh	w1, [x2,2]
-.L54:
-	ldp	x19, x20, [sp]
-	ldr	x21, [sp,16]
-	add	sp, sp, 32
+	ldr	x3, [x9, 1040]
+	strh	w1, [x3, x0]
+	strh	w1, [x2, 2]
+	b	.L61
+.L83:
 	ret
 	.size	_insert_data_list, .-_insert_data_list
 	.align	2
@@ -515,324 +561,275 @@ _insert_data_list:
 _list_update_data_list:
 	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	uxth	w19, w1
+	stp	x19, x20, [sp, 16]
+	and	w19, w1, 65535
 	adrp	x1, .LANCHOR0
 	add	x4, x1, :lo12:.LANCHOR0
-	str	x25, [sp,64]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	mov	x20, x1
-	ldr	x3, [x4,1120]
-	ldrh	w5, [x3,16]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	str	x25, [sp, 64]
+	ldr	x3, [x4, 1128]
+	ldrh	w5, [x3, 16]
 	cmp	w5, w19
-	beq	.L73
-	ldrh	w1, [x3,48]
+	beq	.L85
+	mov	x20, x1
+	ldrh	w1, [x3, 48]
 	cmp	w1, w19
-	beq	.L73
-	ldrh	w1, [x3,80]
+	beq	.L85
+	ldrh	w1, [x3, 80]
 	cmp	w1, w19
-	beq	.L73
+	beq	.L85
 	mov	w23, 6
-	ldr	x25, [x4,1040]
+	ldr	x25, [x4, 1040]
 	ldr	x1, [x0]
 	umull	x23, w19, w23
 	add	x24, x25, x23
 	cmp	x24, x1
-	beq	.L73
+	beq	.L85
 	mov	x21, x0
-	ldrh	w0, [x24,2]
+	ldrh	w0, [x24, 2]
 	mov	w1, 65535
 	mov	x22, x2
 	cmp	w0, w1
-	bne	.L77
-	ldrh	w1, [x25,x23]
+	bne	.L89
+	ldrh	w1, [x25, x23]
 	cmp	w1, w0
-	bne	.L77
+	bne	.L89
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
-	mov	w2, 273
 	add	x1, x1, 24
+	mov	w2, 273
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L77:
-	ldrh	w3, [x24,2]
+.L89:
+	ldrh	w3, [x24, 2]
 	mov	w0, 65535
 	cmp	w3, w0
-	bne	.L78
-	ldrh	w0, [x25,x23]
+	bne	.L90
+	ldrh	w0, [x25, x23]
 	cmp	w0, w3
-	beq	.L73
-.L78:
+	beq	.L85
+.L90:
 	add	x1, x20, :lo12:.LANCHOR0
-	ubfiz	x0, x19, 1, 16
-	mov	x5, -6148914691236517206
-	ldr	x4, [x1,1112]
-	ldr	x1, [x1,1040]
-	ldrh	w2, [x4,x0]
-	ldrh	w0, [x24,4]
-	cmp	w0, wzr
-	mul	w2, w2, w0
-	mov	w0, 6
-	csinv	w2, w2, wzr, ne
-	umull	x3, w3, w0
-	asr	x0, x3, 1
+	ubfiz	x2, x19, 1, 16
+	ldrh	w4, [x24, 4]
+	mov	x6, -6148914691236517206
+	movk	x6, 0xaaab, lsl 0
+	mov	w5, -1
+	ldr	x0, [x1, 1120]
+	cmp	w4, 0
+	ldr	x1, [x1, 1040]
+	ldrh	w2, [x0, x2]
+	mul	w2, w2, w4
+	mov	w4, 6
+	umull	x3, w3, w4
+	csel	w2, w2, w5, ne
+	asr	x4, x3, 1
 	add	x3, x1, x3
-	madd	x0, x5, x0, x0
-	ldrh	w1, [x3,4]
-	ldrh	w0, [x4,x0,lsl 1]
-	cmp	w1, wzr
+	mul	x4, x4, x6
+	ldrh	w1, [x3, 4]
+	cmp	w1, 0
+	ldrh	w0, [x0, x4, lsl 1]
 	mul	w0, w0, w1
-	csinv	w0, w0, wzr, ne
+	csel	w0, w0, w5, ne
 	cmp	w2, w0
-	bcs	.L73
-	mov	x0, x21
-	mov	w1, w19
+	bcs	.L85
 	mov	x2, x22
-	bl	_list_remove_node
-	mov	x0, x21
 	mov	w1, w19
+	mov	x0, x21
+	bl	_list_remove_node
 	mov	x2, x22
+	mov	w1, w19
+	mov	x0, x21
 	bl	_insert_data_list
-.L73:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldr	x25, [sp,64]
+.L85:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldr	x25, [sp, 64]
 	ldp	x29, x30, [sp], 80
 	ret
 	.size	_list_update_data_list, .-_list_update_data_list
 	.section	.text.unlikely
 	.align	2
-	.type	rk_simple_strtoull.constprop.34, %function
-rk_simple_strtoull.constprop.34:
-	stp	x29, x30, [sp, -64]!
+	.type	rk_simple_strtoull.constprop.33, %function
+rk_simple_strtoull.constprop.33:
+	stp	x29, x30, [sp, -16]!
+	mov	x3, x0
+	mov	x6, x1
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	str	x23, [sp,48]
-	mov	x20, x0
-	stp	x21, x22, [sp,32]
-	mov	x23, x1
 	ldrb	w0, [x0]
 	cmp	w0, 48
-	bne	.L94
-	ldrb	w0, [x20,1]
-	add	x19, x20, 1
-	mov	w21, 8
+	bne	.L107
+	ldrb	w0, [x3, 1]
+	add	x2, x3, 1
 	orr	w0, w0, 32
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 120
-	bne	.L84
-	ldrb	w0, [x20,2]
-	bl	isxdigit
-	cbz	w0, .L84
-	add	x19, x20, 2
-	mov	w21, 16
-	b	.L84
-.L94:
-	mov	x19, x20
-	mov	w21, 10
-.L84:
-	mov	w22, 0
-.L85:
-	ldrb	w20, [x19]
-	mov	w0, w20
+	bne	.L109
+	ldrb	w0, [x3, 2]
 	bl	isxdigit
-	cbnz	w0, .L86
-.L92:
-	cbz	x23, .L98
-	str	x19, [x23]
-	b	.L98
-.L86:
-	sub	w2, w20, #48
-	cmp	w2, 9
-	bhi	.L99
-.L93:
-	cmp	w2, w21
-	bcs	.L92
-	madd	w22, w22, w21, w2
-	add	x19, x19, 1
-	b	.L85
-.L99:
-	orr	w20, w20, 32
-	sub	w2, w20, #87
-	b	.L93
+	cbz	w0, .L109
+	add	x2, x3, 2
+	mov	w4, 16
+.L97:
+	mov	w5, 0
 .L98:
-	mov	w0, w22
-	ldr	x23, [sp,48]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 64
+	ldrb	w3, [x2]
+	mov	w0, w3
+	bl	isxdigit
+	cbnz	w0, .L99
+.L105:
+	cbnz	x6, .L100
+.L96:
+	mov	w0, w5
+	ldp	x29, x30, [sp], 16
 	ret
-	.size	rk_simple_strtoull.constprop.34, .-rk_simple_strtoull.constprop.34
+.L107:
+	mov	x2, x3
+	mov	w4, 10
+	b	.L97
+.L109:
+	mov	w4, 8
+	b	.L97
+.L99:
+	sub	w0, w3, #48
+	cmp	w0, 9
+	bhi	.L110
+.L106:
+	cmp	w0, w4
+	bcs	.L105
+	madd	w5, w5, w4, w0
+	add	x2, x2, 1
+	b	.L98
+.L100:
+	str	x2, [x6]
+	b	.L96
+.L110:
+	orr	w0, w3, 32
+	sub	w0, w0, #87
+	b	.L106
+	.size	rk_simple_strtoull.constprop.33, .-rk_simple_strtoull.constprop.33
 	.text
 	.align	2
-	.type	hynix_set_rr_para, %function
-hynix_set_rr_para:
-	stp	x29, x30, [sp, -64]!
-	adrp	x3, .LANCHOR0
-	uxtb	w1, w1
-	add	x3, x3, :lo12:.LANCHOR0
-	add	x29, sp, 0
-	uxtb	w0, w0
-	stp	x21, x22, [sp,32]
-	str	x23, [sp,48]
-	stp	x19, x20, [sp,16]
-	ldr	x2, [x3,1128]
-	ldr	x19, [x3,1048]
-	add	x23, x2, 128
-	add	x21, x2, 112
-	ldrb	w22, [x2,113]
-	ldrb	w2, [x2,112]
-	mul	w1, w1, w22
-	cmp	w2, 8
-	sxtw	x1, w1
-	beq	.L101
-	sxtw	x2, w0
-	mov	x3, 160
-	madd	x2, x2, x3, x1
-	add	x2, x2, 32
-	add	x21, x21, x2
-	b	.L102
-.L101:
-	add	x1, x1, 32
-	add	x21, x21, x1
-.L102:
-	ubfiz	x0, x0, 8, 8
-	mov	x20, 0
-	add	x19, x19, x0
-	mov	w0, 54
-	str	w0, [x19,2056]
-.L103:
-	cmp	w22, w20, uxtb
-	bls	.L105
-	ldrb	w0, [x23,x20]
-	str	w0, [x19,2052]
-	mov	x0, 600
-	bl	__const_udelay
-	ldrsb	w0, [x21,x20]
-	add	x20, x20, 1
-	str	w0, [x19,2048]
-	b	.L103
-.L105:
-	mov	w0, 22
-	str	w0, [x19,2056]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldr	x23, [sp,48]
-	ldp	x29, x30, [sp], 64
+	.type	nandc_de_cs.constprop.35, %function
+nandc_de_cs.constprop.35:
+	adrp	x0, .LANCHOR0+1056
+	ldr	x1, [x0, #:lo12:.LANCHOR0+1056]
+	ldr	w0, [x1]
+	and	w0, w0, -256
+	and	w0, w0, -131073
+	str	w0, [x1]
 	ret
-	.size	hynix_set_rr_para, .-hynix_set_rr_para
+	.size	nandc_de_cs.constprop.35, .-nandc_de_cs.constprop.35
 	.align	2
 	.global	flash_read_status
 	.type	flash_read_status, %function
 flash_read_status:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	mov	x19, x0
 	mov	w0, 112
-	str	w0, [x19,8]
+	str	w0, [x19, 8]
 	mov	x0, 600
 	bl	__const_udelay
 	ldr	w0, [x19]
-	ldr	x19, [sp,16]
+	ldr	x19, [sp, 16]
+	and	w0, w0, 255
 	ldp	x29, x30, [sp], 32
-	uxtb	w0, w0
 	ret
 	.size	flash_read_status, .-flash_read_status
 	.align	2
 	.global	toshiba_set_rr_para
 	.type	toshiba_set_rr_para, %function
 toshiba_set_rr_para:
-	uxtb	w1, w1
-	mov	w3, 5
+	stp	x29, x30, [sp, -80]!
+	and	w1, w1, 255
 	add	w2, w1, 1
-	stp	x29, x30, [sp, -96]!
-	smull	x3, w2, w3
-	adrp	x2, .LANCHOR1
 	add	x29, sp, 0
-	add	x2, x2, :lo12:.LANCHOR1
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	add	x23, x2, w1, sxtw
-	add	x24, x2, 48
-	add	x21, x2, 96
-	stp	x19, x20, [sp,16]
-	stp	x25, x26, [sp,64]
-	str	x27, [sp,80]
-	mov	x22, x0
-	add	x24, x24, x3
-	add	x21, x21, x3
+	stp	x21, x22, [sp, 32]
+	mov	x21, x0
+	mov	w0, 5
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	adrp	x22, .LANCHOR0
+	umull	x2, w2, w0
+	adrp	x0, .LANCHOR1
+	add	x0, x0, :lo12:.LANCHOR1
+	stp	x19, x20, [sp, 16]
+	add	x25, x0, 48
+	add	x24, x0, 144
+	add	x25, x25, x2
+	add	x24, x24, x2
+	add	x22, x22, :lo12:.LANCHOR0
+	mov	x19, x0
+	add	x23, x0, w1, sxtw
 	mov	x20, 0
-	adrp	x26, .LANCHOR0
-	mov	w27, 85
-	mov	x19, x2
-.L108:
-	add	x25, x26, :lo12:.LANCHOR0
-	ldrb	w0, [x25,1137]
+	mov	w26, 85
+.L116:
+	ldrb	w0, [x22, 1137]
 	cmp	w0, w20
-	bls	.L114
-	add	x0, x19, 48
-	str	w27, [x22,8]
-	ldrsb	w0, [x20,x0]
-	str	w0, [x22,4]
+	bhi	.L120
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	ret
+.L120:
+	add	x0, x19, 144
+	str	w26, [x21, 8]
+	ldrsb	w0, [x20, x0]
+	str	w0, [x21, 4]
 	mov	x0, 1000
 	bl	__const_udelay
-	ldrb	w0, [x25,1136]
+	ldrb	w0, [x22, 1136]
 	cmp	w0, 34
-	bne	.L109
-	ldrsb	w0, [x24,x20]
-	b	.L113
-.L109:
-	cmp	w0, 35
-	bne	.L111
-	ldrsb	w0, [x21,x20]
-	b	.L113
-.L111:
-	ldrsb	w0, [x23,192]
-.L113:
-	str	w0, [x22]
+	bne	.L117
+	ldrsb	w0, [x24, x20]
+.L122:
 	add	x20, x20, 1
-	b	.L108
-.L114:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldr	x27, [sp,80]
-	ldp	x29, x30, [sp], 96
-	ret
+	str	w0, [x21]
+	b	.L116
+.L117:
+	cmp	w0, 35
+	bne	.L119
+	ldrsb	w0, [x25, x20]
+	b	.L122
+.L119:
+	ldrsb	w0, [x23, 192]
+	b	.L122
 	.size	toshiba_set_rr_para, .-toshiba_set_rr_para
 	.align	2
 	.global	hynix_reconfig_rr_para
 	.type	hynix_reconfig_rr_para, %function
 hynix_reconfig_rr_para:
 	stp	x29, x30, [sp, -32]!
-	uxtb	w0, w0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR0
 	add	x19, x19, :lo12:.LANCHOR0
-	ldrb	w1, [x19,1136]
+	ldrb	w1, [x19, 1136]
 	sub	w1, w1, #1
-	uxtb	w1, w1
+	and	w1, w1, 255
 	cmp	w1, 7
-	bhi	.L115
-	ldr	x1, [x19,1128]
+	bhi	.L123
+	and	w0, w0, 255
+	ldr	x1, [x19, 1048]
 	sxtw	x20, w0
 	add	x1, x1, x20
-	ldrb	w1, [x1,120]
-	cbz	w1, .L115
+	ldrb	w1, [x1, 120]
+	cbz	w1, .L123
 	mov	w1, 0
 	bl	hynix_set_rr_para
-	ldr	x0, [x19,1128]
-	add	x20, x0, x20
-	strb	wzr, [x20,120]
-.L115:
-	ldp	x19, x20, [sp,16]
+	ldr	x0, [x19, 1048]
+	add	x0, x0, x20
+	strb	wzr, [x0, 120]
+.L123:
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	hynix_reconfig_rr_para, .-hynix_reconfig_rr_para
@@ -842,440 +839,299 @@ hynix_reconfig_rr_para:
 nand_flash_print_info:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	adrp	x19, .LANCHOR2
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L121
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L130
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC4
 	add	x1, x1, :lo12:.LANCHOR1
-	add	x0, x0, :lo12:.LC4
+	adrp	x0, .LC4
 	add	x1, x1, 200
+	add	x0, x0, :lo12:.LC4
 	bl	printk
-.L121:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L122
+.L130:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L131
 	adrp	x0, .LANCHOR0+1144
-	ldr	x6, [x0,#:lo12:.LANCHOR0+1144]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrb	w6, [x0, 6]
+	ldrb	w5, [x0, 5]
+	ldrb	w4, [x0, 4]
+	ldrb	w3, [x0, 3]
+	ldrb	w2, [x0, 2]
+	ldrb	w1, [x0, 1]
 	adrp	x0, .LC5
 	add	x0, x0, :lo12:.LC5
-	ldrb	w1, [x6,1]
-	ldrb	w2, [x6,2]
-	ldrb	w3, [x6,3]
-	ldrb	w4, [x6,4]
-	ldrb	w5, [x6,5]
-	ldrb	w6, [x6,6]
 	bl	printk
-.L122:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L123
+.L131:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L132
 	adrp	x0, .LANCHOR0+1144
-	ldr	x1, [x0,#:lo12:.LANCHOR0+1144]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrb	w1, [x0, 8]
 	adrp	x0, .LC6
 	add	x0, x0, :lo12:.LC6
-	ldrb	w1, [x1,8]
 	bl	printk
-.L123:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L124
+.L132:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L133
 	adrp	x0, .LANCHOR0+1144
-	ldr	x1, [x0,#:lo12:.LANCHOR0+1144]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrb	w1, [x0, 9]
 	adrp	x0, .LC7
 	add	x0, x0, :lo12:.LC7
-	ldrb	w1, [x1,9]
 	bl	printk
-.L124:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L125
+.L133:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L134
 	adrp	x0, .LANCHOR0+1144
-	ldr	x1, [x0,#:lo12:.LANCHOR0+1144]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrh	w1, [x0, 10]
 	adrp	x0, .LC8
 	add	x0, x0, :lo12:.LC8
-	ldrh	w1, [x1,10]
 	bl	printk
-.L125:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L126
+.L134:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L135
 	adrp	x0, .LANCHOR0+1144
-	ldr	x1, [x0,#:lo12:.LANCHOR0+1144]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrb	w1, [x0, 12]
 	adrp	x0, .LC9
 	add	x0, x0, :lo12:.LC9
-	ldrb	w1, [x1,12]
 	bl	printk
-.L126:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L127
+.L135:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L136
 	adrp	x0, .LANCHOR0+1144
-	ldr	x1, [x0,#:lo12:.LANCHOR0+1144]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrb	w1, [x0, 13]
 	adrp	x0, .LC10
 	add	x0, x0, :lo12:.LC10
-	ldrb	w1, [x1,13]
 	bl	printk
-.L127:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L128
+.L136:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L137
 	adrp	x0, .LANCHOR0+1144
-	ldr	x1, [x0,#:lo12:.LANCHOR0+1144]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrh	w1, [x0, 14]
 	adrp	x0, .LC11
 	add	x0, x0, :lo12:.LC11
-	ldrh	w1, [x1,14]
 	bl	printk
-.L128:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L129
+.L137:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L138
 	adrp	x0, .LANCHOR0+1144
-	ldr	x1, [x0,#:lo12:.LANCHOR0+1144]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrb	w1, [x0, 23]
 	adrp	x0, .LC12
 	add	x0, x0, :lo12:.LC12
-	ldrb	w1, [x1,23]
 	bl	printk
-.L129:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L130
+.L138:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L139
 	adrp	x0, .LANCHOR0+1144
-	ldr	x1, [x0,#:lo12:.LANCHOR0+1144]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrb	w1, [x0, 18]
 	adrp	x0, .LC13
 	add	x0, x0, :lo12:.LC13
-	ldrb	w1, [x1,18]
 	bl	printk
-.L130:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L131
+.L139:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L140
 	adrp	x0, .LANCHOR0+1144
-	ldr	x1, [x0,#:lo12:.LANCHOR0+1144]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrb	w1, [x0, 19]
 	adrp	x0, .LC14
 	add	x0, x0, :lo12:.LC14
-	ldrb	w1, [x1,19]
 	bl	printk
-.L131:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L132
+.L140:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L141
 	adrp	x0, .LANCHOR0+1144
-	ldr	x1, [x0,#:lo12:.LANCHOR0+1144]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrb	w1, [x0, 20]
 	adrp	x0, .LC15
 	add	x0, x0, :lo12:.LC15
-	ldrb	w1, [x1,20]
 	bl	printk
-.L132:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L133
-	adrp	x1, .LANCHOR0+1152
+.L141:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L142
+	adrp	x0, .LANCHOR0+1152
+	ldrb	w1, [x0, #:lo12:.LANCHOR0+1152]
 	adrp	x0, .LC16
 	add	x0, x0, :lo12:.LC16
-	ldrb	w1, [x1,#:lo12:.LANCHOR0+1152]
 	bl	printk
-.L133:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L134
+.L142:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L143
 	adrp	x0, .LANCHOR0+1144
-	ldr	x1, [x0,#:lo12:.LANCHOR0+1144]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrb	w1, [x0, 22]
 	adrp	x0, .LC17
 	add	x0, x0, :lo12:.LC17
-	ldrb	w1, [x1,22]
 	bl	printk
-.L134:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L135
-	adrp	x1, .LANCHOR0+1153
+.L143:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L144
+	adrp	x0, .LANCHOR0+1153
+	ldrb	w1, [x0, #:lo12:.LANCHOR0+1153]
 	adrp	x0, .LC18
 	add	x0, x0, :lo12:.LC18
-	ldrb	w1, [x1,#:lo12:.LANCHOR0+1153]
 	bl	printk
-.L135:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L136
+.L144:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L145
 	adrp	x0, .LANCHOR0+1144
-	ldr	x0, [x0,#:lo12:.LANCHOR0+1144]
-	ldrh	w1, [x0,16]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrb	w1, [x0, 16]
 	adrp	x0, .LC19
 	add	x0, x0, :lo12:.LC19
 	and	w1, w1, 1
 	bl	printk
-.L136:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L137
+.L145:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L146
 	adrp	x0, .LANCHOR0+1144
-	ldr	x0, [x0,#:lo12:.LANCHOR0+1144]
-	ldrh	w1, [x0,16]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrh	w1, [x0, 16]
 	adrp	x0, .LC20
 	add	x0, x0, :lo12:.LC20
 	ubfx	x1, x1, 1, 1
 	bl	printk
-.L137:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L138
+.L146:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L147
 	adrp	x0, .LANCHOR0+1144
-	ldr	x0, [x0,#:lo12:.LANCHOR0+1144]
-	ldrh	w1, [x0,16]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrh	w1, [x0, 16]
 	adrp	x0, .LC21
 	add	x0, x0, :lo12:.LC21
 	ubfx	x1, x1, 2, 1
 	bl	printk
-.L138:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L139
+.L147:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L148
 	adrp	x0, .LANCHOR0+1144
-	ldr	x0, [x0,#:lo12:.LANCHOR0+1144]
-	ldrh	w1, [x0,16]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrh	w1, [x0, 16]
 	adrp	x0, .LC22
 	add	x0, x0, :lo12:.LC22
 	ubfx	x1, x1, 3, 1
 	bl	printk
-.L139:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L140
+.L148:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L149
 	adrp	x0, .LANCHOR0+1144
-	ldr	x0, [x0,#:lo12:.LANCHOR0+1144]
-	ldrh	w1, [x0,16]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrh	w1, [x0, 16]
 	adrp	x0, .LC23
 	add	x0, x0, :lo12:.LC23
 	ubfx	x1, x1, 4, 1
 	bl	printk
-.L140:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L141
+.L149:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L150
 	adrp	x0, .LANCHOR0+1144
-	ldr	x0, [x0,#:lo12:.LANCHOR0+1144]
-	ldrh	w1, [x0,16]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrh	w1, [x0, 16]
 	adrp	x0, .LC24
 	add	x0, x0, :lo12:.LC24
 	ubfx	x1, x1, 5, 1
 	bl	printk
-.L141:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L142
+.L150:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L151
 	adrp	x0, .LANCHOR0+1144
-	ldr	x0, [x0,#:lo12:.LANCHOR0+1144]
-	ldrh	w1, [x0,16]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrh	w1, [x0, 16]
 	adrp	x0, .LC25
 	add	x0, x0, :lo12:.LC25
 	ubfx	x1, x1, 6, 1
 	bl	printk
-.L142:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L143
+.L151:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L152
 	adrp	x0, .LANCHOR0+1144
-	ldr	x0, [x0,#:lo12:.LANCHOR0+1144]
-	ldrh	w1, [x0,16]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrh	w1, [x0, 16]
 	adrp	x0, .LC26
 	add	x0, x0, :lo12:.LC26
 	ubfx	x1, x1, 7, 1
 	bl	printk
-.L143:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L144
+.L152:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L153
 	adrp	x0, .LANCHOR0+1144
-	ldr	x0, [x0,#:lo12:.LANCHOR0+1144]
-	ldrb	w1, [x0,17]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrb	w1, [x0, 17]
 	adrp	x0, .LC27
 	add	x0, x0, :lo12:.LC27
 	and	w1, w1, 1
 	bl	printk
-.L144:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L145
+.L153:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L154
 	adrp	x0, .LANCHOR0+1144
-	ldr	x0, [x0,#:lo12:.LANCHOR0+1144]
-	ldrh	w1, [x0,16]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrh	w1, [x0, 16]
 	adrp	x0, .LC28
 	add	x0, x0, :lo12:.LC28
 	ubfx	x1, x1, 9, 1
 	bl	printk
-.L145:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L146
+.L154:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L155
 	adrp	x0, .LANCHOR0+1144
-	ldr	x0, [x0,#:lo12:.LANCHOR0+1144]
-	ldrh	w1, [x0,16]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1144]
+	ldrh	w1, [x0, 16]
 	adrp	x0, .LC29
 	add	x0, x0, :lo12:.LC29
 	ubfx	x1, x1, 10, 1
 	bl	printk
-.L146:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L147
-	adrp	x1, .LANCHOR0
+.L155:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L156
+	adrp	x0, .LANCHOR0
+	add	x1, x0, :lo12:.LANCHOR0
+	ldrb	w2, [x1, 1154]
+	ldrb	w1, [x0, #:lo12:.LANCHOR0]
 	adrp	x0, .LC30
-	add	x2, x1, :lo12:.LANCHOR0
 	add	x0, x0, :lo12:.LC30
-	ldrb	w1, [x1,#:lo12:.LANCHOR0]
-	ldrb	w2, [x2,1154]
 	bl	printk
-.L147:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L148
-	adrp	x2, .LANCHOR0
+.L156:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L157
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	ldrb	w2, [x0, 1171]
+	ldrb	w1, [x0, 1170]
 	adrp	x0, .LC31
-	add	x2, x2, :lo12:.LANCHOR0
 	add	x0, x0, :lo12:.LC31
-	add	x2, x2, 1160
-	ldrb	w1, [x2,10]
-	ldrb	w2, [x2,11]
 	bl	printk
-.L148:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L149
-	adrp	x2, .LANCHOR0
+.L157:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L158
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	ldrb	w2, [x0, 1169]
+	ldrb	w1, [x0, 1168]
 	adrp	x0, .LC32
-	add	x2, x2, :lo12:.LANCHOR0
 	add	x0, x0, :lo12:.LC32
-	add	x2, x2, 1160
-	ldrb	w1, [x2,8]
-	ldrb	w2, [x2,9]
 	bl	printk
-.L149:
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L120
-	adrp	x1, .LANCHOR0+1192
+.L158:
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L129
+	adrp	x0, .LANCHOR0+1192
+	ldrb	w1, [x0, #:lo12:.LANCHOR0+1192]
 	adrp	x0, .LC33
 	add	x0, x0, :lo12:.LC33
-	ldrb	w1, [x1,#:lo12:.LANCHOR0+1192]
 	bl	printk
-.L120:
-	ldr	x19, [sp,16]
+.L129:
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	nand_flash_print_info, .-nand_flash_print_info
 	.align	2
-	.global	nandc_init
-	.type	nandc_init, %function
-nandc_init:
-	stp	x29, x30, [sp, -64]!
-	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	adrp	x21, .LANCHOR2
-	mov	x22, x0
-	stp	x19, x20, [sp,16]
-	str	wzr, [x29,56]
-	ldr	w0, [x21,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L242
-	adrp	x1, .LANCHOR1
-	adrp	x0, .LC34
-	add	x1, x1, :lo12:.LANCHOR1
-	add	x0, x0, :lo12:.LC34
-	add	x1, x1, 224
-	mov	x2, x22
-	bl	printk
-.L242:
-	adrp	x1, .LANCHOR0
-	mov	w2, 6
-	add	x0, x1, :lo12:.LANCHOR0
-	ldr	w3, [x22,352]
-	mov	x20, x1
-	strb	w2, [x0,1028]
-	mov	w2, 12336
-	movk	w2, 0x5638, lsl 16
-	str	x22, [x0,1048]
-	cmp	w3, w2
-	bne	.L243
-	mov	w1, 8
-	strb	w1, [x0,1028]
-.L243:
-	ldr	w1, [x22,128]
-	mov	w0, 12336
-	movk	w0, 0x5639, lsl 16
-	cmp	w1, w0
-	bne	.L244
-	add	x0, x20, :lo12:.LANCHOR0
-	mov	w1, 9
-	strb	w1, [x0,1028]
-.L244:
-	add	x19, x20, :lo12:.LANCHOR0
-	ldrb	w0, [x19,1028]
-	cmp	w0, 9
-	bne	.L245
-	mov	w0, 1
-	strb	w0, [x19,1193]
-	ldr	w0, [x29,56]
-	mov	w1, 2
-	orr	w0, w0, 256
-	str	w0, [x29,56]
-	ldr	w0, [x29,56]
-	bfi	w0, w1, 18, 3
-	str	w0, [x29,56]
-	mov	w1, 4161
-	ldr	w0, [x29,56]
-	str	w0, [x22]
-	ldr	x0, [x19,1048]
-	str	wzr, [x0,520]
-	str	w1, [x0,4]
-	mov	w1, 8321
-	ldr	x0, [x19,1048]
-	str	w1, [x0,8]
-	mov	w1, 4099
-	movk	w1, 0x10, lsl 16
-	str	w1, [x0,80]
-	mov	w1, 38
-	str	w1, [x0,84]
-	mov	w1, 39
-	str	w1, [x0,84]
-	ldr	w1, [x21,#:lo12:.LANCHOR2]
-	tbz	x1, 12, .L247
-	ldr	w1, [x0]
-	ldr	w2, [x0,8]
-	ldr	w3, [x0,80]
-	ldr	w4, [x0,84]
-	ldr	w5, [x0,88]
-	b	.L259
-.L245:
-	ldr	w0, [x29,56]
-	mov	w1, 1
-	strb	wzr, [x19,1193]
-	orr	w0, w0, 256
-	str	w0, [x29,56]
-	ldr	w0, [x29,56]
-	bfi	w0, w1, 24, 3
-	str	w0, [x29,56]
-	mov	w1, 4193
-	ldr	w0, [x29,56]
-	str	w0, [x22]
-	ldr	x0, [x19,1048]
-	str	wzr, [x0,336]
-	str	w1, [x0,4]
-	mov	w1, 8321
-	ldr	x0, [x19,1048]
-	str	w1, [x0,344]
-	mov	w1, 4099
-	movk	w1, 0x10, lsl 16
-	str	w1, [x0,304]
-	mov	w1, 38
-	str	w1, [x0,308]
-	mov	w1, 39
-	str	w1, [x0,308]
-	mov	w0, 2048
-	bl	ftl_malloc
-	str	x0, [x19,1200]
-	ldr	w0, [x21,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L247
-	ldr	x0, [x19,1048]
-	ldr	w1, [x0]
-	ldr	w2, [x0,344]
-	ldr	w3, [x0,304]
-	ldr	w4, [x0,308]
-	ldr	w5, [x0,312]
-.L259:
-	adrp	x0, .LC35
-	add	x0, x0, :lo12:.LC35
-	bl	printk
-.L247:
-	add	x1, x20, :lo12:.LANCHOR0
-	mov	w0, 1
-	strb	w0, [x1,1240]
-	ldr	w0, [x21,#:lo12:.LANCHOR2]
-	strh	wzr, [x1,1242]
-	strb	wzr, [x1,1244]
-	tbz	x0, 12, .L241
-	adrp	x0, .LC36
-	ldrb	w1, [x1,1028]
-	add	x0, x0, :lo12:.LC36
-	bl	printk
-.L241:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 64
-	ret
-	.size	nandc_init, .-nandc_init
-	.align	2
 	.global	timer_delay_ns
 	.type	timer_delay_ns, %function
 timer_delay_ns:
@@ -1290,22 +1146,21 @@ timer_delay_ns:
 	.global	nandc_set_ddr_para
 	.type	nandc_set_ddr_para, %function
 nandc_set_ddr_para:
-	adrp	x1, .LANCHOR0
-	uxtb	w0, w0
-	add	x1, x1, :lo12:.LANCHOR0
-	ldrb	w2, [x1,1028]
-	ldr	x1, [x1,1048]
-	cmp	w2, 9
-	lsl	w2, w0, 16
+	adrp	x2, .LANCHOR0
+	add	x2, x2, :lo12:.LANCHOR0
+	and	w0, w0, 255
+	ldrb	w1, [x2, 1028]
+	ldr	x2, [x2, 1056]
+	cmp	w1, 9
+	lsl	w1, w0, 16
 	lsl	w0, w0, 8
-	orr	w0, w2, w0
-	orr	w0, w0, 3
-	bne	.L262
-	str	w0, [x1,80]
-	b	.L261
-.L262:
-	str	w0, [x1,304]
-.L261:
+	orr	w1, w1, w0
+	orr	w1, w1, 3
+	bne	.L254
+	str	w1, [x2, 80]
+	ret
+.L254:
+	str	w1, [x2, 304]
 	ret
 	.size	nandc_set_ddr_para, .-nandc_set_ddr_para
 	.align	2
@@ -1314,163 +1169,143 @@ nandc_set_ddr_para:
 nandc_get_ddr_para:
 	adrp	x0, .LANCHOR0
 	add	x0, x0, :lo12:.LANCHOR0
-	ldrb	w1, [x0,1028]
-	ldr	x0, [x0,1048]
+	ldrb	w1, [x0, 1028]
+	ldr	x0, [x0, 1056]
 	cmp	w1, 9
-	bne	.L265
-	ldr	w0, [x0,80]
-	b	.L267
-.L265:
-	ldr	w0, [x0,304]
-.L267:
+	bne	.L257
+	ldr	w0, [x0, 80]
+.L259:
 	ubfx	x0, x0, 8, 8
 	ret
+.L257:
+	ldr	w0, [x0, 304]
+	b	.L259
 	.size	nandc_get_ddr_para, .-nandc_get_ddr_para
 	.align	2
 	.global	nandc_set_if_mode
 	.type	nandc_set_if_mode, %function
 nandc_set_if_mode:
 	adrp	x3, .LANCHOR0
-	uxtb	w0, w0
 	add	x3, x3, :lo12:.LANCHOR0
+	and	w0, w0, 255
 	tst	w0, 6
-	ldr	x2, [x3,1048]
+	ldr	x2, [x3, 1056]
 	ldr	w1, [x2]
-	beq	.L269
+	beq	.L261
 	orr	w1, w1, 24576
-	and	w0, w0, 4
+	tst	x0, 4
 	and	w1, w1, -32769
-	cmp	w0, wzr
+	ldrb	w0, [x3, 1028]
 	orr	w1, w1, 196608
-	ldrb	w0, [x3,1028]
+	mov	w3, 8321
 	orr	w4, w1, 32768
 	csel	w1, w4, w1, ne
 	cmp	w0, 9
-	mov	w0, 8321
-	bne	.L271
-	str	w0, [x2,8]
 	mov	w0, 4099
 	movk	w0, 0x10, lsl 16
-	str	w0, [x2,80]
+	bne	.L263
+	str	w3, [x2, 8]
+	str	w0, [x2, 80]
 	mov	w0, 38
-	str	w0, [x2,84]
+	str	w0, [x2, 84]
 	mov	w0, 39
-	str	w0, [x2,84]
-	b	.L272
-.L271:
-	str	w0, [x2,344]
-	mov	w0, 4099
-	movk	w0, 0x10, lsl 16
-	str	w0, [x2,304]
+	str	w0, [x2, 84]
+.L264:
+	str	w1, [x2]
+	ret
+.L263:
+	str	w3, [x2, 344]
+	str	w0, [x2, 304]
 	mov	w0, 38
-	str	w0, [x2,308]
+	str	w0, [x2, 308]
 	mov	w0, 39
-	str	w0, [x2,308]
-	b	.L272
-.L269:
+	str	w0, [x2, 308]
+	b	.L264
+.L261:
 	and	w1, w1, -8193
-.L272:
-	str	w1, [x2]
-	ret
+	b	.L264
 	.size	nandc_set_if_mode, .-nandc_set_if_mode
 	.align	2
 	.global	nandc_cs
 	.type	nandc_cs, %function
 nandc_cs:
-	adrp	x1, .LANCHOR0+1048
+	adrp	x1, .LANCHOR0+1056
 	mov	w2, 1
 	lsl	w0, w2, w0
-	ldr	x3, [x1,#:lo12:.LANCHOR0+1048]
+	ldr	x3, [x1, #:lo12:.LANCHOR0+1056]
 	ldr	w1, [x3]
 	bfi	w1, w0, 0, 8
 	str	w1, [x3]
 	ret
 	.size	nandc_cs, .-nandc_cs
 	.align	2
-	.global	nandc_de_cs
-	.type	nandc_de_cs, %function
-nandc_de_cs:
-	adrp	x0, .LANCHOR0+1048
-	ldr	x1, [x0,#:lo12:.LANCHOR0+1048]
-	ldr	w0, [x1]
-	and	w0, w0, -256
-	and	w0, w0, -131073
-	str	w0, [x1]
-	ret
-	.size	nandc_de_cs, .-nandc_de_cs
-	.align	2
 	.global	flash_wait_device_ready_raw
 	.type	flash_wait_device_ready_raw, %function
 flash_wait_device_ready_raw:
-	stp	x29, x30, [sp, -112]!
+	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR0
-	mov	w19, w1
-	stp	x21, x22, [sp,32]
-	uxtb	w21, w0
-	add	x0, x20, :lo12:.LANCHOR0
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	mov	w22, w2
-	ldrb	w0, [x0,1153]
-	cmp	w0, w21
-	bhi	.L278
+	stp	x19, x20, [sp, 16]
+	and	w20, w0, 255
+	stp	x23, x24, [sp, 48]
+	mov	w24, w2
+	adrp	x2, .LANCHOR0
+	add	x0, x2, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	mov	x19, x2
+	stp	x25, x26, [sp, 64]
+	mov	w21, w1
+	str	x27, [sp, 80]
+	ldrb	w0, [x0, 1153]
+	cmp	w0, w20
+	bhi	.L269
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 224
 	mov	w2, 812
-	add	x1, x1, 240
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L278:
-	add	x0, x20, :lo12:.LANCHOR0
-	add	x21, x0, w21, sxtw
-	ldrb	w21, [x21,1248]
-	lsr	w23, w19, 8
-	lsr	w24, w19, 16
-	lsr	w25, w19, 24
-	ldr	x26, [x0,1048]
-	ubfiz	x27, x21, 8, 8
-	mov	w28, 120
-	and	w19, w19, 255
-.L283:
-	mov	w0, w21
+.L269:
+	add	x2, x19, :lo12:.LANCHOR0
+	lsr	w23, w21, 8
+	add	x20, x2, w20, sxtw
+	lsr	w25, w21, 16
+	lsr	w26, w21, 24
+	and	w21, w21, 255
+	ldr	x19, [x2, 1056]
+	mov	w27, 120
+	ldrb	w22, [x20, 1196]
+	mov	x20, x2
+	ubfiz	x0, x22, 8, 8
+	add	x19, x19, x0
+.L275:
+	mov	w0, w22
 	bl	nandc_cs
-	add	x1, x26, x27
-	add	x0, x20, :lo12:.LANCHOR0
-	str	w28, [x1,2056]
-	str	w19, [x1,2052]
-	str	w23, [x1,2052]
-	ldrb	w0, [x0,1256]
-	str	w24, [x1,2052]
-	cbz	w0, .L279
-	str	w25, [x1,2052]
-.L279:
+	str	w27, [x19, 2056]
+	str	w21, [x19, 2052]
+	ldrb	w0, [x20, 1204]
+	str	w23, [x19, 2052]
+	str	w25, [x19, 2052]
+	cbz	w0, .L270
+	str	w26, [x19, 2052]
+.L270:
 	mov	x0, 600
-	str	x1, [x29,104]
 	bl	__const_udelay
-	ldr	x1, [x29,104]
-	mov	w0, w21
-	ldr	w1, [x1,2048]
-	and	w1, w1, 255
-	str	x1, [x29,104]
-	bl	nandc_de_cs
-	ldr	x1, [x29,104]
-	and	w0, w22, w1
-	cmp	w0, w22
-	bne	.L283
-	cmp	w1, 255
-	beq	.L283
-	mov	w0, w1
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 112
+	ldr	w2, [x19, 2048]
+	and	w2, w2, 255
+	bl	nandc_de_cs.constprop.35
+	bics	wzr, w24, w2
+	bne	.L275
+	cmp	w2, 255
+	beq	.L275
+	mov	w0, w2
+	ldr	x27, [sp, 80]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 96
 	ret
 	.size	flash_wait_device_ready_raw, .-flash_wait_device_ready_raw
 	.align	2
@@ -1478,77 +1313,89 @@ flash_wait_device_ready_raw:
 	.type	flash_wait_device_ready, %function
 flash_wait_device_ready:
 	adrp	x4, .LANCHOR0
-	mov	w5, 24
 	add	x7, x4, :lo12:.LANCHOR0
-	mov	w6, 1
 	stp	x29, x30, [sp, -16]!
+	mov	w6, 24
+	mov	w5, 1
 	mov	w2, w1
 	add	x29, sp, 0
-	ldrb	w8, [x7,1257]
-	sub	w5, w5, w8
-	lsl	w3, w6, w5
-	lsl	w6, w6, w8
-	asr	w5, w0, w5
+	ldrb	w8, [x7, 1205]
+	tst	x0, 50331648
+	sub	w6, w6, w8
+	lsl	w3, w5, w6
 	sub	w3, w3, #1
-	sub	w6, w6, #1
+	lsl	w5, w5, w8
+	sub	w5, w5, #1
+	asr	w6, w0, w6
+	and	w5, w5, w6
 	and	w1, w3, w0
-	and	w5, w6, w5
-	ubfx	x0, x0, 24, 2
-	uxtb	w5, w5
-	cbnz	w0, .L286
-	ldrb	w0, [x4,#:lo12:.LANCHOR0]
-	cbz	w0, .L287
-	ldrb	w0, [x7,1]
-	cbz	w0, .L286
-.L287:
+	and	w5, w5, 255
+	bne	.L280
+	ldrb	w0, [x4, #:lo12:.LANCHOR0]
+	cbz	w0, .L281
+	ldrb	w0, [x7, 1]
+	cbz	w0, .L280
+.L281:
 	add	x4, x4, :lo12:.LANCHOR0
-	ldrh	w3, [x4,2]
+	ldrh	w3, [x4, 2]
 	udiv	w0, w1, w3
 	mul	w0, w0, w3
 	sub	w3, w1, w0
-	ldrb	w1, [x4,1]
-	cbz	w1, .L288
+	ldrb	w1, [x4, 1]
+	cbz	w1, .L282
 	add	w1, w0, w3, lsl 1
-	b	.L286
-.L288:
-	add	x4, x4, 4
-	ldrh	w3, [x4,w3,uxtw 1]
-	add	w1, w3, w0
-.L286:
+.L280:
 	mov	w0, w5
 	bl	flash_wait_device_ready_raw
 	ldp	x29, x30, [sp], 16
 	ret
+.L282:
+	add	x4, x4, 4
+	ldrh	w3, [x4, w3, uxtw 1]
+	add	w1, w3, w0
+	b	.L280
 	.size	flash_wait_device_ready, .-flash_wait_device_ready
 	.align	2
+	.global	nandc_de_cs
+	.type	nandc_de_cs, %function
+nandc_de_cs:
+	adrp	x0, .LANCHOR0+1056
+	ldr	x1, [x0, #:lo12:.LANCHOR0+1056]
+	ldr	w0, [x1]
+	and	w0, w0, -256
+	and	w0, w0, -131073
+	str	w0, [x1]
+	ret
+	.size	nandc_de_cs, .-nandc_de_cs
+	.align	2
 	.global	nandc_wait_flash_ready_no_delay
 	.type	nandc_wait_flash_ready_no_delay, %function
 nandc_wait_flash_ready_no_delay:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	w19, 34464
 	adrp	x20, .LANCHOR0
+	add	x20, x20, :lo12:.LANCHOR0
 	movk	w19, 0x1, lsl 16
-.L297:
-	add	x0, x20, :lo12:.LANCHOR0
-	ldr	x0, [x0,1048]
+.L293:
+	ldr	x0, [x20, 1056]
 	ldr	w0, [x0]
-	str	w0, [x29,40]
-	ldr	w0, [x29,40]
-	tbnz	x0, 9, .L298
+	str	w0, [x29, 40]
+	ldr	w0, [x29, 40]
+	tbnz	x0, 9, .L294
 	mov	x0, 50
 	bl	__const_udelay
 	subs	w19, w19, #1
-	bne	.L297
+	bne	.L293
 	mov	w0, -1
-	b	.L296
-.L298:
-	mov	w0, 0
-.L296:
-	ldp	x19, x20, [sp,16]
+.L291:
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
+.L294:
+	mov	w0, 0
+	b	.L291
 	.size	nandc_wait_flash_ready_no_delay, .-nandc_wait_flash_ready_no_delay
 	.align	2
 	.global	zftl_flash_enter_slc_mode
@@ -1557,74 +1404,71 @@ zftl_flash_enter_slc_mode:
 	stp	x29, x30, [sp, -48]!
 	adrp	x1, .LANCHOR0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	uxtb	x20, w0
+	stp	x19, x20, [sp, 16]
+	and	x19, x0, 255
 	add	x0, x1, :lo12:.LANCHOR0
-	ldrb	w1, [x1,#:lo12:.LANCHOR0]
-	str	x21, [sp,32]
-	cbz	w1, .L300
+	ldrb	w1, [x1, #:lo12:.LANCHOR0]
+	str	x21, [sp, 32]
+	cbz	w1, .L297
 	cmp	w1, 1
-	ldr	x19, [x0,1048]
-	bne	.L303
+	ldr	x20, [x0, 1056]
+	bne	.L300
 	adrp	x0, .LANCHOR2+37
-	ldrb	w1, [x0,#:lo12:.LANCHOR2+37]
-	cbz	w1, .L300
-	sxtw	x0, w20
-	add	x0, x0, 8
-	add	x20, x19, x0, lsl 8
-	str	w1, [x20,8]
-	b	.L300
-.L303:
+	ldrb	w0, [x0, #:lo12:.LANCHOR2+37]
+	cbz	w0, .L297
+.L316:
+	add	x19, x19, 8
+	add	x19, x20, x19, lsl 8
+	str	w0, [x19, 8]
+.L297:
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	ret
+.L300:
 	cmp	w1, 2
-	bne	.L305
-	add	x0, x0, x20
-	ldrb	w1, [x0,1264]
-	cbz	w1, .L300
+	bne	.L302
+	add	x0, x0, x19
+	ldrb	w1, [x0, 1208]
+	cbz	w1, .L297
 	adrp	x21, .LANCHOR2
-	strb	wzr, [x0,1264]
 	add	x21, x21, :lo12:.LANCHOR2
+	strb	wzr, [x0, 1208]
 	add	x21, x21, 8
-	ldrb	w0, [x21,29]
-	cbz	w0, .L300
-	add	x20, x20, 8
+	ldrb	w0, [x21, 29]
+	cbz	w0, .L297
 	bl	nandc_wait_flash_ready_no_delay
-	ldrb	w0, [x21,29]
-	add	x20, x19, x20, lsl 8
-	str	w0, [x20,8]
-	b	.L300
-.L305:
+	ldrb	w0, [x21, 29]
+	b	.L316
+.L302:
 	cmp	w1, 3
-	bne	.L300
-	add	x21, x0, w20, sxtw
-	ldrb	w0, [x21,1264]
-	cbz	w0, .L300
+	bne	.L297
+	add	x21, x0, w19, sxtw
+	ldrb	w0, [x21, 1208]
+	cbz	w0, .L297
+	ubfiz	x19, x19, 8, 8
 	bl	nandc_wait_flash_ready_no_delay
-	strb	wzr, [x21,1264]
-	ubfiz	x0, x20, 8, 8
-	add	x19, x19, x0
+	add	x19, x20, x19
 	mov	w0, 239
-	str	w0, [x19,2056]
+	strb	wzr, [x21, 1208]
+	str	w0, [x19, 2056]
 	mov	w0, 145
-	str	w0, [x19,2052]
+	str	w0, [x19, 2052]
 	mov	x0, 500
 	bl	__const_udelay
-	str	wzr, [x19,2048]
+	str	wzr, [x19, 2048]
 	mov	w0, 1
-	str	w0, [x19,2048]
-	str	wzr, [x19,2048]
+	str	w0, [x19, 2048]
+	str	wzr, [x19, 2048]
 	mov	x0, 750
-	str	wzr, [x19,2048]
+	str	wzr, [x19, 2048]
 	bl	__const_udelay
 	bl	nandc_wait_flash_ready_no_delay
 	mov	w0, 218
-	str	w0, [x19,2056]
+	str	w0, [x19, 2056]
 	mov	x0, 250
 	bl	__const_udelay
-.L300:
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
-	ldp	x29, x30, [sp], 48
-	ret
+	b	.L297
 	.size	zftl_flash_enter_slc_mode, .-zftl_flash_enter_slc_mode
 	.align	2
 	.global	zftl_flash_exit_slc_mode
@@ -1632,210 +1476,204 @@ zftl_flash_enter_slc_mode:
 zftl_flash_exit_slc_mode:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	uxtb	x20, w0
+	stp	x19, x20, [sp, 16]
+	and	x19, x0, 255
 	adrp	x0, .LANCHOR0
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	add	x21, x0, :lo12:.LANCHOR0
-	ldrb	w0, [x0,#:lo12:.LANCHOR0]
-	cbz	w0, .L318
+	ldrb	w0, [x0, #:lo12:.LANCHOR0]
+	cbz	w0, .L317
 	cmp	w0, 1
-	ldr	x19, [x21,1048]
-	bne	.L321
+	ldr	x20, [x21, 1056]
+	bne	.L320
 	adrp	x0, .LANCHOR2+38
-	ldrb	w1, [x0,#:lo12:.LANCHOR2+38]
-	cbz	w1, .L318
-	sxtw	x0, w20
-	add	x0, x0, 8
-	add	x20, x19, x0, lsl 8
-	str	w1, [x20,8]
-	b	.L318
-.L321:
+	ldrb	w0, [x0, #:lo12:.LANCHOR2+38]
+	cbz	w0, .L317
+.L338:
+	add	x19, x19, 8
+	add	x19, x20, x19, lsl 8
+	str	w0, [x19, 8]
+.L317:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	ret
+.L320:
 	cmp	w0, 2
-	bne	.L323
-	add	x21, x21, x20
-	ldrb	w0, [x21,1264]
-	cbnz	w0, .L318
+	bne	.L322
+	add	x21, x21, x19
+	ldrb	w0, [x21, 1208]
+	cbnz	w0, .L317
 	adrp	x22, .LANCHOR2
-	mov	w1, 4
 	add	x22, x22, :lo12:.LANCHOR2
+	mov	w1, 4
 	add	x22, x22, 8
-	ldrb	w0, [x22,12]
+	ldrb	w0, [x22, 12]
 	cmp	w0, 2
 	csel	w0, w0, w1, eq
-	strb	w0, [x21,1264]
-	ldrb	w0, [x22,30]
-	cbz	w0, .L318
-	add	x20, x20, 8
+	strb	w0, [x21, 1208]
+	ldrb	w0, [x22, 30]
+	cbz	w0, .L317
 	bl	nandc_wait_flash_ready_no_delay
-	ldrb	w0, [x22,30]
-	add	x20, x19, x20, lsl 8
-	str	w0, [x20,8]
-	b	.L318
-.L323:
+	ldrb	w0, [x22, 30]
+	b	.L338
+.L322:
 	cmp	w0, 3
-	bne	.L318
-	add	x21, x21, w20, sxtw
-	ldrb	w0, [x21,1264]
-	cbnz	w0, .L318
+	bne	.L317
+	add	x21, x21, w19, sxtw
+	ldrb	w0, [x21, 1208]
+	cbnz	w0, .L317
 	adrp	x22, .LANCHOR2
-	bl	nandc_wait_flash_ready_no_delay
 	add	x22, x22, :lo12:.LANCHOR2
+	bl	nandc_wait_flash_ready_no_delay
+	ubfiz	x19, x19, 8, 8
+	add	x19, x20, x19
 	mov	w1, 4
-	ldrb	w0, [x22,20]
+	ldrb	w0, [x22, 20]
 	cmp	w0, 2
 	csel	w0, w0, w1, eq
-	strb	w0, [x21,1264]
-	ubfiz	x0, x20, 8, 8
-	add	x19, x19, x0
+	strb	w0, [x21, 1208]
 	mov	w0, 239
-	str	w0, [x19,2056]
+	str	w0, [x19, 2056]
 	mov	w0, 145
-	str	w0, [x19,2052]
+	str	w0, [x19, 2052]
 	mov	x0, 500
 	bl	__const_udelay
-	ldrb	w0, [x22,15]
+	ldrb	w0, [x22, 15]
 	cmp	w0, 9
 	mov	w0, 1
-	bne	.L326
-	str	w0, [x19,2048]
-	b	.L327
+	bne	.L325
+	str	w0, [x19, 2048]
 .L326:
-	ldrb	w1, [x21,1264]
-	str	w1, [x19,2048]
-.L327:
-	str	w0, [x19,2048]
+	str	w0, [x19, 2048]
 	mov	x0, 750
-	str	wzr, [x19,2048]
-	str	wzr, [x19,2048]
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
 	bl	__const_udelay
 	bl	nandc_wait_flash_ready_no_delay
 	mov	w0, 223
-	str	w0, [x19,2056]
+	str	w0, [x19, 2056]
 	mov	x0, 250
 	bl	__const_udelay
-.L318:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 48
-	ret
+	b	.L317
+.L325:
+	ldrb	w1, [x21, 1208]
+	str	w1, [x19, 2048]
+	b	.L326
 	.size	zftl_flash_exit_slc_mode, .-zftl_flash_exit_slc_mode
 	.align	2
 	.global	flash_start_page_read
 	.type	flash_start_page_read, %function
 flash_start_page_read:
-	stp	x29, x30, [sp, -80]!
-	mov	w2, 1
+	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
+	and	w21, w0, 255
 	adrp	x22, .LANCHOR0
-	uxtb	w21, w0
 	add	x0, x22, :lo12:.LANCHOR0
-	str	x25, [sp,64]
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	mov	w20, 24
+	stp	x19, x20, [sp, 16]
+	mov	w19, 24
+	stp	x23, x24, [sp, 48]
 	mov	w23, w1
-	ldrb	w19, [x0,1257]
-	ldrb	w0, [x0,1153]
-	sub	w20, w20, w19
-	lsl	w19, w2, w19
-	lsr	w1, w1, w20
-	sub	w19, w19, #1
-	and	w19, w1, w19
-	uxtb	w19, w19
-	cmp	w0, w19
-	bhi	.L339
+	mov	w20, 1
+	ldrb	w1, [x0, 1205]
+	ldrb	w0, [x0, 1153]
+	sub	w24, w19, w1
+	lsl	w20, w20, w1
+	sub	w20, w20, #1
+	lsr	w1, w23, w24
+	and	w20, w20, w1
+	and	w20, w20, 255
+	cmp	w0, w20
+	bhi	.L340
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 256
 	mov	w2, 1013
-	add	x1, x1, 272
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L339:
-	add	x24, x22, :lo12:.LANCHOR0
-	ldrb	w0, [x24,1153]
-	cmp	w0, w19
-	bls	.L338
-	mov	w0, 1
-	add	x19, x24, w19, sxtw
-	lsl	w20, w0, w20
-	ldrb	w19, [x19,1248]
-	sub	w20, w20, #1
-	ldr	x25, [x24,1048]
-	and	w20, w20, w23
-	mov	w0, w19
-	ubfx	x23, x23, 24, 2
+.L340:
+	add	x5, x22, :lo12:.LANCHOR0
+	ldrb	w0, [x5, 1153]
+	cmp	w0, w20
+	bls	.L339
+	add	x20, x5, w20, sxtw
+	mov	w19, 1
+	ubfx	x4, x23, 24, 2
+	lsl	w19, w19, w24
+	sub	w19, w19, #1
+	and	w19, w19, w23
+	ldrb	w23, [x20, 1196]
+	ldr	x20, [x5, 1056]
+	mov	w0, w23
 	bl	nandc_cs
-	cbnz	w23, .L341
-	mov	w0, w20
-	bl	slc_phy_page_address_calc
-	mov	w20, w0
-	adrp	x0, .LANCHOR0
-	ldrb	w0, [x0,#:lo12:.LANCHOR0]
-	cbz	w0, .L342
+	cbnz	w4, .L342
 	mov	w0, w19
+	bl	slc_phy_page_address_calc
+	mov	w19, w0
+	ldrb	w0, [x22, #:lo12:.LANCHOR0]
+	cbz	w0, .L343
+	mov	w0, w23
 	bl	zftl_flash_enter_slc_mode
-	b	.L342
-.L341:
-	ldr	x0, [x24,1144]
-	ldrb	w0, [x0,12]
-	cmp	w0, 3
-	bne	.L343
-	ldrb	w0, [x24,1268]
-	cbnz	w0, .L343
-	ldrb	w0, [x24,1269]
-	cbnz	w0, .L343
-	sxtw	x0, w19
-	add	x0, x0, 8
-	add	x0, x25, x0, lsl 8
-	str	w23, [x0,8]
-	b	.L342
 .L343:
-	mov	w0, w19
-	bl	zftl_flash_exit_slc_mode
-.L342:
 	add	x0, x22, :lo12:.LANCHOR0
-	ldr	x0, [x0,1144]
-	ldrb	w1, [x0,7]
+	ldr	x0, [x0, 1144]
+	ldrb	w1, [x0, 7]
 	cmp	w1, 1
-	bne	.L344
-	ldrb	w0, [x0,12]
+	bne	.L345
+	ldrb	w0, [x0, 12]
 	cmp	w0, 2
-	bne	.L344
-	sxtw	x0, w19
+	bne	.L345
+	sxtw	x0, w23
 	mov	w1, 38
 	add	x0, x0, 8
-	add	x0, x25, x0, lsl 8
-	str	w1, [x0,8]
-.L344:
-	ubfiz	x19, x19, 8, 8
-	and	w0, w20, 255
-	add	x1, x25, x19
-	add	x22, x22, :lo12:.LANCHOR0
-	str	wzr, [x1,2056]
-	str	wzr, [x1,2052]
-	str	wzr, [x1,2052]
-	str	w0, [x1,2052]
-	lsr	w0, w20, 8
-	str	w0, [x1,2052]
-	lsr	w0, w20, 16
-	str	w0, [x1,2052]
-	ldrb	w0, [x22,1256]
-	cbz	w0, .L345
-	lsr	w20, w20, 24
-	str	w20, [x1,2052]
+	add	x0, x20, x0, lsl 8
+	str	w1, [x0, 8]
 .L345:
-	str	w21, [x1,2056]
-.L338:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldr	x25, [sp,64]
-	ldp	x29, x30, [sp], 80
+	ubfiz	x0, x23, 8, 8
+	and	w1, w19, 255
+	add	x0, x20, x0
+	add	x22, x22, :lo12:.LANCHOR0
+	str	wzr, [x0, 2056]
+	str	wzr, [x0, 2052]
+	str	wzr, [x0, 2052]
+	str	w1, [x0, 2052]
+	lsr	w1, w19, 8
+	str	w1, [x0, 2052]
+	lsr	w1, w19, 16
+	str	w1, [x0, 2052]
+	ldrb	w1, [x22, 1204]
+	cbz	w1, .L346
+	lsr	w19, w19, 24
+	str	w19, [x0, 2052]
+.L346:
+	str	w21, [x0, 2056]
+.L339:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 64
 	ret
+.L342:
+	ldr	x0, [x5, 1144]
+	ldrb	w0, [x0, 12]
+	cmp	w0, 3
+	bne	.L344
+	ldrb	w0, [x5, 1212]
+	cbnz	w0, .L344
+	ldrb	w0, [x5, 1213]
+	cbnz	w0, .L344
+	sxtw	x0, w23
+	add	x0, x0, 8
+	add	x0, x20, x0, lsl 8
+	str	w4, [x0, 8]
+	b	.L343
+.L344:
+	mov	w0, w23
+	bl	zftl_flash_exit_slc_mode
+	b	.L343
 	.size	flash_start_page_read, .-flash_start_page_read
 	.align	2
 	.global	nandc_wait_flash_ready
@@ -1844,30 +1682,30 @@ nandc_wait_flash_ready:
 	stp	x29, x30, [sp, -48]!
 	mov	x0, 750
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	w19, 34464
 	adrp	x20, .LANCHOR0
+	add	x20, x20, :lo12:.LANCHOR0
 	movk	w19, 0x1, lsl 16
 	bl	__const_udelay
-.L354:
-	add	x0, x20, :lo12:.LANCHOR0
-	ldr	x0, [x0,1048]
+.L356:
+	ldr	x0, [x20, 1056]
 	ldr	w0, [x0]
-	str	w0, [x29,40]
-	ldr	w0, [x29,40]
-	tbnz	x0, 9, .L355
+	str	w0, [x29, 40]
+	ldr	w0, [x29, 40]
+	tbnz	x0, 9, .L357
 	mov	x0, 50
 	bl	__const_udelay
 	subs	w19, w19, #1
-	bne	.L354
+	bne	.L356
 	mov	w0, -1
-	b	.L353
-.L355:
-	mov	w0, 0
-.L353:
-	ldp	x19, x20, [sp,16]
+.L354:
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
+.L357:
+	mov	w0, 0
+	b	.L354
 	.size	nandc_wait_flash_ready, .-nandc_wait_flash_ready
 	.align	2
 	.global	sandisk_set_rr_para
@@ -1875,92 +1713,92 @@ nandc_wait_flash_ready:
 sandisk_set_rr_para:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	x20, x0
 	mov	w0, 239
-	uxtb	w19, w1
-	add	w19, w19, 1
-	str	w0, [x20,8]
+	and	w19, w1, 255
+	str	w0, [x20, 8]
 	mov	w0, 17
-	str	w0, [x20,4]
+	str	w0, [x20, 4]
 	mov	x0, 1000
 	bl	__const_udelay
-	mov	w1, 5
-	adrp	x2, .LANCHOR1
-	add	x2, x2, :lo12:.LANCHOR1
-	adrp	x5, .LANCHOR0
-	smull	x1, w19, w1
-	add	x0, x2, 48
-	add	x2, x2, 96
+	add	w1, w19, 1
+	mov	w0, 5
+	adrp	x2, .LANCHOR0
+	add	x2, x2, :lo12:.LANCHOR0
+	umull	x1, w1, w0
+	adrp	x0, .LANCHOR1
+	add	x0, x0, :lo12:.LANCHOR1
+	add	x3, x0, 48
+	add	x0, x0, 144
+	add	x3, x3, x1
 	add	x0, x0, x1
-	add	x1, x2, x1
-	mov	x2, 0
-.L358:
-	add	x3, x5, :lo12:.LANCHOR0
-	ldrb	w4, [x3,1137]
-	cmp	w4, w2
-	bls	.L363
-	ldrb	w3, [x3,1136]
-	cmp	w3, 67
-	bne	.L359
-	ldrsb	w3, [x0,x2]
-	b	.L362
-.L359:
-	ldrsb	w3, [x1,x2]
-.L362:
-	str	w3, [x20]
-	add	x2, x2, 1
-	b	.L358
-.L363:
+	mov	x1, 0
+.L361:
+	ldrb	w4, [x2, 1137]
+	cmp	w4, w1
+	bhi	.L364
 	bl	nandc_wait_flash_ready
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L364:
+	ldrb	w4, [x2, 1136]
+	cmp	w4, 67
+	bne	.L362
+	ldrsb	w4, [x0, x1]
+.L366:
+	add	x1, x1, 1
+	str	w4, [x20]
+	b	.L361
+.L362:
+	ldrsb	w4, [x3, x1]
+	b	.L366
 	.size	sandisk_set_rr_para, .-sandisk_set_rr_para
 	.align	2
 	.global	toshiba_3d_set_tlc_rr_para
 	.type	toshiba_3d_set_tlc_rr_para, %function
 toshiba_3d_set_tlc_rr_para:
 	stp	x29, x30, [sp, -48]!
-	uxtb	x2, w1
+	and	x2, x1, 255
 	mov	x1, 7
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	str	x21, [sp,32]
+	stp	x19, x20, [sp, 16]
 	mov	x19, x0
+	str	x21, [sp, 32]
 	mov	w21, 213
-	str	w21, [x0,8]
-	str	wzr, [x0,4]
 	mov	w0, -119
-	str	w0, [x19,4]
-	adrp	x0, .LANCHOR1
 	madd	x1, x2, x1, x1
+	str	w21, [x19, 8]
+	str	wzr, [x19, 4]
+	str	w0, [x19, 4]
+	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	add	x0, x0, 296
+	add	x0, x0, 280
 	add	x20, x0, x1
-	ldrsb	w0, [x0,x1]
+	ldrsb	w0, [x0, x1]
 	str	w0, [x19]
-	ldrsb	w0, [x20,1]
+	ldrsb	w0, [x20, 1]
 	str	w0, [x19]
-	ldrsb	w0, [x20,2]
+	ldrsb	w0, [x20, 2]
 	str	w0, [x19]
-	ldrsb	w0, [x20,3]
+	ldrsb	w0, [x20, 3]
 	str	w0, [x19]
 	bl	nandc_wait_flash_ready
-	str	w21, [x19,8]
-	str	wzr, [x19,4]
+	str	w21, [x19, 8]
+	str	wzr, [x19, 4]
 	mov	w0, -118
-	str	w0, [x19,4]
-	ldrsb	w0, [x20,4]
+	str	w0, [x19, 4]
+	ldrsb	w0, [x20, 4]
 	str	w0, [x19]
-	ldrsb	w0, [x20,5]
+	ldrsb	w0, [x20, 5]
 	str	w0, [x19]
-	ldrsb	w0, [x20,6]
+	ldrsb	w0, [x20, 6]
 	str	w0, [x19]
 	str	wzr, [x19]
 	bl	nandc_wait_flash_ready
-	ldr	x21, [sp,32]
-	ldp	x19, x20, [sp,16]
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	toshiba_3d_set_tlc_rr_para, .-toshiba_3d_set_tlc_rr_para
@@ -1971,14 +1809,14 @@ toshiba_3d_set_slc_rr_para:
 	stp	x29, x30, [sp, -16]!
 	mov	w2, 213
 	add	x29, sp, 0
-	str	w2, [x0,8]
+	str	w2, [x0, 8]
 	mov	w2, -117
-	str	wzr, [x0,4]
-	str	w2, [x0,4]
+	str	wzr, [x0, 4]
+	str	w2, [x0, 4]
 	adrp	x2, .LANCHOR1
 	add	x2, x2, :lo12:.LANCHOR1
 	add	x1, x2, w1, uxtb
-	ldrsb	w1, [x1,697]
+	ldrsb	w1, [x1, 681]
 	str	w1, [x0]
 	str	wzr, [x0]
 	str	wzr, [x0]
@@ -1994,107 +1832,106 @@ toshiba_tlc_set_rr_para:
 	stp	x29, x30, [sp, -48]!
 	uxtw	x1, w1
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	x19, x0
-	str	x21, [sp,32]
+	str	x21, [sp, 32]
 	mov	w21, 239
 	adrp	x0, .LANCHOR2
-	str	w21, [x19,8]
-	cbz	w2, .L367
+	str	w21, [x19, 8]
+	cbz	w2, .L372
 	mov	w2, 18
-	str	w2, [x19,4]
+	str	w2, [x19, 4]
 	mov	x2, 7
 	add	x0, x0, :lo12:.LANCHOR2
 	add	x0, x0, 40
 	mul	x1, x1, x2
 	add	x20, x0, x1
-	ldrb	w0, [x0,x1]
+	ldrb	w0, [x0, x1]
 	str	w0, [x19]
-	ldrb	w0, [x20,1]
+	ldrb	w0, [x20, 1]
 	str	w0, [x19]
-	ldrb	w0, [x20,2]
+	ldrb	w0, [x20, 2]
 	str	w0, [x19]
-	ldrb	w0, [x20,3]
+	ldrb	w0, [x20, 3]
 	str	w0, [x19]
 	bl	nandc_wait_flash_ready
-	str	w21, [x19,8]
+	str	w21, [x19, 8]
 	mov	w0, 19
-	str	w0, [x19,4]
-	ldrb	w0, [x20,4]
+	str	w0, [x19, 4]
+	ldrb	w0, [x20, 4]
 	str	w0, [x19]
-	ldrb	w0, [x20,5]
+	ldrb	w0, [x20, 5]
 	str	w0, [x19]
-	ldrb	w0, [x20,6]
+	ldrb	w0, [x20, 6]
 	str	w0, [x19]
+.L375:
 	str	wzr, [x19]
-	b	.L368
-.L367:
-	add	x0, x0, :lo12:.LANCHOR2
-	mov	w3, 20
-	add	x0, x0, 376
-	str	w3, [x19,4]
-	ldrb	w0, [x0,x1]
-	str	w0, [x19]
-	str	w2, [x19]
-	str	w2, [x19]
-	str	w2, [x19]
-.L368:
 	bl	nandc_wait_flash_ready
-	ldr	x21, [sp,32]
-	ldp	x19, x20, [sp,16]
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
+.L372:
+	add	x0, x0, :lo12:.LANCHOR2
+	mov	w2, 20
+	add	x0, x0, 376
+	str	w2, [x19, 4]
+	ldrb	w0, [x0, x1]
+	str	w0, [x19]
+	str	wzr, [x19]
+	str	wzr, [x19]
+	b	.L375
 	.size	toshiba_tlc_set_rr_para, .-toshiba_tlc_set_rr_para
 	.align	2
 	.global	ymtc_3d_set_tlc_rr_para
 	.type	ymtc_3d_set_tlc_rr_para, %function
 ymtc_3d_set_tlc_rr_para:
 	stp	x29, x30, [sp, -48]!
+	and	x1, x1, 255
 	mov	x2, 7
-	uxtb	x1, w1
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	x19, x0
-	str	x21, [sp,32]
-	mov	w21, 239
-	str	w21, [x0,8]
+	str	x21, [sp, 32]
 	mov	w0, 160
-	str	w0, [x19,4]
-	adrp	x0, .LANCHOR1
+	mov	w21, 239
 	mul	x1, x1, x2
+	str	w21, [x19, 8]
+	str	w0, [x19, 4]
+	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	add	x0, x0, 712
+	add	x0, x0, 696
 	add	x20, x0, x1
-	ldrsb	w0, [x0,x1]
+	ldrsb	w0, [x0, x1]
 	str	w0, [x19]
-	ldrsb	w0, [x20,4]
+	ldrsb	w0, [x20, 4]
 	str	w0, [x19]
 	str	wzr, [x19]
 	str	wzr, [x19]
 	bl	nandc_wait_flash_ready
-	str	w21, [x19,8]
+	str	w21, [x19, 8]
 	mov	w0, 161
-	str	w0, [x19,4]
-	ldrsb	w0, [x20,1]
+	str	w0, [x19, 4]
+	ldrsb	w0, [x20, 1]
 	str	w0, [x19]
-	ldrsb	w0, [x20,3]
+	ldrsb	w0, [x20, 3]
 	str	w0, [x19]
-	ldrsb	w0, [x20,5]
+	ldrsb	w0, [x20, 5]
 	str	w0, [x19]
 	str	wzr, [x19]
 	bl	nandc_wait_flash_ready
-	str	w21, [x19,8]
+	str	w21, [x19, 8]
 	mov	w0, 162
-	str	w0, [x19,4]
-	ldrsb	w0, [x20,2]
+	str	w0, [x19, 4]
+	ldrsb	w0, [x20, 2]
 	str	w0, [x19]
-	ldrsb	w0, [x20,6]
+	ldrsb	w0, [x20, 6]
 	str	w0, [x19]
 	str	wzr, [x19]
 	str	wzr, [x19]
 	bl	nandc_wait_flash_ready
-	ldr	x21, [sp,32]
-	ldp	x19, x20, [sp,16]
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	ymtc_3d_set_tlc_rr_para, .-ymtc_3d_set_tlc_rr_para
@@ -2104,14 +1941,15 @@ ymtc_3d_set_tlc_rr_para:
 ymtc_3d_set_slc_rr_para:
 	stp	x29, x30, [sp, -16]!
 	mov	w2, 239
+	and	x1, x1, 255
 	add	x29, sp, 0
-	str	w2, [x0,8]
+	str	w2, [x0, 8]
 	mov	w2, 163
-	str	w2, [x0,4]
+	str	w2, [x0, 4]
 	adrp	x2, .LANCHOR1
 	add	x2, x2, :lo12:.LANCHOR1
-	add	x1, x2, w1, uxtb
-	ldrsb	w1, [x1,1072]
+	add	x2, x2, 1056
+	ldrsb	w1, [x2, x1]
 	str	w1, [x0]
 	str	wzr, [x0]
 	str	wzr, [x0]
@@ -2128,163 +1966,162 @@ flash_start_plane_read:
 	mov	w3, 24
 	mov	w2, 1
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR0
 	add	x4, x20, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
 	ubfx	x24, x0, 24, 2
-	ldrb	w5, [x4,1257]
-	sub	w3, w3, w5
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldrb	w19, [x4, 1205]
+	sub	w3, w3, w19
+	lsl	w19, w2, w19
+	sub	w19, w19, #1
 	lsl	w21, w2, w3
-	lsl	w2, w2, w5
-	lsr	w19, w0, w3
-	sub	w2, w2, #1
 	sub	w21, w21, #1
-	and	w19, w19, w2
 	and	w22, w21, w0
-	ldrb	w0, [x4,1153]
-	uxtb	w19, w19
+	lsr	w3, w0, w3
+	ldrb	w0, [x4, 1153]
+	and	w19, w19, w3
+	and	w19, w19, 255
 	and	w21, w21, w1
 	cmp	w0, w19
-	bhi	.L372
+	bhi	.L381
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 1072
 	mov	w2, 1148
-	add	x1, x1, 1088
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L372:
-	add	x26, x20, :lo12:.LANCHOR0
-	add	x19, x26, w19, sxtw
-	ldrb	w23, [x19,1248]
+.L381:
+	add	x4, x20, :lo12:.LANCHOR0
+	add	x19, x4, w19, sxtw
+	ldr	x25, [x4, 1056]
+	ldrb	w23, [x19, 1196]
 	mov	w0, w23
-	ldr	x25, [x26,1048]
 	bl	nandc_cs
-	cbnz	w24, .L373
+	cbnz	w24, .L382
 	mov	w0, w22
 	bl	slc_phy_page_address_calc
 	mov	w22, w0
 	mov	w0, w21
 	bl	slc_phy_page_address_calc
 	mov	w21, w0
-	adrp	x0, .LANCHOR0
-	ldrb	w0, [x0,#:lo12:.LANCHOR0]
-	cbz	w0, .L374
+	ldrb	w0, [x20, #:lo12:.LANCHOR0]
+	cbz	w0, .L383
 	mov	w0, w23
 	bl	zftl_flash_enter_slc_mode
-	b	.L374
-.L373:
-	ldr	x0, [x26,1144]
-	ldrb	w0, [x0,12]
-	cmp	w0, 3
-	bne	.L375
-	ldrb	w0, [x26,1268]
-	cbnz	w0, .L375
-	ldrb	w0, [x26,1269]
-	cbnz	w0, .L375
-	sxtw	x0, w23
-	add	x0, x0, 8
-	add	x0, x25, x0, lsl 8
-	str	w24, [x0,8]
-	b	.L374
-.L375:
-	mov	w0, w23
-	bl	zftl_flash_exit_slc_mode
-.L374:
+.L383:
 	add	x0, x20, :lo12:.LANCHOR0
-	uxtb	x19, w23
+	and	x19, x23, 255
 	and	w3, w22, 255
 	lsr	w2, w22, 8
 	and	w28, w21, 255
 	lsr	w27, w21, 8
-	ldrb	w1, [x0,1176]
+	ldrb	w1, [x0, 1176]
 	lsr	w26, w21, 16
 	cmp	w1, 1
 	lsr	w1, w22, 16
-	bne	.L376
+	bne	.L385
 	add	x19, x25, x19, lsl 8
-	ldrb	w4, [x0,1168]
-	ldrb	w0, [x0,1256]
-	str	w4, [x19,2056]
-	str	wzr, [x19,2052]
-	str	wzr, [x19,2052]
-	str	w3, [x19,2052]
-	str	w2, [x19,2052]
-	str	w1, [x19,2052]
-	cbz	w0, .L377
+	ldrb	w4, [x0, 1168]
+	ldrb	w0, [x0, 1204]
+	str	w4, [x19, 2056]
+	str	wzr, [x19, 2052]
+	str	wzr, [x19, 2052]
+	str	w3, [x19, 2052]
+	str	w2, [x19, 2052]
+	str	w1, [x19, 2052]
+	cbz	w0, .L386
 	lsr	w22, w22, 24
-	str	w22, [x19,2052]
-.L377:
+	str	w22, [x19, 2052]
+.L386:
 	add	x22, x20, :lo12:.LANCHOR0
-	ldrb	w0, [x22,1169]
-	str	w0, [x19,2056]
+	ldrb	w0, [x22, 1169]
+	str	w0, [x19, 2056]
 	bl	nandc_wait_flash_ready
-	cbz	w24, .L378
-	ldr	x0, [x22,1144]
-	ldrb	w0, [x0,12]
+	ldr	x0, [x22, 1144]
+	ldrb	w0, [x0, 12]
 	cmp	w0, 3
-	bne	.L378
-	str	w24, [x19,2056]
-.L378:
-	str	wzr, [x19,2056]
+	bne	.L387
+	cbz	w24, .L387
+	str	w24, [x19, 2056]
+.L387:
+	str	wzr, [x19, 2056]
 	add	x20, x20, :lo12:.LANCHOR0
-	str	wzr, [x19,2052]
-	str	wzr, [x19,2052]
-	str	w28, [x19,2052]
-	str	w27, [x19,2052]
-	ldrb	w0, [x20,1256]
-	str	w26, [x19,2052]
-	cbz	w0, .L404
+	str	wzr, [x19, 2052]
+	str	wzr, [x19, 2052]
+	str	w28, [x19, 2052]
+	ldrb	w0, [x20, 1204]
+	str	w27, [x19, 2052]
+	str	w26, [x19, 2052]
+	cbz	w0, .L408
 	lsr	w21, w21, 24
-	str	w21, [x19,2052]
-	b	.L404
-.L376:
-	ldr	x0, [x0,1144]
-	ldrb	w4, [x0,7]
+	str	w21, [x19, 2052]
+.L408:
+	mov	w0, 48
+	str	w0, [x19, 2056]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 96
+	ret
+.L382:
+	ldr	x0, [x4, 1144]
+	ldrb	w0, [x0, 12]
+	cmp	w0, 3
+	bne	.L384
+	ldrb	w0, [x4, 1212]
+	cbnz	w0, .L384
+	ldrb	w0, [x4, 1213]
+	cbnz	w0, .L384
+	sxtw	x0, w23
+	add	x0, x0, 8
+	add	x0, x25, x0, lsl 8
+	str	w24, [x0, 8]
+	b	.L383
+.L384:
+	mov	w0, w23
+	bl	zftl_flash_exit_slc_mode
+	b	.L383
+.L385:
+	ldr	x0, [x0, 1144]
+	ldrb	w4, [x0, 7]
 	cmp	w4, 1
-	bne	.L381
-	ldrb	w4, [x0,12]
+	bne	.L390
+	ldrb	w4, [x0, 12]
 	cmp	w4, 2
-	bne	.L381
+	bne	.L390
 	add	x23, x23, 8
 	mov	w4, 38
 	add	x23, x25, x23, lsl 8
-	str	w4, [x23,8]
-.L381:
+	str	w4, [x23, 8]
+.L390:
 	add	x4, x20, :lo12:.LANCHOR0
 	add	x19, x25, x19, lsl 8
-	ldrb	w4, [x4,1168]
-	str	w4, [x19,2056]
-	str	w3, [x19,2052]
-	str	w2, [x19,2052]
-	str	w1, [x19,2052]
-	cbz	w24, .L382
-	ldrb	w0, [x0,12]
+	ldrb	w4, [x4, 1168]
+	str	w4, [x19, 2056]
+	str	w3, [x19, 2052]
+	str	w2, [x19, 2052]
+	str	w1, [x19, 2052]
+	ldrb	w0, [x0, 12]
 	cmp	w0, 3
-	bne	.L382
-	str	w24, [x19,2056]
-.L382:
+	bne	.L391
+	cbz	w24, .L391
+	str	w24, [x19, 2056]
+.L391:
 	add	x20, x20, :lo12:.LANCHOR0
-	ldrb	w0, [x20,1169]
-	str	w0, [x19,2056]
-	str	w28, [x19,2052]
-	str	w27, [x19,2052]
-	str	w26, [x19,2052]
-.L404:
-	mov	w0, 48
-	str	w0, [x19,2056]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 96
-	ret
+	ldrb	w0, [x20, 1169]
+	str	w0, [x19, 2056]
+	str	w28, [x19, 2052]
+	str	w27, [x19, 2052]
+	str	w26, [x19, 2052]
+	b	.L408
 	.size	flash_start_plane_read, .-flash_start_plane_read
 	.align	2
 	.global	flash_set_interface_mode
@@ -2292,155 +2129,160 @@ flash_start_plane_read:
 flash_set_interface_mode:
 	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	adrp	x22, .LANCHOR0
-	adrp	x23, .LC38
-	adrp	x24, .LC37
-	str	x25, [sp,64]
-	stp	x19, x20, [sp,16]
-	mov	w25, w0
-	mov	x21, 0
-	add	x22, x22, :lo12:.LANCHOR0
-	add	x23, x23, :lo12:.LC38
-	add	x24, x24, :lo12:.LC37
-.L420:
-	add	x0, x22, x21, lsl 3
-	ldr	x20, [x22,1048]
-	adrp	x1, .LANCHOR0
-	ldrb	w19, [x0,1272]
-	cmp	w19, 152
-	beq	.L406
-	cmp	w19, 69
-	beq	.L406
-	cmp	w19, 155
-	beq	.L406
-	cmp	w19, 44
+	str	x25, [sp, 64]
+	adrp	x25, .LANCHOR0
+	add	x25, x25, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	stp	x19, x20, [sp, 16]
+	mov	w21, w0
+	add	x22, x25, 1216
+	mov	x20, x25
+	stp	x23, x24, [sp, 48]
+	mov	x24, 0
+.L422:
+	lsl	x0, x24, 3
+	ldr	x19, [x25, 1056]
+	ldrb	w23, [x0, x22]
+	cmp	w23, 69
+	beq	.L410
+	add	w0, w23, 119
+	cmp	w23, 44
+	and	w1, w0, 255
 	cset	w2, eq
-	cmp	w19, 137
-	cset	w0, eq
+	cmp	w1, 18
+	bhi	.L423
+	mov	x0, 32769
+	movk	x0, 0x4, lsl 16
+	lsr	x0, x0, x1
+	mvn	x0, x0
+.L411:
+	and	w0, w0, 1
+	eor	w0, w0, 1
 	orr	w0, w2, w0
-	cbz	w0, .L407
-.L406:
-	add	x1, x1, :lo12:.LANCHOR0
-	cmp	w25, 1
-	ldrb	w1, [x1,1304]
-	bne	.L409
-	tbz	x1, 0, .L407
-	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L410
-	mov	x0, x24
-	bl	printk
+	cbz	w0, .L412
 .L410:
-	add	x1, x20, x21, lsl 8
-	mov	w0, 239
-	cmp	w19, 137
-	str	w0, [x1,2056]
-	beq	.L421
-	cmp	w19, 44
-	bne	.L411
-.L421:
-	mov	w0, 1
-	b	.L442
-.L411:
-	cmp	w19, 155
-	mov	w0, 1
-	bne	.L419
-.L442:
-	str	w0, [x1,2052]
-	mov	w0, 5
-	b	.L440
-.L409:
-	tbz	x1, 2, .L407
+	ldrb	w1, [x20, 1248]
+	cmp	w21, 1
+	bne	.L413
+	tbz	x1, 0, .L412
 	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L415
-	mov	x0, x23
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L414
+	adrp	x0, .LC34
+	add	x0, x0, :lo12:.LC34
 	bl	printk
+.L414:
+	add	x0, x19, x24, lsl 8
+	mov	w1, 239
+	cmp	w23, 44
+	str	w1, [x0, 2056]
+	mov	w1, 137
+	ccmp	w23, w1, 4, ne
+	mov	w1, 1
+	bne	.L415
+.L446:
+	str	w1, [x0, 2052]
+	mov	w1, 5
+.L445:
+	str	w1, [x0, 2048]
+.L420:
+	str	wzr, [x0, 2048]
+	str	wzr, [x0, 2048]
+	str	wzr, [x0, 2048]
+.L412:
+	add	x24, x24, 1
+	cmp	x24, 4
+	bne	.L422
+	bl	nandc_wait_flash_ready
+	ldr	x25, [sp, 64]
+	mov	w0, 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 80
+	ret
+.L423:
+	mov	x0, 1
+	b	.L411
 .L415:
-	add	x1, x20, x21, lsl 8
-	mov	w0, 239
-	cmp	w19, 137
-	str	w0, [x1,2056]
-	beq	.L422
-	cmp	w19, 44
-	cset	w0, eq
-	cbz	w0, .L416
-.L422:
-	mov	w0, 1
-	str	w0, [x1,2052]
-	mov	w0, 35
-	b	.L440
-.L416:
-	cmp	w19, 155
+	cmp	w23, 155
+	beq	.L446
+	mov	w2, 128
+	str	w2, [x0, 2052]
+	b	.L445
+.L413:
+	tbz	x1, 2, .L412
+	adrp	x0, .LANCHOR2
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L418
+	adrp	x0, .LC35
+	add	x0, x0, :lo12:.LC35
+	bl	printk
+.L418:
+	add	x0, x19, x24, lsl 8
+	mov	w1, 239
+	cmp	w23, 44
+	str	w1, [x0, 2056]
+	mov	w1, 137
+	ccmp	w23, w1, 4, ne
 	bne	.L419
-	mov	w0, 1
-	str	w0, [x1,2052]
-	mov	w0, 37
-	b	.L440
+	mov	w1, 1
+	str	w1, [x0, 2052]
+	mov	w1, 35
+	b	.L445
 .L419:
-	mov	w2, 128
-	str	w2, [x1,2052]
-.L440:
-	str	w0, [x1,2048]
-	str	wzr, [x1,2048]
-	str	wzr, [x1,2048]
-	str	wzr, [x1,2048]
-.L407:
-	add	x21, x21, 1
-	cmp	x21, 4
-	bne	.L420
-	bl	nandc_wait_flash_ready
-	ldr	x25, [sp,64]
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 80
-	ret
+	cmp	w23, 155
+	bne	.L421
+	mov	w1, 1
+	str	w1, [x0, 2052]
+	mov	w1, 37
+	b	.L445
+.L421:
+	mov	w1, 128
+	str	w1, [x0, 2052]
+	str	wzr, [x0, 2048]
+	b	.L420
 	.size	flash_set_interface_mode, .-flash_set_interface_mode
 	.align	2
 	.type	mt_auto_read_calibration_config, %function
 mt_auto_read_calibration_config:
-	stp	x29, x30, [sp, -48]!
+	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	str	x19, [sp,16]
-	uxtb	w19, w0
-	ubfiz	x19, x19, 8, 8
-	str	x1, [x29,40]
+	stp	x19, x20, [sp, 16]
+	mov	w20, w1
+	and	w19, w0, 255
 	bl	nandc_wait_flash_ready
-	adrp	x0, .LANCHOR0+1048
-	ldr	x0, [x0,#:lo12:.LANCHOR0+1048]
-	add	x19, x0, x19
+	adrp	x1, .LANCHOR0+1056
+	ubfiz	x0, x19, 8, 8
+	ldr	x19, [x1, #:lo12:.LANCHOR0+1056]
+	add	x19, x19, x0
 	mov	w0, 239
-	str	w0, [x19,2056]
+	str	w0, [x19, 2056]
 	mov	w0, 150
-	str	w0, [x19,2052]
+	str	w0, [x19, 2052]
 	mov	x0, 1000
 	bl	__const_udelay
-	ldr	x1, [x29,40]
-	str	w1, [x19,2048]
-	str	wzr, [x19,2048]
-	str	wzr, [x19,2048]
-	str	wzr, [x19,2048]
-	ldr	x19, [sp,16]
-	ldp	x29, x30, [sp], 48
+	str	w20, [x19, 2048]
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
 	ret
 	.size	mt_auto_read_calibration_config, .-mt_auto_read_calibration_config
 	.align	2
 	.global	flash_reset
 	.type	flash_reset, %function
 flash_reset:
-	adrp	x1, .LANCHOR0+1048
-	uxtb	x0, w0
 	stp	x29, x30, [sp, -16]!
-	add	x0, x0, 8
+	adrp	x1, .LANCHOR0+1056
+	ubfiz	x0, x0, 8, 8
 	add	x29, sp, 0
-	ldr	x1, [x1,#:lo12:.LANCHOR0+1048]
-	add	x0, x1, x0, lsl 8
-	mov	w1, 255
-	str	w1, [x0,8]
+	ldr	x1, [x1, #:lo12:.LANCHOR0+1056]
+	add	x0, x0, 2048
+	add	x1, x1, x0
+	mov	w0, 255
+	str	w0, [x1, 8]
 	bl	nandc_wait_flash_ready
 	ldp	x29, x30, [sp], 16
 	ret
@@ -2451,58 +2293,57 @@ flash_reset:
 flash_read_id:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	str	x21, [sp,32]
-	uxtb	w21, w0
-	adrp	x0, .LANCHOR0+1048
-	stp	x19, x20, [sp,16]
+	str	x21, [sp, 32]
+	and	w21, w0, 255
+	adrp	x0, .LANCHOR0+1056
+	stp	x19, x20, [sp, 16]
 	mov	x19, x1
-	ldr	x20, [x0,#:lo12:.LANCHOR0+1048]
+	ldr	x20, [x0, #:lo12:.LANCHOR0+1056]
 	mov	w0, w21
 	bl	flash_reset
 	mov	w0, w21
 	bl	nandc_cs
-	ubfiz	x2, x21, 8, 8
+	ubfiz	x0, x21, 8, 8
+	add	x20, x20, x0
 	mov	w0, 144
-	add	x20, x20, x2
-	str	w0, [x20,2056]
+	str	w0, [x20, 2056]
 	mov	x0, 1000
-	str	wzr, [x20,2052]
+	str	wzr, [x20, 2052]
 	bl	__const_udelay
-	ldr	w0, [x20,2048]
+	ldr	w0, [x20, 2048]
 	strb	w0, [x19]
-	ldr	w0, [x20,2048]
-	strb	w0, [x19,1]
-	ldr	w0, [x20,2048]
-	strb	w0, [x19,2]
-	ldr	w0, [x20,2048]
-	strb	w0, [x19,3]
-	ldr	w0, [x20,2048]
-	strb	w0, [x19,4]
-	ldr	w0, [x20,2048]
-	strb	w0, [x19,5]
-	ldr	w0, [x20,2048]
-	strb	w0, [x19,6]
-	ldr	w0, [x20,2048]
-	strb	w0, [x19,7]
-	mov	w0, w21
-	bl	nandc_de_cs
+	ldr	w0, [x20, 2048]
+	strb	w0, [x19, 1]
+	ldr	w0, [x20, 2048]
+	strb	w0, [x19, 2]
+	ldr	w0, [x20, 2048]
+	strb	w0, [x19, 3]
+	ldr	w0, [x20, 2048]
+	strb	w0, [x19, 4]
+	ldr	w0, [x20, 2048]
+	strb	w0, [x19, 5]
+	ldr	w0, [x20, 2048]
+	strb	w0, [x19, 6]
+	ldr	w0, [x20, 2048]
+	strb	w0, [x19, 7]
+	bl	nandc_de_cs.constprop.35
 	ldrb	w2, [x19]
 	sub	w0, w2, #1
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 253
-	bhi	.L445
-	adrp	x0, .LC39
-	ldrb	w3, [x19,1]
-	ldrb	w4, [x19,2]
-	add	x0, x0, :lo12:.LC39
-	ldrb	w5, [x19,3]
+	bhi	.L451
+	ldrb	w7, [x19, 5]
+	adrp	x0, .LC36
+	ldrb	w6, [x19, 4]
 	add	w1, w21, 1
-	ldrb	w6, [x19,4]
-	ldrb	w7, [x19,5]
+	ldrb	w5, [x19, 3]
+	add	x0, x0, :lo12:.LC36
+	ldrb	w4, [x19, 2]
+	ldrb	w3, [x19, 1]
 	bl	printk
-.L445:
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
+.L451:
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	flash_read_id, .-flash_read_id
@@ -2510,192 +2351,190 @@ flash_read_id:
 	.global	flash_read_spare
 	.type	flash_read_spare, %function
 flash_read_spare:
-	stp	x29, x30, [sp, -48]!
-	adrp	x4, .LANCHOR0+1048
+	stp	x29, x30, [sp, -32]!
 	ubfiz	x0, x0, 8, 8
 	add	x29, sp, 0
-	str	x19, [sp,16]
-	adrp	x3, .LANCHOR2+17
-	ldr	x19, [x4,#:lo12:.LANCHOR0+1048]
-	str	x2, [x29,40]
+	stp	x19, x20, [sp, 16]
+	mov	x20, x2
+	adrp	x2, .LANCHOR2+17
+	ldrb	w3, [x2, #:lo12:.LANCHOR2+17]
+	adrp	x2, .LANCHOR0+1056
+	ldr	x19, [x2, #:lo12:.LANCHOR0+1056]
+	lsl	w3, w3, 9
 	add	x19, x19, x0
-	ldrb	w3, [x3,#:lo12:.LANCHOR2+17]
 	and	w0, w1, 255
-	lsl	w3, w3, 9
-	str	wzr, [x19,2056]
-	str	w3, [x19,2052]
+	str	wzr, [x19, 2056]
+	str	w3, [x19, 2052]
 	lsr	w3, w3, 8
-	str	w3, [x19,2052]
-	str	w0, [x19,2052]
+	str	w3, [x19, 2052]
+	str	w0, [x19, 2052]
 	lsr	w0, w1, 8
-	str	w0, [x19,2052]
+	str	w0, [x19, 2052]
 	lsr	w1, w1, 16
-	str	w1, [x19,2052]
+	str	w1, [x19, 2052]
 	mov	w0, 48
-	str	w0, [x19,2056]
+	str	w0, [x19, 2056]
 	bl	nandc_wait_flash_ready
-	ldr	x2, [x29,40]
-	ldr	w0, [x19,2048]
-	strb	w0, [x2]
-	ldr	x19, [sp,16]
-	ldp	x29, x30, [sp], 48
+	ldr	w0, [x19, 2048]
+	strb	w0, [x20]
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
 	ret
 	.size	flash_read_spare, .-flash_read_spare
 	.align	2
 	.global	flash_read_otp_data
 	.type	flash_read_otp_data, %function
 flash_read_otp_data:
-	stp	x29, x30, [sp, -64]!
+	stp	x29, x30, [sp, -48]!
+	and	w4, w0, 255
+	adrp	x0, .LANCHOR0+1056
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	uxtb	w21, w0
-	adrp	x0, .LANCHOR0+1048
-	stp	x19, x20, [sp,16]
-	str	x23, [sp,48]
+	stp	x19, x20, [sp, 16]
 	mov	w20, w1
-	ldr	x19, [x0,#:lo12:.LANCHOR0+1048]
-	mov	w0, w21
-	mov	x23, x2
-	mov	w22, 144
+	ldr	x19, [x0, #:lo12:.LANCHOR0+1056]
+	mov	w0, w4
+	stp	x21, x22, [sp, 32]
+	mov	x22, x2
 	bl	nandc_cs
-	ubfiz	x3, x21, 8, 8
+	ubfiz	x4, x4, 8, 8
+	add	x19, x19, x4
 	mov	w0, 239
-	add	x19, x19, x3
-	str	w0, [x19,2056]
+	mov	w21, 144
+	str	w0, [x19, 2056]
 	mov	x0, 250
-	str	w22, [x19,2052]
+	str	w21, [x19, 2052]
 	bl	__const_udelay
 	mov	w0, 1
-	str	w0, [x19,2048]
-	str	wzr, [x19,2048]
-	str	wzr, [x19,2048]
-	str	wzr, [x19,2048]
+	str	w0, [x19, 2048]
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
 	bl	nandc_wait_flash_ready
 	mov	w0, 238
-	str	w0, [x19,2056]
-	str	w22, [x19,2052]
-	adrp	x0, .LC40
+	str	w0, [x19, 2056]
+	str	w21, [x19, 2052]
 	mov	w1, w20
-	add	x0, x0, :lo12:.LC40
-	ldr	w2, [x19,2048]
-	ldr	w3, [x19,2048]
-	ldr	w4, [x19,2048]
+	adrp	x0, .LC37
+	add	x0, x0, :lo12:.LC37
+	ldr	w2, [x19, 2048]
+	ldr	w3, [x19, 2048]
+	ldr	w4, [x19, 2048]
 	bl	printk
 	bl	nandc_wait_flash_ready
-	str	wzr, [x19,2056]
-	str	wzr, [x19,2052]
+	str	wzr, [x19, 2056]
+	str	wzr, [x19, 2052]
 	and	w0, w20, 255
-	str	wzr, [x19,2052]
-	str	w0, [x19,2052]
+	str	wzr, [x19, 2052]
+	str	w0, [x19, 2052]
 	lsr	w0, w20, 8
-	str	w0, [x19,2052]
+	str	w0, [x19, 2052]
 	lsr	w20, w20, 16
-	str	w20, [x19,2052]
+	str	w20, [x19, 2052]
 	mov	w0, 48
-	str	w0, [x19,2056]
+	str	w0, [x19, 2056]
 	bl	nandc_wait_flash_ready
-	mov	x1, 0
-.L449:
-	ldr	w0, [x19,2048]
-	strb	w0, [x23,x1]
-	add	x1, x1, 1
-	cmp	x1, 16384
-	bne	.L449
+	mov	x0, 0
+.L457:
+	ldr	w1, [x19, 2048]
+	strb	w1, [x22, x0]
+	add	x0, x0, 1
+	cmp	x0, 16384
+	bne	.L457
 	mov	w0, 239
-	str	w0, [x19,2056]
+	str	w0, [x19, 2056]
 	mov	w0, 144
-	str	w0, [x19,2052]
+	str	w0, [x19, 2052]
 	mov	x0, 250
 	bl	__const_udelay
-	str	wzr, [x19,2048]
-	str	wzr, [x19,2048]
-	mov	w0, w21
-	str	wzr, [x19,2048]
-	str	wzr, [x19,2048]
-	bl	nandc_de_cs
-	ldr	x23, [sp,48]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 64
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
+	bl	nandc_de_cs.constprop.35
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 48
 	ret
 	.size	flash_read_otp_data, .-flash_read_otp_data
 	.align	2
 	.global	sandisk_prog_test_bad_block
 	.type	sandisk_prog_test_bad_block, %function
 sandisk_prog_test_bad_block:
-	stp	x29, x30, [sp, -64]!
-	adrp	x2, .LANCHOR0+1048
-	uxtb	w0, w0
+	stp	x29, x30, [sp, -48]!
+	and	x2, x0, 255
+	mov	x0, x2
+	add	x2, x2, 8
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x21, x22, [sp, 32]
+	mov	w22, w1
+	adrp	x1, .LANCHOR0+1056
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR2
-	ldr	x19, [x2,#:lo12:.LANCHOR0+1048]
-	add	x2, x20, :lo12:.LANCHOR2
-	str	x21, [sp,32]
-	ldrb	w3, [x2,37]
-	sxtw	x2, w0
-	add	x2, x2, 8
+	ldr	x19, [x1, #:lo12:.LANCHOR0+1056]
+	add	x1, x20, :lo12:.LANCHOR2
+	ldrb	w1, [x1, 37]
 	add	x2, x19, x2, lsl 8
-	cbnz	w3, .L466
-	mov	w3, 162
-.L466:
+	cbz	w1, .L461
+.L476:
 	ubfiz	x0, x0, 8, 8
-	str	w3, [x2,8]
+	str	w1, [x2, 8]
 	add	x19, x19, x0
 	mov	w0, 128
-	str	x1, [x29,56]
-	str	w0, [x19,2056]
-	and	w0, w1, 255
-	str	wzr, [x19,2052]
-	str	wzr, [x19,2052]
-	str	w0, [x19,2052]
-	lsr	w0, w1, 8
-	str	w0, [x19,2052]
-	lsr	w0, w1, 16
-	str	w0, [x19,2052]
+	str	w0, [x19, 2056]
+	and	w0, w22, 255
+	str	wzr, [x19, 2052]
+	str	wzr, [x19, 2052]
+	str	w0, [x19, 2052]
+	lsr	w0, w22, 8
+	str	w0, [x19, 2052]
+	lsr	w0, w22, 16
+	str	w0, [x19, 2052]
 	mov	w0, 16
-	str	w0, [x19,2056]
+	str	w0, [x19, 2056]
 	bl	nandc_wait_flash_ready
 	mov	w0, 112
-	str	w0, [x19,2056]
+	str	w0, [x19, 2056]
 	mov	x0, 1000
 	bl	__const_udelay
-	ldr	w2, [x19,2048]
-	ldr	x1, [x29,56]
+	ldr	w2, [x19, 2048]
 	cmp	w2, 255
-	bne	.L454
-	ldr	w2, [x19,2048]
-.L454:
+	bne	.L463
+	ldr	w2, [x19, 2048]
+.L463:
 	mov	w0, 5
 	ands	w21, w2, w0
-	beq	.L455
-	ldr	w0, [x20,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L455
-	adrp	x0, .LC41
-	add	x0, x0, :lo12:.LC41
+	beq	.L464
+	ldr	w0, [x20, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L464
+	adrp	x0, .LC38
+	mov	w1, w22
+	add	x0, x0, :lo12:.LC38
 	bl	printk
-.L455:
+.L464:
 	add	x20, x20, :lo12:.LANCHOR2
-	ldrb	w0, [x20,38]
-	cbz	w0, .L456
-	str	w0, [x19,2056]
-.L456:
+	ldrb	w0, [x20, 38]
+	cbz	w0, .L460
+	str	w0, [x19, 2056]
+.L460:
 	mov	w0, w21
-	ldr	x21, [sp,32]
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 64
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 48
 	ret
+.L461:
+	mov	w1, 162
+	b	.L476
 	.size	sandisk_prog_test_bad_block, .-sandisk_prog_test_bad_block
 	.align	2
 	.global	nandc_rdy_status
 	.type	nandc_rdy_status, %function
 nandc_rdy_status:
-	adrp	x0, .LANCHOR0+1048
+	adrp	x0, .LANCHOR0+1056
 	sub	sp, sp, #16
-	ldr	x0, [x0,#:lo12:.LANCHOR0+1048]
+	ldr	x0, [x0, #:lo12:.LANCHOR0+1056]
 	ldr	w0, [x0]
-	str	w0, [sp,8]
-	ldr	w0, [sp,8]
+	str	w0, [sp, 8]
+	ldr	w0, [sp, 8]
 	add	sp, sp, 16
 	ubfx	x0, x0, 9, 1
 	ret
@@ -2705,57 +2544,72 @@ nandc_rdy_status:
 	.type	nandc_bch_sel, %function
 nandc_bch_sel:
 	sub	sp, sp, #16
-	str	wzr, [sp,8]
-	ldr	w1, [sp,8]
+	str	wzr, [sp, 8]
+	ldr	w1, [sp, 8]
 	orr	w1, w1, 1
-	str	w1, [sp,8]
+	str	w1, [sp, 8]
 	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
-	ldrb	w2, [x1,1028]
-	strb	w0, [x1,1244]
+	ldrb	w2, [x1, 1028]
+	strb	w0, [x1, 1249]
 	cmp	w2, 9
-	ldr	x2, [x1,1048]
-	ldr	w1, [sp,8]
-	bne	.L469
-	str	w1, [x2,16]
+	bne	.L480
+	ldr	x1, [x1, 1056]
 	cmp	w0, 70
-	mov	w1, 0
-	beq	.L470
+	ldr	w2, [sp, 8]
+	str	w2, [x1, 16]
+	beq	.L486
 	cmp	w0, 60
-	mov	w1, 3
-	beq	.L470
+	beq	.L487
 	cmp	w0, 40
-	mov	w1, 2
-	csinc	w1, w1, wzr, eq
-.L470:
+	cset	w0, eq
+	add	w0, w0, 1
+.L481:
 	str	wzr, [sp]
-	ldr	w0, [sp]
-	bfi	w0, w1, 25, 3
-	str	w0, [sp]
+	ldr	w2, [sp]
+	bfi	w2, w0, 25, 3
+	str	w2, [sp]
 	ldr	w0, [sp]
 	orr	w0, w0, 1
 	str	w0, [sp]
 	ldr	w0, [sp]
-	str	w0, [x2,32]
-	b	.L468
-.L469:
-	str	w1, [x2,8]
+	str	w0, [x1, 32]
+.L479:
+	add	sp, sp, 16
+	ret
+.L486:
+	mov	w0, 0
+	b	.L481
+.L487:
+	mov	w0, 3
+	b	.L481
+.L480:
+	ldr	x2, [x1, 1056]
 	mov	w3, 16
-	str	wzr, [sp]
+	ldr	w1, [sp, 8]
 	cmp	w0, w3
+	str	w1, [x2, 8]
+	str	wzr, [sp]
 	ldr	w1, [sp]
 	bfi	w1, w3, 8, 8
 	str	w1, [sp]
 	ldr	w1, [sp]
 	and	w1, w1, -262145
 	str	w1, [sp]
-	beq	.L478
+	bne	.L483
+.L490:
+	ldr	w0, [sp]
+	and	w0, w0, -17
+	b	.L491
+.L483:
 	cmp	w0, 24
-	bne	.L474
+	bne	.L485
 	ldr	w0, [sp]
 	orr	w0, w0, 16
-	b	.L479
-.L474:
+.L491:
+	str	w0, [sp]
+	b	.L484
+.L485:
 	ldr	w1, [sp]
 	cmp	w0, 40
 	orr	w1, w1, 262144
@@ -2763,21 +2617,14 @@ nandc_bch_sel:
 	ldr	w1, [sp]
 	orr	w1, w1, 16
 	str	w1, [sp]
-	bne	.L473
-.L478:
-	ldr	w0, [sp]
-	and	w0, w0, -17
-.L479:
-	str	w0, [sp]
-.L473:
+	beq	.L490
+.L484:
 	ldr	w0, [sp]
 	orr	w0, w0, 1
 	str	w0, [sp]
 	ldr	w0, [sp]
-	str	w0, [x2,12]
-.L468:
-	add	sp, sp, 16
-	ret
+	str	w0, [x2, 12]
+	b	.L479
 	.size	nandc_bch_sel, .-nandc_bch_sel
 	.align	2
 	.global	zftl_flash_resume
@@ -2785,89 +2632,90 @@ nandc_bch_sel:
 zftl_flash_resume:
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR0
-	str	x23, [sp,48]
 	add	x0, x20, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	ldrb	w1, [x0,1028]
-	ldr	w2, [x0,1056]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	ldrb	w1, [x0, 1028]
+	ldr	w2, [x0, 1064]
 	cmp	w1, 9
-	ldr	x1, [x0,1048]
+	ldr	x1, [x0, 1056]
 	str	w2, [x1]
-	ldr	x1, [x0,1048]
-	ldr	w2, [x0,1060]
-	str	w2, [x1,4]
-	ldr	x1, [x0,1048]
-	ldr	w2, [x0,1064]
-	bne	.L481
-	str	w2, [x1,16]
-	ldr	w2, [x0,1068]
-	str	w2, [x1,32]
-	ldr	w2, [x0,1072]
-	str	w2, [x1,80]
-	ldr	w2, [x0,1076]
-	str	w2, [x1,84]
-	ldr	w2, [x0,1080]
-	str	w2, [x1,520]
-	ldr	w0, [x0,1084]
-	str	w0, [x1,8]
-	b	.L482
-.L481:
-	str	w2, [x1,8]
-	ldr	w2, [x0,1068]
-	str	w2, [x1,12]
-	ldr	w2, [x0,1072]
-	str	w2, [x1,304]
-	ldr	w2, [x0,1076]
-	str	w2, [x1,308]
-	ldr	w2, [x0,1080]
-	str	w2, [x1,336]
-	ldr	w0, [x0,1084]
-	str	w0, [x1,344]
-.L482:
+	ldr	x1, [x0, 1056]
+	ldr	w2, [x0, 1068]
+	str	w2, [x1, 4]
+	ldr	w2, [x0, 1072]
+	ldr	x1, [x0, 1056]
+	bne	.L493
+	str	w2, [x1, 16]
+	ldr	w2, [x0, 1076]
+	str	w2, [x1, 32]
+	ldr	w2, [x0, 1080]
+	str	w2, [x1, 80]
+	ldr	w2, [x0, 1084]
+	str	w2, [x1, 84]
+	ldr	w2, [x0, 1088]
+	str	w2, [x1, 520]
+	ldr	w0, [x0, 1092]
+	str	w0, [x1, 8]
+.L495:
+	add	x0, x20, :lo12:.LANCHOR0
 	mov	x19, 0
-	add	x21, x20, :lo12:.LANCHOR0
-	mov	w23, 2
-.L484:
-	add	x0, x21, x19, lsl 3
-	ldrb	w0, [x0,1272]
+	add	x23, x0, 1216
+	add	x21, x0, 1208
+	mov	w24, 2
+.L494:
+	lsl	x0, x19, 3
+	ldrb	w0, [x0, x23]
 	sub	w0, w0, #1
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 253
-	bhi	.L483
-	uxtb	w22, w19
+	bhi	.L496
+	and	w22, w19, 255
 	mov	w0, w22
 	bl	flash_reset
-	add	x0, x21, 1264
-	strb	w23, [x19,x0]
+	strb	w24, [x19, x21]
 	mov	w0, w22
 	bl	zftl_flash_enter_slc_mode
-.L483:
+.L496:
 	add	x19, x19, 1
 	cmp	x19, 4
-	bne	.L484
+	bne	.L494
 	add	x20, x20, :lo12:.LANCHOR0
-	ldrb	w0, [x20,1192]
-	cbz	w0, .L485
+	ldrb	w0, [x20, 1192]
+	cbz	w0, .L497
 	mov	w0, 1
 	bl	nandc_set_if_mode
 	mov	w0, w19
 	bl	flash_set_interface_mode
 	mov	w0, w19
 	bl	nandc_set_if_mode
-	ldr	w0, [x20,1072]
+	ldr	w0, [x20, 1080]
 	lsr	w0, w0, 8
 	bl	nandc_set_ddr_para
-.L485:
+.L497:
 	adrp	x0, .LANCHOR2+28
-	ldrb	w0, [x0,#:lo12:.LANCHOR2+28]
+	ldrb	w0, [x0, #:lo12:.LANCHOR2+28]
 	bl	nandc_bch_sel
-	ldr	x23, [sp,48]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
 	ldp	x29, x30, [sp], 64
 	ret
+.L493:
+	str	w2, [x1, 8]
+	ldr	w2, [x0, 1076]
+	str	w2, [x1, 12]
+	ldr	w2, [x0, 1080]
+	str	w2, [x1, 304]
+	ldr	w2, [x0, 1084]
+	str	w2, [x1, 308]
+	ldr	w2, [x0, 1088]
+	str	w2, [x1, 336]
+	ldr	w0, [x0, 1092]
+	str	w0, [x1, 344]
+	b	.L495
 	.size	zftl_flash_resume, .-zftl_flash_resume
 	.align	2
 	.global	rk_nandc_flash_ready
@@ -2886,282 +2734,285 @@ rk_nandc_flash_ready:
 nandc_iqr_wait_flash_ready:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	adrp	x19, .LANCHOR0
 	add	x19, x19, :lo12:.LANCHOR0
-	ldr	x0, [x19,1048]
+	ldr	x0, [x19, 1056]
 	bl	rk_nandc_rb_irq_flag_init
-	ldrb	w1, [x19,1028]
-	ldr	x0, [x19,1048]
+	ldrb	w1, [x19, 1028]
+	ldr	x0, [x19, 1056]
 	cmp	w1, 9
-	bne	.L492
-	ldr	w1, [x0,292]
-	orr	w1, w1, 2
-	str	w1, [x0,292]
-	ldr	w1, [x0,288]
+	bne	.L506
+	ldr	w1, [x0, 292]
 	orr	w1, w1, 2
-	str	w1, [x0,288]
-	b	.L493
-.L492:
-	ldr	w1, [x0,368]
+	str	w1, [x0, 292]
+	ldr	w1, [x0, 288]
 	orr	w1, w1, 2
-	str	w1, [x0,368]
-	ldr	w1, [x0,364]
-	orr	w1, w1, 2
-	str	w1, [x0,364]
-.L493:
+	str	w1, [x0, 288]
+.L507:
 	ldr	w1, [x0]
-	tbnz	x1, 9, .L494
+	tbnz	x1, 9, .L508
 	bl	wait_for_nand_flash_ready
-	b	.L491
-.L494:
-	mov	w1, 1
-	bl	nandc_irq_disable
-.L491:
-	ldr	x19, [sp,16]
+.L505:
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L506:
+	ldr	w1, [x0, 368]
+	orr	w1, w1, 2
+	str	w1, [x0, 368]
+	ldr	w1, [x0, 364]
+	orr	w1, w1, 2
+	str	w1, [x0, 364]
+	b	.L507
+.L508:
+	mov	w1, 1
+	bl	nandc_irq_disable
+	b	.L505
 	.size	nandc_iqr_wait_flash_ready, .-nandc_iqr_wait_flash_ready
 	.align	2
 	.global	flash_erase_duplane_block
 	.type	flash_erase_duplane_block, %function
 flash_erase_duplane_block:
-	stp	x29, x30, [sp, -96]!
+	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	adrp	x21, .LANCHOR0
-	str	x25, [sp,64]
-	stp	x19, x20, [sp,16]
-	uxtb	w19, w0
-	add	x0, x21, :lo12:.LANCHOR0
-	stp	x23, x24, [sp,48]
-	uxtb	w20, w1
-	mov	w24, w2
-	ldrb	w0, [x0,1153]
-	mov	w23, w3
+	stp	x19, x20, [sp, 16]
+	and	w19, w0, 255
+	adrp	x20, .LANCHOR0
+	add	x0, x20, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	mov	w22, w2
+	stp	x25, x26, [sp, 64]
+	mov	w21, w3
+	stp	x23, x24, [sp, 48]
+	and	w25, w1, 255
+	ldrb	w0, [x0, 1153]
 	cmp	w0, w19
-	bhi	.L497
+	bhi	.L512
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 1096
 	mov	w2, 695
-	add	x1, x1, 1112
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L497:
-	add	x1, x21, :lo12:.LANCHOR0
-	mov	w0, -1
-	ldrb	w2, [x1,1153]
-	cmp	w2, w19
-	bls	.L498
+.L512:
+	add	x0, x20, :lo12:.LANCHOR0
+	ldrb	w1, [x0, 1153]
+	cmp	w1, w19
+	bls	.L521
+	add	x19, x0, w19, sxtw
+	ldr	x26, [x0, 1056]
 	adrp	x0, .LANCHOR2
-	add	x19, x1, w19, sxtw
-	ldrb	w25, [x19,1248]
-	ldr	x19, [x1,1048]
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	mov	x22, x25
-	add	x25, x25, 8
-	add	x25, x19, x25, lsl 8
-	tbz	x0, 4, .L499
-	adrp	x0, .LC42
-	mov	w1, w22
-	add	x0, x0, :lo12:.LC42
-	mov	w2, w24
-	mov	w3, w23
+	ldrb	w23, [x19, 1196]
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	and	x19, x23, 255
+	add	x24, x19, 8
+	add	x24, x26, x24, lsl 8
+	tbz	x0, 4, .L514
+	adrp	x0, .LC39
+	mov	w3, w21
+	mov	w2, w22
+	mov	w1, w23
+	add	x0, x0, :lo12:.LC39
 	bl	printk
-.L499:
+.L514:
 	bl	nandc_wait_flash_ready
-	mov	w0, w22
+	mov	w0, w23
 	bl	nandc_cs
-	mov	w0, w22
-	cbnz	w20, .L500
+	mov	w0, w23
+	cbnz	w25, .L515
 	bl	zftl_flash_enter_slc_mode
-	b	.L501
-.L500:
-	bl	zftl_flash_exit_slc_mode
-.L501:
-	ubfiz	x4, x22, 8, 8
+.L516:
+	add	x19, x26, x19, lsl 8
 	mov	w0, 96
-	add	x19, x19, x4
-	str	w0, [x19,2056]
-	and	w0, w24, 255
-	str	w0, [x19,2052]
-	lsr	w0, w24, 8
-	str	w0, [x19,2052]
-	lsr	w0, w24, 16
-	str	w0, [x19,2052]
-	add	x0, x21, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1256]
-	cbz	w0, .L502
-	lsr	w0, w24, 24
-	str	w0, [x19,2052]
-.L502:
-	add	x0, x21, :lo12:.LANCHOR0
-	mov	w20, 0
-	ldrb	w0, [x0,1305]
-	cbnz	w0, .L503
+	str	w0, [x19, 2056]
+	and	w0, w22, 255
+	str	w0, [x19, 2052]
+	lsr	w0, w22, 8
+	str	w0, [x19, 2052]
+	lsr	w0, w22, 16
+	str	w0, [x19, 2052]
+	add	x0, x20, :lo12:.LANCHOR0
+	ldrb	w0, [x0, 1204]
+	cbz	w0, .L517
+	lsr	w0, w22, 24
+	str	w0, [x19, 2052]
+.L517:
+	add	x0, x20, :lo12:.LANCHOR0
+	ldrb	w0, [x0, 1250]
+	cbnz	w0, .L522
 	mov	w0, 208
-	str	w0, [x19,2056]
-	mov	w20, 5
+	str	w0, [x19, 2056]
+	mov	w23, 5
 	bl	nandc_wait_flash_ready
-	mov	x0, x25
+	mov	x0, x24
 	bl	flash_read_status
-	and	w20, w0, w20
-.L503:
+	and	w23, w0, w23
+.L518:
 	mov	w0, 96
-	add	x21, x21, :lo12:.LANCHOR0
-	str	w0, [x19,2056]
-	and	w0, w23, 255
-	str	w0, [x19,2052]
-	lsr	w0, w23, 8
-	str	w0, [x19,2052]
-	lsr	w0, w23, 16
-	str	w0, [x19,2052]
-	ldrb	w0, [x21,1256]
-	cbz	w0, .L504
-	lsr	w23, w23, 24
-	str	w23, [x19,2052]
-.L504:
+	add	x20, x20, :lo12:.LANCHOR0
+	str	w0, [x19, 2056]
+	and	w0, w21, 255
+	str	w0, [x19, 2052]
+	lsr	w0, w21, 8
+	str	w0, [x19, 2052]
+	lsr	w0, w21, 16
+	str	w0, [x19, 2052]
+	ldrb	w0, [x20, 1204]
+	cbz	w0, .L519
+	lsr	w3, w21, 24
+	str	w3, [x19, 2052]
+.L519:
 	mov	w0, 208
-	str	w0, [x19,2056]
+	str	w0, [x19, 2056]
 	mov	w19, 5
 	bl	nandc_iqr_wait_flash_ready
 	bl	nandc_wait_flash_ready
-	mov	x0, x25
+	mov	x0, x24
 	bl	flash_read_status
 	mov	w2, w0
-	mov	w0, w22
-	str	x2, [x29,88]
-	bl	nandc_de_cs
-	ldr	x2, [x29,88]
+	bl	nandc_de_cs.constprop.35
 	and	w19, w2, w19
-	orr	w19, w19, w20
-	cbz	w19, .L505
-	adrp	x0, .LC43
-	mov	w1, w24
-	add	x0, x0, :lo12:.LC43
+	orr	w19, w19, w23
+	cbz	w19, .L520
+	adrp	x0, .LC40
+	mov	w1, w22
+	add	x0, x0, :lo12:.LC40
 	bl	printk
-.L505:
+.L520:
 	mov	w0, w19
-.L498:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldr	x25, [sp,64]
-	ldp	x29, x30, [sp], 96
+.L511:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 80
 	ret
+.L515:
+	bl	zftl_flash_exit_slc_mode
+	b	.L516
+.L522:
+	mov	w23, 0
+	b	.L518
+.L521:
+	mov	w0, -1
+	b	.L511
 	.size	flash_erase_duplane_block, .-flash_erase_duplane_block
 	.align	2
 	.global	flash_erase_block_en
 	.type	flash_erase_block_en, %function
 flash_erase_block_en:
-	stp	x29, x30, [sp, -80]!
+	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR0
-	stp	x25, x26, [sp,64]
-	uxtb	w25, w1
-	add	x1, x20, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	uxtb	w22, w0
-	mov	w0, 24
-	ldrb	w19, [x1,1257]
+	stp	x23, x24, [sp, 48]
 	mov	w23, w2
-	sub	w19, w0, w19
-	mov	w0, 1
-	lsl	w19, w0, w19
-	ldrb	w0, [x1,1153]
+	stp	x21, x22, [sp, 32]
+	and	w22, w0, 255
+	adrp	x0, .LANCHOR0
+	add	x2, x0, :lo12:.LANCHOR0
+	stp	x19, x20, [sp, 16]
+	mov	w19, 24
+	stp	x25, x26, [sp, 64]
+	and	w25, w1, 255
+	str	x27, [sp, 80]
+	mov	x24, x0
+	ldrb	w1, [x2, 1205]
+	sub	w1, w19, w1
+	mov	w19, 1
+	lsl	w19, w19, w1
+	ldrb	w1, [x2, 1153]
 	sub	w19, w19, #1
-	cmp	w0, w22
-	and	w19, w19, w2
-	bhi	.L521
+	and	w19, w19, w23
+	cmp	w1, w22
+	bhi	.L537
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 1128
 	mov	w2, 757
-	add	x1, x1, 1144
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L521:
-	add	x1, x20, :lo12:.LANCHOR0
-	mov	w0, -1
-	ldrb	w2, [x1,1153]
-	cmp	w2, w22
-	bls	.L522
-	add	x0, x1, w22, sxtw
-	ldrb	w24, [x0,1248]
+.L537:
+	add	x0, x24, :lo12:.LANCHOR0
+	ldrb	w1, [x0, 1153]
+	cmp	w1, w22
+	bls	.L544
+	add	x1, x0, w22, sxtw
+	ldr	x27, [x0, 1056]
 	adrp	x0, .LANCHOR2
-	ldr	x26, [x1,1048]
-	mov	x21, x24
-	add	x24, x24, 8
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	add	x24, x26, x24, lsl 8
-	tbz	x0, 4, .L523
-	adrp	x0, .LC44
-	mov	w1, w21
-	add	x0, x0, :lo12:.LC44
-	mov	w2, w23
+	ldrb	w21, [x1, 1196]
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	and	x20, x21, 255
+	add	x26, x20, 8
+	add	x26, x27, x26, lsl 8
+	tbz	x0, 4, .L539
+	adrp	x0, .LC41
 	mov	w3, w25
+	mov	w2, w23
+	mov	w1, w21
+	add	x0, x0, :lo12:.LC41
 	bl	printk
-.L523:
+.L539:
 	bl	nandc_wait_flash_ready
 	mov	w0, w21
 	bl	nandc_cs
 	mov	w0, w21
-	cbnz	w25, .L524
+	cbnz	w25, .L540
 	bl	zftl_flash_enter_slc_mode
-	b	.L525
-.L524:
-	bl	zftl_flash_exit_slc_mode
-.L525:
-	ubfiz	x3, x21, 8, 8
-	mov	w0, 96
-	add	x3, x26, x3
-	str	w0, [x3,2056]
-	and	w0, w19, 255
-	str	w0, [x3,2052]
-	lsr	w0, w19, 8
-	str	w0, [x3,2052]
-	lsr	w0, w19, 16
-	str	w0, [x3,2052]
-	add	x0, x20, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1256]
-	cbz	w0, .L526
+.L541:
+	add	x0, x27, x20, lsl 8
+	mov	w1, 96
+	str	w1, [x0, 2056]
+	and	w1, w19, 255
+	str	w1, [x0, 2052]
+	lsr	w1, w19, 8
+	str	w1, [x0, 2052]
+	lsr	w1, w19, 16
+	str	w1, [x0, 2052]
+	add	x1, x24, :lo12:.LANCHOR0
+	ldrb	w1, [x1, 1204]
+	cbz	w1, .L542
 	lsr	w19, w19, 24
-	str	w19, [x3,2052]
-.L526:
-	mov	w0, 208
-	str	w0, [x3,2056]
+	str	w19, [x0, 2052]
+.L542:
+	mov	w1, 208
+	str	w1, [x0, 2056]
 	bl	nandc_iqr_wait_flash_ready
 	bl	nandc_wait_flash_ready
-	mov	x0, x24
+	mov	x0, x26
 	bl	flash_read_status
-	mov	w19, w0
-	mov	w0, w21
-	bl	nandc_de_cs
-	mov	w3, 5
-	ands	w3, w19, w3
-	beq	.L527
-	add	x20, x20, :lo12:.LANCHOR0
-	adrp	x0, .LC45
-	add	x0, x0, :lo12:.LC45
+	mov	w3, w0
+	bl	nandc_de_cs.constprop.35
+	mov	w0, 5
+	ands	w3, w3, w0
+	beq	.L543
+	add	x0, x24, :lo12:.LANCHOR0
 	mov	w1, w22
-	ldrh	w2, [x20,2]
+	ldrh	w2, [x0, 2]
+	adrp	x0, .LC42
+	add	x0, x0, :lo12:.LC42
 	udiv	w2, w23, w2
 	bl	printk
 	mov	w3, -1
-.L527:
+.L543:
 	mov	w0, w3
-.L522:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 80
+.L536:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldr	x27, [sp, 80]
+	ldp	x29, x30, [sp], 96
 	ret
+.L540:
+	bl	zftl_flash_exit_slc_mode
+	b	.L541
+.L544:
+	mov	w0, -1
+	b	.L536
 	.size	flash_erase_block_en, .-flash_erase_block_en
 	.align	2
 	.global	flash_erase_block
@@ -3179,52 +3030,54 @@ flash_erase_block:
 	.global	flash_erase_all
 	.type	flash_erase_all, %function
 flash_erase_all:
-	stp	x29, x30, [sp, -64]!
+	stp	x29, x30, [sp, -80]!
 	adrp	x0, .LANCHOR2
 	add	x0, x0, :lo12:.LANCHOR2
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR0
+	stp	x23, x24, [sp, 48]
+	add	x20, x20, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	add	x23, x20, 1024
+	str	x25, [sp, 64]
+	mov	x24, x20
 	mov	w19, 0
-	ldrb	w1, [x0,21]
-	ldrh	w20, [x0,22]
-	adrp	x0, .LANCHOR0
-	add	x23, x0, :lo12:.LANCHOR0
-	mov	x21, x0
-	mul	w20, w1, w20
-	uxth	w20, w20
-.L540:
-	ldrb	w0, [x23,1153]
+	ldrb	w1, [x0, 21]
+	ldrh	w21, [x0, 22]
+	mul	w21, w21, w1
+	and	w21, w21, 65535
+.L558:
+	ldrb	w0, [x20, 1153]
 	cmp	w0, w19
-	bls	.L544
+	bhi	.L561
+	mov	w1, 0
+	adrp	x0, .LC43
+	add	x0, x0, :lo12:.LC43
+	bl	printk
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldr	x25, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	ret
+.L561:
 	add	x0, x23, w19, sxtw
-	ldrb	w24, [x0,1248]
 	mov	w22, 0
-.L541:
-	cmp	w20, w22, uxth
-	bls	.L545
-	add	x0, x21, :lo12:.LANCHOR0
-	ldrh	w1, [x0,2]
-	mov	w0, w24
-	mul	w1, w22, w1
+	ldrb	w25, [x0, 172]
+.L559:
+	cmp	w21, w22, uxth
+	bhi	.L560
+	add	w19, w19, 1
+	and	w19, w19, 65535
+	b	.L558
+.L560:
+	ldrh	w1, [x24, 2]
+	mov	w0, w25
+	mul	w1, w1, w22
 	add	w22, w22, 1
 	bl	flash_erase_block
-	b	.L541
-.L545:
-	add	w19, w19, 1
-	uxth	w19, w19
-	b	.L540
-.L544:
-	adrp	x0, .LC46
-	mov	w1, 0
-	add	x0, x0, :lo12:.LC46
-	bl	printk
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 64
-	ret
+	b	.L559
 	.size	flash_erase_all, .-flash_erase_all
 	.align	2
 	.global	rk_nandc_flash_xfer_completed
@@ -3242,265 +3095,265 @@ rk_nandc_flash_xfer_completed:
 	.type	nandc_xfer_start, %function
 nandc_xfer_start:
 	stp	x29, x30, [sp, -80]!
-	uxtb	w1, w1
+	and	w1, w1, 255
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR0
-	str	x21, [sp,32]
-	add	x4, x20, :lo12:.LANCHOR0
-	uxtb	w21, w0
+	str	x21, [sp, 32]
+	and	w21, w0, 255
 	mov	x0, x2
+	add	x2, x20, :lo12:.LANCHOR0
 	and	w6, w21, 1
-	add	w5, w1, 1
-	ldrb	w2, [x4,1028]
-	cmp	w2, 9
-	bne	.L548
-	str	wzr, [x29,56]
-	mov	w2, 1
-	ubfx	x5, x5, 1, 6
-	ldr	w1, [x29,56]
+	ldrb	w4, [x2, 1028]
+	cmp	w4, 9
+	add	w4, w1, 1
+	bne	.L566
+	str	wzr, [x29, 56]
+	mov	w5, 1
+	ubfx	x4, x4, 1, 6
+	ldr	w1, [x29, 56]
 	bfi	w1, w6, 1, 1
-	str	w1, [x29,56]
-	ldr	w1, [x29,56]
+	str	w1, [x29, 56]
+	ldr	w1, [x29, 56]
 	orr	w1, w1, 8
-	str	w1, [x29,56]
-	ldr	w1, [x29,56]
-	bfi	w1, w2, 5, 2
-	str	w1, [x29,56]
-	ldr	w1, [x29,56]
+	str	w1, [x29, 56]
+	ldr	w1, [x29, 56]
+	bfi	w1, w5, 5, 2
+	str	w1, [x29, 56]
+	ldr	w1, [x29, 56]
 	orr	w1, w1, 536870912
-	str	w1, [x29,56]
-	ldr	w1, [x29,56]
+	str	w1, [x29, 56]
+	ldr	w1, [x29, 56]
 	orr	w1, w1, 1024
-	str	w1, [x29,56]
-	ldr	w1, [x29,56]
+	str	w1, [x29, 56]
+	ldr	w1, [x29, 56]
 	and	w1, w1, -17
-	str	w1, [x29,56]
-	ldr	w1, [x29,56]
-	bfi	w1, w5, 22, 6
-	str	w1, [x29,56]
-	ldr	w1, [x29,56]
+	str	w1, [x29, 56]
+	ldr	w1, [x29, 56]
+	bfi	w1, w4, 22, 6
+	str	w1, [x29, 56]
+	ldr	w1, [x29, 56]
 	orr	w1, w1, 128
-	str	w1, [x29,56]
-	ldrb	w1, [x4,1193]
-	cbz	w1, .L549
-	ldrb	w1, [x4,1240]
-	cbz	w1, .L549
-	ldr	w1, [x29,56]
+	str	w1, [x29, 56]
+	ldrb	w1, [x2, 1251]
+	cbz	w1, .L567
+	ldrb	w1, [x2, 1252]
+	cbz	w1, .L567
+	ldr	w1, [x29, 56]
 	orr	w1, w1, 512
-	str	w1, [x29,56]
-.L549:
-	ldr	w1, [x29,56]
+	str	w1, [x29, 56]
+.L567:
+	ldr	w1, [x29, 56]
 	add	x20, x20, :lo12:.LANCHOR0
 	mov	w2, w21
 	ubfx	x1, x1, 22, 6
+	str	x3, [x20, 1272]
 	lsl	w1, w1, 10
-	str	x3, [x20,1216]
-	str	x0, [x20,1208]
+	str	x0, [x20, 1264]
 	bl	rknand_dma_map_single
-	str	w0, [x20,1224]
-	ldr	w1, [x29,56]
+	str	w0, [x20, 1280]
+	ldr	w1, [x29, 56]
 	mov	w2, w21
-	ldr	x0, [x20,1216]
+	ldr	x0, [x20, 1272]
 	ubfx	x1, x1, 22, 6
 	lsl	w1, w1, 2
 	bl	rknand_dma_map_single
-	str	w0, [x20,1228]
+	str	w0, [x20, 1284]
 	mov	w1, 1
-	str	w1, [x20,1232]
-	ldr	x1, [x20,1048]
-	cmp	w21, wzr
-	ldr	w2, [x20,1224]
-	str	w2, [x1,52]
+	str	w1, [x20, 1288]
+	ldr	x1, [x20, 1056]
+	cmp	w21, 0
+	ldr	w2, [x20, 1280]
+	str	w2, [x1, 52]
 	mov	w2, 16
-	str	w0, [x1,56]
-	ldr	w0, [x1,48]
-	str	w0, [x29,64]
-	ldr	w0, [x29,64]
+	str	w0, [x1, 56]
+	ldr	w0, [x1, 48]
+	str	w0, [x29, 64]
+	ldr	w0, [x29, 64]
 	bfi	w0, w2, 9, 5
-	str	w0, [x29,64]
+	str	w0, [x29, 64]
 	mov	w2, 2
-	ldr	w0, [x29,64]
+	ldr	w0, [x29, 64]
 	orr	w0, w0, 448
-	str	w0, [x29,64]
-	ldr	w0, [x29,64]
+	str	w0, [x29, 64]
+	ldr	w0, [x29, 64]
 	bfi	w0, w2, 3, 3
-	str	w0, [x29,64]
+	str	w0, [x29, 64]
 	cset	w2, eq
-	ldr	w0, [x29,64]
+	ldr	w0, [x29, 64]
 	orr	w0, w0, 4
-	str	w0, [x29,64]
-	ldr	w0, [x29,64]
+	str	w0, [x29, 64]
+	ldr	w0, [x29, 64]
 	bfi	w0, w2, 1, 1
-	str	w0, [x29,64]
-	ldrh	w2, [x20,1242]
-	ldr	w0, [x29,64]
+	str	w0, [x29, 64]
+	ldrh	w2, [x20, 1296]
+	ldr	w0, [x29, 64]
 	orr	w0, w0, 1
-	str	w0, [x29,64]
-	ldr	w0, [x29,64]
+	str	w0, [x29, 64]
+	ldr	w0, [x29, 64]
 	bfi	w0, w2, 16, 11
-	str	w0, [x29,64]
-	ldr	w0, [x29,64]
-	str	w0, [x1,48]
-	ldr	w0, [x29,56]
-	str	w0, [x1,16]
-	ldr	w0, [x29,56]
+	str	w0, [x29, 64]
+	ldr	w0, [x29, 64]
+	str	w0, [x1, 48]
+	ldr	w0, [x29, 56]
+	str	w0, [x1, 16]
+	ldr	w0, [x29, 56]
 	orr	w0, w0, 4
-	str	w0, [x29,56]
-	ldr	w0, [x29,56]
-	str	w0, [x1,16]
-	b	.L547
-.L548:
-	ldr	x2, [x4,1048]
+	str	w0, [x29, 56]
+	ldr	w0, [x29, 56]
+	str	w0, [x1, 16]
+.L565:
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
+	ldp	x29, x30, [sp], 80
+	ret
+.L566:
+	ldr	x5, [x2, 1056]
 	mov	w7, 16
-	ubfx	x5, x5, 1, 6
-	ldr	w2, [x2,12]
-	str	w2, [x29,72]
-	ldr	w2, [x29,72]
-	bfi	w2, w7, 8, 8
-	str	w2, [x29,72]
-	ldr	w2, [x29,72]
-	and	w2, w2, -9
-	str	w2, [x29,72]
-	ldr	w2, [x29,72]
-	and	w2, w2, -225
-	str	w2, [x29,72]
-	str	wzr, [x29,56]
-	ldr	w2, [x29,56]
-	bfi	w2, w6, 1, 1
-	str	w2, [x29,56]
+	ubfx	x4, x4, 1, 6
+	ldr	w5, [x5, 12]
+	str	w5, [x29, 72]
+	ldr	w5, [x29, 72]
+	bfi	w5, w7, 8, 8
+	str	w5, [x29, 72]
+	ldr	w5, [x29, 72]
+	and	w5, w5, -9
+	str	w5, [x29, 72]
+	ldr	w5, [x29, 72]
+	and	w5, w5, -225
+	str	w5, [x29, 72]
+	str	wzr, [x29, 56]
+	ldr	w5, [x29, 56]
+	bfi	w5, w6, 1, 1
+	str	w5, [x29, 56]
 	mov	w6, 1
-	ldr	w2, [x29,56]
-	orr	w2, w2, 8
-	str	w2, [x29,56]
-	ldr	w2, [x29,56]
-	bfi	w2, w6, 5, 2
-	str	w2, [x29,56]
-	ldr	w2, [x29,56]
-	orr	w2, w2, 536870912
-	str	w2, [x29,56]
-	ldr	w2, [x29,56]
-	orr	w2, w2, 1024
-	str	w2, [x29,56]
-	ldr	w2, [x29,56]
-	and	w2, w2, -17
-	str	w2, [x29,56]
-	ldr	w2, [x29,56]
-	bfi	w2, w5, 22, 6
-	str	w2, [x29,56]
-	cbz	w21, .L551
-	ldrb	w2, [x4,1244]
-	ubfx	x1, x1, 1, 7
-	mov	w5, 128
-	cmp	w2, 25
-	mov	w2, 64
-	csel	w2, w2, w5, cc
-	add	x1, x3, x1, lsl 2
-	mov	w5, 0
-.L553:
-	cmp	x3, x1
-	add	w7, w5, w2
-	beq	.L555
-	ldrh	w6, [x3,2]
-	and	x5, x5, 4294967292
-	ldr	x8, [x4,1200]
-	ldrh	w9, [x3],4
-	orr	w6, w9, w6, lsl 16
-	str	w6, [x8,x5]
-	mov	w5, w7
-	b	.L553
-.L551:
-	ldr	x1, [x4,1200]
-	str	w6, [x1]
-.L555:
+	ldr	w5, [x29, 56]
+	orr	w5, w5, 8
+	str	w5, [x29, 56]
+	ldr	w5, [x29, 56]
+	bfi	w5, w6, 5, 2
+	str	w5, [x29, 56]
+	ldr	w5, [x29, 56]
+	orr	w5, w5, 536870912
+	str	w5, [x29, 56]
+	ldr	w5, [x29, 56]
+	orr	w5, w5, 1024
+	str	w5, [x29, 56]
+	ldr	w5, [x29, 56]
+	and	w5, w5, -17
+	str	w5, [x29, 56]
+	ldr	w5, [x29, 56]
+	bfi	w5, w4, 22, 6
+	str	w5, [x29, 56]
+	cbz	w21, .L569
+	ldrb	w4, [x2, 1249]
+	lsr	w1, w1, 1
+	mov	w6, 64
+	mov	x5, 0
+	cmp	w4, 25
+	mov	w4, 128
+	csel	w6, w6, w4, cc
+	mov	w4, 0
+.L571:
+	add	w7, w6, w4
+	cmp	w1, w5
+	bgt	.L572
+.L573:
 	add	x20, x20, :lo12:.LANCHOR0
 	mov	w2, w21
-	ldr	x1, [x20,1200]
-	str	x1, [x20,1216]
-	ldr	w1, [x29,56]
-	str	x0, [x20,1208]
+	ldr	x1, [x20, 1256]
+	str	x1, [x20, 1272]
+	ldr	w1, [x29, 56]
+	str	x0, [x20, 1264]
 	ubfx	x1, x1, 22, 6
 	lsl	w1, w1, 10
 	bl	rknand_dma_map_single
-	str	w0, [x20,1224]
-	ldr	w1, [x29,56]
+	ldr	w1, [x29, 56]
 	mov	w2, w21
-	ldr	x0, [x20,1216]
+	str	w0, [x20, 1280]
+	ldr	x0, [x20, 1272]
 	ubfx	x1, x1, 22, 6
 	lsl	w1, w1, 7
 	bl	rknand_dma_map_single
-	str	w0, [x20,1228]
-	ldr	x1, [x20,1048]
+	str	w0, [x20, 1284]
 	mov	w0, 1
-	str	w0, [x20,1232]
+	str	w0, [x20, 1288]
+	ldr	x0, [x20, 1056]
 	mov	w2, 16
-	ldr	w0, [x20,1224]
-	cmp	w21, wzr
-	str	w0, [x1,20]
-	ldr	w0, [x20,1228]
-	str	w0, [x1,24]
-	str	wzr, [x29,64]
-	ldr	w0, [x29,64]
-	bfi	w0, w2, 9, 5
-	str	w0, [x29,64]
+	ldr	w1, [x20, 1280]
+	cmp	w21, 0
+	str	w1, [x0, 20]
+	ldr	w1, [x20, 1284]
+	str	w1, [x0, 24]
+	str	wzr, [x29, 64]
+	ldr	w1, [x29, 64]
+	bfi	w1, w2, 9, 5
+	str	w1, [x29, 64]
 	mov	w2, 2
-	ldr	w0, [x29,64]
-	orr	w0, w0, 448
-	str	w0, [x29,64]
-	ldr	w0, [x29,64]
-	bfi	w0, w2, 3, 3
-	str	w0, [x29,64]
+	ldr	w1, [x29, 64]
+	orr	w1, w1, 448
+	str	w1, [x29, 64]
+	ldr	w1, [x29, 64]
+	bfi	w1, w2, 3, 3
+	str	w1, [x29, 64]
 	cset	w2, eq
-	ldr	w0, [x29,64]
-	orr	w0, w0, 4
-	str	w0, [x29,64]
-	ldr	w0, [x29,64]
-	bfi	w0, w2, 1, 1
-	str	w0, [x29,64]
-	ldr	w0, [x29,64]
-	orr	w0, w0, 1
-	str	w0, [x29,64]
-	ldr	w0, [x29,64]
-	str	w0, [x1,16]
-	ldr	w0, [x29,72]
-	str	w0, [x1,12]
-	ldr	w0, [x29,56]
-	str	w0, [x1,8]
-	ldr	w0, [x29,56]
-	orr	w0, w0, 4
-	str	w0, [x29,56]
-	ldr	w0, [x29,56]
-	str	w0, [x1,8]
-.L547:
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
-	ldp	x29, x30, [sp], 80
-	ret
+	ldr	w1, [x29, 64]
+	orr	w1, w1, 4
+	str	w1, [x29, 64]
+	ldr	w1, [x29, 64]
+	bfi	w1, w2, 1, 1
+	str	w1, [x29, 64]
+	ldr	w1, [x29, 64]
+	orr	w1, w1, 1
+	str	w1, [x29, 64]
+	ldr	w1, [x29, 64]
+	str	w1, [x0, 16]
+	ldr	w1, [x29, 72]
+	str	w1, [x0, 12]
+	ldr	w1, [x29, 56]
+	str	w1, [x0, 8]
+	ldr	w1, [x29, 56]
+	orr	w1, w1, 4
+	str	w1, [x29, 56]
+	ldr	w1, [x29, 56]
+	str	w1, [x0, 8]
+	b	.L565
+.L572:
+	ldr	x8, [x2, 1256]
+	and	x4, x4, 4294967292
+	ldr	w9, [x3, x5, lsl 2]
+	add	x5, x5, 1
+	str	w9, [x8, x4]
+	mov	w4, w7
+	b	.L571
+.L569:
+	ldr	x1, [x2, 1256]
+	str	w6, [x1]
+	b	.L573
 	.size	nandc_xfer_start, .-nandc_xfer_start
 	.align	2
 	.global	nandc_set_seed
 	.type	nandc_set_seed, %function
 nandc_set_seed:
 	adrp	x1, .LANCHOR1
-	and	w0, w0, 127
 	add	x1, x1, :lo12:.LANCHOR1
-	add	x1, x1, 1168
-	ldrh	w1, [x1,w0,uxtw 1]
+	and	x0, x0, 127
+	add	x1, x1, 1152
+	ldrh	w1, [x1, x0, lsl 1]
 	adrp	x0, .LANCHOR0
 	add	x0, x0, :lo12:.LANCHOR0
 	orr	w2, w1, -1073741824
-	ldrb	w3, [x0,1240]
-	cmp	w3, wzr
+	ldrb	w3, [x0, 1252]
+	cmp	w3, 0
 	csel	w1, w2, w1, ne
-	ldrb	w2, [x0,1028]
-	ldr	x0, [x0,1048]
+	ldrb	w2, [x0, 1028]
+	ldr	x0, [x0, 1056]
 	cmp	w2, 9
-	bne	.L565
-	str	w1, [x0,520]
-	b	.L563
-.L565:
-	str	w1, [x0,336]
-.L563:
+	bne	.L584
+	str	w1, [x0, 520]
+	ret
+.L584:
+	str	w1, [x0, 336]
 	ret
 	.size	nandc_set_seed, .-nandc_set_seed
 	.align	2
@@ -3509,43 +3362,45 @@ nandc_set_seed:
 zftl_flash_de_init:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x19, .LANCHOR0
+	stp	x19, x20, [sp, 16]
 	bl	nandc_wait_flash_ready
-	add	x1, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x19,#:lo12:.LANCHOR0]
-	cbz	w0, .L570
-	ldrb	w0, [x1,1154]
-	cbnz	w0, .L570
-	ldrb	w1, [x1,1028]
-	cmp	w1, 9
-	beq	.L570
-	bl	zftl_flash_exit_slc_mode
-.L570:
+	adrp	x4, .LANCHOR0
+	mov	x19, x4
+	ldrb	w1, [x4, #:lo12:.LANCHOR0]
+	cbz	w1, .L589
+	add	x0, x4, :lo12:.LANCHOR0
+	ldrb	w1, [x0, 1154]
+	cbnz	w1, .L589
+	ldrb	w0, [x0, 1028]
+	cmp	w0, 9
+	beq	.L589
 	mov	w0, 0
+	bl	zftl_flash_exit_slc_mode
+.L589:
 	add	x20, x19, :lo12:.LANCHOR0
+	mov	w0, 0
 	bl	hynix_reconfig_rr_para
-	ldrb	w0, [x20,1192]
-	cbz	w0, .L571
-	ldrb	w0, [x20,1304]
-	tbz	x0, 0, .L571
+	ldrb	w0, [x20, 1192]
+	cbz	w0, .L590
+	ldrb	w0, [x20, 1248]
+	tbz	x0, 0, .L590
 	mov	w0, 1
 	bl	flash_set_interface_mode
 	mov	w0, 1
 	bl	nandc_set_if_mode
-	strb	wzr, [x20,1192]
-.L571:
+	strb	wzr, [x20, 1192]
+.L590:
 	add	x19, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x19,1240]
-	cbz	w0, .L572
+	ldrb	w0, [x19, 1252]
+	cbz	w0, .L591
 	mov	w0, 0
-	strb	wzr, [x19,1240]
+	strb	wzr, [x19, 1252]
 	bl	nandc_set_seed
 	mov	w0, 1
-	strb	w0, [x19,1240]
-.L572:
+	strb	w0, [x19, 1252]
+.L591:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	zftl_flash_de_init, .-zftl_flash_de_init
@@ -3553,171 +3408,132 @@ zftl_flash_de_init:
 	.global	nandc_randomizer_enable
 	.type	nandc_randomizer_enable, %function
 nandc_randomizer_enable:
-	adrp	x1, .LANCHOR0+1240
-	strb	w0, [x1,#:lo12:.LANCHOR0+1240]
+	adrp	x1, .LANCHOR0+1252
+	strb	w0, [x1, #:lo12:.LANCHOR0+1252]
 	ret
 	.size	nandc_randomizer_enable, .-nandc_randomizer_enable
 	.align	2
 	.global	nandc_get_chip_if
 	.type	nandc_get_chip_if, %function
 nandc_get_chip_if:
-	adrp	x1, .LANCHOR0+1048
-	uxtb	x0, w0
-	add	x0, x0, 8
-	ldr	x1, [x1,#:lo12:.LANCHOR0+1048]
-	add	x0, x1, x0, lsl 8
+	adrp	x1, .LANCHOR0+1056
+	ubfiz	x0, x0, 8, 8
+	add	x0, x0, 2048
+	ldr	x1, [x1, #:lo12:.LANCHOR0+1056]
+	add	x0, x1, x0
 	ret
 	.size	nandc_get_chip_if, .-nandc_get_chip_if
 	.align	2
-	.global	zbuf_init
-	.type	zbuf_init, %function
-zbuf_init:
-	stp	x29, x30, [sp, -48]!
-	adrp	x0, .LANCHOR0
-	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	add	x19, x0, :lo12:.LANCHOR0
-	mov	w20, 0
-	stp	x21, x22, [sp,32]
-	add	x19, x19, 1312
-	mov	x22, x0
-.L591:
-	add	x21, x22, :lo12:.LANCHOR0
-	uxtb	w0, w20
-	add	w1, w0, 1
-	strb	w0, [x19,1]
-	strb	w1, [x19]
-	add	w20, w20, 1
-	ldrb	w0, [x21,3360]
-	add	x19, x19, 64
-	strb	wzr, [x19,-62]
-	str	xzr, [x19,-48]
-	lsl	w0, w0, 9
-	bl	ftl_malloc
-	str	x0, [x19,-56]
-	mov	w0, 64
-	bl	ftl_malloc
-	str	x0, [x19,-40]
-	cmp	w20, 32
-	bne	.L591
-	strb	w20, [x21,3362]
-	mov	w0, -1
-	strb	wzr, [x21,3361]
-	strb	w0, [x21,3296]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 48
-	ret
-	.size	zbuf_init, .-zbuf_init
-	.align	2
 	.global	buf_reinit
 	.type	buf_reinit, %function
 buf_reinit:
 	adrp	x0, .LANCHOR0
-	mov	w2, 0
 	add	x1, x0, :lo12:.LANCHOR0
-	add	x1, x1, 1312
-.L594:
-	uxtb	w3, w2
-	add	w2, w2, 1
+	add	x1, x1, 1304
+	mov	w2, 0
+.L611:
+	and	w3, w2, 255
+	strb	wzr, [x1, 2]
 	add	w4, w3, 1
-	strb	w3, [x1,1]
+	strb	w3, [x1, 1]
 	strb	w4, [x1]
+	add	w2, w2, 1
+	str	xzr, [x1, 16]
 	cmp	w2, 32
-	strb	wzr, [x1,2]
 	add	x1, x1, 64
-	str	xzr, [x1,-48]
-	bne	.L594
+	bne	.L611
 	add	x0, x0, :lo12:.LANCHOR0
 	mov	w1, -1
-	strb	wzr, [x0,3361]
-	strb	w1, [x0,3296]
-	strb	w2, [x0,3362]
+	strb	wzr, [x0, 3352]
+	strb	w1, [x0, 3288]
+	strb	w2, [x0, 3353]
 	ret
 	.size	buf_reinit, .-buf_reinit
 	.align	2
 	.global	buf_add_tail
 	.type	buf_add_tail, %function
 buf_add_tail:
-	stp	x29, x30, [sp, -32]!
+	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	mov	x20, x0
+	stp	x19, x20, [sp, 16]
+	mov	x19, x0
+	str	x21, [sp, 32]
 	mov	w0, -1
 	strb	w0, [x1]
-	mov	x19, x1
-	ldrb	w1, [x20]
+	mov	x20, x1
+	ldrb	w1, [x19]
 	cmp	w1, 255
-	bne	.L602
-	ldrb	w0, [x19,1]
+	bne	.L619
+	ldrb	w0, [x20, 1]
 	cmp	w0, 255
-	bne	.L598
+	bne	.L615
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 1408
 	mov	w2, 74
-	add	x1, x1, 1424
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L598:
-	ldrb	w0, [x19,1]
-	strb	w0, [x20]
-	b	.L596
-.L602:
+.L615:
+	ldrb	w0, [x20, 1]
+	strb	w0, [x19]
+.L613:
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	ret
+.L619:
 	adrp	x0, .LANCHOR0
-	add	x0, x0, :lo12:.LANCHOR0
-	add	x0, x0, 1312
-.L603:
-	mov	w20, w1
-	sbfiz	x1, x1, 6, 32
-	ldrb	w1, [x0,x1]
+	add	x2, x0, :lo12:.LANCHOR0
+	add	x2, x2, 1304
+	mov	x19, x0
+.L620:
+	sbfiz	x0, x1, 6, 32
+	mov	w21, w1
+	ldrb	w1, [x2, x0]
 	cmp	w1, 255
-	bne	.L603
-	ldrb	w0, [x19,1]
+	bne	.L620
+	ldrb	w0, [x20, 1]
 	cmp	w0, 255
-	bne	.L600
+	bne	.L617
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 1408
 	mov	w2, 81
-	add	x1, x1, 1424
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L600:
-	adrp	x0, .LANCHOR0
-	sbfiz	x20, x20, 6, 32
-	add	x0, x0, :lo12:.LANCHOR0
-	ldrb	w1, [x19,1]
-	add	x0, x0, 1312
-	strb	w1, [x0,x20]
-.L596:
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 32
-	ret
+.L617:
+	add	x0, x19, :lo12:.LANCHOR0
+	sbfiz	x21, x21, 6, 32
+	add	x0, x0, 1304
+	ldrb	w1, [x20, 1]
+	strb	w1, [x0, x21]
+	b	.L613
 	.size	buf_add_tail, .-buf_add_tail
 	.align	2
 	.type	queue_read_cmd, %function
 queue_read_cmd:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	mov	x19, x0
 	mov	w0, 48
-	ldr	w1, [x19,40]
+	ldr	w1, [x19, 40]
 	bl	flash_start_page_read
-	strb	wzr, [x19,59]
+	strb	wzr, [x19, 59]
 	mov	w0, 1
-	strb	w0, [x19,58]
+	strb	w0, [x19, 58]
 	mov	w0, -1
 	strb	w0, [x19]
 	adrp	x0, .LANCHOR0
-	mov	x1, x19
 	add	x0, x0, :lo12:.LANCHOR0
-	add	x0, x0, 3363
+	mov	x1, x19
+	add	x0, x0, 3354
 	bl	buf_add_tail
-	ldr	x19, [sp,16]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	queue_read_cmd, .-queue_read_cmd
@@ -3727,35 +3543,34 @@ queue_read_cmd:
 zbuf_free:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	adrp	x19, .LANCHOR0
-	ldrb	w1, [x0,2]
+	ldrb	w1, [x0, 2]
 	and	w1, w1, 8
-	uxtb	w1, w1
-	strb	w1, [x0,2]
-	cbz	w1, .L606
-	ldr	w1, [x0,36]
+	strb	w1, [x0, 2]
+	cbz	w1, .L625
+	ldr	w1, [x0, 36]
 	cmn	w1, #1
-	beq	.L606
+	beq	.L625
 	mov	x1, x0
 	add	x0, x19, :lo12:.LANCHOR0
-	add	x0, x0, 3361
+	add	x0, x0, 3352
 	bl	buf_add_tail
-	b	.L607
-.L606:
-	add	x1, x19, :lo12:.LANCHOR0
-	ldrb	w2, [x1,3361]
-	strb	w2, [x0]
-	ldrb	w0, [x0,1]
-	strb	w0, [x1,3361]
-.L607:
+.L626:
 	add	x19, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x19,3362]
+	ldrb	w0, [x19, 3353]
 	add	w0, w0, 1
-	strb	w0, [x19,3362]
-	ldr	x19, [sp,16]
+	strb	w0, [x19, 3353]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L625:
+	add	x1, x19, :lo12:.LANCHOR0
+	ldrb	w2, [x1, 3352]
+	strb	w2, [x0]
+	ldrb	w0, [x0, 1]
+	strb	w0, [x1, 3352]
+	b	.L626
 	.size	zbuf_free, .-zbuf_free
 	.align	2
 	.global	buf_alloc
@@ -3764,98 +3579,98 @@ buf_alloc:
 	stp	x29, x30, [sp, -48]!
 	adrp	x1, .LANCHOR0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	add	x20, x1, :lo12:.LANCHOR0
-	str	x21, [sp,32]
-	uxtb	w21, w0
+	str	x21, [sp, 32]
+	and	w21, w0, 255
 	mov	x19, x1
-	ldrb	w0, [x20,3362]
-	cbz	w0, .L615
-.L618:
+	ldrb	w0, [x20, 3353]
+	cbz	w0, .L635
+.L638:
 	add	x1, x19, :lo12:.LANCHOR0
-	add	x0, x1, 1312
-	ldrb	w2, [x1,3361]
-	add	x0, x0, x2, lsl 6
-	cbz	w21, .L616
-	b	.L617
-.L615:
+	add	x0, x1, 1304
+	ldrb	w3, [x1, 3352]
+	ubfiz	x2, x3, 6, 8
+	add	x0, x0, x2
+	cbz	w21, .L636
+.L637:
+	add	x1, x19, :lo12:.LANCHOR0
+	sbfiz	x3, x3, 6, 32
+	add	x4, x1, 1304
+	add	x2, x4, x3
+	ldrb	w5, [x4, x3]
+	strb	w5, [x1, 3352]
+	ldrb	w5, [x1, 3353]
+	strh	wzr, [x2, 50]
+	sub	w5, w5, #1
+	strb	w5, [x1, 3353]
+	mov	w1, 1
+	strb	w1, [x2, 2]
+	mov	w1, -1
+	strb	wzr, [x2, 56]
+	strb	w1, [x4, x3]
+	mov	w1, -1
+	strb	wzr, [x2, 57]
+	str	xzr, [x2, 16]
+	str	w1, [x2, 36]
+	b	.L634
+.L635:
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 1424
 	mov	w2, 121
-	add	x1, x1, 1440
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-	ldrb	w1, [x20,3362]
-	cbnz	w1, .L618
-.L620:
+	ldrb	w0, [x20, 3353]
+	cbnz	w0, .L638
+.L640:
 	mov	x0, 0
-	b	.L619
-.L616:
-	ldrb	w1, [x1,3362]
-	cmp	w1, 1
-	beq	.L620
-.L617:
-	add	x1, x19, :lo12:.LANCHOR0
-	lsl	x2, x2, 6
-	add	x4, x1, 1312
-	add	x3, x4, x2
-	ldrb	w5, [x4,x2]
-	strb	w5, [x1,3361]
-	ldrb	w5, [x1,3362]
-	strh	wzr, [x3,50]
-	sub	w5, w5, #1
-	strb	w5, [x1,3362]
-	mov	w1, 1
-	strb	w1, [x3,2]
-	mov	w1, -1
-	str	xzr, [x3,16]
-	strb	w1, [x4,x2]
-	mov	w1, -1
-	strb	wzr, [x3,56]
-	str	w1, [x3,36]
-	strb	wzr, [x3,57]
-.L619:
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
+.L634:
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
+.L636:
+	ldrb	w1, [x1, 3353]
+	cmp	w1, 1
+	bne	.L637
+	b	.L640
 	.size	buf_alloc, .-buf_alloc
 	.align	2
 	.global	buf_remove_buf
 	.type	buf_remove_buf, %function
 buf_remove_buf:
-	ldrb	w4, [x1,1]
+	ldrb	w4, [x1, 1]
 	ldrb	w2, [x0]
 	cmp	w4, w2
-	bne	.L627
+	bne	.L648
 	ldrb	w1, [x1]
 	strb	w1, [x0]
-	b	.L631
-.L627:
-	adrp	x0, .LANCHOR0
-	add	x0, x0, :lo12:.LANCHOR0
-	add	x0, x0, 1312
-.L629:
-	cmp	w2, 255
-	beq	.L632
+.L652:
+	mov	w0, 1
+	ret
+.L649:
 	mov	w3, w2
 	sbfiz	x2, x2, 6, 32
-	ldrb	w2, [x0,x2]
-	cmp	w2, w4
-	bne	.L629
+	ldrb	w2, [x0, x2]
+	cmp	w4, w2
+	bne	.L650
 	sbfiz	x3, x3, 6, 32
 	ldrb	w2, [x1]
-	strb	w2, [x0,x3]
+	strb	w2, [x0, x3]
 	mov	w0, -1
 	strb	w0, [x1]
-.L631:
-	mov	w0, 1
-	b	.L626
-.L632:
+	b	.L652
+.L648:
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	add	x0, x0, 1304
+.L650:
+	cmp	w2, 255
+	bne	.L649
 	mov	w0, 0
-.L626:
 	ret
 	.size	buf_remove_buf, .-buf_remove_buf
 	.align	2
@@ -3863,38 +3678,39 @@ buf_remove_buf:
 	.type	buf_remove_free, %function
 buf_remove_free:
 	stp	x29, x30, [sp, -32]!
+	adrp	x5, .LANCHOR0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x19, .LANCHOR0
+	stp	x19, x20, [sp, 16]
 	mov	x20, x0
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x0,3362]
-	cbnz	w0, .L634
+	add	x0, x5, :lo12:.LANCHOR0
+	mov	x19, x5
+	ldrb	w0, [x0, 3353]
+	cbnz	w0, .L654
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 1440
 	mov	w2, 172
-	add	x1, x1, 1456
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L634:
+.L654:
 	add	x19, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x19,3362]
-	cbz	w0, .L633
-	add	x0, x19, 3361
+	ldrb	w0, [x19, 3353]
+	cbz	w0, .L653
 	mov	x1, x20
+	add	x0, x19, 3352
 	bl	buf_remove_buf
 	cmp	w0, 1
-	bne	.L633
-	ldrb	w0, [x19,3362]
+	bne	.L653
+	ldrb	w0, [x19, 3353]
 	sub	w0, w0, #1
-	strb	w0, [x19,3362]
-	ldrb	w0, [x20,2]
+	strb	w0, [x19, 3353]
+	ldrb	w0, [x20, 2]
 	orr	w0, w0, 1
-	strb	w0, [x20,2]
-.L633:
-	ldp	x19, x20, [sp,16]
+	strb	w0, [x20, 2]
+.L653:
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	buf_remove_free, .-buf_remove_free
@@ -3903,59 +3719,58 @@ buf_remove_free:
 	.type	dump_buf_info, %function
 dump_buf_info:
 	sub	sp, sp, #64
-	adrp	x0, .LC47
-	add	x0, x0, :lo12:.LC47
-	stp	x29, x30, [sp,16]
+	adrp	x0, .LC44
+	add	x0, x0, :lo12:.LC44
+	stp	x29, x30, [sp, 16]
 	add	x29, sp, 16
-	stp	x19, x20, [sp,32]
+	stp	x19, x20, [sp, 32]
 	adrp	x19, .LANCHOR0
-	str	x21, [sp,48]
 	add	x19, x19, :lo12:.LANCHOR0
-	adrp	x21, .LC53
-	add	x20, x19, 1312
-	add	x21, x21, :lo12:.LC53
-	add	x19, x19, 3360
-	ldrb	w1, [x19,3]
+	str	x21, [sp, 48]
+	add	x20, x19, 1304
+	adrp	x21, .LC50
+	add	x19, x19, 3352
+	add	x21, x21, :lo12:.LC50
+	ldrb	w1, [x19, 2]
+	bl	printk
+	ldrb	w1, [x19, 3]
+	adrp	x0, .LC45
+	add	x0, x0, :lo12:.LC45
+	bl	printk
+	ldrb	w1, [x19, 4]
+	adrp	x0, .LC46
+	add	x0, x0, :lo12:.LC46
+	bl	printk
+	ldrb	w1, [x19, 5]
+	adrp	x0, .LC47
+	add	x0, x0, :lo12:.LC47
 	bl	printk
-	ldrb	w1, [x19,4]
+	ldrb	w1, [x19]
 	adrp	x0, .LC48
 	add	x0, x0, :lo12:.LC48
 	bl	printk
-	ldrb	w1, [x19,5]
+	ldrb	w1, [x19, 1]
 	adrp	x0, .LC49
 	add	x0, x0, :lo12:.LC49
 	bl	printk
-	ldrb	w1, [x19,6]
-	adrp	x0, .LC50
-	add	x0, x0, :lo12:.LC50
-	bl	printk
-	ldrb	w1, [x19,1]
-	adrp	x0, .LC51
-	add	x0, x0, :lo12:.LC51
-	bl	printk
-	ldrb	w1, [x19,2]
-	adrp	x0, .LC52
-	add	x0, x0, :lo12:.LC52
-	bl	printk
-.L639:
-	ldr	w0, [x20,40]
+.L660:
+	ldr	w0, [x20, 40]
 	add	x20, x20, 64
-	ldrb	w1, [x20,-63]
-	ldrb	w2, [x20,-64]
-	ldrb	w3, [x20,-62]
-	ldrh	w4, [x20,-14]
-	ldrb	w5, [x20,-6]
+	ldrb	w5, [x20, -6]
+	ldrh	w4, [x20, -14]
+	ldrb	w3, [x20, -62]
+	ldrb	w2, [x20, -64]
+	ldrb	w1, [x20, -63]
 	str	w0, [sp]
 	mov	x0, x21
-	ldr	w6, [x20,-12]
-	ldr	w7, [x20,-28]
+	ldr	w7, [x20, -28]
+	ldr	w6, [x20, -12]
 	bl	printk
 	cmp	x20, x19
-	bne	.L639
-	sub	sp, x29, #16
-	ldp	x19, x20, [sp,32]
-	ldr	x21, [sp,48]
-	ldp	x29, x30, [sp,16]
+	bne	.L660
+	ldp	x19, x20, [sp, 32]
+	ldp	x29, x30, [sp, 16]
+	ldr	x21, [sp, 48]
 	add	sp, sp, 64
 	ret
 	.size	dump_buf_info, .-dump_buf_info
@@ -3963,25 +3778,23 @@ dump_buf_info:
 	.global	flash_check_bad_block
 	.type	flash_check_bad_block, %function
 flash_check_bad_block:
-	adrp	x2, .LANCHOR2
-	uxtb	w0, w0
-	add	x2, x2, :lo12:.LANCHOR2
-	add	x2, x2, 8
-	ldrb	w3, [x2,13]
-	ldrh	w2, [x2,14]
-	mul	w2, w3, w2
-	ubfx	x3, x1, 5, 27
-	uxth	w2, w2
+	adrp	x3, .LANCHOR2
+	add	x3, x3, :lo12:.LANCHOR2
+	and	w5, w0, 255
+	lsr	w4, w1, 5
+	ldrb	w0, [x3, 21]
+	ldrh	w2, [x3, 22]
+	mul	w2, w2, w0
+	mov	x0, 912
+	and	w2, w2, 65535
 	add	w2, w2, 31
 	asr	w2, w2, 5
 	lsl	w2, w2, 2
-	mul	w2, w0, w2
-	adrp	x0, .LANCHOR0+1128
-	sxtw	x2, w2
-	ldr	x0, [x0,#:lo12:.LANCHOR0+1128]
-	add	x2, x2, 912
-	add	x2, x0, x2
-	ldr	w0, [x2,x3,lsl 2]
+	umaddl	x0, w2, w5, x0
+	adrp	x2, .LANCHOR0+1048
+	ldr	x2, [x2, #:lo12:.LANCHOR0+1048]
+	add	x0, x0, w4, uxtw 2
+	ldr	w0, [x2, x0]
 	lsr	w0, w0, w1
 	and	w0, w0, 1
 	ret
@@ -3991,94 +3804,94 @@ flash_check_bad_block:
 	.type	flash_mask_bad_block, %function
 flash_mask_bad_block:
 	stp	x29, x30, [sp, -48]!
-	adrp	x3, .LANCHOR2
+	mov	w2, w1
 	add	x29, sp, 0
-	add	x3, x3, :lo12:.LANCHOR2
-	stp	x19, x20, [sp,16]
-	str	x21, [sp,32]
-	uxtb	w19, w0
-	mov	w21, w1
-	mov	w1, w19
-	ldrb	w0, [x3,21]
-	mov	w2, w21
-	ldrh	w20, [x3,22]
-	mul	w20, w0, w20
-	adrp	x0, .LC54
-	add	x0, x0, :lo12:.LC54
-	uxth	w20, w20
-	add	w20, w20, 31
-	bl	printk
-	asr	w20, w20, 5
-	adrp	x0, .LANCHOR0+1128
-	lsl	w20, w20, 2
-	ubfx	x3, x21, 5, 27
-	lsl	x3, x3, 2
-	mul	w19, w19, w20
-	ldr	x0, [x0,#:lo12:.LANCHOR0+1128]
-	sxtw	x19, w19
-	add	x19, x19, 912
-	add	x19, x0, x19
-	mov	w0, 1
-	lsl	w1, w0, w21
-	ldr	w0, [x19,x3]
-	orr	w1, w0, w1
-	str	w1, [x19,x3]
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
-	ldp	x29, x30, [sp], 48
-	ret
-	.size	flash_mask_bad_block, .-flash_mask_bad_block
-	.align	2
-	.global	str2hex
-	.type	str2hex, %function
-str2hex:
-	ldrb	w1, [x0]
-	cmp	w1, 48
-	bne	.L644
-	ldrb	w1, [x0,1]
-	add	x2, x0, 2
+	str	x21, [sp, 32]
+	and	w21, w0, 255
+	adrp	x0, .LANCHOR2
+	add	x0, x0, :lo12:.LANCHOR2
+	stp	x19, x20, [sp, 16]
+	mov	w20, w1
+	ldrh	w19, [x0, 22]
+	ldrb	w1, [x0, 21]
+	adrp	x0, .LC51
+	add	x0, x0, :lo12:.LC51
+	mul	w19, w19, w1
+	mov	w1, w21
+	bl	printk
+	and	w19, w19, 65535
+	lsr	w0, w20, 5
+	add	w1, w19, 31
+	mov	x19, 912
+	asr	w1, w1, 5
+	mov	w2, 1
+	lsl	w1, w1, 2
+	umaddl	x1, w1, w21, x19
+	add	x1, x1, w0, uxtw 2
+	adrp	x0, .LANCHOR0+1048
+	ldr	x3, [x0, #:lo12:.LANCHOR0+1048]
+	lsl	w0, w2, w20
+	ldr	w2, [x3, x1]
+	orr	w2, w2, w0
+	str	w2, [x3, x1]
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	ret
+	.size	flash_mask_bad_block, .-flash_mask_bad_block
+	.align	2
+	.global	str2hex
+	.type	str2hex, %function
+str2hex:
+	ldrb	w1, [x0]
+	cmp	w1, 48
+	bne	.L667
+	ldrb	w1, [x0, 1]
+	add	x2, x0, 2
 	and	w1, w1, -33
-	uxtb	w1, w1
+	and	w1, w1, 255
 	cmp	w1, 88
-	csel	x0, x0, x2, ne
-.L644:
-	ldrb	w1, [x0]
+	csel	x0, x2, x0, eq
+.L667:
+	mov	x2, x0
+	ldrb	w1, [x2], 1
 	and	w1, w1, -33
-	uxtb	w1, w1
+	and	w1, w1, 255
 	cmp	w1, 88
 	mov	w1, 0
-	csinc	x0, x0, x0, ne
-.L646:
+	csel	x0, x2, x0, eq
+.L669:
 	ldrb	w2, [x0]
-	cbz	w2, .L653
+	cbnz	w2, .L674
+.L666:
+	mov	w0, w1
+	ret
+.L674:
 	sub	w3, w2, #48
-	uxtb	w3, w3
+	and	w3, w3, 255
 	cmp	w3, 9
-	bhi	.L647
+	bhi	.L670
 	add	w1, w2, w1, lsl 4
 	sub	w1, w1, #48
-	b	.L648
-.L647:
+.L671:
+	add	x0, x0, 1
+	b	.L669
+.L670:
 	sub	w3, w2, #97
-	uxtb	w3, w3
+	and	w3, w3, 255
 	cmp	w3, 5
-	bhi	.L649
+	bhi	.L672
 	add	w1, w2, w1, lsl 4
 	sub	w1, w1, #87
-	b	.L648
-.L649:
+	b	.L671
+.L672:
 	sub	w3, w2, #65
-	uxtb	w3, w3
+	and	w3, w3, 255
 	cmp	w3, 5
-	bhi	.L653
+	bhi	.L666
 	add	w1, w2, w1, lsl 4
 	sub	w1, w1, #55
-.L648:
-	add	x0, x0, 1
-	b	.L646
-.L653:
-	mov	w0, w1
-	ret
+	b	.L671
 	.size	str2hex, .-str2hex
 	.align	2
 	.global	zftl_proc_debug_init
@@ -4086,14 +3899,14 @@ str2hex:
 zftl_proc_debug_init:
 	stp	x29, x30, [sp, -16]!
 	adrp	x3, .LANCHOR1
-	mov	x2, 0
-	adrp	x0, .LC55
 	add	x3, x3, :lo12:.LANCHOR1
+	mov	x4, 0
 	add	x29, sp, 0
+	add	x3, x3, 1456
+	mov	x2, 0
 	mov	w1, 292
-	add	x3, x3, 1472
-	mov	x4, x2
-	add	x0, x0, :lo12:.LC55
+	adrp	x0, .LC52
+	add	x0, x0, :lo12:.LC52
 	bl	proc_create_data
 	ldp	x29, x30, [sp], 16
 	ret
@@ -4103,311 +3916,307 @@ zftl_proc_debug_init:
 	.type	ftl_print_info_to_buf, %function
 ftl_print_info_to_buf:
 	stp	x29, x30, [sp, -48]!
-	adrp	x1, .LC1
-	adrp	x2, .LC2
+	adrp	x2, .LC1
+	adrp	x1, .LC2
+	add	x2, x2, :lo12:.LC1
 	add	x29, sp, 0
-	add	x1, x1, :lo12:.LC1
-	add	x2, x2, :lo12:.LC2
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
+	stp	x19, x20, [sp, 16]
+	add	x1, x1, :lo12:.LC2
+	stp	x21, x22, [sp, 32]
 	mov	x20, x0
 	bl	sprintf
-	adrp	x7, .LANCHOR2
+	add	x19, x20, w0, sxtw
+	adrp	x0, .LANCHOR2
+	add	x0, x0, :lo12:.LANCHOR2
 	adrp	x22, .LANCHOR0
-	add	x7, x7, :lo12:.LANCHOR2
-	adrp	x1, .LC56
-	add	x7, x7, 8
 	add	x21, x22, :lo12:.LANCHOR0
-	add	x19, x20, w0, sxtw
-	add	x1, x1, :lo12:.LC56
-	ldrb	w5, [x7,4]
+	adrp	x1, .LC53
+	add	x1, x1, :lo12:.LC53
+	ldrb	w7, [x0, 14]
+	ldrb	w6, [x0, 13]
+	ldrb	w5, [x0, 12]
+	ldrb	w4, [x0, 11]
+	ldrb	w3, [x0, 10]
+	ldrb	w2, [x0, 9]
 	mov	x0, x19
-	ldrb	w6, [x7,5]
-	ldrb	w3, [x7,2]
-	ldrb	w4, [x7,3]
-	ldrb	w2, [x7,1]
-	ldrb	w7, [x7,6]
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	w2, [x21,1032]
-	adrp	x1, .LC57
+	ldr	w2, [x21, 1032]
 	mov	x0, x19
-	add	x1, x1, :lo12:.LC57
+	adrp	x1, .LC54
+	add	x1, x1, :lo12:.LC54
 	lsr	w2, w2, 11
 	bl	sprintf
+	ldr	w2, [x21, 3360]
 	add	x19, x19, w0, sxtw
-	ldr	w2, [x21,3368]
-	adrp	x1, .LC58
 	mov	x0, x19
-	add	x1, x1, :lo12:.LC58
+	adrp	x1, .LC55
+	add	x1, x1, :lo12:.LC55
 	lsr	w2, w2, 11
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	adrp	x1, .LC59
+	adrp	x1, .LC56
 	mov	x0, x19
-	add	x1, x1, :lo12:.LC59
-	add	x19, x19, 10
+	add	x1, x1, :lo12:.LC56
 	bl	strcpy
-	ldr	w2, [x21,3372]
-	adrp	x1, .LC60
+	add	x19, x19, 10
+	ldr	w2, [x21, 3364]
+	mov	x0, x19
+	adrp	x1, .LC57
+	add	x1, x1, :lo12:.LC57
+	bl	sprintf
+	add	x19, x19, w0, sxtw
+	ldr	w2, [x21, 1032]
 	mov	x0, x19
+	adrp	x1, .LC58
+	add	x1, x1, :lo12:.LC58
+	bl	sprintf
+	add	x19, x19, w0, sxtw
+	ldr	x0, [x21, 1128]
+	adrp	x1, .LC59
+	add	x1, x1, :lo12:.LC59
+	ldr	w2, [x0, 524]
+	mov	x0, x19
+	bl	sprintf
+	add	x19, x19, w0, sxtw
+	ldr	x0, [x21, 1128]
+	adrp	x1, .LC60
 	add	x1, x1, :lo12:.LC60
+	ldr	w2, [x0, 528]
+	mov	x0, x19
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	w2, [x21,1032]
-	adrp	x1, .LC61
+	ldrh	w2, [x21, 3368]
 	mov	x0, x19
+	adrp	x1, .LC61
 	add	x1, x1, :lo12:.LC61
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x2, [x21,1120]
-	adrp	x1, .LC62
+	ldrh	w2, [x21, 3370]
 	mov	x0, x19
+	adrp	x1, .LC62
 	add	x1, x1, :lo12:.LC62
-	ldr	w2, [x2,524]
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x2, [x21,1120]
-	adrp	x1, .LC63
+	ldrh	w2, [x21, 3372]
 	mov	x0, x19
+	adrp	x1, .LC63
 	add	x1, x1, :lo12:.LC63
-	ldr	w2, [x2,528]
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldrh	w2, [x21,3376]
-	adrp	x1, .LC64
+	ldrh	w2, [x21, 3374]
 	mov	x0, x19
+	adrp	x1, .LC64
 	add	x1, x1, :lo12:.LC64
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldrh	w2, [x21,3378]
-	adrp	x1, .LC65
+	ldrh	w2, [x21, 3376]
 	mov	x0, x19
+	adrp	x1, .LC65
 	add	x1, x1, :lo12:.LC65
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldrh	w2, [x21,3380]
-	adrp	x1, .LC66
+	ldrh	w2, [x21, 3378]
 	mov	x0, x19
+	adrp	x1, .LC66
 	add	x1, x1, :lo12:.LC66
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldrh	w2, [x21,3382]
-	adrp	x1, .LC67
+	ldrb	w4, [x21, 3380]
 	mov	x0, x19
+	ldrb	w3, [x21, 3381]
+	adrp	x1, .LC67
+	ldrb	w2, [x21, 3353]
 	add	x1, x1, :lo12:.LC67
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldrh	w2, [x21,3384]
+	ldr	x0, [x21, 3384]
 	adrp	x1, .LC68
-	mov	x0, x19
 	add	x1, x1, :lo12:.LC68
+	ldrh	w3, [x0, 146]
+	ldrh	w2, [x0, 148]
+	mov	x0, x19
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldrh	w2, [x21,3386]
+	ldr	x0, [x21, 3384]
 	adrp	x1, .LC69
-	mov	x0, x19
 	add	x1, x1, :lo12:.LC69
+	ldp	w2, w0, [x0, 16]
+	add	w2, w0, w2, lsr 11
+	mov	x0, x19
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldrb	w4, [x21,3389]
+	ldr	x0, [x21, 3384]
 	adrp	x1, .LC70
-	ldrb	w2, [x21,3362]
-	mov	x0, x19
-	ldrb	w3, [x21,3388]
 	add	x1, x1, :lo12:.LC70
+	ldp	w2, w0, [x0, 24]
+	add	w2, w0, w2, lsr 11
+	mov	x0, x19
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x3, [x21,3392]
+	ldr	x0, [x21, 3384]
 	adrp	x1, .LC71
-	mov	x0, x19
 	add	x1, x1, :lo12:.LC71
-	ldrh	w2, [x3,148]
-	ldrh	w3, [x3,146]
+	ldr	w2, [x0, 64]
+	mov	x0, x19
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x0, [x21,3392]
+	ldr	x0, [x21, 3384]
 	adrp	x1, .LC72
 	add	x1, x1, :lo12:.LC72
-	ldr	w3, [x0,16]
-	ldr	w2, [x0,20]
+	ldr	w2, [x0, 68]
 	mov	x0, x19
-	add	w2, w2, w3, lsr 11
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x0, [x21,3392]
+	ldr	x0, [x21, 1128]
 	adrp	x1, .LC73
 	add	x1, x1, :lo12:.LC73
-	ldr	w3, [x0,24]
-	ldr	w2, [x0,28]
+	ldr	w2, [x0, 12]
+	mov	w0, 10
+	udiv	w2, w2, w0
 	mov	x0, x19
-	add	w2, w2, w3, lsr 11
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x2, [x21,3392]
+	ldr	x0, [x21, 3384]
 	adrp	x1, .LC74
-	mov	x0, x19
+	ldrb	w2, [x22, #:lo12:.LANCHOR0]
 	add	x1, x1, :lo12:.LC74
-	ldr	w2, [x2,64]
+	ldrh	w4, [x0, 150]
+	ldr	w3, [x0, 156]
+	mov	x0, x19
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x2, [x21,3392]
+	ldr	x0, [x21, 1128]
 	adrp	x1, .LC75
-	mov	x0, x19
 	add	x1, x1, :lo12:.LC75
-	ldr	w2, [x2,68]
+	ldr	w2, [x0, 556]
+	mov	x0, x19
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x0, [x21,1120]
-	mov	w2, 10
+	ldr	x0, [x21, 1128]
 	adrp	x1, .LC76
 	add	x1, x1, :lo12:.LC76
-	ldr	w3, [x0,12]
+	ldr	w2, [x0, 552]
 	mov	x0, x19
-	udiv	w2, w3, w2
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x4, [x21,3392]
+	ldr	x0, [x21, 3384]
 	adrp	x1, .LC77
-	ldrb	w2, [x22,#:lo12:.LANCHOR0]
-	mov	x0, x19
 	add	x1, x1, :lo12:.LC77
-	ldr	w3, [x4,156]
-	ldrh	w4, [x4,150]
+	ldr	w2, [x0, 52]
+	mov	x0, x19
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x2, [x21,1120]
+	ldr	x0, [x21, 3384]
 	adrp	x1, .LC78
-	mov	x0, x19
 	add	x1, x1, :lo12:.LC78
-	ldr	w2, [x2,556]
+	ldr	w2, [x0, 60]
+	mov	x0, x19
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x2, [x21,1120]
+	ldr	x0, [x21, 3384]
 	adrp	x1, .LC79
-	mov	x0, x19
 	add	x1, x1, :lo12:.LC79
-	ldr	w2, [x2,552]
+	ldr	w2, [x0, 76]
+	mov	x0, x19
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x2, [x21,3392]
+	ldr	x0, [x21, 3384]
 	adrp	x1, .LC80
-	mov	x0, x19
 	add	x1, x1, :lo12:.LC80
-	ldr	w2, [x2,52]
+	ldr	w2, [x0, 8]
+	mov	x0, x19
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x2, [x21,3392]
+	ldr	x0, [x21, 1128]
 	adrp	x1, .LC81
-	mov	x0, x19
 	add	x1, x1, :lo12:.LC81
-	ldr	w2, [x2,60]
+	ldrb	w4, [x0, 25]
+	ldrh	w3, [x0, 22]
+	ldrh	w2, [x0, 16]
+	mov	x0, x19
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x2, [x21,3392]
+	ldr	x0, [x21, 1128]
 	adrp	x1, .LC82
-	mov	x0, x19
 	add	x1, x1, :lo12:.LC82
-	ldr	w2, [x2,76]
+	ldrb	w4, [x0, 57]
+	ldrh	w3, [x0, 54]
+	ldrh	w2, [x0, 48]
+	mov	x0, x19
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x2, [x21,3392]
+	ldr	x0, [x21, 1128]
 	adrp	x1, .LC83
-	mov	x0, x19
 	add	x1, x1, :lo12:.LC83
-	ldr	w2, [x2,8]
+	ldrb	w4, [x0, 89]
+	ldrh	w3, [x0, 86]
+	ldrh	w2, [x0, 80]
+	mov	x0, x19
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x4, [x21,1120]
+	ldr	x0, [x21, 3384]
 	adrp	x1, .LC84
-	mov	x0, x19
 	add	x1, x1, :lo12:.LC84
-	ldrh	w2, [x4,16]
-	ldrh	w3, [x4,22]
-	ldrb	w4, [x4,25]
+	ldrh	w6, [x0, 96]
+	ldrh	w5, [x0, 92]
+	ldrh	w4, [x0, 88]
+	ldrh	w2, [x0, 74]
+	ldr	w3, [x0, 84]
+	mov	x0, x19
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x4, [x21,1120]
+	ldr	x0, [x21, 3384]
 	adrp	x1, .LC85
-	mov	x0, x19
 	add	x1, x1, :lo12:.LC85
-	ldrh	w2, [x4,48]
-	ldrh	w3, [x4,54]
-	ldrb	w4, [x4,57]
+	ldrh	w6, [x0, 98]
+	ldrh	w5, [x0, 94]
+	ldrh	w4, [x0, 90]
+	ldr	w3, [x0, 80]
+	ldrh	w2, [x0, 72]
+	mov	x0, x19
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x4, [x21,1120]
-	adrp	x1, .LC86
+	ldrh	w2, [x21, 3392]
 	mov	x0, x19
+	adrp	x1, .LC86
 	add	x1, x1, :lo12:.LC86
-	ldrh	w2, [x4,80]
-	ldrh	w3, [x4,86]
-	ldrb	w4, [x4,89]
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x6, [x21,3392]
-	adrp	x1, .LC87
+	ldr	w6, [x21, 3396]
 	mov	x0, x19
+	ldrh	w5, [x21, 3400]
+	adrp	x1, .LC87
+	ldrh	w4, [x21, 3402]
 	add	x1, x1, :lo12:.LC87
-	ldrh	w2, [x6,74]
-	ldr	w3, [x6,84]
-	ldrh	w4, [x6,88]
-	ldrh	w5, [x6,92]
-	ldrh	w6, [x6,96]
+	ldrh	w3, [x21, 3404]
+	ldrh	w2, [x21, 3406]
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x6, [x21,3392]
+	ldr	x0, [x21, 1128]
 	adrp	x1, .LC88
-	mov	x0, x19
 	add	x1, x1, :lo12:.LC88
-	ldr	w3, [x6,80]
-	ldrh	w4, [x6,90]
-	ldrh	w5, [x6,94]
-	ldrh	w2, [x6,72]
-	ldrh	w6, [x6,98]
-	bl	sprintf
-	add	x19, x19, w0, sxtw
-	ldrh	w2, [x21,3400]
-	adrp	x1, .LC89
-	mov	x0, x19
-	add	x1, x1, :lo12:.LC89
-	bl	sprintf
-	add	x19, x19, w0, sxtw
-	ldr	w6, [x21,3412]
-	adrp	x1, .LC90
-	ldrh	w2, [x21,3402]
-	mov	x0, x19
-	ldrh	w3, [x21,3404]
-	add	x1, x1, :lo12:.LC90
-	ldrh	w4, [x21,3406]
-	ldrh	w5, [x21,3408]
-	bl	sprintf
-	add	x19, x19, w0, sxtw
-	ldr	x5, [x21,1120]
-	adrp	x1, .LC91
+	ldrh	w5, [x0, 590]
+	ldrh	w4, [x0, 588]
+	ldrh	w3, [x0, 586]
+	ldrh	w2, [x0, 584]
 	mov	x0, x19
-	add	x1, x1, :lo12:.LC91
-	ldrh	w2, [x5,584]
-	ldrh	w3, [x5,586]
-	ldrh	w4, [x5,588]
-	ldrh	w5, [x5,590]
 	bl	sprintf
 	add	x19, x19, w0, sxtw
-	ldr	x6, [x21,1120]
-	adrp	x1, .LC92
-	ldr	x5, [x21,3392]
+	ldr	x0, [x21, 1128]
+	ldr	x1, [x21, 3384]
+	add	x5, x0, 512
 	mov	x0, x19
-	add	x1, x1, :lo12:.LC92
-	ldr	w2, [x6,536]
-	ldr	w3, [x6,540]
-	ldr	w4, [x6,544]
-	ldr	w5, [x5,44]
-	ldr	w6, [x6,548]
+	ldp	w2, w3, [x5, 24]
+	ldp	w4, w6, [x5, 32]
+	ldr	w5, [x1, 44]
+	adrp	x1, .LC89
+	add	x1, x1, :lo12:.LC89
 	bl	sprintf
 	add	x0, x19, w0, sxtw
-	ldp	x21, x22, [sp,32]
 	sub	w0, w0, w20
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	ftl_print_info_to_buf, .-ftl_print_info_to_buf
@@ -4426,21 +4235,21 @@ zftl_proc_ftl_read:
 	.type	ftl_gc_write_buf, %function
 ftl_gc_write_buf:
 	stp	x29, x30, [sp, -32]!
-	mov	x1, x0
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	adrp	x19, .LANCHOR0
 	add	x19, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x0,2]
-	orr	w0, w0, 2
-	strb	w0, [x1,2]
-	add	x0, x19, 3416
+	ldrb	w1, [x0, 2]
+	orr	w1, w1, 2
+	strb	w1, [x0, 2]
+	mov	x1, x0
+	add	x0, x19, 3408
 	bl	buf_add_tail
-	ldrb	w0, [x19,3388]
+	ldrb	w0, [x19, 3381]
 	add	w0, w0, 1
-	uxtb	w0, w0
-	strb	w0, [x19,3388]
-	ldr	x19, [sp,16]
+	and	w0, w0, 255
+	strb	w0, [x19, 3381]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	ftl_gc_write_buf, .-ftl_gc_write_buf
@@ -4468,590 +4277,586 @@ ftl_scan_all_data:
 gc_add_sblk:
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	adrp	x24, .LANCHOR2
-	uxth	w23, w1
-	stp	x21, x22, [sp,32]
-	uxth	w21, w0
-	adrp	x22, .LANCHOR0
-	ldr	w0, [x24,#:lo12:.LANCHOR2]
-	stp	x19, x20, [sp,16]
-	uxth	w20, w2
-	tbz	x0, 8, .L662
-	add	x7, x22, :lo12:.LANCHOR0
-	uxtw	x5, w21
-	mov	w1, w21
-	mov	w2, w23
-	mov	w3, w20
-	ldr	x0, [x7,1096]
-	ldr	x6, [x7,1112]
-	add	x0, x0, x5, lsl 2
-	ldrh	w5, [x6,x5,lsl 1]
-	ldrb	w4, [x0,2]
-	adrp	x0, .LC93
-	ldrh	w6, [x7,3480]
-	add	x0, x0, :lo12:.LC93
-	ldrh	w7, [x7,3406]
+	stp	x21, x22, [sp, 32]
+	adrp	x22, .LANCHOR2
+	stp	x19, x20, [sp, 16]
+	and	w19, w0, 65535
+	ldr	w0, [x22, #:lo12:.LANCHOR2]
+	adrp	x21, .LANCHOR0
+	stp	x23, x24, [sp, 48]
+	and	w24, w1, 65535
+	and	w23, w2, 65535
+	tbz	x0, 8, .L688
+	add	x1, x21, :lo12:.LANCHOR0
+	uxtw	x0, w19
+	ldr	x2, [x1, 1104]
+	ldr	x3, [x1, 1120]
+	ldrh	w7, [x1, 3402]
+	add	x2, x2, x0, lsl 2
+	ldrh	w6, [x1, 3472]
+	mov	w1, w19
+	ldrh	w5, [x3, x0, lsl 1]
+	adrp	x0, .LC90
+	ldrb	w4, [x2, 2]
+	mov	w3, w23
+	mov	w2, w24
+	add	x0, x0, :lo12:.LC90
 	ubfx	x4, x4, 5, 3
 	bl	printk
-.L662:
-	add	x0, x22, :lo12:.LANCHOR0
-	ldrh	w0, [x0,1088]
-	cmp	w0, w21
-	bhi	.L663
+.L688:
+	add	x0, x21, :lo12:.LANCHOR0
+	ldrh	w0, [x0, 1096]
+	cmp	w0, w19
+	bhi	.L689
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 1744
 	mov	w2, 543
-	add	x1, x1, 1760
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L663:
-	add	x5, x22, :lo12:.LANCHOR0
-	ldrh	w0, [x5,1088]
-	cmp	w0, w21
-	bhi	.L664
-	ldr	w0, [x24,#:lo12:.LANCHOR2]
-	mov	w19, 0
-	tbz	x0, 10, .L665
-	adrp	x0, .LC94
-	mov	w1, w21
-	mov	w2, w23
-	mov	w3, w20
-	add	x0, x0, :lo12:.LC94
+.L689:
+	add	x1, x21, :lo12:.LANCHOR0
+	ldrh	w0, [x1, 1096]
+	cmp	w0, w19
+	bhi	.L690
+	ldr	w0, [x22, #:lo12:.LANCHOR2]
+	mov	w20, 0
+	tbz	x0, 10, .L687
+	adrp	x0, .LC91
+	mov	w3, w23
+	mov	w2, w24
+	mov	w1, w19
+	add	x0, x0, :lo12:.LC91
 	bl	printk
-	b	.L665
-.L664:
-	uxtw	x0, w21
-	ldr	x1, [x5,1112]
-	ldrh	w4, [x1,x0,lsl 1]
-	ldr	x1, [x5,1096]
-	add	x0, x1, x0, lsl 2
-	ldrb	w19, [x0,2]
-	ands	w19, w19, 224
-	bne	.L666
-	cbz	w4, .L665
+.L687:
+	mov	w0, w20
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 64
+	ret
+.L690:
+	ldr	x2, [x1, 1120]
+	uxtw	x0, w19
+	ldrh	w3, [x2, x0, lsl 1]
+	ldr	x2, [x1, 1104]
+	add	x0, x2, x0, lsl 2
+	ldrb	w2, [x0, 2]
+	tst	w2, 224
+	bne	.L692
+	mov	w20, 0
+	cbz	w3, .L687
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 1744
 	mov	w2, 553
-	add	x1, x1, 1760
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-	b	.L665
-.L666:
-	ldrh	w1, [x5,3424]
-	add	x8, x5, 3424
-	mov	w19, 0
-	cmp	w1, w21
-	beq	.L665
-	ldr	x7, [x5,1120]
-	ldrh	w1, [x7,48]
-	cmp	w1, w21
-	beq	.L665
-	ldrh	w1, [x7,16]
-	cmp	w1, w21
-	beq	.L665
-	ldrh	w1, [x7,80]
-	cmp	w1, w21
-	beq	.L665
-	ldrh	w5, [x8,56]
-	mov	x6, 0
-.L667:
-	cmp	w5, w6
-	bls	.L700
-	add	x6, x6, 1
-	add	x1, x8, x6, lsl 1
-	ldrh	w1, [x1,56]
-	cmp	w1, w21
-	bne	.L667
-	mov	w19, 0
-	b	.L665
-.L700:
-	cbnz	w23, .L669
-	adrp	x6, .LANCHOR3
-	mov	w19, w23
-	add	x6, x6, :lo12:.LANCHOR3
-	ldrh	w9, [x6,1288]
-	cmp	w9, w21
-	beq	.L665
-	mov	x8, 0
-.L671:
-	add	x1, x6, 1296
-	ldrh	w1, [x8,x1]
-	cmp	w21, w1
-	bne	.L670
-	ldr	w1, [x24,#:lo12:.LANCHOR2]
-	mov	w19, 0
-	tbz	x1, 8, .L665
-	ldrb	w2, [x0,2]
-	adrp	x0, .LC95
-	mov	w3, w4
-	mov	w1, w21
+	b	.L687
+.L692:
+	ldrh	w0, [x1, 3416]
+	cmp	w0, w19
+	beq	.L711
+	ldr	x0, [x1, 1128]
+	ldrh	w5, [x0, 48]
+	cmp	w5, w19
+	beq	.L711
+	ldrh	w5, [x0, 16]
+	cmp	w5, w19
+	beq	.L711
+	ldrh	w5, [x0, 80]
+	cmp	w5, w19
+	beq	.L711
+	ldrh	w5, [x1, 3472]
+	add	x1, x1, 3474
+	mov	w4, 0
+.L693:
+	cmp	w4, w5
+	bcc	.L694
+	cbnz	w24, .L698
+	adrp	x1, .LANCHOR3
+	add	x1, x1, :lo12:.LANCHOR3
+	ldrh	w6, [x1, 1280]
+	cmp	w19, w6
+	beq	.L711
+	add	x1, x1, 1288
+	mov	x4, 0
+.L697:
+	ldrh	w7, [x4, x1]
+	cmp	w19, w7
+	bne	.L696
+	ldr	w0, [x22, #:lo12:.LANCHOR2]
+	mov	w20, 0
+	tbz	x0, 8, .L687
+	mov	w5, w6
+	mov	w4, w19
 	ubfx	x2, x2, 5, 3
-	mov	w4, w21
-	mov	w5, w9
-	add	x0, x0, :lo12:.LC95
-	bl	printk
-	b	.L665
-.L670:
-	add	x8, x8, 2
-	cmp	x8, 16
-	bne	.L671
-	sxtw	x6, w20
-	add	x19, x7, x6, lsl 7
-	add	x19, x19, 136
-	b	.L673
-.L669:
-	add	x19, x7, 392
-.L673:
-	ldr	w1, [x24,#:lo12:.LANCHOR2]
-	tbz	x1, 8, .L674
-	add	x6, x22, :lo12:.LANCHOR0
-	ldrb	w3, [x0,2]
-	adrp	x0, .LC96
-	mov	w1, w21
-	add	x0, x0, :lo12:.LC96
-	mov	w2, w23
-	ldrh	w6, [x6,3406]
-	ubfx	x3, x3, 5, 3
+	mov	w1, w19
+	adrp	x0, .LC92
+	add	x0, x0, :lo12:.LC92
+	bl	printk
+	b	.L687
+.L694:
+	ldrh	w6, [x1], 2
+	cmp	w6, w19
+	beq	.L711
+	add	w4, w4, 1
+	b	.L693
+.L696:
+	add	x4, x4, 2
+	cmp	x4, 16
+	bne	.L697
+	ubfiz	x20, x23, 7, 16
+	add	x20, x20, 136
+	add	x20, x0, x20
+.L699:
+	ldr	w0, [x22, #:lo12:.LANCHOR2]
+	tbz	x0, 8, .L700
+	add	x0, x21, :lo12:.LANCHOR0
+	mov	w4, w3
+	mov	w1, w19
+	ubfx	x3, x2, 5, 3
+	mov	w2, w24
+	ldrh	w6, [x0, 3402]
+	adrp	x0, .LC93
+	add	x0, x0, :lo12:.LC93
 	bl	printk
-.L674:
-	mov	x4, x19
-	add	x0, x19, 128
-	mov	w1, 65535
-.L677:
-	ldrh	w2, [x4]
-	cmp	w2, w1
-	bne	.L675
-	strh	w21, [x4]
-	add	x22, x22, :lo12:.LANCHOR0
-	cbz	w23, .L676
-	ldr	x1, [x22,1120]
-	ldrh	w0, [x1,124]
+.L700:
+	mov	x0, x20
+	add	x1, x20, 128
+	mov	w2, 65535
+.L703:
+	ldrh	w3, [x0]
+	cmp	w3, w2
+	bne	.L701
+	strh	w19, [x0]
+	add	x21, x21, :lo12:.LANCHOR0
+	cbz	w24, .L702
+	ldr	x1, [x21, 1128]
+	ldrh	w0, [x1, 124]
 	add	w0, w0, 1
-	strh	w0, [x1,124]
+	strh	w0, [x1, 124]
+.L725:
+	mov	w20, 1
+	b	.L687
+.L698:
+	add	x20, x0, 392
 	b	.L699
-.L676:
-	ldr	x0, [x22,1120]
-	add	x20, x0, w20, uxth 1
-	ldrh	w0, [x20,120]
+.L702:
+	ldr	x0, [x21, 1128]
+	add	x23, x0, w23, uxth 1
+	ldrh	w0, [x23, 120]
 	add	w0, w0, 1
-	strh	w0, [x20,120]
-.L699:
-	mov	w19, 1
-	b	.L665
-.L675:
-	add	x4, x4, 2
-	cmp	x4, x0
-	bne	.L677
-	b	.L699
-.L665:
-	mov	w0, w19
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 64
-	ret
+	strh	w0, [x23, 120]
+	b	.L725
+.L701:
+	add	x0, x0, 2
+	cmp	x1, x0
+	bne	.L703
+	b	.L725
+.L711:
+	mov	w20, 0
+	b	.L687
 	.size	gc_add_sblk, .-gc_add_sblk
 	.align	2
 	.global	gc_mark_bad_ppa
 	.type	gc_mark_bad_ppa, %function
 gc_mark_bad_ppa:
 	stp	x29, x30, [sp, -64]!
-	adrp	x4, .LANCHOR3
-	mov	w3, w0
+	adrp	x1, .LANCHOR3
+	add	x1, x1, :lo12:.LANCHOR3
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR0
-	str	x23, [sp,48]
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	add	x21, x20, :lo12:.LANCHOR0
-	add	x4, x4, :lo12:.LANCHOR3
-	mov	w1, 24
+	str	x23, [sp, 48]
+	mov	w19, 24
 	mov	w23, 1
-	ldrb	w19, [x21,1257]
-	add	x21, x21, 3424
-	ldrh	w0, [x4,1312]
-	sub	w19, w1, w19
-	ldr	w1, [x21,2200]
-	sub	w19, w19, w0
-	lsr	w2, w3, w0
+	ldrb	w4, [x21, 1205]
+	add	x21, x21, 3416
+	ldrh	w3, [x1, 1304]
+	sub	w19, w19, w4
+	ldrb	w1, [x1, 1306]
+	sub	w19, w19, w3
+	lsr	w2, w0, w3
+	mov	w3, w0
 	lsl	w19, w23, w19
-	ldrb	w0, [x4,1314]
 	sub	w19, w19, #1
-	uxth	w22, w2
 	and	w19, w19, w2
+	and	w22, w2, 65535
 	mov	w2, w22
-	udiv	w19, w19, w0
-	adrp	x0, .LC97
-	add	x0, x0, :lo12:.LC97
+	adrp	x0, .LC94
+	add	x0, x0, :lo12:.LC94
+	udiv	w19, w19, w1
+	ldr	w1, [x21, 2200]
+	and	w19, w19, 65535
 	bl	printk
 	mov	w1, w23
 	mov	w2, 0
-	uxth	w19, w19
 	mov	w0, w19
 	bl	gc_add_sblk
-	ldr	w0, [x21,2200]
+	ldr	w0, [x21, 2200]
 	mov	w1, 0
-.L702:
+.L727:
 	cmp	w1, w0
-	bcs	.L705
-	add	x2, x21, w1, sxtw 1
-	ldrh	w2, [x2,2204]
-	cmp	w2, w22
-	beq	.L703
-	add	w1, w1, 1
-	uxth	w1, w1
-	b	.L702
-.L705:
+	bcc	.L729
 	cmp	w0, 5
-	bhi	.L703
+	bhi	.L728
 	add	x20, x20, :lo12:.LANCHOR0
 	add	w1, w0, 1
-	str	w1, [x20,5624]
+	str	w1, [x20, 5616]
 	add	x20, x20, w0, uxtw 1
-	strh	w22, [x20,5628]
-.L703:
+	strh	w22, [x20, 5620]
+.L728:
 	mov	w0, 0
-	ldr	x23, [sp,48]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
+	ldr	x23, [sp, 48]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
 	ldp	x29, x30, [sp], 64
 	ret
+.L729:
+	add	x2, x21, w1, sxtw 1
+	ldrh	w2, [x2, 2204]
+	cmp	w2, w22
+	beq	.L728
+	add	w1, w1, 1
+	and	w1, w1, 65535
+	b	.L727
 	.size	gc_mark_bad_ppa, .-gc_mark_bad_ppa
 	.align	2
 	.global	gc_get_src_ppa_from_index
 	.type	gc_get_src_ppa_from_index, %function
 gc_get_src_ppa_from_index:
-	adrp	x1, .LANCHOR3+1320
+	adrp	x1, .LANCHOR3+1312
 	ubfiz	x0, x0, 2, 16
-	ldr	x1, [x1,#:lo12:.LANCHOR3+1320]
-	ldr	w0, [x1,x0]
+	ldr	x1, [x1, #:lo12:.LANCHOR3+1312]
+	ldr	w0, [x1, x0]
 	ret
 	.size	gc_get_src_ppa_from_index, .-gc_get_src_ppa_from_index
 	.align	2
 	.global	gc_write_completed
 	.type	gc_write_completed, %function
 gc_write_completed:
-	stp	x29, x30, [sp, -96]!
+	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	adrp	x21, .LANCHOR1
-	adrp	x26, .LANCHOR0
-	add	x26, x26, :lo12:.LANCHOR0
-	add	x21, x21, :lo12:.LANCHOR1
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	stp	x27, x28, [sp,80]
-	add	x22, x26, 1312
-	add	x21, x21, 1776
-.L708:
-	ldrb	w20, [x26,3365]
-	adrp	x19, .LANCHOR0
-	cmp	w20, 255
-	beq	.L737
-	lsl	x1, x20, 6
-	add	x0, x22, x1
-	ldrb	w1, [x22,x1]
-	strb	w1, [x26,3365]
-	ldr	w1, [x0,52]
-	ldrh	w23, [x0,48]
-	cbz	w1, .L709
-	mov	w2, 1
-	strh	w2, [x26,5618]
-	ldr	w2, [x0,40]
-	adrp	x0, .LC98
-	add	x0, x0, :lo12:.LC98
-	str	w2, [x26,5620]
+	stp	x21, x22, [sp, 32]
+	adrp	x22, .LANCHOR0
+	stp	x23, x24, [sp, 48]
+	add	x24, x22, :lo12:.LANCHOR0
+	stp	x25, x26, [sp, 64]
+	add	x25, x24, 1304
+	stp	x19, x20, [sp, 16]
+.L733:
+	add	x3, x22, :lo12:.LANCHOR0
+	ldrb	w0, [x3, 3356]
+	cmp	w0, 255
+	bne	.L746
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	ret
+.L746:
+	sxtw	x21, w0
+	add	x1, x3, 1304
+	lsl	x4, x21, 6
+	add	x2, x1, x4
+	ldrb	w0, [x1, x4]
+	ldr	w1, [x2, 52]
+	strb	w0, [x3, 3356]
+	ldrh	w23, [x2, 48]
+	cbz	w1, .L734
+	ldr	w2, [x2, 40]
+	mov	w0, 1
+	str	w2, [x3, 5612]
+	strh	w0, [x3, 5610]
+	adrp	x0, .LC95
+	add	x0, x0, :lo12:.LC95
 	bl	printk
-	adrp	x0, .LC0
-	mov	x1, x21
+	adrp	x1, .LANCHOR1
+	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 1760
 	mov	w2, 956
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L709:
-	adrp	x25, .LANCHOR3
-	add	x1, x25, :lo12:.LANCHOR3
-	ldrb	w0, [x1,1328]
+.L734:
+	adrp	x20, .LANCHOR3
+	add	x1, x20, :lo12:.LANCHOR3
+	ldrb	w0, [x1, 1320]
 	cmp	w0, 3
-	bne	.L710
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w2, [x0,1268]
-	cbnz	w2, .L710
-	ldr	x0, [x0,1120]
-	ldrb	w1, [x1,1329]
-	ldrb	w0, [x0,89]
+	bne	.L735
+	ldrb	w0, [x24, 1212]
+	cbnz	w0, .L735
+	ldr	x0, [x24, 1128]
+	ldrb	w1, [x1, 1321]
+	ldrb	w0, [x0, 89]
+	mov	w19, w0
 	cmp	w1, w0
-	bhi	.L723
-	cmp	w0, 3
-	mov	w1, 2
-	csel	w0, w0, w1, cc
-	b	.L712
-.L723:
-	mov	w0, 1
-.L712:
-	add	w24, w0, w0, lsl 1
-	b	.L713
-.L710:
-	add	x0, x25, :lo12:.LANCHOR3
-	mov	w24, 1
-	ldrb	w1, [x0,1330]
-	cbz	w1, .L713
-	ldrb	w0, [x0,1331]
-	cmp	w0, wzr
+	bhi	.L747
+	cmp	w0, 2
 	mov	w0, 2
-	csel	w24, w24, w0, eq
-.L713:
-	add	x0, x25, :lo12:.LANCHOR3
-	uxth	x1, w23
-	ldr	x2, [x0,1336]
-	add	x0, x19, :lo12:.LANCHOR0
-	add	x0, x0, x20, lsl 6
-	ldrb	w1, [x2,x1]
-	ldrb	w0, [x0,1313]
+	csel	w19, w19, w0, ls
+.L736:
+	add	w19, w19, w19, lsl 1
+.L737:
+	add	x0, x20, :lo12:.LANCHOR3
+	and	x1, x23, 65535
+	ldr	x2, [x0, 1328]
+	add	x0, x25, x21, lsl 6
+	ldrb	w0, [x0, 1]
+	ldrb	w1, [x2, x1]
 	cmp	w1, w0
-	beq	.L714
-	adrp	x0, .LC0
-	mov	x1, x21
+	beq	.L738
+	adrp	x1, .LANCHOR1
+	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 1760
 	mov	w2, 976
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L714:
-	add	x0, x19, :lo12:.LANCHOR0
-	add	x20, x0, x20, lsl 6
-	ldrb	w1, [x20,1373]
+.L738:
+	add	x0, x25, x21, lsl 6
+	ldrb	w0, [x0, 61]
+	cmp	w0, 3
+	beq	.L739
+	add	x0, x20, :lo12:.LANCHOR3
+	ldrb	w1, [x0, 1320]
 	cmp	w1, 3
-	beq	.L715
-	add	x1, x25, :lo12:.LANCHOR3
-	ldrb	w2, [x1,1328]
-	cmp	w2, 3
-	bne	.L715
-	ldrb	w2, [x1,1344]
-	cbnz	w2, .L715
-	ldrb	w2, [x0,1268]
-	cbnz	w2, .L715
-	ldrb	w0, [x0,1269]
-	cbnz	w0, .L715
-	ldrb	w0, [x1,1330]
-	cbz	w0, .L716
-	ldrb	w0, [x1,1331]
-	cbnz	w0, .L715
-.L716:
-	add	x25, x25, :lo12:.LANCHOR3
-	add	x19, x19, :lo12:.LANCHOR0
-	mov	w1, 0
-	add	x19, x19, 1312
-	ldr	x2, [x25,1336]
-	b	.L717
-.L715:
-	add	x19, x19, :lo12:.LANCHOR0
-	mov	w20, 0
-	mov	w27, -1
-	add	x28, x19, 1312
-	strh	w23, [x19,5532]
-.L718:
-	cmp	w24, w20, uxth
-	bls	.L708
-	add	x0, x25, :lo12:.LANCHOR3
-	add	w2, w20, w23
-	add	w20, w20, 1
-	ldr	x0, [x0,1336]
-	ldrb	w1, [x0,x2]
-	strb	w27, [x0,x2]
-	sbfiz	x1, x1, 6, 32
-	add	x0, x28, x1
-	strb	wzr, [x0,61]
+	bne	.L739
+	ldrb	w1, [x0, 1336]
+	cbnz	w1, .L739
+	ldrb	w1, [x24, 1212]
+	cbnz	w1, .L739
+	ldrb	w1, [x24, 1213]
+	cbnz	w1, .L739
+	ldrb	w1, [x0, 1322]
+	cbz	w1, .L740
+	ldrb	w0, [x0, 1323]
+	cbnz	w0, .L739
+.L740:
+	add	x20, x20, :lo12:.LANCHOR3
+	mov	w0, 0
+	ldr	x2, [x20, 1328]
+.L741:
+	cmp	w19, w0, uxth
+	bls	.L733
+	add	w1, w23, w0
+	add	w0, w0, 1
+	ldrb	w1, [x2, x1]
+	add	x1, x25, x1, lsl 6
+	strb	wzr, [x1, 61]
+	b	.L741
+.L747:
+	mov	w19, 1
+	b	.L736
+.L735:
+	add	x0, x20, :lo12:.LANCHOR3
+	ldrb	w1, [x0, 1322]
+	cbz	w1, .L748
+	ldrb	w0, [x0, 1323]
+	cmp	w0, 0
+	cset	w19, ne
+	add	w19, w19, 1
+	b	.L737
+.L748:
+	mov	w19, 1
+	b	.L737
+.L739:
+	add	x20, x20, :lo12:.LANCHOR3
+	strh	w23, [x24, 5524]
+	mov	w21, 0
+	mov	w26, -1
+.L742:
+	cmp	w19, w21, uxth
+	bls	.L733
+	ldr	x2, [x20, 1328]
+	add	w1, w23, w21
+	add	w21, w21, 1
+	ldrb	w0, [x2, x1]
+	strb	w26, [x2, x1]
+	sbfiz	x1, x0, 6, 32
+	ubfiz	x0, x0, 6, 8
+	add	x1, x25, x1
+	add	x0, x25, x0
+	strb	wzr, [x1, 61]
 	bl	zbuf_free
-	ldrb	w0, [x19,3431]
+	ldrb	w0, [x24, 3423]
 	sub	w0, w0, #1
-	strb	w0, [x19,3431]
-	b	.L718
-.L717:
-	cmp	w24, w1, uxth
-	bls	.L708
-	add	w0, w1, w23
-	add	w1, w1, 1
-	ldrb	w0, [x2,x0]
-	add	x0, x19, x0, lsl 6
-	strb	wzr, [x0,61]
-	b	.L717
-.L737:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 96
-	ret
+	strb	w0, [x24, 3423]
+	b	.L742
 	.size	gc_write_completed, .-gc_write_completed
 	.align	2
 	.global	gc_get_src_blk
 	.type	gc_get_src_blk, %function
 gc_get_src_blk:
-	adrp	x3, .LANCHOR0
-	adrp	x4, .LANCHOR3
-	add	x0, x3, :lo12:.LANCHOR0
-	ldr	x1, [x0,1120]
-	add	x0, x4, :lo12:.LANCHOR3
-	ldrh	w5, [x1,124]
-	ldrb	w0, [x0,1345]
-	cbz	w5, .L739
+	adrp	x2, .LANCHOR0
+	add	x0, x2, :lo12:.LANCHOR0
+	ldr	x1, [x0, 1128]
+	ldrh	w0, [x1, 124]
+	cbz	w0, .L761
 	add	x1, x1, 392
-	mov	w2, 1
-	b	.L740
-.L739:
-	sxtw	x2, w0
-	add	x0, x1, x2, lsl 1
-	ldrh	w6, [x0,120]
-	mov	w0, 65535
-	cbz	w6, .L741
-	add	x1, x1, x2, lsl 7
-	mov	w2, w5
-	add	x1, x1, 136
-.L740:
-	add	x5, x1, 128
-	mov	w6, 65535
-.L744:
+	mov	w3, 1
+.L762:
+	add	x4, x1, 128
+	mov	w5, 65535
+.L766:
 	ldrh	w0, [x1]
-	cmp	w0, w6
-	beq	.L742
-	mov	w5, -1
-	strh	w5, [x1]
-	cbz	w2, .L743
-	add	x3, x3, :lo12:.LANCHOR0
-	ldr	x2, [x3,1120]
-	ldrh	w1, [x2,124]
+	cmp	w0, w5
+	beq	.L764
+	mov	w4, -1
+	strh	w4, [x1]
+	add	x2, x2, :lo12:.LANCHOR0
+	cbz	w3, .L765
+	ldr	x2, [x2, 1128]
+	ldrh	w1, [x2, 124]
 	sub	w1, w1, #1
-	strh	w1, [x2,124]
-	b	.L741
-.L743:
-	add	x4, x4, :lo12:.LANCHOR3
-	add	x3, x3, :lo12:.LANCHOR0
-	ldrb	w1, [x4,1345]
-	ldr	x2, [x3,1120]
+	strh	w1, [x2, 124]
+	ret
+.L761:
+	adrp	x0, .LANCHOR3+1337
+	ldrb	w0, [x0, #:lo12:.LANCHOR3+1337]
+	add	x3, x1, w0, sxtw 1
+	ldrh	w3, [x3, 120]
+	cbz	w3, .L767
+	ubfiz	x0, x0, 7, 8
+	mov	w3, 0
+	add	x0, x0, 136
+	add	x1, x1, x0
+	b	.L762
+.L765:
+	adrp	x1, .LANCHOR3+1337
+	ldr	x2, [x2, 1128]
+	ldrb	w1, [x1, #:lo12:.LANCHOR3+1337]
 	add	x1, x2, x1, lsl 1
-	ldrh	w2, [x1,120]
+	ldrh	w2, [x1, 120]
 	sub	w2, w2, #1
-	strh	w2, [x1,120]
-	b	.L741
-.L742:
+	strh	w2, [x1, 120]
+	ret
+.L764:
 	add	x1, x1, 2
-	cmp	x1, x5
-	bne	.L744
-.L741:
+	cmp	x1, x4
+	bne	.L766
+	ret
+.L767:
+	mov	w0, 65535
 	ret
 	.size	gc_get_src_blk, .-gc_get_src_blk
 	.align	2
 	.global	gc_free_temp_buf
 	.type	gc_free_temp_buf, %function
 gc_free_temp_buf:
-	stp	x29, x30, [sp, -64]!
-	mov	w0, 0
+	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR0
-	str	x21, [sp,32]
-	add	x4, x19, :lo12:.LANCHOR0
-	ldrb	w1, [x4,3431]
-	cbz	w1, .L749
-	ldrb	w1, [x4,3362]
+	add	x0, x19, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	ldrb	w1, [x0, 3423]
+	cbz	w1, .L776
+	ldrb	w1, [x0, 3353]
 	cmp	w1, 1
-	bhi	.L749
-	adrp	x20, .LANCHOR3
-	ldrh	w1, [x4,5532]
-	add	x5, x20, :lo12:.LANCHOR3
-	add	x4, x4, 1312
-	add	w2, w1, 24
-	ldrh	w3, [x5,1346]
-	ldrb	w0, [x5,1329]
-	mul	w0, w3, w0
-	ldr	x3, [x5,1336]
-	cmp	w0, w2
-	csel	w2, w0, w2, ls
-.L750:
-	cmp	w1, w2
-	bcs	.L763
-	uxtw	x21, w1
-	ldrb	w0, [x3,x21]
-	cmp	w0, 255
-	beq	.L751
-	sbfiz	x0, x0, 6, 32
-	add	x0, x4, x0
-	ldrb	w5, [x0,61]
-	cbnz	w5, .L751
-	str	x1, [x29,56]
+	bhi	.L776
+	adrp	x21, .LANCHOR3
+	add	x2, x21, :lo12:.LANCHOR3
+	ldrh	w20, [x0, 5524]
+	add	x0, x0, 1304
+	ldrb	w4, [x2, 1321]
+	add	w3, w20, 24
+	ldrh	w1, [x2, 1338]
+	mul	w1, w1, w4
+	ldr	x4, [x2, 1328]
+	cmp	w1, w3
+	csel	w1, w1, w3, ls
+.L771:
+	cmp	w20, w1
+	bcc	.L774
+.L776:
+	mov	w0, 0
+	b	.L769
+.L774:
+	uxtw	x22, w20
+	ldrb	w2, [x4, x22]
+	cmp	w2, 255
+	beq	.L772
+	sbfiz	x3, x2, 6, 32
+	add	x3, x0, x3
+	ldrb	w3, [x3, 61]
+	cbnz	w3, .L772
+	ubfiz	x2, x2, 6, 8
+	add	x0, x0, x2
 	bl	zbuf_free
 	adrp	x0, .LANCHOR2
-	ldr	x1, [x29,56]
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 8, .L752
-	add	x0, x20, :lo12:.LANCHOR3
-	ldr	x2, [x0,1336]
-	adrp	x0, .LC99
-	add	x0, x0, :lo12:.LC99
-	ldrb	w2, [x2,x21]
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 8, .L773
+	add	x0, x21, :lo12:.LANCHOR3
+	mov	w1, w20
+	ldr	x0, [x0, 1328]
+	ldrb	w2, [x0, x22]
+	adrp	x0, .LC96
+	add	x0, x0, :lo12:.LC96
 	bl	printk
-.L752:
-	add	x20, x20, :lo12:.LANCHOR3
+.L773:
+	add	x21, x21, :lo12:.LANCHOR3
 	add	x19, x19, :lo12:.LANCHOR0
 	mov	w1, -1
-	ldr	x0, [x20,1336]
-	strb	w1, [x0,x21]
-	ldrb	w0, [x19,3431]
+	ldr	x0, [x21, 1328]
+	strb	w1, [x0, x22]
+	ldrb	w0, [x19, 3423]
 	sub	w0, w0, #1
-	strb	w0, [x19,3431]
+	strb	w0, [x19, 3423]
 	mov	w0, 1
-	b	.L749
-.L751:
-	add	w1, w1, 1
-	b	.L750
-.L763:
-	mov	w0, 0
-.L749:
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
-	ldp	x29, x30, [sp], 64
+.L769:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 48
 	ret
+.L772:
+	add	w20, w20, 1
+	b	.L771
 	.size	gc_free_temp_buf, .-gc_free_temp_buf
 	.align	2
 	.global	get_ink_scaned_blk
 	.type	get_ink_scaned_blk, %function
 get_ink_scaned_blk:
 	adrp	x1, .LANCHOR0
-	mov	w0, 65535
 	add	x1, x1, :lo12:.LANCHOR0
-	add	x3, x1, 3424
-	ldrh	w2, [x1,5536]
-	cbz	w2, .L765
+	add	x0, x1, 3416
+	ldrh	w2, [x1, 5528]
+	cbz	w2, .L786
 	sub	w2, w2, #1
-	add	x0, x3, w2, sxtw 1
-	ldrh	w0, [x0,2114]
-	strh	w2, [x1,5536]
-.L765:
+	strh	w2, [x1, 5528]
+	add	x0, x0, w2, sxtw 1
+	ldrh	w0, [x0, 2114]
+	ret
+.L786:
+	mov	w0, 65535
 	ret
 	.size	get_ink_scaned_blk, .-get_ink_scaned_blk
 	.align	2
 	.global	print_gc_debug_info
 	.type	print_gc_debug_info, %function
 print_gc_debug_info:
-	adrp	x6, .LANCHOR0
-	adrp	x0, .LC100
-	add	x6, x6, :lo12:.LANCHOR0
-	add	x0, x0, :lo12:.LC100
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
 	stp	x29, x30, [sp, -16]!
 	add	x29, sp, 0
-	ldrh	w1, [x6,3424]
-	ldrh	w2, [x6,3426]
-	ldrh	w3, [x6,5530]
-	ldrb	w4, [x6,3362]
-	ldrb	w5, [x6,3431]
-	ldrh	w6, [x6,3400]
+	ldrh	w6, [x0, 3392]
+	ldrb	w5, [x0, 3423]
+	ldrb	w4, [x0, 3353]
+	ldrh	w3, [x0, 5522]
+	ldrh	w2, [x0, 3418]
+	ldrh	w1, [x0, 3416]
+	adrp	x0, .LC97
+	add	x0, x0, :lo12:.LC97
 	bl	printk
 	ldp	x29, x30, [sp], 16
 	ret
@@ -5061,85 +4866,89 @@ print_gc_debug_info:
 	.type	_list_pop_index_node, %function
 _list_pop_index_node:
 	stp	x29, x30, [sp, -32]!
-	uxth	w1, w1
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	mov	w19, 65535
+	stp	x19, x20, [sp, 16]
 	ldr	x20, [x0]
-	cbz	x20, .L770
+	cbz	x20, .L795
 	adrp	x3, .LANCHOR0+1040
+	and	w1, w1, 65535
 	mov	w4, 65535
 	mov	w5, 6
-	ldr	x19, [x3,#:lo12:.LANCHOR0+1040]
-.L771:
-	cbnz	w1, .L772
-.L774:
+	ldr	x19, [x3, #:lo12:.LANCHOR0+1040]
+.L791:
+	cbnz	w1, .L792
+.L794:
 	sub	x19, x20, x19
 	mov	x1, -6148914691236517206
 	asr	x19, x19, 1
-	madd	x19, x1, x19, x19
-	uxth	w19, w19
+	movk	x1, 0xaaab, lsl 0
+	mul	x19, x19, x1
+	and	w19, w19, 65535
 	mov	w1, w19
 	bl	_list_remove_node
 	mov	w0, -1
 	strh	w0, [x20]
-	strh	w0, [x20,2]
-	b	.L770
-.L772:
-	ldrh	w3, [x20]
-	cmp	w3, w4
-	beq	.L774
-	umull	x20, w3, w5
-	sub	w1, w1, #1
-	add	x20, x19, x20
-	uxth	w1, w1
-	b	.L771
-.L770:
+	strh	w0, [x20, 2]
 	mov	w0, w19
-	ldp	x19, x20, [sp,16]
+.L789:
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L792:
+	ldrh	w3, [x20]
+	cmp	w3, w4
+	beq	.L794
+	sub	w1, w1, #1
+	umaddl	x20, w3, w5, x19
+	and	w1, w1, 65535
+	b	.L791
+.L795:
+	mov	w0, 65535
+	b	.L789
 	.size	_list_pop_index_node, .-_list_pop_index_node
 	.align	2
 	.global	_list_get_gc_head_node
 	.type	_list_get_gc_head_node, %function
 _list_get_gc_head_node:
-	ldr	x2, [x0]
-	uxth	w1, w1
-	mov	w0, 65535
-	cbz	x2, .L782
-	adrp	x0, .LANCHOR0+1040
-	mov	w4, 65535
-	mov	w5, 6
-	ldr	x3, [x0,#:lo12:.LANCHOR0+1040]
-.L778:
-	cbz	w1, .L779
-	ldrh	w0, [x2]
-	cmp	w0, w4
-	beq	.L782
-	umull	x0, w0, w5
+	ldr	x0, [x0]
+	and	w1, w1, 65535
+	cbz	x0, .L802
+	adrp	x2, .LANCHOR0+1040
+	mov	w3, 65535
+	mov	w4, 6
+	ldr	x2, [x2, #:lo12:.LANCHOR0+1040]
+.L799:
+	cbz	w1, .L800
+	ldrh	w0, [x0]
+	cmp	w0, w3
+	bne	.L801
+	ret
+.L801:
 	sub	w1, w1, #1
-	add	x2, x3, x0
-	uxth	w1, w1
-	b	.L778
-.L779:
-	sub	x2, x2, x3
-	mov	x0, -6148914691236517206
-	asr	x2, x2, 1
-	madd	x2, x0, x2, x2
-	uxth	w0, w2
-.L782:
+	umaddl	x0, w0, w4, x2
+	and	w1, w1, 65535
+	b	.L799
+.L802:
+	mov	w0, 65535
+	ret
+.L800:
+	sub	x0, x0, x2
+	mov	x1, -6148914691236517206
+	asr	x0, x0, 1
+	movk	x1, 0xaaab, lsl 0
+	mul	x0, x0, x1
+	and	w0, w0, 65535
 	ret
 	.size	_list_get_gc_head_node, .-_list_get_gc_head_node
 	.align	2
 	.type	zftl_get_gc_node.part.10, %function
 zftl_get_gc_node.part.10:
 	stp	x29, x30, [sp, -16]!
-	uxth	w1, w0
+	mov	w1, w0
 	adrp	x0, .LANCHOR3
 	add	x0, x0, :lo12:.LANCHOR3
 	add	x29, sp, 0
-	add	x0, x0, 1352
+	add	x0, x0, 1344
 	bl	_list_get_gc_head_node
 	ldp	x29, x30, [sp], 16
 	ret
@@ -5150,744 +4959,740 @@ zftl_get_gc_node.part.10:
 gc_search_src_blk:
 	stp	x29, x30, [sp, -160]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x21, x22, [sp, 32]
+	and	w22, w0, 255
+	and	w0, w1, 255
+	stp	x19, x20, [sp, 16]
+	str	w0, [x29, 144]
 	adrp	x19, .LANCHOR0
-	stp	x23, x24, [sp,48]
-	uxtb	w23, w0
-	uxtb	w0, w1
-	add	x1, x19, :lo12:.LANCHOR0
-	str	w0, [x29,144]
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	uxtb	w21, w2
-	ldr	x3, [x1,1120]
-	add	x0, x3, w23, sxtw 1
-	ldrh	w0, [x0,120]
-	cbnz	w0, .L905
-	ldrh	w2, [x1,3480]
-	cmp	w2, 1
-	bhi	.L787
-	adrp	x1, .LANCHOR3
-	add	x1, x1, :lo12:.LANCHOR3
-	strh	w0, [x1,1360]
-	strh	w0, [x1,1362]
-	strh	w0, [x1,1364]
-.L787:
-	cbnz	w23, .L909
-	adrp	x20, .LANCHOR3
-	adrp	x26, .LC101
-	add	x20, x20, :lo12:.LANCHOR3
-	mov	w24, w23
-	mov	w25, w23
-	add	w22, w21, 1
-	add	x27, x20, 1368
-	add	x26, x26, :lo12:.LC101
-.L788:
-	cmp	w25, w22
-	bge	.L794
-	ldrh	w28, [x20,1362]
-	mov	x0, x27
-	mov	w1, w28
+	add	x0, x19, :lo12:.LANCHOR0
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	and	w20, w2, 255
+	stp	x27, x28, [sp, 80]
+	ldr	x2, [x0, 1128]
+	add	x1, x2, w22, sxtw 1
+	ldrh	w21, [x1, 120]
+	cbz	w21, .L807
+	mov	w0, w21
+.L806:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 160
+	ret
+.L807:
+	ldrh	w1, [x0, 3472]
+	cmp	w1, 1
+	bhi	.L809
+	adrp	x0, .LANCHOR3
+	add	x0, x0, :lo12:.LANCHOR3
+	strh	wzr, [x0, 1352]
+	strh	wzr, [x0, 1354]
+	strh	wzr, [x0, 1356]
+.L809:
+	cbnz	w22, .L810
+	adrp	x25, .LANCHOR3
+	adrp	x27, .LC98
+	add	x26, x25, :lo12:.LANCHOR3
+	add	x27, x27, :lo12:.LC98
+	add	x0, x26, 1360
+	mov	w23, 0
+	mov	w24, 0
+	str	x0, [x29, 136]
+.L811:
+	add	w28, w20, 1
+	cmp	w24, w28
+	bge	.L816
+	ldrh	w6, [x26, 1354]
+	ldr	x0, [x29, 136]
+	mov	w1, w6
 	bl	_list_get_gc_head_node
-	uxth	w1, w0
-	add	w2, w28, 1
+	add	w2, w6, 1
+	and	w2, w2, 65535
+	strh	w2, [x26, 1354]
+	and	w1, w0, 65535
 	mov	w0, 65535
-	cmp	w1, w0
 	mov	w4, w1
-	uxth	w2, w2
-	strh	w2, [x20,1362]
-	beq	.L790
+	cmp	w1, w0
+	beq	.L812
 	adrp	x0, .LANCHOR2
-	uxtw	x28, w1
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 8, .L791
+	uxtw	x6, w1
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 8, .L813
 	add	x0, x19, :lo12:.LANCHOR0
-	str	x4, [x29,136]
-	ldr	x3, [x0,1112]
-	mov	x0, x26
-	ldrh	w3, [x3,x28,lsl 1]
+	str	x6, [x29, 128]
+	str	w1, [x29, 120]
+	ldr	x0, [x0, 1120]
+	ldrh	w3, [x0, x6, lsl 1]
+	mov	x0, x27
 	bl	printk
-	ldr	x4, [x29,136]
-.L791:
+	ldr	w4, [x29, 120]
+	ldr	x6, [x29, 128]
+.L813:
 	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x1, [x0,1112]
-	ldrh	w0, [x0,3406]
-	ldrh	w1, [x1,x28,lsl 1]
+	ldr	x1, [x0, 1120]
+	ldrh	w0, [x0, 3402]
+	ldrh	w1, [x1, x6, lsl 1]
 	cmp	w1, w0
-	bcs	.L792
+	bcs	.L814
+	mov	w2, 0
 	mov	w1, 0
 	mov	w0, w4
-	mov	w2, w1
 	bl	gc_add_sblk
-	cbz	w0, .L793
-	add	w5, w24, 1
-	uxth	w24, w5
-	cmp	w24, w21
-	bcc	.L793
-	b	.L794
-.L792:
-	adrp	x0, .LANCHOR3
-	add	x0, x0, :lo12:.LANCHOR3
-	strh	wzr, [x0,1362]
-	b	.L794
-.L790:
-	strh	wzr, [x20,1362]
-	b	.L794
-.L793:
-	add	w25, w25, 1
-	uxth	w25, w25
-	b	.L788
-.L794:
-	ldr	x0, [x29,144]
-	tbz	x0, 1, .L796
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x0,3386]
+	cbz	w0, .L815
+	add	w5, w23, 1
+	and	w23, w5, 65535
+	cmp	w23, w20
+	bcc	.L815
+.L816:
+	ldr	x0, [x29, 144]
+	tbz	x0, 1, .L818
+	add	x6, x19, :lo12:.LANCHOR0
+	ldrh	w0, [x6, 3378]
 	cmp	w0, 32
-	bls	.L796
-	adrp	x28, .LANCHOR3
-	mov	w25, 0
-	add	x28, x28, :lo12:.LANCHOR3
-	mov	w26, 65535
-	add	x0, x28, 1376
-	uxth	w27, w21
-	str	x0, [x29,136]
-.L797:
-	cmp	w25, w22
-	adrp	x20, .LANCHOR3
-	bge	.L801
-	ldrh	w2, [x28,1364]
-	ldr	x0, [x29,136]
-	mov	w1, w2
-	str	x2, [x29,128]
+	bls	.L818
+	adrp	x27, .LANCHOR3
+	add	x25, x27, :lo12:.LANCHOR3
+	add	x0, x25, 1368
+	mov	x26, x6
+	str	x0, [x29, 136]
+	mov	w24, 0
+	and	w0, w20, 65535
+	str	w0, [x29, 128]
+.L819:
+	cmp	w28, w24
+	ble	.L823
+	ldrh	w7, [x25, 1356]
+	ldr	x0, [x29, 136]
+	mov	w1, w7
 	bl	_list_get_gc_head_node
-	uxth	w1, w0
-	ldr	x2, [x29,128]
-	cmp	w1, w26
-	add	w2, w2, 1
-	strh	w2, [x28,1364]
-	beq	.L798
-	add	x2, x19, :lo12:.LANCHOR0
+	add	w7, w7, 1
+	strh	w7, [x25, 1356]
+	and	w1, w0, 65535
+	mov	w2, 65535
+	cmp	w1, w2
+	beq	.L820
+	ldr	x2, [x26, 1120]
 	ubfiz	x1, x1, 1, 16
-	ldr	x4, [x2,1112]
-	ldrh	w4, [x4,x1]
-	ldrh	w1, [x2,3408]
-	cmp	w4, w1
-	bcs	.L798
+	ldrh	w2, [x2, x1]
+	ldrh	w1, [x26, 3400]
+	cmp	w2, w1
+	bcs	.L820
+	mov	w2, 0
 	mov	w1, 0
-	mov	w2, w1
 	bl	gc_add_sblk
-	cbz	w0, .L800
-	add	w5, w24, 1
-	uxth	w24, w5
-	cmp	w24, w27
-	bcc	.L800
-	b	.L801
-.L798:
-	strh	wzr, [x28,1364]
-	b	.L801
-.L800:
-	add	w3, w25, 1
-	uxth	w25, w3
-	b	.L797
-.L801:
-	cmp	w24, w21
-	bcs	.L803
-	add	x20, x20, :lo12:.LANCHOR3
+	cbz	w0, .L822
+	add	w5, w23, 1
+	ldr	w0, [x29, 128]
+	and	w23, w5, 65535
+	cmp	w23, w0
+	bcc	.L822
+.L823:
+	cmp	w23, w20
+	bcs	.L825
+	add	x27, x27, :lo12:.LANCHOR3
 	add	x2, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x20,1346]
-	ldrb	w4, [x20,1329]
-	ldrh	w1, [x20,1384]
-	ldrh	w3, [x2,3408]
+	ldrh	w0, [x27, 1338]
+	ldrb	w4, [x27, 1321]
+	ldrh	w1, [x27, 1376]
+	ldrh	w3, [x2, 3400]
 	mul	w0, w0, w4
 	sub	w0, w0, w1, lsr 2
 	cmp	w3, w0
-	bge	.L796
+	bge	.L818
 	add	w1, w3, w1, lsr 3
-	strh	w1, [x2,3408]
-	b	.L796
-.L803:
-	add	x1, x19, :lo12:.LANCHOR0
-	add	x20, x20, :lo12:.LANCHOR3
-	ldrh	w2, [x1,3408]
-	ldrh	w0, [x20,1384]
-	cmp	w2, w0
-	bls	.L796
-	sub	w0, w2, w0, lsr 3
-	strh	w0, [x1,3408]
-.L796:
-	ldr	x0, [x29,144]
-	tbz	x0, 0, .L804
-	uxth	w27, w21
-	cmp	w24, w27
-	bcs	.L804
-	mov	w22, 0
-	adrp	x25, .LANCHOR3
+	strh	w1, [x2, 3400]
+.L818:
+	ldr	x0, [x29, 144]
+	tbz	x0, 0, .L826
+	and	w25, w20, 65535
+	cmp	w23, w25
+	bcs	.L826
+	adrp	x24, .LANCHOR3
+	add	x27, x24, :lo12:.LANCHOR3
 	mov	w26, 65535
-.L809:
-	add	x28, x25, :lo12:.LANCHOR3
-	ldrh	w20, [x28,1360]
-	mov	w0, w20
-	add	w20, w20, 1
+.L831:
+	ldrh	w6, [x27, 1352]
+	mov	w0, w6
 	bl	zftl_get_gc_node.part.10
-	strh	w20, [x28,1360]
+	add	w6, w6, 1
+	strh	w6, [x27, 1352]
 	cmp	w26, w0, uxth
-	adrp	x20, .LANCHOR3
-	beq	.L805
+	beq	.L827
+	mov	w2, 0
 	mov	w1, 0
-	mov	w2, w1
 	bl	gc_add_sblk
-	cbz	w0, .L806
-	add	w5, w24, 1
-	uxth	w24, w5
-	cmp	w24, w27
-	bcc	.L806
-	b	.L807
-.L805:
-	strh	wzr, [x28,1360]
-	b	.L808
-.L806:
-	add	w22, w22, 1
-	uxth	w22, w22
-	cmp	w22, w27
-	bcc	.L809
-.L808:
-	cmp	w24, w27
-	bcs	.L807
-	add	x19, x19, :lo12:.LANCHOR0
-	add	x20, x20, :lo12:.LANCHOR3
-	ldrh	w1, [x19,3406]
-	ldrh	w0, [x20,1384]
-	cmp	w1, w0
-	bcs	.L804
-	add	w0, w1, w0, lsr 3
-	b	.L908
-.L807:
-	add	x20, x20, :lo12:.LANCHOR3
+	cbz	w0, .L828
+	add	w5, w23, 1
+	and	w23, w5, 65535
+	cmp	w25, w23
+	bhi	.L828
+.L829:
+	add	x24, x24, :lo12:.LANCHOR3
 	add	x19, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x20,1384]
-	ldrh	w1, [x19,3406]
+	ldrh	w0, [x24, 1376]
+	ldrh	w1, [x19, 3402]
 	cmp	w1, w0, lsr 1
-	bls	.L804
+	bls	.L826
 	sub	w0, w1, w0, lsr 3
-.L908:
-	strh	w0, [x19,3406]
-	b	.L804
-.L909:
-	adrp	x20, .LANCHOR3
-	cmp	w21, 1
-	add	x1, x20, :lo12:.LANCHOR3
-	ldrb	w0, [x1,1329]
-	ldrh	w22, [x1,1346]
-	mul	w22, w0, w22
-	uxth	w22, w22
-	bne	.L810
-	cbz	w2, .L810
-	ldrh	w1, [x3,80]
-	mov	w0, 65535
-	mov	w21, 8
+	b	.L917
+.L814:
+	add	x25, x25, :lo12:.LANCHOR3
+	strh	wzr, [x25, 1354]
+	b	.L816
+.L812:
+	strh	wzr, [x26, 1354]
+	b	.L816
+.L815:
+	add	w24, w24, 1
+	and	w24, w24, 65535
+	b	.L811
+.L820:
+	strh	wzr, [x25, 1356]
+	b	.L823
+.L822:
+	add	w3, w24, 1
+	and	w24, w3, 65535
+	b	.L819
+.L825:
+	add	x1, x19, :lo12:.LANCHOR0
+	add	x27, x27, :lo12:.LANCHOR3
+	ldrh	w2, [x1, 3400]
+	ldrh	w0, [x27, 1376]
+	cmp	w2, w0
+	bls	.L818
+	sub	w0, w2, w0, lsr 3
+	strh	w0, [x1, 3400]
+	b	.L818
+.L827:
+	strh	wzr, [x27, 1352]
+.L830:
+	cmp	w23, w25
+	bcs	.L829
+	add	x19, x19, :lo12:.LANCHOR0
+	add	x24, x24, :lo12:.LANCHOR3
+	ldrh	w1, [x19, 3402]
+	ldrh	w0, [x24, 1376]
 	cmp	w1, w0
-	beq	.L810
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x0,5530]
-	sub	w22, w22, w0
-	uxth	w22, w22
+	bcs	.L826
+	add	w0, w1, w0, lsr 3
+.L917:
+	strh	w0, [x19, 3402]
+.L826:
+	adrp	x0, .LANCHOR2
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 8, .L862
+	ldr	w2, [x29, 144]
+	adrp	x0, .LC99
+	mov	w4, w20
+	mov	w3, w23
+	mov	w1, w22
+	add	x0, x0, :lo12:.LC99
+	bl	printk
+.L862:
+	mov	w0, w23
+	b	.L806
+.L828:
+	add	w21, w21, 1
+	and	w21, w21, 65535
+	cmp	w25, w21
+	bhi	.L831
+	b	.L830
 .L810:
-	ldr	w0, [x29,144]
-	add	x1, x19, :lo12:.LANCHOR0
-	add	x3, x20, :lo12:.LANCHOR3
+	adrp	x24, .LANCHOR3
+	add	x0, x24, :lo12:.LANCHOR3
+	cmp	w20, 1
+	ldrb	w25, [x0, 1321]
+	ldrh	w0, [x0, 1338]
+	mul	w25, w25, w0
+	and	w25, w25, 65535
+	bne	.L832
+	cbz	w1, .L832
+	ldrh	w2, [x2, 80]
+	mov	w0, 65535
+	cmp	w2, w0
+	beq	.L865
+	add	x0, x19, :lo12:.LANCHOR0
+	ldrh	w0, [x0, 5522]
+	sub	w25, w25, w0
+	and	w25, w25, 65535
+.L865:
+	mov	w20, 8
+.L832:
+	ldr	w0, [x29, 144]
+	add	x2, x19, :lo12:.LANCHOR0
+	add	x3, x24, :lo12:.LANCHOR3
 	and	w0, w0, 1
-	str	w0, [x29,136]
-	ldr	x0, [x29,144]
-	strh	wzr, [x1,5616]
-	strh	wzr, [x3,1386]
-	tbz	x0, 0, .L844
-	ldrh	w3, [x3,1388]
-	ldrh	w0, [x1,3382]
+	str	w0, [x29, 136]
+	ldr	x0, [x29, 144]
+	strh	wzr, [x2, 5608]
+	strh	wzr, [x3, 1378]
+	tbz	x0, 0, .L866
+	ldrh	w0, [x2, 3374]
+	ldrh	w3, [x3, 1380]
 	cmp	w0, w3, lsr 2
-	bhi	.L812
-	ldrh	w1, [x1,3384]
-	cmp	w1, w0
-	bcs	.L845
-.L812:
-	cmp	w2, 1
-	bls	.L814
-.L816:
-	mov	w24, 0
-	b	.L815
-.L814:
-	add	x26, x20, :lo12:.LANCHOR3
-	lsr	w0, w0, 2
-	strh	w0, [x26,1360]
-	mov	w0, 0
-	bl	zftl_get_gc_node.part.10
-	uxth	w1, w0
-	mov	w2, 65535
-	cmp	w1, w2
-	beq	.L816
-	add	x2, x19, :lo12:.LANCHOR0
-	ubfiz	x1, x1, 1, 16
-	ldr	x3, [x2,1112]
-	ldrh	w2, [x26,1384]
-	ldrh	w1, [x3,x1]
-	cmp	w1, w2, lsr 2
-	bcs	.L816
-	mov	w1, 1
-	mov	w2, w23
-	strh	w1, [x26,1360]
-	mov	w1, 0
-	bl	gc_add_sblk
-	cmp	w0, wzr
-	cset	w24, ne
-.L815:
-	mov	w28, 64
-	mov	w25, 0
-	mov	w26, 65535
-	uxth	w27, w21
-.L819:
-	add	x2, x20, :lo12:.LANCHOR3
-	str	x2, [x29,112]
-	ldrh	w1, [x2,1360]
-	str	x1, [x29,120]
-	mov	w0, w1
+	bhi	.L834
+	ldrh	w2, [x2, 3376]
+	cmp	w2, w0
+	bcs	.L867
+.L834:
+	cmp	w1, 1
+	bls	.L836
+.L838:
+	mov	w23, 0
+.L837:
+	add	x27, x24, :lo12:.LANCHOR3
+	add	x8, x19, :lo12:.LANCHOR0
+	and	w0, w20, 65535
+	mov	w28, 0
+	mov	w26, 64
+	str	w0, [x29, 128]
+.L841:
+	ldrh	w6, [x27, 1352]
+	str	x8, [x29, 112]
+	mov	w0, w6
 	bl	zftl_get_gc_node.part.10
-	uxth	w4, w0
-	cmp	w4, w26
-	str	x4, [x29,128]
-	ldr	x2, [x29,112]
-	beq	.L817
-	ldr	x1, [x29,120]
-	add	w1, w1, 1
-	strh	w1, [x2,1360]
+	and	w4, w0, 65535
+	str	w4, [x29, 120]
+	mov	w1, 65535
+	cmp	w4, w1
+	beq	.L839
+	add	w6, w6, 1
+	mov	w2, w22
+	strh	w6, [x27, 1352]
 	mov	w1, 0
-	mov	w2, w23
 	bl	gc_add_sblk
-	ldr	x4, [x29,128]
-	cbz	w0, .L818
-	add	x0, x19, :lo12:.LANCHOR0
+	ldr	x8, [x29, 112]
+	cbz	w0, .L840
+	ldr	w4, [x29, 120]
+	add	w5, w23, 1
+	ldr	x0, [x8, 1120]
+	and	w23, w5, 65535
 	ubfiz	x4, x4, 1, 16
-	add	w5, w24, 1
-	ldr	x1, [x0,1112]
-	uxth	w24, w5
-	ldrh	w1, [x1,x4]
-	add	w3, w25, w1
-	uxth	w25, w3
-	cmp	w25, w22
-	bhi	.L813
-	cmp	w24, w27
-	bcs	.L813
-	ldrh	w1, [x0,3384]
-	ldrh	w0, [x0,3382]
-	cmp	w1, w0, lsl 1
-	ble	.L818
-	b	.L813
-.L817:
-	strh	wzr, [x2,1360]
-	b	.L813
-.L818:
-	sub	w28, w28, #1
-	uxth	w28, w28
-	cbnz	w28, .L819
-	b	.L813
-.L844:
-	ldr	w25, [x29,136]
-	mov	x24, x25
-.L811:
-	ldr	x0, [x29,144]
-	tbz	x0, 1, .L823
-	cmp	w25, w22
-	bcs	.L823
+	ldrh	w0, [x0, x4]
+	add	w3, w28, w0
+	ldr	w0, [x29, 128]
+	and	w28, w3, 65535
+	cmp	w23, w0
+	bcs	.L835
+	cmp	w25, w28
+	bcc	.L835
+	ldrh	w0, [x8, 3376]
+	ldrh	w1, [x8, 3374]
+	cmp	w0, w1, lsl 1
+	ble	.L840
+.L835:
+	add	x0, x19, :lo12:.LANCHOR0
+	add	x2, x24, :lo12:.LANCHOR3
+	ldrh	w1, [x0, 3376]
+	ldrh	w2, [x2, 1380]
+	cmp	w1, w2, lsr 2
+	bhi	.L863
+	ldrh	w0, [x0, 3374]
+	add	w0, w0, 8
+	cmp	w1, w0
+	ble	.L833
+.L863:
+	cmp	w25, w28
+	bls	.L833
+	add	x27, x24, :lo12:.LANCHOR3
+	mov	w26, 64
+	add	x0, x27, 1360
+	str	x0, [x29, 128]
 	add	x0, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x0,3386]
+	str	x0, [x29, 120]
+	and	w0, w20, 65535
+	str	w0, [x29, 112]
+.L844:
+	ldrh	w6, [x27, 1354]
+	ldr	x0, [x29, 128]
+	mov	w1, w6
+	bl	_list_get_gc_head_node
+	and	w7, w0, 65535
+	str	w7, [x29, 104]
+	mov	w1, 65535
+	cmp	w7, w1
+	beq	.L842
+	add	w6, w6, 1
+	mov	w2, w22
+	strh	w6, [x27, 1354]
+	mov	w1, 0
+	bl	gc_add_sblk
+	cbz	w0, .L843
+	ldr	x0, [x29, 120]
+	add	w5, w23, 1
+	ldr	w7, [x29, 104]
+	and	w23, w5, 65535
+	ldr	x0, [x0, 1120]
+	ubfiz	x7, x7, 1, 16
+	ldrh	w0, [x0, x7]
+	add	w3, w28, w0
+	ldr	w0, [x29, 112]
+	and	w28, w3, 65535
+	cmp	w23, w0
+	bcs	.L833
+	cmp	w25, w28
+	bcs	.L843
+.L833:
+	ldr	x0, [x29, 144]
+	tbz	x0, 1, .L845
+	add	x7, x19, :lo12:.LANCHOR0
+	ldrh	w0, [x7, 3378]
 	cmp	w0, 32
-	bls	.L823
-	add	x28, x20, :lo12:.LANCHOR3
-	mov	w27, 64
-	add	x0, x28, 1376
-	mov	w26, 0
-	str	x0, [x29,128]
-	uxth	w0, w21
-	str	w0, [x29,120]
-.L829:
-	ldrh	w2, [x28,1364]
-	ldr	x0, [x29,128]
-	mov	w1, w2
-	str	x2, [x29,112]
+	bls	.L845
+	cmp	w28, w25
+	bcs	.L845
+	add	x27, x24, :lo12:.LANCHOR3
+	mov	w26, 64
+	add	x0, x27, 1368
+	str	x0, [x29, 128]
+	and	w0, w20, 65535
+	str	w0, [x29, 120]
+.L851:
+	ldrh	w8, [x27, 1356]
+	ldr	x0, [x29, 128]
+	mov	w1, w8
+	str	x7, [x29, 112]
 	bl	_list_get_gc_head_node
-	uxth	w8, w0
+	and	w4, w0, 65535
 	mov	w1, 65535
-	cmp	w8, w1
-	beq	.L824
-	ldr	x2, [x29,112]
-	cmp	w21, 1
-	add	w2, w2, 1
-	strh	w2, [x28,1364]
-	bne	.L825
-	ldrh	w9, [x28,1346]
-	add	x1, x19, :lo12:.LANCHOR0
-	ldrb	w2, [x28,1329]
-	mul	w2, w2, w9
-	ldrh	w9, [x28,1384]
-	sub	w2, w2, w9, lsr 3
-	strh	w2, [x1,3402]
-.L825:
-	add	x9, x19, :lo12:.LANCHOR0
-	ubfiz	x8, x8, 1, 16
-	str	x9, [x29,112]
-	str	x8, [x29,104]
-	ldr	x1, [x9,1112]
-	ldrh	w2, [x1,x8]
-	ldrh	w1, [x9,3402]
+	cmp	w4, w1
+	beq	.L846
+	add	w8, w8, 1
+	strh	w8, [x27, 1356]
+	cmp	w20, 1
+	ldr	x7, [x29, 112]
+	bne	.L847
+	ldrb	w1, [x27, 1321]
+	ldrh	w2, [x27, 1338]
+	mul	w2, w1, w2
+	ldrh	w1, [x27, 1376]
+	sub	w1, w2, w1, lsr 3
+	strh	w1, [x7, 3406]
+.L847:
+	ldr	x1, [x7, 1120]
+	ubfiz	x4, x4, 1, 16
+	stp	x4, x7, [x29, 104]
+	ldrh	w2, [x1, x4]
+	ldrh	w1, [x7, 3406]
 	cmp	w2, w1
-	bcs	.L826
+	bcs	.L848
+	mov	w2, w22
 	mov	w1, 0
-	mov	w2, w23
 	bl	gc_add_sblk
-	ldr	x9, [x29,112]
-	ldr	x8, [x29,104]
-	cbz	w0, .L827
-	ldr	x0, [x9,1112]
-	add	w6, w26, 1
-	add	w5, w24, 1
-	uxth	w26, w6
-	ldrh	w0, [x0,x8]
-	uxth	w24, w5
-	add	w3, w25, w0
-	uxth	w25, w3
-	cmp	w25, w22
-	bhi	.L828
-	ldr	w0, [x29,120]
-	cmp	w24, w0
-	bcc	.L827
-	b	.L828
-.L826:
-	add	x0, x20, :lo12:.LANCHOR3
-	strh	wzr, [x0,1364]
-	b	.L828
-.L824:
-	strh	wzr, [x28,1364]
-	b	.L828
-.L827:
-	sub	w7, w27, #1
-	uxth	w27, w7
-	cbnz	w27, .L829
-.L828:
-	cmp	w24, w21
-	bcc	.L830
-	cbnz	w26, .L831
+	ldr	x7, [x29, 112]
+	cbz	w0, .L849
+	ldr	x0, [x7, 1120]
+	add	w5, w23, 1
+	ldr	x4, [x29, 104]
+	add	w21, w21, 1
+	and	w23, w5, 65535
+	and	w21, w21, 65535
+	ldrh	w0, [x0, x4]
+	add	w3, w28, w0
+	ldr	w0, [x29, 120]
+	and	w28, w3, 65535
+	cmp	w23, w0
+	bcs	.L850
+	cmp	w25, w28
+	bcs	.L849
+.L850:
+	cmp	w23, w20
+	bcc	.L852
+	cbnz	w21, .L853
 	add	x1, x19, :lo12:.LANCHOR0
-	add	x0, x20, :lo12:.LANCHOR3
-	ldrh	w1, [x1,3386]
-	ldrh	w0, [x0,1390]
+	add	x0, x24, :lo12:.LANCHOR3
+	ldrh	w1, [x1, 3378]
+	ldrh	w0, [x0, 1382]
 	cmp	w1, w0
-	bls	.L831
-.L830:
-	add	x4, x20, :lo12:.LANCHOR3
+	bls	.L853
+.L852:
+	add	x4, x24, :lo12:.LANCHOR3
 	add	x6, x19, :lo12:.LANCHOR0
-	ldrh	w2, [x4,1384]
-	ldrh	w0, [x4,1346]
-	ldrb	w4, [x4,1329]
+	ldrh	w2, [x4, 1376]
+	ldrh	w0, [x4, 1338]
+	ldrb	w4, [x4, 1321]
+	ldrh	w1, [x6, 3406]
 	lsr	w2, w2, 3
-	ldrh	w1, [x6,3402]
 	mul	w0, w0, w4
 	sub	w0, w0, w2
 	cmp	w1, w0
-	bge	.L823
-	add	w1, w2, w1
-	strh	w1, [x6,3402]
-	b	.L823
-.L831:
-	add	x20, x20, :lo12:.LANCHOR3
-	add	x19, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x20,1384]
-	ldrb	w1, [x20,1329]
-	ldrh	w2, [x19,3402]
-	mul	w1, w0, w1
-	cmp	w2, w1
-	ble	.L804
-	sub	w0, w2, w0, lsr 3
-	strh	w0, [x19,3402]
-	b	.L804
-.L823:
-	ldr	w0, [x29,136]
-	cbz	w0, .L804
-	uxth	w26, w21
-	cmp	w24, w26
-	bcs	.L804
-	cmp	w25, w22
-	bcs	.L804
-	add	x4, x20, :lo12:.LANCHOR3
-	mov	w27, 64
-	add	x0, x4, 1368
-	str	x0, [x29,136]
-.L837:
-	ldrh	w28, [x4,1362]
-	ldr	x0, [x29,136]
-	mov	w1, w28
-	str	x4, [x29,128]
+	bge	.L845
+	add	w1, w1, w2
+	strh	w1, [x6, 3406]
+.L845:
+	ldr	w0, [x29, 136]
+	cbz	w0, .L826
+	and	w27, w20, 65535
+	cmp	w23, w27
+	bcs	.L826
+	cmp	w28, w25
+	bcs	.L826
+	add	x4, x24, :lo12:.LANCHOR3
+	add	x7, x19, :lo12:.LANCHOR0
+	add	x0, x4, 1360
+	mov	w26, 64
+	str	x0, [x29, 136]
+.L861:
+	ldrh	w6, [x4, 1354]
+	ldr	x0, [x29, 136]
+	mov	w1, w6
+	stp	x7, x4, [x29, 120]
 	bl	_list_get_gc_head_node
-	uxth	w1, w0
-	mov	w2, 65535
-	ldr	x4, [x29,128]
-	cmp	w1, w2
-	beq	.L833
-	add	w28, w28, 1
-	strh	w28, [x4,1362]
-	ubfiz	x28, x1, 1, 16
-	add	x1, x19, :lo12:.LANCHOR0
-	ldr	x2, [x1,1112]
-	ldrh	w7, [x2,x28]
-	ldrh	w2, [x1,3404]
-	cmp	w7, w2
-	bcs	.L834
-	ldrh	w2, [x4,1388]
-	ldrh	w1, [x1,3384]
+	and	w21, w0, 65535
+	mov	w1, 65535
+	ldr	x4, [x29, 128]
+	cmp	w21, w1
+	beq	.L855
+	ldr	x7, [x29, 120]
+	ubfiz	x21, x21, 1, 16
+	add	w6, w6, 1
+	strh	w6, [x4, 1354]
+	ldr	x1, [x7, 1120]
+	ldrh	w2, [x1, x21]
+	ldrh	w1, [x7, 3404]
+	cmp	w2, w1
+	bcs	.L856
+	ldrh	w2, [x4, 1380]
+	ldrh	w1, [x7, 3376]
 	cmp	w1, w2, lsr 1
-	bls	.L835
-.L834:
+	bls	.L857
+.L856:
+	stp	x7, x4, [x29, 120]
+	mov	w2, w22
 	mov	w1, 0
-	mov	w2, w23
-	str	x4, [x29,128]
 	bl	gc_add_sblk
-	ldr	x4, [x29,128]
-	cbz	w0, .L836
-	add	x0, x19, :lo12:.LANCHOR0
-	add	w5, w24, 1
-	uxth	w24, w5
-	ldr	x0, [x0,1112]
-	ldrh	w0, [x0,x28]
-	add	w3, w25, w0
-	uxth	w25, w3
-	cmp	w25, w22
-	bhi	.L835
-	cmp	w24, w26
-	bcc	.L836
-	b	.L835
-.L833:
-	cmp	w28, 64
-	bls	.L835
-	strh	wzr, [x4,1362]
-	b	.L835
-.L836:
-	sub	w27, w27, #1
-	uxth	w27, w27
-	cbnz	w27, .L837
-.L835:
-	cmp	w24, w26
+	ldp	x7, x4, [x29, 120]
+	cbz	w0, .L858
+	ldr	x0, [x7, 1120]
+	add	w5, w23, 1
+	and	w23, w5, 65535
+	cmp	w27, w23
+	ldrh	w0, [x0, x21]
+	add	w3, w28, w0
+	and	w28, w3, 65535
+	bls	.L859
+	cmp	w25, w28
+	bcs	.L858
+.L860:
+	add	x24, x24, :lo12:.LANCHOR3
 	add	x19, x19, :lo12:.LANCHOR0
-	bcs	.L838
-	add	x20, x20, :lo12:.LANCHOR3
-	ldrh	w1, [x19,3404]
-	ldrh	w0, [x20,1384]
+	ldrh	w0, [x24, 1376]
+	ldrh	w1, [x19, 3404]
 	cmp	w1, w0, lsr 1
-	bls	.L804
+	bls	.L826
 	sub	w0, w1, w0, lsr 3
-	strh	w0, [x19,3404]
-	b	.L804
-.L838:
-	add	x20, x20, :lo12:.LANCHOR3
-	ldrh	w2, [x19,3404]
-	ldrh	w1, [x20,1384]
-	ldrb	w0, [x20,1329]
-	mul	w0, w1, w0
-	sub	w0, w0, #32
-	cmp	w2, w0
-	bge	.L804
-	add	w1, w2, w1, lsr 3
-	strh	w1, [x19,3404]
-.L804:
-	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 8, .L839
-	adrp	x0, .LC102
-	ldr	w2, [x29,144]
-	add	x0, x0, :lo12:.LC102
-	mov	w1, w23
-	mov	w3, w24
-	mov	w4, w21
-	bl	printk
-.L839:
-	mov	w0, w24
-	b	.L905
-.L845:
-	mov	w25, 0
-	mov	w24, w25
-.L813:
-	add	x2, x20, :lo12:.LANCHOR3
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrh	w2, [x2,1388]
-	ldrh	w1, [x0,3384]
+	strh	w0, [x19, 3404]
+	b	.L826
+.L836:
+	add	x5, x24, :lo12:.LANCHOR3
+	lsr	w0, w0, 2
+	strh	w0, [x5, 1352]
+	mov	w0, 0
+	bl	zftl_get_gc_node.part.10
+	and	w1, w0, 65535
+	mov	w2, 65535
+	cmp	w1, w2
+	beq	.L838
+	add	x2, x19, :lo12:.LANCHOR0
+	ubfiz	x1, x1, 1, 16
+	ldr	x3, [x2, 1120]
+	ldrh	w2, [x5, 1376]
+	ldrh	w1, [x3, x1]
 	cmp	w1, w2, lsr 2
-	bhi	.L840
-	ldrh	w0, [x0,3382]
-	add	w0, w0, 8
-	cmp	w1, w0
-	ble	.L811
-.L840:
-	cmp	w25, w22
-	bcs	.L811
-	add	x27, x20, :lo12:.LANCHOR3
-	mov	w26, 64
-	add	x0, x27, 1368
-	uxth	w28, w21
-	str	x0, [x29,128]
-.L822:
-	ldrh	w2, [x27,1362]
-	ldr	x0, [x29,128]
-	mov	w1, w2
-	str	x2, [x29,112]
-	bl	_list_get_gc_head_node
-	uxth	w7, w0
-	mov	w1, 65535
-	str	x7, [x29,120]
-	cmp	w7, w1
-	ldr	x2, [x29,112]
-	beq	.L820
-	add	w2, w2, 1
+	bcs	.L838
+	mov	w1, 1
+	mov	w2, w22
+	strh	w1, [x5, 1352]
 	mov	w1, 0
-	strh	w2, [x27,1362]
-	mov	w2, w23
 	bl	gc_add_sblk
-	ldr	x7, [x29,120]
-	cbz	w0, .L821
-	add	x0, x19, :lo12:.LANCHOR0
-	ubfiz	x7, x7, 1, 16
-	add	w5, w24, 1
-	ldr	x0, [x0,1112]
-	uxth	w24, w5
-	ldrh	w0, [x0,x7]
-	add	w3, w25, w0
-	uxth	w25, w3
-	cmp	w25, w22
-	bhi	.L811
-	cmp	w24, w28
-	bcc	.L821
-	b	.L811
-.L820:
-	cmp	w2, 64
-	bls	.L811
-	strh	wzr, [x27,1362]
-	b	.L811
-.L821:
-	sub	w4, w26, #1
-	uxth	w26, w4
-	cbnz	w26, .L822
-	b	.L811
-.L905:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 160
-	ret
+	cmp	w0, 0
+	cset	w23, ne
+	b	.L837
+.L839:
+	strh	wzr, [x27, 1352]
+	b	.L835
+.L840:
+	sub	w26, w26, #1
+	ands	w26, w26, 65535
+	bne	.L841
+	b	.L835
+.L842:
+	cmp	w6, 64
+	bls	.L833
+	strh	wzr, [x27, 1354]
+	b	.L833
+.L843:
+	sub	w26, w26, #1
+	ands	w26, w26, 65535
+	bne	.L844
+	b	.L833
+.L866:
+	mov	w28, 0
+	mov	w23, 0
+	b	.L833
+.L848:
+	add	x0, x24, :lo12:.LANCHOR3
+	strh	wzr, [x0, 1356]
+	b	.L850
+.L846:
+	strh	wzr, [x27, 1356]
+	b	.L850
+.L849:
+	sub	w26, w26, #1
+	ands	w26, w26, 65535
+	bne	.L851
+	b	.L850
+.L853:
+	add	x24, x24, :lo12:.LANCHOR3
+	add	x19, x19, :lo12:.LANCHOR0
+	ldrh	w0, [x24, 1376]
+	ldrb	w1, [x24, 1321]
+	ldrh	w2, [x19, 3406]
+	mul	w1, w1, w0
+	cmp	w2, w1
+	ble	.L826
+	sub	w0, w2, w0, lsr 3
+	strh	w0, [x19, 3406]
+	b	.L826
+.L855:
+	cmp	w6, 64
+	bls	.L857
+	strh	wzr, [x4, 1354]
+.L857:
+	cmp	w23, w27
+	bcc	.L860
+.L859:
+	add	x24, x24, :lo12:.LANCHOR3
+	add	x19, x19, :lo12:.LANCHOR0
+	ldrh	w1, [x24, 1376]
+	ldrb	w0, [x24, 1321]
+	ldrh	w2, [x19, 3404]
+	mul	w0, w0, w1
+	sub	w0, w0, #32
+	cmp	w2, w0
+	bge	.L826
+	add	w1, w2, w1, lsr 3
+	strh	w1, [x19, 3404]
+	b	.L826
+.L858:
+	sub	w26, w26, #1
+	ands	w26, w26, 65535
+	bne	.L861
+	b	.L857
+.L867:
+	mov	w28, 0
+	mov	w23, 0
+	b	.L835
 	.size	gc_search_src_blk, .-gc_search_src_blk
 	.align	2
 	.global	zftl_get_gc_node
 	.type	zftl_get_gc_node, %function
 zftl_get_gc_node:
 	stp	x29, x30, [sp, -16]!
-	uxth	w1, w1
-	uxth	w2, w0
+	and	w1, w1, 65535
+	and	w0, w0, 65535
 	cmp	w1, 5
 	add	x29, sp, 0
-	bne	.L911
-	adrp	x0, .LANCHOR3
-	add	x0, x0, :lo12:.LANCHOR3
-	add	x0, x0, 1376
-	b	.L914
-.L911:
-	cmp	w1, 2
-	bne	.L913
-	mov	w0, w2
-	bl	zftl_get_gc_node.part.10
-	b	.L915
-.L913:
+	bne	.L919
+	mov	w1, w0
 	adrp	x0, .LANCHOR3
 	add	x0, x0, :lo12:.LANCHOR3
 	add	x0, x0, 1368
-.L914:
-	mov	w1, w2
+.L923:
 	bl	_list_get_gc_head_node
-.L915:
-	uxth	w0, w0
+	b	.L924
+.L919:
+	cmp	w1, 2
+	bne	.L921
+	bl	zftl_get_gc_node.part.10
+.L924:
+	and	w0, w0, 65535
 	ldp	x29, x30, [sp], 16
 	ret
+.L921:
+	mov	w1, w0
+	adrp	x0, .LANCHOR3
+	add	x0, x0, :lo12:.LANCHOR3
+	add	x0, x0, 1360
+	b	.L923
 	.size	zftl_get_gc_node, .-zftl_get_gc_node
 	.align	2
 	.global	zftl_insert_free_list
 	.type	zftl_insert_free_list, %function
 zftl_insert_free_list:
 	adrp	x2, .LANCHOR0
-	uxth	w1, w0
 	add	x2, x2, :lo12:.LANCHOR0
-	adrp	x3, .LANCHOR3
 	stp	x29, x30, [sp, -16]!
+	and	w1, w0, 65535
+	adrp	x3, .LANCHOR3
+	add	x3, x3, :lo12:.LANCHOR3
 	add	x29, sp, 0
-	ldr	x0, [x2,1096]
+	ldr	x0, [x2, 1104]
 	add	x0, x0, w1, uxth 2
-	ldrb	w0, [x0,2]
+	ldrb	w0, [x0, 2]
 	ands	w0, w0, 24
-	bne	.L917
-	add	x0, x3, :lo12:.LANCHOR3
-	add	x2, x2, 3376
-	add	x0, x0, 1392
-	b	.L920
-.L917:
-	cmp	w0, 16
-	add	x0, x3, :lo12:.LANCHOR3
-	bne	.L919
-	add	x0, x0, 1400
-	add	x2, x2, 3378
-	b	.L920
-.L919:
-	add	x0, x0, 1408
-	add	x2, x2, 3380
-.L920:
+	bne	.L926
+	add	x2, x2, 3368
+	add	x0, x3, 1384
+.L930:
 	bl	_insert_free_list
 	ldp	x29, x30, [sp], 16
 	ret
+.L926:
+	cmp	w0, 16
+	bne	.L928
+	add	x2, x2, 3370
+	add	x0, x3, 1392
+	b	.L930
+.L928:
+	add	x2, x2, 3372
+	add	x0, x3, 1400
+	b	.L930
 	.size	zftl_insert_free_list, .-zftl_insert_free_list
 	.align	2
 	.global	zftl_insert_data_list
 	.type	zftl_insert_data_list, %function
 zftl_insert_data_list:
 	adrp	x2, .LANCHOR0
-	uxth	w1, w0
 	add	x2, x2, :lo12:.LANCHOR0
 	stp	x29, x30, [sp, -16]!
+	and	w1, w0, 65535
 	add	x29, sp, 0
-	ldr	x0, [x2,1096]
+	ldr	x0, [x2, 1104]
 	add	x0, x0, w1, uxth 2
-	ldrb	w3, [x0,2]
+	ldrb	w3, [x0, 2]
 	and	w3, w3, 224
 	cmp	w3, 64
-	bne	.L922
+	bne	.L932
 	adrp	x0, .LANCHOR3
-	add	x2, x2, 3382
 	add	x0, x0, :lo12:.LANCHOR3
-	add	x0, x0, 1352
-	b	.L925
-.L922:
+	add	x2, x2, 3374
+	add	x0, x0, 1344
+.L936:
+	bl	_insert_data_list
+.L931:
+	ldp	x29, x30, [sp], 16
+	ret
+.L932:
 	cmp	w3, 96
-	bne	.L924
+	bne	.L934
 	adrp	x0, .LANCHOR3
-	add	x2, x2, 3384
 	add	x0, x0, :lo12:.LANCHOR3
-	add	x0, x0, 1368
-	b	.L925
-.L924:
+	add	x2, x2, 3376
+	add	x0, x0, 1360
+	b	.L936
+.L934:
 	cmp	w3, 160
-	bne	.L921
+	bne	.L931
 	adrp	x0, .LANCHOR3
-	add	x2, x2, 3386
 	add	x0, x0, :lo12:.LANCHOR3
-	add	x0, x0, 1376
-.L925:
-	bl	_insert_data_list
-.L921:
-	ldp	x29, x30, [sp], 16
-	ret
+	add	x2, x2, 3378
+	add	x0, x0, 1368
+	b	.L936
 	.size	zftl_insert_data_list, .-zftl_insert_data_list
 	.align	2
 	.global	zftl_gc_get_free_sblk
@@ -5895,421 +5700,411 @@ zftl_insert_data_list:
 zftl_gc_get_free_sblk:
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR0
-	str	x23, [sp,48]
-	stp	x21, x22, [sp,32]
-	add	x21, x20, :lo12:.LANCHOR0
-	uxth	w22, w0
-	uxth	w23, w1
-	ldr	x0, [x21,1120]
-	ldrh	w19, [x0,588]
-	cbnz	w22, .L927
+	stp	x21, x22, [sp, 32]
+	and	w22, w0, 65535
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR0
+	add	x21, x19, :lo12:.LANCHOR0
+	str	x23, [sp, 48]
+	and	w23, w1, 65535
+	ldr	x0, [x21, 1128]
+	ldrh	w20, [x0, 588]
 	mov	w0, 65535
-	cmp	w19, w0
-	beq	.L927
-	adrp	x0, .LC103
-	mov	w1, w19
-	add	x0, x0, :lo12:.LC103
+	cmp	w20, w0
+	beq	.L938
+	cbnz	w22, .L938
+	mov	w1, w20
+	adrp	x0, .LC100
+	add	x0, x0, :lo12:.LC100
 	bl	printk
-	ldr	x0, [x21,1120]
+	ldr	x0, [x21, 1128]
 	mov	w1, -1
-	strh	w1, [x0,588]
-	b	.L928
-.L927:
-	add	x0, x20, :lo12:.LANCHOR0
+	strh	w1, [x0, 588]
+.L939:
+	mov	w0, w20
+	ldr	x23, [sp, 48]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 64
+	ret
+.L938:
+	add	x2, x19, :lo12:.LANCHOR0
 	adrp	x21, .LANCHOR3
-	ldrh	w3, [x0,3378]
-	ldrh	w1, [x0,3380]
-	cmp	w3, w1
-	bcc	.L929
-	ldrh	w0, [x0,3376]
-	cmp	w0, w3
-	bls	.L930
-	cbz	w1, .L930
-.L929:
+	ldrh	w0, [x2, 3370]
+	ldrh	w1, [x2, 3372]
+	cmp	w0, w1
+	bcc	.L940
+	ldrh	w2, [x2, 3368]
+	cmp	w2, w0
+	bls	.L941
+	cbz	w1, .L941
+.L940:
+	cbnz	w22, .L942
 	lsr	w1, w1, 2
-	cbz	w22, .L932
-	mov	w1, 7
-	mul	w3, w3, w1
-	lsr	w1, w3, 3
-.L932:
-	add	x0, x21, :lo12:.LANCHOR3
-	add	x2, x20, :lo12:.LANCHOR0
-	add	x0, x0, 1408
-	add	x2, x2, 3380
-	b	.L954
-.L930:
-	mov	w1, 0
-	lsr	w3, w3, 3
-	cmp	w22, w1
+.L943:
+	add	x2, x19, :lo12:.LANCHOR0
 	add	x0, x21, :lo12:.LANCHOR3
-	add	x2, x20, :lo12:.LANCHOR0
-	csel	w1, w3, w1, ne
+	add	x2, x2, 3372
 	add	x0, x0, 1400
-	add	x2, x2, 3378
-.L954:
+.L958:
 	bl	_list_pop_index_node
-	uxth	w19, w0
+	and	w20, w0, 65535
 	mov	w0, 65535
-	cmp	w19, w0
-	bne	.L935
-	add	x5, x20, :lo12:.LANCHOR0
+	cmp	w20, w0
+	bne	.L946
+	add	x0, x19, :lo12:.LANCHOR0
 	add	x21, x21, :lo12:.LANCHOR3
-	adrp	x0, .LC104
-	mov	w1, w19
-	add	x0, x0, :lo12:.LC104
 	mov	w2, w23
-	ldrh	w4, [x5,3376]
-	ldr	x3, [x21,1392]
-	ldrh	w5, [x5,3380]
-	bl	printk
-.L935:
-	cbz	w22, .L928
+	mov	w1, w20
+	ldrh	w5, [x0, 3372]
+	ldrh	w4, [x0, 3368]
+	adrp	x0, .LC101
+	ldr	x3, [x21, 1384]
+	add	x0, x0, :lo12:.LC101
+	bl	printk
+.L946:
+	cbz	w22, .L939
 	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 8, .L928
-	add	x20, x20, :lo12:.LANCHOR0
-	uxtw	x6, w19
-	lsl	x0, x6, 2
-	ldr	x1, [x20,1096]
-	ldr	x7, [x20,1112]
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 8, .L939
+	add	x19, x19, :lo12:.LANCHOR0
+	uxtw	x3, w20
+	lsl	x0, x3, 2
+	ldr	x1, [x19, 1104]
+	ldr	x6, [x19, 1120]
 	add	x2, x1, x0
-	ldr	w4, [x1,x0]
-	ldrh	w5, [x1,x0]
-	adrp	x0, .LC105
-	ldrb	w3, [x2,2]
-	add	x0, x0, :lo12:.LC105
-	ldrh	w6, [x7,x6,lsl 1]
-	mov	w1, w19
-	ubfx	x2, x3, 5, 3
+	ldr	w4, [x1, x0]
+	ldrh	w6, [x6, x3, lsl 1]
+	ldrb	w2, [x2, 2]
+	ldrh	w5, [x1, x0]
 	ubfx	x4, x4, 11, 8
-	ubfx	x3, x3, 3, 2
+	mov	w1, w20
+	adrp	x0, .LC102
+	ubfx	x3, x2, 3, 2
 	and	w5, w5, 2047
+	ubfx	x2, x2, 5, 3
+	add	x0, x0, :lo12:.LC102
 	bl	printk
-.L928:
-	mov	w0, w19
-	ldr	x23, [sp,48]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 64
-	ret
+	b	.L939
+.L942:
+	mov	w1, 7
+	mul	w1, w0, w1
+	lsr	w1, w1, 3
+	b	.L943
+.L941:
+	lsr	w1, w0, 3
+	cmp	w22, 0
+	add	x2, x19, :lo12:.LANCHOR0
+	add	x0, x21, :lo12:.LANCHOR3
+	csel	w1, w1, wzr, ne
+	add	x2, x2, 3370
+	add	x0, x0, 1392
+	b	.L958
 	.size	zftl_gc_get_free_sblk, .-zftl_gc_get_free_sblk
 	.align	2
 	.global	zftl_get_free_sblk
 	.type	zftl_get_free_sblk, %function
 zftl_get_free_sblk:
-	stp	x29, x30, [sp, -64]!
+	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	uxth	w22, w1
-	str	x23, [sp,48]
-	stp	x19, x20, [sp,16]
-	cmp	w22, 5
-	uxth	w21, w0
-	adrp	x20, .LANCHOR0
-	bne	.L956
-	add	x2, x20, :lo12:.LANCHOR0
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR0
+	stp	x21, x22, [sp, 32]
+	and	w21, w1, 65535
+	cmp	w21, 5
+	bne	.L960
+	add	x2, x19, :lo12:.LANCHOR0
 	adrp	x0, .LANCHOR3
-	ldrh	w3, [x2,3378]
-	ldrh	w1, [x2,3380]
+	ldrh	w3, [x2, 3370]
+	ldrh	w1, [x2, 3372]
 	cmp	w3, w1
-	bcc	.L957
-	ldrh	w2, [x2,3376]
+	bcc	.L961
+	ldrh	w2, [x2, 3368]
 	cmp	w2, w3
-	bls	.L958
-	cbz	w1, .L958
-.L957:
+	bls	.L962
+	cbz	w1, .L962
+.L961:
+	add	x2, x19, :lo12:.LANCHOR0
 	add	x0, x0, :lo12:.LANCHOR3
-	add	x2, x20, :lo12:.LANCHOR0
-	add	x0, x0, 1408
+	add	x2, x2, 3372
 	lsr	w1, w1, 1
-	b	.L987
-.L958:
-	add	x0, x0, :lo12:.LANCHOR3
-	add	x2, x20, :lo12:.LANCHOR0
+.L981:
 	add	x0, x0, 1400
+	b	.L980
+.L962:
+	add	x2, x19, :lo12:.LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR3
+	add	x2, x2, 3370
+	add	x0, x0, 1392
 	mov	w1, 0
-	add	x2, x2, 3378
-	b	.L986
-.L956:
-	add	x23, x20, :lo12:.LANCHOR0
-	cmp	w22, 1
-	ldr	x0, [x23,1120]
-	ldrh	w19, [x0,590]
-	beq	.L960
+.L980:
+	bl	_list_pop_index_node
+	and	w20, w0, 65535
 	mov	w0, 65535
-	cmp	w19, w0
-	beq	.L960
-	adrp	x0, .LC106
-	mov	w1, w19
-	add	x0, x0, :lo12:.LC106
+	cmp	w20, w0
+	bne	.L965
+	add	x19, x19, :lo12:.LANCHOR0
+	adrp	x0, .LANCHOR3+1384
+	mov	w2, w21
+	mov	w1, w20
+	ldr	x3, [x0, #:lo12:.LANCHOR3+1384]
+	adrp	x0, .LC101
+	ldrh	w5, [x19, 3372]
+	add	x0, x0, :lo12:.LC101
+	ldrh	w4, [x19, 3368]
 	bl	printk
-	ldr	x0, [x23,1120]
-	mov	w1, -1
-	strh	w1, [x0,590]
-	b	.L961
+	b	.L965
 .L960:
-	add	x1, x20, :lo12:.LANCHOR0
-	ldrh	w0, [x1,3376]
-	ldrh	w2, [x1,3380]
+	add	x22, x19, :lo12:.LANCHOR0
+	and	w3, w0, 65535
+	ldr	x0, [x22, 1128]
+	ldrh	w20, [x0, 590]
+	mov	w0, 65535
+	cmp	w20, w0
+	beq	.L964
+	cmp	w21, 1
+	beq	.L964
+	mov	w1, w20
+	adrp	x0, .LC103
+	add	x0, x0, :lo12:.LC103
+	bl	printk
+	ldr	x0, [x22, 1128]
+	mov	w1, -1
+	strh	w1, [x0, 590]
+.L965:
+	mov	w0, w20
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	ret
+.L964:
+	add	x1, x19, :lo12:.LANCHOR0
+	ldrh	w0, [x1, 3368]
+	ldrh	w2, [x1, 3372]
 	cmp	w0, w2
-	bcc	.L962
-	ldrh	w1, [x1,3378]
+	bcc	.L966
+	ldrh	w1, [x1, 3370]
 	cmp	w1, w0
-	bls	.L963
-	cbz	w2, .L963
-.L962:
+	bls	.L967
+	cbz	w2, .L967
+.L966:
 	bl	get_ink_scaned_blk
-	uxth	w0, w0
-	mov	w19, w0
+	and	w20, w0, 65535
 	mov	w0, 65535
-	cmp	w19, w0
-	bne	.L961
-	cmp	w22, 1
-	bne	.L964
-	add	x0, x20, :lo12:.LANCHOR0
-	ldrh	w21, [x0,3380]
-	lsr	w21, w21, 1
-.L964:
+	cmp	w20, w0
+	bne	.L965
+	cmp	w21, 1
+	bne	.L968
+	add	x0, x19, :lo12:.LANCHOR0
+	ldrh	w3, [x0, 3372]
+	lsr	w3, w3, 1
+.L968:
+	add	x2, x19, :lo12:.LANCHOR0
 	adrp	x0, .LANCHOR3
-	add	x2, x20, :lo12:.LANCHOR0
+	add	x2, x2, 3372
+	mov	w1, w3
 	add	x0, x0, :lo12:.LANCHOR3
-	mov	w1, w21
-	add	x0, x0, 1408
-.L987:
-	add	x2, x2, 3380
-	b	.L986
-.L963:
+	b	.L981
+.L967:
 	lsr	w0, w0, 1
-	cmp	w22, 1
-	csel	w21, w0, w21, eq
+	cmp	w21, 1
+	csel	w3, w0, w3, eq
+	add	x2, x19, :lo12:.LANCHOR0
 	adrp	x0, .LANCHOR3
-	add	x2, x20, :lo12:.LANCHOR0
 	add	x0, x0, :lo12:.LANCHOR3
-	add	x0, x0, 1392
-	mov	w1, w21
-	add	x2, x2, 3376
-.L986:
-	bl	_list_pop_index_node
-	uxth	w0, w0
-	mov	w19, w0
-	mov	w0, 65535
-	cmp	w19, w0
-	bne	.L961
-	add	x20, x20, :lo12:.LANCHOR0
-	adrp	x3, .LANCHOR3+1392
-	adrp	x0, .LC104
-	mov	w1, w19
-	add	x0, x0, :lo12:.LC104
-	mov	w2, w22
-	ldr	x3, [x3,#:lo12:.LANCHOR3+1392]
-	ldrh	w4, [x20,3376]
-	ldrh	w5, [x20,3380]
-	bl	printk
-.L961:
-	mov	w0, w19
-	ldr	x23, [sp,48]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 64
-	ret
+	add	x2, x2, 3368
+	mov	w1, w3
+	add	x0, x0, 1384
+	b	.L980
 	.size	zftl_get_free_sblk, .-zftl_get_free_sblk
 	.align	2
 	.global	zftl_remove_data_node
 	.type	zftl_remove_data_node, %function
 zftl_remove_data_node:
 	adrp	x2, .LANCHOR0
-	uxth	w1, w0
 	add	x2, x2, :lo12:.LANCHOR0
 	stp	x29, x30, [sp, -16]!
+	and	w1, w0, 65535
 	add	x29, sp, 0
-	ldr	x0, [x2,1096]
+	ldr	x0, [x2, 1104]
 	add	x0, x0, w1, uxth 2
-	ldrb	w3, [x0,2]
+	ldrb	w3, [x0, 2]
 	and	w3, w3, 224
 	cmp	w3, 64
-	bne	.L989
+	bne	.L983
 	adrp	x0, .LANCHOR3
-	add	x2, x2, 3382
 	add	x0, x0, :lo12:.LANCHOR3
-	add	x0, x0, 1352
-	b	.L992
-.L989:
+	add	x2, x2, 3374
+	add	x0, x0, 1344
+.L987:
+	bl	_list_remove_node
+.L982:
+	ldp	x29, x30, [sp], 16
+	ret
+.L983:
 	cmp	w3, 96
-	bne	.L991
+	bne	.L985
 	adrp	x0, .LANCHOR3
-	add	x2, x2, 3384
 	add	x0, x0, :lo12:.LANCHOR3
-	add	x0, x0, 1368
-	b	.L992
-.L991:
+	add	x2, x2, 3376
+	add	x0, x0, 1360
+	b	.L987
+.L985:
 	cmp	w3, 160
-	bne	.L988
+	bne	.L982
 	adrp	x0, .LANCHOR3
-	add	x2, x2, 3386
 	add	x0, x0, :lo12:.LANCHOR3
-	add	x0, x0, 1376
-.L992:
-	bl	_list_remove_node
-.L988:
-	ldp	x29, x30, [sp], 16
-	ret
+	add	x2, x2, 3378
+	add	x0, x0, 1368
+	b	.L987
 	.size	zftl_remove_data_node, .-zftl_remove_data_node
 	.align	2
 	.global	zftl_remove_free_node
 	.type	zftl_remove_free_node, %function
 zftl_remove_free_node:
 	adrp	x2, .LANCHOR0
-	uxth	w1, w0
 	add	x2, x2, :lo12:.LANCHOR0
-	adrp	x3, .LANCHOR3
 	stp	x29, x30, [sp, -16]!
+	and	w1, w0, 65535
+	adrp	x3, .LANCHOR3
+	add	x3, x3, :lo12:.LANCHOR3
 	add	x29, sp, 0
-	ldr	x0, [x2,1096]
+	ldr	x0, [x2, 1104]
 	add	x0, x0, w1, uxth 2
-	ldrb	w0, [x0,2]
+	ldrb	w0, [x0, 2]
 	ands	w0, w0, 24
-	bne	.L994
-	add	x0, x3, :lo12:.LANCHOR3
-	add	x2, x2, 3376
-	add	x0, x0, 1392
-	b	.L997
-.L994:
-	cmp	w0, 16
-	add	x0, x3, :lo12:.LANCHOR3
-	bne	.L996
-	add	x0, x0, 1400
-	add	x2, x2, 3378
-	b	.L997
-.L996:
-	add	x0, x0, 1408
-	add	x2, x2, 3380
-.L997:
+	bne	.L989
+	add	x2, x2, 3368
+	add	x0, x3, 1384
+.L993:
 	bl	_list_remove_node
 	ldp	x29, x30, [sp], 16
 	ret
+.L989:
+	cmp	w0, 16
+	bne	.L991
+	add	x2, x2, 3370
+	add	x0, x3, 1392
+	b	.L993
+.L991:
+	add	x2, x2, 3372
+	add	x0, x3, 1400
+	b	.L993
 	.size	zftl_remove_free_node, .-zftl_remove_free_node
 	.align	2
 	.global	zftl_list_update_data_list
 	.type	zftl_list_update_data_list, %function
 zftl_list_update_data_list:
 	adrp	x2, .LANCHOR0
-	uxth	w1, w0
 	add	x2, x2, :lo12:.LANCHOR0
 	stp	x29, x30, [sp, -16]!
+	and	w1, w0, 65535
 	add	x29, sp, 0
-	ldr	x0, [x2,1096]
+	ldr	x0, [x2, 1104]
 	add	x0, x0, w1, uxth 2
-	ldrb	w3, [x0,2]
+	ldrb	w3, [x0, 2]
 	and	w3, w3, 224
 	cmp	w3, 64
-	bne	.L999
+	bne	.L995
 	adrp	x0, .LANCHOR3
-	add	x2, x2, 3382
 	add	x0, x0, :lo12:.LANCHOR3
-	add	x0, x0, 1352
-	b	.L1002
+	add	x2, x2, 3374
+	add	x0, x0, 1344
 .L999:
+	bl	_list_update_data_list
+.L994:
+	ldp	x29, x30, [sp], 16
+	ret
+.L995:
 	cmp	w3, 96
-	bne	.L1001
+	bne	.L997
 	adrp	x0, .LANCHOR3
-	add	x2, x2, 3384
 	add	x0, x0, :lo12:.LANCHOR3
-	add	x0, x0, 1368
-	b	.L1002
-.L1001:
+	add	x2, x2, 3376
+	add	x0, x0, 1360
+	b	.L999
+.L997:
 	cmp	w3, 160
-	bne	.L998
+	bne	.L994
 	adrp	x0, .LANCHOR3
-	add	x2, x2, 3386
 	add	x0, x0, :lo12:.LANCHOR3
-	add	x0, x0, 1376
-.L1002:
-	bl	_list_update_data_list
-.L998:
-	ldp	x29, x30, [sp], 16
-	ret
+	add	x2, x2, 3378
+	add	x0, x0, 1368
+	b	.L999
 	.size	zftl_list_update_data_list, .-zftl_list_update_data_list
 	.align	2
 	.global	print_list_info
 	.type	print_list_info, %function
 print_list_info:
-	sub	sp, sp, #128
-	stp	x29, x30, [sp,32]
+	sub	sp, sp, #96
+	stp	x29, x30, [sp, 32]
 	add	x29, sp, 32
-	stp	x19, x20, [sp,48]
+	stp	x19, x20, [sp, 48]
 	mov	x19, x0
-	str	x27, [sp,112]
-	stp	x21, x22, [sp,64]
-	stp	x23, x24, [sp,80]
-	stp	x25, x26, [sp,96]
-	adrp	x0, .LC107
+	stp	x21, x22, [sp, 64]
+	stp	x23, x24, [sp, 80]
 	ldrh	w2, [x1]
-	add	x0, x0, :lo12:.LC107
-	ldr	x1, [x19]
+	ldr	x1, [x0]
+	adrp	x0, .LC104
+	add	x0, x0, :lo12:.LC104
 	bl	printk
 	ldr	x19, [x19]
-	cbz	x19, .L1003
-	mov	x22, -6148914691236517206
-	adrp	x23, .LC108
+	cbz	x19, .L1000
+	adrp	x21, .LANCHOR0
+	mov	x24, -6148914691236517206
+	adrp	x23, .LC105
+	adrp	x22, .LANCHOR3
+	add	x21, x21, :lo12:.LANCHOR0
+	add	x23, x23, :lo12:.LC105
+	add	x22, x22, :lo12:.LANCHOR3
 	mov	w20, 0
-	adrp	x26, .LANCHOR0
-	add	x22, x22, 1
-	add	x23, x23, :lo12:.LC108
-	mov	w27, 65535
-	mov	w25, 6
-	adrp	x24, .LANCHOR3
-.L1006:
-	add	x21, x26, :lo12:.LANCHOR0
-	ldrh	w3, [x19]
-	ldrh	w4, [x19,2]
-	ldrh	w5, [x19,4]
-	ldr	x2, [x21,1040]
-	ldr	x1, [x21,1096]
+	movk	x24, 0xaaab, lsl 0
+.L1003:
+	ldr	x2, [x21, 1040]
+	ldr	x1, [x21, 1104]
 	sub	x2, x19, x2
+	ldr	x8, [x21, 1120]
 	asr	x2, x2, 1
-	mul	x2, x2, x22
-	and	x8, x2, 65535
-	lsl	x0, x8, 2
-	uxth	w2, w2
-	add	x6, x1, x0
-	ldrb	w7, [x6,2]
-	ldr	w6, [x1,x0]
-	ubfx	x6, x6, 11, 8
-	str	w6, [sp]
-	ubfx	x6, x7, 5, 3
-	ubfx	x7, x7, 3, 2
-	ldrh	w0, [x1,x0]
+	ldrh	w5, [x19, 4]
+	ldrh	w4, [x19, 2]
+	mul	x2, x2, x24
+	and	x7, x2, 65535
+	and	w2, w2, 65535
+	lsl	x0, x7, 2
+	add	x3, x1, x0
+	ldrh	w7, [x8, x7, lsl 1]
+	ldrb	w6, [x3, 2]
+	ldrh	w3, [x19]
+	str	w7, [sp, 16]
+	ldrh	w7, [x1, x0]
+	and	w7, w7, 2047
+	str	w7, [sp, 8]
+	ubfx	x7, x6, 3, 2
+	ubfx	x6, x6, 5, 3
+	ldr	w0, [x1, x0]
 	mov	w1, w20
-	and	w0, w0, 2047
-	str	w0, [sp,8]
-	ldr	x0, [x21,1112]
-	ldrh	w0, [x0,x8,lsl 1]
-	str	w0, [sp,16]
+	ubfx	x0, x0, 11, 8
+	str	w0, [sp]
 	mov	x0, x23
 	bl	printk
 	ldrh	w19, [x19]
-	cmp	w19, w27
-	beq	.L1003
-	ldr	x0, [x21,1040]
+	mov	w0, 65535
+	cmp	w19, w0
+	beq	.L1000
+	ldr	x0, [x21, 1040]
+	mov	w1, 6
 	add	w20, w20, 1
-	umull	x19, w19, w25
-	uxth	w20, w20
-	add	x19, x0, x19
-	add	x0, x24, :lo12:.LANCHOR3
-	ldrh	w0, [x0,1416]
+	and	w20, w20, 65535
+	umaddl	x19, w19, w1, x0
+	ldrh	w0, [x22, 1408]
 	cmp	w0, w20
-	bcs	.L1006
-.L1003:
-	sub	sp, x29, #32
-	ldp	x19, x20, [sp,48]
-	ldp	x21, x22, [sp,64]
-	ldp	x23, x24, [sp,80]
-	ldp	x25, x26, [sp,96]
-	ldr	x27, [sp,112]
-	ldp	x29, x30, [sp,32]
-	add	sp, sp, 128
+	bcs	.L1003
+.L1000:
+	ldp	x19, x20, [sp, 48]
+	ldp	x21, x22, [sp, 64]
+	ldp	x23, x24, [sp, 80]
+	ldp	x29, x30, [sp, 32]
+	add	sp, sp, 96
 	ret
 	.size	print_list_info, .-print_list_info
 	.align	2
@@ -6318,30 +6113,30 @@ print_list_info:
 dump_all_list_info:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR3
-	adrp	x19, .LANCHOR0
-	add	x20, x20, :lo12:.LANCHOR3
-	add	x19, x19, :lo12:.LANCHOR0
-	add	x0, x20, 1392
-	add	x1, x19, 3376
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR0
+	adrp	x19, .LANCHOR3
+	add	x20, x20, :lo12:.LANCHOR0
+	add	x19, x19, :lo12:.LANCHOR3
+	add	x1, x20, 3368
+	add	x0, x19, 1384
 	bl	print_list_info
-	add	x0, x20, 1400
-	add	x1, x19, 3378
+	add	x1, x20, 3370
+	add	x0, x19, 1392
 	bl	print_list_info
-	add	x0, x20, 1408
-	add	x1, x19, 3380
+	add	x1, x20, 3372
+	add	x0, x19, 1400
 	bl	print_list_info
-	add	x0, x20, 1352
-	add	x1, x19, 3382
+	add	x1, x20, 3374
+	add	x0, x19, 1344
 	bl	print_list_info
-	add	x0, x20, 1368
-	add	x1, x19, 3384
+	add	x1, x20, 3376
+	add	x0, x19, 1360
 	bl	print_list_info
-	add	x0, x20, 1376
-	add	x1, x19, 3386
+	add	x1, x20, 3378
+	add	x0, x19, 1368
 	bl	print_list_info
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	dump_all_list_info, .-dump_all_list_info
@@ -6349,155 +6144,145 @@ dump_all_list_info:
 	.global	ftl_tmp_into_update
 	.type	ftl_tmp_into_update, %function
 ftl_tmp_into_update:
-	adrp	x0, .LANCHOR0+3392
-	ldr	x0, [x0,#:lo12:.LANCHOR0+3392]
-	ldr	w2, [x0,16]
-	cmp	w2, 2048
+	adrp	x0, .LANCHOR0+3384
+	ldr	x0, [x0, #:lo12:.LANCHOR0+3384]
+	ldr	w1, [x0, 16]
+	cmp	w1, 2048
+	bls	.L1008
+	ldr	w2, [x0, 20]
+	add	w2, w2, w1, lsr 11
+	and	w1, w1, 2047
+	stp	w1, w2, [x0, 16]
+.L1008:
+	ldr	w1, [x0, 24]
+	cmp	w1, 2048
 	bls	.L1009
-	lsr	w1, w2, 11
-	ldr	w3, [x0,20]
-	add	w3, w3, w1
-	sub	w1, w2, w1, lsl 11
-	str	w3, [x0,20]
-	str	w1, [x0,16]
+	ldr	w2, [x0, 28]
+	add	w2, w2, w1, lsr 11
+	and	w1, w1, 2047
+	stp	w1, w2, [x0, 24]
 .L1009:
-	ldr	w2, [x0,24]
-	cmp	w2, 2048
+	ldr	w1, [x0, 32]
+	cmp	w1, 1024
 	bls	.L1010
-	lsr	w1, w2, 11
-	ldr	w3, [x0,28]
-	add	w3, w3, w1
-	sub	w1, w2, w1, lsl 11
-	str	w3, [x0,28]
-	str	w1, [x0,24]
+	ldr	w2, [x0, 36]
+	add	w2, w2, w1, lsr 10
+	and	w1, w1, 1023
+	stp	w1, w2, [x0, 32]
 .L1010:
-	ldr	w2, [x0,32]
-	cmp	w2, 1024
-	bls	.L1011
-	lsr	w1, w2, 10
-	ldr	w3, [x0,36]
-	add	w3, w3, w1
-	sub	w1, w2, w1, lsl 10
-	str	w3, [x0,36]
-	str	w1, [x0,32]
-.L1011:
-	ldr	w2, [x0,40]
-	cmp	w2, 1024
-	bls	.L1008
-	lsr	w1, w2, 10
-	ldr	w3, [x0,44]
-	add	w3, w3, w1
-	sub	w1, w2, w1, lsl 10
-	str	w3, [x0,44]
-	str	w1, [x0,40]
-.L1008:
+	ldr	w1, [x0, 40]
+	cmp	w1, 1024
+	bls	.L1007
+	ldr	w2, [x0, 44]
+	add	w2, w2, w1, lsr 10
+	and	w1, w1, 1023
+	stp	w1, w2, [x0, 40]
+.L1007:
 	ret
 	.size	ftl_tmp_into_update, .-ftl_tmp_into_update
 	.align	2
 	.global	ftl_get_blk_list_in_sblk
 	.type	ftl_get_blk_list_in_sblk, %function
 ftl_get_blk_list_in_sblk:
-	adrp	x3, .LANCHOR0
-	uxth	w0, w0
-	add	x2, x3, :lo12:.LANCHOR0
-	mov	x9, x3
-	adrp	x11, .LANCHOR3
-	mov	w13, 24
-	ldr	x2, [x2,1096]
-	add	x2, x2, w0, uxth 2
-	ldrb	w12, [x2,3]
-	mov	w2, 0
-	mov	w6, w2
-.L1014:
-	add	x8, x11, :lo12:.LANCHOR3
-	adrp	x4, .LANCHOR3
-	ldrb	w3, [x8,1329]
-	cmp	w6, w3
-	bge	.L1020
-	asr	w3, w12, w6
-	tbnz	x3, 0, .L1015
-	add	x3, x9, :lo12:.LANCHOR0
-	ldrb	w5, [x8,1314]
-	sbfiz	x10, x2, 1, 32
-	ldrb	w7, [x3,1257]
-	ldrh	w3, [x8,1312]
-	sdiv	w4, w6, w5
-	sub	w7, w13, w7
-	sub	w3, w7, w3
-	lsl	w3, w4, w3
-	madd	w3, w0, w5, w3
-	uxth	w4, w3
-	strh	w4, [x1,x10]
-	ldrb	w3, [x8,1314]
-	cmp	w3, 1
-	bls	.L1016
-	sub	w3, w3, #1
-	and	w3, w6, w3
-	add	w3, w4, w3
-	strh	w3, [x1,x10]
+	adrp	x5, .LANCHOR0
+	add	x5, x5, :lo12:.LANCHOR0
+	and	w9, w0, 65535
+	mov	w4, 0
+	mov	w0, 0
+	mov	w12, 24
+	ldr	x2, [x5, 1104]
+	add	x2, x2, w9, uxth 2
+	ldrb	w11, [x2, 3]
+	adrp	x2, .LANCHOR3
+	add	x7, x2, :lo12:.LANCHOR3
+	mov	x3, x2
+.L1013:
+	ldrb	w2, [x7, 1321]
+	cmp	w4, w2
+	blt	.L1016
+	mov	w4, w0
+	add	x2, x3, :lo12:.LANCHOR3
+	mov	w5, -1
+.L1017:
+	ldrb	w3, [x2, 1321]
+	cmp	w4, w3
+	blt	.L1018
+	ret
 .L1016:
-	add	w2, w2, 1
+	asr	w2, w11, w4
+	tbnz	x2, 0, .L1014
+	ldrb	w2, [x7, 1306]
+	sbfiz	x10, x0, 1, 32
+	ldrb	w6, [x5, 1205]
+	ldrh	w13, [x7, 1304]
+	sub	w6, w12, w6
+	sdiv	w8, w4, w2
+	sub	w6, w6, w13
+	lsl	w6, w8, w6
+	madd	w2, w9, w2, w6
+	and	w2, w2, 65535
+	strh	w2, [x1, x10]
+	ldrb	w6, [x7, 1306]
+	cmp	w6, 1
+	bls	.L1015
+	sub	w6, w6, #1
+	and	w6, w6, w4
+	add	w2, w2, w6
+	strh	w2, [x1, x10]
 .L1015:
-	add	w6, w6, 1
-	b	.L1014
-.L1020:
-	mov	w0, w2
-	mov	w5, -1
+	add	w0, w0, 1
+.L1014:
+	add	w4, w4, 1
+	b	.L1013
 .L1018:
-	add	x3, x4, :lo12:.LANCHOR3
-	ldrb	w3, [x3,1329]
-	cmp	w2, w3
-	bge	.L1021
-	strh	w5, [x1,w2,sxtw 1]
-	add	w2, w2, 1
-	b	.L1018
-.L1021:
-	ret
+	strh	w5, [x1, w4, sxtw 1]
+	add	w4, w4, 1
+	b	.L1017
 	.size	ftl_get_blk_list_in_sblk, .-ftl_get_blk_list_in_sblk
 	.align	2
 	.global	ftl_erase_phy_blk
 	.type	ftl_erase_phy_blk, %function
 ftl_erase_phy_blk:
 	stp	x29, x30, [sp, -48]!
-	uxth	w2, w0
-	adrp	x3, .LANCHOR3
-	adrp	x0, .LANCHOR0+1257
-	add	x5, x3, :lo12:.LANCHOR3
+	mov	w2, 24
+	and	w0, w0, 65535
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	stp	x19, x20, [sp,16]
-	ldrb	w4, [x0,#:lo12:.LANCHOR0+1257]
-	mov	w0, 24
-	ldrh	w19, [x5,1312]
-	mov	w21, w1
-	sub	w4, w0, w4
-	ldrb	w0, [x5,1330]
-	sub	w4, w4, w19
+	stp	x21, x22, [sp, 32]
+	mov	w22, w1
+	adrp	x1, .LANCHOR0+1205
+	stp	x19, x20, [sp, 16]
+	ldrb	w19, [x1, #:lo12:.LANCHOR0+1205]
+	adrp	x1, .LANCHOR3
+	add	x3, x1, :lo12:.LANCHOR3
+	mov	x20, x1
+	sub	w19, w2, w19
+	ldrh	w2, [x3, 1304]
+	sub	w2, w19, w2
 	mov	w19, 1
-	lsl	w19, w19, w4
-	asr	w22, w2, w4
+	lsl	w19, w19, w2
 	sub	w19, w19, #1
-	mov	x20, x3
-	and	w19, w19, w2
+	and	w19, w19, w0
+	asr	w21, w0, w2
+	ldrb	w0, [x3, 1322]
 	sxth	w19, w19
-	cbz	w0, .L1023
-	ldrb	w0, [x5,1331]
-	cbnz	w0, .L1023
-	ldrh	w2, [x5,1418]
-	cmp	w1, wzr
-	mov	w0, w22
+	cbz	w0, .L1020
+	ldrb	w0, [x3, 1323]
+	cbnz	w0, .L1020
+	ldrh	w2, [x3, 1410]
+	cmp	w22, 0
 	cset	w1, eq
-	mul	w2, w19, w2
+	mov	w0, w21
+	mul	w2, w2, w19
 	bl	flash_erase_block_en
-.L1023:
-	add	x3, x20, :lo12:.LANCHOR3
-	mov	w1, w21
-	mov	w0, w22
-	ldrh	w2, [x3,1418]
-	mul	w2, w19, w2
+.L1020:
+	add	x1, x20, :lo12:.LANCHOR3
+	mov	w0, w21
+	ldrh	w2, [x1, 1410]
+	mov	w1, w22
+	mul	w2, w2, w19
 	bl	flash_erase_block_en
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	ftl_erase_phy_blk, .-ftl_erase_phy_blk
@@ -6505,156 +6290,155 @@ ftl_erase_phy_blk:
 	.global	ftl_erase_sblk
 	.type	ftl_erase_sblk, %function
 ftl_erase_sblk:
-	stp	x29, x30, [sp, -160]!
+	stp	x29, x30, [sp, -176]!
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	uxth	w24, w0
+	stp	x21, x22, [sp, 32]
+	mov	w22, w1
+	stp	x25, x26, [sp, 64]
+	and	w25, w0, 65535
 	adrp	x0, .LANCHOR0
-	mov	w23, w1
 	add	x1, x0, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	stp	x19, x20, [sp,16]
-	stp	x27, x28, [sp,80]
-	ubfiz	x22, x24, 2, 16
-	adrp	x25, .LANCHOR3
-	ldr	x1, [x1,1096]
+	stp	x19, x20, [sp, 16]
+	ubfiz	x21, x25, 2, 16
+	stp	x23, x24, [sp, 48]
+	adrp	x26, .LANCHOR3
+	stp	x27, x28, [sp, 80]
+	mov	x20, x0
+	add	x27, x29, 112
+	add	x24, x26, :lo12:.LANCHOR3
+	ldr	x1, [x1, 1104]
 	mov	w19, 0
-	mov	x21, x0
-	mov	x26, x25
-	add	x1, x1, x22
-	ldrb	w27, [x1,3]
+	add	x1, x1, x21
+	ldrb	w28, [x1, 3]
+.L1026:
+	add	x0, x26, :lo12:.LANCHOR3
+	ldrb	w1, [x0, 1412]
+	cmp	w19, w1
+	bge	.L1037
+	ldrb	w1, [x0, 1306]
+	mov	w23, 0
+	ldrh	w3, [x0, 1410]
+	mov	w0, 0
+	sub	w4, w1, #1
+	mul	w6, w19, w1
+	mul	w5, w25, w1
+	b	.L1038
 .L1028:
-	add	x1, x25, :lo12:.LANCHOR3
-	ldrb	w0, [x1,1420]
-	cmp	w19, w0
-	bge	.L1039
-	ldrb	w0, [x1,1314]
-	mov	w20, 0
-	ldrh	w3, [x1,1418]
-	mov	w1, w20
-	sub	w4, w0, #1
-	mul	w6, w19, w0
-	mul	w5, w24, w0
-.L1040:
-	cmp	w1, w0
-	bge	.L1053
-	add	w2, w1, w6
-	asr	w2, w27, w2
-	tbnz	x2, 0, .L1029
-	and	w2, w1, w4
-	add	x7, x29, 96
-	add	w2, w5, w2
+	add	w2, w6, w0
+	asr	w2, w28, w2
+	tbnz	x2, 0, .L1027
+	and	w2, w0, w4
+	add	w2, w2, w5
 	mul	w2, w2, w3
-	str	w2, [x7,w20,sxtw 2]
-	add	w20, w20, 1
-.L1029:
-	add	w1, w1, 1
-	b	.L1040
-.L1053:
-	cmp	w0, 4
-	bne	.L1052
-	mov	x28, 0
+	str	w2, [x27, w23, sxtw 2]
+	add	w23, w23, 1
+.L1027:
+	add	w0, w0, 1
+.L1038:
+	cmp	w0, w1
+	blt	.L1028
+	cmp	w1, 4
+	bne	.L1029
+	mov	x3, 0
+.L1030:
+	cmp	w23, w3
+	bgt	.L1031
+.L1032:
+	add	w19, w19, 1
+	b	.L1026
 .L1031:
-	cmp	w20, w28
-	ble	.L1034
-	add	x2, x29, 96
+	ldr	w2, [x27, x3, lsl 2]
+	mov	w1, w22
+	str	x3, [x29, 104]
 	mov	w0, w19
-	mov	w1, w23
-	ldr	w2, [x2,x28,lsl 2]
-	add	x28, x28, 1
 	bl	flash_erase_block_en
-	b	.L1031
-.L1052:
-	cmp	w20, 2
-	bne	.L1035
-	add	x0, x26, :lo12:.LANCHOR3
-	ldrb	w1, [x0,1330]
-	cbz	w1, .L1036
-	ldrb	w0, [x0,1331]
-	cbnz	w0, .L1036
-	cmp	w23, wzr
-	ldr	w2, [x29,96]
-	ldr	w3, [x29,100]
-	mov	w0, w19
+	ldr	x3, [x29, 104]
+	add	x3, x3, 1
+	b	.L1030
+.L1029:
+	cmp	w23, 2
+	bne	.L1033
+	ldrb	w0, [x24, 1322]
+	cbz	w0, .L1034
+	ldrb	w0, [x24, 1323]
+	cbnz	w0, .L1034
+	ldp	w2, w3, [x29, 112]
+	cmp	w22, 0
 	cset	w1, eq
-	bl	flash_erase_duplane_block
-.L1036:
-	ldr	w2, [x29,96]
 	mov	w0, w19
-	ldr	w3, [x29,100]
-	mov	w1, w23
 	bl	flash_erase_duplane_block
-	b	.L1034
-.L1035:
-	cmp	w20, 1
-	bne	.L1034
-	add	x0, x26, :lo12:.LANCHOR3
-	ldrb	w1, [x0,1330]
-	cbz	w1, .L1038
-	ldrb	w0, [x0,1331]
-	cbnz	w0, .L1038
-	cmp	w23, wzr
-	ldr	w2, [x29,96]
+.L1034:
+	ldp	w2, w3, [x29, 112]
+	mov	w1, w22
 	mov	w0, w19
+	bl	flash_erase_duplane_block
+	b	.L1032
+.L1033:
+	cmp	w23, 1
+	bne	.L1032
+	ldrb	w0, [x24, 1322]
+	cbz	w0, .L1036
+	ldrb	w0, [x24, 1323]
+	cbnz	w0, .L1036
+	ldr	w2, [x29, 112]
+	cmp	w22, 0
 	cset	w1, eq
+	mov	w0, w19
 	bl	flash_erase_block_en
-.L1038:
-	ldr	w2, [x29,96]
+.L1036:
+	ldr	w2, [x29, 112]
+	mov	w1, w22
 	mov	w0, w19
-	mov	w1, w23
 	bl	flash_erase_block_en
-.L1034:
-	add	w19, w19, 1
-	b	.L1028
-.L1039:
-	add	x0, x21, :lo12:.LANCHOR0
-	cbnz	w23, .L1041
-	ldr	x2, [x0,1096]
-	ldrh	w1, [x2,x22]
+	b	.L1032
+.L1037:
+	add	x0, x20, :lo12:.LANCHOR0
+	cbnz	w22, .L1039
+	ldr	x2, [x0, 1104]
+	ldrh	w1, [x2, x21]
 	add	w3, w1, 1
 	bfi	w1, w3, 0, 11
-	strh	w1, [x2,x22]
-	ldr	x1, [x0,3392]
-	ldr	x0, [x0,1096]
-	ldr	w2, [x1,84]
-	ldrh	w3, [x1,96]
+	strh	w1, [x2, x21]
+	ldr	x1, [x0, 3384]
+	ldr	x0, [x0, 1104]
+	ldr	w2, [x1, 84]
+	ldrh	w3, [x1, 96]
 	add	w2, w2, 1
-	str	w2, [x1,84]
-	ldrh	w0, [x0,x22]
+	str	w2, [x1, 84]
+	ldrh	w0, [x0, x21]
 	ubfx	x0, x0, 0, 11
-	uxth	w2, w0
+	and	w2, w0, 65535
 	cmp	w3, w2
-	bge	.L1043
-	strh	w0, [x1,96]
-	b	.L1043
+	bge	.L1041
+	strh	w0, [x1, 96]
 .L1041:
-	ldr	x3, [x0,1096]
-	ldr	w1, [x3,x22]
+	ldp	x19, x20, [sp, 16]
+	mov	w0, 0
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 176
+	ret
+.L1039:
+	ldr	x3, [x0, 1104]
+	ldr	w1, [x3, x21]
 	ubfx	x2, x1, 11, 8
 	add	w2, w2, 1
 	bfi	w1, w2, 11, 8
-	str	w1, [x3,x22]
-	ldr	x1, [x0,3392]
-	ldr	x0, [x0,1096]
-	ldr	w2, [x1,80]
+	str	w1, [x3, x21]
+	ldr	x1, [x0, 3384]
+	ldr	x0, [x0, 1104]
+	ldr	w2, [x1, 80]
 	add	w2, w2, 1
-	str	w2, [x1,80]
-	ldrh	w2, [x1,98]
-	ldr	w0, [x0,x22]
+	str	w2, [x1, 80]
+	ldrh	w2, [x1, 98]
+	ldr	w0, [x0, x21]
 	ubfx	x0, x0, 11, 8
 	cmp	w2, w0, uxtb
-	bcs	.L1043
-	strh	w0, [x1,98]
-.L1043:
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 160
-	ret
+	bcs	.L1041
+	strh	w0, [x1, 98]
+	b	.L1041
 	.size	ftl_erase_sblk, .-ftl_erase_sblk
 	.align	2
 	.global	ftl_alloc_sys_blk
@@ -6662,53 +6446,55 @@ ftl_erase_sblk:
 ftl_alloc_sys_blk:
 	stp	x29, x30, [sp, -32]!
 	adrp	x0, .LANCHOR0
-	add	x29, sp, 0
 	add	x1, x0, :lo12:.LANCHOR0
-	str	x19, [sp,16]
+	add	x29, sp, 0
+	str	x19, [sp, 16]
 	mov	x19, x0
-	ldr	x1, [x1,3392]
-	ldrh	w2, [x1,136]
+	ldr	x1, [x1, 3384]
+	ldrh	w2, [x1, 136]
 	cmp	w2, 63
-	bls	.L1055
-	strh	wzr, [x1,136]
-.L1055:
-	ldrh	w0, [x1,112]
-	cbnz	w0, .L1056
+	bls	.L1051
+	strh	wzr, [x1, 136]
+.L1051:
+	ldrh	w0, [x1, 112]
+	cbnz	w0, .L1052
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 1784
 	mov	w2, 1359
-	add	x1, x1, 1800
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L1056:
+.L1052:
 	add	x0, x19, :lo12:.LANCHOR0
 	mov	w4, 65535
-	ldr	x1, [x0,3392]
-.L1060:
-	ldrh	w2, [x1,136]
-.L1057:
+	ldr	x1, [x0, 3384]
+.L1056:
+	ldrh	w2, [x1, 136]
+	ubfiz	x3, x2, 1, 16
+	add	x3, x3, 160
+	add	x3, x1, x3
+.L1053:
 	cmp	w2, 63
-	bgt	.L1063
-	sxtw	x3, w2
-	add	x3, x3, 80
-	ldrh	w0, [x1,x3,lsl 1]
+	ble	.L1055
+	strh	wzr, [x1, 136]
+	b	.L1056
+.L1055:
+	ldrh	w0, [x3], 2
 	cmp	w0, w4
-	bne	.L1062
+	bne	.L1058
 	add	w2, w2, 1
-	b	.L1057
-.L1063:
-	strh	wzr, [x1,136]
-	b	.L1060
-.L1062:
+	b	.L1053
+.L1058:
+	add	x3, x1, w2, sxtw 1
 	mov	w4, -1
-	strh	w4, [x1,x3,lsl 1]
-	strh	w2, [x1,136]
-	ldrh	w2, [x1,112]
+	strh	w4, [x3, 160]
+	strh	w2, [x1, 136]
+	ldrh	w2, [x1, 112]
 	sub	w2, w2, #1
-	strh	w2, [x1,112]
-	ldr	x19, [sp,16]
+	strh	w2, [x1, 112]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	ftl_alloc_sys_blk, .-ftl_alloc_sys_blk
@@ -6717,145 +6503,148 @@ ftl_alloc_sys_blk:
 	.type	ftl_free_sys_blk, %function
 ftl_free_sys_blk:
 	stp	x29, x30, [sp, -32]!
-	adrp	x1, .LANCHOR0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	uxth	w20, w0
-	add	x0, x1, :lo12:.LANCHOR0
-	mov	x19, x1
-	ldr	x2, [x0,3392]
-	ldrh	w0, [x2,138]
-	cmp	w0, 63
-	bls	.L1065
-	strh	wzr, [x2,138]
-.L1065:
-	ldrh	w0, [x2,112]
+	stp	x19, x20, [sp, 16]
+	and	w20, w0, 65535
+	adrp	x0, .LANCHOR0
+	add	x1, x0, :lo12:.LANCHOR0
+	mov	x19, x0
+	ldr	x1, [x1, 3384]
+	ldrh	w2, [x1, 138]
+	cmp	w2, 63
+	bls	.L1061
+	strh	wzr, [x1, 138]
+.L1061:
+	ldrh	w0, [x1, 112]
 	cmp	w0, 63
-	bls	.L1066
+	bls	.L1062
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 1808
 	mov	w2, 1386
-	add	x1, x1, 1824
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
+.L1062:
+	add	x0, x19, :lo12:.LANCHOR0
+	mov	w3, 65535
+	ldr	x0, [x0, 3384]
 .L1066:
-	add	x1, x19, :lo12:.LANCHOR0
-	mov	w0, 65535
-	ldr	x1, [x1,3392]
-.L1070:
-	ldrh	w2, [x1,138]
-.L1067:
-	cmp	w2, 63
-	bgt	.L1072
-	sxtw	x3, w2
-	add	x3, x3, 80
-	ldrh	w4, [x1,x3,lsl 1]
-	cmp	w4, w0
-	bne	.L1068
-	strh	w20, [x1,x3,lsl 1]
-	strh	w2, [x1,138]
-	ldrh	w0, [x1,112]
-	add	w0, w0, 1
-	strh	w0, [x1,112]
-	ldp	x19, x20, [sp,16]
+	ldrh	w1, [x0, 138]
+	ubfiz	x2, x1, 1, 16
+	add	x2, x2, 160
+	add	x2, x0, x2
+.L1063:
+	cmp	w1, 63
+	ble	.L1065
+	strh	wzr, [x0, 138]
+	b	.L1066
+.L1065:
+	ldrh	w4, [x2], 2
+	cmp	w4, w3
+	bne	.L1064
+	add	x2, x0, w1, sxtw 1
+	strh	w20, [x2, 160]
+	strh	w1, [x0, 138]
+	ldrh	w1, [x0, 112]
+	add	w1, w1, 1
+	strh	w1, [x0, 112]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
-.L1068:
-	add	w2, w2, 1
-	b	.L1067
-.L1072:
-	strh	wzr, [x1,138]
-	b	.L1070
+.L1064:
+	add	w1, w1, 1
+	b	.L1063
 	.size	ftl_free_sys_blk, .-ftl_free_sys_blk
 	.align	2
 	.global	ftl_info_data_recovery
 	.type	ftl_info_data_recovery, %function
 ftl_info_data_recovery:
-	stp	x29, x30, [sp, -64]!
-	mov	w1, 65535
-	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	str	x23, [sp,48]
 	ldrh	w2, [x0]
+	mov	w1, 65535
 	cmp	w2, w1
-	beq	.L1073
+	beq	.L1079
+	stp	x29, x30, [sp, -64]!
+	add	x29, sp, 0
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR0
-	ubfiz	x20, x2, 2, 16
+	str	x23, [sp, 48]
 	add	x23, x19, :lo12:.LANCHOR0
-	ldr	x21, [x23,1096]
+	stp	x21, x22, [sp, 32]
+	ubfiz	x20, x2, 2, 16
+	ldr	x21, [x23, 1104]
 	add	x22, x21, x20
-	ldrb	w1, [x22,2]
+	ldrb	w1, [x22, 2]
 	tst	w1, 224
-	bne	.L1073
-	ldrb	w0, [x0,4]
+	bne	.L1069
+	ldrb	w0, [x0, 4]
 	bfi	w1, w0, 5, 3
+	strb	w1, [x22, 2]
 	mov	w0, w2
-	strb	w1, [x22,2]
 	bl	zftl_remove_free_node
-	ldrb	w0, [x22,2]
-	tbz	x0, 3, .L1077
-	ldr	x1, [x23,3392]
-	ldrh	w0, [x1,116]
-	sub	w0, w0, #1
-	strh	w0, [x1,116]
-	b	.L1078
-.L1077:
-	tst	w0, 24
-	ldr	x1, [x23,3392]
-	bne	.L1079
-	ldrh	w0, [x1,114]
+	ldrb	w0, [x22, 2]
+	ldr	x1, [x23, 3384]
+	tbz	x0, 3, .L1073
+	ldrh	w0, [x1, 116]
 	sub	w0, w0, #1
-	strh	w0, [x1,114]
-	b	.L1078
-.L1079:
-	ldrh	w0, [x1,118]
-	sub	w0, w0, #1
-	strh	w0, [x1,118]
-.L1078:
-	ldrb	w0, [x22,2]
+	strh	w0, [x1, 116]
+.L1074:
+	ldrb	w0, [x22, 2]
 	and	w0, w0, 224
 	cmp	w0, 160
-	bne	.L1080
-	ldr	w0, [x21,x20]
+	bne	.L1076
+	ldr	w0, [x21, x20]
 	add	x19, x19, :lo12:.LANCHOR0
 	ubfx	x1, x0, 11, 8
 	add	w1, w1, 1
 	bfi	w0, w1, 11, 8
-	str	w0, [x21,x20]
-	ldr	x1, [x19,3392]
-	ldrh	w0, [x1,120]
+	str	w0, [x21, x20]
+	ldr	x1, [x19, 3384]
+	ldrh	w0, [x1, 120]
 	sub	w0, w0, #1
-	strh	w0, [x1,120]
-	b	.L1073
-.L1080:
-	ldrh	w1, [x21,x20]
-	cmp	w0, 64
-	add	w2, w1, 1
+	strh	w0, [x1, 120]
+.L1069:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldr	x23, [sp, 48]
+	ldp	x29, x30, [sp], 64
+	ret
+.L1073:
+	tst	w0, 24
+	bne	.L1075
+	ldrh	w0, [x1, 114]
+	sub	w0, w0, #1
+	strh	w0, [x1, 114]
+	b	.L1074
+.L1075:
+	ldrh	w0, [x1, 118]
+	sub	w0, w0, #1
+	strh	w0, [x1, 118]
+	b	.L1074
+.L1076:
+	ldrh	w1, [x21, x20]
+	cmp	w0, 64
+	add	w2, w1, 1
 	bfi	w1, w2, 0, 11
-	strh	w1, [x21,x20]
-	bne	.L1081
+	strh	w1, [x21, x20]
+	bne	.L1077
 	add	x19, x19, :lo12:.LANCHOR0
-	ldr	x1, [x19,3392]
-	ldrh	w0, [x1,122]
+	ldr	x1, [x19, 3384]
+	ldrh	w0, [x1, 122]
 	sub	w0, w0, #1
-	strh	w0, [x1,122]
-	b	.L1073
-.L1081:
+	strh	w0, [x1, 122]
+	b	.L1069
+.L1077:
 	cmp	w0, 96
-	bne	.L1073
+	bne	.L1069
 	add	x19, x19, :lo12:.LANCHOR0
-	ldr	x1, [x19,3392]
-	ldrh	w0, [x1,124]
+	ldr	x1, [x19, 3384]
+	ldrh	w0, [x1, 124]
 	sub	w0, w0, #1
-	strh	w0, [x1,124]
-.L1073:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldr	x23, [sp,48]
-	ldp	x29, x30, [sp], 64
+	strh	w0, [x1, 124]
+	b	.L1069
+.L1079:
 	ret
 	.size	ftl_info_data_recovery, .-ftl_info_data_recovery
 	.align	2
@@ -6863,83 +6652,83 @@ ftl_info_data_recovery:
 	.type	ftl_get_ppa_from_index, %function
 ftl_get_ppa_from_index:
 	stp	x29, x30, [sp, -48]!
-	adrp	x2, .LANCHOR3
-	uxth	w1, w0
-	add	x4, x2, :lo12:.LANCHOR3
-	adrp	x0, .LANCHOR0+1120
+	adrp	x1, .LANCHOR0+1128
+	and	w0, w0, 65535
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	str	x21, [sp,32]
-	mov	x19, x2
-	ldr	x3, [x0,#:lo12:.LANCHOR0+1120]
-	ldrh	w0, [x4,1384]
-	ldrb	w4, [x4,1329]
-	mul	w0, w0, w4
-	cmp	w1, w0
+	ldr	x2, [x1, #:lo12:.LANCHOR0+1128]
+	adrp	x1, .LANCHOR3
+	add	x4, x1, :lo12:.LANCHOR3
+	stp	x19, x20, [sp, 16]
+	str	x21, [sp, 32]
+	mov	x19, x1
+	ldrh	w3, [x4, 1376]
+	ldrb	w4, [x4, 1321]
+	mul	w3, w3, w4
+	cmp	w0, w3
 	bge	.L1083
-	add	x3, x3, 16
-	b	.L1084
-.L1083:
-	sub	w1, w1, w0
-	add	x3, x3, 48
-	uxth	w1, w1
+	add	x2, x2, 16
 .L1084:
-	ldrb	w2, [x3,9]
+	ldrb	w1, [x2, 9]
+	sdiv	w20, w0, w1
+	msub	w0, w20, w1, w0
+	add	x0, x2, w0, uxth 1
+	ldrh	w21, [x0, 16]
 	mov	w0, 65535
-	sdiv	w20, w1, w2
-	msub	w1, w20, w2, w1
-	add	x1, x3, w1, uxth 1
-	ldrh	w21, [x1,16]
 	cmp	w21, w0
 	bne	.L1085
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 1832
 	mov	w2, 1945
-	add	x1, x1, 1848
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
 .L1085:
-	add	x2, x19, :lo12:.LANCHOR3
-	ldrh	w0, [x2,1418]
-	madd	w0, w21, w0, w20
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
+	add	x1, x19, :lo12:.LANCHOR3
+	ldrh	w0, [x1, 1410]
+	madd	w0, w0, w21, w20
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
+.L1083:
+	sub	w0, w0, w3
+	add	x2, x2, 48
+	and	w0, w0, 65535
+	b	.L1084
 	.size	ftl_get_ppa_from_index, .-ftl_get_ppa_from_index
 	.align	2
 	.global	lpa_hash_get_ppa
 	.type	lpa_hash_get_ppa, %function
 lpa_hash_get_ppa:
 	adrp	x1, .LANCHOR3
-	mov	w3, 65535
 	add	x1, x1, :lo12:.LANCHOR3
-	add	x2, x1, w0, uxtb 1
-	stp	x29, x30, [sp, -16]!
-	add	x29, sp, 0
-	ldrh	w2, [x2,1424]
-	ldr	x4, [x1,1936]
-	ldr	x5, [x1,1944]
-.L1087:
+	and	x3, x0, 255
+	add	x2, x1, 1416
+	ldr	x4, [x1, 1928]
+	ldr	x5, [x1, 1936]
+	ldrh	w2, [x2, x3, lsl 1]
+	mov	w3, 65535
+.L1088:
 	cmp	w2, w3
-	beq	.L1091
+	bne	.L1091
+	mov	w0, -1
+	ret
+.L1091:
 	uxtw	x1, w2
-	ldr	w6, [x4,x1,lsl 2]
-	cmp	w6, w0
-	bne	.L1088
+	ldr	w6, [x4, x1, lsl 2]
+	cmp	w0, w6
+	bne	.L1089
+	stp	x29, x30, [sp, -16]!
 	mov	w0, w2
+	add	x29, sp, 0
 	bl	ftl_get_ppa_from_index
-	b	.L1089
-.L1088:
-	ldrh	w2, [x5,x1,lsl 1]
-	b	.L1087
-.L1091:
-	mov	w0, -1
-.L1089:
 	ldp	x29, x30, [sp], 16
 	ret
+.L1089:
+	ldrh	w2, [x5, x1, lsl 1]
+	b	.L1088
 	.size	lpa_hash_get_ppa, .-lpa_hash_get_ppa
 	.align	2
 	.global	ftl_get_new_free_page
@@ -6947,97 +6736,95 @@ lpa_hash_get_ppa:
 ftl_get_new_free_page:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	x19, x0
 	ldrh	w1, [x0]
 	mov	w0, 65535
 	cmp	w1, w0
-	bne	.L1093
+	bne	.L1097
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 1856
 	mov	w2, 2088
-	add	x1, x1, 1872
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L1093:
+.L1097:
 	adrp	x20, .LANCHOR3
-	ldrh	w1, [x19,2]
 	add	x0, x20, :lo12:.LANCHOR3
-	ldrh	w0, [x0,1384]
+	ldrh	w1, [x19, 2]
+	ldrh	w0, [x0, 1376]
 	cmp	w1, w0
-	bne	.L1094
+	bne	.L1098
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 1856
 	mov	w2, 2089
-	add	x1, x1, 1872
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L1094:
-	ldrh	w0, [x19,6]
-	cbnz	w0, .L1095
+.L1098:
+	ldrh	w0, [x19, 6]
+	cbnz	w0, .L1099
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 1856
 	mov	w2, 2090
-	add	x1, x1, 1872
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L1095:
-	ldrb	w0, [x19,5]
-	add	x1, x20, :lo12:.LANCHOR3
-	add	x0, x0, 8
-	ldrb	w2, [x1,1329]
-	mov	w1, 65535
-	ldrh	w0, [x19,x0,lsl 1]
-.L1096:
-	cmp	w0, w1
-	bne	.L1100
-	ldrb	w0, [x19,5]
-	add	w0, w0, 1
-	uxtb	w0, w0
-	strb	w0, [x19,5]
-	cmp	w0, w2
-	bne	.L1097
-	ldrh	w0, [x19,2]
-	strb	wzr, [x19,5]
-	add	w0, w0, 1
-	strh	w0, [x19,2]
-.L1097:
-	ldrb	w0, [x19,5]
+.L1099:
+	ldrb	w0, [x19, 5]
+	mov	w2, 65535
 	add	x0, x0, 8
-	ldrh	w0, [x19,x0,lsl 1]
-	b	.L1096
+	ldrh	w3, [x19, x0, lsl 1]
+	add	x0, x20, :lo12:.LANCHOR3
+	ldrb	w4, [x0, 1321]
 .L1100:
+	cmp	w3, w2
+	ldrb	w1, [x19, 5]
+	beq	.L1102
 	add	x20, x20, :lo12:.LANCHOR3
-	ldrh	w2, [x19,2]
-	ldrh	w1, [x20,1418]
-	ldrb	w3, [x20,1329]
-	mul	w0, w0, w1
-	ldrh	w1, [x19,6]
-	orr	w0, w0, w2
-	sub	w1, w1, #1
-	strh	w1, [x19,6]
-	ldrh	w1, [x19,10]
 	add	w1, w1, 1
-	strh	w1, [x19,10]
-	ldrb	w1, [x19,5]
-	add	w1, w1, 1
-	uxtb	w1, w1
-	strb	w1, [x19,5]
-	cmp	w3, w1
-	bne	.L1099
+	and	w1, w1, 255
+	ldrh	w2, [x19, 2]
+	strb	w1, [x19, 5]
+	cmp	w4, w1
+	ldrh	w0, [x20, 1410]
+	mul	w0, w0, w3
+	ldrh	w3, [x19, 6]
+	sub	w3, w3, #1
+	strh	w3, [x19, 6]
+	ldrh	w3, [x19, 10]
+	orr	w0, w0, w2
+	add	w3, w3, 1
+	strh	w3, [x19, 10]
+	bne	.L1096
 	add	w2, w2, 1
-	strb	wzr, [x19,5]
-	strh	w2, [x19,2]
-.L1099:
-	ldp	x19, x20, [sp,16]
+	strb	wzr, [x19, 5]
+	strh	w2, [x19, 2]
+.L1096:
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L1102:
+	add	w1, w1, 1
+	and	w1, w1, 255
+	strb	w1, [x19, 5]
+	cmp	w1, w4
+	bne	.L1101
+	ldrh	w0, [x19, 2]
+	strb	wzr, [x19, 5]
+	add	w0, w0, 1
+	strh	w0, [x19, 2]
+.L1101:
+	ldrb	w0, [x19, 5]
+	add	x0, x0, 8
+	ldrh	w3, [x19, x0, lsl 1]
+	b	.L1100
 	.size	ftl_get_new_free_page, .-ftl_get_new_free_page
 	.align	2
 	.global	ftl_ext_alloc_new_blk
@@ -7045,36 +6832,36 @@ ftl_get_new_free_page:
 ftl_ext_alloc_new_blk:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	bl	ftl_alloc_sys_blk
-	uxth	w0, w0
-	mov	w20, w0
+	and	w0, w0, 65535
 	mov	w1, 65533
+	mov	w20, w0
 	sub	w0, w0, #1
 	cmp	w1, w0, uxth
-	bcs	.L1102
+	bcs	.L1106
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 1880
 	mov	w2, 2125
-	add	x1, x1, 1896
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L1102:
+.L1106:
 	adrp	x19, .LANCHOR0
-	mov	w1, 0
 	add	x19, x19, :lo12:.LANCHOR0
+	mov	w1, 0
 	mov	w0, w20
 	bl	ftl_erase_phy_blk
-	ldr	x0, [x19,3392]
-	ldrh	w0, [x0,130]
+	ldr	x0, [x19, 3384]
+	ldrh	w0, [x0, 130]
 	bl	ftl_free_sys_blk
-	ldr	x0, [x19,3392]
-	strh	w20, [x0,130]
-	strh	wzr, [x0,140]
+	ldr	x0, [x19, 3384]
+	strh	w20, [x0, 130]
+	strh	wzr, [x0, 140]
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	ftl_ext_alloc_new_blk, .-ftl_ext_alloc_new_blk
@@ -7084,88 +6871,88 @@ ftl_ext_alloc_new_blk:
 ftl_total_vpn_update:
 	adrp	x1, .LANCHOR3
 	add	x3, x1, :lo12:.LANCHOR3
-	ldrh	w2, [x3,1952]
-	cbnz	w0, .L1104
+	ldrh	w2, [x3, 1944]
 	cmp	w2, 4
-	bhi	.L1104
+	bhi	.L1109
+	cbnz	w0, .L1109
 	add	w2, w2, 1
-	strh	w2, [x3,1952]
-	b	.L1103
-.L1104:
+	strh	w2, [x3, 1944]
+	ret
+.L1109:
 	add	x1, x1, :lo12:.LANCHOR3
 	adrp	x0, .LANCHOR0
+	mov	x2, 0
+	mov	w3, 0
 	mov	w9, 65535
-	strh	wzr, [x1,1952]
+	strh	wzr, [x1, 1944]
 	add	x1, x0, :lo12:.LANCHOR0
-	ldrh	w6, [x1,1088]
-	ldr	x7, [x1,1112]
-	ldr	x8, [x1,1096]
-	mov	x1, 0
-	mov	w2, w1
-	mov	w3, w1
-.L1106:
-	cmp	w6, w1, uxth
-	bls	.L1114
-	ldrh	w4, [x7,x1,lsl 1]
+	ldrh	w6, [x1, 1096]
+	ldr	x8, [x1, 1104]
+	ldr	x7, [x1, 1120]
+	mov	w1, 0
+.L1111:
+	cmp	w6, w2, uxth
+	bhi	.L1114
+	add	x0, x0, :lo12:.LANCHOR0
+	ldr	x2, [x0, 1128]
+	ldr	x0, [x0, 3384]
+	str	w3, [x2, 524]
+	str	w1, [x2, 528]
+	ldrh	w0, [x0, 120]
+	cbz	w0, .L1108
+	udiv	w1, w1, w0
+	str	w1, [x2, 532]
+.L1108:
+	ret
+.L1114:
+	ldrh	w4, [x7, x2, lsl 1]
 	cmp	w4, w9
-	beq	.L1107
-	add	x5, x8, x1, lsl 2
-	ldrb	w5, [x5,2]
+	beq	.L1112
+	add	x5, x8, x2, lsl 2
+	ldrb	w5, [x5, 2]
 	and	w5, w5, 224
 	cmp	w5, 160
-	bne	.L1108
-	add	w2, w2, w4
-	b	.L1107
-.L1108:
+	bne	.L1113
+	add	w1, w1, w4
+.L1112:
+	add	x2, x2, 1
+	b	.L1111
+.L1113:
 	add	w3, w3, w4
-.L1107:
-	add	x1, x1, 1
-	b	.L1106
-.L1114:
-	add	x0, x0, :lo12:.LANCHOR0
-	ldr	x1, [x0,1120]
-	ldr	x0, [x0,3392]
-	str	w3, [x1,524]
-	str	w2, [x1,528]
-	ldrh	w0, [x0,120]
-	cbz	w0, .L1103
-	udiv	w2, w2, w0
-	str	w2, [x1,532]
-.L1103:
-	ret
+	b	.L1112
 	.size	ftl_total_vpn_update, .-ftl_total_vpn_update
 	.align	2
 	.global	ftl_debug_info_fill
 	.type	ftl_debug_info_fill, %function
 ftl_debug_info_fill:
-	adrp	x3, .LANCHOR0+3360
-	uxtb	w0, w0
+	adrp	x3, .LANCHOR3+1946
+	ldrb	w3, [x3, #:lo12:.LANCHOR3+1946]
+	cmp	w3, 8
+	bls	.L1123
+	and	w0, w0, 255
+	cmp	x2, 0
+	ccmp	w0, 2, 0, ne
+	bne	.L1121
 	stp	x29, x30, [sp, -32]!
+	mov	x0, x2
 	add	x29, sp, 0
-	ldrb	w3, [x3,#:lo12:.LANCHOR0+3360]
-	str	x19, [sp,16]
-	cmp	w3, 8
-	bls	.L1116
-	cmp	w0, 2
-	bne	.L1117
-	cbz	x2, .L1117
+	str	x19, [sp, 16]
 	mov	x19, x1
 	mov	w1, 21320
 	movk	w1, 0x4841, lsl 16
-	mov	x0, x2
 	str	w1, [x19]
 	mov	w1, 1024
 	bl	js_hash
-	str	w0, [x19,4]
-	b	.L1116
-.L1117:
-	str	wzr, [x1]
-	str	wzr, [x1,4]
-.L1116:
+	str	w0, [x19, 4]
 	mov	w0, 0
-	ldr	x19, [sp,16]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L1121:
+	stp	wzr, wzr, [x1]
+.L1123:
+	mov	w0, 0
+	ret
 	.size	ftl_debug_info_fill, .-ftl_debug_info_fill
 	.align	2
 	.global	ftl_vpn_update
@@ -7173,88 +6960,88 @@ ftl_debug_info_fill:
 ftl_vpn_update:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	str	x19, [sp,16]
-	uxth	w19, w0
+	str	x19, [sp, 16]
+	and	w19, w0, 65535
 	mov	w0, w19
-	ubfiz	x19, x19, 1, 16
 	bl	zftl_list_update_data_list
 	adrp	x1, .LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR0
-	ldr	x0, [x1,1112]
-	ldrh	w2, [x0,x19]
-	mov	w0, 0
-	cbnz	w2, .L1125
+	ubfiz	x19, x19, 1, 16
+	ldr	x0, [x1, 1120]
+	ldrh	w0, [x0, x19]
+	cbnz	w0, .L1128
 	mov	w0, 1
-	str	w0, [x1,3412]
-.L1125:
-	ldr	x19, [sp,16]
+	str	w0, [x1, 3396]
+.L1126:
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L1128:
+	mov	w0, 0
+	b	.L1126
 	.size	ftl_vpn_update, .-ftl_vpn_update
 	.align	2
 	.global	ftl_vpn_decrement
 	.type	ftl_vpn_decrement, %function
 ftl_vpn_decrement:
-	stp	x29, x30, [sp, -48]!
-	uxth	w1, w0
-	mov	w0, 65535
+	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	str	x19, [sp,16]
-	cmp	w1, w0
-	beq	.L1128
+	stp	x19, x20, [sp, 16]
+	and	w20, w0, 65535
+	mov	w0, 65535
+	cmp	w20, w0
+	beq	.L1131
 	adrp	x2, .LANCHOR0
-	uxtw	x0, w1
 	add	x2, x2, :lo12:.LANCHOR0
-	lsl	x3, x0, 1
-	ldr	x4, [x2,1112]
-	ldrh	w19, [x4,x3]
-	cbnz	w19, .L1129
-	ldr	x2, [x2,1096]
-	add	x0, x2, x0, lsl 2
-	mov	w2, w19
-	ldrb	w3, [x0,2]
-	adrp	x0, .LC109
-	add	x0, x0, :lo12:.LC109
+	uxtw	x1, w20
+	lsl	x3, x1, 1
+	ldr	x4, [x2, 1120]
+	ldrh	w0, [x4, x3]
+	cbnz	w0, .L1132
+	ldr	x0, [x2, 1104]
+	mov	w2, 0
+	add	x1, x0, x1, lsl 2
+	adrp	x0, .LC106
+	add	x0, x0, :lo12:.LC106
+	ldrb	w3, [x1, 2]
+	mov	w1, w20
 	ubfx	x3, x3, 5, 3
 	bl	printk
-	b	.L1135
-.L1129:
-	sub	w19, w19, #1
-	strh	w19, [x4,x3]
-.L1128:
-	adrp	x19, .LANCHOR3
-	mov	w0, 0
-	add	x19, x19, :lo12:.LANCHOR3
-	ldrh	w2, [x19,1288]
-	cmp	w2, w1
-	beq	.L1130
-	mov	w0, 65535
-	cmp	w2, w0
-	bne	.L1131
-	strh	w1, [x19,1288]
-.L1135:
+.L1137:
 	mov	w0, 0
 	b	.L1130
+.L1132:
+	sub	w0, w0, #1
+	strh	w0, [x4, x3]
 .L1131:
-	mov	w0, w2
-	str	x1, [x29,40]
+	adrp	x19, .LANCHOR3
+	add	x19, x19, :lo12:.LANCHOR3
+	ldrh	w0, [x19, 1280]
+	cmp	w20, w0
+	beq	.L1137
+	mov	w1, 65535
+	cmp	w0, w1
+	bne	.L1134
+	strh	w20, [x19, 1280]
+	b	.L1137
+.L1134:
 	bl	ftl_vpn_update
-	cmp	w0, wzr
-	ldrh	w3, [x19,1954]
+	cmp	w0, 0
+	ldrh	w2, [x19, 1948]
 	cset	w0, ne
-	ldrh	w2, [x19,1288]
-	add	w3, w3, 1
-	ldr	x1, [x29,40]
-	strh	w1, [x19,1288]
-	uxth	w3, w3
-	cmp	w3, 7
-	csel	w3, w3, wzr, ls
-	strh	w3, [x19,1954]
-	add	x3, x19, w3, uxth 1
-	strh	w2, [x3,1296]
+	add	x1, x19, 1288
+	ldrh	w3, [x19, 1280]
+	add	w2, w2, 1
+	strh	w20, [x19, 1280]
+	and	w2, w2, 65535
+	cmp	w2, 7
+	csel	w2, w2, wzr, ls
+	strh	w2, [x19, 1948]
+	and	x2, x2, 65535
+	strh	w3, [x1, x2, lsl 1]
 .L1130:
-	ldr	x19, [sp,16]
-	ldp	x29, x30, [sp], 48
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
 	ret
 	.size	ftl_vpn_decrement, .-ftl_vpn_decrement
 	.align	2
@@ -7262,82 +7049,82 @@ ftl_vpn_decrement:
 	.type	lpa_hash_update_ppa, %function
 lpa_hash_update_ppa:
 	adrp	x3, .LANCHOR3
-	uxtb	w5, w0
 	add	x6, x3, :lo12:.LANCHOR3
-	uxth	w2, w2
-	add	x4, x6, 1424
-	stp	x29, x30, [sp, -16]!
-	add	x29, sp, 0
-	ldr	x8, [x6,1936]
-	ldr	x12, [x6,1944]
+	add	x5, x6, 1416
+	and	x4, x0, 255
+	and	w2, w2, 65535
+	ldr	x10, [x6, 1928]
+	ldrh	w5, [x5, x4, lsl 1]
+	ldr	x11, [x6, 1936]
 	mov	w6, 65535
-	ldrh	w4, [x4,w5,sxtw 1]
-	mov	w11, w6
-.L1137:
-	cmp	w4, w11
-	beq	.L1141
-	uxtw	x9, w4
-	uxth	x7, w4
-	lsl	x10, x9, 2
-	add	x13, x8, x10
-	ldr	w10, [x8,x10]
-	cmp	w10, w0
-	bne	.L1138
-	mov	w4, -1
-	str	w4, [x13]
-	mov	w4, 65535
-	cmp	w6, w4
-	add	x4, x3, :lo12:.LANCHOR3
-	bne	.L1139
-	ldr	x6, [x4,1944]
-	add	x4, x4, 1424
-	ldrh	w6, [x6,x7,lsl 1]
-	strh	w6, [x4,w5,sxtw 1]
-	b	.L1140
-.L1139:
-	ldr	x4, [x4,1944]
-	ldrh	w8, [x4,x7,lsl 1]
-	strh	w8, [x4,w6,uxtw 1]
+	mov	w9, w6
 .L1140:
-	add	x4, x3, :lo12:.LANCHOR3
+	cmp	w5, w9
+	beq	.L1144
+	uxtw	x8, w5
+	lsl	x7, x8, 2
+	add	x12, x10, x7
+	ldr	w7, [x10, x7]
+	cmp	w0, w7
+	lsl	x7, x8, 1
+	bne	.L1141
+	mov	w5, -1
+	str	w5, [x12]
+	cmp	w6, w9
+	add	x5, x3, :lo12:.LANCHOR3
+	bne	.L1142
+	ldr	x6, [x5, 1936]
+	add	x5, x5, 1416
+	ldrh	w6, [x6, x7]
+	strh	w6, [x5, x4, lsl 1]
+.L1143:
+	add	x5, x3, :lo12:.LANCHOR3
 	mov	w6, -1
-	ldr	x4, [x4,1944]
-	strh	w6, [x4,x7,lsl 1]
-	b	.L1141
-.L1138:
-	mov	w6, w4
-	ldrh	w4, [x12,x9,lsl 1]
-	b	.L1137
-.L1141:
+	ldr	x5, [x5, 1936]
+	strh	w6, [x5, x8, lsl 1]
+.L1144:
 	add	x3, x3, :lo12:.LANCHOR3
-	uxtw	x4, w2
+	uxtw	x5, w2
 	cmn	w1, #1
-	ldr	x6, [x3,1936]
-	str	w0, [x6,x4,lsl 2]
-	add	x0, x3, 1424
-	ldrh	w6, [x0,w5,sxtw 1]
-	strh	w2, [x0,w5,sxtw 1]
-	ldr	x0, [x3,1944]
-	strh	w6, [x0,x4,lsl 1]
-	beq	.L1143
-	adrp	x2, .LANCHOR0+1257
-	ldrh	w0, [x3,1312]
-	lsr	w1, w1, w0
-	ldrb	w4, [x2,#:lo12:.LANCHOR0+1257]
-	mov	w2, 24
-	sub	w2, w2, w4
-	mov	w4, 1
-	sub	w2, w2, w0
-	ldrb	w0, [x3,1314]
-	lsl	w2, w4, w2
-	sub	w2, w2, #1
-	and	w1, w2, w1
+	ldr	x6, [x3, 1928]
+	str	w0, [x6, x5, lsl 2]
+	add	x0, x3, 1416
+	ldrh	w6, [x0, x4, lsl 1]
+	strh	w2, [x0, x4, lsl 1]
+	ldr	x0, [x3, 1936]
+	strh	w6, [x0, x5, lsl 1]
+	beq	.L1151
+	stp	x29, x30, [sp, -16]!
+	adrp	x0, .LANCHOR0+1205
+	add	x29, sp, 0
+	ldrb	w2, [x0, #:lo12:.LANCHOR0+1205]
+	mov	w0, 24
+	ldrh	w4, [x3, 1304]
+	sub	w0, w0, w2
+	sub	w2, w0, w4
+	mov	w0, 1
+	lsr	w1, w1, w4
+	lsl	w0, w0, w2
+	sub	w0, w0, #1
+	and	w1, w0, w1
+	ldrb	w0, [x3, 1306]
 	udiv	w0, w1, w0
 	bl	ftl_vpn_decrement
-.L1143:
 	mov	w0, -1
 	ldp	x29, x30, [sp], 16
 	ret
+.L1142:
+	ldr	x5, [x5, 1936]
+	ldrh	w7, [x5, x7]
+	strh	w7, [x5, w6, uxtw 1]
+	b	.L1143
+.L1141:
+	mov	w6, w5
+	ldrh	w5, [x11, x7]
+	b	.L1140
+.L1151:
+	mov	w0, -1
+	ret
 	.size	lpa_hash_update_ppa, .-lpa_hash_update_ppa
 	.align	2
 	.global	ftl_mask_bad_block
@@ -7345,64 +7132,64 @@ lpa_hash_update_ppa:
 ftl_mask_bad_block:
 	stp	x29, x30, [sp, -48]!
 	adrp	x6, .LANCHOR0
-	mov	w4, 1
-	add	x29, sp, 0
 	add	x1, x6, :lo12:.LANCHOR0
-	mov	w3, 24
-	stp	x19, x20, [sp,16]
-	str	x21, [sp,32]
-	adrp	x7, .LANCHOR3
-	add	x7, x7, :lo12:.LANCHOR3
+	adrp	x3, .LANCHOR3
+	add	x29, sp, 0
+	stp	x19, x20, [sp, 16]
+	add	x3, x3, :lo12:.LANCHOR3
+	str	x21, [sp, 32]
+	mov	w7, 24
+	mov	w4, 1
 	mov	x19, x6
-	ldrb	w1, [x1,1257]
-	sub	w3, w3, w1
+	ldrb	w1, [x1, 1205]
+	ldrb	w5, [x3, 1306]
+	ldrh	w3, [x3, 1304]
+	sub	w7, w7, w1
 	lsl	w1, w4, w1
-	lsr	w2, w0, w3
 	sub	w1, w1, #1
+	lsr	w2, w0, w7
 	and	w1, w1, w2
-	ldrb	w5, [x7,1314]
-	uxtb	w1, w1
+	lsr	w0, w0, w3
+	sub	w3, w7, w3
+	and	w1, w1, 255
 	cmp	w5, 1
-	mul	w2, w1, w5
-	uxtb	w20, w2
-	ldrh	w2, [x7,1312]
-	sub	w3, w3, w2
-	lsr	w0, w0, w2
 	lsl	w3, w4, w3
 	sub	w3, w3, #1
 	and	w3, w3, w0
-	uxth	w4, w3
+	and	w4, w3, 65535
+	mul	w2, w1, w5
 	udiv	w3, w3, w5
-	uxth	w21, w3
-	bls	.L1148
-	sub	w5, w5, #1
-	and	w5, w4, w5
-	add	w2, w20, w5
-	uxtb	w20, w2
-.L1148:
+	and	w20, w2, 255
+	and	w21, w3, 65535
+	bls	.L1155
+	sub	w2, w5, #1
+	and	w2, w2, w4
+	add	w2, w20, w2
+	and	w20, w2, 255
+.L1155:
 	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 14, .L1149
-	adrp	x0, .LC110
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 14, .L1156
+	adrp	x0, .LC107
+	and	w3, w3, 65535
 	mov	w2, w20
-	add	x0, x0, :lo12:.LC110
-	uxth	w3, w3
+	add	x0, x0, :lo12:.LC107
 	bl	printk
-.L1149:
+.L1156:
 	add	x0, x19, :lo12:.LANCHOR0
-	ldrh	w1, [x0,1088]
+	ldrh	w1, [x0, 1096]
 	cmp	w1, w21
-	bls	.L1147
-	ldr	x0, [x0,1096]
+	bls	.L1154
+	ldr	x0, [x0, 1104]
 	mov	w2, 1
-	add	x21, x0, w21, uxth 2
-	ldrb	w0, [x21,3]
 	lsl	w2, w2, w20
-	orr	w2, w2, w0
-	strb	w2, [x21,3]
-.L1147:
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
+	add	x21, x0, w21, uxth 2
+	ldrb	w20, [x21, 3]
+	orr	w2, w2, w20
+	strb	w2, [x21, 3]
+.L1154:
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	ftl_mask_bad_block, .-ftl_mask_bad_block
@@ -7410,112 +7197,109 @@ ftl_mask_bad_block:
 	.global	gc_free_bad_sblk
 	.type	gc_free_bad_sblk, %function
 gc_free_bad_sblk:
-	stp	x29, x30, [sp, -112]!
+	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR0
-	stp	x23, x24, [sp,48]
-	uxth	w24, w0
-	add	x0, x20, :lo12:.LANCHOR0
-	stp	x27, x28, [sp,80]
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	mov	w27, 0
-	ldr	w0, [x0,5624]
-	cbz	w0, .L1171
-	adrp	x22, .LANCHOR3
-	adrp	x21, .LC111
-	add	x0, x21, :lo12:.LC111
-	mov	x23, x22
-	mov	w25, 24
-	str	x0, [x29,104]
-.L1172:
-	add	x2, x22, :lo12:.LANCHOR3
-	ldrb	w0, [x2,1329]
-	cmp	w0, w27
-	bls	.L1171
-	add	x4, x20, :lo12:.LANCHOR0
-	ldrb	w3, [x2,1314]
-	ldrh	w2, [x2,1312]
-	cmp	w3, 1
-	ldrb	w19, [x4,1257]
-	uxth	w1, w3
-	sdiv	w0, w27, w3
-	sub	w19, w25, w19
-	sub	w19, w19, w2
-	lsl	w19, w0, w19
-	madd	w19, w24, w1, w19
-	uxth	w19, w19
-	bls	.L1156
-	sub	w1, w1, #1
-	and	w1, w27, w1
-	add	w19, w19, w1
-	uxth	w19, w19
-.L1156:
-	add	x21, x20, :lo12:.LANCHOR0
+	stp	x23, x24, [sp, 48]
+	adrp	x24, .LANCHOR0
+	add	x24, x24, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	and	w22, w0, 65535
+	stp	x19, x20, [sp, 16]
+	stp	x25, x26, [sp, 64]
+	ldr	w0, [x24, 5616]
+	str	x27, [sp, 80]
+	cbz	w0, .L1177
+	mov	w23, 20041
+	add	x27, x24, 3416
 	mov	w26, 0
-	add	x28, x21, 3424
-.L1157:
-	ldr	w0, [x28,2200]
-	cmp	w26, w0
-	bcs	.L1173
-	add	x0, x28, w26, sxtw 1
-	ldrh	w0, [x0,2204]
-	cmp	w0, w19
-	bne	.L1158
-	ldr	x0, [x29,104]
-	mov	w1, w19
-	bl	printk
-	add	x0, x23, :lo12:.LANCHOR3
-	ldrb	w1, [x0,1956]
-	cbnz	w1, .L1159
-	ldrb	w0, [x0,1330]
-	cbz	w0, .L1160
-.L1159:
-	ldr	x0, [x21,3392]
-	ldr	w1, [x0,156]
-	mov	w0, 20041
-	movk	w0, 0x444b, lsl 16
-	cmp	w1, w0
-	beq	.L1161
-.L1160:
-	add	x0, x23, :lo12:.LANCHOR3
-	ldrh	w0, [x0,1312]
-	lsl	w0, w19, w0
-	bl	ftl_mask_bad_block
-.L1161:
-	ldr	w1, [x28,2200]
-	mov	w0, w26
-.L1162:
-	cmp	w0, w1
-	bcs	.L1174
-	add	w2, w0, 1
-	add	x0, x28, w0, sxtw 1
-	add	x4, x28, w2, sxtw 1
-	ldrh	w4, [x4,2204]
-	strh	w4, [x0,2204]
-	uxth	w0, w2
-	b	.L1162
+	movk	w23, 0x444b, lsl 16
+.L1164:
+	adrp	x21, .LANCHOR3
+	add	x2, x21, :lo12:.LANCHOR3
+	ldrb	w0, [x2, 1321]
+	cmp	w0, w26
+	bhi	.L1174
+.L1177:
+	mov	w0, 0
+	ldr	x27, [sp, 80]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 96
+	ret
 .L1174:
-	sub	w1, w1, #1
-	str	w1, [x28,2200]
-.L1158:
+	ldrb	w3, [x2, 1306]
+	mov	w1, 24
+	ldrb	w4, [x24, 1205]
+	ldrh	w2, [x2, 1304]
+	and	w0, w3, 65535
+	sub	w1, w1, w4
+	cmp	w3, 1
+	sdiv	w19, w26, w3
+	sub	w1, w1, w2
+	lsl	w19, w19, w1
+	madd	w19, w22, w0, w19
+	and	w19, w19, 65535
+	bls	.L1165
+	sub	w0, w0, #1
+	and	w0, w0, w26
+	add	w19, w19, w0
+	and	w19, w19, 65535
+.L1165:
+	adrp	x25, .LC108
+	add	x25, x25, :lo12:.LC108
+	mov	w20, 0
+.L1166:
+	ldr	w0, [x27, 2200]
+	cmp	w20, w0
+	bcc	.L1173
 	add	w26, w26, 1
-	uxth	w26, w26
-	b	.L1157
+	and	w26, w26, 65535
+	b	.L1164
 .L1173:
-	add	w27, w27, 1
-	uxth	w27, w27
-	b	.L1172
+	add	x0, x27, w20, sxtw 1
+	ldrh	w0, [x0, 2204]
+	cmp	w0, w19
+	bne	.L1167
+	mov	w1, w19
+	mov	x0, x25
+	bl	printk
+	add	x0, x21, :lo12:.LANCHOR3
+	ldrb	w1, [x0, 1950]
+	cbnz	w1, .L1168
+	ldrb	w0, [x0, 1322]
+	cbz	w0, .L1169
+.L1168:
+	ldr	x0, [x24, 3384]
+	ldr	w0, [x0, 156]
+	cmp	w0, w23
+	beq	.L1170
+.L1169:
+	add	x0, x21, :lo12:.LANCHOR3
+	ldrh	w0, [x0, 1304]
+	lsl	w0, w19, w0
+	bl	ftl_mask_bad_block
+.L1170:
+	ldr	w1, [x27, 2200]
+	mov	w0, w20
 .L1171:
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 112
-	ret
+	cmp	w0, w1
+	bcc	.L1172
+	sub	w1, w1, #1
+	str	w1, [x27, 2200]
+.L1167:
+	add	w20, w20, 1
+	and	w20, w20, 65535
+	b	.L1166
+.L1172:
+	add	w2, w0, 1
+	add	x0, x27, w0, sxtw 1
+	add	x3, x27, w2, sxtw 1
+	ldrh	w3, [x3, 2204]
+	strh	w3, [x0, 2204]
+	and	w0, w2, 65535
+	b	.L1171
 	.size	gc_free_bad_sblk, .-gc_free_bad_sblk
 	.align	2
 	.global	ftl_free_sblk
@@ -7523,202 +7307,201 @@ gc_free_bad_sblk:
 ftl_free_sblk:
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR0
-	add	x4, x20, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	uxth	x24, w0
-	ldr	x5, [x4,1096]
+	add	x3, x20, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	and	x24, x0, 65535
 	lsl	x19, x24, 2
 	mov	x22, x24
-	add	x21, x5, x19
-	ldrb	w2, [x21,2]
-	ubfx	x23, x2, 5, 3
-	tbz	x2, 3, .L1176
-	ldr	x6, [x4,3392]
-	ldrh	w0, [x5,x19]
-	ldr	w3, [x5,x19]
-	ldrh	w7, [x6,74]
-	and	w1, w0, 2047
-	ldrh	w6, [x6,72]
-	ubfx	x8, x3, 11, 8
-	add	w7, w1, w7
-	ldrh	w3, [x4,1104]
-	add	w6, w8, w6
-	uxth	w0, w7
-	uxth	w7, w6
-	adrp	x6, .LANCHOR3
-	add	x6, x6, :lo12:.LANCHOR3
-	udiv	w9, w0, w3
-	ldrh	w10, [x6,1958]
-	add	w9, w7, w9
+	ldr	x4, [x3, 1104]
+	add	x21, x4, x19
+	ldrb	w0, [x21, 2]
+	ubfx	x23, x0, 5, 3
+	tbz	x0, 3, .L1184
+	ldr	x5, [x3, 3384]
+	ldr	w2, [x4, x19]
+	ldrh	w1, [x4, x19]
+	ldrh	w6, [x5, 74]
+	and	w1, w1, 2047
+	ubfx	x7, x2, 11, 8
+	ldrh	w2, [x3, 1112]
+	add	w6, w1, w6
+	and	w8, w6, 65535
+	ldrh	w6, [x5, 72]
+	adrp	x5, .LANCHOR3
+	add	x5, x5, :lo12:.LANCHOR3
+	add	w6, w7, w6
+	udiv	w9, w8, w2
+	and	w6, w6, 65535
+	ldrh	w10, [x5, 1952]
+	add	w9, w9, w6
 	cmp	w9, w10
-	ble	.L1177
-	ldrh	w0, [x4,3378]
-	ldrh	w7, [x4,3386]
-	add	w7, w7, w0
-	ldrh	w0, [x6,1390]
-	add	w0, w0, 8
-	cmp	w7, w0
-	blt	.L1183
-	ldrh	w0, [x4,3376]
-	ldrh	w7, [x4,3382]
-	add	w7, w7, w0
-	ldrh	w0, [x4,3384]
-	add	w4, w7, w0
-	ldrh	w0, [x6,1388]
-	add	w0, w0, 8
-	cmp	w4, w0
-	b	.L1197
-.L1177:
-	madd	w7, w7, w3, w0
-	ldrh	w0, [x6,1960]
-	cmp	w7, w0
-	ble	.L1179
-	ldrh	w0, [x4,3376]
-	ldrh	w7, [x4,3382]
-	add	w7, w7, w0
-	ldrh	w0, [x4,3384]
-	add	w7, w7, w0
-	ldrh	w0, [x6,1388]
-	add	w9, w0, 8
-	cmp	w7, w9
-	blt	.L1195
-	ldrh	w9, [x4,3386]
-	ldrh	w4, [x4,3378]
-	add	w9, w9, w4
-	ldrh	w4, [x6,1390]
-	add	w4, w4, 8
-	cmp	w9, w4
-	blt	.L1183
-	add	w0, w0, 24
-	cmp	w7, w0
-.L1197:
-	bge	.L1183
-.L1195:
-	and	w2, w2, -25
-	b	.L1194
-.L1183:
-	mov	w0, 2
-	bfi	w2, w0, 3, 2
-.L1194:
-	strb	w2, [x21,2]
-.L1179:
-	ldrb	w0, [x21,2]
-	ands	w0, w0, 24
-	bne	.L1184
-	mul	w0, w8, w3
-	lsr	w3, w8, 3
-	add	w0, w0, w0, lsl 1
-	add	w0, w1, w0, lsr 2
-	ldrh	w1, [x5,x19]
-	bfi	w1, w0, 0, 11
-	strh	w1, [x5,x19]
-	ldr	w0, [x5,x19]
-	bfi	w0, w3, 11, 8
-	str	w0, [x5,x19]
-	b	.L1185
-.L1184:
-	cmp	w0, 16
-	bne	.L1185
-	sdiv	w3, w1, w3
-	ldr	w0, [x5,x19]
-	add	w3, w3, w3, lsl 1
-	add	w3, w8, w3, lsr 2
-	bfi	w0, w3, 11, 8
-	asr	w3, w1, 5
-	str	w0, [x5,x19]
-	bfi	w0, w3, 0, 11
-	strh	w0, [x5,x19]
-	b	.L1185
-.L1176:
-	tst	w2, 24
-	bne	.L1185
-	ldrh	w0, [x4,3380]
-	cbnz	w0, .L1185
-	ldrh	w0, [x4,3378]
-	cmp	w0, 15
-	bhi	.L1185
-	ldrh	w1, [x4,3376]
-	ldrh	w6, [x4,3382]
-	add	w6, w6, w1
-	ldrh	w1, [x4,3384]
-	add	w6, w6, w1
-	adrp	x1, .LANCHOR3
-	add	x1, x1, :lo12:.LANCHOR3
-	ldrh	w3, [x1,1388]
-	add	w3, w3, 16
-	cmp	w6, w3
 	ble	.L1185
-	ldrh	w3, [x4,3386]
-	ldrh	w1, [x1,1390]
-	add	w0, w3, w0
-	add	w1, w1, 8
-	cmp	w0, w1
-	bge	.L1185
-	mov	w0, 2
-	bfi	w2, w0, 3, 2
-	strb	w2, [x21,2]
-	ldrh	w2, [x4,1104]
-	ldrh	w0, [x5,x19]
-	and	w0, w0, 2047
-	sdiv	w2, w0, w2
-	asr	w0, w0, 5
-	add	w3, w2, w2, lsl 1
-	ldr	w2, [x5,x19]
-	ubfx	x1, x2, 11, 8
-	add	w3, w1, w3, lsr 2
-	bfi	w2, w3, 11, 8
-	str	w2, [x5,x19]
-	bfi	w2, w0, 0, 11
-	strh	w2, [x5,x19]
+	ldrh	w6, [x3, 3370]
+	ldrh	w8, [x3, 3378]
+	add	w8, w8, w6
+	ldrh	w6, [x5, 1382]
+	add	w6, w6, 8
+	cmp	w8, w6
+	bge	.L1186
+.L1191:
+	mov	w3, 2
+	bfi	w0, w3, 3, 2
+	b	.L1203
+.L1186:
+	ldrh	w6, [x3, 3374]
+	ldrh	w8, [x3, 3368]
+	ldrh	w5, [x5, 1380]
+	ldrh	w3, [x3, 3376]
+	add	w6, w6, w8
+	add	w5, w5, 8
+	add	w3, w6, w3
+	cmp	w3, w5
+.L1207:
+	bge	.L1191
+	b	.L1205
 .L1185:
+	madd	w6, w2, w6, w8
+	ldrh	w8, [x5, 1954]
+	cmp	w6, w8
+	ble	.L1187
+	ldrh	w8, [x3, 3368]
+	ldrh	w6, [x3, 3374]
+	add	w6, w6, w8
+	ldrh	w8, [x3, 3376]
+	add	w6, w6, w8
+	ldrh	w8, [x5, 1380]
+	add	w9, w8, 8
+	cmp	w6, w9
+	bge	.L1189
+.L1205:
+	and	w0, w0, -25
+.L1203:
+	strb	w0, [x21, 2]
+.L1187:
+	ldrb	w0, [x21, 2]
+	ands	w0, w0, 24
+	bne	.L1192
+	mul	w2, w7, w2
+	ldrh	w0, [x4, x19]
+	add	w2, w2, w2, lsl 1
+	add	w1, w1, w2, lsr 2
+	lsr	w2, w7, 3
+	bfi	w0, w1, 0, 11
+	strh	w0, [x4, x19]
+	ldr	w0, [x4, x19]
+	bfi	w0, w2, 11, 8
+	str	w0, [x4, x19]
+.L1193:
 	mov	w0, w22
-	add	w23, w23, 6
-	and	w23, w23, 7
 	bl	zftl_remove_data_node
 	add	x1, x20, :lo12:.LANCHOR0
+	add	w23, w23, 6
+	and	w23, w23, 7
 	cmp	w23, 4
-	ldr	x2, [x1,1096]
-	add	x2, x2, x19
-	ldrb	w0, [x2,2]
+	ldr	x0, [x1, 1104]
+	add	x19, x0, x19
+	ldrb	w0, [x19, 2]
 	and	w0, w0, 31
-	strb	w0, [x2,2]
-	ldr	x0, [x1,1112]
-	strh	wzr, [x0,x24,lsl 1]
-	bhi	.L1188
+	strb	w0, [x19, 2]
+	ldr	x0, [x1, 1120]
+	strh	wzr, [x0, x24, lsl 1]
+	bhi	.L1196
 	mov	w0, w22
 	bl	gc_free_bad_sblk
-.L1188:
-	ldrb	w0, [x21,2]
-	tbz	x0, 3, .L1189
+.L1196:
+	ldrb	w0, [x21, 2]
+	tbz	x0, 3, .L1197
 	add	x20, x20, :lo12:.LANCHOR0
-	ldr	x0, [x20,1120]
-	ldrh	w1, [x0,586]
+	ldr	x0, [x20, 1128]
+	ldrh	w1, [x0, 586]
 	cmp	w1, w22
-	bne	.L1189
+	bne	.L1197
 	mov	w1, -1
-	ldrh	w2, [x0,590]
-	strh	w1, [x0,586]
+	ldrh	w2, [x0, 590]
+	strh	w1, [x0, 586]
 	mov	w1, 65535
 	cmp	w2, w1
-	bne	.L1189
-	strh	w22, [x0,590]
-	adrp	x0, .LC112
+	bne	.L1197
+	strh	w22, [x0, 590]
 	mov	w1, w22
-	add	x0, x0, :lo12:.LC112
+	adrp	x0, .LC109
+	add	x0, x0, :lo12:.LC109
 	bl	printk
-	b	.L1175
+.L1183:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 64
+	ret
 .L1189:
+	ldrh	w9, [x3, 3378]
+	ldrh	w3, [x3, 3370]
+	add	w9, w9, w3
+	ldrh	w3, [x5, 1382]
+	add	w3, w3, 8
+	cmp	w9, w3
+	blt	.L1191
+	add	w8, w8, 24
+	cmp	w6, w8
+	b	.L1207
+.L1192:
+	cmp	w0, 16
+	bne	.L1193
+	sdiv	w2, w1, w2
+	ldr	w0, [x4, x19]
+	add	w2, w2, w2, lsl 1
+	add	w2, w7, w2, lsr 2
+.L1204:
+	bfi	w0, w2, 11, 8
+	asr	w1, w1, 5
+	str	w0, [x4, x19]
+	bfi	w0, w1, 0, 11
+	strh	w0, [x4, x19]
+	b	.L1193
+.L1184:
+	tst	w0, 24
+	bne	.L1193
+	ldrh	w1, [x3, 3372]
+	cbnz	w1, .L1193
+	ldrh	w7, [x3, 3370]
+	cmp	w7, 15
+	bhi	.L1193
+	ldrh	w2, [x3, 3368]
+	ldrh	w1, [x3, 3374]
+	add	w1, w1, w2
+	ldrh	w2, [x3, 3376]
+	add	w1, w1, w2
+	adrp	x2, .LANCHOR3
+	add	x2, x2, :lo12:.LANCHOR3
+	ldrh	w6, [x2, 1380]
+	add	w6, w6, 16
+	cmp	w1, w6
+	ble	.L1193
+	ldrh	w5, [x3, 3378]
+	ldrh	w1, [x2, 1382]
+	add	w5, w5, w7
+	add	w1, w1, 8
+	cmp	w5, w1
+	bge	.L1193
+	mov	w1, 2
+	bfi	w0, w1, 3, 2
+	strb	w0, [x21, 2]
+	ldrh	w0, [x3, 1112]
+	ldrh	w1, [x4, x19]
+	and	w1, w1, 2047
+	sdiv	w0, w1, w0
+	add	w2, w0, w0, lsl 1
+	ldr	w0, [x4, x19]
+	ubfx	x3, x0, 11, 8
+	add	w2, w3, w2, lsr 2
+	b	.L1204
+.L1197:
 	mov	w0, w22
 	bl	zftl_insert_free_list
-.L1175:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 64
-	ret
+	b	.L1183
 	.size	ftl_free_sblk, .-ftl_free_sblk
 	.align	2
 	.global	gc_free_src_blk
@@ -7726,234 +7509,231 @@ ftl_free_sblk:
 gc_free_src_blk:
 	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	stp	x21, x22, [sp,32]
-	adrp	x23, .LANCHOR0
-	adrp	x21, .LANCHOR1
-	add	x23, x23, :lo12:.LANCHOR0
-	add	x21, x21, :lo12:.LANCHOR1
-	stp	x19, x20, [sp,16]
-	stp	x25, x26, [sp,64]
+	stp	x21, x22, [sp, 32]
+	adrp	x22, .LANCHOR0
+	stp	x23, x24, [sp, 48]
+	add	x24, x22, :lo12:.LANCHOR0
+	adrp	x23, .LC110
+	add	x21, x24, 3416
+	add	x23, x23, :lo12:.LC110
+	stp	x19, x20, [sp, 16]
+	stp	x25, x26, [sp, 64]
 	mov	w20, 0
-	add	x24, x23, 3424
-	add	x21, x21, 1920
-.L1199:
-	ldrh	w0, [x24,56]
-	adrp	x25, .LANCHOR0
+.L1209:
+	ldrh	w0, [x21, 56]
 	cmp	w0, w20
-	bls	.L1237
-	add	x0, x24, w20, sxtw 1
-	ldrh	w22, [x0,58]
-	ldr	x0, [x23,1112]
-	lsl	x26, x22, 1
-	mov	x19, x22
-	ldrh	w2, [x0,x26]
-	cbz	w2, .L1200
-	adrp	x0, .LC113
-	mov	w1, w22
-	add	x0, x0, :lo12:.LC113
+	bhi	.L1224
+	strh	wzr, [x21, 56]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	ret
+.L1224:
+	add	x0, x21, w20, sxtw 1
+	ldrh	w25, [x0, 58]
+	ldr	x0, [x24, 1120]
+	mov	x19, x25
+	lsl	x26, x25, 1
+	ldrh	w2, [x0, x26]
+	cbz	w2, .L1210
+	mov	w1, w25
+	mov	x0, x23
 	bl	printk
-.L1200:
-	add	x0, x25, :lo12:.LANCHOR0
-	ldr	x1, [x0,1112]
-	strh	wzr, [x1,x26]
-	ldr	x1, [x0,1112]
-	ldrh	w1, [x1,x26]
-	cbnz	w1, .L1201
-	ldr	x0, [x0,1096]
-	add	x22, x0, x22, lsl 2
+.L1210:
+	add	x0, x22, :lo12:.LANCHOR0
+	ldr	x1, [x0, 1120]
+	strh	wzr, [x1, x26]
+	ldr	x1, [x0, 1120]
+	ldrh	w1, [x1, x26]
+	cbnz	w1, .L1211
+	ldr	x0, [x0, 1104]
+	add	x25, x0, x25, lsl 2
 	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 8, .L1202
-	ldrb	w2, [x22,2]
-	adrp	x0, .LC114
-	add	x0, x0, :lo12:.LC114
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 8, .L1212
+	ldrb	w2, [x25, 2]
+	adrp	x0, .LC111
 	mov	w1, w19
+	add	x0, x0, :lo12:.LC111
 	ubfx	x2, x2, 5, 3
 	bl	printk
-.L1202:
-	ldrb	w0, [x22,2]
+.L1212:
+	ldrb	w0, [x25, 2]
+	and	w1, w0, 224
+	cmp	w1, 224
+	beq	.L1213
 	tst	w0, 192
-	beq	.L1215
-	and	w0, w0, 224
-	cmp	w0, 224
-	bne	.L1203
-.L1215:
-	adrp	x0, .LC0
-	mov	x1, x21
+	bne	.L1214
+.L1213:
+	adrp	x1, .LANCHOR1
+	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 1904
 	mov	w2, 1363
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L1203:
+.L1214:
 	mov	w0, w19
-	add	x25, x25, :lo12:.LANCHOR0
 	bl	ftl_free_sblk
-	ldr	x2, [x25,1120]
-	ldrh	w1, [x2,124]
-	cbz	w1, .L1205
-	mov	x0, 0
-.L1207:
-	add	x4, x2, x0, lsl 1
-	mov	w3, w0
-	ldrh	w4, [x4,392]
+	add	x0, x22, :lo12:.LANCHOR0
+	ldr	x0, [x0, 1128]
+	ldrh	w2, [x0, 124]
+	cbz	w2, .L1215
+	add	x3, x0, 392
+	mov	w1, 0
+.L1217:
+	ldrh	w4, [x3]
 	cmp	w4, w19
-	bne	.L1206
-	add	x0, x2, w3, sxtw 1
+	bne	.L1216
+	add	x1, x0, w1, sxtw 1
 	mov	w3, -1
-	strh	w3, [x0,392]
-	sub	w1, w1, #1
-	strh	w1, [x2,124]
-	b	.L1205
-.L1206:
-	add	x0, x0, 1
-	cmp	x0, 64
-	bne	.L1207
-.L1205:
-	ldrh	w1, [x2,120]
-	cbz	w1, .L1208
-	mov	x0, 0
-.L1210:
-	add	x4, x2, x0, lsl 1
-	mov	w3, w0
-	ldrh	w4, [x4,136]
+	sub	w2, w2, #1
+	strh	w3, [x1, 392]
+	strh	w2, [x0, 124]
+.L1215:
+	ldrh	w2, [x0, 120]
+	cbz	w2, .L1218
+	add	x3, x0, 136
+	mov	w1, 0
+.L1220:
+	ldrh	w4, [x3]
 	cmp	w4, w19
-	bne	.L1209
-	add	x0, x2, w3, sxtw 1
+	bne	.L1219
+	add	x1, x0, w1, sxtw 1
 	mov	w3, -1
-	strh	w3, [x0,136]
-	sub	w1, w1, #1
-	strh	w1, [x2,120]
-	b	.L1208
-.L1209:
-	add	x0, x0, 1
-	cmp	x0, 64
-	bne	.L1210
-.L1208:
-	ldrh	w1, [x2,122]
-	cbz	w1, .L1211
-	mov	x0, 0
-.L1213:
-	add	x4, x2, x0, lsl 1
-	mov	w3, w0
-	ldrh	w4, [x4,264]
+	sub	w2, w2, #1
+	strh	w3, [x1, 136]
+	strh	w2, [x0, 120]
+.L1218:
+	ldrh	w2, [x0, 122]
+	cbz	w2, .L1221
+	add	x3, x0, 264
+	mov	w1, 0
+.L1223:
+	ldrh	w4, [x3]
 	cmp	w4, w19
-	bne	.L1212
-	add	x0, x2, w3, sxtw 1
+	bne	.L1222
+	add	x1, x0, w1, sxtw 1
 	mov	w3, -1
-	strh	w3, [x0,264]
-	sub	w1, w1, #1
-	strh	w1, [x2,122]
-	b	.L1211
-.L1212:
-	add	x0, x0, 1
-	cmp	x0, 64
-	bne	.L1213
-	b	.L1211
-.L1201:
-	mov	w0, w19
-	mov	w1, 1
+	sub	w2, w2, #1
+	strh	w3, [x1, 264]
+	strh	w2, [x0, 122]
+.L1221:
+	add	w20, w20, 1
+	and	w20, w20, 65535
+	b	.L1209
+.L1216:
+	add	w1, w1, 1
+	add	x3, x3, 2
+	cmp	w1, 64
+	bne	.L1217
+	b	.L1215
+.L1219:
+	add	w1, w1, 1
+	add	x3, x3, 2
+	cmp	w1, 64
+	bne	.L1220
+	b	.L1218
+.L1222:
+	add	w1, w1, 1
+	add	x3, x3, 2
+	cmp	w1, 64
+	bne	.L1223
+	b	.L1221
+.L1211:
 	mov	w2, 0
+	mov	w1, 1
+	mov	w0, w19
 	bl	gc_add_sblk
-.L1211:
-	add	w20, w20, 1
-	uxth	w20, w20
-	b	.L1199
-.L1237:
-	strh	wzr, [x24,56]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 80
-	ret
+	b	.L1221
 	.size	gc_free_src_blk, .-gc_free_src_blk
 	.align	2
 	.global	print_ftl_debug_info
 	.type	print_ftl_debug_info, %function
 print_ftl_debug_info:
 	sub	sp, sp, #64
-	stp	x29, x30, [sp,32]
+	stp	x29, x30, [sp, 32]
 	add	x29, sp, 32
-	str	x19, [sp,48]
+	str	x19, [sp, 48]
 	adrp	x19, .LANCHOR0
 	add	x19, x19, :lo12:.LANCHOR0
-	ldr	x2, [x19,3392]
-	ldr	x0, [x19,1120]
-	ldrh	w8, [x19,3386]
-	ldrh	w1, [x2,148]
-	ldrh	w2, [x2,146]
-	str	w8, [sp]
-	ldrh	w6, [x19,3382]
-	ldr	w8, [x0,524]
-	str	w8, [sp,8]
-	ldrh	w7, [x19,3384]
-	ldr	w0, [x0,528]
-	str	w0, [sp,16]
-	ldr	w0, [x19,3372]
-	ldrh	w3, [x19,3376]
-	ldrh	w4, [x19,3378]
-	ldrh	w5, [x19,3380]
-	str	w0, [sp,24]
+	ldr	x1, [x19, 3384]
+	ldr	x0, [x19, 1128]
+	ldr	w8, [x19, 3364]
+	ldrh	w7, [x19, 3376]
+	ldrh	w2, [x1, 146]
+	ldrh	w1, [x1, 148]
+	str	w8, [sp, 24]
+	ldrh	w6, [x19, 3374]
+	ldr	w8, [x0, 528]
+	str	w8, [sp, 16]
+	ldrh	w5, [x19, 3372]
+	ldr	w0, [x0, 524]
+	ldrh	w4, [x19, 3370]
+	ldrh	w3, [x19, 3368]
+	str	w0, [sp, 8]
+	ldrh	w0, [x19, 3378]
+	str	w0, [sp]
+	adrp	x0, .LC112
+	add	x0, x0, :lo12:.LC112
+	bl	printk
+	ldr	x0, [x19, 3384]
+	ldrb	w3, [x19, 3380]
+	ldr	w4, [x0, 8]
+	ldr	w5, [x0, 64]
+	ldr	w1, [x0, 20]
+	ldr	w2, [x0, 28]
+	adrp	x0, .LC113
+	add	x0, x0, :lo12:.LC113
+	bl	printk
+	ldr	x0, [x19, 3384]
+	ldr	w1, [x0, 52]
+	ldr	w2, [x0, 60]
+	ldr	w3, [x0, 16]
+	adrp	x0, .LC114
+	add	x0, x0, :lo12:.LC114
+	lsr	w3, w3, 11
+	bl	printk
+	ldr	x0, [x19, 3384]
+	ldrh	w2, [x0, 98]
+	ldrh	w6, [x0, 72]
+	ldrh	w5, [x0, 96]
+	ldrh	w4, [x0, 92]
+	ldrh	w3, [x0, 88]
+	ldrh	w1, [x0, 74]
+	str	w2, [sp, 16]
+	ldrh	w2, [x0, 94]
+	str	w2, [sp, 8]
+	ldrh	w2, [x0, 90]
+	str	w2, [sp]
+	ldp	w7, w2, [x0, 80]
 	adrp	x0, .LC115
 	add	x0, x0, :lo12:.LC115
 	bl	printk
-	ldr	x5, [x19,3392]
+	ldrh	w5, [x19, 3392]
 	adrp	x0, .LC116
-	ldrb	w3, [x19,3389]
+	ldrh	w4, [x19, 3400]
 	add	x0, x0, :lo12:.LC116
-	ldr	w4, [x5,8]
-	ldr	w1, [x5,20]
-	ldr	w2, [x5,28]
-	ldr	w5, [x5,64]
-	bl	printk
-	ldr	x2, [x19,3392]
+	ldrh	w3, [x19, 3402]
+	ldrh	w2, [x19, 3404]
+	ldrh	w1, [x19, 3406]
+	bl	printk
+	ldr	x0, [x19, 1128]
+	ldr	x1, [x19, 3384]
+	ldrh	w4, [x0, 590]
+	ldrh	w6, [x1, 150]
+	ldrh	w3, [x0, 588]
+	ldrh	w2, [x0, 586]
+	ldr	w5, [x1, 156]
+	ldrh	w1, [x0, 584]
 	adrp	x0, .LC117
 	add	x0, x0, :lo12:.LC117
-	ldr	w3, [x2,16]
-	ldr	w1, [x2,52]
-	ldr	w2, [x2,60]
-	lsr	w3, w3, 11
-	bl	printk
-	ldr	x7, [x19,3392]
-	ldrh	w0, [x7,90]
-	ldrh	w6, [x7,72]
-	ldrh	w1, [x7,74]
-	ldrh	w3, [x7,88]
-	ldrh	w4, [x7,92]
-	ldrh	w5, [x7,96]
-	str	w0, [sp]
-	ldrh	w0, [x7,94]
-	str	w0, [sp,8]
-	ldrh	w0, [x7,98]
-	str	w0, [sp,16]
-	adrp	x0, .LC118
-	add	x0, x0, :lo12:.LC118
-	ldr	w2, [x7,84]
-	ldr	w7, [x7,80]
 	bl	printk
-	ldrh	w1, [x19,3402]
-	adrp	x0, .LC119
-	ldrh	w2, [x19,3404]
-	add	x0, x0, :lo12:.LC119
-	ldrh	w3, [x19,3406]
-	ldrh	w4, [x19,3408]
-	ldrh	w5, [x19,3400]
-	bl	printk
-	ldr	x4, [x19,1120]
-	adrp	x0, .LC120
-	ldr	x6, [x19,3392]
-	add	x0, x0, :lo12:.LC120
-	ldrh	w1, [x4,584]
-	ldrh	w2, [x4,586]
-	ldrh	w3, [x4,588]
-	ldr	w5, [x6,156]
-	ldrh	w4, [x4,590]
-	ldrh	w6, [x6,150]
-	bl	printk
-	sub	sp, x29, #32
-	ldr	x19, [sp,48]
-	ldp	x29, x30, [sp,32]
+	ldr	x19, [sp, 48]
+	ldp	x29, x30, [sp, 32]
 	add	sp, sp, 64
 	ret
 	.size	print_ftl_debug_info, .-print_ftl_debug_info
@@ -7963,200 +7743,197 @@ print_ftl_debug_info:
 ftl_write_buf:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	str	x21, [sp,32]
-	mov	x20, x0
-	cbnz	x0, .L1240
+	stp	x19, x20, [sp, 16]
+	str	x21, [sp, 32]
+	cbnz	x0, .L1250
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
-	mov	w2, 810
-	add	x1, x1, 1936
+	add	x1, x1, 1920
+	mov	w2, 811
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
 	bl	print_ftl_debug_info
 	mov	w0, -1
+.L1249:
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	ret
+.L1253:
+	add	x19, x19, :lo12:.LANCHOR0
+	mov	x1, x20
+	add	x0, x19, 3408
+	bl	buf_add_tail
+	ldrb	w3, [x20, 56]
+	ldr	x1, [x19, 3384]
+	ldrb	w0, [x19, 3381]
+	add	w0, w0, 1
+	ldr	w2, [x1, 16]
+	and	w0, w0, 255
+	strb	w0, [x19, 3381]
+	add	w2, w2, w3
+	str	w2, [x1, 16]
+	ldr	w2, [x1, 32]
+	add	w2, w2, 1
+	str	w2, [x1, 32]
 	b	.L1249
-.L1240:
-	adrp	x19, .LANCHOR0
-	ldrb	w1, [x20,56]
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x0,3360]
-	cmp	w1, w0
-	bls	.L1245
+.L1250:
+	mov	x20, x0
+	adrp	x0, .LANCHOR3
+	add	x1, x0, :lo12:.LANCHOR3
+	mov	x21, x0
+	ldrb	w2, [x20, 56]
+	ldrb	w1, [x1, 1946]
+	cmp	w2, w1
+	bls	.L1255
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
-	mov	w2, 817
-	add	x1, x1, 1936
+	add	x1, x1, 1920
+	mov	w2, 818
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L1245:
-	ldrb	w0, [x20,56]
-	cbz	w0, .L1242
-	add	x21, x19, :lo12:.LANCHOR0
-	ldrb	w1, [x21,3360]
-	cmp	w1, w0
-	bcs	.L1243
-.L1242:
-	mov	x0, x20
+.L1255:
+	ldrb	w1, [x20, 56]
+	adrp	x19, .LANCHOR0
+	cbz	w1, .L1252
+	add	x0, x21, :lo12:.LANCHOR3
+	ldrb	w0, [x0, 1946]
+	cmp	w0, w1
+	bcs	.L1253
+.L1252:
 	add	x19, x19, :lo12:.LANCHOR0
+	mov	x0, x20
 	bl	zbuf_free
-	ldrb	w0, [x19,3388]
+	ldrb	w0, [x19, 3381]
 	b	.L1249
-.L1243:
-	add	x0, x21, 3416
-	mov	x1, x20
-	bl	buf_add_tail
-	ldr	x0, [x21,3392]
-	ldrb	w1, [x20,56]
-	ldrb	w2, [x21,3388]
-	ldr	w3, [x0,16]
-	add	w2, w2, 1
-	add	w1, w3, w1
-	str	w1, [x0,16]
-	ldr	w1, [x0,32]
-	uxtb	w2, w2
-	strb	w2, [x21,3388]
-	add	w1, w1, 1
-	str	w1, [x0,32]
-	mov	w0, w2
-.L1249:
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
-	ldp	x29, x30, [sp], 48
-	ret
 	.size	ftl_write_buf, .-ftl_write_buf
 	.align	2
 	.global	ftl_write_completed
 	.type	ftl_write_completed, %function
 ftl_write_completed:
-	stp	x29, x30, [sp, -64]!
+	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x19, .LANCHOR0
-	add	x19, x19, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	add	x21, x19, 1312
-	mov	x20, x19
-	stp	x23, x24, [sp,48]
-	mov	x22, x21
-	mov	w23, 0
-.L1251:
-	ldrb	w2, [x19,3366]
-	cmp	w2, 255
-	beq	.L1266
-	lsl	x0, x2, 6
-	add	x24, x21, x0
-	ldrb	w0, [x21,x0]
-	strb	w0, [x19,3366]
-	ldr	w0, [x24,52]
-	cmn	w0, #1
-	bne	.L1252
-	adrp	x0, .LANCHOR3
-	add	x1, x0, :lo12:.LANCHOR3
-	ldrb	w3, [x1,1956]
-	cbnz	w3, .L1253
-	ldrb	w1, [x1,1330]
-	cbz	w1, .L1254
-.L1253:
-	ldr	x1, [x20,3392]
-	ldr	w3, [x1,156]
-	mov	w1, 20041
-	movk	w1, 0x444b, lsl 16
-	cmp	w3, w1
-	beq	.L1255
-.L1254:
-	add	x0, x0, :lo12:.LANCHOR3
-	ldrb	w4, [x20,1257]
-	mov	w3, 24
-	add	x5, x22, x2, lsl 6
-	sub	w4, w3, w4
-	mov	w3, 1
-	ldrh	w1, [x0,1312]
-	add	x5, x5, 32
-	ldrb	w0, [x0,1314]
-	sub	w4, w4, w1
-	lsl	w4, w3, w4
-	ldr	w3, [x5,8]
-	sub	w4, w4, #1
-	lsr	w1, w3, w1
+	stp	x21, x22, [sp, 32]
+	adrp	x21, .LANCHOR0
+	stp	x19, x20, [sp, 16]
+	add	x19, x21, :lo12:.LANCHOR0
+	stp	x23, x24, [sp, 48]
+	add	x22, x19, 1304
+	mov	w23, 20041
+	str	x25, [sp, 64]
+	movk	w23, 0x444b, lsl 16
+	mov	w25, 0
+.L1261:
+	add	x1, x21, :lo12:.LANCHOR0
+	ldrb	w0, [x1, 3357]
+	cmp	w0, 255
+	bne	.L1272
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldr	x25, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	ret
+.L1272:
+	add	x2, x1, 1304
+	lsl	x3, x0, 6
+	add	x24, x2, x3
+	ubfiz	x20, x0, 6, 8
+	add	x20, x2, x20
+	ldrb	w2, [x2, x3]
+	strb	w2, [x1, 3357]
+	ldr	w1, [x24, 52]
+	cmn	w1, #1
+	bne	.L1262
+	adrp	x2, .LANCHOR3
+	add	x1, x2, :lo12:.LANCHOR3
+	ldrb	w3, [x1, 1950]
+	cbnz	w3, .L1263
+	ldrb	w1, [x1, 1322]
+	cbz	w1, .L1264
+.L1263:
+	ldr	x1, [x19, 3384]
+	ldr	w1, [x1, 156]
+	cmp	w1, w23
+	beq	.L1265
+.L1264:
+	add	x2, x2, :lo12:.LANCHOR3
+	ldrb	w3, [x19, 1205]
+	mov	w1, 24
+	add	x4, x22, x0, lsl 6
+	sub	w1, w1, w3
+	ldrh	w5, [x2, 1304]
+	ldrb	w2, [x2, 1306]
+	sub	w3, w1, w5
+	mov	w1, 1
+	lsl	w1, w1, w3
+	ldr	w3, [x4, 40]
+	sub	w1, w1, #1
+	lsr	w3, w3, w5
+	and	w1, w1, w3
 	mov	w3, 65535
-	and	w1, w4, w1
-	udiv	w1, w1, w0
-	ldr	x0, [x20,1120]
-	ldr	w4, [x0,560]
-	cmp	w4, w3
-	uxth	w23, w1
+	udiv	w1, w1, w2
+	ldr	x2, [x19, 1128]
+	ldr	w5, [x2, 560]
+	and	w24, w1, 65535
 	and	w1, w1, w3
-	bne	.L1256
-	str	w1, [x0,560]
-	ldr	w3, [x5,8]
-	str	w3, [x0,564]
-.L1256:
-	add	x2, x22, x2, lsl 6
-	adrp	x0, .LC121
-	add	x3, x2, 32
-	add	x0, x0, :lo12:.LC121
-	ldr	w2, [x2,36]
-	ldr	w3, [x3,8]
-	bl	printk
-	ldr	x0, [x20,1120]
-	ldr	w1, [x0,556]
+	cmp	w5, w3
+	bne	.L1266
+	str	w1, [x2, 560]
+	ldr	w3, [x4, 40]
+	str	w3, [x2, 564]
+.L1266:
+	add	x0, x22, x0, lsl 6
+	ldp	w2, w3, [x0, 36]
+	adrp	x0, .LC118
+	add	x0, x0, :lo12:.LC118
+	bl	printk
+	ldr	x0, [x19, 1128]
+	ldr	w1, [x0, 556]
 	add	w1, w1, 1
-	str	w1, [x0,556]
-	ldrh	w1, [x0,16]
-	cmp	w1, w23
-	bne	.L1257
-	strh	wzr, [x0,22]
-	b	.L1255
-.L1257:
-	ldrh	w1, [x0,48]
-	cmp	w1, w23
-	bne	.L1255
-	strh	wzr, [x0,54]
-.L1255:
-	mov	x0, x24
-	mov	w23, 1
+	str	w1, [x0, 556]
+	ldrh	w1, [x0, 16]
+	cmp	w1, w24
+	bne	.L1267
+	strh	wzr, [x0, 22]
+.L1265:
+	mov	x0, x20
+	mov	w25, 1
 	bl	ftl_write_buf
-	b	.L1251
-.L1252:
-	cmp	w23, 1
-	add	x2, x24, 32
-	bne	.L1260
-	ldr	w1, [x2,4]
-	adrp	x0, .LC122
-	ldr	w2, [x2,8]
-	add	x0, x0, :lo12:.LC122
+	b	.L1261
+.L1267:
+	ldrh	w1, [x0, 48]
+	cmp	w1, w24
+	bne	.L1265
+	strh	wzr, [x0, 54]
+	b	.L1265
+.L1262:
+	cbz	w25, .L1270
+	ldp	w1, w2, [x24, 36]
+	adrp	x0, .LC119
+	add	x0, x0, :lo12:.LC119
 	bl	printk
-	mov	x0, x24
+	mov	x0, x20
 	bl	ftl_write_buf
-	b	.L1251
-.L1260:
-	ldr	w0, [x2,4]
-	ldr	w1, [x2,12]
-	ldrh	w2, [x24,48]
+	b	.L1261
+.L1270:
+	ldrh	w2, [x24, 48]
+	ldr	w0, [x24, 36]
+	ldr	w1, [x24, 44]
 	bl	lpa_hash_update_ppa
-	ldrb	w0, [x24,2]
-	and	w23, w0, 4
-	uxtb	w23, w23
-	cbz	w23, .L1261
+	ldrb	w0, [x24, 2]
+	tbz	x0, 2, .L1271
 	and	w0, w0, -3
-	mov	w23, 0
-	strb	w0, [x24,2]
-	b	.L1251
-.L1261:
-	mov	x0, x24
+	strb	w0, [x24, 2]
+	b	.L1261
+.L1271:
+	mov	x0, x20
 	bl	zbuf_free
-	b	.L1251
-.L1266:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 64
-	ret
+	b	.L1261
 	.size	ftl_write_completed, .-ftl_write_completed
 	.align	2
 	.global	zftl_add_read_buf
@@ -8164,58 +7941,58 @@ ftl_write_completed:
 zftl_add_read_buf:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	mov	x20, x0
-	cbnz	x0, .L1268
+	stp	x19, x20, [sp, 16]
+	cbnz	x0, .L1278
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
-	mov	w2, 1150
-	add	x1, x1, 1952
+	add	x1, x1, 1936
+	mov	w2, 1151
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
 	bl	print_ftl_debug_info
-	b	.L1267
-.L1268:
-	ldrb	w1, [x0,56]
-	adrp	x0, .LANCHOR0+3360
-	ldrb	w0, [x0,#:lo12:.LANCHOR0+3360]
+.L1277:
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
+	ret
+.L1278:
+	mov	x20, x0
+	adrp	x19, .LANCHOR3
+	add	x0, x19, :lo12:.LANCHOR3
+	ldrb	w1, [x20, 56]
+	ldrb	w0, [x0, 1946]
 	cmp	w1, w0
-	bls	.L1271
+	bls	.L1281
 	adrp	x1, .LANCHOR1
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR1
-	mov	w2, 1157
-	add	x1, x1, 1952
+	add	x1, x1, 1936
+	mov	w2, 1158
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L1271:
-	adrp	x19, .LANCHOR3
-	mov	x1, x20
+.L1281:
 	add	x19, x19, :lo12:.LANCHOR3
-	add	x0, x19, 1962
+	mov	x1, x20
+	add	x0, x19, 1956
 	bl	buf_add_tail
-	ldrb	w0, [x19,1963]
+	ldrb	w0, [x19, 1957]
 	add	w0, w0, 1
-	strb	w0, [x19,1963]
-.L1267:
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 32
-	ret
+	strb	w0, [x19, 1957]
+	b	.L1277
 	.size	zftl_add_read_buf, .-zftl_add_read_buf
 	.align	2
 	.global	sblk_init
 	.type	sblk_init, %function
 sblk_init:
 	adrp	x0, .LANCHOR0
-	mov	w1, -1
 	add	x0, x0, :lo12:.LANCHOR0
-	strb	w1, [x0,3363]
-	strb	w1, [x0,3366]
-	strb	w1, [x0,3364]
-	strb	w1, [x0,3365]
+	mov	w1, -1
+	strb	w1, [x0, 3354]
+	strb	w1, [x0, 3357]
+	strb	w1, [x0, 3355]
+	strb	w1, [x0, 3356]
 	mov	w0, 0
 	ret
 	.size	sblk_init, .-sblk_init
@@ -8224,38 +8001,38 @@ sblk_init:
 	.type	dump_sblk_queue, %function
 dump_sblk_queue:
 	stp	x29, x30, [sp, -48]!
-	adrp	x0, .LC123
+	adrp	x0, .LC120
+	add	x0, x0, :lo12:.LC120
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR0
-	str	x21, [sp,32]
 	add	x20, x20, :lo12:.LANCHOR0
-	add	x0, x0, :lo12:.LC123
-	ldrb	w1, [x20,3363]
+	str	x21, [sp, 32]
+	ldrb	w1, [x20, 3354]
 	bl	printk
-	ldrb	w19, [x20,3363]
+	ldrb	w19, [x20, 3354]
 	cmp	w19, 255
-	beq	.L1273
-	add	x20, x20, 1312
-	sbfiz	x19, x19, 6, 32
-	adrp	x21, .LC124
+	beq	.L1284
+	add	x20, x20, 1304
+	ubfiz	x19, x19, 6, 8
+	adrp	x21, .LC121
 	add	x19, x20, x19
-	add	x21, x21, :lo12:.LC124
-.L1275:
-	ldrb	w1, [x19,1]
+	add	x21, x21, :lo12:.LC121
+.L1286:
+	ldrb	w2, [x19, 58]
 	mov	x0, x21
-	ldrb	w2, [x19,58]
-	ldr	w3, [x19,40]
+	ldrb	w1, [x19, 1]
+	ldr	w3, [x19, 40]
 	bl	printk
 	ldrb	w19, [x19]
 	cmp	w19, 255
-	beq	.L1273
-	sbfiz	x19, x19, 6, 32
+	beq	.L1284
+	ubfiz	x19, x19, 6, 8
 	add	x19, x20, x19
-	b	.L1275
-.L1273:
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
+	b	.L1286
+.L1284:
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	dump_sblk_queue, .-dump_sblk_queue
@@ -8263,87 +8040,88 @@ dump_sblk_queue:
 	.global	queue_lun_state
 	.type	queue_lun_state, %function
 queue_lun_state:
-	adrp	x3, .LANCHOR0
-	mov	w4, w0
-	add	x3, x3, :lo12:.LANCHOR0
-	mov	w0, 0
-	ldrb	w2, [x3,3363]
+	adrp	x5, .LANCHOR0
+	add	x5, x5, :lo12:.LANCHOR0
+	ldrb	w2, [x5, 3354]
 	cmp	w2, 255
-	beq	.L1283
-	ldrb	w5, [x3,1257]
-	mov	w0, 1
-	mov	w8, 24
-	adrp	x13, .L1286
-	sub	w8, w8, w5
-	lsl	w5, w0, w5
-	sub	w5, w5, #1
-	asr	w10, w4, w8
-	add	x3, x3, 1312
-	add	x13, x13, :lo12:.L1286
-	uxth	w7, w5
-	adrp	x5, .LANCHOR3
-	add	x5, x5, :lo12:.LANCHOR3
-	and	w10, w7, w10
-	ldrh	w11, [x5,1312]
-	ldrb	w12, [x5,1314]
-	sub	w6, w8, w11
-	asr	w4, w4, w11
-	lsl	w0, w0, w6
-	sub	w12, w12, #1
-	sub	w0, w0, #1
-	uxth	w12, w12
-	uxth	w9, w0
-	and	w4, w4, w12
-	and	w4, w4, w9
-.L1289:
-	add	x6, x3, x2, lsl 6
-	ldr	w5, [x6,40]
-	lsr	w0, w5, w8
-	and	w0, w7, w0
-	cmp	w0, w10
-	bne	.L1284
-	lsr	w5, w5, w11
-	ldrb	w0, [x6,58]
-	and	w5, w12, w5
-	and	w5, w9, w5
-	cmp	w5, w4
-	bne	.L1285
+	beq	.L1302
+	adrp	x6, .LANCHOR3
+	add	x6, x6, :lo12:.LANCHOR3
+	ldrb	w3, [x5, 1205]
+	mov	w9, 24
+	mov	w4, 1
+	adrp	x12, .L1298
+	ldrh	w11, [x6, 1304]
+	sub	w9, w9, w3
+	ldrb	w8, [x6, 1306]
+	lsl	w3, w4, w3
+	sub	w7, w9, w11
+	sub	w3, w3, #1
+	sub	w8, w8, #1
+	and	w3, w3, 65535
+	lsl	w4, w4, w7
+	and	w8, w8, 65535
+	sub	w4, w4, #1
+	asr	w6, w0, w11
+	and	w4, w4, 65535
+	and	w6, w6, w8
+	asr	w10, w0, w9
+	and	w6, w6, w4
+	and	w10, w10, w3
+	add	x5, x5, 1304
+	add	x12, x12, :lo12:.L1298
+.L1301:
+	add	x13, x5, x2, lsl 6
+	ldr	w7, [x13, 40]
+	lsr	w0, w7, w9
+	and	w0, w3, w0
+	cmp	w10, w0
+	bne	.L1296
+	lsr	w7, w7, w11
+	and	w7, w8, w7
+	and	w7, w4, w7
+	ldrb	w0, [x13, 58]
+	cmp	w6, w7
+	bne	.L1297
 	cmp	w1, 1
-	beq	.L1287
-	b	.L1283
-.L1285:
+	bne	.L1294
+	cmp	w0, 7
+	ccmp	w0, 9, 4, ne
+	beq	.L1296
+	ret
+.L1297:
 	cmp	w1, 3
-	bhi	.L1284
-	ldrb	w5, [x13,w1,uxtw]
-	adr	x6, .Lrtx1286
-	add	x5, x6, w5, sxtb #2
-	br	x5
-.Lrtx1286:
+	bhi	.L1296
+	ldrb	w7, [x12,w1,uxtw]
+	adr	x13, .Lrtx1298
+	add	x7, x13, w7, sxtb #2
+	br	x7
+.Lrtx1298:
 	.section	.rodata
 	.align	0
 	.align	2
-.L1286:
-	.byte	(.L1283 - .Lrtx1286) / 4
-	.byte	(.L1287 - .Lrtx1286) / 4
-	.byte	(.L1288 - .Lrtx1286) / 4
-	.byte	(.L1283 - .Lrtx1286) / 4
+.L1298:
+	.byte	(.L1294 - .Lrtx1298) / 4
+	.byte	(.L1299 - .Lrtx1298) / 4
+	.byte	(.L1300 - .Lrtx1298) / 4
+	.byte	(.L1294 - .Lrtx1298) / 4
 	.text
-.L1287:
-	sub	w6, w0, #7
-	and	w6, w6, -3
-	uxtb	w6, w6
-	cbz	w6, .L1284
-	b	.L1283
-.L1288:
+.L1299:
+	cmp	w0, 7
+	ccmp	w0, 9, 4, ne
+	beq	.L1296
+	ret
+.L1300:
 	cmp	w0, 11
-	bne	.L1283
-.L1284:
+	bne	.L1294
+.L1296:
 	lsl	x2, x2, 6
-	ldrb	w2, [x3,x2]
+	ldrb	w2, [x5, x2]
 	cmp	w2, 255
-	bne	.L1289
+	bne	.L1301
+.L1302:
 	mov	w0, 0
-.L1283:
+.L1294:
 	ret
 	.size	queue_lun_state, .-queue_lun_state
 	.align	2
@@ -8351,85 +8129,83 @@ queue_lun_state:
 	.type	queue_remove_completed_req, %function
 queue_remove_completed_req:
 	adrp	x3, .LANCHOR0
-	mov	w5, 0
 	add	x0, x3, :lo12:.LANCHOR0
+	add	x4, x0, 1304
+	add	x12, x0, 3355
+	add	x13, x0, 3356
+	add	x14, x0, 3357
+	ldrb	w7, [x0, 3354]
+	mov	w5, 0
+	ldrb	w9, [x0, 3355]
 	mov	w11, -1
-	add	x4, x0, 1312
-	add	x12, x0, 3364
-	add	x13, x0, 3365
-	add	x14, x0, 3366
-	ldrb	w7, [x0,3363]
-	ldrb	w9, [x0,3364]
-	ldrb	w8, [x0,3365]
-	ldrb	w10, [x0,3366]
-.L1299:
+	ldrb	w10, [x0, 3357]
+	ldrb	w8, [x0, 3356]
+.L1305:
 	cmp	w7, 255
-	beq	.L1300
+	beq	.L1306
 	sbfiz	x6, x7, 6, 32
 	sxtw	x1, w7
 	add	x2, x4, x6
-	ldrb	w2, [x2,58]
+	ldrb	w2, [x2, 58]
 	sub	w2, w2, #12
-	uxtb	w2, w2
+	and	w2, w2, 255
 	cmp	w2, 1
-	bls	.L1301
-	cbz	w5, .L1298
-	strb	w7, [x0,3363]
-	b	.L1298
-.L1301:
+	bls	.L1307
+	cbz	w5, .L1304
+	strb	w7, [x0, 3354]
+	ret
+.L1307:
 	lsl	x5, x1, 6
-	ldrb	w7, [x4,x6]
+	ldrb	w7, [x4, x6]
 	add	x2, x4, x5
-	strb	w11, [x4,x5]
-	ldrb	w5, [x2,59]
+	strb	w11, [x4, x5]
+	ldrb	w5, [x2, 59]
 	cmp	w5, 1
-	bne	.L1304
-	ldrh	w2, [x2,50]
-	cbnz	w2, .L1312
+	bne	.L1310
+	ldrh	w2, [x2, 50]
+	cbnz	w2, .L1318
 	mov	w2, w10
 	mov	x5, x14
-	b	.L1305
-.L1304:
-	cbz	w5, .L1322
-.L1306:
-	mov	w5, 1
-	b	.L1299
-.L1322:
-	ldr	w2, [x2,36]
-	cmn	w2, #1
-	beq	.L1306
-	mov	w2, w9
-	mov	x5, x12
-	b	.L1305
-.L1312:
-	mov	w2, w8
-	mov	x5, x13
-.L1305:
+.L1311:
 	cmp	w2, 255
-	bne	.L1310
+	bne	.L1316
 	add	x3, x3, :lo12:.LANCHOR0
 	add	x1, x3, x1, lsl 6
-	strb	w7, [x3,3363]
-	ldrb	w0, [x1,1313]
+	strb	w7, [x3, 3354]
+	ldrb	w0, [x1, 1305]
 	strb	w0, [x5]
-	b	.L1298
+	ret
 .L1310:
+	cbnz	w5, .L1312
+	ldr	w2, [x2, 36]
+	cmn	w2, #1
+	beq	.L1312
+	mov	w2, w9
+	mov	x5, x12
+	b	.L1311
+.L1318:
+	mov	w2, w8
+	mov	x5, x13
+	b	.L1311
+.L1316:
 	mov	w5, w2
 	sbfiz	x2, x2, 6, 32
-	ldrb	w2, [x4,x2]
+	ldrb	w2, [x4, x2]
 	cmp	w2, 255
-	bne	.L1310
+	bne	.L1316
 	add	x1, x4, x1, lsl 6
 	sbfiz	x5, x5, 6, 32
-	ldrb	w1, [x1,1]
-	strb	w1, [x4,x5]
-	b	.L1306
-.L1300:
-	cbz	w5, .L1298
+	ldrb	w1, [x1, 1]
+	strb	w1, [x4, x5]
+.L1312:
+	mov	w5, 1
+	b	.L1305
+.L1306:
+	cbz	w5, .L1304
 	add	x3, x3, :lo12:.LANCHOR0
 	mov	w0, -1
-	strb	w0, [x3,3363]
-.L1298:
+	strb	w0, [x3, 3354]
+.L1304:
 	ret
 	.size	queue_remove_completed_req, .-queue_remove_completed_req
 	.align	2
@@ -8437,74 +8213,72 @@ queue_remove_completed_req:
 	.type	pm_select_ram_region, %function
 pm_select_ram_region:
 	stp	x29, x30, [sp, -32]!
-	adrp	x2, .LANCHOR3
-	mov	w3, 65535
+	adrp	x1, .LANCHOR3
+	add	x0, x1, :lo12:.LANCHOR3
+	mov	x2, 0
 	add	x29, sp, 0
-	str	x19, [sp,16]
-	add	x2, x2, :lo12:.LANCHOR3
-	mov	x19, 0
-.L1325:
-	add	x1, x2, 1968
-	lsl	x4, x19, 4
-	uxth	w0, w19
-	ldrh	w4, [x4,x1]
-	cmp	w4, w3
-	beq	.L1324
-	add	x19, x19, 1
-	cmp	x19, 32
-	bne	.L1325
-	mov	x0, 0
-	mov	w3, 32768
-.L1327:
-	add	x2, x1, x0, lsl 4
-	uxth	w4, w0
-	ldrh	w2, [x2,2]
-	tbnz	x2, 15, .L1326
-	cmp	w2, w3
-	bcs	.L1326
-	mov	w3, w2
-	mov	w19, w4
-.L1326:
-	add	x0, x0, 1
-	cmp	x0, 32
-	bne	.L1327
+	add	x3, x0, 1960
+	mov	w4, 65535
+	str	x19, [sp, 16]
+.L1330:
+	lsl	x5, x2, 4
+	and	w19, w2, 65535
+	ldrh	w5, [x5, x3]
+	cmp	w5, w4
+	beq	.L1329
+	add	x2, x2, 1
+	cmp	x2, 32
+	bne	.L1330
+	add	x0, x0, 1962
+	mov	w19, w2
+	mov	x3, x0
+	mov	w5, 32768
+	mov	w2, 0
+.L1332:
+	ldrh	w4, [x3]
+	tbnz	x4, 15, .L1331
+	cmp	w4, w5
+	bcs	.L1331
+	mov	w5, w4
+	mov	w19, w2
+.L1331:
+	add	w2, w2, 1
+	add	x3, x3, 16
+	and	w2, w2, 65535
+	cmp	w2, 32
+	bne	.L1332
 	cmp	w19, 32
-	mov	w0, w19
-	bne	.L1324
-	adrp	x0, .LANCHOR3
+	bne	.L1329
+	add	x1, x1, :lo12:.LANCHOR3
 	mov	w2, -1
-	add	x0, x0, :lo12:.LANCHOR3
+	ldrb	w3, [x1, 2472]
 	mov	w1, 0
-	add	x0, x0, 1968
-	ldrb	w3, [x0,512]
-.L1329:
-	ldrh	w5, [x0,2]
+.L1334:
+	ldrh	w5, [x0]
 	cmp	w5, w2
-	bcs	.L1328
-	ldrh	w4, [x0]
+	bcs	.L1333
+	ldrh	w4, [x0, -2]
 	cmp	w4, w3
 	csel	w2, w2, w5, eq
-	cmp	w4, w3
 	csel	w19, w19, w1, eq
-.L1328:
+.L1333:
 	add	w1, w1, 1
 	add	x0, x0, 16
-	uxth	w1, w1
+	and	w1, w1, 65535
 	cmp	w1, 32
-	bne	.L1329
+	bne	.L1334
 	cmp	w19, 32
-	bne	.L1330
-	adrp	x0, .LC0
+	bne	.L1329
 	adrp	x1, .LANCHOR4
 	add	x1, x1, :lo12:.LANCHOR4
 	mov	w2, 377
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L1330:
+.L1329:
 	mov	w0, w19
-.L1324:
-	ldr	x19, [sp,16]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	pm_select_ram_region, .-pm_select_ram_region
@@ -8525,401 +8299,381 @@ ftl_memset:
 flash_lsb_page_tbl_build:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR0
-	str	x21, [sp,32]
 	add	x1, x19, :lo12:.LANCHOR0
-	mov	w21, 1024
-	ldr	x2, [x1,1144]
-	ldrb	w2, [x2,12]
-	sdiv	w21, w21, w2
-	cbnz	w0, .L1338
+	str	x21, [sp, 32]
+	mov	w20, 1024
+	ldr	x2, [x1, 1144]
+	ldrb	w2, [x2, 12]
+	sdiv	w20, w20, w2
+	cbnz	w0, .L1342
+	add	x1, x1, 4
 	mov	x0, 0
-.L1339:
-	add	x2, x1, 4
-	strh	w0, [x2,x0,lsl 1]
+.L1343:
+	strh	w0, [x1, x0, lsl 1]
 	add	x0, x0, 1
 	cmp	x0, 512
-	bne	.L1339
-.L1345:
-	adrp	x20, .LANCHOR3
-	mov	w1, 255
-	add	x20, x20, :lo12:.LANCHOR3
-	mov	w2, 2048
-	add	x20, x20, 2484
+	bne	.L1343
+.L1349:
+	adrp	x21, .LANCHOR3
+	add	x21, x21, :lo12:.LANCHOR3
+	add	x21, x21, 2476
 	add	x19, x19, :lo12:.LANCHOR0
-	mov	x0, x20
+	mov	w2, 2048
+	mov	w1, 255
+	mov	x0, x21
+	add	x19, x19, 4
 	bl	ftl_memset
 	mov	x0, 0
-	b	.L1340
-.L1338:
-	cmp	w0, 1
-	bne	.L1341
-	mov	x0, 0
-	mov	w4, 3
-	mov	w5, 2
 .L1344:
-	cmp	x0, 3
-	uxth	w3, w0
-	mov	w2, w3
-	bls	.L1342
-	ubfiz	w2, w3, 1, 15
-	and	w3, w3, 1
-	cmp	w3, wzr
-	csel	w3, w4, w5, ne
-	sub	w2, w2, w3
-	uxth	w2, w2
-.L1342:
-	add	x3, x1, 4
-	strh	w2, [x3,x0,lsl 1]
+	ldrh	w1, [x19, x0, lsl 1]
 	add	x0, x0, 1
-	cmp	x0, 512
-	bne	.L1344
-	b	.L1345
-.L1341:
-	cmp	w0, 2
-	bne	.L1346
-	mov	w2, 65535
-	mov	x0, 0
+	cmp	w20, w0, uxth
+	strh	w1, [x21, w1, sxtw 1]
+	bhi	.L1344
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	ret
+.L1342:
+	cmp	w0, 1
+	bne	.L1345
+	add	x1, x1, 4
+	mov	x2, 0
 .L1348:
-	add	x4, x1, 4
-	cmp	x0, 1
-	uxth	w3, w0
-	csel	w3, w2, w3, hi
-	add	w2, w2, 2
-	strh	w3, [x4,x0,lsl 1]
-	add	x0, x0, 1
-	cmp	x0, 512
-	uxth	w2, w2
-	bne	.L1348
-	b	.L1345
+	and	w0, w2, 65535
+	cmp	x2, 3
+	bls	.L1346
+	ubfiz	w3, w0, 1, 15
+	and	w0, w0, 1
+	add	w0, w0, 2
+	sub	w0, w3, w0
+	and	w0, w0, 65535
 .L1346:
-	cmp	w0, 3
-	bne	.L1349
+	strh	w0, [x1, x2, lsl 1]
+	add	x2, x2, 1
+	cmp	x2, 512
+	bne	.L1348
+	b	.L1349
+.L1345:
+	cmp	w0, 2
+	bne	.L1350
+	add	x1, x1, 4
+	mov	w2, 65535
 	mov	x0, 0
-	mov	w4, 5
-	mov	w5, 4
 .L1352:
-	cmp	x0, 5
-	uxth	w3, w0
-	mov	w2, w3
-	bls	.L1350
-	ubfiz	w2, w3, 1, 15
-	and	w3, w3, 1
-	cmp	w3, wzr
-	csel	w3, w4, w5, ne
-	sub	w2, w2, w3
-	uxth	w2, w2
-.L1350:
-	add	x3, x1, 4
-	strh	w2, [x3,x0,lsl 1]
+	cmp	x0, 2
+	and	w3, w0, 65535
+	csel	w3, w3, w2, cc
+	strh	w3, [x1, x0, lsl 1]
+	add	w2, w2, 2
 	add	x0, x0, 1
+	and	w2, w2, 65535
 	cmp	x0, 512
 	bne	.L1352
-	b	.L1345
-.L1349:
-	cmp	w0, 4
+	b	.L1349
+.L1350:
+	cmp	w0, 3
 	bne	.L1353
-	add	x2, x1, 4
-	strh	w0, [x2,8]
+	add	x1, x1, 4
+	mov	x2, 0
+.L1356:
+	and	w0, w2, 65535
+	cmp	x2, 5
+	bls	.L1354
+	ubfiz	w3, w0, 1, 15
+	and	w0, w0, 1
+	add	w0, w0, 4
+	sub	w0, w3, w0
+	and	w0, w0, 65535
+.L1354:
+	strh	w0, [x1, x2, lsl 1]
+	add	x2, x2, 1
+	cmp	x2, 512
+	bne	.L1356
+	b	.L1349
+.L1353:
+	cmp	w0, 4
+	bne	.L1357
+	mov	w3, 1
+	strh	w0, [x1, 12]
 	mov	w0, 5
-	strh	wzr, [x1,4]
-	mov	w1, 1
-	mov	w5, 7
-	strh	w0, [x2,10]
+	strh	w3, [x1, 6]
+	strh	w0, [x1, 14]
+	mov	w3, 2
 	mov	w0, 7
-	strh	w1, [x2,2]
-	mov	w1, 2
-	strh	w0, [x2,12]
+	strh	w3, [x1, 8]
+	strh	w0, [x1, 16]
+	mov	w3, 3
 	mov	w0, 8
-	strh	w1, [x2,4]
-	mov	w4, 6
-	mov	w1, 3
-	strh	w0, [x2,14]
-	strh	w1, [x2,6]
+	strh	wzr, [x1, 4]
+	strh	w0, [x1, 18]
+	add	x1, x1, 20
+	strh	w3, [x1, -10]
 	mov	w0, 8
-.L1355:
+.L1359:
 	and	w3, w0, 1
-	ubfiz	w1, w0, 1, 15
+	ubfiz	w2, w0, 1, 15
+	add	w3, w3, 6
 	add	w0, w0, 1
-	cmp	w3, wzr
-	csel	w3, w5, w4, ne
-	add	x2, x2, 2
-	uxth	w0, w0
-	sub	w1, w1, w3
+	sub	w2, w2, w3
+	strh	w2, [x1], 2
+	and	w0, w0, 65535
 	cmp	w0, 512
-	strh	w1, [x2,14]
-	bne	.L1355
-	b	.L1345
-.L1353:
-	cmp	w0, 5
-	bne	.L1356
-	mov	x0, 0
+	bne	.L1359
+	b	.L1349
 .L1357:
+	cmp	w0, 5
+	bne	.L1360
 	add	x2, x1, 4
-	strh	w0, [x2,x0,lsl 1]
+	mov	x0, 0
+.L1361:
+	strh	w0, [x2, x0, lsl 1]
 	add	x0, x0, 1
 	cmp	x0, 16
-	bne	.L1357
-	mov	x0, 0
-.L1358:
-	add	x1, x2, x0
-	add	w3, w0, 16
-	add	x0, x0, 2
-	cmp	x0, 992
-	strh	w3, [x1,32]
-	bne	.L1358
-	b	.L1345
-.L1356:
-	cmp	w0, 8
-	bne	.L1359
-	mov	x0, 0
-.L1360:
-	add	x2, x1, 4
-	strh	w0, [x0,x2]
-	add	x0, x0, 2
-	cmp	x0, 1024
-	bne	.L1360
-	b	.L1345
-.L1359:
-	cmp	w0, 9
 	bne	.L1361
-	add	x2, x1, 4
-	mov	w0, 1
-	strh	wzr, [x1,4]
-	strh	w0, [x2,2]
-	mov	w0, 2
-	strh	w0, [x2,4]
-	mov	x0, 0
+	add	x1, x1, 36
 .L1362:
-	add	x1, x2, x0
-	add	w3, w0, 3
-	add	x0, x0, 2
-	cmp	x0, 1018
-	strh	w3, [x1,6]
+	strh	w0, [x1], 2
+	add	w0, w0, 2
+	and	w0, w0, 65535
+	cmp	w0, 1008
 	bne	.L1362
-	b	.L1345
-.L1361:
-	cmp	w0, 10
+	b	.L1349
+.L1360:
+	cmp	w0, 8
 	bne	.L1363
+	add	x1, x1, 4
 	mov	x0, 0
 .L1364:
-	add	x2, x1, 4
-	strh	w0, [x2,x0,lsl 1]
-	add	x0, x0, 1
-	cmp	x0, 63
-	bne	.L1364
-	mov	x0, 0
-.L1365:
-	add	x1, x2, x0
-	add	w3, w0, 63
+	strh	w0, [x0, x1]
 	add	x0, x0, 2
-	cmp	x0, 898
-	strh	w3, [x1,126]
-	bne	.L1365
-	b	.L1345
+	cmp	x0, 1024
+	bne	.L1364
+	b	.L1349
 .L1363:
-	cmp	w0, 11
+	cmp	w0, 9
+	bne	.L1365
+	mov	w2, 1
+	strh	wzr, [x1, 4]
+	strh	w2, [x1, 6]
+	mov	w2, 2
+	add	x1, x1, 10
+	strh	w2, [x1, -2]
+	mov	w0, 3
+.L1366:
+	strh	w0, [x1], 2
+	add	w0, w0, 2
+	and	w0, w0, 65535
+	cmp	w0, 1021
 	bne	.L1366
+	b	.L1349
+.L1365:
+	cmp	w0, 10
+	bne	.L1367
+	add	x2, x1, 4
 	mov	x0, 0
-	add	x2, x19, :lo12:.LANCHOR0
+.L1368:
+	strh	w0, [x2, x0, lsl 1]
+	add	x0, x0, 1
+	cmp	x0, 63
+	bne	.L1368
+	add	x1, x1, 130
+.L1369:
+	strh	w0, [x1], 2
+	add	w0, w0, 2
+	and	w0, w0, 65535
+	cmp	w0, 961
+	bne	.L1369
+	b	.L1349
 .L1367:
-	add	x1, x2, 4
-	strh	w0, [x1,x0,lsl 1]
+	cmp	w0, 11
+	bne	.L1370
+	add	x1, x19, :lo12:.LANCHOR0
+	mov	x0, 0
+	add	x2, x1, 4
+.L1371:
+	strh	w0, [x2, x0, lsl 1]
 	add	x0, x0, 1
 	cmp	x0, 8
-	bne	.L1367
-	mov	w5, 7
-	mov	w4, 6
-.L1369:
+	bne	.L1371
+	add	x1, x1, 20
+.L1373:
 	and	w3, w0, 1
 	ubfiz	w2, w0, 1, 15
+	add	w3, w3, 6
 	add	w0, w0, 1
-	cmp	w3, wzr
-	csel	w3, w5, w4, ne
-	add	x1, x1, 2
-	uxth	w0, w0
 	sub	w2, w2, w3
+	strh	w2, [x1], 2
+	and	w0, w0, 65535
 	cmp	w0, 512
-	strh	w2, [x1,14]
-	bne	.L1369
-	b	.L1345
-.L1366:
-	cmp	w0, 13
-	bne	.L1345
-	mov	x0, 0
-	add	x3, x19, :lo12:.LANCHOR0
+	bne	.L1373
+	b	.L1349
 .L1370:
-	add	x1, x3, 4
-	add	w2, w0, w0, lsl 1
-	strh	w2, [x1,x0,lsl 1]
-	add	x0, x0, 1
-	cmp	x0, 512
-	bne	.L1370
-	b	.L1345
-.L1340:
-	cmp	w21, w0, uxth
-	bls	.L1393
-	add	x1, x19, 4
-	ldrh	w1, [x1,x0,lsl 1]
-	add	x0, x0, 1
-	strh	w1, [x20,w1,sxtw 1]
-	b	.L1340
-.L1393:
-	ldp	x19, x20, [sp,16]
-	ldr	x21, [sp,32]
-	ldp	x29, x30, [sp], 48
-	ret
+	cmp	w0, 13
+	bne	.L1349
+	add	x2, x19, :lo12:.LANCHOR0
+	mov	x1, 0
+	add	x2, x2, 4
+	mov	w0, 0
+.L1374:
+	strh	w0, [x1, x2]
+	add	w0, w0, 3
+	and	w0, w0, 65535
+	add	x1, x1, 2
+	cmp	w0, 1536
+	bne	.L1374
+	b	.L1349
 	.size	flash_lsb_page_tbl_build, .-flash_lsb_page_tbl_build
 	.align	2
 	.global	flash_die_info_init
 	.type	flash_die_info_init, %function
 flash_die_info_init:
-	stp	x29, x30, [sp, -112]!
+	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR2
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	ldr	w0, [x19,#:lo12:.LANCHOR2]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	tbz	x0, 12, .L1395
+	stp	x21, x22, [sp, 32]
+	ldr	w0, [x19, #:lo12:.LANCHOR2]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	str	x27, [sp, 80]
+	tbz	x0, 12, .L1397
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC4
 	add	x1, x1, :lo12:.LANCHOR4
-	add	x0, x0, :lo12:.LC4
+	adrp	x0, .LC4
 	add	x1, x1, 24
+	add	x0, x0, :lo12:.LC4
 	bl	printk
-.L1395:
+.L1397:
 	add	x24, x19, :lo12:.LANCHOR2
-	adrp	x21, .LANCHOR0
-	add	x20, x21, :lo12:.LANCHOR0
-	adrp	x22, .LANCHOR5
-	add	x25, x22, :lo12:.LANCHOR5
+	adrp	x22, .LANCHOR0
+	add	x20, x22, :lo12:.LANCHOR0
+	adrp	x21, .LANCHOR5
+	add	x23, x21, :lo12:.LANCHOR5
 	mov	w2, 8
-	ldrh	w0, [x24,34]
-	mov	x23, 0
-	ldrb	w1, [x24,20]
-	mov	w26, 2
-	strh	w0, [x20,2]
+	ldrh	w0, [x24, 34]
+	add	x25, x20, 1208
+	ldrb	w1, [x24, 20]
 	add	x27, x24, 9
-	ldrh	w0, [x24,18]
-	add	x28, x20, 1272
-	strb	wzr, [x20,1153]
+	strh	w0, [x20, 2]
+	mov	w26, 2
+	ldrh	w0, [x24, 18]
+	strb	wzr, [x20, 1153]
 	sdiv	w0, w0, w1
 	mov	w1, 0
-	strh	w0, [x25,180]
-	add	x0, x20, 1248
+	strh	w0, [x23, 172]
+	add	x0, x20, 1196
 	bl	ftl_memset
-	add	x0, x25, 184
-	mov	w1, 0
+	add	x0, x23, 176
+	mov	x23, 0
 	mov	w2, 32
+	mov	w1, 0
 	bl	ftl_memset
-.L1397:
-	add	x0, x20, 1264
-	ldrb	w2, [x24,8]
-	add	x1, x28, x23, lsl 3
-	strb	w26, [x23,x0]
+.L1399:
+	ldrb	w2, [x24, 8]
+	add	x7, x20, 1024
+	strb	w26, [x23, x25]
+	add	x1, x20, 1216
+	add	x1, x1, x23, lsl 3
 	mov	x0, x27
 	bl	flash_mem_cmp8
-	cbnz	w0, .L1396
-	ldrb	w1, [x20,1153]
-	add	x2, x25, 184
-	str	w0, [x2,w1,sxtw 2]
-	add	w0, w1, 1
-	strb	w0, [x20,1153]
-	uxtb	w0, w23
-	add	x1, x20, w1, sxtw
-	strb	w0, [x1,1248]
+	cbnz	w0, .L1398
+	ldrb	w2, [x20, 1153]
+	add	x1, x21, :lo12:.LANCHOR5
+	add	x1, x1, 176
+	add	x7, x7, x2
+	add	w0, w2, 1
+	strb	w0, [x20, 1153]
+	and	w0, w23, 255
+	str	wzr, [x1, x2, lsl 2]
+	strb	w0, [x7, 172]
 	bl	zftl_flash_enter_slc_mode
-.L1396:
+.L1398:
 	add	x23, x23, 1
 	cmp	x23, 4
-	bne	.L1397
+	bne	.L1399
 	add	x0, x19, :lo12:.LANCHOR2
 	add	x1, x0, 8
-	ldrb	w2, [x1,8]
+	ldrb	w2, [x1, 8]
 	cmp	w2, 2
-	beq	.L1398
-.L1402:
+	beq	.L1400
+.L1404:
 	add	x19, x19, :lo12:.LANCHOR2
-	add	x21, x21, :lo12:.LANCHOR0
-	add	x22, x22, :lo12:.LANCHOR5
-	ldp	x23, x24, [sp,48]
-	ldrb	w1, [x19,21]
-	ldrb	w0, [x21,1153]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+	add	x22, x22, :lo12:.LANCHOR0
+	add	x21, x21, :lo12:.LANCHOR5
+	ldr	x27, [sp, 80]
+	ldp	x23, x24, [sp, 48]
+	ldrb	w1, [x19, 21]
+	ldrb	w0, [x22, 1153]
+	ldp	x25, x26, [sp, 64]
 	mul	w0, w0, w1
-	ldrh	w1, [x19,22]
-	ldp	x19, x20, [sp,16]
+	ldrh	w1, [x19, 22]
+	ldp	x19, x20, [sp, 16]
 	mul	w0, w0, w1
-	strh	w0, [x22,216]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 112
+	strh	w0, [x21, 208]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 96
 	ret
-.L1398:
-	add	x23, x21, :lo12:.LANCHOR0
-	ldrh	w20, [x1,14]
-	ldrb	w26, [x0,8]
-	mov	x24, 0
-	and	w20, w20, 65280
-	ldrb	w27, [x1,23]
-	ldrh	w2, [x23,2]
-	add	x25, x0, 9
-	add	x3, x23, 1272
-	add	x4, x22, :lo12:.LANCHOR5
-	mul	w20, w20, w2
-	ldrb	w2, [x1,13]
-	mul	w20, w20, w2
-	lsl	w28, w20, 1
-.L1401:
-	add	x1, x3, x24, lsl 3
-	mov	x0, x25
-	mov	w2, w26
-	str	x4, [x29,96]
-	str	x3, [x29,104]
+.L1400:
+	add	x8, x22, :lo12:.LANCHOR0
+	ldrh	w7, [x1, 14]
+	add	x11, x21, :lo12:.LANCHOR5
+	ldrb	w12, [x0, 8]
+	and	w7, w7, 65280
+	ldrb	w13, [x1, 23]
+	ldrh	w2, [x8, 2]
+	add	x15, x8, 1216
+	add	x10, x0, 9
+	add	x11, x11, 176
+	add	x18, x8, 1024
+	mov	x9, 0
+	mul	w7, w7, w2
+	ldrb	w2, [x1, 13]
+	mul	w7, w7, w2
+	lsl	w14, w7, 1
+.L1403:
+	mov	w2, w12
+	add	x1, x15, x9, lsl 3
+	mov	x0, x10
 	bl	flash_mem_cmp8
-	ldr	x3, [x29,104]
-	ldr	x4, [x29,96]
-	cbnz	w0, .L1399
-	ldrb	w0, [x23,1153]
-	add	x1, x4, 184
-	cmp	w27, wzr
-	csel	w2, w20, w28, eq
-	str	w2, [x1,w0,sxtw 2]
+	cbnz	w0, .L1401
+	ldrb	w0, [x8, 1153]
+	cmp	w13, 0
+	csel	w2, w7, w14, eq
 	add	w1, w0, 1
-	add	x0, x23, w0, sxtw
-	strb	w1, [x23,1153]
-	strb	w24, [x0,1248]
-.L1399:
-	add	x24, x24, 1
-	cmp	x24, 4
-	bne	.L1401
-	b	.L1402
+	strb	w1, [x8, 1153]
+	str	w2, [x11, x0, lsl 2]
+	add	x0, x18, x0
+	strb	w9, [x0, 172]
+.L1401:
+	add	x9, x9, 1
+	cmp	x9, 4
+	bne	.L1403
+	b	.L1404
 	.size	flash_die_info_init, .-flash_die_info_init
 	.align	2
 	.global	lpa_hash_init
 	.type	lpa_hash_init, %function
 lpa_hash_init:
 	stp	x29, x30, [sp, -32]!
-	mov	w1, 255
 	mov	w2, 512
+	mov	w1, 255
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	adrp	x19, .LANCHOR3
 	add	x19, x19, :lo12:.LANCHOR3
-	add	x0, x19, 1424
+	add	x0, x19, 1416
 	bl	ftl_memset
-	ldrh	w0, [x19,1384]
 	mov	w1, 255
-	ldrb	w2, [x19,1329]
-	mul	w2, w0, w2
-	ldr	x0, [x19,1944]
+	ldrb	w0, [x19, 1321]
+	ldrh	w2, [x19, 1376]
+	mul	w2, w2, w0
+	ldr	x0, [x19, 1936]
 	lsl	w2, w2, 2
 	bl	ftl_memset
-	ldr	x19, [sp,16]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	lpa_hash_init, .-lpa_hash_init
@@ -8927,1346 +8681,1248 @@ lpa_hash_init:
 	.global	lpa_rebuild_hash
 	.type	lpa_rebuild_hash, %function
 lpa_rebuild_hash:
-	adrp	x0, .LANCHOR2
 	stp	x29, x30, [sp, -32]!
+	adrp	x0, .LANCHOR2
 	add	x29, sp, 0
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	str	x19, [sp,16]
-	tbz	x0, 12, .L1413
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	stp	x19, x20, [sp, 16]
+	tbz	x0, 12, .L1417
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC125
 	add	x1, x1, :lo12:.LANCHOR4
-	add	x0, x0, :lo12:.LC125
-	add	x1, x1, 48
-	mov	w2, 239
+	adrp	x0, .LC122
 	mov	w3, 0
+	mov	w2, 239
+	add	x1, x1, 48
+	add	x0, x0, :lo12:.LC122
 	bl	printk
-.L1413:
+.L1417:
 	adrp	x19, .LANCHOR3
-	mov	w1, 255
 	add	x19, x19, :lo12:.LANCHOR3
+	add	x20, x19, 1416
 	mov	w2, 512
-	add	x0, x19, 1424
+	mov	w1, 255
+	mov	x0, x20
 	bl	ftl_memset
-	ldrh	w0, [x19,1384]
+	ldrb	w0, [x19, 1321]
 	mov	w1, 255
-	ldrb	w2, [x19,1329]
-	mul	w2, w0, w2
-	ldr	x0, [x19,1944]
+	ldrh	w2, [x19, 1376]
+	mul	w2, w2, w0
+	ldr	x0, [x19, 1936]
 	lsl	w2, w2, 2
 	bl	ftl_memset
-	mov	w0, 0
-.L1414:
-	ldrh	w1, [x19,1384]
-	ldrb	w2, [x19,1329]
-	mul	w1, w1, w2
-	cmp	w0, w1, lsl 1
-	bge	.L1423
-	uxtw	x2, w0
-	ldr	x1, [x19,1936]
-	ldr	w1, [x1,x2,lsl 2]
-	cmn	w1, #1
-	beq	.L1415
-	uxtb	w1, w1
-	add	x3, x19, 1424
-	ldrh	w4, [x3,w1,sxtw 1]
-	strh	w0, [x3,w1,sxtw 1]
-	ldr	x1, [x19,1944]
-	strh	w4, [x1,x2,lsl 1]
-.L1415:
-	add	w0, w0, 1
-	uxth	w0, w0
-	b	.L1414
-.L1423:
-	ldr	x19, [sp,16]
+	mov	w1, 0
+.L1418:
+	ldrh	w0, [x19, 1376]
+	ldrb	w2, [x19, 1321]
+	mul	w0, w0, w2
+	cmp	w1, w0, lsl 1
+	blt	.L1420
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L1420:
+	ldr	x0, [x19, 1928]
+	uxtw	x2, w1
+	ldr	w0, [x0, x2, lsl 2]
+	cmn	w0, #1
+	beq	.L1419
+	and	x0, x0, 255
+	ldrh	w3, [x20, x0, lsl 1]
+	strh	w1, [x20, x0, lsl 1]
+	ldr	x0, [x19, 1936]
+	strh	w3, [x0, x2, lsl 1]
+.L1419:
+	add	w1, w1, 1
+	and	w1, w1, 65535
+	b	.L1418
 	.size	lpa_rebuild_hash, .-lpa_rebuild_hash
 	.align	2
 	.global	zftl_read_flash_info
 	.type	zftl_read_flash_info, %function
 zftl_read_flash_info:
 	stp	x29, x30, [sp, -32]!
-	mov	w1, 0
 	mov	w2, 11
+	mov	w1, 0
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	mov	x19, x0
 	bl	ftl_memset
 	adrp	x1, .LANCHOR2
 	adrp	x0, .LANCHOR0
-	add	x0, x0, :lo12:.LANCHOR0
 	add	x1, x1, :lo12:.LANCHOR2
+	add	x0, x0, :lo12:.LANCHOR0
 	add	x1, x1, 8
-	strb	wzr, [x19,10]
-	mov	w5, 1
-	ldrb	w2, [x1,9]
-	ldrh	w3, [x0,2]
+	strb	wzr, [x19, 10]
+	mov	w4, 1
+	ldrb	w2, [x1, 9]
+	ldrh	w3, [x0, 2]
+	add	x0, x0, 1196
 	mul	w2, w2, w3
-	strh	w2, [x19,4]
-	ldrb	w2, [x0,1244]
-	strb	w2, [x19,7]
-	ldr	w2, [x0,1032]
+	strh	w2, [x19, 4]
+	ldrb	w2, [x0, 53]
+	strb	w2, [x19, 7]
+	ldr	w2, [x0, -164]
 	str	w2, [x19]
-	ldrb	w2, [x1,9]
-	strb	w2, [x19,6]
+	ldrb	w2, [x1, 9]
+	strb	w2, [x19, 6]
+	ldrb	w3, [x0, -43]
 	mov	w2, 32
-	ldrb	w4, [x0,1153]
-	ldrb	w1, [x1,7]
-	strb	w1, [x19,9]
-	mov	x1, 0
-	strb	w2, [x19,8]
-.L1425:
-	cmp	w4, w1, uxtb
-	bls	.L1427
-	add	x2, x0, 1248
-	ldrb	w3, [x19,10]
-	ldrb	w2, [x1,x2]
-	add	x1, x1, 1
-	lsl	w2, w5, w2
-	orr	w2, w2, w3
-	strb	w2, [x19,10]
-	b	.L1425
-.L1427:
-	ldr	x19, [sp,16]
+	ldrb	w1, [x1, 7]
+	strb	w2, [x19, 8]
+	mov	x2, 0
+	strb	w1, [x19, 9]
+.L1429:
+	cmp	w3, w2, uxtb
+	bhi	.L1430
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L1430:
+	ldrb	w1, [x2, x0]
+	add	x2, x2, 1
+	ldrb	w5, [x19, 10]
+	lsl	w1, w4, w1
+	orr	w1, w1, w5
+	strb	w1, [x19, 10]
+	b	.L1429
 	.size	zftl_read_flash_info, .-zftl_read_flash_info
 	.align	2
-	.global	gc_init
-	.type	gc_init, %function
-gc_init:
-	stp	x29, x30, [sp, -48]!
-	mov	w1, 0
-	mov	w2, 2216
-	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR0
-	adrp	x19, .LANCHOR3
-	add	x20, x20, :lo12:.LANCHOR0
-	add	x19, x19, :lo12:.LANCHOR3
-	stp	x21, x22, [sp,32]
-	adrp	x21, .LANCHOR5
-	add	x22, x20, 3424
-	add	x21, x21, :lo12:.LANCHOR5
-	mov	x0, x22
-	strb	wzr, [x19,1345]
-	strh	wzr, [x19,1386]
-	strb	wzr, [x21,218]
-	str	wzr, [x21,220]
-	bl	ftl_memset
-	ldrh	w1, [x19,1384]
-	mov	w0, -1
-	ldrb	w3, [x19,1329]
-	strh	w0, [x20,3424]
-	lsr	w0, w1, 2
-	lsr	w2, w1, 1
-	strh	w0, [x20,3460]
-	strh	w0, [x20,3406]
-	ldrh	w0, [x19,1346]
-	strh	w2, [x20,3462]
-	mul	w2, w1, w3
-	mul	w0, w0, w3
-	strh	w1, [x20,3408]
-	mov	w1, 4
-	uxth	w2, w2
-	lsl	w0, w0, 2
-	sub	w4, w2, #32
-	strh	w2, [x20,3402]
-	strh	w4, [x20,3404]
-	strh	w1, [x21,224]
-	strh	wzr, [x19,1360]
-	strh	wzr, [x19,1362]
-	strh	wzr, [x19,1364]
-	str	xzr, [x20,3432]
-	bl	ftl_malloc
-	ldrb	w1, [x19,1329]
-	str	x0, [x21,232]
-	ldrh	w0, [x19,1346]
-	mul	w0, w0, w1
-	lsl	w0, w0, 2
-	bl	ftl_malloc
-	str	x0, [x21,240]
-	ldrh	w1, [x19,1346]
-	ldrb	w0, [x19,1329]
-	mul	w0, w1, w0
-	bl	ftl_malloc
-	str	x0, [x19,1336]
-	ldrb	w1, [x19,1329]
-	ldrh	w0, [x19,1346]
-	mul	w0, w0, w1
-	lsl	w0, w0, 2
-	bl	ftl_malloc
-	str	x0, [x19,1320]
-	ldrb	w1, [x19,1329]
-	ldrh	w0, [x19,1346]
-	mul	w0, w0, w1
-	lsl	w0, w0, 2
-	bl	ftl_malloc
-	str	x0, [x21,248]
-	ldrh	w0, [x19,1388]
-	ldp	x21, x22, [sp,32]
-	lsr	w0, w0, 2
-	strh	w0, [x20,3400]
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 48
-	ret
-	.size	gc_init, .-gc_init
-	.align	2
 	.global	gc_static_wearleveling
 	.type	gc_static_wearleveling, %function
 gc_static_wearleveling:
 	stp	x29, x30, [sp, -144]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR0
 	add	x0, x19, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	ldr	x0, [x0,3392]
-	ldr	w1, [x0,32]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldr	x0, [x0, 3384]
+	ldr	w1, [x0, 32]
 	mov	w0, 10240
 	cmp	w1, w0
-	bls	.L1430
+	bls	.L1433
 	bl	ftl_tmp_into_update
-.L1430:
-	add	x4, x19, :lo12:.LANCHOR0
-	ldr	x1, [x4,1120]
-	ldr	w2, [x1,568]
-	ldr	w3, [x1,12]
-	add	w0, w2, 32768
-	add	w0, w0, 3232
-	cmp	w3, w0
-	bcs	.L1431
-	ldr	x0, [x4,3392]
-	ldr	w4, [x1,572]
-	ldr	w5, [x0,36]
-	add	w4, w4, 256
-	mov	w0, 0
-	cmp	w5, w4
-	bcc	.L1524
-.L1431:
-	add	w2, w2, 860160
-	add	w2, w2, 3840
-	cmp	w3, w2
-	bhi	.L1433
-	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x2, [x0,3392]
-	ldr	w0, [x1,572]
-	ldr	w2, [x2,36]
-	add	w0, w0, 32
-	cmp	w2, w0
-	bls	.L1485
 .L1433:
-	add	x0, x19, :lo12:.LANCHOR0
-	mov	w22, 0
+	add	x3, x19, :lo12:.LANCHOR0
+	mov	w4, 36000
+	ldr	x0, [x3, 1128]
+	ldr	w1, [x0, 568]
+	ldr	w2, [x0, 12]
+	add	w4, w1, w4
+	cmp	w2, w4
+	bcs	.L1434
+	ldr	x4, [x3, 3384]
+	ldr	w3, [x0, 572]
+	add	w3, w3, 256
+	ldr	w4, [x4, 36]
+	cmp	w4, w3
+	bcc	.L1486
+.L1434:
+	add	w1, w1, 860160
+	add	w1, w1, 3840
+	cmp	w2, w1
+	bhi	.L1436
+	add	x1, x19, :lo12:.LANCHOR0
+	ldr	x3, [x1, 3384]
+	ldr	w1, [x0, 572]
+	add	w1, w1, 32
+	ldr	w3, [x3, 36]
+	cmp	w3, w1
+	bls	.L1487
+.L1436:
+	add	x24, x19, :lo12:.LANCHOR0
 	mov	w20, 65535
-	adrp	x25, .LC126
-	str	w22, [x29,128]
-	mov	w27, w22
-	ldr	x0, [x0,3392]
-	mov	w26, w22
-	str	w22, [x29,136]
-	mov	w24, w22
-	str	w22, [x29,140]
-	mov	w28, w22
-	ldr	w2, [x0,36]
+	adrp	x8, .LC123
 	mov	w21, w20
-	str	w2, [x1,572]
-	mov	w8, w20
-	str	w3, [x1,568]
-	adrp	x9, .LANCHOR2
-	add	x25, x25, :lo12:.LC126
-	ldrh	w23, [x0,134]
-.L1435:
-	add	x4, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x4,1088]
-	cmp	w0, w23
-	bls	.L1546
-	uxtw	x7, w23
-	ldr	x0, [x4,1096]
-	lsl	x1, x7, 2
-	add	x6, x0, x1
-	ldrb	w2, [x6,2]
-	and	w3, w2, 224
-	cmp	w3, 224
-	beq	.L1436
-	tbz	x2, 3, .L1437
-	ldrh	w3, [x0,x1]
-	ldr	w2, [x0,x1]
-	and	w3, w3, 2047
-	ubfx	x2, x2, 11, 8
-	b	.L1438
-.L1437:
-	tst	w2, 24
-	bne	.L1439
-	ldrh	w3, [x0,x1]
-	mov	w2, 65535
-	and	w3, w3, 2047
-	b	.L1438
-.L1439:
-	ldr	w2, [x0,x1]
-	mov	w3, 65535
-	ubfx	x2, x2, 11, 8
-	b	.L1440
-.L1438:
-	ldr	w4, [x29,136]
-	add	w26, w26, 1
-	cmp	w20, w3
-	add	w4, w4, w3
-	str	w4, [x29,136]
-	uxth	w26, w26
-	bls	.L1483
-	add	x4, x19, :lo12:.LANCHOR0
-	mov	w20, w3
-	ldr	x4, [x4,1120]
-	strh	w23, [x4,586]
-.L1483:
-	cmp	w24, w3
-	bcs	.L1441
-	mov	w22, w23
-	mov	w24, w3
-.L1441:
-	cmp	w2, w8
-	beq	.L1442
-.L1440:
-	ldr	w4, [x29,140]
-	add	w27, w27, 1
-	cmp	w21, w2
-	add	w4, w4, w2
-	str	w4, [x29,140]
-	uxth	w27, w27
-	bls	.L1443
-	add	x4, x19, :lo12:.LANCHOR0
-	mov	w21, w2
-	ldr	x4, [x4,1120]
-	strh	w23, [x4,584]
-.L1443:
-	cmp	w28, w2
-	bcs	.L1442
-	str	w23, [x29,128]
-	mov	w28, w2
-.L1442:
-	cmp	w3, 9
-	bls	.L1487
-	cmp	w2, 9
-	bhi	.L1436
-.L1487:
-	ldr	w2, [x9,#:lo12:.LANCHOR2]
-	tbz	x2, 8, .L1436
-	ldrh	w2, [x0,x1]
-	ldr	w3, [x0,x1]
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w5, [x6,2]
-	mov	w1, w23
-	ldrb	w6, [x6,3]
-	and	w2, w2, 2047
-	ldr	x10, [x0,1112]
-	ubfx	x4, x5, 3, 2
-	mov	x0, x25
-	ubfx	x3, x3, 11, 8
-	ubfx	x5, x5, 5, 3
-	str	x9, [x29,112]
-	ldrh	w7, [x10,x7,lsl 1]
-	str	x8, [x29,120]
-	bl	printk
-	ldr	x9, [x29,112]
-	ldr	x8, [x29,120]
-.L1436:
-	add	w23, w23, 1
-	uxth	w23, w23
-	b	.L1435
-.L1546:
-	ldr	x0, [x4,1120]
-	mov	w1, 255
+	mov	w9, w20
+	add	x8, x8, :lo12:.LC123
+	ldr	x1, [x24, 3384]
+	mov	w28, 0
+	mov	w27, 0
+	mov	w26, 0
+	mov	w25, 0
+	mov	w23, 0
+	adrp	x10, .LANCHOR2
+	stp	wzr, wzr, [x29, 128]
+	ldr	w3, [x1, 36]
+	str	w3, [x0, 572]
+	str	w2, [x0, 568]
+	str	wzr, [x29, 136]
+	ldrh	w22, [x1, 134]
+.L1438:
+	ldrh	w0, [x24, 1096]
+	cmp	w0, w22
+	bhi	.L1447
+	ldr	x0, [x24, 1128]
 	mov	w2, 128
-	str	x4, [x29,120]
+	mov	w1, 255
+	adrp	x22, .LANCHOR2
 	add	x0, x0, 264
-	adrp	x23, .LANCHOR2
-	strh	wzr, [x0,-142]
+	strh	wzr, [x0, -142]
 	bl	ftl_memset
-	ldr	x4, [x29,120]
-	ldr	x0, [x4,1120]
-	ldr	x10, [x4,1096]
-	ldrh	w7, [x0,586]
-	ldr	w0, [x23,#:lo12:.LANCHOR2]
-	lsl	x9, x7, 2
-	mov	x1, x7
+	ldr	x0, [x24, 1128]
+	ldr	w2, [x22, #:lo12:.LANCHOR2]
+	ldr	x10, [x24, 1104]
+	ldrh	w0, [x0, 586]
+	mov	x1, x0
+	lsl	x9, x0, 2
 	add	x8, x10, x9
-	tbz	x0, 10, .L1446
-	ldr	x11, [x4,1112]
-	adrp	x0, .LC127
-	ldrh	w2, [x10,x9]
-	add	x0, x0, :lo12:.LC127
-	ldr	w3, [x10,x9]
-	ldrb	w5, [x8,2]
-	and	w2, w2, 2047
-	ldrb	w6, [x8,3]
+	tbz	x2, 10, .L1448
+	ldr	x5, [x24, 1120]
+	ldrb	w6, [x8, 3]
+	ldrb	w4, [x8, 2]
+	ldr	w3, [x10, x9]
+	ldrh	w7, [x5, x0, lsl 1]
+	adrp	x0, .LC124
+	ldrh	w2, [x10, x9]
+	ubfx	x5, x4, 5, 3
+	stp	x9, x10, [x29, 104]
 	ubfx	x3, x3, 11, 8
-	ldrh	w7, [x11,x7,lsl 1]
-	ubfx	x4, x5, 3, 2
-	ubfx	x5, x5, 5, 3
-	str	x9, [x29,104]
-	str	x10, [x29,112]
-	str	x8, [x29,120]
-	bl	printk
-	ldr	x9, [x29,104]
-	ldr	x10, [x29,112]
-	ldr	x8, [x29,120]
-.L1446:
-	ldrb	w0, [x8,2]
-	adrp	x25, .LANCHOR5
+	str	x8, [x29, 120]
+	and	w2, w2, 2047
+	ubfx	x4, x4, 3, 2
+	add	x0, x0, :lo12:.LC124
+	bl	printk
+	ldp	x9, x10, [x29, 104]
+	ldr	x8, [x29, 120]
+.L1448:
+	ldrb	w0, [x8, 2]
+	adrp	x24, .LANCHOR5
 	and	w0, w0, 224
 	cmp	w0, 32
-	bne	.L1447
+	bne	.L1449
 	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x0, [x0,3392]
-	ldrh	w0, [x0,688]
+	ldr	x0, [x0, 3384]
+	ldrh	w0, [x0, 688]
 	cmp	w0, 2
-	bls	.L1447
-	add	x0, x25, :lo12:.LANCHOR5
+	bls	.L1449
+	add	x0, x24, :lo12:.LANCHOR5
 	mov	w1, 1
-	str	w1, [x0,256]
-.L1447:
-	ldrb	w0, [x8,2]
-	tbz	x0, 3, .L1448
+	str	w1, [x0, 212]
+.L1449:
+	ldrb	w0, [x8, 2]
+	tbz	x0, 3, .L1450
 	add	x3, x19, :lo12:.LANCHOR0
-	add	x1, x25, :lo12:.LANCHOR5
-	ldr	x0, [x3,3392]
-	ldrh	w1, [x1,260]
-	ldrh	w2, [x0,96]
-	ldrh	w0, [x10,x9]
-	and	w0, w0, 2047
-	add	w0, w0, w1, lsr 2
+	ldrh	w1, [x10, x9]
+	and	w1, w1, 2047
+	ldr	x0, [x3, 3384]
+	ldrh	w2, [x0, 96]
+	add	x0, x24, :lo12:.LANCHOR5
+	ldrh	w0, [x0, 216]
+	add	w0, w1, w0, lsr 2
 	cmp	w2, w0
-	ble	.L1448
-	ldrb	w0, [x8,2]
+	ble	.L1450
+	ldrb	w0, [x8, 2]
 	and	w1, w0, 192
 	cmp	w1, 64
-	bne	.L1449
-	ldr	x0, [x3,1120]
-	mov	w1, 0
+	bne	.L1451
+	ldr	x0, [x3, 1128]
 	mov	w2, 1
-	str	x3, [x29,120]
-	ldrh	w0, [x0,586]
+	str	x3, [x29, 120]
+	mov	w1, 0
+	ldrh	w0, [x0, 586]
 	bl	gc_add_sblk
-	ldr	x3, [x29,120]
+	ldr	x3, [x29, 120]
 	mov	w0, 1
-	strh	w0, [x3,5616]
-	b	.L1448
-.L1449:
-	tst	w0, 224
-	bne	.L1448
-	ldr	x1, [x3,1120]
-	mov	w0, 65535
-	ldrh	w2, [x1,590]
-	cmp	w2, w0
-	bne	.L1448
-	ldrh	w0, [x1,586]
-	ldrh	w1, [x1,588]
-	str	x3, [x29,120]
-	cmp	w1, w0
-	beq	.L1448
-	bl	zftl_remove_free_node
-	ldr	x3, [x29,120]
-	ldr	x0, [x3,1120]
-	ldrh	w1, [x0,586]
-	strh	w1, [x0,590]
-	mov	w1, -1
-	strh	w1, [x0,586]
-.L1448:
+	strh	w0, [x3, 5608]
+.L1450:
 	add	x0, x19, :lo12:.LANCHOR0
-	ldr	w2, [x23,#:lo12:.LANCHOR2]
-	ldr	x1, [x0,1120]
-	ldr	x10, [x0,1096]
-	ldrh	w7, [x1,584]
-	lsl	x9, x7, 2
-	mov	x1, x7
+	ldr	w2, [x22, #:lo12:.LANCHOR2]
+	ldr	x1, [x0, 1128]
+	ldr	x10, [x0, 1104]
+	ldrh	w5, [x1, 584]
+	mov	x1, x5
+	lsl	x9, x5, 2
 	add	x8, x10, x9
-	tbz	x2, 10, .L1450
-	ldr	x11, [x0,1112]
-	adrp	x0, .LC128
-	ldrh	w2, [x10,x9]
-	add	x0, x0, :lo12:.LC128
-	ldr	w3, [x10,x9]
-	ldrb	w5, [x8,2]
-	and	w2, w2, 2047
-	ldrb	w6, [x8,3]
+	tbz	x2, 10, .L1452
+	ldr	x0, [x0, 1120]
+	ldrb	w6, [x8, 3]
+	ldrb	w4, [x8, 2]
+	ldr	w3, [x10, x9]
+	ldrh	w7, [x0, x5, lsl 1]
+	adrp	x0, .LC125
+	ldrh	w2, [x10, x9]
+	ubfx	x5, x4, 5, 3
+	stp	x9, x10, [x29, 104]
 	ubfx	x3, x3, 11, 8
-	ldrh	w7, [x11,x7,lsl 1]
-	ubfx	x4, x5, 3, 2
-	ubfx	x5, x5, 5, 3
-	str	x9, [x29,104]
-	str	x10, [x29,112]
-	str	x8, [x29,120]
-	bl	printk
-	ldr	x9, [x29,104]
-	ldr	x10, [x29,112]
-	ldr	x8, [x29,120]
-.L1450:
-	ldrb	w0, [x8,2]
-	tbz	x0, 3, .L1451
+	str	x8, [x29, 120]
+	and	w2, w2, 2047
+	ubfx	x4, x4, 3, 2
+	add	x0, x0, :lo12:.LC125
+	bl	printk
+	ldp	x9, x10, [x29, 104]
+	ldr	x8, [x29, 120]
+.L1452:
+	ldrb	w0, [x8, 2]
+	tbz	x0, 3, .L1453
 	add	x3, x19, :lo12:.LANCHOR0
-	add	x1, x25, :lo12:.LANCHOR5
-	ldr	x0, [x3,3392]
-	ldrh	w1, [x1,262]
-	ldrh	w2, [x0,98]
-	ldr	w0, [x10,x9]
-	ubfx	x0, x0, 11, 8
-	add	w0, w0, w1, lsr 2
+	ldr	w1, [x10, x9]
+	ldr	x0, [x3, 3384]
+	ubfx	x1, x1, 11, 8
+	ldrh	w2, [x0, 98]
+	add	x0, x24, :lo12:.LANCHOR5
+	ldrh	w0, [x0, 218]
+	add	w0, w1, w0, lsr 2
 	cmp	w2, w0
-	ble	.L1451
-	ldrb	w0, [x8,2]
+	ble	.L1453
+	ldrb	w0, [x8, 2]
 	and	w1, w0, 192
 	cmp	w1, 64
-	bne	.L1452
-	ldr	x0, [x3,1120]
-	mov	w1, 0
+	bne	.L1454
+	ldr	x0, [x3, 1128]
 	mov	w2, 1
-	str	x3, [x29,120]
-	ldrh	w0, [x0,584]
+	str	x3, [x29, 120]
+	mov	w1, 0
+	ldrh	w0, [x0, 584]
 	bl	gc_add_sblk
-	ldr	x3, [x29,120]
+	ldr	x3, [x29, 120]
 	mov	w0, 1
-	strh	w0, [x3,5616]
-	b	.L1451
-.L1452:
-	and	w0, w0, 248
-	cmp	w0, 16
-	bne	.L1451
-	ldr	x1, [x3,1120]
-	mov	w0, 65535
-	ldrh	w2, [x1,588]
-	cmp	w2, w0
-	bne	.L1451
-	ldrh	w0, [x1,584]
-	ldrh	w1, [x1,590]
-	str	x3, [x29,120]
-	cmp	w1, w0
-	beq	.L1451
-	bl	zftl_remove_free_node
-	ldr	x3, [x29,120]
-	ldr	x0, [x3,1120]
-	ldrh	w1, [x0,584]
-	strh	w1, [x0,588]
-	mov	w1, -1
-	strh	w1, [x0,584]
-.L1451:
-	add	x4, x19, :lo12:.LANCHOR0
-	ldr	w0, [x23,#:lo12:.LANCHOR2]
-	ldr	x1, [x4,1096]
-	tbz	x0, 10, .L1453
-	uxtw	x7, w22
-	ldr	x8, [x4,1112]
-	lsl	x0, x7, 2
-	add	x6, x1, x0
-	ldrh	w7, [x8,x7,lsl 1]
-	ldrh	w2, [x1,x0]
-	ldr	w3, [x1,x0]
-	adrp	x0, .LC129
-	ldrb	w5, [x6,2]
-	add	x0, x0, :lo12:.LC129
-	ldrb	w6, [x6,3]
-	mov	w1, w22
-	ubfx	x4, x5, 3, 2
-	and	w2, w2, 2047
-	ubfx	x3, x3, 11, 8
-	ubfx	x5, x5, 5, 3
-	bl	printk
+	strh	w0, [x3, 5608]
 .L1453:
-	add	x4, x19, :lo12:.LANCHOR0
-	ldr	w0, [x23,#:lo12:.LANCHOR2]
-	ldr	x1, [x4,1096]
-	tbz	x0, 10, .L1454
-	ldr	w7, [x29,128]
-	ldr	x8, [x4,1112]
-	lsl	x0, x7, 2
-	add	x6, x1, x0
-	ldrh	w2, [x1,x0]
-	ldr	w3, [x1,x0]
-	adrp	x0, .LC130
-	ldrb	w5, [x6,2]
-	mov	x1, x7
-	ldrb	w6, [x6,3]
-	add	x0, x0, :lo12:.LC130
-	ldrh	w7, [x8,x7,lsl 1]
-	ubfx	x4, x5, 3, 2
+	ldr	w0, [x22, #:lo12:.LANCHOR2]
+	tbz	x0, 10, .L1455
+	add	x0, x19, :lo12:.LANCHOR0
+	uxtw	x6, w28
+	lsl	x1, x6, 2
+	ldr	x2, [x0, 1104]
+	ldr	x0, [x0, 1120]
+	add	x5, x2, x1
+	ldr	w3, [x2, x1]
+	ldrh	w7, [x0, x6, lsl 1]
+	adrp	x0, .LC126
+	ldrb	w6, [x5, 3]
+	add	x0, x0, :lo12:.LC126
+	ldrb	w4, [x5, 2]
+	ubfx	x3, x3, 11, 8
+	ldrh	w2, [x2, x1]
+	mov	w1, w28
+	ubfx	x5, x4, 5, 3
 	and	w2, w2, 2047
+	ubfx	x4, x4, 3, 2
+	bl	printk
+.L1455:
+	ldr	w0, [x22, #:lo12:.LANCHOR2]
+	tbz	x0, 10, .L1456
+	add	x0, x19, :lo12:.LANCHOR0
+	ldr	w6, [x29, 128]
+	ldr	x2, [x0, 1104]
+	lsl	x1, x6, 2
+	ldr	x0, [x0, 1120]
+	add	x5, x2, x1
+	ldr	w3, [x2, x1]
+	ldrh	w7, [x0, x6, lsl 1]
+	adrp	x0, .LC127
+	ldrh	w2, [x2, x1]
+	add	x0, x0, :lo12:.LC127
+	ldrb	w6, [x5, 3]
 	ubfx	x3, x3, 11, 8
-	ubfx	x5, x5, 5, 3
+	ldr	w1, [x29, 128]
+	and	w2, w2, 2047
+	ldrb	w4, [x5, 2]
+	ubfx	x5, x4, 5, 3
+	ubfx	x4, x4, 3, 2
 	bl	printk
-.L1454:
-	ldr	w1, [x29,136]
+.L1456:
+	ldr	w1, [x29, 132]
 	add	x0, x19, :lo12:.LANCHOR0
+	ldr	x0, [x0, 3384]
 	udiv	w3, w1, w26
-	ldr	w1, [x29,140]
-	ldr	x0, [x0,3392]
-	strh	w24, [x0,96]
-	strh	w28, [x0,98]
-	strh	w20, [x0,92]
-	strh	w21, [x0,94]
+	ldr	w1, [x29, 136]
+	strh	w25, [x0, 96]
 	udiv	w4, w1, w27
-	strh	w3, [x0,88]
-	strh	w4, [x0,90]
-	ldr	w0, [x23,#:lo12:.LANCHOR2]
-	tbz	x0, 10, .L1455
-	adrp	x0, .LC131
-	mov	w1, w26
-	add	x0, x0, :lo12:.LC131
+	strh	w23, [x0, 98]
+	strh	w20, [x0, 92]
+	strh	w21, [x0, 94]
+	strh	w3, [x0, 88]
+	strh	w4, [x0, 90]
+	ldr	w0, [x22, #:lo12:.LANCHOR2]
+	tbz	x0, 10, .L1457
+	adrp	x0, .LC128
+	and	w4, w4, 65535
+	and	w3, w3, 65535
 	mov	w2, w27
-	uxth	w3, w3
-	uxth	w4, w4
+	mov	w1, w26
+	add	x0, x0, :lo12:.LC128
 	bl	printk
-.L1455:
-	ldr	w0, [x23,#:lo12:.LANCHOR2]
-	tbz	x0, 10, .L1456
-	add	x6, x25, :lo12:.LANCHOR5
-	adrp	x0, .LC132
-	add	x0, x0, :lo12:.LC132
-	mov	w1, w20
+.L1457:
+	ldr	w0, [x22, #:lo12:.LANCHOR2]
+	tbz	x0, 10, .L1458
+	add	x0, x24, :lo12:.LANCHOR5
+	mov	w4, w23
+	mov	w3, w25
 	mov	w2, w21
-	mov	w3, w24
-	ldrh	w5, [x6,260]
-	mov	w4, w28
-	ldrh	w6, [x6,262]
+	mov	w1, w20
+	ldrh	w6, [x0, 218]
+	ldrh	w5, [x0, 216]
+	adrp	x0, .LC129
+	add	x0, x0, :lo12:.LC129
 	bl	printk
-.L1456:
-	add	x1, x25, :lo12:.LANCHOR5
-	sub	w0, w28, w21
-	str	w0, [x29,140]
-	ldrh	w0, [x1,262]
-	ldr	w2, [x29,140]
+.L1458:
+	add	x1, x24, :lo12:.LANCHOR5
+	sub	w0, w23, w21
+	str	w0, [x29, 128]
+	ldrh	w0, [x1, 218]
+	ldr	w2, [x29, 128]
 	cmp	w2, w0
-	bgt	.L1457
-	ldrh	w1, [x1,260]
-	sub	w0, w24, w20
+	bgt	.L1459
+	ldrh	w1, [x1, 216]
+	sub	w0, w25, w20
 	cmp	w0, w1
-	ble	.L1486
-.L1457:
-	add	x0, x19, :lo12:.LANCHOR0
-	mov	w26, 0
-	mov	w22, w26
-	ldr	x1, [x0,1120]
-	ldr	x0, [x0,3392]
-	ldrh	w28, [x1,580]
-	ldrh	w27, [x0,134]
-	sub	w0, w24, w20
-	str	w0, [x29,136]
-	adrp	x0, .LC134
-	add	x0, x0, :lo12:.LC134
-	adrp	x24, .LC133
-	str	x0, [x29,128]
-	add	x0, x24, :lo12:.LC133
-	str	x0, [x29,120]
+	ble	.L1488
 .L1459:
-	add	x1, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x1,1088]
-	cmp	w27, w0
-	bcs	.L1468
-	add	w7, w28, 1
-	ldr	x4, [x1,1096]
-	uxth	w28, w7
-	cmp	w28, w0
-	csel	w28, w28, wzr, cc
-	uxtw	x24, w28
-	lsl	x3, x24, 2
-	add	x0, x4, x3
-	ldrb	w0, [x0,2]
-	and	w2, w0, 224
-	cmp	w2, 224
-	beq	.L1461
-	tst	w0, 192
-	beq	.L1461
-	ubfx	x0, x0, 3, 2
-	cmp	w2, 160
-	and	w1, w0, 1
-	tbnz	x0, 0, .L1544
-	cmp	w0, 2
-.L1544:
-	add	x0, x25, :lo12:.LANCHOR5
-	bne	.L1464
-	ldrh	w0, [x0,262]
-	ldr	w2, [x29,140]
-	cmp	w2, w0
-	ble	.L1465
-	ldr	w0, [x4,x3]
-	ubfx	x0, x0, 11, 8
-	cmp	w0, w21
-	bls	.L1466
-	cbz	w1, .L1465
-	ldrh	w0, [x4,x3]
-	and	w0, w0, 2047
-	cmp	w0, w20
-	bgt	.L1465
-.L1466:
-	mov	w1, 0
-	mov	w0, w28
-	mov	w2, 1
-	str	x4, [x29,104]
-	str	x3, [x29,112]
-	add	w22, w22, 1
-	bl	gc_add_sblk
-	add	x0, x19, :lo12:.LANCHOR0
-	mov	w1, 1
-	add	x9, x0, 3424
-	ldr	x3, [x29,112]
-	ldr	x4, [x29,104]
-	strh	w1, [x0,5616]
-	ldr	w1, [x23,#:lo12:.LANCHOR2]
-	tbz	x1, 10, .L1465
-	ldr	x1, [x0,1096]
-	ldr	x10, [x0,1112]
-	add	x1, x1, x3
-	ldrh	w5, [x4,x3]
-	ldr	w6, [x4,x3]
-	ldr	x0, [x29,120]
-	ldrb	w2, [x1,2]
-	b	.L1545
-.L1464:
-	ldrh	w0, [x0,260]
-	ldr	w2, [x29,136]
-	cmp	w2, w0
-	ble	.L1465
-	ldrh	w0, [x4,x3]
-	add	w2, w20, 8
-	and	w0, w0, 2047
-	cmp	w0, w2
-	ble	.L1467
-	cbz	w1, .L1465
-	ldr	w0, [x4,x3]
-	add	w1, w21, 4
-	ubfx	x0, x0, 11, 8
-	cmp	w0, w1
-	bgt	.L1465
-.L1467:
-	mov	w1, 0
-	mov	w0, w28
-	mov	w2, 1
-	str	x4, [x29,104]
-	str	x3, [x29,112]
-	add	w26, w26, 1
-	bl	gc_add_sblk
-	add	x0, x19, :lo12:.LANCHOR0
-	mov	w1, 1
-	add	x9, x0, 3424
-	ldr	x3, [x29,112]
-	ldr	x4, [x29,104]
-	strh	w1, [x0,5616]
-	ldr	w1, [x23,#:lo12:.LANCHOR2]
-	tbz	x1, 10, .L1465
-	ldr	x1, [x0,1096]
-	ldr	x10, [x0,1112]
-	add	x1, x1, x3
-	ldrh	w5, [x4,x3]
-	ldr	w6, [x4,x3]
-	ldr	x0, [x29,128]
-	ldrb	w2, [x1,2]
-.L1545:
-	ldrh	w3, [x10,x24,lsl 1]
-	mov	w1, w28
-	ldrh	w4, [x9,56]
-	ubfx	x2, x2, 5, 3
-	and	w5, w5, 2047
-	ubfx	x6, x6, 11, 8
-	bl	printk
-.L1465:
-	cmp	w26, 4
-	bhi	.L1468
-	cmp	w22, 4
-	bhi	.L1468
+	add	x8, x19, :lo12:.LANCHOR0
+	mov	w26, 0
+	mov	x27, x8
+	mov	w23, 0
+	ldr	x0, [x8, 1128]
+	ldrh	w28, [x0, 580]
+	ldr	x0, [x8, 3384]
+	ldrh	w0, [x0, 134]
+	str	w0, [x29, 132]
+	add	x0, x8, 3416
+	str	x0, [x29, 136]
+	adrp	x0, .LC131
+	add	x0, x0, :lo12:.LC131
+	str	x0, [x29, 120]
 .L1461:
-	add	w27, w27, 1
-	uxth	w27, w27
-	b	.L1459
-.L1468:
+	ldrh	w0, [x27, 1096]
+	ldr	w1, [x29, 132]
+	cmp	w1, w0
+	bcc	.L1471
+.L1470:
 	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x0, [x0,1120]
-	str	w28, [x0,580]
-	b	.L1458
-.L1486:
-	mov	w26, 0
-	mov	w22, w26
-.L1458:
-	cbz	w21, .L1471
+	ldr	x0, [x0, 1128]
+	str	w28, [x0, 580]
+.L1460:
+	cbz	w21, .L1473
 	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x0, [x0,3392]
-	ldrh	w0, [x0,134]
-.L1472:
-	add	x1, x19, :lo12:.LANCHOR0
-	ldrh	w2, [x1,1088]
-	cmp	w2, w0
-	bls	.L1547
-	ubfiz	x3, x0, 2, 16
-	ldr	x4, [x1,1096]
-	add	x5, x4, x3
-	ldr	w1, [x4,x3]
-	ubfx	x2, x1, 11, 8
-	cmp	w2, w21
-	bcc	.L1473
-	ldrb	w5, [x5,2]
-	tst	w5, 24
-	beq	.L1473
-	sub	w2, w2, w21
-	bfi	w1, w2, 11, 8
-	str	w1, [x4,x3]
-.L1473:
-	add	w0, w0, 1
-	uxth	w0, w0
-	b	.L1472
-.L1547:
-	ldr	x0, [x1,3392]
-	ldrh	w1, [x0,72]
+	ldr	x1, [x0, 3384]
+	ldrh	w1, [x1, 134]
+.L1474:
+	ldrh	w2, [x0, 1096]
+	cmp	w2, w1
+	bhi	.L1476
+	ldr	x0, [x0, 3384]
+	ldrh	w1, [x0, 72]
 	add	w1, w21, w1
-	strh	w1, [x0,72]
-	ldrh	w1, [x0,98]
-	cmp	w1, w21
-	bls	.L1471
+	strh	w1, [x0, 72]
+	ldrh	w1, [x0, 98]
+	cmp	w21, w1
+	bcs	.L1473
 	sub	w21, w1, w21
-	strh	w21, [x0,98]
-.L1471:
-	cbz	w20, .L1477
+	strh	w21, [x0, 98]
+.L1473:
+	cbz	w20, .L1479
 	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x0, [x0,3392]
-	ldrh	w0, [x0,134]
-.L1478:
-	add	x1, x19, :lo12:.LANCHOR0
-	ldrh	w2, [x1,1088]
-	cmp	w2, w0
-	bls	.L1548
-	ubfiz	x3, x0, 2, 16
-	ldr	x4, [x1,1096]
-	add	x5, x4, x3
-	ldrh	w1, [x4,x3]
-	and	w2, w1, 2047
-	cmp	w2, w20
-	blt	.L1479
-	ldrb	w5, [x5,2]
-	and	w5, w5, 24
-	cmp	w5, 16
-	beq	.L1479
-	sub	w2, w2, w20
-	bfi	w1, w2, 0, 11
-	strh	w1, [x4,x3]
-.L1479:
-	add	w0, w0, 1
-	uxth	w0, w0
-	b	.L1478
-.L1548:
-	ldr	x0, [x1,3392]
-	ldrh	w1, [x0,74]
+	ldr	x1, [x0, 3384]
+	ldrh	w1, [x1, 134]
+.L1480:
+	ldrh	w2, [x0, 1096]
+	cmp	w2, w1
+	bhi	.L1482
+	ldr	x0, [x0, 3384]
+	ldrh	w1, [x0, 74]
 	add	w1, w20, w1
-	strh	w1, [x0,74]
-	ldrh	w1, [x0,96]
-	cmp	w1, w20
-	bls	.L1477
+	strh	w1, [x0, 74]
+	ldrh	w1, [x0, 96]
+	cmp	w20, w1
+	bcs	.L1479
 	sub	w20, w1, w20
-	strh	w20, [x0,96]
-.L1477:
-	adrp	x20, .LANCHOR3
+	strh	w20, [x0, 96]
+.L1479:
+	adrp	x5, .LANCHOR3
+	add	x5, x5, :lo12:.LANCHOR3
 	mov	w1, 0
-	add	x20, x20, :lo12:.LANCHOR3
-	add	x0, x20, 1376
+	add	x0, x5, 1368
 	bl	_list_get_gc_head_node
-	uxth	w1, w0
+	and	w1, w0, 65535
 	mov	w2, 65535
 	cmp	w1, w2
-	beq	.L1434
+	beq	.L1437
 	add	x19, x19, :lo12:.LANCHOR0
 	ubfiz	x1, x1, 1, 16
-	ldrh	w2, [x20,1384]
-	ldr	x3, [x19,1112]
-	ldrh	w1, [x3,x1]
+	ldrh	w2, [x5, 1376]
+	ldr	x3, [x19, 1120]
+	ldrh	w1, [x3, x1]
 	cmp	w1, w2, lsr 1
-	bhi	.L1434
-	mov	w1, 0
+	bhi	.L1437
+	add	w23, w23, 1
 	mov	w2, 1
-	add	w22, w22, 1
+	mov	w1, 0
 	bl	gc_add_sblk
-	b	.L1434
-.L1485:
-	mov	w26, 0
-	mov	w22, w26
-.L1434:
-	add	w0, w26, w22
-.L1524:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+.L1437:
+	add	w0, w23, w26
+.L1432:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 144
 	ret
-	.size	gc_static_wearleveling, .-gc_static_wearleveling
-	.align	2
-	.global	zftl_sblk_list_init
-	.type	zftl_sblk_list_init, %function
-zftl_sblk_list_init:
-	stp	x29, x30, [sp, -112]!
-	mov	w2, 6
-	mov	w1, 0
-	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	adrp	x23, .LANCHOR0
-	mov	w24, 0
-	stp	x19, x20, [sp,16]
-	add	x19, x23, :lo12:.LANCHOR0
-	stp	x25, x26, [sp,64]
-	stp	x21, x22, [sp,32]
-	stp	x27, x28, [sp,80]
-	adrp	x21, .LANCHOR3
-	adrp	x26, .LANCHOR4
-	ldrh	w3, [x19,1088]
-	adrp	x27, .LC0
-	ldr	x0, [x19,1040]
-	add	x26, x26, :lo12:.LANCHOR4
-	add	x27, x27, :lo12:.LC0
-	add	x26, x26, 72
-	mul	w2, w3, w2
-	bl	ftl_memset
-	strh	wzr, [x19,3376]
-	add	x0, x21, :lo12:.LANCHOR3
-	mov	w1, 32
-	strh	wzr, [x19,3378]
-	strh	wzr, [x19,3380]
-	strh	w1, [x0,1416]
-	ldrh	w25, [x0,1346]
-	ldrb	w1, [x0,1329]
-	str	xzr, [x0,1392]
-	str	xzr, [x0,1400]
-	mul	w25, w1, w25
-	str	xzr, [x0,1408]
-	str	xzr, [x0,1368]
-	str	xzr, [x0,1352]
-	str	xzr, [x0,1376]
-	mov	w0, 32768
-	strh	wzr, [x19,3382]
-	sdiv	w25, w0, w25
-	strh	wzr, [x19,3386]
-	strh	wzr, [x19,3384]
-	sxth	w0, w25
-	str	w0, [x29,108]
-	ldr	x0, [x19,3392]
-	ldrsh	w19, [x0,134]
-	strh	wzr, [x0,146]
-.L1550:
-	add	x2, x23, :lo12:.LANCHOR0
-	ldrh	w0, [x2,1088]
-	cmp	w19, w0
-	bge	.L1581
-	sxtw	x25, w19
-	ldr	x20, [x2,1096]
-	ldr	w0, [x29,108]
-	add	x20, x20, x25, lsl 2
-	ldrb	w1, [x20,3]
-	cbz	w1, .L1551
-	add	x0, x21, :lo12:.LANCHOR3
-	mov	w1, 0
-	ldr	x4, [x2,3392]
-	ldrb	w5, [x0,1329]
-	ldrh	w6, [x0,1346]
-	mov	w0, w1
-.L1552:
-	cmp	w1, w5
-	bge	.L1582
-	ldrb	w2, [x20,3]
-	asr	w2, w2, w1
-	tbnz	x2, 0, .L1553
-	add	w0, w6, w0
-	sxth	w0, w0
-	b	.L1554
-.L1553:
-	ldrh	w2, [x4,146]
-	add	w2, w2, 1
-	strh	w2, [x4,146]
-.L1554:
-	add	w1, w1, 1
+.L1447:
+	uxtw	x7, w22
+	ldr	x5, [x24, 1104]
+	lsl	x2, x7, 2
+	add	x6, x5, x2
+	ldrb	w0, [x6, 2]
+	and	w1, w0, 224
+	cmp	w1, 224
+	beq	.L1439
+	tbz	x0, 3, .L1440
+	ldr	w0, [x5, x2]
+	ldrh	w1, [x5, x2]
+	ubfx	x0, x0, 11, 8
+	and	w1, w1, 2047
+.L1441:
+	ldr	w3, [x29, 132]
+	add	w26, w26, 1
+	and	w26, w26, 65535
+	cmp	w20, w1
+	add	w3, w3, w1
+	str	w3, [x29, 132]
+	bls	.L1485
+	ldr	x3, [x24, 1128]
+	mov	w20, w1
+	strh	w22, [x3, 586]
+.L1485:
+	cmp	w25, w1
+	bcs	.L1444
+	mov	w28, w22
+	mov	w25, w1
+.L1444:
+	cmp	w0, w9
+	bne	.L1443
+.L1445:
+	cmp	w0, 9
+	ccmp	w1, 9, 0, hi
+	bhi	.L1439
+	ldr	w0, [x10, #:lo12:.LANCHOR2]
+	tbz	x0, 8, .L1439
+	ldr	x0, [x24, 1120]
+	mov	w1, w22
+	ldrb	w4, [x6, 2]
+	ldrb	w6, [x6, 3]
+	ldr	w3, [x5, x2]
+	ldrh	w7, [x0, x7, lsl 1]
+	mov	x0, x8
+	ldrh	w2, [x5, x2]
+	ubfx	x5, x4, 5, 3
+	str	x10, [x29, 104]
+	ubfx	x4, x4, 3, 2
+	str	w9, [x29, 112]
+	ubfx	x3, x3, 11, 8
+	str	x8, [x29, 120]
+	and	w2, w2, 2047
+	bl	printk
+	ldr	w9, [x29, 112]
+	ldr	x10, [x29, 104]
+	ldr	x8, [x29, 120]
+.L1439:
+	add	w22, w22, 1
+	and	w22, w22, 65535
+	b	.L1438
+.L1440:
+	tst	w0, 24
+	bne	.L1442
+	ldrh	w1, [x5, x2]
+	mov	w0, 65535
+	and	w1, w1, 2047
+	b	.L1441
+.L1442:
+	ldr	w0, [x5, x2]
+	mov	w1, 65535
+	ubfx	x0, x0, 11, 8
+.L1443:
+	ldr	w3, [x29, 136]
+	add	w27, w27, 1
+	and	w27, w27, 65535
+	cmp	w21, w0
+	add	w3, w3, w0
+	str	w3, [x29, 136]
+	bls	.L1446
+	ldr	x3, [x24, 1128]
+	mov	w21, w0
+	strh	w22, [x3, 584]
+.L1446:
+	cmp	w23, w0
+	bcs	.L1445
+	mov	w23, w0
+	str	w22, [x29, 128]
+	b	.L1445
+.L1451:
+	tst	w0, 224
+	bne	.L1450
+	ldr	x1, [x3, 1128]
+	mov	w0, 65535
+	ldrh	w2, [x1, 590]
+	cmp	w2, w0
+	bne	.L1450
+	ldrh	w0, [x1, 586]
+	str	x3, [x29, 120]
+	ldrh	w1, [x1, 588]
+	cmp	w1, w0
+	beq	.L1450
+	bl	zftl_remove_free_node
+	ldr	x3, [x29, 120]
+	ldr	x0, [x3, 1128]
+	ldrh	w1, [x0, 586]
+	strh	w1, [x0, 590]
+	mov	w1, -1
+	strh	w1, [x0, 586]
+	b	.L1450
+.L1454:
+	and	w0, w0, 248
+	cmp	w0, 16
+	bne	.L1453
+	ldr	x1, [x3, 1128]
+	mov	w0, 65535
+	ldrh	w2, [x1, 588]
+	cmp	w2, w0
+	bne	.L1453
+	ldrh	w0, [x1, 584]
+	str	x3, [x29, 120]
+	ldrh	w1, [x1, 590]
+	cmp	w1, w0
+	beq	.L1453
+	bl	zftl_remove_free_node
+	ldr	x3, [x29, 120]
+	ldr	x0, [x3, 1128]
+	ldrh	w1, [x0, 584]
+	strh	w1, [x0, 588]
+	mov	w1, -1
+	strh	w1, [x0, 584]
+	b	.L1453
+.L1471:
+	add	w7, w28, 1
+	ldr	x4, [x27, 1104]
+	and	w28, w7, 65535
+	cmp	w0, w28
+	csel	w28, w28, wzr, hi
+	uxtw	x9, w28
+	lsl	x3, x9, 2
+	add	x0, x4, x3
+	ldrb	w0, [x0, 2]
+	tst	w0, 192
+	beq	.L1463
+	and	w2, w0, 224
+	cmp	w2, 224
+	beq	.L1463
+	ubfx	x0, x0, 3, 2
+	and	w1, w0, 1
+	tbz	x0, 0, .L1464
+	cmp	w2, 160
+.L1551:
+	bne	.L1466
+	add	x0, x24, :lo12:.LANCHOR5
+	ldr	w2, [x29, 128]
+	ldrh	w0, [x0, 218]
+	cmp	w2, w0
+	ble	.L1467
+	ldr	w0, [x4, x3]
+	ubfx	x0, x0, 11, 8
+	cmp	w0, w21
+	bls	.L1468
+	cbz	w1, .L1467
+	ldrh	w0, [x4, x3]
+	and	w0, w0, 2047
+	cmp	w0, w20
+	bgt	.L1467
+.L1468:
+	mov	w1, 0
+	stp	x4, x9, [x29, 96]
+	str	x3, [x29, 112]
+	mov	w2, 1
+	mov	w0, w28
+	bl	gc_add_sblk
+	ldr	x1, [x29, 136]
+	mov	w0, 1
+	add	w23, w23, 1
+	ldr	x3, [x29, 112]
+	ldp	x4, x9, [x29, 96]
+	strh	w0, [x1, 2192]
+	ldr	w0, [x22, #:lo12:.LANCHOR2]
+	tbz	x0, 10, .L1467
+	ldr	x0, [x27, 1104]
+	ldr	w6, [x4, x3]
+	ldrh	w5, [x4, x3]
+	add	x3, x0, x3
+	ldr	x1, [x27, 1120]
+	ldr	x0, [x29, 136]
+	ubfx	x6, x6, 11, 8
+	ldrb	w2, [x3, 2]
+	and	w5, w5, 2047
+	ldrh	w3, [x1, x9, lsl 1]
+	mov	w1, w28
+	ldrh	w4, [x0, 56]
+	ubfx	x2, x2, 5, 3
+	adrp	x0, .LC130
+	add	x0, x0, :lo12:.LC130
+.L1552:
+	bl	printk
+.L1467:
+	cmp	w23, 4
+	ccmp	w26, 4, 2, ls
+	bhi	.L1470
+.L1463:
+	ldr	w0, [x29, 132]
+	add	w0, w0, 1
+	and	w0, w0, 65535
+	str	w0, [x29, 132]
+	b	.L1461
+.L1464:
+	cmp	w0, 2
+	b	.L1551
+.L1466:
+	add	x2, x24, :lo12:.LANCHOR5
+	sub	w0, w25, w20
+	ldrh	w2, [x2, 216]
+	cmp	w0, w2
+	ble	.L1467
+	ldrh	w0, [x4, x3]
+	add	w2, w20, 8
+	and	w0, w0, 2047
+	cmp	w0, w2
+	ble	.L1469
+	cbz	w1, .L1467
+	ldr	w0, [x4, x3]
+	add	w1, w21, 4
+	ubfx	x0, x0, 11, 8
+	cmp	w0, w1
+	bgt	.L1467
+.L1469:
+	mov	w1, 0
+	stp	x4, x9, [x29, 96]
+	str	x3, [x29, 112]
+	mov	w2, 1
+	mov	w0, w28
+	bl	gc_add_sblk
+	ldr	x1, [x29, 136]
+	mov	w0, 1
+	add	w26, w26, 1
+	ldr	x3, [x29, 112]
+	ldp	x4, x9, [x29, 96]
+	strh	w0, [x1, 2192]
+	ldr	w0, [x22, #:lo12:.LANCHOR2]
+	tbz	x0, 10, .L1467
+	ldr	x0, [x27, 1104]
+	ldr	w6, [x4, x3]
+	ldrh	w5, [x4, x3]
+	add	x3, x0, x3
+	ldr	x1, [x27, 1120]
+	ldr	x0, [x29, 136]
+	ubfx	x6, x6, 11, 8
+	ldrb	w2, [x3, 2]
+	and	w5, w5, 2047
+	ldrh	w3, [x1, x9, lsl 1]
+	mov	w1, w28
+	ldrh	w4, [x0, 56]
+	ubfx	x2, x2, 5, 3
+	ldr	x0, [x29, 120]
 	b	.L1552
-.L1582:
-	cbz	w0, .L1556
+.L1488:
+	mov	w26, 0
+	mov	w23, 0
+	b	.L1460
+.L1476:
+	ldr	x5, [x0, 1104]
+	ubfiz	x4, x1, 2, 16
+	add	x6, x5, x4
+	ldr	w2, [x5, x4]
+	ubfx	x3, x2, 11, 8
+	cmp	w21, w3
+	bhi	.L1475
+	ldrb	w6, [x6, 2]
+	tst	w6, 24
+	beq	.L1475
+	sub	w3, w3, w21
+	bfi	w2, w3, 11, 8
+	str	w2, [x5, x4]
+.L1475:
+	add	w1, w1, 1
+	and	w1, w1, 65535
+	b	.L1474
+.L1482:
+	ldr	x5, [x0, 1104]
+	ubfiz	x4, x1, 2, 16
+	add	x6, x5, x4
+	ldrh	w2, [x5, x4]
+	and	w3, w2, 2047
+	cmp	w3, w20
+	blt	.L1481
+	ldrb	w6, [x6, 2]
+	and	w6, w6, 24
+	cmp	w6, 16
+	beq	.L1481
+	sub	w3, w3, w20
+	bfi	w2, w3, 0, 11
+	strh	w2, [x5, x4]
+.L1481:
+	add	w1, w1, 1
+	and	w1, w1, 65535
+	b	.L1480
+.L1487:
+	mov	w26, 0
+	mov	w23, 0
+	b	.L1437
+.L1486:
+	mov	w0, 0
+	b	.L1432
+	.size	gc_static_wearleveling, .-gc_static_wearleveling
+	.align	2
+	.global	zftl_sblk_list_init
+	.type	zftl_sblk_list_init, %function
+zftl_sblk_list_init:
+	stp	x29, x30, [sp, -96]!
+	mov	w0, 6
+	mov	w1, 0
+	add	x29, sp, 0
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR0
+	add	x19, x19, :lo12:.LANCHOR0
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	adrp	x25, .LANCHOR4
+	stp	x21, x22, [sp, 32]
+	adrp	x22, .LANCHOR3
+	ldrh	w2, [x19, 1096]
+	add	x25, x25, :lo12:.LANCHOR4
+	str	x27, [sp, 80]
+	add	x26, x19, 3372
+	add	x25, x25, 72
+	mov	w23, 0
+	mul	w2, w2, w0
+	ldr	x0, [x19, 1040]
+	bl	ftl_memset
+	strh	wzr, [x19, 3368]
+	add	x0, x22, :lo12:.LANCHOR3
+	mov	w1, 32
+	strh	wzr, [x19, 3370]
+	strh	wzr, [x19, 3372]
+	ldrb	w24, [x0, 1321]
+	strh	w1, [x0, 1408]
+	str	xzr, [x0, 1344]
+	str	xzr, [x0, 1360]
+	str	xzr, [x0, 1368]
+	str	xzr, [x0, 1384]
+	str	xzr, [x0, 1392]
+	str	xzr, [x0, 1400]
+	ldrh	w0, [x0, 1338]
+	strh	wzr, [x19, 3374]
+	strh	wzr, [x19, 3378]
+	strh	wzr, [x19, 3376]
+	mul	w0, w24, w0
+	mov	w24, 32768
+	sdiv	w24, w24, w0
+	ldr	x0, [x19, 3384]
+	ldrsh	w20, [x0, 134]
+	sxth	w24, w24
+	strh	wzr, [x0, 146]
+.L1554:
+	ldrh	w0, [x19, 1096]
+	cmp	w20, w0
+	blt	.L1571
+	ldr	x0, [x19, 3384]
+	ldrh	w1, [x19, 3368]
+	strh	w1, [x0, 114]
+	ldrh	w1, [x19, 3370]
+	strh	w1, [x0, 118]
+	ldrh	w1, [x19, 3372]
+	strh	w1, [x0, 116]
+	ldrh	w1, [x19, 3374]
+	strh	w1, [x0, 122]
+	ldrh	w1, [x19, 3378]
+	strh	w1, [x0, 120]
+	ldrh	w1, [x19, 3376]
+	strh	w1, [x0, 124]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldr	x27, [sp, 80]
+	ldp	x29, x30, [sp], 96
+	ret
+.L1571:
+	ldr	x21, [x19, 1104]
+	sxtw	x27, w20
+	add	x21, x21, x27, lsl 2
+	ldrb	w0, [x21, 3]
+	cbz	w0, .L1572
+	add	x0, x22, :lo12:.LANCHOR3
+	ldr	x3, [x19, 3384]
+	mov	w1, 0
+	ldrb	w4, [x0, 1321]
+	ldrh	w5, [x0, 1338]
+	mov	w0, 0
+.L1556:
+	cmp	w1, w4
+	blt	.L1559
+	cbz	w0, .L1560
 	mov	w1, 32768
 	sdiv	w0, w1, w0
 	add	w0, w0, 1
 	sxth	w0, w0
-	b	.L1551
-.L1556:
-	ldrb	w1, [x20,2]
-	mov	w2, -1
-	orr	w1, w1, -32
-	strb	w1, [x20,2]
-	add	x1, x23, :lo12:.LANCHOR0
-	ldr	x1, [x1,1112]
-	strh	w2, [x1,x25,lsl 1]
-.L1551:
-	add	x22, x23, :lo12:.LANCHOR0
+.L1555:
 	mov	w1, 6
-	smull	x1, w19, w1
-	ldr	x2, [x22,1040]
+	ldr	x2, [x19, 1040]
+	smull	x1, w20, w1
 	add	x2, x2, x1
-	strh	w0, [x2,4]
+	strh	w0, [x2, 4]
 	mov	w2, -1
-	ldr	x0, [x22,1040]
-	add	x4, x0, x1
-	strh	w2, [x4,2]
-	strh	w2, [x0,x1]
-	ldrb	w0, [x20,2]
+	ldr	x0, [x19, 1040]
+	add	x3, x0, x1
+	strh	w2, [x3, 2]
+	strh	w2, [x0, x1]
+	mov	w1, 224
+	ldrb	w0, [x21, 2]
 	and	w0, w0, 224
-	cmp	w0, 224
-	beq	.L1557
 	cmp	w0, 32
-	cset	w28, eq
-	cbnz	w28, .L1557
-	ldr	x1, [x22,1120]
-	ldrh	w2, [x1,16]
-	cmp	w19, w2
-	beq	.L1557
-	ldrh	w2, [x1,48]
-	cmp	w19, w2
-	beq	.L1557
-	ldrh	w1, [x1,80]
-	cmp	w19, w1
-	beq	.L1557
+	ccmp	w0, w1, 4, ne
+	beq	.L1561
+	ldr	x1, [x19, 1128]
+	ldrh	w2, [x1, 16]
+	cmp	w20, w2
+	beq	.L1561
+	ldrh	w2, [x1, 48]
+	cmp	w20, w2
+	beq	.L1561
+	ldrh	w1, [x1, 80]
+	cmp	w20, w1
+	beq	.L1561
 	cmp	w0, 64
-	bne	.L1558
-	uxth	w20, w19
-	add	x0, x21, :lo12:.LANCHOR3
-	add	x0, x0, 1352
-	mov	w1, w20
-	add	x2, x22, 3382
-	b	.L1579
-.L1558:
-	cmp	w0, 96
-	bne	.L1559
-	uxth	w20, w19
-	add	x0, x21, :lo12:.LANCHOR3
-	add	x0, x0, 1368
-	mov	w1, w20
-	add	x2, x22, 3384
-	b	.L1579
-.L1559:
-	cmp	w0, 160
-	bne	.L1560
-	uxth	w20, w19
-	add	x0, x21, :lo12:.LANCHOR3
-	add	x0, x0, 1376
-	mov	w1, w20
-	add	x2, x22, 3386
-.L1579:
+	bne	.L1562
+	and	w21, w20, 65535
+	add	x0, x22, :lo12:.LANCHOR3
+	add	x2, x19, 3374
+	mov	w1, w21
+	add	x0, x0, 1344
+.L1583:
 	bl	_insert_data_list
-	ldr	x0, [x22,1112]
-	ldrh	w0, [x0,x25,lsl 1]
+	ldr	x0, [x19, 1120]
+	ldrh	w0, [x0, x27, lsl 1]
 	cmp	w0, 7
-	bhi	.L1557
-	mov	w0, w20
+	bhi	.L1561
+	mov	w0, w21
+	mov	w2, 0
 	mov	w1, 1
-	mov	w2, w28
-	b	.L1577
+.L1581:
+	bl	gc_add_sblk
+.L1561:
+	add	w20, w20, 1
+	sxth	w20, w20
+	b	.L1554
+.L1559:
+	ldrb	w2, [x21, 3]
+	asr	w2, w2, w1
+	tbnz	x2, 0, .L1557
+	add	w0, w5, w0
+	sxth	w0, w0
+.L1558:
+	add	w1, w1, 1
+	b	.L1556
+.L1557:
+	ldrh	w2, [x3, 146]
+	add	w2, w2, 1
+	strh	w2, [x3, 146]
+	b	.L1558
 .L1560:
-	cbnz	w0, .L1557
-	ldr	x0, [x22,1112]
-	ldrh	w2, [x0,x25,lsl 1]
-	cbz	w2, .L1561
-	cmp	w24, 2
-	bgt	.L1562
-	adrp	x0, .LC135
-	mov	w1, w19
-	add	x0, x0, :lo12:.LC135
-	add	w24, w24, 1
+	ldrb	w1, [x21, 2]
+	mov	w2, -1
+	orr	w1, w1, -32
+	strb	w1, [x21, 2]
+	ldr	x1, [x19, 1120]
+	strh	w2, [x1, x27, lsl 1]
+	b	.L1555
+.L1572:
+	mov	w0, w24
+	b	.L1555
+.L1562:
+	cmp	w0, 96
+	bne	.L1563
+	and	w21, w20, 65535
+	add	x0, x22, :lo12:.LANCHOR3
+	add	x2, x19, 3376
+	mov	w1, w21
+	add	x0, x0, 1360
+	b	.L1583
+.L1563:
+	cmp	w0, 160
+	bne	.L1564
+	and	w21, w20, 65535
+	add	x0, x22, :lo12:.LANCHOR3
+	add	x2, x19, 3378
+	mov	w1, w21
+	add	x0, x0, 1368
+	b	.L1583
+.L1564:
+	cbnz	w0, .L1561
+	ldr	x0, [x19, 1120]
+	ldrh	w2, [x0, x27, lsl 1]
+	cbz	w2, .L1565
+	cmp	w23, 2
+	bgt	.L1566
+	mov	w1, w20
+	adrp	x0, .LC132
+	add	x0, x0, :lo12:.LC132
 	bl	printk
-	sxth	w24, w24
-	ldrb	w0, [x20,2]
-	tbz	x0, 4, .L1563
+	ldrb	w0, [x21, 2]
+	add	w23, w23, 1
+	sxth	w23, w23
+	tbz	x0, 4, .L1567
 	mov	w1, 5
-	b	.L1573
-.L1563:
-	mov	w1, 2
-.L1573:
+.L1577:
 	bfi	w0, w1, 5, 3
 	mov	w2, 0
-	strb	w0, [x20,2]
+	strb	w0, [x21, 2]
 	mov	w1, 1
-	mov	w0, w19
-.L1577:
-	bl	gc_add_sblk
-	b	.L1557
-.L1562:
-	mov	x1, x26
+	mov	w0, w20
+	b	.L1581
+.L1567:
+	mov	w1, 2
+	b	.L1577
+.L1566:
+	mov	x1, x25
 	mov	w2, 656
-	mov	x0, x27
+	adrp	x0, .LC0
+	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L1561:
-	ldrb	w0, [x20,2]
-	ands	w0, w0, 24
-	bne	.L1565
-	add	x0, x21, :lo12:.LANCHOR3
-	add	x2, x23, :lo12:.LANCHOR0
-	add	x0, x0, 1392
-	mov	w1, w19
-	add	x2, x2, 3376
-	b	.L1575
 .L1565:
-	cmp	w0, 16
-	add	x2, x23, :lo12:.LANCHOR0
-	add	x0, x21, :lo12:.LANCHOR3
-	bne	.L1566
-	add	x0, x0, 1400
-	mov	w1, w19
-	add	x2, x2, 3378
-	b	.L1575
-.L1566:
-	add	x0, x0, 1408
-	mov	w1, w19
-	add	x2, x2, 3380
-.L1575:
+	ldrb	w0, [x21, 2]
+	ands	w0, w0, 24
+	bne	.L1569
+	add	x0, x22, :lo12:.LANCHOR3
+	add	x2, x19, 3368
+	mov	w1, w20
+	add	x0, x0, 1384
+.L1579:
 	bl	_insert_free_list
-.L1557:
-	add	w19, w19, 1
-	sxth	w19, w19
-	b	.L1550
-.L1581:
-	ldr	x0, [x2,3392]
-	ldrh	w1, [x2,3376]
-	strh	w1, [x0,114]
-	ldrh	w1, [x2,3378]
-	strh	w1, [x0,118]
-	ldrh	w1, [x2,3380]
-	strh	w1, [x0,116]
-	ldrh	w1, [x2,3382]
-	strh	w1, [x0,122]
-	ldrh	w1, [x2,3386]
-	strh	w1, [x0,120]
-	ldrh	w1, [x2,3384]
-	strh	w1, [x0,124]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 112
-	ret
+	b	.L1561
+.L1569:
+	cmp	w0, 16
+	add	x0, x22, :lo12:.LANCHOR3
+	bne	.L1570
+	add	x2, x19, 3370
+	mov	w1, w20
+	add	x0, x0, 1392
+	b	.L1579
+.L1570:
+	mov	x2, x26
+	mov	w1, w20
+	add	x0, x0, 1400
+	b	.L1579
 	.size	zftl_sblk_list_init, .-zftl_sblk_list_init
 	.align	2
 	.global	pm_free_sblk
 	.type	pm_free_sblk, %function
 pm_free_sblk:
-	stp	x29, x30, [sp, -384]!
+	stp	x29, x30, [sp, -368]!
 	adrp	x0, .LANCHOR5
-	add	x29, sp, 0
 	add	x1, x0, :lo12:.LANCHOR5
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
+	add	x29, sp, 0
+	stp	x19, x20, [sp, 16]
 	mov	x19, x0
-	ldrh	w1, [x1,264]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldrh	w1, [x1, 220]
 	cmp	w1, 128
-	bls	.L1584
+	bls	.L1586
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
-	mov	w2, 94
 	add	x1, x1, 96
+	mov	w2, 94
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L1584:
-	adrp	x20, .LANCHOR0
-	mov	x1, 0
-	add	x0, x20, :lo12:.LANCHOR0
-	mov	w2, w1
-	mov	w6, 65535
-	ldr	x3, [x0,3392]
-	add	x0, x19, :lo12:.LANCHOR5
-	ldrh	w4, [x3,688]
-	ldrh	w5, [x0,264]
-.L1587:
-	add	x7, x3, x1, lsl 1
-	uxth	w0, w1
-	ldrh	w7, [x7,416]
-	cmp	w7, w6
-	beq	.L1585
-	add	w2, w2, 1
-	uxth	w2, w2
-.L1585:
-	cmp	w2, w4
-	bcs	.L1586
-	cmp	w2, w5
-	bcs	.L1586
-	add	x1, x1, 1
-	cmp	x1, 128
-	bne	.L1587
-	mov	w0, w1
 .L1586:
-	add	w0, w0, 1
-	mov	w19, 128
-	add	x22, x29, 128
+	adrp	x21, .LANCHOR0
+	add	x0, x21, :lo12:.LANCHOR0
+	add	x19, x19, :lo12:.LANCHOR5
 	mov	w1, 0
-	uxth	w0, w0
+	mov	w4, 65535
+	ldr	x0, [x0, 3384]
+	ldrh	w3, [x19, 220]
+	mov	w19, 0
+	add	x0, x0, 416
+	ldrh	w2, [x0, 272]
+.L1589:
+	ldrh	w5, [x0]
+	cmp	w5, w4
+	beq	.L1587
+	add	w1, w1, 1
+	and	w1, w1, 65535
+.L1587:
+	cmp	w1, w2
+	bcs	.L1588
+	cmp	w1, w3
+	bcs	.L1588
+	add	w19, w19, 1
+	add	x0, x0, 2
+	and	w19, w19, 65535
+	cmp	w19, 128
+	bne	.L1589
+.L1588:
+	add	w19, w19, 1
+	mov	w0, 128
+	and	w19, w19, 65535
+	add	x22, x29, 112
+	cmp	w19, 129
 	mov	w2, 256
-	cmp	w0, 128
-	adrp	x23, .LANCHOR3
-	csel	w19, w0, w19, ls
-	uxth	w0, w19
-	str	w0, [x29,124]
+	csel	w19, w19, w0, ne
+	mov	w1, 0
 	mov	x0, x22
+	adrp	x23, .LANCHOR3
 	bl	ftl_memset
-	add	x0, x20, :lo12:.LANCHOR0
+	str	x23, [x29, 104]
+	add	x0, x21, :lo12:.LANCHOR0
 	add	x1, x23, :lo12:.LANCHOR3
-	mov	x3, 0
-	ldrb	w2, [x0,1257]
-	ldr	x4, [x0,3392]
-	mov	w0, 24
-	ldrh	w6, [x1,1312]
-	sub	w2, w0, w2
-	mov	w0, 1
-	ldrb	w8, [x1,1314]
-	sub	w2, w2, w6
-	ldrh	w7, [x4,698]
-	lsl	w2, w0, w2
+	mov	w2, 24
+	ldr	x5, [x0, 3384]
+	ldrb	w0, [x0, 1205]
+	ldrh	w8, [x1, 1304]
+	add	x4, x5, 704
+	sub	w2, w2, w0
+	ldrb	w9, [x1, 1306]
+	ldrh	w1, [x5, 698]
+	sub	w0, w2, w8
+	mov	w2, 1
+	add	x1, x1, 176
+	lsl	w2, w2, w0
+	add	x1, x5, x1, lsl 2
 	sub	w2, w2, #1
-.L1588:
-	cmp	w7, w3, uxth
-	bls	.L1616
-	add	x0, x4, x3, lsl 2
-	mov	x1, 0
-	ldr	w0, [x0,704]
-	lsr	w0, w0, w6
-	and	w0, w0, w2
-	udiv	w0, w0, w8
-	uxth	w0, w0
-.L1589:
-	ldr	w5, [x29,124]
-	cmp	w5, w1, uxth
-	bls	.L1617
-	add	x5, x4, x1, lsl 1
-	ldrh	w5, [x5,416]
-	cmp	w5, w0
-	bne	.L1590
-	ldrh	w5, [x22,x1,lsl 1]
-	add	w5, w5, 1
-	strh	w5, [x22,x1,lsl 1]
-.L1590:
-	add	x1, x1, 1
-	b	.L1589
-.L1617:
-	add	x3, x3, 1
-	b	.L1588
-.L1616:
-	add	x1, x23, :lo12:.LANCHOR3
-	mov	x19, 0
-	mov	w28, 65535
-	adrp	x25, .LC136
-	adrp	x26, .LC137
-	mov	w24, w19
-	ldrb	w0, [x1,1329]
-	mov	w27, w28
-	ldrh	w21, [x1,1384]
-	add	x25, x25, :lo12:.LC136
-	add	x26, x26, :lo12:.LC137
-	mul	w21, w0, w21
-	uxth	w21, w21
-.L1593:
-	ldr	w0, [x29,124]
-	uxth	w6, w19
-	cmp	w6, w0
-	bcs	.L1618
-	add	x0, x20, :lo12:.LANCHOR0
-	add	x2, x23, :lo12:.LANCHOR3
-	mov	w8, w19
-	ldr	x0, [x0,3392]
-	add	x1, x0, w19, sxtw 1
-	ldrb	w4, [x2,1314]
-	ldrh	w3, [x1,416]
-	ldrh	w1, [x0,692]
+.L1591:
+	cmp	x1, x4
+	bne	.L1594
+	ldr	x0, [x29, 104]
+	adrp	x27, .LC133
+	adrp	x28, .LC134
+	add	x21, x21, :lo12:.LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR3
+	add	x27, x27, :lo12:.LC133
+	add	x28, x28, :lo12:.LC134
+	mov	x20, 0
+	mov	w23, 65535
+	mov	w26, 0
+	ldrb	w24, [x0, 1321]
+	ldrh	w0, [x0, 1376]
+	mul	w24, w24, w0
+	and	w24, w24, 65535
+.L1600:
+	ldr	x0, [x21, 3384]
+	and	w25, w20, 65535
+	ldr	x2, [x29, 104]
+	mov	w6, w20
+	add	x1, x0, w20, sxtw 1
+	add	x2, x2, :lo12:.LANCHOR3
+	ldrh	w3, [x1, 416]
+	ldrb	w4, [x2, 1306]
+	ldrh	w1, [x0, 692]
 	sdiv	w1, w1, w4
 	cmp	w1, w3
-	bne	.L1594
-	ldrb	w1, [x2,1329]
-	ldrh	w2, [x2,1384]
+	bne	.L1595
+	ldrb	w1, [x2, 1321]
+	ldrh	w2, [x2, 1376]
 	mul	w1, w1, w2
-	strh	w1, [x22,x19,lsl 1]
-.L1594:
-	ldrh	w2, [x22,x19,lsl 1]
-	cmp	w21, w2
-	bls	.L1595
-	cmp	w2, wzr
-	csel	w24, w24, w6, eq
-	csel	w21, w21, w2, eq
+	strh	w1, [x22, x20, lsl 1]
 .L1595:
-	cmp	w3, w27
-	beq	.L1597
-	ldrh	w1, [x0,74]
+	ldrh	w2, [x22, x20, lsl 1]
+	cmp	w2, w24
+	bcs	.L1596
+	cmp	w2, 0
+	csel	w26, w26, w25, eq
+	csel	w24, w24, w2, eq
+.L1596:
+	ldrh	w1, [x0, 74]
 	cmp	w1, 2
 	bls	.L1597
-	add	x4, x20, :lo12:.LANCHOR0
+	mov	w1, 65535
+	cmp	w3, w1
+	beq	.L1597
+	ldr	x4, [x21, 1104]
 	ubfiz	x1, x3, 2, 16
-	ldrh	w0, [x0,92]
-	ldr	x4, [x4,1096]
+	ldrh	w0, [x0, 92]
 	add	w0, w0, 4
-	ldrh	w4, [x4,x1]
+	ldrh	w4, [x4, x1]
 	and	w4, w4, 2047
 	cmp	w4, w0
 	bgt	.L1597
-	mov	w1, w8
-	mov	x0, x25
-	str	x6, [x29,104]
-	str	x8, [x29,112]
+	mov	w1, w6
+	str	w6, [x29, 100]
+	mov	x0, x27
 	bl	printk
-	ldr	x6, [x29,104]
-	ldr	x8, [x29,112]
-	mov	w28, w6
+	ldr	w6, [x29, 100]
+	mov	w23, w25
 .L1597:
-	ldrh	w2, [x22,x19,lsl 1]
-	cbnz	w2, .L1598
-	add	x0, x20, :lo12:.LANCHOR0
-	sxtw	x6, w8
-	ldr	x4, [x0,3392]
-	add	x0, x6, 208
-	ldrh	w3, [x4,x0,lsl 1]
-	cmp	w3, w27
+	ldrh	w0, [x22, x20, lsl 1]
+	cbnz	w0, .L1598
+	sxtw	x25, w6
+	ldr	x0, [x21, 3384]
+	add	x1, x25, 208
+	ldrh	w3, [x0, x1, lsl 1]
+	mov	w1, 65535
+	cmp	w3, w1
 	beq	.L1598
-	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L1599
-	ldrh	w4, [x4,688]
-	mov	x0, x26
-	mov	w1, w8
-	str	x6, [x29,112]
+	adrp	x1, .LANCHOR2
+	ldr	w1, [x1, #:lo12:.LANCHOR2]
+	tbz	x1, 12, .L1599
+	ldrh	w4, [x0, 688]
+	mov	w2, 0
+	mov	w1, w6
+	mov	x0, x28
 	bl	printk
-	ldr	x6, [x29,112]
 .L1599:
-	add	x1, x20, :lo12:.LANCHOR0
-	add	x6, x6, 208
-	str	x1, [x29,104]
-	str	x6, [x29,112]
-	ldr	x0, [x1,3392]
-	ldrh	w0, [x0,x6,lsl 1]
+	ldr	x0, [x21, 3384]
+	add	x25, x25, 208
+	ldrh	w0, [x0, x25, lsl 1]
 	bl	ftl_free_sblk
-	ldr	x1, [x29,104]
-	ldr	x6, [x29,112]
-	ldr	x0, [x1,3392]
+	ldr	x0, [x21, 3384]
 	mov	w1, -1
-	strh	w1, [x0,x6,lsl 1]
-	ldrh	w1, [x0,688]
+	strh	w1, [x0, x25, lsl 1]
+	ldrh	w1, [x0, 688]
 	sub	w1, w1, #1
-	strh	w1, [x0,688]
+	strh	w1, [x0, 688]
 .L1598:
-	add	x19, x19, 1
-	b	.L1593
-.L1618:
+	add	x20, x20, 1
+	cmp	w19, w20, uxth
+	bhi	.L1600
 	mov	w0, 65535
-	cmp	w28, w0
-	csel	w0, w24, w28, eq
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 384
+	cmp	w23, w0
+	csel	w0, w26, w23, eq
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 368
 	ret
+.L1594:
+	ldr	w0, [x4]
+	add	x6, x5, 416
+	mov	x3, 0
+	lsr	w0, w0, w8
+	and	w0, w0, w2
+	udiv	w0, w0, w9
+	and	w0, w0, 65535
+.L1593:
+	ldrh	w7, [x6]
+	cmp	w7, w0
+	bne	.L1592
+	ldrh	w7, [x22, x3, lsl 1]
+	add	w7, w7, 1
+	strh	w7, [x22, x3, lsl 1]
+.L1592:
+	add	x3, x3, 1
+	add	x6, x6, 2
+	cmp	w19, w3, uxth
+	bhi	.L1593
+	add	x4, x4, 4
+	b	.L1591
 	.size	pm_free_sblk, .-pm_free_sblk
 	.align	2
 	.global	ftl_memcpy
@@ -10283,47 +9939,47 @@ ftl_memcpy:
 	.global	flash_info_data_init
 	.type	flash_info_data_init, %function
 flash_info_data_init:
-	adrp	x1, .LANCHOR2
 	stp	x29, x30, [sp, -32]!
+	adrp	x1, .LANCHOR2
 	add	x29, sp, 0
-	ldr	w0, [x1,#:lo12:.LANCHOR2]
-	stp	x19, x20, [sp,16]
+	ldr	w0, [x1, #:lo12:.LANCHOR2]
+	stp	x19, x20, [sp, 16]
 	mov	x20, x1
-	tbz	x0, 12, .L1621
+	tbz	x0, 12, .L1614
 	adrp	x2, .LANCHOR4
-	adrp	x0, .LC138
 	add	x2, x2, :lo12:.LANCHOR4
-	add	x0, x0, :lo12:.LC138
-	mov	w1, 120
+	adrp	x0, .LC135
 	add	x2, x2, 112
+	mov	w1, 120
+	add	x0, x0, :lo12:.LC135
 	bl	printk
-.L1621:
+.L1614:
 	adrp	x19, .LANCHOR0
-	mov	w1, 0
 	add	x19, x19, :lo12:.LANCHOR0
 	mov	w2, 2048
-	ldr	x0, [x19,1128]
+	mov	w1, 0
+	ldr	x0, [x19, 1048]
 	bl	ftl_memset
-	ldr	x1, [x19,1128]
-	mov	w0, 21321
-	movk	w0, 0x5359, lsl 16
+	ldr	x0, [x19, 1048]
+	mov	w1, 21321
+	movk	w1, 0x5359, lsl 16
 	mov	w2, 32
-	str	w0, [x1]
+	str	w1, [x0]
 	mov	w1, 2032
-	ldr	x0, [x19,1128]
+	ldr	x0, [x19, 1048]
 	add	x0, x0, 80
-	str	w1, [x0,-72]
+	str	w1, [x0, -72]
 	mov	w1, 1
-	strh	w1, [x0,-64]
+	strh	w1, [x0, -64]
 	add	x1, x19, 1160
 	bl	ftl_memcpy
-	ldr	x0, [x19,1128]
+	ldr	x0, [x19, 1048]
 	add	x1, x20, :lo12:.LANCHOR2
-	add	x1, x1, 8
 	mov	w2, 32
+	add	x1, x1, 8
 	add	x0, x0, 48
 	bl	ftl_memcpy
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	flash_info_data_init, .-flash_info_data_init
@@ -10332,15 +9988,15 @@ flash_info_data_init:
 	.type	ftl_memcpy32, %function
 ftl_memcpy32:
 	mov	x3, 0
-.L1626:
+.L1620:
 	cmp	w2, w3
-	bls	.L1628
-	ldr	w4, [x1,x3,lsl 2]
-	str	w4, [x0,x3,lsl 2]
-	add	x3, x3, 1
-	b	.L1626
-.L1628:
+	bhi	.L1621
 	ret
+.L1621:
+	ldr	w4, [x1, x3, lsl 2]
+	str	w4, [x0, x3, lsl 2]
+	add	x3, x3, 1
+	b	.L1620
 	.size	ftl_memcpy32, .-ftl_memcpy32
 	.align	2
 	.global	ftl_memcmp
@@ -10357,12 +10013,12 @@ ftl_memcmp:
 	.global	timer_get_time
 	.type	timer_get_time, %function
 timer_get_time:
-	adrp	x0, jiffies
 	stp	x29, x30, [sp, -16]!
+	adrp	x0, jiffies
 	add	x29, sp, 0
-	ldr	x1, [x0,#:lo12:jiffies]
-	adrp	x0, .LANCHOR5+272
-	ldr	x0, [x0,#:lo12:.LANCHOR5+272]
+	ldr	x1, [x0, #:lo12:jiffies]
+	adrp	x0, .LANCHOR5+224
+	ldr	x0, [x0, #:lo12:.LANCHOR5+224]
 	sub	x0, x1, x0
 	bl	jiffies_to_msecs
 	ldp	x29, x30, [sp], 16
@@ -10372,28 +10028,28 @@ timer_get_time:
 	.global	StorageSysDataLoad
 	.type	StorageSysDataLoad, %function
 StorageSysDataLoad:
-	stp	x29, x30, [sp, -48]!
+	stp	x29, x30, [sp, -32]!
 	mov	w2, 512
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	mov	w20, w0
+	stp	x19, x20, [sp, 16]
 	mov	x19, x1
-	mov	x0, x1
 	mov	w1, 0
+	mov	w20, w0
+	mov	x0, x19
 	bl	ftl_memset
 	bl	rknand_device_lock
-	adrp	x0, .LANCHOR5+280
+	adrp	x0, .LANCHOR5+232
 	mov	x2, x19
 	mov	w1, 1
-	ldr	x0, [x0,#:lo12:.LANCHOR5+280]
-	ldr	x3, [x0,24]
+	ldr	x0, [x0, #:lo12:.LANCHOR5+232]
+	ldr	x3, [x0, 24]
 	mov	w0, w20
 	blr	x3
-	str	x0, [x29,40]
+	mov	w19, w0
 	bl	rknand_device_unlock
-	ldr	x0, [x29,40]
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 48
+	mov	w0, w19
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
 	ret
 	.size	StorageSysDataLoad, .-StorageSysDataLoad
 	.align	2
@@ -10402,19 +10058,21 @@ StorageSysDataLoad:
 StorageSysDataStore:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	str	x0, [x29,16]
-	str	x1, [x29,24]
+	stp	x19, x20, [sp, 16]
+	mov	w19, w0
+	mov	x20, x1
 	bl	rknand_device_lock
-	adrp	x1, .LANCHOR5+280
-	ldr	x2, [x29,24]
-	ldr	x0, [x29,16]
-	ldr	x1, [x1,#:lo12:.LANCHOR5+280]
-	ldr	x3, [x1,32]
+	adrp	x0, .LANCHOR5+232
+	mov	x2, x20
 	mov	w1, 1
+	ldr	x0, [x0, #:lo12:.LANCHOR5+232]
+	ldr	x3, [x0, 32]
+	mov	w0, w19
 	blr	x3
-	str	x0, [x29,24]
+	mov	w19, w0
 	bl	rknand_device_unlock
-	ldr	x0, [x29,24]
+	mov	w0, w19
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	StorageSysDataStore, .-StorageSysDataStore
@@ -10424,20 +10082,24 @@ StorageSysDataStore:
 FlashBootVendorRead:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	str	x0, [x29,24]
-	str	x1, [x29,32]
-	str	x2, [x29,40]
+	stp	x19, x20, [sp, 16]
+	mov	w19, w0
+	mov	w20, w1
+	str	x21, [sp, 32]
+	mov	x21, x2
 	bl	rknand_device_lock
-	adrp	x3, .LANCHOR5+280
-	ldr	x1, [x29,32]
-	ldr	x2, [x29,40]
-	ldr	x0, [x29,24]
-	ldr	x3, [x3,#:lo12:.LANCHOR5+280]
-	ldr	x3, [x3,8]
+	adrp	x0, .LANCHOR5+232
+	mov	x2, x21
+	mov	w1, w20
+	ldr	x0, [x0, #:lo12:.LANCHOR5+232]
+	ldr	x3, [x0, 8]
+	mov	w0, w19
 	blr	x3
-	str	x0, [x29,40]
+	mov	w19, w0
 	bl	rknand_device_unlock
-	ldr	x0, [x29,40]
+	ldr	x21, [sp, 32]
+	mov	w0, w19
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	FlashBootVendorRead, .-FlashBootVendorRead
@@ -10447,20 +10109,24 @@ FlashBootVendorRead:
 FlashBootVendorWrite:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	str	x0, [x29,24]
-	str	x1, [x29,32]
-	str	x2, [x29,40]
+	stp	x19, x20, [sp, 16]
+	mov	w19, w0
+	mov	w20, w1
+	str	x21, [sp, 32]
+	mov	x21, x2
 	bl	rknand_device_lock
-	adrp	x3, .LANCHOR5+280
-	ldr	x1, [x29,32]
-	ldr	x2, [x29,40]
-	ldr	x0, [x29,24]
-	ldr	x3, [x3,#:lo12:.LANCHOR5+280]
-	ldr	x3, [x3,16]
+	adrp	x0, .LANCHOR5+232
+	mov	x2, x21
+	mov	w1, w20
+	ldr	x0, [x0, #:lo12:.LANCHOR5+232]
+	ldr	x3, [x0, 16]
+	mov	w0, w19
 	blr	x3
-	str	x0, [x29,40]
+	mov	w19, w0
 	bl	rknand_device_unlock
-	ldr	x0, [x29,40]
+	ldr	x21, [sp, 32]
+	mov	w0, w19
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	FlashBootVendorWrite, .-FlashBootVendorWrite
@@ -10468,24 +10134,24 @@ FlashBootVendorWrite:
 	.global	flash_sram_load_store
 	.type	flash_sram_load_store, %function
 flash_sram_load_store:
-	adrp	x4, .LANCHOR5+288
-	mov	x6, x0
 	stp	x29, x30, [sp, -16]!
-	uxtw	x1, w1
+	adrp	x4, .LANCHOR5+240
+	uxtw	x5, w1
 	add	x29, sp, 0
-	ldr	x4, [x4,#:lo12:.LANCHOR5+288]
+	ldr	x4, [x4, #:lo12:.LANCHOR5+240]
 	add	x4, x4, 4096
-	cbnz	w2, .L1636
-	add	x1, x4, x1
-	b	.L1638
-.L1636:
-	add	x0, x4, x1
-	mov	x1, x6
-.L1638:
+	cbnz	w2, .L1635
 	mov	w2, w3
+	add	x1, x4, x5
+.L1638:
 	bl	ftl_memcpy
 	ldp	x29, x30, [sp], 16
 	ret
+.L1635:
+	mov	x1, x0
+	mov	w2, w3
+	add	x0, x4, x5
+	b	.L1638
 	.size	flash_sram_load_store, .-flash_sram_load_store
 	.align	2
 	.global	FlashCs123Init
@@ -10494,86 +10160,388 @@ FlashCs123Init:
 	ret
 	.size	FlashCs123Init, .-FlashCs123Init
 	.align	2
-	.global	rk_ftl_de_init
-	.type	rk_ftl_de_init, %function
-rk_ftl_de_init:
-	stp	x29, x30, [sp, -16]!
-	adrp	x0, .LC139
-	mov	w1, 0
-	add	x29, sp, 0
-	add	x0, x0, :lo12:.LC139
-	bl	printk
-	adrp	x0, .LANCHOR5+280
-	ldr	x0, [x0,#:lo12:.LANCHOR5+280]
-	ldr	x0, [x0,80]
-	blr	x0
-	ldp	x29, x30, [sp], 16
-	ret
-	.size	rk_ftl_de_init, .-rk_ftl_de_init
-	.align	2
-	.global	rk_ftl_cache_write_back
-	.type	rk_ftl_cache_write_back, %function
-rk_ftl_cache_write_back:
-	adrp	x0, .LANCHOR5+280
-	stp	x29, x30, [sp, -16]!
-	add	x29, sp, 0
-	ldr	x0, [x0,#:lo12:.LANCHOR5+280]
-	ldr	x1, [x0,64]
-	mov	w0, 0
-	blr	x1
-	ldp	x29, x30, [sp], 16
-	ret
-	.size	rk_ftl_cache_write_back, .-rk_ftl_cache_write_back
-	.align	2
-	.global	rk_nand_suspend
-	.type	rk_nand_suspend, %function
-rk_nand_suspend:
-	adrp	x0, .LANCHOR5+280
-	stp	x29, x30, [sp, -16]!
-	add	x29, sp, 0
-	ldr	x0, [x0,#:lo12:.LANCHOR5+280]
-	ldr	x0, [x0,88]
-	blr	x0
-	ldp	x29, x30, [sp], 16
-	ret
-	.size	rk_nand_suspend, .-rk_nand_suspend
-	.align	2
-	.global	rk_nand_resume
-	.type	rk_nand_resume, %function
-rk_nand_resume:
-	adrp	x0, .LANCHOR5+280
-	stp	x29, x30, [sp, -16]!
-	add	x29, sp, 0
-	ldr	x0, [x0,#:lo12:.LANCHOR5+280]
-	ldr	x0, [x0,96]
-	blr	x0
-	ldp	x29, x30, [sp], 16
-	ret
-	.size	rk_nand_resume, .-rk_nand_resume
-	.align	2
-	.global	rk_ftl_get_capacity
-	.type	rk_ftl_get_capacity, %function
-rk_ftl_get_capacity:
-	adrp	x0, .LANCHOR5+280
-	stp	x29, x30, [sp, -16]!
+	.global	ftl_dma32_malloc
+	.type	ftl_dma32_malloc, %function
+ftl_dma32_malloc:
+	stp	x29, x30, [sp, -48]!
+	cmp	w0, 8192
 	add	x29, sp, 0
-	ldr	x0, [x0,#:lo12:.LANCHOR5+280]
-	ldr	x1, [x0,72]
-	mov	w0, 0
-	blr	x1
-	ldp	x29, x30, [sp], 16
+	stp	x19, x20, [sp, 16]
+	str	x21, [sp, 32]
+	ble	.L1641
+	bl	ftl_malloc
+.L1640:
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
+	ldp	x29, x30, [sp], 48
 	ret
-	.size	rk_ftl_get_capacity, .-rk_ftl_get_capacity
+.L1641:
+	adrp	x1, .LANCHOR5
+	add	x21, x1, :lo12:.LANCHOR5
+	add	w19, w0, 63
+	mov	x20, x1
+	and	w19, w19, -64
+	ldr	w0, [x21, 248]
+	cmp	w19, w0
+	ble	.L1643
+	mov	w0, 16384
+	bl	ftl_malloc
+	str	x0, [x21, 256]
+	mov	w0, 16384
+	str	w0, [x21, 248]
+.L1643:
+	add	x1, x20, :lo12:.LANCHOR5
+	ldr	w0, [x1, 248]
+	sub	w0, w0, w19
+	str	w0, [x1, 248]
+	ldr	x0, [x1, 256]
+	add	x19, x0, w19, sxtw
+	str	x19, [x1, 256]
+	b	.L1640
+	.size	ftl_dma32_malloc, .-ftl_dma32_malloc
 	.align	2
-	.global	rk_nandc_get_irq_status
-	.type	rk_nandc_get_irq_status, %function
-rk_nandc_get_irq_status:
-	adrp	x1, .LANCHOR5+280
-	stp	x29, x30, [sp, -16]!
+	.global	nandc_init
+	.type	nandc_init, %function
+nandc_init:
+	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	ldr	x1, [x1,#:lo12:.LANCHOR5+280]
-	ldr	x1, [x1,120]
-	blr	x1
+	stp	x21, x22, [sp, 32]
+	adrp	x21, .LANCHOR2
+	mov	x22, x0
+	stp	x19, x20, [sp, 16]
+	ldr	w0, [x21, #:lo12:.LANCHOR2]
+	str	wzr, [x29, 56]
+	tbz	x0, 12, .L1646
+	adrp	x1, .LANCHOR4
+	add	x1, x1, :lo12:.LANCHOR4
+	adrp	x0, .LC136
+	mov	x2, x22
+	add	x1, x1, 136
+	add	x0, x0, :lo12:.LC136
+	bl	printk
+.L1646:
+	adrp	x0, .LANCHOR0
+	add	x1, x0, :lo12:.LANCHOR0
+	ldr	w3, [x22, 352]
+	mov	w2, 6
+	mov	x20, x0
+	strb	w2, [x1, 1028]
+	mov	w2, 12336
+	str	x22, [x1, 1056]
+	movk	w2, 0x5638, lsl 16
+	cmp	w3, w2
+	bne	.L1647
+	mov	w0, 8
+	strb	w0, [x1, 1028]
+.L1647:
+	ldr	w1, [x22, 128]
+	mov	w0, 12336
+	movk	w0, 0x5639, lsl 16
+	cmp	w1, w0
+	bne	.L1648
+	add	x0, x20, :lo12:.LANCHOR0
+	mov	w1, 9
+	strb	w1, [x0, 1028]
+.L1648:
+	add	x19, x20, :lo12:.LANCHOR0
+	ldrb	w0, [x19, 1028]
+	cmp	w0, 9
+	bne	.L1649
+	mov	w0, 1
+	strb	w0, [x19, 1251]
+	ldr	w0, [x29, 56]
+	mov	w1, 2
+	orr	w0, w0, 256
+	str	w0, [x29, 56]
+	ldr	w0, [x29, 56]
+	bfi	w0, w1, 18, 3
+	str	w0, [x29, 56]
+	mov	w1, 4161
+	ldr	w0, [x29, 56]
+	str	w0, [x22]
+	ldr	x0, [x19, 1056]
+	str	wzr, [x0, 520]
+	str	w1, [x0, 4]
+	mov	w1, 8321
+	ldr	x0, [x19, 1056]
+	str	w1, [x0, 8]
+	mov	w1, 4099
+	movk	w1, 0x10, lsl 16
+	str	w1, [x0, 80]
+	mov	w1, 38
+	str	w1, [x0, 84]
+	mov	w1, 39
+	str	w1, [x0, 84]
+	ldr	w1, [x21, #:lo12:.LANCHOR2]
+	tbz	x1, 12, .L1651
+	ldr	w1, [x0]
+	ldr	w2, [x0, 8]
+	ldr	w3, [x0, 80]
+	ldr	w4, [x0, 84]
+	ldr	w5, [x0, 88]
+.L1664:
+	adrp	x0, .LC137
+	add	x0, x0, :lo12:.LC137
+	bl	printk
+.L1651:
+	add	x0, x20, :lo12:.LANCHOR0
+	mov	w1, 1
+	strb	w1, [x0, 1252]
+	ldr	w1, [x21, #:lo12:.LANCHOR2]
+	strh	wzr, [x0, 1296]
+	strb	wzr, [x0, 1249]
+	tbz	x1, 12, .L1645
+	ldrb	w1, [x0, 1028]
+	adrp	x0, .LC138
+	add	x0, x0, :lo12:.LC138
+	bl	printk
+.L1645:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 64
+	ret
+.L1649:
+	ldr	w0, [x29, 56]
+	mov	w1, 1
+	strb	wzr, [x19, 1251]
+	orr	w0, w0, 256
+	str	w0, [x29, 56]
+	ldr	w0, [x29, 56]
+	bfi	w0, w1, 24, 3
+	str	w0, [x29, 56]
+	mov	w1, 4193
+	ldr	w0, [x29, 56]
+	str	w0, [x22]
+	ldr	x0, [x19, 1056]
+	str	wzr, [x0, 336]
+	str	w1, [x0, 4]
+	mov	w1, 8321
+	ldr	x0, [x19, 1056]
+	str	w1, [x0, 344]
+	mov	w1, 4099
+	movk	w1, 0x10, lsl 16
+	str	w1, [x0, 304]
+	mov	w1, 38
+	str	w1, [x0, 308]
+	mov	w1, 39
+	str	w1, [x0, 308]
+	mov	w0, 2048
+	bl	ftl_dma32_malloc
+	str	x0, [x19, 1256]
+	ldr	w0, [x21, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L1651
+	ldr	x0, [x19, 1056]
+	ldr	w1, [x0]
+	ldr	w2, [x0, 344]
+	ldr	w3, [x0, 304]
+	ldr	w4, [x0, 308]
+	ldr	w5, [x0, 312]
+	b	.L1664
+	.size	nandc_init, .-nandc_init
+	.align	2
+	.global	zbuf_init
+	.type	zbuf_init, %function
+zbuf_init:
+	stp	x29, x30, [sp, -48]!
+	adrp	x0, .LANCHOR0
+	add	x29, sp, 0
+	stp	x19, x20, [sp, 16]
+	add	x19, x0, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	add	x19, x19, 1304
+	adrp	x22, .LANCHOR3
+	mov	x20, x0
+	add	x22, x22, :lo12:.LANCHOR3
+	mov	w21, 0
+.L1666:
+	and	w0, w21, 255
+	strb	w0, [x19, 1]
+	add	w1, w0, 1
+	ldrb	w0, [x22, 1946]
+	strb	w1, [x19]
+	add	w21, w21, 1
+	strb	wzr, [x19, 2]
+	add	x19, x19, 64
+	str	xzr, [x19, -48]
+	lsl	w0, w0, 9
+	bl	ftl_dma32_malloc
+	str	x0, [x19, -56]
+	mov	w0, 64
+	bl	ftl_dma32_malloc
+	str	x0, [x19, -40]
+	cmp	w21, 32
+	bne	.L1666
+	add	x0, x20, :lo12:.LANCHOR0
+	mov	w1, -1
+	strb	wzr, [x0, 3352]
+	strb	w1, [x0, 3288]
+	strb	w21, [x0, 3353]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	ret
+	.size	zbuf_init, .-zbuf_init
+	.align	2
+	.global	gc_init
+	.type	gc_init, %function
+gc_init:
+	stp	x29, x30, [sp, -48]!
+	mov	w2, 2216
+	mov	w1, 0
+	add	x29, sp, 0
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR3
+	stp	x21, x22, [sp, 32]
+	add	x19, x19, :lo12:.LANCHOR3
+	adrp	x21, .LANCHOR5
+	add	x21, x21, :lo12:.LANCHOR5
+	adrp	x20, .LANCHOR0
+	add	x20, x20, :lo12:.LANCHOR0
+	add	x22, x20, 3416
+	strb	wzr, [x19, 1337]
+	strb	wzr, [x21, 264]
+	mov	x0, x22
+	strh	wzr, [x19, 1378]
+	str	wzr, [x21, 268]
+	bl	ftl_memset
+	ldrh	w1, [x19, 1376]
+	mov	w0, -1
+	ldrb	w3, [x19, 1321]
+	strh	w0, [x20, 3416]
+	lsr	w0, w1, 2
+	lsr	w2, w1, 1
+	strh	w0, [x20, 3452]
+	strh	w0, [x20, 3402]
+	ldrh	w0, [x19, 1338]
+	strh	w2, [x20, 3454]
+	mul	w2, w1, w3
+	strh	w1, [x20, 3400]
+	mov	w1, 4
+	and	w2, w2, 65535
+	strh	w1, [x21, 272]
+	sub	w4, w2, #32
+	mul	w0, w0, w3
+	strh	w4, [x20, 3404]
+	strh	w2, [x20, 3406]
+	strh	wzr, [x19, 1352]
+	lsl	w0, w0, 2
+	strh	wzr, [x19, 1354]
+	strh	wzr, [x19, 1356]
+	str	xzr, [x20, 3424]
+	bl	ftl_dma32_malloc
+	ldrb	w1, [x19, 1321]
+	str	x0, [x21, 280]
+	ldrh	w0, [x19, 1338]
+	mul	w0, w0, w1
+	lsl	w0, w0, 2
+	bl	ftl_dma32_malloc
+	ldrh	w1, [x19, 1338]
+	str	x0, [x21, 288]
+	ldrb	w0, [x19, 1321]
+	mul	w0, w1, w0
+	bl	ftl_dma32_malloc
+	str	x0, [x19, 1328]
+	ldrb	w1, [x19, 1321]
+	ldrh	w0, [x19, 1338]
+	mul	w0, w0, w1
+	lsl	w0, w0, 2
+	bl	ftl_dma32_malloc
+	ldrb	w1, [x19, 1321]
+	str	x0, [x19, 1312]
+	ldrh	w0, [x19, 1338]
+	mul	w0, w0, w1
+	lsl	w0, w0, 2
+	bl	ftl_dma32_malloc
+	str	x0, [x21, 296]
+	ldrh	w0, [x19, 1380]
+	ldp	x21, x22, [sp, 32]
+	lsr	w0, w0, 2
+	strh	w0, [x20, 3392]
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 48
+	ret
+	.size	gc_init, .-gc_init
+	.align	2
+	.global	rk_ftl_de_init
+	.type	rk_ftl_de_init, %function
+rk_ftl_de_init:
+	stp	x29, x30, [sp, -16]!
+	mov	w1, 0
+	adrp	x0, .LC139
+	add	x0, x0, :lo12:.LC139
+	add	x29, sp, 0
+	bl	printk
+	adrp	x0, .LANCHOR5+232
+	ldr	x0, [x0, #:lo12:.LANCHOR5+232]
+	ldr	x0, [x0, 80]
+	blr	x0
+	ldp	x29, x30, [sp], 16
+	ret
+	.size	rk_ftl_de_init, .-rk_ftl_de_init
+	.align	2
+	.global	rk_ftl_cache_write_back
+	.type	rk_ftl_cache_write_back, %function
+rk_ftl_cache_write_back:
+	stp	x29, x30, [sp, -16]!
+	adrp	x0, .LANCHOR5+232
+	add	x29, sp, 0
+	ldr	x0, [x0, #:lo12:.LANCHOR5+232]
+	ldr	x1, [x0, 64]
+	mov	w0, 0
+	blr	x1
+	ldp	x29, x30, [sp], 16
+	ret
+	.size	rk_ftl_cache_write_back, .-rk_ftl_cache_write_back
+	.align	2
+	.global	rk_nand_suspend
+	.type	rk_nand_suspend, %function
+rk_nand_suspend:
+	stp	x29, x30, [sp, -16]!
+	adrp	x0, .LANCHOR5+232
+	add	x29, sp, 0
+	ldr	x0, [x0, #:lo12:.LANCHOR5+232]
+	ldr	x0, [x0, 88]
+	blr	x0
+	ldp	x29, x30, [sp], 16
+	ret
+	.size	rk_nand_suspend, .-rk_nand_suspend
+	.align	2
+	.global	rk_nand_resume
+	.type	rk_nand_resume, %function
+rk_nand_resume:
+	stp	x29, x30, [sp, -16]!
+	adrp	x0, .LANCHOR5+232
+	add	x29, sp, 0
+	ldr	x0, [x0, #:lo12:.LANCHOR5+232]
+	ldr	x0, [x0, 96]
+	blr	x0
+	ldp	x29, x30, [sp], 16
+	ret
+	.size	rk_nand_resume, .-rk_nand_resume
+	.align	2
+	.global	rk_ftl_get_capacity
+	.type	rk_ftl_get_capacity, %function
+rk_ftl_get_capacity:
+	stp	x29, x30, [sp, -16]!
+	adrp	x0, .LANCHOR5+232
+	add	x29, sp, 0
+	ldr	x0, [x0, #:lo12:.LANCHOR5+232]
+	ldr	x1, [x0, 72]
+	mov	w0, 0
+	blr	x1
+	ldp	x29, x30, [sp], 16
+	ret
+	.size	rk_ftl_get_capacity, .-rk_ftl_get_capacity
+	.align	2
+	.global	rk_nandc_get_irq_status
+	.type	rk_nandc_get_irq_status, %function
+rk_nandc_get_irq_status:
+	stp	x29, x30, [sp, -16]!
+	adrp	x1, .LANCHOR5+232
+	add	x29, sp, 0
+	ldr	x1, [x1, #:lo12:.LANCHOR5+232]
+	ldr	x1, [x1, 120]
+	blr	x1
 	ldp	x29, x30, [sp], 16
 	ret
 	.size	rk_nandc_get_irq_status, .-rk_nandc_get_irq_status
@@ -10581,11 +10549,11 @@ rk_nandc_get_irq_status:
 	.global	rknand_proc_ftlread
 	.type	rknand_proc_ftlread, %function
 rknand_proc_ftlread:
-	adrp	x1, .LANCHOR5+280
 	stp	x29, x30, [sp, -16]!
+	adrp	x1, .LANCHOR5+232
 	add	x29, sp, 0
-	ldr	x1, [x1,#:lo12:.LANCHOR5+280]
-	ldr	x1, [x1,128]
+	ldr	x1, [x1, #:lo12:.LANCHOR5+232]
+	ldr	x1, [x1, 128]
 	blr	x1
 	ldp	x29, x30, [sp], 16
 	ret
@@ -10594,12 +10562,12 @@ rknand_proc_ftlread:
 	.global	FtlRead
 	.type	FtlRead, %function
 FtlRead:
-	adrp	x4, .LANCHOR5+280
-	uxtb	w0, w0
 	stp	x29, x30, [sp, -16]!
+	adrp	x4, .LANCHOR5+232
+	and	w0, w0, 255
 	add	x29, sp, 0
-	ldr	x4, [x4,#:lo12:.LANCHOR5+280]
-	ldr	x4, [x4,40]
+	ldr	x4, [x4, #:lo12:.LANCHOR5+232]
+	ldr	x4, [x4, 40]
 	blr	x4
 	ldp	x29, x30, [sp], 16
 	ret
@@ -10608,11 +10576,11 @@ FtlRead:
 	.global	FtlDiscard
 	.type	FtlDiscard, %function
 FtlDiscard:
-	adrp	x2, .LANCHOR5+280
 	stp	x29, x30, [sp, -16]!
+	adrp	x2, .LANCHOR5+232
 	add	x29, sp, 0
-	ldr	x2, [x2,#:lo12:.LANCHOR5+280]
-	ldr	x2, [x2,56]
+	ldr	x2, [x2, #:lo12:.LANCHOR5+232]
+	ldr	x2, [x2, 56]
 	blr	x2
 	ldp	x29, x30, [sp], 16
 	ret
@@ -10621,11 +10589,11 @@ FtlDiscard:
 	.global	rk_ftl_garbage_collect
 	.type	rk_ftl_garbage_collect, %function
 rk_ftl_garbage_collect:
-	adrp	x2, .LANCHOR5+280
 	stp	x29, x30, [sp, -16]!
+	adrp	x2, .LANCHOR5+232
 	add	x29, sp, 0
-	ldr	x2, [x2,#:lo12:.LANCHOR5+280]
-	ldr	x2, [x2,104]
+	ldr	x2, [x2, #:lo12:.LANCHOR5+232]
+	ldr	x2, [x2, 104]
 	blr	x2
 	ldp	x29, x30, [sp], 16
 	ret
@@ -10634,11 +10602,11 @@ rk_ftl_garbage_collect:
 	.global	ReadFlashInfo
 	.type	ReadFlashInfo, %function
 ReadFlashInfo:
-	adrp	x1, .LANCHOR5+280
 	stp	x29, x30, [sp, -16]!
+	adrp	x1, .LANCHOR5+232
 	add	x29, sp, 0
-	ldr	x1, [x1,#:lo12:.LANCHOR5+280]
-	ldr	x1, [x1,112]
+	ldr	x1, [x1, #:lo12:.LANCHOR5+232]
+	ldr	x1, [x1, 112]
 	blr	x1
 	ldp	x29, x30, [sp], 16
 	ret
@@ -10647,18 +10615,17 @@ ReadFlashInfo:
 	.global	rknand_print_hex
 	.type	rknand_print_hex, %function
 rknand_print_hex:
-	stp	x29, x30, [sp, -16]!
 	mul	w6, w2, w3
-	mov	x7, x0
+	stp	x29, x30, [sp, -16]!
+	mov	x5, x1
 	mov	w4, w2
-	adrp	x0, .LC140
-	mov	w2, 0
 	add	x29, sp, 0
-	mov	x5, x1
-	add	x0, x0, :lo12:.LC140
-	mov	x1, x7
+	mov	x1, x0
+	mov	w7, 0
 	mov	w3, 16
-	mov	w7, w2
+	mov	w2, 0
+	adrp	x0, .LC140
+	add	x0, x0, :lo12:.LC140
 	bl	print_hex_dump
 	ldp	x29, x30, [sp], 16
 	ret
@@ -10668,589 +10635,590 @@ rknand_print_hex:
 	.type	hynix_get_read_retry_default, %function
 hynix_get_read_retry_default:
 	stp	x29, x30, [sp, -144]!
-	adrp	x3, .LANCHOR0
-	mov	w2, -83
-	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	mov	w19, w0
-	add	x0, x3, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	stp	x23, x24, [sp,48]
-	stp	x27, x28, [sp,80]
+	mov	w4, -83
 	mov	w1, -82
-	cmp	w19, 2
-	ldr	x25, [x0,1128]
+	add	x29, sp, 0
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR0
+	stp	x23, x24, [sp, 48]
+	mov	w23, w0
+	add	x0, x20, :lo12:.LANCHOR0
+	stp	x25, x26, [sp, 64]
+	stp	x21, x22, [sp, 32]
+	cmp	w23, 2
+	stp	x27, x28, [sp, 80]
+	ldr	x26, [x0, 1048]
+	add	x0, x26, 112
+	str	x0, [x29, 136]
 	mov	w0, -84
-	str	x3, [x29,136]
-	add	x26, x25, 128
-	add	x22, x25, 112
-	strb	w0, [x25,128]
+	add	x25, x26, 128
+	strb	w0, [x26, 128]
 	mov	w0, -81
-	strb	w19, [x25,112]
-	strb	w2, [x25,129]
-	strb	w1, [x25,130]
-	strb	w0, [x25,131]
-	bne	.L1653
+	strb	w23, [x26, 112]
+	strb	w4, [x26, 129]
+	strb	w1, [x26, 130]
+	strb	w0, [x26, 131]
+	bne	.L1696
 	mov	w0, -89
-	strb	w0, [x22,16]
+	strb	w0, [x26, 128]
 	adrp	x0, .LANCHOR2+425
 	mov	w1, -9
-	strb	w1, [x0,#:lo12:.LANCHOR2+425]
-	b	.L1716
-.L1653:
-	cmp	w19, 3
-	bne	.L1655
-	mov	x5, 0
-.L1656:
-	sub	w0, w5, #80
-	strb	w0, [x26,x5]
-	add	x5, x5, 1
-	cmp	x5, 8
-	bne	.L1656
-	mov	w27, w5
-	mov	w28, w5
-	b	.L1654
-.L1655:
-	cmp	w19, 4
-	bne	.L1657
+	strb	w1, [x0, #:lo12:.LANCHOR2+425]
+.L1761:
+	mov	w28, 7
+	b	.L1806
+.L1696:
+	cmp	w23, 3
+	bne	.L1698
+	mov	x4, 0
+.L1699:
+	sub	w0, w4, #80
+	strb	w0, [x25, x4]
+	add	x4, x4, 1
+	cmp	x4, 8
+	bne	.L1699
+	mov	w28, w4
+	mov	w27, w4
+.L1697:
+	sub	w0, w23, #1
+	cmp	w0, 1
+	bhi	.L1705
+	add	x20, x20, :lo12:.LANCHOR0
+	adrp	x21, .LANCHOR2
+	add	x21, x21, :lo12:.LANCHOR2
+	add	x23, x20, 1024
+	add	x21, x21, 408
+	mov	w26, 0
+.L1706:
+	ldrb	w0, [x20, 1153]
+	cmp	w0, w26
+	bhi	.L1712
+.L1713:
+	ldr	x0, [x29, 136]
+	strb	w27, [x0, 1]
+	strb	w28, [x0, 2]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 144
+	ret
+.L1698:
+	cmp	w23, 4
+	bne	.L1700
 	mov	w5, -52
-	strb	w5, [x25,128]
+	strb	w5, [x26, 128]
 	mov	w5, -65
-	strb	w5, [x25,129]
+	strb	w5, [x26, 129]
 	mov	w5, -86
-	mov	w27, 8
-	strb	w5, [x25,130]
+	strb	w5, [x26, 130]
 	mov	w5, -85
-	strb	w2, [x25,133]
-	mov	w28, w27
-	strb	w5, [x25,131]
+	mov	w28, 8
+	strb	w5, [x26, 131]
+	mov	w27, w28
 	mov	w5, -51
-	strb	w1, [x25,134]
-	strb	w5, [x25,132]
-	strb	w0, [x25,135]
-	b	.L1654
-.L1657:
-	cmp	w19, 5
-	bne	.L1658
+	strb	w4, [x26, 133]
+	strb	w5, [x26, 132]
+	strb	w1, [x26, 134]
+	strb	w0, [x26, 135]
+	b	.L1697
+.L1700:
+	cmp	w23, 5
+	bne	.L1701
 	mov	w0, 56
-	strb	w0, [x25,128]
+	strb	w0, [x26, 128]
 	mov	w0, 57
-	strb	w0, [x25,129]
+	strb	w0, [x26, 129]
 	mov	w0, 58
-	mov	w27, 8
-	strb	w0, [x25,130]
+	mov	w28, 8
+	strb	w0, [x26, 130]
 	mov	w0, 59
-	strb	w0, [x25,131]
-	b	.L1758
-.L1658:
-	cmp	w19, 6
-	bne	.L1659
+	strb	w0, [x26, 131]
+.L1806:
+	mov	w27, 4
+	b	.L1697
+.L1701:
+	cmp	w23, 6
+	bne	.L1702
 	mov	w0, 14
-	strb	w0, [x25,128]
+	strb	w0, [x26, 128]
 	mov	w0, 15
-	strb	w0, [x25,129]
+	strb	w0, [x26, 129]
 	mov	w0, 16
-	mov	w27, 12
-	strb	w0, [x25,130]
+	mov	w28, 12
+	strb	w0, [x26, 130]
 	mov	w0, 17
-	strb	w0, [x25,131]
-	b	.L1758
-.L1659:
-	cmp	w19, 7
-	bne	.L1660
+	strb	w0, [x26, 131]
+	b	.L1806
+.L1702:
+	cmp	w23, 7
+	bne	.L1703
 	mov	x0, 0
-.L1661:
+.L1704:
 	sub	w1, w0, #80
-	strb	w1, [x26,x0]
+	strb	w1, [x25, x0]
 	add	x0, x0, 1
 	cmp	x0, 8
-	bne	.L1661
+	bne	.L1704
 	mov	w0, -44
-	mov	w27, 12
-	strb	w0, [x25,136]
-	mov	w28, 10
+	mov	w28, 12
+	strb	w0, [x26, 136]
+	mov	w27, 10
 	mov	w0, -43
-	strb	w0, [x25,137]
-	b	.L1654
-.L1660:
-	cmp	w19, 8
-	bne	.L1716
+	strb	w0, [x26, 137]
+	b	.L1697
+.L1703:
+	cmp	w23, 8
+	bne	.L1761
 	mov	w0, 6
-	strb	w0, [x25,128]
+	strb	w0, [x26, 128]
 	mov	w0, 7
-	strb	w0, [x25,129]
+	strb	w0, [x26, 129]
 	mov	w0, 9
-	strb	w19, [x25,130]
-	strb	w0, [x25,131]
-	mov	w27, 50
+	strb	w23, [x26, 130]
+	strb	w0, [x26, 131]
+	mov	w28, 50
 	mov	w0, 10
-	mov	w28, 5
-	strb	w0, [x25,132]
-	b	.L1654
-.L1716:
-	mov	w27, 7
-.L1758:
-	mov	w28, 4
-.L1654:
-	sub	w0, w19, #1
-	cmp	w0, 1
-	bhi	.L1755
-	ldr	x0, [x29,136]
-	adrp	x24, .LANCHOR2
-	add	x24, x24, :lo12:.LANCHOR2
-	mov	w23, 0
-	add	x19, x0, :lo12:.LANCHOR0
-	mov	w5, 55
-	add	x24, x24, 408
-.L1662:
-	ldrb	w0, [x19,1153]
-	cmp	w0, w23
-	bls	.L1669
-	add	x0, x19, w23, sxtw
-	ldrb	w0, [x0,1248]
-	mov	x20, 160
-	ldr	x21, [x19,1048]
-	ubfiz	x1, x0, 8, 8
-	mov	x25, 0
-	madd	x20, x0, x20, x22
-	add	x21, x21, x1
-	add	x20, x20, 32
-.L1664:
-	str	w5, [x21,2056]
-	str	x5, [x29,136]
-	ldrb	w0, [x26,x25]
-	str	w0, [x21,2052]
+	mov	w27, 5
+	strb	w0, [x26, 132]
+	b	.L1697
+.L1712:
+	add	x0, x23, w26, sxtw
+	mov	x1, 32
+	mov	w19, 160
+	ldr	x24, [x20, 1056]
+	mov	x22, 0
+	ldrb	w0, [x0, 172]
+	umaddl	x19, w19, w0, x1
+	ldr	x1, [x29, 136]
+	ubfiz	x0, x0, 8, 8
+	add	x24, x24, x0
+	add	x19, x1, x19
+	mov	w1, 55
+.L1707:
+	str	w1, [x24, 2056]
+	str	w1, [x29, 132]
+	ldrb	w0, [x25, x22]
+	str	w0, [x24, 2052]
 	mov	x0, 1000
 	bl	__const_udelay
-	ldr	w0, [x21,2048]
-	strb	w0, [x20,x25]
-	add	x25, x25, 1
-	ldr	x5, [x29,136]
-	cmp	w28, w25, uxtb
-	bhi	.L1664
+	ldr	w0, [x24, 2048]
+	strb	w0, [x19, x22]
+	add	x22, x22, 1
+	cmp	w27, w22, uxtb
+	ldr	w1, [x29, 132]
+	bhi	.L1707
 	mov	x0, 0
-.L1665:
-	add	w2, w0, 8
-	mov	x1, 0
-.L1666:
-	add	x3, x1, x0
-	add	x1, x1, 4
-	add	x3, x24, x3
-	cmp	x1, 24
-	ldrb	w4, [x3,4]
-	ldrb	w3, [x20,x0]
-	add	w3, w4, w3
-	strb	w3, [x20,w2,sxtw]
-	add	w2, w2, 8
-	bne	.L1666
+.L1710:
+	add	x1, x0, 4
+	add	x2, x0, 28
+	add	w3, w0, 8
+	add	x1, x21, x1
+	add	x2, x21, x2
+.L1709:
+	ldrb	w7, [x1], 4
+	ldrb	w6, [x19, x0]
+	cmp	x2, x1
+	add	w6, w6, w7
+	strb	w6, [x19, w3, sxtw]
+	add	w3, w3, 8
+	bne	.L1709
 	add	x0, x0, 1
 	cmp	x0, 4
-	bne	.L1665
-	add	w23, w23, 1
-	strb	wzr, [x20,16]
-	strb	wzr, [x20,24]
-	strb	wzr, [x20,32]
-	uxtb	w23, w23
-	strb	wzr, [x20,40]
-	strb	wzr, [x20,48]
-	strb	wzr, [x20,41]
-	strb	wzr, [x20,49]
-	b	.L1662
-.L1755:
-	sub	w0, w19, #3
+	bne	.L1710
+	add	w26, w26, 1
+	strb	wzr, [x19, 16]
+	strb	wzr, [x19, 24]
+	and	w26, w26, 255
+	strb	wzr, [x19, 32]
+	strb	wzr, [x19, 40]
+	strb	wzr, [x19, 48]
+	strb	wzr, [x19, 41]
+	strb	wzr, [x19, 49]
+	b	.L1706
+.L1705:
+	sub	w0, w23, #3
 	cmp	w0, 5
-	bhi	.L1669
-	mul	w0, w28, w27
-	sub	w24, w28, #1
-	mov	w20, 0
-	asr	w23, w0, 1
+	bhi	.L1713
+	mul	w0, w27, w28
+	add	x20, x20, :lo12:.LANCHOR0
+	sub	w25, w27, #1
+	mov	w21, 0
+	and	x25, x25, 255
+	asr	w24, w0, 1
 	lsl	w0, w0, 4
-	str	w0, [x29,128]
-	lsl	w0, w23, 1
-	uxtb	x24, w24
-	str	w0, [x29,124]
-	sub	w0, w19, #5
-	adrp	x26, .LANCHOR5
-	str	w0, [x29,132]
-	add	x0, x24, 1
-	str	x0, [x29,112]
-.L1670:
-	ldr	x0, [x29,136]
-	add	x1, x0, :lo12:.LANCHOR0
-	ldrb	w0, [x1,1153]
-	cmp	w0, w20
-	bhi	.L1715
-.L1669:
-	strb	w28, [x22,1]
-	strb	w27, [x22,2]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 144
-	ret
-.L1715:
-	add	x0, x1, w20, sxtw
-	ldrb	w24, [x0,1248]
-	str	x1, [x29,104]
-	mov	x21, 160
-	mov	w0, w24
+	str	w0, [x29, 128]
+	lsl	w0, w24, 1
+	str	w0, [x29, 132]
+	add	x0, x20, 1024
+	str	x0, [x29, 120]
+	add	x0, x25, 1
+	str	x0, [x29, 112]
+.L1714:
+	ldrb	w0, [x20, 1153]
+	cmp	w0, w21
+	bls	.L1713
+	ldr	x0, [x29, 120]
+	mov	w22, 160
+	sub	w25, w23, #5
+	add	x0, x0, w21, sxtw
+	ldrb	w19, [x0, 172]
+	mov	w0, w19
 	bl	zftl_flash_exit_slc_mode
-	ldr	x1, [x29,104]
-	sxtw	x0, w24
-	ubfiz	x2, x24, 8, 8
-	madd	x21, x0, x21, x22
-	ldr	x0, [x1,1048]
+	mov	x0, 32
 	mov	w1, 255
-	str	x1, [x29,104]
-	add	x21, x21, 32
-	add	x24, x0, x2
-	str	w1, [x24,2056]
+	str	w1, [x29, 108]
+	nop // between mem op and mult-accumulate
+	umaddl	x22, w22, w19, x0
+	ldr	x0, [x29, 136]
+	ubfiz	x19, x19, 8, 8
+	add	x22, x0, x22
+	ldr	x0, [x20, 1056]
+	add	x19, x0, x19
+	str	w1, [x19, 2056]
 	bl	nandc_wait_flash_ready
-	cmp	w19, 8
-	ldr	x1, [x29,104]
-	bne	.L1671
+	cmp	w23, 8
+	ldr	w1, [x29, 108]
+	bne	.L1715
 	mov	w0, 120
-	str	w0, [x24,2056]
-	str	wzr, [x24,2052]
+	str	w0, [x19, 2056]
+	str	wzr, [x19, 2052]
 	mov	w0, 23
-	str	wzr, [x24,2052]
+	str	wzr, [x19, 2052]
 	mov	w1, 25
-	str	wzr, [x24,2052]
-	add	x21, x25, 144
-	str	w0, [x24,2056]
+	str	wzr, [x19, 2052]
+	add	x22, x26, 144
+	str	w0, [x19, 2056]
 	mov	w0, 4
-	str	w0, [x24,2056]
-	str	w1, [x24,2056]
+	str	w0, [x19, 2056]
+	str	w1, [x19, 2056]
 	mov	w1, 218
-	str	w1, [x24,2056]
+	str	w1, [x19, 2056]
 	mov	w1, 21
-	str	wzr, [x24,2056]
-	str	wzr, [x24,2052]
-	str	wzr, [x24,2052]
-	str	w1, [x24,2052]
-	b	.L1761
-.L1671:
+	str	wzr, [x19, 2056]
+	str	wzr, [x19, 2052]
+	str	wzr, [x19, 2052]
+	str	w1, [x19, 2052]
+.L1809:
+	str	w0, [x19, 2052]
+	mov	w0, 48
+	str	wzr, [x19, 2052]
+	str	w0, [x19, 2056]
+	bl	nandc_wait_flash_ready
+	cmp	w25, 1
+	ccmp	w23, 8, 4, hi
+	beq	.L1762
+	cmp	w23, 7
+	mov	w0, 32
+	mov	w1, 2
+	csel	w1, w1, w0, ne
+.L1722:
+	adrp	x8, .LANCHOR5
+	add	x0, x8, :lo12:.LANCHOR5
+	mov	x7, 0
+	ldr	x0, [x0, 304]
+.L1723:
+	ldr	w9, [x19, 2048]
+	strb	w9, [x0, x7]
+	add	x7, x7, 1
+	cmp	w1, w7, uxtb
+	bhi	.L1723
+	cmp	w23, 8
+	bne	.L1724
+	mov	w1, 0
+.L1726:
+	ldrb	w7, [x0]
+	cmp	w7, 50
+	beq	.L1725
+	ldrb	w7, [x0, 1]
+	cmp	w7, 5
+	beq	.L1725
+	add	w1, w1, 1
+	add	x0, x0, 4
+	and	w1, w1, 255
+	cmp	w1, 8
+	bne	.L1726
+.L1727:
+	adrp	x0, .LC141
+	mov	w1, 0
+	add	x0, x0, :lo12:.LC141
+	bl	printk
+.L1729:
+	b	.L1729
+.L1715:
 	mov	w0, 54
-	cmp	w19, 4
-	str	w0, [x24,2056]
-	bne	.L1673
+	str	w0, [x19, 2056]
+	cmp	w23, 4
+	bne	.L1717
 	mov	w0, 64
-	str	w1, [x24,2052]
-	str	w0, [x24,2048]
+	str	w1, [x19, 2052]
+	str	w0, [x19, 2048]
 	mov	w0, 204
-	b	.L1759
-.L1673:
-	ldr	w0, [x29,132]
-	cmp	w0, 1
-	bhi	.L1675
-	ldrb	w0, [x25,128]
-	str	w0, [x24,2052]
-	mov	w0, 82
-	b	.L1760
-.L1675:
-	cmp	w19, 7
-	bne	.L1674
-	mov	w0, 174
-	str	w0, [x24,2052]
-	str	wzr, [x24,2048]
-	mov	w0, 176
-.L1759:
-	str	w0, [x24,2052]
+.L1807:
+	str	w0, [x19, 2052]
 	mov	w0, 77
-.L1760:
-	str	w0, [x24,2048]
-.L1674:
+	b	.L1808
+.L1717:
+	cmp	w25, 1
+	bhi	.L1719
+	ldrb	w0, [x26, 128]
+	str	w0, [x19, 2052]
+	mov	w0, 82
+.L1808:
+	str	w0, [x19, 2048]
+.L1718:
 	mov	w0, 22
-	str	w0, [x24,2056]
+	str	w0, [x19, 2056]
 	mov	w0, 23
-	str	w0, [x24,2056]
+	str	w0, [x19, 2056]
 	mov	w0, 4
-	str	w0, [x24,2056]
+	str	w0, [x19, 2056]
 	mov	w0, 25
-	str	w0, [x24,2056]
-	str	wzr, [x24,2056]
-	cmp	w19, 6
-	str	wzr, [x24,2052]
-	str	wzr, [x24,2052]
-	bne	.L1676
+	str	w0, [x19, 2056]
+	str	wzr, [x19, 2056]
+	cmp	w23, 6
+	str	wzr, [x19, 2052]
+	str	wzr, [x19, 2052]
+	bne	.L1720
 	mov	w0, 31
-	str	w0, [x24,2052]
-	b	.L1677
-.L1676:
-	str	wzr, [x24,2052]
-.L1677:
-	mov	w0, 2
-.L1761:
-	str	w0, [x24,2052]
-	mov	w0, 48
-	str	wzr, [x24,2052]
-	str	w0, [x24,2056]
-	bl	nandc_wait_flash_ready
-	ldr	w0, [x29,132]
-	cmp	w0, 1
-	cset	w8, ls
-	cmp	w19, 8
-	cset	w7, eq
-	cbnz	w8, .L1718
-	cbnz	w7, .L1718
-	cmp	w19, 7
-	mov	w1, 32
+	str	w0, [x19, 2052]
+.L1721:
 	mov	w0, 2
-	csel	w1, w0, w1, ne
-	b	.L1678
-.L1718:
+	b	.L1809
+.L1719:
+	cmp	w23, 7
+	bne	.L1718
+	mov	w0, 174
+	str	w0, [x19, 2052]
+	str	wzr, [x19, 2048]
+	mov	w0, 176
+	b	.L1807
+.L1720:
+	str	wzr, [x19, 2052]
+	b	.L1721
+.L1762:
 	mov	w1, 16
-.L1678:
-	adrp	x0, .LANCHOR5
-	mov	x9, 0
-	add	x0, x0, :lo12:.LANCHOR5
-	ldr	x0, [x0,296]
-.L1679:
-	ldr	w10, [x24,2048]
-	strb	w10, [x0,x9]
-	add	x9, x9, 1
-	cmp	w1, w9, uxtb
-	bhi	.L1679
-	cbz	w7, .L1680
+	b	.L1722
+.L1725:
+	cmp	w1, 6
+	bhi	.L1727
+.L1728:
+	add	x0, x8, :lo12:.LANCHOR5
+	ldr	x10, [x0, 304]
+	mov	x0, 0
+.L1738:
+	ldr	w1, [x29, 128]
+	cmp	w1, w0
+	bgt	.L1739
+	add	x0, x8, :lo12:.LANCHOR5
+	mov	w9, w24
+	mov	w7, 8
+	ldr	x11, [x0, 304]
+.L1741:
+	mov	w0, 0
+.L1740:
+	add	w1, w0, w9
+	add	w0, w0, 1
+	sbfiz	x1, x1, 1, 32
+	cmp	w24, w0
+	ldrh	w12, [x11, x1]
+	mvn	w12, w12
+	strh	w12, [x11, x1]
+	bgt	.L1740
+	ldr	w0, [x29, 132]
+	subs	w7, w7, #1
+	add	w9, w9, w0
+	bne	.L1741
+	mov	x7, 0
+	mov	w15, 1
+.L1747:
 	mov	w1, 0
-.L1682:
-	ldrb	w9, [x0]
-	cmp	w9, 50
-	beq	.L1681
-	ldrb	w9, [x0,1]
-	cmp	w9, 5
-	beq	.L1681
-	add	w1, w1, 1
+	mov	w0, 0
+.L1746:
+	mov	w13, w7
+	lsl	w14, w15, w0
+	mov	w9, 16
+	mov	w12, 0
+.L1744:
+	ldrh	w16, [x11, w13, sxtw 1]
+	add	w13, w13, w24
+	bics	wzr, w14, w16
+	cinc	w12, w12, eq
+	subs	w9, w9, #1
+	bne	.L1744
+	cmp	w12, 8
+	bls	.L1745
+	orr	w1, w1, w14
+	and	w1, w1, 65535
+.L1745:
+	add	w0, w0, 1
+	cmp	w0, 16
+	bne	.L1746
+	strh	w1, [x11, x7, lsl 1]
+	add	x7, x7, 1
+	cmp	w24, w7
+	bgt	.L1747
+	add	x0, x8, :lo12:.LANCHOR5
+	mov	w7, 0
+	ldr	x1, [x0, 304]
+	mov	x0, 0
+.L1750:
+	ldr	w8, [x1, x0]
 	add	x0, x0, 4
-	uxtb	w1, w1
-	cmp	w1, 8
-	bne	.L1682
-	b	.L1683
-.L1681:
-	cmp	w1, 7
-	bne	.L1684
-.L1683:
+	cmp	w8, 0
+	cinc	w7, w7, eq
+	cmp	x0, 32
+	bne	.L1750
+	cmp	w7, 7
+	ble	.L1751
+	mov	w3, 1024
+	mov	w2, 1
+	adrp	x0, .LC142
+	add	x0, x0, :lo12:.LC142
+	bl	rknand_print_hex
 	adrp	x0, .LC141
 	mov	w1, 0
 	add	x0, x0, :lo12:.LC141
 	bl	printk
-.L1685:
-	b	.L1685
-.L1680:
-	cmp	w19, 7
-	bne	.L1686
-	mov	w1, w7
-.L1688:
-	ldrb	w9, [x0]
-	cmp	w9, 12
-	beq	.L1687
-	ldrb	w9, [x0,1]
-	cmp	w9, 10
-	beq	.L1687
+.L1752:
+	b	.L1752
+.L1724:
+	cmp	w23, 7
+	bne	.L1730
+	mov	w1, 0
+.L1732:
+	ldrb	w7, [x0]
+	cmp	w7, 12
+	beq	.L1731
+	ldrb	w7, [x0, 1]
+	cmp	w7, 10
+	beq	.L1731
 	add	w1, w1, 1
 	add	x0, x0, 4
-	uxtb	w1, w1
+	and	w1, w1, 255
 	cmp	w1, 8
-	bne	.L1688
-	b	.L1689
-.L1687:
-	cmp	w1, 7
-	bne	.L1684
-.L1689:
+	bne	.L1732
+.L1733:
 	adrp	x0, .LC141
 	mov	w1, 0
 	add	x0, x0, :lo12:.LC141
 	bl	printk
-.L1690:
-	b	.L1690
-.L1686:
-	cmp	w19, 6
-	bne	.L1684
+.L1734:
+	b	.L1734
+.L1731:
+	cmp	w1, 6
+	bls	.L1728
+	b	.L1733
+.L1730:
+	cmp	w23, 6
+	bne	.L1728
 	mov	x1, 0
-.L1691:
-	ldrb	w9, [x0,x1]
-	cmp	w9, 12
-	beq	.L1684
-	add	x9, x0, x1
-	ldrb	w9, [x9,8]
-	cmp	w9, 4
-	beq	.L1684
+.L1735:
+	ldrb	w7, [x0, x1]
+	cmp	w7, 12
+	beq	.L1728
+	add	x7, x0, x1
+	ldrb	w7, [x7, 8]
+	cmp	w7, 4
+	beq	.L1728
 	add	x1, x1, 1
 	cmp	x1, 8
-	bne	.L1691
+	bne	.L1735
 	adrp	x0, .LC141
 	mov	w1, 0
 	add	x0, x0, :lo12:.LC141
 	bl	printk
-.L1693:
-	b	.L1693
-.L1684:
-	add	x0, x26, :lo12:.LANCHOR5
-	ldr	x10, [x0,296]
-	mov	x0, 0
-.L1694:
-	ldr	w1, [x29,128]
-	cmp	w1, w0
-	ble	.L1763
-	ldr	w1, [x24,2048]
-	strb	w1, [x10,x0]
+.L1737:
+	b	.L1737
+.L1739:
+	ldr	w1, [x19, 2048]
+	strb	w1, [x10, x0]
 	add	x0, x0, 1
-	b	.L1694
-.L1763:
-	add	x0, x26, :lo12:.LANCHOR5
-	mov	w11, w23
-	mov	w9, 8
-	ldr	x12, [x0,296]
-.L1697:
-	mov	w0, 0
-.L1696:
-	add	w1, w0, w11
-	add	w0, w0, 1
-	sbfiz	x1, x1, 1, 32
-	cmp	w0, w23
-	ldrh	w13, [x12,x1]
-	mvn	w13, w13
-	strh	w13, [x12,x1]
-	bne	.L1696
-	ldr	w0, [x29,124]
-	subs	w9, w9, #1
-	add	w11, w11, w0
-	bne	.L1697
-	mov	x9, 0
-	mov	w17, 1
-.L1698:
-	mov	w1, 0
-	mov	w11, w1
-.L1702:
-	lsl	w13, w17, w11
-	mov	w15, w9
-	mov	w0, 16
-	mov	w14, 0
-.L1700:
-	ldrh	w16, [x12,w15,sxtw 1]
-	add	w15, w15, w23
-	and	w16, w16, w13
-	cmp	w16, w13
-	csinc	w14, w14, w14, ne
-	subs	w0, w0, #1
-	bne	.L1700
-	cmp	w14, 8
-	bls	.L1701
-	orr	w1, w1, w13
-	uxth	w1, w1
-.L1701:
-	add	w11, w11, 1
-	cmp	w11, 16
-	bne	.L1702
-	strh	w1, [x12,x9,lsl 1]
-	add	x9, x9, 1
-	cmp	w23, w9
-	bgt	.L1698
-	add	x1, x26, :lo12:.LANCHOR5
-	mov	x9, 0
-	mov	w11, w9
-	ldr	x1, [x1,296]
-.L1705:
-	ldr	w12, [x1,x9]
-	add	x9, x9, 4
-	cmp	w12, wzr
-	csinc	w11, w11, w11, ne
-	cmp	x9, 32
-	bne	.L1705
-	cmp	w11, 7
-	ble	.L1706
-	adrp	x0, .LC142
-	mov	w2, 1
-	add	x0, x0, :lo12:.LC142
-	mov	w3, 1024
-	bl	rknand_print_hex
-	adrp	x0, .LC141
-	mov	w1, 0
-	add	x0, x0, :lo12:.LC141
-	bl	printk
-.L1707:
-	b	.L1707
-.L1706:
-	cmp	w19, 6
-	mov	w9, 4
-	beq	.L1708
-	cmp	w19, 7
-	mov	w9, 10
-	beq	.L1708
-	cmp	w7, wzr
-	mov	w9, 5
+	b	.L1738
+.L1751:
+	cmp	w23, 6
+	beq	.L1764
+	cmp	w23, 7
+	beq	.L1765
+	cmp	w23, 8
+	mov	w0, 5
 	mov	w1, 8
-	csel	w9, w1, w9, eq
-.L1708:
-	mov	w11, 0
-.L1709:
-	mov	x1, 0
-.L1710:
-	add	w12, w0, w1
-	ldrb	w13, [x10,x1]
-	add	x1, x1, 1
-	cmp	w28, w1, uxtb
-	strb	w13, [x21,w12,sxtw]
-	bhi	.L1710
-	add	w11, w11, 1
-	ldr	x1, [x29,112]
-	cmp	w11, w27
-	add	w0, w0, w9
-	add	x10, x10, x1
-	blt	.L1709
-	mov	w21, 255
-	str	w21, [x24,2056]
-	str	x7, [x29,96]
-	str	x8, [x29,104]
+	csel	w1, w1, w0, ne
+.L1753:
+	mov	w7, 0
+.L1754:
+	mov	x0, 0
+.L1755:
+	add	w8, w9, w0
+	ldrb	w11, [x10, x0]
+	add	x0, x0, 1
+	cmp	w27, w0, uxtb
+	strb	w11, [x22, w8, sxtw]
+	bhi	.L1755
+	ldr	x0, [x29, 112]
+	add	w7, w7, 1
+	add	w9, w9, w1
+	cmp	w28, w7
+	add	x10, x10, x0
+	bgt	.L1754
+	mov	w22, 255
+	str	w22, [x19, 2056]
 	bl	nandc_wait_flash_ready
-	ldr	x8, [x29,104]
-	ldr	x7, [x29,96]
-	cbz	w8, .L1712
+	cmp	w25, 1
+	bhi	.L1757
 	mov	w0, 54
-	str	w0, [x24,2056]
-	ldrb	w0, [x25,128]
-	str	w0, [x24,2052]
+	str	w0, [x19, 2056]
+	ldrb	w0, [x26, 128]
+	str	w0, [x19, 2052]
+	str	wzr, [x19, 2048]
 	mov	w0, 22
-	str	wzr, [x24,2048]
-	str	w0, [x24,2056]
+	str	w0, [x19, 2056]
 	mov	w0, 48
-	str	wzr, [x24,2056]
-	str	wzr, [x24,2052]
-	str	wzr, [x24,2052]
-	str	w21, [x24,2052]
-	str	w21, [x24,2052]
-	str	w21, [x24,2052]
-	b	.L1762
-.L1712:
+	str	wzr, [x19, 2056]
+	str	wzr, [x19, 2052]
+	str	wzr, [x19, 2052]
+	str	w22, [x19, 2052]
+	str	w22, [x19, 2052]
+	str	w22, [x19, 2052]
+.L1810:
+	str	w0, [x19, 2056]
+	add	w21, w21, 1
+	and	w21, w21, 255
+	bl	nandc_wait_flash_ready
+	b	.L1714
+.L1764:
+	mov	w1, 4
+	b	.L1753
+.L1765:
+	mov	w1, 10
+	b	.L1753
+.L1757:
+	cmp	w23, 8
+	bne	.L1759
 	mov	w0, 190
-	cbnz	w7, .L1762
+	b	.L1810
+.L1759:
 	mov	w0, 56
-.L1762:
-	str	w0, [x24,2056]
-	add	w20, w20, 1
-	bl	nandc_wait_flash_ready
-	uxtb	w20, w20
-	b	.L1670
+	b	.L1810
 	.size	hynix_get_read_retry_default, .-hynix_get_read_retry_default
 	.align	2
 	.global	flash_get_read_retry_tbl
 	.type	flash_get_read_retry_tbl, %function
 flash_get_read_retry_tbl:
 	adrp	x0, .LANCHOR2+27
-	stp	x29, x30, [sp, -16]!
-	add	x29, sp, 0
-	ldrb	w0, [x0,#:lo12:.LANCHOR2+27]
+	ldrb	w0, [x0, #:lo12:.LANCHOR2+27]
 	sub	w1, w0, #1
-	uxtb	w1, w1
+	and	w1, w1, 255
 	cmp	w1, 7
-	bhi	.L1764
+	bhi	.L1814
+	stp	x29, x30, [sp, -16]!
+	add	x29, sp, 0
 	bl	hynix_get_read_retry_default
-.L1764:
 	ldp	x29, x30, [sp], 16
 	ret
+.L1814:
+	ret
 	.size	flash_get_read_retry_tbl, .-flash_get_read_retry_tbl
 	.align	2
 	.global	nandc_xfer_done
@@ -11258,487 +11226,477 @@ flash_get_read_retry_tbl:
 nandc_xfer_done:
 	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	adrp	x21, .LANCHOR5
 	add	x0, x21, :lo12:.LANCHOR5
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	adrp	x19, .LANCHOR0
-	strb	wzr, [x0,304]
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w1, [x0,1028]
+	stp	x19, x20, [sp, 16]
+	stp	x23, x24, [sp, 48]
+	adrp	x20, .LANCHOR0
+	strb	wzr, [x0, 312]
+	add	x0, x20, :lo12:.LANCHOR0
+	ldrb	w1, [x0, 1028]
 	cmp	w1, 9
-	bne	.L1767
-	ldr	x22, [x0,1048]
-	ldr	w0, [x22,16]
-	str	w0, [x29,64]
-	ldr	w20, [x22,48]
-	ubfx	x20, x20, 1, 1
-	cbnz	w20, .L1788
-	adrp	x21, .LC145
-	adrp	x23, .LC146
-	add	x21, x21, :lo12:.LC145
-	add	x23, x23, :lo12:.LC146
-	b	.L1769
-.L1788:
-	mov	w20, 0
-.L1768:
-	ldr	w1, [x22,64]
-	ldr	w0, [x29,64]
+	bne	.L1818
+	ldr	x22, [x0, 1056]
+	ldr	w1, [x22, 16]
+	str	w1, [x29, 64]
+	ldr	w1, [x22, 48]
+	tbnz	x1, 1, .L1819
+	adrp	x23, .LC145
+	adrp	x24, .LC146
+	mov	x19, x0
+	add	x23, x23, :lo12:.LC145
+	add	x24, x24, :lo12:.LC146
+	mov	w21, 0
+.L1820:
+	ldr	w0, [x29, 64]
+	tbz	x0, 20, .L1830
+	add	x19, x20, :lo12:.LANCHOR0
+	add	x19, x19, 1256
+	ldr	w0, [x19, 32]
+	cbz	w0, .L1828
+	ldr	w1, [x29, 64]
+	mov	w2, 1
+	ldr	w0, [x19, 24]
+	ubfx	x1, x1, 22, 6
+	lsl	w1, w1, 10
+	bl	rknand_dma_unmap_single
+	ldr	w1, [x29, 64]
+	mov	w2, 1
+	ubfx	x1, x1, 22, 6
+	b	.L1865
+.L1819:
+	mov	x19, x0
+	mov	w23, 0
+.L1821:
+	ldr	w1, [x22, 64]
+	ldr	w0, [x29, 64]
 	ubfx	x1, x1, 16, 6
 	ubfx	x0, x0, 22, 6
 	cmp	w1, w0
-	bge	.L1771
-	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x0, [x0,1048]
+	bge	.L1823
+	ldr	x0, [x19, 1056]
 	ldr	w0, [x0]
-	str	w0, [x29,72]
-	ldr	w0, [x29,72]
-	tbz	x0, 13, .L1770
-	ldr	w0, [x29,72]
-	tbz	x0, 17, .L1770
-	ldr	w1, [x29,72]
+	str	w0, [x29, 72]
+	ldr	w0, [x29, 72]
+	tbz	x0, 13, .L1822
+	ldr	w0, [x29, 72]
+	tbz	x0, 17, .L1822
+	ldr	w1, [x29, 72]
 	adrp	x0, .LC143
 	add	x0, x0, :lo12:.LC143
 	ubfx	x1, x1, 17, 1
 	bl	printk
-	b	.L1771
-.L1770:
-	ldr	w0, [x29,64]
-	add	w20, w20, 1
+.L1823:
+	add	x19, x20, :lo12:.LANCHOR0
+	add	x19, x19, 1256
+	ldr	w0, [x19, 32]
+	cbz	w0, .L1828
+	ldr	w1, [x29, 64]
+	mov	w2, 0
+	ldr	w0, [x19, 24]
+	ubfx	x1, x1, 22, 6
+	lsl	w1, w1, 10
+	bl	rknand_dma_unmap_single
+	ldr	w1, [x29, 64]
+	mov	w2, 0
+	ubfx	x1, x1, 22, 6
+.L1865:
+	lsl	w1, w1, 2
+.L1863:
+	ldr	w0, [x19, 28]
+	bl	rknand_dma_unmap_single
+.L1828:
+	add	x20, x20, :lo12:.LANCHOR0
+	ldp	x21, x22, [sp, 32]
+	str	wzr, [x20, 1288]
+	ldp	x23, x24, [sp, 48]
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 80
+	ret
+.L1822:
+	ldr	w0, [x29, 64]
+	add	w23, w23, 1
 	ubfx	x0, x0, 22, 6
-	cmp	w20, w0, lsl 12
-	bne	.L1772
-	ldr	w2, [x22,64]
+	cmp	w23, w0, lsl 12
+	bne	.L1824
+	ldr	w2, [x22, 64]
+	mov	w1, w23
+	ldr	w3, [x29, 64]
 	adrp	x0, .LC144
-	ldr	w3, [x29,64]
-	mov	w1, w20
+	add	x21, x21, :lo12:.LANCHOR5
 	add	x0, x0, :lo12:.LC144
 	ubfx	x2, x2, 16, 5
 	ubfx	x3, x3, 22, 6
-	add	x21, x21, :lo12:.LANCHOR5
 	bl	printk
-	ldr	w1, [x29,72]
+	ldr	w1, [x29, 72]
 	mov	w0, 1
-	strb	w0, [x21,304]
-	tbnz	x1, 13, .L1771
+	strb	w0, [x21, 312]
+	tbnz	x1, 13, .L1823
 	mov	x0, 35160
 	movk	x0, 0x41, lsl 16
 	bl	__const_udelay
-	b	.L1771
-.L1772:
-	mov	x0, 5
+	b	.L1823
+.L1824:
 	mov	x1, 10
+	mov	x0, 5
 	bl	usleep_range
-	b	.L1768
-.L1771:
-	add	x20, x19, :lo12:.LANCHOR0
-	add	x20, x20, 1200
-	ldr	w0, [x20,32]
-	cbz	w0, .L1776
-	ldr	w1, [x29,64]
-	mov	w2, 0
-	ldr	w0, [x20,24]
-	ubfx	x1, x1, 22, 6
-	lsl	w1, w1, 10
-	bl	rknand_dma_unmap_single
-	ldr	w1, [x29,64]
-	ldr	w0, [x20,28]
-	ubfx	x1, x1, 22, 6
-	lsl	w1, w1, 2
-	b	.L1813
-.L1778:
-	add	x24, x19, :lo12:.LANCHOR0
-	add	w20, w20, 1
-	ldr	x0, [x24,1048]
-	ldr	w0, [x0,16]
-	str	w0, [x29,64]
-	and	w0, w20, 16777215
-	cbnz	w0, .L1777
-	ldr	w2, [x29,64]
-	mov	w1, w20
-	ldr	w3, [x22,64]
-	mov	x0, x21
+	b	.L1821
+.L1830:
+	ldr	x0, [x19, 1056]
+	add	w21, w21, 1
+	tst	x21, 16777215
+	ldr	w0, [x0, 16]
+	str	w0, [x29, 64]
+	bne	.L1829
+	ldr	w2, [x29, 64]
+	mov	w1, w21
+	ldr	w3, [x22, 64]
+	mov	x0, x23
 	ubfx	x3, x3, 16, 6
 	bl	printk
-	ldr	x1, [x24,1048]
-	mov	x0, x23
-	mov	w2, 4
+	ldr	x1, [x19, 1056]
 	mov	w3, 64
+	mov	w2, 4
+	mov	x0, x24
 	bl	rknand_print_hex
-.L1777:
-	mov	x0, 5
+.L1829:
 	mov	x1, 10
+	mov	x0, 5
 	bl	usleep_range
-.L1769:
-	ldr	w0, [x29,64]
-	tbz	x0, 20, .L1778
-	add	x20, x19, :lo12:.LANCHOR0
-	add	x20, x20, 1200
-	ldr	w0, [x20,32]
-	cbz	w0, .L1776
-	ldr	w1, [x29,64]
+	b	.L1820
+.L1818:
+	ldr	x21, [x0, 1056]
+	mov	w22, 0
+	mov	x19, x0
+	ldr	w1, [x21, 8]
+	str	w1, [x29, 64]
+	ldr	w1, [x21, 16]
+	tbnz	x1, 1, .L1832
+	adrp	x23, .LC145
+	adrp	x24, .LC146
+	add	x23, x23, :lo12:.LC145
+	add	x24, x24, :lo12:.LC146
+.L1833:
+	ldr	w0, [x29, 64]
+	tbz	x0, 20, .L1840
+	add	x19, x20, :lo12:.LANCHOR0
+	add	x19, x19, 1256
+	ldr	w0, [x19, 32]
+	cbz	w0, .L1828
+	ldr	w1, [x29, 64]
 	mov	w2, 1
-	ldr	w0, [x20,24]
+	ldr	w0, [x19, 24]
 	ubfx	x1, x1, 22, 6
 	lsl	w1, w1, 10
 	bl	rknand_dma_unmap_single
-	ldr	w1, [x29,64]
-	ldr	w0, [x20,28]
-	ubfx	x1, x1, 22, 6
-	lsl	w1, w1, 2
-	b	.L1812
-.L1767:
-	ldr	x21, [x0,1048]
-	ldr	w0, [x21,8]
-	str	w0, [x29,64]
-	ldr	w20, [x21,16]
-	ubfx	x20, x20, 1, 1
-	cbnz	w20, .L1789
-	adrp	x22, .LC145
-	adrp	x23, .LC146
-	add	x22, x22, :lo12:.LC145
-	add	x23, x23, :lo12:.LC146
-	b	.L1781
-.L1789:
-	adrp	x22, .LC144
-	adrp	x23, .LC146
-	mov	w20, 0
-	add	x22, x22, :lo12:.LC144
-	add	x23, x23, :lo12:.LC146
-.L1780:
-	ldr	w2, [x21,28]
-	ldr	w1, [x29,64]
-	ubfx	x2, x2, 16, 5
+	ldr	w1, [x29, 64]
+	mov	w2, 1
 	ubfx	x1, x1, 22, 6
-	cmp	w2, w1
-	bge	.L1783
-	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x0, [x0,1048]
+	b	.L1864
+.L1832:
+	adrp	x23, .LC144
+	adrp	x24, .LC146
+	add	x23, x23, :lo12:.LC144
+	add	x24, x24, :lo12:.LC146
+.L1834:
+	ldr	w1, [x21, 28]
+	ldr	w0, [x29, 64]
+	ubfx	x1, x1, 16, 5
+	ubfx	x0, x0, 22, 6
+	cmp	w1, w0
+	bge	.L1836
+	ldr	x0, [x19, 1056]
 	ldr	w0, [x0]
-	str	w0, [x29,72]
-	ldr	w0, [x29,72]
-	tbz	x0, 13, .L1782
-	ldr	w0, [x29,72]
-	tbz	x0, 17, .L1782
-	ldr	w1, [x29,72]
+	str	w0, [x29, 72]
+	ldr	w0, [x29, 72]
+	tbz	x0, 13, .L1835
+	ldr	w0, [x29, 72]
+	tbz	x0, 17, .L1835
+	ldr	w1, [x29, 72]
 	adrp	x0, .LC147
 	add	x0, x0, :lo12:.LC147
 	bl	printk
-	b	.L1783
-.L1782:
-	add	w20, w20, 1
-	and	w0, w20, 16777215
-	cbnz	w0, .L1784
-	ldr	w2, [x21,28]
-	mov	w1, w20
-	ldr	w3, [x29,64]
-	mov	x0, x22
+.L1836:
+	add	x19, x20, :lo12:.LANCHOR0
+	add	x19, x19, 1256
+	ldr	w0, [x19, 32]
+	cbz	w0, .L1828
+	ldr	w1, [x29, 64]
+	mov	w2, 0
+	ldr	w0, [x19, 24]
+	ubfx	x1, x1, 22, 6
+	lsl	w1, w1, 10
+	bl	rknand_dma_unmap_single
+	ldr	w1, [x29, 64]
+	mov	w2, 0
+	ubfx	x1, x1, 22, 6
+.L1864:
+	lsl	w1, w1, 7
+	b	.L1863
+.L1835:
+	add	w22, w22, 1
+	tst	x22, 16777215
+	bne	.L1837
+	ldr	w2, [x21, 28]
+	mov	w1, w22
+	ldr	w3, [x29, 64]
+	mov	x0, x23
 	ubfx	x2, x2, 16, 5
 	ubfx	x3, x3, 22, 6
 	bl	printk
-	add	x1, x19, :lo12:.LANCHOR0
-	mov	x0, x23
-	mov	w2, 4
+	ldr	x1, [x19, 1056]
 	mov	w3, 64
-	ldr	x1, [x1,1048]
+	mov	w2, 4
+	mov	x0, x24
 	bl	rknand_print_hex
-.L1784:
-	mov	x0, 5
+.L1837:
 	mov	x1, 10
+	mov	x0, 5
 	bl	usleep_range
-	b	.L1780
-.L1783:
-	add	x20, x19, :lo12:.LANCHOR0
-	add	x20, x20, 1200
-	ldr	w0, [x20,32]
-	cbz	w0, .L1776
-	ldr	w1, [x29,64]
-	mov	w2, 0
-	ldr	w0, [x20,24]
-	ubfx	x1, x1, 22, 6
-	lsl	w1, w1, 10
-	bl	rknand_dma_unmap_single
-	ldr	w1, [x29,64]
-	ldr	w0, [x20,28]
-	ubfx	x1, x1, 22, 6
-	lsl	w1, w1, 7
-.L1813:
-	mov	w2, 0
-	b	.L1811
-.L1787:
-	add	x24, x19, :lo12:.LANCHOR0
-	add	w20, w20, 1
-	ldr	x0, [x24,1048]
-	ldr	w0, [x0,8]
-	str	w0, [x29,64]
-	and	w0, w20, 16777215
-	cbnz	w0, .L1786
-	ldr	w2, [x29,64]
-	mov	w1, w20
-	ldr	w3, [x21,28]
-	mov	x0, x22
+	b	.L1834
+.L1840:
+	ldr	x0, [x19, 1056]
+	add	w22, w22, 1
+	tst	x22, 16777215
+	ldr	w0, [x0, 8]
+	str	w0, [x29, 64]
+	bne	.L1839
+	ldr	w2, [x29, 64]
+	mov	w1, w22
+	ldr	w3, [x21, 28]
+	mov	x0, x23
 	ubfx	x3, x3, 16, 5
 	bl	printk
-	ldr	x1, [x24,1048]
-	mov	x0, x23
-	mov	w2, 4
+	ldr	x1, [x19, 1056]
 	mov	w3, 64
+	mov	w2, 4
+	mov	x0, x24
 	bl	rknand_print_hex
-.L1786:
-	mov	x0, 5
+.L1839:
 	mov	x1, 10
+	mov	x0, 5
 	bl	usleep_range
-.L1781:
-	ldr	w0, [x29,64]
-	tbz	x0, 20, .L1787
-	add	x20, x19, :lo12:.LANCHOR0
-	add	x20, x20, 1200
-	ldr	w0, [x20,32]
-	cbz	w0, .L1776
-	ldr	w1, [x29,64]
-	mov	w2, 1
-	ldr	w0, [x20,24]
-	ubfx	x1, x1, 22, 6
-	lsl	w1, w1, 10
-	bl	rknand_dma_unmap_single
-	ldr	w1, [x29,64]
-	ldr	w0, [x20,28]
-	ubfx	x1, x1, 22, 6
-	lsl	w1, w1, 7
-.L1812:
-	mov	w2, 1
-.L1811:
-	bl	rknand_dma_unmap_single
-.L1776:
-	add	x19, x19, :lo12:.LANCHOR0
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	str	wzr, [x19,1232]
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 80
-	ret
+	b	.L1833
 	.size	nandc_xfer_done, .-nandc_xfer_done
 	.align	2
 	.global	nandc_xfer
 	.type	nandc_xfer, %function
 nandc_xfer:
-	stp	x29, x30, [sp, -80]!
+	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	stp	x19, x20, [sp,16]
-	uxtb	w22, w2
-	uxtb	w20, w1
-	mov	x2, x3
-	mov	w0, w20
-	mov	w1, w22
+	stp	x19, x20, [sp, 16]
+	and	w20, w2, 255
+	stp	x21, x22, [sp, 32]
 	mov	x21, x3
+	and	w19, w1, 255
 	mov	x3, x4
-	str	x23, [sp,48]
-	mov	x23, x4
+	mov	x2, x21
+	mov	w1, w20
+	mov	w0, w19
+	mov	x22, x4
 	bl	nandc_xfer_start
-	mov	w0, w20
+	mov	w0, w19
 	bl	nandc_xfer_done
-	mov	w0, 0
-	cbnz	w20, .L1844
+	cbnz	w19, .L1885
 	adrp	x19, .LANCHOR0
-	add	x1, x19, :lo12:.LANCHOR0
-	ldrb	w2, [x1,1028]
-	cmp	w2, 9
-	bne	.L1816
-	ldr	x5, [x1,1048]
-	lsr	w22, w22, 2
-	mov	w4, 1
-	mov	w3, w0
-.L1817:
-	cmp	w3, w22
-	bcs	.L1853
-	uxtw	x1, w3
-	add	x1, x1, 84
-	ldr	w1, [x5,x1,lsl 2]
-	str	w1, [x29,72]
-	ldr	w1, [x29,72]
-	ubfx	x2, x1, 10, 1
-	ldr	w1, [x29,72]
-	ubfx	x1, x1, 26, 1
-	and	w1, w1, w2
-	and	w4, w4, w1
-	ldr	w1, [x29,72]
-	tbnz	x1, 2, .L1836
-	ldr	w1, [x29,72]
-	tbnz	x1, 18, .L1836
-	ldr	w2, [x29,72]
-	ldr	w1, [x29,72]
-	ubfx	x2, x2, 3, 7
-	ubfx	x1, x1, 19, 7
-	cmp	w2, w1
-	ldr	w1, [x29,72]
-	ble	.L1819
-	ubfx	x1, x1, 3, 7
-	b	.L1820
-.L1819:
-	ubfx	x1, x1, 19, 7
-.L1820:
-	cmp	w0, w1
-	csel	w0, w0, w1, cs
-	b	.L1818
-.L1836:
-	mov	w0, -1
-.L1818:
-	add	w3, w3, 1
-	b	.L1817
-.L1853:
-	add	x22, x19, :lo12:.LANCHOR0
-	cmp	w4, wzr
-	ldr	x1, [x22,1048]
-	ldr	w20, [x1]
+	add	x0, x19, :lo12:.LANCHOR0
+	ldrb	w1, [x0, 1028]
+	cmp	w1, 9
+	bne	.L1868
+	lsr	w20, w20, 2
+	ldr	x5, [x0, 1056]
+	mov	w3, 1
+	mov	w2, 0
+	mov	w0, 0
+.L1869:
+	cmp	w2, w20
+	bcc	.L1873
+	ldr	w20, [x5]
+	cmp	w3, 0
 	mov	w1, 512
 	csel	w0, w0, w1, eq
 	mov	w1, 8192
 	movk	w1, 0x2, lsl 16
 	and	w1, w20, w1
 	cmp	w1, 139264
-	bne	.L1823
-	adrp	x0, .LC148
+	bne	.L1875
 	mov	w1, w20
+	adrp	x0, .LC148
 	add	x0, x0, :lo12:.LC148
-	orr	w20, w20, 131072
 	bl	printk
-	ldr	x0, [x22,1048]
+	add	x0, x19, :lo12:.LANCHOR0
+	orr	w20, w20, 131072
+	ldr	x0, [x0, 1056]
 	str	w20, [x0]
 	mov	w0, -1
-.L1823:
-	tbz	x20, 13, .L1824
-	adrp	x1, .LANCHOR5+304
-	ldrb	w1, [x1,#:lo12:.LANCHOR5+304]
-	cbz	w1, .L1824
-	adrp	x0, .LC149
+.L1875:
+	tbz	x20, 13, .L1876
+	adrp	x1, .LANCHOR5+312
+	ldrb	w1, [x1, #:lo12:.LANCHOR5+312]
+	cbz	w1, .L1876
+	add	x19, x19, :lo12:.LANCHOR0
 	mov	w1, w20
+	adrp	x0, .LC149
 	add	x0, x0, :lo12:.LC149
-	add	x19, x19, :lo12:.LANCHOR0
 	bl	printk
-	ldr	x0, [x19,1048]
+	ldr	x0, [x19, 1056]
 	mov	w1, 1
-	str	w1, [x0,16]
-	b	.L1825
-.L1816:
-	ldrb	w0, [x1,1244]
-	mov	w4, 128
-	lsr	w5, w22, 1
-	mov	w2, 1
-	cmp	w0, 25
-	mov	w0, 64
-	csel	w4, w0, w4, cc
-	mov	w3, w20
-.L1827:
-	cmp	w3, w5
-	add	w6, w20, w4
-	bcs	.L1854
-	ldr	x0, [x1,1200]
-	and	x20, x20, 4294967292
-	ubfiz	x7, x3, 2, 30
-	add	w3, w3, 1
-	ldr	w0, [x0,x20]
-	mov	w20, w6
-	strb	w0, [x23,x7]
-	lsr	w7, w0, 8
-	strb	w7, [x23,w2,uxtw]
-	add	w7, w2, 1
-	lsr	w8, w0, 16
-	lsr	w0, w0, 24
-	strb	w8, [x23,x7]
-	add	w7, w2, 2
-	add	w2, w2, 4
-	strb	w0, [x23,x7]
-	b	.L1827
-.L1854:
-	add	x0, x19, :lo12:.LANCHOR0
-	mov	w2, 0
-	lsr	w22, w22, 2
-	ldr	x6, [x0,1048]
-	mov	w0, w2
-.L1829:
-	cmp	w2, w22
-	bcs	.L1855
+	str	w1, [x0, 16]
+.L1904:
+	mov	w0, -1
+.L1867:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 64
+	ret
+.L1873:
 	uxtw	x1, w2
-	add	x1, x1, 8
-	ldr	w1, [x6,x1,lsl 2]
-	str	w1, [x29,72]
-	ldr	w1, [x29,72]
-	tbnz	x1, 2, .L1839
-	ldr	w1, [x29,72]
-	tbnz	x1, 15, .L1839
-	ldr	w3, [x29,72]
-	ubfx	x5, x3, 3, 5
-	ldr	w3, [x29,72]
-	ldr	w1, [x29,72]
-	ubfx	x3, x3, 27, 1
-	ubfx	x4, x1, 16, 5
-	ldr	w1, [x29,72]
-	orr	w3, w5, w3, lsl 5
-	ubfx	x1, x1, 29, 1
-	orr	w1, w4, w1, lsl 5
-	cmp	w3, w1
-	ldr	w1, [x29,72]
-	bls	.L1831
-	ubfx	x3, x1, 3, 5
-	ldr	w1, [x29,72]
-	ubfx	x1, x1, 27, 1
-	b	.L1852
-.L1831:
-	ubfx	x3, x1, 16, 5
-	ldr	w1, [x29,72]
-	ubfx	x1, x1, 29, 1
-.L1852:
-	orr	w1, w3, w1, lsl 5
+	add	x1, x1, 84
+	ldr	w1, [x5, x1, lsl 2]
+	str	w1, [x29, 56]
+	ldr	w1, [x29, 56]
+	ldr	w4, [x29, 56]
+	ubfx	x4, x4, 26, 1
+	and	w1, w4, w1, lsr 10
+	and	w3, w3, w1
+	ldr	w1, [x29, 56]
+	tbnz	x1, 2, .L1887
+	ldr	w1, [x29, 56]
+	tbnz	x1, 18, .L1887
+	ldr	w4, [x29, 56]
+	ldr	w1, [x29, 56]
+	ubfx	x4, x4, 3, 7
+	ubfx	x1, x1, 19, 7
+	cmp	w4, w1
+	ldr	w1, [x29, 56]
+	ble	.L1871
+	ubfx	x1, x1, 3, 7
+.L1872:
 	cmp	w0, w1
 	csel	w0, w0, w1, cs
-	b	.L1830
-.L1839:
-	mov	w0, -1
-.L1830:
+.L1870:
 	add	w2, w2, 1
-	b	.L1829
-.L1855:
-	add	x19, x19, :lo12:.LANCHOR0
-	ldr	x1, [x19,1048]
-	str	wzr, [x1,16]
-	ldr	w20, [x1]
+	b	.L1869
+.L1871:
+	ubfx	x1, x1, 19, 7
+	b	.L1872
+.L1887:
+	mov	w0, -1
+	b	.L1870
+.L1868:
+	ldrb	w1, [x0, 1249]
+	lsr	w5, w20, 1
+	mov	w4, 64
+	mov	w2, 1
+	cmp	w1, 25
+	mov	w1, 128
+	mov	w3, 0
+	csel	w4, w4, w1, cc
+	mov	w1, 0
+.L1878:
+	add	w6, w4, w1
+	cmp	w3, w5
+	bcc	.L1879
+	add	x0, x19, :lo12:.LANCHOR0
+	lsr	w20, w20, 2
+	mov	w3, 0
+	ldr	x4, [x0, 1056]
+	mov	w0, 0
+.L1880:
+	cmp	w3, w20
+	bcc	.L1884
+	str	wzr, [x4, 16]
 	mov	w1, 8192
 	movk	w1, 0x2, lsl 16
+	ldr	w20, [x4]
 	and	w1, w20, w1
 	cmp	w1, 139264
-	bne	.L1824
-	adrp	x0, .LC150
+	bne	.L1876
+	add	x19, x19, :lo12:.LANCHOR0
 	mov	w1, w20
+	adrp	x0, .LC150
 	add	x0, x0, :lo12:.LC150
-	orr	w20, w20, 131072
 	bl	printk
-	ldr	x0, [x19,1048]
+	orr	w20, w20, 131072
+	ldr	x0, [x19, 1056]
 	str	w20, [x0]
-	b	.L1825
-.L1824:
+	b	.L1904
+.L1879:
+	ldr	x7, [x0, 1256]
+	and	x1, x1, 4294967292
+	ldr	w1, [x7, x1]
+	lsl	w7, w3, 2
+	add	w3, w3, 1
+	strb	w1, [x22, x7]
+	lsr	w7, w1, 8
+	strb	w7, [x22, w2, uxtw]
+	add	w7, w2, 1
+	lsr	w8, w1, 16
+	lsr	w1, w1, 24
+	strb	w8, [x22, x7]
+	add	w7, w2, 2
+	add	w2, w2, 4
+	strb	w1, [x22, x7]
+	mov	w1, w6
+	b	.L1878
+.L1884:
+	uxtw	x1, w3
+	add	x1, x1, 8
+	ldr	w1, [x4, x1, lsl 2]
+	str	w1, [x29, 56]
+	ldr	w1, [x29, 56]
+	tbnz	x1, 2, .L1890
+	ldr	w1, [x29, 56]
+	tbnz	x1, 15, .L1890
+	ldr	w2, [x29, 56]
+	ubfx	x6, x2, 3, 5
+	ldr	w2, [x29, 56]
+	ldr	w1, [x29, 56]
+	ubfx	x2, x2, 27, 1
+	ubfx	x5, x1, 16, 5
+	ldr	w1, [x29, 56]
+	orr	w2, w6, w2, lsl 5
+	ubfx	x1, x1, 29, 1
+	orr	w1, w5, w1, lsl 5
+	cmp	w2, w1
+	ldr	w1, [x29, 56]
+	bls	.L1882
+	ubfx	x2, x1, 3, 5
+	ldr	w1, [x29, 56]
+	ubfx	x1, x1, 27, 1
+.L1903:
+	orr	w1, w2, w1, lsl 5
+	cmp	w0, w1
+	csel	w0, w0, w1, cs
+.L1881:
+	add	w3, w3, 1
+	b	.L1880
+.L1882:
+	ubfx	x2, x1, 16, 5
+	ldr	w1, [x29, 56]
+	ubfx	x1, x1, 29, 1
+	b	.L1903
+.L1890:
+	mov	w0, -1
+	b	.L1881
+.L1876:
 	cmn	w0, #1
-	beq	.L1844
-	ldr	w1, [x23]
+	beq	.L1867
+	ldr	w1, [x22]
 	cmn	w1, #1
-	bne	.L1844
-	ldr	w1, [x23,4]
+	bne	.L1867
+	ldr	w1, [x22, 4]
 	cmn	w1, #1
-	bne	.L1844
+	bne	.L1867
 	ldr	w1, [x21]
 	cmn	w1, #1
 	mov	w1, 512
 	csel	w0, w0, w1, ne
-	b	.L1844
-.L1825:
-	mov	w0, -1
-.L1844:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldr	x23, [sp,48]
-	ldp	x29, x30, [sp], 80
-	ret
+	b	.L1867
+.L1885:
+	mov	w0, 0
+	b	.L1867
 	.size	nandc_xfer, .-nandc_xfer
 	.align	2
 	.global	flash_read_page
@@ -11746,529 +11704,516 @@ nandc_xfer:
 flash_read_page:
 	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	adrp	x21, .LANCHOR0
-	str	x27, [sp,80]
+	str	x27, [sp, 80]
 	add	x27, x21, :lo12:.LANCHOR0
-	uxtb	w22, w0
-	stp	x19, x20, [sp,16]
-	mov	w0, 24
-	ldrb	w19, [x27,1257]
-	stp	x23, x24, [sp,48]
-	sub	w19, w0, w19
-	mov	w0, 1
-	lsl	w19, w0, w19
+	and	w22, w0, 255
+	stp	x19, x20, [sp, 16]
+	mov	w19, 24
+	stp	x23, x24, [sp, 48]
+	ldrb	w0, [x27, 1205]
 	ubfx	x23, x1, 24, 2
-	sub	w19, w19, #1
-	mov	x24, x3
-	stp	x25, x26, [sp,64]
-	ldr	x20, [x27,1048]
+	stp	x25, x26, [sp, 64]
+	mov	w24, w4
+	sub	w0, w19, w0
+	mov	w19, 1
 	mov	x25, x2
-	mov	w26, w4
-	and	w19, w1, w19
+	mov	x26, x3
+	lsl	w19, w19, w0
+	sub	w19, w19, #1
+	and	w19, w19, w1
+	ldr	x20, [x27, 1056]
 	bl	nandc_wait_flash_ready
 	mov	w0, w22
 	bl	nandc_cs
-	cbnz	w23, .L1857
+	cbnz	w23, .L1906
 	mov	w0, w22
 	bl	zftl_flash_enter_slc_mode
-	b	.L1858
-.L1857:
-	ldr	x0, [x27,1144]
-	ldrb	w0, [x0,12]
-	cmp	w0, 3
-	bne	.L1859
-	ldrb	w0, [x27,1268]
-	cbnz	w0, .L1859
-	ldrb	w0, [x27,1269]
-	cbnz	w0, .L1859
-	sxtw	x0, w22
-	add	x0, x0, 8
-	add	x0, x20, x0, lsl 8
-	str	w23, [x0,8]
-	b	.L1858
-.L1859:
-	mov	w0, w22
-	bl	zftl_flash_exit_slc_mode
-.L1858:
+.L1907:
 	add	x0, x21, :lo12:.LANCHOR0
-	ldr	x1, [x0,1144]
-	ldrb	w0, [x1,7]
+	ldr	x1, [x0, 1144]
+	ldrb	w0, [x1, 7]
 	cmp	w0, 1
-	bne	.L1860
-	ldrb	w0, [x1,12]
+	bne	.L1909
+	ldrb	w0, [x1, 12]
 	cmp	w0, 2
-	bne	.L1860
+	bne	.L1909
 	sxtw	x0, w22
 	mov	w2, 38
 	add	x0, x0, 8
 	add	x0, x20, x0, lsl 8
-	str	w2, [x0,8]
-.L1860:
-	ubfiz	x5, x22, 8, 8
+	str	w2, [x0, 8]
+.L1909:
+	ubfiz	x0, x22, 8, 8
+	add	x20, x20, x0
 	and	w0, w19, 255
-	add	x20, x20, x5
-	str	wzr, [x20,2056]
-	str	wzr, [x20,2052]
-	str	wzr, [x20,2052]
-	str	w0, [x20,2052]
+	str	wzr, [x20, 2056]
+	str	wzr, [x20, 2052]
+	str	wzr, [x20, 2052]
+	str	w0, [x20, 2052]
 	lsr	w0, w19, 8
-	str	w0, [x20,2052]
+	str	w0, [x20, 2052]
 	lsr	w0, w19, 16
-	str	w0, [x20,2052]
+	str	w0, [x20, 2052]
 	add	x0, x21, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1256]
-	cbz	w0, .L1861
+	ldrb	w0, [x0, 1204]
+	cbz	w0, .L1910
 	lsr	w0, w19, 24
-	str	w0, [x20,2052]
-.L1861:
+	str	w0, [x20, 2052]
+.L1910:
 	mov	w0, 48
-	str	w0, [x20,2056]
-	cbz	w23, .L1862
-	ldrb	w0, [x1,12]
+	str	w0, [x20, 2056]
+	ldrb	w0, [x1, 12]
 	cmp	w0, 3
-	bne	.L1862
+	bne	.L1911
+	cbz	w23, .L1911
 	add	x21, x21, :lo12:.LANCHOR0
-	ldrb	w0, [x21,1268]
-	cbnz	w0, .L1862
-	ldrb	w0, [x21,1269]
-	cbnz	w0, .L1862
+	ldrb	w0, [x21, 1212]
+	cbnz	w0, .L1911
+	ldrb	w0, [x21, 1213]
+	cbnz	w0, .L1911
 	add	w19, w19, w19, lsl 1
 	sub	w0, w19, #1
 	add	w0, w0, w23
-	b	.L1873
-.L1862:
-	mov	w0, w19
-.L1873:
+.L1920:
 	bl	nandc_set_seed
 	bl	nandc_wait_flash_ready
 	mov	w0, 5
-	str	w0, [x20,2056]
-	str	wzr, [x20,2052]
+	str	w0, [x20, 2056]
+	str	wzr, [x20, 2052]
 	mov	w0, 224
-	str	wzr, [x20,2052]
-	mov	w2, w26
+	str	wzr, [x20, 2052]
+	mov	w2, w24
+	str	w0, [x20, 2056]
+	mov	x4, x26
 	mov	x3, x25
-	mov	x4, x24
-	str	w0, [x20,2056]
 	mov	w1, 0
 	mov	w0, w22
 	bl	nandc_xfer
-	mov	w19, w0
-	mov	w0, 0
-	bl	nandc_de_cs
-	ldr	x27, [sp,80]
-	mov	w0, w19
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
+	mov	w2, w0
+	bl	nandc_de_cs.constprop.35
+	mov	w0, w2
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldr	x27, [sp, 80]
 	ldp	x29, x30, [sp], 96
 	ret
+.L1906:
+	ldr	x0, [x27, 1144]
+	ldrb	w0, [x0, 12]
+	cmp	w0, 3
+	bne	.L1908
+	ldrb	w0, [x27, 1212]
+	cbnz	w0, .L1908
+	ldrb	w0, [x27, 1213]
+	cbnz	w0, .L1908
+	sxtw	x0, w22
+	add	x0, x0, 8
+	add	x0, x20, x0, lsl 8
+	str	w23, [x0, 8]
+	b	.L1907
+.L1908:
+	mov	w0, w22
+	bl	zftl_flash_exit_slc_mode
+	b	.L1907
+.L1911:
+	mov	w0, w19
+	b	.L1920
 	.size	flash_read_page, .-flash_read_page
 	.align	2
 	.global	micron_read_retrial
 	.type	micron_read_retrial, %function
 micron_read_retrial:
-	stp	x29, x30, [sp, -160]!
+	stp	x29, x30, [sp, -128]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR0
-	uxtb	w19, w0
-	add	x20, x20, :lo12:.LANCHOR0
-	str	w4, [x29,152]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	mov	w22, w1
-	mov	x23, x2
-	ldrb	w0, [x20,1244]
-	mov	x24, x3
-	uxtb	x25, w19
-	mov	w21, 0
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR0
+	add	x19, x19, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	and	w20, w0, 255
+	stp	x25, x26, [sp, 64]
+	mov	w24, w1
+	stp	x27, x28, [sp, 80]
+	mov	x26, x3
+	str	x2, [x29, 112]
+	mov	w22, 0
+	ldrb	w0, [x19, 1249]
 	add	w0, w0, w0, lsl 1
-	asr	w0, w0, 2
-	str	w0, [x29,156]
+	asr	w1, w0, 2
+	stp	w4, w1, [x29, 120]
 	bl	nandc_wait_flash_ready
-	ldr	x0, [x20,1048]
-	str	x0, [x29,144]
-	adrp	x0, .LC151
-	add	x0, x0, :lo12:.LC151
-	str	x0, [x29,128]
-	lsl	x0, x25, 8
-	str	x0, [x29,120]
-	adrp	x0, .LC152
-	add	x0, x0, :lo12:.LC152
-	str	x0, [x29,112]
-.L1875:
-	mov	w0, w19
-	mov	w20, 0
-	mov	w28, -1
-	adrp	x26, .LANCHOR5
+	ldr	x19, [x19, 1056]
+	ubfiz	x0, x20, 8, 8
+	add	x19, x19, x0
+.L1922:
+	adrp	x23, .LANCHOR5
+	add	x23, x23, :lo12:.LANCHOR5
+	mov	x27, x23
+	mov	w21, 0
+	mov	w25, -1
+	mov	w0, w20
 	bl	zftl_flash_enter_slc_mode
-	mov	w0, w19
+	mov	w0, w20
 	bl	zftl_flash_exit_slc_mode
-	lsl	x0, x25, 8
-	str	x0, [x29,136]
-.L1876:
-	add	x0, x26, :lo12:.LANCHOR5
-	ldrb	w0, [x0,320]
-	cmp	w20, w0
-	bcs	.L1880
-	ldr	x0, [x29,144]
-	add	w27, w20, 1
-	ldr	x1, [x29,136]
-	add	x1, x0, x1
+.L1923:
+	ldrb	w0, [x23, 328]
+	cmp	w21, w0
+	bcc	.L1928
+.L1927:
 	mov	w0, 239
-	str	x1, [x29,104]
-	str	w0, [x1,2056]
+	str	w0, [x19, 2056]
 	mov	w0, 137
-	str	w0, [x1,2052]
+	str	w0, [x19, 2052]
 	mov	x0, 1000
 	bl	__const_udelay
-	ldr	x1, [x29,104]
-	mov	w0, w19
-	ldr	w4, [x29,152]
-	mov	x2, x23
-	mov	x3, x24
-	str	w27, [x1,2048]
-	str	wzr, [x1,2048]
-	str	wzr, [x1,2048]
-	str	wzr, [x1,2048]
-	mov	w1, w22
-	bl	flash_read_page
-	mov	w6, w0
-	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L1877
-	ldr	x0, [x29,128]
-	mov	w4, w6
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
+	ldr	w0, [x29, 124]
+	str	wzr, [x19, 2048]
+	cmp	w25, w0
+	bcc	.L1929
+	cmn	w25, #1
+	mov	w0, 256
+	csel	w25, w25, w0, eq
+.L1929:
+	cmn	w25, #1
+	cset	w23, eq
+	cmp	w25, 256
+	cset	w0, eq
+	orr	w0, w23, w0
+	cbz	w0, .L1930
+	mov	w4, w25
+	mov	w3, w21
+	mov	w2, w24
 	mov	w1, w20
-	mov	w2, w22
-	mov	w3, w28
-	str	x6, [x29,104]
+	adrp	x0, .LC152
+	add	x0, x0, :lo12:.LC152
 	bl	printk
-	ldr	x6, [x29,104]
-.L1877:
-	cmn	w6, #1
-	beq	.L1878
-	adrp	x0, .LANCHOR5
-	cmn	w28, #1
-	add	x0, x0, :lo12:.LANCHOR5
-	csel	w28, w28, w6, ne
-	ldr	x23, [x0,296]
-	ldr	x24, [x0,312]
-	ldr	w0, [x29,156]
-	cmp	w6, w0
-	bcc	.L1888
-.L1878:
-	mov	w20, w27
-	b	.L1876
-.L1888:
-	mov	w28, w6
-.L1880:
-	ldr	x0, [x29,144]
-	ldr	x1, [x29,120]
-	add	x26, x0, x1
+	eor	w0, w22, 1
+	tst	w23, w0
+	beq	.L1931
+	mov	w1, 3
+	mov	w0, w20
+	mov	w22, 1
+	bl	mt_auto_read_calibration_config
+	b	.L1922
+.L1928:
 	mov	w0, 239
-	str	w0, [x26,2056]
+	str	w0, [x19, 2056]
 	mov	w0, 137
-	str	w0, [x26,2052]
+	str	w0, [x19, 2052]
+	add	w28, w21, 1
 	mov	x0, 1000
 	bl	__const_udelay
-	str	wzr, [x26,2048]
-	str	wzr, [x26,2048]
-	ldr	w0, [x29,156]
-	str	wzr, [x26,2048]
-	str	wzr, [x26,2048]
-	cmp	w28, w0
-	bcc	.L1882
-	cmn	w28, #1
-	mov	w0, 256
-	csel	w28, w28, w0, eq
-.L1882:
-	cmn	w28, #1
-	cset	w26, eq
-	cbnz	w26, .L1890
-	cmp	w28, 256
-	cset	w1, eq
-	cbz	w1, .L1883
-.L1890:
-	ldr	x0, [x29,112]
-	mov	w1, w19
-	mov	w2, w22
-	mov	w3, w20
-	mov	w4, w28
+	str	w28, [x19, 2048]
+	str	wzr, [x19, 2048]
+	mov	x3, x26
+	ldr	w4, [x29, 120]
+	mov	w1, w24
+	ldr	x2, [x29, 112]
+	mov	w0, w20
+	str	wzr, [x19, 2048]
+	str	wzr, [x19, 2048]
+	bl	flash_read_page
+	mov	w6, w0
+	adrp	x0, .LANCHOR2
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L1924
+	mov	w4, w6
+	str	w6, [x29, 108]
+	mov	w3, w25
+	mov	w2, w24
+	mov	w1, w21
+	adrp	x0, .LC151
+	add	x0, x0, :lo12:.LC151
 	bl	printk
-	cbz	w26, .L1885
-	cbnz	w21, .L1885
-	mov	w0, w19
-	mov	w1, 3
-	mov	w21, 1
-	bl	mt_auto_read_calibration_config
-	b	.L1875
-.L1885:
-	cbz	w21, .L1886
-	mov	w0, w19
+	ldr	w6, [x29, 108]
+.L1924:
+	cmn	w6, #1
+	beq	.L1925
+	ldr	x0, [x27, 304]
+	cmn	w25, #1
+	str	x0, [x29, 112]
+	csel	w25, w25, w6, ne
+	ldr	w0, [x29, 124]
+	ldr	x26, [x27, 320]
+	cmp	w6, w0
+	bcc	.L1934
+.L1925:
+	mov	w21, w28
+	b	.L1923
+.L1934:
+	mov	w25, w6
+	b	.L1927
+.L1931:
+	cbz	w22, .L1932
+	mov	w0, w20
 	mov	w1, 0
 	bl	mt_auto_read_calibration_config
-	cmn	w28, #1
+	cmn	w25, #1
 	mov	w0, 256
-	csel	w28, w28, w0, eq
-	b	.L1886
-.L1883:
-	cbz	w21, .L1886
-	mov	w0, w19
-	mov	w28, 256
-	bl	mt_auto_read_calibration_config
-.L1886:
+	csel	w25, w25, w0, eq
+.L1932:
 	bl	nandc_wait_flash_ready
-	mov	w0, w28
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 160
+	mov	w0, w25
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 128
 	ret
+.L1930:
+	cbz	w22, .L1932
+	mov	w1, 0
+	mov	w0, w20
+	mov	w25, 256
+	bl	mt_auto_read_calibration_config
+	b	.L1932
 	.size	micron_read_retrial, .-micron_read_retrial
 	.align	2
 	.global	toshiba_3d_read_retrial
 	.type	toshiba_3d_read_retrial, %function
 toshiba_3d_read_retrial:
-	stp	x29, x30, [sp, -128]!
+	stp	x29, x30, [sp, -144]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	mov	w23, w1
-	uxtb	w24, w0
-	stp	x27, x28, [sp,80]
+	stp	x21, x22, [sp, 32]
+	adrp	x22, .LANCHOR0
+	stp	x23, x24, [sp, 48]
+	mov	w24, w1
+	stp	x25, x26, [sp, 64]
+	and	w23, w0, 255
+	stp	x27, x28, [sp, 80]
 	mov	x26, x2
+	stp	x19, x20, [sp, 16]
 	mov	x27, x3
-	str	w4, [x29,124]
-	adrp	x20, .LANCHOR0
+	mov	w28, w4
 	bl	nandc_wait_flash_ready
-	ubfx	x19, x23, 24, 2
-	add	x1, x20, :lo12:.LANCHOR0
-	sxtw	x0, w24
+	add	x0, x22, :lo12:.LANCHOR0
+	and	x1, x23, 255
+	add	x21, x1, 8
+	str	x1, [x29, 120]
 	mov	w2, 46
 	mov	w3, 56
-	add	x0, x0, 8
-	mov	w21, 10
-	ldr	x25, [x1,1048]
-	lsl	x0, x0, 8
-	ldrb	w1, [x1,1136]
-	add	x22, x25, x0
-	cmp	w1, 36
-	csel	w2, w3, w2, ne
-	str	w2, [x29,112]
+	ldrb	w1, [x0, 1136]
+	ubfx	x19, x24, 24, 2
+	ldr	x25, [x0, 1056]
 	cmp	w1, 36
 	mov	w1, 26
-	csel	w21, w21, w1, ne
-	cbnz	w19, .L1911
-	str	x0, [x29,112]
-	adrp	x0, .LC153
-	add	x0, x0, :lo12:.LC153
+	csel	w2, w3, w2, ne
+	str	w2, [x29, 112]
+	mov	w2, 10
+	csel	w1, w2, w1, ne
+	str	w1, [x29, 128]
+	add	x21, x25, x21, lsl 8
+	cbnz	w19, .L1952
+	str	x0, [x29, 136]
+	sxtw	x0, w23
+	add	x0, x0, 8
 	mov	w19, -1
-	mov	w28, 1
-	str	x0, [x29,104]
-.L1918:
-	add	x0, x20, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1136]
+	add	x0, x25, x0, lsl 8
+	mov	w20, 1
+	str	x0, [x29, 112]
+.L1959:
+	ldr	x0, [x29, 136]
+	ldrb	w0, [x0, 1136]
 	cmp	w0, 36
-	mov	x0, x22
-	bne	.L1912
-	mov	w1, w28
+	bne	.L1953
+	mov	w1, w20
+	mov	x0, x21
 	mov	w2, 0
 	bl	toshiba_tlc_set_rr_para
-	ldr	x0, [x29,112]
-	mov	w1, 93
-	add	x0, x25, x0
-	str	w1, [x0,8]
-	b	.L1913
-.L1912:
-	mov	w1, w28
-	bl	toshiba_3d_set_slc_rr_para
-.L1913:
-	ldr	w4, [x29,124]
-	mov	w0, w24
-	mov	w1, w23
-	mov	x2, x26
+	ldr	x1, [x29, 112]
+	mov	w0, 93
+	str	w0, [x1, 8]
+.L1954:
+	mov	w4, w28
 	mov	x3, x27
+	mov	x2, x26
+	mov	w1, w24
+	mov	w0, w23
 	bl	flash_read_page
 	mov	w4, w0
 	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 4, .L1914
-	ldr	x0, [x29,104]
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 4, .L1955
 	mov	w3, w4
-	mov	w1, w28
-	mov	w2, w23
-	str	x4, [x29,96]
+	str	w4, [x29, 108]
+	mov	w2, w24
+	mov	w1, w20
+	adrp	x0, .LC153
+	add	x0, x0, :lo12:.LC153
 	bl	printk
-	ldr	x4, [x29,96]
-.L1914:
+	ldr	w4, [x29, 108]
+.L1955:
 	cmn	w4, #1
-	beq	.L1915
+	beq	.L1956
 	adrp	x0, .LANCHOR5
-	cmn	w19, #1
 	add	x0, x0, :lo12:.LANCHOR5
+	cmn	w19, #1
 	csel	w19, w19, w4, ne
-	ldr	x26, [x0,296]
-	ldr	x27, [x0,312]
-	add	x0, x20, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1244]
+	ldr	x26, [x0, 304]
+	ldr	x27, [x0, 320]
+	ldr	x0, [x29, 136]
+	ldrb	w0, [x0, 1249]
 	add	w0, w0, w0, lsl 1
 	cmp	w4, w0, lsr 2
-	bcc	.L1934
-.L1915:
-	add	w28, w28, 1
-	cmp	w28, w21
-	bne	.L1918
-	b	.L1917
-.L1934:
-	mov	w21, w28
-	mov	w19, w4
-.L1917:
-	add	x0, x20, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1136]
+	bcc	.L1974
+.L1956:
+	ldr	w0, [x29, 128]
+	add	w20, w20, 1
+	cmp	w0, w20
+	bne	.L1959
+.L1958:
+	add	x0, x22, :lo12:.LANCHOR0
+	ldrb	w0, [x0, 1136]
 	cmp	w0, 36
-	mov	x0, x22
-	bne	.L1919
+	bne	.L1960
+	mov	w2, 0
+.L1997:
 	mov	w1, 0
-	mov	w2, w1
-	b	.L1957
-.L1919:
+	mov	x0, x21
+	bl	toshiba_tlc_set_rr_para
+	b	.L1961
+.L1953:
+	mov	w1, w20
+	mov	x0, x21
+	bl	toshiba_3d_set_slc_rr_para
+	b	.L1954
+.L1974:
+	mov	w19, w4
+	b	.L1958
+.L1960:
 	mov	w1, 0
+	mov	x0, x21
 	bl	toshiba_3d_set_slc_rr_para
-	b	.L1920
-.L1911:
-	mov	x28, x0
-	adrp	x0, .LC154
-	add	x0, x0, :lo12:.LC154
+.L1961:
+	add	x0, x22, :lo12:.LANCHOR0
+	ldrb	w0, [x0, 1136]
+	cmp	w0, 36
+	bne	.L1970
+	ldr	x0, [x29, 120]
+	add	x25, x25, x0, lsl 8
+	mov	w0, 85
+	str	w0, [x25, 2056]
+	mov	w0, 255
+	str	wzr, [x25, 2052]
+	str	wzr, [x25, 2048]
+	str	w0, [x25, 2056]
+.L1970:
+	add	x22, x22, :lo12:.LANCHOR0
+	ldrb	w0, [x22, 1249]
+	add	w0, w0, w0, lsl 1
+	cmp	w19, w0, lsr 2
+	bcc	.L1971
+	cmn	w19, #1
+	mov	w0, 256
+	csel	w19, w19, w0, eq
+.L1971:
+	cmp	w19, 256
+	ccmn	w19, #1, 4, ne
+	bne	.L1972
+	adrp	x0, .LC155
+	mov	w4, w19
+	mov	w3, w20
+	mov	w2, w24
+	mov	w1, w23
+	add	x0, x0, :lo12:.LC155
+	bl	printk
+.L1972:
+	bl	nandc_wait_flash_ready
+	mov	w0, w19
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 144
+	ret
+.L1952:
+	str	x0, [x29, 136]
+	sxtw	x0, w23
+	add	x0, x0, 8
 	mov	w19, -1
-	mov	w21, 1
-	str	x0, [x29,104]
-.L1927:
-	add	x0, x20, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1136]
+	add	x0, x25, x0, lsl 8
+	mov	w20, 1
+	str	x0, [x29, 128]
+.L1968:
+	ldr	x0, [x29, 136]
+	ldrb	w0, [x0, 1136]
 	cmp	w0, 36
-	mov	x0, x22
-	bne	.L1921
-	mov	w1, w21
+	bne	.L1962
+	mov	x0, x21
 	mov	w2, 1
+	mov	w1, w20
 	bl	toshiba_tlc_set_rr_para
-	add	x0, x25, x28
-	mov	w1, 93
-	b	.L1956
-.L1921:
-	mov	w1, w21
-	bl	toshiba_3d_set_tlc_rr_para
-	add	x0, x25, x28
-	mov	w1, 38
-.L1956:
-	str	w1, [x0,8]
-	mov	x2, x26
-	mov	w0, w24
-	mov	w1, w23
-	ldr	w4, [x29,124]
+	mov	w0, 93
+.L1996:
+	ldr	x1, [x29, 128]
+	mov	w4, w28
 	mov	x3, x27
+	mov	x2, x26
+	str	w0, [x1, 8]
+	mov	w1, w24
+	mov	w0, w23
 	bl	flash_read_page
 	mov	w4, w0
 	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 4, .L1923
-	ldr	x0, [x29,104]
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 4, .L1964
 	mov	w3, w4
-	mov	w1, w21
-	mov	w2, w23
-	str	x4, [x29,96]
+	str	w4, [x29, 108]
+	mov	w2, w24
+	mov	w1, w20
+	adrp	x0, .LC154
+	add	x0, x0, :lo12:.LC154
 	bl	printk
-	ldr	x4, [x29,96]
-.L1923:
+	ldr	w4, [x29, 108]
+.L1964:
 	cmn	w4, #1
-	beq	.L1924
+	beq	.L1965
 	adrp	x0, .LANCHOR5
-	cmn	w19, #1
 	add	x0, x0, :lo12:.LANCHOR5
+	cmn	w19, #1
 	csel	w19, w19, w4, ne
-	ldr	x26, [x0,296]
-	ldr	x27, [x0,312]
-	add	x0, x20, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1244]
+	ldr	x26, [x0, 304]
+	ldr	x27, [x0, 320]
+	ldr	x0, [x29, 136]
+	ldrb	w0, [x0, 1249]
 	add	w0, w0, w0, lsl 1
 	cmp	w4, w0, lsr 2
-	bcc	.L1935
-.L1924:
-	ldr	w0, [x29,112]
-	add	w21, w21, 1
-	cmp	w21, w0
-	bne	.L1927
-	b	.L1926
-.L1935:
-	mov	w19, w4
-.L1926:
-	add	x0, x20, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1136]
+	bcc	.L1975
+.L1965:
+	ldr	w0, [x29, 112]
+	add	w20, w20, 1
+	cmp	w0, w20
+	bne	.L1968
+.L1967:
+	add	x0, x22, :lo12:.LANCHOR0
+	ldrb	w0, [x0, 1136]
 	cmp	w0, 36
-	mov	x0, x22
-	bne	.L1928
-	mov	w1, 0
+	bne	.L1969
 	mov	w2, 1
-.L1957:
-	bl	toshiba_tlc_set_rr_para
-	b	.L1920
-.L1928:
+	b	.L1997
+.L1962:
+	mov	x0, x21
+	mov	w1, w20
+	bl	toshiba_3d_set_tlc_rr_para
+	mov	w0, 38
+	b	.L1996
+.L1975:
+	mov	w19, w4
+	b	.L1967
+.L1969:
 	mov	w1, 0
+	mov	x0, x21
 	bl	toshiba_3d_set_tlc_rr_para
-.L1920:
-	add	x0, x20, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1136]
-	cmp	w0, 36
-	bne	.L1929
-	ubfiz	x0, x24, 8, 8
-	add	x25, x25, x0
-	mov	w0, 85
-	str	w0, [x25,2056]
-	mov	w0, 255
-	str	wzr, [x25,2052]
-	str	wzr, [x25,2048]
-	str	w0, [x25,2056]
-.L1929:
-	add	x20, x20, :lo12:.LANCHOR0
-	ldrb	w0, [x20,1244]
-	add	w0, w0, w0, lsl 1
-	cmp	w19, w0, lsr 2
-	bcc	.L1930
-	cmn	w19, #1
-	mov	w0, 256
-	csel	w19, w19, w0, eq
-.L1930:
-	cmn	w19, #1
-	beq	.L1936
-	cmp	w19, 256
-	bne	.L1931
-.L1936:
-	adrp	x0, .LC155
-	mov	w1, w24
-	add	x0, x0, :lo12:.LC155
-	mov	w2, w23
-	mov	w3, w21
-	mov	w4, w19
-	bl	printk
-.L1931:
-	bl	nandc_wait_flash_ready
-	mov	w0, w19
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
-	ret
+	b	.L1961
 	.size	toshiba_3d_read_retrial, .-toshiba_3d_read_retrial
 	.align	2
 	.global	toshiba_read_retrial
@@ -12276,623 +12221,614 @@ toshiba_3d_read_retrial:
 toshiba_read_retrial:
 	stp	x29, x30, [sp, -128]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	uxtb	w21, w0
-	str	w1, [x29,124]
-	mov	x26, x2
-	str	w4, [x29,120]
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	stp	x27, x28, [sp,80]
-	mov	x27, x3
+	stp	x19, x20, [sp, 16]
+	and	w19, w0, 255
+	stp	x27, x28, [sp, 80]
+	mov	x27, x2
+	stp	w4, w1, [x29, 120]
+	mov	x28, x3
+	stp	x21, x22, [sp, 32]
+	adrp	x20, .LANCHOR0
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
 	bl	nandc_wait_flash_ready
-	mov	w0, w21
-	adrp	x19, .LANCHOR0
-	mov	w25, 0
+	mov	w0, w19
 	bl	zftl_flash_enter_slc_mode
-	mov	w0, w21
+	mov	w0, w19
 	bl	zftl_flash_exit_slc_mode
-	add	x1, x19, :lo12:.LANCHOR0
-	sxtw	x0, w21
+	add	x1, x20, :lo12:.LANCHOR0
+	and	x0, x19, 255
 	add	x22, x0, 8
-	str	x0, [x29,112]
-	ldrb	w0, [x1,1136]
-	ldr	x23, [x1,1048]
+	str	x0, [x29, 112]
+	ldrb	w0, [x1, 1136]
+	ldr	x23, [x1, 1056]
 	sub	w0, w0, #67
+	and	w0, w0, 255
 	add	x22, x23, x22, lsl 8
-	uxtb	w0, w0
 	cmp	w0, 1
-	bls	.L1959
-	ldrb	w0, [x1,1192]
-	cbz	w0, .L1960
+	bls	.L2016
+	ldrb	w0, [x1, 1192]
+	cbz	w0, .L2017
+	mov	w24, 1
 	mov	w0, 1
-	mov	w25, 1
 	bl	nandc_set_if_mode
-.L1960:
-	ubfiz	x0, x21, 8, 8
+.L2000:
+	and	x0, x19, 255
 	mov	w1, 92
-	add	x0, x23, x0
-	str	w1, [x0,2056]
+	add	x0, x23, x0, lsl 8
+	str	w1, [x0, 2056]
 	mov	w1, 197
-	str	w1, [x0,2056]
-.L1959:
-	ldr	x0, [x29,112]
-	mov	w20, 1
-	mov	w24, -1
+	str	w1, [x0, 2056]
+.L1999:
+	sxtw	x0, w19
+	mov	w21, 1
 	add	x0, x0, 8
-	lsl	x0, x0, 8
-	str	x0, [x29,104]
-	ubfiz	x0, x21, 8, 8
-	str	x0, [x29,96]
-.L1961:
+	mov	w25, -1
+	add	x0, x23, x0, lsl 8
+	str	x0, [x29, 104]
+.L2001:
 	adrp	x0, .LANCHOR5
 	add	x0, x0, :lo12:.LANCHOR5
-	ldrb	w0, [x0,320]
+	ldrb	w0, [x0, 328]
 	add	w0, w0, 1
-	cmp	w20, w0
-	bcs	.L1992
-	add	x0, x19, :lo12:.LANCHOR0
-	mov	w1, w20
-	ldrb	w0, [x0,1136]
-	sub	w0, w0, #67
-	uxtb	w0, w0
-	cmp	w0, 1
-	mov	x0, x22
-	bhi	.L1962
-	bl	sandisk_set_rr_para
-	b	.L1963
-.L1962:
-	bl	toshiba_set_rr_para
-.L1963:
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1136]
-	cmp	w0, 34
-	bne	.L1964
-	adrp	x0, .LANCHOR5
-	add	x0, x0, :lo12:.LANCHOR5
-	ldrb	w0, [x0,320]
-	sub	w0, w0, #3
-	cmp	w20, w0
-	bne	.L1964
-	ldr	x0, [x29,104]
-	mov	w1, 179
-	add	x0, x23, x0
-	str	w1, [x0,8]
-.L1964:
-	ldr	x0, [x29,96]
-	mov	w1, 38
-	ldr	w4, [x29,120]
-	mov	x2, x26
-	add	x0, x23, x0
-	mov	x3, x27
-	str	w1, [x0,2056]
-	mov	w1, 93
-	str	w1, [x0,2056]
-	mov	w0, w21
-	ldr	w1, [x29,124]
-	bl	flash_read_page
-	cmn	w0, #1
-	mov	w28, w0
-	beq	.L1967
-	cmn	w24, #1
-	csel	w24, w24, w0, ne
-	adrp	x0, .LANCHOR5
-	add	x0, x0, :lo12:.LANCHOR5
-	ldr	x26, [x0,296]
-	ldr	x27, [x0,312]
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1244]
-	add	w0, w0, w0, lsl 1
-	cmp	w28, w0, lsr 2
-	bcc	.L1969
-.L1967:
-	add	w20, w20, 1
-	b	.L1961
-.L1992:
-	mov	w28, w24
-.L1969:
-	add	x0, x19, :lo12:.LANCHOR0
+	cmp	w21, w0
+	bcc	.L2010
+	mov	w26, w25
+.L2009:
+	add	x0, x20, :lo12:.LANCHOR0
 	mov	w1, 0
-	ldrb	w0, [x0,1136]
+	ldrb	w0, [x0, 1136]
 	sub	w0, w0, #67
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 1
 	mov	x0, x22
-	bhi	.L1971
+	bhi	.L2011
 	bl	sandisk_set_rr_para
-	b	.L1972
-.L1971:
-	bl	toshiba_set_rr_para
-.L1972:
-	ldr	x0, [x29,112]
-	add	x19, x19, :lo12:.LANCHOR0
-	add	x0, x0, 8
-	add	x23, x23, x0, lsl 8
+.L2012:
+	sxtw	x19, w19
+	add	x20, x20, :lo12:.LANCHOR0
+	add	x19, x19, 8
 	mov	w0, 255
-	str	w0, [x23,8]
-	ldrb	w0, [x19,1244]
+	add	x23, x23, x19, lsl 8
+	str	w0, [x23, 8]
+	ldrb	w0, [x20, 1249]
 	add	w0, w0, w0, lsl 1
-	cmp	w28, w0, lsr 2
-	bcc	.L1973
-	cmn	w28, #1
+	cmp	w26, w0, lsr 2
+	bcc	.L2013
+	cmn	w26, #1
 	mov	w0, 256
-	csel	w28, w28, w0, eq
-.L1973:
-	cmn	w28, #1
-	beq	.L1979
-	cmp	w28, 256
-	bne	.L1974
-.L1979:
+	csel	w26, w26, w0, eq
+.L2013:
+	cmp	w26, 256
+	ccmn	w26, #1, 4, ne
+	bne	.L2014
+	ldr	w2, [x29, 124]
 	adrp	x0, .LC155
-	ldr	w2, [x29,124]
+	mov	w4, w26
+	mov	w3, w21
+	mov	w1, w21
 	add	x0, x0, :lo12:.LC155
-	mov	w1, w20
-	mov	w3, w20
-	mov	w4, w28
 	bl	printk
-.L1974:
+.L2014:
 	bl	nandc_wait_flash_ready
-	cbz	w25, .L1976
+	cbz	w24, .L1998
 	mov	w0, 4
 	bl	nandc_set_if_mode
-.L1976:
-	mov	w0, w28
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+.L1998:
+	mov	w0, w26
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 128
 	ret
+.L2017:
+	mov	w24, 0
+	b	.L2000
+.L2016:
+	mov	w24, 0
+	b	.L1999
+.L2010:
+	add	x0, x20, :lo12:.LANCHOR0
+	mov	w1, w21
+	ldrb	w0, [x0, 1136]
+	sub	w0, w0, #67
+	and	w0, w0, 255
+	cmp	w0, 1
+	mov	x0, x22
+	bhi	.L2002
+	bl	sandisk_set_rr_para
+.L2003:
+	add	x0, x20, :lo12:.LANCHOR0
+	ldrb	w0, [x0, 1136]
+	cmp	w0, 34
+	bne	.L2004
+	adrp	x0, .LANCHOR5
+	add	x0, x0, :lo12:.LANCHOR5
+	ldrb	w0, [x0, 328]
+	sub	w0, w0, #3
+	cmp	w21, w0
+	bne	.L2004
+	ldr	x1, [x29, 104]
+	mov	w0, 179
+	str	w0, [x1, 8]
+.L2004:
+	ldr	x0, [x29, 112]
+	mov	w1, 38
+	ldr	w4, [x29, 120]
+	mov	x3, x28
+	mov	x2, x27
+	add	x0, x23, x0, lsl 8
+	str	w1, [x0, 2056]
+	mov	w1, 93
+	str	w1, [x0, 2056]
+	mov	w0, w19
+	ldr	w1, [x29, 124]
+	bl	flash_read_page
+	mov	w26, w0
+	cmn	w0, #1
+	beq	.L2007
+	cmn	w25, #1
+	csel	w25, w25, w0, ne
+	adrp	x0, .LANCHOR5
+	add	x0, x0, :lo12:.LANCHOR5
+	ldr	x27, [x0, 304]
+	ldr	x28, [x0, 320]
+	add	x0, x20, :lo12:.LANCHOR0
+	ldrb	w0, [x0, 1249]
+	add	w0, w0, w0, lsl 1
+	cmp	w26, w0, lsr 2
+	bcc	.L2009
+.L2007:
+	add	w21, w21, 1
+	b	.L2001
+.L2002:
+	bl	toshiba_set_rr_para
+	b	.L2003
+.L2011:
+	bl	toshiba_set_rr_para
+	b	.L2012
 	.size	toshiba_read_retrial, .-toshiba_read_retrial
 	.align	2
 	.global	ymtc_3d_read_retrial
 	.type	ymtc_3d_read_retrial, %function
 ymtc_3d_read_retrial:
-	stp	x29, x30, [sp, -96]!
+	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	uxtb	x22, w0
+	stp	x19, x20, [sp, 16]
+	mov	w19, -1
+	stp	x21, x22, [sp, 32]
+	adrp	x22, .LANCHOR0
+	stp	x23, x24, [sp, 48]
 	mov	w24, w1
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
+	and	w23, w0, 255
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
 	mov	x25, x2
 	mov	x26, x3
 	mov	w27, w4
 	bl	nandc_wait_flash_ready
-	mov	w0, w22
-	adrp	x21, .LANCHOR0
-	mov	x23, x22
-	mov	w19, -1
+	ubfiz	x28, x23, 8, 8
+	mov	w0, w23
 	bl	zftl_flash_enter_slc_mode
-	mov	w20, 1
-	mov	w0, w22
-	add	x22, x22, 8
-	adrp	x28, .LANCHOR5
+	mov	w0, w23
 	bl	zftl_flash_exit_slc_mode
-	add	x0, x21, :lo12:.LANCHOR0
-	ldr	x0, [x0,1048]
-	add	x22, x0, x22, lsl 8
-	ubfx	x0, x24, 24, 2
-	cbnz	w0, .L2003
-.L1998:
-	mov	x0, x22
+	add	x1, x22, :lo12:.LANCHOR0
+	add	x0, x28, 2048
+	adrp	x5, .LANCHOR5
+	mov	w20, 1
+	add	x5, x5, :lo12:.LANCHOR5
+	mov	x21, x1
+	ldr	x28, [x1, 1056]
+	tst	x24, 50331648
+	add	x28, x28, x0
+	bne	.L2040
+.L2035:
+	str	x5, [x29, 104]
 	mov	w1, w20
+	mov	x0, x28
 	bl	ymtc_3d_set_slc_rr_para
-	mov	w0, w23
-	mov	w1, w24
-	mov	x2, x25
-	mov	x3, x26
 	mov	w4, w27
+	mov	x3, x26
+	mov	x2, x25
+	mov	w1, w24
+	mov	w0, w23
 	bl	flash_read_page
+	ldr	x5, [x29, 104]
 	cmn	w0, #1
-	beq	.L1995
-	add	x1, x28, :lo12:.LANCHOR5
+	beq	.L2032
+	ldrb	w1, [x21, 1249]
 	cmn	w19, #1
 	csel	w19, w19, w0, ne
-	ldr	x25, [x1,296]
-	ldr	x26, [x1,312]
-	add	x1, x21, :lo12:.LANCHOR0
-	ldrb	w1, [x1,1244]
+	ldr	x25, [x5, 304]
+	ldr	x26, [x5, 320]
 	add	w1, w1, w1, lsl 1
 	cmp	w0, w1, lsr 2
-	bcc	.L2007
-.L1995:
+	bcc	.L2043
+.L2032:
 	add	w20, w20, 1
 	cmp	w20, 10
-	bne	.L1998
-	b	.L1997
-.L2007:
-	mov	w19, w0
-.L1997:
-	mov	x0, x22
+	bne	.L2035
+.L2034:
 	mov	w1, 0
+	mov	x0, x28
 	bl	ymtc_3d_set_slc_rr_para
-	b	.L1999
-.L2023:
-	add	x1, x28, :lo12:.LANCHOR5
-	cmn	w19, #1
-	csel	w19, w19, w0, ne
-	ldr	x25, [x1,296]
-	ldr	x26, [x1,312]
-	add	x1, x21, :lo12:.LANCHOR0
-	ldrb	w1, [x1,1244]
-	add	w1, w1, w1, lsl 1
-	cmp	w0, w1, lsr 2
-	bcc	.L2008
-.L2000:
-	add	w20, w20, 1
-	cmp	w20, 51
-	beq	.L2002
-.L2003:
-	mov	x0, x22
-	mov	w1, w20
-	bl	ymtc_3d_set_tlc_rr_para
-	mov	w0, w23
-	mov	w1, w24
-	mov	x2, x25
-	mov	x3, x26
-	mov	w4, w27
-	bl	flash_read_page
-	cmn	w0, #1
-	bne	.L2023
-	b	.L2000
-.L2008:
-	mov	w19, w0
-.L2002:
-	mov	x0, x22
-	mov	w1, 0
-	bl	ymtc_3d_set_tlc_rr_para
-.L1999:
-	add	x21, x21, :lo12:.LANCHOR0
-	ldrb	w0, [x21,1244]
+.L2036:
+	add	x22, x22, :lo12:.LANCHOR0
+	ldrb	w0, [x22, 1249]
 	add	w0, w0, w0, lsl 1
 	cmp	w19, w0, lsr 2
-	bcc	.L2004
+	bcc	.L2041
 	cmn	w19, #1
 	mov	w0, 256
 	csel	w19, w19, w0, eq
-.L2004:
-	cmn	w19, #1
-	beq	.L2009
+.L2041:
 	cmp	w19, 256
-	bne	.L2005
-.L2009:
+	ccmn	w19, #1, 4, ne
+	bne	.L2042
 	adrp	x0, .LC156
+	mov	w4, w19
+	mov	w3, w20
+	mov	w2, w24
 	mov	w1, w20
 	add	x0, x0, :lo12:.LC156
-	mov	w2, w24
-	mov	w3, w20
-	mov	w4, w19
 	bl	printk
-.L2005:
+.L2042:
 	bl	nandc_wait_flash_ready
 	mov	w0, w19
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 96
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 112
 	ret
+.L2043:
+	mov	w19, w0
+	b	.L2034
+.L2040:
+	str	x5, [x29, 104]
+	mov	w1, w20
+	mov	x0, x28
+	bl	ymtc_3d_set_tlc_rr_para
+	mov	w4, w27
+	mov	x3, x26
+	mov	x2, x25
+	mov	w1, w24
+	mov	w0, w23
+	bl	flash_read_page
+	ldr	x5, [x29, 104]
+	cmn	w0, #1
+	beq	.L2037
+	ldrb	w1, [x21, 1249]
+	cmn	w19, #1
+	csel	w19, w19, w0, ne
+	ldr	x25, [x5, 304]
+	ldr	x26, [x5, 320]
+	add	w1, w1, w1, lsl 1
+	cmp	w0, w1, lsr 2
+	bcc	.L2044
+.L2037:
+	add	w20, w20, 1
+	cmp	w20, 51
+	bne	.L2040
+.L2039:
+	mov	w1, 0
+	mov	x0, x28
+	bl	ymtc_3d_set_tlc_rr_para
+	b	.L2036
+.L2044:
+	mov	w19, w0
+	b	.L2039
 	.size	ymtc_3d_read_retrial, .-ymtc_3d_read_retrial
 	.align	2
 	.global	samsung_read_retrial
 	.type	samsung_read_retrial, %function
 samsung_read_retrial:
-	stp	x29, x30, [sp, -144]!
+	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	mov	w22, w1
-	uxtb	w23, w0
-	stp	x25, x26, [sp,64]
-	str	w4, [x29,140]
-	mov	x25, x2
-	mov	x26, x3
-	adrp	x21, .LANCHOR0
-	stp	x19, x20, [sp,16]
-	stp	x27, x28, [sp,80]
+	stp	x21, x22, [sp, 32]
+	and	w22, w0, 255
+	mov	w21, w1
+	stp	x23, x24, [sp, 48]
+	str	w4, [x29, 108]
+	mov	x23, x2
+	mov	x24, x3
+	stp	x19, x20, [sp, 16]
+	stp	x25, x26, [sp, 64]
+	adrp	x20, .LANCHOR0
+	stp	x27, x28, [sp, 80]
 	bl	nandc_wait_flash_ready
-	uxtb	x19, w23
-	mov	w0, w23
+	mov	w0, w22
 	bl	zftl_flash_enter_slc_mode
-	mov	w0, w23
+	mov	w0, w22
 	bl	zftl_flash_exit_slc_mode
-	add	x0, x21, :lo12:.LANCHOR0
-	adrp	x5, .LANCHOR4
-	add	x5, x5, :lo12:.LANCHOR4
-	ldr	x24, [x0,1048]
-	ubfx	x0, x22, 24, 2
-	cbnz	w0, .L2025
-	add	x0, x5, 161
-	add	x5, x5, 136
-	str	x0, [x29,120]
-	mov	w0, 1
-	sub	w0, w0, w5
-	str	w0, [x29,112]
-	lsl	x0, x19, 8
-	str	x0, [x29,128]
-	add	x19, x24, x0
-	adrp	x0, .LC157
-	add	x0, x0, :lo12:.LC157
-	mov	w27, -1
-	str	x0, [x29,104]
-.L2030:
-	ldr	w0, [x29,112]
-	str	x5, [x29,96]
-	add	w20, w0, w5
+	add	x0, x20, :lo12:.LANCHOR0
+	tst	x21, 50331648
+	and	x5, x22, 255
+	adrp	x7, .LANCHOR4
+	ldr	x0, [x0, 1056]
+	bne	.L2060
+	add	x7, x7, :lo12:.LANCHOR4
+	adrp	x25, .LC157
+	add	x25, x25, :lo12:.LC157
+	add	x27, x0, x5, lsl 8
+	mov	x28, 0
+	add	x0, x7, 152
+	mov	w26, -1
+	str	x0, [x29, 96]
+.L2065:
 	mov	w0, 239
-	str	w0, [x19,2056]
+	str	w0, [x27, 2056]
 	mov	w0, 141
-	str	w0, [x19,2052]
-	ldrsb	w0, [x5,1]
-	str	w0, [x19,2048]
-	str	wzr, [x19,2048]
-	str	wzr, [x19,2048]
-	str	wzr, [x19,2048]
+	str	w0, [x27, 2052]
+	ldr	x0, [x29, 96]
+	add	w19, w28, 1
+	add	x0, x0, x28
+	ldrsb	w0, [x0, 1]
+	str	w0, [x27, 2048]
+	str	wzr, [x27, 2048]
+	str	wzr, [x27, 2048]
+	str	wzr, [x27, 2048]
 	bl	nandc_wait_flash_ready
-	ldr	w4, [x29,140]
-	mov	w0, w23
-	mov	w1, w22
-	mov	x2, x25
-	mov	x3, x26
+	ldr	w4, [x29, 108]
+	mov	x3, x24
+	mov	x2, x23
+	mov	w1, w21
+	mov	w0, w22
 	bl	flash_read_page
-	mov	w28, w0
+	mov	w4, w0
 	adrp	x0, .LANCHOR2
-	ldr	x5, [x29,96]
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 4, .L2026
-	ldr	x0, [x29,104]
-	mov	w1, w20
-	mov	w2, w22
-	mov	w3, w28
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 4, .L2061
+	mov	w3, w4
+	str	w4, [x29, 104]
+	mov	w2, w21
+	mov	w1, w19
+	mov	x0, x25
 	bl	printk
-	ldr	x5, [x29,96]
-.L2026:
-	cmn	w28, #1
-	beq	.L2027
+	ldr	w4, [x29, 104]
+.L2061:
+	cmn	w4, #1
+	beq	.L2062
 	adrp	x0, .LANCHOR5
-	cmn	w27, #1
 	add	x0, x0, :lo12:.LANCHOR5
-	csel	w27, w27, w28, ne
-	ldr	x25, [x0,296]
-	ldr	x26, [x0,312]
-	add	x0, x21, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1244]
+	cmn	w26, #1
+	csel	w26, w26, w4, ne
+	ldr	x23, [x0, 304]
+	ldr	x24, [x0, 320]
+	add	x0, x20, :lo12:.LANCHOR0
+	ldrb	w0, [x0, 1249]
 	add	w0, w0, w0, lsl 1
-	cmp	w28, w0, lsr 2
-	bcc	.L2040
-.L2027:
-	ldr	x0, [x29,120]
-	add	x5, x5, 1
-	cmp	x5, x0
-	bne	.L2030
-	mov	w20, 26
-	b	.L2029
-.L2040:
-	mov	w27, w28
-.L2029:
-	ldr	x0, [x29,128]
-	add	x19, x24, x0
+	cmp	w4, w0, lsr 2
+	bcc	.L2074
+.L2062:
+	add	x28, x28, 1
+	cmp	x28, 25
+	bne	.L2065
+	mov	w19, 26
+.L2064:
 	mov	w0, 239
-	str	w0, [x19,2056]
+	str	w0, [x27, 2056]
 	mov	w0, 141
-	b	.L2062
-.L2025:
-	lsl	x0, x19, 8
-	str	x0, [x29,128]
-	add	x19, x24, x0
-	adrp	x0, .LC158
-	add	x0, x0, :lo12:.LC158
-	add	x28, x5, 168
-	mov	w27, -1
-	mov	w20, 1
-	str	x0, [x29,120]
-.L2036:
-	mov	w0, 239
-	str	w0, [x19,2056]
-	mov	w0, 137
-	str	w0, [x19,2052]
-	ldrb	w0, [x28,4]
-	str	w0, [x19,2048]
-	ldrb	w0, [x28,5]
-	str	w0, [x19,2048]
-	ldrb	w0, [x28,6]
-	str	w0, [x19,2048]
-	ldrb	w0, [x28,7]
-	str	w0, [x19,2048]
+	str	w0, [x27, 2052]
+	str	wzr, [x27, 2048]
+	str	wzr, [x27, 2048]
+	str	wzr, [x27, 2048]
+	str	wzr, [x27, 2048]
+.L2096:
+	add	x20, x20, :lo12:.LANCHOR0
 	bl	nandc_wait_flash_ready
-	ldr	w4, [x29,140]
-	mov	w0, w23
-	mov	w1, w22
-	mov	x2, x25
-	mov	x3, x26
+	ldrb	w0, [x20, 1249]
+	add	w0, w0, w0, lsl 1
+	cmp	w26, w0, lsr 2
+	bcc	.L2072
+	cmn	w26, #1
+	mov	w0, 256
+	csel	w26, w26, w0, eq
+.L2072:
+	cmp	w26, 256
+	ccmn	w26, #1, 4, ne
+	bne	.L2073
+	adrp	x0, .LC159
+	mov	w4, w26
+	mov	w3, w19
+	mov	w2, w21
+	mov	w1, w19
+	add	x0, x0, :lo12:.LC159
+	bl	printk
+.L2073:
+	bl	nandc_wait_flash_ready
+	mov	w0, w26
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L2074:
+	mov	w26, w4
+	b	.L2064
+.L2060:
+	add	x7, x7, :lo12:.LANCHOR4
+	adrp	x25, .LC158
+	add	x27, x7, 188
+	add	x28, x0, x5, lsl 8
+	add	x25, x25, :lo12:.LC158
+	mov	w26, -1
+	mov	w19, 1
+.L2071:
+	mov	w0, 239
+	str	w0, [x28, 2056]
+	mov	w0, 137
+	str	w0, [x28, 2052]
+	ldrb	w0, [x27]
+	str	w0, [x28, 2048]
+	ldrb	w0, [x27, 1]
+	str	w0, [x28, 2048]
+	ldrb	w0, [x27, 2]
+	str	w0, [x28, 2048]
+	ldrb	w0, [x27, 3]
+	str	w0, [x28, 2048]
+	bl	nandc_wait_flash_ready
+	ldr	w4, [x29, 108]
+	mov	x3, x24
+	mov	x2, x23
+	mov	w1, w21
+	mov	w0, w22
 	bl	flash_read_page
 	mov	w4, w0
 	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 4, .L2032
-	ldr	x0, [x29,120]
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 4, .L2067
 	mov	w3, w4
-	mov	w1, w20
-	mov	w2, w22
-	str	x4, [x29,112]
+	str	w4, [x29, 96]
+	mov	w2, w21
+	mov	w1, w19
+	mov	x0, x25
 	bl	printk
-	ldr	x4, [x29,112]
-.L2032:
+	ldr	w4, [x29, 96]
+.L2067:
 	cmn	w4, #1
-	beq	.L2033
+	beq	.L2068
 	adrp	x0, .LANCHOR5
-	cmn	w27, #1
 	add	x0, x0, :lo12:.LANCHOR5
-	csel	w27, w27, w4, ne
-	ldr	x25, [x0,296]
-	ldr	x26, [x0,312]
-	add	x0, x21, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1244]
+	cmn	w26, #1
+	csel	w26, w26, w4, ne
+	ldr	x23, [x0, 304]
+	ldr	x24, [x0, 320]
+	add	x0, x20, :lo12:.LANCHOR0
+	ldrb	w0, [x0, 1249]
 	add	w0, w0, w0, lsl 1
 	cmp	w4, w0, lsr 2
-	bcc	.L2041
-.L2033:
-	add	w20, w20, 1
-	add	x28, x28, 4
-	cmp	w20, 26
-	bne	.L2036
-	b	.L2035
-.L2041:
-	mov	w27, w4
-.L2035:
-	ldr	x0, [x29,128]
-	add	x19, x24, x0
+	bcc	.L2075
+.L2068:
+	add	w19, w19, 1
+	add	x27, x27, 4
+	cmp	w19, 26
+	bne	.L2071
+.L2070:
 	mov	w0, 239
-	str	w0, [x19,2056]
+	str	w0, [x28, 2056]
 	mov	w0, 137
-.L2062:
-	str	w0, [x19,2052]
-	add	x21, x21, :lo12:.LANCHOR0
-	str	wzr, [x19,2048]
-	str	wzr, [x19,2048]
-	str	wzr, [x19,2048]
-	str	wzr, [x19,2048]
-	bl	nandc_wait_flash_ready
-	ldrb	w0, [x21,1244]
-	add	w0, w0, w0, lsl 1
-	cmp	w27, w0, lsr 2
-	bcc	.L2037
-	cmn	w27, #1
-	mov	w0, 256
-	csel	w27, w27, w0, eq
-.L2037:
-	cmn	w27, #1
-	beq	.L2042
-	cmp	w27, 256
-	bne	.L2038
-.L2042:
-	adrp	x0, .LC159
-	mov	w1, w20
-	add	x0, x0, :lo12:.LC159
-	mov	w2, w22
-	mov	w3, w20
-	mov	w4, w27
-	bl	printk
-.L2038:
-	bl	nandc_wait_flash_ready
-	mov	w0, w27
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 144
-	ret
+	str	w0, [x28, 2052]
+	str	wzr, [x28, 2048]
+	str	wzr, [x28, 2048]
+	str	wzr, [x28, 2048]
+	str	wzr, [x28, 2048]
+	b	.L2096
+.L2075:
+	mov	w26, w4
+	b	.L2070
 	.size	samsung_read_retrial, .-samsung_read_retrial
 	.align	2
 	.global	hynix_read_retrial
 	.type	hynix_read_retrial, %function
 hynix_read_retrial:
 	stp	x29, x30, [sp, -128]!
+	adrp	x5, .LANCHOR0
+	add	x8, x5, :lo12:.LANCHOR0
 	add	x29, sp, 0
-	stp	x27, x28, [sp,80]
-	adrp	x28, .LANCHOR0
-	stp	x21, x22, [sp,32]
-	uxtb	x22, w0
-	add	x0, x28, :lo12:.LANCHOR0
-	stp	x25, x26, [sp,64]
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
+	stp	x21, x22, [sp, 32]
+	mov	w22, w1
+	stp	x25, x26, [sp, 64]
 	mov	x25, x2
-	mov	w23, w1
-	ldr	x5, [x0,1128]
+	stp	x19, x20, [sp, 16]
 	mov	x26, x3
-	str	w4, [x29,124]
-	mov	x21, x22
-	add	x27, x5, 112
+	stp	x23, x24, [sp, 48]
+	and	x23, x0, 255
+	stp	x27, x28, [sp, 80]
+	mov	w27, w4
+	stp	x5, x8, [x29, 112]
+	mov	x21, x23
+	ldr	x28, [x8, 1048]
 	mov	w19, -1
-	add	x0, x27, x22
-	ldrb	w24, [x27,2]
-	ldrb	w20, [x0,8]
+	add	x28, x28, 112
+	add	x0, x28, x23
+	ldrb	w24, [x28, 2]
+	ldrb	w20, [x0, 8]
 	bl	nandc_wait_flash_ready
-	mov	w0, w22
+	mov	w0, w23
 	bl	zftl_flash_enter_slc_mode
-	mov	w0, w22
+	mov	w0, w23
 	bl	zftl_flash_exit_slc_mode
-	mov	w6, 0
+	ldp	x5, x8, [x29, 112]
 	adrp	x7, .LANCHOR5
-.L2064:
+	add	x7, x7, :lo12:.LANCHOR5
+	mov	w6, 0
+.L2098:
 	cmp	w6, w24
-	bcs	.L2068
-	add	w20, w20, 1
-	mov	w0, w21
-	str	x7, [x29,104]
-	uxtb	w20, w20
-	str	x6, [x29,112]
-	cmp	w20, w24
-	csel	w20, w20, wzr, cc
-	mov	w1, w20
-	bl	hynix_set_rr_para
-	ldr	w4, [x29,124]
-	mov	w0, w21
-	mov	w1, w23
-	mov	x2, x25
-	mov	x3, x26
-	bl	flash_read_page
-	cmn	w0, #1
-	ldr	x6, [x29,112]
-	ldr	x7, [x29,104]
-	beq	.L2066
-	add	x1, x7, :lo12:.LANCHOR5
-	cmn	w19, #1
-	csel	w19, w19, w0, ne
-	ldr	x25, [x1,296]
-	ldr	x26, [x1,312]
-	add	x1, x28, :lo12:.LANCHOR0
-	ldrb	w1, [x1,1244]
-	add	w1, w1, w1, lsl 1
-	cmp	w0, w1, lsr 2
-	bcc	.L2073
-.L2066:
-	add	w6, w6, 1
-	b	.L2064
-.L2073:
-	mov	w19, w0
-.L2068:
-	add	x28, x28, :lo12:.LANCHOR0
-	add	x22, x27, x22
-	ldrb	w0, [x28,1244]
-	strb	w20, [x22,8]
+	bcc	.L2103
+.L2102:
+	add	x1, x5, :lo12:.LANCHOR0
+	add	x23, x28, x23
+	ldrb	w0, [x1, 1249]
+	strb	w20, [x23, 8]
 	add	w0, w0, w0, lsl 1
 	cmp	w19, w0, lsr 2
-	bcc	.L2070
+	bcc	.L2104
 	cmn	w19, #1
 	mov	w0, 256
 	csel	w19, w19, w0, eq
-.L2070:
-	cmn	w19, #1
-	beq	.L2074
+.L2104:
 	cmp	w19, 256
-	bne	.L2071
-.L2074:
+	ccmn	w19, #1, 4, ne
+	bne	.L2105
 	adrp	x0, .LC160
+	mov	w4, w19
+	mov	w3, w6
+	mov	w2, w22
 	mov	w1, w6
 	add	x0, x0, :lo12:.LC160
-	mov	w2, w23
-	mov	w3, w6
-	mov	w4, w19
 	bl	printk
-.L2071:
+.L2105:
 	bl	nandc_wait_flash_ready
 	mov	w0, w19
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 128
 	ret
+.L2103:
+	add	w20, w20, 1
+	stp	x8, x7, [x29, 96]
+	and	w20, w20, 255
+	str	x5, [x29, 112]
+	cmp	w24, w20
+	str	w6, [x29, 120]
+	csel	w20, w20, wzr, hi
+	mov	w0, w21
+	mov	w1, w20
+	bl	hynix_set_rr_para
+	mov	w4, w27
+	mov	x3, x26
+	mov	x2, x25
+	mov	w1, w22
+	mov	w0, w21
+	bl	flash_read_page
+	ldr	w6, [x29, 120]
+	cmn	w0, #1
+	ldp	x8, x7, [x29, 96]
+	ldr	x5, [x29, 112]
+	beq	.L2100
+	ldrb	w1, [x8, 1249]
+	cmn	w19, #1
+	csel	w19, w19, w0, ne
+	ldr	x25, [x7, 304]
+	ldr	x26, [x7, 320]
+	add	w1, w1, w1, lsl 1
+	cmp	w0, w1, lsr 2
+	bcc	.L2106
+.L2100:
+	add	w6, w6, 1
+	b	.L2098
+.L2106:
+	mov	w19, w0
+	b	.L2102
 	.size	hynix_read_retrial, .-hynix_read_retrial
 	.align	2
 	.global	flash_ddr_tuning_read
@@ -12900,119 +12836,98 @@ hynix_read_retrial:
 flash_ddr_tuning_read:
 	stp	x29, x30, [sp, -128]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	uxtb	w20, w0
+	stp	x19, x20, [sp, 16]
+	and	w20, w0, 255
+	stp	x21, x22, [sp, 32]
 	mov	w22, w1
+	stp	x23, x24, [sp, 48]
 	mov	x24, x2
-	mov	x23, x3
-	str	w4, [x29,120]
+	stp	x25, x26, [sp, 64]
+	adrp	x23, .LANCHOR5
+	stp	x27, x28, [sp, 80]
+	mov	x25, x3
+	str	w4, [x29, 120]
+	add	x23, x23, :lo12:.LANCHOR5
 	bl	nandc_get_ddr_para
-	mov	w27, 0
-	str	w0, [x29,116]
+	mov	w28, 0
+	str	w0, [x29, 116]
+	mov	w26, 0
 	adrp	x0, .LC161
-	str	w27, [x29,124]
+	mov	w27, 0
 	add	x0, x0, :lo12:.LC161
-	mov	w25, w27
-	mov	w28, w27
 	mov	w19, 1024
-	mov	w26, 6
 	mov	w21, -1
-	str	x0, [x29,104]
-.L2089:
-	mov	w0, w26
+	mov	w7, 6
+	str	wzr, [x29, 124]
+	str	x0, [x29, 104]
+.L2122:
+	mov	w0, w7
+	str	w7, [x29, 112]
 	bl	nandc_set_ddr_para
-	ldr	w4, [x29,120]
-	mov	w0, w20
-	mov	w1, w22
+	ldr	w4, [x29, 120]
+	mov	x3, x25
 	mov	x2, x24
-	mov	x3, x23
+	mov	w1, w22
+	mov	w0, w20
 	bl	flash_read_page
 	mov	w4, w0
 	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 4, .L2084
-	ldr	x0, [x29,104]
+	ldr	w7, [x29, 112]
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 4, .L2117
+	ldr	x0, [x29, 104]
 	mov	w3, w4
-	mov	w1, w26
+	mov	w1, w7
+	str	w4, [x29, 100]
+	str	w7, [x29, 112]
 	mov	w2, w22
-	str	x4, [x29,96]
 	bl	printk
-	ldr	x4, [x29,96]
-.L2084:
+	ldr	w4, [x29, 100]
+	ldr	w7, [x29, 112]
+.L2117:
 	add	w0, w19, 1
 	cmp	w4, w0
-	bhi	.L2085
-	adrp	x0, .LANCHOR5
-	add	x0, x0, :lo12:.LANCHOR5
-	ldr	x24, [x0,296]
-	ldr	x23, [x0,312]
-	adrp	x0, .LANCHOR0
-	add	x0, x0, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1244]
+	bhi	.L2118
+	adrp	x0, .LANCHOR0+1249
+	ldr	x24, [x23, 304]
+	ldr	x25, [x23, 320]
+	ldrb	w0, [x0, #:lo12:.LANCHOR0+1249]
 	cmp	w4, w0, lsr 2
-	bcs	.L2095
-	add	w28, w28, 1
-	cmp	w28, 7
-	bls	.L2095
-	sub	w27, w26, w28
-	mov	w19, w4
-	mov	w21, 0
-	b	.L2087
-.L2085:
-	cmp	w25, w28
-	bcs	.L2096
-	sub	w0, w27, w28
-	cmp	w28, 7
-	str	w0, [x29,124]
-	bhi	.L2088
-	mov	w25, w28
-	b	.L2096
-.L2095:
-	mov	w27, w26
+	bcs	.L2128
+	add	w27, w27, 1
+	cmp	w27, 7
+	bls	.L2128
+	sub	w28, w7, w27
 	mov	w19, w4
 	mov	w21, 0
-	b	.L2086
-.L2096:
-	mov	w28, 0
-.L2086:
-	add	w26, w26, 2
-	cmp	w26, 50
-	bne	.L2089
-.L2087:
-	ldr	w0, [x29,124]
-	cmp	w25, w28
-	csel	w27, w27, w0, ls
-.L2088:
-	cbz	w27, .L2090
-	adrp	x0, .LANCHOR0+1244
+.L2120:
+	ldr	w0, [x29, 124]
+	cmp	w27, w26
+	csel	w28, w28, w0, cs
+.L2121:
+	cbz	w28, .L2123
+	adrp	x0, .LANCHOR0+1249
 	mov	w1, 3
-	ldrb	w0, [x0,#:lo12:.LANCHOR0+1244]
+	ldrb	w0, [x0, #:lo12:.LANCHOR0+1249]
 	udiv	w0, w0, w1
-	cmp	w19, w0
-	bcs	.L2090
+	cmp	w0, w19
+	bls	.L2123
+	mov	w1, w28
 	adrp	x0, .LC162
-	mov	w1, w27
 	add	x0, x0, :lo12:.LC162
 	bl	printk
-	mov	w0, w27
-	b	.L2108
-.L2090:
-	ldrb	w0, [x29,116]
-.L2108:
+	mov	w0, w28
+.L2142:
 	bl	nandc_set_ddr_para
-	cbz	w21, .L2092
+	cbz	w21, .L2116
 	adrp	x0, .LANCHOR0
 	add	x27, x0, :lo12:.LANCHOR0
-	mov	x26, x0
-	ldrb	w1, [x27,1304]
-	tbz	x1, 0, .L2092
-	adrp	x0, .LC163
+	mov	x23, x0
+	ldrb	w1, [x27, 1248]
+	tbz	x1, 0, .L2116
 	mov	w2, w22
 	mov	w1, w20
+	adrp	x0, .LC163
 	add	x0, x0, :lo12:.LC163
 	bl	printk
 	mov	w0, w20
@@ -13023,51 +12938,74 @@ flash_ddr_tuning_read:
 	bl	nandc_set_if_mode
 	add	x0, x27, w20, sxtw
 	mov	w1, 2
-	strb	w1, [x0,1264]
+	strb	w1, [x0, 1208]
 	mov	w0, w20
 	bl	zftl_flash_enter_slc_mode
-	ldr	w4, [x29,120]
-	mov	w1, w22
+	ldr	w4, [x29, 120]
+	mov	x3, x25
 	mov	x2, x24
-	mov	x3, x23
+	mov	w1, w22
 	mov	w0, w20
 	bl	flash_read_page
 	mov	w19, w0
-	adrp	x0, .LC164
+	mov	w3, w0
+	mov	w2, w22
 	mov	w1, w20
+	adrp	x0, .LC164
 	add	x0, x0, :lo12:.LC164
-	mov	w2, w22
-	mov	w3, w19
 	bl	printk
-	ldrb	w0, [x27,1244]
+	ldrb	w0, [x27, 1249]
 	cmp	w19, w0
-	bhi	.L2097
+	bhi	.L2130
 	adrp	x1, .LANCHOR5
 	add	x1, x1, :lo12:.LANCHOR5
-	ldr	w0, [x1,324]
+	ldr	w0, [x1, 332]
 	add	w0, w0, 1
-	str	w0, [x1,324]
+	str	w0, [x1, 332]
 	cmp	w0, 100
-	bls	.L2093
-	strb	wzr, [x27,1192]
-	b	.L2092
-.L2097:
-	mov	w19, w21
-.L2093:
-	add	x20, x26, :lo12:.LANCHOR0
-	ldrb	w0, [x20,1304]
-	bl	flash_set_interface_mode
-	ldrb	w0, [x20,1304]
-	bl	nandc_set_if_mode
-.L2092:
+	bls	.L2126
+	strb	wzr, [x27, 1192]
+.L2116:
 	mov	w0, w19
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 128
 	ret
+.L2118:
+	cmp	w27, w26
+	bls	.L2129
+	sub	w0, w28, w27
+	str	w0, [x29, 124]
+	cmp	w27, 7
+	bhi	.L2121
+	mov	w26, w27
+.L2129:
+	mov	w27, 0
+	b	.L2119
+.L2128:
+	mov	w28, w7
+	mov	w19, w4
+	mov	w21, 0
+.L2119:
+	add	w7, w7, 2
+	cmp	w7, 50
+	bne	.L2122
+	b	.L2120
+.L2123:
+	ldrb	w0, [x29, 116]
+	b	.L2142
+.L2130:
+	mov	w19, w21
+.L2126:
+	add	x23, x23, :lo12:.LANCHOR0
+	ldrb	w0, [x23, 1248]
+	bl	flash_set_interface_mode
+	ldrb	w0, [x23, 1248]
+	bl	nandc_set_if_mode
+	b	.L2116
 	.size	flash_ddr_tuning_read, .-flash_ddr_tuning_read
 	.align	2
 	.global	flash_read_page_en
@@ -13075,131 +13013,132 @@ flash_ddr_tuning_read:
 flash_read_page_en:
 	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR0
-	mov	w19, w1
-	stp	x25, x26, [sp,64]
-	uxtb	w25, w0
+	stp	x25, x26, [sp, 64]
+	and	w25, w0, 255
 	add	x0, x20, :lo12:.LANCHOR0
-	stp	x23, x24, [sp,48]
-	stp	x21, x22, [sp,32]
-	mov	x24, x2
+	stp	x23, x24, [sp, 48]
+	stp	x21, x22, [sp, 32]
+	mov	w19, w1
+	mov	x22, x2
 	mov	x23, x3
-	ldrb	w0, [x0,1153]
-	mov	w22, w4
+	ldrb	w0, [x0, 1153]
+	mov	w24, w4
 	cmp	w0, w25
-	bhi	.L2110
+	bhi	.L2144
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 288
 	mov	w2, 431
-	add	x1, x1, 272
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L2110:
+.L2144:
 	add	x0, x20, :lo12:.LANCHOR0
 	add	x1, x0, w25, sxtw
-	ldrb	w21, [x1,1248]
-	ldrb	w4, [x0,1153]
+	ldrb	w4, [x0, 1153]
+	ldrb	w21, [x1, 1196]
 	cmp	w25, w4
-	bcc	.L2111
+	bcc	.L2145
 	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 6, .L2137
-	adrp	x0, .LC165
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbnz	x0, 6, .L2146
+.L2170:
+	mov	w0, -1
+.L2143:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	ret
+.L2146:
+	mov	w3, w19
+	mov	w2, w25
 	mov	w1, w21
+	adrp	x0, .LC165
 	add	x0, x0, :lo12:.LC165
-	mov	w2, w25
-	mov	w3, w19
 	bl	printk
-.L2137:
-	mov	w0, -1
-	b	.L2136
-.L2111:
-	ubfx	x1, x19, 24, 2
-	cbnz	w1, .L2114
-	adrp	x1, .LANCHOR0
-	ldrb	w1, [x1,#:lo12:.LANCHOR0]
-	cbz	w1, .L2115
-	ldrb	w0, [x0,1]
-	cbz	w0, .L2114
-.L2115:
+	b	.L2170
+.L2145:
+	tst	x19, 50331648
+	bne	.L2148
+	ldrb	w1, [x20, #:lo12:.LANCHOR0]
+	cbz	w1, .L2149
+	ldrb	w0, [x0, 1]
+	cbz	w0, .L2148
+.L2149:
 	add	x1, x20, :lo12:.LANCHOR0
-	ldrh	w2, [x1,2]
+	ldrh	w2, [x1, 2]
 	udiv	w0, w19, w2
 	mul	w0, w0, w2
-	ldrb	w2, [x1,1]
+	ldrb	w2, [x1, 1]
 	sub	w19, w19, w0
-	cbz	w2, .L2116
+	cbz	w2, .L2150
 	add	w19, w0, w19, lsl 1
-	b	.L2114
-.L2116:
-	add	x1, x1, 4
-	ldrh	w19, [x1,w19,uxtw 1]
-	add	w19, w19, w0
-.L2114:
-	mov	w0, w21
-	mov	w1, w19
-	mov	x2, x24
+.L2148:
+	mov	w4, w24
 	mov	x3, x23
-	mov	w4, w22
+	mov	x2, x22
+	mov	w1, w19
+	mov	w0, w21
 	bl	flash_read_page
 	cmn	w0, #1
-	bne	.L2136
+	bne	.L2143
 	add	x25, x20, :lo12:.LANCHOR0
-	ldrb	w26, [x25,1240]
-	cbnz	w26, .L2118
-.L2121:
-	adrp	x0, .LANCHOR5+328
-	ldr	x5, [x0,#:lo12:.LANCHOR5+328]
-	cbnz	x5, .L2119
-	b	.L2120
-.L2118:
-	mov	w0, w21
+	ldrb	w26, [x25, 1252]
+	cbnz	w26, .L2151
+.L2154:
+	adrp	x0, .LANCHOR5+336
+	ldr	x5, [x0, #:lo12:.LANCHOR5+336]
+	cbnz	x5, .L2152
+.L2153:
+	add	x20, x20, :lo12:.LANCHOR0
+	mov	w3, -1
+	mov	w2, w19
+	mov	w1, 0
+	adrp	x0, .LC166
+	add	x0, x0, :lo12:.LC166
+	ldrb	w4, [x20, 1252]
+	bl	printk
+	ldrb	w0, [x20, 1192]
+	cbz	w0, .L2170
+	mov	w4, w24
+	mov	x3, x23
+	mov	x2, x22
 	mov	w1, w19
-	mov	x2, x24
+	mov	w0, w21
+	bl	flash_ddr_tuning_read
+	b	.L2143
+.L2150:
+	add	x1, x1, 4
+	ldrh	w19, [x1, w19, uxtw 1]
+	add	w19, w19, w0
+	b	.L2148
+.L2151:
+	strb	wzr, [x25, 1252]
+	mov	w4, w24
 	mov	x3, x23
-	mov	w4, w22
-	strb	wzr, [x25,1240]
+	mov	x2, x22
+	mov	w1, w19
+	mov	w0, w21
 	bl	flash_read_page
-	strb	w26, [x25,1240]
+	strb	w26, [x25, 1252]
 	cmn	w0, #1
-	beq	.L2121
-	b	.L2136
-.L2119:
-	mov	w0, w21
-	mov	w1, w19
-	mov	x2, x24
+	beq	.L2154
+	b	.L2143
+.L2152:
+	mov	w4, w24
 	mov	x3, x23
-	mov	w4, w22
+	mov	x2, x22
+	mov	w1, w19
+	mov	w0, w21
 	blr	x5
 	cmn	w0, #1
-	bne	.L2136
-.L2120:
-	add	x20, x20, :lo12:.LANCHOR0
-	adrp	x0, .LC166
-	add	x0, x0, :lo12:.LC166
-	mov	w1, 0
-	mov	w2, w19
-	mov	w3, -1
-	ldrb	w4, [x20,1240]
-	bl	printk
-	ldrb	w0, [x20,1192]
-	cbz	w0, .L2137
-	mov	w0, w21
-	mov	w1, w19
-	mov	x2, x24
-	mov	x3, x23
-	mov	w4, w22
-	bl	flash_ddr_tuning_read
-.L2136:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 80
-	ret
+	bne	.L2143
+	b	.L2153
 	.size	flash_read_page_en, .-flash_read_page_en
 	.align	2
 	.global	flash_get_last_written_page
@@ -13207,97 +13146,95 @@ flash_read_page_en:
 flash_get_last_written_page:
 	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	uxtb	w23, w0
-	adrp	x0, .LANCHOR5+180
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR2
-	mov	x24, x2
-	ldrh	w19, [x0,#:lo12:.LANCHOR5+180]
-	add	x0, x20, :lo12:.LANCHOR2
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	uxth	w22, w1
+	stp	x23, x24, [sp, 48]
+	and	w23, w0, 255
+	adrp	x0, .LANCHOR5+172
+	stp	x19, x20, [sp, 16]
+	stp	x27, x28, [sp, 80]
+	adrp	x27, .LANCHOR2
+	ldrh	w19, [x0, #:lo12:.LANCHOR5+172]
+	add	x0, x27, :lo12:.LANCHOR2
+	stp	x21, x22, [sp, 32]
+	and	w21, w1, 65535
+	stp	x25, x26, [sp, 64]
 	sub	w19, w19, #1
-	ldrh	w26, [x0,34]
-	mov	w0, w23
 	sxth	w19, w19
-	mov	x21, x3
+	mov	x24, x2
+	ldrh	w26, [x0, 34]
+	mov	x22, x3
 	mov	w25, w4
-	mov	x27, x20
-	mul	w26, w22, w26
-	add	w1, w26, w19
+	mov	w0, w23
+	mul	w26, w26, w21
+	add	w1, w19, w26
 	bl	flash_read_page_en
 	cmp	w0, 512
-	bne	.L2139
+	bne	.L2172
 	mov	w28, 0
 	mov	w5, 2
-.L2140:
+.L2173:
 	cmp	w28, w19
-	bgt	.L2139
-	add	w0, w28, w19
-	mov	x2, x24
-	mov	x3, x21
+	ble	.L2176
+.L2172:
+	ldr	w0, [x27, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L2177
+	ldr	w3, [x22]
+	adrp	x0, .LC167
+	mov	w2, w19
+	mov	w1, w21
+	add	x0, x0, :lo12:.LC167
+	bl	printk
+.L2177:
+	mov	w0, w19
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L2176:
+	add	w20, w28, w19
+	str	w5, [x29, 108]
 	mov	w4, w25
-	sdiv	w20, w0, w5
+	mov	x3, x22
+	mov	x2, x24
 	mov	w0, w23
-	str	x5, [x29,104]
+	sdiv	w20, w20, w5
 	add	w1, w26, w20, sxth
 	bl	flash_read_page_en
+	ldr	w5, [x29, 108]
 	cmp	w0, 512
-	ldr	x5, [x29,104]
-	bne	.L2141
+	bne	.L2174
 	sub	w19, w20, #1
 	sxth	w19, w19
-	b	.L2140
-.L2141:
+	b	.L2173
+.L2174:
 	add	w20, w20, 1
 	sxth	w28, w20
-	b	.L2140
-.L2139:
-	ldr	w0, [x27,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L2144
-	adrp	x0, .LC167
-	ldr	w3, [x21]
-	add	x0, x0, :lo12:.LC167
-	mov	w1, w22
-	mov	w2, w19
-	bl	printk
-.L2144:
-	mov	w0, w19
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 112
-	ret
+	b	.L2173
 	.size	flash_get_last_written_page, .-flash_get_last_written_page
 	.align	2
 	.global	flash_get_last_written_page_ext
 	.type	flash_get_last_written_page_ext, %function
 flash_get_last_written_page_ext:
-	uxth	w6, w0
-	adrp	x0, .LANCHOR0+1257
 	stp	x29, x30, [sp, -16]!
+	adrp	x4, .LANCHOR0+1205
 	mov	w5, 24
-	mov	x8, x1
+	mov	w6, 1
 	add	x29, sp, 0
-	ldrb	w0, [x0,#:lo12:.LANCHOR0+1257]
-	mov	x7, x2
+	ldrb	w4, [x4, #:lo12:.LANCHOR0+1205]
+	and	w0, w0, 65535
+	sub	w5, w5, w4
+	adrp	x4, .LANCHOR3+1304
+	ldrh	w4, [x4, #:lo12:.LANCHOR3+1304]
+	sub	w5, w5, w4
 	mov	w4, w3
-	mov	x2, x8
-	sub	w5, w5, w0
-	adrp	x0, .LANCHOR3+1312
-	mov	x3, x7
-	ldrh	w0, [x0,#:lo12:.LANCHOR3+1312]
-	sub	w0, w5, w0
-	mov	w5, 1
-	lsl	w5, w5, w0
-	asr	w0, w6, w0
-	sub	w1, w5, #1
-	and	w1, w6, w1
+	mov	x3, x2
+	mov	x2, x1
+	lsl	w6, w6, w5
+	sub	w6, w6, #1
+	and	w1, w6, w0
+	asr	w0, w0, w5
 	bl	flash_get_last_written_page
 	ldp	x29, x30, [sp], 16
 	ret
@@ -13308,147 +13245,144 @@ flash_get_last_written_page_ext:
 flash_ddr_para_scan:
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR0
-	adrp	x20, .LANCHOR5
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	add	x21, x19, :lo12:.LANCHOR0
+	stp	x23, x24, [sp, 48]
+	and	w23, w0, 255
+	mov	w24, w1
 	mov	w22, 1
-	stp	x23, x24, [sp,48]
-	uxtb	w24, w0
-	mov	w23, w1
-	ldrb	w0, [x21,1304]
+	ldrb	w0, [x21, 1248]
+	adrp	x20, .LANCHOR5
+	strb	w22, [x21, 1192]
 	add	x20, x20, :lo12:.LANCHOR5
-	strb	w22, [x21,1192]
 	bl	flash_set_interface_mode
-	ldrb	w0, [x21,1304]
+	ldrb	w0, [x21, 1248]
 	bl	nandc_set_if_mode
-	ldr	x2, [x20,336]
-	mov	w1, w23
-	ldr	x3, [x20,344]
+	ldp	x3, x2, [x20, 344]
 	mov	w4, 4
-	mov	w0, w24
+	mov	w1, w24
+	mov	w0, w23
 	bl	flash_ddr_tuning_read
-	ldr	x2, [x20,336]
-	mov	w0, w24
-	ldr	x3, [x20,344]
-	mov	w1, w23
+	ldp	x3, x2, [x20, 344]
 	mov	w4, 4
+	mov	w1, w24
+	mov	w0, w23
 	bl	flash_read_page
 	cmn	w0, #1
-	bne	.L2150
-	ldrb	w0, [x21,1304]
-	tbz	x0, 0, .L2150
+	bne	.L2185
+	ldrb	w0, [x21, 1248]
+	tbz	x0, 0, .L2185
 	mov	w0, 1
 	bl	flash_set_interface_mode
 	mov	w0, w22
 	bl	nandc_set_if_mode
-	strb	wzr, [x21,1192]
-	b	.L2151
-.L2150:
-	add	x19, x19, :lo12:.LANCHOR0
-	mov	w0, 1
-	strb	w0, [x19,1192]
-.L2151:
+	strb	wzr, [x21, 1192]
+.L2186:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
 	ldp	x29, x30, [sp], 64
 	ret
+.L2185:
+	add	x19, x19, :lo12:.LANCHOR0
+	mov	w0, 1
+	strb	w0, [x19, 1192]
+	b	.L2186
 	.size	flash_ddr_para_scan, .-flash_ddr_para_scan
 	.align	2
 	.global	flash_prog_page
 	.type	flash_prog_page, %function
 flash_prog_page:
-	stp	x29, x30, [sp, -80]!
-	mov	w5, 1
+	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x25, x26, [sp,64]
-	adrp	x26, .LANCHOR0
-	mov	x25, x2
-	stp	x21, x22, [sp,32]
-	uxtb	x22, w0
-	add	x0, x26, :lo12:.LANCHOR0
-	stp	x23, x24, [sp,48]
-	stp	x19, x20, [sp,16]
-	mov	w23, w1
-	mov	w1, 24
-	ldrb	w19, [x0,1257]
-	mov	x21, x22
-	mov	x24, x3
-	ldr	x20, [x0,1048]
-	sub	w19, w1, w19
-	add	x22, x22, 8
-	lsl	w19, w5, w19
+	stp	x21, x22, [sp, 32]
+	and	w21, w0, 255
+	str	x27, [sp, 80]
+	adrp	x27, .LANCHOR0
+	add	x0, x27, :lo12:.LANCHOR0
+	stp	x19, x20, [sp, 16]
+	stp	x23, x24, [sp, 48]
+	mov	w22, w1
+	stp	x25, x26, [sp, 64]
+	mov	w20, 24
+	mov	x24, x2
+	mov	x25, x3
+	ldrb	w1, [x0, 1205]
+	and	x19, x21, 255
+	ldr	x26, [x0, 1056]
+	add	x23, x19, 8
+	sub	w1, w20, w1
+	mov	w20, 1
+	lsl	w20, w20, w1
+	sub	w20, w20, #1
 	bl	nandc_wait_flash_ready
+	and	w20, w20, w22
 	mov	w0, w21
-	sub	w19, w19, #1
-	add	x22, x20, x22, lsl 8
-	and	w19, w19, w23
 	bl	hynix_reconfig_rr_para
 	mov	w0, w21
 	bl	nandc_cs
-	ubfx	x0, x23, 24, 2
-	cbnz	w0, .L2156
+	add	x23, x26, x23, lsl 8
 	mov	w0, w21
+	tst	x22, 50331648
+	bne	.L2192
 	bl	zftl_flash_enter_slc_mode
-	b	.L2157
-.L2156:
-	mov	w0, w21
-	bl	zftl_flash_exit_slc_mode
-.L2157:
-	ubfiz	x0, x21, 8, 8
-	add	x20, x20, x0
+.L2193:
+	add	x19, x26, x19, lsl 8
 	mov	w0, 128
-	str	w0, [x20,2056]
-	and	w0, w19, 255
-	str	wzr, [x20,2052]
-	str	wzr, [x20,2052]
-	str	w0, [x20,2052]
-	lsr	w0, w19, 8
-	str	w0, [x20,2052]
-	lsr	w0, w19, 16
-	str	w0, [x20,2052]
-	add	x0, x26, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1256]
-	cbz	w0, .L2158
-	lsr	w0, w19, 24
-	str	w0, [x20,2052]
-.L2158:
-	mov	w0, w19
+	str	w0, [x19, 2056]
+	and	w0, w20, 255
+	str	wzr, [x19, 2052]
+	str	wzr, [x19, 2052]
+	str	w0, [x19, 2052]
+	lsr	w0, w20, 8
+	str	w0, [x19, 2052]
+	lsr	w0, w20, 16
+	str	w0, [x19, 2052]
+	add	x0, x27, :lo12:.LANCHOR0
+	ldrb	w0, [x0, 1204]
+	cbz	w0, .L2194
+	lsr	w0, w20, 24
+	str	w0, [x19, 2052]
+.L2194:
+	mov	w0, w20
 	bl	nandc_set_seed
-	adrp	x2, .LANCHOR2+17
+	adrp	x0, .LANCHOR2+17
+	mov	x4, x25
+	mov	x3, x24
 	mov	w1, 1
-	mov	x3, x25
-	mov	x4, x24
+	ldrb	w2, [x0, #:lo12:.LANCHOR2+17]
 	mov	w0, w21
-	ldrb	w2, [x2,#:lo12:.LANCHOR2+17]
 	bl	nandc_xfer
 	mov	w0, 16
-	str	w0, [x20,2056]
+	str	w0, [x19, 2056]
 	bl	nandc_iqr_wait_flash_ready
 	bl	nandc_wait_flash_ready
-	mov	x0, x22
+	mov	x0, x23
 	bl	flash_read_status
-	mov	w19, w0
-	mov	w0, w21
-	bl	nandc_de_cs
-	and	w2, w19, 4
-	tbz	x19, 2, .L2159
+	mov	w3, w0
+	bl	nandc_de_cs.constprop.35
+	and	w2, w3, 4
+	tbz	x3, 2, .L2191
+	mov	w1, w22
 	adrp	x0, .LC168
-	mov	w1, w23
 	add	x0, x0, :lo12:.LC168
 	bl	printk
 	mov	w2, -1
-.L2159:
+.L2191:
 	mov	w0, w2
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 80
+	ldr	x27, [sp, 80]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 96
 	ret
+.L2192:
+	bl	zftl_flash_exit_slc_mode
+	b	.L2193
 	.size	flash_prog_page, .-flash_prog_page
 	.align	2
 	.global	flash_test_blk
@@ -13457,132 +13391,123 @@ flash_test_blk:
 	stp	x29, x30, [sp, -48]!
 	mov	w2, 32
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR5
-	uxth	w20, w1
 	add	x19, x19, :lo12:.LANCHOR5
+	stp	x21, x22, [sp, 32]
+	and	w22, w0, 255
+	and	w20, w1, 65535
 	mov	w1, 165
-	stp	x21, x22, [sp,32]
-	uxtb	w22, w0
-	ldr	x0, [x19,296]
+	ldr	x0, [x19, 304]
 	bl	ftl_memset
-	ldr	x0, [x19,312]
-	mov	w1, 90
+	ldr	x0, [x19, 320]
 	mov	w2, 8
+	mov	w1, 90
 	bl	ftl_memset
 	adrp	x0, .LANCHOR0+2
-	ldrh	w0, [x0,#:lo12:.LANCHOR0+2]
-	mul	w20, w20, w0
+	ldrh	w0, [x0, #:lo12:.LANCHOR0+2]
+	mul	w20, w0, w20
 	mov	w0, w22
 	mov	w1, w20
 	bl	flash_erase_block
 	cmn	w0, #1
-	bne	.L2167
-.L2169:
+	bne	.L2204
+.L2206:
 	mov	w19, -1
-	b	.L2168
-.L2167:
+.L2205:
+	mov	w1, w20
+	mov	w0, w22
+	bl	flash_erase_block
+	mov	w0, w19
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	ret
+.L2204:
 	adrp	x21, .LANCHOR2
-	ldr	x2, [x19,296]
 	add	x21, x21, :lo12:.LANCHOR2
-	ldr	x3, [x19,312]
-	mov	w0, w22
+	ldr	x2, [x19, 304]
 	mov	w1, w20
+	ldr	x3, [x19, 320]
+	mov	w0, w22
+	ldrb	w4, [x21, 17]
 	add	x21, x21, 8
-	ldrb	w4, [x21,9]
 	bl	flash_prog_page
 	cmn	w0, #1
-	beq	.L2169
-	ldr	x2, [x19,296]
-	mov	w0, w22
-	ldr	x3, [x19,312]
+	beq	.L2206
+	ldrb	w4, [x21, 9]
 	mov	w1, w20
-	ldrb	w4, [x21,9]
+	ldr	x2, [x19, 304]
+	mov	w0, w22
+	ldr	x3, [x19, 320]
 	bl	flash_read_page_en
 	cmn	w0, #1
-	beq	.L2169
-	ldr	x0, [x19,296]
+	beq	.L2206
+	ldr	x0, [x19, 304]
 	ldr	w1, [x0]
 	mov	w0, 42405
-	bfi	w0, w0, 16, 16
+	movk	w0, 0xa5a5, lsl 16
 	cmp	w1, w0
-	bne	.L2169
-	ldr	x0, [x19,312]
+	bne	.L2206
+	ldr	x0, [x19, 320]
 	ldr	w1, [x0]
 	mov	w0, 23130
-	bfi	w0, w0, 16, 16
+	movk	w0, 0x5a5a, lsl 16
 	cmp	w1, w0
 	csetm	w19, ne
-.L2168:
-	mov	w1, w20
-	mov	w0, w22
-	bl	flash_erase_block
-	mov	w0, w19
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 48
-	ret
+	b	.L2205
 	.size	flash_test_blk, .-flash_test_blk
 	.align	2
 	.global	flash_start_one_pass_page_prog
 	.type	flash_start_one_pass_page_prog, %function
 flash_start_one_pass_page_prog:
-	stp	x29, x30, [sp, -80]!
+	stp	x29, x30, [sp, -32]!
+	and	w9, w0, 255
+	and	w8, w3, 255
+	adrp	x7, .LANCHOR0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR0
-	stp	x25, x26, [sp,64]
-	uxtb	w26, w0
-	add	x0, x20, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	uxtb	w25, w3
-	uxtb	w22, w2
-	ldr	x19, [x0,1048]
-	mov	w0, w25
-	mov	w21, w4
-	mov	x24, x5
-	mov	x23, x6
+	add	x0, x7, :lo12:.LANCHOR0
+	stp	x19, x20, [sp, 16]
+	and	w20, w2, 255
+	ldr	x19, [x0, 1056]
+	mov	w0, w8
 	bl	nandc_cs
-	cbz	w26, .L2177
-	sxtw	x1, w25
-	add	x1, x1, 8
-	add	x1, x19, x1, lsl 8
-	str	w26, [x1,8]
-.L2177:
-	ubfiz	x1, x25, 8, 8
+	cbz	w9, .L2215
+	sxtw	x0, w8
+	add	x0, x0, 8
+	add	x0, x19, x0, lsl 8
+	str	w9, [x0, 8]
+.L2215:
+	ubfiz	x0, x8, 8, 8
+	add	x7, x7, :lo12:.LANCHOR0
+	add	x19, x19, x0
 	mov	w0, 128
-	add	x19, x19, x1
-	add	x20, x20, :lo12:.LANCHOR0
-	str	w0, [x19,2056]
-	and	w0, w21, 255
-	str	wzr, [x19,2052]
-	str	wzr, [x19,2052]
-	str	w0, [x19,2052]
-	lsr	w0, w21, 8
-	str	w0, [x19,2052]
-	lsr	w0, w21, 16
-	str	w0, [x19,2052]
-	ldrb	w0, [x20,1256]
-	cbz	w0, .L2178
-	lsr	w0, w21, 24
-	str	w0, [x19,2052]
-.L2178:
-	mov	w0, w21
+	str	w0, [x19, 2056]
+	and	w0, w4, 255
+	str	wzr, [x19, 2052]
+	str	wzr, [x19, 2052]
+	str	w0, [x19, 2052]
+	lsr	w0, w4, 8
+	str	w0, [x19, 2052]
+	lsr	w0, w4, 16
+	str	w0, [x19, 2052]
+	ldrb	w0, [x7, 1204]
+	cbz	w0, .L2216
+	lsr	w0, w4, 24
+	str	w0, [x19, 2052]
+.L2216:
+	mov	w0, w4
 	bl	nandc_set_seed
-	adrp	x2, .LANCHOR2+17
-	mov	x3, x24
-	mov	x4, x23
-	mov	w0, w25
+	adrp	x0, .LANCHOR2+17
+	mov	x4, x6
+	mov	x3, x5
 	mov	w1, 1
-	ldrb	w2, [x2,#:lo12:.LANCHOR2+17]
+	ldrb	w2, [x0, #:lo12:.LANCHOR2+17]
+	mov	w0, w8
 	bl	nandc_xfer
-	str	w22, [x19,2056]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 80
+	str	w20, [x19, 2056]
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
 	ret
 	.size	flash_start_one_pass_page_prog, .-flash_start_one_pass_page_prog
 	.align	2
@@ -13591,328 +13516,325 @@ flash_start_one_pass_page_prog:
 flash_dual_page_prog:
 	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	uxtb	x21, w0
+	stp	x19, x20, [sp, 16]
+	and	w20, w0, 255
 	adrp	x0, .LANCHOR0
 	add	x0, x0, :lo12:.LANCHOR0
-	mov	w22, w1
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	stp	x19, x20, [sp,16]
+	stp	x21, x22, [sp, 32]
+	ubfiz	x22, x20, 8, 8
+	stp	x23, x24, [sp, 48]
+	mov	w19, 24
+	stp	x25, x26, [sp, 64]
+	mov	x25, x2
+	stp	x27, x28, [sp, 80]
+	add	x2, x22, 2048
 	adrp	x27, .LANCHOR2
-	mov	x26, x2
-	ldrb	w19, [x0,1257]
-	mov	x20, x21
-	ldr	x2, [x0,1048]
-	mov	w0, 24
-	sub	w19, w0, w19
-	mov	w0, 1
-	lsl	w19, w0, w19
-	ldr	w0, [x27,#:lo12:.LANCHOR2]
-	add	x21, x21, 8
+	mov	w21, w1
+	ldr	x22, [x0, 1056]
+	mov	x26, x3
+	ldrb	w0, [x0, 1205]
+	mov	x23, x4
+	mov	x24, x5
+	ubfx	x28, x21, 24, 2
+	sub	w0, w19, w0
+	mov	w19, 1
+	add	x22, x22, x2
+	lsl	w19, w19, w0
+	ldr	w0, [x27, #:lo12:.LANCHOR2]
 	sub	w19, w19, #1
-	mov	x25, x3
-	mov	x24, x4
-	mov	x23, x5
-	mov	w3, w6
-	add	x21, x2, x21, lsl 8
-	and	w19, w1, w19
-	ubfx	x28, x22, 24, 2
-	tbz	x0, 4, .L2186
+	and	w19, w19, w1
+	tbz	x0, 4, .L2225
 	adrp	x0, .LC169
+	mov	w3, w6
 	mov	w2, w28
 	add	x0, x0, :lo12:.LC169
 	bl	printk
-.L2186:
+.L2225:
 	bl	nandc_wait_flash_ready
 	mov	w0, w20
 	bl	nandc_cs
 	mov	w0, w20
-	cbnz	w28, .L2187
+	cbnz	w28, .L2226
 	bl	zftl_flash_enter_slc_mode
-	b	.L2188
-.L2187:
-	bl	zftl_flash_exit_slc_mode
-.L2188:
-	mov	w0, 0
+.L2227:
+	mov	x6, x26
+	mov	x5, x25
 	mov	w4, w19
-	mov	w1, w0
-	mov	w2, 16
 	mov	w3, w20
-	mov	x5, x26
-	mov	x6, x25
+	mov	w2, 16
+	mov	w1, 0
+	mov	w0, 0
 	bl	flash_start_one_pass_page_prog
 	bl	nandc_wait_flash_ready
-	mov	w0, 0
-	mov	w2, 16
+	mov	x6, x24
+	mov	x5, x23
 	add	w4, w19, 1
-	mov	w1, w0
 	mov	w3, w20
-	mov	x5, x24
-	mov	x6, x23
+	mov	w2, 16
+	mov	w1, 0
+	mov	w0, 0
 	bl	flash_start_one_pass_page_prog
 	bl	nandc_wait_flash_ready
-	mov	x0, x21
+	mov	x0, x22
 	bl	flash_read_status
-	mov	w19, w0
-	mov	w0, w20
-	bl	nandc_de_cs
-	and	w2, w19, 4
-	tbz	x19, 2, .L2189
-	ldr	w0, [x27,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L2190
+	mov	w3, w0
+	bl	nandc_de_cs.constprop.35
+	and	w2, w3, 4
+	tbz	x3, 2, .L2224
+	ldr	w0, [x27, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L2229
 	adrp	x0, .LC168
-	mov	w1, w22
+	mov	w1, w21
 	add	x0, x0, :lo12:.LC168
 	bl	printk
-.L2190:
+.L2229:
 	mov	w2, -1
-.L2189:
+.L2224:
 	mov	w0, w2
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 96
 	ret
+.L2226:
+	bl	zftl_flash_exit_slc_mode
+	b	.L2227
 	.size	flash_dual_page_prog, .-flash_dual_page_prog
 	.align	2
 	.global	ymtc_flash_tlc_page_prog
 	.type	ymtc_flash_tlc_page_prog, %function
 ymtc_flash_tlc_page_prog:
 	stp	x29, x30, [sp, -80]!
-	mov	w4, 24
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	uxtb	x21, w0
-	adrp	x0, .LANCHOR0
-	add	x0, x0, :lo12:.LANCHOR0
-	str	x25, [sp,64]
-	stp	x23, x24, [sp,48]
-	stp	x19, x20, [sp,16]
+	str	x25, [sp, 64]
 	mov	w25, w1
-	mov	x20, x21
-	ldr	x1, [x0,1048]
-	add	x21, x21, 8
-	ldrb	w19, [x0,1257]
-	mov	x23, x2
-	mov	x22, x3
-	add	x21, x1, x21, lsl 8
-	sub	w19, w4, w19
+	adrp	x1, .LANCHOR0
+	add	x1, x1, :lo12:.LANCHOR0
+	stp	x19, x20, [sp, 16]
+	and	w20, w0, 255
+	stp	x21, x22, [sp, 32]
+	mov	w19, 24
+	stp	x23, x24, [sp, 48]
+	ubfiz	x24, x20, 8, 8
+	add	x0, x24, 2048
+	mov	x22, x2
+	ldr	x24, [x1, 1056]
+	mov	x23, x3
+	mov	w21, 1
+	add	x24, x24, x0
+	ldrb	w0, [x1, 1205]
+	sub	w19, w19, w0
 	bl	nandc_wait_flash_ready
+	lsl	w19, w21, w19
 	mov	w0, w20
-	mov	w24, 1
-	lsl	w19, w24, w19
-	bl	nandc_cs
 	sub	w19, w19, #1
-	mov	w0, w20
+	bl	nandc_cs
 	and	w19, w19, w25
+	mov	w0, w20
 	bl	zftl_flash_exit_slc_mode
+	mov	x6, x23
+	mov	x5, x22
 	mov	w4, w19
-	mov	w1, w24
-	mov	w2, 26
 	mov	w3, w20
-	mov	x5, x23
-	mov	x6, x22
+	mov	w1, w21
+	mov	w2, 26
 	mov	w0, 0
 	bl	flash_start_one_pass_page_prog
 	bl	nandc_wait_flash_ready
-	add	w4, w19, w24
-	mov	w1, w24
-	mov	w2, 26
+	mov	x6, x23
+	mov	x5, x22
+	add	w4, w19, w21
 	mov	w3, w20
-	mov	x5, x23
-	mov	x6, x22
+	mov	w1, w21
+	mov	w2, 26
 	mov	w0, 0
 	bl	flash_start_one_pass_page_prog
 	bl	nandc_wait_flash_ready
-	mov	w2, 16
+	mov	x6, x23
+	mov	x5, x22
 	add	w4, w19, 2
-	mov	w1, w24
 	mov	w3, w20
-	mov	x5, x23
-	mov	x6, x22
+	mov	w1, w21
+	mov	w2, 16
 	mov	w0, 0
 	bl	flash_start_one_pass_page_prog
 	bl	nandc_iqr_wait_flash_ready
 	bl	nandc_wait_flash_ready
-	mov	x0, x21
+	mov	x0, x24
 	bl	flash_read_status
-	mov	w19, w0
-	mov	w0, w20
-	bl	nandc_de_cs
-	and	w2, w19, 4
-	tbz	x19, 2, .L2198
+	mov	w3, w0
+	bl	nandc_de_cs.constprop.35
+	and	w2, w3, 4
+	tbz	x3, 2, .L2237
 	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L2199
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L2239
 	adrp	x0, .LC170
 	mov	w1, w25
 	add	x0, x0, :lo12:.LC170
 	bl	printk
-.L2199:
+.L2239:
 	mov	w2, -1
-.L2198:
+.L2237:
 	mov	w0, w2
-	ldr	x25, [sp,64]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
+	ldr	x25, [sp, 64]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
 	ldp	x29, x30, [sp], 80
 	ret
 	.size	ymtc_flash_tlc_page_prog, .-ymtc_flash_tlc_page_prog
 	.section	.text.unlikely
 	.align	2
-	.type	fw_flash_page_prog.constprop.30, %function
-fw_flash_page_prog.constprop.30:
-	stp	x29, x30, [sp, -80]!
+	.type	fw_flash_page_prog.constprop.29, %function
+fw_flash_page_prog.constprop.29:
+	stp	x29, x30, [sp, -64]!
+	adrp	x4, .LANCHOR0
+	add	x4, x4, :lo12:.LANCHOR0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x19, .LANCHOR0
-	str	x23, [sp,48]
-	add	x19, x19, :lo12:.LANCHOR0
-	str	x2, [x29,72]
-	stp	x21, x22, [sp,32]
-	mov	x22, x1
-	ldr	x1, [x19,1144]
-	ldrb	w21, [x19,1244]
-	ldrb	w20, [x1,9]
-	udiv	w20, w0, w20
-	ldrb	w0, [x19,1152]
+	stp	x21, x22, [sp, 32]
+	mov	x21, x1
+	str	x23, [sp, 48]
+	mov	x23, x2
+	stp	x19, x20, [sp, 16]
+	ldr	x1, [x4, 1144]
+	ldrb	w22, [x4, 1249]
+	ldrb	w19, [x1, 9]
+	udiv	w19, w0, w19
+	ldrb	w0, [x4, 1152]
 	bl	nandc_bch_sel
-	adrp	x4, .LANCHOR2
-	ldr	x3, [x29,72]
-	add	x4, x4, :lo12:.LANCHOR2
-	add	x4, x4, 8
-	ldrb	w0, [x4,7]
-	cmp	w0, 9
-	bne	.L2204
-	ldrb	w23, [x19,1154]
-	cbnz	w23, .L2204
-	ldrb	w0, [x4,12]
+	adrp	x0, .LANCHOR2
+	add	x0, x0, :lo12:.LANCHOR2
+	ldrb	w1, [x0, 15]
+	cmp	w1, 9
+	bne	.L2245
+	ldrb	w1, [x4, 1154]
+	cbnz	w1, .L2245
+	add	x0, x0, 8
+	ldrb	w0, [x0, 12]
 	cmp	w0, 3
-	bne	.L2205
-	mov	w0, w23
-	mov	w1, w20
-	mov	x2, x22
+	bne	.L2246
+	mov	x3, x23
+	mov	x2, x21
+	mov	w1, w19
+	mov	w0, 0
 	bl	ymtc_flash_tlc_page_prog
-	b	.L2207
-.L2205:
-	adrp	x19, .LANCHOR5
-	mov	w1, 255
-	add	x19, x19, :lo12:.LANCHOR5
+.L2249:
+	mov	w4, w0
+	mov	w0, w22
+	bl	nandc_bch_sel
+	mov	w0, w4
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldr	x23, [sp, 48]
+	ldp	x29, x30, [sp], 64
+	ret
+.L2246:
+	adrp	x20, .LANCHOR5
+	add	x20, x20, :lo12:.LANCHOR5
 	mov	w2, 16384
-	str	x3, [x29,72]
-	ldr	x0, [x19,296]
+	mov	w1, 255
+	ldr	x0, [x20, 304]
 	bl	ftl_memset
-	ldr	x4, [x19,296]
-	mov	w0, w23
-	ldr	x3, [x29,72]
-	mov	w1, w20
-	mov	x2, x22
-	mov	x5, x4
+	ldr	x5, [x20, 304]
 	mov	w6, 4
-	bl	flash_dual_page_prog
-	b	.L2207
-.L2204:
+	mov	x3, x23
+	mov	x2, x21
+	mov	w1, w19
+	mov	x4, x5
 	mov	w0, 0
-	mov	w1, w20
-	mov	x2, x22
+	bl	flash_dual_page_prog
+	b	.L2249
+.L2245:
 	mov	w4, 4
+	mov	x3, x23
+	mov	x2, x21
+	mov	w1, w19
+	mov	w0, 0
 	bl	flash_prog_page
-.L2207:
-	mov	w19, w0
-	mov	w0, w21
-	bl	nandc_bch_sel
-	ldr	x23, [sp,48]
-	mov	w0, w19
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 80
-	ret
-	.size	fw_flash_page_prog.constprop.30, .-fw_flash_page_prog.constprop.30
+	b	.L2249
+	.size	fw_flash_page_prog.constprop.29, .-fw_flash_page_prog.constprop.29
 	.text
 	.align	2
 	.global	flash_start_tlc_page_prog
 	.type	flash_start_tlc_page_prog, %function
 flash_start_tlc_page_prog:
 	stp	x29, x30, [sp, -80]!
-	adrp	x7, .LANCHOR0
 	add	x29, sp, 0
-	stp	x25, x26, [sp,64]
-	uxtb	w26, w0
-	add	x0, x7, :lo12:.LANCHOR0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	uxtb	w25, w3
-	uxtb	w21, w1
-	ldrb	w0, [x0,1153]
-	uxtb	w22, w2
+	stp	x21, x22, [sp, 32]
+	and	w21, w1, 255
+	stp	x25, x26, [sp, 64]
+	and	w25, w0, 255
+	adrp	x0, .LANCHOR0
+	add	x1, x0, :lo12:.LANCHOR0
+	stp	x19, x20, [sp, 16]
+	and	w26, w3, 255
+	stp	x23, x24, [sp, 48]
+	and	w22, w2, 255
 	mov	w20, w4
-	mov	x24, x5
-	cmp	w0, w25
-	mov	x23, x6
-	mov	x19, x7
-	bhi	.L2209
+	mov	x23, x5
+	ldrb	w1, [x1, 1153]
+	mov	x24, x6
+	mov	x19, x0
+	cmp	w1, w26
+	bhi	.L2251
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 312
 	mov	w2, 868
-	add	x1, x1, 296
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L2209:
-	add	x7, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x7,1153]
-	cmp	w0, w25
-	bls	.L2208
-	add	x25, x7, w25, sxtw
-	ldrb	w25, [x25,1248]
-	ldr	x19, [x7,1048]
-	mov	w0, w25
+.L2251:
+	add	x0, x19, :lo12:.LANCHOR0
+	ldrb	w1, [x0, 1153]
+	cmp	w1, w26
+	bls	.L2250
+	add	x26, x0, w26, sxtw
+	ldr	x19, [x0, 1056]
+	ldrb	w5, [x26, 1196]
+	mov	w0, w5
 	bl	nandc_cs
-	cbz	w26, .L2211
-	sxtw	x0, w25
+	cbz	w25, .L2253
+	sxtw	x0, w5
 	add	x0, x0, 8
 	add	x0, x19, x0, lsl 8
-	str	w26, [x0,8]
-.L2211:
-	ubfiz	x7, x25, 8, 8
+	str	w25, [x0, 8]
+.L2253:
+	ubfiz	x0, x5, 8, 8
+	add	x19, x19, x0
 	mov	w0, 128
-	add	x19, x19, x7
-	str	w21, [x19,2056]
-	str	w0, [x19,2056]
+	str	w21, [x19, 2056]
+	str	w0, [x19, 2056]
 	and	w0, w20, 255
-	str	wzr, [x19,2052]
-	str	wzr, [x19,2052]
-	str	w0, [x19,2052]
+	str	wzr, [x19, 2052]
+	str	wzr, [x19, 2052]
+	str	w0, [x19, 2052]
 	lsr	w0, w20, 8
-	str	w0, [x19,2052]
+	str	w0, [x19, 2052]
 	lsr	w0, w20, 16
 	add	w20, w20, w20, lsl 1
-	str	w0, [x19,2052]
+	str	w0, [x19, 2052]
 	sub	w0, w20, #1
 	add	w0, w0, w21
 	bl	nandc_set_seed
-	adrp	x2, .LANCHOR2+17
-	mov	w0, w25
+	adrp	x0, .LANCHOR2+17
+	mov	x4, x24
+	mov	x3, x23
 	mov	w1, 1
-	mov	x3, x24
-	mov	x4, x23
-	ldrb	w2, [x2,#:lo12:.LANCHOR2+17]
+	ldrb	w2, [x0, #:lo12:.LANCHOR2+17]
+	mov	w0, w5
 	bl	nandc_xfer
-	str	w22, [x19,2056]
-	mov	w0, w25
-	bl	nandc_de_cs
-.L2208:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
+	str	w22, [x19, 2056]
+	bl	nandc_de_cs.constprop.35
+.L2250:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
 	ldp	x29, x30, [sp], 80
 	ret
 	.size	flash_start_tlc_page_prog, .-flash_start_tlc_page_prog
@@ -13920,281 +13842,276 @@ flash_start_tlc_page_prog:
 	.type	queue_tlc_prog_cmd, %function
 queue_tlc_prog_cmd:
 	stp	x29, x30, [sp, -64]!
+	mov	w3, 24
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	adrp	x23, .LANCHOR0
-	mov	x20, x0
-	ldr	x6, [x0]
-	add	x0, x23, :lo12:.LANCHOR0
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
+	mov	x21, x0
+	stp	x23, x24, [sp, 48]
+	adrp	x22, .LANCHOR0
 	mov	w24, w1
-	mov	w1, 24
-	mov	w21, 1
-	ldrb	w3, [x0,1257]
-	ldr	w2, [x6,40]
-	sub	w1, w1, w3
-	lsl	w3, w21, w3
-	lsl	w22, w21, w1
-	sub	w19, w3, #1
-	sub	w22, w22, #1
-	ldrb	w0, [x0,1269]
-	and	w22, w22, w2
-	lsr	w2, w2, w1
+	mov	w23, 1
+	ldr	x7, [x0]
+	add	x0, x22, :lo12:.LANCHOR0
+	ldrb	w1, [x0, 1205]
+	ldr	w2, [x7, 40]
+	sub	w3, w3, w1
+	ldrb	w0, [x0, 1213]
+	lsl	w19, w23, w1
+	sub	w19, w19, #1
+	lsl	w20, w23, w3
+	sub	w20, w20, #1
+	and	w20, w20, w2
+	lsr	w2, w2, w3
 	and	w19, w19, w2
-	uxtb	w19, w19
-	cbz	w0, .L2216
+	and	w19, w19, 255
+	cbz	w0, .L2259
 	mov	w0, w19
 	bl	zftl_flash_exit_slc_mode
-	ldr	x6, [x20]
-	mov	w1, w21
+	ldr	x0, [x21]
+	mov	w4, w20
 	mov	w3, w19
-	mov	w4, w22
+	mov	w1, w23
 	mov	w2, 26
+	ldr	x5, [x0, 8]
+	ldr	x6, [x0, 24]
 	mov	w0, 0
-	ldr	x5, [x6,8]
-	ldr	x6, [x6,24]
 	bl	flash_start_one_pass_page_prog
 	bl	nandc_iqr_wait_flash_ready
 	bl	nandc_wait_flash_ready
-	ldr	x6, [x20,8]
-	mov	w1, w21
+	ldr	x0, [x21, 8]
+	add	w4, w20, w23
 	mov	w3, w19
-	add	w4, w22, w21
+	mov	w1, w23
 	mov	w2, 26
+	ldr	x5, [x0, 8]
+	ldr	x6, [x0, 24]
 	mov	w0, 0
-	ldr	x5, [x6,8]
-	ldr	x6, [x6,24]
 	bl	flash_start_one_pass_page_prog
 	bl	nandc_iqr_wait_flash_ready
 	bl	nandc_wait_flash_ready
-	ldr	x6, [x20,16]
-	mov	w0, 0
-	mov	w1, w21
-	mov	w2, 16
+	ldr	x0, [x21, 16]
+	add	w4, w20, 2
 	mov	w3, w19
-	add	w4, w22, 2
-	ldr	x5, [x6,8]
-	ldr	x6, [x6,24]
+	mov	w2, 16
+	mov	w1, w23
+	ldr	x5, [x0, 8]
+	ldr	x6, [x0, 24]
+	mov	w0, 0
 	bl	flash_start_one_pass_page_prog
-	b	.L2217
-.L2216:
-	ldr	x5, [x6,8]
-	mov	w1, w21
-	ldrb	w0, [x6,60]
-	mov	w2, 26
-	ldr	x6, [x6,24]
+.L2260:
+	cbz	w24, .L2258
+	ldr	x1, [x21]
+	mov	w0, 4
+	strb	w0, [x1, 58]
+	mov	w0, 1
+	strb	w0, [x1, 59]
+	mov	w0, -1
+	strb	w0, [x1]
+	add	x0, x22, :lo12:.LANCHOR0
+	add	x0, x0, 3354
+	bl	buf_add_tail
+.L2258:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 64
+	ret
+.L2259:
+	ldr	x5, [x7, 8]
+	mov	w4, w20
+	ldr	x6, [x7, 24]
 	mov	w3, w19
-	mov	w4, w22
+	ldrb	w0, [x7, 60]
+	mov	w1, w23
+	mov	w2, 26
 	bl	flash_start_tlc_page_prog
 	bl	nandc_iqr_wait_flash_ready
 	bl	nandc_wait_flash_ready
-	ldr	x6, [x20,8]
-	mov	w1, 2
-	ldr	x0, [x20]
-	mov	w2, 26
+	ldp	x7, x0, [x21]
+	mov	w4, w20
 	mov	w3, w19
-	mov	w4, w22
-	ldr	x5, [x6,8]
-	ldrb	w0, [x0,60]
-	ldr	x6, [x6,24]
+	mov	w2, 26
+	mov	w1, 2
+	ldr	x5, [x0, 8]
+	ldr	x6, [x0, 24]
+	ldrb	w0, [x7, 60]
 	bl	flash_start_tlc_page_prog
 	bl	nandc_iqr_wait_flash_ready
 	bl	nandc_wait_flash_ready
-	ldr	x6, [x20,16]
-	mov	w1, 3
-	ldr	x0, [x20]
-	mov	w2, 16
+	ldr	x0, [x21, 16]
+	mov	w4, w20
+	ldr	x7, [x21]
 	mov	w3, w19
-	mov	w4, w22
-	ldr	x5, [x6,8]
-	ldrb	w0, [x0,60]
-	ldr	x6, [x6,24]
+	mov	w2, 16
+	mov	w1, 3
+	ldr	x5, [x0, 8]
+	ldr	x6, [x0, 24]
+	ldrb	w0, [x7, 60]
 	bl	flash_start_tlc_page_prog
-.L2217:
-	cbz	w24, .L2215
-	ldr	x1, [x20]
-	mov	w0, 4
-	strb	w0, [x1,58]
-	mov	w0, 1
-	strb	w0, [x1,59]
-	mov	w0, -1
-	strb	w0, [x1]
-	add	x0, x23, :lo12:.LANCHOR0
-	add	x0, x0, 3363
-	bl	buf_add_tail
-.L2215:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 64
-	ret
+	b	.L2260
 	.size	queue_tlc_prog_cmd, .-queue_tlc_prog_cmd
 	.align	2
 	.global	sblk_3d_tlc_dump_prog
 	.type	sblk_3d_tlc_dump_prog, %function
 sblk_3d_tlc_dump_prog:
-	stp	x29, x30, [sp, -64]!
-	adrp	x2, .LANCHOR0
+	stp	x29, x30, [sp, -48]!
+	adrp	x1, .LANCHOR0
+	add	x1, x1, :lo12:.LANCHOR0
 	mov	w3, 24
-	add	x2, x2, :lo12:.LANCHOR0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	str	x23, [sp,48]
+	stp	x19, x20, [sp, 16]
+	mov	x20, x0
+	stp	x21, x22, [sp, 32]
 	mov	w22, 1
-	mov	x19, x0
-	ldrb	w1, [x2,1257]
-	ldr	w0, [x0,40]
-	sub	w3, w3, w1
-	lsl	w1, w22, w1
+	ldr	w2, [x0, 40]
+	ldrb	w0, [x1, 1205]
+	sub	w3, w3, w0
+	lsl	w19, w22, w0
+	ldrb	w0, [x1, 1213]
 	lsl	w21, w22, w3
-	sub	w20, w1, #1
+	sub	w19, w19, #1
 	sub	w21, w21, #1
-	ldrb	w23, [x2,1269]
-	and	w21, w21, w0
-	lsr	w0, w0, w3
-	and	w20, w20, w0
-	uxtb	w20, w20
-	cbz	w23, .L2223
-	mov	w0, w20
+	and	w21, w21, w2
+	lsr	w2, w2, w3
+	and	w19, w19, w2
+	and	w19, w19, 255
+	cbz	w0, .L2267
+	mov	w0, w19
 	bl	zftl_flash_exit_slc_mode
-	ldr	x5, [x19,8]
-	mov	w1, w22
-	ldr	x6, [x19,24]
-	mov	w3, w20
+	ldr	x5, [x20, 8]
 	mov	w4, w21
+	ldr	x6, [x20, 24]
+	mov	w3, w19
+	mov	w1, w22
 	mov	w2, 26
 	mov	w0, 0
 	bl	flash_start_one_pass_page_prog
 	bl	nandc_iqr_wait_flash_ready
 	bl	nandc_wait_flash_ready
-	ldr	x5, [x19,8]
-	mov	w1, w22
-	ldr	x6, [x19,24]
-	mov	w3, w20
+	ldr	x5, [x20, 8]
 	add	w4, w21, w22
+	ldr	x6, [x20, 24]
+	mov	w3, w19
+	mov	w1, w22
 	mov	w2, 26
 	mov	w0, 0
 	bl	flash_start_one_pass_page_prog
 	bl	nandc_iqr_wait_flash_ready
 	bl	nandc_wait_flash_ready
-	ldr	x5, [x19,8]
-	mov	w0, 0
-	ldr	x6, [x19,24]
-	mov	w1, w22
-	mov	w2, 16
-	mov	w3, w20
+	ldr	x5, [x20, 8]
 	add	w4, w21, 2
+	ldr	x6, [x20, 24]
+	mov	w3, w19
+	mov	w2, 16
+	mov	w1, w22
+	mov	w0, 0
 	bl	flash_start_one_pass_page_prog
-	b	.L2224
-.L2223:
-	ldr	x5, [x19,8]
+.L2268:
+	bl	nandc_iqr_wait_flash_ready
+	bl	nandc_wait_flash_ready
+	ldr	w0, [x20, 40]
+	mov	w1, 64
+	bl	flash_wait_device_ready
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	ret
+.L2267:
+	ldr	x5, [x20, 8]
+	mov	w4, w21
+	ldr	x6, [x20, 24]
+	mov	w3, w19
 	mov	w1, w22
-	ldr	x6, [x19,24]
 	mov	w2, 26
-	mov	w3, w20
-	mov	w4, w21
-	mov	w0, w23
+	mov	w0, 0
 	bl	flash_start_tlc_page_prog
 	bl	nandc_iqr_wait_flash_ready
 	bl	nandc_wait_flash_ready
-	ldr	x5, [x19,8]
-	mov	w1, 2
-	ldr	x6, [x19,24]
-	mov	w2, 26
-	mov	w3, w20
+	ldr	x5, [x20, 8]
 	mov	w4, w21
-	mov	w0, w23
+	ldr	x6, [x20, 24]
+	mov	w3, w19
+	mov	w2, 26
+	mov	w1, 2
+	mov	w0, 0
 	bl	flash_start_tlc_page_prog
 	bl	nandc_iqr_wait_flash_ready
 	bl	nandc_wait_flash_ready
-	ldr	x5, [x19,8]
-	mov	w0, w23
-	ldr	x6, [x19,24]
-	mov	w1, 3
-	mov	w2, 16
-	mov	w3, w20
+	ldr	x5, [x20, 8]
 	mov	w4, w21
+	ldr	x6, [x20, 24]
+	mov	w3, w19
+	mov	w2, 16
+	mov	w1, 3
+	mov	w0, 0
 	bl	flash_start_tlc_page_prog
-.L2224:
-	bl	nandc_iqr_wait_flash_ready
-	bl	nandc_wait_flash_ready
-	ldr	w0, [x19,40]
-	mov	w1, 64
-	bl	flash_wait_device_ready
-	ldr	x23, [sp,48]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 64
-	ret
+	b	.L2268
 	.size	sblk_3d_tlc_dump_prog, .-sblk_3d_tlc_dump_prog
 	.align	2
 	.global	flash_start_3d_mlc_page_prog
 	.type	flash_start_3d_mlc_page_prog, %function
 flash_start_3d_mlc_page_prog:
 	stp	x29, x30, [sp, -64]!
-	adrp	x5, .LANCHOR0
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	uxtb	w22, w0
-	add	x0, x5, :lo12:.LANCHOR0
-	stp	x19, x20, [sp,16]
-	uxtb	w20, w1
-	mov	w21, w2
-	ldrb	w0, [x0,1153]
-	mov	x19, x5
-	cmp	w0, w20
-	bhi	.L2226
+	stp	x19, x20, [sp, 16]
+	and	w20, w1, 255
+	stp	x21, x22, [sp, 32]
+	and	w21, w0, 255
+	adrp	x0, .LANCHOR0
+	add	x1, x0, :lo12:.LANCHOR0
+	stp	x23, x24, [sp, 48]
+	mov	x22, x3
+	mov	w24, w2
+	mov	x23, x4
+	ldrb	w1, [x1, 1153]
+	mov	x19, x0
+	cmp	w1, w20
+	bhi	.L2271
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 344
 	mov	w2, 903
-	add	x1, x1, 328
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
-	str	x4, [x29,48]
-	str	x3, [x29,56]
 	bl	printk
 	bl	dump_stack
-	ldr	x4, [x29,48]
-	ldr	x3, [x29,56]
-.L2226:
-	add	x5, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x5,1153]
-	cmp	w0, w20
-	bls	.L2225
-	add	x20, x5, w20, sxtw
-	ldrb	w20, [x20,1248]
-	ldr	x19, [x5,1048]
-	mov	w0, w20
-	str	x4, [x29,48]
-	str	x3, [x29,56]
+.L2271:
+	add	x0, x19, :lo12:.LANCHOR0
+	ldrb	w1, [x0, 1153]
+	cmp	w1, w20
+	bls	.L2270
+	add	x20, x0, w20, sxtw
+	ldr	x19, [x0, 1056]
+	ldrb	w5, [x20, 1196]
+	mov	w0, w5
 	bl	nandc_cs
-	ubfiz	x1, x20, 8, 8
+	ubfiz	x0, x5, 8, 8
+	add	x19, x19, x0
 	mov	w0, 128
-	add	x19, x19, x1
-	str	w0, [x19,2056]
-	and	w0, w21, 255
-	str	wzr, [x19,2052]
-	str	wzr, [x19,2052]
-	str	w0, [x19,2052]
-	lsr	w0, w21, 8
-	str	w0, [x19,2052]
-	lsr	w0, w21, 16
-	str	w0, [x19,2052]
-	mov	w0, w21
+	str	w0, [x19, 2056]
+	and	w0, w24, 255
+	str	wzr, [x19, 2052]
+	str	wzr, [x19, 2052]
+	str	w0, [x19, 2052]
+	lsr	w0, w24, 8
+	str	w0, [x19, 2052]
+	lsr	w0, w24, 16
+	str	w0, [x19, 2052]
+	mov	w0, w24
 	bl	nandc_set_seed
-	adrp	x2, .LANCHOR2+17
-	ldr	x3, [x29,56]
-	ldr	x4, [x29,48]
-	mov	w0, w20
+	adrp	x0, .LANCHOR2+17
+	mov	x4, x23
+	mov	x3, x22
 	mov	w1, 1
-	ldrb	w2, [x2,#:lo12:.LANCHOR2+17]
+	ldrb	w2, [x0, #:lo12:.LANCHOR2+17]
+	mov	w0, w5
 	bl	nandc_xfer
-	str	w22, [x19,2056]
-.L2225:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
+	str	w21, [x19, 2056]
+.L2270:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
 	ldp	x29, x30, [sp], 64
 	ret
 	.size	flash_start_3d_mlc_page_prog, .-flash_start_3d_mlc_page_prog
@@ -14203,61 +14120,60 @@ flash_start_3d_mlc_page_prog:
 	.type	sblk_mlc_dump_prog, %function
 sblk_mlc_dump_prog:
 	stp	x29, x30, [sp, -48]!
-	mov	w1, 24
+	mov	w2, 24
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	str	x21, [sp,32]
+	stp	x19, x20, [sp, 16]
 	mov	x20, x0
-	ldr	w3, [x0,40]
-	adrp	x0, .LANCHOR0+1257
-	ldrb	w19, [x0,#:lo12:.LANCHOR0+1257]
+	str	x21, [sp, 32]
+	ldr	w1, [x0, 40]
+	adrp	x0, .LANCHOR0+1205
+	ldrb	w19, [x0, #:lo12:.LANCHOR0+1205]
 	mov	w0, 1
-	sub	w1, w1, w19
-	lsl	w21, w0, w1
-	lsl	w0, w0, w19
+	sub	w2, w2, w19
+	lsl	w19, w0, w19
+	sub	w19, w19, #1
+	lsl	w21, w0, w2
 	sub	w21, w21, #1
-	sub	w19, w0, #1
-	and	w21, w21, w3
-	lsr	w3, w3, w1
-	and	w19, w19, w3
-	uxtb	w19, w19
+	and	w21, w21, w1
+	lsr	w1, w1, w2
+	and	w19, w19, w1
+	and	w19, w19, 255
 	mov	w0, w19
 	bl	zftl_flash_exit_slc_mode
 	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L2229
-	ldr	w2, [x20,40]
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L2275
+	ldr	w2, [x20, 40]
 	adrp	x0, .LC171
-	add	x0, x0, :lo12:.LC171
 	mov	w1, w21
+	add	x0, x0, :lo12:.LC171
 	add	w3, w2, 1
 	bl	printk
-.L2229:
-	ldr	x3, [x20,8]
-	mov	w1, w19
-	ldr	x4, [x20,24]
+.L2275:
+	ldr	x3, [x20, 8]
 	mov	w2, w21
+	ldr	x4, [x20, 24]
+	mov	w1, w19
 	mov	w0, 16
 	bl	flash_start_3d_mlc_page_prog
 	bl	nandc_iqr_wait_flash_ready
 	bl	nandc_wait_flash_ready
-	ldr	x3, [x20,8]
+	ldr	x3, [x20, 8]
 	add	w2, w21, 1
-	ldr	x4, [x20,24]
+	ldr	x4, [x20, 24]
 	mov	w1, w19
 	mov	w0, 16
 	bl	flash_start_3d_mlc_page_prog
 	bl	nandc_iqr_wait_flash_ready
 	bl	nandc_wait_flash_ready
-	ldr	w0, [x20,40]
+	ldr	w0, [x20, 40]
 	mov	w1, 64
 	bl	flash_wait_device_ready
-	mov	w20, w0
-	mov	w0, w19
-	bl	nandc_de_cs
-	ldr	x21, [sp,32]
-	mov	w0, w20
-	ldp	x19, x20, [sp,16]
+	mov	w2, w0
+	bl	nandc_de_cs.constprop.35
+	mov	w0, w2
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	sblk_mlc_dump_prog, .-sblk_mlc_dump_prog
@@ -14266,1165 +14182,1162 @@ sblk_mlc_dump_prog:
 	.type	flash_start_page_prog, %function
 flash_start_page_prog:
 	stp	x29, x30, [sp, -96]!
-	mov	w5, 1
 	add	x29, sp, 0
-	stp	x25, x26, [sp,64]
-	adrp	x25, .LANCHOR0
-	stp	x21, x22, [sp,32]
-	uxtb	w21, w0
-	add	x0, x25, :lo12:.LANCHOR0
-	stp	x23, x24, [sp,48]
-	stp	x19, x20, [sp,16]
-	stp	x27, x28, [sp,80]
-	mov	w19, 24
+	stp	x21, x22, [sp, 32]
+	and	w21, w0, 255
+	stp	x25, x26, [sp, 64]
+	adrp	x26, .LANCHOR0
+	add	x0, x26, :lo12:.LANCHOR0
+	stp	x19, x20, [sp, 16]
+	stp	x23, x24, [sp, 48]
 	mov	w24, w1
-	ldrb	w20, [x0,1257]
-	mov	x23, x2
-	ldrb	w0, [x0,1153]
-	mov	x22, x3
-	sub	w19, w19, w20
-	lsl	w20, w5, w20
-	lsr	w1, w1, w19
+	str	x27, [sp, 80]
+	mov	w19, 24
+	mov	w20, 1
+	mov	x22, x2
+	ldrb	w1, [x0, 1205]
+	mov	x23, x3
+	ldrb	w0, [x0, 1153]
+	sub	w25, w19, w1
+	lsl	w20, w20, w1
 	sub	w20, w20, #1
-	and	w20, w1, w20
-	uxtb	w20, w20
+	lsr	w1, w24, w25
+	and	w20, w20, w1
+	and	w20, w20, 255
 	cmp	w0, w20
-	bhi	.L2234
+	bhi	.L2281
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 376
 	mov	w2, 956
-	add	x1, x1, 360
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L2234:
-	add	x28, x25, :lo12:.LANCHOR0
-	ldrb	w0, [x28,1153]
+.L2281:
+	add	x1, x26, :lo12:.LANCHOR0
+	ldrb	w0, [x1, 1153]
 	cmp	w0, w20
-	bls	.L2233
-	mov	w0, 1
-	ldr	x27, [x28,1048]
-	lsl	w19, w0, w19
+	bls	.L2280
+	add	x0, x1, w20, sxtw
+	mov	w19, 1
+	lsl	w19, w19, w25
 	sub	w19, w19, #1
-	add	x0, x28, w20, sxtw
-	and	w19, w24, w19
-	ldrb	w26, [x0,1248]
+	and	w19, w19, w24
+	ldr	x25, [x1, 1056]
+	ldrb	w27, [x0, 1196]
 	bl	nandc_rdy_status
-	cbnz	w0, .L2236
-	ldrb	w0, [x28,1153]
+	cbnz	w0, .L2283
+	ldrb	w0, [x1, 1153]
 	cmp	w0, 1
-	bne	.L2237
+	bne	.L2284
 	bl	nandc_wait_flash_ready
-	b	.L2236
-.L2237:
-	mov	w0, w20
-	mov	w1, w19
-	mov	w2, 64
-	bl	flash_wait_device_ready_raw
-.L2236:
-	mov	w0, w26
-	ubfx	x24, x24, 24, 2
+.L2283:
+	mov	w0, w27
 	bl	hynix_reconfig_rr_para
-	mov	w0, w26
+	mov	w0, w27
 	bl	nandc_cs
-	cbnz	w24, .L2238
+	tst	x24, 50331648
+	bne	.L2285
 	mov	w0, w19
 	bl	slc_phy_page_address_calc
 	mov	w19, w0
-	ldrb	w0, [x25,#:lo12:.LANCHOR0]
-	cbz	w0, .L2239
-	mov	w0, w26
+	ldrb	w0, [x26, #:lo12:.LANCHOR0]
+	cbz	w0, .L2286
+	mov	w0, w27
 	bl	zftl_flash_enter_slc_mode
-	b	.L2239
-.L2238:
-	mov	w0, w26
-	bl	zftl_flash_exit_slc_mode
-.L2239:
-	ubfiz	x1, x26, 8, 8
+.L2286:
+	ubfiz	x20, x27, 8, 8
 	mov	w0, 128
-	add	x20, x27, x1
-	add	x25, x25, :lo12:.LANCHOR0
-	str	w0, [x20,2056]
+	add	x20, x25, x20
+	add	x26, x26, :lo12:.LANCHOR0
+	str	w0, [x20, 2056]
 	and	w0, w19, 255
-	str	wzr, [x20,2052]
-	str	wzr, [x20,2052]
-	str	w0, [x20,2052]
+	str	wzr, [x20, 2052]
+	str	wzr, [x20, 2052]
+	str	w0, [x20, 2052]
 	lsr	w0, w19, 8
-	str	w0, [x20,2052]
+	str	w0, [x20, 2052]
 	lsr	w0, w19, 16
-	str	w0, [x20,2052]
-	ldrb	w0, [x25,1256]
-	cbz	w0, .L2240
+	str	w0, [x20, 2052]
+	ldrb	w0, [x26, 1204]
+	cbz	w0, .L2287
 	lsr	w0, w19, 24
-	str	w0, [x20,2052]
-.L2240:
+	str	w0, [x20, 2052]
+.L2287:
 	mov	w0, w19
 	bl	nandc_set_seed
-	adrp	x2, .LANCHOR2+17
-	mov	w0, w26
+	adrp	x0, .LANCHOR2+17
+	mov	x4, x23
+	mov	x3, x22
 	mov	w1, 1
-	mov	x3, x23
-	mov	x4, x22
-	ldrb	w2, [x2,#:lo12:.LANCHOR2+17]
+	ldrb	w2, [x0, #:lo12:.LANCHOR2+17]
+	mov	w0, w27
 	bl	nandc_xfer
-	str	w21, [x20,2056]
-	mov	w0, w26
-	bl	nandc_de_cs
-.L2233:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+	str	w21, [x20, 2056]
+	bl	nandc_de_cs.constprop.35
+.L2280:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldr	x27, [sp, 80]
 	ldp	x29, x30, [sp], 96
 	ret
+.L2284:
+	mov	w2, 64
+	mov	w1, w19
+	mov	w0, w20
+	bl	flash_wait_device_ready_raw
+	b	.L2283
+.L2285:
+	mov	w0, w27
+	bl	zftl_flash_exit_slc_mode
+	b	.L2286
 	.size	flash_start_page_prog, .-flash_start_page_prog
 	.align	2
 	.type	queue_prog_cmd, %function
 queue_prog_cmd:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	mov	x19, x0
+	ldr	w1, [x0, 40]
+	ldr	x3, [x0, 24]
+	ldr	x2, [x0, 8]
 	mov	w0, 16
-	ldr	x2, [x19,8]
-	ldr	x3, [x19,24]
-	ldr	w1, [x19,40]
 	bl	flash_start_page_prog
 	adrp	x0, .LANCHOR0
-	ldr	w4, [x19,40]
 	add	x3, x0, :lo12:.LANCHOR0
-	ldrb	w2, [x3,3363]
-	cmp	w2, 255
-	beq	.L2248
-	ldrb	w5, [x3,1257]
-	mov	w1, 1
-	mov	w7, 24
-	add	x3, x3, 1312
-	lsl	w1, w1, w5
-	sub	w7, w7, w5
-	sub	w1, w1, #1
-	asr	w4, w4, w7
-	uxth	w1, w1
-	and	w4, w1, w4
-.L2250:
-	add	x5, x3, x2, lsl 6
-	ldr	w6, [x5,40]
-	lsr	w6, w6, w7
-	and	w6, w1, w6
-	cmp	w4, w6
-	bne	.L2249
-	ldrb	w6, [x5,58]
-	add	x5, x5, 48
-	cmp	w6, 7
-	bne	.L2249
+	ldr	w4, [x19, 40]
+	ldrb	w1, [x3, 3354]
+	cmp	w1, 255
+	beq	.L2296
+	ldrb	w5, [x3, 1205]
+	mov	w2, 1
+	mov	w6, 24
+	add	x3, x3, 1304
+	sub	w6, w6, w5
+	lsl	w2, w2, w5
+	sub	w2, w2, #1
+	and	w2, w2, 65535
+	asr	w4, w4, w6
+	and	w4, w4, w2
+.L2298:
+	add	x7, x3, x1, lsl 6
+	ldr	w5, [x7, 40]
+	lsr	w5, w5, w6
+	and	w5, w2, w5
+	cmp	w4, w5
+	bne	.L2297
+	ldrb	w5, [x7, 58]
+	cmp	w5, 7
+	bne	.L2297
 	mov	w1, 3
-	strb	w1, [x5,10]
-	b	.L2248
-.L2249:
-	lsl	x2, x2, 6
-	ldrb	w2, [x3,x2]
-	cmp	w2, 255
-	bne	.L2250
-.L2248:
+	strb	w1, [x7, 58]
+.L2296:
 	mov	w1, 3
-	strb	w1, [x19,58]
+	strb	w1, [x19, 58]
 	mov	w1, 1
-	add	x0, x0, :lo12:.LANCHOR0
-	strb	w1, [x19,59]
+	strb	w1, [x19, 59]
 	mov	w1, -1
-	add	x0, x0, 3363
 	strb	w1, [x19]
+	add	x0, x0, :lo12:.LANCHOR0
 	mov	x1, x19
+	add	x0, x0, 3354
 	bl	buf_add_tail
-	ldr	x19, [sp,16]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L2297:
+	lsl	x1, x1, 6
+	ldrb	w1, [x3, x1]
+	cmp	w1, 255
+	bne	.L2298
+	b	.L2296
 	.size	queue_prog_cmd, .-queue_prog_cmd
 	.align	2
 	.global	flash_complete_plane_page_read
 	.type	flash_complete_plane_page_read, %function
 flash_complete_plane_page_read:
-	stp	x29, x30, [sp, -80]!
+	stp	x29, x30, [sp, -64]!
+	mov	w4, 24
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	adrp	x23, .LANCHOR0
+	stp	x21, x22, [sp, 32]
+	adrp	x22, .LANCHOR0
+	stp	x23, x24, [sp, 48]
 	mov	w24, w0
-	add	x0, x23, :lo12:.LANCHOR0
-	str	x25, [sp,64]
-	stp	x21, x22, [sp,32]
-	stp	x19, x20, [sp,16]
-	mov	x22, x1
-	mov	w19, 24
-	ldrb	w20, [x0,1257]
-	mov	w1, 1
+	add	x0, x22, :lo12:.LANCHOR0
+	stp	x19, x20, [sp, 16]
+	mov	x20, x1
+	mov	w19, 1
 	mov	x21, x2
-	ldrb	w0, [x0,1153]
-	sub	w19, w19, w20
-	lsl	w20, w1, w20
-	lsr	w2, w24, w19
-	sub	w20, w20, #1
-	and	w20, w2, w20
-	uxtb	w20, w20
-	cmp	w0, w20
-	bhi	.L2256
+	ldrb	w1, [x0, 1205]
+	ldrb	w0, [x0, 1153]
+	sub	w23, w4, w1
+	lsl	w19, w19, w1
+	sub	w19, w19, #1
+	lsr	w1, w24, w23
+	and	w19, w19, w1
+	and	w19, w19, 255
+	cmp	w0, w19
+	bhi	.L2305
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 400
 	mov	w2, 1070
-	add	x1, x1, 384
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L2256:
-	add	x3, x23, :lo12:.LANCHOR0
-	mov	w0, -1
-	ldrb	w1, [x3,1153]
-	cmp	w1, w20
-	bls	.L2257
-	mov	w2, 1
-	add	x20, x3, w20, sxtw
-	ldrb	w20, [x20,1248]
-	lsl	w19, w2, w19
-	add	w19, w19, w0
-	ubfx	x25, x24, 24, 2
-	mov	w0, w20
-	and	w19, w19, w24
-	ldr	x24, [x3,1048]
+.L2305:
+	add	x2, x22, :lo12:.LANCHOR0
+	ldrb	w0, [x2, 1153]
+	cmp	w0, w19
+	bls	.L2316
+	add	x19, x2, w19, sxtw
+	mov	w4, 1
+	lsl	w4, w4, w23
+	ldr	x7, [x2, 1056]
+	sub	w4, w4, #1
+	ldrb	w9, [x19, 1196]
+	and	w4, w4, w24
+	ubfx	x24, x24, 24, 2
+	mov	w0, w9
 	bl	nandc_cs
-	cbnz	w25, .L2258
-	mov	w0, w19
+	cbnz	w24, .L2307
+	mov	w0, w4
 	bl	slc_phy_page_address_calc
-	mov	w19, w0
-.L2258:
-	add	x7, x23, :lo12:.LANCHOR0
-	uxtb	x5, w20
-	and	w6, w19, 255
-	lsr	w4, w19, 8
-	lsr	w3, w19, 16
-	ldrb	w0, [x7,1176]
-	ldrb	w2, [x7,1256]
+	mov	w4, w0
+.L2307:
+	add	x8, x22, :lo12:.LANCHOR0
+	and	x1, x9, 255
+	and	w6, w4, 255
+	lsr	w5, w4, 8
+	lsr	w3, w4, 16
+	ldrb	w0, [x8, 1176]
+	ldrb	w2, [x8, 1204]
 	cmp	w0, 1
-	bne	.L2259
-	add	x5, x24, x5, lsl 8
+	bne	.L2308
+	add	x1, x7, x1, lsl 8
 	mov	w0, 6
-	b	.L2287
-.L2259:
-	ldr	x0, [x7,1144]
-	add	x5, x24, x5, lsl 8
-	ldrb	w0, [x0,12]
-	cmp	w0, 3
-	bne	.L2262
-	mov	w0, 5
-.L2287:
-	str	w0, [x5,2056]
-	str	wzr, [x5,2052]
-	str	wzr, [x5,2052]
-	str	w6, [x5,2052]
-	str	w4, [x5,2052]
-	str	w3, [x5,2052]
-	cbz	w2, .L2283
-	lsr	w0, w19, 24
-	str	w0, [x5,2052]
-	b	.L2283
-.L2262:
-	str	wzr, [x5,2056]
-	str	wzr, [x5,2052]
-	str	wzr, [x5,2052]
-	str	w6, [x5,2052]
-	str	w4, [x5,2052]
-	str	w3, [x5,2052]
-	cbz	w2, .L2264
-	lsr	w0, w19, 24
-	str	w0, [x5,2052]
-.L2264:
-	mov	w0, 5
-	str	w0, [x5,2056]
-	str	wzr, [x5,2052]
-	str	wzr, [x5,2052]
-.L2283:
+.L2334:
+	str	w0, [x1, 2056]
+	str	wzr, [x1, 2052]
+	str	wzr, [x1, 2052]
+	str	w6, [x1, 2052]
+	str	w5, [x1, 2052]
+	str	w3, [x1, 2052]
+	cbz	w2, .L2330
+	lsr	w0, w4, 24
+	str	w0, [x1, 2052]
+.L2330:
+	add	x22, x22, :lo12:.LANCHOR0
 	mov	w0, 224
-	str	w0, [x5,2056]
-	cbz	w25, .L2265
-	add	x23, x23, :lo12:.LANCHOR0
-	ldr	x0, [x23,1144]
-	ldrb	w0, [x0,12]
+	str	w0, [x1, 2056]
+	ldr	x0, [x22, 1144]
+	ldrb	w0, [x0, 12]
 	cmp	w0, 3
-	bne	.L2265
-	ldrb	w0, [x23,1268]
-	cbnz	w0, .L2265
-	ldrb	w0, [x23,1269]
-	cbnz	w0, .L2265
-	sub	w1, w25, #1
-	add	w0, w19, w19, lsl 1
-	add	w0, w1, w0
-	b	.L2284
-.L2265:
-	mov	w0, w19
-.L2284:
+	bne	.L2314
+	cbz	w24, .L2314
+	ldrb	w0, [x22, 1212]
+	cbnz	w0, .L2314
+	ldrb	w0, [x22, 1213]
+	cbnz	w0, .L2314
+	add	w4, w4, w4, lsl 1
+	sub	w0, w24, #1
+	add	w0, w4, w0
+.L2331:
 	bl	nandc_set_seed
-	adrp	x2, .LANCHOR2+17
-	mov	w1, 0
-	mov	x3, x22
+	adrp	x0, .LANCHOR2+17
 	mov	x4, x21
-	mov	w0, w20
-	ldrb	w2, [x2,#:lo12:.LANCHOR2+17]
+	mov	x3, x20
+	mov	w1, 0
+	ldrb	w2, [x0, #:lo12:.LANCHOR2+17]
+	mov	w0, w9
 	bl	nandc_xfer
-	mov	w19, w0
-	mov	w0, w20
-	bl	nandc_de_cs
-	mov	w0, w19
-.L2257:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldr	x25, [sp,64]
-	ldp	x29, x30, [sp], 80
+	mov	w2, w0
+	bl	nandc_de_cs.constprop.35
+	mov	w0, w2
+.L2304:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 64
 	ret
+.L2308:
+	ldr	x0, [x8, 1144]
+	add	x1, x7, x1, lsl 8
+	ldrb	w0, [x0, 12]
+	cmp	w0, 3
+	bne	.L2311
+	mov	w0, 5
+	b	.L2334
+.L2311:
+	str	wzr, [x1, 2056]
+	str	wzr, [x1, 2052]
+	str	wzr, [x1, 2052]
+	str	w6, [x1, 2052]
+	str	w5, [x1, 2052]
+	str	w3, [x1, 2052]
+	cbz	w2, .L2313
+	lsr	w0, w4, 24
+	str	w0, [x1, 2052]
+.L2313:
+	mov	w0, 5
+	str	w0, [x1, 2056]
+	str	wzr, [x1, 2052]
+	str	wzr, [x1, 2052]
+	b	.L2330
+.L2314:
+	mov	w0, w4
+	b	.L2331
+.L2316:
+	mov	w0, -1
+	b	.L2304
 	.size	flash_complete_plane_page_read, .-flash_complete_plane_page_read
 	.align	2
 	.global	flash_complete_page_read
 	.type	flash_complete_page_read, %function
 flash_complete_page_read:
 	stp	x29, x30, [sp, -112]!
-	mov	w5, 1
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	adrp	x24, .LANCHOR0
+	stp	x23, x24, [sp, 48]
 	mov	x23, x2
-	stp	x21, x22, [sp,32]
-	mov	x22, x1
-	add	x1, x24, :lo12:.LANCHOR0
-	stp	x19, x20, [sp,16]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
+	adrp	x24, .LANCHOR0
+	add	x2, x24, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
 	mov	w21, w0
-	mov	w0, 24
-	ldrb	w2, [x1,1257]
+	stp	x19, x20, [sp, 16]
+	mov	w0, 1
+	stp	x25, x26, [sp, 64]
+	mov	x22, x1
+	stp	x27, x28, [sp, 80]
+	mov	w1, 24
 	ubfx	x25, x21, 24, 2
-	sub	w0, w0, w2
-	lsl	w19, w5, w0
-	lsl	w5, w5, w2
-	lsr	w20, w21, w0
-	sub	w5, w5, #1
-	and	w20, w20, w5
-	ldrb	w0, [x1,1153]
+	ldrb	w20, [x2, 1205]
+	sub	w1, w1, w20
+	lsl	w20, w0, w20
+	sub	w20, w20, #1
+	lsl	w19, w0, w1
+	ldrb	w0, [x2, 1153]
+	lsr	w1, w21, w1
+	and	w20, w20, w1
 	sub	w19, w19, #1
-	uxtb	w20, w20
+	and	w20, w20, 255
 	and	w19, w19, w21
 	cmp	w0, w20
-	bhi	.L2289
+	bhi	.L2336
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 432
 	mov	w2, 1232
-	add	x1, x1, 416
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L2289:
+.L2336:
 	add	x0, x24, :lo12:.LANCHOR0
 	add	x20, x0, w20, sxtw
-	ldrb	w26, [x20,1248]
-	ldr	x27, [x0,1048]
+	ldr	x4, [x0, 1056]
+	ldrb	w26, [x20, 1196]
 	mov	w0, w26
 	bl	nandc_cs
-	cbnz	w25, .L2290
+	cbnz	w25, .L2337
 	mov	w0, w19
 	bl	slc_phy_page_address_calc
 	mov	w19, w0
-.L2290:
+.L2337:
 	adrp	x20, .LANCHOR2
 	add	x0, x20, :lo12:.LANCHOR2
-	ldrb	w0, [x0,20]
+	ldrb	w0, [x0, 20]
 	cmp	w0, 3
-	bne	.L2291
+	bne	.L2338
 	ubfiz	x0, x26, 8, 8
-	add	x1, x27, x0
-	mov	w0, 5
-	str	w0, [x1,2056]
-	and	w0, w19, 255
-	str	wzr, [x1,2052]
-	str	wzr, [x1,2052]
-	str	w0, [x1,2052]
-	lsr	w0, w19, 8
-	str	w0, [x1,2052]
-	lsr	w0, w19, 16
-	str	w0, [x1,2052]
-	mov	w0, 224
-	str	w0, [x1,2056]
-.L2291:
-	cbz	w25, .L2292
+	mov	w1, 5
+	add	x0, x4, x0
+	str	w1, [x0, 2056]
+	and	w1, w19, 255
+	str	wzr, [x0, 2052]
+	str	wzr, [x0, 2052]
+	str	w1, [x0, 2052]
+	lsr	w1, w19, 8
+	str	w1, [x0, 2052]
+	lsr	w1, w19, 16
+	str	w1, [x0, 2052]
+	mov	w1, 224
+	str	w1, [x0, 2056]
+.L2338:
 	add	x0, x24, :lo12:.LANCHOR0
-	ldr	x1, [x0,1144]
-	ldrb	w1, [x1,12]
+	ldr	x1, [x0, 1144]
+	ldrb	w1, [x1, 12]
 	cmp	w1, 3
-	bne	.L2292
-	ldrb	w1, [x0,1268]
-	cbnz	w1, .L2292
-	ldrb	w0, [x0,1269]
-	cbnz	w0, .L2292
+	bne	.L2339
+	cbz	w25, .L2339
+	ldrb	w1, [x0, 1212]
+	cbnz	w1, .L2339
+	ldrb	w0, [x0, 1213]
+	cbnz	w0, .L2339
 	sub	w0, w25, #1
 	add	w1, w19, w19, lsl 1
 	add	w0, w0, w1
-	b	.L2324
-.L2292:
-	mov	w0, w19
-.L2324:
+.L2366:
 	add	x27, x20, :lo12:.LANCHOR2
 	bl	nandc_set_seed
-	mov	w0, w26
-	mov	w1, 0
-	mov	x3, x22
 	mov	x4, x23
-	ldrb	w2, [x27,17]
+	mov	x3, x22
+	mov	w1, 0
+	mov	w0, w26
+	ldrb	w2, [x27, 17]
 	add	x27, x27, 8
 	bl	nandc_xfer
 	cmn	w0, #1
-	bne	.L2294
+	bne	.L2341
 	add	x28, x24, :lo12:.LANCHOR0
-	ldrb	w5, [x28,1240]
-	cbz	w5, .L2295
-	ldrb	w4, [x27,9]
-	mov	w0, w26
-	orr	w1, w19, w25, lsl 24
-	mov	x2, x22
+	ldrb	w5, [x28, 1252]
+	cbz	w5, .L2342
+	ldrb	w4, [x27, 9]
 	mov	x3, x23
-	str	x5, [x29,104]
-	strb	wzr, [x28,1240]
+	str	w5, [x29, 108]
+	mov	x2, x22
+	strb	wzr, [x28, 1252]
+	orr	w1, w19, w25, lsl 24
+	mov	w0, w26
 	bl	flash_read_page
-	ldr	x5, [x29,104]
-	strb	w5, [x28,1240]
-	cbnz	w25, .L2296
-.L2303:
-	ldrb	w2, [x24,#:lo12:.LANCHOR0]
+	ldr	w5, [x29, 108]
+	strb	w5, [x28, 1252]
+	cbnz	w25, .L2343
+.L2348:
+	ldrb	w2, [x24, #:lo12:.LANCHOR0]
 	add	x1, x24, :lo12:.LANCHOR0
-	cbz	w2, .L2296
-	ldrb	w1, [x1,1244]
+	cbz	w2, .L2343
+	ldrb	w1, [x1, 1249]
 	add	w1, w1, w1, lsl 1
 	cmp	w0, w1, lsr 2
-	blt	.L2296
+	blt	.L2343
 	add	x20, x20, :lo12:.LANCHOR2
-	ldrb	w1, [x20,27]
+	ldrb	w1, [x20, 27]
 	sub	w1, w1, #4
-	uxtb	w1, w1
+	and	w1, w1, 255
 	cmp	w1, 4
 	mov	w1, 256
 	csel	w0, w0, w1, hi
-	b	.L2311
-.L2296:
+.L2335:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L2339:
+	mov	w0, w19
+	b	.L2366
+.L2343:
 	cmn	w0, #1
-	bne	.L2311
-.L2304:
-	adrp	x0, .LANCHOR5+328
-	ldr	x5, [x0,#:lo12:.LANCHOR5+328]
-	cbnz	x5, .L2299
-.L2302:
+	bne	.L2335
+.L2349:
+	adrp	x0, .LANCHOR5+336
+	ldr	x5, [x0, #:lo12:.LANCHOR5+336]
+	cbnz	x5, .L2345
+.L2347:
 	add	x24, x24, :lo12:.LANCHOR0
+	mov	w3, -1
+	mov	w2, w21
+	mov	w1, 0
 	adrp	x0, .LC172
 	add	x0, x0, :lo12:.LC172
-	mov	w1, 0
-	mov	w2, w21
-	mov	w3, -1
-	ldrb	w4, [x24,1240]
+	ldrb	w4, [x24, 1252]
 	bl	printk
-	ldrb	w0, [x24,1192]
-	cbnz	w0, .L2300
+	ldrb	w0, [x24, 1192]
+	cbnz	w0, .L2346
 	mov	w0, -1
-	b	.L2311
-.L2299:
-	add	x4, x20, :lo12:.LANCHOR2
-	mov	w0, w26
-	orr	w1, w19, w25, lsl 24
-	mov	x2, x22
+	b	.L2335
+.L2345:
+	add	x0, x20, :lo12:.LANCHOR2
 	mov	x3, x23
-	ldrb	w4, [x4,17]
+	mov	x2, x22
+	orr	w1, w19, w25, lsl 24
+	ldrb	w4, [x0, 17]
+	mov	w0, w26
 	blr	x5
 	cmn	w0, #1
-	bne	.L2311
-	b	.L2302
-.L2300:
+	bne	.L2335
+	b	.L2347
+.L2346:
 	add	x20, x20, :lo12:.LANCHOR2
-	mov	w0, w26
-	orr	w1, w19, w25, lsl 24
-	mov	x2, x22
 	mov	x3, x23
-	ldrb	w4, [x20,17]
+	mov	x2, x22
+	orr	w1, w19, w25, lsl 24
+	mov	w0, w26
+	ldrb	w4, [x20, 17]
 	bl	flash_ddr_tuning_read
-	b	.L2311
-.L2294:
-	cbz	w25, .L2303
-	b	.L2311
-.L2295:
-	cbz	w25, .L2303
-	b	.L2304
-.L2311:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 112
-	ret
+	b	.L2335
+.L2342:
+	cbz	w25, .L2348
+	b	.L2349
+.L2341:
+	cbnz	w25, .L2335
+	b	.L2348
 	.size	flash_complete_page_read, .-flash_complete_page_read
 	.align	2
 	.type	queue_wait_first_req_completed, %function
 queue_wait_first_req_completed:
 	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR0
-	add	x0, x19, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	ldrb	w22, [x0,3363]
-	cmp	w22, 255
-	beq	.L2413
-	add	x0, x0, 1312
-	mov	w20, 0
-	add	x0, x0, x22, lsl 6
-	ldrb	w1, [x0,58]
-	ldr	w25, [x0,40]
-	sub	w2, w1, #1
-	cmp	w2, 10
-	bhi	.L2327
-	adrp	x0, .L2329
-	add	x0, x0, :lo12:.L2329
-	ldrh	w0, [x0,w2,uxtw #1]
-	adr	x2, .Lrtx2329
-	add	x0, x2, w0, sxth #2
-	br	x0
-.Lrtx2329:
+	add	x1, x19, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	str	x27, [sp, 80]
+	ldrb	w0, [x1, 3354]
+	cmp	w0, 255
+	bne	.L2368
+.L2401:
+	mov	w21, 0
+	b	.L2367
+.L2368:
+	add	x1, x1, 1304
+	sxtw	x20, w0
+	add	x1, x1, x20, lsl 6
+	ldrb	w2, [x1, 58]
+	ldr	w21, [x1, 40]
+	sub	w3, w2, #1
+	cmp	w3, 10
+	bhi	.L2401
+	adrp	x1, .L2371
+	add	x1, x1, :lo12:.L2371
+	ldrh	w1, [x1,w3,uxtw #1]
+	adr	x3, .Lrtx2371
+	add	x1, x3, w1, sxth #2
+	br	x1
+.Lrtx2371:
 	.section	.rodata
 	.align	0
 	.align	2
-.L2329:
-	.2byte	(.L2328 - .Lrtx2329) / 4
-	.2byte	(.L2330 - .Lrtx2329) / 4
-	.2byte	(.L2331 - .Lrtx2329) / 4
-	.2byte	(.L2331 - .Lrtx2329) / 4
-	.2byte	(.L2331 - .Lrtx2329) / 4
-	.2byte	(.L2331 - .Lrtx2329) / 4
-	.2byte	(.L2332 - .Lrtx2329) / 4
-	.2byte	(.L2333 - .Lrtx2329) / 4
-	.2byte	(.L2334 - .Lrtx2329) / 4
-	.2byte	(.L2331 - .Lrtx2329) / 4
-	.2byte	(.L2334 - .Lrtx2329) / 4
+.L2371:
+	.2byte	(.L2370 - .Lrtx2371) / 4
+	.2byte	(.L2372 - .Lrtx2371) / 4
+	.2byte	(.L2373 - .Lrtx2371) / 4
+	.2byte	(.L2373 - .Lrtx2371) / 4
+	.2byte	(.L2373 - .Lrtx2371) / 4
+	.2byte	(.L2373 - .Lrtx2371) / 4
+	.2byte	(.L2374 - .Lrtx2371) / 4
+	.2byte	(.L2375 - .Lrtx2371) / 4
+	.2byte	(.L2376 - .Lrtx2371) / 4
+	.2byte	(.L2373 - .Lrtx2371) / 4
+	.2byte	(.L2376 - .Lrtx2371) / 4
 	.text
-.L2328:
+.L2370:
 	bl	nandc_wait_flash_ready
-	add	x3, x19, :lo12:.LANCHOR0
-	add	x0, x3, 1312
-	add	x0, x0, x22, lsl 6
-	ldr	x2, [x0,16]
-	ldr	x1, [x0,8]
-	cbz	x2, .L2335
-	ldrb	w4, [x0,56]
-	ldrb	w0, [x3,3360]
-	cmp	w4, w0
+	add	x0, x19, :lo12:.LANCHOR0
+	add	x0, x0, 1304
+	add	x0, x0, x20, lsl 6
+	ldp	x1, x2, [x0, 8]
+	cbz	x2, .L2377
+	ldrb	w3, [x0, 56]
+	adrp	x0, .LANCHOR3+1946
+	ldrb	w0, [x0, #:lo12:.LANCHOR3+1946]
+	cmp	w3, w0
 	csel	x1, x1, x2, ne
-.L2335:
+.L2377:
 	add	x19, x19, :lo12:.LANCHOR0
-	mov	w0, w25
-	add	x19, x19, 1312
-	add	x19, x19, x22, lsl 6
-	ldr	x2, [x19,24]
+	mov	w0, w21
+	add	x19, x19, 1304
+	add	x20, x19, x20, lsl 6
+	ldr	x2, [x20, 24]
 	bl	flash_complete_page_read
-	str	w0, [x19,52]
+	str	w0, [x20, 52]
 	mov	w0, 13
-	strb	w0, [x19,58]
-	b	.L2414
-.L2330:
+	strb	w0, [x20, 58]
+	ldrb	w0, [x20, 2]
+	orr	w0, w0, 8
+	strb	w0, [x20, 2]
+	b	.L2401
+.L2372:
 	bl	nandc_wait_flash_ready
-	add	x2, x19, :lo12:.LANCHOR0
-	lsl	x3, x22, 6
-	add	x0, x2, 1312
-	add	x1, x0, x3
-	ldrb	w20, [x0,x3]
-	ldr	x27, [x1,8]
-	add	x0, x0, x20, lsl 6
-	ldr	x24, [x0,8]
-	ldr	x0, [x1,16]
-	cbz	x0, .L2336
-	ldrb	w3, [x1,56]
-	ldrb	w1, [x2,3360]
-	cmp	w3, w1
-	csel	x27, x27, x0, ne
-.L2336:
-	add	x2, x19, :lo12:.LANCHOR0
-	add	x0, x2, 1312
-	add	x0, x0, x20, lsl 6
-	ldr	x1, [x0,16]
-	cbz	x1, .L2337
-	ldrb	w3, [x0,56]
-	ldrb	w0, [x2,3360]
-	cmp	w3, w0
-	csel	x24, x24, x1, ne
-.L2337:
-	add	x21, x19, :lo12:.LANCHOR0
-	mov	x1, x27
-	add	x21, x21, 1312
-	add	x26, x21, x22, lsl 6
-	add	x21, x21, x20, lsl 6
-	add	x28, x26, 32
-	add	x26, x26, 16
-	ldr	x2, [x26,8]
-	ldr	w0, [x26,24]
+	add	x0, x19, :lo12:.LANCHOR0
+	lsl	x2, x20, 6
+	add	x0, x0, 1304
+	add	x1, x0, x2
+	ldrb	w21, [x0, x2]
+	add	x0, x0, x21, lsl 6
+	ldr	x23, [x0, 8]
+	ldp	x26, x0, [x1, 8]
+	cbz	x0, .L2378
+	ldrb	w2, [x1, 56]
+	adrp	x1, .LANCHOR3+1946
+	ldrb	w1, [x1, #:lo12:.LANCHOR3+1946]
+	cmp	w2, w1
+	csel	x26, x26, x0, ne
+.L2378:
+	add	x0, x19, :lo12:.LANCHOR0
+	add	x0, x0, 1304
+	add	x0, x0, x21, lsl 6
+	ldr	x1, [x0, 16]
+	cbz	x1, .L2379
+	ldrb	w2, [x0, 56]
+	adrp	x0, .LANCHOR3+1946
+	ldrb	w0, [x0, #:lo12:.LANCHOR3+1946]
+	cmp	w2, w0
+	csel	x23, x23, x1, ne
+.L2379:
+	add	x24, x19, :lo12:.LANCHOR0
+	mov	x1, x26
+	add	x24, x24, 1304
+	add	x27, x24, x20, lsl 6
+	add	x24, x24, x21, lsl 6
+	ldr	x2, [x27, 24]
+	ldr	w0, [x27, 40]
 	bl	flash_complete_plane_page_read
-	mov	w23, w0
-	ldr	x2, [x21,24]
-	mov	x1, x24
-	ldr	w0, [x21,40]
+	mov	w22, w0
+	ldr	x2, [x24, 24]
+	mov	x1, x23
+	ldr	w0, [x24, 40]
 	bl	flash_complete_plane_page_read
 	mov	w25, w0
-	cmn	w23, #1
-	beq	.L2338
-	ldr	w0, [x28,4]
+	cmn	w22, #1
+	beq	.L2380
+	ldr	w0, [x27, 36]
 	cmn	w0, #1
-	beq	.L2339
-	ldr	x1, [x26,8]
-	ldr	w1, [x1,4]
+	beq	.L2381
+	ldr	x1, [x27, 24]
+	ldr	w1, [x1, 4]
 	cmp	w0, w1
-	beq	.L2339
-.L2338:
-	add	x4, x19, :lo12:.LANCHOR0
-	mov	w0, 1
-	add	x21, x4, 1312
-	mov	w3, 24
-	add	x21, x21, x22, lsl 6
-	ldrb	w2, [x4,1257]
-	add	x26, x21, 32
-	ldrb	w4, [x4,3360]
-	add	x21, x21, 16
-	ldr	w1, [x21,24]
-	lsl	w0, w0, w2
-	sub	w3, w3, w2
-	sub	w0, w0, #1
-	lsr	w2, w1, w3
-	lsl	w3, w0, w3
-	bic	w1, w1, w3
-	ldr	x3, [x21,8]
-	and	w0, w0, w2
-	mov	x2, x27
+	beq	.L2381
+.L2380:
+	add	x0, x19, :lo12:.LANCHOR0
+	mov	w5, 1
+	add	x24, x0, 1304
+	add	x24, x24, x20, lsl 6
+	ldrb	w2, [x0, 1205]
+	mov	w0, 24
+	sub	w0, w0, w2
+	ldr	x3, [x24, 24]
+	lsl	w5, w5, w2
+	adrp	x2, .LANCHOR3+1946
+	sub	w5, w5, #1
+	ldr	w1, [x24, 40]
+	ldrb	w4, [x2, #:lo12:.LANCHOR3+1946]
+	mov	x2, x26
+	lsl	w6, w5, w0
+	lsr	w0, w1, w0
+	bic	w1, w1, w6
+	and	w0, w0, w5
 	bl	flash_read_page_en
-	mov	w23, w0
-	ldr	w2, [x26,4]
+	mov	w22, w0
+	ldr	w2, [x24, 36]
 	cmn	w2, #1
-	beq	.L2340
-	ldr	x3, [x21,8]
-	ldr	w4, [x3,4]
+	beq	.L2382
+	ldr	x0, [x24, 24]
+	ldr	w4, [x0, 4]
 	cmp	w2, w4
-	beq	.L2340
-	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 6, .L2340
+	beq	.L2382
+	adrp	x1, .LANCHOR2
+	ldr	w1, [x1, #:lo12:.LANCHOR2]
+	tbz	x1, 6, .L2382
+	ldr	w3, [x0]
 	adrp	x0, .LC173
-	ldr	w1, [x26,8]
-	ldr	w3, [x3]
+	ldr	w1, [x24, 40]
 	add	x0, x0, :lo12:.LC173
 	bl	printk
-.L2340:
+.L2382:
 	add	x0, x19, :lo12:.LANCHOR0
-	add	x0, x0, 1312
-	add	x0, x0, x22, lsl 6
-	ldr	w1, [x0,36]
+	add	x0, x0, 1304
+	add	x0, x0, x20, lsl 6
+	ldr	w1, [x0, 36]
 	cmn	w1, #1
-	beq	.L2339
-	ldr	x0, [x0,24]
-	ldr	w0, [x0,4]
+	beq	.L2381
+	ldr	x0, [x0, 24]
+	ldr	w0, [x0, 4]
 	cmp	w1, w0
-	beq	.L2339
+	beq	.L2381
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 464
 	mov	w2, 431
-	add	x1, x1, 448
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L2339:
-	add	x3, x19, :lo12:.LANCHOR0
+.L2381:
+	add	x0, x19, :lo12:.LANCHOR0
 	mov	w1, 13
-	add	x3, x3, 1312
+	add	x0, x0, 1304
 	cmn	w25, #1
-	add	x22, x3, x22, lsl 6
-	ldrb	w0, [x22,2]
-	str	w23, [x22,52]
-	orr	w0, w0, 8
-	strb	w1, [x22,58]
-	strb	w0, [x22,2]
-	beq	.L2341
-	add	x3, x3, x20, lsl 6
-	ldr	w0, [x3,36]
-	cmn	w0, #1
-	beq	.L2343
-	ldr	x1, [x3,24]
-	ldr	w1, [x1,4]
-	cmp	w0, w1
-	beq	.L2343
-.L2341:
-	add	x4, x19, :lo12:.LANCHOR0
-	mov	w2, 24
-	add	x21, x4, 1312
-	mov	w0, 1
-	add	x21, x21, x20, lsl 6
-	ldrb	w3, [x4,1257]
-	add	x22, x21, 32
-	ldrb	w4, [x4,3360]
-	add	x21, x21, 16
-	ldr	w1, [x21,24]
-	sub	w2, w2, w3
-	lsl	w0, w0, w3
-	sub	w0, w0, #1
-	lsr	w3, w1, w2
-	lsl	w2, w0, w2
-	and	w0, w0, w3
-	ldr	x3, [x21,8]
-	bic	w1, w1, w2
-	mov	x2, x24
+	add	x20, x0, x20, lsl 6
+	strb	w1, [x20, 58]
+	ldrb	w1, [x20, 2]
+	str	w22, [x20, 52]
+	orr	w1, w1, 8
+	strb	w1, [x20, 2]
+	beq	.L2383
+	add	x0, x0, x21, lsl 6
+	ldr	w1, [x0, 36]
+	cmn	w1, #1
+	beq	.L2385
+	ldr	x0, [x0, 24]
+	ldr	w0, [x0, 4]
+	cmp	w1, w0
+	beq	.L2385
+.L2383:
+	add	x0, x19, :lo12:.LANCHOR0
+	mov	w5, 1
+	add	x20, x0, 1304
+	add	x20, x20, x21, lsl 6
+	ldrb	w2, [x0, 1205]
+	mov	w0, 24
+	sub	w0, w0, w2
+	ldr	x3, [x20, 24]
+	lsl	w5, w5, w2
+	adrp	x2, .LANCHOR3+1946
+	sub	w5, w5, #1
+	ldr	w1, [x20, 40]
+	ldrb	w4, [x2, #:lo12:.LANCHOR3+1946]
+	mov	x2, x23
+	lsl	w6, w5, w0
+	lsr	w0, w1, w0
+	bic	w1, w1, w6
+	and	w0, w0, w5
 	bl	flash_read_page_en
-	ldr	w2, [x22,4]
+	ldr	w2, [x20, 36]
 	cmn	w2, #1
-	beq	.L2345
-	ldr	x3, [x21,8]
-	ldr	w4, [x3,4]
+	beq	.L2387
+	ldr	x0, [x20, 24]
+	ldr	w4, [x0, 4]
 	cmp	w2, w4
-	beq	.L2345
-	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 6, .L2345
+	beq	.L2387
+	adrp	x1, .LANCHOR2
+	ldr	w1, [x1, #:lo12:.LANCHOR2]
+	tbz	x1, 6, .L2387
+	ldr	w3, [x0]
 	adrp	x0, .LC173
-	ldr	w1, [x22,8]
-	ldr	w3, [x3]
+	ldr	w1, [x20, 40]
 	add	x0, x0, :lo12:.LC173
 	bl	printk
-.L2345:
+.L2387:
 	add	x0, x19, :lo12:.LANCHOR0
-	add	x0, x0, 1312
-	add	x0, x0, x20, lsl 6
-	ldr	w1, [x0,36]
+	add	x0, x0, 1304
+	add	x0, x0, x21, lsl 6
+	ldr	w1, [x0, 36]
 	cmn	w1, #1
-	beq	.L2343
-	ldr	x0, [x0,24]
-	ldr	w0, [x0,4]
+	beq	.L2385
+	ldr	x0, [x0, 24]
+	ldr	w0, [x0, 4]
 	cmp	w1, w0
-	beq	.L2343
+	beq	.L2385
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 464
 	mov	w2, 450
-	add	x1, x1, 448
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L2343:
+.L2385:
 	add	x19, x19, :lo12:.LANCHOR0
-	mov	w1, 13
-	add	x19, x19, 1312
-	add	x19, x19, x20, lsl 6
-	str	w23, [x19,52]
-	strb	w1, [x19,58]
-.L2414:
-	ldrb	w0, [x19,2]
+	mov	w0, 13
+	add	x19, x19, 1304
+	add	x21, x19, x21, lsl 6
+	strb	w0, [x21, 58]
+	ldrb	w0, [x21, 2]
+	str	w22, [x21, 52]
 	orr	w0, w0, 8
-	strb	w0, [x19,2]
-	b	.L2413
-.L2331:
+	strb	w0, [x21, 2]
+	b	.L2401
+.L2373:
 	bl	nandc_iqr_wait_flash_ready
-	mov	w0, w25
+	mov	w0, w21
 	mov	w1, 64
 	bl	flash_wait_device_ready
 	mov	w21, w0
-	tbz	x21, 6, .L2413
-	mov	w20, 5
-	ands	w20, w21, w20
-	beq	.L2347
+	tbz	x21, 6, .L2401
+	mov	w0, 5
+	tst	w21, w0
+	beq	.L2389
 	add	x19, x19, :lo12:.LANCHOR0
 	mov	w0, 12
-	add	x19, x19, 1312
-	mov	w2, w21
-	add	x19, x19, x22, lsl 6
+	add	x19, x19, 1304
 	mov	w4, 12
-	mov	w20, w21
-	strb	w0, [x19,58]
+	add	x20, x19, x20, lsl 6
+	mov	w2, w21
+	ldrb	w1, [x20, 1]
+	ldr	w3, [x20, 40]
+	strb	w0, [x20, 58]
 	adrp	x0, .LC174
-	ldrb	w1, [x19,1]
 	add	x0, x0, :lo12:.LC174
-	ldr	w3, [x19,40]
 	bl	printk
+.L2459:
 	mov	w0, -1
-	str	w0, [x19,52]
-	b	.L2327
-.L2347:
-	add	x4, x19, :lo12:.LANCHOR0
+	str	w0, [x20, 52]
+	b	.L2367
+.L2389:
+	add	x0, x19, :lo12:.LANCHOR0
 	mov	w1, 13
-	add	x23, x4, 1312
-	add	x23, x23, x22, lsl 6
-	strb	w1, [x23,58]
-	ldr	x1, [x4,3392]
-	str	w20, [x23,52]
-	ldr	w2, [x1,156]
+	add	x21, x0, 1304
+	add	x21, x21, x20, lsl 6
+	strb	w1, [x21, 58]
+	ldr	x1, [x0, 3384]
+	str	wzr, [x21, 52]
+	ldr	w2, [x1, 156]
 	mov	w1, 20041
 	movk	w1, 0x444b, lsl 16
 	cmp	w2, w1
-	bne	.L2413
-	ldrh	w0, [x23,50]
-	cbnz	w0, .L2413
-	ldrb	w3, [x4,1257]
-	mov	w0, 1
-	adrp	x21, .LANCHOR5
-	ldr	w1, [x23,40]
-	lsl	w0, w0, w3
-	add	x21, x21, :lo12:.LANCHOR5
-	mov	w2, 24
-	sub	w0, w0, #1
-	sub	w2, w2, w3
-	ldrb	w4, [x4,3360]
-	lsr	w3, w1, w2
-	lsl	w2, w0, w2
-	bic	w1, w1, w2
-	and	w0, w0, w3
-	ldr	x2, [x21,336]
-	ldr	x3, [x21,344]
+	bne	.L2401
+	ldrh	w1, [x21, 50]
+	cbnz	w1, .L2401
+	ldrb	w2, [x0, 1205]
+	mov	w5, 1
+	adrp	x22, .LANCHOR5
+	add	x22, x22, :lo12:.LANCHOR5
+	mov	w0, 24
+	sub	w0, w0, w2
+	lsl	w5, w5, w2
+	adrp	x2, .LANCHOR3+1946
+	sub	w5, w5, #1
+	ldr	w1, [x21, 40]
+	ldrb	w4, [x2, #:lo12:.LANCHOR3+1946]
+	ldp	x3, x2, [x22, 344]
+	lsl	w6, w5, w0
+	lsr	w0, w1, w0
+	bic	w1, w1, w6
+	and	w0, w0, w5
 	bl	flash_read_page_en
 	cmn	w0, #1
-	mov	w3, w0
-	beq	.L2348
-	ldr	x1, [x23,24]
-	ldr	x0, [x21,344]
+	beq	.L2390
+	ldr	x2, [x21, 24]
+	ldr	x1, [x22, 344]
+	ldr	w2, [x2]
 	ldr	w1, [x1]
-	ldr	w0, [x0]
-	cmp	w1, w0
-	beq	.L2413
-.L2348:
-	add	x4, x19, :lo12:.LANCHOR0
+	cmp	w2, w1
+	beq	.L2401
+.L2390:
+	add	x19, x19, :lo12:.LANCHOR0
+	mov	w3, w0
+	add	x1, x19, 1304
 	adrp	x0, .LC175
-	add	x19, x4, 1312
+	add	x20, x1, x20, lsl 6
 	add	x0, x0, :lo12:.LC175
-	add	x19, x19, x22, lsl 6
-	ldrb	w4, [x4,1240]
-	ldrb	w1, [x19,1]
-	ldr	w2, [x19,40]
+	ldrb	w4, [x19, 1252]
+	ldrb	w1, [x20, 1]
+	ldr	w2, [x20, 40]
 	bl	printk
 	mov	w0, -1
-	str	w0, [x19,52]
-	b	.L2327
-.L2334:
-	add	x24, x19, :lo12:.LANCHOR0
-	cmp	w1, 11
-	mov	w0, 3
+	str	w0, [x20, 52]
+	b	.L2401
+.L2376:
+	cmp	w2, 11
+	mov	w1, 3
 	mov	w5, 10
-	csel	w5, w0, w5, ne
+	csel	w5, w5, w1, eq
+	add	x1, x19, :lo12:.LANCHOR0
 	mov	w4, 24
-	ldrb	w1, [x24,1257]
-	mov	w0, 1
-	add	x21, x24, 1312
-	sub	w4, w4, w1
-	lsl	w0, w0, w1
-	sub	w0, w0, #1
-	lsr	w2, w25, w4
-	and	w2, w0, w2
-	add	x3, x21, x22, lsl 6
-	uxth	w2, w2
-.L2350:
-	ldrb	w1, [x3]
+	mov	w2, 1
+	add	x22, x1, 1304
+	ubfiz	x0, x0, 6, 8
+	mov	x24, x1
+	ldrb	w3, [x1, 1205]
+	add	x0, x22, x0
+	sub	w4, w4, w3
+	lsl	w2, w2, w3
+	sub	w2, w2, #1
+	lsr	w3, w21, w4
+	and	w3, w3, w2
+	and	w3, w3, 65535
+.L2392:
+	ldrb	w1, [x0]
 	cmp	w1, 255
-	beq	.L2415
+	bne	.L2399
+	mov	w21, -1
+	b	.L2367
+.L2399:
 	sxtw	x23, w1
-	add	x3, x21, x23, lsl 6
-	ldrb	w1, [x3,58]
-	cmp	w1, w5
-	bne	.L2350
-	ldr	w1, [x3,40]
+	ubfiz	x0, x1, 6, 8
+	add	x1, x22, x23, lsl 6
+	add	x0, x22, x0
+	ldrb	w6, [x1, 58]
+	cmp	w6, w5
+	bne	.L2392
+	ldr	w1, [x1, 40]
 	lsr	w1, w1, w4
-	and	w1, w0, w1
-	cmp	w2, w1
-	bne	.L2350
+	and	w1, w1, w2
+	cmp	w3, w1
+	bne	.L2392
 	bl	nandc_iqr_wait_flash_ready
-	mov	w0, w25
+	mov	w0, w21
 	mov	w1, 64
 	bl	flash_wait_device_ready
-	mov	w20, w0
-	tbz	x20, 6, .L2412
-	ands	w1, w20, 15
-	beq	.L2354
-	add	x21, x21, x22, lsl 6
+	mov	w21, w0
+	tbnz	x21, 6, .L2394
+.L2458:
+	mov	w21, 0
+	b	.L2395
+.L2394:
+	tst	x21, 15
+	beq	.L2396
+	add	x22, x22, x20, lsl 6
+	mov	w2, w0
+	mov	w4, 12
 	adrp	x0, .LC176
 	add	x0, x0, :lo12:.LC176
-	mov	w2, w20
-	mov	w4, 12
-	ldrb	w1, [x21,1]
-	ldr	w3, [x21,40]
+	ldrb	w1, [x22, 1]
+	ldr	w3, [x22, 40]
 	bl	printk
 	mov	w0, 12
-	strb	w0, [x21,58]
+	strb	w0, [x22, 58]
 	mov	w0, -1
-	str	w0, [x21,52]
-	b	.L2353
-.L2354:
-	add	x20, x21, x22, lsl 6
-	mov	w2, 13
-	str	w1, [x20,52]
-	ldr	x1, [x24,3392]
-	strb	w2, [x20,58]
-	ldr	w2, [x1,156]
-	mov	w1, 20041
-	movk	w1, 0x444b, lsl 16
-	cmp	w2, w1
-	bne	.L2412
-	ldrh	w0, [x20,50]
-	cbnz	w0, .L2412
-	ldrb	w3, [x24,1257]
-	mov	w0, 1
-	adrp	x21, .LANCHOR5
-	ldr	w1, [x20,40]
-	lsl	w0, w0, w3
-	add	x21, x21, :lo12:.LANCHOR5
-	mov	w2, 24
-	sub	w0, w0, #1
-	sub	w2, w2, w3
-	ldrb	w4, [x24,3360]
-	lsr	w3, w1, w2
-	lsl	w2, w0, w2
-	bic	w1, w1, w2
-	and	w0, w0, w3
-	ldr	x2, [x21,336]
-	ldr	x3, [x21,344]
+	str	w0, [x22, 52]
+.L2395:
+	add	x1, x19, :lo12:.LANCHOR0
+	add	x1, x1, 1304
+	add	x20, x1, x20, lsl 6
+	add	x1, x1, x23, lsl 6
+	ldrb	w0, [x20, 58]
+	strb	w0, [x1, 58]
+	ldr	w0, [x20, 52]
+	str	w0, [x1, 52]
+.L2367:
+	mov	w0, w21
+	ldr	x27, [sp, 80]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 96
+	ret
+.L2396:
+	add	x21, x22, x20, lsl 6
+	mov	w0, 13
+	strb	w0, [x21, 58]
+	ldr	x0, [x24, 3384]
+	str	wzr, [x21, 52]
+	ldr	w1, [x0, 156]
+	mov	w0, 20041
+	movk	w0, 0x444b, lsl 16
+	cmp	w1, w0
+	bne	.L2458
+	ldrh	w0, [x21, 50]
+	cbnz	w0, .L2458
+	ldrb	w2, [x24, 1205]
+	mov	w5, 1
+	adrp	x22, .LANCHOR5
+	add	x22, x22, :lo12:.LANCHOR5
+	mov	w0, 24
+	sub	w0, w0, w2
+	lsl	w5, w5, w2
+	adrp	x2, .LANCHOR3+1946
+	sub	w5, w5, #1
+	ldr	w1, [x21, 40]
+	ldrb	w4, [x2, #:lo12:.LANCHOR3+1946]
+	ldp	x3, x2, [x22, 344]
+	lsl	w6, w5, w0
+	lsr	w0, w1, w0
+	bic	w1, w1, w6
+	and	w0, w0, w5
 	bl	flash_read_page_en
 	cmn	w0, #1
-	mov	w3, w0
-	beq	.L2356
-	ldr	x1, [x20,24]
-	ldr	x0, [x21,344]
+	beq	.L2398
+	ldr	x2, [x21, 24]
+	ldr	x1, [x22, 344]
+	ldr	w2, [x2]
 	ldr	w1, [x1]
-	ldr	w0, [x0]
-	cmp	w1, w0
-	beq	.L2412
-.L2356:
-	add	x4, x19, :lo12:.LANCHOR0
+	cmp	w2, w1
+	beq	.L2458
+.L2398:
+	add	x1, x19, :lo12:.LANCHOR0
+	mov	w3, w0
+	add	x21, x1, 1304
 	adrp	x0, .LC177
-	add	x20, x4, 1312
+	add	x21, x21, x20, lsl 6
 	add	x0, x0, :lo12:.LC177
-	add	x20, x20, x22, lsl 6
-	ldrb	w4, [x4,1240]
-	ldrb	w1, [x20,1]
-	ldr	w2, [x20,40]
+	ldrb	w4, [x1, 1252]
+	ldr	w2, [x21, 40]
+	ldrb	w1, [x21, 1]
 	bl	printk
 	mov	w0, -1
-	str	w0, [x20,52]
-.L2412:
-	mov	w20, 0
-.L2353:
-	add	x1, x19, :lo12:.LANCHOR0
-	add	x1, x1, 1312
-	add	x19, x1, x22, lsl 6
-	add	x1, x1, x23, lsl 6
-	ldrb	w0, [x19,58]
-	strb	w0, [x1,58]
-	ldr	w0, [x19,52]
-	str	w0, [x1,52]
-	b	.L2327
-.L2415:
-	mov	w20, -1
-	b	.L2327
-.L2332:
+	str	w0, [x21, 52]
+	b	.L2458
+.L2374:
+	mov	w0, w21
 	mov	w1, 32
-	mov	w0, w25
 	bl	flash_wait_device_ready
-	tbz	x0, 5, .L2413
-	ands	w20, w0, 15
+	mov	w21, w0
+	tbz	x21, 5, .L2401
 	add	x19, x19, :lo12:.LANCHOR0
-	add	x19, x19, x22, lsl 6
-	beq	.L2358
-	mov	w1, 12
-	mov	w20, w0
-	strb	w1, [x19,1370]
-	mov	w1, -1
-	str	w1, [x19,1364]
-	b	.L2327
-.L2358:
+	tst	x21, 15
+	add	x19, x19, 1304
+	add	x20, x19, x20, lsl 6
+	beq	.L2400
+	mov	w0, 12
+	strb	w0, [x20, 58]
+	b	.L2459
+.L2400:
 	mov	w0, 13
-	str	w20, [x19,1364]
-	strb	w0, [x19,1370]
-	b	.L2327
-.L2333:
+	str	wzr, [x20, 52]
+	strb	w0, [x20, 58]
+	b	.L2401
+.L2375:
 	mov	w1, 64
-	mov	w0, w25
+	mov	w0, w21
 	bl	flash_wait_device_ready
-	tbz	x0, 6, .L2413
+	tbz	x0, 6, .L2401
 	add	x19, x19, :lo12:.LANCHOR0
-	add	x19, x19, x22, lsl 6
-	str	w0, [x19,1364]
+	add	x19, x19, 1304
+	add	x19, x19, x20, lsl 6
+	str	w0, [x19, 52]
 	mov	w0, 7
-	strb	w0, [x19,1370]
-.L2413:
-	mov	w20, 0
-.L2327:
-	mov	w0, w20
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 96
-	ret
+	strb	w0, [x19, 58]
+	b	.L2401
 	.size	queue_wait_first_req_completed, .-queue_wait_first_req_completed
 	.align	2
 	.global	sblk_prog_page
 	.type	sblk_prog_page, %function
 sblk_prog_page:
-	stp	x29, x30, [sp, -112]!
+	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
+	stp	x19, x20, [sp, 16]
 	mov	x19, x0
-	uxtb	w20, w1
-	ldrh	w0, [x0,50]
-	cbz	w0, .L2417
+	stp	x21, x22, [sp, 32]
+	and	w20, w1, 255
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldrh	w0, [x0, 50]
+	cbz	w0, .L2461
 	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 8, .L2417
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 8, .L2461
+	ldr	w1, [x19, 40]
 	adrp	x0, .LC178
-	ldr	w1, [x19,40]
-	add	x0, x0, :lo12:.LC178
 	mov	w2, w20
+	add	x0, x0, :lo12:.LC178
 	bl	printk
-.L2417:
-	adrp	x23, .LANCHOR0
-	adrp	x25, .LC0
-	add	x24, x23, :lo12:.LANCHOR0
+.L2461:
+	adrp	x24, .LANCHOR0
+	add	x25, x24, :lo12:.LANCHOR0
+	add	x27, x25, 1304
 	mov	w21, 0
-	add	x27, x24, 1312
-	add	x25, x25, :lo12:.LC0
-.L2418:
-	cbz	w20, .L2451
+	mov	w23, 1
+.L2462:
+	cbnz	w20, .L2473
+.L2489:
+	mov	w0, 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 96
+	ret
+.L2473:
 	ldrb	w26, [x19]
-	ldr	w22, [x19,40]
-.L2419:
-	mov	w0, w22
+	ldr	w22, [x19, 40]
+.L2463:
 	mov	w1, 1
+	mov	w0, w22
 	bl	queue_lun_state
-	cbz	w0, .L2452
-	bl	queue_wait_first_req_completed
-	bl	queue_remove_completed_req
-	b	.L2419
-.L2452:
+	cbnz	w0, .L2464
 	cmp	w20, 1
-	beq	.L2421
-	add	x0, x23, :lo12:.LANCHOR0
-	ldrb	w1, [x0,1305]
-	cbz	w1, .L2421
-	ldrb	w1, [x0,1269]
-	cbz	w1, .L2422
-.L2421:
+	beq	.L2465
+	add	x0, x24, :lo12:.LANCHOR0
+	ldrb	w1, [x0, 1250]
+	cbz	w1, .L2465
+	ldrb	w1, [x0, 1213]
+	cbz	w1, .L2466
+.L2465:
 	mov	x0, x19
 	bl	queue_prog_cmd
-	b	.L2423
-.L2422:
-	ldrb	w1, [x0,1257]
-	mov	w28, 1
-	mov	w0, 24
-	lsl	w28, w28, w1
-	sub	w0, w0, w1
-	lsr	w0, w22, w0
-	sub	w28, w28, #1
+.L2467:
+	subs	w20, w20, #1
+	beq	.L2489
+	add	x19, x24, :lo12:.LANCHOR0
+	ubfiz	x26, x26, 6, 8
+	add	x19, x19, 1304
+	add	x19, x19, x26
+	b	.L2462
+.L2464:
+	bl	queue_wait_first_req_completed
+	bl	queue_remove_completed_req
+	b	.L2463
+.L2466:
+	ldrb	w0, [x0, 1205]
+	mov	w28, 24
+	sub	w28, w28, w0
+	lsl	w0, w23, w0
+	sub	w0, w0, #1
+	lsr	w28, w22, w28
 	and	w28, w28, w0
 	ldrb	w0, [x19]
+	and	w28, w28, 65535
 	cmp	w0, 255
-	uxth	w28, w28
-	bne	.L2424
+	bne	.L2468
 	adrp	x1, .LANCHOR4
-	mov	w2, 697
 	add	x1, x1, :lo12:.LANCHOR4
-	mov	x0, x25
-	add	x1, x1, 480
+	add	x1, x1, 496
+	mov	w2, 697
+	adrp	x0, .LC0
+	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L2424:
+.L2468:
 	ldrb	w0, [x19]
-	mov	w4, 1
-	ldrb	w1, [x24,1257]
+	mov	w1, 24
 	add	x0, x27, x0, lsl 6
-	ldr	w2, [x0,40]
-	mov	w0, 24
-	sub	w0, w0, w1
-	lsl	w1, w4, w1
-	sub	w1, w1, #1
-	lsr	w3, w2, w0
-	and	w1, w1, w3
-	cmp	w28, w1, uxth
-	bne	.L2425
-	adrp	x5, .LANCHOR3
-	str	x4, [x29,104]
-	add	x5, x5, :lo12:.LANCHOR3
-	ldrh	w1, [x5,1312]
-	ldrb	w6, [x5,1314]
-	sub	w3, w0, w1
-	lsr	w5, w22, w1
-	lsl	w3, w4, w3
-	sub	w6, w6, #1
-	sub	w3, w3, #1
-	lsl	w0, w4, w1
-	uxth	w7, w6
-	lsr	w1, w2, w1
-	uxth	w3, w3
-	and	w5, w7, w5
-	and	w1, w7, w1
-	and	w5, w3, w5
-	and	w3, w3, w1
+	ldr	w4, [x0, 40]
+	ldrb	w0, [x25, 1205]
+	sub	w1, w1, w0
+	lsl	w0, w23, w0
 	sub	w0, w0, #1
-	cmp	w5, w3
-	uxth	w0, w0
-	beq	.L2425
-	and	w22, w0, w22
+	lsr	w2, w4, w1
 	and	w0, w0, w2
-	cmp	w22, w0
-	bne	.L2425
-	cmp	w21, w6
-	beq	.L2425
-	ldr	w1, [x19,40]
+	cmp	w28, w0, uxth
+	bne	.L2469
+	adrp	x0, .LANCHOR3
+	add	x0, x0, :lo12:.LANCHOR3
+	ldrh	w2, [x0, 1304]
+	ldrb	w3, [x0, 1306]
+	sub	w0, w1, w2
+	sub	w3, w3, #1
+	lsl	w1, w23, w2
+	lsl	w0, w23, w0
+	sub	w0, w0, #1
+	and	w0, w0, w3
+	sub	w1, w1, #1
+	and	w0, w0, 65535
+	lsr	w5, w22, w2
+	and	w1, w1, 65535
+	and	w5, w0, w5
+	lsr	w2, w4, w2
+	and	w0, w0, w2
+	and	w22, w1, w22
+	cmp	w5, w0
+	and	w1, w1, w4
+	ccmp	w22, w1, 0, ne
+	bne	.L2469
+	cmp	w21, w3
+	beq	.L2469
+	ldr	w1, [x19, 40]
 	mov	w0, 17
-	ldr	x2, [x19,8]
+	ldr	x2, [x19, 8]
 	add	w21, w21, 1
-	ldr	x3, [x19,24]
+	ldr	x3, [x19, 24]
 	bl	flash_start_page_prog
+	strb	w23, [x19, 59]
 	mov	w0, 9
-	ldr	x4, [x29,104]
-	strb	w0, [x19,58]
+	strb	w0, [x19, 58]
 	mov	w0, -1
-	strb	w4, [x19,59]
-	mov	x1, x19
 	strb	w0, [x19]
-	add	x0, x24, 3363
+	mov	x1, x19
+	add	x0, x25, 3354
 	bl	buf_add_tail
-	b	.L2423
-.L2425:
+	b	.L2467
+.L2469:
 	mov	x0, x19
 	mov	w21, 0
 	bl	queue_prog_cmd
-.L2423:
-	subs	w20, w20, #1
-	beq	.L2451
-	add	x19, x23, :lo12:.LANCHOR0
-	sbfiz	x26, x26, 6, 32
-	add	x19, x19, 1312
-	add	x19, x19, x26
-	b	.L2418
-.L2451:
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 112
-	ret
+	b	.L2467
 	.size	sblk_prog_page, .-sblk_prog_page
 	.align	2
 	.global	sblk_wait_write_queue_completed
@@ -15432,20 +15345,20 @@ sblk_prog_page:
 sblk_wait_write_queue_completed:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	str	x19, [sp,16]
+	str	x19, [sp, 16]
 	adrp	x19, .LANCHOR0
-.L2454:
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x0,3363]
+	add	x19, x19, :lo12:.LANCHOR0
+.L2492:
+	ldrb	w0, [x19, 3354]
 	cmp	w0, 255
-	beq	.L2456
-	bl	queue_wait_first_req_completed
-	bl	queue_remove_completed_req
-	b	.L2454
-.L2456:
-	ldr	x19, [sp,16]
+	bne	.L2493
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L2493:
+	bl	queue_wait_first_req_completed
+	bl	queue_remove_completed_req
+	b	.L2492
 	.size	sblk_wait_write_queue_completed, .-sblk_wait_write_queue_completed
 	.align	2
 	.global	ftl_flush
@@ -15453,29 +15366,29 @@ sblk_wait_write_queue_completed:
 ftl_flush:
 	stp	x29, x30, [sp, -32]!
 	adrp	x2, .LANCHOR0
-	add	x29, sp, 0
 	add	x0, x2, :lo12:.LANCHOR0
-	stp	x19, x20, [sp,16]
+	add	x29, sp, 0
+	stp	x19, x20, [sp, 16]
 	mov	x19, x2
 	adrp	x20, .LANCHOR5
-	ldrb	w1, [x0,3389]
-	cbz	w1, .L2458
+	ldrb	w1, [x0, 3380]
+	cbz	w1, .L2496
 	add	x2, x20, :lo12:.LANCHOR5
-	add	x0, x0, 1312
-	ldrb	w2, [x2,352]
+	add	x0, x0, 1304
+	ldrb	w2, [x2, 360]
 	add	x0, x0, x2, lsl 6
 	bl	sblk_prog_page
-.L2458:
+.L2496:
 	add	x2, x19, :lo12:.LANCHOR0
 	add	x20, x20, :lo12:.LANCHOR5
 	mov	w0, -1
-	strb	wzr, [x2,3389]
-	strb	w0, [x20,352]
+	strb	wzr, [x2, 3380]
+	strb	w0, [x20, 360]
 	bl	sblk_wait_write_queue_completed
 	bl	ftl_write_completed
 	mov	w0, -1
 	bl	ftl_vpn_decrement
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	ftl_flush, .-ftl_flush
@@ -15483,21 +15396,23 @@ ftl_flush:
 	.global	zftl_cache_flush
 	.type	zftl_cache_flush, %function
 zftl_cache_flush:
-	adrp	x0, .LANCHOR0+3389
+	adrp	x0, .LANCHOR0+3380
+	ldrb	w0, [x0, #:lo12:.LANCHOR0+3380]
+	cbz	w0, .L2506
 	stp	x29, x30, [sp, -16]!
 	add	x29, sp, 0
-	ldrb	w0, [x0,#:lo12:.LANCHOR0+3389]
-	cbz	w0, .L2462
 	bl	timer_get_time
-	adrp	x1, .LANCHOR5+356
-	ldr	w1, [x1,#:lo12:.LANCHOR5+356]
+	adrp	x1, .LANCHOR5+364
+	ldr	w1, [x1, #:lo12:.LANCHOR5+364]
 	add	w1, w1, 100
 	cmp	w0, w1
-	bls	.L2462
+	bls	.L2501
 	bl	ftl_flush
-.L2462:
+.L2501:
 	ldp	x29, x30, [sp], 16
 	ret
+.L2506:
+	ret
 	.size	zftl_cache_flush, .-zftl_cache_flush
 	.align	2
 	.global	ftl_read_page
@@ -15505,20 +15420,24 @@ zftl_cache_flush:
 ftl_read_page:
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	str	x19, [sp,16]
-	uxtb	w19, w0
-	str	x1, [x29,32]
-	str	x2, [x29,40]
-	str	x3, [x29,48]
-	str	x4, [x29,56]
+	stp	x19, x20, [sp, 16]
+	and	w19, w0, 255
+	stp	x21, x22, [sp, 32]
+	mov	w20, w1
+	mov	x21, x2
+	mov	x22, x3
+	str	x23, [sp, 48]
+	mov	w23, w4
 	bl	sblk_wait_write_queue_completed
-	ldr	x1, [x29,32]
+	mov	w4, w23
+	mov	x3, x22
+	mov	x2, x21
+	mov	w1, w20
 	mov	w0, w19
-	ldr	x2, [x29,40]
-	ldr	x3, [x29,48]
-	ldr	x4, [x29,56]
 	bl	flash_read_page_en
-	ldr	x19, [sp,16]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldr	x23, [sp, 48]
 	ldp	x29, x30, [sp], 64
 	ret
 	.size	ftl_read_page, .-ftl_read_page
@@ -15528,32 +15447,33 @@ ftl_read_page:
 ftl_read_ppa_page:
 	stp	x29, x30, [sp, -64]!
 	mov	w5, 1
-	mov	w4, w3
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	w20, w0
-	adrp	x0, .LANCHOR0+1257
+	adrp	x0, .LANCHOR0+1205
 	mov	w19, 24
-	str	x4, [x29,56]
-	stp	x21, x22, [sp,32]
-	ldrb	w0, [x0,#:lo12:.LANCHOR0+1257]
-	mov	x22, x1
-	mov	x21, x2
+	stp	x21, x22, [sp, 32]
+	mov	x21, x1
+	ldrb	w0, [x0, #:lo12:.LANCHOR0+1205]
+	mov	x22, x2
+	str	x23, [sp, 48]
+	mov	w23, w3
 	sub	w19, w19, w0
 	lsl	w5, w5, w0
 	sub	w5, w5, #1
 	lsr	w19, w20, w19
 	and	w19, w19, w5
+	and	w19, w19, 255
 	bl	sblk_wait_write_queue_completed
-	ldr	x4, [x29,56]
-	uxtb	w19, w19
+	mov	w4, w23
+	mov	x3, x22
+	mov	x2, x21
 	mov	w1, w20
-	mov	x2, x22
-	mov	x3, x21
 	mov	w0, w19
 	bl	flash_read_page_en
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldr	x23, [sp, 48]
 	ldp	x29, x30, [sp], 64
 	ret
 	.size	ftl_read_ppa_page, .-ftl_read_ppa_page
@@ -15563,853 +15483,838 @@ ftl_read_ppa_page:
 sblk_read_page:
 	stp	x29, x30, [sp, -128]!
 	add	x29, sp, 0
-	stp	x25, x26, [sp,64]
+	stp	x21, x22, [sp, 32]
+	and	w21, w1, 255
+	stp	x25, x26, [sp, 64]
 	adrp	x25, .LANCHOR0
-	stp	x27, x28, [sp,80]
-	stp	x21, x22, [sp,32]
 	add	x26, x25, :lo12:.LANCHOR0
-	uxtb	w21, w1
-	adrp	x28, .LC0
-	add	x27, x26, 1312
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
+	stp	x19, x20, [sp, 16]
+	stp	x23, x24, [sp, 48]
+	mov	x22, x0
 	mov	x19, x0
-	mov	x23, x0
 	mov	w20, w21
-	add	x28, x28, :lo12:.LC0
-.L2469:
-	cbz	w20, .L2492
+	add	x23, x26, 1304
+	stp	x27, x28, [sp, 80]
+	adrp	x28, .LANCHOR5
+.L2514:
+	cbnz	w20, .L2524
+.L2537:
+	adrp	x19, .LANCHOR0
+	add	x19, x19, :lo12:.LANCHOR0
+	add	x19, x19, 1304
+.L2525:
+	cbnz	w21, .L2527
+	ldp	x19, x20, [sp, 16]
+	mov	w0, 0
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 128
+	ret
+.L2524:
 	ldrb	w24, [x19]
-	ldr	w22, [x19,40]
-.L2470:
-	mov	w0, w22
+	ldr	w27, [x19, 40]
+.L2515:
 	mov	w1, 0
+	mov	w0, w27
 	bl	queue_lun_state
-	cbz	w0, .L2493
+	cbnz	w0, .L2516
+	cmp	w20, 1
+	beq	.L2521
+	add	x0, x28, :lo12:.LANCHOR5
+	ldrb	w0, [x0, 368]
+	cbnz	w0, .L2518
+.L2521:
+	mov	x0, x19
+	bl	queue_read_cmd
+	b	.L2519
+.L2516:
 	bl	queue_wait_first_req_completed
 	bl	queue_remove_completed_req
-	b	.L2470
-.L2493:
-	cmp	w20, 1
-	beq	.L2476
-	adrp	x0, .LANCHOR5+360
-	ldrb	w0, [x0,#:lo12:.LANCHOR5+360]
-	cbz	w0, .L2476
+	b	.L2515
+.L2518:
 	add	x0, x25, :lo12:.LANCHOR0
-	mov	w3, 1
-	ldrb	w1, [x0,1257]
-	mov	w0, 24
-	lsl	w3, w3, w1
-	sub	w0, w0, w1
-	lsr	w0, w22, w0
-	sub	w3, w3, #1
+	mov	w3, 24
+	ldrb	w1, [x0, 1205]
+	mov	w0, 1
+	sub	w3, w3, w1
+	lsl	w0, w0, w1
+	sub	w0, w0, #1
+	lsr	w3, w27, w3
 	and	w3, w3, w0
 	ldrb	w0, [x19]
+	and	w3, w3, 65535
 	cmp	w0, 255
-	uxth	w3, w3
-	bne	.L2475
+	bne	.L2520
 	adrp	x1, .LANCHOR4
-	mov	w2, 782
 	add	x1, x1, :lo12:.LANCHOR4
-	mov	x0, x28
-	add	x1, x1, 496
-	str	x3, [x29,120]
+	add	x1, x1, 512
+	mov	w2, 782
+	str	w3, [x29, 124]
+	adrp	x0, .LC0
+	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-	ldr	x3, [x29,120]
-.L2475:
+	ldr	w3, [x29, 124]
+.L2520:
 	ldrb	w4, [x19]
-	mov	w5, 1
-	ldrb	w0, [x26,1257]
-	mov	w2, 24
-	lsl	x4, x4, 6
-	add	x6, x27, x4
-	lsl	w5, w5, w0
-	sub	w0, w2, w0
-	sub	w5, w5, #1
-	ldr	w1, [x6,40]
+	mov	w0, 24
+	ldrb	w7, [x26, 1205]
+	mov	w2, 1
+	sbfiz	x5, x4, 6, 32
+	sub	w0, w0, w7
+	add	x6, x23, x5
+	lsl	w2, w2, w7
+	sub	w2, w2, #1
+	ldr	w1, [x6, 40]
 	lsr	w0, w1, w0
-	and	w0, w5, w0
+	and	w0, w0, w2
 	cmp	w3, w0, uxth
-	bne	.L2476
-	adrp	x0, .LANCHOR3+1418
-	ldrh	w0, [x0,#:lo12:.LANCHOR3+1418]
-	add	w22, w0, w22
-	cmp	w1, w22
-	bne	.L2476
-	ldr	w0, [x19,40]
-	add	x22, x26, 3363
-	str	x6, [x29,96]
+	bne	.L2521
+	adrp	x0, .LANCHOR3+1410
+	ldrh	w0, [x0, #:lo12:.LANCHOR3+1410]
+	add	w27, w0, w27
+	cmp	w1, w27
+	bne	.L2521
+	ldr	w0, [x19, 40]
+	mov	w27, -1
+	ldrb	w24, [x23, x5]
 	sub	w20, w20, #1
-	ldrb	w24, [x27,x4]
-	str	x4, [x29,104]
+	stp	x6, x5, [x29, 104]
+	str	w4, [x29, 120]
 	bl	flash_start_plane_read
-	mov	w3, 2
-	mov	w2, -1
-	strb	w3, [x19,58]
-	mov	x0, x22
-	strb	w2, [x19]
+	strb	wzr, [x19, 59]
+	mov	w2, 2
+	strb	w27, [x19]
+	strb	w2, [x19, 58]
+	add	x0, x26, 3354
 	mov	x1, x19
-	strb	wzr, [x19,59]
-	str	x3, [x29,112]
-	str	x2, [x29,120]
-	bl	buf_add_tail
-	ldr	x6, [x29,96]
-	mov	x0, x22
-	ldr	x4, [x29,104]
-	ldr	x3, [x29,112]
-	mov	x1, x6
-	ldr	x2, [x29,120]
-	strb	w3, [x6,58]
-	strb	wzr, [x6,59]
-	strb	w2, [x27,x4]
+	str	w2, [x29, 124]
+	mov	x19, x0
 	bl	buf_add_tail
-	b	.L2474
-.L2476:
+	ldp	x6, x5, [x29, 104]
+	strb	wzr, [x6, 59]
+	ldp	w4, w2, [x29, 120]
+	strb	w2, [x6, 58]
+	strb	w27, [x23, x5]
 	mov	x0, x19
-	bl	queue_read_cmd
-.L2474:
+	ubfiz	x1, x4, 6, 8
+	add	x1, x23, x1
+	bl	buf_add_tail
+.L2519:
 	subs	w20, w20, #1
-	beq	.L2492
+	beq	.L2537
 	add	x19, x25, :lo12:.LANCHOR0
-	sbfiz	x24, x24, 6, 32
-	add	x19, x19, 1312
+	ubfiz	x24, x24, 6, 8
+	add	x19, x19, 1304
 	add	x19, x19, x24
-	b	.L2469
-.L2492:
-	adrp	x19, .LANCHOR0
-	add	x19, x19, :lo12:.LANCHOR0
-	add	x19, x19, 1312
-.L2480:
-	cbz	w21, .L2494
-	ldrb	w0, [x23,58]
+	b	.L2514
+.L2527:
+	ldrb	w0, [x22, 58]
 	cmp	w0, 13
-	bne	.L2481
-	ldrb	w0, [x23]
+	bne	.L2526
+	ldrb	w0, [x22]
 	sub	w21, w21, #1
 	cmp	w0, 255
-	beq	.L2481
-	sbfiz	x23, x0, 6, 32
-	add	x23, x19, x23
-.L2481:
+	beq	.L2526
+	ubfiz	x22, x0, 6, 8
+	add	x22, x19, x22
+.L2526:
 	bl	queue_wait_first_req_completed
 	bl	queue_remove_completed_req
-	b	.L2480
-.L2494:
-	mov	w0, w21
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
-	ret
+	b	.L2525
 	.size	sblk_read_page, .-sblk_read_page
 	.align	2
 	.global	gc_check_data_one_wl
 	.type	gc_check_data_one_wl, %function
 gc_check_data_one_wl:
-	sub	sp, sp, #112
-	stp	x29, x30, [sp,16]
+	sub	sp, sp, #128
+	stp	x29, x30, [sp, 16]
 	add	x29, sp, 16
-	stp	x19, x20, [sp,32]
+	stp	x19, x20, [sp, 32]
 	adrp	x19, .LANCHOR0
 	add	x20, x19, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,48]
-	stp	x23, x24, [sp,64]
-	stp	x25, x26, [sp,80]
-	stp	x27, x28, [sp,96]
-	ldr	x0, [x20,3432]
-	ldr	x21, [x20,1120]
-	add	x20, x20, 3424
-	cbnz	x0, .L2496
+	stp	x21, x22, [sp, 48]
+	stp	x23, x24, [sp, 64]
+	stp	x25, x26, [sp, 80]
+	stp	x27, x28, [sp, 96]
+	ldr	x0, [x20, 3424]
+	ldr	x21, [x20, 1128]
+	cbnz	x0, .L2540
+	add	x20, x20, 3416
 	mov	w0, 1
 	bl	buf_alloc
-	str	x0, [x20,8]
-.L2496:
+	str	x0, [x20, 8]
+.L2540:
 	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x20, [x0,3432]
-	cbnz	x20, .L2497
+	ldr	x22, [x0, 3424]
+	cbnz	x22, .L2541
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 528
 	mov	w2, 729
-	add	x1, x1, 512
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L2497:
-	mov	w24, 0
-	add	x25, x21, 80
-	add	x22, x19, :lo12:.LANCHOR0
-	adrp	x27, .LANCHOR3
-	adrp	x26, .LANCHOR5
-.L2498:
-	ldrb	w0, [x25,9]
-	cmp	w24, w0
-	bge	.L2529
-	mov	w23, 1
-	sxtw	x28, w24
-.L2509:
-	add	x2, x22, 3424
-	ldrh	w0, [x2,20]
-	cmp	w23, w0
-	bgt	.L2530
-	add	x0, x28, 8
-	ldrh	w1, [x25,x0,lsl 1]
-	add	x0, x27, :lo12:.LANCHOR3
-	ldrh	w3, [x0,1418]
-	ldrb	w0, [x0,1328]
-	cmp	w0, 2
-	mul	w1, w1, w3
-	beq	.L2499
-	ldrb	w3, [x22,1268]
-	cbz	w3, .L2500
-.L2499:
-	ldrh	w2, [x22,3440]
-	sub	w2, w2, #1
-	add	w1, w2, w1
-	add	w1, w1, w23
-	orr	w1, w1, w0, lsl 24
-	b	.L2528
-.L2500:
-	cmp	w0, 3
-	bne	.L2502
-	ldrb	w0, [x22,1269]
-	cbz	w0, .L2503
-	ldrh	w0, [x2,16]
-	add	w0, w0, w0, lsl 1
-	sub	w0, w0, #1
-	add	w1, w0, w1
-	add	w1, w1, w23
-	orr	w1, w1, 50331648
-	b	.L2528
-.L2503:
-	ldrh	w0, [x2,16]
-	add	w1, w1, w0
-	orr	w1, w1, w23, lsl 24
-	b	.L2528
-.L2502:
-	ldrh	w0, [x2,16]
-	add	w1, w1, w0
-.L2528:
-	str	w1, [x20,40]
-	mov	x0, x20
+.L2541:
+	add	x27, x19, :lo12:.LANCHOR0
+	adrp	x4, .LANCHOR3
+	add	x23, x27, 3416
+	mov	x20, x4
+	mov	w25, 0
+.L2542:
+	add	x28, x21, 80
+	ldrb	w0, [x28, 9]
+	cmp	w25, w0
+	bge	.L2553
+	sxtw	x26, w25
+	mov	w24, 1
+	add	x26, x26, 8
+	b	.L2554
+.L2552:
+	add	x1, x4, :lo12:.LANCHOR3
+	ldrh	w0, [x28, x26, lsl 1]
+	ldrh	w2, [x1, 1410]
+	ldrb	w1, [x1, 1320]
+	cmp	w1, 2
+	mul	w2, w0, w2
+	beq	.L2543
+	ldrb	w0, [x27, 1212]
+	cbz	w0, .L2544
+.L2543:
+	ldrh	w0, [x23, 16]
+	sub	w3, w0, #1
+	add	w0, w24, w2
+	add	w0, w3, w0
+	orr	w1, w0, w1, lsl 24
+	str	w1, [x22, 40]
+.L2545:
+	str	x4, [x29, 104]
 	mov	w1, 1
+	mov	x0, x22
 	bl	sblk_read_page
-	ldr	w2, [x20,52]
+	ldr	w2, [x22, 52]
+	adrp	x0, .LANCHOR5
+	ldr	x4, [x29, 104]
 	cmn	w2, #1
-	beq	.L2504
-	add	x3, x26, :lo12:.LANCHOR5
-	ldrh	w0, [x22,3446]
-	ldr	x1, [x20,24]
-	lsl	x0, x0, 2
-	ldr	x4, [x3,232]
-	ldr	w5, [x4,x0]
-	ldr	w4, [x1,4]
-	cmp	w5, w4
-	bne	.L2504
-	ldr	x3, [x3,240]
-	ldr	w3, [x3,x0]
-	ldr	w0, [x1,8]
-	cmp	w3, w0
-	beq	.L2505
-.L2504:
-	add	x0, x26, :lo12:.LANCHOR5
-	ldrh	w4, [x22,3446]
-	lsl	x4, x4, 2
-	ldr	x1, [x0,232]
-	ldr	w3, [x1,x4]
+	beq	.L2548
+	add	x5, x0, :lo12:.LANCHOR5
+	ldrh	w1, [x23, 22]
+	ldr	x3, [x22, 24]
+	ldr	x6, [x5, 280]
+	lsl	x1, x1, 2
+	ldr	w7, [x6, x1]
+	ldr	w6, [x3, 4]
+	cmp	w7, w6
+	bne	.L2548
+	ldr	x5, [x5, 288]
+	ldr	w5, [x5, x1]
+	ldr	w1, [x3, 8]
+	cmp	w5, w1
+	beq	.L2549
+.L2548:
+	add	x0, x0, :lo12:.LANCHOR5
+	ldrh	w1, [x23, 22]
+	ldr	x3, [x0, 280]
+	lsl	x1, x1, 2
+	ldr	w3, [x3, x1]
 	cmn	w3, #1
-	beq	.L2505
-	adrp	x1, .LANCHOR2
-	ldr	w1, [x1,#:lo12:.LANCHOR2]
-	tbz	x1, 10, .L2506
-	ldr	x7, [x20,24]
-	ldr	x5, [x0,240]
-	ldr	w0, [x7,12]
-	str	w0, [sp]
+	beq	.L2549
+	adrp	x4, .LANCHOR2
+	ldr	w4, [x4, #:lo12:.LANCHOR2]
+	tbz	x4, 10, .L2550
+	ldr	x4, [x22, 24]
+	ldr	x0, [x0, 288]
+	ldr	w5, [x4, 12]
+	str	w5, [sp]
+	ldp	w5, w6, [x4]
+	ldr	w7, [x4, 8]
+	ldr	w4, [x0, x1]
 	adrp	x0, .LC179
+	ldr	w1, [x22, 40]
 	add	x0, x0, :lo12:.LC179
-	ldr	w4, [x5,x4]
-	ldr	w6, [x7,4]
-	ldr	w5, [x7]
-	ldr	w1, [x20,40]
-	ldr	w7, [x7,8]
 	bl	printk
-.L2506:
+.L2550:
 	add	x19, x19, :lo12:.LANCHOR0
-	ldrh	w1, [x21,80]
-	mov	w21, -1
-	ldr	x0, [x19,1112]
-	strh	wzr, [x0,x1,lsl 1]
-	ldr	x1, [x19,1120]
-	ldr	w0, [x1,556]
+	ldrh	w1, [x21, 80]
+	ldr	x0, [x19, 1120]
+	strh	wzr, [x0, x1, lsl 1]
+	ldr	x1, [x19, 1128]
+	ldr	w0, [x1, 556]
 	add	w0, w0, 1
-	str	w0, [x1,556]
-	ldr	x0, [x19,3392]
-	ldr	w1, [x0,156]
+	str	w0, [x1, 556]
+	ldr	x0, [x19, 3384]
+	ldr	w1, [x0, 156]
 	mov	w0, 20041
 	movk	w0, 0x444b, lsl 16
 	cmp	w1, w0
-	bne	.L2507
-	adrp	x0, .LANCHOR3
-	add	x0, x0, :lo12:.LANCHOR3
-	ldrb	w1, [x0,1956]
-	cbnz	w1, .L2507
-	ldrb	w0, [x0,1330]
-	cbnz	w0, .L2507
-	ldr	w0, [x20,40]
+	bne	.L2557
+	add	x20, x20, :lo12:.LANCHOR3
+	ldrb	w0, [x20, 1950]
+	cbnz	w0, .L2557
+	ldrb	w0, [x20, 1322]
+	cbnz	w0, .L2557
+	ldr	w0, [x22, 40]
 	bl	ftl_mask_bad_block
-	b	.L2507
-.L2505:
-	ldrh	w0, [x22,3446]
-	add	w23, w23, 1
-	add	w0, w0, 1
-	strh	w0, [x22,3446]
-	b	.L2509
-.L2530:
+.L2557:
+	mov	w0, -1
+.L2539:
+	ldp	x19, x20, [sp, 32]
+	ldp	x21, x22, [sp, 48]
+	ldp	x23, x24, [sp, 64]
+	ldp	x25, x26, [sp, 80]
+	ldp	x27, x28, [sp, 96]
+	ldp	x29, x30, [sp, 16]
+	add	sp, sp, 128
+	ret
+.L2544:
+	cmp	w1, 3
+	ldrh	w0, [x23, 16]
+	bne	.L2546
+	ldrb	w1, [x27, 1213]
+	cbz	w1, .L2547
+	add	w0, w0, w0, lsl 1
+	sub	w1, w0, #1
+	add	w0, w24, w2
+	add	w0, w1, w0
+	orr	w0, w0, 50331648
+.L2572:
+	str	w0, [x22, 40]
+	b	.L2545
+.L2547:
+	add	w0, w0, w2
+	orr	w0, w0, w24, lsl 24
+	b	.L2572
+.L2546:
+	add	w0, w0, w2
+	b	.L2572
+.L2549:
+	ldrh	w0, [x23, 22]
 	add	w24, w24, 1
-	b	.L2498
-.L2529:
+	add	w0, w0, 1
+	strh	w0, [x23, 22]
+.L2554:
+	ldrh	w0, [x23, 20]
+	cmp	w24, w0
+	ble	.L2552
+	add	w25, w25, 1
+	b	.L2542
+.L2553:
 	add	x19, x19, :lo12:.LANCHOR0
-	mov	w21, 0
-	add	x19, x19, 3424
-	ldrh	w0, [x19,16]
+	add	x19, x19, 3416
+	ldrh	w0, [x19, 16]
 	add	w1, w0, 1
-	strh	w1, [x19,16]
-	adrp	x1, .LANCHOR3+1330
-	ldrb	w1, [x1,#:lo12:.LANCHOR3+1330]
-	cbz	w1, .L2507
+	strh	w1, [x19, 16]
+	adrp	x1, .LANCHOR3+1322
+	ldrb	w1, [x1, #:lo12:.LANCHOR3+1322]
+	cbz	w1, .L2558
 	add	w0, w0, 2
-	strh	w0, [x19,16]
-.L2507:
-	sub	sp, x29, #16
-	mov	w0, w21
-	ldp	x19, x20, [sp,32]
-	ldp	x21, x22, [sp,48]
-	ldp	x23, x24, [sp,64]
-	ldp	x25, x26, [sp,80]
-	ldp	x27, x28, [sp,96]
-	ldp	x29, x30, [sp,16]
-	add	sp, sp, 112
-	ret
+	strh	w0, [x19, 16]
+.L2558:
+.L2551:
+	mov	w0, 0
+	b	.L2539
 	.size	gc_check_data_one_wl, .-gc_check_data_one_wl
 	.align	2
 	.global	sblk_tlc_prog_one_page
 	.type	sblk_tlc_prog_one_page, %function
 sblk_tlc_prog_one_page:
-	stp	x29, x30, [sp, -48]!
+	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	str	x21, [sp,32]
-	mov	x20, x0
+	stp	x19, x20, [sp, 16]
+	mov	x19, x0
 	ldr	x0, [x0]
-	ldr	w21, [x0,40]
-.L2532:
-	mov	w0, w21
+	ldr	w20, [x0, 40]
+.L2574:
 	mov	w1, 1
+	mov	w0, w20
 	bl	queue_lun_state
-	mov	w19, w0
-	cbz	w0, .L2534
-	bl	queue_wait_first_req_completed
-	bl	queue_remove_completed_req
-	b	.L2532
-.L2534:
-	mov	x0, x20
+	cbnz	w0, .L2575
+	mov	x0, x19
 	mov	w1, 1
 	bl	queue_tlc_prog_cmd
-	ldr	x21, [sp,32]
-	mov	w0, w19
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 48
+	mov	w0, 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 32
 	ret
+.L2575:
+	bl	queue_wait_first_req_completed
+	bl	queue_remove_completed_req
+	b	.L2574
 	.size	sblk_tlc_prog_one_page, .-sblk_tlc_prog_one_page
 	.align	2
 	.global	sblk_xlc_prog_pages
 	.type	sblk_xlc_prog_pages, %function
 sblk_xlc_prog_pages:
-	stp	x29, x30, [sp, -96]!
+	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	str	x27, [sp,80]
-	mov	x21, x0
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
+	stp	x19, x20, [sp, 16]
+	mov	x20, x0
+	stp	x21, x22, [sp, 32]
 	mov	x22, x1
-	mov	w27, w2
+	stp	x25, x26, [sp, 64]
+	mov	w25, w2
+	stp	x23, x24, [sp, 48]
 	ldr	x0, [x0]
-	ldr	w19, [x0,40]
-.L2536:
-	mov	w0, w19
+	ldr	w19, [x0, 40]
+.L2578:
 	mov	w1, 1
+	mov	w0, w19
 	bl	queue_lun_state
-	mov	w24, w0
-	cbz	w0, .L2547
-	bl	queue_wait_first_req_completed
-	bl	queue_remove_completed_req
-	b	.L2536
-.L2547:
-	cmp	w27, 2
-	bne	.L2538
-	adrp	x25, .LANCHOR0
-	add	x2, x25, :lo12:.LANCHOR0
-	ldrb	w0, [x2,1305]
-	cbz	w0, .L2539
-	ldrb	w0, [x2,1257]
-	mov	w1, 24
-	ldr	x6, [x21]
-	mov	w20, 1
-	sub	w1, w1, w0
-	ldr	x4, [x22]
-	lsl	w23, w20, w1
-	lsl	w0, w20, w0
-	ldr	w3, [x6,40]
-	sub	w23, w23, #1
-	sub	w19, w0, #1
-	ldrb	w0, [x2,1269]
-	and	w26, w23, w3
-	lsr	w3, w3, w1
-	ldr	w4, [x4,40]
-	and	w19, w19, w3
-	and	w23, w23, w4
-	uxtb	w19, w19
-	cbz	w0, .L2540
+	cbnz	w0, .L2579
+	cmp	w25, 2
+	bne	.L2580
+	adrp	x23, .LANCHOR0
+	add	x4, x23, :lo12:.LANCHOR0
+	ldr	x5, [x22]
+	ldrb	w0, [x4, 1250]
+	cbz	w0, .L2581
+	ldr	x0, [x20]
+	mov	w26, 1
+	ldrb	w1, [x4, 1205]
+	mov	w3, 24
+	ldr	w5, [x5, 40]
+	sub	w3, w3, w1
+	lsl	w19, w26, w1
+	ldr	w2, [x0, 40]
+	ldrb	w1, [x4, 1213]
+	lsl	w21, w26, w3
+	sub	w19, w19, #1
+	sub	w21, w21, #1
+	and	w24, w2, w21
+	lsr	w2, w2, w3
+	and	w19, w19, w2
+	and	w21, w21, w5
+	and	w19, w19, 255
+	cbz	w1, .L2582
 	mov	w0, w19
 	bl	zftl_flash_exit_slc_mode
-	ldr	x6, [x21]
-	mov	w1, w20
+	ldr	x0, [x20]
+	mov	w4, w24
 	mov	w3, w19
-	mov	w4, w26
-	mov	w0, w24
+	mov	w1, w26
 	mov	w2, 17
-	ldr	x5, [x6,8]
-	ldr	x6, [x6,24]
+	ldr	x5, [x0, 8]
+	ldr	x6, [x0, 24]
+	mov	w0, 0
 	bl	flash_start_one_pass_page_prog
 	bl	nandc_wait_flash_ready
-	ldr	x6, [x22]
-	mov	w1, w20
+	ldr	x0, [x22]
+	mov	w4, w21
 	mov	w3, w19
-	mov	w4, w23
-	mov	w0, w24
+	mov	w1, w26
 	mov	w2, 26
-	ldr	x5, [x6,8]
-	ldr	x6, [x6,24]
+	ldr	x5, [x0, 8]
+	ldr	x6, [x0, 24]
+	mov	w0, 0
 	bl	flash_start_one_pass_page_prog
 	bl	nandc_wait_flash_ready
-	ldr	x6, [x21,8]
-	mov	w1, w27
+	ldr	x0, [x20, 8]
+	add	w4, w24, w26
 	mov	w3, w19
-	add	w4, w26, w20
-	mov	w0, w24
+	mov	w1, w25
 	mov	w2, 17
-	ldr	x5, [x6,8]
-	ldr	x6, [x6,24]
+	ldr	x5, [x0, 8]
+	ldr	x6, [x0, 24]
+	mov	w0, 0
 	bl	flash_start_one_pass_page_prog
 	bl	nandc_wait_flash_ready
-	ldr	x6, [x22,8]
-	mov	w1, w27
+	ldr	x0, [x22, 8]
+	add	w4, w21, w26
 	mov	w3, w19
-	add	w4, w23, w20
-	mov	w0, w24
+	mov	w1, w25
 	mov	w2, 26
-	ldr	x5, [x6,8]
-	ldr	x6, [x6,24]
+	ldr	x5, [x0, 8]
+	ldr	x6, [x0, 24]
+	mov	w0, 0
 	bl	flash_start_one_pass_page_prog
 	bl	nandc_wait_flash_ready
-	ldr	x6, [x21,16]
+	ldr	x0, [x20, 16]
+	add	w4, w24, 2
 	mov	w3, w19
-	add	w4, w26, 2
-	mov	w0, w24
-	mov	w1, 3
 	mov	w2, 17
-	ldr	x5, [x6,8]
-	ldr	x6, [x6,24]
+	mov	w1, 3
+	ldr	x5, [x0, 8]
+	ldr	x6, [x0, 24]
+	mov	w0, 0
 	bl	flash_start_one_pass_page_prog
 	bl	nandc_wait_flash_ready
-	ldr	x6, [x22,16]
-	mov	w0, w24
-	mov	w1, 3
-	mov	w2, 16
+	ldr	x0, [x22, 16]
+	add	w4, w21, 2
 	mov	w3, w19
-	add	w4, w23, 2
-	ldr	x5, [x6,8]
-	ldr	x6, [x6,24]
+	mov	w2, 16
+	mov	w1, 3
+	ldr	x5, [x0, 8]
+	ldr	x6, [x0, 24]
+	mov	w0, 0
 	bl	flash_start_one_pass_page_prog
-	b	.L2541
-.L2540:
-	ldr	x5, [x6,8]
-	mov	w1, w20
-	ldrb	w0, [x6,60]
-	mov	w2, 17
-	ldr	x6, [x6,24]
+.L2583:
+	ldr	x1, [x20]
+	mov	w0, 5
+	strb	w0, [x1, 58]
+	mov	w0, 1
+	strb	w0, [x1, 59]
+	mov	w0, -1
+	strb	w0, [x1]
+	add	x0, x23, :lo12:.LANCHOR0
+	add	x0, x0, 3354
+	bl	buf_add_tail
+.L2584:
+	mov	w0, 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	ret
+.L2579:
+	bl	queue_wait_first_req_completed
+	bl	queue_remove_completed_req
+	b	.L2578
+.L2582:
+	ldr	x5, [x0, 8]
+	mov	w4, w24
+	ldr	x6, [x0, 24]
 	mov	w3, w19
-	mov	w4, w26
+	ldrb	w0, [x0, 60]
+	mov	w1, w26
+	mov	w2, 17
 	bl	flash_start_tlc_page_prog
 	bl	nandc_wait_flash_ready
-	ldr	x6, [x22]
-	mov	w1, w20
-	ldr	x0, [x21]
-	mov	w2, 26
+	ldr	x7, [x20]
+	mov	w4, w21
+	ldr	x0, [x22]
 	mov	w3, w19
-	mov	w4, w23
-	ldr	x5, [x6,8]
-	ldrb	w0, [x0,60]
-	ldr	x6, [x6,24]
+	mov	w1, w26
+	mov	w2, 26
+	ldr	x5, [x0, 8]
+	ldr	x6, [x0, 24]
+	ldrb	w0, [x7, 60]
 	bl	flash_start_tlc_page_prog
 	bl	nandc_wait_flash_ready
-	ldr	x6, [x21,8]
-	mov	w1, w27
-	ldr	x0, [x21]
-	mov	w2, 17
+	ldp	x7, x0, [x20]
+	mov	w4, w24
 	mov	w3, w19
-	mov	w4, w26
-	ldr	x5, [x6,8]
-	ldrb	w0, [x0,60]
-	ldr	x6, [x6,24]
+	mov	w1, w25
+	mov	w2, 17
+	ldr	x5, [x0, 8]
+	ldr	x6, [x0, 24]
+	ldrb	w0, [x7, 60]
 	bl	flash_start_tlc_page_prog
 	bl	nandc_wait_flash_ready
-	ldr	x6, [x22,8]
-	mov	w1, w27
-	ldr	x0, [x21]
-	mov	w2, 26
+	ldr	x7, [x20]
+	mov	w4, w21
+	ldr	x0, [x22, 8]
 	mov	w3, w19
-	mov	w4, w23
-	ldr	x5, [x6,8]
-	ldrb	w0, [x0,60]
-	ldr	x6, [x6,24]
+	mov	w1, w25
+	mov	w2, 26
+	ldr	x5, [x0, 8]
+	ldr	x6, [x0, 24]
+	ldrb	w0, [x7, 60]
 	bl	flash_start_tlc_page_prog
 	bl	nandc_wait_flash_ready
-	ldr	x6, [x21,16]
-	mov	w1, 3
-	ldr	x0, [x21]
-	mov	w2, 17
+	ldr	x7, [x20]
+	mov	w4, w24
+	ldr	x0, [x20, 16]
 	mov	w3, w19
-	mov	w4, w26
-	ldr	x5, [x6,8]
-	ldrb	w0, [x0,60]
-	ldr	x6, [x6,24]
+	mov	w2, 17
+	mov	w1, 3
+	ldr	x5, [x0, 8]
+	ldr	x6, [x0, 24]
+	ldrb	w0, [x7, 60]
 	bl	flash_start_tlc_page_prog
 	bl	nandc_wait_flash_ready
-	ldr	x6, [x22,16]
-	mov	w1, 3
-	ldr	x0, [x21]
-	mov	w2, 16
+	ldr	x0, [x22, 16]
+	mov	w4, w21
+	ldr	x7, [x20]
 	mov	w3, w19
-	mov	w4, w23
-	ldr	x5, [x6,8]
-	ldrb	w0, [x0,60]
-	ldr	x6, [x6,24]
+	mov	w2, 16
+	mov	w1, 3
+	ldr	x5, [x0, 8]
+	ldr	x6, [x0, 24]
+	ldrb	w0, [x7, 60]
 	bl	flash_start_tlc_page_prog
-.L2541:
-	ldr	x1, [x21]
-	mov	w0, 5
-	strb	w0, [x1,58]
-	mov	w0, 1
-	strb	w0, [x1,59]
-	mov	w0, -1
-	strb	w0, [x1]
-	add	x0, x25, :lo12:.LANCHOR0
-	add	x0, x0, 3363
-	bl	buf_add_tail
-	b	.L2542
-.L2539:
-	ldr	x0, [x22]
-	ldr	w19, [x0,40]
-.L2543:
-	mov	w0, w19
+	b	.L2583
+.L2581:
+	ldr	w19, [x5, 40]
+.L2585:
 	mov	w1, 1
+	mov	w0, w19
 	bl	queue_lun_state
-	mov	w20, w0
-	cbz	w0, .L2548
-	bl	queue_wait_first_req_completed
-	bl	queue_remove_completed_req
-	b	.L2543
-.L2548:
-	mov	x0, x21
+	cbnz	w0, .L2586
 	mov	w1, 1
+	mov	x0, x20
 	bl	queue_tlc_prog_cmd
+	mov	w1, 0
 	mov	x0, x22
-	mov	w1, w20
 	bl	queue_tlc_prog_cmd
-.L2545:
-	mov	w0, w19
+.L2587:
 	mov	w1, 1
+	mov	w0, w19
 	bl	queue_lun_state
-	cbz	w0, .L2542
+	cbz	w0, .L2584
 	bl	queue_wait_first_req_completed
 	bl	queue_remove_completed_req
-	b	.L2545
-.L2538:
-	mov	x0, x21
+	b	.L2587
+.L2586:
+	bl	queue_wait_first_req_completed
+	bl	queue_remove_completed_req
+	b	.L2585
+.L2580:
 	mov	w1, 1
+	mov	x0, x20
 	bl	queue_tlc_prog_cmd
-.L2542:
-	mov	w0, 0
-	ldr	x27, [sp,80]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 96
-	ret
+	b	.L2584
 	.size	sblk_xlc_prog_pages, .-sblk_xlc_prog_pages
 	.align	2
 	.global	sblk_3d_mlc_prog_pages
 	.type	sblk_3d_mlc_prog_pages, %function
 sblk_3d_mlc_prog_pages:
-	stp	x29, x30, [sp, -96]!
+	stp	x29, x30, [sp, -80]!
+	ubfiz	x1, x1, 4, 32
+	add	x1, x1, 8
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	adrp	x23, .LANCHOR0
-	str	x27, [sp,80]
-	add	x23, x23, :lo12:.LANCHOR0
-	mov	w24, 1
-	stp	x25, x26, [sp,64]
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	mov	x20, x0
-	mov	w22, w1
-	mov	w25, 24
-	mov	w26, 4
-	add	x27, x23, 3363
-.L2550:
-	cbz	w22, .L2554
-	ldr	x0, [x20]
-	ldr	w19, [x0,40]
-.L2551:
-	mov	w0, w19
+	stp	x21, x22, [sp, 32]
+	adrp	x22, .LANCHOR0
+	add	x22, x22, :lo12:.LANCHOR0
+	stp	x25, x26, [sp, 64]
+	add	x21, x0, x1
+	add	x26, x0, 8
+	add	x25, x22, 3354
+	stp	x23, x24, [sp, 48]
+	stp	x19, x20, [sp, 16]
+	mov	w23, 1
+	mov	w24, 24
+.L2591:
+	cmp	x21, x26
+	bne	.L2594
+	mov	w0, 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	ret
+.L2594:
+	ldr	x0, [x26, -8]
+	ldr	w19, [x0, 40]
+.L2592:
 	mov	w1, 1
+	mov	w0, w19
 	bl	queue_lun_state
-	cbz	w0, .L2555
-	bl	queue_wait_first_req_completed
-	bl	queue_remove_completed_req
-	b	.L2551
-.L2555:
-	ldr	x0, [x20]
-	sub	w22, w22, #1
-	ldr	w3, [x0,40]
-	ldrb	w0, [x23,1257]
-	sub	w1, w25, w0
-	lsl	w0, w24, w0
-	lsl	w21, w24, w1
-	sub	w19, w0, #1
-	sub	w21, w21, #1
-	and	w21, w21, w3
-	lsr	w3, w3, w1
-	and	w19, w19, w3
-	uxtb	w19, w19
+	cbnz	w0, .L2593
+	ldr	x0, [x26, -8]
+	add	x26, x26, 16
+	ldrb	w1, [x22, 1205]
+	sub	w2, w24, w1
+	ldr	w0, [x0, 40]
+	lsl	w19, w23, w1
+	lsl	w20, w23, w2
+	sub	w19, w19, #1
+	sub	w20, w20, #1
+	and	w20, w20, w0
+	lsr	w0, w0, w2
+	and	w19, w19, w0
+	and	w19, w19, 255
 	mov	w0, w19
 	bl	zftl_flash_exit_slc_mode
-	ldr	x4, [x20]
+	ldr	x0, [x26, -24]
+	mov	w2, w20
 	mov	w1, w19
-	mov	w2, w21
+	ldr	x3, [x0, 8]
+	ldr	x4, [x0, 24]
 	mov	w0, 16
-	ldr	x3, [x4,8]
-	ldr	x4, [x4,24]
 	bl	flash_start_3d_mlc_page_prog
 	bl	nandc_wait_flash_ready
-	ldr	x4, [x20,8]
+	ldr	x0, [x26, -16]
+	add	w2, w20, 1
 	mov	w1, w19
-	add	w2, w21, 1
+	ldr	x3, [x0, 8]
+	ldr	x4, [x0, 24]
 	mov	w0, 16
-	ldr	x3, [x4,8]
-	ldr	x4, [x4,24]
 	bl	flash_start_3d_mlc_page_prog
-	mov	w0, w19
-	bl	nandc_de_cs
-	ldr	x1, [x20],16
+	bl	nandc_de_cs.constprop.35
+	ldr	x1, [x26, -24]
+	mov	w0, 4
+	strb	w23, [x1, 59]
+	strb	w0, [x1, 58]
 	mov	w0, -1
-	strb	w26, [x1,58]
 	strb	w0, [x1]
-	mov	x0, x27
-	strb	w24, [x1,59]
+	mov	x0, x25
 	bl	buf_add_tail
-	b	.L2550
-.L2554:
-	mov	w0, w22
-	ldr	x27, [sp,80]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 96
-	ret
+	b	.L2591
+.L2593:
+	bl	queue_wait_first_req_completed
+	bl	queue_remove_completed_req
+	b	.L2592
 	.size	sblk_3d_mlc_prog_pages, .-sblk_3d_mlc_prog_pages
 	.align	2
 	.global	flash_prog_page_en
 	.type	flash_prog_page_en, %function
 flash_prog_page_en:
-	stp	x29, x30, [sp, -128]!
+	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	uxtb	w21, w0
-	adrp	x0, .LANCHOR0
-	stp	x19, x20, [sp,16]
+	stp	x21, x22, [sp, 32]
+	and	w21, w0, 255
+	and	w0, w5, 255
+	stp	x19, x20, [sp, 16]
+	str	w0, [x29, 108]
+	adrp	x19, .LANCHOR0
+	add	x0, x19, :lo12:.LANCHOR0
+	stp	x23, x24, [sp, 48]
+	stp	x27, x28, [sp, 80]
 	mov	w20, w1
-	add	x1, x0, :lo12:.LANCHOR0
-	stp	x23, x24, [sp,48]
-	stp	x27, x28, [sp,80]
-	stp	x25, x26, [sp,64]
+	stp	x25, x26, [sp, 64]
 	mov	x23, x2
 	mov	x22, x3
-	ldrb	w1, [x1,1153]
 	mov	w27, w4
-	uxtb	w28, w5
-	ubfx	x25, x20, 24, 2
-	cmp	w1, w21
-	mov	x24, x0
-	bhi	.L2557
+	ldrb	w0, [x0, 1153]
+	ubfx	x24, x20, 24, 2
+	cmp	w0, w21
+	bhi	.L2597
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 552
 	mov	w2, 642
-	add	x1, x1, 536
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L2557:
-	add	x1, x24, :lo12:.LANCHOR0
-	mov	w0, -1
-	ldrb	w2, [x1,1153]
-	cmp	w2, w21
-	bls	.L2558
-	add	x0, x1, w21, sxtw
-	mov	w19, w20
-	ldrb	w26, [x0,1248]
-	cbnz	w25, .L2559
-	adrp	x0, .LANCHOR0
-	ldrb	w0, [x0,#:lo12:.LANCHOR0]
-	cbz	w0, .L2560
-	ldrb	w0, [x1,1]
-	cbz	w0, .L2559
-.L2560:
-	add	x0, x24, :lo12:.LANCHOR0
-	ldrh	w19, [x0,2]
-	ldrb	w2, [x0,1]
-	udiv	w1, w20, w19
-	mul	w19, w1, w19
+.L2597:
+	add	x0, x19, :lo12:.LANCHOR0
+	ldrb	w1, [x0, 1153]
+	cmp	w1, w21
+	bls	.L2608
+	add	x1, x0, w21, sxtw
+	ldrb	w26, [x1, 1196]
+	cbnz	w24, .L2610
+	ldrb	w1, [x19, #:lo12:.LANCHOR0]
+	cbz	w1, .L2600
+	ldrb	w0, [x0, 1]
+	cbz	w0, .L2610
+.L2600:
+	add	x0, x19, :lo12:.LANCHOR0
+	ldrh	w1, [x0, 2]
+	ldrb	w2, [x0, 1]
+	udiv	w19, w20, w1
+	mul	w19, w19, w1
 	sub	w1, w20, w19
-	cbz	w2, .L2561
+	cbz	w2, .L2601
 	add	w19, w19, w1, lsl 1
-	b	.L2559
-.L2561:
-	add	x0, x0, 4
-	ldrh	w0, [x0,w1,uxtw 1]
-	add	w19, w0, w19
-.L2559:
-	adrp	x25, .LC180
-	adrp	x24, .LC181
-	adrp	x0, .LC182
-	add	x25, x25, :lo12:.LC180
-	add	x0, x0, :lo12:.LC182
-	add	x24, x24, :lo12:.LC181
-	str	x0, [x29,120]
-.L2565:
+.L2599:
+	adrp	x24, .LC180
+	adrp	x28, .LANCHOR5
+	add	x24, x24, :lo12:.LC180
+	add	x25, x28, :lo12:.LANCHOR5
+.L2605:
 	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 4, .L2562
-	mov	x0, x25
-	mov	w1, w26
-	mov	w2, w20
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 4, .L2602
 	mov	w3, w19
+	mov	w2, w20
+	mov	w1, w26
+	mov	x0, x24
 	bl	printk
-.L2562:
-	mov	w0, w26
-	mov	w1, w19
-	mov	x2, x23
-	mov	x3, x22
+.L2602:
 	mov	w4, w27
+	mov	x3, x22
+	mov	x2, x23
+	mov	w1, w19
+	mov	w0, w26
 	bl	flash_prog_page
 	mov	w5, w0
-	cbz	w28, .L2563
-	adrp	x6, .LANCHOR5
+	ldr	w0, [x29, 108]
+	cbz	w0, .L2603
+	add	x6, x28, :lo12:.LANCHOR5
 	mov	w4, w27
-	add	x7, x6, :lo12:.LANCHOR5
-	mov	w0, w21
 	mov	w1, w20
-	str	x6, [x29,104]
-	str	x5, [x29,96]
-	ldr	x2, [x7,336]
-	ldr	x3, [x7,344]
-	str	x7, [x29,112]
+	mov	w0, w21
+	str	x6, [x29, 96]
+	ldp	x3, x2, [x6, 344]
+	str	w5, [x29, 104]
 	bl	flash_read_page_en
 	cmp	w0, 512
-	cset	w4, eq
-	ldr	x6, [x29,104]
-	cbnz	w4, .L2564
-	cmn	w0, #1
-	beq	.L2564
-	ldr	x7, [x29,112]
+	mov	w4, w0
+	ccmn	w0, #1, 4, ne
+	beq	.L2604
+	ldr	x6, [x29, 96]
 	ldr	w1, [x23]
-	ldr	x5, [x29,96]
-	ldr	x0, [x7,336]
+	ldr	w5, [x29, 104]
+	ldr	x0, [x6, 352]
 	ldr	w0, [x0]
 	cmp	w1, w0
-	bne	.L2564
-	ldr	x0, [x7,344]
+	bne	.L2604
+	ldr	x0, [x6, 344]
 	ldr	w1, [x22]
 	ldr	w0, [x0]
 	cmp	w1, w0
-	beq	.L2563
-.L2564:
-	mov	w2, 4
-	mov	x0, x24
-	mov	w3, w2
+	beq	.L2603
+.L2604:
+	str	w4, [x29, 96]
+	mov	w3, 4
 	mov	x1, x23
-	str	x4, [x29,104]
-	str	x6, [x29,112]
+	mov	w2, w3
+	adrp	x0, .LC181
+	add	x0, x0, :lo12:.LC181
 	bl	rknand_print_hex
-	mov	w2, 4
-	ldr	x0, [x29,120]
-	mov	w3, w2
+	mov	w3, 4
 	mov	x1, x22
+	mov	w2, w3
+	adrp	x0, .LC182
+	add	x0, x0, :lo12:.LC182
 	bl	rknand_print_hex
-	ldr	x6, [x29,112]
-	mov	w2, 4
+	ldr	x1, [x25, 344]
+	mov	w3, 4
 	adrp	x0, .LC183
-	mov	w3, w2
-	add	x6, x6, :lo12:.LANCHOR5
+	mov	w2, w3
 	add	x0, x0, :lo12:.LC183
-	str	x6, [x29,112]
-	ldr	x1, [x6,344]
 	bl	rknand_print_hex
-	ldr	x6, [x29,112]
-	mov	w2, 4
+	ldr	x1, [x25, 352]
+	mov	w3, 4
 	adrp	x0, .LC184
-	mov	w3, w2
+	mov	w2, w3
 	add	x0, x0, :lo12:.LC184
-	ldr	x1, [x6,336]
 	bl	rknand_print_hex
-	ldr	x4, [x29,104]
-	cbnz	w4, .L2565
-.L2567:
-	adrp	x0, .LC185
+	ldr	w4, [x29, 96]
+	cmp	w4, 512
+	beq	.L2605
+.L2607:
 	mov	w1, w20
+	adrp	x0, .LC185
 	add	x0, x0, :lo12:.LC185
 	bl	printk
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 552
 	mov	w2, 685
-	add	x1, x1, 536
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
+.L2608:
 	mov	w0, -1
-	b	.L2558
-.L2563:
-	cmn	w5, #1
+	b	.L2596
+.L2601:
+	add	x0, x0, 4
+	ldrh	w0, [x0, w1, uxtw 1]
+	add	w19, w0, w19
+	b	.L2599
+.L2610:
+	mov	w19, w20
+	b	.L2599
+.L2603:
 	mov	w0, w5
-	beq	.L2567
-.L2558:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
+	cmn	w5, #1
+	beq	.L2607
+.L2596:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 112
 	ret
 	.size	flash_prog_page_en, .-flash_prog_page_en
 	.align	2
@@ -16418,38 +16323,42 @@ flash_prog_page_en:
 ftl_prog_page:
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	uxtb	w19, w0
+	stp	x19, x20, [sp, 16]
+	and	w19, w0, 255
+	stp	x21, x22, [sp, 32]
 	mov	w20, w1
-	str	x2, [x29,40]
-	str	x3, [x29,48]
-	str	x4, [x29,56]
+	mov	x21, x2
+	mov	x22, x3
+	str	x23, [sp, 48]
+	mov	w23, w4
 	bl	sblk_wait_write_queue_completed
-	ldr	x2, [x29,40]
 	mov	w0, w19
-	ldr	x3, [x29,48]
-	mov	w1, w20
-	ldr	x4, [x29,56]
 	mov	w5, 1
+	mov	w4, w23
+	mov	x3, x22
+	mov	x2, x21
+	mov	w1, w20
 	bl	flash_prog_page_en
-	cmn	w0, #1
 	mov	w19, w0
-	bne	.L2586
-	adrp	x2, .LANCHOR4
+	cmn	w0, #1
+	bne	.L2626
+	adrp	x1, .LANCHOR4
+	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 576
+	mov	w2, 2678
 	adrp	x0, .LC0
-	add	x1, x2, :lo12:.LANCHOR4
 	add	x0, x0, :lo12:.LC0
-	add	x1, x1, 560
-	mov	w2, 2678
 	bl	printk
 	bl	dump_stack
 	adrp	x0, .LC185
 	mov	w1, w20
 	add	x0, x0, :lo12:.LC185
 	bl	printk
-.L2586:
+.L2626:
 	mov	w0, w19
-	ldp	x19, x20, [sp,16]
+	ldr	x23, [sp, 48]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
 	ldp	x29, x30, [sp], 64
 	ret
 	.size	ftl_prog_page, .-ftl_prog_page
@@ -16457,226 +16366,222 @@ ftl_prog_page:
 	.global	ftl_info_flush
 	.type	ftl_info_flush, %function
 ftl_info_flush:
-	stp	x29, x30, [sp, -128]!
+	stp	x29, x30, [sp, -112]!
 	mov	w1, 0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR0
-	add	x19, x20, :lo12:.LANCHOR0
-	str	w0, [x29,124]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	adrp	x21, .LANCHOR5
-	ldrb	w2, [x19,3360]
-	add	x0, x21, :lo12:.LANCHOR5
-	add	x0, x0, 384
-	lsl	w2, w2, 1
-	bl	ftl_memset
-	ldr	x0, [x19,3392]
-	ldrh	w1, [x0,74]
-	cmp	w1, 1
-	bls	.L2588
-	strh	wzr, [x0,150]
-.L2588:
-	adrp	x23, .LANCHOR4
-	adrp	x24, .LC186
-	add	x23, x23, :lo12:.LANCHOR4
-	mov	w25, 0
-	add	x26, x21, :lo12:.LANCHOR5
-	add	x24, x24, :lo12:.LC186
-	add	x23, x23, 576
-.L2599:
-	add	x2, x20, :lo12:.LANCHOR0
-	adrp	x22, .LANCHOR3
-	add	x0, x22, :lo12:.LANCHOR3
-	add	x3, x26, 384
-	str	x2, [x29,112]
-	ldr	x1, [x2,3392]
-	ldrh	w28, [x0,1418]
-	str	x3, [x29,104]
-	ldr	w0, [x1,4]
-	ldrb	w19, [x26,640]
+	stp	x21, x22, [sp, 32]
+	adrp	x21, .LANCHOR3
+	stp	x25, x26, [sp, 64]
+	mov	w26, w0
+	add	x0, x21, :lo12:.LANCHOR3
+	stp	x23, x24, [sp, 48]
+	stp	x19, x20, [sp, 16]
+	adrp	x22, .LANCHOR5
+	stp	x27, x28, [sp, 80]
+	adrp	x23, .LANCHOR0
+	ldrb	w2, [x0, 1946]
+	add	x0, x22, :lo12:.LANCHOR5
+	ldr	x0, [x0, 376]
+	lsl	w2, w2, 1
+	bl	ftl_memset
+	add	x0, x23, :lo12:.LANCHOR0
+	ldr	x0, [x0, 3384]
+	ldrh	w1, [x0, 74]
+	cmp	w1, 1
+	bls	.L2630
+	strh	wzr, [x0, 150]
+.L2630:
+	adrp	x24, .LANCHOR4
+	add	x24, x24, :lo12:.LANCHOR4
+	add	x19, x22, :lo12:.LANCHOR5
+	add	x24, x24, 592
+	mov	w25, 0
+.L2643:
+	add	x2, x23, :lo12:.LANCHOR0
+	add	x1, x21, :lo12:.LANCHOR3
+	ldrb	w20, [x19, 384]
+	ldrh	w27, [x19, 386]
+	ldr	x3, [x2, 3384]
+	ldrh	w28, [x1, 1410]
+	ldr	w0, [x3, 4]
 	add	w0, w0, 1
-	str	w0, [x1,4]
-	ldr	w0, [x29,124]
-	str	w0, [x26,384]
-	ldr	x0, [x2,3392]
-	ldrb	w1, [x2,3360]
-	ldrh	w27, [x26,642]
-	ldr	w0, [x0,4]
+	str	w0, [x3, 4]
+	ldr	x0, [x19, 376]
+	str	w26, [x0]
+	ldr	x3, [x2, 3384]
+	ldr	x0, [x19, 376]
+	ldrb	w1, [x1, 1946]
+	ldr	w3, [x3, 4]
+	str	w3, [x0, 4]
 	lsl	w1, w1, 9
-	str	w0, [x26,388]
-	ldr	x0, [x26,648]
+	ldr	x3, [x19, 376]
+	ldr	x0, [x19, 392]
+	stp	x2, x3, [x29, 96]
 	bl	js_hash
-	ldr	x3, [x29,104]
-	ldr	x2, [x29,112]
-	str	w0, [x3,8]
+	ldp	x2, x3, [x29, 96]
+	str	w0, [x3, 8]
 	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L2589
-	ldr	x3, [x2,3392]
-	mov	x0, x24
-	ldrb	w1, [x26,640]
-	ldrh	w2, [x26,642]
-	ldr	w3, [x3,4]
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L2631
+	ldr	x0, [x2, 3384]
+	ldrb	w1, [x19, 384]
+	ldrh	w2, [x19, 386]
+	ldr	w3, [x0, 4]
+	adrp	x0, .LC186
+	add	x0, x0, :lo12:.LC186
 	bl	printk
-.L2589:
-	add	x1, x22, :lo12:.LANCHOR3
-	ldrh	w0, [x26,642]
-	ldrh	w1, [x1,1384]
+.L2631:
+	add	x1, x21, :lo12:.LANCHOR3
+	ldrh	w0, [x19, 386]
+	ldrh	w1, [x1, 1376]
 	cmp	w1, w0
-	bhi	.L2590
-	adrp	x19, .LC0
-	add	x19, x19, :lo12:.LC0
-.L2595:
-	ldrb	w1, [x26,641]
-	add	w1, w1, 1
-	uxtb	w1, w1
-	strb	w1, [x26,641]
-	cmp	w1, 7
-	bls	.L2591
-	mov	x1, 0
-.L2594:
-	add	x0, x20, :lo12:.LANCHOR0
-	uxth	w25, w1
-	ldr	x2, [x0,1128]
-	add	w0, w1, 8
-	add	x0, x2, w0, sxtw
-	ldrb	w2, [x0,32]
-	add	w0, w2, 127
-	uxtb	w0, w0
-	cmp	w0, 125
-	bhi	.L2592
-	mov	x1, x23
+	bhi	.L2632
+	add	x20, x23, :lo12:.LANCHOR0
+.L2639:
+	ldrb	w0, [x19, 385]
+	add	w0, w0, 1
+	and	w0, w0, 255
+	strb	w0, [x19, 385]
+	cmp	w0, 7
+	bls	.L2633
+	mov	x0, 0
+.L2638:
+	ldr	x2, [x20, 1048]
+	add	w1, w0, 8
+	and	w25, w0, 65535
+	add	x1, x2, w1, sxtw
+	ldrb	w2, [x1, 32]
+	add	w1, w2, 127
+	and	w1, w1, 255
+	cmp	w1, 125
+	bhi	.L2634
+	mov	x1, x24
 	mov	w2, 846
-	mov	x0, x19
+	adrp	x0, .LC0
+	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-	b	.L2593
-.L2592:
-	cmp	w2, 255
-	bne	.L2593
-	add	x1, x1, 1
-	cmp	x1, 8
-	bne	.L2594
-	mov	w25, w1
-.L2593:
-	strb	w25, [x26,641]
+.L2637:
+	strb	w25, [x19, 385]
 	mov	w25, 1
-.L2591:
-	add	x28, x20, :lo12:.LANCHOR0
-	ldrb	w1, [x26,641]
-	ldr	x0, [x28,1128]
-	add	x1, x0, x1
-	ldrb	w1, [x1,40]
-	strb	w1, [x26,640]
-	cmp	w1, 255
-	beq	.L2595
-	add	x0, x22, :lo12:.LANCHOR3
-	ldrh	w19, [x0,1418]
+.L2633:
+	ldrb	w1, [x19, 385]
+	ldr	x0, [x20, 1048]
+	add	x0, x0, x1
+	ldrb	w0, [x0, 40]
+	strb	w0, [x19, 384]
+	cmp	w0, 255
+	beq	.L2639
+	add	x27, x21, :lo12:.LANCHOR3
+	ldrh	w20, [x27, 1410]
+	mul	w20, w20, w0
 	mov	w0, 0
-	mul	w19, w1, w19
-	mov	w1, w19
+	mov	w1, w20
 	bl	flash_erase_block
-	ldr	x2, [x26,648]
-	mov	w1, w19
-	ldrb	w4, [x28,3360]
+	ldrb	w4, [x27, 1946]
+	mov	w1, w20
+	ldr	x3, [x19, 376]
 	mov	w0, 0
-	add	x3, x26, 384
-	add	w19, w19, 1
+	ldr	x2, [x19, 392]
+	add	w20, w20, 1
 	bl	ftl_prog_page
 	mov	w0, 1
-	strh	w0, [x26,642]
-	b	.L2596
-.L2590:
-	madd	w19, w19, w28, w27
-	cbnz	w0, .L2596
-	mov	w1, w19
-	bl	flash_erase_block
-.L2596:
-	add	x4, x20, :lo12:.LANCHOR0
-	ldr	x2, [x26,648]
-	mov	w1, w19
+	strh	w0, [x19, 386]
+.L2640:
+	add	x0, x21, :lo12:.LANCHOR3
+	ldr	x3, [x19, 376]
+	ldr	x2, [x19, 392]
+	mov	w1, w20
+	ldrb	w4, [x0, 1946]
 	mov	w0, 0
-	add	x3, x26, 384
-	ldrb	w4, [x4,3360]
 	bl	ftl_prog_page
 	cmn	w0, #1
-	ldrh	w1, [x26,642]
+	ldrh	w1, [x19, 386]
 	add	w1, w1, 1
-	strh	w1, [x26,642]
-	beq	.L2597
-	ldrb	w0, [x26,656]
-	cbz	w0, .L2598
-.L2597:
-	strb	wzr, [x26,656]
-	b	.L2599
-.L2598:
-	cbnz	w25, .L2600
-.L2608:
-	add	x21, x21, :lo12:.LANCHOR5
-	ldrb	w0, [x21,640]
+	strh	w1, [x19, 386]
+	beq	.L2641
+	ldrb	w0, [x19, 400]
+	cbz	w0, .L2642
+.L2641:
+	strb	wzr, [x19, 400]
+	b	.L2643
+.L2634:
+	cmp	w2, 255
+	bne	.L2637
+	add	x0, x0, 1
+	cmp	x0, 8
+	bne	.L2638
+	mov	w25, w0
+	b	.L2637
+.L2632:
+	madd	w20, w20, w28, w27
+	cbnz	w0, .L2640
+	mov	w1, w20
+	bl	flash_erase_block
+	b	.L2640
+.L2642:
+	cbnz	w25, .L2644
+.L2652:
+	add	x22, x22, :lo12:.LANCHOR5
+	ldrb	w0, [x22, 384]
 	cmp	w0, 255
-	bne	.L2602
+	bne	.L2646
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 592
 	mov	w2, 890
-	add	x1, x1, 576
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-	b	.L2602
-.L2600:
-	ldrb	w19, [x26,641]
-	adrp	x23, .LANCHOR4
+.L2646:
+	ldp	x19, x20, [sp, 16]
+	mov	w0, 0
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L2644:
+	ldrb	w19, [x19, 385]
+	adrp	x20, .LANCHOR4
+	add	x20, x20, :lo12:.LANCHOR4
 	adrp	x24, .LC0
-	add	x23, x23, :lo12:.LANCHOR4
 	add	w19, w19, 1
+	add	x20, x20, 592
 	add	x24, x24, :lo12:.LC0
-	add	x23, x23, 576
-.L2603:
+.L2647:
 	cmp	w19, 7
-	bhi	.L2608
-	add	x0, x20, :lo12:.LANCHOR0
-	ldr	x1, [x0,1128]
+	bhi	.L2652
+	add	x0, x23, :lo12:.LANCHOR0
+	ldr	x1, [x0, 1048]
 	add	w0, w19, 8
 	add	x0, x1, w0, sxtw
-	ldrb	w25, [x0,32]
+	ldrb	w25, [x0, 32]
 	add	w0, w25, 127
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 125
-	bhi	.L2604
-	mov	x1, x23
+	bhi	.L2648
+	mov	x1, x20
 	mov	w2, 881
 	mov	x0, x24
 	bl	printk
 	bl	dump_stack
-	b	.L2605
-.L2604:
-	cmp	w25, 255
-	beq	.L2606
-.L2605:
-	add	x0, x22, :lo12:.LANCHOR3
-	ldrh	w1, [x0,1418]
+.L2649:
+	add	x0, x21, :lo12:.LANCHOR3
+	ldrh	w1, [x0, 1410]
 	mov	w0, 0
-	mul	w1, w25, w1
+	mul	w1, w1, w25
 	bl	flash_erase_block
-.L2606:
+	b	.L2650
+.L2648:
+	cmp	w25, 255
+	bne	.L2649
+.L2650:
 	add	w19, w19, 1
-	uxth	w19, w19
-	b	.L2603
-.L2602:
-	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 128
-	ret
+	and	w19, w19, 65535
+	b	.L2647
 	.size	ftl_info_flush, .-ftl_info_flush
 	.align	2
 	.global	ftl_info_blk_init
@@ -16686,544 +16591,533 @@ ftl_info_blk_init:
 	mov	w0, 1
 	mov	w2, 16384
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR0
-	stp	x21, x22, [sp,32]
-	add	x19, x20, :lo12:.LANCHOR0
-	adrp	x22, .LANCHOR5
-	add	x21, x22, :lo12:.LANCHOR5
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	stp	x23, x24, [sp,48]
-	strb	w0, [x21,656]
-	adrp	x25, .LC187
-	ldrh	w1, [x19,1088]
-	adrp	x27, .LANCHOR3
-	strb	w0, [x21,658]
-	add	x26, x21, 384
-	ldr	x0, [x21,648]
-	adrp	x28, .LANCHOR2
-	str	x0, [x19,1096]
-	add	x25, x25, :lo12:.LC187
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR0
+	stp	x21, x22, [sp, 32]
+	add	x22, x19, :lo12:.LANCHOR0
+	adrp	x21, .LANCHOR5
+	add	x20, x21, :lo12:.LANCHOR5
+	stp	x25, x26, [sp, 64]
+	adrp	x26, .LC187
+	stp	x27, x28, [sp, 80]
+	add	x26, x26, :lo12:.LC187
+	stp	x23, x24, [sp, 48]
+	mov	w27, 21574
+	strb	w0, [x20, 400]
+	movk	w27, 0x494c, lsl 16
+	strb	w0, [x20, 402]
+	ldrh	w1, [x22, 1096]
+	ldr	x0, [x20, 392]
+	strb	wzr, [x20, 401]
+	str	x0, [x22, 1104]
 	add	x1, x0, x1, lsl 2
-	str	x1, [x19,3392]
+	str	x1, [x22, 3384]
 	mov	w1, 0
-	strb	wzr, [x21,657]
 	bl	ftl_memset
-	ldr	x0, [x21,664]
-	mov	w1, 0
+	ldr	x0, [x20, 408]
 	mov	w2, 16384
+	mov	w1, 0
 	bl	ftl_memset
-	strb	wzr, [x21,641]
-	ldr	x0, [x19,1128]
-	mov	w19, 7
-	strh	wzr, [x21,642]
-	ldrb	w0, [x0,40]
-	strb	w0, [x21,640]
-.L2626:
-	add	x6, x20, :lo12:.LANCHOR0
-	add	w0, w19, 8
-	sxth	w24, w19
-	ldr	x1, [x6,1128]
+	strb	wzr, [x20, 385]
+	ldr	x0, [x22, 1048]
+	adrp	x22, .LANCHOR3
+	add	x22, x22, :lo12:.LANCHOR3
+	strh	wzr, [x20, 386]
+	ldrb	w0, [x0, 40]
+	strb	w0, [x20, 384]
+	mov	w20, 7
+.L2668:
+	add	x0, x19, :lo12:.LANCHOR0
+	sxth	w24, w20
+	ldr	x1, [x0, 1048]
+	add	w0, w20, 8
 	add	x0, x1, w0, sxtw
-	ldrb	w0, [x0,32]
+	ldrb	w0, [x0, 32]
 	cmp	w0, 255
-	beq	.L2622
-	add	x1, x27, :lo12:.LANCHOR3
-	ldrb	w4, [x6,3360]
-	ldr	x2, [x21,648]
-	mov	x3, x26
-	str	x6, [x29,104]
-	ldrh	w23, [x1,1418]
-	mul	w23, w0, w23
-	mov	w0, 0
-	mov	w1, w23
-	bl	ftl_read_page
-	cmn	w0, #1
-	mov	w5, w0
-	ldr	x6, [x29,104]
-	bne	.L2623
-	ldr	x2, [x21,648]
-	mov	w0, 0
-	ldrb	w4, [x6,3360]
-	add	w1, w23, 1
-	mov	x3, x26
-	bl	ftl_read_page
-	mov	w5, w0
-.L2623:
-	ldr	w0, [x28,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L2624
-	add	x0, x20, :lo12:.LANCHOR0
-	mov	w2, w5
-	mov	w1, w19
-	mov	w3, 749
-	str	x5, [x29,104]
-	ldr	x4, [x0,3392]
-	mov	x0, x25
-	ldr	w4, [x4]
-	bl	printk
-	ldr	x5, [x29,104]
-.L2624:
-	cmn	w5, #1
-	beq	.L2622
-	add	x0, x20, :lo12:.LANCHOR0
-	ldr	x0, [x0,3392]
-	ldr	w1, [x0]
-	mov	w0, 21574
-	movk	w0, 0x494c, lsl 16
-	cmp	w1, w0
-	beq	.L2636
-.L2622:
-	sub	w19, w19, #1
-	cmn	w19, #1
-	bne	.L2626
+	bne	.L2667
+.L2672:
+	sub	w20, w20, #1
+	cmn	w20, #1
+	bne	.L2668
 	mov	w24, 0
-	b	.L2625
-.L2636:
-	mov	w19, w24
-.L2625:
+.L2669:
 	adrp	x23, .LANCHOR2
-	ldr	w0, [x23,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L2627
-	add	x0, x20, :lo12:.LANCHOR0
-	mov	w1, w19
+	ldr	w0, [x23, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L2673
+	add	x0, x19, :lo12:.LANCHOR0
 	mov	w2, 4800
-	ldr	x3, [x0,3392]
+	mov	w1, w20
+	ldr	x0, [x0, 3384]
+	ldr	w3, [x0]
 	adrp	x0, .LC188
 	add	x0, x0, :lo12:.LC188
-	ldr	w3, [x3]
 	bl	printk
-.L2627:
-	cmn	w19, #1
-	bne	.L2628
-	add	x22, x22, :lo12:.LANCHOR5
+.L2673:
+	cmn	w20, #1
+	bne	.L2674
+	add	x21, x21, :lo12:.LANCHOR5
+	add	x19, x19, :lo12:.LANCHOR0
 	mov	w1, 0
-	add	x20, x20, :lo12:.LANCHOR0
 	mov	w2, 16384
-	ldr	x0, [x22,648]
+	ldr	x0, [x21, 392]
 	bl	ftl_memset
-	ldr	x1, [x20,3392]
-	mov	w0, 21574
-	movk	w0, 0x494c, lsl 16
-	str	w0, [x1]
-	mov	w0, 36
-	movk	w0, 0x6, lsl 16
-	ldr	x1, [x20,3392]
-	str	w0, [x1,12]
-	b	.L2653
-.L2628:
-	add	x0, x20, :lo12:.LANCHOR0
-	add	x21, x22, :lo12:.LANCHOR5
-	add	x19, x21, 384
+	ldr	x0, [x19, 3384]
+	mov	w1, 21574
+	movk	w1, 0x494c, lsl 16
+	str	w1, [x0]
+	mov	w1, 36
+	movk	w1, 0x6, lsl 16
+	ldr	x0, [x19, 3384]
+	str	w1, [x0, 12]
+	mov	w0, w20
+.L2666:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L2667:
+	add	x28, x21, :lo12:.LANCHOR5
+	ldrh	w25, [x22, 1410]
+	ldrb	w4, [x22, 1946]
+	ldr	x3, [x28, 376]
+	ldr	x2, [x28, 392]
+	mul	w25, w25, w0
+	mov	w0, 0
+	mov	w1, w25
+	bl	ftl_read_page
+	mov	w23, w0
+	cmn	w0, #1
+	bne	.L2670
+	ldrb	w4, [x22, 1946]
+	add	w1, w25, 1
+	ldr	x3, [x28, 376]
+	mov	w0, 0
+	ldr	x2, [x28, 392]
+	bl	ftl_read_page
+	mov	w23, w0
+.L2670:
+	adrp	x0, .LANCHOR2
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L2671
+	add	x0, x19, :lo12:.LANCHOR0
+	mov	w3, 749
+	mov	w2, w23
+	mov	w1, w20
+	ldr	x0, [x0, 3384]
+	ldr	w4, [x0]
+	mov	x0, x26
+	bl	printk
+.L2671:
+	cmn	w23, #1
+	beq	.L2672
+	add	x0, x19, :lo12:.LANCHOR0
+	ldr	x0, [x0, 3384]
+	ldr	w0, [x0]
+	cmp	w0, w27
+	bne	.L2672
+	mov	w20, w24
+	b	.L2669
+.L2674:
+	add	x0, x19, :lo12:.LANCHOR0
+	add	x20, x21, :lo12:.LANCHOR5
+	adrp	x22, .LANCHOR3
+	add	x22, x22, :lo12:.LANCHOR3
 	mov	w4, 4
-	mov	x3, x19
-	adrp	x27, .LC189
-	ldr	x1, [x0,1128]
+	mov	w28, 21574
+	ldr	x1, [x0, 1048]
 	add	w0, w24, 8
-	ldr	x2, [x21,648]
+	ldr	x3, [x20, 376]
+	adrp	x27, .LC189
+	ldr	x2, [x20, 392]
+	add	x27, x27, :lo12:.LC189
 	add	x0, x1, w0, sxtw
-	ldrb	w1, [x0,32]
+	strb	w24, [x20, 385]
+	movk	w28, 0x494c, lsl 16
+	ldrb	w1, [x0, 32]
 	mov	w0, 0
-	strb	w24, [x21,641]
-	add	x27, x27, :lo12:.LC189
-	strb	w1, [x21,640]
+	strb	w1, [x20, 384]
 	bl	flash_get_last_written_page
 	sxth	w25, w0
 	add	w0, w0, 1
-	ldrb	w26, [x21,640]
-	uxth	w24, w0
-	adrp	x0, .LANCHOR3+1418
-	ldrh	w0, [x0,#:lo12:.LANCHOR3+1418]
-	mul	w26, w26, w0
-	b	.L2630
-.L2653:
-	mov	w0, w19
-	b	.L2629
-.L2635:
-	add	x28, x20, :lo12:.LANCHOR0
-	ldr	x2, [x21,648]
+	ldrb	w26, [x20, 384]
+	and	w24, w0, 65535
+	ldrh	w0, [x22, 1410]
+	madd	w26, w26, w0, w25
+.L2676:
+	tbnz	w25, #31, .L2680
+	ldrb	w4, [x22, 1946]
+	mov	w1, w26
+	ldr	x3, [x20, 376]
 	mov	w0, 0
-	add	w1, w25, w26
-	mov	x3, x19
-	ldrb	w4, [x28,3360]
+	ldr	x2, [x20, 392]
 	bl	ftl_read_page
 	cmn	w0, #1
-	bne	.L2654
-.L2631:
-	sub	w25, w25, #1
-	sxth	w25, w25
-.L2630:
-	tbz	w25, #31, .L2635
-	b	.L2634
-.L2654:
-	ldr	x0, [x28,3392]
-	ldr	w1, [x0]
-	mov	w0, 21574
-	movk	w0, 0x494c, lsl 16
-	cmp	w1, w0
-	bne	.L2631
-	ldr	w2, [x19,8]
-	cbnz	w2, .L2632
-.L2634:
-	add	x22, x22, :lo12:.LANCHOR5
-	add	x20, x20, :lo12:.LANCHOR0
-	strh	w24, [x22,642]
+	beq	.L2677
+	add	x0, x19, :lo12:.LANCHOR0
+	ldr	x0, [x0, 3384]
+	ldr	w0, [x0]
+	cmp	w0, w28
+	bne	.L2677
+	ldr	x0, [x20, 376]
+	ldr	w2, [x0, 8]
+	cbnz	w2, .L2678
+.L2680:
+	add	x21, x21, :lo12:.LANCHOR5
+	add	x19, x19, :lo12:.LANCHOR0
+	strh	w24, [x21, 386]
 	bl	ftl_tmp_into_update
-	ldr	x1, [x20,3392]
-	ldr	w0, [x1,64]
+	ldr	x1, [x19, 3384]
+	ldr	w0, [x1, 64]
 	add	w0, w0, 1
-	str	w0, [x1,64]
+	str	w0, [x1, 64]
 	mov	w0, 0
 	bl	ftl_info_flush
 	mov	w0, 0
 	bl	ftl_info_flush
-	ldr	w0, [x23,#:lo12:.LANCHOR2]
-	and	w19, w0, 16384
-	tbz	x0, 14, .L2653
-	ldr	x1, [x20,3392]
-	adrp	x0, .LC190
-	add	x0, x0, :lo12:.LC190
-	ldr	w1, [x1,156]
-	bl	printk
+	ldr	w0, [x23, #:lo12:.LANCHOR2]
+	tbnz	x0, 14, .L2679
+.L2696:
 	mov	w0, 0
-	b	.L2629
-.L2632:
-	ldrb	w1, [x28,3360]
-	ldr	x0, [x21,648]
+	b	.L2666
+.L2678:
+	ldr	x0, [x20, 392]
+	ldrb	w1, [x22, 1946]
+	str	w2, [x29, 108]
 	lsl	w1, w1, 9
-	str	x2, [x29,104]
 	bl	js_hash
-	ldr	x2, [x29,104]
+	ldr	w2, [x29, 108]
 	cmp	w2, w0
-	beq	.L2634
-	ldr	w1, [x19,8]
+	beq	.L2680
+	ldr	x0, [x20, 376]
+	ldr	w1, [x0, 8]
 	mov	x0, x27
 	bl	printk
-	b	.L2631
-.L2629:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 112
-	ret
+.L2677:
+	sub	w25, w25, #1
+	sub	w26, w26, #1
+	sxth	w25, w25
+	b	.L2676
+.L2679:
+	ldr	x0, [x19, 3384]
+	ldr	w1, [x0, 156]
+	adrp	x0, .LC190
+	add	x0, x0, :lo12:.LC190
+	bl	printk
+	b	.L2696
 	.size	ftl_info_blk_init, .-ftl_info_blk_init
 	.align	2
 	.global	ftl_ext_info_flush
 	.type	ftl_ext_info_flush, %function
 ftl_ext_info_flush:
-	stp	x29, x30, [sp, -80]!
+	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	str	x25, [sp,64]
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR0
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	str	x27, [sp, 80]
 	bl	timer_get_time
 	mov	w1, 100
-	adrp	x21, .LANCHOR0
 	udiv	w0, w0, w1
-	add	x1, x21, :lo12:.LANCHOR0
-	ldr	x1, [x1,1120]
-	ldr	w3, [x1,520]
+	add	x1, x19, :lo12:.LANCHOR0
+	ldr	x1, [x1, 1128]
+	ldr	w3, [x1, 520]
 	cmp	w0, w3
-	bls	.L2656
-	ldr	w2, [x1,12]
+	bls	.L2698
+	ldr	w2, [x1, 12]
 	sub	w2, w2, w3
 	add	w2, w2, w0
-	str	w2, [x1,12]
-	b	.L2669
-.L2656:
-	bcs	.L2657
-.L2669:
-	str	w0, [x1,520]
-.L2657:
-	adrp	x23, .LANCHOR4
-	adrp	x22, .LANCHOR5
-	add	x23, x23, :lo12:.LANCHOR4
-	add	x22, x22, :lo12:.LANCHOR5
+	str	w2, [x1, 12]
+.L2712:
+	str	w0, [x1, 520]
+	b	.L2699
+.L2698:
+	bcc	.L2712
+.L2699:
+	adrp	x22, .LANCHOR4
+	add	x22, x22, :lo12:.LANCHOR4
+	add	x19, x19, :lo12:.LANCHOR0
+	add	x22, x22, 608
 	mov	w0, 0
-	add	x23, x23, 592
-	add	x24, x22, 384
 	bl	ftl_total_vpn_update
-.L2661:
-	add	x0, x21, :lo12:.LANCHOR0
-	adrp	x3, .LANCHOR3
-	add	x2, x3, :lo12:.LANCHOR3
-	mov	x19, x3
-	ldr	x0, [x0,3392]
-	ldr	w1, [x0,56]
-	add	w1, w1, 1
-	str	w1, [x0,56]
-	ldrh	w1, [x0,140]
-	ldrh	w0, [x2,1384]
+.L2700:
+	adrp	x23, .LANCHOR3
+.L2703:
+	ldr	x1, [x19, 3384]
+	ldr	w0, [x1, 56]
+	add	w0, w0, 1
+	str	w0, [x1, 56]
+	add	x0, x23, :lo12:.LANCHOR3
+	ldrh	w1, [x1, 140]
+	ldrh	w0, [x0, 1376]
 	cmp	w1, w0
-	bcc	.L2659
+	bcc	.L2701
 	bl	ftl_ext_alloc_new_blk
-.L2659:
-	add	x0, x21, :lo12:.LANCHOR0
-	ldr	x0, [x0,3392]
-	ldrh	w1, [x0,130]
+.L2701:
+	ldr	x0, [x19, 3384]
+	ldrh	w1, [x0, 130]
 	mov	w0, 65535
 	cmp	w1, w0
-	bne	.L2660
-	adrp	x0, .LC0
-	mov	x1, x23
+	bne	.L2702
+	mov	x1, x22
 	mov	w2, 2211
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L2660:
-	add	x20, x21, :lo12:.LANCHOR0
-	add	x3, x19, :lo12:.LANCHOR3
+.L2702:
+	add	x25, x23, :lo12:.LANCHOR3
+	ldr	x1, [x19, 3384]
+	ldrb	w20, [x19, 1205]
 	mov	w0, 24
-	ldr	x4, [x20,3392]
-	ldrb	w1, [x20,1257]
-	ldrh	w19, [x3,1312]
-	ldrh	w2, [x4,130]
-	sub	w1, w0, w1
-	sub	w1, w1, w19
-	mov	w19, 1
-	asr	w25, w2, w1
-	lsl	w1, w19, w1
-	sub	w19, w1, #1
-	ldrh	w0, [x4,140]
-	and	w2, w19, w2
-	ldrh	w19, [x3,1418]
+	adrp	x24, .LANCHOR5
+	add	x21, x24, :lo12:.LANCHOR5
+	sub	w20, w0, w20
+	ldrh	w0, [x25, 1304]
+	ldrh	w2, [x1, 130]
+	sub	w0, w20, w0
+	mov	w20, 1
+	lsl	w20, w20, w0
+	sub	w20, w20, #1
+	asr	w26, w2, w0
+	and	w20, w20, w2
+	ldrh	w0, [x1, 140]
+	sxth	w20, w20
+	ldrh	w2, [x25, 1410]
 	mov	w1, 0
-	sxth	w2, w2
-	madd	w19, w2, w19, w0
-	ldrb	w2, [x20,3360]
-	mov	x0, x24
+	madd	w20, w20, w2, w0
+	ldr	x0, [x21, 376]
+	ldrb	w2, [x25, 1946]
 	lsl	w2, w2, 1
 	bl	ftl_memset
-	str	wzr, [x24]
-	ldr	x0, [x20,3392]
-	ldrb	w1, [x20,3360]
-	ldr	w0, [x0,56]
+	ldr	x0, [x21, 376]
+	str	wzr, [x0]
+	ldr	x1, [x19, 3384]
+	ldr	x0, [x21, 376]
+	ldr	w1, [x1, 56]
+	str	w1, [x0, 4]
+	ldrb	w1, [x25, 1946]
+	ldr	x0, [x21, 408]
+	ldr	x27, [x21, 376]
 	lsl	w1, w1, 9
-	str	w0, [x24,4]
-	ldr	x0, [x22,664]
 	bl	js_hash
-	str	w0, [x24,8]
-	ldr	x2, [x22,664]
-	mov	w1, w19
-	ldrb	w4, [x20,3360]
-	mov	w0, w25
-	mov	x3, x24
+	ldr	x2, [x21, 408]
+	mov	w1, w20
+	ldrb	w4, [x25, 1946]
+	ldr	x3, [x21, 376]
+	str	w0, [x27, 8]
+	mov	w0, w26
 	bl	ftl_prog_page
-	ldr	x1, [x20,3392]
-	ldrh	w2, [x1,140]
-	add	w2, w2, 1
-	uxth	w2, w2
-	strh	w2, [x1,140]
-	cmp	w2, 1
-	beq	.L2661
+	ldr	x2, [x19, 3384]
+	ldrh	w1, [x2, 140]
+	add	w1, w1, 1
+	and	w1, w1, 65535
+	strh	w1, [x2, 140]
+	cmp	w1, 1
+	beq	.L2703
 	cmn	w0, #1
-	beq	.L2662
-	ldrb	w0, [x22,658]
-	cbz	w0, .L2663
-.L2662:
-.L2658:
-	adrp	x0, .LANCHOR5
-	add	x0, x0, :lo12:.LANCHOR5
-	strb	wzr, [x0,658]
-	b	.L2661
-.L2663:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldr	x25, [sp,64]
-	ldp	x29, x30, [sp], 80
+	beq	.L2704
+	ldrb	w0, [x21, 402]
+	cbz	w0, .L2705
+.L2704:
+	add	x24, x24, :lo12:.LANCHOR5
+	strb	wzr, [x24, 402]
+	b	.L2700
+.L2705:
+	mov	w0, 0
+	ldr	x27, [sp, 80]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 96
 	ret
 	.size	ftl_ext_info_flush, .-ftl_ext_info_flush
 	.align	2
 	.global	ftl_ext_info_init
 	.type	ftl_ext_info_init, %function
 ftl_ext_info_init:
-	stp	x29, x30, [sp, -112]!
+	stp	x29, x30, [sp, -128]!
 	mov	w4, 4
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x21, x22, [sp, 32]
+	adrp	x21, .LANCHOR3
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR0
-	adrp	x20, .LANCHOR5
-	stp	x21, x22, [sp,32]
 	add	x22, x19, :lo12:.LANCHOR0
-	adrp	x21, .LANCHOR3
-	stp	x25, x26, [sp,64]
-	stp	x23, x24, [sp,48]
-	stp	x27, x28, [sp,80]
-	add	x1, x21, :lo12:.LANCHOR3
-	add	x3, x20, :lo12:.LANCHOR5
-	ldr	x0, [x22,3392]
-	add	x3, x3, 384
-	ldrb	w2, [x22,1257]
-	strh	wzr, [x1,1952]
-	ldrh	w23, [x0,130]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	add	x2, x21, :lo12:.LANCHOR3
+	stp	x27, x28, [sp, 80]
+	adrp	x25, .LANCHOR5
+	ldr	x0, [x22, 3384]
+	ldrb	w20, [x22, 1205]
+	strh	wzr, [x2, 1944]
+	ldrh	w1, [x0, 130]
 	mov	w0, 24
-	ldrh	w1, [x1,1312]
-	sub	w0, w0, w2
-	ldr	x2, [x3,280]
-	sub	w0, w0, w1
-	mov	w1, 1
-	asr	w26, w23, w0
-	lsl	w0, w1, w0
-	sub	w0, w0, #1
-	and	w23, w0, w23
-	uxtb	w28, w26
-	mov	w1, w23
-	mov	w0, w28
+	sub	w0, w0, w20
+	ldrh	w20, [x2, 1304]
+	sub	w0, w0, w20
+	mov	w20, 1
+	asr	w24, w1, w0
+	and	w27, w24, 255
+	lsl	w20, w20, w0
+	add	x0, x25, :lo12:.LANCHOR5
+	sub	w20, w20, #1
+	and	w20, w20, w1
+	ldr	x3, [x0, 376]
+	mov	w1, w20
+	ldr	x2, [x0, 408]
+	mov	w0, w27
 	bl	flash_get_last_written_page
-	sxth	w25, w0
+	sxth	w23, w0
 	adrp	x0, .LANCHOR2
-	str	x0, [x29,104]
-	mov	w24, w25
-	ldr	w1, [x0,#:lo12:.LANCHOR2]
-	tbz	x1, 12, .L2671
-	ldr	x5, [x22,3392]
+	stp	x0, x25, [x29, 112]
+	ldr	w1, [x0, #:lo12:.LANCHOR2]
+	tbz	x1, 12, .L2714
+	ldr	x0, [x22, 3384]
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC191
 	add	x1, x1, :lo12:.LANCHOR4
-	add	x0, x0, :lo12:.LC191
-	add	x1, x1, 616
-	ldrh	w5, [x5,130]
+	and	w4, w24, 65535
+	mov	w3, w23
 	mov	w2, 2256
-	mov	w3, w25
-	uxth	w4, w26
+	add	x1, x1, 632
+	ldrh	w5, [x0, 130]
+	adrp	x0, .LC191
+	add	x0, x0, :lo12:.LC191
 	bl	printk
-.L2671:
-	add	x20, x20, :lo12:.LANCHOR5
-	adrp	x27, .LC192
-	mov	w22, w25
-	add	x26, x20, 384
-	add	x27, x27, :lo12:.LC192
-.L2672:
-	tbnz	w22, #31, .L2677
-	add	x0, x21, :lo12:.LANCHOR3
-	add	x5, x19, :lo12:.LANCHOR0
-	ldr	x2, [x20,664]
-	mov	x3, x26
-	str	x5, [x29,96]
-	ldrh	w1, [x0,1418]
-	mov	w0, w28
-	ldrb	w4, [x5,3360]
-	madd	w1, w23, w1, w22
+.L2714:
+	adrp	x26, .LC192
+	and	w22, w23, 65535
+	add	x25, x21, :lo12:.LANCHOR3
+	add	x26, x26, :lo12:.LC192
+	mov	w24, 0
+.L2715:
+	sub	w0, w22, w24
+	tbnz	x0, 15, .L2720
+	ldr	x0, [x29, 120]
+	sub	w1, w23, w24
+	ldrb	w4, [x25, 1946]
+	add	x28, x0, :lo12:.LANCHOR5
+	ldrh	w0, [x25, 1410]
+	ldr	x3, [x28, 376]
+	madd	w1, w0, w20, w1
+	ldr	x2, [x28, 408]
+	mov	w0, w27
 	bl	flash_read_page_en
 	cmp	w0, 512
-	beq	.L2673
-	cmn	w0, #1
-	beq	.L2673
-	ldr	x5, [x29,96]
-	ldr	x0, [x5,1120]
-	ldr	w1, [x0]
-	mov	w0, 20038
-	movk	w0, 0x4549, lsl 16
-	cmp	w1, w0
-	bne	.L2673
-	ldr	w2, [x26,8]
-	cbnz	w2, .L2674
-.L2677:
+	ccmn	w0, #1, 4, ne
+	beq	.L2716
+	add	x0, x19, :lo12:.LANCHOR0
+	mov	w1, 20038
+	movk	w1, 0x4549, lsl 16
+	ldr	x0, [x0, 1128]
+	ldr	w0, [x0]
+	cmp	w0, w1
+	bne	.L2716
+	ldr	x0, [x28, 376]
+	ldr	w2, [x0, 8]
+	cbnz	w2, .L2717
+.L2720:
 	bl	zftl_sblk_list_init
 	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x0, [x0,3392]
-	ldrh	w1, [x0,140]
-	cmp	w1, w25
-	bgt	.L2676
-	add	w24, w24, 1
-	strh	w24, [x0,140]
+	ldr	x0, [x0, 3384]
+	ldrh	w1, [x0, 140]
+	cmp	w1, w23
+	bgt	.L2719
+	add	w22, w22, 1
+	strh	w22, [x0, 140]
 	bl	ftl_ext_info_flush
-	b	.L2676
-.L2674:
-	ldrb	w1, [x5,3360]
-	ldr	x0, [x20,664]
-	lsl	w1, w1, 9
-	str	x2, [x29,96]
-	bl	js_hash
-	ldr	x2, [x29,96]
-	cmp	w2, w0
-	beq	.L2677
-	ldr	w1, [x26,8]
-	mov	x0, x27
-	bl	printk
-.L2673:
-	sub	w22, w22, #1
-	sxth	w22, w22
-	b	.L2672
-.L2676:
+.L2719:
 	add	x19, x19, :lo12:.LANCHOR0
-	ldr	x20, [x19,1120]
+	ldr	x20, [x19, 1128]
 	bl	timer_get_time
 	mov	w1, 100
 	udiv	w0, w0, w1
-	str	w0, [x20,520]
-	ldr	x20, [x19,1120]
+	str	w0, [x20, 520]
+	ldr	x20, [x19, 1128]
 	bl	timer_get_time
-	str	w0, [x20,604]
-	ldr	x0, [x19,1120]
 	mov	w1, -1
-	strh	w1, [x0,584]
-	strh	w1, [x0,586]
-	strh	w1, [x0,588]
-	strh	w1, [x0,590]
+	str	w0, [x20, 604]
+	ldr	x0, [x19, 1128]
+	strh	w1, [x0, 584]
+	strh	w1, [x0, 586]
+	strh	w1, [x0, 588]
+	strh	w1, [x0, 590]
 	mov	w1, 65535
-	str	w1, [x0,560]
+	str	w1, [x0, 560]
 	mov	w1, -1
-	str	w1, [x0,564]
-	ldr	x1, [x29,104]
-	str	wzr, [x0,608]
-	ldr	w1, [x1,#:lo12:.LANCHOR2]
-	tbz	x1, 12, .L2679
-	ldr	w2, [x0,520]
-	ldr	w3, [x0,12]
-	str	x2, [x29,96]
-	str	x3, [x29,104]
+	str	w1, [x0, 564]
+	ldr	x1, [x29, 112]
+	str	wzr, [x0, 608]
+	ldr	w1, [x1, #:lo12:.LANCHOR2]
+	tbz	x1, 12, .L2722
+	ldr	w20, [x0, 12]
+	ldr	w19, [x0, 520]
 	bl	timer_get_time
-	mov	w4, w0
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC193
 	add	x1, x1, :lo12:.LANCHOR4
-	ldr	x2, [x29,96]
-	ldr	x3, [x29,104]
+	mov	w4, w0
+	mov	w3, w20
+	adrp	x0, .LC193
+	mov	w2, w19
+	add	x1, x1, 632
 	add	x0, x0, :lo12:.LC193
-	add	x1, x1, 616
 	bl	printk
-.L2679:
+.L2722:
 	add	x21, x21, :lo12:.LANCHOR3
 	mov	w0, -1
-	ldp	x19, x20, [sp,16]
-	ldp	x23, x24, [sp,48]
-	strh	w0, [x21,1288]
+	ldp	x19, x20, [sp, 16]
+	strh	w0, [x21, 1280]
 	mov	w0, 0
-	ldp	x21, x22, [sp,32]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 112
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 128
 	ret
+.L2717:
+	ldr	x0, [x28, 408]
+	ldrb	w1, [x25, 1946]
+	str	w2, [x29, 108]
+	lsl	w1, w1, 9
+	bl	js_hash
+	ldr	w2, [x29, 108]
+	cmp	w2, w0
+	beq	.L2720
+	ldr	x0, [x28, 376]
+	ldr	w1, [x0, 8]
+	mov	x0, x26
+	bl	printk
+.L2716:
+	add	w24, w24, 1
+	b	.L2715
 	.size	ftl_ext_info_init, .-ftl_ext_info_init
 	.align	2
 	.global	ftl_prog_ppa_page
 	.type	ftl_prog_ppa_page, %function
 ftl_prog_ppa_page:
-	mov	w8, w0
-	adrp	x0, .LANCHOR0+1257
 	stp	x29, x30, [sp, -16]!
-	mov	w5, 24
-	mov	x10, x1
+	adrp	x4, .LANCHOR0+1205
+	mov	w5, 1
 	add	x29, sp, 0
-	ldrb	w6, [x0,#:lo12:.LANCHOR0+1257]
-	mov	x9, x2
+	ldrb	w6, [x4, #:lo12:.LANCHOR0+1205]
+	mov	w4, 24
+	sub	w4, w4, w6
+	lsl	w7, w5, w4
+	sub	w7, w7, #1
+	lsl	w5, w5, w6
+	sub	w6, w5, #1
+	lsr	w5, w0, w4
 	mov	w4, w3
-	mov	x2, x10
-	sub	w7, w5, w6
-	mov	w5, 1
-	lsl	w6, w5, w6
-	lsl	w5, w5, w7
-	lsr	w0, w8, w7
-	sub	w6, w6, #1
-	sub	w1, w5, #1
-	and	w0, w0, w6
-	and	w1, w1, w8
-	mov	x3, x9
+	mov	x3, x2
+	mov	x2, x1
+	and	w1, w7, w0
+	and	w0, w6, w5
 	bl	ftl_prog_page
 	ldp	x29, x30, [sp], 16
 	ret
@@ -17232,599 +17126,603 @@ ftl_prog_ppa_page:
 	.global	ftl_write_last_log_page
 	.type	ftl_write_last_log_page, %function
 ftl_write_last_log_page:
+	ldrh	w1, [x0, 6]
+	cmp	w1, 1
+	bne	.L2737
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	adrp	x22, .LANCHOR3
-	mov	w19, -1
-	ldrh	w1, [x0,6]
-	add	x22, x22, :lo12:.LANCHOR3
-	ldrh	w23, [x0,12]
-	cmp	w1, 1
-	ldr	x21, [x22,1936]
-	bne	.L2694
-	mov	x20, x0
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR3
+	add	x20, x20, :lo12:.LANCHOR3
+	stp	x21, x22, [sp, 32]
+	str	x23, [sp, 48]
+	mov	x19, x0
+	ldr	x21, [x20, 1928]
+	ldrh	w23, [x0, 12]
 	bl	ftl_get_new_free_page
+	mov	w22, w0
 	cmn	w0, #1
-	mov	w24, w0
-	mov	w19, 0
-	beq	.L2694
-	ldrh	w0, [x20]
-	add	x23, x21, w23, uxth 2
-	adrp	x21, .LANCHOR5
-	add	x21, x21, :lo12:.LANCHOR5
+	beq	.L2738
+	ldrh	w0, [x19]
+	adrp	x19, .LANCHOR5
+	add	x19, x19, :lo12:.LANCHOR5
+	add	x21, x21, w23, uxth 2
 	bl	ftl_vpn_decrement
-	add	x20, x21, 704
-	mov	w0, 15555
-	ldrh	w1, [x22,1384]
-	movk	w0, 0xf55f, lsl 16
-	str	w0, [x21,704]
-	ldrb	w0, [x22,1329]
+	ldr	x0, [x19, 416]
+	mov	w1, 15555
+	movk	w1, 0xf55f, lsl 16
+	str	w1, [x0]
+	ldrb	w0, [x20, 1321]
+	ldrh	w1, [x20, 1376]
+	ldr	x23, [x19, 416]
 	mul	w1, w1, w0
-	mov	x0, x23
+	mov	x0, x21
 	lsl	w1, w1, 2
 	bl	js_hash
-	str	w0, [x21,708]
-	add	x1, x21, 720
+	str	w0, [x23, 4]
 	mov	x2, 0
 	mov	w0, 2
-	str	w19, [x21,712]
-	str	w19, [x21,716]
-	str	w19, [x21,720]
+	ldr	x1, [x19, 416]
+	stp	wzr, wzr, [x1, 8]
+	str	wzr, [x1, 16]!
 	bl	ftl_debug_info_fill
-	adrp	x3, .LANCHOR0+3360
-	mov	w0, w24
-	mov	x1, x23
-	mov	x2, x20
-	ldrb	w3, [x3,#:lo12:.LANCHOR0+3360]
+	ldrb	w3, [x20, 1946]
+	mov	x1, x21
+	ldr	x2, [x19, 416]
+	mov	w0, w22
 	bl	ftl_prog_ppa_page
-.L2694:
-	mov	w0, w19
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
+.L2738:
+	mov	w0, 0
+	ldr	x23, [sp, 48]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
 	ldp	x29, x30, [sp], 64
 	ret
+.L2737:
+	mov	w0, -1
+	ret
 	.size	ftl_write_last_log_page, .-ftl_write_last_log_page
 	.align	2
 	.global	ftl_dump_write_open_sblk
 	.type	ftl_dump_write_open_sblk, %function
 ftl_dump_write_open_sblk:
-	sub	sp, sp, #208
-	stp	x29, x30, [sp,48]
+	sub	sp, sp, #224
+	stp	x29, x30, [sp, 48]
 	add	x29, sp, 48
-	stp	x21, x22, [sp,80]
+	stp	x19, x20, [sp, 64]
+	and	w20, w0, 65535
+	stp	x21, x22, [sp, 80]
 	adrp	x21, .LANCHOR0
-	uxth	w22, w0
 	add	x0, x21, :lo12:.LANCHOR0
-	stp	x19, x20, [sp,64]
-	stp	x23, x24, [sp,96]
-	stp	x25, x26, [sp,112]
-	stp	x27, x28, [sp,128]
-	ldrh	w0, [x0,1088]
-	cmp	w0, w22
-	bls	.L2698
-	adrp	x20, .LANCHOR3
-	add	x0, x20, :lo12:.LANCHOR3
-	ldrb	w1, [x0,1344]
-	cbnz	w1, .L2700
-	ldrb	w0, [x0,1330]
-	cbz	w0, .L2698
-.L2700:
+	stp	x23, x24, [sp, 96]
+	stp	x25, x26, [sp, 112]
+	stp	x27, x28, [sp, 128]
+	ldrh	w0, [x0, 1096]
+	cmp	w0, w20
+	bls	.L2743
+	adrp	x23, .LANCHOR3
+	add	x0, x23, :lo12:.LANCHOR3
+	ldrb	w1, [x0, 1336]
+	cbnz	w1, .L2745
+	ldrb	w0, [x0, 1322]
+	cbz	w0, .L2743
+.L2745:
 	add	x0, x21, :lo12:.LANCHOR0
-	ldrb	w1, [x0,1268]
-	cbnz	w1, .L2698
-	ldr	x0, [x0,1096]
-	ubfiz	x19, x22, 2, 16
-	mov	w24, 1
-	add	x0, x0, x19
-	ldrb	w0, [x0,2]
+	ldrb	w1, [x0, 1212]
+	cbnz	w1, .L2743
+	ldr	x0, [x0, 1104]
+	ubfiz	x14, x20, 2, 16
+	add	x0, x0, x14
+	ldrb	w0, [x0, 2]
 	and	w0, w0, 224
 	cmp	w0, 160
-	bne	.L2701
-	add	x0, x20, :lo12:.LANCHOR3
-	ldrb	w24, [x0,1328]
-.L2701:
-	add	x23, x29, 128
-	mov	w0, w22
-	add	x1, x23, 16
-	strh	w22, [x29,128]
-	mov	w27, 0
-	adrp	x26, .LC195
+	bne	.L2767
+	add	x0, x23, :lo12:.LANCHOR3
+	ldrb	w26, [x0, 1320]
+.L2746:
+	add	x22, x29, 176
+	add	x24, x23, :lo12:.LANCHOR3
+	mov	w0, w20
+	adrp	x27, .LC195
+	add	x27, x27, :lo12:.LC195
+	mov	w28, 0
+	strh	w20, [x22, -32]!
+	add	x1, x22, 16
 	bl	ftl_get_blk_list_in_sblk
-	uxtb	w0, w0
-	add	x1, x20, :lo12:.LANCHOR3
-	strb	w0, [x29,137]
-	strh	wzr, [x29,130]
-	mov	w28, w27
-	strb	wzr, [x29,133]
-	mov	w25, w27
-	ldrh	w1, [x1,1384]
-	add	x26, x26, :lo12:.LC195
-	strh	wzr, [x29,138]
+	ldrh	w1, [x24, 1376]
+	and	w0, w0, 255
+	strb	w0, [x29, 153]
+	strh	wzr, [x29, 146]
+	strb	wzr, [x29, 149]
 	mul	w0, w0, w1
-	strh	w0, [x29,134]
+	strh	wzr, [x29, 154]
+	strh	w0, [x29, 150]
 	add	x0, x21, :lo12:.LANCHOR0
-	ldr	x0, [x0,1096]
-	add	x1, x0, x19
-	ldrh	w4, [x0,x19]
-	ldr	w5, [x0,x19]
+	ldr	x0, [x0, 1104]
+	add	x1, x0, x14
+	ldr	w5, [x0, x14]
+	ldrb	w2, [x1, 2]
+	mov	w1, w20
+	ldrh	w4, [x0, x14]
 	adrp	x0, .LC194
-	ldrb	w3, [x1,2]
-	and	w4, w4, 2047
-	mov	w1, w22
 	ubfx	x5, x5, 11, 8
-	ubfx	x2, x3, 5, 3
 	add	x0, x0, :lo12:.LC194
-	ubfx	x3, x3, 3, 2
+	ubfx	x3, x2, 3, 2
+	and	w4, w4, 2047
+	ubfx	x2, x2, 5, 3
 	bl	printk
 	mov	w0, 1
 	bl	buf_alloc
 	mov	x19, x0
-.L2702:
-	add	x0, x20, :lo12:.LANCHOR3
-	ldrh	w0, [x0,1384]
+	mov	x11, x24
+	mov	w9, 0
+	mov	w10, 0
+.L2747:
+	ldrh	w0, [x11, 1376]
 	cmp	w0, w28
-	bls	.L2726
-	lsl	w0, w28, 1
-	add	w25, w0, w28
-	sub	w0, w0, #1
-	sub	w1, w25, #1
-	str	w0, [x29,120]
-	str	w1, [x29,124]
-	mov	w25, 0
-.L2714:
-	ldrb	w0, [x23,9]
-	cmp	w0, w25
-	bls	.L2738
-	sxtw	x0, w25
-	mov	w27, 1
-	str	x0, [x29,112]
-.L2713:
-	cmp	w27, w24
-	bhi	.L2739
-	ldr	x0, [x29,112]
-	add	x0, x0, 8
-	ldrh	w2, [x23,x0,lsl 1]
+	bls	.L2755
+	lsl	w24, w28, 1
+	mov	w10, 0
+	sub	w0, w24, #1
+	add	w24, w24, w28
+	sub	w24, w24, #1
+	str	w0, [x29, 136]
+	b	.L2758
+.L2767:
+	mov	w26, 1
+	b	.L2746
+.L2756:
+	ldrh	w12, [x22, x25]
 	mov	w0, 65535
-	cmp	w2, w0
-	beq	.L2704
-	add	x1, x20, :lo12:.LANCHOR3
-	cmp	w24, 3
-	ldrh	w0, [x1,1418]
-	mul	w0, w2, w0
-	bne	.L2705
-	add	x3, x21, :lo12:.LANCHOR0
-	ldrb	w3, [x3,1269]
-	cbz	w3, .L2706
-	ldr	w3, [x29,124]
-	b	.L2737
-.L2706:
-	add	w0, w0, w28
-	orr	w3, w0, w27, lsl 24
-	b	.L2707
-.L2705:
-	cmp	w24, 2
-	add	w3, w0, w28
-	bne	.L2707
-	ldr	w3, [x29,120]
-.L2737:
-	add	w0, w0, w3
-	ldrb	w3, [x1,1328]
-	add	w0, w0, w27
+	cmp	w12, w0
+	bne	.L2748
+.L2754:
+	add	w9, w9, 1
+	and	w9, w9, 65535
+.L2749:
+	cmp	w26, w9
+	bcs	.L2756
+	add	w10, w10, 1
+	and	w10, w10, 65535
+.L2758:
+	ldrb	w0, [x29, 153]
+	cmp	w0, w10
+	bls	.L2757
+	sxtw	x25, w10
+	mov	w9, 1
+	add	x25, x25, 8
+	lsl	x25, x25, 1
+	b	.L2749
+.L2748:
+	ldrh	w3, [x11, 1410]
+	cmp	w26, 3
+	mul	w3, w3, w12
+	add	w0, w3, w9
+	bne	.L2750
+	add	x1, x21, :lo12:.LANCHOR0
+	ldrb	w1, [x1, 1213]
+	cbz	w1, .L2751
+	ldrb	w3, [x11, 1320]
+	add	w0, w0, w24
+.L2781:
 	orr	w3, w0, w3, lsl 24
-.L2707:
-	str	w3, [x19,40]
-	mov	x0, x19
+	b	.L2752
+.L2751:
+	add	w3, w28, w3
+	orr	w3, w3, w9, lsl 24
+.L2752:
+	str	w3, [x19, 40]
 	mov	w1, 1
-	str	x2, [x29,96]
-	str	x3, [x29,104]
+	str	x11, [x29, 104]
+	mov	x0, x19
+	str	w9, [x29, 112]
+	stp	w12, w10, [x29, 124]
+	str	w3, [x29, 132]
 	bl	sblk_read_page
-	ldr	w4, [x19,52]
-	ldr	x3, [x29,104]
-	cmp	w4, 512
-	ldr	x2, [x29,96]
-	cset	w11, eq
-	cmn	w4, #1
-	beq	.L2727
-	cbz	w11, .L2704
-.L2727:
-	ldr	x7, [x19,8]
-	ldr	x0, [x19,24]
-	str	x11, [x29,104]
-	ldr	w1, [x7,12]
-	str	w1, [sp]
-	ldr	w1, [x0]
-	str	w1, [sp,8]
-	ldr	w1, [x0,4]
-	str	w1, [sp,16]
-	ldr	w1, [x0,8]
-	str	w1, [sp,24]
-	mov	w1, w2
+	ldr	w13, [x19, 52]
+	ldr	w9, [x29, 112]
+	cmp	w13, 512
+	ldr	w3, [x29, 132]
+	ccmn	w13, #1, 4, ne
+	ldr	x11, [x29, 104]
+	ldp	w12, w10, [x29, 124]
+	bne	.L2754
+	ldr	x1, [x19, 24]
+	mov	w4, w13
+	ldr	x0, [x19, 8]
+	str	x11, [x29, 112]
+	stp	w9, w10, [x29, 124]
+	ldr	w2, [x1, 12]
+	str	w2, [sp, 32]
+	str	w13, [x29, 132]
+	ldr	w2, [x1, 8]
+	str	w2, [sp, 24]
+	ldr	w2, [x1, 4]
+	str	w2, [sp, 16]
 	mov	w2, w28
-	ldr	w0, [x0,12]
-	str	w0, [sp,32]
-	mov	x0, x26
-	ldr	w5, [x7]
-	ldr	w6, [x7,4]
-	ldr	w7, [x7,8]
+	ldr	w1, [x1]
+	str	w1, [sp, 8]
+	ldr	w1, [x0, 12]
+	str	w1, [sp]
+	mov	w1, w12
+	ldp	w5, w6, [x0]
+	ldr	w7, [x0, 8]
+	mov	x0, x27
 	bl	printk
-	ldr	x11, [x29,104]
-	cbnz	w11, .L2726
-.L2704:
-	add	w9, w27, 1
-	uxth	w27, w9
-	b	.L2713
-.L2739:
-	add	w10, w25, 1
-	uxth	w25, w10
-	b	.L2714
-.L2738:
-	add	w8, w28, 1
-	uxth	w28, w8
-	b	.L2702
-.L2726:
-.L2711:
-	adrp	x0, .LC196
-	mov	w3, w25
-	mov	w4, w27
+	ldr	w13, [x29, 132]
+	ldp	w9, w10, [x29, 124]
+	cmp	w13, 512
+	ldr	x11, [x29, 112]
+	bne	.L2754
+.L2755:
+	add	x24, x23, :lo12:.LANCHOR3
+	mov	w4, w9
+	mov	w3, w10
 	mov	w2, w28
-	mov	w1, w22
-	add	x25, x21, :lo12:.LANCHOR0
+	mov	w1, w20
+	adrp	x0, .LC196
 	add	x0, x0, :lo12:.LC196
-	adrp	x26, .LC197
-	mov	w24, w28
-	add	x26, x26, :lo12:.LC197
 	bl	printk
-	mov	w27, 24
-	ldrb	w2, [x25,3360]
+	ldr	x0, [x19, 8]
 	mov	w1, 0
-	ldr	x0, [x19,8]
-	mov	w28, 1
+	ldrb	w2, [x24, 1946]
+	adrp	x26, .LC197
+	add	x26, x26, :lo12:.LC197
 	lsl	w2, w2, 9
 	bl	ftl_memset
-	ldrb	w2, [x25,3360]
+	ldr	x0, [x19, 24]
 	mov	w1, 0
-	ldr	x0, [x19,24]
+	ldrb	w2, [x24, 1946]
 	lsl	w2, w2, 1
 	bl	ftl_memset
-.L2715:
-	add	x0, x20, :lo12:.LANCHOR3
-	ldrh	w0, [x0,1384]
-	cmp	w0, w24
-	bls	.L2721
-	lsl	w0, w24, 1
+.L2759:
+	add	x24, x23, :lo12:.LANCHOR3
+	ldrh	w0, [x24, 1376]
+	cmp	w0, w28
+	bls	.L2765
+	add	x0, x21, :lo12:.LANCHOR0
+	lsl	w27, w28, 1
 	mov	w25, 0
-	str	w0, [x29,124]
-.L2722:
-	ldrb	w0, [x23,9]
-	cmp	w0, w25
-	bls	.L2740
+	str	x0, [x29, 136]
+	b	.L2766
+.L2750:
+	cmp	w26, 2
+	bne	.L2753
+	ldr	w1, [x29, 136]
+	ldrb	w3, [x11, 1320]
+	add	w0, w1, w0
+	b	.L2781
+.L2753:
+	add	w3, w28, w3
+	b	.L2752
+.L2757:
+	add	w8, w28, 1
+	and	w28, w8, 65535
+	b	.L2747
+.L2764:
 	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L2716
-	mov	x0, x26
-	mov	w1, w24
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L2760
 	mov	w2, w25
+	mov	w1, w28
+	mov	x0, x26
 	bl	printk
-.L2716:
-	add	x1, x20, :lo12:.LANCHOR3
+.L2760:
+	ldrb	w1, [x24, 1336]
 	sxtw	x0, w25
-	ldrb	w5, [x1,1344]
-	ldrh	w2, [x1,1418]
-	cbz	w5, .L2717
+	ldrh	w2, [x24, 1410]
+	cbz	w1, .L2761
 	add	x0, x0, 8
-	ldrh	w0, [x23,x0,lsl 1]
-	mul	w2, w0, w2
+	ldrh	w1, [x22, x0, lsl 1]
 	mov	x0, x19
-	orr	w2, w2, w24
-	str	w2, [x19,40]
+	mul	w1, w1, w2
+	orr	w1, w1, w28
+	str	w1, [x19, 40]
 	bl	sblk_3d_tlc_dump_prog
-	b	.L2718
-.L2717:
+.L2762:
+	add	w25, w25, 1
+	and	w25, w25, 65535
+.L2766:
+	ldrb	w0, [x29, 153]
+	cmp	w0, w25
+	bhi	.L2764
+	add	w8, w28, 1
+	and	w28, w8, 65535
+	b	.L2759
+.L2761:
 	add	x0, x0, 8
-	ldrb	w1, [x1,1328]
+	ldrb	w1, [x24, 1320]
 	cmp	w1, 2
-	ldrh	w0, [x23,x0,lsl 1]
-	mul	w2, w0, w2
-	bne	.L2719
-	ldr	w0, [x29,124]
-	orr	w2, w2, w0
+	ldrh	w1, [x22, x0, lsl 1]
+	mul	w1, w1, w2
+	bne	.L2763
+	orr	w1, w1, w27
 	mov	x0, x19
-	orr	w2, w2, 33554432
-	str	w2, [x19,40]
+	orr	w1, w1, 33554432
+	str	w1, [x19, 40]
 	bl	sblk_mlc_dump_prog
-	b	.L2718
-.L2719:
-	add	x4, x21, :lo12:.LANCHOR0
-	orr	w2, w2, w24
-	str	w2, [x19,40]
-	ldrb	w0, [x4,1257]
-	ldrb	w4, [x4,3360]
-	sub	w1, w27, w0
-	lsl	w0, w28, w0
-	sub	w0, w0, #1
-	lsr	w3, w2, w1
-	lsl	w1, w0, w1
-	and	w0, w3, w0
-	bic	w1, w2, w1
-	ldr	x3, [x19,24]
-	ldr	x2, [x19,8]
+	b	.L2762
+.L2763:
+	ldr	x0, [x29, 136]
+	mov	w6, 1
+	ldrb	w4, [x24, 1946]
+	orr	w1, w1, w28
+	ldr	x3, [x19, 24]
+	mov	w5, 0
+	str	w1, [x19, 40]
+	ldrb	w2, [x0, 1205]
+	mov	w0, 24
+	sub	w0, w0, w2
+	lsl	w6, w6, w2
+	ldr	x2, [x19, 8]
+	sub	w6, w6, #1
+	lsl	w7, w6, w0
+	lsr	w0, w1, w0
+	bic	w1, w1, w7
+	and	w0, w0, w6
 	bl	flash_prog_page_en
-.L2718:
-	add	w25, w25, 1
-	uxth	w25, w25
-	b	.L2722
-.L2740:
-	add	w24, w24, 1
-	uxth	w24, w24
-	b	.L2715
-.L2721:
+	b	.L2762
+.L2765:
 	mov	x0, x19
 	bl	zbuf_free
 	adrp	x0, .LC198
-	mov	w1, w22
+	mov	w1, w20
 	add	x0, x0, :lo12:.LC198
 	bl	printk
-.L2698:
-	sub	sp, x29, #48
-	ldp	x19, x20, [sp,64]
-	ldp	x21, x22, [sp,80]
-	ldp	x23, x24, [sp,96]
-	ldp	x25, x26, [sp,112]
-	ldp	x27, x28, [sp,128]
-	ldp	x29, x30, [sp,48]
-	add	sp, sp, 208
+.L2743:
+	ldp	x19, x20, [sp, 64]
+	ldp	x21, x22, [sp, 80]
+	ldp	x23, x24, [sp, 96]
+	ldp	x25, x26, [sp, 112]
+	ldp	x27, x28, [sp, 128]
+	ldp	x29, x30, [sp, 48]
+	add	sp, sp, 224
 	ret
 	.size	ftl_dump_write_open_sblk, .-ftl_dump_write_open_sblk
 	.align	2
 	.global	gc_ink_check_sblk
 	.type	gc_ink_check_sblk, %function
 gc_ink_check_sblk:
-	stp	x29, x30, [sp, -96]!
+	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR0
-	str	x27, [sp,80]
 	add	x0, x19, :lo12:.LANCHOR0
-	mov	x20, x19
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	ldrh	w1, [x0,5534]
-	ldr	x21, [x0,5608]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	ldrh	w1, [x0, 5526]
+	ldr	x21, [x0, 5600]
 	cmp	w1, 3
-	bhi	.L2742
-	adrp	x0, .L2744
-	add	x0, x0, :lo12:.L2744
-	ldrb	w0, [x0,w1,uxtw]
-	adr	x1, .Lrtx2744
-	add	x0, x1, w0, sxtb #2
+	bhi	.L2783
+	adrp	x0, .L2785
+	mov	x20, x19
+	add	x0, x0, :lo12:.L2785
+	ldrh	w0, [x0,w1,uxtw #1]
+	adr	x1, .Lrtx2785
+	add	x0, x1, w0, sxth #2
 	br	x0
-.Lrtx2744:
+.Lrtx2785:
 	.section	.rodata
 	.align	0
 	.align	2
-.L2744:
-	.byte	(.L2743 - .Lrtx2744) / 4
-	.byte	(.L2745 - .Lrtx2744) / 4
-	.byte	(.L2746 - .Lrtx2744) / 4
-	.byte	(.L2747 - .Lrtx2744) / 4
+.L2785:
+	.2byte	(.L2784 - .Lrtx2785) / 4
+	.2byte	(.L2786 - .Lrtx2785) / 4
+	.2byte	(.L2787 - .Lrtx2785) / 4
+	.2byte	(.L2788 - .Lrtx2785) / 4
 	.text
-.L2743:
+.L2784:
 	add	x19, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x19,3380]
+	ldrh	w0, [x19, 3372]
 	cmp	w0, 7
-	bls	.L2741
-	ldrb	w0, [x19,3362]
+	bls	.L2782
+	ldrb	w0, [x19, 3353]
 	cmp	w0, 2
-	bls	.L2741
+	bls	.L2782
 	adrp	x20, .LANCHOR3
-	mov	w1, 0
 	add	x20, x20, :lo12:.LANCHOR3
-	mov	w22, 65535
-	add	x20, x20, 1408
-	mov	x0, x20
+	add	x23, x20, 1400
+	mov	w1, 0
+	mov	x0, x23
 	bl	_list_get_gc_head_node
-	uxth	w0, w0
+	and	w0, w0, 65535
+	mov	w22, 65535
 	cmp	w0, w22
-	beq	.L2741
+	beq	.L2782
+	ldr	x1, [x19, 1104]
 	ubfiz	x0, x0, 2, 16
-	ldr	x1, [x19,1096]
-	ldrh	w0, [x1,x0]
+	ldrh	w0, [x1, x0]
 	and	w0, w0, 2047
 	cmp	w0, 2
-	bgt	.L2741
+	bgt	.L2782
 	mov	w0, 1
-	add	x21, x19, 3424
 	bl	buf_alloc
-	str	x0, [x19,5608]
-	cbz	x0, .L2741
-	mov	x0, x20
+	str	x0, [x19, 5600]
+	add	x21, x19, 3416
+	cbz	x0, .L2782
+	add	x2, x19, 3372
 	mov	w1, 0
-	add	x2, x19, 3380
+	mov	x0, x23
 	bl	_list_pop_index_node
-	uxth	w20, w0
-	cmp	w20, w22
-	bne	.L2751
-	ldr	x0, [x19,5608]
+	and	w14, w0, 65535
+	cmp	w14, w22
+	bne	.L2792
+	ldr	x0, [x19, 5600]
 	bl	zbuf_free
-	str	xzr, [x19,5608]
-	b	.L2741
-.L2751:
-	mov	w0, w20
+	str	xzr, [x19, 5600]
+.L2782:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	ret
+.L2792:
+	mov	w0, w14
 	add	x1, x21, 2162
 	bl	ftl_get_blk_list_in_sblk
-	strb	w0, [x21,2155]
+	strb	w0, [x21, 2155]
 	mov	w0, 1
-	strh	w20, [x19,5570]
-	strh	w0, [x19,5534]
-	ubfiz	x20, x20, 2, 16
-	ldr	x0, [x19,1096]
-	strh	wzr, [x19,5572]
-	ldrb	w2, [x19,3360]
-	ldrh	w0, [x0,x20]
-	tbz	x0, 0, .L2752
-	ldr	x0, [x19,5608]
-	mov	w1, 85
-	ldr	x0, [x0,8]
-	b	.L2766
-.L2752:
-	ldr	x0, [x19,5608]
-	mov	w1, 170
-	ldr	x0, [x0,8]
-.L2766:
+	strh	w0, [x19, 5526]
+	ldr	x0, [x19, 1104]
+	strh	w14, [x19, 5562]
+	ubfiz	x14, x14, 2, 16
+	strh	wzr, [x19, 5564]
+	ldrb	w2, [x20, 1946]
+	ldrh	w0, [x0, x14]
+	tbz	x0, 0, .L2793
+	ldr	x0, [x19, 5600]
 	lsl	w2, w2, 9
+	mov	w1, 85
+.L2808:
+	ldr	x0, [x0, 8]
 	bl	ftl_memset
-	b	.L2741
-.L2745:
-	add	x19, x19, :lo12:.LANCHOR0
+	b	.L2782
+.L2793:
+	lsl	w2, w2, 9
+	mov	w1, 170
+	ldr	x0, [x19, 5600]
+	b	.L2808
+.L2786:
+	add	x20, x19, :lo12:.LANCHOR0
 	mov	w1, 0
-	ldrh	w0, [x19,5570]
+	ldrh	w0, [x20, 5562]
 	bl	ftl_erase_sblk
 	mov	w0, 2
-	strh	w0, [x19,5534]
-	b	.L2741
-.L2746:
+	strh	w0, [x20, 5526]
+	b	.L2782
+.L2787:
 	add	x19, x19, :lo12:.LANCHOR0
-	mov	w23, 0
-	add	x22, x19, 3424
-	mov	w20, 65535
 	adrp	x24, .LANCHOR3
-	mov	w25, 24
+	mov	w20, 65280
+	add	x22, x19, 3416
+	add	x24, x24, :lo12:.LANCHOR3
+	mov	w23, 0
+	movk	w20, 0x55aa, lsl 16
 	bl	sblk_wait_write_queue_completed
-.L2753:
-	ldrb	w0, [x22,2155]
+.L2794:
+	ldrb	w0, [x22, 2155]
 	cmp	w0, w23
-	bls	.L2767
+	bhi	.L2796
+	ldrh	w0, [x22, 2148]
+	adrp	x1, .LANCHOR3+1376
+	add	w0, w0, 1
+	ldrh	w1, [x1, #:lo12:.LANCHOR3+1376]
+	and	w0, w0, 65535
+	strh	w0, [x22, 2148]
+	cmp	w1, w0
+	bhi	.L2782
+	mov	w0, 3
+	strh	wzr, [x22, 2148]
+	strh	w0, [x22, 2110]
+	b	.L2782
+.L2796:
 	add	x0, x22, w23, sxtw 1
-	ldrh	w0, [x0,2162]
-	cmp	w0, w20
-	beq	.L2754
-	add	x1, x24, :lo12:.LANCHOR3
+	mov	w1, 65535
+	ldrh	w0, [x0, 2162]
+	cmp	w0, w1
+	beq	.L2795
+	ldrh	w2, [x22, 2148]
+	mov	w6, 1
+	ldrh	w1, [x24, 1410]
 	mov	w5, 0
-	ldrh	w2, [x1,1418]
-	ldrh	w1, [x22,2148]
-	madd	w2, w0, w2, w1
-	ldr	x0, [x21,8]
-	str	w2, [x0]
-	mov	w0, 65280
-	movk	w0, 0x55aa, lsl 16
-	ldr	x1, [x21,8]
-	str	w0, [x1,4]
-	ldr	x0, [x21,24]
+	madd	w1, w1, w0, w2
+	ldr	x0, [x21, 8]
+	str	w1, [x0]
+	ldr	x0, [x21, 8]
+	str	w20, [x0, 4]
+	ldr	x0, [x21, 24]
 	str	wzr, [x0]
-	mov	w0, 1
-	ldrb	w3, [x19,1257]
-	ldrb	w4, [x19,3360]
-	lsl	w0, w0, w3
-	sub	w1, w25, w3
-	sub	w0, w0, #1
-	lsr	w3, w2, w1
-	lsl	w1, w0, w1
-	and	w0, w3, w0
-	bic	w1, w2, w1
-	ldr	x3, [x21,24]
-	ldr	x2, [x21,8]
+	mov	w0, 24
+	ldrb	w2, [x19, 1205]
+	ldrb	w4, [x24, 1946]
+	sub	w0, w0, w2
+	ldr	x3, [x21, 24]
+	lsl	w6, w6, w2
+	ldr	x2, [x21, 8]
+	sub	w6, w6, #1
+	lsl	w7, w6, w0
+	lsr	w0, w1, w0
+	bic	w1, w1, w7
+	and	w0, w0, w6
 	bl	flash_prog_page_en
-.L2754:
+.L2795:
 	add	w23, w23, 1
-	uxth	w23, w23
-	b	.L2753
-.L2767:
-	ldrh	w0, [x22,2148]
-	adrp	x1, .LANCHOR3+1384
-	add	w0, w0, 1
-	ldrh	w1, [x1,#:lo12:.LANCHOR3+1384]
-	uxth	w0, w0
-	strh	w0, [x22,2148]
-	cmp	w1, w0
-	bhi	.L2741
-	mov	w0, 3
-	strh	wzr, [x22,2148]
-	strh	w0, [x22,2110]
-	b	.L2741
-.L2747:
+	and	w23, w23, 65535
+	b	.L2794
+.L2788:
 	add	x19, x19, :lo12:.LANCHOR0
-	mov	w22, 0
-	add	x19, x19, 3424
-	mov	w24, 65535
 	adrp	x25, .LANCHOR3
-	mov	w26, -1
+	add	x19, x19, 3416
+	add	x25, x25, :lo12:.LANCHOR3
+	mov	w22, 0
+	mov	w26, 65535
 	bl	sblk_wait_write_queue_completed
-.L2756:
-	ldrb	w0, [x19,2155]
+.L2797:
+	ldrb	w0, [x19, 2155]
 	cmp	w0, w22
-	bls	.L2768
-	add	x27, x19, w22, sxtw 1
-	ldrh	w0, [x27,2162]
-	add	x27, x27, 16
-	cmp	w0, w24
-	beq	.L2758
-	add	x1, x25, :lo12:.LANCHOR3
-	ldrh	w23, [x1,1418]
-	ldrh	w1, [x19,2148]
-	madd	w23, w0, w23, w1
-	str	w23, [x21,40]
-	mov	x0, x21
-	mov	w1, 1
-	bl	sblk_read_page
-	ldr	x0, [x21,8]
-	ldr	w0, [x0]
-	cmp	w0, w23
-	beq	.L2758
-	mov	w0, w23
-	bl	ftl_mask_bad_block
-	strh	w26, [x27,2146]
-.L2758:
-	add	w22, w22, 1
-	uxth	w22, w22
-	b	.L2756
-.L2768:
-	ldrh	w0, [x19,2148]
-	adrp	x1, .LANCHOR3+1384
+	bhi	.L2801
+	ldrh	w0, [x19, 2148]
+	adrp	x1, .LANCHOR3+1376
 	add	w0, w0, 1
-	ldrh	w1, [x1,#:lo12:.LANCHOR3+1384]
-	uxth	w0, w0
-	strh	w0, [x19,2148]
+	ldrh	w1, [x1, #:lo12:.LANCHOR3+1376]
+	and	w0, w0, 65535
+	strh	w0, [x19, 2148]
 	cmp	w1, w0
-	bhi	.L2741
-	ldr	x0, [x19,2184]
-	strh	wzr, [x19,2110]
+	bhi	.L2782
+	ldr	x0, [x19, 2184]
+	strh	wzr, [x19, 2110]
 	bl	zbuf_free
-	str	xzr, [x19,2184]
-	ldrh	w0, [x19,2112]
+	str	xzr, [x19, 2184]
+	ldrh	w0, [x19, 2112]
 	cmp	w0, 15
-	bhi	.L2761
+	bhi	.L2802
 	add	w1, w0, 1
-	strh	w1, [x19,2112]
-	ldrh	w1, [x19,2146]
 	add	x0, x19, w0, sxtw 1
-	strh	w1, [x0,2114]
-	b	.L2762
-.L2761:
-	ldrh	w0, [x19,2146]
-	bl	zftl_insert_free_list
-.L2762:
+	strh	w1, [x19, 2112]
+	ldrh	w1, [x19, 2146]
+	strh	w1, [x0, 2114]
+.L2803:
 	add	x19, x20, :lo12:.LANCHOR0
 	adrp	x0, .LC199
 	add	x0, x0, :lo12:.LC199
-	ldrh	w1, [x19,5570]
-	ldrh	w2, [x19,5536]
-	bl	printk
-	b	.L2741
-.L2742:
-	strh	wzr, [x0,5534]
-.L2741:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldr	x27, [sp,80]
-	ldp	x29, x30, [sp], 96
-	ret
+	ldrh	w2, [x19, 5528]
+	ldrh	w1, [x19, 5562]
+	bl	printk
+	b	.L2782
+.L2801:
+	add	x24, x19, w22, sxtw 1
+	add	x24, x24, 16
+	ldrh	w0, [x24, 2146]
+	cmp	w0, w26
+	beq	.L2799
+	ldrh	w1, [x19, 2148]
+	ldrh	w23, [x25, 1410]
+	madd	w23, w23, w0, w1
+	mov	w1, 1
+	str	w23, [x21, 40]
+	mov	x0, x21
+	bl	sblk_read_page
+	ldr	x0, [x21, 8]
+	ldr	w0, [x0]
+	cmp	w23, w0
+	beq	.L2799
+	mov	w0, w23
+	bl	ftl_mask_bad_block
+	mov	w0, -1
+	strh	w0, [x24, 2146]
+.L2799:
+	add	w22, w22, 1
+	and	w22, w22, 65535
+	b	.L2797
+.L2802:
+	ldrh	w0, [x19, 2146]
+	bl	zftl_insert_free_list
+	b	.L2803
+.L2783:
+	strh	wzr, [x0, 5526]
+	b	.L2782
 	.size	gc_ink_check_sblk, .-gc_ink_check_sblk
 	.align	2
 	.global	ftl_ink_check_sblk
@@ -17832,177 +17730,175 @@ gc_ink_check_sblk:
 ftl_ink_check_sblk:
 	stp	x29, x30, [sp, -144]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	adrp	x21, .LANCHOR0
 	add	x22, x21, :lo12:.LANCHOR0
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	uxth	w20, w0
-	ubfiz	x24, x20, 2, 16
-	ldr	x0, [x22,1096]
+	stp	x19, x20, [sp, 16]
+	stp	x25, x26, [sp, 64]
+	and	w20, w0, 65535
+	stp	x23, x24, [sp, 48]
+	ubfiz	x25, x20, 2, 16
+	stp	x27, x28, [sp, 80]
 	mov	w1, w20
-	ldrh	w2, [x0,x24]
-	ldr	w3, [x0,x24]
+	ldr	x0, [x22, 1104]
+	ldr	w3, [x0, x25]
+	ldrh	w2, [x0, x25]
 	adrp	x0, .LC200
 	add	x0, x0, :lo12:.LC200
-	and	w2, w2, 2047
 	ubfx	x3, x3, 11, 8
+	and	w2, w2, 2047
 	bl	printk
 	mov	w0, 65535
 	cmp	w20, w0
-	beq	.L2769
-	ldrh	w0, [x22,1088]
+	beq	.L2809
+	ldrh	w0, [x22, 1096]
 	cmp	w0, w20
-	bls	.L2769
+	bls	.L2809
+	add	x24, x29, 144
 	mov	w1, 0
 	mov	w0, w20
-	add	x23, x29, 112
 	bl	ftl_erase_sblk
-	strh	w20, [x29,112]
-	add	x1, x23, 16
 	mov	w0, w20
+	strh	w20, [x24, -32]!
+	add	x1, x24, 16
 	bl	ftl_get_blk_list_in_sblk
-	strb	w0, [x29,121]
+	strb	w0, [x29, 121]
 	mov	w0, 1
 	bl	buf_alloc
 	mov	x19, x0
-	ldr	x0, [x22,1096]
-	ldrb	w2, [x22,3360]
-	ldrh	w0, [x0,x24]
+	ldr	x0, [x22, 1104]
+	adrp	x22, .LANCHOR3
+	ldrh	w0, [x0, x25]
 	and	w0, w0, 2047
 	cmp	w0, 1
-	ldr	x0, [x19,8]
-	bgt	.L2771
-	mov	w1, 85
-	b	.L2786
-.L2771:
-	mov	w1, 170
-.L2786:
+	add	x0, x22, :lo12:.LANCHOR3
+	ldrb	w2, [x0, 1946]
 	lsl	w2, w2, 9
-	adrp	x26, .LANCHOR3
-	mov	w22, 0
-	mov	x27, x26
+	bgt	.L2811
+	mov	w1, 85
+.L2827:
+	ldr	x0, [x19, 8]
+	add	x27, x22, :lo12:.LANCHOR3
+	mov	w26, 0
 	bl	ftl_memset
-	mov	w28, 65535
 	bl	sblk_wait_write_queue_completed
-	mov	w6, 24
-.L2773:
-	add	x0, x26, :lo12:.LANCHOR3
-	adrp	x25, .LANCHOR3
-	ldrh	w0, [x0,1384]
-	cmp	w0, w22
-	bls	.L2787
-	mov	w25, 0
-	mov	w7, 1
-.L2776:
-	ldrb	w0, [x23,9]
-	cmp	w0, w25
-	bls	.L2788
-	add	x0, x23, w25, sxtw 1
-	ldrh	w0, [x0,16]
-	cmp	w0, w28
-	beq	.L2774
-	add	x1, x27, :lo12:.LANCHOR3
-	add	x4, x21, :lo12:.LANCHOR0
+	mov	w9, 65280
+	mov	w8, 65535
+	movk	w9, 0x55aa, lsl 16
+.L2813:
+	ldrh	w0, [x27, 1376]
+	cmp	w0, w26
+	bls	.L2816
+	mov	w23, 0
+	add	x7, x21, :lo12:.LANCHOR0
+	mov	w28, 24
+	b	.L2817
+.L2811:
+	mov	w1, 170
+	b	.L2827
+.L2815:
+	add	x0, x24, w23, sxtw 1
+	ldrh	w0, [x0, 16]
+	cmp	w0, w8
+	beq	.L2814
+	ldrh	w1, [x27, 1410]
+	mov	w6, 1
+	stp	w8, w9, [x29, 96]
 	mov	w5, 0
-	str	x6, [x29,96]
-	str	x7, [x29,104]
-	ldrh	w2, [x1,1418]
-	madd	w2, w0, w2, w22
-	ldr	x0, [x19,8]
-	str	w2, [x0]
-	mov	w0, 65280
-	movk	w0, 0x55aa, lsl 16
-	ldr	x1, [x19,8]
-	str	w0, [x1,4]
-	ldr	x0, [x19,24]
+	str	x7, [x29, 104]
+	madd	w1, w1, w0, w26
+	ldr	x0, [x19, 8]
+	str	w1, [x0]
+	ldr	x0, [x19, 8]
+	str	w9, [x0, 4]
+	ldr	x0, [x19, 24]
 	str	wzr, [x0]
-	ldrb	w0, [x4,1257]
-	ldrb	w4, [x4,3360]
-	sub	w1, w6, w0
-	lsl	w0, w7, w0
-	sub	w0, w0, #1
-	lsr	w3, w2, w1
-	lsl	w1, w0, w1
-	and	w0, w3, w0
-	bic	w1, w2, w1
-	ldr	x3, [x19,24]
-	ldr	x2, [x19,8]
+	ldrb	w2, [x7, 1205]
+	ldrb	w4, [x27, 1946]
+	sub	w0, w28, w2
+	ldr	x3, [x19, 24]
+	lsl	w6, w6, w2
+	ldr	x2, [x19, 8]
+	sub	w6, w6, #1
+	lsl	w10, w6, w0
+	lsr	w0, w1, w0
+	bic	w1, w1, w10
+	and	w0, w0, w6
 	bl	flash_prog_page_en
-	ldr	x6, [x29,96]
-	ldr	x7, [x29,104]
-.L2774:
-	add	w25, w25, 1
-	uxth	w25, w25
-	b	.L2776
-.L2788:
-	add	w22, w22, 1
-	uxth	w22, w22
-	b	.L2773
-.L2787:
-	mov	w22, 0
-	mov	w27, -1
-.L2777:
-	add	x0, x25, :lo12:.LANCHOR3
-	ldrh	w0, [x0,1384]
-	cmp	w0, w22
-	bls	.L2789
+	ldp	w8, w9, [x29, 96]
+	ldr	x7, [x29, 104]
+.L2814:
+	add	w23, w23, 1
+	and	w23, w23, 65535
+.L2817:
+	ldrb	w0, [x29, 121]
+	cmp	w0, w23
+	bhi	.L2815
+	add	w26, w26, 1
+	and	w26, w26, 65535
+	b	.L2813
+.L2816:
+	add	x22, x22, :lo12:.LANCHOR3
 	mov	w26, 0
-.L2782:
-	ldrb	w0, [x23,9]
+	mov	w27, 65535
+.L2818:
+	ldrh	w0, [x22, 1376]
 	cmp	w0, w26
-	bls	.L2790
-	sxtw	x28, w26
-	mov	w1, 65535
+	bls	.L2823
+	mov	w23, 0
+	b	.L2824
+.L2822:
+	sxtw	x28, w23
 	add	x28, x28, 8
-	ldrh	w0, [x23,x28,lsl 1]
-	cmp	w0, w1
-	beq	.L2779
-	add	x1, x25, :lo12:.LANCHOR3
-	ldrh	w3, [x1,1418]
+	lsl	x28, x28, 1
+	ldrh	w0, [x24, x28]
+	cmp	w0, w27
+	beq	.L2820
+	ldrh	w3, [x22, 1410]
 	mov	w1, 1
-	madd	w3, w0, w3, w22
-	str	w3, [x19,40]
+	madd	w3, w3, w0, w26
 	mov	x0, x19
-	str	x3, [x29,104]
+	str	w3, [x19, 40]
+	str	w3, [x29, 104]
 	bl	sblk_read_page
-	ldr	x0, [x19,8]
-	ldr	x3, [x29,104]
+	ldr	x0, [x19, 8]
+	ldr	w3, [x29, 104]
 	ldr	w0, [x0]
-	cmp	w0, w3
-	beq	.L2779
+	cmp	w3, w0
+	beq	.L2820
 	mov	w0, w3
 	bl	ftl_mask_bad_block
-	strh	w27, [x23,x28,lsl 1]
-.L2779:
+	mov	w0, -1
+	strh	w0, [x24, x28]
+.L2820:
+	add	w23, w23, 1
+	and	w23, w23, 65535
+.L2824:
+	ldrb	w0, [x29, 121]
+	cmp	w0, w23
+	bhi	.L2822
 	add	w2, w26, 1
-	uxth	w26, w2
-	b	.L2782
-.L2790:
-	add	w22, w22, 1
-	uxth	w22, w22
-	b	.L2777
-.L2789:
-	mov	x0, x19
+	and	w26, w2, 65535
+	b	.L2818
+.L2823:
 	add	x21, x21, :lo12:.LANCHOR0
+	mov	x0, x19
 	bl	zbuf_free
-	ldr	x0, [x21,1096]
 	mov	w1, w20
-	ldrh	w2, [x0,x24]
-	ldr	w3, [x0,x24]
+	ldr	x0, [x21, 1104]
+	ldr	w3, [x0, x25]
+	ldrh	w2, [x0, x25]
 	adrp	x0, .LC201
 	add	x0, x0, :lo12:.LC201
-	and	w2, w2, 2047
 	ubfx	x3, x3, 11, 8
+	and	w2, w2, 2047
 	bl	printk
-.L2769:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+.L2809:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 144
 	ret
 	.size	ftl_ink_check_sblk, .-ftl_ink_check_sblk
@@ -18012,185 +17908,182 @@ ftl_ink_check_sblk:
 ftl_alloc_sblk:
 	stp	x29, x30, [sp, -80]!
 	cmp	w0, 5
-	mov	w1, 2
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	uxth	w21, w0
+	stp	x21, x22, [sp, 32]
+	and	w21, w0, 65535
+	stp	x19, x20, [sp, 16]
 	mov	w22, w0
-	stp	x23, x24, [sp,48]
-	mov	w0, 0
-	csel	w23, wzr, w1, ne
+	stp	x23, x24, [sp, 48]
 	mov	w1, w21
-	str	x25, [sp,64]
-	stp	x19, x20, [sp,16]
+	cset	w23, eq
+	mov	w0, 0
+	str	x25, [sp, 64]
 	bl	zftl_get_free_sblk
-	uxth	w19, w0
+	and	w20, w0, 65535
 	mov	w0, 65535
-	mov	w24, w19
-	cmp	w19, w0
-	beq	.L2793
-	adrp	x1, .LANCHOR0
-	ubfiz	x25, x19, 2, 16
-	add	x0, x1, :lo12:.LANCHOR0
-	mov	x20, x1
-	ldr	x21, [x0,1096]
+	cmp	w20, w0
+	beq	.L2830
+	adrp	x0, .LANCHOR0
+	add	x1, x0, :lo12:.LANCHOR0
+	ubfiz	x25, x20, 2, 16
+	lsl	w23, w23, 1
+	mov	w24, w20
+	mov	x19, x0
+	ldr	x21, [x1, 1104]
 	add	x21, x21, x25
-	ldrb	w0, [x21,2]
-	tst	w0, 224
-	beq	.L2794
+	ldrb	w1, [x21, 2]
+	tst	w1, 224
+	beq	.L2831
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 656
 	mov	w2, 1012
-	add	x1, x1, 640
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L2794:
-	ldrb	w3, [x21,2]
-	bfi	w3, w22, 5, 3
-	ubfx	x1, x3, 3, 2
-	mov	w2, w3
-	orr	w1, w23, w1
-	bfi	w2, w1, 3, 2
-	strb	w2, [x21,2]
-	cbnz	w23, .L2795
-	and	w0, w2, 24
-	cmp	w0, 24
-	bne	.L2795
-	mov	w0, 1
-	bfi	w2, w0, 3, 2
-	strb	w2, [x21,2]
-.L2795:
-	add	x1, x20, :lo12:.LANCHOR0
-	ldr	x0, [x1,3392]
-	ldrh	w0, [x0,150]
-	cbz	w0, .L2796
-	ldr	x0, [x1,1096]
-	ldrh	w1, [x0,x25]
-	and	w1, w1, 2047
+.L2831:
+	ldrb	w0, [x21, 2]
+	bfi	w0, w22, 5, 3
+	ubfx	x1, x0, 3, 2
 	orr	w1, w23, w1
-	cbnz	w1, .L2796
+	bfi	w0, w1, 3, 2
+	strb	w0, [x21, 2]
+	and	w1, w0, 24
+	cmp	w1, 24
+	bne	.L2832
+	cbnz	w23, .L2832
+	mov	w1, 1
+	bfi	w0, w1, 3, 2
+	strb	w0, [x21, 2]
+.L2832:
+	add	x0, x19, :lo12:.LANCHOR0
+	ldr	x1, [x0, 3384]
+	ldrh	w1, [x1, 150]
+	cbz	w1, .L2833
+	ldr	x0, [x0, 1104]
+	ldrh	w0, [x0, x25]
+	tst	x0, 2047
+	bne	.L2833
+	cbnz	w23, .L2833
 	mov	w0, w24
 	bl	ftl_ink_check_sblk
-	b	.L2796
-.L2793:
-	adrp	x20, .LC202
+.L2833:
+	mov	w0, w20
+	ldr	x25, [sp, 64]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 80
+	ret
+.L2830:
 	bl	print_ftl_debug_info
-	add	x20, x20, :lo12:.LC202
-	mov	w1, w19
+	adrp	x19, .LC202
 	mov	w2, w22
-	mov	x0, x20
+	add	x19, x19, :lo12:.LC202
+	mov	w1, w20
+	mov	x0, x19
 	bl	printk
 	mov	w1, w21
 	mov	w0, 0
 	bl	zftl_get_free_sblk
-	uxth	w19, w0
-	mov	w1, w19
+	and	w20, w0, 65535
 	mov	w2, w22
-	mov	x0, x20
+	mov	w1, w20
+	mov	x0, x19
 	bl	printk
 	bl	dump_all_list_info
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 656
 	mov	w2, 1031
-	add	x1, x1, 640
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L2796:
-	mov	w0, w19
-	ldr	x25, [sp,64]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 80
-	ret
+	b	.L2833
 	.size	ftl_alloc_sblk, .-ftl_alloc_sblk
 	.align	2
 	.global	ftl_open_sblk_init
 	.type	ftl_open_sblk_init, %function
 ftl_open_sblk_init:
-	stp	x29, x30, [sp, -96]!
+	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	adrp	x20, .LC203
-	adrp	x22, .LANCHOR3
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
+	stp	x21, x22, [sp, 32]
+	adrp	x21, .LANCHOR0
+	stp	x23, x24, [sp, 48]
+	adrp	x22, .LC203
+	stp	x19, x20, [sp, 16]
+	adrp	x24, .LANCHOR3
+	stp	x25, x26, [sp, 64]
 	mov	x19, x0
-	mov	w21, w1
-	mov	w23, 65535
-	add	x24, x0, 16
-	mov	x25, x22
-	add	x20, x20, :lo12:.LC203
-.L2812:
-	mov	w0, w21
+	mov	w23, w1
+	add	x25, x24, :lo12:.LANCHOR3
+	add	x21, x21, :lo12:.LANCHOR0
+	add	x22, x22, :lo12:.LC203
+.L2843:
+	mov	w26, 65535
+.L2844:
+	mov	w0, w23
 	bl	ftl_alloc_sblk
-	uxth	w26, w0
-	cmp	w26, w23
-	beq	.L2812
+	and	w20, w0, 65535
+	cmp	w20, w26
+	beq	.L2844
 	mov	w1, 0
-	mov	w0, w26
+	mov	w0, w20
 	bl	ftl_erase_sblk
-	mov	x1, x24
-	mov	w0, w26
+	add	x1, x19, 16
+	mov	w0, w20
 	bl	ftl_get_blk_list_in_sblk
-	strh	w26, [x19]
-	add	x2, x22, :lo12:.LANCHOR3
-	uxtb	w0, w0
-	strb	w0, [x19,9]
-	cmp	w21, 2
-	strh	wzr, [x19,2]
-	mov	w3, 0
-	ldrh	w1, [x2,1384]
-	strb	wzr, [x19,5]
-	strh	wzr, [x19,10]
+	strh	w20, [x19]
+	add	x2, x24, :lo12:.LANCHOR3
+	and	w0, w0, 255
+	strb	w0, [x19, 9]
+	cmp	w23, 2
+	strh	wzr, [x19, 2]
+	ldrh	w1, [x2, 1376]
+	strb	wzr, [x19, 5]
+	strh	wzr, [x19, 10]
+	strb	w23, [x19, 4]
 	mul	w0, w1, w0
-	strh	w0, [x19,6]
-	strb	w21, [x19,4]
-	beq	.L2813
-	ldrb	w3, [x2,1329]
-	mul	w3, w1, w3
-	uxth	w3, w3
-.L2813:
-	add	x2, x25, :lo12:.LANCHOR3
-	adrp	x27, .LANCHOR0
-	strh	w3, [x19,12]
-	add	x27, x27, :lo12:.LANCHOR0
-	ubfiz	x28, x26, 1, 16
-	ldr	x0, [x2,1936]
-	add	x0, x0, w3, uxth 2
-	ldrb	w2, [x2,1329]
-	mul	w2, w1, w2
+	strh	w0, [x19, 6]
+	beq	.L2847
+	ldrb	w0, [x2, 1321]
+	mul	w0, w1, w0
+	and	w0, w0, 65535
+.L2845:
+	ldrb	w2, [x25, 1321]
+	ubfiz	x26, x20, 1, 16
+	ldr	x3, [x25, 1928]
+	strh	w0, [x19, 12]
+	mul	w2, w2, w1
+	add	x0, x3, w0, uxth 2
 	mov	w1, 255
 	lsl	w2, w2, 2
 	bl	ftl_memset
-	ldr	x0, [x27,1112]
-	ldrh	w1, [x19,6]
-	strh	w1, [x0,x28]
-	ldrb	w0, [x19,9]
-	cbnz	w0, .L2810
-.L2811:
-	mov	w1, w26
-	mov	x0, x20
+	ldr	x0, [x21, 1120]
+	ldrh	w1, [x19, 6]
+	strh	w1, [x0, x26]
+	ldrb	w0, [x19, 9]
+	cbnz	w0, .L2842
+	mov	w1, w20
+	mov	x0, x22
 	bl	printk
-	ldr	x0, [x27,1112]
+	ldr	x0, [x21, 1120]
 	mov	w1, -1
-	strh	w1, [x0,x28]
+	strh	w1, [x0, x26]
 	mov	w0, 7
-	strb	w0, [x19,4]
-	b	.L2812
-.L2810:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 96
+	strb	w0, [x19, 4]
+	b	.L2843
+.L2847:
+	mov	w0, 0
+	b	.L2845
+.L2842:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 80
 	ret
 	.size	ftl_open_sblk_init, .-ftl_open_sblk_init
 	.align	2
@@ -18199,137 +18092,137 @@ ftl_open_sblk_init:
 pm_alloc_new_blk:
 	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR0
 	add	x0, x19, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
 	adrp	x22, .LANCHOR3
-	ldr	x2, [x0,3392]
-	ldrh	w1, [x2,690]
-	add	w1, w1, 1
-	uxth	w0, w1
-	add	x1, x22, :lo12:.LANCHOR3
-	strh	w0, [x2,690]
-	ldrb	w1, [x1,1329]
-	cmp	w1, w0
-	bls	.L2818
-	add	x0, x2, w0, sxtw 1
-	ldrh	w1, [x0,672]
+	add	x2, x22, :lo12:.LANCHOR3
+	ldr	x1, [x0, 3384]
+	ldrb	w2, [x2, 1321]
+	ldrh	w0, [x1, 690]
+	add	w0, w0, 1
+	and	w0, w0, 65535
+	strh	w0, [x1, 690]
+	cmp	w2, w0
+	bls	.L2851
+	add	x0, x1, w0, sxtw 1
+	ldrh	w1, [x0, 672]
 	mov	w0, 65535
 	cmp	w1, w0
-	bne	.L2819
-.L2818:
+	bne	.L2852
+.L2851:
 	adrp	x23, .LC203
-	mov	w24, 65535
+	add	x20, x19, :lo12:.LANCHOR0
 	add	x23, x23, :lo12:.LC203
-.L2820:
+	mov	w24, 65535
+.L2853:
 	mov	w0, 1
 	bl	ftl_alloc_sblk
-	uxth	w21, w0
+	and	w21, w0, 65535
 	cmp	w21, w24
-	beq	.L2820
+	beq	.L2853
 	mov	w1, 0
 	mov	w0, w21
-	add	x20, x19, :lo12:.LANCHOR0
 	bl	ftl_erase_sblk
+	ldr	x1, [x20, 3384]
 	mov	w0, w21
-	ldr	x1, [x20,3392]
 	add	x1, x1, 672
 	bl	ftl_get_blk_list_in_sblk
-	uxth	w0, w0
-	cbnz	w0, .L2821
+	tst	w0, 65535
+	bne	.L2854
 	mov	w1, w21
 	mov	x0, x23
 	bl	printk
-	ldr	x1, [x20,1096]
-	add	x21, x1, w21, uxth 2
-	ldrb	w1, [x21,2]
-	orr	w1, w1, -32
-	strb	w1, [x21,2]
-	b	.L2820
-.L2821:
-	ldr	x1, [x20,3392]
-	adrp	x0, .LANCHOR5+960
+	ldr	x0, [x20, 1104]
+	add	x21, x0, w21, uxth 2
+	ldrb	w0, [x21, 2]
+	orr	w0, w0, -32
+	strb	w0, [x21, 2]
+	b	.L2853
+.L2854:
+	ldr	x0, [x20, 3384]
+	adrp	x1, .LANCHOR5+424
 	mov	w2, 1
-	mov	x20, 0
-	str	w2, [x0,#:lo12:.LANCHOR5+960]
-	mov	w2, 65535
-	strh	wzr, [x1,690]
-.L2823:
-	add	x3, x1, x20, lsl 1
-	uxth	w0, w20
-	ldrh	w3, [x3,416]
-	cmp	w3, w2
-	beq	.L2822
-	add	x20, x20, 1
-	cmp	x20, 128
-	bne	.L2823
+	mov	w20, 0
+	add	x0, x0, 416
+	str	w2, [x1, #:lo12:.LANCHOR5+424]
+	mov	w1, 65535
+	strh	wzr, [x0, 274]
+.L2856:
+	ldrh	w2, [x0]
+	cmp	w2, w1
+	beq	.L2855
+	add	w20, w20, 1
+	add	x0, x0, 2
+	and	w20, w20, 65535
+	cmp	w20, 128
+	bne	.L2856
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 672
 	mov	w2, 264
-	add	x1, x1, 656
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-	mov	w0, w20
-.L2822:
-	add	x1, x19, :lo12:.LANCHOR0
-	ldr	x1, [x1,3392]
-	add	x0, x1, w0, sxtw 1
-	strh	w21, [x0,416]
-	ldrh	w0, [x1,688]
-	add	w0, w0, 1
-	strh	w0, [x1,688]
-.L2819:
+.L2855:
+	add	x0, x19, :lo12:.LANCHOR0
+	ldr	x0, [x0, 3384]
+	add	x20, x0, w20, sxtw 1
+	strh	w21, [x20, 416]
+	ldrh	w1, [x0, 688]
+	add	w1, w1, 1
+	strh	w1, [x0, 688]
+.L2852:
 	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x1, [x0,3392]
-	ldrh	w0, [x1,690]
+	ldr	x1, [x0, 3384]
+	ldrh	w0, [x1, 690]
 	add	x0, x0, 336
-	ldrh	w20, [x1,x0,lsl 1]
+	ldrh	w20, [x1, x0, lsl 1]
 	mov	w0, 65533
 	sub	w1, w20, #1
 	cmp	w0, w1, uxth
-	bcs	.L2825
+	bcs	.L2858
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 672
 	mov	w2, 270
-	add	x1, x1, 656
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L2825:
+.L2858:
 	add	x19, x19, :lo12:.LANCHOR0
 	add	x22, x22, :lo12:.LANCHOR3
-	mov	w0, 24
-	ldrb	w2, [x19,1257]
-	ldr	x1, [x19,3392]
-	sub	w0, w0, w2
-	ldrh	w2, [x22,1312]
-	sub	w0, w0, w2
-	strh	wzr, [x1,696]
-	asr	w4, w20, w0
-	strh	w20, [x1,692]
-	strh	w4, [x1,694]
-	adrp	x1, .LANCHOR2
-	ldr	w1, [x1,#:lo12:.LANCHOR2]
-	tbz	x1, 12, .L2829
-	mov	w2, 1
-	mov	w1, w20
-	lsl	w2, w2, w0
+	mov	w2, 24
+	ldrb	w1, [x19, 1205]
+	ldr	x0, [x19, 3384]
+	sub	w2, w2, w1
+	ldrh	w1, [x22, 1304]
+	sub	w2, w2, w1
+	strh	wzr, [x0, 696]
+	asr	w4, w20, w2
+	strh	w20, [x0, 692]
+	strh	w4, [x0, 694]
+	adrp	x0, .LANCHOR2
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L2861
+	mov	w0, 1
+	and	w4, w4, 65535
+	lsl	w2, w0, w2
+	mov	w3, w20
 	adrp	x0, .LC204
-	add	x0, x0, :lo12:.LC204
 	sub	w2, w2, #1
-	mov	w3, w20
-	uxth	w4, w4
+	mov	w1, w20
+	add	x0, x0, :lo12:.LC204
 	bl	printk
-.L2829:
+.L2861:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
 	ldp	x29, x30, [sp], 64
 	ret
 	.size	pm_alloc_new_blk, .-pm_alloc_new_blk
@@ -18339,120 +18232,115 @@ pm_alloc_new_blk:
 pm_write_page:
 	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	adrp	x22, .LANCHOR4
+	stp	x21, x22, [sp, 32]
 	mov	w21, w0
-	stp	x23, x24, [sp,48]
-	add	x22, x22, :lo12:.LANCHOR4
-	adrp	x23, .LC0
-	stp	x25, x26, [sp,64]
-	stp	x19, x20, [sp,16]
-	stp	x27, x28, [sp,80]
+	stp	x23, x24, [sp, 48]
 	mov	x24, x1
+	stp	x25, x26, [sp, 64]
 	adrp	x25, .LANCHOR0
-	add	x23, x23, :lo12:.LC0
-	add	x22, x22, 680
-.L2835:
+	adrp	x26, .LANCHOR3
+	add	x22, x25, :lo12:.LANCHOR0
+	add	x23, x26, :lo12:.LANCHOR3
+	stp	x19, x20, [sp, 16]
+	stp	x27, x28, [sp, 80]
+.L2869:
 	add	x0, x25, :lo12:.LANCHOR0
-	adrp	x19, .LANCHOR0
-	ldr	x0, [x0,3392]
-	ldr	w1, [x0,48]
-	ldrh	w3, [x0,696]
+	ldr	x0, [x0, 3384]
+	ldr	w1, [x0, 48]
+	ldrh	w2, [x0, 696]
 	add	w1, w1, 1
-	str	w1, [x0,48]
-	adrp	x1, .LANCHOR3
-	add	x2, x1, :lo12:.LANCHOR3
-	mov	x20, x1
-	ldrh	w2, [x2,1384]
-	cmp	w3, w2
-	bcs	.L2836
-	ldrh	w1, [x0,692]
+	str	w1, [x0, 48]
+	add	x1, x26, :lo12:.LANCHOR3
+	ldrh	w1, [x1, 1376]
+	cmp	w2, w1
+	bcs	.L2870
+	ldrh	w1, [x0, 692]
 	mov	w0, 65535
 	cmp	w1, w0
-	bne	.L2837
-.L2836:
+	bne	.L2871
+.L2870:
 	bl	pm_alloc_new_blk
 	mov	w0, 0
 	bl	ftl_info_flush
-.L2837:
-	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x0, [x0,3392]
-	ldrh	w1, [x0,692]
+.L2871:
+	ldr	x0, [x22, 3384]
+	ldrh	w1, [x0, 692]
 	mov	w0, 65535
 	cmp	w1, w0
-	bne	.L2838
-	mov	x1, x22
+	bne	.L2872
+	adrp	x1, .LANCHOR4
+	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 696
 	mov	w2, 303
-	mov	x0, x23
+	adrp	x0, .LC0
+	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L2838:
-	add	x19, x19, :lo12:.LANCHOR0
-	add	x0, x20, :lo12:.LANCHOR3
-	adrp	x20, .LANCHOR5
-	add	x26, x20, :lo12:.LANCHOR5
-	ldr	x2, [x19,3392]
-	ldrh	w1, [x0,1418]
-	ldrh	w27, [x2,692]
-	ldrh	w0, [x2,696]
+.L2872:
+	ldr	x0, [x22, 3384]
+	adrp	x19, .LANCHOR5
+	ldrh	w1, [x23, 1410]
+	add	x20, x19, :lo12:.LANCHOR5
 	mov	w2, 64
+	ldrh	w27, [x0, 692]
+	ldrh	w0, [x0, 696]
 	madd	w27, w27, w1, w0
-	ldr	x0, [x26,968]
+	ldr	x0, [x20, 432]
 	mov	w1, 0
 	bl	ftl_memset
-	ldr	x0, [x26,968]
+	ldr	x0, [x20, 432]
 	str	w21, [x0]
-	ldr	x1, [x19,3392]
-	ldr	x0, [x26,968]
-	ldr	w1, [x1,48]
-	str	w1, [x0,4]
+	ldr	x1, [x22, 3384]
+	ldr	x0, [x20, 432]
+	ldr	w1, [x1, 48]
+	str	w1, [x0, 4]
 	mov	x0, x24
-	ldrb	w1, [x19,3360]
-	ldr	x28, [x26,968]
+	ldrb	w1, [x23, 1946]
+	ldr	x28, [x20, 432]
 	lsl	w1, w1, 9
 	bl	js_hash
-	str	w0, [x28,8]
-	ldr	x0, [x19,3392]
+	ldrb	w4, [x23, 1946]
 	mov	x2, x24
-	ldr	x3, [x26,968]
+	str	w0, [x28, 8]
 	mov	w1, w27
-	ldrb	w4, [x19,3360]
-	ldrb	w0, [x0,694]
+	ldr	x0, [x22, 3384]
+	ldr	x3, [x20, 432]
+	ldrb	w0, [x0, 694]
 	bl	ftl_prog_page
-	ldr	x3, [x19,3392]
-	ldrh	w2, [x3,696]
-	add	w2, w2, 1
-	uxth	w2, w2
-	strh	w2, [x3,696]
-	cmp	w2, 1
-	beq	.L2839
-	ldrb	w1, [x26,976]
-	cbz	w1, .L2840
-.L2839:
-	add	x20, x20, :lo12:.LANCHOR5
-	strb	wzr, [x20,976]
-	b	.L2835
-.L2840:
+	ldr	x2, [x22, 3384]
+	ldrh	w1, [x2, 696]
+	add	w1, w1, 1
+	and	w1, w1, 65535
+	strh	w1, [x2, 696]
+	cmp	w1, 1
+	beq	.L2873
+	ldrb	w1, [x20, 440]
+	cbz	w1, .L2874
+.L2873:
+	add	x19, x19, :lo12:.LANCHOR5
+	strb	wzr, [x19, 440]
+	b	.L2869
+.L2874:
 	cmn	w0, #1
-	bne	.L2842
-	adrp	x0, .LC205
+	bne	.L2876
 	mov	w1, w27
+	adrp	x0, .LC205
 	add	x0, x0, :lo12:.LC205
 	bl	printk
-	b	.L2835
-.L2842:
-	ldrh	w0, [x3,698]
+	b	.L2869
+.L2876:
+	ldrh	w0, [x2, 698]
 	cmp	w21, w0
-	bcs	.L2843
-	add	x21, x3, w21, uxtw 2
-	str	w27, [x21,704]
-.L2843:
+	bcs	.L2877
+	add	x21, x2, w21, uxtw 2
+	str	w27, [x21, 704]
+.L2877:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 96
 	ret
 	.size	pm_write_page, .-pm_write_page
@@ -18460,302 +18348,292 @@ pm_write_page:
 	.global	flash_info_flush
 	.type	flash_info_flush, %function
 flash_info_flush:
+	stp	x29, x30, [sp, -80]!
 	adrp	x0, .LANCHOR2
-	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	tbz	x0, 12, .L2848
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	tbz	x0, 12, .L2883
 	adrp	x2, .LANCHOR4
-	adrp	x0, .LC138
 	add	x2, x2, :lo12:.LANCHOR4
-	add	x0, x0, :lo12:.LC138
+	adrp	x0, .LC135
+	add	x2, x2, 712
 	mov	w1, 365
-	add	x2, x2, 696
+	add	x0, x0, :lo12:.LC135
 	bl	printk
-.L2848:
-	adrp	x22, .LANCHOR5
-	adrp	x23, .LANCHOR0
-	add	x0, x22, :lo12:.LANCHOR5
-	mov	w1, 0
+.L2883:
+	adrp	x19, .LANCHOR5
+	add	x19, x19, :lo12:.LANCHOR5
+	adrp	x20, .LANCHOR0
+	add	x22, x20, :lo12:.LANCHOR0
 	mov	w2, 64
-	add	x19, x23, :lo12:.LANCHOR0
-	adrp	x24, .LC207
-	adrp	x25, .LC208
-	ldr	x0, [x0,984]
-	mov	w26, 0
-	add	x24, x24, :lo12:.LC207
-	add	x25, x25, :lo12:.LC208
+	mov	w1, 0
+	ldr	x0, [x19, 448]
+	adrp	x23, .LC207
+	mov	w25, 21321
+	add	x23, x23, :lo12:.LC207
+	mov	w24, 0
+	movk	w25, 0x5359, lsl 16
 	bl	ftl_memset
-	ldr	x1, [x19,1128]
+	ldr	x1, [x22, 1048]
+	mov	w3, 16
+	mov	w2, 4
 	adrp	x0, .LC206
 	add	x0, x0, :lo12:.LC206
-	mov	w2, 4
-	mov	w3, 16
 	bl	rknand_print_hex
-	ldr	x19, [x19,1128]
-	add	x0, x19, 16
-	ldr	w1, [x19,8]
+	ldr	x21, [x22, 1048]
+	add	x0, x21, 16
+	ldr	w1, [x21, 8]
 	bl	js_hash
-	str	w0, [x19,12]
-.L2849:
-	add	x21, x22, :lo12:.LANCHOR5
-	add	x27, x23, :lo12:.LANCHOR0
-	mov	x0, x24
-	ldrb	w20, [x21,992]
-	ldrh	w19, [x21,994]
-	mov	w1, w20
-	ldrh	w28, [x27,2]
-	mov	w2, w19
+	str	w0, [x21, 12]
+.L2884:
+	ldrb	w26, [x19, 456]
+	mov	x0, x23
+	ldrh	w21, [x19, 458]
+	mov	w1, w26
+	ldrh	w20, [x22, 2]
+	mov	w2, w21
 	bl	printk
-	ldrh	w1, [x21,180]
-	ldrh	w0, [x21,994]
-	sub	w1, w1, #1
-	cmp	w0, w1
-	blt	.L2850
-	ldr	x1, [x27,1128]
-	strh	wzr, [x21,994]
-	ldr	w0, [x1,4]
+	ldrh	w0, [x19, 172]
+	ldrh	w1, [x19, 458]
+	sub	w0, w0, #1
+	cmp	w1, w0
+	blt	.L2885
+	ldr	x1, [x22, 1048]
+	strh	wzr, [x19, 458]
+	ldr	w0, [x1, 4]
 	add	w0, w0, 1
-	str	w0, [x1,4]
-	ldrb	w0, [x21,992]
-	ldr	x19, [x27,1128]
-	ldrb	w1, [x21,993]
-	strb	w0, [x21,993]
-	mov	x0, x19
-	strb	w1, [x21,992]
-	ldrh	w1, [x19,16]
+	str	w0, [x1, 4]
+	ldrb	w0, [x19, 456]
+	ldr	x21, [x22, 1048]
+	ldrb	w1, [x19, 457]
+	strb	w0, [x19, 457]
+	mov	x0, x21
+	strb	w1, [x19, 456]
+	ldrh	w1, [x21, 16]
 	add	w1, w1, 1
-	strh	w1, [x0,16]!
-	ldr	w1, [x19,8]
+	strh	w1, [x0, 16]!
+	ldr	w1, [x21, 8]
 	bl	js_hash
-	str	w0, [x19,12]
-	ldrb	w1, [x21,992]
+	ldrb	w20, [x19, 456]
+	str	w0, [x21, 12]
+	ldrh	w0, [x22, 2]
+	mul	w20, w20, w0
+.L2894:
+	mov	w1, w20
 	mov	w0, 0
-	ldrh	w19, [x27,2]
-	mul	w19, w1, w19
-	b	.L2858
-.L2850:
-	madd	w19, w20, w28, w19
-	cbnz	w0, .L2851
-.L2858:
-	mov	w1, w19
 	bl	flash_erase_block
-.L2851:
-	add	x2, x23, :lo12:.LANCHOR0
-	add	x20, x22, :lo12:.LANCHOR5
-	mov	w4, 4
+	b	.L2886
+.L2889:
+	mov	w24, 1
+	b	.L2884
+.L2885:
+	madd	w20, w20, w26, w21
+	cbz	w1, .L2894
+.L2886:
+	ldr	x1, [x22, 1048]
 	mov	w5, 1
-	ldr	x1, [x2,1128]
-	ldr	x0, [x20,984]
-	ldr	w1, [x1,4]
+	ldr	x0, [x19, 448]
+	mov	w4, 4
+	ldr	w1, [x1, 4]
 	str	w1, [x0]
-	mov	w0, 21321
-	movk	w0, 0x5359, lsl 16
-	ldr	x1, [x20,984]
-	str	w0, [x1,4]
-	mov	w1, w19
+	mov	w1, w20
+	ldr	x0, [x19, 448]
+	str	w25, [x0, 4]
 	mov	w0, 0
-	ldr	x2, [x2,1128]
-	ldr	x3, [x20,984]
+	ldr	x3, [x19, 448]
+	ldr	x2, [x22, 1048]
 	bl	flash_prog_page_en
 	cmn	w0, #1
-	ldrh	w1, [x20,994]
+	ldrh	w1, [x19, 458]
 	add	w1, w1, 1
-	strh	w1, [x20,994]
-	bne	.L2852
-	mov	x0, x25
-	mov	w1, w19
+	strh	w1, [x19, 458]
+	bne	.L2887
+	mov	w1, w20
+	adrp	x0, .LC208
+	add	x0, x0, :lo12:.LC208
 	bl	printk
-	b	.L2849
-.L2852:
-	cbnz	w26, .L2859
-	mov	w26, 1
-	b	.L2849
-.L2859:
+	b	.L2884
+.L2887:
+	cbz	w24, .L2889
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 96
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 80
 	ret
 	.size	flash_info_flush, .-flash_info_flush
 	.align	2
 	.global	flash_info_blk_init
 	.type	flash_info_blk_init, %function
 flash_info_blk_init:
-	adrp	x0, .LANCHOR2
 	stp	x29, x30, [sp, -80]!
+	adrp	x0, .LANCHOR2
 	add	x29, sp, 0
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	str	x25, [sp,64]
-	adrp	x20, .LANCHOR0
-	tbz	x0, 12, .L2861
-	add	x4, x20, :lo12:.LANCHOR0
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	stp	x21, x22, [sp, 32]
+	adrp	x22, .LANCHOR0
+	stp	x19, x20, [sp, 16]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	tbz	x0, 12, .L2896
+	add	x0, x22, :lo12:.LANCHOR0
 	adrp	x2, .LANCHOR4
-	adrp	x0, .LC209
 	add	x2, x2, :lo12:.LANCHOR4
-	add	x0, x0, :lo12:.LC209
-	mov	w1, 50
-	ldr	x4, [x4,1128]
-	add	x2, x2, 720
 	mov	w3, 2048
+	add	x2, x2, 736
+	mov	w1, 50
+	ldr	x4, [x0, 1048]
+	adrp	x0, .LC209
+	add	x0, x0, :lo12:.LC209
 	bl	printk
-.L2861:
+.L2896:
+	adrp	x20, .LANCHOR5
+	mov	w25, 21321
+	add	x21, x20, :lo12:.LANCHOR5
+	add	x19, x22, :lo12:.LANCHOR0
 	mov	w24, 4
-	adrp	x25, .LANCHOR5
-.L2862:
+	movk	w25, 0x5359, lsl 16
+.L2900:
 	mov	w23, 0
-.L2865:
-	add	x19, x20, :lo12:.LANCHOR0
-	add	x21, x25, :lo12:.LANCHOR5
-	mov	w0, 0
+.L2899:
+	ldrh	w1, [x19, 2]
 	mov	w4, 4
-	adrp	x22, .LANCHOR5
-	ldrh	w1, [x19,2]
-	ldr	x2, [x19,1128]
-	ldr	x3, [x21,984]
-	madd	w1, w24, w1, w23
+	ldr	x2, [x19, 1048]
+	mov	w0, 0
+	ldr	x3, [x21, 448]
+	madd	w1, w1, w24, w23
 	bl	flash_read_page_en
 	cmn	w0, #1
-	beq	.L2863
-	ldr	x2, [x19,1128]
-	mov	w0, 21321
-	movk	w0, 0x5359, lsl 16
-	ldr	w1, [x2]
-	cmp	w1, w0
-	beq	.L2864
-.L2863:
+	beq	.L2897
+	ldr	x2, [x19, 1048]
+	ldr	w0, [x2]
+	cmp	w0, w25
+	beq	.L2898
+.L2897:
 	add	w23, w23, 1
 	cmp	w23, 4
-	bne	.L2865
+	bne	.L2899
 	add	w24, w24, 1
 	cmp	w24, 16
-	bne	.L2862
-	b	.L2874
-.L2864:
-	ldrb	w1, [x2,36]
+	bne	.L2900
+.L2926:
+	mov	w0, -1
+.L2895:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	ret
+.L2908:
+	ldr	x0, [x19, 1048]
+	ldr	w1, [x0]
+	cmp	w1, w25
+	bne	.L2909
+	ldr	w21, [x0, 4]
+.L2902:
+	add	x19, x20, :lo12:.LANCHOR5
+	add	x23, x22, :lo12:.LANCHOR0
 	mov	w4, 4
-	ldrh	w3, [x19,2]
-	strb	w1, [x21,992]
-	ldrb	w0, [x2,37]
-	mul	w1, w1, w3
-	ldr	x3, [x21,984]
-	strb	w0, [x21,993]
+	ldrh	w0, [x23, 2]
+	ldrb	w1, [x19, 457]
+	ldr	x3, [x19, 448]
+	ldr	x2, [x23, 1048]
+	mul	w1, w1, w0
 	mov	w0, 0
-	mov	w21, 0
 	bl	flash_read_page_en
 	cmn	w0, #1
-	beq	.L2867
-	ldr	x0, [x19,1128]
+	beq	.L2903
+	ldr	x0, [x23, 1048]
 	mov	w1, 21321
 	movk	w1, 0x5359, lsl 16
-	mov	w21, 0
 	ldr	w2, [x0]
 	cmp	w2, w1
-	bne	.L2867
-	ldr	w21, [x0,4]
-.L2867:
-	add	x19, x22, :lo12:.LANCHOR5
-	add	x23, x20, :lo12:.LANCHOR0
-	mov	w0, 0
+	bne	.L2903
+	ldr	w1, [x0, 4]
+	cmp	w21, w1
+	bcs	.L2903
+	ldrb	w1, [x0, 37]
+	ldrb	w0, [x0, 36]
+	strb	w1, [x19, 456]
+	strb	w0, [x19, 457]
+.L2903:
+	add	x21, x20, :lo12:.LANCHOR5
+	add	x19, x22, :lo12:.LANCHOR0
 	mov	w4, 4
-	ldrb	w2, [x19,993]
-	ldrh	w1, [x23,2]
-	ldr	x3, [x19,984]
-	mul	w1, w2, w1
-	ldr	x2, [x23,1128]
-	bl	flash_read_page_en
-	cmn	w0, #1
-	bne	.L2891
-.L2868:
-	add	x19, x22, :lo12:.LANCHOR5
-	add	x21, x20, :lo12:.LANCHOR0
 	mov	w0, 0
-	mov	w4, 4
-	ldrb	w1, [x19,992]
-	ldr	x2, [x21,1128]
-	ldr	x3, [x19,984]
+	mov	w26, 21321
+	mov	x20, x19
+	ldrb	w1, [x21, 456]
+	mov	w23, 0
+	ldr	x2, [x19, 1048]
+	movk	w26, 0x5359, lsl 16
+	ldr	x3, [x21, 448]
 	bl	flash_get_last_written_page
-	ldrh	w23, [x21,2]
-	ldrb	w1, [x19,992]
-	uxth	w24, w0
-	add	w0, w24, 1
-	mov	w21, 0
-	strh	w0, [x19,994]
-	mul	w23, w1, w23
-.L2869:
-	sub	w19, w24, w21
-	sxth	w19, w19
-	tbz	w19, #31, .L2872
+	and	w25, w0, 65535
+	add	w1, w25, 1
+	ldrb	w24, [x21, 456]
+	strh	w1, [x21, 458]
+	ldrh	w1, [x19, 2]
+	mul	w24, w24, w1
+	add	w24, w24, w0, sxth
+.L2904:
+	sub	w0, w25, w23
+	sxth	w19, w0
+	tbz	w19, #31, .L2907
 	cmn	w19, #1
-	bne	.L2871
-	add	x20, x20, :lo12:.LANCHOR0
+	bne	.L2906
+	add	x22, x22, :lo12:.LANCHOR0
+	ldr	x0, [x22, 1048]
+	ldr	w1, [x0]
 	adrp	x0, .LC210
 	add	x0, x0, :lo12:.LC210
-	ldr	x1, [x20,1128]
-	ldr	w1, [x1]
 	bl	printk
-.L2874:
-	mov	w0, -1
-	b	.L2890
-.L2891:
-	ldr	x0, [x23,1128]
-	mov	w1, 21321
-	movk	w1, 0x5359, lsl 16
-	ldr	w2, [x0]
-	cmp	w2, w1
-	bne	.L2868
-	ldr	w1, [x0,4]
-	cmp	w21, w1
-	bcs	.L2868
-	ldrb	w1, [x0,37]
-	ldrb	w0, [x0,36]
-	strb	w1, [x19,992]
-	strb	w0, [x19,993]
-	b	.L2868
-.L2872:
-	add	x25, x20, :lo12:.LANCHOR0
-	add	x3, x22, :lo12:.LANCHOR5
-	mov	w0, 0
-	add	w1, w19, w23
+	b	.L2926
+.L2907:
+	ldr	x2, [x20, 1048]
 	mov	w4, 4
-	ldr	x2, [x25,1128]
-	ldr	x3, [x3,984]
+	ldr	x3, [x21, 448]
+	sub	w1, w24, w23
+	mov	w0, 0
 	bl	flash_read_page_en
 	cmn	w0, #1
-	beq	.L2870
-	ldr	x0, [x25,1128]
-	ldr	w1, [x0]
-	mov	w0, 21321
-	movk	w0, 0x5359, lsl 16
-	cmp	w1, w0
-	beq	.L2871
-.L2870:
-	add	w21, w21, 1
-	b	.L2869
-.L2871:
-	cmp	w21, 1
-	mov	w0, 0
-	bls	.L2890
+	beq	.L2905
+	ldr	x0, [x20, 1048]
+	ldr	w0, [x0]
+	cmp	w0, w26
+	beq	.L2906
+.L2905:
+	add	w23, w23, 1
+	b	.L2904
+.L2906:
+	cmp	w23, 1
+	bls	.L2910
 	bl	flash_info_flush
+.L2910:
 	mov	w0, 0
-.L2890:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldr	x25, [sp,64]
-	ldp	x29, x30, [sp], 80
-	ret
+	b	.L2895
+.L2898:
+	ldrb	w1, [x2, 37]
+	mov	w4, 4
+	ldrb	w0, [x2, 36]
+	strb	w1, [x21, 457]
+	ldrh	w1, [x19, 2]
+	ldr	x3, [x21, 448]
+	strb	w0, [x21, 456]
+	mul	w1, w1, w0
+	mov	w0, 0
+	bl	flash_read_page_en
+	cmn	w0, #1
+	bne	.L2908
+.L2909:
+	mov	w21, 0
+	b	.L2902
 	.size	flash_info_blk_init, .-flash_info_blk_init
 	.align	2
 	.global	nand_flash_init
@@ -18763,1240 +18641,1231 @@ flash_info_blk_init:
 nand_flash_init:
 	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR2
 	mov	x19, x0
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	ldr	w0, [x20,#:lo12:.LANCHOR2]
-	str	x25, [sp,64]
-	tbz	x0, 12, .L2893
+	stp	x21, x22, [sp, 32]
+	ldr	w0, [x20, #:lo12:.LANCHOR2]
+	stp	x23, x24, [sp, 48]
+	str	x25, [sp, 64]
+	tbz	x0, 12, .L2928
 	adrp	x2, .LANCHOR4
-	adrp	x0, .LC138
 	add	x2, x2, :lo12:.LANCHOR4
-	add	x0, x0, :lo12:.LC138
+	adrp	x0, .LC135
+	add	x2, x2, 760
 	mov	w1, 3450
-	add	x2, x2, 744
+	add	x0, x0, :lo12:.LC135
 	bl	printk
-.L2893:
+.L2928:
 	adrp	x21, .LANCHOR5
-	mov	x0, x19
 	add	x23, x21, :lo12:.LANCHOR5
+	mov	x0, x19
 	adrp	x19, .LANCHOR0
 	add	x22, x19, :lo12:.LANCHOR0
 	mov	w25, 44
-	add	x24, x22, 1272
-	str	wzr, [x23,324]
+	str	wzr, [x23, 332]
 	bl	nandc_init
+	add	x0, x20, :lo12:.LANCHOR2
+	mov	w2, 8
+	add	x0, x0, 8
+	str	x0, [x22, 1144]
 	mov	w0, 1
-	add	x1, x20, :lo12:.LANCHOR2
-	add	x1, x1, 8
-	strb	w0, [x22,1153]
+	strb	w0, [x22, 1153]
 	mov	w0, 3
-	str	x1, [x22,1144]
-	strb	w0, [x22,1257]
+	strb	w0, [x22, 1205]
+	add	x0, x22, 1196
+	add	x22, x22, 1216
 	mov	w1, 0
-	mov	w2, 8
-	add	x0, x22, 1248
+	mov	x24, x22
 	bl	ftl_memset
-	add	x0, x23, 184
-	mov	w1, 0
-	mov	w2, 32
+	add	x0, x23, 176
 	mov	w23, 0
+	mov	w2, 32
+	mov	w1, 0
 	bl	ftl_memset
-.L2899:
+.L2934:
+	mov	x1, x22
 	mov	w0, w23
-	mov	x1, x24
 	bl	flash_read_id
-	cbnz	w23, .L2894
-	ldrb	w0, [x22,1272]
-	add	x1, x22, 1272
+	cbnz	w23, .L2929
+	ldrb	w0, [x24]
 	sub	w0, w0, #1
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 253
-	bls	.L2895
-.L2897:
+	bls	.L2930
+.L2932:
 	mov	w22, -2
-	b	.L2977
-.L2895:
-	ldrb	w0, [x1,1]
+.L2927:
+	mov	w0, w22
+	ldr	x25, [sp, 64]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 80
+	ret
+.L2930:
+	ldrb	w0, [x24, 1]
 	cmp	w0, 255
-	beq	.L2897
-.L2894:
-	ldrb	w0, [x24]
+	beq	.L2932
+.L2929:
+	ldrb	w0, [x22]
 	cmp	w0, 181
-	bne	.L2898
-	strb	w25, [x24]
-.L2898:
+	bne	.L2933
+	strb	w25, [x22]
+.L2933:
 	add	w23, w23, 1
-	add	x24, x24, 8
-	uxtb	w23, w23
+	add	x22, x22, 8
+	and	w23, w23, 255
 	cmp	w23, 4
-	bne	.L2899
-	add	x23, x20, :lo12:.LANCHOR2
-	add	x24, x19, :lo12:.LANCHOR0
-	add	x23, x23, 440
-	mov	w22, 0
-	add	x24, x24, 1272
-.L2902:
-	ldrb	w2, [x23]
-	add	x0, x23, 1
-	mov	x1, x24
+	bne	.L2934
+	add	x7, x20, :lo12:.LANCHOR2
+	add	x9, x19, :lo12:.LANCHOR0
+	add	x7, x7, 441
+	add	x9, x9, 1216
+	mov	x8, 0
+.L2937:
+	ldrb	w2, [x7, -1]
+	mov	w10, w8
+	lsl	x24, x8, 5
+	mov	x1, x9
+	mov	x0, x7
 	bl	flash_mem_cmp8
-	cbnz	w0, .L2900
-	add	x1, x20, :lo12:.LANCHOR2
-	ubfiz	x22, x22, 5, 32
-	add	x0, x1, 440
-	adds	x22, x0, x22
-	beq	.L2897
-	ldrb	w3, [x22,22]
+	cbnz	w0, .L2935
+	add	x2, x20, :lo12:.LANCHOR2
+	ubfiz	x10, x10, 5, 32
+	add	x0, x2, 440
+	add	x1, x2, 2008
+	add	x24, x0, x24
+	add	x0, x0, x10
+	ldrb	w3, [x0, 22]
 	mov	x0, 0
-	b	.L2904
-.L2900:
-	add	w22, w22, 1
-	add	x23, x23, 32
-	cmp	w22, 49
-	bne	.L2902
-	b	.L2897
-.L2904:
-	add	x4, x1, x0, lsl 5
+.L2936:
+	lsl	x4, x0, 5
 	mov	w2, w0
-	ldrb	w4, [x4,2008]
+	ldrb	w4, [x4, x1]
 	cmp	w4, w3
-	beq	.L2903
+	beq	.L2938
 	add	x0, x0, 1
 	cmp	x0, 4
-	bne	.L2904
+	bne	.L2936
 	mov	w2, w0
-.L2903:
-	add	x23, x20, :lo12:.LANCHOR2
-	add	x24, x19, :lo12:.LANCHOR0
-	add	x1, x23, 2008
-	ubfiz	x2, x2, 5, 32
-	add	x1, x1, x2
-	add	x0, x24, 1160
+.L2938:
+	add	x22, x20, :lo12:.LANCHOR2
+	ubfiz	x1, x2, 5, 32
+	add	x0, x22, 2008
+	add	x23, x19, :lo12:.LANCHOR0
+	add	x1, x0, x1
 	mov	w2, 32
-	add	x23, x23, 8
+	add	x0, x23, 1160
+	add	x22, x22, 8
 	bl	ftl_memcpy
-	mov	x0, x23
-	mov	x1, x22
 	mov	w2, 32
+	mov	x1, x24
+	mov	x0, x22
 	bl	ftl_memcpy
-	ldrb	w0, [x24,1028]
+	ldrb	w0, [x23, 1028]
 	cmp	w0, 8
-	bhi	.L2905
-	ldrb	w0, [x23,20]
-	cmp	w0, 60
-	bls	.L2905
-	mov	w0, 60
-	strb	w0, [x23,20]
-.L2905:
-	ldr	w0, [x20,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L2939
+	bhi	.L2939
+	ldrb	w1, [x22, 20]
+	cmp	w1, 60
+	bls	.L2940
+	mov	w1, 60
+	strb	w1, [x22, 20]
+.L2940:
+	cmp	w0, 6
+	beq	.L2932
+.L2939:
+	ldr	w0, [x20, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L2941
 	adrp	x2, .LANCHOR4
-	adrp	x0, .LC138
 	add	x2, x2, :lo12:.LANCHOR4
-	add	x0, x0, :lo12:.LC138
-	mov	w1, 3477
-	add	x2, x2, 744
+	adrp	x0, .LC135
+	add	x2, x2, 760
+	mov	w1, 3480
+	add	x0, x0, :lo12:.LC135
 	bl	printk
-.L2939:
+.L2941:
 	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x1, [x0,1144]
-	ldrh	w1, [x1,10]
+	ldr	x1, [x0, 1144]
+	ldrh	w1, [x1, 10]
 	cmp	w1, 1023
-	bls	.L2906
+	bls	.L2942
 	mov	w1, 2
-	strb	w1, [x0,1257]
-.L2906:
+	strb	w1, [x0, 1205]
+.L2942:
 	add	x23, x21, :lo12:.LANCHOR5
-	mov	w0, 16384
 	add	x22, x19, :lo12:.LANCHOR0
-	add	x24, x20, :lo12:.LANCHOR2
+	mov	w0, 16384
 	bl	ftl_malloc
-	str	x0, [x23,336]
+	add	x24, x20, :lo12:.LANCHOR2
+	str	x0, [x23, 352]
 	mov	w0, 16384
 	bl	ftl_malloc
-	str	x0, [x23,296]
+	str	x0, [x23, 304]
 	mov	w0, 2048
-	bl	ftl_malloc
-	str	x0, [x22,1128]
+	bl	ftl_dma32_malloc
+	str	x0, [x22, 1048]
 	mov	w0, 64
-	bl	ftl_malloc
-	str	x0, [x23,344]
+	bl	ftl_dma32_malloc
+	str	x0, [x23, 344]
 	mov	w0, 64
-	bl	ftl_malloc
-	str	x0, [x23,312]
+	bl	ftl_dma32_malloc
+	str	x0, [x23, 320]
 	mov	w0, 64
-	bl	ftl_malloc
-	strb	wzr, [x23,996]
-	str	x0, [x23,984]
+	bl	ftl_dma32_malloc
+	strb	wzr, [x23, 460]
+	str	x0, [x23, 448]
 	bl	flash_die_info_init
-	ldrb	w0, [x24,26]
+	ldrb	w0, [x24, 26]
 	bl	flash_lsb_page_tbl_build
-	ldrb	w0, [x24,28]
+	ldrb	w0, [x24, 28]
 	bl	nandc_bch_sel
-	str	xzr, [x23,328]
-	ldr	x3, [x22,1144]
+	str	xzr, [x23, 336]
+	ldr	x3, [x22, 1144]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
-	ldrh	w0, [x3,16]
+	ldrh	w0, [x3, 16]
 	ubfx	x1, x0, 8, 3
-	strb	w1, [x22,1304]
+	strb	w1, [x22, 1248]
 	ubfx	x1, x0, 3, 1
-	strb	w1, [x23,360]
+	strb	w1, [x23, 368]
 	ubfx	x1, x0, 4, 1
-	strb	w1, [x22,1305]
+	strb	w1, [x22, 1250]
 	ubfx	x1, x0, 12, 1
-	strb	w1, [x2,1344]
+	strb	w1, [x2, 1336]
 	ubfx	x1, x0, 13, 1
-	strb	w1, [x2,1330]
+	strb	w1, [x2, 1322]
 	ubfx	x1, x0, 11, 1
-	strb	w1, [x22,1268]
-	ldrb	w1, [x3,31]
+	strb	w1, [x22, 1212]
+	ldrb	w1, [x3, 31]
 	ubfx	x4, x1, 1, 1
-	strb	w4, [x2,1956]
+	strb	w4, [x2, 1950]
 	ubfx	x4, x1, 2, 1
-	strb	w4, [x23,997]
+	strb	w4, [x23, 461]
 	ubfx	x4, x0, 14, 1
 	lsr	w0, w0, 15
-	strb	w0, [x2,1331]
+	strb	w0, [x2, 1323]
 	ubfx	x2, x1, 3, 1
-	strb	w2, [x22,1256]
+	ldrb	w0, [x3, 28]
 	ubfx	x1, x1, 4, 1
-	ldrb	w2, [x22,1028]
-	ldrb	w0, [x3,28]
-	strb	w1, [x22,1269]
-	cmp	w2, 9
+	strb	w2, [x22, 1204]
+	strb	w1, [x22, 1213]
 	mov	w1, 60
-	strb	w4, [x22,1]
-	strb	w0, [x19,#:lo12:.LANCHOR0]
-	strb	w1, [x22,1152]
-	bne	.L2907
+	ldrb	w2, [x22, 1028]
+	strb	w4, [x22, 1]
+	strb	w0, [x19, #:lo12:.LANCHOR0]
+	cmp	w2, 9
+	strb	w1, [x22, 1152]
+	bne	.L2943
 	mov	w1, 70
-	strb	w1, [x22,1152]
-.L2907:
+	strb	w1, [x22, 1152]
+.L2943:
 	add	x1, x19, :lo12:.LANCHOR0
-	strb	w0, [x1,1154]
+	strb	w0, [x1, 1154]
 	add	x0, x20, :lo12:.LANCHOR2
 	add	x0, x0, 8
-	ldrb	w3, [x0,31]
-	tbz	x3, 0, .L2908
-	ldrb	w0, [x0,29]
-	cbz	w0, .L2909
+	ldrb	w3, [x0, 31]
+	tbz	x3, 0, .L2944
+	ldrb	w0, [x0, 29]
+	cbz	w0, .L2945
 	mov	w0, 2
-	b	.L2979
-.L2909:
-	mov	w0, 3
-.L2979:
-	strb	w0, [x1,1154]
-.L2908:
+.L3007:
+	strb	w0, [x1, 1154]
+.L2944:
 	cmp	w2, 8
-	bne	.L2910
+	bne	.L2946
 	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1272]
-	cmp	w0, 137
-	beq	.L2940
-	cmp	w0, 44
-	bne	.L2910
-.L2940:
-	add	x0, x20, :lo12:.LANCHOR2
-	ldrb	w0, [x0,36]
-	cmp	w0, 3
-	bne	.L2910
-	add	x0, x19, :lo12:.LANCHOR0
-	strb	wzr, [x0,1154]
-.L2910:
+	mov	w2, 137
+	ldrb	w1, [x0, 1216]
+	cmp	w1, 44
+	ccmp	w1, w2, 4, ne
+	bne	.L2946
+	add	x1, x20, :lo12:.LANCHOR2
+	ldrb	w1, [x1, 36]
+	cmp	w1, 3
+	bne	.L2946
+	strb	wzr, [x0, 1154]
+.L2946:
 	add	x1, x20, :lo12:.LANCHOR2
 	add	x2, x19, :lo12:.LANCHOR0
 	add	x1, x1, 8
-	ldrb	w0, [x1,19]
-	ldrh	w1, [x1,16]
-	strb	w0, [x2,1136]
-	tbz	x1, 6, .L2913
+	ldrb	w0, [x1, 19]
+	ldrh	w1, [x1, 16]
+	strb	w0, [x2, 1136]
+	tbz	x1, 6, .L2948
 	sub	w1, w0, #17
-	cmp	w0, 21
-	cset	w2, eq
-	uxtb	w1, w1
+	and	w1, w1, 255
 	cmp	w1, 2
-	bls	.L2941
-	cbz	w2, .L2914
-.L2941:
-	add	x0, x21, :lo12:.LANCHOR5
-	adrp	x1, micron_read_retrial
-	add	x1, x1, :lo12:micron_read_retrial
-	str	x1, [x0,328]
-	mov	w1, 15
-	cbz	w2, .L2980
-	mov	w1, 4
-.L2980:
-	strb	w1, [x0,320]
-	b	.L2913
-.L2914:
+	ccmp	w0, 21, 4, hi
+	bne	.L2949
+	add	x1, x21, :lo12:.LANCHOR5
+	adrp	x2, micron_read_retrial
+	add	x2, x2, :lo12:micron_read_retrial
+	cmp	w0, 21
+	str	x2, [x1, 336]
+	beq	.L2950
+	mov	w0, 15
+.L3009:
+	strb	w0, [x1, 328]
+.L2948:
+	ldr	w0, [x20, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L2959
+	adrp	x2, .LANCHOR4
+	add	x2, x2, :lo12:.LANCHOR4
+	adrp	x0, .LC135
+	add	x2, x2, 760
+	mov	w1, 3573
+	add	x0, x0, :lo12:.LC135
+	bl	printk
+.L2959:
+	add	x0, x19, :lo12:.LANCHOR0
+	ldrb	w1, [x0, 1248]
+	strb	wzr, [x0, 1192]
+	tbz	x1, 0, .L2960
+	ldrb	w0, [x0, 1216]
+	cmp	w0, 155
+	beq	.L2961
+	mov	w0, 4
+	bl	flash_set_interface_mode
+	mov	w0, 4
+	bl	nandc_set_if_mode
+.L2961:
+	mov	w0, 1
+	bl	flash_set_interface_mode
+	mov	w0, 1
+.L3012:
+	bl	nandc_set_if_mode
+	bl	flash_info_blk_init
+	mov	w22, w0
+	cmn	w0, #1
+	bne	.L2963
+	add	x19, x19, :lo12:.LANCHOR0
+	mov	w1, 17
+	ldr	x0, [x19, 1048]
+	strb	wzr, [x19, 1208]
+	strb	w1, [x0, 32]
+	mov	w0, 0
+	bl	zftl_flash_exit_slc_mode
+	b	.L2927
+.L2935:
+	add	x8, x8, 1
+	add	x7, x7, 32
+	cmp	x8, 49
+	bne	.L2937
+	b	.L2932
+.L2945:
+	mov	w0, 3
+	b	.L3007
+.L2950:
+	mov	w0, 4
+	b	.L3009
+.L2949:
 	sub	w1, w0, #65
-	uxtb	w1, w1
-	cmp	w1, 1
-	bls	.L2942
 	cmp	w0, 33
-	bne	.L2918
-.L2942:
+	and	w1, w1, 255
+	ccmp	w1, 1, 0, ne
+	bhi	.L2952
 	add	x0, x21, :lo12:.LANCHOR5
 	adrp	x1, toshiba_read_retrial
 	add	x1, x1, :lo12:toshiba_read_retrial
-	mov	w2, 4
-	str	x1, [x0,328]
-	add	x1, x19, :lo12:.LANCHOR0
-	strb	w2, [x1,1137]
-	b	.L2983
-.L2918:
+	str	x1, [x0, 336]
+	mov	w1, 4
+	strb	w1, [x2, 1137]
+.L3013:
+	mov	w1, 7
+.L3011:
+	strb	w1, [x0, 328]
+	b	.L2948
+.L2952:
+	sub	w3, w0, #34
 	sub	w1, w0, #67
-	uxtb	w1, w1
-	cmp	w1, 1
-	sub	w1, w0, #34
-	cset	w2, ls
-	uxtb	w1, w1
-	cmp	w1, 1
-	bls	.L2943
-	cbz	w2, .L2920
-.L2943:
-	add	x3, x21, :lo12:.LANCHOR5
-	adrp	x1, toshiba_read_retrial
-	add	x1, x1, :lo12:toshiba_read_retrial
+	and	w3, w3, 255
+	and	w1, w1, 255
+	cmp	w3, 1
+	ccmp	w1, 1, 0, hi
+	bhi	.L2953
+	add	x2, x21, :lo12:.LANCHOR5
+	adrp	x3, toshiba_read_retrial
+	add	x3, x3, :lo12:toshiba_read_retrial
 	cmp	w0, 35
-	str	x1, [x3,328]
-	beq	.L2922
-	cmp	w0, 68
-	beq	.L2922
+	str	x3, [x2, 336]
+	mov	w3, 68
+	ccmp	w0, w3, 4, ne
+	beq	.L2954
 	mov	w0, 7
-	strb	w0, [x3,320]
-	b	.L2923
-.L2922:
-	add	x0, x21, :lo12:.LANCHOR5
-	mov	w1, 17
-	strb	w1, [x0,320]
-.L2923:
+.L3008:
+	strb	w0, [x2, 328]
+	cmp	w1, 1
 	add	x0, x19, :lo12:.LANCHOR0
+	bhi	.L2956
 	mov	w1, 4
-	cbnz	w2, .L2981
+.L3010:
+	strb	w1, [x0, 1137]
+	b	.L2948
+.L2954:
+	mov	w0, 17
+	b	.L3008
+.L2956:
 	mov	w1, 5
-.L2981:
-	strb	w1, [x0,1137]
-	b	.L2913
-.L2920:
+	b	.L3010
+.L2953:
 	sub	w1, w0, #36
-	uxtb	w1, w1
+	and	w1, w1, 255
 	cmp	w1, 1
-	bhi	.L2925
+	bhi	.L2957
 	add	x0, x21, :lo12:.LANCHOR5
 	adrp	x1, toshiba_3d_read_retrial
 	add	x1, x1, :lo12:toshiba_3d_read_retrial
-	str	x1, [x0,328]
-.L2983:
-	mov	w1, 7
-	b	.L2980
-.L2925:
+	str	x1, [x0, 336]
+	b	.L3013
+.L2957:
 	cmp	w0, 50
-	bne	.L2926
+	bne	.L2958
 	add	x0, x21, :lo12:.LANCHOR5
 	adrp	x1, samsung_read_retrial
 	add	x1, x1, :lo12:samsung_read_retrial
-	str	x1, [x0,328]
+	str	x1, [x0, 336]
 	mov	w1, 25
-	b	.L2980
-.L2926:
+	b	.L3011
+.L2958:
 	cmp	w0, 81
-	bne	.L2913
+	bne	.L2948
 	add	x0, x21, :lo12:.LANCHOR5
 	adrp	x1, ymtc_3d_read_retrial
 	add	x1, x1, :lo12:ymtc_3d_read_retrial
-	str	x1, [x0,328]
+	strb	wzr, [x2, 1251]
+	str	x1, [x0, 336]
 	mov	w1, 7
-	strb	w1, [x0,320]
-	add	x0, x19, :lo12:.LANCHOR0
-	strb	wzr, [x0,1193]
-.L2913:
-	ldr	w0, [x20,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L2927
-	adrp	x2, .LANCHOR4
-	adrp	x0, .LC138
-	add	x2, x2, :lo12:.LANCHOR4
-	add	x0, x0, :lo12:.LC138
-	mov	w1, 3570
-	add	x2, x2, 744
-	bl	printk
-.L2927:
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w1, [x0,1304]
-	strb	wzr, [x0,1192]
-	tbz	x1, 0, .L2928
-	ldrb	w0, [x0,1272]
-	cmp	w0, 155
-	beq	.L2929
-	mov	w0, 4
-	bl	flash_set_interface_mode
-	mov	w0, 4
-	bl	nandc_set_if_mode
-.L2929:
-	mov	w0, 1
-	bl	flash_set_interface_mode
-	mov	w0, 1
-	b	.L2982
-.L2928:
+	strb	w1, [x0, 328]
+	b	.L2948
+.L2960:
 	mov	w0, 4
-.L2982:
-	bl	nandc_set_if_mode
-	bl	flash_info_blk_init
-	cmn	w0, #1
-	mov	w22, w0
-	bne	.L2931
-	add	x19, x19, :lo12:.LANCHOR0
-	mov	w1, 17
-	ldr	x0, [x19,1128]
-	strb	wzr, [x19,1264]
-	strb	w1, [x0,32]
-	mov	w0, 0
-	bl	zftl_flash_exit_slc_mode
-	b	.L2977
-.L2931:
+	b	.L3012
+.L2963:
 	add	x0, x20, :lo12:.LANCHOR2
-	ldrb	w0, [x0,15]
+	ldrb	w0, [x0, 15]
 	cmp	w0, 9
-	bne	.L2932
+	bne	.L2964
 	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x1, [x0,1128]
-	ldrb	w1, [x1,20]
+	ldr	x1, [x0, 1048]
+	ldrb	w1, [x1, 20]
 	cmp	w1, 1
-	beq	.L2932
-	strb	wzr, [x0,1154]
-.L2932:
+	beq	.L2964
+	strb	wzr, [x0, 1154]
+.L2964:
 	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1136]
+	ldrb	w0, [x0, 1136]
 	sub	w0, w0, #1
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, 7
-	bhi	.L2933
+	bhi	.L2965
 	add	x0, x21, :lo12:.LANCHOR5
 	adrp	x1, hynix_read_retrial
 	add	x1, x1, :lo12:hynix_read_retrial
-	str	x1, [x0,328]
-.L2933:
+	str	x1, [x0, 336]
+.L2965:
 	add	x19, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x19,1304]
-	tbz	x0, 2, .L2935
-	ldr	x0, [x19,1128]
-	ldrb	w0, [x0,19]
-	cbz	w0, .L2935
+	ldrb	w0, [x19, 1248]
+	tbz	x0, 2, .L2967
+	ldr	x0, [x19, 1048]
+	ldrb	w0, [x0, 19]
+	cbz	w0, .L2967
 	add	x21, x21, :lo12:.LANCHOR5
-	ldrh	w1, [x19,2]
+	ldrh	w0, [x19, 2]
+	ldrb	w1, [x21, 456]
+	mul	w1, w1, w0
 	mov	w0, 0
-	ldrb	w2, [x21,992]
-	mul	w1, w2, w1
 	bl	flash_ddr_para_scan
-	ldrb	w0, [x19,1192]
-	cbnz	w0, .L2935
-	ldr	x1, [x19,1128]
-	strb	w0, [x1,19]
+	ldrb	w0, [x19, 1192]
+	cbnz	w0, .L2967
+	ldr	x0, [x19, 1048]
+	strb	wzr, [x0, 19]
 	bl	flash_info_flush
-.L2935:
-	ldr	w0, [x20,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L2937
+.L2967:
+	ldr	w0, [x20, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L2969
 	adrp	x2, .LANCHOR4
-	adrp	x0, .LC138
 	add	x2, x2, :lo12:.LANCHOR4
-	add	x0, x0, :lo12:.LC138
-	mov	w1, 3673
-	add	x2, x2, 744
+	adrp	x0, .LC135
+	add	x2, x2, 760
+	mov	w1, 3676
+	add	x0, x0, :lo12:.LC135
 	bl	printk
-.L2937:
-	mov	w22, 0
+.L2969:
 	bl	nand_flash_print_info
-.L2977:
-	mov	w0, w22
-	ldr	x25, [sp,64]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 80
-	ret
+	mov	w22, 0
+	b	.L2927
 	.size	nand_flash_init, .-nand_flash_init
 	.align	2
 	.global	ftl_sysblk_dump
 	.type	ftl_sysblk_dump, %function
 ftl_sysblk_dump:
 	sub	sp, sp, #144
-	stp	x29, x30, [sp,48]
+	stp	x29, x30, [sp, 48]
 	add	x29, sp, 48
-	stp	x23, x24, [sp,96]
-	uxth	w24, w0
-	mov	w0, 1
-	stp	x19, x20, [sp,64]
-	stp	x25, x26, [sp,112]
-	stp	x27, x28, [sp,128]
-	stp	x21, x22, [sp,80]
+	stp	x19, x20, [sp, 64]
 	mov	w20, 0
-	bl	buf_alloc
+	stp	x25, x26, [sp, 112]
+	adrp	x26, .LANCHOR3
+	stp	x27, x28, [sp, 128]
+	add	x26, x26, :lo12:.LANCHOR3
+	stp	x21, x22, [sp, 80]
 	adrp	x22, .LC195
-	ldr	x26, [x0,8]
+	stp	x23, x24, [sp, 96]
+	and	w24, w0, 65535
+	mov	w0, 1
+	bl	buf_alloc
+	ldr	x27, [x0, 8]
 	mov	x25, x0
-	mov	w19, w20
-	adrp	x27, .LANCHOR3
-	adrp	x28, .LANCHOR0
 	add	x22, x22, :lo12:.LC195
-.L2985:
-	add	x2, x27, :lo12:.LANCHOR3
-	ldrh	w3, [x2,1384]
-	cmp	w3, w19
-	bls	.L2997
-	ldrh	w21, [x2,1418]
-	add	x3, x28, :lo12:.LANCHOR0
-	ldr	x1, [x25,8]
-	ldr	x2, [x25,24]
-	madd	w21, w24, w21, w19
-	ldrb	w3, [x3,3360]
-	mov	w0, w21
-	bl	ftl_read_ppa_page
-	mov	w23, w0
-	ldr	x7, [x25,8]
-	mov	w1, w24
-	ldr	x2, [x25,24]
-	mov	w3, w21
-	mov	w4, w23
-	ldr	w0, [x7,12]
-	str	w0, [sp]
-	ldr	w0, [x2]
-	str	w0, [sp,8]
-	ldr	w0, [x2,4]
-	str	w0, [sp,16]
-	ldr	w0, [x2,8]
-	str	w0, [sp,24]
-	ldr	w0, [x2,12]
-	mov	w2, w19
-	str	w0, [sp,32]
-	mov	x0, x22
-	ldr	w5, [x7]
-	ldr	w6, [x7,4]
-	ldr	w7, [x7,8]
-	bl	printk
-	cmp	w23, 512
-	beq	.L2990
-	cmn	w23, #1
-	bne	.L2986
-.L2990:
-	mov	w20, 1
-.L2986:
-	add	w19, w19, 1
-	uxth	w19, w19
-	b	.L2985
-.L2997:
+	mov	w19, 0
+	mov	w28, 1
+.L3015:
+	ldrh	w0, [x26, 1376]
+	cmp	w0, w19
+	bhi	.L3017
+	add	x1, x27, 704
+	mov	w3, 32
+	mov	w2, 4
 	adrp	x0, .LC211
-	add	x1, x26, 704
 	add	x0, x0, :lo12:.LC211
-	mov	w2, 4
-	mov	w3, 32
 	bl	rknand_print_hex
 	mov	x0, x25
 	bl	zbuf_free
-	cbz	w20, .L2989
+	cbz	w20, .L3018
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 776
 	mov	w2, 1619
-	add	x1, x1, 760
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L2989:
-	sub	sp, x29, #48
+.L3018:
 	mov	w0, w20
-	ldp	x19, x20, [sp,64]
-	ldp	x21, x22, [sp,80]
-	ldp	x23, x24, [sp,96]
-	ldp	x25, x26, [sp,112]
-	ldp	x27, x28, [sp,128]
-	ldp	x29, x30, [sp,48]
+	ldp	x19, x20, [sp, 64]
+	ldp	x21, x22, [sp, 80]
+	ldp	x23, x24, [sp, 96]
+	ldp	x25, x26, [sp, 112]
+	ldp	x27, x28, [sp, 128]
+	ldp	x29, x30, [sp, 48]
 	add	sp, sp, 144
 	ret
+.L3017:
+	ldrh	w21, [x26, 1410]
+	ldrb	w3, [x26, 1946]
+	ldr	x1, [x25, 8]
+	ldr	x2, [x25, 24]
+	madd	w21, w21, w24, w19
+	mov	w0, w21
+	bl	ftl_read_ppa_page
+	mov	w23, w0
+	ldr	x1, [x25, 24]
+	mov	w4, w0
+	ldr	x0, [x25, 8]
+	mov	w3, w21
+	ldr	w2, [x1, 12]
+	str	w2, [sp, 32]
+	ldr	w2, [x1, 8]
+	str	w2, [sp, 24]
+	ldr	w2, [x1, 4]
+	str	w2, [sp, 16]
+	mov	w2, w19
+	add	w19, w19, 1
+	ldr	w1, [x1]
+	and	w19, w19, 65535
+	str	w1, [sp, 8]
+	ldr	w1, [x0, 12]
+	str	w1, [sp]
+	mov	w1, w24
+	ldp	w5, w6, [x0]
+	ldr	w7, [x0, 8]
+	mov	x0, x22
+	bl	printk
+	cmp	w23, 512
+	ccmn	w23, #1, 4, ne
+	csel	w20, w20, w28, ne
+	b	.L3015
 	.size	ftl_sysblk_dump, .-ftl_sysblk_dump
 	.align	2
 	.global	ftl_open_sblk_recovery
 	.type	ftl_open_sblk_recovery, %function
 ftl_open_sblk_recovery:
-	stp	x29, x30, [sp, -368]!
+	stp	x29, x30, [sp, -352]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	adrp	x22, .LANCHOR2
-	stp	x19, x20, [sp,16]
+	stp	x21, x22, [sp, 32]
+	adrp	x21, .LANCHOR2
+	stp	x19, x20, [sp, 16]
 	mov	x19, x0
-	str	x1, [x29,136]
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	tbz	x0, 12, .L2999
+	ldr	w0, [x21, #:lo12:.LANCHOR2]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	str	x1, [x29, 112]
+	tbz	x0, 12, .L3026
+	ldrh	w1, [x19, 2]
 	adrp	x0, .LC212
-	ldrh	w1, [x19,2]
 	add	x0, x0, :lo12:.LC212
 	bl	printk
-.L2999:
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L3000
+.L3026:
+	ldr	w0, [x21, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L3027
+	ldrb	w1, [x19, 5]
 	adrp	x0, .LC213
-	ldrb	w1, [x19,5]
 	add	x0, x0, :lo12:.LC213
 	bl	printk
-.L3000:
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L3001
-	adrp	x0, .LC214
+.L3027:
+	ldr	w0, [x21, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L3028
 	ldrh	w1, [x19]
+	adrp	x0, .LC214
 	add	x0, x0, :lo12:.LC214
 	bl	printk
-.L3001:
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L3002
+.L3028:
+	ldr	w0, [x21, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L3029
+	ldrh	w2, [x19, 18]
 	adrp	x0, .LC215
-	ldrh	w1, [x19,16]
-	ldrh	w2, [x19,18]
+	ldrh	w1, [x19, 16]
 	add	x0, x0, :lo12:.LC215
 	bl	printk
-.L3002:
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L3003
+.L3029:
+	ldr	w0, [x21, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L3030
+	ldrb	w1, [x19, 9]
 	adrp	x0, .LC216
-	ldrb	w1, [x19,9]
 	add	x0, x0, :lo12:.LC216
 	bl	printk
-.L3003:
-	adrp	x20, .LANCHOR0
-	ldrh	w0, [x19,10]
-	add	x21, x20, :lo12:.LANCHOR0
-	strh	w0, [x19,14]
+.L3030:
+	ldrh	w0, [x19, 10]
+	adrp	x24, .LANCHOR0
+	strh	w0, [x19, 14]
+	add	x0, x24, :lo12:.LANCHOR0
 	ldrh	w1, [x19]
-	ldrh	w0, [x21,1088]
+	ldrh	w0, [x0, 1096]
 	cmp	w1, w0
-	bcs	.L2998
+	bcs	.L3025
 	mov	w0, 1
 	bl	buf_alloc
+	adrp	x20, .LANCHOR3
 	mov	x27, x0
-	ldrb	w0, [x21,3360]
-	add	x21, x29, 176
+	add	x0, x20, :lo12:.LANCHOR3
+	add	x25, x29, 160
 	mov	w2, 64
-	ldr	x1, [x27,8]
+	add	x28, x29, 288
+	ldr	x1, [x27, 8]
+	ldrb	w0, [x0, 1946]
 	sub	w0, w0, #2
 	sbfiz	x0, x0, 9, 32
 	add	x0, x1, x0
 	mov	w1, 255
-	str	x0, [x29,160]
-	mov	x0, x21
+	str	x0, [x29, 144]
+	mov	x0, x25
 	bl	ftl_memset
-	mov	w1, 255
 	mov	w2, 64
-	add	x0, x29, 240
-	bl	ftl_memset
-	add	x0, x29, 304
 	mov	w1, 255
+	add	x0, x29, 224
+	bl	ftl_memset
 	mov	w2, 64
+	mov	w1, 255
+	mov	x0, x28
 	bl	ftl_memset
-	ldrb	w24, [x19,5]
+	ldrb	w22, [x19, 5]
 	mov	w0, 2
-	str	w0, [x29,168]
+	ldrh	w23, [x19, 2]
+	str	w0, [x29, 152]
 	adrp	x0, .LANCHOR5
-	ldrh	w25, [x19,2]
+	str	wzr, [x29, 120]
 	add	x0, x0, :lo12:.LANCHOR5
-	str	wzr, [x29,144]
-	add	x0, x0, 384
-	str	x0, [x29,128]
-	adrp	x0, .LC217
-	add	x0, x0, :lo12:.LC217
-	str	x0, [x29,120]
-.L3005:
-	adrp	x23, .LANCHOR3
-	add	x0, x23, :lo12:.LANCHOR3
-	ldrh	w0, [x0,1384]
-	cmp	w0, w25
-	bls	.L3008
-	ldrb	w24, [x19,5]
-.L3006:
-	ldrb	w0, [x19,9]
+	str	x0, [x29, 104]
+.L3032:
+	add	x0, x20, :lo12:.LANCHOR3
+	ldrh	w0, [x0, 1376]
+	cmp	w0, w23
+	bhi	.L3049
+.L3035:
+	add	x2, x20, :lo12:.LANCHOR3
+	ldrh	w0, [x19, 10]
+	ldrh	w1, [x19, 6]
+	strh	w23, [x19, 2]
+	add	w1, w1, w0
+	ldrh	w2, [x2, 1376]
+	ldrb	w0, [x19, 9]
+	strb	w22, [x19, 5]
+	mul	w0, w0, w2
+	cmp	w1, w0
+	beq	.L3050
+	adrp	x1, .LANCHOR4
+	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 792
+	mov	w2, 1802
+	adrp	x0, .LC0
+	add	x0, x0, :lo12:.LC0
+	bl	printk
+	bl	dump_stack
+.L3050:
+	add	x0, x20, :lo12:.LANCHOR3
+	ldrh	w3, [x19, 10]
+	mov	w1, 0
+	ldr	x4, [x0, 1928]
+	mov	w0, 0
+.L3051:
+	cmp	w1, w3
+	bcc	.L3053
+	add	x1, x20, :lo12:.LANCHOR3
+	ldrb	w22, [x19, 9]
+	ldrh	w1, [x1, 1376]
+	madd	w22, w22, w1, w0
+	ldr	w0, [x21, #:lo12:.LANCHOR2]
+	sub	w22, w22, w3
+	and	w22, w22, 65535
+	tbz	x0, 12, .L3054
+	add	x0, x24, :lo12:.LANCHOR0
+	ldrh	w1, [x19]
+	ldr	x0, [x0, 1120]
+	ubfiz	x2, x1, 1, 16
+	ldrh	w3, [x0, x2]
+	adrp	x0, .LC219
+	mov	w2, w22
+	add	x0, x0, :lo12:.LC219
+	bl	printk
+.L3054:
+	add	x0, x24, :lo12:.LANCHOR0
+	ldrh	w1, [x19]
+	ldr	x0, [x0, 1120]
+	strh	w22, [x0, x1, lsl 1]
+	ldr	w0, [x21, #:lo12:.LANCHOR2]
+	tbz	x0, 14, .L3055
+	ldp	w1, w2, [x29, 160]
+	adrp	x0, .LC220
+	ldp	w3, w4, [x29, 168]
+	add	x0, x0, :lo12:.LC220
+	bl	printk
+.L3055:
+	add	x0, x20, :lo12:.LANCHOR3
+	mov	w1, 0
+	mov	x23, 0
+	ldrb	w2, [x0, 1946]
+	ldr	x0, [x27, 8]
+	lsl	w2, w2, 9
+	bl	ftl_memset
+	adrp	x0, .LC221
+	add	x0, x0, :lo12:.LC221
+	str	x0, [x29, 128]
+	adrp	x0, .LC222
+	add	x0, x0, :lo12:.LC222
+	str	x0, [x29, 112]
+.L3056:
+	add	x1, x20, :lo12:.LANCHOR3
+	ldr	w2, [x29, 152]
+	str	w23, [x29, 140]
+	ldrb	w0, [x1, 1321]
+	mul	w0, w0, w2
+	cmp	w23, w0
+	bcc	.L3068
+	adrp	x22, .LC223
+	adrp	x23, .LC222
+	mov	x20, x1
+	add	x22, x22, :lo12:.LC223
+	add	x23, x23, :lo12:.LC222
+	mov	x24, 0
+.L3069:
+	ldrb	w0, [x20, 1321]
+	ldr	w1, [x29, 152]
+	mul	w0, w0, w1
 	cmp	w0, w24
-	bls	.L3145
-	add	x0, x19, w24, sxtw 1
-	ldrh	w28, [x0,16]
+	bhi	.L3075
+	mov	x0, x27
+	bl	zbuf_free
+	ldrh	w1, [x19, 12]
+	ldrh	w0, [x20, 1376]
+	ldrb	w2, [x19, 9]
+	madd	w0, w0, w2, w1
+	mov	x1, -4
+	add	x0, x1, w0, sxtw 2
+	ldr	x1, [x20, 1928]
+	ldr	w0, [x1, x0]
+	cmn	w0, #1
+	beq	.L3076
+	adrp	x1, .LANCHOR4
+	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 792
+	mov	w2, 1917
+	adrp	x0, .LC0
+	add	x0, x0, :lo12:.LC0
+	bl	printk
+	bl	dump_stack
+.L3076:
+	ldrh	w0, [x19, 6]
+	cmp	w0, 1
+	bne	.L3025
+	mov	x0, x19
+	bl	ftl_write_last_log_page
+.L3025:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 352
+	ret
+.L3049:
+	ldrb	w22, [x19, 5]
+.L3033:
+	ldrb	w0, [x19, 9]
+	cmp	w0, w22
+	bhi	.L3048
+	add	w23, w23, 1
+	strb	wzr, [x19, 5]
+	and	w23, w23, 65535
+	b	.L3032
+.L3048:
+	add	x0, x19, w22, sxtw 1
+	ldrh	w0, [x0, 16]
+	str	w0, [x29, 140]
 	mov	w0, 65535
-	cmp	w28, w0
-	beq	.L3007
-	add	x0, x23, :lo12:.LANCHOR3
-	add	x3, x20, :lo12:.LANCHOR0
-	ldr	x1, [x27,8]
-	ldr	x2, [x27,24]
-	ldrh	w26, [x0,1418]
-	ldrb	w3, [x3,3360]
-	madd	w0, w28, w26, w25
-	str	w0, [x29,152]
+	ldr	w1, [x29, 140]
+	cmp	w1, w0
+	beq	.L3034
+	add	x0, x20, :lo12:.LANCHOR3
+	ldr	w2, [x29, 140]
+	ldrh	w1, [x0, 1410]
+	ldrb	w3, [x0, 1946]
+	madd	w1, w1, w2, w23
+	ldr	x2, [x27, 24]
+	str	w1, [x29, 128]
+	ldr	x1, [x27, 8]
+	ldr	w0, [x29, 128]
 	bl	ftl_read_ppa_page
-	cmp	w0, 512
 	mov	w26, w0
-	beq	.L3008
+	cmp	w0, 512
+	beq	.L3035
 	cmn	w0, #1
-	beq	.L3009
-	ldr	x0, [x27,24]
+	beq	.L3036
+	ldr	x0, [x27, 24]
 	ldr	w1, [x0]
 	cmn	w1, #1
-	bne	.L3009
-	ldr	w0, [x0,4]
+	bne	.L3036
+	ldr	w0, [x0, 4]
 	cmn	w0, #1
-	bne	.L3009
-	ldr	x0, [x27,8]
+	bne	.L3036
+	ldr	x0, [x27, 8]
 	ldr	w0, [x0]
 	cmn	w0, #1
-	beq	.L3008
-.L3009:
+	beq	.L3035
+.L3036:
 	adrp	x0, .LANCHOR5
-	mov	w1, 1
 	add	x0, x0, :lo12:.LANCHOR5
-	strb	w1, [x0,657]
-	ldrb	w0, [x19,9]
-	ldrh	w1, [x19,10]
-	madd	w0, w25, w0, w24
+	mov	w1, 1
+	strb	w1, [x0, 401]
+	ldrb	w0, [x19, 9]
+	ldrh	w1, [x19, 10]
+	madd	w0, w0, w23, w22
 	cmp	w1, w0
-	beq	.L3010
+	beq	.L3037
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 792
 	mov	w2, 1694
-	add	x1, x1, 776
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L3010:
-	ldrh	w0, [x19,10]
-	ldrh	w1, [x19,6]
-	ldrb	w2, [x19,9]
+.L3037:
+	ldrh	w0, [x19, 10]
+	ldrh	w1, [x19, 6]
+	ldrb	w2, [x19, 9]
 	add	w1, w1, w0
-	add	x0, x23, :lo12:.LANCHOR3
-	ldrh	w0, [x0,1384]
+	add	x0, x20, :lo12:.LANCHOR3
+	ldrh	w0, [x0, 1376]
 	mul	w0, w0, w2
 	cmp	w1, w0
-	beq	.L3011
+	beq	.L3038
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 792
 	mov	w2, 1695
-	add	x1, x1, 776
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L3011:
-	add	x0, x20, :lo12:.LANCHOR0
-	str	x0, [x29,168]
-	ldrb	w0, [x0,3360]
+.L3038:
+	add	x0, x20, :lo12:.LANCHOR3
+	str	x0, [x29, 152]
+	ldrb	w0, [x0, 1946]
 	cmp	w0, 8
-	bls	.L3012
-	ldr	x0, [x27,24]
-	mov	w1, 15555
-	movk	w1, 0xf55f, lsl 16
-	ldr	w2, [x0]
-	cmp	w2, w1
-	beq	.L3012
+	bls	.L3039
+	ldr	x0, [x27, 24]
+	mov	w2, 15555
+	movk	w2, 0xf55f, lsl 16
+	ldr	w1, [x0]
+	cmp	w1, w2
+	beq	.L3039
 	cmn	w26, #1
-	beq	.L3017
-	ldr	w1, [x0,4]
+	beq	.L3041
+	ldr	w1, [x0, 4]
 	cmn	w1, #1
-	beq	.L3052
-	ldr	w2, [x0,16]
-	mov	w1, 21320
-	movk	w1, 0x4841, lsl 16
-	cmp	w2, w1
-	bne	.L3052
-	ldr	w2, [x0,20]
+	bne	.L3042
+.L3045:
+	ldr	x1, [x27, 24]
+	ldr	w0, [x1, 4]
+	cmn	w0, #1
+	bne	.L3043
+.L3041:
+	ldrh	w0, [x19, 6]
+	sub	w0, w0, #1
+	strh	w0, [x19, 6]
+	ldrh	w0, [x19, 10]
+	add	w0, w0, 1
+	strh	w0, [x19, 10]
+	mov	w0, 4
+	str	w0, [x29, 152]
+	mov	w0, 1
+	str	w0, [x29, 120]
+.L3034:
+	add	w22, w22, 1
+	and	w22, w22, 65535
+	b	.L3033
+.L3042:
+	ldr	w1, [x0, 16]
+	mov	w2, 21320
+	movk	w2, 0x4841, lsl 16
+	cmp	w1, w2
+	bne	.L3045
+	ldr	w2, [x0, 20]
 	mov	w1, 1024
-	ldr	x0, [x29,160]
-	str	x2, [x29,144]
+	ldr	x0, [x29, 144]
+	str	w2, [x29, 152]
 	bl	js_hash
-	ldr	x2, [x29,144]
+	ldr	w2, [x29, 152]
 	cmp	w2, w0
-	beq	.L3052
-	ldr	x0, [x29,160]
+	beq	.L3045
+	ldr	x0, [x29, 144]
 	mov	w1, 1024
 	bl	js_hash
 	mov	w5, w0
-	ldr	w3, [x29,152]
-	mov	w1, w28
-	ldr	x0, [x29,120]
-	mov	w2, w25
+	ldr	w3, [x29, 128]
 	mov	w4, w26
+	ldr	w1, [x29, 140]
+	mov	w2, w23
+	adrp	x0, .LC217
+	add	x0, x0, :lo12:.LC217
 	bl	printk
-	ldr	x1, [x29,160]
+	ldr	x1, [x29, 144]
+	mov	w3, 16
+	mov	w2, 4
 	adrp	x0, .LC218
 	add	x0, x0, :lo12:.LC218
-	mov	w2, 4
-	mov	w3, 16
 	bl	rknand_print_hex
-	ldr	x0, [x29,168]
+	add	x0, x20, :lo12:.LANCHOR3
+	ldr	x1, [x27, 24]
 	mov	w2, 4
-	ldr	x1, [x27,24]
-	ldrb	w3, [x0,3360]
+	ldrb	w0, [x0, 1946]
+	lsr	w3, w0, 1
 	adrp	x0, .LC183
 	add	x0, x0, :lo12:.LC183
-	lsr	w3, w3, 1
 	bl	rknand_print_hex
-	b	.L3017
-.L3012:
+	b	.L3041
+.L3039:
 	cmn	w26, #1
-	beq	.L3017
-.L3052:
-	ldr	x1, [x27,24]
-	ldr	w0, [x1,4]
-	cmn	w0, #1
-	beq	.L3017
-	ldr	w2, [x1]
-	mov	w1, 15555
-	movk	w1, 0xf55f, lsl 16
-	cmp	w2, w1
-	beq	.L3017
+	bne	.L3045
+	b	.L3041
+.L3043:
+	ldr	w1, [x1]
+	mov	w2, 15555
+	movk	w2, 0xf55f, lsl 16
+	cmp	w1, w2
+	beq	.L3041
 	bl	lpa_hash_get_ppa
-	ldr	x1, [x29,136]
-	cbz	x1, .L3016
-	ldr	x8, [x27,24]
-	ldr	w1, [x8,8]
+	ldr	x1, [x29, 112]
+	cbz	x1, .L3046
+	ldr	x3, [x27, 24]
+	ldr	w1, [x3, 8]
 	cmp	w0, w1
-	beq	.L3016
+	beq	.L3046
 	cmn	w0, #1
-	beq	.L3016
-	add	x7, x20, :lo12:.LANCHOR0
-	add	x4, x23, :lo12:.LANCHOR3
+	beq	.L3046
+	add	x7, x24, :lo12:.LANCHOR0
+	add	x4, x20, :lo12:.LANCHOR3
 	mov	w5, 24
-	mov	w28, 1
-	ldrb	w2, [x7,1257]
-	ldrh	w1, [x4,1312]
-	sub	w2, w5, w2
-	lsr	w3, w0, w1
-	sub	w1, w2, w1
-	lsl	w1, w28, w1
-	ldrb	w2, [x4,1314]
+	mov	w26, 1
+	ldrb	w1, [x7, 1205]
+	ldrh	w8, [x4, 1304]
+	sub	w1, w5, w1
+	sub	w1, w1, w8
+	lsr	w2, w0, w8
+	lsl	w1, w26, w1
 	sub	w1, w1, #1
-	and	w1, w3, w1
+	and	w1, w1, w2
+	ldrb	w2, [x4, 1306]
 	udiv	w1, w1, w2
-	ldr	x2, [x29,136]
+	ldr	x2, [x29, 112]
 	ldrh	w2, [x2]
 	cmp	w2, w1, uxth
-	bne	.L3016
-	ldr	w8, [x8]
-	ldrb	w3, [x7,3360]
-	ldr	x1, [x27,8]
-	ldr	x2, [x29,128]
-	str	x5, [x29,104]
-	str	x4, [x29,112]
-	str	x8, [x29,144]
-	str	x7, [x29,168]
+	bne	.L3046
+	ldr	x1, [x29, 104]
+	ldr	w8, [x3]
+	ldrb	w3, [x4, 1946]
+	stp	w5, w8, [x29, 136]
+	ldr	x2, [x1, 376]
+	ldr	x1, [x27, 8]
+	str	x7, [x29, 120]
+	str	x4, [x29, 152]
 	bl	ftl_read_ppa_page
-	ldr	x0, [x29,128]
-	ldr	x8, [x29,144]
-	ldr	x7, [x29,168]
+	ldr	x0, [x29, 104]
+	ldr	w8, [x29, 140]
+	ldr	x0, [x0, 376]
 	ldr	w0, [x0]
-	ldr	x4, [x29,112]
-	cmp	w0, w8
-	ldr	x5, [x29,104]
-	bcc	.L3016
-	ldr	x0, [x27,24]
-	ldr	w1, [x0,8]
-	cmn	w1, #1
-	beq	.L3017
-	ldrb	w2, [x7,1257]
-	ldrh	w0, [x4,1312]
+	cmp	w8, w0
+	bhi	.L3046
+	ldr	x0, [x27, 24]
+	ldr	w3, [x0, 8]
+	cmn	w3, #1
+	beq	.L3041
+	ldr	x7, [x29, 120]
+	ldr	x4, [x29, 152]
+	ldr	w5, [x29, 136]
+	ldrb	w2, [x7, 1205]
+	ldrh	w1, [x4, 1304]
 	sub	w5, w5, w2
-	sub	w5, w5, w0
-	lsr	w1, w1, w0
-	lsl	w28, w28, w5
-	ldrb	w0, [x4,1314]
-	sub	w28, w28, #1
-	and	w1, w28, w1
-	udiv	w0, w1, w0
+	sub	w5, w5, w1
+	lsr	w0, w3, w1
+	lsl	w26, w26, w5
+	sub	w26, w26, #1
+	and	w26, w26, w0
+	ldrb	w0, [x4, 1306]
+	udiv	w0, w26, w0
 	bl	ftl_vpn_decrement
-	b	.L3017
-.L3016:
-	ldr	x2, [x27,24]
-	add	x1, x20, :lo12:.LANCHOR0
-	ldr	w3, [x2,4]
-	ldr	w0, [x1,3372]
-	cmp	w3, w0
-	bcs	.L3017
-	add	x4, x23, :lo12:.LANCHOR3
-	ldrb	w0, [x19,9]
-	ldrh	w3, [x19,10]
-	ldrh	w4, [x4,1384]
-	mul	w0, w0, w4
-	sub	w0, w0, #1
-	cmp	w3, w0
-	blt	.L3146
-.L3017:
-	ldrh	w0, [x19,6]
-	sub	w0, w0, #1
-	strh	w0, [x19,6]
-	ldrh	w0, [x19,10]
-	add	w0, w0, 1
-	strh	w0, [x19,10]
-	mov	w0, 4
-	str	w0, [x29,168]
-	mov	w0, 1
-	str	w0, [x29,144]
-.L3007:
-	add	w24, w24, 1
-	uxth	w24, w24
-	b	.L3006
-.L3145:
-	add	w25, w25, 1
-	strb	wzr, [x19,5]
-	uxth	w25, w25
-	b	.L3005
-.L3008:
-	add	x2, x23, :lo12:.LANCHOR3
-	ldrh	w0, [x19,10]
-	ldrh	w1, [x19,6]
-	strh	w25, [x19,2]
-	add	w1, w1, w0
-	ldrh	w2, [x2,1384]
-	ldrb	w0, [x19,9]
-	strb	w24, [x19,5]
+	b	.L3041
+.L3053:
+	ldrh	w2, [x19, 12]
+	add	w2, w2, w1
+	ldr	w2, [x4, x2, lsl 2]
+	cmn	w2, #1
+	beq	.L3052
+	add	w22, w0, 1
+	and	w0, w22, 65535
+.L3052:
+	add	w1, w1, 1
+	b	.L3051
+.L3068:
+	ldr	w0, [x25, x23, lsl 2]
+	cmn	w0, #1
+	bne	.L3057
+.L3061:
+	add	x1, x24, :lo12:.LANCHOR0
+	ldr	x0, [x27, 24]
+	mov	w22, -1
+	mov	x2, 0
+	ldr	x1, [x1, 3384]
+	ldr	w1, [x1, 8]
+	str	w1, [x0]
+	ldr	x0, [x27, 24]
+	str	w22, [x0, 4]
+	ldr	x0, [x27, 24]
+	str	w22, [x0, 8]
+	ldr	x0, [x27, 24]
+	str	wzr, [x0, 12]
+	ldr	x0, [x27, 24]
+	str	wzr, [x0, 16]
+	ldr	x0, [x27, 8]
+	str	wzr, [x0]
+	mov	w0, 2
+	ldr	x1, [x27, 24]
+	add	x1, x1, 16
+	bl	ftl_debug_info_fill
+.L3058:
+	ldr	w0, [x29, 120]
+	cbz	w0, .L3063
+	ldrh	w0, [x19, 6]
+	cmp	w0, 1
+	bls	.L3063
+	add	x0, x20, :lo12:.LANCHOR3
+	str	x0, [x29, 144]
+.L3122:
+	mov	x0, x19
+	bl	ftl_get_new_free_page
+	mov	w26, w0
+	ldr	w0, [x21, #:lo12:.LANCHOR2]
+	tbz	x0, 14, .L3065
+	ldrh	w0, [x19, 12]
+	mov	w1, w26
+	ldrh	w3, [x19, 10]
+	add	w3, w3, w0
+	ldr	x0, [x27, 24]
+	sub	w3, w3, #1
+	ldr	w2, [x0, 4]
+	ldr	x0, [x29, 112]
+	bl	printk
+.L3065:
+	ldr	x0, [x29, 144]
+	ldr	w2, [x29, 152]
+	ldrh	w1, [x19, 6]
+	ldrb	w0, [x0, 1321]
 	mul	w0, w0, w2
-	cmp	w1, w0
-	beq	.L3021
-	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
-	add	x1, x1, :lo12:.LANCHOR4
-	mov	w2, 1802
-	add	x1, x1, 776
-	add	x0, x0, :lo12:.LC0
-	bl	printk
-	bl	dump_stack
-.L3021:
-	add	x0, x23, :lo12:.LANCHOR3
-	ldrh	w3, [x19,10]
-	ldr	x4, [x0,1936]
-	mov	w0, 0
-	mov	w2, w0
-.L3022:
-	cmp	w2, w3
-	bcs	.L3147
-	ldrh	w1, [x19,12]
-	add	w1, w2, w1
-	ldr	w1, [x4,x1,lsl 2]
-	cmn	w1, #1
-	beq	.L3023
-	add	w1, w0, 1
-	uxth	w0, w1
-.L3023:
-	add	w2, w2, 1
-	b	.L3022
-.L3147:
-	add	x2, x23, :lo12:.LANCHOR3
-	ldrb	w1, [x19,9]
-	sub	w0, w0, w3
-	ldrh	w24, [x2,1384]
-	madd	w0, w1, w24, w0
-	uxth	w24, w0
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L3025
-	add	x0, x20, :lo12:.LANCHOR0
-	ldrh	w1, [x19]
-	mov	w2, w24
-	ubfiz	x3, x1, 1, 16
-	ldr	x4, [x0,1112]
-	adrp	x0, .LC219
-	add	x0, x0, :lo12:.LC219
-	ldrh	w3, [x4,x3]
-	bl	printk
-.L3025:
-	add	x0, x20, :lo12:.LANCHOR0
-	ldrh	w1, [x19]
-	ldr	x0, [x0,1112]
-	strh	w24, [x0,x1,lsl 1]
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
-	tbz	x0, 14, .L3026
-	adrp	x0, .LC220
-	ldr	w1, [x29,176]
-	ldr	w2, [x29,180]
-	add	x0, x0, :lo12:.LC220
-	ldr	w3, [x29,184]
-	ldr	w4, [x29,188]
-	bl	printk
-.L3026:
-	add	x0, x20, :lo12:.LANCHOR0
-	mov	w1, 0
-	adrp	x28, .LC222
-	mov	x24, 0
-	mov	w26, -1
-	ldrb	w2, [x0,3360]
-	ldr	x0, [x27,8]
-	lsl	w2, w2, 9
-	bl	ftl_memset
-	adrp	x0, .LC221
-	add	x0, x0, :lo12:.LC221
-	str	x0, [x29,152]
-	add	x0, x28, :lo12:.LC222
-	str	x0, [x29,136]
-.L3027:
-	add	x0, x23, :lo12:.LANCHOR3
-	ldr	w1, [x29,168]
-	str	w24, [x29,160]
-	ldrb	w0, [x0,1329]
-	mul	w0, w1, w0
-	cmp	w24, w0
-	bcs	.L3148
-	ldr	w0, [x21,x24,lsl 2]
-	cmn	w0, #1
-	bne	.L3028
-.L3032:
-	add	x1, x20, :lo12:.LANCHOR0
-	ldr	x0, [x27,24]
-	mov	x2, 0
-	mov	w25, -1
-	ldr	x1, [x1,3392]
-	ldr	w1, [x1,8]
-	str	w1, [x0]
-	ldr	x0, [x27,24]
-	str	w26, [x0,4]
-	ldr	x0, [x27,24]
-	str	w26, [x0,8]
-	ldr	x0, [x27,24]
-	str	wzr, [x0,12]
-	ldr	x0, [x27,24]
-	str	wzr, [x0,16]
-	ldr	x0, [x27,8]
-	str	wzr, [x0]
-	mov	w0, 2
-	ldr	x1, [x27,24]
-	add	x1, x1, 16
-	bl	ftl_debug_info_fill
-	b	.L3029
-.L3028:
-	add	x3, x20, :lo12:.LANCHOR0
-	ldr	x1, [x27,8]
-	ldr	x2, [x27,24]
-	ldrb	w3, [x3,3360]
+	ldr	w2, [x29, 140]
+	add	w0, w0, 1
+	sub	w0, w0, w2
+	cmp	w1, w0
+	bls	.L3063
+	ldr	x0, [x29, 144]
+	ldr	x1, [x27, 8]
+	ldr	x2, [x27, 24]
+	ldrb	w3, [x0, 1946]
+	mov	w0, w26
+	bl	ftl_prog_ppa_page
+	mov	w1, w0
+	ldrh	w0, [x19]
+	str	w1, [x29, 104]
+	bl	ftl_vpn_decrement
+	ldr	w1, [x29, 104]
+	cmn	w22, #1
+	ccmn	w1, #1, 4, ne
+	beq	.L3066
+	add	x0, x29, 224
+	ldrh	w1, [x19, 12]
+	str	w26, [x0, x23, lsl 2]
+	ldrh	w0, [x19, 10]
+	add	w0, w0, w1
+	sub	w0, w0, #1
+	str	w0, [x28, x23, lsl 2]
+.L3063:
+	add	x23, x23, 1
+	b	.L3056
+.L3057:
+	ldrb	w3, [x1, 1946]
+	ldr	x2, [x27, 24]
+	ldr	x1, [x27, 8]
 	bl	ftl_read_ppa_page
-	mov	w25, w0
-	ldr	x0, [x27,24]
-	ldr	w0, [x0,4]
+	mov	w22, w0
+	ldr	x0, [x27, 24]
+	ldr	w0, [x0, 4]
 	bl	lpa_hash_get_ppa
-	mov	w28, w0
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
-	tbz	x0, 14, .L3030
-	ldr	x3, [x27,24]
-	mov	w1, w28
-	ldr	x0, [x29,152]
-	ldr	w2, [x21,x24,lsl 2]
-	ldr	w3, [x3,4]
+	mov	w26, w0
+	ldr	w0, [x21, #:lo12:.LANCHOR2]
+	tbz	x0, 14, .L3059
+	ldr	x0, [x27, 24]
+	mov	w1, w26
+	ldr	w2, [x25, x23, lsl 2]
+	ldr	w3, [x0, 4]
+	ldr	x0, [x29, 128]
 	bl	printk
-.L3030:
-	ldr	w0, [x21,x24,lsl 2]
+.L3059:
+	ldr	w0, [x25, x23, lsl 2]
 	mov	w1, 1
 	mov	x2, 0
-	cmp	w28, w0
-	ldr	x0, [x27,24]
-	csinv	w25, w25, wzr, eq
-	str	w28, [x0,8]
-	ldr	x0, [x27,24]
-	str	w1, [x0,12]
-	ldr	x0, [x27,24]
-	str	wzr, [x0,16]
+	cmp	w26, w0
+	ldr	x0, [x27, 24]
+	csinv	w22, w22, wzr, eq
+	str	w26, [x0, 8]
+	ldr	x0, [x27, 24]
+	str	w1, [x0, 12]
+	ldr	x0, [x27, 24]
+	str	wzr, [x0, 16]
 	mov	w0, 2
-	ldr	x1, [x27,24]
+	ldr	x1, [x27, 24]
 	add	x1, x1, 16
 	bl	ftl_debug_info_fill
-	cmn	w25, #1
-	beq	.L3032
-.L3029:
-	ldr	w0, [x29,144]
-	cbz	w0, .L3034
-.L3144:
-	ldrh	w0, [x19,6]
+	cmn	w22, #1
+	bne	.L3058
+	b	.L3061
+.L3066:
+	ldrh	w0, [x19, 6]
 	cmp	w0, 1
-	bls	.L3034
-	mov	x0, x19
-	bl	ftl_get_new_free_page
-	mov	w28, w0
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
-	tbz	x0, 14, .L3036
-	ldr	x2, [x27,24]
-	mov	w1, w28
-	ldrh	w0, [x19,12]
-	ldrh	w3, [x19,10]
-	ldr	w2, [x2,4]
-	add	w3, w3, w0
-	ldr	x0, [x29,136]
-	sub	w3, w3, #1
-	bl	printk
-.L3036:
-	add	x1, x23, :lo12:.LANCHOR3
-	ldrh	w0, [x19,6]
-	ldrb	w2, [x1,1329]
-	ldr	w1, [x29,168]
-	mul	w2, w1, w2
-	ldr	w1, [x29,160]
-	add	w2, w2, 1
-	sub	w2, w2, w1
-	cmp	w0, w2
-	bls	.L3034
-	add	x3, x20, :lo12:.LANCHOR0
-	ldr	x1, [x27,8]
-	ldr	x2, [x27,24]
-	mov	w0, w28
-	ldrb	w3, [x3,3360]
-	bl	ftl_prog_ppa_page
-	mov	w2, w0
-	ldrh	w0, [x19]
-	str	x2, [x29,128]
-	bl	ftl_vpn_decrement
-	ldr	x2, [x29,128]
-	cmn	w25, #1
-	cset	w1, ne
-	cmn	w2, #1
-	beq	.L3037
-	cbz	w1, .L3034
-	add	x0, x29, 240
-	ldrh	w1, [x19,10]
-	str	w28, [x0,x24,lsl 2]
-	ldrh	w0, [x19,12]
-	add	w0, w1, w0
-	add	x1, x29, 304
-	sub	w0, w0, #1
-	str	w0, [x1,x24,lsl 2]
-	b	.L3034
-.L3037:
-	cbnz	w1, .L3144
-.L3034:
-	add	x24, x24, 1
-	b	.L3027
-.L3148:
-	adrp	x24, .LC223
-	adrp	x25, .LC222
-	mov	x26, 0
-	add	x24, x24, :lo12:.LC223
-	add	x25, x25, :lo12:.LC222
-.L3041:
-	add	x28, x23, :lo12:.LANCHOR3
-	ldr	w1, [x29,168]
-	ldrb	w0, [x28,1329]
-	mul	w0, w1, w0
-	cmp	w0, w26
-	bls	.L3149
-	add	x0, x29, 240
-	ldr	w0, [x0,x26,lsl 2]
+	bls	.L3063
+	cmn	w22, #1
+	bne	.L3122
+	b	.L3063
+.L3075:
+	add	x0, x29, 224
+	ldr	w0, [x0, x24, lsl 2]
 	cmn	w0, #1
-	beq	.L3043
-	add	x3, x20, :lo12:.LANCHOR0
-	ldr	w0, [x21,x26,lsl 2]
-	ldr	x1, [x27,8]
-	ldr	x2, [x27,24]
-	ldrb	w3, [x3,3360]
+	beq	.L3071
+	ldrb	w3, [x20, 1946]
+	ldr	w0, [x25, x24, lsl 2]
+	ldr	x1, [x27, 8]
+	ldr	x2, [x27, 24]
 	bl	ftl_read_ppa_page
 	cmp	w0, 256
-	beq	.L3054
-	cmn	w0, #1
-	bne	.L3043
-.L3054:
-	add	x3, x20, :lo12:.LANCHOR0
-	add	x0, x29, 240
-	ldr	x1, [x27,8]
-	ldr	x2, [x27,24]
-	ldr	w0, [x0,x26,lsl 2]
-	ldrb	w3, [x3,3360]
+	ccmn	w0, #1, 4, ne
+	bne	.L3071
+	add	x0, x29, 224
+	ldrb	w3, [x20, 1946]
+	ldr	x1, [x27, 8]
+	ldr	x2, [x27, 24]
+	ldr	w0, [x0, x24, lsl 2]
 	bl	ftl_read_ppa_page
-	mov	w28, w0
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
-	tbz	x0, 14, .L3046
-	ldr	x2, [x27,24]
-	mov	x0, x25
-	ldr	w3, [x21,x26,lsl 2]
-	mov	w1, w28
-	ldr	w2, [x2,8]
-	bl	printk
-.L3046:
-	cmn	w28, #1
-	beq	.L3043
-	ldr	x1, [x27,24]
-	ldr	w2, [x21,x26,lsl 2]
-	ldr	w0, [x1,8]
-	cmp	w2, w0
-	bne	.L3043
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
-	tbz	x0, 14, .L3047
-	add	x3, x29, 304
-	ldr	w1, [x1,4]
-	mov	x0, x24
-	ldr	w3, [x3,x26,lsl 2]
+	mov	w26, w0
+	ldr	w0, [x21, #:lo12:.LANCHOR2]
+	tbz	x0, 14, .L3073
+	ldr	x0, [x27, 24]
+	mov	w1, w26
+	ldr	w3, [x25, x24, lsl 2]
+	ldr	w2, [x0, 8]
+	mov	x0, x23
 	bl	printk
-.L3047:
-	ldr	x1, [x27,24]
-	add	x0, x29, 304
-	ldr	w2, [x0,x26,lsl 2]
-	ldr	w0, [x1,4]
-	ldr	w1, [x1,8]
+.L3073:
+	cmn	w26, #1
+	beq	.L3071
+	ldr	x0, [x27, 24]
+	ldr	w2, [x25, x24, lsl 2]
+	ldr	w1, [x0, 8]
+	cmp	w2, w1
+	bne	.L3071
+	ldr	w1, [x21, #:lo12:.LANCHOR2]
+	tbz	x1, 14, .L3074
+	ldr	w1, [x0, 4]
+	mov	x0, x22
+	ldr	w3, [x28, x24, lsl 2]
+	bl	printk
+.L3074:
+	ldr	x0, [x27, 24]
+	lsl	x1, x24, 2
+	ldrh	w2, [x28, x1]
+	ldr	w1, [x0, 8]
+	ldr	w0, [x0, 4]
 	bl	lpa_hash_update_ppa
-.L3043:
-	add	x26, x26, 1
-	b	.L3041
-.L3149:
-	mov	x0, x27
-	bl	zbuf_free
-	ldrh	w1, [x28,1384]
-	ldrh	w0, [x19,12]
-	ldrb	w2, [x19,9]
-	madd	w0, w1, w2, w0
-	mov	x1, -4
-	add	x0, x1, w0, sxtw 2
-	ldr	x1, [x28,1936]
-	ldr	w0, [x1,x0]
-	cmn	w0, #1
-	beq	.L3049
-	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
-	add	x1, x1, :lo12:.LANCHOR4
-	mov	w2, 1917
-	add	x1, x1, 776
-	add	x0, x0, :lo12:.LC0
-	bl	printk
-	bl	dump_stack
-.L3049:
-	ldrh	w0, [x19,6]
-	cmp	w0, 1
-	bne	.L2998
-	mov	x0, x19
-	bl	ftl_write_last_log_page
-	b	.L2998
-.L3146:
-	ldr	x0, [x1,3392]
+.L3071:
+	add	x24, x24, 1
+	b	.L3069
+.L3046:
+	ldr	x2, [x27, 24]
+	add	x1, x24, :lo12:.LANCHOR0
+	ldr	w0, [x1, 3364]
+	ldr	w3, [x2, 4]
+	cmp	w3, w0
+	bcs	.L3041
+	add	x4, x20, :lo12:.LANCHOR3
+	ldrb	w0, [x19, 9]
+	ldrh	w3, [x19, 10]
+	ldrh	w4, [x4, 1376]
+	mul	w0, w0, w4
+	sub	w0, w0, #1
+	cmp	w3, w0
+	bge	.L3041
+	ldr	x0, [x1, 3384]
 	ldr	w2, [x2]
-	ldr	w1, [x0,8]
+	ldr	w1, [x0, 8]
 	cmp	w2, w1
-	bls	.L3018
-	str	w2, [x0,8]
-.L3018:
-	ldr	x1, [x27,24]
-	ldrh	w0, [x19,10]
-	ldrh	w2, [x19,12]
-	add	w2, w2, w0
-	ldr	w0, [x1,4]
-	ldr	w1, [x1,8]
+	bls	.L3047
+	str	w2, [x0, 8]
+.L3047:
+	ldr	x0, [x27, 24]
+	ldrh	w1, [x19, 12]
+	ldrh	w2, [x19, 10]
+	add	w2, w2, w1
+	ldr	w1, [x0, 8]
+	ldr	w0, [x0, 4]
 	bl	lpa_hash_update_ppa
-	ldr	w0, [x21,4]
-	str	w0, [x21]
-	ldr	w0, [x21,8]
-	str	w0, [x21,4]
-	ldr	w0, [x21,12]
-	str	w0, [x21,8]
-	ldr	w0, [x29,152]
-	str	w0, [x21,12]
-	b	.L3017
-.L2998:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 368
-	ret
+	ldr	w0, [x29, 164]
+	str	w0, [x29, 160]
+	ldr	w0, [x29, 168]
+	str	w0, [x29, 164]
+	ldr	w0, [x29, 172]
+	str	w0, [x29, 168]
+	ldr	w0, [x29, 128]
+	str	w0, [x29, 172]
+	b	.L3041
 	.size	ftl_open_sblk_recovery, .-ftl_open_sblk_recovery
 	.align	2
 	.global	dump_ftl_info
@@ -20004,103 +19873,100 @@ ftl_open_sblk_recovery:
 dump_ftl_info:
 	stp	x29, x30, [sp, -32]!
 	adrp	x0, .LC224
+	add	x0, x0, :lo12:.LC224
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR0
-	add	x0, x0, :lo12:.LC224
 	add	x19, x19, :lo12:.LANCHOR0
 	adrp	x20, .LANCHOR3
 	add	x20, x20, :lo12:.LANCHOR3
-	ldrb	w1, [x19,3362]
+	ldrb	w1, [x19, 3353]
 	bl	printk
-	adrp	x3, .LANCHOR5
+	adrp	x0, .LANCHOR5
+	add	x0, x0, :lo12:.LANCHOR5
+	ldrh	w3, [x0, 386]
+	ldrb	w2, [x0, 385]
+	ldrb	w1, [x0, 384]
 	adrp	x0, .LC225
-	add	x3, x3, :lo12:.LANCHOR5
 	add	x0, x0, :lo12:.LC225
-	ldrb	w1, [x3,640]
-	ldrb	w2, [x3,641]
-	ldrh	w3, [x3,642]
 	bl	printk
-	ldr	x2, [x19,3392]
+	ldr	x0, [x19, 3384]
+	ldrh	w2, [x0, 140]
+	ldrh	w1, [x0, 130]
 	adrp	x0, .LC226
 	add	x0, x0, :lo12:.LC226
-	ldrh	w1, [x2,130]
-	ldrh	w2, [x2,140]
 	bl	printk
-	ldr	x1, [x19,1120]
+	ldr	x1, [x19, 1128]
 	adrp	x0, .LC227
 	add	x0, x0, :lo12:.LC227
-	add	x5, x1, 16
-	ldrh	w1, [x1,16]
-	ldrh	w2, [x5,2]
-	ldrb	w3, [x5,5]
-	ldrh	w4, [x5,6]
-	ldrh	w5, [x5,10]
-	bl	printk
-	ldr	x1, [x19,1120]
+	ldrh	w5, [x1, 26]
+	ldrh	w4, [x1, 22]
+	ldrb	w3, [x1, 21]
+	ldrh	w2, [x1, 18]
+	ldrh	w1, [x1, 16]
+	bl	printk
+	ldr	x1, [x19, 1128]
 	adrp	x0, .LC228
 	add	x0, x0, :lo12:.LC228
-	add	x5, x1, 48
-	ldrh	w1, [x1,48]
-	ldrh	w2, [x5,2]
-	ldrb	w3, [x5,5]
-	ldrh	w4, [x5,6]
-	ldrh	w5, [x5,10]
-	bl	printk
-	ldr	x1, [x19,1120]
+	ldrh	w5, [x1, 58]
+	ldrh	w4, [x1, 54]
+	ldrb	w3, [x1, 53]
+	ldrh	w2, [x1, 50]
+	ldrh	w1, [x1, 48]
+	bl	printk
+	ldr	x1, [x19, 1128]
 	adrp	x0, .LC229
 	add	x0, x0, :lo12:.LC229
-	add	x5, x1, 80
-	ldrh	w1, [x1,80]
-	ldrh	w4, [x5,6]
-	ldrh	w2, [x5,2]
-	ldrb	w3, [x5,5]
-	ldrh	w5, [x5,10]
-	bl	printk
-	ldrh	w0, [x20,1384]
+	ldrh	w5, [x1, 90]
+	ldrh	w4, [x1, 86]
+	ldrb	w3, [x1, 85]
+	ldrh	w2, [x1, 82]
+	ldrh	w1, [x1, 80]
+	bl	printk
+	ldrb	w0, [x20, 1321]
 	mov	w2, 4
-	ldrb	w3, [x20,1329]
-	ldr	x1, [x20,1936]
-	mul	w3, w0, w3
+	ldrh	w3, [x20, 1376]
+	ldr	x1, [x20, 1928]
+	mul	w3, w3, w0
 	adrp	x0, .LC230
 	add	x0, x0, :lo12:.LC230
 	lsl	w3, w3, 1
 	bl	rknand_print_hex
-	ldr	x1, [x19,1112]
+	ldrh	w3, [x19, 1096]
+	mov	w2, 2
+	ldr	x1, [x19, 1120]
 	adrp	x0, .LC231
-	ldrh	w3, [x19,1088]
 	add	x0, x0, :lo12:.LC231
-	mov	w2, 2
 	bl	rknand_print_hex
-	ldr	x3, [x19,3392]
+	ldr	x1, [x19, 3384]
+	mov	w2, 4
 	adrp	x0, .LC211
 	add	x0, x0, :lo12:.LC211
-	mov	w2, 4
-	add	x1, x3, 704
-	ldrh	w3, [x3,698]
+	add	x1, x1, 704
+	ldrh	w3, [x1, -6]
 	bl	rknand_print_hex
-	ldr	x1, [x19,1096]
+	ldrh	w3, [x19, 1096]
+	mov	w2, 4
+	ldr	x1, [x19, 1104]
 	adrp	x0, .LC232
-	ldrh	w3, [x19,1088]
 	add	x0, x0, :lo12:.LC232
-	mov	w2, 4
 	bl	rknand_print_hex
+	add	x1, x20, 1416
+	mov	w3, 256
+	mov	w2, 2
 	adrp	x0, .LC233
-	add	x1, x20, 1424
 	add	x0, x0, :lo12:.LC233
-	mov	w2, 2
-	mov	w3, 256
 	bl	rknand_print_hex
-	ldrh	w0, [x20,1384]
+	ldrb	w0, [x20, 1321]
 	mov	w2, 2
-	ldrb	w3, [x20,1329]
-	ldr	x1, [x20,1944]
-	mul	w3, w0, w3
+	ldrh	w3, [x20, 1376]
+	ldr	x1, [x20, 1936]
+	mul	w3, w3, w0
 	adrp	x0, .LC234
 	add	x0, x0, :lo12:.LC234
 	lsl	w3, w3, 1
 	bl	rknand_print_hex
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	dump_ftl_info, .-dump_ftl_info
@@ -20109,376 +19975,360 @@ dump_ftl_info:
 	.type	pm_ppa_update_check, %function
 pm_ppa_update_check:
 	adrp	x3, .LANCHOR0
-	adrp	x7, .LANCHOR3
 	add	x3, x3, :lo12:.LANCHOR0
-	add	x7, x7, :lo12:.LANCHOR3
-	stp	x29, x30, [sp, -16]!
+	adrp	x6, .LANCHOR3
+	add	x6, x6, :lo12:.LANCHOR3
 	mov	w5, 24
-	add	x29, sp, 0
-	ldrb	w6, [x3,1257]
-	ldrh	w4, [x7,1312]
-	sub	w5, w5, w6
-	mov	w6, 1
-	sub	w5, w5, w4
-	lsr	w4, w2, w4
-	lsl	w5, w6, w5
-	ldr	x3, [x3,1096]
-	sub	w5, w5, #1
-	and	w4, w5, w4
-	ldrb	w5, [x7,1314]
+	ldrb	w4, [x3, 1205]
+	ldrh	w7, [x6, 1304]
+	sub	w4, w5, w4
+	ldr	x3, [x3, 1104]
+	sub	w5, w4, w7
+	mov	w4, 1
+	lsr	w7, w2, w7
+	lsl	w4, w4, w5
+	ldrb	w5, [x6, 1306]
+	sub	w4, w4, #1
+	and	w4, w4, w7
 	udiv	w4, w4, w5
 	add	x4, x3, w4, uxth 2
-	ldrb	w3, [x4,2]
+	ldrb	w3, [x4, 2]
 	ubfx	x3, x3, 5, 3
-	cmp	w3, 7
-	cset	w4, eq
-	cbnz	w4, .L3155
-	cmp	w3, w6
-	bne	.L3152
-.L3155:
+	cmp	w3, 1
+	ccmp	w3, 7, 4, ne
+	bne	.L3151
 	mov	w3, w2
 	mov	w2, w1
 	mov	x1, x0
+	stp	x29, x30, [sp, -16]!
 	adrp	x0, .LC235
 	add	x0, x0, :lo12:.LC235
+	add	x29, sp, 0
 	bl	printk
 	bl	dump_ftl_info
-	mov	w4, -1
-.L3152:
-	mov	w0, w4
+	mov	w0, -1
 	ldp	x29, x30, [sp], 16
 	ret
+.L3151:
+	mov	w0, 0
+	ret
 	.size	pm_ppa_update_check, .-pm_ppa_update_check
 	.align	2
 	.type	load_l2p_region, %function
 load_l2p_region:
-	stp	x29, x30, [sp, -96]!
+	stp	x29, x30, [sp, -80]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	uxth	x22, w1
-	str	x27, [sp,80]
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	cmp	w22, 31
-	uxth	w21, w0
-	bls	.L3158
+	stp	x19, x20, [sp, 16]
+	and	w20, w0, 65535
+	stp	x21, x22, [sp, 32]
+	and	x21, x1, 65535
+	stp	x23, x24, [sp, 48]
+	cmp	w21, 31
+	stp	x25, x26, [sp, 64]
+	bls	.L3157
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 816
 	mov	w2, 32
-	add	x1, x1, 800
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L3158:
-	adrp	x24, .LANCHOR0
-	adrp	x20, .LANCHOR5
-	add	x26, x24, :lo12:.LANCHOR0
-	ldr	x0, [x26,3392]
-	ldrh	w2, [x0,698]
-	cmp	w21, w2
-	bls	.L3159
+.L3157:
+	adrp	x23, .LANCHOR0
+	add	x22, x23, :lo12:.LANCHOR0
+	adrp	x19, .LANCHOR5
+	ldr	x0, [x22, 3384]
+	ldrh	w2, [x0, 698]
+	cmp	w2, w20
+	bcs	.L3158
+	mov	w1, w20
 	adrp	x0, .LC236
-	mov	w1, w21
+	add	x19, x19, :lo12:.LANCHOR5
 	add	x0, x0, :lo12:.LC236
-	mov	x19, 0
-	add	x20, x20, :lo12:.LANCHOR5
 	bl	printk
-	ldr	x0, [x19,8]
+	mov	x0, 0
 	mov	w1, 255
-	ldrh	w2, [x20,998]
+	ldrh	w2, [x19, 462]
+	ldr	x0, [x0, 8]
 	bl	ftl_memset
-	ldr	x0, [x26,3392]
-	ldrh	w0, [x0,698]
-	cmp	w0, w21
-	bcs	.L3171
+	ldr	x0, [x22, 3384]
+	ldrh	w0, [x0, 698]
+	cmp	w0, w20
+	bcc	.L3159
+.L3169:
+	mov	w0, 0
+.L3156:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	ret
+.L3159:
+	mov	w2, 37
+.L3170:
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 816
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
-	add	x1, x1, 800
-	mov	w2, 37
-	b	.L3172
-.L3159:
-	add	x0, x0, w21, sxtw 2
-	adrp	x25, .LANCHOR3
-	ldr	w19, [x0,704]
-	add	x0, x25, :lo12:.LANCHOR3
-	add	x0, x0, 1968
-	lsl	x1, x22, 4
-	add	x27, x0, x1
-	strh	w21, [x0,x1]
-	strh	wzr, [x27,2]
-	cbnz	w19, .L3162
+	bl	printk
+	bl	dump_stack
+	b	.L3169
+.L3158:
+	add	x0, x0, w20, sxtw 2
+	adrp	x22, .LANCHOR3
+	lsl	x1, x21, 4
+	ldr	w24, [x0, 704]
+	add	x0, x22, :lo12:.LANCHOR3
+	add	x2, x0, 1960
+	add	x26, x2, x1
+	strh	w20, [x2, x1]
+	strh	wzr, [x26, 2]
+	cbnz	w24, .L3161
+	add	x19, x19, :lo12:.LANCHOR5
+	mov	w1, w20
+	mov	w2, 0
 	adrp	x0, .LC237
-	mov	w1, w21
-	mov	w2, w19
-	add	x20, x20, :lo12:.LANCHOR5
 	add	x0, x0, :lo12:.LC237
 	bl	printk
-	ldr	x0, [x27,8]
+	ldrh	w2, [x19, 462]
 	mov	w1, 255
-	ldrh	w2, [x20,998]
+	ldr	x0, [x26, 8]
 	bl	ftl_memset
-	b	.L3171
-.L3162:
-	add	x23, x20, :lo12:.LANCHOR5
-	ldrb	w3, [x26,3360]
-	ldr	x1, [x27,8]
-	mov	w0, w19
-	ldr	x2, [x23,968]
+	b	.L3169
+.L3161:
+	add	x25, x19, :lo12:.LANCHOR5
+	ldrb	w3, [x0, 1946]
+	ldr	x1, [x26, 8]
+	mov	w0, w24
+	ldr	x2, [x25, 432]
 	bl	ftl_read_ppa_page
-	mov	w3, w0
-	ldr	x0, [x23,968]
-	ldr	w2, [x0]
-	cmp	w2, w21
-	bne	.L3163
-	cmn	w3, #1
-	beq	.L3163
-	cmp	w3, 512
-	beq	.L3163
-.L3168:
-	add	x20, x20, :lo12:.LANCHOR5
-	ldr	x0, [x20,968]
-	ldr	w0, [x0]
-	cmp	w0, w21
-	beq	.L3171
-	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
-	add	x1, x1, :lo12:.LANCHOR4
-	add	x0, x0, :lo12:.LC0
-	add	x1, x1, 800
+	ldr	x1, [x25, 432]
+	ldr	w2, [x1]
+	cmp	w2, w20
+	bne	.L3162
+	cmp	w0, 512
+	ccmn	w0, #1, 4, ne
+	beq	.L3162
+.L3166:
+	add	x19, x19, :lo12:.LANCHOR5
+	ldr	x0, [x19, 432]
+	ldr	w0, [x0]
+	cmp	w20, w0
+	beq	.L3169
 	mov	w2, 73
-	b	.L3172
-.L3163:
+	b	.L3170
+.L3162:
+	add	x23, x23, :lo12:.LANCHOR0
+	mov	w4, w24
+	mov	w3, w0
+	mov	w1, w20
 	adrp	x0, .LC238
-	mov	w4, w19
-	add	x24, x24, :lo12:.LANCHOR0
-	mov	w1, w21
 	add	x0, x0, :lo12:.LC238
-	add	x23, x25, :lo12:.LANCHOR3
-	add	x23, x23, 1968
-	add	x26, x20, :lo12:.LANCHOR5
 	bl	printk
-	add	x23, x23, x22, lsl 4
-	ldr	x3, [x24,3392]
+	add	x22, x22, :lo12:.LANCHOR3
+	ldr	x1, [x23, 3384]
+	mov	w2, 4
 	adrp	x0, .LC239
 	add	x0, x0, :lo12:.LC239
-	mov	w2, 4
-	add	x1, x3, 704
-	ldrh	w3, [x3,698]
+	add	x1, x1, 704
+	add	x23, x19, :lo12:.LANCHOR5
+	ldrh	w3, [x1, -6]
 	bl	rknand_print_hex
-	ldrb	w3, [x24,3360]
+	add	x0, x22, 1960
+	ldrb	w3, [x22, 1946]
+	add	x21, x0, x21, lsl 4
+	mov	w2, 4
 	adrp	x0, .LC218
-	ldr	x1, [x23,8]
 	add	x0, x0, :lo12:.LC218
-	mov	w2, 4
 	lsl	w3, w3, 7
+	ldr	x1, [x21, 8]
 	bl	rknand_print_hex
-	ldr	x1, [x26,968]
+	ldr	x1, [x23, 432]
+	mov	w3, 16
+	mov	w2, 4
 	adrp	x0, .LC240
 	add	x0, x0, :lo12:.LC240
-	mov	w2, 4
-	mov	w3, 16
 	bl	rknand_print_hex
-	ldr	x1, [x23,8]
-	mov	w0, w19
-	ldr	x2, [x26,968]
-	ldrb	w3, [x24,3360]
+	ldrb	w3, [x22, 1946]
+	mov	w0, w24
+	ldr	x1, [x21, 8]
+	ldr	x2, [x23, 432]
 	bl	ftl_read_ppa_page
 	cmp	w0, 512
-	beq	.L3170
-	cmn	w0, #1
-	bne	.L3166
-.L3170:
-	add	x25, x25, :lo12:.LANCHOR3
-	add	x20, x20, :lo12:.LANCHOR5
-	add	x22, x25, x22, lsl 4
+	ccmn	w0, #1, 4, ne
+	bne	.L3165
+	ldrh	w2, [x23, 462]
 	mov	w1, 255
-	ldrh	w2, [x20,998]
-	ldr	x0, [x22,1976]
+	ldr	x0, [x21, 8]
 	bl	ftl_memset
+.L3167:
 	mov	w0, -1
-	b	.L3161
-.L3166:
-	ldr	x0, [x26,968]
-	ldr	w1, [x0]
-	mov	w0, -1
-	cmp	w1, w21
-	beq	.L3168
-	b	.L3161
-.L3172:
-	bl	printk
-	bl	dump_stack
-.L3171:
-	mov	w0, 0
-.L3161:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldr	x27, [sp,80]
-	ldp	x29, x30, [sp], 96
-	ret
+	b	.L3156
+.L3165:
+	ldr	x0, [x23, 432]
+	ldr	w0, [x0]
+	cmp	w20, w0
+	beq	.L3166
+	b	.L3167
 	.size	load_l2p_region, .-load_l2p_region
 	.align	2
 	.global	pm_gc
 	.type	pm_gc, %function
 pm_gc:
-	stp	x29, x30, [sp, -80]!
+	stp	x29, x30, [sp, -64]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR0
-	adrp	x20, .LANCHOR5
 	add	x0, x19, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	adrp	x20, .LANCHOR5
 	add	x1, x20, :lo12:.LANCHOR5
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	ldr	x0, [x0,3392]
-	ldrh	w2, [x0,688]
-	ldrh	w0, [x1,264]
+	ldr	x0, [x0, 3384]
+	ldrh	w2, [x0, 688]
+	ldrh	w0, [x1, 220]
 	sub	w0, w0, #1
 	cmp	w2, w0
-	bge	.L3174
-	ldr	w0, [x1,256]
-	cbz	w0, .L3175
-.L3174:
+	bge	.L3172
+	ldr	w0, [x1, 212]
+	cbz	w0, .L3173
+.L3172:
 	bl	pm_free_sblk
 	add	x1, x19, :lo12:.LANCHOR0
 	add	x3, x20, :lo12:.LANCHOR5
-	ldr	x2, [x1,3392]
-	ldrh	w1, [x3,264]
-	ldrh	w4, [x2,688]
+	ldr	x2, [x1, 3384]
+	ldrh	w1, [x3, 220]
 	sub	w1, w1, #1
+	ldrh	w4, [x2, 688]
 	cmp	w4, w1
-	bge	.L3176
-	ldr	w1, [x3,256]
-	cbz	w1, .L3175
-.L3176:
+	bge	.L3174
+	ldr	w1, [x3, 212]
+	cbz	w1, .L3173
+.L3174:
 	add	x20, x20, :lo12:.LANCHOR5
 	add	x0, x2, w0, uxth 1
-	ldrh	w21, [x0,416]
-	str	wzr, [x20,256]
+	str	wzr, [x20, 212]
 	mov	w20, 65535
-	cmp	w21, w20
-	bne	.L3178
+	ldrh	w22, [x0, 416]
+	cmp	w22, w20
+	bne	.L3176
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 832
 	mov	w2, 182
-	add	x1, x1, 816
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
 	bl	pm_free_sblk
 	add	x1, x19, :lo12:.LANCHOR0
-	ldr	x1, [x1,3392]
+	ldr	x1, [x1, 3384]
 	add	x0, x1, w0, uxth 1
-	ldrh	w21, [x0,416]
-	cmp	w21, w20
-	beq	.L3175
-.L3178:
+	ldrh	w22, [x0, 416]
+	cmp	w22, w20
+	beq	.L3173
+.L3176:
 	bl	pm_select_ram_region
-	adrp	x26, .LANCHOR3
-	uxth	x20, w0
-	add	x0, x26, :lo12:.LANCHOR3
-	lsl	x1, x20, 4
-	add	x0, x0, 1968
-	add	x23, x0, x1
-	mov	x22, x20
-	ldrh	w0, [x0,x1]
+	adrp	x24, .LANCHOR3
+	and	x21, x0, 65535
+	add	x0, x24, :lo12:.LANCHOR3
+	lsl	x1, x21, 4
+	add	x0, x0, 1960
+	add	x20, x0, x1
+	mov	x23, x21
+	ldrh	w0, [x0, x1]
 	mov	w1, 65535
 	cmp	w0, w1
-	beq	.L3179
-	ldr	x1, [x23,8]
-	cbz	x1, .L3179
-	ldrsh	w2, [x23,2]
-	tbz	w2, #31, .L3179
+	beq	.L3177
+	ldr	x1, [x20, 8]
+	cbz	x1, .L3177
+	ldrsh	w2, [x20, 2]
+	tbz	w2, #31, .L3177
 	bl	pm_write_page
-	ldrh	w0, [x23,2]
+	ldrh	w0, [x20, 2]
 	and	w0, w0, 32767
-	strh	w0, [x23,2]
-.L3179:
-	add	x26, x26, :lo12:.LANCHOR3
-	mov	w25, 0
-	add	x0, x26, 1968
-	mov	w23, 24
-	mov	w24, 1
-	add	x20, x0, x20, lsl 4
-.L3180:
-	add	x2, x19, :lo12:.LANCHOR0
-	ldr	x0, [x2,3392]
-	ldrh	w1, [x0,698]
-	cmp	w1, w25
-	bls	.L3190
-	ldrb	w2, [x2,1257]
-	add	x0, x0, w25, sxtw 2
-	ldrh	w1, [x26,1312]
-	ldr	w0, [x0,704]
-	sub	w2, w23, w2
-	lsr	w0, w0, w1
-	sub	w1, w2, w1
-	lsl	w1, w24, w1
-	sub	w1, w1, #1
-	and	w1, w0, w1
-	ldrb	w0, [x26,1314]
-	udiv	w1, w1, w0
-	cmp	w21, w1, uxth
-	bne	.L3181
-	mov	w0, w25
-	mov	w1, w22
-	bl	load_l2p_region
-	cbnz	w0, .L3182
-	ldr	x1, [x20,8]
-	mov	w0, w25
-	bl	pm_write_page
-.L3182:
-	mov	w0, -1
-	strh	w0, [x20]
-.L3181:
-	add	w25, w25, 1
-	uxth	w25, w25
-	b	.L3180
-.L3190:
+	strh	w0, [x20, 2]
+.L3177:
+	add	x24, x24, :lo12:.LANCHOR3
+	add	x19, x19, :lo12:.LANCHOR0
+	add	x0, x24, 1960
+	mov	w20, 0
+	add	x21, x0, x21, lsl 4
+.L3178:
+	ldr	x2, [x19, 3384]
+	ldrh	w0, [x2, 698]
+	cmp	w0, w20
+	bhi	.L3181
 	bl	pm_free_sblk
-.L3175:
+.L3173:
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 80
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x29, x30, [sp], 64
 	ret
+.L3181:
+	ldrb	w1, [x19, 1205]
+	mov	w0, 24
+	ldrh	w3, [x24, 1304]
+	add	x2, x2, w20, sxtw 2
+	sub	w0, w0, w1
+	sub	w1, w0, w3
+	mov	w0, 1
+	lsl	w0, w0, w1
+	ldr	w1, [x2, 704]
+	sub	w0, w0, #1
+	lsr	w1, w1, w3
+	and	w0, w0, w1
+	ldrb	w1, [x24, 1306]
+	udiv	w0, w0, w1
+	cmp	w22, w0, uxth
+	bne	.L3179
+	mov	w1, w23
+	mov	w0, w20
+	bl	load_l2p_region
+	cbnz	w0, .L3180
+	ldr	x1, [x21, 8]
+	mov	w0, w20
+	bl	pm_write_page
+.L3180:
+	mov	w0, -1
+	strh	w0, [x21]
+.L3179:
+	add	w20, w20, 1
+	and	w20, w20, 65535
+	b	.L3178
 	.size	pm_gc, .-pm_gc
 	.align	2
 	.global	pm_flush_id
 	.type	pm_flush_id, %function
 pm_flush_id:
 	stp	x29, x30, [sp, -32]!
-	adrp	x1, .LANCHOR3
+	adrp	x2, .LANCHOR3
+	add	x2, x2, :lo12:.LANCHOR3
 	ubfiz	x0, x0, 4, 16
-	add	x1, x1, :lo12:.LANCHOR3
+	add	x2, x2, 1960
 	add	x29, sp, 0
-	add	x1, x1, 1968
-	str	x19, [sp,16]
-	add	x19, x1, x0
-	ldrh	w0, [x1,x0]
-	ldr	x1, [x19,8]
+	str	x19, [sp, 16]
+	add	x19, x2, x0
+	ldrh	w0, [x2, x0]
+	ldr	x1, [x19, 8]
 	bl	pm_write_page
-	ldrh	w0, [x19,2]
+	ldrh	w0, [x19, 2]
 	and	w0, w0, 32767
-	strh	w0, [x19,2]
+	strh	w0, [x19, 2]
 	adrp	x19, .LANCHOR5
 	add	x19, x19, :lo12:.LANCHOR5
-	ldr	w0, [x19,960]
-	cbz	w0, .L3192
+	ldr	w0, [x19, 424]
+	cbz	w0, .L3190
 	bl	pm_gc
-	str	wzr, [x19,960]
-.L3192:
+	str	wzr, [x19, 424]
+.L3190:
 	mov	w0, 0
-	ldr	x19, [sp,16]
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	pm_flush_id, .-pm_flush_id
@@ -20488,23 +20338,24 @@ pm_flush_id:
 pm_flush:
 	stp	x29, x30, [sp, -32]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x20, .LANCHOR3
-	mov	x19, 0
-	add	x20, x20, :lo12:.LANCHOR3
-	add	x20, x20, 1968
-.L3198:
-	add	x1, x20, x19, lsl 4
-	uxth	w0, w19
-	ldrsh	w1, [x1,2]
-	tbz	w1, #31, .L3197
-	bl	pm_flush_id
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR3
+	add	x19, x19, :lo12:.LANCHOR3
+	mov	w20, 0
+	add	x19, x19, 1962
 .L3197:
-	add	x19, x19, 1
-	cmp	x19, 32
-	bne	.L3198
+	ldrsh	w0, [x19]
+	tbz	w0, #31, .L3196
+	mov	w0, w20
+	bl	pm_flush_id
+.L3196:
+	add	w20, w20, 1
+	add	x19, x19, 16
+	and	w20, w20, 65535
+	cmp	w20, 32
+	bne	.L3197
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
 	.size	pm_flush, .-pm_flush
@@ -20540,374 +20391,363 @@ zftl_deinit:
 pm_init:
 	stp	x29, x30, [sp, -128]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR5
 	add	x19, x20, :lo12:.LANCHOR5
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	mov	w23, w0
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	mov	w24, w0
+	stp	x25, x26, [sp, 64]
 	mov	w0, 1
-	strb	w0, [x19,976]
+	stp	x27, x28, [sp, 80]
+	mov	w25, -1
+	strb	w0, [x19, 440]
 	mov	w0, 64
-	str	wzr, [x19,256]
-	mov	w24, -1
-	str	wzr, [x19,960]
-	bl	ftl_malloc
-	str	x0, [x19,968]
+	str	wzr, [x19, 212]
+	str	wzr, [x19, 424]
+	bl	ftl_dma32_malloc
+	str	x0, [x19, 432]
 	adrp	x19, .LANCHOR3
-	add	x1, x19, :lo12:.LANCHOR3
-	adrp	x25, .LANCHOR0
-	add	x21, x1, 1968
-	add	x22, x1, 2480
-.L3204:
-	strh	w24, [x21]
-	strh	wzr, [x21,2]
-	cbz	w23, .L3203
-	add	x0, x25, :lo12:.LANCHOR0
-	ldrb	w0, [x0,3360]
+	add	x0, x19, :lo12:.LANCHOR3
+	add	x21, x0, 1960
+	add	x23, x0, 2472
+	mov	x22, x0
+.L3206:
+	strh	w25, [x21]
+	strh	wzr, [x21, 2]
+	cbz	w24, .L3205
+	ldrb	w0, [x22, 1946]
 	lsl	w0, w0, 9
-	bl	ftl_malloc
-	str	x0, [x21,8]
-.L3203:
+	bl	ftl_dma32_malloc
+	str	x0, [x21, 8]
+.L3205:
 	add	x21, x21, 16
-	cmp	x21, x22
-	bne	.L3204
+	cmp	x21, x23
+	bne	.L3206
 	add	x0, x19, :lo12:.LANCHOR3
 	adrp	x21, .LANCHOR0
 	add	x23, x21, :lo12:.LANCHOR0
 	mov	w4, 4
-	ldr	x26, [x0,1976]
+	ldr	x26, [x0, 1968]
 	add	x0, x20, :lo12:.LANCHOR5
-	ldr	x1, [x23,3392]
 	mov	x2, x26
-	ldr	x22, [x0,968]
-	ldrb	w0, [x1,694]
-	ldrh	w1, [x1,692]
+	ldr	x22, [x0, 432]
+	ldr	x0, [x23, 3384]
 	mov	x3, x22
+	ldrh	w1, [x0, 692]
+	ldrb	w0, [x0, 694]
 	bl	flash_get_last_written_page
 	sxth	w24, w0
-	ldr	x1, [x23,3392]
+	ldr	x0, [x23, 3384]
 	mov	w25, w24
-	ldrh	w2, [x1,696]
+	ldrh	w2, [x0, 696]
 	cmp	w2, w24
-	bgt	.L3205
+	bgt	.L3207
+	ldrh	w1, [x0, 692]
+	mov	w3, w24
 	adrp	x0, .LC241
-	ldrh	w1, [x1,692]
 	add	x0, x0, :lo12:.LC241
-	mov	w3, w24
-	adrp	x27, .LC242
 	adrp	x28, .LC243
-	bl	printk
 	add	x28, x28, :lo12:.LC243
-	ldr	x0, [x23,3392]
-	ldrsh	w23, [x0,696]
+	adrp	x27, .LC242
+	bl	printk
+	ldr	x0, [x23, 3384]
+	ldrsh	w23, [x0, 696]
 	add	w0, w24, 1
-	str	w0, [x29,124]
+	str	w0, [x29, 124]
 	add	x0, x27, :lo12:.LC242
-	str	x0, [x29,112]
-.L3206:
-	ldr	w0, [x29,124]
-	cmp	w23, w0
-	bge	.L3227
-	add	x27, x21, :lo12:.LANCHOR0
-	add	x1, x19, :lo12:.LANCHOR3
-	mov	x2, x26
-	mov	x3, x22
-	ldr	x0, [x27,3392]
-	ldrh	w1, [x1,1418]
-	ldrb	w4, [x27,3360]
-	ldrh	w24, [x0,692]
-	ldrb	w0, [x0,694]
-	madd	w24, w24, w1, w23
-	mov	w1, w24
-	bl	flash_read_page_en
-	mov	w4, w0
-	ldr	x3, [x27,3392]
-	mov	w2, w24
-	ldr	x0, [x29,112]
-	str	x4, [x29,104]
-	ldr	w1, [x3,48]
-	add	w1, w1, 1
-	str	w1, [x3,48]
-	ldrh	w3, [x3,694]
-	ldr	w1, [x22]
-	bl	printk
-	ldr	x4, [x29,104]
-	cmp	w4, 512
-	beq	.L3207
-	cmn	w4, #1
-	beq	.L3207
-	ldr	x0, [x27,3392]
-	ldr	w1, [x22]
-	ldrh	w0, [x0,698]
-	cmp	w1, w0
-	bcs	.L3207
-	ldr	w2, [x22,8]
-	cbz	w2, .L3208
-	ldrb	w1, [x27,3360]
-	mov	x0, x26
-	str	x2, [x29,104]
-	lsl	w1, w1, 9
-	bl	js_hash
-	ldr	x2, [x29,104]
-	cmp	w2, w0
-	beq	.L3208
-	ldr	w1, [x22,8]
-	mov	x0, x28
-	bl	printk
-	b	.L3207
+	str	x0, [x29, 112]
 .L3208:
-	add	x0, x21, :lo12:.LANCHOR0
-	ldr	x1, [x0,3392]
-	ldr	w0, [x22]
-	add	x0, x0, 176
-	str	w24, [x1,x0,lsl 2]
-.L3207:
-	add	w23, w23, 1
-	sxth	w23, w23
-	b	.L3206
-.L3227:
+	ldr	w0, [x29, 124]
+	cmp	w23, w0
+	blt	.L3211
 	add	x0, x20, :lo12:.LANCHOR5
 	add	x21, x21, :lo12:.LANCHOR0
 	mov	w1, 1
 	add	w25, w25, 1
-	strb	w1, [x0,657]
-	ldr	x0, [x21,3392]
-	strh	w25, [x0,696]
+	strb	w1, [x0, 401]
+	ldr	x0, [x21, 3384]
+	strh	w25, [x0, 696]
 	bl	pm_free_sblk
-.L3205:
+.L3207:
 	add	x19, x19, :lo12:.LANCHOR3
 	add	x20, x20, :lo12:.LANCHOR5
 	mov	w1, 255
-	add	x19, x19, 1968
-	ldr	x0, [x19,8]
-	ldrh	w2, [x20,998]
+	add	x19, x19, 1960
+	ldrh	w2, [x20, 462]
+	ldr	x0, [x19, 8]
 	bl	ftl_memset
-	ldr	x1, [x19,8]
+	ldr	x1, [x19, 8]
 	mov	w0, -1
 	bl	pm_write_page
-	ldrb	w0, [x20,657]
-	cbz	w0, .L3210
-	ldr	x1, [x19,8]
+	ldrb	w0, [x20, 401]
+	cbz	w0, .L3212
+	ldr	x1, [x19, 8]
 	mov	w0, -1
 	bl	pm_write_page
-	ldr	x1, [x19,8]
+	ldr	x1, [x19, 8]
 	mov	w0, -1
 	bl	pm_write_page
-	ldr	x1, [x19,8]
+	ldr	x1, [x19, 8]
 	mov	w0, -1
 	bl	pm_write_page
-.L3210:
+.L3212:
 	bl	pm_free_sblk
 	bl	pm_gc
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 128
 	ret
+.L3211:
+	add	x27, x21, :lo12:.LANCHOR0
+	add	x5, x19, :lo12:.LANCHOR3
+	mov	x3, x22
+	mov	x2, x26
+	str	x5, [x29, 104]
+	ldr	x0, [x27, 3384]
+	ldrh	w1, [x5, 1410]
+	ldrb	w4, [x5, 1946]
+	ldrh	w24, [x0, 692]
+	ldrb	w0, [x0, 694]
+	madd	w24, w24, w1, w23
+	mov	w1, w24
+	bl	flash_read_page_en
+	mov	w4, w0
+	ldr	x0, [x27, 3384]
+	str	w4, [x29, 120]
+	mov	w2, w24
+	ldr	w1, [x0, 48]
+	ldrh	w3, [x0, 694]
+	add	w1, w1, 1
+	str	w1, [x0, 48]
+	ldr	x0, [x29, 112]
+	ldr	w1, [x22]
+	bl	printk
+	ldr	w4, [x29, 120]
+	cmp	w4, 512
+	ccmn	w4, #1, 4, ne
+	beq	.L3209
+	ldr	x0, [x27, 3384]
+	ldr	w1, [x22]
+	ldrh	w0, [x0, 698]
+	cmp	w1, w0
+	bcs	.L3209
+	ldr	w2, [x22, 8]
+	ldr	x5, [x29, 104]
+	cbz	w2, .L3210
+	ldrb	w1, [x5, 1946]
+	mov	x0, x26
+	str	w2, [x29, 120]
+	lsl	w1, w1, 9
+	bl	js_hash
+	ldr	w2, [x29, 120]
+	cmp	w2, w0
+	beq	.L3210
+	ldr	w1, [x22, 8]
+	mov	x0, x28
+	bl	printk
+.L3209:
+	add	w23, w23, 1
+	sxth	w23, w23
+	b	.L3208
+.L3210:
+	add	x0, x21, :lo12:.LANCHOR0
+	ldr	x1, [x0, 3384]
+	ldr	w0, [x22]
+	add	x0, x0, 176
+	str	w24, [x1, x0, lsl 2]
+	b	.L3209
 	.size	pm_init, .-pm_init
 	.align	2
 	.global	pm_log2phys
 	.type	pm_log2phys, %function
 pm_log2phys:
 	stp	x29, x30, [sp, -96]!
-	mov	w3, w0
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
-	adrp	x23, .LANCHOR0
-	add	x0, x23, :lo12:.LANCHOR0
-	stp	x25, x26, [sp,64]
-	stp	x21, x22, [sp,32]
-	stp	x19, x20, [sp,16]
-	mov	w25, w2
-	mov	x22, x1
-	ldrb	w20, [x0,3360]
-	ldr	w2, [x0,3372]
-	lsl	w24, w20, 7
-	lsl	w20, w20, 7
-	cmp	w3, w2
-	udiv	w24, w3, w24
-	uxth	w26, w24
-	msub	w20, w26, w20, w3
-	uxth	x20, w20
-	bcc	.L3229
+	stp	x21, x22, [sp, 32]
+	adrp	x21, .LANCHOR3
+	stp	x23, x24, [sp, 48]
+	mov	x23, x1
+	add	x1, x21, :lo12:.LANCHOR3
+	stp	x25, x26, [sp, 64]
+	stp	x19, x20, [sp, 16]
+	mov	w24, w2
+	str	x27, [sp, 80]
+	adrp	x22, .LANCHOR0
+	add	x2, x22, :lo12:.LANCHOR0
+	ldrb	w20, [x1, 1946]
+	ldr	w2, [x2, 3364]
+	lsl	w25, w20, 7
+	ubfiz	w20, w20, 7, 9
+	cmp	w0, w2
+	udiv	w25, w0, w25
+	and	w26, w25, 65535
+	msub	w20, w26, w20, w0
+	bcc	.L3228
+	mov	w1, w0
 	adrp	x0, .LC244
-	mov	w1, w3
 	add	x0, x0, :lo12:.LC244
 	bl	printk
 	mov	w0, -1
-	cbnz	w25, .L3230
-	str	w0, [x22]
-	b	.L3230
-.L3229:
-	adrp	x21, .LANCHOR3
+	cbnz	w24, .L3227
+	str	w0, [x23]
+.L3227:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldr	x27, [sp, 80]
+	ldp	x29, x30, [sp], 96
+	ret
+.L3228:
+	and	x20, x20, 65535
+	add	x0, x1, 1968
 	mov	x19, 0
-	add	x1, x21, :lo12:.LANCHOR3
-	add	x1, x1, 1968
-.L3235:
-	ldr	x0, [x1,8]
-	cbz	x0, .L3231
-	ldrh	w0, [x1]
-	cmp	w0, w26
-	bne	.L3231
-.L3232:
-	cbnz	w25, .L3233
+.L3234:
+	ldr	x1, [x0]
+	cbz	x1, .L3230
+	ldrh	w1, [x0, -8]
+	cmp	w1, w26
+	bne	.L3230
+.L3231:
+	cbnz	w24, .L3232
 	add	x3, x21, :lo12:.LANCHOR3
-	add	x23, x23, :lo12:.LANCHOR0
+	add	x22, x22, :lo12:.LANCHOR0
 	add	x0, x3, x19, lsl 4
-	mov	w2, 1
-	ldr	x0, [x0,1976]
-	ldr	w1, [x0,x20,lsl 2]
-	mov	w0, 24
-	str	w1, [x22]
-	ldrb	w4, [x23,1257]
-	sub	w0, w0, w4
-	lsl	w2, w2, w4
-	lsr	w1, w1, w0
-	sub	w2, w2, #1
-	and	w0, w1, w2
-	ldrb	w1, [x3,1420]
+	mov	w2, 24
+	mov	w1, 1
+	ldr	x0, [x0, 1968]
+	ldr	w0, [x0, x20, lsl 2]
+	str	w0, [x23]
+	ldrb	w4, [x22, 1205]
+	sub	w2, w2, w4
+	lsl	w1, w1, w4
+	sub	w1, w1, #1
+	lsr	w0, w0, w2
+	and	w0, w0, w1
+	ldrb	w1, [x3, 1412]
 	cmp	w0, w1
-	bcc	.L3234
+	bcc	.L3233
 	mov	w0, -1
-	str	w0, [x22]
-	b	.L3234
+	str	w0, [x23]
 .L3233:
-	add	x2, x21, :lo12:.LANCHOR3
-	ldr	w3, [x22]
-	add	x0, x2, 1968
-	add	x0, x0, x19, lsl 4
-	ldr	x1, [x0,8]
-	str	w3, [x1,x20,lsl 2]
-	strb	w24, [x2,2480]
-	ldrh	w1, [x0,2]
-	orr	w1, w1, -32768
-	strh	w1, [x0,2]
-.L3234:
 	add	x21, x21, :lo12:.LANCHOR3
-	mov	w2, 32767
-	add	x21, x21, 1968
-	mov	w0, 0
+	add	x21, x21, 1960
 	add	x19, x21, x19, lsl 4
-	ldrh	w1, [x19,2]
-	and	w3, w1, 32767
-	cmp	w3, w2
-	beq	.L3230
-	add	w1, w1, 1
-	strh	w1, [x19,2]
-	b	.L3230
-.L3231:
+	ldrh	w0, [x19, 2]
+	mvn	x1, x0
+	tst	x1, 32767
+	beq	.L3237
+	add	w0, w0, 1
+	strh	w0, [x19, 2]
+.L3237:
+	mov	w0, 0
+	b	.L3227
+.L3232:
+	add	x2, x21, :lo12:.LANCHOR3
+	ldr	w3, [x23]
+	add	x0, x2, 1960
+	add	x0, x0, x19, lsl 4
+	ldr	x1, [x0, 8]
+	str	w3, [x1, x20, lsl 2]
+	strb	w25, [x2, 2472]
+	ldrh	w1, [x0, 2]
+	orr	w1, w1, -32768
+	strh	w1, [x0, 2]
+	b	.L3233
+.L3230:
 	add	w19, w19, 1
-	add	x1, x1, 16
-	uxth	x19, w19
+	add	x0, x0, 16
+	and	x19, x19, 65535
 	cmp	w19, 32
-	bne	.L3235
+	bne	.L3234
 	bl	pm_select_ram_region
-	uxth	x19, w0
+	and	x19, x0, 65535
 	add	x2, x21, :lo12:.LANCHOR3
-	sbfiz	x3, x19, 4, 32
-	add	x2, x2, 1968
-	mov	w1, w0
-	add	x4, x2, x3
-	ldrh	w3, [x2,x3]
-	mov	w2, 65535
-	cmp	w3, w2
-	beq	.L3236
-	ldrsh	w2, [x4,2]
-	tbz	w2, #31, .L3236
-	str	x1, [x29,88]
+	sbfiz	x1, x19, 4, 32
+	add	x2, x2, 1960
+	mov	w27, w0
+	add	x3, x2, x1
+	ldrh	w2, [x2, x1]
+	mov	w1, 65535
+	cmp	w2, w1
+	beq	.L3235
+	ldrsh	w1, [x3, 2]
+	tbz	w1, #31, .L3235
 	bl	pm_flush_id
-	ldr	x1, [x29,88]
-.L3236:
-	adrp	x0, .LANCHOR5+1000
-	strb	w19, [x0,#:lo12:.LANCHOR5+1000]
+.L3235:
+	adrp	x0, .LANCHOR5+464
+	mov	w1, w27
+	strb	w19, [x0, #:lo12:.LANCHOR5+464]
 	mov	w0, w26
 	bl	load_l2p_region
-	b	.L3232
-.L3230:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x29, x30, [sp], 96
-	ret
+	b	.L3231
 	.size	pm_log2phys, .-pm_log2phys
 	.align	2
 	.global	gc_recovery
 	.type	gc_recovery, %function
 gc_recovery:
 	sub	sp, sp, #224
-	stp	x29, x30, [sp,32]
+	stp	x29, x30, [sp, 32]
 	add	x29, sp, 32
-	stp	x19, x20, [sp,48]
+	stp	x21, x22, [sp, 64]
+	adrp	x22, .LANCHOR3
+	stp	x19, x20, [sp, 48]
 	adrp	x19, .LANCHOR0
-	stp	x21, x22, [sp,64]
 	add	x21, x19, :lo12:.LANCHOR0
-	adrp	x22, .LANCHOR3
-	stp	x23, x24, [sp,80]
-	stp	x25, x26, [sp,96]
-	stp	x27, x28, [sp,112]
+	stp	x23, x24, [sp, 80]
+	stp	x25, x26, [sp, 96]
 	adrp	x23, .LANCHOR5
-	add	x25, x22, :lo12:.LANCHOR3
-	ldr	x20, [x21,1120]
+	stp	x27, x28, [sp, 112]
 	add	x0, x23, :lo12:.LANCHOR5
-	strb	wzr, [x25,1345]
-	add	x24, x20, 80
-	ldrh	w1, [x20,80]
-	strb	wzr, [x0,218]
+	add	x25, x22, :lo12:.LANCHOR3
+	ldr	x20, [x21, 1128]
+	strb	wzr, [x0, 264]
 	mov	w0, 65535
+	strb	wzr, [x25, 1337]
+	ldrh	w1, [x20, 80]
 	cmp	w1, w0
 	beq	.L3244
+	add	x24, x20, 80
 	mov	w0, -1
-	strh	w0, [x20,130]
+	strh	w0, [x20, 130]
 	mov	w0, 1
 	bl	buf_alloc
 	mov	x28, x0
-	ldrb	w0, [x24,9]
-	ldrh	w1, [x25,1418]
+	ldrb	w0, [x24, 9]
+	ldrh	w1, [x25, 1410]
 	sub	w0, w0, #1
+	ldrb	w2, [x25, 1320]
 	add	x0, x24, w0, sxtw 1
-	ldrh	w0, [x0,16]
-	mul	w0, w0, w1
-	ldrb	w1, [x25,1328]
-	str	w0, [x29,184]
-	cmp	w1, 2
+	cmp	w2, 2
+	ldrh	w0, [x0, 16]
+	mul	w1, w0, w1
+	str	w1, [x29, 184]
 	beq	.L3245
-	ldrb	w2, [x21,1268]
-	cbnz	w2, .L3245
-	ldrb	w2, [x21,1269]
-	cbz	w2, .L3246
+	ldrb	w0, [x21, 1212]
+	cbnz	w0, .L3245
+	ldrb	w0, [x21, 1213]
+	cbz	w0, .L3246
 .L3245:
-	add	x2, x22, :lo12:.LANCHOR3
-	ldrh	w2, [x2,1346]
-	sub	w2, w2, #1
-	add	w0, w2, w0
-	orr	w0, w0, w1, lsl 24
-	b	.L3332
-.L3246:
-	cmp	w1, 3
-	bne	.L3247
-	ldrh	w1, [x25,1384]
-	sub	w1, w1, #1
-	add	w0, w1, w0
-	orr	w0, w0, 50331648
-.L3332:
-	str	w0, [x28,40]
+	add	x0, x22, :lo12:.LANCHOR3
+	ldrh	w0, [x0, 1338]
+	sub	w0, w0, #1
+	add	w0, w0, w1
+	orr	w2, w0, w2, lsl 24
+	str	w2, [x28, 40]
 .L3247:
-	mov	x0, x28
 	mov	w1, 1
+	mov	x0, x28
 	bl	sblk_read_page
-	ldr	w0, [x28,52]
+	ldr	w0, [x28, 52]
 	cmp	w0, 512
+	ccmn	w0, #1, 4, ne
 	beq	.L3248
-	cmn	w0, #1
-	beq	.L3248
-	ldr	x0, [x28,24]
+	ldr	x0, [x28, 24]
 	ldr	w1, [x0]
 	mov	w0, 15555
 	movk	w0, 0xf55f, lsl 16
@@ -20916,72 +20756,137 @@ gc_recovery:
 .L3248:
 	mov	x0, x28
 	bl	zbuf_free
-	ldr	x7, [x28,24]
-	ldr	x6, [x28,8]
-	ldr	w0, [x7,4]
-	str	w0, [sp]
-	ldr	w0, [x7,8]
-	str	w0, [sp,8]
-	ldr	w0, [x7,12]
-	str	w0, [sp,16]
+	ldr	x1, [x28, 24]
+	ldr	x0, [x28, 8]
+	ldr	w2, [x1, 12]
+	str	w2, [sp, 16]
+	ldr	w2, [x1, 8]
+	str	w2, [sp, 8]
+	ldr	w2, [x1, 4]
+	str	w2, [sp]
+	ldp	w3, w4, [x0]
+	ldp	w5, w6, [x0, 8]
 	adrp	x0, .LC245
+	ldr	w7, [x1]
 	add	x0, x0, :lo12:.LC245
-	ldr	w3, [x6]
-	ldr	w4, [x6,4]
-	ldr	w5, [x6,8]
-	ldr	w1, [x28,40]
-	ldr	w2, [x28,52]
-	ldr	w6, [x6,12]
-	ldr	w7, [x7]
+	ldr	w1, [x28, 40]
+	ldr	w2, [x28, 52]
 	bl	printk
-	b	.L3337
+.L3338:
+	add	x0, x19, :lo12:.LANCHOR0
+	ldrh	w2, [x20, 80]
+	mov	w21, 0
+	ldr	x1, [x0, 1120]
+	strh	wzr, [x1, x2, lsl 1]
+	ldr	x0, [x0, 1128]
+	ldrh	w1, [x20, 80]
+	strh	w1, [x0, 130]
+.L3250:
+	add	x1, x19, :lo12:.LANCHOR0
+	ldrh	w0, [x20, 80]
+	ldr	x1, [x1, 1120]
+	ubfiz	x2, x0, 1, 16
+	ldrh	w1, [x1, x2]
+	cbnz	w1, .L3294
+	bl	ftl_dump_write_open_sblk
+.L3294:
+	ldrh	w1, [x20, 80]
+	mov	w2, w21
+	adrp	x0, .LC247
+	add	x0, x0, :lo12:.LC247
+	bl	printk
+	mov	w0, -1
+	strh	w0, [x20, 80]
+	bl	pm_flush
+	bl	ftl_ext_info_flush
+	add	x1, x19, :lo12:.LANCHOR0
+	mov	w2, 65535
+	ldr	x0, [x1, 1128]
+	ldrh	w0, [x0, 130]
+	cmp	w0, w2
+	beq	.L3295
+	ldrh	w1, [x1, 1096]
+	cmp	w1, w0
+	bhi	.L3296
+	adrp	x1, .LANCHOR4
+	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 840
+	mov	w2, 517
+	adrp	x0, .LC0
+	add	x0, x0, :lo12:.LC0
+	bl	printk
+	bl	dump_stack
+.L3296:
+	add	x0, x19, :lo12:.LANCHOR0
+	ldr	x0, [x0, 1128]
+	ldrh	w0, [x0, 130]
+	bl	ftl_free_sblk
+.L3295:
+	add	x19, x19, :lo12:.LANCHOR0
+	mov	w0, -1
+	ldr	x1, [x19, 3384]
+	strh	w0, [x1, 126]
+	ldr	x1, [x19, 1128]
+	strh	w0, [x1, 130]
+	mov	w0, 0
+	bl	ftl_info_flush
+.L3243:
+	ldp	x19, x20, [sp, 48]
+	ldp	x21, x22, [sp, 64]
+	ldp	x23, x24, [sp, 80]
+	ldp	x25, x26, [sp, 96]
+	ldp	x27, x28, [sp, 112]
+	ldp	x29, x30, [sp, 32]
+	add	sp, sp, 224
+	ret
+.L3246:
+	cmp	w2, 3
+	bne	.L3247
+	ldrh	w0, [x25, 1376]
+	sub	w0, w0, #1
+	add	w0, w0, w1
+	orr	w0, w0, 50331648
+	str	w0, [x28, 40]
+	b	.L3247
 .L3249:
 	add	x1, x23, :lo12:.LANCHOR5
-	ldrb	w0, [x1,1001]
+	ldrb	w0, [x1, 465]
 	cmp	w0, 2
 	bne	.L3251
 	add	x21, x22, :lo12:.LANCHOR3
-	ldrb	w0, [x21,1328]
+	ldrb	w0, [x21, 1320]
 	cmp	w0, 3
 	bne	.L3251
-	ldrh	w3, [x1,998]
-	ldr	x4, [x1,232]
-	ldrh	w1, [x21,1346]
-	and	x0, x3, 65532
-	ldrb	w2, [x21,1329]
-	add	x0, x4, x0
-	lsl	w1, w1, 2
-	mul	w2, w1, w2
-	ldr	x1, [x28,8]
-	sub	w2, w2, w3
-	uxth	w2, w2
+	ldrh	w2, [x21, 1338]
+	ldrb	w3, [x21, 1321]
+	ldrh	w0, [x1, 462]
+	ubfiz	w2, w2, 2, 14
+	mul	w2, w2, w3
+	ldr	x3, [x1, 280]
+	ldr	x1, [x28, 8]
+	sub	w2, w2, w0
+	and	x0, x0, 65532
+	and	w2, w2, 65535
+	add	x0, x3, x0
 	bl	ftl_memcpy
 	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w1, [x0,1268]
+	ldrb	w1, [x0, 1212]
 	cbnz	w1, .L3252
-	ldrb	w0, [x0,1269]
+	ldrb	w0, [x0, 1213]
 	cbz	w0, .L3253
 .L3252:
-	ldr	w0, [x28,40]
+	ldr	w0, [x28, 40]
 	sub	w0, w0, #1
-	b	.L3333
-.L3253:
-	ldr	w0, [x29,184]
-	ldrh	w1, [x21,1384]
-	sub	w0, w0, #1
-	add	w0, w0, w1
-	orr	w0, w0, 33554432
-.L3333:
-	str	w0, [x28,40]
+.L3332:
+	str	w0, [x28, 40]
 	mov	w1, 1
 	mov	x0, x28
 	bl	sblk_read_page
-	ldr	w0, [x28,52]
+	ldr	w0, [x28, 52]
 	cmp	w0, 512
+	ccmn	w0, #1, 4, ne
 	beq	.L3255
-	cmn	w0, #1
-	beq	.L3255
-	ldr	x0, [x28,24]
+	ldr	x0, [x28, 24]
 	ldr	w1, [x0]
 	mov	w0, 15555
 	movk	w0, 0xf55f, lsl 16
@@ -20990,485 +20895,425 @@ gc_recovery:
 .L3255:
 	mov	x0, x28
 	bl	zbuf_free
-.L3337:
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrh	w2, [x20,80]
-	mov	w21, 0
-	ldr	x1, [x0,1112]
-	strh	wzr, [x1,x2,lsl 1]
-	ldr	x0, [x0,1120]
-	ldrh	w1, [x20,80]
-	strh	w1, [x0,130]
-	b	.L3250
+	b	.L3338
+.L3253:
+	ldr	w0, [x29, 184]
+	ldrh	w1, [x21, 1376]
+	sub	w0, w0, #1
+	add	w0, w0, w1
+	orr	w0, w0, 33554432
+	b	.L3332
 .L3256:
-	add	x2, x23, :lo12:.LANCHOR5
-	ldr	x1, [x28,8]
-	ldr	x0, [x2,232]
-	ldrh	w2, [x2,998]
-	b	.L3334
-.L3251:
-	add	x2, x22, :lo12:.LANCHOR3
-	add	x1, x23, :lo12:.LANCHOR5
-	ldrh	w0, [x2,1346]
-	ldrb	w2, [x2,1329]
-	mul	w2, w0, w2
-	ldr	x0, [x1,232]
-	ldr	x1, [x28,8]
-	lsl	w2, w2, 2
-.L3334:
+	add	x0, x23, :lo12:.LANCHOR5
+	ldrh	w2, [x0, 462]
+.L3333:
+	ldr	x1, [x28, 8]
 	add	x21, x22, :lo12:.LANCHOR3
+	ldr	x0, [x0, 280]
 	bl	ftl_memcpy
-	ldrh	w0, [x21,1346]
-	ldrb	w1, [x21,1329]
-	mul	w1, w0, w1
-	add	x0, x19, :lo12:.LANCHOR0
-	lsl	w2, w1, 2
-	ldrb	w0, [x0,3360]
-	cmp	w0, w1, lsr 6
+	ldrb	w1, [x21, 1321]
+	ldrh	w0, [x21, 1338]
+	mul	w0, w0, w1
+	ldrb	w1, [x21, 1946]
+	lsl	w2, w0, 2
+	cmp	w1, w0, lsr 6
 	bge	.L3258
 	add	x25, x23, :lo12:.LANCHOR5
 	mov	w1, 0
-	ldr	x0, [x25,240]
+	ldr	x0, [x25, 288]
 	bl	ftl_memset
-	ldrb	w26, [x25,1001]
+	ldrb	w26, [x25, 465]
 	cmp	w26, 1
-	bne	.L3298
-	ldrh	w0, [x21,1346]
-	ldrb	w1, [x21,1329]
-	ldrh	w21, [x25,998]
-	ldr	x2, [x28,8]
-	mul	w1, w0, w1
-	ldr	x0, [x25,240]
-	sub	w21, w21, w1, lsl 2
-	add	x1, x2, w1, sxtw 2
+	bne	.L3299
+	ldrb	w1, [x21, 1321]
+	ldrh	w0, [x21, 1338]
+	ldrh	w21, [x25, 462]
+	mul	w0, w0, w1
+	ldr	x1, [x28, 8]
+	sub	w21, w21, w0, lsl 2
+	add	x1, x1, w0, sxtw 2
+	ldr	x0, [x25, 288]
 	mov	w2, w21
 	bl	ftl_memcpy
 	mov	w10, w26
-	b	.L3259
-.L3258:
-	add	x0, x23, :lo12:.LANCHOR5
-	ldr	x3, [x28,8]
-	add	x1, x3, w1, sxtw 2
-	ldr	x0, [x0,240]
-	bl	ftl_memcpy
-	mov	w10, 0
-	mov	w21, w10
-	b	.L3259
-.L3298:
-	mov	w10, 1
-	mov	w21, 0
 .L3259:
 	add	x0, x22, :lo12:.LANCHOR3
-	ldrb	w25, [x0,1328]
-	ldrh	w27, [x0,1384]
+	ldrh	w1, [x0, 1376]
+	ldrb	w25, [x0, 1320]
+	str	w1, [x29, 168]
 	cmp	w25, 2
 	bne	.L3260
-	ldrb	w0, [x0,1330]
+	ldrb	w0, [x0, 1322]
 	cbz	w0, .L3261
 .L3260:
 	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1268]
+	ldrb	w0, [x0, 1212]
 	cbz	w0, .L3262
 .L3261:
-	mul	w27, w27, w25
+	ldr	w0, [x29, 168]
+	mul	w0, w0, w25
 	mov	w25, 1
+	str	w0, [x29, 168]
 .L3262:
-	adrp	x0, .LC246
-	mov	w26, 0
-	add	x0, x0, :lo12:.LC246
-	str	w26, [x29,172]
-	str	x0, [x29,144]
+	add	x14, x22, :lo12:.LANCHOR3
+	adrp	x26, .LC246
+	mov	w9, 0
+	add	x0, x26, :lo12:.LC246
+	mov	w13, 0
+	str	x0, [x29, 152]
 .L3263:
-	cmp	w26, w27
-	bcs	.L3275
-	add	w0, w26, w26, lsl 1
-	mov	w11, 0
+	sub	w0, w9, #1
+	str	w0, [x29, 164]
+	ldr	w0, [x29, 168]
+	cmp	w0, w9
+	bls	.L3276
+	add	w0, w9, w9, lsl 1
+	mov	w26, 0
 	sub	w0, w0, #1
-	str	w0, [x29,168]
-	sub	w0, w26, #1
-	str	w0, [x29,152]
-.L3276:
-	ldrb	w0, [x24,9]
-	cmp	w11, w0
-	bge	.L3338
-	sxtw	x0, w11
-	mov	x12, 0
-	str	x0, [x29,160]
-.L3273:
-	add	w2, w12, 1
-	ldr	w0, [x29,172]
-	cmp	w2, w25
-	add	w13, w0, w12
-	bhi	.L3339
-	ldr	x0, [x29,160]
-	add	x3, x22, :lo12:.LANCHOR3
-	add	x0, x0, 8
-	ldrh	w1, [x24,x0,lsl 1]
-	ldrh	w0, [x3,1418]
-	mul	w0, w1, w0
-	ldrb	w1, [x3,1328]
-	str	w0, [x29,184]
-	cmp	w1, 2
+	str	w0, [x29, 172]
+	b	.L3277
+.L3251:
+	add	x0, x22, :lo12:.LANCHOR3
+	ldrh	w2, [x0, 1338]
+	ldrb	w0, [x0, 1321]
+	mul	w2, w2, w0
+	add	x0, x23, :lo12:.LANCHOR5
+	lsl	w2, w2, 2
+	b	.L3333
+.L3258:
+	add	x3, x23, :lo12:.LANCHOR5
+	ldr	x1, [x28, 8]
+	add	x1, x1, w0, sxtw 2
+	ldr	x0, [x3, 288]
+	bl	ftl_memcpy
+	mov	w10, 0
+.L3334:
+	mov	w21, 0
+	b	.L3259
+.L3299:
+	mov	w10, 1
+	b	.L3334
+.L3272:
+	ldrh	w1, [x14, 1410]
+	ldrh	w0, [x24, x27, lsl 1]
+	ldrb	w2, [x14, 1320]
+	cmp	w2, 2
+	mul	w0, w0, w1
+	str	w0, [x29, 184]
+	add	w1, w11, w0
 	beq	.L3264
 	add	x3, x19, :lo12:.LANCHOR0
-	ldrb	w4, [x3,1268]
+	ldrb	w4, [x3, 1212]
 	cbz	w4, .L3265
 .L3264:
-	ldr	w3, [x29,152]
-	add	w0, w3, w0
-	add	w0, w0, w2
-	orr	w0, w0, w1, lsl 24
-	b	.L3335
-.L3265:
-	cmp	w1, 3
-	bne	.L3267
-	ldrb	w1, [x3,1269]
-	cbz	w1, .L3268
-	ldr	w1, [x29,168]
-	add	w0, w0, w1
-	add	w0, w0, w2
-	orr	w0, w0, 50331648
-	b	.L3335
-.L3268:
-	add	w0, w0, w26
-	orr	w0, w0, w2, lsl 24
-	b	.L3335
-.L3267:
-	add	w0, w0, w26
+	ldr	w0, [x29, 164]
+	add	w1, w1, w0
+	orr	w1, w1, w2, lsl 24
 .L3335:
-	str	w0, [x28,40]
+	str	w1, [x28, 40]
+.L3266:
+	str	x14, [x29, 120]
 	mov	w1, 1
+	str	w10, [x29, 128]
 	mov	x0, x28
-	str	x13, [x29,112]
-	str	x12, [x29,120]
-	str	x10, [x29,128]
-	str	x11, [x29,136]
+	str	w9, [x29, 136]
+	str	w13, [x29, 144]
+	str	w11, [x29, 160]
 	bl	sblk_read_page
-	ldr	x13, [x29,112]
-	ldr	x10, [x29,128]
-	ldr	x11, [x29,136]
-	sxtw	x13, w13
-	ldr	x12, [x29,120]
+	ldr	w10, [x29, 128]
+	ldr	w13, [x29, 144]
+	ldr	w9, [x29, 136]
+	ldr	w11, [x29, 160]
+	sxtw	x15, w13
+	ldr	x14, [x29, 120]
 	cbz	w10, .L3269
 	add	x0, x23, :lo12:.LANCHOR5
-	lsl	x1, x13, 2
-	ldr	x0, [x0,240]
-	ldr	w2, [x0,x1]
+	lsl	x1, x15, 2
+	ldr	x0, [x0, 288]
+	ldr	w2, [x0, x1]
 	cbnz	w2, .L3269
-	ldr	x2, [x28,24]
-	ldr	w2, [x2,8]
-	str	w2, [x0,x1]
+	ldr	x2, [x28, 24]
+	ldr	w2, [x2, 8]
+	str	w2, [x0, x1]
 .L3269:
-	add	x0, x23, :lo12:.LANCHOR5
-	lsl	x13, x13, 2
-	ldr	x7, [x28,24]
-	ldr	x1, [x0,232]
-	ldr	w6, [x7,4]
-	ldr	w3, [x1,x13]
+	add	x1, x23, :lo12:.LANCHOR5
+	lsl	x15, x15, 2
+	ldr	x0, [x1, 280]
+	ldr	w3, [x0, x15]
+	ldr	x0, [x28, 24]
+	ldr	w6, [x0, 4]
 	cmp	w3, w6
 	bne	.L3270
-	ldr	x0, [x0,240]
-	ldr	w1, [x0,x13]
-	ldr	w0, [x7,8]
-	cmp	w1, w0
-	beq	.L3300
+	ldr	x1, [x1, 288]
+	ldr	w2, [x1, x15]
+	ldr	w1, [x0, 8]
+	cmp	w2, w1
+	beq	.L3271
 .L3270:
-	add	x14, x23, :lo12:.LANCHOR5
-	ldr	w0, [x7,12]
-	str	x12, [x29,104]
-	str	x10, [x29,112]
-	ldr	x4, [x14,240]
-	str	w0, [sp]
-	ldr	x0, [x29,144]
-	ldr	w4, [x4,x13]
-	ldr	w5, [x7]
-	ldr	w1, [x28,40]
-	ldr	w2, [x28,52]
-	ldr	w7, [x7,8]
-	str	x11, [x29,120]
-	str	x14, [x29,128]
-	str	x13, [x29,136]
-	bl	printk
-	ldr	x14, [x29,128]
-	ldr	x13, [x29,136]
-	ldr	x11, [x29,120]
-	ldr	x0, [x14,232]
-	ldr	x10, [x29,112]
-	ldr	x12, [x29,104]
-	ldr	w0, [x0,x13]
+	add	x18, x23, :lo12:.LANCHOR5
+	ldr	w2, [x0, 12]
+	str	x14, [x29, 104]
+	stp	w10, w11, [x29, 116]
+	ldr	x1, [x18, 288]
+	str	w2, [sp]
+	str	w9, [x29, 128]
+	ldr	w5, [x0]
+	ldr	w4, [x1, x15]
+	ldr	w7, [x0, 8]
+	ldr	w1, [x28, 40]
+	ldr	w2, [x28, 52]
+	ldr	x0, [x29, 152]
+	stp	x18, x15, [x29, 136]
+	str	w13, [x29, 160]
+	bl	printk
+	ldp	x18, x15, [x29, 136]
+	ldp	w10, w11, [x29, 116]
+	ldr	x0, [x18, 280]
+	ldr	w9, [x29, 128]
+	ldr	w13, [x29, 160]
+	ldr	x14, [x29, 104]
+	ldr	w0, [x0, x15]
 	cmn	w0, #1
-	beq	.L3300
+	beq	.L3271
 	mov	x0, x28
 	bl	zbuf_free
 	add	x0, x19, :lo12:.LANCHOR0
-	ldrh	w2, [x20,80]
-	ldr	x1, [x0,1112]
-	strh	wzr, [x1,x2,lsl 1]
-	ldr	x0, [x0,1120]
-	ldrh	w1, [x20,80]
-	strh	w1, [x0,130]
+	ldrh	w2, [x20, 80]
+	ldr	x1, [x0, 1120]
+	strh	wzr, [x1, x2, lsl 1]
+	ldr	x0, [x0, 1128]
+	ldrh	w1, [x20, 80]
+	strh	w1, [x0, 130]
 	b	.L3250
-.L3300:
-	add	x12, x12, 1
-	b	.L3273
-.L3339:
-	str	w13, [x29,172]
+.L3265:
+	cmp	w2, 3
+	bne	.L3267
+	ldrb	w2, [x3, 1213]
+	cbz	w2, .L3268
+	ldr	w0, [x29, 172]
+	add	w1, w1, w0
+	orr	w1, w1, 50331648
+	b	.L3335
+.L3268:
+	add	w0, w9, w0
+	orr	w0, w0, w11, lsl 24
+.L3336:
+	str	w0, [x28, 40]
+	b	.L3266
+.L3267:
+	add	w0, w9, w0
+	b	.L3336
+.L3271:
+	add	w13, w13, 1
 	add	w11, w11, 1
-	b	.L3276
-.L3338:
-	add	x0, x22, :lo12:.LANCHOR3
-	ldrb	w0, [x0,1330]
-	cmp	w0, wzr
-	csinc	w26, w26, w26, eq
+.L3274:
+	cmp	w25, w11
+	bcs	.L3272
 	add	w26, w26, 1
+.L3277:
+	ldrb	w0, [x24, 9]
+	cmp	w26, w0
+	bge	.L3273
+	sxtw	x27, w26
+	mov	w11, 1
+	add	x27, x27, 8
+	b	.L3274
+.L3273:
+	ldrb	w0, [x14, 1322]
+	cmp	w0, 0
+	cinc	w9, w9, ne
+	add	w9, w9, 1
 	b	.L3263
-.L3275:
+.L3276:
 	mov	x0, x28
-	mov	w21, 0
-	mov	w28, w21
 	bl	zbuf_free
-	str	w21, [x29,168]
 	add	x0, x19, :lo12:.LANCHOR0
 	add	x3, x22, :lo12:.LANCHOR3
-	ldrh	w2, [x20,80]
-	ldr	x1, [x0,1112]
-	ldrh	w3, [x3,1346]
-	ldrb	w0, [x24,9]
+	ldrh	w2, [x20, 80]
+	mov	w21, 0
+	mov	w27, 0
+	str	wzr, [x29, 164]
+	ldrh	w3, [x3, 1338]
+	ldr	x1, [x0, 1120]
+	ldrb	w0, [x24, 9]
 	mul	w0, w0, w3
-	strh	w0, [x1,x2,lsl 1]
-.L3277:
-	cmp	w28, w27
-	bcs	.L3291
-	add	w0, w28, w28, lsl 1
-	str	wzr, [x29,172]
+	strh	w0, [x1, x2, lsl 1]
+.L3278:
+	sub	w0, w27, #1
+	str	w0, [x29, 136]
+	ldr	w0, [x29, 168]
+	cmp	w0, w27
+	bls	.L3292
+	add	w0, w27, w27, lsl 1
+	add	x28, x23, :lo12:.LANCHOR5
 	sub	w0, w0, #1
-	str	w0, [x29,144]
-	sub	w0, w28, #1
-	str	w0, [x29,128]
-.L3292:
-	ldrb	w0, [x24,9]
-	ldr	w1, [x29,172]
-	cmp	w1, w0
-	bge	.L3288
-	ldrsw	x0, [x29,172]
-	mov	w26, 1
-	str	x0, [x29,136]
-.L3289:
-	cmp	w26, w25
-	bhi	.L3340
-	add	x1, x23, :lo12:.LANCHOR5
-	ldr	w0, [x29,168]
+	str	wzr, [x29, 172]
+	str	w0, [x29, 160]
+	b	.L3293
+.L3288:
+	ldr	w0, [x29, 164]
+	ldr	x1, [x28, 280]
 	sbfiz	x0, x0, 2, 32
-	ldr	x2, [x1,232]
-	ldr	w5, [x2,x0]
+	ldr	w5, [x1, x0]
 	cmn	w5, #1
-	beq	.L3278
-	ldr	x1, [x1,240]
-	str	x5, [x29,152]
-	ldr	w0, [x1,x0]
-	str	w0, [x29,160]
+	beq	.L3279
+	ldr	x1, [x28, 288]
+	str	w5, [x29, 144]
+	ldr	w0, [x1, x0]
+	str	w0, [x29, 152]
 	mov	w0, w5
 	bl	lpa_hash_get_ppa
-	str	w0, [x29,188]
+	str	w0, [x29, 188]
 	cmn	w0, #1
-	ldr	x5, [x29,152]
-	bne	.L3279
+	ldr	w5, [x29, 144]
+	bne	.L3280
 	mov	w0, w5
-	add	x1, x29, 188
+	str	w5, [x29, 144]
 	mov	w2, 0
+	add	x1, x29, 188
 	bl	pm_log2phys
-	ldr	x5, [x29,152]
-.L3279:
-	ldr	x0, [x29,136]
-	add	x0, x0, 8
-	ldrh	w1, [x24,x0,lsl 1]
-	add	x0, x22, :lo12:.LANCHOR3
-	ldrh	w2, [x0,1418]
-	ldrb	w0, [x0,1328]
-	cmp	w0, 2
-	mul	w1, w1, w2
-	beq	.L3280
-	add	x2, x19, :lo12:.LANCHOR0
-	ldrb	w6, [x2,1268]
-	cbz	w6, .L3281
+	ldr	w5, [x29, 144]
 .L3280:
-	ldr	w2, [x29,128]
-	add	w1, w2, w1
-	add	w1, w1, w26
-	orr	w1, w1, w0, lsl 24
-	b	.L3336
+	ldr	x0, [x29, 128]
+	add	x2, x22, :lo12:.LANCHOR3
+	ldrh	w1, [x2, 1410]
+	ldrh	w0, [x24, x0, lsl 1]
+	ldrb	w2, [x2, 1320]
+	cmp	w2, 2
+	mul	w0, w0, w1
+	add	w1, w26, w0
+	beq	.L3281
+	add	x6, x19, :lo12:.LANCHOR0
+	ldrb	w7, [x6, 1212]
+	cbz	w7, .L3282
 .L3281:
-	cmp	w0, 3
-	bne	.L3283
-	ldrb	w2, [x2,1269]
-	lsl	w0, w26, 24
-	cbz	w2, .L3284
-	ldr	w2, [x29,144]
-	add	w2, w1, w2
-	add	w2, w2, w26
-	orr	w1, w0, w2
-	b	.L3336
-.L3284:
-	add	w1, w1, w28
-	orr	w1, w0, w1
-	b	.L3336
+	ldr	w0, [x29, 136]
+	add	w1, w0, w1
+	orr	w1, w1, w2, lsl 24
+	str	w1, [x29, 184]
 .L3283:
-	add	w1, w1, w28
-.L3336:
-	add	x2, x22, :lo12:.LANCHOR3
-	ldr	w0, [x29,160]
-	str	w1, [x29,184]
-	mov	w3, 24
-	ldrh	w1, [x2,1312]
-	lsr	w6, w0, w1
 	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1257]
-	sub	w0, w3, w0
-	sub	w1, w0, w1
-	mov	w0, 1
-	lsl	w1, w0, w1
-	ldrb	w0, [x2,1314]
-	sub	w1, w1, #1
-	and	w1, w6, w1
-	udiv	w1, w1, w0
-	uxth	w0, w1
-	ldr	w1, [x29,160]
-	str	w0, [x29,152]
-	ldr	w0, [x29,188]
-	cmp	w0, w1
-	bne	.L3285
-	mov	w0, w5
-	add	x1, x29, 184
+	add	x6, x22, :lo12:.LANCHOR3
+	ldr	w3, [x29, 152]
+	ldrb	w2, [x0, 1205]
+	mov	w0, 24
+	ldrh	w1, [x6, 1304]
+	sub	w0, w0, w2
 	mov	w2, 1
-	add	w21, w21, 1
+	sub	w0, w0, w1
+	lsr	w1, w3, w1
+	lsl	w0, w2, w0
+	sub	w0, w0, #1
+	and	w0, w0, w1
+	ldrb	w1, [x6, 1306]
+	udiv	w0, w0, w1
+	and	w0, w0, 65535
+	str	w0, [x29, 144]
+	ldr	w0, [x29, 188]
+	cmp	w3, w0
+	bne	.L3286
+	add	x1, x29, 184
+	mov	w0, w5
 	bl	pm_log2phys
-	ldrh	w0, [x29,152]
+	add	w21, w21, 1
+	ldrh	w0, [x29, 144]
 	bl	ftl_vpn_decrement
-	b	.L3286
-.L3285:
-	ldr	w1, [x29,184]
-	cmp	w0, w1
-	csinc	w21, w21, w21, ne
-.L3286:
-	ldr	w0, [x29,168]
+.L3287:
+	ldr	w0, [x29, 164]
 	add	x2, x19, :lo12:.LANCHOR0
 	add	w0, w0, 1
-	str	w0, [x29,168]
-	ldr	w0, [x29,152]
-	ldr	x1, [x2,1096]
+	str	w0, [x29, 164]
+	ldr	x1, [x2, 1104]
+	ldr	w0, [x29, 144]
 	add	x1, x1, x0, lsl 2
-	ldrb	w1, [x1,2]
-	ands	w1, w1, 224
-	bne	.L3278
+	ldrb	w1, [x1, 2]
+	tst	w1, 224
+	bne	.L3279
+	ldr	x1, [x2, 1120]
 	lsl	x0, x0, 1
-	ldr	x2, [x2,1112]
-	ldrh	w5, [x2,x0]
-	cbz	w5, .L3278
-	strh	w1, [x2,x0]
-.L3278:
+	ldrh	w2, [x1, x0]
+	cbz	w2, .L3279
+	strh	wzr, [x1, x0]
+.L3279:
 	add	w26, w26, 1
-	b	.L3289
-.L3340:
-	ldr	w0, [x29,172]
+.L3290:
+	cmp	w25, w26
+	bcs	.L3288
+	ldr	w0, [x29, 172]
 	add	w0, w0, 1
-	str	w0, [x29,172]
-	b	.L3292
-.L3288:
-	add	x0, x22, :lo12:.LANCHOR3
-	ldrb	w0, [x0,1330]
-	cmp	w0, wzr
-	csinc	w28, w28, w28, eq
-	add	w28, w28, 1
-	b	.L3277
-.L3291:
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrh	w1, [x20,80]
-	ldr	x0, [x0,1112]
-	strh	w21, [x0,x1,lsl 1]
-	ldrh	w0, [x20,80]
-	bl	zftl_insert_data_list
-.L3250:
-	add	x1, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x20,80]
-	ubfiz	x2, x0, 1, 16
-	ldr	x1, [x1,1112]
-	ldrh	w1, [x1,x2]
-	cbnz	w1, .L3293
-	bl	ftl_dump_write_open_sblk
+	str	w0, [x29, 172]
 .L3293:
-	ldrh	w1, [x20,80]
-	adrp	x0, .LC247
-	mov	w2, w21
-	add	x0, x0, :lo12:.LC247
-	bl	printk
-	mov	w0, -1
-	strh	w0, [x20,80]
-	bl	pm_flush
-	bl	ftl_ext_info_flush
-	add	x1, x19, :lo12:.LANCHOR0
-	mov	w2, 65535
-	ldr	x0, [x1,1120]
-	ldrh	w0, [x0,130]
-	cmp	w0, w2
-	beq	.L3294
-	ldrh	w1, [x1,1088]
+	ldrb	w0, [x24, 9]
+	ldr	w1, [x29, 172]
 	cmp	w1, w0
-	bhi	.L3295
-	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
-	add	x1, x1, :lo12:.LANCHOR4
-	mov	w2, 517
-	add	x1, x1, 824
-	add	x0, x0, :lo12:.LC0
-	bl	printk
-	bl	dump_stack
-.L3295:
+	bge	.L3289
+	ldrsw	x0, [x29, 172]
+	mov	w26, 1
+	add	x0, x0, 8
+	str	x0, [x29, 128]
+	b	.L3290
+.L3282:
+	cmp	w2, 3
+	bne	.L3284
+	ldrb	w6, [x6, 1213]
+	lsl	w2, w26, 24
+	cbz	w6, .L3285
+	ldr	w0, [x29, 160]
+	add	w1, w0, w1
+	orr	w0, w1, w2
+.L3337:
+	str	w0, [x29, 184]
+	b	.L3283
+.L3285:
+	add	w0, w27, w0
+	orr	w0, w0, w2
+	b	.L3337
+.L3284:
+	add	w0, w27, w0
+	b	.L3337
+.L3286:
+	ldr	w1, [x29, 184]
+	cmp	w0, w1
+	cinc	w21, w21, eq
+	b	.L3287
+.L3289:
+	add	x0, x22, :lo12:.LANCHOR3
+	ldrb	w0, [x0, 1322]
+	cmp	w0, 0
+	cinc	w27, w27, ne
+	add	w27, w27, 1
+	b	.L3278
+.L3292:
 	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x0, [x0,1120]
-	ldrh	w0, [x0,130]
-	bl	ftl_free_sblk
-.L3294:
-	add	x19, x19, :lo12:.LANCHOR0
-	mov	w0, -1
-	ldr	x1, [x19,3392]
-	strh	w0, [x1,126]
-	ldr	x1, [x19,1120]
-	strh	w0, [x1,130]
-	mov	w0, 0
-	bl	ftl_info_flush
-	b	.L3243
+	ldrh	w1, [x20, 80]
+	ldr	x0, [x0, 1120]
+	strh	w21, [x0, x1, lsl 1]
+	ldrh	w0, [x20, 80]
+	bl	zftl_insert_data_list
+	b	.L3250
 .L3244:
-	ldrh	w0, [x20,130]
+	ldrh	w0, [x20, 130]
 	cmp	w0, w1
 	beq	.L3243
-	ldr	x1, [x21,3392]
-	ldrh	w1, [x1,126]
+	ldr	x1, [x21, 3384]
+	ldrh	w1, [x1, 126]
 	cmp	w1, w0
-	bne	.L3297
+	bne	.L3298
 	bl	pm_flush
-	ldr	x0, [x21,1120]
-	ldrh	w0, [x0,130]
+	ldr	x0, [x21, 1128]
+	ldrh	w0, [x0, 130]
 	bl	ftl_free_sblk
-	ldr	x0, [x21,3392]
+	ldr	x0, [x21, 3384]
 	mov	w1, -1
-	strh	w1, [x0,126]
+	strh	w1, [x0, 126]
 	mov	w0, 0
 	bl	ftl_info_flush
-.L3297:
+.L3298:
 	add	x19, x19, :lo12:.LANCHOR0
 	mov	w1, -1
-	ldr	x0, [x19,1120]
-	strh	w1, [x0,130]
-.L3243:
-	sub	sp, x29, #32
-	ldp	x19, x20, [sp,48]
-	ldp	x21, x22, [sp,64]
-	ldp	x23, x24, [sp,80]
-	ldp	x25, x26, [sp,96]
-	ldp	x27, x28, [sp,112]
-	ldp	x29, x30, [sp,32]
-	add	sp, sp, 224
-	ret
+	ldr	x0, [x19, 1128]
+	strh	w1, [x0, 130]
+	b	.L3243
 	.size	gc_recovery, .-gc_recovery
 	.align	2
 	.global	gc_update_l2p_map_new
@@ -21476,348 +21321,346 @@ gc_recovery:
 gc_update_l2p_map_new:
 	stp	x29, x30, [sp, -160]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR0
 	add	x0, x19, :lo12:.LANCHOR0
-	stp	x23, x24, [sp,48]
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	adrp	x23, .LANCHOR2
-	ldr	x20, [x0,1120]
-	adrp	x0, .LANCHOR3
-	add	x1, x0, :lo12:.LANCHOR3
-	str	x0, [x29,120]
-	ldrh	w25, [x1,1346]
-	add	x1, x20, 80
-	str	x1, [x29,128]
-	ldrb	w1, [x1,9]
-	mul	w25, w25, w1
-	ldr	w1, [x23,#:lo12:.LANCHOR2]
-	tbz	x1, 8, .L3342
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	adrp	x22, .LANCHOR3
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldr	x20, [x0, 1128]
+	add	x0, x22, :lo12:.LANCHOR3
+	ldrh	w24, [x0, 1338]
+	add	x0, x20, 80
+	str	x0, [x29, 112]
+	ldrb	w0, [x0, 9]
+	mul	w24, w24, w0
+	adrp	x0, .LANCHOR2
+	str	x0, [x29, 136]
+	ldr	w1, [x0, #:lo12:.LANCHOR2]
+	tbz	x1, 8, .L3340
+	ldrh	w1, [x20, 80]
 	adrp	x0, .LC248
-	ldrh	w1, [x20,80]
 	add	x0, x0, :lo12:.LC248
 	bl	printk
-.L3342:
+.L3340:
 	add	x0, x19, :lo12:.LANCHOR0
-	adrp	x21, .LANCHOR5
-	ldrh	w2, [x20,80]
-	mov	w22, 0
-	mov	w24, w22
-	ldr	x1, [x0,1112]
-	add	x0, x21, :lo12:.LANCHOR5
-	ldrb	w0, [x0,1001]
-	sub	w0, w25, w0
-	strh	w0, [x1,x2,lsl 1]
+	adrp	x1, .LANCHOR5
+	ldrh	w3, [x20, 80]
+	mov	w23, 0
+	mov	w21, 0
+	str	x1, [x29, 120]
+	ldr	x2, [x0, 1120]
+	add	x0, x1, :lo12:.LANCHOR5
+	ldrb	w0, [x0, 465]
+	sub	w0, w24, w0
+	strh	w0, [x2, x3, lsl 1]
 	adrp	x0, .LC250
 	add	x0, x0, :lo12:.LC250
-	str	x0, [x29,112]
-	adrp	x0, .LC249
-	add	x0, x0, :lo12:.LC249
-	str	x0, [x29,104]
-.L3343:
-	cmp	w24, w25
-	beq	.L3375
-	add	x0, x21, :lo12:.LANCHOR5
-	ldr	x0, [x0,232]
-	ldr	w2, [x0,w24,sxtw 2]
-	cmn	w2, #1
-	beq	.L3344
+	str	x0, [x29, 104]
+.L3341:
+	cmp	w21, w24
+	bne	.L3350
+	ldr	x0, [x29, 136]
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 8, .L3351
+	add	x0, x19, :lo12:.LANCHOR0
+	ldrh	w2, [x20, 80]
+	mov	w3, w23
+	ldr	x1, [x0, 1120]
+	ldr	x0, [x0, 1128]
+	ldrh	w2, [x1, x2, lsl 1]
+	ldrh	w1, [x0, 80]
+	adrp	x0, .LC251
+	add	x0, x0, :lo12:.LC251
+	bl	printk
+.L3351:
 	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x0,3360]
+	ldrh	w1, [x20, 80]
+	ldr	x0, [x0, 1120]
+	ldrh	w0, [x0, x1, lsl 1]
+	cmp	w23, w0
+	beq	.L3352
+	adrp	x1, .LANCHOR4
+	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 856
+	mov	w2, 898
+	adrp	x0, .LC0
+	add	x0, x0, :lo12:.LC0
+	bl	printk
+	bl	dump_stack
+.L3352:
+	add	x19, x19, :lo12:.LANCHOR0
+	ldrh	w1, [x20, 80]
+	ldr	x0, [x19, 1120]
+	strh	w23, [x0, x1, lsl 1]
+	ldrh	w0, [x20, 80]
+	bl	zftl_insert_data_list
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 160
+	ret
+.L3350:
+	ldr	x0, [x29, 120]
+	add	x0, x0, :lo12:.LANCHOR5
+	ldr	x0, [x0, 280]
+	ldr	w2, [x0, w21, sxtw 2]
+	cmn	w2, #1
+	beq	.L3342
+	add	x0, x22, :lo12:.LANCHOR3
+	ldrb	w0, [x0, 1946]
 	lsl	w0, w0, 7
 	udiv	w0, w2, w0
 	and	w0, w0, 65535
-	str	w0, [x29,140]
-	ldr	w0, [x23,#:lo12:.LANCHOR2]
-	tbz	x0, 8, .L3345
-	ldr	x0, [x29,104]
-	mov	w3, w24
-	ldr	w1, [x29,140]
+	str	w0, [x29, 132]
+	ldr	x0, [x29, 136]
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 8, .L3343
+	ldr	w1, [x29, 132]
+	adrp	x0, .LC249
+	mov	w3, w21
+	add	x0, x0, :lo12:.LC249
 	bl	printk
-.L3345:
-	mov	w26, w24
-.L3351:
-	add	x1, x21, :lo12:.LANCHOR5
-	sbfiz	x27, x26, 2, 32
-	ldr	x0, [x1,232]
-	ldr	w4, [x0,x27]
+.L3343:
+	ldr	x0, [x29, 120]
+	mov	w25, w21
+	add	x26, x0, :lo12:.LANCHOR5
+.L3349:
+	ldr	x0, [x26, 280]
+	sbfiz	x27, x25, 2, 32
+	ldr	w4, [x0, x27]
 	cmn	w4, #1
-	beq	.L3346
-	add	x0, x19, :lo12:.LANCHOR0
-	ldr	w2, [x29,140]
-	ldrb	w0, [x0,3360]
+	beq	.L3344
+	add	x0, x22, :lo12:.LANCHOR3
+	ldr	w1, [x29, 132]
+	ldrb	w0, [x0, 1946]
 	lsl	w0, w0, 7
 	udiv	w0, w4, w0
-	cmp	w2, w0, uxth
-	bne	.L3346
-	ldr	x0, [x1,240]
-	str	x4, [x29,96]
-	ldr	w28, [x0,x27]
+	cmp	w1, w0, uxth
+	bne	.L3344
+	ldr	x0, [x26, 288]
+	str	w4, [x29, 128]
+	ldr	w28, [x0, x27]
 	mov	w0, w4
 	bl	lpa_hash_get_ppa
-	str	w0, [x29,156]
+	str	w0, [x29, 156]
 	cmn	w0, #1
-	ldr	x4, [x29,96]
-	bne	.L3347
+	ldr	w4, [x29, 128]
+	bne	.L3345
 	mov	w0, w4
-	add	x1, x29, 156
+	str	w4, [x29, 128]
 	mov	w2, 0
+	add	x1, x29, 156
 	bl	pm_log2phys
-	ldr	x4, [x29,96]
-.L3347:
-	ldr	w3, [x29,156]
-	cmp	w3, w28
-	bne	.L3348
-	add	x0, x21, :lo12:.LANCHOR5
-	add	x1, x29, 152
+	ldr	w4, [x29, 128]
+.L3345:
+	ldr	w3, [x29, 156]
+	cmp	w28, w3
+	bne	.L3346
+	ldr	x0, [x26, 296]
 	mov	w2, 1
-	add	w22, w22, 1
-	ldr	x0, [x0,248]
-	ldr	w0, [x0,x27]
-	str	w0, [x29,152]
+	add	x1, x29, 152
+	add	w23, w23, 1
+	ldr	w0, [x0, x27]
+	str	w0, [x29, 152]
 	mov	w0, w4
 	bl	pm_log2phys
-	ldr	x0, [x29,120]
-	mov	w2, 24
-	add	x3, x0, :lo12:.LANCHOR3
 	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1257]
-	ldrh	w1, [x3,1312]
-	sub	w0, w2, w0
-	mov	w2, 1
+	add	x3, x22, :lo12:.LANCHOR3
+	ldrb	w1, [x0, 1205]
+	mov	w0, 24
+	ldrh	w2, [x3, 1304]
 	sub	w0, w0, w1
-	lsr	w28, w28, w1
-	lsl	w0, w2, w0
+	sub	w1, w0, w2
+	mov	w0, 1
+	lsr	w28, w28, w2
+	lsl	w0, w0, w1
 	sub	w0, w0, #1
 	and	w28, w0, w28
-	ldrb	w0, [x3,1314]
+	ldrb	w0, [x3, 1306]
 	udiv	w0, w28, w0
-	b	.L3374
-.L3348:
-	ldr	w0, [x23,#:lo12:.LANCHOR2]
-	tbz	x0, 8, .L3350
-	ldr	x0, [x29,112]
-	mov	w1, w4
-	mov	w2, w28
-	bl	printk
-.L3350:
-	ldr	x0, [x29,128]
-	ldrh	w0, [x0]
-.L3374:
+.L3373:
 	bl	ftl_vpn_decrement
-	add	x0, x21, :lo12:.LANCHOR5
+	ldr	x0, [x26, 280]
 	mov	w1, -1
-	ldr	x0, [x0,232]
-	str	w1, [x0,x27]
-.L3346:
-	add	w26, w26, 1
-	cmp	w26, w25
-	bne	.L3351
+	str	w1, [x0, x27]
 .L3344:
-	add	w24, w24, 1
-	b	.L3343
-.L3375:
-	ldr	w0, [x23,#:lo12:.LANCHOR2]
-	tbz	x0, 8, .L3353
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrh	w3, [x20,80]
-	ldr	x1, [x0,1120]
-	ldr	x2, [x0,1112]
-	adrp	x0, .LC251
-	add	x0, x0, :lo12:.LC251
-	ldrh	w1, [x1,80]
-	ldrh	w2, [x2,x3,lsl 1]
-	mov	w3, w22
-	bl	printk
-.L3353:
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrh	w1, [x20,80]
-	ldr	x0, [x0,1112]
-	ldrh	w0, [x0,x1,lsl 1]
-	cmp	w0, w22
-	beq	.L3354
-	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
-	add	x1, x1, :lo12:.LANCHOR4
-	mov	w2, 898
-	add	x1, x1, 840
-	add	x0, x0, :lo12:.LC0
+	add	w25, w25, 1
+	cmp	w24, w25
+	bne	.L3349
+.L3342:
+	add	w21, w21, 1
+	b	.L3341
+.L3346:
+	ldr	x0, [x29, 136]
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 8, .L3348
+	ldr	x0, [x29, 104]
+	mov	w2, w28
+	mov	w1, w4
 	bl	printk
-	bl	dump_stack
-.L3354:
-	add	x19, x19, :lo12:.LANCHOR0
-	ldrh	w1, [x20,80]
-	ldr	x0, [x19,1112]
-	strh	w22, [x0,x1,lsl 1]
-	ldrh	w0, [x20,80]
-	bl	zftl_insert_data_list
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 160
-	ret
+.L3348:
+	ldr	x0, [x29, 112]
+	ldrh	w0, [x0]
+	b	.L3373
 	.size	gc_update_l2p_map_new, .-gc_update_l2p_map_new
 	.align	2
 	.global	gc_scan_src_blk_one_page
 	.type	gc_scan_src_blk_one_page, %function
 gc_scan_src_blk_one_page:
-	stp	x29, x30, [sp, -80]!
+	stp	x29, x30, [sp, -96]!
 	mov	w3, 0
+	mov	w4, 0
 	mov	w5, 65535
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x19, .LANCHOR0
-	mov	w4, w3
-	add	x1, x19, :lo12:.LANCHOR0
-	add	x1, x1, 3424
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
+	stp	x19, x20, [sp, 16]
+	adrp	x20, .LANCHOR0
+	add	x1, x20, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	add	x1, x1, 3416
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
 	adrp	x21, .LANCHOR3
-	ldrb	w0, [x1,4]
+	ldrb	w0, [x1, 4]
 	add	x2, x1, w0, sxtw 1
-	ldrh	w22, [x2,40]
+	ldrh	w22, [x2, 40]
 	add	x2, x21, :lo12:.LANCHOR3
-	ldrb	w6, [x2,1329]
-	ldrh	w2, [x1,2]
-.L3377:
+	ldrb	w6, [x2, 1321]
+	ldrh	w2, [x1, 2]
+.L3375:
 	cmp	w22, w5
-	bne	.L3406
+	beq	.L3377
+	cbz	w4, .L3378
+	add	x1, x20, :lo12:.LANCHOR0
+	strh	w2, [x1, 3418]
+.L3378:
+	cbz	w3, .L3379
+	add	x1, x20, :lo12:.LANCHOR0
+	strb	w0, [x1, 3420]
+.L3379:
+	add	x20, x20, :lo12:.LANCHOR0
+	mov	w0, 1
+	add	x19, x20, 3416
+	bl	buf_alloc
+	add	x25, x21, :lo12:.LANCHOR3
+	mov	x23, x0
+	mov	w24, 1
+.L3380:
+	ldrb	w1, [x19, 6]
+	cmp	w24, w1
+	ble	.L3390
+	mov	x0, x23
+	bl	zbuf_free
+	ldrb	w0, [x19, 4]
+	add	x21, x21, :lo12:.LANCHOR3
+	add	w0, w0, 1
+	and	w0, w0, 255
+	ldrb	w1, [x21, 1321]
+	strb	w0, [x19, 4]
+	cmp	w1, w0
+	bne	.L3374
+	ldrh	w0, [x19, 2]
+	strb	wzr, [x19, 4]
+	add	w0, w0, 1
+	strh	w0, [x19, 2]
+.L3374:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 96
+	ret
+.L3377:
 	add	w0, w0, 1
-	uxtb	w0, w0
+	and	w0, w0, 255
 	cmp	w0, w6
-	bne	.L3378
+	bne	.L3376
 	add	w2, w2, 1
 	mov	w0, 0
+	and	w2, w2, 65535
 	mov	w4, 1
-	uxth	w2, w2
-.L3378:
+.L3376:
 	add	x3, x1, w0, sxtw 1
-	ldrh	w22, [x3,40]
+	ldrh	w22, [x3, 40]
 	mov	w3, 1
-	b	.L3377
-.L3406:
-	cbz	w4, .L3380
-	add	x1, x19, :lo12:.LANCHOR0
-	strh	w2, [x1,3426]
-.L3380:
-	cbz	w3, .L3381
-	add	x1, x19, :lo12:.LANCHOR0
-	strb	w0, [x1,3428]
-.L3381:
-	mov	w0, 1
-	mov	w24, 1
-	add	x19, x19, :lo12:.LANCHOR0
-	bl	buf_alloc
-	mov	x23, x0
-.L3382:
-	add	x20, x19, 3424
-	ldrb	w0, [x20,6]
-	cmp	w24, w0
-	bgt	.L3407
-	add	x3, x21, :lo12:.LANCHOR3
-	cmp	w0, 2
-	ldrh	w1, [x3,1418]
-	mul	w1, w22, w1
-	bne	.L3383
-	ldrh	w2, [x20,2]
-	ldrb	w0, [x3,1328]
-	add	w1, w1, w2, lsl 1
+	b	.L3375
+.L3390:
+	ldrh	w0, [x25, 1410]
+	cmp	w1, 2
+	mul	w0, w0, w22
+	bne	.L3381
+	ldrh	w1, [x19, 2]
+	lsl	w1, w1, 1
+.L3400:
 	sub	w1, w1, #1
-	add	w1, w1, w24
-	b	.L3405
-.L3383:
-	cmp	w0, 3
-	bne	.L3385
-	ldrb	w0, [x19,1268]
-	cbnz	w0, .L3386
-	ldrb	w0, [x19,1269]
-	cbz	w0, .L3387
-.L3386:
-	ldrh	w2, [x19,3426]
-	add	x0, x21, :lo12:.LANCHOR3
-	add	w2, w2, w2, lsl 1
-	ldrb	w0, [x0,1328]
-	sub	w2, w2, #1
-	add	w1, w2, w1
-	add	w1, w1, w24
-.L3405:
-	orr	w1, w1, w0, lsl 24
-	b	.L3404
-.L3387:
-	ldrh	w0, [x20,2]
-	add	w1, w1, w0
-	orr	w1, w1, w24, lsl 24
-	b	.L3404
-.L3385:
-	ldrh	w0, [x20,2]
-	add	w1, w1, w0
-.L3404:
-	str	w1, [x23,40]
-	mov	x0, x23
+	add	w0, w24, w0
+	add	w0, w1, w0
+	ldrb	w1, [x25, 1320]
+	orr	w0, w0, w1, lsl 24
+.L3399:
+	str	w0, [x23, 40]
 	mov	w1, 1
+	mov	x0, x23
 	bl	sblk_read_page
-	ldr	w0, [x23,52]
+	ldr	w0, [x23, 52]
 	cmp	w0, 512
-	beq	.L3390
-	cmn	w0, #1
-	beq	.L3390
-	ldr	x0, [x23,24]
-	ldr	w20, [x0,4]
-	mov	w0, w20
+	ccmn	w0, #1, 4, ne
+	beq	.L3387
+	ldr	x0, [x23, 24]
+	ldr	w26, [x0, 4]
+	mov	w0, w26
 	bl	lpa_hash_get_ppa
-	str	w0, [x29,76]
+	str	w0, [x29, 92]
 	cmn	w0, #1
-	bne	.L3391
-	ldr	w0, [x19,3372]
-	cmp	w20, w0
-	bcs	.L3391
-	mov	w0, w20
-	add	x1, x29, 76
+	bne	.L3388
+	ldr	w0, [x20, 3364]
+	cmp	w26, w0
+	bcs	.L3388
 	mov	w2, 0
+	add	x1, x29, 92
+	mov	w0, w26
 	bl	pm_log2phys
-.L3391:
-	ldr	w2, [x23,40]
-	ldr	w0, [x29,76]
-	cmp	w2, w0
-	bne	.L3390
-	add	x1, x21, :lo12:.LANCHOR3
-	ldrh	w3, [x19,3448]
-	ldr	x1, [x1,1320]
-	str	w2, [x1,x3,lsl 2]
-	ldrh	w1, [x19,3448]
-	add	w1, w1, 1
-	strh	w1, [x19,3448]
-.L3390:
-	ldrh	w0, [x19,3450]
-	add	w24, w24, 1
-	add	w0, w0, 1
-	strh	w0, [x19,3450]
-	b	.L3382
-.L3407:
-	mov	x0, x23
-	add	x21, x21, :lo12:.LANCHOR3
-	bl	zbuf_free
-	ldrb	w0, [x20,4]
-	ldrb	w1, [x21,1329]
+.L3388:
+	ldr	w0, [x23, 40]
+	ldr	w1, [x29, 92]
+	cmp	w0, w1
+	bne	.L3387
+	ldrh	w2, [x19, 24]
+	ldr	x1, [x25, 1312]
+	str	w0, [x1, x2, lsl 2]
+	ldrh	w0, [x19, 24]
 	add	w0, w0, 1
-	uxtb	w0, w0
-	strb	w0, [x20,4]
-	cmp	w1, w0
-	bne	.L3376
-	ldrh	w0, [x20,2]
-	strb	wzr, [x20,4]
+	strh	w0, [x19, 24]
+.L3387:
+	ldrh	w0, [x19, 26]
+	add	w24, w24, 1
 	add	w0, w0, 1
-	strh	w0, [x20,2]
-.L3376:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 80
-	ret
+	strh	w0, [x19, 26]
+	b	.L3380
+.L3381:
+	cmp	w1, 3
+	bne	.L3383
+	ldrb	w1, [x20, 1212]
+	cbnz	w1, .L3384
+	ldrb	w1, [x20, 1213]
+	cbz	w1, .L3385
+.L3384:
+	ldrh	w1, [x19, 2]
+	add	w1, w1, w1, lsl 1
+	b	.L3400
+.L3385:
+	ldrh	w1, [x19, 2]
+	add	w0, w1, w0
+	orr	w0, w0, w24, lsl 24
+	b	.L3399
+.L3383:
+	ldrh	w1, [x19, 2]
+	add	w0, w1, w0
+	b	.L3399
 	.size	gc_scan_src_blk_one_page, .-gc_scan_src_blk_one_page
 	.align	2
 	.global	gc_scan_src_blk
@@ -21825,522 +21668,507 @@ gc_scan_src_blk_one_page:
 gc_scan_src_blk:
 	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR0
-	str	x27, [sp,80]
 	add	x0, x20, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	ldrh	w1, [x0,3424]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	str	x27, [sp, 80]
+	ldrh	w1, [x0, 3416]
 	mov	w0, 65535
 	cmp	w1, w0
-	bne	.L3409
+	bne	.L3402
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 880
 	mov	w2, 1505
-	add	x1, x1, 864
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L3409:
-	add	x2, x20, :lo12:.LANCHOR0
-	mov	w3, 65535
-	mov	w0, 0
-	ldrh	w1, [x2,3424]
-	cmp	w1, w3
-	beq	.L3410
-	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 8, .L3411
-	ubfiz	x3, x1, 1, 16
-	ldr	x2, [x2,1112]
+.L3402:
+	add	x0, x20, :lo12:.LANCHOR0
+	mov	w2, 65535
+	ldrh	w1, [x0, 3416]
+	cmp	w1, w2
+	beq	.L3432
+	adrp	x2, .LANCHOR2
+	ldr	w2, [x2, #:lo12:.LANCHOR2]
+	tbz	x2, 8, .L3404
+	ldr	x0, [x0, 1120]
+	ubfiz	x2, x1, 1, 16
+	ldrh	w2, [x0, x2]
 	adrp	x0, .LC252
 	add	x0, x0, :lo12:.LC252
-	ldrh	w2, [x2,x3]
 	bl	printk
-.L3411:
-	add	x19, x20, :lo12:.LANCHOR0
+.L3404:
 	bl	timer_get_time
-	add	x21, x19, 3424
-	add	x1, x19, 3464
-	ldrh	w0, [x19,3424]
+	add	x14, x20, :lo12:.LANCHOR0
+	add	x15, x14, 3416
+	add	x1, x14, 3456
+	ldrh	w0, [x14, 3416]
 	bl	ftl_get_blk_list_in_sblk
-	uxtb	w1, w0
-	strb	w1, [x21,5]
-	cbnz	w1, .L3412
+	and	w1, w0, 255
+	strb	w1, [x15, 5]
+	cbnz	w1, .L3405
 	mov	w0, -1
-	strh	w0, [x19,3424]
-	b	.L3464
-.L3412:
-	ldrh	w3, [x19,3424]
-	ldr	x2, [x19,1096]
-	add	x2, x2, x3, lsl 2
-	ldrb	w2, [x2,2]
-	tst	w2, 192
-	and	w4, w2, 224
-	beq	.L3413
-	cmp	w4, 224
-	beq	.L3413
-	ldr	x2, [x19,1120]
-	ldrh	w5, [x2,16]
-	cmp	w5, w3
-	beq	.L3413
-	ldrh	w5, [x2,48]
-	cmp	w5, w3
-	beq	.L3413
-	ldrh	w2, [x2,80]
-	cmp	w2, w3
-	bne	.L3414
-.L3413:
-	cbnz	w4, .L3415
-	add	x0, x20, :lo12:.LANCHOR0
-	ldr	x0, [x0,1112]
-	ldrh	w0, [x0,x3,lsl 1]
-	cbz	w0, .L3416
+	strh	w0, [x14, 3416]
+.L3432:
+	mov	w0, 0
+	b	.L3401
+.L3405:
+	ldrh	w3, [x14, 3416]
+	ldr	x1, [x14, 1104]
+	mov	x2, x3
+	add	x1, x1, x3, lsl 2
+	ldrb	w1, [x1, 2]
+	and	w1, w1, 224
+	cmp	w1, 32
+	beq	.L3406
+	cmp	w1, 224
+	beq	.L3406
+	cbz	w1, .L3407
+	ldr	x1, [x14, 1128]
+	ldrh	w3, [x1, 16]
+	cmp	w3, w2
+	beq	.L3406
+	ldrh	w3, [x1, 48]
+	cmp	w3, w2
+	beq	.L3406
+	ldrh	w1, [x1, 80]
+	cmp	w1, w2
+	bne	.L3452
+.L3406:
+	add	x20, x20, :lo12:.LANCHOR0
+	mov	w0, -1
+	strh	wzr, [x20, 3440]
+	strh	w0, [x20, 3416]
+	b	.L3432
+.L3407:
+	ldr	x0, [x14, 1120]
+	ldrh	w0, [x0, x3, lsl 1]
+	cbz	w0, .L3409
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 880
 	mov	w2, 1530
-	add	x1, x1, 864
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L3416:
+.L3409:
 	add	x0, x20, :lo12:.LANCHOR0
-	ldrh	w1, [x0,3424]
-	ldr	x0, [x0,1112]
-	strh	wzr, [x0,x1,lsl 1]
-.L3415:
-	add	x20, x20, :lo12:.LANCHOR0
-	mov	w0, -1
-	strh	wzr, [x20,3448]
-	strh	w0, [x20,3424]
-.L3464:
-	mov	w0, 0
-	b	.L3410
-.L3414:
+	ldrh	w1, [x0, 3416]
+	ldr	x0, [x0, 1120]
+	strh	wzr, [x0, x1, lsl 1]
+	b	.L3406
+.L3452:
 	and	w0, w0, 255
 	sub	w0, w0, #1
-	add	x0, x21, w0, sxtw 1
-	ldrh	w21, [x0,40]
+	add	x0, x15, w0, sxtw 1
+	ldrh	w22, [x0, 40]
 	mov	w0, 65535
-	cmp	w21, w0
-	bne	.L3417
+	cmp	w22, w0
+	bne	.L3410
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 880
 	mov	w2, 1540
-	add	x1, x1, 864
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L3417:
+.L3410:
 	add	x3, x20, :lo12:.LANCHOR0
-	adrp	x22, .LANCHOR3
-	add	x1, x22, :lo12:.LANCHOR3
-	mov	w26, 1
-	ldrh	w2, [x3,3424]
-	ldr	x3, [x3,1096]
-	ldrh	w0, [x1,1384]
+	adrp	x23, .LANCHOR3
+	add	x1, x23, :lo12:.LANCHOR3
+	ldrh	w2, [x3, 3416]
+	ldr	x3, [x3, 1104]
+	ldrh	w21, [x1, 1410]
+	ldrh	w0, [x1, 1376]
 	add	x2, x3, x2, lsl 2
-	ldrh	w23, [x1,1418]
 	sub	w0, w0, #1
-	ldrb	w2, [x2,2]
-	uxth	w0, w0
-	mul	w23, w21, w23
+	and	w0, w0, 65535
+	mul	w21, w21, w22
+	ldrb	w2, [x2, 2]
 	and	w2, w2, 224
 	cmp	w2, 160
-	bne	.L3418
-	ldrb	w2, [x1,1328]
+	bne	.L3433
+	ldrb	w2, [x1, 1320]
+	and	w27, w2, 65535
 	cmp	w2, 2
-	uxth	w26, w2
-	orr	w23, w23, w2, lsl 24
-	bne	.L3419
-	ldrh	w0, [x1,1346]
+	orr	w21, w21, w2, lsl 24
+	bne	.L3412
+	ldrh	w0, [x1, 1338]
 	sub	w0, w0, #1
-	uxth	w0, w0
-.L3419:
+	and	w0, w0, 65535
+.L3412:
 	add	x1, x20, :lo12:.LANCHOR0
-	ldrb	w2, [x1,1268]
-	cbnz	w2, .L3420
-	ldrb	w1, [x1,1269]
-	cbz	w1, .L3418
-.L3420:
-	add	x0, x22, :lo12:.LANCHOR3
-	ldrh	w0, [x0,1346]
+	ldrb	w2, [x1, 1212]
+	cbnz	w2, .L3413
+	ldrb	w1, [x1, 1213]
+	cbz	w1, .L3411
+.L3413:
+	add	x0, x23, :lo12:.LANCHOR3
+	ldrh	w0, [x0, 1338]
 	sub	w0, w0, #1
-	uxth	w0, w0
-.L3418:
+	and	w0, w0, 65535
+.L3411:
 	add	x24, x20, :lo12:.LANCHOR0
-	orr	w23, w0, w23
+	orr	w21, w0, w21
 	mov	w0, 1
-	strb	w26, [x24,3430]
-	strh	wzr, [x24,3426]
-	strb	wzr, [x24,3428]
-	strh	wzr, [x24,3450]
-	strh	wzr, [x24,3452]
+	strb	w27, [x24, 3422]
+	strh	wzr, [x24, 3418]
+	strb	wzr, [x24, 3420]
+	strh	wzr, [x24, 3442]
+	strh	wzr, [x24, 3444]
 	bl	buf_alloc
-	mov	w1, 1
 	mov	x19, x0
-	str	w23, [x0,40]
+	str	w21, [x0, 40]
+	mov	w1, 1
 	bl	sblk_read_page
-	strh	wzr, [x24,3448]
-	ldr	w0, [x19,52]
+	strh	wzr, [x24, 3440]
+	ldr	w0, [x19, 52]
 	cmp	w0, 512
-	beq	.L3467
-	cmn	w0, #1
-	beq	.L3467
-	ldr	x0, [x19,24]
+	ccmn	w0, #1, 4, ne
+	bne	.L3414
+.L3457:
+	mov	x0, x19
+	bl	zbuf_free
+.L3455:
+	mov	w0, -1
+.L3401:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldr	x27, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L3433:
+	mov	w27, 1
+	b	.L3411
+.L3414:
+	ldr	x0, [x19, 24]
 	mov	w1, 15555
 	movk	w1, 0xf55f, lsl 16
 	ldr	w2, [x0]
 	cmp	w2, w1
-	beq	.L3423
+	beq	.L3415
+	mov	w2, 1578
+.L3458:
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 880
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
-	add	x1, x1, 864
-	mov	w2, 1578
-	b	.L3468
-.L3423:
-	add	x2, x22, :lo12:.LANCHOR3
-	cmp	w26, 3
-	ldrb	w1, [x2,1329]
-	ldrh	w25, [x2,1384]
-	mul	w25, w1, w25
-	mul	w25, w26, w25
-	uxth	w25, w25
-	bne	.L3424
+	bl	printk
+	bl	dump_stack
+	b	.L3457
+.L3415:
+	add	x1, x23, :lo12:.LANCHOR3
 	adrp	x26, .LANCHOR5
-	add	x3, x26, :lo12:.LANCHOR5
-	ldrb	w4, [x3,1001]
-	cmp	w4, 2
-	bne	.L3424
-	ldrh	w24, [x2,1346]
-	ldrh	w0, [x3,998]
-	lsl	w24, w24, 2
-	mul	w24, w1, w24
-	ldr	x1, [x2,1320]
+	add	x2, x26, :lo12:.LANCHOR5
+	ldrb	w24, [x1, 1321]
+	ldrh	w25, [x1, 1376]
+	ldrb	w3, [x2, 465]
+	cmp	w3, 2
+	mul	w25, w24, w25
+	mul	w25, w27, w25
+	and	w25, w25, 65535
+	bne	.L3416
+	cmp	w27, 3
+	bne	.L3416
+	ldrh	w0, [x2, 462]
+	ldrh	w2, [x1, 1338]
+	ldr	x3, [x1, 1312]
+	ldr	x1, [x19, 8]
+	ubfiz	w2, w2, 2, 14
+	mul	w24, w24, w2
 	sub	w24, w24, w0
 	and	x0, x0, 65532
-	add	x0, x1, x0
-	ldr	x1, [x19,8]
-	uxth	w24, w24
+	and	w24, w24, 65535
+	add	x0, x3, x0
 	mov	w2, w24
 	bl	ftl_memcpy
-	ldr	x0, [x19,24]
-	ldr	w27, [x0,4]
-	cbz	w27, .L3425
-	ldr	x0, [x19,8]
+	ldr	x0, [x19, 24]
+	ldr	w27, [x0, 4]
+	cbz	w27, .L3417
+	ldr	x0, [x19, 8]
 	mov	w1, w24
 	bl	js_hash
 	cmp	w27, w0
-	beq	.L3425
+	beq	.L3417
 	mov	x0, x19
 	bl	zbuf_free
-	ldr	x1, [x19,24]
+	ldr	x0, [x19, 24]
+	mov	w3, w24
+.L3456:
+	ldr	w1, [x0, 4]
 	adrp	x0, .LC253
+	ldr	w2, [x19, 40]
 	add	x0, x0, :lo12:.LC253
-	ldr	w2, [x19,40]
-	mov	w3, w24
-	ldr	w1, [x1,4]
-	b	.L3466
-.L3425:
+	bl	printk
+	b	.L3455
+.L3417:
 	add	x0, x20, :lo12:.LANCHOR0
-	ldrb	w1, [x0,1268]
-	cbnz	w1, .L3426
-	ldrb	w0, [x0,1269]
-	cbz	w0, .L3427
-.L3426:
-	sub	w0, w23, #1
-	str	w0, [x19,40]
-	b	.L3428
-.L3427:
-	add	x1, x22, :lo12:.LANCHOR3
-	ldrh	w0, [x1,1384]
-	ldrh	w1, [x1,1418]
-	sub	w0, w0, #1
-	mul	w21, w21, w1
-	uxth	w0, w0
-	orr	w0, w0, 33554432
-	orr	w21, w0, w21
-	str	w21, [x19,40]
-.L3428:
-	mov	x0, x19
+	ldrb	w1, [x0, 1212]
+	cbnz	w1, .L3418
+	ldrb	w0, [x0, 1213]
+	cbz	w0, .L3419
+.L3418:
+	sub	w0, w21, #1
+	str	w0, [x19, 40]
+.L3420:
 	mov	w1, 1
+	mov	x0, x19
 	bl	sblk_read_page
-	ldr	w0, [x19,52]
+	ldr	w0, [x19, 52]
 	cmp	w0, 512
-	beq	.L3467
-	cmn	w0, #1
-	beq	.L3467
-	ldr	x0, [x19,24]
+	ccmn	w0, #1, 4, ne
+	beq	.L3457
+	ldr	x0, [x19, 24]
 	ldr	w1, [x0]
 	mov	w0, 15555
 	movk	w0, 0xf55f, lsl 16
 	cmp	w1, w0
-	beq	.L3431
-	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
-	add	x1, x1, :lo12:.LANCHOR4
-	add	x0, x0, :lo12:.LC0
-	add	x1, x1, 864
+	beq	.L3422
 	mov	w2, 1619
-.L3468:
-	bl	printk
-	bl	dump_stack
-.L3467:
+	b	.L3458
+.L3419:
+	add	x1, x23, :lo12:.LANCHOR3
+	ldrh	w0, [x1, 1376]
+	ldrh	w1, [x1, 1410]
+	sub	w0, w0, #1
+	and	w0, w0, 65535
+	orr	w0, w0, 33554432
+	mul	w22, w1, w22
+	orr	w22, w0, w22
+	str	w22, [x19, 40]
+	b	.L3420
+.L3422:
+	add	x26, x26, :lo12:.LANCHOR5
+	add	x0, x23, :lo12:.LANCHOR3
+	ldrh	w2, [x26, 462]
+.L3454:
+	ldr	x0, [x0, 1312]
+	add	x23, x23, :lo12:.LANCHOR3
+	ldr	x1, [x19, 8]
+	add	x24, x20, :lo12:.LANCHOR0
+	add	x21, x24, 3416
+	mov	x27, 0
+	mov	w26, 24
+	bl	ftl_memcpy
+	ldr	x22, [x23, 1312]
+.L3425:
+	cmp	w25, w27
+	bgt	.L3430
 	mov	x0, x19
 	bl	zbuf_free
-	b	.L3465
+	add	x0, x20, :lo12:.LANCHOR0
+	ldrh	w1, [x0, 3416]
+	ldr	x3, [x0, 1120]
+	ubfiz	x2, x1, 1, 16
+	ldrh	w2, [x3, x2]
+	ldrh	w3, [x0, 3440]
+	cmp	w2, w3
+	beq	.L3431
+	adrp	x0, .LC254
+	add	x0, x0, :lo12:.LC254
+	bl	printk
 .L3431:
-	add	x0, x22, :lo12:.LANCHOR3
-	add	x26, x26, :lo12:.LANCHOR5
-	ldr	x1, [x19,8]
-	ldr	x0, [x0,1320]
-	ldrh	w2, [x26,998]
-	b	.L3463
-.L3424:
-	ldr	w23, [x0,4]
+	add	x20, x20, :lo12:.LANCHOR0
+	ldrh	w2, [x20, 3416]
+	ldr	x1, [x20, 1120]
+	ldrh	w3, [x20, 3440]
+	strh	w3, [x1, x2, lsl 1]
+	strh	wzr, [x20, 3444]
+	ldrh	w0, [x20, 3440]
+	b	.L3401
+.L3416:
+	ldr	w22, [x0, 4]
 	lsl	w21, w25, 2
-	ldr	x0, [x19,8]
+	ldr	x0, [x19, 8]
 	mov	w1, w21
 	bl	js_hash
-	cmp	w23, w0
-	beq	.L3433
+	cmp	w22, w0
+	beq	.L3424
 	mov	x0, x19
 	bl	zbuf_free
-	ldr	x1, [x19,24]
-	adrp	x0, .LC253
-	ldr	w2, [x19,40]
-	add	x0, x0, :lo12:.LC253
 	mov	w3, w21
-	ldr	w1, [x1,4]
-.L3466:
-	bl	printk
-.L3465:
-	mov	w0, -1
-	b	.L3410
-.L3433:
-	add	x0, x22, :lo12:.LANCHOR3
-	ldr	x1, [x19,8]
+	ldr	x0, [x19, 24]
+	b	.L3456
+.L3424:
+	add	x0, x23, :lo12:.LANCHOR3
 	mov	w2, w21
-	ldr	x0, [x0,1320]
-.L3463:
-	bl	ftl_memcpy
-	mov	x27, 0
-	add	x0, x22, :lo12:.LANCHOR3
-	add	x21, x20, :lo12:.LANCHOR0
-	mov	w24, 24
-	mov	w26, 1
-	ldr	x23, [x0,1320]
-.L3434:
-	cmp	w25, w27
-	ble	.L3469
-	ldr	w0, [x23,x27,lsl 2]
+	b	.L3454
+.L3430:
+	ldr	w0, [x22, x27, lsl 2]
 	cmn	w0, #1
-	beq	.L3436
+	beq	.L3427
 	bl	lpa_hash_get_ppa
-	str	w0, [x29,108]
+	str	w0, [x29, 108]
 	cmn	w0, #1
-	bne	.L3437
-	ldr	w0, [x23,x27,lsl 2]
-	add	x1, x29, 108
+	bne	.L3428
+	ldr	w0, [x22, x27, lsl 2]
 	mov	w2, 0
+	add	x1, x29, 108
 	bl	pm_log2phys
-.L3437:
-	add	x2, x22, :lo12:.LANCHOR3
-	ldrb	w0, [x21,1257]
-	ldr	w3, [x29,108]
-	sub	w0, w24, w0
-	ldrh	w4, [x21,3424]
-	ldrh	w1, [x2,1312]
-	sub	w0, w0, w1
-	lsr	w1, w3, w1
-	lsl	w0, w26, w0
+.L3428:
+	ldrb	w1, [x24, 1205]
+	ldrh	w2, [x23, 1304]
+	sub	w0, w26, w1
+	ldr	w3, [x29, 108]
+	sub	w1, w0, w2
+	mov	w0, 1
+	lsl	w0, w0, w1
+	ldrb	w1, [x23, 1306]
 	sub	w0, w0, #1
-	and	w0, w0, w1
-	ldrb	w1, [x2,1314]
+	lsr	w2, w3, w2
+	and	w0, w0, w2
 	udiv	w0, w0, w1
-	cmp	w0, w4
-	bne	.L3436
-	ldrh	w4, [x21,3448]
-	ldr	x0, [x2,1320]
-	str	w3, [x0,x4,lsl 2]
-	ldrh	w0, [x21,3448]
+	ldrh	w1, [x21]
+	cmp	w0, w1
+	bne	.L3427
+	ldrh	w1, [x21, 24]
+	ldr	x0, [x23, 1312]
+	str	w3, [x0, x1, lsl 2]
+	ldrh	w0, [x21, 24]
 	add	w0, w0, 1
-	strh	w0, [x21,3448]
-.L3436:
+	strh	w0, [x21, 24]
+.L3427:
 	bl	timer_get_time
 	add	x27, x27, 1
-	b	.L3434
-.L3469:
-	mov	x0, x19
-	bl	zbuf_free
-	add	x0, x20, :lo12:.LANCHOR0
-	ldrh	w1, [x0,3424]
-	ldr	x3, [x0,1112]
-	ubfiz	x2, x1, 1, 16
-	ldrh	w2, [x3,x2]
-	ldrh	w3, [x0,3448]
-	cmp	w2, w3
-	beq	.L3440
-	adrp	x0, .LC254
-	add	x0, x0, :lo12:.LC254
-	bl	printk
-.L3440:
-	add	x20, x20, :lo12:.LANCHOR0
-	ldrh	w2, [x20,3424]
-	ldr	x1, [x20,1112]
-	ldrh	w3, [x20,3448]
-	strh	w3, [x1,x2,lsl 1]
-	strh	wzr, [x20,3452]
-	ldrh	w0, [x20,3448]
-.L3410:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldr	x27, [sp,80]
-	ldp	x29, x30, [sp], 112
-	ret
+	b	.L3425
 	.size	gc_scan_src_blk, .-gc_scan_src_blk
 	.align	2
 	.global	gc_scan_static_data
 	.type	gc_scan_static_data, %function
 gc_scan_static_data:
-	stp	x29, x30, [sp, -80]!
+	stp	x29, x30, [sp, -64]!
+	adrp	x1, .LANCHOR0
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	adrp	x19, .LANCHOR0
-	add	x3, x19, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	ldr	x0, [x3,1120]
-	ldr	w1, [x0,544]
-	cmn	w1, #1
-	beq	.L3471
+	stp	x19, x20, [sp, 16]
+	add	x19, x1, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	ldr	x0, [x19, 1128]
+	ldr	w2, [x0, 544]
+	cmn	w2, #1
+	beq	.L3460
 	adrp	x20, .LANCHOR4
-	adrp	x22, .LC0
 	add	x20, x20, :lo12:.LANCHOR4
+	add	x20, x20, 896
 	mov	w21, 0
-	add	x22, x22, :lo12:.LC0
-	add	x20, x20, 880
-.L3472:
-	add	x24, x19, :lo12:.LANCHOR0
-	add	x1, x29, 76
+.L3468:
+	ldr	x0, [x19, 1128]
 	mov	w2, 0
-	ldr	x0, [x24,1120]
-	ldr	w0, [x0,544]
+	add	x1, x29, 60
+	ldr	w0, [x0, 544]
 	bl	pm_log2phys
-	ldr	w0, [x29,76]
+	ldr	w0, [x29, 60]
 	cmn	w0, #1
-	beq	.L3473
+	beq	.L3461
 	mov	w0, 1
 	bl	buf_alloc
-	mov	x23, x0
-	ldr	w1, [x29,76]
-	str	w1, [x0,40]
+	ldr	w1, [x29, 60]
+	mov	x22, x0
+	str	w1, [x0, 40]
 	mov	w1, 1
 	bl	sblk_read_page
-	ldr	w0, [x23,52]
+	ldr	w0, [x22, 52]
 	cmp	w0, 256
-	bne	.L3474
-	adrp	x4, .LANCHOR3
-	ldrb	w2, [x24,1257]
-	add	x4, x4, :lo12:.LANCHOR3
-	mov	w3, 24
-	sub	w2, w3, w2
+	bne	.L3462
+	adrp	x2, .LANCHOR3
+	add	x2, x2, :lo12:.LANCHOR3
+	ldrb	w1, [x19, 1205]
+	mov	w0, 24
+	ldr	w3, [x29, 60]
+	ldrh	w4, [x2, 1304]
+	sub	w0, w0, w1
 	mov	w1, 1
-	ldr	w3, [x29,76]
-	ldrh	w0, [x4,1312]
-	sub	w2, w2, w0
-	lsr	w3, w3, w0
-	lsl	w2, w1, w2
-	ldrb	w0, [x4,1314]
-	sub	w2, w2, #1
-	and	w2, w2, w3
-	udiv	w0, w2, w0
-	mov	w2, 0
-	bl	gc_add_sblk
-.L3474:
-	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x1, [x23,24]
-	ldr	x0, [x0,1120]
-	ldr	w1, [x1,4]
-	ldr	w0, [x0,544]
+	sub	w0, w0, w4
+	lsr	w3, w3, w4
+	lsl	w0, w1, w0
+	sub	w0, w0, #1
+	and	w0, w0, w3
+	ldrb	w3, [x2, 1306]
+	mov	w2, 0
+	udiv	w0, w0, w3
+	bl	gc_add_sblk
+.L3462:
+	ldr	x0, [x19, 1128]
+	ldr	x1, [x22, 24]
+	ldr	w0, [x0, 544]
+	ldr	w1, [x1, 4]
 	cmp	w1, w0
-	beq	.L3475
+	beq	.L3463
 	mov	x1, x20
 	mov	w2, 2163
-	mov	x0, x22
+	adrp	x0, .LC0
+	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L3475:
-	mov	x0, x23
+.L3463:
+	mov	x0, x22
 	bl	zbuf_free
-.L3473:
-	add	x2, x19, :lo12:.LANCHOR0
-	ldr	x1, [x2,1120]
-	ldr	w2, [x2,3372]
-	ldr	w0, [x1,544]
-	add	w0, w0, 1
-	str	w0, [x1,544]
-	cmp	w0, w2
-	bcc	.L3476
-	mov	w0, -1
-	str	w0, [x1,544]
-	ldr	w0, [x1,548]
-	add	w0, w0, 1
-	str	w0, [x1,548]
+.L3461:
+	ldr	x0, [x19, 1128]
+	ldr	w2, [x19, 3364]
+	ldr	w1, [x0, 544]
+	add	w1, w1, 1
+	str	w1, [x0, 544]
+	cmp	w1, w2
+	bcc	.L3464
+	mov	w1, -1
+	str	w1, [x0, 544]
+	ldr	w1, [x0, 548]
+	add	w1, w1, 1
+	str	w1, [x0, 548]
 	bl	ftl_flush
 	bl	pm_flush
 	bl	ftl_ext_info_flush
 	mov	w0, 0
 	bl	ftl_info_flush
-	b	.L3470
-.L3476:
-	ldr	w0, [x29,76]
+.L3459:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 64
+	ret
+.L3464:
+	ldr	w0, [x29, 60]
 	cmn	w0, #1
-	bne	.L3470
-	adrp	x1, .LANCHOR5+998
+	bne	.L3459
+	adrp	x1, .LANCHOR5+462
 	add	w0, w21, 1
-	uxth	w0, w0
-	ldrh	w1, [x1,#:lo12:.LANCHOR5+998]
+	and	w0, w0, 65535
+	ldrh	w1, [x1, #:lo12:.LANCHOR5+462]
 	cmp	w21, w1, lsr 2
-	bcs	.L3470
+	bcs	.L3459
 	mov	w21, w0
-	b	.L3472
-.L3471:
-	ldr	w1, [x0,536]
-	ldr	w2, [x0,12]
-	add	w1, w1, 12959744
-	add	w1, w1, 256
-	cmp	w2, w1
-	bhi	.L3481
-	ldr	x3, [x3,3392]
-	ldr	w1, [x0,540]
-	ldr	w3, [x3,44]
-	add	w1, w1, 4096
-	add	w1, w1, 904
-	cmp	w3, w1
-	bls	.L3470
-.L3481:
-	add	x19, x19, :lo12:.LANCHOR0
-	ldr	x1, [x19,3392]
-	ldr	w1, [x1,44]
-	str	w1, [x0,540]
-	str	w2, [x0,536]
-	str	wzr, [x0,544]
+	b	.L3468
+.L3460:
+	ldr	w2, [x0, 536]
+	ldr	w3, [x0, 12]
+	add	w2, w2, 12959744
+	add	w2, w2, 256
+	cmp	w3, w2
+	bhi	.L3470
+	ldr	w2, [x0, 540]
+	mov	w4, 5000
+	add	w2, w2, w4
+	ldr	x4, [x19, 3384]
+	ldr	w4, [x4, 44]
+	cmp	w4, w2
+	bls	.L3459
 .L3470:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 80
-	ret
+	add	x1, x1, :lo12:.LANCHOR0
+	ldr	x1, [x1, 3384]
+	ldr	w1, [x1, 44]
+	str	w1, [x0, 540]
+	str	w3, [x0, 536]
+	str	wzr, [x0, 544]
+	b	.L3459
 	.size	gc_scan_static_data, .-gc_scan_static_data
 	.align	2
 	.global	gc_block_vpn_scan
@@ -22348,1001 +22176,998 @@ gc_scan_static_data:
 gc_block_vpn_scan:
 	stp	x29, x30, [sp, -144]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x19, .LANCHOR0
 	add	x20, x19, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	ldr	x1, [x20,1120]
-	ldrh	w0, [x20,1088]
-	ldr	w1, [x1,608]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldr	x1, [x20, 1128]
+	ldrh	w0, [x20, 1096]
+	ldr	w1, [x1, 608]
 	cmp	w1, w0
-	bcs	.L3486
+	bcs	.L3476
 	bl	timer_get_time
-	ldr	x21, [x20,1120]
-	ldr	w1, [x21,604]
-	add	w1, w1, 28672
-	add	w1, w1, 1328
+	ldr	x21, [x20, 1128]
+	mov	w2, 30000
+	ldr	w1, [x21, 604]
+	add	w1, w1, w2
 	cmp	w0, w1
-	bls	.L3486
+	bls	.L3476
 	bl	timer_get_time
-	str	w0, [x21,604]
-	ldr	x0, [x20,1120]
-	ldrh	w2, [x20,1088]
-	ldr	w1, [x0,600]
+	str	w0, [x21, 604]
+	ldr	x0, [x20, 1128]
+	ldrh	w2, [x20, 1096]
+	ldr	w1, [x0, 600]
 	cmp	w1, w2
-	bcs	.L3490
-	ldr	x2, [x20,3392]
-	ldrh	w2, [x2,134]
+	bcs	.L3478
+	ldr	x2, [x20, 3384]
+	ldrh	w2, [x2, 134]
 	cmp	w1, w2
-	bcs	.L3491
-.L3490:
+	bcs	.L3479
+.L3478:
 	add	x1, x19, :lo12:.LANCHOR0
-	ldr	x1, [x1,3392]
-	ldrh	w1, [x1,134]
-	str	w1, [x0,600]
-.L3491:
-	ldr	w26, [x0,600]
+	ldr	x1, [x1, 3384]
+	ldrh	w1, [x1, 134]
+	str	w1, [x0, 600]
+.L3479:
+	ldr	w25, [x0, 600]
 	mov	w0, 65535
-	uxth	w20, w26
-	cmp	w20, w0
-	bne	.L3492
+	and	w21, w25, 65535
+	cmp	w21, w0
+	bne	.L3480
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 920
 	mov	w2, 2504
-	add	x1, x1, 904
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L3492:
-	add	x21, x19, :lo12:.LANCHOR0
-	ldr	x0, [x21,1120]
-	ldr	w1, [x0,600]
+.L3480:
+	add	x14, x19, :lo12:.LANCHOR0
+	add	x15, x29, 128
+	ldr	x0, [x14, 1128]
+	ldr	w1, [x0, 600]
 	add	w1, w1, 1
-	str	w1, [x0,600]
-	ldr	w1, [x0,608]
+	str	w1, [x0, 600]
+	ldr	w1, [x0, 608]
 	add	w1, w1, 1
-	str	w1, [x0,608]
-	add	x1, x29, 128
-	mov	w0, w20
+	str	w1, [x0, 608]
+	mov	x1, x15
+	mov	w0, w21
 	bl	ftl_get_blk_list_in_sblk
-	uxth	w1, w0
-	cbz	w1, .L3486
-	uxtw	x22, w20
-	ldr	x24, [x21,1096]
-	add	x24, x24, x22, lsl 2
-	ldrb	w1, [x24,2]
-	tst	w1, 192
-	and	w2, w1, 224
-	beq	.L3493
-	cmp	w2, 224
-	beq	.L3493
-	ldr	x1, [x21,1120]
-	ldrh	w3, [x1,16]
-	cmp	w3, w20
-	beq	.L3493
-	ldrh	w3, [x1,48]
-	cmp	w3, w20
-	beq	.L3493
-	ldrh	w1, [x1,80]
-	cmp	w1, w20
-	bne	.L3494
-.L3493:
-	cbnz	w2, .L3486
+	mov	w1, w0
+	tst	w0, 65535
+	beq	.L3476
+	ldr	x24, [x14, 1104]
+	uxtw	x23, w21
+	mov	w2, 224
+	add	x24, x24, x23, lsl 2
+	ldrb	w0, [x24, 2]
+	and	w0, w0, 224
+	cmp	w0, 32
+	ccmp	w0, w2, 4, ne
+	beq	.L3481
+	cbz	w0, .L3482
+	ldr	x0, [x14, 1128]
+	ldrh	w2, [x0, 16]
+	cmp	w2, w21
+	beq	.L3476
+	ldrh	w2, [x0, 48]
+	cmp	w2, w21
+	beq	.L3476
+	ldrh	w0, [x0, 80]
+	cmp	w0, w21
+	bne	.L3512
+.L3476:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 144
+	ret
+.L3481:
+	cbnz	w0, .L3476
+.L3482:
 	add	x0, x19, :lo12:.LANCHOR0
-	lsl	x22, x22, 1
-	ldr	x0, [x0,1112]
-	ldrh	w0, [x0,x22]
-	cbz	w0, .L3495
+	lsl	x23, x23, 1
+	ldr	x0, [x0, 1120]
+	ldrh	w0, [x0, x23]
+	cbz	w0, .L3484
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 920
 	mov	w2, 2521
-	add	x1, x1, 904
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L3495:
+.L3484:
 	add	x19, x19, :lo12:.LANCHOR0
-	ldr	x0, [x19,1112]
-	strh	wzr, [x0,x22]
-	b	.L3486
-.L3494:
-	and	w0, w0, 65535
-	add	x1, x29, 144
-	sub	w0, w0, #1
-	add	x0, x1, w0, sxtw 1
-	ldrh	w21, [x0,-16]
+	ldr	x0, [x19, 1120]
+	strh	wzr, [x0, x23]
+	b	.L3476
+.L3512:
+	and	w1, w1, 65535
 	mov	w0, 65535
-	cmp	w21, w0
-	bne	.L3497
+	sub	w1, w1, #1
+	ldrh	w26, [x15, w1, sxtw 1]
+	cmp	w26, w0
+	bne	.L3486
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 920
 	mov	w2, 2529
-	add	x1, x1, 904
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L3497:
-	adrp	x25, .LANCHOR3
-	ldrb	w3, [x24,2]
-	add	x2, x25, :lo12:.LANCHOR3
-	mov	w27, 1
-	and	w3, w3, 224
-	cmp	w3, 160
-	ldrh	w0, [x2,1384]
-	ldrh	w1, [x2,1418]
-	sub	w0, w0, #1
-	mul	w1, w21, w1
-	uxth	w0, w0
-	bne	.L3498
-	ldrb	w3, [x2,1328]
-	cmp	w3, 2
-	uxth	w27, w3
-	orr	w1, w1, w3, lsl 24
-	bne	.L3498
-	ldrh	w0, [x2,1346]
+.L3486:
+	adrp	x20, .LANCHOR3
+	add	x2, x20, :lo12:.LANCHOR3
+	ldrb	w1, [x24, 2]
+	ldrh	w22, [x2, 1410]
+	and	w1, w1, 224
+	ldrh	w0, [x2, 1376]
+	cmp	w1, 160
 	sub	w0, w0, #1
-	uxth	w0, w0
-.L3498:
-	orr	w21, w0, w1
+	and	w0, w0, 65535
+	mul	w22, w22, w26
+	bne	.L3496
+	ldrb	w1, [x2, 1320]
+	cmp	w1, 2
+	orr	w22, w22, w1, lsl 24
+	beq	.L3488
+	and	w26, w1, 65535
+.L3487:
+	add	x20, x20, :lo12:.LANCHOR3
+	orr	w22, w0, w22
 	mov	w0, 1
 	bl	buf_alloc
-	str	w21, [x0,40]
+	str	w22, [x0, 40]
+	mov	x27, x0
 	mov	w1, 1
-	add	x21, x25, :lo12:.LANCHOR3
-	mov	x23, x0
 	bl	sblk_read_page
-	ldrh	w0, [x21,1346]
+	ldrb	w0, [x20, 1321]
 	mov	w1, 255
-	ldrb	w2, [x21,1329]
-	mul	w2, w0, w2
-	ldr	x0, [x21,1320]
+	ldrh	w2, [x20, 1338]
+	mul	w2, w2, w0
+	ldr	x0, [x20, 1312]
 	lsl	w2, w2, 2
 	bl	ftl_memset
-	ldr	w0, [x23,52]
+	ldr	w0, [x27, 52]
 	cmp	w0, 512
-	beq	.L3510
-	cmn	w0, #1
-	cset	w2, eq
-	cbz	w2, .L3499
-.L3510:
-	mov	w0, w20
-	mov	w1, 1
+	ccmn	w0, #1, 4, ne
+	bne	.L3489
+.L3514:
 	mov	w2, 0
-	b	.L3523
-.L3499:
-	ldr	x0, [x23,24]
+	mov	w1, 1
+	mov	w0, w21
+	bl	gc_add_sblk
+	mov	x0, x27
+	bl	zbuf_free
+	b	.L3476
+.L3488:
+	ldrh	w0, [x2, 1338]
+	mov	w26, w1
+	sub	w0, w0, #1
+	and	w0, w0, 65535
+	b	.L3487
+.L3496:
+	mov	w26, 1
+	b	.L3487
+.L3489:
+	ldr	x0, [x27, 24]
 	ldr	w1, [x0]
 	mov	w0, 15555
 	movk	w0, 0xf55f, lsl 16
 	cmp	w1, w0
-	beq	.L3501
-	mov	w0, w20
-	mov	w1, 1
-.L3523:
-	bl	gc_add_sblk
-	mov	x0, x23
-	bl	zbuf_free
-	b	.L3486
-.L3501:
-	ldrb	w0, [x21,1329]
+	bne	.L3514
+	ldrh	w0, [x20, 1376]
 	mov	x28, 0
-	ldrh	w1, [x21,1384]
-	mov	w21, w28
-	mul	w0, w0, w1
-	mul	w27, w27, w0
-	uxth	w0, w27
-	ldr	x27, [x23,8]
-	str	w0, [x29,108]
-	and	w0, w26, 65535
-	str	w0, [x29,104]
-.L3502:
-	ldr	w0, [x29,108]
+	ldrb	w1, [x20, 1321]
+	mov	w22, 0
+	mul	w1, w1, w0
+	mul	w1, w26, w1
+	ldr	x26, [x27, 8]
+	and	w0, w1, 65535
+	str	w0, [x29, 108]
+	and	w0, w25, 65535
+	str	w0, [x29, 104]
+	add	x0, x19, :lo12:.LANCHOR0
+	str	x0, [x29, 96]
+.L3491:
+	ldr	w0, [x29, 108]
 	cmp	w0, w28
-	ble	.L3524
-	ldr	w0, [x27,x28,lsl 2]
+	bgt	.L3494
+	mov	x0, x27
+	bl	zbuf_free
+	adrp	x0, .LANCHOR2
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 8, .L3495
+	add	x0, x19, :lo12:.LANCHOR0
+	ldrb	w4, [x24, 2]
+	mov	w3, w22
+	and	w1, w25, 65535
+	ldr	x0, [x0, 1120]
+	ubfx	x4, x4, 5, 3
+	ldrh	w2, [x0, x23, lsl 1]
+	adrp	x0, .LC255
+	add	x0, x0, :lo12:.LC255
+	bl	printk
+.L3495:
+	add	x19, x19, :lo12:.LANCHOR0
+	cmp	w22, 31
+	ldr	x0, [x19, 1120]
+	strh	w22, [x0, x23, lsl 1]
+	bhi	.L3476
+	mov	w2, 0
+	mov	w1, 1
+	mov	w0, w21
+	bl	gc_add_sblk
+	b	.L3476
+.L3494:
+	ldr	w0, [x26, x28, lsl 2]
 	cmn	w0, #1
-	beq	.L3503
+	beq	.L3492
 	bl	lpa_hash_get_ppa
-	str	w0, [x29,124]
+	str	w0, [x29, 124]
 	cmn	w0, #1
-	bne	.L3504
-	ldr	w0, [x27,x28,lsl 2]
-	add	x1, x29, 124
+	bne	.L3493
+	ldr	w0, [x26, x28, lsl 2]
 	mov	w2, 0
+	add	x1, x29, 124
 	bl	pm_log2phys
-.L3504:
-	add	x0, x19, :lo12:.LANCHOR0
-	add	x2, x25, :lo12:.LANCHOR3
+.L3493:
+	ldr	x0, [x29, 96]
 	mov	w1, 24
-	ldrb	w0, [x0,1257]
-	ldrh	w4, [x2,1312]
+	ldrh	w2, [x20, 1304]
+	ldrb	w0, [x0, 1205]
 	sub	w0, w1, w0
-	mov	w1, 1
-	sub	w0, w0, w4
-	lsl	w0, w1, w0
-	ldr	w1, [x29,124]
+	sub	w1, w0, w2
+	mov	w0, 1
+	lsl	w0, w0, w1
+	ldr	w1, [x29, 124]
 	sub	w0, w0, #1
-	lsr	w1, w1, w4
+	lsr	w1, w1, w2
 	and	w0, w0, w1
-	ldrb	w1, [x2,1314]
+	ldrb	w1, [x20, 1306]
 	udiv	w0, w0, w1
-	ldr	w1, [x29,104]
-	cmp	w0, w1
-	bne	.L3503
-	add	w21, w21, 1
-	uxth	w21, w21
-.L3503:
+	ldr	w1, [x29, 104]
+	cmp	w1, w0
+	bne	.L3492
+	add	w22, w22, 1
+	and	w22, w22, 65535
+.L3492:
 	add	x28, x28, 1
-	b	.L3502
-.L3524:
-	mov	x0, x23
-	bl	zbuf_free
-	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 8, .L3506
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w4, [x24,2]
-	uxth	w1, w26
-	mov	w3, w21
-	ubfx	x4, x4, 5, 3
-	ldr	x2, [x0,1112]
-	adrp	x0, .LC255
-	add	x0, x0, :lo12:.LC255
-	ldrh	w2, [x2,x22,lsl 1]
-	bl	printk
-.L3506:
-	add	x19, x19, :lo12:.LANCHOR0
-	cmp	w21, 31
-	ldr	x0, [x19,1112]
-	strh	w21, [x0,x22,lsl 1]
-	bhi	.L3486
-	mov	w0, w20
-	mov	w1, 1
-	mov	w2, 0
-	bl	gc_add_sblk
-.L3486:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 144
-	ret
+	b	.L3491
 	.size	gc_block_vpn_scan, .-gc_block_vpn_scan
 	.align	2
 	.global	ftl_sblk_dump
 	.type	ftl_sblk_dump, %function
 ftl_sblk_dump:
-	sub	sp, sp, #272
-	uxth	x0, w0
-	stp	x29, x30, [sp,48]
+	sub	sp, sp, #288
+	and	x0, x0, 65535
+	stp	x29, x30, [sp, 48]
 	add	x29, sp, 48
-	stp	x19, x20, [sp,64]
-	adrp	x20, .LANCHOR0
-	str	x0, [x29,128]
-	add	x19, x20, :lo12:.LANCHOR0
-	str	x1, [x29,160]
-	stp	x21, x22, [sp,80]
-	stp	x23, x24, [sp,96]
-	stp	x27, x28, [sp,128]
-	stp	x25, x26, [sp,112]
-	lsl	x24, x0, 2
-	mov	x22, x0
-	ldr	x0, [x19,1096]
-	mov	x28, x20
-	add	x1, x0, x24
-	ldrh	w4, [x0,x24]
-	ldr	w5, [x0,x24]
+	stp	x19, x20, [sp, 64]
+	mov	x20, x0
+	stp	x21, x22, [sp, 80]
+	adrp	x21, .LANCHOR0
+	add	x19, x21, :lo12:.LANCHOR0
+	stp	x23, x24, [sp, 96]
+	stp	x25, x26, [sp, 112]
+	lsl	x23, x0, 2
+	stp	x27, x28, [sp, 128]
+	str	x0, [x29, 136]
+	ldr	x0, [x19, 1104]
+	str	x1, [x29, 152]
+	add	x1, x0, x23
+	ldr	w5, [x0, x23]
+	ldrb	w2, [x1, 2]
+	mov	w1, w20
+	ldrh	w4, [x0, x23]
 	adrp	x0, .LC256
-	ldrb	w3, [x1,2]
+	ubfx	x5, x5, 11, 8
 	add	x0, x0, :lo12:.LC256
-	mov	w1, w22
+	ubfx	x3, x2, 3, 2
 	and	w4, w4, 2047
-	ubfx	x2, x3, 5, 3
-	ubfx	x5, x5, 11, 8
-	ubfx	x3, x3, 3, 2
+	ubfx	x2, x2, 5, 3
 	bl	printk
-	mov	w1, 65535
+	str	x21, [x29, 160]
+	mov	w0, 65535
+	cmp	w20, w0
+	beq	.L3537
+	ldrh	w1, [x19, 1096]
 	mov	w0, 0
-	cmp	w22, w1
-	beq	.L3526
-	ldrh	w1, [x19,1088]
-	cmp	w1, w22
-	bls	.L3526
-	ldr	x0, [x19,1096]
-	mov	w25, 1
-	adrp	x27, .LANCHOR3
-	add	x0, x0, x24
-	ldrb	w0, [x0,2]
+	cmp	w1, w20
+	bls	.L3515
+	ldr	x0, [x19, 1104]
+	adrp	x28, .LANCHOR3
+	add	x0, x0, x23
+	ldrb	w0, [x0, 2]
 	and	w0, w0, 224
 	cmp	w0, 160
-	bne	.L3527
-	add	x0, x27, :lo12:.LANCHOR3
-	ldrb	w25, [x0,1328]
-.L3527:
-	add	x1, x29, 208
-	mov	w0, w22
-	strh	w22, [x29,192]
-	mov	w23, 0
+	bne	.L3539
+	add	x0, x28, :lo12:.LANCHOR3
+	ldrb	w24, [x0, 1320]
+.L3517:
+	add	x27, x29, 240
+	mov	w0, w20
+	mov	w19, 0
+	strh	w20, [x27, -32]!
+	add	x1, x27, 16
 	bl	ftl_get_blk_list_in_sblk
-	uxtb	w1, w0
-	mov	w4, w0
-	add	x0, x27, :lo12:.LANCHOR3
-	strb	w1, [x29,201]
-	mov	w3, w25
-	strh	wzr, [x29,194]
-	uxtb	w4, w4
-	ldrh	w0, [x0,1384]
-	mov	w20, w23
-	strb	wzr, [x29,197]
-	strh	wzr, [x29,202]
-	mul	w1, w1, w0
-	add	x0, x28, :lo12:.LANCHOR0
-	strh	w1, [x29,198]
-	ldr	x1, [x0,1096]
+	add	x2, x28, :lo12:.LANCHOR3
+	and	w1, w0, 255
+	strb	w1, [x29, 217]
+	and	w4, w0, 255
+	strh	wzr, [x29, 210]
+	mov	w3, w24
+	ldrh	w2, [x2, 1376]
 	adrp	x0, .LC257
+	strb	wzr, [x29, 213]
 	add	x0, x0, :lo12:.LC257
-	add	x1, x1, x24
-	ldrb	w2, [x1,2]
-	mov	w1, w22
+	strh	wzr, [x29, 218]
+	mul	w1, w1, w2
+	strh	w1, [x29, 214]
+	ldr	x1, [x29, 160]
+	add	x1, x1, :lo12:.LANCHOR0
+	ldr	x1, [x1, 1104]
+	add	x1, x1, x23
+	ldrb	w2, [x1, 2]
+	mov	w1, w20
 	ubfx	x2, x2, 5, 3
 	bl	printk
 	mov	w0, 1
 	bl	buf_alloc
-	mov	x26, x0
+	stp	wzr, wzr, [x29, 168]
+	mov	x25, x0
+	str	wzr, [x29, 176]
 	adrp	x0, .LC195
-	str	w23, [x29,168]
 	add	x0, x0, :lo12:.LC195
-	str	x0, [x29,120]
-	adrp	x0, .LANCHOR4
-	str	w23, [x29,144]
-	add	x0, x0, :lo12:.LANCHOR4
-	add	x0, x0, 928
-	str	x0, [x29,112]
-.L3528:
-	add	x0, x27, :lo12:.LANCHOR3
-	ldrh	w0, [x0,1384]
-	cmp	w0, w20
-	bls	.L3546
-	lsl	w0, w20, 1
-	str	wzr, [x29,172]
-	add	w1, w0, w20
+	str	x0, [x29, 120]
+.L3518:
+	add	x0, x28, :lo12:.LANCHOR3
+	ldrh	w0, [x0, 1376]
+	cmp	w0, w19
+	bls	.L3535
+	lsl	w0, w19, 1
+	mov	w22, 0
+	sub	w1, w0, #1
+	add	w0, w0, w19
 	sub	w0, w0, #1
-	sub	w1, w1, #1
-	str	w0, [x29,136]
-	str	w1, [x29,140]
-.L3547:
-	ldrb	w0, [x29,201]
-	ldr	w1, [x29,172]
-	cmp	w0, w1
-	bls	.L3544
-	mov	w21, 1
-.L3545:
-	cmp	w21, w25
-	ldr	w0, [x29,172]
-	bhi	.L3566
-	add	x1, x29, 192
-	add	x0, x1, w0, sxtw 1
-	ldrh	w3, [x0,16]
-	mov	w0, 65535
-	cmp	w3, w0
-	beq	.L3529
-	add	x0, x27, :lo12:.LANCHOR3
-	cmp	w25, 3
-	ldrh	w2, [x0,1418]
-	mul	w2, w3, w2
-	bne	.L3530
-	add	x1, x28, :lo12:.LANCHOR0
-	ldrb	w4, [x1,1268]
-	cbz	w4, .L3531
-	ldr	w1, [x29,140]
-	b	.L3564
-.L3531:
-	ldrb	w0, [x1,1269]
-	lsl	w19, w21, 24
-	cbz	w0, .L3533
-	ldr	w0, [x29,140]
-	add	w2, w2, w0
-	add	w2, w2, w21
-	b	.L3565
-.L3533:
-	add	w2, w2, w20
-.L3565:
-	orr	w19, w19, w2
-	b	.L3532
-.L3530:
-	cmp	w25, 2
-	add	w19, w2, w20
-	bne	.L3532
-	ldr	w1, [x29,136]
-.L3564:
-	ldrb	w19, [x0,1328]
-	add	w2, w2, w1
-	add	w2, w2, w21
-	orr	w19, w2, w19, lsl 24
+	stp	w1, w0, [x29, 144]
+	b	.L3536
+.L3539:
+	mov	w24, 1
+	b	.L3517
 .L3532:
+	ldr	x0, [x29, 128]
+	ldrh	w10, [x27, x0]
+	mov	w0, 65535
+	cmp	w10, w0
+	beq	.L3519
+	add	x2, x28, :lo12:.LANCHOR3
+	cmp	w24, 3
+	ldrh	w8, [x2, 1410]
+	mul	w1, w8, w10
+	add	w0, w21, w1
+	bne	.L3520
+	ldr	x3, [x29, 160]
+	add	x3, x3, :lo12:.LANCHOR0
+	ldrb	w4, [x3, 1212]
+	cbz	w4, .L3521
+	ldrb	w8, [x2, 1320]
+	ldr	w1, [x29, 148]
+.L3548:
+	add	w0, w0, w1
+	orr	w26, w0, w8, lsl 24
+	b	.L3522
+.L3521:
+	ldrb	w2, [x3, 1213]
+	lsl	w8, w21, 24
+	cbz	w2, .L3523
+	ldr	w1, [x29, 148]
+	add	w0, w0, w1
+	orr	w26, w0, w8
+.L3522:
+	str	w26, [x25, 40]
 	mov	w1, 1
-	str	w19, [x26,40]
-	mov	x0, x26
-	str	x3, [x29,104]
+	str	w10, [x29, 108]
+	mov	x0, x25
 	bl	sblk_read_page
-	ldr	x7, [x26,8]
-	mov	w2, w20
-	ldr	x0, [x26,24]
-	ldr	w9, [x26,52]
-	ldr	w1, [x7,12]
+	ldr	x1, [x25, 24]
+	mov	w3, w26
+	ldr	x0, [x25, 8]
+	ldr	w11, [x25, 52]
+	ldr	w10, [x29, 108]
+	ldr	w2, [x1, 12]
+	mov	w4, w11
+	str	w2, [sp, 32]
+	str	w11, [x29, 112]
+	ldr	w2, [x1, 8]
+	str	w2, [sp, 24]
+	ldr	w2, [x1, 4]
+	str	w2, [sp, 16]
+	mov	w2, w19
+	ldr	w1, [x1]
+	str	w1, [sp, 8]
+	ldr	w1, [x0, 12]
 	str	w1, [sp]
-	mov	w4, w9
-	ldr	x3, [x29,104]
-	ldr	w1, [x0]
-	str	w1, [sp,8]
-	str	x9, [x29,104]
-	ldr	w1, [x0,4]
-	str	w1, [sp,16]
-	ldr	w1, [x0,8]
-	str	w1, [sp,24]
-	mov	w1, w3
-	mov	w3, w19
-	ldr	w0, [x0,12]
-	str	w0, [sp,32]
-	ldr	x0, [x29,120]
-	ldr	w5, [x7]
-	ldr	w6, [x7,4]
-	ldr	w7, [x7,8]
-	bl	printk
-	ldr	x9, [x29,104]
-	cmp	w9, 512
-	beq	.L3551
-	cmn	w9, #1
-	bne	.L3535
-.L3551:
-	mov	w0, 1
-	str	w0, [x29,168]
-.L3535:
+	mov	w1, w10
+	ldp	w5, w6, [x0]
+	ldr	w7, [x0, 8]
+	ldr	x0, [x29, 120]
+	bl	printk
+	ldr	w11, [x29, 112]
+	ldr	w0, [x29, 168]
+	cmp	w11, 512
+	ccmn	w11, #1, 4, ne
+	csinc	w0, w0, wzr, ne
+	str	w0, [x29, 168]
 	mov	x0, 35160
 	movk	x0, 0x41, lsl 16
 	bl	__const_udelay
-	add	x0, x28, :lo12:.LANCHOR0
-	ldr	x0, [x0,1096]
-	add	x0, x0, x24
-	ldrb	w0, [x0,2]
+	ldr	x0, [x29, 160]
+	mov	w1, 32
+	add	x0, x0, :lo12:.LANCHOR0
+	ldr	x0, [x0, 1104]
+	add	x0, x0, x23
+	ldrb	w0, [x0, 2]
 	and	w0, w0, 224
-	cmp	w0, 32
-	beq	.L3529
 	cmp	w0, 224
-	cset	w2, eq
-	cbnz	w2, .L3529
-	ldr	x0, [x26,24]
-	str	x2, [x29,104]
-	ldr	w0, [x0,4]
+	ccmp	w0, w1, 4, ne
+	beq	.L3519
+	ldr	x0, [x25, 24]
+	ldr	w0, [x0, 4]
 	bl	lpa_hash_get_ppa
-	str	w0, [x29,188]
+	str	w0, [x29, 204]
 	cmn	w0, #1
-	ldr	x2, [x29,104]
-	bne	.L3537
-	ldr	x0, [x26,24]
-	add	x1, x29, 188
-	ldr	w0, [x0,4]
+	bne	.L3526
+	ldr	x0, [x25, 24]
+	mov	w2, 0
+	add	x1, x29, 204
+	ldr	w0, [x0, 4]
 	bl	pm_log2phys
-.L3537:
-	ldr	w0, [x29,188]
-	cmp	w0, w19
-	bne	.L3538
-	ldr	x2, [x26,24]
-	add	w23, w23, 1
-	adrp	x0, .LC258
-	mov	w1, w19
+.L3526:
+	ldr	w0, [x29, 204]
+	cmp	w26, w0
+	bne	.L3527
+	ldr	w0, [x29, 172]
+	mov	w1, w26
+	add	w0, w0, 1
+	str	w0, [x29, 172]
+	ldr	x0, [x25, 24]
+	ldr	w3, [x29, 172]
+	ldr	w2, [x0, 4]
+	adrp	x0, .LC258
 	add	x0, x0, :lo12:.LC258
-	mov	w3, w23
-	ldr	w2, [x2,4]
-	bl	printk
-.L3538:
-	ldr	x0, [x29,160]
-	cbz	x0, .L3540
-	ldr	x0, [x29,144]
-	ubfiz	x19, x0, 2, 32
-	ldr	x0, [x29,160]
-	ldr	w2, [x0,x19]
-	ldr	x0, [x26,24]
-	ldr	w0, [x0,4]
+	bl	printk
+.L3527:
+	ldr	x0, [x29, 152]
+	cbz	x0, .L3529
+	ldr	x0, [x29, 176]
+	ubfiz	x3, x0, 2, 32
+	ldr	x0, [x29, 152]
+	ldr	w2, [x0, x3]
+	ldr	x0, [x25, 24]
+	ldr	w0, [x0, 4]
 	cmp	w0, w2
-	beq	.L3541
+	beq	.L3530
 	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L3541
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L3530
+	ldr	w1, [x29, 176]
 	adrp	x0, .LC259
-	ldr	w1, [x29,144]
+	str	x3, [x29, 112]
 	add	x0, x0, :lo12:.LC259
 	bl	printk
-.L3541:
-	ldr	x0, [x29,160]
-	ldr	x1, [x26,24]
-	ldr	w0, [x0,x19]
-	ldr	w1, [x1,4]
+	ldr	x3, [x29, 112]
+.L3530:
+	ldr	x1, [x25, 24]
+	ldr	x0, [x29, 152]
+	ldr	w1, [x1, 4]
+	ldr	w0, [x0, x3]
 	cmp	w1, w0
-	beq	.L3540
+	beq	.L3529
 	cmn	w0, #1
-	beq	.L3540
-	adrp	x0, .LC0
-	ldr	x1, [x29,112]
+	beq	.L3529
+	adrp	x1, .LANCHOR4
+	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 944
 	mov	w2, 1575
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L3540:
-	ldr	w0, [x29,144]
-	add	w0, w0, 1
-	str	w0, [x29,144]
 .L3529:
-	add	w21, w21, 1
-	uxth	w21, w21
-	b	.L3545
-.L3566:
+	ldr	w0, [x29, 176]
 	add	w0, w0, 1
-	uxth	w0, w0
-	str	w0, [x29,172]
-	b	.L3547
-.L3544:
-	add	w20, w20, 1
-	uxth	w20, w20
-	b	.L3528
-.L3546:
-	mov	x0, x26
+	str	w0, [x29, 176]
+.L3519:
+	add	w21, w21, 1
+	and	w21, w21, 65535
+.L3534:
+	cmp	w24, w21
+	bcs	.L3532
+	add	w22, w22, 1
+	and	w22, w22, 65535
+.L3536:
+	ldrb	w0, [x29, 217]
+	cmp	w0, w22
+	bls	.L3533
+	sxtw	x0, w22
+	mov	w21, 1
+	add	x0, x0, 8
+	lsl	x0, x0, 1
+	str	x0, [x29, 128]
+	b	.L3534
+.L3523:
+	add	w1, w19, w1
+	orr	w26, w8, w1
+	b	.L3522
+.L3520:
+	cmp	w24, 2
+	bne	.L3524
+	ldrb	w8, [x2, 1320]
+	ldr	w1, [x29, 144]
+	b	.L3548
+.L3524:
+	add	w26, w19, w1
+	b	.L3522
+.L3533:
+	add	w19, w19, 1
+	and	w19, w19, 65535
+	b	.L3518
+.L3535:
+	mov	x0, x25
 	bl	zbuf_free
-	add	x0, x28, :lo12:.LANCHOR0
-	ldr	x3, [x29,128]
-	mov	w1, w22
-	ldr	x2, [x0,1112]
+	ldr	x0, [x29, 160]
+	ldr	x1, [x29, 136]
+	add	x0, x0, :lo12:.LANCHOR0
+	ldr	w3, [x29, 172]
+	ldr	x0, [x0, 1120]
+	ldrh	w2, [x0, x1, lsl 1]
+	mov	w1, w20
 	adrp	x0, .LC260
 	add	x0, x0, :lo12:.LC260
-	ldrh	w2, [x2,x3,lsl 1]
-	mov	w3, w23
 	bl	printk
-	ldr	w0, [x29,168]
-.L3526:
-	sub	sp, x29, #48
-	ldp	x19, x20, [sp,64]
-	ldp	x21, x22, [sp,80]
-	ldp	x23, x24, [sp,96]
-	ldp	x25, x26, [sp,112]
-	ldp	x27, x28, [sp,128]
-	ldp	x29, x30, [sp,48]
-	add	sp, sp, 272
+	ldr	w0, [x29, 168]
+.L3515:
+	ldp	x19, x20, [sp, 64]
+	ldp	x21, x22, [sp, 80]
+	ldp	x23, x24, [sp, 96]
+	ldp	x25, x26, [sp, 112]
+	ldp	x27, x28, [sp, 128]
+	ldp	x29, x30, [sp, 48]
+	add	sp, sp, 288
 	ret
+.L3537:
+	mov	w0, 0
+	b	.L3515
 	.size	ftl_sblk_dump, .-ftl_sblk_dump
 	.align	2
 	.global	zftl_read
 	.type	zftl_read, %function
 zftl_read:
-	sub	sp, sp, #192
-	stp	x29, x30, [sp,16]
+	sub	sp, sp, #176
+	stp	x29, x30, [sp, 16]
 	add	x29, sp, 16
-	stp	x19, x20, [sp,32]
-	mov	w19, w0
+	stp	x19, x20, [sp, 32]
+	mov	w20, w0
 	adrp	x0, .LANCHOR2
-	stp	x21, x22, [sp,48]
-	stp	x23, x24, [sp,64]
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	mov	w20, w1
-	stp	x25, x26, [sp,80]
-	stp	x27, x28, [sp,96]
-	mov	w23, w2
-	mov	x22, x3
-	tbz	x0, 12, .L3568
+	stp	x23, x24, [sp, 64]
+	stp	x21, x22, [sp, 48]
+	mov	w19, w1
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	mov	w24, w2
+	stp	x25, x26, [sp, 80]
+	mov	x23, x3
+	stp	x27, x28, [sp, 96]
+	tbz	x0, 12, .L3550
+	mov	w3, w2
 	adrp	x0, .LC261
-	mov	w1, w19
+	mov	w2, w1
 	add	x0, x0, :lo12:.LC261
-	mov	w2, w20
-	mov	w3, w23
+	mov	w1, w20
 	bl	printk
-.L3568:
-	cbnz	w19, .L3569
+.L3550:
+	cbnz	w20, .L3551
 	adrp	x0, .LANCHOR0+1032
-	mov	w19, 24576
-	ldr	w1, [x0,#:lo12:.LANCHOR0+1032]
-	b	.L3570
-.L3569:
-	cmp	w19, 3
-	mov	w3, -1
-	bhi	.L3571
-	lsl	w19, w19, 13
-	mov	w1, 8192
-.L3570:
-	cmp	w20, w1
-	bcs	.L3603
-	cmp	w23, w1
-	cset	w0, hi
-	cbnz	w0, .L3603
-	add	w2, w20, w23
-	mov	w3, -1
-	cmp	w2, w1
-	bhi	.L3571
-	adrp	x21, .LANCHOR0
-	add	w20, w19, w20
-	add	x2, x21, :lo12:.LANCHOR0
-	str	w0, [x29,148]
-	adrp	x0, .LC0
-	add	x0, x0, :lo12:.LC0
-	str	x0, [x29,136]
-	ldr	x3, [x2,3392]
+	mov	w20, 24576
+	ldr	w0, [x0, #:lo12:.LANCHOR0+1032]
+.L3552:
+	cmp	w0, w19
+	ccmp	w0, w24, 0, hi
+	bcc	.L3585
+	add	w1, w19, w24
+	cmp	w0, w1
+	bcc	.L3585
+	add	w20, w20, w19
+	adrp	x19, .LANCHOR0
+	add	x0, x19, :lo12:.LANCHOR0
+	adrp	x21, .LANCHOR3
+	ldr	x1, [x0, 3384]
+	ldr	w0, [x1, 24]
+	add	w0, w0, w24
+	str	w0, [x1, 24]
+	add	x0, x21, :lo12:.LANCHOR3
+	add	w1, w24, w20
+	stp	w1, wzr, [x29, 136]
+	sub	w1, w1, #1
+	ldrb	w0, [x0, 1946]
+	udiv	w26, w20, w0
+	udiv	w0, w1, w0
+	mov	w22, w26
+	sub	w25, w0, w26
+	str	w0, [x29, 132]
+	add	w25, w25, 1
 	adrp	x0, .LANCHOR4
 	add	x0, x0, :lo12:.LANCHOR4
-	add	x0, x0, 944
-	str	x0, [x29,128]
-	ldr	w1, [x3,24]
-	add	w1, w1, w23
-	str	w1, [x3,24]
-	ldrb	w1, [x2,3360]
-	udiv	w2, w20, w1
-	str	w2, [x29,156]
-	add	w2, w20, w23
-	str	w2, [x29,152]
-	sub	w2, w2, #1
-	udiv	w1, w2, w1
-	ldr	w2, [x29,156]
-	str	w1, [x29,144]
-	sub	w25, w1, w2
-	mov	x19, x2
-	add	w25, w25, 1
-.L3572:
-	cbz	w25, .L3645
-	ldr	w1, [x29,156]
-	add	x0, x21, :lo12:.LANCHOR0
-	cmp	w19, w1
-	ldr	w1, [x29,144]
-	ldrb	w0, [x0,3360]
-	cset	w2, eq
-	cmp	w19, w1
-	cset	w26, eq
-	uxth	w24, w0
-	cbnz	w26, .L3607
-	cbz	w2, .L3573
-	b	.L3644
-.L3607:
-	cbz	w2, .L3575
-.L3644:
-	udiv	w26, w20, w0
-	msub	w26, w26, w0, w20
-	uxth	w0, w23
-	uxth	w26, w26
-	sub	w24, w24, w26
-	uxth	w24, w24
-	cmp	w24, w23
-	csel	w24, w0, w24, hi
-	b	.L3573
-.L3575:
-	ldr	w1, [x29,152]
-	mov	w26, w2
-	msub	w24, w0, w19, w1
-	uxtb	w24, w24
-.L3573:
-	add	x1, x21, :lo12:.LANCHOR0
+	add	x0, x0, 960
+	str	x0, [x29, 112]
+.L3554:
+	cbnz	w25, .L3582
+	bl	timer_get_time
+	adrp	x1, .LANCHOR5+468
+	str	w0, [x1, #:lo12:.LANCHOR5+468]
+	ldr	w0, [x29, 140]
+.L3549:
+	ldp	x19, x20, [sp, 32]
+	ldp	x21, x22, [sp, 48]
+	ldp	x23, x24, [sp, 64]
+	ldp	x25, x26, [sp, 80]
+	ldp	x27, x28, [sp, 96]
+	ldp	x29, x30, [sp, 16]
+	add	sp, sp, 176
+	ret
+.L3551:
+	cmp	w20, 3
+	bhi	.L3585
+	lsl	w20, w20, 13
+	mov	w0, 8192
+	b	.L3552
+.L3582:
+	add	x0, x21, :lo12:.LANCHOR3
+	cmp	w22, w26
+	ldrb	w1, [x0, 1946]
+	ldr	w0, [x29, 132]
+	and	w27, w1, 65535
+	ccmp	w22, w0, 4, ne
+	bne	.L3586
+	cmp	w22, w26
+	bne	.L3556
+	udiv	w3, w20, w1
+	and	w0, w24, 65535
+	msub	w1, w3, w1, w20
+	and	w28, w1, 65535
+	sub	w27, w27, w28
+	and	w27, w27, 65535
+	cmp	w24, w27
+	csel	w27, w0, w27, cc
+.L3555:
+	add	x1, x19, :lo12:.LANCHOR0
 	mov	w0, 0
-	add	x1, x1, 1312
-.L3578:
-	ldr	w2, [x1,36]
-	cmp	w2, w19
-	bne	.L3576
-	ldrb	w2, [x1,2]
-	tbz	x2, 3, .L3576
-	add	x2, x21, :lo12:.LANCHOR0
-	ubfiz	x1, x0, 6, 32
-	add	x0, x2, x1
-	ubfiz	x26, x26, 9, 16
-	lsl	w2, w24, 9
-	ubfiz	x24, x24, 9, 16
-	ldr	x1, [x0,1320]
-	mov	x0, x22
-	add	x22, x22, x24
-	add	x1, x1, x26
+	add	x1, x1, 1306
+.L3559:
+	ldr	w2, [x1, 34]
+	cmp	w22, w2
+	bne	.L3557
+	ldrb	w2, [x1]
+	tbz	x2, 3, .L3557
+	add	x1, x19, :lo12:.LANCHOR0
+	ubfiz	x0, x0, 6, 32
+	add	x0, x1, x0
+	lsl	w2, w27, 9
+	ubfiz	x27, x27, 9, 16
+	ubfiz	x28, x28, 9, 16
+	ldr	x1, [x0, 1312]
+	mov	x0, x23
+	add	x23, x23, x27
+	add	x1, x1, x28
 	bl	ftl_memcpy
-	b	.L3577
-.L3576:
+.L3558:
+	add	w22, w22, 1
+	sub	w25, w25, #1
+.L3565:
+	add	x0, x19, :lo12:.LANCHOR0
+	ldrb	w0, [x0, 3353]
+	cmp	w0, 2
+	bls	.L3566
+	cbnz	w25, .L3554
+.L3566:
+	add	x2, x21, :lo12:.LANCHOR3
+	ldrb	w1, [x2, 1957]
+	cbz	w1, .L3554
+	ldrb	w2, [x2, 1956]
+	add	x0, x19, :lo12:.LANCHOR0
+	add	x0, x0, 1304
+	add	x0, x0, x2, lsl 6
+	bl	sblk_read_page
+	adrp	x0, .LC0
+	add	x0, x0, :lo12:.LC0
+	str	x0, [x29, 120]
+.L3568:
+	add	x0, x21, :lo12:.LANCHOR3
+	ldrb	w1, [x0, 1957]
+	cbnz	w1, .L3581
+	mov	w1, -1
+	strb	wzr, [x0, 1957]
+	strb	w1, [x0, 1956]
+	b	.L3554
+.L3556:
+	ldr	w0, [x29, 136]
+	msub	w27, w1, w22, w0
+	and	w27, w27, 255
+.L3586:
+	mov	w28, 0
+	b	.L3555
+.L3557:
 	add	w0, w0, 1
 	add	x1, x1, 64
 	cmp	w0, 32
-	bne	.L3578
-	mov	w0, w19
+	bne	.L3559
+	mov	w0, w22
 	bl	lpa_hash_get_ppa
-	str	w0, [x29,172]
+	str	w0, [x29, 156]
 	cmn	w0, #1
-	bne	.L3579
-	mov	w0, w19
-	add	x1, x29, 172
+	bne	.L3560
 	mov	w2, 0
+	add	x1, x29, 156
+	mov	w0, w22
 	bl	pm_log2phys
-.L3579:
-	ldr	w0, [x29,172]
+.L3560:
+	ldr	w0, [x29, 156]
 	cmn	w0, #1
-	bne	.L3580
-	mov	w24, 0
-.L3581:
-	add	x0, x21, :lo12:.LANCHOR0
-	ldrb	w0, [x0,3360]
-	cmp	w24, w0
-	bcs	.L3577
-	madd	w0, w19, w0, w24
-	cmp	w0, w20
-	bcc	.L3582
-	ldr	w1, [x29,152]
-	cmp	w0, w1
-	bcs	.L3582
-	mov	x0, x22
-	mov	w1, 0
+	bne	.L3561
+	add	x28, x21, :lo12:.LANCHOR3
+	mov	w27, 0
+.L3562:
+	ldrb	w0, [x28, 1946]
+	cmp	w27, w0
+	bcs	.L3558
+	madd	w0, w22, w0, w27
+	cmp	w20, w0
+	bhi	.L3563
+	ldr	w1, [x29, 136]
+	cmp	w1, w0
+	bls	.L3563
+	mov	x0, x23
+	add	x23, x23, 512
 	mov	w2, 512
-	add	x22, x22, 512
+	mov	w1, 0
 	bl	ftl_memset
-.L3582:
-	add	w24, w24, 1
-	b	.L3581
-.L3580:
+.L3563:
+	add	w27, w27, 1
+	b	.L3562
+.L3561:
 	mov	w0, 0
 	bl	buf_alloc
-	cbz	x0, .L3584
-	add	x2, x21, :lo12:.LANCHOR0
-	ldr	x3, [x2,3392]
-	ldr	w2, [x3,40]
+	cbz	x0, .L3565
+	add	x2, x19, :lo12:.LANCHOR0
+	ldr	x4, [x2, 3384]
+	ldr	w2, [x4, 40]
 	add	w2, w2, 1
-	str	w2, [x3,40]
-	ldr	w2, [x29,172]
-	strb	w24, [x0,56]
-	ubfiz	x24, x24, 9, 16
-	str	x22, [x0,16]
-	add	x22, x22, x24
-	str	w2, [x0,40]
-	str	w2, [x0,44]
-	str	w19, [x0,36]
-	strb	w26, [x0,57]
+	str	w2, [x4, 40]
+	ldr	w2, [x29, 156]
+	strb	w27, [x0, 56]
+	ubfiz	x27, x27, 9, 16
+	str	x23, [x0, 16]
+	add	x23, x23, x27
+	strb	w28, [x0, 57]
+	stp	w22, w2, [x0, 36]
+	str	w2, [x0, 44]
 	bl	zftl_add_read_buf
-.L3577:
-	add	w19, w19, 1
-	sub	w25, w25, #1
-.L3584:
-	cbz	w25, .L3608
-	add	x0, x21, :lo12:.LANCHOR0
-	ldrb	w0, [x0,3362]
-	cmp	w0, 2
-	bhi	.L3572
-.L3608:
-	adrp	x24, .LANCHOR3
-	add	x2, x24, :lo12:.LANCHOR3
-	ldrb	w1, [x2,1963]
-	cbz	w1, .L3572
-	ldrb	w2, [x2,1962]
-	add	x26, x21, :lo12:.LANCHOR0
-	add	x0, x26, 1312
-	mov	x27, x26
-	add	x0, x0, x2, lsl 6
-	bl	sblk_read_page
-.L3587:
-	add	x0, x24, :lo12:.LANCHOR3
-	ldrb	w1, [x0,1963]
-	cbz	w1, .L3646
-	ldrb	w0, [x0,1962]
+	b	.L3558
+.L3581:
+	ldrb	w0, [x0, 1956]
 	cmp	w0, 255
-	bne	.L3588
-	ldr	x1, [x29,128]
-	mov	w2, 1283
-	ldr	x0, [x29,136]
+	bne	.L3569
+	ldp	x1, x0, [x29, 112]
+	mov	w2, 1284
 	bl	printk
 	bl	dump_stack
-.L3588:
-	add	x0, x24, :lo12:.LANCHOR3
-	add	x1, x27, 1312
-	ldrb	w28, [x0,1962]
-	lsl	x2, x28, 6
-	add	x26, x1, x2
-	ldrb	w1, [x1,x2]
-	ldr	w6, [x26,52]
-	strb	w1, [x0,1962]
-	cmn	w6, #1
-	bne	.L3589
-	ldr	x1, [x27,1120]
-	str	w6, [x29,148]
-	ldr	w0, [x1,552]
+.L3569:
+	add	x0, x21, :lo12:.LANCHOR3
+	add	x4, x19, :lo12:.LANCHOR0
+	add	x1, x4, 1304
+	ldrb	w8, [x0, 1956]
+	ubfiz	x27, x8, 6, 8
+	add	x28, x1, x27
+	sxtw	x27, w8
+	lsl	x3, x27, 6
+	add	x2, x1, x3
+	ldrb	w1, [x1, x3]
+	ldr	w9, [x2, 52]
+	strb	w1, [x0, 1956]
+	cmn	w9, #1
+	bne	.L3570
+	ldr	x1, [x4, 1128]
+	str	w9, [x29, 140]
+	ldr	w0, [x1, 552]
 	add	w0, w0, 1
-	str	w0, [x1,552]
-	b	.L3590
-.L3589:
-	cmp	w6, 256
-	bne	.L3590
-	ldrb	w4, [x27,1257]
-	mov	w1, 24
-	ldrh	w5, [x0,1312]
-	mov	w7, 1
-	sub	w4, w1, w4
-	ldr	w3, [x26,40]
-	sub	w4, w4, w5
-	ldr	w2, [x26,36]
-	lsl	w4, w7, w4
-	lsr	w5, w3, w5
-	sub	w4, w4, #1
-	str	x6, [x29,104]
-	and	w5, w4, w5
-	ldrb	w4, [x0,1314]
-	adrp	x0, .LC262
-	str	x7, [x29,112]
-	add	x0, x0, :lo12:.LC262
-	udiv	w4, w5, w4
-	str	x4, [x29,120]
-	uxth	w1, w4
-	bl	printk
-	ldr	x4, [x29,120]
-	mov	w2, 0
-	ldr	x7, [x29,112]
-	mov	w0, w4
-	mov	w1, w7
-	bl	gc_add_sblk
-	ldr	x6, [x29,104]
-.L3590:
-	add	x0, x27, 1312
-	add	x0, x0, x28, lsl 6
-	ldr	x3, [x0,24]
-	ldr	w0, [x0,36]
-	ldr	w1, [x3,4]
+	str	w0, [x1, 552]
+.L3571:
+	add	x0, x19, :lo12:.LANCHOR0
+	add	x0, x0, 1304
+	add	x0, x0, x27, lsl 6
+	ldr	x3, [x0, 24]
+	ldr	w0, [x0, 36]
+	ldr	w1, [x3, 4]
 	cmp	w1, w0
-	bne	.L3609
-	cmn	w6, #1
-	bne	.L3591
-.L3609:
-	add	x0, x27, 1312
-	ldrb	w4, [x27,3360]
-	add	x0, x0, x28, lsl 6
-	ldrb	w6, [x27,1257]
-	mov	w5, 24
-	sub	w5, w5, w6
-	ldrb	w1, [x0,56]
-	ldr	x2, [x0,8]
-	ldr	x7, [x0,16]
+	bne	.L3572
+	cmn	w9, #1
+	bne	.L3573
+.L3572:
+	add	x0, x21, :lo12:.LANCHOR3
+	add	x5, x19, :lo12:.LANCHOR0
+	ldrb	w4, [x0, 1946]
+	add	x0, x5, 1304
+	add	x0, x0, x27, lsl 6
+	ldrb	w6, [x5, 1205]
+	mov	w5, 1
+	ldrb	w1, [x0, 56]
+	lsl	w5, w5, w6
+	ldp	x2, x7, [x0, 8]
 	cmp	w1, w4
-	ldr	w1, [x0,40]
-	mov	w0, 1
-	lsl	w0, w0, w6
+	sub	w5, w5, #1
+	ldr	w1, [x0, 40]
+	mov	w0, 24
+	sub	w0, w0, w6
 	csel	x2, x7, x2, cs
-	sub	w0, w0, #1
-	lsr	w6, w1, w5
-	lsl	w5, w0, w5
-	and	w0, w0, w6
-	bic	w1, w1, w5
+	lsl	w6, w5, w0
+	lsr	w0, w1, w0
+	bic	w1, w1, w6
+	and	w0, w0, w5
 	bl	flash_read_page_en
-	mov	w6, w0
-.L3591:
-	cmn	w6, #1
-	cset	w11, eq
-	cbnz	w11, .L3610
-	add	x0, x27, 1312
-	add	x0, x0, x28, lsl 6
-	ldr	x1, [x0,24]
-	ldr	w0, [x0,36]
-	ldr	w1, [x1,4]
+	mov	w9, w0
+.L3573:
+	add	x0, x19, :lo12:.LANCHOR0
+	add	x0, x0, 1304
+	add	x0, x0, x27, lsl 6
+	ldr	x1, [x0, 24]
+	ldr	w0, [x0, 36]
+	ldr	w1, [x1, 4]
 	cmp	w1, w0
-	beq	.L3631
-.L3610:
-	ldr	x1, [x27,1120]
-	add	x10, x27, 1312
-	add	x10, x10, x28, lsl 6
-	mov	w2, w6
-	add	x10, x10, 32
-	str	x11, [x29,112]
-	ldr	w0, [x1,552]
+	bne	.L3575
+	cmn	w9, #1
+	bne	.L3576
+.L3575:
+	add	x11, x19, :lo12:.LANCHOR0
+	str	w9, [x29, 128]
+	add	x10, x11, 1304
+	add	x10, x10, x27, lsl 6
+	stp	x11, x10, [x29, 96]
+	ldr	x1, [x11, 1128]
+	ldr	w0, [x1, 552]
 	add	w0, w0, 1
-	str	w0, [x1,552]
-	ldr	x7, [x10,-8]
-	ldrb	w1, [x10,-31]
-	ldr	w0, [x7,12]
-	str	w0, [sp]
+	str	w0, [x1, 552]
+	ldr	x0, [x10, 24]
+	ldrb	w1, [x10, 1]
+	ldr	w2, [x0, 12]
+	str	w2, [sp]
+	mov	w2, w9
+	ldp	w3, w4, [x10, 36]
+	ldp	w5, w6, [x0]
+	ldr	w7, [x0, 8]
 	adrp	x0, .LC263
 	add	x0, x0, :lo12:.LC263
-	ldr	w3, [x10,4]
-	ldr	w4, [x10,8]
-	ldr	w5, [x7]
-	ldr	w6, [x7,4]
-	ldr	w7, [x7,8]
-	str	x10, [x29,120]
 	bl	printk
-	add	x3, x24, :lo12:.LANCHOR3
-	ldrb	w2, [x27,1257]
-	mov	w1, 24
-	ldr	x10, [x29,120]
-	sub	w2, w1, w2
-	mov	w1, 1
-	ldrh	w0, [x3,1312]
-	sub	w2, w2, w0
-	lsl	w2, w1, w2
-	ldr	w1, [x10,8]
-	sub	w2, w2, #1
-	lsr	w0, w1, w0
-	ldrb	w1, [x3,1314]
-	and	w0, w2, w0
-	udiv	w0, w0, w1
+	ldp	x11, x10, [x29, 96]
+	add	x2, x21, :lo12:.LANCHOR3
+	mov	w0, 24
+	ldrb	w1, [x11, 1205]
+	ldrh	w3, [x2, 1304]
+	sub	w0, w0, w1
+	ldrb	w2, [x2, 1306]
+	sub	w1, w0, w3
+	mov	w0, 1
+	lsl	w0, w0, w1
+	ldr	w1, [x10, 40]
+	sub	w0, w0, #1
+	lsr	w1, w1, w3
+	and	w0, w0, w1
 	mov	x1, 0
+	udiv	w0, w0, w2
 	bl	ftl_sblk_dump
-	ldr	x11, [x29,112]
-	cbnz	w11, .L3611
-.L3631:
-	add	x0, x27, 1312
-	add	x0, x0, x28, lsl 6
-	ldr	x1, [x0,24]
-	ldr	w0, [x0,36]
-	ldr	w1, [x1,4]
+	ldr	w9, [x29, 128]
+.L3576:
+	add	x0, x19, :lo12:.LANCHOR0
+	add	x0, x0, 1304
+	add	x0, x0, x27, lsl 6
+	ldr	x1, [x0, 24]
+	ldr	w0, [x0, 36]
+	ldr	w1, [x1, 4]
 	cmp	w1, w0
-	beq	.L3596
-.L3611:
-	ldr	x1, [x29,128]
-	mov	w2, 1319
-	ldr	x0, [x29,136]
+	bne	.L3577
+	cmn	w9, #1
+	bne	.L3578
+.L3577:
+	ldp	x1, x0, [x29, 112]
+	mov	w2, 1320
 	bl	printk
 	bl	dump_stack
-.L3596:
-	add	x0, x27, 1312
-	ldrb	w3, [x27,3360]
-	add	x0, x0, x28, lsl 6
-	ldrb	w2, [x0,56]
-	cmp	w3, w2
-	bls	.L3598
-	ldrb	w3, [x0,57]
+.L3578:
+	add	x0, x19, :lo12:.LANCHOR0
+	add	x0, x0, 1304
+	add	x8, x0, x27, lsl 6
+	add	x0, x21, :lo12:.LANCHOR3
+	ldrb	w2, [x8, 56]
+	ldrb	w0, [x0, 1946]
+	cmp	w0, w2
+	bls	.L3579
+	ldr	x0, [x8, 8]
 	lsl	w2, w2, 9
-	ldr	x1, [x0,8]
-	ldr	x0, [x0,16]
-	add	x1, x1, x3, lsl 9
+	ldrb	w1, [x8, 57]
+	add	x1, x0, x1, lsl 9
+	ldr	x0, [x8, 16]
 	bl	ftl_memcpy
-	b	.L3599
-.L3598:
-	ldrb	w1, [x0,2]
-	and	w1, w1, -9
-	strb	w1, [x0,2]
-.L3599:
-	mov	x1, x26
-	add	x0, x27, 3364
+.L3580:
+	mov	x1, x28
+	add	x0, x19, :lo12:.LANCHOR0
+	add	x0, x0, 3355
 	bl	buf_remove_buf
-	mov	x0, x26
+	mov	x0, x28
 	bl	zbuf_free
-	add	x1, x24, :lo12:.LANCHOR3
-	ldrb	w0, [x1,1963]
+	add	x1, x21, :lo12:.LANCHOR3
+	ldrb	w0, [x1, 1957]
 	sub	w0, w0, #1
-	strb	w0, [x1,1963]
-	b	.L3587
-.L3646:
-	mov	w2, -1
-	strb	w1, [x0,1963]
-	strb	w2, [x0,1962]
-	b	.L3572
-.L3645:
-	bl	timer_get_time
-	adrp	x1, .LANCHOR5+1004
-	ldr	w3, [x29,148]
-	str	w0, [x1,#:lo12:.LANCHOR5+1004]
+	strb	w0, [x1, 1957]
+	b	.L3568
+.L3570:
+	cmp	w9, 256
+	bne	.L3571
+	ldrb	w5, [x4, 1205]
+	mov	w4, 24
+	ldrh	w1, [x0, 1304]
+	sub	w4, w4, w5
+	ldr	w3, [x2, 40]
+	sub	w4, w4, w1
+	mov	w5, 1
+	ldrb	w0, [x0, 1306]
+	lsl	w4, w5, w4
+	sub	w4, w4, #1
+	lsr	w1, w3, w1
+	and	w4, w4, w1
+	ldr	w2, [x2, 36]
+	str	w9, [x29, 96]
+	udiv	w4, w4, w0
+	str	w5, [x29, 104]
+	adrp	x0, .LC262
+	add	x0, x0, :lo12:.LC262
+	and	w1, w4, 65535
+	str	w4, [x29, 128]
+	bl	printk
+	ldr	w5, [x29, 104]
+	mov	w2, 0
+	ldr	w4, [x29, 128]
+	mov	w1, w5
+	mov	w0, w4
+	bl	gc_add_sblk
+	ldr	w9, [x29, 96]
 	b	.L3571
-.L3603:
-	mov	w3, -1
-.L3571:
-	sub	sp, x29, #16
-	mov	w0, w3
-	ldp	x19, x20, [sp,32]
-	ldp	x21, x22, [sp,48]
-	ldp	x23, x24, [sp,64]
-	ldp	x25, x26, [sp,80]
-	ldp	x27, x28, [sp,96]
-	ldp	x29, x30, [sp,16]
-	add	sp, sp, 192
-	ret
+.L3579:
+	ldrb	w0, [x8, 2]
+	and	w0, w0, -9
+	strb	w0, [x8, 2]
+	b	.L3580
+.L3585:
+	mov	w0, -1
+	b	.L3549
 	.size	zftl_read, .-zftl_read
 	.align	2
 	.global	zftl_vendor_read
 	.type	zftl_vendor_read, %function
 zftl_vendor_read:
 	stp	x29, x30, [sp, -16]!
-	mov	w4, w1
 	mov	x3, x2
-	add	x29, sp, 0
+	mov	w2, w1
 	add	w1, w0, 512
-	mov	w2, w4
+	add	x29, sp, 0
 	mov	w0, 2
 	bl	zftl_read
 	ldp	x29, x30, [sp], 16
@@ -23353,12 +23178,10 @@ zftl_vendor_read:
 	.type	zftl_sys_read, %function
 zftl_sys_read:
 	stp	x29, x30, [sp, -16]!
-	mov	w5, w0
-	mov	w4, w1
-	add	x29, sp, 0
 	mov	x3, x2
-	mov	w1, w5
-	mov	w2, w4
+	mov	w2, w1
+	mov	w1, w0
+	add	x29, sp, 0
 	mov	w0, 2
 	bl	zftl_read
 	ldp	x29, x30, [sp], 16
@@ -23369,354 +23192,357 @@ zftl_sys_read:
 zftl_debug_proc_write:
 	sub	sp, sp, #224
 	cmp	x2, 79
-	mov	x0, -22
-	stp	x29, x30, [sp,32]
+	stp	x29, x30, [sp, 32]
 	add	x29, sp, 32
-	stp	x19, x20, [sp,48]
-	stp	x21, x22, [sp,64]
+	stp	x19, x20, [sp, 48]
 	add	x19, x29, 112
-	str	x19, [x29,104]
-	stp	x23, x24, [sp,80]
-	stp	x25, x26, [sp,96]
+	stp	x21, x22, [sp, 64]
+	stp	x23, x24, [sp, 80]
+	stp	x25, x26, [sp, 96]
+	stp	x27, x28, [sp, 112]
+	str	x19, [x29, 104]
+	bhi	.L3623
 	mov	x21, x2
-	bhi	.L3650
 	mov	x0, x19
 	bl	rk_copy_from_user
-	mov	x22, x0
-	mov	x0, -14
-	cbnz	x22, .L3650
-	adrp	x0, .LC264
+	mov	x1, -14
+	cbnz	x0, .L3605
 	mov	x1, x19
+	strb	wzr, [x19, x21]
+	adrp	x0, .LC264
 	add	x0, x0, :lo12:.LC264
-	strb	w22, [x19,x21]
 	bl	printk
-	adrp	x0, .LC265
 	mov	x1, x19
+	adrp	x0, .LC265
 	add	x0, x0, :lo12:.LC265
-	mov	w2, 1
 	mov	w3, 16
+	mov	w2, 1
 	bl	rknand_print_hex
 	bl	rknand_device_lock
+	mov	x2, 7
 	adrp	x1, .LC266
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC266
-	mov	x2, 7
 	bl	memcmp
-	cbnz	w0, .L3651
-	adrp	x23, .LANCHOR0
+	mov	w22, w0
+	cbnz	w0, .L3607
+	adrp	x19, .LANCHOR0
+	add	x19, x19, :lo12:.LANCHOR0
+	adrp	x20, .LANCHOR5
+	add	x20, x20, :lo12:.LANCHOR5
+	mov	w2, 4
 	adrp	x0, .LC267
-	add	x19, x23, :lo12:.LANCHOR0
+	ldr	x1, [x19, 3384]
 	add	x0, x0, :lo12:.LC267
-	mov	w2, 4
-	adrp	x20, .LANCHOR5
-	ldr	x3, [x19,3392]
-	add	x1, x3, 704
-	ldrh	w3, [x3,698]
+	mov	w23, 65535
+	add	x1, x1, 704
+	ldrh	w3, [x1, -6]
 	bl	rknand_print_hex
-	add	x3, x20, :lo12:.LANCHOR5
-	ldr	x1, [x19,3392]
+	ldrh	w3, [x20, 220]
 	adrp	x0, .LC268
+	ldr	x1, [x19, 3384]
 	mov	w2, 2
 	add	x0, x0, :lo12:.LC268
 	add	x1, x1, 416
-	ldrh	w3, [x3,264]
-	mov	w19, w22
-	mov	w22, 65535
 	bl	rknand_print_hex
-.L3652:
-	add	x0, x20, :lo12:.LANCHOR5
-	ldrh	w0, [x0,264]
-	cmp	w19, w0
-	bge	.L3655
+.L3608:
+	ldrh	w0, [x20, 220]
+	cmp	w22, w0
+	blt	.L3610
+.L3611:
+	bl	rknand_device_unlock
+	mov	x1, x21
+.L3605:
+	ldp	x19, x20, [sp, 48]
+	mov	x0, x1
+	ldp	x21, x22, [sp, 64]
+	ldp	x23, x24, [sp, 80]
+	ldp	x25, x26, [sp, 96]
+	ldp	x27, x28, [sp, 112]
+	ldp	x29, x30, [sp, 32]
+	add	sp, sp, 224
+	ret
+.L3610:
 	mov	w0, 300
 	bl	msleep
-	add	x0, x23, :lo12:.LANCHOR0
-	ldr	x0, [x0,3392]
-	add	x0, x0, w19, sxtw 1
-	ldrh	w0, [x0,416]
-	cmp	w0, w22
-	beq	.L3653
+	ldr	x0, [x19, 3384]
+	add	x0, x0, w22, sxtw 1
+	ldrh	w0, [x0, 416]
+	cmp	w0, w23
+	beq	.L3609
 	mov	x1, 0
 	bl	ftl_sblk_dump
-.L3653:
-	add	w19, w19, 1
-	b	.L3652
-.L3651:
+.L3609:
+	add	w22, w22, 1
+	b	.L3608
+.L3607:
 	adrp	x1, .LC269
-	mov	x0, x19
-	add	x1, x1, :lo12:.LC269
 	mov	x2, 7
+	add	x1, x1, :lo12:.LC269
+	mov	x0, x19
 	bl	memcmp
-	cbnz	w0, .L3656
+	cbnz	w0, .L3612
 	adrp	x22, .LANCHOR0
-	adrp	x0, .LC267
 	add	x20, x22, :lo12:.LANCHOR0
-	add	x0, x0, :lo12:.LC267
 	mov	w2, 4
-	adrp	x26, .LC272
-	add	x26, x26, :lo12:.LC272
-	ldr	x3, [x20,3392]
-	add	x1, x3, 704
-	ldrh	w3, [x3,698]
+	adrp	x0, .LC267
+	add	x0, x0, :lo12:.LC267
+	adrp	x25, .LC271
+	ldr	x1, [x20, 3384]
+	adrp	x24, .LC272
+	add	x25, x25, :lo12:.LC271
+	add	x24, x24, :lo12:.LC272
+	add	x1, x1, 704
+	ldrh	w3, [x1, -6]
 	bl	rknand_print_hex
-	adrp	x3, .LANCHOR5+264
-	ldr	x1, [x20,3392]
-	adrp	x0, .LC268
+	adrp	x0, .LANCHOR5+220
+	ldr	x1, [x20, 3384]
 	mov	w2, 2
+	add	x20, x29, 192
+	ldrh	w3, [x0, #:lo12:.LANCHOR5+220]
 	add	x1, x1, 416
+	adrp	x0, .LC268
 	add	x0, x0, :lo12:.LC268
-	ldrh	w3, [x3,#:lo12:.LANCHOR5+264]
-	add	x20, x29, 192
 	bl	rknand_print_hex
 	mov	w0, 50
 	bl	msleep
-	adrp	x0, .LC270
 	add	x1, x19, 7
+	adrp	x0, .LC270
+	str	x1, [x20, -88]!
 	add	x0, x0, :lo12:.LC270
-	str	x1, [x20,-88]!
-	mov	x19, x22
-	adrp	x22, .LC271
 	bl	printk
-	add	x22, x22, :lo12:.LC271
-	ldr	x0, [x29,104]
+	ldr	x0, [x29, 104]
 	mov	x1, x20
-	bl	rk_simple_strtoull.constprop.34
-	mov	w24, w0
-	adrp	x2, .LANCHOR3
-	str	w0, [x29,100]
-	add	x2, x2, :lo12:.LANCHOR3
-	uxth	w25, w0
-	add	x20, x2, 1968
-	add	x23, x2, 2480
-.L3658:
-	ldrh	w1, [x20]
-	mov	x0, x22
-	ldrh	w2, [x20,2]
+	adrp	x20, .LANCHOR3
+	bl	rk_simple_strtoull.constprop.33
+	mov	w23, w0
+	add	x1, x20, :lo12:.LANCHOR3
+	and	w27, w0, 65535
+	add	x19, x1, 1960
+	add	x26, x1, 2472
+	mov	x28, x1
+	str	w0, [x29, 100]
+.L3614:
+	ldrh	w2, [x19, 2]
+	mov	x0, x25
+	ldrh	w1, [x19]
 	bl	printk
-	ldrh	w0, [x20]
-	cmp	w0, w25
-	bne	.L3657
-	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x1, [x20,8]
+	ldrh	w0, [x19]
+	cmp	w0, w27
+	bne	.L3613
+	ldrb	w3, [x28, 1946]
 	mov	w2, 4
-	ldrb	w3, [x0,3360]
-	mov	x0, x26
+	ldr	x1, [x19, 8]
+	mov	x0, x24
 	lsl	w3, w3, 7
 	bl	rknand_print_hex
 	mov	w0, 50
 	bl	msleep
-.L3657:
-	add	x20, x20, 16
-	cmp	x20, x23
-	bne	.L3658
+.L3613:
+	add	x19, x19, 16
+	cmp	x19, x26
+	bne	.L3614
+	add	x22, x22, :lo12:.LANCHOR0
 	mov	w0, 300
-	add	x19, x19, :lo12:.LANCHOR0
 	bl	msleep
+	add	x20, x20, :lo12:.LANCHOR3
 	mov	w0, 1
 	bl	buf_alloc
-	mov	x20, x0
-	ldr	x1, [x19,3392]
-	add	x1, x1, w24, uxth 2
-	ldr	w1, [x1,704]
-	str	w1, [x29,100]
-	str	w1, [x0,40]
+	ldr	x1, [x22, 3384]
+	mov	x19, x0
+	add	x1, x1, w23, uxth 2
+	ldr	w1, [x1, 704]
+	str	w1, [x0, 40]
+	str	w1, [x29, 100]
 	mov	w1, 1
 	bl	sblk_read_page
-	ldr	x7, [x20,24]
-	ldr	x6, [x20,8]
-	ldr	w1, [x29,100]
-	ldr	w0, [x7,4]
-	str	w0, [sp]
-	ldr	w0, [x7,8]
-	str	w0, [sp,8]
-	ldr	w0, [x7,12]
-	str	w0, [sp,16]
+	ldr	x1, [x19, 24]
+	ldr	x0, [x19, 8]
+	ldr	w2, [x1, 12]
+	str	w2, [sp, 16]
+	ldr	w2, [x1, 8]
+	str	w2, [sp, 8]
+	ldr	w2, [x1, 4]
+	str	w2, [sp]
+	ldp	w3, w4, [x0]
+	ldp	w5, w6, [x0, 8]
 	adrp	x0, .LC245
+	ldr	w7, [x1]
 	add	x0, x0, :lo12:.LC245
-	ldr	w3, [x6]
-	ldr	w4, [x6,4]
-	ldr	w5, [x6,8]
-	ldr	w2, [x20,52]
-	ldr	w6, [x6,12]
-	ldr	w7, [x7]
-	bl	printk
-	ldrb	w3, [x19,3360]
+	ldr	w2, [x19, 52]
+	ldr	w1, [x29, 100]
+	bl	printk
+	ldrb	w3, [x20, 1946]
 	adrp	x0, .LC273
-	ldr	x1, [x20,8]
+	ldr	x1, [x19, 8]
 	add	x0, x0, :lo12:.LC273
 	mov	w2, 4
 	lsl	w3, w3, 7
+.L3630:
 	bl	rknand_print_hex
-	mov	x0, x20
-	b	.L3673
-.L3656:
-	adrp	x1, .LC274
 	mov	x0, x19
-	add	x1, x1, :lo12:.LC274
+	bl	zbuf_free
+	b	.L3611
+.L3612:
+	adrp	x1, .LC274
 	mov	x2, 7
+	add	x1, x1, :lo12:.LC274
+	mov	x0, x19
 	bl	memcmp
-	cbnz	w0, .L3659
+	cbnz	w0, .L3615
 	bl	dump_ftl_info
-	b	.L3655
-.L3659:
+	b	.L3611
+.L3615:
 	adrp	x1, .LC275
-	mov	x0, x19
-	add	x1, x1, :lo12:.LC275
 	mov	x2, 9
+	add	x1, x1, :lo12:.LC275
+	mov	x0, x19
 	bl	memcmp
-	cbnz	w0, .L3660
+	cbnz	w0, .L3616
 	add	x1, x29, 192
 	add	x0, x19, 9
-	str	x0, [x1,-88]!
-	bl	rk_simple_strtoull.constprop.34
-	str	w0, [x29,100]
-	adrp	x1, .LANCHOR3+1416
-	strh	w0, [x1,#:lo12:.LANCHOR3+1416]
+	str	x0, [x1, -88]!
+	bl	rk_simple_strtoull.constprop.33
+	str	w0, [x29, 100]
+	adrp	x1, .LANCHOR3+1408
+	strh	w0, [x1, #:lo12:.LANCHOR3+1408]
 	bl	dump_all_list_info
-	b	.L3655
-.L3660:
+	b	.L3611
+.L3616:
 	adrp	x1, .LC276
-	mov	x0, x19
-	add	x1, x1, :lo12:.LC276
 	mov	x2, 8
+	add	x1, x1, :lo12:.LC276
+	mov	x0, x19
 	bl	memcmp
-	cbz	w0, .L3655
+	cbz	w0, .L3611
 	adrp	x1, .LC277
-	mov	x0, x19
-	add	x1, x1, :lo12:.LC277
 	mov	x2, 8
+	add	x1, x1, :lo12:.LC277
+	mov	x0, x19
 	bl	memcmp
-	cbnz	w0, .L3662
+	cbnz	w0, .L3618
 	add	x20, x29, 192
-	adrp	x0, .LC270
 	add	x1, x19, 8
+	adrp	x0, .LC270
 	add	x0, x0, :lo12:.LC270
-	str	x1, [x20,-88]!
+	str	x1, [x20, -88]!
 	bl	printk
-	ldr	x0, [x29,104]
+	ldr	x0, [x29, 104]
 	mov	x1, x20
-	adrp	x20, .LANCHOR0
-	add	x20, x20, :lo12:.LANCHOR0
-	bl	rk_simple_strtoull.constprop.34
-	str	w0, [x29,100]
+	adrp	x20, .LANCHOR3
+	add	x20, x20, :lo12:.LANCHOR3
+	bl	rk_simple_strtoull.constprop.33
+	str	w0, [x29, 100]
 	mov	w0, 1
 	bl	buf_alloc
+	ldr	w1, [x29, 100]
 	mov	x19, x0
-	ldr	w1, [x29,100]
-	str	w1, [x0,40]
+	str	w1, [x0, 40]
 	mov	w1, 1
 	bl	sblk_read_page
-	ldr	x7, [x19,24]
-	ldr	x6, [x19,8]
-	ldr	w1, [x29,100]
-	ldr	w0, [x7,4]
-	str	w0, [sp]
-	ldr	w0, [x7,8]
-	str	w0, [sp,8]
-	ldr	w0, [x7,12]
-	str	w0, [sp,16]
+	ldr	x1, [x19, 24]
+	ldr	x0, [x19, 8]
+	ldr	w2, [x1, 12]
+	str	w2, [sp, 16]
+	ldr	w2, [x1, 8]
+	str	w2, [sp, 8]
+	ldr	w2, [x1, 4]
+	str	w2, [sp]
+	ldp	w3, w4, [x0]
+	ldp	w5, w6, [x0, 8]
 	adrp	x0, .LC245
+	ldr	w7, [x1]
 	add	x0, x0, :lo12:.LC245
-	ldr	w4, [x6,4]
-	ldr	w5, [x6,8]
-	ldr	w3, [x6]
-	ldr	w7, [x7]
-	ldr	w6, [x6,12]
-	ldr	w2, [x19,52]
-	bl	printk
-	ldrb	w3, [x20,3360]
+	ldr	w2, [x19, 52]
+	ldr	w1, [x29, 100]
+	bl	printk
+	ldr	x1, [x19, 8]
+	mov	w2, 4
+	ldrb	w3, [x20, 1946]
 	adrp	x0, .LC218
-	ldr	x1, [x19,8]
 	add	x0, x0, :lo12:.LC218
-	mov	w2, 4
 	lsl	w3, w3, 7
 	bl	rknand_print_hex
-	ldrb	w3, [x20,3360]
+	ldrb	w3, [x20, 1946]
 	adrp	x0, .LC240
-	ldr	x1, [x19,24]
-	add	x0, x0, :lo12:.LC240
 	mov	w2, 4
+	add	x0, x0, :lo12:.LC240
+	ldr	x1, [x19, 24]
 	lsl	w3, w3, 1
-	bl	rknand_print_hex
-	mov	x0, x19
-.L3673:
-	bl	zbuf_free
-	b	.L3655
-.L3662:
+	b	.L3630
+.L3618:
 	adrp	x1, .LC278
-	mov	x0, x19
-	add	x1, x1, :lo12:.LC278
 	mov	x2, 8
+	add	x1, x1, :lo12:.LC278
+	mov	x0, x19
 	bl	memcmp
-	cbnz	w0, .L3663
+	cbnz	w0, .L3619
 	add	x20, x29, 192
-	adrp	x0, .LC270
 	add	x1, x19, 8
+	adrp	x0, .LC270
 	add	x0, x0, :lo12:.LC270
-	str	x1, [x20,-88]!
+	str	x1, [x20, -88]!
 	bl	printk
-	ldr	x0, [x29,104]
+	ldr	x0, [x29, 104]
 	mov	x1, x20
-	bl	rk_simple_strtoull.constprop.34
-	str	w0, [x29,100]
-	mov	x1, x22
+	bl	rk_simple_strtoull.constprop.33
+	str	w0, [x29, 100]
+	mov	x1, 0
 	bl	ftl_sblk_dump
-	b	.L3655
-.L3663:
+	b	.L3611
+.L3619:
 	adrp	x1, .LC279
-	mov	x0, x19
-	add	x1, x1, :lo12:.LC279
 	mov	x2, 10
+	add	x1, x1, :lo12:.LC279
+	mov	x0, x19
 	bl	memcmp
-	cbnz	w0, .L3664
+	cbnz	w0, .L3620
 	add	x20, x29, 192
-	adrp	x0, .LC270
 	add	x1, x19, 10
+	adrp	x0, .LC270
 	add	x0, x0, :lo12:.LC270
-	str	x1, [x20,-88]!
+	str	x1, [x20, -88]!
 	bl	printk
-	ldr	x0, [x29,104]
+	ldr	x0, [x29, 104]
 	mov	x1, x20
-	bl	rk_simple_strtoull.constprop.34
-	str	w0, [x29,100]
+	bl	rk_simple_strtoull.constprop.33
+	str	w0, [x29, 100]
 	adrp	x1, .LANCHOR2
-	str	w0, [x1,#:lo12:.LANCHOR2]
-	b	.L3655
-.L3664:
+	str	w0, [x1, #:lo12:.LANCHOR2]
+	b	.L3611
+.L3620:
 	adrp	x1, .LC280
 	mov	x2, 8
-	mov	x0, x19
 	add	x1, x1, :lo12:.LC280
+	mov	x0, x19
 	bl	memcmp
-	mov	w2, w0
-	str	x2, [x29,88]
-	cbnz	w0, .L3665
+	cbnz	w0, .L3621
 	add	x1, x19, 8
-	adrp	x0, .LC270
 	add	x19, x29, 192
+	adrp	x0, .LC270
 	add	x0, x0, :lo12:.LC270
-	str	x1, [x19,-88]!
+	str	x1, [x19, -88]!
 	bl	printk
-	ldr	x0, [x29,104]
+	ldr	x0, [x29, 104]
 	mov	x1, x19
-	bl	rk_simple_strtoull.constprop.34
+	bl	rk_simple_strtoull.constprop.33
 	mov	w19, w0
 	bl	lpa_hash_get_ppa
-	str	w0, [x29,100]
+	str	w0, [x29, 100]
 	cmn	w0, #1
-	ldr	x2, [x29,88]
-	bne	.L3666
-	mov	w0, w19
+	bne	.L3622
+	mov	w2, 0
 	add	x1, x29, 100
+	mov	w0, w19
 	bl	pm_log2phys
-.L3666:
-	adrp	x0, .LC281
-	ldr	w2, [x29,100]
+.L3622:
+	ldr	w2, [x29, 100]
 	mov	w1, w19
+	adrp	x0, .LC281
 	add	x0, x0, :lo12:.LC281
 	bl	printk
-	b	.L3655
-.L3665:
+	b	.L3611
+.L3621:
 	adrp	x0, .LC282
 	add	x0, x0, :lo12:.LC282
 	bl	printk
@@ -23744,157 +23570,146 @@ zftl_debug_proc_write:
 	adrp	x0, .LC290
 	add	x0, x0, :lo12:.LC290
 	bl	printk
-.L3655:
-	bl	rknand_device_unlock
-	mov	x0, x21
-.L3650:
-	sub	sp, x29, #32
-	ldp	x19, x20, [sp,48]
-	ldp	x21, x22, [sp,64]
-	ldp	x23, x24, [sp,80]
-	ldp	x25, x26, [sp,96]
-	ldp	x29, x30, [sp,32]
-	add	sp, sp, 224
-	ret
+	b	.L3611
+.L3623:
+	mov	x1, -22
+	b	.L3605
 	.size	zftl_debug_proc_write, .-zftl_debug_proc_write
 	.align	2
 	.global	ftl_update_l2p_map
 	.type	ftl_update_l2p_map, %function
 ftl_update_l2p_map:
-	stp	x29, x30, [sp, -144]!
+	stp	x29, x30, [sp, -128]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	mov	x22, x0
-	adrp	x0, .LANCHOR3
-	add	x1, x0, :lo12:.LANCHOR3
-	str	x0, [x29,120]
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	ldrb	w2, [x22,9]
-	ldrh	w23, [x1,1384]
-	ldrh	w19, [x22,12]
-	ldr	x1, [x1,1936]
-	mul	w23, w23, w2
-	add	x19, x1, x19, lsl 2
-	add	x1, x19, w23, sxtw 2
-	ldr	w1, [x1,-4]
-	cmn	w1, #1
-	beq	.L3675
+	stp	x25, x26, [sp, 64]
+	adrp	x26, .LANCHOR3
+	add	x0, x26, :lo12:.LANCHOR3
+	stp	x19, x20, [sp, 16]
+	stp	x23, x24, [sp, 48]
+	stp	x27, x28, [sp, 80]
+	ldrh	w23, [x0, 1376]
+	ldrb	w1, [x22, 9]
+	ldr	x0, [x0, 1928]
+	ldrh	w19, [x22, 12]
+	mul	w23, w23, w1
+	add	x19, x0, x19, lsl 2
+	add	x0, x19, w23, sxtw 2
+	ldr	w0, [x0, -4]
+	cmn	w0, #1
+	beq	.L3632
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 976
 	mov	w2, 1998
-	add	x1, x1, 960
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L3675:
-	adrp	x0, .LC292
-	mov	x28, 0
-	add	x0, x0, :lo12:.LC292
-	adrp	x27, .LC291
-	str	x0, [x29,112]
-	adrp	x0, .LC293
-	add	x0, x0, :lo12:.LC293
-	mov	w21, w28
-	str	x0, [x29,104]
-	add	x27, x27, :lo12:.LC291
-.L3676:
-	cmp	w28, w23
-	mov	w24, w28
-	bge	.L3703
-	ldr	w2, [x19,x28,lsl 2]
+.L3632:
+	adrp	x27, .LC292
+	mov	w21, 0
+	add	x0, x27, :lo12:.LC292
+	mov	w25, 0
+	str	x0, [x29, 104]
+.L3633:
+	cmp	w25, w23
+	bne	.L3639
+	adrp	x0, .LANCHOR2
+	adrp	x19, .LANCHOR0
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L3640
+	add	x0, x19, :lo12:.LANCHOR0
+	ldrh	w1, [x22]
+	ldr	x0, [x0, 1120]
+	ubfiz	x2, x1, 1, 16
+	ldrh	w3, [x0, x2]
+	adrp	x0, .LC294
+	mov	w2, w21
+	add	x0, x0, :lo12:.LC294
+	bl	printk
+.L3640:
+	add	x19, x19, :lo12:.LANCHOR0
+	ldrh	w1, [x22]
+	ldr	x0, [x19, 1120]
+	strh	w21, [x0, x1, lsl 1]
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 128
+	ret
+.L3639:
+	ldr	w2, [x19]
 	cmn	w2, #1
-	beq	.L3677
-	adrp	x25, .LANCHOR0
-	add	x0, x25, :lo12:.LANCHOR0
-	ldrb	w20, [x0,3360]
+	beq	.L3634
+	add	x0, x26, :lo12:.LANCHOR3
+	ldrb	w20, [x0, 1946]
 	adrp	x0, .LANCHOR2
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
 	lsl	w20, w20, 7
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
 	udiv	w20, w2, w20
 	and	w20, w20, 65535
-	tbz	x0, 12, .L3681
-	mov	x0, x27
+	tbz	x0, 12, .L3635
+	adrp	x0, .LC291
+	mov	w3, w25
 	mov	w1, w20
-	mov	w3, w28
-	bl	printk
-.L3681:
-	sbfiz	x26, x24, 2, 32
-	ldr	w0, [x19,x26]
+	add	x0, x0, :lo12:.LC291
+	bl	printk
+.L3635:
+	adrp	x28, .LC293
+	mov	x24, x19
+	mov	w27, w25
+	add	x28, x28, :lo12:.LC293
+.L3638:
+	ldr	w0, [x24]
 	cmn	w0, #1
-	beq	.L3679
-	add	x1, x25, :lo12:.LANCHOR0
-	ldrb	w1, [x1,3360]
+	beq	.L3636
+	add	x5, x26, :lo12:.LANCHOR3
+	ldrb	w1, [x5, 1946]
 	lsl	w1, w1, 7
 	udiv	w0, w0, w1
 	cmp	w20, w0, uxth
-	bne	.L3679
-	ldrb	w0, [x22,9]
-	ldr	x2, [x29,120]
-	add	x3, x2, :lo12:.LANCHOR3
-	str	x3, [x29,96]
-	sdiv	w1, w24, w0
-	ldrh	w2, [x3,1418]
-	msub	w0, w1, w0, w24
+	bne	.L3636
+	ldrb	w0, [x22, 9]
+	str	x5, [x29, 96]
+	sdiv	w1, w27, w0
+	msub	w0, w1, w0, w27
 	add	x0, x22, w0, sxtw 1
-	ldrh	w0, [x0,16]
-	madd	w2, w0, w2, w1
-	str	w2, [x29,140]
-	ldr	x0, [x29,112]
-	ldr	w1, [x19,x26]
+	ldrh	w2, [x0, 16]
+	ldrh	w0, [x5, 1410]
+	madd	w2, w2, w0, w1
+	ldr	x0, [x29, 104]
+	str	w2, [x29, 124]
+	ldr	w1, [x24]
 	bl	pm_ppa_update_check
-	ldr	x3, [x29,96]
-	cbz	w0, .L3680
-	ldr	x1, [x3,1936]
-	mov	w2, 4
-	ldr	x0, [x29,104]
+	ldr	x5, [x29, 96]
+	cbz	w0, .L3637
+	ldr	x1, [x5, 1928]
 	mov	w3, w23
+	mov	w2, 4
+	mov	x0, x28
 	bl	rknand_print_hex
-.L3680:
-	ldr	w0, [x19,x26]
-	add	x1, x29, 140
-	mov	w2, 1
+.L3637:
+	ldr	w0, [x24]
 	add	w21, w21, 1
+	mov	w2, 1
+	add	x1, x29, 124
+	and	w21, w21, 65535
 	bl	pm_log2phys
-	uxth	w21, w21
 	mov	w0, -1
-	str	w0, [x19,x26]
-.L3679:
-	add	w24, w24, 1
-	cmp	w24, w23
-	bne	.L3681
-.L3677:
-	add	x28, x28, 1
-	b	.L3676
-.L3703:
-	adrp	x0, .LANCHOR2
-	adrp	x19, .LANCHOR0
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L3683
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrh	w1, [x22]
-	mov	w2, w21
-	ubfiz	x3, x1, 1, 16
-	ldr	x4, [x0,1112]
-	adrp	x0, .LC294
-	add	x0, x0, :lo12:.LC294
-	ldrh	w3, [x4,x3]
-	bl	printk
-.L3683:
-	add	x19, x19, :lo12:.LANCHOR0
-	ldrh	w1, [x22]
-	ldr	x0, [x19,1112]
-	strh	w21, [x0,x1,lsl 1]
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 144
-	ret
+	str	w0, [x24]
+.L3636:
+	add	w27, w27, 1
+	add	x24, x24, 4
+	cmp	w23, w27
+	bne	.L3638
+.L3634:
+	add	w25, w25, 1
+	add	x19, x19, 4
+	b	.L3633
 	.size	ftl_update_l2p_map, .-ftl_update_l2p_map
 	.align	2
 	.global	ftl_alloc_new_data_sblk
@@ -23902,54 +23717,53 @@ ftl_update_l2p_map:
 ftl_alloc_new_data_sblk:
 	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	str	x21, [sp,32]
+	stp	x19, x20, [sp, 16]
 	mov	x20, x0
+	str	x21, [sp, 32]
 	ldrh	w21, [x0]
 	bl	ftl_update_l2p_map
 	bl	pm_flush
 	ldrh	w0, [x20]
 	mov	w1, 65535
 	cmp	w0, w1
-	beq	.L3705
+	beq	.L3662
 	bl	zftl_insert_data_list
-.L3705:
+.L3662:
 	adrp	x19, .LANCHOR0
-	mov	w2, 2
 	add	x19, x19, :lo12:.LANCHOR0
-	mov	w1, 3
-	ldr	x0, [x19,1120]
+	ldr	x0, [x19, 1128]
 	add	x0, x0, 16
 	cmp	x20, x0
 	mov	x0, x20
-	csel	w1, w2, w1, eq
+	cset	w1, ne
+	add	w1, w1, 2
 	bl	ftl_open_sblk_init
-	ldr	x0, [x19,1120]
-	ldr	w0, [x0,560]
+	ldr	x0, [x19, 1128]
+	ldr	w0, [x0, 560]
 	cmp	w0, w21
-	bne	.L3707
+	bne	.L3664
 	mov	w20, 65535
 	cmp	w21, w20
-	beq	.L3707
-	adrp	x0, .LC295
+	beq	.L3664
 	mov	w1, w21
+	adrp	x0, .LC295
 	add	x0, x0, :lo12:.LC295
 	bl	printk
-	ldr	x0, [x19,1120]
-	ldr	w0, [x0,564]
+	ldr	x0, [x19, 1128]
+	ldr	w0, [x0, 564]
 	bl	gc_mark_bad_ppa
-	ldr	x0, [x19,1120]
+	ldr	x0, [x19, 1128]
 	mov	w1, -1
-	str	w20, [x0,560]
-	str	w1, [x0,564]
-.L3707:
+	str	w20, [x0, 560]
+	str	w1, [x0, 564]
+.L3664:
 	bl	ftl_ext_info_flush
 	mov	w0, 0
 	bl	ftl_info_flush
 	bl	lpa_rebuild_hash
-	ldr	x21, [sp,32]
+	ldr	x21, [sp, 32]
 	mov	w0, 0
-	ldp	x19, x20, [sp,16]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	ftl_alloc_new_data_sblk, .-ftl_alloc_new_data_sblk
@@ -23957,434 +23771,417 @@ ftl_alloc_new_data_sblk:
 	.global	ftl_write_commit
 	.type	ftl_write_commit, %function
 ftl_write_commit:
-	stp	x29, x30, [sp, -176]!
-	add	x29, sp, 0
-	stp	x25, x26, [sp,64]
-	adrp	x26, .LANCHOR0
-	add	x26, x26, :lo12:.LANCHOR0
-	add	x0, x26, 1312
-	str	x0, [x29,128]
-	adrp	x0, .LANCHOR5
-	add	x0, x0, :lo12:.LANCHOR5
-	str	x0, [x29,136]
-	stp	x19, x20, [sp,16]
-	add	x0, x0, 352
-	str	x0, [x29,120]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	stp	x27, x28, [sp,80]
-.L3716:
-	ldrb	w0, [x26,3388]
-	adrp	x20, .LANCHOR0
-	cbz	w0, .L3718
-	ldrb	w1, [x26,3416]
-	sub	w0, w0, #1
-	ldr	x2, [x29,128]
-	str	x1, [x29,144]
-	lsl	x1, x1, 6
-	add	x28, x2, x1
-	strb	w0, [x26,3388]
-	ldr	w0, [x26,3372]
-	ldrb	w1, [x2,x1]
-	strb	w1, [x26,3416]
-	ldr	w1, [x28,36]
+	stp	x29, x30, [sp, -144]!
+	adrp	x0, .LANCHOR0
+	add	x29, sp, 0
+	stp	x19, x20, [sp, 16]
+	add	x20, x0, :lo12:.LANCHOR0
+	stp	x27, x28, [sp, 80]
+	add	x28, x20, 1304
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+.L3668:
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	ldrb	w1, [x0, 3381]
+	cbz	w1, .L3670
+	ldrb	w3, [x0, 3408]
+	add	x2, x0, 1304
+	sub	w1, w1, #1
+	strb	w1, [x0, 3381]
+	ubfiz	x4, x3, 6, 8
+	add	x4, x2, x4
+	stp	x3, x4, [x29, 104]
+	lsl	x3, x3, 6
+	add	x4, x2, x3
+	ldrb	w2, [x2, x3]
+	strb	w2, [x0, 3408]
+	ldr	w1, [x4, 36]
+	ldr	w0, [x0, 3364]
 	cmp	w1, w0
-	bcc	.L3719
+	bcc	.L3672
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
-	mov	w2, 606
-	add	x1, x1, 984
+	add	x1, x1, 1000
+	mov	w2, 607
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L3719:
-	ldr	x0, [x29,144]
-	add	x1, x20, :lo12:.LANCHOR0
-	add	x3, x1, 1312
-	add	x0, x3, x0, lsl 6
-	ldr	w2, [x1,3372]
-	ldr	w23, [x0,36]
-	cmp	w23, w2
-	bcc	.L3720
-	mov	x0, x28
+.L3672:
+	ldr	x0, [x29, 104]
+	ldr	w1, [x20, 3364]
+	add	x0, x28, x0, lsl 6
+	ldr	w23, [x0, 36]
+	cmp	w23, w1
+	bcc	.L3673
+	ldr	x0, [x29, 112]
 	bl	zbuf_free
 	mov	w0, -1
-	b	.L3779
-.L3720:
-	ldr	x25, [x0,8]
-	ldr	x24, [x0,24]
-	ldrb	w22, [x0,57]
-	ldrb	w21, [x0,56]
-	ldrb	w0, [x1,3389]
-	cbz	w0, .L3722
-	ldr	x0, [x29,136]
-	ldrb	w19, [x0,352]
-	add	x19, x3, x19, lsl 6
-.L3723:
-	ldrb	w4, [x19]
-	cmp	w4, 255
-	beq	.L3781
-	sbfiz	x19, x4, 6, 32
-	add	x19, x3, x19
-	b	.L3723
-.L3781:
-	ldr	w0, [x19,36]
-	cmp	w0, w23
-	bne	.L3722
-	ldr	x0, [x19,8]
-	ubfiz	x1, x22, 9, 8
+.L3667:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 144
+	ret
+.L3673:
+	ldrb	w22, [x0, 57]
+	ldrb	w21, [x0, 56]
+	ldr	x27, [x0, 8]
+	ldr	x24, [x0, 24]
+	ldrb	w0, [x20, 3380]
+	cbz	w0, .L3675
+	adrp	x0, .LANCHOR5+360
+	ldrb	w19, [x0, #:lo12:.LANCHOR5+360]
+	add	x19, x28, x19, lsl 6
+.L3676:
+	ldrb	w0, [x19]
+	cmp	w0, 255
+	bne	.L3677
+	ldr	w0, [x19, 36]
+	cmp	w23, w0
+	bne	.L3675
+	ldr	x0, [x19, 8]
+	ubfiz	x22, x22, 9, 8
 	lsl	w2, w21, 9
-	add	x20, x20, :lo12:.LANCHOR0
-	add	x0, x0, x1
-	add	x1, x25, x1
+	add	x1, x27, x22
+	add	x0, x0, x22
 	bl	ftl_memcpy
-	ldrb	w2, [x20,3360]
-	mov	w0, 2
-	ldr	x1, [x19,24]
-	ldr	x3, [x19,8]
-	sub	w2, w2, #2
-	sbfiz	x2, x2, 9, 32
+	adrp	x0, .LANCHOR3+1946
+	ldr	x2, [x19, 8]
+	ldr	x1, [x19, 24]
+	ldrb	w0, [x0, #:lo12:.LANCHOR3+1946]
 	add	x1, x1, 16
-	add	x2, x3, x2
+	sub	w0, w0, #2
+	sbfiz	x0, x0, 9, 32
+	add	x2, x2, x0
+	mov	w0, 2
 	bl	ftl_debug_info_fill
-	mov	x0, x28
+	ldr	x0, [x29, 112]
 	bl	zbuf_free
-	b	.L3716
-.L3722:
+	b	.L3668
+.L3677:
+	ubfiz	x19, x0, 6, 8
+	add	x19, x28, x19
+	b	.L3676
+.L3675:
 	mov	w0, w23
 	bl	lpa_hash_get_ppa
-	str	w0, [x29,172]
+	str	w0, [x29, 140]
 	cmn	w0, #1
-	bne	.L3726
-	mov	w0, w23
-	add	x1, x29, 172
+	bne	.L3679
 	mov	w2, 0
+	add	x1, x29, 140
+	mov	w0, w23
 	bl	pm_log2phys
-.L3726:
-	add	x4, x20, :lo12:.LANCHOR0
-	ldr	w0, [x29,172]
-	add	x3, x4, 1312
-	mov	w1, 0
-	mov	x27, 0
-	ldr	x19, [x4,1120]
-	add	x4, x4, 3360
+.L3679:
+	ldr	x19, [x20, 1128]
+	add	x0, x20, 1306
+	ldr	w2, [x29, 140]
+	add	x4, x20, 3354
 	add	x19, x19, 16
-.L3728:
-	ldr	w2, [x3,36]
-	cmp	w2, w23
-	bne	.L3727
-	ldrb	w6, [x3,2]
-	tbz	x6, 3, .L3727
-	ldr	x27, [x3,8]
-	and	w6, w6, -9
-	ldr	w0, [x3,40]
-	mov	w1, 1
-	strb	w6, [x3,2]
-.L3727:
-	add	x3, x3, 64
-	cmp	x3, x4
-	bne	.L3728
-	cbz	w1, .L3729
-	str	w0, [x29,172]
-.L3729:
-	add	x3, x20, :lo12:.LANCHOR0
-	str	wzr, [x29,152]
-	ldrb	w0, [x3,3360]
+	mov	w3, 0
+	mov	x26, 0
+.L3681:
+	ldr	w1, [x0, 34]
+	cmp	w23, w1
+	bne	.L3680
+	ldrb	w1, [x0]
+	tbz	x1, 3, .L3680
+	ldr	w2, [x0, 38]
+	and	w1, w1, -9
+	ldr	x26, [x0, 6]
+	mov	w3, 1
+	strb	w1, [x0]
+.L3680:
+	add	x0, x0, 64
+	cmp	x0, x4
+	bne	.L3681
+	cbz	w3, .L3682
+	str	w2, [x29, 140]
+.L3682:
+	adrp	x25, .LANCHOR3
+	add	x0, x25, :lo12:.LANCHOR3
+	str	x25, [x29, 120]
+	ldrb	w0, [x0, 1946]
 	cmp	w21, w0
-	bcs	.L3730
+	bcs	.L3708
 	add	w21, w22, w21
-	cbz	x27, .L3731
-	cbz	w22, .L3732
-	mov	x0, x25
-	mov	x1, x27
+	cbz	x26, .L3684
+	cbz	w22, .L3685
 	lsl	w2, w22, 9
-	str	x3, [x29,152]
+	mov	x1, x26
+	mov	x0, x27
 	bl	ftl_memcpy
-	ldr	x3, [x29,152]
-	ldr	x19, [x3,1120]
+	ldr	x19, [x20, 1128]
 	add	x19, x19, 48
-.L3732:
-	add	x0, x20, :lo12:.LANCHOR0
-	ldrb	w2, [x0,3360]
+.L3685:
+	ldr	x0, [x29, 120]
+	add	x0, x0, :lo12:.LANCHOR3
+	ldrb	w2, [x0, 1946]
 	cmp	w21, w2
-	bcc	.L3733
-	ldr	x19, [x0,1120]
+	bcc	.L3686
+	ldr	x19, [x20, 1128]
 	add	x19, x19, 16
-	b	.L3780
-.L3733:
-	ubfiz	x1, x21, 9, 9
+.L3708:
+	mov	w26, 0
+	b	.L3683
+.L3686:
+	ubfiz	x0, x21, 9, 9
 	sub	w2, w2, w21
-	add	x0, x25, x1
+	add	x1, x26, x0
 	lsl	w2, w2, 9
-	add	x1, x27, x1
+	add	x0, x27, x0
 	bl	ftl_memcpy
-.L3780:
-	str	wzr, [x29,152]
-	b	.L3730
-.L3731:
-	ldr	w0, [x29,172]
+	b	.L3708
+.L3684:
+	ldr	w0, [x29, 140]
 	cmn	w0, #1
-	beq	.L3734
+	beq	.L3687
 	mov	w0, 1
 	bl	buf_alloc
-	mov	x27, x0
-	ldr	w1, [x29,172]
-	str	w1, [x0,40]
+	ldr	w1, [x29, 140]
+	mov	x25, x0
+	stp	w23, w1, [x0, 36]
 	mov	w1, 1
-	str	w23, [x0,36]
 	bl	sblk_read_page
-	ldr	x3, [x27,24]
-	ldr	w0, [x3,12]
-	add	w0, w0, 1
-	str	w0, [x29,152]
-	ldr	w0, [x3,4]
-	cmp	w0, w23
-	bne	.L3735
-	ldr	w0, [x27,52]
+	ldr	x3, [x25, 24]
+	ldr	w0, [x3, 4]
+	ldr	w26, [x3, 12]
+	cmp	w23, w0
+	add	w26, w26, 1
+	bne	.L3688
+	ldr	w0, [x25, 52]
 	cmn	w0, #1
-	bne	.L3736
-.L3735:
-	add	x4, x20, :lo12:.LANCHOR0
-	mov	w0, 1
-	ldr	w1, [x27,40]
-	mov	w2, 24
-	ldrb	w6, [x4,1257]
-	ldrb	w4, [x4,3360]
-	lsl	w0, w0, w6
-	sub	w2, w2, w6
-	sub	w0, w0, #1
-	lsr	w6, w1, w2
-	lsl	w2, w0, w2
+	bne	.L3689
+.L3688:
+	ldrb	w2, [x20, 1205]
+	mov	w6, 1
+	mov	w0, 24
+	ldr	w1, [x25, 40]
+	sub	w0, w0, w2
+	lsl	w6, w6, w2
+	ldr	x2, [x29, 120]
+	sub	w6, w6, #1
+	add	x2, x2, :lo12:.LANCHOR3
+	lsl	w7, w6, w0
+	lsr	w0, w1, w0
+	bic	w1, w1, w7
+	ldrb	w4, [x2, 1946]
 	and	w0, w0, w6
-	bic	w1, w1, w2
-	ldr	x2, [x27,8]
+	ldr	x2, [x25, 8]
 	bl	flash_read_page_en
-	str	w0, [x27,52]
-.L3736:
-	ldr	x0, [x27,24]
-	ldr	w0, [x0,4]
-	cmp	w0, w23
-	bne	.L3737
-	ldr	w0, [x27,52]
+	str	w0, [x25, 52]
+.L3689:
+	ldr	x0, [x25, 24]
+	ldr	w0, [x0, 4]
+	cmp	w23, w0
+	bne	.L3690
+	ldr	w0, [x25, 52]
 	cmn	w0, #1
-	bne	.L3738
-.L3737:
-	add	x0, x20, :lo12:.LANCHOR0
-	ldr	w2, [x29,172]
+	bne	.L3691
+.L3690:
+	ldr	x1, [x20, 1128]
 	mov	w3, w23
-	ldr	x1, [x0,1120]
-	ldr	w0, [x1,552]
+	ldr	w2, [x29, 140]
+	ldr	w0, [x1, 552]
 	add	w0, w0, 1
-	str	w0, [x1,552]
+	str	w0, [x1, 552]
 	adrp	x0, .LC296
-	ldrb	w1, [x27,1]
 	add	x0, x0, :lo12:.LC296
-	ldr	w4, [x27,52]
+	ldrb	w1, [x25, 1]
+	ldr	w4, [x25, 52]
 	bl	printk
+	ldr	x1, [x25, 24]
+	mov	w3, 4
 	adrp	x0, .LC240
-	mov	w2, 4
-	ldr	x1, [x27,24]
+	mov	w2, w3
 	add	x0, x0, :lo12:.LC240
-	mov	w3, w2
 	bl	rknand_print_hex
-.L3738:
-	ldr	x0, [x27,24]
-	ldr	w0, [x0,4]
-	cmp	w0, w23
-	bne	.L3739
-	ldr	w0, [x27,52]
+.L3691:
+	ldr	x0, [x25, 24]
+	ldr	w0, [x0, 4]
+	cmp	w23, w0
+	bne	.L3692
+	ldr	w0, [x25, 52]
 	cmn	w0, #1
-	bne	.L3740
-.L3739:
+	bne	.L3693
+.L3692:
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
-	mov	w2, 698
-	add	x1, x1, 984
+	add	x1, x1, 1000
+	mov	w2, 699
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L3740:
-	cbz	w22, .L3741
-	ldr	w0, [x29,172]
+.L3693:
+	cbz	w22, .L3694
+	ldr	w0, [x29, 140]
 	lsl	w2, w22, 9
 	cmn	w0, #1
-	beq	.L3742
-	ldr	x1, [x27,8]
-	mov	x0, x25
+	beq	.L3695
+	ldr	x1, [x25, 8]
+	mov	x0, x27
 	bl	ftl_memcpy
-	b	.L3743
-.L3734:
-	cbz	w22, .L3741
-	lsl	w2, w22, 9
-.L3742:
-	mov	x0, x25
-	mov	w1, 0
-	bl	ftl_memset
-.L3743:
-	add	x0, x20, :lo12:.LANCHOR0
-	ldr	x19, [x0,1120]
+.L3696:
+	ldr	x19, [x20, 1128]
 	add	x19, x19, 48
-.L3741:
-	add	x0, x20, :lo12:.LANCHOR0
-	ldrb	w2, [x0,3360]
+.L3694:
+	ldr	x0, [x29, 120]
+	add	x0, x0, :lo12:.LANCHOR3
+	ldrb	w2, [x0, 1946]
 	cmp	w21, w2
-	bcc	.L3744
-	bls	.L3745
-	ldr	x19, [x0,1120]
+	bcc	.L3697
+	bls	.L3698
+	ldr	x19, [x20, 1128]
 	add	x19, x19, 16
-	b	.L3745
-.L3744:
-	ldr	w0, [x29,172]
-	sub	w2, w2, w21
-	lsl	w2, w2, 9
-	cmn	w0, #1
-	ubfiz	x0, x21, 7, 9
-	beq	.L3746
-	ldr	x1, [x27,8]
-	lsl	x21, x0, 2
-	add	x0, x25, x21
-	add	x1, x1, x21
-	bl	ftl_memcpy
-	b	.L3745
-.L3746:
-	add	x0, x25, x0, lsl 2
-	mov	w1, 0
-	bl	ftl_memset
-.L3745:
-	cbz	x27, .L3730
-	ldrb	w0, [x27,2]
-	mov	x1, x27
+.L3698:
+	cbz	x25, .L3683
+	ldrb	w0, [x25, 2]
+	mov	x1, x25
 	and	w0, w0, -9
-	strb	w0, [x27,2]
-	add	x0, x20, :lo12:.LANCHOR0
-	add	x0, x0, 3364
+	strb	w0, [x25, 2]
+	add	x0, x20, 3355
 	bl	buf_remove_buf
-	mov	x0, x27
+	mov	x0, x25
 	bl	zbuf_free
-.L3730:
-	ldrh	w0, [x19,6]
-	cbnz	w0, .L3747
+.L3683:
+	ldrh	w0, [x19, 6]
+	cbnz	w0, .L3700
 	bl	ftl_flush
 	mov	x0, x19
 	bl	ftl_alloc_new_data_sblk
-.L3747:
+.L3700:
 	mov	x0, x19
-	add	x21, x20, :lo12:.LANCHOR0
 	bl	ftl_get_new_free_page
-	mov	w6, w0
-	ldr	x0, [x29,144]
-	add	x4, x21, 1312
+	mov	w3, w0
+	ldr	x0, [x29, 104]
 	mov	x1, x24
-	str	x6, [x29,104]
-	lsl	x27, x0, 6
-	str	x4, [x29,112]
-	add	x22, x4, x27
-	add	x5, x22, 32
-	str	x5, [x29,144]
-	ldr	w0, [x22,32]
-	str	w0, [x24]
-	str	w23, [x24,4]
-	ldrb	w2, [x21,3360]
-	ldr	w0, [x29,172]
-	str	w0, [x24,8]
+	str	w3, [x29, 100]
+	lsl	x22, x0, 6
+	add	x21, x28, x22
+	ldr	w0, [x21, 32]
+	stp	w0, w23, [x24]
+	str	w26, [x24, 12]
+	ldr	w0, [x29, 140]
+	str	w0, [x24, 8]
+	ldr	x0, [x29, 120]
+	str	wzr, [x1, 16]!
+	add	x25, x0, :lo12:.LANCHOR3
+	mov	w0, 2
+	ldrb	w2, [x25, 1946]
 	sub	w2, w2, #2
-	ldr	w0, [x29,152]
 	sbfiz	x2, x2, 9, 32
-	str	w0, [x24,12]
-	add	x2, x25, x2
-	str	wzr, [x1,16]!
-	mov	w0, 2
+	add	x2, x27, x2
 	bl	ftl_debug_info_fill
-	ldr	x5, [x29,144]
-	ldr	x4, [x29,112]
-	ldr	w0, [x29,172]
-	str	w0, [x5,12]
+	ldr	w0, [x29, 140]
+	mov	w1, 10
+	ldr	w3, [x29, 100]
+	stp	w3, w0, [x21, 40]
 	mov	w0, -1
-	ldrb	w1, [x22,2]
-	strb	w0, [x4,x27]
-	mov	w0, 10
-	ldr	x6, [x29,104]
-	orr	w0, w1, w0
-	str	w6, [x5,8]
-	strb	w0, [x22,2]
-	ldrh	w1, [x19,10]
-	ldrh	w0, [x19,12]
-	add	w0, w1, w0
-	mov	x1, x28
+	strb	w0, [x28, x22]
+	ldrb	w0, [x21, 2]
+	orr	w0, w0, w1
+	strb	w0, [x21, 2]
+	ldrh	w1, [x19, 12]
+	ldrh	w0, [x19, 10]
+	add	w0, w0, w1
+	ldr	x1, [x29, 112]
 	sub	w0, w0, #1
-	strh	w0, [x22,48]
-	ldr	x0, [x29,120]
+	strh	w0, [x21, 48]
+	adrp	x21, .LANCHOR5
+	add	x22, x21, :lo12:.LANCHOR5
+	add	x0, x22, 360
 	bl	buf_add_tail
-	ldrb	w0, [x21,3389]
+	ldrb	w0, [x20, 3380]
 	add	w0, w0, 1
-	strb	w0, [x21,3389]
+	strb	w0, [x20, 3380]
 	bl	timer_get_time
-	ldr	x1, [x29,136]
-	ldrb	w2, [x21,3389]
-	str	w0, [x1,356]
+	str	w0, [x22, 364]
+	ldrb	w2, [x20, 3380]
+	ldrh	w0, [x19, 6]
 	cmp	w2, 2
-	adrp	x0, .LANCHOR5
-	bhi	.L3748
-	ldrh	w1, [x19,6]
-	cmp	w1, 1
-	bne	.L3718
-.L3748:
-	ldrb	w1, [x19,5]
-	mov	w4, 2
-	add	x6, x20, :lo12:.LANCHOR0
-	cmp	w1, wzr
-	ldrh	w1, [x19,6]
-	csinc	w4, w4, wzr, ne
-	add	x6, x6, 1312
-	cmp	w1, 1
-	add	x1, x0, :lo12:.LANCHOR5
-	csel	w4, w4, w2, ne
-	ldrb	w5, [x1,352]
+	bhi	.L3701
+	cmp	w0, 1
+	bne	.L3671
+.L3701:
+	ldrb	w1, [x19, 5]
+	cmp	w1, 0
 	mov	w1, 0
-	mov	w3, w5
-.L3752:
+	cset	w4, ne
+	cmp	w0, 1
+	add	x0, x21, :lo12:.LANCHOR5
+	csinc	w4, w2, w4, eq
+	ldrb	w0, [x0, 360]
+	mov	w3, w0
+.L3705:
 	cmp	w1, w4
-	beq	.L3782
-	ubfiz	x3, x3, 6, 8
-	add	w1, w1, 1
-	ldrb	w3, [x6,x3]
-	b	.L3752
-.L3782:
-	add	x0, x0, :lo12:.LANCHOR5
-	uxtb	w1, w1
+	bne	.L3706
+	and	w1, w1, 255
+	add	x21, x21, :lo12:.LANCHOR5
 	sub	w2, w2, w1
-	ubfiz	x5, x5, 6, 8
-	strb	w3, [x0,352]
-	add	x0, x20, :lo12:.LANCHOR0
-	add	x0, x0, 1312
-	strb	w2, [x0,2077]
-	add	x0, x0, x5
+	ubfiz	x0, x0, 6, 8
+	strb	w2, [x20, 3380]
+	add	x0, x28, x0
+	strb	w3, [x21, 360]
 	bl	sblk_prog_page
-	ldrh	w0, [x19,6]
+	ldrh	w0, [x19, 6]
 	cmp	w0, 1
-	bne	.L3718
+	bne	.L3671
 	bl	sblk_wait_write_queue_completed
 	bl	ftl_write_completed
 	mov	x0, x19
 	bl	ftl_write_last_log_page
 	mov	x0, x19
 	bl	ftl_alloc_new_data_sblk
-.L3718:
-	add	x20, x20, :lo12:.LANCHOR0
-	ldrb	w19, [x20,3388]
-	cbnz	w19, .L3716
+.L3671:
+	ldrb	w0, [x20, 3381]
+	cbnz	w0, .L3668
+.L3670:
 	bl	ftl_write_completed
-	mov	w0, w19
-.L3779:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 176
-	ret
+	mov	w0, 0
+	b	.L3667
+.L3697:
+	ldr	w0, [x29, 140]
+	sub	w2, w2, w21
+	lsl	w2, w2, 9
+	cmn	w0, #1
+	ubfiz	x0, x21, 7, 9
+	beq	.L3699
+	ldr	x1, [x25, 8]
+	lsl	x0, x0, 2
+	add	x1, x1, x0
+	add	x0, x27, x0
+	bl	ftl_memcpy
+	b	.L3698
+.L3699:
+	mov	w1, 0
+	add	x0, x27, x0, lsl 2
+	bl	ftl_memset
+	b	.L3698
+.L3706:
+	ubfiz	x3, x3, 6, 8
+	add	w1, w1, 1
+	ldrb	w3, [x28, x3]
+	b	.L3705
+.L3707:
+	lsl	w2, w22, 9
+	mov	x25, 0
+	mov	w26, 0
+.L3695:
+	mov	w1, 0
+	mov	x0, x27
+	bl	ftl_memset
+	b	.L3696
+.L3687:
+	cbnz	w22, .L3707
+	mov	w26, 0
+	mov	x25, 0
+	b	.L3694
 	.size	ftl_write_commit, .-ftl_write_commit
 	.align	2
 	.global	gc_do_copy_back
@@ -24392,2350 +24189,2326 @@ ftl_write_commit:
 gc_do_copy_back:
 	stp	x29, x30, [sp, -240]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	adrp	x21, .LANCHOR3
-	add	x1, x21, :lo12:.LANCHOR3
-	stp	x19, x20, [sp,16]
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	adrp	x19, .LANCHOR0
-	add	x22, x19, :lo12:.LANCHOR0
-	ldrb	w0, [x1,1345]
-	ldr	x26, [x22,1120]
-	cbnz	w0, .L3784
+	stp	x21, x22, [sp, 32]
+	adrp	x22, .LANCHOR3
+	add	x1, x22, :lo12:.LANCHOR3
+	stp	x19, x20, [sp, 16]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldrb	w0, [x1, 1337]
+	cbnz	w0, .L3734
 	bl	buf_alloc
 	mov	x20, x0
-	cbz	x0, .L3783
-	add	x21, x22, 3424
-	ldrh	w22, [x22,3450]
-	mov	w0, w22
-	add	w22, w22, 1
+	cbz	x0, .L3733
+	adrp	x19, .LANCHOR0
+	add	x2, x19, :lo12:.LANCHOR0
+	ldrh	w3, [x2, 3442]
+	mov	w0, w3
 	bl	gc_get_src_ppa_from_index
-	str	w0, [x20,40]
+	add	w3, w3, 1
 	mov	w23, w0
+	str	w23, [x20, 40]
+	strh	w3, [x2, 3442]
 	mov	w1, 1
 	mov	x0, x20
-	strh	w22, [x21,26]
 	bl	sblk_read_page
-	ldr	w0, [x20,52]
+	ldr	w0, [x20, 52]
 	cmp	w0, 512
-	beq	.L3869
-	cmn	w0, #1
-	bne	.L3786
-.L3869:
+	ccmn	w0, #1, 4, ne
+	bne	.L3736
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 1024
 	mov	w2, 1032
-	add	x1, x1, 1008
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L3786:
-	ldr	x0, [x20,24]
-	ldr	w21, [x0,4]
+.L3736:
+	ldr	x0, [x20, 24]
+	ldr	w21, [x0, 4]
 	mov	w0, w21
 	bl	lpa_hash_get_ppa
-	str	w0, [x29,192]
+	str	w0, [x29, 192]
 	cmn	w0, #1
-	bne	.L3788
-	mov	w0, w21
-	add	x1, x29, 192
+	bne	.L3737
 	mov	w2, 0
+	add	x1, x29, 192
+	mov	w0, w21
 	bl	pm_log2phys
-.L3788:
-	ldr	w2, [x29,192]
-	cmp	w2, w23
-	bne	.L3789
+.L3737:
+	ldr	w24, [x29, 192]
+	cmp	w23, w24
+	bne	.L3738
 	add	x1, x19, :lo12:.LANCHOR0
-	add	x0, x1, 1312
-	add	x1, x1, 3360
-.L3792:
-	ldr	w3, [x0,36]
-	cmp	w3, w21
-	bne	.L3790
-	ldrb	w3, [x0,2]
-	tbz	x3, 1, .L3790
+	add	x0, x1, 1306
+	add	x1, x1, 3354
+.L3741:
+	ldr	w2, [x0, 34]
+	cmp	w21, w2
+	bne	.L3739
+	ldrb	w2, [x0]
+	tbz	x2, 1, .L3739
 	mov	x0, x20
-	str	x2, [x29,184]
 	bl	zbuf_free
 	adrp	x0, .LANCHOR2
-	ldr	x2, [x29,184]
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 8, .L3783
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 8, .L3733
 	add	x19, x19, :lo12:.LANCHOR0
 	adrp	x0, .LC297
+	mov	w2, w23
 	mov	w1, w21
 	add	x0, x0, :lo12:.LC297
-	ldrh	w3, [x19,3450]
+	ldrh	w3, [x19, 3442]
 	bl	printk
-	b	.L3783
-.L3790:
+.L3733:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 240
+	ret
+.L3739:
 	add	x0, x0, 64
-	cmp	x0, x1
-	bne	.L3792
-	add	x22, x19, :lo12:.LANCHOR0
-	str	w21, [x20,36]
-	strb	wzr, [x20,57]
-	ldrb	w0, [x22,3360]
-	strb	w0, [x20,56]
-	ldr	x0, [x20,24]
+	cmp	x1, x0
+	bne	.L3741
+	add	x22, x22, :lo12:.LANCHOR3
+	strb	wzr, [x20, 57]
+	str	w21, [x20, 36]
+	ldrb	w0, [x22, 1946]
+	strb	w0, [x20, 56]
+	ldr	x0, [x20, 24]
 	ldr	w1, [x0]
-	str	w1, [x20,32]
-	str	wzr, [x0,16]
+	str	w1, [x20, 32]
+	str	wzr, [x0, 16]
 	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 8, .L3793
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 8, .L3742
 	mov	w0, w21
-	str	x2, [x29,184]
 	bl	lpa_hash_get_ppa
+	add	x1, x19, :lo12:.LANCHOR0
 	mov	w3, w0
-	ldr	x2, [x29,184]
+	mov	w4, w23
 	adrp	x0, .LC298
-	ldrh	w5, [x22,3450]
+	mov	w2, w24
 	add	x0, x0, :lo12:.LC298
+	ldrh	w5, [x1, 3442]
 	mov	w1, w21
-	mov	w4, w2
 	bl	printk
-.L3793:
+.L3742:
 	add	x19, x19, :lo12:.LANCHOR0
 	mov	x0, x20
 	bl	ftl_gc_write_buf
 	bl	ftl_write_commit
-	ldr	x1, [x19,3392]
-	ldr	w0, [x1,60]
+	ldr	x1, [x19, 3384]
+	ldr	w0, [x1, 60]
 	add	w0, w0, 1
-	str	w0, [x1,60]
-	ldrh	w0, [x19,3452]
+	str	w0, [x1, 60]
+	ldrh	w0, [x19, 3444]
 	add	w0, w0, 1
-	strh	w0, [x19,3452]
-	b	.L3783
-.L3789:
+	strh	w0, [x19, 3444]
+	b	.L3733
+.L3738:
 	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 8, .L3795
-	mov	w0, w21
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 8, .L3743
 	add	x19, x19, :lo12:.LANCHOR0
-	str	x2, [x29,184]
+	mov	w0, w21
 	bl	lpa_hash_get_ppa
 	mov	w3, w0
-	ldr	x2, [x29,184]
+	mov	w4, w23
 	adrp	x0, .LC298
-	ldrh	w5, [x19,3450]
-	add	x0, x0, :lo12:.LC298
+	ldrh	w5, [x19, 3442]
+	mov	w2, w24
 	mov	w1, w21
-	mov	w4, w23
+	add	x0, x0, :lo12:.LC298
 	bl	printk
-.L3795:
+.L3743:
 	mov	x0, x20
 	bl	zbuf_free
-	b	.L3783
-.L3784:
+	b	.L3733
+.L3734:
+	adrp	x21, .LANCHOR0
+	add	x0, x21, :lo12:.LANCHOR0
+	ldrb	w1, [x1, 1321]
+	ldr	x26, [x0, 1128]
 	add	x0, x26, 80
-	str	x0, [x29,184]
-	ldrb	w1, [x1,1329]
-	mov	w24, 1
-	ldrb	w0, [x0,9]
-	uxth	w20, w0
-	cmp	w1, w20
-	bhi	.L3797
-	cmp	w20, 2
-	mov	w24, 2
-	csel	w24, w20, w24, ls
-.L3797:
-	add	x2, x21, :lo12:.LANCHOR3
-	ldrb	w3, [x2,1328]
-	cmp	w3, 3
-	bne	.L3798
-	add	x1, x19, :lo12:.LANCHOR0
-	ldrb	w4, [x1,1268]
-	cbz	w4, .L3799
-	ldrh	w22, [x1,5530]
-	ldrb	w1, [x2,1956]
-	sdiv	w0, w22, w0
-	uxth	w26, w0
-	cbz	w1, .L3800
-	adrp	x1, .LANCHOR2
+	str	x0, [x29, 184]
+	ldrb	w0, [x0, 9]
+	and	w19, w0, 65535
+	cmp	w1, w19
+	bhi	.L3798
+	cmp	w19, 2
 	mov	w23, 2
+	csel	w23, w19, w23, ls
+	and	w23, w23, 65535
+.L3744:
+	add	x1, x22, :lo12:.LANCHOR3
+	ldrb	w20, [x1, 1320]
+	cmp	w20, 3
+	bne	.L3745
+	add	x3, x21, :lo12:.LANCHOR0
+	ldrb	w2, [x3, 1212]
+	ldrh	w5, [x3, 5522]
+	cbz	w2, .L3746
+	sdiv	w0, w5, w0
+	ldrb	w1, [x1, 1950]
+	mov	w24, w5
+	and	w26, w0, 65535
+	cbz	w1, .L3747
+	adrp	x1, .LANCHOR2
 	add	x1, x1, :lo12:.LANCHOR2
 	add	x1, x1, 2136
-	ldrh	w0, [x1,w0,sxtw 1]
-	cmp	w0, wzr
-	csinc	w23, w23, wzr, ne
-	b	.L3801
-.L3800:
-	adrp	x0, .LANCHOR5+997
+	ldrh	w0, [x1, w0, sxtw 1]
+	cmp	w0, 0
+	cset	w20, ne
+.L3865:
+	add	w20, w20, 1
+.L3748:
+	msub	w19, w19, w26, w5
+	and	w19, w19, 65535
+.L3749:
+	adrp	x8, .LANCHOR5
+	adrp	x0, .LANCHOR2
+	add	x8, x8, :lo12:.LANCHOR5
+	add	x0, x0, :lo12:.LANCHOR2
+	add	x7, x21, :lo12:.LANCHOR0
+	mul	w11, w20, w23
+	add	x10, x22, :lo12:.LANCHOR3
+	add	x6, x0, 2136
+	sxtw	x12, w26
+	mov	x13, x8
+	add	x7, x7, 3416
+	mov	w5, 0
+.L3753:
+	cmp	w5, w11
+	bge	.L3806
+	ldr	x1, [x29, 184]
+	add	w2, w24, w5
+	ldrh	w0, [x10, 1338]
+	ldrb	w1, [x1, 9]
+	mul	w0, w0, w1
+	ldrb	w1, [x8, 465]
+	sub	w0, w0, w1
+	cmp	w2, w0
+	blt	.L3754
+	ldrb	w0, [x10, 1950]
+	cbz	w0, .L3806
+	ldrh	w0, [x6, x12, lsl 1]
+	cmp	w0, w26
+	bcc	.L3755
+.L3806:
+	mov	w0, 1
+	str	w0, [x29, 180]
+	b	.L3751
+.L3798:
 	mov	w23, 1
-	ldrb	w0, [x0,#:lo12:.LANCHOR5+997]
-	cbz	w0, .L3801
+	b	.L3744
+.L3747:
+	adrp	x0, .LANCHOR5+461
+	ldrb	w0, [x0, #:lo12:.LANCHOR5+461]
+	cbz	w0, .L3800
 	sub	w0, w26, #62
-	mov	w23, 2
-	uxth	w0, w0
+	and	w0, w0, 65535
 	cmp	w0, 2159
 	bhi	.L3801
-	udiv	w0, w26, w3
-	add	w0, w0, w0, lsl 1
-	sub	w0, w26, w0
-	uxth	w0, w0
-	cmp	w0, wzr
-	csinc	w23, w23, wzr, eq
+	udiv	w20, w26, w20
+	add	w20, w20, w20, lsl 1
+	sub	w20, w26, w20
+	and	w20, w20, 65535
+	cmp	w20, 0
+	cset	w20, eq
+	b	.L3865
+.L3800:
+	mov	w20, 1
+	b	.L3748
 .L3801:
-	msub	w20, w26, w20, w22
-	uxth	w20, w20
-	b	.L3804
-.L3799:
-	ldrb	w2, [x2,1344]
-	cbz	w2, .L3803
-	ldrh	w22, [x1,5530]
-	add	w20, w0, w0, lsl 1
-	mov	w23, w3
-	sdiv	w20, w22, w20
-	mul	w0, w20, w0
-	uxth	w26, w20
+	mov	w20, 2
+	b	.L3748
+.L3746:
+	ldrb	w1, [x1, 1336]
+	cbz	w1, .L3750
+	add	w19, w0, w0, lsl 1
+	mov	w24, w5
+	sdiv	w19, w5, w19
+	mul	w0, w0, w19
+	and	w26, w19, 65535
 	sub	w0, w0, w0, lsl 2
-	add	w20, w22, w0
-	ldrb	w0, [x1,1269]
-	sdiv	w20, w20, w3
-	uxth	w20, w20
-	cbz	w0, .L3804
+	add	w19, w0, w5
+	ldrb	w0, [x3, 1213]
+	sdiv	w19, w19, w20
+	and	w19, w19, 65535
+	cbz	w0, .L3749
 	add	w4, w26, w26, lsl 1
-	uxth	w26, w4
-	b	.L3804
-.L3803:
-	ldrh	w5, [x1,5530]
+	and	w26, w4, 65535
+	b	.L3749
+.L3750:
+	sdiv	w2, w5, w0
 	adrp	x1, .LANCHOR2
 	add	x1, x1, :lo12:.LANCHOR2
-	mov	w23, w3
 	add	x1, x1, 3672
-	sdiv	w2, w5, w0
-	msub	w20, w20, w2, w5
-	ldrh	w25, [x1,w2,sxtw 1]
-	uxth	w20, w20
+	msub	w19, w19, w2, w5
+	ldrh	w25, [x1, w2, sxtw 1]
+	and	w19, w19, 65535
+	and	w1, w25, 7
+	str	w1, [x29, 180]
 	lsr	w26, w25, 3
-	and	w25, w25, 7
-	madd	w22, w26, w0, w20
-	cmp	w25, 1
-	add	w22, w22, w22, lsl 1
-	uxth	w22, w22
-	bne	.L3805
-	b	.L3804
-.L3798:
-	ldrb	w1, [x2,1330]
-	cbnz	w1, .L3806
-	add	x1, x19, :lo12:.LANCHOR0
-	mov	w23, 1
-	ldrh	w22, [x1,5530]
-	sdiv	w26, w22, w0
-	msub	w20, w26, w20, w22
-	uxth	w20, w20
-	b	.L3804
-.L3806:
-	add	x1, x19, :lo12:.LANCHOR0
-	mov	w23, 2
-	ldrh	w22, [x1,5530]
-	sdiv	w26, w22, w0
-	msub	w20, w26, w20, w22
-	uxth	w20, w20
-.L3804:
-	adrp	x3, .LANCHOR5
-	adrp	x2, .LANCHOR2
-	mul	w7, w23, w24
-	mov	w28, 0
-	mov	x8, x3
-	add	x2, x2, :lo12:.LANCHOR2
-	sxtw	x5, w26
-	add	x6, x19, :lo12:.LANCHOR0
-	b	.L3807
-.L3938:
-	add	x0, x2, 2136
-	ldrh	w0, [x0,x5,lsl 1]
-	cmp	w0, w26
-	bcs	.L3867
-	tbz	x28, 0, .L3867
-.L3808:
-	add	x0, x8, :lo12:.LANCHOR5
-	sbfiz	x25, x25, 2, 32
-	ldr	x1, [x0,240]
-	ldr	w0, [x1,x25]
-	cmn	w0, #1
-	beq	.L3937
-.L3811:
-	add	w28, w28, 1
-	uxth	w28, w28
-.L3807:
-	cmp	w28, w7
-	bge	.L3867
-	add	x1, x21, :lo12:.LANCHOR3
-	ldr	x4, [x29,184]
-	add	w25, w22, w28
-	ldrb	w9, [x4,9]
-	ldrh	w0, [x1,1346]
-	mul	w0, w0, w9
-	add	x9, x3, :lo12:.LANCHOR5
-	ldrb	w9, [x9,1001]
-	sub	w0, w0, w9
-	cmp	w25, w0
-	blt	.L3808
-	ldrb	w0, [x1,1956]
-	cbnz	w0, .L3938
-.L3867:
-	mov	w25, 1
-.L3805:
-	mul	w0, w23, w24
-	str	w0, [x29,168]
-	str	wzr, [x29,152]
-	sub	w0, w22, w0, lsl 1
-	uxth	w0, w0
-	str	w0, [x29,128]
-	ldrh	w0, [x29,128]
-	str	x0, [x29,120]
-	adrp	x0, .LC0
-	add	x0, x0, :lo12:.LC0
-	str	x0, [x29,112]
+	madd	w0, w26, w0, w19
+	add	w0, w0, w0, lsl 1
+	and	w24, w0, 65535
+	uxtw	x0, w1
+	cmp	w0, 1
+	beq	.L3749
+.L3751:
+	mul	w0, w20, w23
+	str	wzr, [x29, 160]
+	str	w0, [x29, 176]
+	ubfiz	w0, w23, 1, 15
+	strh	w0, [x29, 128]
+	str	w0, [x29, 156]
+	msub	w0, w0, w20, w24
+	and	w0, w0, 65535
+	str	w0, [x29, 152]
+	ldrh	w0, [x29, 152]
+	str	x0, [x29, 120]
+	adrp	x0, .LANCHOR5
+	add	x28, x0, :lo12:.LANCHOR5
 	adrp	x0, .LANCHOR4
 	add	x0, x0, :lo12:.LANCHOR4
-	add	x0, x0, 1008
-	str	x0, [x29,104]
-	b	.L3810
-.L3937:
-	ldrh	w27, [x6,3450]
-	ldrh	w0, [x6,3448]
-	cmp	w0, w27
-	bls	.L3783
-	add	x0, x21, :lo12:.LANCHOR3
-	ldrb	w0, [x0,1956]
-	cbz	w0, .L3812
-	add	x0, x2, 2136
-	ldrh	w0, [x0,x5,lsl 1]
+	str	x0, [x29, 112]
+.L3756:
+	ldr	w0, [x29, 160]
+	ldr	w1, [x29, 176]
+	and	w0, w0, 65535
+	str	w0, [x29, 164]
+	ldrh	w27, [x29, 160]
+	cmp	w0, w1
+	blt	.L3780
+	add	x1, x22, :lo12:.LANCHOR3
+	ldrb	w0, [x1, 1320]
+	cmp	w0, 3
+	add	x0, x29, 192
+	bne	.L3781
+	add	x2, x21, :lo12:.LANCHOR0
+	ldrb	w2, [x2, 1212]
+	cbz	w2, .L3782
+	ldr	w2, [x29, 176]
+	mov	w1, 0
+	sub	w2, w2, #1
+.L3783:
+	cmp	w1, w2
+	blt	.L3784
+.L3870:
+	ldr	x0, [x0, w2, sxtw 3]
+	mov	w1, -1
+	strb	w1, [x0]
+	ldrb	w1, [x29, 176]
+	ldr	x0, [x29, 192]
+	bl	sblk_prog_page
+	b	.L3785
+.L3745:
+	ldrb	w1, [x1, 1322]
+	cbnz	w1, .L3752
+	add	x1, x21, :lo12:.LANCHOR0
+	mov	w20, 1
+	ldrh	w24, [x1, 5522]
+	sdiv	w26, w24, w0
+	msub	w19, w19, w26, w24
+	and	w19, w19, 65535
+	b	.L3749
+.L3752:
+	add	x1, x21, :lo12:.LANCHOR0
+	mov	w20, 2
+	ldrh	w24, [x1, 5522]
+	sdiv	w26, w24, w0
+	msub	w19, w19, w26, w24
+	and	w19, w19, 65535
+	b	.L3749
+.L3755:
+	tbz	x5, 0, .L3806
+.L3754:
+	ldr	x9, [x13, 288]
+	sbfiz	x2, x2, 2, 32
+	ldr	w0, [x9, x2]
+	cmn	w0, #1
+	bne	.L3757
+	ldrh	w3, [x7, 26]
+	ldrh	w0, [x7, 24]
+	cmp	w0, w3
+	bls	.L3733
+	ldrb	w0, [x10, 1950]
+	cbz	w0, .L3758
+	ldrh	w0, [x6, x12, lsl 1]
 	cmp	w0, w26
-	bcs	.L3812
-	tbz	x28, 0, .L3812
+	bcs	.L3758
+	tbz	x5, 0, .L3758
 	ubfiz	x0, x0, 2, 16
-	ldr	w0, [x1,x0]
-	str	w0, [x1,x25]
-	b	.L3811
-.L3812:
-	mov	w0, w27
-	str	x6, [x29,128]
-	str	x5, [x29,136]
-	add	w27, w27, 1
-	str	x2, [x29,144]
-	str	x8, [x29,152]
-	str	x3, [x29,160]
-	str	x1, [x29,168]
-	str	x7, [x29,176]
+	ldr	w0, [x9, x0]
+.L3866:
+	str	w0, [x9, x2]
+.L3757:
+	add	w5, w5, 1
+	and	w5, w5, 65535
+	b	.L3753
+.L3758:
+	mov	w0, w3
 	bl	gc_get_src_ppa_from_index
-	ldr	x6, [x29,128]
-	ldr	x1, [x29,168]
-	ldr	x5, [x29,136]
-	strh	w27, [x6,3450]
-	str	w0, [x1,x25]
-	ldr	x2, [x29,144]
-	ldr	x8, [x29,152]
-	ldr	x3, [x29,160]
-	ldr	x7, [x29,176]
-	b	.L3811
-.L3838:
-	ldr	w0, [x29,160]
-	add	w2, w22, w0
-	sxtw	x0, w2
-	str	x0, [x29,176]
-	add	x0, x21, :lo12:.LANCHOR3
-	ldr	x1, [x29,176]
-	ldr	x0, [x0,1336]
-	ldrb	w0, [x0,x1]
+	add	w3, w3, 1
+	strh	w3, [x7, 26]
+	b	.L3866
+.L3780:
+	ldr	w0, [x29, 164]
+	add	w1, w24, w0
+	sxtw	x0, w1
+	str	x0, [x29, 168]
+	add	x0, x22, :lo12:.LANCHOR3
+	sxtw	x2, w1
+	ldr	x0, [x0, 1328]
+	ldrb	w0, [x0, x2]
 	cmp	w0, 255
-	beq	.L3939
-.L3814:
-	add	x5, x21, :lo12:.LANCHOR3
-	ldr	x2, [x29,176]
-	add	x3, x29, 192
-	add	x6, x19, :lo12:.LANCHOR0
-	add	x1, x6, 1312
-	ldr	x0, [x5,1336]
-	ldrb	w2, [x0,x2]
-	ldr	w0, [x29,160]
-	add	x1, x1, x2, lsl 6
-	str	x1, [x3,w0,sxtw 3]
-	mov	w3, 2
-	ldrb	w0, [x5,1328]
-	strh	w3, [x1,50]
-	adrp	x3, .LANCHOR5
-	strb	w25, [x1,61]
-	cmp	w0, 3
-	bne	.L3829
-	ldrb	w7, [x6,1268]
-	cbnz	w7, .L3940
-	ldrb	w6, [x6,1269]
-	add	x1, x1, 32
-	udiv	w0, w27, w0
-	ldrh	w7, [x5,1418]
-	cbz	w6, .L3833
-	add	w6, w0, w20
-	ldr	x4, [x29,184]
-	add	x6, x4, w6, sxtw 1
-	ldrh	w5, [x6,16]
-	add	w0, w0, w0, lsl 1
-	sub	w0, w27, w0
-	madd	w5, w5, w7, w26
-	add	w0, w5, w0, uxth
-.L3936:
-	str	w0, [x1,8]
-	add	x0, x19, :lo12:.LANCHOR0
-	add	x0, x0, 1312
-	add	x2, x0, x2, lsl 6
-	add	x0, x3, :lo12:.LANCHOR5
-	ldr	x1, [x0,248]
-	mov	w0, 3
-	ldrh	w5, [x2,48]
-	udiv	w0, w27, w0
-	ldr	w2, [x2,40]
-	add	w0, w0, w0, lsl 1
-	sub	w0, w27, w0
-	uxth	w0, w0
-	add	w0, w0, 1
-	orr	w0, w2, w0, lsl 24
-	str	w0, [x1,x5,lsl 2]
-.L3857:
-	add	x1, x21, :lo12:.LANCHOR3
-	ldrb	w0, [x1,1956]
-	cbnz	w0, .L3941
-.L3837:
-	ldr	w0, [x29,152]
-	add	w0, w0, 1
-	str	w0, [x29,152]
-.L3810:
-	ldr	w0, [x29,152]
-	ldr	w1, [x29,168]
-	and	w0, w0, 65535
-	str	w0, [x29,160]
-	cmp	w0, w1
-	ldrh	w27, [x29,152]
-	blt	.L3838
-	b	.L3942
-.L3939:
+	bne	.L3760
+	str	w1, [x29, 144]
 	mov	w0, 0
-	str	x2, [x29,144]
 	bl	buf_alloc
-	mov	x28, x0
-	ldr	x2, [x29,144]
-	cbnz	x0, .L3815
+	mov	x25, x0
+	ldr	w1, [x29, 144]
+	cbnz	x0, .L3761
+	str	w1, [x29, 144]
 	bl	sblk_wait_write_queue_completed
 	bl	ftl_write_completed
 	bl	gc_write_completed
 	bl	gc_free_temp_buf
-	mov	w0, w28
+	mov	w0, 0
 	bl	buf_alloc
-	mov	x28, x0
-	ldr	x2, [x29,144]
-	cbz	x0, .L3783
-.L3815:
-	add	x1, x21, :lo12:.LANCHOR3
-	ldr	x3, [x29,176]
-	ldrb	w5, [x28,1]
-	ldr	x0, [x1,1336]
-	strb	w5, [x0,x3]
-	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x3, [x29,184]
-	strb	w25, [x28,61]
-	ldrb	w5, [x0,3431]
+	ldr	w1, [x29, 144]
+	mov	x25, x0
+	cbz	x0, .L3733
+.L3761:
+	add	x2, x22, :lo12:.LANCHOR3
+	ldr	x3, [x29, 168]
+	ldrb	w5, [x25, 1]
+	ldr	x0, [x2, 1328]
+	strb	w5, [x0, x3]
+	add	x0, x21, :lo12:.LANCHOR0
+	ldr	x3, [x29, 184]
+	ldrb	w5, [x0, 3423]
 	add	w5, w5, 1
-	strb	w5, [x0,3431]
-	add	w0, w27, w22
-	strh	w0, [x28,48]
-	ldrh	w0, [x1,1346]
-	ldrb	w5, [x3,9]
+	strb	w5, [x0, 3423]
+	add	w0, w27, w24
+	strh	w0, [x25, 48]
+	ldrb	w0, [x29, 180]
+	strb	w0, [x25, 61]
+	ldrh	w0, [x2, 1338]
+	ldrb	w5, [x3, 9]
+	adrp	x3, .LANCHOR5
 	mul	w0, w0, w5
-	adrp	x5, .LANCHOR5
-	str	x5, [x29,144]
-	add	x6, x5, :lo12:.LANCHOR5
-	ldrb	w6, [x6,1001]
-	sub	w0, w0, w6
-	cmp	w2, w0
-	blt	.L3816
-	ldrb	w0, [x1,1956]
-	cbz	w0, .L3817
+	add	x5, x3, :lo12:.LANCHOR5
+	ldrb	w5, [x5, 465]
+	sub	w0, w0, w5
+	cmp	w1, w0
+	blt	.L3762
+	ldrb	w0, [x2, 1950]
+	cbz	w0, .L3763
 	adrp	x0, .LANCHOR2
 	add	x0, x0, :lo12:.LANCHOR2
 	add	x0, x0, 2136
-	ldrh	w0, [x0,w26,sxtw 1]
+	ldrh	w0, [x0, w26, sxtw 1]
 	cmp	w0, w26
-	bcs	.L3817
-	tbnz	x27, 0, .L3816
-.L3817:
-	ldr	x0, [x29,144]
-	mov	w1, -1
-	ldr	x3, [x29,176]
-	add	x5, x21, :lo12:.LANCHOR3
-	add	x6, x0, :lo12:.LANCHOR5
-	ldr	x0, [x6,232]
-	str	w1, [x0,x3,lsl 2]
-	ldrb	w0, [x6,1001]
+	bcs	.L3763
+	tbnz	x27, 0, .L3762
+.L3763:
+	ldr	x0, [x28, 280]
+	mov	w2, -1
+	ldr	x3, [x29, 168]
+	str	w2, [x0, x3, lsl 2]
+	ldrb	w0, [x28, 465]
 	cmp	w0, 2
-	ldrh	w0, [x5,1346]
-	bne	.L3818
-	ldr	x1, [x29,184]
-	ldrb	w1, [x1,9]
-	mul	w1, w0, w1
-	sub	w1, w1, #2
-	cmp	w2, w1
-	ldrh	w2, [x6,998]
-	bne	.L3819
-	ldr	x1, [x6,232]
-	ldr	x0, [x28,8]
-	str	x6, [x29,96]
+	bne	.L3764
+	ldr	x0, [x29, 184]
+	add	x7, x22, :lo12:.LANCHOR3
+	ldrh	w2, [x28, 462]
+	ldrh	w6, [x7, 1338]
+	ldrb	w0, [x0, 9]
+	mul	w0, w0, w6
+	sub	w0, w0, #2
+	cmp	w1, w0
+	bne	.L3765
+	ldr	x1, [x28, 280]
+	ldr	x0, [x25, 8]
+	str	x7, [x29, 144]
 	bl	ftl_memcpy
-	add	x5, x19, :lo12:.LANCHOR0
-	ldr	x0, [x28,24]
+	ldr	x7, [x29, 144]
 	mov	w1, 0
-	str	x5, [x29,136]
-	ldrb	w2, [x5,3360]
+	ldr	x0, [x25, 24]
+	ldrb	w2, [x7, 1946]
 	lsl	w2, w2, 1
 	bl	ftl_memset
-	ldr	x1, [x28,24]
-	mov	w0, 15555
-	ldr	x6, [x29,96]
-	movk	w0, 0xf55f, lsl 16
-	str	w0, [x1]
-	ldr	x2, [x28,24]
-	ldrh	w1, [x6,998]
-	ldr	x0, [x28,8]
-	str	x2, [x29,144]
+	ldr	x0, [x25, 24]
+	mov	w1, 15555
+	movk	w1, 0xf55f, lsl 16
+	str	w1, [x0]
+	ldr	x2, [x25, 24]
+	ldrh	w1, [x28, 462]
+	ldr	x0, [x25, 8]
+	str	x2, [x29, 144]
 	bl	js_hash
-	ldr	x2, [x29,144]
-	ldr	x5, [x29,136]
-	str	w0, [x2,4]
-	ldr	x1, [x5,1120]
-	ldr	x0, [x28,24]
-	ldr	w1, [x1,132]
-	str	w1, [x0,8]
-	ldr	x0, [x28,24]
-	str	wzr, [x0,12]
-	b	.L3820
-.L3819:
-	ldrb	w5, [x5,1329]
-	ldr	x1, [x6,232]
-	mul	w5, w0, w5
-	ldr	x0, [x28,8]
+	ldr	x2, [x29, 144]
+	add	x1, x21, :lo12:.LANCHOR0
+	str	w0, [x2, 4]
+	ldr	x1, [x1, 1128]
+	ldr	x0, [x25, 24]
+	ldr	w1, [x1, 132]
+	str	w1, [x0, 8]
+	ldr	x0, [x25, 24]
+	str	wzr, [x0, 12]
+.L3766:
+	ldr	x0, [x25, 24]
+	str	wzr, [x0, 16]
+.L3760:
+	add	x5, x22, :lo12:.LANCHOR3
+	ldr	x1, [x29, 168]
+	ldrsw	x2, [x29, 164]
+	add	x3, x29, 192
+	add	x7, x21, :lo12:.LANCHOR0
+	ldr	x0, [x5, 1328]
+	add	x6, x7, 1304
+	ldrb	w1, [x0, x1]
+	ubfiz	x0, x1, 6, 8
+	add	x0, x6, x0
+	add	x6, x6, x1, lsl 6
+	str	x0, [x3, x2, lsl 3]
+	ldrb	w0, [x29, 180]
+	strb	w0, [x6, 61]
+	mov	w0, 2
+	strh	w0, [x6, 50]
+	ldrb	w0, [x5, 1320]
+	cmp	w0, 3
+	bne	.L3771
+	ldrb	w8, [x7, 1212]
+	cbz	w8, .L3772
+	ldrb	w0, [x5, 1950]
+	and	w6, w27, 1
+	add	w7, w6, w26
+	cbz	w0, .L3773
+	adrp	x5, .LANCHOR2
+	add	x5, x5, :lo12:.LANCHOR2
+	add	x5, x5, 2136
+	ldrh	w0, [x5, w26, sxtw 1]
+	cmp	w0, w26
+	bcs	.L3773
+	cmp	w6, 0
+	csel	w7, w7, w0, eq
+.L3773:
+	udiv	w5, w27, w20
+	ldr	x0, [x29, 184]
+	add	x6, x21, :lo12:.LANCHOR0
+	add	x6, x6, x1, lsl 6
+	add	w5, w5, w19
+	add	x5, x0, w5, sxtw 1
+	ldrh	w0, [x5, 16]
+	add	x5, x22, :lo12:.LANCHOR3
+	ldrh	w5, [x5, 1410]
+	madd	w0, w0, w5, w7
+	orr	w0, w0, 50331648
+	str	w0, [x6, 1344]
+.L3778:
+	add	x0, x21, :lo12:.LANCHOR0
+	add	x0, x0, 1304
+	add	x1, x0, x1, lsl 6
+	adrp	x0, .LANCHOR5
+	add	x0, x0, :lo12:.LANCHOR5
+	ldr	w5, [x1, 40]
+	ldr	x0, [x0, 296]
+	ldrh	w1, [x1, 48]
+	str	w5, [x0, x1, lsl 2]
+	b	.L3797
+.L3765:
+	ldrb	w5, [x7, 1321]
+	and	x1, x2, 65532
+	ldr	x0, [x28, 280]
+	str	x7, [x29, 144]
+	add	x1, x0, x1
+	ldr	x0, [x25, 8]
+	mul	w5, w5, w6
 	lsl	w5, w5, 2
 	sub	w5, w5, w2
-	and	x2, x2, 65532
-	add	x1, x1, x2
+	str	w5, [x29, 104]
 	mov	w2, w5
-	str	x5, [x29,96]
 	bl	ftl_memcpy
-	add	x6, x19, :lo12:.LANCHOR0
-	ldr	x0, [x28,24]
+	ldr	x7, [x29, 144]
 	mov	w1, 0
-	str	x6, [x29,136]
-	ldrb	w2, [x6,3360]
+	ldr	x0, [x25, 24]
+	ldrb	w2, [x7, 1946]
 	lsl	w2, w2, 1
 	bl	ftl_memset
-	ldr	x1, [x28,24]
-	mov	w0, 15555
-	movk	w0, 0xf55f, lsl 16
-	ldr	x5, [x29,96]
-	str	w0, [x1]
+	ldr	x0, [x25, 24]
+	mov	w1, 15555
+	movk	w1, 0xf55f, lsl 16
+	ldr	w5, [x29, 104]
+	str	w1, [x0]
 	mov	w1, w5
-	ldr	x2, [x28,24]
-	ldr	x0, [x28,8]
-	str	x2, [x29,144]
+	ldr	x2, [x25, 24]
+	ldr	x0, [x25, 8]
+	str	x2, [x29, 144]
 	bl	js_hash
-	ldr	x2, [x29,144]
-	ldr	x6, [x29,136]
-	str	w0, [x2,4]
-	ldr	x1, [x6,1120]
-	ldr	x0, [x28,24]
-	ldr	w1, [x1,132]
-	str	w1, [x0,8]
+	ldr	x2, [x29, 144]
+	add	x1, x21, :lo12:.LANCHOR0
+	str	w0, [x2, 4]
+	ldr	x1, [x1, 1128]
+	ldr	x0, [x25, 24]
+	ldr	w1, [x1, 132]
+	str	w1, [x0, 8]
 	mov	w1, 1
-	ldr	x0, [x28,24]
-	str	w1, [x0,12]
-	b	.L3820
-.L3818:
-	ldrb	w2, [x5,1329]
-	ldr	x1, [x6,232]
-	str	x5, [x29,96]
-	mul	w2, w0, w2
-	ldr	x0, [x28,8]
+	ldr	x0, [x25, 24]
+	str	w1, [x0, 12]
+	b	.L3766
+.L3764:
+	add	x5, x22, :lo12:.LANCHOR3
+	ldr	x1, [x28, 280]
+	str	x5, [x29, 144]
+	ldrb	w0, [x5, 1321]
+	ldrh	w2, [x5, 1338]
+	mul	w2, w2, w0
+	ldr	x0, [x25, 8]
 	lsl	w2, w2, 2
-	str	x6, [x29,136]
 	bl	ftl_memcpy
-	ldr	x5, [x29,96]
-	ldr	x6, [x29,136]
-	ldrb	w1, [x5,1329]
-	ldrh	w0, [x5,1346]
+	ldr	x5, [x29, 144]
+	ldrb	w1, [x5, 1321]
+	ldrh	w0, [x5, 1338]
 	mul	w0, w0, w1
-	add	x1, x19, :lo12:.LANCHOR0
+	ldrb	w1, [x5, 1946]
 	lsl	w2, w0, 2
-	ldrb	w1, [x1,3360]
 	cmp	w1, w0, lsr 6
-	bge	.L3821
-	ldrh	w1, [x6,998]
+	bge	.L3767
+	ldrh	w1, [x28, 462]
 	sub	w2, w1, w2
-.L3821:
-	ldr	x1, [x29,144]
-	ldr	x5, [x28,8]
+.L3767:
+	ldr	x5, [x25, 8]
+	ldr	x1, [x28, 288]
 	add	x0, x5, w0, sxtw 2
-	add	x1, x1, :lo12:.LANCHOR5
-	ldr	x1, [x1,240]
 	bl	ftl_memcpy
-	add	x5, x19, :lo12:.LANCHOR0
-	ldr	x0, [x28,24]
+	add	x5, x22, :lo12:.LANCHOR3
+	ldr	x0, [x25, 24]
 	mov	w1, 0
-	str	x5, [x29,136]
-	ldrb	w2, [x5,3360]
+	str	x5, [x29, 104]
+	ldrb	w2, [x5, 1946]
 	lsl	w2, w2, 1
 	bl	ftl_memset
-	ldr	x1, [x28,24]
-	mov	w0, 15555
-	movk	w0, 0xf55f, lsl 16
-	str	w0, [x1]
-	add	x1, x21, :lo12:.LANCHOR3
-	ldr	x2, [x28,24]
-	ldrh	w0, [x1,1346]
-	ldrb	w1, [x1,1329]
-	str	x2, [x29,144]
-	mul	w1, w0, w1
-	ldr	x0, [x28,8]
+	ldr	x0, [x25, 24]
+	mov	w1, 15555
+	ldr	x5, [x29, 104]
+	movk	w1, 0xf55f, lsl 16
+	str	w1, [x0]
+	ldrb	w0, [x5, 1321]
+	ldrh	w1, [x5, 1338]
+	ldr	x2, [x25, 24]
+	str	x2, [x29, 144]
+	mul	w1, w1, w0
+	ldr	x0, [x25, 8]
 	lsl	w1, w1, 2
 	bl	js_hash
-	ldr	x2, [x29,144]
-	ldr	x5, [x29,136]
-	str	w0, [x2,4]
-	ldr	x1, [x5,1120]
-	ldr	x0, [x28,24]
-	ldr	w1, [x1,132]
-	b	.L3932
-.L3816:
-	ldr	x0, [x29,176]
+	ldr	x2, [x29, 144]
+	add	x1, x21, :lo12:.LANCHOR0
+	str	w0, [x2, 4]
+	ldr	x1, [x1, 1128]
+	ldr	x0, [x25, 24]
+	ldr	w1, [x1, 132]
+.L3867:
+	str	w1, [x0, 8]
+	b	.L3766
+.L3762:
+	ldr	x0, [x29, 168]
 	lsl	x0, x0, 2
-	str	x0, [x29,136]
-	ldr	x0, [x29,144]
-	ldr	x1, [x29,136]
-	add	x0, x0, :lo12:.LANCHOR5
-	ldr	x0, [x0,240]
-	ldr	w0, [x0,x1]
+	str	x0, [x29, 144]
+	ldr	x0, [x28, 288]
+	ldr	x1, [x29, 144]
+	ldr	w0, [x0, x1]
 	mov	w1, 1
-	str	w0, [x28,40]
-	mov	x0, x28
+	str	w0, [x25, 40]
+	mov	x0, x25
 	bl	sblk_read_page
-	ldr	w0, [x28,52]
+	ldr	w0, [x25, 52]
 	cmp	w0, 512
-	beq	.L3822
-	cmn	w0, #1
-	bne	.L3823
-.L3822:
-	add	x1, x19, :lo12:.LANCHOR0
-	add	x5, x21, :lo12:.LANCHOR3
-	ldrb	w2, [x1,1257]
-	mov	w1, 24
-	ldrh	w0, [x5,1312]
-	sub	w2, w1, w2
-	mov	w1, 1
-	sub	w2, w2, w0
-	lsl	w2, w1, w2
-	ldr	w1, [x28,40]
-	sub	w2, w2, #1
-	lsr	w0, w1, w0
-	ldrb	w1, [x5,1314]
-	and	w0, w2, w0
-	udiv	w0, w0, w1
+	ccmn	w0, #1, 4, ne
+	bne	.L3769
+	add	x0, x21, :lo12:.LANCHOR0
+	add	x2, x22, :lo12:.LANCHOR3
+	ldrb	w1, [x0, 1205]
+	mov	w0, 24
+	ldrh	w5, [x2, 1304]
+	sub	w0, w0, w1
+	ldrb	w2, [x2, 1306]
+	sub	w1, w0, w5
+	mov	w0, 1
+	lsl	w0, w0, w1
+	ldr	w1, [x25, 40]
+	sub	w0, w0, #1
+	lsr	w1, w1, w5
+	and	w0, w0, w1
 	mov	x1, 0
+	udiv	w0, w0, w2
 	bl	ftl_sblk_dump
-	ldr	w0, [x28,52]
+	ldr	w0, [x25, 52]
 	cmp	w0, 512
-	beq	.L3870
-	cmn	w0, #1
-	bne	.L3823
-.L3870:
-	ldr	x0, [x28,24]
+	ccmn	w0, #1, 4, ne
+	bne	.L3769
+	ldr	x0, [x25, 24]
 	mov	w1, -1
-	str	w1, [x0,4]
-.L3823:
-	ldr	w0, [x28,52]
+	str	w1, [x0, 4]
+	ldr	w0, [x25, 52]
 	cmp	w0, 512
-	beq	.L3871
-	cmn	w0, #1
-	bne	.L3826
-.L3871:
-	ldr	x1, [x29,104]
+	ccmp	w0, w1, 4, ne
+	bne	.L3769
+	ldr	x0, [x29, 112]
 	mov	w2, 1223
-	ldr	x0, [x29,112]
+	add	x1, x0, 1024
+	adrp	x0, .LC0
+	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L3826:
-	ldr	x1, [x28,24]
-	add	x0, x19, :lo12:.LANCHOR0
-	ldr	w2, [x1,4]
-	ldr	w0, [x0,3372]
+.L3769:
+	ldr	x1, [x25, 24]
+	add	x0, x21, :lo12:.LANCHOR0
+	ldr	w0, [x0, 3364]
+	ldr	w2, [x1, 4]
 	cmp	w2, w0
-	bcc	.L3828
+	bcc	.L3770
 	mov	w0, -1
-	str	w0, [x1,4]
-.L3828:
-	ldr	x0, [x28,24]
-	ldr	x2, [x29,136]
-	ldr	w1, [x0,4]
-	ldr	x0, [x29,144]
+	str	w0, [x1, 4]
+.L3770:
+	ldr	x0, [x25, 24]
+	ldr	x2, [x29, 144]
+	ldr	w1, [x0, 4]
+	ldr	x0, [x28, 280]
+	str	w1, [x0, x2]
+	ldr	w1, [x25, 40]
+	ldr	x0, [x25, 24]
+	b	.L3867
+.L3772:
+	udiv	w0, w27, w0
+	ldrb	w7, [x7, 1213]
+	ldrh	w8, [x5, 1410]
+	cbz	w7, .L3775
+	ldr	x4, [x29, 184]
+	add	w7, w0, w19
+	add	w0, w0, w0, lsl 1
+	sub	w0, w27, w0
+	add	x7, x4, w7, sxtw 1
+	ldrh	w5, [x7, 16]
+	madd	w5, w5, w8, w26
+	add	w0, w5, w0, uxth
+.L3871:
+	str	w0, [x6, 40]
+	adrp	x0, .LANCHOR5
 	add	x0, x0, :lo12:.LANCHOR5
-	ldr	x0, [x0,232]
-	str	w1, [x0,x2]
-	ldr	x0, [x28,24]
-	ldr	w1, [x28,40]
-.L3932:
-	str	w1, [x0,8]
-.L3820:
-	ldr	x0, [x28,24]
-	str	wzr, [x0,16]
-	b	.L3814
-.L3940:
-	ldrb	w1, [x5,1956]
-	and	w6, w27, 1
-	add	w0, w26, w6
-	cbz	w1, .L3831
-	adrp	x1, .LANCHOR2
-	add	x1, x1, :lo12:.LANCHOR2
-	add	x1, x1, 2136
-	ldrh	w1, [x1,w26,sxtw 1]
-	cbz	w6, .L3831
-	cmp	w1, w26
-	csel	w0, w0, w1, cs
-.L3831:
-	add	x6, x21, :lo12:.LANCHOR3
-	ldr	x4, [x29,184]
-	udiv	w1, w27, w23
-	add	x5, x19, :lo12:.LANCHOR0
-	add	x5, x5, x2, lsl 6
-	add	w1, w1, w20
-	ldrh	w6, [x6,1418]
-	add	x1, x4, w1, sxtw 1
-	ldrh	w1, [x1,16]
-	madd	w0, w1, w6, w0
-	orr	w0, w0, 50331648
-	str	w0, [x5,1352]
-	b	.L3832
-.L3833:
-	add	w0, w0, w20
-	ldr	x4, [x29,184]
-	add	x0, x4, w0, sxtw 1
-	ldrh	w5, [x0,16]
-	madd	w0, w5, w7, w26
-	b	.L3936
-.L3829:
-	cmp	w0, 2
-	bne	.L3832
-	ldrb	w6, [x5,1330]
-	add	x1, x1, 32
-	ldrh	w0, [x5,1418]
-	cbnz	w6, .L3836
-	ldr	w4, [x29,160]
-	add	w5, w4, w20
-	ldr	x4, [x29,184]
-	add	x5, x4, w5, sxtw 1
-	ldrh	w5, [x5,16]
-	madd	w0, w5, w0, w26
-	b	.L3933
-.L3836:
-	add	w5, w20, w27, lsr 1
-	ldr	x4, [x29,184]
-	add	x5, x4, w5, sxtw 1
-	ldrh	w5, [x5,16]
-	madd	w0, w5, w0, w26
-	and	w5, w27, 1
-	add	w0, w0, w5
-.L3933:
-	orr	w0, w0, 33554432
-	str	w0, [x1,8]
-.L3832:
-	add	x0, x19, :lo12:.LANCHOR0
-	add	x0, x0, 1312
-	add	x2, x0, x2, lsl 6
-	add	x0, x3, :lo12:.LANCHOR5
-	ldrh	w1, [x2,48]
-	ldr	x0, [x0,248]
-	ldr	w5, [x2,40]
-	str	w5, [x0,x1,lsl 2]
-	b	.L3857
-.L3941:
-	adrp	x0, .LANCHOR2
-	add	x0, x0, :lo12:.LANCHOR2
-	add	x0, x0, 2136
-	ldrh	w0, [x0,w26,sxtw 1]
-	cmp	w0, w26
-	bcs	.L3837
-	tbz	x27, 0, .L3837
-	ldr	x0, [x1,1336]
-	mov	w2, -1
-	ldr	x4, [x29,176]
-	add	x3, x3, :lo12:.LANCHOR5
-	strb	w2, [x0,x4]
-	add	x2, x29, 192
-	ldr	w0, [x29,160]
-	ldr	x0, [x2,w0,sxtw 3]
-	ldrh	w2, [x29,128]
-	strh	w2, [x0,48]
-	ldrb	w2, [x0,1]
-	ldr	x0, [x1,1336]
-	ldr	x1, [x29,120]
-	strb	w2, [x0,x1]
-	mov	w1, -1
-	ldr	x0, [x3,240]
-	str	w1, [x0,x4,lsl 2]
-	b	.L3837
-.L3942:
-	add	x1, x21, :lo12:.LANCHOR3
-	ldrb	w0, [x1,1328]
-	cmp	w0, 3
-	add	x0, x29, 192
-	bne	.L3839
-	add	x2, x19, :lo12:.LANCHOR0
-	ldrb	w2, [x2,1268]
-	cbz	w2, .L3840
-	ldr	w1, [x29,168]
-	sub	w2, w1, #1
-	mov	w1, 0
-.L3841:
-	cmp	w1, w2
-	bge	.L3935
-	ldr	x3, [x0,w1,sxtw 3]
+	add	x5, x21, :lo12:.LANCHOR0
+	add	x5, x5, 1304
+	add	x1, x5, x1, lsl 6
+	ldr	x5, [x0, 296]
+	mov	w0, 3
+	udiv	w0, w27, w0
+	ldrh	w6, [x1, 48]
+	ldr	w1, [x1, 40]
+	add	w0, w0, w0, lsl 1
+	sub	w0, w27, w0
+	and	w0, w0, 65535
+	add	w0, w0, 1
+	orr	w0, w1, w0, lsl 24
+	str	w0, [x5, x6, lsl 2]
+.L3797:
+	add	x1, x22, :lo12:.LANCHOR3
+	ldrb	w0, [x1, 1950]
+	cbz	w0, .L3779
+	adrp	x0, .LANCHOR2
+	add	x0, x0, :lo12:.LANCHOR2
+	add	x0, x0, 2136
+	ldrh	w0, [x0, w26, sxtw 1]
+	cmp	w0, w26
+	bcs	.L3779
+	tbz	x27, 0, .L3779
+	ldr	x0, [x1, 1328]
+	mov	w5, -1
+	ldr	x4, [x29, 168]
+	strb	w5, [x0, x4]
+	ldr	x0, [x3, x2, lsl 3]
+	ldrh	w2, [x29, 152]
+	strh	w2, [x0, 48]
+	ldrb	w2, [x0, 1]
+	ldr	x0, [x1, 1328]
+	ldr	x1, [x29, 120]
+	strb	w2, [x0, x1]
+	adrp	x0, .LANCHOR5
+	add	x0, x0, :lo12:.LANCHOR5
+	mov	w1, -1
+	ldr	x0, [x0, 288]
+	str	w1, [x0, x4, lsl 2]
+.L3779:
+	ldr	w0, [x29, 160]
+	add	w0, w0, 1
+	str	w0, [x29, 160]
+	b	.L3756
+.L3775:
+	ldr	x4, [x29, 184]
+	add	w0, w0, w19
+	add	x0, x4, w0, sxtw 1
+	ldrh	w0, [x0, 16]
+	madd	w0, w0, w8, w26
+	b	.L3871
+.L3771:
+	cmp	w0, 2
+	bne	.L3778
+	ldrb	w0, [x5, 1322]
+	ldrh	w7, [x5, 1410]
+	cbnz	w0, .L3777
+	ldr	w0, [x29, 164]
+	add	w5, w19, w0
+	ldr	x0, [x29, 184]
+	add	x5, x0, w5, sxtw 1
+	ldrh	w0, [x5, 16]
+	madd	w0, w0, w7, w26
+.L3868:
+	orr	w0, w0, 33554432
+	str	w0, [x6, 40]
+	b	.L3778
+.L3777:
+	ldr	x0, [x29, 184]
+	add	w5, w19, w27, lsr 1
+	add	x5, x0, w5, sxtw 1
+	ldrh	w0, [x5, 16]
+	and	w5, w27, 1
+	madd	w0, w0, w7, w26
+	add	w0, w0, w5
+	b	.L3868
+.L3784:
+	ldr	x3, [x0, w1, sxtw 3]
 	add	w1, w1, 1
-	ldr	x5, [x0,w1,sxtw 3]
-	uxth	w1, w1
-	ldrb	w5, [x5,1]
+	ldr	x5, [x0, w1, sxtw 3]
+	and	w1, w1, 65535
+	ldrb	w5, [x5, 1]
 	strb	w5, [x3]
-	b	.L3841
-.L3840:
-	ldrb	w1, [x1,1344]
-	cbnz	w1, .L3934
-	cmp	w25, 1
+	b	.L3783
+.L3782:
+	ldrb	w2, [x1, 1336]
+	ldr	x1, [x29, 192]
+	cbz	w2, .L3786
+.L3789:
+	strb	wzr, [x1, 60]
+	b	.L3788
+.L3786:
+	ldr	w2, [x29, 180]
+	cmp	w2, 1
+	bne	.L3787
 	mov	w2, 9
-	beq	.L3934
-	cmp	w25, 2
-	bne	.L3847
-	mov	w2, 13
-.L3934:
-	ldr	x1, [x29,192]
-	strb	w2, [x1,60]
-	b	.L3846
-.L3847:
-	ldr	x2, [x29,192]
-	strb	w1, [x2,60]
-.L3846:
+.L3869:
+	strb	w2, [x1, 60]
+.L3788:
+	mov	w2, w23
 	add	x1, x0, 24
-	mov	w2, w24
 	bl	sblk_xlc_prog_pages
-	b	.L3843
-.L3839:
-	ldrb	w2, [x1,1330]
-	cbz	w2, .L3848
-	ldrb	w1, [x1,1331]
-	cbnz	w1, .L3849
-.L3848:
-	ldr	w1, [x29,168]
-	sub	w2, w1, #1
-	mov	w1, 0
-	b	.L3850
-.L3849:
-	mov	w1, w24
-	bl	sblk_3d_mlc_prog_pages
-	b	.L3843
-.L3850:
+.L3785:
+	add	x0, x22, :lo12:.LANCHOR3
+	ldrb	w1, [x0, 1336]
+	cbz	w1, .L3794
+	ldr	w0, [x29, 128]
+	add	w23, w23, w0
+	and	w23, w23, 65535
+.L3795:
+	add	x21, x21, :lo12:.LANCHOR0
+	add	x22, x22, :lo12:.LANCHOR3
+	ldr	x1, [x21, 3384]
+	ldr	w0, [x1, 52]
+	add	w0, w0, w23
+	str	w0, [x1, 52]
+	ldr	x1, [x29, 184]
+	ldrh	w0, [x21, 5522]
+	add	w23, w23, w0
+	ldrh	w0, [x22, 1338]
+	and	w23, w23, 65535
+	strh	w23, [x21, 5522]
+	ldrb	w1, [x1, 9]
+	mul	w0, w0, w1
+	cmp	w23, w0
+	blt	.L3796
+	ldr	x0, [x21, 1128]
+	strh	wzr, [x0, 86]
+.L3796:
+	bl	gc_write_completed
+	b	.L3733
+.L3787:
+	ldr	w2, [x29, 180]
+	cmp	w2, 2
+	bne	.L3789
+	mov	w2, 13
+	b	.L3869
+.L3781:
+	ldrb	w2, [x1, 1322]
+	cbz	w2, .L3807
+	ldrb	w1, [x1, 1323]
+	cbnz	w1, .L3791
+.L3790:
+	ldr	w2, [x29, 176]
+	sub	w2, w2, #1
+.L3792:
 	cmp	w1, w2
-	bge	.L3935
-	ldr	x3, [x0,w1,sxtw 3]
+	bge	.L3870
+	ldr	x3, [x0, w1, sxtw 3]
 	add	w1, w1, 1
-	ldr	x5, [x0,w1,sxtw 3]
-	uxth	w1, w1
-	ldrb	w5, [x5,1]
+	ldr	x5, [x0, w1, sxtw 3]
+	and	w1, w1, 65535
+	ldrb	w5, [x5, 1]
 	strb	w5, [x3]
-	b	.L3850
-.L3935:
-	ldr	x0, [x0,w2,sxtw 3]
-	mov	w1, -1
-	strb	w1, [x0]
-	ldr	x0, [x29,192]
-	ldrb	w1, [x29,168]
-	bl	sblk_prog_page
-.L3843:
-	add	x1, x21, :lo12:.LANCHOR3
-	ldrb	w0, [x1,1344]
-	cbz	w0, .L3852
-	add	w0, w24, w24, lsl 1
-	b	.L3853
-.L3852:
-	ldrb	w0, [x1,1330]
-	cbz	w0, .L3854
-	lsl	w0, w24, 1
-	b	.L3853
-.L3854:
-	add	x0, x19, :lo12:.LANCHOR0
-	ldrb	w2, [x0,1268]
-	mov	w0, w24
-	cbz	w2, .L3853
-	ldrb	w1, [x1,1956]
-	ldrh	w0, [x29,168]
-	cbz	w1, .L3853
-	adrp	x1, .LANCHOR2
-	add	x1, x1, :lo12:.LANCHOR2
-	add	x1, x1, 2136
-	ldrh	w1, [x1,w26,sxtw 1]
-	cmp	w1, w26
-	csel	w0, w0, w24, cs
-.L3853:
-	add	x19, x19, :lo12:.LANCHOR0
-	add	x21, x21, :lo12:.LANCHOR3
-	ldr	x2, [x19,3392]
-	ldr	w1, [x2,52]
-	add	w1, w1, w0
-	str	w1, [x2,52]
-	ldr	x2, [x29,184]
-	ldrh	w1, [x19,5530]
-	add	w0, w0, w1
-	ldrh	w1, [x21,1346]
-	uxth	w0, w0
-	strh	w0, [x19,5530]
-	ldrb	w2, [x2,9]
-	mul	w1, w1, w2
-	cmp	w0, w1
-	blt	.L3855
-	ldr	x0, [x19,1120]
-	strh	wzr, [x0,86]
-.L3855:
-	bl	gc_write_completed
-.L3783:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 240
-	ret
+	b	.L3792
+.L3807:
+	mov	w1, 0
+	b	.L3790
+.L3791:
+	mov	w1, w23
+	bl	sblk_3d_mlc_prog_pages
+	b	.L3785
+.L3794:
+	ldrb	w1, [x0, 1322]
+	cbnz	w1, .L3808
+	add	x1, x21, :lo12:.LANCHOR0
+	ldrb	w1, [x1, 1212]
+	cbz	w1, .L3795
+	ldrb	w0, [x0, 1950]
+	ldrh	w1, [x29, 176]
+	cbz	w0, .L3809
+	adrp	x0, .LANCHOR2
+	add	x0, x0, :lo12:.LANCHOR2
+	add	x0, x0, 2136
+	ldrh	w0, [x0, w26, sxtw 1]
+	cmp	w0, w26
+	csel	w23, w23, w1, cc
+	b	.L3795
+.L3808:
+	ldr	w23, [x29, 156]
+	b	.L3795
+.L3809:
+	mov	w23, w1
+	b	.L3795
 	.size	gc_do_copy_back, .-gc_do_copy_back
 	.align	2
 	.global	zftl_do_gc
 	.type	zftl_do_gc, %function
 zftl_do_gc:
 	sub	sp, sp, #128
-	stp	x29, x30, [sp,16]
+	stp	x29, x30, [sp, 16]
 	add	x29, sp, 16
-	stp	x19, x20, [sp,32]
+	stp	x19, x20, [sp, 32]
 	adrp	x19, .LANCHOR0
-	adrp	x20, .LANCHOR5
-	stp	x25, x26, [sp,80]
-	mov	w26, w0
+	stp	x27, x28, [sp, 96]
+	mov	w27, w0
 	add	x0, x19, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,48]
-	stp	x23, x24, [sp,64]
-	stp	x27, x28, [sp,96]
-	cmp	w26, 1
-	ldrh	w23, [x0,3380]
-	ldrh	w22, [x0,3376]
-	ldr	x24, [x0,1120]
-	add	w22, w23, w22
-	ldrh	w25, [x0,3378]
-	uxth	w22, w22
-	beq	.L3944
-.L3955:
+	stp	x21, x22, [sp, 48]
+	stp	x23, x24, [sp, 64]
+	cmp	w27, 1
+	stp	x25, x26, [sp, 80]
+	adrp	x20, .LANCHOR5
+	ldrh	w24, [x0, 3372]
+	ldrh	w22, [x0, 3368]
+	ldrh	w23, [x0, 3370]
+	add	w22, w24, w22
+	ldr	x25, [x0, 1128]
+	and	w22, w22, 65535
+	beq	.L3873
+.L3885:
 	add	x0, x20, :lo12:.LANCHOR5
-	mov	w1, 16
-	ldrb	w2, [x0,218]
-	cmp	w2, 6
-	bhi	.L4140
-	adrp	x0, .L3947
-	add	x0, x0, :lo12:.L3947
-	ldrh	w0, [x0,w2,uxtw #1]
-	adr	x1, .Lrtx3947
+	ldrb	w1, [x0, 264]
+	cmp	w1, 6
+	bhi	.L4000
+	adrp	x0, .L3876
+	add	x0, x0, :lo12:.L3876
+	ldrh	w0, [x0,w1,uxtw #1]
+	adr	x1, .Lrtx3876
 	add	x0, x1, w0, sxth #2
 	br	x0
-.Lrtx3947:
+.Lrtx3876:
 	.section	.rodata
 	.align	0
 	.align	2
-.L3947:
-	.2byte	(.L3946 - .Lrtx3947) / 4
-	.2byte	(.L3948 - .Lrtx3947) / 4
-	.2byte	(.L3949 - .Lrtx3947) / 4
-	.2byte	(.L3950 - .Lrtx3947) / 4
-	.2byte	(.L3951 - .Lrtx3947) / 4
-	.2byte	(.L4073 - .Lrtx3947) / 4
-	.2byte	(.L3953 - .Lrtx3947) / 4
+.L3876:
+	.2byte	(.L3875 - .Lrtx3876) / 4
+	.2byte	(.L3877 - .Lrtx3876) / 4
+	.2byte	(.L3878 - .Lrtx3876) / 4
+	.2byte	(.L3879 - .Lrtx3876) / 4
+	.2byte	(.L3880 - .Lrtx3876) / 4
+	.2byte	(.L3881 - .Lrtx3876) / 4
+	.2byte	(.L3882 - .Lrtx3876) / 4
 	.text
-.L3944:
+.L3881:
+	add	x21, x19, :lo12:.LANCHOR0
+	mov	w23, 0
+	add	x21, x21, 3416
+.L3883:
+	bl	gc_check_data_one_wl
+	cbz	w0, .L3996
+	add	x19, x19, :lo12:.LANCHOR0
+	add	x20, x20, :lo12:.LANCHOR5
+	ldr	x0, [x19, 1128]
+	strh	wzr, [x19, 3472]
+	ldrh	w0, [x0, 80]
+	bl	ftl_free_sblk
+	ldr	x1, [x19, 1128]
+	mov	w0, -1
+	ldr	x2, [x19, 3384]
+	strh	w0, [x1, 80]
+	strh	w0, [x2, 126]
+	strh	w0, [x1, 130]
+	ldr	x0, [x19, 3424]
+	bl	zbuf_free
+	strb	wzr, [x20, 264]
+	str	xzr, [x19, 3424]
+	b	.L4090
+.L3873:
 	add	x0, x20, :lo12:.LANCHOR5
-	ldr	w21, [x0,1004]
-	cbnz	w21, .L3954
-	ldr	w0, [x0,1008]
-	cbz	w0, .L3955
-.L3954:
-	adrp	x0, .LANCHOR3+1388
-	ldrh	w0, [x0,#:lo12:.LANCHOR3+1388]
+	ldr	w21, [x0, 468]
+	cbnz	w21, .L3884
+	ldr	w0, [x0, 472]
+	cbz	w0, .L3885
+.L3884:
+	adrp	x0, .LANCHOR3+1380
+	ldrh	w0, [x0, #:lo12:.LANCHOR3+1380]
 	cmp	w22, w0, lsr 2
-	bls	.L3955
+	bls	.L3885
 	add	x0, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x0,3400]
+	ldrh	w0, [x0, 3392]
 	cmp	w0, w22
-	bcs	.L3955
+	bcs	.L3885
 	add	w21, w21, 20
 	bl	timer_get_time
 	cmp	w21, w0
-	bcs	.L3956
+	bcs	.L3886
 	add	x0, x20, :lo12:.LANCHOR5
-	str	wzr, [x0,1004]
-.L3956:
-	add	x27, x20, :lo12:.LANCHOR5
-	ldr	w21, [x27,1008]
+	str	wzr, [x0, 468]
+.L3886:
+	add	x26, x20, :lo12:.LANCHOR5
+	ldr	w21, [x26, 472]
 	bl	timer_get_time
 	add	w21, w21, 20
 	cmp	w21, w0
-	bcs	.L3957
-	str	wzr, [x27,1008]
-.L3957:
+	bcs	.L3887
+	str	wzr, [x26, 472]
+.L3887:
 	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x0, [x0,1120]
-	ldrh	w0, [x0,124]
-	cbz	w0, .L4180
-	b	.L3955
-.L3946:
+	ldr	x0, [x0, 1128]
+	ldrh	w0, [x0, 124]
+	cbnz	w0, .L3885
+.L4000:
+	mov	w23, 16
+	b	.L3872
+.L3875:
 	add	x0, x19, :lo12:.LANCHOR0
-	add	w23, w25, w23
-	ldrh	w2, [x24,80]
-	uxth	w23, w23
-	ldrh	w1, [x0,3382]
-	ldrh	w25, [x0,3384]
-	add	w25, w25, w1
+	ldrh	w2, [x25, 80]
+	add	w24, w24, w23
+	and	w24, w24, 65535
+	ldrh	w1, [x0, 3376]
+	ldrh	w26, [x0, 3374]
+	add	w26, w26, w1
 	mov	w1, 65535
+	and	w26, w26, 65535
 	cmp	w2, w1
-	uxth	w25, w25
-	beq	.L3958
-	cbnz	w26, .L3959
-	ldrh	w0, [x0,3400]
+	beq	.L3888
+	cbnz	w27, .L3889
+	ldrh	w0, [x0, 3392]
 	cmp	w22, w0, lsl 1
-	bge	.L4180
-.L3959:
+	bge	.L4000
+.L3889:
 	adrp	x21, .LANCHOR3
-	add	x26, x21, :lo12:.LANCHOR3
-	add	x0, x26, 1376
-	ldrh	w1, [x26,1386]
+	add	x5, x21, :lo12:.LANCHOR3
+	add	x0, x5, 1368
+	ldrh	w1, [x5, 1378]
 	add	w1, w1, 1
-	uxth	w1, w1
-	strh	w1, [x26,1386]
+	and	w1, w1, 65535
+	strh	w1, [x5, 1378]
 	bl	_list_get_gc_head_node
-	uxth	w2, w0
+	and	w2, w0, 65535
 	mov	w1, 65535
 	cmp	w2, w1
-	beq	.L3961
+	beq	.L3891
 	add	x3, x20, :lo12:.LANCHOR5
 	ubfiz	x2, x2, 1, 16
-	ldr	w1, [x3,220]
+	ldr	w1, [x3, 268]
 	add	w1, w1, 1
-	str	w1, [x3,220]
+	str	w1, [x3, 268]
 	add	x3, x19, :lo12:.LANCHOR0
-	ldr	x4, [x3,1112]
-	ldrh	w2, [x4,x2]
-	ldrh	w4, [x26,1384]
+	ldr	x4, [x3, 1120]
+	ldrh	w2, [x4, x2]
+	ldrh	w4, [x5, 1376]
 	cmp	w4, w2
-	bcs	.L3962
-	ldrh	w4, [x3,1088]
+	bcs	.L3892
+	ldrh	w4, [x3, 1096]
 	cmp	w1, w4, lsr 4
-	bls	.L3961
-	ldrh	w1, [x3,3402]
+	bls	.L3891
+	ldrh	w1, [x3, 3406]
 	cmp	w1, w2
-	bls	.L3961
-.L3962:
-	add	x2, x21, :lo12:.LANCHOR3
+	bls	.L3891
+.L3892:
+	add	x1, x21, :lo12:.LANCHOR3
+	ldrb	w2, [x1, 1337]
 	mov	w1, 0
-	ldrb	w2, [x2,1345]
 	bl	gc_add_sblk
-	cbz	w0, .L3963
+	cbz	w0, .L3893
 	add	x20, x20, :lo12:.LANCHOR5
 	mov	w0, 1
-	str	wzr, [x20,220]
-	strb	w0, [x20,218]
-	b	.L4180
-.L3961:
+	str	wzr, [x20, 268]
+	strb	w0, [x20, 264]
+	b	.L4000
+.L3891:
 	add	x0, x21, :lo12:.LANCHOR3
-	strh	wzr, [x0,1386]
-.L3963:
-	cmp	w23, 15
-	mov	w26, 2
-	bls	.L3964
-	cbz	w25, .L4075
+	strh	wzr, [x0, 1378]
+.L3893:
+	cmp	w24, 15
+	bls	.L4002
 	add	x1, x19, :lo12:.LANCHOR0
 	add	x0, x21, :lo12:.LANCHOR3
-	mov	w26, 1
-	ldrh	w1, [x1,3386]
-	ldrh	w0, [x0,1390]
+	ldrh	w1, [x1, 3378]
+	ldrh	w0, [x0, 1382]
 	cmp	w1, w0
-	bls	.L3964
-.L4075:
-	mov	w26, 2
-.L3964:
+	bhi	.L4002
+	cmp	w26, 0
+	cset	w23, eq
+	add	w23, w23, 1
+.L3894:
 	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 8, .L3965
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 8, .L3895
 	add	x19, x19, :lo12:.LANCHOR0
-	add	x1, x21, :lo12:.LANCHOR3
+	mov	w4, w24
 	mov	w3, w22
-	mov	w4, w23
-	ldr	x0, [x19,1120]
-	ldrb	w2, [x1,1345]
 	mov	w1, 2807
-	ldrh	w5, [x0,124]
-	ldrh	w6, [x0,120]
-	ldrh	w7, [x0,122]
-	ldrh	w0, [x24,80]
+	ldr	x0, [x19, 1128]
+	ldrh	w7, [x0, 122]
+	ldrh	w6, [x0, 120]
+	ldrh	w5, [x0, 124]
+	add	x0, x21, :lo12:.LANCHOR3
+	ldrb	w2, [x0, 1337]
+	ldrh	w0, [x25, 80]
 	str	w0, [sp]
 	adrp	x0, .LC299
 	add	x0, x0, :lo12:.LC299
 	bl	printk
-.L3965:
+.L3895:
 	add	x21, x21, :lo12:.LANCHOR3
-	mov	w1, w26
 	mov	w2, 1
-	ldrb	w0, [x21,1345]
+	mov	w1, w23
+	ldrb	w0, [x21, 1337]
 	bl	gc_search_src_blk
-	cmp	w0, wzr
-	ble	.L3966
-.L3967:
+	cmp	w0, 0
+	ble	.L3896
+.L3897:
 	add	x20, x20, :lo12:.LANCHOR5
 	mov	w0, 1
-	b	.L4182
-.L3966:
-	ldrb	w0, [x21,1345]
-	mov	w1, 3
+.L4092:
+	strb	w0, [x20, 264]
+	b	.L4000
+.L4002:
+	mov	w23, 2
+	b	.L3894
+.L3896:
+	ldrb	w0, [x21, 1337]
 	mov	w2, 1
+	mov	w1, 3
 	bl	gc_search_src_blk
-	cmp	w0, wzr
-	bgt	.L3967
-	b	.L4180
-.L3958:
-	cmp	w26, 1
-	bne	.L3968
-	ldr	x1, [x0,3392]
-	ldrh	w1, [x1,150]
-	cbz	w1, .L3969
-	ldrh	w0, [x0,3380]
+	cmp	w0, 0
+	bgt	.L3897
+	b	.L4000
+.L3888:
+	cmp	w27, 1
+	bne	.L3898
+	ldr	x1, [x0, 3384]
+	ldrh	w1, [x1, 150]
+	cbz	w1, .L3899
+	ldrh	w0, [x0, 3372]
 	cmp	w0, 8
-	bls	.L3969
+	bls	.L3899
 	bl	gc_ink_check_sblk
-.L3969:
+.L3899:
 	bl	gc_scan_static_data
 	adrp	x21, .LANCHOR3
 	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x0, [x0,1120]
-	ldrh	w0, [x0,122]
-	cbz	w0, .L3970
-.L3971:
+	ldr	x0, [x0, 1128]
+	ldrh	w0, [x0, 122]
+	cbz	w0, .L3900
+.L3901:
 	add	x21, x21, :lo12:.LANCHOR3
 	mov	w0, 1
 	add	x20, x20, :lo12:.LANCHOR5
-	strb	w0, [x21,1345]
-.L4182:
-	strb	w0, [x20,218]
-	b	.L4180
-.L3970:
+	strb	w0, [x21, 1337]
+	b	.L4092
+.L3900:
 	bl	gc_static_wearleveling
-	cbnz	w0, .L3971
+	mov	w23, w0
+	cbnz	w0, .L3901
 	bl	gc_block_vpn_scan
-	cbz	w23, .L3972
-	cmp	w22, w25
-	bcs	.L3973
+	cbz	w24, .L3902
+	cmp	w22, w26
+	bcs	.L3903
 	add	x0, x21, :lo12:.LANCHOR3
-	ldrh	w0, [x0,1388]
+	ldrh	w0, [x0, 1380]
 	cmp	w0, w22
-	bhi	.L3974
-.L3973:
+	bhi	.L3904
+.L3903:
 	add	x1, x21, :lo12:.LANCHOR3
-	add	w0, w22, w25
-	ldrh	w2, [x1,1388]
+	add	w0, w22, w26
+	ldrh	w2, [x1, 1380]
 	cmp	w0, w2
-	blt	.L3974
+	blt	.L3904
 	add	x0, x19, :lo12:.LANCHOR0
-	ldrh	w2, [x0,3386]
-	ldrh	w0, [x1,1390]
+	ldrh	w2, [x0, 3378]
+	ldrh	w0, [x1, 1382]
 	cmp	w2, w0
-	bcc	.L3972
-.L3974:
-	add	x24, x21, :lo12:.LANCHOR3
+	bcc	.L3902
+.L3904:
+	add	x5, x21, :lo12:.LANCHOR3
 	mov	w0, 1
-	strb	w0, [x24,1345]
+	strb	w0, [x5, 1337]
 	mov	w0, 16
 	bl	zftl_get_gc_node.part.10
-	uxth	w1, w0
+	and	w1, w0, 65535
 	mov	w2, 65535
 	cmp	w1, w2
-	beq	.L3975
+	beq	.L3905
 	add	x2, x19, :lo12:.LANCHOR0
 	ubfiz	x1, x1, 1, 16
-	ldr	x3, [x2,1112]
+	ldr	x3, [x2, 1120]
 	add	x2, x20, :lo12:.LANCHOR5
-	ldrh	w3, [x3,x1]
-	ldrh	w1, [x2,224]
+	ldrh	w3, [x3, x1]
+	ldrh	w1, [x2, 272]
 	cmp	w3, w1
-	bcs	.L3975
+	bcs	.L3905
 	cmp	w22, 2
-	bls	.L3975
-	str	wzr, [x2,220]
+	bls	.L3905
+	str	wzr, [x2, 268]
 	mov	w1, 1
+	strb	wzr, [x5, 1337]
 	mov	w2, 0
-	strb	wzr, [x24,1345]
 	bl	gc_add_sblk
-	cbnz	w0, .L3967
-.L3975:
-	add	x24, x21, :lo12:.LANCHOR3
+	cbnz	w0, .L3897
+.L3905:
+	add	x5, x21, :lo12:.LANCHOR3
 	mov	w1, 0
-	add	x0, x24, 1368
+	add	x0, x5, 1360
 	bl	_list_get_gc_head_node
-	uxth	w1, w0
+	and	w1, w0, 65535
 	mov	w2, 65535
 	cmp	w1, w2
-	beq	.L3976
+	beq	.L3906
 	add	x2, x19, :lo12:.LANCHOR0
 	ubfiz	x1, x1, 1, 16
-	ldr	x3, [x2,1112]
+	ldr	x3, [x2, 1120]
 	add	x2, x20, :lo12:.LANCHOR5
-	ldrh	w3, [x3,x1]
-	ldrh	w1, [x2,224]
+	ldrh	w3, [x3, x1]
+	ldrh	w1, [x2, 272]
 	cmp	w3, w1
-	bcs	.L3976
+	bcs	.L3906
 	cmp	w22, 2
-	bls	.L3976
-	str	wzr, [x2,220]
+	bls	.L3906
+	str	wzr, [x2, 268]
 	mov	w1, 1
+	strb	wzr, [x5, 1337]
 	mov	w2, 0
-	strb	wzr, [x24,1345]
 	bl	gc_add_sblk
-	cbnz	w0, .L3967
-.L3976:
+	cbnz	w0, .L3897
+.L3906:
 	add	x1, x20, :lo12:.LANCHOR5
 	add	x2, x21, :lo12:.LANCHOR3
-	ldrh	w0, [x1,224]
-	ldrh	w24, [x2,1384]
+	ldrh	w0, [x1, 272]
+	ldrh	w8, [x2, 1376]
 	add	w0, w0, 1
-	uxth	w0, w0
-	strh	w0, [x1,224]
-	cmp	w0, w24, lsr 5
-	bls	.L3977
+	and	w0, w0, 65535
+	strh	w0, [x1, 272]
+	cmp	w0, w8, lsr 5
+	bls	.L3907
 	mov	w0, 4
-	strh	w0, [x1,224]
-.L3977:
-	add	x28, x20, :lo12:.LANCHOR5
-	add	x2, x19, :lo12:.LANCHOR0
-	add	x27, x21, :lo12:.LANCHOR3
-	ldr	w0, [x28,220]
-	ldrh	w1, [x2,1088]
+	strh	w0, [x1, 272]
+.L3907:
+	add	x6, x20, :lo12:.LANCHOR5
+	add	x7, x19, :lo12:.LANCHOR0
+	add	x5, x21, :lo12:.LANCHOR3
+	ldr	w0, [x6, 268]
+	ldrh	w1, [x7, 1096]
 	add	w0, w0, 1
-	strh	wzr, [x27,1360]
-	str	w0, [x28,220]
-	strh	wzr, [x27,1362]
+	strh	wzr, [x5, 1352]
+	strh	wzr, [x5, 1354]
+	strh	wzr, [x5, 1356]
 	cmp	w0, w1, lsr 5
-	strh	wzr, [x27,1364]
-	bls	.L3978
-	ldrh	w0, [x2,3386]
-	cmp	w0, w23
-	bls	.L3978
+	str	w0, [x6, 268]
+	bls	.L3908
+	ldrh	w0, [x7, 3378]
+	cmp	w0, w24
+	bls	.L3908
 	mov	w1, 0
-	add	x0, x27, 1376
-	str	x2, [x29,104]
+	add	x0, x5, 1368
 	bl	_list_get_gc_head_node
-	uxth	w0, w0
+	and	w0, w0, 65535
 	mov	w1, 65535
 	cmp	w0, w1
-	beq	.L4174
-	ldr	x2, [x29,104]
+	bne	.L3909
+.L4082:
+	mov	w23, 16
+	b	.L3910
+.L3909:
+	ldr	x1, [x7, 1120]
 	ubfiz	x0, x0, 1, 16
-	ldr	x1, [x2,1112]
-	ldrh	w1, [x1,x0]
-	ldrb	w0, [x27,1329]
-	mul	w0, w24, w0
-	mov	w24, 16
+	ldrh	w1, [x1, x0]
+	ldrb	w0, [x5, 1321]
+	mul	w0, w0, w8
 	cmp	w1, w0
-	bgt	.L3984
-	str	wzr, [x28,220]
+	bgt	.L4082
+	ldrb	w0, [x5, 1337]
+	mov	w2, 4
 	mov	w1, 2
-	ldrb	w0, [x27,1345]
-	b	.L4173
-.L3978:
+	str	wzr, [x6, 268]
+.L4081:
+	bl	gc_search_src_blk
+	and	w0, w0, 65535
+	cbz	w0, .L4082
+	b	.L3897
+.L3908:
 	add	x0, x19, :lo12:.LANCHOR0
-	add	x1, x21, :lo12:.LANCHOR3
-	ldrh	w3, [x0,3386]
-	ldrh	w2, [x1,1390]
-	cmp	w3, w2
-	bcc	.L3981
-	ldrb	w0, [x1,1345]
+	add	x3, x21, :lo12:.LANCHOR3
+	ldrh	w2, [x0, 3378]
+	ldrh	w1, [x3, 1382]
+	cmp	w2, w1
+	bcc	.L3913
 	mov	w2, 1
 	mov	w1, 2
-	b	.L4172
-.L3981:
-	ldrh	w1, [x0,3382]
-	cbnz	w1, .L3982
-	ldrh	w1, [x0,3384]
+	ldrb	w0, [x3, 1337]
+	b	.L4081
+.L3913:
+	ldrh	w1, [x0, 3374]
+	cbnz	w1, .L3914
+	ldrh	w1, [x0, 3376]
 	cmp	w1, 8
-	bls	.L3983
-.L3982:
+	bls	.L3915
+.L3914:
 	add	x21, x21, :lo12:.LANCHOR3
-	mov	w1, 1
-	ldrb	w0, [x21,1345]
-.L4173:
 	mov	w2, 4
-.L4172:
-	bl	gc_search_src_blk
-	uxth	w0, w0
-	cbnz	w0, .L3967
-	b	.L4174
-.L3983:
-	ldrh	w0, [x0,5534]
-	mov	w24, 16
-	cmp	w0, wzr
-	csel	w24, w24, wzr, ne
-	b	.L3984
-.L3972:
-	add	x21, x21, :lo12:.LANCHOR3
-	add	x0, x20, :lo12:.LANCHOR5
-	ldrh	w2, [x21,1384]
-	ldrh	w1, [x0,224]
-	cmp	w1, w2, lsr 5
-	bcc	.L4174
-	mov	w1, 4
-	strh	w1, [x0,224]
-.L4174:
-	mov	w24, 16
-	b	.L3984
-.L3968:
-	ldrh	w1, [x0,3400]
-	cmp	w1, w22
-	bcs	.L4174
-	ldr	x0, [x0,1120]
-	ldrh	w0, [x0,124]
-	cbz	w0, .L4180
-	b	.L4174
-.L3984:
+	mov	w1, 1
+	ldrb	w0, [x21, 1337]
+	b	.L4081
+.L3915:
+	ldrh	w0, [x0, 5526]
+	cbnz	w0, .L4082
+.L3910:
 	add	x0, x19, :lo12:.LANCHOR0
 	adrp	x21, .LANCHOR3
-	ldr	w1, [x0,3412]
-	cbz	w1, .L3986
-	str	wzr, [x0,3412]
-	cmp	w22, 15
+	ldr	w1, [x0, 3396]
+	cbz	w1, .L3916
+	str	wzr, [x0, 3396]
+	cmp	w24, 0
+	ccmp	w22, 15, 2, ne
 	add	x0, x21, :lo12:.LANCHOR3
-	bhi	.L4083
-	cbnz	w23, .L3987
-.L4083:
-	strb	wzr, [x0,1345]
-	b	.L3989
-.L3987:
-	mov	w1, 1
-	strb	w1, [x0,1345]
-.L3989:
-	add	x27, x21, :lo12:.LANCHOR3
+	bls	.L3917
+	strb	wzr, [x0, 1337]
+.L3918:
+	add	x5, x21, :lo12:.LANCHOR3
 	mov	w1, 0
-	add	x0, x27, 1376
+	add	x0, x5, 1368
 	bl	_list_get_gc_head_node
-	uxth	w1, w0
+	and	w1, w0, 65535
 	mov	w2, 65535
 	cmp	w1, w2
-	beq	.L3990
+	beq	.L3919
 	add	x2, x19, :lo12:.LANCHOR0
 	ubfiz	x1, x1, 1, 16
-	ldr	x3, [x2,1112]
-	ldrh	w1, [x3,x1]
+	ldr	x3, [x2, 1120]
+	ldrh	w1, [x3, x1]
 	cmp	w1, 8
-	bhi	.L3990
+	bhi	.L3919
 	mov	w1, 1
-	str	w1, [x2,3412]
-	ldrb	w2, [x27,1345]
+	str	w1, [x2, 3396]
+	ldrb	w2, [x5, 1337]
 	mov	w1, 0
 	bl	gc_add_sblk
-	cbnz	w0, .L3967
-.L3990:
-	add	x27, x21, :lo12:.LANCHOR3
+	cbnz	w0, .L3897
+.L3919:
+	add	x5, x21, :lo12:.LANCHOR3
 	mov	w1, 0
-	add	x0, x27, 1368
+	add	x0, x5, 1360
 	bl	_list_get_gc_head_node
-	uxth	w1, w0
+	and	w1, w0, 65535
 	mov	w2, 65535
 	cmp	w1, w2
-	beq	.L3991
+	beq	.L3920
 	add	x2, x19, :lo12:.LANCHOR0
 	ubfiz	x1, x1, 1, 16
-	ldr	x3, [x2,1112]
-	ldrh	w1, [x3,x1]
+	ldr	x3, [x2, 1120]
+	ldrh	w1, [x3, x1]
 	cmp	w1, 4
-	bhi	.L3991
+	bhi	.L3920
 	mov	w1, 1
-	str	w1, [x2,3412]
-	ldrb	w2, [x27,1345]
+	str	w1, [x2, 3396]
+	ldrb	w2, [x5, 1337]
 	mov	w1, 0
 	bl	gc_add_sblk
-	cbnz	w0, .L3967
-.L3991:
+	cbnz	w0, .L3897
+.L3920:
 	mov	w0, 0
 	bl	zftl_get_gc_node.part.10
-	uxth	w1, w0
+	and	w1, w0, 65535
 	mov	w2, 65535
 	cmp	w1, w2
-	beq	.L3986
+	beq	.L3916
 	add	x2, x19, :lo12:.LANCHOR0
 	ubfiz	x1, x1, 1, 16
-	ldr	x3, [x2,1112]
-	ldrh	w1, [x3,x1]
+	ldr	x3, [x2, 1120]
+	ldrh	w1, [x3, x1]
 	cmp	w1, 4
-	bhi	.L3986
+	bhi	.L3916
 	mov	w1, 1
-	str	w1, [x2,3412]
+	str	w1, [x2, 3396]
 	add	x2, x21, :lo12:.LANCHOR3
-	ldrb	w2, [x2,1345]
+	ldrb	w2, [x2, 1337]
 	bl	gc_add_sblk
-	cbnz	w0, .L3967
-.L3986:
+	cbnz	w0, .L3897
+.L3916:
 	add	x28, x19, :lo12:.LANCHOR0
-	add	x27, x21, :lo12:.LANCHOR3
+	add	x25, x21, :lo12:.LANCHOR3
 	mov	w1, 1
-	ldr	x0, [x28,1120]
-	strb	w1, [x27,1345]
-	ldrh	w3, [x0,124]
-	cbz	w3, .L3992
+	ldr	x0, [x28, 1128]
+	strb	w1, [x25, 1337]
+	ldrh	w0, [x0, 124]
+	cbz	w0, .L3921
 	add	x20, x20, :lo12:.LANCHOR5
-	strb	wzr, [x27,1345]
-	strb	w1, [x20,218]
-	b	.L3993
-.L3992:
-	ldrh	w0, [x28,3400]
+	strb	wzr, [x25, 1337]
+	strb	w1, [x20, 264]
+.L3872:
+	mov	w0, w23
+	ldp	x19, x20, [sp, 32]
+	ldp	x21, x22, [sp, 48]
+	ldp	x23, x24, [sp, 64]
+	ldp	x25, x26, [sp, 80]
+	ldp	x27, x28, [sp, 96]
+	ldp	x29, x30, [sp, 16]
+	add	sp, sp, 128
+	ret
+.L3902:
+	add	x21, x21, :lo12:.LANCHOR3
+	add	x0, x20, :lo12:.LANCHOR5
+	ldrh	w2, [x21, 1376]
+	ldrh	w1, [x0, 272]
+	cmp	w1, w2, lsr 5
+	bcc	.L4082
+	mov	w1, 4
+	strh	w1, [x0, 272]
+	b	.L4082
+.L3898:
+	ldrh	w1, [x0, 3392]
+	cmp	w1, w22
+	bcs	.L4082
+	ldr	x0, [x0, 1128]
+	ldrh	w0, [x0, 124]
+	cbz	w0, .L4000
+	b	.L4082
+.L3917:
+	mov	w1, 1
+	strb	w1, [x0, 1337]
+	b	.L3918
+.L3921:
+	ldrh	w0, [x28, 3392]
 	cmp	w22, w0
-	bcs	.L3994
-	cbz	w23, .L3995
-	cmp	w23, 16
-	bls	.L3996
-	ldrh	w2, [x28,3386]
-	ldrh	w0, [x27,1390]
+	bcs	.L3922
+	cbz	w24, .L3923
+	cmp	w24, 16
+	bls	.L3924
+	ldrh	w2, [x28, 3378]
+	ldrh	w0, [x25, 1382]
 	cmp	w2, w0
-	bhi	.L3996
-	mov	w0, w1
+	bhi	.L3924
 	mov	w2, 4
-	str	x3, [x29,104]
+	mov	w0, w1
 	bl	gc_search_src_blk
-	uxth	w0, w0
-	ldr	x3, [x29,104]
-	cbz	w0, .L4179
-	mov	w1, w3
-	add	x0, x27, 1376
+	tst	w0, 65535
+	bne	.L3925
+.L4089:
+	mov	w2, 4
+	mov	w1, 3
+	ldrb	w0, [x25, 1337]
+	b	.L4084
+.L3925:
+	mov	w1, 0
+	add	x0, x25, 1368
 	bl	_list_get_gc_head_node
-	uxth	w2, w0
+	and	w2, w0, 65535
 	mov	w1, 65535
 	cmp	w2, w1
-	beq	.L4070
+	beq	.L3928
 	add	x3, x20, :lo12:.LANCHOR5
 	ubfiz	x2, x2, 1, 16
-	ldr	w1, [x3,220]
+	ldr	w1, [x3, 268]
 	add	w1, w1, 1
-	str	w1, [x3,220]
-	ldr	x3, [x28,1112]
-	ldrh	w2, [x3,x2]
-	ldrh	w3, [x27,1384]
+	str	w1, [x3, 268]
+	ldr	x3, [x28, 1120]
+	ldrh	w2, [x3, x2]
+	ldrh	w3, [x25, 1376]
 	cmp	w3, w2
-	bcs	.L4000
-	ldrh	w3, [x28,1088]
+	bcs	.L3929
+	ldrh	w3, [x28, 1096]
 	cmp	w1, w3, lsr 4
-	bls	.L4070
-	ldrh	w1, [x28,3402]
+	bls	.L3928
+	ldrh	w1, [x28, 3406]
 	cmp	w1, w2
-	bls	.L4070
-.L4000:
+	bls	.L3928
+.L3929:
 	add	x21, x21, :lo12:.LANCHOR3
-	mov	w1, 0
 	add	x19, x19, :lo12:.LANCHOR0
-	ldrb	w2, [x21,1345]
+	mov	w1, 0
+	ldrb	w2, [x21, 1337]
 	bl	gc_add_sblk
 	mov	w0, 1
-	str	w0, [x19,3412]
+	str	w0, [x19, 3396]
 	add	x0, x20, :lo12:.LANCHOR5
-	str	wzr, [x0,220]
-	b	.L4070
-.L3996:
+	str	wzr, [x0, 268]
+.L3928:
+	add	x20, x20, :lo12:.LANCHOR5
 	mov	w0, 1
+	strb	w0, [x20, 264]
+	b	.L3872
+.L3924:
+	mov	w2, 1
 	mov	w1, 2
-	mov	w2, w0
+	mov	w0, w2
 	bl	gc_search_src_blk
-	uxth	w0, w0
-	cbnz	w0, .L4070
+	tst	w0, 65535
+	bne	.L3928
 	add	x21, x21, :lo12:.LANCHOR3
-	ldrb	w0, [x21,1345]
-	b	.L4176
-.L3995:
-	strb	w23, [x27,1345]
-	cmp	w22, 16
-	mov	w0, w23
-	bhi	.L4176
-	mov	w2, w1
-	bl	gc_search_src_blk
-	uxth	w0, w0
-	cbnz	w0, .L4070
-.L4179:
-	ldrb	w0, [x27,1345]
-.L4176:
+	mov	w2, 4
 	mov	w1, 3
+	ldrb	w0, [x21, 1337]
+.L4084:
+	bl	gc_search_src_blk
+	and	w0, w0, 65535
+.L3926:
+	cbnz	w0, .L3928
+	b	.L3872
+.L3923:
+	strb	wzr, [x25, 1337]
+	cmp	w22, 16
+	bls	.L3931
 	mov	w2, 4
+	mov	w1, 3
+	mov	w0, 0
+	b	.L4084
+.L3931:
+	mov	w2, w1
+	mov	w0, 0
 	bl	gc_search_src_blk
-	uxth	w0, w0
-	b	.L3998
-.L3994:
-	cmp	w26, 1
-	mov	w1, w24
-	bne	.L4140
+	tst	w0, 65535
+	bne	.L3928
+	b	.L4089
+.L3922:
+	cmp	w27, 1
+	bne	.L3872
 	cmp	w22, w0, lsl 1
-	bge	.L4003
-	cmp	w25, w23, lsr 1
-	bcs	.L4004
-	ldrh	w2, [x28,3386]
-	ldrh	w0, [x27,1390]
-	cmp	w2, w0
-	bcs	.L4004
-	ldrh	w0, [x27,1388]
+	bge	.L3932
+	cmp	w26, w24, lsr 1
+	bcs	.L3933
+	ldrh	w1, [x28, 3378]
+	ldrh	w0, [x25, 1382]
+	cmp	w1, w0
+	bcs	.L3933
+	ldrh	w0, [x25, 1380]
 	lsr	w0, w0, 2
-	strh	w0, [x28,3400]
-	b	.L4140
-.L4004:
+	strh	w0, [x28, 3392]
+	b	.L3872
+.L3933:
 	mov	w0, 8
 	bl	zftl_get_gc_node.part.10
-	uxth	w1, w0
+	and	w1, w0, 65535
 	mov	w2, 65535
 	cmp	w1, w2
-	beq	.L4005
+	beq	.L3934
 	add	x2, x19, :lo12:.LANCHOR0
 	ubfiz	x1, x1, 1, 16
-	ldr	x2, [x2,1112]
-	ldrh	w1, [x2,x1]
+	ldr	x2, [x2, 1120]
+	ldrh	w1, [x2, x1]
 	cmp	w1, 3
-	bhi	.L4005
-	cbz	w22, .L4005
+	bhi	.L3934
+	cbz	w22, .L3934
 	add	x1, x21, :lo12:.LANCHOR3
 	mov	w2, 0
-	strb	wzr, [x1,1345]
+	strb	wzr, [x1, 1337]
 	mov	w1, 1
 	bl	gc_add_sblk
-	cbnz	w0, .L4070
-.L4005:
-	add	x4, x21, :lo12:.LANCHOR3
+	cbnz	w0, .L3928
+.L3934:
+	add	x5, x21, :lo12:.LANCHOR3
 	mov	w1, 0
-	add	x0, x4, 1376
-	str	x4, [x29,104]
+	add	x0, x5, 1368
 	bl	_list_get_gc_head_node
-	uxth	w26, w0
+	and	w25, w0, 65535
 	mov	w1, 65535
-	mov	w28, w26
-	cmp	w26, w1
-	ldr	x4, [x29,104]
-	bne	.L4006
-.L4011:
-	cmp	w23, 1
-	bhi	.L4007
-	b	.L4008
-.L4006:
-	add	x27, x20, :lo12:.LANCHOR5
-	add	x2, x19, :lo12:.LANCHOR0
-	uxtw	x26, w26
-	ldr	w1, [x27,220]
-	ldrh	w3, [x2,1088]
-	add	w1, w1, 1
-	str	w1, [x27,220]
+	mov	w28, w25
+	cmp	w25, w1
+	bne	.L3935
+.L3940:
+	cmp	w24, 1
+	bhi	.L3936
+.L3937:
+	cmp	w22, w26
+	bcs	.L3944
+	add	x21, x21, :lo12:.LANCHOR3
+	mov	w0, 4
+	add	x19, x19, :lo12:.LANCHOR0
+	strb	wzr, [x21, 1337]
+	bl	zftl_get_gc_node.part.10
+	and	w0, w0, 65535
+	mov	w1, 65535
+	cmp	w0, w1
+	beq	.L4088
+	ldr	x1, [x19, 1120]
+	ubfiz	x0, x0, 1, 16
+	ldrb	w2, [x21, 1321]
+	ldrh	w1, [x1, x0]
+	ldrh	w0, [x21, 1376]
+	mul	w0, w0, w2
+	cmp	w1, w0, lsr 1
+	ble	.L3946
+.L4088:
+	ldrh	w0, [x21, 1380]
+	lsr	w0, w0, 2
+	strh	w0, [x19, 3392]
+	b	.L3872
+.L3935:
+	add	x27, x20, :lo12:.LANCHOR5
+	add	x2, x19, :lo12:.LANCHOR0
+	uxtw	x25, w25
+	ldr	w1, [x27, 268]
+	ldrh	w3, [x2, 1096]
+	add	w1, w1, 1
+	str	w1, [x27, 268]
 	cmp	w1, w3, lsr 4
-	bls	.L4009
-	ldr	x1, [x2,1112]
-	str	wzr, [x27,220]
-	ldrh	w3, [x1,x26,lsl 1]
-	ldrh	w1, [x2,3402]
+	bls	.L3938
+	ldr	x1, [x2, 1120]
+	str	wzr, [x27, 268]
+	ldrh	w3, [x1, x25, lsl 1]
+	ldrh	w1, [x2, 3406]
 	cmp	w3, w1
-	bcs	.L4009
+	bcs	.L3938
 	mov	w3, 1
-	mov	w1, 0
 	mov	w2, 1
-	strb	w3, [x4,1345]
-	str	x3, [x29,104]
+	strb	w3, [x5, 1337]
+	mov	w1, 0
+	str	w3, [x29, 108]
 	bl	gc_add_sblk
-	ldr	x3, [x29,104]
-	cbz	w0, .L4009
-	strb	w3, [x27,218]
-	b	.L3993
-.L4009:
-	add	x1, x19, :lo12:.LANCHOR0
+	ldr	w3, [x29, 108]
+	cbz	w0, .L3938
+	strb	w3, [x27, 264]
+	b	.L3872
+.L3938:
+	add	x0, x19, :lo12:.LANCHOR0
 	add	x3, x21, :lo12:.LANCHOR3
-	ldr	x0, [x1,1112]
-	ldrh	w2, [x0,x26,lsl 1]
-	ldrh	w0, [x3,1384]
-	cmp	w2, w0, lsr 1
-	bhi	.L4010
-	mov	w0, w28
-	mov	w1, 1
+	ldr	x1, [x0, 1120]
+	ldrh	w2, [x1, x25, lsl 1]
+	ldrh	w1, [x3, 1376]
+	cmp	w2, w1, lsr 1
+	bhi	.L3939
 	mov	w2, 0
+	mov	w1, 1
+	mov	w0, w28
 	bl	gc_add_sblk
-	b	.L4070
-.L4010:
-	ldrh	w4, [x1,3382]
-	ldrh	w0, [x1,3384]
-	ldrh	w3, [x3,1388]
-	add	w0, w4, w0
-	cmp	w0, w3, lsl 1
-	ble	.L4011
-	ldrh	w0, [x1,3402]
+	b	.L3928
+.L3939:
+	ldrh	w1, [x0, 3374]
+	ldrh	w4, [x0, 3376]
+	ldrh	w3, [x3, 1380]
+	add	w1, w1, w4
+	cmp	w1, w3, lsl 1
+	ble	.L3940
+	ldrh	w0, [x0, 3406]
 	cmp	w0, w2
-	bcc	.L4008
-	b	.L4011
-.L4007:
-	add	x26, x21, :lo12:.LANCHOR3
-	mov	w0, 1
-	cmp	w23, 16
-	strb	w0, [x26,1345]
-	bls	.L4012
-	add	x1, x19, :lo12:.LANCHOR0
-	ldrh	w2, [x1,3386]
-	ldrh	w1, [x26,1390]
-	cmp	w2, w1
-	bhi	.L4012
-	mov	w1, w0
+	bcc	.L3937
+	b	.L3940
+.L3936:
+	add	x25, x21, :lo12:.LANCHOR3
+	mov	w1, 1
+	cmp	w24, 16
+	strb	w1, [x25, 1337]
+	bls	.L3941
+	add	x0, x19, :lo12:.LANCHOR0
+	ldrh	w2, [x0, 3378]
+	ldrh	w0, [x25, 1382]
+	cmp	w2, w0
+	bhi	.L3941
 	mov	w2, 4
+	mov	w0, w1
 	bl	gc_search_src_blk
-	uxth	w0, w0
-	cbnz	w0, .L4013
-	ldrb	w0, [x26,1345]
-	b	.L4175
-.L4012:
-	mov	w0, 1
-	mov	w1, 2
-	mov	w2, w0
-	bl	gc_search_src_blk
-	uxth	w0, w0
-	cbnz	w0, .L4013
-	add	x0, x21, :lo12:.LANCHOR3
-	ldrb	w0, [x0,1345]
-.L4175:
-	mov	w1, 3
+	ands	w0, w0, 65535
+	bne	.L3942
+	ldrb	w0, [x25, 1337]
 	mov	w2, 4
+	mov	w1, 3
+.L4083:
 	bl	gc_search_src_blk
-	uxth	w0, w0
-.L4013:
+	and	w0, w0, 65535
+.L3942:
 	add	x21, x21, :lo12:.LANCHOR3
-	cmp	w22, w25, lsr 1
 	add	x19, x19, :lo12:.LANCHOR0
-	ldrh	w1, [x21,1388]
-	bls	.L4177
+	cmp	w22, w26, lsr 1
+	ldrh	w1, [x21, 1380]
+	bls	.L4085
 	lsr	w1, w1, 2
-	b	.L4178
-.L4008:
-	cmp	w22, w25
-	bcs	.L4015
-	add	x21, x21, :lo12:.LANCHOR3
-	mov	w0, 4
-	add	x19, x19, :lo12:.LANCHOR0
-	strb	wzr, [x21,1345]
-	bl	zftl_get_gc_node.part.10
-	mov	w1, 65535
-	uxth	w0, w0
-	cmp	w0, w1
-	beq	.L4184
-	ubfiz	x0, x0, 1, 16
-	ldr	x1, [x19,1112]
-	ldrb	w2, [x21,1329]
-	ldrh	w1, [x1,x0]
-	ldrh	w0, [x21,1384]
-	mul	w0, w0, w2
-	cmp	w1, w0, lsr 1
-	bgt	.L4184
+.L4086:
+	strh	w1, [x19, 3392]
+	b	.L3926
+.L3941:
+	mov	w2, 1
+	mov	w1, 2
+	mov	w0, w2
+	bl	gc_search_src_blk
+	ands	w0, w0, 65535
+	bne	.L3942
+	add	x0, x21, :lo12:.LANCHOR3
+	mov	w2, 4
+	mov	w1, 3
+	ldrb	w0, [x0, 1337]
+	b	.L4083
+.L3946:
 	mov	w1, 3
-	mov	w0, 0
 	mov	w2, 4
+	mov	w0, 0
 	bl	gc_search_src_blk
-	uxth	w0, w0
-	ldrh	w1, [x21,1388]
-.L4177:
+	ldrh	w1, [x21, 1380]
+	and	w0, w0, 65535
+.L4085:
 	lsr	w1, w1, 1
-.L4178:
-	strh	w1, [x19,3400]
-	b	.L3998
-.L4015:
+	b	.L4086
+.L3944:
 	add	x19, x19, :lo12:.LANCHOR0
 	add	x21, x21, :lo12:.LANCHOR3
-.L4184:
-	ldrh	w0, [x21,1388]
-	lsr	w0, w0, 2
-	strh	w0, [x19,3400]
-	b	.L3993
-.L4003:
-	ldrh	w0, [x27,1388]
+	b	.L4088
+.L3932:
+	ldrh	w0, [x25, 1380]
 	lsr	w0, w0, 2
-	strh	w0, [x28,3400]
-	ldrh	w0, [x28,5534]
-	cmp	w0, wzr
-	csel	w24, w24, wzr, ne
-	b	.L3993
-.L3998:
-	mov	w1, w24
-	cbz	w0, .L4140
-.L4070:
-	add	x20, x20, :lo12:.LANCHOR5
-	mov	w0, 1
-	strb	w0, [x20,218]
-	b	.L3993
-.L3948:
-	add	x21, x19, :lo12:.LANCHOR0
+	strh	w0, [x28, 3392]
+	ldrh	w0, [x28, 5526]
+	cmp	w0, 0
+	csel	w23, w23, wzr, ne
+	b	.L3872
+.L3877:
+	add	x6, x19, :lo12:.LANCHOR0
 	mov	w0, 65535
-	ldrh	w1, [x21,3424]
+	ldrh	w1, [x6, 3416]
 	cmp	w1, w0
-	bne	.L4018
+	bne	.L3947
 	bl	gc_get_src_blk
-	strh	w0, [x21,3424]
-.L4018:
+	strh	w0, [x6, 3416]
+.L3947:
 	add	x0, x19, :lo12:.LANCHOR0
 	mov	w2, 65535
-	ldrh	w1, [x0,3424]
+	ldrh	w1, [x0, 3416]
 	cmp	w1, w2
-	beq	.L4019
-	ldrh	w2, [x0,1088]
+	beq	.L3948
+	ldrh	w2, [x0, 1096]
 	cmp	w2, w1
-	bhi	.L4019
+	bhi	.L3948
 	mov	w1, -1
-	strh	w1, [x0,3424]
-.L4019:
+	strh	w1, [x0, 3416]
+.L3948:
 	add	x0, x19, :lo12:.LANCHOR0
 	mov	w2, 65535
-	add	x1, x0, 3424
-	ldrh	w3, [x0,3424]
+	ldrh	w3, [x0, 3416]
 	cmp	w3, w2
-	beq	.L4181
-	ldrh	w5, [x1,56]
+	beq	.L4091
+	ldrh	w5, [x0, 3472]
 	uxtw	x4, w3
-	ldr	x2, [x0,1096]
+	ldr	x2, [x0, 1104]
 	add	x2, x2, x4, lsl 2
-	cbz	w5, .L4022
-	mov	x0, 0
-.L4021:
-	cmp	w5, w0, uxth
-	bls	.L4022
-	add	x0, x0, 1
-	add	x6, x1, x0, lsl 1
-	ldrh	w6, [x6,56]
+	cbz	w5, .L3950
+	add	x0, x0, 3474
+	mov	w1, 0
+.L3952:
+	ldrh	w6, [x0], 2
 	cmp	w6, w3
-	bne	.L4021
-.L4027:
+	bne	.L3951
+.L3956:
 	add	x19, x19, :lo12:.LANCHOR0
 	mov	w0, -1
-	strh	w0, [x19,3424]
-	b	.L4180
-.L4022:
-	ldrb	w0, [x2,2]
+	strh	w0, [x19, 3416]
+	b	.L4000
+.L3951:
+	add	w1, w1, 1
+	and	w1, w1, 65535
+	cmp	w5, w1
+	bne	.L3952
+.L3950:
+	ldrb	w0, [x2, 2]
+	and	w1, w0, 224
+	cmp	w1, 224
+	beq	.L3953
 	tst	w0, 192
-	beq	.L4084
-	and	w0, w0, 224
-	cmp	w0, 224
-	bne	.L4024
-.L4084:
+	bne	.L3954
+.L3953:
 	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x0, [x0,1112]
-	ldrh	w0, [x0,x4,lsl 1]
-	cbz	w0, .L4027
+	ldr	x0, [x0, 1120]
+	ldrh	w0, [x0, x4, lsl 1]
+	cbz	w0, .L3956
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 1040
 	mov	w2, 3306
-	add	x1, x1, 1024
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-	b	.L4027
-.L4024:
+	b	.L3956
+.L3954:
 	add	x20, x20, :lo12:.LANCHOR5
 	mov	w0, 2
-	b	.L4182
-.L3949:
+	b	.L4092
+.L3878:
 	bl	gc_scan_src_blk
 	cmn	w0, #1
-	bne	.L4028
+	bne	.L3957
 	add	x20, x20, :lo12:.LANCHOR5
 	mov	w0, 3
-	b	.L4182
-.L4028:
+	b	.L4092
+.L3957:
 	add	x1, x19, :lo12:.LANCHOR0
 	mov	w3, 65535
-	ldrh	w0, [x1,3424]
+	ldrh	w0, [x1, 3416]
 	cmp	w0, w3
-	beq	.L3967
-	ldrh	w3, [x1,3448]
+	beq	.L3897
+	ldrh	w3, [x1, 3440]
 	add	x20, x20, :lo12:.LANCHOR5
-	cbz	w3, .L4029
+	cbz	w3, .L3958
 	mov	w0, 4
-	strh	wzr, [x1,3450]
-	strb	w0, [x20,218]
-	b	.L4180
-.L4029:
+	strh	wzr, [x1, 3442]
+	strb	w0, [x20, 264]
+	b	.L4000
+.L3958:
+	ldr	x1, [x1, 1120]
 	ubfiz	x0, x0, 1, 16
-	ldr	x1, [x1,1112]
 	mov	w2, 1
-	strb	w2, [x20,218]
-	ldrh	w0, [x1,x0]
-	cbz	w0, .L4030
+	strb	w2, [x20, 264]
+	ldrh	w0, [x1, x0]
+	cbz	w0, .L3959
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 1040
 	mov	w2, 3336
-	add	x1, x1, 1024
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L4030:
+.L3959:
 	add	x20, x19, :lo12:.LANCHOR0
-	add	x21, x20, 3424
-	ldrh	w0, [x20,3424]
+	add	x21, x20, 3416
+	ldrh	w0, [x20, 3416]
 	bl	ftl_free_sblk
-	ldr	x0, [x20,1112]
-	ldrh	w1, [x20,3424]
-	strh	wzr, [x0,x1,lsl 1]
-	ldrh	w0, [x21,30]
+	ldr	x0, [x20, 1120]
+	ldrh	w1, [x20, 3416]
+	strh	wzr, [x0, x1, lsl 1]
+	ldrh	w0, [x21, 30]
 	add	w0, w0, 1
-	uxth	w0, w0
+	and	w0, w0, 65535
 	cmp	w0, 8
-	bhi	.L4031
-	strh	w0, [x21,30]
-	b	.L4027
-.L4031:
-	strh	wzr, [x21,30]
+	bhi	.L3960
+	strh	w0, [x21, 30]
+	b	.L3956
+.L3960:
+	strh	wzr, [x21, 30]
 	bl	ftl_flush
 	bl	pm_flush
 	bl	ftl_ext_info_flush
 	mov	w0, 0
 	bl	ftl_info_flush
-	b	.L4027
-.L3950:
-	add	x21, x19, :lo12:.LANCHOR0
-	adrp	x23, .LANCHOR3
-.L4141:
+	b	.L3956
+.L3879:
+	add	x23, x19, :lo12:.LANCHOR0
+	adrp	x24, .LANCHOR3
+	add	x21, x23, 3416
+	add	x24, x24, :lo12:.LANCHOR3
+.L4053:
 	bl	gc_scan_src_blk_one_page
-	ldrh	w2, [x21,3426]
-	add	x0, x21, 3424
-	add	x1, x23, :lo12:.LANCHOR3
-	ldrh	w1, [x1,1384]
-	cmp	w2, w1
-	bcs	.L4033
+	ldrh	w1, [x21, 2]
+	ldrh	w0, [x24, 1376]
+	cmp	w1, w0
+	bcs	.L3962
 	cmp	w22, 7
-	bls	.L4141
-	b	.L4180
-.L4033:
-	ldrh	w3, [x0,24]
-	cbz	w3, .L4034
+	bls	.L4053
+	b	.L4000
+.L3962:
+	ldrh	w3, [x21, 24]
+	ldrh	w1, [x21]
+	cbz	w3, .L3963
 	add	x20, x20, :lo12:.LANCHOR5
-	mov	w1, 4
-	strh	wzr, [x0,26]
-	ldr	x2, [x21,1112]
-	strb	w1, [x20,218]
-	ldrh	w1, [x0]
+	mov	w0, 4
+	ldr	x2, [x23, 1120]
+	strh	wzr, [x21, 26]
+	strb	w0, [x20, 264]
 	ubfiz	x0, x1, 1, 16
-	ldrh	w2, [x2,x0]
-	cmp	w2, w3
-	beq	.L4035
+	ldrh	w2, [x2, x0]
+	cmp	w3, w2
+	beq	.L3964
 	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 10, .L4035
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 10, .L3964
 	adrp	x0, .LC300
 	add	x0, x0, :lo12:.LC300
 	bl	printk
-.L4035:
+.L3964:
 	add	x0, x19, :lo12:.LANCHOR0
-	ldrh	w2, [x0,3424]
-	ldr	x1, [x0,1112]
-	ldrh	w0, [x0,3448]
-	ldrh	w1, [x1,x2,lsl 1]
+	ldrh	w2, [x0, 3416]
+	ldr	x1, [x0, 1120]
+	ldrh	w0, [x0, 3440]
+	ldrh	w1, [x1, x2, lsl 1]
 	cmp	w1, w0
-	beq	.L4036
+	beq	.L3965
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 1040
 	mov	w2, 3379
-	add	x1, x1, 1024
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L4036:
+.L3965:
 	add	x19, x19, :lo12:.LANCHOR0
-	ldrh	w1, [x19,3424]
-	ldr	x0, [x19,1112]
-	ldrh	w2, [x19,3448]
-	strh	w2, [x0,x1,lsl 1]
-	b	.L4180
-.L4034:
+	ldrh	w1, [x19, 3416]
+	ldr	x0, [x19, 1120]
+	ldrh	w2, [x19, 3440]
+	strh	w2, [x0, x1, lsl 1]
+	b	.L4000
+.L3963:
 	add	x20, x20, :lo12:.LANCHOR5
-	ldrh	w1, [x0]
 	mov	w0, 1
-	ldr	x21, [x21,1096]
-	add	x21, x21, w1, uxth 2
-	strb	w0, [x20,218]
+	ldr	x21, [x23, 1104]
+	strb	w0, [x20, 264]
 	adrp	x0, .LANCHOR2
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 8, .L4037
-	ldrb	w2, [x21,2]
+	add	x21, x21, w1, uxth 2
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 8, .L3966
+	ldrb	w2, [x21, 2]
 	adrp	x0, .LC301
 	add	x0, x0, :lo12:.LC301
 	ubfx	x2, x2, 5, 3
 	bl	printk
-.L4037:
-	ldrb	w0, [x21,2]
+.L3966:
+	ldrb	w0, [x21, 2]
+	and	w1, w0, 224
+	cmp	w1, 224
+	beq	.L3967
 	tst	w0, 192
-	beq	.L4085
-	and	w0, w0, 224
-	cmp	w0, 224
-	bne	.L4038
-.L4085:
+	bne	.L3968
+.L3967:
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 1040
 	mov	w2, 3389
-	add	x1, x1, 1024
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L4038:
+.L3968:
 	add	x19, x19, :lo12:.LANCHOR0
-	add	x20, x19, 3424
-	ldrh	w0, [x19,3424]
+	add	x20, x19, 3416
+	ldrh	w0, [x19, 3416]
 	bl	ftl_free_sblk
 	mov	w0, -1
-	strh	w0, [x19,3424]
-	ldrh	w0, [x20,30]
+	strh	w0, [x19, 3416]
+	ldrh	w0, [x20, 30]
 	add	w0, w0, 1
-	uxth	w0, w0
+	and	w0, w0, 65535
 	cmp	w0, 8
-	bhi	.L4040
-	strh	w0, [x20,30]
-	b	.L4180
-.L4040:
-	strh	wzr, [x20,30]
-	b	.L4183
-.L3951:
-	cbnz	w26, .L4041
+	bhi	.L3969
+	strh	w0, [x20, 30]
+	b	.L4000
+.L3969:
+	strh	wzr, [x20, 30]
+.L4090:
+	bl	flt_sys_flush
+	b	.L4000
+.L3880:
+	cbnz	w27, .L3970
 	add	x0, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x0,3400]
+	ldrh	w0, [x0, 3392]
 	cmp	w0, w22
-	bcc	.L4180
-.L4041:
-	ldrh	w1, [x24,80]
+	bcc	.L4000
+.L3970:
+	ldrh	w1, [x25, 80]
 	mov	w0, 65535
 	cmp	w1, w0
-	bne	.L4042
+	bne	.L3971
 	adrp	x21, .LANCHOR3
 	add	x0, x21, :lo12:.LANCHOR3
-	ldrb	w23, [x0,1345]
+	ldrb	w23, [x0, 1337]
 	cmp	w23, 1
-	bne	.L4042
+	bne	.L3971
 	bl	ftl_flush
 	add	x0, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x0,5616]
-	cbz	w0, .L4043
-	mov	w0, w23
-.L4043:
 	mov	w1, 5
+	ldrh	w0, [x0, 5608]
+	cbz	w0, .L3972
+	mov	w0, w23
+.L4087:
 	bl	zftl_gc_get_free_sblk
-	uxth	w23, w0
+	and	w22, w0, 65535
 	mov	w0, 65535
-	cmp	w23, w0
-	beq	.L4045
+	cmp	w22, w0
+	beq	.L3974
 	add	x0, x19, :lo12:.LANCHOR0
-	ldr	x22, [x0,1096]
-	add	x22, x22, w23, uxth 2
-	ldrb	w0, [x22,2]
+	ldr	x23, [x0, 1104]
+	add	x23, x23, w22, uxth 2
+	ldrb	w0, [x23, 2]
 	tst	w0, 224
-	beq	.L4046
+	beq	.L3975
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 1040
 	mov	w2, 3423
-	add	x1, x1, 1024
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L4046:
-	ldrb	w0, [x22,2]
+.L3975:
+	ldrb	w0, [x23, 2]
 	mov	w1, 5
 	bfi	w0, w1, 5, 3
 	orr	w0, w0, 16
-	strb	w0, [x22,2]
-.L4071:
-	mov	w0, w23
+	strb	w0, [x23, 2]
+.L3999:
 	mov	w1, 1
-	add	x21, x21, :lo12:.LANCHOR3
-	add	x20, x20, :lo12:.LANCHOR5
+	mov	w0, w22
 	bl	ftl_erase_sblk
-	add	x19, x19, :lo12:.LANCHOR0
+	add	x21, x21, :lo12:.LANCHOR3
 	mov	w0, 5
-	add	x1, x24, 96
-	strb	w0, [x24,84]
-	mov	w0, w23
+	strb	w0, [x25, 84]
+	add	x1, x25, 96
+	mov	w0, w22
 	bl	ftl_get_blk_list_in_sblk
-	uxtb	w0, w0
-	ldrh	w1, [x21,1384]
-	strb	w0, [x24,89]
-	ldrb	w2, [x21,1329]
+	and	w0, w0, 255
+	ldrh	w1, [x21, 1376]
+	add	x20, x20, :lo12:.LANCHOR5
+	strb	w0, [x25, 89]
+	add	x19, x19, :lo12:.LANCHOR0
+	ldrh	w2, [x21, 1338]
+	strh	w22, [x25, 80]
 	mul	w0, w0, w1
-	strh	w0, [x24,86]
+	strh	wzr, [x25, 82]
+	strh	w0, [x25, 86]
 	mov	w1, 255
-	ldrh	w0, [x21,1346]
-	strh	w23, [x24,80]
-	strh	wzr, [x24,82]
-	mul	w2, w0, w2
-	ldr	x0, [x20,232]
-	strb	wzr, [x24,85]
+	ldrb	w0, [x21, 1321]
+	strb	wzr, [x25, 85]
+	strh	wzr, [x25, 90]
+	mul	w2, w2, w0
+	ldr	x0, [x20, 280]
 	lsl	w2, w2, 2
-	strh	wzr, [x24,90]
 	bl	ftl_memset
-	ldrh	w0, [x21,1346]
+	ldrb	w0, [x21, 1321]
 	mov	w1, 255
-	ldrb	w2, [x21,1329]
-	mul	w2, w0, w2
-	ldr	x0, [x20,240]
+	ldrh	w2, [x21, 1338]
+	mul	w2, w2, w0
+	ldr	x0, [x20, 288]
 	lsl	w2, w2, 2
 	bl	ftl_memset
-	ldrh	w3, [x21,1346]
+	ldrb	w0, [x21, 1321]
 	mov	w1, 255
-	ldrb	w2, [x21,1329]
-	ldr	x0, [x21,1336]
-	mul	w2, w3, w2
+	ldrh	w2, [x21, 1338]
+	mul	w2, w2, w0
+	ldr	x0, [x21, 1328]
 	bl	ftl_memset
-	ldr	x0, [x19,1120]
+	ldr	x0, [x19, 1128]
 	mov	w1, -1
-	str	w23, [x0,132]
-	strh	w1, [x0,128]
-	strh	w1, [x0,130]
+	str	w22, [x0, 132]
+	strh	w1, [x0, 128]
+	strh	w1, [x0, 130]
 	bl	pm_flush
 	bl	ftl_ext_info_flush
-	strh	wzr, [x19,3480]
-	ldr	x0, [x19,3392]
-	strh	w23, [x0,126]
+	strh	wzr, [x19, 3472]
+	ldr	x0, [x19, 3384]
+	strh	w22, [x0, 126]
 	mov	w0, -1
-	str	w0, [x19,5620]
+	strh	wzr, [x19, 5522]
+	str	w0, [x19, 5612]
 	mov	w0, 0
-	strh	wzr, [x19,5530]
-	strh	wzr, [x19,5532]
-	strh	wzr, [x19,5618]
+	strh	wzr, [x19, 5524]
+	strh	wzr, [x19, 5610]
 	bl	ftl_info_flush
-	b	.L4180
-.L4042:
-	cmp	w26, 1
+	b	.L4000
+.L3972:
+	mov	w0, 0
+	b	.L4087
+.L3971:
+	cmp	w27, 1
 	mov	w23, 4
 	csinc	w23, w23, wzr, eq
+	add	x26, x19, :lo12:.LANCHOR0
 	cmp	w22, 15
-	add	w0, w23, 4
-	adrp	x27, .LANCHOR3
-	csel	w23, w0, w23, ls
-	add	x25, x19, :lo12:.LANCHOR0
-.L4049:
+	mov	w0, w23
+	add	w23, w23, 4
+	adrp	x22, .LANCHOR3
+	csel	w23, w23, w0, ls
+	add	x24, x22, :lo12:.LANCHOR3
+	add	x21, x26, 3416
+.L3978:
 	sub	w23, w23, #1
-	uxtb	w23, w23
+	and	w23, w23, 255
 	cmp	w23, 255
-	beq	.L4180
-	add	x26, x27, :lo12:.LANCHOR3
+	beq	.L4000
 	bl	gc_do_copy_back
-	adrp	x22, .LANCHOR3
-	ldrb	w0, [x26,1345]
-	cbnz	w0, .L4050
-	ldrb	w0, [x25,3362]
+	ldrb	w0, [x24, 1337]
+	cbnz	w0, .L3979
+	ldrb	w0, [x26, 3353]
 	cmp	w0, 3
-	bhi	.L4051
+	bhi	.L3980
 	bl	ftl_write_commit
-.L4051:
-	ldrh	w1, [x25,3450]
-	ldrh	w0, [x25,3448]
+.L3980:
+	ldrh	w1, [x21, 26]
+	ldrh	w0, [x21, 24]
 	cmp	w1, w0
-	bcc	.L4049
+	bcc	.L3978
 	add	x20, x20, :lo12:.LANCHOR5
 	mov	w0, 1
-	strb	w0, [x20,218]
+	strb	w0, [x20, 264]
 	bl	ftl_write_commit
 	bl	ftl_flush
-	ldrh	w1, [x25,3424]
-	ldr	x0, [x25,1112]
-	ldrh	w0, [x0,x1,lsl 1]
-	cbz	w0, .L4053
+	ldrh	w1, [x21]
+	ldr	x0, [x26, 1120]
+	ldrh	w0, [x0, x1, lsl 1]
+	cbz	w0, .L3982
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 1040
 	mov	w2, 3507
-	add	x1, x1, 1024
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L4053:
+.L3982:
 	add	x1, x19, :lo12:.LANCHOR0
-	ldrh	w0, [x1,3424]
-	ldr	x3, [x1,1112]
+	ldrh	w0, [x1, 3416]
+	ldr	x1, [x1, 1120]
 	ubfiz	x2, x0, 1, 16
-	ldrh	w4, [x3,x2]
-	cbnz	w4, .L4054
-	strh	w4, [x3,x2]
-	ldrh	w0, [x1,3424]
+	ldrh	w1, [x1, x2]
+	cbnz	w1, .L3983
 	bl	ftl_free_sblk
-	b	.L4027
-.L4054:
-	mov	w1, 0
+	b	.L3956
+.L3983:
 	mov	w2, 1
+	mov	w1, 0
 	bl	gc_add_sblk
-	b	.L4027
-.L4050:
-	ldrh	w0, [x25,5618]
-	add	x21, x25, 3424
-	cbz	w0, .L4055
-	strh	wzr, [x21,2194]
+	b	.L3956
+.L3979:
+	ldrh	w0, [x21, 2194]
+	cbz	w0, .L3984
+	strh	wzr, [x21, 2194]
 	bl	sblk_wait_write_queue_completed
 	bl	gc_write_completed
-	ldr	w0, [x21,2196]
+	ldr	w0, [x21, 2196]
 	cmn	w0, #1
-	beq	.L4056
-	ldrb	w1, [x26,1956]
-	cbnz	w1, .L4057
-	ldrb	w1, [x26,1330]
-	cbz	w1, .L4058
-.L4057:
-	add	x1, x19, :lo12:.LANCHOR0
-	ldr	x2, [x1,3392]
-	ldr	w3, [x2,156]
-	mov	w2, 20041
-	movk	w2, 0x444b, lsl 16
-	cmp	w3, w2
-	bne	.L4058
+	beq	.L3985
+	ldrb	w1, [x24, 1950]
+	cbnz	w1, .L3986
+	ldrb	w1, [x24, 1322]
+	cbz	w1, .L3987
+.L3986:
+	add	x4, x19, :lo12:.LANCHOR0
+	ldr	x1, [x4, 3384]
+	ldr	w2, [x1, 156]
+	mov	w1, 20041
+	movk	w1, 0x444b, lsl 16
+	cmp	w2, w1
+	bne	.L3987
 	add	x22, x22, :lo12:.LANCHOR3
-	ldrb	w3, [x1,1257]
-	mov	w2, 24
-	sub	w2, w2, w3
-	mov	w3, 1
-	ldrh	w4, [x22,1312]
-	sub	w2, w2, w4
-	lsr	w0, w0, w4
-	lsl	w2, w3, w2
-	sub	w2, w2, #1
-	and	w0, w2, w0
-	ldrb	w2, [x22,1314]
-	udiv	w0, w0, w2
-	ldr	x2, [x1,1096]
+	ldrb	w2, [x4, 1205]
+	mov	w1, 24
+	sub	w1, w1, w2
+	ldrh	w3, [x22, 1304]
+	sub	w2, w1, w3
+	mov	w1, 1
+	lsr	w0, w0, w3
+	lsl	w1, w1, w2
+	sub	w1, w1, #1
+	and	w0, w1, w0
+	ldrb	w1, [x22, 1306]
+	ldr	x2, [x4, 1104]
+	udiv	w0, w0, w1
 	lsl	x0, x0, 2
 	add	x5, x2, x0
-	ldrb	w3, [x5,2]
-	tbz	x3, 3, .L4056
-	ldrh	w4, [x1,3376]
-	ldrh	w6, [x22,1388]
-	add	w4, w4, 8
-	cmp	w4, w6
-	bge	.L4056
-	and	w3, w3, -25
-	strb	w3, [x5,2]
-	ldrh	w1, [x1,1104]
-	ldr	w3, [x2,x0]
-	ldrh	w4, [x2,x0]
+	ldrb	w1, [x5, 2]
+	tbz	x1, 3, .L3985
+	ldrh	w3, [x4, 3368]
+	ldrh	w6, [x22, 1380]
+	add	w3, w3, 8
+	cmp	w3, w6
+	bge	.L3985
+	and	w1, w1, -25
+	strb	w1, [x5, 2]
+	ldrh	w1, [x4, 1112]
+	ldr	w3, [x2, x0]
+	ldrh	w4, [x2, x0]
 	ubfx	x3, x3, 11, 8
-	ubfx	x5, x4, 0, 11
-	mul	w1, w3, w1
+	and	w5, w4, 2047
+	mul	w1, w1, w3
 	lsr	w3, w3, 3
 	add	w1, w1, w1, lsl 1
 	add	w1, w5, w1, lsr 2
 	bfi	w4, w1, 0, 11
-	strh	w4, [x2,x0]
-	ldr	w1, [x2,x0]
+	strh	w4, [x2, x0]
+	ldr	w1, [x2, x0]
 	bfi	w1, w3, 11, 8
-	str	w1, [x2,x0]
-	b	.L4056
-.L4058:
-	bl	ftl_mask_bad_block
-.L4056:
+	str	w1, [x2, x0]
+.L3985:
 	add	x21, x19, :lo12:.LANCHOR0
-	ldr	x0, [x21,1120]
-	str	wzr, [x21,5620]
-	strh	wzr, [x21,3480]
-	ldrh	w0, [x0,80]
+	ldr	x0, [x21, 1128]
+	str	wzr, [x21, 5612]
+	strh	wzr, [x21, 3472]
+	ldrh	w0, [x0, 80]
 	bl	ftl_free_sblk
-	ldr	x1, [x21,1120]
+	ldr	x1, [x21, 1128]
 	mov	w0, -1
-	ldr	x2, [x21,3392]
-	strh	w0, [x1,80]
-	strh	w0, [x2,126]
-	strh	w0, [x1,130]
-	ldr	x0, [x21,3432]
-	cbz	x0, .L4059
+	ldr	x2, [x21, 3384]
+	strh	w0, [x1, 80]
+	strh	w0, [x2, 126]
+	strh	w0, [x1, 130]
+	ldr	x0, [x21, 3424]
+	cbz	x0, .L3988
 	bl	zbuf_free
-.L4059:
+.L3988:
 	add	x19, x19, :lo12:.LANCHOR0
 	add	x20, x20, :lo12:.LANCHOR5
-	str	xzr, [x19,3432]
+	str	xzr, [x19, 3424]
 	bl	flt_sys_flush
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 1040
 	mov	w2, 3567
-	add	x1, x1, 1024
+	strb	wzr, [x20, 264]
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
-	strb	wzr, [x20,218]
 	bl	printk
 	bl	dump_stack
-	b	.L4180
-.L4055:
-	ldrh	w0, [x24,86]
+	b	.L4000
+.L3987:
+	bl	ftl_mask_bad_block
+	b	.L3985
+.L3984:
+	ldrh	w0, [x25, 86]
+	ldrh	w1, [x21, 26]
 	cmp	w0, 1
-	bls	.L4060
-	ldrh	w1, [x21,26]
-	ldrh	w0, [x21,24]
+	ldrh	w0, [x21, 24]
+	bls	.L3989
 	cmp	w1, w0
-	bcc	.L4049
+	bcc	.L3978
 	add	x20, x20, :lo12:.LANCHOR5
 	mov	w0, 1
-	strb	w0, [x20,218]
-	ldrh	w0, [x21,56]
+	strb	w0, [x20, 264]
+	ldrh	w0, [x21, 56]
 	add	w1, w0, 1
+	strh	w1, [x21, 56]
 	add	x0, x21, w0, sxtw 1
-	strh	w1, [x21,56]
 	ldrh	w1, [x21]
-	strh	w1, [x0,58]
+	strh	w1, [x0, 58]
 	mov	w0, -1
 	strh	w0, [x21]
-	b	.L4180
-.L4060:
+	b	.L4000
+.L3989:
 	add	x20, x20, :lo12:.LANCHOR5
-	mov	w0, 5
-	ldrh	w1, [x21,26]
-	strb	w0, [x20,218]
-	ldrh	w0, [x21,24]
+	mov	w2, 5
 	cmp	w1, w0
-	bcc	.L4061
-	ldrh	w0, [x21,56]
+	strb	w2, [x20, 264]
+	bcc	.L3990
+	ldrh	w0, [x21, 56]
 	add	w1, w0, 1
+	strh	w1, [x21, 56]
 	add	x0, x21, w0, sxtw 1
-	strh	w1, [x21,56]
 	ldrh	w1, [x21]
-	strh	w1, [x0,58]
+	strh	w1, [x0, 58]
 	mov	w0, -1
 	strh	w0, [x21]
-.L4061:
+.L3990:
 	add	x20, x19, :lo12:.LANCHOR0
 	bl	ftl_flush
 	bl	sblk_wait_write_queue_completed
 	bl	gc_write_completed
-	ldr	x0, [x20,1120]
-	ldrh	w1, [x24,80]
-	strh	w1, [x0,128]
+	ldr	x0, [x20, 1128]
+	ldrh	w1, [x25, 80]
+	strh	w1, [x0, 128]
 	bl	pm_flush
 	bl	ftl_ext_info_flush
-	strh	wzr, [x20,3440]
+	strh	wzr, [x20, 3432]
 	add	x1, x22, :lo12:.LANCHOR3
-	ldrb	w3, [x20,1268]
-	ldrh	w2, [x1,1384]
-	strh	w2, [x20,3442]
-	ldrb	w2, [x1,1328]
-	strh	w2, [x20,3444]
-	cbz	w3, .L4062
-	ldrh	w1, [x1,1346]
-	strh	w1, [x20,3442]
+	ldrb	w3, [x20, 1212]
+	ldrh	w2, [x1, 1376]
+	strh	w2, [x20, 3434]
+	ldrb	w2, [x1, 1320]
+	strh	w2, [x20, 3436]
+	cbz	w3, .L3991
+	ldrh	w1, [x1, 1338]
+	strh	w1, [x20, 3434]
 	mov	w1, 1
-	strh	w1, [x20,3444]
-.L4062:
+	strh	w1, [x20, 3436]
+.L3991:
 	cmp	w2, 2
-	bne	.L4064
+	bne	.L3993
 	add	x0, x19, :lo12:.LANCHOR0
 	add	x22, x22, :lo12:.LANCHOR3
-	add	x0, x0, 3424
-	ldrh	w1, [x0,18]
-	lsl	w1, w1, 1
-	strh	w1, [x0,18]
-	ldrb	w1, [x22,1330]
-	cbnz	w1, .L4064
+	add	x0, x0, 3416
+	ldrh	w1, [x0, 18]
+	ubfiz	w1, w1, 1, 15
+	strh	w1, [x0, 18]
+	ldrb	w1, [x22, 1322]
+	cbnz	w1, .L3993
 	mov	w1, 1
-	strh	w1, [x0,20]
-.L4064:
-	add	x19, x19, :lo12:.LANCHOR0
-	strh	wzr, [x19,3446]
-	b	.L4180
-.L4073:
-	mov	w21, 0
-	add	x24, x19, :lo12:.LANCHOR0
-.L3952:
-	bl	gc_check_data_one_wl
-	cbz	w0, .L4067
+	strh	w1, [x0, 20]
+.L3993:
 	add	x19, x19, :lo12:.LANCHOR0
-	add	x20, x20, :lo12:.LANCHOR5
-	ldr	x0, [x19,1120]
-	strh	wzr, [x19,3480]
-	ldrh	w0, [x0,80]
-	bl	ftl_free_sblk
-	ldr	x1, [x19,1120]
-	mov	w0, -1
-	ldr	x2, [x19,3392]
-	strh	w0, [x1,80]
-	strh	w0, [x2,126]
-	strh	w0, [x1,130]
-	ldr	x0, [x19,3432]
-	bl	zbuf_free
-	str	xzr, [x19,3432]
-	strb	wzr, [x20,218]
-.L4183:
-	bl	flt_sys_flush
-	b	.L4180
-.L4067:
-	ldrh	w1, [x24,3440]
-	ldrh	w0, [x24,3442]
+	strh	wzr, [x19, 3438]
+	b	.L4000
+.L3996:
+	ldrh	w1, [x21, 16]
+	ldrh	w0, [x21, 18]
 	cmp	w1, w0
-	bcc	.L4068
+	bcc	.L3997
 	add	x20, x20, :lo12:.LANCHOR5
 	mov	w0, 6
-	strb	w0, [x20,218]
-	ldr	x0, [x24,3432]
+	strb	w0, [x20, 264]
+	ldr	x0, [x21, 8]
 	bl	zbuf_free
-	str	xzr, [x24,3432]
-	b	.L4180
-.L4068:
+	str	xzr, [x21, 8]
+	b	.L4000
+.L3997:
 	cmp	w22, 15
-	bls	.L3952
-	cmp	w26, 1
-	bne	.L4180
-	add	w21, w21, 1
-	uxtb	w21, w21
-	cmp	w21, 4
-	bls	.L3952
-	b	.L4180
-.L3953:
+	bls	.L3883
+	cmp	w27, 1
+	bne	.L4000
+	add	w23, w23, 1
+	and	w23, w23, 255
+	cmp	w23, 4
+	bls	.L3883
+	b	.L4000
+.L3882:
 	bl	gc_update_l2p_map_new
 	mov	w21, -1
 	bl	gc_free_src_blk
 	add	x19, x19, :lo12:.LANCHOR0
 	bl	ftl_flush
 	bl	pm_flush
-	strh	w21, [x24,80]
+	strh	w21, [x25, 80]
 	bl	ftl_ext_info_flush
-	ldr	x0, [x19,3392]
-	strh	w21, [x0,126]
+	ldr	x0, [x19, 3384]
+	strh	w21, [x0, 126]
 	mov	w0, 0
 	bl	ftl_info_flush
-.L4181:
+.L4091:
 	add	x20, x20, :lo12:.LANCHOR5
-	strb	wzr, [x20,218]
-.L4180:
-	mov	w1, 16
-	b	.L4140
-.L3993:
-	mov	w1, w24
-	b	.L4140
-.L4045:
+	strb	wzr, [x20, 264]
+	b	.L4000
+.L3974:
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
+	add	x1, x1, 1040
 	mov	w2, 3430
-	add	x1, x1, 1024
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-	b	.L4071
-.L4140:
-	sub	sp, x29, #16
-	mov	w0, w1
-	ldp	x19, x20, [sp,32]
-	ldp	x21, x22, [sp,48]
-	ldp	x23, x24, [sp,64]
-	ldp	x25, x26, [sp,80]
-	ldp	x27, x28, [sp,96]
-	ldp	x29, x30, [sp,16]
-	add	sp, sp, 128
-	ret
+	b	.L3999
 	.size	zftl_do_gc, .-zftl_do_gc
 	.align	2
 	.global	zftl_init
@@ -26743,418 +26516,419 @@ zftl_do_gc:
 zftl_init:
 	stp	x29, x30, [sp, -80]!
 	mov	w0, -1
-	adrp	x1, .LC2
+	adrp	x1, .LC1
+	add	x1, x1, :lo12:.LC1
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	adrp	x20, .LANCHOR0
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR0
+	stp	x21, x22, [sp, 32]
+	adrp	x20, .LANCHOR5
+	stp	x23, x24, [sp, 48]
 	adrp	x21, .LANCHOR3
-	adrp	x19, .LANCHOR5
-	str	x25, [sp,64]
-	stp	x23, x24, [sp,48]
-	add	x25, x19, :lo12:.LANCHOR5
+	str	x25, [sp, 64]
 	add	x23, x21, :lo12:.LANCHOR3
-	add	x24, x20, :lo12:.LANCHOR0
-	add	x1, x1, :lo12:.LC2
+	add	x24, x19, :lo12:.LANCHOR0
+	add	x25, x20, :lo12:.LANCHOR5
 	adrp	x22, .LANCHOR2
-	strb	w0, [x23,1962]
-	strb	w0, [x24,3416]
-	strb	w0, [x25,352]
+	strb	w0, [x23, 1956]
+	strb	w0, [x24, 3408]
+	strb	w0, [x25, 360]
 	mov	w0, -1
-	str	w0, [x25,1012]
-	adrp	x0, .LC1
-	add	x0, x0, :lo12:.LC1
-	strb	wzr, [x24,3388]
-	strb	wzr, [x23,1963]
-	strb	wzr, [x24,3389]
+	strb	wzr, [x24, 3381]
+	str	w0, [x25, 476]
+	adrp	x0, .LC2
+	strb	wzr, [x23, 1957]
+	add	x0, x0, :lo12:.LC2
+	strb	wzr, [x24, 3380]
 	bl	printk
 	add	x1, x22, :lo12:.LANCHOR2
-	ldrb	w3, [x24,1153]
-	ldrh	w4, [x24,2]
-	strb	w3, [x23,1420]
-	ldrb	w2, [x1,21]
-	ldrb	w9, [x1,20]
-	ldrh	w5, [x1,18]
-	strb	w2, [x23,1314]
-	mul	w2, w2, w3
-	ldrb	w0, [x1,17]
-	mov	w3, 1
-	ldrh	w6, [x1,22]
+	ldrb	w2, [x24, 1153]
+	strb	w2, [x23, 1412]
+	ldrh	w4, [x24, 2]
+	ldrb	w9, [x1, 20]
+	ldrh	w5, [x1, 18]
+	ldrb	w3, [x1, 21]
+	ldrb	w0, [x1, 17]
+	ldrh	w6, [x1, 22]
 	mov	w1, 0
 	sdiv	w10, w5, w9
-	uxtb	w2, w2
+	strb	w3, [x23, 1306]
+	mul	w2, w2, w3
 	ubfiz	w8, w0, 9, 7
-	strb	w9, [x23,1328]
-	strb	w0, [x24,3360]
-	strh	w5, [x23,1346]
-	strh	w10, [x23,1384]
-	strb	w2, [x23,1329]
-	strh	w6, [x24,1088]
-	strh	w8, [x25,998]
-	strh	w4, [x23,1418]
-.L4186:
-	cmp	w3, w4
-	bhi	.L4266
-	add	w1, w1, 1
-	lsl	w3, w3, 1
-	uxth	w1, w1
-	b	.L4186
-.L4266:
+	strb	w9, [x23, 1320]
+	mov	w3, 1
+	and	w2, w2, 255
+	strb	w0, [x23, 1946]
+	strh	w5, [x23, 1338]
+	strh	w10, [x23, 1376]
+	strb	w2, [x23, 1321]
+	strh	w6, [x24, 1096]
+	strh	w8, [x25, 462]
+	strh	w4, [x23, 1410]
+.L4094:
+	cmp	w4, w3
+	bcs	.L4095
+	mul	w7, w0, w5
 	add	x3, x21, :lo12:.LANCHOR3
 	sub	w1, w1, #1
-	mul	w7, w0, w5
 	mov	w4, 0
-	strh	w1, [x3,1312]
+	strh	w1, [x3, 1304]
 	mov	w1, 1
-	mul	w3, w7, w6
+	mul	w3, w6, w7
 	lsr	w11, w3, 21
-.L4188:
-	cmp	w1, w11
-	bhi	.L4267
-	add	w4, w4, 1
-	lsl	w1, w1, 1
-	uxth	w4, w4
-	b	.L4188
-.L4267:
+.L4096:
+	cmp	w11, w1
+	bcs	.L4097
 	mov	w1, 57344
-	mov	w11, 1
+	add	x11, x19, :lo12:.LANCHOR0
 	movk	w1, 0x1c, lsl 16
 	sub	w4, w4, #1
-	lsl	w4, w11, w4
-	add	x11, x20, :lo12:.LANCHOR0
-	mul	w1, w2, w1
 	mul	w3, w3, w2
-	str	w3, [x11,3368]
 	lsr	w6, w6, 4
-	mul	w1, w1, w4
-	str	w1, [x11,1032]
-	add	x4, x19, :lo12:.LANCHOR5
-	add	w3, w1, 24576
-	cmp	w6, 79
+	mul	w1, w2, w1
+	str	w3, [x11, 3360]
 	mul	w10, w10, w2
-	udiv	w0, w3, w0
-	str	w3, [x4,1016]
-	str	w0, [x11,3372]
-	sub	w11, w8, #1
+	cmp	w6, 79
 	mul	w7, w7, w2
+	lsl	w1, w1, w4
+	add	w3, w1, 24576
+	str	w1, [x11, 1032]
+	add	x4, x20, :lo12:.LANCHOR5
 	sub	w7, w7, #1
-	add	w0, w11, w0, lsl 2
+	udiv	w0, w3, w0
+	str	w3, [x4, 480]
 	udiv	w3, w3, w7
+	str	w0, [x11, 3364]
+	sub	w11, w8, #1
+	add	w0, w11, w0, lsl 2
 	add	w3, w3, 8
 	udiv	w0, w0, w8
-	strh	w0, [x4,1020]
+	strh	w0, [x4, 484]
 	ubfiz	w0, w0, 4, 16
 	sdiv	w0, w0, w10
-	strh	w0, [x4,264]
+	strh	w0, [x4, 220]
 	add	x0, x21, :lo12:.LANCHOR3
-	strh	w3, [x0,1390]
-	strh	w6, [x0,1388]
-	bhi	.L4190
+	strh	w3, [x0, 1382]
+	strh	w6, [x0, 1380]
+	bhi	.L4098
 	mov	w3, 80
-	strh	w3, [x0,1388]
-.L4190:
+	strh	w3, [x0, 1380]
+.L4098:
 	add	x0, x21, :lo12:.LANCHOR3
 	mov	w3, 2000
-	add	x6, x20, :lo12:.LANCHOR0
+	add	x6, x19, :lo12:.LANCHOR0
 	mov	w4, 256
 	cmp	w9, 2
-	strh	w3, [x0,1960]
+	strh	w3, [x0, 1954]
 	mov	w3, 50
-	strh	w3, [x0,1958]
-	add	x3, x19, :lo12:.LANCHOR5
-	strh	w4, [x3,260]
+	strh	w3, [x0, 1952]
+	add	x3, x20, :lo12:.LANCHOR5
+	strh	w4, [x3, 216]
 	mov	w4, 48
-	strh	w4, [x3,262]
+	strh	w4, [x3, 218]
 	mov	w4, 32
-	strh	w4, [x6,1104]
-	beq	.L4191
-	ldrb	w7, [x0,1344]
-	cbz	w7, .L4192
-.L4191:
+	strh	w4, [x6, 1112]
+	beq	.L4099
+	ldrb	w7, [x0, 1336]
+	cbz	w7, .L4100
+.L4099:
 	add	x3, x21, :lo12:.LANCHOR3
 	mov	w0, 150
 	mov	w4, 64
 	mov	w6, 12
-	strh	w0, [x3,1958]
-	add	x0, x19, :lo12:.LANCHOR5
-	strh	w4, [x0,262]
-	add	x4, x20, :lo12:.LANCHOR0
-	strh	w6, [x4,1104]
-	ldrb	w6, [x20,#:lo12:.LANCHOR0]
-	cbnz	w6, .L4193
+	strh	w0, [x3, 1952]
+	add	x0, x20, :lo12:.LANCHOR5
+	strh	w4, [x0, 218]
+	add	x4, x19, :lo12:.LANCHOR0
+	strh	w6, [x4, 1112]
+	ldrb	w6, [x19, #:lo12:.LANCHOR0]
+	cbnz	w6, .L4101
 	mov	w6, 4
-	strh	w6, [x4,1104]
+	strh	w6, [x4, 1112]
 	mov	w4, 600
-	strh	w4, [x3,1960]
+	strh	w4, [x3, 1954]
 	mov	w3, 128
-	strh	w3, [x0,260]
-.L4193:
-	add	x0, x20, :lo12:.LANCHOR0
-	ldrb	w0, [x0,1269]
-	cbz	w0, .L4195
+	strh	w3, [x0, 216]
+.L4101:
+	add	x0, x19, :lo12:.LANCHOR0
+	ldrb	w0, [x0, 1213]
+	cbz	w0, .L4103
 	add	x0, x21, :lo12:.LANCHOR3
 	mov	w3, 200
-	strh	w3, [x0,1958]
+	strh	w3, [x0, 1952]
 	mov	w3, 2000
-	strh	w3, [x0,1960]
-	b	.L4195
-.L4192:
-	ldrb	w6, [x6,1268]
-	cbz	w6, .L4195
-	mov	w6, 1200
-	strh	w4, [x0,1958]
-	strh	w6, [x0,1960]
-	strh	w4, [x3,262]
-.L4195:
-	add	x0, x20, :lo12:.LANCHOR0
-	mov	w3, 1
+	strh	w3, [x0, 1954]
+.L4103:
+	add	x0, x19, :lo12:.LANCHOR0
 	mul	w2, w5, w2
-	str	wzr, [x0,3412]
-	add	x0, x19, :lo12:.LANCHOR5
+	mov	w3, 1
+	str	wzr, [x0, 3396]
+	add	x0, x20, :lo12:.LANCHOR5
 	cmp	w8, w2, lsl 2
-	strb	w3, [x0,1001]
-	bge	.L4197
+	strb	w3, [x0, 465]
+	bge	.L4105
 	mov	w2, 2
-	strb	w2, [x0,1001]
-.L4197:
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L4198
+	strb	w2, [x0, 465]
+.L4105:
+	ldr	w0, [x22, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L4106
 	adrp	x0, .LC302
 	add	x0, x0, :lo12:.LC302
 	bl	printk
-.L4198:
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L4199
-	add	x1, x20, :lo12:.LANCHOR0
+.L4106:
+	ldr	w0, [x22, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L4107
+	add	x0, x19, :lo12:.LANCHOR0
+	ldr	w1, [x0, 3360]
 	adrp	x0, .LC303
 	add	x0, x0, :lo12:.LC303
-	ldr	w1, [x1,3368]
 	bl	printk
-.L4199:
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L4200
-	add	x1, x20, :lo12:.LANCHOR0
+.L4107:
+	ldr	w0, [x22, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L4108
+	add	x0, x19, :lo12:.LANCHOR0
+	ldr	w1, [x0, 3364]
 	adrp	x0, .LC304
 	add	x0, x0, :lo12:.LC304
-	ldr	w1, [x1,3372]
 	bl	printk
-.L4200:
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L4201
-	add	x1, x19, :lo12:.LANCHOR5
+.L4108:
+	ldr	w0, [x22, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L4109
+	add	x0, x20, :lo12:.LANCHOR5
+	ldr	w1, [x0, 480]
 	adrp	x0, .LC305
 	add	x0, x0, :lo12:.LC305
-	ldr	w1, [x1,1016]
 	bl	printk
-.L4201:
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L4202
-	add	x1, x19, :lo12:.LANCHOR5
+.L4109:
+	ldr	w0, [x22, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L4110
+	add	x0, x20, :lo12:.LANCHOR5
+	ldrh	w1, [x0, 484]
 	adrp	x0, .LC306
 	add	x0, x0, :lo12:.LC306
-	ldrh	w1, [x1,1020]
 	bl	printk
-.L4202:
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L4203
-	add	x1, x19, :lo12:.LANCHOR5
+.L4110:
+	ldr	w0, [x22, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L4111
+	add	x0, x20, :lo12:.LANCHOR5
+	ldrh	w1, [x0, 462]
 	adrp	x0, .LC307
 	add	x0, x0, :lo12:.LC307
-	ldrh	w1, [x1,998]
 	bl	printk
-.L4203:
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L4204
-	add	x1, x19, :lo12:.LANCHOR5
+.L4111:
+	ldr	w0, [x22, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L4112
+	add	x0, x20, :lo12:.LANCHOR5
+	ldrh	w1, [x0, 220]
 	adrp	x0, .LC308
 	add	x0, x0, :lo12:.LC308
-	ldrh	w1, [x1,264]
 	bl	printk
-.L4204:
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L4205
-	add	x1, x21, :lo12:.LANCHOR3
+.L4112:
+	ldr	w0, [x22, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L4113
+	add	x0, x21, :lo12:.LANCHOR3
+	ldrh	w1, [x0, 1380]
 	adrp	x0, .LC309
 	add	x0, x0, :lo12:.LC309
-	ldrh	w1, [x1,1388]
 	bl	printk
-.L4205:
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L4206
-	add	x1, x21, :lo12:.LANCHOR3
+.L4113:
+	ldr	w0, [x22, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L4114
+	add	x0, x21, :lo12:.LANCHOR3
+	ldrh	w1, [x0, 1382]
 	adrp	x0, .LC310
 	add	x0, x0, :lo12:.LC310
-	ldrh	w1, [x1,1390]
 	bl	printk
-.L4206:
+.L4114:
+	add	x24, x20, :lo12:.LANCHOR5
 	bl	zbuf_init
-	add	x25, x19, :lo12:.LANCHOR5
 	mov	w0, 16384
-	add	x24, x20, :lo12:.LANCHOR0
-	add	x23, x21, :lo12:.LANCHOR3
 	bl	ftl_malloc
-	str	x0, [x25,648]
+	add	x25, x19, :lo12:.LANCHOR0
+	add	x23, x21, :lo12:.LANCHOR3
+	str	x0, [x24, 392]
 	mov	w0, 16384
 	bl	ftl_malloc
-	str	x0, [x25,664]
+	str	x0, [x24, 408]
 	mov	w0, 16384
 	bl	ftl_malloc
-	str	x0, [x25,1024]
-	ldrh	w1, [x24,1088]
+	str	x0, [x24, 488]
+	mov	w0, 256
+	bl	ftl_dma32_malloc
+	str	x0, [x24, 376]
+	mov	w0, 256
+	bl	ftl_dma32_malloc
+	ldrh	w1, [x25, 1096]
+	str	x0, [x24, 416]
 	mov	w0, 6
 	mul	w0, w1, w0
-	bl	ftl_malloc
-	str	x0, [x24,1040]
-	ldrb	w1, [x23,1329]
-	ldrh	w0, [x23,1384]
+	bl	ftl_dma32_malloc
+	str	x0, [x25, 1040]
+	ldrb	w1, [x23, 1321]
+	ldrh	w0, [x23, 1376]
 	mul	w0, w0, w1
 	lsl	w0, w0, 2
-	bl	ftl_malloc
-	str	x0, [x23,1944]
-	ldrb	w1, [x23,1329]
-	ldrh	w0, [x23,1384]
-	ldr	x2, [x25,664]
-	str	x2, [x23,1936]
+	bl	ftl_dma32_malloc
+	ldrb	w1, [x23, 1321]
+	str	x0, [x23, 1936]
+	ldrh	w0, [x23, 1376]
+	ldr	x2, [x24, 408]
+	str	x2, [x23, 1928]
 	mul	w0, w0, w1
+	ldrh	w1, [x25, 1096]
 	add	x3, x2, w0, sxtw 3
-	ldrh	w1, [x24,1088]
-	str	x3, [x24,1112]
-	lsr	w1, w1, 1
-	add	w1, w1, w0, lsl 1
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
+	lsl	w0, w0, 1
+	add	w1, w0, w1, lsr 1
+	ldr	w0, [x22, #:lo12:.LANCHOR2]
 	add	x1, x2, w1, sxtw 2
-	str	x1, [x24,1120]
-	tbz	x0, 12, .L4207
+	str	x3, [x25, 1120]
+	str	x1, [x25, 1128]
+	tbz	x0, 12, .L4115
 	adrp	x0, .LC311
 	add	x0, x0, :lo12:.LC311
 	bl	printk
-.L4207:
-	add	x0, x20, :lo12:.LANCHOR0
+.L4115:
+	add	x0, x19, :lo12:.LANCHOR0
 	add	x21, x21, :lo12:.LANCHOR3
-	add	x3, x19, :lo12:.LANCHOR5
-	ldrh	w1, [x0,1088]
-	ldrh	w0, [x21,1384]
-	ldrb	w21, [x21,1329]
-	ldrh	w23, [x3,1020]
+	ldrh	w1, [x0, 1096]
+	ldrh	w0, [x21, 1376]
+	ldrb	w21, [x21, 1321]
 	mul	w21, w0, w21
-	ldr	w0, [x22,#:lo12:.LANCHOR2]
-	lsl	w23, w23, 2
-	add	w23, w23, w1, lsl 2
+	add	x0, x20, :lo12:.LANCHOR5
+	ldrh	w23, [x0, 484]
 	add	w21, w1, w21, lsl 2
-	add	w23, w23, 704
+	lsl	w1, w1, 2
 	lsl	w21, w21, 1
 	add	w21, w21, 632
-	tbz	x0, 12, .L4208
+	add	w23, w1, w23, lsl 2
+	ldr	w1, [x22, #:lo12:.LANCHOR2]
+	add	w23, w23, 704
+	tbz	x1, 12, .L4116
+	ldrh	w3, [x0, 462]
+	mov	w2, w23
 	adrp	x0, .LC312
-	ldrh	w3, [x3,998]
-	add	x0, x0, :lo12:.LC312
 	mov	w1, w21
-	mov	w2, w23
+	add	x0, x0, :lo12:.LC312
 	bl	printk
-.L4208:
-	add	x19, x19, :lo12:.LANCHOR5
-	ldrh	w0, [x19,998]
+.L4116:
+	add	x20, x20, :lo12:.LANCHOR5
+	ldrh	w0, [x20, 462]
 	cmp	w21, w0
-	bhi	.L4210
+	bhi	.L4117
 	cmp	w23, w0
-	bls	.L4209
-.L4210:
-.L4211:
-	b	.L4211
-.L4209:
+	bls	.L4118
+.L4117:
+.L4171:
+	b	.L4171
+.L4095:
+	add	w1, w1, 1
+	lsl	w3, w3, 1
+	and	w1, w1, 65535
+	b	.L4094
+.L4097:
+	add	w4, w4, 1
+	lsl	w1, w1, 1
+	and	w4, w4, 65535
+	b	.L4096
+.L4100:
+	ldrb	w6, [x6, 1212]
+	cbz	w6, .L4103
+	mov	w6, 1200
+	strh	w4, [x0, 1952]
+	strh	w6, [x0, 1954]
+	strh	w4, [x3, 218]
+	b	.L4103
+.L4118:
 	bl	sblk_init
 	bl	gc_init
 	bl	ftl_info_blk_init
 	cmn	w0, #1
-	beq	.L4212
+	beq	.L4093
+	add	x21, x19, :lo12:.LANCHOR0
 	bl	ftl_ext_info_init
-	add	x21, x20, :lo12:.LANCHOR0
 	mov	w0, 1
 	bl	pm_init
 	bl	lpa_rebuild_hash
-	ldr	x0, [x21,1120]
+	ldr	x0, [x21, 1128]
 	mov	x1, 0
 	add	x0, x0, 16
 	bl	ftl_open_sblk_recovery
-	ldr	x1, [x21,1120]
-	add	x0, x1, 48
-	add	x1, x1, 16
+	ldr	x0, [x21, 1128]
+	add	x1, x0, 16
+	add	x0, x0, 48
 	bl	ftl_open_sblk_recovery
-	ldr	x1, [x21,3392]
-	ldr	w0, [x1,8]
+	ldr	x1, [x21, 3384]
+	ldr	w0, [x1, 8]
 	add	w0, w0, 16
-	str	w0, [x1,8]
-	ldr	x0, [x21,1120]
+	str	w0, [x1, 8]
+	ldr	x0, [x21, 1128]
 	add	x0, x0, 16
 	bl	ftl_info_data_recovery
-	ldr	x0, [x21,1120]
+	ldr	x0, [x21, 1128]
 	add	x0, x0, 48
 	bl	ftl_info_data_recovery
-	ldr	x0, [x21,1120]
+	ldr	x0, [x21, 1128]
 	add	x0, x0, 80
 	bl	ftl_info_data_recovery
 	bl	gc_recovery
 	bl	pm_flush
 	mov	w0, 1
 	bl	ftl_total_vpn_update
-	ldrb	w0, [x19,657]
-	cbz	w0, .L4213
-	ldr	x1, [x21,3392]
-	ldr	w0, [x1,68]
+	ldrb	w0, [x20, 401]
+	cbz	w0, .L4120
+	ldr	x1, [x21, 3384]
+	ldr	w0, [x1, 68]
 	add	w0, w0, 1
-	str	w0, [x1,68]
-.L4213:
+	str	w0, [x1, 68]
+.L4120:
 	bl	ftl_ext_info_flush
 	mov	w0, 0
 	bl	ftl_info_flush
 	bl	print_ftl_debug_info
-	add	x1, x20, :lo12:.LANCHOR0
-	ldr	x0, [x1,1120]
-	ldrh	w0, [x0,124]
-	cbnz	w0, .L4217
-	ldrh	w2, [x1,3376]
-	mov	w19, 16384
-	ldrh	w0, [x1,3380]
-	add	w0, w2, w0
+	add	x1, x19, :lo12:.LANCHOR0
+	ldr	x0, [x1, 1128]
+	ldrh	w0, [x0, 124]
+	cbnz	w0, .L4127
+	ldrh	w0, [x1, 3368]
+	ldrh	w1, [x1, 3372]
+	add	w0, w0, w1
 	cmp	w0, 7
-	ble	.L4214
-.L4216:
+	ble	.L4127
+.L4123:
 	mov	w0, 0
-	b	.L4212
-.L4217:
-	mov	w19, 16384
-.L4214:
+.L4093:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldr	x25, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	ret
+.L4127:
+	add	x19, x19, :lo12:.LANCHOR0
+	mov	w20, 16384
 	mov	w21, 65535
-.L4249:
+.L4124:
 	mov	w1, 1
 	mov	w0, 0
 	bl	zftl_do_gc
-	mov	w0, 1
-	mov	w1, w0
+	mov	w1, 1
+	mov	w0, w1
 	bl	zftl_do_gc
-	add	x1, x20, :lo12:.LANCHOR0
-	ldr	x0, [x1,1120]
-	ldrh	w2, [x0,124]
-	cbnz	w2, .L4215
-	ldrh	w0, [x0,80]
+	ldr	x0, [x19, 1128]
+	ldrh	w1, [x0, 124]
+	cbnz	w1, .L4122
+	ldrh	w0, [x0, 80]
 	cmp	w0, w21
-	bne	.L4215
-	ldrh	w2, [x1,3376]
-	ldrh	w0, [x1,3380]
-	add	w0, w2, w0
+	bne	.L4122
+	ldrh	w0, [x19, 3368]
+	ldrh	w1, [x19, 3372]
+	add	w0, w0, w1
 	cmp	w0, 7
-	bgt	.L4216
-.L4215:
-	subs	w19, w19, #1
-	bne	.L4249
-	b	.L4216
-.L4212:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldr	x25, [sp,64]
-	ldp	x29, x30, [sp], 80
-	ret
+	bgt	.L4123
+.L4122:
+	subs	w20, w20, #1
+	bne	.L4124
+	b	.L4123
 	.size	zftl_init, .-zftl_init
 	.align	2
 	.global	rk_ftl_init
@@ -27163,403 +26937,399 @@ rk_ftl_init:
 	stp	x29, x30, [sp, -48]!
 	adrp	x0, jiffies
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
 	adrp	x21, .LANCHOR5
-	ldr	x0, [x0,#:lo12:jiffies]
-	stp	x19, x20, [sp,16]
 	add	x19, x21, :lo12:.LANCHOR5
-	str	x0, [x19,272]
+	ldr	x0, [x0, #:lo12:jiffies]
+	str	x0, [x19, 224]
 	mov	w0, 136
-	strb	wzr, [x19,1032]
+	strb	wzr, [x19, 496]
+	str	wzr, [x19, 248]
 	bl	ftl_malloc
-	str	x0, [x19,280]
-	cbnz	x0, .L4269
-.L4271:
-	mov	w0, -1
-	b	.L4270
-.L4269:
+	str	x0, [x19, 232]
+	cbnz	x0, .L4174
+.L4176:
+	mov	w20, -1
+.L4173:
+	mov	w0, w20
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	ret
+.L4174:
 	mov	w0, 2048
 	bl	ftl_malloc
-	str	x0, [x19,1040]
-	add	x0, x19, 288
-	str	xzr, [x19,288]
-	add	x1, x0, 760
-	str	xzr, [x19,1048]
+	add	x1, x19, 512
+	stp	x0, xzr, [x19, 504]
+	str	xzr, [x19, 240]
+	add	x0, x19, 240
 	bl	rknand_get_reg_addr
-	ldr	x0, [x19,288]
-	cbz	x0, .L4271
+	ldr	x0, [x19, 240]
+	cbz	x0, .L4176
 	bl	rk_nandc_irq_init
-	mov	w1, 0
-	ldr	x0, [x19,1040]
-	mov	w2, w1
+	ldr	x0, [x19, 504]
 	mov	w3, 2048
+	mov	w2, 0
+	mov	w1, 0
 	bl	flash_sram_load_store
 	bl	rknand_flash_cs_init
-	ldr	x0, [x19,280]
+	ldr	x0, [x19, 232]
 	adrp	x1, zftl_deinit
 	add	x1, x1, :lo12:zftl_deinit
-	str	x1, [x0,80]
+	str	x1, [x0, 80]
 	adrp	x1, zftl_cache_flush
 	add	x1, x1, :lo12:zftl_cache_flush
-	str	x1, [x0,64]
+	str	x1, [x0, 64]
 	adrp	x1, zftl_flash_suspend
 	add	x1, x1, :lo12:zftl_flash_suspend
-	str	x1, [x0,88]
+	str	x1, [x0, 88]
 	adrp	x1, zftl_flash_resume
 	add	x1, x1, :lo12:zftl_flash_resume
-	str	x1, [x0,96]
+	str	x1, [x0, 96]
 	adrp	x1, zftl_get_density
 	add	x1, x1, :lo12:zftl_get_density
-	str	x1, [x0,72]
+	str	x1, [x0, 72]
 	adrp	x1, zftl_read_flash_info
 	add	x1, x1, :lo12:zftl_read_flash_info
-	str	x1, [x0,112]
+	str	x1, [x0, 112]
 	adrp	x1, zftl_read
 	add	x1, x1, :lo12:zftl_read
-	str	x1, [x0,40]
+	str	x1, [x0, 40]
 	adrp	x1, zftl_write
 	add	x1, x1, :lo12:zftl_write
-	str	x1, [x0,48]
+	str	x1, [x0, 48]
 	adrp	x1, zftl_sys_read
 	add	x1, x1, :lo12:zftl_sys_read
-	str	x1, [x0,24]
+	str	x1, [x0, 24]
 	adrp	x1, zftl_sys_write
 	add	x1, x1, :lo12:zftl_sys_write
-	str	x1, [x0,32]
+	str	x1, [x0, 32]
 	adrp	x1, zftl_vendor_read
 	add	x1, x1, :lo12:zftl_vendor_read
-	str	x1, [x0,8]
+	str	x1, [x0, 8]
 	adrp	x1, zftl_vendor_write
 	add	x1, x1, :lo12:zftl_vendor_write
-	str	x1, [x0,16]
+	str	x1, [x0, 16]
 	adrp	x1, zftl_nandc_get_irq_status
 	add	x1, x1, :lo12:zftl_nandc_get_irq_status
-	str	x1, [x0,120]
+	str	x1, [x0, 120]
 	adrp	x1, zftl_proc_ftl_read
 	add	x1, x1, :lo12:zftl_proc_ftl_read
-	str	x1, [x0,128]
+	str	x1, [x0, 128]
 	adrp	x1, zftl_do_gc
 	add	x1, x1, :lo12:zftl_do_gc
-	str	x1, [x0,104]
+	str	x1, [x0, 104]
 	adrp	x1, zftl_discard
 	add	x1, x1, :lo12:zftl_discard
-	str	x1, [x0,56]
-	ldr	x0, [x19,288]
+	str	x1, [x0, 56]
+	ldr	x0, [x19, 240]
 	bl	nand_flash_init
 	mov	w22, w0
-	cbnz	w0, .L4272
+	cbnz	w0, .L4177
 	bl	zftl_init
 	mov	w20, w0
 	bl	zftl_proc_debug_init
 	mov	w0, 1
-	strb	w0, [x19,1032]
-	b	.L4273
-.L4272:
-	ldr	x1, [x19,280]
-	adrp	x2, ftl_get_density
-	add	x2, x2, :lo12:ftl_get_density
-	adrp	x0, ftl_deinit
-	add	x0, x0, :lo12:ftl_deinit
-	str	x2, [x1,72]
-	adrp	x2, ftl_read_flash_info
-	add	x2, x2, :lo12:ftl_read_flash_info
-	str	x2, [x1,112]
-	adrp	x2, ftl_read
-	str	x0, [x1,80]
-	add	x2, x2, :lo12:ftl_read
-	str	x2, [x1,40]
-	adrp	x2, ftl_write
-	adrp	x0, ftl_cache_flush
-	add	x2, x2, :lo12:ftl_write
-	str	x2, [x1,48]
-	adrp	x2, ftl_sys_read
-	add	x0, x0, :lo12:ftl_cache_flush
-	add	x2, x2, :lo12:ftl_sys_read
-	str	x2, [x1,24]
-	adrp	x2, ftl_sys_write
-	str	x0, [x1,64]
-	add	x2, x2, :lo12:ftl_sys_write
-	str	x2, [x1,32]
-	adrp	x2, ftl_vendor_read
-	adrp	x0, ftl_flash_suspend
-	add	x2, x2, :lo12:ftl_vendor_read
-	str	x2, [x1,8]
-	adrp	x2, ftl_vendor_write
-	add	x0, x0, :lo12:ftl_flash_suspend
-	add	x2, x2, :lo12:ftl_vendor_write
-	str	x2, [x1,16]
-	adrp	x2, ftl_nandc_get_irq_status
-	str	x0, [x1,88]
-	add	x2, x2, :lo12:ftl_nandc_get_irq_status
-	str	x2, [x1,120]
-	adrp	x2, ftl_proc_ftl_read
-	adrp	x0, ftl_flash_resume
-	add	x2, x2, :lo12:ftl_proc_ftl_read
-	str	x2, [x1,128]
-	adrp	x2, ftl_do_gc
-	add	x0, x0, :lo12:ftl_flash_resume
-	add	x2, x2, :lo12:ftl_do_gc
-	str	x0, [x1,96]
-	str	x2, [x1,104]
-	adrp	x2, ftl_discard
-	ldr	x0, [x19,288]
-	add	x2, x2, :lo12:ftl_discard
-	str	x2, [x1,56]
+	strb	w0, [x19, 496]
+.L4178:
+	mov	w1, w20
+	adrp	x0, .LC313
+	add	x0, x0, :lo12:.LC313
+	bl	printk
+	b	.L4173
+.L4177:
+	ldr	x0, [x19, 232]
+	adrp	x1, ftl_deinit
+	add	x1, x1, :lo12:ftl_deinit
+	str	x1, [x0, 80]
+	adrp	x1, ftl_cache_flush
+	add	x1, x1, :lo12:ftl_cache_flush
+	str	x1, [x0, 64]
+	adrp	x1, ftl_flash_suspend
+	add	x1, x1, :lo12:ftl_flash_suspend
+	str	x1, [x0, 88]
+	adrp	x1, ftl_flash_resume
+	add	x1, x1, :lo12:ftl_flash_resume
+	str	x1, [x0, 96]
+	adrp	x1, ftl_get_density
+	add	x1, x1, :lo12:ftl_get_density
+	str	x1, [x0, 72]
+	adrp	x1, ftl_read_flash_info
+	add	x1, x1, :lo12:ftl_read_flash_info
+	str	x1, [x0, 112]
+	adrp	x1, ftl_read
+	add	x1, x1, :lo12:ftl_read
+	str	x1, [x0, 40]
+	adrp	x1, ftl_write
+	add	x1, x1, :lo12:ftl_write
+	str	x1, [x0, 48]
+	adrp	x1, ftl_sys_read
+	add	x1, x1, :lo12:ftl_sys_read
+	str	x1, [x0, 24]
+	adrp	x1, ftl_sys_write
+	add	x1, x1, :lo12:ftl_sys_write
+	str	x1, [x0, 32]
+	adrp	x1, ftl_vendor_read
+	add	x1, x1, :lo12:ftl_vendor_read
+	str	x1, [x0, 8]
+	adrp	x1, ftl_vendor_write
+	add	x1, x1, :lo12:ftl_vendor_write
+	str	x1, [x0, 16]
+	adrp	x1, ftl_nandc_get_irq_status
+	add	x1, x1, :lo12:ftl_nandc_get_irq_status
+	str	x1, [x0, 120]
+	adrp	x1, ftl_proc_ftl_read
+	add	x1, x1, :lo12:ftl_proc_ftl_read
+	str	x1, [x0, 128]
+	adrp	x1, ftl_do_gc
+	add	x1, x1, :lo12:ftl_do_gc
+	str	x1, [x0, 104]
+	adrp	x1, ftl_discard
+	add	x1, x1, :lo12:ftl_discard
+	str	x1, [x0, 56]
+	ldr	x0, [x19, 240]
 	bl	FlashInit
 	mov	w20, w0
 	cmn	w22, #2
 	adrp	x22, .LANCHOR2
-	bne	.L4274
+	bne	.L4179
 	add	x19, x22, :lo12:.LANCHOR2
-	adrp	x1, gNandParaInfo
-	add	x19, x19, 8
-	add	x1, x1, :lo12:gNandParaInfo
 	mov	w2, 32
+	add	x19, x19, 8
+	adrp	x1, gNandParaInfo
 	mov	x0, x19
+	add	x1, x1, :lo12:gNandParaInfo
 	bl	ftl_memcpy
-	ldrb	w0, [x19,18]
+	ldrb	w0, [x19, 18]
 	bl	flash_lsb_page_tbl_build
-	ldrh	w0, [x19,10]
-	strh	w0, [x19,26]
-.L4274:
+	ldrh	w0, [x19, 10]
+	strh	w0, [x19, 26]
+.L4179:
 	adrp	x0, g_nandc_version_data
-	ldr	w1, [x0,#:lo12:g_nandc_version_data]
+	ldr	w1, [x0, #:lo12:g_nandc_version_data]
 	mov	w0, 12336
 	movk	w0, 0x5638, lsl 16
 	cmp	w1, w0
 	adrp	x1, .LANCHOR0
-	bne	.L4275
+	bne	.L4180
 	adrp	x0, gFlashSlcMode
-	ldrb	w0, [x0,#:lo12:gFlashSlcMode]
-	cbnz	w0, .L4276
-.L4275:
+	ldrb	w0, [x0, #:lo12:gFlashSlcMode]
+	cbnz	w0, .L4181
+.L4180:
 	add	x0, x1, :lo12:.LANCHOR0
-	strb	wzr, [x1,#:lo12:.LANCHOR0]
-	strb	wzr, [x0,1154]
-.L4276:
+	strb	wzr, [x1, #:lo12:.LANCHOR0]
+	strb	wzr, [x0, 1154]
+.L4181:
 	adrp	x2, gNandFlashIDBEccBits
 	add	x0, x1, :lo12:.LANCHOR0
 	add	x22, x22, :lo12:.LANCHOR2
 	add	x21, x21, :lo12:.LANCHOR5
-	ldrb	w2, [x2,#:lo12:gNandFlashIDBEccBits]
-	strb	w2, [x0,1152]
+	ldrb	w2, [x2, #:lo12:gNandFlashIDBEccBits]
+	strb	w2, [x0, 1152]
 	adrp	x2, gNandFlashEccBits
-	ldrh	w3, [x22,18]
-	str	xzr, [x21,328]
-	ldrb	w2, [x2,#:lo12:gNandFlashEccBits]
-	strb	w2, [x0,1244]
-	mov	w2, 1
+	ldrh	w3, [x22, 18]
+	str	xzr, [x21, 336]
+	ldrb	w2, [x2, #:lo12:gNandFlashEccBits]
+	strb	w2, [x0, 1249]
 	mov	w0, 0
-.L4277:
-	cmp	w2, w3
-	bhi	.L4282
-	add	w0, w0, 1
-	lsl	w2, w2, 1
-	uxth	w0, w0
-	b	.L4277
-.L4282:
-	adrp	x2, .LANCHOR3+1312
+	mov	w2, 1
+.L4182:
+	cmp	w3, w2
+	bcs	.L4183
 	add	x1, x1, :lo12:.LANCHOR0
+	adrp	x2, .LANCHOR3+1304
 	sub	w0, w0, #1
-	strb	wzr, [x1,1192]
-	strh	w0, [x2,#:lo12:.LANCHOR3+1312]
-	cbnz	w20, .L4273
+	strh	w0, [x2, #:lo12:.LANCHOR3+1304]
+	strb	wzr, [x1, 1192]
+	cbnz	w20, .L4178
 	bl	FtlInit
 	mov	w20, w0
-.L4273:
-	adrp	x0, .LC313
-	mov	w1, w20
-	add	x0, x0, :lo12:.LC313
-	bl	printk
-	mov	w0, w20
-.L4270:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 48
-	ret
+	b	.L4178
+.L4183:
+	add	w0, w0, 1
+	lsl	w2, w2, 1
+	and	w0, w0, 65535
+	b	.L4182
 	.size	rk_ftl_init, .-rk_ftl_init
 	.align	2
 	.global	zftl_write
 	.type	zftl_write, %function
 zftl_write:
-	stp	x29, x30, [sp, -96]!
+	stp	x29, x30, [sp, -112]!
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	mov	w20, w0
+	stp	x19, x20, [sp, 16]
+	mov	w19, w0
 	adrp	x0, .LANCHOR2
-	stp	x21, x22, [sp,32]
-	stp	x25, x26, [sp,64]
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	mov	w19, w1
-	stp	x23, x24, [sp,48]
-	stp	x27, x28, [sp,80]
+	stp	x21, x22, [sp, 32]
+	stp	x25, x26, [sp, 64]
+	mov	w20, w1
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
 	mov	w21, w2
-	mov	x25, x3
-	tbz	x0, 12, .L4284
+	stp	x23, x24, [sp, 48]
+	mov	x26, x3
+	stp	x27, x28, [sp, 80]
+	tbz	x0, 12, .L4189
+	ldr	w4, [x26]
+	mov	w3, w2
 	adrp	x0, .LC314
-	ldr	w4, [x25]
+	mov	w2, w1
 	add	x0, x0, :lo12:.LC314
-	mov	w1, w20
-	mov	w2, w19
-	mov	w3, w21
+	mov	w1, w19
 	bl	printk
-.L4284:
-	cbnz	w20, .L4285
+.L4189:
+	cbnz	w19, .L4190
 	adrp	x0, .LANCHOR0+1032
-	mov	w20, 24576
-	ldr	w1, [x0,#:lo12:.LANCHOR0+1032]
-	b	.L4286
-.L4285:
-	cmp	w20, 3
-	mov	w0, -1
-	bhi	.L4287
-	lsl	w20, w20, 13
-	mov	w1, 8192
-.L4286:
-	cmp	w19, w1
-	bcs	.L4303
-	cmp	w21, w1
-	bhi	.L4303
-	add	w2, w19, w21
-	mov	w0, -1
-	cmp	w2, w1
-	bhi	.L4287
-	add	w19, w20, w19
-	adrp	x20, .LANCHOR0
-	add	x0, x20, :lo12:.LANCHOR0
-	sub	w24, w21, #1
-	add	w24, w24, w19
-	add	w27, w19, w21
-	ldrb	w0, [x0,3360]
-	udiv	w26, w19, w0
-	mov	w23, w26
-	udiv	w24, w24, w0
-	sub	w22, w24, w26
-	add	w22, w22, 1
-.L4288:
-	cbz	w22, .L4314
-	add	x0, x20, :lo12:.LANCHOR0
-	ldrb	w1, [x0,3388]
-	cbz	w1, .L4289
-	ldrb	w0, [x0,3362]
-	cmp	w0, 2
-	bhi	.L4289
+	mov	w19, 24576
+	ldr	w0, [x0, #:lo12:.LANCHOR0+1032]
+.L4191:
+	cmp	w0, w20
+	ccmp	w0, w21, 0, hi
+	bcc	.L4209
+	add	w1, w20, w21
+	cmp	w0, w1
+	bcc	.L4209
+	adrp	x0, .LANCHOR3
+	add	x0, x0, :lo12:.LANCHOR3
+	add	w19, w19, w20
+	sub	w23, w21, #1
+	add	w23, w23, w19
+	adrp	x22, .LANCHOR0
+	ldrb	w1, [x0, 1946]
+	add	x27, x22, :lo12:.LANCHOR0
+	str	x0, [x29, 104]
+	add	w0, w19, w21
+	str	w0, [x29, 100]
+	udiv	w25, w19, w1
+	udiv	w23, w23, w1
+	mov	w20, w25
+	sub	w24, w23, w25
+	add	w24, w24, 1
+.L4193:
+	cbnz	w24, .L4202
 	bl	ftl_write_commit
-.L4289:
+	mov	w1, 1
 	mov	w0, 0
-	bl	buf_alloc
-	mov	x28, x0
-	cbnz	x0, .L4290
-	bl	ftl_write_commit
-	b	.L4288
-.L4290:
-	strb	wzr, [x0,57]
-	add	x0, x20, :lo12:.LANCHOR0
-	cmp	w23, w26
-	ldrb	w4, [x0,3360]
-	cset	w0, eq
-	strb	w4, [x28,56]
-	cmp	w23, w24
-	beq	.L4292
-	cbz	w0, .L4293
-	b	.L4305
-.L4292:
-	cbz	w0, .L4294
-.L4305:
-	udiv	w0, w19, w4
-	msub	w0, w0, w4, w19
-	uxtb	w0, w0
-	strb	w0, [x28,57]
-	sub	w4, w4, w0
-	uxtb	w4, w4
-	cmp	w4, w21
-	csel	w4, w21, w4, hi
-	b	.L4312
-.L4294:
-	msub	w4, w4, w23, w27
-.L4312:
-	strb	w4, [x28,56]
-.L4293:
-	ldrb	w1, [x28,57]
-	sub	w22, w22, #1
-	ldr	x0, [x28,8]
-	ldrb	w2, [x28,56]
-	add	x0, x0, x1, lsl 9
-	mov	x1, x25
-	lsl	w2, w2, 9
-	bl	ftl_memcpy
-	str	w23, [x28,36]
-	add	x0, x20, :lo12:.LANCHOR0
-	add	w23, w23, 1
-	ldr	x1, [x0,3392]
-	ldr	w0, [x1,8]
-	add	w2, w0, 1
-	str	w2, [x1,8]
-	str	w0, [x28,32]
-	mov	x0, x28
-	bl	ftl_write_buf
-	ldrb	w0, [x28,56]
-	add	x25, x25, x0, lsl 9
-	b	.L4288
-.L4314:
-	bl	ftl_write_commit
-	mov	w1, 1
-	mov	w0, w22
 	bl	zftl_do_gc
-	add	x1, x20, :lo12:.LANCHOR0
-	ldr	x0, [x1,1120]
-	ldrh	w0, [x0,124]
-	cbnz	w0, .L4298
-	ldrh	w2, [x1,3376]
-	ldrh	w0, [x1,3380]
-	add	w0, w2, w0
+	add	x1, x22, :lo12:.LANCHOR0
+	ldr	x0, [x1, 1128]
+	ldrh	w0, [x0, 124]
+	cbnz	w0, .L4203
+	ldrh	w0, [x1, 3368]
+	ldrh	w1, [x1, 3372]
+	add	w0, w0, w1
 	cmp	w0, 11
-	bgt	.L4300
-.L4298:
-	mov	w0, 0
+	bgt	.L4204
+.L4203:
 	mov	w1, 1
-.L4313:
+	mov	w0, 0
 	bl	zftl_do_gc
-.L4300:
-	add	x1, x20, :lo12:.LANCHOR0
-	ldrh	w2, [x1,3376]
-	ldrh	w0, [x1,3380]
-	add	w0, w2, w0
+.L4204:
+	add	x22, x22, :lo12:.LANCHOR0
+.L4205:
+	ldrh	w0, [x22, 3368]
+	ldrh	w1, [x22, 3372]
+	add	w0, w0, w1
 	cmp	w0, 7
-	bgt	.L4315
+	ble	.L4206
+	bl	timer_get_time
+	adrp	x1, .LANCHOR5+472
+	str	w0, [x1, #:lo12:.LANCHOR5+472]
+	mov	w0, 0
+.L4188:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 112
+	ret
+.L4190:
+	cmp	w19, 3
+	bhi	.L4209
+	lsl	w19, w19, 13
+	mov	w0, 8192
+	b	.L4191
+.L4202:
+	ldrb	w0, [x27, 3381]
+	cbz	w0, .L4194
+	ldrb	w0, [x27, 3353]
+	cmp	w0, 2
+	bhi	.L4194
+	bl	ftl_write_commit
+.L4194:
+	mov	w0, 0
+	bl	buf_alloc
+	mov	x28, x0
+	cbnz	x0, .L4195
+	bl	ftl_write_commit
+	b	.L4193
+.L4195:
+	strb	wzr, [x0, 57]
+	cmp	w20, w25
+	ldr	x0, [x29, 104]
+	ccmp	w20, w23, 4, ne
+	ldrb	w0, [x0, 1946]
+	strb	w0, [x28, 56]
+	bne	.L4198
+	cmp	w20, w25
+	bne	.L4199
+	udiv	w1, w19, w0
+	msub	w1, w1, w0, w19
+	and	w1, w1, 255
+	strb	w1, [x28, 57]
+	sub	w0, w0, w1
+	and	w0, w0, 255
+	cmp	w21, w0
+	csel	w0, w21, w0, cc
+.L4217:
+	strb	w0, [x28, 56]
+.L4198:
+	ldrb	w4, [x28, 57]
+	mov	x1, x26
+	ldrb	w2, [x28, 56]
+	sub	w24, w24, #1
+	ldr	x0, [x28, 8]
+	lsl	w2, w2, 9
+	add	x0, x0, x4, lsl 9
+	bl	ftl_memcpy
+	ldr	x1, [x27, 3384]
+	str	w20, [x28, 36]
+	add	w20, w20, 1
+	ldr	w0, [x1, 8]
+	add	w2, w0, 1
+	str	w2, [x1, 8]
+	str	w0, [x28, 32]
+	mov	x0, x28
+	bl	ftl_write_buf
+	ldrb	w0, [x28, 56]
+	add	x26, x26, x0, lsl 9
+	b	.L4193
+.L4199:
+	ldr	w1, [x29, 100]
+	msub	w0, w0, w20, w1
+	b	.L4217
+.L4206:
 	mov	w1, 1
 	mov	w0, 0
 	bl	zftl_do_gc
-	mov	w0, 1
-	mov	w1, w0
-	b	.L4313
-.L4315:
-	bl	timer_get_time
-	adrp	x1, .LANCHOR5+1008
-	str	w0, [x1,#:lo12:.LANCHOR5+1008]
-	mov	w0, 0
-	b	.L4287
-.L4303:
+	mov	w1, 1
+	mov	w0, w1
+	bl	zftl_do_gc
+	b	.L4205
+.L4209:
 	mov	w0, -1
-.L4287:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 96
-	ret
+	b	.L4188
 	.size	zftl_write, .-zftl_write
 	.align	2
 	.global	zftl_vendor_write
 	.type	zftl_vendor_write, %function
 zftl_vendor_write:
 	stp	x29, x30, [sp, -16]!
-	mov	w4, w1
 	mov	x3, x2
-	add	x29, sp, 0
+	mov	w2, w1
 	add	w1, w0, 512
-	mov	w2, w4
+	add	x29, sp, 0
 	mov	w0, 2
 	bl	zftl_write
 	ldp	x29, x30, [sp], 16
@@ -27570,12 +27340,10 @@ zftl_vendor_write:
 	.type	zftl_sys_write, %function
 zftl_sys_write:
 	stp	x29, x30, [sp, -16]!
-	mov	w5, w0
-	mov	w4, w1
-	add	x29, sp, 0
 	mov	x3, x2
-	mov	w1, w5
-	mov	w2, w4
+	mov	w2, w1
+	mov	w1, w0
+	add	x29, sp, 0
 	mov	w0, 2
 	bl	zftl_write
 	ldp	x29, x30, [sp], 16
@@ -27587,248 +27355,244 @@ zftl_sys_write:
 zftl_discard:
 	stp	x29, x30, [sp, -128]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	adrp	x21, .LANCHOR0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	w19, w1
+	stp	x21, x22, [sp, 32]
+	adrp	x21, .LANCHOR0
 	add	x1, x21, :lo12:.LANCHOR0
-	stp	x23, x24, [sp,48]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	ldr	w1, [x1,1032]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldr	w1, [x1, 1032]
 	cmp	w0, w1
-	bcs	.L4339
-	cmp	w19, w1
-	cset	w5, hi
-	cbnz	w5, .L4339
+	ccmp	w19, w1, 2, cc
+	bhi	.L4244
 	add	w2, w0, w19
-	mov	w4, -1
-	cmp	w2, w1
-	bhi	.L4319
-	adrp	x23, .LANCHOR5
-	add	w22, w0, 24576
-	add	x0, x23, :lo12:.LANCHOR5
-	ldr	w1, [x0,1056]
+	cmp	w1, w2
+	bcc	.L4244
+	add	w23, w0, 24576
+	adrp	x24, .LANCHOR5
+	add	x0, x24, :lo12:.LANCHOR5
+	ldr	w1, [x0, 520]
 	add	w1, w19, w1
-	str	w1, [x0,1056]
+	str	w1, [x0, 520]
 	adrp	x0, .LANCHOR2
-	str	x0, [x29,104]
-	ldr	w2, [x0,#:lo12:.LANCHOR2]
-	tbz	x2, 12, .L4320
+	str	x0, [x29, 104]
+	ldr	w2, [x0, #:lo12:.LANCHOR2]
+	tbz	x2, 12, .L4224
 	adrp	x0, .LC315
-	mov	w2, w22
-	add	x0, x0, :lo12:.LC315
+	mov	w4, 0
 	mov	w3, w19
-	mov	w4, w5
+	mov	w2, w23
+	add	x0, x0, :lo12:.LC315
 	bl	printk
-.L4320:
-	add	x20, x21, :lo12:.LANCHOR0
-	ldr	x0, [x20,3392]
-	ldr	w25, [x0,8]
-	add	w1, w25, 1
-	str	w1, [x0,8]
+.L4224:
+	add	x0, x21, :lo12:.LANCHOR0
+	adrp	x25, .LANCHOR3
+	ldr	x0, [x0, 3384]
+	ldr	w27, [x0, 8]
+	add	w1, w27, 1
+	str	w1, [x0, 8]
 	bl	ftl_write_commit
 	bl	ftl_flush
-	ldrb	w24, [x20,3360]
-	udiv	w20, w22, w24
-	msub	w26, w20, w24, w22
-	cbz	w26, .L4321
-	sub	w24, w24, w26
+	add	x0, x25, :lo12:.LANCHOR3
+	ldrb	w22, [x0, 1946]
+	udiv	w20, w23, w22
+	msub	w26, w20, w22, w23
+	cbz	w26, .L4225
+	sub	w22, w22, w26
 	mov	w0, w20
-	cmp	w24, w19
-	csel	w24, w24, w19, ls
+	cmp	w22, w19
+	csel	w22, w22, w19, ls
 	bl	lpa_hash_get_ppa
-	str	w0, [x29,120]
+	str	w0, [x29, 120]
 	cmn	w0, #1
-	bne	.L4322
-	mov	w0, w20
-	add	x1, x29, 120
+	bne	.L4226
 	mov	w2, 0
+	add	x1, x29, 120
+	mov	w0, w20
 	bl	pm_log2phys
-.L4322:
-	ldr	w0, [x29,120]
-	and	w27, w24, 65535
+.L4226:
+	ldr	w0, [x29, 120]
+	and	w28, w22, 65535
 	cmn	w0, #1
-	beq	.L4324
+	beq	.L4228
 	mov	w0, 0
 	bl	buf_alloc
-	mov	x28, x0
-	cbz	x0, .L4324
-	strb	w26, [x0,57]
+	mov	x3, x0
+	cbz	x0, .L4228
+	strb	w26, [x0, 57]
 	ubfiz	x26, x26, 9, 25
-	str	w20, [x0,36]
+	strb	w22, [x0, 56]
 	mov	w1, 0
-	strb	w24, [x0,56]
-	lsl	w2, w27, 9
-	str	w25, [x0,32]
-	ldr	x0, [x0,8]
+	ldr	x0, [x0, 8]
+	lsl	w2, w28, 9
+	stp	w27, w20, [x3, 32]
+	str	x3, [x29, 96]
 	add	x0, x0, x26
 	bl	ftl_memset
-	mov	x0, x28
+	ldr	x3, [x29, 96]
+	mov	x0, x3
 	bl	ftl_write_buf
 	bl	ftl_write_commit
 	add	x0, x21, :lo12:.LANCHOR0
-	ldr	x1, [x0,3392]
-	ldr	w0, [x1,76]
+	ldr	x1, [x0, 3384]
+	ldr	w0, [x1, 76]
 	add	w0, w0, 1
-	str	w0, [x1,76]
-.L4324:
+	str	w0, [x1, 76]
+.L4228:
 	add	w20, w20, 1
-	sub	w19, w19, w27
-.L4321:
-	cbz	w19, .L4326
+	sub	w19, w19, w28
+.L4225:
+	cbz	w19, .L4230
 	bl	ftl_flush
-.L4326:
+.L4230:
+	add	x22, x25, :lo12:.LANCHOR3
+	add	x26, x21, :lo12:.LANCHOR0
 	mov	w0, -1
-	mov	w26, 1
-	str	w0, [x29,124]
-	adrp	x27, .LANCHOR3
-	mov	w28, 24
-.L4327:
-	add	x24, x21, :lo12:.LANCHOR0
-	ldrb	w0, [x24,3360]
+	mov	w28, 1
+	str	w0, [x29, 124]
+.L4231:
+	ldrb	w0, [x22, 1946]
 	cmp	w19, w0
-	bcc	.L4367
+	bcs	.L4236
+	cbz	w19, .L4238
 	mov	w0, w20
 	bl	lpa_hash_get_ppa
-	str	w0, [x29,120]
+	str	w0, [x29, 120]
 	cmn	w0, #1
-	beq	.L4328
-	mov	w0, 0
-	bl	buf_alloc
-	mov	x3, x0
-	cbz	x0, .L4330
-	ldrb	w2, [x24,3360]
-	mov	w1, 0
-	str	w20, [x0,36]
-	strb	w2, [x0,56]
-	lsl	w2, w2, 9
-	str	w25, [x0,32]
-	strb	wzr, [x0,57]
-	ldr	x0, [x0,8]
-	str	x3, [x29,96]
-	bl	ftl_memset
-	ldr	x3, [x29,96]
-	mov	x0, x3
-	bl	ftl_write_buf
-	bl	ftl_write_commit
-	b	.L4366
-.L4328:
-	mov	w0, w20
-	add	x1, x29, 120
+	bne	.L4239
 	mov	w2, 0
-	bl	pm_log2phys
-	ldr	w0, [x29,120]
-	cmn	w0, #1
-	beq	.L4330
-	add	x1, x29, 124
-	mov	w2, 1
-	mov	w0, w20
-	bl	pm_log2phys
-	add	x2, x27, :lo12:.LANCHOR3
-	ldrb	w1, [x24,1257]
-	ldr	w0, [x29,120]
-	sub	w1, w28, w1
-	ldrh	w3, [x2,1312]
-	sub	w1, w1, w3
-	lsr	w0, w0, w3
-	lsl	w1, w26, w1
-	sub	w1, w1, #1
-	and	w1, w1, w0
-	ldrb	w0, [x2,1314]
-	udiv	w0, w1, w0
-	bl	ftl_vpn_decrement
-.L4366:
-	ldr	x1, [x24,3392]
-	ldr	w0, [x1,76]
-	add	w0, w0, 1
-	str	w0, [x1,76]
-.L4330:
-	add	x0, x21, :lo12:.LANCHOR0
-	add	w20, w20, 1
-	ldrb	w0, [x0,3360]
-	sub	w19, w19, w0
-	b	.L4327
-.L4367:
-	cbz	w19, .L4334
-	mov	w0, w20
-	bl	lpa_hash_get_ppa
-	str	w0, [x29,120]
-	cmn	w0, #1
-	bne	.L4335
-	mov	w0, w20
 	add	x1, x29, 120
-	mov	w2, 0
+	mov	w0, w20
 	bl	pm_log2phys
-.L4335:
-	ldr	w0, [x29,120]
+.L4239:
+	ldr	w0, [x29, 120]
 	cmn	w0, #1
-	beq	.L4334
+	beq	.L4238
 	mov	w0, 0
 	bl	buf_alloc
-	mov	x24, x0
-	cbz	x0, .L4334
-	str	w20, [x0,36]
-	strb	wzr, [x0,57]
-	strb	w19, [x0,56]
-	str	w25, [x0,32]
-	add	x0, x21, :lo12:.LANCHOR0
-	ldrb	w0, [x0,3360]
+	mov	x22, x0
+	cbz	x0, .L4238
+	add	x25, x25, :lo12:.LANCHOR3
+	strb	wzr, [x0, 57]
+	strb	w19, [x0, 56]
+	stp	w27, w20, [x22, 32]
+	ldrb	w0, [x25, 1946]
 	cmp	w19, w0
-	bcc	.L4337
+	bcc	.L4241
 	adrp	x1, .LANCHOR4
-	adrp	x0, .LC0
 	add	x1, x1, :lo12:.LANCHOR4
-	mov	w2, 1495
-	add	x1, x1, 1040
+	add	x1, x1, 1056
+	mov	w2, 1496
+	adrp	x0, .LC0
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 	bl	dump_stack
-.L4337:
-	ldr	x0, [x24,8]
-	mov	w1, 0
+.L4241:
+	ldr	x0, [x22, 8]
 	lsl	w2, w19, 9
+	mov	w1, 0
 	bl	ftl_memset
-	mov	x0, x24
+	mov	x0, x22
 	bl	ftl_write_buf
 	bl	ftl_write_commit
 	add	x0, x21, :lo12:.LANCHOR0
-	ldr	x1, [x0,3392]
-	ldr	w0, [x1,76]
+	ldr	x1, [x0, 3384]
+	ldr	w0, [x1, 76]
 	add	w0, w0, 1
-	str	w0, [x1,76]
-.L4334:
-	add	x0, x23, :lo12:.LANCHOR5
-	mov	w4, 0
-	ldr	w1, [x0,1056]
+	str	w0, [x1, 76]
+.L4238:
+	add	x0, x24, :lo12:.LANCHOR5
+	ldr	w1, [x0, 520]
 	cmp	w1, 8192
-	bls	.L4319
-	ldr	x0, [x29,104]
-	ldr	w0, [x0,#:lo12:.LANCHOR2]
-	tbz	x0, 12, .L4338
+	bls	.L4245
+	ldr	x0, [x29, 104]
+	ldr	w0, [x0, #:lo12:.LANCHOR2]
+	tbz	x0, 12, .L4242
 	adrp	x0, .LC315
-	mov	w2, w22
-	add	x0, x0, :lo12:.LC315
+	mov	w4, 0
 	mov	w3, w19
+	mov	w2, w23
+	add	x0, x0, :lo12:.LC315
 	bl	printk
-.L4338:
-	add	x23, x23, :lo12:.LANCHOR5
+.L4242:
+	add	x24, x24, :lo12:.LANCHOR5
 	add	x21, x21, :lo12:.LANCHOR0
-	str	wzr, [x23,1056]
+	str	wzr, [x24, 520]
 	bl	flt_sys_flush
 	mov	w0, 1
-	mov	w4, 0
-	str	w0, [x21,3412]
-	b	.L4319
-.L4339:
-	mov	w4, -1
-.L4319:
-	mov	w0, w4
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+	str	w0, [x21, 3396]
+.L4245:
+	mov	w0, 0
+	b	.L4222
+.L4236:
+	mov	w0, w20
+	bl	lpa_hash_get_ppa
+	str	w0, [x29, 120]
+	cmn	w0, #1
+	beq	.L4232
+	mov	w0, 0
+	bl	buf_alloc
+	mov	x3, x0
+	cbz	x0, .L4234
+	ldrb	w2, [x22, 1946]
+	mov	w1, 0
+	strb	w2, [x0, 56]
+	strb	wzr, [x0, 57]
+	ldr	x0, [x0, 8]
+	lsl	w2, w2, 9
+	stp	w27, w20, [x3, 32]
+	str	x3, [x29, 96]
+	bl	ftl_memset
+	ldr	x3, [x29, 96]
+	mov	x0, x3
+	bl	ftl_write_buf
+	bl	ftl_write_commit
+.L4271:
+	ldr	x1, [x26, 3384]
+	ldr	w0, [x1, 76]
+	add	w0, w0, 1
+	str	w0, [x1, 76]
+.L4234:
+	ldrb	w0, [x22, 1946]
+	add	w20, w20, 1
+	sub	w19, w19, w0
+	b	.L4231
+.L4232:
+	mov	w2, 0
+	add	x1, x29, 120
+	mov	w0, w20
+	bl	pm_log2phys
+	ldr	w0, [x29, 120]
+	cmn	w0, #1
+	beq	.L4234
+	add	x1, x29, 124
+	mov	w2, 1
+	mov	w0, w20
+	bl	pm_log2phys
+	ldrb	w1, [x26, 1205]
+	mov	w0, 24
+	ldrh	w2, [x22, 1304]
+	sub	w0, w0, w1
+	ldr	w1, [x29, 120]
+	sub	w0, w0, w2
+	lsr	w1, w1, w2
+	lsl	w0, w28, w0
+	sub	w0, w0, #1
+	and	w0, w0, w1
+	ldrb	w1, [x22, 1306]
+	udiv	w0, w0, w1
+	bl	ftl_vpn_decrement
+	b	.L4271
+.L4244:
+	mov	w0, -1
+.L4222:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 128
 	ret
 	.size	zftl_discard, .-zftl_discard
@@ -27837,51 +27601,49 @@ zftl_discard:
 	.type	dump_pm_blk, %function
 dump_pm_blk:
 	stp	x29, x30, [sp, -48]!
-	adrp	x0, .LC267
 	mov	w2, 4
-	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
-	adrp	x21, .LANCHOR0
+	adrp	x0, .LC267
 	add	x0, x0, :lo12:.LC267
-	stp	x19, x20, [sp,16]
-	add	x19, x21, :lo12:.LANCHOR0
-	adrp	x20, .LANCHOR5
+	add	x29, sp, 0
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR0
+	add	x19, x19, :lo12:.LANCHOR0
+	stp	x21, x22, [sp, 32]
+	adrp	x21, .LANCHOR5
+	add	x21, x21, :lo12:.LANCHOR5
+	mov	w20, 0
 	mov	w22, 65535
-	ldr	x3, [x19,3392]
-	add	x1, x3, 704
-	ldrh	w3, [x3,698]
+	ldr	x1, [x19, 3384]
+	add	x1, x1, 704
+	ldrh	w3, [x1, -6]
 	bl	rknand_print_hex
-	add	x3, x20, :lo12:.LANCHOR5
-	ldr	x1, [x19,3392]
+	ldrh	w3, [x21, 220]
 	adrp	x0, .LC268
+	ldr	x1, [x19, 3384]
 	mov	w2, 2
 	add	x0, x0, :lo12:.LC268
 	add	x1, x1, 416
-	ldrh	w3, [x3,264]
-	mov	w19, 0
 	bl	rknand_print_hex
-.L4369:
-	add	x0, x20, :lo12:.LANCHOR5
-	ldrh	w0, [x0,264]
-	cmp	w0, w19
-	bls	.L4372
-	add	x0, x21, :lo12:.LANCHOR0
-	ldr	x0, [x0,3392]
-	add	x0, x0, w19, sxtw 1
-	ldrh	w0, [x0,416]
+.L4273:
+	ldrh	w0, [x21, 220]
+	cmp	w0, w20
+	bhi	.L4275
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	ret
+.L4275:
+	ldr	x0, [x19, 3384]
+	add	x0, x0, w20, sxtw 1
+	ldrh	w0, [x0, 416]
 	cmp	w0, w22
-	beq	.L4370
+	beq	.L4274
 	mov	x1, 0
 	bl	ftl_sblk_dump
-.L4370:
-	add	w19, w19, 1
-	uxth	w19, w19
-	b	.L4369
-.L4372:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x29, x30, [sp], 48
-	ret
+.L4274:
+	add	w20, w20, 1
+	and	w20, w20, 65535
+	b	.L4273
 	.size	dump_pm_blk, .-dump_pm_blk
 	.align	2
 	.global	id_block_prog_msb_ff_data
@@ -27889,720 +27651,717 @@ dump_pm_blk:
 id_block_prog_msb_ff_data:
 	stp	x29, x30, [sp, -96]!
 	add	x29, sp, 0
-	stp	x21, x22, [sp,32]
+	stp	x21, x22, [sp, 32]
 	adrp	x21, .LANCHOR0
-	stp	x23, x24, [sp,48]
-	uxtb	w23, w0
+	stp	x23, x24, [sp, 48]
+	and	w24, w0, 255
 	add	x0, x21, :lo12:.LANCHOR0
-	stp	x19, x20, [sp,16]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	uxth	w19, w2
-	ldr	x2, [x0,1144]
-	ldrb	w0, [x0,1154]
-	ldrb	w2, [x2,19]
-	cbnz	w0, .L4373
-	sub	w0, w2, #5
-	uxtb	w0, w0
-	cmp	w0, 2
-	bls	.L4375
-	cmp	w2, 68
-	beq	.L4375
-	sub	w2, w2, #19
-	and	w2, w2, -17
-	uxtb	w2, w2
-	cbnz	w2, .L4373
-.L4375:
+	stp	x19, x20, [sp, 16]
+	stp	x25, x26, [sp, 64]
+	and	w19, w2, 65535
+	str	x27, [sp, 80]
+	ldrb	w2, [x0, 1154]
+	cbnz	w2, .L4277
+	ldr	x0, [x0, 1144]
+	ldrb	w0, [x0, 19]
+	sub	w0, w0, #5
+	and	w0, w0, 255
+	cmp	w0, 63
+	bhi	.L4277
+	mov	x2, 16391
+	movk	x2, 0x4000, lsl 16
+	movk	x2, 0x8000, lsl 48
+	lsr	x0, x2, x0
+	tbz	x0, 0, .L4277
 	adrp	x20, .LANCHOR3
-	adrp	x24, .LC316
 	add	x20, x20, :lo12:.LANCHOR3
+	adrp	x23, .LC316
 	mov	w25, w1
-	add	x24, x24, :lo12:.LC316
-	add	x20, x20, 2484
-	mov	w27, 65535
-.L4377:
-	add	x28, x21, :lo12:.LANCHOR0
-	ldr	x0, [x28,1144]
-	ldrh	w0, [x0,10]
+	add	x20, x20, 2476
+	add	x23, x23, :lo12:.LC316
+.L4279:
+	add	x26, x21, :lo12:.LANCHOR0
+	ldr	x0, [x26, 1144]
+	ldrh	w0, [x0, 10]
 	cmp	w0, w19
-	bls	.L4373
-	add	w26, w19, w25
-	ldrh	w3, [x20,w19,sxtw 1]
-	mov	x0, x24
+	bhi	.L4280
+.L4277:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldr	x27, [sp, 80]
+	ldp	x29, x30, [sp], 96
+	ret
+.L4280:
+	sxtw	x22, w19
+	add	w27, w19, w25
 	mov	w1, w19
-	mov	w2, w26
+	mov	w2, w27
+	mov	x0, x23
+	ldrh	w3, [x20, x22, lsl 1]
 	bl	printk
-	ldrh	w0, [x20,w19,sxtw 1]
-	cmp	w0, w27
-	bne	.L4373
+	ldrh	w1, [x20, x22, lsl 1]
+	mov	w0, 65535
+	cmp	w1, w0
+	bne	.L4277
 	adrp	x22, .LANCHOR5
-	mov	w1, 255
 	add	x22, x22, :lo12:.LANCHOR5
 	mov	w2, 16384
+	mov	w1, 255
 	add	w19, w19, 1
-	ldr	x0, [x22,296]
-	uxth	w19, w19
+	ldr	x0, [x22, 304]
+	and	w19, w19, 65535
 	bl	ftl_memset
-	ldr	x4, [x28,1144]
-	mov	w0, w23
-	ldr	x2, [x22,296]
-	mov	w1, w26
-	ldrb	w4, [x4,9]
-	mov	x3, x2
-	bl	flash_prog_page
-	b	.L4377
-.L4373:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 96
-	ret
+	ldr	x0, [x26, 1144]
+	mov	w1, w27
+	ldr	x3, [x22, 304]
+	mov	x2, x3
+	ldrb	w4, [x0, 9]
+	mov	w0, w24
+	bl	flash_prog_page
+	b	.L4279
 	.size	id_block_prog_msb_ff_data, .-id_block_prog_msb_ff_data
 	.align	2
 	.global	write_idblock
 	.type	write_idblock, %function
 write_idblock:
 	stp	x29, x30, [sp, -304]!
+	mov	w4, 35899
+	movk	w4, 0xfcdc, lsl 16
 	add	x29, sp, 0
-	stp	x23, x24, [sp,48]
+	stp	x23, x24, [sp, 48]
 	adrp	x23, .LANCHOR0
-	add	x3, x23, :lo12:.LANCHOR0
-	stp	x21, x22, [sp,32]
-	stp	x19, x20, [sp,16]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	ldr	x4, [x3,1144]
-	ldrb	w3, [x3,1154]
-	str	w3, [x29,140]
-	ldrb	w20, [x4,9]
-	ldrh	w24, [x4,10]
-	adrp	x4, .LANCHOR2+34
+	stp	x19, x20, [sp, 16]
+	ldrb	w3, [x23, #:lo12:.LANCHOR0]
+	str	w3, [x29, 160]
+	stp	x21, x22, [sp, 32]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	ldrh	w3, [x29, 160]
+	str	w3, [x29, 212]
 	ldr	w3, [x1]
-	ldrh	w21, [x4,#:lo12:.LANCHOR2+34]
-	ldrb	w4, [x23,#:lo12:.LANCHOR0]
-	str	w4, [x29,156]
-	ldrh	w4, [x29,156]
-	str	w4, [x29,212]
-	mov	w4, 19282
-	movk	w4, 0x534e, lsl 16
-	cmp	w3, w4
-	mov	w4, 35899
-	movk	w4, 0xfcdc, lsl 16
-	cset	w5, ne
 	cmp	w3, w4
-	cset	w4, ne
-	tst	w5, w4
-	beq	.L4380
 	mov	w4, 19282
-	movk	w4, 0x5353, lsl 16
+	movk	w4, 0x534e, lsl 16
+	ccmp	w3, w4, 4, ne
+	beq	.L4283
+	add	w4, w4, 327680
 	cmp	w3, w4
-	bne	.L4514
-.L4380:
+	beq	.L4283
+.L4400:
+	mov	w0, -1
+.L4282:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 304
+	ret
+.L4283:
 	cmp	w0, 15
-	bls	.L4514
+	bls	.L4400
+	add	x25, x23, :lo12:.LANCHOR0
 	mov	w19, w0
+	str	x2, [x29, 168]
+	str	x1, [x29, 216]
+	ldr	x0, [x25, 1144]
+	ldrb	w20, [x0, 9]
+	ldrh	w24, [x0, 10]
+	adrp	x0, .LANCHOR2+34
+	ldrh	w21, [x0, #:lo12:.LANCHOR2+34]
+	ldrb	w0, [x25, 1154]
+	str	w0, [x29, 144]
 	mov	w0, 59392
 	movk	w0, 0x3, lsl 16
-	str	x2, [x29,160]
-	str	x1, [x29,216]
 	bl	ftl_malloc
 	mov	x22, x0
-	cbz	x0, .L4514
-	adrp	x0, .LANCHOR5+1032
-	str	wzr, [x29,236]
-	ldrb	w0, [x0,#:lo12:.LANCHOR5+1032]
-	cbz	w0, .L4507
-	add	x0, x23, :lo12:.LANCHOR0
-	ldrb	w1, [x23,#:lo12:.LANCHOR0]
-	ldrb	w0, [x0,1154]
-	cbz	w1, .L4384
-	cmp	w0, wzr
+	cbz	x0, .L4400
+	adrp	x0, .LANCHOR5+496
+	ldrb	w0, [x0, #:lo12:.LANCHOR5+496]
+	cbz	w0, .L4339
+	ldrb	w1, [x23, #:lo12:.LANCHOR0]
+	ldrb	w0, [x25, 1154]
+	cbz	w1, .L4287
+	cmp	w0, 0
 	cset	w0, eq
-	b	.L4510
-.L4384:
+.L4397:
+	str	w0, [x29, 236]
+	b	.L4394
+.L4287:
 	cmp	w0, 3
-	beq	.L4438
-	ldr	w2, [x29,212]
+	beq	.L4340
+	ldr	w2, [x29, 212]
 	cmp	w0, 2
 	mov	w1, 2
-	csel	w1, w2, w1, ne
-	cmp	w0, 2
 	mov	w0, 3
-	str	w1, [x29,212]
+	csel	w1, w2, w1, ne
 	csel	w0, wzr, w0, ne
-	b	.L4510
-.L4438:
-	str	w0, [x29,212]
-	mov	w0, 2
-.L4510:
-	str	w0, [x29,236]
-.L4507:
-	ldr	x0, [x29,216]
-	mov	w1, 19282
-	movk	w1, 0x534e, lsl 16
-	ldr	w0, [x0]
-	cmp	w0, w1
+	str	w1, [x29, 212]
+	b	.L4397
+.L4339:
+	str	wzr, [x29, 236]
+.L4394:
+	ldr	x0, [x29, 216]
 	mov	w1, 35899
 	movk	w1, 0xfcdc, lsl 16
-	cset	w2, ne
+	ldr	w0, [x0]
 	cmp	w0, w1
-	cset	w1, ne
-	tst	w2, w1
-	beq	.L4386
 	mov	w1, 19282
-	movk	w1, 0x5353, lsl 16
+	movk	w1, 0x534e, lsl 16
+	ccmp	w0, w1, 4, ne
+	beq	.L4289
+	add	w1, w1, 327680
 	cmp	w0, w1
-	beq	.L4386
+	beq	.L4289
 	mov	x0, x22
 	bl	ftl_free
-.L4514:
-	mov	w0, -1
-	b	.L4508
-.L4386:
+	b	.L4400
+.L4340:
+	str	w0, [x29, 212]
+	mov	w0, 2
+	b	.L4397
+.L4289:
 	mov	w0, 0
-	add	w19, w19, 511
-	mul	w24, w20, w24
 	bl	zftl_flash_exit_slc_mode
-	lsr	w19, w19, 9
 	add	x0, x23, :lo12:.LANCHOR0
+	add	w19, w19, 511
+	mul	w24, w24, w20
+	lsr	w19, w19, 9
 	cmp	w19, 8
-	mov	w3, 0
+	mov	w4, 17739
+	ldrb	w0, [x0, 1154]
 	mov	w2, 63871
-	ldrb	w0, [x0,1154]
-	strb	w0, [x23,#:lo12:.LANCHOR0]
+	strb	w0, [x23, #:lo12:.LANCHOR0]
+	movk	w4, 0x4e52, lsl 16
 	mov	w0, 8
 	csel	w19, w19, w0, cs
 	sub	w0, w24, #1
 	add	w0, w0, w19
 	udiv	w0, w0, w24
-	str	w0, [x29,136]
-	ldr	x0, [x29,216]
-	add	x0, x0, 253952
-	add	x0, x0, 2044
-.L4392:
-	sub	x1, x0, #512
-	ldr	w1, [x1]
-	cbnz	w1, .L4387
-	cbnz	w3, .L4388
-	mov	w1, 17739
-	movk	w1, 0x4e52, lsl 16
-	b	.L4511
-.L4388:
-	ldr	x1, [x29,216]
-	ldr	w1, [x1,w3,uxtw 2]
-.L4511:
-	add	w3, w3, 1
+	str	w0, [x29, 132]
+	ldr	x0, [x29, 216]
+	add	x3, x0, 253952
+	mov	w0, 0
+	add	x3, x3, 1532
+.L4295:
+	ldr	w1, [x3]
+	cbnz	w1, .L4290
+	cbnz	w0, .L4291
+	str	w4, [x3, 512]
+.L4292:
+	add	w0, w0, 1
 	sub	w2, w2, #1
-	cmp	w3, 4095
-	str	w1, [x0]
-	csel	w3, w3, wzr, cc
+	cmp	w0, 4095
+	sub	x3, x3, #4
+	csel	w0, w0, wzr, cc
 	cmp	w2, 4096
-	sub	x0, x0, #4
-	bne	.L4392
-	b	.L4391
-.L4387:
-	adrp	x0, .LC317
-	add	x0, x0, :lo12:.LC317
-	bl	printk
-.L4391:
-	mul	w0, w20, w21
-	str	w0, [x29,168]
+	bne	.L4295
+.L4294:
+	ldr	x1, [x29, 168]
+	mul	w0, w21, w20
+	mov	w3, 5
+	mov	w2, 4
+	str	w0, [x29, 164]
 	adrp	x0, .LC318
-	ldr	x1, [x29,160]
 	add	x0, x0, :lo12:.LC318
-	mov	w2, 4
-	mov	w3, 5
-	mov	x21, 0
 	bl	rknand_print_hex
-	adrp	x0, .LC319
+	mov	w2, w19
 	mov	w1, w19
+	adrp	x0, .LC319
 	add	x0, x0, :lo12:.LC319
-	mov	w2, w19
 	bl	printk
-	str	w21, [x29,232]
-	adrp	x0, .LC320
-	add	x0, x0, :lo12:.LC320
-	str	x0, [x29,112]
+	str	xzr, [x29, 224]
 	adrp	x0, .LANCHOR2
 	add	x0, x0, :lo12:.LANCHOR2
-	str	x0, [x29,104]
-.L4434:
-	adrp	x26, .LANCHOR5
-	mov	w0, w21
-	add	x1, x26, :lo12:.LANCHOR5
-	ldrb	w1, [x1,1032]
-	cbnz	w1, .L4393
-	ldr	x1, [x29,160]
-	ldr	w2, [x29,168]
-	ldr	w1, [x1,x21,lsl 2]
-	mul	w20, w1, w2
-	cbz	w21, .L4394
-	ldr	w2, [x29,136]
-	cmp	w2, 1
-	bls	.L4394
-	sub	w0, w21, #1
-	ldr	x2, [x29,160]
-	ldr	w0, [x2,x0,lsl 2]
+	add	x0, x0, 8
+	str	wzr, [x29, 232]
+	str	x0, [x29, 136]
+.L4336:
+	adrp	x27, .LANCHOR5
+	add	x1, x27, :lo12:.LANCHOR5
+	ldr	w0, [x29, 224]
+	ldrb	w1, [x1, 496]
+	cbnz	w1, .L4296
+	ldr	x2, [x29, 224]
+	cmp	w0, 0
+	ldr	x1, [x29, 168]
+	ldr	w1, [x1, x2, lsl 2]
+	ldr	w2, [x29, 164]
+	mul	w21, w2, w1
+	ldr	w2, [x29, 132]
+	ccmp	w2, 1, 0, ne
+	bls	.L4297
+	ldr	x2, [x29, 168]
+	sub	w0, w0, #1
+	ldr	w0, [x2, x0, lsl 2]
 	add	w0, w0, 1
 	cmp	w1, w0
-	bne	.L4394
-	b	.L4395
-.L4393:
-	adrp	x24, .LANCHOR0
-	add	x25, x24, :lo12:.LANCHOR0
-	ldr	x1, [x25,1128]
-	add	x1, x1, w21, uxtw
-	ldrb	w20, [x1,32]
-	mov	x1, x24
-	cmp	w20, 255
-	beq	.L4395
-	ldr	w2, [x29,168]
-	mul	w20, w20, w2
-	ldr	w2, [x29,236]
-	cbz	w2, .L4394
-	tbnz	x0, 0, .L4444
+	bne	.L4297
+.L4298:
+	ldr	x0, [x29, 224]
+	add	x0, x0, 1
+	str	x0, [x29, 224]
+	cmp	x0, 4
+	bne	.L4336
+.L4338:
+	mov	w0, 0
+	bl	zftl_flash_exit_slc_mode
+	adrp	x0, .LANCHOR0
+	ldrb	w2, [x29, 160]
+	add	x1, x0, :lo12:.LANCHOR0
+	strb	w2, [x0, #:lo12:.LANCHOR0]
+	ldr	w2, [x29, 236]
+	cbz	w2, .L4337
+	ldrb	w2, [x29, 144]
+	strb	w2, [x1, 1154]
+.L4337:
+	add	x0, x0, :lo12:.LANCHOR0
+	mov	w1, 2
+	strb	w1, [x0, 1208]
+	mov	w0, 0
+	bl	zftl_flash_enter_slc_mode
+	mov	x0, x22
+	bl	ftl_free
+	ldr	w0, [x29, 232]
+	cmp	w0, 0
+	csetm	w0, eq
+	b	.L4282
+.L4291:
+	ldr	x1, [x29, 216]
+	ldr	w1, [x1, w0, uxtw 2]
+	str	w1, [x3, 512]
+	b	.L4292
+.L4290:
+	adrp	x0, .LC317
+	add	x0, x0, :lo12:.LC317
+	bl	printk
+	b	.L4294
+.L4296:
+	adrp	x20, .LANCHOR0
+	add	x23, x20, :lo12:.LANCHOR0
+	ldr	w2, [x29, 224]
+	ldr	x1, [x23, 1048]
+	add	x1, x1, w2, uxtw
+	ldrb	w21, [x1, 32]
+	mov	x1, x20
+	cmp	w21, 255
+	beq	.L4298
+	ldr	w2, [x29, 164]
+	mul	w21, w21, w2
+	ldr	w2, [x29, 236]
+	cbz	w2, .L4297
+	and	w0, w0, -3
+	cmp	w0, 1
+	beq	.L4299
 	cmp	w2, 3
-	cset	w23, eq
-	cbz	w23, .L4396
-.L4444:
+	bne	.L4300
+.L4299:
 	add	x2, x1, :lo12:.LANCHOR0
-	ldrb	w0, [x29,212]
-	strb	w0, [x1,#:lo12:.LANCHOR0]
-	strb	w0, [x2,1154]
-	b	.L4394
-.L4396:
-	mov	w0, w23
-	bl	zftl_flash_exit_slc_mode
-	strb	w23, [x24,#:lo12:.LANCHOR0]
-	strb	w23, [x25,1154]
-.L4394:
-	mov	w1, 0
+	ldrb	w0, [x29, 212]
+	strb	w0, [x1, #:lo12:.LANCHOR0]
+	strb	w0, [x2, 1154]
+.L4297:
 	mov	w2, 512
+	mov	w1, 0
 	mov	x0, x22
-	adrp	x24, .LANCHOR0
 	bl	ftl_memset
-	add	x0, x24, :lo12:.LANCHOR0
-	ldr	x1, [x0,1144]
-	ldrb	w25, [x1,9]
-	ldrh	w28, [x1,10]
+	adrp	x20, .LANCHOR0
+	add	x0, x20, :lo12:.LANCHOR0
+	ldr	x1, [x0, 1144]
+	ldrb	w24, [x1, 9]
+	ldrh	w23, [x1, 10]
 	adrp	x1, .LANCHOR2
 	add	x1, x1, :lo12:.LANCHOR2
-	mul	w28, w25, w28
-	ldrh	w27, [x1,34]
-	ldrb	w1, [x0,1240]
-	str	w1, [x29,132]
-	udiv	w1, w20, w25
-	strb	wzr, [x0,1240]
+	ldrh	w25, [x1, 34]
+	mul	w23, w23, w24
+	ldrb	w1, [x0, 1252]
+	str	w1, [x29, 128]
+	udiv	w1, w21, w24
+	strb	wzr, [x0, 1252]
 	mov	w0, 0
-	mul	w27, w25, w27
+	mul	w25, w25, w24
 	bl	flash_erase_block
-	cmp	w19, w28
-	mov	w1, 1
-	bls	.L4398
-	add	w1, w20, w27
+	cmp	w23, w19
+	bcs	.L4342
+	add	w1, w21, w25
 	mov	w0, 0
 	bl	flash_erase_block
 	mov	w1, 2
-.L4398:
-	add	x3, x24, :lo12:.LANCHOR0
-	ldr	x0, [x3,1144]
-	ldrh	w23, [x0,10]
-	ldrb	w0, [x0,12]
+.L4301:
+	add	x28, x20, :lo12:.LANCHOR0
+	ldr	x0, [x28, 1144]
+	ldrh	w23, [x0, 10]
+	ldrb	w0, [x0, 12]
 	lsl	w23, w23, 2
 	mul	w23, w23, w1
 	sdiv	w0, w23, w0
-	str	w0, [x29,204]
-	udiv	w0, w20, w27
-	msub	w0, w0, w27, w20
-	str	w0, [x29,208]
-	sub	w28, w20, w0
-	cmp	w20, w28
-	bne	.L4442
-	ldrb	w0, [x3,1028]
+	str	w0, [x29, 176]
+	udiv	w0, w21, w25
+	msub	w0, w0, w25, w21
+	str	w0, [x29, 208]
+	sub	w26, w21, w0
+	cmp	w21, w26
+	bne	.L4344
+	ldrb	w0, [x28, 1028]
 	cmp	w0, 9
-	bne	.L4442
-	add	x26, x26, :lo12:.LANCHOR5
-	mov	w1, 0
+	bne	.L4344
+	add	x27, x27, :lo12:.LANCHOR5
 	mov	w2, 1024
-	str	x3, [x29,224]
-	ldr	x26, [x26,336]
-	mov	x0, x26
+	mov	w1, 0
+	ldr	x27, [x27, 352]
+	mov	x0, x27
 	bl	ftl_memset
-	str	wzr, [x26,12]
 	mov	w0, 18766
-	ldr	x3, [x29,224]
 	movk	w0, 0x464e, lsl 16
-	str	w0, [x26]
+	str	w0, [x27]
 	mov	w0, 12
-	str	w0, [x26,4]
-	ldrb	w0, [x3,1154]
-	strb	wzr, [x26,16]
-	cbz	w0, .L4400
-	ldr	x0, [x3,1144]
-	ldrb	w0, [x0,29]
-	strb	w0, [x26,16]
-.L4400:
-	add	x24, x24, :lo12:.LANCHOR0
+	str	w0, [x27, 4]
+	ldrb	w0, [x28, 1154]
+	strb	wzr, [x27, 16]
+	str	wzr, [x27, 12]
+	cbz	w0, .L4303
+	ldr	x0, [x28, 1144]
+	ldrb	w0, [x0, 29]
+	strb	w0, [x27, 16]
+.L4303:
+	add	x20, x20, :lo12:.LANCHOR0
 	mov	w0, 4
-	strb	w0, [x26,17]
-	cmp	w25, 8
-	ldr	x1, [x24,1144]
-	ldrh	w0, [x1,10]
-	ldrb	w1, [x1,12]
-	strb	wzr, [x26,20]
-	strh	wzr, [x26,22]
+	strb	w0, [x27, 17]
+	cmp	w24, 8
+	sub	w28, w19, #4
+	ldr	x1, [x20, 1144]
+	ldrh	w0, [x1, 10]
+	ldrb	w1, [x1, 12]
+	strb	wzr, [x27, 20]
+	strh	wzr, [x27, 22]
 	sdiv	w0, w0, w1
 	mov	w1, 16
-	strh	w0, [x26,18]
+	strh	w0, [x27, 18]
 	mov	w0, 70
 	csel	w0, w0, w1, hi
+	strb	w0, [x27, 21]
 	mov	w1, 12
-	strb	w0, [x26,21]
-	add	x0, x26, 12
+	add	x0, x27, 12
 	bl	js_hash
-	str	w0, [x26,8]
-	sub	w0, w19, #4
-	str	w0, [x29,224]
-	b	.L4399
-.L4442:
-	str	w19, [x29,224]
-	mov	x26, 0
-.L4399:
-	adrp	x10, .LANCHOR0
-	ldr	x24, [x29,216]
+	str	w0, [x27, 8]
+.L4302:
+	ldr	x20, [x29, 216]
+	adrp	x0, .LANCHOR0
+	add	x25, x0, :lo12:.LANCHOR0
 	mov	w23, 0
-	add	x27, x10, :lo12:.LANCHOR0
-.L4402:
-	ldr	w0, [x29,204]
-	cmp	w23, w0
-	bcs	.L4515
-	ldr	w0, [x29,208]
-	ldrb	w2, [x27,1154]
-	add	w8, w23, w0
-	add	x0, x27, 4
+	add	x0, x25, 4
+	str	x0, [x29, 200]
+.L4305:
+	ldr	w0, [x29, 176]
+	cmp	w0, w23
+	bhi	.L4316
+	ldr	x0, [x29, 136]
+	mov	x23, x22
+	mov	w24, 4
+	mov	w25, 0
+	stp	w28, wzr, [x29, 192]
+	ldrb	w0, [x0, 9]
+	str	w0, [x29, 156]
+	ldr	x0, [x29, 136]
+	ldr	w1, [x29, 156]
+	ldrh	w0, [x0, 26]
+	mul	w0, w0, w1
+	adrp	x1, .LANCHOR0
+	add	x20, x1, :lo12:.LANCHOR0
+	udiv	w1, w21, w0
+	strb	wzr, [x20, 1252]
+	msub	w0, w1, w0, w21
+	str	w0, [x29, 208]
+	sub	w0, w21, w0
+	str	w0, [x29, 152]
+	ldr	w0, [x29, 208]
+	and	w0, w0, 3
+	str	w0, [x29, 200]
+	add	x0, x20, 4
+	str	x0, [x29, 104]
+.L4317:
+	ldr	w0, [x29, 192]
+	cmp	w25, w0
+	bcc	.L4331
+	adrp	x0, .LANCHOR0
+	add	x20, x0, :lo12:.LANCHOR0
+	ldrb	w0, [x29, 128]
+	strb	w0, [x20, 1252]
+	ldr	w0, [x29, 236]
+	cbz	w0, .L4332
+	mov	w0, 0
+	bl	zftl_flash_exit_slc_mode
+	adrp	x0, .LANCHOR0
+	strb	wzr, [x20, 1154]
+	strb	wzr, [x0, #:lo12:.LANCHOR0]
+.L4332:
+	lsl	w0, w28, 7
+	mov	x1, 0
+.L4333:
+	cmp	w0, w1
+	bhi	.L4334
+	ldr	w0, [x29, 232]
+	add	w0, w0, 1
+	str	w0, [x29, 232]
+	cmp	w0, 5
+	bls	.L4298
+	b	.L4338
+.L4300:
+	mov	w0, 0
+	bl	zftl_flash_exit_slc_mode
+	strb	wzr, [x20, #:lo12:.LANCHOR0]
+	strb	wzr, [x23, 1154]
+	b	.L4297
+.L4342:
+	mov	w1, 1
+	b	.L4301
+.L4344:
+	mov	w28, w19
+	mov	x27, 0
+	b	.L4302
+.L4316:
+	ldr	w0, [x29, 208]
+	ldrb	w2, [x25, 1154]
+	add	w8, w0, w23
+	ldr	x0, [x29, 200]
 	ubfx	x8, x8, 2, 16
 	add	w1, w8, 1
-	ldrh	w0, [x0,w1,sxtw 1]
-	cbz	w2, .L4404
-	ldrb	w3, [x27,1]
+	ldrh	w0, [x0, w1, sxtw 1]
+	cbz	w2, .L4307
+	ldrb	w4, [x25, 1]
 	lsl	w0, w1, 1
-	cmp	w3, wzr
+	cmp	w4, 0
 	csel	w0, w0, w1, ne
-.L4404:
-	ldrb	w1, [x27,1028]
+.L4307:
+	ldrb	w1, [x25, 1028]
 	cmp	w1, 9
-	beq	.L4512
-	sub	w0, w0, #1
-	lsl	w0, w0, 2
-.L4512:
-	str	w0, [x29,240]
+	bne	.L4309
+.L4398:
+	str	w0, [x29, 240]
 	mov	w0, 61424
-	str	w0, [x29,244]
-	add	x0, x27, 4
-	ldrh	w0, [x0,w8,sxtw 1]
-	cbnz	w2, .L4408
+	str	w0, [x29, 244]
+	ldr	x0, [x29, 200]
+	ldrh	w0, [x0, w8, sxtw 1]
+	cbnz	w2, .L4311
 	mov	w8, w0
-	b	.L4409
-.L4408:
-	ldrb	w1, [x27,1]
-	lsl	w0, w8, 1
-	cmp	w1, wzr
-	csel	w8, w0, w8, ne
-.L4409:
-	mul	w0, w8, w25
-	cbnz	x26, .L4410
-	add	w26, w0, w28
-	ldr	w5, [x24]
-	ldr	w6, [x29,240]
-	mov	w1, w26
-	ldr	x0, [x29,112]
-	mov	w2, w23
+.L4312:
+	mul	w0, w24, w8
+	cbnz	x27, .L4313
+	ldr	w5, [x20]
+	mov	x4, x20
+	ldr	w6, [x29, 240]
 	mov	w3, w19
-	mov	x4, x24
+	add	w27, w0, w26
 	mov	w7, 61424
-	str	x8, [x29,192]
+	str	w8, [x29, 196]
+	mov	w2, w23
+	mov	w1, w27
+	adrp	x0, .LC320
+	add	x0, x0, :lo12:.LC320
 	bl	printk
-	mov	w0, w26
-	mov	x1, x24
 	add	x2, x29, 240
-	bl	fw_flash_page_prog.constprop.30
-	ldrb	w0, [x27,1154]
-	ldr	x8, [x29,192]
-	cbnz	w0, .L4411
-	udiv	w1, w28, w25
+	mov	x1, x20
+	mov	w0, w27
+	bl	fw_flash_page_prog.constprop.29
+	ldrb	w0, [x25, 1154]
+	ldr	w8, [x29, 196]
+	cbnz	w0, .L4314
+	udiv	w1, w26, w24
 	add	w2, w8, 1
 	bl	id_block_prog_msb_ff_data
-.L4411:
-	ldr	w0, [x29,224]
-	add	x24, x24, 2048
-	add	w0, w0, 16
+.L4314:
+	add	w0, w28, 16
+	add	x20, x20, 2048
 	cmp	w23, w0
-	bcc	.L4412
-	ldr	w0, [x29,224]
-	add	w1, w0, 20
-	ldr	x0, [x29,216]
+	bcc	.L4315
+	ldr	x0, [x29, 216]
+	add	w1, w28, 20
 	cmp	w23, w1
 	add	x0, x0, 2048
-	csel	x24, x24, x0, cs
-	b	.L4412
-.L4410:
-	add	w0, w0, w28
-	mov	x1, x26
-	add	x2, x29, 240
-	bl	fw_flash_page_prog.constprop.30
-.L4412:
+	csel	x20, x0, x20, cc
+.L4315:
 	add	w9, w23, 4
-	mov	x26, 0
-	uxth	w23, w9
-	b	.L4402
-.L4515:
-	ldr	x0, [x29,104]
-	adrp	x23, .LANCHOR0
-	add	x23, x23, :lo12:.LANCHOR0
-	mov	w25, 0
-	add	x0, x0, 8
-	mov	x24, x22
-	ldrb	w1, [x0,9]
-	mov	w26, 4
-	str	w1, [x29,152]
-	ldrh	w0, [x0,26]
-	strb	wzr, [x23,1240]
-	str	w25, [x29,200]
-	mul	w0, w1, w0
-	udiv	w1, w20, w0
-	msub	w0, w1, w0, w20
-	str	w0, [x29,204]
-	sub	w0, w20, w0
-	str	w0, [x29,148]
-	ldr	w0, [x29,204]
-	and	w0, w0, 3
-	str	w0, [x29,192]
-	ldr	w0, [x29,224]
-	str	w0, [x29,172]
-	adrp	x0, .LC321
-	add	x0, x0, :lo12:.LC321
-	str	x0, [x29,120]
-.L4414:
-	ldr	w0, [x29,172]
-	adrp	x27, .LANCHOR0
-	cmp	w25, w0
-	bcs	.L4516
-	ldr	w0, [x29,192]
-	add	x1, x23, 4
-	ldrb	w2, [x23,1154]
-	sub	w0, w26, w0
-	uxth	w0, w0
-	str	w0, [x29,176]
-	ldr	w0, [x29,204]
-	add	w0, w25, w0
-	udiv	w0, w0, w26
+	mov	x27, 0
+	and	w23, w9, 65535
+	b	.L4305
+.L4309:
+	sub	w0, w0, #1
+	lsl	w0, w0, 2
+	b	.L4398
+.L4311:
+	ldrb	w1, [x25, 1]
+	lsl	w0, w8, 1
+	cmp	w1, 0
+	csel	w8, w0, w8, ne
+	b	.L4312
+.L4313:
+	add	x2, x29, 240
+	mov	x1, x27
+	add	w0, w0, w26
+	bl	fw_flash_page_prog.constprop.29
+	b	.L4315
+.L4331:
+	ldr	w0, [x29, 200]
+	ldr	x1, [x29, 104]
+	sub	w0, w24, w0
+	ldrb	w2, [x20, 1154]
+	and	w0, w0, 65535
+	str	w0, [x29, 176]
+	ldr	w0, [x29, 208]
+	add	w0, w0, w25
+	udiv	w0, w0, w24
 	and	w0, w0, 65535
-	ldrh	w1, [x1,w0,sxtw 1]
-	cbnz	w2, .L4415
+	ldrh	w1, [x1, w0, sxtw 1]
+	cbnz	w2, .L4318
 	mov	w0, w1
-	b	.L4416
-.L4415:
-	ldrb	w2, [x23,1]
-	lsl	w1, w0, 1
-	cmp	w2, wzr
-	csel	w0, w1, w0, ne
-.L4416:
-	ldr	w1, [x29,152]
-	ldr	w2, [x29,148]
-	madd	w0, w0, w1, w2
-	str	w0, [x29,144]
-	ldrb	w0, [x23,1152]
-	str	w0, [x29,208]
-	ldr	w1, [x29,192]
-	ldr	w0, [x29,144]
-	add	w27, w0, w1
-	ldr	x0, [x23,1144]
-	ldrb	w0, [x0,9]
-	udiv	w27, w27, w0
-	ldrb	w0, [x23,1244]
-	str	w0, [x29,128]
-	ldr	w0, [x29,208]
+.L4319:
+	ldp	w2, w1, [x29, 152]
+	ldrb	w27, [x20, 1152]
+	madd	w0, w1, w0, w2
+	str	w0, [x29, 148]
+	ldr	w0, [x29, 200]
+	ldr	w1, [x29, 148]
+	add	w26, w0, w1
+	ldr	x0, [x20, 1144]
+	ldrb	w0, [x0, 9]
+	udiv	w26, w26, w0
+	ldrb	w0, [x20, 1249]
+	str	w0, [x29, 124]
+	mov	w0, w27
 	bl	nandc_bch_sel
-.L4417:
-	mov	w0, 0
-	mov	w1, w27
-	mov	x2, x24
-	add	x3, x29, 240
-	mov	w4, w26
-	bl	flash_read_page
-	cmn	w0, #1
-	mov	w28, w0
-	bne	.L4424
-	ldrb	w6, [x23,1240]
-	cbnz	w6, .L4419
-.L4422:
 	adrp	x0, .LANCHOR5
 	add	x0, x0, :lo12:.LANCHOR5
-	ldr	x6, [x0,328]
-	cbnz	x6, .L4420
-	b	.L4421
-.L4419:
-	mov	w0, 0
-	mov	w1, w27
-	mov	x2, x24
+	str	x0, [x29, 112]
+.L4320:
+	mov	w4, w24
 	add	x3, x29, 240
-	mov	w4, w26
-	str	x6, [x29,96]
-	strb	wzr, [x23,1240]
+	mov	x2, x23
+	mov	w1, w26
+	mov	w0, 0
 	bl	flash_read_page
+	mov	w5, w0
 	cmn	w0, #1
-	ldr	x6, [x29,96]
-	strb	w6, [x23,1240]
-	beq	.L4422
-	b	.L4513
-.L4420:
-	mov	w0, 0
-	mov	w1, w27
-	mov	x2, x24
+	bne	.L4321
+	ldrb	w6, [x20, 1252]
+	cbnz	w6, .L4322
+.L4325:
+	ldr	x0, [x29, 112]
+	ldr	x6, [x0, 336]
+	cbnz	x6, .L4323
+.L4324:
+	ldrb	w0, [x20, 1192]
+	cbz	w0, .L4321
+	mov	w4, w24
 	add	x3, x29, 240
-	mov	w4, w26
-	blr	x6
-	cmn	w0, #1
-	bne	.L4513
-.L4421:
-	ldrb	w0, [x23,1192]
-	cbz	w0, .L4424
+	mov	x2, x23
+	mov	w1, w26
 	mov	w0, 0
-	mov	w1, w27
-	mov	x2, x24
-	add	x3, x29, 240
-	mov	w4, w26
 	bl	flash_ddr_tuning_read
-.L4513:
-	mov	w28, w0
-.L4424:
-	cmn	w28, #1
-	bne	.L4425
-	ldr	w0, [x29,208]
-	cmp	w0, 16
-	beq	.L4425
-	mov	w0, 16
-	bl	nandc_bch_sel
-	mov	w0, 16
-	str	w0, [x29,208]
-	b	.L4417
-.L4425:
-	ldr	w0, [x29,128]
+	b	.L4399
+.L4318:
+	ldrb	w2, [x20, 1]
+	lsl	w1, w0, 1
+	cmp	w2, 0
+	csel	w0, w1, w0, ne
+	b	.L4319
+.L4322:
+	str	w6, [x29, 100]
+	mov	w4, w24
+	str	w5, [x29, 120]
+	add	x3, x29, 240
+	strb	wzr, [x20, 1252]
+	mov	x2, x23
+	mov	w1, w26
+	mov	w0, 0
+	bl	flash_read_page
+	cmn	w0, #1
+	ldr	w6, [x29, 100]
+	strb	w6, [x20, 1252]
+	ldr	w5, [x29, 120]
+	beq	.L4325
+.L4399:
+	mov	w5, w0
+.L4321:
+	cmn	w5, #1
+	cset	w4, eq
+	cmp	w27, 16
+	cset	w0, ne
+	tst	w4, w0
+	beq	.L4327
+	mov	w0, 16
+	mov	w27, 16
 	bl	nandc_bch_sel
-	ldr	w0, [x29,200]
-	cmn	w28, #1
-	csinv	w0, w0, wzr, ne
-	str	w0, [x29,200]
-	ldr	w0, [x29,148]
-	cmp	w25, wzr
-	cset	w1, eq
-	cmp	w0, w20
-	cset	w0, eq
-	tst	w1, w0
-	beq	.L4427
-	ldr	w0, [x29,200]
-	cbnz	w0, .L4427
-	ldr	w1, [x24]
-	mov	w0, 18766
-	movk	w0, 0x464e, lsl 16
-	cmp	w1, w0
-	bne	.L4427
-	ldr	w0, [x29,172]
-	ldr	w1, [x29,176]
-	ldrb	w26, [x24,17]
+	b	.L4320
+.L4323:
+	str	w5, [x29, 120]
+	mov	w4, w24
+	add	x3, x29, 240
+	mov	x2, x23
+	mov	w1, w26
+	mov	w0, 0
+	blr	x6
+	cmn	w0, #1
+	ldr	w5, [x29, 120]
+	beq	.L4324
+	b	.L4399
+.L4327:
+	ldr	w0, [x29, 124]
+	bl	nandc_bch_sel
+	cmp	w4, 0
+	ldr	w0, [x29, 196]
+	csinv	w0, w0, wzr, eq
+	str	w0, [x29, 196]
+	ldr	w0, [x29, 152]
+	cmp	w25, 0
+	ccmp	w21, w0, 0, eq
+	bne	.L4329
+	ldr	w0, [x29, 196]
+	cbnz	w0, .L4329
+	ldr	w0, [x23]
+	mov	w1, 18766
+	movk	w1, 0x464e, lsl 16
+	cmp	w0, w1
+	bne	.L4329
+	ldr	w0, [x29, 192]
+	ldr	w1, [x29, 176]
+	ldrb	w24, [x23, 17]
 	add	w0, w0, w1
-	str	w0, [x29,172]
-	b	.L4428
-.L4427:
-	ldr	x0, [x29,176]
+	str	w0, [x29, 192]
+.L4330:
+	ldr	w0, [x29, 176]
+	add	w25, w0, w25
+	and	w25, w25, 65535
+	b	.L4317
+.L4329:
+	ldr	x0, [x29, 176]
 	mov	w2, w25
-	ldr	w1, [x29,144]
+	ldr	w1, [x29, 148]
+	ldp	w3, w4, [x29, 240]
 	ubfiz	x0, x0, 9, 16
-	ldr	w3, [x29,240]
-	add	x24, x24, x0
-	ldr	w4, [x29,244]
-	ldr	x0, [x29,120]
+	add	x23, x23, x0
+	adrp	x0, .LC321
+	add	x0, x0, :lo12:.LC321
 	bl	printk
-	str	wzr, [x29,192]
-.L4428:
-	ldr	w0, [x29,176]
-	add	w25, w0, w25
-	uxth	w25, w25
-	b	.L4414
-.L4516:
-	add	x23, x27, :lo12:.LANCHOR0
-	ldrb	w0, [x29,132]
-	strb	w0, [x23,1240]
-	ldr	w0, [x29,236]
-	cbz	w0, .L4430
-	mov	w0, 0
-	bl	zftl_flash_exit_slc_mode
-	strb	wzr, [x27,#:lo12:.LANCHOR0]
-	strb	wzr, [x23,1154]
-.L4430:
-	ldr	w0, [x29,224]
-	mov	x1, 0
-	lsl	w0, w0, 7
-.L4431:
-	cmp	w0, w1
-	bls	.L4517
-	ldr	w3, [x22,x1,lsl 2]
+	str	wzr, [x29, 200]
+	b	.L4330
+.L4334:
+	ldr	x2, [x29, 216]
+	ldr	w3, [x22, x1, lsl 2]
 	add	x1, x1, 1
-	ldr	x2, [x29,216]
 	add	x2, x2, x1, lsl 2
-	ldr	w2, [x2,-4]
+	ldr	w2, [x2, -4]
 	cmp	w3, w2
-	beq	.L4431
-	mov	x0, x22
-	mov	w1, 0
+	beq	.L4333
 	mov	w2, 512
+	mov	w1, 0
+	mov	x0, x22
 	bl	ftl_memset
-	mov	w1, w20
+	mov	w1, w21
 	mov	w0, 0
 	bl	flash_erase_block
-	b	.L4395
-.L4517:
-	ldr	w0, [x29,232]
-	add	w0, w0, 1
-	str	w0, [x29,232]
-	cmp	w0, 5
-	bhi	.L4436
-.L4395:
-	add	x21, x21, 1
-	cmp	x21, 4
-	bne	.L4434
-.L4436:
-	mov	w0, 0
-	bl	zftl_flash_exit_slc_mode
-	adrp	x0, .LANCHOR0
-	ldrb	w2, [x29,156]
-	add	x1, x0, :lo12:.LANCHOR0
-	strb	w2, [x0,#:lo12:.LANCHOR0]
-	ldr	w2, [x29,236]
-	cbz	w2, .L4435
-	ldrb	w2, [x29,140]
-	strb	w2, [x1,1154]
-.L4435:
-	add	x0, x0, :lo12:.LANCHOR0
-	mov	w1, 2
-	strb	w1, [x0,1264]
-	mov	w0, 0
-	bl	zftl_flash_enter_slc_mode
-	mov	x0, x22
-	bl	ftl_free
-	ldr	w0, [x29,232]
-	cmp	w0, wzr
-	csetm	w0, eq
-.L4508:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
-	ldp	x29, x30, [sp], 304
-	ret
+	b	.L4298
 	.size	write_idblock, .-write_idblock
 	.align	2
 	.global	write_loader_lba
@@ -28611,644 +28370,651 @@ write_loader_lba:
 	stp	x29, x30, [sp, -112]!
 	cmp	w0, 64
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
+	stp	x19, x20, [sp, 16]
 	mov	w19, w0
+	stp	x21, x22, [sp, 32]
+	adrp	x20, .LANCHOR5
+	stp	x23, x24, [sp, 48]
 	mov	w21, w1
 	mov	x24, x2
-	adrp	x20, .LANCHOR5
-	bne	.L4519
+	bne	.L4402
 	ldr	w0, [x2]
-	mov	w1, 19282
-	movk	w1, 0x534e, lsl 16
-	mov	w2, 35899
+	mov	w1, 35899
+	movk	w1, 0xfcdc, lsl 16
 	cmp	w0, w1
-	movk	w2, 0xfcdc, lsl 16
-	cset	w3, eq
-	cmp	w0, w2
-	cset	w1, eq
-	orr	w1, w3, w1
-	cbnz	w1, .L4535
 	mov	w1, 19282
-	movk	w1, 0x5353, lsl 16
+	movk	w1, 0x534e, lsl 16
+	ccmp	w0, w1, 4, ne
+	beq	.L4403
+	add	w1, w1, 327680
 	cmp	w0, w1
-	bne	.L4519
-.L4535:
+	bne	.L4402
+.L4403:
 	add	x22, x20, :lo12:.LANCHOR5
 	mov	w0, 1
-	strb	w0, [x22,1060]
+	strb	w0, [x22, 524]
 	mov	w0, 59392
 	movk	w0, 0x3, lsl 16
 	bl	ftl_malloc
-	str	x0, [x22,1064]
 	mov	w2, 59392
 	mov	w1, 0
 	movk	w2, 0x3, lsl 16
+	str	x0, [x22, 528]
 	bl	ftl_memset
 	mov	w0, 64
-	str	w0, [x22,1072]
-.L4519:
+	str	w0, [x22, 536]
+.L4402:
 	add	x23, x20, :lo12:.LANCHOR5
-	adrp	x0, .LC322
 	ldr	w2, [x24]
-	add	x0, x0, :lo12:.LC322
-	mov	w3, w19
 	mov	w4, w21
-	ldr	x1, [x23,1064]
+	mov	w3, w19
+	adrp	x0, .LC322
+	add	x0, x0, :lo12:.LC322
+	ldr	x1, [x23, 528]
 	bl	printk
-	ldrb	w0, [x23,1060]
-	cbz	w0, .L4518
-	ldr	x22, [x23,1064]
-	cbz	x22, .L4518
+	ldrb	w0, [x23, 524]
+	cbz	w0, .L4401
+	ldr	x22, [x23, 528]
+	cbz	x22, .L4401
 	sub	w0, w19, #64
 	cmp	w0, 499
-	bhi	.L4522
-	mov	w3, 564
+	bhi	.L4405
+	mov	w2, 564
+	sub	w2, w2, w19
+	cmp	w21, w2
 	ubfiz	x0, x0, 9, 25
-	sub	w3, w3, w19
-	add	x0, x22, x0
-	cmp	w3, w21
+	csel	w2, w21, w2, ls
 	mov	x1, x24
-	csel	w2, w3, w21, ls
 	lsl	w2, w2, 9
+	add	x0, x22, x0
 	bl	ftl_memcpy
-	b	.L4523
-.L4522:
-	cmp	w19, 563
-	bhi	.L4533
-.L4523:
+.L4406:
 	add	x23, x20, :lo12:.LANCHOR5
-	ldr	w0, [x23,1072]
-	cmp	w0, w19
-	beq	.L4531
+	ldr	w0, [x23, 536]
+	cmp	w19, w0
+	beq	.L4415
+	strb	wzr, [x23, 524]
 	mov	x0, x22
-	strb	wzr, [x23,1060]
 	bl	ftl_free
-	str	xzr, [x23,1064]
-.L4531:
-	add	x20, x20, :lo12:.LANCHOR5
-	add	w19, w19, w21
-	str	w19, [x20,1072]
-	b	.L4518
-.L4533:
-	ldr	w2, [x23,1072]
-	mov	w0, 500
-	sub	w2, w2, #64
-	cmp	w2, 500
-	csel	w2, w2, w0, ls
-	adrp	x0, .LANCHOR0+1144
-	ldr	x0, [x0,#:lo12:.LANCHOR0+1144]
-	ldrb	w0, [x0,9]
-	cmp	w0, 4
-	beq	.L4534
-	mov	w0, 2
-	str	w0, [x29,72]
-	mov	w0, 3
-	str	w0, [x29,76]
-	mov	w0, 4
-	str	w0, [x29,80]
-	mov	w0, 5
-	str	w0, [x29,84]
-	mov	w0, 6
-	str	w0, [x29,88]
-	b	.L4525
-.L4534:
-	mov	x3, 0
-.L4524:
-	cmp	w2, 256
-	add	x0, x29, 72
-	bls	.L4526
-	lsl	w1, w3, 1
-	str	w1, [x0,x3,lsl 2]
-	b	.L4527
-.L4526:
-	str	w3, [x0,x3,lsl 2]
-.L4527:
-	add	x3, x3, 1
-	cmp	x3, 5
-	bne	.L4524
-.L4525:
-	add	x0, x22, 245760
-	mov	w3, 61952
-	add	x0, x0, 2048
-.L4530:
-	ldr	w1, [x0]
-	cbz	w1, .L4528
-	add	w2, w3, 2048
-	lsl	w0, w2, 2
-	b	.L4529
-.L4528:
-	sub	w3, w3, #1
-	sub	x0, x0, #4
-	cmp	w3, 4096
-	bne	.L4530
-	lsl	w0, w2, 9
-.L4529:
+	str	xzr, [x23, 528]
+	b	.L4415
+.L4405:
+	cmp	w19, 563
+	bls	.L4406
+	ldr	w0, [x23, 536]
+	mov	w1, 500
+	sub	w0, w0, #64
+	cmp	w0, 500
+	csel	w0, w0, w1, ls
+	adrp	x1, .LANCHOR0+1144
+	ldr	x1, [x1, #:lo12:.LANCHOR0+1144]
+	ldrb	w1, [x1, 9]
+	cmp	w1, 4
+	beq	.L4407
+	mov	w1, 2
+	str	w1, [x29, 72]
+	mov	w1, 3
+	str	w1, [x29, 76]
+	mov	w1, 4
+	str	w1, [x29, 80]
+	mov	w1, 5
+	str	w1, [x29, 84]
+	mov	w1, 6
+	str	w1, [x29, 88]
+.L4408:
+	add	x2, x22, 245760
+	mov	w1, 61952
+	add	x2, x2, 2048
+.L4414:
+	ldr	w3, [x2]
+	cbz	w3, .L4412
+	add	w0, w1, 2048
+	lsl	w0, w0, 2
+.L4413:
 	mov	x1, x22
-	add	x2, x29, 72
 	add	x22, x20, :lo12:.LANCHOR5
+	add	x2, x29, 72
 	bl	write_idblock
-	ldr	x0, [x22,1064]
-	strb	wzr, [x22,1060]
+	ldr	x0, [x22, 528]
+	strb	wzr, [x22, 524]
 	bl	ftl_free
-	str	xzr, [x22,1064]
-	b	.L4531
-.L4518:
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
+	str	xzr, [x22, 528]
+.L4415:
+	add	x20, x20, :lo12:.LANCHOR5
+	add	w19, w19, w21
+	str	w19, [x20, 536]
+.L4401:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
 	ldp	x29, x30, [sp], 112
 	ret
+.L4407:
+	add	x2, x29, 72
+	mov	x1, 0
+.L4411:
+	cmp	w0, 256
+	bls	.L4409
+	lsl	w3, w1, 1
+	str	w3, [x2, x1, lsl 2]
+.L4410:
+	add	x1, x1, 1
+	cmp	x1, 5
+	bne	.L4411
+	b	.L4408
+.L4409:
+	str	w1, [x2, x1, lsl 2]
+	b	.L4410
+.L4412:
+	sub	w1, w1, #1
+	sub	x2, x2, #4
+	cmp	w1, 4096
+	bne	.L4414
+	lsl	w0, w0, 9
+	b	.L4413
 	.size	write_loader_lba, .-write_loader_lba
 	.align	2
 	.global	FtlWrite
 	.type	FtlWrite, %function
 FtlWrite:
-	stp	x29, x30, [sp, -64]!
+	stp	x29, x30, [sp, -48]!
 	add	x29, sp, 0
-	str	x21, [sp,32]
-	uxtb	w21, w0
+	stp	x19, x20, [sp, 16]
+	and	w20, w0, 255
+	stp	x21, x22, [sp, 32]
 	sub	w0, w1, #64
-	stp	x19, x20, [sp,16]
-	cmp	w0, 1983
 	mov	w19, w1
-	mov	w20, w2
-	bhi	.L4548
-	cbnz	w21, .L4548
-	mov	w0, w1
-	mov	w1, w2
+	mov	w21, w2
+	mov	x22, x3
+	cmp	w0, 1983
+	bhi	.L4427
+	cbnz	w20, .L4427
 	mov	x2, x3
-	str	x3, [x29,56]
+	mov	w1, w21
+	mov	w0, w19
 	bl	write_loader_lba
-	ldr	x3, [x29,56]
-.L4548:
-	adrp	x0, .LANCHOR5+280
+.L4427:
+	adrp	x0, .LANCHOR5+232
+	mov	x3, x22
+	mov	w2, w21
 	mov	w1, w19
-	mov	w2, w20
-	ldr	x0, [x0,#:lo12:.LANCHOR5+280]
-	ldr	x4, [x0,48]
-	mov	w0, w21
+	ldr	x0, [x0, #:lo12:.LANCHOR5+232]
+	ldr	x4, [x0, 48]
+	mov	w0, w20
 	blr	x4
-	ldr	x21, [sp,32]
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 64
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x29, x30, [sp], 48
 	ret
 	.size	FtlWrite, .-FtlWrite
 	.align	2
 	.global	rknand_sys_storage_ioctl
 	.type	rknand_sys_storage_ioctl, %function
 rknand_sys_storage_ioctl:
-	sub	sp, sp, #528
+	sub	sp, sp, #560
 	mov	w0, 27688
 	movk	w0, 0x4004, lsl 16
 	cmp	w1, w0
-	stp	x29, x30, [sp, -32]!
+	stp	x29, x30, [sp]
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	mov	w19, w1
 	mov	x20, x2
-	beq	.L4557
-	mov	w0, 27688
-	movk	w0, 0x4004, lsl 16
-	cmp	w1, w0
-	bhi	.L4558
-	mov	w0, 25602
-	movk	w0, 0x4004, lsl 16
-	cmp	w1, w0
-	beq	.L4559
+	beq	.L4431
+	bhi	.L4432
 	mov	w0, 25602
 	movk	w0, 0x4004, lsl 16
 	cmp	w1, w0
-	bhi	.L4560
+	beq	.L4433
+	bhi	.L4434
 	mov	w0, 25364
 	movk	w0, 0x4004, lsl 16
 	cmp	w1, w0
-	beq	.L4561
-	mov	w0, 25601
-	movk	w0, 0x4004, lsl 16
+	beq	.L4435
+	add	w0, w0, 237
 	cmp	w1, w0
-	beq	.L4562
-	b	.L4593
-.L4560:
+	beq	.L4436
+.L4466:
+	mov	x19, -22
+	b	.L4429
+.L4434:
 	mov	w0, 25726
 	movk	w0, 0x4004, lsl 16
 	cmp	w1, w0
-	beq	.L4563
-	mov	w0, 25727
-	movk	w0, 0x4004, lsl 16
+	beq	.L4437
+	add	w0, w0, 1
 	cmp	w1, w0
-	beq	.L4564
+	beq	.L4438
 	mov	w0, 25603
 	movk	w0, 0x4004, lsl 16
 	cmp	w1, w0
-	bne	.L4593
-	b	.L4615
-.L4558:
+	bne	.L4466
+	adrp	x0, .LC328
+	add	x0, x0, :lo12:.LC328
+	bl	printk
+	mov	x2, 520
+	mov	x1, x20
+	add	x0, x29, 40
+	bl	rk_copy_from_user
+	cbnz	x0, .L4449
+	ldr	w1, [x29, 40]
+	mov	w0, 20051
+	movk	w0, 0x4144, lsl 16
+	cmp	w1, w0
+	bne	.L4446
+	ldr	w2, [x29, 44]
+	cmp	w2, 512
+	bhi	.L4446
+	adrp	x1, .LANCHOR5
+	add	x1, x1, :lo12:.LANCHOR5
+	uxtw	x2, w2
+	add	x1, x1, 568
+	add	x0, x29, 48
+.L4487:
+	bl	memcpy
+	b	.L4481
+.L4432:
 	mov	w0, 30224
 	movk	w0, 0x4004, lsl 16
 	cmp	w1, w0
-	beq	.L4566
-	mov	w0, 30224
+	beq	.L4440
+	bhi	.L4441
+	mov	w0, 27698
 	movk	w0, 0x4004, lsl 16
 	cmp	w1, w0
-	bhi	.L4567
+	beq	.L4431
+	add	w0, w0, 10
+	cmp	w1, w0
+	bne	.L4466
+.L4431:
 	mov	w0, 27698
 	movk	w0, 0x4004, lsl 16
+	cmp	w19, w0
+	bne	.L4456
+	adrp	x0, .LC329
+	add	x0, x0, :lo12:.LC329
+.L4483:
+	bl	printk
+	mov	x2, 520
+	mov	x1, x20
+	add	x0, x29, 40
+	bl	rk_copy_from_user
+	cbnz	x0, .L4449
+	ldr	w1, [x29, 40]
+	mov	w0, 17227
+	movk	w0, 0x4c4f, lsl 16
 	cmp	w1, w0
-	beq	.L4557
+	bne	.L4486
 	mov	w0, 27708
 	movk	w0, 0x4004, lsl 16
-	cmp	w1, w0
-	beq	.L4557
-	b	.L4593
-.L4567:
+	cmp	w19, w0
+	adrp	x0, .LANCHOR5
+	bne	.L4459
+	add	x0, x0, :lo12:.LANCHOR5
+	mov	x2, 16
+	add	x1, x29, 40
+	ldr	x0, [x0, 544]
+	ldr	w0, [x0, 20]
+	strb	w0, [x29, 48]
+	str	w0, [x29, 44]
+	mov	x0, x20
+	bl	rk_copy_to_user
+	cbnz	x0, .L4486
+.L4450:
+	mov	x19, 0
+.L4429:
+	mov	x0, x19
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp]
+	add	sp, sp, 560
+	ret
+.L4441:
 	mov	w0, 30226
 	movk	w0, 0x4004, lsl 16
 	cmp	w1, w0
-	beq	.L4566
-	mov	w0, 30226
-	movk	w0, 0x4004, lsl 16
+	beq	.L4440
+	bcc	.L4442
+	add	w0, w0, 1
 	cmp	w1, w0
-	bcc	.L4568
-	mov	w0, 30227
-	movk	w0, 0x4004, lsl 16
+	bne	.L4466
+.L4442:
+	adrp	x0, .LC334
+	add	x0, x0, :lo12:.LC334
+	bl	printk
+	mov	x2, 520
+	mov	x1, x20
+	add	x0, x29, 40
+	bl	rk_copy_from_user
+	cbnz	x0, .L4449
+	ldr	w1, [x29, 40]
+	mov	w0, 17750
+	movk	w0, 0x444e, lsl 16
 	cmp	w1, w0
-	beq	.L4568
-	b	.L4593
-.L4562:
+	bne	.L4446
+	ldr	w2, [x29, 44]
+	cmp	w2, 504
+	bhi	.L4446
+	mov	w0, 30225
+	add	w2, w2, 8
+	movk	w0, 0x4004, lsl 16
+	add	x1, x29, 40
+	cmp	w19, w0
+	adrp	x19, .LANCHOR5
+	add	x19, x19, :lo12:.LANCHOR5
+	bne	.L4465
+	ldr	x0, [x19, 1088]
+	bl	memcpy
+	mov	w0, 2
+	ldr	x1, [x19, 1088]
+	b	.L4485
+.L4436:
 	adrp	x0, .LC323
 	add	x0, x0, :lo12:.LC323
 	bl	printk
-	add	x0, x29, 40
-	mov	x1, x20
 	mov	x2, 520
+	mov	x1, x20
+	add	x0, x29, 40
 	bl	rk_copy_from_user
-	cbz	x0, .L4569
-.L4575:
+	cbz	x0, .L4443
+.L4449:
 	adrp	x0, .LC324
 	add	x0, x0, :lo12:.LC324
 	bl	printk
-	b	.L4612
-.L4569:
-	ldr	w1, [x29,40]
+.L4486:
+	mov	x19, -14
+	b	.L4429
+.L4443:
+	ldr	w1, [x29, 40]
 	mov	w0, 21060
 	movk	w0, 0x4b4d, lsl 16
 	cmp	w1, w0
-	beq	.L4570
-.L4572:
+	beq	.L4444
+.L4446:
 	mov	x19, -1
-	b	.L4571
-.L4570:
-	ldr	w0, [x29,44]
+.L4445:
+	mov	x1, x19
+	adrp	x0, .LC335
+	add	x0, x0, :lo12:.LC335
+	bl	printk
+	b	.L4429
+.L4444:
+	ldr	w0, [x29, 44]
 	cmp	w0, 512
-	bhi	.L4572
+	bhi	.L4446
 	adrp	x19, .LANCHOR5
-	add	x0, x29, 40
 	add	x19, x19, :lo12:.LANCHOR5
 	mov	x2, 512
-	ldr	x1, [x19,1080]
+	add	x0, x29, 40
+	ldr	x1, [x19, 544]
 	bl	memcpy
-	ldr	w1, [x19,1088]
+	ldr	w1, [x19, 552]
 	mov	w0, 5161
 	movk	w0, 0xc059, lsl 16
 	cmp	w1, w0
-	beq	.L4573
-	add	x0, x29, 104
-	mov	w1, 0
+	beq	.L4447
 	mov	x2, 128
-	str	wzr, [x29,48]
-	str	wzr, [x29,52]
-	bl	memset
-.L4573:
-	add	x0, x29, 296
 	mov	w1, 0
+	add	x0, x29, 104
+	stp	wzr, wzr, [x29, 48]
+	bl	memset
+.L4447:
+	add	x0, x29, 40
 	mov	x2, 256
-	str	wzr, [x29,56]
+	mov	w1, 0
+	add	x0, x0, x2
+	str	wzr, [x29, 56]
 	bl	memset
-.L4607:
-	mov	x0, x20
-	add	x1, x29, 40
+.L4481:
 	mov	x2, 520
+	add	x1, x29, 40
+	mov	x0, x20
 	bl	rk_copy_to_user
-	cbnz	x0, .L4612
-	b	.L4610
-.L4559:
+	cbnz	x0, .L4486
+.L4484:
+	mov	x19, 0
+	b	.L4445
+.L4433:
 	adrp	x0, .LC325
 	add	x0, x0, :lo12:.LC325
 	bl	printk
-	add	x0, x29, 40
-	mov	x1, x20
 	mov	x2, 520
+	mov	x1, x20
+	add	x0, x29, 40
 	bl	rk_copy_from_user
-	cbnz	x0, .L4575
-	ldr	w1, [x29,40]
+	cbnz	x0, .L4449
+	ldr	w1, [x29, 40]
 	mov	w0, 21060
 	movk	w0, 0x4b4d, lsl 16
 	cmp	w1, w0
-	bne	.L4572
-	ldr	w0, [x29,44]
+	bne	.L4446
+	ldr	w0, [x29, 44]
 	cmp	w0, 512
-	bhi	.L4572
-	adrp	x1, .LANCHOR5
-	mov	w2, 5161
-	add	x1, x1, :lo12:.LANCHOR5
-	movk	w2, 0xc059, lsl 16
-	mov	x0, -2
-	ldr	w3, [x1,1088]
-	cmp	w3, w2
-	bne	.L4556
-	ldr	w2, [x29,52]
-	mov	x0, -3
-	sub	w3, w2, #1
-	cmp	w3, 127
-	bhi	.L4556
-	ldr	x19, [x1,1080]
-	add	x1, x29, 104
+	bhi	.L4446
+	adrp	x0, .LANCHOR5
+	add	x0, x0, :lo12:.LANCHOR5
+	mov	w1, 5161
+	movk	w1, 0xc059, lsl 16
+	ldr	w2, [x0, 552]
+	cmp	w2, w1
+	bne	.L4467
+	ldr	w1, [x29, 52]
+	mov	x19, -3
+	sub	w2, w1, #1
+	cmp	w2, 127
+	bhi	.L4429
+	ldr	x19, [x0, 544]
 	add	x0, x19, 64
-	str	w2, [x19,12]
-	ldr	w2, [x29,52]
+	str	w1, [x19, 12]
+	add	x1, x29, 104
+	ldr	w2, [x29, 52]
 	bl	memcpy
-	mov	w0, 1
 	mov	x1, x19
-	b	.L4611
-.L4564:
+	mov	w0, 1
+.L4485:
+	bl	StorageSysDataStore
+	uxtw	x19, w0
+	b	.L4445
+.L4438:
 	adrp	x0, .LC326
 	add	x0, x0, :lo12:.LC326
 	bl	printk
-	add	x0, x29, 40
-	mov	x1, x20
 	mov	x2, 520
+	mov	x1, x20
+	add	x0, x29, 40
 	bl	rk_copy_from_user
-	cbnz	x0, .L4575
-	ldr	w1, [x29,40]
+	cbnz	x0, .L4449
+	ldr	w1, [x29, 40]
 	mov	w0, 17476
 	movk	w0, 0x4253, lsl 16
 	cmp	w1, w0
-	bne	.L4572
-	ldr	w0, [x29,44]
+	bne	.L4446
+	ldr	w0, [x29, 44]
 	cmp	w0, 512
-	bhi	.L4572
+	bhi	.L4446
 	adrp	x19, .LANCHOR5
 	add	x0, x19, :lo12:.LANCHOR5
-	ldr	w0, [x0,1092]
-	cbnz	w0, .L4576
-.L4579:
-	mov	x0, 0
-	b	.L4556
-.L4576:
+	ldr	w0, [x0, 556]
+	cbz	w0, .L4450
 	add	x0, x19, :lo12:.LANCHOR5
 	mov	w2, 22867
 	movk	w2, 0x4453, lsl 16
-	ldr	x1, [x0,1096]
+	ldr	x1, [x0, 560]
 	ldr	w3, [x1]
 	cmp	w3, w2
-	beq	.L4577
-	mov	w2, 22867
-	movk	w2, 0x4453, lsl 16
+	beq	.L4451
 	str	w2, [x1]
 	mov	w2, 504
-	ldr	x1, [x0,1096]
-	str	w2, [x1,4]
-	ldr	x0, [x0,1096]
-	str	wzr, [x0,8]
-	str	wzr, [x0,12]
-.L4577:
+	ldr	x1, [x0, 560]
+	str	w2, [x1, 4]
+	ldr	x0, [x0, 560]
+	stp	wzr, wzr, [x0, 8]
+.L4451:
 	add	x20, x19, :lo12:.LANCHOR5
 	mov	w0, 0
-	ldr	x1, [x20,1096]
-	str	wzr, [x1,16]
+	ldr	x1, [x20, 560]
+	str	wzr, [x1, 16]
 	bl	StorageSysDataStore
-	ldr	x0, [x20,1080]
+	ldr	x0, [x20, 544]
 	mov	w1, 21060
 	movk	w1, 0x4b4d, lsl 16
 	ldr	w2, [x0]
 	cmp	w2, w1
-	beq	.L4578
-	mov	w1, 21060
-	movk	w1, 0x4b4d, lsl 16
+	beq	.L4452
 	str	w1, [x0]
 	mov	w1, 504
-	ldr	x0, [x20,1080]
-	str	w1, [x0,4]
-	ldr	x0, [x20,1080]
-	str	wzr, [x0,8]
-.L4578:
+	ldr	x0, [x20, 544]
+	str	w1, [x0, 4]
+	ldr	x0, [x20, 544]
+	str	wzr, [x0, 8]
+.L4452:
 	add	x19, x19, :lo12:.LANCHOR5
-	mov	w1, 0
 	mov	x2, 128
-	ldr	x20, [x19,1080]
+	mov	w1, 0
+	ldr	x20, [x19, 544]
 	add	x0, x20, 64
-	str	wzr, [x20,12]
+	str	wzr, [x20, 12]
 	bl	memset
-	mov	w0, 1
 	mov	x1, x20
+	mov	w0, 1
 	bl	StorageSysDataStore
-	str	wzr, [x19,1092]
-	str	wzr, [x19,1088]
-	b	.L4610
-.L4563:
+	str	wzr, [x19, 552]
+	str	wzr, [x19, 556]
+	b	.L4484
+.L4437:
 	adrp	x0, .LC327
 	add	x0, x0, :lo12:.LC327
 	bl	printk
-	add	x0, x29, 40
-	mov	x1, x20
 	mov	x2, 520
+	mov	x1, x20
+	add	x0, x29, 40
 	bl	rk_copy_from_user
-	cbnz	x0, .L4575
-	ldr	w1, [x29,40]
+	cbnz	x0, .L4449
+	ldr	w1, [x29, 40]
 	mov	w0, 20037
 	movk	w0, 0x4253, lsl 16
 	cmp	w1, w0
-	bne	.L4572
-	ldr	w0, [x29,44]
+	bne	.L4446
+	ldr	w0, [x29, 44]
 	cmp	w0, 512
-	bhi	.L4572
+	bhi	.L4446
 	adrp	x19, .LANCHOR5
 	add	x0, x19, :lo12:.LANCHOR5
-	ldr	w1, [x0,1092]
+	ldr	w1, [x0, 556]
 	cmp	w1, 1
-	beq	.L4579
-	ldr	x0, [x0,1096]
-	mov	w1, 22867
-	movk	w1, 0x4453, lsl 16
-	ldr	w2, [x0]
-	cmp	w2, w1
-	beq	.L4580
-	mov	w1, 22867
-	mov	w2, 504
-	movk	w1, 0x4453, lsl 16
-	str	w1, [x0]
+	beq	.L4450
+	ldr	x1, [x0, 560]
+	mov	w0, 22867
+	movk	w0, 0x4453, lsl 16
+	ldr	w2, [x1]
+	cmp	w2, w0
+	beq	.L4453
+	str	w0, [x1]
 	add	x0, x19, :lo12:.LANCHOR5
-	ldr	x1, [x0,1096]
-	str	w2, [x1,4]
-	ldr	x0, [x0,1096]
-	str	wzr, [x0,8]
-	str	wzr, [x0,12]
-.L4580:
+	mov	w2, 504
+	ldr	x1, [x0, 560]
+	str	w2, [x1, 4]
+	ldr	x0, [x0, 560]
+	stp	wzr, wzr, [x0, 8]
+.L4453:
 	add	x20, x19, :lo12:.LANCHOR5
 	mov	w0, 1
-	ldr	x1, [x20,1096]
-	str	w0, [x1,16]
+	ldr	x1, [x20, 560]
+	str	w0, [x1, 16]
 	mov	w0, 0
 	bl	StorageSysDataStore
-	ldr	x0, [x20,1080]
+	ldr	x0, [x20, 544]
 	mov	w1, 21060
 	movk	w1, 0x4b4d, lsl 16
 	ldr	w2, [x0]
 	cmp	w2, w1
-	beq	.L4581
-	mov	w1, 21060
-	movk	w1, 0x4b4d, lsl 16
+	beq	.L4454
 	str	w1, [x0]
 	mov	w1, 504
-	ldr	x0, [x20,1080]
-	str	w1, [x0,4]
-	ldr	x0, [x20,1080]
-	str	wzr, [x0,8]
-.L4581:
+	ldr	x0, [x20, 544]
+	str	w1, [x0, 4]
+	ldr	x0, [x20, 544]
+	str	wzr, [x0, 8]
+.L4454:
 	add	x19, x19, :lo12:.LANCHOR5
-	mov	w1, 0
 	mov	x2, 128
-	ldr	x20, [x19,1080]
+	mov	w1, 0
+	ldr	x20, [x19, 544]
 	add	x0, x20, 64
-	str	wzr, [x20,12]
+	str	wzr, [x20, 12]
 	bl	memset
-	mov	w0, 1
 	mov	x1, x20
+	mov	w0, 1
 	bl	StorageSysDataStore
 	mov	w0, 1
-	str	w0, [x19,1092]
-	b	.L4610
-.L4615:
-	adrp	x0, .LC328
-	add	x0, x0, :lo12:.LC328
-	bl	printk
-	add	x0, x29, 40
-	mov	x1, x20
-	mov	x2, 520
-	bl	rk_copy_from_user
-	cbnz	x0, .L4575
-	ldr	w1, [x29,40]
-	mov	w0, 20051
-	movk	w0, 0x4144, lsl 16
-	cmp	w1, w0
-	bne	.L4572
-	ldr	w2, [x29,44]
-	cmp	w2, 512
-	bhi	.L4572
-	adrp	x1, .LANCHOR5
-	add	x0, x29, 48
-	add	x1, x1, :lo12:.LANCHOR5
-	uxtw	x2, w2
-	add	x1, x1, 1104
-	b	.L4613
-.L4557:
-	mov	w0, 27698
-	movk	w0, 0x4004, lsl 16
-	cmp	w19, w0
-	bne	.L4583
-	adrp	x0, .LC329
-	add	x0, x0, :lo12:.LC329
-	b	.L4609
-.L4583:
+	str	w0, [x19, 556]
+	b	.L4484
+.L4456:
 	mov	w0, 27708
 	movk	w0, 0x4004, lsl 16
 	cmp	w19, w0
-	bne	.L4585
+	bne	.L4458
 	adrp	x0, .LC330
 	add	x0, x0, :lo12:.LC330
-	b	.L4609
-.L4585:
+	b	.L4483
+.L4458:
 	adrp	x0, .LC331
 	add	x0, x0, :lo12:.LC331
-.L4609:
-	bl	printk
-	add	x0, x29, 40
-	mov	x1, x20
-	mov	x2, 520
-	bl	rk_copy_from_user
-	cbnz	x0, .L4575
-	ldr	w1, [x29,40]
-	mov	w0, 17227
-	movk	w0, 0x4c4f, lsl 16
-	cmp	w1, w0
-	bne	.L4612
-	mov	w0, 27708
-	movk	w0, 0x4004, lsl 16
-	cmp	w19, w0
-	adrp	x0, .LANCHOR5
-	bne	.L4586
-	add	x0, x0, :lo12:.LANCHOR5
-	add	x1, x29, 40
-	mov	x2, 16
-	ldr	x0, [x0,1080]
-	ldr	w0, [x0,20]
-	str	w0, [x29,44]
-	strb	w0, [x29,48]
-	mov	x0, x20
-	bl	rk_copy_to_user
-	cbz	x0, .L4556
-	b	.L4612
-.L4586:
+	b	.L4483
+.L4459:
 	add	x20, x0, :lo12:.LANCHOR5
-	ldr	w1, [x20,1616]
+	ldr	w1, [x20, 1080]
 	cmp	w1, 10
-	bhi	.L4612
-	ldr	x1, [x20,1080]
-	ldr	w2, [x29,44]
-	ldr	w3, [x1,24]
+	bhi	.L4486
+	ldr	x1, [x20, 544]
+	ldr	w2, [x29, 44]
+	ldr	w3, [x1, 24]
 	cmp	w3, w2
-	beq	.L4587
-	cbz	w3, .L4587
-	adrp	x0, .LC332
+	beq	.L4460
+	cbz	w3, .L4460
 	mov	w1, w2
+	adrp	x0, .LC332
 	add	x0, x0, :lo12:.LC332
 	bl	printk
-	ldr	w0, [x20,1616]
+	ldr	w0, [x20, 1080]
 	add	w0, w0, 1
-	str	w0, [x20,1616]
-.L4612:
-	mov	x0, -14
-	b	.L4556
-.L4587:
+	str	w0, [x20, 1080]
+	b	.L4486
+.L4460:
 	add	x0, x0, :lo12:.LANCHOR5
-	str	wzr, [x0,1616]
+	str	wzr, [x0, 1080]
 	mov	w0, 27698
 	movk	w0, 0x4004, lsl 16
 	cmp	w19, w0
-	bne	.L4588
-	str	wzr, [x1,20]
-	str	wzr, [x1,24]
-	b	.L4589
-.L4588:
+	bne	.L4461
+	stp	wzr, wzr, [x1, 20]
+.L4462:
 	mov	w0, 1
-	str	w2, [x1,24]
-	str	w0, [x1,20]
-.L4589:
-	mov	w0, 1
-	mov	x19, -2
 	bl	StorageSysDataStore
 	cmn	w0, #1
-	bne	.L4610
-	b	.L4571
-.L4566:
+	bne	.L4484
+	mov	x19, -2
+	b	.L4445
+.L4461:
+	mov	w0, 1
+	stp	w0, w2, [x1, 20]
+	b	.L4462
+.L4440:
 	adrp	x0, .LC333
 	add	x0, x0, :lo12:.LC333
 	bl	printk
-	add	x0, x29, 40
-	mov	x1, x20
 	mov	x2, 520
+	mov	x1, x20
+	add	x0, x29, 40
 	bl	rk_copy_from_user
-	cbnz	x0, .L4575
-	ldr	w1, [x29,40]
+	cbnz	x0, .L4449
+	ldr	w1, [x29, 40]
 	mov	w0, 17750
 	movk	w0, 0x444e, lsl 16
 	cmp	w1, w0
-	bne	.L4572
-	ldr	w2, [x29,44]
+	bne	.L4446
+	ldr	w2, [x29, 44]
 	cmp	w2, 504
-	bhi	.L4572
+	bhi	.L4446
 	mov	w0, 30224
 	adrp	x1, .LANCHOR5
 	movk	w0, 0x4004, lsl 16
@@ -29256,74 +29022,26 @@ rknand_sys_storage_ioctl:
 	cmp	w19, w0
 	add	x1, x1, :lo12:.LANCHOR5
 	add	x0, x29, 48
-	bne	.L4590
-	ldr	x1, [x1,1624]
-	b	.L4614
-.L4590:
-	ldr	x1, [x1,1632]
-.L4614:
+	bne	.L4463
+	ldr	x1, [x1, 1088]
+.L4488:
 	add	x1, x1, 8
-.L4613:
-	bl	memcpy
-	b	.L4607
-.L4568:
-	adrp	x0, .LC334
-	add	x0, x0, :lo12:.LC334
-	bl	printk
-	add	x0, x29, 40
-	mov	x1, x20
-	mov	x2, 520
-	bl	rk_copy_from_user
-	cbnz	x0, .L4575
-	ldr	w1, [x29,40]
-	mov	w0, 17750
-	movk	w0, 0x444e, lsl 16
-	cmp	w1, w0
-	bne	.L4572
-	ldr	w2, [x29,44]
-	cmp	w2, 504
-	bhi	.L4572
-	mov	w0, 30225
-	add	w2, w2, 8
-	movk	w0, 0x4004, lsl 16
-	cmp	w19, w0
-	adrp	x19, .LANCHOR5
-	add	x19, x19, :lo12:.LANCHOR5
-	bne	.L4592
-	ldr	x0, [x19,1624]
-	add	x1, x29, 40
-	bl	memcpy
-	mov	w0, 2
-	ldr	x1, [x19,1624]
-	b	.L4611
-.L4592:
-	ldr	x0, [x19,1632]
-	add	x1, x29, 40
+	b	.L4487
+.L4463:
+	ldr	x1, [x1, 1096]
+	b	.L4488
+.L4465:
+	ldr	x0, [x19, 1096]
 	bl	memcpy
-	ldr	x1, [x19,1632]
 	mov	w0, 3
-.L4611:
-	bl	StorageSysDataStore
-	uxtw	x19, w0
-	b	.L4571
-.L4561:
+	ldr	x1, [x19, 1096]
+	b	.L4485
+.L4435:
 	bl	rknand_dev_flush
-.L4610:
-	mov	x19, 0
-.L4571:
-	adrp	x0, .LC335
-	mov	x1, x19
-	add	x0, x0, :lo12:.LC335
-	bl	printk
-	mov	x0, x19
-	b	.L4556
-.L4593:
-	mov	x0, -22
-.L4556:
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 32
-	add	sp, sp, 528
-	ret
+	b	.L4484
+.L4467:
+	mov	x19, -2
+	b	.L4429
 	.size	rknand_sys_storage_ioctl, .-rknand_sys_storage_ioctl
 	.align	2
 	.global	rk_ftl_storage_sys_init
@@ -29333,59 +29051,59 @@ rk_ftl_storage_sys_init:
 	mov	w0, -1
 	mov	w2, 512
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
+	stp	x19, x20, [sp, 16]
 	adrp	x20, .LANCHOR5
-	str	x21, [sp,32]
 	add	x19, x20, :lo12:.LANCHOR5
-	ldr	x1, [x19,1040]
-	str	w0, [x19,1072]
+	str	x21, [sp, 32]
+	ldr	x1, [x19, 504]
+	str	w0, [x19, 536]
 	add	x0, x1, 512
-	str	x0, [x19,1080]
+	str	x0, [x19, 544]
 	add	x0, x1, 1024
-	str	x1, [x19,1096]
-	str	x0, [x19,1624]
+	str	x1, [x19, 560]
+	str	x0, [x19, 1088]
 	add	x1, x1, 1536
-	add	x0, x19, 1104
-	str	x1, [x19,1632]
-	strb	wzr, [x19,1060]
-	str	xzr, [x19,1064]
-	str	xzr, [x19,1640]
+	strb	wzr, [x19, 524]
+	add	x0, x19, 568
+	str	x1, [x19, 1096]
+	str	xzr, [x19, 528]
+	str	xzr, [x19, 1104]
 	bl	ftl_memcpy
-	ldr	x0, [x19,1096]
-	str	wzr, [x19,1088]
-	str	wzr, [x19,1616]
-	ldr	w1, [x0,16]
-	ldr	w21, [x0,508]
-	str	w1, [x19,1092]
-	cbz	w21, .L4618
+	ldr	x0, [x19, 560]
+	str	wzr, [x19, 552]
+	str	wzr, [x19, 1080]
+	ldr	w21, [x0, 508]
+	ldr	w1, [x0, 16]
+	str	w1, [x19, 556]
+	cbz	w21, .L4491
 	mov	w1, 508
 	bl	js_hash
 	cmp	w21, w0
-	beq	.L4618
-	ldr	x0, [x19,1096]
-	str	wzr, [x19,1092]
-	str	wzr, [x0,16]
+	beq	.L4491
+	ldr	x0, [x19, 560]
+	str	wzr, [x19, 556]
+	str	wzr, [x0, 16]
 	adrp	x0, .LC336
 	add	x0, x0, :lo12:.LC336
 	bl	printk
-.L4618:
+.L4491:
 	add	x0, x20, :lo12:.LANCHOR5
-	ldr	w1, [x0,1092]
-	cbz	w1, .L4620
+	ldr	w1, [x0, 556]
+	cbz	w1, .L4493
 	mov	w1, 5161
 	movk	w1, 0xc059, lsl 16
-	str	w1, [x0,1088]
-.L4620:
+	str	w1, [x0, 552]
+.L4493:
 	add	x20, x20, :lo12:.LANCHOR5
 	mov	w0, 2
-	ldr	x1, [x20,1624]
+	ldr	x1, [x20, 1088]
 	bl	StorageSysDataLoad
-	ldr	x1, [x20,1632]
+	ldr	x1, [x20, 1096]
 	mov	w0, 3
 	bl	StorageSysDataLoad
 	bl	rknand_sys_storage_init
-	ldr	x21, [sp,32]
-	ldp	x19, x20, [sp,16]
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	ret
 	.size	rk_ftl_storage_sys_init, .-rk_ftl_storage_sys_init
@@ -29400,375 +29118,374 @@ StorageSysDataDeInit:
 	.global	rk_ftl_vendor_storage_init
 	.type	rk_ftl_vendor_storage_init, %function
 rk_ftl_vendor_storage_init:
-	stp	x29, x30, [sp, -64]!
+	stp	x29, x30, [sp, -80]!
 	mov	w0, 65536
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	adrp	x21, .LANCHOR5
+	stp	x19, x20, [sp, 16]
+	adrp	x19, .LANCHOR5
+	add	x20, x19, :lo12:.LANCHOR5
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
 	bl	ftl_malloc
-	add	x1, x21, :lo12:.LANCHOR5
-	mov	w19, -12
-	str	x0, [x1,1648]
-	cbz	x0, .L4626
-	mov	w23, 0
+	str	x0, [x20, 1112]
+	cbz	x0, .L4505
 	adrp	x24, .LC337
-	mov	w19, w23
-	mov	w22, w23
+	mov	w26, 22084
+	mov	x22, x19
 	add	x24, x24, :lo12:.LC337
-.L4630:
-	add	x20, x21, :lo12:.LANCHOR5
-	lsl	w0, w22, 7
+	mov	w25, 0
+	mov	w23, 0
+	mov	w21, 0
+	movk	w26, 0x524b, lsl 16
+.L4503:
+	ldr	x2, [x20, 1112]
 	mov	w1, 128
-	ldr	x2, [x20,1648]
+	lsl	w0, w21, 7
 	bl	FlashBootVendorRead
-	cbnz	w0, .L4627
-	ldr	x3, [x20,1648]
+	cbnz	w0, .L4501
+	ldr	x0, [x20, 1112]
+	add	x1, x0, 61440
+	ldr	w3, [x0, 4]
+	ldr	w2, [x1, 4092]
+	ldr	w1, [x0]
 	mov	x0, x24
-	add	x2, x3, 61440
-	ldr	w1, [x3]
-	ldr	w3, [x3,4]
-	ldr	w2, [x2,4092]
 	bl	printk
-	ldr	x20, [x20,1648]
-	mov	w0, 22084
-	movk	w0, 0x524b, lsl 16
-	ldr	w1, [x20]
-	cmp	w1, w0
-	bne	.L4628
-	ldr	w0, [x20,4]
-	cmp	w19, w0
-	bcs	.L4628
-	add	x1, x20, 61440
-	ldr	w1, [x1,4092]
-	cmp	w1, w0
-	csel	w23, w23, w22, ne
-	csel	w19, w19, w0, ne
-.L4628:
-	cbnz	w22, .L4638
-	mov	w22, 1
-	b	.L4630
-.L4638:
-	cbz	w19, .L4631
-	lsl	w0, w23, 7
+	ldr	x19, [x20, 1112]
+	ldr	w0, [x19]
+	cmp	w0, w26
+	bne	.L4502
+	add	x0, x19, 61440
+	ldr	w1, [x19, 4]
+	ldr	w0, [x0, 4092]
+	cmp	w0, w1
+	bne	.L4502
+	cmp	w0, w23
+	bls	.L4502
+	mov	w25, w21
+	mov	w23, w0
+.L4502:
+	add	w21, w21, 1
+	cmp	w21, 2
+	bne	.L4503
+	cbz	w23, .L4504
+	mov	x2, x19
 	mov	w1, 128
-	mov	x2, x20
+	lsl	w0, w25, 7
 	bl	FlashBootVendorRead
-	mov	w19, w0
-	cbz	w0, .L4626
-	b	.L4627
-.L4631:
-	mov	x0, x20
-	mov	w1, w19
+	cbnz	w0, .L4501
+.L4499:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x29, x30, [sp], 80
+	ret
+.L4504:
+	mov	w1, 0
 	mov	x2, 65536
+	mov	x0, x19
 	bl	memset
-	str	w22, [x20,4]
-	mov	w0, 22084
-	movk	w0, 0x524b, lsl 16
-	str	w0, [x20]
-	add	x0, x20, 61440
-	str	w22, [x0,4092]
+	mov	w1, 22084
+	mov	w0, 1
+	movk	w1, 0x524b, lsl 16
+	stp	w1, w0, [x19]
+	add	x1, x19, 61440
+	str	w0, [x1, 4092]
 	mov	w0, -1032
-	strh	w19, [x20,12]
-	strh	w0, [x20,14]
-	b	.L4626
-.L4627:
-	add	x21, x21, :lo12:.LANCHOR5
-	mov	w19, -1
-	ldr	x0, [x21,1648]
+	strh	w0, [x19, 14]
+	mov	w0, 0
+	b	.L4499
+.L4501:
+	add	x22, x22, :lo12:.LANCHOR5
+	ldr	x0, [x22, 1112]
 	bl	kfree
-	str	xzr, [x21,1648]
-.L4626:
-	mov	w0, w19
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x29, x30, [sp], 64
-	ret
+	str	xzr, [x22, 1112]
+	mov	w0, -1
+	b	.L4499
+.L4505:
+	mov	w0, -12
+	b	.L4499
 	.size	rk_ftl_vendor_storage_init, .-rk_ftl_vendor_storage_init
 	.align	2
 	.global	rk_ftl_vendor_read
 	.type	rk_ftl_vendor_read, %function
 rk_ftl_vendor_read:
-	adrp	x3, .LANCHOR5+1648
-	stp	x29, x30, [sp, -32]!
-	add	x29, sp, 0
-	ldr	x5, [x3,#:lo12:.LANCHOR5+1648]
-	mov	w3, -1
-	str	x19, [sp,16]
-	cbz	x5, .L4640
-	ldrh	w3, [x5,10]
-	mov	x4, 0
-.L4641:
-	cmp	w4, w3
-	mov	w6, w4
-	bcs	.L4645
-	add	x7, x5, x4, lsl 3
-	add	x4, x4, 1
-	ldrh	w7, [x7,16]
+	adrp	x3, .LANCHOR5+1112
+	ldr	x4, [x3, #:lo12:.LANCHOR5+1112]
+	cbz	x4, .L4513
+	ldrh	w6, [x4, 10]
+	add	x5, x4, 16
+	mov	w3, 0
+.L4510:
+	cmp	w3, w6
+	bcc	.L4512
+.L4513:
+	mov	w0, -1
+	ret
+.L4512:
+	ldrh	w7, [x5], 8
 	cmp	w7, w0
-	bne	.L4641
-	add	x6, x5, w6, uxtw 3
-	ldrh	w4, [x6,20]
+	bne	.L4511
+	stp	x29, x30, [sp, -32]!
+	add	x3, x4, w3, uxtw 3
 	mov	x0, x1
-	ldrh	w1, [x6,18]
-	cmp	w2, w4
-	csel	w19, w2, w4, ls
+	add	x29, sp, 0
+	str	x19, [sp, 16]
+	ldrh	w19, [x3, 20]
+	ldrh	w1, [x3, 18]
+	cmp	w19, w2
+	csel	w19, w19, w2, ls
 	add	x1, x1, 1024
-	add	x1, x5, x1
 	uxtw	x2, w19
+	add	x1, x4, x1
 	bl	memcpy
-	mov	w3, w19
-	b	.L4640
-.L4645:
-	mov	w3, -1
-.L4640:
-	mov	w0, w3
-	ldr	x19, [sp,16]
+	mov	w0, w19
+	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	ret
+.L4511:
+	add	w3, w3, 1
+	b	.L4510
 	.size	rk_ftl_vendor_read, .-rk_ftl_vendor_read
 	.align	2
 	.global	rk_ftl_vendor_write
 	.type	rk_ftl_vendor_write, %function
 rk_ftl_vendor_write:
 	stp	x29, x30, [sp, -112]!
-	mov	w6, w0
-	adrp	x0, .LANCHOR5+1648
+	adrp	x3, .LANCHOR5+1112
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	ldr	x19, [x0,#:lo12:.LANCHOR5+1648]
-	stp	x25, x26, [sp,64]
-	stp	x27, x28, [sp,80]
-	stp	x21, x22, [sp,32]
-	stp	x23, x24, [sp,48]
-	mov	w26, w2
+	stp	x19, x20, [sp, 16]
+	ldr	x19, [x3, #:lo12:.LANCHOR5+1112]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	cbz	x19, .L4533
+	add	w4, w2, 63
+	ldrh	w3, [x19, 10]
+	ldrh	w24, [x19, 8]
 	mov	x28, x1
-	mov	w2, -1
-	cbz	x19, .L4647
-	add	w20, w26, 63
-	ldrh	w3, [x19,10]
-	ldrh	w23, [x19,8]
-	and	w20, w20, -64
-	mov	x2, 0
-.L4648:
-	cmp	w2, w3
-	mov	w4, w2
-	bcs	.L4663
-	add	x0, x19, x2, lsl 3
-	add	x2, x2, 1
-	ldrh	w0, [x0,16]
-	cmp	w0, w6
-	bne	.L4648
-	add	x21, x19, w4, uxtw 3
-	ldrh	w24, [x21,20]
-	add	x5, x19, 1024
-	add	w24, w24, 63
-	and	w24, w24, -64
-	cmp	w26, w24
-	bls	.L4649
-	ldrh	w0, [x19,14]
-	mov	w2, -1
-	cmp	w0, w20
-	bcc	.L4647
-	ldrh	w21, [x21,18]
-	add	w22, w3, w2
-.L4650:
-	cmp	w4, w22
-	uxtw	x3, w4
-	bcs	.L4664
-	add	x3, x19, x3, lsl 3
-	add	w25, w4, 1
-	add	x1, x19, w25, uxtw 3
-	ldrh	w0, [x1,16]
-	str	x6, [x29,96]
-	strh	w0, [x3,16]
-	str	x5, [x29,104]
-	ldrh	w0, [x1,20]
-	strh	w0, [x3,20]
-	strh	w21, [x3,18]
-	add	x0, x5, w21, uxtw
-	ldrh	w27, [x1,20]
-	ldrh	w1, [x1,18]
-	add	w27, w27, 63
-	and	w27, w27, -64
-	add	x1, x5, x1
-	and	x2, x27, 131008
-	add	w21, w21, w27
-	bl	memcpy
-	mov	w4, w25
-	ldr	x6, [x29,96]
-	ldr	x5, [x29,104]
-	b	.L4650
-.L4664:
-	add	x3, x19, x3, lsl 3
-	uxth	w21, w21
-	mov	x1, x28
-	uxtw	x2, w26
-	add	x0, x5, w21, uxth
-	uxth	w20, w20
-	strh	w21, [x3,18]
-	add	w21, w21, w20
-	strh	w6, [x3,16]
-	strh	w26, [x3,20]
-	bl	memcpy
-	strh	w21, [x19,12]
-	ldrh	w0, [x19,14]
-	add	w24, w24, w0
-	sub	w24, w24, w20
-	strh	w24, [x19,14]
-	b	.L4662
-.L4649:
-	ldrh	w0, [x21,18]
-	mov	x1, x28
-	uxtw	x2, w26
-	add	x0, x5, x0
-	bl	memcpy
-	strh	w26, [x21,20]
-	b	.L4662
-.L4663:
-	ldrh	w4, [x19,14]
-	mov	w2, -1
-	cmp	w4, w20
-	bcc	.L4647
+	mov	w26, w2
+	and	w22, w4, -64
+	add	x1, x19, 16
+	mov	w20, 0
+.L4520:
+	cmp	w20, w3
+	bcc	.L4528
+	ldrh	w1, [x19, 14]
+	cmp	w22, w1
+	bhi	.L4533
 	add	x3, x19, w3, uxth 3
-	strh	w6, [x3,16]
-	uxth	w20, w20
-	mov	x1, x28
-	ldrh	w0, [x19,12]
+	strh	w0, [x3, 16]
+	and	w0, w22, 65535
+	ldrh	w2, [x19, 12]
+	strh	w2, [x3, 18]
+	strh	w26, [x3, 20]
+	add	w2, w2, w0
+	sub	w0, w1, w0
+	strh	w2, [x19, 12]
+	strh	w0, [x19, 14]
 	uxtw	x2, w26
-	strh	w0, [x3,18]
-	strh	w26, [x3,20]
-	add	w0, w20, w0
-	sub	w20, w4, w20
-	strh	w0, [x19,12]
-	strh	w20, [x19,14]
-	ldrh	w0, [x3,18]
+	mov	x1, x28
+	ldrh	w0, [x3, 18]
 	add	x0, x0, 1024
 	add	x0, x19, x0
 	bl	memcpy
-	ldrh	w0, [x19,10]
-	add	w0, w0, 1
-	strh	w0, [x19,10]
-.L4662:
-	ldr	w0, [x19,4]
-	add	x1, x19, 61440
-	mov	x2, x19
-	add	w0, w0, 1
-	str	w0, [x19,4]
-	str	w0, [x1,4092]
-	mov	w1, 128
-	ldrh	w0, [x19,8]
+	ldrh	w0, [x19, 10]
 	add	w0, w0, 1
-	uxth	w0, w0
+	strh	w0, [x19, 10]
+	b	.L4535
+.L4528:
+	ldrh	w6, [x1], 8
+	cmp	w6, w0
+	bne	.L4521
+	uxtw	x23, w20
+	add	x5, x19, 1024
+	add	x21, x19, x23, lsl 3
+	ldrh	w25, [x21, 20]
+	add	w25, w25, 63
+	and	w25, w25, -64
+	cmp	w26, w25
+	bls	.L4522
+	ldrh	w0, [x19, 14]
+	cmp	w22, w0
+	bhi	.L4533
+	add	x23, x23, 2
+	ldrh	w21, [x21, 18]
+	add	x23, x19, x23, lsl 3
+	sub	w3, w3, #1
+.L4523:
+	cmp	w20, w3
+	bcc	.L4524
+	add	x20, x19, w20, uxtw 3
+	and	w21, w21, 65535
+	add	x0, x5, w21, uxth
+	uxtw	x2, w26
+	mov	x1, x28
+	strh	w21, [x20, 18]
+	strh	w6, [x20, 16]
+	strh	w26, [x20, 20]
+	bl	memcpy
+	ldrh	w0, [x19, 14]
+	and	w4, w22, 65535
+	add	w21, w21, w4
+	strh	w21, [x19, 12]
+	sub	w0, w0, w4
+	add	w25, w0, w25
+	strh	w25, [x19, 14]
+.L4535:
+	ldr	w0, [x19, 4]
+	add	x1, x19, 61440
+	mov	x2, x19
+	add	w0, w0, 1
+	str	w0, [x19, 4]
+	str	w0, [x1, 4092]
+	mov	w1, 128
+	ldrh	w0, [x19, 8]
+	add	w0, w0, 1
+	and	w0, w0, 65535
 	cmp	w0, 1
 	csel	w0, w0, wzr, ls
-	strh	w0, [x19,8]
-	lsl	w0, w23, 7
+	strh	w0, [x19, 8]
+	lsl	w0, w24, 7
 	bl	FlashBootVendorWrite
-	mov	w2, 0
-.L4647:
-	mov	w0, w2
-	ldp	x19, x20, [sp,16]
-	ldp	x21, x22, [sp,32]
-	ldp	x23, x24, [sp,48]
-	ldp	x25, x26, [sp,64]
-	ldp	x27, x28, [sp,80]
+	mov	w0, 0
+.L4518:
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 112
 	ret
+.L4524:
+	add	w20, w20, 1
+	stp	w3, w6, [x29, 96]
+	add	x0, x19, w20, uxtw 3
+	str	x5, [x29, 104]
+	add	x23, x23, 8
+	ldrh	w1, [x0, 16]
+	strh	w1, [x23, -8]
+	ldrh	w1, [x0, 20]
+	strh	w1, [x23, -4]
+	strh	w21, [x23, -6]
+	ldrh	w27, [x0, 20]
+	ldrh	w1, [x0, 18]
+	add	x0, x5, w21, uxtw
+	add	w27, w27, 63
+	and	w27, w27, -64
+	add	x1, x5, x1
+	and	x2, x27, 131008
+	bl	memcpy
+	add	w21, w21, w27
+	ldr	x5, [x29, 104]
+	ldp	w3, w6, [x29, 96]
+	b	.L4523
+.L4522:
+	ldrh	w0, [x21, 18]
+	uxtw	x2, w26
+	mov	x1, x28
+	add	x0, x5, x0
+	bl	memcpy
+	strh	w26, [x21, 20]
+	b	.L4535
+.L4521:
+	add	w20, w20, 1
+	b	.L4520
+.L4533:
+	mov	w0, -1
+	b	.L4518
 	.size	rk_ftl_vendor_write, .-rk_ftl_vendor_write
 	.align	2
 	.global	rk_ftl_vendor_storage_ioctl
 	.type	rk_ftl_vendor_storage_ioctl, %function
 rk_ftl_vendor_storage_ioctl:
-	stp	x29, x30, [sp, -64]!
+	stp	x29, x30, [sp, -48]!
 	mov	w0, 4096
 	add	x29, sp, 0
-	stp	x19, x20, [sp,16]
-	str	x21, [sp,32]
-	mov	x20, -1
-	str	x1, [x29,56]
-	mov	x21, x2
+	stp	x19, x20, [sp, 16]
+	mov	x20, x2
+	str	x21, [sp, 32]
+	mov	w21, w1
 	bl	ftl_malloc
+	cbz	x0, .L4544
+	mov	w1, 30209
 	mov	x19, x0
-	cbz	x0, .L4666
-	mov	w2, 30209
-	ldr	x1, [x29,56]
-	movk	w2, 0x4004, lsl 16
-	cmp	w1, w2
-	beq	.L4668
-	mov	w2, 30210
-	movk	w2, 0x4004, lsl 16
-	cmp	w1, w2
-	beq	.L4669
-	b	.L4680
-.L4668:
-	mov	x1, x21
+	movk	w1, 0x4004, lsl 16
+	cmp	w21, w1
+	beq	.L4539
+	add	w1, w1, 1
+	cmp	w21, w1
+	beq	.L4540
+.L4550:
+	mov	x20, -14
+	b	.L4538
+.L4539:
 	mov	x2, 8
+	mov	x1, x20
 	bl	rk_copy_from_user
-	cbnz	x0, .L4680
+	cbnz	x0, .L4550
 	ldr	w1, [x19]
 	mov	w0, 17745
 	movk	w0, 0x5652, lsl 16
 	cmp	w1, w0
-	beq	.L4671
-.L4672:
+	beq	.L4542
+.L4543:
 	mov	x20, -1
-	b	.L4667
-.L4671:
-	ldrh	w0, [x19,4]
+.L4538:
+	mov	x0, x19
+	bl	kfree
+.L4536:
+	mov	x0, x20
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 48
+	ret
+.L4542:
+	ldrh	w2, [x19, 6]
 	add	x1, x19, 8
-	ldrh	w2, [x19,6]
+	ldrh	w0, [x19, 4]
 	bl	rk_ftl_vendor_read
 	cmn	w0, #1
-	beq	.L4672
-	uxth	x2, w0
-	strh	w0, [x19,6]
+	beq	.L4543
+	strh	w0, [x19, 6]
+	and	x0, x0, 65535
+	add	x2, x0, 8
 	mov	x1, x19
-	mov	x0, x21
-	add	x2, x2, 8
-	mov	x20, -14
+	mov	x0, x20
 	bl	rk_copy_to_user
-	cmp	x0, xzr
-	csel	x20, xzr, x20, eq
-	b	.L4667
-.L4669:
-	mov	x1, x21
+	cbnz	x0, .L4550
+	mov	x20, 0
+	b	.L4538
+.L4540:
 	mov	x2, 8
+	mov	x1, x20
 	bl	rk_copy_from_user
-	cbnz	x0, .L4680
+	cbnz	x0, .L4550
 	ldr	w1, [x19]
 	mov	w0, 17745
 	movk	w0, 0x5652, lsl 16
 	cmp	w1, w0
-	bne	.L4672
-	ldrh	w3, [x19,6]
-	cmp	w3, 4087
-	bhi	.L4672
-	add	w2, w3, 8
-	mov	x0, x19
-	mov	x1, x21
+	bne	.L4543
+	ldrh	w2, [x19, 6]
+	cmp	w2, 4087
+	bhi	.L4543
+	add	w2, w2, 8
+	mov	x1, x20
 	sxtw	x2, w2
+	mov	x0, x19
 	bl	rk_copy_from_user
-	cbnz	x0, .L4680
-	ldrh	w0, [x19,4]
+	cbnz	x0, .L4550
+	ldrh	w2, [x19, 6]
 	add	x1, x19, 8
-	ldrh	w2, [x19,6]
+	ldrh	w0, [x19, 4]
 	bl	rk_ftl_vendor_write
 	sxtw	x20, w0
-	b	.L4667
-.L4680:
-	mov	x20, -14
-.L4667:
-	mov	x0, x19
-	bl	kfree
-.L4666:
-	mov	x0, x20
-	ldr	x21, [sp,32]
-	ldp	x19, x20, [sp,16]
-	ldp	x29, x30, [sp], 64
-	ret
+	b	.L4538
+.L4544:
+	mov	x20, -1
+	b	.L4536
 	.size	rk_ftl_vendor_storage_ioctl, .-rk_ftl_vendor_storage_ioctl
 	.global	SecureBootUnlockTryCount
 	.global	SecureBootCheckOK
@@ -29779,6 +29496,8 @@ rk_ftl_vendor_storage_ioctl:
 	.global	gSnSectorData
 	.global	gpDrmKeyInfo
 	.global	gpBootConfig
+	.global	ftl_dma32_buffer_size
+	.global	ftl_dma32_buffer
 	.global	gLoaderBootInfo
 	.global	RK29_NANDC1_REG_BASE
 	.global	RK29_NANDC_REG_BASE
@@ -29948,3248 +29667,1018 @@ rk_ftl_vendor_storage_ioctl:
 	.global	g_flash_sys_spare_buffer
 	.global	g_flash_spare_buffer
 	.global	g_flash_page_buffer
-	.section	.rodata
+	.data
 	.align	3
-.LANCHOR1 = . + 0
-	.type	__func__.39624, %object
-	.size	__func__.39624, 18
-__func__.39624:
-	.string	"_list_remove_node"
-	.zero	6
-	.type	__func__.39649, %object
-	.size	__func__.39649, 23
-__func__.39649:
-	.string	"_list_update_data_list"
-	.zero	1
-	.type	toshiba_A19ref_value, %object
-	.size	toshiba_A19ref_value, 45
-toshiba_A19ref_value:
-	.byte	4
-	.byte	5
+	.set	.LANCHOR2,. + 0
+	.type	zftl_debug, %object
+	.size	zftl_debug, 4
+zftl_debug:
+	.word	17476
+	.zero	4
+	.type	g_nand_para_info, %object
+	.size	g_nand_para_info, 32
+g_nand_para_info:
 	.byte	6
-	.byte	7
-	.byte	13
+	.byte	-104
+	.byte	58
+	.byte	-104
+	.byte	-77
+	.byte	118
+	.byte	114
+	.byte	1
+	.byte	1
+	.byte	32
+	.hword	768
+	.byte	3
+	.byte	2
+	.hword	758
+	.hword	5593
+	.byte	0
+	.byte	37
+	.byte	60
+	.byte	32
+	.byte	2
+	.byte	1
+	.byte	4
+	.byte	0
+	.hword	256
+	.byte	1
+	.byte	-94
 	.byte	0
 	.byte	0
+	.type	sd15_tlc_rr, %object
+	.size	sd15_tlc_rr, 329
+sd15_tlc_rr:
 	.byte	0
 	.byte	0
 	.byte	0
-	.byte	4
-	.byte	4
-	.byte	124
-	.byte	126
 	.byte	0
 	.byte	0
-	.byte	124
-	.byte	120
-	.byte	120
 	.byte	0
-	.byte	124
-	.byte	118
-	.byte	116
-	.byte	114
 	.byte	0
+	.byte	-8
+	.byte	0
+	.byte	16
 	.byte	8
 	.byte	8
 	.byte	0
+	.byte	-8
+	.byte	-8
+	.byte	-8
+	.byte	-16
+	.byte	-8
+	.byte	-8
+	.byte	-8
+	.byte	-8
+	.byte	-24
 	.byte	0
 	.byte	0
-	.byte	11
-	.byte	126
-	.byte	118
-	.byte	116
-	.byte	0
-	.byte	16
-	.byte	118
-	.byte	114
-	.byte	112
 	.byte	0
-	.byte	2
+	.byte	-8
+	.byte	-16
+	.byte	-32
 	.byte	0
-	.byte	126
-	.byte	124
+	.byte	8
+	.byte	-8
+	.byte	8
+	.byte	8
 	.byte	0
-	.zero	3
-	.type	toshiba_15ref_value, %object
-	.size	toshiba_15ref_value, 95
-toshiba_15ref_value:
-	.byte	4
-	.byte	5
-	.byte	6
-	.byte	7
-	.byte	13
 	.byte	0
+	.byte	-16
+	.byte	-8
+	.byte	-8
+	.byte	-8
 	.byte	0
+	.byte	-16
+	.byte	-24
+	.byte	-16
+	.byte	8
+	.byte	8
+	.byte	-8
+	.byte	-16
+	.byte	-16
 	.byte	0
+	.byte	8
+	.byte	8
+	.byte	8
+	.byte	8
+	.byte	-8
+	.byte	-8
+	.byte	-24
 	.byte	0
+	.byte	-16
 	.byte	0
+	.byte	-8
+	.byte	-16
+	.byte	-8
+	.byte	-8
 	.byte	0
+	.byte	8
 	.byte	0
 	.byte	0
+	.byte	-8
 	.byte	0
+	.byte	-24
+	.byte	-8
 	.byte	0
-	.byte	2
-	.byte	4
-	.byte	2
 	.byte	0
+	.byte	-8
+	.byte	-24
+	.byte	-8
+	.byte	8
+	.byte	-8
 	.byte	0
+	.byte	-8
+	.byte	8
+	.byte	-16
+	.byte	-8
+	.byte	-8
+	.byte	-8
 	.byte	8
 	.byte	8
 	.byte	0
 	.byte	0
+	.byte	-8
+	.byte	-8
+	.byte	8
+	.byte	-8
+	.byte	-8
 	.byte	0
-	.byte	124
 	.byte	0
-	.byte	124
-	.byte	124
+	.byte	-8
+	.byte	-16
+	.byte	-16
+	.byte	-8
 	.byte	0
-	.byte	122
 	.byte	0
-	.byte	122
-	.byte	122
+	.byte	-8
 	.byte	0
-	.byte	11
-	.byte	126
-	.byte	118
-	.byte	116
+	.byte	-16
+	.byte	8
 	.byte	0
-	.byte	120
-	.byte	2
-	.byte	120
-	.byte	122
+	.byte	8
 	.byte	0
-	.byte	126
-	.byte	4
-	.byte	126
-	.byte	122
+	.byte	-16
+	.byte	-8
+	.byte	-16
+	.byte	16
 	.byte	0
 	.byte	16
-	.byte	118
-	.byte	114
-	.byte	112
 	.byte	0
-	.byte	118
-	.byte	4
-	.byte	118
-	.byte	120
+	.byte	-8
+	.byte	8
+	.byte	0
+	.byte	-24
+	.byte	0
+	.byte	-16
+	.byte	-8
+	.byte	-16
+	.byte	-16
+	.byte	-16
+	.byte	-16
+	.byte	0
+	.byte	8
+	.byte	-8
+	.byte	-24
+	.byte	0
+	.byte	8
+	.byte	8
+	.byte	16
+	.byte	16
+	.byte	0
+	.byte	8
+	.byte	-8
+	.byte	8
+	.byte	16
+	.byte	-8
+	.byte	24
+	.byte	0
+	.byte	8
+	.byte	-4
+	.byte	0
+	.byte	16
+	.byte	8
+	.byte	24
+	.byte	8
+	.byte	0
+	.byte	-4
+	.byte	-8
+	.byte	24
+	.byte	16
+	.byte	16
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	-16
+	.byte	0
 	.byte	0
 	.byte	4
+	.byte	0
+	.byte	-4
+	.byte	-4
+	.byte	-4
+	.byte	8
+	.byte	8
+	.byte	16
+	.byte	0
+	.byte	16
+	.byte	-4
+	.byte	16
+	.byte	0
+	.byte	16
+	.byte	8
+	.byte	0
+	.byte	16
+	.byte	-4
+	.byte	16
+	.byte	-8
+	.byte	0
+	.byte	0
+	.byte	-8
+	.byte	16
+	.byte	-4
+	.byte	16
+	.byte	-16
+	.byte	-8
+	.byte	-8
+	.byte	-8
+	.byte	8
+	.byte	-4
+	.byte	8
+	.byte	-24
 	.byte	4
-	.byte	4
-	.byte	118
+	.byte	-16
 	.byte	0
-	.byte	2
+	.byte	8
 	.byte	0
-	.byte	126
-	.byte	124
 	.byte	0
-	.byte	6
-	.byte	10
-	.byte	6
-	.byte	2
+	.byte	-24
+	.byte	8
+	.byte	-16
+	.byte	8
 	.byte	0
-	.byte	116
-	.byte	124
-	.byte	116
-	.byte	118
+	.byte	8
+	.byte	-24
+	.byte	-32
+	.byte	16
+	.byte	-24
+	.byte	8
+	.byte	-8
+	.byte	8
+	.byte	-24
+	.byte	-32
+	.byte	8
+	.byte	0
+	.byte	16
+	.byte	0
+	.byte	16
 	.byte	0
+	.byte	-32
 	.byte	4
+	.byte	0
+	.byte	-8
+	.byte	-16
+	.byte	-8
+	.byte	0
+	.byte	-32
 	.byte	4
-	.byte	124
-	.byte	126
 	.byte	0
+	.byte	8
+	.byte	-24
+	.byte	8
 	.byte	0
-	.byte	124
-	.byte	120
-	.byte	120
+	.byte	-32
+	.byte	4
 	.byte	0
-	.byte	124
-	.byte	118
-	.byte	116
-	.byte	114
 	.byte	0
-	.zero	1
-	.type	toshiba_ref_value, %object
-	.size	toshiba_ref_value, 8
-toshiba_ref_value:
+	.byte	-32
+	.byte	-4
 	.byte	0
+	.byte	-24
 	.byte	4
-	.byte	124
-	.byte	120
-	.byte	116
+	.byte	0
+	.byte	16
+	.byte	-24
+	.byte	16
+	.byte	0
+	.byte	-24
+	.byte	-4
+	.byte	0
+	.byte	8
+	.byte	-32
 	.byte	8
-	.byte	12
-	.byte	112
-	.type	__func__.20817, %object
-	.size	__func__.20817, 22
-__func__.20817:
-	.string	"nand_flash_print_info"
-	.zero	2
-	.type	__func__.20903, %object
-	.size	__func__.20903, 11
-__func__.20903:
-	.string	"nandc_init"
-	.zero	5
-	.type	__func__.20290, %object
-	.size	__func__.20290, 28
-__func__.20290:
-	.string	"flash_wait_device_ready_raw"
-	.zero	4
-	.type	__func__.20354, %object
-	.size	__func__.20354, 22
-__func__.20354:
-	.string	"flash_start_page_read"
-	.zero	2
-	.type	toshiba_3D_tlc_value, %object
-	.size	toshiba_3D_tlc_value, 399
-toshiba_3D_tlc_value:
-	.byte	-119
-	.byte	-119
-	.byte	-119
-	.byte	-119
-	.byte	-118
-	.byte	-118
-	.byte	-118
 	.byte	0
 	.byte	0
+	.byte	-4
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.byte	5
-	.byte	-2
-	.byte	-1
 	.byte	0
-	.byte	-3
-	.byte	-2
-	.byte	6
-	.byte	-9
-	.byte	-12
-	.byte	-9
-	.byte	-7
-	.byte	-13
-	.byte	-12
-	.byte	-7
-	.byte	-6
-	.byte	-15
-	.byte	-15
-	.byte	-2
-	.byte	-12
-	.byte	-16
-	.byte	-6
-	.byte	-2
-	.byte	-19
-	.byte	-19
-	.byte	-6
 	.byte	-4
-	.byte	-12
-	.byte	-14
-	.byte	-2
-	.byte	-11
-	.byte	-23
-	.byte	-34
+	.byte	0
+	.byte	0
+	.byte	0
 	.byte	-4
-	.byte	-20
-	.byte	-22
-	.byte	-2
-	.byte	-7
-	.byte	-31
-	.byte	-30
-	.byte	-12
-	.byte	-20
-	.byte	-18
-	.byte	2
-	.byte	-15
-	.byte	-19
-	.byte	-36
-	.byte	-12
-	.byte	-28
-	.byte	-34
-	.byte	-6
-	.byte	-15
-	.byte	-11
-	.byte	2
-	.byte	-12
-	.byte	-8
-	.byte	-2
-	.byte	2
-	.byte	-3
-	.byte	-7
-	.byte	-10
+	.byte	0
+	.byte	0
 	.byte	-4
+	.byte	0
 	.byte	-8
-	.byte	-6
-	.byte	-6
-	.byte	-11
-	.byte	-27
-	.byte	-38
-	.byte	-16
-	.byte	-12
-	.byte	-2
-	.byte	2
-	.byte	-7
-	.byte	-31
-	.byte	-22
+	.byte	0
+	.byte	-8
+	.byte	0
+	.byte	0
 	.byte	-4
+	.byte	0
 	.byte	-16
-	.byte	-22
-	.byte	-7
-	.byte	-31
-	.byte	-23
-	.byte	-22
-	.byte	-28
-	.byte	-28
-	.byte	-26
-	.byte	2
-	.byte	-7
-	.byte	-11
-	.byte	-14
+	.byte	0
+	.byte	-16
+	.byte	0
+	.byte	0
+	.byte	-16
+	.byte	0
+	.byte	-16
+	.byte	0
+	.byte	-16
+	.byte	0
+	.byte	0
 	.byte	-8
-	.byte	-12
-	.byte	-10
-	.byte	-10
-	.byte	-27
-	.byte	-25
-	.byte	-22
-	.byte	-20
-	.byte	-28
-	.byte	-22
-	.byte	-7
-	.byte	-23
-	.byte	-29
-	.byte	-34
+	.byte	0
+	.byte	-16
+	.byte	0
+	.byte	-16
+	.byte	0
+	.byte	0
+	.byte	-16
+	.byte	0
 	.byte	-24
-	.byte	-32
-	.byte	-22
-	.byte	-10
-	.byte	-11
-	.byte	-29
-	.byte	-18
-	.byte	-12
+	.byte	0
 	.byte	-24
-	.byte	-22
-	.byte	6
-	.byte	1
-	.byte	-3
-	.byte	-6
 	.byte	0
-	.byte	-4
-	.byte	-2
-	.byte	10
-	.byte	-3
-	.byte	-7
-	.byte	-6
-	.byte	4
-	.byte	-4
-	.byte	-2
-	.byte	-10
-	.byte	-23
-	.byte	-39
-	.byte	-22
-	.byte	-19
+	.byte	0
 	.byte	-24
-	.byte	-18
-	.byte	-14
-	.byte	-23
-	.byte	-29
-	.byte	-30
-	.byte	-15
-	.byte	-30
-	.byte	-30
-	.byte	-7
-	.byte	-27
-	.byte	-35
-	.byte	-26
-	.byte	-15
+	.byte	0
 	.byte	-24
-	.byte	-26
-	.byte	6
-	.byte	-11
-	.byte	5
-	.byte	-2
+	.byte	0
+	.byte	-24
+	.byte	0
+	.byte	0
+	.byte	-24
+	.byte	0
 	.byte	-16
+	.byte	0
 	.byte	-16
-	.byte	-2
-	.byte	-2
-	.byte	-15
-	.byte	-15
-	.byte	-20
+	.byte	0
+	.byte	0
+	.byte	-24
+	.byte	0
+	.byte	-32
+	.byte	0
+	.byte	-32
+	.byte	0
+	.zero	7
+	.type	sd15_slc_rr, %object
+	.size	sd15_slc_rr, 25
+sd15_slc_rr:
+	.byte	0
+	.byte	8
 	.byte	-8
+	.byte	16
 	.byte	-16
-	.byte	-18
-	.byte	6
-	.byte	5
-	.byte	-15
-	.byte	-2
+	.byte	24
 	.byte	-24
-	.byte	-28
-	.byte	-22
+	.byte	32
+	.byte	-32
+	.byte	32
+	.byte	-40
+	.byte	48
+	.byte	-48
+	.byte	56
+	.byte	-56
+	.byte	64
+	.byte	-64
+	.byte	72
+	.byte	-72
+	.byte	80
+	.byte	-80
+	.byte	88
+	.byte	96
+	.byte	104
+	.byte	112
+	.zero	7
+	.type	hy_f26_ref_value, %object
+	.size	hy_f26_ref_value, 28
+hy_f26_ref_value:
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	6
 	.byte	10
-	.byte	-15
-	.byte	-3
-	.byte	-30
-	.byte	-8
-	.byte	-24
-	.byte	-30
-	.byte	-10
-	.byte	-27
-	.byte	-19
-	.byte	-30
-	.byte	-12
-	.byte	-16
-	.byte	-10
-	.byte	14
-	.byte	-19
-	.byte	-3
-	.byte	-30
-	.byte	4
-	.byte	4
 	.byte	6
-	.byte	2
-	.byte	1
+	.byte	0
 	.byte	-3
-	.byte	-10
+	.byte	-7
 	.byte	-8
-	.byte	-4
+	.byte	0
 	.byte	-6
-	.byte	-2
+	.byte	-13
 	.byte	-15
+	.byte	0
 	.byte	-11
-	.byte	-26
-	.byte	-8
 	.byte	-20
+	.byte	-23
+	.byte	0
+	.byte	0
+	.byte	-26
 	.byte	-30
-	.byte	6
-	.byte	-19
-	.byte	-3
-	.byte	-46
 	.byte	0
 	.byte	0
-	.byte	2
+	.byte	-32
+	.byte	-37
+	.zero	4
+	.type	zftl_nand_flash_para_tbl, %object
+	.size	zftl_nand_flash_para_tbl, 1568
+zftl_nand_flash_para_tbl:
 	.byte	6
-	.byte	9
-	.byte	5
+	.byte	-104
+	.byte	58
+	.byte	-104
+	.byte	-77
+	.byte	118
+	.byte	114
+	.byte	1
+	.byte	1
+	.byte	32
+	.hword	768
+	.byte	3
 	.byte	2
+	.hword	758
+	.hword	5593
+	.byte	0
+	.byte	37
+	.byte	60
+	.byte	32
+	.byte	3
+	.byte	1
 	.byte	4
-	.byte	8
-	.byte	6
-	.byte	8
-	.byte	9
-	.byte	9
-	.byte	6
-	.byte	8
-	.byte	8
-	.byte	6
-	.byte	10
-	.byte	13
-	.byte	9
-	.byte	6
-	.byte	8
-	.byte	12
-	.byte	10
-	.byte	2
-	.byte	5
+	.byte	0
+	.hword	256
 	.byte	1
-	.byte	-2
+	.byte	-94
 	.byte	0
 	.byte	0
 	.byte	6
-	.byte	12
-	.byte	1
-	.byte	13
-	.byte	2
-	.byte	12
-	.byte	12
-	.byte	14
-	.byte	-12
-	.byte	-14
-	.byte	-20
-	.byte	-18
-	.byte	-16
-	.byte	-16
-	.byte	-14
-	.byte	-12
-	.byte	-10
-	.byte	-21
-	.byte	-14
-	.byte	-12
-	.byte	-12
-	.byte	-10
-	.byte	-12
-	.byte	-18
-	.byte	-22
-	.byte	-24
-	.byte	-18
-	.byte	-18
-	.byte	-18
-	.byte	-12
-	.byte	-14
-	.byte	-23
-	.byte	-20
-	.byte	-20
-	.byte	-20
-	.byte	-20
-	.byte	-12
-	.byte	-24
-	.byte	-24
-	.byte	-30
-	.byte	-24
-	.byte	-28
-	.byte	-28
-	.byte	-12
-	.byte	-26
-	.byte	-25
-	.byte	-34
-	.byte	-24
-	.byte	-24
-	.byte	-24
-	.byte	-12
-	.byte	-13
-	.byte	-26
-	.byte	-20
-	.byte	-14
-	.byte	-18
-	.byte	-18
-	.byte	-12
-	.byte	-15
-	.byte	-27
-	.byte	-22
-	.byte	-20
-	.byte	-24
-	.byte	-22
-	.byte	-12
-	.byte	-21
-	.byte	-28
-	.byte	-28
-	.byte	-24
-	.byte	-26
-	.byte	-24
-	.byte	20
-	.byte	16
-	.byte	6
-	.byte	10
-	.byte	16
-	.byte	12
-	.byte	12
-	.byte	16
-	.byte	16
-	.byte	8
-	.byte	8
-	.byte	12
-	.byte	12
-	.byte	12
-	.byte	18
-	.byte	18
-	.byte	10
-	.byte	8
-	.byte	14
-	.byte	14
-	.byte	14
-	.byte	16
-	.byte	14
-	.byte	6
-	.byte	6
-	.byte	12
-	.byte	14
-	.byte	8
-	.byte	20
-	.byte	18
-	.byte	8
-	.byte	6
-	.byte	14
-	.byte	14
-	.byte	10
-	.byte	20
-	.byte	20
-	.byte	6
-	.byte	10
-	.byte	10
-	.byte	12
-	.byte	12
-	.byte	10
-	.byte	13
-	.byte	5
+	.byte	-104
+	.byte	60
+	.byte	-104
+	.byte	-77
+	.byte	118
+	.byte	114
+	.byte	1
+	.byte	1
+	.byte	32
+	.hword	768
+	.byte	3
 	.byte	2
-	.byte	14
-	.byte	8
-	.byte	6
-	.byte	6
-	.byte	13
-	.byte	9
+	.hword	1478
+	.hword	5593
+	.byte	0
+	.byte	37
+	.byte	60
+	.byte	32
+	.byte	3
+	.byte	1
 	.byte	4
-	.byte	14
-	.byte	10
-	.byte	10
-	.byte	10
-	.byte	13
-	.byte	9
-	.byte	6
-	.byte	8
-	.byte	12
-	.byte	10
-	.byte	2
-	.byte	5
+	.byte	0
+	.hword	256
 	.byte	1
-	.byte	-2
+	.byte	-94
 	.byte	0
 	.byte	0
 	.byte	6
-	.byte	12
+	.byte	-104
+	.byte	58
+	.byte	-104
+	.byte	-93
+	.byte	118
+	.byte	81
 	.byte	1
-	.byte	13
+	.byte	1
+	.byte	32
+	.hword	384
+	.byte	3
 	.byte	2
-	.byte	12
-	.byte	12
-	.byte	14
-	.zero	1
-	.type	toshiba_3D_slc_value, %object
-	.size	toshiba_3D_slc_value, 11
-toshiba_3D_slc_value:
-	.byte	-117
-	.byte	0
-	.byte	-8
-	.byte	8
-	.byte	-16
-	.byte	-24
-	.byte	24
-	.byte	-40
-	.byte	40
-	.byte	-56
-	.byte	56
-	.zero	5
-	.type	ymtc_3D_tlc_value, %object
-	.size	ymtc_3D_tlc_value, 357
-ymtc_3D_tlc_value:
-	.byte	0
-	.byte	0
-	.byte	0
+	.hword	1446
+	.hword	1497
 	.byte	0
+	.byte	36
+	.byte	60
+	.byte	32
+	.byte	3
+	.byte	1
+	.byte	4
 	.byte	0
+	.hword	256
+	.byte	1
+	.byte	-94
 	.byte	0
 	.byte	0
-	.byte	-10
-	.byte	-10
-	.byte	-6
-	.byte	-6
-	.byte	-2
+	.byte	6
+	.byte	-104
+	.byte	-34
+	.byte	-108
+	.byte	-109
+	.byte	118
+	.byte	81
+	.byte	1
+	.byte	1
+	.byte	32
+	.hword	256
 	.byte	2
 	.byte	2
-	.byte	-6
-	.byte	-6
-	.byte	-4
-	.byte	-4
-	.byte	-4
-	.byte	-6
-	.byte	-8
-	.byte	6
-	.byte	0
-	.byte	0
-	.byte	0
+	.hword	1074
+	.hword	17881
+	.byte	2
+	.byte	35
+	.byte	40
+	.byte	32
+	.byte	3
+	.byte	1
+	.byte	4
 	.byte	0
+	.hword	256
+	.byte	1
+	.byte	-94
 	.byte	0
 	.byte	0
-	.byte	-2
-	.byte	-2
-	.byte	-2
-	.byte	-4
-	.byte	-4
-	.byte	-6
-	.byte	-6
-	.byte	-6
-	.byte	-6
-	.byte	-6
-	.byte	-6
-	.byte	-6
-	.byte	-6
-	.byte	-11
-	.byte	-2
-	.byte	2
-	.byte	4
-	.byte	4
-	.byte	6
 	.byte	6
-	.byte	6
-	.byte	-6
-	.byte	-6
-	.byte	-6
-	.byte	-6
-	.byte	-6
-	.byte	-8
-	.byte	-14
-	.byte	-6
-	.byte	-15
-	.byte	-11
-	.byte	2
-	.byte	-12
-	.byte	-8
-	.byte	-2
-	.byte	2
-	.byte	-3
-	.byte	-7
-	.byte	-10
-	.byte	-4
-	.byte	-8
-	.byte	-6
-	.byte	-18
-	.byte	-18
-	.byte	-14
-	.byte	-14
-	.byte	-10
-	.byte	-5
-	.byte	-5
-	.byte	-14
-	.byte	-14
-	.byte	-12
-	.byte	-12
-	.byte	-12
-	.byte	-13
-	.byte	-15
-	.byte	-2
-	.byte	-8
-	.byte	-8
-	.byte	-8
-	.byte	-8
-	.byte	-7
-	.byte	-7
-	.byte	-10
-	.byte	-10
-	.byte	-10
-	.byte	-12
-	.byte	-12
-	.byte	-13
-	.byte	-13
-	.byte	-14
-	.byte	-14
-	.byte	-14
-	.byte	-14
-	.byte	-14
-	.byte	-13
-	.byte	-18
-	.byte	-10
-	.byte	-6
-	.byte	-4
-	.byte	-4
-	.byte	-2
-	.byte	-1
-	.byte	-1
-	.byte	-14
-	.byte	-14
-	.byte	-14
-	.byte	-14
-	.byte	-14
-	.byte	-15
-	.byte	-21
-	.byte	-12
-	.byte	-11
-	.byte	-7
-	.byte	-7
-	.byte	-3
+	.byte	-104
+	.byte	-34
+	.byte	-124
+	.byte	-109
+	.byte	114
+	.byte	87
 	.byte	1
 	.byte	1
-	.byte	-8
-	.byte	-7
-	.byte	-5
-	.byte	-5
-	.byte	-5
-	.byte	-7
-	.byte	-9
-	.byte	4
-	.byte	-1
-	.byte	-1
-	.byte	-1
-	.byte	-1
-	.byte	-1
-	.byte	-1
-	.byte	-4
-	.byte	-3
-	.byte	-3
-	.byte	-5
-	.byte	-5
-	.byte	-7
-	.byte	-7
-	.byte	-8
-	.byte	-7
-	.byte	-7
-	.byte	-7
-	.byte	-7
-	.byte	-7
-	.byte	-12
-	.byte	-4
+	.byte	32
+	.hword	256
+	.byte	2
 	.byte	1
-	.byte	3
-	.byte	3
-	.byte	5
-	.byte	5
-	.byte	5
-	.byte	-8
-	.byte	-7
-	.byte	-7
-	.byte	-7
-	.byte	-7
-	.byte	-9
-	.byte	-15
+	.hword	2092
+	.hword	17857
 	.byte	2
-	.byte	-7
-	.byte	-11
-	.byte	-14
-	.byte	-8
-	.byte	-12
-	.byte	-10
-	.byte	6
+	.byte	33
+	.byte	40
+	.byte	32
+	.byte	3
+	.byte	1
 	.byte	1
-	.byte	-3
-	.byte	-6
 	.byte	0
-	.byte	-4
-	.byte	-2
-	.byte	10
-	.byte	-3
-	.byte	-7
-	.byte	-6
-	.byte	4
-	.byte	-4
-	.byte	-2
-	.byte	-10
-	.byte	-23
-	.byte	-39
-	.byte	-22
-	.byte	-19
-	.byte	-24
-	.byte	-18
-	.byte	-7
-	.byte	-27
-	.byte	-35
-	.byte	-26
-	.byte	-15
-	.byte	-24
-	.byte	-26
-	.byte	6
-	.byte	-11
-	.byte	5
-	.byte	-2
-	.byte	-16
-	.byte	-16
-	.byte	-2
-	.byte	-2
-	.byte	-15
-	.byte	-15
-	.byte	-20
-	.byte	-8
-	.byte	-16
-	.byte	-18
-	.byte	2
+	.hword	256
 	.byte	1
-	.byte	-3
-	.byte	-10
-	.byte	-8
-	.byte	-4
-	.byte	-6
-	.byte	-2
-	.byte	-15
-	.byte	-11
-	.byte	-26
-	.byte	-8
-	.byte	-20
-	.byte	-30
-	.byte	6
-	.byte	-19
-	.byte	-3
-	.byte	-46
+	.byte	-94
 	.byte	0
 	.byte	0
-	.byte	2
 	.byte	6
-	.byte	9
-	.byte	5
+	.byte	-104
+	.byte	58
+	.byte	-108
+	.byte	-109
+	.byte	118
+	.byte	81
+	.byte	1
+	.byte	1
+	.byte	32
+	.hword	256
 	.byte	2
-	.byte	4
-	.byte	8
-	.byte	6
-	.byte	8
-	.byte	9
-	.byte	9
-	.byte	6
-	.byte	8
-	.byte	8
-	.byte	6
-	.byte	10
-	.byte	13
-	.byte	9
-	.byte	6
-	.byte	8
-	.byte	12
-	.byte	10
 	.byte	2
-	.byte	5
+	.hword	2106
+	.hword	17881
+	.byte	2
+	.byte	35
+	.byte	40
+	.byte	32
+	.byte	3
 	.byte	1
-	.byte	-2
+	.byte	4
+	.byte	0
+	.hword	256
+	.byte	1
+	.byte	-94
 	.byte	0
 	.byte	0
 	.byte	6
-	.byte	12
+	.byte	-104
+	.byte	-41
+	.byte	-124
+	.byte	-109
+	.byte	114
+	.byte	81
 	.byte	1
-	.byte	13
-	.byte	2
-	.byte	12
-	.byte	12
-	.byte	14
-	.byte	-12
-	.byte	-14
-	.byte	-20
-	.byte	-18
-	.byte	-16
-	.byte	-16
-	.byte	-14
-	.byte	-12
-	.byte	-10
-	.byte	-21
-	.byte	-14
-	.byte	-12
-	.byte	-12
-	.byte	-10
-	.byte	-12
-	.byte	-18
-	.byte	-22
-	.byte	-24
-	.byte	-18
-	.byte	-18
-	.byte	-18
-	.byte	-12
-	.byte	-14
-	.byte	-23
-	.byte	-20
-	.byte	-20
-	.byte	-20
-	.byte	-20
-	.byte	16
-	.byte	16
-	.byte	8
-	.byte	8
-	.byte	12
-	.byte	12
-	.byte	12
-	.byte	18
-	.byte	18
-	.byte	10
-	.byte	8
-	.byte	14
-	.byte	14
-	.byte	14
-	.byte	16
-	.byte	14
-	.byte	6
+	.byte	1
+	.byte	32
+	.hword	256
+	.byte	2
+	.byte	1
+	.hword	1056
+	.hword	17857
+	.byte	2
+	.byte	35
+	.byte	40
+	.byte	32
+	.byte	3
+	.byte	1
+	.byte	4
+	.byte	0
+	.hword	256
+	.byte	1
+	.byte	-94
+	.byte	0
+	.byte	0
 	.byte	6
-	.byte	12
-	.byte	14
-	.byte	8
-	.byte	10
-	.byte	13
-	.byte	5
+	.byte	-104
+	.byte	-41
+	.byte	-124
+	.byte	-109
+	.byte	114
+	.byte	80
+	.byte	1
+	.byte	1
+	.byte	32
+	.hword	256
 	.byte	2
-	.byte	14
-	.byte	8
+	.byte	1
+	.hword	1060
+	.hword	17857
+	.byte	2
+	.byte	34
+	.byte	40
+	.byte	32
+	.byte	3
+	.byte	1
+	.byte	4
+	.byte	0
+	.hword	256
+	.byte	1
+	.byte	-94
+	.byte	0
+	.byte	0
 	.byte	6
+	.byte	-104
+	.byte	-34
+	.byte	-108
+	.byte	-109
+	.byte	118
+	.byte	80
+	.byte	1
+	.byte	1
+	.byte	32
+	.hword	256
+	.byte	2
+	.byte	2
+	.hword	1066
+	.hword	17881
+	.byte	2
+	.byte	34
+	.byte	40
+	.byte	32
+	.byte	3
+	.byte	1
+	.byte	1
+	.byte	0
+	.hword	256
+	.byte	1
+	.byte	-94
+	.byte	0
+	.byte	0
 	.byte	6
-	.byte	13
-	.byte	9
-	.byte	4
-	.byte	14
-	.byte	10
-	.byte	10
-	.byte	10
-	.byte	13
-	.byte	9
+	.byte	-104
+	.byte	-41
+	.byte	-124
+	.byte	-109
+	.byte	114
+	.byte	87
+	.byte	1
+	.byte	1
+	.byte	32
+	.hword	256
+	.byte	2
+	.byte	1
+	.hword	1060
+	.hword	17857
+	.byte	2
+	.byte	33
+	.byte	40
+	.byte	32
+	.byte	3
+	.byte	1
+	.byte	1
+	.byte	0
+	.hword	256
+	.byte	1
+	.byte	-94
+	.byte	0
+	.byte	0
 	.byte	6
-	.byte	8
-	.byte	12
-	.byte	10
+	.byte	-104
+	.byte	-34
+	.byte	-108
+	.byte	-109
+	.byte	118
+	.byte	87
+	.byte	1
+	.byte	1
+	.byte	32
+	.hword	256
 	.byte	2
-	.byte	5
+	.byte	2
+	.hword	1058
+	.hword	17881
+	.byte	2
+	.byte	33
+	.byte	40
+	.byte	32
+	.byte	3
 	.byte	1
-	.byte	-2
+	.byte	1
+	.byte	0
+	.hword	256
+	.byte	1
+	.byte	-94
 	.byte	0
 	.byte	0
 	.byte	6
-	.byte	12
+	.byte	-104
+	.byte	-34
+	.byte	-108
+	.byte	-109
+	.byte	118
+	.byte	-47
 	.byte	1
-	.byte	13
+	.byte	1
+	.byte	32
+	.hword	256
 	.byte	2
-	.byte	12
-	.byte	12
-	.byte	14
-	.zero	3
-	.type	ymtc_3D_slc_value, %object
-	.size	ymtc_3D_slc_value, 10
-ymtc_3D_slc_value:
+	.byte	2
+	.hword	1074
+	.hword	17881
+	.byte	2
+	.byte	35
+	.byte	40
+	.byte	32
+	.byte	3
+	.byte	1
+	.byte	4
 	.byte	0
-	.byte	-8
+	.hword	256
+	.byte	1
+	.byte	-94
+	.byte	0
+	.byte	0
+	.byte	6
+	.byte	69
+	.byte	58
+	.byte	-108
+	.byte	-109
+	.byte	118
+	.byte	81
 	.byte	8
-	.byte	-16
-	.byte	-20
-	.byte	24
-	.byte	-26
+	.byte	1
+	.byte	32
+	.hword	256
+	.byte	2
+	.byte	2
+	.hword	2106
+	.hword	17881
+	.byte	2
+	.byte	68
 	.byte	40
-	.byte	-12
-	.byte	56
-	.zero	6
-	.type	__func__.20379, %object
-	.size	__func__.20379, 23
-__func__.20379:
-	.string	"flash_start_plane_read"
-	.zero	1
-	.type	__func__.20265, %object
-	.size	__func__.20265, 26
-__func__.20265:
-	.string	"flash_erase_duplane_block"
-	.zero	6
-	.type	__func__.20276, %object
-	.size	__func__.20276, 21
-__func__.20276:
-	.string	"flash_erase_block_en"
-	.zero	3
-	.type	random_seed, %object
-	.size	random_seed, 256
-random_seed:
-	.hword	22378
-	.hword	1512
-	.hword	25245
-	.hword	17827
-	.hword	25756
-	.hword	19440
-	.hword	9026
-	.hword	10030
-	.hword	29528
-	.hword	20467
-	.hword	29676
-	.hword	24432
-	.hword	31328
-	.hword	6872
-	.hword	13426
-	.hword	13842
-	.hword	8783
-	.hword	1108
-	.hword	782
-	.hword	28837
-	.hword	30729
-	.hword	9505
-	.hword	18676
-	.hword	23085
-	.hword	18730
-	.hword	1085
-	.hword	32609
-	.hword	14697
-	.hword	20858
-	.hword	15170
-	.hword	30365
-	.hword	1607
-	.hword	32298
-	.hword	4995
-	.hword	18905
-	.hword	1976
-	.hword	9592
-	.hword	20204
-	.hword	17443
-	.hword	13615
-	.hword	23330
-	.hword	29369
-	.hword	13947
-	.hword	9398
-	.hword	32398
-	.hword	8984
-	.hword	27600
-	.hword	21785
-	.hword	6019
-	.hword	6311
-	.hword	31598
-	.hword	30210
-	.hword	19327
-	.hword	13896
-	.hword	11347
-	.hword	27545
-	.hword	3107
-	.hword	26575
-	.hword	32270
-	.hword	19852
-	.hword	20601
-	.hword	8349
-	.hword	9290
-	.hword	29819
-	.hword	13579
-	.hword	3661
-	.hword	28676
-	.hword	27331
-	.hword	32574
-	.hword	8693
-	.hword	31253
-	.hword	9081
-	.hword	5399
-	.hword	6842
-	.hword	20087
-	.hword	5537
-	.hword	1274
-	.hword	11617
-	.hword	9530
-	.hword	4866
-	.hword	8035
-	.hword	23219
-	.hword	1178
-	.hword	23272
-	.hword	7383
-	.hword	18944
-	.hword	12488
-	.hword	12871
-	.hword	29340
-	.hword	20532
-	.hword	11022
-	.hword	22514
-	.hword	228
-	.hword	22363
-	.hword	24978
-	.hword	14584
-	.hword	12138
-	.hword	3092
-	.hword	17916
-	.hword	16863
-	.hword	14554
-	.hword	31457
-	.hword	29474
-	.hword	25311
-	.hword	24121
-	.hword	3684
-	.hword	28037
-	.hword	22865
-	.hword	22839
-	.hword	25217
-	.hword	13217
-	.hword	27186
-	.hword	14938
-	.hword	11180
-	.hword	29754
-	.hword	24180
-	.hword	15150
-	.hword	32455
-	.hword	20434
-	.hword	23848
-	.hword	29983
-	.hword	16120
-	.hword	14769
-	.hword	20041
-	.hword	29803
-	.hword	28406
-	.hword	17598
-	.hword	28087
-	.type	__func__.21082, %object
-	.size	__func__.21082, 13
-__func__.21082:
-	.string	"buf_add_tail"
-	.zero	3
-	.type	__func__.21095, %object
-	.size	__func__.21095, 10
-__func__.21095:
-	.string	"buf_alloc"
-	.zero	6
-	.type	__func__.21109, %object
-	.size	__func__.21109, 16
-__func__.21109:
-	.string	"buf_remove_free"
-	.type	zftl_debug_proc_fops, %object
-	.size	zftl_debug_proc_fops, 288
-zftl_debug_proc_fops:
-	.xword	0
-	.xword	seq_lseek
-	.xword	seq_read
-	.xword	zftl_debug_proc_write
-	.zero	72
-	.xword	zftl_debug_proc_open
-	.zero	8
-	.xword	single_release
-	.zero	160
-	.type	__func__.39157, %object
-	.size	__func__.39157, 12
-__func__.39157:
-	.string	"gc_add_sblk"
-	.zero	4
-	.type	__func__.39249, %object
-	.size	__func__.39249, 19
-__func__.39249:
-	.string	"gc_write_completed"
-	.zero	5
-	.type	__func__.39855, %object
-	.size	__func__.39855, 18
-__func__.39855:
-	.string	"ftl_alloc_sys_blk"
-	.zero	6
-	.type	__func__.39865, %object
-	.size	__func__.39865, 17
-__func__.39865:
-	.string	"ftl_free_sys_blk"
-	.zero	7
-	.type	__func__.39986, %object
-	.size	__func__.39986, 23
-__func__.39986:
-	.string	"ftl_get_ppa_from_index"
-	.zero	1
-	.type	__func__.40026, %object
-	.size	__func__.40026, 22
-__func__.40026:
-	.string	"ftl_get_new_free_page"
-	.zero	2
-	.type	__func__.40037, %object
-	.size	__func__.40037, 22
-__func__.40037:
-	.string	"ftl_ext_alloc_new_blk"
-	.zero	2
-	.type	__func__.39306, %object
-	.size	__func__.39306, 16
-__func__.39306:
-	.string	"gc_free_src_blk"
-	.type	__func__.38900, %object
-	.size	__func__.38900, 14
-__func__.38900:
-	.string	"ftl_write_buf"
-	.zero	2
-	.type	__func__.38945, %object
-	.size	__func__.38945, 18
-__func__.38945:
-	.string	"zftl_add_read_buf"
-	.align	3
-.LANCHOR4 = . + 0
-	.type	__func__.40459, %object
-	.size	__func__.40459, 21
-__func__.40459:
-	.string	"pm_select_ram_region"
-	.zero	3
-	.type	__func__.20807, %object
-	.size	__func__.20807, 20
-__func__.20807:
-	.string	"flash_die_info_init"
-	.zero	4
-	.type	__func__.38832, %object
-	.size	__func__.38832, 17
-__func__.38832:
-	.string	"lpa_rebuild_hash"
-	.zero	7
-	.type	__func__.39724, %object
-	.size	__func__.39724, 20
-__func__.39724:
-	.string	"zftl_sblk_list_init"
-	.zero	4
-	.type	__func__.40391, %object
-	.size	__func__.40391, 13
-__func__.40391:
-	.string	"pm_free_sblk"
-	.zero	3
-	.type	__func__.21145, %object
-	.size	__func__.21145, 21
-__func__.21145:
-	.string	"flash_info_data_init"
-	.zero	3
-	.type	samsung_14nm_slc_rr, %object
-	.size	samsung_14nm_slc_rr, 26
-samsung_14nm_slc_rr:
+	.byte	32
+	.byte	3
+	.byte	1
+	.byte	4
 	.byte	0
-	.byte	10
-	.byte	-10
-	.byte	20
-	.byte	-20
-	.byte	30
-	.byte	-30
-	.byte	40
-	.byte	-40
-	.byte	50
-	.byte	-50
-	.byte	60
-	.byte	-60
-	.byte	-70
-	.byte	-80
-	.byte	-90
-	.byte	-100
-	.byte	-110
-	.byte	-120
-	.byte	-9
-	.byte	70
-	.byte	80
-	.byte	90
-	.byte	-125
-	.byte	-115
-	.byte	100
-	.zero	6
-	.type	samsung_14nm_mlc_rr, %object
-	.size	samsung_14nm_mlc_rr, 104
-samsung_14nm_mlc_rr:
+	.hword	256
+	.byte	1
+	.byte	-94
 	.byte	0
 	.byte	0
+	.byte	6
+	.byte	69
+	.byte	-34
+	.byte	-108
+	.byte	-109
+	.byte	118
+	.byte	81
+	.byte	8
+	.byte	1
+	.byte	32
+	.hword	256
+	.byte	2
+	.byte	2
+	.hword	1074
+	.hword	17881
+	.byte	2
+	.byte	68
+	.byte	40
+	.byte	32
+	.byte	3
+	.byte	1
+	.byte	4
 	.byte	0
+	.hword	256
+	.byte	1
+	.byte	-94
 	.byte	0
-	.byte	-4
-	.byte	3
-	.byte	-4
-	.byte	-6
-	.byte	6
 	.byte	0
 	.byte	6
-	.byte	-10
-	.byte	-10
-	.byte	4
-	.byte	-10
-	.byte	16
-	.byte	12
-	.byte	-4
-	.byte	12
-	.byte	8
-	.byte	-16
-	.byte	10
-	.byte	-16
-	.byte	24
-	.byte	18
-	.byte	-14
-	.byte	18
-	.byte	-4
-	.byte	-22
-	.byte	-16
-	.byte	-22
-	.byte	-8
-	.byte	24
-	.byte	-9
-	.byte	24
-	.byte	8
-	.byte	-28
-	.byte	-4
-	.byte	-28
-	.byte	16
-	.byte	30
-	.byte	10
-	.byte	30
-	.byte	10
+	.byte	69
 	.byte	-34
+	.byte	-108
+	.byte	-109
+	.byte	118
+	.byte	87
+	.byte	8
+	.byte	1
+	.byte	32
+	.hword	256
+	.byte	2
+	.byte	2
+	.hword	1058
+	.hword	17881
+	.byte	2
+	.byte	66
+	.byte	40
+	.byte	32
+	.byte	3
+	.byte	1
+	.byte	4
+	.byte	0
+	.hword	256
+	.byte	1
+	.byte	-94
+	.byte	0
+	.byte	0
 	.byte	6
+	.byte	69
 	.byte	-34
-	.byte	0
-	.byte	36
-	.byte	-8
-	.byte	36
-	.byte	-8
-	.byte	-40
-	.byte	-2
-	.byte	-40
-	.byte	-20
-	.byte	-46
-	.byte	-4
-	.byte	-46
-	.byte	-30
+	.byte	-108
+	.byte	-109
+	.byte	118
+	.byte	80
+	.byte	8
+	.byte	1
+	.byte	32
+	.hword	256
+	.byte	2
+	.byte	2
+	.hword	1066
+	.hword	17881
+	.byte	2
+	.byte	67
+	.byte	40
+	.byte	32
 	.byte	3
+	.byte	1
+	.byte	1
+	.byte	0
+	.hword	256
+	.byte	1
+	.byte	-94
+	.byte	0
+	.byte	0
+	.byte	6
+	.byte	69
+	.byte	-41
+	.byte	-124
+	.byte	-109
+	.byte	114
+	.byte	87
+	.byte	8
+	.byte	1
+	.byte	32
+	.hword	256
+	.byte	2
+	.byte	1
+	.hword	1060
+	.hword	17857
+	.byte	2
+	.byte	66
+	.byte	40
+	.byte	32
+	.byte	2
+	.byte	1
+	.byte	1
+	.byte	0
+	.hword	256
+	.byte	1
+	.byte	-94
+	.byte	0
+	.byte	0
+	.byte	5
+	.byte	44
+	.byte	100
+	.byte	68
+	.byte	50
+	.byte	-91
 	.byte	0
-	.byte	3
-	.byte	-3
-	.byte	-2
-	.byte	-4
-	.byte	-2
-	.byte	-6
-	.byte	-4
-	.byte	-4
-	.byte	-4
-	.byte	-10
-	.byte	-6
-	.byte	-8
-	.byte	-6
-	.byte	-14
-	.byte	-9
-	.byte	-8
-	.byte	-9
-	.byte	-18
-	.byte	-52
-	.byte	22
-	.byte	-52
-	.byte	10
-	.byte	42
 	.byte	4
-	.byte	42
+	.byte	1
+	.byte	32
+	.hword	512
+	.byte	2
+	.byte	1
+	.hword	1048
+	.hword	9671
+	.byte	5
+	.byte	19
+	.byte	70
+	.byte	32
+	.byte	1
+	.byte	0
 	.byte	4
-	.byte	48
-	.byte	-9
-	.byte	48
+	.byte	0
+	.hword	512
+	.byte	1
+	.byte	-38
+	.byte	-33
+	.byte	0
+	.byte	5
+	.byte	44
+	.byte	100
+	.byte	100
+	.byte	86
+	.byte	-91
+	.byte	0
 	.byte	4
-	.byte	-58
-	.byte	12
-	.byte	-58
+	.byte	1
+	.byte	24
+	.hword	512
+	.byte	2
+	.byte	2
+	.hword	700
+	.hword	479
+	.byte	4
+	.byte	18
+	.byte	60
+	.byte	32
+	.byte	1
 	.byte	0
-	.byte	-64
-	.byte	-24
-	.byte	-64
-	.byte	-6
-	.byte	9
-	.byte	18
-	.byte	9
-	.byte	8
-	.type	__func__.20188, %object
-	.size	__func__.20188, 19
-__func__.20188:
-	.string	"flash_read_page_en"
-	.zero	5
-	.type	__func__.20314, %object
-	.size	__func__.20314, 26
-__func__.20314:
-	.string	"flash_start_tlc_page_prog"
-	.zero	6
-	.type	__func__.20325, %object
-	.size	__func__.20325, 29
-__func__.20325:
-	.string	"flash_start_3d_mlc_page_prog"
-	.zero	3
-	.type	__func__.20343, %object
-	.size	__func__.20343, 22
-__func__.20343:
-	.string	"flash_start_page_prog"
-	.zero	2
-	.type	__func__.20367, %object
-	.size	__func__.20367, 31
-__func__.20367:
-	.string	"flash_complete_plane_page_read"
-	.zero	1
-	.type	__func__.20392, %object
-	.size	__func__.20392, 25
-__func__.20392:
-	.string	"flash_complete_page_read"
-	.zero	7
-	.type	__func__.40224, %object
-	.size	__func__.40224, 31
-__func__.40224:
-	.string	"queue_wait_first_req_completed"
-	.zero	1
-	.type	__func__.40278, %object
-	.size	__func__.40278, 15
-__func__.40278:
-	.string	"sblk_prog_page"
-	.zero	1
-	.type	__func__.40305, %object
-	.size	__func__.40305, 15
-__func__.40305:
-	.string	"sblk_read_page"
-	.zero	1
-	.type	__func__.39204, %object
-	.size	__func__.39204, 21
-__func__.39204:
-	.string	"gc_check_data_one_wl"
-	.zero	3
-	.type	__func__.20249, %object
-	.size	__func__.20249, 19
-__func__.20249:
-	.string	"flash_prog_page_en"
-	.zero	5
-	.type	__func__.40101, %object
-	.size	__func__.40101, 14
-__func__.40101:
-	.string	"ftl_prog_page"
-	.zero	2
-	.type	__func__.39758, %object
-	.size	__func__.39758, 15
-__func__.39758:
-	.string	"ftl_info_flush"
-	.zero	1
-	.type	__func__.40063, %object
-	.size	__func__.40063, 19
-__func__.40063:
-	.string	"ftl_ext_info_flush"
-	.zero	5
-	.type	__func__.40075, %object
-	.size	__func__.40075, 18
-__func__.40075:
-	.string	"ftl_ext_info_init"
-	.zero	6
-	.type	__func__.39813, %object
-	.size	__func__.39813, 15
-__func__.39813:
-	.string	"ftl_alloc_sblk"
-	.zero	1
-	.type	__func__.40431, %object
-	.size	__func__.40431, 17
-__func__.40431:
-	.string	"pm_alloc_new_blk"
-	.zero	7
-	.type	__func__.40441, %object
-	.size	__func__.40441, 14
-__func__.40441:
-	.string	"pm_write_page"
-	.zero	2
-	.type	__func__.21167, %object
-	.size	__func__.21167, 17
-__func__.21167:
-	.string	"flash_info_flush"
-	.zero	7
-	.type	__func__.21130, %object
-	.size	__func__.21130, 20
-__func__.21130:
-	.string	"flash_info_blk_init"
-	.zero	4
-	.type	__func__.20862, %object
-	.size	__func__.20862, 16
-__func__.20862:
-	.string	"nand_flash_init"
-	.type	__func__.39928, %object
-	.size	__func__.39928, 16
-__func__.39928:
-	.string	"ftl_sysblk_dump"
-	.type	__func__.39953, %object
-	.size	__func__.39953, 23
-__func__.39953:
-	.string	"ftl_open_sblk_recovery"
-	.zero	1
-	.type	__func__.40375, %object
-	.size	__func__.40375, 16
-__func__.40375:
-	.string	"load_l2p_region"
-	.type	__func__.40415, %object
-	.size	__func__.40415, 6
-__func__.40415:
-	.string	"pm_gc"
-	.zero	2
-	.type	__func__.39147, %object
-	.size	__func__.39147, 12
-__func__.39147:
-	.string	"gc_recovery"
-	.zero	4
-	.type	__func__.39236, %object
-	.size	__func__.39236, 22
-__func__.39236:
-	.string	"gc_update_l2p_map_new"
-	.zero	2
-	.type	__func__.39350, %object
-	.size	__func__.39350, 16
-__func__.39350:
-	.string	"gc_scan_src_blk"
-	.type	__func__.39411, %object
-	.size	__func__.39411, 20
-__func__.39411:
-	.string	"gc_scan_static_data"
-	.zero	4
-	.type	__func__.39474, %object
-	.size	__func__.39474, 18
-__func__.39474:
-	.string	"gc_block_vpn_scan"
-	.zero	6
-	.type	__func__.39904, %object
-	.size	__func__.39904, 14
-__func__.39904:
-	.string	"ftl_sblk_dump"
-	.zero	2
-	.type	__func__.38978, %object
-	.size	__func__.38978, 10
-__func__.38978:
-	.string	"zftl_read"
-	.zero	6
-	.type	__func__.40007, %object
-	.size	__func__.40007, 19
-__func__.40007:
-	.string	"ftl_update_l2p_map"
-	.zero	5
-	.type	__func__.38882, %object
-	.size	__func__.38882, 17
-__func__.38882:
-	.string	"ftl_write_commit"
-	.zero	7
-	.type	__func__.39279, %object
-	.size	__func__.39279, 16
-__func__.39279:
-	.string	"gc_do_copy_back"
-	.type	__func__.39529, %object
-	.size	__func__.39529, 11
-__func__.39529:
-	.string	"zftl_do_gc"
-	.zero	5
-	.type	__func__.39010, %object
-	.size	__func__.39010, 13
-__func__.39010:
-	.string	"_ftl_discard"
-	.section	.rodata.str1.1,"aMS",%progbits,1
-.LC0:
-	.string	"\n!!!!! error @ func:%s - line:%d\n"
-.LC1:
-	.string	"%s\n"
-.LC2:
-	.string	"FTL version: 6.0.24 20210107"
-.LC3:
-	.string	"zftl_debug:0x%x\n"
-.LC4:
-	.string	"...%s enter...\n"
-.LC5:
-	.string	"No.0 FLASH ID: %x %x %x %x %x %x\n"
-.LC6:
-	.string	"DiePerChip: %x\n"
-.LC7:
-	.string	"SectPerPage: %x\n"
-.LC8:
-	.string	"PagePerBlk: %x\n"
-.LC9:
-	.string	"Cell: %x\n"
-.LC10:
-	.string	"PlanePerDie: %x\n"
-.LC11:
-	.string	"BlkPerPlane: %x\n"
-.LC12:
-	.string	"die gap: %x\n"
-.LC13:
-	.string	"lsbMode: %x\n"
-.LC14:
-	.string	"ReadRetryMode: %x\n"
-.LC15:
-	.string	"ecc: %x\n"
-.LC16:
-	.string	"idb ecc: %x\n"
-.LC17:
-	.string	"OptMode: %x\n"
-.LC18:
-	.string	"g_nand_max_die: %x\n"
-.LC19:
-	.string	"Cache read enable: %x\n"
-.LC20:
-	.string	"Cache random read enable: %x\n"
-.LC21:
-	.string	"Cache prog enable: %x\n"
-.LC22:
-	.string	"multi read enable: %x\n"
-.LC23:
-	.string	"multi prog enable: %x\n"
-.LC24:
-	.string	"interleave enable: %x\n"
-.LC25:
-	.string	"read retry enable: %x\n"
-.LC26:
-	.string	"randomizer enable: %x\n"
-.LC27:
-	.string	"SDR enable: %x\n"
-.LC28:
-	.string	"ONFI enable: %x\n"
-.LC29:
-	.string	"TOGGLE enable: %x\n"
-.LC30:
-	.string	"g_flash_slc_mode: %x %x\n"
-.LC31:
-	.string	"MultiPlaneProgCmd: %x %x\n"
-.LC32:
-	.string	"MultiPlaneReadCmd: %x %x\n"
-.LC33:
-	.string	"g_flash_toggle_mode_en: %x\n"
-.LC34:
-	.string	"...%s enter... %p\n"
-.LC35:
-	.string	"0:%x %x %x %x %x\n"
-.LC36:
-	.string	"g_nandc_ver...%d\n"
-.LC37:
-	.string	"nand sdr mode %x\n"
-.LC38:
-	.string	"nand ddr mode %x\n"
-.LC39:
-	.string	"No.%d FLASH ID:%x %x %x %x %x %x\n"
-.LC40:
-	.string	"otp:%x %x %x %x\n"
-.LC41:
-	.string	"bad block test:%x %x\n"
-.LC42:
-	.string	"flash_erase_duplane_block %x %x %x\n"
-.LC43:
-	.string	"flash_erase_duplane_block pageadd = %x status = %x\n"
-.LC44:
-	.string	"flash_erase_block %x %x %x\n"
-.LC45:
-	.string	"flash_erase_block %d block = %x status = %x\n"
-.LC46:
-	.string	"erase done: %x\n"
-.LC47:
-	.string	"sblk_queue_head = %d\n"
-.LC48:
-	.string	"sblk_read_completed_queue_head = %d\n"
-.LC49:
-	.string	"sblk_gc_write_completed_queue_head = %d\n"
-.LC50:
-	.string	"sblk_write_completed_queue_head = %d\n"
-.LC51:
-	.string	"p_free_buf_head = %d\n"
-.LC52:
-	.string	"free_buf_count = %d\n"
-.LC53:
-	.string	"buf = %d, next=%d, flag=%d gc_write_flag=%d, lun_state=%d, op_status = %d lpa=%x, ppa=%x\n"
-.LC54:
-	.string	"flash_mask_bad_block %d %d\n"
-.LC55:
-	.string	"zftl_debug"
-.LC56:
-	.string	"FLASH ID: %x %x %x %x %x %x\n"
-.LC57:
-	.string	"density: %d MB\n"
-.LC58:
-	.string	"device density: %d MB\n"
-.LC59:
-	.string	"FTL INFO:\n"
-.LC60:
-	.string	"max_lpn = 0x%x\n"
-.LC61:
-	.string	"density = 0x%x\n"
-.LC62:
-	.string	"slc vpn = 0x%x\n"
-.LC63:
-	.string	"xlc vpn = 0x%x\n"
-.LC64:
-	.string	"free slc blk = 0x%x\n"
-.LC65:
-	.string	"free xlc blk = 0x%x\n"
-.LC66:
-	.string	"free mix blk = 0x%x\n"
-.LC67:
-	.string	"slc data blk = 0x%x\n"
-.LC68:
-	.string	"slc cache blk = 0x%x\n"
-.LC69:
-	.string	"xlc data blk = 0x%x\n"
-.LC70:
-	.string	"free buf = %d, %d, %d\n"
-.LC71:
-	.string	"bad blk = %d %d\n"
-.LC72:
-	.string	"TBW = %d MB\n"
-.LC73:
-	.string	"TBR = %d MB\n"
-.LC74:
-	.string	"POC = %d\n"
-.LC75:
-	.string	"PLC = %d\n"
-.LC76:
-	.string	"sys run time = %d S\n"
-.LC77:
-	.string	"slc mode = %x %x %x\n"
-.LC78:
-	.string	"prog err = %d\n"
-.LC79:
-	.string	"read err = %d\n"
-.LC80:
-	.string	"GC XLC page = %d\n"
-.LC81:
-	.string	"GC SLC page = %d\n"
-.LC82:
-	.string	"discard page = 0x%x\n"
-.LC83:
-	.string	"version = %d\n"
-.LC84:
-	.string	"acblk = 0x%x %d %d\n"
-.LC85:
-	.string	"tmblk = 0x%x %d %d\n"
-.LC86:
-	.string	"gcblk = 0x%x %d %d\n"
-.LC87:
-	.string	"slc ec = %d, %d, %d, %d, %d\n"
-.LC88:
-	.string	"xlc ec = %d, %d, %d, %d, %d\n"
-.LC89:
-	.string	"gc free blk th = %d\n"
-.LC90:
-	.string	"gc vpn th = %d %d %d %d %d\n"
-.LC91:
-	.string	"swl blk = %x %x %x %x\n"
-.LC92:
-	.string	"rf info = %x %x %x %x %x\n"
-.LC93:
-	.string	"gc_add_sblk = %d, %d, %d, %d, %d, %d, %d\n"
-.LC94:
-	.string	"gc_add_sblk = %d, %d, %d\n"
-.LC95:
-	.string	"gc_add_sblk = %d, %d, %d,last update:%d, %d\n"
-.LC96:
-	.string	"gc_add_sblk = %d, %d, %d, %d, %d, %d\n"
-.LC97:
-	.string	"gc_mark_bad_ppa %d %x %x\n"
-.LC98:
-	.string	"status: %x, ppa: %x\n"
-.LC99:
-	.string	"%d gc_free_temp_buf buf id= %x\n"
-.LC100:
-	.string	"gc: b:%x,p:%x,i:%x; free buf=%d %d free slc th: %d\n"
-.LC101:
-	.string	"zftl_get_gc_node cache = %x index = %d vpn = %x\n"
-.LC102:
-	.string	"gc_search_src_blk mode = %x, src mode = %x, count= %d %d\n"
-.LC103:
-	.string	"swl_tlc_free_mini_ec_blk alloc sblk %x\n"
-.LC104:
-	.string	"zftl_get_free_sblk %x %d, %p %d %d\n"
-.LC105:
-	.string	"zftl_gc_get_free_sblk %x %x %x, %d %d %d\n"
-.LC106:
-	.string	"swl_slc_free_mini_ec_blk alloc sblk %x\n"
-.LC107:
-	.string	"list count:%p %d\n"
-.LC108:
-	.string	"%d: node:%x %x %x %x, %d %d %d %d %d\n"
-.LC109:
-	.string	"ftl_vpn_decrement %x = %d, %d\n"
-.LC110:
-	.string	"mask bad block:cs %x %x block: %x %x\n"
-.LC111:
-	.string	"gc_free_bad_sblk 0x%x\n"
-.LC112:
-	.string	"swl_slc_free_mini_ec_blk sblk %x\n"
-.LC113:
-	.string	"gc_free_src_blk = %x, vpn = %d\n"
-.LC114:
-	.string	"gc_free_src_blk %x, %d\n"
-.LC115:
-	.string	"bad blk = %x, %x free blk: s:%x,t:%x,m:%x, data blk:s:%x,%x,t%x vpn: s:%x t:%x, max_vpn: %x\n"
-.LC116:
-	.string	"totle w: %d MB,r: %d MB %d dv:0x%X,poc:%d\n"
-.LC117:
-	.string	"gc xlc page: %d,gc slc page: %d, tmp w: %d MB\n"
-.LC118:
-	.string	"slc ec: %d,%d,%d,%d,%d,tlc ec: %d,%d,%d,%d,%d\n"
-.LC119:
-	.string	"gc th: tlc_tlc: %d tlc_slc: %d slc_slc: %d slc_tlc:%d free_th: %d\n"
-.LC120:
-	.string	"swl : %x %x %x %x %x %x\n"
-.LC121:
-	.string	"ftl prog error =%x, lpa = %x, ppa= %x\n"
-.LC122:
-	.string	"ftl re prog: lpa = %x, ppa= %x\n"
-.LC123:
-	.string	"dump_sblk_queue: %d\n"
-.LC124:
-	.string	"buf id= %d state = %d ppa = %x\n"
-.LC125:
-	.string	"%s %d %d\n"
-.LC126:
-	.string	"gc_static_wearleveling: min blk: %x,sec=%d,xec = %d ,mode=%d, func=%x, bbt=%x vpn = %d\n"
-.LC127:
-	.string	"gc_static_wearleveling: min slc blk: %x,sec=%d,xec = %d ,mode=%d, func=%x, bbt=%x vpn = %d\n"
-.LC128:
-	.string	"gc_static_wearleveling: min tlc blk: %x,sec=%d,xec = %d ,mode=%d, func=%x, bbt=%x vpn = %d\n"
-.LC129:
-	.string	"gc_static_wearleveling: max slc blk: %x,sec=%d,xec = %d ,mode=%d, func=%x, bbt=%x vpn = %d\n"
-.LC130:
-	.string	"gc_static_wearleveling: max xlc blk: %x,sec=%d,xec = %d ,mode=%d, func=%x, bbt=%x vpn = %d\n"
-.LC131:
-	.string	"gc_static_wearleveling: slc blk: %x, tlc blk: %d avg slc ec: %d, avg tlc ec: %d \n"
-.LC132:
-	.string	"gc_static_wearleveling: min slc ec: %x, min tlc ec: %d max slc ec: %d, max tlc ec: %d; %d %d\n"
-.LC133:
-	.string	"swl add tlc gc = %x, %d, %d, %d, %d, %d\n"
-.LC134:
-	.string	"swl add slc gc  = %x, %d, %d, %d, %d, %d\n"
-.LC135:
-	.string	"free blk vpn error: %x %x\n"
-.LC136:
-	.string	"GC PM block %x %x %x %d\n"
-.LC137:
-	.string	"ftl_free_no_use_map_blk %x %x %x %d\n"
-.LC138:
-	.string	"...%d @ %s\n"
-.LC139:
-	.string	"rk_ftl_de_init %x\n"
-.LC140:
-	.string	"\0013"
-.LC141:
-	.string	"otp error! %d"
-.LC142:
-	.string	"rr"
-.LC143:
-	.string	"flash_abort_clear = %d\n"
-.LC144:
-	.string	"%d mtrans_cnt = %d page_num = %d\n"
-.LC145:
-	.string	"%d flReg.d32=%x %x\n"
-.LC146:
-	.string	"nandc:"
-.LC147:
-	.string	"nandc_xfer_done read error %x\n"
-.LC148:
-	.string	"dqs data abort %x\n"
-.LC149:
-	.string	"dqs data timeout %x\n"
-.LC150:
-	.string	"xfer error %x\n"
-.LC151:
-	.string	"MT %d row=%x,last status %d,status = %d\n"
-.LC152:
-	.string	"MT RR %d row=%x,count %d,status=%d\n"
-.LC153:
-	.string	"toshiba SRR %d row=%x, status=%d\n"
-.LC154:
-	.string	"toshiba TRR %d row=%x, status=%d\n"
-.LC155:
-	.string	"toshiba RR %d row=%x,count %d,status=%d\n"
-.LC156:
-	.string	"YMTC RR %d row=%x,count %d,status=%d\n"
-.LC157:
-	.string	"samsung SRR %d row=%x, status=%d\n"
-.LC158:
-	.string	"samsung TRR %d row=%x, status=%d\n"
-.LC159:
-	.string	"samsung RR %d row=%x,count %d,status=%d\n"
-.LC160:
-	.string	"hynix RR %d row=%x, count %d, status=%d\n"
-.LC161:
-	.string	"%d flash_ddr_tuning_read %x ecc=%d\n"
-.LC162:
-	.string	"sync para %d\n"
-.LC163:
-	.string	"DDR mode Read error %x %x\n"
-.LC164:
-	.string	"SDR mode Read %x %x ecc:%x\n"
-.LC165:
-	.string	"flash_read_page_en %x %x %x %x\n"
-.LC166:
-	.string	"flash_read_page_en %x %x error_ecc %d %d\n"
-.LC167:
-	.string	"flash_get_last_written_page: %x %x %x\n"
-.LC168:
-	.string	"flash_prog_page page_addr = %x status = %x\n"
-.LC169:
-	.string	"flash_prog_page %x %x %x\n"
-.LC170:
-	.string	"ymtc_flash_tlc_page_prog page_addr = %x status = %x\n"
-.LC171:
-	.string	"sblk_mlc_dump_prog wl_addr= %x ppa = %x ppa = %x\n"
-.LC172:
-	.string	"flash_complete_page_read %x %x error_ecc %d %d\n"
-.LC173:
-	.string	"read: %x %x %x %x\n"
-.LC174:
-	.string	"0set buf %d,status = %x, ppa = %x lun state = %d\n"
-.LC175:
-	.string	"prog end %x %x error_ecc %d %d\n"
-.LC176:
-	.string	"1set buf %d,status = %x, ppa = %x lun state = %d\n"
-.LC177:
-	.string	"dp prog end %x %x error_ecc %d %d\n"
-.LC178:
-	.string	"sblk_prog_page ppa = %x, count = %d\n"
-.LC179:
-	.string	"err: ppa = %x, status = %x, %x %x spare: %x %x %x %x\n"
-.LC180:
-	.string	"flash_prog_page_en:%x %x %x\n"
-.LC181:
-	.string	"w d:"
-.LC182:
-	.string	"w s:"
-.LC183:
-	.string	"spare"
-.LC184:
-	.string	"data"
-.LC185:
-	.string	"write error: %x\n"
-.LC186:
-	.string	"g_ftl_info_blk blk = %x, page = %x version = %d\n"
-.LC187:
-	.string	"%d %x @%d %x\n"
-.LC188:
-	.string	"ftl_info_blk_init %d %d %x\n"
-.LC189:
-	.string	"ftl info hash %x error\n"
-.LC190:
-	.string	"ink flag: %x\n"
-.LC191:
-	.string	"%s %d %d %x %x\n"
-.LC192:
-	.string	"ext info hash %x error\n"
-.LC193:
-	.string	"%s %x %x %x\n"
-.LC194:
-	.string	"ftl_sblk_dump_write = %x %d %d %d %d\n"
-.LC195:
-	.string	"blk= %x, page=%x, ppa = %x, status = %x, data:%x %x %x %x, spare: %x %x %x %x\n"
-.LC196:
-	.string	"ftl_sblk_dump_write2 = %x %d %d %d\n"
-.LC197:
-	.string	"ftl_sblk_dump_write = %x %x\n"
-.LC198:
-	.string	"ftl_sblk_dump_write done = %x\n"
-.LC199:
-	.string	"%x: ink_scaned_blk_num %x\n"
-.LC200:
-	.string	"ftl_ink_check_sblk = %x %d %d\n"
-.LC201:
-	.string	"ftl_ink_check_sblk = %x %d %d end\n"
-.LC202:
-	.string	"alloc sblk %x %d\n"
-.LC203:
-	.string	"blk %x is bad block\n"
-.LC204:
-	.string	"pm_alloc_new_blk: %x %x %x %x\n"
-.LC205:
-	.string	"pm_write_page write error: %x\n"
-.LC206:
-	.string	"finfo:"
-.LC207:
-	.string	"flash_info_flush id = %x, page = %x\n"
-.LC208:
-	.string	"sys_info_flush error:%x\n"
-.LC209:
-	.string	"...%d @ %s %d %p\n"
-.LC210:
-	.string	"no sys info %x\n"
-.LC211:
-	.string	"l2p:"
-.LC212:
-	.string	"saved_active_page  = %x\n"
-.LC213:
-	.string	"saved_active_plane = %x\n"
-.LC214:
-	.string	"sblk = %x\n"
-.LC215:
-	.string	"phy_blk = %x %x\n"
-.LC216:
-	.string	"num_planes = %x\n"
-.LC217:
-	.string	"recovery blk=%x, page=%x, ppa = %x, status = %x, hash:%x\n"
-.LC218:
-	.string	"data:"
-.LC219:
-	.string	"sblk = %x, vpn0 = %d, vpn1 = %d\n"
-.LC220:
-	.string	"dump_write_lpa = %x %x %x %x\n"
-.LC221:
-	.string	"dump write new ppa = %x, last ppa = %x lpa = %x\n"
-.LC222:
-	.string	"dump write = %x %x %x\n"
-.LC223:
-	.string	"dump write hash update = %x %x %x\n"
-.LC224:
-	.string	"free_buf_count: %d\n"
-.LC225:
-	.string	"g_ftl_info_blk blk:0x%x, index:0x%x, page:0x%x\n"
-.LC226:
-	.string	"ftl_ext_info_blk blk:0x%x, page:0x%x\n"
-.LC227:
-	.string	"ac_blk:0x%x, page:0x%x, index:0x%x, free:0x%x, page_index:0x%x\n"
-.LC228:
-	.string	"tmp_blk:0x%x, page:0x%x, index:0x%x, free:0x%x, page_index:0x%x\n"
-.LC229:
-	.string	"gc_blk:0x%x, page:0x%x, index:0x%x, free:0x%x, page_index:0x%x\n"
-.LC230:
-	.string	"lpa:"
-.LC231:
-	.string	"vpn:"
-.LC232:
-	.string	"sblk:"
-.LC233:
-	.string	"lpa_hash:"
-.LC234:
-	.string	"lpa_hash_index:"
-.LC235:
-	.string	"%s w error lpn = %x, max ppa = %d\n"
-.LC236:
-	.string	"region_id = %d, pm_max_region = %d\n"
-.LC237:
-	.string	"load_l2p_region no ppa = %x , %x, all setting 0xff....\n"
-.LC238:
-	.string	"load_l2p_region = %x,%x,%x, %x\n"
-.LC239:
-	.string	"pm_ppa:"
-.LC240:
-	.string	"spare:"
-.LC241:
-	.string	"pm_init posr %x %x %x\n"
-.LC242:
-	.string	"pm_init recovery %x %x %x\n"
-.LC243:
-	.string	"pm_init hash %x error\n"
-.LC244:
-	.string	"pm_log2phys  lpn = %d, max lpn = %d\n"
-.LC245:
-	.string	"ppa = %x, status = %x, data:%x %x %x %x, spare: %x %x %x %x\n"
-.LC246:
-	.string	"ppa = %x, status = %x, %x %x spare: %x %x %x %x\n"
-.LC247:
-	.string	"gc_recovery: %x vpn = %x\n"
-.LC248:
-	.string	"gc_update_l2p_map_new sblk %x\n"
-.LC249:
-	.string	"gc_update_l2p_map_new: %x %x %x\n"
-.LC250:
-	.string	"lpa: %x %x %x\n"
-.LC251:
-	.string	"gc_update_l2p_map_new: %x vpn = %x vpn1 = %x done\n"
-.LC252:
-	.string	"gc_scan_src_blk = %x, vpn = %d\n"
-.LC253:
-	.string	"js hash error:%x %x %x\n"
-.LC254:
-	.string	"gc_scan_src_blk = %x, s vpn0 = %d, c vpn1 = %d\n"
-.LC255:
-	.string	"gc_block_vpn_scan = %x, s vpn0 = %d, c vpn1 = %d f:%d\n"
-.LC256:
-	.string	"ftl_sblk_dump = %x %d %d %d %d\n"
-.LC257:
-	.string	"ftl_sblk_dump = %x %x %x %x\n"
-.LC258:
-	.string	"page_addr = %x, lpa=%x vpn = %d\n"
-.LC259:
-	.string	"index= %x, lpa=%x\n"
-.LC260:
-	.string	"block = %x, vpn=%x check vpn = %x\n"
-.LC261:
-	.string	"ftl_read %x %x %x\n"
-.LC262:
-	.string	"ftl_read refresh =%x, lpa = %x, ppa= %x\n"
-.LC263:
-	.string	"id=%d, status = %x, lpa = %x, ppa = %x spare = %x %x %x %x\n"
-.LC264:
-	.string	"zftl debug cmd: %s\n"
-.LC265:
-	.string	"cmd:"
-.LC266:
-	.string	"dumpl2p"
-.LC267:
-	.string	"pm l2p:"
-.LC268:
-	.string	"pm blk:"
-.LC269:
-	.string	"dumppm:"
-.LC270:
-	.string	"p_cmd: %s\n"
-.LC271:
-	.string	"pm ram = %x, %x\n"
-.LC272:
-	.string	"ram:"
-.LC273:
-	.string	"pm:"
-.LC274:
-	.string	"dumpsys"
-.LC275:
-	.string	"dumplist:"
-.LC276:
-	.string	"vpncheck"
-.LC277:
-	.string	"dumpppa:"
-.LC278:
-	.string	"dumpblk:"
-.LC279:
-	.string	"setzdebug:"
-.LC280:
-	.string	"lpa2ppa:"
-.LC281:
-	.string	"lpa: %x--> ppa: %x\n"
-.LC282:
-	.string	"help:\n"
-.LC283:
-	.string	"1. echo dumpl2p > /proc/zftl_debug\n"
-.LC284:
-	.string	"2. echo dumppm:x > /proc/zftl_debug\n"
-.LC285:
-	.string	"3. echo dumpsys > /proc/zftl_debug\n"
-.LC286:
-	.string	"4. echo dumpppa:x > /proc/zftl_debug\n"
-.LC287:
-	.string	"5. echo vpncheck > /proc/zftl_debug\n"
-.LC288:
-	.string	"6. echo setzdebug:x > /proc/zftl_debug\n"
-.LC289:
-	.string	"7. echo dumplist:x > /proc/zftl_debug\n"
-.LC290:
-	.string	"8. echo lpa2ppa:x> /proc/zftl_debug\n"
-.LC291:
-	.string	"ftl_update_l2p_map: %x %x %x\n"
-.LC292:
-	.string	"ftl_update_l2p_map"
-.LC293:
-	.string	"lpa_tbl:"
-.LC294:
-	.string	"sblk %x vpn: %d %d\n"
-.LC295:
-	.string	"error gc_add_sblk: %x\n"
-.LC296:
-	.string	"%d read error: ppa:%x, lpa:%x, status:%x\n"
-.LC297:
-	.string	"gc page in buf: lpa %x ppa = %x pageindex= %x\n"
-.LC298:
-	.string	"gc_do_copy_back: lpa %x des_ppa = %x %x gc_ppa= %x page_index= %d\n"
-.LC299:
-	.string	"gc %d: %d %d %d %d %d %d %d\n"
-.LC300:
-	.string	"GC_STATE_SCAN_ALL_PAGE = %x, vpn0 = %d, vpn1 = %d\n"
-.LC301:
-	.string	"gc free %x, %d\n"
-.LC302:
-	.string	"_c_user_data_density := %d\n"
-.LC303:
-	.string	"_c_totle_phy_density := %d\n"
-.LC304:
-	.string	"_c_totle_log_page := %d\n"
-.LC305:
-	.string	"_c_totle_data_density := %d\n"
-.LC306:
-	.string	"_c_ftl_pm_page_num := %d\n"
-.LC307:
-	.string	"_c_ftl_byte_pre_page := %d\n"
-.LC308:
-	.string	"_c_max_pm_sblk := %d\n"
-.LC309:
-	.string	"_min_slc_super_block := %d\n"
-.LC310:
-	.string	"_max_xlc_super_block := %d\n"
-.LC311:
-	.string	"gp_ftl_ext_info %p %p %p\n"
-.LC312:
-	.string	"flash info size: %d %d %d\n"
-.LC313:
-	.string	"ftl_init %x\n"
-.LC314:
-	.string	"ftlwrite %x %x %x %x\n"
-.LC315:
-	.string	"ftl_discard:(%x, %x, %x, %x)\n"
-.LC316:
-	.string	"id_block_prog_msb_ff_data slc page = %d pageadd=%x %x\n"
-.LC317:
-	.string	"write_idblock fix data %x %x\n"
-.LC318:
-	.string	"idblk:"
-.LC319:
-	.string	"write_idblock totle_sec %x %x\n"
-.LC320:
-	.string	"prog page: %x %x %x, %p %x %x %x\n"
-.LC321:
-	.string	"read page: %x %x %x %x\n"
-.LC322:
-	.string	"wl_lba %p %x %x %x\n"
-.LC323:
-	.string	"RKNAND_GET_DRM_KEY\n"
-.LC324:
-	.string	"rk_copy_from_user error\n"
-.LC325:
-	.string	"RKNAND_STORE_DRM_KEY\n"
-.LC326:
-	.string	"RKNAND_DIASBLE_SECURE_BOOT\n"
-.LC327:
-	.string	"RKNAND_ENASBLE_SECURE_BOOT\n"
-.LC328:
-	.string	"RKNAND_GET_SN_SECTOR\n"
-.LC329:
-	.string	"RKNAND_LOADER_UNLOCK\n"
-.LC330:
-	.string	"RKNAND_LOADER_STATUS\n"
-.LC331:
-	.string	"RKNAND_LOADER_LOCK\n"
-.LC332:
-	.string	"LockKey not match %d\n"
-.LC333:
-	.string	"RKNAND_GET_VENDOR_SECTOR\n"
-.LC334:
-	.string	"RKNAND_STORE_VENDOR_SECTOR\n"
-.LC335:
-	.string	"return ret = %lx\n"
-.LC336:
-	.string	"secureBootEn check error\n"
-.LC337:
-	.string	"\0013vendor storage %x,%x,%x\n"
-	.data
-	.align	3
-.LANCHOR2 = . + 0
-	.type	zftl_debug, %object
-	.size	zftl_debug, 4
-zftl_debug:
-	.word	17476
-	.zero	4
-	.type	g_nand_para_info, %object
-	.size	g_nand_para_info, 32
-g_nand_para_info:
-	.byte	6
-	.byte	-104
-	.byte	58
-	.byte	-104
-	.byte	-77
-	.byte	118
-	.byte	114
-	.byte	1
-	.byte	1
-	.byte	32
-	.hword	768
-	.byte	3
-	.byte	2
-	.hword	758
-	.hword	5593
-	.byte	0
-	.byte	37
-	.byte	60
-	.byte	32
-	.byte	2
-	.byte	1
-	.byte	4
-	.byte	0
-	.hword	256
-	.byte	1
-	.byte	-94
-	.byte	0
-	.byte	0
-	.type	sd15_tlc_rr, %object
-	.size	sd15_tlc_rr, 329
-sd15_tlc_rr:
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	-8
-	.byte	0
-	.byte	16
-	.byte	8
-	.byte	8
-	.byte	0
-	.byte	-8
-	.byte	-8
-	.byte	-8
-	.byte	-16
-	.byte	-8
-	.byte	-8
-	.byte	-8
-	.byte	-8
-	.byte	-24
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	-8
-	.byte	-16
-	.byte	-32
-	.byte	0
-	.byte	8
-	.byte	-8
-	.byte	8
-	.byte	8
-	.byte	0
-	.byte	0
-	.byte	-16
-	.byte	-8
-	.byte	-8
-	.byte	-8
-	.byte	0
-	.byte	-16
-	.byte	-24
-	.byte	-16
-	.byte	8
-	.byte	8
-	.byte	-8
-	.byte	-16
-	.byte	-16
-	.byte	0
-	.byte	8
-	.byte	8
-	.byte	8
-	.byte	8
-	.byte	-8
-	.byte	-8
-	.byte	-24
-	.byte	0
-	.byte	-16
-	.byte	0
-	.byte	-8
-	.byte	-16
-	.byte	-8
-	.byte	-8
-	.byte	0
-	.byte	8
-	.byte	0
-	.byte	0
-	.byte	-8
-	.byte	0
-	.byte	-24
-	.byte	-8
-	.byte	0
-	.byte	0
-	.byte	-8
-	.byte	-24
-	.byte	-8
-	.byte	8
-	.byte	-8
-	.byte	0
-	.byte	-8
-	.byte	8
-	.byte	-16
-	.byte	-8
-	.byte	-8
-	.byte	-8
-	.byte	8
-	.byte	8
-	.byte	0
-	.byte	0
-	.byte	-8
-	.byte	-8
-	.byte	8
-	.byte	-8
-	.byte	-8
-	.byte	0
-	.byte	0
-	.byte	-8
-	.byte	-16
-	.byte	-16
-	.byte	-8
-	.byte	0
-	.byte	0
-	.byte	-8
-	.byte	0
-	.byte	-16
-	.byte	8
-	.byte	0
-	.byte	8
-	.byte	0
-	.byte	-16
-	.byte	-8
-	.byte	-16
-	.byte	16
-	.byte	0
-	.byte	16
-	.byte	0
-	.byte	-8
-	.byte	8
-	.byte	0
-	.byte	-24
-	.byte	0
-	.byte	-16
-	.byte	-8
-	.byte	-16
-	.byte	-16
-	.byte	-16
-	.byte	-16
-	.byte	0
-	.byte	8
-	.byte	-8
-	.byte	-24
-	.byte	0
-	.byte	8
-	.byte	8
-	.byte	16
-	.byte	16
-	.byte	0
-	.byte	8
-	.byte	-8
-	.byte	8
-	.byte	16
-	.byte	-8
-	.byte	24
-	.byte	0
-	.byte	8
-	.byte	-4
-	.byte	0
-	.byte	16
-	.byte	8
-	.byte	24
-	.byte	8
-	.byte	0
-	.byte	-4
-	.byte	-8
-	.byte	24
-	.byte	16
-	.byte	16
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	-16
-	.byte	0
-	.byte	0
-	.byte	4
-	.byte	0
-	.byte	-4
-	.byte	-4
-	.byte	-4
-	.byte	8
-	.byte	8
-	.byte	16
-	.byte	0
-	.byte	16
-	.byte	-4
-	.byte	16
-	.byte	0
-	.byte	16
-	.byte	8
-	.byte	0
-	.byte	16
-	.byte	-4
-	.byte	16
-	.byte	-8
-	.byte	0
-	.byte	0
-	.byte	-8
-	.byte	16
-	.byte	-4
-	.byte	16
-	.byte	-16
-	.byte	-8
-	.byte	-8
-	.byte	-8
-	.byte	8
-	.byte	-4
-	.byte	8
-	.byte	-24
-	.byte	4
-	.byte	-16
-	.byte	0
-	.byte	8
-	.byte	0
-	.byte	0
-	.byte	-24
-	.byte	8
-	.byte	-16
-	.byte	8
-	.byte	0
-	.byte	8
-	.byte	-24
-	.byte	-32
-	.byte	16
-	.byte	-24
-	.byte	8
-	.byte	-8
-	.byte	8
-	.byte	-24
-	.byte	-32
-	.byte	8
-	.byte	0
-	.byte	16
-	.byte	0
-	.byte	16
-	.byte	0
-	.byte	-32
-	.byte	4
-	.byte	0
-	.byte	-8
-	.byte	-16
-	.byte	-8
-	.byte	0
-	.byte	-32
-	.byte	4
-	.byte	0
-	.byte	8
-	.byte	-24
-	.byte	8
-	.byte	0
-	.byte	-32
-	.byte	4
-	.byte	0
-	.byte	0
-	.byte	-32
-	.byte	-4
-	.byte	0
-	.byte	-24
-	.byte	4
-	.byte	0
-	.byte	16
-	.byte	-24
-	.byte	16
-	.byte	0
-	.byte	-24
-	.byte	-4
-	.byte	0
-	.byte	8
-	.byte	-32
-	.byte	8
-	.byte	0
-	.byte	0
-	.byte	-4
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	-4
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	-4
-	.byte	0
-	.byte	0
-	.byte	-4
-	.byte	0
-	.byte	-8
-	.byte	0
-	.byte	-8
-	.byte	0
-	.byte	0
-	.byte	-4
-	.byte	0
-	.byte	-16
-	.byte	0
-	.byte	-16
-	.byte	0
-	.byte	0
-	.byte	-16
-	.byte	0
-	.byte	-16
-	.byte	0
-	.byte	-16
-	.byte	0
-	.byte	0
-	.byte	-8
-	.byte	0
-	.byte	-16
-	.byte	0
-	.byte	-16
-	.byte	0
-	.byte	0
-	.byte	-16
-	.byte	0
-	.byte	-24
-	.byte	0
-	.byte	-24
-	.byte	0
-	.byte	0
-	.byte	-24
-	.byte	0
-	.byte	-24
-	.byte	0
-	.byte	-24
-	.byte	0
-	.byte	0
-	.byte	-24
-	.byte	0
-	.byte	-16
-	.byte	0
-	.byte	-16
-	.byte	0
-	.byte	0
-	.byte	-24
-	.byte	0
-	.byte	-32
-	.byte	0
-	.byte	-32
-	.byte	0
-	.zero	7
-	.type	sd15_slc_rr, %object
-	.size	sd15_slc_rr, 25
-sd15_slc_rr:
-	.byte	0
-	.byte	8
-	.byte	-8
-	.byte	16
-	.byte	-16
-	.byte	24
-	.byte	-24
-	.byte	32
-	.byte	-32
-	.byte	32
-	.byte	-40
-	.byte	48
-	.byte	-48
-	.byte	56
-	.byte	-56
-	.byte	64
-	.byte	-64
-	.byte	72
-	.byte	-72
-	.byte	80
-	.byte	-80
-	.byte	88
-	.byte	96
-	.byte	104
-	.byte	112
-	.zero	7
-	.type	hy_f26_ref_value, %object
-	.size	hy_f26_ref_value, 28
-hy_f26_ref_value:
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	6
-	.byte	10
-	.byte	6
-	.byte	0
-	.byte	-3
-	.byte	-7
-	.byte	-8
-	.byte	0
-	.byte	-6
-	.byte	-13
-	.byte	-15
-	.byte	0
-	.byte	-11
-	.byte	-20
-	.byte	-23
-	.byte	0
-	.byte	0
-	.byte	-26
-	.byte	-30
-	.byte	0
-	.byte	0
-	.byte	-32
-	.byte	-37
-	.zero	4
-	.type	zftl_nand_flash_para_tbl, %object
-	.size	zftl_nand_flash_para_tbl, 1568
-zftl_nand_flash_para_tbl:
-	.byte	6
-	.byte	-104
-	.byte	58
-	.byte	-104
-	.byte	-77
-	.byte	118
-	.byte	114
-	.byte	1
-	.byte	1
-	.byte	32
-	.hword	768
-	.byte	3
-	.byte	2
-	.hword	758
-	.hword	5593
-	.byte	0
-	.byte	37
-	.byte	60
-	.byte	32
-	.byte	3
-	.byte	1
-	.byte	4
-	.byte	0
-	.hword	256
-	.byte	1
-	.byte	-94
-	.byte	0
-	.byte	0
-	.byte	6
-	.byte	-104
-	.byte	60
-	.byte	-104
-	.byte	-77
-	.byte	118
-	.byte	114
-	.byte	1
-	.byte	1
-	.byte	32
-	.hword	768
-	.byte	3
-	.byte	2
-	.hword	1478
-	.hword	5593
-	.byte	0
-	.byte	37
-	.byte	60
-	.byte	32
-	.byte	3
-	.byte	1
-	.byte	4
-	.byte	0
-	.hword	256
-	.byte	1
-	.byte	-94
-	.byte	0
-	.byte	0
-	.byte	6
-	.byte	-104
-	.byte	58
-	.byte	-104
-	.byte	-93
-	.byte	118
-	.byte	81
-	.byte	1
-	.byte	1
-	.byte	32
-	.hword	384
-	.byte	3
-	.byte	2
-	.hword	1446
-	.hword	1497
-	.byte	0
-	.byte	36
-	.byte	60
-	.byte	32
-	.byte	3
-	.byte	1
-	.byte	4
-	.byte	0
-	.hword	256
-	.byte	1
-	.byte	-94
-	.byte	0
-	.byte	0
-	.byte	6
-	.byte	-104
-	.byte	-34
-	.byte	-108
-	.byte	-109
-	.byte	118
-	.byte	81
-	.byte	1
-	.byte	1
-	.byte	32
-	.hword	256
-	.byte	2
-	.byte	2
-	.hword	1074
-	.hword	17881
-	.byte	2
-	.byte	35
-	.byte	40
-	.byte	32
-	.byte	3
-	.byte	1
-	.byte	4
-	.byte	0
-	.hword	256
-	.byte	1
-	.byte	-94
-	.byte	0
-	.byte	0
-	.byte	6
-	.byte	-104
-	.byte	-34
-	.byte	-124
-	.byte	-109
-	.byte	114
-	.byte	87
-	.byte	1
-	.byte	1
-	.byte	32
-	.hword	256
-	.byte	2
-	.byte	1
-	.hword	2092
-	.hword	17857
-	.byte	2
-	.byte	33
-	.byte	40
-	.byte	32
-	.byte	3
-	.byte	1
-	.byte	1
-	.byte	0
-	.hword	256
-	.byte	1
-	.byte	-94
-	.byte	0
-	.byte	0
-	.byte	6
-	.byte	-104
-	.byte	58
-	.byte	-108
-	.byte	-109
-	.byte	118
-	.byte	81
-	.byte	1
-	.byte	1
-	.byte	32
-	.hword	256
-	.byte	2
-	.byte	2
-	.hword	2106
-	.hword	17881
-	.byte	2
-	.byte	35
-	.byte	40
-	.byte	32
-	.byte	3
-	.byte	1
-	.byte	4
-	.byte	0
-	.hword	256
-	.byte	1
-	.byte	-94
-	.byte	0
-	.byte	0
-	.byte	6
-	.byte	-104
-	.byte	-41
-	.byte	-124
-	.byte	-109
-	.byte	114
-	.byte	81
-	.byte	1
-	.byte	1
-	.byte	32
-	.hword	256
-	.byte	2
-	.byte	1
-	.hword	1056
-	.hword	17857
-	.byte	2
-	.byte	35
-	.byte	40
-	.byte	32
-	.byte	3
-	.byte	1
-	.byte	4
-	.byte	0
-	.hword	256
-	.byte	1
-	.byte	-94
-	.byte	0
-	.byte	0
-	.byte	6
-	.byte	-104
-	.byte	-41
-	.byte	-124
-	.byte	-109
-	.byte	114
-	.byte	80
-	.byte	1
-	.byte	1
-	.byte	32
-	.hword	256
-	.byte	2
-	.byte	1
-	.hword	1060
-	.hword	17857
-	.byte	2
-	.byte	34
-	.byte	40
-	.byte	32
-	.byte	3
-	.byte	1
-	.byte	4
-	.byte	0
-	.hword	256
-	.byte	1
-	.byte	-94
-	.byte	0
-	.byte	0
-	.byte	6
-	.byte	-104
-	.byte	-34
-	.byte	-108
-	.byte	-109
-	.byte	118
-	.byte	80
-	.byte	1
-	.byte	1
-	.byte	32
-	.hword	256
-	.byte	2
-	.byte	2
-	.hword	1066
-	.hword	17881
-	.byte	2
-	.byte	34
-	.byte	40
-	.byte	32
-	.byte	3
-	.byte	1
-	.byte	1
-	.byte	0
-	.hword	256
-	.byte	1
-	.byte	-94
-	.byte	0
-	.byte	0
-	.byte	6
-	.byte	-104
-	.byte	-41
-	.byte	-124
-	.byte	-109
-	.byte	114
-	.byte	87
-	.byte	1
-	.byte	1
-	.byte	32
-	.hword	256
-	.byte	2
-	.byte	1
-	.hword	1060
-	.hword	17857
-	.byte	2
-	.byte	33
-	.byte	40
-	.byte	32
-	.byte	3
-	.byte	1
-	.byte	1
-	.byte	0
-	.hword	256
-	.byte	1
-	.byte	-94
-	.byte	0
-	.byte	0
-	.byte	6
-	.byte	-104
-	.byte	-34
-	.byte	-108
-	.byte	-109
-	.byte	118
-	.byte	87
-	.byte	1
-	.byte	1
-	.byte	32
-	.hword	256
-	.byte	2
-	.byte	2
-	.hword	1058
-	.hword	17881
-	.byte	2
-	.byte	33
-	.byte	40
-	.byte	32
-	.byte	3
-	.byte	1
-	.byte	1
-	.byte	0
-	.hword	256
-	.byte	1
-	.byte	-94
-	.byte	0
-	.byte	0
-	.byte	6
-	.byte	-104
-	.byte	-34
-	.byte	-108
-	.byte	-109
-	.byte	118
-	.byte	-47
-	.byte	1
-	.byte	1
-	.byte	32
-	.hword	256
-	.byte	2
-	.byte	2
-	.hword	1074
-	.hword	17881
-	.byte	2
-	.byte	35
-	.byte	40
-	.byte	32
-	.byte	3
-	.byte	1
-	.byte	4
-	.byte	0
-	.hword	256
-	.byte	1
-	.byte	-94
-	.byte	0
-	.byte	0
-	.byte	6
-	.byte	69
-	.byte	58
-	.byte	-108
-	.byte	-109
-	.byte	118
-	.byte	81
-	.byte	8
-	.byte	1
-	.byte	32
-	.hword	256
-	.byte	2
-	.byte	2
-	.hword	2106
-	.hword	17881
-	.byte	2
-	.byte	68
-	.byte	40
-	.byte	32
-	.byte	3
-	.byte	1
-	.byte	4
-	.byte	0
-	.hword	256
-	.byte	1
-	.byte	-94
-	.byte	0
-	.byte	0
-	.byte	6
-	.byte	69
-	.byte	-34
-	.byte	-108
-	.byte	-109
-	.byte	118
-	.byte	81
-	.byte	8
-	.byte	1
-	.byte	32
-	.hword	256
-	.byte	2
-	.byte	2
-	.hword	1074
-	.hword	17881
-	.byte	2
-	.byte	68
-	.byte	40
-	.byte	32
-	.byte	3
-	.byte	1
-	.byte	4
-	.byte	0
-	.hword	256
-	.byte	1
-	.byte	-94
-	.byte	0
-	.byte	0
-	.byte	6
-	.byte	69
-	.byte	-34
-	.byte	-108
-	.byte	-109
-	.byte	118
-	.byte	87
-	.byte	8
-	.byte	1
-	.byte	32
-	.hword	256
-	.byte	2
-	.byte	2
-	.hword	1058
-	.hword	17881
-	.byte	2
-	.byte	66
-	.byte	40
-	.byte	32
-	.byte	3
-	.byte	1
-	.byte	4
-	.byte	0
-	.hword	256
-	.byte	1
-	.byte	-94
-	.byte	0
-	.byte	0
-	.byte	6
-	.byte	69
-	.byte	-34
-	.byte	-108
-	.byte	-109
-	.byte	118
-	.byte	80
-	.byte	8
-	.byte	1
-	.byte	32
-	.hword	256
-	.byte	2
-	.byte	2
-	.hword	1066
-	.hword	17881
-	.byte	2
-	.byte	67
-	.byte	40
-	.byte	32
-	.byte	3
-	.byte	1
-	.byte	1
-	.byte	0
-	.hword	256
-	.byte	1
-	.byte	-94
-	.byte	0
-	.byte	0
-	.byte	6
-	.byte	69
-	.byte	-41
-	.byte	-124
-	.byte	-109
-	.byte	114
-	.byte	87
-	.byte	8
-	.byte	1
-	.byte	32
-	.hword	256
-	.byte	2
-	.byte	1
-	.hword	1060
-	.hword	17857
-	.byte	2
-	.byte	66
-	.byte	40
-	.byte	32
-	.byte	2
-	.byte	1
-	.byte	1
-	.byte	0
-	.hword	256
-	.byte	1
-	.byte	-94
-	.byte	0
-	.byte	0
-	.byte	5
-	.byte	44
-	.byte	100
-	.byte	68
-	.byte	50
-	.byte	-91
-	.byte	0
-	.byte	4
-	.byte	1
-	.byte	32
-	.hword	512
-	.byte	2
-	.byte	1
-	.hword	1048
-	.hword	9671
-	.byte	5
-	.byte	19
-	.byte	70
-	.byte	32
-	.byte	1
-	.byte	0
-	.byte	4
-	.byte	0
-	.hword	512
-	.byte	1
-	.byte	-38
-	.byte	-33
-	.byte	0
-	.byte	5
-	.byte	44
-	.byte	100
-	.byte	100
-	.byte	86
-	.byte	-91
-	.byte	0
-	.byte	4
-	.byte	1
-	.byte	24
-	.hword	512
-	.byte	2
-	.byte	2
-	.hword	700
-	.hword	479
-	.byte	4
-	.byte	18
-	.byte	60
-	.byte	32
-	.byte	1
-	.byte	0
-	.byte	1
-	.byte	0
-	.hword	512
-	.byte	3
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	5
-	.byte	44
-	.byte	68
-	.byte	68
-	.byte	75
-	.byte	-87
-	.byte	0
-	.byte	4
-	.byte	1
-	.byte	16
-	.hword	256
-	.byte	2
-	.byte	2
-	.hword	1064
-	.hword	479
-	.byte	3
-	.byte	17
-	.byte	40
-	.byte	32
-	.byte	1
-	.byte	0
-	.byte	1
-	.byte	0
-	.hword	256
-	.byte	3
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	5
-	.byte	44
-	.byte	-124
-	.byte	100
-	.byte	84
-	.byte	-87
-	.byte	0
-	.byte	4
-	.byte	1
-	.byte	32
-	.hword	512
-	.byte	2
-	.byte	2
-	.hword	1024
-	.hword	479
-	.byte	4
+	.byte	1
+	.byte	0
+	.hword	512
+	.byte	3
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	5
+	.byte	44
+	.byte	68
+	.byte	68
+	.byte	75
+	.byte	-87
+	.byte	0
+	.byte	4
+	.byte	1
+	.byte	16
+	.hword	256
+	.byte	2
+	.byte	2
+	.hword	1064
+	.hword	479
+	.byte	3
+	.byte	17
+	.byte	40
+	.byte	32
+	.byte	1
+	.byte	0
+	.byte	1
+	.byte	0
+	.hword	256
+	.byte	3
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	5
+	.byte	44
+	.byte	-124
+	.byte	100
+	.byte	84
+	.byte	-87
+	.byte	0
+	.byte	4
+	.byte	1
+	.byte	32
+	.hword	512
+	.byte	2
+	.byte	2
+	.hword	1024
+	.hword	479
+	.byte	4
 	.byte	18
 	.byte	60
 	.byte	32
@@ -35225,796 +32714,3035 @@ tlc_prog_order:
 	.hword	1019
 	.bss
 	.align	6
-.LANCHOR0 = . + 0
-.LANCHOR3 = . + 4352
-.LANCHOR5 = . + 8704
+	.set	.LANCHOR0,. + 0
+	.set	.LANCHOR3,. + 4352
+	.set	.LANCHOR5,. + 8704
 	.type	g_flash_slc_mode, %object
 	.size	g_flash_slc_mode, 1
 g_flash_slc_mode:
 	.zero	1
-	.type	g_slc_mode_addr2, %object
-	.size	g_slc_mode_addr2, 1
-g_slc_mode_addr2:
+	.type	g_slc_mode_addr2, %object
+	.size	g_slc_mode_addr2, 1
+g_slc_mode_addr2:
+	.zero	1
+	.type	g_block_align_addr, %object
+	.size	g_block_align_addr, 2
+g_block_align_addr:
+	.zero	2
+	.type	g_lsb_page_tbl, %object
+	.size	g_lsb_page_tbl, 1024
+g_lsb_page_tbl:
+	.zero	1024
+	.type	g_nandc_ver, %object
+	.size	g_nandc_ver, 1
+g_nandc_ver:
+	.zero	1
+	.zero	3
+	.type	_c_user_data_density, %object
+	.size	_c_user_data_density, 4
+_c_user_data_density:
+	.zero	4
+	.zero	4
+	.type	gp_sblk_list_tbl, %object
+	.size	gp_sblk_list_tbl, 8
+gp_sblk_list_tbl:
+	.zero	8
+	.type	gp_flash_info, %object
+	.size	gp_flash_info, 8
+gp_flash_info:
+	.zero	8
+	.type	gp_nandc, %object
+	.size	gp_nandc, 8
+gp_nandc:
+	.zero	8
+	.type	NANDC_FMCTL, %object
+	.size	NANDC_FMCTL, 4
+NANDC_FMCTL:
+	.zero	4
+	.type	NANDC_FMWAIT, %object
+	.size	NANDC_FMWAIT, 4
+NANDC_FMWAIT:
+	.zero	4
+	.type	NANDC_FLCTL, %object
+	.size	NANDC_FLCTL, 4
+NANDC_FLCTL:
+	.zero	4
+	.type	NANDC_BCHCTL, %object
+	.size	NANDC_BCHCTL, 4
+NANDC_BCHCTL:
+	.zero	4
+	.type	NANDC_DLL_CTL_REG0, %object
+	.size	NANDC_DLL_CTL_REG0, 4
+NANDC_DLL_CTL_REG0:
+	.zero	4
+	.type	NANDC_DLL_CTL_REG1, %object
+	.size	NANDC_DLL_CTL_REG1, 4
+NANDC_DLL_CTL_REG1:
+	.zero	4
+	.type	NANDC_RANDMZ_CFG, %object
+	.size	NANDC_RANDMZ_CFG, 4
+NANDC_RANDMZ_CFG:
+	.zero	4
+	.type	NANDC_FMWAIT_SYN, %object
+	.size	NANDC_FMWAIT_SYN, 4
+NANDC_FMWAIT_SYN:
+	.zero	4
+	.type	_c_ftl_blk_pre_plane, %object
+	.size	_c_ftl_blk_pre_plane, 2
+_c_ftl_blk_pre_plane:
+	.zero	2
+	.zero	6
+	.type	gp_blk_info, %object
+	.size	gp_blk_info, 8
+gp_blk_info:
+	.zero	8
+	.type	_c_slc_to_xlc_ec_ratio, %object
+	.size	_c_slc_to_xlc_ec_ratio, 2
+_c_slc_to_xlc_ec_ratio:
+	.zero	2
+	.zero	6
+	.type	ftl_sblk_vpn, %object
+	.size	ftl_sblk_vpn, 8
+ftl_sblk_vpn:
+	.zero	8
+	.type	gp_ftl_ext_info, %object
+	.size	gp_ftl_ext_info, 8
+gp_ftl_ext_info:
+	.zero	8
+	.type	g_retryMode, %object
+	.size	g_retryMode, 1
+g_retryMode:
+	.zero	1
+	.type	g_maxRegNum, %object
+	.size	g_maxRegNum, 1
+g_maxRegNum:
+	.zero	1
+	.zero	6
+	.type	gp_nand_para_info, %object
+	.size	gp_nand_para_info, 8
+gp_nand_para_info:
+	.zero	8
+	.type	g_idb_ecc_bits, %object
+	.size	g_idb_ecc_bits, 1
+g_idb_ecc_bits:
+	.zero	1
+	.type	g_nand_max_die, %object
+	.size	g_nand_max_die, 1
+g_nand_max_die:
+	.zero	1
+	.type	g_idb_slc_mode_enable, %object
+	.size	g_idb_slc_mode_enable, 1
+g_idb_slc_mode_enable:
+	.zero	1
+	.zero	5
+	.type	g_nand_opt_para, %object
+	.size	g_nand_opt_para, 32
+g_nand_opt_para:
+	.zero	32
+	.type	g_flash_toggle_mode_en, %object
+	.size	g_flash_toggle_mode_en, 1
+g_flash_toggle_mode_en:
+	.zero	1
+	.zero	3
+	.type	g_die_cs_idx, %object
+	.size	g_die_cs_idx, 8
+g_die_cs_idx:
+	.zero	8
+	.type	g_flash_six_addr, %object
+	.size	g_flash_six_addr, 1
+g_flash_six_addr:
+	.zero	1
+	.type	_c_ftl_cs_bits, %object
+	.size	_c_ftl_cs_bits, 1
+_c_ftl_cs_bits:
 	.zero	1
-	.type	g_block_align_addr, %object
-	.size	g_block_align_addr, 2
-g_block_align_addr:
 	.zero	2
-	.type	g_lsb_page_tbl, %object
-	.size	g_lsb_page_tbl, 1024
-g_lsb_page_tbl:
-	.zero	1024
-	.type	g_nandc_ver, %object
-	.size	g_nandc_ver, 1
-g_nandc_ver:
+	.type	g_flash_cur_mode, %object
+	.size	g_flash_cur_mode, 4
+g_flash_cur_mode:
+	.zero	4
+	.type	g_flash_micron_3d_tlc_flag, %object
+	.size	g_flash_micron_3d_tlc_flag, 1
+g_flash_micron_3d_tlc_flag:
+	.zero	1
+	.type	g_flash_ymtc_3d_tlc_flag, %object
+	.size	g_flash_ymtc_3d_tlc_flag, 1
+g_flash_ymtc_3d_tlc_flag:
+	.zero	1
+	.zero	2
+	.type	IDByte, %object
+	.size	IDByte, 32
+IDByte:
+	.zero	32
+	.type	g_flash_interface_mode, %object
+	.size	g_flash_interface_mode, 1
+g_flash_interface_mode:
+	.zero	1
+	.type	g_nandc_ecc_bits, %object
+	.size	g_nandc_ecc_bits, 1
+g_nandc_ecc_bits:
+	.zero	1
+	.type	g_flash_multi_page_prog_en, %object
+	.size	g_flash_multi_page_prog_en, 1
+g_flash_multi_page_prog_en:
+	.zero	1
+	.type	nandc_hw_seed, %object
+	.size	nandc_hw_seed, 1
+nandc_hw_seed:
+	.zero	1
+	.type	nandc_randomizer_en, %object
+	.size	nandc_randomizer_en, 1
+nandc_randomizer_en:
 	.zero	1
 	.zero	3
-	.type	_c_user_data_density, %object
-	.size	_c_user_data_density, 4
-_c_user_data_density:
+	.type	g_nandc_v6_master_info, %object
+	.size	g_nandc_v6_master_info, 40
+g_nandc_v6_master_info:
+	.zero	40
+	.type	fill_spare_size, %object
+	.size	fill_spare_size, 2
+fill_spare_size:
+	.zero	2
+	.zero	6
+	.type	g_buf, %object
+	.size	g_buf, 2048
+g_buf:
+	.zero	2048
+	.type	p_free_buf_head, %object
+	.size	p_free_buf_head, 1
+p_free_buf_head:
+	.zero	1
+	.type	free_buf_count, %object
+	.size	free_buf_count, 1
+free_buf_count:
+	.zero	1
+	.type	sblk_queue_head, %object
+	.size	sblk_queue_head, 1
+sblk_queue_head:
+	.zero	1
+	.type	sblk_read_completed_queue_head, %object
+	.size	sblk_read_completed_queue_head, 1
+sblk_read_completed_queue_head:
+	.zero	1
+	.type	sblk_gc_write_completed_queue_head, %object
+	.size	sblk_gc_write_completed_queue_head, 1
+sblk_gc_write_completed_queue_head:
+	.zero	1
+	.type	sblk_write_completed_queue_head, %object
+	.size	sblk_write_completed_queue_head, 1
+sblk_write_completed_queue_head:
+	.zero	1
+	.zero	2
+	.type	_c_totle_phy_density, %object
+	.size	_c_totle_phy_density, 4
+_c_totle_phy_density:
 	.zero	4
+	.type	_c_totle_log_page, %object
+	.size	_c_totle_log_page, 4
+_c_totle_log_page:
 	.zero	4
-	.type	gp_sblk_list_tbl, %object
-	.size	gp_sblk_list_tbl, 8
-gp_sblk_list_tbl:
-	.zero	8
-	.type	gp_nandc, %object
-	.size	gp_nandc, 8
-gp_nandc:
+	.type	free_slc_sblk, %object
+	.size	free_slc_sblk, 2
+free_slc_sblk:
+	.zero	2
+	.type	free_xlc_sblk, %object
+	.size	free_xlc_sblk, 2
+free_xlc_sblk:
+	.zero	2
+	.type	free_mix_sblk, %object
+	.size	free_mix_sblk, 2
+free_mix_sblk:
+	.zero	2
+	.type	slc_data_sblk, %object
+	.size	slc_data_sblk, 2
+slc_data_sblk:
+	.zero	2
+	.type	slc_cache_sblk, %object
+	.size	slc_cache_sblk, 2
+slc_cache_sblk:
+	.zero	2
+	.type	xlc_data_sblk, %object
+	.size	xlc_data_sblk, 2
+xlc_data_sblk:
+	.zero	2
+	.type	write_commit_count, %object
+	.size	write_commit_count, 1
+write_commit_count:
+	.zero	1
+	.type	write_buf_count, %object
+	.size	write_buf_count, 1
+write_buf_count:
+	.zero	1
+	.zero	2
+	.type	gp_ftl_info, %object
+	.size	gp_ftl_info, 8
+gp_ftl_info:
 	.zero	8
-	.type	NANDC_FMCTL, %object
-	.size	NANDC_FMCTL, 4
-NANDC_FMCTL:
-	.zero	4
-	.type	NANDC_FMWAIT, %object
-	.size	NANDC_FMWAIT, 4
-NANDC_FMWAIT:
-	.zero	4
-	.type	NANDC_FLCTL, %object
-	.size	NANDC_FLCTL, 4
-NANDC_FLCTL:
-	.zero	4
-	.type	NANDC_BCHCTL, %object
-	.size	NANDC_BCHCTL, 4
-NANDC_BCHCTL:
-	.zero	4
-	.type	NANDC_DLL_CTL_REG0, %object
-	.size	NANDC_DLL_CTL_REG0, 4
-NANDC_DLL_CTL_REG0:
-	.zero	4
-	.type	NANDC_DLL_CTL_REG1, %object
-	.size	NANDC_DLL_CTL_REG1, 4
-NANDC_DLL_CTL_REG1:
+	.type	gc_free_slc_sblk_th, %object
+	.size	gc_free_slc_sblk_th, 2
+gc_free_slc_sblk_th:
+	.zero	2
+	.zero	2
+	.type	_gc_after_discard_en, %object
+	.size	_gc_after_discard_en, 4
+_gc_after_discard_en:
 	.zero	4
-	.type	NANDC_RANDMZ_CFG, %object
-	.size	NANDC_RANDMZ_CFG, 4
-NANDC_RANDMZ_CFG:
+	.type	gc_slc_mode_tlc_vpn_th, %object
+	.size	gc_slc_mode_tlc_vpn_th, 2
+gc_slc_mode_tlc_vpn_th:
+	.zero	2
+	.type	gc_slc_mode_vpn_th, %object
+	.size	gc_slc_mode_vpn_th, 2
+gc_slc_mode_vpn_th:
+	.zero	2
+	.type	gc_tlc_mode_slc_vpn_th, %object
+	.size	gc_tlc_mode_slc_vpn_th, 2
+gc_tlc_mode_slc_vpn_th:
+	.zero	2
+	.type	gc_tlc_mode_tlc_vpn_th, %object
+	.size	gc_tlc_mode_tlc_vpn_th, 2
+gc_tlc_mode_tlc_vpn_th:
+	.zero	2
+	.type	write_buf_head, %object
+	.size	write_buf_head, 1
+write_buf_head:
+	.zero	1
+	.zero	7
+	.type	g_gc_info, %object
+	.size	g_gc_info, 2216
+g_gc_info:
+	.zero	2216
+	.type	ftl_sblk_vpn_update_id, %object
+	.size	ftl_sblk_vpn_update_id, 2
+ftl_sblk_vpn_update_id:
+	.zero	2
+	.zero	6
+	.type	ftl_sblk_update_list, %object
+	.size	ftl_sblk_update_list, 16
+ftl_sblk_update_list:
+	.zero	16
+	.type	_c_ftl_block_addr_log2, %object
+	.size	_c_ftl_block_addr_log2, 2
+_c_ftl_block_addr_log2:
+	.zero	2
+	.type	_c_ftl_planes_per_die, %object
+	.size	_c_ftl_planes_per_die, 1
+_c_ftl_planes_per_die:
+	.zero	1
+	.zero	5
+	.type	gc_valid_page_ppa, %object
+	.size	gc_valid_page_ppa, 8
+gc_valid_page_ppa:
+	.zero	8
+	.type	_c_ftl_nand_type, %object
+	.size	_c_ftl_nand_type, 1
+_c_ftl_nand_type:
+	.zero	1
+	.type	_c_ftl_nand_planes_num, %object
+	.size	_c_ftl_nand_planes_num, 1
+_c_ftl_nand_planes_num:
+	.zero	1
+	.type	g_flash_3d_mlc_flag, %object
+	.size	g_flash_3d_mlc_flag, 1
+g_flash_3d_mlc_flag:
+	.zero	1
+	.type	g_one_pass_program, %object
+	.size	g_one_pass_program, 1
+g_one_pass_program:
+	.zero	1
 	.zero	4
-	.type	NANDC_FMWAIT_SYN, %object
-	.size	NANDC_FMWAIT_SYN, 4
-NANDC_FMWAIT_SYN:
+	.type	gc_page_buf_id, %object
+	.size	gc_page_buf_id, 8
+gc_page_buf_id:
+	.zero	8
+	.type	g_flash_3d_tlc_flag, %object
+	.size	g_flash_3d_tlc_flag, 1
+g_flash_3d_tlc_flag:
+	.zero	1
+	.type	gc_mode, %object
+	.size	gc_mode, 1
+gc_mode:
+	.zero	1
+	.type	_c_ftl_page_pre_blk, %object
+	.size	_c_ftl_page_pre_blk, 2
+_c_ftl_page_pre_blk:
+	.zero	2
 	.zero	4
-	.type	_c_ftl_blk_pre_plane, %object
-	.size	_c_ftl_blk_pre_plane, 2
-_c_ftl_blk_pre_plane:
+	.type	gp_data_slc_data_head, %object
+	.size	gp_data_slc_data_head, 8
+gp_data_slc_data_head:
+	.zero	8
+	.type	gc_slc_data_index, %object
+	.size	gc_slc_data_index, 2
+gc_slc_data_index:
 	.zero	2
-	.zero	6
-	.type	gp_blk_info, %object
-	.size	gp_blk_info, 8
-gp_blk_info:
+	.type	gc_slc_cache_index, %object
+	.size	gc_slc_cache_index, 2
+gc_slc_cache_index:
+	.zero	2
+	.type	gc_xlc_data_index, %object
+	.size	gc_xlc_data_index, 2
+gc_xlc_data_index:
+	.zero	2
+	.zero	2
+	.type	gp_data_slc_cache_head, %object
+	.size	gp_data_slc_cache_head, 8
+gp_data_slc_cache_head:
 	.zero	8
-	.type	_c_slc_to_xlc_ec_ratio, %object
-	.size	_c_slc_to_xlc_ec_ratio, 2
-_c_slc_to_xlc_ec_ratio:
+	.type	gp_data_xlc_data_head, %object
+	.size	gp_data_xlc_data_head, 8
+gp_data_xlc_data_head:
+	.zero	8
+	.type	_c_ftl_page_pre_slc_blk, %object
+	.size	_c_ftl_page_pre_slc_blk, 2
+_c_ftl_page_pre_slc_blk:
 	.zero	2
-	.zero	6
-	.type	ftl_sblk_vpn, %object
-	.size	ftl_sblk_vpn, 8
-ftl_sblk_vpn:
+	.type	gc_xlc_search_index, %object
+	.size	gc_xlc_search_index, 2
+gc_xlc_search_index:
+	.zero	2
+	.type	_min_slc_super_block, %object
+	.size	_min_slc_super_block, 2
+_min_slc_super_block:
+	.zero	2
+	.type	_max_xlc_super_block, %object
+	.size	_max_xlc_super_block, 2
+_max_xlc_super_block:
+	.zero	2
+	.type	gp_free_slc_head, %object
+	.size	gp_free_slc_head, 8
+gp_free_slc_head:
 	.zero	8
-	.type	gp_ftl_ext_info, %object
-	.size	gp_ftl_ext_info, 8
-gp_ftl_ext_info:
+	.type	gp_free_xlc_head, %object
+	.size	gp_free_xlc_head, 8
+gp_free_xlc_head:
 	.zero	8
-	.type	gp_flash_info, %object
-	.size	gp_flash_info, 8
-gp_flash_info:
+	.type	gp_free_mix_head, %object
+	.size	gp_free_mix_head, 8
+gp_free_mix_head:
 	.zero	8
-	.type	g_retryMode, %object
-	.size	g_retryMode, 1
-g_retryMode:
-	.zero	1
-	.type	g_maxRegNum, %object
-	.size	g_maxRegNum, 1
-g_maxRegNum:
+	.type	zftl_print_list_count, %object
+	.size	zftl_print_list_count, 2
+zftl_print_list_count:
+	.zero	2
+	.type	_c_ftl_block_align_addr, %object
+	.size	_c_ftl_block_align_addr, 2
+_c_ftl_block_align_addr:
+	.zero	2
+	.type	_c_ftl_nand_die_num, %object
+	.size	_c_ftl_nand_die_num, 1
+_c_ftl_nand_die_num:
 	.zero	1
-	.zero	6
-	.type	gp_nand_para_info, %object
-	.size	gp_nand_para_info, 8
-gp_nand_para_info:
+	.zero	3
+	.type	lpa_hash, %object
+	.size	lpa_hash, 512
+lpa_hash:
+	.zero	512
+	.type	ftl_sblk_lpa_tbl, %object
+	.size	ftl_sblk_lpa_tbl, 8
+ftl_sblk_lpa_tbl:
 	.zero	8
-	.type	g_idb_ecc_bits, %object
-	.size	g_idb_ecc_bits, 1
-g_idb_ecc_bits:
+	.type	lpa_hash_index, %object
+	.size	lpa_hash_index, 8
+lpa_hash_index:
+	.zero	8
+	.type	ftl_vpn_update_count, %object
+	.size	ftl_vpn_update_count, 2
+ftl_vpn_update_count:
+	.zero	2
+	.type	_c_ftl_sec_per_page, %object
+	.size	_c_ftl_sec_per_page, 1
+_c_ftl_sec_per_page:
 	.zero	1
-	.type	g_nand_max_die, %object
-	.size	g_nand_max_die, 1
-g_nand_max_die:
 	.zero	1
-	.type	g_idb_slc_mode_enable, %object
-	.size	g_idb_slc_mode_enable, 1
-g_idb_slc_mode_enable:
+	.type	ftl_sblk_update_list_offset, %object
+	.size	ftl_sblk_update_list_offset, 2
+ftl_sblk_update_list_offset:
+	.zero	2
+	.type	g_flash_micron_3d_tlc_b05a, %object
+	.size	g_flash_micron_3d_tlc_b05a, 1
+g_flash_micron_3d_tlc_b05a:
 	.zero	1
-	.zero	5
-	.type	g_nand_opt_para, %object
-	.size	g_nand_opt_para, 32
-g_nand_opt_para:
-	.zero	32
-	.type	g_flash_toggle_mode_en, %object
-	.size	g_flash_toggle_mode_en, 1
-g_flash_toggle_mode_en:
 	.zero	1
-	.type	nandc_hw_seed, %object
-	.size	nandc_hw_seed, 1
-nandc_hw_seed:
+	.type	_c_mix_max_xlc_ec_count, %object
+	.size	_c_mix_max_xlc_ec_count, 2
+_c_mix_max_xlc_ec_count:
+	.zero	2
+	.type	_c_mix_max_slc_ec_count, %object
+	.size	_c_mix_max_slc_ec_count, 2
+_c_mix_max_slc_ec_count:
+	.zero	2
+	.type	read_buf_head, %object
+	.size	read_buf_head, 1
+read_buf_head:
 	.zero	1
-	.zero	6
-	.type	g_nandc_v6_master_info, %object
-	.size	g_nandc_v6_master_info, 40
-g_nandc_v6_master_info:
-	.zero	40
-	.type	nandc_randomizer_en, %object
-	.size	nandc_randomizer_en, 1
-nandc_randomizer_en:
+	.type	read_buf_count, %object
+	.size	read_buf_count, 1
+read_buf_count:
+	.zero	1
+	.zero	2
+	.type	pm_ram_info, %object
+	.size	pm_ram_info, 512
+pm_ram_info:
+	.zero	512
+	.type	pm_last_update_ram_id, %object
+	.size	pm_last_update_ram_id, 1
+pm_last_update_ram_id:
+	.zero	1
+	.zero	3
+	.type	g_msb_page_tbl, %object
+	.size	g_msb_page_tbl, 2048
+g_msb_page_tbl:
+	.zero	2048
+	.type	g_slc_page_num, %object
+	.size	g_slc_page_num, 2
+g_slc_page_num:
+	.zero	2
+	.zero	2
+	.type	g_die_addr, %object
+	.size	g_die_addr, 32
+g_die_addr:
+	.zero	32
+	.type	g_totle_phy_block, %object
+	.size	g_totle_phy_block, 2
+g_totle_phy_block:
+	.zero	2
+	.zero	2
+	.type	pm_force_gc, %object
+	.size	pm_force_gc, 4
+pm_force_gc:
+	.zero	4
+	.type	_c_swl_slc_gc_th, %object
+	.size	_c_swl_slc_gc_th, 2
+_c_swl_slc_gc_th:
+	.zero	2
+	.type	_c_swl_xlc_gc_th, %object
+	.size	_c_swl_xlc_gc_th, 2
+_c_swl_xlc_gc_th:
+	.zero	2
+	.type	_c_max_pm_sblk, %object
+	.size	_c_max_pm_sblk, 2
+_c_max_pm_sblk:
+	.zero	2
+	.zero	2
+	.type	power_on_init_jiffies, %object
+	.size	power_on_init_jiffies, 8
+power_on_init_jiffies:
+	.zero	8
+	.type	gp_ftl_api, %object
+	.size	gp_ftl_api, 8
+gp_ftl_api:
+	.zero	8
+	.type	RK29_NANDC_REG_BASE, %object
+	.size	RK29_NANDC_REG_BASE, 8
+RK29_NANDC_REG_BASE:
+	.zero	8
+	.type	ftl_dma32_buffer_size, %object
+	.size	ftl_dma32_buffer_size, 4
+ftl_dma32_buffer_size:
+	.zero	4
+	.zero	4
+	.type	ftl_dma32_buffer, %object
+	.size	ftl_dma32_buffer, 8
+ftl_dma32_buffer:
+	.zero	8
+	.type	gc_state, %object
+	.size	gc_state, 1
+gc_state:
 	.zero	1
+	.zero	3
+	.type	gc_search_count, %object
+	.size	gc_search_count, 4
+gc_search_count:
+	.zero	4
+	.type	gc_slc_mode_slc_vpn_th, %object
+	.size	gc_slc_mode_slc_vpn_th, 2
+gc_slc_mode_slc_vpn_th:
+	.zero	2
+	.zero	6
+	.type	gc_lpa_tbl, %object
+	.size	gc_lpa_tbl, 8
+gc_lpa_tbl:
+	.zero	8
+	.type	gc_pre_ppa_tbl, %object
+	.size	gc_pre_ppa_tbl, 8
+gc_pre_ppa_tbl:
+	.zero	8
+	.type	gc_des_ppa_tbl, %object
+	.size	gc_des_ppa_tbl, 8
+gc_des_ppa_tbl:
+	.zero	8
+	.type	g_flash_tmp_page_buffer, %object
+	.size	g_flash_tmp_page_buffer, 8
+g_flash_tmp_page_buffer:
+	.zero	8
+	.type	g_nandc_tran_timeout, %object
+	.size	g_nandc_tran_timeout, 1
+g_nandc_tran_timeout:
 	.zero	1
-	.type	fill_spare_size, %object
-	.size	fill_spare_size, 2
-fill_spare_size:
-	.zero	2
-	.type	g_nandc_ecc_bits, %object
-	.size	g_nandc_ecc_bits, 1
-g_nandc_ecc_bits:
+	.zero	7
+	.type	g_flash_tmp_spare_buffer, %object
+	.size	g_flash_tmp_spare_buffer, 8
+g_flash_tmp_spare_buffer:
+	.zero	8
+	.type	g_maxRetryCount, %object
+	.size	g_maxRetryCount, 1
+g_maxRetryCount:
 	.zero	1
 	.zero	3
-	.type	g_die_cs_idx, %object
-	.size	g_die_cs_idx, 8
-g_die_cs_idx:
+	.type	flash_ddr_tuning_sdr_read_count, %object
+	.size	flash_ddr_tuning_sdr_read_count, 4
+flash_ddr_tuning_sdr_read_count:
+	.zero	4
+	.type	flash_read_retry, %object
+	.size	flash_read_retry, 8
+flash_read_retry:
 	.zero	8
-	.type	g_flash_six_addr, %object
-	.size	g_flash_six_addr, 1
-g_flash_six_addr:
-	.zero	1
-	.type	_c_ftl_cs_bits, %object
-	.size	_c_ftl_cs_bits, 1
-_c_ftl_cs_bits:
+	.type	g_flash_spare_buffer, %object
+	.size	g_flash_spare_buffer, 8
+g_flash_spare_buffer:
+	.zero	8
+	.type	g_flash_page_buffer, %object
+	.size	g_flash_page_buffer, 8
+g_flash_page_buffer:
+	.zero	8
+	.type	write_commit_head, %object
+	.size	write_commit_head, 1
+write_commit_head:
 	.zero	1
-	.zero	6
-	.type	g_flash_cur_mode, %object
-	.size	g_flash_cur_mode, 4
-g_flash_cur_mode:
+	.zero	3
+	.type	ftl_flush_jiffies, %object
+	.size	ftl_flush_jiffies, 4
+ftl_flush_jiffies:
 	.zero	4
-	.type	g_flash_micron_3d_tlc_flag, %object
-	.size	g_flash_micron_3d_tlc_flag, 1
-g_flash_micron_3d_tlc_flag:
-	.zero	1
-	.type	g_flash_ymtc_3d_tlc_flag, %object
-	.size	g_flash_ymtc_3d_tlc_flag, 1
-g_flash_ymtc_3d_tlc_flag:
+	.type	g_flash_multi_page_read_en, %object
+	.size	g_flash_multi_page_read_en, 1
+g_flash_multi_page_read_en:
 	.zero	1
-	.zero	2
-	.type	IDByte, %object
-	.size	IDByte, 32
-IDByte:
-	.zero	32
-	.type	g_flash_interface_mode, %object
-	.size	g_flash_interface_mode, 1
-g_flash_interface_mode:
+	.zero	7
+	.type	ftl_info_spare, %object
+	.size	ftl_info_spare, 8
+ftl_info_spare:
+	.zero	8
+	.type	g_ftl_info_blk, %object
+	.size	g_ftl_info_blk, 4
+g_ftl_info_blk:
+	.zero	4
+	.zero	4
+	.type	ftl_info_data_buffer, %object
+	.size	ftl_info_data_buffer, 8
+ftl_info_data_buffer:
+	.zero	8
+	.type	ftl_sys_info_first_write, %object
+	.size	ftl_sys_info_first_write, 1
+ftl_sys_info_first_write:
 	.zero	1
-	.type	g_flash_multi_page_prog_en, %object
-	.size	g_flash_multi_page_prog_en, 1
-g_flash_multi_page_prog_en:
+	.type	ftl_power_lost_flag, %object
+	.size	ftl_power_lost_flag, 1
+ftl_power_lost_flag:
 	.zero	1
-	.zero	6
-	.type	g_buf, %object
-	.size	g_buf, 2048
-g_buf:
-	.zero	2048
-	.type	_c_ftl_sec_per_page, %object
-	.size	_c_ftl_sec_per_page, 1
-_c_ftl_sec_per_page:
+	.type	ftl_ext_info_first_write, %object
+	.size	ftl_ext_info_first_write, 1
+ftl_ext_info_first_write:
 	.zero	1
-	.type	p_free_buf_head, %object
-	.size	p_free_buf_head, 1
-p_free_buf_head:
+	.zero	5
+	.type	ftl_ext_info_data_buffer, %object
+	.size	ftl_ext_info_data_buffer, 8
+ftl_ext_info_data_buffer:
+	.zero	8
+	.type	ftl_tmp_spare, %object
+	.size	ftl_tmp_spare, 8
+ftl_tmp_spare:
+	.zero	8
+	.type	pm_gc_enable, %object
+	.size	pm_gc_enable, 4
+pm_gc_enable:
+	.zero	4
+	.zero	4
+	.type	g_pm_spare, %object
+	.size	g_pm_spare, 8
+g_pm_spare:
+	.zero	8
+	.type	pm_first_write, %object
+	.size	pm_first_write, 1
+pm_first_write:
 	.zero	1
-	.type	free_buf_count, %object
-	.size	free_buf_count, 1
-free_buf_count:
+	.zero	7
+	.type	g_flash_sys_spare_buffer, %object
+	.size	g_flash_sys_spare_buffer, 8
+g_flash_sys_spare_buffer:
+	.zero	8
+	.type	g_flash_blk_info, %object
+	.size	g_flash_blk_info, 4
+g_flash_blk_info:
+	.zero	4
+	.type	g_flash_reversd_blks, %object
+	.size	g_flash_reversd_blks, 1
+g_flash_reversd_blks:
 	.zero	1
-	.type	sblk_queue_head, %object
-	.size	sblk_queue_head, 1
-sblk_queue_head:
+	.type	g_flash_micron_3d_tlc_b16a, %object
+	.size	g_flash_micron_3d_tlc_b16a, 1
+g_flash_micron_3d_tlc_b16a:
 	.zero	1
-	.type	sblk_read_completed_queue_head, %object
-	.size	sblk_read_completed_queue_head, 1
-sblk_read_completed_queue_head:
+	.type	_c_ftl_byte_pre_page, %object
+	.size	_c_ftl_byte_pre_page, 2
+_c_ftl_byte_pre_page:
+	.zero	2
+	.type	pm_last_load_ram_id, %object
+	.size	pm_last_load_ram_id, 1
+pm_last_load_ram_id:
 	.zero	1
-	.type	sblk_gc_write_completed_queue_head, %object
-	.size	sblk_gc_write_completed_queue_head, 1
-sblk_gc_write_completed_queue_head:
+	.type	_ftl_gc_tag_page_num, %object
+	.size	_ftl_gc_tag_page_num, 1
+_ftl_gc_tag_page_num:
 	.zero	1
-	.type	sblk_write_completed_queue_head, %object
-	.size	sblk_write_completed_queue_head, 1
-sblk_write_completed_queue_head:
+	.zero	2
+	.type	_last_read_time, %object
+	.size	_last_read_time, 4
+_last_read_time:
+	.zero	4
+	.type	_last_write_time, %object
+	.size	_last_write_time, 4
+_last_write_time:
+	.zero	4
+	.type	read_ahead_lpa, %object
+	.size	read_ahead_lpa, 4
+read_ahead_lpa:
+	.zero	4
+	.type	_c_totle_data_density, %object
+	.size	_c_totle_data_density, 4
+_c_totle_data_density:
+	.zero	4
+	.type	_c_ftl_pm_page_num, %object
+	.size	_c_ftl_pm_page_num, 2
+_c_ftl_pm_page_num:
+	.zero	2
+	.zero	2
+	.type	ftl_tmp_buffer, %object
+	.size	ftl_tmp_buffer, 8
+ftl_tmp_buffer:
+	.zero	8
+	.type	rk_zftl_enable, %object
+	.size	rk_zftl_enable, 1
+rk_zftl_enable:
 	.zero	1
+	.zero	7
+	.type	gLoaderBootInfo, %object
+	.size	gLoaderBootInfo, 8
+gLoaderBootInfo:
+	.zero	8
+	.type	RK29_NANDC1_REG_BASE, %object
+	.size	RK29_NANDC1_REG_BASE, 8
+RK29_NANDC1_REG_BASE:
+	.zero	8
+	.type	discard_sector_count, %object
+	.size	discard_sector_count, 4
+discard_sector_count:
+	.zero	4
+	.type	idb_write_enable, %object
+	.size	idb_write_enable, 1
+idb_write_enable:
 	.zero	1
-	.type	_c_totle_phy_density, %object
-	.size	_c_totle_phy_density, 4
-_c_totle_phy_density:
+	.zero	3
+	.type	idb_buf, %object
+	.size	idb_buf, 8
+idb_buf:
+	.zero	8
+	.type	idb_last_lba, %object
+	.size	idb_last_lba, 4
+idb_last_lba:
+	.zero	4
+	.zero	4
+	.type	gpDrmKeyInfo, %object
+	.size	gpDrmKeyInfo, 8
+gpDrmKeyInfo:
+	.zero	8
+	.type	SecureBootCheckOK, %object
+	.size	SecureBootCheckOK, 4
+SecureBootCheckOK:
+	.zero	4
+	.type	SecureBootEn, %object
+	.size	SecureBootEn, 4
+SecureBootEn:
+	.zero	4
+	.type	gpBootConfig, %object
+	.size	gpBootConfig, 8
+gpBootConfig:
+	.zero	8
+	.type	gSnSectorData, %object
+	.size	gSnSectorData, 512
+gSnSectorData:
+	.zero	512
+	.type	SecureBootUnlockTryCount, %object
+	.size	SecureBootUnlockTryCount, 4
+SecureBootUnlockTryCount:
 	.zero	4
-	.type	_c_totle_log_page, %object
-	.size	_c_totle_log_page, 4
-_c_totle_log_page:
 	.zero	4
-	.type	free_slc_sblk, %object
-	.size	free_slc_sblk, 2
-free_slc_sblk:
-	.zero	2
-	.type	free_xlc_sblk, %object
-	.size	free_xlc_sblk, 2
-free_xlc_sblk:
-	.zero	2
-	.type	free_mix_sblk, %object
-	.size	free_mix_sblk, 2
-free_mix_sblk:
-	.zero	2
-	.type	slc_data_sblk, %object
-	.size	slc_data_sblk, 2
-slc_data_sblk:
-	.zero	2
-	.type	slc_cache_sblk, %object
-	.size	slc_cache_sblk, 2
-slc_cache_sblk:
+	.type	gpVendor0Info, %object
+	.size	gpVendor0Info, 8
+gpVendor0Info:
+	.zero	8
+	.type	gpVendor1Info, %object
+	.size	gpVendor1Info, 8
+gpVendor1Info:
+	.zero	8
+	.type	g_idb_buffer, %object
+	.size	g_idb_buffer, 8
+g_idb_buffer:
+	.zero	8
+	.type	g_vendor, %object
+	.size	g_vendor, 8
+g_vendor:
+	.zero	8
+	.type	ftl_low_format_cur_blk, %object
+	.size	ftl_low_format_cur_blk, 2
+ftl_low_format_cur_blk:
 	.zero	2
-	.type	xlc_data_sblk, %object
-	.size	xlc_data_sblk, 2
-xlc_data_sblk:
+	.zero	6
+	.type	p_read_ahead_ext_buf, %object
+	.size	p_read_ahead_ext_buf, 8
+p_read_ahead_ext_buf:
+	.zero	8
+	.type	_c_ftl_nand_blks_per_die, %object
+	.size	_c_ftl_nand_blks_per_die, 2
+_c_ftl_nand_blks_per_die:
 	.zero	2
-	.type	write_buf_count, %object
-	.size	write_buf_count, 1
-write_buf_count:
+	.zero	6
+	.type	nandc_ecc_sts, %object
+	.size	nandc_ecc_sts, 16
+nandc_ecc_sts:
+	.zero	16
+	.type	g_slc_mode_enable, %object
+	.size	g_slc_mode_enable, 1
+g_slc_mode_enable:
 	.zero	1
-	.type	write_commit_count, %object
-	.size	write_commit_count, 1
-write_commit_count:
+	.section	.rodata
+	.align	3
+	.set	.LANCHOR1,. + 0
+	.type	__func__.39517, %object
+	.size	__func__.39517, 18
+__func__.39517:
+	.string	"_list_remove_node"
+	.zero	6
+	.type	__func__.39542, %object
+	.size	__func__.39542, 23
+__func__.39542:
+	.string	"_list_update_data_list"
 	.zero	1
+	.type	toshiba_15ref_value, %object
+	.size	toshiba_15ref_value, 95
+toshiba_15ref_value:
+	.byte	4
+	.byte	5
+	.byte	6
+	.byte	7
+	.byte	13
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	2
+	.byte	4
+	.byte	2
+	.byte	0
+	.byte	0
+	.byte	8
+	.byte	8
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	124
+	.byte	0
+	.byte	124
+	.byte	124
+	.byte	0
+	.byte	122
+	.byte	0
+	.byte	122
+	.byte	122
+	.byte	0
+	.byte	11
+	.byte	126
+	.byte	118
+	.byte	116
+	.byte	0
+	.byte	120
+	.byte	2
+	.byte	120
+	.byte	122
+	.byte	0
+	.byte	126
+	.byte	4
+	.byte	126
+	.byte	122
+	.byte	0
+	.byte	16
+	.byte	118
+	.byte	114
+	.byte	112
+	.byte	0
+	.byte	118
+	.byte	4
+	.byte	118
+	.byte	120
+	.byte	0
+	.byte	4
+	.byte	4
+	.byte	4
+	.byte	118
+	.byte	0
+	.byte	2
+	.byte	0
+	.byte	126
+	.byte	124
+	.byte	0
+	.byte	6
+	.byte	10
+	.byte	6
+	.byte	2
+	.byte	0
+	.byte	116
+	.byte	124
+	.byte	116
+	.byte	118
+	.byte	0
+	.byte	4
+	.byte	4
+	.byte	124
+	.byte	126
+	.byte	0
+	.byte	0
+	.byte	124
+	.byte	120
+	.byte	120
+	.byte	0
+	.byte	124
+	.byte	118
+	.byte	116
+	.byte	114
+	.byte	0
+	.zero	1
+	.type	toshiba_A19ref_value, %object
+	.size	toshiba_A19ref_value, 45
+toshiba_A19ref_value:
+	.byte	4
+	.byte	5
+	.byte	6
+	.byte	7
+	.byte	13
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	4
+	.byte	4
+	.byte	124
+	.byte	126
+	.byte	0
+	.byte	0
+	.byte	124
+	.byte	120
+	.byte	120
+	.byte	0
+	.byte	124
+	.byte	118
+	.byte	116
+	.byte	114
+	.byte	0
+	.byte	8
+	.byte	8
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	11
+	.byte	126
+	.byte	118
+	.byte	116
+	.byte	0
+	.byte	16
+	.byte	118
+	.byte	114
+	.byte	112
+	.byte	0
+	.byte	2
+	.byte	0
+	.byte	126
+	.byte	124
+	.byte	0
+	.zero	3
+	.type	toshiba_ref_value, %object
+	.size	toshiba_ref_value, 8
+toshiba_ref_value:
+	.byte	0
+	.byte	4
+	.byte	124
+	.byte	120
+	.byte	116
+	.byte	8
+	.byte	12
+	.byte	112
+	.type	__func__.20840, %object
+	.size	__func__.20840, 22
+__func__.20840:
+	.string	"nand_flash_print_info"
 	.zero	2
-	.type	gp_ftl_info, %object
-	.size	gp_ftl_info, 8
-gp_ftl_info:
-	.zero	8
-	.type	gc_free_slc_sblk_th, %object
-	.size	gc_free_slc_sblk_th, 2
-gc_free_slc_sblk_th:
-	.zero	2
-	.type	gc_tlc_mode_tlc_vpn_th, %object
-	.size	gc_tlc_mode_tlc_vpn_th, 2
-gc_tlc_mode_tlc_vpn_th:
-	.zero	2
-	.type	gc_tlc_mode_slc_vpn_th, %object
-	.size	gc_tlc_mode_slc_vpn_th, 2
-gc_tlc_mode_slc_vpn_th:
-	.zero	2
-	.type	gc_slc_mode_vpn_th, %object
-	.size	gc_slc_mode_vpn_th, 2
-gc_slc_mode_vpn_th:
-	.zero	2
-	.type	gc_slc_mode_tlc_vpn_th, %object
-	.size	gc_slc_mode_tlc_vpn_th, 2
-gc_slc_mode_tlc_vpn_th:
-	.zero	2
-	.zero	2
-	.type	_gc_after_discard_en, %object
-	.size	_gc_after_discard_en, 4
-_gc_after_discard_en:
+	.type	__func__.20313, %object
+	.size	__func__.20313, 28
+__func__.20313:
+	.string	"flash_wait_device_ready_raw"
 	.zero	4
-	.type	write_buf_head, %object
-	.size	write_buf_head, 1
-write_buf_head:
+	.type	__func__.20377, %object
+	.size	__func__.20377, 22
+__func__.20377:
+	.string	"flash_start_page_read"
+	.zero	2
+	.type	toshiba_3D_tlc_value, %object
+	.size	toshiba_3D_tlc_value, 399
+toshiba_3D_tlc_value:
+	.byte	-119
+	.byte	-119
+	.byte	-119
+	.byte	-119
+	.byte	-118
+	.byte	-118
+	.byte	-118
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	5
+	.byte	-2
+	.byte	-1
+	.byte	0
+	.byte	-3
+	.byte	-2
+	.byte	6
+	.byte	-9
+	.byte	-12
+	.byte	-9
+	.byte	-7
+	.byte	-13
+	.byte	-12
+	.byte	-7
+	.byte	-6
+	.byte	-15
+	.byte	-15
+	.byte	-2
+	.byte	-12
+	.byte	-16
+	.byte	-6
+	.byte	-2
+	.byte	-19
+	.byte	-19
+	.byte	-6
+	.byte	-4
+	.byte	-12
+	.byte	-14
+	.byte	-2
+	.byte	-11
+	.byte	-23
+	.byte	-34
+	.byte	-4
+	.byte	-20
+	.byte	-22
+	.byte	-2
+	.byte	-7
+	.byte	-31
+	.byte	-30
+	.byte	-12
+	.byte	-20
+	.byte	-18
+	.byte	2
+	.byte	-15
+	.byte	-19
+	.byte	-36
+	.byte	-12
+	.byte	-28
+	.byte	-34
+	.byte	-6
+	.byte	-15
+	.byte	-11
+	.byte	2
+	.byte	-12
+	.byte	-8
+	.byte	-2
+	.byte	2
+	.byte	-3
+	.byte	-7
+	.byte	-10
+	.byte	-4
+	.byte	-8
+	.byte	-6
+	.byte	-6
+	.byte	-11
+	.byte	-27
+	.byte	-38
+	.byte	-16
+	.byte	-12
+	.byte	-2
+	.byte	2
+	.byte	-7
+	.byte	-31
+	.byte	-22
+	.byte	-4
+	.byte	-16
+	.byte	-22
+	.byte	-7
+	.byte	-31
+	.byte	-23
+	.byte	-22
+	.byte	-28
+	.byte	-28
+	.byte	-26
+	.byte	2
+	.byte	-7
+	.byte	-11
+	.byte	-14
+	.byte	-8
+	.byte	-12
+	.byte	-10
+	.byte	-10
+	.byte	-27
+	.byte	-25
+	.byte	-22
+	.byte	-20
+	.byte	-28
+	.byte	-22
+	.byte	-7
+	.byte	-23
+	.byte	-29
+	.byte	-34
+	.byte	-24
+	.byte	-32
+	.byte	-22
+	.byte	-10
+	.byte	-11
+	.byte	-29
+	.byte	-18
+	.byte	-12
+	.byte	-24
+	.byte	-22
+	.byte	6
+	.byte	1
+	.byte	-3
+	.byte	-6
+	.byte	0
+	.byte	-4
+	.byte	-2
+	.byte	10
+	.byte	-3
+	.byte	-7
+	.byte	-6
+	.byte	4
+	.byte	-4
+	.byte	-2
+	.byte	-10
+	.byte	-23
+	.byte	-39
+	.byte	-22
+	.byte	-19
+	.byte	-24
+	.byte	-18
+	.byte	-14
+	.byte	-23
+	.byte	-29
+	.byte	-30
+	.byte	-15
+	.byte	-30
+	.byte	-30
+	.byte	-7
+	.byte	-27
+	.byte	-35
+	.byte	-26
+	.byte	-15
+	.byte	-24
+	.byte	-26
+	.byte	6
+	.byte	-11
+	.byte	5
+	.byte	-2
+	.byte	-16
+	.byte	-16
+	.byte	-2
+	.byte	-2
+	.byte	-15
+	.byte	-15
+	.byte	-20
+	.byte	-8
+	.byte	-16
+	.byte	-18
+	.byte	6
+	.byte	5
+	.byte	-15
+	.byte	-2
+	.byte	-24
+	.byte	-28
+	.byte	-22
+	.byte	10
+	.byte	-15
+	.byte	-3
+	.byte	-30
+	.byte	-8
+	.byte	-24
+	.byte	-30
+	.byte	-10
+	.byte	-27
+	.byte	-19
+	.byte	-30
+	.byte	-12
+	.byte	-16
+	.byte	-10
+	.byte	14
+	.byte	-19
+	.byte	-3
+	.byte	-30
+	.byte	4
+	.byte	4
+	.byte	6
+	.byte	2
+	.byte	1
+	.byte	-3
+	.byte	-10
+	.byte	-8
+	.byte	-4
+	.byte	-6
+	.byte	-2
+	.byte	-15
+	.byte	-11
+	.byte	-26
+	.byte	-8
+	.byte	-20
+	.byte	-30
+	.byte	6
+	.byte	-19
+	.byte	-3
+	.byte	-46
+	.byte	0
+	.byte	0
+	.byte	2
+	.byte	6
+	.byte	9
+	.byte	5
+	.byte	2
+	.byte	4
+	.byte	8
+	.byte	6
+	.byte	8
+	.byte	9
+	.byte	9
+	.byte	6
+	.byte	8
+	.byte	8
+	.byte	6
+	.byte	10
+	.byte	13
+	.byte	9
+	.byte	6
+	.byte	8
+	.byte	12
+	.byte	10
+	.byte	2
+	.byte	5
+	.byte	1
+	.byte	-2
+	.byte	0
+	.byte	0
+	.byte	6
+	.byte	12
+	.byte	1
+	.byte	13
+	.byte	2
+	.byte	12
+	.byte	12
+	.byte	14
+	.byte	-12
+	.byte	-14
+	.byte	-20
+	.byte	-18
+	.byte	-16
+	.byte	-16
+	.byte	-14
+	.byte	-12
+	.byte	-10
+	.byte	-21
+	.byte	-14
+	.byte	-12
+	.byte	-12
+	.byte	-10
+	.byte	-12
+	.byte	-18
+	.byte	-22
+	.byte	-24
+	.byte	-18
+	.byte	-18
+	.byte	-18
+	.byte	-12
+	.byte	-14
+	.byte	-23
+	.byte	-20
+	.byte	-20
+	.byte	-20
+	.byte	-20
+	.byte	-12
+	.byte	-24
+	.byte	-24
+	.byte	-30
+	.byte	-24
+	.byte	-28
+	.byte	-28
+	.byte	-12
+	.byte	-26
+	.byte	-25
+	.byte	-34
+	.byte	-24
+	.byte	-24
+	.byte	-24
+	.byte	-12
+	.byte	-13
+	.byte	-26
+	.byte	-20
+	.byte	-14
+	.byte	-18
+	.byte	-18
+	.byte	-12
+	.byte	-15
+	.byte	-27
+	.byte	-22
+	.byte	-20
+	.byte	-24
+	.byte	-22
+	.byte	-12
+	.byte	-21
+	.byte	-28
+	.byte	-28
+	.byte	-24
+	.byte	-26
+	.byte	-24
+	.byte	20
+	.byte	16
+	.byte	6
+	.byte	10
+	.byte	16
+	.byte	12
+	.byte	12
+	.byte	16
+	.byte	16
+	.byte	8
+	.byte	8
+	.byte	12
+	.byte	12
+	.byte	12
+	.byte	18
+	.byte	18
+	.byte	10
+	.byte	8
+	.byte	14
+	.byte	14
+	.byte	14
+	.byte	16
+	.byte	14
+	.byte	6
+	.byte	6
+	.byte	12
+	.byte	14
+	.byte	8
+	.byte	20
+	.byte	18
+	.byte	8
+	.byte	6
+	.byte	14
+	.byte	14
+	.byte	10
+	.byte	20
+	.byte	20
+	.byte	6
+	.byte	10
+	.byte	10
+	.byte	12
+	.byte	12
+	.byte	10
+	.byte	13
+	.byte	5
+	.byte	2
+	.byte	14
+	.byte	8
+	.byte	6
+	.byte	6
+	.byte	13
+	.byte	9
+	.byte	4
+	.byte	14
+	.byte	10
+	.byte	10
+	.byte	10
+	.byte	13
+	.byte	9
+	.byte	6
+	.byte	8
+	.byte	12
+	.byte	10
+	.byte	2
+	.byte	5
+	.byte	1
+	.byte	-2
+	.byte	0
+	.byte	0
+	.byte	6
+	.byte	12
+	.byte	1
+	.byte	13
+	.byte	2
+	.byte	12
+	.byte	12
+	.byte	14
 	.zero	1
-	.zero	7
-	.type	g_gc_info, %object
-	.size	g_gc_info, 2216
-g_gc_info:
-	.zero	2216
-	.type	ftl_sblk_vpn_update_id, %object
-	.size	ftl_sblk_vpn_update_id, 2
-ftl_sblk_vpn_update_id:
-	.zero	2
+	.type	toshiba_3D_slc_value, %object
+	.size	toshiba_3D_slc_value, 11
+toshiba_3D_slc_value:
+	.byte	-117
+	.byte	0
+	.byte	-8
+	.byte	8
+	.byte	-16
+	.byte	-24
+	.byte	24
+	.byte	-40
+	.byte	40
+	.byte	-56
+	.byte	56
+	.zero	5
+	.type	ymtc_3D_tlc_value, %object
+	.size	ymtc_3D_tlc_value, 357
+ymtc_3D_tlc_value:
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	-10
+	.byte	-10
+	.byte	-6
+	.byte	-6
+	.byte	-2
+	.byte	2
+	.byte	2
+	.byte	-6
+	.byte	-6
+	.byte	-4
+	.byte	-4
+	.byte	-4
+	.byte	-6
+	.byte	-8
+	.byte	6
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	-2
+	.byte	-2
+	.byte	-2
+	.byte	-4
+	.byte	-4
+	.byte	-6
+	.byte	-6
+	.byte	-6
+	.byte	-6
+	.byte	-6
+	.byte	-6
+	.byte	-6
+	.byte	-6
+	.byte	-11
+	.byte	-2
+	.byte	2
+	.byte	4
+	.byte	4
+	.byte	6
+	.byte	6
+	.byte	6
+	.byte	-6
+	.byte	-6
+	.byte	-6
+	.byte	-6
+	.byte	-6
+	.byte	-8
+	.byte	-14
+	.byte	-6
+	.byte	-15
+	.byte	-11
+	.byte	2
+	.byte	-12
+	.byte	-8
+	.byte	-2
+	.byte	2
+	.byte	-3
+	.byte	-7
+	.byte	-10
+	.byte	-4
+	.byte	-8
+	.byte	-6
+	.byte	-18
+	.byte	-18
+	.byte	-14
+	.byte	-14
+	.byte	-10
+	.byte	-5
+	.byte	-5
+	.byte	-14
+	.byte	-14
+	.byte	-12
+	.byte	-12
+	.byte	-12
+	.byte	-13
+	.byte	-15
+	.byte	-2
+	.byte	-8
+	.byte	-8
+	.byte	-8
+	.byte	-8
+	.byte	-7
+	.byte	-7
+	.byte	-10
+	.byte	-10
+	.byte	-10
+	.byte	-12
+	.byte	-12
+	.byte	-13
+	.byte	-13
+	.byte	-14
+	.byte	-14
+	.byte	-14
+	.byte	-14
+	.byte	-14
+	.byte	-13
+	.byte	-18
+	.byte	-10
+	.byte	-6
+	.byte	-4
+	.byte	-4
+	.byte	-2
+	.byte	-1
+	.byte	-1
+	.byte	-14
+	.byte	-14
+	.byte	-14
+	.byte	-14
+	.byte	-14
+	.byte	-15
+	.byte	-21
+	.byte	-12
+	.byte	-11
+	.byte	-7
+	.byte	-7
+	.byte	-3
+	.byte	1
+	.byte	1
+	.byte	-8
+	.byte	-7
+	.byte	-5
+	.byte	-5
+	.byte	-5
+	.byte	-7
+	.byte	-9
+	.byte	4
+	.byte	-1
+	.byte	-1
+	.byte	-1
+	.byte	-1
+	.byte	-1
+	.byte	-1
+	.byte	-4
+	.byte	-3
+	.byte	-3
+	.byte	-5
+	.byte	-5
+	.byte	-7
+	.byte	-7
+	.byte	-8
+	.byte	-7
+	.byte	-7
+	.byte	-7
+	.byte	-7
+	.byte	-7
+	.byte	-12
+	.byte	-4
+	.byte	1
+	.byte	3
+	.byte	3
+	.byte	5
+	.byte	5
+	.byte	5
+	.byte	-8
+	.byte	-7
+	.byte	-7
+	.byte	-7
+	.byte	-7
+	.byte	-9
+	.byte	-15
+	.byte	2
+	.byte	-7
+	.byte	-11
+	.byte	-14
+	.byte	-8
+	.byte	-12
+	.byte	-10
+	.byte	6
+	.byte	1
+	.byte	-3
+	.byte	-6
+	.byte	0
+	.byte	-4
+	.byte	-2
+	.byte	10
+	.byte	-3
+	.byte	-7
+	.byte	-6
+	.byte	4
+	.byte	-4
+	.byte	-2
+	.byte	-10
+	.byte	-23
+	.byte	-39
+	.byte	-22
+	.byte	-19
+	.byte	-24
+	.byte	-18
+	.byte	-7
+	.byte	-27
+	.byte	-35
+	.byte	-26
+	.byte	-15
+	.byte	-24
+	.byte	-26
+	.byte	6
+	.byte	-11
+	.byte	5
+	.byte	-2
+	.byte	-16
+	.byte	-16
+	.byte	-2
+	.byte	-2
+	.byte	-15
+	.byte	-15
+	.byte	-20
+	.byte	-8
+	.byte	-16
+	.byte	-18
+	.byte	2
+	.byte	1
+	.byte	-3
+	.byte	-10
+	.byte	-8
+	.byte	-4
+	.byte	-6
+	.byte	-2
+	.byte	-15
+	.byte	-11
+	.byte	-26
+	.byte	-8
+	.byte	-20
+	.byte	-30
+	.byte	6
+	.byte	-19
+	.byte	-3
+	.byte	-46
+	.byte	0
+	.byte	0
+	.byte	2
+	.byte	6
+	.byte	9
+	.byte	5
+	.byte	2
+	.byte	4
+	.byte	8
+	.byte	6
+	.byte	8
+	.byte	9
+	.byte	9
+	.byte	6
+	.byte	8
+	.byte	8
+	.byte	6
+	.byte	10
+	.byte	13
+	.byte	9
+	.byte	6
+	.byte	8
+	.byte	12
+	.byte	10
+	.byte	2
+	.byte	5
+	.byte	1
+	.byte	-2
+	.byte	0
+	.byte	0
+	.byte	6
+	.byte	12
+	.byte	1
+	.byte	13
+	.byte	2
+	.byte	12
+	.byte	12
+	.byte	14
+	.byte	-12
+	.byte	-14
+	.byte	-20
+	.byte	-18
+	.byte	-16
+	.byte	-16
+	.byte	-14
+	.byte	-12
+	.byte	-10
+	.byte	-21
+	.byte	-14
+	.byte	-12
+	.byte	-12
+	.byte	-10
+	.byte	-12
+	.byte	-18
+	.byte	-22
+	.byte	-24
+	.byte	-18
+	.byte	-18
+	.byte	-18
+	.byte	-12
+	.byte	-14
+	.byte	-23
+	.byte	-20
+	.byte	-20
+	.byte	-20
+	.byte	-20
+	.byte	16
+	.byte	16
+	.byte	8
+	.byte	8
+	.byte	12
+	.byte	12
+	.byte	12
+	.byte	18
+	.byte	18
+	.byte	10
+	.byte	8
+	.byte	14
+	.byte	14
+	.byte	14
+	.byte	16
+	.byte	14
+	.byte	6
+	.byte	6
+	.byte	12
+	.byte	14
+	.byte	8
+	.byte	10
+	.byte	13
+	.byte	5
+	.byte	2
+	.byte	14
+	.byte	8
+	.byte	6
+	.byte	6
+	.byte	13
+	.byte	9
+	.byte	4
+	.byte	14
+	.byte	10
+	.byte	10
+	.byte	10
+	.byte	13
+	.byte	9
+	.byte	6
+	.byte	8
+	.byte	12
+	.byte	10
+	.byte	2
+	.byte	5
+	.byte	1
+	.byte	-2
+	.byte	0
+	.byte	0
+	.byte	6
+	.byte	12
+	.byte	1
+	.byte	13
+	.byte	2
+	.byte	12
+	.byte	12
+	.byte	14
+	.zero	3
+	.type	ymtc_3D_slc_value, %object
+	.size	ymtc_3D_slc_value, 10
+ymtc_3D_slc_value:
+	.byte	0
+	.byte	-8
+	.byte	8
+	.byte	-16
+	.byte	-20
+	.byte	24
+	.byte	-26
+	.byte	40
+	.byte	-12
+	.byte	56
 	.zero	6
-	.type	ftl_sblk_update_list, %object
-	.size	ftl_sblk_update_list, 16
-ftl_sblk_update_list:
-	.zero	16
-	.type	_c_ftl_block_addr_log2, %object
-	.size	_c_ftl_block_addr_log2, 2
-_c_ftl_block_addr_log2:
-	.zero	2
-	.type	_c_ftl_planes_per_die, %object
-	.size	_c_ftl_planes_per_die, 1
-_c_ftl_planes_per_die:
-	.zero	1
-	.zero	5
-	.type	gc_valid_page_ppa, %object
-	.size	gc_valid_page_ppa, 8
-gc_valid_page_ppa:
-	.zero	8
-	.type	_c_ftl_nand_type, %object
-	.size	_c_ftl_nand_type, 1
-_c_ftl_nand_type:
-	.zero	1
-	.type	_c_ftl_nand_planes_num, %object
-	.size	_c_ftl_nand_planes_num, 1
-_c_ftl_nand_planes_num:
-	.zero	1
-	.type	g_flash_3d_mlc_flag, %object
-	.size	g_flash_3d_mlc_flag, 1
-g_flash_3d_mlc_flag:
-	.zero	1
-	.type	g_one_pass_program, %object
-	.size	g_one_pass_program, 1
-g_one_pass_program:
-	.zero	1
-	.zero	4
-	.type	gc_page_buf_id, %object
-	.size	gc_page_buf_id, 8
-gc_page_buf_id:
-	.zero	8
-	.type	g_flash_3d_tlc_flag, %object
-	.size	g_flash_3d_tlc_flag, 1
-g_flash_3d_tlc_flag:
-	.zero	1
-	.type	gc_mode, %object
-	.size	gc_mode, 1
-gc_mode:
-	.zero	1
-	.type	_c_ftl_page_pre_blk, %object
-	.size	_c_ftl_page_pre_blk, 2
-_c_ftl_page_pre_blk:
-	.zero	2
-	.zero	4
-	.type	gp_data_slc_data_head, %object
-	.size	gp_data_slc_data_head, 8
-gp_data_slc_data_head:
-	.zero	8
-	.type	gc_slc_data_index, %object
-	.size	gc_slc_data_index, 2
-gc_slc_data_index:
-	.zero	2
-	.type	gc_slc_cache_index, %object
-	.size	gc_slc_cache_index, 2
-gc_slc_cache_index:
-	.zero	2
-	.type	gc_xlc_data_index, %object
-	.size	gc_xlc_data_index, 2
-gc_xlc_data_index:
-	.zero	2
-	.zero	2
-	.type	gp_data_slc_cache_head, %object
-	.size	gp_data_slc_cache_head, 8
-gp_data_slc_cache_head:
-	.zero	8
-	.type	gp_data_xlc_data_head, %object
-	.size	gp_data_xlc_data_head, 8
-gp_data_xlc_data_head:
-	.zero	8
-	.type	_c_ftl_page_pre_slc_blk, %object
-	.size	_c_ftl_page_pre_slc_blk, 2
-_c_ftl_page_pre_slc_blk:
-	.zero	2
-	.type	gc_xlc_search_index, %object
-	.size	gc_xlc_search_index, 2
-gc_xlc_search_index:
-	.zero	2
-	.type	_min_slc_super_block, %object
-	.size	_min_slc_super_block, 2
-_min_slc_super_block:
-	.zero	2
-	.type	_max_xlc_super_block, %object
-	.size	_max_xlc_super_block, 2
-_max_xlc_super_block:
-	.zero	2
-	.type	gp_free_slc_head, %object
-	.size	gp_free_slc_head, 8
-gp_free_slc_head:
-	.zero	8
-	.type	gp_free_xlc_head, %object
-	.size	gp_free_xlc_head, 8
-gp_free_xlc_head:
-	.zero	8
-	.type	gp_free_mix_head, %object
-	.size	gp_free_mix_head, 8
-gp_free_mix_head:
-	.zero	8
-	.type	zftl_print_list_count, %object
-	.size	zftl_print_list_count, 2
-zftl_print_list_count:
-	.zero	2
-	.type	_c_ftl_block_align_addr, %object
-	.size	_c_ftl_block_align_addr, 2
-_c_ftl_block_align_addr:
-	.zero	2
-	.type	_c_ftl_nand_die_num, %object
-	.size	_c_ftl_nand_die_num, 1
-_c_ftl_nand_die_num:
+	.type	__func__.20402, %object
+	.size	__func__.20402, 23
+__func__.20402:
+	.string	"flash_start_plane_read"
 	.zero	1
+	.type	__func__.20288, %object
+	.size	__func__.20288, 26
+__func__.20288:
+	.string	"flash_erase_duplane_block"
+	.zero	6
+	.type	__func__.20299, %object
+	.size	__func__.20299, 21
+__func__.20299:
+	.string	"flash_erase_block_en"
+	.zero	3
+	.type	random_seed, %object
+	.size	random_seed, 256
+random_seed:
+	.hword	22378
+	.hword	1512
+	.hword	25245
+	.hword	17827
+	.hword	25756
+	.hword	19440
+	.hword	9026
+	.hword	10030
+	.hword	29528
+	.hword	20467
+	.hword	29676
+	.hword	24432
+	.hword	31328
+	.hword	6872
+	.hword	13426
+	.hword	13842
+	.hword	8783
+	.hword	1108
+	.hword	782
+	.hword	28837
+	.hword	30729
+	.hword	9505
+	.hword	18676
+	.hword	23085
+	.hword	18730
+	.hword	1085
+	.hword	32609
+	.hword	14697
+	.hword	20858
+	.hword	15170
+	.hword	30365
+	.hword	1607
+	.hword	32298
+	.hword	4995
+	.hword	18905
+	.hword	1976
+	.hword	9592
+	.hword	20204
+	.hword	17443
+	.hword	13615
+	.hword	23330
+	.hword	29369
+	.hword	13947
+	.hword	9398
+	.hword	32398
+	.hword	8984
+	.hword	27600
+	.hword	21785
+	.hword	6019
+	.hword	6311
+	.hword	31598
+	.hword	30210
+	.hword	19327
+	.hword	13896
+	.hword	11347
+	.hword	27545
+	.hword	3107
+	.hword	26575
+	.hword	32270
+	.hword	19852
+	.hword	20601
+	.hword	8349
+	.hword	9290
+	.hword	29819
+	.hword	13579
+	.hword	3661
+	.hword	28676
+	.hword	27331
+	.hword	32574
+	.hword	8693
+	.hword	31253
+	.hword	9081
+	.hword	5399
+	.hword	6842
+	.hword	20087
+	.hword	5537
+	.hword	1274
+	.hword	11617
+	.hword	9530
+	.hword	4866
+	.hword	8035
+	.hword	23219
+	.hword	1178
+	.hword	23272
+	.hword	7383
+	.hword	18944
+	.hword	12488
+	.hword	12871
+	.hword	29340
+	.hword	20532
+	.hword	11022
+	.hword	22514
+	.hword	228
+	.hword	22363
+	.hword	24978
+	.hword	14584
+	.hword	12138
+	.hword	3092
+	.hword	17916
+	.hword	16863
+	.hword	14554
+	.hword	31457
+	.hword	29474
+	.hword	25311
+	.hword	24121
+	.hword	3684
+	.hword	28037
+	.hword	22865
+	.hword	22839
+	.hword	25217
+	.hword	13217
+	.hword	27186
+	.hword	14938
+	.hword	11180
+	.hword	29754
+	.hword	24180
+	.hword	15150
+	.hword	32455
+	.hword	20434
+	.hword	23848
+	.hword	29983
+	.hword	16120
+	.hword	14769
+	.hword	20041
+	.hword	29803
+	.hword	28406
+	.hword	17598
+	.hword	28087
+	.type	__func__.21105, %object
+	.size	__func__.21105, 13
+__func__.21105:
+	.string	"buf_add_tail"
 	.zero	3
-	.type	lpa_hash, %object
-	.size	lpa_hash, 512
-lpa_hash:
-	.zero	512
-	.type	ftl_sblk_lpa_tbl, %object
-	.size	ftl_sblk_lpa_tbl, 8
-ftl_sblk_lpa_tbl:
-	.zero	8
-	.type	lpa_hash_index, %object
-	.size	lpa_hash_index, 8
-lpa_hash_index:
+	.type	__func__.21118, %object
+	.size	__func__.21118, 10
+__func__.21118:
+	.string	"buf_alloc"
+	.zero	6
+	.type	__func__.21132, %object
+	.size	__func__.21132, 16
+__func__.21132:
+	.string	"buf_remove_free"
+	.type	zftl_debug_proc_fops, %object
+	.size	zftl_debug_proc_fops, 288
+zftl_debug_proc_fops:
+	.xword	0
+	.xword	seq_lseek
+	.xword	seq_read
+	.xword	zftl_debug_proc_write
+	.zero	72
+	.xword	zftl_debug_proc_open
 	.zero	8
-	.type	ftl_vpn_update_count, %object
-	.size	ftl_vpn_update_count, 2
-ftl_vpn_update_count:
-	.zero	2
-	.type	ftl_sblk_update_list_offset, %object
-	.size	ftl_sblk_update_list_offset, 2
-ftl_sblk_update_list_offset:
-	.zero	2
-	.type	g_flash_micron_3d_tlc_b05a, %object
-	.size	g_flash_micron_3d_tlc_b05a, 1
-g_flash_micron_3d_tlc_b05a:
-	.zero	1
-	.zero	1
-	.type	_c_mix_max_xlc_ec_count, %object
-	.size	_c_mix_max_xlc_ec_count, 2
-_c_mix_max_xlc_ec_count:
-	.zero	2
-	.type	_c_mix_max_slc_ec_count, %object
-	.size	_c_mix_max_slc_ec_count, 2
-_c_mix_max_slc_ec_count:
-	.zero	2
-	.type	read_buf_head, %object
-	.size	read_buf_head, 1
-read_buf_head:
-	.zero	1
-	.type	read_buf_count, %object
-	.size	read_buf_count, 1
-read_buf_count:
-	.zero	1
+	.xword	single_release
+	.zero	160
+	.type	__func__.39050, %object
+	.size	__func__.39050, 12
+__func__.39050:
+	.string	"gc_add_sblk"
 	.zero	4
-	.type	pm_ram_info, %object
-	.size	pm_ram_info, 512
-pm_ram_info:
-	.zero	512
-	.type	pm_last_update_ram_id, %object
-	.size	pm_last_update_ram_id, 1
-pm_last_update_ram_id:
+	.type	__func__.39142, %object
+	.size	__func__.39142, 19
+__func__.39142:
+	.string	"gc_write_completed"
+	.zero	5
+	.type	__func__.39748, %object
+	.size	__func__.39748, 18
+__func__.39748:
+	.string	"ftl_alloc_sys_blk"
+	.zero	6
+	.type	__func__.39758, %object
+	.size	__func__.39758, 17
+__func__.39758:
+	.string	"ftl_free_sys_blk"
+	.zero	7
+	.type	__func__.39879, %object
+	.size	__func__.39879, 23
+__func__.39879:
+	.string	"ftl_get_ppa_from_index"
 	.zero	1
-	.zero	3
-	.type	g_msb_page_tbl, %object
-	.size	g_msb_page_tbl, 2048
-g_msb_page_tbl:
-	.zero	2048
-	.type	g_slc_page_num, %object
-	.size	g_slc_page_num, 2
-g_slc_page_num:
+	.type	__func__.39919, %object
+	.size	__func__.39919, 22
+__func__.39919:
+	.string	"ftl_get_new_free_page"
 	.zero	2
+	.type	__func__.39930, %object
+	.size	__func__.39930, 22
+__func__.39930:
+	.string	"ftl_ext_alloc_new_blk"
 	.zero	2
-	.type	g_die_addr, %object
-	.size	g_die_addr, 32
-g_die_addr:
-	.zero	32
-	.type	g_totle_phy_block, %object
-	.size	g_totle_phy_block, 2
-g_totle_phy_block:
+	.type	__func__.39199, %object
+	.size	__func__.39199, 16
+__func__.39199:
+	.string	"gc_free_src_blk"
+	.type	__func__.38793, %object
+	.size	__func__.38793, 14
+__func__.38793:
+	.string	"ftl_write_buf"
 	.zero	2
-	.type	gc_state, %object
-	.size	gc_state, 1
-gc_state:
-	.zero	1
-	.zero	1
-	.type	gc_search_count, %object
-	.size	gc_search_count, 4
-gc_search_count:
+	.type	__func__.38838, %object
+	.size	__func__.38838, 18
+__func__.38838:
+	.string	"zftl_add_read_buf"
+	.align	3
+	.set	.LANCHOR4,. + 0
+	.type	__func__.40352, %object
+	.size	__func__.40352, 21
+__func__.40352:
+	.string	"pm_select_ram_region"
+	.zero	3
+	.type	__func__.20830, %object
+	.size	__func__.20830, 20
+__func__.20830:
+	.string	"flash_die_info_init"
 	.zero	4
-	.type	gc_slc_mode_slc_vpn_th, %object
-	.size	gc_slc_mode_slc_vpn_th, 2
-gc_slc_mode_slc_vpn_th:
-	.zero	2
+	.type	__func__.38725, %object
+	.size	__func__.38725, 17
+__func__.38725:
+	.string	"lpa_rebuild_hash"
+	.zero	7
+	.type	__func__.39617, %object
+	.size	__func__.39617, 20
+__func__.39617:
+	.string	"zftl_sblk_list_init"
+	.zero	4
+	.type	__func__.40284, %object
+	.size	__func__.40284, 13
+__func__.40284:
+	.string	"pm_free_sblk"
+	.zero	3
+	.type	__func__.21168, %object
+	.size	__func__.21168, 21
+__func__.21168:
+	.string	"flash_info_data_init"
+	.zero	3
+	.type	__func__.20926, %object
+	.size	__func__.20926, 11
+__func__.20926:
+	.string	"nandc_init"
+	.zero	5
+	.type	samsung_14nm_slc_rr, %object
+	.size	samsung_14nm_slc_rr, 26
+samsung_14nm_slc_rr:
+	.byte	0
+	.byte	10
+	.byte	-10
+	.byte	20
+	.byte	-20
+	.byte	30
+	.byte	-30
+	.byte	40
+	.byte	-40
+	.byte	50
+	.byte	-50
+	.byte	60
+	.byte	-60
+	.byte	-70
+	.byte	-80
+	.byte	-90
+	.byte	-100
+	.byte	-110
+	.byte	-120
+	.byte	-9
+	.byte	70
+	.byte	80
+	.byte	90
+	.byte	-125
+	.byte	-115
+	.byte	100
+	.zero	6
+	.type	samsung_14nm_mlc_rr, %object
+	.size	samsung_14nm_mlc_rr, 104
+samsung_14nm_mlc_rr:
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	-4
+	.byte	3
+	.byte	-4
+	.byte	-6
+	.byte	6
+	.byte	0
+	.byte	6
+	.byte	-10
+	.byte	-10
+	.byte	4
+	.byte	-10
+	.byte	16
+	.byte	12
+	.byte	-4
+	.byte	12
+	.byte	8
+	.byte	-16
+	.byte	10
+	.byte	-16
+	.byte	24
+	.byte	18
+	.byte	-14
+	.byte	18
+	.byte	-4
+	.byte	-22
+	.byte	-16
+	.byte	-22
+	.byte	-8
+	.byte	24
+	.byte	-9
+	.byte	24
+	.byte	8
+	.byte	-28
+	.byte	-4
+	.byte	-28
+	.byte	16
+	.byte	30
+	.byte	10
+	.byte	30
+	.byte	10
+	.byte	-34
+	.byte	6
+	.byte	-34
+	.byte	0
+	.byte	36
+	.byte	-8
+	.byte	36
+	.byte	-8
+	.byte	-40
+	.byte	-2
+	.byte	-40
+	.byte	-20
+	.byte	-46
+	.byte	-4
+	.byte	-46
+	.byte	-30
+	.byte	3
+	.byte	0
+	.byte	3
+	.byte	-3
+	.byte	-2
+	.byte	-4
+	.byte	-2
+	.byte	-6
+	.byte	-4
+	.byte	-4
+	.byte	-4
+	.byte	-10
+	.byte	-6
+	.byte	-8
+	.byte	-6
+	.byte	-14
+	.byte	-9
+	.byte	-8
+	.byte	-9
+	.byte	-18
+	.byte	-52
+	.byte	22
+	.byte	-52
+	.byte	10
+	.byte	42
+	.byte	4
+	.byte	42
+	.byte	4
+	.byte	48
+	.byte	-9
+	.byte	48
+	.byte	4
+	.byte	-58
+	.byte	12
+	.byte	-58
+	.byte	0
+	.byte	-64
+	.byte	-24
+	.byte	-64
+	.byte	-6
+	.byte	9
+	.byte	18
+	.byte	9
+	.byte	8
+	.type	__func__.20211, %object
+	.size	__func__.20211, 19
+__func__.20211:
+	.string	"flash_read_page_en"
+	.zero	5
+	.type	__func__.20337, %object
+	.size	__func__.20337, 26
+__func__.20337:
+	.string	"flash_start_tlc_page_prog"
 	.zero	6
-	.type	gc_lpa_tbl, %object
-	.size	gc_lpa_tbl, 8
-gc_lpa_tbl:
-	.zero	8
-	.type	gc_pre_ppa_tbl, %object
-	.size	gc_pre_ppa_tbl, 8
-gc_pre_ppa_tbl:
-	.zero	8
-	.type	gc_des_ppa_tbl, %object
-	.size	gc_des_ppa_tbl, 8
-gc_des_ppa_tbl:
-	.zero	8
-	.type	pm_force_gc, %object
-	.size	pm_force_gc, 4
-pm_force_gc:
-	.zero	4
-	.type	_c_swl_slc_gc_th, %object
-	.size	_c_swl_slc_gc_th, 2
-_c_swl_slc_gc_th:
-	.zero	2
-	.type	_c_swl_xlc_gc_th, %object
-	.size	_c_swl_xlc_gc_th, 2
-_c_swl_xlc_gc_th:
-	.zero	2
-	.type	_c_max_pm_sblk, %object
-	.size	_c_max_pm_sblk, 2
-_c_max_pm_sblk:
+	.type	__func__.20348, %object
+	.size	__func__.20348, 29
+__func__.20348:
+	.string	"flash_start_3d_mlc_page_prog"
+	.zero	3
+	.type	__func__.20366, %object
+	.size	__func__.20366, 22
+__func__.20366:
+	.string	"flash_start_page_prog"
 	.zero	2
-	.zero	6
-	.type	power_on_init_jiffies, %object
-	.size	power_on_init_jiffies, 8
-power_on_init_jiffies:
-	.zero	8
-	.type	gp_ftl_api, %object
-	.size	gp_ftl_api, 8
-gp_ftl_api:
-	.zero	8
-	.type	RK29_NANDC_REG_BASE, %object
-	.size	RK29_NANDC_REG_BASE, 8
-RK29_NANDC_REG_BASE:
-	.zero	8
-	.type	g_flash_tmp_page_buffer, %object
-	.size	g_flash_tmp_page_buffer, 8
-g_flash_tmp_page_buffer:
-	.zero	8
-	.type	g_nandc_tran_timeout, %object
-	.size	g_nandc_tran_timeout, 1
-g_nandc_tran_timeout:
+	.type	__func__.20390, %object
+	.size	__func__.20390, 31
+__func__.20390:
+	.string	"flash_complete_plane_page_read"
 	.zero	1
+	.type	__func__.20415, %object
+	.size	__func__.20415, 25
+__func__.20415:
+	.string	"flash_complete_page_read"
 	.zero	7
-	.type	g_flash_tmp_spare_buffer, %object
-	.size	g_flash_tmp_spare_buffer, 8
-g_flash_tmp_spare_buffer:
-	.zero	8
-	.type	g_maxRetryCount, %object
-	.size	g_maxRetryCount, 1
-g_maxRetryCount:
-	.zero	1
-	.zero	3
-	.type	flash_ddr_tuning_sdr_read_count, %object
-	.size	flash_ddr_tuning_sdr_read_count, 4
-flash_ddr_tuning_sdr_read_count:
-	.zero	4
-	.type	flash_read_retry, %object
-	.size	flash_read_retry, 8
-flash_read_retry:
-	.zero	8
-	.type	g_flash_page_buffer, %object
-	.size	g_flash_page_buffer, 8
-g_flash_page_buffer:
-	.zero	8
-	.type	g_flash_spare_buffer, %object
-	.size	g_flash_spare_buffer, 8
-g_flash_spare_buffer:
-	.zero	8
-	.type	write_commit_head, %object
-	.size	write_commit_head, 1
-write_commit_head:
-	.zero	1
-	.zero	3
-	.type	ftl_flush_jiffies, %object
-	.size	ftl_flush_jiffies, 4
-ftl_flush_jiffies:
-	.zero	4
-	.type	g_flash_multi_page_read_en, %object
-	.size	g_flash_multi_page_read_en, 1
-g_flash_multi_page_read_en:
-	.zero	1
-	.zero	23
-	.type	ftl_info_spare, %object
-	.size	ftl_info_spare, 256
-ftl_info_spare:
-	.zero	256
-	.type	g_ftl_info_blk, %object
-	.size	g_ftl_info_blk, 4
-g_ftl_info_blk:
-	.zero	4
-	.zero	4
-	.type	ftl_info_data_buffer, %object
-	.size	ftl_info_data_buffer, 8
-ftl_info_data_buffer:
-	.zero	8
-	.type	ftl_sys_info_first_write, %object
-	.size	ftl_sys_info_first_write, 1
-ftl_sys_info_first_write:
+	.type	__func__.40117, %object
+	.size	__func__.40117, 31
+__func__.40117:
+	.string	"queue_wait_first_req_completed"
 	.zero	1
-	.type	ftl_power_lost_flag, %object
-	.size	ftl_power_lost_flag, 1
-ftl_power_lost_flag:
+	.type	__func__.40171, %object
+	.size	__func__.40171, 15
+__func__.40171:
+	.string	"sblk_prog_page"
 	.zero	1
-	.type	ftl_ext_info_first_write, %object
-	.size	ftl_ext_info_first_write, 1
-ftl_ext_info_first_write:
+	.type	__func__.40198, %object
+	.size	__func__.40198, 15
+__func__.40198:
+	.string	"sblk_read_page"
 	.zero	1
+	.type	__func__.39097, %object
+	.size	__func__.39097, 21
+__func__.39097:
+	.string	"gc_check_data_one_wl"
+	.zero	3
+	.type	__func__.20272, %object
+	.size	__func__.20272, 19
+__func__.20272:
+	.string	"flash_prog_page_en"
 	.zero	5
-	.type	ftl_ext_info_data_buffer, %object
-	.size	ftl_ext_info_data_buffer, 8
-ftl_ext_info_data_buffer:
-	.zero	8
-	.zero	32
-	.type	ftl_tmp_spare, %object
-	.size	ftl_tmp_spare, 256
-ftl_tmp_spare:
-	.zero	256
-	.type	pm_gc_enable, %object
-	.size	pm_gc_enable, 4
-pm_gc_enable:
-	.zero	4
-	.zero	4
-	.type	g_pm_spare, %object
-	.size	g_pm_spare, 8
-g_pm_spare:
-	.zero	8
-	.type	pm_first_write, %object
-	.size	pm_first_write, 1
-pm_first_write:
-	.zero	1
-	.zero	7
-	.type	g_flash_sys_spare_buffer, %object
-	.size	g_flash_sys_spare_buffer, 8
-g_flash_sys_spare_buffer:
-	.zero	8
-	.type	g_flash_blk_info, %object
-	.size	g_flash_blk_info, 4
-g_flash_blk_info:
-	.zero	4
-	.type	g_flash_reversd_blks, %object
-	.size	g_flash_reversd_blks, 1
-g_flash_reversd_blks:
-	.zero	1
-	.type	g_flash_micron_3d_tlc_b16a, %object
-	.size	g_flash_micron_3d_tlc_b16a, 1
-g_flash_micron_3d_tlc_b16a:
-	.zero	1
-	.type	_c_ftl_byte_pre_page, %object
-	.size	_c_ftl_byte_pre_page, 2
-_c_ftl_byte_pre_page:
+	.type	__func__.39994, %object
+	.size	__func__.39994, 14
+__func__.39994:
+	.string	"ftl_prog_page"
 	.zero	2
-	.type	pm_last_load_ram_id, %object
-	.size	pm_last_load_ram_id, 1
-pm_last_load_ram_id:
+	.type	__func__.39651, %object
+	.size	__func__.39651, 15
+__func__.39651:
+	.string	"ftl_info_flush"
 	.zero	1
-	.type	_ftl_gc_tag_page_num, %object
-	.size	_ftl_gc_tag_page_num, 1
-_ftl_gc_tag_page_num:
+	.type	__func__.39956, %object
+	.size	__func__.39956, 19
+__func__.39956:
+	.string	"ftl_ext_info_flush"
+	.zero	5
+	.type	__func__.39968, %object
+	.size	__func__.39968, 18
+__func__.39968:
+	.string	"ftl_ext_info_init"
+	.zero	6
+	.type	__func__.39706, %object
+	.size	__func__.39706, 15
+__func__.39706:
+	.string	"ftl_alloc_sblk"
 	.zero	1
+	.type	__func__.40324, %object
+	.size	__func__.40324, 17
+__func__.40324:
+	.string	"pm_alloc_new_blk"
+	.zero	7
+	.type	__func__.40334, %object
+	.size	__func__.40334, 14
+__func__.40334:
+	.string	"pm_write_page"
 	.zero	2
-	.type	_last_read_time, %object
-	.size	_last_read_time, 4
-_last_read_time:
-	.zero	4
-	.type	_last_write_time, %object
-	.size	_last_write_time, 4
-_last_write_time:
-	.zero	4
-	.type	read_ahead_lpa, %object
-	.size	read_ahead_lpa, 4
-read_ahead_lpa:
-	.zero	4
-	.type	_c_totle_data_density, %object
-	.size	_c_totle_data_density, 4
-_c_totle_data_density:
-	.zero	4
-	.type	_c_ftl_pm_page_num, %object
-	.size	_c_ftl_pm_page_num, 2
-_c_ftl_pm_page_num:
-	.zero	2
-	.zero	2
-	.type	ftl_tmp_buffer, %object
-	.size	ftl_tmp_buffer, 8
-ftl_tmp_buffer:
-	.zero	8
-	.type	rk_zftl_enable, %object
-	.size	rk_zftl_enable, 1
-rk_zftl_enable:
-	.zero	1
+	.type	__func__.21190, %object
+	.size	__func__.21190, 17
+__func__.21190:
+	.string	"flash_info_flush"
 	.zero	7
-	.type	gLoaderBootInfo, %object
-	.size	gLoaderBootInfo, 8
-gLoaderBootInfo:
-	.zero	8
-	.type	RK29_NANDC1_REG_BASE, %object
-	.size	RK29_NANDC1_REG_BASE, 8
-RK29_NANDC1_REG_BASE:
-	.zero	8
-	.type	discard_sector_count, %object
-	.size	discard_sector_count, 4
-discard_sector_count:
+	.type	__func__.21153, %object
+	.size	__func__.21153, 20
+__func__.21153:
+	.string	"flash_info_blk_init"
 	.zero	4
-	.type	idb_write_enable, %object
-	.size	idb_write_enable, 1
-idb_write_enable:
+	.type	__func__.20885, %object
+	.size	__func__.20885, 16
+__func__.20885:
+	.string	"nand_flash_init"
+	.type	__func__.39821, %object
+	.size	__func__.39821, 16
+__func__.39821:
+	.string	"ftl_sysblk_dump"
+	.type	__func__.39846, %object
+	.size	__func__.39846, 23
+__func__.39846:
+	.string	"ftl_open_sblk_recovery"
 	.zero	1
-	.zero	3
-	.type	idb_buf, %object
-	.size	idb_buf, 8
-idb_buf:
-	.zero	8
-	.type	idb_last_lba, %object
-	.size	idb_last_lba, 4
-idb_last_lba:
-	.zero	4
-	.zero	4
-	.type	gpDrmKeyInfo, %object
-	.size	gpDrmKeyInfo, 8
-gpDrmKeyInfo:
-	.zero	8
-	.type	SecureBootCheckOK, %object
-	.size	SecureBootCheckOK, 4
-SecureBootCheckOK:
-	.zero	4
-	.type	SecureBootEn, %object
-	.size	SecureBootEn, 4
-SecureBootEn:
-	.zero	4
-	.type	gpBootConfig, %object
-	.size	gpBootConfig, 8
-gpBootConfig:
-	.zero	8
-	.type	gSnSectorData, %object
-	.size	gSnSectorData, 512
-gSnSectorData:
-	.zero	512
-	.type	SecureBootUnlockTryCount, %object
-	.size	SecureBootUnlockTryCount, 4
-SecureBootUnlockTryCount:
-	.zero	4
+	.type	__func__.40268, %object
+	.size	__func__.40268, 16
+__func__.40268:
+	.string	"load_l2p_region"
+	.type	__func__.40308, %object
+	.size	__func__.40308, 6
+__func__.40308:
+	.string	"pm_gc"
+	.zero	2
+	.type	__func__.39040, %object
+	.size	__func__.39040, 12
+__func__.39040:
+	.string	"gc_recovery"
 	.zero	4
-	.type	gpVendor0Info, %object
-	.size	gpVendor0Info, 8
-gpVendor0Info:
-	.zero	8
-	.type	gpVendor1Info, %object
-	.size	gpVendor1Info, 8
-gpVendor1Info:
-	.zero	8
-	.type	g_idb_buffer, %object
-	.size	g_idb_buffer, 8
-g_idb_buffer:
-	.zero	8
-	.type	g_vendor, %object
-	.size	g_vendor, 8
-g_vendor:
-	.zero	8
-	.type	ftl_low_format_cur_blk, %object
-	.size	ftl_low_format_cur_blk, 2
-ftl_low_format_cur_blk:
+	.type	__func__.39129, %object
+	.size	__func__.39129, 22
+__func__.39129:
+	.string	"gc_update_l2p_map_new"
 	.zero	2
+	.type	__func__.39243, %object
+	.size	__func__.39243, 16
+__func__.39243:
+	.string	"gc_scan_src_blk"
+	.type	__func__.39304, %object
+	.size	__func__.39304, 20
+__func__.39304:
+	.string	"gc_scan_static_data"
+	.zero	4
+	.type	__func__.39367, %object
+	.size	__func__.39367, 18
+__func__.39367:
+	.string	"gc_block_vpn_scan"
 	.zero	6
-	.type	p_read_ahead_ext_buf, %object
-	.size	p_read_ahead_ext_buf, 8
-p_read_ahead_ext_buf:
-	.zero	8
-	.type	_c_ftl_nand_blks_per_die, %object
-	.size	_c_ftl_nand_blks_per_die, 2
-_c_ftl_nand_blks_per_die:
+	.type	__func__.39797, %object
+	.size	__func__.39797, 14
+__func__.39797:
+	.string	"ftl_sblk_dump"
 	.zero	2
+	.type	__func__.38871, %object
+	.size	__func__.38871, 10
+__func__.38871:
+	.string	"zftl_read"
 	.zero	6
-	.type	nandc_ecc_sts, %object
-	.size	nandc_ecc_sts, 16
-nandc_ecc_sts:
-	.zero	16
-	.type	g_slc_mode_enable, %object
-	.size	g_slc_mode_enable, 1
-g_slc_mode_enable:
-	.zero	1
+	.type	__func__.39900, %object
+	.size	__func__.39900, 19
+__func__.39900:
+	.string	"ftl_update_l2p_map"
+	.zero	5
+	.type	__func__.38775, %object
+	.size	__func__.38775, 17
+__func__.38775:
+	.string	"ftl_write_commit"
+	.zero	7
+	.type	__func__.39172, %object
+	.size	__func__.39172, 16
+__func__.39172:
+	.string	"gc_do_copy_back"
+	.type	__func__.39422, %object
+	.size	__func__.39422, 11
+__func__.39422:
+	.string	"zftl_do_gc"
+	.zero	5
+	.type	__func__.38903, %object
+	.size	__func__.38903, 13
+__func__.38903:
+	.string	"_ftl_discard"
+	.section	.rodata.str1.1,"aMS",@progbits,1
+.LC0:
+	.string	"\n!!!!! error @ func:%s - line:%d\n"
+.LC1:
+	.string	"FTL version: 6.0.24 20210616"
+.LC2:
+	.string	"%s\n"
+.LC3:
+	.string	"zftl_debug:0x%x\n"
+.LC4:
+	.string	"...%s enter...\n"
+.LC5:
+	.string	"No.0 FLASH ID: %x %x %x %x %x %x\n"
+.LC6:
+	.string	"DiePerChip: %x\n"
+.LC7:
+	.string	"SectPerPage: %x\n"
+.LC8:
+	.string	"PagePerBlk: %x\n"
+.LC9:
+	.string	"Cell: %x\n"
+.LC10:
+	.string	"PlanePerDie: %x\n"
+.LC11:
+	.string	"BlkPerPlane: %x\n"
+.LC12:
+	.string	"die gap: %x\n"
+.LC13:
+	.string	"lsbMode: %x\n"
+.LC14:
+	.string	"ReadRetryMode: %x\n"
+.LC15:
+	.string	"ecc: %x\n"
+.LC16:
+	.string	"idb ecc: %x\n"
+.LC17:
+	.string	"OptMode: %x\n"
+.LC18:
+	.string	"g_nand_max_die: %x\n"
+.LC19:
+	.string	"Cache read enable: %x\n"
+.LC20:
+	.string	"Cache random read enable: %x\n"
+.LC21:
+	.string	"Cache prog enable: %x\n"
+.LC22:
+	.string	"multi read enable: %x\n"
+.LC23:
+	.string	"multi prog enable: %x\n"
+.LC24:
+	.string	"interleave enable: %x\n"
+.LC25:
+	.string	"read retry enable: %x\n"
+.LC26:
+	.string	"randomizer enable: %x\n"
+.LC27:
+	.string	"SDR enable: %x\n"
+.LC28:
+	.string	"ONFI enable: %x\n"
+.LC29:
+	.string	"TOGGLE enable: %x\n"
+.LC30:
+	.string	"g_flash_slc_mode: %x %x\n"
+.LC31:
+	.string	"MultiPlaneProgCmd: %x %x\n"
+.LC32:
+	.string	"MultiPlaneReadCmd: %x %x\n"
+.LC33:
+	.string	"g_flash_toggle_mode_en: %x\n"
+.LC34:
+	.string	"nand sdr mode %x\n"
+.LC35:
+	.string	"nand ddr mode %x\n"
+.LC36:
+	.string	"No.%d FLASH ID:%x %x %x %x %x %x\n"
+.LC37:
+	.string	"otp:%x %x %x %x\n"
+.LC38:
+	.string	"bad block test:%x %x\n"
+.LC39:
+	.string	"flash_erase_duplane_block %x %x %x\n"
+.LC40:
+	.string	"flash_erase_duplane_block pageadd = %x status = %x\n"
+.LC41:
+	.string	"flash_erase_block %x %x %x\n"
+.LC42:
+	.string	"flash_erase_block %d block = %x status = %x\n"
+.LC43:
+	.string	"erase done: %x\n"
+.LC44:
+	.string	"sblk_queue_head = %d\n"
+.LC45:
+	.string	"sblk_read_completed_queue_head = %d\n"
+.LC46:
+	.string	"sblk_gc_write_completed_queue_head = %d\n"
+.LC47:
+	.string	"sblk_write_completed_queue_head = %d\n"
+.LC48:
+	.string	"p_free_buf_head = %d\n"
+.LC49:
+	.string	"free_buf_count = %d\n"
+.LC50:
+	.string	"buf = %d, next=%d, flag=%d gc_write_flag=%d, lun_state=%d, op_status = %d lpa=%x, ppa=%x\n"
+.LC51:
+	.string	"flash_mask_bad_block %d %d\n"
+.LC52:
+	.string	"zftl_debug"
+.LC53:
+	.string	"FLASH ID: %x %x %x %x %x %x\n"
+.LC54:
+	.string	"density: %d MB\n"
+.LC55:
+	.string	"device density: %d MB\n"
+.LC56:
+	.string	"FTL INFO:\n"
+.LC57:
+	.string	"max_lpn = 0x%x\n"
+.LC58:
+	.string	"density = 0x%x\n"
+.LC59:
+	.string	"slc vpn = 0x%x\n"
+.LC60:
+	.string	"xlc vpn = 0x%x\n"
+.LC61:
+	.string	"free slc blk = 0x%x\n"
+.LC62:
+	.string	"free xlc blk = 0x%x\n"
+.LC63:
+	.string	"free mix blk = 0x%x\n"
+.LC64:
+	.string	"slc data blk = 0x%x\n"
+.LC65:
+	.string	"slc cache blk = 0x%x\n"
+.LC66:
+	.string	"xlc data blk = 0x%x\n"
+.LC67:
+	.string	"free buf = %d, %d, %d\n"
+.LC68:
+	.string	"bad blk = %d %d\n"
+.LC69:
+	.string	"TBW = %d MB\n"
+.LC70:
+	.string	"TBR = %d MB\n"
+.LC71:
+	.string	"POC = %d\n"
+.LC72:
+	.string	"PLC = %d\n"
+.LC73:
+	.string	"sys run time = %d S\n"
+.LC74:
+	.string	"slc mode = %x %x %x\n"
+.LC75:
+	.string	"prog err = %d\n"
+.LC76:
+	.string	"read err = %d\n"
+.LC77:
+	.string	"GC XLC page = %d\n"
+.LC78:
+	.string	"GC SLC page = %d\n"
+.LC79:
+	.string	"discard page = 0x%x\n"
+.LC80:
+	.string	"version = %d\n"
+.LC81:
+	.string	"acblk = 0x%x %d %d\n"
+.LC82:
+	.string	"tmblk = 0x%x %d %d\n"
+.LC83:
+	.string	"gcblk = 0x%x %d %d\n"
+.LC84:
+	.string	"slc ec = %d, %d, %d, %d, %d\n"
+.LC85:
+	.string	"xlc ec = %d, %d, %d, %d, %d\n"
+.LC86:
+	.string	"gc free blk th = %d\n"
+.LC87:
+	.string	"gc vpn th = %d %d %d %d %d\n"
+.LC88:
+	.string	"swl blk = %x %x %x %x\n"
+.LC89:
+	.string	"rf info = %x %x %x %x %x\n"
+.LC90:
+	.string	"gc_add_sblk = %d, %d, %d, %d, %d, %d, %d\n"
+.LC91:
+	.string	"gc_add_sblk = %d, %d, %d\n"
+.LC92:
+	.string	"gc_add_sblk = %d, %d, %d,last update:%d, %d\n"
+.LC93:
+	.string	"gc_add_sblk = %d, %d, %d, %d, %d, %d\n"
+.LC94:
+	.string	"gc_mark_bad_ppa %d %x %x\n"
+.LC95:
+	.string	"status: %x, ppa: %x\n"
+.LC96:
+	.string	"%d gc_free_temp_buf buf id= %x\n"
+.LC97:
+	.string	"gc: b:%x,p:%x,i:%x; free buf=%d %d free slc th: %d\n"
+.LC98:
+	.string	"zftl_get_gc_node cache = %x index = %d vpn = %x\n"
+.LC99:
+	.string	"gc_search_src_blk mode = %x, src mode = %x, count= %d %d\n"
+.LC100:
+	.string	"swl_tlc_free_mini_ec_blk alloc sblk %x\n"
+.LC101:
+	.string	"zftl_get_free_sblk %x %d, %p %d %d\n"
+.LC102:
+	.string	"zftl_gc_get_free_sblk %x %x %x, %d %d %d\n"
+.LC103:
+	.string	"swl_slc_free_mini_ec_blk alloc sblk %x\n"
+.LC104:
+	.string	"list count:%p %d\n"
+.LC105:
+	.string	"%d: node:%x %x %x %x, %d %d %d %d %d\n"
+.LC106:
+	.string	"ftl_vpn_decrement %x = %d, %d\n"
+.LC107:
+	.string	"mask bad block:cs %x %x block: %x %x\n"
+.LC108:
+	.string	"gc_free_bad_sblk 0x%x\n"
+.LC109:
+	.string	"swl_slc_free_mini_ec_blk sblk %x\n"
+.LC110:
+	.string	"gc_free_src_blk = %x, vpn = %d\n"
+.LC111:
+	.string	"gc_free_src_blk %x, %d\n"
+.LC112:
+	.string	"bad blk = %x, %x free blk: s:%x,t:%x,m:%x, data blk:s:%x,%x,t%x vpn: s:%x t:%x, max_vpn: %x\n"
+.LC113:
+	.string	"totle w: %d MB,r: %d MB %d dv:0x%X,poc:%d\n"
+.LC114:
+	.string	"gc xlc page: %d,gc slc page: %d, tmp w: %d MB\n"
+.LC115:
+	.string	"slc ec: %d,%d,%d,%d,%d,tlc ec: %d,%d,%d,%d,%d\n"
+.LC116:
+	.string	"gc th: tlc_tlc: %d tlc_slc: %d slc_slc: %d slc_tlc:%d free_th: %d\n"
+.LC117:
+	.string	"swl : %x %x %x %x %x %x\n"
+.LC118:
+	.string	"ftl prog error =%x, lpa = %x, ppa= %x\n"
+.LC119:
+	.string	"ftl re prog: lpa = %x, ppa= %x\n"
+.LC120:
+	.string	"dump_sblk_queue: %d\n"
+.LC121:
+	.string	"buf id= %d state = %d ppa = %x\n"
+.LC122:
+	.string	"%s %d %d\n"
+.LC123:
+	.string	"gc_static_wearleveling: min blk: %x,sec=%d,xec = %d ,mode=%d, func=%x, bbt=%x vpn = %d\n"
+.LC124:
+	.string	"gc_static_wearleveling: min slc blk: %x,sec=%d,xec = %d ,mode=%d, func=%x, bbt=%x vpn = %d\n"
+.LC125:
+	.string	"gc_static_wearleveling: min tlc blk: %x,sec=%d,xec = %d ,mode=%d, func=%x, bbt=%x vpn = %d\n"
+.LC126:
+	.string	"gc_static_wearleveling: max slc blk: %x,sec=%d,xec = %d ,mode=%d, func=%x, bbt=%x vpn = %d\n"
+.LC127:
+	.string	"gc_static_wearleveling: max xlc blk: %x,sec=%d,xec = %d ,mode=%d, func=%x, bbt=%x vpn = %d\n"
+.LC128:
+	.string	"gc_static_wearleveling: slc blk: %x, tlc blk: %d avg slc ec: %d, avg tlc ec: %d \n"
+.LC129:
+	.string	"gc_static_wearleveling: min slc ec: %x, min tlc ec: %d max slc ec: %d, max tlc ec: %d; %d %d\n"
+.LC130:
+	.string	"swl add tlc gc = %x, %d, %d, %d, %d, %d\n"
+.LC131:
+	.string	"swl add slc gc  = %x, %d, %d, %d, %d, %d\n"
+.LC132:
+	.string	"free blk vpn error: %x %x\n"
+.LC133:
+	.string	"GC PM block %x %x %x %d\n"
+.LC134:
+	.string	"ftl_free_no_use_map_blk %x %x %x %d\n"
+.LC135:
+	.string	"...%d @ %s\n"
+.LC136:
+	.string	"...%s enter... %p\n"
+.LC137:
+	.string	"0:%x %x %x %x %x\n"
+.LC138:
+	.string	"g_nandc_ver...%d\n"
+.LC139:
+	.string	"rk_ftl_de_init %x\n"
+.LC140:
+	.string	"\0013"
+.LC141:
+	.string	"otp error! %d"
+.LC142:
+	.string	"rr"
+.LC143:
+	.string	"flash_abort_clear = %d\n"
+.LC144:
+	.string	"%d mtrans_cnt = %d page_num = %d\n"
+.LC145:
+	.string	"%d flReg.d32=%x %x\n"
+.LC146:
+	.string	"nandc:"
+.LC147:
+	.string	"nandc_xfer_done read error %x\n"
+.LC148:
+	.string	"dqs data abort %x\n"
+.LC149:
+	.string	"dqs data timeout %x\n"
+.LC150:
+	.string	"xfer error %x\n"
+.LC151:
+	.string	"MT %d row=%x,last status %d,status = %d\n"
+.LC152:
+	.string	"MT RR %d row=%x,count %d,status=%d\n"
+.LC153:
+	.string	"toshiba SRR %d row=%x, status=%d\n"
+.LC154:
+	.string	"toshiba TRR %d row=%x, status=%d\n"
+.LC155:
+	.string	"toshiba RR %d row=%x,count %d,status=%d\n"
+.LC156:
+	.string	"YMTC RR %d row=%x,count %d,status=%d\n"
+.LC157:
+	.string	"samsung SRR %d row=%x, status=%d\n"
+.LC158:
+	.string	"samsung TRR %d row=%x, status=%d\n"
+.LC159:
+	.string	"samsung RR %d row=%x,count %d,status=%d\n"
+.LC160:
+	.string	"hynix RR %d row=%x, count %d, status=%d\n"
+.LC161:
+	.string	"%d flash_ddr_tuning_read %x ecc=%d\n"
+.LC162:
+	.string	"sync para %d\n"
+.LC163:
+	.string	"DDR mode Read error %x %x\n"
+.LC164:
+	.string	"SDR mode Read %x %x ecc:%x\n"
+.LC165:
+	.string	"flash_read_page_en %x %x %x %x\n"
+.LC166:
+	.string	"flash_read_page_en %x %x error_ecc %d %d\n"
+.LC167:
+	.string	"flash_get_last_written_page: %x %x %x\n"
+.LC168:
+	.string	"flash_prog_page page_addr = %x status = %x\n"
+.LC169:
+	.string	"flash_prog_page %x %x %x\n"
+.LC170:
+	.string	"ymtc_flash_tlc_page_prog page_addr = %x status = %x\n"
+.LC171:
+	.string	"sblk_mlc_dump_prog wl_addr= %x ppa = %x ppa = %x\n"
+.LC172:
+	.string	"flash_complete_page_read %x %x error_ecc %d %d\n"
+.LC173:
+	.string	"read: %x %x %x %x\n"
+.LC174:
+	.string	"0set buf %d,status = %x, ppa = %x lun state = %d\n"
+.LC175:
+	.string	"prog end %x %x error_ecc %d %d\n"
+.LC176:
+	.string	"1set buf %d,status = %x, ppa = %x lun state = %d\n"
+.LC177:
+	.string	"dp prog end %x %x error_ecc %d %d\n"
+.LC178:
+	.string	"sblk_prog_page ppa = %x, count = %d\n"
+.LC179:
+	.string	"err: ppa = %x, status = %x, %x %x spare: %x %x %x %x\n"
+.LC180:
+	.string	"flash_prog_page_en:%x %x %x\n"
+.LC181:
+	.string	"w d:"
+.LC182:
+	.string	"w s:"
+.LC183:
+	.string	"spare"
+.LC184:
+	.string	"data"
+.LC185:
+	.string	"write error: %x\n"
+.LC186:
+	.string	"g_ftl_info_blk blk = %x, page = %x version = %d\n"
+.LC187:
+	.string	"%d %x @%d %x\n"
+.LC188:
+	.string	"ftl_info_blk_init %d %d %x\n"
+.LC189:
+	.string	"ftl info hash %x error\n"
+.LC190:
+	.string	"ink flag: %x\n"
+.LC191:
+	.string	"%s %d %d %x %x\n"
+.LC192:
+	.string	"ext info hash %x error\n"
+.LC193:
+	.string	"%s %x %x %x\n"
+.LC194:
+	.string	"ftl_sblk_dump_write = %x %d %d %d %d\n"
+.LC195:
+	.string	"blk= %x, page=%x, ppa = %x, status = %x, data:%x %x %x %x, spare: %x %x %x %x\n"
+.LC196:
+	.string	"ftl_sblk_dump_write2 = %x %d %d %d\n"
+.LC197:
+	.string	"ftl_sblk_dump_write = %x %x\n"
+.LC198:
+	.string	"ftl_sblk_dump_write done = %x\n"
+.LC199:
+	.string	"%x: ink_scaned_blk_num %x\n"
+.LC200:
+	.string	"ftl_ink_check_sblk = %x %d %d\n"
+.LC201:
+	.string	"ftl_ink_check_sblk = %x %d %d end\n"
+.LC202:
+	.string	"alloc sblk %x %d\n"
+.LC203:
+	.string	"blk %x is bad block\n"
+.LC204:
+	.string	"pm_alloc_new_blk: %x %x %x %x\n"
+.LC205:
+	.string	"pm_write_page write error: %x\n"
+.LC206:
+	.string	"finfo:"
+.LC207:
+	.string	"flash_info_flush id = %x, page = %x\n"
+.LC208:
+	.string	"sys_info_flush error:%x\n"
+.LC209:
+	.string	"...%d @ %s %d %p\n"
+.LC210:
+	.string	"no sys info %x\n"
+.LC211:
+	.string	"l2p:"
+.LC212:
+	.string	"saved_active_page  = %x\n"
+.LC213:
+	.string	"saved_active_plane = %x\n"
+.LC214:
+	.string	"sblk = %x\n"
+.LC215:
+	.string	"phy_blk = %x %x\n"
+.LC216:
+	.string	"num_planes = %x\n"
+.LC217:
+	.string	"recovery blk=%x, page=%x, ppa = %x, status = %x, hash:%x\n"
+.LC218:
+	.string	"data:"
+.LC219:
+	.string	"sblk = %x, vpn0 = %d, vpn1 = %d\n"
+.LC220:
+	.string	"dump_write_lpa = %x %x %x %x\n"
+.LC221:
+	.string	"dump write new ppa = %x, last ppa = %x lpa = %x\n"
+.LC222:
+	.string	"dump write = %x %x %x\n"
+.LC223:
+	.string	"dump write hash update = %x %x %x\n"
+.LC224:
+	.string	"free_buf_count: %d\n"
+.LC225:
+	.string	"g_ftl_info_blk blk:0x%x, index:0x%x, page:0x%x\n"
+.LC226:
+	.string	"ftl_ext_info_blk blk:0x%x, page:0x%x\n"
+.LC227:
+	.string	"ac_blk:0x%x, page:0x%x, index:0x%x, free:0x%x, page_index:0x%x\n"
+.LC228:
+	.string	"tmp_blk:0x%x, page:0x%x, index:0x%x, free:0x%x, page_index:0x%x\n"
+.LC229:
+	.string	"gc_blk:0x%x, page:0x%x, index:0x%x, free:0x%x, page_index:0x%x\n"
+.LC230:
+	.string	"lpa:"
+.LC231:
+	.string	"vpn:"
+.LC232:
+	.string	"sblk:"
+.LC233:
+	.string	"lpa_hash:"
+.LC234:
+	.string	"lpa_hash_index:"
+.LC235:
+	.string	"%s w error lpn = %x, max ppa = %d\n"
+.LC236:
+	.string	"region_id = %d, pm_max_region = %d\n"
+.LC237:
+	.string	"load_l2p_region no ppa = %x , %x, all setting 0xff....\n"
+.LC238:
+	.string	"load_l2p_region = %x,%x,%x, %x\n"
+.LC239:
+	.string	"pm_ppa:"
+.LC240:
+	.string	"spare:"
+.LC241:
+	.string	"pm_init posr %x %x %x\n"
+.LC242:
+	.string	"pm_init recovery %x %x %x\n"
+.LC243:
+	.string	"pm_init hash %x error\n"
+.LC244:
+	.string	"pm_log2phys  lpn = %d, max lpn = %d\n"
+.LC245:
+	.string	"ppa = %x, status = %x, data:%x %x %x %x, spare: %x %x %x %x\n"
+.LC246:
+	.string	"ppa = %x, status = %x, %x %x spare: %x %x %x %x\n"
+.LC247:
+	.string	"gc_recovery: %x vpn = %x\n"
+.LC248:
+	.string	"gc_update_l2p_map_new sblk %x\n"
+.LC249:
+	.string	"gc_update_l2p_map_new: %x %x %x\n"
+.LC250:
+	.string	"lpa: %x %x %x\n"
+.LC251:
+	.string	"gc_update_l2p_map_new: %x vpn = %x vpn1 = %x done\n"
+.LC252:
+	.string	"gc_scan_src_blk = %x, vpn = %d\n"
+.LC253:
+	.string	"js hash error:%x %x %x\n"
+.LC254:
+	.string	"gc_scan_src_blk = %x, s vpn0 = %d, c vpn1 = %d\n"
+.LC255:
+	.string	"gc_block_vpn_scan = %x, s vpn0 = %d, c vpn1 = %d f:%d\n"
+.LC256:
+	.string	"ftl_sblk_dump = %x %d %d %d %d\n"
+.LC257:
+	.string	"ftl_sblk_dump = %x %x %x %x\n"
+.LC258:
+	.string	"page_addr = %x, lpa=%x vpn = %d\n"
+.LC259:
+	.string	"index= %x, lpa=%x\n"
+.LC260:
+	.string	"block = %x, vpn=%x check vpn = %x\n"
+.LC261:
+	.string	"ftl_read %x %x %x\n"
+.LC262:
+	.string	"ftl_read refresh =%x, lpa = %x, ppa= %x\n"
+.LC263:
+	.string	"id=%d, status = %x, lpa = %x, ppa = %x spare = %x %x %x %x\n"
+.LC264:
+	.string	"zftl debug cmd: %s\n"
+.LC265:
+	.string	"cmd:"
+.LC266:
+	.string	"dumpl2p"
+.LC267:
+	.string	"pm l2p:"
+.LC268:
+	.string	"pm blk:"
+.LC269:
+	.string	"dumppm:"
+.LC270:
+	.string	"p_cmd: %s\n"
+.LC271:
+	.string	"pm ram = %x, %x\n"
+.LC272:
+	.string	"ram:"
+.LC273:
+	.string	"pm:"
+.LC274:
+	.string	"dumpsys"
+.LC275:
+	.string	"dumplist:"
+.LC276:
+	.string	"vpncheck"
+.LC277:
+	.string	"dumpppa:"
+.LC278:
+	.string	"dumpblk:"
+.LC279:
+	.string	"setzdebug:"
+.LC280:
+	.string	"lpa2ppa:"
+.LC281:
+	.string	"lpa: %x--> ppa: %x\n"
+.LC282:
+	.string	"help:\n"
+.LC283:
+	.string	"1. echo dumpl2p > /proc/zftl_debug\n"
+.LC284:
+	.string	"2. echo dumppm:x > /proc/zftl_debug\n"
+.LC285:
+	.string	"3. echo dumpsys > /proc/zftl_debug\n"
+.LC286:
+	.string	"4. echo dumpppa:x > /proc/zftl_debug\n"
+.LC287:
+	.string	"5. echo vpncheck > /proc/zftl_debug\n"
+.LC288:
+	.string	"6. echo setzdebug:x > /proc/zftl_debug\n"
+.LC289:
+	.string	"7. echo dumplist:x > /proc/zftl_debug\n"
+.LC290:
+	.string	"8. echo lpa2ppa:x> /proc/zftl_debug\n"
+.LC291:
+	.string	"ftl_update_l2p_map: %x %x %x\n"
+.LC292:
+	.string	"ftl_update_l2p_map"
+.LC293:
+	.string	"lpa_tbl:"
+.LC294:
+	.string	"sblk %x vpn: %d %d\n"
+.LC295:
+	.string	"error gc_add_sblk: %x\n"
+.LC296:
+	.string	"%d read error: ppa:%x, lpa:%x, status:%x\n"
+.LC297:
+	.string	"gc page in buf: lpa %x ppa = %x pageindex= %x\n"
+.LC298:
+	.string	"gc_do_copy_back: lpa %x des_ppa = %x %x gc_ppa= %x page_index= %d\n"
+.LC299:
+	.string	"gc %d: %d %d %d %d %d %d %d\n"
+.LC300:
+	.string	"GC_STATE_SCAN_ALL_PAGE = %x, vpn0 = %d, vpn1 = %d\n"
+.LC301:
+	.string	"gc free %x, %d\n"
+.LC302:
+	.string	"_c_user_data_density := %d\n"
+.LC303:
+	.string	"_c_totle_phy_density := %d\n"
+.LC304:
+	.string	"_c_totle_log_page := %d\n"
+.LC305:
+	.string	"_c_totle_data_density := %d\n"
+.LC306:
+	.string	"_c_ftl_pm_page_num := %d\n"
+.LC307:
+	.string	"_c_ftl_byte_pre_page := %d\n"
+.LC308:
+	.string	"_c_max_pm_sblk := %d\n"
+.LC309:
+	.string	"_min_slc_super_block := %d\n"
+.LC310:
+	.string	"_max_xlc_super_block := %d\n"
+.LC311:
+	.string	"gp_ftl_ext_info %p %p %p\n"
+.LC312:
+	.string	"flash info size: %d %d %d\n"
+.LC313:
+	.string	"ftl_init %x\n"
+.LC314:
+	.string	"ftlwrite %x %x %x %x\n"
+.LC315:
+	.string	"ftl_discard:(%x, %x, %x, %x)\n"
+.LC316:
+	.string	"id_block_prog_msb_ff_data slc page = %d pageadd=%x %x\n"
+.LC317:
+	.string	"write_idblock fix data %x %x\n"
+.LC318:
+	.string	"idblk:"
+.LC319:
+	.string	"write_idblock totle_sec %x %x\n"
+.LC320:
+	.string	"prog page: %x %x %x, %p %x %x %x\n"
+.LC321:
+	.string	"read page: %x %x %x %x\n"
+.LC322:
+	.string	"wl_lba %p %x %x %x\n"
+.LC323:
+	.string	"RKNAND_GET_DRM_KEY\n"
+.LC324:
+	.string	"rk_copy_from_user error\n"
+.LC325:
+	.string	"RKNAND_STORE_DRM_KEY\n"
+.LC326:
+	.string	"RKNAND_DIASBLE_SECURE_BOOT\n"
+.LC327:
+	.string	"RKNAND_ENASBLE_SECURE_BOOT\n"
+.LC328:
+	.string	"RKNAND_GET_SN_SECTOR\n"
+.LC329:
+	.string	"RKNAND_LOADER_UNLOCK\n"
+.LC330:
+	.string	"RKNAND_LOADER_STATUS\n"
+.LC331:
+	.string	"RKNAND_LOADER_LOCK\n"
+.LC332:
+	.string	"LockKey not match %d\n"
+.LC333:
+	.string	"RKNAND_GET_VENDOR_SECTOR\n"
+.LC334:
+	.string	"RKNAND_STORE_VENDOR_SECTOR\n"
+.LC335:
+	.string	"return ret = %lx\n"
+.LC336:
+	.string	"secureBootEn check error\n"
+.LC337:
+	.string	"\0013vendor storage %x,%x,%x\n"

commit 059b67e1f1d09c437bf2ad18f82be63a4662375e
Author: Zhihuan He <huan.he@rock-chips.com>
Date:   Fri Jun 18 17:23:13 2021 +0800

    arm64: configs: rockchip_defconfig enable DMC_DEBUG
    
    enable CONFIG_ARM_ROCKCHIP_DMC_DEBUG
    
    Change-Id: Id5c5353a18144d4bd69afa1263d56eee55f07bd8
    Signed-off-by: Zhihuan He <huan.he@rock-chips.com>

diff --git a/arch/arm64/configs/rockchip_defconfig b/arch/arm64/configs/rockchip_defconfig
index 26d5d1fe1ace..c129fe6de920 100644
--- a/arch/arm64/configs/rockchip_defconfig
+++ b/arch/arm64/configs/rockchip_defconfig
@@ -841,6 +841,7 @@ CONFIG_DEVFREQ_GOV_POWERSAVE=y
 CONFIG_DEVFREQ_GOV_USERSPACE=y
 CONFIG_ARM_ROCKCHIP_BUS_DEVFREQ=y
 CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ=y
+CONFIG_ARM_ROCKCHIP_DMC_DEBUG=y
 CONFIG_DEVFREQ_EVENT_ROCKCHIP_NOCP=y
 CONFIG_IIO=y
 CONFIG_IIO_BUFFER=y

commit d4f90f4fd98cc027846b9499264a33a1fddb2d8e
Author: Zhihuan He <huan.he@rock-chips.com>
Date:   Fri Jun 18 17:22:14 2021 +0800

    ARM: configs: rockchip_defconfig enable DMC_DEBUG
    
    enable CONFIG_ARM_ROCKCHIP_DMC_DEBUG
    
    Change-Id: Ia6837312b36f51eb519d19c95de1174e4e3543ec
    Signed-off-by: Zhihuan He <huan.he@rock-chips.com>

diff --git a/arch/arm/configs/rockchip_defconfig b/arch/arm/configs/rockchip_defconfig
index a439a52ead46..6004adbcd591 100644
--- a/arch/arm/configs/rockchip_defconfig
+++ b/arch/arm/configs/rockchip_defconfig
@@ -612,6 +612,7 @@ CONFIG_DEVFREQ_GOV_PERFORMANCE=y
 CONFIG_DEVFREQ_GOV_POWERSAVE=y
 CONFIG_DEVFREQ_GOV_USERSPACE=y
 CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ=y
+CONFIG_ARM_ROCKCHIP_DMC_DEBUG=y
 CONFIG_DEVFREQ_EVENT_ROCKCHIP_NOCP=y
 CONFIG_IIO=y
 CONFIG_IIO_BUFFER=y

commit fda7f718ae76f817920c409b674eff61d5ca773d
Author: Zhihuan He <huan.he@rock-chips.com>
Date:   Fri Jun 18 17:06:26 2021 +0800

    arm64: dts: rockchip: px30: add dmcdbg node
    
    Change-Id: Ic75fea4de3bec07c2730678bcf63d38aac2530a7
    Signed-off-by: Zhihuan He <huan.he@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/px30.dtsi b/arch/arm64/boot/dts/rockchip/px30.dtsi
index 69ceda7ab903..af7edeb0e351 100644
--- a/arch/arm64/boot/dts/rockchip/px30.dtsi
+++ b/arch/arm64/boot/dts/rockchip/px30.dtsi
@@ -1922,6 +1922,11 @@
 		};
 	};
 
+	dmcdbg: dmcdbg {
+		compatible = "rockchip,px30-dmcdbg";
+		status = "okay";
+	};
+
 	rockchip_system_monitor: rockchip-system-monitor {
 		compatible = "rockchip,system-monitor";
 

commit 0eb6c247c3eeec8a5b2fe9ab84dda296ff75caf0
Author: Zhihuan He <huan.he@rock-chips.com>
Date:   Tue Jun 22 16:52:41 2021 +0800

    PM / devfreq: rockchip_dmcdbg: add px30 support
    
    Change-Id: I9da8f3229b8a9c44ea1c1237bb36aa4b8762e545
    Signed-off-by: Zhihuan He <huan.he@rock-chips.com>

diff --git a/drivers/devfreq/rockchip_dmc_dbg.c b/drivers/devfreq/rockchip_dmc_dbg.c
index b35ac648b1d1..11553a00883b 100644
--- a/drivers/devfreq/rockchip_dmc_dbg.c
+++ b/drivers/devfreq/rockchip_dmc_dbg.c
@@ -1077,7 +1077,27 @@ static __maybe_unused int rv1126_dmcdbg_init(struct platform_device *pdev,
 	return 0;
 }
 
+static __maybe_unused int px30_dmcdbg_init(struct platform_device *pdev,
+					   struct rockchip_dmcdbg *dmcdbg)
+{
+	u32 version = 0x101;
+	int ret;
+
+	ret = rk_dmcdbg_sip_smc_match_ver(pdev, version);
+	if (ret)
+		return ret;
+
+	ret = proc_dmcdbg_init(pdev);
+	if (ret)
+		return ret;
+
+	proc_dmcinfo_init();
+
+	return 0;
+}
+
 static const struct of_device_id rockchip_dmcdbg_of_match[] = {
+	{ .compatible = "rockchip,px30-dmcdbg", .data = px30_dmcdbg_init },
 	{ .compatible = "rockchip,rv1126-dmcdbg", .data = rv1126_dmcdbg_init },
 	{ },
 };

commit ac365f86b9e7878980576355fb22810e469525f4
Author: Zhihuan He <huan.he@rock-chips.com>
Date:   Tue Jun 22 16:50:31 2021 +0800

    PM / devfreq: rockchip_dmcdbg: add dramid info
    
    Change-Id: Ibf4aca3e6c37cd3acc1348af578dde6df279ff62
    Signed-off-by: Zhihuan He <huan.he@rock-chips.com>

diff --git a/drivers/devfreq/rockchip_dmc_dbg.c b/drivers/devfreq/rockchip_dmc_dbg.c
index 17bbbd5bfb8c..b35ac648b1d1 100644
--- a/drivers/devfreq/rockchip_dmc_dbg.c
+++ b/drivers/devfreq/rockchip_dmc_dbg.c
@@ -78,6 +78,55 @@ struct dram_info {
 	unsigned int dramfreq;
 	unsigned int channel_num;
 	struct dram_cap_info ch[2];
+	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[] = {
@@ -192,9 +241,9 @@ static int dmcinfo_proc_show(struct seq_file *m, void *v)
 {
 	struct arm_smccc_res res;
 	struct dram_info *p_dram_info;
-	struct file *fp  = NULL;
-	char cur_freq[20] = {0};
-	char governor[20] = {0};
+	struct file *fp = NULL;
+	char cur_freq[20] = { 0 };
+	char governor[20] = { 0 };
 	loff_t pos;
 	u32 i;
 
@@ -213,25 +262,56 @@ static int dmcinfo_proc_show(struct seq_file *m, void *v)
 	p_dram_info = (struct dram_info *)dmcdbg_data.share_memory;
 
 	/* dram type information */
-	seq_printf(m,
-		   "DramType:	%s\n"
-		   ,
-		   p_dram_info->dramtype
-		   );
-
+	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) {
+			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 {
+			seq_printf(m, "Dram ID:	None\n");
+		}
+	}
 	/* dram capacity information */
-	seq_printf(m,
-		   "\n"
-		   "DramCapacity:\n"
-		   );
+	seq_printf(m, "\n"
+		      "DramCapacity:\n");
 
 	for (i = 0; i < p_dram_info->channel_num; i++) {
 		if (p_dram_info->channel_num == 2)
-			seq_printf(m,
-				   "Channel [%d]:\n"
-				   ,
-				   i
-				   );
+			seq_printf(m, "Channel [%d]:\n", i);
 
 		seq_printf(m,
 			   "CS Count:	%d\n"
@@ -241,8 +321,7 @@ static int dmcinfo_proc_show(struct seq_file *m, void *v)
 			   "CS0_Row:	%d\n"
 			   "CS1_Row:	%d\n"
 			   "DieBusWidth:	%d bit\n"
-			   "TotalSize:	%d MB\n"
-			   ,
+			   "TotalSize:	%d MB\n",
 			   p_dram_info->ch[i].rank,
 			   p_dram_info->ch[i].buswidth,
 			   p_dram_info->ch[i].col,
@@ -250,8 +329,7 @@ static int dmcinfo_proc_show(struct seq_file *m, void *v)
 			   p_dram_info->ch[i].cs0_row,
 			   p_dram_info->ch[i].cs1_row,
 			   p_dram_info->ch[i].die_buswidth,
-			   p_dram_info->ch[i].size
-			   );
+			   p_dram_info->ch[i].size);
 	}
 
 	/* check devfreq/dmc device */
@@ -260,10 +338,8 @@ static int dmcinfo_proc_show(struct seq_file *m, void *v)
 		seq_printf(m,
 			   "\n"
 			   "devfreq/dmc:	Disable\n"
-			   "DramFreq:	%d\n"
-			   ,
-			   p_dram_info->dramfreq
-			   );
+			   "DramFreq:	%d\n",
+			   p_dram_info->dramfreq);
 	} else {
 		pos = 0;
 		kernel_read(fp, cur_freq, sizeof(cur_freq), &pos);
@@ -282,15 +358,11 @@ static int dmcinfo_proc_show(struct seq_file *m, void *v)
 			   "\n"
 			   "devfreq/dmc:	Enable\n"
 			   "governor:	%s\n"
-			   "cur_freq:	%s\n"
-			   ,
-			   governor,
-			   cur_freq
-			   );
+			   "cur_freq:	%s\n",
+			   governor, cur_freq);
 		seq_printf(m,
 			   "NOTE:\n"
-			   "more information about dmc can get from /sys/class/devfreq/dmc.\n"
-			   );
+			   "more information about dmc can get from /sys/class/devfreq/dmc.\n");
 	}
 
 	return 0;
@@ -340,19 +412,15 @@ static int powersave_proc_show(struct seq_file *m, void *v)
 	}
 	p_power = (struct power_save_info *)dmcdbg_data.share_memory;
 
-	seq_printf(m,
-		   "low power information:\n"
-		   "\n"
-		   "[number]name: value\n"
-		   );
+	seq_printf(m, "low power information:\n"
+		      "\n"
+		      "[number]name: value\n");
 
 	p_uint = (unsigned int *)p_power;
 	for (i = 0; i < ARRAY_SIZE(power_save_msg); i++)
 		seq_printf(m,
-			   "[%d]%s: %d\n"
-			   ,
-			   i, power_save_msg[i], *(p_uint + i)
-			   );
+			   "[%d]%s: %d\n",
+			   i, power_save_msg[i], *(p_uint + i));
 
 	seq_printf(m,
 		   "\n"
@@ -364,8 +432,7 @@ static int powersave_proc_show(struct seq_file *m, void *v)
 		   "Support for setting multiple parameters at the same time.\n"
 		   "echo number=value,number=value,... > /proc/dmcdbg/powersave\n"
 		   "eg:\n"
-		   "  echo 0=1,1=32 > /proc/dmcdbg/powersave\n"
-		   );
+		   "  echo 0=1,1=32 > /proc/dmcdbg/powersave\n");
 
 	return 0;
 }
@@ -502,48 +569,34 @@ static int drvodt_proc_show(struct seq_file *m, void *v)
 	}
 	p_drvodt = (struct drv_odt_info *)dmcdbg_data.share_memory;
 
-	seq_printf(m,
-		   "drv and odt information:\n"
-		   "\n"
-		   "[number]name: value (ohm)\n"
-	);
+	seq_printf(m, "drv and odt information:\n"
+		      "\n"
+		      "[number]name: value (ohm)\n");
 
 	p_uint = (unsigned int *)p_drvodt;
 	for (i = 0; i < ARRAY_SIZE(drv_odt_msg); i++) {
 		if (*(p_uint + (i * 3)) == DRV_ODT_UNKNOWN)
 			seq_printf(m,
-				   "[%2d]%s: NULL (unknown) %c\n"
-				   ,
+				   "[%2d]%s: NULL (unknown) %c\n",
 				   i, drv_odt_msg[i],
-				   (*(p_uint + (i * 3) + 2) ==
-				    DRV_ODT_SUSPEND_FIX) ? '\0' : '*'
-			);
+				   (*(p_uint + (i * 3) + 2) == DRV_ODT_SUSPEND_FIX) ? '\0' : '*');
 		else if (*(p_uint + (i * 3) + 1) == DRV_ODT_UNKNOWN)
 			seq_printf(m,
-				   "[%2d]%s: %d (unknown) %c\n"
-				   ,
+				   "[%2d]%s: %d (unknown) %c\n",
 				   i, drv_odt_msg[i], *(p_uint + (i * 3)),
-				   (*(p_uint + (i * 3) + 2) ==
-				    DRV_ODT_SUSPEND_FIX) ? '\0' : '*'
-			);
+				   (*(p_uint + (i * 3) + 2) == DRV_ODT_SUSPEND_FIX) ? '\0' : '*');
 		else if (i < (ARRAY_SIZE(drv_odt_msg) - 2))
 			seq_printf(m,
-				   "[%2d]%s: %d (%d ohm) %c\n"
-				   ,
+				   "[%2d]%s: %d (%d ohm) %c\n",
 				   i, drv_odt_msg[i], *(p_uint + (i * 3)),
 				   *(p_uint + (i * 3) + 1),
-				   (*(p_uint + (i * 3) + 2) ==
-				    DRV_ODT_SUSPEND_FIX) ? '\0' : '*'
-			);
+				   (*(p_uint + (i * 3) + 2) == DRV_ODT_SUSPEND_FIX) ? '\0' : '*');
 		else
 			seq_printf(m,
-				   "[%2d]%s: %d (%d %%) %c\n"
-				   ,
+				   "[%2d]%s: %d (%d %%) %c\n",
 				   i, drv_odt_msg[i], *(p_uint + (i * 3)),
 				   *(p_uint + (i * 3) + 1),
-				   (*(p_uint + (i * 3) + 2) ==
-				    DRV_ODT_SUSPEND_FIX) ? '\0' : '*'
-			);
+				   (*(p_uint + (i * 3) + 2) == DRV_ODT_SUSPEND_FIX) ? '\0' : '*');
 	}
 
 	seq_printf(m,
@@ -558,8 +611,7 @@ static int drvodt_proc_show(struct seq_file *m, void *v)
 		   "eg: set soc side ca drv up and down to 20\n"
 		   "  echo 6=20,7=20 > /proc/dmcdbg/drvodt\n"
 		   "Note: Please update both up and down at the same time.\n"
-		   "      (*) mean unsupported setting value\n"
-	);
+		   "      (*) mean unsupported setting value\n");
 
 	return 0;
 }
@@ -694,28 +746,20 @@ static int skew_proc_show(struct seq_file *m, void *v)
 		return -EPERM;
 	}
 
-	seq_printf(m,
-		   "de-skew information:\n"
-		   "\n"
-		   "[group_number]name: value\n"
-	);
+	seq_printf(m, "de-skew information:\n"
+		      "\n"
+		      "[group_number]name: value\n");
 
 	for (group = 0; group < dmcdbg_data.skew_group_num; group++) {
 		if (dmcdbg_data.skew_group[group].note != NULL)
-			seq_printf(m,
-				"%s\n"
-				,
-				dmcdbg_data.skew_group[group].note
-			);
+			seq_printf(m, "%s\n",
+				   dmcdbg_data.skew_group[group].note);
 		p_uint = (unsigned int *)dmcdbg_data.skew_group[group].p_skew_info;
 		for (i = 0; i < dmcdbg_data.skew_group[group].skew_num; i++)
-			seq_printf(m,
-				"[%c%d_%d]%s: %d\n"
-				,
-				(i < 10) ? ' ' : '\0', group, i,
-				dmcdbg_data.skew_group[group].p_skew_timing[i],
-				*(p_uint + i)
-			);
+			seq_printf(m, "[%c%d_%d]%s: %d\n",
+				   (i < 10) ? ' ' : '\0', group, i,
+				   dmcdbg_data.skew_group[group].p_skew_timing[i],
+				   *(p_uint + i));
 	}
 
 	seq_printf(m,
@@ -728,8 +772,7 @@ static int skew_proc_show(struct seq_file *m, void *v)
 		   "Support for setting multiple parameters simultaneously.\n"
 		   "echo group_number=value,group_number=value,... > /proc/dmcdbg/deskew\n"
 		   "eg:\n"
-		   "  echo 0_1=8,1_2=8 > /proc/dmcdbg/deskew\n"
-	);
+		   "  echo 0_1=8,1_2=8 > /proc/dmcdbg/deskew\n");
 
 	return 0;
 }
@@ -876,18 +919,13 @@ static int regsinfo_proc_show(struct seq_file *m, void *v)
 	}
 	p_regsinfo = (struct registers_info *)dmcdbg_data.share_memory;
 
-	seq_printf(m,
-		   "registers base address information:\n"
-		   "\n"
-	);
+	seq_printf(m, "registers base address information:\n"
+		      "\n");
 
 	for (i = 0; i < p_regsinfo->regs_num; i++) {
-		seq_printf(m,
-			   "%s=0x%x\n"
-			   ,
+		seq_printf(m, "%s=0x%x\n",
 			   p_regsinfo->regs[i].regs_name,
-			   p_regsinfo->regs[i].regs_addr
-			   );
+			   p_regsinfo->regs[i].regs_addr);
 	}
 
 	return 0;
@@ -1040,7 +1078,7 @@ static __maybe_unused int rv1126_dmcdbg_init(struct platform_device *pdev,
 }
 
 static const struct of_device_id rockchip_dmcdbg_of_match[] = {
-	{ .compatible = "rockchip,rv1126-dmcdbg", .data = rv1126_dmcdbg_init},
+	{ .compatible = "rockchip,rv1126-dmcdbg", .data = rv1126_dmcdbg_init },
 	{ },
 };
 MODULE_DEVICE_TABLE(of, rockchip_dmcdbg_of_match);

commit 1115cdab2866cb71d05b8427b06ab2eda2893a32
Author: Zhihuan He <huan.he@rock-chips.com>
Date:   Tue Jun 22 16:39:40 2021 +0800

    PM / devfreq: rockchip_dmcdbg: updata rv1126 version to 0x102
    
    Change-Id: I44f489dbe383feb58436acf61defa21e9e48dc0d
    Signed-off-by: Zhihuan He <huan.he@rock-chips.com>

diff --git a/drivers/devfreq/rockchip_dmc_dbg.c b/drivers/devfreq/rockchip_dmc_dbg.c
index f1d51ad58dc4..17bbbd5bfb8c 100644
--- a/drivers/devfreq/rockchip_dmc_dbg.c
+++ b/drivers/devfreq/rockchip_dmc_dbg.c
@@ -74,7 +74,7 @@ struct dram_cap_info {
 
 struct dram_info {
 	unsigned int version;
-	char dramtype[10];
+	char dramtype[12];
 	unsigned int dramfreq;
 	unsigned int channel_num;
 	struct dram_cap_info ch[2];
@@ -1018,7 +1018,7 @@ static void rv1126_get_skew_parameter(void)
 static __maybe_unused int rv1126_dmcdbg_init(struct platform_device *pdev,
 					     struct rockchip_dmcdbg *dmcdbg)
 {
-	u32 version = 0x101;
+	u32 version = 0x102;
 	int ret;
 
 	ret = rk_dmcdbg_sip_smc_match_ver(pdev, version);

commit 1fe4802396eac99336e65a92d85947ab53d25095
Author: Zhihuan He <huan.he@rock-chips.com>
Date:   Mon Jun 21 14:35:52 2021 +0800

    PM / devfreq: rockchip_dmcdbg: refactor rv1126_dmcdbg_init()
    
    Change-Id: I47c2e3712aeacefa22ec4c589309ab13ce9ec7b1
    Signed-off-by: Zhihuan He <huan.he@rock-chips.com>

diff --git a/drivers/devfreq/rockchip_dmc_dbg.c b/drivers/devfreq/rockchip_dmc_dbg.c
index 80b25e9046d1..f1d51ad58dc4 100644
--- a/drivers/devfreq/rockchip_dmc_dbg.c
+++ b/drivers/devfreq/rockchip_dmc_dbg.c
@@ -905,6 +905,56 @@ static const struct file_operations regsinfo_proc_fops = {
 	.release	= single_release,
 };
 
+static int rk_dmcdbg_sip_smc_match_ver(struct platform_device *pdev,
+				       u32 match_ver)
+{
+	struct arm_smccc_res res;
+
+	/* check ddr_debug_func version */
+	res = sip_smc_dram(0, DDRDBG_FUNC_GET_VERSION,
+			   ROCKCHIP_SIP_CONFIG_DRAM_DEBUG);
+	dev_notice(&pdev->dev, "current ATF ddr_debug_func version 0x%lx.\n",
+		   res.a1);
+	/*
+	 * [15:8] major version, [7:0] minor version
+	 * major version must match both kernel dmcdbg and ATF ddr_debug_func.
+	 */
+	if (res.a0 || res.a1 < match_ver || ((res.a1 & 0xff00) != (match_ver & 0xff00))) {
+		dev_err(&pdev->dev,
+			"version invalid, need update to 0x%x or newer, the major version unmatch!\n",
+			match_ver);
+
+		return -ENXIO;
+	}
+
+	return 0;
+}
+
+static int proc_dmcdbg_init(struct platform_device *pdev)
+{
+	struct arm_smccc_res res;
+
+	/* request share memory for pass parameter */
+	res = sip_smc_request_share_mem(DMCDBG_PAGE_NUMS,
+					SHARE_PAGE_TYPE_DDRDBG);
+	if (res.a0 != 0) {
+		dev_err(&pdev->dev, "request share mem error!\n");
+		return -ENOMEM;
+	}
+
+	dmcdbg_data.share_memory = (void __iomem *)res.a1;
+	dmcdbg_data.inited_flag = 1;
+
+	/* create parent dir in /proc */
+	proc_dmcdbg_dir = proc_mkdir(PROC_DMCDBG_DIR_NAME, NULL);
+	if (!proc_dmcdbg_dir) {
+		dev_err(&pdev->dev, "create proc dir error!\n");
+		return -ENOENT;
+	}
+
+	return 0;
+}
+
 static int proc_regsinfo_init(void)
 {
 	/* create dmcinfo file */
@@ -968,43 +1018,19 @@ static void rv1126_get_skew_parameter(void)
 static __maybe_unused int rv1126_dmcdbg_init(struct platform_device *pdev,
 					     struct rockchip_dmcdbg *dmcdbg)
 {
-	struct arm_smccc_res res;
+	u32 version = 0x101;
+	int ret;
 
-	/* check ddr_debug_func version */
-	res = sip_smc_dram(0, DDRDBG_FUNC_GET_VERSION,
-			   ROCKCHIP_SIP_CONFIG_DRAM_DEBUG);
-	dev_notice(&pdev->dev, "current ATF ddr_debug_func version 0x%lx.\n",
-		   res.a1);
-	/*
-	 * [15:8] major version, [7:0] minor version
-	 * major version must match both kernel dmcdbg and ATF ddr_debug_func.
-	 */
-	if (res.a0 || res.a1 < 0x101 || ((res.a1 & 0xff00) != 0x100)) {
-		dev_err(&pdev->dev,
-			"version invalid,need update,the major version unmatch!\n");
-		return -ENXIO;
-	}
+	ret = rk_dmcdbg_sip_smc_match_ver(pdev, version);
+	if (ret)
+		return ret;
 
-	/* request share memory for pass parameter */
-	res = sip_smc_request_share_mem(DMCDBG_PAGE_NUMS,
-					SHARE_PAGE_TYPE_DDRDBG);
-	if (res.a0 != 0) {
-		dev_err(&pdev->dev, "request share mem error\n");
-		return -ENOMEM;
-	}
-
-	dmcdbg_data.share_memory = (void __iomem *)res.a1;
-	dmcdbg_data.inited_flag = 1;
+	ret = proc_dmcdbg_init(pdev);
+	if (ret)
+		return ret;
 
 	rv1126_get_skew_parameter();
 
-	/* create parent dir in /proc */
-	proc_dmcdbg_dir = proc_mkdir(PROC_DMCDBG_DIR_NAME, NULL);
-	if (!proc_dmcdbg_dir) {
-		dev_err(&pdev->dev, "create proc dir error!");
-		return -ENOENT;
-	}
-
 	proc_dmcinfo_init();
 	proc_powersave_init();
 	proc_drvodt_init();

commit 41284f5dd32a1a7a7ae36c0c6c481f4fa4cf3a43
Author: Herman Chen <herman.chen@rock-chips.com>
Date:   Wed Jun 2 11:53:23 2021 +0800

    video: rockchip: mpp: Fix mpp_free_task crash
    
    Due to hardware timeout the session may be released before the remaining
    task is alll finished. So mpp_free_task could run after mpp_dev_release.
    Then the session used in mpp_free_task could be invalid and crash the
    thread.
    
    So we attach session to the mpp_taskqueue and let the work thread to
    destroy and release session later.
    
    NOTE: the session is created in mpp_dev_open and attached to
    corresponding taskqueue on client init. So when we release the session in
    mpp_dev_release if the session is not attached to certain taskqueue just
    release it immediately.
    
    Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
    Change-Id: I9d4b2358154522e6bcde6e688592c0058781529a

diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c
index 9f6c55640d22..9114241ae455 100644
--- a/drivers/video/rockchip/mpp/mpp_common.c
+++ b/drivers/video/rockchip/mpp/mpp_common.c
@@ -220,6 +220,129 @@ int mpp_power_off(struct mpp_dev *mpp)
 	return 0;
 }
 
+static int mpp_session_clear(struct mpp_dev *mpp,
+			     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);
+	list_for_each_entry_safe(task, n,
+				 &session->pending_list,
+				 pending_link) {
+		/* abort task in taskqueue */
+		atomic_inc(&task->abort_request);
+		list_del_init(&task->pending_link);
+		kref_put(&task->ref, mpp_free_task);
+	}
+	mutex_unlock(&session->pending_lock);
+
+	return 0;
+}
+
+static struct mpp_session *mpp_session_init(void)
+{
+	struct mpp_session *session = kzalloc(sizeof(*session), GFP_KERNEL);
+
+	if (!session)
+		return NULL;
+
+	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);
+
+	mpp_dbg_session("session %p init\n", session);
+	return session;
+}
+
+int 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;
+
+	if (session->mpp) {
+		struct mpp_dev *mpp = session->mpp;
+
+		if (mpp->dev_ops->free_session)
+			mpp->dev_ops->free_session(session);
+
+		mpp_session_clear(mpp, session);
+
+		if (session->dma) {
+			mpp_iommu_down_read(mpp->iommu_info);
+			mpp_dma_session_destroy(session->dma);
+			mpp_iommu_up_read(mpp->iommu_info);
+			session->dma = NULL;
+		}
+	}
+
+	if (session->srv) {
+		struct mpp_service *srv = session->srv;
+
+		mutex_lock(&srv->session_lock);
+		list_del_init(&session->service_link);
+		mutex_unlock(&srv->session_lock);
+	}
+
+	list_del_init(&session->session_link);
+
+	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);
+	mutex_lock(&queue->session_lock);
+	list_add_tail(&session->session_link, &queue->session_attach);
+	mutex_unlock(&queue->session_lock);
+}
+
+static void mpp_session_detach_workqueue(struct mpp_session *session)
+{
+	struct mpp_taskqueue *queue;
+
+	if (!session->mpp || !session->mpp->queue)
+		return;
+
+	mpp_dbg_session("session %p:%d detach\n", session, session->index);
+	queue = session->mpp->queue;
+
+	mutex_lock(&queue->session_lock);
+	list_del_init(&session->session_link);
+	list_add_tail(&session->session_link, &queue->session_detach);
+	atomic_inc(&queue->detach_count);
+	mutex_unlock(&queue->session_lock);
+
+	mpp_taskqueue_trigger_work(session->mpp);
+}
+
 static int
 mpp_session_push_pending(struct mpp_session *session,
 			 struct mpp_task *task)
@@ -588,37 +711,21 @@ static void mpp_task_try_run(struct kthread_work *work_s)
 	}
 
 done:
-	mpp_debug_leave();
-}
+	if (atomic_read(&queue->detach_count)) {
+		struct mpp_session *session = NULL, *n;
 
-static int mpp_session_clear(struct mpp_dev *mpp,
-			     struct mpp_session *session)
-{
-	struct mpp_task *task = NULL, *n;
+		mpp_dbg_session("%s detach count %d\n", dev_name(mpp->dev),
+				atomic_read(&queue->detach_count));
 
-	/* 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);
+		mutex_lock(&queue->session_lock);
+		list_for_each_entry_safe(session, n, &queue->session_detach,
+					 session_link) {
+			if (!mpp_session_deinit(session))
+				atomic_dec(&queue->detach_count);
+		}
 
-	/* clear session pending list */
-	mutex_lock(&session->pending_lock);
-	list_for_each_entry_safe(task, n,
-				 &session->pending_list,
-				 pending_link) {
-		/* abort task in taskqueue */
-		atomic_inc(&task->abort_request);
-		list_del_init(&task->pending_link);
-		kref_put(&task->ref, mpp_free_task);
+		mutex_unlock(&queue->session_lock);
 	}
-	mutex_unlock(&session->pending_lock);
-
-	return 0;
 }
 
 static int mpp_wait_result(struct mpp_session *session,
@@ -785,14 +892,19 @@ struct mpp_taskqueue *mpp_taskqueue_init(struct device *dev)
 	if (!queue)
 		return NULL;
 
+	mutex_init(&queue->session_lock);
 	mutex_init(&queue->pending_lock);
 	mutex_init(&queue->running_lock);
 	mutex_init(&queue->mmu_lock);
 	mutex_init(&queue->dev_lock);
+	INIT_LIST_HEAD(&queue->session_attach);
+	INIT_LIST_HEAD(&queue->session_detach);
 	INIT_LIST_HEAD(&queue->pending_list);
 	INIT_LIST_HEAD(&queue->running_list);
 	INIT_LIST_HEAD(&queue->mmu_list);
 	INIT_LIST_HEAD(&queue->dev_list);
+
+	atomic_set(&queue->detach_count, 0);
 	/* default taskqueue has max 16 task capacity */
 	queue->task_capacity = MPP_MAX_TASK_CAPACITY;
 
@@ -972,6 +1084,7 @@ static int mpp_process_request(struct mpp_session *session,
 			if (ret)
 				return ret;
 		}
+		mpp_session_attach_workqueue(session, mpp->queue);
 	} break;
 	case MPP_CMD_INIT_DRIVER_DATA: {
 		u32 val;
@@ -1206,26 +1319,17 @@ static int mpp_dev_open(struct inode *inode, struct file *filp)
 					       mpp_cdev);
 	mpp_debug_enter();
 
-	session = kzalloc(sizeof(*session), GFP_KERNEL);
+	session = mpp_session_init();
 	if (!session)
 		return -ENOMEM;
 
 	session->srv = srv;
-	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->session_link);
-
-	init_waitqueue_head(&session->wait);
-	atomic_set(&session->task_count, 0);
-	atomic_set(&session->release_request, 0);
-
-	mutex_lock(&srv->session_lock);
-	list_add_tail(&session->session_link, &srv->session_list);
-	mutex_unlock(&srv->session_lock);
+	if (session->srv) {
+		mutex_lock(&srv->session_lock);
+		list_add_tail(&session->service_link, &srv->session_list);
+		mutex_unlock(&srv->session_lock);
+	}
 	filp->private_data = (void *)session;
 
 	mpp_debug_leave();
@@ -1235,9 +1339,6 @@ static int mpp_dev_open(struct inode *inode, struct file *filp)
 
 static int mpp_dev_release(struct inode *inode, struct file *filp)
 {
-	int ret;
-	int val;
-	struct mpp_dev *mpp;
 	struct mpp_session *session = filp->private_data;
 
 	mpp_debug_enter();
@@ -1249,32 +1350,12 @@ static int mpp_dev_release(struct inode *inode, struct file *filp)
 
 	/* wait for task all done */
 	atomic_inc(&session->release_request);
-	ret = readx_poll_timeout(atomic_read,
-				 &session->task_count,
-				 val, val == 0, 1000, 500000);
-	if (ret == -ETIMEDOUT)
-		mpp_err("session %p, wait task count %d time out\n",
-			session, atomic_read(&session->task_count));
-	wake_up(&session->wait);
-
-	/* release device resource */
-	mpp = session->mpp;
-	if (mpp) {
-		if (mpp->dev_ops->free_session)
-			mpp->dev_ops->free_session(session);
 
-		/* remove this filp from the asynchronusly notified filp's */
-		mpp_session_clear(mpp, session);
-
-		mpp_iommu_down_read(mpp->iommu_info);
-		mpp_dma_session_destroy(session->dma);
-		mpp_iommu_up_read(mpp->iommu_info);
-	}
-	mutex_lock(&session->srv->session_lock);
-	list_del_init(&session->session_link);
-	mutex_unlock(&session->srv->session_lock);
+	if (session->mpp)
+		mpp_session_detach_workqueue(session);
+	else
+		mpp_session_deinit(session);
 
-	kfree(session);
 	filp->private_data = NULL;
 
 	mpp_debug_leave();
diff --git a/drivers/video/rockchip/mpp/mpp_common.h b/drivers/video/rockchip/mpp/mpp_common.h
index 5c0a5f2f7e8f..1e4d84415bc0 100644
--- a/drivers/video/rockchip/mpp/mpp_common.h
+++ b/drivers/video/rockchip/mpp/mpp_common.h
@@ -350,6 +350,8 @@ struct mpp_session {
 	u16 trans_table[MPP_MAX_REG_TRANS_NUM];
 	u32 msg_flags;
 	/* link to mpp_service session_list */
+	struct list_head service_link;
+	/* link to mpp_workqueue session_attach / session_detach */
 	struct list_head session_link;
 	/* private data */
 	void *priv;
@@ -399,6 +401,14 @@ struct mpp_task {
 };
 
 struct mpp_taskqueue {
+	/* lock for session attach and session_detach */
+	struct mutex session_lock;
+	/* link to session session_link for attached sessions */
+	struct list_head session_attach;
+	/* link to session session_link for detached sessions */
+	struct list_head session_detach;
+	atomic_t detach_count;
+
 	/* lock for pending list */
 	struct mutex pending_lock;
 	struct list_head pending_list;
@@ -450,6 +460,7 @@ struct mpp_service {
 	struct mpp_taskqueue *task_queues[MPP_DEVICE_BUTT];
 	u32 reset_group_cnt;
 	struct mpp_reset_group *reset_groups[MPP_DEVICE_BUTT];
+
 	/* lock for session list */
 	struct mutex session_lock;
 	struct list_head session_list;
@@ -543,6 +554,8 @@ int mpp_task_dump_reg(struct mpp_dev *mpp,
 int mpp_task_dump_hw_reg(struct mpp_dev *mpp,
 			 struct mpp_task *task);
 
+int mpp_session_deinit(struct mpp_session *session);
+
 int mpp_dev_probe(struct mpp_dev *mpp,
 		  struct platform_device *pdev);
 int mpp_dev_remove(struct mpp_dev *mpp);
diff --git a/drivers/video/rockchip/mpp/mpp_debug.h b/drivers/video/rockchip/mpp/mpp_debug.h
index 0c1132f2e947..c279d94a03c8 100644
--- a/drivers/video/rockchip/mpp/mpp_debug.h
+++ b/drivers/video/rockchip/mpp/mpp_debug.h
@@ -47,6 +47,8 @@
 #define DEBUG_GET_PERF_VAL			0x00100000
 #define DEBUG_SRAM_INFO				0x00200000
 
+#define DEBUG_SESSION				0x00400000
+
 #define PRINT_FUNCTION				0x80000000
 #define PRINT_LINE				0x40000000
 
@@ -88,4 +90,19 @@ extern unsigned int mpp_dev_debug;
 #define mpp_err(fmt, args...)					\
 		pr_err("%s:%d: " fmt, __func__, __LINE__, ##args)
 
+#define mpp_dbg_link_flow(fmt, args...)				\
+	do {							\
+		if (unlikely(mpp_dev_debug & DEBUG_LINK_TABLE)) {		\
+			pr_info("%s:%d: " fmt,			\
+				 __func__, __LINE__, ##args);	\
+		}						\
+	} while (0)
+
+#define mpp_dbg_session(fmt, args...)				\
+	do {							\
+		if (unlikely(mpp_dev_debug & DEBUG_SESSION)) {	\
+			pr_info(fmt, ##args);			\
+		}						\
+	} while (0)
+
 #endif
diff --git a/drivers/video/rockchip/mpp/mpp_service.c b/drivers/video/rockchip/mpp/mpp_service.c
index a25232a65ff2..b404c726d624 100644
--- a/drivers/video/rockchip/mpp/mpp_service.c
+++ b/drivers/video/rockchip/mpp/mpp_service.c
@@ -170,7 +170,7 @@ static int mpp_show_session_summary(struct seq_file *seq, void *offset)
 	mutex_lock(&srv->session_lock);
 	list_for_each_entry_safe(session, n,
 				 &srv->session_list,
-				 session_link) {
+				 service_link) {
 		struct  mpp_dev *mpp;
 
 		if (!session->priv)

commit 0d79e76e7934366ea78f5600c132ea6963c45461
Author: shengfei Xu <xsf@rock-chips.com>
Date:   Tue Jun 22 09:30:58 2021 +0800

    arm64: dts: rockchip: enable the suspend default config for rk3568-linux
    
    Signed-off-by: shengfei Xu <xsf@rock-chips.com>
    Change-Id: I6fefa1d37cf7e1d7bade038f2b909a62417ec254

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
index 3f4d0e9a0fdc..8e96b1bfb33a 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
@@ -53,3 +53,7 @@
 &rng {
 	status = "okay";
 };
+
+&rockchip_suspend {
+	status = "okay";
+};

commit b4b17e14016b674c1f40d2000e48e5a15fd236b8
Author: shengfei Xu <xsf@rock-chips.com>
Date:   Tue Jun 22 09:30:58 2021 +0800

    arm64: dts: rockchip: enable the suspend default config for rk3568-android
    
    Signed-off-by: shengfei Xu <xsf@rock-chips.com>
    Change-Id: I9581ce931162012ecf508c6d14990b98e8466361

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-android.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-android.dtsi
index 01cd37c04e1a..55a1716dc569 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-android.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-android.dtsi
@@ -69,6 +69,10 @@
 	status = "okay";
 };
 
+&rockchip_suspend {
+	status = "okay";
+};
+
 &vop {
 	support-multi-area;
 };

commit 7bb4da1139558c5b9a228b0df715fededa508b99
Author: J. Avila <elavila@google.com>
Date:   Mon Jun 21 22:27:22 2021 +0000

    ANDROID: GKI: Update the ABI XML
    
    Leaf changes summary: 18 artifacts changed
    Changed leaf types summary: 0 leaf type changed
    Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 18 Added functions
    Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
    
    18 Added functions:
    
      [A] 'function void __hvc_resize(hvc_struct*, winsize)'
      [A] 'function ssize_t __splice_from_pipe(pipe_inode_info*, splice_desc*, splice_actor*)'
      [A] 'function void bt_err(const char*, ...)'
      [A] 'function int fasync_helper(int, file*, int, fasync_struct**)'
      [A] 'function hci_dev* hci_alloc_dev()'
      [A] 'function void hci_free_dev(hci_dev*)'
      [A] 'function int hci_recv_frame(hci_dev*, sk_buff*)'
      [A] 'function int hci_register_dev(hci_dev*)'
      [A] 'function void hci_unregister_dev(hci_dev*)'
      [A] 'function hvc_struct* hvc_alloc(uint32_t, int, const hv_ops*, int)'
      [A] 'function int hvc_instantiate(uint32_t, int, const hv_ops*)'
      [A] 'function void hvc_kick()'
      [A] 'function int hvc_poll(hvc_struct*)'
      [A] 'function int hvc_remove(hvc_struct*)'
      [A] 'function void kill_fasync(fasync_struct**, int, int)'
      [A] 'function void pipe_lock(pipe_inode_info*)'
      [A] 'function void pipe_unlock(pipe_inode_info*)'
      [A] 'function void security_sk_clone(const sock*, sock*)'
    
    Bug: 191700886
    Signed-off-by: J. Avila <elavila@google.com>
    Change-Id: I81844a00e8439abd72da0a0f4723f33ecee2075e

diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml
index 735c48f9990b..4553bb7e0250 100644
--- a/android/abi_gki_aarch64.xml
+++ b/android/abi_gki_aarch64.xml
@@ -73,6 +73,7 @@
       <elf-symbol name='__get_free_pages' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x93fca811'/>
       <elf-symbol name='__get_task_comm' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x2b13a779'/>
       <elf-symbol name='__hrtimer_get_remaining' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xc40e9952'/>
+      <elf-symbol name='__hvc_resize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x430b06f7'/>
       <elf-symbol name='__hwspin_lock_timeout' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x2be80bc0'/>
       <elf-symbol name='__hwspin_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x59f51a0a'/>
       <elf-symbol name='__init_rwsem' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x65294bcf'/>
@@ -165,6 +166,7 @@
       <elf-symbol name='__sock_recv_ts_and_drops' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xb6d911a0'/>
       <elf-symbol name='__spi_alloc_controller' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x76dacc7'/>
       <elf-symbol name='__spi_register_driver' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x611cf807'/>
+      <elf-symbol name='__splice_from_pipe' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xeeef135'/>
       <elf-symbol name='__spmi_driver_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x860b018f'/>
       <elf-symbol name='__srcu_read_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xe0cc9430'/>
       <elf-symbol name='__srcu_read_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xad312c8'/>
@@ -320,6 +322,7 @@
       <elf-symbol name='bpf_trace_run7' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x437d9d4a'/>
       <elf-symbol name='bpf_trace_run8' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x18a5ec0c'/>
       <elf-symbol name='bpf_warn_invalid_xdp_action' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x5c2bcd37'/>
+      <elf-symbol name='bt_err' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x47022514'/>
       <elf-symbol name='build_skb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x6758bffe'/>
       <elf-symbol name='bus_find_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xac629f52'/>
       <elf-symbol name='bus_find_device_by_name' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x4d97bc1d'/>
@@ -987,6 +990,7 @@
       <elf-symbol name='extcon_set_state_sync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x69b46160'/>
       <elf-symbol name='extcon_unregister_notifier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xfd34600d'/>
       <elf-symbol name='fast_smmu_put_dma_cookie' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x12755c5c'/>
+      <elf-symbol name='fasync_helper' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xcf305773'/>
       <elf-symbol name='fd_install' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x7597fc83'/>
       <elf-symbol name='fget' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x57709d57'/>
       <elf-symbol name='filemap_fault' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xcf73ae7'/>
@@ -1106,6 +1110,11 @@
       <elf-symbol name='handle_nested_irq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x549525ef'/>
       <elf-symbol name='handle_simple_irq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x3cf6bff'/>
       <elf-symbol name='handle_sysrq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x7647726c'/>
+      <elf-symbol name='hci_alloc_dev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x7893273'/>
+      <elf-symbol name='hci_free_dev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x9bc910f3'/>
+      <elf-symbol name='hci_recv_frame' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xa1f5223f'/>
+      <elf-symbol name='hci_register_dev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x23ab36e9'/>
+      <elf-symbol name='hci_unregister_dev' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xa95bebf6'/>
       <elf-symbol name='hex2bin' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x2edbeaf7'/>
       <elf-symbol name='hex_dump_to_buffer' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xfe916dc6'/>
       <elf-symbol name='hex_to_bin' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x11f7ed4c'/>
@@ -1116,6 +1125,11 @@
       <elf-symbol name='hrtimer_init_sleeper' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x8739d645'/>
       <elf-symbol name='hrtimer_start_range_ns' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xc38b7856'/>
       <elf-symbol name='hrtimer_try_to_cancel' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x3094c67f'/>
+      <elf-symbol name='hvc_alloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xaf143b1b'/>
+      <elf-symbol name='hvc_instantiate' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x81237ca1'/>
+      <elf-symbol name='hvc_kick' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x9833bc0c'/>
+      <elf-symbol name='hvc_poll' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x394e6b67'/>
+      <elf-symbol name='hvc_remove' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x7cf99443'/>
       <elf-symbol name='hwrng_register' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x6cfb19d0'/>
       <elf-symbol name='hwrng_unregister' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xb605aeff'/>
       <elf-symbol name='hwspin_lock_free' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xe62ea5fc'/>
@@ -1335,6 +1349,7 @@
       <elf-symbol name='kfree' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x37a0cba'/>
       <elf-symbol name='kfree_call_rcu' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x19f462ab'/>
       <elf-symbol name='kfree_skb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xabac9ac'/>
+      <elf-symbol name='kill_fasync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x7133c6b9'/>
       <elf-symbol name='kmalloc_order_trace' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xa202a8e5'/>
       <elf-symbol name='kmem_cache_alloc' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xa063a4c1'/>
       <elf-symbol name='kmem_cache_alloc_bulk' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x5526fe99'/>
@@ -1702,6 +1717,8 @@
       <elf-symbol name='pinctrl_pm_select_sleep_state' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x7a085d2d'/>
       <elf-symbol name='pinctrl_select_state' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xf9274f70'/>
       <elf-symbol name='pinctrl_utils_free_map' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xfc300073'/>
+      <elf-symbol name='pipe_lock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x338d4f17'/>
+      <elf-symbol name='pipe_unlock' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xd04e9893'/>
       <elf-symbol name='platform_device_add' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xcf1eef51'/>
       <elf-symbol name='platform_device_add_data' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x6224d6d2'/>
       <elf-symbol name='platform_device_add_properties' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xceb5f873'/>
@@ -1975,6 +1992,7 @@
       <elf-symbol name='security_sctp_assoc_request' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xc64416e5'/>
       <elf-symbol name='security_sctp_bind_connect' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xbc794b62'/>
       <elf-symbol name='security_sctp_sk_clone' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xcea0c0ff'/>
+      <elf-symbol name='security_sk_clone' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xe06141e9'/>
       <elf-symbol name='security_sock_graft' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xda10ec3'/>
       <elf-symbol name='securityfs_create_dir' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x8e91f5eb'/>
       <elf-symbol name='securityfs_create_file' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xb153fb6c'/>
@@ -3674,27 +3692,27 @@
           <var-decl name='nodeinfo' type-id='687d975e' visibility='default' filepath='include/linux/memcontrol.h' line='314' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='module_notes_attrs' size-in-bits='128' is-struct='yes' visibility='default' filepath='kernel/module.c' line='1571' column='1' id='96b6b914'>
+      <class-decl name='module_notes_attrs' size-in-bits='128' is-struct='yes' visibility='default' filepath='kernel/module.c' line='1573' column='1' id='96b6b914'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='dir' type-id='d30bdc51' visibility='default' filepath='kernel/module.c' line='1572' column='1'/>
+          <var-decl name='dir' type-id='d30bdc51' visibility='default' filepath='kernel/module.c' line='1574' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='notes' type-id='f0981eeb' visibility='default' filepath='kernel/module.c' line='1573' column='1'/>
+          <var-decl name='notes' type-id='f0981eeb' visibility='default' filepath='kernel/module.c' line='1575' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='attrs' type-id='7cfae8e1' visibility='default' filepath='kernel/module.c' line='1574' column='1'/>
+          <var-decl name='attrs' type-id='7cfae8e1' visibility='default' filepath='kernel/module.c' line='1576' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='module_param_attrs' is-struct='yes' visibility='default' is-declaration-only='yes' id='9e045430'/>
-      <class-decl name='module_sect_attrs' size-in-bits='384' is-struct='yes' visibility='default' filepath='kernel/module.c' line='1458' column='1' id='b43b0dce'>
+      <class-decl name='module_sect_attrs' size-in-bits='384' is-struct='yes' visibility='default' filepath='kernel/module.c' line='1460' column='1' id='b43b0dce'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='grp' type-id='e4af473b' visibility='default' filepath='kernel/module.c' line='1459' column='1'/>
+          <var-decl name='grp' type-id='e4af473b' visibility='default' filepath='kernel/module.c' line='1461' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='nsections' type-id='f0981eeb' visibility='default' filepath='kernel/module.c' line='1460' column='1'/>
+          <var-decl name='nsections' type-id='f0981eeb' visibility='default' filepath='kernel/module.c' line='1462' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='attrs' type-id='ae08da59' visibility='default' filepath='kernel/module.c' line='1461' column='1'/>
+          <var-decl name='attrs' type-id='ae08da59' visibility='default' filepath='kernel/module.c' line='1463' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='nameidata' is-struct='yes' visibility='default' is-declaration-only='yes' id='0319fc05'/>
@@ -5651,14 +5669,6 @@
           <var-decl name='coa_decompress' type-id='8801b8af' visibility='default' filepath='include/linux/crypto.h' line='368' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='rcu_special' size-in-bits='32' visibility='default' filepath='include/linux/sched.h' line='624' column='1' id='a324790e'>
-        <data-member access='public'>
-          <var-decl name='b' type-id='6a7976cc' visibility='default' filepath='include/linux/sched.h' line='632' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='s' type-id='19c2251e' visibility='default' filepath='include/linux/sched.h' line='633' column='1'/>
-        </data-member>
-      </union-decl>
       <class-decl name='module' size-in-bits='7168' is-struct='yes' visibility='default' filepath='include/linux/module.h' line='332' column='1' id='29476915'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='state' type-id='327e04c6' visibility='default' filepath='include/linux/module.h' line='333' column='1'/>
@@ -5835,6 +5845,14 @@
           <var-decl name='android_kabi_reserved4' type-id='91ce1af9' visibility='default' filepath='include/linux/module.h' line='496' column='1'/>
         </data-member>
       </class-decl>
+      <union-decl name='rcu_special' size-in-bits='32' visibility='default' filepath='include/linux/sched.h' line='624' column='1' id='a324790e'>
+        <data-member access='public'>
+          <var-decl name='b' type-id='6a7976cc' visibility='default' filepath='include/linux/sched.h' line='632' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='s' type-id='19c2251e' visibility='default' filepath='include/linux/sched.h' line='633' column='1'/>
+        </data-member>
+      </union-decl>
       <enum-decl name='module_state' filepath='include/linux/module.h' line='281' column='1' id='327e04c6'>
         <underlying-type type-id='9cac1fee'/>
         <enumerator name='MODULE_STATE_LIVE' value='0'/>
@@ -12304,12 +12322,12 @@
         </data-member>
       </class-decl>
       <class-decl name='mnt_namespace' is-struct='yes' visibility='default' is-declaration-only='yes' id='de031042'/>
-      <class-decl name='module_sect_attr' size-in-bits='512' is-struct='yes' visibility='default' filepath='kernel/module.c' line='1453' column='1' id='def413c9'>
+      <class-decl name='module_sect_attr' size-in-bits='512' is-struct='yes' visibility='default' filepath='kernel/module.c' line='1455' column='1' id='def413c9'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='battr' type-id='d83a2db1' visibility='default' filepath='kernel/module.c' line='1454' column='1'/>
+          <var-decl name='battr' type-id='d83a2db1' visibility='default' filepath='kernel/module.c' line='1456' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='address' type-id='7359adad' visibility='default' filepath='kernel/module.c' line='1455' column='1'/>
+          <var-decl name='address' type-id='7359adad' visibility='default' filepath='kernel/module.c' line='1457' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='net' size-in-bits='44544' is-struct='yes' visibility='default' filepath='include/net/net_namespace.h' line='51' column='1' id='bd965180'>
@@ -16135,69 +16153,69 @@
           <var-decl name='ws_ypixel' type-id='8efea9e5' visibility='default' filepath='include/uapi/asm-generic/termios.h' line='19' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='workqueue_struct' size-in-bits='2560' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='237' column='1' id='a5159c01'>
+      <class-decl name='workqueue_struct' size-in-bits='2560' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='238' column='1' id='a5159c01'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='pwqs' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='238' column='1'/>
+          <var-decl name='pwqs' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='239' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='239' column='1'/>
+          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='240' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='mutex' type-id='925167dc' visibility='default' filepath='kernel/workqueue.c' line='241' column='1'/>
+          <var-decl name='mutex' type-id='925167dc' visibility='default' filepath='kernel/workqueue.c' line='242' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='work_color' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='242' column='1'/>
+          <var-decl name='work_color' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='243' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='544'>
-          <var-decl name='flush_color' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='243' column='1'/>
+          <var-decl name='flush_color' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='244' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='nr_pwqs_to_flush' type-id='49178f86' visibility='default' filepath='kernel/workqueue.c' line='244' column='1'/>
+          <var-decl name='nr_pwqs_to_flush' type-id='49178f86' visibility='default' filepath='kernel/workqueue.c' line='245' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='640'>
-          <var-decl name='first_flusher' type-id='ec037527' visibility='default' filepath='kernel/workqueue.c' line='245' column='1'/>
+          <var-decl name='first_flusher' type-id='ec037527' visibility='default' filepath='kernel/workqueue.c' line='246' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='flusher_queue' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='246' column='1'/>
+          <var-decl name='flusher_queue' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='247' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='flusher_overflow' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='247' column='1'/>
+          <var-decl name='flusher_overflow' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='248' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='960'>
-          <var-decl name='maydays' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='249' column='1'/>
+          <var-decl name='maydays' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='250' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1088'>
-          <var-decl name='rescuer' type-id='50a159c7' visibility='default' filepath='kernel/workqueue.c' line='250' column='1'/>
+          <var-decl name='rescuer' type-id='50a159c7' visibility='default' filepath='kernel/workqueue.c' line='251' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1152'>
-          <var-decl name='nr_drainers' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='252' column='1'/>
+          <var-decl name='nr_drainers' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='253' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1184'>
-          <var-decl name='saved_max_active' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='253' column='1'/>
+          <var-decl name='saved_max_active' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='254' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1216'>
-          <var-decl name='unbound_attrs' type-id='cfd15e7e' visibility='default' filepath='kernel/workqueue.c' line='255' column='1'/>
+          <var-decl name='unbound_attrs' type-id='cfd15e7e' visibility='default' filepath='kernel/workqueue.c' line='256' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1280'>
-          <var-decl name='dfl_pwq' type-id='a7a31b92' visibility='default' filepath='kernel/workqueue.c' line='256' column='1'/>
+          <var-decl name='dfl_pwq' type-id='a7a31b92' visibility='default' filepath='kernel/workqueue.c' line='257' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1344'>
-          <var-decl name='wq_dev' type-id='5cebc26e' visibility='default' filepath='kernel/workqueue.c' line='259' column='1'/>
+          <var-decl name='wq_dev' type-id='5cebc26e' visibility='default' filepath='kernel/workqueue.c' line='260' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1408'>
-          <var-decl name='name' type-id='6653bb13' visibility='default' filepath='kernel/workqueue.c' line='264' column='1'/>
+          <var-decl name='name' type-id='6653bb13' visibility='default' filepath='kernel/workqueue.c' line='265' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1600'>
-          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='kernel/workqueue.c' line='271' column='1'/>
+          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='kernel/workqueue.c' line='272' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2048'>
-          <var-decl name='flags' type-id='f0981eeb' visibility='default' filepath='kernel/workqueue.c' line='274' column='1'/>
+          <var-decl name='flags' type-id='f0981eeb' visibility='default' filepath='kernel/workqueue.c' line='275' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2112'>
-          <var-decl name='cpu_pwqs' type-id='a7a31b92' visibility='default' filepath='kernel/workqueue.c' line='275' column='1'/>
+          <var-decl name='cpu_pwqs' type-id='a7a31b92' visibility='default' filepath='kernel/workqueue.c' line='276' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2176'>
-          <var-decl name='numa_pwq_tbl' type-id='55b5dc02' visibility='default' filepath='kernel/workqueue.c' line='276' column='1'/>
+          <var-decl name='numa_pwq_tbl' type-id='55b5dc02' visibility='default' filepath='kernel/workqueue.c' line='277' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='xfrm_policy' size-in-bits='6528' is-struct='yes' visibility='default' filepath='include/net/xfrm.h' line='573' column='1' id='ccf6c819'>
@@ -21547,45 +21565,45 @@
           <var-decl name='domain_data' type-id='53e3a7d6' visibility='default' filepath='include/linux/pm.h' line='549' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='pool_workqueue' size-in-bits='2048' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='198' column='1' id='b0355154'>
+      <class-decl name='pool_workqueue' size-in-bits='2048' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='199' column='1' id='b0355154'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='pool' type-id='1ce8c5e4' visibility='default' filepath='kernel/workqueue.c' line='199' column='1'/>
+          <var-decl name='pool' type-id='1ce8c5e4' visibility='default' filepath='kernel/workqueue.c' line='200' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='wq' type-id='242e3d19' visibility='default' filepath='kernel/workqueue.c' line='200' column='1'/>
+          <var-decl name='wq' type-id='242e3d19' visibility='default' filepath='kernel/workqueue.c' line='201' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='work_color' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='201' column='1'/>
+          <var-decl name='work_color' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='202' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='160'>
-          <var-decl name='flush_color' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='202' column='1'/>
+          <var-decl name='flush_color' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='203' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='refcnt' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='203' column='1'/>
+          <var-decl name='refcnt' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='204' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='224'>
-          <var-decl name='nr_in_flight' type-id='73c97830' visibility='default' filepath='kernel/workqueue.c' line='204' column='1'/>
+          <var-decl name='nr_in_flight' type-id='73c97830' visibility='default' filepath='kernel/workqueue.c' line='205' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='nr_active' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='206' column='1'/>
+          <var-decl name='nr_active' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='207' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='736'>
-          <var-decl name='max_active' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='207' column='1'/>
+          <var-decl name='max_active' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='208' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='768'>
-          <var-decl name='delayed_works' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='208' column='1'/>
+          <var-decl name='delayed_works' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='209' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='896'>
-          <var-decl name='pwqs_node' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='209' column='1'/>
+          <var-decl name='pwqs_node' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='210' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='mayday_node' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='210' column='1'/>
+          <var-decl name='mayday_node' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='211' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1152'>
-          <var-decl name='unbound_release_work' type-id='ef9025d0' visibility='default' filepath='kernel/workqueue.c' line='218' column='1'/>
+          <var-decl name='unbound_release_work' type-id='ef9025d0' visibility='default' filepath='kernel/workqueue.c' line='219' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1536'>
-          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='kernel/workqueue.c' line='219' column='1'/>
+          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='kernel/workqueue.c' line='220' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='prot_inuse' is-struct='yes' visibility='default' is-declaration-only='yes' id='ac763c5d'/>
@@ -22266,23 +22284,23 @@
           <var-decl name='no_numa' type-id='b50a4934' visibility='default' filepath='include/linux/workqueue.h' line='161' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='wq_device' size-in-bits='7680' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='5191' column='1' id='a88ecfc8'>
+      <class-decl name='wq_device' size-in-bits='7680' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='5192' column='1' id='a88ecfc8'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='wq' type-id='242e3d19' visibility='default' filepath='kernel/workqueue.c' line='5192' column='1'/>
+          <var-decl name='wq' type-id='242e3d19' visibility='default' filepath='kernel/workqueue.c' line='5193' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='dev' type-id='66e487eb' visibility='default' filepath='kernel/workqueue.c' line='5193' column='1'/>
+          <var-decl name='dev' type-id='66e487eb' visibility='default' filepath='kernel/workqueue.c' line='5194' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='wq_flusher' size-in-bits='448' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='225' column='1' id='c8eb0f4f'>
+      <class-decl name='wq_flusher' size-in-bits='448' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='226' column='1' id='c8eb0f4f'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='226' column='1'/>
+          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='227' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='flush_color' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='227' column='1'/>
+          <var-decl name='flush_color' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='228' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='done' type-id='f9fef04f' visibility='default' filepath='kernel/workqueue.c' line='228' column='1'/>
+          <var-decl name='done' type-id='f9fef04f' visibility='default' filepath='kernel/workqueue.c' line='229' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='xfrm_id' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/uapi/linux/xfrm.h' line='25' column='1' id='d07aeeaa'>
@@ -23113,23 +23131,7 @@
           <var-decl name='jited_len' type-id='19c2251e' visibility='default' filepath='include/linux/bpf.h' line='272' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cpu_rmap' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/cpu_rmap.h' line='27' column='1' id='e09a048e'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='refcount' type-id='400fb07b' visibility='default' filepath='include/linux/cpu_rmap.h' line='28' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='size' type-id='1dc6a898' visibility='default' filepath='include/linux/cpu_rmap.h' line='29' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='48'>
-          <var-decl name='used' type-id='1dc6a898' visibility='default' filepath='include/linux/cpu_rmap.h' line='29' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='obj' type-id='63e171df' visibility='default' filepath='include/linux/cpu_rmap.h' line='30' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='near' type-id='f443352a' visibility='default' filepath='include/linux/cpu_rmap.h' line='34' column='1'/>
-        </data-member>
-      </class-decl>
+      <class-decl name='cpu_rmap' is-struct='yes' visibility='default' is-declaration-only='yes' id='e09a048e'/>
       <class-decl name='ctl_table_poll' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/linux/sysctl.h' line='95' column='1' id='d39c42ab'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='event' type-id='49178f86' visibility='default' filepath='include/linux/sysctl.h' line='96' column='1'/>
@@ -25089,9 +25091,6 @@
         <subrange length='6' type-id='7ff19f0f' id='52fa524b'/>
       </array-type-def>
       <pointer-type-def type-id='68a72cd7' size-in-bits='64' id='b6316a7f'/>
-      <array-type-def dimensions='1' type-id='bb08c7e1' size-in-bits='infinite' id='f443352a'>
-        <subrange length='infinite' type-id='7ff19f0f' id='031f2035'/>
-      </array-type-def>
       <pointer-type-def type-id='708c2394' size-in-bits='64' id='282b7312'/>
       <pointer-type-def type-id='0ad68707' size-in-bits='64' id='b6a33eaf'/>
       <pointer-type-def type-id='0ef5c7e0' size-in-bits='64' id='b1253746'/>
@@ -26755,72 +26754,72 @@
           <var-decl name='head' type-id='72f469ec' visibility='default' filepath='net/ipv4/route.c' line='1498' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='worker_pool' size-in-bits='7168' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='146' column='1' id='19ea21fe'>
+      <class-decl name='worker_pool' size-in-bits='7168' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='147' column='1' id='19ea21fe'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='kernel/workqueue.c' line='147' column='1'/>
+          <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='kernel/workqueue.c' line='148' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='cpu' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='148' column='1'/>
+          <var-decl name='cpu' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='149' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='node' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='149' column='1'/>
+          <var-decl name='node' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='150' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='id' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='150' column='1'/>
+          <var-decl name='id' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='151' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='flags' type-id='f0981eeb' visibility='default' filepath='kernel/workqueue.c' line='151' column='1'/>
+          <var-decl name='flags' type-id='f0981eeb' visibility='default' filepath='kernel/workqueue.c' line='152' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='watchdog_ts' type-id='7359adad' visibility='default' filepath='kernel/workqueue.c' line='153' column='1'/>
+          <var-decl name='watchdog_ts' type-id='7359adad' visibility='default' filepath='kernel/workqueue.c' line='154' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='worklist' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='155' column='1'/>
+          <var-decl name='worklist' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='156' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='nr_workers' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='157' column='1'/>
+          <var-decl name='nr_workers' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='158' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='416'>
-          <var-decl name='nr_idle' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='158' column='1'/>
+          <var-decl name='nr_idle' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='159' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='idle_list' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='160' column='1'/>
+          <var-decl name='idle_list' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='161' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='idle_timer' type-id='abe41e67' visibility='default' filepath='kernel/workqueue.c' line='161' column='1'/>
+          <var-decl name='idle_timer' type-id='abe41e67' visibility='default' filepath='kernel/workqueue.c' line='162' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='mayday_timer' type-id='abe41e67' visibility='default' filepath='kernel/workqueue.c' line='162' column='1'/>
+          <var-decl name='mayday_timer' type-id='abe41e67' visibility='default' filepath='kernel/workqueue.c' line='163' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1472'>
-          <var-decl name='busy_hash' type-id='53b70d6c' visibility='default' filepath='kernel/workqueue.c' line='165' column='1'/>
+          <var-decl name='busy_hash' type-id='53b70d6c' visibility='default' filepath='kernel/workqueue.c' line='166' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5568'>
-          <var-decl name='manager' type-id='50a159c7' visibility='default' filepath='kernel/workqueue.c' line='168' column='1'/>
+          <var-decl name='manager' type-id='50a159c7' visibility='default' filepath='kernel/workqueue.c' line='169' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5632'>
-          <var-decl name='workers' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='169' column='1'/>
+          <var-decl name='workers' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='170' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5760'>
-          <var-decl name='detach_completion' type-id='389faaf7' visibility='default' filepath='kernel/workqueue.c' line='170' column='1'/>
+          <var-decl name='detach_completion' type-id='389faaf7' visibility='default' filepath='kernel/workqueue.c' line='171' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5824'>
-          <var-decl name='worker_ida' type-id='46ce60fb' visibility='default' filepath='kernel/workqueue.c' line='172' column='1'/>
+          <var-decl name='worker_ida' type-id='46ce60fb' visibility='default' filepath='kernel/workqueue.c' line='173' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5952'>
-          <var-decl name='attrs' type-id='cfd15e7e' visibility='default' filepath='kernel/workqueue.c' line='174' column='1'/>
+          <var-decl name='attrs' type-id='cfd15e7e' visibility='default' filepath='kernel/workqueue.c' line='175' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6016'>
-          <var-decl name='hash_node' type-id='03a4a074' visibility='default' filepath='kernel/workqueue.c' line='175' column='1'/>
+          <var-decl name='hash_node' type-id='03a4a074' visibility='default' filepath='kernel/workqueue.c' line='176' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6144'>
-          <var-decl name='refcnt' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='176' column='1'/>
+          <var-decl name='refcnt' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='177' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6656'>
-          <var-decl name='nr_running' type-id='49178f86' visibility='default' filepath='kernel/workqueue.c' line='183' column='1'/>
+          <var-decl name='nr_running' type-id='49178f86' visibility='default' filepath='kernel/workqueue.c' line='184' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6720'>
-          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='kernel/workqueue.c' line='189' column='1'/>
+          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='kernel/workqueue.c' line='190' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='xdp_rxq_info' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/net/xdp.h' line='59' column='1' id='eb0d6f26'>
@@ -28292,14 +28291,6 @@
           <var-decl name='hi' type-id='3f1a6b60' visibility='default' filepath='include/net/xfrm.h' line='1074' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__2' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/cpu_rmap.h' line='31' column='1' id='bb08c7e1'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='index' type-id='1dc6a898' visibility='default' filepath='include/linux/cpu_rmap.h' line='32' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='16'>
-          <var-decl name='dist' type-id='1dc6a898' visibility='default' filepath='include/linux/cpu_rmap.h' line='33' column='1'/>
-        </data-member>
-      </class-decl>
       <qualified-type-def type-id='47692c1a' const='yes' id='2212bd2d'/>
       <qualified-type-def type-id='90cdb889' const='yes' id='4e65adfa'/>
       <qualified-type-def type-id='1cf1b931' const='yes' id='f4f74d50'/>
@@ -28583,7 +28574,7 @@
       <array-type-def dimensions='1' type-id='19c2251e' size-in-bits='256' id='1c6311dd'>
         <subrange length='8' type-id='7ff19f0f' id='56e0c0b1'/>
       </array-type-def>
-      <union-decl name='__anonymous_union__14' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/inet_hashtables.h' line='118' column='1' id='ba169a6c'>
+      <union-decl name='__anonymous_union__13' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/inet_hashtables.h' line='118' column='1' id='ba169a6c'>
         <data-member access='public'>
           <var-decl name='head' type-id='e151255a' visibility='default' filepath='include/net/inet_hashtables.h' line='119' column='1'/>
         </data-member>
@@ -33499,8 +33490,8 @@
       </function-type>
     </abi-instr>
     <abi-instr address-size='64' path='block/blk-mq.c' language='LANG_C89'>
-      <function-decl name='blk_mq_alloc_tag_set' mangled-name='blk_mq_alloc_tag_set' filepath='block/blk-mq.c' line='2783' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_mq_alloc_tag_set'>
-        <parameter type-id='cc26d15f' name='set' filepath='block/blk-mq.c' line='2783' column='1'/>
+      <function-decl name='blk_mq_alloc_tag_set' mangled-name='blk_mq_alloc_tag_set' filepath='block/blk-mq.c' line='2785' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_mq_alloc_tag_set'>
+        <parameter type-id='cc26d15f' name='set' filepath='block/blk-mq.c' line='2785' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-decl name='blk_mq_complete_request' mangled-name='blk_mq_complete_request' filepath='block/blk-mq.c' line='616' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_mq_complete_request'>
@@ -33524,8 +33515,8 @@
         <parameter type-id='cc26d15f' name='set' filepath='block/blk-mq.c' line='2496' column='1'/>
         <return type-id='e7d2a5fc'/>
       </function-decl>
-      <function-decl name='blk_mq_free_tag_set' mangled-name='blk_mq_free_tag_set' filepath='block/blk-mq.c' line='2857' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_mq_free_tag_set'>
-        <parameter type-id='cc26d15f' name='set' filepath='block/blk-mq.c' line='2857' column='1'/>
+      <function-decl name='blk_mq_free_tag_set' mangled-name='blk_mq_free_tag_set' filepath='block/blk-mq.c' line='2859' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='blk_mq_free_tag_set'>
+        <parameter type-id='cc26d15f' name='set' filepath='block/blk-mq.c' line='2859' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
     </abi-instr>
@@ -33971,7 +33962,7 @@
         <parameter type-id='389faaf7'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='crypto_shash_setkey' mangled-name='crypto_shash_setkey' filepath='include/crypto/hash.h' line='812' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_shash_setkey'>
+      <function-decl name='crypto_shash_setkey' mangled-name='crypto_shash_setkey' filepath='include/crypto/hash.h' line='816' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_shash_setkey'>
         <parameter type-id='247dd85c'/>
         <parameter type-id='354f7eb9'/>
         <parameter type-id='f0981eeb'/>
@@ -34325,23 +34316,7 @@
           <var-decl name='buckets' type-id='bde3078a' visibility='default' filepath='include/linux/rhashtable.h' line='75' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='cpu_rmap' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/linux/cpu_rmap.h' line='27' column='1' id='e09a048e'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='refcount' type-id='400fb07b' visibility='default' filepath='include/linux/cpu_rmap.h' line='28' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='size' type-id='1dc6a898' visibility='default' filepath='include/linux/cpu_rmap.h' line='29' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='48'>
-          <var-decl name='used' type-id='1dc6a898' visibility='default' filepath='include/linux/cpu_rmap.h' line='29' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='obj' type-id='63e171df' visibility='default' filepath='include/linux/cpu_rmap.h' line='30' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='near' type-id='f443352a' visibility='default' filepath='include/linux/cpu_rmap.h' line='34' column='1'/>
-        </data-member>
-      </class-decl>
+      <class-decl name='cpu_rmap' is-struct='yes' visibility='default' is-declaration-only='yes' id='e09a048e'/>
       <class-decl name='dst_entry' size-in-bits='896' is-struct='yes' visibility='default' filepath='include/net/dst.h' line='35' column='1' id='772a4ddf'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='dev' type-id='68a2d05b' visibility='default' filepath='include/net/dst.h' line='36' column='1'/>
@@ -41139,7 +41114,7 @@
       <pointer-type-def type-id='4edc4180' size-in-bits='64' id='bf237056'/>
       <pointer-type-def type-id='279bdcdf' size-in-bits='64' id='c6675287'/>
       <pointer-type-def type-id='469df90e' size-in-bits='64' id='95610bd4'/>
-      <function-decl name='try_module_get' mangled-name='try_module_get' filepath='include/linux/module.h' line='600' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='try_module_get'>
+      <function-decl name='try_module_get' mangled-name='try_module_get' filepath='include/linux/module.h' line='580' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='try_module_get'>
         <parameter type-id='2730d015'/>
         <return type-id='c894953d'/>
       </function-decl>
@@ -41151,7 +41126,7 @@
         <parameter is-variadic='yes'/>
         <return type-id='f23e2572'/>
       </function-decl>
-      <function-decl name='module_put' mangled-name='module_put' filepath='include/linux/module.h' line='602' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='module_put'>
+      <function-decl name='module_put' mangled-name='module_put' filepath='include/linux/module.h' line='582' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='module_put'>
         <parameter type-id='2730d015'/>
         <return type-id='48b5725f'/>
       </function-decl>
@@ -41893,7 +41868,7 @@
       </function-type>
     </abi-instr>
     <abi-instr address-size='64' path='crypto/authencesn.c' language='LANG_C89'>
-      <function-decl name='crypto_ahash_digest' mangled-name='crypto_ahash_digest' filepath='include/crypto/hash.h' line='452' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_ahash_digest'>
+      <function-decl name='crypto_ahash_digest' mangled-name='crypto_ahash_digest' filepath='include/crypto/hash.h' line='454' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_ahash_digest'>
         <parameter type-id='6f3c82ac'/>
         <return type-id='95e97e5e'/>
       </function-decl>
@@ -42085,7 +42060,7 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='crypto/drbg.c' language='LANG_C89'>
-      <function-decl name='crypto_alloc_shash' mangled-name='crypto_alloc_shash' filepath='include/crypto/hash.h' line='684' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_alloc_shash'>
+      <function-decl name='crypto_alloc_shash' mangled-name='crypto_alloc_shash' filepath='include/crypto/hash.h' line='686' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_alloc_shash'>
         <parameter type-id='80f4b756'/>
         <parameter type-id='f0981eeb'/>
         <parameter type-id='f0981eeb'/>
@@ -42182,7 +42157,7 @@
       <pointer-type-def type-id='e501fad6' size-in-bits='64' id='0b5e03e0'/>
       <pointer-type-def type-id='928ea938' size-in-bits='64' id='77c96f7a'/>
       <pointer-type-def type-id='c2b07168' size-in-bits='64' id='c509dbc2'/>
-      <function-decl name='crypto_ahash_setkey' mangled-name='crypto_ahash_setkey' filepath='include/crypto/hash.h' line='408' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_ahash_setkey'>
+      <function-decl name='crypto_ahash_setkey' mangled-name='crypto_ahash_setkey' filepath='include/crypto/hash.h' line='410' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_ahash_setkey'>
         <parameter type-id='1351523a'/>
         <parameter type-id='354f7eb9'/>
         <parameter type-id='f0981eeb'/>
@@ -42193,13 +42168,13 @@
         <parameter type-id='f0981eeb'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='crypto_aead_setkey' mangled-name='crypto_aead_setkey' filepath='include/crypto/aead.h' line='289' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_aead_setkey'>
+      <function-decl name='crypto_aead_setkey' mangled-name='crypto_aead_setkey' filepath='include/crypto/aead.h' line='291' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_aead_setkey'>
         <parameter type-id='a585cbc4'/>
         <parameter type-id='354f7eb9'/>
         <parameter type-id='f0981eeb'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='crypto_aead_setauthsize' mangled-name='crypto_aead_setauthsize' filepath='include/crypto/aead.h' line='302' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_aead_setauthsize'>
+      <function-decl name='crypto_aead_setauthsize' mangled-name='crypto_aead_setauthsize' filepath='include/crypto/aead.h' line='304' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_aead_setauthsize'>
         <parameter type-id='a585cbc4'/>
         <parameter type-id='f0981eeb'/>
         <return type-id='95e97e5e'/>
@@ -42249,18 +42224,18 @@
       </class-decl>
       <pointer-type-def type-id='df5e8716' size-in-bits='64' id='247dd85c'/>
       <pointer-type-def type-id='55bdfa3e' size-in-bits='64' id='32efad44'/>
-      <function-decl name='crypto_shash_update' mangled-name='crypto_shash_update' filepath='include/crypto/hash.h' line='901' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_shash_update'>
+      <function-decl name='crypto_shash_update' mangled-name='crypto_shash_update' filepath='include/crypto/hash.h' line='905' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_shash_update'>
         <parameter type-id='32efad44'/>
         <parameter type-id='354f7eb9'/>
         <parameter type-id='f0981eeb'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='crypto_shash_final' mangled-name='crypto_shash_final' filepath='include/crypto/hash.h' line='917' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_shash_final'>
+      <function-decl name='crypto_shash_final' mangled-name='crypto_shash_final' filepath='include/crypto/hash.h' line='921' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_shash_final'>
         <parameter type-id='32efad44'/>
         <parameter type-id='cf536864'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='crypto_shash_digest' mangled-name='crypto_shash_digest' filepath='include/crypto/hash.h' line='829' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_shash_digest'>
+      <function-decl name='crypto_shash_digest' mangled-name='crypto_shash_digest' filepath='include/crypto/hash.h' line='833' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='crypto_shash_digest'>
         <parameter type-id='32efad44'/>
         <parameter type-id='354f7eb9'/>
         <parameter type-id='f0981eeb'/>
@@ -45020,60 +44995,60 @@
         </data-member>
       </class-decl>
       <pointer-type-def type-id='ec5384d3' size-in-bits='64' id='b9af02c3'/>
-      <class-decl name='i2c_adapter' size-in-bits='9792' is-struct='yes' visibility='default' filepath='include/linux/i2c.h' line='670' column='1' id='ec5384d3'>
+      <class-decl name='i2c_adapter' size-in-bits='9792' is-struct='yes' visibility='default' filepath='include/linux/i2c.h' line='672' column='1' id='ec5384d3'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='owner' type-id='2730d015' visibility='default' filepath='include/linux/i2c.h' line='671' column='1'/>
+          <var-decl name='owner' type-id='2730d015' visibility='default' filepath='include/linux/i2c.h' line='673' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='class' type-id='f0981eeb' visibility='default' filepath='include/linux/i2c.h' line='672' column='1'/>
+          <var-decl name='class' type-id='f0981eeb' visibility='default' filepath='include/linux/i2c.h' line='674' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='algo' type-id='e93ce0cc' visibility='default' filepath='include/linux/i2c.h' line='673' column='1'/>
+          <var-decl name='algo' type-id='e93ce0cc' visibility='default' filepath='include/linux/i2c.h' line='675' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='algo_data' type-id='eaa32e2f' visibility='default' filepath='include/linux/i2c.h' line='674' column='1'/>
+          <var-decl name='algo_data' type-id='eaa32e2f' visibility='default' filepath='include/linux/i2c.h' line='676' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='lock_ops' type-id='16d08491' visibility='default' filepath='include/linux/i2c.h' line='677' column='1'/>
+          <var-decl name='lock_ops' type-id='16d08491' visibility='default' filepath='include/linux/i2c.h' line='679' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='bus_lock' type-id='dd823037' visibility='default' filepath='include/linux/i2c.h' line='678' column='1'/>
+          <var-decl name='bus_lock' type-id='dd823037' visibility='default' filepath='include/linux/i2c.h' line='680' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='mux_lock' type-id='dd823037' visibility='default' filepath='include/linux/i2c.h' line='679' column='1'/>
+          <var-decl name='mux_lock' type-id='dd823037' visibility='default' filepath='include/linux/i2c.h' line='681' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='timeout' type-id='95e97e5e' visibility='default' filepath='include/linux/i2c.h' line='681' column='1'/>
+          <var-decl name='timeout' type-id='95e97e5e' visibility='default' filepath='include/linux/i2c.h' line='683' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='864'>
-          <var-decl name='retries' type-id='95e97e5e' visibility='default' filepath='include/linux/i2c.h' line='682' column='1'/>
+          <var-decl name='retries' type-id='95e97e5e' visibility='default' filepath='include/linux/i2c.h' line='684' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='896'>
-          <var-decl name='dev' type-id='66e487eb' visibility='default' filepath='include/linux/i2c.h' line='683' column='1'/>
+          <var-decl name='dev' type-id='66e487eb' visibility='default' filepath='include/linux/i2c.h' line='685' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='8512'>
-          <var-decl name='nr' type-id='95e97e5e' visibility='default' filepath='include/linux/i2c.h' line='685' column='1'/>
+          <var-decl name='nr' type-id='95e97e5e' visibility='default' filepath='include/linux/i2c.h' line='687' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='8544'>
-          <var-decl name='name' type-id='36d7f119' visibility='default' filepath='include/linux/i2c.h' line='686' column='1'/>
+          <var-decl name='name' type-id='36d7f119' visibility='default' filepath='include/linux/i2c.h' line='688' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='8960'>
-          <var-decl name='dev_released' type-id='f9fef04f' visibility='default' filepath='include/linux/i2c.h' line='687' column='1'/>
+          <var-decl name='dev_released' type-id='f9fef04f' visibility='default' filepath='include/linux/i2c.h' line='689' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='9216'>
-          <var-decl name='userspace_clients_lock' type-id='925167dc' visibility='default' filepath='include/linux/i2c.h' line='689' column='1'/>
+          <var-decl name='userspace_clients_lock' type-id='925167dc' visibility='default' filepath='include/linux/i2c.h' line='691' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='9472'>
-          <var-decl name='userspace_clients' type-id='72f469ec' visibility='default' filepath='include/linux/i2c.h' line='690' column='1'/>
+          <var-decl name='userspace_clients' type-id='72f469ec' visibility='default' filepath='include/linux/i2c.h' line='692' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='9600'>
-          <var-decl name='bus_recovery_info' type-id='f1537b61' visibility='default' filepath='include/linux/i2c.h' line='692' column='1'/>
+          <var-decl name='bus_recovery_info' type-id='f1537b61' visibility='default' filepath='include/linux/i2c.h' line='694' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='9664'>
-          <var-decl name='quirks' type-id='398e6008' visibility='default' filepath='include/linux/i2c.h' line='693' column='1'/>
+          <var-decl name='quirks' type-id='398e6008' visibility='default' filepath='include/linux/i2c.h' line='695' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='9728'>
-          <var-decl name='host_notify_domain' type-id='7544e824' visibility='default' filepath='include/linux/i2c.h' line='695' column='1'/>
+          <var-decl name='host_notify_domain' type-id='7544e824' visibility='default' filepath='include/linux/i2c.h' line='697' column='1'/>
         </data-member>
       </class-decl>
       <pointer-type-def type-id='9fddcab4' size-in-bits='64' id='4825f6ba'/>
@@ -61490,7 +61465,7 @@
         <parameter type-id='7c5f8cd8' name='aux' filepath='drivers/gpu/drm/drm_dp_helper.c' line='1131' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='i2c_add_adapter' mangled-name='i2c_add_adapter' filepath='include/linux/i2c.h' line='796' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='i2c_add_adapter'>
+      <function-decl name='i2c_add_adapter' mangled-name='i2c_add_adapter' filepath='include/linux/i2c.h' line='798' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='i2c_add_adapter'>
         <parameter type-id='b9af02c3'/>
         <return type-id='95e97e5e'/>
       </function-decl>
@@ -61498,7 +61473,7 @@
         <parameter type-id='7c5f8cd8' name='aux' filepath='drivers/gpu/drm/drm_dp_helper.c' line='1163' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='i2c_del_adapter' mangled-name='i2c_del_adapter' filepath='include/linux/i2c.h' line='797' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='i2c_del_adapter'>
+      <function-decl name='i2c_del_adapter' mangled-name='i2c_del_adapter' filepath='include/linux/i2c.h' line='799' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='i2c_del_adapter'>
         <parameter type-id='b9af02c3'/>
         <return type-id='48b5725f'/>
       </function-decl>
@@ -63331,10 +63306,10 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/gpu/drm/drm_ioctl.c' language='LANG_C89'>
-      <function-decl name='drm_ioctl' mangled-name='drm_ioctl' filepath='drivers/gpu/drm/drm_ioctl.c' line='780' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_ioctl'>
-        <parameter type-id='77e79a4b' name='filp' filepath='drivers/gpu/drm/drm_ioctl.c' line='780' column='1'/>
-        <parameter type-id='f0981eeb' name='cmd' filepath='drivers/gpu/drm/drm_ioctl.c' line='781' column='1'/>
-        <parameter type-id='7359adad' name='arg' filepath='drivers/gpu/drm/drm_ioctl.c' line='781' column='1'/>
+      <function-decl name='drm_ioctl' mangled-name='drm_ioctl' filepath='drivers/gpu/drm/drm_ioctl.c' line='781' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_ioctl'>
+        <parameter type-id='77e79a4b' name='filp' filepath='drivers/gpu/drm/drm_ioctl.c' line='781' column='1'/>
+        <parameter type-id='f0981eeb' name='cmd' filepath='drivers/gpu/drm/drm_ioctl.c' line='782' column='1'/>
+        <parameter type-id='7359adad' name='arg' filepath='drivers/gpu/drm/drm_ioctl.c' line='782' column='1'/>
         <return type-id='bd54fe1a'/>
       </function-decl>
     </abi-instr>
@@ -66288,17 +66263,6 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/hid/hid-sony.c' language='LANG_C89'>
-      <union-decl name='power_supply_propval' size-in-bits='64' visibility='default' filepath='include/linux/power_supply.h' line='494' column='1' id='08942f16'>
-        <data-member access='public'>
-          <var-decl name='intval' type-id='95e97e5e' visibility='default' filepath='include/linux/power_supply.h' line='495' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='strval' type-id='80f4b756' visibility='default' filepath='include/linux/power_supply.h' line='496' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='int64val' type-id='9da381c4' visibility='default' filepath='include/linux/power_supply.h' line='497' column='1'/>
-        </data-member>
-      </union-decl>
       <class-decl name='power_supply' size-in-bits='10432' is-struct='yes' visibility='default' filepath='include/linux/power_supply.h' line='556' column='1' id='98749268'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='desc' type-id='cb9cd99f' visibility='default' filepath='include/linux/power_supply.h' line='557' column='1'/>
@@ -66693,6 +66657,17 @@
         <enumerator name='POWER_SUPPLY_PROP_SERIAL_NUMBER' value='226'/>
       </enum-decl>
       <typedef-decl name='int64_t' type-id='9b7c55ef' filepath='include/linux/types.h' line='114' column='1' id='9da381c4'/>
+      <union-decl name='power_supply_propval' size-in-bits='64' visibility='default' filepath='include/linux/power_supply.h' line='494' column='1' id='08942f16'>
+        <data-member access='public'>
+          <var-decl name='intval' type-id='95e97e5e' visibility='default' filepath='include/linux/power_supply.h' line='495' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='strval' type-id='80f4b756' visibility='default' filepath='include/linux/power_supply.h' line='496' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='int64val' type-id='9da381c4' visibility='default' filepath='include/linux/power_supply.h' line='497' column='1'/>
+        </data-member>
+      </union-decl>
       <class-decl name='power_supply_config' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/linux/power_supply.h' line='504' column='1' id='098cab97'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='of_node' type-id='9a537bbe' visibility='default' filepath='include/linux/power_supply.h' line='505' column='1'/>
@@ -67936,6 +67911,29 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/input/evdev.c' language='LANG_C89'>
+      <union-decl name='__anonymous_union__6' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/sched.h' line='1296' column='1' id='8b4442cd'>
+        <data-member access='public'>
+          <var-decl name='frozen' type-id='f0981eeb' visibility='default' filepath='include/linux/sched.h' line='1296' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='__UNIQUE_ID_android_kabi_hide46' type-id='156952c4' visibility='default' filepath='include/linux/sched.h' line='1296' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/sched.h' line='1296' column='1'/>
+        </data-member>
+      </union-decl>
+      <union-decl name='__anonymous_union__8' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/sched.h' line='1299' column='1' id='121e4767'>
+        <data-member access='public'>
+          <var-decl name='futex_state' type-id='f0981eeb' visibility='default' filepath='include/linux/sched.h' line='1299' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='__UNIQUE_ID_android_kabi_hide47' type-id='6040de71' visibility='default' filepath='include/linux/sched.h' line='1299' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/sched.h' line='1299' column='1'/>
+        </data-member>
+      </union-decl>
+      <pointer-type-def type-id='5bb9c75d' size-in-bits='64' id='dc750055'/>
       <function-decl name='cdev_init' mangled-name='cdev_init' filepath='include/linux/cdev.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cdev_init'>
         <parameter type-id='3e6eb939'/>
         <parameter type-id='61758ee5'/>
@@ -67951,6 +67949,12 @@
         <parameter type-id='fa0b179b'/>
         <return type-id='48b5725f'/>
       </function-decl>
+      <function-decl name='kill_fasync' mangled-name='kill_fasync' filepath='include/linux/fs.h' line='1332' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kill_fasync'>
+        <parameter type-id='dc750055'/>
+        <parameter type-id='95e97e5e'/>
+        <parameter type-id='95e97e5e'/>
+        <return type-id='48b5725f'/>
+      </function-decl>
       <function-decl name='mutex_lock_interruptible' mangled-name='mutex_lock_interruptible' filepath='include/linux/mutex.h' line='179' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='mutex_lock_interruptible'>
         <parameter type-id='e0ea832a'/>
         <return type-id='95e97e5e'/>
@@ -67960,6 +67964,13 @@
         <parameter type-id='77e79a4b'/>
         <return type-id='95e97e5e'/>
       </function-decl>
+      <function-decl name='fasync_helper' mangled-name='fasync_helper' filepath='include/linux/fs.h' line='1325' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fasync_helper'>
+        <parameter type-id='95e97e5e'/>
+        <parameter type-id='77e79a4b'/>
+        <parameter type-id='95e97e5e'/>
+        <parameter type-id='dc750055'/>
+        <return type-id='95e97e5e'/>
+      </function-decl>
       <pointer-type-def type-id='925167dc' size-in-bits='64' id='e0ea832a'/>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/input/input-leds.c' language='LANG_C89'>
@@ -73097,7 +73108,7 @@
       <array-type-def dimensions='1' type-id='fa0b179b' size-in-bits='512' id='f6e5abef'>
         <subrange length='8' type-id='7ff19f0f' id='56e0c0b1'/>
       </array-type-def>
-      <union-decl name='__anonymous_union__9' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/videobuf2-core.h' line='179' column='1' id='07aa0de4'>
+      <union-decl name='__anonymous_union__6' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/videobuf2-core.h' line='179' column='1' id='07aa0de4'>
         <data-member access='public'>
           <var-decl name='offset' type-id='f0981eeb' visibility='default' filepath='include/media/videobuf2-core.h' line='180' column='1'/>
         </data-member>
@@ -74573,7 +74584,7 @@
           <var-decl name='p' type-id='eaa32e2f' visibility='default' filepath='include/media/v4l2-ctrls.h' line='52' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__8' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='227' column='1' id='87415f3a'>
+      <union-decl name='__anonymous_union__5' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='227' column='1' id='87415f3a'>
         <data-member access='public'>
           <var-decl name='qmenu' type-id='13956559' visibility='default' filepath='include/media/v4l2-ctrls.h' line='228' column='1'/>
         </data-member>
@@ -74581,7 +74592,7 @@
           <var-decl name='qmenu_int' type-id='43ae54cf' visibility='default' filepath='include/media/v4l2-ctrls.h' line='229' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__7' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='223' column='1' id='b91b9370'>
+      <union-decl name='__anonymous_union__4' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='223' column='1' id='b91b9370'>
         <data-member access='public'>
           <var-decl name='step' type-id='91ce1af9' visibility='default' filepath='include/media/v4l2-ctrls.h' line='224' column='1'/>
         </data-member>
@@ -78673,7 +78684,7 @@
         <parameter type-id='6ec0fd31'/>
         <return type-id='48b5725f'/>
       </function-type>
-      <union-decl name='__anonymous_union__10' size-in-bits='512' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2249' column='1' id='454ee2bf'>
+      <union-decl name='__anonymous_union__8' size-in-bits='512' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2249' column='1' id='454ee2bf'>
         <data-member access='public'>
           <var-decl name='vsync' type-id='cbe6daf0' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2250' column='1'/>
         </data-member>
@@ -78749,7 +78760,7 @@
           <var-decl name='field' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2200' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__11' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2211' column='1' id='de5442d3'>
+      <union-decl name='__anonymous_union__9' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2211' column='1' id='de5442d3'>
         <data-member access='public'>
           <var-decl name='value' type-id='3158a266' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2212' column='1'/>
         </data-member>
@@ -79041,7 +79052,7 @@
         <enumerator name='V4L2_CTRL_TYPE_U16' value='257'/>
         <enumerator name='V4L2_CTRL_TYPE_U32' value='258'/>
       </enum-decl>
-      <union-decl name='__anonymous_union__7' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='223' column='1' id='b91b9370'>
+      <union-decl name='__anonymous_union__4' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='223' column='1' id='b91b9370'>
         <data-member access='public'>
           <var-decl name='step' type-id='91ce1af9' visibility='default' filepath='include/media/v4l2-ctrls.h' line='224' column='1'/>
         </data-member>
@@ -79049,7 +79060,7 @@
           <var-decl name='menu_skip_mask' type-id='91ce1af9' visibility='default' filepath='include/media/v4l2-ctrls.h' line='225' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__8' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='227' column='1' id='87415f3a'>
+      <union-decl name='__anonymous_union__5' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='227' column='1' id='87415f3a'>
         <data-member access='public'>
           <var-decl name='qmenu' type-id='13956559' visibility='default' filepath='include/media/v4l2-ctrls.h' line='228' column='1'/>
         </data-member>
@@ -79164,7 +79175,7 @@
           <var-decl name='data_offset' type-id='f0981eeb' visibility='default' filepath='include/media/videobuf2-core.h' line='184' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__9' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/videobuf2-core.h' line='179' column='1' id='07aa0de4'>
+      <union-decl name='__anonymous_union__6' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/videobuf2-core.h' line='179' column='1' id='07aa0de4'>
         <data-member access='public'>
           <var-decl name='offset' type-id='f0981eeb' visibility='default' filepath='include/media/videobuf2-core.h' line='180' column='1'/>
         </data-member>
@@ -79276,7 +79287,7 @@
           <var-decl name='reserved' type-id='7f84eb57' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2261' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__10' size-in-bits='512' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2249' column='1' id='454ee2bf'>
+      <union-decl name='__anonymous_union__8' size-in-bits='512' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2249' column='1' id='454ee2bf'>
         <data-member access='public'>
           <var-decl name='vsync' type-id='cbe6daf0' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2250' column='1'/>
         </data-member>
@@ -79327,7 +79338,7 @@
           <var-decl name='default_value' type-id='3158a266' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2219' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__11' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2211' column='1' id='de5442d3'>
+      <union-decl name='__anonymous_union__9' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2211' column='1' id='de5442d3'>
         <data-member access='public'>
           <var-decl name='value' type-id='3158a266' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2212' column='1'/>
         </data-member>
@@ -79647,60 +79658,60 @@
           <var-decl name='detected' type-id='72f469ec' visibility='default' filepath='include/linux/i2c.h' line='338' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='i2c_adapter' size-in-bits='9792' is-struct='yes' visibility='default' filepath='include/linux/i2c.h' line='670' column='1' id='ec5384d3'>
+      <class-decl name='i2c_adapter' size-in-bits='9792' is-struct='yes' visibility='default' filepath='include/linux/i2c.h' line='672' column='1' id='ec5384d3'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='owner' type-id='2730d015' visibility='default' filepath='include/linux/i2c.h' line='671' column='1'/>
+          <var-decl name='owner' type-id='2730d015' visibility='default' filepath='include/linux/i2c.h' line='673' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='class' type-id='f0981eeb' visibility='default' filepath='include/linux/i2c.h' line='672' column='1'/>
+          <var-decl name='class' type-id='f0981eeb' visibility='default' filepath='include/linux/i2c.h' line='674' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='algo' type-id='e93ce0cc' visibility='default' filepath='include/linux/i2c.h' line='673' column='1'/>
+          <var-decl name='algo' type-id='e93ce0cc' visibility='default' filepath='include/linux/i2c.h' line='675' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='algo_data' type-id='eaa32e2f' visibility='default' filepath='include/linux/i2c.h' line='674' column='1'/>
+          <var-decl name='algo_data' type-id='eaa32e2f' visibility='default' filepath='include/linux/i2c.h' line='676' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='lock_ops' type-id='16d08491' visibility='default' filepath='include/linux/i2c.h' line='677' column='1'/>
+          <var-decl name='lock_ops' type-id='16d08491' visibility='default' filepath='include/linux/i2c.h' line='679' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='bus_lock' type-id='dd823037' visibility='default' filepath='include/linux/i2c.h' line='678' column='1'/>
+          <var-decl name='bus_lock' type-id='dd823037' visibility='default' filepath='include/linux/i2c.h' line='680' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='mux_lock' type-id='dd823037' visibility='default' filepath='include/linux/i2c.h' line='679' column='1'/>
+          <var-decl name='mux_lock' type-id='dd823037' visibility='default' filepath='include/linux/i2c.h' line='681' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='timeout' type-id='95e97e5e' visibility='default' filepath='include/linux/i2c.h' line='681' column='1'/>
+          <var-decl name='timeout' type-id='95e97e5e' visibility='default' filepath='include/linux/i2c.h' line='683' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='864'>
-          <var-decl name='retries' type-id='95e97e5e' visibility='default' filepath='include/linux/i2c.h' line='682' column='1'/>
+          <var-decl name='retries' type-id='95e97e5e' visibility='default' filepath='include/linux/i2c.h' line='684' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='896'>
-          <var-decl name='dev' type-id='66e487eb' visibility='default' filepath='include/linux/i2c.h' line='683' column='1'/>
+          <var-decl name='dev' type-id='66e487eb' visibility='default' filepath='include/linux/i2c.h' line='685' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='8512'>
-          <var-decl name='nr' type-id='95e97e5e' visibility='default' filepath='include/linux/i2c.h' line='685' column='1'/>
+          <var-decl name='nr' type-id='95e97e5e' visibility='default' filepath='include/linux/i2c.h' line='687' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='8544'>
-          <var-decl name='name' type-id='36d7f119' visibility='default' filepath='include/linux/i2c.h' line='686' column='1'/>
+          <var-decl name='name' type-id='36d7f119' visibility='default' filepath='include/linux/i2c.h' line='688' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='8960'>
-          <var-decl name='dev_released' type-id='f9fef04f' visibility='default' filepath='include/linux/i2c.h' line='687' column='1'/>
+          <var-decl name='dev_released' type-id='f9fef04f' visibility='default' filepath='include/linux/i2c.h' line='689' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='9216'>
-          <var-decl name='userspace_clients_lock' type-id='925167dc' visibility='default' filepath='include/linux/i2c.h' line='689' column='1'/>
+          <var-decl name='userspace_clients_lock' type-id='925167dc' visibility='default' filepath='include/linux/i2c.h' line='691' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='9472'>
-          <var-decl name='userspace_clients' type-id='72f469ec' visibility='default' filepath='include/linux/i2c.h' line='690' column='1'/>
+          <var-decl name='userspace_clients' type-id='72f469ec' visibility='default' filepath='include/linux/i2c.h' line='692' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='9600'>
-          <var-decl name='bus_recovery_info' type-id='f1537b61' visibility='default' filepath='include/linux/i2c.h' line='692' column='1'/>
+          <var-decl name='bus_recovery_info' type-id='f1537b61' visibility='default' filepath='include/linux/i2c.h' line='694' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='9664'>
-          <var-decl name='quirks' type-id='398e6008' visibility='default' filepath='include/linux/i2c.h' line='693' column='1'/>
+          <var-decl name='quirks' type-id='398e6008' visibility='default' filepath='include/linux/i2c.h' line='695' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='9728'>
-          <var-decl name='host_notify_domain' type-id='7544e824' visibility='default' filepath='include/linux/i2c.h' line='695' column='1'/>
+          <var-decl name='host_notify_domain' type-id='7544e824' visibility='default' filepath='include/linux/i2c.h' line='697' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='i2c_algorithm' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/i2c.h' line='519' column='1' id='547b1199'>
@@ -79895,11 +79906,11 @@
       <pointer-type-def type-id='9d4721a2' size-in-bits='64' id='6523d744'/>
       <pointer-type-def type-id='4322685c' size-in-bits='64' id='d839e3f6'/>
       <pointer-type-def type-id='7f779b3f' size-in-bits='64' id='e9f334cb'/>
-      <function-decl name='i2c_del_driver' mangled-name='i2c_del_driver' filepath='include/linux/i2c.h' line='801' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='i2c_del_driver'>
+      <function-decl name='i2c_del_driver' mangled-name='i2c_del_driver' filepath='include/linux/i2c.h' line='803' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='i2c_del_driver'>
         <parameter type-id='29ffcb70'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='i2c_register_driver' mangled-name='i2c_register_driver' filepath='include/linux/i2c.h' line='800' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='i2c_register_driver'>
+      <function-decl name='i2c_register_driver' mangled-name='i2c_register_driver' filepath='include/linux/i2c.h' line='802' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='i2c_register_driver'>
         <parameter type-id='2730d015'/>
         <parameter type-id='29ffcb70'/>
         <return type-id='95e97e5e'/>
@@ -82368,301 +82379,301 @@
           <var-decl name='test_run' type-id='eddbe2ad' visibility='default' filepath='include/linux/bpf.h' line='233' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='bpf_attr' size-in-bits='576' visibility='default' filepath='include/uapi/linux/bpf.h' line='287' column='1' id='8eb8eec2'>
+      <union-decl name='bpf_attr' size-in-bits='576' visibility='default' filepath='include/uapi/linux/bpf.h' line='301' column='1' id='8eb8eec2'>
         <data-member access='public'>
-          <var-decl name='' type-id='61517c3b' visibility='default' filepath='include/uapi/linux/bpf.h' line='288' column='1'/>
+          <var-decl name='' type-id='61517c3b' visibility='default' filepath='include/uapi/linux/bpf.h' line='302' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='' type-id='27086fb9' visibility='default' filepath='include/uapi/linux/bpf.h' line='307' column='1'/>
+          <var-decl name='' type-id='27086fb9' visibility='default' filepath='include/uapi/linux/bpf.h' line='321' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='' type-id='09e94b5b' visibility='default' filepath='include/uapi/linux/bpf.h' line='317' column='1'/>
+          <var-decl name='' type-id='09e94b5b' visibility='default' filepath='include/uapi/linux/bpf.h' line='331' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='' type-id='26ba5712' visibility='default' filepath='include/uapi/linux/bpf.h' line='336' column='1'/>
+          <var-decl name='' type-id='26ba5712' visibility='default' filepath='include/uapi/linux/bpf.h' line='350' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='' type-id='ecd71c3f' visibility='default' filepath='include/uapi/linux/bpf.h' line='342' column='1'/>
+          <var-decl name='' type-id='ecd71c3f' visibility='default' filepath='include/uapi/linux/bpf.h' line='356' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='test' type-id='f9428445' visibility='default' filepath='include/uapi/linux/bpf.h' line='358' column='1'/>
+          <var-decl name='test' type-id='f9428445' visibility='default' filepath='include/uapi/linux/bpf.h' line='372' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='' type-id='5ae16468' visibility='default' filepath='include/uapi/linux/bpf.h' line='360' column='1'/>
+          <var-decl name='' type-id='5ae16468' visibility='default' filepath='include/uapi/linux/bpf.h' line='374' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='info' type-id='cca669dc' visibility='default' filepath='include/uapi/linux/bpf.h' line='375' column='1'/>
+          <var-decl name='info' type-id='cca669dc' visibility='default' filepath='include/uapi/linux/bpf.h' line='389' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='query' type-id='e4eac598' visibility='default' filepath='include/uapi/linux/bpf.h' line='384' column='1'/>
+          <var-decl name='query' type-id='e4eac598' visibility='default' filepath='include/uapi/linux/bpf.h' line='398' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='raw_tracepoint' type-id='d316bc32' visibility='default' filepath='include/uapi/linux/bpf.h' line='389' column='1'/>
+          <var-decl name='raw_tracepoint' type-id='d316bc32' visibility='default' filepath='include/uapi/linux/bpf.h' line='403' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='' type-id='fb043dae' visibility='default' filepath='include/uapi/linux/bpf.h' line='391' column='1'/>
+          <var-decl name='' type-id='fb043dae' visibility='default' filepath='include/uapi/linux/bpf.h' line='405' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='task_fd_query' type-id='e7d0ed32' visibility='default' filepath='include/uapi/linux/bpf.h' line='413' column='1'/>
+          <var-decl name='task_fd_query' type-id='e7d0ed32' visibility='default' filepath='include/uapi/linux/bpf.h' line='427' column='1'/>
         </data-member>
       </union-decl>
-      <class-decl name='__anonymous_struct__12' size-in-bits='480' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='288' column='1' id='61517c3b'>
+      <class-decl name='__anonymous_struct__12' size-in-bits='480' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='302' column='1' id='61517c3b'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='map_type' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='289' column='1'/>
+          <var-decl name='map_type' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='303' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='key_size' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='290' column='1'/>
+          <var-decl name='key_size' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='304' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='value_size' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='291' column='1'/>
+          <var-decl name='value_size' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='305' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='max_entries' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='292' column='1'/>
+          <var-decl name='max_entries' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='306' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='map_flags' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='293' column='1'/>
+          <var-decl name='map_flags' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='307' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='160'>
-          <var-decl name='inner_map_fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='296' column='1'/>
+          <var-decl name='inner_map_fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='310' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='numa_node' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='297' column='1'/>
+          <var-decl name='numa_node' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='311' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='224'>
-          <var-decl name='map_name' type-id='ac1fa8c0' visibility='default' filepath='include/uapi/linux/bpf.h' line='300' column='1'/>
+          <var-decl name='map_name' type-id='ac1fa8c0' visibility='default' filepath='include/uapi/linux/bpf.h' line='314' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='352'>
-          <var-decl name='map_ifindex' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='301' column='1'/>
+          <var-decl name='map_ifindex' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='315' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='btf_fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='302' column='1'/>
+          <var-decl name='btf_fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='316' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='416'>
-          <var-decl name='btf_key_type_id' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='303' column='1'/>
+          <var-decl name='btf_key_type_id' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='317' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='btf_value_type_id' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='304' column='1'/>
+          <var-decl name='btf_value_type_id' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='318' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__13' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='307' column='1' id='27086fb9'>
+      <class-decl name='__anonymous_struct__13' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='321' column='1' id='27086fb9'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='map_fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='308' column='1'/>
+          <var-decl name='map_fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='322' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='key' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='309' column='1'/>
+          <var-decl name='key' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='323' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='' type-id='e4a9eb9a' visibility='default' filepath='include/uapi/linux/bpf.h' line='310' column='1'/>
+          <var-decl name='' type-id='e4a9eb9a' visibility='default' filepath='include/uapi/linux/bpf.h' line='324' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='flags' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='314' column='1'/>
+          <var-decl name='flags' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='328' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__22' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='310' column='1' id='e4a9eb9a'>
+      <union-decl name='__anonymous_union__22' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='324' column='1' id='e4a9eb9a'>
         <data-member access='public'>
-          <var-decl name='value' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='311' column='1'/>
+          <var-decl name='value' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='325' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='next_key' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='312' column='1'/>
+          <var-decl name='next_key' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='326' column='1'/>
         </data-member>
       </union-decl>
-      <class-decl name='__anonymous_struct__14' size-in-bits='576' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='317' column='1' id='09e94b5b'>
+      <class-decl name='__anonymous_struct__14' size-in-bits='576' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='331' column='1' id='09e94b5b'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='prog_type' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='318' column='1'/>
+          <var-decl name='prog_type' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='332' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='insn_cnt' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='319' column='1'/>
+          <var-decl name='insn_cnt' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='333' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='insns' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='320' column='1'/>
+          <var-decl name='insns' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='334' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='license' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='321' column='1'/>
+          <var-decl name='license' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='335' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='log_level' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='322' column='1'/>
+          <var-decl name='log_level' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='336' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='224'>
-          <var-decl name='log_size' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='323' column='1'/>
+          <var-decl name='log_size' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='337' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='log_buf' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='324' column='1'/>
+          <var-decl name='log_buf' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='338' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='kern_version' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='325' column='1'/>
+          <var-decl name='kern_version' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='339' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='352'>
-          <var-decl name='prog_flags' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='326' column='1'/>
+          <var-decl name='prog_flags' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='340' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='prog_name' type-id='ac1fa8c0' visibility='default' filepath='include/uapi/linux/bpf.h' line='327' column='1'/>
+          <var-decl name='prog_name' type-id='ac1fa8c0' visibility='default' filepath='include/uapi/linux/bpf.h' line='341' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='prog_ifindex' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='328' column='1'/>
+          <var-decl name='prog_ifindex' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='342' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='544'>
-          <var-decl name='expected_attach_type' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='333' column='1'/>
+          <var-decl name='expected_attach_type' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='347' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__15' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='336' column='1' id='26ba5712'>
+      <class-decl name='__anonymous_struct__15' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='350' column='1' id='26ba5712'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='pathname' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='337' column='1'/>
+          <var-decl name='pathname' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='351' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='bpf_fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='338' column='1'/>
+          <var-decl name='bpf_fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='352' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='file_flags' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='339' column='1'/>
+          <var-decl name='file_flags' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='353' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__16' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='342' column='1' id='ecd71c3f'>
+      <class-decl name='__anonymous_struct__16' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='356' column='1' id='ecd71c3f'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='target_fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='343' column='1'/>
+          <var-decl name='target_fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='357' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='attach_bpf_fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='344' column='1'/>
+          <var-decl name='attach_bpf_fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='358' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='attach_type' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='345' column='1'/>
+          <var-decl name='attach_type' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='359' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='attach_flags' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='346' column='1'/>
+          <var-decl name='attach_flags' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='360' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__17' size-in-bits='320' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='349' column='1' id='f9428445'>
+      <class-decl name='__anonymous_struct__17' size-in-bits='320' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='363' column='1' id='f9428445'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='prog_fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='350' column='1'/>
+          <var-decl name='prog_fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='364' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='retval' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='351' column='1'/>
+          <var-decl name='retval' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='365' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='data_size_in' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='352' column='1'/>
+          <var-decl name='data_size_in' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='366' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='data_size_out' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='353' column='1'/>
+          <var-decl name='data_size_out' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='367' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='data_in' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='354' column='1'/>
+          <var-decl name='data_in' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='368' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='data_out' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='355' column='1'/>
+          <var-decl name='data_out' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='369' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='repeat' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='356' column='1'/>
+          <var-decl name='repeat' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='370' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='288'>
-          <var-decl name='duration' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='357' column='1'/>
+          <var-decl name='duration' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='371' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__18' size-in-bits='96' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='360' column='1' id='5ae16468'>
+      <class-decl name='__anonymous_struct__18' size-in-bits='96' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='374' column='1' id='5ae16468'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='' type-id='8f526230' visibility='default' filepath='include/uapi/linux/bpf.h' line='361' column='1'/>
+          <var-decl name='' type-id='8f526230' visibility='default' filepath='include/uapi/linux/bpf.h' line='375' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='next_id' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='367' column='1'/>
+          <var-decl name='next_id' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='381' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='open_flags' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='368' column='1'/>
+          <var-decl name='open_flags' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='382' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__23' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='361' column='1' id='8f526230'>
+      <union-decl name='__anonymous_union__23' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='375' column='1' id='8f526230'>
         <data-member access='public'>
-          <var-decl name='start_id' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='362' column='1'/>
+          <var-decl name='start_id' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='376' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='prog_id' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='363' column='1'/>
+          <var-decl name='prog_id' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='377' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='map_id' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='364' column='1'/>
+          <var-decl name='map_id' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='378' column='1'/>
         </data-member>
         <data-member access='public'>
-          <var-decl name='btf_id' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='365' column='1'/>
+          <var-decl name='btf_id' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='379' column='1'/>
         </data-member>
       </union-decl>
-      <class-decl name='__anonymous_struct__19' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='371' column='1' id='cca669dc'>
+      <class-decl name='__anonymous_struct__19' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='385' column='1' id='cca669dc'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='bpf_fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='372' column='1'/>
+          <var-decl name='bpf_fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='386' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='info_len' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='373' column='1'/>
+          <var-decl name='info_len' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='387' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='info' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='374' column='1'/>
+          <var-decl name='info' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='388' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__20' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='377' column='1' id='e4eac598'>
+      <class-decl name='__anonymous_struct__20' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='391' column='1' id='e4eac598'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='target_fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='378' column='1'/>
+          <var-decl name='target_fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='392' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='attach_type' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='379' column='1'/>
+          <var-decl name='attach_type' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='393' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='query_flags' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='380' column='1'/>
+          <var-decl name='query_flags' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='394' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='attach_flags' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='381' column='1'/>
+          <var-decl name='attach_flags' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='395' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='prog_ids' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='382' column='1'/>
+          <var-decl name='prog_ids' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='396' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='prog_cnt' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='383' column='1'/>
+          <var-decl name='prog_cnt' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='397' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__21' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='386' column='1' id='d316bc32'>
+      <class-decl name='__anonymous_struct__21' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='400' column='1' id='d316bc32'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='name' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='387' column='1'/>
+          <var-decl name='name' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='401' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='prog_fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='388' column='1'/>
+          <var-decl name='prog_fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='402' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__22' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='391' column='1' id='fb043dae'>
+      <class-decl name='__anonymous_struct__22' size-in-bits='256' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='405' column='1' id='fb043dae'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='btf' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='392' column='1'/>
+          <var-decl name='btf' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='406' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='btf_log_buf' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='393' column='1'/>
+          <var-decl name='btf_log_buf' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='407' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='btf_size' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='394' column='1'/>
+          <var-decl name='btf_size' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='408' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='160'>
-          <var-decl name='btf_log_size' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='395' column='1'/>
+          <var-decl name='btf_log_size' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='409' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='btf_log_level' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='396' column='1'/>
+          <var-decl name='btf_log_level' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='410' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__23' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='399' column='1' id='e7d0ed32'>
+      <class-decl name='__anonymous_struct__23' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/bpf.h' line='413' column='1' id='e7d0ed32'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='pid' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='400' column='1'/>
+          <var-decl name='pid' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='414' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='401' column='1'/>
+          <var-decl name='fd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='415' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='flags' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='402' column='1'/>
+          <var-decl name='flags' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='416' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='buf_len' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='403' column='1'/>
+          <var-decl name='buf_len' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='417' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='buf' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='404' column='1'/>
+          <var-decl name='buf' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='418' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='prog_id' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='409' column='1'/>
+          <var-decl name='prog_id' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='423' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='224'>
-          <var-decl name='fd_type' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='410' column='1'/>
+          <var-decl name='fd_type' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/bpf.h' line='424' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='probe_offset' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='411' column='1'/>
+          <var-decl name='probe_offset' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='425' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='320'>
-          <var-decl name='probe_addr' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='412' column='1'/>
+          <var-decl name='probe_addr' type-id='d3130597' visibility='default' filepath='include/uapi/linux/bpf.h' line='426' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='bpf_map' size-in-bits='2048' is-struct='yes' visibility='default' filepath='include/linux/bpf.h' line='57' column='1' id='9e4acc7a'>
@@ -86887,8 +86898,8 @@
       </function-type>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/pci/pci.c' language='LANG_C89'>
-      <function-decl name='pci_disable_device' mangled-name='pci_disable_device' filepath='drivers/pci/pci.c' line='1852' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_disable_device'>
-        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='1852' column='1'/>
+      <function-decl name='pci_disable_device' mangled-name='pci_disable_device' filepath='drivers/pci/pci.c' line='1842' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_disable_device'>
+        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='1842' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
       <function-decl name='pci_find_next_capability' mangled-name='pci_find_next_capability' filepath='drivers/pci/pci.c' line='393' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_find_next_capability'>
@@ -86897,12 +86908,12 @@
         <parameter type-id='95e97e5e' name='cap' filepath='drivers/pci/pci.c' line='393' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='pci_enable_device' mangled-name='pci_enable_device' filepath='drivers/pci/pci.c' line='1660' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_enable_device'>
-        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='1660' column='1'/>
+      <function-decl name='pci_enable_device' mangled-name='pci_enable_device' filepath='drivers/pci/pci.c' line='1650' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_enable_device'>
+        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='1650' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='pcim_enable_device' mangled-name='pcim_enable_device' filepath='drivers/pci/pci.c' line='1733' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pcim_enable_device'>
-        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='1733' column='1'/>
+      <function-decl name='pcim_enable_device' mangled-name='pcim_enable_device' filepath='drivers/pci/pci.c' line='1723' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pcim_enable_device'>
+        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='1723' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-decl name='pm_runtime_barrier' mangled-name='pm_runtime_barrier' filepath='include/linux/pm_runtime.h' line='45' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_runtime_barrier'>
@@ -86914,36 +86925,36 @@
         <parameter type-id='c894953d'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='pci_request_acs' mangled-name='pci_request_acs' filepath='drivers/pci/pci.c' line='3060' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_acs'>
+      <function-decl name='pci_request_acs' mangled-name='pci_request_acs' filepath='drivers/pci/pci.c' line='3050' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_acs'>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='pci_request_region' mangled-name='pci_request_region' filepath='drivers/pci/pci.c' line='3648' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_region'>
-        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3648' column='1'/>
-        <parameter type-id='95e97e5e' name='bar' filepath='drivers/pci/pci.c' line='3648' column='1'/>
-        <parameter type-id='80f4b756' name='res_name' filepath='drivers/pci/pci.c' line='3648' column='1'/>
+      <function-decl name='pci_request_region' mangled-name='pci_request_region' filepath='drivers/pci/pci.c' line='3638' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_region'>
+        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3638' column='1'/>
+        <parameter type-id='95e97e5e' name='bar' filepath='drivers/pci/pci.c' line='3638' column='1'/>
+        <parameter type-id='80f4b756' name='res_name' filepath='drivers/pci/pci.c' line='3638' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='pci_request_selected_regions' mangled-name='pci_request_selected_regions' filepath='drivers/pci/pci.c' line='3723' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_selected_regions'>
-        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3723' column='1'/>
-        <parameter type-id='95e97e5e' name='bars' filepath='drivers/pci/pci.c' line='3723' column='1'/>
-        <parameter type-id='80f4b756' name='res_name' filepath='drivers/pci/pci.c' line='3724' column='1'/>
+      <function-decl name='pci_request_selected_regions' mangled-name='pci_request_selected_regions' filepath='drivers/pci/pci.c' line='3713' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_selected_regions'>
+        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3713' column='1'/>
+        <parameter type-id='95e97e5e' name='bars' filepath='drivers/pci/pci.c' line='3713' column='1'/>
+        <parameter type-id='80f4b756' name='res_name' filepath='drivers/pci/pci.c' line='3714' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='pci_release_regions' mangled-name='pci_release_regions' filepath='drivers/pci/pci.c' line='3747' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_release_regions'>
-        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3747' column='1'/>
+      <function-decl name='pci_release_regions' mangled-name='pci_release_regions' filepath='drivers/pci/pci.c' line='3737' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_release_regions'>
+        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3737' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='pci_request_regions' mangled-name='pci_request_regions' filepath='drivers/pci/pci.c' line='3766' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_regions'>
-        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3766' column='1'/>
-        <parameter type-id='80f4b756' name='res_name' filepath='drivers/pci/pci.c' line='3766' column='1'/>
+      <function-decl name='pci_request_regions' mangled-name='pci_request_regions' filepath='drivers/pci/pci.c' line='3756' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_request_regions'>
+        <parameter type-id='85196e3f' name='pdev' filepath='drivers/pci/pci.c' line='3756' column='1'/>
+        <parameter type-id='80f4b756' name='res_name' filepath='drivers/pci/pci.c' line='3756' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='pci_set_master' mangled-name='pci_set_master' filepath='drivers/pci/pci.c' line='4089' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_set_master'>
-        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='4089' column='1'/>
+      <function-decl name='pci_set_master' mangled-name='pci_set_master' filepath='drivers/pci/pci.c' line='4079' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_set_master'>
+        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='4079' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='pci_clear_master' mangled-name='pci_clear_master' filepath='drivers/pci/pci.c' line='4100' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_clear_master'>
-        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='4100' column='1'/>
+      <function-decl name='pci_clear_master' mangled-name='pci_clear_master' filepath='drivers/pci/pci.c' line='4090' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pci_clear_master'>
+        <parameter type-id='85196e3f' name='dev' filepath='drivers/pci/pci.c' line='4090' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
     </abi-instr>
@@ -88455,35 +88466,35 @@
         </data-member>
       </class-decl>
       <pointer-type-def type-id='2e3fb70e' size-in-bits='64' id='776946b4'/>
-      <function-decl name='regulator_get' mangled-name='regulator_get' filepath='drivers/regulator/core.c' line='1847' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_get'>
-        <parameter type-id='fa0b179b' name='dev' filepath='drivers/regulator/core.c' line='1847' column='1'/>
-        <parameter type-id='80f4b756' name='id' filepath='drivers/regulator/core.c' line='1847' column='1'/>
+      <function-decl name='regulator_get' mangled-name='regulator_get' filepath='drivers/regulator/core.c' line='1853' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_get'>
+        <parameter type-id='fa0b179b' name='dev' filepath='drivers/regulator/core.c' line='1853' column='1'/>
+        <parameter type-id='80f4b756' name='id' filepath='drivers/regulator/core.c' line='1853' column='1'/>
         <return type-id='850c13f6'/>
       </function-decl>
-      <function-decl name='regulator_get_optional' mangled-name='regulator_get_optional' filepath='drivers/regulator/core.c' line='1900' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_get_optional'>
-        <parameter type-id='fa0b179b' name='dev' filepath='drivers/regulator/core.c' line='1900' column='1'/>
-        <parameter type-id='80f4b756' name='id' filepath='drivers/regulator/core.c' line='1900' column='1'/>
+      <function-decl name='regulator_get_optional' mangled-name='regulator_get_optional' filepath='drivers/regulator/core.c' line='1906' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_get_optional'>
+        <parameter type-id='fa0b179b' name='dev' filepath='drivers/regulator/core.c' line='1906' column='1'/>
+        <parameter type-id='80f4b756' name='id' filepath='drivers/regulator/core.c' line='1906' column='1'/>
         <return type-id='850c13f6'/>
       </function-decl>
-      <function-decl name='regulator_put' mangled-name='regulator_put' filepath='drivers/regulator/core.c' line='1957' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_put'>
-        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='1957' column='1'/>
+      <function-decl name='regulator_put' mangled-name='regulator_put' filepath='drivers/regulator/core.c' line='1963' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_put'>
+        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='1963' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='regulator_disable_deferred' mangled-name='regulator_disable_deferred' filepath='drivers/regulator/core.c' line='2595' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_disable_deferred'>
-        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='2595' column='1'/>
-        <parameter type-id='95e97e5e' name='ms' filepath='drivers/regulator/core.c' line='2595' column='1'/>
+      <function-decl name='regulator_disable_deferred' mangled-name='regulator_disable_deferred' filepath='drivers/regulator/core.c' line='2601' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_disable_deferred'>
+        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='2601' column='1'/>
+        <parameter type-id='95e97e5e' name='ms' filepath='drivers/regulator/core.c' line='2601' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='regulator_is_enabled' mangled-name='regulator_is_enabled' filepath='drivers/regulator/core.c' line='2674' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_is_enabled'>
-        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='2674' column='1'/>
+      <function-decl name='regulator_is_enabled' mangled-name='regulator_is_enabled' filepath='drivers/regulator/core.c' line='2680' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_is_enabled'>
+        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='2680' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='regulator_count_voltages' mangled-name='regulator_count_voltages' filepath='drivers/regulator/core.c' line='2697' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_count_voltages'>
-        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='2697' column='1'/>
+      <function-decl name='regulator_count_voltages' mangled-name='regulator_count_voltages' filepath='drivers/regulator/core.c' line='2703' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_count_voltages'>
+        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='2703' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='regulator_get_voltage' mangled-name='regulator_get_voltage' filepath='drivers/regulator/core.c' line='3505' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_get_voltage'>
-        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='3505' column='1'/>
+      <function-decl name='regulator_get_voltage' mangled-name='regulator_get_voltage' filepath='drivers/regulator/core.c' line='3511' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_get_voltage'>
+        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='3511' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-decl name='regulator_map_voltage_linear' mangled-name='regulator_map_voltage_linear' filepath='include/linux/regulator/driver.h' line='508' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_map_voltage_linear'>
@@ -88492,50 +88503,50 @@
         <parameter type-id='95e97e5e'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='regulator_set_current_limit' mangled-name='regulator_set_current_limit' filepath='drivers/regulator/core.c' line='3535' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_set_current_limit'>
-        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='3535' column='1'/>
-        <parameter type-id='95e97e5e' name='min_uA' filepath='drivers/regulator/core.c' line='3536' column='1'/>
-        <parameter type-id='95e97e5e' name='max_uA' filepath='drivers/regulator/core.c' line='3536' column='1'/>
+      <function-decl name='regulator_set_current_limit' mangled-name='regulator_set_current_limit' filepath='drivers/regulator/core.c' line='3541' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_set_current_limit'>
+        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='3541' column='1'/>
+        <parameter type-id='95e97e5e' name='min_uA' filepath='drivers/regulator/core.c' line='3542' column='1'/>
+        <parameter type-id='95e97e5e' name='max_uA' filepath='drivers/regulator/core.c' line='3542' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='regulator_set_mode' mangled-name='regulator_set_mode' filepath='drivers/regulator/core.c' line='3605' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_set_mode'>
-        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='3605' column='1'/>
-        <parameter type-id='f0981eeb' name='mode' filepath='drivers/regulator/core.c' line='3605' column='1'/>
+      <function-decl name='regulator_set_mode' mangled-name='regulator_set_mode' filepath='drivers/regulator/core.c' line='3611' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_set_mode'>
+        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='3611' column='1'/>
+        <parameter type-id='f0981eeb' name='mode' filepath='drivers/regulator/core.c' line='3611' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='regulator_get_mode' mangled-name='regulator_get_mode' filepath='drivers/regulator/core.c' line='3664' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_get_mode'>
-        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='3664' column='1'/>
+      <function-decl name='regulator_get_mode' mangled-name='regulator_get_mode' filepath='drivers/regulator/core.c' line='3670' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_get_mode'>
+        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='3670' column='1'/>
         <return type-id='f0981eeb'/>
       </function-decl>
-      <function-decl name='regulator_set_load' mangled-name='regulator_set_load' filepath='drivers/regulator/core.c' line='3729' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_set_load'>
-        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='3729' column='1'/>
-        <parameter type-id='95e97e5e' name='uA_load' filepath='drivers/regulator/core.c' line='3729' column='1'/>
+      <function-decl name='regulator_set_load' mangled-name='regulator_set_load' filepath='drivers/regulator/core.c' line='3735' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_set_load'>
+        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='3735' column='1'/>
+        <parameter type-id='95e97e5e' name='uA_load' filepath='drivers/regulator/core.c' line='3735' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='regulator_register_notifier' mangled-name='regulator_register_notifier' filepath='drivers/regulator/core.c' line='3802' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_register_notifier'>
-        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='3802' column='1'/>
-        <parameter type-id='d504f73d' name='nb' filepath='drivers/regulator/core.c' line='3803' column='1'/>
+      <function-decl name='regulator_register_notifier' mangled-name='regulator_register_notifier' filepath='drivers/regulator/core.c' line='3808' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_register_notifier'>
+        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='3808' column='1'/>
+        <parameter type-id='d504f73d' name='nb' filepath='drivers/regulator/core.c' line='3809' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='regulator_unregister_notifier' mangled-name='regulator_unregister_notifier' filepath='drivers/regulator/core.c' line='3817' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_unregister_notifier'>
-        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='3817' column='1'/>
-        <parameter type-id='d504f73d' name='nb' filepath='drivers/regulator/core.c' line='3818' column='1'/>
+      <function-decl name='regulator_unregister_notifier' mangled-name='regulator_unregister_notifier' filepath='drivers/regulator/core.c' line='3823' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_unregister_notifier'>
+        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='3823' column='1'/>
+        <parameter type-id='d504f73d' name='nb' filepath='drivers/regulator/core.c' line='3824' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='regulator_bulk_enable' mangled-name='regulator_bulk_enable' filepath='drivers/regulator/core.c' line='3899' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_bulk_enable'>
-        <parameter type-id='95e97e5e' name='num_consumers' filepath='drivers/regulator/core.c' line='3899' column='1'/>
-        <parameter type-id='776946b4' name='consumers' filepath='drivers/regulator/core.c' line='3900' column='1'/>
+      <function-decl name='regulator_bulk_enable' mangled-name='regulator_bulk_enable' filepath='drivers/regulator/core.c' line='3905' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_bulk_enable'>
+        <parameter type-id='95e97e5e' name='num_consumers' filepath='drivers/regulator/core.c' line='3905' column='1'/>
+        <parameter type-id='776946b4' name='consumers' filepath='drivers/regulator/core.c' line='3906' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='regulator_bulk_disable' mangled-name='regulator_bulk_disable' filepath='drivers/regulator/core.c' line='3951' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_bulk_disable'>
-        <parameter type-id='95e97e5e' name='num_consumers' filepath='drivers/regulator/core.c' line='3951' column='1'/>
-        <parameter type-id='776946b4' name='consumers' filepath='drivers/regulator/core.c' line='3952' column='1'/>
+      <function-decl name='regulator_bulk_disable' mangled-name='regulator_bulk_disable' filepath='drivers/regulator/core.c' line='3957' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_bulk_disable'>
+        <parameter type-id='95e97e5e' name='num_consumers' filepath='drivers/regulator/core.c' line='3957' column='1'/>
+        <parameter type-id='776946b4' name='consumers' filepath='drivers/regulator/core.c' line='3958' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='regulator_notifier_call_chain' mangled-name='regulator_notifier_call_chain' filepath='drivers/regulator/core.c' line='4042' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_notifier_call_chain'>
-        <parameter type-id='43c38462' name='rdev' filepath='drivers/regulator/core.c' line='4042' column='1'/>
-        <parameter type-id='7359adad' name='event' filepath='drivers/regulator/core.c' line='4043' column='1'/>
-        <parameter type-id='eaa32e2f' name='data' filepath='drivers/regulator/core.c' line='4043' column='1'/>
+      <function-decl name='regulator_notifier_call_chain' mangled-name='regulator_notifier_call_chain' filepath='drivers/regulator/core.c' line='4048' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_notifier_call_chain'>
+        <parameter type-id='43c38462' name='rdev' filepath='drivers/regulator/core.c' line='4048' column='1'/>
+        <parameter type-id='7359adad' name='event' filepath='drivers/regulator/core.c' line='4049' column='1'/>
+        <parameter type-id='eaa32e2f' name='data' filepath='drivers/regulator/core.c' line='4049' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-decl name='dev_get_regmap' mangled-name='dev_get_regmap' filepath='include/linux/regmap.h' line='976' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_get_regmap'>
@@ -88543,20 +88554,20 @@
         <parameter type-id='80f4b756'/>
         <return type-id='29af9a71'/>
       </function-decl>
-      <function-decl name='regulator_sync_state' mangled-name='regulator_sync_state' filepath='drivers/regulator/core.c' line='4575' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_sync_state'>
-        <parameter type-id='fa0b179b' name='dev' filepath='drivers/regulator/core.c' line='4575' column='1'/>
+      <function-decl name='regulator_sync_state' mangled-name='regulator_sync_state' filepath='drivers/regulator/core.c' line='4581' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_sync_state'>
+        <parameter type-id='fa0b179b' name='dev' filepath='drivers/regulator/core.c' line='4581' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='rdev_get_drvdata' mangled-name='rdev_get_drvdata' filepath='drivers/regulator/core.c' line='4687' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rdev_get_drvdata'>
-        <parameter type-id='43c38462' name='rdev' filepath='drivers/regulator/core.c' line='4687' column='1'/>
+      <function-decl name='rdev_get_drvdata' mangled-name='rdev_get_drvdata' filepath='drivers/regulator/core.c' line='4693' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rdev_get_drvdata'>
+        <parameter type-id='43c38462' name='rdev' filepath='drivers/regulator/core.c' line='4693' column='1'/>
         <return type-id='eaa32e2f'/>
       </function-decl>
-      <function-decl name='regulator_get_drvdata' mangled-name='regulator_get_drvdata' filepath='drivers/regulator/core.c' line='4700' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_get_drvdata'>
-        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='4700' column='1'/>
+      <function-decl name='regulator_get_drvdata' mangled-name='regulator_get_drvdata' filepath='drivers/regulator/core.c' line='4706' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='regulator_get_drvdata'>
+        <parameter type-id='850c13f6' name='regulator' filepath='drivers/regulator/core.c' line='4706' column='1'/>
         <return type-id='eaa32e2f'/>
       </function-decl>
-      <function-decl name='rdev_get_id' mangled-name='rdev_get_id' filepath='drivers/regulator/core.c' line='4721' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rdev_get_id'>
-        <parameter type-id='43c38462' name='rdev' filepath='drivers/regulator/core.c' line='4721' column='1'/>
+      <function-decl name='rdev_get_id' mangled-name='rdev_get_id' filepath='drivers/regulator/core.c' line='4727' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rdev_get_id'>
+        <parameter type-id='43c38462' name='rdev' filepath='drivers/regulator/core.c' line='4727' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
     </abi-instr>
@@ -90143,9 +90154,9 @@
       <pointer-type-def type-id='52bea74f' size-in-bits='64' id='3257bfe7'/>
       <pointer-type-def type-id='6831a786' size-in-bits='64' id='3b3fe200'/>
       <pointer-type-def type-id='1120d7bb' size-in-bits='64' id='341171ef'/>
-      <function-decl name='scsi_host_alloc' mangled-name='scsi_host_alloc' filepath='drivers/scsi/hosts.c' line='382' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='scsi_host_alloc'>
-        <parameter type-id='36265581' name='sht' filepath='drivers/scsi/hosts.c' line='382' column='1'/>
-        <parameter type-id='95e97e5e' name='privsize' filepath='drivers/scsi/hosts.c' line='382' column='1'/>
+      <function-decl name='scsi_host_alloc' mangled-name='scsi_host_alloc' filepath='drivers/scsi/hosts.c' line='386' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='scsi_host_alloc'>
+        <parameter type-id='36265581' name='sht' filepath='drivers/scsi/hosts.c' line='386' column='1'/>
+        <parameter type-id='95e97e5e' name='privsize' filepath='drivers/scsi/hosts.c' line='386' column='1'/>
         <return type-id='a970a64c'/>
       </function-decl>
       <function-decl name='scsi_remove_host' mangled-name='scsi_remove_host' filepath='drivers/scsi/hosts.c' line='162' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='scsi_remove_host'>
@@ -90158,8 +90169,8 @@
         <parameter type-id='fa0b179b' name='dma_dev' filepath='drivers/scsi/hosts.c' line='207' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='scsi_host_put' mangled-name='scsi_host_put' filepath='drivers/scsi/hosts.c' line='580' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='scsi_host_put'>
-        <parameter type-id='a970a64c' name='shost' filepath='drivers/scsi/hosts.c' line='580' column='1'/>
+      <function-decl name='scsi_host_put' mangled-name='scsi_host_put' filepath='drivers/scsi/hosts.c' line='587' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='scsi_host_put'>
+        <parameter type-id='a970a64c' name='shost' filepath='drivers/scsi/hosts.c' line='587' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
       <pointer-type-def type-id='83cec606' size-in-bits='64' id='a970a64c'/>
@@ -93795,6 +93806,160 @@
         <return type-id='2feec21f'/>
       </function-decl>
     </abi-instr>
+    <abi-instr address-size='64' path='drivers/tty/hvc/hvc_console.c' language='LANG_C89'>
+      <class-decl name='hv_ops' size-in-bits='576' is-struct='yes' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='54' column='1' id='06b0b498'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='get_chars' type-id='b925d171' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='55' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='put_chars' type-id='cbcd023c' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='56' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='flush' type-id='6d72cd27' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='57' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='notifier_add' type-id='38ea827b' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='60' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='notifier_del' type-id='4b6c509a' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='61' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='notifier_hangup' type-id='4b6c509a' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='62' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='tiocmget' type-id='6cd5b5fc' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='65' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='tiocmset' type-id='7d48d834' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='66' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='dtr_rts' type-id='4b6c509a' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='69' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='hvc_struct' size-in-bits='4032' is-struct='yes' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='35' column='1' id='79ba66e0'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='port' type-id='7e1e521a' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='36' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2944'>
+          <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2976'>
+          <var-decl name='index' type-id='95e97e5e' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3008'>
+          <var-decl name='do_wakeup' type-id='95e97e5e' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='39' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3072'>
+          <var-decl name='outbuf' type-id='26a90f95' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3136'>
+          <var-decl name='outbuf_size' type-id='95e97e5e' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3168'>
+          <var-decl name='n_outbuf' type-id='95e97e5e' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3200'>
+          <var-decl name='vtermno' type-id='8f92235e' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3264'>
+          <var-decl name='ops' type-id='f319e2c5' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='44' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3328'>
+          <var-decl name='irq_requested' type-id='95e97e5e' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='45' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3360'>
+          <var-decl name='data' type-id='95e97e5e' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='46' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3392'>
+          <var-decl name='ws' type-id='a818b7a0' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='47' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3456'>
+          <var-decl name='tty_resize' type-id='ef9025d0' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='48' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3840'>
+          <var-decl name='next' type-id='72f469ec' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='49' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='3968'>
+          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='drivers/tty/hvc/hvc_console.h' line='50' column='1'/>
+        </data-member>
+      </class-decl>
+      <qualified-type-def type-id='06b0b498' const='yes' id='09f4a16d'/>
+      <pointer-type-def type-id='09f4a16d' size-in-bits='64' id='f319e2c5'/>
+      <pointer-type-def type-id='79ba66e0' size-in-bits='64' id='352b95f6'/>
+      <pointer-type-def type-id='7f3ed7a2' size-in-bits='64' id='6cd5b5fc'/>
+      <pointer-type-def type-id='a0807697' size-in-bits='64' id='38ea827b'/>
+      <pointer-type-def type-id='4e3458ca' size-in-bits='64' id='7d48d834'/>
+      <pointer-type-def type-id='86933835' size-in-bits='64' id='b925d171'/>
+      <pointer-type-def type-id='de7351ca' size-in-bits='64' id='cbcd023c'/>
+      <pointer-type-def type-id='66781033' size-in-bits='64' id='6d72cd27'/>
+      <pointer-type-def type-id='8cfd5cb8' size-in-bits='64' id='4b6c509a'/>
+      <function-decl name='hvc_instantiate' mangled-name='hvc_instantiate' filepath='drivers/tty/hvc/hvc_console.c' line='285' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hvc_instantiate'>
+        <parameter type-id='8f92235e' name='vtermno' filepath='drivers/tty/hvc/hvc_console.c' line='285' column='1'/>
+        <parameter type-id='95e97e5e' name='index' filepath='drivers/tty/hvc/hvc_console.c' line='285' column='1'/>
+        <parameter type-id='f319e2c5' name='ops' filepath='drivers/tty/hvc/hvc_console.c' line='285' column='1'/>
+        <return type-id='95e97e5e'/>
+      </function-decl>
+      <function-decl name='hvc_kick' mangled-name='hvc_kick' filepath='drivers/tty/hvc/hvc_console.c' line='313' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hvc_kick'>
+        <return type-id='48b5725f'/>
+      </function-decl>
+      <function-decl name='hvc_poll' mangled-name='hvc_poll' filepath='drivers/tty/hvc/hvc_console.c' line='762' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hvc_poll'>
+        <parameter type-id='352b95f6' name='hp' filepath='drivers/tty/hvc/hvc_console.c' line='762' column='1'/>
+        <return type-id='95e97e5e'/>
+      </function-decl>
+      <function-decl name='__hvc_resize' mangled-name='__hvc_resize' filepath='drivers/tty/hvc/hvc_console.c' line='778' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__hvc_resize'>
+        <parameter type-id='352b95f6' name='hp' filepath='drivers/tty/hvc/hvc_console.c' line='778' column='1'/>
+        <parameter type-id='a818b7a0' name='ws' filepath='drivers/tty/hvc/hvc_console.c' line='778' column='1'/>
+        <return type-id='48b5725f'/>
+      </function-decl>
+      <function-decl name='hvc_alloc' mangled-name='hvc_alloc' filepath='drivers/tty/hvc/hvc_console.c' line='911' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hvc_alloc'>
+        <parameter type-id='8f92235e' name='vtermno' filepath='drivers/tty/hvc/hvc_console.c' line='911' column='1'/>
+        <parameter type-id='95e97e5e' name='data' filepath='drivers/tty/hvc/hvc_console.c' line='911' column='1'/>
+        <parameter type-id='f319e2c5' name='ops' filepath='drivers/tty/hvc/hvc_console.c' line='912' column='1'/>
+        <parameter type-id='95e97e5e' name='outbuf_size' filepath='drivers/tty/hvc/hvc_console.c' line='913' column='1'/>
+        <return type-id='352b95f6'/>
+      </function-decl>
+      <function-decl name='hvc_remove' mangled-name='hvc_remove' filepath='drivers/tty/hvc/hvc_console.c' line='979' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hvc_remove'>
+        <parameter type-id='352b95f6' name='hp' filepath='drivers/tty/hvc/hvc_console.c' line='979' column='1'/>
+        <return type-id='95e97e5e'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='7f3ed7a2'>
+        <parameter type-id='352b95f6'/>
+        <return type-id='95e97e5e'/>
+      </function-type>
+      <function-type size-in-bits='64' id='a0807697'>
+        <parameter type-id='352b95f6'/>
+        <parameter type-id='95e97e5e'/>
+        <return type-id='95e97e5e'/>
+      </function-type>
+      <function-type size-in-bits='64' id='4e3458ca'>
+        <parameter type-id='352b95f6'/>
+        <parameter type-id='f0981eeb'/>
+        <parameter type-id='f0981eeb'/>
+        <return type-id='95e97e5e'/>
+      </function-type>
+      <function-type size-in-bits='64' id='86933835'>
+        <parameter type-id='8f92235e'/>
+        <parameter type-id='26a90f95'/>
+        <parameter type-id='95e97e5e'/>
+        <return type-id='95e97e5e'/>
+      </function-type>
+      <function-type size-in-bits='64' id='de7351ca'>
+        <parameter type-id='8f92235e'/>
+        <parameter type-id='80f4b756'/>
+        <parameter type-id='95e97e5e'/>
+        <return type-id='95e97e5e'/>
+      </function-type>
+      <function-type size-in-bits='64' id='66781033'>
+        <parameter type-id='8f92235e'/>
+        <parameter type-id='b50a4934'/>
+        <return type-id='95e97e5e'/>
+      </function-type>
+      <function-type size-in-bits='64' id='8cfd5cb8'>
+        <parameter type-id='352b95f6'/>
+        <parameter type-id='95e97e5e'/>
+        <return type-id='48b5725f'/>
+      </function-type>
+    </abi-instr>
     <abi-instr address-size='64' path='drivers/tty/serdev/core.c' language='LANG_C89'>
       <class-decl name='serdev_device' size-in-bits='8320' is-struct='yes' visibility='default' filepath='include/linux/serdev.h' line='49' column='1' id='84bb5b7f'>
         <data-member access='public' layout-offset-in-bits='0'>
@@ -104087,8 +104252,8 @@
       </function-type>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/usb/host/xhci.c' language='LANG_C89'>
-      <function-decl name='xhci_run' mangled-name='xhci_run' filepath='drivers/usb/host/xhci.c' line='633' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xhci_run'>
-        <parameter type-id='fc4f83c1' name='hcd' filepath='drivers/usb/host/xhci.c' line='633' column='1'/>
+      <function-decl name='xhci_run' mangled-name='xhci_run' filepath='drivers/usb/host/xhci.c' line='637' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xhci_run'>
+        <parameter type-id='fc4f83c1' name='hcd' filepath='drivers/usb/host/xhci.c' line='637' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
     </abi-instr>
@@ -106650,6 +106815,16 @@
         <return type-id='b50a4934'/>
       </function-type>
     </abi-instr>
+    <abi-instr address-size='64' path='fs/pipe.c' language='LANG_C89'>
+      <function-decl name='pipe_lock' mangled-name='pipe_lock' filepath='fs/pipe.c' line='65' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pipe_lock'>
+        <parameter type-id='15d29710' name='pipe' filepath='fs/pipe.c' line='65' column='1'/>
+        <return type-id='48b5725f'/>
+      </function-decl>
+      <function-decl name='pipe_unlock' mangled-name='pipe_unlock' filepath='fs/pipe.c' line='74' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pipe_unlock'>
+        <parameter type-id='15d29710' name='pipe' filepath='fs/pipe.c' line='74' column='1'/>
+        <return type-id='48b5725f'/>
+      </function-decl>
+    </abi-instr>
     <abi-instr address-size='64' path='fs/proc/base.c' language='LANG_C89'>
       <class-decl name='flex_array_part' is-struct='yes' visibility='default' is-declaration-only='yes' id='547c2250'/>
       <array-type-def dimensions='1' type-id='4ac80006' size-in-bits='infinite' id='9dee314e'>
@@ -106806,17 +106981,6 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='fs/proc/proc_net.c' language='LANG_C89'>
-      <union-decl name='__anonymous_union__2' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='2b7f7bf0'>
-        <data-member access='public'>
-          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide59' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-      </union-decl>
       <function-decl name='proc_create_net_single' mangled-name='proc_create_net_single' filepath='fs/proc/proc_net.c' line='177' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='proc_create_net_single'>
         <parameter type-id='80f4b756' name='name' filepath='fs/proc/proc_net.c' line='177' column='1'/>
         <parameter type-id='2594b00f' name='mode' filepath='fs/proc/proc_net.c' line='177' column='1'/>
@@ -107202,6 +107366,46 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='fs/splice.c' language='LANG_C89'>
+      <class-decl name='splice_desc' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/splice.h' line='29' column='1' id='41838567'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='total_len' type-id='b59d7dce' visibility='default' filepath='include/linux/splice.h' line='30' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='len' type-id='f0981eeb' visibility='default' filepath='include/linux/splice.h' line='31' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='flags' type-id='f0981eeb' visibility='default' filepath='include/linux/splice.h' line='32' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='u' type-id='1851a81a' visibility='default' filepath='include/linux/splice.h' line='40' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='pos' type-id='69bf7bee' visibility='default' filepath='include/linux/splice.h' line='41' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='opos' type-id='b53e8dbb' visibility='default' filepath='include/linux/splice.h' line='42' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='num_spliced' type-id='b59d7dce' visibility='default' filepath='include/linux/splice.h' line='43' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='need_wakeup' type-id='b50a4934' visibility='default' filepath='include/linux/splice.h' line='44' column='1'/>
+        </data-member>
+      </class-decl>
+      <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/splice.h' line='36' column='1' id='1851a81a'>
+        <data-member access='public'>
+          <var-decl name='userptr' type-id='eaa32e2f' visibility='default' filepath='include/linux/splice.h' line='37' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='file' type-id='77e79a4b' visibility='default' filepath='include/linux/splice.h' line='38' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='data' type-id='eaa32e2f' visibility='default' filepath='include/linux/splice.h' line='39' column='1'/>
+        </data-member>
+      </union-decl>
+      <typedef-decl name='splice_actor' type-id='69c72ccd' filepath='include/linux/splice.h' line='65' column='1' id='99adf786'/>
+      <pointer-type-def type-id='99adf786' size-in-bits='64' id='05903717'/>
+      <pointer-type-def type-id='41838567' size-in-bits='64' id='f5bc338f'/>
       <function-decl name='generic_file_splice_read' mangled-name='generic_file_splice_read' filepath='fs/splice.c' line='296' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='generic_file_splice_read'>
         <parameter type-id='77e79a4b' name='in' filepath='fs/splice.c' line='296' column='1'/>
         <parameter type-id='b53e8dbb' name='ppos' filepath='fs/splice.c' line='296' column='1'/>
@@ -107210,6 +107414,18 @@
         <parameter type-id='f0981eeb' name='flags' filepath='fs/splice.c' line='298' column='1'/>
         <return type-id='79a0948f'/>
       </function-decl>
+      <function-decl name='__splice_from_pipe' mangled-name='__splice_from_pipe' filepath='fs/splice.c' line='617' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__splice_from_pipe'>
+        <parameter type-id='15d29710' name='pipe' filepath='fs/splice.c' line='617' column='1'/>
+        <parameter type-id='f5bc338f' name='sd' filepath='fs/splice.c' line='617' column='1'/>
+        <parameter type-id='05903717' name='actor' filepath='fs/splice.c' line='618' column='1'/>
+        <return type-id='79a0948f'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='69c72ccd'>
+        <parameter type-id='15d29710'/>
+        <parameter type-id='e15f3242'/>
+        <parameter type-id='f5bc338f'/>
+        <return type-id='95e97e5e'/>
+      </function-type>
     </abi-instr>
     <abi-instr address-size='64' path='fs/stack.c' language='LANG_C89'>
       <function-decl name='fsstack_copy_attr_all' mangled-name='fsstack_copy_attr_all' filepath='fs/stack.c' line='63' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fsstack_copy_attr_all'>
@@ -109373,20 +109589,20 @@
         </data-member>
       </class-decl>
       <pointer-type-def type-id='a752caf1' size-in-bits='64' id='4b860c99'/>
-      <function-decl name='perf_pmu_register' mangled-name='perf_pmu_register' filepath='kernel/events/core.c' line='9706' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='perf_pmu_register'>
-        <parameter type-id='0906f5b9' name='pmu' filepath='kernel/events/core.c' line='9706' column='1'/>
-        <parameter type-id='80f4b756' name='name' filepath='kernel/events/core.c' line='9706' column='1'/>
-        <parameter type-id='95e97e5e' name='type' filepath='kernel/events/core.c' line='9706' column='1'/>
+      <function-decl name='perf_pmu_register' mangled-name='perf_pmu_register' filepath='kernel/events/core.c' line='9708' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='perf_pmu_register'>
+        <parameter type-id='0906f5b9' name='pmu' filepath='kernel/events/core.c' line='9708' column='1'/>
+        <parameter type-id='80f4b756' name='name' filepath='kernel/events/core.c' line='9708' column='1'/>
+        <parameter type-id='95e97e5e' name='type' filepath='kernel/events/core.c' line='9708' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-decl name='perf_event_enable' mangled-name='perf_event_enable' filepath='kernel/events/core.c' line='2729' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='perf_event_enable'>
         <parameter type-id='2bf16f59' name='event' filepath='kernel/events/core.c' line='2729' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='perf_event_read_value' mangled-name='perf_event_read_value' filepath='kernel/events/core.c' line='4715' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='perf_event_read_value'>
-        <parameter type-id='2bf16f59' name='event' filepath='kernel/events/core.c' line='4715' column='1'/>
-        <parameter type-id='3df9fd28' name='enabled' filepath='kernel/events/core.c' line='4715' column='1'/>
-        <parameter type-id='3df9fd28' name='running' filepath='kernel/events/core.c' line='4715' column='1'/>
+      <function-decl name='perf_event_read_value' mangled-name='perf_event_read_value' filepath='kernel/events/core.c' line='4717' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='perf_event_read_value'>
+        <parameter type-id='2bf16f59' name='event' filepath='kernel/events/core.c' line='4717' column='1'/>
+        <parameter type-id='3df9fd28' name='enabled' filepath='kernel/events/core.c' line='4717' column='1'/>
+        <parameter type-id='3df9fd28' name='running' filepath='kernel/events/core.c' line='4717' column='1'/>
         <return type-id='91ce1af9'/>
       </function-decl>
       <function-decl name='anon_inode_getfile' mangled-name='anon_inode_getfile' filepath='include/linux/anon_inodes.h' line='14' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='anon_inode_getfile'>
@@ -110004,13 +110220,13 @@
         <parameter type-id='a57283f9' name='key' filepath='kernel/locking/mutex.c' line='39' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='ww_mutex_unlock' mangled-name='ww_mutex_unlock' filepath='kernel/locking/mutex.c' line='728' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ww_mutex_unlock'>
-        <parameter type-id='7533ba6f' name='lock' filepath='kernel/locking/mutex.c' line='728' column='1'/>
+      <function-decl name='ww_mutex_unlock' mangled-name='ww_mutex_unlock' filepath='kernel/locking/mutex.c' line='738' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ww_mutex_unlock'>
+        <parameter type-id='7533ba6f' name='lock' filepath='kernel/locking/mutex.c' line='738' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='ww_mutex_lock_interruptible' mangled-name='ww_mutex_lock_interruptible' filepath='kernel/locking/mutex.c' line='1410' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ww_mutex_lock_interruptible'>
-        <parameter type-id='7533ba6f' name='lock' filepath='kernel/locking/mutex.c' line='1410' column='1'/>
-        <parameter type-id='c1d02a64' name='ctx' filepath='kernel/locking/mutex.c' line='1410' column='1'/>
+      <function-decl name='ww_mutex_lock_interruptible' mangled-name='ww_mutex_lock_interruptible' filepath='kernel/locking/mutex.c' line='1418' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ww_mutex_lock_interruptible'>
+        <parameter type-id='7533ba6f' name='lock' filepath='kernel/locking/mutex.c' line='1418' column='1'/>
+        <parameter type-id='c1d02a64' name='ctx' filepath='kernel/locking/mutex.c' line='1418' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
     </abi-instr>
@@ -110090,12 +110306,12 @@
       <array-type-def dimensions='1' type-id='def413c9' size-in-bits='infinite' id='ae08da59'>
         <subrange length='infinite' type-id='7ff19f0f' id='031f2035'/>
       </array-type-def>
-      <class-decl name='module_sect_attr' size-in-bits='512' is-struct='yes' visibility='default' filepath='kernel/module.c' line='1453' column='1' id='def413c9'>
+      <class-decl name='module_sect_attr' size-in-bits='512' is-struct='yes' visibility='default' filepath='kernel/module.c' line='1455' column='1' id='def413c9'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='battr' type-id='d83a2db1' visibility='default' filepath='kernel/module.c' line='1454' column='1'/>
+          <var-decl name='battr' type-id='d83a2db1' visibility='default' filepath='kernel/module.c' line='1456' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='address' type-id='7359adad' visibility='default' filepath='kernel/module.c' line='1455' column='1'/>
+          <var-decl name='address' type-id='7359adad' visibility='default' filepath='kernel/module.c' line='1457' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='modversion_info' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/module.h' line='38' column='1' id='68a2869e'>
@@ -110109,8 +110325,8 @@
       <pointer-type-def type-id='9493d3c9' size-in-bits='64' id='eefd7061'/>
       <pointer-type-def type-id='68a2869e' size-in-bits='64' id='3a498c74'/>
       <pointer-type-def type-id='d2d812d1' size-in-bits='64' id='e525e121'/>
-      <function-decl name='__module_get' mangled-name='__module_get' filepath='kernel/module.c' line='1099' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__module_get'>
-        <parameter type-id='2730d015' name='module' filepath='kernel/module.c' line='1099' column='1'/>
+      <function-decl name='__module_get' mangled-name='__module_get' filepath='kernel/module.c' line='1101' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__module_get'>
+        <parameter type-id='2730d015' name='module' filepath='kernel/module.c' line='1101' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
       <function-decl name='module_layout' mangled-name='module_layout' filepath='kernel/module.c' line='4481' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='module_layout'>
@@ -113210,69 +113426,69 @@
           <var-decl name='name' type-id='80f4b756' visibility='default' filepath='drivers/base/power/power.h' line='34' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='workqueue_struct' size-in-bits='2560' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='237' column='1' id='a5159c01'>
+      <class-decl name='workqueue_struct' size-in-bits='2560' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='238' column='1' id='a5159c01'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='pwqs' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='238' column='1'/>
+          <var-decl name='pwqs' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='239' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='239' column='1'/>
+          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='240' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='mutex' type-id='925167dc' visibility='default' filepath='kernel/workqueue.c' line='241' column='1'/>
+          <var-decl name='mutex' type-id='925167dc' visibility='default' filepath='kernel/workqueue.c' line='242' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='512'>
-          <var-decl name='work_color' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='242' column='1'/>
+          <var-decl name='work_color' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='243' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='544'>
-          <var-decl name='flush_color' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='243' column='1'/>
+          <var-decl name='flush_color' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='244' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='nr_pwqs_to_flush' type-id='49178f86' visibility='default' filepath='kernel/workqueue.c' line='244' column='1'/>
+          <var-decl name='nr_pwqs_to_flush' type-id='49178f86' visibility='default' filepath='kernel/workqueue.c' line='245' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='640'>
-          <var-decl name='first_flusher' type-id='ec037527' visibility='default' filepath='kernel/workqueue.c' line='245' column='1'/>
+          <var-decl name='first_flusher' type-id='ec037527' visibility='default' filepath='kernel/workqueue.c' line='246' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='flusher_queue' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='246' column='1'/>
+          <var-decl name='flusher_queue' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='247' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='832'>
-          <var-decl name='flusher_overflow' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='247' column='1'/>
+          <var-decl name='flusher_overflow' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='248' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='960'>
-          <var-decl name='maydays' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='249' column='1'/>
+          <var-decl name='maydays' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='250' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1088'>
-          <var-decl name='rescuer' type-id='50a159c7' visibility='default' filepath='kernel/workqueue.c' line='250' column='1'/>
+          <var-decl name='rescuer' type-id='50a159c7' visibility='default' filepath='kernel/workqueue.c' line='251' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1152'>
-          <var-decl name='nr_drainers' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='252' column='1'/>
+          <var-decl name='nr_drainers' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='253' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1184'>
-          <var-decl name='saved_max_active' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='253' column='1'/>
+          <var-decl name='saved_max_active' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='254' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1216'>
-          <var-decl name='unbound_attrs' type-id='cfd15e7e' visibility='default' filepath='kernel/workqueue.c' line='255' column='1'/>
+          <var-decl name='unbound_attrs' type-id='cfd15e7e' visibility='default' filepath='kernel/workqueue.c' line='256' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1280'>
-          <var-decl name='dfl_pwq' type-id='a7a31b92' visibility='default' filepath='kernel/workqueue.c' line='256' column='1'/>
+          <var-decl name='dfl_pwq' type-id='a7a31b92' visibility='default' filepath='kernel/workqueue.c' line='257' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1344'>
-          <var-decl name='wq_dev' type-id='5cebc26e' visibility='default' filepath='kernel/workqueue.c' line='259' column='1'/>
+          <var-decl name='wq_dev' type-id='5cebc26e' visibility='default' filepath='kernel/workqueue.c' line='260' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1408'>
-          <var-decl name='name' type-id='6653bb13' visibility='default' filepath='kernel/workqueue.c' line='264' column='1'/>
+          <var-decl name='name' type-id='6653bb13' visibility='default' filepath='kernel/workqueue.c' line='265' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1600'>
-          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='kernel/workqueue.c' line='271' column='1'/>
+          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='kernel/workqueue.c' line='272' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2048'>
-          <var-decl name='flags' type-id='f0981eeb' visibility='default' filepath='kernel/workqueue.c' line='274' column='1'/>
+          <var-decl name='flags' type-id='f0981eeb' visibility='default' filepath='kernel/workqueue.c' line='275' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2112'>
-          <var-decl name='cpu_pwqs' type-id='a7a31b92' visibility='default' filepath='kernel/workqueue.c' line='275' column='1'/>
+          <var-decl name='cpu_pwqs' type-id='a7a31b92' visibility='default' filepath='kernel/workqueue.c' line='276' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='2176'>
-          <var-decl name='numa_pwq_tbl' type-id='55b5dc02' visibility='default' filepath='kernel/workqueue.c' line='276' column='1'/>
+          <var-decl name='numa_pwq_tbl' type-id='55b5dc02' visibility='default' filepath='kernel/workqueue.c' line='277' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='xattr_handler' size-in-bits='448' is-struct='yes' visibility='default' filepath='include/linux/xattr.h' line='28' column='1' id='2d3dd5e3'>
@@ -114814,14 +115030,6 @@
       </class-decl>
       <typedef-decl name='key_serial_t' type-id='3ff5601b' filepath='include/linux/key.h' line='33' column='1' id='c84025ab'/>
       <typedef-decl name='int32_t' type-id='a7832498' filepath='include/linux/types.h' line='103' column='1' id='3ff5601b'/>
-      <union-decl name='key_payload' size-in-bits='256' visibility='default' filepath='include/linux/key.h' line='94' column='1' id='2888d74a'>
-        <data-member access='public'>
-          <var-decl name='rcu_data0' type-id='eaa32e2f' visibility='default' filepath='include/linux/key.h' line='95' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='data' type-id='209ef23f' visibility='default' filepath='include/linux/key.h' line='96' column='1'/>
-        </data-member>
-      </union-decl>
       <union-decl name='__anonymous_union__3' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='158' column='1' id='1a65b0a7'>
         <data-member access='public'>
           <var-decl name='graveyard_link' type-id='72f469ec' visibility='default' filepath='include/linux/key.h' line='159' column='1'/>
@@ -114890,6 +115098,14 @@
           <var-decl name='nr_leaves_on_tree' type-id='7359adad' visibility='default' filepath='include/linux/assoc_array.h' line='28' column='1'/>
         </data-member>
       </class-decl>
+      <union-decl name='key_payload' size-in-bits='256' visibility='default' filepath='include/linux/key.h' line='94' column='1' id='2888d74a'>
+        <data-member access='public'>
+          <var-decl name='rcu_data0' type-id='eaa32e2f' visibility='default' filepath='include/linux/key.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='data' type-id='209ef23f' visibility='default' filepath='include/linux/key.h' line='96' column='1'/>
+        </data-member>
+      </union-decl>
       <class-decl name='key_restriction' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/key.h' line='136' column='1' id='fe81ecb9'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='check' type-id='f87a5fab' visibility='default' filepath='include/linux/key.h' line='137' column='1'/>
@@ -124345,15 +124561,15 @@
       <array-type-def dimensions='1' type-id='a7a31b92' size-in-bits='infinite' id='55b5dc02'>
         <subrange length='infinite' type-id='7ff19f0f' id='031f2035'/>
       </array-type-def>
-      <class-decl name='wq_flusher' size-in-bits='448' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='225' column='1' id='c8eb0f4f'>
+      <class-decl name='wq_flusher' size-in-bits='448' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='226' column='1' id='c8eb0f4f'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='226' column='1'/>
+          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='227' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='flush_color' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='227' column='1'/>
+          <var-decl name='flush_color' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='228' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='done' type-id='f9fef04f' visibility='default' filepath='kernel/workqueue.c' line='228' column='1'/>
+          <var-decl name='done' type-id='f9fef04f' visibility='default' filepath='kernel/workqueue.c' line='229' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='worker' size-in-bits='1152' is-struct='yes' visibility='default' filepath='kernel/workqueue_internal.h' line='24' column='1' id='146df21f'>
@@ -124408,113 +124624,113 @@
           <var-decl name='hentry' type-id='03a4a074' visibility='default' filepath='kernel/workqueue_internal.h' line='28' column='1'/>
         </data-member>
       </union-decl>
-      <class-decl name='pool_workqueue' size-in-bits='2048' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='198' column='1' id='b0355154'>
+      <class-decl name='pool_workqueue' size-in-bits='2048' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='199' column='1' id='b0355154'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='pool' type-id='1ce8c5e4' visibility='default' filepath='kernel/workqueue.c' line='199' column='1'/>
+          <var-decl name='pool' type-id='1ce8c5e4' visibility='default' filepath='kernel/workqueue.c' line='200' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='wq' type-id='242e3d19' visibility='default' filepath='kernel/workqueue.c' line='200' column='1'/>
+          <var-decl name='wq' type-id='242e3d19' visibility='default' filepath='kernel/workqueue.c' line='201' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='work_color' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='201' column='1'/>
+          <var-decl name='work_color' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='202' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='160'>
-          <var-decl name='flush_color' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='202' column='1'/>
+          <var-decl name='flush_color' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='203' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='refcnt' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='203' column='1'/>
+          <var-decl name='refcnt' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='204' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='224'>
-          <var-decl name='nr_in_flight' type-id='73c97830' visibility='default' filepath='kernel/workqueue.c' line='204' column='1'/>
+          <var-decl name='nr_in_flight' type-id='73c97830' visibility='default' filepath='kernel/workqueue.c' line='205' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='nr_active' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='206' column='1'/>
+          <var-decl name='nr_active' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='207' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='736'>
-          <var-decl name='max_active' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='207' column='1'/>
+          <var-decl name='max_active' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='208' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='768'>
-          <var-decl name='delayed_works' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='208' column='1'/>
+          <var-decl name='delayed_works' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='209' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='896'>
-          <var-decl name='pwqs_node' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='209' column='1'/>
+          <var-decl name='pwqs_node' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='210' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='mayday_node' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='210' column='1'/>
+          <var-decl name='mayday_node' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='211' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1152'>
-          <var-decl name='unbound_release_work' type-id='ef9025d0' visibility='default' filepath='kernel/workqueue.c' line='218' column='1'/>
+          <var-decl name='unbound_release_work' type-id='ef9025d0' visibility='default' filepath='kernel/workqueue.c' line='219' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1536'>
-          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='kernel/workqueue.c' line='219' column='1'/>
+          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='kernel/workqueue.c' line='220' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='worker_pool' size-in-bits='7168' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='146' column='1' id='19ea21fe'>
+      <class-decl name='worker_pool' size-in-bits='7168' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='147' column='1' id='19ea21fe'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='kernel/workqueue.c' line='147' column='1'/>
+          <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='kernel/workqueue.c' line='148' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='cpu' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='148' column='1'/>
+          <var-decl name='cpu' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='149' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='node' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='149' column='1'/>
+          <var-decl name='node' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='150' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='id' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='150' column='1'/>
+          <var-decl name='id' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='151' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='flags' type-id='f0981eeb' visibility='default' filepath='kernel/workqueue.c' line='151' column='1'/>
+          <var-decl name='flags' type-id='f0981eeb' visibility='default' filepath='kernel/workqueue.c' line='152' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='192'>
-          <var-decl name='watchdog_ts' type-id='7359adad' visibility='default' filepath='kernel/workqueue.c' line='153' column='1'/>
+          <var-decl name='watchdog_ts' type-id='7359adad' visibility='default' filepath='kernel/workqueue.c' line='154' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='256'>
-          <var-decl name='worklist' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='155' column='1'/>
+          <var-decl name='worklist' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='156' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='384'>
-          <var-decl name='nr_workers' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='157' column='1'/>
+          <var-decl name='nr_workers' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='158' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='416'>
-          <var-decl name='nr_idle' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='158' column='1'/>
+          <var-decl name='nr_idle' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='159' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='448'>
-          <var-decl name='idle_list' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='160' column='1'/>
+          <var-decl name='idle_list' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='161' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='576'>
-          <var-decl name='idle_timer' type-id='abe41e67' visibility='default' filepath='kernel/workqueue.c' line='161' column='1'/>
+          <var-decl name='idle_timer' type-id='abe41e67' visibility='default' filepath='kernel/workqueue.c' line='162' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1024'>
-          <var-decl name='mayday_timer' type-id='abe41e67' visibility='default' filepath='kernel/workqueue.c' line='162' column='1'/>
+          <var-decl name='mayday_timer' type-id='abe41e67' visibility='default' filepath='kernel/workqueue.c' line='163' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='1472'>
-          <var-decl name='busy_hash' type-id='53b70d6c' visibility='default' filepath='kernel/workqueue.c' line='165' column='1'/>
+          <var-decl name='busy_hash' type-id='53b70d6c' visibility='default' filepath='kernel/workqueue.c' line='166' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5568'>
-          <var-decl name='manager' type-id='50a159c7' visibility='default' filepath='kernel/workqueue.c' line='168' column='1'/>
+          <var-decl name='manager' type-id='50a159c7' visibility='default' filepath='kernel/workqueue.c' line='169' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5632'>
-          <var-decl name='workers' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='169' column='1'/>
+          <var-decl name='workers' type-id='72f469ec' visibility='default' filepath='kernel/workqueue.c' line='170' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5760'>
-          <var-decl name='detach_completion' type-id='389faaf7' visibility='default' filepath='kernel/workqueue.c' line='170' column='1'/>
+          <var-decl name='detach_completion' type-id='389faaf7' visibility='default' filepath='kernel/workqueue.c' line='171' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5824'>
-          <var-decl name='worker_ida' type-id='46ce60fb' visibility='default' filepath='kernel/workqueue.c' line='172' column='1'/>
+          <var-decl name='worker_ida' type-id='46ce60fb' visibility='default' filepath='kernel/workqueue.c' line='173' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='5952'>
-          <var-decl name='attrs' type-id='cfd15e7e' visibility='default' filepath='kernel/workqueue.c' line='174' column='1'/>
+          <var-decl name='attrs' type-id='cfd15e7e' visibility='default' filepath='kernel/workqueue.c' line='175' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6016'>
-          <var-decl name='hash_node' type-id='03a4a074' visibility='default' filepath='kernel/workqueue.c' line='175' column='1'/>
+          <var-decl name='hash_node' type-id='03a4a074' visibility='default' filepath='kernel/workqueue.c' line='176' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6144'>
-          <var-decl name='refcnt' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='176' column='1'/>
+          <var-decl name='refcnt' type-id='95e97e5e' visibility='default' filepath='kernel/workqueue.c' line='177' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6656'>
-          <var-decl name='nr_running' type-id='49178f86' visibility='default' filepath='kernel/workqueue.c' line='183' column='1'/>
+          <var-decl name='nr_running' type-id='49178f86' visibility='default' filepath='kernel/workqueue.c' line='184' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='6720'>
-          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='kernel/workqueue.c' line='189' column='1'/>
+          <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='kernel/workqueue.c' line='190' column='1'/>
         </data-member>
       </class-decl>
       <class-decl name='workqueue_attrs' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/linux/workqueue.h' line='143' column='1' id='2fe6f208'>
@@ -124528,12 +124744,12 @@
           <var-decl name='no_numa' type-id='b50a4934' visibility='default' filepath='include/linux/workqueue.h' line='161' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='wq_device' size-in-bits='7680' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='5191' column='1' id='a88ecfc8'>
+      <class-decl name='wq_device' size-in-bits='7680' is-struct='yes' visibility='default' filepath='kernel/workqueue.c' line='5192' column='1' id='a88ecfc8'>
         <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='wq' type-id='242e3d19' visibility='default' filepath='kernel/workqueue.c' line='5192' column='1'/>
+          <var-decl name='wq' type-id='242e3d19' visibility='default' filepath='kernel/workqueue.c' line='5193' column='1'/>
         </data-member>
         <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='dev' type-id='66e487eb' visibility='default' filepath='kernel/workqueue.c' line='5193' column='1'/>
+          <var-decl name='dev' type-id='66e487eb' visibility='default' filepath='kernel/workqueue.c' line='5194' column='1'/>
         </data-member>
       </class-decl>
       <pointer-type-def type-id='b0355154' size-in-bits='64' id='a7a31b92'/>
@@ -124542,30 +124758,30 @@
       <pointer-type-def type-id='2fe6f208' size-in-bits='64' id='cfd15e7e'/>
       <pointer-type-def type-id='a88ecfc8' size-in-bits='64' id='5cebc26e'/>
       <pointer-type-def type-id='c8eb0f4f' size-in-bits='64' id='ec037527'/>
-      <function-decl name='__alloc_workqueue_key' mangled-name='__alloc_workqueue_key' filepath='kernel/workqueue.c' line='4087' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__alloc_workqueue_key'>
-        <parameter type-id='80f4b756' name='fmt' filepath='kernel/workqueue.c' line='4087' column='1'/>
-        <parameter type-id='f0981eeb' name='flags' filepath='kernel/workqueue.c' line='4088' column='1'/>
-        <parameter type-id='95e97e5e' name='max_active' filepath='kernel/workqueue.c' line='4089' column='1'/>
-        <parameter type-id='a57283f9' name='key' filepath='kernel/workqueue.c' line='4090' column='1'/>
-        <parameter type-id='80f4b756' name='lock_name' filepath='kernel/workqueue.c' line='4091' column='1'/>
+      <function-decl name='__alloc_workqueue_key' mangled-name='__alloc_workqueue_key' filepath='kernel/workqueue.c' line='4088' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__alloc_workqueue_key'>
+        <parameter type-id='80f4b756' name='fmt' filepath='kernel/workqueue.c' line='4088' column='1'/>
+        <parameter type-id='f0981eeb' name='flags' filepath='kernel/workqueue.c' line='4089' column='1'/>
+        <parameter type-id='95e97e5e' name='max_active' filepath='kernel/workqueue.c' line='4090' column='1'/>
+        <parameter type-id='a57283f9' name='key' filepath='kernel/workqueue.c' line='4091' column='1'/>
+        <parameter type-id='80f4b756' name='lock_name' filepath='kernel/workqueue.c' line='4092' column='1'/>
         <parameter is-variadic='yes'/>
         <return type-id='242e3d19'/>
       </function-decl>
-      <var-decl name='system_wq' type-id='242e3d19' mangled-name='system_wq' visibility='default' filepath='kernel/workqueue.c' line='338' column='1' elf-symbol-id='system_wq'/>
-      <var-decl name='system_highpri_wq' type-id='242e3d19' mangled-name='system_highpri_wq' visibility='default' filepath='kernel/workqueue.c' line='340' column='1' elf-symbol-id='system_highpri_wq'/>
-      <var-decl name='system_long_wq' type-id='242e3d19' mangled-name='system_long_wq' visibility='default' filepath='kernel/workqueue.c' line='342' column='1' elf-symbol-id='system_long_wq'/>
-      <var-decl name='system_unbound_wq' type-id='242e3d19' mangled-name='system_unbound_wq' visibility='default' filepath='kernel/workqueue.c' line='344' column='1' elf-symbol-id='system_unbound_wq'/>
-      <var-decl name='system_freezable_wq' type-id='242e3d19' mangled-name='system_freezable_wq' visibility='default' filepath='kernel/workqueue.c' line='346' column='1' elf-symbol-id='system_freezable_wq'/>
-      <function-decl name='delayed_work_timer_fn' mangled-name='delayed_work_timer_fn' filepath='kernel/workqueue.c' line='1517' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='delayed_work_timer_fn'>
-        <parameter type-id='9248e67f' name='t' filepath='kernel/workqueue.c' line='1517' column='1'/>
+      <var-decl name='system_wq' type-id='242e3d19' mangled-name='system_wq' visibility='default' filepath='kernel/workqueue.c' line='339' column='1' elf-symbol-id='system_wq'/>
+      <var-decl name='system_highpri_wq' type-id='242e3d19' mangled-name='system_highpri_wq' visibility='default' filepath='kernel/workqueue.c' line='341' column='1' elf-symbol-id='system_highpri_wq'/>
+      <var-decl name='system_long_wq' type-id='242e3d19' mangled-name='system_long_wq' visibility='default' filepath='kernel/workqueue.c' line='343' column='1' elf-symbol-id='system_long_wq'/>
+      <var-decl name='system_unbound_wq' type-id='242e3d19' mangled-name='system_unbound_wq' visibility='default' filepath='kernel/workqueue.c' line='345' column='1' elf-symbol-id='system_unbound_wq'/>
+      <var-decl name='system_freezable_wq' type-id='242e3d19' mangled-name='system_freezable_wq' visibility='default' filepath='kernel/workqueue.c' line='347' column='1' elf-symbol-id='system_freezable_wq'/>
+      <function-decl name='delayed_work_timer_fn' mangled-name='delayed_work_timer_fn' filepath='kernel/workqueue.c' line='1518' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='delayed_work_timer_fn'>
+        <parameter type-id='9248e67f' name='t' filepath='kernel/workqueue.c' line='1518' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='flush_workqueue' mangled-name='flush_workqueue' filepath='kernel/workqueue.c' line='2673' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='flush_workqueue'>
-        <parameter type-id='242e3d19' name='wq' filepath='kernel/workqueue.c' line='2673' column='1'/>
+      <function-decl name='flush_workqueue' mangled-name='flush_workqueue' filepath='kernel/workqueue.c' line='2674' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='flush_workqueue'>
+        <parameter type-id='242e3d19' name='wq' filepath='kernel/workqueue.c' line='2674' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='drain_workqueue' mangled-name='drain_workqueue' filepath='kernel/workqueue.c' line='2835' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drain_workqueue'>
-        <parameter type-id='242e3d19' name='wq' filepath='kernel/workqueue.c' line='2835' column='1'/>
+      <function-decl name='drain_workqueue' mangled-name='drain_workqueue' filepath='kernel/workqueue.c' line='2836' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drain_workqueue'>
+        <parameter type-id='242e3d19' name='wq' filepath='kernel/workqueue.c' line='2836' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
       <function-decl name='prepare_to_wait_exclusive' mangled-name='prepare_to_wait_exclusive' filepath='include/linux/wait.h' line='1112' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='prepare_to_wait_exclusive'>
@@ -124574,12 +124790,12 @@
         <parameter type-id='95e97e5e'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='flush_delayed_work' mangled-name='flush_delayed_work' filepath='kernel/workqueue.c' line='3089' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='flush_delayed_work'>
-        <parameter type-id='1a7ee447' name='dwork' filepath='kernel/workqueue.c' line='3089' column='1'/>
+      <function-decl name='flush_delayed_work' mangled-name='flush_delayed_work' filepath='kernel/workqueue.c' line='3090' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='flush_delayed_work'>
+        <parameter type-id='1a7ee447' name='dwork' filepath='kernel/workqueue.c' line='3090' column='1'/>
         <return type-id='b50a4934'/>
       </function-decl>
-      <function-decl name='cancel_delayed_work' mangled-name='cancel_delayed_work' filepath='kernel/workqueue.c' line='3152' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cancel_delayed_work'>
-        <parameter type-id='1a7ee447' name='dwork' filepath='kernel/workqueue.c' line='3152' column='1'/>
+      <function-decl name='cancel_delayed_work' mangled-name='cancel_delayed_work' filepath='kernel/workqueue.c' line='3153' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cancel_delayed_work'>
+        <parameter type-id='1a7ee447' name='dwork' filepath='kernel/workqueue.c' line='3153' column='1'/>
         <return type-id='b50a4934'/>
       </function-decl>
       <function-decl name='device_unregister' mangled-name='device_unregister' filepath='include/linux/device.h' line='1301' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='device_unregister'>
@@ -124832,9 +125048,9 @@
       <var-decl name='kobj_sysfs_ops' type-id='0f840455' mangled-name='kobj_sysfs_ops' visibility='default' filepath='lib/kobject.c' line='815' column='1' elf-symbol-id='kobj_sysfs_ops'/>
     </abi-instr>
     <abi-instr address-size='64' path='lib/kobject_uevent.c' language='LANG_C89'>
-      <function-decl name='kobject_uevent' mangled-name='kobject_uevent' filepath='lib/kobject_uevent.c' line='637' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kobject_uevent'>
-        <parameter type-id='d30bdc51' name='kobj' filepath='lib/kobject_uevent.c' line='637' column='1'/>
-        <parameter type-id='7d635811' name='action' filepath='lib/kobject_uevent.c' line='637' column='1'/>
+      <function-decl name='kobject_uevent' mangled-name='kobject_uevent' filepath='lib/kobject_uevent.c' line='638' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='kobject_uevent'>
+        <parameter type-id='d30bdc51' name='kobj' filepath='lib/kobject_uevent.c' line='638' column='1'/>
+        <parameter type-id='7d635811' name='action' filepath='lib/kobject_uevent.c' line='638' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <enum-decl name='kobject_action' filepath='include/linux/kobject.h' line='54' column='1' id='7d635811'>
@@ -126122,6 +126338,28 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='net/bluetooth/hci_core.c' language='LANG_C89'>
+      <array-type-def dimensions='1' type-id='8f048e17' size-in-bits='80' id='979253d9'>
+        <subrange length='10' type-id='7ff19f0f' id='487da03a'/>
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='8f048e17' size-in-bits='1920' id='51e647b2'>
+        <subrange length='240' type-id='7ff19f0f' id='065c4623'/>
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='8f048e17' size-in-bits='1984' id='51d2bffa'>
+        <subrange length='248' type-id='7ff19f0f' id='c670fc1b'/>
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='8f048e17' size-in-bits='248' id='be65fec6'>
+        <subrange length='31' type-id='7ff19f0f' id='ae5e1d19'/>
+      </array-type-def>
+      <array-type-def dimensions='2' type-id='8f048e17' size-in-bits='192' id='7f89db3f'>
+        <subrange length='3' type-id='7ff19f0f' id='56f209d2'/>
+        <subrange length='8' type-id='7ff19f0f' id='56e0c0b1'/>
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='8f048e17' size-in-bits='5376' id='2731130d'>
+        <subrange length='672' type-id='7ff19f0f' id='f11ba364'/>
+      </array-type-def>
+      <array-type-def dimensions='1' type-id='8f048e17' size-in-bits='64' id='0209ab38'>
+        <subrange length='8' type-id='7ff19f0f' id='56e0c0b1'/>
+      </array-type-def>
       <class-decl name='rfkill' size-in-bits='10560' is-struct='yes' visibility='default' filepath='net/rfkill/core.c' line='49' column='1' id='6b60ef45'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='lock' type-id='fb4018a0' visibility='default' filepath='net/rfkill/core.c' line='50' column='1'/>
@@ -126178,6 +126416,720 @@
           <var-decl name='name' type-id='e84913bd' visibility='default' filepath='net/rfkill/core.c' line='77' column='1'/>
         </data-member>
       </class-decl>
+      <array-type-def dimensions='1' type-id='f9b06939' size-in-bits='248' id='23e37060'>
+        <subrange length='31' type-id='7ff19f0f' id='ae5e1d19'/>
+      </array-type-def>
+      <class-decl name='hci_dev' size-in-bits='40128' is-struct='yes' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='205' column='1' id='c4e92edf'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='206' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='lock' type-id='925167dc' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='207' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='384'>
+          <var-decl name='name' type-id='8e100159' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='209' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='flags' type-id='7359adad' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='210' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='512'>
+          <var-decl name='id' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='211' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='528'>
+          <var-decl name='bus' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='212' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='536'>
+          <var-decl name='dev_type' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='213' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='bdaddr' type-id='c2840192' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='214' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='592'>
+          <var-decl name='setup_addr' type-id='c2840192' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='215' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='640'>
+          <var-decl name='public_addr' type-id='c2840192' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='216' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='688'>
+          <var-decl name='random_addr' type-id='c2840192' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='217' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='static_addr' type-id='c2840192' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='218' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='784'>
+          <var-decl name='adv_addr_type' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='219' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='792'>
+          <var-decl name='dev_name' type-id='51d2bffa' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='220' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2776'>
+          <var-decl name='short_name' type-id='979253d9' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='221' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='2856'>
+          <var-decl name='eir' type-id='51e647b2' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='222' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4784'>
+          <var-decl name='appearance' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='223' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4800'>
+          <var-decl name='dev_class' type-id='c216126b' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='224' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4824'>
+          <var-decl name='major_class' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='225' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4832'>
+          <var-decl name='minor_class' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='226' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4840'>
+          <var-decl name='max_page' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='227' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='4848'>
+          <var-decl name='features' type-id='7f89db3f' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='228' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5040'>
+          <var-decl name='le_features' type-id='0209ab38' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='229' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5104'>
+          <var-decl name='le_white_list_size' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='230' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5112'>
+          <var-decl name='le_resolv_list_size' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='231' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5120'>
+          <var-decl name='le_num_of_adv_sets' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='232' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5128'>
+          <var-decl name='le_states' type-id='0209ab38' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='233' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5192'>
+          <var-decl name='commands' type-id='73b95420' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='234' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5704'>
+          <var-decl name='hci_ver' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='235' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5712'>
+          <var-decl name='hci_rev' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='236' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5728'>
+          <var-decl name='lmp_ver' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='237' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5744'>
+          <var-decl name='manufacturer' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='238' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5760'>
+          <var-decl name='lmp_subver' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='239' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5776'>
+          <var-decl name='voice_setting' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='240' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5792'>
+          <var-decl name='num_iac' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='241' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5800'>
+          <var-decl name='stored_max_keys' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='242' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5808'>
+          <var-decl name='stored_num_keys' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='243' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5816'>
+          <var-decl name='io_capability' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='244' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5824'>
+          <var-decl name='inq_tx_power' type-id='8af57d41' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='245' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5840'>
+          <var-decl name='page_scan_interval' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='246' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5856'>
+          <var-decl name='page_scan_window' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='247' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5872'>
+          <var-decl name='page_scan_type' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='248' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5880'>
+          <var-decl name='le_adv_channel_map' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='249' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5888'>
+          <var-decl name='le_adv_min_interval' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='250' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5904'>
+          <var-decl name='le_adv_max_interval' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='251' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5920'>
+          <var-decl name='le_scan_type' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='252' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5936'>
+          <var-decl name='le_scan_interval' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='253' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5952'>
+          <var-decl name='le_scan_window' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='254' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5968'>
+          <var-decl name='le_conn_min_interval' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='255' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='5984'>
+          <var-decl name='le_conn_max_interval' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='256' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6000'>
+          <var-decl name='le_conn_latency' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='257' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6016'>
+          <var-decl name='le_supv_timeout' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='258' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6032'>
+          <var-decl name='le_def_tx_len' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='259' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6048'>
+          <var-decl name='le_def_tx_time' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='260' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6064'>
+          <var-decl name='le_max_tx_len' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='261' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6080'>
+          <var-decl name='le_max_tx_time' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='262' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6096'>
+          <var-decl name='le_max_rx_len' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='263' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6112'>
+          <var-decl name='le_max_rx_time' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='264' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6128'>
+          <var-decl name='le_max_key_size' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='265' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6136'>
+          <var-decl name='le_min_key_size' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='266' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6144'>
+          <var-decl name='discov_interleaved_timeout' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='267' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6160'>
+          <var-decl name='conn_info_min_age' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='268' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6176'>
+          <var-decl name='conn_info_max_age' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='269' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6192'>
+          <var-decl name='ssp_debug_mode' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='270' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6200'>
+          <var-decl name='hw_error_code' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='271' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6208'>
+          <var-decl name='clock' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='272' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6240'>
+          <var-decl name='devid_source' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='274' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6256'>
+          <var-decl name='devid_vendor' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='275' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6272'>
+          <var-decl name='devid_product' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='276' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6288'>
+          <var-decl name='devid_version' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='277' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6304'>
+          <var-decl name='pkt_type' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='279' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6320'>
+          <var-decl name='esco_type' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='280' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6336'>
+          <var-decl name='link_policy' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='281' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6352'>
+          <var-decl name='link_mode' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='282' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6368'>
+          <var-decl name='idle_timeout' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='284' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6400'>
+          <var-decl name='sniff_min_interval' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='285' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6416'>
+          <var-decl name='sniff_max_interval' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='286' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6432'>
+          <var-decl name='amp_status' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='288' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6464'>
+          <var-decl name='amp_total_bw' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='289' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6496'>
+          <var-decl name='amp_max_bw' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='290' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6528'>
+          <var-decl name='amp_min_latency' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='291' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6560'>
+          <var-decl name='amp_max_pdu' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='292' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6592'>
+          <var-decl name='amp_type' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='293' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6608'>
+          <var-decl name='amp_pal_cap' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='294' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6624'>
+          <var-decl name='amp_assoc_size' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='295' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6656'>
+          <var-decl name='amp_max_flush_to' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='296' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6688'>
+          <var-decl name='amp_be_flush_to' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='297' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='6720'>
+          <var-decl name='loc_assoc' type-id='36e902a9' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='299' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12160'>
+          <var-decl name='flow_ctl_mode' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='301' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12192'>
+          <var-decl name='auto_accept_delay' type-id='f0981eeb' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='303' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12224'>
+          <var-decl name='quirks' type-id='7359adad' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='305' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12288'>
+          <var-decl name='cmd_cnt' type-id='49178f86' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='307' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12320'>
+          <var-decl name='acl_cnt' type-id='f0981eeb' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='308' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12352'>
+          <var-decl name='sco_cnt' type-id='f0981eeb' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='309' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12384'>
+          <var-decl name='le_cnt' type-id='f0981eeb' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='310' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12416'>
+          <var-decl name='acl_mtu' type-id='f0981eeb' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='312' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12448'>
+          <var-decl name='sco_mtu' type-id='f0981eeb' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='313' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12480'>
+          <var-decl name='le_mtu' type-id='f0981eeb' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='314' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12512'>
+          <var-decl name='acl_pkts' type-id='f0981eeb' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='315' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12544'>
+          <var-decl name='sco_pkts' type-id='f0981eeb' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='316' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12576'>
+          <var-decl name='le_pkts' type-id='f0981eeb' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='317' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12608'>
+          <var-decl name='block_len' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='319' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12624'>
+          <var-decl name='block_mtu' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='320' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12640'>
+          <var-decl name='num_blocks' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='321' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12656'>
+          <var-decl name='block_cnt' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='322' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12672'>
+          <var-decl name='acl_last_tx' type-id='7359adad' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='324' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12736'>
+          <var-decl name='sco_last_tx' type-id='7359adad' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='325' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12800'>
+          <var-decl name='le_last_tx' type-id='7359adad' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='326' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12864'>
+          <var-decl name='le_tx_def_phys' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='328' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12872'>
+          <var-decl name='le_rx_def_phys' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='329' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12928'>
+          <var-decl name='workqueue' type-id='242e3d19' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='331' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='12992'>
+          <var-decl name='req_workqueue' type-id='242e3d19' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='332' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13056'>
+          <var-decl name='power_on' type-id='ef9025d0' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='334' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='13440'>
+          <var-decl name='power_off' type-id='5ad6e0ef' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='335' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14528'>
+          <var-decl name='error_reset' type-id='ef9025d0' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='336' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14912'>
+          <var-decl name='discov_timeout' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='338' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='14976'>
+          <var-decl name='discov_off' type-id='5ad6e0ef' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='339' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16064'>
+          <var-decl name='service_cache' type-id='5ad6e0ef' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='341' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='17152'>
+          <var-decl name='cmd_timer' type-id='5ad6e0ef' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='343' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18240'>
+          <var-decl name='rx_work' type-id='ef9025d0' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='345' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='18624'>
+          <var-decl name='cmd_work' type-id='ef9025d0' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='346' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19008'>
+          <var-decl name='tx_work' type-id='ef9025d0' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='347' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19392'>
+          <var-decl name='discov_update' type-id='ef9025d0' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='349' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='19776'>
+          <var-decl name='bg_scan_update' type-id='ef9025d0' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='350' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='20160'>
+          <var-decl name='scan_update' type-id='ef9025d0' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='351' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='20544'>
+          <var-decl name='connectable_update' type-id='ef9025d0' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='352' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='20928'>
+          <var-decl name='discoverable_update' type-id='ef9025d0' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='353' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='21312'>
+          <var-decl name='le_scan_disable' type-id='5ad6e0ef' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='354' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='22400'>
+          <var-decl name='le_scan_restart' type-id='5ad6e0ef' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='355' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='23488'>
+          <var-decl name='rx_q' type-id='e61c85d0' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='357' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='23680'>
+          <var-decl name='raw_q' type-id='e61c85d0' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='358' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='23872'>
+          <var-decl name='cmd_q' type-id='e61c85d0' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='359' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24064'>
+          <var-decl name='sent_cmd' type-id='0fbf3cfd' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='361' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24128'>
+          <var-decl name='req_lock' type-id='925167dc' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='363' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24384'>
+          <var-decl name='req_wait_q' type-id='b5ab048f' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='364' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24576'>
+          <var-decl name='req_status' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='365' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24608'>
+          <var-decl name='req_result' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='366' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24640'>
+          <var-decl name='req_skb' type-id='0fbf3cfd' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='367' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24704'>
+          <var-decl name='smp_data' type-id='eaa32e2f' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='369' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24768'>
+          <var-decl name='smp_bredr_data' type-id='eaa32e2f' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='370' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24832'>
+          <var-decl name='discovery' type-id='f98a45fb' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='372' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='25920'>
+          <var-decl name='conn_hash' type-id='f39496ab' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='373' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='26240'>
+          <var-decl name='mgmt_pending' type-id='72f469ec' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='375' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='26368'>
+          <var-decl name='blacklist' type-id='72f469ec' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='376' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='26496'>
+          <var-decl name='whitelist' type-id='72f469ec' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='377' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='26624'>
+          <var-decl name='uuids' type-id='72f469ec' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='378' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='26752'>
+          <var-decl name='link_keys' type-id='72f469ec' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='379' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='26880'>
+          <var-decl name='long_term_keys' type-id='72f469ec' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='380' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27008'>
+          <var-decl name='identity_resolving_keys' type-id='72f469ec' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='381' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27136'>
+          <var-decl name='remote_oob_data' type-id='72f469ec' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='382' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27264'>
+          <var-decl name='le_white_list' type-id='72f469ec' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='383' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27392'>
+          <var-decl name='le_resolv_list' type-id='72f469ec' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='384' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27520'>
+          <var-decl name='le_conn_params' type-id='72f469ec' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='385' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27648'>
+          <var-decl name='pend_le_conns' type-id='72f469ec' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='386' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27776'>
+          <var-decl name='pend_le_reports' type-id='72f469ec' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='387' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='27904'>
+          <var-decl name='stat' type-id='2f3316f3' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='389' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='28224'>
+          <var-decl name='promisc' type-id='49178f86' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='391' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='28288'>
+          <var-decl name='hw_info' type-id='80f4b756' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='393' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='28352'>
+          <var-decl name='fw_info' type-id='80f4b756' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='394' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='28416'>
+          <var-decl name='debugfs' type-id='27675065' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='395' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='28480'>
+          <var-decl name='dev' type-id='66e487eb' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='397' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='36096'>
+          <var-decl name='rfkill' type-id='c5b94c75' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='399' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='36160'>
+          <var-decl name='dev_flags' type-id='f066dd3c' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='401' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='36224'>
+          <var-decl name='adv_tx_power' type-id='8af57d41' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='403' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='36232'>
+          <var-decl name='adv_data' type-id='be65fec6' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='404' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='36480'>
+          <var-decl name='adv_data_len' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='405' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='36488'>
+          <var-decl name='scan_rsp_data' type-id='be65fec6' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='406' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='36736'>
+          <var-decl name='scan_rsp_data_len' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='407' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='36800'>
+          <var-decl name='adv_instances' type-id='72f469ec' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='409' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='36928'>
+          <var-decl name='adv_instance_cnt' type-id='f0981eeb' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='410' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='36960'>
+          <var-decl name='cur_adv_instance' type-id='8f048e17' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='411' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='36976'>
+          <var-decl name='adv_instance_timeout' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='412' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='36992'>
+          <var-decl name='adv_instance_expire' type-id='5ad6e0ef' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='413' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='38080'>
+          <var-decl name='irk' type-id='9396cabb' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='415' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='38208'>
+          <var-decl name='rpa_timeout' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='416' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='38272'>
+          <var-decl name='rpa_expired' type-id='5ad6e0ef' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='417' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='39360'>
+          <var-decl name='rpa' type-id='c2840192' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='418' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='39424'>
+          <var-decl name='open' type-id='65ee7b03' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='424' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='39488'>
+          <var-decl name='close' type-id='65ee7b03' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='425' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='39552'>
+          <var-decl name='flush' type-id='65ee7b03' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='426' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='39616'>
+          <var-decl name='setup' type-id='65ee7b03' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='427' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='39680'>
+          <var-decl name='shutdown' type-id='65ee7b03' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='428' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='39744'>
+          <var-decl name='send' type-id='9e036c13' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='429' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='39808'>
+          <var-decl name='notify' type-id='ba77b4f4' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='430' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='39872'>
+          <var-decl name='hw_error' type-id='c0a08bbe' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='431' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='39936'>
+          <var-decl name='post_init' type-id='65ee7b03' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='432' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40000'>
+          <var-decl name='set_diag' type-id='100f2106' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='433' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40064'>
+          <var-decl name='set_bdaddr' type-id='156888c8' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='434' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='bdaddr_t' type-id='535be081' filepath='include/net/bluetooth/bluetooth.h' line='196' column='1' id='c2840192'/>
+      <class-decl name='__anonymous_struct__' size-in-bits='48' is-struct='yes' is-anonymous='yes' naming-typedef-id='c2840192' visibility='default' filepath='include/net/bluetooth/bluetooth.h' line='194' column='1' id='535be081'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='b' type-id='c60dc9f2' visibility='default' filepath='include/net/bluetooth/bluetooth.h' line='195' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='amp_assoc' size-in-bits='5440' is-struct='yes' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='195' column='1' id='36e902a9'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='len' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='196' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='offset' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='197' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='rem_len' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='198' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='len_so_far' type-id='d315442e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='199' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='data' type-id='2731130d' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='200' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='discovery_state' size-in-bits='1088' is-struct='yes' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='62' column='1' id='f98a45fb'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='type' type-id='95e97e5e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='state' type-id='08f5ca26' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='70' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='all' type-id='72f469ec' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='71' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='unknown' type-id='72f469ec' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='72' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='320'>
+          <var-decl name='resolve' type-id='72f469ec' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='73' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='448'>
+          <var-decl name='timestamp' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='74' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='480'>
+          <var-decl name='last_adv_addr' type-id='c2840192' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='75' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='528'>
+          <var-decl name='last_adv_addr_type' type-id='f9b06939' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='76' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='536'>
+          <var-decl name='last_adv_rssi' type-id='fdbf7a0f' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='77' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='544'>
+          <var-decl name='last_adv_flags' type-id='19c2251e' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='78' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='576'>
+          <var-decl name='last_adv_data' type-id='23e37060' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='79' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='824'>
+          <var-decl name='last_adv_data_len' type-id='f9b06939' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='80' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='832'>
+          <var-decl name='report_invalid_rssi' type-id='b50a4934' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='81' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='840'>
+          <var-decl name='result_filtering' type-id='b50a4934' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='82' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='848'>
+          <var-decl name='limited' type-id='b50a4934' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='83' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='856'>
+          <var-decl name='rssi' type-id='fdbf7a0f' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='84' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='864'>
+          <var-decl name='uuid_count' type-id='1dc6a898' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='85' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='896'>
+          <var-decl name='uuids' type-id='e5ee094d' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='86' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='960'>
+          <var-decl name='scan_start' type-id='7359adad' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='87' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='1024'>
+          <var-decl name='scan_duration' type-id='7359adad' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='88' column='1'/>
+        </data-member>
+      </class-decl>
+      <enum-decl name='__anonymous_enum__' is-anonymous='yes' filepath='include/net/bluetooth/hci_core.h' line='64' column='1' id='08f5ca26'>
+        <underlying-type type-id='9cac1fee'/>
+        <enumerator name='DISCOVERY_STOPPED' value='0'/>
+        <enumerator name='DISCOVERY_STARTING' value='1'/>
+        <enumerator name='DISCOVERY_FINDING' value='2'/>
+        <enumerator name='DISCOVERY_RESOLVING' value='3'/>
+        <enumerator name='DISCOVERY_STOPPING' value='4'/>
+      </enum-decl>
+      <class-decl name='hci_conn_hash' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='91' column='1' id='f39496ab'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='list' type-id='72f469ec' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='92' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='acl_num' type-id='f0981eeb' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='93' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='amp_num' type-id='f0981eeb' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='94' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='sco_num' type-id='f0981eeb' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='95' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='le_num' type-id='f0981eeb' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='le_num_slave' type-id='f0981eeb' visibility='default' filepath='include/net/bluetooth/hci_core.h' line='97' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='hci_dev_stats' size-in-bits='320' is-struct='yes' visibility='default' filepath='include/net/bluetooth/hci_sock.h' line='95' column='1' id='2f3316f3'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='err_rx' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_sock.h' line='96' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='err_tx' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_sock.h' line='97' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='cmd_tx' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_sock.h' line='98' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='evt_rx' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_sock.h' line='99' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='acl_tx' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_sock.h' line='100' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='160'>
+          <var-decl name='acl_rx' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_sock.h' line='101' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='192'>
+          <var-decl name='sco_tx' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_sock.h' line='102' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='sco_rx' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_sock.h' line='103' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='256'>
+          <var-decl name='byte_rx' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_sock.h' line='104' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='288'>
+          <var-decl name='byte_tx' type-id='3f1a6b60' visibility='default' filepath='include/net/bluetooth/hci_sock.h' line='105' column='1'/>
+        </data-member>
+      </class-decl>
       <enum-decl name='rfkill_type' filepath='include/uapi/linux/rfkill.h' line='43' column='1' id='6bac1cb5'>
         <underlying-type type-id='9cac1fee'/>
         <enumerator name='RFKILL_TYPE_ALL' value='0'/>
@@ -126202,11 +127154,37 @@
           <var-decl name='set_block' type-id='f08d4e50' visibility='default' filepath='include/linux/rfkill.h' line='64' column='1'/>
         </data-member>
       </class-decl>
+      <qualified-type-def type-id='c2840192' const='yes' id='89990402'/>
+      <pointer-type-def type-id='89990402' size-in-bits='64' id='c3e18af8'/>
       <qualified-type-def type-id='1e4ae69e' const='yes' id='5433b7f7'/>
       <pointer-type-def type-id='5433b7f7' size-in-bits='64' id='6a6a70e7'/>
+      <pointer-type-def type-id='c4e92edf' size-in-bits='64' id='9ad862e7'/>
+      <pointer-type-def type-id='d7322b1f' size-in-bits='64' id='65ee7b03'/>
+      <pointer-type-def type-id='61a50456' size-in-bits='64' id='156888c8'/>
+      <pointer-type-def type-id='73adb477' size-in-bits='64' id='9e036c13'/>
+      <pointer-type-def type-id='bd4974e4' size-in-bits='64' id='100f2106'/>
       <pointer-type-def type-id='b69e3ec6' size-in-bits='64' id='f08d4e50'/>
       <pointer-type-def type-id='6b60ef45' size-in-bits='64' id='c5b94c75'/>
+      <pointer-type-def type-id='0d8415b5' size-in-bits='64' id='e5ee094d'/>
+      <pointer-type-def type-id='1ca1bfac' size-in-bits='64' id='c0a08bbe'/>
+      <pointer-type-def type-id='6071dd22' size-in-bits='64' id='ba77b4f4'/>
       <pointer-type-def type-id='182ef894' size-in-bits='64' id='d78909c6'/>
+      <function-decl name='hci_alloc_dev' mangled-name='hci_alloc_dev' filepath='net/bluetooth/hci_core.c' line='3056' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hci_alloc_dev'>
+        <return type-id='9ad862e7'/>
+      </function-decl>
+      <function-decl name='bt_err' mangled-name='bt_err' filepath='include/net/bluetooth/bluetooth.h' line='130' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bt_err'>
+        <parameter type-id='80f4b756'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='48b5725f'/>
+      </function-decl>
+      <function-decl name='hci_free_dev' mangled-name='hci_free_dev' filepath='net/bluetooth/hci_core.c' line='3149' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hci_free_dev'>
+        <parameter type-id='9ad862e7' name='hdev' filepath='net/bluetooth/hci_core.c' line='3149' column='1'/>
+        <return type-id='48b5725f'/>
+      </function-decl>
+      <function-decl name='hci_register_dev' mangled-name='hci_register_dev' filepath='net/bluetooth/hci_core.c' line='3157' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hci_register_dev'>
+        <parameter type-id='9ad862e7' name='hdev' filepath='net/bluetooth/hci_core.c' line='3157' column='1'/>
+        <return type-id='95e97e5e'/>
+      </function-decl>
       <function-decl name='rfkill_alloc' mangled-name='rfkill_alloc' filepath='include/linux/rfkill.h' line='79' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rfkill_alloc'>
         <parameter type-id='80f4b756'/>
         <parameter type-id='fa0b179b'/>
@@ -126223,15 +127201,53 @@
         <parameter type-id='c5b94c75'/>
         <return type-id='48b5725f'/>
       </function-decl>
+      <function-decl name='hci_unregister_dev' mangled-name='hci_unregister_dev' filepath='net/bluetooth/hci_core.c' line='3262' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hci_unregister_dev'>
+        <parameter type-id='9ad862e7' name='hdev' filepath='net/bluetooth/hci_core.c' line='3262' column='1'/>
+        <return type-id='48b5725f'/>
+      </function-decl>
       <function-decl name='rfkill_unregister' mangled-name='rfkill_unregister' filepath='include/linux/rfkill.h' line='130' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='rfkill_unregister'>
         <parameter type-id='c5b94c75'/>
         <return type-id='48b5725f'/>
       </function-decl>
+      <function-decl name='hci_recv_frame' mangled-name='hci_recv_frame' filepath='net/bluetooth/hci_core.c' line='3364' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='hci_recv_frame'>
+        <parameter type-id='9ad862e7' name='hdev' filepath='net/bluetooth/hci_core.c' line='3364' column='1'/>
+        <parameter type-id='0fbf3cfd' name='skb' filepath='net/bluetooth/hci_core.c' line='3364' column='1'/>
+        <return type-id='95e97e5e'/>
+      </function-decl>
+      <function-type size-in-bits='64' id='d7322b1f'>
+        <parameter type-id='9ad862e7'/>
+        <return type-id='95e97e5e'/>
+      </function-type>
+      <function-type size-in-bits='64' id='61a50456'>
+        <parameter type-id='9ad862e7'/>
+        <parameter type-id='c3e18af8'/>
+        <return type-id='95e97e5e'/>
+      </function-type>
+      <function-type size-in-bits='64' id='73adb477'>
+        <parameter type-id='9ad862e7'/>
+        <parameter type-id='0fbf3cfd'/>
+        <return type-id='95e97e5e'/>
+      </function-type>
+      <function-type size-in-bits='64' id='bd4974e4'>
+        <parameter type-id='9ad862e7'/>
+        <parameter type-id='b50a4934'/>
+        <return type-id='95e97e5e'/>
+      </function-type>
       <function-type size-in-bits='64' id='b69e3ec6'>
         <parameter type-id='eaa32e2f'/>
         <parameter type-id='b50a4934'/>
         <return type-id='95e97e5e'/>
       </function-type>
+      <function-type size-in-bits='64' id='1ca1bfac'>
+        <parameter type-id='9ad862e7'/>
+        <parameter type-id='f9b06939'/>
+        <return type-id='48b5725f'/>
+      </function-type>
+      <function-type size-in-bits='64' id='6071dd22'>
+        <parameter type-id='9ad862e7'/>
+        <parameter type-id='f0981eeb'/>
+        <return type-id='48b5725f'/>
+      </function-type>
       <function-type size-in-bits='64' id='182ef894'>
         <parameter type-id='c5b94c75'/>
         <parameter type-id='eaa32e2f'/>
@@ -126259,217 +127275,6 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='net/core/dev.c' language='LANG_C89'>
-      <array-type-def dimensions='1' type-id='bb08c7e1' size-in-bits='infinite' id='f443352a'>
-        <subrange length='infinite' type-id='7ff19f0f' id='031f2035'/>
-      </array-type-def>
-      <class-decl name='libipw_device' is-struct='yes' visibility='default' is-declaration-only='yes' id='9c91a761'/>
-      <array-type-def dimensions='1' type-id='aa80c027' size-in-bits='256' id='c73a16a3'>
-        <subrange length='8' type-id='7ff19f0f' id='56e0c0b1'/>
-      </array-type-def>
-      <array-type-def dimensions='1' type-id='b151a3a8' size-in-bits='64' id='4a744ea1'>
-        <subrange length='8' type-id='7ff19f0f' id='56e0c0b1'/>
-      </array-type-def>
-      <array-type-def dimensions='2' type-id='b151a3a8' size-in-bits='384' id='2d507faf'>
-        <subrange length='8' type-id='7ff19f0f' id='56e0c0b1'/>
-        <subrange length='6' type-id='7ff19f0f' id='52fa524b'/>
-      </array-type-def>
-      <typedef-decl name='iw_handler' type-id='2c8ff697' filepath='include/net/iw_handler.h' line='315' column='1' id='bcc5cab3'/>
-      <class-decl name='iw_request_info' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/net/iw_handler.h' line='304' column='1' id='e90b3b44'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='cmd' type-id='d315442e' visibility='default' filepath='include/net/iw_handler.h' line='305' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='16'>
-          <var-decl name='flags' type-id='d315442e' visibility='default' filepath='include/net/iw_handler.h' line='306' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='iw_point' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='691' column='1' id='db4e746c'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='pointer' type-id='eaa32e2f' visibility='default' filepath='include/uapi/linux/wireless.h' line='692' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='length' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='693' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='80'>
-          <var-decl name='flags' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='694' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='iw_param' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='680' column='1' id='b024252b'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='value' type-id='3158a266' visibility='default' filepath='include/uapi/linux/wireless.h' line='681' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='fixed' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='682' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='40'>
-          <var-decl name='disabled' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='683' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='48'>
-          <var-decl name='flags' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='684' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='iw_freq' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='706' column='1' id='bc1ac22c'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='m' type-id='3158a266' visibility='default' filepath='include/uapi/linux/wireless.h' line='707' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='e' type-id='b55def60' visibility='default' filepath='include/uapi/linux/wireless.h' line='708' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='48'>
-          <var-decl name='i' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='709' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='56'>
-          <var-decl name='flags' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='710' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='iw_quality' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='716' column='1' id='aa80c027'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='qual' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='717' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='8'>
-          <var-decl name='level' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='719' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='16'>
-          <var-decl name='noise' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='720' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='24'>
-          <var-decl name='updated' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='721' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='iw_priv_args' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='1063' column='1' id='0c842ad9'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='cmd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='1064' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='set_args' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='1065' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='48'>
-          <var-decl name='get_args' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='1066' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='name' type-id='ac1fa8c0' visibility='default' filepath='include/uapi/linux/wireless.h' line='1067' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='iw_statistics' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='881' column='1' id='1c8cc2fd'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='status' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='882' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='16'>
-          <var-decl name='qual' type-id='aa80c027' visibility='default' filepath='include/uapi/linux/wireless.h' line='885' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='discard' type-id='832938ed' visibility='default' filepath='include/uapi/linux/wireless.h' line='887' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='224'>
-          <var-decl name='miss' type-id='6a2a3473' visibility='default' filepath='include/uapi/linux/wireless.h' line='888' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='iw_discarded' size-in-bits='160' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='731' column='1' id='832938ed'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='nwid' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='732' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='code' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='733' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='64'>
-          <var-decl name='fragment' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='734' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='96'>
-          <var-decl name='retries' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='735' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='128'>
-          <var-decl name='misc' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='736' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='iw_missed' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='743' column='1' id='6a2a3473'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='beacon' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='744' column='1'/>
-        </data-member>
-      </class-decl>
-      <class-decl name='iw_spy_data' size-in-bits='800' is-struct='yes' visibility='default' filepath='include/net/iw_handler.h' line='396' column='1' id='f8292115'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='spy_number' type-id='95e97e5e' visibility='default' filepath='include/net/iw_handler.h' line='398' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='32'>
-          <var-decl name='spy_address' type-id='2d507faf' visibility='default' filepath='include/net/iw_handler.h' line='399' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='416'>
-          <var-decl name='spy_stat' type-id='c73a16a3' visibility='default' filepath='include/net/iw_handler.h' line='400' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='672'>
-          <var-decl name='spy_thr_low' type-id='aa80c027' visibility='default' filepath='include/net/iw_handler.h' line='402' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='704'>
-          <var-decl name='spy_thr_high' type-id='aa80c027' visibility='default' filepath='include/net/iw_handler.h' line='403' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='736'>
-          <var-decl name='spy_thr_under' type-id='4a744ea1' visibility='default' filepath='include/net/iw_handler.h' line='404' column='1'/>
-        </data-member>
-      </class-decl>
-      <typedef-decl name='u_char' type-id='002ac4a6' filepath='include/linux/types.h' line='84' column='1' id='b151a3a8'/>
-      <union-decl name='iwreq_data' size-in-bits='128' visibility='default' filepath='include/uapi/linux/wireless.h' line='902' column='1' id='ed626d0d'>
-        <data-member access='public'>
-          <var-decl name='name' type-id='ac1fa8c0' visibility='default' filepath='include/uapi/linux/wireless.h' line='904' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='essid' type-id='db4e746c' visibility='default' filepath='include/uapi/linux/wireless.h' line='908' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='nwid' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='909' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='freq' type-id='bc1ac22c' visibility='default' filepath='include/uapi/linux/wireless.h' line='910' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='sens' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='914' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='bitrate' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='915' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='txpower' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='916' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='rts' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='917' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='frag' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='918' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='mode' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='919' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='retry' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='920' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='encoding' type-id='db4e746c' visibility='default' filepath='include/uapi/linux/wireless.h' line='922' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='power' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='923' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='qual' type-id='aa80c027' visibility='default' filepath='include/uapi/linux/wireless.h' line='924' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='ap_addr' type-id='5221b18a' visibility='default' filepath='include/uapi/linux/wireless.h' line='926' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='addr' type-id='5221b18a' visibility='default' filepath='include/uapi/linux/wireless.h' line='927' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='param' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='929' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='data' type-id='db4e746c' visibility='default' filepath='include/uapi/linux/wireless.h' line='930' column='1'/>
-        </data-member>
-      </union-decl>
-      <class-decl name='__anonymous_struct__2' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/cpu_rmap.h' line='31' column='1' id='bb08c7e1'>
-        <data-member access='public' layout-offset-in-bits='0'>
-          <var-decl name='index' type-id='1dc6a898' visibility='default' filepath='include/linux/cpu_rmap.h' line='32' column='1'/>
-        </data-member>
-        <data-member access='public' layout-offset-in-bits='16'>
-          <var-decl name='dist' type-id='1dc6a898' visibility='default' filepath='include/linux/cpu_rmap.h' line='33' column='1'/>
-        </data-member>
-      </class-decl>
       <class-decl name='rps_sock_flow_table' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/linux/netdevice.h' line='687' column='1' id='512813dd'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='mask' type-id='19c2251e' visibility='default' filepath='include/linux/netdevice.h' line='688' column='1'/>
@@ -126483,17 +127288,6 @@
         <enumerator name='SKB_REASON_CONSUMED' value='0'/>
         <enumerator name='SKB_REASON_DROPPED' value='1'/>
       </enum-decl>
-      <qualified-type-def type-id='bcc5cab3' const='yes' id='208298e3'/>
-      <pointer-type-def type-id='208298e3' size-in-bits='64' id='f696846b'/>
-      <qualified-type-def type-id='0c842ad9' const='yes' id='afa36b70'/>
-      <pointer-type-def type-id='afa36b70' size-in-bits='64' id='d841feae'/>
-      <pointer-type-def type-id='97488913' size-in-bits='64' id='2c8ff697'/>
-      <pointer-type-def type-id='e90b3b44' size-in-bits='64' id='4780e252'/>
-      <pointer-type-def type-id='f8292115' size-in-bits='64' id='96efb615'/>
-      <pointer-type-def type-id='1c8cc2fd' size-in-bits='64' id='003642fd'/>
-      <pointer-type-def type-id='cfdbff8a' size-in-bits='64' id='55e2a83c'/>
-      <pointer-type-def type-id='ed626d0d' size-in-bits='64' id='00e2a7ce'/>
-      <pointer-type-def type-id='9c91a761' size-in-bits='64' id='29244949'/>
       <pointer-type-def type-id='512813dd' size-in-bits='64' id='2293f1dd'/>
       <function-decl name='netdev_rx_handler_unregister' mangled-name='netdev_rx_handler_unregister' filepath='net/core/dev.c' line='4722' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='netdev_rx_handler_unregister'>
         <parameter type-id='68a2d05b' name='dev' filepath='net/core/dev.c' line='4722' column='1'/>
@@ -126626,17 +127420,6 @@
         <parameter type-id='f9f4b16f' name='mask' filepath='net/core/dev.c' line='9560' column='1'/>
         <return type-id='f9f4b16f'/>
       </function-decl>
-      <function-type size-in-bits='64' id='97488913'>
-        <parameter type-id='68a2d05b'/>
-        <parameter type-id='4780e252'/>
-        <parameter type-id='00e2a7ce'/>
-        <parameter type-id='26a90f95'/>
-        <return type-id='95e97e5e'/>
-      </function-type>
-      <function-type size-in-bits='64' id='cfdbff8a'>
-        <parameter type-id='68a2d05b'/>
-        <return type-id='003642fd'/>
-      </function-type>
     </abi-instr>
     <abi-instr address-size='64' path='net/core/dev_addr_lists.c' language='LANG_C89'>
       <function-decl name='dev_uc_sync_multiple' mangled-name='dev_uc_sync_multiple' filepath='net/core/dev_addr_lists.c' line='567' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='dev_uc_sync_multiple'>
@@ -127755,7 +128538,7 @@
           <var-decl name='' type-id='ba169a6c' visibility='default' filepath='include/net/inet_hashtables.h' line='118' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__14' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/inet_hashtables.h' line='118' column='1' id='ba169a6c'>
+      <union-decl name='__anonymous_union__13' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/inet_hashtables.h' line='118' column='1' id='ba169a6c'>
         <data-member access='public'>
           <var-decl name='head' type-id='e151255a' visibility='default' filepath='include/net/inet_hashtables.h' line='119' column='1'/>
         </data-member>
@@ -129741,27 +130524,27 @@
       <pointer-type-def type-id='21ec1a55' size-in-bits='64' id='6984e365'/>
       <pointer-type-def type-id='f7a1d399' size-in-bits='64' id='8438f281'/>
       <pointer-type-def type-id='64a9bab2' size-in-bits='64' id='bfc146e4'/>
-      <function-decl name='__netlink_kernel_create' mangled-name='__netlink_kernel_create' filepath='net/netlink/af_netlink.c' line='2017' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__netlink_kernel_create'>
-        <parameter type-id='a2bff676' name='net' filepath='net/netlink/af_netlink.c' line='2017' column='1'/>
-        <parameter type-id='95e97e5e' name='unit' filepath='net/netlink/af_netlink.c' line='2017' column='1'/>
-        <parameter type-id='2730d015' name='module' filepath='net/netlink/af_netlink.c' line='2017' column='1'/>
-        <parameter type-id='8438f281' name='cfg' filepath='net/netlink/af_netlink.c' line='2018' column='1'/>
+      <function-decl name='__netlink_kernel_create' mangled-name='__netlink_kernel_create' filepath='net/netlink/af_netlink.c' line='2019' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__netlink_kernel_create'>
+        <parameter type-id='a2bff676' name='net' filepath='net/netlink/af_netlink.c' line='2019' column='1'/>
+        <parameter type-id='95e97e5e' name='unit' filepath='net/netlink/af_netlink.c' line='2019' column='1'/>
+        <parameter type-id='2730d015' name='module' filepath='net/netlink/af_netlink.c' line='2019' column='1'/>
+        <parameter type-id='8438f281' name='cfg' filepath='net/netlink/af_netlink.c' line='2020' column='1'/>
         <return type-id='f772df6d'/>
       </function-decl>
-      <function-decl name='__nlmsg_put' mangled-name='__nlmsg_put' filepath='net/netlink/af_netlink.c' line='2157' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__nlmsg_put'>
-        <parameter type-id='0fbf3cfd' name='skb' filepath='net/netlink/af_netlink.c' line='2157' column='1'/>
-        <parameter type-id='19c2251e' name='portid' filepath='net/netlink/af_netlink.c' line='2157' column='1'/>
-        <parameter type-id='19c2251e' name='seq' filepath='net/netlink/af_netlink.c' line='2157' column='1'/>
-        <parameter type-id='95e97e5e' name='type' filepath='net/netlink/af_netlink.c' line='2157' column='1'/>
-        <parameter type-id='95e97e5e' name='len' filepath='net/netlink/af_netlink.c' line='2157' column='1'/>
-        <parameter type-id='95e97e5e' name='flags' filepath='net/netlink/af_netlink.c' line='2157' column='1'/>
+      <function-decl name='__nlmsg_put' mangled-name='__nlmsg_put' filepath='net/netlink/af_netlink.c' line='2159' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__nlmsg_put'>
+        <parameter type-id='0fbf3cfd' name='skb' filepath='net/netlink/af_netlink.c' line='2159' column='1'/>
+        <parameter type-id='19c2251e' name='portid' filepath='net/netlink/af_netlink.c' line='2159' column='1'/>
+        <parameter type-id='19c2251e' name='seq' filepath='net/netlink/af_netlink.c' line='2159' column='1'/>
+        <parameter type-id='95e97e5e' name='type' filepath='net/netlink/af_netlink.c' line='2159' column='1'/>
+        <parameter type-id='95e97e5e' name='len' filepath='net/netlink/af_netlink.c' line='2159' column='1'/>
+        <parameter type-id='95e97e5e' name='flags' filepath='net/netlink/af_netlink.c' line='2159' column='1'/>
         <return type-id='c2074578'/>
       </function-decl>
-      <function-decl name='__netlink_dump_start' mangled-name='__netlink_dump_start' filepath='net/netlink/af_netlink.c' line='2279' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__netlink_dump_start'>
-        <parameter type-id='f772df6d' name='ssk' filepath='net/netlink/af_netlink.c' line='2279' column='1'/>
-        <parameter type-id='0fbf3cfd' name='skb' filepath='net/netlink/af_netlink.c' line='2279' column='1'/>
-        <parameter type-id='390fbe8f' name='nlh' filepath='net/netlink/af_netlink.c' line='2280' column='1'/>
-        <parameter type-id='6984e365' name='control' filepath='net/netlink/af_netlink.c' line='2281' column='1'/>
+      <function-decl name='__netlink_dump_start' mangled-name='__netlink_dump_start' filepath='net/netlink/af_netlink.c' line='2281' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__netlink_dump_start'>
+        <parameter type-id='f772df6d' name='ssk' filepath='net/netlink/af_netlink.c' line='2281' column='1'/>
+        <parameter type-id='0fbf3cfd' name='skb' filepath='net/netlink/af_netlink.c' line='2281' column='1'/>
+        <parameter type-id='390fbe8f' name='nlh' filepath='net/netlink/af_netlink.c' line='2282' column='1'/>
+        <parameter type-id='6984e365' name='control' filepath='net/netlink/af_netlink.c' line='2283' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
       <function-type size-in-bits='64' id='64a9bab2'>
@@ -130039,6 +130822,7 @@
           <var-decl name='prev_bssid_valid' type-id='b50a4934' visibility='default' filepath='net/wireless/sme.c' line='51' column='1'/>
         </data-member>
       </class-decl>
+      <class-decl name='libipw_device' is-struct='yes' visibility='default' is-declaration-only='yes' id='9c91a761'/>
       <array-type-def dimensions='1' type-id='ec00acfb' size-in-bits='infinite' id='14cad687'>
         <subrange length='infinite' type-id='7ff19f0f' id='031f2035'/>
       </array-type-def>
@@ -130051,6 +130835,9 @@
       <array-type-def dimensions='1' type-id='86d70780' size-in-bits='256' id='00286dfe'>
         <subrange length='4' type-id='7ff19f0f' id='16fe7105'/>
       </array-type-def>
+      <array-type-def dimensions='1' type-id='aa80c027' size-in-bits='256' id='c73a16a3'>
+        <subrange length='8' type-id='7ff19f0f' id='56e0c0b1'/>
+      </array-type-def>
       <array-type-def dimensions='1' type-id='45947737' size-in-bits='1024' id='248874df'>
         <subrange length='4' type-id='7ff19f0f' id='16fe7105'/>
       </array-type-def>
@@ -130091,6 +130878,13 @@
       <array-type-def dimensions='1' type-id='f9b06939' size-in-bits='72' id='cef57087'>
         <subrange length='9' type-id='7ff19f0f' id='12e4273c'/>
       </array-type-def>
+      <array-type-def dimensions='1' type-id='b151a3a8' size-in-bits='64' id='4a744ea1'>
+        <subrange length='8' type-id='7ff19f0f' id='56e0c0b1'/>
+      </array-type-def>
+      <array-type-def dimensions='2' type-id='b151a3a8' size-in-bits='384' id='2d507faf'>
+        <subrange length='8' type-id='7ff19f0f' id='56e0c0b1'/>
+        <subrange length='6' type-id='7ff19f0f' id='52fa524b'/>
+      </array-type-def>
       <class-decl name='wiphy' size-in-bits='11264' is-struct='yes' visibility='default' filepath='include/net/cfg80211.h' line='4154' column='1' id='68523a94'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='perm_addr' type-id='cf1a4160' visibility='default' filepath='include/net/cfg80211.h' line='4158' column='1'/>
@@ -130691,6 +131485,195 @@
         <enumerator name='NL80211_BAND_60GHZ' value='2'/>
         <enumerator name='NUM_NL80211_BANDS' value='3'/>
       </enum-decl>
+      <union-decl name='iwreq_data' size-in-bits='128' visibility='default' filepath='include/uapi/linux/wireless.h' line='902' column='1' id='ed626d0d'>
+        <data-member access='public'>
+          <var-decl name='name' type-id='ac1fa8c0' visibility='default' filepath='include/uapi/linux/wireless.h' line='904' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='essid' type-id='db4e746c' visibility='default' filepath='include/uapi/linux/wireless.h' line='908' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='nwid' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='909' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='freq' type-id='bc1ac22c' visibility='default' filepath='include/uapi/linux/wireless.h' line='910' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='sens' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='914' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='bitrate' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='915' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='txpower' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='916' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='rts' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='917' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='frag' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='918' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='mode' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='919' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='retry' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='920' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='encoding' type-id='db4e746c' visibility='default' filepath='include/uapi/linux/wireless.h' line='922' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='power' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='923' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='qual' type-id='aa80c027' visibility='default' filepath='include/uapi/linux/wireless.h' line='924' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='ap_addr' type-id='5221b18a' visibility='default' filepath='include/uapi/linux/wireless.h' line='926' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='addr' type-id='5221b18a' visibility='default' filepath='include/uapi/linux/wireless.h' line='927' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='param' type-id='b024252b' visibility='default' filepath='include/uapi/linux/wireless.h' line='929' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='data' type-id='db4e746c' visibility='default' filepath='include/uapi/linux/wireless.h' line='930' column='1'/>
+        </data-member>
+      </union-decl>
+      <typedef-decl name='iw_handler' type-id='2c8ff697' filepath='include/net/iw_handler.h' line='315' column='1' id='bcc5cab3'/>
+      <class-decl name='iw_request_info' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/net/iw_handler.h' line='304' column='1' id='e90b3b44'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='d315442e' visibility='default' filepath='include/net/iw_handler.h' line='305' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='flags' type-id='d315442e' visibility='default' filepath='include/net/iw_handler.h' line='306' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_point' size-in-bits='128' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='691' column='1' id='db4e746c'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='pointer' type-id='eaa32e2f' visibility='default' filepath='include/uapi/linux/wireless.h' line='692' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='length' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='693' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='80'>
+          <var-decl name='flags' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='694' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_param' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='680' column='1' id='b024252b'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='value' type-id='3158a266' visibility='default' filepath='include/uapi/linux/wireless.h' line='681' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='fixed' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='682' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='40'>
+          <var-decl name='disabled' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='683' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='flags' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='684' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_freq' size-in-bits='64' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='706' column='1' id='bc1ac22c'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='m' type-id='3158a266' visibility='default' filepath='include/uapi/linux/wireless.h' line='707' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='e' type-id='b55def60' visibility='default' filepath='include/uapi/linux/wireless.h' line='708' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='i' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='709' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='56'>
+          <var-decl name='flags' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='710' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_quality' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='716' column='1' id='aa80c027'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='qual' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='717' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='8'>
+          <var-decl name='level' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='719' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='noise' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='720' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='24'>
+          <var-decl name='updated' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/wireless.h' line='721' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_priv_args' size-in-bits='192' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='1063' column='1' id='0c842ad9'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='cmd' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='1064' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='set_args' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='1065' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='48'>
+          <var-decl name='get_args' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='1066' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='name' type-id='ac1fa8c0' visibility='default' filepath='include/uapi/linux/wireless.h' line='1067' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_statistics' size-in-bits='256' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='881' column='1' id='1c8cc2fd'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='status' type-id='d315442e' visibility='default' filepath='include/uapi/linux/wireless.h' line='882' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='16'>
+          <var-decl name='qual' type-id='aa80c027' visibility='default' filepath='include/uapi/linux/wireless.h' line='885' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='discard' type-id='832938ed' visibility='default' filepath='include/uapi/linux/wireless.h' line='887' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='224'>
+          <var-decl name='miss' type-id='6a2a3473' visibility='default' filepath='include/uapi/linux/wireless.h' line='888' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_discarded' size-in-bits='160' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='731' column='1' id='832938ed'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='nwid' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='732' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='code' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='733' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='64'>
+          <var-decl name='fragment' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='734' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='96'>
+          <var-decl name='retries' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='735' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='128'>
+          <var-decl name='misc' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='736' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_missed' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/uapi/linux/wireless.h' line='743' column='1' id='6a2a3473'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='beacon' type-id='3f1a6b60' visibility='default' filepath='include/uapi/linux/wireless.h' line='744' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='iw_spy_data' size-in-bits='800' is-struct='yes' visibility='default' filepath='include/net/iw_handler.h' line='396' column='1' id='f8292115'>
+        <data-member access='public' layout-offset-in-bits='0'>
+          <var-decl name='spy_number' type-id='95e97e5e' visibility='default' filepath='include/net/iw_handler.h' line='398' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='32'>
+          <var-decl name='spy_address' type-id='2d507faf' visibility='default' filepath='include/net/iw_handler.h' line='399' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='416'>
+          <var-decl name='spy_stat' type-id='c73a16a3' visibility='default' filepath='include/net/iw_handler.h' line='400' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='672'>
+          <var-decl name='spy_thr_low' type-id='aa80c027' visibility='default' filepath='include/net/iw_handler.h' line='402' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='704'>
+          <var-decl name='spy_thr_high' type-id='aa80c027' visibility='default' filepath='include/net/iw_handler.h' line='403' column='1'/>
+        </data-member>
+        <data-member access='public' layout-offset-in-bits='736'>
+          <var-decl name='spy_thr_under' type-id='4a744ea1' visibility='default' filepath='include/net/iw_handler.h' line='404' column='1'/>
+        </data-member>
+      </class-decl>
+      <typedef-decl name='u_char' type-id='002ac4a6' filepath='include/linux/types.h' line='84' column='1' id='b151a3a8'/>
       <enum-decl name='nl80211_iftype' filepath='include/uapi/linux/nl80211.h' line='2912' column='1' id='86505f90'>
         <underlying-type type-id='9cac1fee'/>
         <enumerator name='NL80211_IFTYPE_UNSPECIFIED' value='0'/>
@@ -133255,6 +134238,10 @@
       <pointer-type-def type-id='64b77daa' size-in-bits='64' id='0cda9080'/>
       <qualified-type-def type-id='2eec6999' const='yes' id='46f53066'/>
       <pointer-type-def type-id='46f53066' size-in-bits='64' id='fffb07a4'/>
+      <qualified-type-def type-id='bcc5cab3' const='yes' id='208298e3'/>
+      <pointer-type-def type-id='208298e3' size-in-bits='64' id='f696846b'/>
+      <qualified-type-def type-id='0c842ad9' const='yes' id='afa36b70'/>
+      <pointer-type-def type-id='afa36b70' size-in-bits='64' id='d841feae'/>
       <qualified-type-def type-id='50718ec3' const='yes' id='3666ea54'/>
       <pointer-type-def type-id='3666ea54' size-in-bits='64' id='2203245a'/>
       <qualified-type-def type-id='d5e39a52' const='yes' id='be356197'/>
@@ -133279,6 +134266,7 @@
       <pointer-type-def type-id='ce30b5d2' size-in-bits='64' id='4343d470'/>
       <pointer-type-def type-id='f7e1259c' size-in-bits='64' id='3cad9e1a'/>
       <pointer-type-def type-id='f16b7aee' size-in-bits='64' id='bf642844'/>
+      <pointer-type-def type-id='97488913' size-in-bits='64' id='2c8ff697'/>
       <pointer-type-def type-id='045f8e20' size-in-bits='64' id='518c633a'/>
       <pointer-type-def type-id='49390c3d' size-in-bits='64' id='40a250d9'/>
       <pointer-type-def type-id='06206c42' size-in-bits='64' id='ee39fcb4'/>
@@ -133362,7 +134350,13 @@
       <pointer-type-def type-id='d91d4c07' size-in-bits='64' id='dcf81beb'/>
       <pointer-type-def type-id='48be0748' size-in-bits='64' id='6a7c3ba2'/>
       <pointer-type-def type-id='c756879f' size-in-bits='64' id='a9032da3'/>
+      <pointer-type-def type-id='e90b3b44' size-in-bits='64' id='4780e252'/>
+      <pointer-type-def type-id='f8292115' size-in-bits='64' id='96efb615'/>
+      <pointer-type-def type-id='1c8cc2fd' size-in-bits='64' id='003642fd'/>
+      <pointer-type-def type-id='cfdbff8a' size-in-bits='64' id='55e2a83c'/>
+      <pointer-type-def type-id='ed626d0d' size-in-bits='64' id='00e2a7ce'/>
       <pointer-type-def type-id='45947737' size-in-bits='64' id='706d79ff'/>
+      <pointer-type-def type-id='9c91a761' size-in-bits='64' id='29244949'/>
       <pointer-type-def type-id='6d8d26fb' size-in-bits='64' id='01b378ab'/>
       <pointer-type-def type-id='50718ec3' size-in-bits='64' id='fce83a73'/>
       <pointer-type-def type-id='1cac2bf4' size-in-bits='64' id='9362acb2'/>
@@ -133407,6 +134401,13 @@
         <parameter type-id='bda81d86'/>
         <return type-id='48b5725f'/>
       </function-decl>
+      <function-type size-in-bits='64' id='97488913'>
+        <parameter type-id='68a2d05b'/>
+        <parameter type-id='4780e252'/>
+        <parameter type-id='00e2a7ce'/>
+        <parameter type-id='26a90f95'/>
+        <return type-id='95e97e5e'/>
+      </function-type>
       <function-type size-in-bits='64' id='045f8e20'>
         <parameter type-id='666fb412'/>
         <return type-id='95e97e5e'/>
@@ -133960,6 +134961,10 @@
         <parameter type-id='95e97e5e'/>
         <return type-id='95e97e5e'/>
       </function-type>
+      <function-type size-in-bits='64' id='cfdbff8a'>
+        <parameter type-id='68a2d05b'/>
+        <return type-id='003642fd'/>
+      </function-type>
       <function-type size-in-bits='64' id='a2365ade'>
         <parameter type-id='eaa32e2f'/>
         <parameter type-id='706d79ff'/>
@@ -134509,124 +135514,124 @@
         </data-member>
       </class-decl>
       <pointer-type-def type-id='cc4b6920' size-in-bits='64' id='76db5996'/>
-      <function-decl name='__cfg80211_alloc_event_skb' mangled-name='__cfg80211_alloc_event_skb' filepath='net/wireless/nl80211.c' line='9287' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cfg80211_alloc_event_skb'>
-        <parameter type-id='666fb412' name='wiphy' filepath='net/wireless/nl80211.c' line='9287' column='1'/>
-        <parameter type-id='63c7e8e1' name='wdev' filepath='net/wireless/nl80211.c' line='9288' column='1'/>
-        <parameter type-id='187e1e49' name='cmd' filepath='net/wireless/nl80211.c' line='9289' column='1'/>
-        <parameter type-id='320b0ded' name='attr' filepath='net/wireless/nl80211.c' line='9290' column='1'/>
-        <parameter type-id='95e97e5e' name='vendor_event_idx' filepath='net/wireless/nl80211.c' line='9291' column='1'/>
-        <parameter type-id='95e97e5e' name='approxlen' filepath='net/wireless/nl80211.c' line='9292' column='1'/>
-        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='9292' column='1'/>
+      <function-decl name='__cfg80211_alloc_event_skb' mangled-name='__cfg80211_alloc_event_skb' filepath='net/wireless/nl80211.c' line='9288' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cfg80211_alloc_event_skb'>
+        <parameter type-id='666fb412' name='wiphy' filepath='net/wireless/nl80211.c' line='9288' column='1'/>
+        <parameter type-id='63c7e8e1' name='wdev' filepath='net/wireless/nl80211.c' line='9289' column='1'/>
+        <parameter type-id='187e1e49' name='cmd' filepath='net/wireless/nl80211.c' line='9290' column='1'/>
+        <parameter type-id='320b0ded' name='attr' filepath='net/wireless/nl80211.c' line='9291' column='1'/>
+        <parameter type-id='95e97e5e' name='vendor_event_idx' filepath='net/wireless/nl80211.c' line='9292' column='1'/>
+        <parameter type-id='95e97e5e' name='approxlen' filepath='net/wireless/nl80211.c' line='9293' column='1'/>
+        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='9293' column='1'/>
         <return type-id='0fbf3cfd'/>
       </function-decl>
-      <function-decl name='__cfg80211_send_event_skb' mangled-name='__cfg80211_send_event_skb' filepath='net/wireless/nl80211.c' line='9319' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cfg80211_send_event_skb'>
-        <parameter type-id='0fbf3cfd' name='skb' filepath='net/wireless/nl80211.c' line='9319' column='1'/>
-        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='9319' column='1'/>
+      <function-decl name='__cfg80211_send_event_skb' mangled-name='__cfg80211_send_event_skb' filepath='net/wireless/nl80211.c' line='9320' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cfg80211_send_event_skb'>
+        <parameter type-id='0fbf3cfd' name='skb' filepath='net/wireless/nl80211.c' line='9320' column='1'/>
+        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='9320' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='__cfg80211_alloc_reply_skb' mangled-name='__cfg80211_alloc_reply_skb' filepath='net/wireless/nl80211.c' line='12725' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cfg80211_alloc_reply_skb'>
-        <parameter type-id='666fb412' name='wiphy' filepath='net/wireless/nl80211.c' line='12725' column='1'/>
-        <parameter type-id='187e1e49' name='cmd' filepath='net/wireless/nl80211.c' line='12726' column='1'/>
-        <parameter type-id='320b0ded' name='attr' filepath='net/wireless/nl80211.c' line='12727' column='1'/>
-        <parameter type-id='95e97e5e' name='approxlen' filepath='net/wireless/nl80211.c' line='12728' column='1'/>
+      <function-decl name='__cfg80211_alloc_reply_skb' mangled-name='__cfg80211_alloc_reply_skb' filepath='net/wireless/nl80211.c' line='12726' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__cfg80211_alloc_reply_skb'>
+        <parameter type-id='666fb412' name='wiphy' filepath='net/wireless/nl80211.c' line='12726' column='1'/>
+        <parameter type-id='187e1e49' name='cmd' filepath='net/wireless/nl80211.c' line='12727' column='1'/>
+        <parameter type-id='320b0ded' name='attr' filepath='net/wireless/nl80211.c' line='12728' column='1'/>
+        <parameter type-id='95e97e5e' name='approxlen' filepath='net/wireless/nl80211.c' line='12729' column='1'/>
         <return type-id='0fbf3cfd'/>
       </function-decl>
-      <function-decl name='cfg80211_vendor_cmd_reply' mangled-name='cfg80211_vendor_cmd_reply' filepath='net/wireless/nl80211.c' line='12742' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_vendor_cmd_reply'>
-        <parameter type-id='0fbf3cfd' name='skb' filepath='net/wireless/nl80211.c' line='12742' column='1'/>
+      <function-decl name='cfg80211_vendor_cmd_reply' mangled-name='cfg80211_vendor_cmd_reply' filepath='net/wireless/nl80211.c' line='12743' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_vendor_cmd_reply'>
+        <parameter type-id='0fbf3cfd' name='skb' filepath='net/wireless/nl80211.c' line='12743' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='cfg80211_rx_unprot_mlme_mgmt' mangled-name='cfg80211_rx_unprot_mlme_mgmt' filepath='net/wireless/nl80211.c' line='14546' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_rx_unprot_mlme_mgmt'>
-        <parameter type-id='68a2d05b' name='dev' filepath='net/wireless/nl80211.c' line='14546' column='1'/>
-        <parameter type-id='bbaf3419' name='buf' filepath='net/wireless/nl80211.c' line='14546' column='1'/>
-        <parameter type-id='b59d7dce' name='len' filepath='net/wireless/nl80211.c' line='14547' column='1'/>
+      <function-decl name='cfg80211_rx_unprot_mlme_mgmt' mangled-name='cfg80211_rx_unprot_mlme_mgmt' filepath='net/wireless/nl80211.c' line='14547' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_rx_unprot_mlme_mgmt'>
+        <parameter type-id='68a2d05b' name='dev' filepath='net/wireless/nl80211.c' line='14547' column='1'/>
+        <parameter type-id='bbaf3419' name='buf' filepath='net/wireless/nl80211.c' line='14547' column='1'/>
+        <parameter type-id='b59d7dce' name='len' filepath='net/wireless/nl80211.c' line='14548' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='cfg80211_ready_on_channel' mangled-name='cfg80211_ready_on_channel' filepath='net/wireless/nl80211.c' line='15003' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_ready_on_channel'>
-        <parameter type-id='63c7e8e1' name='wdev' filepath='net/wireless/nl80211.c' line='15003' column='1'/>
-        <parameter type-id='91ce1af9' name='cookie' filepath='net/wireless/nl80211.c' line='15003' column='1'/>
-        <parameter type-id='ec00acfb' name='chan' filepath='net/wireless/nl80211.c' line='15004' column='1'/>
-        <parameter type-id='f0981eeb' name='duration' filepath='net/wireless/nl80211.c' line='15005' column='1'/>
-        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='15005' column='1'/>
+      <function-decl name='cfg80211_ready_on_channel' mangled-name='cfg80211_ready_on_channel' filepath='net/wireless/nl80211.c' line='15004' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_ready_on_channel'>
+        <parameter type-id='63c7e8e1' name='wdev' filepath='net/wireless/nl80211.c' line='15004' column='1'/>
+        <parameter type-id='91ce1af9' name='cookie' filepath='net/wireless/nl80211.c' line='15004' column='1'/>
+        <parameter type-id='ec00acfb' name='chan' filepath='net/wireless/nl80211.c' line='15005' column='1'/>
+        <parameter type-id='f0981eeb' name='duration' filepath='net/wireless/nl80211.c' line='15006' column='1'/>
+        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='15006' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='cfg80211_remain_on_channel_expired' mangled-name='cfg80211_remain_on_channel_expired' filepath='net/wireless/nl80211.c' line='15017' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_remain_on_channel_expired'>
-        <parameter type-id='63c7e8e1' name='wdev' filepath='net/wireless/nl80211.c' line='15017' column='1'/>
-        <parameter type-id='91ce1af9' name='cookie' filepath='net/wireless/nl80211.c' line='15017' column='1'/>
-        <parameter type-id='ec00acfb' name='chan' filepath='net/wireless/nl80211.c' line='15018' column='1'/>
-        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='15019' column='1'/>
+      <function-decl name='cfg80211_remain_on_channel_expired' mangled-name='cfg80211_remain_on_channel_expired' filepath='net/wireless/nl80211.c' line='15018' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_remain_on_channel_expired'>
+        <parameter type-id='63c7e8e1' name='wdev' filepath='net/wireless/nl80211.c' line='15018' column='1'/>
+        <parameter type-id='91ce1af9' name='cookie' filepath='net/wireless/nl80211.c' line='15018' column='1'/>
+        <parameter type-id='ec00acfb' name='chan' filepath='net/wireless/nl80211.c' line='15019' column='1'/>
+        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='15020' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='cfg80211_new_sta' mangled-name='cfg80211_new_sta' filepath='net/wireless/nl80211.c' line='15030' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_new_sta'>
-        <parameter type-id='68a2d05b' name='dev' filepath='net/wireless/nl80211.c' line='15030' column='1'/>
-        <parameter type-id='bbaf3419' name='mac_addr' filepath='net/wireless/nl80211.c' line='15030' column='1'/>
-        <parameter type-id='7af1dc96' name='sinfo' filepath='net/wireless/nl80211.c' line='15031' column='1'/>
-        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='15031' column='1'/>
+      <function-decl name='cfg80211_new_sta' mangled-name='cfg80211_new_sta' filepath='net/wireless/nl80211.c' line='15031' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_new_sta'>
+        <parameter type-id='68a2d05b' name='dev' filepath='net/wireless/nl80211.c' line='15031' column='1'/>
+        <parameter type-id='bbaf3419' name='mac_addr' filepath='net/wireless/nl80211.c' line='15031' column='1'/>
+        <parameter type-id='7af1dc96' name='sinfo' filepath='net/wireless/nl80211.c' line='15032' column='1'/>
+        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='15032' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='cfg80211_del_sta_sinfo' mangled-name='cfg80211_del_sta_sinfo' filepath='net/wireless/nl80211.c' line='15054' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_del_sta_sinfo'>
-        <parameter type-id='68a2d05b' name='dev' filepath='net/wireless/nl80211.c' line='15054' column='1'/>
-        <parameter type-id='bbaf3419' name='mac_addr' filepath='net/wireless/nl80211.c' line='15054' column='1'/>
-        <parameter type-id='7af1dc96' name='sinfo' filepath='net/wireless/nl80211.c' line='15055' column='1'/>
-        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='15055' column='1'/>
+      <function-decl name='cfg80211_del_sta_sinfo' mangled-name='cfg80211_del_sta_sinfo' filepath='net/wireless/nl80211.c' line='15055' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_del_sta_sinfo'>
+        <parameter type-id='68a2d05b' name='dev' filepath='net/wireless/nl80211.c' line='15055' column='1'/>
+        <parameter type-id='bbaf3419' name='mac_addr' filepath='net/wireless/nl80211.c' line='15055' column='1'/>
+        <parameter type-id='7af1dc96' name='sinfo' filepath='net/wireless/nl80211.c' line='15056' column='1'/>
+        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='15056' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='cfg80211_mgmt_tx_status' mangled-name='cfg80211_mgmt_tx_status' filepath='net/wireless/nl80211.c' line='15238' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_mgmt_tx_status'>
-        <parameter type-id='63c7e8e1' name='wdev' filepath='net/wireless/nl80211.c' line='15238' column='1'/>
-        <parameter type-id='91ce1af9' name='cookie' filepath='net/wireless/nl80211.c' line='15238' column='1'/>
-        <parameter type-id='bbaf3419' name='buf' filepath='net/wireless/nl80211.c' line='15239' column='1'/>
-        <parameter type-id='b59d7dce' name='len' filepath='net/wireless/nl80211.c' line='15239' column='1'/>
-        <parameter type-id='b50a4934' name='ack' filepath='net/wireless/nl80211.c' line='15239' column='1'/>
-        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='15239' column='1'/>
+      <function-decl name='cfg80211_mgmt_tx_status' mangled-name='cfg80211_mgmt_tx_status' filepath='net/wireless/nl80211.c' line='15239' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_mgmt_tx_status'>
+        <parameter type-id='63c7e8e1' name='wdev' filepath='net/wireless/nl80211.c' line='15239' column='1'/>
+        <parameter type-id='91ce1af9' name='cookie' filepath='net/wireless/nl80211.c' line='15239' column='1'/>
+        <parameter type-id='bbaf3419' name='buf' filepath='net/wireless/nl80211.c' line='15240' column='1'/>
+        <parameter type-id='b59d7dce' name='len' filepath='net/wireless/nl80211.c' line='15240' column='1'/>
+        <parameter type-id='b50a4934' name='ack' filepath='net/wireless/nl80211.c' line='15240' column='1'/>
+        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='15240' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='cfg80211_gtk_rekey_notify' mangled-name='cfg80211_gtk_rekey_notify' filepath='net/wireless/nl80211.c' line='15552' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_gtk_rekey_notify'>
-        <parameter type-id='68a2d05b' name='dev' filepath='net/wireless/nl80211.c' line='15552' column='1'/>
-        <parameter type-id='bbaf3419' name='bssid' filepath='net/wireless/nl80211.c' line='15552' column='1'/>
-        <parameter type-id='bbaf3419' name='replay_ctr' filepath='net/wireless/nl80211.c' line='15553' column='1'/>
-        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='15553' column='1'/>
+      <function-decl name='cfg80211_gtk_rekey_notify' mangled-name='cfg80211_gtk_rekey_notify' filepath='net/wireless/nl80211.c' line='15553' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_gtk_rekey_notify'>
+        <parameter type-id='68a2d05b' name='dev' filepath='net/wireless/nl80211.c' line='15553' column='1'/>
+        <parameter type-id='bbaf3419' name='bssid' filepath='net/wireless/nl80211.c' line='15553' column='1'/>
+        <parameter type-id='bbaf3419' name='replay_ctr' filepath='net/wireless/nl80211.c' line='15554' column='1'/>
+        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='15554' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='cfg80211_pmksa_candidate_notify' mangled-name='cfg80211_pmksa_candidate_notify' filepath='net/wireless/nl80211.c' line='15609' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_pmksa_candidate_notify'>
-        <parameter type-id='68a2d05b' name='dev' filepath='net/wireless/nl80211.c' line='15609' column='1'/>
-        <parameter type-id='95e97e5e' name='index' filepath='net/wireless/nl80211.c' line='15609' column='1'/>
-        <parameter type-id='bbaf3419' name='bssid' filepath='net/wireless/nl80211.c' line='15610' column='1'/>
-        <parameter type-id='b50a4934' name='preauth' filepath='net/wireless/nl80211.c' line='15610' column='1'/>
-        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='15610' column='1'/>
+      <function-decl name='cfg80211_pmksa_candidate_notify' mangled-name='cfg80211_pmksa_candidate_notify' filepath='net/wireless/nl80211.c' line='15610' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_pmksa_candidate_notify'>
+        <parameter type-id='68a2d05b' name='dev' filepath='net/wireless/nl80211.c' line='15610' column='1'/>
+        <parameter type-id='95e97e5e' name='index' filepath='net/wireless/nl80211.c' line='15610' column='1'/>
+        <parameter type-id='bbaf3419' name='bssid' filepath='net/wireless/nl80211.c' line='15611' column='1'/>
+        <parameter type-id='b50a4934' name='preauth' filepath='net/wireless/nl80211.c' line='15611' column='1'/>
+        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='15611' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='cfg80211_ch_switch_notify' mangled-name='cfg80211_ch_switch_notify' filepath='net/wireless/nl80211.c' line='15661' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_ch_switch_notify'>
-        <parameter type-id='68a2d05b' name='dev' filepath='net/wireless/nl80211.c' line='15661' column='1'/>
-        <parameter type-id='0953fbfe' name='chandef' filepath='net/wireless/nl80211.c' line='15662' column='1'/>
+      <function-decl name='cfg80211_ch_switch_notify' mangled-name='cfg80211_ch_switch_notify' filepath='net/wireless/nl80211.c' line='15662' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_ch_switch_notify'>
+        <parameter type-id='68a2d05b' name='dev' filepath='net/wireless/nl80211.c' line='15662' column='1'/>
+        <parameter type-id='0953fbfe' name='chandef' filepath='net/wireless/nl80211.c' line='15663' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='cfg80211_tdls_oper_request' mangled-name='cfg80211_tdls_oper_request' filepath='net/wireless/nl80211.c' line='16063' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_tdls_oper_request'>
-        <parameter type-id='68a2d05b' name='dev' filepath='net/wireless/nl80211.c' line='16063' column='1'/>
-        <parameter type-id='bbaf3419' name='peer' filepath='net/wireless/nl80211.c' line='16063' column='1'/>
-        <parameter type-id='ee1b00fc' name='oper' filepath='net/wireless/nl80211.c' line='16064' column='1'/>
-        <parameter type-id='1dc6a898' name='reason_code' filepath='net/wireless/nl80211.c' line='16065' column='1'/>
-        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='16065' column='1'/>
+      <function-decl name='cfg80211_tdls_oper_request' mangled-name='cfg80211_tdls_oper_request' filepath='net/wireless/nl80211.c' line='16064' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_tdls_oper_request'>
+        <parameter type-id='68a2d05b' name='dev' filepath='net/wireless/nl80211.c' line='16064' column='1'/>
+        <parameter type-id='bbaf3419' name='peer' filepath='net/wireless/nl80211.c' line='16064' column='1'/>
+        <parameter type-id='ee1b00fc' name='oper' filepath='net/wireless/nl80211.c' line='16065' column='1'/>
+        <parameter type-id='1dc6a898' name='reason_code' filepath='net/wireless/nl80211.c' line='16066' column='1'/>
+        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='16066' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='cfg80211_ft_event' mangled-name='cfg80211_ft_event' filepath='net/wireless/nl80211.c' line='16167' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_ft_event'>
-        <parameter type-id='68a2d05b' name='netdev' filepath='net/wireless/nl80211.c' line='16167' column='1'/>
-        <parameter type-id='76db5996' name='ft_event' filepath='net/wireless/nl80211.c' line='16168' column='1'/>
+      <function-decl name='cfg80211_ft_event' mangled-name='cfg80211_ft_event' filepath='net/wireless/nl80211.c' line='16168' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_ft_event'>
+        <parameter type-id='68a2d05b' name='netdev' filepath='net/wireless/nl80211.c' line='16168' column='1'/>
+        <parameter type-id='76db5996' name='ft_event' filepath='net/wireless/nl80211.c' line='16169' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='cfg80211_ap_stopped' mangled-name='cfg80211_ap_stopped' filepath='net/wireless/nl80211.c' line='16249' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_ap_stopped'>
-        <parameter type-id='68a2d05b' name='netdev' filepath='net/wireless/nl80211.c' line='16249' column='1'/>
-        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='16249' column='1'/>
+      <function-decl name='cfg80211_ap_stopped' mangled-name='cfg80211_ap_stopped' filepath='net/wireless/nl80211.c' line='16250' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_ap_stopped'>
+        <parameter type-id='68a2d05b' name='netdev' filepath='net/wireless/nl80211.c' line='16250' column='1'/>
+        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='16250' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='cfg80211_external_auth_request' mangled-name='cfg80211_external_auth_request' filepath='net/wireless/nl80211.c' line='16289' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_external_auth_request'>
-        <parameter type-id='68a2d05b' name='dev' filepath='net/wireless/nl80211.c' line='16289' column='1'/>
-        <parameter type-id='2b041d55' name='params' filepath='net/wireless/nl80211.c' line='16290' column='1'/>
-        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='16291' column='1'/>
+      <function-decl name='cfg80211_external_auth_request' mangled-name='cfg80211_external_auth_request' filepath='net/wireless/nl80211.c' line='16290' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_external_auth_request'>
+        <parameter type-id='68a2d05b' name='dev' filepath='net/wireless/nl80211.c' line='16290' column='1'/>
+        <parameter type-id='2b041d55' name='params' filepath='net/wireless/nl80211.c' line='16291' column='1'/>
+        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='16292' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='cfg80211_update_owe_info_event' mangled-name='cfg80211_update_owe_info_event' filepath='net/wireless/nl80211.c' line='16330' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_update_owe_info_event'>
-        <parameter type-id='68a2d05b' name='netdev' filepath='net/wireless/nl80211.c' line='16330' column='1'/>
-        <parameter type-id='37104a66' name='owe_info' filepath='net/wireless/nl80211.c' line='16331' column='1'/>
-        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='16332' column='1'/>
+      <function-decl name='cfg80211_update_owe_info_event' mangled-name='cfg80211_update_owe_info_event' filepath='net/wireless/nl80211.c' line='16331' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_update_owe_info_event'>
+        <parameter type-id='68a2d05b' name='netdev' filepath='net/wireless/nl80211.c' line='16331' column='1'/>
+        <parameter type-id='37104a66' name='owe_info' filepath='net/wireless/nl80211.c' line='16332' column='1'/>
+        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/nl80211.c' line='16333' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
     </abi-instr>
@@ -135140,30 +136145,30 @@
         <parameter type-id='d2b455cb' name='privacy' filepath='net/wireless/scan.c' line='860' column='1'/>
         <return type-id='bda81d86'/>
       </function-decl>
-      <function-decl name='cfg80211_inform_bss_data' mangled-name='cfg80211_inform_bss_data' filepath='net/wireless/scan.c' line='1493' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_inform_bss_data'>
-        <parameter type-id='666fb412' name='wiphy' filepath='net/wireless/scan.c' line='1493' column='1'/>
-        <parameter type-id='6ff43814' name='data' filepath='net/wireless/scan.c' line='1494' column='1'/>
-        <parameter type-id='b556f108' name='ftype' filepath='net/wireless/scan.c' line='1495' column='1'/>
-        <parameter type-id='bbaf3419' name='bssid' filepath='net/wireless/scan.c' line='1496' column='1'/>
-        <parameter type-id='91ce1af9' name='tsf' filepath='net/wireless/scan.c' line='1496' column='1'/>
-        <parameter type-id='1dc6a898' name='capability' filepath='net/wireless/scan.c' line='1496' column='1'/>
-        <parameter type-id='1dc6a898' name='beacon_interval' filepath='net/wireless/scan.c' line='1497' column='1'/>
-        <parameter type-id='bbaf3419' name='ie' filepath='net/wireless/scan.c' line='1497' column='1'/>
-        <parameter type-id='b59d7dce' name='ielen' filepath='net/wireless/scan.c' line='1497' column='1'/>
-        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/scan.c' line='1498' column='1'/>
+      <function-decl name='cfg80211_inform_bss_data' mangled-name='cfg80211_inform_bss_data' filepath='net/wireless/scan.c' line='1495' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_inform_bss_data'>
+        <parameter type-id='666fb412' name='wiphy' filepath='net/wireless/scan.c' line='1495' column='1'/>
+        <parameter type-id='6ff43814' name='data' filepath='net/wireless/scan.c' line='1496' column='1'/>
+        <parameter type-id='b556f108' name='ftype' filepath='net/wireless/scan.c' line='1497' column='1'/>
+        <parameter type-id='bbaf3419' name='bssid' filepath='net/wireless/scan.c' line='1498' column='1'/>
+        <parameter type-id='91ce1af9' name='tsf' filepath='net/wireless/scan.c' line='1498' column='1'/>
+        <parameter type-id='1dc6a898' name='capability' filepath='net/wireless/scan.c' line='1498' column='1'/>
+        <parameter type-id='1dc6a898' name='beacon_interval' filepath='net/wireless/scan.c' line='1499' column='1'/>
+        <parameter type-id='bbaf3419' name='ie' filepath='net/wireless/scan.c' line='1499' column='1'/>
+        <parameter type-id='b59d7dce' name='ielen' filepath='net/wireless/scan.c' line='1499' column='1'/>
+        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/scan.c' line='1500' column='1'/>
         <return type-id='bda81d86'/>
       </function-decl>
-      <function-decl name='cfg80211_inform_bss_frame_data' mangled-name='cfg80211_inform_bss_frame_data' filepath='net/wireless/scan.c' line='1714' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_inform_bss_frame_data'>
-        <parameter type-id='666fb412' name='wiphy' filepath='net/wireless/scan.c' line='1714' column='1'/>
-        <parameter type-id='6ff43814' name='data' filepath='net/wireless/scan.c' line='1715' column='1'/>
-        <parameter type-id='57a568d1' name='mgmt' filepath='net/wireless/scan.c' line='1716' column='1'/>
-        <parameter type-id='b59d7dce' name='len' filepath='net/wireless/scan.c' line='1716' column='1'/>
-        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/scan.c' line='1717' column='1'/>
+      <function-decl name='cfg80211_inform_bss_frame_data' mangled-name='cfg80211_inform_bss_frame_data' filepath='net/wireless/scan.c' line='1716' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_inform_bss_frame_data'>
+        <parameter type-id='666fb412' name='wiphy' filepath='net/wireless/scan.c' line='1716' column='1'/>
+        <parameter type-id='6ff43814' name='data' filepath='net/wireless/scan.c' line='1717' column='1'/>
+        <parameter type-id='57a568d1' name='mgmt' filepath='net/wireless/scan.c' line='1718' column='1'/>
+        <parameter type-id='b59d7dce' name='len' filepath='net/wireless/scan.c' line='1718' column='1'/>
+        <parameter type-id='3eb7c31c' name='gfp' filepath='net/wireless/scan.c' line='1719' column='1'/>
         <return type-id='bda81d86'/>
       </function-decl>
-      <function-decl name='cfg80211_unlink_bss' mangled-name='cfg80211_unlink_bss' filepath='net/wireless/scan.c' line='1793' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_unlink_bss'>
-        <parameter type-id='666fb412' name='wiphy' filepath='net/wireless/scan.c' line='1793' column='1'/>
-        <parameter type-id='bda81d86' name='pub' filepath='net/wireless/scan.c' line='1793' column='1'/>
+      <function-decl name='cfg80211_unlink_bss' mangled-name='cfg80211_unlink_bss' filepath='net/wireless/scan.c' line='1795' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_unlink_bss'>
+        <parameter type-id='666fb412' name='wiphy' filepath='net/wireless/scan.c' line='1795' column='1'/>
+        <parameter type-id='bda81d86' name='pub' filepath='net/wireless/scan.c' line='1795' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
     </abi-instr>
@@ -135319,12 +136324,12 @@
         <parameter type-id='95e97e5e' name='freq' filepath='net/wireless/util.c' line='119' column='1'/>
         <return type-id='ec00acfb'/>
       </function-decl>
-      <function-decl name='ieee80211_hdrlen' mangled-name='ieee80211_hdrlen' filepath='net/wireless/util.c' line='351' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ieee80211_hdrlen'>
-        <parameter type-id='23119536' name='fc' filepath='net/wireless/util.c' line='351' column='1'/>
+      <function-decl name='ieee80211_hdrlen' mangled-name='ieee80211_hdrlen' filepath='net/wireless/util.c' line='386' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='ieee80211_hdrlen'>
+        <parameter type-id='23119536' name='fc' filepath='net/wireless/util.c' line='386' column='1'/>
         <return type-id='f0981eeb'/>
       </function-decl>
-      <function-decl name='cfg80211_calculate_bitrate' mangled-name='cfg80211_calculate_bitrate' filepath='net/wireless/util.c' line='1265' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_calculate_bitrate'>
-        <parameter type-id='185e765a' name='rate' filepath='net/wireless/util.c' line='1265' column='1'/>
+      <function-decl name='cfg80211_calculate_bitrate' mangled-name='cfg80211_calculate_bitrate' filepath='net/wireless/util.c' line='1303' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cfg80211_calculate_bitrate'>
+        <parameter type-id='185e765a' name='rate' filepath='net/wireless/util.c' line='1303' column='1'/>
         <return type-id='19c2251e'/>
       </function-decl>
     </abi-instr>
@@ -135388,6 +136393,11 @@
     <abi-instr address-size='64' path='security/security.c' language='LANG_C89'>
       <class-decl name='sctp_endpoint' is-struct='yes' visibility='default' is-declaration-only='yes' id='fe4590e9'/>
       <pointer-type-def type-id='fe4590e9' size-in-bits='64' id='21c8c371'/>
+      <function-decl name='security_sk_clone' mangled-name='security_sk_clone' filepath='security/security.c' line='1478' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='security_sk_clone'>
+        <parameter type-id='78e7cf52' name='sk' filepath='security/security.c' line='1478' column='1'/>
+        <parameter type-id='f772df6d' name='newsk' filepath='security/security.c' line='1478' column='1'/>
+        <return type-id='48b5725f'/>
+      </function-decl>
       <function-decl name='security_sock_graft' mangled-name='security_sock_graft' filepath='security/security.c' line='1496' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='security_sock_graft'>
         <parameter type-id='f772df6d' name='sk' filepath='security/security.c' line='1496' column='1'/>
         <parameter type-id='13103032' name='parent' filepath='security/security.c' line='1496' column='1'/>
@@ -138351,9 +139361,9 @@
         <parameter type-id='b9608bfc'/>
         <return type-id='b9608bfc'/>
       </function-decl>
-      <function-decl name='snd_power_wait' mangled-name='snd_power_wait' filepath='sound/core/init.c' line='1033' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='snd_power_wait'>
-        <parameter type-id='52704eb7' name='card' filepath='sound/core/init.c' line='1033' column='1'/>
-        <parameter type-id='f0981eeb' name='power_state' filepath='sound/core/init.c' line='1033' column='1'/>
+      <function-decl name='snd_power_wait' mangled-name='snd_power_wait' filepath='sound/core/init.c' line='1031' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='snd_power_wait'>
+        <parameter type-id='52704eb7' name='card' filepath='sound/core/init.c' line='1031' column='1'/>
+        <parameter type-id='f0981eeb' name='power_state' filepath='sound/core/init.c' line='1031' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
     </abi-instr>
@@ -142131,6 +143141,6 @@
 </abi-corpus-group>
 
 <!--
-     libabigail: abidw: 2.0.0-6bca1bdb-soong
+     libabigail: abidw: 2.0.0SOONG BUILD NUMBER PLACEHOLDER
      built with: clang: Android (7284624, based on r416183b) clang version 12.0.5 (https://android.googlesource.com/toolchain/llvm-project c935d99d7cf2016289302412d708641d52d2f7ee)
 -->

commit 8a2d85372f5dd6fc1110247fc9b4c91b2ce42809
Author: J. Avila <elavila@google.com>
Date:   Mon Jun 21 21:58:09 2021 +0000

    ANDROID: GKI: Update the symbol list
    
    Add the symbols needed for virtio_console and hci_vhci.
    
    Bug: 191700886
    Signed-off-by: J. Avila <elavila@google.com>
    Change-Id: I96ee5990cdfa2da5fe0d1eaaf610b193a6b7b1bb

diff --git a/android/abi_gki_aarch64_cuttlefish b/android/abi_gki_aarch64_cuttlefish
index 5cfb4be99fc0..15e4702f51c8 100644
--- a/android/abi_gki_aarch64_cuttlefish
+++ b/android/abi_gki_aarch64_cuttlefish
@@ -14,14 +14,18 @@
   bpf_trace_run8
   cancel_delayed_work
   cancel_delayed_work_sync
+  cancel_work_sync
   capable
   cfg80211_inform_bss_data
   cfg80211_put_bss
   __cfi_slowpath
   __check_object_size
+  __class_create
+  class_destroy
   complete
   __const_udelay
   consume_skb
+  _copy_from_iter_full
   _copy_to_iter
   cpu_hwcap_keys
   cpu_hwcaps
@@ -59,6 +63,7 @@
   free_irq
   free_netdev
   __free_pages
+  freezing_slow_path
   get_device
   get_random_bytes
   get_unused_fd_flags
@@ -127,6 +132,7 @@
   netif_tx_stop_all_queues
   netif_tx_wake_queue
   no_llseek
+  nonseekable_open
   noop_llseek
   nr_cpu_ids
   of_find_property
@@ -185,6 +191,7 @@
   __rcu_read_unlock
   refcount_dec_and_test_checked
   refcount_inc_checked
+  __refrigerator
   register_netdev
   register_netdevice_notifier
   register_virtio_device
@@ -203,6 +210,7 @@
   sg_init_table
   sg_next
   skb_clone
+  skb_dequeue
   skb_put
   sk_free
   snd_device_new
@@ -221,7 +229,10 @@
   strstr
   synchronize_irq
   synchronize_net
+  sysfs_create_group
   sysfs_create_groups
+  sysfs_remove_group
+  system_freezing_cnt
   system_wq
   trace_define_field
   trace_event_buffer_commit
@@ -234,6 +245,7 @@
   trace_raw_output_prep
   trace_seq_printf
   __udelay
+  unlock_page
   unregister_netdev
   unregister_netdevice_notifier
   unregister_netdevice_queue
@@ -265,6 +277,7 @@
   vring_del_virtqueue
   vring_interrupt
   vring_transport_features
+  wait_for_completion
   wait_woken
   __wake_up
   __warn_printk
@@ -381,6 +394,19 @@
   serdev_device_write
   serdev_device_write_wakeup
 
+# required by hci_vhci.ko
+  bt_err
+  hci_alloc_dev
+  hci_free_dev
+  hci_recv_frame
+  hci_register_dev
+  hci_unregister_dev
+  skb_pull
+  skb_push
+  skb_queue_head
+  skb_queue_purge
+  skb_queue_tail
+
 # required by incrementalfs.ko
   bin2hex
   __break_lease
@@ -429,10 +455,12 @@
   match_int
   match_token
   notify_change
+  override_creds
   pagecache_get_page
   path_get
   path_put
   register_filesystem
+  revert_creds
   seq_puts
   set_anon_super
   sget
@@ -441,11 +469,8 @@
   simple_statfs
   strndup_user
   sync_filesystem
-  sysfs_create_group
-  sysfs_remove_group
   truncate_inode_pages
   unlock_new_inode
-  unlock_page
   unlock_rename
   unregister_filesystem
   user_path_at_empty
@@ -467,7 +492,6 @@
   dma_buf_export
   dma_buf_fd
   dma_buf_put
-  freezing_slow_path
   kernel_kobj
   kthread_create_on_node
   __ll_sc_atomic64_sub_return
@@ -476,7 +500,6 @@
   ptr_to_hashval
   rb_erase
   rb_insert_color
-  __refrigerator
   register_shrinker
   remap_pfn_range
   sched_setscheduler
@@ -484,7 +507,6 @@
   __sg_page_iter_next
   __sg_page_iter_start
   split_page
-  system_freezing_cnt
   totalram_pages
   vmap
   vunmap
@@ -575,8 +597,6 @@
   cdev_device_add
   cdev_device_del
   cdev_init
-  __class_create
-  class_destroy
   __compat_only_sysfs_link_entry_to_kobj
   del_timer_sync
   device_initialize
@@ -614,7 +634,6 @@
   blk_queue_update_dma_pad
   bpf_trace_run4
   bpf_trace_run5
-  cancel_work_sync
   clk_disable
   clk_enable
   clk_prepare
@@ -836,7 +855,6 @@
   ww_mutex_unlock
 
 # required by virtio-rng.ko
-  wait_for_completion
   wait_for_completion_killable
 
 # required by virtio_blk.ko
@@ -879,6 +897,29 @@
   __sysfs_match_string
   unregister_blkdev
 
+# required by virtio_console.ko
+  cdev_add
+  cdev_alloc
+  cdev_del
+  device_create
+  device_destroy
+  dma_alloc_from_dev_coherent
+  dma_release_from_dev_coherent
+  fasync_helper
+  hvc_alloc
+  hvc_instantiate
+  hvc_kick
+  hvc_poll
+  hvc_remove
+  __hvc_resize
+  kill_fasync
+  kobject_uevent
+  pipe_lock
+  pipe_unlock
+  __register_chrdev
+  __splice_from_pipe
+  __unregister_chrdev
+
 # required by virtio_input.ko
   input_alloc_absinfo
   input_allocate_device
@@ -987,12 +1028,10 @@
 
 # required by vmw_vsock_virtio_transport_common.ko
   bpf_trace_run10
-  _copy_from_iter_full
 
 # required by vsock.ko
   autoremove_wake_function
   init_user_ns
-  nonseekable_open
   ns_capable_noaudit
   prandom_u32
   prepare_to_wait
@@ -1000,9 +1039,9 @@
   proto_unregister
   _raw_write_lock_bh
   _raw_write_unlock_bh
+  security_sk_clone
   security_sock_graft
   sk_alloc
-  skb_dequeue
   sock_init_data
   sock_no_accept
   sock_no_getsockopt

commit 6ffe953d26f098ae5693d6364bf57d2eafe8289a
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Mon Jun 21 14:32:33 2021 +0800

    drm/rockchip: vop2: No register mirror win when only one vp used
    
    when only one vp(crtc) is registered to drm, all the
    plane->possible_crtc will be force set to this crtc.
    this make current hwc think that all these planes can be
    assigned to this crtc, but the mirror plane(rk3566 feature)
    cant't be activated on the same crtc with source plane.
    
    So if some boards only use one vp(crtc), don't register
    mirror plane.
    
    Change-Id: Ib25246cf44a0fc4caf98e7c6d21ebba18f1a6c88
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
index b26de3a437b3..30a1a035562e 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
@@ -40,6 +40,15 @@
 #define WIN_FEATURE_AFBDC		BIT(3)
 #define WIN_FEATURE_CLUSTER_MAIN	BIT(4)
 #define WIN_FEATURE_CLUSTER_SUB		BIT(5)
+/* a mirror win can only get fb address
+ * from source win:
+ * Cluster1---->Cluster0
+ * Esmart1 ---->Esmart0
+ * Smart1  ---->Smart0
+ * This is a feather on rk3566
+ */
+#define WIN_FEATURE_MIRROR		BIT(6)
+
 
 #define VOP2_SOC_VARIANT		4
 
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 94e18b9fd3bb..a80f1c352c35 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -711,6 +711,11 @@ static bool vop2_soc_is_rk3566(void)
 	return soc_is_rk3566();
 }
 
+static bool vop2_is_mirror_win(struct vop2_win *win)
+{
+	return soc_is_rk3566() && (win->feature & WIN_FEATURE_MIRROR);
+}
+
 static uint64_t vop2_soc_id_fixup(uint64_t soc_id)
 {
 	switch (soc_id) {
@@ -6077,6 +6082,7 @@ static int vop2_create_crtc(struct vop2 *vop2)
 	const struct vop2_video_port_data *vp_data;
 	uint32_t possible_crtcs;
 	uint64_t soc_id;
+	uint32_t registered_num_crtcs = 0;
 	char dclk_name[9];
 	int i = 0, j = 0, k = 0;
 	int ret = 0;
@@ -6230,6 +6236,7 @@ static int vop2_create_crtc(struct vop2 *vop2)
 		drm_object_attach_property(&crtc->base,
 					   drm_dev->mode_config.tv_bottom_margin_property, 100);
 		vop2_crtc_create_plane_mask_property(vop2, crtc);
+		registered_num_crtcs++;
 	}
 
 	/*
@@ -6260,6 +6267,11 @@ static int vop2_create_crtc(struct vop2 *vop2)
 
 		if (win->type != DRM_PLANE_TYPE_OVERLAY)
 			continue;
+		/*
+		 * Only dual display(which need two crtcs) need mirror win
+		 */
+		if (registered_num_crtcs < 2 && vop2_is_mirror_win(win))
+			continue;
 
 		ret = vop2_plane_init(vop2, win, possible_crtcs);
 		if (ret)
@@ -6338,6 +6350,7 @@ static int vop2_win_init(struct vop2 *vop2)
 			area->regs = regs;
 			area->type = DRM_PLANE_TYPE_OVERLAY;
 			area->formats = win->formats;
+			area->feature = win->feature;
 			area->nformats = win->nformats;
 			area->format_modifiers = win->format_modifiers;
 			area->max_upscale_factor = win_data->max_upscale_factor;
diff --git a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
index 59c101307eed..7b76e5e6ed0b 100644
--- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
+++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
@@ -1043,6 +1043,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
 	  .max_upscale_factor = 8,
 	  .max_downscale_factor = 8,
 	  .dly = { 20, 47, 41 },
+	  .feature = WIN_FEATURE_MIRROR,
 	},
 
 	{
@@ -1065,6 +1066,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
 	  .max_upscale_factor = 8,
 	  .max_downscale_factor = 8,
 	  .dly = { 20, 47, 41 },
+	  .feature = WIN_FEATURE_MIRROR,
 	},
 
 	{
@@ -1150,7 +1152,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
 	  .max_upscale_factor = 4,
 	  .max_downscale_factor = 4,
 	  .dly = { 0, 27, 21 },
-	  .feature = WIN_FEATURE_AFBDC | WIN_FEATURE_CLUSTER_MAIN,
+	  .feature = WIN_FEATURE_AFBDC | WIN_FEATURE_CLUSTER_MAIN | WIN_FEATURE_MIRROR,
 	},
 
 	{
@@ -1170,7 +1172,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
 	  .type = DRM_PLANE_TYPE_OVERLAY,
 	  .max_upscale_factor = 4,
 	  .max_downscale_factor = 4,
-	  .feature = WIN_FEATURE_AFBDC | WIN_FEATURE_CLUSTER_SUB,
+	  .feature = WIN_FEATURE_AFBDC | WIN_FEATURE_CLUSTER_SUB | WIN_FEATURE_MIRROR,
 	},
 };
 

commit 754bb09b98ce0716ca9b1d8014c18cbe4ec1b73d
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Mon Jun 7 20:06:50 2021 +0800

    drm/rockchip: vop2: close cluster sub win when main win is closed
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: Ifad854f2e70fe3487731f6cd1d3c41f2a512087e

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index ac4d96a7b370..94e18b9fd3bb 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -1101,8 +1101,20 @@ static void vop2_win_disable(struct vop2_win *win)
 	struct vop2 *vop2 = win->vop2;
 
 	VOP_WIN_SET(vop2, win, enable, 0);
-	if (win->feature & WIN_FEATURE_CLUSTER_MAIN)
+	if (win->feature & WIN_FEATURE_CLUSTER_MAIN) {
+		struct vop2_win *sub_win;
+		int i = 0;
+
+		for (i = 0; i < vop2->registered_num_wins; i++) {
+			sub_win = &vop2->win[i];
+
+			if ((sub_win->phys_id == win->phys_id) &&
+			    (sub_win->feature & WIN_FEATURE_CLUSTER_SUB))
+				VOP_WIN_SET(vop2, sub_win, enable, 0);
+		}
+
 		VOP_CLUSTER_SET(vop2, win, enable, 0);
+	}
 }
 
 static inline void vop2_write_lut(struct vop2 *vop2, uint32_t offset, uint32_t v)

commit 05c93d1db1e39bb0d2f7407d4d7e10ba610ac031
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Fri May 21 20:45:24 2021 +0800

    drm/rockchip: vop: Set output mode to P888 before send mcu cmd
    
    VOP will do a dither logic transform when output is not P888,
    this will make send wrong cmd.
    
    Change-Id: Id289d90f029be457269d039d68f43a7cf1867eb2
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index 86480ce86a2f..6b84508a5339 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -1543,6 +1543,7 @@ static void vop_crtc_atomic_disable(struct drm_crtc *crtc,
 	VOP_CTRL_SET(vop, reg_done_frm, 1);
 	VOP_CTRL_SET(vop, dsp_interlace, 0);
 	drm_crtc_vblank_off(crtc);
+	VOP_CTRL_SET(vop, out_mode, ROCKCHIP_OUT_MODE_P888);
 	VOP_CTRL_SET(vop, afbdc_en, 0);
 	vop_disable_all_planes(vop);
 
@@ -2724,14 +2725,41 @@ static void vop_crtc_close(struct drm_crtc *crtc)
 	mutex_unlock(&vop->vop_lock);
 }
 
+static u32 vop_mode_done(struct vop *vop)
+{
+	return VOP_CTRL_GET(vop, out_mode);
+}
+
+static void vop_set_out_mode(struct vop *vop, u32 mode)
+{
+	int ret;
+	u32 val;
+
+	VOP_CTRL_SET(vop, out_mode, mode);
+	vop_cfg_done(vop);
+	ret = readx_poll_timeout(vop_mode_done, vop, val, val == mode,
+				 1000, 500 * 1000);
+	if (ret)
+		dev_err(vop->dev, "wait mode 0x%x timeout\n", mode);
+
+}
+
 static void vop_crtc_send_mcu_cmd(struct drm_crtc *crtc,  u32 type, u32 value)
 {
+	struct rockchip_crtc_state *state;
 	struct vop *vop = NULL;
 
 	if (!crtc)
 		return;
 
 	vop = to_vop(crtc);
+	state = to_rockchip_crtc_state(crtc->state);
+
+	/*
+	 * set output mode to P888 when start send cmd.
+	 */
+	if ((type == MCU_SETBYPASS) && value)
+		vop_set_out_mode(vop, ROCKCHIP_OUT_MODE_P888);
 	mutex_lock(&vop->vop_lock);
 	if (vop && vop->is_enabled) {
 		switch (type) {
@@ -2752,6 +2780,12 @@ static void vop_crtc_send_mcu_cmd(struct drm_crtc *crtc,  u32 type, u32 value)
 		}
 	}
 	mutex_unlock(&vop->vop_lock);
+
+	/*
+	 * restore output mode at the end
+	 */
+	if ((type == MCU_SETBYPASS) && !value)
+		vop_set_out_mode(vop, state->output_mode);
 }
 
 static const struct rockchip_crtc_funcs private_crtc_funcs = {

commit 96ec87171827bf678ce283d53e3d9ac1c26686e1
Author: ZhiZhan Chen <zhizhan.chen@rock-chips.com>
Date:   Tue Jun 15 11:28:55 2021 +0800

    arm64: dts: rockchip: use cluster for cursor on rk3568-evb1-ddr4-v10-linux.dts
    
    Signed-off-by: ZhiZhan Chen <zhizhan.chen@rock-chips.com>
    Change-Id: Icf667a4598a93b672777587775673539018bf4bc

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10-linux.dts b/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10-linux.dts
index 55c255998473..b6b618bb561a 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10-linux.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10-linux.dts
@@ -6,3 +6,12 @@
 
 #include "rk3568-evb1-ddr4-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>;
+};

commit 141645215d92f9d6418126eb712b9ce5737b24fd
Author: Caesar Wang <wxt@rock-chips.com>
Date:   Fri Jun 18 17:09:19 2021 +0800

    Revert "arm64: dts: rockchip: disable afbc by default on rk3568-linux.dtsi"
    
    This reverts commit bcd00049f4b995b74229b9f8da221bbd12069733
    
    Fixed by commit bba5e44c03a3
    ("drm/rockchip: vop2: Move Primary window to head and Cluster to tail")
    
    Signed-off-by: Caesar Wang <wxt@rock-chips.com>
    Change-Id: Id7f0ce15fcbc7cf0edb9c74ee5ca7f6ee2f2d20a

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
index 32c1aeae8d71..3f4d0e9a0fdc 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
@@ -53,7 +53,3 @@
 &rng {
 	status = "okay";
 };
-
-&vop {
-	disable-afbc-win;
-};

commit 7b9018beed1765867ba48f5b35bff8de7b6c4922
Author: Herman Chen <herman.chen@rock-chips.com>
Date:   Sat May 15 17:38:43 2021 +0800

    video: rockchip: mpp: Use kthread to process task
    
    The kthread has less context switch overhead comparing to workqueue.
    
    Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
    Change-Id: I509d8cd86c0966a2bfee8cb8459753368050b2b3

diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c
index 185076ffe901..9f6c55640d22 100644
--- a/drivers/video/rockchip/mpp/mpp_common.c
+++ b/drivers/video/rockchip/mpp/mpp_common.c
@@ -189,7 +189,7 @@ mpp_taskqueue_pop_running(struct mpp_taskqueue *queue,
 static void
 mpp_taskqueue_trigger_work(struct mpp_dev *mpp)
 {
-	queue_work(mpp->workq, &mpp->work);
+	kthread_queue_work(&mpp->worker, &mpp->work);
 }
 
 int mpp_power_on(struct mpp_dev *mpp)
@@ -541,7 +541,7 @@ static int mpp_task_run(struct mpp_dev *mpp,
 	return 0;
 }
 
-static void mpp_task_try_run(struct work_struct *work_s)
+static void mpp_task_try_run(struct kthread_work *work_s)
 {
 	struct mpp_task *task;
 	struct mpp_dev *mpp = container_of(work_s, struct mpp_dev, work);
@@ -1668,14 +1668,21 @@ int mpp_dev_probe(struct mpp_dev *mpp,
 
 	/* Get disable auto frequent flag from dtsi */
 	mpp->auto_freq_en = !device_property_read_bool(dev, "rockchip,disable-auto-freq");
+
+	kthread_init_worker(&mpp->worker);
+	mpp->kworker_task = kthread_run(kthread_worker_fn, &mpp->worker,
+					"%s", np->name);
+
 	/* read link table capacity */
 	ret = of_property_read_u32(np, "rockchip,task-capacity",
 				   &mpp->task_capacity);
 	if (ret) {
 		mpp->task_capacity = 1;
-		INIT_WORK(&mpp->work, mpp_task_try_run);
+		kthread_init_work(&mpp->work, mpp_task_try_run);
 	} else {
-		INIT_WORK(&mpp->work, NULL);
+		dev_info(dev, "%d task capacity link mode detected\n",
+			 mpp->task_capacity);
+		kthread_init_work(&mpp->work, NULL);
 	}
 
 	/* Get and attach to service */
@@ -1685,12 +1692,6 @@ int mpp_dev_probe(struct mpp_dev *mpp,
 		return -ENODEV;
 	}
 
-	mpp->workq = create_singlethread_workqueue(np->name);
-	if (!mpp->workq) {
-		dev_err(dev, "failed to create workqueue\n");
-		return -ENOMEM;
-	}
-
 	mpp->dev = dev;
 	mpp->hw_ops = mpp->var->hw_ops;
 	mpp->dev_ops = mpp->var->dev_ops;
@@ -1769,7 +1770,11 @@ int mpp_dev_probe(struct mpp_dev *mpp,
 failed_init:
 	pm_runtime_put_sync(dev);
 failed:
-	destroy_workqueue(mpp->workq);
+	if (mpp->kworker_task) {
+		kthread_flush_worker(&mpp->worker);
+		kthread_stop(mpp->kworker_task);
+		mpp->kworker_task = NULL;
+	}
 	mpp_detach_workqueue(mpp);
 	device_init_wakeup(dev, false);
 	pm_runtime_disable(dev);
@@ -1785,9 +1790,10 @@ int mpp_dev_remove(struct mpp_dev *mpp)
 	mpp_iommu_remove(mpp->iommu_info);
 	platform_device_put(mpp->pdev_srv);
 
-	if (mpp->workq) {
-		destroy_workqueue(mpp->workq);
-		mpp->workq = NULL;
+	if (mpp->kworker_task) {
+		kthread_flush_worker(&mpp->worker);
+		kthread_stop(mpp->kworker_task);
+		mpp->kworker_task = NULL;
 	}
 
 	mpp_detach_workqueue(mpp);
diff --git a/drivers/video/rockchip/mpp/mpp_common.h b/drivers/video/rockchip/mpp/mpp_common.h
index 1dbbe6addce3..5c0a5f2f7e8f 100644
--- a/drivers/video/rockchip/mpp/mpp_common.h
+++ b/drivers/video/rockchip/mpp/mpp_common.h
@@ -18,6 +18,7 @@
 #include <linux/types.h>
 #include <linux/time.h>
 #include <linux/workqueue.h>
+#include <linux/kthread.h>
 #include <linux/reset.h>
 #include <linux/irqreturn.h>
 #include <linux/poll.h>
@@ -281,12 +282,15 @@ struct mpp_dev {
 	struct mpp_hw_ops *hw_ops;
 	struct mpp_dev_ops *dev_ops;
 
-	/* per-device work for attached taskqueue */
-	struct work_struct work;
+	/* kworker for attached taskqueue */
+	struct kthread_worker worker;
 	/* task for work queue */
-	struct workqueue_struct *workq;
+	struct task_struct *kworker_task;
+	/* per-device work for attached taskqueue */
+	struct kthread_work work;
 	/* the flag for get/get/reduce freq */
 	bool auto_freq_en;
+
 	/*
 	 * The task capacity is the task queue length that hardware can accept.
 	 * Default 1 means normal hardware can only accept one task at once.

commit bc3c93ff07c0f92dec32660b23c609d2dd00783b
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Mon May 17 16:42:40 2021 +0800

    drm/rockchip: vop2: wait port_mux cfg done before configure new plane
    
    We need two vsync cycle when move a window from
    on vp to another: the port_mux take effect in
    first vsync, than enable the window at second
    vsync.
    
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>
    Change-Id: I87c1ac0803081ecb201d9218d40fdea89424fbd8

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 5e671bdb1004..ac4d96a7b370 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -441,6 +441,13 @@ struct vop2_video_port {
 	 *
 	 */
 	bool sdr2hdr_en;
+	/**
+	 * @skip_vsync: skip on vsync when port_mux changed on this vp.
+	 * a win move from one VP to another need wait one vsync until
+	 * port_mut take effect before this win can be enabled.
+	 *
+	 */
+	bool skip_vsync;
 
 	/**
 	 * @bg_ovl_dly: The timing delay from background layer
@@ -930,6 +937,7 @@ static void vop2_wait_for_port_mux_done(struct vop2 *vop2)
 			      port_mux_cfg, vop2->port_mux_cfg);
 }
 
+
 static int32_t vop2_pending_done_bits(struct vop2_video_port *vp)
 {
 	struct vop2 *vop2 = vp->vop2;
@@ -2977,14 +2985,14 @@ static void vop2_plane_atomic_update(struct drm_plane *plane, struct drm_plane_s
 
 	/*
 	 * This means this window is moved from another vp
-	 * so the VOP2_PORT_SEL register is changed
-	 * in this commit, we should not change this
-	 * win register before the VOP2_PORT_SEL take effect
-	 * on this VP, so skip this frame for safe.
+	 * so the VOP2_PORT_SEL register is changed and
+	 * take effect by vop2_wait_for_port_mux_done
+	 * in this commit. so we can continue configure
+	 * the window and report vsync
 	 */
 	if (win->old_vp_mask != win->vp_mask) {
 		win->old_vp_mask = win->vp_mask;
-		return;
+		vp->skip_vsync = false;
 	}
 
 	actual_w = drm_rect_width(src) >> 16;
@@ -4826,6 +4834,21 @@ static void vop2_setup_alpha(struct vop2_video_port *vp,
 	}
 }
 
+static void vop2_setup_port_mux(struct vop2_video_port *vp, uint16_t port_mux_cfg)
+{
+	struct vop2 *vop2 = vp->vop2;
+
+	spin_lock(&vop2->reg_lock);
+	if (vop2->port_mux_cfg != port_mux_cfg) {
+		VOP_CTRL_SET(vop2, ovl_port_mux_cfg, port_mux_cfg);
+		vp->skip_vsync = true;
+		vop2_cfg_done(&vp->crtc);
+		vop2->port_mux_cfg = port_mux_cfg;
+		vop2_wait_for_port_mux_done(vop2);
+	}
+	spin_unlock(&vop2->reg_lock);
+}
+
 static void vop2_setup_layer_mixer_for_vp(struct vop2_video_port *vp,
 					  const struct vop2_zpos *vop2_zpos)
 {
@@ -4873,12 +4896,6 @@ static void vop2_setup_layer_mixer_for_vp(struct vop2_video_port *vp,
 
 	port_mux_cfg |= 7 << (4 * (vop2->data->nr_vps - 1));
 
-	vop2_wait_for_port_mux_done(vop2);
-	vop2->port_mux_cfg = port_mux_cfg;
-	VOP_CTRL_SET(vop2, ovl_port_mux_cfg, port_mux_cfg);
-	VOP_CTRL_SET(vop2, ovl_cfg_done_port, port_id);
-	VOP_CTRL_SET(vop2, ovl_port_mux_cfg_done_imd, 0);
-
 	/*
 	 * Win and layer must map one by one, if a win is selected
 	 * by two layers, unexpected error may happen.
@@ -4908,6 +4925,10 @@ static void vop2_setup_layer_mixer_for_vp(struct vop2_video_port *vp,
 		win->layer_id = layer_id;
 		layer->win_phys_id = win_phys_id;
 	}
+
+	VOP_CTRL_SET(vop2, ovl_cfg_done_port, vp->id);
+	VOP_CTRL_SET(vop2, ovl_port_mux_cfg_done_imd, 0);
+	vop2_setup_port_mux(vp, port_mux_cfg);
 }
 
 static void vop2_setup_dly_for_vp(struct vop2_video_port *vp)
@@ -5720,7 +5741,7 @@ static irqreturn_t vop2_isr(int irq, void *data)
 
 		if (active_irqs & FS_FIELD_INTR) {
 			vop2_wb_handler(vp);
-			if (vp->layer_sel_update == false) {
+			if (likely(!vp->skip_vsync) || (vp->layer_sel_update == false)) {
 				drm_crtc_handle_vblank(crtc);
 				vop2_handle_vblank(vop2, crtc);
 			}

commit bba5e44c03a3198be98219d241a1a82b995e39f4
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Wed Jun 16 15:51:15 2021 +0800

    drm/rockchip: vop2: Move Primary window to head and Cluster to tail
    
    This make primary win register first to get the lower zpos.
    
    Also hide the cluster win to the tail, give it a lower chance to
    be found by some tradional display sorftware(etc X11).
    
    Change-Id: I20e4885c6b18d7eec6ecc32fbf1ac5620fbb8a30
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
index 835571bbbc22..59c101307eed 100644
--- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
+++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
@@ -1001,6 +1001,94 @@ static const struct vop2_win_regs rk3568_esmart_win_data = {
  * @TODO describe the wind like cpu-map dt nodes;
  */
 static const struct vop2_win_data rk3568_vop_win_data[] = {
+	{
+	  .name = "Smart0-win0",
+	  .phys_id = 4,
+	  .base = 0x400,
+	  .formats = formats_win_lite,
+	  .nformats = ARRAY_SIZE(formats_win_lite),
+	  .format_modifiers = format_modifiers,
+	  .layer_sel_id = 3,
+	  .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,
+	  .regs = &rk3568_esmart_win_data,
+	  .area = rk3568_area_data,
+	  .area_size = ARRAY_SIZE(rk3568_area_data),
+	  .type = DRM_PLANE_TYPE_PRIMARY,
+	  .max_upscale_factor = 8,
+	  .max_downscale_factor = 8,
+	  .dly = { 20, 47, 41 },
+	},
+
+	{
+	  .name = "Smart1-win0",
+	  .phys_id = 5,
+	  .formats = formats_win_lite,
+	  .nformats = ARRAY_SIZE(formats_win_lite),
+	  .format_modifiers = format_modifiers,
+	  .base = 0x600,
+	  .layer_sel_id = 7,
+	  .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,
+	  .regs = &rk3568_esmart_win_data,
+	  .area = rk3568_area_data,
+	  .area_size = ARRAY_SIZE(rk3568_area_data),
+	  .type = DRM_PLANE_TYPE_PRIMARY,
+	  .max_upscale_factor = 8,
+	  .max_downscale_factor = 8,
+	  .dly = { 20, 47, 41 },
+	},
+
+	{
+	  .name = "Esmart1-win0",
+	  .phys_id = 3,
+	  .formats = formats_win_full_10bit_yuyv,
+	  .nformats = ARRAY_SIZE(formats_win_full_10bit_yuyv),
+	  .format_modifiers = format_modifiers,
+	  .base = 0x200,
+	  .layer_sel_id = 6,
+	  .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,
+	  .regs = &rk3568_esmart_win_data,
+	  .area = rk3568_area_data,
+	  .area_size = ARRAY_SIZE(rk3568_area_data),
+	  .type = DRM_PLANE_TYPE_PRIMARY,
+	  .max_upscale_factor = 8,
+	  .max_downscale_factor = 8,
+	  .dly = { 20, 47, 41 },
+	},
+
+	{
+	  .name = "Esmart0-win0",
+	  .phys_id = 2,
+	  .formats = formats_win_full_10bit_yuyv,
+	  .nformats = ARRAY_SIZE(formats_win_full_10bit_yuyv),
+	  .format_modifiers = format_modifiers,
+	  .base = 0x0,
+	  .layer_sel_id = 2,
+	  .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,
+	  .regs = &rk3568_esmart_win_data,
+	  .area = rk3568_area_data,
+	  .area_size = ARRAY_SIZE(rk3568_area_data),
+	  .type = DRM_PLANE_TYPE_OVERLAY,
+	  .max_upscale_factor = 8,
+	  .max_downscale_factor = 8,
+	  .dly = { 20, 47, 41 },
+	},
+
 	{
 	  .name = "Cluster0-win0",
 	  .phys_id = 0,
@@ -1084,94 +1172,6 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
 	  .max_downscale_factor = 4,
 	  .feature = WIN_FEATURE_AFBDC | WIN_FEATURE_CLUSTER_SUB,
 	},
-
-	{
-	  .name = "Esmart0-win0",
-	  .phys_id = 2,
-	  .formats = formats_win_full_10bit_yuyv,
-	  .nformats = ARRAY_SIZE(formats_win_full_10bit_yuyv),
-	  .format_modifiers = format_modifiers,
-	  .base = 0x0,
-	  .layer_sel_id = 2,
-	  .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,
-	  .regs = &rk3568_esmart_win_data,
-	  .area = rk3568_area_data,
-	  .area_size = ARRAY_SIZE(rk3568_area_data),
-	  .type = DRM_PLANE_TYPE_OVERLAY,
-	  .max_upscale_factor = 8,
-	  .max_downscale_factor = 8,
-	  .dly = { 20, 47, 41 },
-	},
-
-	{
-	  .name = "Esmart1-win0",
-	  .phys_id = 3,
-	  .formats = formats_win_full_10bit_yuyv,
-	  .nformats = ARRAY_SIZE(formats_win_full_10bit_yuyv),
-	  .format_modifiers = format_modifiers,
-	  .base = 0x200,
-	  .layer_sel_id = 6,
-	  .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,
-	  .regs = &rk3568_esmart_win_data,
-	  .area = rk3568_area_data,
-	  .area_size = ARRAY_SIZE(rk3568_area_data),
-	  .type = DRM_PLANE_TYPE_PRIMARY,
-	  .max_upscale_factor = 8,
-	  .max_downscale_factor = 8,
-	  .dly = { 20, 47, 41 },
-	},
-
-	{
-	  .name = "Smart0-win0",
-	  .phys_id = 4,
-	  .base = 0x400,
-	  .formats = formats_win_lite,
-	  .nformats = ARRAY_SIZE(formats_win_lite),
-	  .format_modifiers = format_modifiers,
-	  .layer_sel_id = 3,
-	  .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,
-	  .regs = &rk3568_esmart_win_data,
-	  .area = rk3568_area_data,
-	  .area_size = ARRAY_SIZE(rk3568_area_data),
-	  .type = DRM_PLANE_TYPE_PRIMARY,
-	  .max_upscale_factor = 8,
-	  .max_downscale_factor = 8,
-	  .dly = { 20, 47, 41 },
-	},
-
-	{
-	  .name = "Smart1-win0",
-	  .phys_id = 5,
-	  .formats = formats_win_lite,
-	  .nformats = ARRAY_SIZE(formats_win_lite),
-	  .format_modifiers = format_modifiers,
-	  .base = 0x600,
-	  .layer_sel_id = 7,
-	  .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,
-	  .regs = &rk3568_esmart_win_data,
-	  .area = rk3568_area_data,
-	  .area_size = ARRAY_SIZE(rk3568_area_data),
-	  .type = DRM_PLANE_TYPE_PRIMARY,
-	  .max_upscale_factor = 8,
-	  .max_downscale_factor = 8,
-	  .dly = { 20, 47, 41 },
-	},
 };
 
 static const struct vop_grf_ctrl rk3568_grf_ctrl = {

commit 7c867f02145a215c981454be9b31d5ea0907a7ca
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Fri Jun 11 17:19:33 2021 +0800

    drm/rockchip: vop2: Only register used vp to drm
    
    A registered vp(crtc) need a primary plane, some
    linux style display software(X11/weston) want more
    overlay plane, so we don't register unused vp to
    same some plane for overlay.
    
    Change-Id: I66846af7364d1a20f38f35d65ed3fe34b7f280ab
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index d9e7cbd73980..5e671bdb1004 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -5942,6 +5942,8 @@ static int vop2_gamma_init(struct vop2 *vop2)
 	for (i = 0; i < vop2_data->nr_vps; i++) {
 		vp = &vop2->vps[i];
 		crtc = &vp->crtc;
+		if (!crtc->dev)
+			continue;
 		vp_data = &vop2_data->vp[vp->id];
 		lut_len = vp_data->gamma_lut_len;
 		vp->gamma_lut_len = vp_data->gamma_lut_len;
@@ -5984,6 +5986,8 @@ static void vop2_cubic_lut_init(struct vop2 *vop2)
 	for (i = 0; i < vop2_data->nr_vps; i++) {
 		vp = &vop2->vps[i];
 		crtc = &vp->crtc;
+		if (!crtc->dev)
+			continue;
 		vp_data = &vop2_data->vp[vp->id];
 		vp->cubic_lut_len = vp_data->cubic_lut_len;
 
@@ -6045,10 +6049,26 @@ static int vop2_create_crtc(struct vop2 *vop2)
 	int ret = 0;
 	bool be_used_for_primary_plane = false;
 	bool find_primary_plane = false;
+	bool bootloader_initialized = false;
 
 	/* all planes can attach to any crtc */
 	possible_crtcs = (1 << vop2_data->nr_vps) - 1;
 
+	/*
+	 * We set plane_mask from dts or bootloader
+	 * if all the plane_mask are zero, that means
+	 * the bootloader don't initialized the vop, or
+	 * something is wrong, the kernel will try to
+	 * initial all the vp.
+	 */
+	for (i = 0; i < vop2_data->nr_vps; i++) {
+		vp = &vop2->vps[i];
+		if (vp->plane_mask) {
+			bootloader_initialized = true;
+			break;
+		}
+	}
+
 	/*
 	 * Create primary plane for eache crtc first, since we need
 	 * to pass them to drm_crtc_init_with_planes, which sets the
@@ -6061,6 +6081,14 @@ static int vop2_create_crtc(struct vop2 *vop2)
 		vp->id = vp_data->id;
 		vp->regs = vp_data->regs;
 		vp->cursor_win_id = -1;
+
+		/*
+		 * we assume a vp with a zere plane_mask(set from dts or bootloader)
+		 * as unused.
+		 */
+		if (!vp->plane_mask && bootloader_initialized)
+			continue;
+
 		if (vop2_soc_is_rk3566())
 			soc_id = vp_data->soc_id[1];
 		else

commit 89ee594a71ad0d5ef357ccd52be8fa2391b345d9
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Wed Jun 2 17:44:49 2021 +0800

    drm/rockchip: vop2: Support disable Cluster sub win
    
    Change-Id: Ia2f764992ce51ca61f6ba269083fa643509f58e1
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 811aa0ab235b..d9e7cbd73980 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -5816,11 +5816,22 @@ static int vop2_plane_init(struct vop2 *vop2, struct vop2_win *win, unsigned lon
 	unsigned int max_width, max_height;
 	int ret;
 
+	/*
+	 * Some userspace software don't want use afbc plane
+	 */
 	if (win->feature & WIN_FEATURE_AFBDC) {
 		if (vop2->disable_afbc_win)
 			return -EACCES;
 	}
 
+	/*
+	 * Some userspace software don't want cluster sub plane
+	 */
+	if (!vop2->support_multi_area) {
+		if (win->feature & WIN_FEATURE_CLUSTER_SUB)
+			return -EACCES;
+	}
+
 	ret = drm_universal_plane_init(vop2->drm_dev, &win->base, possible_crtcs,
 				       &vop2_plane_funcs, win->formats, win->nformats,
 				       win->format_modifiers, win->type, win->name);

commit fb5b2cfea82e02a1d785ba47e6d450d562cd224c
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Wed Jun 2 17:04:02 2021 +0800

    drm/rockchip: vop2: Support set cursor win from dts
    
    for example:
    
    Use CLuster0 as cursor win for vp0.
    
    &vp0 {
            cursor-win-id = <ROCKCHIP_VOP2_CLUSTER0>;
    };
    
    Change-Id: I10f7921928fbf7ff803c55a95cbce62df658fbed
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 1a9c1cd4ebdc..811aa0ab235b 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -462,6 +462,8 @@ struct vop2_video_port {
 	 */
 	uint8_t nr_layers;
 
+	int cursor_win_id;
+
 	/**
 	 * @active_tv_state: TV connector related states
 	 */
@@ -2992,12 +2994,18 @@ static void vop2_plane_atomic_update(struct drm_plane *plane, struct drm_plane_s
 		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);
 		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) {
 		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);
 		dsp_h = adjusted_mode->vdisplay - dest->y1;
+		if (dsp_h < 4)
+			dsp_h = 4;
+		actual_h = dsp_h * actual_h / drm_rect_height(dest);
 	}
 
 	/*
@@ -5810,7 +5818,7 @@ static int vop2_plane_init(struct vop2 *vop2, struct vop2_win *win, unsigned lon
 
 	if (win->feature & WIN_FEATURE_AFBDC) {
 		if (vop2->disable_afbc_win)
-			return 0;
+			return -EACCES;
 	}
 
 	ret = drm_universal_plane_init(vop2->drm_dev, &win->base, possible_crtcs,
@@ -5888,6 +5896,24 @@ static int vop2_plane_init(struct vop2 *vop2, struct vop2_win *win, unsigned lon
 	return 0;
 }
 
+static struct drm_plane *vop2_cursor_plane_init(struct vop2_video_port *vp,
+						unsigned long possible_crtcs)
+{
+	struct vop2 *vop2 = vp->vop2;
+	struct drm_plane *cursor = NULL;
+	struct vop2_win *win;
+
+	win = vop2_find_win_by_phys_id(vop2, vp->cursor_win_id);
+	if (win) {
+		win->type = DRM_PLANE_TYPE_CURSOR;
+		win->zpos = vop2->registered_num_wins - 1;
+		if (!vop2_plane_init(vop2, win, possible_crtcs))
+			cursor = &win->base;
+	}
+
+	return cursor;
+}
+
 static int vop2_gamma_init(struct vop2 *vop2)
 {
 	const struct vop2_data *vop2_data = vop2->data;
@@ -5995,6 +6021,7 @@ static int vop2_create_crtc(struct vop2 *vop2)
 	struct drm_device *drm_dev = vop2->drm_dev;
 	struct device *dev = vop2->dev;
 	struct drm_plane *plane;
+	struct drm_plane *cursor = NULL;
 	struct drm_crtc *crtc;
 	struct device_node *port;
 	struct vop2_win *win = NULL;
@@ -6022,6 +6049,7 @@ static int vop2_create_crtc(struct vop2 *vop2)
 		vp->vop2 = vop2;
 		vp->id = vp_data->id;
 		vp->regs = vp_data->regs;
+		vp->cursor_win_id = -1;
 		if (vop2_soc_is_rk3566())
 			soc_id = vp_data->soc_id[1];
 		else
@@ -6036,6 +6064,14 @@ static int vop2_create_crtc(struct vop2 *vop2)
 
 		crtc = &vp->crtc;
 
+		port = of_graph_get_port_by_id(dev->of_node, i);
+		if (!port) {
+			DRM_DEV_ERROR(vop2->dev, "no port node found for video_port%d\n", i);
+			return -ENOENT;
+		}
+		crtc->port = port;
+		of_property_read_u32(port, "cursor-win-id", &vp->cursor_win_id);
+
 		if (vp->primary_plane_phy_id >= 0) {
 			win = vop2_find_win_by_phys_id(vop2, vp->primary_plane_phy_id);
 			if (win)
@@ -6076,11 +6112,24 @@ static int vop2_create_crtc(struct vop2 *vop2)
 		}
 
 		if (vop2_plane_init(vop2, win, possible_crtcs)) {
-			DRM_DEV_ERROR(vop2->dev, "failed to init plane\n");
+			DRM_DEV_ERROR(vop2->dev, "failed to init primary plane\n");
 			break;
 		}
 		plane = &win->base;
-		ret = drm_crtc_init_with_planes(drm_dev, crtc, plane, NULL, &vop2_crtc_funcs,
+
+		/* some times we want a cursor window for some vp */
+		if (vp->cursor_win_id >= 0) {
+			cursor = vop2_cursor_plane_init(vp, possible_crtcs);
+			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,
 						"video_port%d", vp->id);
 		if (ret) {
 			DRM_DEV_ERROR(vop2->dev, "crtc init for video_port%d failed\n", i);
@@ -6089,14 +6138,6 @@ static int vop2_create_crtc(struct vop2 *vop2)
 
 		drm_crtc_helper_add(crtc, &vop2_crtc_helper_funcs);
 
-		port = of_graph_get_port_by_id(dev->of_node, i);
-		if (!port) {
-			DRM_DEV_ERROR(vop2->dev, "no port node found for video_port%d\n", i);
-			ret = -ENOENT;
-		}
-
-		crtc->port = port;
-
 		drm_flip_work_init(&vp->fb_unref_work, "fb_unref", vop2_fb_unref_worker);
 
 		init_completion(&vp->dsp_hold_completion);
@@ -6149,13 +6190,11 @@ static int vop2_create_crtc(struct vop2 *vop2)
 			continue;
 
 		ret = vop2_plane_init(vop2, win, possible_crtcs);
-		if (ret) {
-			DRM_DEV_ERROR(vop2->dev, "failed to init overlay\n");
-			break;
-		}
+		if (ret)
+			DRM_WARN("failed to init overlay plane %s\n", win->name);
 	}
 
-	return ret;
+	return 0;
 }
 
 static void vop2_destroy_crtc(struct drm_crtc *crtc)
diff --git a/include/dt-bindings/display/rockchip_vop.h b/include/dt-bindings/display/rockchip_vop.h
new file mode 100644
index 000000000000..3e14128e7ab1
--- /dev/null
+++ b/include/dt-bindings/display/rockchip_vop.h
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
+ */
+
+
+#ifndef _DT_BINDINGS_ROCKCHIP_VOP_H
+#define _DT_BINDINGS_ROCKCHIP_VOP_H
+
+#define	ROCKCHIP_VOP2_CLUSTER0	0
+#define	ROCKCHIP_VOP2_CLUSTER1	1
+#define	ROCKCHIP_VOP2_ESMART0	2
+#define	ROCKCHIP_VOP2_ESMART1	3
+#define	ROCKCHIP_VOP2_SMART0	4
+#define	ROCKCHIP_VOP2_SMART1	5
+#define	ROCKCHIP_VOP2_CLUSTER2	6
+#define	ROCKCHIP_VOP2_CLUSTER3	7
+#define	ROCKCHIP_VOP2_ESMART2	8
+#define	ROCKCHIP_VOP2_ESMART3	9
+
+#endif

commit 87a35c65f86870ca490d5a0756fe519d78e331c9
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Thu Jun 17 15:20:16 2021 +0800

    drm/rockchip: ebc_dev: release version v2.02
    
    1.adjust panel power on/off sequence
    2.remove EPD_OVERLAY_WHITE mode
    3.use another way to draw white Lines
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: I4787b0cd4a1f0f0f8cac310afa06d3d1db6dae9b

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c b/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
index 9e157cc1e946..01b044eb7815 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
+++ b/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
@@ -83,7 +83,6 @@ int ebc_add_to_dsp_buf_list(struct ebc_buf_s *dsp_buf)
 		case EPD_RESUME:
 		case EPD_POWER_OFF:
 		case EPD_OVERLAY:
-		case EPD_OVERLAY_WHITE:
 		case EPD_RESET:
 		case EPD_FORCE_FULL:
 			break;
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
index da257ee213c8..705f4a23ee24 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
@@ -75,8 +75,7 @@ enum panel_refresh_mode {
 	EPD_SUSPEND		= 15,
 	EPD_RESUME		= 16,
 	EPD_POWER_OFF		= 17,
-	EPD_OVERLAY_WHITE	= 18,
-	EPD_FORCE_FULL		= 19,
+	EPD_FORCE_FULL		= 18,
 };
 
 /*
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index da665bac676c..d559056fe7f7 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -21,51 +21,51 @@ __initcall_ebc_init6s:
 	.p2align 3,,7
 	.type	get_auto_image, %function
 get_auto_image:
-.LFB2809:
+.LFB2810:
 	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
-	.loc 1 356 0
+	.loc 1 453 0
 	.cfi_startproc
 .LVL0:
-	.loc 1 357 0
+	.loc 1 454 0
 	adrp	x5, .LANCHOR0
-	.loc 1 365 0
+	.loc 1 462 0
 	ldrb	w11, [x4, 32]
 .LVL1:
-	.loc 1 357 0
+	.loc 1 454 0
 	ldr	x16, [x5, #:lo12:.LANCHOR0]
-	.loc 1 369 0
+	.loc 1 466 0
 	add	x16, x16, 24
 	ldr	w18, [x16, 156]
-	.loc 1 375 0
+	.loc 1 472 0
 	ldp	w12, w17, [x16, 84]
-	.loc 1 377 0
+	.loc 1 474 0
 	str	wzr, [x4, 36]
 .LVL2:
-	.loc 1 383 0
+	.loc 1 480 0
 	cmp	w17, 0
 	ble	.L54
 	lsr	w12, w12, 3
 .LVL3:
-	.loc 1 356 0
+	.loc 1 453 0
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
 	sub	w15, w12, #1
-	.loc 1 383 0
+	.loc 1 480 0
 	mov	w14, 0
 .LVL4:
 	add	x15, x15, 1
-	.loc 1 356 0
+	.loc 1 453 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	lsl	x30, x15, 3
 	lsl	x15, x15, 2
 	stp	x19, x20, [sp, 16]
 	stp	x21, x22, [sp, 32]
-	.loc 1 395 0
+	.loc 1 492 0
 	mov	w13, 1
-	.loc 1 356 0
+	.loc 1 453 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 19, -48
 	.cfi_offset 20, -40
@@ -76,9 +76,9 @@ get_auto_image:
 .LVL5:
 	.p2align 2
 .L26:
-	.loc 1 384 0
+	.loc 1 481 0
 	cbz	w18, .L3
-	.loc 1 385 0
+	.loc 1 482 0
 	ldp	w5, w10, [x16, 84]
 .LVL6:
 	sub	w10, w10, #1
@@ -91,306 +91,306 @@ get_auto_image:
 	add	x10, x10, 2
 .LVL8:
 	add	x6, x3, 8
-	.loc 1 389 0 discriminator 1
+	.loc 1 486 0 discriminator 1
 	mov	x9, 0
 	cbz	w12, .L5
 	.p2align 2
 .L42:
-	.loc 1 392 0
+	.loc 1 489 0
 	ldr	w7, [x1, x9, lsl 2]
 .LVL9:
-	.loc 1 393 0
+	.loc 1 490 0
 	ldr	w5, [x2, x9, lsl 2]
 .LVL10:
-	.loc 1 394 0
+	.loc 1 491 0
 	cmp	w7, w5
 	beq	.L7
-	.loc 1 396 0
+	.loc 1 493 0
 	eor	w8, w7, w5
-	.loc 1 395 0
+	.loc 1 492 0
 	str	w13, [x4, 36]
-	.loc 1 391 0
+	.loc 1 488 0
 	mov	w19, 0
-	.loc 1 397 0
+	.loc 1 494 0
 	tst	x8, 15
 	beq	.L8
-	.loc 1 398 0
+	.loc 1 495 0
 	ldrb	w21, [x6, -8]
-	.loc 1 400 0
+	.loc 1 497 0
 	ubfiz	w19, w5, 8, 8
 	ldr	x22, [x4, 112]
 	add	w19, w19, w7, uxtb
-	.loc 1 402 0
+	.loc 1 499 0
 	add	w20, w21, 1
-	.loc 1 400 0
+	.loc 1 497 0
 	add	x19, x22, x19
-	.loc 1 399 0
+	.loc 1 496 0
 	lsl	w21, w21, 16
-	.loc 1 402 0
+	.loc 1 499 0
 	and	w20, w20, 255
-	.loc 1 403 0
+	.loc 1 500 0
 	cmp	w11, w20
-	.loc 1 400 0
+	.loc 1 497 0
 	ldrb	w19, [x19, w21, sxtw]
 	and	w19, w19, 3
-	.loc 1 403 0
+	.loc 1 500 0
 	beq	.L58
 .L9:
-	.loc 1 407 0
+	.loc 1 504 0
 	strb	w20, [x6, -8]
 .L8:
-	.loc 1 410 0
+	.loc 1 507 0
 	tst	w8, 240
 	beq	.L10
-	.loc 1 413 0
+	.loc 1 510 0
 	lsr	w20, w5, 4
-	.loc 1 411 0
+	.loc 1 508 0
 	ldrb	w21, [x6, -7]
-	.loc 1 413 0
+	.loc 1 510 0
 	ubfx	x22, x7, 4, 8
 	ubfiz	w20, w20, 8, 8
 	add	w20, w20, w22
 	ldr	x22, [x4, 112]
-	.loc 1 412 0
+	.loc 1 509 0
 	lsl	w23, w21, 16
-	.loc 1 415 0
+	.loc 1 512 0
 	add	w21, w21, 1
-	.loc 1 413 0
+	.loc 1 510 0
 	add	x20, x22, x20
-	.loc 1 415 0
+	.loc 1 512 0
 	and	w21, w21, 255
-	.loc 1 416 0
+	.loc 1 513 0
 	cmp	w11, w21
-	.loc 1 413 0
+	.loc 1 510 0
 	ldrb	w20, [x20, w23, sxtw]
-	.loc 1 414 0
+	.loc 1 511 0
 	ubfiz	w20, w20, 2, 2
 	orr	w19, w20, w19
-	.loc 1 416 0
+	.loc 1 513 0
 	beq	.L59
 .L11:
-	.loc 1 420 0
+	.loc 1 517 0
 	strb	w21, [x6, -7]
 .L10:
-	.loc 1 423 0
+	.loc 1 520 0
 	tst	w8, 3840
 	beq	.L12
-	.loc 1 424 0
+	.loc 1 521 0
 	ldrb	w22, [x6, -6]
-	.loc 1 426 0
+	.loc 1 523 0
 	and	w21, w5, 65280
 	ldr	x23, [x4, 112]
 	ubfx	x20, x7, 8, 8
 	orr	w20, w20, w21
-	.loc 1 428 0
+	.loc 1 525 0
 	add	w21, w22, 1
-	.loc 1 425 0
+	.loc 1 522 0
 	lsl	w22, w22, 16
-	.loc 1 428 0
+	.loc 1 525 0
 	and	w21, w21, 255
-	.loc 1 426 0
+	.loc 1 523 0
 	add	x20, x23, x20, uxth
-	.loc 1 429 0
+	.loc 1 526 0
 	cmp	w11, w21
-	.loc 1 426 0
+	.loc 1 523 0
 	ldrb	w20, [x20, w22, sxtw]
-	.loc 1 427 0
+	.loc 1 524 0
 	ubfiz	w20, w20, 4, 2
 	orr	w19, w20, w19
-	.loc 1 429 0
+	.loc 1 526 0
 	beq	.L60
 .L13:
-	.loc 1 433 0
+	.loc 1 530 0
 	strb	w21, [x6, -6]
 .L12:
-	.loc 1 436 0
+	.loc 1 533 0
 	tst	w8, 61440
 	beq	.L14
-	.loc 1 439 0
+	.loc 1 536 0
 	lsr	w20, w5, 12
-	.loc 1 437 0
+	.loc 1 534 0
 	ldrb	w21, [x6, -5]
-	.loc 1 439 0
+	.loc 1 536 0
 	ubfx	x22, x7, 12, 8
 	ubfiz	w20, w20, 8, 8
 	add	w20, w20, w22
 	ldr	x22, [x4, 112]
-	.loc 1 438 0
+	.loc 1 535 0
 	lsl	w23, w21, 16
-	.loc 1 441 0
+	.loc 1 538 0
 	add	w21, w21, 1
-	.loc 1 439 0
+	.loc 1 536 0
 	add	x20, x22, x20
-	.loc 1 441 0
+	.loc 1 538 0
 	and	w21, w21, 255
-	.loc 1 442 0
+	.loc 1 539 0
 	cmp	w11, w21
-	.loc 1 439 0
+	.loc 1 536 0
 	ldrb	w20, [x20, w23, sxtw]
-	.loc 1 440 0
+	.loc 1 537 0
 	ubfiz	w20, w20, 6, 2
 	orr	w19, w20, w19
-	.loc 1 442 0
+	.loc 1 539 0
 	beq	.L61
 .L15:
-	.loc 1 446 0
+	.loc 1 543 0
 	strb	w21, [x6, -5]
 .L14:
-	.loc 1 449 0
+	.loc 1 546 0
 	strb	w19, [x10, -2]
-	.loc 1 452 0
+	.loc 1 549 0
 	tst	w8, 983040
-	.loc 1 451 0
+	.loc 1 548 0
 	mov	w19, 0
-	.loc 1 452 0
+	.loc 1 549 0
 	beq	.L16
-	.loc 1 455 0
+	.loc 1 552 0
 	lsr	w19, w5, 16
-	.loc 1 453 0
+	.loc 1 550 0
 	ldrb	w20, [x6, -4]
-	.loc 1 455 0
+	.loc 1 552 0
 	ubfx	x21, x7, 16, 8
 	ubfiz	w19, w19, 8, 8
 	add	w19, w19, w21
 	ldr	x21, [x4, 112]
-	.loc 1 454 0
+	.loc 1 551 0
 	lsl	w22, w20, 16
-	.loc 1 457 0
+	.loc 1 554 0
 	add	w20, w20, 1
-	.loc 1 455 0
+	.loc 1 552 0
 	add	x19, x21, x19
-	.loc 1 457 0
+	.loc 1 554 0
 	and	w20, w20, 255
-	.loc 1 458 0
+	.loc 1 555 0
 	cmp	w11, w20
-	.loc 1 455 0
+	.loc 1 552 0
 	ldrb	w19, [x19, w22, sxtw]
 	and	w19, w19, 3
-	.loc 1 458 0
+	.loc 1 555 0
 	beq	.L62
 .L17:
-	.loc 1 462 0
+	.loc 1 559 0
 	strb	w20, [x6, -4]
 .L16:
-	.loc 1 465 0
+	.loc 1 562 0
 	tst	w8, 15728640
 	beq	.L18
-	.loc 1 468 0
+	.loc 1 565 0
 	lsr	w20, w5, 20
-	.loc 1 466 0
+	.loc 1 563 0
 	ldrb	w21, [x6, -3]
-	.loc 1 468 0
+	.loc 1 565 0
 	ubfx	x22, x7, 20, 8
 	ubfiz	w20, w20, 8, 8
 	add	w20, w20, w22
 	ldr	x22, [x4, 112]
-	.loc 1 467 0
+	.loc 1 564 0
 	lsl	w23, w21, 16
-	.loc 1 470 0
+	.loc 1 567 0
 	add	w21, w21, 1
-	.loc 1 468 0
+	.loc 1 565 0
 	add	x20, x22, x20
-	.loc 1 470 0
+	.loc 1 567 0
 	and	w21, w21, 255
-	.loc 1 471 0
+	.loc 1 568 0
 	cmp	w11, w21
-	.loc 1 468 0
+	.loc 1 565 0
 	ldrb	w20, [x20, w23, sxtw]
-	.loc 1 469 0
+	.loc 1 566 0
 	ubfiz	w20, w20, 2, 2
 	orr	w19, w20, w19
-	.loc 1 471 0
+	.loc 1 568 0
 	beq	.L63
 .L19:
-	.loc 1 475 0
+	.loc 1 572 0
 	strb	w21, [x6, -3]
 .L18:
-	.loc 1 478 0
+	.loc 1 575 0
 	tst	w8, 251658240
 	beq	.L20
-	.loc 1 479 0
+	.loc 1 576 0
 	ldrb	w22, [x6, -2]
-	.loc 1 481 0
+	.loc 1 578 0
 	lsr	w20, w5, 24
 	mov	w21, w20
 	lsr	w24, w7, 24
 	ldr	x23, [x4, 112]
 	add	w20, w24, w21, lsl 8
-	.loc 1 483 0
+	.loc 1 580 0
 	add	w21, w22, 1
-	.loc 1 480 0
+	.loc 1 577 0
 	lsl	w22, w22, 16
-	.loc 1 481 0
+	.loc 1 578 0
 	add	x20, x23, x20
-	.loc 1 483 0
+	.loc 1 580 0
 	and	w21, w21, 255
-	.loc 1 484 0
+	.loc 1 581 0
 	cmp	w11, w21
-	.loc 1 481 0
+	.loc 1 578 0
 	ldrb	w20, [x20, w22, sxtw]
-	.loc 1 482 0
+	.loc 1 579 0
 	ubfiz	w20, w20, 4, 2
 	orr	w19, w20, w19
-	.loc 1 484 0
+	.loc 1 581 0
 	beq	.L64
 .L21:
-	.loc 1 488 0
+	.loc 1 585 0
 	strb	w21, [x6, -2]
 .L20:
-	.loc 1 491 0
+	.loc 1 588 0
 	tst	w8, -268435456
 	beq	.L22
-	.loc 1 492 0
+	.loc 1 589 0
 	ldrb	w21, [x6, -1]
-	.loc 1 494 0
+	.loc 1 591 0
 	lsr	w8, w5, 28
 .LVL11:
 	mov	w20, w8
 	lsr	w23, w7, 28
 	ldr	x22, [x4, 112]
 	add	w8, w23, w20, lsl 8
-	.loc 1 496 0
+	.loc 1 593 0
 	add	w20, w21, 1
-	.loc 1 493 0
+	.loc 1 590 0
 	lsl	w21, w21, 16
-	.loc 1 494 0
+	.loc 1 591 0
 	add	x8, x22, x8
-	.loc 1 496 0
+	.loc 1 593 0
 	and	w20, w20, 255
-	.loc 1 497 0
+	.loc 1 594 0
 	cmp	w11, w20
-	.loc 1 494 0
+	.loc 1 591 0
 	ldrb	w8, [x8, w21, sxtw]
-	.loc 1 495 0
+	.loc 1 592 0
 	ubfiz	w8, w8, 6, 2
 	orr	w19, w8, w19
-	.loc 1 497 0
+	.loc 1 594 0
 	beq	.L65
 .L23:
-	.loc 1 501 0
+	.loc 1 598 0
 	strb	w20, [x6, -1]
 .LVL12:
 .L22:
-	.loc 1 504 0
+	.loc 1 601 0
 	str	w5, [x2, x9, lsl 2]
-	.loc 1 505 0
+	.loc 1 602 0
 	strb	w19, [x10, -1]
 .L24:
 	add	x9, x9, 1
 	add	x10, x10, 2
 	add	x6, x6, 8
-	.loc 1 389 0 discriminator 2
+	.loc 1 486 0 discriminator 2
 	cmp	w12, w9
 	bgt	.L42
 	add	x3, x3, x30
 	add	x2, x2, x15
 	add	x1, x1, x15
 .L5:
-	.loc 1 383 0 discriminator 2
+	.loc 1 480 0 discriminator 2
 	add	w14, w14, 1
 	cmp	w17, w14
 	bne	.L26
-	.loc 1 517 0
+	.loc 1 614 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
@@ -410,100 +410,100 @@ get_auto_image:
 	.p2align 3
 .L65:
 	.cfi_restore_state
-	.loc 1 499 0
+	.loc 1 596 0
 	and	w5, w5, 268435455
 .LVL14:
 	and	w7, w7, -268435456
 .LVL15:
 	orr	w5, w7, w5
 .LVL16:
-	.loc 1 498 0
+	.loc 1 595 0
 	mov	w20, 0
 	b	.L23
 .LVL17:
 	.p2align 3
 .L64:
-	.loc 1 486 0
+	.loc 1 583 0
 	and	w5, w5, -251658241
 .LVL18:
 	and	w20, w7, 251658240
 	orr	w5, w20, w5
 .LVL19:
-	.loc 1 485 0
+	.loc 1 582 0
 	mov	w21, 0
 	b	.L21
 	.p2align 3
 .L62:
-	.loc 1 460 0
+	.loc 1 557 0
 	and	w20, w7, 983040
 	and	w5, w5, -983041
 .LVL20:
 	orr	w5, w20, w5
 .LVL21:
-	.loc 1 459 0
+	.loc 1 556 0
 	mov	w20, 0
 	b	.L17
 	.p2align 3
 .L63:
-	.loc 1 473 0
+	.loc 1 570 0
 	and	w5, w5, -15728641
 .LVL22:
 	and	w20, w7, 15728640
 	orr	w5, w20, w5
 .LVL23:
-	.loc 1 472 0
+	.loc 1 569 0
 	mov	w21, 0
 	b	.L19
 	.p2align 3
 .L61:
-	.loc 1 444 0
+	.loc 1 541 0
 	and	w5, w5, -61441
 .LVL24:
 	and	w20, w7, 61440
 	orr	w5, w20, w5
 .LVL25:
-	.loc 1 443 0
+	.loc 1 540 0
 	mov	w21, 0
 	b	.L15
 	.p2align 3
 .L59:
-	.loc 1 418 0
+	.loc 1 515 0
 	and	w5, w5, -241
 .LVL26:
 	and	w20, w7, 240
 	orr	w5, w20, w5
 .LVL27:
-	.loc 1 417 0
+	.loc 1 514 0
 	mov	w21, 0
 	b	.L11
 	.p2align 3
 .L60:
-	.loc 1 431 0
+	.loc 1 528 0
 	and	w5, w5, -3841
 .LVL28:
 	and	w20, w7, 3840
 	orr	w5, w20, w5
 .LVL29:
-	.loc 1 430 0
+	.loc 1 527 0
 	mov	w21, 0
 	b	.L13
 	.p2align 3
 .L58:
-	.loc 1 405 0
+	.loc 1 502 0
 	bfi	w5, w7, 0, 4
-	.loc 1 404 0
+	.loc 1 501 0
 	mov	w20, 0
 	b	.L9
 	.p2align 3
 .L7:
-	.loc 1 508 0
+	.loc 1 605 0
 	strb	wzr, [x10, -2]
-	.loc 1 509 0
+	.loc 1 606 0
 	strb	wzr, [x10, -1]
 	b	.L24
 	.p2align 3
 .L3:
-	.loc 1 387 0
+	.loc 1 484 0
 	ldr	w10, [x16, 84]
 	mul	w10, w14, w10
 	lsr	w10, w10, 2
@@ -523,62 +523,62 @@ get_auto_image:
 	.cfi_restore 30
 	ret
 	.cfi_endproc
-.LFE2809:
+.LFE2810:
 	.size	get_auto_image, .-get_auto_image
 	.align	2
 	.p2align 3,,7
 	.type	ebc_open, %function
 ebc_open:
-.LFB2826:
-	.loc 1 1557 0
+.LFB2827:
+	.loc 1 1644 0
 	.cfi_startproc
 .LVL32:
-	.loc 1 1561 0
+	.loc 1 1648 0
 	mov	w0, 0
 .LVL33:
-	.loc 1 1558 0
+	.loc 1 1645 0
 	str	xzr, [x1, 104]
-	.loc 1 1561 0
+	.loc 1 1648 0
 	ret
 	.cfi_endproc
-.LFE2826:
+.LFE2827:
 	.size	ebc_open, .-ebc_open
 	.section	.exit.text,"ax",@progbits
 	.align	2
 	.type	ebc_exit, %function
 ebc_exit:
-.LFB2845:
-	.loc 1 2103 0
+.LFB2846:
+	.loc 1 2190 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2104 0
+	.loc 1 2191 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2103 0
+	.loc 1 2190 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2104 0
+	.loc 1 2191 0
 	bl	platform_driver_unregister
 .LVL34:
-	.loc 1 2105 0
+	.loc 1 2192 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2845:
+.LFE2846:
 	.size	ebc_exit, .-ebc_exit
 	.text
 	.align	2
 	.p2align 3,,7
 	.type	ebc_resume, %function
 ebc_resume:
-.LFB2843:
-	.loc 1 2065 0
+.LFB2844:
+	.loc 1 2152 0
 	.cfi_startproc
 .LVL35:
 	stp	x29, x30, [sp, -32]!
@@ -596,7 +596,7 @@ ebc_resume:
 	ldr	x19, [x0, 184]
 .LBE911:
 .LBE910:
-	.loc 1 2069 0
+	.loc 1 2156 0
 	ldr	x1, [x19, 16]
 .LBB912:
 .LBB913:
@@ -609,15 +609,15 @@ ebc_resume:
 .LVL37:
 .LBE913:
 .LBE912:
-	.loc 1 2070 0
+	.loc 1 2157 0
 	str	wzr, [x19, 780]
-	.loc 1 2071 0
+	.loc 1 2158 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
 .LVL38:
-	.loc 1 2074 0
+	.loc 1 2161 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -627,27 +627,27 @@ ebc_resume:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2843:
+.LFE2844:
 	.size	ebc_resume, .-ebc_resume
 	.align	2
 	.p2align 3,,7
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
-.LFB2821:
-	.loc 1 1256 0
+.LFB2822:
+	.loc 1 1343 0
 	.cfi_startproc
 .LVL39:
-	.loc 1 1257 0
+	.loc 1 1344 0
 	adrp	x0, .LANCHOR0
 .LVL40:
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1259 0
+	.loc 1 1346 0
 	ldr	w2, [x0, 608]
 	cbnz	w2, .L80
 	ret
 	.p2align 3
 .L80:
-	.loc 1 1256 0
+	.loc 1 1343 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -659,10 +659,10 @@ ebc_vdd_power_timeout:
 	add	x0, x0, 400
 .LBE915:
 .LBE914:
-	.loc 1 1256 0
+	.loc 1 1343 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1260 0
+	.loc 1 1347 0
 	str	wzr, [x0, 208]
 .LBB917:
 .LBB916:
@@ -671,41 +671,41 @@ ebc_vdd_power_timeout:
 .LVL41:
 .LBE916:
 .LBE917:
-	.loc 1 1265 0
+	.loc 1 1352 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2821:
+.LFE2822:
 	.size	ebc_vdd_power_timeout, .-ebc_vdd_power_timeout
 	.align	2
 	.p2align 3,,7
 	.type	ebc_remove, %function
 ebc_remove:
-.LFB2841:
-	.loc 1 2041 0
+.LFB2842:
+	.loc 1 2128 0
 	.cfi_startproc
 .LVL42:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2042 0
+	.loc 1 2129 0
 	adrp	x0, .LANCHOR1
 .LVL43:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2041 0
+	.loc 1 2128 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2042 0
+	.loc 1 2129 0
 	add	x0, x0, 224
-	.loc 1 2041 0
-	.loc 1 2042 0
+	.loc 1 2128 0
+	.loc 1 2129 0
 	bl	misc_deregister
 .LVL44:
-	.loc 1 2045 0
+	.loc 1 2132 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -713,14 +713,14 @@ ebc_remove:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2841:
+.LFE2842:
 	.size	ebc_remove, .-ebc_remove
 	.align	2
 	.p2align 3,,7
 	.type	ebc_mmap, %function
 ebc_mmap:
-.LFB2825:
-	.loc 1 1542 0
+.LFB2826:
+	.loc 1 1629 0
 	.cfi_startproc
 .LVL45:
 	stp	x29, x30, [sp, -32]!
@@ -731,33 +731,33 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1542 0
+	.loc 1 1629 0
 	mov	x19, x1
-	.loc 1 1545 0
+	.loc 1 1632 0
 	bl	ebc_phy_buf_base_get
 .LVL46:
-	.loc 1 1548 0
+	.loc 1 1635 0
 	lsr	x2, x0, 12
-	.loc 1 1546 0
+	.loc 1 1633 0
 	mov	x6, 16384
-	.loc 1 1548 0
+	.loc 1 1635 0
 	mov	x0, x19
-	.loc 1 1546 0
+	.loc 1 1633 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 1548 0
+	.loc 1 1635 0
 	ldp	x1, x3, [x19]
-	.loc 1 1546 0
+	.loc 1 1633 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 1548 0
+	.loc 1 1635 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
 .LVL47:
-	.loc 1 1551 0
+	.loc 1 1638 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 1554 0
+	.loc 1 1641 0
 	ldr	x19, [sp, 16]
 .LVL48:
 	csel	w0, w0, w1, eq
@@ -768,23 +768,23 @@ ebc_mmap:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2825:
+.LFE2826:
 	.size	ebc_mmap, .-ebc_mmap
 	.align	2
 	.p2align 3,,7
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
-.LFB2824:
-	.loc 1 1341 0
+.LFB2825:
+	.loc 1 1428 0
 	.cfi_startproc
 .LVL49:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 1351 0
+	.loc 1 1438 0
 	cmp	w1, 28672
-	.loc 1 1341 0
+	.loc 1 1428 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -798,15 +798,15 @@ ebc_io_ctl:
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
 	.cfi_offset 23, -112
-	.loc 1 1341 0
+	.loc 1 1428 0
 	mov	x21, x2
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 1343 0
+	.loc 1 1430 0
 	adrp	x0, .LANCHOR0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1351 0
+	.loc 1 1438 0
 	bcc	.L88
 	mov	w0, 28675
 	cmp	w1, w0
@@ -816,7 +816,7 @@ ebc_io_ctl:
 	cmp	w0, 1
 	bls	.L89
 .L88:
-	.loc 1 1367 0
+	.loc 1 1454 0
 	mov	w0, 28677
 	cmp	w1, w0
 	beq	.L92
@@ -832,13 +832,13 @@ ebc_io_ctl:
 	mov	w0, 28683
 	cmp	w1, w0
 	bne	.L91
-	.loc 1 1519 0
+	.loc 1 1606 0
 	bl	ebc_empty_buf_get
 .LVL51:
 	mov	x23, x0
-	.loc 1 1520 0
+	.loc 1 1607 0
 	cbz	x0, .L112
-	.loc 1 1522 0
+	.loc 1 1609 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 392]
@@ -849,7 +849,7 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL52:
-	.loc 1 1523 0
+	.loc 1 1610 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL53:
@@ -879,11 +879,11 @@ ebc_io_ctl:
 .LBE920:
 .LBE919:
 .LBE918:
-	.loc 1 1525 0
+	.loc 1 1612 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 1524 0
+	.loc 1 1611 0
 	str	w0, [x29, 104]
-	.loc 1 1526 0
+	.loc 1 1613 0
 	stp	w4, w1, [x29, 112]
 .LBB949:
 .LBB946:
@@ -912,7 +912,7 @@ ebc_io_ctl:
 .LBE943:
 .LBE946:
 .LBE949:
-	.loc 1 1342 0
+	.loc 1 1429 0
 	mov	x0, x21
 .LVL58:
 .LBB950:
@@ -960,36 +960,36 @@ ebc_io_ctl:
 .LBE944:
 .LBE947:
 .LBE950:
-	.loc 1 1528 0
+	.loc 1 1615 0
 	mov	x0, x23
 .LVL63:
 	bl	ebc_buf_release
 .LVL64:
-	.loc 1 1529 0
+	.loc 1 1616 0
 	b	.L87
 .LVL65:
 	.p2align 3
 .L89:
-	.loc 1 1358 0
+	.loc 1 1445 0
 	cbnz	x21, .L88
-	.loc 1 1359 0
+	.loc 1 1446 0
 	ldr	x0, [x20, 272]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
 .LVL66:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC1
-	.loc 1 1360 0
+	.loc 1 1447 0
 	mov	x22, -14
-	.loc 1 1359 0
+	.loc 1 1446 0
 	bl	_dev_err
 .LVL67:
-	.loc 1 1360 0
+	.loc 1 1447 0
 	b	.L87
 .LVL68:
 	.p2align 3
 .L221:
-	.loc 1 1367 0
+	.loc 1 1454 0
 	mov	w0, 28674
 	cmp	w1, w0
 	beq	.L94
@@ -1000,23 +1000,23 @@ ebc_io_ctl:
 	mov	w0, 28676
 	cmp	w1, w0
 	bne	.L91
-	.loc 1 1451 0
+	.loc 1 1538 0
 	ldr	x0, [x20, 272]
-	.loc 1 1450 0
+	.loc 1 1537 0
 	mov	w2, 1
 	str	w2, [x20, 788]
-	.loc 1 1451 0
+	.loc 1 1538 0
 	adrp	x1, .LC2
 .LVL69:
-	.loc 1 1452 0
+	.loc 1 1539 0
 	mov	x22, 0
-	.loc 1 1451 0
+	.loc 1 1538 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
 .LVL70:
 	.p2align 2
 .L87:
-	.loc 1 1539 0
+	.loc 1 1626 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
 .LVL71:
@@ -1044,7 +1044,7 @@ ebc_io_ctl:
 	.p2align 3
 .L224:
 	.cfi_restore_state
-	.loc 1 1367 0
+	.loc 1 1454 0
 	cmp	w1, 28672
 	beq	.L96
 	mov	w0, 28673
@@ -1158,53 +1158,53 @@ ebc_io_ctl:
 .LBE953:
 .LBE952:
 .LBE951:
-	.loc 1 1405 0
+	.loc 1 1492 0
 	bl	ebc_phy_buf_base_get
 .LVL87:
 	ldrsw	x1, [x29, 104]
-	.loc 1 1406 0
+	.loc 1 1493 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
 .LVL88:
 	mov	x21, x0
 .LVL89:
-	.loc 1 1407 0
+	.loc 1 1494 0
 	cbz	x0, .L127
-	.loc 1 1408 0
+	.loc 1 1495 0
 	ldr	w5, [x29, 108]
-	.loc 1 1417 0
+	.loc 1 1504 0
 	add	x20, x20, 184
-	.loc 1 1412 0
+	.loc 1 1499 0
 	ldp	w4, w2, [x29, 124]
-	.loc 1 1408 0
+	.loc 1 1495 0
 	str	w5, [x21, 40]
-	.loc 1 1413 0
+	.loc 1 1500 0
 	ldp	w3, w1, [x29, 132]
-	.loc 1 1412 0
+	.loc 1 1499 0
 	stp	w4, w2, [x21, 48]
-	.loc 1 1413 0
+	.loc 1 1500 0
 	stp	w3, w1, [x21, 56]
-	.loc 1 1415 0
+	.loc 1 1502 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL90:
-	.loc 1 1417 0
+	.loc 1 1504 0
 	ldr	w0, [x20, 80]
 	cbz	w0, .L227
 .L122:
-	.loc 1 1421 0
+	.loc 1 1508 0
 	ldr	w0, [x21, 40]
 	cmp	w0, 15
 	beq	.L228
-	.loc 1 1421 0 is_stmt 0 discriminator 3
+	.loc 1 1508 0 is_stmt 0 discriminator 3
 	cmp	w0, 17
 	bne	.L127
 .L124:
-	.loc 1 1422 0 is_stmt 1
+	.loc 1 1509 0 is_stmt 1
 	mov	w0, 1
 	str	w0, [x20, 188]
 .LBB980:
 .LBB981:
-	.loc 1 1423 0
+	.loc 1 1510 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
@@ -1217,13 +1217,13 @@ ebc_io_ctl:
 	.p2align 3
 .L229:
 .LVL92:
-	.loc 1 1423 0 is_stmt 0 discriminator 5
+	.loc 1 1510 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L127
-	.loc 1 1423 0 discriminator 7
+	.loc 1 1510 0 discriminator 7
 	bl	schedule
 .LVL93:
 .L128:
-	.loc 1 1423 0 discriminator 9
+	.loc 1 1510 0 discriminator 9
 	add	x1, x29, 64
 	mov	w2, 1
 	mov	x0, x21
@@ -1232,7 +1232,7 @@ ebc_io_ctl:
 	ldr	w1, [x20, 188]
 	cbnz	w1, .L229
 .LBE982:
-	.loc 1 1423 0 discriminator 4
+	.loc 1 1510 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
 	bl	finish_wait
@@ -1246,13 +1246,13 @@ ebc_io_ctl:
 .L104:
 .LBE981:
 .LBE980:
-	.loc 1 1506 0 is_stmt 1
+	.loc 1 1593 0 is_stmt 1
 	bl	ebc_empty_buf_get
 .LVL97:
 	mov	x23, x0
-	.loc 1 1507 0
+	.loc 1 1594 0
 	cbz	x0, .L112
-	.loc 1 1509 0
+	.loc 1 1596 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 328]
@@ -1262,7 +1262,7 @@ ebc_io_ctl:
 .LVL98:
 	.p2align 3
 .L222:
-	.loc 1 1367 0
+	.loc 1 1454 0
 	mov	w0, 28678
 	cmp	w1, w0
 	beq	.L102
@@ -1377,36 +1377,36 @@ ebc_io_ctl:
 .LBE988:
 .LBE987:
 .LBE986:
-	.loc 1 1432 0
+	.loc 1 1519 0
 	bl	ebc_osd_buf_clone
 .LVL111:
 	mov	x1, x0
-	.loc 1 1433 0
+	.loc 1 1520 0
 	cbz	x0, .L127
-	.loc 1 1434 0
+	.loc 1 1521 0
 	ldr	w6, [x29, 108]
-	.loc 1 1443 0
+	.loc 1 1530 0
 	add	x20, x20, 184
-	.loc 1 1438 0
+	.loc 1 1525 0
 	ldp	w5, w3, [x29, 124]
-	.loc 1 1434 0
+	.loc 1 1521 0
 	str	w6, [x1, 40]
-	.loc 1 1439 0
+	.loc 1 1526 0
 	ldp	w4, w2, [x29, 132]
-	.loc 1 1438 0
+	.loc 1 1525 0
 	stp	w5, w3, [x1, 48]
-	.loc 1 1439 0
+	.loc 1 1526 0
 	stp	w4, w2, [x1, 56]
-	.loc 1 1441 0
+	.loc 1 1528 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL112:
-	.loc 1 1443 0
+	.loc 1 1530 0
 	ldr	w0, [x20, 80]
 	cbnz	w0, .L127
-	.loc 1 1444 0
+	.loc 1 1531 0
 	mov	w2, 1
 	str	w2, [x20, 80]
-	.loc 1 1445 0
+	.loc 1 1532 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -1479,12 +1479,12 @@ ebc_io_ctl:
 .LBE945:
 .LBE948:
 .LBE1015:
-	.loc 1 1369 0
+	.loc 1 1456 0
 	bl	ebc_osd_buf_get
 .LVL123:
-	.loc 1 1370 0
+	.loc 1 1457 0
 	cbz	x0, .L112
-	.loc 1 1373 0
+	.loc 1 1460 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL124:
@@ -1511,17 +1511,17 @@ ebc_io_ctl:
 .LBE1018:
 .LBE1017:
 .LBE1016:
-	.loc 1 1373 0
+	.loc 1 1460 0
 	sub	w0, w22, w0
-	.loc 1 1378 0
+	.loc 1 1465 0
 	ldr	w1, [x20, 176]
-	.loc 1 1377 0
+	.loc 1 1464 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1376 0
+	.loc 1 1463 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1378 0
+	.loc 1 1465 0
 	str	w1, [x29, 120]
-	.loc 1 1375 0
+	.loc 1 1462 0
 	str	w0, [x29, 104]
 .LBB1049:
 .LBB1046:
@@ -1646,7 +1646,7 @@ ebc_io_ctl:
 .LBE1052:
 .LBE1051:
 .LBE1050:
-	.loc 1 1459 0
+	.loc 1 1546 0
 	add	x22, x20, 232
 .LBB1085:
 .LBB1081:
@@ -1743,49 +1743,49 @@ ebc_io_ctl:
 .LBE1077:
 .LBE1081:
 .LBE1085:
-	.loc 1 1463 0
+	.loc 1 1550 0
 	add	x20, x20, 184
 	ldr	w2, [x20, 48]
 	ldr	x0, [x20, 88]
 .LVL150:
-	.loc 1 1464 0
+	.loc 1 1551 0
 	mov	x22, 0
-	.loc 1 1463 0
+	.loc 1 1550 0
 	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	_dev_info
 .LVL151:
-	.loc 1 1464 0
+	.loc 1 1551 0
 	b	.L87
 .LVL152:
 	.p2align 3
 .L92:
-	.loc 1 1456 0
+	.loc 1 1543 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC3
 .LVL153:
-	.loc 1 1454 0
+	.loc 1 1541 0
 	str	wzr, [x20, 788]
-	.loc 1 1457 0
+	.loc 1 1544 0
 	mov	x22, 0
-	.loc 1 1455 0
+	.loc 1 1542 0
 	str	wzr, [x20, 792]
-	.loc 1 1456 0
+	.loc 1 1543 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
 .LVL154:
-	.loc 1 1457 0
+	.loc 1 1544 0
 	b	.L87
 .LVL155:
 	.p2align 3
 .L100:
-	.loc 1 1493 0
+	.loc 1 1580 0
 	bl	ebc_empty_buf_get
 .LVL156:
 	mov	x23, x0
-	.loc 1 1494 0
+	.loc 1 1581 0
 	cbz	x0, .L112
-	.loc 1 1496 0
+	.loc 1 1583 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 320]
@@ -1795,13 +1795,13 @@ ebc_io_ctl:
 .LVL157:
 	.p2align 3
 .L105:
-	.loc 1 1480 0
+	.loc 1 1567 0
 	bl	ebc_empty_buf_get
 .LVL158:
 	mov	x23, x0
-	.loc 1 1481 0
+	.loc 1 1568 0
 	cbz	x0, .L112
-	.loc 1 1483 0
+	.loc 1 1570 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 312]
@@ -1810,7 +1810,7 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL159:
-	.loc 1 1484 0
+	.loc 1 1571 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL160:
@@ -1838,11 +1838,11 @@ ebc_io_ctl:
 .LBE1088:
 .LBE1087:
 .LBE1086:
-	.loc 1 1487 0
+	.loc 1 1574 0
 	ldp	w4, w1, [x22, 84]
-	.loc 1 1485 0
+	.loc 1 1572 0
 	str	w0, [x29, 104]
-	.loc 1 1486 0
+	.loc 1 1573 0
 	stp	w1, w4, [x29, 112]
 .LBB1097:
 .LBB1096:
@@ -1886,15 +1886,15 @@ ebc_io_ctl:
 .LBE1100:
 .LBE1099:
 .LBE1098:
-	.loc 1 1470 0
+	.loc 1 1557 0
 	ldp	w1, w0, [x20, 116]
 .LVL165:
 	stp	w1, w0, [x29, 140]
-	.loc 1 1467 0
+	.loc 1 1554 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 1466 0
+	.loc 1 1553 0
 	stp	w5, w6, [x29, 112]
-	.loc 1 1468 0
+	.loc 1 1555 0
 	ldr	w4, [x20, 176]
 	str	w4, [x29, 120]
 .LBB1133:
@@ -1942,46 +1942,46 @@ ebc_io_ctl:
 .LBE1125:
 .LBE1129:
 .LBE1133:
-	.loc 1 1473 0
+	.loc 1 1560 0
 	ldr	x0, [x20, 272]
 .LVL171:
 	adrp	x1, .LC5
 .LVL172:
-	.loc 1 1474 0
+	.loc 1 1561 0
 	mov	x22, -14
-	.loc 1 1473 0
+	.loc 1 1560 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
 .LVL173:
-	.loc 1 1474 0
+	.loc 1 1561 0
 	b	.L87
 .LVL174:
 	.p2align 3
 .L91:
-	.loc 1 1534 0
+	.loc 1 1621 0
 	ldr	x0, [x20, 272]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
 .LVL175:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
-	.loc 1 1535 0
+	.loc 1 1622 0
 	mov	x22, 0
-	.loc 1 1534 0
+	.loc 1 1621 0
 	bl	_dev_err
 .LVL176:
-	.loc 1 1538 0
+	.loc 1 1625 0
 	b	.L87
 .LVL177:
 	.p2align 3
 .L96:
-	.loc 1 1383 0
+	.loc 1 1470 0
 	bl	ebc_empty_buf_get
 .LVL178:
 	mov	x23, x0
-	.loc 1 1384 0
+	.loc 1 1471 0
 	cbz	x0, .L112
-	.loc 1 1387 0
+	.loc 1 1474 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL179:
@@ -2008,17 +2008,17 @@ ebc_io_ctl:
 .LBE1136:
 .LBE1135:
 .LBE1134:
-	.loc 1 1387 0
+	.loc 1 1474 0
 	sub	w0, w22, w0
-	.loc 1 1392 0
+	.loc 1 1479 0
 	ldr	w1, [x20, 176]
-	.loc 1 1391 0
+	.loc 1 1478 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1390 0
+	.loc 1 1477 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1392 0
+	.loc 1 1479 0
 	str	w1, [x29, 120]
-	.loc 1 1389 0
+	.loc 1 1476 0
 	str	w0, [x29, 104]
 .LBB1169:
 .LBB1165:
@@ -2065,15 +2065,15 @@ ebc_io_ctl:
 .LBE1161:
 .LBE1165:
 .LBE1169:
-	.loc 1 1396 0
+	.loc 1 1483 0
 	mov	x0, x23
 .LVL186:
-	.loc 1 1397 0
+	.loc 1 1484 0
 	mov	x22, -14
-	.loc 1 1396 0
+	.loc 1 1483 0
 	bl	ebc_buf_release
 .LVL187:
-	.loc 1 1397 0
+	.loc 1 1484 0
 	b	.L87
 .LVL188:
 	.p2align 3
@@ -2096,7 +2096,7 @@ ebc_io_ctl:
 .LBE1011:
 .LBE1013:
 .LBE1170:
-	.loc 1 1342 0
+	.loc 1 1429 0
 	mov	x0, x21
 .LVL189:
 .LBB1171:
@@ -2133,7 +2133,7 @@ ebc_io_ctl:
 .LBE976:
 .LBE978:
 .LBE1172:
-	.loc 1 1342 0
+	.loc 1 1429 0
 	mov	x0, x21
 .LVL191:
 .LBB1173:
@@ -2171,7 +2171,7 @@ ebc_io_ctl:
 .LBE1126:
 .LBE1130:
 .LBE1174:
-	.loc 1 1342 0
+	.loc 1 1429 0
 	mov	x0, x21
 .LVL194:
 .LBB1175:
@@ -2208,7 +2208,7 @@ ebc_io_ctl:
 .LBE1078:
 .LBE1082:
 .LBE1176:
-	.loc 1 1342 0
+	.loc 1 1429 0
 	mov	x0, x21
 .LVL196:
 .LBB1177:
@@ -2246,7 +2246,7 @@ ebc_io_ctl:
 .LBE1162:
 .LBE1166:
 .LBE1178:
-	.loc 1 1342 0
+	.loc 1 1429 0
 	mov	x0, x21
 .LVL199:
 .LBB1179:
@@ -2284,7 +2284,7 @@ ebc_io_ctl:
 .LBE1044:
 .LBE1047:
 .LBE1180:
-	.loc 1 1342 0
+	.loc 1 1429 0
 	mov	x0, x21
 .LVL202:
 .LBB1181:
@@ -2359,7 +2359,7 @@ ebc_io_ctl:
 .LBE1128:
 .LBE1132:
 .LBE1182:
-	.loc 1 1472 0
+	.loc 1 1559 0
 	cbnz	x0, .L139
 .LBB1183:
 .LBB983:
@@ -2426,7 +2426,7 @@ ebc_io_ctl:
 .LBE1164:
 .LBE1168:
 .LBE1184:
-	.loc 1 1395 0
+	.loc 1 1482 0
 	cbnz	w0, .L116
 .LBB1185:
 .LBB984:
@@ -2437,16 +2437,16 @@ ebc_io_ctl:
 .L120:
 .LBE984:
 .LBE1185:
-	.loc 1 1403 0
+	.loc 1 1490 0
 	mov	x22, -14
 	b	.L87
 .LVL220:
 	.p2align 3
 .L227:
-	.loc 1 1418 0
+	.loc 1 1505 0
 	mov	w2, 1
 	str	w2, [x20, 80]
-	.loc 1 1419 0
+	.loc 1 1506 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -2456,7 +2456,7 @@ ebc_io_ctl:
 	b	.L122
 	.p2align 3
 .L228:
-	.loc 1 1421 0 discriminator 1
+	.loc 1 1508 0 discriminator 1
 	ldr	w0, [x20, 592]
 	cbz	w0, .L124
 .LBB1186:
@@ -2467,7 +2467,7 @@ ebc_io_ctl:
 .L112:
 .LBE985:
 .LBE1186:
-	.loc 1 1371 0
+	.loc 1 1458 0
 	mov	x22, -1
 	b	.L87
 .LVL223:
@@ -2490,19 +2490,19 @@ ebc_io_ctl:
 .LBE1080:
 .LBE1084:
 .LBE1187:
-	.loc 1 1460 0
+	.loc 1 1547 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC4
-	.loc 1 1461 0
+	.loc 1 1548 0
 	mov	x22, -14
-	.loc 1 1460 0
+	.loc 1 1547 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
 .LVL228:
-	.loc 1 1461 0
+	.loc 1 1548 0
 	b	.L87
 .L225:
-	.loc 1 1539 0
+	.loc 1 1626 0
 	bl	__stack_chk_fail
 .LVL229:
 .L233:
@@ -2511,51 +2511,47 @@ ebc_io_ctl:
 .LVL230:
 	b	.L134
 	.cfi_endproc
-.LFE2824:
+.LFE2825:
 	.size	ebc_io_ctl, .-ebc_io_ctl
 	.align	2
 	.p2align 3,,7
 	.type	frame_done_callback, %function
 frame_done_callback:
-.LFB2816:
-	.loc 1 767 0
+.LFB2817:
+	.loc 1 861 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 768 0
+	.loc 1 862 0
 	adrp	x0, .LANCHOR0
-	.loc 1 767 0
+	add	x1, x0, :lo12:.LANCHOR0
+	.loc 1 861 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 768 0
+	.loc 1 862 0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 767 0
+	.loc 1 861 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 771 0
+	.loc 1 865 0
 	add	x19, x20, 184
-	ldr	x1, [x19, 208]
-	ldr	w1, [x1, 40]
-	tbnz	w1, #31, .L237
-	cmp	w1, 1
-	ble	.L238
-	cmp	w1, 18
-	bne	.L237
-.L238:
-	.loc 1 775 0
-	ldr	w1, [x19, 36]
-	cbz	w1, .L239
-	.loc 1 776 0
-	add	x0, x0, :lo12:.LANCHOR0
-	ldr	x0, [x0, 8]
+	ldr	x0, [x19, 208]
+	ldr	w0, [x0, 40]
+	cmp	w0, 1
+	bhi	.L237
+	.loc 1 868 0
+	ldr	w0, [x19, 36]
+	cbz	w0, .L239
+	.loc 1 869 0
+	ldr	x0, [x1, 8]
 	bl	wake_up_process
 .LVL231:
-	.loc 1 802 0
+	.loc 1 895 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -2570,40 +2566,40 @@ frame_done_callback:
 	.p2align 3
 .L237:
 	.cfi_restore_state
-	.loc 1 790 0
-	ldr	w1, [x19, 40]
-	cbnz	w1, .L246
-	.loc 1 796 0
+	.loc 1 883 0
+	ldr	w0, [x19, 40]
+	cbnz	w0, .L243
+	.loc 1 889 0
 	ldr	x0, [x19, 88]
-	.loc 1 795 0
+	.loc 1 888 0
 	mov	w20, 1
-	.loc 1 794 0
+	.loc 1 887 0
 	str	wzr, [x19, 28]
-	.loc 1 796 0
+	.loc 1 889 0
 	adrp	x1, .LC9
-	.loc 1 795 0
+	.loc 1 888 0
 	str	w20, [x19, 76]
-	.loc 1 796 0
+	.loc 1 889 0
 	add	x1, x1, :lo12:.LC9
-	.loc 1 797 0
+	.loc 1 890 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
-	.loc 1 796 0
+	.loc 1 889 0
 	bl	_dev_info
 .LVL232:
-	.loc 1 797 0
+	.loc 1 890 0
 	mov	w2, w20
 	add	x0, x19, 352
 	mov	w1, w20
 	bl	__wake_up_sync
 .LVL233:
-	.loc 1 798 0
+	.loc 1 891 0
 	mov	w2, w20
 	mov	w1, w20
 	add	x0, x19, 304
 	bl	__wake_up_sync
 .LVL234:
-	.loc 1 802 0
+	.loc 1 895 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -2618,23 +2614,23 @@ frame_done_callback:
 	.p2align 3
 .L239:
 	.cfi_restore_state
-	.loc 1 779 0
+	.loc 1 872 0
 	ldr	x0, [x19, 88]
 	adrp	x1, .LC8
 	add	x1, x1, :lo12:.LC8
-	.loc 1 784 0
+	.loc 1 877 0
 	mov	w21, 1
-	.loc 1 779 0
+	.loc 1 872 0
 	bl	_dev_info
 .LVL235:
-	.loc 1 781 0
+	.loc 1 874 0
 	ldp	w3, w2, [x20, 108]
 	mov	w1, 0
 	ldr	x0, [x19, 152]
 	mul	w2, w3, w2
 	bl	memset
 .LVL236:
-	.loc 1 782 0
+	.loc 1 875 0
 	adrp	x2, jiffies
 	add	x0, x20, 672
 	mov	x1, 402653184
@@ -2642,11 +2638,11 @@ frame_done_callback:
 	add	x1, x2, x1
 	bl	mod_timer
 .LVL237:
-	.loc 1 784 0
+	.loc 1 877 0
 	str	w21, [x19, 76]
-	.loc 1 783 0
+	.loc 1 876 0
 	str	wzr, [x19, 28]
-	.loc 1 785 0
+	.loc 1 878 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
 	mov	w2, w21
@@ -2654,13 +2650,13 @@ frame_done_callback:
 	add	x0, x19, 352
 	bl	__wake_up_sync
 .LVL238:
-	.loc 1 786 0
+	.loc 1 879 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x19, 304
 	bl	__wake_up_sync
 .LVL239:
-	.loc 1 802 0
+	.loc 1 895 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -2673,18 +2669,17 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L246:
+.L243:
 	.cfi_restore_state
-	.loc 1 792 0
-	add	x0, x0, :lo12:.LANCHOR0
-	.loc 1 791 0
+	.loc 1 885 0
+	ldr	x0, [x1, 8]
+	.loc 1 884 0
 	mov	w1, 1
 	str	w1, [x19, 28]
-	.loc 1 792 0
-	ldr	x0, [x0, 8]
+	.loc 1 885 0
 	bl	wake_up_process
 .LVL240:
-	.loc 1 802 0
+	.loc 1 895 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -2696,14 +2691,14 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2816:
+.LFE2817:
 	.size	frame_done_callback, .-frame_done_callback
 	.align	2
 	.p2align 3,,7
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
-.LFB2822:
-	.loc 1 1268 0
+.LFB2823:
+	.loc 1 1355 0
 	.cfi_startproc
 .LVL241:
 	stp	x29, x30, [sp, -16]!
@@ -2712,33 +2707,33 @@ ebc_frame_timeout:
 	.cfi_offset 30, -8
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1269 0
+	.loc 1 1356 0
 	bl	frame_done_callback
 .LVL242:
-	.loc 1 1271 0
+	.loc 1 1358 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2822:
+.LFE2823:
 	.size	ebc_frame_timeout, .-ebc_frame_timeout
 	.align	2
 	.p2align 3,,7
 	.type	ebc_lut_update, %function
 ebc_lut_update:
-.LFB2817:
-	.loc 1 805 0
+.LFB2818:
+	.loc 1 898 0
 	.cfi_startproc
 .LVL243:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 807 0
+	.loc 1 900 0
 	mov	w3, 25
-	.loc 1 805 0
+	.loc 1 898 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x21, x22, [sp, 32]
@@ -2748,18 +2743,18 @@ ebc_lut_update:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -48
 	.cfi_offset 20, -40
-	.loc 1 807 0
+	.loc 1 900 0
 	add	x1, x29, 64
-	.loc 1 805 0
+	.loc 1 898 0
 	adrp	x19, __stack_chk_guard
 	add	x0, x19, :lo12:__stack_chk_guard
 .LVL244:
-	.loc 1 811 0
+	.loc 1 904 0
 	ldr	x2, [x21, 16]
-	.loc 1 807 0
+	.loc 1 900 0
 	str	w3, [x1, -12]!
 .LVL245:
-	.loc 1 805 0
+	.loc 1 898 0
 	ldr	x3, [x0]
 	str	x3, [x29, 56]
 	mov	x3,0
@@ -2773,49 +2768,49 @@ ebc_lut_update:
 	mov	w20, w0
 .LBE1189:
 .LBE1188:
-	.loc 1 812 0
-	cbnz	w0, .L250
+	.loc 1 905 0
+	cbnz	w0, .L247
 .LVL247:
-	.loc 1 813 0
+	.loc 1 906 0
 	ldr	w2, [x29, 52]
-	.loc 1 814 0
+	.loc 1 907 0
 	add	x22, x21, 184
-	.loc 1 813 0
-	tbnz	w2, #31, .L273
-	.loc 1 817 0
+	.loc 1 906 0
+	tbnz	w2, #31, .L270
+	.loc 1 910 0
 	cmp	w2, 50
-	bgt	.L274
-.L252:
-	.loc 1 825 0
+	bgt	.L271
+.L249:
+	.loc 1 918 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC12
 	add	x1, x1, :lo12:.LC12
 	bl	_dev_info
 .LVL248:
-	.loc 1 828 0
+	.loc 1 921 0
 	ldr	x0, [x22, 208]
 	ldr	w0, [x0, 40]
-	cmp	w0, 19
-	bls	.L275
-	.loc 1 877 0
+	cmp	w0, 18
+	bls	.L272
+	.loc 1 969 0
 	ldr	w2, [x29, 52]
-.L272:
+.L269:
 	mov	w1, 7
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL249:
-	cbnz	w0, .L264
-.L267:
-	.loc 1 882 0
-	cbnz	w20, .L265
-.L249:
-	.loc 1 888 0
+	cbnz	w0, .L261
+.L264:
+	.loc 1 974 0
+	cbnz	w20, .L262
+.L246:
+	.loc 1 980 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	w0, w20
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L276
+	cbnz	x1, .L273
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 .LVL250:
@@ -2831,69 +2826,68 @@ ebc_lut_update:
 	ret
 .LVL251:
 	.p2align 3
-.L275:
+.L272:
 	.cfi_restore_state
-	.loc 1 828 0
-	adrp	x1, .L255
-	.loc 1 830 0
+	.loc 1 921 0
+	adrp	x1, .L252
+	.loc 1 923 0
 	ldr	w2, [x29, 52]
-	.loc 1 828 0
-	add	x1, x1, :lo12:.L255
+	.loc 1 921 0
+	add	x1, x1, :lo12:.L252
 	ldrb	w0, [x1,w0,uxtw]
-	adr	x1, .Lrtx255
+	adr	x1, .Lrtx252
 	add	x0, x1, w0, sxtb #2
 	br	x0
-.Lrtx255:
+.Lrtx252:
 	.section	.rodata
 	.align	0
 	.align	2
-.L255:
-	.byte	(.L254 - .Lrtx255) / 4
-	.byte	(.L254 - .Lrtx255) / 4
-	.byte	(.L272 - .Lrtx255) / 4
-	.byte	(.L257 - .Lrtx255) / 4
-	.byte	(.L258 - .Lrtx255) / 4
-	.byte	(.L259 - .Lrtx255) / 4
-	.byte	(.L260 - .Lrtx255) / 4
-	.byte	(.L272 - .Lrtx255) / 4
-	.byte	(.L257 - .Lrtx255) / 4
-	.byte	(.L258 - .Lrtx255) / 4
-	.byte	(.L259 - .Lrtx255) / 4
-	.byte	(.L260 - .Lrtx255) / 4
-	.byte	(.L261 - .Lrtx255) / 4
-	.byte	(.L262 - .Lrtx255) / 4
-	.byte	(.L263 - .Lrtx255) / 4
-	.byte	(.L272 - .Lrtx255) / 4
-	.byte	(.L272 - .Lrtx255) / 4
-	.byte	(.L272 - .Lrtx255) / 4
-	.byte	(.L254 - .Lrtx255) / 4
-	.byte	(.L272 - .Lrtx255) / 4
+.L252:
+	.byte	(.L251 - .Lrtx252) / 4
+	.byte	(.L251 - .Lrtx252) / 4
+	.byte	(.L269 - .Lrtx252) / 4
+	.byte	(.L254 - .Lrtx252) / 4
+	.byte	(.L255 - .Lrtx252) / 4
+	.byte	(.L256 - .Lrtx252) / 4
+	.byte	(.L257 - .Lrtx252) / 4
+	.byte	(.L269 - .Lrtx252) / 4
+	.byte	(.L254 - .Lrtx252) / 4
+	.byte	(.L255 - .Lrtx252) / 4
+	.byte	(.L256 - .Lrtx252) / 4
+	.byte	(.L257 - .Lrtx252) / 4
+	.byte	(.L258 - .Lrtx252) / 4
+	.byte	(.L259 - .Lrtx252) / 4
+	.byte	(.L260 - .Lrtx252) / 4
+	.byte	(.L269 - .Lrtx252) / 4
+	.byte	(.L269 - .Lrtx252) / 4
+	.byte	(.L269 - .Lrtx252) / 4
+	.byte	(.L269 - .Lrtx252) / 4
 	.text
 	.p2align 3
-.L263:
-	.loc 1 830 0
+.L260:
+	.loc 1 923 0
 	mov	w1, 1
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL252:
-	cbz	w0, .L267
+	cbz	w0, .L264
 	.p2align 2
-.L264:
-	.loc 1 819 0
+.L261:
+	.loc 1 912 0
 	mov	w20, -1
-.L265:
-	.loc 1 883 0
+.L262:
+	.loc 1 975 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC13
 	add	x1, x1, :lo12:.LC13
 	bl	_dev_err
 .LVL253:
-	.loc 1 884 0
-	b	.L249
+	.loc 1 976 0
+	b	.L246
 .LVL254:
 	.p2align 3
-.L250:
-	.loc 1 823 0
+.L247:
+	.loc 1 916 0
 	add	x22, x21, 184
 	mov	w2, w0
 	adrp	x1, .LC11
@@ -2902,133 +2896,133 @@ ebc_lut_update:
 	bl	_dev_err
 .LVL255:
 	ldr	w2, [x29, 52]
-	b	.L252
+	b	.L249
 	.p2align 3
-.L274:
-	.loc 1 818 0
+.L271:
+	.loc 1 911 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC10
 	add	x1, x1, :lo12:.LC10
 	bl	_dev_err
 .LVL256:
-	.loc 1 819 0
+	.loc 1 912 0
 	mov	w2, 50
 	str	w2, [x29, 52]
 .LVL257:
-	b	.L252
+	b	.L249
 	.p2align 3
-.L258:
-	.loc 1 863 0
+.L255:
+	.loc 1 955 0
 	mov	w1, 9
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL258:
-	cbnz	w0, .L264
-	b	.L267
+	cbnz	w0, .L261
+	b	.L264
 	.p2align 3
-.L259:
-	.loc 1 868 0
+.L256:
+	.loc 1 960 0
 	mov	w1, 10
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL259:
-	cbnz	w0, .L264
-	b	.L267
+	cbnz	w0, .L261
+	b	.L264
 	.p2align 3
-.L260:
-	.loc 1 873 0
+.L257:
+	.loc 1 965 0
 	mov	w1, 11
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL260:
-	cbnz	w0, .L264
-	b	.L267
+	cbnz	w0, .L261
+	b	.L264
 	.p2align 3
-.L261:
-	.loc 1 849 0
+.L258:
+	.loc 1 941 0
 	mov	w1, 6
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL261:
-	cbnz	w0, .L264
-	b	.L267
+	cbnz	w0, .L261
+	b	.L264
 	.p2align 3
-.L254:
-	.loc 1 845 0
+.L251:
+	.loc 1 937 0
 	mov	w1, 5
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL262:
-	cbnz	w0, .L264
-	b	.L267
+	cbnz	w0, .L261
+	b	.L264
 	.p2align 3
-.L257:
-	.loc 1 858 0
+.L254:
+	.loc 1 950 0
 	mov	w1, 8
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL263:
-	cbnz	w0, .L264
-	b	.L267
+	cbnz	w0, .L261
+	b	.L264
 	.p2align 3
-.L262:
-	.loc 1 853 0
+.L259:
+	.loc 1 945 0
 	mov	w1, 4
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL264:
-	cbnz	w0, .L264
-	b	.L267
+	cbnz	w0, .L261
+	b	.L264
 	.p2align 3
-.L273:
-	.loc 1 814 0
+.L270:
+	.loc 1 907 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC10
 	add	x1, x1, :lo12:.LC10
 	bl	_dev_err
 .LVL265:
-	.loc 1 815 0
+	.loc 1 908 0
 	str	wzr, [x29, 52]
 	mov	w2, 0
-	b	.L252
-.L276:
-	.loc 1 888 0
+	b	.L249
+.L273:
+	.loc 1 980 0
 	bl	__stack_chk_fail
 .LVL266:
 	.cfi_endproc
-.LFE2817:
+.LFE2818:
 	.size	ebc_lut_update, .-ebc_lut_update
 	.align	2
 	.p2align 3,,7
 	.type	ebc_state_read, %function
 ebc_state_read:
-.LFB2833:
-	.loc 1 1663 0
+.LFB2834:
+	.loc 1 1750 0
 	.cfi_startproc
 .LVL267:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1664 0
+	.loc 1 1751 0
 	adrp	x3, .LANCHOR0
-	.loc 1 1663 0
+	.loc 1 1750 0
 	mov	x0, x2
 .LVL268:
-	.loc 1 1664 0
+	.loc 1 1751 0
 	adrp	x1, .LC14
 .LVL269:
-	.loc 1 1663 0
+	.loc 1 1750 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1664 0
+	.loc 1 1751 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL270:
 	add	x1, x1, :lo12:.LC14
 	ldr	w2, [x2, 608]
 	bl	sprintf
 .LVL271:
-	.loc 1 1665 0
+	.loc 1 1752 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3036,14 +3030,14 @@ ebc_state_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2833:
+.LFE2834:
 	.size	ebc_state_read, .-ebc_state_read
 	.align	2
 	.p2align 3,,7
 	.type	ebc_version_read, %function
 ebc_version_read:
-.LFB2832:
-	.loc 1 1654 0
+.LFB2833:
+	.loc 1 1741 0
 	.cfi_startproc
 .LVL272:
 	stp	x29, x30, [sp, -16]!
@@ -3052,22 +3046,22 @@ ebc_version_read:
 	.cfi_offset 30, -8
 	mov	x0, x2
 .LVL273:
-	.loc 1 1655 0
+	.loc 1 1742 0
 	adrp	x1, .LC16
 .LVL274:
 	adrp	x2, .LC15
 .LVL275:
-	.loc 1 1654 0
+	.loc 1 1741 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1655 0
+	.loc 1 1742 0
 	add	x2, x2, :lo12:.LC15
-	.loc 1 1654 0
-	.loc 1 1655 0
+	.loc 1 1741 0
+	.loc 1 1742 0
 	add	x1, x1, :lo12:.LC16
 	bl	sprintf
 .LVL276:
-	.loc 1 1656 0
+	.loc 1 1743 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3075,34 +3069,34 @@ ebc_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2832:
+.LFE2833:
 	.size	ebc_version_read, .-ebc_version_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
-.LFB2830:
-	.loc 1 1618 0
+.LFB2831:
+	.loc 1 1705 0
 	.cfi_startproc
 .LVL277:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 1619 0
+	.loc 1 1706 0
 	adrp	x0, .LANCHOR0
 .LVL278:
-	.loc 1 1618 0
+	.loc 1 1705 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1622 0
+	.loc 1 1709 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1618 0
+	.loc 1 1705 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1618 0
+	.loc 1 1705 0
 	mov	x19, x2
-	.loc 1 1622 0
+	.loc 1 1709 0
 	ldr	x1, [x0, 16]
 .LVL279:
 .LBB1190:
@@ -3114,14 +3108,14 @@ pmic_vcom_read:
 .LVL280:
 .LBE1191:
 .LBE1190:
-	.loc 1 1624 0
+	.loc 1 1711 0
 	mov	w2, w0
 	adrp	x1, .LC14
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC14
 	bl	sprintf
 .LVL281:
-	.loc 1 1625 0
+	.loc 1 1712 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL282:
@@ -3132,27 +3126,27 @@ pmic_vcom_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2830:
+.LFE2831:
 	.size	pmic_vcom_read, .-pmic_vcom_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_temp_read, %function
 pmic_temp_read:
-.LFB2829:
-	.loc 1 1604 0
+.LFB2830:
+	.loc 1 1691 0
 	.cfi_startproc
 .LVL283:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 1605 0
+	.loc 1 1692 0
 	adrp	x0, .LANCHOR0
 .LVL284:
-	.loc 1 1604 0
+	.loc 1 1691 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1608 0
+	.loc 1 1695 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
 .LBB1192:
 .LBB1193:
@@ -3161,11 +3155,11 @@ pmic_temp_read:
 .LVL285:
 .LBE1193:
 .LBE1192:
-	.loc 1 1604 0
+	.loc 1 1691 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 1604 0
+	.loc 1 1691 0
 	adrp	x19, __stack_chk_guard
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x20, x2
@@ -3173,7 +3167,7 @@ pmic_temp_read:
 	str	x2, [x29, 40]
 	mov	x2,0
 .LVL286:
-	.loc 1 1608 0
+	.loc 1 1695 0
 	ldr	x2, [x0, 16]
 .LBB1195:
 .LBB1194:
@@ -3184,18 +3178,18 @@ pmic_temp_read:
 .LVL287:
 .LBE1194:
 .LBE1195:
-	.loc 1 1610 0
+	.loc 1 1697 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC14
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC14
 	bl	sprintf
 .LVL288:
-	.loc 1 1611 0
+	.loc 1 1698 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L286
+	cbnz	x1, .L283
 	ldp	x19, x20, [sp, 16]
 .LVL289:
 	sxtw	x0, w0
@@ -3208,37 +3202,37 @@ pmic_temp_read:
 	.cfi_def_cfa 31, 0
 	ret
 .LVL290:
-.L286:
+.L283:
 	.cfi_restore_state
 	bl	__stack_chk_fail
 .LVL291:
 	.cfi_endproc
-.LFE2829:
+.LFE2830:
 	.size	pmic_temp_read, .-pmic_temp_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_name_read, %function
 pmic_name_read:
-.LFB2828:
-	.loc 1 1593 0
+.LFB2829:
+	.loc 1 1680 0
 	.cfi_startproc
 .LVL292:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1594 0
+	.loc 1 1681 0
 	adrp	x3, .LANCHOR0
-	.loc 1 1593 0
+	.loc 1 1680 0
 	mov	x0, x2
 .LVL293:
-	.loc 1 1596 0
+	.loc 1 1683 0
 	adrp	x1, .LC16
 .LVL294:
-	.loc 1 1593 0
+	.loc 1 1680 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1596 0
+	.loc 1 1683 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL295:
 	add	x1, x1, :lo12:.LC16
@@ -3246,7 +3240,7 @@ pmic_name_read:
 	add	x2, x2, 8
 	bl	sprintf
 .LVL296:
-	.loc 1 1597 0
+	.loc 1 1684 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3254,24 +3248,24 @@ pmic_name_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2828:
+.LFE2829:
 	.size	pmic_name_read, .-pmic_name_read
 	.align	2
 	.p2align 3,,7
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
-.LFB2831:
-	.loc 1 1630 0
+.LFB2832:
+	.loc 1 1717 0
 	.cfi_startproc
 .LVL297:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 1631 0
+	.loc 1 1718 0
 	adrp	x0, .LANCHOR0
 .LVL298:
-	.loc 1 1630 0
+	.loc 1 1717 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -3281,44 +3275,44 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 1630 0
+	.loc 1 1717 0
 	add	x1, x19, :lo12:__stack_chk_guard
 .LVL299:
 	mov	x21, x2
-	.loc 1 1631 0
+	.loc 1 1718 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
 .LVL300:
-	.loc 1 1630 0
+	.loc 1 1717 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
 .LVL301:
 	mov	x20, x3
-	.loc 1 1634 0
+	.loc 1 1721 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
 .LVL302:
-	.loc 1 1635 0
-	cbnz	w0, .L296
+	.loc 1 1722 0
+	cbnz	w0, .L293
 .LVL303:
-	.loc 1 1639 0
+	.loc 1 1726 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
 .LVL304:
-	.loc 1 1640 0
-	cbnz	w0, .L297
-.L289:
-	.loc 1 1646 0
+	.loc 1 1727 0
+	cbnz	w0, .L294
+.L286:
+	.loc 1 1733 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
 .LVL305:
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L298
+	cbnz	x1, .L295
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 .LVL306:
@@ -3334,49 +3328,49 @@ pmic_vcom_write:
 	ret
 .LVL307:
 	.p2align 3
-.L296:
+.L293:
 	.cfi_restore_state
-	.loc 1 1636 0
+	.loc 1 1723 0
 	ldr	x0, [x22]
 	adrp	x1, .LC17
 	mov	x2, x21
 	add	x1, x1, :lo12:.LC17
-	.loc 1 1637 0
+	.loc 1 1724 0
 	mov	x20, -1
 .LVL308:
-	.loc 1 1636 0
+	.loc 1 1723 0
 	bl	_dev_err
 .LVL309:
-	.loc 1 1637 0
-	b	.L289
+	.loc 1 1724 0
+	b	.L286
 .LVL310:
 	.p2align 3
-.L297:
-	.loc 1 1641 0
+.L294:
+	.loc 1 1728 0
 	ldr	x0, [x22]
 	adrp	x1, .LC18
-	.loc 1 1642 0
+	.loc 1 1729 0
 	mov	x20, -1
 .LVL311:
-	.loc 1 1641 0
+	.loc 1 1728 0
 	add	x1, x1, :lo12:.LC18
 	bl	_dev_err
 .LVL312:
-	.loc 1 1642 0
-	b	.L289
-.L298:
-	.loc 1 1646 0
+	.loc 1 1729 0
+	b	.L286
+.L295:
+	.loc 1 1733 0
 	bl	__stack_chk_fail
 .LVL313:
 	.cfi_endproc
-.LFE2831:
+.LFE2832:
 	.size	pmic_vcom_write, .-pmic_vcom_write
 	.align	2
 	.p2align 3,,7
 	.type	waveform_version_read, %function
 waveform_version_read:
-.LFB2827:
-	.loc 1 1582 0
+.LFB2828:
+	.loc 1 1669 0
 	.cfi_startproc
 .LVL314:
 	stp	x29, x30, [sp, -32]!
@@ -3387,19 +3381,19 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1582 0
+	.loc 1 1669 0
 	mov	x19, x2
-	.loc 1 1583 0
+	.loc 1 1670 0
 	bl	epd_lut_get_wf_version
 .LVL315:
-	.loc 1 1585 0
+	.loc 1 1672 0
 	mov	x2, x0
 	adrp	x1, .LC16
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC16
 	bl	sprintf
 .LVL316:
-	.loc 1 1586 0
+	.loc 1 1673 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL317:
@@ -3410,81 +3404,81 @@ waveform_version_read:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2827:
+.LFE2828:
 	.size	waveform_version_read, .-waveform_version_read
 	.section	.init.text,"ax",@progbits
 	.align	2
 	.type	ebc_init, %function
 ebc_init:
-.LFB2844:
-	.loc 1 2098 0
+.LFB2845:
+	.loc 1 2185 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2099 0
+	.loc 1 2186 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 2098 0
+	.loc 1 2185 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2099 0
+	.loc 1 2186 0
 	bl	__platform_driver_register
 .LVL318:
-	.loc 1 2100 0
+	.loc 1 2187 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2844:
+.LFE2845:
 	.size	ebc_init, .-ebc_init
 	.text
 	.align	2
 	.p2align 3,,7
 	.type	direct_mode_data_change.isra.1, %function
 direct_mode_data_change.isra.1:
-.LFB2847:
-	.loc 1 519 0
+.LFB2848:
+	.loc 1 616 0
 	.cfi_startproc
 .LVL319:
-	.loc 1 523 0
+	.loc 1 620 0
 	adrp	x6, .LANCHOR0
-	.loc 1 519 0
+	.loc 1 616 0
 	and	w3, w3, 255
-	.loc 1 529 0
+	.loc 1 626 0
 	sub	w3, w3, w4
 .LVL320:
-	.loc 1 523 0
+	.loc 1 620 0
 	ldr	x13, [x6, #:lo12:.LANCHOR0]
-	.loc 1 530 0
+	.loc 1 627 0
 	lsl	w3, w3, 16
 .LVL321:
 	add	x5, x5, x3, sxtw
 .LVL322:
-	.loc 1 531 0
+	.loc 1 628 0
 	add	x13, x13, 24
 	ldr	w16, [x13, 156]
-	.loc 1 534 0
+	.loc 1 631 0
 	ldp	w3, w15, [x13, 84]
 .LVL323:
-	.loc 1 539 0
+	.loc 1 636 0
 	cmp	w15, 0
-	ble	.L315
+	ble	.L312
 	lsr	w14, w3, 4
 	mov	w12, 0
 .LVL324:
 	sub	w11, w14, #1
 	add	x11, x11, 1
 	lsl	x11, x11, 3
-	.loc 1 540 0
-	cbz	w16, .L318
+	.loc 1 637 0
+	cbz	w16, .L315
 .LVL325:
-.L329:
-	.loc 1 541 0
+.L326:
+	.loc 1 638 0
 	ldr	w6, [x13, 88]
 .LVL326:
 	sub	w6, w6, #1
@@ -3493,10 +3487,10 @@ direct_mode_data_change.isra.1:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
 .LVL327:
-.L319:
-	.loc 1 545 0
-	cbz	w14, .L327
-	.loc 1 519 0
+.L316:
+	.loc 1 642 0
+	cbz	w14, .L324
+	.loc 1 616 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -3505,24 +3499,24 @@ direct_mode_data_change.isra.1:
 	.cfi_def_cfa_register 29
 .LVL328:
 	.p2align 2
-.L320:
-	.loc 1 545 0
+.L317:
+	.loc 1 642 0
 	mov	x7, 0
 	.p2align 2
-.L309:
-	.loc 1 547 0
+.L306:
+	.loc 1 644 0
 	ldr	x4, [x2, x7]
 .LVL329:
 	add	x6, x6, 4
-	.loc 1 546 0
+	.loc 1 643 0
 	ldr	x3, [x1, x7]
 .LVL330:
 	add	x7, x7, 8
-	.loc 1 549 0
+	.loc 1 646 0
 	and	w9, w4, 65535
-	.loc 1 545 0
+	.loc 1 642 0
 	cmp	x11, x7
-	.loc 1 549 0
+	.loc 1 646 0
 	and	w8, w3, 65535
 .LBB1196:
 .LBB1197:
@@ -3536,7 +3530,7 @@ direct_mode_data_change.isra.1:
 	add	w9, w9, w8, lsr 8
 .LBE1197:
 .LBE1196:
-	.loc 1 550 0
+	.loc 1 647 0
 	lsr	w10, w4, 16
 	lsr	w8, w3, 16
 .LBB1201:
@@ -3569,10 +3563,10 @@ direct_mode_data_change.isra.1:
 	add	w10, w10, w8, lsr 8
 .LBE1204:
 .LBE1211:
-	.loc 1 551 0
+	.loc 1 648 0
 	ubfx	x9, x4, 32, 16
 	ubfx	x8, x3, 32, 16
-	.loc 1 552 0
+	.loc 1 649 0
 	lsr	x4, x4, 48
 .LVL331:
 .LBB1212:
@@ -3581,7 +3575,7 @@ direct_mode_data_change.isra.1:
 	orr	w17, w30, w17, lsl 4
 .LBE1200:
 .LBE1212:
-	.loc 1 549 0
+	.loc 1 646 0
 	strb	w17, [x6, -4]
 .LBB1213:
 .LBB1214:
@@ -3613,7 +3607,7 @@ direct_mode_data_change.isra.1:
 	add	w8, w9, w8, lsr 8
 .LBE1216:
 .LBE1223:
-	.loc 1 552 0
+	.loc 1 649 0
 	lsr	x3, x3, 48
 .LVL332:
 .LBB1224:
@@ -3622,7 +3616,7 @@ direct_mode_data_change.isra.1:
 	orr	w9, w18, w10, lsl 4
 .LBE1207:
 .LBE1224:
-	.loc 1 550 0
+	.loc 1 647 0
 	strb	w9, [x6, -3]
 .LBB1225:
 .LBB1226:
@@ -3660,7 +3654,7 @@ direct_mode_data_change.isra.1:
 	orr	w4, w17, w10, lsl 4
 .LBE1219:
 .LBE1234:
-	.loc 1 551 0
+	.loc 1 648 0
 	strb	w4, [x6, -2]
 .LBB1235:
 .LBB1229:
@@ -3671,23 +3665,23 @@ direct_mode_data_change.isra.1:
 	orr	w3, w4, w3, lsl 4
 .LBE1229:
 .LBE1235:
-	.loc 1 552 0
+	.loc 1 649 0
 	strb	w3, [x6, -1]
-	.loc 1 545 0
-	bne	.L309
-	.loc 1 539 0
+	.loc 1 642 0
+	bne	.L306
+	.loc 1 636 0
 	add	w12, w12, 1
 	add	x1, x1, x11
 .LVL333:
 	add	x2, x2, x11
 .LVL334:
 	cmp	w15, w12
-	beq	.L303
-.L328:
+	beq	.L300
+.L325:
 	ldr	w3, [x13, 84]
-	.loc 1 540 0
-	cbz	w16, .L306
-	.loc 1 541 0
+	.loc 1 637 0
+	cbz	w16, .L303
+	.loc 1 638 0
 	ldr	w6, [x13, 88]
 .LVL335:
 	sub	w6, w6, #1
@@ -3696,32 +3690,32 @@ direct_mode_data_change.isra.1:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
 .LVL336:
-	.loc 1 545 0
-	cbnz	w14, .L320
-.L326:
-	.loc 1 539 0
+	.loc 1 642 0
+	cbnz	w14, .L317
+.L323:
+	.loc 1 636 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	bne	.L328
-.L303:
-	.loc 1 555 0
+	bne	.L325
+.L300:
+	.loc 1 652 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 .LVL337:
-.L318:
-	.loc 1 543 0
+.L315:
+	.loc 1 640 0
 	mul	w6, w12, w3
 .LVL338:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
 .LVL339:
-	b	.L319
+	b	.L316
 .LVL340:
 	.p2align 3
-.L306:
+.L303:
 	.cfi_def_cfa 29, 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
@@ -3730,58 +3724,58 @@ direct_mode_data_change.isra.1:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
 .LVL342:
-	.loc 1 545 0
-	cbnz	w14, .L320
-	b	.L326
+	.loc 1 642 0
+	cbnz	w14, .L317
+	b	.L323
 .LVL343:
-.L327:
+.L324:
 	.cfi_def_cfa 31, 0
 	.cfi_restore 29
 	.cfi_restore 30
-	.loc 1 539 0
+	.loc 1 636 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L315
+	beq	.L312
 	ldr	w3, [x13, 84]
-	.loc 1 540 0
-	cbz	w16, .L318
-	b	.L329
-.L315:
+	.loc 1 637 0
+	cbz	w16, .L315
+	b	.L326
+.L312:
 	ret
 	.cfi_endproc
-.LFE2847:
+.LFE2848:
 	.size	direct_mode_data_change.isra.1, .-direct_mode_data_change.isra.1
 	.align	2
 	.p2align 3,,7
 	.type	direct_mode_data_change_part.isra.2, %function
 direct_mode_data_change_part.isra.2:
-.LFB2848:
-	.loc 1 557 0
+.LFB2849:
+	.loc 1 654 0
 	.cfi_startproc
 .LVL344:
-	.loc 1 561 0
+	.loc 1 658 0
 	adrp	x6, .LANCHOR0
-	.loc 1 557 0
+	.loc 1 654 0
 	and	w3, w3, 255
-	.loc 1 566 0
+	.loc 1 663 0
 	sub	w3, w3, w4
 .LVL345:
-	.loc 1 561 0
+	.loc 1 658 0
 	ldr	x14, [x6, #:lo12:.LANCHOR0]
-	.loc 1 567 0
+	.loc 1 664 0
 	lsl	w3, w3, 16
 .LVL346:
 	add	x5, x5, x3, sxtw
 .LVL347:
-	.loc 1 568 0
+	.loc 1 665 0
 	add	x14, x14, 24
 	ldr	w16, [x14, 156]
-	.loc 1 571 0
+	.loc 1 668 0
 	ldp	w3, w15, [x14, 84]
 .LVL348:
-	.loc 1 576 0
+	.loc 1 673 0
 	cmp	w15, 0
-	ble	.L396
+	ble	.L393
 	lsr	w11, w3, 4
 .LVL349:
 	mov	w12, 0
@@ -3795,11 +3789,11 @@ direct_mode_data_change_part.isra.2:
 	lsl	x13, x13, 3
 .LBE1237:
 .LBE1236:
-	.loc 1 577 0
-	cbz	w16, .L399
+	.loc 1 674 0
+	cbz	w16, .L396
 .LVL351:
-.L414:
-	.loc 1 578 0
+.L411:
+	.loc 1 675 0
 	ldr	w6, [x14, 88]
 .LVL352:
 	sub	w6, w6, #1
@@ -3808,22 +3802,22 @@ direct_mode_data_change_part.isra.2:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
 .LVL353:
-.L400:
-	.loc 1 582 0
-	cbz	w11, .L402
+.L397:
+	.loc 1 679 0
+	cbz	w11, .L399
 	add	x6, x6, 4
 .LVL354:
 	mov	x8, 0
 .LVL355:
-.L403:
-	.loc 1 583 0
+.L400:
+	.loc 1 680 0
 	ldr	x3, [x1, x8, lsl 3]
-	.loc 1 584 0
+	.loc 1 681 0
 	ldr	x4, [x2, x8, lsl 3]
-	.loc 1 585 0
+	.loc 1 682 0
 	cmp	x3, x4
-	beq	.L412
-	.loc 1 557 0
+	beq	.L409
+	.loc 1 654 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -3831,8 +3825,8 @@ direct_mode_data_change_part.isra.2:
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 .LVL356:
-.L404:
-	.loc 1 586 0
+.L401:
+	.loc 1 683 0
 	and	w17, w4, 65535
 	and	w9, w3, 65535
 .LVL357:
@@ -3842,7 +3836,7 @@ direct_mode_data_change_part.isra.2:
 	mov	w7, 0
 	.loc 1 139 0
 	cmp	w17, w9
-	beq	.L337
+	beq	.L334
 	.loc 1 137 0
 	eor	w18, w17, w9
 .LVL358:
@@ -3884,12 +3878,12 @@ direct_mode_data_change_part.isra.2:
 	and	w7, w9, w7
 	and	w7, w7, 255
 .LVL359:
-.L337:
+.L334:
 .LBE1240:
 .LBE1239:
-	.loc 1 586 0
+	.loc 1 683 0
 	strb	w7, [x6, -4]
-	.loc 1 587 0
+	.loc 1 684 0
 	lsr	w17, w4, 16
 	lsr	w9, w3, 16
 .LBB1241:
@@ -3898,7 +3892,7 @@ direct_mode_data_change_part.isra.2:
 	mov	w7, 0
 	.loc 1 139 0
 	cmp	w17, w9
-	beq	.L342
+	beq	.L339
 	.loc 1 137 0
 	eor	w18, w17, w9
 .LVL360:
@@ -3940,12 +3934,12 @@ direct_mode_data_change_part.isra.2:
 	and	w7, w9, w7
 	and	w7, w7, 255
 .LVL361:
-.L342:
+.L339:
 .LBE1242:
 .LBE1241:
-	.loc 1 587 0
+	.loc 1 684 0
 	strb	w7, [x6, -3]
-	.loc 1 588 0
+	.loc 1 685 0
 	ubfx	x17, x4, 32, 16
 	ubfx	x9, x3, 32, 16
 .LBB1243:
@@ -3954,7 +3948,7 @@ direct_mode_data_change_part.isra.2:
 	mov	w7, 0
 	.loc 1 139 0
 	cmp	w17, w9
-	beq	.L347
+	beq	.L344
 	.loc 1 137 0
 	eor	w18, w17, w9
 .LVL362:
@@ -3996,12 +3990,12 @@ direct_mode_data_change_part.isra.2:
 	and	w7, w9, w7
 	and	w7, w7, 255
 .LVL363:
-.L347:
+.L344:
 .LBE1244:
 .LBE1243:
-	.loc 1 588 0
+	.loc 1 685 0
 	strb	w7, [x6, -2]
-	.loc 1 589 0
+	.loc 1 686 0
 	lsr	x4, x4, 48
 .LVL364:
 	lsr	x3, x3, 48
@@ -4012,7 +4006,7 @@ direct_mode_data_change_part.isra.2:
 	mov	w7, 0
 	.loc 1 139 0
 	cmp	w4, w3
-	beq	.L352
+	beq	.L349
 	.loc 1 137 0
 	eor	w9, w4, w3
 .LVL366:
@@ -4055,47 +4049,47 @@ direct_mode_data_change_part.isra.2:
 	and	w4, w7, w4
 	and	w7, w4, 255
 .LVL368:
-.L352:
+.L349:
 .LBE1238:
 .LBE1245:
-	.loc 1 589 0
+	.loc 1 686 0
 	strb	w7, [x6, -1]
 	add	x8, x8, 1
 	add	x6, x6, 4
-	.loc 1 582 0
+	.loc 1 679 0
 	cmp	w11, w8
-	ble	.L413
+	ble	.L410
 .LVL369:
-.L358:
-	.loc 1 583 0
+.L355:
+	.loc 1 680 0
 	ldr	x3, [x1, x8, lsl 3]
-	.loc 1 584 0
+	.loc 1 681 0
 	ldr	x4, [x2, x8, lsl 3]
-	.loc 1 585 0
+	.loc 1 682 0
 	cmp	x3, x4
-	bne	.L404
-	.loc 1 592 0
+	bne	.L401
+	.loc 1 689 0
 	str	wzr, [x6, -4]
 	add	x8, x8, 1
 	add	x6, x6, 4
-	.loc 1 582 0
+	.loc 1 679 0
 	cmp	w11, w8
-	bgt	.L358
-.L413:
+	bgt	.L355
+.L410:
 	add	x1, x1, x13
 .LVL370:
 	add	x2, x2, x13
 .LVL371:
-.L335:
-	.loc 1 576 0
+.L332:
+	.loc 1 673 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L330
+	beq	.L327
 	ldr	w3, [x14, 84]
 .LVL372:
-	.loc 1 577 0
-	cbz	w16, .L333
-	.loc 1 578 0
+	.loc 1 674 0
+	cbz	w16, .L330
+	.loc 1 675 0
 	ldr	w6, [x14, 88]
 .LVL373:
 	sub	w6, w6, #1
@@ -4104,50 +4098,50 @@ direct_mode_data_change_part.isra.2:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
 .LVL374:
-.L334:
-	.loc 1 582 0
-	cbz	w11, .L335
+.L331:
+	.loc 1 679 0
+	cbz	w11, .L332
 	add	x6, x6, 4
 .LVL375:
 	mov	x8, 0
-	b	.L358
+	b	.L355
 .LVL376:
 	.p2align 3
-.L412:
+.L409:
 	.cfi_def_cfa 31, 0
 	.cfi_restore 29
 	.cfi_restore 30
-	.loc 1 592 0
+	.loc 1 689 0
 	str	wzr, [x6, -4]
 	add	x8, x8, 1
-	.loc 1 582 0
+	.loc 1 679 0
 	cmp	w11, w8
 	add	x6, x6, 4
-	bgt	.L403
+	bgt	.L400
 	add	x1, x1, x13
 .LVL377:
 	add	x2, x2, x13
 .LVL378:
-.L402:
-	.loc 1 576 0
+.L399:
+	.loc 1 673 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L396
+	beq	.L393
 	ldr	w3, [x14, 84]
 .LVL379:
-	.loc 1 577 0
-	cbnz	w16, .L414
-.L399:
-	.loc 1 580 0
+	.loc 1 674 0
+	cbnz	w16, .L411
+.L396:
+	.loc 1 677 0
 	mul	w6, w12, w3
 .LVL380:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
 .LVL381:
-	b	.L400
+	b	.L397
 .LVL382:
 	.p2align 3
-.L333:
+.L330:
 	.cfi_def_cfa 29, 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
@@ -4156,46 +4150,46 @@ direct_mode_data_change_part.isra.2:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
 .LVL384:
-	b	.L334
+	b	.L331
 .LVL385:
-.L330:
-	.loc 1 597 0
+.L327:
+	.loc 1 694 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 .LVL386:
-.L396:
+.L393:
 	ret
 	.cfi_endproc
-.LFE2848:
+.LFE2849:
 	.size	direct_mode_data_change_part.isra.2, .-direct_mode_data_change_part.isra.2
 	.align	2
 	.p2align 3,,7
 	.type	flip.isra.3, %function
 flip.isra.3:
-.LFB2849:
-	.loc 1 599 0
+.LFB2850:
+	.loc 1 696 0
 	.cfi_startproc
 .LVL387:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 603 0
+	.loc 1 700 0
 	sxtw	x2, w1
-	.loc 1 599 0
+	.loc 1 696 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 599 0
+	.loc 1 696 0
 	mov	x20, x0
-	.loc 1 601 0
+	.loc 1 698 0
 	ldr	w19, [x0, 72]
-	.loc 1 603 0
+	.loc 1 700 0
 	ldr	x0, [x0]
 .LVL388:
 .LBB1246:
@@ -4204,23 +4198,23 @@ flip.isra.3:
 .LBB1249:
 	.file 10 "./include/linux/dma-mapping.h"
 	.loc 10 266 0
-	cbz	x0, .L418
+	cbz	x0, .L415
 	ldr	x3, [x0, 648]
 	.loc 10 268 0
 	adrp	x4, dummy_dma_ops
 	add	x4, x4, :lo12:dummy_dma_ops
 	cmp	x3, 0
 	csel	x3, x4, x3, eq
-.L416:
+.L413:
 .LBE1249:
 .LBE1248:
 	.loc 10 434 0
 	ldr	x5, [x3, 88]
 	sxtw	x19, w19
-	cbz	x5, .L417
+	cbz	x5, .L414
 .LBE1247:
 .LBE1246:
-	.loc 1 603 0
+	.loc 1 700 0
 	add	x4, x19, x19, lsl 1
 .LBB1255:
 .LBB1252:
@@ -4228,7 +4222,7 @@ flip.isra.3:
 	mov	w3, 1
 .LBE1252:
 .LBE1255:
-	.loc 1 603 0
+	.loc 1 700 0
 	add	x4, x20, x4, lsl 3
 .LBB1256:
 .LBB1253:
@@ -4236,10 +4230,10 @@ flip.isra.3:
 	ldr	x1, [x4, 32]
 	blr	x5
 .LVL389:
-.L417:
+.L414:
 .LBE1253:
 .LBE1256:
-	.loc 1 604 0
+	.loc 1 701 0
 	ldr	x5, [x20, 8]
 .LBB1257:
 .LBB1258:
@@ -4252,7 +4246,7 @@ flip.isra.3:
 	mov	w1, 0
 .LBE1258:
 .LBE1257:
-	.loc 1 605 0
+	.loc 1 702 0
 	add	x19, x19, x19, lsl 1
 .LBB1261:
 .LBB1259:
@@ -4260,7 +4254,7 @@ flip.isra.3:
 	ldr	x5, [x5, 64]
 .LBE1259:
 .LBE1261:
-	.loc 1 605 0
+	.loc 1 702 0
 	add	x19, x20, x19, lsl 3
 .LBB1262:
 .LBB1260:
@@ -4269,7 +4263,7 @@ flip.isra.3:
 .LVL390:
 .LBE1260:
 .LBE1262:
-	.loc 1 605 0
+	.loc 1 702 0
 	ldr	x1, [x20, 8]
 .LBB1263:
 .LBB1264:
@@ -4282,7 +4276,7 @@ flip.isra.3:
 .LVL391:
 .LBE1264:
 .LBE1263:
-	.loc 1 606 0
+	.loc 1 703 0
 	ldr	x2, [x20, 8]
 .LBB1265:
 .LBB1266:
@@ -4294,12 +4288,12 @@ flip.isra.3:
 .LVL392:
 .LBE1266:
 .LBE1265:
-	.loc 1 607 0
+	.loc 1 704 0
 	ldr	w1, [x20, 72]
 	mov	w0, 1
 	sub	w0, w0, w1
 	str	w0, [x20, 72]
-	.loc 1 608 0
+	.loc 1 705 0
 	ldp	x19, x20, [sp, 16]
 .LVL393:
 	ldp	x29, x30, [sp], 32
@@ -4312,7 +4306,7 @@ flip.isra.3:
 	ret
 .LVL394:
 	.p2align 3
-.L418:
+.L415:
 	.cfi_restore_state
 .LBB1267:
 .LBB1254:
@@ -4321,20 +4315,20 @@ flip.isra.3:
 	.loc 10 268 0
 	adrp	x3, dummy_dma_ops
 	add	x3, x3, :lo12:dummy_dma_ops
-	b	.L416
+	b	.L413
 .LBE1250:
 .LBE1251:
 .LBE1254:
 .LBE1267:
 	.cfi_endproc
-.LFE2849:
+.LFE2850:
 	.size	flip.isra.3, .-flip.isra.3
 	.align	2
 	.p2align 3,,7
 	.type	ebc_frame_start, %function
 ebc_frame_start:
-.LFB2814:
-	.loc 1 617 0
+.LFB2815:
+	.loc 1 714 0
 	.cfi_startproc
 .LVL395:
 	stp	x29, x30, [sp, -48]!
@@ -4346,54 +4340,53 @@ ebc_frame_start:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 619 0
+	.loc 1 716 0
 	add	x19, x0, 184
-	.loc 1 617 0
+	.loc 1 714 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 617 0
+	.loc 1 714 0
 	mov	x20, x0
-	.loc 1 618 0
+	.loc 1 715 0
 	add	x21, x0, 24
-	.loc 1 621 0
+	.loc 1 718 0
 	ldr	x1, [x19, 208]
 	ldr	w0, [x1, 40]
 .LVL396:
-	cmp	w0, 12
-	bgt	.L425
-	cmp	w0, 7
-	bge	.L426
-	cbnz	w0, .L439
-	.loc 1 642 0
+	cmp	w0, 1
+	beq	.L422
+	bgt	.L423
+	cbnz	w0, .L421
+	.loc 1 738 0
 	ldr	x0, [x19, 168]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 128]
 	ldr	x3, [x19, 152]
 	bl	get_auto_image
 .LVL397:
-	.loc 1 647 0
+	.loc 1 743 0
 	ldr	w0, [x19, 36]
-	cbz	w0, .L431
+	cbz	w0, .L428
 .LBB1268:
 .LBB1269:
-	.loc 1 612 0
+	.loc 1 709 0
 	str	wzr, [x21, 72]
-	.loc 1 613 0
+	.loc 1 710 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.3
 .LVL398:
 .LBE1269:
 .LBE1268:
-	.loc 1 649 0
+	.loc 1 745 0
 	ldp	x1, x2, [x19, 128]
 	mov	x4, x19
 	ldr	x3, [x19, 152]
 	ldr	x0, [x19, 176]
 	bl	get_auto_image
 .LVL399:
-.L423:
-	.loc 1 693 0
+.L420:
+	.loc 1 789 0
 	ldp	x19, x20, [sp, 16]
 .LVL400:
 	ldr	x21, [sp, 32]
@@ -4408,37 +4401,55 @@ ebc_frame_start:
 	ret
 .LVL401:
 	.p2align 3
-.L439:
+.L423:
 	.cfi_restore_state
-	.loc 1 621 0
-	cmp	w0, 1
-	bne	.L424
-.L428:
-	.loc 1 624 0
+	.loc 1 718 0
+	sub	w0, w0, #7
+	cmp	w0, 5
+	bhi	.L421
+	.loc 1 764 0
+	ldr	x2, [x19, 200]
+	.loc 1 761 0
+	ldrb	w4, [x19, 32]
+	str	w4, [x19, 40]
+	.loc 1 762 0
 	ldr	x0, [x19, 168]
-	mov	x4, x19
-	ldp	x1, x2, [x19, 128]
-	ldr	x3, [x19, 152]
-	bl	get_auto_image
+	mov	w3, w4
+	ldr	x5, [x20, 296]
+	ldr	x2, [x2, 16]
+	ldr	x1, [x1, 16]
+	bl	direct_mode_data_change_part.isra.2
 .LVL402:
-	.loc 1 629 0
-	ldr	w0, [x19, 36]
-	cbz	w0, .L429
 .LBB1270:
 .LBB1271:
-	.loc 1 612 0
+	.loc 1 709 0
 	str	wzr, [x21, 72]
-	.loc 1 613 0
+	.loc 1 710 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.3
 .LVL403:
 .LBE1271:
 .LBE1270:
-	.loc 1 693 0
+	.loc 1 767 0
+	ldr	w4, [x19, 40]
+	.loc 1 769 0
+	ldp	x2, x1, [x19, 200]
+	.loc 1 767 0
+	sub	w4, w4, #1
+	str	w4, [x19, 40]
+	.loc 1 768 0
+	ldr	x0, [x19, 176]
+	ldrb	w3, [x20, 216]
+	ldr	x5, [x20, 296]
+	ldr	x1, [x1, 16]
+	ldr	x2, [x2, 16]
+	bl	direct_mode_data_change_part.isra.2
+.LVL404:
+	.loc 1 789 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL404:
+.LVL405:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -4448,54 +4459,32 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL405:
+.LVL406:
 	.p2align 3
-.L425:
+.L422:
 	.cfi_restore_state
-	.loc 1 621 0
-	cmp	w0, 18
-	beq	.L428
-.L424:
-	.loc 1 681 0
-	ldr	x2, [x19, 200]
-	.loc 1 678 0
-	ldrb	w4, [x19, 32]
-	str	w4, [x19, 40]
-	.loc 1 679 0
+	.loc 1 720 0
 	ldr	x0, [x19, 168]
-	mov	w3, w4
-	ldr	x5, [x20, 296]
-	ldr	x2, [x2, 16]
-	ldr	x1, [x1, 16]
-	bl	direct_mode_data_change.isra.1
-.LVL406:
+	mov	x4, x19
+	ldp	x1, x2, [x19, 128]
+	ldr	x3, [x19, 152]
+	bl	get_auto_image
+.LVL407:
+	.loc 1 725 0
+	ldr	w0, [x19, 36]
+	cbz	w0, .L426
 .LBB1272:
 .LBB1273:
-	.loc 1 612 0
+	.loc 1 709 0
 	str	wzr, [x21, 72]
-	.loc 1 613 0
+	.loc 1 710 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.3
-.LVL407:
+.LVL408:
 .LBE1273:
 .LBE1272:
-	.loc 1 684 0
-	ldr	w4, [x19, 40]
-	.loc 1 686 0
-	ldp	x2, x1, [x19, 200]
-	.loc 1 684 0
-	sub	w4, w4, #1
-	str	w4, [x19, 40]
-	.loc 1 685 0
-	ldr	x0, [x19, 176]
-	ldrb	w3, [x20, 216]
-	ldr	x5, [x20, 296]
-	ldr	x1, [x1, 16]
-	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change.isra.1
-.LVL408:
-	.loc 1 693 0
+	.loc 1 789 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 .LVL409:
@@ -4510,48 +4499,48 @@ ebc_frame_start:
 	ret
 .LVL410:
 	.p2align 3
-.L426:
+.L421:
 	.cfi_restore_state
-	.loc 1 668 0
+	.loc 1 777 0
 	ldr	x2, [x19, 200]
-	.loc 1 665 0
+	.loc 1 774 0
 	ldrb	w4, [x19, 32]
 	str	w4, [x19, 40]
-	.loc 1 666 0
+	.loc 1 775 0
 	ldr	x0, [x19, 168]
 	mov	w3, w4
 	ldr	x5, [x20, 296]
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
-	bl	direct_mode_data_change_part.isra.2
+	bl	direct_mode_data_change.isra.1
 .LVL411:
 .LBB1274:
 .LBB1275:
-	.loc 1 612 0
+	.loc 1 709 0
 	str	wzr, [x21, 72]
-	.loc 1 613 0
+	.loc 1 710 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.3
 .LVL412:
 .LBE1275:
 .LBE1274:
-	.loc 1 671 0
+	.loc 1 780 0
 	ldr	w4, [x19, 40]
-	.loc 1 673 0
+	.loc 1 782 0
 	ldp	x2, x1, [x19, 200]
-	.loc 1 671 0
+	.loc 1 780 0
 	sub	w4, w4, #1
 	str	w4, [x19, 40]
-	.loc 1 672 0
+	.loc 1 781 0
 	ldr	x0, [x19, 176]
 	ldrb	w3, [x20, 216]
 	ldr	x5, [x20, 296]
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change_part.isra.2
+	bl	direct_mode_data_change.isra.1
 .LVL413:
-	.loc 1 693 0
+	.loc 1 789 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 .LVL414:
@@ -4565,47 +4554,47 @@ ebc_frame_start:
 	.cfi_def_cfa 31, 0
 	ret
 .LVL415:
-.L431:
+.L428:
 	.cfi_restore_state
-	.loc 1 655 0
+	.loc 1 751 0
 	adrp	x1, .LANCHOR3
 	adrp	x0, .LC20
 	add	x1, x1, :lo12:.LANCHOR3
 	add	x0, x0, :lo12:.LC20
 	bl	printk
 .LVL416:
-	.loc 1 656 0
+	.loc 1 752 0
 	str	wzr, [x19, 28]
-	b	.L423
-.L429:
-	.loc 1 637 0
+	b	.L420
+.L426:
+	.loc 1 733 0
 	adrp	x1, .LANCHOR3
 	adrp	x0, .LC19
 	add	x1, x1, :lo12:.LANCHOR3
 	add	x0, x0, :lo12:.LC19
 	bl	printk
 .LVL417:
-	.loc 1 638 0
+	.loc 1 734 0
 	str	wzr, [x19, 28]
-	b	.L423
+	b	.L420
 	.cfi_endproc
-.LFE2814:
+.LFE2815:
 	.size	ebc_frame_start, .-ebc_frame_start
 	.align	2
 	.p2align 3,,7
 	.type	ebc_auto_tast_function, %function
 ebc_auto_tast_function:
-.LFB2815:
-	.loc 1 696 0
+.LFB2816:
+	.loc 1 792 0
 	.cfi_startproc
 .LVL418:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
 	.cfi_offset 30, -88
-	.loc 1 697 0
+	.loc 1 793 0
 	adrp	x1, .LANCHOR0
-	.loc 1 696 0
+	.loc 1 792 0
 	adrp	x0, __stack_chk_guard
 .LVL419:
 	add	x0, x0, :lo12:__stack_chk_guard
@@ -4616,16 +4605,16 @@ ebc_auto_tast_function:
 	.cfi_offset 20, -72
 	adrp	x20, .LANCHOR1
 	stp	x21, x22, [sp, 32]
-	.loc 1 702 0
+	.loc 1 798 0
 	add	x20, x20, :lo12:.LANCHOR1
 	.cfi_offset 21, -64
 	.cfi_offset 22, -56
-	.loc 1 697 0
+	.loc 1 793 0
 	ldr	x22, [x1, #:lo12:.LANCHOR0]
 .LVL420:
-	.loc 1 702 0
+	.loc 1 798 0
 	add	x20, x20, 376
-	.loc 1 696 0
+	.loc 1 792 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
@@ -4638,16 +4627,16 @@ ebc_auto_tast_function:
 .LBE1278:
 .LBE1277:
 .LBE1276:
-	.loc 1 696 0
+	.loc 1 792 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -32
 	.cfi_offset 26, -24
-	.loc 1 698 0
+	.loc 1 794 0
 	add	x21, x22, 24
-	.loc 1 699 0
+	.loc 1 795 0
 	add	x19, x22, 184
 	add	x26, x22, 728
-	.loc 1 696 0
+	.loc 1 792 0
 	ldr	x1, [x0]
 	str	x1, [x29, 88]
 	mov	x1,0
@@ -4662,24 +4651,47 @@ ebc_auto_tast_function:
 // 0 "" 2
 .LVL421:
 #NO_APP
-	b	.L450
+	b	.L441
 	.p2align 3
 .L449:
 .LBE1281:
 .LBE1280:
 .LBE1283:
-	.loc 1 759 0
+	.loc 1 803 0
+	cbnz	w0, .L432
+	.loc 1 814 0
+	ldr	w1, [x22, 208]
+	mov	x0, x21
+	bl	flip.isra.3
+.LVL422:
+	.loc 1 815 0
+	ldrsw	x0, [x21, 72]
+	mov	x4, x19
+	ldp	x1, x2, [x19, 128]
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 152]
+	ldr	x0, [x0, 168]
+	bl	get_auto_image
+.LVL423:
+.L437:
+	.loc 1 849 0
+	ldr	x0, [x19, 208]
+	ldr	w0, [x0, 40]
+	cmp	w0, 1
+	bls	.L448
+.L440:
+	.loc 1 853 0
 	mov	x0, x20
 	bl	up
-.LVL422:
-	.loc 1 760 0
+.LVL424:
+	.loc 1 854 0
 	bl	schedule
-.LVL423:
-.L450:
-	.loc 1 702 0
+.LVL425:
+.L441:
+	.loc 1 798 0
 	mov	x0, x20
 	bl	down
-.LVL424:
+.LVL426:
 .LBB1284:
 .LBB1282:
 .LBB1279:
@@ -4688,46 +4700,55 @@ ebc_auto_tast_function:
 .LBE1279:
 .LBE1282:
 .LBE1284:
-	.loc 1 706 0
+	.loc 1 802 0
 #APP
-// 706 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
+// 802 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
 	dmb ish
 // 0 "" 2
-	.loc 1 707 0
+	.loc 1 803 0
 #NO_APP
 	ldr	x0, [x19, 208]
 	ldr	w0, [x0, 40]
-	cmp	w0, 12
-	bgt	.L442
-	cmp	w0, 7
-	bge	.L443
-	cbz	w0, .L444
 	cmp	w0, 1
-	bne	.L441
-.L445:
-	.loc 1 711 0
+	beq	.L433
+	ble	.L449
+	sub	w0, w0, #7
+	cmp	w0, 5
+	bhi	.L432
+	.loc 1 827 0
+	ldr	w1, [x19, 40]
+	.loc 1 828 0
+	mov	x0, x21
+	.loc 1 827 0
+	sub	w1, w1, #1
+	str	w1, [x19, 40]
+	.loc 1 828 0
+	ldr	w1, [x22, 208]
+	bl	flip.isra.3
+.LVL427:
+	.loc 1 829 0
+	ldr	w4, [x19, 40]
+	cbz	w4, .L437
+	.loc 1 831 0
 	ldrsw	x0, [x21, 72]
-	mov	x4, x19
-	ldp	x1, x2, [x19, 128]
+	.loc 1 832 0
+	ldp	x2, x1, [x19, 200]
+	.loc 1 831 0
 	add	x0, x19, x0, lsl 3
-	ldr	x3, [x19, 152]
+	ldrb	w3, [x22, 216]
+	ldr	x5, [x22, 296]
+	ldr	x1, [x1, 16]
 	ldr	x0, [x0, 168]
-	bl	get_auto_image
-.LVL425:
-	.loc 1 716 0
-	ldr	w1, [x22, 208]
-	mov	x0, x21
-	bl	flip.isra.3
-.LVL426:
-.L446:
-	.loc 1 754 0
+	ldr	x2, [x2, 16]
+	bl	direct_mode_data_change_part.isra.2
+.LVL428:
+	.loc 1 849 0
 	ldr	x0, [x19, 208]
 	ldr	w0, [x0, 40]
-	.loc 1 756 0
 	cmp	w0, 1
-	.loc 1 754 0
-	ccmp	w0, 18, 4, hi
-	bne	.L449
+	bhi	.L440
+	.p2align 2
+.L448:
 .LBB1285:
 .LBB1286:
 .LBB1287:
@@ -4738,55 +4759,15 @@ ebc_auto_tast_function:
 	mov	x2, x26
 	mov	w0, 8
 	bl	queue_work_on
-.LVL427:
-	b	.L449
+.LVL429:
+	b	.L440
 	.p2align 3
-.L442:
+.L433:
 .LBE1288:
 .LBE1287:
 .LBE1286:
 .LBE1285:
-	.loc 1 707 0
-	cmp	w0, 18
-	beq	.L445
-.L441:
-	.loc 1 742 0
-	ldr	w1, [x19, 40]
-	.loc 1 743 0
-	mov	x0, x21
-	.loc 1 742 0
-	sub	w1, w1, #1
-	str	w1, [x19, 40]
-	.loc 1 743 0
-	ldr	w1, [x22, 208]
-	bl	flip.isra.3
-.LVL428:
-	.loc 1 744 0
-	ldr	w4, [x19, 40]
-	cbz	w4, .L446
-	.loc 1 746 0
-	ldrsw	x0, [x21, 72]
-	.loc 1 747 0
-	ldp	x2, x1, [x19, 200]
-	.loc 1 746 0
-	add	x0, x19, x0, lsl 3
-	ldrb	w3, [x22, 216]
-	ldr	x5, [x22, 296]
-	ldr	x1, [x1, 16]
-	ldr	x0, [x0, 168]
-	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change.isra.1
-.LVL429:
-	.loc 1 750 0
-	b	.L446
-	.p2align 3
-.L444:
-	.loc 1 719 0
-	ldr	w1, [x22, 208]
-	mov	x0, x21
-	bl	flip.isra.3
-.LVL430:
-	.loc 1 720 0
+	.loc 1 806 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 128]
@@ -4794,48 +4775,53 @@ ebc_auto_tast_function:
 	ldr	x3, [x19, 152]
 	ldr	x0, [x0, 168]
 	bl	get_auto_image
+.LVL430:
+	.loc 1 811 0
+	ldr	w1, [x22, 208]
+	mov	x0, x21
+	bl	flip.isra.3
 .LVL431:
-	.loc 1 725 0
-	b	.L446
+	.loc 1 812 0
+	b	.L437
 	.p2align 3
-.L443:
-	.loc 1 732 0
+.L432:
+	.loc 1 837 0
 	ldr	w1, [x19, 40]
-	.loc 1 733 0
+	.loc 1 838 0
 	mov	x0, x21
-	.loc 1 732 0
+	.loc 1 837 0
 	sub	w1, w1, #1
 	str	w1, [x19, 40]
-	.loc 1 733 0
+	.loc 1 838 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.3
 .LVL432:
-	.loc 1 734 0
+	.loc 1 839 0
 	ldr	w4, [x19, 40]
-	cbz	w4, .L446
-	.loc 1 736 0
+	cbz	w4, .L437
+	.loc 1 841 0
 	ldrsw	x0, [x21, 72]
-	.loc 1 737 0
+	.loc 1 842 0
 	ldp	x2, x1, [x19, 200]
-	.loc 1 736 0
+	.loc 1 841 0
 	add	x0, x19, x0, lsl 3
 	ldrb	w3, [x22, 216]
 	ldr	x5, [x22, 296]
 	ldr	x1, [x1, 16]
 	ldr	x0, [x0, 168]
 	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change_part.isra.2
+	bl	direct_mode_data_change.isra.1
 .LVL433:
-	.loc 1 740 0
-	b	.L446
+	.loc 1 845 0
+	b	.L437
 	.cfi_endproc
-.LFE2815:
+.LFE2816:
 	.size	ebc_auto_tast_function, .-ebc_auto_tast_function
 	.align	2
 	.p2align 3,,7
 	.type	ebc_power_set.part.4, %function
 ebc_power_set.part.4:
-.LFB2850:
+.LFB2851:
 	.loc 1 180 0
 	.cfi_startproc
 .LVL434:
@@ -4852,39 +4838,34 @@ ebc_power_set.part.4:
 	mov	x19, x0
 	.loc 1 197 0
 	str	w1, [x0, 368]
+	.loc 1 198 0
+	ldr	x1, [x0, 8]
+.LVL435:
 .LBB1289:
 .LBB1290:
-	.loc 3 35 0
-	mov	w1, 0
-.LVL435:
+	.loc 11 51 0
+	mov	x0, x1
+.LVL436:
+	ldr	x1, [x1, 56]
+	blr	x1
+.LVL437:
 .LBE1290:
 .LBE1289:
-	.loc 1 198 0
-	ldr	x2, [x0, 16]
-.LBB1292:
+	.loc 1 199 0
+	ldr	x2, [x19, 16]
 .LBB1291:
+.LBB1292:
 	.loc 3 35 0
+	mov	w1, 0
 	mov	x0, x2
-.LVL436:
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL437:
-.LBE1291:
-.LBE1292:
-	.loc 1 199 0
-	ldr	x1, [x19, 8]
-.LBB1293:
-.LBB1294:
-	.loc 11 51 0
-	mov	x0, x1
-	ldr	x1, [x1, 56]
-	blr	x1
 .LVL438:
-.LBE1294:
-.LBE1293:
+.LBE1292:
+.LBE1291:
 	.loc 1 200 0
 	ldr	w0, [x19, 608]
-	cbnz	w0, .L471
+	cbnz	w0, .L456
 	.loc 1 204 0
 	ldr	x0, [x19]
 	adrp	x1, .LC21
@@ -4904,18 +4885,18 @@ ebc_power_set.part.4:
 	ret
 .LVL441:
 	.p2align 3
-.L471:
+.L456:
 	.cfi_restore_state
 	.loc 1 201 0
 	str	wzr, [x19, 608]
-.LBB1295:
-.LBB1296:
+.LBB1293:
+.LBB1294:
 	.loc 4 68 0
 	add	x0, x19, 400
 	bl	__pm_relax
 .LVL442:
-.LBE1296:
-.LBE1295:
+.LBE1294:
+.LBE1293:
 	.loc 1 204 0
 	ldr	x0, [x19]
 	adrp	x1, .LC21
@@ -4933,14 +4914,14 @@ ebc_power_set.part.4:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2850:
+.LFE2851:
 	.size	ebc_power_set.part.4, .-ebc_power_set.part.4
 	.align	2
 	.p2align 3,,7
 	.type	ebc_suspend, %function
 ebc_suspend:
-.LFB2842:
-	.loc 1 2048 0
+.LFB2843:
+	.loc 1 2135 0
 	.cfi_startproc
 .LVL445:
 	stp	x29, x30, [sp, -32]!
@@ -4952,40 +4933,40 @@ ebc_suspend:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-.LBB1297:
-.LBB1298:
+.LBB1295:
+.LBB1296:
 	.loc 2 1181 0
 	ldr	x20, [x0, 184]
-.LBE1298:
-.LBE1297:
-	.loc 1 2052 0
+.LBE1296:
+.LBE1295:
+	.loc 1 2139 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 184]
 .LVL446:
 	cmp	w0, 1
-	beq	.L475
-.L473:
-	.loc 1 2056 0
+	beq	.L460
+.L458:
+	.loc 1 2143 0
 	mov	w0, 1
 	str	w0, [x19, 596]
-	.loc 1 2058 0
+	.loc 1 2145 0
 	ldr	x1, [x20, 16]
-.LBB1299:
-.LBB1300:
+.LBB1297:
+.LBB1298:
 	.loc 3 40 0
 	mov	x0, x1
 	ldr	x1, [x1, 40]
 	blr	x1
 .LVL447:
-.LBE1300:
-.LBE1299:
-	.loc 1 2059 0
+.LBE1298:
+.LBE1297:
+	.loc 1 2146 0
 	ldr	x0, [x19, 88]
 	adrp	x1, .LC23
 	add	x1, x1, :lo12:.LC23
 	bl	_dev_info
 .LVL448:
-	.loc 1 2062 0
+	.loc 1 2149 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -4997,9 +4978,9 @@ ebc_suspend:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L475:
+.L460:
 	.cfi_restore_state
-	.loc 1 2053 0
+	.loc 1 2140 0
 	ldr	x0, [x19, 88]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
@@ -5008,46 +4989,46 @@ ebc_suspend:
 	add	x1, x1, :lo12:.LC22
 	bl	_dev_info
 .LVL449:
-.LBB1301:
-.LBB1302:
+.LBB1299:
+.LBB1300:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.4
 .LVL450:
-	b	.L473
-.LBE1302:
-.LBE1301:
+	b	.L458
+.LBE1300:
+.LBE1299:
 	.cfi_endproc
-.LFE2842:
+.LFE2843:
 	.size	ebc_suspend, .-ebc_suspend
 	.align	2
 	.p2align 3,,7
 	.type	ebc_probe, %function
 ebc_probe:
-.LFB2840:
-	.loc 1 1933 0
+.LFB2841:
+	.loc 1 2020 0
 	.cfi_startproc
 .LVL451:
 	stp	x29, x30, [sp, -208]!
 	.cfi_def_cfa_offset 208
 	.cfi_offset 29, -208
 	.cfi_offset 30, -200
-.LBB1448:
-.LBB1449:
+.LBB1446:
+.LBB1447:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
-.LBE1449:
-.LBE1448:
-	.loc 1 1933 0
+.LBE1447:
+.LBE1446:
+	.loc 1 2020 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -192
 	.cfi_offset 20, -184
-	.loc 1 1934 0
+	.loc 1 2021 0
 	add	x20, x0, 16
-	.loc 1 1933 0
+	.loc 1 2020 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -160
 	.cfi_offset 24, -152
@@ -5063,143 +5044,143 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 1933 0
+	.loc 1 2020 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
-.LBB1451:
-.LBB1450:
+.LBB1449:
+.LBB1448:
 	.loc 2 711 0
 	mov	x0, x20
 	mov	x1, 800
 	bl	devm_kmalloc
 .LVL453:
-.LBE1450:
-.LBE1451:
-	.loc 1 1945 0
-	cbz	x0, .L521
-	.loc 1 1949 0
+.LBE1448:
+.LBE1449:
+	.loc 1 2032 0
+	cbz	x0, .L506
+	.loc 1 2036 0
 	adrp	x25, .LANCHOR0
 	mov	x19, x0
-	.loc 1 1951 0
+	.loc 1 2038 0
 	adrp	x1, .LC24
 	mov	w2, 0
-	.loc 1 1949 0
+	.loc 1 2036 0
 	str	x0, [x25, #:lo12:.LANCHOR0]
-	.loc 1 1951 0
+	.loc 1 2038 0
 	add	x1, x1, :lo12:.LC24
 	ldr	x0, [x20, 752]
-	.loc 1 1948 0
+	.loc 1 2035 0
 	str	x20, [x19]
-	.loc 1 1951 0
+	.loc 1 2038 0
 	bl	of_parse_phandle
 .LVL454:
-	.loc 1 1952 0
-	cbz	x0, .L561
-	.loc 1 1957 0
+	.loc 1 2039 0
+	cbz	x0, .L546
+	.loc 1 2044 0
 	bl	of_find_device_by_node
 .LVL455:
-	.loc 1 1959 0
-	cbz	x0, .L480
+	.loc 1 2046 0
+	cbz	x0, .L465
+.LBB1450:
+.LBB1451:
 .LBB1452:
-.LBB1453:
-.LBB1454:
 	.loc 2 1181 0
 	ldr	x0, [x0, 200]
 .LVL456:
-.LBE1454:
-.LBE1453:
 .LBE1452:
-	.loc 1 1962 0
+.LBE1451:
+.LBE1450:
+	.loc 1 2049 0
 	str	x0, [x19, 8]
-	.loc 1 1963 0
-	cbz	x0, .L480
-	.loc 1 1965 0
+	.loc 1 2050 0
+	cbz	x0, .L465
+	.loc 1 2052 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 1967 0
+	.loc 1 2054 0
 	mov	w2, 0
 	adrp	x1, .LC26
 	add	x1, x1, :lo12:.LC26
 	ldr	x0, [x20, 752]
 	bl	of_parse_phandle
 .LVL457:
-	.loc 1 1968 0
-	cbz	x0, .L562
-	.loc 1 1973 0
+	.loc 1 2055 0
+	cbz	x0, .L547
+	.loc 1 2060 0
 	bl	of_find_i2c_device_by_node
 .LVL458:
-	.loc 1 1975 0
-	cbz	x0, .L563
+	.loc 1 2062 0
+	cbz	x0, .L548
+.LBB1453:
+.LBB1454:
 .LBB1455:
-.LBB1456:
-.LBB1457:
 	.loc 2 1181 0
 	ldr	x0, [x0, 216]
 .LVL459:
-.LBE1457:
-.LBE1456:
 .LBE1455:
-	.loc 1 1979 0
+.LBE1454:
+.LBE1453:
+	.loc 1 2066 0
 	str	x0, [x19, 16]
-	.loc 1 1980 0
-	cbz	x0, .L564
-	.loc 1 1986 0
+	.loc 1 2067 0
+	cbz	x0, .L549
+	.loc 1 2073 0
 	add	x21, x19, 184
 .LVL460:
-	.loc 1 1988 0
+	.loc 1 2075 0
 	add	x22, x19, 24
-	.loc 1 1986 0
+	.loc 1 2073 0
 	str	x20, [x21, 88]
+.LBB1456:
+.LBB1457:
 .LBB1458:
 .LBB1459:
 .LBB1460:
-.LBB1461:
-.LBB1462:
 	.file 14 "./include/linux/of.h"
 	.loc 14 499 0
 	adrp	x1, .LC30
-.LBE1462:
-.LBE1461:
 .LBE1460:
 .LBE1459:
 .LBE1458:
-	.loc 1 1988 0
+.LBE1457:
+.LBE1456:
+	.loc 1 2075 0
 	str	x20, [x19, 24]
-.LBB1557:
-.LBB1553:
-.LBB1469:
-.LBB1466:
-.LBB1463:
-	.loc 14 499 0
-	mov	x4, 0
-.LBE1463:
-.LBE1466:
-.LBE1469:
-.LBE1553:
-.LBE1557:
-	.loc 1 1989 0
-	ldr	x2, [x19, 8]
-.LBB1558:
-.LBB1554:
-.LBB1470:
+.LBB1555:
+.LBB1551:
 .LBB1467:
 .LBB1464:
+.LBB1461:
 	.loc 14 499 0
-	add	x1, x1, :lo12:.LC30
+	mov	x4, 0
+.LBE1461:
 .LBE1464:
 .LBE1467:
-.LBE1470:
-.LBE1554:
-.LBE1558:
-	.loc 1 1990 0
-	stp	x2, x0, [x22, 8]
-.LBB1559:
-.LBB1555:
-.LBB1471:
+.LBE1551:
+.LBE1555:
+	.loc 1 2076 0
+	ldr	x2, [x19, 8]
+.LBB1556:
+.LBB1552:
 .LBB1468:
 .LBB1465:
+.LBB1462:
+	.loc 14 499 0
+	add	x1, x1, :lo12:.LC30
+.LBE1462:
+.LBE1465:
+.LBE1468:
+.LBE1552:
+.LBE1556:
+	.loc 1 2077 0
+	stp	x2, x0, [x22, 8]
+.LBB1557:
+.LBB1553:
+.LBB1469:
+.LBB1466:
+.LBB1463:
 	.loc 14 499 0
 	mov	x3, 1
 	ldr	x0, [x20, 752]
@@ -5207,13 +5188,13 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL461:
 	.loc 14 501 0
-	tbnz	w0, #31, .L485
-.LBE1465:
-.LBE1468:
-.LBE1471:
+	tbnz	w0, #31, .L470
+.LBE1463:
+.LBE1466:
+.LBE1469:
+.LBB1470:
+.LBB1471:
 .LBB1472:
-.LBB1473:
-.LBB1474:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC54
@@ -5224,13 +5205,13 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL462:
 	.loc 14 501 0
-	tbnz	w0, #31, .L485
-.LBE1474:
-.LBE1473:
+	tbnz	w0, #31, .L470
 .LBE1472:
+.LBE1471:
+.LBE1470:
+.LBB1473:
+.LBB1474:
 .LBB1475:
-.LBB1476:
-.LBB1477:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC55
@@ -5241,13 +5222,13 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL463:
 	.loc 14 501 0
-	tbnz	w0, #31, .L485
-.LBE1477:
-.LBE1476:
+	tbnz	w0, #31, .L470
 .LBE1475:
+.LBE1474:
+.LBE1473:
+.LBB1476:
+.LBB1477:
 .LBB1478:
-.LBB1479:
-.LBB1480:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC56
@@ -5258,13 +5239,13 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL464:
 	.loc 14 501 0
-	tbnz	w0, #31, .L485
-.LBE1480:
-.LBE1479:
+	tbnz	w0, #31, .L470
 .LBE1478:
+.LBE1477:
+.LBE1476:
+.LBB1479:
+.LBB1480:
 .LBB1481:
-.LBB1482:
-.LBB1483:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC57
@@ -5275,13 +5256,13 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL465:
 	.loc 14 501 0
-	tbnz	w0, #31, .L485
-.LBE1483:
-.LBE1482:
+	tbnz	w0, #31, .L470
 .LBE1481:
+.LBE1480:
+.LBE1479:
+.LBB1482:
+.LBB1483:
 .LBB1484:
-.LBB1485:
-.LBB1486:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC58
@@ -5292,13 +5273,13 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL466:
 	.loc 14 501 0
-	tbnz	w0, #31, .L485
-.LBE1486:
-.LBE1485:
+	tbnz	w0, #31, .L470
 .LBE1484:
+.LBE1483:
+.LBE1482:
+.LBB1485:
+.LBB1486:
 .LBB1487:
-.LBB1488:
-.LBB1489:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC59
@@ -5309,13 +5290,13 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL467:
 	.loc 14 501 0
-	tbnz	w0, #31, .L485
-.LBE1489:
-.LBE1488:
+	tbnz	w0, #31, .L470
 .LBE1487:
+.LBE1486:
+.LBE1485:
+.LBB1488:
+.LBB1489:
 .LBB1490:
-.LBB1491:
-.LBB1492:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC60
@@ -5326,13 +5307,13 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL468:
 	.loc 14 501 0
-	tbnz	w0, #31, .L485
-.LBE1492:
-.LBE1491:
+	tbnz	w0, #31, .L470
 .LBE1490:
+.LBE1489:
+.LBE1488:
+.LBB1491:
+.LBB1492:
 .LBB1493:
-.LBB1494:
-.LBB1495:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC61
@@ -5343,13 +5324,13 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL469:
 	.loc 14 501 0
-	tbnz	w0, #31, .L485
-.LBE1495:
-.LBE1494:
+	tbnz	w0, #31, .L470
 .LBE1493:
+.LBE1492:
+.LBE1491:
+.LBB1494:
+.LBB1495:
 .LBB1496:
-.LBB1497:
-.LBB1498:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC62
@@ -5360,13 +5341,13 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL470:
 	.loc 14 501 0
-	tbnz	w0, #31, .L485
-.LBE1498:
-.LBE1497:
+	tbnz	w0, #31, .L470
 .LBE1496:
+.LBE1495:
+.LBE1494:
+.LBB1497:
+.LBB1498:
 .LBB1499:
-.LBB1500:
-.LBB1501:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC63
@@ -5377,13 +5358,13 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL471:
 	.loc 14 501 0
-	tbnz	w0, #31, .L485
-.LBE1501:
-.LBE1500:
+	tbnz	w0, #31, .L470
 .LBE1499:
+.LBE1498:
+.LBE1497:
+.LBB1500:
+.LBB1501:
 .LBB1502:
-.LBB1503:
-.LBB1504:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC64
@@ -5394,13 +5375,13 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL472:
 	.loc 14 501 0
-	tbnz	w0, #31, .L485
-.LBE1504:
-.LBE1503:
+	tbnz	w0, #31, .L470
 .LBE1502:
+.LBE1501:
+.LBE1500:
+.LBB1503:
+.LBB1504:
 .LBB1505:
-.LBB1506:
-.LBB1507:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC65
@@ -5411,13 +5392,13 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL473:
 	.loc 14 501 0
-	tbnz	w0, #31, .L485
-.LBE1507:
-.LBE1506:
+	tbnz	w0, #31, .L470
 .LBE1505:
+.LBE1504:
+.LBE1503:
+.LBB1506:
+.LBB1507:
 .LBB1508:
-.LBB1509:
-.LBB1510:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC66
@@ -5428,13 +5409,13 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL474:
 	.loc 14 501 0
-	tbnz	w0, #31, .L485
-.LBE1510:
-.LBE1509:
+	tbnz	w0, #31, .L470
 .LBE1508:
+.LBE1507:
+.LBE1506:
+.LBB1509:
+.LBB1510:
 .LBB1511:
-.LBB1512:
-.LBB1513:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC67
@@ -5445,13 +5426,13 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL475:
 	.loc 14 501 0
-	tbnz	w0, #31, .L485
-.LBE1513:
-.LBE1512:
+	tbnz	w0, #31, .L470
 .LBE1511:
+.LBE1510:
+.LBE1509:
+.LBB1512:
+.LBB1513:
 .LBB1514:
-.LBB1515:
-.LBB1516:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC68
@@ -5462,13 +5443,13 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL476:
 	.loc 14 501 0
-	tbnz	w0, #31, .L565
-.LBE1516:
-.LBE1515:
+	tbnz	w0, #31, .L550
 .LBE1514:
+.LBE1513:
+.LBE1512:
+.LBB1515:
+.LBB1516:
 .LBB1517:
-.LBB1518:
-.LBB1519:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC31
@@ -5479,14 +5460,14 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL477:
 	.loc 14 501 0
-	tbnz	w0, #31, .L486
-.L512:
-.LBE1519:
-.LBE1518:
+	tbnz	w0, #31, .L471
+.L497:
 .LBE1517:
+.LBE1516:
+.LBE1515:
+.LBB1522:
+.LBB1523:
 .LBB1524:
-.LBB1525:
-.LBB1526:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC32
@@ -5497,14 +5478,14 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL478:
 	.loc 14 501 0
-	tbnz	w0, #31, .L487
-.L513:
-.LBE1526:
-.LBE1525:
+	tbnz	w0, #31, .L472
+.L498:
 .LBE1524:
+.LBE1523:
+.LBE1522:
+.LBB1529:
+.LBB1530:
 .LBB1531:
-.LBB1532:
-.LBB1533:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC33
@@ -5515,14 +5496,14 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL479:
 	.loc 14 501 0
-	tbnz	w0, #31, .L488
-.L514:
-.LBE1533:
-.LBE1532:
+	tbnz	w0, #31, .L473
+.L499:
 .LBE1531:
+.LBE1530:
+.LBE1529:
+.LBB1536:
+.LBB1537:
 .LBB1538:
-.LBB1539:
-.LBB1540:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC34
@@ -5533,88 +5514,88 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL480:
 	.loc 14 501 0
-	tbnz	w0, #31, .L489
-.L515:
-.LBE1540:
-.LBE1539:
+	tbnz	w0, #31, .L474
+.L500:
 .LBE1538:
-.LBE1555:
-.LBE1559:
-	.loc 1 1998 0
+.LBE1537:
+.LBE1536:
+.LBE1553:
+.LBE1557:
+	.loc 1 2085 0
 	ldr	w0, [x22, 88]
-.LBB1560:
-.LBB1561:
-	.loc 1 1735 0
+.LBB1558:
+.LBB1559:
+	.loc 1 1822 0
 	mov	w2, 0
-.LBE1561:
-.LBE1560:
-	.loc 1 1998 0
+.LBE1559:
+.LBE1558:
+	.loc 1 2085 0
 	str	w0, [x21, 52]
-	.loc 1 1999 0
+	.loc 1 2086 0
 	ldr	w1, [x22, 84]
 	str	w1, [x21, 56]
-	.loc 1 2000 0
+	.loc 1 2087 0
 	mul	w0, w0, w1
-.LBB1585:
-.LBB1580:
-	.loc 1 1735 0
+.LBB1583:
+.LBB1578:
+	.loc 1 1822 0
 	adrp	x1, .LC35
 	add	x1, x1, :lo12:.LC35
-.LBE1580:
-.LBE1585:
-	.loc 1 2000 0
+.LBE1578:
+.LBE1583:
+	.loc 1 2087 0
 	lsr	w3, w0, 1
-	.loc 1 2001 0
+	.loc 1 2088 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x21, 20]
-.LBB1586:
-.LBB1581:
-	.loc 1 1726 0
+.LBB1584:
+.LBB1579:
+	.loc 1 1813 0
 	ldr	x26, [x19]
 .LVL481:
-	.loc 1 1735 0
+	.loc 1 1822 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL482:
-	.loc 1 1736 0
-	cbz	x0, .L522
-	.loc 1 1739 0
+	.loc 1 1823 0
+	cbz	x0, .L507
+	.loc 1 1826 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL483:
 	mov	w24, w0
-	.loc 1 1741 0
-	cbnz	w0, .L566
-.LBB1562:
-.LBB1563:
+	.loc 1 1828 0
+	cbnz	w0, .L551
+.LBB1560:
+.LBB1561:
 	.file 15 "./include/linux/ioport.h"
 	.loc 15 204 0
 	ldp	x1, x2, [x29, 104]
-.LBE1563:
-.LBE1562:
-	.loc 1 1746 0
+.LBE1561:
+.LBE1560:
+	.loc 1 1833 0
 	str	x1, [x19, 184]
-	.loc 1 1749 0
+	.loc 1 1836 0
 	mov	x3, 1
 	mov	x0, x26
-.LBB1565:
-.LBB1564:
+.LBB1563:
+.LBB1562:
 	.loc 15 204 0
 	add	x2, x2, 1
 	sub	x2, x2, x1
-.LBE1564:
-.LBE1565:
-	.loc 1 1747 0
+.LBE1562:
+.LBE1563:
+	.loc 1 1834 0
 	str	w2, [x21, 16]
-	.loc 1 1749 0
+	.loc 1 1836 0
 	sxtw	x2, w2
 	bl	devm_memremap
 .LVL484:
 	str	x0, [x21, 8]
-	.loc 1 1751 0
-	cbz	x0, .L493
-	.loc 1 1759 0
+	.loc 1 1838 0
+	cbz	x0, .L478
+	.loc 1 1846 0
 	mov	x1, x0
 	ldr	w2, [x21, 16]
 	ldr	x0, [x19, 184]
@@ -5622,68 +5603,68 @@ ebc_probe:
 	mov	w3, 2097152
 	bl	ebc_buf_init
 .LVL485:
-	.loc 1 1760 0
-	cbnz	w0, .L493
-	.loc 1 1765 0
+	.loc 1 1847 0
+	cbnz	w0, .L478
+	.loc 1 1852 0
 	ldr	x0, [x21, 8]
-	.loc 1 1766 0
+	.loc 1 1853 0
 	mov	x5, 1048576
 	str	x5, [x22, 40]
-.LBB1566:
-.LBB1567:
+.LBB1564:
+.LBB1565:
 	.loc 2 711 0
 	mov	w2, 32960
-.LBE1567:
-.LBE1566:
-	.loc 1 1765 0
+.LBE1565:
+.LBE1564:
+	.loc 1 1852 0
 	add	x6, x0, 10485760
 	str	x6, [x22, 24]
 	add	x4, x0, 11534336
-	.loc 1 1771 0
+	.loc 1 1858 0
 	add	x1, x0, 12582912
-	.loc 1 1767 0
+	.loc 1 1854 0
 	ldr	x3, [x19, 184]
-.LBB1571:
-.LBB1568:
+.LBB1569:
+.LBB1566:
 	.loc 2 711 0
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
-.LBE1568:
-.LBE1571:
-	.loc 1 1767 0
+.LBE1566:
+.LBE1569:
+	.loc 1 1854 0
 	add	x7, x3, 10485760
 	str	x7, [x22, 32]
-	.loc 1 1768 0
+	.loc 1 1855 0
 	str	x6, [x21, 168]
-	.loc 1 1767 0
+	.loc 1 1854 0
 	add	x3, x3, 11534336
-	.loc 1 1766 0
+	.loc 1 1853 0
 	str	x5, [x22, 64]
-	.loc 1 1767 0
+	.loc 1 1854 0
 	stp	x4, x3, [x22, 48]
-	.loc 1 1771 0
+	.loc 1 1858 0
 	str	x1, [x21, 112]
-.LBB1572:
-.LBB1569:
+.LBB1570:
+.LBB1567:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
-.LBE1569:
-.LBE1572:
-	.loc 1 1768 0
+.LBE1567:
+.LBE1570:
+	.loc 1 1855 0
 	str	x4, [x21, 176]
-.LBB1573:
-.LBB1570:
+.LBB1571:
+.LBB1568:
 	.loc 2 711 0
 	bl	devm_kmalloc
 .LVL486:
-.LBE1570:
-.LBE1573:
-	.loc 1 1774 0
+.LBE1568:
+.LBE1571:
+	.loc 1 1861 0
 	str	x0, [x21, 128]
-	.loc 1 1775 0
-	cbz	x0, .L493
-.LBB1574:
-.LBB1575:
+	.loc 1 1862 0
+	cbz	x0, .L478
+.LBB1572:
+.LBB1573:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
 	mov	w2, 32960
@@ -5691,14 +5672,14 @@ ebc_probe:
 	mov	x0, x26
 	bl	devm_kmalloc
 .LVL487:
-.LBE1575:
-.LBE1574:
-	.loc 1 1777 0
+.LBE1573:
+.LBE1572:
+	.loc 1 1864 0
 	str	x0, [x21, 136]
-	.loc 1 1778 0
-	cbz	x0, .L493
-.LBB1576:
-.LBB1577:
+	.loc 1 1865 0
+	cbz	x0, .L478
+.LBB1574:
+.LBB1575:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
 	mov	w2, 32960
@@ -5706,16 +5687,16 @@ ebc_probe:
 	mov	x0, x26
 	bl	devm_kmalloc
 .LVL488:
-.LBE1577:
-.LBE1576:
-	.loc 1 1780 0
+.LBE1575:
+.LBE1574:
+	.loc 1 1867 0
 	str	x0, [x21, 144]
-	.loc 1 1781 0
-	cbz	x0, .L493
-	.loc 1 1788 0
+	.loc 1 1868 0
+	cbz	x0, .L478
+	.loc 1 1875 0
 	ldp	w1, w0, [x22, 84]
-.LBB1578:
-.LBB1579:
+.LBB1576:
+.LBB1577:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
@@ -5723,80 +5704,80 @@ ebc_probe:
 	mov	x0, x26
 	bl	devm_kmalloc
 .LVL489:
-.LBE1579:
-.LBE1578:
-	.loc 1 1788 0
+.LBE1577:
+.LBE1576:
+	.loc 1 1875 0
 	str	x0, [x21, 152]
-	.loc 1 1789 0
-	cbz	x0, .L493
-	.loc 1 1791 0
+	.loc 1 1876 0
+	cbz	x0, .L478
+	.loc 1 1878 0
 	ldp	w2, w1, [x22, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
 .LVL490:
-	.loc 1 1792 0
+	.loc 1 1879 0
 	ldrsw	x2, [x21, 20]
 	mov	w1, 255
 	ldr	x0, [x21, 144]
 	bl	memset
 .LVL491:
-.LBE1581:
-.LBE1586:
-.LBB1587:
-.LBB1588:
-	.loc 1 1686 0
+.LBE1579:
+.LBE1584:
+.LBB1585:
+.LBB1586:
+	.loc 1 1773 0
 	ldr	x26, [x19, 272]
 .LVL492:
-	.loc 1 1692 0
+	.loc 1 1779 0
 	adrp	x1, .LC37
 	mov	w2, 0
 	add	x1, x1, :lo12:.LC37
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL493:
-	.loc 1 1693 0
-	cbz	x0, .L523
-	.loc 1 1696 0
+	.loc 1 1780 0
+	cbz	x0, .L508
+	.loc 1 1783 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL494:
 	mov	w24, w0
-	.loc 1 1698 0
-	cbz	w0, .L567
-.L494:
-.LBE1588:
-.LBE1587:
-	.loc 1 2013 0
+	.loc 1 1785 0
+	cbz	w0, .L552
+.L479:
+.LBE1586:
+.LBE1585:
+	.loc 1 2100 0
 	adrp	x1, .LC70
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC70
 	bl	_dev_err
 .LVL495:
-	.loc 1 2014 0
-	b	.L476
+	.loc 1 2101 0
+	b	.L461
 .LVL496:
 	.p2align 3
-.L485:
-	.loc 1 1996 0
+.L470:
+	.loc 1 2083 0
 	mov	w24, -22
-	.loc 1 1995 0
+	.loc 1 2082 0
 	adrp	x1, .LC74
 	mov	w2, w24
 	add	x1, x1, :lo12:.LC74
 	mov	x0, x20
 	bl	_dev_err
 .LVL497:
-.L476:
-	.loc 1 2038 0
+.L461:
+	.loc 1 2125 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w24
 .LVL498:
 	ldr	x2, [x29, 200]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L568
+	cbnz	x1, .L553
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 .LVL499:
@@ -5823,51 +5804,51 @@ ebc_probe:
 	ret
 .LVL502:
 	.p2align 3
-.L566:
+.L551:
 	.cfi_restore_state
-.LBB1595:
-.LBB1582:
-	.loc 1 1742 0
+.LBB1593:
+.LBB1580:
+	.loc 1 1829 0
 	adrp	x1, .LC36
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC36
 	bl	_dev_err
 .LVL503:
-.L490:
-.LBE1582:
-.LBE1595:
-	.loc 1 2006 0
+.L475:
+.LBE1580:
+.LBE1593:
+	.loc 1 2093 0
 	adrp	x1, .LC69
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC69
 	bl	_dev_err
 .LVL504:
-	.loc 1 2007 0
-	b	.L476
+	.loc 1 2094 0
+	b	.L461
 .LVL505:
 	.p2align 3
-.L489:
-.LBB1596:
-.LBB1556:
-	.loc 1 1335 0
+.L474:
+.LBB1594:
+.LBB1554:
+	.loc 1 1422 0
 	str	wzr, [x22, 96]
-	b	.L515
+	b	.L500
 	.p2align 3
-.L488:
-.LBB1545:
+.L473:
 .LBB1543:
 .LBB1541:
+.LBB1539:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC34
+.LBE1539:
 .LBE1541:
 .LBE1543:
-.LBE1545:
-	.loc 1 1332 0
+	.loc 1 1419 0
 	str	wzr, [x22, 92]
-.LBB1546:
 .LBB1544:
 .LBB1542:
+.LBB1540:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
@@ -5876,27 +5857,27 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL506:
 	.loc 14 501 0
-	tbz	w0, #31, .L515
-	b	.L489
+	tbz	w0, #31, .L500
+	b	.L474
 	.p2align 3
-.L487:
+.L472:
+.LBE1540:
 .LBE1542:
 .LBE1544:
-.LBE1546:
-.LBB1547:
-.LBB1536:
+.LBB1545:
 .LBB1534:
+.LBB1532:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC33
+.LBE1532:
 .LBE1534:
-.LBE1536:
-.LBE1547:
-	.loc 1 1329 0
+.LBE1545:
+	.loc 1 1416 0
 	str	wzr, [x22, 156]
-.LBB1548:
-.LBB1537:
+.LBB1546:
 .LBB1535:
+.LBB1533:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
@@ -5905,27 +5886,27 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL507:
 	.loc 14 501 0
-	tbz	w0, #31, .L514
-	b	.L488
+	tbz	w0, #31, .L499
+	b	.L473
 	.p2align 3
-.L486:
+.L471:
+.LBE1533:
 .LBE1535:
-.LBE1537:
-.LBE1548:
-.LBB1549:
-.LBB1529:
+.LBE1546:
+.LBB1547:
 .LBB1527:
+.LBB1525:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC32
+.LBE1525:
 .LBE1527:
-.LBE1529:
-.LBE1549:
-	.loc 1 1326 0
+.LBE1547:
+	.loc 1 1413 0
 	str	wzr, [x22, 152]
-.LBB1550:
-.LBB1530:
+.LBB1548:
 .LBB1528:
+.LBB1526:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
@@ -5934,27 +5915,27 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL508:
 	.loc 14 501 0
-	tbz	w0, #31, .L513
-	b	.L487
+	tbz	w0, #31, .L498
+	b	.L472
 	.p2align 3
-.L565:
+.L550:
+.LBE1526:
 .LBE1528:
-.LBE1530:
-.LBE1550:
-.LBB1551:
-.LBB1522:
+.LBE1548:
+.LBB1549:
 .LBB1520:
+.LBB1518:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC31
+.LBE1518:
 .LBE1520:
-.LBE1522:
-.LBE1551:
-	.loc 1 1323 0
+.LBE1549:
+	.loc 1 1410 0
 	str	wzr, [x22, 148]
-.LBB1552:
-.LBB1523:
+.LBB1550:
 .LBB1521:
+.LBB1519:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
@@ -5963,103 +5944,103 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL509:
 	.loc 14 501 0
-	tbz	w0, #31, .L512
-	b	.L486
+	tbz	w0, #31, .L497
+	b	.L471
 .LVL510:
 	.p2align 3
-.L567:
+.L552:
+.LBE1519:
 .LBE1521:
-.LBE1523:
-.LBE1552:
-.LBE1556:
-.LBE1596:
-.LBB1597:
-.LBB1591:
-	.loc 1 1704 0
+.LBE1550:
+.LBE1554:
+.LBE1594:
+.LBB1595:
+.LBB1589:
+	.loc 1 1791 0
 	mov	x0, x26
 	mov	x3, 1
-.LBB1589:
-.LBB1590:
+.LBB1587:
+.LBB1588:
 	.loc 15 204 0
 	ldp	x1, x26, [x29, 104]
 .LVL511:
 	add	x26, x26, 1
 	sub	x26, x26, x1
-.LBE1590:
-.LBE1589:
-	.loc 1 1704 0
+.LBE1588:
+.LBE1587:
+	.loc 1 1791 0
 	sxtw	x2, w26
 	bl	devm_memremap
 .LVL512:
 	str	x0, [x19, 376]
-	.loc 1 1706 0
-	cbz	x0, .L569
-	.loc 1 1711 0
+	.loc 1 1793 0
+	cbz	x0, .L554
+	.loc 1 1798 0
 	bl	epd_lut_from_mem_init
 .LVL513:
-	.loc 1 1712 0
-	tbnz	w0, #31, .L570
-.L496:
-.LBE1591:
-.LBE1597:
-.LBB1598:
-.LBB1599:
-	.loc 1 1801 0
+	.loc 1 1799 0
+	tbnz	w0, #31, .L555
+.L481:
+.LBE1589:
+.LBE1595:
+.LBB1596:
+.LBB1597:
+	.loc 1 1888 0
 	add	x0, x19, 736
 	mov	x1, 68719476704
 	str	x1, [x21, 544]
-	.loc 1 1803 0
+	.loc 1 1890 0
 	add	x25, x25, :lo12:.LANCHOR0
+.LBB1598:
+.LBB1599:
 .LBB1600:
 .LBB1601:
 .LBB1602:
-.LBB1603:
-.LBB1604:
 	.loc 12 234 0
 	str	x0, [x19, 736]
-.LBE1604:
-.LBE1603:
 .LBE1602:
 .LBE1601:
 .LBE1600:
-	.loc 1 1799 0
+.LBE1599:
+.LBE1598:
+	.loc 1 1886 0
 	mov	w26, 99
-.LBB1606:
-.LBB1605:
+.LBB1604:
+.LBB1603:
 	.file 16 "./include/linux/list.h"
 	.loc 16 29 0
 	str	x0, [x0, 8]
-.LBE1605:
-.LBE1606:
-	.loc 1 1801 0
+.LBE1603:
+.LBE1604:
+	.loc 1 1888 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x21, 568]
-	.loc 1 1803 0
+	.loc 1 1890 0
 	adrp	x3, .LC71
 	mov	w2, -1
 	add	x3, x3, :lo12:.LC71
 	mov	x1, x21
 	adrp	x0, ebc_auto_tast_function
-	.loc 1 1799 0
+	.loc 1 1886 0
 	str	w26, [x29, 104]
-	.loc 1 1803 0
+	.loc 1 1890 0
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
 .LVL514:
 	str	x0, [x25, 8]
-	.loc 1 1804 0
+	.loc 1 1891 0
 	cmn	x0, #4096
-	bhi	.L571
-	.loc 1 1808 0
+	bhi	.L556
+	.loc 1 1895 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
 .LVL515:
-	.loc 1 1809 0
+	.loc 1 1896 0
 	ldr	x2, [x25, 8]
-.LBB1607:
-.LBB1608:
+.LBB1605:
+.LBB1606:
 	.file 17 "./arch/arm64/include/asm/atomic_lse.h"
 	.loc 17 47 0
 	mov	w0, 1
@@ -6095,10 +6076,10 @@ ebc_probe:
 // 0 "" 2
 .LVL518:
 #NO_APP
-.LBE1608:
-.LBE1607:
-.LBB1609:
-	.loc 1 1812 0
+.LBE1606:
+.LBE1605:
+.LBB1607:
+	.loc 1 1899 0
 	adrp	x3, .LC42
 	adrp	x0, ebc_thread
 .LVL519:
@@ -6106,31 +6087,31 @@ ebc_probe:
 	mov	w2, -1
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x21
-.LBE1609:
-	.loc 1 1811 0
+.LBE1607:
+	.loc 1 1898 0
 	str	w26, [x29, 104]
-.LBB1610:
-	.loc 1 1812 0
+.LBB1608:
+	.loc 1 1899 0
 	bl	kthread_create_on_node
 .LVL520:
 	mov	x25, x0
 .LVL521:
 	cmn	x0, #4096
-	bhi	.L498
+	bhi	.L483
 	bl	wake_up_process
 .LVL522:
-.LBE1610:
+.LBE1608:
 	str	x25, [x21, 120]
-	.loc 1 1817 0
+	.loc 1 1904 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x25
 	bl	sched_setscheduler_nocheck
 .LVL523:
-	.loc 1 1818 0
+	.loc 1 1905 0
 	ldr	x2, [x21, 120]
-.LBB1611:
-.LBB1612:
+.LBB1609:
+.LBB1610:
 	.loc 17 47 0
 	mov	w0, 1
 .LVL524:
@@ -6165,60 +6146,60 @@ ebc_probe:
 // 0 "" 2
 .LVL526:
 #NO_APP
-.LBE1612:
-.LBE1611:
-.LBE1599:
-.LBE1598:
-.LBB1615:
-.LBB1616:
-	.loc 1 1827 0
+.LBE1610:
+.LBE1609:
+.LBE1597:
+.LBE1596:
+.LBB1613:
+.LBB1614:
+	.loc 1 1914 0
 	mov	w0, -1
 .LVL527:
 	str	w0, [x21, 48]
-.LBB1617:
-.LBB1618:
+.LBB1615:
+.LBB1616:
 	.loc 4 39 0
 	add	x0, x19, 400
 .LVL528:
-.LBE1618:
-.LBE1617:
-	.loc 1 1831 0
+.LBE1616:
+.LBE1615:
+	.loc 1 1918 0
 	str	wzr, [x21, 28]
-	.loc 1 1830 0
+	.loc 1 1917 0
 	str	wzr, [x21, 80]
-.LBB1623:
-.LBB1619:
+.LBB1621:
+.LBB1617:
 	.loc 4 43 0
 	adrp	x1, .LC43
-.LBE1619:
-.LBE1623:
-	.loc 1 1826 0
+.LBE1617:
+.LBE1621:
+	.loc 1 1913 0
 	str	wzr, [x21, 184]
-.LBB1624:
-.LBB1620:
+.LBB1622:
+.LBB1618:
 	.loc 4 43 0
 	add	x1, x1, :lo12:.LC43
-.LBE1620:
-.LBE1624:
-	.loc 1 1828 0
+.LBE1618:
+.LBE1622:
+	.loc 1 1915 0
 	str	wzr, [x21, 592]
-	.loc 1 1838 0
+	.loc 1 1925 0
 	add	x25, x19, 616
 .LVL529:
-	.loc 1 1829 0
+	.loc 1 1916 0
 	str	wzr, [x21, 596]
-	.loc 1 1839 0
+	.loc 1 1926 0
 	adrp	x26, jiffies
-.LBB1625:
-.LBB1621:
+.LBB1623:
+.LBB1619:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0]
-.LBE1621:
-.LBE1625:
-	.loc 1 1839 0
+.LBE1619:
+.LBE1623:
+	.loc 1 1926 0
 	mov	x27, 268435455
-.LBB1626:
-.LBB1622:
+.LBB1624:
+.LBB1620:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0, 16]
 	stp	xzr, xzr, [x0, 32]
@@ -6237,11 +6218,11 @@ ebc_probe:
 	.loc 4 45 0
 	bl	wakeup_source_add
 .LVL530:
-.LBE1622:
-.LBE1626:
-	.loc 1 1835 0
+.LBE1620:
+.LBE1624:
+	.loc 1 1922 0
 	str	wzr, [x21, 424]
-	.loc 1 1838 0
+	.loc 1 1925 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -6250,16 +6231,16 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
 .LVL531:
-	.loc 1 1839 0
+	.loc 1 1926 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
-	.loc 1 1842 0
+	.loc 1 1929 0
 	add	x25, x19, 672
-	.loc 1 1839 0
+	.loc 1 1926 0
 	add	x1, x1, x27
 	bl	mod_timer
 .LVL532:
-	.loc 1 1842 0
+	.loc 1 1929 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -6268,109 +6249,109 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
 .LVL533:
-	.loc 1 1843 0
+	.loc 1 1930 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
 	add	x1, x1, x27
 	bl	mod_timer
 .LVL534:
-.LBE1616:
-.LBE1615:
-.LBB1627:
-.LBB1628:
-	.loc 1 1853 0
+.LBE1614:
+.LBE1613:
+.LBB1625:
+.LBB1626:
+	.loc 1 1940 0
 	adrp	x0, saved_command_line
 	adrp	x1, .LC44
-	.loc 1 1850 0
+	.loc 1 1937 0
 	stp	wzr, wzr, [x29, 100]
 .LVL535:
-	.loc 1 1853 0
+	.loc 1 1940 0
 	add	x1, x1, :lo12:.LC44
 	ldr	x25, [x0, #:lo12:saved_command_line]
 	mov	x0, x25
 	bl	strstr
 .LVL536:
-	.loc 1 1854 0
+	.loc 1 1941 0
 	adrp	x1, .LC45
-	.loc 1 1853 0
+	.loc 1 1940 0
 	mov	x26, x0
 .LVL537:
-	.loc 1 1854 0
+	.loc 1 1941 0
 	add	x1, x1, :lo12:.LC45
 	mov	x0, x25
 	bl	strstr
 .LVL538:
 	mov	x28, x0
 .LVL539:
-	.loc 1 1859 0
-	cbz	x26, .L499
-	.loc 1 1860 0
+	.loc 1 1946 0
+	cbz	x26, .L484
+	.loc 1 1947 0
 	add	x2, x29, 100
 	adrp	x1, .LC46
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC46
 	bl	sscanf
 .LVL540:
-	.loc 1 1861 0
+	.loc 1 1948 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
-	bls	.L572
-.L499:
-	.loc 1 1873 0
+	bls	.L557
+.L484:
+	.loc 1 1960 0
 	mov	w25, 0
 .LVL541:
 	mov	x27, 0
 .LVL542:
-	.loc 1 1857 0
+	.loc 1 1944 0
 	mov	x26, 0
 .LVL543:
-	.loc 1 1873 0
-	cbz	x28, .L519
+	.loc 1 1960 0
+	cbz	x28, .L504
 .LVL544:
-.L518:
-	.loc 1 1874 0
+.L503:
+	.loc 1 1961 0
 	add	x2, x29, 104
 	mov	x0, x28
 	adrp	x1, .LC49
 	add	x1, x1, :lo12:.LC49
 	bl	sscanf
 .LVL545:
-	.loc 1 1852 0
+	.loc 1 1939 0
 	mov	w28, 0
 .LVL546:
-	.loc 1 1875 0
+	.loc 1 1962 0
 	ldr	w2, [x29, 104]
-	.loc 1 1857 0
+	.loc 1 1944 0
 	mov	x26, 0
 .LVL547:
-	.loc 1 1875 0
+	.loc 1 1962 0
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
-	bls	.L573
-.L503:
-	.loc 1 1887 0
-	cbnz	w25, .L502
+	bls	.L558
+.L488:
+	.loc 1 1974 0
+	cbnz	w25, .L487
 .LVL548:
-.L519:
-	.loc 1 1888 0
+.L504:
+	.loc 1 1975 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC52
 	add	x1, x1, :lo12:.LC52
 	bl	_dev_info
 .LVL549:
-	.loc 1 1889 0
+	.loc 1 1976 0
 	ldr	x0, [x19, 16]
 	bl	ebc_pmic_verity_vcom
 .LVL550:
-.LBB1629:
-.LBB1630:
-	.loc 1 1243 0
+.LBB1627:
+.LBB1628:
+	.loc 1 1330 0
 	bl	ebc_empty_buf_get
 .LVL551:
 	mov	x25, x0
 .LVL552:
-	.loc 1 1244 0
+	.loc 1 1331 0
 	ldp	w2, w0, [x19, 108]
 	mov	w1, 255
 	mul	w2, w2, w0
@@ -6378,97 +6359,97 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memset
 .LVL553:
-	.loc 1 1247 0
+	.loc 1 1334 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1245 0
+	.loc 1 1332 0
 	mov	w0, 14
 	str	w0, [x25, 40]
-	.loc 1 1250 0
+	.loc 1 1337 0
 	mov	x0, x25
-	.loc 1 1248 0
+	.loc 1 1335 0
 	ldr	w1, [x19, 108]
 	str	w1, [x25, 56]
-	.loc 1 1249 0
+	.loc 1 1336 0
 	ldr	w1, [x19, 112]
 	str	w1, [x25, 60]
-	.loc 1 1250 0
+	.loc 1 1337 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL554:
-.L505:
-.LBE1630:
-.LBE1629:
-	.loc 1 1906 0
-	cbnz	w28, .L574
-.L507:
-	.loc 1 1919 0
+.L490:
+.LBE1628:
+.LBE1627:
+	.loc 1 1993 0
+	cbnz	w28, .L559
+.L492:
+	.loc 1 2006 0
 	ldr	w0, [x21, 80]
 	adrp	x22, .LANCHOR1
-	cbz	w0, .L575
-.L509:
-	.loc 1 1924 0
-	cbz	x27, .L510
-	.loc 1 1925 0
+	cbz	w0, .L560
+.L494:
+	.loc 1 2011 0
+	cbz	x27, .L495
+	.loc 1 2012 0
 	mov	x0, x27
 	bl	kfree
 .LVL555:
-.L510:
-	.loc 1 1926 0
-	cbz	x26, .L501
-	.loc 1 1927 0
+.L495:
+	.loc 1 2013 0
+	cbz	x26, .L486
+	.loc 1 2014 0
 	mov	x0, x26
 	bl	kfree
 .LVL556:
-.L501:
-.LBE1628:
-.LBE1627:
+.L486:
+.LBE1626:
+.LBE1625:
+.LBB1638:
+.LBB1639:
 .LBB1640:
-.LBB1641:
-.LBB1642:
 	.loc 2 1186 0
 	str	x19, [x20, 184]
-.LBE1642:
-.LBE1641:
 .LBE1640:
-.LBB1643:
-.LBB1644:
-	.loc 1 1671 0
+.LBE1639:
+.LBE1638:
+.LBB1641:
+.LBB1642:
+	.loc 1 1758 0
 	add	x22, x22, :lo12:.LANCHOR1
 	add	x0, x22, 224
 	bl	misc_register
 .LVL557:
-	.loc 1 1673 0
+	.loc 1 1760 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 400
 	bl	device_create_file
 .LVL558:
-	.loc 1 1674 0
+	.loc 1 1761 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 432
 	bl	device_create_file
 .LVL559:
-	.loc 1 1675 0
+	.loc 1 1762 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 464
 	bl	device_create_file
 .LVL560:
-	.loc 1 1676 0
+	.loc 1 1763 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 496
 	bl	device_create_file
 .LVL561:
-	.loc 1 1677 0
+	.loc 1 1764 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 528
 	bl	device_create_file
 .LVL562:
-	.loc 1 1678 0
+	.loc 1 1765 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 560
 	bl	device_create_file
 .LVL563:
-.LBE1644:
-.LBE1643:
-	.loc 1 2035 0
+.LBE1642:
+.LBE1641:
+	.loc 1 2122 0
 	ldr	x0, [x21, 88]
 	adrp	x2, .LC15
 	adrp	x1, .LC53
@@ -6476,25 +6457,25 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC53
 	bl	_dev_info
 .LVL564:
-	.loc 1 2037 0
-	b	.L476
+	.loc 1 2124 0
+	b	.L461
 .LVL565:
 	.p2align 3
-.L572:
-.LBB1645:
-.LBB1637:
-	.loc 1 1863 0
+.L557:
+.LBB1643:
+.LBB1635:
+	.loc 1 1950 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC47
 	add	x1, x1, :lo12:.LC47
 	bl	_dev_info
 .LVL566:
-	.loc 1 1864 0
+	.loc 1 1951 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
+.LBB1629:
+.LBB1630:
 .LBB1631:
-.LBB1632:
-.LBB1633:
 	.file 18 "./include/linux/slab.h"
 	.loc 18 553 0
 	mov	w1, 32960
@@ -6504,12 +6485,12 @@ ebc_probe:
 .LVL567:
 	mov	x27, x0
 .LVL568:
-.LBE1633:
-.LBE1632:
 .LBE1631:
-	.loc 1 1865 0
-	cbz	x0, .L576
-	.loc 1 1869 0
+.LBE1630:
+.LBE1629:
+	.loc 1 1952 0
+	cbz	x0, .L561
+	.loc 1 1956 0
 	ldp	w2, w1, [x22, 84]
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
@@ -6522,23 +6503,23 @@ ebc_probe:
 	add	x1, x3, x1
 	bl	memcpy
 .LVL571:
-	.loc 1 1873 0
-	cbnz	x28, .L577
-	.loc 1 1852 0
+	.loc 1 1960 0
+	cbnz	x28, .L562
+	.loc 1 1939 0
 	mov	w28, 0
 .LVL572:
-	.loc 1 1857 0
+	.loc 1 1944 0
 	mov	x26, 0
 .LVL573:
-.L502:
-	.loc 1 1894 0
+.L487:
+	.loc 1 1981 0
 	bl	ebc_empty_buf_get
 .LVL574:
 	mov	x25, x0
 .LVL575:
-	.loc 1 1895 0
-	cbz	x0, .L505
-	.loc 1 1896 0
+	.loc 1 1982 0
+	cbz	x0, .L490
+	.loc 1 1983 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
@@ -6546,51 +6527,51 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL576:
-	.loc 1 1899 0
+	.loc 1 1986 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1897 0
+	.loc 1 1984 0
 	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 1902 0
+	.loc 1 1989 0
 	mov	x0, x25
-	.loc 1 1900 0
+	.loc 1 1987 0
 	ldr	w1, [x22, 84]
 	str	w1, [x25, 56]
-	.loc 1 1901 0
+	.loc 1 1988 0
 	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 1902 0
+	.loc 1 1989 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL577:
-	b	.L505
+	b	.L490
 .LVL578:
 	.p2align 3
-.L575:
-	.loc 1 1920 0
+.L560:
+	.loc 1 2007 0
 	mov	w2, 1
 	str	w2, [x21, 80]
-	.loc 1 1921 0
+	.loc 1 2008 0
 	add	x0, x22, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
 .LVL579:
-	b	.L509
+	b	.L494
 .LVL580:
 	.p2align 3
-.L573:
-	.loc 1 1877 0
+.L558:
+	.loc 1 1964 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC50
 	add	x1, x1, :lo12:.LC50
 	bl	_dev_info
 .LVL581:
-	.loc 1 1878 0
+	.loc 1 1965 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
+.LBB1632:
+.LBB1633:
 .LBB1634:
-.LBB1635:
-.LBB1636:
 	.loc 18 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
@@ -6598,16 +6579,16 @@ ebc_probe:
 	bl	__kmalloc
 .LVL582:
 	mov	x26, x0
-.LBE1636:
-.LBE1635:
 .LBE1634:
-	.loc 1 1879 0
-	cbz	x0, .L578
-	.loc 1 1883 0
+.LBE1633:
+.LBE1632:
+	.loc 1 1966 0
+	cbz	x0, .L563
+	.loc 1 1970 0
 	ldp	w2, w1, [x22, 84]
-	.loc 1 1876 0
+	.loc 1 1963 0
 	mov	w28, 1
-	.loc 1 1883 0
+	.loc 1 1970 0
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
@@ -6619,32 +6600,32 @@ ebc_probe:
 	add	x1, x3, x1
 	bl	memcpy
 .LVL585:
-	b	.L503
+	b	.L488
 .LVL586:
 	.p2align 3
-.L493:
-.LBE1637:
-.LBE1645:
-.LBB1646:
-.LBB1583:
-	.loc 1 1752 0
+.L478:
+.LBE1635:
+.LBE1643:
+.LBB1644:
+.LBB1581:
+	.loc 1 1839 0
 	mov	w24, -12
-	b	.L490
+	b	.L475
 .LVL587:
 	.p2align 3
-.L574:
-.LBE1583:
-.LBE1646:
-.LBB1647:
-.LBB1638:
-	.loc 1 1907 0
+.L559:
+.LBE1581:
+.LBE1644:
+.LBB1645:
+.LBB1636:
+	.loc 1 1994 0
 	bl	ebc_empty_buf_get
 .LVL588:
 	mov	x25, x0
 .LVL589:
-	.loc 1 1908 0
-	cbz	x0, .L507
-	.loc 1 1909 0
+	.loc 1 1995 0
+	cbz	x0, .L492
+	.loc 1 1996 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
@@ -6652,210 +6633,210 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL590:
-	.loc 1 1912 0
+	.loc 1 1999 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1910 0
+	.loc 1 1997 0
 	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 1913 0
+	.loc 1 2000 0
 	ldr	w0, [x22, 84]
 	str	w0, [x25, 56]
-	.loc 1 1915 0
+	.loc 1 2002 0
 	mov	x0, x25
-	.loc 1 1914 0
+	.loc 1 2001 0
 	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 1915 0
+	.loc 1 2002 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL591:
-	b	.L507
+	b	.L492
 .LVL592:
 	.p2align 3
-.L570:
-.LBE1638:
-.LBE1647:
-.LBB1648:
-.LBB1592:
-	.loc 1 1713 0
+.L555:
+.LBE1636:
+.LBE1645:
+.LBB1646:
+.LBB1590:
+	.loc 1 1800 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC39
 	add	x1, x1, :lo12:.LC39
 	bl	_dev_err
 .LVL593:
-	.loc 1 1714 0
+	.loc 1 1801 0
 	ldr	x0, [x19, 272]
 	mov	w2, w26
 	ldr	x1, [x19, 376]
 	bl	epd_lut_from_file_init
 .LVL594:
-	.loc 1 1715 0
-	tbz	w0, #31, .L496
-	.loc 1 1716 0
+	.loc 1 1802 0
+	tbz	w0, #31, .L481
+	.loc 1 1803 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC40
-	.loc 1 1717 0
+	.loc 1 1804 0
 	mov	w24, -1
-	.loc 1 1716 0
+	.loc 1 1803 0
 	add	x1, x1, :lo12:.LC40
 	bl	_dev_err
 .LVL595:
-	b	.L494
+	b	.L479
 .LVL596:
 	.p2align 3
-.L480:
-.LBE1592:
-.LBE1648:
-	.loc 1 1960 0
+.L465:
+.LBE1590:
+.LBE1646:
+	.loc 1 2047 0
 	mov	w24, -517
-	b	.L476
+	b	.L461
 .LVL597:
 	.p2align 3
-.L571:
-.LBB1649:
-.LBB1613:
-	.loc 1 1805 0
+.L556:
+.LBB1647:
+.LBB1611:
+	.loc 1 1892 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC41
 	add	x1, x1, :lo12:.LC41
 	bl	_dev_err
 .LVL598:
-.L497:
-.LBE1613:
-.LBE1649:
-	.loc 1 2020 0
+.L482:
+.LBE1611:
+.LBE1647:
+	.loc 1 2107 0
 	adrp	x1, .LC73
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC73
-	.loc 1 2021 0
+	.loc 1 2108 0
 	mov	w24, -1
-	.loc 1 2020 0
+	.loc 1 2107 0
 	bl	_dev_err
 .LVL599:
-	.loc 1 2021 0
-	b	.L476
+	.loc 1 2108 0
+	b	.L461
 .LVL600:
 	.p2align 3
-.L498:
-.LBB1650:
-.LBB1614:
-	.loc 1 1814 0
+.L483:
+.LBB1648:
+.LBB1612:
+	.loc 1 1901 0
 	ldr	x0, [x21, 88]
 .LVL601:
 	adrp	x1, .LC72
-	.loc 1 1812 0
+	.loc 1 1899 0
 	str	x25, [x21, 120]
-	.loc 1 1814 0
+	.loc 1 1901 0
 	add	x1, x1, :lo12:.LC72
 	bl	_dev_err
 .LVL602:
-	b	.L497
+	b	.L482
 .LVL603:
 	.p2align 3
-.L521:
-.LBE1614:
-.LBE1650:
-	.loc 1 1946 0
+.L506:
+.LBE1612:
+.LBE1648:
+	.loc 1 2033 0
 	mov	w24, -12
-	b	.L476
+	b	.L461
 .LVL604:
 	.p2align 3
-.L522:
-.LBB1651:
-.LBB1584:
-	.loc 1 1737 0
+.L507:
+.LBB1649:
+.LBB1582:
+	.loc 1 1824 0
 	mov	w24, -19
-	b	.L490
+	b	.L475
 .LVL605:
-.L561:
-.LBE1584:
-.LBE1651:
-	.loc 1 1953 0
+.L546:
+.LBE1582:
+.LBE1649:
+	.loc 1 2040 0
 	adrp	x1, .LC25
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC25
-	.loc 1 1954 0
+	.loc 1 2041 0
 	mov	w24, -19
-	.loc 1 1953 0
+	.loc 1 2040 0
 	bl	_dev_err
 .LVL606:
-	.loc 1 1954 0
-	b	.L476
-.L564:
-	.loc 1 1981 0
+	.loc 1 2041 0
+	b	.L461
+.L549:
+	.loc 1 2068 0
 	adrp	x1, .LC29
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC29
-	.loc 1 1982 0
+	.loc 1 2069 0
 	mov	w24, -517
-	.loc 1 1981 0
+	.loc 1 2068 0
 	bl	_dev_err
 .LVL607:
-	.loc 1 1982 0
-	b	.L476
-.L562:
-	.loc 1 1969 0
+	.loc 1 2069 0
+	b	.L461
+.L547:
+	.loc 1 2056 0
 	adrp	x1, .LC27
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC27
-	.loc 1 1970 0
+	.loc 1 2057 0
 	mov	w24, -19
-	.loc 1 1969 0
+	.loc 1 2056 0
 	bl	_dev_err
 .LVL608:
-	.loc 1 1970 0
-	b	.L476
+	.loc 1 2057 0
+	b	.L461
 .LVL609:
-.L523:
-.LBB1652:
-.LBB1593:
-	.loc 1 1694 0
+.L508:
+.LBB1650:
+.LBB1591:
+	.loc 1 1781 0
 	mov	w24, -19
-	b	.L494
+	b	.L479
 .LVL610:
-.L563:
-.LBE1593:
-.LBE1652:
-	.loc 1 1976 0
+.L548:
+.LBE1591:
+.LBE1650:
+	.loc 1 2063 0
 	adrp	x1, .LC28
 	mov	x0, x20
 .LVL611:
 	add	x1, x1, :lo12:.LC28
-	.loc 1 1977 0
+	.loc 1 2064 0
 	mov	w24, -517
-	.loc 1 1976 0
+	.loc 1 2063 0
 	bl	_dev_err
 .LVL612:
-	.loc 1 1977 0
-	b	.L476
+	.loc 1 2064 0
+	b	.L461
 .LVL613:
-.L569:
-.LBB1653:
-.LBB1594:
-	.loc 1 1707 0
+.L554:
+.LBB1651:
+.LBB1592:
+	.loc 1 1794 0
 	ldr	x0, [x19, 272]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
 	adrp	x1, .LC38
-	mov	w3, 1707
+	mov	w3, 1794
 	add	x2, x2, 32
 	add	x1, x1, :lo12:.LC38
-	.loc 1 1708 0
+	.loc 1 1795 0
 	mov	w24, -12
-	.loc 1 1707 0
+	.loc 1 1794 0
 	bl	_dev_err
 .LVL614:
-	b	.L494
+	b	.L479
 .LVL615:
-.L568:
-.LBE1594:
-.LBE1653:
-	.loc 1 2038 0
+.L553:
+.LBE1592:
+.LBE1651:
+	.loc 1 2125 0
 	bl	__stack_chk_fail
 .LVL616:
-.L578:
-.LBB1654:
-.LBB1639:
-	.loc 1 1880 0
+.L563:
+.LBB1652:
+.LBB1637:
+	.loc 1 1967 0
 	ldr	x0, [x21, 88]
 .LVL617:
 	adrp	x1, .LC51
@@ -6863,10 +6844,10 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC51
 	bl	_dev_err
 .LVL618:
-	b	.L501
+	b	.L486
 .LVL619:
-.L576:
-	.loc 1 1866 0
+.L561:
+	.loc 1 1953 0
 	ldr	x0, [x21, 88]
 .LVL620:
 	adrp	x1, .LC48
@@ -6874,79 +6855,70 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC48
 	bl	_dev_err
 .LVL621:
-	b	.L501
+	b	.L486
 .LVL622:
-.L577:
-	.loc 1 1862 0
+.L562:
+	.loc 1 1949 0
 	mov	w25, 1
 .LVL623:
-	b	.L518
-.LBE1639:
-.LBE1654:
+	b	.L503
+.LBE1637:
+.LBE1652:
 	.cfi_endproc
-.LFE2840:
+.LFE2841:
 	.size	ebc_probe, .-ebc_probe
 	.align	2
 	.p2align 3,,7
 	.type	ebc_power_set.constprop.8, %function
 ebc_power_set.constprop.8:
-.LFB2854:
+.LFB2855:
 	.loc 1 180 0
 	.cfi_startproc
 .LVL624:
-	stp	x29, x30, [sp, -48]!
-	.cfi_def_cfa_offset 48
-	.cfi_offset 29, -48
-	.cfi_offset 30, -40
+	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, -32
-	.cfi_offset 20, -24
+	.cfi_offset 19, -16
+	.cfi_offset 20, -8
 	.loc 1 186 0
 	add	x20, x0, 184
 	.loc 1 180 0
-	str	x21, [sp, 32]
-	.cfi_offset 21, -16
-	.loc 1 180 0
 	mov	x19, x0
 	.loc 1 186 0
 	ldr	w0, [x20, 424]
 .LVL625:
-	cbz	w0, .L582
-.L580:
+	cbz	w0, .L567
+.L565:
 	.loc 1 190 0
-	mov	w21, 1
-	str	w21, [x20, 184]
+	mov	w1, 1
+	str	w1, [x20, 184]
+	.loc 1 191 0
+	ldr	x2, [x19, 16]
+.LBB1653:
+.LBB1654:
+	.loc 3 30 0
+	mov	x0, x2
+	ldr	x2, [x2, 32]
+	blr	x2
+.LVL626:
+.LBE1654:
+.LBE1653:
+	.loc 1 192 0
+	ldr	x2, [x19, 8]
 .LBB1655:
 .LBB1656:
 	.loc 11 46 0
 	add	x1, x19, 24
-.LBE1656:
-.LBE1655:
-	.loc 1 191 0
-	ldr	x2, [x19, 8]
-.LBB1658:
-.LBB1657:
-	.loc 11 46 0
 	mov	x0, x2
 	ldr	x2, [x2, 48]
 	blr	x2
-.LVL626:
-.LBE1657:
-.LBE1658:
-	.loc 1 192 0
-	ldr	x2, [x19, 16]
-.LBB1659:
-.LBB1660:
-	.loc 3 30 0
-	mov	w1, w21
-	mov	x0, x2
-	ldr	x2, [x2, 32]
-	blr	x2
 .LVL627:
-.LBE1660:
-.LBE1659:
+.LBE1656:
+.LBE1655:
 	.loc 1 193 0
 	ldr	x0, [x19]
 	adrp	x1, .LC75
@@ -6954,37 +6926,35 @@ ebc_power_set.constprop.8:
 	bl	_dev_info
 .LVL628:
 	.loc 1 208 0
-	ldr	x21, [sp, 32]
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 .LVL629:
-	ldp	x29, x30, [sp], 48
+	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
 	.cfi_restore 29
-	.cfi_restore 21
 	.cfi_restore 19
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
 .LVL630:
 	.p2align 3
-.L582:
+.L567:
 	.cfi_restore_state
 	.loc 1 187 0
 	mov	w0, 1
 	str	w0, [x20, 424]
-.LBB1661:
-.LBB1662:
+.LBB1657:
+.LBB1658:
 	.loc 4 58 0
 	add	x0, x19, 400
 	bl	__pm_stay_awake
 .LVL631:
-	b	.L580
-.LBE1662:
-.LBE1661:
+	b	.L565
+.LBE1658:
+.LBE1657:
 	.cfi_endproc
-.LFE2854:
+.LFE2855:
 	.size	ebc_power_set.constprop.8, .-ebc_power_set.constprop.8
 	.align	2
 	.p2align 3,,7
@@ -6992,234 +6962,443 @@ ebc_power_set.constprop.8:
 	.type	refresh_new_image2, %function
 refresh_new_image2:
 .LFB2806:
-	.loc 1 212 0
+	.loc 1 213 0
 	.cfi_startproc
 .LVL632:
-	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 219 0
-	ldp	w30, w6, [x4, 52]
-	cmp	w6, 0
-	add	w14, w6, 7
-	csel	w14, w14, w6, lt
+	.loc 1 220 0
+	ldp	w16, w5, [x4, 52]
 .LVL633:
-	.loc 1 221 0
-	cmp	w30, 0
-	ble	.L583
-	asr	w14, w14, 3
+	cmp	w5, 0
+	add	w11, w5, 7
+	csel	w11, w11, w5, lt
 .LVL634:
-	mov	w16, 0
+	.loc 1 222 0
+	cmp	w16, 0
+	.loc 1 220 0
+	asr	w11, w11, 3
 .LVL635:
-	sub	w18, w14, #1
-	.loc 1 233 0
-	mov	w15, 15
-	add	x18, x18, 1
-	lsl	x17, x18, 2
-	lsl	x18, x18, 3
+	.loc 1 222 0
+	ble	.L568
+	sub	w14, w11, #1
+	mov	w15, 0
 .LVL636:
-	.p2align 2
-.L585:
-	.loc 1 222 0 discriminator 1
-	mov	x10, x3
-	mov	x7, 0
-	cmp	w14, 0
-	bgt	.L602
-	b	.L599
+	add	x14, x14, 1
+	.loc 1 267 0
+	mov	w13, 234881024
+	lsl	x17, x14, 3
+	lsl	x14, x14, 2
+	.loc 1 273 0
+	mov	w12, -536870912
 .LVL637:
+	.p2align 2
+.L570:
+	.loc 1 223 0 discriminator 1
+	mov	x6, 0
+	cmp	w11, 0
+	bgt	.L591
+	b	.L588
+.LVL638:
 	.p2align 3
-.L607:
+.L571:
+	.loc 1 236 0
+	tst	x5, 65280
+	bne	.L572
+	.loc 1 237 0
+	and	w10, w4, 240
+	cmp	w10, 224
+	beq	.L593
+	.loc 1 240 0
+	orr	w7, w7, 240
+.L572:
+	.loc 1 242 0
+	tst	x5, 16711680
+	bne	.L574
 	.loc 1 243 0
-	orr	w4, w4, -65536
-.L591:
-.LVL638:
-	.loc 1 257 0
-	orn	w8, w11, w6
-	and	w6, w6, w11
-.LVL639:
+	and	w10, w4, 3840
+	cmp	w10, 3584
+	beq	.L594
+	.loc 1 246 0
+	orr	w7, w7, 3840
+.L574:
+	.loc 1 248 0
+	tst	x5, 4278190080
+	bne	.L576
+	.loc 1 249 0
+	and	w10, w4, 61440
+	cmp	w10, 57344
+	beq	.L595
+	.loc 1 252 0
+	orr	w7, w7, 61440
+.L576:
+	.loc 1 254 0
+	tst	x5, 1095216660480
+	bne	.L578
 	.loc 1 255 0
-	bic	w9, w9, w4
-	.loc 1 257 0
-	and	w8, w8, w4
-	and	w4, w6, w4
-.LVL640:
-	cmp	w5, 18
-	orr	w6, w8, w9
-	orr	w4, w4, w9
-	csel	w4, w4, w6, ne
+	and	w10, w4, 983040
+	cmp	w10, 917504
+	beq	.L596
+	.loc 1 258 0
+	orr	w7, w7, 983040
+.L578:
 	.loc 1 260 0
-	str	w4, [x0, x7, lsl 2]
-	add	x7, x7, 1
-	.loc 1 222 0
-	cmp	w14, w7
-	ble	.L606
+	tst	x5, 280375465082880
+	bne	.L580
+	.loc 1 261 0
+	and	w10, w4, 15728640
+	cmp	w10, 14680064
+	beq	.L597
+	.loc 1 264 0
+	orr	w7, w7, 15728640
+.L580:
+	.loc 1 266 0
+	tst	x5, 71776119061217280
+	bne	.L582
+	.loc 1 267 0
+	and	w10, w4, 251658240
+	cmp	w10, w13
+	beq	.L598
+	.loc 1 270 0
+	orr	w7, w7, 251658240
+.L582:
+	.loc 1 272 0
+	tst	x5, -72057594037927936
+	bne	.L584
+	.loc 1 273 0
+	and	w5, w4, -268435456
+.LVL639:
+	cmp	w5, w12
+	beq	.L599
+	.loc 1 276 0
+	orr	w7, w7, -268435456
+.LVL640:
+.L584:
+	.loc 1 280 0 discriminator 2
+	and	w4, w4, w9
 .LVL641:
-.L602:
-	.loc 1 223 0
-	ldr	w8, [x10]
-	add	x10, x10, 8
-	.loc 1 224 0
-	ldr	w6, [x1, x7, lsl 2]
-	.loc 1 232 0
-	and	w4, w8, 255
+	eor	w4, w4, w8
+	and	w4, w4, w7
+	eor	w4, w8, w4
+	.loc 1 281 0 discriminator 2
+	str	w4, [x0, x6, lsl 2]
+	add	x6, x6, 1
+	.loc 1 223 0 discriminator 2
+	cmp	w11, w6
+	ble	.L600
 .LVL642:
-	.loc 1 226 0
-	ldr	w11, [x2, x7, lsl 2]
-.LVL643:
-	.loc 1 233 0
-	cmp	w4, 0
+.L591:
+	.loc 1 224 0
+	ldr	x5, [x3, x6, lsl 3]
+	.loc 1 228 0
+	mov	w7, 0
 	.loc 1 225 0
-	ldr	w9, [x0, x7, lsl 2]
+	ldr	w4, [x1, x6, lsl 2]
+.LVL643:
+	.loc 1 226 0
+	ldr	w8, [x0, x6, lsl 2]
 	.loc 1 230 0
-	mov	w4, 65535
+	and	x10, x5, 255
+	.loc 1 227 0
+	ldr	w9, [x2, x6, lsl 2]
 .LVL644:
-	.loc 1 229 0
-	cbz	w8, .L586
-	.loc 1 233 0
-	csel	w4, wzr, w15, ne
-	.loc 1 235 0
-	tst	w8, 65280
-	orr	w12, w4, 240
-	csel	w4, w12, w4, eq
-	.loc 1 237 0
-	tst	w8, 16711680
-	orr	w12, w4, 3840
-	csel	w4, w12, w4, eq
-	.loc 1 239 0
-	tst	w8, -16777216
-	orr	w8, w4, 61440
-	csel	w4, w8, w4, eq
-.L586:
-	.loc 1 241 0
-	ldr	w8, [x10, -4]
-	.loc 1 247 0
-	orr	w13, w4, 983040
-	.loc 1 246 0
-	and	w12, w8, 255
-	.loc 1 247 0
-	cmp	w12, 0
-	.loc 1 242 0
-	cbz	w8, .L607
-	.loc 1 247 0
-	csel	w4, w13, w4, eq
-	.loc 1 249 0
-	tst	w8, 65280
-	orr	w12, w4, 15728640
-	csel	w4, w12, w4, eq
-	.loc 1 251 0
-	tst	w8, 16711680
-	orr	w12, w4, 251658240
-	csel	w4, w12, w4, eq
-	.loc 1 253 0
-	tst	w8, -16777216
-	orr	w8, w4, -268435456
-	csel	w4, w8, w4, eq
-	b	.L591
+	.loc 1 230 0
+	cbnz	x10, .L571
 .LVL645:
-	.p2align 3
-.L606:
-	add	x1, x1, x17
-	add	x2, x2, x17
-	add	x3, x3, x18
+	.loc 1 231 0
+	and	w10, w4, 15
+	.loc 1 234 0
+	mov	w7, 15
+	.loc 1 231 0
+	cmp	w10, 14
+	bne	.L571
+	.loc 1 232 0
+	orr	w8, w8, w7
 .LVL646:
-	add	x0, x0, x17
+	.loc 1 228 0
+	mov	w7, 0
 .LVL647:
-.L599:
-	.loc 1 221 0 discriminator 2
-	add	w16, w16, 1
-	cmp	w30, w16
-	bne	.L585
-.L583:
-	.loc 1 263 0
-	ldp	x29, x30, [sp], 16
-	.cfi_restore 30
-	.cfi_restore 29
-	.cfi_def_cfa 31, 0
+	b	.L571
+	.p2align 3
+.L598:
+	.loc 1 268 0
+	orr	w8, w8, 251658240
+	b	.L582
 .LVL648:
+	.p2align 3
+.L599:
+	.loc 1 274 0
+	orr	w8, w8, -268435456
+.LVL649:
+	.loc 1 280 0
+	and	w4, w4, w9
+.LVL650:
+	eor	w4, w4, w8
+	and	w4, w4, w7
+	eor	w4, w8, w4
+	.loc 1 281 0
+	str	w4, [x0, x6, lsl 2]
+	add	x6, x6, 1
+	.loc 1 223 0
+	cmp	w11, w6
+	bgt	.L591
+.LVL651:
+	.p2align 2
+.L600:
+	add	x3, x3, x17
+	add	x1, x1, x14
+	add	x2, x2, x14
+	add	x0, x0, x14
+.LVL652:
+.L588:
+	.loc 1 222 0 discriminator 2
+	add	w15, w15, 1
+	cmp	w16, w15
+	bne	.L570
+.L568:
 	ret
+.LVL653:
+	.p2align 3
+.L594:
+	.loc 1 244 0
+	orr	w8, w8, 3840
+	b	.L574
+	.p2align 3
+.L595:
+	.loc 1 250 0
+	orr	w8, w8, 61440
+	b	.L576
+	.p2align 3
+.L596:
+	.loc 1 256 0
+	orr	w8, w8, 983040
+	b	.L578
+	.p2align 3
+.L597:
+	.loc 1 262 0
+	orr	w8, w8, 15728640
+	b	.L580
+	.p2align 3
+.L593:
+	.loc 1 238 0
+	orr	w8, w8, 240
+	b	.L572
 	.cfi_endproc
 .LFE2806:
 	.size	refresh_new_image2, .-refresh_new_image2
 	.align	2
 	.p2align 3,,7
+	.global	refresh_new_image_auto
+	.type	refresh_new_image_auto, %function
+refresh_new_image_auto:
+.LFB2807:
+	.loc 1 288 0
+	.cfi_startproc
+.LVL654:
+	.loc 1 295 0
+	ldp	w13, w4, [x3, 52]
+	cmp	w4, 0
+	add	w9, w4, 7
+	csel	w9, w9, w4, lt
+.LVL655:
+	.loc 1 297 0
+	cmp	w13, 0
+	.loc 1 295 0
+	asr	w9, w9, 3
+.LVL656:
+	.loc 1 297 0
+	ble	.L601
+	sub	w12, w9, #1
+	mov	w11, 0
+.LVL657:
+	add	x12, x12, 1
+	.loc 1 305 0
+	mov	w10, 15
+	lsl	x14, x12, 3
+	lsl	x12, x12, 2
+	.p2align 2
+.L603:
+	.loc 1 298 0 discriminator 1
+	mov	x6, 0
+	cmp	w9, 0
+	ble	.L614
+	.p2align 2
+.L616:
+	.loc 1 299 0
+	ldr	x4, [x2, x6, lsl 3]
+.LVL658:
+	.loc 1 301 0
+	ldr	w7, [x0, x6, lsl 2]
+	.loc 1 300 0
+	ldr	w3, [x1, x6, lsl 2]
+.LVL659:
+	.loc 1 304 0
+	and	x5, x4, 255
+	.loc 1 305 0
+	cmp	x5, 0
+.LVL660:
+	eor	w5, w3, w7
+	csel	w3, wzr, w10, ne
+.LVL661:
+	.loc 1 308 0
+	orr	w8, w3, 240
+	tst	x4, 65280
+	csel	w3, w8, w3, eq
+	.loc 1 311 0
+	tst	x4, 16711680
+	orr	w8, w3, 3840
+	csel	w3, w8, w3, eq
+	.loc 1 314 0
+	tst	x4, 4278190080
+	orr	w8, w3, 61440
+	csel	w3, w8, w3, eq
+	.loc 1 317 0
+	tst	x4, 1095216660480
+	orr	w8, w3, 983040
+	csel	w3, w8, w3, eq
+	.loc 1 320 0
+	tst	x4, 280375465082880
+	orr	w8, w3, 15728640
+	csel	w3, w8, w3, eq
+	.loc 1 323 0
+	tst	x4, 71776119061217280
+	orr	w8, w3, 251658240
+	csel	w3, w8, w3, eq
+	.loc 1 326 0
+	tst	x4, -72057594037927936
+	orr	w4, w3, -268435456
+.LVL662:
+	csel	w3, w4, w3, eq
+	and	w3, w5, w3
+.LVL663:
+	.loc 1 329 0
+	eor	w3, w3, w7
+	.loc 1 330 0
+	str	w3, [x0, x6, lsl 2]
+	add	x6, x6, 1
+	.loc 1 298 0
+	cmp	w9, w6
+	bgt	.L616
+	add	x2, x2, x14
+	add	x1, x1, x12
+	add	x0, x0, x12
+.LVL664:
+.L614:
+	.loc 1 297 0 discriminator 2
+	add	w11, w11, 1
+	cmp	w13, w11
+	bne	.L603
+.L601:
+	ret
+	.cfi_endproc
+.LFE2807:
+	.size	refresh_new_image_auto, .-refresh_new_image_auto
+	.align	2
+	.p2align 3,,7
 	.global	new_buffer_refresh
 	.type	new_buffer_refresh, %function
 new_buffer_refresh:
-.LFB2807:
-	.loc 1 266 0
+.LFB2808:
+	.loc 1 336 0
 	.cfi_startproc
-.LVL649:
+.LVL665:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 267 0
-	adrp	x0, .LANCHOR0
-.LVL650:
-	.loc 1 266 0
+	.loc 1 337 0
+	adrp	x1, .LANCHOR0
+	.loc 1 336 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 270 0
-	adrp	x19, .LANCHOR1
-	add	x19, x19, :lo12:.LANCHOR1
-	.loc 1 267 0
-	ldr	x20, [x0, #:lo12:.LANCHOR0]
-.LVL651:
-	.loc 1 270 0
-	add	x19, x19, 592
-	mov	x0, x19
+	.loc 1 340 0
+	adrp	x20, .LANCHOR1
+	.loc 1 337 0
+	ldr	x19, [x1, #:lo12:.LANCHOR0]
+.LVL666:
+	.loc 1 340 0
+	add	x0, x20, :lo12:.LANCHOR1
+.LVL667:
+	add	x0, x0, 592
 	bl	down_write
-.LVL652:
-	.loc 1 272 0
-	add	x4, x20, 184
-	ldr	x1, [x4, 208]
-	.loc 1 271 0
-	ldr	x0, [x4, 128]
-	ldp	x2, x3, [x4, 144]
-	ldr	w5, [x1, 40]
-	ldr	x1, [x1, 16]
+.LVL668:
+	.loc 1 338 0
+	add	x19, x19, 184
+.LVL669:
+	.loc 1 341 0
+	ldr	x0, [x19, 208]
+	ldr	w5, [x0, 40]
+	cbz	w5, .L622
+	.loc 1 347 0
+	ldr	x1, [x0, 16]
+	mov	x4, x19
+	ldp	x2, x3, [x19, 144]
+	ldr	x0, [x19, 128]
 	bl	refresh_new_image2
-.LVL653:
-	.loc 1 276 0
-	mov	x0, x19
+.LVL670:
+	.loc 1 352 0
+	add	x0, x20, :lo12:.LANCHOR1
+	add	x0, x0, 592
 	bl	up_write
-.LVL654:
-	.loc 1 277 0
+.LVL671:
+	.loc 1 353 0
 	ldp	x19, x20, [sp, 16]
-.LVL655:
+.LVL672:
 	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
+.LVL673:
+	.p2align 3
+.L622:
+	.cfi_restore_state
+	.loc 1 342 0
+	ldr	x1, [x0, 16]
+	mov	x3, x19
+	ldr	x2, [x19, 152]
+	ldr	x0, [x19, 128]
+	bl	refresh_new_image_auto
+.LVL674:
+	.loc 1 352 0
+	add	x0, x20, :lo12:.LANCHOR1
+	add	x0, x0, 592
+	bl	up_write
+.LVL675:
+	.loc 1 353 0
+	ldp	x19, x20, [sp, 16]
+.LVL676:
+	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
-.LFE2807:
+.LFE2808:
 	.size	new_buffer_refresh, .-new_buffer_refresh
 	.align	2
 	.p2align 3,,7
 	.type	ebc_thread, %function
 ebc_thread:
-.LFB2819:
-	.loc 1 925 0
+.LFB2820:
+	.loc 1 1017 0
 	.cfi_startproc
-.LVL656:
+.LVL677:
 	stp	x29, x30, [sp, -224]!
 	.cfi_def_cfa_offset 224
 	.cfi_offset 29, -224
 	.cfi_offset 30, -216
-	.loc 1 926 0
+	.loc 1 1018 0
 	adrp	x1, .LANCHOR0
-	.loc 1 925 0
+	.loc 1 1017 0
 	adrp	x0, __stack_chk_guard
-.LVL657:
+.LVL678:
 	add	x0, x0, :lo12:__stack_chk_guard
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -7231,107 +7410,109 @@ ebc_thread:
 	.cfi_offset 22, -184
 	adrp	x22, .LANCHOR1
 	stp	x23, x24, [sp, 48]
-.LBB1686:
-.LBB1687:
-.LBB1688:
-	.loc 1 1231 0
+.LBB1682:
+.LBB1683:
+.LBB1684:
+	.loc 1 1318 0
 	add	x22, x22, :lo12:.LANCHOR1
-.LBE1688:
-.LBE1687:
-.LBE1686:
-	.loc 1 926 0
-	ldr	x20, [x1, #:lo12:.LANCHOR0]
-.LVL658:
-.LBB1693:
-.LBB1691:
+.LBE1684:
+.LBE1683:
+.LBE1682:
+	.loc 1 1017 0
+	stp	x27, x28, [sp, 80]
 .LBB1689:
-	.loc 1 1231 0
+.LBB1687:
+.LBB1685:
+	.loc 1 1318 0
 	add	x19, x22, 304
+.LBE1685:
+.LBE1687:
 .LBE1689:
-.LBE1691:
-.LBE1693:
-	.loc 1 925 0
-	stp	x25, x26, [sp, 64]
-	.loc 1 930 0
-	mov	w21, 0
-.LVL659:
-	.loc 1 925 0
-	stp	x27, x28, [sp, 80]
+	.loc 1 1018 0
+	ldr	x20, [x1, #:lo12:.LANCHOR0]
+.LVL679:
 	.cfi_offset 23, -176
 	.cfi_offset 24, -168
-	.cfi_offset 25, -160
-	.cfi_offset 26, -152
 	.cfi_offset 27, -144
 	.cfi_offset 28, -136
-	.loc 1 928 0
-	add	x24, x20, 184
-	.loc 1 931 0
-	str	wzr, [x29, 108]
-	.loc 1 925 0
+	.loc 1 1023 0
+	mov	w24, 0
+.LVL680:
+	.loc 1 1017 0
+	stp	x25, x26, [sp, 64]
+	.cfi_offset 25, -160
+	.cfi_offset 26, -152
+	.loc 1 1022 0
+	mov	w21, 0
+.LVL681:
+	.loc 1 1020 0
+	add	x28, x20, 184
+	.loc 1 1017 0
 	ldr	x1, [x0]
 	str	x1, [x29, 216]
 	mov	x1,0
-.LVL660:
+.LVL682:
 	.p2align 2
-.L611:
-	.loc 1 936 0
-	ldr	w0, [x24, 600]
-.LVL661:
-	cbnz	w0, .L772
-.L612:
-	.loc 1 942 0
+.L624:
+	.loc 1 1028 0
+	ldr	w0, [x28, 600]
+.LVL683:
+	cbnz	w0, .L771
+.L625:
+	.loc 1 1034 0
 	bl	ebc_dsp_buf_get
-.LVL662:
+.LVL684:
 	mov	x23, x0
-	.loc 1 944 0
-	cbz	x0, .L614
-	.loc 1 944 0 is_stmt 0 discriminator 1
+	.loc 1 1036 0
+	cbz	x0, .L627
+	.loc 1 1036 0 is_stmt 0 discriminator 1
 	ldr	x1, [x0, 8]
-	cbz	x1, .L614
-	.loc 1 945 0 is_stmt 1
+	cbz	x1, .L627
+	.loc 1 1037 0 is_stmt 1
 	ldr	w1, [x0, 40]
 	cmp	w1, 17
-	beq	.L773
-	.loc 1 949 0
-	ldr	x2, [x24, 592]
-	cbz	x2, .L617
-	.loc 1 950 0
+	beq	.L772
+	.loc 1 1041 0
+	ldr	x2, [x28, 592]
+	cbz	x2, .L630
+	.loc 1 1042 0
 	cmp	w1, 16
-	beq	.L774
-.L765:
-	.loc 1 1009 0
+	beq	.L773
+.L764:
+	.loc 1 1100 0
 	bl	ebc_remove_from_dsp_buf_list
-.LVL663:
-	.loc 1 1010 0
+.LVL685:
+	.loc 1 1101 0
 	mov	x0, x23
 	bl	ebc_buf_release
-.LVL664:
-	.loc 1 936 0
-	ldr	w0, [x24, 600]
-	cbz	w0, .L612
+.LVL686:
+	.loc 1 1028 0
+	ldr	w0, [x28, 600]
+	cbz	w0, .L625
 	.p2align 2
-.L772:
-	.loc 1 937 0
-	ldr	w0, [x24, 184]
+.L771:
+	.loc 1 1029 0
+	ldr	w0, [x28, 184]
 	cmp	w0, 1
-	beq	.L775
-.L613:
-	.loc 1 1237 0
+	beq	.L774
+.L626:
+	.loc 1 1324 0
 	adrp	x0, __stack_chk_guard
-	add	x1, x0, :lo12:__stack_chk_guard
+	add	x23, x0, :lo12:__stack_chk_guard
+.LVL687:
 	ldr	x2, [x29, 216]
-	ldr	x1, [x1]
+	ldr	x1, [x23]
 	eor	x1, x2, x1
 	mov	w0, 0
-	cbnz	x1, .L776
+	cbnz	x1, .L775
 	ldp	x19, x20, [sp, 16]
-.LVL665:
+.LVL688:
 	ldp	x21, x22, [sp, 32]
-.LVL666:
+.LVL689:
 	ldp	x23, x24, [sp, 48]
-.LVL667:
+.LVL690:
 	ldp	x25, x26, [sp, 64]
-.LVL668:
+.LVL691:
 	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 224
 	.cfi_remember_state
@@ -7349,1220 +7530,1285 @@ ebc_thread:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL669:
+.LVL692:
 	.p2align 3
-.L614:
+.L627:
 	.cfi_restore_state
-	.loc 1 1218 0
-	ldr	w0, [x24, 28]
-.LVL670:
+	.loc 1 1305 0
+	ldr	w0, [x28, 28]
+.LVL693:
 	cmp	w0, 1
-	beq	.L777
-	.loc 1 1227 0
-	ldr	w0, [x24, 184]
+	beq	.L776
+	.loc 1 1314 0
+	ldr	w0, [x28, 184]
 	cmp	w0, 1
-	beq	.L778
-.LVL671:
-.L768:
-	ldr	w0, [x24, 80]
-.LVL672:
-	.loc 1 1230 0
-	cbz	w0, .L779
-.L699:
-.LVL673:
-.L689:
-	.loc 1 1232 0
-	str	wzr, [x24, 80]
-	b	.L611
-.LVL674:
+	beq	.L777
+.LVL694:
+.L767:
+	ldr	w0, [x28, 80]
+.LVL695:
+	.loc 1 1317 0
+	cbz	w0, .L778
+.L715:
+.LVL696:
+.L705:
+	.loc 1 1319 0
+	str	wzr, [x28, 80]
+	b	.L624
+.LVL697:
 	.p2align 3
-.L779:
-.LBB1694:
-.LBB1692:
-	.loc 1 1231 0 discriminator 1
+.L778:
+.LBB1690:
+.LBB1688:
+	.loc 1 1318 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL675:
-	b	.L700
+.LVL698:
+	b	.L716
 	.p2align 3
-.L780:
-.LVL676:
-.LBB1690:
-	.loc 1 1231 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L689
-	.loc 1 1231 0 discriminator 7
+.L779:
+.LVL699:
+.LBB1686:
+	.loc 1 1318 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L705
+	.loc 1 1318 0 discriminator 7
 	bl	schedule
-.LVL677:
-.L700:
-	.loc 1 1231 0 discriminator 9
+.LVL700:
+.L716:
+	.loc 1 1318 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL678:
-	ldr	w1, [x24, 80]
-	cbz	w1, .L780
-.LBE1690:
-	.loc 1 1231 0 discriminator 4
+.LVL701:
+	ldr	w1, [x28, 80]
+	cbz	w1, .L779
+.LBE1686:
+	.loc 1 1318 0 discriminator 4
 	add	x1, x29, 112
 	mov	x0, x19
 	bl	finish_wait
-.LVL679:
-.LBE1692:
-.LBE1694:
-	.loc 1 1232 0 is_stmt 1 discriminator 4
-	str	wzr, [x24, 80]
-	b	.L611
-.LVL680:
+.LVL702:
+.LBE1688:
+.LBE1690:
+	.loc 1 1319 0 is_stmt 1 discriminator 4
+	str	wzr, [x28, 80]
+	b	.L624
+.LVL703:
 	.p2align 3
-.L617:
-	.loc 1 962 0
+.L630:
+	.loc 1 1054 0
 	cmp	w1, 15
-	beq	.L781
-	.loc 1 966 0
-	ldr	w2, [x24, 608]
-	sub	w0, w1, #18
-.LVL681:
-	cmp	w2, 0
-	ccmp	w1, 1, 4, ne
-	ccmp	w0, 1, 0, ne
-	bls	.L616
-	.loc 1 967 0
+	beq	.L780
+	.loc 1 1058 0
+	cmp	w1, 1
+	ldr	w0, [x28, 608]
+.LVL704:
+	ccmp	w1, 18, 4, ne
+	ccmp	w0, 0, 4, ne
+	beq	.L629
+	.loc 1 1059 0
 	add	x25, x22, 592
+.LVL705:
 	mov	x0, x25
 	bl	down_write
-.LVL682:
-	.loc 1 968 0
-	ldrsw	x2, [x24, 20]
+.LVL706:
+	.loc 1 1060 0
+	ldrsw	x2, [x28, 20]
 	ldr	x1, [x23, 16]
-	ldr	x0, [x24, 144]
+	ldr	x0, [x28, 144]
 	bl	memcpy
-.LVL683:
-	.loc 1 969 0
+.LVL707:
+	.loc 1 1061 0
 	mov	x0, x23
 	bl	ebc_remove_from_dsp_buf_list
-.LVL684:
-	.loc 1 970 0
+.LVL708:
+	.loc 1 1062 0
 	mov	x0, x23
 	bl	ebc_buf_release
-.LVL685:
-	.loc 1 972 0
-	ldr	x1, [x24, 208]
-	mov	x4, x24
-	ldr	x0, [x24, 128]
-	ldp	x2, x3, [x24, 144]
+.LVL709:
+	.loc 1 1064 0
+	ldr	x1, [x28, 208]
+	mov	x4, x28
+	ldr	x0, [x28, 128]
+	ldp	x2, x3, [x28, 144]
 	ldr	w5, [x1, 40]
 	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
-.LVL686:
-	.loc 1 975 0
+.LVL710:
+	.loc 1 1067 0
 	mov	x0, x25
 	bl	up_write
-.LVL687:
-	.loc 1 976 0
-	ldr	w0, [x24, 28]
-	cbnz	w0, .L611
-	.loc 1 977 0
+.LVL711:
+	.loc 1 1068 0
+	ldr	w0, [x28, 28]
+	cbnz	w0, .L624
+	.loc 1 1069 0
 	mov	w0, 1
-	str	w0, [x24, 28]
-	.loc 1 979 0
-	ldr	w0, [x24, 184]
-	.loc 1 978 0
-	str	wzr, [x24, 76]
-	.loc 1 979 0
-	cbz	w0, .L782
-.L621:
-	.loc 1 981 0
-	ldr	x0, [x24, 88]
+	str	w0, [x28, 28]
+	.loc 1 1071 0
+	ldr	w0, [x28, 184]
+	.loc 1 1070 0
+	str	wzr, [x28, 76]
+	.loc 1 1071 0
+	cbz	w0, .L781
+.L634:
+	.loc 1 1073 0
+	ldr	x0, [x28, 88]
 	adrp	x1, .LC77
-	ldrb	w2, [x24, 32]
+	ldrb	w2, [x28, 32]
 	add	x1, x1, :lo12:.LC77
 	bl	_dev_info
-.LVL688:
-	.loc 1 982 0
+.LVL712:
+	.loc 1 1074 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL689:
-	b	.L611
-.LVL690:
+.LVL713:
+	b	.L624
+.LVL714:
 	.p2align 3
-.L774:
-	.loc 1 951 0
-	str	wzr, [x24, 592]
-	.loc 1 952 0
+.L773:
+	.loc 1 1043 0
+	str	wzr, [x28, 592]
+	.loc 1 1044 0
 	mov	x0, 3
-.LVL691:
+.LVL715:
 	bl	ebc_notify
-.LVL692:
-	.loc 1 953 0
-	ldr	x0, [x24, 88]
+.LVL716:
+	.loc 1 1045 0
+	ldr	x0, [x28, 88]
 	adrp	x1, .LC76
 	add	x1, x1, :lo12:.LC76
 	bl	_dev_info
-.LVL693:
+.LVL717:
 	.p2align 2
-.L616:
-	.loc 1 987 0
+.L629:
+	.loc 1 1079 0
 	adrp	x25, jiffies
+.LVL718:
 	mov	x1, 402653184
 	add	x0, x20, 616
 	ldr	x2, [x25, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL694:
-	.loc 1 989 0
-	ldr	w0, [x24, 428]
-	cbz	w0, .L622
-	ldr	x0, [x24, 200]
-.L623:
-	.loc 1 992 0
+.LVL719:
+	.loc 1 1081 0
+	ldr	w0, [x28, 428]
+	cbz	w0, .L635
+	ldr	x0, [x28, 200]
+.L636:
+	.loc 1 1084 0
 	ldr	w2, [x0, 40]
 	ldr	w3, [x23, 40]
 	cmp	w3, w2
-	beq	.L624
-	.loc 1 993 0
-	ldr	x0, [x24, 88]
+	beq	.L637
+	.loc 1 1085 0
+	ldr	x0, [x28, 88]
 	adrp	x1, .LC78
 	add	x1, x1, :lo12:.LC78
 	bl	_dev_info
-.LVL695:
-	.loc 1 994 0
-	ldr	w0, [x24, 28]
+.LVL720:
+	.loc 1 1086 0
+	ldr	w0, [x28, 28]
 	cmp	w0, 1
-	beq	.L783
-.L766:
+	beq	.L782
+.L765:
 	ldr	w2, [x23, 40]
-.L624:
-	.loc 1 1001 0
+.L637:
+	.loc 1 1093 0
 	cmp	w2, 11
-	ble	.L784
-	cmp	w2, 17
-	ble	.L785
+	bgt	.L644
+	cmp	w2, 7
+	bge	.L647
+	cmp	w2, 1
+	beq	.L646
+	bgt	.L720
+	cbnz	w2, .L643
+	.loc 1 1138 0
+	add	x0, x22, 592
+	bl	down_write
+.LVL721:
+	.loc 1 1144 0
+	ldr	x0, [x28, 200]
+	.loc 1 1139 0
+	str	x23, [x28, 208]
+	.loc 1 1144 0
+	ldr	w0, [x0, 40]
+	cmp	w0, 1
+	bls	.L681
+	.loc 1 1146 0
+	ldrsw	x2, [x28, 20]
+	ldr	x1, [x23, 16]
+	ldr	x0, [x28, 128]
+	bl	memcpy
+.LVL722:
+	.loc 1 1147 0
+	ldr	x0, [x28, 200]
+	ldrsw	x2, [x28, 20]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x28, 136]
+	bl	memcpy
+.LVL723:
+.L682:
+	.loc 1 1153 0
+	add	x0, x22, 592
+	bl	up_write
+.LVL724:
+	.loc 1 1155 0
+	ldr	w0, [x28, 28]
+	cbnz	w0, .L659
+	.loc 1 1158 0
+	ldr	w0, [x28, 184]
+	.loc 1 1156 0
+	mov	w1, 1
+	.loc 1 1157 0
+	str	wzr, [x28, 76]
+	.loc 1 1156 0
+	str	w1, [x28, 28]
+	.loc 1 1158 0
+	cbz	w0, .L783
+.L683:
+	.loc 1 1160 0
+	mov	x0, x20
+	bl	ebc_lut_update
+.LVL725:
+	cmn	w0, #1
+	beq	.L784
+	.loc 1 1168 0
+	ldr	x0, [x28, 88]
+	adrp	x1, .LC84
+	.loc 1 1165 0
+	ldr	w3, [x28, 96]
+	.loc 1 1168 0
+	add	x1, x1, :lo12:.LC84
+	.loc 1 1165 0
+	strb	w3, [x28, 32]
+.LVL726:
+.L766:
+	.loc 1 1168 0
+	and	w2, w3, 255
+	.loc 1 1166 0
+	lsr	w3, w3, 8
+	strb	w3, [x28, 33]
+	.loc 1 1168 0
+	bl	_dev_info
+.LVL727:
+	.loc 1 1169 0
+	mov	x0, x20
+	bl	ebc_frame_start
+.LVL728:
+	.loc 1 1279 0
+	ldr	x0, [x28, 208]
+	ldr	w0, [x0, 40]
+	cmp	w0, 17
+	bne	.L701
+.LVL729:
+	.p2align 2
+.L790:
+	.loc 1 1282 0
+	ldr	x0, [x28, 88]
+	.loc 1 1280 0
+	mov	w25, 1
+.LVL730:
+	.loc 1 1281 0
+	str	wzr, [x28, 188]
+	.loc 1 1282 0
+	adrp	x1, .LC87
+	.loc 1 1280 0
+	str	w25, [x28, 600]
+	.loc 1 1282 0
+	add	x1, x1, :lo12:.LC87
+	bl	_dev_info
+.LVL731:
+	.loc 1 1283 0
+	mov	w2, w25
+	mov	w1, w25
+	add	x0, x22, 328
+	bl	__wake_up_sync
+.LVL732:
+	.loc 1 1294 0
+	mov	x0, x23
+	bl	ebc_remove_from_dsp_buf_list
+.LVL733:
+	.loc 1 1296 0
+	ldr	w0, [x28, 428]
+	cbz	w0, .L703
+.LVL734:
+	.p2align 2
+.L792:
+	.loc 1 1297 0
+	ldr	x0, [x28, 200]
+	bl	ebc_buf_release
+.LVL735:
+	b	.L704
+.LVL736:
+	.p2align 3
+.L635:
+	.loc 1 1082 0
+	mov	x0, x23
+	str	x23, [x28, 200]
+	b	.L636
+	.p2align 3
+.L649:
+	.loc 1 1093 0
 	cmp	w2, 18
-	beq	.L633
-	cmp	w2, 19
-	bne	.L630
-	.loc 1 1096 0
+	bne	.L643
+	.loc 1 1184 0
 	mov	w21, 1
-	.loc 1 1085 0
-	str	wzr, [x24, 608]
-.L634:
-	.loc 1 1104 0
-	ldr	x26, [x24, 200]
-	.loc 1 1105 0
+	.loc 1 1173 0
+	str	wzr, [x28, 608]
+.L647:
+	.loc 1 1192 0
+	ldr	x26, [x28, 200]
+.LVL737:
+	.loc 1 1193 0
 	ldr	w0, [x26, 40]
-	.loc 1 1107 0
 	cmp	w0, 1
-	.loc 1 1105 0
-	ccmp	w0, 18, 4, hi
-	bne	.L669
-	.loc 1 1111 0
-	add	x0, x29, 152
-	str	x0, [x24, 200]
-	.loc 1 1112 0
-	ldr	x0, [x24, 136]
-	str	x0, [x29, 168]
-.L669:
-	.loc 1 1117 0
-	str	wzr, [x24, 76]
-	.loc 1 1118 0
-	str	x23, [x24, 208]
-	.loc 1 1120 0
-	ldr	w7, [x23, 40]
-	.loc 1 1123 0
-	sub	w0, w7, #7
-	.loc 1 1120 0
+	bls	.L785
+.L685:
+	.loc 1 1204 0
+	str	wzr, [x28, 76]
+	.loc 1 1205 0
+	str	x23, [x28, 208]
+	.loc 1 1207 0
+	ldr	w9, [x23, 40]
+	.loc 1 1210 0
+	sub	w0, w9, #7
+	.loc 1 1207 0
 	cmp	w0, 4
 	bls	.L786
-.LVL696:
-.L670:
-	.loc 1 1135 0
-	cbnz	w21, .L709
-	.loc 1 1139 0
-	ldr	w1, [x24, 48]
+.LVL738:
+.L686:
+	.loc 1 1222 0
+	cbnz	w21, .L724
+	.loc 1 1226 0
+	ldr	w1, [x28, 48]
 	mov	x0, x23
 	cmp	w1, 0
-	ble	.L677
-	.loc 1 1140 0
-	ldr	w0, [x29, 108]
-.LVL697:
-	add	w0, w0, 1
-	str	w0, [x29, 108]
-	.loc 1 1141 0
-	cmp	w1, w0
-	mov	x0, x23
-.LVL698:
+	ble	.L693
+	.loc 1 1227 0
+	add	w24, w24, 1
+	.loc 1 1228 0
+	cmp	w1, w24
 	ble	.L787
-.L677:
-	.loc 1 1148 0
-	cmp	w7, 12
+.L693:
+	.loc 1 1235 0
+	cmp	w9, 12
 	beq	.L788
-.L678:
-	.loc 1 1154 0
-	ldr	w0, [x24, 184]
+.L694:
+	.loc 1 1241 0
+	ldr	w0, [x28, 184]
 	cbz	w0, .L789
-.L679:
-	.loc 1 1157 0
+.L695:
+	.loc 1 1244 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL699:
+.LVL739:
 	mov	w21, w0
-	cbz	w0, .L680
-.L797:
-	.loc 1 1158 0
-	ldr	x0, [x24, 88]
+	cbz	w0, .L696
+	.loc 1 1245 0
+	ldr	x0, [x28, 88]
 	adrp	x1, .LC83
-	.loc 1 1161 0
+	.loc 1 1248 0
 	mov	w21, 0
-	.loc 1 1158 0
+	.loc 1 1245 0
 	add	x1, x1, :lo12:.LC83
 	bl	_dev_err
-.LVL700:
-	.loc 1 1160 0
-	str	x26, [x24, 200]
-.LVL701:
-.L646:
-	.loc 1 1192 0
-	ldr	x0, [x24, 208]
+.LVL740:
+	.loc 1 1247 0
+	str	x26, [x28, 200]
+.LVL741:
+.L659:
+	.loc 1 1279 0
+	ldr	x0, [x28, 208]
 	ldr	w0, [x0, 40]
 	cmp	w0, 17
 	beq	.L790
-.L685:
-	.loc 1 1198 0
+.L701:
+	.loc 1 1285 0
 	cmp	w0, 15
 	beq	.L791
-.L686:
-	.loc 1 1207 0
+.L702:
+	.loc 1 1294 0
 	mov	x0, x23
 	bl	ebc_remove_from_dsp_buf_list
-.LVL702:
-	.loc 1 1209 0
-	ldr	w0, [x24, 428]
+.LVL742:
+	.loc 1 1296 0
+	ldr	w0, [x28, 428]
 	cbnz	w0, .L792
-	.loc 1 1212 0
+.L703:
+	.loc 1 1299 0
 	mov	w0, 1
-	str	w0, [x24, 428]
-.L688:
-	.loc 1 1214 0
-	ldr	x0, [x24, 208]
-	str	x0, [x24, 200]
-	.loc 1 1215 0
-	b	.L611
-	.p2align 3
-.L622:
-	.loc 1 990 0
-	mov	x0, x23
-	str	x23, [x24, 200]
-	b	.L623
-	.p2align 3
-.L784:
-	.loc 1 1001 0
-	cmp	w2, 7
-	bge	.L634
-	cmp	w2, 1
-	beq	.L633
-	bgt	.L704
-	cbnz	w2, .L630
-	.loc 1 1048 0
-	add	x0, x22, 592
-	bl	down_write
-.LVL703:
-	.loc 1 1051 0
-	ldr	x0, [x24, 200]
-	.loc 1 1049 0
-	str	x23, [x24, 208]
-	.loc 1 1051 0
-	ldr	w1, [x0, 40]
-	mov	x0, x23
-	cbnz	w1, .L793
-.L664:
-	.loc 1 1061 0
-	ldr	w5, [x0, 40]
-	mov	x4, x24
-	ldr	x1, [x0, 16]
-	ldp	x2, x3, [x24, 144]
-	ldr	x0, [x24, 128]
-	bl	refresh_new_image2
-.LVL704:
-.L666:
-	.loc 1 1065 0
-	add	x0, x22, 592
-	bl	up_write
-.LVL705:
-	.loc 1 1067 0
-	ldr	w0, [x24, 28]
-	cbnz	w0, .L646
-	.loc 1 1070 0
-	ldr	w0, [x24, 184]
-	.loc 1 1068 0
-	mov	w1, 1
-	.loc 1 1069 0
-	str	wzr, [x24, 76]
-	.loc 1 1068 0
-	str	w1, [x24, 28]
-	.loc 1 1070 0
-	cbz	w0, .L794
-.L667:
-	.loc 1 1072 0
-	mov	x0, x20
-	bl	ebc_lut_update
-.LVL706:
-	cmn	w0, #1
-	beq	.L795
-	.loc 1 1077 0
-	ldr	w3, [x24, 96]
-	.loc 1 1080 0
-	adrp	x1, .LC84
-	.loc 1 1077 0
-	strb	w3, [x24, 32]
-	.loc 1 1080 0
-	add	x1, x1, :lo12:.LC84
-	ldr	x0, [x24, 88]
-	b	.L767
-.LVL707:
+	str	w0, [x28, 428]
+.L704:
+	.loc 1 1301 0
+	ldr	x0, [x28, 208]
+	str	x0, [x28, 200]
+	.loc 1 1302 0
+	b	.L624
+.LVL743:
 	.p2align 3
-.L773:
-	.loc 1 947 0
-	str	wzr, [x24, 604]
-	.loc 1 946 0
-	str	wzr, [x24, 608]
-	b	.L616
-.LVL708:
+.L644:
+	.loc 1 1093 0
+	cmp	w2, 17
+	bgt	.L649
+	cmp	w2, 14
+	bge	.L720
+	cmp	w2, 12
+	beq	.L720
+	cmp	w2, 13
+	beq	.L647
+.L643:
+	.loc 1 1271 0
+	ldr	x0, [x28, 88]
+	adrp	x1, .LC86
+	add	x1, x1, :lo12:.LC86
+	bl	_dev_err
+.LVL744:
+	.loc 1 1272 0
+	b	.L659
+.LVL745:
 	.p2align 3
-.L792:
-	.loc 1 1210 0
-	ldr	x0, [x24, 200]
-	bl	ebc_buf_release
-.LVL709:
-	b	.L688
+.L772:
+	.loc 1 1039 0
+	str	wzr, [x28, 604]
+	.loc 1 1038 0
+	str	wzr, [x28, 608]
+	b	.L629
+.LVL746:
 	.p2align 3
-.L777:
-.LBB1695:
-	.loc 1 1219 0 discriminator 1
-	ldr	w0, [x24, 80]
-	cbnz	w0, .L689
-.LBB1696:
-	.loc 1 1219 0 is_stmt 0 discriminator 3
+.L776:
+.LBB1691:
+	.loc 1 1306 0 discriminator 1
+	ldr	w0, [x28, 80]
+	cbnz	w0, .L705
+.LBB1692:
+	.loc 1 1306 0 is_stmt 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL710:
-	b	.L693
+.LVL747:
+	b	.L709
 	.p2align 3
-.L796:
-.LBB1697:
-	.loc 1 1219 0 discriminator 7
-	ldr	w1, [x24, 80]
-	cbnz	w1, .L690
-.LVL711:
-	.loc 1 1219 0 discriminator 9
-	cbnz	x0, .L768
-	.loc 1 1219 0 discriminator 11
+.L793:
+.LBB1693:
+	.loc 1 1306 0 discriminator 7
+	ldr	w1, [x28, 80]
+	cbnz	w1, .L706
+.LVL748:
+	.loc 1 1306 0 discriminator 9
+	cbnz	x0, .L767
+	.loc 1 1306 0 discriminator 11
 	bl	schedule
-.LVL712:
-.L693:
-	.loc 1 1219 0 discriminator 13
+.LVL749:
+.L709:
+	.loc 1 1306 0 discriminator 13
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL713:
-	ldr	w1, [x24, 28]
-	cbnz	w1, .L796
-.L690:
-.LBE1697:
-	.loc 1 1219 0 discriminator 8
+.LVL750:
+	ldr	w1, [x28, 28]
+	cbnz	w1, .L793
+.L706:
+.LBE1693:
+	.loc 1 1306 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL714:
-	ldr	w0, [x24, 28]
-.LBE1696:
-.LBE1695:
-	.loc 1 1222 0 is_stmt 1 discriminator 8
-	cbnz	w0, .L768
-	.loc 1 1227 0
-	ldr	w0, [x24, 184]
+.LVL751:
+	ldr	w0, [x28, 28]
+.LBE1692:
+.LBE1691:
+	.loc 1 1309 0 is_stmt 1 discriminator 8
+	cbnz	w0, .L767
+	.loc 1 1314 0
+	ldr	w0, [x28, 184]
 	cmp	w0, 1
-	bne	.L768
+	bne	.L767
 	.p2align 2
-.L778:
-.LBB1698:
-.LBB1699:
+.L777:
+.LBB1694:
+.LBB1695:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.4
-.LVL715:
-	b	.L768
-	.p2align 3
-.L785:
-.LBE1699:
-.LBE1698:
-	.loc 1 1001 0
-	cmp	w2, 14
-	bge	.L704
-	cmp	w2, 12
-	beq	.L704
-	cmp	w2, 13
-	beq	.L634
-.L630:
-	.loc 1 1184 0
-	ldr	x0, [x24, 88]
-	adrp	x1, .LC86
-	add	x1, x1, :lo12:.LC86
-	bl	_dev_err
-.LVL716:
-	.loc 1 1192 0
-	ldr	x0, [x24, 208]
-	ldr	w0, [x0, 40]
-	cmp	w0, 17
-	bne	.L685
-.LVL717:
-	.p2align 2
-.L790:
-	.loc 1 1195 0
-	ldr	x0, [x24, 88]
-	.loc 1 1193 0
-	mov	w25, 1
-	.loc 1 1194 0
-	str	wzr, [x24, 188]
-	.loc 1 1195 0
-	adrp	x1, .LC87
-	.loc 1 1193 0
-	str	w25, [x24, 600]
-	.loc 1 1195 0
-	add	x1, x1, :lo12:.LC87
-	bl	_dev_info
-.LVL718:
-	.loc 1 1196 0
-	mov	w2, w25
-	mov	w1, w25
-	add	x0, x22, 328
-	bl	__wake_up_sync
-.LVL719:
-	b	.L686
-	.p2align 3
-.L704:
-	.loc 1 1096 0
-	mov	w21, 1
-	b	.L634
-.LVL720:
+.LVL752:
+	b	.L767
+.LVL753:
 	.p2align 3
-.L709:
-	.loc 1 1136 0
-	str	wzr, [x29, 108]
-	mov	x0, x23
-	.loc 1 1148 0
-	cmp	w7, 12
-	bne	.L678
-.L788:
-	.loc 1 1150 0
-	ldr	w1, [x26, 40]
-	sub	w1, w1, #12
-	cmp	w1, 1
-	bls	.L678
-	.loc 1 1151 0
-	mov	w1, 13
-	str	w1, [x0, 40]
-	.loc 1 1154 0
-	ldr	w0, [x24, 184]
-	cbnz	w0, .L679
-	.p2align 2
-.L789:
-	.loc 1 1155 0
-	mov	x0, x20
-	bl	ebc_power_set.constprop.8
-.LVL721:
-	.loc 1 1157 0
-	mov	x0, x20
-	bl	ebc_lut_update
-.LVL722:
-	mov	w21, w0
-	cbnz	w0, .L797
-.L680:
-	.loc 1 1169 0
-	ldr	x0, [x24, 208]
+.L696:
+.LBE1695:
+.LBE1694:
+	.loc 1 1256 0
+	ldr	x0, [x28, 208]
+.LVL754:
 	adrp	x1, .LC85
-	.loc 1 1166 0
-	ldr	w3, [x24, 96]
-	.loc 1 1169 0
+	.loc 1 1253 0
+	ldr	w3, [x28, 96]
+	.loc 1 1256 0
 	add	x1, x1, :lo12:.LC85
-	.loc 1 1166 0
-	strb	w3, [x24, 32]
-	.loc 1 1173 0
-	add	x28, x20, 672
-	.loc 1 1169 0
+	.loc 1 1253 0
+	strb	w3, [x28, 32]
+	.loc 1 1256 0
 	and	w3, w3, 255
 	ldr	w2, [x0, 40]
-	ldr	x0, [x24, 88]
+	ldr	x0, [x28, 88]
 	bl	_dev_info
-.LVL723:
-	.loc 1 1170 0
+.LVL755:
+	.loc 1 1257 0
 	mov	w0, 1
-	str	w0, [x24, 28]
-	.loc 1 1171 0
+	str	w0, [x28, 28]
+	.loc 1 1258 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL724:
-	.loc 1 1173 0
+.LVL756:
+	.loc 1 1260 0
 	ldr	x1, [x25, #:lo12:jiffies]
-	mov	x0, x28
+	add	x0, x20, 672
+	str	x0, [x29, 104]
 	add	x1, x1, 900
 	bl	mod_timer
-.LVL725:
-.LBB1700:
-	.loc 1 1174 0
-	ldr	w0, [x24, 76]
-	cbz	w0, .L798
-.L683:
-.LVL726:
-.L681:
-.LBE1700:
-	.loc 1 1176 0 discriminator 11
+.LVL757:
+.LBB1696:
+	.loc 1 1261 0
+	ldr	w0, [x28, 76]
+	cbz	w0, .L794
+.L699:
+.LVL758:
+.L697:
+.LBE1696:
+	.loc 1 1263 0 discriminator 11
 	ldr	x2, [x25, #:lo12:jiffies]
-	mov	x0, x28
-.LVL727:
 	mov	x1, 402653184
+	ldr	x0, [x29, 104]
+.LVL759:
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL728:
-	.loc 1 1177 0 discriminator 11
-	str	wzr, [x24, 76]
-	.loc 1 1179 0 discriminator 11
-	str	x26, [x24, 200]
-	.loc 1 1181 0 discriminator 11
-	b	.L646
+.LVL760:
+	.loc 1 1264 0 discriminator 11
+	str	wzr, [x28, 76]
+	.loc 1 1266 0 discriminator 11
+	str	x26, [x28, 200]
+	.loc 1 1268 0 discriminator 11
+	b	.L659
+.LVL761:
 	.p2align 3
-.L633:
-	.loc 1 1004 0
-	ldr	w0, [x24, 604]
-	cbz	w0, .L638
-	.loc 1 1017 0
-	ldr	x0, [x24, 200]
-	.loc 1 1005 0
-	mov	w1, 1
-	.loc 1 1015 0
-	str	x23, [x24, 208]
-	.loc 1 1005 0
-	str	w1, [x24, 608]
-	.loc 1 1017 0
-	ldr	w1, [x0, 40]
-	.loc 1 1019 0
-	cmp	w1, 1
-	.loc 1 1017 0
-	ccmp	w1, 18, 4, hi
-	bne	.L799
+.L724:
 	mov	x0, x23
-	.loc 1 1023 0
-	cbz	w1, .L800
-.L641:
-.LBB1704:
-.LBB1705:
-	.loc 1 297 0
-	ldp	w3, w15, [x0, 48]
-	.loc 1 298 0
-	ldp	w2, w18, [x0, 56]
-	.loc 1 295 0
-	cmp	w3, 0
-	.loc 1 300 0
-	ldr	w1, [x20, 240]
-	.loc 1 295 0
-	add	w16, w3, 7
-	csel	w16, w16, w3, lt
-	.loc 1 296 0
-	add	w10, w2, 7
-	cmp	w2, 0
-	.loc 1 300 0
-	add	w17, w1, 7
-	.loc 1 296 0
-	csel	w10, w10, w2, lt
-	.loc 1 300 0
-	cmp	w1, 0
-	csel	w17, w17, w1, lt
-	.loc 1 296 0
-	asr	w10, w10, 3
-	add	w10, w10, 1
-.LVL729:
-	.loc 1 300 0
-	asr	w17, w17, 3
-.LVL730:
-	ldr	w1, [x20, 236]
-	.loc 1 303 0
-	cmp	w10, w17
-	sub	w2, w17, #1
-.LBE1705:
-.LBE1704:
-	.loc 1 1027 0
-	ldr	w13, [x0, 40]
-.LBB1710:
-.LBB1706:
-	.loc 1 303 0
-	csel	w10, w2, w10, ge
-.LVL731:
-	.loc 1 305 0
-	cmp	w1, w18
-	sub	w1, w1, #1
-	.loc 1 295 0
-	asr	w16, w16, 3
-.LVL732:
-	.loc 1 305 0
-	csel	w18, w1, w18, le
-.LBE1706:
-.LBE1710:
-	.loc 1 1027 0
-	ldr	x11, [x0, 16]
-.LVL733:
-.LBB1711:
-.LBB1707:
-	.loc 1 307 0
-	cmp	w15, w18
-.LBE1707:
-.LBE1711:
-	.loc 1 1027 0
-	ldr	x8, [x24, 128]
-	.loc 1 1028 0
-	ldp	x12, x26, [x24, 144]
-.LVL734:
-.LBB1712:
-.LBB1708:
-	.loc 1 307 0
-	bgt	.L649
-	mul	w9, w15, w17
-	sbfiz	x25, x17, 3, 32
-	.loc 1 316 0
-	mov	w14, 15
-.LVL735:
+	.loc 1 1223 0
+	mov	w24, 0
+	.loc 1 1235 0
+	cmp	w9, 12
+	bne	.L694
+.L788:
+	.loc 1 1237 0
+	ldr	w1, [x26, 40]
+	sub	w1, w1, #12
+	cmp	w1, 1
+	bls	.L694
+	.loc 1 1238 0
+	mov	w1, 13
+	str	w1, [x0, 40]
+	.loc 1 1241 0
+	ldr	w0, [x28, 184]
+	cbnz	w0, .L695
 	.p2align 2
-.L648:
-	.loc 1 311 0
-	sxtw	x7, w15
-.LVL736:
-	.loc 1 312 0
-	mov	w6, w16
-	cmp	w16, w10
-	.loc 1 311 0
-	madd	x7, x7, x25, x26
-.LVL737:
-	.loc 1 312 0
-	ble	.L736
-	b	.L662
-.LVL738:
-	.p2align 3
-.L801:
-	.loc 1 333 0
-	orr	w0, w0, -65536
-.L655:
-.LVL739:
-	.loc 1 346 0
-	orn	w2, w5, w1
-	and	w1, w1, w5
-.LVL740:
-	.loc 1 344 0
-	bic	w4, w27, w0
-	.loc 1 346 0
-	and	w2, w2, w0
-	and	w0, w1, w0
-.LVL741:
-	cmp	w13, 18
-	orr	w1, w2, w4
-	orr	w0, w0, w4
-	csel	w0, w0, w1, ne
-	.loc 1 349 0
-	str	w0, [x8, x3]
-.LVL742:
-	.loc 1 312 0
-	add	w6, w6, 1
-	cmp	w6, w10
-	bgt	.L662
-.L736:
-	.loc 1 313 0
-	sxtw	x2, w6
-.LVL743:
-	.loc 1 320 0
-	mov	w0, 65535
-.LVL744:
-	.loc 1 313 0
-	lsl	x3, x2, 2
-	.loc 1 318 0
-	lsl	x2, x2, 3
-.LVL745:
-	add	x3, x3, x9, sxtw 2
-	ldr	w4, [x7, x2]
-	.loc 1 313 0
-	ldr	w27, [x8, x3]
-	.loc 1 314 0
-	ldr	w1, [x11, x3]
-	.loc 1 315 0
-	ldr	w5, [x12, x3]
-.LVL746:
-	.loc 1 319 0
-	cbz	w4, .L650
-	.loc 1 322 0
-	and	w0, w4, 255
-.LVL747:
-	.loc 1 316 0
-	cmp	w0, 0
-	csel	w0, w14, wzr, eq
-.LVL748:
-	.loc 1 325 0
-	tst	w4, 65280
-	orr	w28, w0, 240
-	csel	w0, w28, w0, eq
-	.loc 1 327 0
-	tst	w4, 16711680
-	orr	w28, w0, 3840
-	csel	w0, w28, w0, eq
-	.loc 1 329 0
-	tst	w4, -16777216
-	orr	w4, w0, 61440
-	csel	w0, w4, w0, eq
-.L650:
-	.loc 1 331 0
-	add	x2, x7, x2
-	ldr	w2, [x2, 4]
-	.loc 1 332 0
-	cbz	w2, .L801
-	.loc 1 335 0
-	and	w4, w2, 255
-	.loc 1 336 0
-	cmp	w4, 0
-	orr	w4, w0, 983040
-	csel	w0, w4, w0, eq
-	.loc 1 338 0
-	tst	w2, 65280
-	orr	w4, w0, 15728640
-	csel	w0, w4, w0, eq
-	.loc 1 340 0
-	tst	w2, 16711680
-	orr	w4, w0, 251658240
-	csel	w0, w4, w0, eq
-	.loc 1 342 0
-	tst	w2, -16777216
-	orr	w2, w0, -268435456
-	csel	w0, w2, w0, eq
-	b	.L655
-.LVL749:
+.L789:
+	.loc 1 1242 0
+	mov	x0, x20
+	bl	ebc_power_set.constprop.8
+.LVL762:
+	b	.L695
 	.p2align 3
 .L786:
-.LBE1708:
-.LBE1712:
-	.loc 1 1127 0
-	ldp	w6, w0, [x20, 108]
-	.loc 1 1125 0
+	.loc 1 1214 0
+	ldp	w7, w0, [x20, 108]
+	.loc 1 1212 0
 	ldr	x4, [x23, 16]
-	.loc 1 1127 0
-	mul	w6, w6, w0
-	.loc 1 1126 0
-	ldr	x0, [x24, 200]
-	.loc 1 1127 0
-	lsr	w6, w6, 1
-	.loc 1 1126 0
+	.loc 1 1214 0
+	mul	w7, w7, w0
+	.loc 1 1213 0
+	ldr	x0, [x28, 200]
+	.loc 1 1214 0
+	lsr	w7, w7, 1
+	.loc 1 1213 0
 	ldr	x5, [x0, 16]
-.LBB1713:
-.LBB1714:
-	.loc 1 900 0
-	asr	w0, w6, 3
-	cbz	w0, .L671
-	.loc 1 904 0
-	ldr	x2, [x4]
-	ldr	x1, [x5]
+.LBB1700:
+.LBB1701:
+	.loc 1 992 0
+	asr	w0, w7, 3
+	cbz	w0, .L687
+	.loc 1 996 0
+	ldr	x1, [x4]
+	ldr	x2, [x5]
 	cmp	x2, x1
-	bne	.L670
+	bne	.L686
 	sub	w3, w0, #1
 	mov	x0, 8
 	add	x3, x3, 1
 	lsl	x3, x3, 3
-	b	.L673
+	b	.L689
 	.p2align 3
-.L674:
-	.loc 1 901 0
+.L690:
+	.loc 1 993 0
 	ldr	x2, [x4, x0]
 	add	x0, x0, 8
-	.loc 1 902 0
+	.loc 1 994 0
 	add	x1, x5, x0
-	.loc 1 904 0
+	.loc 1 996 0
 	ldr	x1, [x1, -8]
 	cmp	x2, x1
-	bne	.L670
-.L673:
-	.loc 1 900 0
+	bne	.L686
+.L689:
+	.loc 1 992 0
 	cmp	x3, x0
-	bne	.L674
-.L671:
-	.loc 1 910 0
-	ands	w6, w6, 7
-.LVL750:
-	beq	.L675
-	sub	w1, w6, #1
+	bne	.L690
+.L687:
+	.loc 1 1002 0
+	ands	w7, w7, 7
+.LVL763:
+	beq	.L691
+	sub	w1, w7, #1
 	mov	x0, 0
 	add	x1, x1, 1
 	lsl	x1, x1, 2
-	b	.L676
+	b	.L692
 	.p2align 3
-.L802:
+.L795:
 	add	x0, x0, 4
-	.loc 1 911 0
+	.loc 1 1003 0
 	cmp	x1, x0
-	beq	.L675
-.L676:
-.LBB1715:
-	.loc 1 915 0
+	beq	.L691
+.L692:
+.LBB1702:
+	.loc 1 1007 0
 	ldrb	w3, [x4, x0]
 	ldrb	w2, [x5, x0]
 	cmp	w3, w2
-	beq	.L802
-	b	.L670
+	beq	.L795
+	b	.L686
 .L787:
-.LBE1715:
-.LBE1714:
-.LBE1713:
-	.loc 1 1142 0
+.LBE1702:
+.LBE1701:
+.LBE1700:
+	.loc 1 1229 0
 	mov	w0, 2
 	str	w0, [x23, 40]
-	.loc 1 1143 0
-	str	wzr, [x29, 108]
-	ldr	x0, [x24, 208]
-	ldr	w7, [x0, 40]
-	b	.L677
-.LVL751:
-.L783:
-	.loc 1 995 0
-	ldr	x0, [x24, 88]
+	.loc 1 1230 0
+	mov	w24, 0
+	ldr	x0, [x28, 208]
+	ldr	w9, [x0, 40]
+	b	.L693
+.LVL764:
+.L782:
+	.loc 1 1087 0
+	ldr	x0, [x28, 88]
 	adrp	x1, .LC79
 	add	x1, x1, :lo12:.LC79
 	bl	_dev_info
-.LVL752:
-.LBB1716:
-	.loc 1 996 0
-	ldr	w0, [x24, 76]
-	cbz	w0, .L803
-.L628:
-.LVL753:
-.L626:
-.LBE1716:
-	.loc 1 997 0 discriminator 11
-	ldr	x0, [x24, 88]
-.LVL754:
+.LVL765:
+.LBB1703:
+	.loc 1 1088 0
+	ldr	w0, [x28, 76]
+	cbz	w0, .L796
+.L641:
+.LVL766:
+.L639:
+.LBE1703:
+	.loc 1 1089 0 discriminator 11
+	ldr	x0, [x28, 88]
+.LVL767:
 	adrp	x1, .LC80
 	add	x1, x1, :lo12:.LC80
 	bl	_dev_info
-.LVL755:
-	b	.L766
-.L798:
-.LBB1720:
-.LBB1701:
-.LBB1702:
-	.loc 1 1174 0 discriminator 1
+.LVL768:
+	b	.L765
+.LVL769:
+.L794:
+.LBB1707:
+.LBB1697:
+.LBB1698:
+	.loc 1 1261 0 discriminator 1
 	add	x27, x22, 352
-.LBE1702:
+.LBE1698:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL756:
-	b	.L684
+.LVL770:
+	b	.L700
 	.p2align 3
-.L804:
-.LVL757:
-.LBB1703:
-	.loc 1 1174 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L681
-	.loc 1 1174 0 discriminator 7
+.L797:
+.LVL771:
+.LBB1699:
+	.loc 1 1261 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L697
+	.loc 1 1261 0 discriminator 7
 	bl	schedule
-.LVL758:
-.L684:
-	.loc 1 1174 0 discriminator 9
+.LVL772:
+.L700:
+	.loc 1 1261 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x27
 	bl	prepare_to_wait_event
-.LVL759:
-	ldr	w1, [x24, 76]
-	cbz	w1, .L804
-.LBE1703:
-	.loc 1 1174 0 discriminator 4
+.LVL773:
+	ldr	w1, [x28, 76]
+	cbz	w1, .L797
+.LBE1699:
+	.loc 1 1261 0 discriminator 4
 	mov	x0, x27
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL760:
-.LBE1701:
-.LBE1720:
-	.loc 1 1176 0 is_stmt 1 discriminator 4
+.LVL774:
+.LBE1697:
+.LBE1707:
+	.loc 1 1263 0 is_stmt 1 discriminator 4
 	ldr	x2, [x25, #:lo12:jiffies]
-	mov	x0, x28
 	mov	x1, 402653184
+	ldr	x0, [x29, 104]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL761:
-	.loc 1 1177 0 discriminator 4
-	str	wzr, [x24, 76]
-	.loc 1 1179 0 discriminator 4
-	str	x26, [x24, 200]
-	b	.L646
-.LVL762:
+.LVL775:
+	.loc 1 1264 0 discriminator 4
+	str	wzr, [x28, 76]
+	.loc 1 1266 0 discriminator 4
+	str	x26, [x28, 200]
+	b	.L659
+.LVL776:
 	.p2align 3
-.L662:
-.LBB1721:
+.L720:
+	.loc 1 1192 0
+	ldr	x26, [x28, 200]
+.LVL777:
+	.loc 1 1184 0
+	mov	w21, 1
+	.loc 1 1193 0
+	ldr	w0, [x26, 40]
+	cmp	w0, 1
+	bhi	.L685
+.L785:
+	.loc 1 1198 0
+	add	x0, x29, 152
+	str	x0, [x28, 200]
+	.loc 1 1199 0
+	ldr	x0, [x28, 136]
+	str	x0, [x29, 168]
+	b	.L685
+.LVL778:
+	.p2align 3
+.L646:
+	.loc 1 1095 0
+	ldr	w0, [x28, 604]
+	cbz	w0, .L651
+	.loc 1 1108 0
+	ldr	x0, [x28, 200]
+	.loc 1 1106 0
+	str	x23, [x28, 208]
+	.loc 1 1096 0
+	str	w2, [x28, 608]
+	.loc 1 1108 0
+	ldr	w1, [x0, 40]
+	cmp	w1, 1
+	bls	.L798
+	.loc 1 1110 0
+	ldr	x1, [x0, 16]
+	ldrsw	x2, [x28, 20]
+	ldr	x0, [x28, 128]
+	bl	memcpy
+.LVL779:
+	.loc 1 1111 0
+	ldr	x0, [x28, 200]
+	ldrsw	x2, [x28, 20]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x28, 136]
+	bl	memcpy
+.LVL780:
+	.loc 1 1112 0
+	ldr	x0, [x28, 200]
+	ldrsw	x2, [x28, 20]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x28, 144]
+	bl	memcpy
+.LVL781:
+	ldr	x0, [x28, 208]
+.L654:
+.LBB1708:
 .LBB1709:
-	.loc 1 307 0
-	add	w15, w15, 1
-	add	w9, w9, w17
-	cmp	w15, w18
-	ble	.L648
-.L649:
+	.loc 1 374 0
+	ldp	w3, w16, [x0, 48]
+	.loc 1 433 0
+	mov	w15, 234881024
+	.loc 1 375 0
+	ldp	w2, w25, [x0, 56]
+	.loc 1 372 0
+	cmp	w3, 0
+	.loc 1 377 0
+	ldr	w1, [x20, 240]
+	.loc 1 372 0
+	add	w17, w3, 7
+	csel	w17, w17, w3, lt
+	.loc 1 373 0
+	add	w10, w2, 7
+	cmp	w2, 0
+	.loc 1 377 0
+	add	w18, w1, 7
+	.loc 1 373 0
+	csel	w10, w10, w2, lt
+	.loc 1 377 0
+	cmp	w1, 0
+	csel	w18, w18, w1, lt
+	.loc 1 373 0
+	asr	w10, w10, 3
+	.loc 1 377 0
+	asr	w18, w18, 3
+.LVL782:
+	.loc 1 373 0
+	add	w10, w10, 1
+.LVL783:
+	ldr	w1, [x20, 236]
+	.loc 1 380 0
+	cmp	w10, w18
 .LBE1709:
-.LBE1721:
-	.loc 1 1031 0
-	ldr	w0, [x24, 28]
-	cbnz	w0, .L646
-	.loc 1 1034 0
-	ldr	w0, [x24, 184]
-	.loc 1 1032 0
-	mov	w1, 1
-	.loc 1 1033 0
-	str	wzr, [x24, 76]
-	.loc 1 1032 0
-	str	w1, [x24, 28]
-	.loc 1 1034 0
-	cbz	w0, .L805
+.LBE1708:
+	.loc 1 1117 0
+	ldr	x13, [x0, 16]
+.LBB1713:
+.LBB1710:
+	.loc 1 380 0
+	sub	w0, w18, #1
+	csel	w10, w0, w10, ge
+.LVL784:
+	.loc 1 382 0
+	cmp	w1, w25
+	sub	w1, w1, #1
+	.loc 1 439 0
+	mov	w14, -536870912
+	.loc 1 382 0
+	csel	w25, w1, w25, le
+	.loc 1 372 0
+	asr	w17, w17, 3
+.LVL785:
+	mul	w7, w16, w18
+	.loc 1 384 0
+	cmp	w16, w25
+.LBE1710:
+.LBE1713:
+	.loc 1 1117 0
+	ldr	x9, [x28, 128]
+	.loc 1 1118 0
+	ldp	x12, x11, [x28, 144]
+.LBB1714:
+.LBB1711:
+	.loc 1 384 0
+	bgt	.L662
+.LVL786:
+	.p2align 2
+.L745:
+	.loc 1 389 0
+	mov	w5, w17
+	cmp	w17, w10
+	ble	.L746
+	b	.L679
+.LVL787:
+	.p2align 3
 .L663:
-	.loc 1 1036 0
-	mov	x0, x20
-	bl	ebc_lut_update
-.LVL763:
-	cmn	w0, #1
-	beq	.L646
-	.loc 1 1043 0
-	ldr	x0, [x24, 88]
-	adrp	x1, .LC82
-	.loc 1 1040 0
-	ldr	w3, [x24, 96]
-	.loc 1 1043 0
-	add	x1, x1, :lo12:.LC82
-	.loc 1 1040 0
-	strb	w3, [x24, 32]
-.LVL764:
-.L767:
-	.loc 1 1080 0
-	and	w2, w3, 255
-	.loc 1 1078 0
-	lsr	w3, w3, 8
-	strb	w3, [x24, 33]
-	.loc 1 1080 0
-	bl	_dev_info
-.LVL765:
-	.loc 1 1081 0
-	mov	x0, x20
-	bl	ebc_frame_start
-.LVL766:
-	b	.L646
-.LVL767:
+	.loc 1 402 0
+	tst	x2, 65280
+	bne	.L664
+	.loc 1 403 0
+	and	w27, w0, 240
+	cmp	w27, 224
+	beq	.L799
+	.loc 1 406 0
+	orr	w3, w3, 240
+.L664:
+	.loc 1 408 0
+	tst	x2, 16711680
+	bne	.L666
+	.loc 1 409 0
+	and	w27, w0, 3840
+	cmp	w27, 3584
+	beq	.L800
+	.loc 1 412 0
+	orr	w3, w3, 3840
+.L666:
+	.loc 1 414 0
+	tst	x2, 4278190080
+	bne	.L668
+	.loc 1 415 0
+	and	w27, w0, 61440
+	cmp	w27, 57344
+	beq	.L801
+	.loc 1 418 0
+	orr	w3, w3, 61440
+.L668:
+	.loc 1 420 0
+	tst	x2, 1095216660480
+	bne	.L670
+	.loc 1 421 0
+	and	w27, w0, 983040
+	cmp	w27, 917504
+	beq	.L802
+	.loc 1 424 0
+	orr	w3, w3, 983040
+.L670:
+	.loc 1 426 0
+	tst	x2, 280375465082880
+	bne	.L672
+	.loc 1 427 0
+	and	w27, w0, 15728640
+	cmp	w27, 14680064
+	beq	.L803
+	.loc 1 430 0
+	orr	w3, w3, 15728640
+.L672:
+	.loc 1 432 0
+	tst	x2, 71776119061217280
+	bne	.L674
+	.loc 1 433 0
+	and	w27, w0, 251658240
+	cmp	w27, w15
+	beq	.L804
+	.loc 1 436 0
+	orr	w3, w3, 251658240
+.L674:
+	.loc 1 438 0
+	tst	x2, -72057594037927936
+	bne	.L676
+	.loc 1 439 0
+	and	w2, w0, -268435456
+.LVL788:
+	cmp	w2, w14
+	beq	.L805
+	.loc 1 442 0
+	orr	w3, w3, -268435456
+.LVL789:
+.L676:
+	.loc 1 445 0
+	and	w0, w0, w26
+.LVL790:
+	.loc 1 389 0
+	add	w5, w5, 1
+	eor	w0, w0, w4
+	cmp	w5, w10
+	and	w0, w0, w3
+	.loc 1 445 0
+	eor	w0, w4, w0
+	.loc 1 446 0
+	str	w0, [x9, x1]
+	.loc 1 389 0
+	bgt	.L679
+.LVL791:
+.L746:
+	.loc 1 390 0
+	sxtw	x1, w5
+.LVL792:
+	.loc 1 394 0
+	mov	w3, 0
+	.loc 1 393 0
+	lsl	x0, x1, 3
+	.loc 1 390 0
+	lsl	x1, x1, 2
+.LVL793:
+	.loc 1 393 0
+	add	x0, x0, x7, sxtw 3
+	add	x1, x1, x7, sxtw 2
+	ldr	x2, [x11, x0]
+	.loc 1 390 0
+	ldr	w4, [x9, x1]
+	.loc 1 391 0
+	ldr	w0, [x13, x1]
+	.loc 1 396 0
+	and	x27, x2, 255
+	.loc 1 392 0
+	ldr	w26, [x12, x1]
+.LVL794:
+	.loc 1 396 0
+	cbnz	x27, .L663
+.LVL795:
+	.loc 1 397 0
+	and	w3, w0, 15
+.LVL796:
+	cmp	w3, 14
+	.loc 1 400 0
+	mov	w3, 15
+.LVL797:
+	.loc 1 397 0
+	bne	.L663
+	.loc 1 398 0
+	orr	w4, w4, w3
+.LVL798:
+	.loc 1 394 0
+	mov	w3, 0
+.LVL799:
+	b	.L663
+.LVL800:
 	.p2align 3
-.L781:
-	.loc 1 963 0
-	str	wzr, [x24, 608]
-	b	.L616
-.LVL768:
+.L780:
+.LBE1711:
+.LBE1714:
+	.loc 1 1055 0
+	str	wzr, [x28, 608]
+	b	.L629
+.LVL801:
 .L791:
-	.loc 1 1202 0
-	ldr	x0, [x24, 88]
-	.loc 1 1200 0
+	.loc 1 1289 0
+	ldr	x0, [x28, 88]
+	.loc 1 1287 0
 	mov	w25, 1
-	.loc 1 1199 0
-	str	wzr, [x24, 188]
-	.loc 1 1202 0
+.LVL802:
+	.loc 1 1286 0
+	str	wzr, [x28, 188]
+	.loc 1 1289 0
 	adrp	x1, .LC88
-	.loc 1 1200 0
-	str	w25, [x24, 592]
-	.loc 1 1202 0
+	.loc 1 1287 0
+	str	w25, [x28, 592]
+	.loc 1 1289 0
 	add	x1, x1, :lo12:.LC88
-	.loc 1 1201 0
-	str	wzr, [x24, 608]
-	.loc 1 1202 0
+	.loc 1 1288 0
+	str	wzr, [x28, 608]
+	.loc 1 1289 0
 	bl	_dev_info
-.LVL769:
-	.loc 1 1203 0
+.LVL803:
+	.loc 1 1290 0
 	mov	x0, 2
 	bl	ebc_notify
-.LVL770:
-	.loc 1 1204 0
+.LVL804:
+	.loc 1 1291 0
 	mov	w2, w25
 	mov	w1, w25
 	add	x0, x22, 328
 	bl	__wake_up_sync
-.LVL771:
-	b	.L686
-.L638:
-	.loc 1 1008 0
-	ldr	x0, [x24, 88]
-	adrp	x1, .LC81
-	add	x1, x1, :lo12:.LC81
-	bl	_dev_info
-.LVL772:
-	.loc 1 1009 0
+.LVL805:
+	b	.L702
+.L798:
 	mov	x0, x23
-	b	.L765
-.L793:
-	.loc 1 1052 0
-	ldrsw	x2, [x24, 20]
-	mov	w1, 255
-	ldr	x0, [x24, 144]
-	bl	memset
-.LVL773:
-	.loc 1 1054 0
-	ldr	x0, [x24, 200]
-	ldr	w0, [x0, 40]
-	.loc 1 1056 0
-	cmp	w0, 1
-	.loc 1 1054 0
-	ccmp	w0, 18, 4, hi
-	.loc 1 1057 0
-	ldr	x0, [x24, 208]
-	.loc 1 1054 0
-	beq	.L664
-	.loc 1 1057 0
-	ldrsw	x2, [x24, 20]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x24, 128]
-	bl	memcpy
-.LVL774:
-	.loc 1 1058 0
-	ldr	x0, [x24, 200]
-	ldrsw	x2, [x24, 20]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x24, 136]
+	.loc 1 1113 0
+	cbnz	w1, .L654
+	.loc 1 1114 0
+	ldrsw	x2, [x28, 20]
+	ldp	x1, x0, [x28, 136]
 	bl	memcpy
-.LVL775:
-	b	.L666
-.LVL776:
-.L675:
-	.loc 1 1128 0
-	ldr	x0, [x24, 88]
+.LVL806:
+	ldr	x0, [x28, 208]
+	b	.L654
+.L681:
+	.loc 1 1150 0
+	ldr	x1, [x23, 16]
+	mov	x3, x28
+	ldr	x0, [x28, 128]
+	ldr	x2, [x28, 152]
+	bl	refresh_new_image_auto
+.LVL807:
+	b	.L682
+.LVL808:
+.L691:
+	.loc 1 1215 0
+	ldr	x0, [x28, 88]
 	adrp	x1, .LC89
 	add	x1, x1, :lo12:.LC89
 	bl	_dev_info
-.LVL777:
-	.loc 1 1130 0
-	str	x26, [x24, 200]
-	.loc 1 1131 0
-	b	.L646
-.L795:
-	.loc 1 1073 0
-	ldr	x0, [x24, 88]
+.LVL809:
+	.loc 1 1217 0
+	str	x26, [x28, 200]
+	.loc 1 1218 0
+	b	.L659
+.LVL810:
+.L784:
+	.loc 1 1161 0
+	ldr	x0, [x28, 88]
 	adrp	x1, .LC83
 	add	x1, x1, :lo12:.LC83
 	bl	_dev_err
-.LVL778:
-	.loc 1 1074 0
-	b	.L646
-.L794:
-	.loc 1 1071 0
+.LVL811:
+	.loc 1 1162 0
+	b	.L659
+.L783:
+	.loc 1 1159 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.8
-.LVL779:
-	b	.L667
-.L800:
-	.loc 1 1024 0
-	ldrsw	x2, [x24, 20]
-	ldp	x1, x0, [x24, 136]
-	bl	memcpy
-.LVL780:
-	ldr	x0, [x24, 208]
-	b	.L641
-.L803:
-.LBB1722:
-.LBB1717:
-.LBB1718:
-	.loc 1 996 0 discriminator 1
+.LVL812:
+	b	.L683
+.L796:
+.LBB1715:
+.LBB1704:
+.LBB1705:
+	.loc 1 1088 0 discriminator 1
 	add	x26, x22, 352
-.LVL781:
-.LBE1718:
+.LVL813:
+.LBE1705:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL782:
-	b	.L629
+.LVL814:
+	b	.L642
 	.p2align 3
 .L806:
-.LVL783:
-.LBB1719:
-	.loc 1 996 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L626
-	.loc 1 996 0 discriminator 7
+.LVL815:
+.LBB1706:
+	.loc 1 1088 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L639
+	.loc 1 1088 0 discriminator 7
 	bl	schedule
-.LVL784:
-.L629:
-	.loc 1 996 0 discriminator 9
+.LVL816:
+.L642:
+	.loc 1 1088 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x26
 	bl	prepare_to_wait_event
-.LVL785:
-	ldr	w1, [x24, 76]
+.LVL817:
+	ldr	w1, [x28, 76]
 	cbz	w1, .L806
-.LBE1719:
-	.loc 1 996 0 discriminator 4
+.LBE1706:
+	.loc 1 1088 0 discriminator 4
 	mov	x0, x26
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL786:
-	b	.L626
-.LVL787:
-.L775:
-.LBE1717:
-.LBE1722:
-.LBB1723:
-.LBB1724:
+.LVL818:
+	b	.L639
+.LVL819:
+	.p2align 3
+.L803:
+.LBE1704:
+.LBE1715:
+.LBB1716:
+.LBB1712:
+	.loc 1 428 0 is_stmt 1
+	orr	w4, w4, 15728640
+	b	.L672
+	.p2align 3
+.L804:
+	.loc 1 434 0
+	orr	w4, w4, 251658240
+	b	.L674
+	.p2align 3
+.L799:
+	.loc 1 404 0
+	orr	w4, w4, 240
+	b	.L664
+	.p2align 3
+.L800:
+	.loc 1 410 0
+	orr	w4, w4, 3840
+	b	.L666
+	.p2align 3
+.L801:
+	.loc 1 416 0
+	orr	w4, w4, 61440
+	b	.L668
+	.p2align 3
+.L802:
+	.loc 1 422 0
+	orr	w4, w4, 983040
+	b	.L670
+.LVL820:
+	.p2align 3
+.L805:
+	.loc 1 440 0
+	orr	w4, w4, -268435456
+.LVL821:
+	.loc 1 445 0
+	and	w0, w0, w26
+.LVL822:
+	eor	w0, w0, w4
+.LVL823:
+	.loc 1 389 0
+	add	w5, w5, 1
+	and	w0, w0, w3
+	cmp	w5, w10
+	.loc 1 445 0
+	eor	w0, w4, w0
+	.loc 1 446 0
+	str	w0, [x9, x1]
+	.loc 1 389 0
+	ble	.L746
+.LVL824:
+	.p2align 2
+.L679:
+	.loc 1 384 0
+	add	w16, w16, 1
+	add	w7, w7, w18
+	cmp	w16, w25
+	ble	.L745
+.L662:
+.LBE1712:
+.LBE1716:
+	.loc 1 1121 0
+	ldr	w0, [x28, 28]
+	cbnz	w0, .L659
+	.loc 1 1124 0
+	ldr	w0, [x28, 184]
+	.loc 1 1122 0
+	mov	w1, 1
+	.loc 1 1123 0
+	str	wzr, [x28, 76]
+	.loc 1 1122 0
+	str	w1, [x28, 28]
+	.loc 1 1124 0
+	cbz	w0, .L807
+.L680:
+	.loc 1 1126 0
+	mov	x0, x20
+	bl	ebc_lut_update
+.LVL825:
+	cmn	w0, #1
+	beq	.L659
+	.loc 1 1130 0
+	ldr	w3, [x28, 96]
+	.loc 1 1133 0
+	adrp	x1, .LC82
+	.loc 1 1130 0
+	strb	w3, [x28, 32]
+	.loc 1 1133 0
+	add	x1, x1, :lo12:.LC82
+	ldr	x0, [x28, 88]
+	b	.L766
+.LVL826:
+.L651:
+	.loc 1 1099 0
+	ldr	x0, [x28, 88]
+	adrp	x1, .LC81
+	add	x1, x1, :lo12:.LC81
+	bl	_dev_info
+.LVL827:
+	.loc 1 1100 0
+	mov	x0, x23
+	b	.L764
+.LVL828:
+.L774:
+.LBB1717:
+.LBB1718:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.4
-.LVL788:
-	b	.L613
-.L799:
-.LBE1724:
-.LBE1723:
-	.loc 1 1020 0 is_stmt 1
-	ldr	x1, [x0, 16]
-	ldrsw	x2, [x24, 20]
-	ldr	x0, [x24, 128]
-	bl	memcpy
-.LVL789:
-	.loc 1 1021 0
-	ldr	x0, [x24, 200]
-	ldrsw	x2, [x24, 20]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x24, 136]
-	bl	memcpy
-.LVL790:
-	.loc 1 1022 0
-	ldr	x0, [x24, 200]
-	ldrsw	x2, [x24, 20]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x24, 144]
-	bl	memcpy
-.LVL791:
-	ldr	x0, [x24, 208]
-	b	.L641
-.LVL792:
-.L805:
-	.loc 1 1035 0
+.LVL829:
+	b	.L626
+.LVL830:
+.L807:
+.LBE1718:
+.LBE1717:
+	.loc 1 1125 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.8
-.LVL793:
-	b	.L663
-.LVL794:
-.L782:
-	.loc 1 980 0
+.LVL831:
+	b	.L680
+.LVL832:
+.L781:
+	.loc 1 1072 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.8
-.LVL795:
-	b	.L621
-.L776:
-	.loc 1 1237 0
+.LVL833:
+	b	.L634
+.LVL834:
+.L775:
+	.loc 1 1324 0
 	bl	__stack_chk_fail
-.LVL796:
+.LVL835:
 	.cfi_endproc
-.LFE2819:
+.LFE2820:
 	.size	ebc_thread, .-ebc_thread
 	.data
 	.align	3
@@ -8688,24 +8934,24 @@ ebc_auto_task:
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.34848, %object
-	.size	__func__.34848, 11
-__func__.34848:
+	.type	__func__.34862, %object
+	.size	__func__.34862, 11
+__func__.34862:
 	.string	"ebc_io_ctl"
 	.align	3
 	.set	.LANCHOR3,. + 0
-	.type	__func__.34649, %object
-	.size	__func__.34649, 16
-__func__.34649:
+	.type	__func__.34667, %object
+	.size	__func__.34667, 16
+__func__.34667:
 	.string	"ebc_frame_start"
-	.type	__func__.35115, %object
-	.size	__func__.35115, 12
-__func__.35115:
+	.type	__func__.35129, %object
+	.size	__func__.35129, 12
+__func__.35129:
 	.string	"ebc_suspend"
 	.zero	4
-	.type	__func__.35056, %object
-	.size	__func__.35056, 19
-__func__.35056:
+	.type	__func__.35070, %object
+	.size	__func__.35070, 19
+__func__.35070:
 	.string	"ebc_lut_table_init"
 	.zero	5
 	.type	ebc_match, %object
@@ -8736,9 +8982,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init2107, %object
-	.size	__addressable_ebc_init2107, 8
-__addressable_ebc_init2107:
+	.type	__addressable_ebc_init2194, %object
+	.size	__addressable_ebc_init2194, 8
+__addressable_ebc_init2194:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -8793,7 +9039,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC15:
-	.string	"2.01"
+	.string	"2.02"
 	.zero	3
 .LC16:
 	.string	"%s\n"
@@ -9226,7 +9472,7 @@ __exitcall_ebc_exit:
 	.file 212 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x13d5d
+	.4byte	0x13e39
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
@@ -9235,7 +9481,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.4byte	.LASF3278
 	.4byte	.LASF3279
-	.4byte	.Ldebug_ranges0+0x1030
+	.4byte	.Ldebug_ranges0+0xfc0
 	.8byte	0
 	.4byte	.Ldebug_line0
 	.uleb128 0x2
@@ -26766,7 +27012,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x3
 	.4byte	0x91f9
 	.uleb128 0x46
-	.4byte	.LASF3018
+	.4byte	.LASF3017
 	.byte	0x1f
 	.2byte	0xba2
 	.4byte	0x9209
@@ -31235,121 +31481,121 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2396
 	.byte	0xa
 	.byte	0x85
-	.4byte	0xdc1b
+	.4byte	0xdc15
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF2397
 	.byte	0xa
 	.byte	0x88
-	.4byte	0xdc40
+	.4byte	0xdc3a
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF108
 	.byte	0xa
 	.byte	0x8b
-	.4byte	0xdc6e
+	.4byte	0xdc68
 	.byte	0x10
 	.uleb128 0xe
 	.4byte	.LASF2398
 	.byte	0xa
 	.byte	0x8f
-	.4byte	0xdca2
+	.4byte	0xdc9c
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF2399
 	.byte	0xa
 	.byte	0x92
-	.4byte	0xdcd0
+	.4byte	0xdcca
 	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF2400
 	.byte	0xa
 	.byte	0x96
-	.4byte	0xdcf5
+	.4byte	0xdcef
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF2401
 	.byte	0xa
 	.byte	0x9d
-	.4byte	0xdd1e
+	.4byte	0xdd18
 	.byte	0x30
 	.uleb128 0xe
 	.4byte	.LASF2402
 	.byte	0xa
 	.byte	0xa0
-	.4byte	0xdd43
+	.4byte	0xdd3d
 	.byte	0x38
 	.uleb128 0xe
 	.4byte	.LASF2403
 	.byte	0xa
 	.byte	0xa4
-	.4byte	0xdd6c
+	.4byte	0xdd66
 	.byte	0x40
 	.uleb128 0xe
 	.4byte	.LASF2404
 	.byte	0xa
 	.byte	0xa7
-	.4byte	0xdcf5
+	.4byte	0xdcef
 	.byte	0x48
 	.uleb128 0xe
 	.4byte	.LASF2405
 	.byte	0xa
 	.byte	0xaa
-	.4byte	0xdd8c
+	.4byte	0xdd86
 	.byte	0x50
 	.uleb128 0xe
 	.4byte	.LASF2406
 	.byte	0xa
 	.byte	0xad
-	.4byte	0xdd8c
+	.4byte	0xdd86
 	.byte	0x58
 	.uleb128 0xe
 	.4byte	.LASF2407
 	.byte	0xa
 	.byte	0xb0
-	.4byte	0xddac
+	.4byte	0xdda6
 	.byte	0x60
 	.uleb128 0xe
 	.4byte	.LASF2408
 	.byte	0xa
 	.byte	0xb3
-	.4byte	0xddac
+	.4byte	0xdda6
 	.byte	0x68
 	.uleb128 0xe
 	.4byte	.LASF2409
 	.byte	0xa
 	.byte	0xb6
-	.4byte	0xddcc
+	.4byte	0xddc6
 	.byte	0x70
 	.uleb128 0xe
 	.4byte	.LASF2410
 	.byte	0xa
 	.byte	0xb8
-	.4byte	0xdde6
+	.4byte	0xdde0
 	.byte	0x78
 	.uleb128 0xe
 	.4byte	.LASF2411
 	.byte	0xa
 	.byte	0xb9
-	.4byte	0xde00
+	.4byte	0xddfa
 	.byte	0x80
 	.uleb128 0xe
 	.4byte	.LASF2412
 	.byte	0xa
 	.byte	0xba
-	.4byte	0xde00
+	.4byte	0xddfa
 	.byte	0x88
 	.uleb128 0xe
 	.4byte	.LASF2413
 	.byte	0xa
 	.byte	0xbb
-	.4byte	0xde29
+	.4byte	0xde23
 	.byte	0x90
 	.uleb128 0xe
 	.4byte	.LASF2414
 	.byte	0xa
 	.byte	0xbd
-	.4byte	0xde44
+	.4byte	0xde3e
 	.byte	0x98
 	.uleb128 0xe
 	.4byte	.LASF129
@@ -35435,7 +35681,7 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0xc4
 	.byte	0x3b
-	.4byte	0xd9c9
+	.4byte	0xd9c3
 	.uleb128 0xc
 	.4byte	.LASF2871
 	.byte	0
@@ -35493,89 +35739,86 @@ __exitcall_ebc_exit:
 	.uleb128 0xc
 	.4byte	.LASF2889
 	.byte	0x12
-	.uleb128 0xc
-	.4byte	.LASF2890
-	.byte	0x13
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2891
+	.4byte	.LASF2890
 	.byte	0x2c
 	.byte	0xc4
-	.byte	0x55
-	.4byte	0xda5a
+	.byte	0x54
+	.4byte	0xda54
 	.uleb128 0xe
 	.4byte	.LASF881
 	.byte	0xc4
-	.byte	0x56
+	.byte	0x55
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2892
+	.4byte	.LASF2891
 	.byte	0xc4
-	.byte	0x57
+	.byte	0x56
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF2893
+	.4byte	.LASF2892
 	.byte	0xc4
-	.byte	0x58
+	.byte	0x57
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF261
 	.byte	0xc4
-	.byte	0x59
+	.byte	0x58
 	.4byte	0xc6
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF2894
+	.4byte	.LASF2893
 	.byte	0xc4
-	.byte	0x5a
+	.byte	0x59
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
 	.4byte	.LASF2866
 	.byte	0xc4
-	.byte	0x5b
+	.byte	0x5a
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
 	.4byte	.LASF2867
 	.byte	0xc4
-	.byte	0x5c
+	.byte	0x5b
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF2868
 	.byte	0xc4
-	.byte	0x5d
+	.byte	0x5c
 	.4byte	0xc6
 	.byte	0x1c
 	.uleb128 0xe
 	.4byte	.LASF2869
 	.byte	0xc4
-	.byte	0x5e
+	.byte	0x5d
 	.4byte	0xc6
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2895
+	.4byte	.LASF2894
 	.byte	0xc4
-	.byte	0x5f
+	.byte	0x5e
 	.4byte	0xc6
 	.byte	0x24
 	.uleb128 0xe
-	.4byte	.LASF2896
+	.4byte	.LASF2895
 	.byte	0xc4
-	.byte	0x60
+	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x28
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2897
+	.4byte	.LASF2896
 	.byte	0x50
 	.byte	0x3
 	.byte	0x10
-	.4byte	0xdad3
+	.4byte	0xdacd
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x3
@@ -35583,134 +35826,134 @@ __exitcall_ebc_exit:
 	.4byte	0xa545
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2898
+	.4byte	.LASF2897
 	.byte	0x3
 	.byte	0x12
 	.4byte	0x47ad
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2899
+	.4byte	.LASF2898
 	.byte	0x3
 	.byte	0x13
 	.4byte	0x443
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2900
+	.4byte	.LASF2899
 	.byte	0x3
 	.byte	0x14
-	.4byte	0xdae9
+	.4byte	0xdae3
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2901
+	.4byte	.LASF2900
 	.byte	0x3
 	.byte	0x15
-	.4byte	0xdafa
+	.4byte	0xdaf4
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2902
+	.4byte	.LASF2901
 	.byte	0x3
 	.byte	0x16
-	.4byte	0xdafa
+	.4byte	0xdaf4
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2903
+	.4byte	.LASF2902
 	.byte	0x3
 	.byte	0x17
-	.4byte	0xdb14
+	.4byte	0xdb0e
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2904
+	.4byte	.LASF2903
 	.byte	0x3
 	.byte	0x18
-	.4byte	0xdb29
+	.4byte	0xdb23
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2905
+	.4byte	.LASF2904
 	.byte	0x3
 	.byte	0x19
-	.4byte	0xdb43
+	.4byte	0xdb3d
 	.byte	0x48
 	.byte	0
 	.uleb128 0x10
-	.4byte	0xdae3
+	.4byte	0xdadd
 	.uleb128 0x11
-	.4byte	0xdae3
+	.4byte	0xdadd
 	.uleb128 0x11
 	.4byte	0x29b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xda5a
+	.4byte	0xda54
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdad3
+	.4byte	0xdacd
 	.uleb128 0x10
-	.4byte	0xdafa
+	.4byte	0xdaf4
 	.uleb128 0x11
-	.4byte	0xdae3
+	.4byte	0xdadd
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdaef
+	.4byte	0xdae9
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdb14
+	.4byte	0xdb0e
 	.uleb128 0x11
-	.4byte	0xdae3
+	.4byte	0xdadd
 	.uleb128 0x11
 	.4byte	0x4653
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb00
+	.4byte	0xdafa
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdb29
+	.4byte	0xdb23
 	.uleb128 0x11
-	.4byte	0xdae3
+	.4byte	0xdadd
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb1a
+	.4byte	0xdb14
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdb43
+	.4byte	0xdb3d
 	.uleb128 0x11
-	.4byte	0xdae3
+	.4byte	0xdadd
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb2f
+	.4byte	0xdb29
 	.uleb128 0x1f
-	.4byte	.LASF2906
+	.4byte	.LASF2905
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc5
 	.byte	0x5
-	.4byte	0xdb72
+	.4byte	0xdb6c
 	.uleb128 0xc
-	.4byte	.LASF2907
+	.4byte	.LASF2906
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2908
+	.4byte	.LASF2907
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2909
+	.4byte	.LASF2908
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2910
+	.4byte	.LASF2909
 	.byte	0x3
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2911
+	.4byte	.LASF2910
 	.byte	0x20
 	.byte	0xc6
 	.byte	0xb
-	.4byte	0xdbbb
+	.4byte	0xdbb5
 	.uleb128 0xe
-	.4byte	.LASF2912
+	.4byte	.LASF2911
 	.byte	0xc6
 	.byte	0xc
 	.4byte	0x29
@@ -35728,38 +35971,38 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF2913
+	.4byte	.LASF2912
 	.byte	0xc6
 	.byte	0xf
 	.4byte	0x310
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2914
+	.4byte	.LASF2913
 	.byte	0xc6
 	.byte	0x11
 	.4byte	0x6d
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2915
+	.4byte	.LASF2914
 	.byte	0x10
 	.byte	0xc6
 	.byte	0x2a
-	.4byte	0xdbec
+	.4byte	0xdbe6
 	.uleb128 0x20
 	.string	"sgl"
 	.byte	0xc6
 	.byte	0x2b
-	.4byte	0xdbec
+	.4byte	0xdbe6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2916
+	.4byte	.LASF2915
 	.byte	0xc6
 	.byte	0x2c
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2917
+	.4byte	.LASF2916
 	.byte	0xc6
 	.byte	0x2d
 	.4byte	0x6d
@@ -35767,16 +36010,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb72
+	.4byte	0xdb6c
 	.uleb128 0x14
 	.4byte	0x443
-	.4byte	0xdc15
+	.4byte	0xdc0f
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdc15
+	.4byte	0xdc0f
 	.uleb128 0x11
 	.4byte	0x31b
 	.uleb128 0x11
@@ -35787,9 +36030,9 @@ __exitcall_ebc_exit:
 	.4byte	0x310
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdbf2
+	.4byte	0xdbec
 	.uleb128 0x10
-	.4byte	0xdc40
+	.4byte	0xdc3a
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -35803,10 +36046,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc21
+	.4byte	0xdc1b
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdc6e
+	.4byte	0xdc68
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -35822,14 +36065,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc46
+	.4byte	0xdc40
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdc9c
+	.4byte	0xdc96
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
-	.4byte	0xdc9c
+	.4byte	0xdc96
 	.uleb128 0x11
 	.4byte	0x443
 	.uleb128 0x11
@@ -35841,13 +36084,13 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdbbb
+	.4byte	0xdbb5
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc74
+	.4byte	0xdc6e
 	.uleb128 0x14
 	.4byte	0x310
-	.4byte	0xdcd0
+	.4byte	0xdcca
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -35857,15 +36100,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdb49
+	.4byte	0xdb43
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdca8
+	.4byte	0xdca2
 	.uleb128 0x10
-	.4byte	0xdcf5
+	.4byte	0xdcef
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -35873,49 +36116,49 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdb49
+	.4byte	0xdb43
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdcd6
+	.4byte	0xdcd0
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdd1e
+	.4byte	0xdd18
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
-	.4byte	0xdbec
+	.4byte	0xdbe6
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdb49
+	.4byte	0xdb43
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdcfb
+	.4byte	0xdcf5
 	.uleb128 0x10
-	.4byte	0xdd43
+	.4byte	0xdd3d
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
-	.4byte	0xdbec
+	.4byte	0xdbe6
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdb49
+	.4byte	0xdb43
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd24
+	.4byte	0xdd1e
 	.uleb128 0x14
 	.4byte	0x310
-	.4byte	0xdd6c
+	.4byte	0xdd66
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -35923,15 +36166,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdb49
+	.4byte	0xdb43
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd49
+	.4byte	0xdd43
 	.uleb128 0x10
-	.4byte	0xdd8c
+	.4byte	0xdd86
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -35939,27 +36182,27 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdb49
+	.4byte	0xdb43
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd72
+	.4byte	0xdd6c
 	.uleb128 0x10
-	.4byte	0xddac
+	.4byte	0xdda6
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
-	.4byte	0xdbec
+	.4byte	0xdbe6
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdb49
+	.4byte	0xdb43
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd92
+	.4byte	0xdd8c
 	.uleb128 0x10
-	.4byte	0xddcc
+	.4byte	0xddc6
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -35967,14 +36210,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdb49
+	.4byte	0xdb43
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xddb2
+	.4byte	0xddac
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdde6
+	.4byte	0xdde0
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -35982,10 +36225,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xddd2
+	.4byte	0xddcc
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xde00
+	.4byte	0xddfa
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -35993,10 +36236,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xddec
+	.4byte	0xdde6
 	.uleb128 0x14
 	.4byte	0x443
-	.4byte	0xde29
+	.4byte	0xde23
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -36010,9 +36253,9 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde06
+	.4byte	0xde00
 	.uleb128 0x10
-	.4byte	0xde44
+	.4byte	0xde3e
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -36022,58 +36265,58 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde2f
+	.4byte	0xde29
 	.uleb128 0x19
-	.4byte	.LASF2918
+	.4byte	.LASF2917
 	.byte	0xa
 	.byte	0xc9
 	.4byte	0xb789
 	.uleb128 0x19
-	.4byte	.LASF2919
+	.4byte	.LASF2918
 	.byte	0xa
 	.byte	0xca
 	.4byte	0xb789
 	.uleb128 0x19
-	.4byte	.LASF2920
+	.4byte	.LASF2919
 	.byte	0xa
 	.byte	0xcb
 	.4byte	0xb789
 	.uleb128 0x24
-	.4byte	.LASF2921
+	.4byte	.LASF2920
 	.uleb128 0x19
-	.4byte	.LASF2922
+	.4byte	.LASF2921
 	.byte	0xc7
 	.byte	0x7
-	.4byte	0xde7b
+	.4byte	0xde75
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde6b
+	.4byte	0xde65
 	.uleb128 0x24
-	.4byte	.LASF2923
+	.4byte	.LASF2922
 	.uleb128 0x19
-	.4byte	.LASF2924
+	.4byte	.LASF2923
 	.byte	0xc7
 	.byte	0x8
-	.4byte	0xde91
+	.4byte	0xde8b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde81
+	.4byte	0xde7b
 	.uleb128 0x19
-	.4byte	.LASF2925
+	.4byte	.LASF2924
 	.byte	0xc7
 	.byte	0x16
 	.4byte	0xb78e
 	.uleb128 0x19
-	.4byte	.LASF2926
+	.4byte	.LASF2925
 	.byte	0xc8
 	.byte	0x1b
 	.4byte	0xb789
 	.uleb128 0xd
-	.4byte	.LASF2927
+	.4byte	.LASF2926
 	.byte	0x18
 	.byte	0xc9
 	.byte	0xf
-	.4byte	0xdede
+	.4byte	0xded8
 	.uleb128 0xe
 	.4byte	.LASF2863
 	.byte	0xc9
@@ -36094,11 +36337,11 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2928
+	.4byte	.LASF2927
 	.byte	0xa0
 	.byte	0xc9
 	.byte	0x15
-	.4byte	0xe022
+	.4byte	0xe01c
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xc9
@@ -36106,25 +36349,25 @@ __exitcall_ebc_exit:
 	.4byte	0xa545
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2929
+	.4byte	.LASF2928
 	.byte	0xc9
 	.byte	0x17
-	.4byte	0xe0e3
+	.4byte	0xe0dd
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2930
+	.4byte	.LASF2929
 	.byte	0xc9
 	.byte	0x18
-	.4byte	0xdae3
+	.4byte	0xdadd
 	.byte	0x10
 	.uleb128 0x20
 	.string	"fb"
 	.byte	0xc9
 	.byte	0x19
-	.4byte	0xe0e9
+	.4byte	0xe0e3
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2931
+	.4byte	.LASF2930
 	.byte	0xc9
 	.byte	0x1a
 	.4byte	0xc6
@@ -36136,43 +36379,43 @@ __exitcall_ebc_exit:
 	.4byte	0x13a
 	.byte	0x4c
 	.uleb128 0xe
-	.4byte	.LASF2893
+	.4byte	.LASF2892
 	.byte	0xc9
 	.byte	0x1d
 	.4byte	0x13a
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2932
+	.4byte	.LASF2931
 	.byte	0xc9
 	.byte	0x1e
 	.4byte	0x13a
 	.byte	0x54
 	.uleb128 0xe
-	.4byte	.LASF2933
+	.4byte	.LASF2932
 	.byte	0xc9
 	.byte	0x1f
 	.4byte	0x13a
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2895
+	.4byte	.LASF2894
 	.byte	0xc9
 	.byte	0x20
 	.4byte	0x13a
 	.byte	0x5c
 	.uleb128 0xe
-	.4byte	.LASF2896
+	.4byte	.LASF2895
 	.byte	0xc9
 	.byte	0x21
 	.4byte	0x13a
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2934
+	.4byte	.LASF2933
 	.byte	0xc9
 	.byte	0x22
 	.4byte	0x13a
 	.byte	0x64
 	.uleb128 0xe
-	.4byte	.LASF2935
+	.4byte	.LASF2934
 	.byte	0xc9
 	.byte	0x23
 	.4byte	0x13a
@@ -36202,13 +36445,13 @@ __exitcall_ebc_exit:
 	.4byte	0x13a
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2936
+	.4byte	.LASF2935
 	.byte	0xc9
 	.byte	0x28
 	.4byte	0x13a
 	.byte	0x7c
 	.uleb128 0xe
-	.4byte	.LASF2937
+	.4byte	.LASF2936
 	.byte	0xc9
 	.byte	0x29
 	.4byte	0x13a
@@ -36238,30 +36481,30 @@ __exitcall_ebc_exit:
 	.4byte	0x13a
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2938
+	.4byte	.LASF2937
 	.byte	0xc9
 	.byte	0x2e
 	.4byte	0x13a
 	.byte	0x94
 	.uleb128 0xe
-	.4byte	.LASF2894
+	.4byte	.LASF2893
 	.byte	0xc9
 	.byte	0x2f
 	.4byte	0x13a
 	.byte	0x98
 	.uleb128 0xe
-	.4byte	.LASF2939
+	.4byte	.LASF2938
 	.byte	0xc9
 	.byte	0x30
 	.4byte	0x13a
 	.byte	0x9c
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2940
+	.4byte	.LASF2939
 	.byte	0x70
 	.byte	0xb
 	.byte	0x17
-	.4byte	0xe0e3
+	.4byte	0xe0dd
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xb
@@ -36269,7 +36512,7 @@ __exitcall_ebc_exit:
 	.4byte	0xa545
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2941
+	.4byte	.LASF2940
 	.byte	0xb
 	.byte	0x19
 	.4byte	0x443
@@ -36287,67 +36530,67 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2942
+	.4byte	.LASF2941
 	.byte	0xb
 	.byte	0x1d
-	.4byte	0xe0fe
+	.4byte	0xe0f8
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2943
+	.4byte	.LASF2942
 	.byte	0xb
 	.byte	0x1e
-	.4byte	0xe0fe
+	.4byte	0xe0f8
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2944
+	.4byte	.LASF2943
 	.byte	0xb
 	.byte	0x1f
-	.4byte	0xe109
+	.4byte	0xe103
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2945
+	.4byte	.LASF2944
 	.byte	0xb
 	.byte	0x21
-	.4byte	0xe129
+	.4byte	0xe123
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2946
+	.4byte	.LASF2945
 	.byte	0xb
 	.byte	0x22
-	.4byte	0xe13a
+	.4byte	0xe134
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2947
+	.4byte	.LASF2946
 	.byte	0xb
 	.byte	0x23
-	.4byte	0xe15f
+	.4byte	0xe159
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2948
+	.4byte	.LASF2947
 	.byte	0xb
 	.byte	0x24
-	.4byte	0xe17a
+	.4byte	0xe174
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2949
+	.4byte	.LASF2948
 	.byte	0xb
 	.byte	0x25
-	.4byte	0xe190
+	.4byte	0xe18a
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2950
+	.4byte	.LASF2949
 	.byte	0xb
 	.byte	0x26
-	.4byte	0xe1b4
+	.4byte	0xe1ae
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2951
+	.4byte	.LASF2950
 	.byte	0xb
 	.byte	0x27
-	.4byte	0xe1ca
+	.4byte	0xe1c4
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2952
+	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x29
 	.4byte	0x4a2
@@ -36355,10 +36598,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe022
+	.4byte	0xe01c
 	.uleb128 0x5
-	.4byte	0xdead
-	.4byte	0xe0f9
+	.4byte	0xdea7
+	.4byte	0xe0f3
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
@@ -36367,38 +36610,38 @@ __exitcall_ebc_exit:
 	.string	"clk"
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe0f9
+	.4byte	0xe0f3
 	.uleb128 0x24
-	.4byte	.LASF2953
+	.4byte	.LASF2952
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe104
+	.4byte	0xe0fe
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xe123
+	.4byte	0xe11d
 	.uleb128 0x11
-	.4byte	0xe0e3
+	.4byte	0xe0dd
 	.uleb128 0x11
-	.4byte	0xe123
+	.4byte	0xe11d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdede
+	.4byte	0xded8
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe10f
+	.4byte	0xe109
 	.uleb128 0x10
-	.4byte	0xe13a
+	.4byte	0xe134
 	.uleb128 0x11
-	.4byte	0xe0e3
+	.4byte	0xe0dd
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe12f
+	.4byte	0xe129
 	.uleb128 0x10
-	.4byte	0xe15f
+	.4byte	0xe159
 	.uleb128 0x11
-	.4byte	0xe0e3
+	.4byte	0xe0dd
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -36410,11 +36653,11 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe140
+	.4byte	0xe13a
 	.uleb128 0x10
-	.4byte	0xe17a
+	.4byte	0xe174
 	.uleb128 0x11
-	.4byte	0xe0e3
+	.4byte	0xe0dd
 	.uleb128 0x11
 	.4byte	0x13a
 	.uleb128 0x11
@@ -36422,22 +36665,22 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe165
+	.4byte	0xe15f
 	.uleb128 0x10
-	.4byte	0xe190
+	.4byte	0xe18a
 	.uleb128 0x11
-	.4byte	0xe0e3
+	.4byte	0xe0dd
 	.uleb128 0x11
 	.4byte	0x13a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe180
+	.4byte	0xe17a
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xe1b4
+	.4byte	0xe1ae
 	.uleb128 0x11
-	.4byte	0xe0e3
+	.4byte	0xe0dd
 	.uleb128 0x11
 	.4byte	0x3548
 	.uleb128 0x11
@@ -36447,97 +36690,97 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe196
+	.4byte	0xe190
 	.uleb128 0x10
-	.4byte	0xe1ca
+	.4byte	0xe1c4
 	.uleb128 0x11
-	.4byte	0xe0e3
+	.4byte	0xe0dd
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1ba
+	.4byte	0xe1b4
 	.uleb128 0x26
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.2byte	0x268
 	.byte	0x1
 	.byte	0x33
-	.4byte	0xe3ec
+	.4byte	0xe3e6
 	.uleb128 0xe
-	.4byte	.LASF2955
+	.4byte	.LASF2954
 	.byte	0x1
 	.byte	0x34
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2956
+	.4byte	.LASF2955
 	.byte	0x1
 	.byte	0x35
 	.4byte	0x219
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2957
+	.4byte	.LASF2956
 	.byte	0x1
 	.byte	0x36
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2958
+	.4byte	.LASF2957
 	.byte	0x1
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2959
+	.4byte	.LASF2958
 	.byte	0x1
 	.byte	0x38
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2960
+	.4byte	.LASF2959
 	.byte	0x1
 	.byte	0x39
 	.4byte	0xc6
 	.byte	0x1c
 	.uleb128 0xe
-	.4byte	.LASF2961
+	.4byte	.LASF2960
 	.byte	0x1
 	.byte	0x3a
 	.4byte	0x61
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2962
+	.4byte	.LASF2961
 	.byte	0x1
 	.byte	0x3b
 	.4byte	0x61
 	.byte	0x21
 	.uleb128 0xe
-	.4byte	.LASF2963
+	.4byte	.LASF2962
 	.byte	0x1
 	.byte	0x3c
 	.4byte	0xc6
 	.byte	0x24
 	.uleb128 0xe
-	.4byte	.LASF2964
+	.4byte	.LASF2963
 	.byte	0x1
 	.byte	0x3d
 	.4byte	0xc6
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2965
+	.4byte	.LASF2964
 	.byte	0x1
 	.byte	0x3e
 	.4byte	0xc6
 	.byte	0x2c
 	.uleb128 0xe
-	.4byte	.LASF2966
+	.4byte	.LASF2965
 	.byte	0x1
 	.byte	0x3f
 	.4byte	0xc6
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2893
+	.4byte	.LASF2892
 	.byte	0x1
 	.byte	0x40
 	.4byte	0xc6
@@ -36549,25 +36792,25 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2967
+	.4byte	.LASF2966
 	.byte	0x1
 	.byte	0x42
 	.4byte	0x4653
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2968
+	.4byte	.LASF2967
 	.byte	0x1
 	.byte	0x43
 	.4byte	0xc6
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2969
+	.4byte	.LASF2968
 	.byte	0x1
 	.byte	0x44
 	.4byte	0xc6
 	.byte	0x4c
 	.uleb128 0xe
-	.4byte	.LASF2970
+	.4byte	.LASF2969
 	.byte	0x1
 	.byte	0x45
 	.4byte	0xc6
@@ -36579,145 +36822,145 @@ __exitcall_ebc_exit:
 	.4byte	0xa545
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2971
+	.4byte	.LASF2970
 	.byte	0x1
 	.byte	0x47
 	.4byte	0xd85b
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2972
+	.4byte	.LASF2971
 	.byte	0x1
 	.byte	0x48
 	.4byte	0x2eda
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2973
+	.4byte	.LASF2972
 	.byte	0x1
 	.byte	0x4a
 	.4byte	0x4653
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF2974
+	.4byte	.LASF2973
 	.byte	0x1
 	.byte	0x4b
 	.4byte	0x4653
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF2975
+	.4byte	.LASF2974
 	.byte	0x1
 	.byte	0x4c
 	.4byte	0x4653
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2976
+	.4byte	.LASF2975
 	.byte	0x1
 	.byte	0x4e
 	.4byte	0xc097
 	.byte	0x98
 	.uleb128 0xe
-	.4byte	.LASF2977
+	.4byte	.LASF2976
 	.byte	0x1
 	.byte	0x4f
 	.4byte	0xc097
 	.byte	0xa0
 	.uleb128 0xe
-	.4byte	.LASF2978
+	.4byte	.LASF2977
 	.byte	0x1
 	.byte	0x50
-	.4byte	0xe3ec
+	.4byte	0xe3e6
 	.byte	0xa8
 	.uleb128 0xe
-	.4byte	.LASF2979
+	.4byte	.LASF2978
 	.byte	0x1
 	.byte	0x51
 	.4byte	0xc6
 	.byte	0xb8
 	.uleb128 0xe
-	.4byte	.LASF2980
+	.4byte	.LASF2979
 	.byte	0x1
 	.byte	0x52
 	.4byte	0xc6
 	.byte	0xbc
 	.uleb128 0xe
-	.4byte	.LASF2981
+	.4byte	.LASF2980
 	.byte	0x1
 	.byte	0x53
 	.4byte	0x219
 	.byte	0xc0
 	.uleb128 0xe
-	.4byte	.LASF2982
+	.4byte	.LASF2981
 	.byte	0x1
 	.byte	0x54
-	.4byte	0xe3fc
+	.4byte	0xe3f6
 	.byte	0xc8
 	.uleb128 0xe
-	.4byte	.LASF2983
+	.4byte	.LASF2982
 	.byte	0x1
 	.byte	0x55
-	.4byte	0xe3fc
+	.4byte	0xe3f6
 	.byte	0xd0
 	.uleb128 0xe
-	.4byte	.LASF2984
+	.4byte	.LASF2983
 	.byte	0x1
 	.byte	0x57
 	.4byte	0xd7d1
 	.byte	0xd8
 	.uleb128 0x27
-	.4byte	.LASF2985
+	.4byte	.LASF2984
 	.byte	0x1
 	.byte	0x58
 	.4byte	0xc6
 	.2byte	0x1a8
 	.uleb128 0x27
-	.4byte	.LASF2986
+	.4byte	.LASF2985
 	.byte	0x1
 	.byte	0x5a
 	.4byte	0xc6
 	.2byte	0x1ac
 	.uleb128 0x27
-	.4byte	.LASF2987
+	.4byte	.LASF2986
 	.byte	0x1
 	.byte	0x5c
 	.4byte	0x3147
 	.2byte	0x1b0
 	.uleb128 0x27
-	.4byte	.LASF2988
+	.4byte	.LASF2987
 	.byte	0x1
 	.byte	0x5f
 	.4byte	0x3147
 	.2byte	0x1e8
 	.uleb128 0x27
-	.4byte	.LASF2989
+	.4byte	.LASF2988
 	.byte	0x1
 	.byte	0x62
 	.4byte	0x31e0
 	.2byte	0x220
 	.uleb128 0x27
-	.4byte	.LASF2990
+	.4byte	.LASF2989
 	.byte	0x1
 	.byte	0x65
 	.4byte	0xc6
 	.2byte	0x250
 	.uleb128 0x27
-	.4byte	.LASF2991
+	.4byte	.LASF2990
 	.byte	0x1
 	.byte	0x67
 	.4byte	0xc6
 	.2byte	0x254
 	.uleb128 0x27
-	.4byte	.LASF2992
+	.4byte	.LASF2991
 	.byte	0x1
 	.byte	0x69
 	.4byte	0xc6
 	.2byte	0x258
 	.uleb128 0x27
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
 	.byte	0x6b
 	.4byte	0xc6
 	.2byte	0x25c
 	.uleb128 0x27
-	.4byte	.LASF2994
+	.4byte	.LASF2993
 	.byte	0x1
 	.byte	0x6c
 	.4byte	0xc6
@@ -36725,7 +36968,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x443
-	.4byte	0xe3fc
+	.4byte	0xe3f6
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
@@ -36738,7 +36981,7 @@ __exitcall_ebc_exit:
 	.2byte	0x320
 	.byte	0x1
 	.byte	0x6f
-	.4byte	0xe44c
+	.4byte	0xe446
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x1
@@ -36746,43 +36989,43 @@ __exitcall_ebc_exit:
 	.4byte	0xa545
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2929
+	.4byte	.LASF2928
 	.byte	0x1
 	.byte	0x71
-	.4byte	0xe0e3
+	.4byte	0xe0dd
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2930
+	.4byte	.LASF2929
 	.byte	0x1
 	.byte	0x72
-	.4byte	0xdae3
+	.4byte	0xdadd
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2995
+	.4byte	.LASF2994
 	.byte	0x1
 	.byte	0x73
-	.4byte	0xdede
+	.4byte	0xded8
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF1771
 	.byte	0x1
 	.byte	0x74
-	.4byte	0xe1d0
+	.4byte	0xe1ca
 	.byte	0xb8
 	.byte	0
 	.uleb128 0x4b
-	.4byte	.LASF2996
+	.4byte	.LASF2995
 	.byte	0x1
 	.byte	0x77
-	.4byte	0xe461
+	.4byte	0xe45b
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	global_ebc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe402
+	.4byte	0xe3fc
 	.uleb128 0x4b
-	.4byte	.LASF2997
+	.4byte	.LASF2996
 	.byte	0x1
 	.byte	0x78
 	.4byte	0x2eda
@@ -36790,7 +37033,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_auto_task
 	.uleb128 0x4b
-	.4byte	.LASF2998
+	.4byte	.LASF2997
 	.byte	0x1
 	.byte	0x79
 	.4byte	0x4e0b
@@ -36798,7 +37041,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	auto_buf_sema
 	.uleb128 0x4b
-	.4byte	.LASF2999
+	.4byte	.LASF2998
 	.byte	0x1
 	.byte	0x7b
 	.4byte	0x156f
@@ -36806,7 +37049,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_wq
 	.uleb128 0x4b
-	.4byte	.LASF3000
+	.4byte	.LASF2999
 	.byte	0x1
 	.byte	0x7c
 	.4byte	0x156f
@@ -36814,7 +37057,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_thread_wq
 	.uleb128 0x4b
-	.4byte	.LASF3001
+	.4byte	.LASF3000
 	.byte	0x1
 	.byte	0x7d
 	.4byte	0x156f
@@ -36822,7 +37065,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_poweroff_wq
 	.uleb128 0x4b
-	.4byte	.LASF3002
+	.4byte	.LASF3001
 	.byte	0x1
 	.byte	0x7e
 	.4byte	0x5b46
@@ -36830,2738 +37073,2738 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_auto_thread_sem
 	.uleb128 0x4c
-	.4byte	.LASF3003
+	.4byte	.LASF3002
 	.byte	0x1
-	.2byte	0x61b
+	.2byte	0x672
 	.4byte	0x7b4
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_ops
 	.uleb128 0x4c
-	.4byte	.LASF3004
+	.4byte	.LASF3003
 	.byte	0x1
-	.2byte	0x625
+	.2byte	0x67c
 	.4byte	0xc5df
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_misc
 	.uleb128 0x4c
-	.4byte	.LASF3005
+	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x634
+	.2byte	0x68b
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_waveform_version
 	.uleb128 0x4c
-	.4byte	.LASF3006
+	.4byte	.LASF3005
 	.byte	0x1
-	.2byte	0x63f
+	.2byte	0x696
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_name
 	.uleb128 0x4c
-	.4byte	.LASF3007
+	.4byte	.LASF3006
 	.byte	0x1
-	.2byte	0x64d
+	.2byte	0x6a4
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_temp
 	.uleb128 0x4c
-	.4byte	.LASF3008
+	.4byte	.LASF3007
 	.byte	0x1
-	.2byte	0x670
+	.2byte	0x6c7
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_vcom
 	.uleb128 0x4c
-	.4byte	.LASF3009
+	.4byte	.LASF3008
 	.byte	0x1
-	.2byte	0x67a
+	.2byte	0x6d1
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_version
 	.uleb128 0x4c
-	.4byte	.LASF3010
+	.4byte	.LASF3009
 	.byte	0x1
-	.2byte	0x683
+	.2byte	0x6da
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_state
 	.uleb128 0x4c
-	.4byte	.LASF3011
+	.4byte	.LASF3010
 	.byte	0x1
-	.2byte	0x81c
+	.2byte	0x873
 	.4byte	0xa531
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_pm
 	.uleb128 0x5
 	.4byte	0xb170
-	.4byte	0xe5bb
+	.4byte	0xe5b5
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe5ab
+	.4byte	0xe5a5
 	.uleb128 0x4c
-	.4byte	.LASF3012
+	.4byte	.LASF3011
 	.byte	0x1
-	.2byte	0x821
-	.4byte	0xe5bb
+	.2byte	0x878
+	.4byte	0xe5b5
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_match
 	.uleb128 0x4c
-	.4byte	.LASF3013
+	.4byte	.LASF3012
 	.byte	0x1
-	.2byte	0x827
+	.2byte	0x87e
 	.4byte	0xd66d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_driver
 	.uleb128 0x4c
-	.4byte	.LASF3014
+	.4byte	.LASF3013
 	.byte	0x1
-	.2byte	0x83b
+	.2byte	0x892
 	.4byte	0x443
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init2107
+	.8byte	__addressable_ebc_init2194
 	.uleb128 0x4c
-	.4byte	.LASF3015
+	.4byte	.LASF3014
 	.byte	0x1
-	.2byte	0x83c
+	.2byte	0x893
 	.4byte	0x497
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	__exitcall_ebc_exit
 	.uleb128 0x4d
-	.4byte	.LASF3064
+	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x836
-	.8byte	.LFB2845
-	.8byte	.LFE2845-.LFB2845
+	.2byte	0x88d
+	.8byte	.LFB2846
+	.8byte	.LFE2846-.LFB2846
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe644
+	.4byte	0xe63e
 	.uleb128 0x4e
 	.8byte	.LVL34
-	.4byte	0x13a61
+	.4byte	0x13b3d
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3016
+	.4byte	.LASF3015
 	.byte	0x1
-	.2byte	0x831
+	.2byte	0x888
 	.4byte	0xc6
-	.8byte	.LFB2844
-	.8byte	.LFE2844-.LFB2844
+	.8byte	.LFB2845
+	.8byte	.LFE2845-.LFB2845
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe674
+	.4byte	0xe66e
 	.uleb128 0x4e
 	.8byte	.LVL318
-	.4byte	0x13a6d
+	.4byte	0x13b49
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3017
+	.4byte	.LASF3016
 	.byte	0x1
-	.2byte	0x810
+	.2byte	0x867
 	.4byte	0xc6
-	.8byte	.LFB2843
-	.8byte	.LFE2843-.LFB2843
+	.8byte	.LFB2844
+	.8byte	.LFE2844-.LFB2844
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe710
+	.4byte	0xe70a
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x810
+	.2byte	0x867
 	.4byte	0xa545
 	.4byte	.LLST7
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x812
-	.4byte	0xe461
+	.2byte	0x869
+	.4byte	0xe45b
 	.uleb128 0x46
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x813
-	.4byte	0xe710
+	.2byte	0x86a
+	.4byte	0xe70a
 	.uleb128 0x53
-	.4byte	0x13118
+	.4byte	0x131ec
 	.8byte	.LBB910
 	.8byte	.LBE910-.LBB910
 	.byte	0x1
-	.2byte	0x812
-	.4byte	0xe6e0
+	.2byte	0x869
+	.4byte	0xe6da
 	.uleb128 0x54
-	.4byte	0x13129
+	.4byte	0x131fd
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12d09
+	.4byte	0x12ddd
 	.8byte	.LBB912
 	.8byte	.LBE912-.LBB912
 	.byte	0x1
-	.2byte	0x815
-	.4byte	0xe702
+	.2byte	0x86c
+	.4byte	0xe6fc
 	.uleb128 0x54
-	.4byte	0x12d15
+	.4byte	0x12de9
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL38
-	.4byte	0x13a79
+	.4byte	0x13b55
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1d0
+	.4byte	0xe1ca
 	.uleb128 0x50
-	.4byte	.LASF3019
+	.4byte	.LASF3018
 	.byte	0x1
-	.2byte	0x7ff
+	.2byte	0x856
 	.4byte	0xc6
-	.8byte	.LFB2842
-	.8byte	.LFE2842-.LFB2842
+	.8byte	.LFB2843
+	.8byte	.LFE2843-.LFB2843
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe81d
+	.4byte	0xe817
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x7ff
+	.2byte	0x856
 	.4byte	0xa545
 	.4byte	.LLST118
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x801
-	.4byte	0xe461
+	.2byte	0x858
+	.4byte	0xe45b
 	.uleb128 0x46
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x802
-	.4byte	0xe710
+	.2byte	0x859
+	.4byte	0xe70a
 	.uleb128 0x55
-	.4byte	.LASF3020
-	.4byte	0xe82d
+	.4byte	.LASF3019
+	.4byte	0xe827
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35115
+	.8byte	__func__.35129
 	.uleb128 0x53
-	.4byte	0x13118
-	.8byte	.LBB1297
-	.8byte	.LBE1297-.LBB1297
+	.4byte	0x131ec
+	.8byte	.LBB1295
+	.8byte	.LBE1295-.LBB1295
 	.byte	0x1
-	.2byte	0x801
-	.4byte	0xe795
+	.2byte	0x858
+	.4byte	0xe78f
 	.uleb128 0x54
-	.4byte	0x13129
+	.4byte	0x131fd
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12d21
-	.8byte	.LBB1299
-	.8byte	.LBE1299-.LBB1299
+	.4byte	0x12df5
+	.8byte	.LBB1297
+	.8byte	.LBE1297-.LBB1297
 	.byte	0x1
-	.2byte	0x80a
-	.4byte	0xe7b7
+	.2byte	0x861
+	.4byte	0xe7b1
 	.uleb128 0x54
-	.4byte	0x12d2d
+	.4byte	0x12e01
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12a6f
-	.8byte	.LBB1301
-	.8byte	.LBE1301-.LBB1301
+	.4byte	0x12b43
+	.8byte	.LBB1299
+	.8byte	.LBE1299-.LBB1299
 	.byte	0x1
-	.2byte	0x806
-	.4byte	0xe802
+	.2byte	0x85d
+	.4byte	0xe7fc
 	.uleb128 0x54
-	.4byte	0x12a8a
+	.4byte	0x12b5e
 	.uleb128 0x54
-	.4byte	0x12a7f
+	.4byte	0x12b53
 	.uleb128 0x56
-	.8byte	.LBB1302
-	.8byte	.LBE1302-.LBB1302
+	.8byte	.LBB1300
+	.8byte	.LBE1300-.LBB1300
 	.uleb128 0x57
-	.4byte	0x12a95
+	.4byte	0x12b69
 	.uleb128 0x4e
 	.8byte	.LVL450
-	.4byte	0x138f9
+	.4byte	0x139cd
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL448
-	.4byte	0x13a79
+	.4byte	0x13b55
 	.uleb128 0x4e
 	.8byte	.LVL449
-	.4byte	0x13a79
+	.4byte	0x13b55
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xe82d
+	.4byte	0xe827
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xb
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe81d
+	.4byte	0xe817
 	.uleb128 0x4f
-	.4byte	.LASF3021
+	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x7f8
+	.2byte	0x84f
 	.4byte	0xc6
-	.8byte	.LFB2841
-	.8byte	.LFE2841-.LFB2841
+	.8byte	.LFB2842
+	.8byte	.LFE2842-.LFB2842
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe872
+	.4byte	0xe86c
 	.uleb128 0x58
-	.4byte	.LASF3022
+	.4byte	.LASF3021
 	.byte	0x1
-	.2byte	0x7f8
+	.2byte	0x84f
 	.4byte	0xd6e9
 	.4byte	.LLST9
 	.uleb128 0x4e
 	.8byte	.LVL44
-	.4byte	0x13a86
+	.4byte	0x13b62
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3023
+	.4byte	.LASF3022
 	.byte	0x1
-	.2byte	0x78c
+	.2byte	0x7e3
 	.4byte	0xc6
-	.8byte	.LFB2840
-	.8byte	.LFE2840-.LFB2840
+	.8byte	.LFB2841
+	.8byte	.LFE2841-.LFB2841
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfc5f
+	.4byte	0xfc59
 	.uleb128 0x58
-	.4byte	.LASF3022
+	.4byte	.LASF3021
 	.byte	0x1
-	.2byte	0x78c
+	.2byte	0x7e3
 	.4byte	0xd6e9
 	.4byte	.LLST119
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x78e
+	.2byte	0x7e5
 	.4byte	0xa545
 	.uleb128 0x46
-	.4byte	.LASF3024
+	.4byte	.LASF3023
 	.byte	0x1
-	.2byte	0x78f
+	.2byte	0x7e6
 	.4byte	0xb869
 	.uleb128 0x59
-	.4byte	.LASF3025
+	.4byte	.LASF3024
 	.byte	0x1
-	.2byte	0x790
+	.2byte	0x7e7
 	.4byte	0xd6e9
 	.4byte	.LLST120
 	.uleb128 0x46
-	.4byte	.LASF3026
+	.4byte	.LASF3025
 	.byte	0x1
-	.2byte	0x791
+	.2byte	0x7e8
 	.4byte	0xb869
 	.uleb128 0x59
-	.4byte	.LASF3027
+	.4byte	.LASF3026
 	.byte	0x1
-	.2byte	0x792
+	.2byte	0x7e9
 	.4byte	0xc012
 	.4byte	.LLST121
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x793
-	.4byte	0xe461
+	.2byte	0x7ea
+	.4byte	0xe45b
 	.uleb128 0x59
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x794
-	.4byte	0xe710
+	.2byte	0x7eb
+	.4byte	0xe70a
 	.4byte	.LLST122
 	.uleb128 0x46
-	.4byte	.LASF2995
+	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x795
-	.4byte	0xe123
+	.2byte	0x7ec
+	.4byte	0xe11d
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x796
+	.2byte	0x7ed
 	.4byte	0xc6
 	.uleb128 0x5a
-	.4byte	0x13136
-	.8byte	.LBB1448
-	.4byte	.Ldebug_ranges0+0x9e0
+	.4byte	0x1320a
+	.8byte	.LBB1446
+	.4byte	.Ldebug_ranges0+0x9b0
 	.byte	0x1
-	.2byte	0x798
-	.4byte	0xe951
+	.2byte	0x7ef
+	.4byte	0xe94b
 	.uleb128 0x54
-	.4byte	0x1315f
+	.4byte	0x13233
 	.uleb128 0x54
-	.4byte	0x13153
+	.4byte	0x13227
 	.uleb128 0x54
-	.4byte	0x13147
+	.4byte	0x1321b
 	.uleb128 0x4e
 	.8byte	.LVL453
-	.4byte	0x13a92
+	.4byte	0x13b6e
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13013
-	.8byte	.LBB1452
-	.8byte	.LBE1452-.LBB1452
+	.4byte	0x130e7
+	.8byte	.LBB1450
+	.8byte	.LBE1450-.LBB1450
 	.byte	0x1
-	.2byte	0x7aa
-	.4byte	0xe990
+	.2byte	0x801
+	.4byte	0xe98a
 	.uleb128 0x54
-	.4byte	0x13023
+	.4byte	0x130f7
 	.uleb128 0x5b
-	.4byte	0x13118
-	.8byte	.LBB1453
-	.8byte	.LBE1453-.LBB1453
+	.4byte	0x131ec
+	.8byte	.LBB1451
+	.8byte	.LBE1451-.LBB1451
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x54
-	.4byte	0x13129
+	.4byte	0x131fd
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13035
-	.8byte	.LBB1455
-	.8byte	.LBE1455-.LBB1455
+	.4byte	0x13109
+	.8byte	.LBB1453
+	.8byte	.LBE1453-.LBB1453
 	.byte	0x1
-	.2byte	0x7bb
-	.4byte	0xe9d0
+	.2byte	0x812
+	.4byte	0xe9ca
 	.uleb128 0x54
-	.4byte	0x13046
+	.4byte	0x1311a
 	.uleb128 0x5c
-	.4byte	0x13118
-	.8byte	.LBB1456
-	.8byte	.LBE1456-.LBB1456
+	.4byte	0x131ec
+	.8byte	.LBB1454
+	.8byte	.LBE1454-.LBB1454
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x54
-	.4byte	0x13129
+	.4byte	0x131fd
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x11590
-	.8byte	.LBB1458
-	.4byte	.Ldebug_ranges0+0xa10
+	.4byte	0x1158a
+	.8byte	.LBB1456
+	.4byte	.Ldebug_ranges0+0x9e0
 	.byte	0x1
-	.2byte	0x7c9
-	.4byte	0xf389
+	.2byte	0x820
+	.4byte	0xf383
 	.uleb128 0x54
-	.4byte	0x115a1
+	.4byte	0x1159b
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xa10
+	.4byte	.Ldebug_ranges0+0x9e0
 	.uleb128 0x57
-	.4byte	0x115ad
+	.4byte	0x115a7
 	.uleb128 0x5a
-	.4byte	0x13059
-	.8byte	.LBB1460
-	.4byte	.Ldebug_ranges0+0xa70
+	.4byte	0x1312d
+	.8byte	.LBB1458
+	.4byte	.Ldebug_ranges0+0xa40
 	.byte	0x1
-	.2byte	0x4fd
-	.4byte	0xea60
+	.2byte	0x554
+	.4byte	0xea5a
 	.uleb128 0x54
-	.4byte	0x13081
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x13075
+	.4byte	0x13149
 	.uleb128 0x54
-	.4byte	0x1306a
+	.4byte	0x1313e
 	.uleb128 0x5e
-	.4byte	0x1308e
-	.8byte	.LBB1461
-	.4byte	.Ldebug_ranges0+0xa70
+	.4byte	0x13162
+	.8byte	.LBB1459
+	.4byte	.Ldebug_ranges0+0xa40
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x130c2
+	.4byte	0x13196
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x1318a
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x1317e
 	.uleb128 0x54
-	.4byte	0x1309f
+	.4byte	0x13173
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xa70
+	.4byte	.Ldebug_ranges0+0xa40
 	.uleb128 0x57
-	.4byte	0x130cd
+	.4byte	0x131a1
 	.uleb128 0x4e
 	.8byte	.LVL461
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13059
-	.8byte	.LBB1472
-	.8byte	.LBE1472-.LBB1472
+	.4byte	0x1312d
+	.8byte	.LBB1470
+	.8byte	.LBE1470-.LBB1470
 	.byte	0x1
-	.2byte	0x500
-	.4byte	0xeadd
+	.2byte	0x557
+	.4byte	0xead7
 	.uleb128 0x54
-	.4byte	0x13081
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x13075
+	.4byte	0x13149
 	.uleb128 0x54
-	.4byte	0x1306a
+	.4byte	0x1313e
 	.uleb128 0x5c
-	.4byte	0x1308e
-	.8byte	.LBB1473
-	.8byte	.LBE1473-.LBB1473
+	.4byte	0x13162
+	.8byte	.LBB1471
+	.8byte	.LBE1471-.LBB1471
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x130c2
+	.4byte	0x13196
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x1318a
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x1317e
 	.uleb128 0x54
-	.4byte	0x1309f
+	.4byte	0x13173
 	.uleb128 0x56
-	.8byte	.LBB1474
-	.8byte	.LBE1474-.LBB1474
+	.8byte	.LBB1472
+	.8byte	.LBE1472-.LBB1472
 	.uleb128 0x57
-	.4byte	0x130cd
+	.4byte	0x131a1
 	.uleb128 0x4e
 	.8byte	.LVL462
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13059
-	.8byte	.LBB1475
-	.8byte	.LBE1475-.LBB1475
+	.4byte	0x1312d
+	.8byte	.LBB1473
+	.8byte	.LBE1473-.LBB1473
 	.byte	0x1
-	.2byte	0x503
-	.4byte	0xeb5a
+	.2byte	0x55a
+	.4byte	0xeb54
 	.uleb128 0x54
-	.4byte	0x13081
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x13075
+	.4byte	0x13149
 	.uleb128 0x54
-	.4byte	0x1306a
+	.4byte	0x1313e
 	.uleb128 0x5c
-	.4byte	0x1308e
-	.8byte	.LBB1476
-	.8byte	.LBE1476-.LBB1476
+	.4byte	0x13162
+	.8byte	.LBB1474
+	.8byte	.LBE1474-.LBB1474
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x130c2
+	.4byte	0x13196
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x1318a
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x1317e
 	.uleb128 0x54
-	.4byte	0x1309f
+	.4byte	0x13173
 	.uleb128 0x56
-	.8byte	.LBB1477
-	.8byte	.LBE1477-.LBB1477
+	.8byte	.LBB1475
+	.8byte	.LBE1475-.LBB1475
 	.uleb128 0x57
-	.4byte	0x130cd
+	.4byte	0x131a1
 	.uleb128 0x4e
 	.8byte	.LVL463
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13059
-	.8byte	.LBB1478
-	.8byte	.LBE1478-.LBB1478
+	.4byte	0x1312d
+	.8byte	.LBB1476
+	.8byte	.LBE1476-.LBB1476
 	.byte	0x1
-	.2byte	0x506
-	.4byte	0xebd7
+	.2byte	0x55d
+	.4byte	0xebd1
 	.uleb128 0x54
-	.4byte	0x13081
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x13075
+	.4byte	0x13149
 	.uleb128 0x54
-	.4byte	0x1306a
+	.4byte	0x1313e
 	.uleb128 0x5c
-	.4byte	0x1308e
-	.8byte	.LBB1479
-	.8byte	.LBE1479-.LBB1479
+	.4byte	0x13162
+	.8byte	.LBB1477
+	.8byte	.LBE1477-.LBB1477
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x130c2
+	.4byte	0x13196
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x1318a
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x1317e
 	.uleb128 0x54
-	.4byte	0x1309f
+	.4byte	0x13173
 	.uleb128 0x56
-	.8byte	.LBB1480
-	.8byte	.LBE1480-.LBB1480
+	.8byte	.LBB1478
+	.8byte	.LBE1478-.LBB1478
 	.uleb128 0x57
-	.4byte	0x130cd
+	.4byte	0x131a1
 	.uleb128 0x4e
 	.8byte	.LVL464
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13059
-	.8byte	.LBB1481
-	.8byte	.LBE1481-.LBB1481
+	.4byte	0x1312d
+	.8byte	.LBB1479
+	.8byte	.LBE1479-.LBB1479
 	.byte	0x1
-	.2byte	0x509
-	.4byte	0xec54
+	.2byte	0x560
+	.4byte	0xec4e
 	.uleb128 0x54
-	.4byte	0x13081
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x13075
+	.4byte	0x13149
 	.uleb128 0x54
-	.4byte	0x1306a
+	.4byte	0x1313e
 	.uleb128 0x5c
-	.4byte	0x1308e
-	.8byte	.LBB1482
-	.8byte	.LBE1482-.LBB1482
+	.4byte	0x13162
+	.8byte	.LBB1480
+	.8byte	.LBE1480-.LBB1480
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x130c2
+	.4byte	0x13196
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x1318a
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x1317e
 	.uleb128 0x54
-	.4byte	0x1309f
+	.4byte	0x13173
 	.uleb128 0x56
-	.8byte	.LBB1483
-	.8byte	.LBE1483-.LBB1483
+	.8byte	.LBB1481
+	.8byte	.LBE1481-.LBB1481
 	.uleb128 0x57
-	.4byte	0x130cd
+	.4byte	0x131a1
 	.uleb128 0x4e
 	.8byte	.LVL465
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13059
-	.8byte	.LBB1484
-	.8byte	.LBE1484-.LBB1484
+	.4byte	0x1312d
+	.8byte	.LBB1482
+	.8byte	.LBE1482-.LBB1482
 	.byte	0x1
-	.2byte	0x50c
-	.4byte	0xecd1
+	.2byte	0x563
+	.4byte	0xeccb
 	.uleb128 0x54
-	.4byte	0x13081
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x13075
+	.4byte	0x13149
 	.uleb128 0x54
-	.4byte	0x1306a
+	.4byte	0x1313e
 	.uleb128 0x5c
-	.4byte	0x1308e
-	.8byte	.LBB1485
-	.8byte	.LBE1485-.LBB1485
+	.4byte	0x13162
+	.8byte	.LBB1483
+	.8byte	.LBE1483-.LBB1483
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x130c2
+	.4byte	0x13196
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x1318a
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x1317e
 	.uleb128 0x54
-	.4byte	0x1309f
+	.4byte	0x13173
 	.uleb128 0x56
-	.8byte	.LBB1486
-	.8byte	.LBE1486-.LBB1486
+	.8byte	.LBB1484
+	.8byte	.LBE1484-.LBB1484
 	.uleb128 0x57
-	.4byte	0x130cd
+	.4byte	0x131a1
 	.uleb128 0x4e
 	.8byte	.LVL466
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13059
-	.8byte	.LBB1487
-	.8byte	.LBE1487-.LBB1487
+	.4byte	0x1312d
+	.8byte	.LBB1485
+	.8byte	.LBE1485-.LBB1485
 	.byte	0x1
-	.2byte	0x50f
-	.4byte	0xed4e
+	.2byte	0x566
+	.4byte	0xed48
 	.uleb128 0x54
-	.4byte	0x13081
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x13075
+	.4byte	0x13149
 	.uleb128 0x54
-	.4byte	0x1306a
+	.4byte	0x1313e
 	.uleb128 0x5c
-	.4byte	0x1308e
-	.8byte	.LBB1488
-	.8byte	.LBE1488-.LBB1488
+	.4byte	0x13162
+	.8byte	.LBB1486
+	.8byte	.LBE1486-.LBB1486
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x130c2
+	.4byte	0x13196
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x1318a
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x1317e
 	.uleb128 0x54
-	.4byte	0x1309f
+	.4byte	0x13173
 	.uleb128 0x56
-	.8byte	.LBB1489
-	.8byte	.LBE1489-.LBB1489
+	.8byte	.LBB1487
+	.8byte	.LBE1487-.LBB1487
 	.uleb128 0x57
-	.4byte	0x130cd
+	.4byte	0x131a1
 	.uleb128 0x4e
 	.8byte	.LVL467
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13059
-	.8byte	.LBB1490
-	.8byte	.LBE1490-.LBB1490
+	.4byte	0x1312d
+	.8byte	.LBB1488
+	.8byte	.LBE1488-.LBB1488
 	.byte	0x1
-	.2byte	0x512
-	.4byte	0xedcb
+	.2byte	0x569
+	.4byte	0xedc5
 	.uleb128 0x54
-	.4byte	0x13081
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x13075
+	.4byte	0x13149
 	.uleb128 0x54
-	.4byte	0x1306a
+	.4byte	0x1313e
 	.uleb128 0x5c
-	.4byte	0x1308e
-	.8byte	.LBB1491
-	.8byte	.LBE1491-.LBB1491
+	.4byte	0x13162
+	.8byte	.LBB1489
+	.8byte	.LBE1489-.LBB1489
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x130c2
+	.4byte	0x13196
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x1318a
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x1317e
 	.uleb128 0x54
-	.4byte	0x1309f
+	.4byte	0x13173
 	.uleb128 0x56
-	.8byte	.LBB1492
-	.8byte	.LBE1492-.LBB1492
+	.8byte	.LBB1490
+	.8byte	.LBE1490-.LBB1490
 	.uleb128 0x57
-	.4byte	0x130cd
+	.4byte	0x131a1
 	.uleb128 0x4e
 	.8byte	.LVL468
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13059
-	.8byte	.LBB1493
-	.8byte	.LBE1493-.LBB1493
+	.4byte	0x1312d
+	.8byte	.LBB1491
+	.8byte	.LBE1491-.LBB1491
 	.byte	0x1
-	.2byte	0x515
-	.4byte	0xee48
+	.2byte	0x56c
+	.4byte	0xee42
 	.uleb128 0x54
-	.4byte	0x13081
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x13075
+	.4byte	0x13149
 	.uleb128 0x54
-	.4byte	0x1306a
+	.4byte	0x1313e
 	.uleb128 0x5c
-	.4byte	0x1308e
-	.8byte	.LBB1494
-	.8byte	.LBE1494-.LBB1494
+	.4byte	0x13162
+	.8byte	.LBB1492
+	.8byte	.LBE1492-.LBB1492
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x130c2
+	.4byte	0x13196
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x1318a
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x1317e
 	.uleb128 0x54
-	.4byte	0x1309f
+	.4byte	0x13173
 	.uleb128 0x56
-	.8byte	.LBB1495
-	.8byte	.LBE1495-.LBB1495
+	.8byte	.LBB1493
+	.8byte	.LBE1493-.LBB1493
 	.uleb128 0x57
-	.4byte	0x130cd
+	.4byte	0x131a1
 	.uleb128 0x4e
 	.8byte	.LVL469
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13059
-	.8byte	.LBB1496
-	.8byte	.LBE1496-.LBB1496
+	.4byte	0x1312d
+	.8byte	.LBB1494
+	.8byte	.LBE1494-.LBB1494
 	.byte	0x1
-	.2byte	0x518
-	.4byte	0xeec5
+	.2byte	0x56f
+	.4byte	0xeebf
 	.uleb128 0x54
-	.4byte	0x13081
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x13075
+	.4byte	0x13149
 	.uleb128 0x54
-	.4byte	0x1306a
+	.4byte	0x1313e
 	.uleb128 0x5c
-	.4byte	0x1308e
-	.8byte	.LBB1497
-	.8byte	.LBE1497-.LBB1497
+	.4byte	0x13162
+	.8byte	.LBB1495
+	.8byte	.LBE1495-.LBB1495
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x130c2
+	.4byte	0x13196
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x1318a
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x1317e
 	.uleb128 0x54
-	.4byte	0x1309f
+	.4byte	0x13173
 	.uleb128 0x56
-	.8byte	.LBB1498
-	.8byte	.LBE1498-.LBB1498
+	.8byte	.LBB1496
+	.8byte	.LBE1496-.LBB1496
 	.uleb128 0x57
-	.4byte	0x130cd
+	.4byte	0x131a1
 	.uleb128 0x4e
 	.8byte	.LVL470
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13059
-	.8byte	.LBB1499
-	.8byte	.LBE1499-.LBB1499
+	.4byte	0x1312d
+	.8byte	.LBB1497
+	.8byte	.LBE1497-.LBB1497
 	.byte	0x1
-	.2byte	0x51b
-	.4byte	0xef42
+	.2byte	0x572
+	.4byte	0xef3c
 	.uleb128 0x54
-	.4byte	0x13081
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x13075
+	.4byte	0x13149
 	.uleb128 0x54
-	.4byte	0x1306a
+	.4byte	0x1313e
 	.uleb128 0x5c
-	.4byte	0x1308e
-	.8byte	.LBB1500
-	.8byte	.LBE1500-.LBB1500
+	.4byte	0x13162
+	.8byte	.LBB1498
+	.8byte	.LBE1498-.LBB1498
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x130c2
+	.4byte	0x13196
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x1318a
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x1317e
 	.uleb128 0x54
-	.4byte	0x1309f
+	.4byte	0x13173
 	.uleb128 0x56
-	.8byte	.LBB1501
-	.8byte	.LBE1501-.LBB1501
+	.8byte	.LBB1499
+	.8byte	.LBE1499-.LBB1499
 	.uleb128 0x57
-	.4byte	0x130cd
+	.4byte	0x131a1
 	.uleb128 0x4e
 	.8byte	.LVL471
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13059
-	.8byte	.LBB1502
-	.8byte	.LBE1502-.LBB1502
+	.4byte	0x1312d
+	.8byte	.LBB1500
+	.8byte	.LBE1500-.LBB1500
 	.byte	0x1
-	.2byte	0x51e
-	.4byte	0xefbf
+	.2byte	0x575
+	.4byte	0xefb9
 	.uleb128 0x54
-	.4byte	0x13081
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x13075
+	.4byte	0x13149
 	.uleb128 0x54
-	.4byte	0x1306a
+	.4byte	0x1313e
 	.uleb128 0x5c
-	.4byte	0x1308e
-	.8byte	.LBB1503
-	.8byte	.LBE1503-.LBB1503
+	.4byte	0x13162
+	.8byte	.LBB1501
+	.8byte	.LBE1501-.LBB1501
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x130c2
+	.4byte	0x13196
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x1318a
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x1317e
 	.uleb128 0x54
-	.4byte	0x1309f
+	.4byte	0x13173
 	.uleb128 0x56
-	.8byte	.LBB1504
-	.8byte	.LBE1504-.LBB1504
+	.8byte	.LBB1502
+	.8byte	.LBE1502-.LBB1502
 	.uleb128 0x57
-	.4byte	0x130cd
+	.4byte	0x131a1
 	.uleb128 0x4e
 	.8byte	.LVL472
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13059
-	.8byte	.LBB1505
-	.8byte	.LBE1505-.LBB1505
+	.4byte	0x1312d
+	.8byte	.LBB1503
+	.8byte	.LBE1503-.LBB1503
 	.byte	0x1
-	.2byte	0x521
-	.4byte	0xf03c
+	.2byte	0x578
+	.4byte	0xf036
 	.uleb128 0x54
-	.4byte	0x13081
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x13075
+	.4byte	0x13149
 	.uleb128 0x54
-	.4byte	0x1306a
+	.4byte	0x1313e
 	.uleb128 0x5c
-	.4byte	0x1308e
-	.8byte	.LBB1506
-	.8byte	.LBE1506-.LBB1506
+	.4byte	0x13162
+	.8byte	.LBB1504
+	.8byte	.LBE1504-.LBB1504
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x130c2
+	.4byte	0x13196
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x1318a
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x1317e
 	.uleb128 0x54
-	.4byte	0x1309f
+	.4byte	0x13173
 	.uleb128 0x56
-	.8byte	.LBB1507
-	.8byte	.LBE1507-.LBB1507
+	.8byte	.LBB1505
+	.8byte	.LBE1505-.LBB1505
 	.uleb128 0x57
-	.4byte	0x130cd
+	.4byte	0x131a1
 	.uleb128 0x4e
 	.8byte	.LVL473
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13059
-	.8byte	.LBB1508
-	.8byte	.LBE1508-.LBB1508
+	.4byte	0x1312d
+	.8byte	.LBB1506
+	.8byte	.LBE1506-.LBB1506
 	.byte	0x1
-	.2byte	0x524
-	.4byte	0xf0b9
+	.2byte	0x57b
+	.4byte	0xf0b3
 	.uleb128 0x54
-	.4byte	0x13081
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x13075
+	.4byte	0x13149
 	.uleb128 0x54
-	.4byte	0x1306a
+	.4byte	0x1313e
 	.uleb128 0x5c
-	.4byte	0x1308e
-	.8byte	.LBB1509
-	.8byte	.LBE1509-.LBB1509
+	.4byte	0x13162
+	.8byte	.LBB1507
+	.8byte	.LBE1507-.LBB1507
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x130c2
+	.4byte	0x13196
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x1318a
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x1317e
 	.uleb128 0x54
-	.4byte	0x1309f
+	.4byte	0x13173
 	.uleb128 0x56
-	.8byte	.LBB1510
-	.8byte	.LBE1510-.LBB1510
+	.8byte	.LBB1508
+	.8byte	.LBE1508-.LBB1508
 	.uleb128 0x57
-	.4byte	0x130cd
+	.4byte	0x131a1
 	.uleb128 0x4e
 	.8byte	.LVL474
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13059
-	.8byte	.LBB1511
-	.8byte	.LBE1511-.LBB1511
+	.4byte	0x1312d
+	.8byte	.LBB1509
+	.8byte	.LBE1509-.LBB1509
 	.byte	0x1
-	.2byte	0x527
-	.4byte	0xf136
+	.2byte	0x57e
+	.4byte	0xf130
 	.uleb128 0x54
-	.4byte	0x13081
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x13075
+	.4byte	0x13149
 	.uleb128 0x54
-	.4byte	0x1306a
+	.4byte	0x1313e
 	.uleb128 0x5c
-	.4byte	0x1308e
-	.8byte	.LBB1512
-	.8byte	.LBE1512-.LBB1512
+	.4byte	0x13162
+	.8byte	.LBB1510
+	.8byte	.LBE1510-.LBB1510
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x130c2
+	.4byte	0x13196
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x1318a
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x1317e
 	.uleb128 0x54
-	.4byte	0x1309f
+	.4byte	0x13173
 	.uleb128 0x56
-	.8byte	.LBB1513
-	.8byte	.LBE1513-.LBB1513
+	.8byte	.LBB1511
+	.8byte	.LBE1511-.LBB1511
 	.uleb128 0x57
-	.4byte	0x130cd
+	.4byte	0x131a1
 	.uleb128 0x4e
 	.8byte	.LVL475
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13059
-	.8byte	.LBB1514
-	.8byte	.LBE1514-.LBB1514
+	.4byte	0x1312d
+	.8byte	.LBB1512
+	.8byte	.LBE1512-.LBB1512
 	.byte	0x1
-	.2byte	0x52a
-	.4byte	0xf1b3
+	.2byte	0x581
+	.4byte	0xf1ad
 	.uleb128 0x54
-	.4byte	0x13081
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x13075
+	.4byte	0x13149
 	.uleb128 0x54
-	.4byte	0x1306a
+	.4byte	0x1313e
 	.uleb128 0x5c
-	.4byte	0x1308e
-	.8byte	.LBB1515
-	.8byte	.LBE1515-.LBB1515
+	.4byte	0x13162
+	.8byte	.LBB1513
+	.8byte	.LBE1513-.LBB1513
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x130c2
+	.4byte	0x13196
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x1318a
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x1317e
 	.uleb128 0x54
-	.4byte	0x1309f
+	.4byte	0x13173
 	.uleb128 0x56
-	.8byte	.LBB1516
-	.8byte	.LBE1516-.LBB1516
+	.8byte	.LBB1514
+	.8byte	.LBE1514-.LBB1514
 	.uleb128 0x57
-	.4byte	0x130cd
+	.4byte	0x131a1
 	.uleb128 0x4e
 	.8byte	.LVL476
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13059
-	.8byte	.LBB1517
-	.4byte	.Ldebug_ranges0+0xac0
+	.4byte	0x1312d
+	.8byte	.LBB1515
+	.4byte	.Ldebug_ranges0+0xa90
 	.byte	0x1
-	.2byte	0x52d
-	.4byte	0xf229
+	.2byte	0x584
+	.4byte	0xf223
 	.uleb128 0x54
-	.4byte	0x13081
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x13075
+	.4byte	0x13149
 	.uleb128 0x54
-	.4byte	0x1306a
+	.4byte	0x1313e
 	.uleb128 0x5e
-	.4byte	0x1308e
-	.8byte	.LBB1518
-	.4byte	.Ldebug_ranges0+0xac0
+	.4byte	0x13162
+	.8byte	.LBB1516
+	.4byte	.Ldebug_ranges0+0xa90
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x130c2
+	.4byte	0x13196
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x1318a
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x1317e
 	.uleb128 0x54
-	.4byte	0x1309f
+	.4byte	0x13173
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xac0
+	.4byte	.Ldebug_ranges0+0xa90
 	.uleb128 0x57
-	.4byte	0x130cd
+	.4byte	0x131a1
 	.uleb128 0x4e
 	.8byte	.LVL477
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.uleb128 0x4e
 	.8byte	.LVL509
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13059
-	.8byte	.LBB1524
-	.4byte	.Ldebug_ranges0+0xb00
+	.4byte	0x1312d
+	.8byte	.LBB1522
+	.4byte	.Ldebug_ranges0+0xad0
 	.byte	0x1
-	.2byte	0x530
-	.4byte	0xf29f
+	.2byte	0x587
+	.4byte	0xf299
 	.uleb128 0x54
-	.4byte	0x13081
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x13075
+	.4byte	0x13149
 	.uleb128 0x54
-	.4byte	0x1306a
+	.4byte	0x1313e
 	.uleb128 0x5e
-	.4byte	0x1308e
-	.8byte	.LBB1525
-	.4byte	.Ldebug_ranges0+0xb00
+	.4byte	0x13162
+	.8byte	.LBB1523
+	.4byte	.Ldebug_ranges0+0xad0
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x130c2
+	.4byte	0x13196
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x1318a
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x1317e
 	.uleb128 0x54
-	.4byte	0x1309f
+	.4byte	0x13173
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xb00
+	.4byte	.Ldebug_ranges0+0xad0
 	.uleb128 0x57
-	.4byte	0x130cd
+	.4byte	0x131a1
 	.uleb128 0x4e
 	.8byte	.LVL478
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.uleb128 0x4e
 	.8byte	.LVL508
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13059
-	.8byte	.LBB1531
-	.4byte	.Ldebug_ranges0+0xb40
+	.4byte	0x1312d
+	.8byte	.LBB1529
+	.4byte	.Ldebug_ranges0+0xb10
 	.byte	0x1
-	.2byte	0x533
-	.4byte	0xf315
+	.2byte	0x58a
+	.4byte	0xf30f
 	.uleb128 0x54
-	.4byte	0x13081
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x13075
+	.4byte	0x13149
 	.uleb128 0x54
-	.4byte	0x1306a
+	.4byte	0x1313e
 	.uleb128 0x5e
-	.4byte	0x1308e
-	.8byte	.LBB1532
-	.4byte	.Ldebug_ranges0+0xb40
+	.4byte	0x13162
+	.8byte	.LBB1530
+	.4byte	.Ldebug_ranges0+0xb10
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x130c2
+	.4byte	0x13196
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x1318a
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x1317e
 	.uleb128 0x54
-	.4byte	0x1309f
+	.4byte	0x13173
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xb40
+	.4byte	.Ldebug_ranges0+0xb10
 	.uleb128 0x57
-	.4byte	0x130cd
+	.4byte	0x131a1
 	.uleb128 0x4e
 	.8byte	.LVL479
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.uleb128 0x4e
 	.8byte	.LVL507
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x13059
-	.8byte	.LBB1538
-	.4byte	.Ldebug_ranges0+0xb80
+	.4byte	0x1312d
+	.8byte	.LBB1536
+	.4byte	.Ldebug_ranges0+0xb50
 	.byte	0x1
-	.2byte	0x536
+	.2byte	0x58d
 	.uleb128 0x54
-	.4byte	0x13081
+	.4byte	0x13155
 	.uleb128 0x54
-	.4byte	0x13075
+	.4byte	0x13149
 	.uleb128 0x54
-	.4byte	0x1306a
+	.4byte	0x1313e
 	.uleb128 0x5e
-	.4byte	0x1308e
-	.8byte	.LBB1539
-	.4byte	.Ldebug_ranges0+0xb80
+	.4byte	0x13162
+	.8byte	.LBB1537
+	.4byte	.Ldebug_ranges0+0xb50
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x130c2
+	.4byte	0x13196
 	.uleb128 0x54
-	.4byte	0x130b6
+	.4byte	0x1318a
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x1317e
 	.uleb128 0x54
-	.4byte	0x1309f
+	.4byte	0x13173
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xb80
+	.4byte	.Ldebug_ranges0+0xb50
 	.uleb128 0x57
-	.4byte	0x130cd
+	.4byte	0x131a1
 	.uleb128 0x4e
 	.8byte	.LVL480
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.uleb128 0x4e
 	.8byte	.LVL506
-	.4byte	0x13a9f
+	.4byte	0x13b7b
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0xfd53
-	.8byte	.LBB1560
-	.4byte	.Ldebug_ranges0+0xbc0
+	.4byte	0xfd4d
+	.8byte	.LBB1558
+	.4byte	.Ldebug_ranges0+0xb90
 	.byte	0x1
-	.2byte	0x7d4
-	.4byte	0xf536
+	.2byte	0x82b
+	.4byte	0xf530
 	.uleb128 0x54
-	.4byte	0xfd64
+	.4byte	0xfd5e
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xbc0
+	.4byte	.Ldebug_ranges0+0xb90
 	.uleb128 0x5f
-	.4byte	0xfd70
+	.4byte	0xfd6a
 	.4byte	.LLST123
 	.uleb128 0x57
-	.4byte	0xfd7c
+	.4byte	0xfd76
 	.uleb128 0x57
-	.4byte	0xfd88
+	.4byte	0xfd82
 	.uleb128 0x57
-	.4byte	0xfd94
+	.4byte	0xfd8e
 	.uleb128 0x60
-	.4byte	0xfda0
+	.4byte	0xfd9a
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x57
-	.4byte	0xfdaa
+	.4byte	0xfda4
 	.uleb128 0x57
-	.4byte	0xfdb6
+	.4byte	0xfdb0
 	.uleb128 0x57
-	.4byte	0xfdc2
+	.4byte	0xfdbc
 	.uleb128 0x5a
-	.4byte	0x1316c
-	.8byte	.LBB1562
-	.4byte	.Ldebug_ranges0+0xc30
+	.4byte	0x13240
+	.8byte	.LBB1560
+	.4byte	.Ldebug_ranges0+0xc00
 	.byte	0x1
-	.2byte	0x6d3
-	.4byte	0xf3f9
+	.2byte	0x72a
+	.4byte	0xf3f3
 	.uleb128 0x54
-	.4byte	0x1317c
+	.4byte	0x13250
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13136
-	.8byte	.LBB1566
-	.4byte	.Ldebug_ranges0+0xc60
+	.4byte	0x1320a
+	.8byte	.LBB1564
+	.4byte	.Ldebug_ranges0+0xc30
 	.byte	0x1
-	.2byte	0x6ee
-	.4byte	0xf42e
+	.2byte	0x745
+	.4byte	0xf428
 	.uleb128 0x54
-	.4byte	0x1315f
+	.4byte	0x13233
 	.uleb128 0x54
-	.4byte	0x13153
+	.4byte	0x13227
 	.uleb128 0x54
-	.4byte	0x13147
+	.4byte	0x1321b
 	.uleb128 0x4e
 	.8byte	.LVL486
-	.4byte	0x13a92
+	.4byte	0x13b6e
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13136
-	.8byte	.LBB1574
-	.8byte	.LBE1574-.LBB1574
+	.4byte	0x1320a
+	.8byte	.LBB1572
+	.8byte	.LBE1572-.LBB1572
 	.byte	0x1
-	.2byte	0x6f1
-	.4byte	0xf467
+	.2byte	0x748
+	.4byte	0xf461
 	.uleb128 0x54
-	.4byte	0x1315f
+	.4byte	0x13233
 	.uleb128 0x54
-	.4byte	0x13153
+	.4byte	0x13227
 	.uleb128 0x54
-	.4byte	0x13147
+	.4byte	0x1321b
 	.uleb128 0x4e
 	.8byte	.LVL487
-	.4byte	0x13a92
+	.4byte	0x13b6e
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13136
-	.8byte	.LBB1576
-	.8byte	.LBE1576-.LBB1576
+	.4byte	0x1320a
+	.8byte	.LBB1574
+	.8byte	.LBE1574-.LBB1574
 	.byte	0x1
-	.2byte	0x6f4
-	.4byte	0xf4a0
+	.2byte	0x74b
+	.4byte	0xf49a
 	.uleb128 0x54
-	.4byte	0x1315f
+	.4byte	0x13233
 	.uleb128 0x54
-	.4byte	0x13153
+	.4byte	0x13227
 	.uleb128 0x54
-	.4byte	0x13147
+	.4byte	0x1321b
 	.uleb128 0x4e
 	.8byte	.LVL488
-	.4byte	0x13a92
+	.4byte	0x13b6e
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13136
-	.8byte	.LBB1578
-	.8byte	.LBE1578-.LBB1578
+	.4byte	0x1320a
+	.8byte	.LBB1576
+	.8byte	.LBE1576-.LBB1576
 	.byte	0x1
-	.2byte	0x6fc
-	.4byte	0xf4d9
+	.2byte	0x753
+	.4byte	0xf4d3
 	.uleb128 0x54
-	.4byte	0x1315f
+	.4byte	0x13233
 	.uleb128 0x54
-	.4byte	0x13153
+	.4byte	0x13227
 	.uleb128 0x54
-	.4byte	0x13147
+	.4byte	0x1321b
 	.uleb128 0x4e
 	.8byte	.LVL489
-	.4byte	0x13a92
+	.4byte	0x13b6e
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL482
-	.4byte	0x13aac
+	.4byte	0x13b88
 	.uleb128 0x4e
 	.8byte	.LVL483
-	.4byte	0x13ab9
+	.4byte	0x13b95
 	.uleb128 0x4e
 	.8byte	.LVL484
-	.4byte	0x13ac5
+	.4byte	0x13ba1
 	.uleb128 0x4e
 	.8byte	.LVL485
-	.4byte	0x13ad1
+	.4byte	0x13bad
 	.uleb128 0x4e
 	.8byte	.LVL490
-	.4byte	0x13add
+	.4byte	0x13bb9
 	.uleb128 0x4e
 	.8byte	.LVL491
-	.4byte	0x13ae7
+	.4byte	0x13bc3
 	.uleb128 0x4e
 	.8byte	.LVL503
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0xfdcd
-	.8byte	.LBB1587
-	.4byte	.Ldebug_ranges0+0xcb0
+	.4byte	0xfdc7
+	.8byte	.LBB1585
+	.4byte	.Ldebug_ranges0+0xc80
 	.byte	0x1
-	.2byte	0x7db
-	.4byte	0xf618
+	.2byte	0x832
+	.4byte	0xf612
 	.uleb128 0x54
-	.4byte	0xfdde
+	.4byte	0xfdd8
 	.uleb128 0x54
-	.4byte	0xfdde
+	.4byte	0xfdd8
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xcb0
+	.4byte	.Ldebug_ranges0+0xc80
 	.uleb128 0x57
-	.4byte	0xfdea
+	.4byte	0xfde4
 	.uleb128 0x5f
-	.4byte	0xfdf6
+	.4byte	0xfdf0
 	.4byte	.LLST124
 	.uleb128 0x57
-	.4byte	0xfe02
+	.4byte	0xfdfc
 	.uleb128 0x60
-	.4byte	0xfe0e
+	.4byte	0xfe08
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5f
-	.4byte	0xfe18
+	.4byte	0xfe12
 	.4byte	.LLST125
 	.uleb128 0x57
-	.4byte	0xfe24
+	.4byte	0xfe1e
 	.uleb128 0x57
-	.4byte	0xfe30
+	.4byte	0xfe2a
 	.uleb128 0x53
-	.4byte	0x1316c
-	.8byte	.LBB1589
-	.8byte	.LBE1589-.LBB1589
+	.4byte	0x13240
+	.8byte	.LBB1587
+	.8byte	.LBE1587-.LBB1587
 	.byte	0x1
-	.2byte	0x6a6
-	.4byte	0xf5ae
+	.2byte	0x6fd
+	.4byte	0xf5a8
 	.uleb128 0x54
-	.4byte	0x1317c
+	.4byte	0x13250
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL493
-	.4byte	0x13aac
+	.4byte	0x13b88
 	.uleb128 0x4e
 	.8byte	.LVL494
-	.4byte	0x13ab9
+	.4byte	0x13b95
 	.uleb128 0x4e
 	.8byte	.LVL512
-	.4byte	0x13ac5
+	.4byte	0x13ba1
 	.uleb128 0x4e
 	.8byte	.LVL513
-	.4byte	0x13b00
+	.4byte	0x13bdc
 	.uleb128 0x4e
 	.8byte	.LVL593
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL594
-	.4byte	0x13b0c
+	.4byte	0x13be8
 	.uleb128 0x4e
 	.8byte	.LVL595
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL614
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0xfd1b
-	.8byte	.LBB1598
-	.4byte	.Ldebug_ranges0+0xd10
+	.4byte	0xfd15
+	.8byte	.LBB1596
+	.4byte	.Ldebug_ranges0+0xce0
 	.byte	0x1
-	.2byte	0x7e2
-	.4byte	0xf7a5
+	.2byte	0x839
+	.4byte	0xf79f
 	.uleb128 0x54
-	.4byte	0xfd2c
+	.4byte	0xfd26
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xd10
+	.4byte	.Ldebug_ranges0+0xce0
 	.uleb128 0x60
-	.4byte	0xfd38
+	.4byte	0xfd32
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5a
-	.4byte	0x13342
-	.8byte	.LBB1600
-	.4byte	.Ldebug_ranges0+0xd50
+	.4byte	0x13416
+	.8byte	.LBB1598
+	.4byte	.Ldebug_ranges0+0xd20
 	.byte	0x1
-	.2byte	0x709
-	.4byte	0xf69f
+	.2byte	0x760
+	.4byte	0xf699
 	.uleb128 0x54
-	.4byte	0x1334e
+	.4byte	0x13422
 	.uleb128 0x56
-	.8byte	.LBB1602
-	.8byte	.LBE1602-.LBB1602
+	.8byte	.LBB1600
+	.8byte	.LBE1600-.LBB1600
 	.uleb128 0x57
-	.4byte	0x13379
+	.4byte	0x1344d
 	.uleb128 0x5b
-	.4byte	0x134c6
-	.8byte	.LBB1603
-	.8byte	.LBE1603-.LBB1603
+	.4byte	0x1359a
+	.8byte	.LBB1601
+	.8byte	.LBE1601-.LBB1601
 	.byte	0x10
 	.byte	0x1c
 	.uleb128 0x54
-	.4byte	0x134e6
+	.4byte	0x135ba
 	.uleb128 0x54
-	.4byte	0x134db
+	.4byte	0x135af
 	.uleb128 0x54
-	.4byte	0x134d2
+	.4byte	0x135a6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13408
-	.8byte	.LBB1607
-	.8byte	.LBE1607-.LBB1607
+	.4byte	0x134dc
+	.8byte	.LBB1605
+	.8byte	.LBE1605-.LBB1605
 	.byte	0x1
-	.2byte	0x711
-	.4byte	0xf6ea
+	.2byte	0x768
+	.4byte	0xf6e4
 	.uleb128 0x54
-	.4byte	0x1341d
+	.4byte	0x134f1
 	.uleb128 0x54
-	.4byte	0x13414
+	.4byte	0x134e8
 	.uleb128 0x56
-	.8byte	.LBB1608
-	.8byte	.LBE1608-.LBB1608
+	.8byte	.LBB1606
+	.8byte	.LBE1606-.LBB1606
 	.uleb128 0x5f
-	.4byte	0x13426
+	.4byte	0x134fa
 	.4byte	.LLST126
 	.uleb128 0x5f
-	.4byte	0x13430
+	.4byte	0x13504
 	.4byte	.LLST127
 	.byte	0
 	.byte	0
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xd80
-	.4byte	0xf717
+	.4byte	.Ldebug_ranges0+0xd50
+	.4byte	0xf711
 	.uleb128 0x5f
-	.4byte	0xfd45
+	.4byte	0xfd3f
 	.4byte	.LLST128
 	.uleb128 0x4e
 	.8byte	.LVL520
-	.4byte	0x13b18
+	.4byte	0x13bf4
 	.uleb128 0x4e
 	.8byte	.LVL522
-	.4byte	0x13b24
+	.4byte	0x13c00
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13408
-	.8byte	.LBB1611
-	.8byte	.LBE1611-.LBB1611
+	.4byte	0x134dc
+	.8byte	.LBB1609
+	.8byte	.LBE1609-.LBB1609
 	.byte	0x1
-	.2byte	0x71a
-	.4byte	0xf762
+	.2byte	0x771
+	.4byte	0xf75c
 	.uleb128 0x54
-	.4byte	0x1341d
+	.4byte	0x134f1
 	.uleb128 0x54
-	.4byte	0x13414
+	.4byte	0x134e8
 	.uleb128 0x56
-	.8byte	.LBB1612
-	.8byte	.LBE1612-.LBB1612
+	.8byte	.LBB1610
+	.8byte	.LBE1610-.LBB1610
 	.uleb128 0x5f
-	.4byte	0x13426
+	.4byte	0x134fa
 	.4byte	.LLST129
 	.uleb128 0x5f
-	.4byte	0x13430
+	.4byte	0x13504
 	.4byte	.LLST130
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL514
-	.4byte	0x13b18
+	.4byte	0x13bf4
 	.uleb128 0x4e
 	.8byte	.LVL515
-	.4byte	0x13b31
+	.4byte	0x13c0d
 	.uleb128 0x4e
 	.8byte	.LVL523
-	.4byte	0x13b31
+	.4byte	0x13c0d
 	.uleb128 0x4e
 	.8byte	.LVL598
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL602
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0xfd01
-	.8byte	.LBB1615
-	.8byte	.LBE1615-.LBB1615
+	.4byte	0xfcfb
+	.8byte	.LBB1613
+	.8byte	.LBE1613-.LBB1613
 	.byte	0x1
-	.2byte	0x7e9
-	.4byte	0xf83f
+	.2byte	0x840
+	.4byte	0xf839
 	.uleb128 0x54
-	.4byte	0xfd0e
+	.4byte	0xfd08
 	.uleb128 0x5a
-	.4byte	0x12d9f
-	.8byte	.LBB1617
-	.4byte	.Ldebug_ranges0+0xdb0
+	.4byte	0x12e73
+	.8byte	.LBB1615
+	.4byte	.Ldebug_ranges0+0xd80
 	.byte	0x1
-	.2byte	0x72a
-	.4byte	0xf80a
+	.2byte	0x781
+	.4byte	0xf804
 	.uleb128 0x54
-	.4byte	0x12dc1
+	.4byte	0x12e95
 	.uleb128 0x54
-	.4byte	0x12db6
+	.4byte	0x12e8a
 	.uleb128 0x54
-	.4byte	0x12dab
+	.4byte	0x12e7f
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xdb0
+	.4byte	.Ldebug_ranges0+0xd80
 	.uleb128 0x5f
-	.4byte	0x12dcc
+	.4byte	0x12ea0
 	.4byte	.LLST131
 	.uleb128 0x4e
 	.8byte	.LVL530
-	.4byte	0x13b3e
+	.4byte	0x13c1a
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL531
-	.4byte	0x13b4a
+	.4byte	0x13c26
 	.uleb128 0x4e
 	.8byte	.LVL532
-	.4byte	0x13b56
+	.4byte	0x13c32
 	.uleb128 0x4e
 	.8byte	.LVL533
-	.4byte	0x13b4a
+	.4byte	0x13c26
 	.uleb128 0x4e
 	.8byte	.LVL534
-	.4byte	0x13b56
+	.4byte	0x13c32
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0xfc5f
-	.8byte	.LBB1627
-	.4byte	.Ldebug_ranges0+0xe10
+	.4byte	0xfc59
+	.8byte	.LBB1625
+	.4byte	.Ldebug_ranges0+0xde0
 	.byte	0x1
-	.2byte	0x7ec
-	.4byte	0xfae2
+	.2byte	0x843
+	.4byte	0xfadc
 	.uleb128 0x54
-	.4byte	0xfc7c
+	.4byte	0xfc76
 	.uleb128 0x54
-	.4byte	0xfc70
+	.4byte	0xfc6a
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xe10
+	.4byte	.Ldebug_ranges0+0xde0
 	.uleb128 0x57
-	.4byte	0xfc88
+	.4byte	0xfc82
 	.uleb128 0x5f
-	.4byte	0xfc94
+	.4byte	0xfc8e
 	.4byte	.LLST132
 	.uleb128 0x5f
-	.4byte	0xfca0
+	.4byte	0xfc9a
 	.4byte	.LLST133
 	.uleb128 0x5f
-	.4byte	0xfcac
+	.4byte	0xfca6
 	.4byte	.LLST134
 	.uleb128 0x5f
-	.4byte	0xfcb8
+	.4byte	0xfcb2
 	.4byte	.LLST135
 	.uleb128 0x5f
-	.4byte	0xfcc4
+	.4byte	0xfcbe
 	.4byte	.LLST136
 	.uleb128 0x5f
-	.4byte	0xfcd0
+	.4byte	0xfcca
 	.4byte	.LLST137
 	.uleb128 0x57
-	.4byte	0xfcdc
+	.4byte	0xfcd6
 	.uleb128 0x5f
-	.4byte	0xfce8
+	.4byte	0xfce2
 	.4byte	.LLST138
 	.uleb128 0x5f
-	.4byte	0xfcf4
+	.4byte	0xfcee
 	.4byte	.LLST139
 	.uleb128 0x53
-	.4byte	0x11654
-	.8byte	.LBB1629
-	.8byte	.LBE1629-.LBB1629
+	.4byte	0x1164e
+	.8byte	.LBB1627
+	.8byte	.LBE1627-.LBB1627
 	.byte	0x1
-	.2byte	0x762
-	.4byte	0xf921
+	.2byte	0x7b9
+	.4byte	0xf91b
 	.uleb128 0x54
-	.4byte	0x11665
+	.4byte	0x1165f
 	.uleb128 0x54
-	.4byte	0x11665
+	.4byte	0x1165f
 	.uleb128 0x56
-	.8byte	.LBB1630
-	.8byte	.LBE1630-.LBB1630
+	.8byte	.LBB1628
+	.8byte	.LBE1628-.LBB1628
 	.uleb128 0x5f
-	.4byte	0x11671
+	.4byte	0x1166b
 	.4byte	.LLST140
 	.uleb128 0x4e
 	.8byte	.LVL551
-	.4byte	0x13b62
+	.4byte	0x13c3e
 	.uleb128 0x4e
 	.8byte	.LVL553
-	.4byte	0x13ae7
+	.4byte	0x13bc3
 	.uleb128 0x4e
 	.8byte	.LVL554
-	.4byte	0x13b6e
+	.4byte	0x13c4a
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12f1c
-	.8byte	.LBB1631
-	.8byte	.LBE1631-.LBB1631
+	.4byte	0x12ff0
+	.8byte	.LBB1629
+	.8byte	.LBE1629-.LBB1629
 	.byte	0x1
-	.2byte	0x748
-	.4byte	0xf978
+	.2byte	0x79f
+	.4byte	0xf972
 	.uleb128 0x54
-	.4byte	0x12f39
+	.4byte	0x1300d
 	.uleb128 0x54
-	.4byte	0x12f2d
+	.4byte	0x13001
 	.uleb128 0x5c
-	.4byte	0x12f46
-	.8byte	.LBB1632
-	.8byte	.LBE1632-.LBB1632
+	.4byte	0x1301a
+	.8byte	.LBB1630
+	.8byte	.LBE1630-.LBB1630
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x12f63
+	.4byte	0x13037
 	.uleb128 0x54
-	.4byte	0x12f57
+	.4byte	0x1302b
 	.uleb128 0x4e
 	.8byte	.LVL567
-	.4byte	0x13b7a
+	.4byte	0x13c56
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12f1c
-	.8byte	.LBB1634
-	.8byte	.LBE1634-.LBB1634
+	.4byte	0x12ff0
+	.8byte	.LBB1632
+	.8byte	.LBE1632-.LBB1632
 	.byte	0x1
-	.2byte	0x756
-	.4byte	0xf9cf
+	.2byte	0x7ad
+	.4byte	0xf9c9
 	.uleb128 0x54
-	.4byte	0x12f39
+	.4byte	0x1300d
 	.uleb128 0x54
-	.4byte	0x12f2d
+	.4byte	0x13001
 	.uleb128 0x5c
-	.4byte	0x12f46
-	.8byte	.LBB1635
-	.8byte	.LBE1635-.LBB1635
+	.4byte	0x1301a
+	.8byte	.LBB1633
+	.8byte	.LBE1633-.LBB1633
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x12f63
+	.4byte	0x13037
 	.uleb128 0x54
-	.4byte	0x12f57
+	.4byte	0x1302b
 	.uleb128 0x4e
 	.8byte	.LVL582
-	.4byte	0x13b7a
+	.4byte	0x13c56
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL536
-	.4byte	0x13b87
+	.4byte	0x13c63
 	.uleb128 0x4e
 	.8byte	.LVL538
-	.4byte	0x13b87
+	.4byte	0x13c63
 	.uleb128 0x4e
 	.8byte	.LVL540
-	.4byte	0x13b93
+	.4byte	0x13c6f
 	.uleb128 0x4e
 	.8byte	.LVL545
-	.4byte	0x13b93
+	.4byte	0x13c6f
 	.uleb128 0x4e
 	.8byte	.LVL549
-	.4byte	0x13a79
+	.4byte	0x13b55
 	.uleb128 0x4e
 	.8byte	.LVL550
-	.4byte	0x13ba0
+	.4byte	0x13c7c
 	.uleb128 0x4e
 	.8byte	.LVL555
-	.4byte	0x13bac
+	.4byte	0x13c88
 	.uleb128 0x4e
 	.8byte	.LVL556
-	.4byte	0x13bac
+	.4byte	0x13c88
 	.uleb128 0x4e
 	.8byte	.LVL566
-	.4byte	0x13a79
+	.4byte	0x13b55
 	.uleb128 0x4e
 	.8byte	.LVL571
-	.4byte	0x13bb8
+	.4byte	0x13c94
 	.uleb128 0x4e
 	.8byte	.LVL574
-	.4byte	0x13b62
+	.4byte	0x13c3e
 	.uleb128 0x4e
 	.8byte	.LVL576
-	.4byte	0x13bb8
+	.4byte	0x13c94
 	.uleb128 0x4e
 	.8byte	.LVL577
-	.4byte	0x13b6e
+	.4byte	0x13c4a
 	.uleb128 0x4e
 	.8byte	.LVL579
-	.4byte	0x13bc2
+	.4byte	0x13c9e
 	.uleb128 0x4e
 	.8byte	.LVL581
-	.4byte	0x13a79
+	.4byte	0x13b55
 	.uleb128 0x4e
 	.8byte	.LVL585
-	.4byte	0x13bb8
+	.4byte	0x13c94
 	.uleb128 0x4e
 	.8byte	.LVL588
-	.4byte	0x13b62
+	.4byte	0x13c3e
 	.uleb128 0x4e
 	.8byte	.LVL590
-	.4byte	0x13bb8
+	.4byte	0x13c94
 	.uleb128 0x4e
 	.8byte	.LVL591
-	.4byte	0x13b6e
+	.4byte	0x13c4a
 	.uleb128 0x4e
 	.8byte	.LVL618
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL621
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12ff0
-	.8byte	.LBB1640
-	.8byte	.LBE1640-.LBB1640
+	.4byte	0x130c4
+	.8byte	.LBB1638
+	.8byte	.LBE1638-.LBB1638
 	.byte	0x1
-	.2byte	0x7ee
-	.4byte	0xfb2b
+	.2byte	0x845
+	.4byte	0xfb25
 	.uleb128 0x54
-	.4byte	0x13007
+	.4byte	0x130db
 	.uleb128 0x54
-	.4byte	0x12ffc
+	.4byte	0x130d0
 	.uleb128 0x5b
-	.4byte	0x130f2
-	.8byte	.LBB1641
-	.8byte	.LBE1641-.LBB1641
+	.4byte	0x131c6
+	.8byte	.LBB1639
+	.8byte	.LBE1639-.LBB1639
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x54
-	.4byte	0x1310b
+	.4byte	0x131df
 	.uleb128 0x54
-	.4byte	0x130ff
+	.4byte	0x131d3
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0xfe53
-	.8byte	.LBB1643
-	.8byte	.LBE1643-.LBB1643
+	.4byte	0xfe4d
+	.8byte	.LBB1641
+	.8byte	.LBE1641-.LBB1641
 	.byte	0x1
-	.2byte	0x7f1
-	.4byte	0xfba8
+	.2byte	0x848
+	.4byte	0xfba2
 	.uleb128 0x54
-	.4byte	0xfe64
+	.4byte	0xfe5e
 	.uleb128 0x4e
 	.8byte	.LVL557
-	.4byte	0x13bce
+	.4byte	0x13caa
 	.uleb128 0x4e
 	.8byte	.LVL558
-	.4byte	0x13bda
+	.4byte	0x13cb6
 	.uleb128 0x4e
 	.8byte	.LVL559
-	.4byte	0x13bda
+	.4byte	0x13cb6
 	.uleb128 0x4e
 	.8byte	.LVL560
-	.4byte	0x13bda
+	.4byte	0x13cb6
 	.uleb128 0x4e
 	.8byte	.LVL561
-	.4byte	0x13bda
+	.4byte	0x13cb6
 	.uleb128 0x4e
 	.8byte	.LVL562
-	.4byte	0x13bda
+	.4byte	0x13cb6
 	.uleb128 0x4e
 	.8byte	.LVL563
-	.4byte	0x13bda
+	.4byte	0x13cb6
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL454
-	.4byte	0x13aac
+	.4byte	0x13b88
 	.uleb128 0x4e
 	.8byte	.LVL455
-	.4byte	0x13be7
+	.4byte	0x13cc3
 	.uleb128 0x4e
 	.8byte	.LVL457
-	.4byte	0x13aac
+	.4byte	0x13b88
 	.uleb128 0x4e
 	.8byte	.LVL458
-	.4byte	0x13bf3
+	.4byte	0x13ccf
 	.uleb128 0x4e
 	.8byte	.LVL495
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL497
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL504
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL564
-	.4byte	0x13a79
+	.4byte	0x13b55
 	.uleb128 0x4e
 	.8byte	.LVL599
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL606
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL607
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL608
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL612
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL616
-	.4byte	0x13c00
+	.4byte	0x13cdc
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3036
+	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0x736
+	.2byte	0x78d
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfd01
+	.4byte	0xfcfb
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x736
-	.4byte	0xe461
+	.2byte	0x78d
+	.4byte	0xe45b
 	.uleb128 0x64
-	.4byte	.LASF2995
+	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x736
-	.4byte	0xe123
+	.2byte	0x78d
+	.4byte	0xe11d
 	.uleb128 0x46
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x738
-	.4byte	0xe710
+	.2byte	0x78f
+	.4byte	0xe70a
 	.uleb128 0x46
-	.4byte	.LASF3028
+	.4byte	.LASF3027
 	.byte	0x1
-	.2byte	0x739
+	.2byte	0x790
 	.4byte	0x6d
 	.uleb128 0x46
-	.4byte	.LASF3029
+	.4byte	.LASF3028
 	.byte	0x1
-	.2byte	0x73a
+	.2byte	0x791
 	.4byte	0x6d
 	.uleb128 0x46
-	.4byte	.LASF3030
+	.4byte	.LASF3029
 	.byte	0x1
-	.2byte	0x73b
+	.2byte	0x792
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3031
+	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0x73c
+	.2byte	0x793
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3032
+	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0x73d
+	.2byte	0x794
 	.4byte	0x219
 	.uleb128 0x46
-	.4byte	.LASF3033
+	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0x73e
+	.2byte	0x795
 	.4byte	0x219
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x73f
-	.4byte	0xe3fc
+	.2byte	0x796
+	.4byte	0xe3f6
 	.uleb128 0x46
-	.4byte	.LASF3034
+	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0x740
+	.2byte	0x797
 	.4byte	0x443
 	.uleb128 0x46
-	.4byte	.LASF3035
+	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0x741
+	.2byte	0x798
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3093
+	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x71f
+	.2byte	0x776
 	.byte	0x1
-	.4byte	0xfd1b
+	.4byte	0xfd15
 	.uleb128 0x64
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x71f
-	.4byte	0xe710
+	.2byte	0x776
+	.4byte	0xe70a
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3037
+	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0x705
+	.2byte	0x75c
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfd53
+	.4byte	0xfd4d
 	.uleb128 0x64
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x705
-	.4byte	0xe710
+	.2byte	0x75c
+	.4byte	0xe70a
 	.uleb128 0x46
 	.4byte	.LASF2463
 	.byte	0x1
-	.2byte	0x707
+	.2byte	0x75e
 	.4byte	0xd7e9
 	.uleb128 0x66
 	.uleb128 0x52
 	.string	"__k"
 	.byte	0x1
-	.2byte	0x714
+	.2byte	0x76b
 	.4byte	0x2eda
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3038
+	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0x6bc
+	.2byte	0x713
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfdcd
+	.4byte	0xfdc7
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x6bc
-	.4byte	0xe461
+	.2byte	0x713
+	.4byte	0xe45b
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x6be
+	.2byte	0x715
 	.4byte	0xa545
 	.uleb128 0x46
-	.4byte	.LASF2995
+	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x6bf
-	.4byte	0xe123
+	.2byte	0x716
+	.4byte	0xe11d
 	.uleb128 0x46
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x6c0
-	.4byte	0xe710
+	.2byte	0x717
+	.4byte	0xe70a
 	.uleb128 0x46
-	.4byte	.LASF3039
+	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0x6c1
+	.2byte	0x718
 	.4byte	0xb869
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x6c2
+	.2byte	0x719
 	.4byte	0x9721
 	.uleb128 0x46
-	.4byte	.LASF3040
+	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0x6c3
+	.2byte	0x71a
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x6c4
+	.2byte	0x71b
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x6c4
+	.2byte	0x71b
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3041
+	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0x693
+	.2byte	0x6ea
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe3e
+	.4byte	0xfe38
 	.uleb128 0x64
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x693
-	.4byte	0xe710
+	.2byte	0x6ea
+	.4byte	0xe70a
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x695
+	.2byte	0x6ec
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x696
+	.2byte	0x6ed
 	.4byte	0xa545
 	.uleb128 0x46
-	.4byte	.LASF3039
+	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0x697
+	.2byte	0x6ee
 	.4byte	0xb869
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x698
+	.2byte	0x6ef
 	.4byte	0x9721
 	.uleb128 0x46
-	.4byte	.LASF3042
+	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0x699
+	.2byte	0x6f0
 	.4byte	0x29
 	.uleb128 0x46
-	.4byte	.LASF3043
+	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0x69a
+	.2byte	0x6f1
 	.4byte	0xc6
 	.uleb128 0x67
-	.4byte	.LASF3020
-	.4byte	0xfe4e
-	.4byte	.LASF3041
+	.4byte	.LASF3019
+	.4byte	0xfe48
+	.4byte	.LASF3040
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xfe4e
+	.4byte	0xfe48
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x12
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xfe3e
+	.4byte	0xfe38
 	.uleb128 0x62
-	.4byte	.LASF3044
+	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0x685
+	.2byte	0x6dc
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe71
+	.4byte	0xfe6b
 	.uleb128 0x64
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x685
-	.4byte	0xe710
+	.2byte	0x6dc
+	.4byte	0xe70a
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3045
+	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0x67c
+	.2byte	0x6d3
 	.4byte	0x2d9
-	.8byte	.LFB2833
-	.8byte	.LFE2833-.LFB2833
+	.8byte	.LFB2834
+	.8byte	.LFE2834-.LFB2834
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfed1
+	.4byte	0xfecb
 	.uleb128 0x58
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x67c
+	.2byte	0x6d3
 	.4byte	0xa545
 	.4byte	.LLST71
 	.uleb128 0x58
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x67d
+	.2byte	0x6d4
 	.4byte	0xb3c0
 	.4byte	.LLST72
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x67e
+	.2byte	0x6d5
 	.4byte	0x219
 	.4byte	.LLST73
 	.uleb128 0x4e
 	.8byte	.LVL271
-	.4byte	0x13c0a
+	.4byte	0x13ce6
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3046
+	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0x673
+	.2byte	0x6ca
 	.4byte	0x2d9
-	.8byte	.LFB2832
-	.8byte	.LFE2832-.LFB2832
+	.8byte	.LFB2833
+	.8byte	.LFE2833-.LFB2833
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xff31
+	.4byte	0xff2b
 	.uleb128 0x58
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x673
+	.2byte	0x6ca
 	.4byte	0xa545
 	.4byte	.LLST74
 	.uleb128 0x58
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x674
+	.2byte	0x6cb
 	.4byte	0xb3c0
 	.4byte	.LLST75
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x675
+	.2byte	0x6cc
 	.4byte	0x219
 	.4byte	.LLST76
 	.uleb128 0x4e
 	.8byte	.LVL276
-	.4byte	0x13c0a
+	.4byte	0x13ce6
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3047
+	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0x65b
+	.2byte	0x6b2
 	.4byte	0x2d9
-	.8byte	.LFB2831
-	.8byte	.LFE2831-.LFB2831
+	.8byte	.LFB2832
+	.8byte	.LFE2832-.LFB2832
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10001
+	.4byte	0xfffb
 	.uleb128 0x58
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x65b
+	.2byte	0x6b2
 	.4byte	0xa545
 	.4byte	.LLST86
 	.uleb128 0x58
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x65c
+	.2byte	0x6b3
 	.4byte	0xb3c0
 	.4byte	.LLST87
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x65d
+	.2byte	0x6b4
 	.4byte	0x56
 	.4byte	.LLST88
 	.uleb128 0x58
 	.4byte	.LASF380
 	.byte	0x1
-	.2byte	0x65d
+	.2byte	0x6b4
 	.4byte	0x2ce
 	.4byte	.LLST89
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x65f
-	.4byte	0xe461
+	.2byte	0x6b6
+	.4byte	0xe45b
 	.4byte	.LLST90
 	.uleb128 0x59
 	.4byte	.LASF2453
 	.byte	0x1
-	.2byte	0x660
+	.2byte	0x6b7
 	.4byte	0xc6
 	.4byte	.LLST91
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x660
+	.2byte	0x6b7
 	.4byte	0xc6
 	.uleb128 0x4e
 	.8byte	.LVL302
-	.4byte	0x13c17
+	.4byte	0x13cf3
 	.uleb128 0x4e
 	.8byte	.LVL304
-	.4byte	0x13c24
+	.4byte	0x13d00
 	.uleb128 0x4e
 	.8byte	.LVL309
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL312
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL313
-	.4byte	0x13c00
+	.4byte	0x13cdc
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3048
+	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0x64f
+	.2byte	0x6a6
 	.4byte	0x2d9
-	.8byte	.LFB2830
-	.8byte	.LFE2830-.LFB2830
+	.8byte	.LFB2831
+	.8byte	.LFE2831-.LFB2831
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1009b
+	.4byte	0x10095
 	.uleb128 0x58
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x64f
+	.2byte	0x6a6
 	.4byte	0xa545
 	.4byte	.LLST77
 	.uleb128 0x58
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x650
+	.2byte	0x6a7
 	.4byte	0xb3c0
 	.4byte	.LLST78
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x651
+	.2byte	0x6a8
 	.4byte	0x219
 	.4byte	.LLST79
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x653
-	.4byte	0xe461
+	.2byte	0x6aa
+	.4byte	0xe45b
 	.uleb128 0x46
 	.4byte	.LASF2453
 	.byte	0x1
-	.2byte	0x654
+	.2byte	0x6ab
 	.4byte	0xc6
 	.uleb128 0x53
-	.4byte	0x12cc8
+	.4byte	0x12d9c
 	.8byte	.LBB1190
 	.8byte	.LBE1190-.LBB1190
 	.byte	0x1
-	.2byte	0x656
-	.4byte	0x1008d
+	.2byte	0x6ad
+	.4byte	0x10087
 	.uleb128 0x54
-	.4byte	0x12cd8
+	.4byte	0x12dac
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL281
-	.4byte	0x13c0a
+	.4byte	0x13ce6
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3049
+	.4byte	.LASF3048
 	.byte	0x1
-	.2byte	0x641
+	.2byte	0x698
 	.4byte	0x2d9
-	.8byte	.LFB2829
-	.8byte	.LFE2829-.LFB2829
+	.8byte	.LFB2830
+	.8byte	.LFE2830-.LFB2830
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10144
+	.4byte	0x1013e
 	.uleb128 0x58
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x641
+	.2byte	0x698
 	.4byte	0xa545
 	.4byte	.LLST80
 	.uleb128 0x58
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x642
+	.2byte	0x699
 	.4byte	0xb3c0
 	.4byte	.LLST81
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x643
+	.2byte	0x69a
 	.4byte	0x219
 	.4byte	.LLST82
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x645
-	.4byte	0xe461
+	.2byte	0x69c
+	.4byte	0xe45b
 	.uleb128 0x69
 	.string	"t"
 	.byte	0x1
-	.2byte	0x646
+	.2byte	0x69d
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x5a
-	.4byte	0x12ce4
+	.4byte	0x12db8
 	.8byte	.LBB1192
 	.4byte	.Ldebug_ranges0+0x6a0
 	.byte	0x1
-	.2byte	0x648
-	.4byte	0x10129
+	.2byte	0x69f
+	.4byte	0x10123
 	.uleb128 0x54
-	.4byte	0x12cff
+	.4byte	0x12dd3
 	.uleb128 0x54
-	.4byte	0x12cf4
+	.4byte	0x12dc8
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL288
-	.4byte	0x13c0a
+	.4byte	0x13ce6
 	.uleb128 0x4e
 	.8byte	.LVL291
-	.4byte	0x13c00
+	.4byte	0x13cdc
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3050
+	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0x636
+	.2byte	0x68d
 	.4byte	0x2d9
-	.8byte	.LFB2828
-	.8byte	.LFE2828-.LFB2828
+	.8byte	.LFB2829
+	.8byte	.LFE2829-.LFB2829
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x101b0
+	.4byte	0x101aa
 	.uleb128 0x58
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x636
+	.2byte	0x68d
 	.4byte	0xa545
 	.4byte	.LLST83
 	.uleb128 0x58
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x637
+	.2byte	0x68e
 	.4byte	0xb3c0
 	.4byte	.LLST84
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x638
+	.2byte	0x68f
 	.4byte	0x219
 	.4byte	.LLST85
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x63a
-	.4byte	0xe461
+	.2byte	0x691
+	.4byte	0xe45b
 	.uleb128 0x4e
 	.8byte	.LVL296
-	.4byte	0x13c0a
+	.4byte	0x13ce6
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3051
+	.4byte	.LASF3050
 	.byte	0x1
-	.2byte	0x62b
+	.2byte	0x682
 	.4byte	0x2d9
-	.8byte	.LFB2827
-	.8byte	.LFE2827-.LFB2827
+	.8byte	.LFB2828
+	.8byte	.LFE2828-.LFB2828
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10229
+	.4byte	0x10223
 	.uleb128 0x58
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x62b
+	.2byte	0x682
 	.4byte	0xa545
 	.4byte	.LLST92
 	.uleb128 0x58
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x62c
+	.2byte	0x683
 	.4byte	0xb3c0
 	.4byte	.LLST93
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x62d
+	.2byte	0x684
 	.4byte	0x219
 	.4byte	.LLST94
 	.uleb128 0x46
-	.4byte	.LASF3052
+	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0x62f
+	.2byte	0x686
 	.4byte	0x56
 	.uleb128 0x4e
 	.8byte	.LVL315
-	.4byte	0x13c30
+	.4byte	0x13d0c
 	.uleb128 0x4e
 	.8byte	.LVL316
-	.4byte	0x13c0a
+	.4byte	0x13ce6
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3053
+	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0x614
+	.2byte	0x66b
 	.4byte	0xc6
-	.8byte	.LFB2826
-	.8byte	.LFE2826-.LFB2826
+	.8byte	.LFB2827
+	.8byte	.LFE2827-.LFB2827
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1026a
+	.4byte	0x10264
 	.uleb128 0x58
 	.4byte	.LASF415
 	.byte	0x1
-	.2byte	0x614
+	.2byte	0x66b
 	.4byte	0x1c54
 	.4byte	.LLST6
 	.uleb128 0x6a
 	.4byte	.LASF1270
 	.byte	0x1
-	.2byte	0x614
+	.2byte	0x66b
 	.4byte	0x5531
 	.uleb128 0x1
 	.byte	0x51
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3054
+	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0x605
+	.2byte	0x65c
 	.4byte	0xc6
-	.8byte	.LFB2825
-	.8byte	.LFE2825-.LFB2825
+	.8byte	.LFB2826
+	.8byte	.LFE2826-.LFB2826
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x102d3
+	.4byte	0x102cd
 	.uleb128 0x58
 	.4byte	.LASF1270
 	.byte	0x1
-	.2byte	0x605
+	.2byte	0x65c
 	.4byte	0x5531
 	.4byte	.LLST10
 	.uleb128 0x51
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x605
+	.2byte	0x65c
 	.4byte	0x3c8a
 	.4byte	.LLST11
 	.uleb128 0x46
 	.4byte	.LASF881
 	.byte	0x1
-	.2byte	0x607
+	.2byte	0x65e
 	.4byte	0x29
 	.uleb128 0x4e
 	.8byte	.LVL46
-	.4byte	0x13c3c
+	.4byte	0x13d18
 	.uleb128 0x4e
 	.8byte	.LVL47
-	.4byte	0x13c48
+	.4byte	0x13d24
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3055
+	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0x53c
+	.2byte	0x593
 	.4byte	0x194
-	.8byte	.LFB2824
-	.8byte	.LFE2824-.LFB2824
+	.8byte	.LFB2825
+	.8byte	.LFE2825-.LFB2825
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1157b
+	.4byte	0x11575
 	.uleb128 0x58
 	.4byte	.LASF1270
 	.byte	0x1
-	.2byte	0x53c
+	.2byte	0x593
 	.4byte	0x5531
 	.4byte	.LLST12
 	.uleb128 0x51
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0x53c
+	.2byte	0x593
 	.4byte	0x6d
 	.4byte	.LLST13
 	.uleb128 0x51
 	.string	"arg"
 	.byte	0x1
-	.2byte	0x53c
+	.2byte	0x593
 	.4byte	0x29
 	.4byte	.LLST14
 	.uleb128 0x46
-	.4byte	.LASF3056
+	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0x53e
+	.2byte	0x595
 	.4byte	0x443
 	.uleb128 0x46
-	.4byte	.LASF2995
+	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x53f
-	.4byte	0xe123
+	.2byte	0x596
+	.4byte	0xe11d
 	.uleb128 0x46
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x540
-	.4byte	0xe710
+	.2byte	0x597
+	.4byte	0xe70a
 	.uleb128 0x4c
-	.4byte	.LASF3057
+	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0x541
-	.4byte	0xd9c9
+	.2byte	0x598
+	.4byte	0xd9c3
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 -56
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x542
-	.4byte	0xe3fc
+	.2byte	0x599
+	.4byte	0xe3f6
 	.uleb128 0x46
-	.4byte	.LASF3058
+	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0x543
+	.2byte	0x59a
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3059
+	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x544
+	.2byte	0x59b
 	.4byte	0x29
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x545
+	.2byte	0x59c
 	.4byte	0xc6
 	.uleb128 0x55
-	.4byte	.LASF3020
-	.4byte	0x1158b
+	.4byte	.LASF3019
+	.4byte	0x11585
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34848
+	.8byte	__func__.34862
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x1a0
-	.4byte	0x1043d
+	.4byte	0x10437
 	.uleb128 0x46
-	.4byte	.LASF3060
+	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x58f
+	.2byte	0x5e6
 	.4byte	0xc6
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x1a0
 	.uleb128 0x6b
-	.4byte	.LASF3072
+	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0x58f
+	.2byte	0x5e6
 	.8byte	.L127
 	.uleb128 0x4c
-	.4byte	.LASF3061
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x58f
+	.2byte	0x5e6
 	.4byte	0x14fd
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -96
 	.uleb128 0x46
-	.4byte	.LASF3060
+	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x58f
+	.2byte	0x5e6
 	.4byte	0x194
 	.uleb128 0x6c
 	.8byte	.LBB982
 	.8byte	.LBE982-.LBB982
-	.4byte	0x10421
+	.4byte	0x1041b
 	.uleb128 0x59
-	.4byte	.LASF3062
+	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x58f
+	.2byte	0x5e6
 	.4byte	0x194
 	.4byte	.LLST29
 	.uleb128 0x4e
 	.8byte	.LVL93
-	.4byte	0x13c55
+	.4byte	0x13d31
 	.uleb128 0x4e
 	.8byte	.LVL94
-	.4byte	0x13c61
+	.4byte	0x13d3d
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL91
-	.4byte	0x13c6e
+	.4byte	0x13d4a
 	.uleb128 0x4e
 	.8byte	.LVL95
-	.4byte	0x13c7a
+	.4byte	0x13d56
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12dd7
+	.4byte	0x12eab
 	.8byte	.LBB918
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x5f7
-	.4byte	0x1065d
+	.2byte	0x64e
+	.4byte	0x10657
 	.uleb128 0x54
-	.4byte	0x12dfc
+	.4byte	0x12ed0
 	.uleb128 0x54
-	.4byte	0x12df1
+	.4byte	0x12ec5
 	.uleb128 0x54
-	.4byte	0x12de7
+	.4byte	0x12ebb
 	.uleb128 0x6d
-	.4byte	0x12e35
+	.4byte	0x12f09
 	.8byte	.LBB919
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12e5a
+	.4byte	0x12f2e
 	.uleb128 0x54
-	.4byte	0x12e4f
+	.4byte	0x12f23
 	.uleb128 0x54
-	.4byte	0x12e45
+	.4byte	0x12f19
 	.uleb128 0x6e
-	.4byte	0x12ed2
+	.4byte	0x12fa6
 	.8byte	.LBB921
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10593
+	.4byte	0x1058d
 	.uleb128 0x54
-	.4byte	0x12eed
+	.4byte	0x12fc1
 	.uleb128 0x6f
-	.4byte	0x12ee2
+	.4byte	0x12fb6
 	.4byte	.LLST15
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x80
 	.uleb128 0x5f
-	.4byte	0x12ef8
+	.4byte	0x12fcc
 	.4byte	.LLST16
 	.uleb128 0x5f
-	.4byte	0x12f03
+	.4byte	0x12fd7
 	.4byte	.LLST17
 	.uleb128 0x70
-	.4byte	0x13326
+	.4byte	0x133fa
 	.8byte	.LBB923
 	.8byte	.LBE923-.LBB923
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x104f9
+	.4byte	0x104f3
 	.uleb128 0x56
 	.8byte	.LBB924
 	.8byte	.LBE924-.LBB924
 	.uleb128 0x5f
-	.4byte	0x13336
+	.4byte	0x1340a
 	.4byte	.LLST18
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x132fa
+	.4byte	0x133ce
 	.8byte	.LBB925
 	.8byte	.LBE925-.LBB925
 	.byte	0x6
 	.byte	0x55
-	.4byte	0x10541
+	.4byte	0x1053b
 	.uleb128 0x54
-	.4byte	0x13314
+	.4byte	0x133e8
 	.uleb128 0x54
-	.4byte	0x1330a
+	.4byte	0x133de
 	.uleb128 0x5b
-	.4byte	0x133dc
+	.4byte	0x134b0
 	.8byte	.LBB926
 	.8byte	.LBE926-.LBB926
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x133f6
+	.4byte	0x134ca
 	.uleb128 0x54
-	.4byte	0x133ec
+	.4byte	0x134c0
 	.byte	0
 	.byte	0
 	.uleb128 0x56
 	.8byte	.LBB928
 	.8byte	.LBE928-.LBB928
 	.uleb128 0x57
-	.4byte	0x12f0f
+	.4byte	0x12fe3
 	.uleb128 0x5b
-	.4byte	0x133aa
+	.4byte	0x1347e
 	.8byte	.LBB929
 	.8byte	.LBE929-.LBB929
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x133c5
+	.4byte	0x13499
 	.uleb128 0x54
-	.4byte	0x133ba
+	.4byte	0x1348e
 	.uleb128 0x56
 	.8byte	.LBB930
 	.8byte	.LBE930-.LBB930
 	.uleb128 0x57
-	.4byte	0x133d0
+	.4byte	0x134a4
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12e9e
+	.4byte	0x12f72
 	.8byte	.LBB935
 	.8byte	.LBE935-.LBB935
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x1064e
+	.4byte	0x10648
 	.uleb128 0x54
-	.4byte	0x12eae
+	.4byte	0x12f82
 	.uleb128 0x56
 	.8byte	.LBB936
 	.8byte	.LBE936-.LBB936
 	.uleb128 0x5f
-	.4byte	0x12eb9
+	.4byte	0x12f8d
 	.4byte	.LLST19
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xc0
-	.4byte	0x10619
+	.4byte	0x10613
 	.uleb128 0x5f
-	.4byte	0x12ec5
+	.4byte	0x12f99
 	.4byte	.LLST20
 	.uleb128 0x5b
-	.4byte	0x133aa
+	.4byte	0x1347e
 	.8byte	.LBB938
 	.8byte	.LBE938-.LBB938
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x133c5
+	.4byte	0x13499
 	.uleb128 0x54
-	.4byte	0x133ba
+	.4byte	0x1348e
 	.uleb128 0x56
 	.8byte	.LBB939
 	.8byte	.LBE939-.LBB939
 	.uleb128 0x57
-	.4byte	0x133d0
+	.4byte	0x134a4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13326
+	.4byte	0x133fa
 	.8byte	.LBB940
 	.8byte	.LBE940-.LBB940
 	.byte	0x6
@@ -39570,7 +39813,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB941
 	.8byte	.LBE941-.LBB941
 	.uleb128 0x5f
-	.4byte	0x13336
+	.4byte	0x1340a
 	.4byte	.LLST21
 	.byte	0
 	.byte	0
@@ -39578,162 +39821,162 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL121
-	.4byte	0x13c87
+	.4byte	0x13d63
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12e06
+	.4byte	0x12eda
 	.8byte	.LBB951
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
-	.2byte	0x57a
-	.4byte	0x10888
+	.2byte	0x5d1
+	.4byte	0x10882
 	.uleb128 0x54
-	.4byte	0x12e2b
+	.4byte	0x12eff
 	.uleb128 0x54
-	.4byte	0x12e20
+	.4byte	0x12ef4
 	.uleb128 0x54
-	.4byte	0x12e16
+	.4byte	0x12eea
 	.uleb128 0x6d
-	.4byte	0x12e64
+	.4byte	0x12f38
 	.8byte	.LBB952
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x12e89
+	.4byte	0x12f5d
 	.uleb128 0x54
-	.4byte	0x12e7e
+	.4byte	0x12f52
 	.uleb128 0x54
-	.4byte	0x12e74
+	.4byte	0x12f48
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x57
-	.4byte	0x12e92
+	.4byte	0x12f66
 	.uleb128 0x6e
-	.4byte	0x12ed2
+	.4byte	0x12fa6
 	.8byte	.LBB954
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x107bd
+	.4byte	0x107b7
 	.uleb128 0x54
-	.4byte	0x12eed
+	.4byte	0x12fc1
 	.uleb128 0x6f
-	.4byte	0x12ee2
+	.4byte	0x12fb6
 	.4byte	.LLST22
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x130
 	.uleb128 0x5f
-	.4byte	0x12ef8
+	.4byte	0x12fcc
 	.4byte	.LLST23
 	.uleb128 0x5f
-	.4byte	0x12f03
+	.4byte	0x12fd7
 	.4byte	.LLST24
 	.uleb128 0x70
-	.4byte	0x13326
+	.4byte	0x133fa
 	.8byte	.LBB956
 	.8byte	.LBE956-.LBB956
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10723
+	.4byte	0x1071d
 	.uleb128 0x56
 	.8byte	.LBB957
 	.8byte	.LBE957-.LBB957
 	.uleb128 0x5f
-	.4byte	0x13336
+	.4byte	0x1340a
 	.4byte	.LLST25
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB958
 	.8byte	.LBE958-.LBB958
-	.4byte	0x10777
+	.4byte	0x10771
 	.uleb128 0x57
-	.4byte	0x12f0f
+	.4byte	0x12fe3
 	.uleb128 0x5b
-	.4byte	0x133aa
+	.4byte	0x1347e
 	.8byte	.LBB959
 	.8byte	.LBE959-.LBB959
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x133c5
+	.4byte	0x13499
 	.uleb128 0x54
-	.4byte	0x133ba
+	.4byte	0x1348e
 	.uleb128 0x56
 	.8byte	.LBB960
 	.8byte	.LBE960-.LBB960
 	.uleb128 0x57
-	.4byte	0x133d0
+	.4byte	0x134a4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x132fa
+	.4byte	0x133ce
 	.8byte	.LBB961
 	.8byte	.LBE961-.LBB961
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13314
+	.4byte	0x133e8
 	.uleb128 0x54
-	.4byte	0x1330a
+	.4byte	0x133de
 	.uleb128 0x5b
-	.4byte	0x133dc
+	.4byte	0x134b0
 	.8byte	.LBB962
 	.8byte	.LBE962-.LBB962
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x133f6
+	.4byte	0x134ca
 	.uleb128 0x54
-	.4byte	0x133ec
+	.4byte	0x134c0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12e9e
+	.4byte	0x12f72
 	.8byte	.LBB966
 	.8byte	.LBE966-.LBB966
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10878
+	.4byte	0x10872
 	.uleb128 0x54
-	.4byte	0x12eae
+	.4byte	0x12f82
 	.uleb128 0x56
 	.8byte	.LBB967
 	.8byte	.LBE967-.LBB967
 	.uleb128 0x5f
-	.4byte	0x12eb9
+	.4byte	0x12f8d
 	.4byte	.LLST26
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x170
-	.4byte	0x10843
+	.4byte	0x1083d
 	.uleb128 0x5f
-	.4byte	0x12ec5
+	.4byte	0x12f99
 	.4byte	.LLST27
 	.uleb128 0x5b
-	.4byte	0x133aa
+	.4byte	0x1347e
 	.8byte	.LBB969
 	.8byte	.LBE969-.LBB969
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x133c5
+	.4byte	0x13499
 	.uleb128 0x54
-	.4byte	0x133ba
+	.4byte	0x1348e
 	.uleb128 0x56
 	.8byte	.LBB970
 	.8byte	.LBE970-.LBB970
 	.uleb128 0x57
-	.4byte	0x133d0
+	.4byte	0x134a4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13326
+	.4byte	0x133fa
 	.8byte	.LBB971
 	.8byte	.LBE971-.LBB971
 	.byte	0x6
@@ -39742,7 +39985,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB972
 	.8byte	.LBE972-.LBB972
 	.uleb128 0x5f
-	.4byte	0x13336
+	.4byte	0x1340a
 	.4byte	.LLST28
 	.byte	0
 	.byte	0
@@ -39750,163 +39993,163 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL86
-	.4byte	0x13c94
+	.4byte	0x13d70
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12e06
+	.4byte	0x12eda
 	.8byte	.LBB986
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
-	.2byte	0x596
-	.4byte	0x10ab3
+	.2byte	0x5ed
+	.4byte	0x10aad
 	.uleb128 0x54
-	.4byte	0x12e2b
+	.4byte	0x12eff
 	.uleb128 0x54
-	.4byte	0x12e20
+	.4byte	0x12ef4
 	.uleb128 0x54
-	.4byte	0x12e16
+	.4byte	0x12eea
 	.uleb128 0x6d
-	.4byte	0x12e64
+	.4byte	0x12f38
 	.8byte	.LBB987
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x12e89
+	.4byte	0x12f5d
 	.uleb128 0x54
-	.4byte	0x12e7e
+	.4byte	0x12f52
 	.uleb128 0x54
-	.4byte	0x12e74
+	.4byte	0x12f48
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x1f0
 	.uleb128 0x57
-	.4byte	0x12e92
+	.4byte	0x12f66
 	.uleb128 0x6e
-	.4byte	0x12ed2
+	.4byte	0x12fa6
 	.8byte	.LBB989
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x109e8
+	.4byte	0x109e2
 	.uleb128 0x54
-	.4byte	0x12eed
+	.4byte	0x12fc1
 	.uleb128 0x6f
-	.4byte	0x12ee2
+	.4byte	0x12fb6
 	.4byte	.LLST30
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x230
 	.uleb128 0x5f
-	.4byte	0x12ef8
+	.4byte	0x12fcc
 	.4byte	.LLST31
 	.uleb128 0x5f
-	.4byte	0x12f03
+	.4byte	0x12fd7
 	.4byte	.LLST32
 	.uleb128 0x70
-	.4byte	0x13326
+	.4byte	0x133fa
 	.8byte	.LBB991
 	.8byte	.LBE991-.LBB991
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x1094e
+	.4byte	0x10948
 	.uleb128 0x56
 	.8byte	.LBB992
 	.8byte	.LBE992-.LBB992
 	.uleb128 0x5f
-	.4byte	0x13336
+	.4byte	0x1340a
 	.4byte	.LLST33
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB993
 	.8byte	.LBE993-.LBB993
-	.4byte	0x109a2
+	.4byte	0x1099c
 	.uleb128 0x57
-	.4byte	0x12f0f
+	.4byte	0x12fe3
 	.uleb128 0x5b
-	.4byte	0x133aa
+	.4byte	0x1347e
 	.8byte	.LBB994
 	.8byte	.LBE994-.LBB994
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x133c5
+	.4byte	0x13499
 	.uleb128 0x54
-	.4byte	0x133ba
+	.4byte	0x1348e
 	.uleb128 0x56
 	.8byte	.LBB995
 	.8byte	.LBE995-.LBB995
 	.uleb128 0x57
-	.4byte	0x133d0
+	.4byte	0x134a4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x132fa
+	.4byte	0x133ce
 	.8byte	.LBB996
 	.8byte	.LBE996-.LBB996
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13314
+	.4byte	0x133e8
 	.uleb128 0x54
-	.4byte	0x1330a
+	.4byte	0x133de
 	.uleb128 0x5b
-	.4byte	0x133dc
+	.4byte	0x134b0
 	.8byte	.LBB997
 	.8byte	.LBE997-.LBB997
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x133f6
+	.4byte	0x134ca
 	.uleb128 0x54
-	.4byte	0x133ec
+	.4byte	0x134c0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12e9e
+	.4byte	0x12f72
 	.8byte	.LBB1001
 	.8byte	.LBE1001-.LBB1001
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10aa3
+	.4byte	0x10a9d
 	.uleb128 0x54
-	.4byte	0x12eae
+	.4byte	0x12f82
 	.uleb128 0x56
 	.8byte	.LBB1002
 	.8byte	.LBE1002-.LBB1002
 	.uleb128 0x5f
-	.4byte	0x12eb9
+	.4byte	0x12f8d
 	.4byte	.LLST34
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x270
-	.4byte	0x10a6e
+	.4byte	0x10a68
 	.uleb128 0x5f
-	.4byte	0x12ec5
+	.4byte	0x12f99
 	.4byte	.LLST35
 	.uleb128 0x5b
-	.4byte	0x133aa
+	.4byte	0x1347e
 	.8byte	.LBB1004
 	.8byte	.LBE1004-.LBB1004
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x133c5
+	.4byte	0x13499
 	.uleb128 0x54
-	.4byte	0x133ba
+	.4byte	0x1348e
 	.uleb128 0x56
 	.8byte	.LBB1005
 	.8byte	.LBE1005-.LBB1005
 	.uleb128 0x57
-	.4byte	0x133d0
+	.4byte	0x134a4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13326
+	.4byte	0x133fa
 	.8byte	.LBB1006
 	.8byte	.LBE1006-.LBB1006
 	.byte	0x6
@@ -39915,7 +40158,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1007
 	.8byte	.LBE1007-.LBB1007
 	.uleb128 0x5f
-	.4byte	0x13336
+	.4byte	0x1340a
 	.4byte	.LLST36
 	.byte	0
 	.byte	0
@@ -39923,159 +40166,159 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL110
-	.4byte	0x13c94
+	.4byte	0x13d70
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12dd7
+	.4byte	0x12eab
 	.8byte	.LBB1016
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
-	.2byte	0x564
-	.4byte	0x10cd3
+	.2byte	0x5bb
+	.4byte	0x10ccd
 	.uleb128 0x54
-	.4byte	0x12dfc
+	.4byte	0x12ed0
 	.uleb128 0x54
-	.4byte	0x12df1
+	.4byte	0x12ec5
 	.uleb128 0x54
-	.4byte	0x12de7
+	.4byte	0x12ebb
 	.uleb128 0x6d
-	.4byte	0x12e35
+	.4byte	0x12f09
 	.8byte	.LBB1017
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12e5a
+	.4byte	0x12f2e
 	.uleb128 0x54
-	.4byte	0x12e4f
+	.4byte	0x12f23
 	.uleb128 0x54
-	.4byte	0x12e45
+	.4byte	0x12f19
 	.uleb128 0x6e
-	.4byte	0x12ed2
+	.4byte	0x12fa6
 	.8byte	.LBB1019
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10c09
+	.4byte	0x10c03
 	.uleb128 0x54
-	.4byte	0x12eed
+	.4byte	0x12fc1
 	.uleb128 0x6f
-	.4byte	0x12ee2
+	.4byte	0x12fb6
 	.4byte	.LLST37
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x2f0
 	.uleb128 0x5f
-	.4byte	0x12ef8
+	.4byte	0x12fcc
 	.4byte	.LLST38
 	.uleb128 0x5f
-	.4byte	0x12f03
+	.4byte	0x12fd7
 	.4byte	.LLST39
 	.uleb128 0x70
-	.4byte	0x13326
+	.4byte	0x133fa
 	.8byte	.LBB1021
 	.8byte	.LBE1021-.LBB1021
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10b6f
+	.4byte	0x10b69
 	.uleb128 0x56
 	.8byte	.LBB1022
 	.8byte	.LBE1022-.LBB1022
 	.uleb128 0x5f
-	.4byte	0x13336
+	.4byte	0x1340a
 	.4byte	.LLST40
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1023
 	.8byte	.LBE1023-.LBB1023
-	.4byte	0x10bc3
+	.4byte	0x10bbd
 	.uleb128 0x57
-	.4byte	0x12f0f
+	.4byte	0x12fe3
 	.uleb128 0x5b
-	.4byte	0x133aa
+	.4byte	0x1347e
 	.8byte	.LBB1024
 	.8byte	.LBE1024-.LBB1024
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x133c5
+	.4byte	0x13499
 	.uleb128 0x54
-	.4byte	0x133ba
+	.4byte	0x1348e
 	.uleb128 0x56
 	.8byte	.LBB1025
 	.8byte	.LBE1025-.LBB1025
 	.uleb128 0x57
-	.4byte	0x133d0
+	.4byte	0x134a4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x132fa
+	.4byte	0x133ce
 	.8byte	.LBB1026
 	.8byte	.LBE1026-.LBB1026
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13314
+	.4byte	0x133e8
 	.uleb128 0x54
-	.4byte	0x1330a
+	.4byte	0x133de
 	.uleb128 0x5b
-	.4byte	0x133dc
+	.4byte	0x134b0
 	.8byte	.LBB1027
 	.8byte	.LBE1027-.LBB1027
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x133f6
+	.4byte	0x134ca
 	.uleb128 0x54
-	.4byte	0x133ec
+	.4byte	0x134c0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12e9e
+	.4byte	0x12f72
 	.8byte	.LBB1033
 	.8byte	.LBE1033-.LBB1033
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x10cc4
+	.4byte	0x10cbe
 	.uleb128 0x54
-	.4byte	0x12eae
+	.4byte	0x12f82
 	.uleb128 0x56
 	.8byte	.LBB1034
 	.8byte	.LBE1034-.LBB1034
 	.uleb128 0x5f
-	.4byte	0x12eb9
+	.4byte	0x12f8d
 	.4byte	.LLST41
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x340
-	.4byte	0x10c8f
+	.4byte	0x10c89
 	.uleb128 0x5f
-	.4byte	0x12ec5
+	.4byte	0x12f99
 	.4byte	.LLST42
 	.uleb128 0x5b
-	.4byte	0x133aa
+	.4byte	0x1347e
 	.8byte	.LBB1036
 	.8byte	.LBE1036-.LBB1036
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x133c5
+	.4byte	0x13499
 	.uleb128 0x54
-	.4byte	0x133ba
+	.4byte	0x1348e
 	.uleb128 0x56
 	.8byte	.LBB1037
 	.8byte	.LBE1037-.LBB1037
 	.uleb128 0x57
-	.4byte	0x133d0
+	.4byte	0x134a4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13326
+	.4byte	0x133fa
 	.8byte	.LBB1038
 	.8byte	.LBE1038-.LBB1038
 	.byte	0x6
@@ -40084,7 +40327,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1039
 	.8byte	.LBE1039-.LBB1039
 	.uleb128 0x5f
-	.4byte	0x13336
+	.4byte	0x1340a
 	.4byte	.LLST43
 	.byte	0
 	.byte	0
@@ -40092,163 +40335,163 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL137
-	.4byte	0x13c87
+	.4byte	0x13d63
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12e06
+	.4byte	0x12eda
 	.8byte	.LBB1050
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
-	.2byte	0x5b3
-	.4byte	0x10f0f
+	.2byte	0x60a
+	.4byte	0x10f09
 	.uleb128 0x54
-	.4byte	0x12e2b
+	.4byte	0x12eff
 	.uleb128 0x54
-	.4byte	0x12e20
+	.4byte	0x12ef4
 	.uleb128 0x54
-	.4byte	0x12e16
+	.4byte	0x12eea
 	.uleb128 0x6d
-	.4byte	0x12e64
+	.4byte	0x12f38
 	.8byte	.LBB1051
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x12e89
+	.4byte	0x12f5d
 	.uleb128 0x54
-	.4byte	0x12e7e
+	.4byte	0x12f52
 	.uleb128 0x54
-	.4byte	0x12e74
+	.4byte	0x12f48
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x370
 	.uleb128 0x5f
-	.4byte	0x12e92
+	.4byte	0x12f66
 	.4byte	.LLST44
 	.uleb128 0x6e
-	.4byte	0x12ed2
+	.4byte	0x12fa6
 	.8byte	.LBB1053
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x10e37
+	.4byte	0x10e31
 	.uleb128 0x54
-	.4byte	0x12eed
+	.4byte	0x12fc1
 	.uleb128 0x6f
-	.4byte	0x12ee2
+	.4byte	0x12fb6
 	.4byte	.LLST45
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x5f
-	.4byte	0x12ef8
+	.4byte	0x12fcc
 	.4byte	.LLST46
 	.uleb128 0x5f
-	.4byte	0x12f03
+	.4byte	0x12fd7
 	.4byte	.LLST47
 	.uleb128 0x70
-	.4byte	0x13326
+	.4byte	0x133fa
 	.8byte	.LBB1055
 	.8byte	.LBE1055-.LBB1055
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10d9d
+	.4byte	0x10d97
 	.uleb128 0x56
 	.8byte	.LBB1056
 	.8byte	.LBE1056-.LBB1056
 	.uleb128 0x5f
-	.4byte	0x13336
+	.4byte	0x1340a
 	.4byte	.LLST48
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1057
 	.8byte	.LBE1057-.LBB1057
-	.4byte	0x10df1
+	.4byte	0x10deb
 	.uleb128 0x57
-	.4byte	0x12f0f
+	.4byte	0x12fe3
 	.uleb128 0x5b
-	.4byte	0x133aa
+	.4byte	0x1347e
 	.8byte	.LBB1058
 	.8byte	.LBE1058-.LBB1058
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x133c5
+	.4byte	0x13499
 	.uleb128 0x54
-	.4byte	0x133ba
+	.4byte	0x1348e
 	.uleb128 0x56
 	.8byte	.LBB1059
 	.8byte	.LBE1059-.LBB1059
 	.uleb128 0x57
-	.4byte	0x133d0
+	.4byte	0x134a4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x132fa
+	.4byte	0x133ce
 	.8byte	.LBB1060
 	.8byte	.LBE1060-.LBB1060
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13314
+	.4byte	0x133e8
 	.uleb128 0x54
-	.4byte	0x1330a
+	.4byte	0x133de
 	.uleb128 0x5b
-	.4byte	0x133dc
+	.4byte	0x134b0
 	.8byte	.LBB1061
 	.8byte	.LBE1061-.LBB1061
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x133f6
+	.4byte	0x134ca
 	.uleb128 0x54
-	.4byte	0x133ec
+	.4byte	0x134c0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12e9e
+	.4byte	0x12f72
 	.8byte	.LBB1067
 	.8byte	.LBE1067-.LBB1067
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10ef2
+	.4byte	0x10eec
 	.uleb128 0x54
-	.4byte	0x12eae
+	.4byte	0x12f82
 	.uleb128 0x56
 	.8byte	.LBB1068
 	.8byte	.LBE1068-.LBB1068
 	.uleb128 0x5f
-	.4byte	0x12eb9
+	.4byte	0x12f8d
 	.4byte	.LLST49
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x420
-	.4byte	0x10ebd
+	.4byte	0x10eb7
 	.uleb128 0x5f
-	.4byte	0x12ec5
+	.4byte	0x12f99
 	.4byte	.LLST50
 	.uleb128 0x5b
-	.4byte	0x133aa
+	.4byte	0x1347e
 	.8byte	.LBB1070
 	.8byte	.LBE1070-.LBB1070
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x133c5
+	.4byte	0x13499
 	.uleb128 0x54
-	.4byte	0x133ba
+	.4byte	0x1348e
 	.uleb128 0x56
 	.8byte	.LBB1071
 	.8byte	.LBE1071-.LBB1071
 	.uleb128 0x57
-	.4byte	0x133d0
+	.4byte	0x134a4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13326
+	.4byte	0x133fa
 	.8byte	.LBB1072
 	.8byte	.LBE1072-.LBB1072
 	.byte	0x6
@@ -40257,7 +40500,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1073
 	.8byte	.LBE1073-.LBB1073
 	.uleb128 0x5f
-	.4byte	0x13336
+	.4byte	0x1340a
 	.4byte	.LLST51
 	.byte	0
 	.byte	0
@@ -40265,59 +40508,59 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL149
-	.4byte	0x13c94
+	.4byte	0x13d70
 	.uleb128 0x4e
 	.8byte	.LVL227
-	.4byte	0x13add
+	.4byte	0x13bb9
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12dd7
+	.4byte	0x12eab
 	.8byte	.LBB1086
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
-	.2byte	0x5d0
-	.4byte	0x10fc1
+	.2byte	0x627
+	.4byte	0x10fbb
 	.uleb128 0x54
-	.4byte	0x12dfc
+	.4byte	0x12ed0
 	.uleb128 0x54
-	.4byte	0x12df1
+	.4byte	0x12ec5
 	.uleb128 0x54
-	.4byte	0x12de7
+	.4byte	0x12ebb
 	.uleb128 0x6d
-	.4byte	0x12e35
+	.4byte	0x12f09
 	.8byte	.LBB1087
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12e5a
+	.4byte	0x12f2e
 	.uleb128 0x54
-	.4byte	0x12e4f
+	.4byte	0x12f23
 	.uleb128 0x54
-	.4byte	0x12e45
+	.4byte	0x12f19
 	.uleb128 0x6d
-	.4byte	0x12ed2
+	.4byte	0x12fa6
 	.8byte	.LBB1089
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x54
-	.4byte	0x12eed
+	.4byte	0x12fc1
 	.uleb128 0x71
-	.4byte	0x12ee2
+	.4byte	0x12fb6
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x4b0
 	.uleb128 0x57
-	.4byte	0x12ef8
+	.4byte	0x12fcc
 	.uleb128 0x5f
-	.4byte	0x12f03
+	.4byte	0x12fd7
 	.4byte	.LLST52
 	.uleb128 0x5b
-	.4byte	0x13326
+	.4byte	0x133fa
 	.8byte	.LBB1091
 	.8byte	.LBE1091-.LBB1091
 	.byte	0x6
@@ -40326,7 +40569,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1092
 	.8byte	.LBE1092-.LBB1092
 	.uleb128 0x5f
-	.4byte	0x13336
+	.4byte	0x1340a
 	.4byte	.LLST53
 	.byte	0
 	.byte	0
@@ -40335,154 +40578,154 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12dd7
+	.4byte	0x12eab
 	.8byte	.LBB1098
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
-	.2byte	0x5c0
-	.4byte	0x111e1
+	.2byte	0x617
+	.4byte	0x111db
 	.uleb128 0x54
-	.4byte	0x12dfc
+	.4byte	0x12ed0
 	.uleb128 0x54
-	.4byte	0x12df1
+	.4byte	0x12ec5
 	.uleb128 0x54
-	.4byte	0x12de7
+	.4byte	0x12ebb
 	.uleb128 0x6d
-	.4byte	0x12e35
+	.4byte	0x12f09
 	.8byte	.LBB1099
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12e5a
+	.4byte	0x12f2e
 	.uleb128 0x54
-	.4byte	0x12e4f
+	.4byte	0x12f23
 	.uleb128 0x54
-	.4byte	0x12e45
+	.4byte	0x12f19
 	.uleb128 0x6e
-	.4byte	0x12ed2
+	.4byte	0x12fa6
 	.8byte	.LBB1101
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x11117
+	.4byte	0x11111
 	.uleb128 0x54
-	.4byte	0x12eed
+	.4byte	0x12fc1
 	.uleb128 0x6f
-	.4byte	0x12ee2
+	.4byte	0x12fb6
 	.4byte	.LLST54
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x540
 	.uleb128 0x5f
-	.4byte	0x12ef8
+	.4byte	0x12fcc
 	.4byte	.LLST55
 	.uleb128 0x5f
-	.4byte	0x12f03
+	.4byte	0x12fd7
 	.4byte	.LLST56
 	.uleb128 0x70
-	.4byte	0x13326
+	.4byte	0x133fa
 	.8byte	.LBB1103
 	.8byte	.LBE1103-.LBB1103
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x1107d
+	.4byte	0x11077
 	.uleb128 0x56
 	.8byte	.LBB1104
 	.8byte	.LBE1104-.LBB1104
 	.uleb128 0x5f
-	.4byte	0x13336
+	.4byte	0x1340a
 	.4byte	.LLST57
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1105
 	.8byte	.LBE1105-.LBB1105
-	.4byte	0x110d1
+	.4byte	0x110cb
 	.uleb128 0x57
-	.4byte	0x12f0f
+	.4byte	0x12fe3
 	.uleb128 0x5b
-	.4byte	0x133aa
+	.4byte	0x1347e
 	.8byte	.LBB1106
 	.8byte	.LBE1106-.LBB1106
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x133c5
+	.4byte	0x13499
 	.uleb128 0x54
-	.4byte	0x133ba
+	.4byte	0x1348e
 	.uleb128 0x56
 	.8byte	.LBB1107
 	.8byte	.LBE1107-.LBB1107
 	.uleb128 0x57
-	.4byte	0x133d0
+	.4byte	0x134a4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x132fa
+	.4byte	0x133ce
 	.8byte	.LBB1108
 	.8byte	.LBE1108-.LBB1108
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13314
+	.4byte	0x133e8
 	.uleb128 0x54
-	.4byte	0x1330a
+	.4byte	0x133de
 	.uleb128 0x5b
-	.4byte	0x133dc
+	.4byte	0x134b0
 	.8byte	.LBB1109
 	.8byte	.LBE1109-.LBB1109
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x133f6
+	.4byte	0x134ca
 	.uleb128 0x54
-	.4byte	0x133ec
+	.4byte	0x134c0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12e9e
+	.4byte	0x12f72
 	.8byte	.LBB1117
 	.8byte	.LBE1117-.LBB1117
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x111d2
+	.4byte	0x111cc
 	.uleb128 0x54
-	.4byte	0x12eae
+	.4byte	0x12f82
 	.uleb128 0x56
 	.8byte	.LBB1118
 	.8byte	.LBE1118-.LBB1118
 	.uleb128 0x5f
-	.4byte	0x12eb9
+	.4byte	0x12f8d
 	.4byte	.LLST58
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x590
-	.4byte	0x1119d
+	.4byte	0x11197
 	.uleb128 0x5f
-	.4byte	0x12ec5
+	.4byte	0x12f99
 	.4byte	.LLST59
 	.uleb128 0x5b
-	.4byte	0x133aa
+	.4byte	0x1347e
 	.8byte	.LBB1120
 	.8byte	.LBE1120-.LBB1120
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x133c5
+	.4byte	0x13499
 	.uleb128 0x54
-	.4byte	0x133ba
+	.4byte	0x1348e
 	.uleb128 0x56
 	.8byte	.LBB1121
 	.8byte	.LBE1121-.LBB1121
 	.uleb128 0x57
-	.4byte	0x133d0
+	.4byte	0x134a4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13326
+	.4byte	0x133fa
 	.8byte	.LBB1122
 	.8byte	.LBE1122-.LBB1122
 	.byte	0x6
@@ -40491,7 +40734,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1123
 	.8byte	.LBE1123-.LBB1123
 	.uleb128 0x5f
-	.4byte	0x13336
+	.4byte	0x1340a
 	.4byte	.LLST60
 	.byte	0
 	.byte	0
@@ -40499,158 +40742,158 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL210
-	.4byte	0x13c87
+	.4byte	0x13d63
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12dd7
+	.4byte	0x12eab
 	.8byte	.LBB1134
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
-	.2byte	0x572
-	.4byte	0x11401
+	.2byte	0x5c9
+	.4byte	0x113fb
 	.uleb128 0x54
-	.4byte	0x12dfc
+	.4byte	0x12ed0
 	.uleb128 0x54
-	.4byte	0x12df1
+	.4byte	0x12ec5
 	.uleb128 0x54
-	.4byte	0x12de7
+	.4byte	0x12ebb
 	.uleb128 0x6d
-	.4byte	0x12e35
+	.4byte	0x12f09
 	.8byte	.LBB1135
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12e5a
+	.4byte	0x12f2e
 	.uleb128 0x54
-	.4byte	0x12e4f
+	.4byte	0x12f23
 	.uleb128 0x54
-	.4byte	0x12e45
+	.4byte	0x12f19
 	.uleb128 0x6e
-	.4byte	0x12ed2
+	.4byte	0x12fa6
 	.8byte	.LBB1137
 	.4byte	.Ldebug_ranges0+0x620
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x11337
+	.4byte	0x11331
 	.uleb128 0x54
-	.4byte	0x12eed
+	.4byte	0x12fc1
 	.uleb128 0x6f
-	.4byte	0x12ee2
+	.4byte	0x12fb6
 	.4byte	.LLST61
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x620
 	.uleb128 0x5f
-	.4byte	0x12ef8
+	.4byte	0x12fcc
 	.4byte	.LLST62
 	.uleb128 0x5f
-	.4byte	0x12f03
+	.4byte	0x12fd7
 	.4byte	.LLST63
 	.uleb128 0x70
-	.4byte	0x13326
+	.4byte	0x133fa
 	.8byte	.LBB1139
 	.8byte	.LBE1139-.LBB1139
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x1129d
+	.4byte	0x11297
 	.uleb128 0x56
 	.8byte	.LBB1140
 	.8byte	.LBE1140-.LBB1140
 	.uleb128 0x5f
-	.4byte	0x13336
+	.4byte	0x1340a
 	.4byte	.LLST64
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1141
 	.8byte	.LBE1141-.LBB1141
-	.4byte	0x112f1
+	.4byte	0x112eb
 	.uleb128 0x57
-	.4byte	0x12f0f
+	.4byte	0x12fe3
 	.uleb128 0x5b
-	.4byte	0x133aa
+	.4byte	0x1347e
 	.8byte	.LBB1142
 	.8byte	.LBE1142-.LBB1142
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x133c5
+	.4byte	0x13499
 	.uleb128 0x54
-	.4byte	0x133ba
+	.4byte	0x1348e
 	.uleb128 0x56
 	.8byte	.LBB1143
 	.8byte	.LBE1143-.LBB1143
 	.uleb128 0x57
-	.4byte	0x133d0
+	.4byte	0x134a4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x132fa
+	.4byte	0x133ce
 	.8byte	.LBB1144
 	.8byte	.LBE1144-.LBB1144
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13314
+	.4byte	0x133e8
 	.uleb128 0x54
-	.4byte	0x1330a
+	.4byte	0x133de
 	.uleb128 0x5b
-	.4byte	0x133dc
+	.4byte	0x134b0
 	.8byte	.LBB1145
 	.8byte	.LBE1145-.LBB1145
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x133f6
+	.4byte	0x134ca
 	.uleb128 0x54
-	.4byte	0x133ec
+	.4byte	0x134c0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12e9e
+	.4byte	0x12f72
 	.8byte	.LBB1153
 	.8byte	.LBE1153-.LBB1153
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x113f2
+	.4byte	0x113ec
 	.uleb128 0x54
-	.4byte	0x12eae
+	.4byte	0x12f82
 	.uleb128 0x56
 	.8byte	.LBB1154
 	.8byte	.LBE1154-.LBB1154
 	.uleb128 0x5f
-	.4byte	0x12eb9
+	.4byte	0x12f8d
 	.4byte	.LLST65
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x670
-	.4byte	0x113bd
+	.4byte	0x113b7
 	.uleb128 0x5f
-	.4byte	0x12ec5
+	.4byte	0x12f99
 	.4byte	.LLST66
 	.uleb128 0x5b
-	.4byte	0x133aa
+	.4byte	0x1347e
 	.8byte	.LBB1156
 	.8byte	.LBE1156-.LBB1156
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x133c5
+	.4byte	0x13499
 	.uleb128 0x54
-	.4byte	0x133ba
+	.4byte	0x1348e
 	.uleb128 0x56
 	.8byte	.LBB1157
 	.8byte	.LBE1157-.LBB1157
 	.uleb128 0x57
-	.4byte	0x133d0
+	.4byte	0x134a4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	0x13326
+	.4byte	0x133fa
 	.8byte	.LBB1158
 	.8byte	.LBE1158-.LBB1158
 	.byte	0x6
@@ -40659,7 +40902,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1159
 	.8byte	.LBE1159-.LBB1159
 	.uleb128 0x5f
-	.4byte	0x13336
+	.4byte	0x1340a
 	.4byte	.LLST67
 	.byte	0
 	.byte	0
@@ -40667,1921 +40910,2013 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL218
-	.4byte	0x13c87
+	.4byte	0x13d63
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL51
-	.4byte	0x13b62
+	.4byte	0x13c3e
 	.uleb128 0x4e
 	.8byte	.LVL52
-	.4byte	0x13bb8
+	.4byte	0x13c94
 	.uleb128 0x4e
 	.8byte	.LVL53
-	.4byte	0x13c3c
+	.4byte	0x13d18
 	.uleb128 0x4e
 	.8byte	.LVL64
-	.4byte	0x13ca1
+	.4byte	0x13d7d
 	.uleb128 0x4e
 	.8byte	.LVL67
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL70
-	.4byte	0x13a79
+	.4byte	0x13b55
 	.uleb128 0x4e
 	.8byte	.LVL87
-	.4byte	0x13c3c
+	.4byte	0x13d18
 	.uleb128 0x4e
 	.8byte	.LVL88
-	.4byte	0x13cad
+	.4byte	0x13d89
 	.uleb128 0x4e
 	.8byte	.LVL90
-	.4byte	0x13b6e
+	.4byte	0x13c4a
 	.uleb128 0x4e
 	.8byte	.LVL97
-	.4byte	0x13b62
+	.4byte	0x13c3e
 	.uleb128 0x4e
 	.8byte	.LVL111
-	.4byte	0x13cb9
+	.4byte	0x13d95
 	.uleb128 0x4e
 	.8byte	.LVL112
-	.4byte	0x13b6e
+	.4byte	0x13c4a
 	.uleb128 0x4e
 	.8byte	.LVL113
-	.4byte	0x13bc2
+	.4byte	0x13c9e
 	.uleb128 0x4e
 	.8byte	.LVL123
-	.4byte	0x13cc5
+	.4byte	0x13da1
 	.uleb128 0x4e
 	.8byte	.LVL124
-	.4byte	0x13c3c
+	.4byte	0x13d18
 	.uleb128 0x4e
 	.8byte	.LVL151
-	.4byte	0x13a79
+	.4byte	0x13b55
 	.uleb128 0x4e
 	.8byte	.LVL154
-	.4byte	0x13a79
+	.4byte	0x13b55
 	.uleb128 0x4e
 	.8byte	.LVL156
-	.4byte	0x13b62
+	.4byte	0x13c3e
 	.uleb128 0x4e
 	.8byte	.LVL158
-	.4byte	0x13b62
+	.4byte	0x13c3e
 	.uleb128 0x4e
 	.8byte	.LVL159
-	.4byte	0x13bb8
+	.4byte	0x13c94
 	.uleb128 0x4e
 	.8byte	.LVL160
-	.4byte	0x13c3c
+	.4byte	0x13d18
 	.uleb128 0x4e
 	.8byte	.LVL173
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL176
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL178
-	.4byte	0x13b62
+	.4byte	0x13c3e
 	.uleb128 0x4e
 	.8byte	.LVL179
-	.4byte	0x13c3c
+	.4byte	0x13d18
 	.uleb128 0x4e
 	.8byte	.LVL187
-	.4byte	0x13ca1
+	.4byte	0x13d7d
 	.uleb128 0x4e
 	.8byte	.LVL221
-	.4byte	0x13bc2
+	.4byte	0x13c9e
 	.uleb128 0x4e
 	.8byte	.LVL228
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL229
-	.4byte	0x13c00
+	.4byte	0x13cdc
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0x1158b
+	.4byte	0x11585
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xa
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x1157b
+	.4byte	0x11575
 	.uleb128 0x62
-	.4byte	.LASF3063
+	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x4f9
+	.2byte	0x550
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x115ba
+	.4byte	0x115b4
 	.uleb128 0x64
-	.4byte	.LASF2995
+	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x4f9
-	.4byte	0xe123
+	.2byte	0x550
+	.4byte	0xe11d
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x4fb
+	.2byte	0x552
 	.4byte	0xa545
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3065
+	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x4f3
-	.8byte	.LFB2822
-	.8byte	.LFE2822-.LFB2822
+	.2byte	0x54a
+	.8byte	.LFB2823
+	.8byte	.LFE2823-.LFB2823
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x115f4
+	.4byte	0x115ee
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x4f3
+	.2byte	0x54a
 	.4byte	0x31a7
 	.4byte	.LLST68
 	.uleb128 0x4e
 	.8byte	.LVL242
-	.4byte	0x12063
+	.4byte	0x12050
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3066
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x4e7
-	.8byte	.LFB2821
-	.8byte	.LFE2821-.LFB2821
+	.2byte	0x53e
+	.8byte	.LFB2822
+	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11654
+	.4byte	0x1164e
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x4e7
+	.2byte	0x53e
 	.4byte	0x31a7
 	.4byte	.LLST8
 	.uleb128 0x46
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x4e9
-	.4byte	0xe710
+	.2byte	0x540
+	.4byte	0xe70a
 	.uleb128 0x5e
-	.4byte	0x12d69
+	.4byte	0x12e3d
 	.8byte	.LBB914
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.2byte	0x4ed
+	.2byte	0x544
 	.uleb128 0x54
-	.4byte	0x12d75
+	.4byte	0x12e49
 	.uleb128 0x4e
 	.8byte	.LVL41
-	.4byte	0x13cd1
+	.4byte	0x13dad
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3067
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x4d7
+	.2byte	0x52e
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1167e
+	.4byte	0x11678
 	.uleb128 0x64
-	.4byte	.LASF2995
+	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x4d7
-	.4byte	0xe123
+	.2byte	0x52e
+	.4byte	0xe11d
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x4d9
-	.4byte	0xe3fc
+	.2byte	0x530
+	.4byte	0xe3f6
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3068
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x39c
+	.2byte	0x3f8
 	.4byte	0xc6
-	.8byte	.LFB2819
-	.8byte	.LFE2819-.LFB2819
+	.8byte	.LFB2820
+	.8byte	.LFE2820-.LFB2820
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11e72
+	.4byte	0x11e5f
 	.uleb128 0x51
 	.string	"ptr"
 	.byte	0x1
-	.2byte	0x39c
+	.2byte	0x3f8
 	.4byte	0x443
-	.4byte	.LLST150
+	.4byte	.LLST155
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x39e
-	.4byte	0xe461
-	.4byte	.LLST151
+	.2byte	0x3fa
+	.4byte	0xe45b
+	.4byte	.LLST156
 	.uleb128 0x46
-	.4byte	.LASF2995
+	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x39f
-	.4byte	0xe123
+	.2byte	0x3fb
+	.4byte	0xe11d
 	.uleb128 0x46
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x3a0
-	.4byte	0xe710
+	.2byte	0x3fc
+	.4byte	0xe70a
 	.uleb128 0x68
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x3a1
-	.4byte	0xe3fc
-	.4byte	.LLST152
+	.2byte	0x3fd
+	.4byte	0xe3f6
+	.4byte	.LLST157
 	.uleb128 0x59
-	.4byte	.LASF3069
+	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x3a2
+	.2byte	0x3fe
 	.4byte	0xc6
-	.4byte	.LLST153
+	.4byte	.LLST158
 	.uleb128 0x59
-	.4byte	.LASF2965
+	.4byte	.LASF2964
 	.byte	0x1
-	.2byte	0x3a3
+	.2byte	0x3ff
 	.4byte	0xc6
-	.4byte	.LLST154
+	.4byte	.LLST159
 	.uleb128 0x4c
-	.4byte	.LASF3070
+	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0x3a4
+	.2byte	0x400
 	.4byte	0xd8bb
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -72
 	.uleb128 0x59
-	.4byte	.LASF3071
+	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0x3a5
-	.4byte	0xe3fc
-	.4byte	.LLST155
+	.2byte	0x401
+	.4byte	0xe3f6
+	.4byte	.LLST160
 	.uleb128 0x6b
-	.4byte	.LASF3073
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x4a7
-	.8byte	.L646
+	.2byte	0x4fe
+	.8byte	.L659
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xfd0
-	.4byte	0x117da
+	.4byte	.Ldebug_ranges0+0xf10
+	.4byte	0x117d4
 	.uleb128 0x46
-	.4byte	.LASF3060
+	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x3e4
+	.2byte	0x440
 	.4byte	0xc6
 	.uleb128 0x56
-	.8byte	.LBB1717
-	.8byte	.LBE1717-.LBB1717
+	.8byte	.LBB1704
+	.8byte	.LBE1704-.LBB1704
 	.uleb128 0x6b
-	.4byte	.LASF3072
+	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0x3e4
-	.8byte	.L628
+	.2byte	0x440
+	.8byte	.L641
 	.uleb128 0x4c
-	.4byte	.LASF3061
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x3e4
+	.2byte	0x440
 	.4byte	0x14fd
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3060
+	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x3e4
+	.2byte	0x440
 	.4byte	0x194
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x1000
-	.4byte	0x117be
+	.4byte	.Ldebug_ranges0+0xf40
+	.4byte	0x117b8
 	.uleb128 0x59
-	.4byte	.LASF3062
+	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x3e4
+	.2byte	0x440
 	.4byte	0x194
-	.4byte	.LLST170
+	.4byte	.LLST165
 	.uleb128 0x4e
-	.8byte	.LVL784
-	.4byte	0x13c55
+	.8byte	.LVL816
+	.4byte	0x13d31
 	.uleb128 0x4e
-	.8byte	.LVL785
-	.4byte	0x13c61
+	.8byte	.LVL817
+	.4byte	0x13d3d
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL782
-	.4byte	0x13c6e
+	.8byte	.LVL814
+	.4byte	0x13d4a
 	.uleb128 0x4e
-	.8byte	.LVL786
-	.4byte	0x13c7a
+	.8byte	.LVL818
+	.4byte	0x13d56
 	.byte	0
 	.byte	0
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xf10
-	.4byte	0x1187c
+	.4byte	.Ldebug_ranges0+0xeb0
+	.4byte	0x11876
 	.uleb128 0x46
-	.4byte	.LASF3060
+	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x496
+	.2byte	0x4ed
 	.4byte	0xc6
 	.uleb128 0x56
-	.8byte	.LBB1701
-	.8byte	.LBE1701-.LBB1701
+	.8byte	.LBB1697
+	.8byte	.LBE1697-.LBB1697
 	.uleb128 0x6b
-	.4byte	.LASF3072
+	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0x496
-	.8byte	.L683
+	.2byte	0x4ed
+	.8byte	.L699
 	.uleb128 0x4c
-	.4byte	.LASF3061
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x496
+	.2byte	0x4ed
 	.4byte	0x14fd
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3060
+	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x496
+	.2byte	0x4ed
 	.4byte	0x194
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xf40
-	.4byte	0x11860
+	.4byte	.Ldebug_ranges0+0xee0
+	.4byte	0x1185a
 	.uleb128 0x59
-	.4byte	.LASF3062
+	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x496
+	.2byte	0x4ed
 	.4byte	0x194
-	.4byte	.LLST158
+	.4byte	.LLST163
 	.uleb128 0x4e
-	.8byte	.LVL758
-	.4byte	0x13c55
+	.8byte	.LVL772
+	.4byte	0x13d31
 	.uleb128 0x4e
-	.8byte	.LVL759
-	.4byte	0x13c61
+	.8byte	.LVL773
+	.4byte	0x13d3d
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL756
-	.4byte	0x13c6e
+	.8byte	.LVL770
+	.4byte	0x13d4a
 	.uleb128 0x4e
-	.8byte	.LVL760
-	.4byte	0x13c7a
+	.8byte	.LVL774
+	.4byte	0x13d56
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1695
-	.8byte	.LBE1695-.LBB1695
-	.4byte	0x1192e
+	.8byte	.LBB1691
+	.8byte	.LBE1691-.LBB1691
+	.4byte	0x11928
 	.uleb128 0x46
-	.4byte	.LASF3060
+	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x4c3
+	.2byte	0x51a
 	.4byte	0xc6
 	.uleb128 0x56
-	.8byte	.LBB1696
-	.8byte	.LBE1696-.LBB1696
+	.8byte	.LBB1692
+	.8byte	.LBE1692-.LBB1692
 	.uleb128 0x72
-	.4byte	.LASF3072
+	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0x4c3
+	.2byte	0x51a
 	.uleb128 0x4c
-	.4byte	.LASF3061
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x4c3
+	.2byte	0x51a
 	.4byte	0x14fd
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3060
+	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x4c3
+	.2byte	0x51a
 	.4byte	0x194
 	.uleb128 0x6c
-	.8byte	.LBB1697
-	.8byte	.LBE1697-.LBB1697
-	.4byte	0x11912
+	.8byte	.LBB1693
+	.8byte	.LBE1693-.LBB1693
+	.4byte	0x1190c
 	.uleb128 0x59
-	.4byte	.LASF3062
+	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x4c3
+	.2byte	0x51a
 	.4byte	0x194
-	.4byte	.LLST157
+	.4byte	.LLST162
 	.uleb128 0x4e
-	.8byte	.LVL712
-	.4byte	0x13c55
+	.8byte	.LVL749
+	.4byte	0x13d31
 	.uleb128 0x4e
-	.8byte	.LVL713
-	.4byte	0x13c61
+	.8byte	.LVL750
+	.4byte	0x13d3d
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL710
-	.4byte	0x13c6e
+	.8byte	.LVL747
+	.4byte	0x13d4a
 	.uleb128 0x4e
-	.8byte	.LVL714
-	.4byte	0x13c7a
+	.8byte	.LVL751
+	.4byte	0x13d56
 	.byte	0
 	.byte	0
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xe90
-	.4byte	0x119c4
+	.4byte	.Ldebug_ranges0+0xe30
+	.4byte	0x119be
 	.uleb128 0x46
-	.4byte	.LASF3060
+	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x4cf
+	.2byte	0x526
 	.4byte	0xc6
 	.uleb128 0x5d
-	.4byte	.Ldebug_ranges0+0xe90
+	.4byte	.Ldebug_ranges0+0xe30
 	.uleb128 0x6b
-	.4byte	.LASF3072
+	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0x4cf
-	.8byte	.L699
+	.2byte	0x526
+	.8byte	.L715
 	.uleb128 0x4c
-	.4byte	.LASF3061
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x4cf
+	.2byte	0x526
 	.4byte	0x14fd
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3060
+	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x4cf
+	.2byte	0x526
 	.4byte	0x194
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xed0
-	.4byte	0x119a8
+	.4byte	.Ldebug_ranges0+0xe70
+	.4byte	0x119a2
 	.uleb128 0x59
-	.4byte	.LASF3062
+	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x4cf
+	.2byte	0x526
 	.4byte	0x194
-	.4byte	.LLST156
+	.4byte	.LLST161
 	.uleb128 0x4e
-	.8byte	.LVL677
-	.4byte	0x13c55
+	.8byte	.LVL700
+	.4byte	0x13d31
 	.uleb128 0x4e
-	.8byte	.LVL678
-	.4byte	0x13c61
+	.8byte	.LVL701
+	.4byte	0x13d3d
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL675
-	.4byte	0x13c6e
+	.8byte	.LVL698
+	.4byte	0x13d4a
 	.uleb128 0x4e
-	.8byte	.LVL679
-	.4byte	0x13c7a
+	.8byte	.LVL702
+	.4byte	0x13d56
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12a6f
-	.8byte	.LBB1698
-	.8byte	.LBE1698-.LBB1698
+	.4byte	0x12b43
+	.8byte	.LBB1694
+	.8byte	.LBE1694-.LBB1694
 	.byte	0x1
-	.2byte	0x4cc
-	.4byte	0x11a0f
+	.2byte	0x523
+	.4byte	0x11a09
 	.uleb128 0x54
-	.4byte	0x12a8a
+	.4byte	0x12b5e
 	.uleb128 0x54
-	.4byte	0x12a7f
+	.4byte	0x12b53
 	.uleb128 0x56
-	.8byte	.LBB1699
-	.8byte	.LBE1699-.LBB1699
+	.8byte	.LBB1695
+	.8byte	.LBE1695-.LBB1695
 	.uleb128 0x57
-	.4byte	0x12a95
+	.4byte	0x12b69
 	.uleb128 0x4e
-	.8byte	.LVL715
-	.4byte	0x138f9
+	.8byte	.LVL752
+	.4byte	0x139cd
+	.byte	0
+	.byte	0
+	.uleb128 0x53
+	.4byte	0x11e5f
+	.8byte	.LBB1700
+	.8byte	.LBE1700-.LBB1700
+	.byte	0x1
+	.2byte	0x4bc
+	.4byte	0x11a8f
+	.uleb128 0x54
+	.4byte	0x11e88
+	.uleb128 0x54
+	.4byte	0x11e7c
+	.uleb128 0x54
+	.4byte	0x11e70
+	.uleb128 0x56
+	.8byte	.LBB1701
+	.8byte	.LBE1701-.LBB1701
+	.uleb128 0x57
+	.4byte	0x11e94
+	.uleb128 0x57
+	.4byte	0x11e9e
+	.uleb128 0x57
+	.4byte	0x11eaa
+	.uleb128 0x57
+	.4byte	0x11eb6
+	.uleb128 0x5f
+	.4byte	0x11ec2
+	.4byte	.LLST164
+	.uleb128 0x57
+	.4byte	0x11ece
+	.uleb128 0x57
+	.4byte	0x11eda
+	.uleb128 0x73
+	.4byte	0x11ee6
+	.uleb128 0x56
+	.8byte	.LBB1702
+	.8byte	.LBE1702-.LBB1702
+	.uleb128 0x57
+	.4byte	0x11eef
+	.uleb128 0x57
+	.4byte	0x11efb
+	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x127fc
-	.8byte	.LBB1704
+	.4byte	0x127e9
+	.8byte	.LBB1708
 	.4byte	.Ldebug_ranges0+0xf70
 	.byte	0x1
-	.2byte	0x403
-	.4byte	0x11ad5
+	.2byte	0x45d
+	.4byte	0x11b55
 	.uleb128 0x54
-	.4byte	0x12839
+	.4byte	0x12826
 	.uleb128 0x54
-	.4byte	0x12839
+	.4byte	0x12826
 	.uleb128 0x54
-	.4byte	0x12839
+	.4byte	0x12826
 	.uleb128 0x54
-	.4byte	0x12845
+	.4byte	0x12832
 	.uleb128 0x54
-	.4byte	0x1282d
+	.4byte	0x1281a
 	.uleb128 0x54
-	.4byte	0x12821
+	.4byte	0x1280e
 	.uleb128 0x54
-	.4byte	0x12815
+	.4byte	0x12802
 	.uleb128 0x54
-	.4byte	0x12809
+	.4byte	0x127f6
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xf70
 	.uleb128 0x57
-	.4byte	0x12851
+	.4byte	0x1283e
 	.uleb128 0x5f
-	.4byte	0x1285d
-	.4byte	.LLST159
+	.4byte	0x1284a
+	.4byte	.LLST166
 	.uleb128 0x57
-	.4byte	0x12869
+	.4byte	0x12856
 	.uleb128 0x5f
-	.4byte	0x12875
-	.4byte	.LLST160
+	.4byte	0x12862
+	.4byte	.LLST167
 	.uleb128 0x5f
-	.4byte	0x12881
-	.4byte	.LLST161
-	.uleb128 0x57
-	.4byte	0x1288d
+	.4byte	0x1286e
+	.4byte	.LLST168
 	.uleb128 0x57
-	.4byte	0x12899
+	.4byte	0x1287a
 	.uleb128 0x57
-	.4byte	0x128a5
+	.4byte	0x12886
 	.uleb128 0x57
-	.4byte	0x128b1
+	.4byte	0x12892
 	.uleb128 0x5f
-	.4byte	0x128bd
-	.4byte	.LLST162
+	.4byte	0x1289e
+	.4byte	.LLST169
+	.uleb128 0x57
+	.4byte	0x128aa
 	.uleb128 0x5f
-	.4byte	0x128c9
-	.4byte	.LLST163
+	.4byte	0x128b6
+	.4byte	.LLST170
 	.uleb128 0x60
-	.4byte	0x128d5
+	.4byte	0x128c2
 	.uleb128 0x1
-	.byte	0x5f
-	.uleb128 0x5f
-	.4byte	0x128df
-	.4byte	.LLST164
+	.byte	0x60
 	.uleb128 0x5f
-	.4byte	0x128e9
-	.4byte	.LLST165
+	.4byte	0x128cc
+	.4byte	.LLST171
 	.uleb128 0x5f
-	.4byte	0x128f5
-	.4byte	.LLST166
+	.4byte	0x128d6
+	.4byte	.LLST172
 	.uleb128 0x5f
-	.4byte	0x12901
-	.4byte	.LLST167
+	.4byte	0x128e2
+	.4byte	.LLST173
 	.uleb128 0x5f
-	.4byte	0x1290d
-	.4byte	.LLST168
-	.byte	0
-	.byte	0
-	.uleb128 0x53
-	.4byte	0x11e72
-	.8byte	.LBB1713
-	.8byte	.LBE1713-.LBB1713
-	.byte	0x1
-	.2byte	0x465
-	.4byte	0x11b5b
-	.uleb128 0x54
-	.4byte	0x11e9b
-	.uleb128 0x54
-	.4byte	0x11e8f
-	.uleb128 0x54
-	.4byte	0x11e83
-	.uleb128 0x56
-	.8byte	.LBB1714
-	.8byte	.LBE1714-.LBB1714
-	.uleb128 0x57
-	.4byte	0x11ea7
-	.uleb128 0x57
-	.4byte	0x11eb1
-	.uleb128 0x57
-	.4byte	0x11ebd
-	.uleb128 0x57
-	.4byte	0x11ec9
+	.4byte	0x128ee
+	.4byte	.LLST174
 	.uleb128 0x5f
-	.4byte	0x11ed5
-	.4byte	.LLST169
-	.uleb128 0x57
-	.4byte	0x11ee1
-	.uleb128 0x57
-	.4byte	0x11eed
-	.uleb128 0x73
-	.4byte	0x11ef9
-	.uleb128 0x56
-	.8byte	.LBB1715
-	.8byte	.LBE1715-.LBB1715
-	.uleb128 0x57
-	.4byte	0x11f02
-	.uleb128 0x57
-	.4byte	0x11f0e
-	.byte	0
+	.4byte	0x128fa
+	.4byte	.LLST175
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12a6f
-	.8byte	.LBB1723
-	.8byte	.LBE1723-.LBB1723
+	.4byte	0x12b43
+	.8byte	.LBB1717
+	.8byte	.LBE1717-.LBB1717
 	.byte	0x1
-	.2byte	0x3aa
-	.4byte	0x11ba6
+	.2byte	0x406
+	.4byte	0x11ba0
 	.uleb128 0x54
-	.4byte	0x12a8a
+	.4byte	0x12b5e
 	.uleb128 0x54
-	.4byte	0x12a7f
+	.4byte	0x12b53
 	.uleb128 0x56
-	.8byte	.LBB1724
-	.8byte	.LBE1724-.LBB1724
+	.8byte	.LBB1718
+	.8byte	.LBE1718-.LBB1718
 	.uleb128 0x57
-	.4byte	0x12a95
+	.4byte	0x12b69
 	.uleb128 0x4e
-	.8byte	.LVL788
-	.4byte	0x138f9
+	.8byte	.LVL829
+	.4byte	0x139cd
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL662
-	.4byte	0x13cdd
-	.uleb128 0x4e
-	.8byte	.LVL663
-	.4byte	0x13ce9
-	.uleb128 0x4e
-	.8byte	.LVL664
-	.4byte	0x13ca1
-	.uleb128 0x4e
-	.8byte	.LVL682
-	.4byte	0x13cf5
-	.uleb128 0x4e
-	.8byte	.LVL683
-	.4byte	0x13bb8
-	.uleb128 0x4e
 	.8byte	.LVL684
-	.4byte	0x13ce9
+	.4byte	0x13db9
 	.uleb128 0x4e
 	.8byte	.LVL685
-	.4byte	0x13ca1
+	.4byte	0x13dc5
 	.uleb128 0x4e
 	.8byte	.LVL686
-	.4byte	0x1298c
-	.uleb128 0x4e
-	.8byte	.LVL687
-	.4byte	0x13d01
-	.uleb128 0x4e
-	.8byte	.LVL688
-	.4byte	0x13a79
-	.uleb128 0x4e
-	.8byte	.LVL689
-	.4byte	0x122f8
-	.uleb128 0x4e
-	.8byte	.LVL692
-	.4byte	0x13d0d
+	.4byte	0x13d7d
 	.uleb128 0x4e
-	.8byte	.LVL693
-	.4byte	0x13a79
-	.uleb128 0x4e
-	.8byte	.LVL694
-	.4byte	0x13b56
-	.uleb128 0x4e
-	.8byte	.LVL695
-	.4byte	0x13a79
-	.uleb128 0x4e
-	.8byte	.LVL699
-	.4byte	0x11f1c
+	.8byte	.LVL706
+	.4byte	0x13dd1
 	.uleb128 0x4e
-	.8byte	.LVL700
-	.4byte	0x13af3
+	.8byte	.LVL707
+	.4byte	0x13c94
 	.uleb128 0x4e
-	.8byte	.LVL702
-	.4byte	0x13ce9
+	.8byte	.LVL708
+	.4byte	0x13dc5
 	.uleb128 0x4e
-	.8byte	.LVL703
-	.4byte	0x13cf5
+	.8byte	.LVL709
+	.4byte	0x13d7d
 	.uleb128 0x4e
-	.8byte	.LVL704
-	.4byte	0x1298c
+	.8byte	.LVL710
+	.4byte	0x12a5e
 	.uleb128 0x4e
-	.8byte	.LVL705
-	.4byte	0x13d01
+	.8byte	.LVL711
+	.4byte	0x13ddd
 	.uleb128 0x4e
-	.8byte	.LVL706
-	.4byte	0x11f1c
+	.8byte	.LVL712
+	.4byte	0x13b55
 	.uleb128 0x4e
-	.8byte	.LVL709
-	.4byte	0x13ca1
+	.8byte	.LVL713
+	.4byte	0x122e5
 	.uleb128 0x4e
 	.8byte	.LVL716
-	.4byte	0x13af3
+	.4byte	0x13de9
 	.uleb128 0x4e
-	.8byte	.LVL718
-	.4byte	0x13a79
+	.8byte	.LVL717
+	.4byte	0x13b55
 	.uleb128 0x4e
 	.8byte	.LVL719
-	.4byte	0x13bc2
+	.4byte	0x13c32
+	.uleb128 0x4e
+	.8byte	.LVL720
+	.4byte	0x13b55
 	.uleb128 0x4e
 	.8byte	.LVL721
-	.4byte	0x139b3
+	.4byte	0x13dd1
 	.uleb128 0x4e
 	.8byte	.LVL722
-	.4byte	0x11f1c
+	.4byte	0x13c94
 	.uleb128 0x4e
 	.8byte	.LVL723
-	.4byte	0x13a79
+	.4byte	0x13c94
 	.uleb128 0x4e
 	.8byte	.LVL724
-	.4byte	0x122f8
+	.4byte	0x13ddd
 	.uleb128 0x4e
 	.8byte	.LVL725
-	.4byte	0x13b56
+	.4byte	0x11f09
+	.uleb128 0x4e
+	.8byte	.LVL727
+	.4byte	0x13b55
 	.uleb128 0x4e
 	.8byte	.LVL728
-	.4byte	0x13b56
+	.4byte	0x122e5
 	.uleb128 0x4e
-	.8byte	.LVL752
-	.4byte	0x13a79
+	.8byte	.LVL731
+	.4byte	0x13b55
 	.uleb128 0x4e
-	.8byte	.LVL755
-	.4byte	0x13a79
+	.8byte	.LVL732
+	.4byte	0x13c9e
 	.uleb128 0x4e
-	.8byte	.LVL761
-	.4byte	0x13b56
+	.8byte	.LVL733
+	.4byte	0x13dc5
 	.uleb128 0x4e
-	.8byte	.LVL763
-	.4byte	0x11f1c
+	.8byte	.LVL735
+	.4byte	0x13d7d
 	.uleb128 0x4e
-	.8byte	.LVL765
-	.4byte	0x13a79
+	.8byte	.LVL739
+	.4byte	0x11f09
 	.uleb128 0x4e
-	.8byte	.LVL766
-	.4byte	0x122f8
+	.8byte	.LVL740
+	.4byte	0x13bcf
 	.uleb128 0x4e
-	.8byte	.LVL769
-	.4byte	0x13a79
+	.8byte	.LVL742
+	.4byte	0x13dc5
 	.uleb128 0x4e
-	.8byte	.LVL770
-	.4byte	0x13d0d
+	.8byte	.LVL744
+	.4byte	0x13bcf
 	.uleb128 0x4e
-	.8byte	.LVL771
-	.4byte	0x13bc2
+	.8byte	.LVL755
+	.4byte	0x13b55
 	.uleb128 0x4e
-	.8byte	.LVL772
-	.4byte	0x13a79
+	.8byte	.LVL756
+	.4byte	0x122e5
 	.uleb128 0x4e
-	.8byte	.LVL773
-	.4byte	0x13ae7
+	.8byte	.LVL757
+	.4byte	0x13c32
 	.uleb128 0x4e
-	.8byte	.LVL774
-	.4byte	0x13bb8
+	.8byte	.LVL760
+	.4byte	0x13c32
 	.uleb128 0x4e
-	.8byte	.LVL775
-	.4byte	0x13bb8
+	.8byte	.LVL762
+	.4byte	0x13a8b
 	.uleb128 0x4e
-	.8byte	.LVL777
-	.4byte	0x13a79
+	.8byte	.LVL765
+	.4byte	0x13b55
 	.uleb128 0x4e
-	.8byte	.LVL778
-	.4byte	0x13af3
+	.8byte	.LVL768
+	.4byte	0x13b55
+	.uleb128 0x4e
+	.8byte	.LVL775
+	.4byte	0x13c32
 	.uleb128 0x4e
 	.8byte	.LVL779
-	.4byte	0x139b3
+	.4byte	0x13c94
 	.uleb128 0x4e
 	.8byte	.LVL780
-	.4byte	0x13bb8
+	.4byte	0x13c94
 	.uleb128 0x4e
-	.8byte	.LVL789
-	.4byte	0x13bb8
+	.8byte	.LVL781
+	.4byte	0x13c94
 	.uleb128 0x4e
-	.8byte	.LVL790
-	.4byte	0x13bb8
+	.8byte	.LVL803
+	.4byte	0x13b55
 	.uleb128 0x4e
-	.8byte	.LVL791
-	.4byte	0x13bb8
+	.8byte	.LVL804
+	.4byte	0x13de9
 	.uleb128 0x4e
-	.8byte	.LVL793
-	.4byte	0x139b3
+	.8byte	.LVL805
+	.4byte	0x13c9e
 	.uleb128 0x4e
-	.8byte	.LVL795
-	.4byte	0x139b3
+	.8byte	.LVL806
+	.4byte	0x13c94
 	.uleb128 0x4e
-	.8byte	.LVL796
-	.4byte	0x13c00
+	.8byte	.LVL807
+	.4byte	0x12997
+	.uleb128 0x4e
+	.8byte	.LVL809
+	.4byte	0x13b55
+	.uleb128 0x4e
+	.8byte	.LVL811
+	.4byte	0x13bcf
+	.uleb128 0x4e
+	.8byte	.LVL812
+	.4byte	0x13a8b
+	.uleb128 0x4e
+	.8byte	.LVL825
+	.4byte	0x11f09
+	.uleb128 0x4e
+	.8byte	.LVL827
+	.4byte	0x13b55
+	.uleb128 0x4e
+	.8byte	.LVL831
+	.4byte	0x13a8b
+	.uleb128 0x4e
+	.8byte	.LVL833
+	.4byte	0x13a8b
+	.uleb128 0x4e
+	.8byte	.LVL835
+	.4byte	0x13cdc
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3074
+	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0x37a
+	.2byte	0x3d6
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11f1c
+	.4byte	0x11f09
 	.uleb128 0x64
-	.4byte	.LASF3075
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x37a
+	.2byte	0x3d6
 	.4byte	0x4653
 	.uleb128 0x64
-	.4byte	.LASF3076
+	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x37a
+	.2byte	0x3d6
 	.4byte	0x4653
 	.uleb128 0x64
-	.4byte	.LASF3077
+	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0x37a
+	.2byte	0x3d6
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x37c
+	.2byte	0x3d8
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3078
+	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x37d
+	.2byte	0x3d9
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3079
+	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0x37d
+	.2byte	0x3d9
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3080
+	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0x37e
+	.2byte	0x3da
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3081
+	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0x37f
+	.2byte	0x3db
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3082
+	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0x380
+	.2byte	0x3dc
 	.4byte	0x4659
 	.uleb128 0x46
-	.4byte	.LASF3083
+	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0x381
+	.2byte	0x3dd
 	.4byte	0x4659
 	.uleb128 0x72
-	.4byte	.LASF3084
+	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0x398
+	.2byte	0x3f4
 	.uleb128 0x66
 	.uleb128 0x46
-	.4byte	.LASF3085
+	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0x390
+	.2byte	0x3ec
 	.4byte	0x10b
 	.uleb128 0x46
-	.4byte	.LASF3086
+	.4byte	.LASF3085
 	.byte	0x1
-	.2byte	0x390
+	.2byte	0x3ec
 	.4byte	0x10b
 	.byte	0
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3087
+	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0x324
+	.2byte	0x381
 	.4byte	0xc6
-	.8byte	.LFB2817
-	.8byte	.LFE2817-.LFB2817
+	.8byte	.LFB2818
+	.8byte	.LFE2818-.LFB2818
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12063
+	.4byte	0x12050
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x324
-	.4byte	0xe461
+	.2byte	0x381
+	.4byte	0xe45b
 	.4byte	.LLST69
 	.uleb128 0x46
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x326
-	.4byte	0xe710
+	.2byte	0x383
+	.4byte	0xe70a
 	.uleb128 0x59
-	.4byte	.LASF3088
+	.4byte	.LASF3087
 	.byte	0x1
-	.2byte	0x327
+	.2byte	0x384
 	.4byte	0xc6
 	.4byte	.LLST70
 	.uleb128 0x69
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x328
+	.2byte	0x385
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x64
 	.uleb128 0x53
-	.4byte	0x12ce4
+	.4byte	0x12db8
 	.8byte	.LBB1188
 	.8byte	.LBE1188-.LBB1188
 	.byte	0x1
-	.2byte	0x32b
-	.4byte	0x11f9f
+	.2byte	0x388
+	.4byte	0x11f8c
 	.uleb128 0x54
-	.4byte	0x12cff
+	.4byte	0x12dd3
 	.uleb128 0x54
-	.4byte	0x12cf4
+	.4byte	0x12dc8
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL248
-	.4byte	0x13a79
+	.4byte	0x13b55
 	.uleb128 0x4e
 	.8byte	.LVL249
-	.4byte	0x13d19
+	.4byte	0x13df5
 	.uleb128 0x4e
 	.8byte	.LVL252
-	.4byte	0x13d19
+	.4byte	0x13df5
 	.uleb128 0x4e
 	.8byte	.LVL253
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL255
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL256
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL258
-	.4byte	0x13d19
+	.4byte	0x13df5
 	.uleb128 0x4e
 	.8byte	.LVL259
-	.4byte	0x13d19
+	.4byte	0x13df5
 	.uleb128 0x4e
 	.8byte	.LVL260
-	.4byte	0x13d19
+	.4byte	0x13df5
 	.uleb128 0x4e
 	.8byte	.LVL261
-	.4byte	0x13d19
+	.4byte	0x13df5
 	.uleb128 0x4e
 	.8byte	.LVL262
-	.4byte	0x13d19
+	.4byte	0x13df5
 	.uleb128 0x4e
 	.8byte	.LVL263
-	.4byte	0x13d19
+	.4byte	0x13df5
 	.uleb128 0x4e
 	.8byte	.LVL264
-	.4byte	0x13d19
+	.4byte	0x13df5
 	.uleb128 0x4e
 	.8byte	.LVL265
-	.4byte	0x13af3
+	.4byte	0x13bcf
 	.uleb128 0x4e
 	.8byte	.LVL266
-	.4byte	0x13c00
+	.4byte	0x13cdc
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3089
+	.4byte	.LASF3088
 	.byte	0x1
-	.2byte	0x2fe
-	.8byte	.LFB2816
-	.8byte	.LFE2816-.LFB2816
+	.2byte	0x35c
+	.8byte	.LFB2817
+	.8byte	.LFE2817-.LFB2817
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1211c
+	.4byte	0x12109
 	.uleb128 0x46
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x300
-	.4byte	0xe710
+	.2byte	0x35e
+	.4byte	0xe70a
 	.uleb128 0x46
-	.4byte	.LASF2995
+	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x301
-	.4byte	0xe123
+	.2byte	0x35f
+	.4byte	0xe11d
 	.uleb128 0x4e
 	.8byte	.LVL231
-	.4byte	0x13b24
+	.4byte	0x13c00
 	.uleb128 0x4e
 	.8byte	.LVL232
-	.4byte	0x13a79
+	.4byte	0x13b55
 	.uleb128 0x4e
 	.8byte	.LVL233
-	.4byte	0x13bc2
+	.4byte	0x13c9e
 	.uleb128 0x4e
 	.8byte	.LVL234
-	.4byte	0x13bc2
+	.4byte	0x13c9e
 	.uleb128 0x4e
 	.8byte	.LVL235
-	.4byte	0x13a79
+	.4byte	0x13b55
 	.uleb128 0x4e
 	.8byte	.LVL236
-	.4byte	0x13add
+	.4byte	0x13bb9
 	.uleb128 0x4e
 	.8byte	.LVL237
-	.4byte	0x13b56
+	.4byte	0x13c32
 	.uleb128 0x4e
 	.8byte	.LVL238
-	.4byte	0x13bc2
+	.4byte	0x13c9e
 	.uleb128 0x4e
 	.8byte	.LVL239
-	.4byte	0x13bc2
+	.4byte	0x13c9e
 	.uleb128 0x4e
 	.8byte	.LVL240
-	.4byte	0x13b24
+	.4byte	0x13c00
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3090
+	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x2b7
+	.2byte	0x317
 	.4byte	0xc6
-	.8byte	.LFB2815
-	.8byte	.LFE2815-.LFB2815
+	.8byte	.LFB2816
+	.8byte	.LFE2816-.LFB2816
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x122e8
+	.4byte	0x122d5
 	.uleb128 0x58
 	.4byte	.LASF791
 	.byte	0x1
-	.2byte	0x2b7
+	.2byte	0x317
 	.4byte	0x443
 	.4byte	.LLST115
 	.uleb128 0x69
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x2b9
-	.4byte	0xe461
+	.2byte	0x319
+	.4byte	0xe45b
 	.uleb128 0x1
 	.byte	0x66
 	.uleb128 0x46
-	.4byte	.LASF2995
+	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x2ba
-	.4byte	0xe123
+	.2byte	0x31a
+	.4byte	0xe11d
 	.uleb128 0x46
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x2bb
-	.4byte	0xe710
+	.2byte	0x31b
+	.4byte	0xe70a
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x940
-	.4byte	0x12206
+	.4byte	0x121f3
 	.uleb128 0x3f
 	.byte	0x8
 	.byte	0x1
-	.2byte	0x2c2
-	.4byte	0x1219f
+	.2byte	0x322
+	.4byte	0x1218c
 	.uleb128 0x41
-	.4byte	.LASF3091
+	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x2c2
+	.2byte	0x322
 	.4byte	0x19b
 	.uleb128 0x3d
 	.string	"__c"
 	.byte	0x1
-	.2byte	0x2c2
-	.4byte	0x122e8
+	.2byte	0x322
+	.4byte	0x122d5
 	.byte	0
 	.uleb128 0x52
 	.string	"__u"
 	.byte	0x1
-	.2byte	0x2c2
-	.4byte	0x1217d
+	.2byte	0x322
+	.4byte	0x1216a
 	.uleb128 0x5a
-	.4byte	0x134c6
+	.4byte	0x1359a
 	.8byte	.LBB1277
 	.4byte	.Ldebug_ranges0+0x980
 	.byte	0x1
-	.2byte	0x2c2
-	.4byte	0x121d3
+	.2byte	0x322
+	.4byte	0x121c0
 	.uleb128 0x54
-	.4byte	0x134e6
+	.4byte	0x135ba
 	.uleb128 0x54
-	.4byte	0x134db
+	.4byte	0x135af
 	.uleb128 0x54
-	.4byte	0x134d2
+	.4byte	0x135a6
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x13326
+	.4byte	0x133fa
 	.8byte	.LBB1280
 	.8byte	.LBE1280-.LBB1280
 	.byte	0x1
-	.2byte	0x2c2
+	.2byte	0x322
 	.uleb128 0x56
 	.8byte	.LBB1281
 	.8byte	.LBE1281-.LBB1281
 	.uleb128 0x60
-	.4byte	0x13336
+	.4byte	0x1340a
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131c0
+	.4byte	0x13294
 	.8byte	.LBB1285
 	.8byte	.LBE1285-.LBB1285
 	.byte	0x1
-	.2byte	0x2f5
-	.4byte	0x12258
+	.2byte	0x353
+	.4byte	0x12245
 	.uleb128 0x54
-	.4byte	0x131d1
+	.4byte	0x132a5
 	.uleb128 0x5c
-	.4byte	0x131de
+	.4byte	0x132b2
 	.8byte	.LBB1287
 	.8byte	.LBE1287-.LBB1287
 	.byte	0xd
 	.2byte	0x240
 	.uleb128 0x54
-	.4byte	0x131fa
+	.4byte	0x132ce
 	.uleb128 0x54
-	.4byte	0x131ef
+	.4byte	0x132c3
 	.uleb128 0x4e
-	.8byte	.LVL427
-	.4byte	0x13d25
+	.8byte	.LVL429
+	.4byte	0x13e01
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL422
-	.4byte	0x13d32
+	.4byte	0x138ca
 	.uleb128 0x4e
 	.8byte	.LVL423
-	.4byte	0x13c55
+	.4byte	0x1268e
 	.uleb128 0x4e
 	.8byte	.LVL424
-	.4byte	0x13d3c
+	.4byte	0x13e0e
 	.uleb128 0x4e
 	.8byte	.LVL425
-	.4byte	0x126a1
+	.4byte	0x13d31
 	.uleb128 0x4e
 	.8byte	.LVL426
-	.4byte	0x137f6
+	.4byte	0x13e18
 	.uleb128 0x4e
-	.8byte	.LVL428
-	.4byte	0x137f6
+	.8byte	.LVL427
+	.4byte	0x138ca
 	.uleb128 0x4e
-	.8byte	.LVL429
-	.4byte	0x134f8
+	.8byte	.LVL428
+	.4byte	0x1370c
 	.uleb128 0x4e
 	.8byte	.LVL430
-	.4byte	0x137f6
+	.4byte	0x1268e
 	.uleb128 0x4e
 	.8byte	.LVL431
-	.4byte	0x126a1
+	.4byte	0x138ca
 	.uleb128 0x4e
 	.8byte	.LVL432
-	.4byte	0x137f6
+	.4byte	0x138ca
 	.uleb128 0x4e
 	.8byte	.LVL433
-	.4byte	0x13638
+	.4byte	0x135cc
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x122f8
+	.4byte	0x122e5
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3092
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x268
-	.8byte	.LFB2814
-	.8byte	.LFE2814-.LFB2814
+	.2byte	0x2c9
+	.8byte	.LFB2815
+	.8byte	.LFE2815-.LFB2815
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12497
+	.4byte	0x12484
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x268
-	.4byte	0xe461
+	.2byte	0x2c9
+	.4byte	0xe45b
 	.4byte	.LLST114
 	.uleb128 0x46
-	.4byte	.LASF2995
+	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x26a
-	.4byte	0xe123
+	.2byte	0x2cb
+	.4byte	0xe11d
 	.uleb128 0x46
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x26b
-	.4byte	0xe710
+	.2byte	0x2cc
+	.4byte	0xe70a
 	.uleb128 0x55
-	.4byte	.LASF3020
+	.4byte	.LASF3019
 	.4byte	0xb915
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34649
+	.8byte	__func__.34667
 	.uleb128 0x53
-	.4byte	0x12497
+	.4byte	0x12484
 	.8byte	.LBB1268
 	.8byte	.LBE1268-.LBB1268
 	.byte	0x1
-	.2byte	0x288
-	.4byte	0x12385
+	.2byte	0x2e8
+	.4byte	0x12372
 	.uleb128 0x54
-	.4byte	0x124b0
+	.4byte	0x1249d
 	.uleb128 0x54
-	.4byte	0x124a4
+	.4byte	0x12491
 	.uleb128 0x4e
 	.8byte	.LVL398
-	.4byte	0x137f6
+	.4byte	0x138ca
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12497
+	.4byte	0x12484
 	.8byte	.LBB1270
 	.8byte	.LBE1270-.LBB1270
 	.byte	0x1
-	.2byte	0x276
-	.4byte	0x123b9
+	.2byte	0x2fe
+	.4byte	0x123a6
 	.uleb128 0x54
-	.4byte	0x124b0
+	.4byte	0x1249d
 	.uleb128 0x54
-	.4byte	0x124a4
+	.4byte	0x12491
 	.uleb128 0x4e
 	.8byte	.LVL403
-	.4byte	0x137f6
+	.4byte	0x138ca
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12497
+	.4byte	0x12484
 	.8byte	.LBB1272
 	.8byte	.LBE1272-.LBB1272
 	.byte	0x1
-	.2byte	0x2ab
-	.4byte	0x123ed
+	.2byte	0x2d6
+	.4byte	0x123da
 	.uleb128 0x54
-	.4byte	0x124b0
+	.4byte	0x1249d
 	.uleb128 0x54
-	.4byte	0x124a4
+	.4byte	0x12491
 	.uleb128 0x4e
-	.8byte	.LVL407
-	.4byte	0x137f6
+	.8byte	.LVL408
+	.4byte	0x138ca
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12497
+	.4byte	0x12484
 	.8byte	.LBB1274
 	.8byte	.LBE1274-.LBB1274
 	.byte	0x1
-	.2byte	0x29e
-	.4byte	0x12421
+	.2byte	0x30b
+	.4byte	0x1240e
 	.uleb128 0x54
-	.4byte	0x124b0
+	.4byte	0x1249d
 	.uleb128 0x54
-	.4byte	0x124a4
+	.4byte	0x12491
 	.uleb128 0x4e
 	.8byte	.LVL412
-	.4byte	0x137f6
+	.4byte	0x138ca
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL397
-	.4byte	0x126a1
+	.4byte	0x1268e
 	.uleb128 0x4e
 	.8byte	.LVL399
-	.4byte	0x126a1
+	.4byte	0x1268e
 	.uleb128 0x4e
 	.8byte	.LVL402
-	.4byte	0x126a1
+	.4byte	0x1370c
 	.uleb128 0x4e
-	.8byte	.LVL406
-	.4byte	0x134f8
+	.8byte	.LVL404
+	.4byte	0x1370c
 	.uleb128 0x4e
-	.8byte	.LVL408
-	.4byte	0x134f8
+	.8byte	.LVL407
+	.4byte	0x1268e
 	.uleb128 0x4e
 	.8byte	.LVL411
-	.4byte	0x13638
+	.4byte	0x135cc
 	.uleb128 0x4e
 	.8byte	.LVL413
-	.4byte	0x13638
+	.4byte	0x135cc
 	.uleb128 0x4e
 	.8byte	.LVL416
-	.4byte	0x13d48
+	.4byte	0x13e24
 	.uleb128 0x4e
 	.8byte	.LVL417
-	.4byte	0x13d48
+	.4byte	0x13e24
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3094
+	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x262
+	.2byte	0x2c3
 	.byte	0x1
-	.4byte	0x124bd
+	.4byte	0x124aa
 	.uleb128 0x64
-	.4byte	.LASF2995
+	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x262
-	.4byte	0xe123
+	.2byte	0x2c3
+	.4byte	0xe11d
 	.uleb128 0x64
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x262
-	.4byte	0xe710
+	.2byte	0x2c3
+	.4byte	0xe70a
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3095
+	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x257
+	.2byte	0x2b8
 	.byte	0x1
-	.4byte	0x124ef
+	.4byte	0x124dc
 	.uleb128 0x64
-	.4byte	.LASF2995
+	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x257
-	.4byte	0xe123
+	.2byte	0x2b8
+	.4byte	0xe11d
 	.uleb128 0x64
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x257
-	.4byte	0xe710
+	.2byte	0x2b8
+	.4byte	0xe70a
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x259
-	.4byte	0x124ef
+	.2byte	0x2ba
+	.4byte	0x124dc
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdead
+	.4byte	0xdea7
 	.uleb128 0x65
-	.4byte	.LASF3096
+	.4byte	.LASF3095
 	.byte	0x1
-	.2byte	0x22d
+	.2byte	0x28e
 	.byte	0x1
-	.4byte	0x125cb
+	.4byte	0x125b8
 	.uleb128 0x64
-	.4byte	.LASF3097
+	.4byte	.LASF3096
 	.byte	0x1
-	.2byte	0x22d
+	.2byte	0x28e
 	.4byte	0xc097
 	.uleb128 0x64
-	.4byte	.LASF3098
+	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x22e
+	.2byte	0x28f
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3099
+	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x22e
+	.2byte	0x28f
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x22f
-	.4byte	0xe710
+	.2byte	0x290
+	.4byte	0xe70a
 	.uleb128 0x46
-	.4byte	.LASF2995
+	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x231
-	.4byte	0xe123
+	.2byte	0x292
+	.4byte	0xe11d
 	.uleb128 0x46
-	.4byte	.LASF3100
+	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x232
+	.2byte	0x293
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3101
+	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x232
+	.2byte	0x293
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3102
+	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x232
+	.2byte	0x293
 	.4byte	0x4659
 	.uleb128 0x46
-	.4byte	.LASF3103
+	.4byte	.LASF3102
 	.byte	0x1
-	.2byte	0x232
+	.2byte	0x293
 	.4byte	0x4659
 	.uleb128 0x46
-	.4byte	.LASF3104
+	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x233
+	.2byte	0x294
 	.4byte	0xc097
 	.uleb128 0x46
-	.4byte	.LASF2893
+	.4byte	.LASF2892
 	.byte	0x1
-	.2byte	0x234
+	.2byte	0x295
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF261
 	.byte	0x1
-	.2byte	0x234
+	.2byte	0x295
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x235
+	.2byte	0x296
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x235
+	.2byte	0x296
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3105
+	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x236
+	.2byte	0x297
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2854
 	.byte	0x1
-	.2byte	0x237
+	.2byte	0x298
 	.4byte	0xc097
 	.uleb128 0x46
-	.4byte	.LASF2939
+	.4byte	.LASF2938
 	.byte	0x1
-	.2byte	0x238
+	.2byte	0x299
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3106
+	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x207
+	.2byte	0x268
 	.byte	0x1
-	.4byte	0x126a1
+	.4byte	0x1268e
 	.uleb128 0x64
-	.4byte	.LASF3097
+	.4byte	.LASF3096
 	.byte	0x1
-	.2byte	0x207
+	.2byte	0x268
 	.4byte	0xc097
 	.uleb128 0x64
-	.4byte	.LASF3098
+	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x208
+	.2byte	0x269
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3099
+	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x208
+	.2byte	0x269
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x209
-	.4byte	0xe710
+	.2byte	0x26a
+	.4byte	0xe70a
 	.uleb128 0x46
-	.4byte	.LASF2995
+	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x20b
-	.4byte	0xe123
+	.2byte	0x26c
+	.4byte	0xe11d
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x20c
+	.2byte	0x26d
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x20c
+	.2byte	0x26d
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2893
+	.4byte	.LASF2892
 	.byte	0x1
-	.2byte	0x20d
+	.2byte	0x26e
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF261
 	.byte	0x1
-	.2byte	0x20e
+	.2byte	0x26f
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3100
+	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x20f
+	.2byte	0x270
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3101
+	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x20f
+	.2byte	0x270
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3102
+	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x20f
+	.2byte	0x270
 	.4byte	0x4659
 	.uleb128 0x46
-	.4byte	.LASF3103
+	.4byte	.LASF3102
 	.byte	0x1
-	.2byte	0x20f
+	.2byte	0x270
 	.4byte	0x4659
 	.uleb128 0x46
-	.4byte	.LASF3104
+	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x210
+	.2byte	0x271
 	.4byte	0xc097
 	.uleb128 0x46
-	.4byte	.LASF3105
+	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x211
+	.2byte	0x272
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2854
 	.byte	0x1
-	.2byte	0x212
+	.2byte	0x273
 	.4byte	0xc097
 	.uleb128 0x46
-	.4byte	.LASF2939
+	.4byte	.LASF2938
 	.byte	0x1
-	.2byte	0x213
+	.2byte	0x274
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3107
+	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x162
-	.8byte	.LFB2809
-	.8byte	.LFE2809-.LFB2809
+	.2byte	0x1c3
+	.8byte	.LFB2810
+	.8byte	.LFE2810-.LFB2810
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x127fc
+	.4byte	0x127e9
 	.uleb128 0x6a
-	.4byte	.LASF3097
+	.4byte	.LASF3096
 	.byte	0x1
-	.2byte	0x162
+	.2byte	0x1c3
 	.4byte	0xc097
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6a
-	.4byte	.LASF3098
+	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x162
+	.2byte	0x1c3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x6a
-	.4byte	.LASF3099
+	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x162
+	.2byte	0x1c3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x6a
-	.4byte	.LASF3108
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x163
+	.2byte	0x1c4
 	.4byte	0xc097
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x6a
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x163
-	.4byte	0xe710
+	.2byte	0x1c4
+	.4byte	0xe70a
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x46
-	.4byte	.LASF2995
+	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x165
-	.4byte	0xe123
+	.2byte	0x1c6
+	.4byte	0xe11d
 	.uleb128 0x68
 	.string	"i"
 	.byte	0x1
-	.2byte	0x166
+	.2byte	0x1c7
 	.4byte	0xc6
 	.4byte	.LLST0
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x167
+	.2byte	0x1c8
 	.4byte	0xc6
 	.uleb128 0x4c
-	.4byte	.LASF2893
+	.4byte	.LASF2892
 	.byte	0x1
-	.2byte	0x168
+	.2byte	0x1c9
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x61
 	.uleb128 0x59
 	.4byte	.LASF261
 	.byte	0x1
-	.2byte	0x169
+	.2byte	0x1ca
 	.4byte	0xc6
 	.4byte	.LLST1
 	.uleb128 0x59
-	.4byte	.LASF3100
+	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x16a
+	.2byte	0x1cb
 	.4byte	0x13a
 	.4byte	.LLST2
 	.uleb128 0x59
-	.4byte	.LASF3101
+	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x16a
+	.2byte	0x1cb
 	.4byte	0x13a
 	.4byte	.LLST3
 	.uleb128 0x4c
-	.4byte	.LASF3102
+	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x16b
+	.2byte	0x1cc
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4c
-	.4byte	.LASF3103
+	.4byte	.LASF3102
 	.byte	0x1
-	.2byte	0x16b
+	.2byte	0x1cc
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x59
-	.4byte	.LASF3104
+	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x16c
+	.2byte	0x1cd
 	.4byte	0xc097
 	.4byte	.LLST4
 	.uleb128 0x4c
-	.4byte	.LASF2961
+	.4byte	.LASF2960
 	.byte	0x1
-	.2byte	0x16d
+	.2byte	0x1ce
 	.4byte	0x10b
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x4c
-	.4byte	.LASF3109
+	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x16e
+	.2byte	0x1cf
 	.4byte	0xc097
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x46
-	.4byte	.LASF3110
+	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x16f
+	.2byte	0x1d0
 	.4byte	0x10b
 	.uleb128 0x46
 	.4byte	.LASF2854
 	.byte	0x1
-	.2byte	0x170
+	.2byte	0x1d1
 	.4byte	0xc097
 	.uleb128 0x46
-	.4byte	.LASF2939
+	.4byte	.LASF2938
 	.byte	0x1
-	.2byte	0x171
+	.2byte	0x1d2
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3111
+	.4byte	.LASF3110
 	.byte	0x1
-	.2byte	0x172
+	.2byte	0x1d3
 	.4byte	0x10b
 	.uleb128 0x46
-	.4byte	.LASF3112
+	.4byte	.LASF3111
 	.byte	0x1
-	.2byte	0x172
+	.2byte	0x1d3
 	.4byte	0x10b
 	.uleb128 0x59
-	.4byte	.LASF3113
+	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x173
+	.2byte	0x1d4
 	.4byte	0x13a
 	.4byte	.LLST5
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3114
+	.4byte	.LASF3113
 	.byte	0x1
-	.2byte	0x117
+	.2byte	0x164
 	.byte	0x1
-	.4byte	0x1291a
+	.4byte	0x12907
 	.uleb128 0x64
-	.4byte	.LASF3115
+	.4byte	.LASF3114
 	.byte	0x1
-	.2byte	0x117
+	.2byte	0x164
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3116
+	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x117
+	.2byte	0x164
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3117
+	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x117
+	.2byte	0x164
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3108
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x117
-	.4byte	0xaab
+	.2byte	0x164
+	.4byte	0x4659
 	.uleb128 0x64
-	.4byte	.LASF2954
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x118
-	.4byte	0xe710
+	.2byte	0x165
+	.4byte	0xe70a
 	.uleb128 0x64
 	.4byte	.LASF2865
 	.byte	0x1
-	.2byte	0x118
+	.2byte	0x165
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2893
+	.4byte	.LASF2892
 	.byte	0x1
-	.2byte	0x11a
+	.2byte	0x167
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF261
 	.byte	0x1
-	.2byte	0x11a
+	.2byte	0x167
 	.4byte	0xc6
 	.uleb128 0x46
+	.4byte	.LASF3117
+	.byte	0x1
+	.2byte	0x168
+	.4byte	0x13a
+	.uleb128 0x46
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x11b
+	.2byte	0x168
 	.4byte	0x13a
 	.uleb128 0x46
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x11b
+	.2byte	0x168
 	.4byte	0x13a
 	.uleb128 0x46
 	.4byte	.LASF3120
 	.byte	0x1
-	.2byte	0x11b
-	.4byte	0x13a
+	.2byte	0x169
+	.4byte	0xaab
 	.uleb128 0x46
 	.4byte	.LASF3121
 	.byte	0x1
-	.2byte	0x11c
+	.2byte	0x169
 	.4byte	0xaab
 	.uleb128 0x46
 	.4byte	.LASF3122
 	.byte	0x1
-	.2byte	0x11c
-	.4byte	0xaab
-	.uleb128 0x46
-	.4byte	.LASF3123
-	.byte	0x1
-	.2byte	0x11c
+	.2byte	0x169
 	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3110
+	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x11d
-	.4byte	0x13a
+	.2byte	0x16a
+	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3109
+	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x11e
-	.4byte	0xaab
+	.2byte	0x16b
+	.4byte	0x4659
 	.uleb128 0x46
-	.4byte	.LASF3124
+	.4byte	.LASF3123
 	.byte	0x1
-	.2byte	0x11f
+	.2byte	0x16c
 	.4byte	0x13a
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x120
+	.2byte	0x16d
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x121
+	.2byte	0x16e
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2866
 	.byte	0x1
-	.2byte	0x122
+	.2byte	0x16f
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2868
 	.byte	0x1
-	.2byte	0x123
+	.2byte	0x170
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2867
 	.byte	0x1
-	.2byte	0x124
+	.2byte	0x171
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2869
 	.byte	0x1
-	.2byte	0x125
+	.2byte	0x172
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x74
-	.4byte	.LASF3125
+	.4byte	.LASF3124
 	.byte	0x1
-	.2byte	0x109
-	.8byte	.LFB2807
-	.8byte	.LFE2807-.LFB2807
+	.2byte	0x14f
+	.8byte	.LFB2808
+	.8byte	.LFE2808-.LFB2808
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1298c
+	.4byte	0x12997
 	.uleb128 0x58
 	.4byte	.LASF2271
 	.byte	0x1
-	.2byte	0x109
+	.2byte	0x14f
 	.4byte	0x31da
-	.4byte	.LLST148
+	.4byte	.LLST152
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x10b
-	.4byte	0xe461
-	.4byte	.LLST149
-	.uleb128 0x46
-	.4byte	.LASF2954
+	.2byte	0x151
+	.4byte	0xe45b
+	.4byte	.LLST153
+	.uleb128 0x59
+	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x10c
-	.4byte	0xe710
+	.2byte	0x152
+	.4byte	0xe70a
+	.4byte	.LLST154
 	.uleb128 0x4e
-	.8byte	.LVL652
-	.4byte	0x13cf5
+	.8byte	.LVL668
+	.4byte	0x13dd1
 	.uleb128 0x4e
-	.8byte	.LVL653
-	.4byte	0x1298c
+	.8byte	.LVL670
+	.4byte	0x12a5e
 	.uleb128 0x4e
-	.8byte	.LVL654
-	.4byte	0x13d01
+	.8byte	.LVL671
+	.4byte	0x13ddd
+	.uleb128 0x4e
+	.8byte	.LVL674
+	.4byte	0x12997
+	.uleb128 0x4e
+	.8byte	.LVL675
+	.4byte	0x13ddd
+	.byte	0
+	.uleb128 0x74
+	.4byte	.LASF3125
+	.byte	0x1
+	.2byte	0x11e
+	.8byte	.LFB2807
+	.8byte	.LFE2807-.LFB2807
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x12a5e
+	.uleb128 0x6a
+	.4byte	.LASF3114
+	.byte	0x1
+	.2byte	0x11e
+	.4byte	0xaab
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x6a
+	.4byte	.LASF3115
+	.byte	0x1
+	.2byte	0x11e
+	.4byte	0xaab
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x6a
+	.4byte	.LASF3107
+	.byte	0x1
+	.2byte	0x11e
+	.4byte	0x4659
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x58
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x11f
+	.4byte	0xe70a
+	.4byte	.LLST148
+	.uleb128 0x4c
+	.4byte	.LASF2892
+	.byte	0x1
+	.2byte	0x121
+	.4byte	0xc6
+	.uleb128 0x1
+	.byte	0x5d
+	.uleb128 0x4c
+	.4byte	.LASF261
+	.byte	0x1
+	.2byte	0x121
+	.4byte	0xc6
+	.uleb128 0x1
+	.byte	0x59
+	.uleb128 0x46
+	.4byte	.LASF3117
+	.byte	0x1
+	.2byte	0x122
+	.4byte	0x13a
+	.uleb128 0x59
+	.4byte	.LASF3118
+	.byte	0x1
+	.2byte	0x122
+	.4byte	0x13a
+	.4byte	.LLST149
+	.uleb128 0x59
+	.4byte	.LASF3109
+	.byte	0x1
+	.2byte	0x123
+	.4byte	0x155
+	.4byte	.LLST150
+	.uleb128 0x69
+	.string	"i"
+	.byte	0x1
+	.2byte	0x124
+	.4byte	0xc6
+	.uleb128 0x1
+	.byte	0x5b
+	.uleb128 0x52
+	.string	"j"
+	.byte	0x1
+	.2byte	0x124
+	.4byte	0xc6
+	.uleb128 0x59
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x125
+	.4byte	0x13a
+	.4byte	.LLST151
 	.byte	0
 	.uleb128 0x75
 	.4byte	.LASF3126
 	.byte	0x1
-	.byte	0xd2
+	.byte	0xd3
 	.8byte	.LFB2806
 	.8byte	.LFE2806-.LFB2806
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12a6f
+	.4byte	0x12b43
 	.uleb128 0x76
-	.4byte	.LASF3115
+	.4byte	.LASF3114
 	.byte	0x1
-	.byte	0xd2
+	.byte	0xd3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x76
-	.4byte	.LASF3116
+	.4byte	.LASF3115
 	.byte	0x1
-	.byte	0xd2
+	.byte	0xd3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x76
-	.4byte	.LASF3117
+	.4byte	.LASF3116
 	.byte	0x1
-	.byte	0xd2
+	.byte	0xd3
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x52
+	.uleb128 0x76
+	.4byte	.LASF3107
+	.byte	0x1
+	.byte	0xd3
+	.4byte	0x4659
+	.uleb128 0x1
+	.byte	0x53
 	.uleb128 0x77
-	.4byte	.LASF3108
+	.4byte	.LASF2953
 	.byte	0x1
-	.byte	0xd2
-	.4byte	0xaab
+	.byte	0xd4
+	.4byte	0xe70a
 	.4byte	.LLST142
 	.uleb128 0x77
-	.4byte	.LASF2954
-	.byte	0x1
-	.byte	0xd3
-	.4byte	0xe710
-	.4byte	.LLST143
-	.uleb128 0x76
 	.4byte	.LASF2865
 	.byte	0x1
-	.byte	0xd3
+	.byte	0xd4
 	.4byte	0xc6
-	.uleb128 0x1
-	.byte	0x55
-	.uleb128 0x78
-	.4byte	.LASF2893
+	.4byte	.LLST143
+	.uleb128 0x4b
+	.4byte	.LASF2892
 	.byte	0x1
-	.byte	0xd5
+	.byte	0xd6
 	.4byte	0xc6
-	.4byte	.LLST144
+	.uleb128 0x1
+	.byte	0x60
 	.uleb128 0x4b
 	.4byte	.LASF261
 	.byte	0x1
-	.byte	0xd5
+	.byte	0xd6
 	.4byte	0xc6
 	.uleb128 0x1
-	.byte	0x5e
+	.byte	0x5b
+	.uleb128 0x78
+	.4byte	.LASF3117
+	.byte	0x1
+	.byte	0xd7
+	.4byte	0x13a
 	.uleb128 0x79
 	.4byte	.LASF3118
 	.byte	0x1
-	.byte	0xd6
+	.byte	0xd7
 	.4byte	0x13a
-	.uleb128 0x78
+	.4byte	.LLST144
+	.uleb128 0x79
 	.4byte	.LASF3119
 	.byte	0x1
-	.byte	0xd6
+	.byte	0xd7
 	.4byte	0x13a
 	.4byte	.LLST145
-	.uleb128 0x78
-	.4byte	.LASF3120
-	.byte	0x1
-	.byte	0xd6
-	.4byte	0x13a
-	.4byte	.LLST146
 	.uleb128 0x79
-	.4byte	.LASF3110
+	.4byte	.LASF3109
 	.byte	0x1
-	.byte	0xd7
-	.4byte	0x13a
+	.byte	0xd8
+	.4byte	0x155
+	.4byte	.LLST146
 	.uleb128 0x7a
 	.string	"i"
 	.byte	0x1
-	.byte	0xd8
+	.byte	0xd9
 	.4byte	0xc6
 	.uleb128 0x1
-	.byte	0x60
+	.byte	0x5f
 	.uleb128 0x7b
 	.string	"j"
 	.byte	0x1
-	.byte	0xd8
+	.byte	0xd9
 	.4byte	0xc6
-	.uleb128 0x78
-	.4byte	.LASF3124
+	.uleb128 0x79
+	.4byte	.LASF3123
 	.byte	0x1
-	.byte	0xd9
+	.byte	0xda
 	.4byte	0x13a
 	.4byte	.LLST147
 	.byte	0
@@ -42591,22 +42926,22 @@ __exitcall_ebc_exit:
 	.byte	0xb4
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x12aa1
+	.4byte	0x12b75
 	.uleb128 0x7d
 	.string	"ebc"
 	.byte	0x1
 	.byte	0xb4
-	.4byte	0xe461
+	.4byte	0xe45b
 	.uleb128 0x7e
 	.4byte	.LASF3128
 	.byte	0x1
 	.byte	0xb4
 	.4byte	0xc6
-	.uleb128 0x79
-	.4byte	.LASF2954
+	.uleb128 0x78
+	.4byte	.LASF2953
 	.byte	0x1
 	.byte	0xb6
-	.4byte	0xe710
+	.4byte	0xe70a
 	.byte	0
 	.uleb128 0x7c
 	.4byte	.LASF3129
@@ -42614,29 +42949,29 @@ __exitcall_ebc_exit:
 	.byte	0x86
 	.4byte	0x10b
 	.byte	0x3
-	.4byte	0x12ae9
+	.4byte	0x12bbd
 	.uleb128 0x7e
 	.4byte	.LASF2854
 	.byte	0x1
 	.byte	0x86
 	.4byte	0xc097
 	.uleb128 0x7e
-	.4byte	.LASF3100
+	.4byte	.LASF3099
 	.byte	0x1
 	.byte	0x86
 	.4byte	0x11a
 	.uleb128 0x7e
-	.4byte	.LASF3101
+	.4byte	.LASF3100
 	.byte	0x1
 	.byte	0x86
 	.4byte	0x11a
-	.uleb128 0x79
+	.uleb128 0x78
 	.4byte	.LASF3130
 	.byte	0x1
 	.byte	0x88
 	.4byte	0x10b
-	.uleb128 0x79
-	.4byte	.LASF3113
+	.uleb128 0x78
+	.4byte	.LASF3112
 	.byte	0x1
 	.byte	0x89
 	.4byte	0x11a
@@ -42647,19 +42982,19 @@ __exitcall_ebc_exit:
 	.byte	0x80
 	.4byte	0x10b
 	.byte	0x3
-	.4byte	0x12b1b
+	.4byte	0x12bef
 	.uleb128 0x7e
 	.4byte	.LASF2854
 	.byte	0x1
 	.byte	0x80
 	.4byte	0xc097
 	.uleb128 0x7e
-	.4byte	.LASF3100
+	.4byte	.LASF3099
 	.byte	0x1
 	.byte	0x80
 	.4byte	0x11a
 	.uleb128 0x7e
-	.4byte	.LASF3101
+	.4byte	.LASF3100
 	.byte	0x1
 	.byte	0x80
 	.4byte	0x11a
@@ -42669,14 +43004,14 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x12b3e
+	.4byte	0x12c12
 	.uleb128 0x7e
-	.4byte	.LASF2929
+	.4byte	.LASF2928
 	.byte	0xb
 	.byte	0x4b
-	.4byte	0xe0e3
+	.4byte	0xe0dd
 	.uleb128 0x7e
-	.4byte	.LASF2961
+	.4byte	.LASF2960
 	.byte	0xb
 	.byte	0x4b
 	.4byte	0xc6
@@ -42686,12 +43021,12 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x12b6c
+	.4byte	0x12c40
 	.uleb128 0x7e
-	.4byte	.LASF2929
+	.4byte	.LASF2928
 	.byte	0xb
 	.byte	0x3c
-	.4byte	0xe0e3
+	.4byte	0xe0dd
 	.uleb128 0x7e
 	.4byte	.LASF3134
 	.byte	0xb
@@ -42708,12 +43043,12 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x12bb0
+	.4byte	0x12c84
 	.uleb128 0x7e
-	.4byte	.LASF2929
+	.4byte	.LASF2928
 	.byte	0xb
 	.byte	0x36
-	.4byte	0xe0e3
+	.4byte	0xe0dd
 	.uleb128 0x7e
 	.4byte	.LASF3137
 	.byte	0xb
@@ -42740,12 +43075,12 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x12bc8
+	.4byte	0x12c9c
 	.uleb128 0x7e
-	.4byte	.LASF2929
+	.4byte	.LASF2928
 	.byte	0xb
 	.byte	0x31
-	.4byte	0xe0e3
+	.4byte	0xe0dd
 	.byte	0
 	.uleb128 0x7c
 	.4byte	.LASF3142
@@ -42753,24 +43088,24 @@ __exitcall_ebc_exit:
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12bef
+	.4byte	0x12cc3
 	.uleb128 0x7e
-	.4byte	.LASF2929
+	.4byte	.LASF2928
 	.byte	0xb
 	.byte	0x2c
-	.4byte	0xe0e3
+	.4byte	0xe0dd
 	.uleb128 0x7e
-	.4byte	.LASF2995
+	.4byte	.LASF2994
 	.byte	0xb
 	.byte	0x2c
-	.4byte	0xe123
+	.4byte	0xe11d
 	.byte	0
 	.uleb128 0x65
 	.4byte	.LASF3143
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x12c39
+	.4byte	0x12d0d
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa
@@ -42790,7 +43125,7 @@ __exitcall_ebc_exit:
 	.string	"dir"
 	.byte	0xa
 	.2byte	0x1ad
-	.4byte	0xdb49
+	.4byte	0xdb43
 	.uleb128 0x52
 	.string	"ops"
 	.byte	0xa
@@ -42803,7 +43138,7 @@ __exitcall_ebc_exit:
 	.2byte	0x108
 	.4byte	0xb78e
 	.byte	0x3
-	.4byte	0x12c57
+	.4byte	0x12d2b
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa
@@ -42816,7 +43151,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.4byte	0xb78e
 	.byte	0x3
-	.4byte	0x12c73
+	.4byte	0x12d47
 	.uleb128 0x7d
 	.string	"bus"
 	.byte	0xc8
@@ -42829,7 +43164,7 @@ __exitcall_ebc_exit:
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12c8f
+	.4byte	0x12d63
 	.uleb128 0x7e
 	.4byte	.LASF3147
 	.byte	0xa
@@ -42841,7 +43176,7 @@ __exitcall_ebc_exit:
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x12cc8
+	.4byte	0x12d9c
 	.uleb128 0x7d
 	.string	"dev"
 	.byte	0xcb
@@ -42869,12 +43204,12 @@ __exitcall_ebc_exit:
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12ce4
+	.4byte	0x12db8
 	.uleb128 0x7e
-	.4byte	.LASF2930
+	.4byte	.LASF2929
 	.byte	0x3
 	.byte	0x35
-	.4byte	0xdae3
+	.4byte	0xdadd
 	.byte	0
 	.uleb128 0x7c
 	.4byte	.LASF3152
@@ -42882,12 +43217,12 @@ __exitcall_ebc_exit:
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12d09
+	.4byte	0x12ddd
 	.uleb128 0x7e
-	.4byte	.LASF2930
+	.4byte	.LASF2929
 	.byte	0x3
 	.byte	0x30
-	.4byte	0xdae3
+	.4byte	0xdadd
 	.uleb128 0x7d
 	.string	"t"
 	.byte	0x3
@@ -42899,60 +43234,60 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x12d21
+	.4byte	0x12df5
 	.uleb128 0x7e
-	.4byte	.LASF2930
+	.4byte	.LASF2929
 	.byte	0x3
 	.byte	0x2b
-	.4byte	0xdae3
+	.4byte	0xdadd
 	.byte	0
 	.uleb128 0x7f
 	.4byte	.LASF3154
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x12d39
+	.4byte	0x12e0d
 	.uleb128 0x7e
-	.4byte	.LASF2930
+	.4byte	.LASF2929
 	.byte	0x3
 	.byte	0x26
-	.4byte	0xdae3
+	.4byte	0xdadd
 	.byte	0
 	.uleb128 0x7f
 	.4byte	.LASF3155
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x12d51
+	.4byte	0x12e25
 	.uleb128 0x7e
-	.4byte	.LASF2930
+	.4byte	.LASF2929
 	.byte	0x3
 	.byte	0x21
-	.4byte	0xdae3
+	.4byte	0xdadd
 	.byte	0
 	.uleb128 0x7f
 	.4byte	.LASF3156
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x12d69
+	.4byte	0x12e3d
 	.uleb128 0x7e
-	.4byte	.LASF2930
+	.4byte	.LASF2929
 	.byte	0x3
 	.byte	0x1c
-	.4byte	0xdae3
+	.4byte	0xdadd
 	.byte	0
 	.uleb128 0x7f
 	.4byte	.LASF3157
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x12d81
+	.4byte	0x12e55
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x12d81
+	.4byte	0x12e55
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -42962,24 +43297,24 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x12d9f
+	.4byte	0x12e73
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x12d81
+	.4byte	0x12e55
 	.byte	0
 	.uleb128 0x7f
 	.4byte	.LASF3158
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x12dd7
+	.4byte	0x12eab
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x12d81
+	.4byte	0x12e55
 	.uleb128 0x7e
 	.4byte	.LASF192
 	.byte	0x4
@@ -43002,7 +43337,7 @@ __exitcall_ebc_exit:
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12e06
+	.4byte	0x12eda
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -43025,7 +43360,7 @@ __exitcall_ebc_exit:
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12e35
+	.4byte	0x12f09
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -43048,7 +43383,7 @@ __exitcall_ebc_exit:
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12e64
+	.4byte	0x12f38
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -43071,7 +43406,7 @@ __exitcall_ebc_exit:
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12e9e
+	.4byte	0x12f72
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -43099,19 +43434,19 @@ __exitcall_ebc_exit:
 	.byte	0xf5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x12ed2
+	.4byte	0x12fa6
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x3091
-	.uleb128 0x79
+	.uleb128 0x78
 	.4byte	.LASF3164
 	.byte	0x6
 	.byte	0xf7
 	.4byte	0x443
 	.uleb128 0x66
-	.uleb128 0x79
+	.uleb128 0x78
 	.4byte	.LASF3165
 	.byte	0x6
 	.byte	0xfe
@@ -43124,7 +43459,7 @@ __exitcall_ebc_exit:
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12f1c
+	.4byte	0x12ff0
 	.uleb128 0x7e
 	.4byte	.LASF1147
 	.byte	0x6
@@ -43140,13 +43475,13 @@ __exitcall_ebc_exit:
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
-	.uleb128 0x79
+	.uleb128 0x78
 	.4byte	.LASF3167
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x66
-	.uleb128 0x79
+	.uleb128 0x78
 	.4byte	.LASF3165
 	.byte	0x6
 	.byte	0x56
@@ -43159,7 +43494,7 @@ __exitcall_ebc_exit:
 	.2byte	0x2e5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x12f46
+	.4byte	0x1301a
 	.uleb128 0x64
 	.4byte	.LASF984
 	.byte	0x12
@@ -43177,7 +43512,7 @@ __exitcall_ebc_exit:
 	.2byte	0x216
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x12f7e
+	.4byte	0x13052
 	.uleb128 0x64
 	.4byte	.LASF984
 	.byte	0x12
@@ -43202,7 +43537,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1dd
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x12fb4
+	.4byte	0x13088
 	.uleb128 0x64
 	.4byte	.LASF984
 	.byte	0x12
@@ -43225,7 +43560,7 @@ __exitcall_ebc_exit:
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x12fd2
+	.4byte	0x130a6
 	.uleb128 0x64
 	.4byte	.LASF984
 	.byte	0x12
@@ -43238,7 +43573,7 @@ __exitcall_ebc_exit:
 	.2byte	0x13d
 	.4byte	0xd772
 	.byte	0x3
-	.4byte	0x12ff0
+	.4byte	0x130c4
 	.uleb128 0x64
 	.4byte	.LASF170
 	.byte	0x12
@@ -43250,9 +43585,9 @@ __exitcall_ebc_exit:
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x13013
+	.4byte	0x130e7
 	.uleb128 0x7e
-	.4byte	.LASF3022
+	.4byte	.LASF3021
 	.byte	0xbe
 	.byte	0xdb
 	.4byte	0xd6e9
@@ -43268,12 +43603,12 @@ __exitcall_ebc_exit:
 	.byte	0xd6
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x1302f
+	.4byte	0x13103
 	.uleb128 0x7e
-	.4byte	.LASF3022
+	.4byte	.LASF3021
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x1302f
+	.4byte	0x13103
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -43284,12 +43619,12 @@ __exitcall_ebc_exit:
 	.2byte	0x164
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13053
+	.4byte	0x13127
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x13053
+	.4byte	0x13127
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -43300,7 +43635,7 @@ __exitcall_ebc_exit:
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1308e
+	.4byte	0x13162
 	.uleb128 0x63
 	.string	"np"
 	.byte	0xe
@@ -43323,7 +43658,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x130da
+	.4byte	0x131ae
 	.uleb128 0x63
 	.string	"np"
 	.byte	0xe
@@ -43355,7 +43690,7 @@ __exitcall_ebc_exit:
 	.byte	0xe
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x130f2
+	.4byte	0x131c6
 	.uleb128 0x7e
 	.4byte	.LASF865
 	.byte	0xe
@@ -43367,7 +43702,7 @@ __exitcall_ebc_exit:
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x13118
+	.4byte	0x131ec
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -43385,7 +43720,7 @@ __exitcall_ebc_exit:
 	.2byte	0x49b
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13136
+	.4byte	0x1320a
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -43398,7 +43733,7 @@ __exitcall_ebc_exit:
 	.2byte	0x2c5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x1316c
+	.4byte	0x13240
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -43421,7 +43756,7 @@ __exitcall_ebc_exit:
 	.byte	0xca
 	.4byte	0x33c
 	.byte	0x3
-	.4byte	0x13188
+	.4byte	0x1325c
 	.uleb128 0x7d
 	.string	"res"
 	.byte	0xf
@@ -43434,7 +43769,7 @@ __exitcall_ebc_exit:
 	.byte	0x22
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x131a4
+	.4byte	0x13278
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xcc
@@ -43447,7 +43782,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x131c0
+	.4byte	0x13294
 	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xcd
@@ -43460,7 +43795,7 @@ __exitcall_ebc_exit:
 	.2byte	0x23e
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x131de
+	.4byte	0x132b2
 	.uleb128 0x64
 	.4byte	.LASF2271
 	.byte	0xd
@@ -43473,7 +43808,7 @@ __exitcall_ebc_exit:
 	.2byte	0x203
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x13207
+	.4byte	0x132db
 	.uleb128 0x63
 	.string	"wq"
 	.byte	0xd
@@ -43490,7 +43825,7 @@ __exitcall_ebc_exit:
 	.byte	0xd
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x1322a
+	.4byte	0x132fe
 	.uleb128 0x7e
 	.4byte	.LASF2271
 	.byte	0xd
@@ -43508,7 +43843,7 @@ __exitcall_ebc_exit:
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13246
+	.4byte	0x1331a
 	.uleb128 0x63
 	.string	"m"
 	.byte	0x51
@@ -43521,7 +43856,7 @@ __exitcall_ebc_exit:
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13262
+	.4byte	0x13336
 	.uleb128 0x63
 	.string	"m"
 	.byte	0x51
@@ -43534,7 +43869,7 @@ __exitcall_ebc_exit:
 	.byte	0x8a
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x1329e
+	.4byte	0x13372
 	.uleb128 0x7e
 	.4byte	.LASF1147
 	.byte	0xca
@@ -43561,7 +43896,7 @@ __exitcall_ebc_exit:
 	.byte	0xca
 	.byte	0x84
 	.byte	0x3
-	.4byte	0x132ce
+	.4byte	0x133a2
 	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xca
@@ -43573,7 +43908,7 @@ __exitcall_ebc_exit:
 	.byte	0x84
 	.4byte	0x29
 	.uleb128 0x66
-	.uleb128 0x79
+	.uleb128 0x78
 	.4byte	.LASF3199
 	.byte	0xca
 	.byte	0x86
@@ -43585,7 +43920,7 @@ __exitcall_ebc_exit:
 	.byte	0xca
 	.byte	0x73
 	.byte	0x3
-	.4byte	0x132fa
+	.4byte	0x133ce
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xca
@@ -43608,12 +43943,12 @@ __exitcall_ebc_exit:
 	.byte	0x52
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13320
+	.4byte	0x133f4
 	.uleb128 0x7d
 	.string	"ti"
 	.byte	0xca
 	.byte	0x52
-	.4byte	0x13320
+	.4byte	0x133f4
 	.uleb128 0x7e
 	.4byte	.LASF3203
 	.byte	0xca
@@ -43629,8 +43964,8 @@ __exitcall_ebc_exit:
 	.byte	0xf
 	.4byte	0x2eda
 	.byte	0x3
-	.4byte	0x13342
-	.uleb128 0x79
+	.4byte	0x13416
+	.uleb128 0x78
 	.4byte	.LASF3205
 	.byte	0x5
 	.byte	0x11
@@ -43641,7 +43976,7 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x13386
+	.4byte	0x1345a
 	.uleb128 0x7e
 	.4byte	.LASF959
 	.byte	0x10
@@ -43652,9 +43987,9 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x13379
+	.4byte	0x1344d
 	.uleb128 0x22
-	.4byte	.LASF3091
+	.4byte	.LASF3090
 	.byte	0x10
 	.byte	0x1c
 	.4byte	0x3b7
@@ -43662,13 +43997,13 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x122e8
+	.4byte	0x122d5
 	.byte	0
 	.uleb128 0x7b
 	.string	"__u"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x1335a
+	.4byte	0x1342e
 	.byte	0
 	.byte	0
 	.uleb128 0x80
@@ -43682,7 +44017,7 @@ __exitcall_ebc_exit:
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x133aa
+	.4byte	0x1347e
 	.uleb128 0x7d
 	.string	"n"
 	.byte	0xce
@@ -43695,7 +44030,7 @@ __exitcall_ebc_exit:
 	.byte	0x9a
 	.4byte	0xdd
 	.byte	0x3
-	.4byte	0x133dc
+	.4byte	0x134b0
 	.uleb128 0x7e
 	.4byte	.LASF2453
 	.byte	0x8
@@ -43706,7 +44041,7 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xc6
-	.uleb128 0x79
+	.uleb128 0x78
 	.4byte	.LASF260
 	.byte	0x8
 	.byte	0x9c
@@ -43718,7 +44053,7 @@ __exitcall_ebc_exit:
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13402
+	.4byte	0x134d6
 	.uleb128 0x7d
 	.string	"nr"
 	.byte	0x7
@@ -43728,7 +44063,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF1147
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x13402
+	.4byte	0x134d6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -43738,7 +44073,7 @@ __exitcall_ebc_exit:
 	.byte	0x11
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x1343b
+	.4byte	0x1350f
 	.uleb128 0x7d
 	.string	"i"
 	.byte	0x11
@@ -43748,7 +44083,7 @@ __exitcall_ebc_exit:
 	.string	"v"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x1343b
+	.4byte	0x1350f
 	.uleb128 0x7b
 	.string	"w0"
 	.byte	0x11
@@ -43758,7 +44093,7 @@ __exitcall_ebc_exit:
 	.string	"x1"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x1343b
+	.4byte	0x1350f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -43769,7 +44104,7 @@ __exitcall_ebc_exit:
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1345b
+	.4byte	0x1352f
 	.uleb128 0x7d
 	.string	"x"
 	.byte	0xcf
@@ -43782,7 +44117,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13477
+	.4byte	0x1354b
 	.uleb128 0x7e
 	.4byte	.LASF2486
 	.byte	0xd0
@@ -43794,12 +44129,12 @@ __exitcall_ebc_exit:
 	.byte	0xd1
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x13498
+	.4byte	0x1356c
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd1
 	.byte	0xb
-	.4byte	0x13498
+	.4byte	0x1356c
 	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xd1
@@ -43808,21 +44143,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x134a0
+	.4byte	0x13574
 	.uleb128 0x81
 	.uleb128 0x3
-	.4byte	0x1349e
+	.4byte	0x13572
 	.uleb128 0x7f
 	.4byte	.LASF3214
 	.byte	0xd1
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x134c6
+	.4byte	0x1359a
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd1
 	.byte	0x9
-	.4byte	0x13498
+	.4byte	0x1356c
 	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xd1
@@ -43834,12 +44169,12 @@ __exitcall_ebc_exit:
 	.byte	0xc
 	.byte	0xe4
 	.byte	0x3
-	.4byte	0x134f2
+	.4byte	0x135c6
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xc
 	.byte	0xe4
-	.4byte	0x134f2
+	.4byte	0x135c6
 	.uleb128 0x7d
 	.string	"res"
 	.byte	0xc
@@ -43853,475 +44188,475 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1349e
+	.4byte	0x13572
 	.uleb128 0x82
-	.4byte	0x125cb
-	.8byte	.LFB2847
-	.8byte	.LFE2847-.LFB2847
+	.4byte	0x125b8
+	.8byte	.LFB2848
+	.8byte	.LFE2848-.LFB2848
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13638
+	.4byte	0x1370c
 	.uleb128 0x71
-	.4byte	0x125d8
+	.4byte	0x125c5
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x125e4
+	.4byte	0x125d1
 	.4byte	.LLST95
 	.uleb128 0x6f
-	.4byte	0x125f0
+	.4byte	0x125dd
 	.4byte	.LLST96
 	.uleb128 0x54
-	.4byte	0x125fc
+	.4byte	0x125e9
 	.uleb128 0x54
-	.4byte	0x125fc
+	.4byte	0x125e9
 	.uleb128 0x54
-	.4byte	0x125fc
+	.4byte	0x125e9
 	.uleb128 0x57
-	.4byte	0x12608
+	.4byte	0x125f5
 	.uleb128 0x60
-	.4byte	0x12614
+	.4byte	0x12601
 	.uleb128 0x1
 	.byte	0x5c
 	.uleb128 0x57
-	.4byte	0x1261e
+	.4byte	0x1260b
 	.uleb128 0x60
-	.4byte	0x12628
+	.4byte	0x12615
 	.uleb128 0x1
 	.byte	0x5f
 	.uleb128 0x57
-	.4byte	0x12634
+	.4byte	0x12621
 	.uleb128 0x5f
-	.4byte	0x12640
+	.4byte	0x1262d
 	.4byte	.LLST97
 	.uleb128 0x5f
-	.4byte	0x1264c
+	.4byte	0x12639
 	.4byte	.LLST98
 	.uleb128 0x5f
-	.4byte	0x12658
+	.4byte	0x12645
 	.4byte	.LLST99
 	.uleb128 0x5f
-	.4byte	0x12664
+	.4byte	0x12651
 	.4byte	.LLST100
 	.uleb128 0x5f
-	.4byte	0x12670
+	.4byte	0x1265d
 	.4byte	.LLST101
 	.uleb128 0x5f
-	.4byte	0x1267c
+	.4byte	0x12669
 	.4byte	.LLST102
 	.uleb128 0x60
-	.4byte	0x12688
+	.4byte	0x12675
 	.uleb128 0x1
 	.byte	0x55
 	.uleb128 0x57
-	.4byte	0x12694
+	.4byte	0x12681
 	.uleb128 0x5a
-	.4byte	0x12ae9
+	.4byte	0x12bbd
 	.8byte	.LBB1196
 	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
-	.2byte	0x225
-	.4byte	0x135c3
+	.2byte	0x286
+	.4byte	0x13697
 	.uleb128 0x54
-	.4byte	0x12b0f
+	.4byte	0x12be3
 	.uleb128 0x54
-	.4byte	0x12b04
+	.4byte	0x12bd8
 	.uleb128 0x54
-	.4byte	0x12af9
+	.4byte	0x12bcd
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12ae9
+	.4byte	0x12bbd
 	.8byte	.LBB1201
 	.4byte	.Ldebug_ranges0+0x720
 	.byte	0x1
-	.2byte	0x226
-	.4byte	0x135eb
+	.2byte	0x287
+	.4byte	0x136bf
 	.uleb128 0x54
-	.4byte	0x12b0f
+	.4byte	0x12be3
 	.uleb128 0x54
-	.4byte	0x12b04
+	.4byte	0x12bd8
 	.uleb128 0x54
-	.4byte	0x12af9
+	.4byte	0x12bcd
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12ae9
+	.4byte	0x12bbd
 	.8byte	.LBB1213
 	.4byte	.Ldebug_ranges0+0x790
 	.byte	0x1
-	.2byte	0x227
-	.4byte	0x13613
+	.2byte	0x288
+	.4byte	0x136e7
 	.uleb128 0x54
-	.4byte	0x12b0f
+	.4byte	0x12be3
 	.uleb128 0x54
-	.4byte	0x12b04
+	.4byte	0x12bd8
 	.uleb128 0x54
-	.4byte	0x12af9
+	.4byte	0x12bcd
 	.byte	0
 	.uleb128 0x5e
-	.4byte	0x12ae9
+	.4byte	0x12bbd
 	.8byte	.LBB1225
 	.4byte	.Ldebug_ranges0+0x800
 	.byte	0x1
-	.2byte	0x228
+	.2byte	0x289
 	.uleb128 0x54
-	.4byte	0x12b0f
+	.4byte	0x12be3
 	.uleb128 0x54
-	.4byte	0x12b04
+	.4byte	0x12bd8
 	.uleb128 0x54
-	.4byte	0x12af9
+	.4byte	0x12bcd
 	.byte	0
 	.byte	0
 	.uleb128 0x82
-	.4byte	0x124f5
-	.8byte	.LFB2848
-	.8byte	.LFE2848-.LFB2848
+	.4byte	0x124e2
+	.8byte	.LFB2849
+	.8byte	.LFE2849-.LFB2849
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x137f6
+	.4byte	0x138ca
 	.uleb128 0x71
-	.4byte	0x12502
+	.4byte	0x124ef
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x1250e
+	.4byte	0x124fb
 	.4byte	.LLST103
 	.uleb128 0x6f
-	.4byte	0x1251a
+	.4byte	0x12507
 	.4byte	.LLST104
 	.uleb128 0x54
-	.4byte	0x12526
+	.4byte	0x12513
 	.uleb128 0x54
-	.4byte	0x12526
+	.4byte	0x12513
 	.uleb128 0x54
-	.4byte	0x12526
+	.4byte	0x12513
 	.uleb128 0x57
-	.4byte	0x12532
+	.4byte	0x1251f
 	.uleb128 0x5f
-	.4byte	0x1253e
+	.4byte	0x1252b
 	.4byte	.LLST105
 	.uleb128 0x5f
-	.4byte	0x1254a
+	.4byte	0x12537
 	.4byte	.LLST106
 	.uleb128 0x60
-	.4byte	0x12556
+	.4byte	0x12543
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x60
-	.4byte	0x12562
+	.4byte	0x1254f
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5f
-	.4byte	0x1256e
+	.4byte	0x1255b
 	.4byte	.LLST107
 	.uleb128 0x60
-	.4byte	0x1257a
+	.4byte	0x12567
 	.uleb128 0x1
 	.byte	0x5f
 	.uleb128 0x60
-	.4byte	0x12586
+	.4byte	0x12573
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x60
-	.4byte	0x12592
+	.4byte	0x1257f
 	.uleb128 0x1
 	.byte	0x5c
 	.uleb128 0x57
-	.4byte	0x1259c
+	.4byte	0x12589
 	.uleb128 0x5f
-	.4byte	0x125a6
+	.4byte	0x12593
 	.4byte	.LLST108
 	.uleb128 0x60
-	.4byte	0x125b2
+	.4byte	0x1259f
 	.uleb128 0x1
 	.byte	0x55
 	.uleb128 0x57
-	.4byte	0x125be
+	.4byte	0x125ab
 	.uleb128 0x5a
-	.4byte	0x12aa1
+	.4byte	0x12b75
 	.8byte	.LBB1236
 	.4byte	.Ldebug_ranges0+0x850
 	.byte	0x1
-	.2byte	0x24d
-	.4byte	0x13715
+	.2byte	0x2ae
+	.4byte	0x137e9
 	.uleb128 0x54
-	.4byte	0x12ac7
+	.4byte	0x12b9b
 	.uleb128 0x54
-	.4byte	0x12abc
+	.4byte	0x12b90
 	.uleb128 0x54
-	.4byte	0x12ab1
+	.4byte	0x12b85
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x850
 	.uleb128 0x57
-	.4byte	0x12ad2
+	.4byte	0x12ba6
 	.uleb128 0x5f
-	.4byte	0x12add
+	.4byte	0x12bb1
 	.4byte	.LLST109
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12aa1
+	.4byte	0x12b75
 	.8byte	.LBB1239
 	.8byte	.LBE1239-.LBB1239
 	.byte	0x1
-	.2byte	0x24a
-	.4byte	0x13761
+	.2byte	0x2ab
+	.4byte	0x13835
 	.uleb128 0x54
-	.4byte	0x12ac7
+	.4byte	0x12b9b
 	.uleb128 0x54
-	.4byte	0x12abc
+	.4byte	0x12b90
 	.uleb128 0x54
-	.4byte	0x12ab1
+	.4byte	0x12b85
 	.uleb128 0x56
 	.8byte	.LBB1240
 	.8byte	.LBE1240-.LBB1240
 	.uleb128 0x57
-	.4byte	0x12ad2
+	.4byte	0x12ba6
 	.uleb128 0x5f
-	.4byte	0x12add
+	.4byte	0x12bb1
 	.4byte	.LLST110
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12aa1
+	.4byte	0x12b75
 	.8byte	.LBB1241
 	.8byte	.LBE1241-.LBB1241
 	.byte	0x1
-	.2byte	0x24b
-	.4byte	0x137ad
+	.2byte	0x2ac
+	.4byte	0x13881
 	.uleb128 0x54
-	.4byte	0x12ac7
+	.4byte	0x12b9b
 	.uleb128 0x54
-	.4byte	0x12abc
+	.4byte	0x12b90
 	.uleb128 0x54
-	.4byte	0x12ab1
+	.4byte	0x12b85
 	.uleb128 0x56
 	.8byte	.LBB1242
 	.8byte	.LBE1242-.LBB1242
 	.uleb128 0x57
-	.4byte	0x12ad2
+	.4byte	0x12ba6
 	.uleb128 0x5f
-	.4byte	0x12add
+	.4byte	0x12bb1
 	.4byte	.LLST111
 	.byte	0
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12aa1
+	.4byte	0x12b75
 	.8byte	.LBB1243
 	.8byte	.LBE1243-.LBB1243
 	.byte	0x1
-	.2byte	0x24c
+	.2byte	0x2ad
 	.uleb128 0x54
-	.4byte	0x12ac7
+	.4byte	0x12b9b
 	.uleb128 0x54
-	.4byte	0x12abc
+	.4byte	0x12b90
 	.uleb128 0x54
-	.4byte	0x12ab1
+	.4byte	0x12b85
 	.uleb128 0x56
 	.8byte	.LBB1244
 	.8byte	.LBE1244-.LBB1244
 	.uleb128 0x57
-	.4byte	0x12ad2
+	.4byte	0x12ba6
 	.uleb128 0x5f
-	.4byte	0x12add
+	.4byte	0x12bb1
 	.4byte	.LLST112
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x124bd
-	.8byte	.LFB2849
-	.8byte	.LFE2849-.LFB2849
+	.4byte	0x124aa
+	.8byte	.LFB2850
+	.8byte	.LFE2850-.LFB2850
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x138f9
+	.4byte	0x139cd
 	.uleb128 0x6f
-	.4byte	0x124ca
+	.4byte	0x124b7
 	.4byte	.LLST113
 	.uleb128 0x54
-	.4byte	0x124d6
+	.4byte	0x124c3
 	.uleb128 0x57
-	.4byte	0x124e2
+	.4byte	0x124cf
 	.uleb128 0x5a
-	.4byte	0x12bef
+	.4byte	0x12cc3
 	.8byte	.LBB1246
 	.4byte	.Ldebug_ranges0+0x880
 	.byte	0x1
-	.2byte	0x25b
-	.4byte	0x13877
+	.2byte	0x2bc
+	.4byte	0x1394b
 	.uleb128 0x54
-	.4byte	0x12c20
+	.4byte	0x12cf4
 	.uleb128 0x54
-	.4byte	0x12c14
+	.4byte	0x12ce8
 	.uleb128 0x54
-	.4byte	0x12c08
+	.4byte	0x12cdc
 	.uleb128 0x54
-	.4byte	0x12bfc
+	.4byte	0x12cd0
 	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x880
 	.uleb128 0x57
-	.4byte	0x12c2c
+	.4byte	0x12d00
 	.uleb128 0x5e
-	.4byte	0x12c39
+	.4byte	0x12d0d
 	.8byte	.LBB1248
 	.4byte	.Ldebug_ranges0+0x8d0
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x54
-	.4byte	0x12c4a
+	.4byte	0x12d1e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12b6c
+	.4byte	0x12c40
 	.8byte	.LBB1257
 	.4byte	.Ldebug_ranges0+0x900
 	.byte	0x1
-	.2byte	0x25c
-	.4byte	0x138a9
+	.2byte	0x2bd
+	.4byte	0x1397d
 	.uleb128 0x54
-	.4byte	0x12ba4
+	.4byte	0x12c78
 	.uleb128 0x54
-	.4byte	0x12b99
+	.4byte	0x12c6d
 	.uleb128 0x54
-	.4byte	0x12b8e
+	.4byte	0x12c62
 	.uleb128 0x54
-	.4byte	0x12b83
+	.4byte	0x12c57
 	.uleb128 0x54
-	.4byte	0x12b78
+	.4byte	0x12c4c
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12b3e
+	.4byte	0x12c12
 	.8byte	.LBB1263
 	.8byte	.LBE1263-.LBB1263
 	.byte	0x1
-	.2byte	0x25d
-	.4byte	0x138d5
+	.2byte	0x2be
+	.4byte	0x139a9
 	.uleb128 0x54
-	.4byte	0x12b60
+	.4byte	0x12c34
 	.uleb128 0x54
-	.4byte	0x12b55
+	.4byte	0x12c29
 	.uleb128 0x54
-	.4byte	0x12b4a
+	.4byte	0x12c1e
 	.byte	0
 	.uleb128 0x5c
-	.4byte	0x12b1b
+	.4byte	0x12bef
 	.8byte	.LBB1265
 	.8byte	.LBE1265-.LBB1265
 	.byte	0x1
-	.2byte	0x25e
+	.2byte	0x2bf
 	.uleb128 0x54
-	.4byte	0x12b32
+	.4byte	0x12c06
 	.uleb128 0x54
-	.4byte	0x12b27
+	.4byte	0x12bfb
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12a6f
-	.8byte	.LFB2850
-	.8byte	.LFE2850-.LFB2850
+	.4byte	0x12b43
+	.8byte	.LFB2851
+	.8byte	.LFE2851-.LFB2851
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x139b3
+	.4byte	0x13a8b
 	.uleb128 0x6f
-	.4byte	0x12a7f
+	.4byte	0x12b53
 	.4byte	.LLST116
 	.uleb128 0x6f
-	.4byte	0x12a8a
+	.4byte	0x12b5e
 	.4byte	.LLST117
 	.uleb128 0x57
-	.4byte	0x12a95
-	.uleb128 0x6e
-	.4byte	0x12d39
+	.4byte	0x12b69
+	.uleb128 0x70
+	.4byte	0x12c84
 	.8byte	.LBB1289
-	.4byte	.Ldebug_ranges0+0x9b0
+	.8byte	.LBE1289-.LBB1289
 	.byte	0x1
 	.byte	0xc6
-	.4byte	0x13949
+	.4byte	0x13a21
 	.uleb128 0x54
-	.4byte	0x12d45
+	.4byte	0x12c90
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12bb0
-	.8byte	.LBB1293
-	.8byte	.LBE1293-.LBB1293
+	.4byte	0x12e0d
+	.8byte	.LBB1291
+	.8byte	.LBE1291-.LBB1291
 	.byte	0x1
 	.byte	0xc7
-	.4byte	0x1396a
+	.4byte	0x13a42
 	.uleb128 0x54
-	.4byte	0x12bbc
+	.4byte	0x12e19
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12d69
-	.8byte	.LBB1295
-	.8byte	.LBE1295-.LBB1295
+	.4byte	0x12e3d
+	.8byte	.LBB1293
+	.8byte	.LBE1293-.LBB1293
 	.byte	0x1
 	.byte	0xca
-	.4byte	0x13998
+	.4byte	0x13a70
 	.uleb128 0x54
-	.4byte	0x12d75
+	.4byte	0x12e49
 	.uleb128 0x4e
 	.8byte	.LVL442
-	.4byte	0x13cd1
+	.4byte	0x13dad
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL439
-	.4byte	0x13a79
+	.4byte	0x13b55
 	.uleb128 0x4e
 	.8byte	.LVL443
-	.4byte	0x13a79
+	.4byte	0x13b55
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12a6f
-	.8byte	.LFB2854
-	.8byte	.LFE2854-.LFB2854
+	.4byte	0x12b43
+	.8byte	.LFB2855
+	.8byte	.LFE2855-.LFB2855
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13a61
+	.4byte	0x13b3d
 	.uleb128 0x6f
-	.4byte	0x12a7f
+	.4byte	0x12b53
 	.4byte	.LLST141
 	.uleb128 0x57
-	.4byte	0x12a95
+	.4byte	0x12b69
 	.uleb128 0x54
-	.4byte	0x12a8a
-	.uleb128 0x6e
-	.4byte	0x12bc8
-	.8byte	.LBB1655
-	.4byte	.Ldebug_ranges0+0xe60
+	.4byte	0x12b5e
+	.uleb128 0x70
+	.4byte	0x12e25
+	.8byte	.LBB1653
+	.8byte	.LBE1653-.LBB1653
 	.byte	0x1
 	.byte	0xbf
-	.4byte	0x13a04
-	.uleb128 0x54
-	.4byte	0x12be3
+	.4byte	0x13adb
 	.uleb128 0x54
-	.4byte	0x12bd8
+	.4byte	0x12e31
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12d51
-	.8byte	.LBB1659
-	.8byte	.LBE1659-.LBB1659
+	.4byte	0x12c9c
+	.8byte	.LBB1655
+	.8byte	.LBE1655-.LBB1655
 	.byte	0x1
 	.byte	0xc0
-	.4byte	0x13a25
+	.4byte	0x13b01
+	.uleb128 0x54
+	.4byte	0x12cb7
 	.uleb128 0x54
-	.4byte	0x12d5d
+	.4byte	0x12cac
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12d87
-	.8byte	.LBB1661
-	.8byte	.LBE1661-.LBB1661
+	.4byte	0x12e5b
+	.8byte	.LBB1657
+	.8byte	.LBE1657-.LBB1657
 	.byte	0x1
 	.byte	0xbc
-	.4byte	0x13a53
+	.4byte	0x13b2f
 	.uleb128 0x54
-	.4byte	0x12d93
+	.4byte	0x12e67
 	.uleb128 0x4e
 	.8byte	.LVL631
-	.4byte	0x13d54
+	.4byte	0x13e30
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL628
-	.4byte	0x13a79
+	.4byte	0x13b55
 	.byte	0
 	.uleb128 0x84
 	.4byte	.LASF3216
@@ -44601,7 +44936,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF3271
 	.4byte	.LASF3271
 	.byte	0xc4
-	.byte	0x66
+	.byte	0x65
 	.uleb128 0x84
 	.4byte	.LASF3272
 	.4byte	.LASF3272
@@ -46211,8 +46546,6 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.uleb128 0x49
 	.uleb128 0x13
-	.uleb128 0x2
-	.uleb128 0x17
 	.byte	0
 	.byte	0
 	.uleb128 0x79
@@ -46226,6 +46559,8 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.uleb128 0x49
 	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
 	.byte	0
 	.byte	0
 	.uleb128 0x7a
@@ -46515,7 +46850,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL613
-	.8byte	.LFE2840
+	.8byte	.LFE2841
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
@@ -46692,7 +47027,7 @@ __exitcall_ebc_exit:
 	.byte	0x91
 	.sleb128 -24
 	.8byte	.LVL615
-	.8byte	.LFE2840
+	.8byte	.LFE2841
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
@@ -46724,7 +47059,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x69
 	.8byte	.LVL623
-	.8byte	.LFE2840
+	.8byte	.LFE2841
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
@@ -46774,7 +47109,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	.LVL619
-	.8byte	.LFE2840
+	.8byte	.LFE2841
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
@@ -46805,7 +47140,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	.LVL619
-	.8byte	.LFE2840
+	.8byte	.LFE2841
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
@@ -46836,7 +47171,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL620
-	.8byte	.LFE2840
+	.8byte	.LFE2841
 	.2byte	0x1
 	.byte	0x6b
 	.8byte	0
@@ -46969,7 +47304,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL307
-	.8byte	.LFE2831
+	.8byte	.LFE2832
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
@@ -46999,7 +47334,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x66
 	.8byte	.LVL307
-	.8byte	.LFE2831
+	.8byte	.LFE2832
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
@@ -47011,7 +47346,7 @@ __exitcall_ebc_exit:
 	.byte	0x91
 	.sleb128 20
 	.8byte	.LVL310
-	.8byte	.LFE2831
+	.8byte	.LFE2832
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
@@ -47066,7 +47401,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL290
-	.8byte	.LFE2829
+	.8byte	.LFE2830
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
@@ -47230,7 +47565,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL222
-	.8byte	.LFE2824
+	.8byte	.LFE2825
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
@@ -47568,7 +47903,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL229
-	.8byte	.LFE2824
+	.8byte	.LFE2825
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -47602,7 +47937,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x53
 	.8byte	.LVL230
-	.8byte	.LFE2824
+	.8byte	.LFE2825
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
@@ -47852,439 +48187,507 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST150:
-	.8byte	.LVL656
-	.8byte	.LVL657
+.LLST155:
+	.8byte	.LVL677
+	.8byte	.LVL678
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST151:
-	.8byte	.LVL658
-	.8byte	.LVL665
+.LLST156:
+	.8byte	.LVL679
+	.8byte	.LVL688
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL669
-	.8byte	.LFE2819
+	.8byte	.LVL692
+	.8byte	.LFE2820
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST152:
-	.8byte	.LVL660
-	.8byte	.LVL667
+.LLST157:
+	.8byte	.LVL682
+	.8byte	.LVL687
 	.2byte	0x1
 	.byte	0x67
-	.8byte	.LVL669
-	.8byte	.LVL670
+	.8byte	.LVL692
+	.8byte	.LVL693
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL670
-	.8byte	.LVL680
+	.8byte	.LVL693
+	.8byte	.LVL703
 	.2byte	0x1
 	.byte	0x67
-	.8byte	.LVL680
-	.8byte	.LVL681
+	.8byte	.LVL703
+	.8byte	.LVL704
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL681
-	.8byte	.LVL690
+	.8byte	.LVL704
+	.8byte	.LVL714
 	.2byte	0x1
 	.byte	0x67
-	.8byte	.LVL690
-	.8byte	.LVL691
+	.8byte	.LVL714
+	.8byte	.LVL715
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL691
-	.8byte	.LVL707
+	.8byte	.LVL715
+	.8byte	.LVL745
 	.2byte	0x1
 	.byte	0x67
-	.8byte	.LVL707
-	.8byte	.LVL708
+	.8byte	.LVL745
+	.8byte	.LVL746
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL708
-	.8byte	.LVL767
+	.8byte	.LVL746
+	.8byte	.LVL800
 	.2byte	0x1
 	.byte	0x67
-	.8byte	.LVL767
-	.8byte	.LVL768
+	.8byte	.LVL800
+	.8byte	.LVL801
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL768
-	.8byte	.LFE2819
+	.8byte	.LVL801
+	.8byte	.LVL834
 	.2byte	0x1
 	.byte	0x67
 	.8byte	0
 	.8byte	0
-.LLST153:
-	.8byte	.LVL659
-	.8byte	.LVL666
+.LLST158:
+	.8byte	.LVL681
+	.8byte	.LVL689
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL669
-	.8byte	.LFE2819
+	.8byte	.LVL692
+	.8byte	.LVL753
 	.2byte	0x1
 	.byte	0x65
-	.8byte	0
-	.8byte	0
-.LLST154:
-	.8byte	.LVL697
-	.8byte	.LVL698
+	.8byte	.LVL753
+	.8byte	.LVL754
 	.2byte	0x1
 	.byte	0x50
+	.8byte	.LVL754
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST155:
-	.8byte	.LVL660
-	.8byte	.LVL668
+.LLST159:
+	.8byte	.LVL680
+	.8byte	.LVL690
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL669
-	.8byte	.LVL734
+	.byte	0x68
+	.8byte	.LVL692
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x68
+	.8byte	0
+	.8byte	0
+.LLST160:
+	.8byte	.LVL682
+	.8byte	.LVL691
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL749
-	.8byte	.LVL762
+	.8byte	.LVL692
+	.8byte	.LVL787
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL764
-	.8byte	.LVL781
+	.8byte	.LVL791
+	.8byte	.LVL794
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL787
-	.8byte	.LVL792
+	.8byte	.LVL800
+	.8byte	.LVL813
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL794
-	.8byte	.LFE2819
+	.8byte	.LVL824
+	.8byte	.LFE2820
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST170:
-	.8byte	.LVL753
-	.8byte	.LVL754
+.LLST165:
+	.8byte	.LVL766
+	.8byte	.LVL767
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL783
-	.8byte	.LVL784-1
+	.8byte	.LVL815
+	.8byte	.LVL816-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST158:
-	.8byte	.LVL726
-	.8byte	.LVL727
+.LLST163:
+	.8byte	.LVL758
+	.8byte	.LVL759
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL757
-	.8byte	.LVL758-1
+	.8byte	.LVL771
+	.8byte	.LVL772-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST157:
-	.8byte	.LVL671
-	.8byte	.LVL672
+.LLST162:
+	.8byte	.LVL694
+	.8byte	.LVL695
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL711
-	.8byte	.LVL712-1
+	.8byte	.LVL748
+	.8byte	.LVL749-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST156:
-	.8byte	.LVL660
-	.8byte	.LVL661
+.LLST161:
+	.8byte	.LVL682
+	.8byte	.LVL683
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL673
-	.8byte	.LVL674
+	.8byte	.LVL696
+	.8byte	.LVL697
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL676
-	.8byte	.LVL677-1
+	.8byte	.LVL699
+	.8byte	.LVL700-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST159:
-	.8byte	.LVL701
-	.8byte	.LVL702-1
+.LLST164:
+	.8byte	.LVL738
+	.8byte	.LVL739-1
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL717
-	.8byte	.LVL718-1
+	.byte	0x57
+	.8byte	.LVL761
+	.8byte	.LVL762-1
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL730
-	.8byte	.LVL749
+	.byte	0x57
+	.8byte	.LVL763
+	.8byte	.LVL764
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL762
-	.8byte	.LVL763-1
+	.byte	0x57
+	.8byte	.LVL808
+	.8byte	.LVL809-1
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL768
-	.8byte	.LVL769-1
+	.byte	0x57
+	.8byte	0
+	.8byte	0
+.LLST166:
+	.8byte	.LVL729
+	.8byte	.LVL731-1
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL792
-	.8byte	.LVL793-1
+	.byte	0x62
+	.8byte	.LVL741
+	.8byte	.LVL742-1
 	.2byte	0x1
-	.byte	0x61
+	.byte	0x62
+	.8byte	.LVL782
+	.8byte	.LVL800
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL801
+	.8byte	.LVL803-1
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL819
+	.8byte	.LVL825-1
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL830
+	.8byte	.LVL831-1
+	.2byte	0x1
+	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST160:
-	.8byte	.LVL739
-	.8byte	.LVL740
+.LLST167:
+	.8byte	.LVL787
+	.8byte	.LVL790
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x50
+	.8byte	.LVL795
+	.8byte	.LVL800
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL819
+	.8byte	.LVL822
+	.2byte	0x1
+	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST161:
-	.8byte	.LVL701
-	.8byte	.LVL702-1
+.LLST168:
+	.8byte	.LVL682
+	.8byte	.LVL691
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL717
-	.8byte	.LVL718-1
+	.byte	0x6a
+	.8byte	.LVL692
+	.8byte	.LVL737
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL735
-	.8byte	.LVL738
+	.byte	0x6a
+	.8byte	.LVL741
+	.8byte	.LVL753
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL739
-	.8byte	.LVL746
+	.byte	0x6a
+	.8byte	.LVL764
+	.8byte	.LVL769
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL762
-	.8byte	.LVL763-1
+	.byte	0x6a
+	.8byte	.LVL776
+	.8byte	.LVL777
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL768
-	.8byte	.LVL769-1
+	.byte	0x6a
+	.8byte	.LVL778
+	.8byte	.LVL787
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL792
-	.8byte	.LVL793-1
+	.byte	0x6a
+	.8byte	.LVL789
+	.8byte	.LVL794
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x6a
+	.8byte	.LVL800
+	.8byte	.LVL808
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL810
+	.8byte	.LVL813
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL821
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST162:
-	.8byte	.LVL701
-	.8byte	.LVL702-1
+.LLST169:
+	.8byte	.LVL729
+	.8byte	.LVL731-1
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL717
-	.8byte	.LVL718-1
+	.byte	0x52
+	.8byte	.LVL741
+	.8byte	.LVL742-1
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL735
-	.8byte	.LVL736
+	.byte	0x52
+	.8byte	.LVL786
+	.8byte	.LVL788
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL737
-	.8byte	.LVL749
+	.byte	0x52
+	.8byte	.LVL789
+	.8byte	.LVL800
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL762
-	.8byte	.LVL763-1
+	.byte	0x52
+	.8byte	.LVL801
+	.8byte	.LVL803-1
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL768
-	.8byte	.LVL769-1
+	.byte	0x52
+	.8byte	.LVL819
+	.8byte	.LVL820
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL792
-	.8byte	.LVL793-1
+	.byte	0x52
+	.8byte	.LVL824
+	.8byte	.LVL825-1
 	.2byte	0x1
-	.byte	0x57
+	.byte	0x52
+	.8byte	.LVL830
+	.8byte	.LVL831-1
+	.2byte	0x1
+	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST163:
-	.8byte	.LVL738
+.LLST170:
+	.8byte	.LVL729
+	.8byte	.LVL731-1
+	.2byte	0x1
+	.byte	0x53
 	.8byte	.LVL741
+	.8byte	.LVL742-1
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL744
-	.8byte	.LVL747
+	.byte	0x53
+	.8byte	.LVL786
+	.8byte	.LVL796
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL748
-	.8byte	.LVL749
+	.byte	0x53
+	.8byte	.LVL797
+	.8byte	.LVL798
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x53
+	.8byte	.LVL799
+	.8byte	.LVL800
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL801
+	.8byte	.LVL803-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL819
+	.8byte	.LVL825-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL830
+	.8byte	.LVL831-1
+	.2byte	0x1
+	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST164:
-	.8byte	.LVL701
-	.8byte	.LVL702-1
+.LLST171:
+	.8byte	.LVL729
+	.8byte	.LVL731-1
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL717
-	.8byte	.LVL718-1
+	.byte	0x55
+	.8byte	.LVL741
+	.8byte	.LVL742-1
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL735
-	.8byte	.LVL738
+	.byte	0x55
+	.8byte	.LVL786
+	.8byte	.LVL787
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL742
-	.8byte	.LVL743
+	.byte	0x55
+	.8byte	.LVL790
+	.8byte	.LVL792
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL743
-	.8byte	.LVL745
+	.byte	0x55
+	.8byte	.LVL792
+	.8byte	.LVL793
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL762
-	.8byte	.LVL763-1
+	.byte	0x51
+	.8byte	.LVL801
+	.8byte	.LVL803-1
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL768
-	.8byte	.LVL769-1
+	.byte	0x55
+	.8byte	.LVL823
+	.8byte	.LVL825-1
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL792
-	.8byte	.LVL793-1
+	.byte	0x55
+	.8byte	.LVL830
+	.8byte	.LVL831-1
 	.2byte	0x1
-	.byte	0x56
+	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST165:
-	.8byte	.LVL701
-	.8byte	.LVL702-1
+.LLST172:
+	.8byte	.LVL729
+	.8byte	.LVL731-1
 	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL717
-	.8byte	.LVL718-1
+	.byte	0x61
+	.8byte	.LVL741
+	.8byte	.LVL742-1
 	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL732
-	.8byte	.LVL749
+	.byte	0x61
+	.8byte	.LVL785
+	.8byte	.LVL800
 	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL762
-	.8byte	.LVL763-1
+	.byte	0x61
+	.8byte	.LVL801
+	.8byte	.LVL803-1
 	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL768
-	.8byte	.LVL769-1
+	.byte	0x61
+	.8byte	.LVL819
+	.8byte	.LVL825-1
 	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL792
-	.8byte	.LVL793-1
+	.byte	0x61
+	.8byte	.LVL830
+	.8byte	.LVL831-1
 	.2byte	0x1
-	.byte	0x60
+	.byte	0x61
 	.8byte	0
 	.8byte	0
-.LLST166:
-	.8byte	.LVL701
-	.8byte	.LVL702-1
+.LLST173:
+	.8byte	.LVL729
+	.8byte	.LVL731-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL717
-	.8byte	.LVL718-1
+	.8byte	.LVL741
+	.8byte	.LVL742-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL729
-	.8byte	.LVL749
+	.8byte	.LVL783
+	.8byte	.LVL800
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL762
-	.8byte	.LVL763-1
+	.8byte	.LVL801
+	.8byte	.LVL803-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL768
-	.8byte	.LVL769-1
+	.8byte	.LVL819
+	.8byte	.LVL825-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL792
-	.8byte	.LVL793-1
+	.8byte	.LVL830
+	.8byte	.LVL831-1
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST167:
-	.8byte	.LVL701
-	.8byte	.LVL702-1
-	.2byte	0x1
-	.byte	0x5f
-	.8byte	.LVL717
-	.8byte	.LVL718-1
+.LLST174:
+	.8byte	.LVL729
+	.8byte	.LVL731-1
 	.2byte	0x1
-	.byte	0x5f
-	.8byte	.LVL733
-	.8byte	.LVL736
+	.byte	0x60
+	.8byte	.LVL741
+	.8byte	.LVL742-1
 	.2byte	0x1
-	.byte	0x5f
-	.8byte	.LVL736
-	.8byte	.LVL737
+	.byte	0x60
+	.8byte	.LVL785
+	.8byte	.LVL800
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL762
-	.8byte	.LVL763-1
+	.byte	0x60
+	.8byte	.LVL801
+	.8byte	.LVL803-1
 	.2byte	0x1
-	.byte	0x5f
-	.8byte	.LVL768
-	.8byte	.LVL769-1
+	.byte	0x60
+	.8byte	.LVL819
+	.8byte	.LVL825-1
 	.2byte	0x1
-	.byte	0x5f
-	.8byte	.LVL792
-	.8byte	.LVL793-1
+	.byte	0x60
+	.8byte	.LVL830
+	.8byte	.LVL831-1
 	.2byte	0x1
-	.byte	0x5f
+	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST168:
-	.8byte	.LVL701
-	.8byte	.LVL702-1
+.LLST175:
+	.8byte	.LVL682
+	.8byte	.LVL691
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL717
-	.8byte	.LVL718-1
+	.byte	0x69
+	.8byte	.LVL692
+	.8byte	.LVL705
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL731
-	.8byte	.LVL749
+	.byte	0x69
+	.8byte	.LVL714
+	.8byte	.LVL718
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL762
-	.8byte	.LVL763-1
+	.byte	0x69
+	.8byte	.LVL726
+	.8byte	.LVL730
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL768
-	.8byte	.LVL769-1
+	.byte	0x69
+	.8byte	.LVL734
+	.8byte	.LVL736
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL792
-	.8byte	.LVL793-1
+	.byte	0x69
+	.8byte	.LVL741
+	.8byte	.LVL743
 	.2byte	0x1
-	.byte	0x62
-	.8byte	0
-	.8byte	0
-.LLST169:
-	.8byte	.LVL696
-	.8byte	.LVL699-1
+	.byte	0x69
+	.8byte	.LVL745
+	.8byte	.LVL753
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL720
-	.8byte	.LVL721-1
+	.byte	0x69
+	.8byte	.LVL784
+	.8byte	.LVL802
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL750
-	.8byte	.LVL751
+	.byte	0x69
+	.8byte	.LVL819
+	.8byte	.LVL826
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL776
-	.8byte	.LVL777-1
+	.byte	0x69
+	.8byte	.LVL828
+	.8byte	.LVL832
 	.2byte	0x1
-	.byte	0x56
+	.byte	0x69
+	.8byte	.LVL834
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x69
 	.8byte	0
 	.8byte	0
 .LLST69:
@@ -48297,7 +48700,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL251
-	.8byte	.LFE2817
+	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
@@ -48319,7 +48722,7 @@ __exitcall_ebc_exit:
 	.byte	0x71
 	.sleb128 -12
 	.8byte	.LVL257
-	.8byte	.LFE2817
+	.8byte	.LFE2818
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
@@ -48342,10 +48745,10 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL401
-	.8byte	.LVL404
+	.8byte	.LVL405
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL405
+	.8byte	.LVL406
 	.8byte	.LVL409
 	.2byte	0x1
 	.byte	0x64
@@ -48354,7 +48757,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL415
-	.8byte	.LFE2814
+	.8byte	.LFE2815
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
@@ -48453,88 +48856,139 @@ __exitcall_ebc_exit:
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST148:
-	.8byte	.LVL649
-	.8byte	.LVL650
+.LLST152:
+	.8byte	.LVL665
+	.8byte	.LVL667
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST149:
-	.8byte	.LVL651
-	.8byte	.LVL655
+.LLST153:
+	.8byte	.LVL666
+	.8byte	.LVL669
 	.2byte	0x1
-	.byte	0x64
+	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST142:
-	.8byte	.LVL632
-	.8byte	.LVL637
+.LLST154:
+	.8byte	.LVL669
+	.8byte	.LVL672
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL673
+	.8byte	.LVL676
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST148:
+	.8byte	.LVL654
+	.8byte	.LVL659
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL637
-	.8byte	.LVL646
+	.8byte	.LVL664
+	.8byte	.LFE2807
 	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL646
-	.8byte	.LFE2806
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST149:
+	.8byte	.LVL660
+	.8byte	.LVL661
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST143:
+.LLST150:
+	.8byte	.LVL658
+	.8byte	.LVL662
+	.2byte	0x1
+	.byte	0x54
+	.8byte	0
+	.8byte	0
+.LLST151:
+	.8byte	.LVL661
+	.8byte	.LVL663
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST142:
 	.8byte	.LVL632
-	.8byte	.LVL637
+	.8byte	.LVL638
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL641
 	.8byte	.LVL642
+	.8byte	.LVL643
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL647
-	.8byte	.LFE2806
+	.8byte	.LVL652
+	.8byte	.LVL653
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST144:
+.LLST143:
+	.8byte	.LVL632
 	.8byte	.LVL633
-	.8byte	.LVL648
 	.2byte	0x1
-	.byte	0x6e
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST144:
+	.8byte	.LVL638
+	.8byte	.LVL641
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL645
+	.8byte	.LVL650
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL653
+	.8byte	.LFE2806
+	.2byte	0x1
+	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST145:
+	.8byte	.LVL637
 	.8byte	.LVL638
-	.8byte	.LVL639
 	.2byte	0x1
-	.byte	0x56
+	.byte	0x59
+	.8byte	.LVL640
+	.8byte	.LVL644
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL649
+	.8byte	.LVL653
+	.2byte	0x1
+	.byte	0x59
 	.8byte	0
 	.8byte	0
 .LLST146:
-	.8byte	.LVL636
 	.8byte	.LVL637
+	.8byte	.LVL639
 	.2byte	0x1
-	.byte	0x5b
-	.8byte	.LVL638
-	.8byte	.LVL643
+	.byte	0x55
+	.8byte	.LVL640
+	.8byte	.LVL648
 	.2byte	0x1
-	.byte	0x5b
-	.8byte	.LVL645
+	.byte	0x55
+	.8byte	.LVL651
 	.8byte	.LFE2806
 	.2byte	0x1
-	.byte	0x5b
+	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST147:
 	.8byte	.LVL637
-	.8byte	.LVL640
+	.8byte	.LVL646
 	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL644
-	.8byte	.LVL645
+	.byte	0x57
+	.8byte	.LVL647
+	.8byte	.LFE2806
 	.2byte	0x1
-	.byte	0x54
+	.byte	0x57
 	.8byte	0
 	.8byte	0
 .LLST95:
@@ -48547,7 +49001,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x51
 	.8byte	.LVL343
-	.8byte	.LFE2847
+	.8byte	.LFE2848
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
@@ -48562,7 +49016,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x52
 	.8byte	.LVL343
-	.8byte	.LFE2847
+	.8byte	.LFE2848
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
@@ -48621,7 +49075,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x56
 	.8byte	.LVL342
-	.8byte	.LFE2847
+	.8byte	.LFE2848
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
@@ -48647,7 +49101,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x51
 	.8byte	.LVL386
-	.8byte	.LFE2848
+	.8byte	.LFE2849
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
@@ -48662,7 +49116,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x52
 	.8byte	.LVL386
-	.8byte	.LFE2848
+	.8byte	.LFE2849
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
@@ -48673,7 +49127,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x54
 	.8byte	.LVL369
-	.8byte	.LFE2848
+	.8byte	.LFE2849
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
@@ -48692,7 +49146,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x53
 	.8byte	.LVL385
-	.8byte	.LFE2848
+	.8byte	.LFE2849
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
@@ -48723,7 +49177,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x56
 	.8byte	.LVL384
-	.8byte	.LFE2848
+	.8byte	.LFE2849
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
@@ -48829,7 +49283,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL394
-	.8byte	.LFE2849
+	.8byte	.LFE2850
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
@@ -48866,7 +49320,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x63
 	.8byte	.LVL630
-	.8byte	.LFE2854
+	.8byte	.LFE2855
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -48881,10 +49335,10 @@ __exitcall_ebc_exit:
 	.2byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0-.Ltext0
+	.8byte	.LFB2846
+	.8byte	.LFE2846-.LFB2846
 	.8byte	.LFB2845
 	.8byte	.LFE2845-.LFB2845
-	.8byte	.LFB2844
-	.8byte	.LFE2844-.LFB2844
 	.8byte	0
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
@@ -49199,220 +49653,206 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1282
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1289
-	.8byte	.LBE1289
-	.8byte	.LBB1292
-	.8byte	.LBE1292
-	.8byte	0
+	.8byte	.LBB1446
+	.8byte	.LBE1446
+	.8byte	.LBB1449
+	.8byte	.LBE1449
 	.8byte	0
-	.8byte	.LBB1448
-	.8byte	.LBE1448
-	.8byte	.LBB1451
-	.8byte	.LBE1451
 	.8byte	0
-	.8byte	0
-	.8byte	.LBB1458
-	.8byte	.LBE1458
+	.8byte	.LBB1456
+	.8byte	.LBE1456
+	.8byte	.LBB1555
+	.8byte	.LBE1555
+	.8byte	.LBB1556
+	.8byte	.LBE1556
 	.8byte	.LBB1557
 	.8byte	.LBE1557
-	.8byte	.LBB1558
-	.8byte	.LBE1558
-	.8byte	.LBB1559
-	.8byte	.LBE1559
-	.8byte	.LBB1596
-	.8byte	.LBE1596
+	.8byte	.LBB1594
+	.8byte	.LBE1594
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1460
-	.8byte	.LBE1460
+	.8byte	.LBB1458
+	.8byte	.LBE1458
+	.8byte	.LBB1467
+	.8byte	.LBE1467
+	.8byte	.LBB1468
+	.8byte	.LBE1468
 	.8byte	.LBB1469
 	.8byte	.LBE1469
-	.8byte	.LBB1470
-	.8byte	.LBE1470
-	.8byte	.LBB1471
-	.8byte	.LBE1471
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1517
-	.8byte	.LBE1517
-	.8byte	.LBB1551
-	.8byte	.LBE1551
-	.8byte	.LBB1552
-	.8byte	.LBE1552
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1524
-	.8byte	.LBE1524
+	.8byte	.LBB1515
+	.8byte	.LBE1515
 	.8byte	.LBB1549
 	.8byte	.LBE1549
 	.8byte	.LBB1550
 	.8byte	.LBE1550
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1531
-	.8byte	.LBE1531
+	.8byte	.LBB1522
+	.8byte	.LBE1522
 	.8byte	.LBB1547
 	.8byte	.LBE1547
 	.8byte	.LBB1548
 	.8byte	.LBE1548
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1538
-	.8byte	.LBE1538
+	.8byte	.LBB1529
+	.8byte	.LBE1529
 	.8byte	.LBB1545
 	.8byte	.LBE1545
 	.8byte	.LBB1546
 	.8byte	.LBE1546
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1536
+	.8byte	.LBE1536
+	.8byte	.LBB1543
+	.8byte	.LBE1543
+	.8byte	.LBB1544
+	.8byte	.LBE1544
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1558
+	.8byte	.LBE1558
+	.8byte	.LBB1583
+	.8byte	.LBE1583
+	.8byte	.LBB1584
+	.8byte	.LBE1584
+	.8byte	.LBB1593
+	.8byte	.LBE1593
+	.8byte	.LBB1644
+	.8byte	.LBE1644
+	.8byte	.LBB1649
+	.8byte	.LBE1649
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB1560
 	.8byte	.LBE1560
+	.8byte	.LBB1563
+	.8byte	.LBE1563
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1564
+	.8byte	.LBE1564
+	.8byte	.LBB1569
+	.8byte	.LBE1569
+	.8byte	.LBB1570
+	.8byte	.LBE1570
+	.8byte	.LBB1571
+	.8byte	.LBE1571
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB1585
 	.8byte	.LBE1585
-	.8byte	.LBB1586
-	.8byte	.LBE1586
 	.8byte	.LBB1595
 	.8byte	.LBE1595
 	.8byte	.LBB1646
 	.8byte	.LBE1646
+	.8byte	.LBB1650
+	.8byte	.LBE1650
 	.8byte	.LBB1651
 	.8byte	.LBE1651
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1562
-	.8byte	.LBE1562
-	.8byte	.LBB1565
-	.8byte	.LBE1565
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1566
-	.8byte	.LBE1566
-	.8byte	.LBB1571
-	.8byte	.LBE1571
-	.8byte	.LBB1572
-	.8byte	.LBE1572
-	.8byte	.LBB1573
-	.8byte	.LBE1573
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1587
-	.8byte	.LBE1587
-	.8byte	.LBB1597
-	.8byte	.LBE1597
+	.8byte	.LBB1596
+	.8byte	.LBE1596
+	.8byte	.LBB1647
+	.8byte	.LBE1647
 	.8byte	.LBB1648
 	.8byte	.LBE1648
-	.8byte	.LBB1652
-	.8byte	.LBE1652
-	.8byte	.LBB1653
-	.8byte	.LBE1653
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1598
 	.8byte	.LBE1598
-	.8byte	.LBB1649
-	.8byte	.LBE1649
-	.8byte	.LBB1650
-	.8byte	.LBE1650
+	.8byte	.LBB1604
+	.8byte	.LBE1604
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1600
-	.8byte	.LBE1600
-	.8byte	.LBB1606
-	.8byte	.LBE1606
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1609
-	.8byte	.LBE1609
-	.8byte	.LBB1610
-	.8byte	.LBE1610
+	.8byte	.LBB1607
+	.8byte	.LBE1607
+	.8byte	.LBB1608
+	.8byte	.LBE1608
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1617
-	.8byte	.LBE1617
+	.8byte	.LBB1615
+	.8byte	.LBE1615
+	.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	0
 	.8byte	0
-	.8byte	.LBB1627
-	.8byte	.LBE1627
+	.8byte	.LBB1625
+	.8byte	.LBE1625
+	.8byte	.LBB1643
+	.8byte	.LBE1643
 	.8byte	.LBB1645
 	.8byte	.LBE1645
-	.8byte	.LBB1647
-	.8byte	.LBE1647
-	.8byte	.LBB1654
-	.8byte	.LBE1654
+	.8byte	.LBB1652
+	.8byte	.LBE1652
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1655
-	.8byte	.LBE1655
-	.8byte	.LBB1658
-	.8byte	.LBE1658
+	.8byte	.LBB1682
+	.8byte	.LBE1682
+	.8byte	.LBB1689
+	.8byte	.LBE1689
+	.8byte	.LBB1690
+	.8byte	.LBE1690
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1684
+	.8byte	.LBE1684
+	.8byte	.LBB1685
+	.8byte	.LBE1685
 	.8byte	.LBB1686
 	.8byte	.LBE1686
-	.8byte	.LBB1693
-	.8byte	.LBE1693
-	.8byte	.LBB1694
-	.8byte	.LBE1694
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1688
-	.8byte	.LBE1688
-	.8byte	.LBB1689
-	.8byte	.LBE1689
-	.8byte	.LBB1690
-	.8byte	.LBE1690
+	.8byte	.LBB1696
+	.8byte	.LBE1696
+	.8byte	.LBB1707
+	.8byte	.LBE1707
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1700
-	.8byte	.LBE1700
-	.8byte	.LBB1720
-	.8byte	.LBE1720
+	.8byte	.LBB1698
+	.8byte	.LBE1698
+	.8byte	.LBB1699
+	.8byte	.LBE1699
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1702
-	.8byte	.LBE1702
 	.8byte	.LBB1703
 	.8byte	.LBE1703
+	.8byte	.LBB1715
+	.8byte	.LBE1715
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1704
-	.8byte	.LBE1704
-	.8byte	.LBB1710
-	.8byte	.LBE1710
-	.8byte	.LBB1711
-	.8byte	.LBE1711
-	.8byte	.LBB1712
-	.8byte	.LBE1712
-	.8byte	.LBB1721
-	.8byte	.LBE1721
+	.8byte	.LBB1705
+	.8byte	.LBE1705
+	.8byte	.LBB1706
+	.8byte	.LBE1706
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1708
+	.8byte	.LBE1708
+	.8byte	.LBB1713
+	.8byte	.LBE1713
+	.8byte	.LBB1714
+	.8byte	.LBE1714
 	.8byte	.LBB1716
 	.8byte	.LBE1716
-	.8byte	.LBB1722
-	.8byte	.LBE1722
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1718
-	.8byte	.LBE1718
-	.8byte	.LBB1719
-	.8byte	.LBE1719
 	.8byte	0
 	.8byte	0
 	.8byte	.Ltext0
 	.8byte	.Letext0
+	.8byte	.LFB2846
+	.8byte	.LFE2846
 	.8byte	.LFB2845
 	.8byte	.LFE2845
-	.8byte	.LFB2844
-	.8byte	.LFE2844
 	.8byte	0
 	.8byte	0
 	.section	.debug_line,"",@progbits
@@ -49436,7 +49876,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_REQ_IDLE"
 .LASF2378:
 	.string	"suppliers"
-.LASF3038:
+.LASF3037:
 	.string	"ebc_buffer_manage_init"
 .LASF2877:
 	.string	"EPD_FULL_GCC16"
@@ -49448,7 +49888,7 @@ __exitcall_ebc_exit:
 	.string	"PE_SIZE_PUD"
 .LASF2588:
 	.string	"__tracepoint_page_ref_mod"
-.LASF2966:
+.LASF2965:
 	.string	"full_mode_num"
 .LASF1040:
 	.string	"nr_wakeups"
@@ -49502,11 +49942,11 @@ __exitcall_ebc_exit:
 	.string	"state"
 .LASF521:
 	.string	"s_d_op"
-.LASF2956:
+.LASF2955:
 	.string	"ebc_buffer_vir"
 .LASF906:
 	.string	"node_states"
-.LASF2900:
+.LASF2899:
 	.string	"pmic_power_req"
 .LASF898:
 	.string	"hrtimer_resolution"
@@ -49528,7 +49968,7 @@ __exitcall_ebc_exit:
 	.string	"si_code"
 .LASF646:
 	.string	"thread_node"
-.LASF3088:
+.LASF3087:
 	.string	"temperature"
 .LASF1299:
 	.string	"map_pages"
@@ -49562,7 +50002,7 @@ __exitcall_ebc_exit:
 	.string	"system_wq"
 .LASF601:
 	.string	"rcu_read_lock_nesting"
-.LASF2984:
+.LASF2983:
 	.string	"suspend_lock"
 .LASF2527:
 	.string	"gpio_desc"
@@ -49594,7 +50034,7 @@ __exitcall_ebc_exit:
 	.string	"trace_events"
 .LASF1340:
 	.string	"env_start"
-.LASF2909:
+.LASF2908:
 	.string	"DMA_FROM_DEVICE"
 .LASF753:
 	.string	"cpu_number"
@@ -49604,7 +50044,7 @@ __exitcall_ebc_exit:
 	.string	"mm_rb"
 .LASF2184:
 	.string	"freeze_late"
-.LASF3057:
+.LASF3056:
 	.string	"buf_info"
 .LASF406:
 	.string	"d_inode"
@@ -49618,7 +50058,7 @@ __exitcall_ebc_exit:
 	.string	"locked"
 .LASF72:
 	.string	"exitcall_t"
-.LASF2941:
+.LASF2940:
 	.string	"regs"
 .LASF1034:
 	.string	"slice_max"
@@ -49664,7 +50104,7 @@ __exitcall_ebc_exit:
 	.string	"param_ops_uint"
 .LASF888:
 	.string	"softirq_activated"
-.LASF3022:
+.LASF3021:
 	.string	"pdev"
 .LASF824:
 	.string	"system_long_wq"
@@ -49688,7 +50128,7 @@ __exitcall_ebc_exit:
 	.string	"c_true"
 .LASF1575:
 	.string	"notifier_call"
-.LASF3064:
+.LASF3063:
 	.string	"ebc_exit"
 .LASF1830:
 	.string	"gendisk"
@@ -49756,7 +50196,7 @@ __exitcall_ebc_exit:
 	.string	"__reserved"
 .LASF937:
 	.string	"_sigfault"
-.LASF3117:
+.LASF3116:
 	.string	"image_bg"
 .LASF2855:
 	.string	"ebc_buf_status"
@@ -49796,7 +50236,7 @@ __exitcall_ebc_exit:
 	.string	"delayed_call"
 .LASF917:
 	.string	"_status"
-.LASF2898:
+.LASF2897:
 	.string	"pmic_name"
 .LASF1461:
 	.string	"NR_FREE_CMA_PAGES"
@@ -49808,11 +50248,11 @@ __exitcall_ebc_exit:
 	.string	"bin_attribute"
 .LASF1600:
 	.string	"percpu_counter"
-.LASF2986:
+.LASF2985:
 	.string	"first_in"
 .LASF2326:
 	.string	"dev_groups"
-.LASF2948:
+.LASF2947:
 	.string	"image_addr_set"
 .LASF300:
 	.string	"__softirqentry_text_start"
@@ -49846,9 +50286,9 @@ __exitcall_ebc_exit:
 	.string	"irqchip_fwnode_ops"
 .LASF1611:
 	.string	"dq_id"
-.LASF3109:
+.LASF3108:
 	.string	"frame_count_tmp"
-.LASF3116:
+.LASF3115:
 	.string	"image_fb"
 .LASF1786:
 	.string	"write_end"
@@ -49878,7 +50318,7 @@ __exitcall_ebc_exit:
 	.string	"jit_keyring"
 .LASF168:
 	.string	"file_disp"
-.LASF2963:
+.LASF2962:
 	.string	"auto_need_refresh"
 .LASF2843:
 	.string	"WF_TYPE_GRAY2"
@@ -49956,11 +50396,11 @@ __exitcall_ebc_exit:
 	.string	"latch_tree_node"
 .LASF1152:
 	.string	"cad_pid"
-.LASF2937:
+.LASF2936:
 	.string	"lgonl"
 .LASF532:
 	.string	"destroy_work"
-.LASF3073:
+.LASF3072:
 	.string	"one_buffer_end"
 .LASF253:
 	.string	"FTR_LOWER_SAFE"
@@ -50014,7 +50454,7 @@ __exitcall_ebc_exit:
 	.string	"write"
 .LASF2592:
 	.string	"__tracepoint_page_ref_freeze"
-.LASF2927:
+.LASF2926:
 	.string	"panel_buffer"
 .LASF314:
 	.string	"__exception_text_end"
@@ -50064,7 +50504,7 @@ __exitcall_ebc_exit:
 	.string	"index"
 .LASF2201:
 	.string	"driver_data"
-.LASF2935:
+.LASF2934:
 	.string	"sdck"
 .LASF2806:
 	.string	"module_kset"
@@ -50240,7 +50680,7 @@ __exitcall_ebc_exit:
 	.string	"func"
 .LASF1138:
 	.string	"perf_event_context"
-.LASF2997:
+.LASF2996:
 	.string	"ebc_auto_task"
 .LASF93:
 	.string	"printk_delay_msec"
@@ -50272,7 +50712,7 @@ __exitcall_ebc_exit:
 	.string	"request_key_auth"
 .LASF1951:
 	.string	"destroy_inode"
-.LASF2960:
+.LASF2959:
 	.string	"is_busy_now"
 .LASF57:
 	.string	"irq_hw_number_t"
@@ -50284,7 +50724,7 @@ __exitcall_ebc_exit:
 	.string	"down_write"
 .LASF1096:
 	.string	"completion"
-.LASF3071:
+.LASF3070:
 	.string	"old_prev_buf"
 .LASF1497:
 	.string	"NR_GPU_HEAP"
@@ -50298,13 +50738,13 @@ __exitcall_ebc_exit:
 	.string	"__con_initcall_end"
 .LASF1143:
 	.string	"active_uprobe"
-.LASF3001:
+.LASF3000:
 	.string	"ebc_poweroff_wq"
 .LASF1969:
 	.string	"show_options"
 .LASF2140:
 	.string	"uevent_helper"
-.LASF3042:
+.LASF3041:
 	.string	"lut_buffer_phy"
 .LASF109:
 	.string	"mmap_supported_flags"
@@ -50388,7 +50828,7 @@ __exitcall_ebc_exit:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF137:
 	.string	"vendor_panic_cb"
-.LASF3066:
+.LASF3065:
 	.string	"ebc_vdd_power_timeout"
 .LASF3131:
 	.string	"ebc_get_4pix_wf"
@@ -50420,11 +50860,11 @@ __exitcall_ebc_exit:
 	.string	"core_kallsyms"
 .LASF3243:
 	.string	"memcpy"
-.LASF2890:
+.LASF2889:
 	.string	"EPD_FORCE_FULL"
 .LASF2398:
 	.string	"get_sgtable"
-.LASF3113:
+.LASF3112:
 	.string	"xor_val"
 .LASF2153:
 	.string	"envp_idx"
@@ -50436,7 +50876,7 @@ __exitcall_ebc_exit:
 	.string	"OOM_KILL"
 .LASF442:
 	.string	"i_hash"
-.LASF3100:
+.LASF3099:
 	.string	"gray_old"
 .LASF67:
 	.string	"hlist_node"
@@ -50498,13 +50938,13 @@ __exitcall_ebc_exit:
 	.string	"ebc_pmic_read_temp"
 .LASF2873:
 	.string	"EPD_FULL_GC16"
-.LASF3010:
+.LASF3009:
 	.string	"dev_attr_ebc_state"
 .LASF2159:
 	.string	"kernel_kobj"
 .LASF2585:
 	.string	"funcs"
-.LASF2993:
+.LASF2992:
 	.string	"overlay_enable"
 .LASF1105:
 	.string	"securebits"
@@ -50524,7 +50964,7 @@ __exitcall_ebc_exit:
 	.string	"DOMAIN_BUS_NEXUS"
 .LASF2036:
 	.string	"sysctl_mount_point"
-.LASF2989:
+.LASF2988:
 	.string	"auto_buffer_work"
 .LASF266:
 	.string	"user_mask"
@@ -50568,7 +51008,7 @@ __exitcall_ebc_exit:
 	.string	"UNEVICTABLE_PGMLOCKED"
 .LASF834:
 	.string	"pgdval_t"
-.LASF2912:
+.LASF2911:
 	.string	"page_link"
 .LASF1857:
 	.string	"setattr"
@@ -50580,7 +51020,7 @@ __exitcall_ebc_exit:
 	.string	"prepare"
 .LASF2136:
 	.string	"bin_attrs"
-.LASF2922:
+.LASF2921:
 	.string	"HYPERVISOR_shared_info"
 .LASF680:
 	.string	"sas_ss_flags"
@@ -50588,7 +51028,7 @@ __exitcall_ebc_exit:
 	.string	"f_mode"
 .LASF1427:
 	.string	"ki_complete"
-.LASF3025:
+.LASF3024:
 	.string	"ebc_tcon_pdev"
 .LASF1753:
 	.string	"percpu"
@@ -50608,13 +51048,13 @@ __exitcall_ebc_exit:
 	.string	"driver"
 .LASF1542:
 	.string	"ZONE_NORMAL"
-.LASF3118:
+.LASF3117:
 	.string	"image_new_data"
 .LASF423:
 	.string	"i_op"
 .LASF1684:
 	.string	"d_rt_spc_hardlimit"
-.LASF2972:
+.LASF2971:
 	.string	"ebc_task"
 .LASF2124:
 	.string	"kobj_ns_type_operations"
@@ -50656,7 +51096,7 @@ __exitcall_ebc_exit:
 	.string	"trace_bprintk_fmt_start"
 .LASF663:
 	.string	"cpu_timers"
-.LASF2946:
+.LASF2945:
 	.string	"disable"
 .LASF1298:
 	.string	"huge_fault"
@@ -50680,7 +51120,7 @@ __exitcall_ebc_exit:
 	.string	"i_dentry"
 .LASF2126:
 	.string	"grab_current_ns"
-.LASF3040:
+.LASF3039:
 	.string	"fb_size"
 .LASF881:
 	.string	"offset"
@@ -50690,7 +51130,7 @@ __exitcall_ebc_exit:
 	.string	"fsnotify_mark_connector"
 .LASF939:
 	.string	"_sigsys"
-.LASF3087:
+.LASF3086:
 	.string	"ebc_lut_update"
 .LASF1919:
 	.string	"lm_setup"
@@ -50724,7 +51164,7 @@ __exitcall_ebc_exit:
 	.string	"idmap_pg_dir"
 .LASF2516:
 	.string	"i2c_bus_recovery_info"
-.LASF3043:
+.LASF3042:
 	.string	"lut_buffer_size"
 .LASF481:
 	.string	"s_dev"
@@ -50750,7 +51190,7 @@ __exitcall_ebc_exit:
 	.string	"PIDTYPE_TGID"
 .LASF1913:
 	.string	"lm_get_owner"
-.LASF2899:
+.LASF2898:
 	.string	"drvpar"
 .LASF2629:
 	.string	"vm_event_item"
@@ -50784,7 +51224,7 @@ __exitcall_ebc_exit:
 	.string	"_pid"
 .LASF1154:
 	.string	"init_stack"
-.LASF3124:
+.LASF3123:
 	.string	"dmask"
 .LASF1223:
 	.string	"address_space"
@@ -50796,15 +51236,15 @@ __exitcall_ebc_exit:
 	.string	"sysctl_nr_open"
 .LASF81:
 	.string	"reset_devices"
-.LASF2975:
+.LASF2974:
 	.string	"auto_image_bg"
 .LASF444:
 	.string	"i_wb"
 .LASF2084:
 	.string	"idr_next"
-.LASF3110:
+.LASF3109:
 	.string	"frame_count_data"
-.LASF2951:
+.LASF2950:
 	.string	"frame_start"
 .LASF1248:
 	.string	"compound_order"
@@ -50852,7 +51292,7 @@ __exitcall_ebc_exit:
 	.string	"normal_prio"
 .LASF1286:
 	.string	"f_ep_links"
-.LASF3122:
+.LASF3121:
 	.string	"image_fb_tmp"
 .LASF2292:
 	.string	"last_busy"
@@ -50954,7 +51394,7 @@ __exitcall_ebc_exit:
 	.string	"ebc_empty_buf_get"
 .LASF1472:
 	.string	"NR_ISOLATED_ANON"
-.LASF3041:
+.LASF3040:
 	.string	"ebc_lut_table_init"
 .LASF1211:
 	.string	"uprobes_state"
@@ -50964,7 +51404,7 @@ __exitcall_ebc_exit:
 	.string	"rb_node"
 .LASF611:
 	.string	"pushable_tasks"
-.LASF3123:
+.LASF3122:
 	.string	"image_bg_tmp"
 .LASF2200:
 	.string	"platform_data"
@@ -51010,7 +51450,7 @@ __exitcall_ebc_exit:
 	.string	"pcpu_unit_offsets"
 .LASF3143:
 	.string	"dma_sync_single_for_device"
-.LASF2952:
+.LASF2951:
 	.string	"dsp_end_callback"
 .LASF458:
 	.string	"i_data"
@@ -51034,7 +51474,7 @@ __exitcall_ebc_exit:
 	.string	"usage_count"
 .LASF2075:
 	.string	"show"
-.LASF3007:
+.LASF3006:
 	.string	"dev_attr_pmic_temp"
 .LASF7:
 	.string	"unsigned char"
@@ -51050,7 +51490,7 @@ __exitcall_ebc_exit:
 	.string	"task_rss_stat"
 .LASF1139:
 	.string	"pipe_inode_info"
-.LASF2979:
+.LASF2978:
 	.string	"ebc_power_status"
 .LASF958:
 	.string	"ratelimit"
@@ -51066,7 +51506,7 @@ __exitcall_ebc_exit:
 	.string	"uevent_ops"
 .LASF543:
 	.string	"rename_lock"
-.LASF3072:
+.LASF3071:
 	.string	"__out"
 .LASF678:
 	.string	"sas_ss_sp"
@@ -51140,7 +51580,7 @@ __exitcall_ebc_exit:
 	.string	"icq_hint"
 .LASF1992:
 	.string	"fiemap_extent_info"
-.LASF2908:
+.LASF2907:
 	.string	"DMA_TO_DEVICE"
 .LASF2727:
 	.string	"elf64_shdr"
@@ -51158,11 +51598,11 @@ __exitcall_ebc_exit:
 	.string	"sigval_t"
 .LASF1931:
 	.string	"fa_file"
-.LASF2995:
+.LASF2994:
 	.string	"panel"
 .LASF2430:
 	.string	"irq_data"
-.LASF3079:
+.LASF3078:
 	.string	"old_buffer_temp"
 .LASF2703:
 	.string	"sysctl_memory_failure_recovery"
@@ -51180,7 +51620,7 @@ __exitcall_ebc_exit:
 	.string	"st_shndx"
 .LASF2397:
 	.string	"free"
-.LASF3047:
+.LASF3046:
 	.string	"pmic_vcom_write"
 .LASF2131:
 	.string	"attribute"
@@ -51286,7 +51726,7 @@ __exitcall_ebc_exit:
 	.string	"unlink"
 .LASF2715:
 	.string	"d_ptr"
-.LASF3049:
+.LASF3048:
 	.string	"pmic_temp_read"
 .LASF1650:
 	.string	"dqstats"
@@ -51308,11 +51748,11 @@ __exitcall_ebc_exit:
 	.string	"mmap_rnd_bits"
 .LASF2459:
 	.string	"of_stdout"
-.LASF3070:
+.LASF3069:
 	.string	"new_prev_buf"
 .LASF974:
 	.string	"vm_ops"
-.LASF2928:
+.LASF2927:
 	.string	"ebc_panel"
 .LASF1300:
 	.string	"pagesize"
@@ -51324,7 +51764,9 @@ __exitcall_ebc_exit:
 	.string	"timer"
 .LASF2460:
 	.string	"devtree_lock"
-.LASF3060:
+.LASF3125:
+	.string	"refresh_new_image_auto"
+.LASF3059:
 	.string	"__ret"
 .LASF1862:
 	.string	"update_time"
@@ -51346,17 +51788,17 @@ __exitcall_ebc_exit:
 	.string	"expiry"
 .LASF569:
 	.string	"optimistic_spin_queue"
-.LASF2957:
+.LASF2956:
 	.string	"ebc_buffer_size"
 .LASF3252:
 	.string	"ebc_pmic_set_vcom"
 .LASF2639:
 	.string	"ALLOCSTALL_NORMAL"
-.LASF3104:
+.LASF3103:
 	.string	"data_buf_tmp"
 .LASF323:
 	.string	"__initdata_begin"
-.LASF2902:
+.LASF2901:
 	.string	"pmic_pm_resume"
 .LASF224:
 	.string	"__lstate"
@@ -51430,7 +51872,7 @@ __exitcall_ebc_exit:
 	.string	"algo_data"
 .LASF1509:
 	.string	"node_zones"
-.LASF3008:
+.LASF3007:
 	.string	"dev_attr_pmic_vcom"
 .LASF1557:
 	.string	"initialized"
@@ -51444,7 +51886,7 @@ __exitcall_ebc_exit:
 	.string	"mod_plt_sec"
 .LASF634:
 	.string	"tgid"
-.LASF2892:
+.LASF2891:
 	.string	"epd_mode"
 .LASF1136:
 	.string	"compat_robust_list_head"
@@ -51552,7 +51994,7 @@ __exitcall_ebc_exit:
 	.string	"totalram_pages"
 .LASF2484:
 	.string	"i2c_smbus_data"
-.LASF2983:
+.LASF2982:
 	.string	"curr_dsp_buf"
 .LASF1066:
 	.string	"time_slice"
@@ -51592,7 +52034,7 @@ __exitcall_ebc_exit:
 	.string	"wake_lock"
 .LASF2268:
 	.string	"may_skip_resume"
-.LASF2991:
+.LASF2990:
 	.string	"is_deep_sleep"
 .LASF1172:
 	.string	"shrinker"
@@ -51624,7 +52066,7 @@ __exitcall_ebc_exit:
 	.string	"ate_match_local_cap_id"
 .LASF2451:
 	.string	"property"
-.LASF3044:
+.LASF3043:
 	.string	"ebc_sysfs_init"
 .LASF989:
 	.string	"wchar"
@@ -51634,7 +52076,7 @@ __exitcall_ebc_exit:
 	.string	"platform_notify"
 .LASF61:
 	.string	"kernel_symbol"
-.LASF2920:
+.LASF2919:
 	.string	"dma_virt_ops"
 .LASF2296:
 	.string	"subsys_data"
@@ -51750,7 +52192,7 @@ __exitcall_ebc_exit:
 	.string	"fault_address"
 .LASF1604:
 	.string	"dq_inuse"
-.LASF3096:
+.LASF3095:
 	.string	"direct_mode_data_change_part"
 .LASF1639:
 	.string	"dqi_flags"
@@ -51764,7 +52206,7 @@ __exitcall_ebc_exit:
 	.string	"kfree"
 .LASF1800:
 	.string	"swap_deactivate"
-.LASF2936:
+.LASF2935:
 	.string	"gdck_sta"
 .LASF1141:
 	.string	"request_queue"
@@ -51784,7 +52226,7 @@ __exitcall_ebc_exit:
 	.string	"gtime"
 .LASF570:
 	.string	"debug_locks"
-.LASF2998:
+.LASF2997:
 	.string	"auto_buf_sema"
 .LASF1781:
 	.string	"readpage"
@@ -51804,7 +52246,7 @@ __exitcall_ebc_exit:
 	.string	"perm"
 .LASF712:
 	.string	"compat_robust_list"
-.LASF2955:
+.LASF2954:
 	.string	"ebc_buffer_phy"
 .LASF2475:
 	.string	"unmap"
@@ -51826,7 +52268,7 @@ __exitcall_ebc_exit:
 	.string	"alternatives_applied"
 .LASF595:
 	.string	"boost_expires"
-.LASF2907:
+.LASF2906:
 	.string	"DMA_BIDIRECTIONAL"
 .LASF3260:
 	.string	"__arch_copy_to_user"
@@ -51846,13 +52288,13 @@ __exitcall_ebc_exit:
 	.string	"d_compare"
 .LASF969:
 	.string	"vm_mm"
-.LASF3080:
+.LASF3079:
 	.string	"need_refresh"
 .LASF2818:
 	.string	"platform_bus_type"
-.LASF3097:
+.LASF3096:
 	.string	"data_buf"
-.LASF3034:
+.LASF3033:
 	.string	"ulogo_buf"
 .LASF1635:
 	.string	"mem_dqinfo"
@@ -51872,13 +52314,13 @@ __exitcall_ebc_exit:
 	.string	"fl_fasync"
 .LASF3137:
 	.string	"update_mode"
-.LASF2934:
+.LASF2933:
 	.string	"direct_mode"
 .LASF2409:
 	.string	"cache_sync"
 .LASF433:
 	.string	"i_lock"
-.LASF2970:
+.LASF2969:
 	.string	"ebc_dsp_buf_status"
 .LASF405:
 	.string	"d_name"
@@ -51912,7 +52354,7 @@ __exitcall_ebc_exit:
 	.string	"last_switch_time"
 .LASF563:
 	.string	"fs_overflowuid"
-.LASF2923:
+.LASF2922:
 	.string	"start_info"
 .LASF2691:
 	.string	"vm_zone_stat"
@@ -51942,11 +52384,11 @@ __exitcall_ebc_exit:
 	.string	"page_ext_operations"
 .LASF2661:
 	.string	"KSWAPD_HIGH_WMARK_HIT_QUICKLY"
-.LASF3045:
+.LASF3044:
 	.string	"ebc_state_read"
 .LASF3249:
 	.string	"__stack_chk_fail"
-.LASF2905:
+.LASF2904:
 	.string	"pmic_set_vcom"
 .LASF2697:
 	.string	"stack_guard_gap"
@@ -51982,7 +52424,7 @@ __exitcall_ebc_exit:
 	.string	"thaw_noirq"
 .LASF967:
 	.string	"vm_rb"
-.LASF3018:
+.LASF3017:
 	.string	"kernel_read_file_str"
 .LASF566:
 	.string	"init_user_ns"
@@ -51990,7 +52432,7 @@ __exitcall_ebc_exit:
 	.string	"add_links"
 .LASF2172:
 	.string	"pm_message_t"
-.LASF2925:
+.LASF2924:
 	.string	"xen_dma_ops"
 .LASF1442:
 	.string	"page_group_by_mobility_disabled"
@@ -52024,9 +52466,9 @@ __exitcall_ebc_exit:
 	.string	"payload"
 .LASF1387:
 	.string	"cb_state"
-.LASF2917:
+.LASF2916:
 	.string	"orig_nents"
-.LASF3059:
+.LASF3058:
 	.string	"buf_addr"
 .LASF410:
 	.string	"d_sb"
@@ -52052,11 +52494,9 @@ __exitcall_ebc_exit:
 	.string	"private_lock"
 .LASF431:
 	.string	"i_mtime"
-.LASF2889:
-	.string	"EPD_OVERLAY_WHITE"
 .LASF2602:
 	.string	"dev_page_fault_t"
-.LASF3090:
+.LASF3089:
 	.string	"ebc_auto_tast_function"
 .LASF24:
 	.string	"__kernel_gid32_t"
@@ -52092,7 +52532,7 @@ __exitcall_ebc_exit:
 	.string	"async_put_work"
 .LASF2114:
 	.string	"kernfs_syscall_ops"
-.LASF2980:
+.LASF2979:
 	.string	"ebc_last_display"
 .LASF1855:
 	.string	"mknod"
@@ -52100,7 +52540,7 @@ __exitcall_ebc_exit:
 	.string	"SYSTEM_BOOTING"
 .LASF1598:
 	.string	"max_freq_scale"
-.LASF2918:
+.LASF2917:
 	.string	"dma_direct_ops"
 .LASF2250:
 	.string	"dev_pm_info"
@@ -52114,7 +52554,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pagemap"
 .LASF2646:
 	.string	"PGDEACTIVATE"
-.LASF3103:
+.LASF3102:
 	.string	"buffer_old_tmp"
 .LASF1782:
 	.string	"writepages"
@@ -52140,7 +52580,7 @@ __exitcall_ebc_exit:
 	.string	"super_operations"
 .LASF392:
 	.string	"want_pages"
-.LASF2944:
+.LASF2943:
 	.string	"regmap_base"
 .LASF336:
 	.string	"wps_disabled"
@@ -52166,7 +52606,7 @@ __exitcall_ebc_exit:
 	.string	"i_security"
 .LASF2642:
 	.string	"PGSCAN_SKIP_NORMAL"
-.LASF2916:
+.LASF2915:
 	.string	"nents"
 .LASF754:
 	.string	"__smp_cross_call"
@@ -52174,9 +52614,9 @@ __exitcall_ebc_exit:
 	.string	"core"
 .LASF1813:
 	.string	"bd_holders"
-.LASF3094:
+.LASF3093:
 	.string	"reset_and_flip"
-.LASF2945:
+.LASF2944:
 	.string	"enable"
 .LASF953:
 	.string	"pipe_bufs"
@@ -52198,7 +52638,7 @@ __exitcall_ebc_exit:
 	.string	"__rb_parent_color"
 .LASF2222:
 	.string	"devres_lock"
-.LASF3125:
+.LASF3124:
 	.string	"new_buffer_refresh"
 .LASF363:
 	.string	"bits"
@@ -52218,13 +52658,13 @@ __exitcall_ebc_exit:
 	.string	"sp_el0"
 .LASF3267:
 	.string	"ebc_dsp_buf_get"
-.LASF2894:
+.LASF2893:
 	.string	"panel_color"
 .LASF1894:
 	.string	"fl_owner"
 .LASF2849:
 	.string	"WF_TYPE_GLD16"
-.LASF2992:
+.LASF2991:
 	.string	"is_power_off"
 .LASF977:
 	.string	"vm_private_data"
@@ -52238,7 +52678,7 @@ __exitcall_ebc_exit:
 	.string	"kobj_type"
 .LASF2620:
 	.string	"sysctl_overcommit_kbytes"
-.LASF2964:
+.LASF2963:
 	.string	"frame_left"
 .LASF2477:
 	.string	"deactivate"
@@ -52276,9 +52716,9 @@ __exitcall_ebc_exit:
 	.string	"unix_inflight"
 .LASF1724:
 	.string	"holders_dir"
-.LASF3061:
+.LASF3060:
 	.string	"__wq_entry"
-.LASF3075:
+.LASF3074:
 	.string	"new_buffer"
 .LASF461:
 	.string	"i_fsnotify_mask"
@@ -52328,7 +52768,7 @@ __exitcall_ebc_exit:
 	.string	"hex_asc_upper"
 .LASF504:
 	.string	"s_roots"
-.LASF2906:
+.LASF2905:
 	.string	"dma_data_direction"
 .LASF1687:
 	.string	"d_rt_spc_timer"
@@ -52380,7 +52820,7 @@ __exitcall_ebc_exit:
 	.string	"d_automount"
 .LASF1263:
 	.string	"page_free"
-.LASF3091:
+.LASF3090:
 	.string	"__val"
 .LASF1479:
 	.string	"NR_FILE_MAPPED"
@@ -52404,7 +52844,7 @@ __exitcall_ebc_exit:
 	.string	"get_named_child_node"
 .LASF2256:
 	.string	"is_suspended"
-.LASF2914:
+.LASF2913:
 	.string	"dma_length"
 .LASF2064:
 	.string	"burst"
@@ -52412,7 +52852,7 @@ __exitcall_ebc_exit:
 	.string	"clone_mnt_data"
 .LASF2775:
 	.string	"module_kobject"
-.LASF3039:
+.LASF3038:
 	.string	"memory"
 .LASF3171:
 	.string	"order"
@@ -52420,7 +52860,7 @@ __exitcall_ebc_exit:
 	.string	"active_memcg"
 .LASF1330:
 	.string	"def_flags"
-.LASF2996:
+.LASF2995:
 	.string	"global_ebc"
 .LASF1471:
 	.string	"NR_SLAB_UNRECLAIMABLE"
@@ -52428,7 +52868,7 @@ __exitcall_ebc_exit:
 	.string	"refcount"
 .LASF1788:
 	.string	"invalidatepage"
-.LASF3065:
+.LASF3064:
 	.string	"ebc_frame_timeout"
 .LASF361:
 	.string	"wait_queue_head_t"
@@ -52450,7 +52890,7 @@ __exitcall_ebc_exit:
 	.string	"EPD_A2"
 .LASF2100:
 	.string	"kernfs_elem_attr"
-.LASF3078:
+.LASF3077:
 	.string	"new_buffer_temp"
 .LASF2297:
 	.string	"set_latency_tolerance"
@@ -52484,9 +52924,9 @@ __exitcall_ebc_exit:
 	.string	"policy"
 .LASF1291:
 	.string	"shared"
-.LASF3012:
+.LASF3011:
 	.string	"ebc_match"
-.LASF2943:
+.LASF2942:
 	.string	"dclk"
 .LASF2215:
 	.string	"dma_mem"
@@ -52506,7 +52946,7 @@ __exitcall_ebc_exit:
 	.string	"module_sysfs_initialized"
 .LASF1000:
 	.string	"task_cputime"
-.LASF2967:
+.LASF2966:
 	.string	"lut_addr"
 .LASF1194:
 	.string	"rnode"
@@ -52516,7 +52956,7 @@ __exitcall_ebc_exit:
 	.string	"__con_initcall_start"
 .LASF1715:
 	.string	"get_dqblk"
-.LASF3024:
+.LASF3023:
 	.string	"ebc_tcon_node"
 .LASF2815:
 	.string	"id_entry"
@@ -52542,7 +52982,7 @@ __exitcall_ebc_exit:
 	.string	"quota_format_ops"
 .LASF3265:
 	.string	"ebc_osd_buf_get"
-.LASF3056:
+.LASF3055:
 	.string	"argp"
 .LASF1752:
 	.string	"args"
@@ -52554,13 +52994,13 @@ __exitcall_ebc_exit:
 	.string	"run_delay"
 .LASF1996:
 	.string	"fi_extents_start"
-.LASF2926:
+.LASF2925:
 	.string	"dummy_dma_ops"
 .LASF238:
 	.string	"static_key_initialized"
 .LASF2782:
 	.string	"module_uevent"
-.LASF3069:
+.LASF3068:
 	.string	"is_full_mode"
 .LASF2595:
 	.string	"base_pfn"
@@ -52568,13 +53008,13 @@ __exitcall_ebc_exit:
 	.string	"width"
 .LASF927:
 	.string	"_addr_pkey"
-.LASF3052:
+.LASF3051:
 	.string	"waveform_buffer"
 .LASF296:
 	.string	"__start_rodata"
 .LASF1466:
 	.string	"NR_ACTIVE_ANON"
-.LASF2929:
+.LASF2928:
 	.string	"tcon"
 .LASF1113:
 	.string	"thread_keyring"
@@ -52586,7 +53026,7 @@ __exitcall_ebc_exit:
 	.string	"utime"
 .LASF1332:
 	.string	"start_code"
-.LASF3013:
+.LASF3012:
 	.string	"ebc_driver"
 .LASF2603:
 	.string	"dev_page_free_t"
@@ -52608,7 +53048,7 @@ __exitcall_ebc_exit:
 	.string	"tz_minuteswest"
 .LASF2457:
 	.string	"of_chosen"
-.LASF3092:
+.LASF3091:
 	.string	"ebc_frame_start"
 .LASF346:
 	.string	"sve_state"
@@ -52742,7 +53182,7 @@ __exitcall_ebc_exit:
 	.string	"file_lock_operations"
 .LASF341:
 	.string	"tp_value"
-.LASF3021:
+.LASF3020:
 	.string	"ebc_remove"
 .LASF1891:
 	.string	"fl_list"
@@ -52772,11 +53212,11 @@ __exitcall_ebc_exit:
 	.string	"sysctl_drop_caches"
 .LASF1971:
 	.string	"show_devname"
-.LASF2938:
+.LASF2937:
 	.string	"panel_16bit"
 .LASF1320:
 	.string	"page_table_lock"
-.LASF3011:
+.LASF3010:
 	.string	"ebc_pm"
 .LASF2838:
 	.string	"sched_priority"
@@ -52832,7 +53272,7 @@ __exitcall_ebc_exit:
 	.string	"__i_nlink"
 .LASF144:
 	.string	"panic_on_warn"
-.LASF3063:
+.LASF3062:
 	.string	"ebc_panel_probe"
 .LASF79:
 	.string	"boot_command_line"
@@ -52850,13 +53290,13 @@ __exitcall_ebc_exit:
 	.string	"d_spc_warns"
 .LASF1038:
 	.string	"nr_failed_migrations_hot"
-.LASF2930:
+.LASF2929:
 	.string	"pmic"
 .LASF1134:
 	.string	"css_set"
 .LASF1400:
 	.string	"guid_index"
-.LASF2969:
+.LASF2968:
 	.string	"ebc_irq_status"
 .LASF2542:
 	.string	"force_irqthreads"
@@ -52904,7 +53344,7 @@ __exitcall_ebc_exit:
 	.string	"early_boot_irqs_disabled"
 .LASF656:
 	.string	"nvcsw"
-.LASF3037:
+.LASF3036:
 	.string	"ebc_task_init"
 .LASF2830:
 	.string	"KMALLOC_NORMAL"
@@ -52924,7 +53364,7 @@ __exitcall_ebc_exit:
 	.string	"i_gid"
 .LASF1617:
 	.string	"quota_type"
-.LASF3099:
+.LASF3098:
 	.string	"buffer_old"
 .LASF1534:
 	.string	"high"
@@ -52940,11 +53380,11 @@ __exitcall_ebc_exit:
 	.string	"self_exec_id"
 .LASF1905:
 	.string	"fl_downgrade_time"
-.LASF2976:
+.LASF2975:
 	.string	"auto_frame_count"
 .LASF2102:
 	.string	"kernfs_ops"
-.LASF2973:
+.LASF2972:
 	.string	"auto_image_new"
 .LASF805:
 	.string	"WORK_CPU_UNBOUND"
@@ -52968,15 +53408,15 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_WRITE_PENDING"
 .LASF1294:
 	.string	"close"
-.LASF3119:
+.LASF3118:
 	.string	"image_fb_data"
-.LASF3035:
+.LASF3034:
 	.string	"klogo_buf"
 .LASF2888:
 	.string	"EPD_POWER_OFF"
 .LASF1499:
 	.string	"zone_reclaim_stat"
-.LASF2999:
+.LASF2998:
 	.string	"ebc_wq"
 .LASF734:
 	.string	"memcg_oom_gfp_mask"
@@ -53032,11 +53472,11 @@ __exitcall_ebc_exit:
 	.string	"plt_max_entries"
 .LASF2401:
 	.string	"map_sg"
-.LASF2968:
+.LASF2967:
 	.string	"buffer_need_check"
 .LASF1157:
 	.string	"nlink"
-.LASF3030:
+.LASF3029:
 	.string	"ulogo_addr_valid"
 .LASF2575:
 	.string	"percpu_ref"
@@ -53064,7 +53504,7 @@ __exitcall_ebc_exit:
 	.string	"mems_allowed_seq"
 .LASF1768:
 	.string	"refcnt"
-.LASF3082:
+.LASF3081:
 	.string	"pbuf_new"
 .LASF2179:
 	.string	"thaw"
@@ -53102,7 +53542,7 @@ __exitcall_ebc_exit:
 	.string	"kioctx_table"
 .LASF850:
 	.string	"rb_right"
-.LASF3102:
+.LASF3101:
 	.string	"buffer_new_tmp"
 .LASF976:
 	.string	"vm_file"
@@ -53132,7 +53572,7 @@ __exitcall_ebc_exit:
 	.string	"kmalloc_type"
 .LASF385:
 	.string	"qstr"
-.LASF3101:
+.LASF3100:
 	.string	"gray_new"
 .LASF1090:
 	.string	"futex_state"
@@ -53240,13 +53680,13 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_FLAG_BITS"
 .LASF2446:
 	.string	"fwnode_endpoint"
-.LASF3062:
+.LASF3061:
 	.string	"__int"
 .LASF950:
 	.string	"epoll_watches"
 .LASF2675:
 	.string	"KCOMPACTD_WAKE"
-.LASF3114:
+.LASF3113:
 	.string	"refresh_new_image"
 .LASF2072:
 	.string	"non_rcu"
@@ -53280,7 +53720,7 @@ __exitcall_ebc_exit:
 	.string	"_uid"
 .LASF337:
 	.string	"hbp_break"
-.LASF3026:
+.LASF3025:
 	.string	"pmic_node"
 .LASF138:
 	.string	"panic_blink"
@@ -53344,7 +53784,7 @@ __exitcall_ebc_exit:
 	.string	"__s8"
 .LASF350:
 	.string	"fault_code"
-.LASF3005:
+.LASF3004:
 	.string	"dev_attr_waveform_version"
 .LASF2209:
 	.string	"dma_mask"
@@ -53378,9 +53818,9 @@ __exitcall_ebc_exit:
 	.string	"__kernel_ulong_t"
 .LASF2604:
 	.string	"max_mapnr"
-.LASF2953:
+.LASF2952:
 	.string	"regmap"
-.LASF2921:
+.LASF2920:
 	.string	"shared_info"
 .LASF770:
 	.string	"read_cntp_tval_el0"
@@ -53420,9 +53860,9 @@ __exitcall_ebc_exit:
 	.string	"PGALLOC_DMA32"
 .LASF2753:
 	.string	"param_ops_long"
-.LASF2994:
+.LASF2993:
 	.string	"overlay_start"
-.LASF2949:
+.LASF2948:
 	.string	"frame_addr_set"
 .LASF1075:
 	.string	"runtime"
@@ -53448,7 +53888,7 @@ __exitcall_ebc_exit:
 	.string	"xattr_handler"
 .LASF1424:
 	.string	"kiocb"
-.LASF2895:
+.LASF2894:
 	.string	"width_mm"
 .LASF1563:
 	.string	"compact_order_failed"
@@ -53534,7 +53974,7 @@ __exitcall_ebc_exit:
 	.string	"NR_VM_NODE_STAT_ITEMS"
 .LASF233:
 	.string	"raw_spinlock_t"
-.LASF2932:
+.LASF2931:
 	.string	"vir_width"
 .LASF3206:
 	.string	"INIT_LIST_HEAD"
@@ -53556,7 +53996,7 @@ __exitcall_ebc_exit:
 	.string	"sign_extend64"
 .LASF2311:
 	.string	"wake_irq"
-.LASF3028:
+.LASF3027:
 	.string	"ulogo_addr"
 .LASF857:
 	.string	"pcpu_fc"
@@ -53594,7 +54034,7 @@ __exitcall_ebc_exit:
 	.string	"d_lockref"
 .LASF2240:
 	.string	"rpm_request"
-.LASF3055:
+.LASF3054:
 	.string	"ebc_io_ctl"
 .LASF1147:
 	.string	"addr"
@@ -53614,7 +54054,7 @@ __exitcall_ebc_exit:
 	.string	"mm_rss_stat"
 .LASF1720:
 	.string	"mkobj"
-.LASF2959:
+.LASF2958:
 	.string	"direct_buf_real_size"
 .LASF3266:
 	.string	"__pm_relax"
@@ -53626,7 +54066,7 @@ __exitcall_ebc_exit:
 	.string	"begin"
 .LASF2734:
 	.string	"sh_link"
-.LASF3019:
+.LASF3018:
 	.string	"ebc_suspend"
 .LASF2355:
 	.string	"cls_msk"
@@ -53648,19 +54088,19 @@ __exitcall_ebc_exit:
 	.string	"num_resources"
 .LASF1573:
 	.string	"notifier_fn_t"
-.LASF3027:
+.LASF3026:
 	.string	"pmic_client"
 .LASF2569:
 	.string	"miscdevice"
 .LASF653:
 	.string	"time_in_state"
-.LASF3036:
+.LASF3035:
 	.string	"ebc_logo_init"
 .LASF1266:
 	.string	"kill"
 .LASF1027:
 	.string	"iowait_sum"
-.LASF3115:
+.LASF3114:
 	.string	"image_new"
 .LASF15:
 	.string	"__u64"
@@ -53686,13 +54126,13 @@ __exitcall_ebc_exit:
 	.string	"i_blkbits"
 .LASF2453:
 	.string	"value"
-.LASF2988:
+.LASF2987:
 	.string	"frame_timer"
 .LASF1030:
 	.string	"sum_sleep_runtime"
-.LASF3032:
+.LASF3031:
 	.string	"ulogo_addr_str"
-.LASF3095:
+.LASF3094:
 	.string	"flip"
 .LASF1076:
 	.string	"deadline"
@@ -53734,7 +54174,7 @@ __exitcall_ebc_exit:
 	.string	"read_dqblk"
 .LASF1613:
 	.string	"dq_flags"
-.LASF3098:
+.LASF3097:
 	.string	"buffer_new"
 .LASF212:
 	.string	"user_fpsimd_state"
@@ -53762,7 +54202,7 @@ __exitcall_ebc_exit:
 	.string	"s_bdi"
 .LASF2854:
 	.string	"wf_table"
-.LASF3121:
+.LASF3120:
 	.string	"image_new_tmp"
 .LASF1729:
 	.string	"num_kp"
@@ -53770,7 +54210,7 @@ __exitcall_ebc_exit:
 	.string	"__pm_stay_awake"
 .LASF2562:
 	.string	"vmap_area_list"
-.LASF3002:
+.LASF3001:
 	.string	"ebc_auto_thread_sem"
 .LASF627:
 	.string	"in_execve"
@@ -53820,7 +54260,7 @@ __exitcall_ebc_exit:
 	.string	"names_cachep"
 .LASF782:
 	.string	"preset_lpj"
-.LASF2987:
+.LASF2986:
 	.string	"vdd_timer"
 .LASF2218:
 	.string	"archdata"
@@ -53872,7 +54312,7 @@ __exitcall_ebc_exit:
 	.string	"seeks"
 .LASF574:
 	.string	"task_struct"
-.LASF2896:
+.LASF2895:
 	.string	"height_mm"
 .LASF2637:
 	.string	"PGALLOC_MOVABLE"
@@ -53910,7 +54350,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_RESUMING"
 .LASF468:
 	.string	"d_weak_revalidate"
-.LASF2982:
+.LASF2981:
 	.string	"prev_dsp_buf"
 .LASF1490:
 	.string	"NR_VMSCAN_IMMEDIATE"
@@ -53926,7 +54366,7 @@ __exitcall_ebc_exit:
 	.string	"setup_max_cpus"
 .LASF1831:
 	.string	"i_nlink"
-.LASF2939:
+.LASF2938:
 	.string	"mirror"
 .LASF1785:
 	.string	"write_begin"
@@ -53934,11 +54374,11 @@ __exitcall_ebc_exit:
 	.string	"groups"
 .LASF691:
 	.string	"pi_blocked_on"
-.LASF3023:
+.LASF3022:
 	.string	"ebc_probe"
 .LASF498:
 	.string	"s_xattr"
-.LASF3033:
+.LASF3032:
 	.string	"klogo_addr_str"
 .LASF990:
 	.string	"syscr"
@@ -53972,7 +54412,7 @@ __exitcall_ebc_exit:
 	.string	"s_inode_list_lock"
 .LASF2597:
 	.string	"align"
-.LASF3105:
+.LASF3104:
 	.string	"frame_idx"
 .LASF203:
 	.string	"mm_segment_t"
@@ -54000,7 +54440,7 @@ __exitcall_ebc_exit:
 	.string	"c_false"
 .LASF897:
 	.string	"clock_base"
-.LASF2903:
+.LASF2902:
 	.string	"pmic_read_temperature"
 .LASF1795:
 	.string	"launder_page"
@@ -54030,13 +54470,13 @@ __exitcall_ebc_exit:
 	.string	"arg_lock"
 .LASF1738:
 	.string	"num_exentries"
-.LASF3084:
+.LASF3083:
 	.string	"check_out"
 .LASF2606:
 	.string	"high_memory"
 .LASF48:
 	.string	"int32_t"
-.LASF3015:
+.LASF3014:
 	.string	"__exitcall_ebc_exit"
 .LASF1037:
 	.string	"nr_failed_migrations_running"
@@ -54076,7 +54516,7 @@ __exitcall_ebc_exit:
 	.string	"lock_key"
 .LASF2560:
 	.string	"tramp_pg_dir"
-.LASF3009:
+.LASF3008:
 	.string	"dev_attr_ebc_version"
 .LASF861:
 	.string	"PCPU_FC_NR"
@@ -54128,7 +54568,7 @@ __exitcall_ebc_exit:
 	.string	"file_lock"
 .LASF322:
 	.string	"__idmap_text_end"
-.LASF2961:
+.LASF2960:
 	.string	"frame_total"
 .LASF773:
 	.string	"read_cntvct_el0"
@@ -54138,7 +54578,7 @@ __exitcall_ebc_exit:
 	.string	"HI_SOFTIRQ"
 .LASF3150:
 	.string	"direction"
-.LASF3120:
+.LASF3119:
 	.string	"image_bg_data"
 .LASF955:
 	.string	"session_keyring"
@@ -54148,7 +54588,7 @@ __exitcall_ebc_exit:
 	.string	"key_restrict_link_func_t"
 .LASF1482:
 	.string	"NR_WRITEBACK"
-.LASF3108:
+.LASF3107:
 	.string	"frame_count"
 .LASF484:
 	.string	"s_maxbytes"
@@ -54224,7 +54664,7 @@ __exitcall_ebc_exit:
 	.string	"filter"
 .LASF3151:
 	.string	"ebc_pmic_get_vcom"
-.LASF2940:
+.LASF2939:
 	.string	"ebc_tcon"
 .LASF2608:
 	.string	"sysctl_legacy_va_layout"
@@ -54308,13 +54748,13 @@ __exitcall_ebc_exit:
 	.string	"saved_sigmask"
 .LASF411:
 	.string	"d_time"
-.LASF2954:
+.LASF2953:
 	.string	"ebc_info"
 .LASF239:
 	.string	"entries"
 .LASF998:
 	.string	"cpu_id"
-.LASF2947:
+.LASF2946:
 	.string	"dsp_mode_set"
 .LASF2649:
 	.string	"PGMAJFAULT"
@@ -54358,7 +54798,7 @@ __exitcall_ebc_exit:
 	.string	"wait_pidfd"
 .LASF1943:
 	.string	"s_umount_key"
-.LASF2924:
+.LASF2923:
 	.string	"xen_start_info"
 .LASF2455:
 	.string	"of_fwnode_ops"
@@ -54388,7 +54828,7 @@ __exitcall_ebc_exit:
 	.string	"Elf64_Half"
 .LASF2284:
 	.string	"use_autosuspend"
-.LASF3016:
+.LASF3015:
 	.string	"ebc_init"
 .LASF672:
 	.string	"nsproxy"
@@ -54396,7 +54836,7 @@ __exitcall_ebc_exit:
 	.string	"can_wakeup"
 .LASF2544:
 	.string	"TIMER_SOFTIRQ"
-.LASF3112:
+.LASF3111:
 	.string	"temp_data"
 .LASF1212:
 	.string	"xol_area"
@@ -54430,7 +54870,7 @@ __exitcall_ebc_exit:
 	.string	"__fls"
 .LASF1127:
 	.string	"ioprio"
-.LASF2990:
+.LASF2989:
 	.string	"is_early_suspend"
 .LASF1161:
 	.string	"rdev"
@@ -54466,8 +54906,6 @@ __exitcall_ebc_exit:
 	.string	"release"
 .LASF2368:
 	.string	"max_segment_size"
-.LASF3014:
-	.string	"__addressable_ebc_init2107"
 .LASF36:
 	.string	"__kernel_dev_t"
 .LASF2107:
@@ -54504,13 +54942,13 @@ __exitcall_ebc_exit:
 	.string	"symlink"
 .LASF1572:
 	.string	"mem_map"
-.LASF3076:
+.LASF3075:
 	.string	"old_buffer"
-.LASF2950:
+.LASF2949:
 	.string	"lut_data_set"
 .LASF788:
 	.string	"sysctl_timer_migration"
-.LASF2910:
+.LASF2909:
 	.string	"DMA_NONE"
 .LASF1896:
 	.string	"fl_type"
@@ -54604,7 +55042,7 @@ __exitcall_ebc_exit:
 	.string	"flc_lease"
 .LASF2404:
 	.string	"unmap_resource"
-.LASF2985:
+.LASF2984:
 	.string	"wake_lock_is_set"
 .LASF2356:
 	.string	"driver_private"
@@ -54650,7 +55088,7 @@ __exitcall_ebc_exit:
 	.string	"pstate_check_t"
 .LASF828:
 	.string	"system_freezable_power_efficient_wq"
-.LASF3020:
+.LASF3019:
 	.string	"__func__"
 .LASF56:
 	.string	"resource_size_t"
@@ -54672,7 +55110,7 @@ __exitcall_ebc_exit:
 	.string	"_stext"
 .LASF1708:
 	.string	"quotactl_ops"
-.LASF3081:
+.LASF3080:
 	.string	"aligned_left"
 .LASF533:
 	.string	"s_sync_lock"
@@ -54682,12 +55120,14 @@ __exitcall_ebc_exit:
 	.string	"__kernel_clock_t"
 .LASF390:
 	.string	"nr_unused"
-.LASF2913:
+.LASF2912:
 	.string	"dma_address"
 .LASF2613:
 	.string	"mmap_rnd_compat_bits_max"
 .LASF40:
 	.string	"clockid_t"
+.LASF3013:
+	.string	"__addressable_ebc_init2194"
 .LASF1605:
 	.string	"dq_free"
 .LASF1579:
@@ -54702,9 +55142,9 @@ __exitcall_ebc_exit:
 	.string	"vregs"
 .LASF2622:
 	.string	"page_entry_size"
-.LASF2971:
+.LASF2970:
 	.string	"lut_data"
-.LASF3093:
+.LASF3092:
 	.string	"ebc_other_init"
 .LASF1444:
 	.string	"free_list"
@@ -54748,7 +55188,7 @@ __exitcall_ebc_exit:
 	.string	"short int"
 .LASF2352:
 	.string	"of_device_id"
-.LASF2911:
+.LASF2910:
 	.string	"scatterlist"
 .LASF1265:
 	.string	"altmap_valid"
@@ -54800,11 +55240,11 @@ __exitcall_ebc_exit:
 	.string	"current_may_mount"
 .LASF379:
 	.string	"seqlock_t"
-.LASF2942:
+.LASF2941:
 	.string	"hclk"
 .LASF2113:
 	.string	"kernfs_iattrs"
-.LASF2904:
+.LASF2903:
 	.string	"pmic_get_vcom"
 .LASF624:
 	.string	"sched_migrated"
@@ -54906,7 +55346,7 @@ __exitcall_ebc_exit:
 	.string	"thread_id"
 .LASF730:
 	.string	"default_timer_slack_ns"
-.LASF3051:
+.LASF3050:
 	.string	"waveform_version_read"
 .LASF1765:
 	.string	"source_list"
@@ -54948,7 +55388,7 @@ __exitcall_ebc_exit:
 	.string	"uuid_t"
 .LASF2435:
 	.string	"property_read_int_array"
-.LASF2974:
+.LASF2973:
 	.string	"auto_image_old"
 .LASF1858:
 	.string	"setattr2"
@@ -54976,9 +55416,9 @@ __exitcall_ebc_exit:
 	.string	"atomic_notifier_head"
 .LASF1058:
 	.string	"statistics"
-.LASF2931:
+.LASF2930:
 	.string	"current_buffer"
-.LASF3106:
+.LASF3105:
 	.string	"direct_mode_data_change"
 .LASF1616:
 	.string	"kprojid_t"
@@ -55000,9 +55440,9 @@ __exitcall_ebc_exit:
 	.string	"_dev_err"
 .LASF3217:
 	.string	"__platform_driver_register"
-.LASF2958:
+.LASF2957:
 	.string	"ebc_buf_real_size"
-.LASF3000:
+.LASF2999:
 	.string	"ebc_thread_wq"
 .LASF1792:
 	.string	"migratepage"
@@ -55010,7 +55450,7 @@ __exitcall_ebc_exit:
 	.string	"DROP_PAGECACHE"
 .LASF790:
 	.string	"work_struct"
-.LASF2893:
+.LASF2892:
 	.string	"height"
 .LASF1092:
 	.string	"task_group"
@@ -55052,7 +55492,7 @@ __exitcall_ebc_exit:
 	.string	"max_comb_1st_msg_len"
 .LASF1543:
 	.string	"ZONE_MOVABLE"
-.LASF3004:
+.LASF3003:
 	.string	"ebc_misc"
 .LASF2390:
 	.string	"revmap_size"
@@ -55084,7 +55524,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_PENDING_BIT"
 .LASF718:
 	.string	"rseq"
-.LASF3107:
+.LASF3106:
 	.string	"get_auto_image"
 .LASF195:
 	.string	"nfds"
@@ -55102,13 +55542,13 @@ __exitcall_ebc_exit:
 	.string	"ebc_buf_init"
 .LASF2046:
 	.string	"key_payload"
-.LASF2977:
+.LASF2976:
 	.string	"auto_image_osd"
 .LASF478:
 	.string	"d_real"
 .LASF2558:
 	.string	"swapper_pg_end"
-.LASF3006:
+.LASF3005:
 	.string	"dev_attr_pmic_name"
 .LASF629:
 	.string	"in_user_fault"
@@ -55188,7 +55628,7 @@ __exitcall_ebc_exit:
 	.string	"__idmap_text_start"
 .LASF1714:
 	.string	"set_info"
-.LASF3054:
+.LASF3053:
 	.string	"ebc_mmap"
 .LASF2617:
 	.string	"sysctl_admin_reserve_kbytes"
@@ -55200,7 +55640,7 @@ __exitcall_ebc_exit:
 	.string	"lock_ops"
 .LASF1324:
 	.string	"hiwater_vm"
-.LASF3048:
+.LASF3047:
 	.string	"pmic_vcom_read"
 .LASF3219:
 	.string	"misc_deregister"
@@ -55242,9 +55682,9 @@ __exitcall_ebc_exit:
 	.string	"i_rt_spc_timelimit"
 .LASF139:
 	.string	"oops_in_progress"
-.LASF3003:
+.LASF3002:
 	.string	"ebc_ops"
-.LASF3029:
+.LASF3028:
 	.string	"klogo_addr"
 .LASF1649:
 	.string	"qf_next"
@@ -55268,7 +55708,7 @@ __exitcall_ebc_exit:
 	.string	"personality"
 .LASF1823:
 	.string	"bd_queue"
-.LASF3017:
+.LASF3016:
 	.string	"ebc_resume"
 .LASF2827:
 	.string	"init_task"
@@ -55344,7 +55784,7 @@ __exitcall_ebc_exit:
 	.string	"arch"
 .LASF2259:
 	.string	"no_pm"
-.LASF2891:
+.LASF2890:
 	.string	"ebc_buf_info"
 .LASF934:
 	.string	"_kill"
@@ -55370,7 +55810,7 @@ __exitcall_ebc_exit:
 	.string	"sve_vl"
 .LASF2652:
 	.string	"PGSTEAL_KSWAPD"
-.LASF3031:
+.LASF3030:
 	.string	"klogo_addr_valid"
 .LASF2600:
 	.string	"MEMORY_DEVICE_PUBLIC"
@@ -55424,7 +55864,7 @@ __exitcall_ebc_exit:
 	.string	"description"
 .LASF2795:
 	.string	"symtab"
-.LASF2915:
+.LASF2914:
 	.string	"sg_table"
 .LASF1122:
 	.string	"rt_mutex_waiter"
@@ -55438,7 +55878,7 @@ __exitcall_ebc_exit:
 	.string	"in_iowait"
 .LASF2584:
 	.string	"unregfunc"
-.LASF2901:
+.LASF2900:
 	.string	"pmic_pm_suspend"
 .LASF1102:
 	.string	"egid"
@@ -55462,7 +55902,7 @@ __exitcall_ebc_exit:
 	.string	"f_inode"
 .LASF2029:
 	.string	"procname"
-.LASF3111:
+.LASF3110:
 	.string	"point_data"
 .LASF3229:
 	.string	"epd_lut_from_file_init"
@@ -55488,19 +55928,19 @@ __exitcall_ebc_exit:
 	.string	"__kernel_clockid_t"
 .LASF683:
 	.string	"seccomp"
-.LASF3067:
+.LASF3066:
 	.string	"ebc_rst_panel"
 .LASF1789:
 	.string	"releasepage"
 .LASF1700:
 	.string	"qc_info"
-.LASF3068:
+.LASF3067:
 	.string	"ebc_thread"
-.LASF3083:
+.LASF3082:
 	.string	"pbuf_old"
 .LASF1501:
 	.string	"recent_scanned"
-.LASF2933:
+.LASF2932:
 	.string	"vir_height"
 .LASF1741:
 	.string	"core_layout"
@@ -55512,7 +55952,7 @@ __exitcall_ebc_exit:
 	.string	"win_y1"
 .LASF2869:
 	.string	"win_y2"
-.LASF3077:
+.LASF3076:
 	.string	"buf_size"
 .LASF2086:
 	.string	"bitmap"
@@ -55552,11 +55992,11 @@ __exitcall_ebc_exit:
 	.string	"MIGRATE_SYNC_LIGHT"
 .LASF1035:
 	.string	"nr_migrations_cold"
-.LASF3046:
+.LASF3045:
 	.string	"ebc_version_read"
 .LASF303:
 	.string	"__end_once"
-.LASF2919:
+.LASF2918:
 	.string	"dma_noncoherent_ops"
 .LASF1503:
 	.string	"lists"
@@ -55572,7 +56012,7 @@ __exitcall_ebc_exit:
 	.string	"inactive_age"
 .LASF2601:
 	.string	"MEMORY_DEVICE_FS_DAX"
-.LASF2962:
+.LASF2961:
 	.string	"frame_bw_total"
 .LASF2793:
 	.string	"ro_after_init_size"
@@ -55618,7 +56058,7 @@ __exitcall_ebc_exit:
 	.string	"mmap_sem"
 .LASF3256:
 	.string	"schedule"
-.LASF3086:
+.LASF3085:
 	.string	"old_buf_left"
 .LASF2440:
 	.string	"get_reference_args"
@@ -55678,7 +56118,7 @@ __exitcall_ebc_exit:
 	.string	"ki_flags"
 .LASF1389:
 	.string	"gp_type"
-.LASF2965:
+.LASF2964:
 	.string	"part_mode_count"
 .LASF398:
 	.string	"d_in_lookup_hash"
@@ -55704,7 +56144,7 @@ __exitcall_ebc_exit:
 	.string	"lock_stat"
 .LASF2392:
 	.string	"revmap_tree_mutex"
-.LASF3050:
+.LASF3049:
 	.string	"pmic_name_read"
 .LASF1077:
 	.string	"dl_throttled"
@@ -55730,7 +56170,7 @@ __exitcall_ebc_exit:
 	.string	"dma_configure"
 .LASF2290:
 	.string	"runtime_error"
-.LASF3058:
+.LASF3057:
 	.string	"temp_offset"
 .LASF947:
 	.string	"__count"
@@ -55756,7 +56196,7 @@ __exitcall_ebc_exit:
 	.string	"text_size"
 .LASF1651:
 	.string	"stat"
-.LASF2981:
+.LASF2980:
 	.string	"lut_ddr_vir"
 .LASF1319:
 	.string	"map_count"
@@ -55770,11 +56210,11 @@ __exitcall_ebc_exit:
 	.string	"uid_keyring"
 .LASF723:
 	.string	"splice_pipe"
-.LASF3089:
+.LASF3088:
 	.string	"frame_done_callback"
 .LASF1798:
 	.string	"error_remove_page"
-.LASF3085:
+.LASF3084:
 	.string	"new_buf_left"
 .LASF2321:
 	.string	"pdev_archdata"
@@ -55854,7 +56294,7 @@ __exitcall_ebc_exit:
 	.string	"gp_count"
 .LASF2049:
 	.string	"key_restriction"
-.LASF3074:
+.LASF3073:
 	.string	"check_part_mode"
 .LASF616:
 	.string	"exit_state"
@@ -55886,7 +56326,7 @@ __exitcall_ebc_exit:
 	.string	"fs_supers"
 .LASF1129:
 	.string	"last_waited"
-.LASF3053:
+.LASF3052:
 	.string	"ebc_open"
 .LASF3139:
 	.string	"three_win_mode"
@@ -55896,7 +56336,7 @@ __exitcall_ebc_exit:
 	.string	"dqb_bsoftlimit"
 .LASF218:
 	.string	"pending"
-.LASF2978:
+.LASF2977:
 	.string	"direct_buffer"
 .LASF2490:
 	.string	"i2c_client_type"
@@ -55922,7 +56362,7 @@ __exitcall_ebc_exit:
 	.string	"pt_mm"
 .LASF1502:
 	.string	"lruvec"
-.LASF2897:
+.LASF2896:
 	.string	"ebc_pmic"
 .LASF14:
 	.string	"long long int"

commit ae4c563bea8941fb7ad647e145a4ab513f8c3947
Author: Wu Liangqing <wlq@rock-chips.com>
Date:   Thu Jun 17 20:38:45 2021 +0800

    scripts: io-domain.sh: fix parse error caused by io_domain duplicate definitions
    
    Change-Id: Ie8aaa817985643cc48ce8020a7eac38a35029c46
    Signed-off-by: Wu Liangqing <wlq@rock-chips.com>

diff --git a/scripts/io-domain.sh b/scripts/io-domain.sh
index 040d88580ede..c1647b12e220 100755
--- a/scripts/io-domain.sh
+++ b/scripts/io-domain.sh
@@ -105,11 +105,12 @@ DtsIoDomainVoltage()
 	if [ -f $DTS_NAME ];then
 		echo "found $DTS_NAME"
 	fi
+
 	supply=$(cat $DTS_NAME \
-			| grep $1 \
-			| cut -d "&" -f 2 \
-			| cut -d ">" -f 1)
-	#supply_str=$supply":"
+		| grep $1 \
+		| cut -d "&" -f 2 \
+		| cut -d ">" -f 1 \
+		| tail -n1)
 
 	ldo_str=$(cat $DTS_NAME  \
 		| awk 'BEGIN {RS="\n\n+";ORS="\n\n"}/regulator-name/{print $0}' \

commit 8a735d4ec1a015f234e16efc08ff63c4697d1b49
Author: Fenrir Lin <fenrir.lin@rock-chips.com>
Date:   Wed Jun 16 15:33:56 2021 +0800

    media: i2c: os04c10: fix the gain error problem
    
    Signed-off-by: Fenrir Lin <fenrir.lin@rock-chips.com>
    Change-Id: I20bbf598d4bcc9f3029112f6d729286d40bf338d

diff --git a/drivers/media/i2c/os04c10.c b/drivers/media/i2c/os04c10.c
index caa501f0b5b2..62c5b9a3770d 100644
--- a/drivers/media/i2c/os04c10.c
+++ b/drivers/media/i2c/os04c10.c
@@ -57,7 +57,7 @@
 #define OS04C10_SOFTWARE_RESET_VAL	0x1
 
 #define OS04C10_GAIN_MIN		0x0080
-#define OS04C10_GAIN_MAX		0x07C0
+#define OS04C10_GAIN_MAX		0x7820
 #define OS04C10_GAIN_STEP		1
 #define OS04C10_GAIN_DEFAULT	0x0080
 
@@ -422,7 +422,7 @@ static const struct regval os04c10_linear10bit_2688x1520_regs[] = {
 	{0x3815, 0x01},
 	{0x3816, 0x01},
 	{0x3817, 0x01},
-	{0x3820, 0x88},
+	{0x3820, 0x80},
 	{0x3821, 0x00},
 	{0x3880, 0x25},
 	{0x3882, 0x20},
@@ -1227,9 +1227,9 @@ static int os04c10_set_ctrl(struct v4l2_ctrl *ctrl)
 		dev_dbg(&client->dev, "set exposure 0x%x\n", ctrl->val);
 		break;
 	case V4L2_CID_ANALOGUE_GAIN:
-		if (ctrl->val > 248) {
-			dgain = ctrl->val * 1024 / 248;
-			again = 248;
+		if (ctrl->val > 1984) {
+			dgain = ctrl->val * 1024 / 1984;
+			again = 1984;
 		} else {
 			dgain = 1024;
 			again = ctrl->val;
@@ -1237,7 +1237,7 @@ static int os04c10_set_ctrl(struct v4l2_ctrl *ctrl)
 		ret = os04c10_write_reg(os04c10->client,
 					OS04C10_REG_AGAIN_LONG_H,
 					OS04C10_REG_VALUE_16BIT,
-					again & 0x1ff0);
+					again & 0x1fff);
 		ret |= os04c10_write_reg(os04c10->client,
 					OS04C10_REG_DGAIN_LONG_H,
 					OS04C10_REG_VALUE_16BIT,

commit febcd380ef3d81e75eff1b0ff64cf8b129d7c424
Author: Sudeep Holla <sudeep.holla@arm.com>
Date:   Mon Sep 7 12:06:01 2020 +0100

    UPSTREAM: firmware: arm_scmi: Move scmi protocols registration into the driver
    
    In preparation to enable building SCMI as a single module, let us move
    the SCMI protocol registration call into the driver. This enables us
    to also add unregistration of the SCMI protocols.
    
    The main reason for this is to keep it simple instead of maintaining
    it as separate modules and dealing with all possible initcall races
    and deferred probe handling. We can move it as separate modules if
    needed in future.
    
    Link: https://lore.kernel.org/r/20200907195046.56615-4-sudeep.holla@arm.com
    Tested-by: Cristian Marussi <cristian.marussi@arm.com>
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    (cherry picked from commit 1eaf18e35a783a007ef03e09f1dfc3de81eace7c)
    
    Conflicts:
            drivers/firmware/arm_scmi/driver.c
            drivers/firmware/arm_scmi/system.c
    
    Fixes: 5730f8b50f67 ("UPSTREAM: firmware: arm_scmi: Move scmi protocols registration into the driver")
    Change-Id: I0509be2a8614d3f98bad8d19e57d75e6371008a4
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>

diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
index 1f7fba03aaac..bb91d2de702b 100644
--- a/drivers/firmware/arm_scmi/driver.c
+++ b/drivers/firmware/arm_scmi/driver.c
@@ -805,6 +805,7 @@ static int __init scmi_driver_init(void)
 	scmi_clock_register();
 	scmi_perf_register();
 	scmi_power_register();
+	scmi_reset_register();
 	scmi_sensors_register();
 
 	return platform_driver_register(&scmi_driver);
@@ -818,6 +819,7 @@ static void __exit scmi_driver_exit(void)
 	scmi_clock_unregister();
 	scmi_perf_unregister();
 	scmi_power_unregister();
+	scmi_reset_unregister();
 	scmi_sensors_unregister();
 
 	platform_driver_unregister(&scmi_driver);
diff --git a/drivers/firmware/arm_scmi/reset.c b/drivers/firmware/arm_scmi/reset.c
index f3c25e847b2b..fea07363b2c4 100644
--- a/drivers/firmware/arm_scmi/reset.c
+++ b/drivers/firmware/arm_scmi/reset.c
@@ -223,9 +223,4 @@ static int scmi_reset_protocol_init(struct scmi_handle *handle)
 	return 0;
 }
 
-static int __init scmi_reset_init(void)
-{
-	return scmi_protocol_register(SCMI_PROTOCOL_RESET,
-				      &scmi_reset_protocol_init);
-}
-subsys_initcall(scmi_reset_init);
+DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(SCMI_PROTOCOL_RESET, reset)

commit 950a4fde3cb3a725c97be4761f0b69059b795e4f
Author: Sudeep Holla <sudeep.holla@arm.com>
Date:   Wed Nov 6 15:17:26 2019 +0000

    UPSTREAM: firmware: arm_scmi: Add names to scmi devices created
    
    Now that scmi bus provides option to create named scmi device, let us
    create the default devices with names. This will help to add names for
    matching to respective drivers and eventually to add multiple devices
    and drivers per protocol.
    
    Reviewed-by: Cristian Marussi <cristian.marussi@arm.com>
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    (cherry picked from commit 9c5c463f2adf140a126c7ab52bd10012c70fdd53)
    
    Conflicts:
            drivers/firmware/arm_scmi/driver.c
    
    Add missing reset devname.
    
    Fixes: b430ea6fd122 ("UPSTREAM: firmware: arm_scmi: Add names to scmi devices created")
    Change-Id: I2ba7edb8b3e6483e2a8d6ce3a33dce41d432c7b5
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>

diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
index ad725ebdbdd8..1f7fba03aaac 100644
--- a/drivers/firmware/arm_scmi/driver.c
+++ b/drivers/firmware/arm_scmi/driver.c
@@ -655,6 +655,7 @@ static struct scmi_prot_devnames devnames[] = {
 	{ SCMI_PROTOCOL_PERF,   { "cpufreq" },},
 	{ SCMI_PROTOCOL_CLOCK,  { "clocks" },},
 	{ SCMI_PROTOCOL_SENSOR, { "hwmon" },},
+	{ SCMI_PROTOCOL_RESET,  { "reset" },},
 };
 
 static inline void

commit 9f10a3c5325be21cc99dd92981669655ad182c86
Author: Sudeep Holla <sudeep.holla@arm.com>
Date:   Wed Nov 6 17:58:03 2019 +0000

    UPSTREAM: reset: reset-scmi: Match scmi device by both name and protocol id
    
    The scmi bus now has support to match the driver with devices not only
    based on their protocol id but also based on their device name if one is
    available. This was added to cater the need to support multiple devices
    and drivers for the same protocol.
    
    Let us add the name "reset" to scmi_device_id table in the driver so
    that in matches only with device with the same name and protocol id
    SCMI_PROTOCOL_RESET.
    
    Change-Id: Iccebdc2ed032db23d5b4e86462ce33534a23924c
    Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    (cherry picked from commit 34ce3c5e691206d388fcc61f3da2ce8fe8a1907a)

diff --git a/drivers/reset/reset-scmi.c b/drivers/reset/reset-scmi.c
index b46df80ec6c3..8d3a858e3b19 100644
--- a/drivers/reset/reset-scmi.c
+++ b/drivers/reset/reset-scmi.c
@@ -108,7 +108,7 @@ static int scmi_reset_probe(struct scmi_device *sdev)
 }
 
 static const struct scmi_device_id scmi_id_table[] = {
-	{ SCMI_PROTOCOL_RESET },
+	{ SCMI_PROTOCOL_RESET, "reset" },
 	{ },
 };
 MODULE_DEVICE_TABLE(scmi, scmi_id_table);

commit 70379c59dbb3904a411411f0fd4c8f485cd055b9
Author: Sudeep Holla <sudeep.holla@arm.com>
Date:   Mon Sep 9 16:21:07 2019 +0100

    UPSTREAM: reset: reset-scmi: add missing handle initialisation
    
    scmi_reset_data->handle needs to be initialised at probe, so that it
    can be later used to access scmi reset protocol APIs using the same.
    
    Since it was tested with a module that obtained handle elsewhere,
    it was missed easily. Add the missing scmi_reset_data->handle
    initialisation to fix the issue.
    
    Change-Id: Id4a398dc0bede531e384301067a71327f1d78821
    Fixes: c8ae9c2da1cc ("reset: Add support for resets provided by SCMI")
    Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
    Reported-by: Etienne Carriere <etienne.carriere@linaro.org>
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    (cherry picked from commit 61423712dbb86e02af4aa5de65b9041493c92cac)

diff --git a/drivers/reset/reset-scmi.c b/drivers/reset/reset-scmi.c
index c6d3c8427f14..b46df80ec6c3 100644
--- a/drivers/reset/reset-scmi.c
+++ b/drivers/reset/reset-scmi.c
@@ -102,6 +102,7 @@ static int scmi_reset_probe(struct scmi_device *sdev)
 	data->rcdev.owner = THIS_MODULE;
 	data->rcdev.of_node = np;
 	data->rcdev.nr_resets = handle->reset_ops->num_domains_get(handle);
+	data->handle = handle;
 
 	return devm_reset_controller_register(dev, &data->rcdev);
 }

commit 64ffa834bf0583d6e58c9a15f0c1c87f9fd84151
Author: Sudeep Holla <sudeep.holla@arm.com>
Date:   Mon Jul 8 09:41:08 2019 +0100

    UPSTREAM: reset: Add support for resets provided by SCMI
    
    On some ARM based systems, a separate Cortex-M based System Control
    Processor(SCP) provides the overall power, clock, reset and system
    control. System Control and Management Interface(SCMI) Message Protocol
    is defined for the communication between the Application Cores(AP)
    and the SCP.
    
    Adds support for the resets provided using SCMI protocol for performing
    reset management of various devices present on the SoC. Various reset
    functionalities are achieved by the means of different ARM SCMI device
    operations provided by the ARM SCMI framework.
    
    Change-Id: I7cadc2be170ed8029e3db92aeda8249bbb7c4e88
    Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    (cherry picked from commit c8ae9c2da1cc5d18b6d51d10160508a3dc3436bf)

diff --git a/MAINTAINERS b/MAINTAINERS
index 59d3d8e86ccb..27919b3be553 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -14152,6 +14152,7 @@ F:	drivers/clk/clk-sc[mp]i.c
 F:	drivers/cpufreq/sc[mp]i-cpufreq.c
 F:	drivers/firmware/arm_scpi.c
 F:	drivers/firmware/arm_scmi/
+F:	drivers/reset/reset-scmi.c
 F:	include/linux/sc[mp]i_protocol.h
 F:	include/trace/events/scmi.h
 
diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
index 13d28fdbdbb5..2c7b889d9756 100644
--- a/drivers/reset/Kconfig
+++ b/drivers/reset/Kconfig
@@ -98,6 +98,17 @@ config RESET_QCOM_AOSS
 	  reset signals provided by AOSS for Modem, Venus, ADSP,
 	  GPU, Camera, Wireless, Display subsystem. Otherwise, say N.
 
+config RESET_SCMI
+	tristate "Reset driver controlled via ARM SCMI interface"
+	depends on ARM_SCMI_PROTOCOL || COMPILE_TEST
+	default ARM_SCMI_PROTOCOL
+	help
+	  This driver provides support for reset signal/domains that are
+	  controlled by firmware that implements the SCMI interface.
+
+	  This driver uses SCMI Message Protocol to interact with the
+	  firmware controlling all the reset signals.
+
 config RESET_SIMPLE
 	bool "Simple Reset Controller Driver" if COMPILE_TEST
 	default ARCH_SOCFPGA || ARCH_STM32 || ARCH_STRATIX10 || ARCH_SUNXI || ARCH_ZX || ARCH_ASPEED
diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile
index 4243c38228e2..aa98dfb243aa 100644
--- a/drivers/reset/Makefile
+++ b/drivers/reset/Makefile
@@ -16,6 +16,7 @@ obj-$(CONFIG_RESET_MESON_AUDIO_ARB) += reset-meson-audio-arb.o
 obj-$(CONFIG_RESET_OXNAS) += reset-oxnas.o
 obj-$(CONFIG_RESET_PISTACHIO) += reset-pistachio.o
 obj-$(CONFIG_RESET_QCOM_AOSS) += reset-qcom-aoss.o
+obj-$(CONFIG_RESET_SCMI) += reset-scmi.o
 obj-$(CONFIG_RESET_SIMPLE) += reset-simple.o
 obj-$(CONFIG_RESET_STM32MP157) += reset-stm32mp1.o
 obj-$(CONFIG_RESET_SUNXI) += reset-sunxi.o
diff --git a/drivers/reset/reset-scmi.c b/drivers/reset/reset-scmi.c
new file mode 100644
index 000000000000..c6d3c8427f14
--- /dev/null
+++ b/drivers/reset/reset-scmi.c
@@ -0,0 +1,124 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * ARM System Control and Management Interface (ARM SCMI) reset driver
+ *
+ * Copyright (C) 2019 ARM Ltd.
+ */
+
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/device.h>
+#include <linux/reset-controller.h>
+#include <linux/scmi_protocol.h>
+
+/**
+ * struct scmi_reset_data - reset controller information structure
+ * @rcdev: reset controller entity
+ * @handle: ARM SCMI handle used for communication with system controller
+ */
+struct scmi_reset_data {
+	struct reset_controller_dev rcdev;
+	const struct scmi_handle *handle;
+};
+
+#define to_scmi_reset_data(p)	container_of((p), struct scmi_reset_data, rcdev)
+#define to_scmi_handle(p)	(to_scmi_reset_data(p)->handle)
+
+/**
+ * scmi_reset_assert() - assert device reset
+ * @rcdev: reset controller entity
+ * @id: ID of the reset to be asserted
+ *
+ * This function implements the reset driver op to assert a device's reset
+ * using the ARM SCMI protocol.
+ *
+ * Return: 0 for successful request, else a corresponding error value
+ */
+static int
+scmi_reset_assert(struct reset_controller_dev *rcdev, unsigned long id)
+{
+	const struct scmi_handle *handle = to_scmi_handle(rcdev);
+
+	return handle->reset_ops->assert(handle, id);
+}
+
+/**
+ * scmi_reset_deassert() - deassert device reset
+ * @rcdev: reset controller entity
+ * @id: ID of the reset to be deasserted
+ *
+ * This function implements the reset driver op to deassert a device's reset
+ * using the ARM SCMI protocol.
+ *
+ * Return: 0 for successful request, else a corresponding error value
+ */
+static int
+scmi_reset_deassert(struct reset_controller_dev *rcdev, unsigned long id)
+{
+	const struct scmi_handle *handle = to_scmi_handle(rcdev);
+
+	return handle->reset_ops->deassert(handle, id);
+}
+
+/**
+ * scmi_reset_reset() - reset the device
+ * @rcdev: reset controller entity
+ * @id: ID of the reset signal to be reset(assert + deassert)
+ *
+ * This function implements the reset driver op to trigger a device's
+ * reset signal using the ARM SCMI protocol.
+ *
+ * Return: 0 for successful request, else a corresponding error value
+ */
+static int
+scmi_reset_reset(struct reset_controller_dev *rcdev, unsigned long id)
+{
+	const struct scmi_handle *handle = to_scmi_handle(rcdev);
+
+	return handle->reset_ops->reset(handle, id);
+}
+
+static const struct reset_control_ops scmi_reset_ops = {
+	.assert		= scmi_reset_assert,
+	.deassert	= scmi_reset_deassert,
+	.reset		= scmi_reset_reset,
+};
+
+static int scmi_reset_probe(struct scmi_device *sdev)
+{
+	struct scmi_reset_data *data;
+	struct device *dev = &sdev->dev;
+	struct device_node *np = dev->of_node;
+	const struct scmi_handle *handle = sdev->handle;
+
+	if (!handle || !handle->reset_ops)
+		return -ENODEV;
+
+	data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
+	if (!data)
+		return -ENOMEM;
+
+	data->rcdev.ops = &scmi_reset_ops;
+	data->rcdev.owner = THIS_MODULE;
+	data->rcdev.of_node = np;
+	data->rcdev.nr_resets = handle->reset_ops->num_domains_get(handle);
+
+	return devm_reset_controller_register(dev, &data->rcdev);
+}
+
+static const struct scmi_device_id scmi_id_table[] = {
+	{ SCMI_PROTOCOL_RESET },
+	{ },
+};
+MODULE_DEVICE_TABLE(scmi, scmi_id_table);
+
+static struct scmi_driver scmi_reset_driver = {
+	.name = "scmi-reset",
+	.probe = scmi_reset_probe,
+	.id_table = scmi_id_table,
+};
+module_scmi_driver(scmi_reset_driver);
+
+MODULE_AUTHOR("Sudeep Holla <sudeep.holla@arm.com>");
+MODULE_DESCRIPTION("ARM SCMI reset controller driver");
+MODULE_LICENSE("GPL v2");

commit c256ed3a521b9f12a4169d13c18dee6511d43df9
Author: Etienne Carriere <etienne.carriere@linaro.org>
Date:   Thu Oct 8 16:37:22 2020 +0200

    UPSTREAM: firmware: arm_scmi: Fix ARCH_COLD_RESET
    
    The defination for ARCH_COLD_RESET is wrong. Let us fix it according to
    the SCMI specification.
    
    Change-Id: Ied2b8d55e21583a9dec2d131155ec5cbd86636ba
    Link: https://lore.kernel.org/r/20201008143722.21888-5-etienne.carriere@linaro.org
    Fixes: 95a15d80aa0d ("firmware: arm_scmi: Add RESET protocol in SCMI v2.0")
    Signed-off-by: Etienne Carriere <etienne.carriere@linaro.org>
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    (cherry picked from commit 45b9e04d5ba0b043783dfe2b19bb728e712cb32e)

diff --git a/drivers/firmware/arm_scmi/reset.c b/drivers/firmware/arm_scmi/reset.c
index de73054554f3..f3c25e847b2b 100644
--- a/drivers/firmware/arm_scmi/reset.c
+++ b/drivers/firmware/arm_scmi/reset.c
@@ -35,9 +35,7 @@ struct scmi_msg_reset_domain_reset {
 #define EXPLICIT_RESET_ASSERT	BIT(1)
 #define ASYNCHRONOUS_RESET	BIT(2)
 	__le32 reset_state;
-#define ARCH_RESET_TYPE		BIT(31)
-#define COLD_RESET_STATE	BIT(0)
-#define ARCH_COLD_RESET		(ARCH_RESET_TYPE | COLD_RESET_STATE)
+#define ARCH_COLD_RESET		0
 };
 
 struct reset_dom_info {

commit a7763786b12b3ec1a976d73e77cb04f8ee2fb1df
Author: Sudeep Holla <sudeep.holla@arm.com>
Date:   Fri Nov 22 14:48:40 2019 +0000

    UPSTREAM: firmware: arm_scmi: Stash version in protocol init functions
    
    In order to avoid querying the individual protocol versions multiple
    time with more that one device created for each protocol, we can simple
    store the copy in the protocol specific private data and use them whenever
    required.
    
    Change-Id: I80e3b6177ffe99deb74c2e6dccf705b73f2163a8
    Reviewed-by: Cristian Marussi <cristian.marussi@arm.com>
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    (cherry picked from commit b55b06b79445574fa031158fe2ae2946cde0d1b7)

diff --git a/drivers/firmware/arm_scmi/clock.c b/drivers/firmware/arm_scmi/clock.c
index 62716ff9c60e..b076f27de225 100644
--- a/drivers/firmware/arm_scmi/clock.c
+++ b/drivers/firmware/arm_scmi/clock.c
@@ -65,6 +65,7 @@ struct scmi_clock_set_rate {
 };
 
 struct clock_info {
+	u32 version;
 	int num_clocks;
 	int max_async_req;
 	atomic_t cur_async_req;
@@ -340,6 +341,7 @@ static int scmi_clock_protocol_init(struct scmi_handle *handle)
 			scmi_clock_describe_rates_get(handle, clkid, clk);
 	}
 
+	cinfo->version = version;
 	handle->clk_ops = &clk_ops;
 	handle->clk_priv = cinfo;
 
diff --git a/drivers/firmware/arm_scmi/perf.c b/drivers/firmware/arm_scmi/perf.c
index 9a21da3806b2..9bd9482950bf 100644
--- a/drivers/firmware/arm_scmi/perf.c
+++ b/drivers/firmware/arm_scmi/perf.c
@@ -101,6 +101,7 @@ struct perf_dom_info {
 };
 
 struct scmi_perf_info {
+	u32 version;
 	int num_domains;
 	bool power_scale_mw;
 	u64 stats_addr;
@@ -496,6 +497,7 @@ static int scmi_perf_protocol_init(struct scmi_handle *handle)
 		scmi_perf_describe_levels_get(handle, domain, dom);
 	}
 
+	pinfo->version = version;
 	handle->perf_ops = &perf_ops;
 	handle->perf_priv = pinfo;
 
diff --git a/drivers/firmware/arm_scmi/power.c b/drivers/firmware/arm_scmi/power.c
index 9f97e07fed07..82b9e2191dda 100644
--- a/drivers/firmware/arm_scmi/power.c
+++ b/drivers/firmware/arm_scmi/power.c
@@ -50,6 +50,7 @@ struct power_dom_info {
 };
 
 struct scmi_power_info {
+	u32 version;
 	int num_domains;
 	u64 stats_addr;
 	u32 stats_size;
@@ -207,6 +208,7 @@ static int scmi_power_protocol_init(struct scmi_handle *handle)
 		scmi_power_domain_attributes_get(handle, domain, dom);
 	}
 
+	pinfo->version = version;
 	handle->power_ops = &power_ops;
 	handle->power_priv = pinfo;
 
diff --git a/drivers/firmware/arm_scmi/reset.c b/drivers/firmware/arm_scmi/reset.c
index ab42c21c5517..de73054554f3 100644
--- a/drivers/firmware/arm_scmi/reset.c
+++ b/drivers/firmware/arm_scmi/reset.c
@@ -48,6 +48,7 @@ struct reset_dom_info {
 };
 
 struct scmi_reset_info {
+	u32 version;
 	int num_domains;
 	struct reset_dom_info *dom_info;
 };
@@ -217,6 +218,7 @@ static int scmi_reset_protocol_init(struct scmi_handle *handle)
 		scmi_reset_domain_attributes_get(handle, domain, dom);
 	}
 
+	pinfo->version = version;
 	handle->reset_ops = &reset_ops;
 	handle->reset_priv = pinfo;
 
diff --git a/drivers/firmware/arm_scmi/sensors.c b/drivers/firmware/arm_scmi/sensors.c
index 206a59ba357d..add3833e0e54 100644
--- a/drivers/firmware/arm_scmi/sensors.c
+++ b/drivers/firmware/arm_scmi/sensors.c
@@ -68,6 +68,7 @@ struct scmi_msg_sensor_reading_get {
 };
 
 struct sensors_info {
+	u32 version;
 	int num_sensors;
 	int max_requests;
 	u64 reg_addr;
@@ -294,6 +295,7 @@ static int scmi_sensors_protocol_init(struct scmi_handle *handle)
 
 	scmi_sensor_description_get(handle, sinfo);
 
+	sinfo->version = version;
 	handle->sensor_ops = &sensor_ops;
 	handle->sensor_priv = sinfo;
 

commit 57d62a13d817b6f6821d31b35028e9edd80f9c43
Author: Sudeep Holla <sudeep.holla@arm.com>
Date:   Mon Sep 9 16:21:30 2019 +0100

    UPSTREAM: firmware: arm_scmi: reset: fix reset_state assignment in scmi_domain_reset
    
    Fix the copy paste typo that incorrectly assigns domain_id with the
    passed 'state' parameter instead of reset_state.
    
    Change-Id: If645ba6372f616638d50c5023aa7a8b1404f424a
    Fixes: 95a15d80aa0d ("firmware: arm_scmi: Add RESET protocol in SCMI v2.0")
    Reported-by: Etienne Carriere <etienne.carriere@linaro.org>
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    (cherry picked from commit 11ed5cf064beac3ca345bb75fdf2429e03ac106a)

diff --git a/drivers/firmware/arm_scmi/reset.c b/drivers/firmware/arm_scmi/reset.c
index 64cc81915581..ab42c21c5517 100644
--- a/drivers/firmware/arm_scmi/reset.c
+++ b/drivers/firmware/arm_scmi/reset.c
@@ -150,7 +150,7 @@ static int scmi_domain_reset(const struct scmi_handle *handle, u32 domain,
 	dom = t->tx.buf;
 	dom->domain_id = cpu_to_le32(domain);
 	dom->flags = cpu_to_le32(flags);
-	dom->domain_id = cpu_to_le32(state);
+	dom->reset_state = cpu_to_le32(state);
 
 	if (rdom->async_reset)
 		ret = scmi_do_xfer_with_response(handle, t);

commit 7d7b36327157d5862a71366b9a4597f1f374c7da
Author: Sudeep Holla <sudeep.holla@arm.com>
Date:   Mon Jul 8 09:41:06 2019 +0100

    UPSTREAM: firmware: arm_scmi: Add RESET protocol in SCMI v2.0
    
    SCMIv2.0 adds a new Reset Management Protocol to manage various reset
    states a given device or domain can enter. Device(s) that can be
    collectively reset through a common reset signal constitute a reset
    domain for the firmware.
    
    A reset domain can be reset autonomously or explicitly through assertion
    and de-assertion of the signal. When autonomous reset is chosen, the
    firmware is responsible for taking the necessary steps to reset the
    domain and to subsequently bring it out of reset. When explicit reset is
    chosen, the caller has to specifically assert and then de-assert the
    reset signal by issuing two separate RESET commands.
    
    Add the basic SCMI reset infrastructure that can be used by Linux
    reset controller driver.
    
    Change-Id: I78f79b81852d31dc3026ba06ca66f36a2aa60df2
    Reviewed-by: Peng Fan <peng.fan@nxp.com>
    Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    (cherry picked from commit 95a15d80aa0de938299acfcbc6aa6f2b16f5d7e5)

diff --git a/drivers/firmware/arm_scmi/Makefile b/drivers/firmware/arm_scmi/Makefile
index edb768ad3a3d..4514dc3d7eb5 100644
--- a/drivers/firmware/arm_scmi/Makefile
+++ b/drivers/firmware/arm_scmi/Makefile
@@ -4,5 +4,5 @@ scmi-driver-y = driver.o
 scmi-transport-y = shmem.o
 scmi-transport-$(CONFIG_MAILBOX) += mailbox.o
 scmi-transport-$(CONFIG_HAVE_ARM_SMCCC) += smc.o
-scmi-protocols-y = base.o clock.o perf.o power.o sensors.o
+scmi-protocols-y = base.o clock.o perf.o power.o reset.o sensors.o
 obj-$(CONFIG_ARM_SCMI_POWER_DOMAIN) += scmi_pm_domain.o
diff --git a/drivers/firmware/arm_scmi/reset.c b/drivers/firmware/arm_scmi/reset.c
new file mode 100644
index 000000000000..64cc81915581
--- /dev/null
+++ b/drivers/firmware/arm_scmi/reset.c
@@ -0,0 +1,231 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * System Control and Management Interface (SCMI) Reset Protocol
+ *
+ * Copyright (C) 2019 ARM Ltd.
+ */
+
+#include "common.h"
+
+enum scmi_reset_protocol_cmd {
+	RESET_DOMAIN_ATTRIBUTES = 0x3,
+	RESET = 0x4,
+	RESET_NOTIFY = 0x5,
+};
+
+enum scmi_reset_protocol_notify {
+	RESET_ISSUED = 0x0,
+};
+
+#define NUM_RESET_DOMAIN_MASK	0xffff
+#define RESET_NOTIFY_ENABLE	BIT(0)
+
+struct scmi_msg_resp_reset_domain_attributes {
+	__le32 attributes;
+#define SUPPORTS_ASYNC_RESET(x)		((x) & BIT(31))
+#define SUPPORTS_NOTIFY_RESET(x)	((x) & BIT(30))
+	__le32 latency;
+	    u8 name[SCMI_MAX_STR_SIZE];
+};
+
+struct scmi_msg_reset_domain_reset {
+	__le32 domain_id;
+	__le32 flags;
+#define AUTONOMOUS_RESET	BIT(0)
+#define EXPLICIT_RESET_ASSERT	BIT(1)
+#define ASYNCHRONOUS_RESET	BIT(2)
+	__le32 reset_state;
+#define ARCH_RESET_TYPE		BIT(31)
+#define COLD_RESET_STATE	BIT(0)
+#define ARCH_COLD_RESET		(ARCH_RESET_TYPE | COLD_RESET_STATE)
+};
+
+struct reset_dom_info {
+	bool async_reset;
+	bool reset_notify;
+	u32 latency_us;
+	char name[SCMI_MAX_STR_SIZE];
+};
+
+struct scmi_reset_info {
+	int num_domains;
+	struct reset_dom_info *dom_info;
+};
+
+static int scmi_reset_attributes_get(const struct scmi_handle *handle,
+				     struct scmi_reset_info *pi)
+{
+	int ret;
+	struct scmi_xfer *t;
+	u32 attr;
+
+	ret = scmi_xfer_get_init(handle, PROTOCOL_ATTRIBUTES,
+				 SCMI_PROTOCOL_RESET, 0, sizeof(attr), &t);
+	if (ret)
+		return ret;
+
+	ret = scmi_do_xfer(handle, t);
+	if (!ret) {
+		attr = get_unaligned_le32(t->rx.buf);
+		pi->num_domains = attr & NUM_RESET_DOMAIN_MASK;
+	}
+
+	scmi_xfer_put(handle, t);
+	return ret;
+}
+
+static int
+scmi_reset_domain_attributes_get(const struct scmi_handle *handle, u32 domain,
+				 struct reset_dom_info *dom_info)
+{
+	int ret;
+	struct scmi_xfer *t;
+	struct scmi_msg_resp_reset_domain_attributes *attr;
+
+	ret = scmi_xfer_get_init(handle, RESET_DOMAIN_ATTRIBUTES,
+				 SCMI_PROTOCOL_RESET, sizeof(domain),
+				 sizeof(*attr), &t);
+	if (ret)
+		return ret;
+
+	put_unaligned_le32(domain, t->tx.buf);
+	attr = t->rx.buf;
+
+	ret = scmi_do_xfer(handle, t);
+	if (!ret) {
+		u32 attributes = le32_to_cpu(attr->attributes);
+
+		dom_info->async_reset = SUPPORTS_ASYNC_RESET(attributes);
+		dom_info->reset_notify = SUPPORTS_NOTIFY_RESET(attributes);
+		dom_info->latency_us = le32_to_cpu(attr->latency);
+		if (dom_info->latency_us == U32_MAX)
+			dom_info->latency_us = 0;
+		strlcpy(dom_info->name, attr->name, SCMI_MAX_STR_SIZE);
+	}
+
+	scmi_xfer_put(handle, t);
+	return ret;
+}
+
+static int scmi_reset_num_domains_get(const struct scmi_handle *handle)
+{
+	struct scmi_reset_info *pi = handle->reset_priv;
+
+	return pi->num_domains;
+}
+
+static char *scmi_reset_name_get(const struct scmi_handle *handle, u32 domain)
+{
+	struct scmi_reset_info *pi = handle->reset_priv;
+	struct reset_dom_info *dom = pi->dom_info + domain;
+
+	return dom->name;
+}
+
+static int scmi_reset_latency_get(const struct scmi_handle *handle, u32 domain)
+{
+	struct scmi_reset_info *pi = handle->reset_priv;
+	struct reset_dom_info *dom = pi->dom_info + domain;
+
+	return dom->latency_us;
+}
+
+static int scmi_domain_reset(const struct scmi_handle *handle, u32 domain,
+			     u32 flags, u32 state)
+{
+	int ret;
+	struct scmi_xfer *t;
+	struct scmi_msg_reset_domain_reset *dom;
+	struct scmi_reset_info *pi = handle->reset_priv;
+	struct reset_dom_info *rdom = pi->dom_info + domain;
+
+	if (rdom->async_reset)
+		flags |= ASYNCHRONOUS_RESET;
+
+	ret = scmi_xfer_get_init(handle, RESET, SCMI_PROTOCOL_RESET,
+				 sizeof(*dom), 0, &t);
+	if (ret)
+		return ret;
+
+	dom = t->tx.buf;
+	dom->domain_id = cpu_to_le32(domain);
+	dom->flags = cpu_to_le32(flags);
+	dom->domain_id = cpu_to_le32(state);
+
+	if (rdom->async_reset)
+		ret = scmi_do_xfer_with_response(handle, t);
+	else
+		ret = scmi_do_xfer(handle, t);
+
+	scmi_xfer_put(handle, t);
+	return ret;
+}
+
+static int scmi_reset_domain_reset(const struct scmi_handle *handle, u32 domain)
+{
+	return scmi_domain_reset(handle, domain, AUTONOMOUS_RESET,
+				 ARCH_COLD_RESET);
+}
+
+static int
+scmi_reset_domain_assert(const struct scmi_handle *handle, u32 domain)
+{
+	return scmi_domain_reset(handle, domain, EXPLICIT_RESET_ASSERT,
+				 ARCH_COLD_RESET);
+}
+
+static int
+scmi_reset_domain_deassert(const struct scmi_handle *handle, u32 domain)
+{
+	return scmi_domain_reset(handle, domain, 0, ARCH_COLD_RESET);
+}
+
+static struct scmi_reset_ops reset_ops = {
+	.num_domains_get = scmi_reset_num_domains_get,
+	.name_get = scmi_reset_name_get,
+	.latency_get = scmi_reset_latency_get,
+	.reset = scmi_reset_domain_reset,
+	.assert = scmi_reset_domain_assert,
+	.deassert = scmi_reset_domain_deassert,
+};
+
+static int scmi_reset_protocol_init(struct scmi_handle *handle)
+{
+	int domain;
+	u32 version;
+	struct scmi_reset_info *pinfo;
+
+	scmi_version_get(handle, SCMI_PROTOCOL_RESET, &version);
+
+	dev_dbg(handle->dev, "Reset Version %d.%d\n",
+		PROTOCOL_REV_MAJOR(version), PROTOCOL_REV_MINOR(version));
+
+	pinfo = devm_kzalloc(handle->dev, sizeof(*pinfo), GFP_KERNEL);
+	if (!pinfo)
+		return -ENOMEM;
+
+	scmi_reset_attributes_get(handle, pinfo);
+
+	pinfo->dom_info = devm_kcalloc(handle->dev, pinfo->num_domains,
+				       sizeof(*pinfo->dom_info), GFP_KERNEL);
+	if (!pinfo->dom_info)
+		return -ENOMEM;
+
+	for (domain = 0; domain < pinfo->num_domains; domain++) {
+		struct reset_dom_info *dom = pinfo->dom_info + domain;
+
+		scmi_reset_domain_attributes_get(handle, domain, dom);
+	}
+
+	handle->reset_ops = &reset_ops;
+	handle->reset_priv = pinfo;
+
+	return 0;
+}
+
+static int __init scmi_reset_init(void)
+{
+	return scmi_protocol_register(SCMI_PROTOCOL_RESET,
+				      &scmi_reset_protocol_init);
+}
+subsys_initcall(scmi_reset_init);
diff --git a/include/linux/scmi_protocol.h b/include/linux/scmi_protocol.h
index 6375546b26d8..07bbde90ca8b 100644
--- a/include/linux/scmi_protocol.h
+++ b/include/linux/scmi_protocol.h
@@ -187,6 +187,26 @@ struct scmi_sensor_ops {
 			   u64 *value);
 };
 
+/**
+ * struct scmi_reset_ops - represents the various operations provided
+ *	by SCMI Reset Protocol
+ *
+ * @num_domains_get: get the count of reset domains provided by SCMI
+ * @name_get: gets the name of a reset domain
+ * @latency_get: gets the reset latency for the specified reset domain
+ * @reset: resets the specified reset domain
+ * @assert: explicitly assert reset signal of the specified reset domain
+ * @deassert: explicitly deassert reset signal of the specified reset domain
+ */
+struct scmi_reset_ops {
+	int (*num_domains_get)(const struct scmi_handle *handle);
+	char *(*name_get)(const struct scmi_handle *handle, u32 domain);
+	int (*latency_get)(const struct scmi_handle *handle, u32 domain);
+	int (*reset)(const struct scmi_handle *handle, u32 domain);
+	int (*assert)(const struct scmi_handle *handle, u32 domain);
+	int (*deassert)(const struct scmi_handle *handle, u32 domain);
+};
+
 /**
  * struct scmi_handle - Handle returned to ARM SCMI clients for usage.
  *
@@ -196,6 +216,7 @@ struct scmi_sensor_ops {
  * @perf_ops: pointer to set of performance protocol operations
  * @clk_ops: pointer to set of clock protocol operations
  * @sensor_ops: pointer to set of sensor protocol operations
+ * @reset_ops: pointer to set of reset protocol operations
  * @perf_priv: pointer to private data structure specific to performance
  *	protocol(for internal use only)
  * @clk_priv: pointer to private data structure specific to clock
@@ -204,6 +225,8 @@ struct scmi_sensor_ops {
  *	protocol(for internal use only)
  * @sensor_priv: pointer to private data structure specific to sensors
  *	protocol(for internal use only)
+ * @reset_priv: pointer to private data structure specific to reset
+ *	protocol(for internal use only)
  */
 struct scmi_handle {
 	struct device *dev;
@@ -212,11 +235,13 @@ struct scmi_handle {
 	struct scmi_clk_ops *clk_ops;
 	struct scmi_power_ops *power_ops;
 	struct scmi_sensor_ops *sensor_ops;
+	struct scmi_reset_ops *reset_ops;
 	/* for protocol internal use */
 	void *perf_priv;
 	void *clk_priv;
 	void *power_priv;
 	void *sensor_priv;
+	void *reset_priv;
 };
 
 enum scmi_std_protocol {
@@ -226,6 +251,7 @@ enum scmi_std_protocol {
 	SCMI_PROTOCOL_PERF = 0x13,
 	SCMI_PROTOCOL_CLOCK = 0x14,
 	SCMI_PROTOCOL_SENSOR = 0x15,
+	SCMI_PROTOCOL_RESET = 0x16,
 };
 
 struct scmi_device {

commit 28bafe15f8759f0c4ef7d86937db087366cc62a8
Author: Sudeep Holla <sudeep.holla@arm.com>
Date:   Wed Aug 7 13:46:27 2019 +0100

    UPSTREAM: firmware: arm_scmi: Use {get,put}_unaligned_le{32,64} accessors
    
    Instead of type-casting the {tx,rx}.buf all over the place while
    accessing them to read/write __le{32,64} from/to the firmware, let's
    use the existing {get,put}_unaligned_le{32,64} accessors to hide all
    the type cast ugliness.
    
    Change-Id: I5cbb01ad87d985fc759cdd5d33a63beb8c790c4c
    Suggested-by: Philipp Zabel <p.zabel@pengutronix.de>
    Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    (cherry picked from commit aa90ac45bc88e6a8efb199e45dab5d5a6b01c3d2)

diff --git a/drivers/firmware/arm_scmi/base.c b/drivers/firmware/arm_scmi/base.c
index 204390297f4b..f804e8af6521 100644
--- a/drivers/firmware/arm_scmi/base.c
+++ b/drivers/firmware/arm_scmi/base.c
@@ -204,7 +204,7 @@ static int scmi_base_discover_agent_get(const struct scmi_handle *handle,
 	if (ret)
 		return ret;
 
-	*(__le32 *)t->tx.buf = cpu_to_le32(id);
+	put_unaligned_le32(id, t->tx.buf);
 
 	ret = scmi_do_xfer(handle, t);
 	if (!ret)
diff --git a/drivers/firmware/arm_scmi/clock.c b/drivers/firmware/arm_scmi/clock.c
index 7ce3013c44c9..62716ff9c60e 100644
--- a/drivers/firmware/arm_scmi/clock.c
+++ b/drivers/firmware/arm_scmi/clock.c
@@ -107,7 +107,7 @@ static int scmi_clock_attributes_get(const struct scmi_handle *handle,
 	if (ret)
 		return ret;
 
-	*(__le32 *)t->tx.buf = cpu_to_le32(clk_id);
+	put_unaligned_le32(clk_id, t->tx.buf);
 	attr = t->rx.buf;
 
 	ret = scmi_do_xfer(handle, t);
@@ -204,15 +204,11 @@ scmi_clock_rate_get(const struct scmi_handle *handle, u32 clk_id, u64 *value)
 	if (ret)
 		return ret;
 
-	*(__le32 *)t->tx.buf = cpu_to_le32(clk_id);
+	put_unaligned_le32(clk_id, t->tx.buf);
 
 	ret = scmi_do_xfer(handle, t);
-	if (!ret) {
-		__le32 *pval = t->rx.buf;
-
-		*value = le32_to_cpu(*pval);
-		*value |= (u64)le32_to_cpu(*(pval + 1)) << 32;
-	}
+	if (!ret)
+		*value = get_unaligned_le64(t->rx.buf);
 
 	scmi_xfer_put(handle, t);
 	return ret;
diff --git a/drivers/firmware/arm_scmi/common.h b/drivers/firmware/arm_scmi/common.h
index 8dce680c7ba8..72f7790f9a06 100644
--- a/drivers/firmware/arm_scmi/common.h
+++ b/drivers/firmware/arm_scmi/common.h
@@ -15,6 +15,8 @@
 #include <linux/scmi_protocol.h>
 #include <linux/types.h>
 
+#include <asm/unaligned.h>
+
 #define PROTOCOL_REV_MINOR_MASK	GENMASK(15, 0)
 #define PROTOCOL_REV_MAJOR_MASK	GENMASK(31, 16)
 #define PROTOCOL_REV_MAJOR(x)	(u16)(FIELD_GET(PROTOCOL_REV_MAJOR_MASK, (x)))
diff --git a/drivers/firmware/arm_scmi/perf.c b/drivers/firmware/arm_scmi/perf.c
index 8bbf2ea89209..9a21da3806b2 100644
--- a/drivers/firmware/arm_scmi/perf.c
+++ b/drivers/firmware/arm_scmi/perf.c
@@ -151,7 +151,7 @@ scmi_perf_domain_attributes_get(const struct scmi_handle *handle, u32 domain,
 	if (ret)
 		return ret;
 
-	*(__le32 *)t->tx.buf = cpu_to_le32(domain);
+	put_unaligned_le32(domain, t->tx.buf);
 	attr = t->rx.buf;
 
 	ret = scmi_do_xfer(handle, t);
@@ -284,7 +284,7 @@ static int scmi_perf_limits_get(const struct scmi_handle *handle, u32 domain,
 	if (ret)
 		return ret;
 
-	*(__le32 *)t->tx.buf = cpu_to_le32(domain);
+	put_unaligned_le32(domain, t->tx.buf);
 
 	ret = scmi_do_xfer(handle, t);
 	if (!ret) {
@@ -333,11 +333,11 @@ static int scmi_perf_level_get(const struct scmi_handle *handle, u32 domain,
 		return ret;
 
 	t->hdr.poll_completion = poll;
-	*(__le32 *)t->tx.buf = cpu_to_le32(domain);
+	put_unaligned_le32(domain, t->tx.buf);
 
 	ret = scmi_do_xfer(handle, t);
 	if (!ret)
-		*level = le32_to_cpu(*(__le32 *)t->rx.buf);
+		*level = get_unaligned_le32(t->rx.buf);
 
 	scmi_xfer_put(handle, t);
 	return ret;
diff --git a/drivers/firmware/arm_scmi/power.c b/drivers/firmware/arm_scmi/power.c
index e1fc104bed10..9f97e07fed07 100644
--- a/drivers/firmware/arm_scmi/power.c
+++ b/drivers/firmware/arm_scmi/power.c
@@ -96,7 +96,7 @@ scmi_power_domain_attributes_get(const struct scmi_handle *handle, u32 domain,
 	if (ret)
 		return ret;
 
-	*(__le32 *)t->tx.buf = cpu_to_le32(domain);
+	put_unaligned_le32(domain, t->tx.buf);
 	attr = t->rx.buf;
 
 	ret = scmi_do_xfer(handle, t);
@@ -147,11 +147,11 @@ scmi_power_state_get(const struct scmi_handle *handle, u32 domain, u32 *state)
 	if (ret)
 		return ret;
 
-	*(__le32 *)t->tx.buf = cpu_to_le32(domain);
+	put_unaligned_le32(domain, t->tx.buf);
 
 	ret = scmi_do_xfer(handle, t);
 	if (!ret)
-		*state = le32_to_cpu(*(__le32 *)t->rx.buf);
+		*state = get_unaligned_le32(t->rx.buf);
 
 	scmi_xfer_put(handle, t);
 	return ret;
diff --git a/drivers/firmware/arm_scmi/sensors.c b/drivers/firmware/arm_scmi/sensors.c
index 73cebecf8be6..206a59ba357d 100644
--- a/drivers/firmware/arm_scmi/sensors.c
+++ b/drivers/firmware/arm_scmi/sensors.c
@@ -120,7 +120,7 @@ static int scmi_sensor_description_get(const struct scmi_handle *handle,
 
 	do {
 		/* Set the number of sensors to be skipped/already read */
-		*(__le32 *)t->tx.buf = cpu_to_le32(desc_index);
+		put_unaligned_le32(desc_index, t->tx.buf);
 
 		ret = scmi_do_xfer(handle, t);
 		if (ret)
@@ -217,7 +217,6 @@ static int scmi_sensor_reading_get(const struct scmi_handle *handle,
 				   u32 sensor_id, u64 *value)
 {
 	int ret;
-	__le32 *pval;
 	struct scmi_xfer *t;
 	struct scmi_msg_sensor_reading_get *sensor;
 	struct sensors_info *si = handle->sensor_priv;
@@ -229,24 +228,20 @@ static int scmi_sensor_reading_get(const struct scmi_handle *handle,
 	if (ret)
 		return ret;
 
-	pval = t->rx.buf;
 	sensor = t->tx.buf;
 	sensor->id = cpu_to_le32(sensor_id);
 
 	if (s->async) {
 		sensor->flags = cpu_to_le32(SENSOR_READ_ASYNC);
 		ret = scmi_do_xfer_with_response(handle, t);
-		if (!ret) {
-			*value = le32_to_cpu(*(pval + 1));
-			*value |= (u64)le32_to_cpu(*(pval + 2)) << 32;
-		}
+		if (!ret)
+			*value = get_unaligned_le64((void *)
+						    ((__le32 *)t->rx.buf + 1));
 	} else {
 		sensor->flags = cpu_to_le32(0);
 		ret = scmi_do_xfer(handle, t);
-		if (!ret) {
-			*value = le32_to_cpu(*pval);
-			*value |= (u64)le32_to_cpu(*(pval + 1)) << 32;
-		}
+		if (!ret)
+			*value = get_unaligned_le64(t->rx.buf);
 	}
 
 	scmi_xfer_put(handle, t);

commit 77037bcf25d536efa551f0ae4edf1a65f8852b03
Author: Sudeep Holla <sudeep.holla@arm.com>
Date:   Mon Jul 8 14:42:16 2019 +0100

    UPSTREAM: firmware: arm_scmi: Use asynchronous CLOCK_RATE_SET when possible
    
    CLOCK_PROTOCOL_ATTRIBUTES provides attributes to indicate the maximum
    number of pending asynchronous clock rate changes supported by the
    platform. If it's non-zero, then we should be able to use asynchronous
    clock rate set for any clocks until the maximum limit is reached.
    
    Tracking the current count of pending asynchronous clock set rate
    requests, we can decide if the incoming/new request for clock set rate
    can be handled asynchronously or not until the maximum limit is
    reached.
    
    Change-Id: I958da7f1990ef773e26f182b59af26c5717ebd61
    Cc: linux-clk@vger.kernel.org
    Reviewed-by: Stephen Boyd <sboyd@kernel.org>
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    (cherry picked from commit 2bc06ffa0635e99cd4d88d6f6fe5bb4e4b9e50f1)

diff --git a/drivers/firmware/arm_scmi/clock.c b/drivers/firmware/arm_scmi/clock.c
index da0d1ffad6c9..7ce3013c44c9 100644
--- a/drivers/firmware/arm_scmi/clock.c
+++ b/drivers/firmware/arm_scmi/clock.c
@@ -56,7 +56,7 @@ struct scmi_msg_resp_clock_describe_rates {
 struct scmi_clock_set_rate {
 	__le32 flags;
 #define CLOCK_SET_ASYNC		BIT(0)
-#define CLOCK_SET_DELAYED	BIT(1)
+#define CLOCK_SET_IGNORE_RESP	BIT(1)
 #define CLOCK_SET_ROUND_UP	BIT(2)
 #define CLOCK_SET_ROUND_AUTO	BIT(3)
 	__le32 id;
@@ -67,6 +67,7 @@ struct scmi_clock_set_rate {
 struct clock_info {
 	int num_clocks;
 	int max_async_req;
+	atomic_t cur_async_req;
 	struct scmi_clock_info *clk;
 };
 
@@ -221,21 +222,33 @@ static int scmi_clock_rate_set(const struct scmi_handle *handle, u32 clk_id,
 			       u64 rate)
 {
 	int ret;
+	u32 flags = 0;
 	struct scmi_xfer *t;
 	struct scmi_clock_set_rate *cfg;
+	struct clock_info *ci = handle->clk_priv;
 
 	ret = scmi_xfer_get_init(handle, CLOCK_RATE_SET, SCMI_PROTOCOL_CLOCK,
 				 sizeof(*cfg), 0, &t);
 	if (ret)
 		return ret;
 
+	if (ci->max_async_req &&
+	    atomic_inc_return(&ci->cur_async_req) < ci->max_async_req)
+		flags |= CLOCK_SET_ASYNC;
+
 	cfg = t->tx.buf;
-	cfg->flags = cpu_to_le32(0);
+	cfg->flags = cpu_to_le32(flags);
 	cfg->id = cpu_to_le32(clk_id);
 	cfg->value_low = cpu_to_le32(rate & 0xffffffff);
 	cfg->value_high = cpu_to_le32(rate >> 32);
 
-	ret = scmi_do_xfer(handle, t);
+	if (flags & CLOCK_SET_ASYNC)
+		ret = scmi_do_xfer_with_response(handle, t);
+	else
+		ret = scmi_do_xfer(handle, t);
+
+	if (ci->max_async_req)
+		atomic_dec(&ci->cur_async_req);
 
 	scmi_xfer_put(handle, t);
 	return ret;

commit 09523b99d78451a60fae6437124398d76a0ac9c6
Author: Sudeep Holla <sudeep.holla@arm.com>
Date:   Mon Jul 8 09:42:22 2019 +0100

    UPSTREAM: firmware: arm_scmi: Drop config flag in clk_ops->rate_set
    
    CLOCK_PROTOCOL_ATTRIBUTES provides attributes to indicate the maximum
    number of pending asynchronous clock rate changes supported by the
    platform. If it's non-zero, then we should be able to use asynchronous
    clock rate set for any clocks until the maximum limit is reached.
    
    In order to add that support, let's drop the config flag passed to
    clk_ops->rate_set and handle the asynchronous requests dynamically.
    
    Change-Id: I1f6b5947638f3dad041d163bfb44936a3c484da9
    Cc: Stephen Boyd <sboyd@kernel.org>
    Cc: linux-clk@vger.kernel.org
    Acked-by: Stephen Boyd <sboyd@kernel.org>
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    (cherry picked from commit d0aba11614552d43a61c3acdf36876b00060286e)

diff --git a/drivers/clk/clk-scmi.c b/drivers/clk/clk-scmi.c
index c65d30bba700..ddc51a6a2e27 100644
--- a/drivers/clk/clk-scmi.c
+++ b/drivers/clk/clk-scmi.c
@@ -69,7 +69,7 @@ static int scmi_clk_set_rate(struct clk_hw *hw, unsigned long rate,
 {
 	struct scmi_clk *clk = to_scmi_clk(hw);
 
-	return clk->handle->clk_ops->rate_set(clk->handle, clk->id, 0, rate);
+	return clk->handle->clk_ops->rate_set(clk->handle, clk->id, rate);
 }
 
 static int scmi_clk_enable(struct clk_hw *hw)
diff --git a/drivers/firmware/arm_scmi/clock.c b/drivers/firmware/arm_scmi/clock.c
index a6a8bc081dac..da0d1ffad6c9 100644
--- a/drivers/firmware/arm_scmi/clock.c
+++ b/drivers/firmware/arm_scmi/clock.c
@@ -218,7 +218,7 @@ scmi_clock_rate_get(const struct scmi_handle *handle, u32 clk_id, u64 *value)
 }
 
 static int scmi_clock_rate_set(const struct scmi_handle *handle, u32 clk_id,
-			       u32 config, u64 rate)
+			       u64 rate)
 {
 	int ret;
 	struct scmi_xfer *t;
@@ -230,7 +230,7 @@ static int scmi_clock_rate_set(const struct scmi_handle *handle, u32 clk_id,
 		return ret;
 
 	cfg = t->tx.buf;
-	cfg->flags = cpu_to_le32(config);
+	cfg->flags = cpu_to_le32(0);
 	cfg->id = cpu_to_le32(clk_id);
 	cfg->value_low = cpu_to_le32(rate & 0xffffffff);
 	cfg->value_high = cpu_to_le32(rate >> 32);
diff --git a/include/linux/scmi_protocol.h b/include/linux/scmi_protocol.h
index e60a307aabeb..6375546b26d8 100644
--- a/include/linux/scmi_protocol.h
+++ b/include/linux/scmi_protocol.h
@@ -71,7 +71,7 @@ struct scmi_clk_ops {
 	int (*rate_get)(const struct scmi_handle *handle, u32 clk_id,
 			u64 *rate);
 	int (*rate_set)(const struct scmi_handle *handle, u32 clk_id,
-			u32 config, u64 rate);
+			u64 rate);
 	int (*enable)(const struct scmi_handle *handle, u32 clk_id);
 	int (*disable)(const struct scmi_handle *handle, u32 clk_id);
 };

commit 96048edcc740850823f4821cbe2524cffc7cf2ee
Author: Sudeep Holla <sudeep.holla@arm.com>
Date:   Mon Jul 8 09:41:01 2019 +0100

    UPSTREAM: firmware: arm_scmi: Add asynchronous sensor read if it supports
    
    SENSOR_DESCRIPTION_GET provides attributes to indicate if the sensor
    supports asynchronous read. We can read that flag and use asynchronous
    reads for any sensors with that attribute set.
    
    Let's use the new scmi_do_xfer_with_response to support asynchronous
    sensor reads.
    
    Change-Id: I8066cecb9565d5f40c42accbebc8ced2747d5dba
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    (cherry picked from commit d09aac0eb17c6ce2b66095e1e324f60ec9dd8988)

diff --git a/drivers/firmware/arm_scmi/sensors.c b/drivers/firmware/arm_scmi/sensors.c
index 7e701fddd7d2..73cebecf8be6 100644
--- a/drivers/firmware/arm_scmi/sensors.c
+++ b/drivers/firmware/arm_scmi/sensors.c
@@ -136,9 +136,10 @@ static int scmi_sensor_description_get(const struct scmi_handle *handle,
 		}
 
 		for (cnt = 0; cnt < num_returned; cnt++) {
-			u32 attrh;
+			u32 attrh, attrl;
 			struct scmi_sensor_info *s;
 
+			attrl = le32_to_cpu(buf->desc[cnt].attributes_low);
 			attrh = le32_to_cpu(buf->desc[cnt].attributes_high);
 			s = &si->sensors[desc_index + cnt];
 			s->id = le32_to_cpu(buf->desc[cnt].id);
@@ -147,6 +148,8 @@ static int scmi_sensor_description_get(const struct scmi_handle *handle,
 			/* Sign extend to a full s8 */
 			if (s->scale & SENSOR_SCALE_SIGN)
 				s->scale |= SENSOR_SCALE_EXTEND;
+			s->async = SUPPORTS_ASYNC_READ(attrl);
+			s->num_trip_points = NUM_TRIP_POINTS(attrl);
 			strlcpy(s->name, buf->desc[cnt].name, SCMI_MAX_STR_SIZE);
 		}
 
@@ -214,8 +217,11 @@ static int scmi_sensor_reading_get(const struct scmi_handle *handle,
 				   u32 sensor_id, u64 *value)
 {
 	int ret;
+	__le32 *pval;
 	struct scmi_xfer *t;
 	struct scmi_msg_sensor_reading_get *sensor;
+	struct sensors_info *si = handle->sensor_priv;
+	struct scmi_sensor_info *s = si->sensors + sensor_id;
 
 	ret = scmi_xfer_get_init(handle, SENSOR_READING_GET,
 				 SCMI_PROTOCOL_SENSOR, sizeof(*sensor),
@@ -223,16 +229,24 @@ static int scmi_sensor_reading_get(const struct scmi_handle *handle,
 	if (ret)
 		return ret;
 
+	pval = t->rx.buf;
 	sensor = t->tx.buf;
 	sensor->id = cpu_to_le32(sensor_id);
-	sensor->flags = cpu_to_le32(0);
-
-	ret = scmi_do_xfer(handle, t);
-	if (!ret) {
-		__le32 *pval = t->rx.buf;
 
-		*value = le32_to_cpu(*pval);
-		*value |= (u64)le32_to_cpu(*(pval + 1)) << 32;
+	if (s->async) {
+		sensor->flags = cpu_to_le32(SENSOR_READ_ASYNC);
+		ret = scmi_do_xfer_with_response(handle, t);
+		if (!ret) {
+			*value = le32_to_cpu(*(pval + 1));
+			*value |= (u64)le32_to_cpu(*(pval + 2)) << 32;
+		}
+	} else {
+		sensor->flags = cpu_to_le32(0);
+		ret = scmi_do_xfer(handle, t);
+		if (!ret) {
+			*value = le32_to_cpu(*pval);
+			*value |= (u64)le32_to_cpu(*(pval + 1)) << 32;
+		}
 	}
 
 	scmi_xfer_put(handle, t);
diff --git a/include/linux/scmi_protocol.h b/include/linux/scmi_protocol.h
index 83d72cc80b03..e60a307aabeb 100644
--- a/include/linux/scmi_protocol.h
+++ b/include/linux/scmi_protocol.h
@@ -145,6 +145,8 @@ struct scmi_sensor_info {
 	u32 id;
 	u8 type;
 	s8 scale;
+	u8 num_trip_points;
+	bool async;
 	char name[SCMI_MAX_STR_SIZE];
 };
 

commit c32cceb6bb99e66d1aaa12df24d62c12cf25978a
Author: Sudeep Holla <sudeep.holla@arm.com>
Date:   Mon Jul 8 09:40:57 2019 +0100

    UPSTREAM: firmware: arm_scmi: Drop async flag in sensor_ops->reading_get
    
    SENSOR_DESCRIPTION_GET provides attributes to indicate if the sensor
    supports asynchronous read. Ideally we should be able to read that flag
    and use asynchronous reads for any sensors with that attribute set.
    
    In order to add that support, let's drop the async flag passed to
    sensor_ops->reading_get and dynamically switch between sync and async
    flags based on the attributes as provided by the firmware.
    
    Change-Id: I000cae002b0fc85dcf09a3d35bd273685d6960b7
    Cc: linux-hwmon@vger.kernel.org
    Acked-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    (cherry picked from commit 6a55331c87d86a7406d8126ae75bdd07244a91b1)

diff --git a/drivers/firmware/arm_scmi/sensors.c b/drivers/firmware/arm_scmi/sensors.c
index bb98c51a7990..7e701fddd7d2 100644
--- a/drivers/firmware/arm_scmi/sensors.c
+++ b/drivers/firmware/arm_scmi/sensors.c
@@ -211,7 +211,7 @@ scmi_sensor_trip_point_config(const struct scmi_handle *handle, u32 sensor_id,
 }
 
 static int scmi_sensor_reading_get(const struct scmi_handle *handle,
-				   u32 sensor_id, bool async, u64 *value)
+				   u32 sensor_id, u64 *value)
 {
 	int ret;
 	struct scmi_xfer *t;
@@ -225,7 +225,7 @@ static int scmi_sensor_reading_get(const struct scmi_handle *handle,
 
 	sensor = t->tx.buf;
 	sensor->id = cpu_to_le32(sensor_id);
-	sensor->flags = cpu_to_le32(async ? SENSOR_READ_ASYNC : 0);
+	sensor->flags = cpu_to_le32(0);
 
 	ret = scmi_do_xfer(handle, t);
 	if (!ret) {
diff --git a/drivers/hwmon/scmi-hwmon.c b/drivers/hwmon/scmi-hwmon.c
index 59d896e61a99..30586b1a531f 100644
--- a/drivers/hwmon/scmi-hwmon.c
+++ b/drivers/hwmon/scmi-hwmon.c
@@ -72,7 +72,7 @@ static int scmi_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
 	const struct scmi_handle *h = scmi_sensors->handle;
 
 	sensor = *(scmi_sensors->info[type] + channel);
-	ret = h->sensor_ops->reading_get(h, sensor->id, false, &value);
+	ret = h->sensor_ops->reading_get(h, sensor->id, &value);
 	if (ret)
 		return ret;
 
diff --git a/include/linux/scmi_protocol.h b/include/linux/scmi_protocol.h
index fd3c2cc46f89..83d72cc80b03 100644
--- a/include/linux/scmi_protocol.h
+++ b/include/linux/scmi_protocol.h
@@ -182,7 +182,7 @@ struct scmi_sensor_ops {
 	int (*trip_point_config)(const struct scmi_handle *handle,
 				 u32 sensor_id, u8 trip_id, u64 trip_value);
 	int (*reading_get)(const struct scmi_handle *handle, u32 sensor_id,
-			   bool async, u64 *value);
+			   u64 *value);
 };
 
 /**

commit 075a3702aaf0e5994f906334377feaaf51b3ee19
Author: Sudeep Holla <sudeep.holla@arm.com>
Date:   Mon Jul 8 09:40:33 2019 +0100

    UPSTREAM: firmware: arm_scmi: Align few names in sensors protocol with SCMI specification
    
    Looks like more code developed during the draft versions of the
    specification slipped through and they don't match the final
    released version. This seem to have happened only with sensor
    protocol.
    
    Renaming few command and function names here to match exactly with
    the released version of SCMI specification for ease of maintenance.
    
    Change-Id: Idbaaa32e46e4d515c0fcb57f376f5f5b581e311b
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    (cherry picked from commit 9eefa43a1a03960c7458e1463132f893702741be)

diff --git a/drivers/firmware/arm_scmi/sensors.c b/drivers/firmware/arm_scmi/sensors.c
index bfd7974bbca7..bb98c51a7990 100644
--- a/drivers/firmware/arm_scmi/sensors.c
+++ b/drivers/firmware/arm_scmi/sensors.c
@@ -9,8 +9,8 @@
 
 enum scmi_sensor_protocol_cmd {
 	SENSOR_DESCRIPTION_GET = 0x3,
-	SENSOR_CONFIG_SET = 0x4,
-	SENSOR_TRIP_POINT_SET = 0x5,
+	SENSOR_TRIP_POINT_NOTIFY = 0x4,
+	SENSOR_TRIP_POINT_CONFIG = 0x5,
 	SENSOR_READING_GET = 0x6,
 };
 
@@ -42,9 +42,10 @@ struct scmi_msg_resp_sensor_description {
 	} desc[0];
 };
 
-struct scmi_msg_set_sensor_config {
+struct scmi_msg_sensor_trip_point_notify {
 	__le32 id;
 	__le32 event_control;
+#define SENSOR_TP_NOTIFY_ALL	BIT(0)
 };
 
 struct scmi_msg_set_sensor_trip_point {
@@ -160,15 +161,15 @@ static int scmi_sensor_description_get(const struct scmi_handle *handle,
 	return ret;
 }
 
-static int
-scmi_sensor_configuration_set(const struct scmi_handle *handle, u32 sensor_id)
+static int scmi_sensor_trip_point_notify(const struct scmi_handle *handle,
+					 u32 sensor_id, bool enable)
 {
 	int ret;
-	u32 evt_cntl = BIT(0);
+	u32 evt_cntl = enable ? SENSOR_TP_NOTIFY_ALL : 0;
 	struct scmi_xfer *t;
-	struct scmi_msg_set_sensor_config *cfg;
+	struct scmi_msg_sensor_trip_point_notify *cfg;
 
-	ret = scmi_xfer_get_init(handle, SENSOR_CONFIG_SET,
+	ret = scmi_xfer_get_init(handle, SENSOR_TRIP_POINT_NOTIFY,
 				 SCMI_PROTOCOL_SENSOR, sizeof(*cfg), 0, &t);
 	if (ret)
 		return ret;
@@ -183,15 +184,16 @@ scmi_sensor_configuration_set(const struct scmi_handle *handle, u32 sensor_id)
 	return ret;
 }
 
-static int scmi_sensor_trip_point_set(const struct scmi_handle *handle,
-				      u32 sensor_id, u8 trip_id, u64 trip_value)
+static int
+scmi_sensor_trip_point_config(const struct scmi_handle *handle, u32 sensor_id,
+			      u8 trip_id, u64 trip_value)
 {
 	int ret;
 	u32 evt_cntl = SENSOR_TP_BOTH;
 	struct scmi_xfer *t;
 	struct scmi_msg_set_sensor_trip_point *trip;
 
-	ret = scmi_xfer_get_init(handle, SENSOR_TRIP_POINT_SET,
+	ret = scmi_xfer_get_init(handle, SENSOR_TRIP_POINT_CONFIG,
 				 SCMI_PROTOCOL_SENSOR, sizeof(*trip), 0, &t);
 	if (ret)
 		return ret;
@@ -255,8 +257,8 @@ static int scmi_sensor_count_get(const struct scmi_handle *handle)
 static struct scmi_sensor_ops sensor_ops = {
 	.count_get = scmi_sensor_count_get,
 	.info_get = scmi_sensor_info_get,
-	.configuration_set = scmi_sensor_configuration_set,
-	.trip_point_set = scmi_sensor_trip_point_set,
+	.trip_point_notify = scmi_sensor_trip_point_notify,
+	.trip_point_config = scmi_sensor_trip_point_config,
 	.reading_get = scmi_sensor_reading_get,
 };
 
diff --git a/include/linux/scmi_protocol.h b/include/linux/scmi_protocol.h
index 63d9311047f9..fd3c2cc46f89 100644
--- a/include/linux/scmi_protocol.h
+++ b/include/linux/scmi_protocol.h
@@ -167,9 +167,9 @@ enum scmi_sensor_class {
  *
  * @count_get: get the count of sensors provided by SCMI
  * @info_get: get the information of the specified sensor
- * @configuration_set: control notifications on cross-over events for
+ * @trip_point_notify: control notifications on cross-over events for
  *	the trip-points
- * @trip_point_set: selects and configures a trip-point of interest
+ * @trip_point_config: selects and configures a trip-point of interest
  * @reading_get: gets the current value of the sensor
  */
 struct scmi_sensor_ops {
@@ -177,10 +177,10 @@ struct scmi_sensor_ops {
 
 	const struct scmi_sensor_info *(*info_get)
 		(const struct scmi_handle *handle, u32 sensor_id);
-	int (*configuration_set)(const struct scmi_handle *handle,
-				 u32 sensor_id);
-	int (*trip_point_set)(const struct scmi_handle *handle, u32 sensor_id,
-			      u8 trip_id, u64 trip_value);
+	int (*trip_point_notify)(const struct scmi_handle *handle,
+				 u32 sensor_id, bool enable);
+	int (*trip_point_config)(const struct scmi_handle *handle,
+				 u32 sensor_id, u8 trip_id, u64 trip_value);
 	int (*reading_get)(const struct scmi_handle *handle, u32 sensor_id,
 			   bool async, u64 *value);
 };

commit 1a05c25ce542ee038f298a16b3d6d75a90aa5409
Author: Florian Fainelli <f.fainelli@gmail.com>
Date:   Wed May 8 11:46:35 2019 -0700

    UPSTREAM: hwmon: scmi: Scale values to target desired HWMON units
    
    If the SCMI firmware implementation is reporting values in a scale that
    is different from the HWMON units, we need to scale up or down the value
    according to how far apart they are.
    
    Change-Id: I2e4819d00262d2c17cde293cbd27786d82a3b9df
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    [sudeep.holla: added check of scale = 0 for early exit in scmi_hwmon_scale]
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    (cherry picked from commit ac778e62634eee0685b622605b063a49edf2f2d1)

diff --git a/drivers/hwmon/scmi-hwmon.c b/drivers/hwmon/scmi-hwmon.c
index 91bfecdb3f5b..59d896e61a99 100644
--- a/drivers/hwmon/scmi-hwmon.c
+++ b/drivers/hwmon/scmi-hwmon.c
@@ -18,6 +18,50 @@ struct scmi_sensors {
 	const struct scmi_sensor_info **info[hwmon_max];
 };
 
+static inline u64 __pow10(u8 x)
+{
+	u64 r = 1;
+
+	while (x--)
+		r *= 10;
+
+	return r;
+}
+
+static int scmi_hwmon_scale(const struct scmi_sensor_info *sensor, u64 *value)
+{
+	s8 scale = sensor->scale;
+	u64 f;
+
+	switch (sensor->type) {
+	case TEMPERATURE_C:
+	case VOLTAGE:
+	case CURRENT:
+		scale += 3;
+		break;
+	case POWER:
+	case ENERGY:
+		scale += 6;
+		break;
+	default:
+		break;
+	}
+
+	if (scale == 0)
+		return 0;
+
+	if (abs(scale) > 19)
+		return -E2BIG;
+
+	f = __pow10(abs(scale));
+	if (scale > 0)
+		*value *= f;
+	else
+		*value = div64_u64(*value, f);
+
+	return 0;
+}
+
 static int scmi_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
 			   u32 attr, int channel, long *val)
 {
@@ -29,6 +73,10 @@ static int scmi_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
 
 	sensor = *(scmi_sensors->info[type] + channel);
 	ret = h->sensor_ops->reading_get(h, sensor->id, false, &value);
+	if (ret)
+		return ret;
+
+	ret = scmi_hwmon_scale(sensor, &value);
 	if (!ret)
 		*val = value;
 

commit c82a11363c1aba660674097d4c726ea5db7ad078
Author: Florian Fainelli <f.fainelli@gmail.com>
Date:   Wed May 8 11:46:34 2019 -0700

    UPSTREAM: firmware: arm_scmi: fetch and store sensor scale
    
    In preparation for dealing with scales within the SCMI HWMON driver,
    fetch and store the sensor unit scale into the scmi_sensor_info
    structure. In order to simplify computations for upper layer, take care
    of sign extending the scale to a full 8-bit signed value.
    
    Change-Id: If1a3907268e7fd5b511c313d429d2d801a52996a
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    [sudeep.holla: update bitfield values as per specification]
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    (cherry picked from commit 0b673b6486998061b0489b09447ebe8452da0146)

diff --git a/drivers/firmware/arm_scmi/sensors.c b/drivers/firmware/arm_scmi/sensors.c
index abd9aeb2cd7e..bfd7974bbca7 100644
--- a/drivers/firmware/arm_scmi/sensors.c
+++ b/drivers/firmware/arm_scmi/sensors.c
@@ -34,6 +34,8 @@ struct scmi_msg_resp_sensor_description {
 		__le32 attributes_high;
 #define SENSOR_TYPE(x)		((x) & 0xff)
 #define SENSOR_SCALE(x)		(((x) >> 11) & 0x1f)
+#define SENSOR_SCALE_SIGN	BIT(4)
+#define SENSOR_SCALE_EXTEND	GENMASK(7, 5)
 #define SENSOR_UPDATE_SCALE(x)	(((x) >> 22) & 0x1f)
 #define SENSOR_UPDATE_BASE(x)	(((x) >> 27) & 0x1f)
 		    u8 name[SCMI_MAX_STR_SIZE];
@@ -140,6 +142,10 @@ static int scmi_sensor_description_get(const struct scmi_handle *handle,
 			s = &si->sensors[desc_index + cnt];
 			s->id = le32_to_cpu(buf->desc[cnt].id);
 			s->type = SENSOR_TYPE(attrh);
+			s->scale = SENSOR_SCALE(attrh);
+			/* Sign extend to a full s8 */
+			if (s->scale & SENSOR_SCALE_SIGN)
+				s->scale |= SENSOR_SCALE_EXTEND;
 			strlcpy(s->name, buf->desc[cnt].name, SCMI_MAX_STR_SIZE);
 		}
 
diff --git a/include/linux/scmi_protocol.h b/include/linux/scmi_protocol.h
index f2936709c2b5..63d9311047f9 100644
--- a/include/linux/scmi_protocol.h
+++ b/include/linux/scmi_protocol.h
@@ -144,6 +144,7 @@ struct scmi_power_ops {
 struct scmi_sensor_info {
 	u32 id;
 	u8 type;
+	s8 scale;
 	char name[SCMI_MAX_STR_SIZE];
 };
 

commit b98301661cc3730a5a102da9f68ee5a830463b05
Author: Micha? Miros?aw <mirq-linux@rere.qmqm.pl>
Date:   Sat Apr 4 02:11:57 2020 +0200

    UPSTREAM: regulator: use consumer->supply_name in debugfs/regulator_summary
    
    Make it easier to identify regulator consumers when consumer device
    uses more than one supply.
    
    Before:
    
      regulator                      ena use open bypass voltage current min     max
     -----------------------------------------------------------------------------------
      regulator-dummy                  1   0    2      0     0mV     0mA 0mV     0mV
         1-0010                                                          0mV     0mV
         1-0010                                                          0mV     0mV
    
    After:
    
      regulator                      ena use open bypass voltage current min     max
     -----------------------------------------------------------------------------------
      regulator-dummy                  1   0    2      0     0mV     0mA 0mV     0mV
         1-0010-vccio                                                    0mV     0mV
         1-0010-vcc33                                                    0mV     0mV
    
    Change-Id: I69aea6bf17fb8665a1a2ae9434ddc74c61a1a6b6
    Signed-off-by: Micha? Miros?aw <mirq-linux@rere.qmqm.pl>
    Link: https://lore.kernel.org/r/731a4b299c6ae0ee9d8995157600a3477f21a36c.1585959068.git.mirq-linux@rere.qmqm.pl
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>
    (cherry picked from commit 6b576eb035dba77daf091f045fa1448682ee12b4)

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 0bbadb693b10..c8a7c985c406 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -5185,6 +5185,7 @@ static void regulator_summary_show_subtree(struct seq_file *s,
 		seq_printf(s, "%*s%-*s ",
 			   (level + 1) * 3 + 1, "",
 			   30 - (level + 1) * 3,
+			   consumer->supply_name ? consumer->supply_name :
 			   consumer->dev ? dev_name(consumer->dev) : "deviceless");
 
 		switch (rdev->desc->type) {

commit 73b6a3102ba13d60d787425ceba5e368b5803535
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Thu Jun 17 11:24:42 2021 +0800

    Revert "regulator: fix regulator_summary name show issue"
    
    This reverts commit 0ec895a5ac192c33017609fbb8e4296c8b868603.
    
    Change-Id: I1d3a332669efb19ff61c6ebeab7b97261c2e1ab4
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 8eba2eb0793e..0bbadb693b10 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -5143,18 +5143,6 @@ static int regulator_summary_show_children(struct device *dev, void *data)
 	return 0;
 }
 
-static void strrcpy(char *dst, int dst_len, const char *src)
-{
-	int src_len = strlen(src);
-
-	if (src_len > dst_len)
-		src += src_len - dst_len;
-
-	strncpy(dst, src, dst_len);
-}
-
-#define REGULATOR_NAME_LEN	(50)
-
 static void regulator_summary_show_subtree(struct seq_file *s,
 					   struct regulator_dev *rdev,
 					   int level)
@@ -5162,17 +5150,13 @@ static void regulator_summary_show_subtree(struct seq_file *s,
 	struct regulation_constraints *c;
 	struct regulator *consumer;
 	struct summary_data summary_data;
-	char buf[REGULATOR_NAME_LEN];
-	const char *devname;
 
 	if (!rdev)
 		return;
 
-	devname = rdev_get_name(rdev);
-	strrcpy(buf, REGULATOR_NAME_LEN - level * 3, devname);
 	seq_printf(s, "%*s%-*s %3d %4d %6d ",
 		   level * 3 + 1, "",
-		   REGULATOR_NAME_LEN - level * 3, buf,
+		   30 - level * 3, rdev_get_name(rdev),
 		   rdev->use_count, rdev->open_count, rdev->bypass_count);
 
 	seq_printf(s, "%5dmV ", _regulator_get_voltage(rdev) / 1000);
@@ -5198,11 +5182,10 @@ static void regulator_summary_show_subtree(struct seq_file *s,
 		if (consumer->dev && consumer->dev->class == &regulator_class)
 			continue;
 
-		devname = consumer->dev ? consumer->supply_name : "deviceless";
-		strrcpy(buf, REGULATOR_NAME_LEN - (level + 1) * 3, devname);
 		seq_printf(s, "%*s%-*s ",
 			   (level + 1) * 3 + 1, "",
-			   REGULATOR_NAME_LEN - (level + 1) * 3, buf);
+			   30 - (level + 1) * 3,
+			   consumer->dev ? dev_name(consumer->dev) : "deviceless");
 
 		switch (rdev->desc->type) {
 		case REGULATOR_VOLTAGE:
@@ -5238,14 +5221,8 @@ static int regulator_summary_show_roots(struct device *dev, void *data)
 
 static int regulator_summary_show(struct seq_file *s, void *data)
 {
-	int i;
-
-	seq_printf(s, "%-*s %3s %4s %6s %7s %7s %7s %7s\n",
-		   REGULATOR_NAME_LEN + 1, " regulator",
-		   "use", "open", "bypass", "voltage", "current", "min", "max");
-	for (i = 0; i < REGULATOR_NAME_LEN + 49; i++)
-		seq_puts(s, "-");
-	seq_puts(s, "\n");
+	seq_puts(s, " regulator                      use open bypass voltage current     min     max\n");
+	seq_puts(s, "-------------------------------------------------------------------------------\n");
 
 	class_for_each_device(&regulator_class, NULL, s,
 			      regulator_summary_show_roots);

commit 7a77852f87e0c3a35909a5c553edf437d122d7f0
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Tue Jun 15 11:00:25 2021 +0800

    arm64: dts: rockchip: rk3568-evb: add enable pin for vcc_lcdc
    
    Reference from hardware design, the vcc_lcdc0_n and vcc_lcdc1_n
    regulators are controlled by GPIO.
    
    Add enable pin for vcc_lcdc regulators, also add min and max voltage
    make the regulators have voltage values.
    
    Change-Id: Id3bdaa7f5612c28c1a82d22ef8ceb1c72f0fb405
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
index 3b68f66dd642..1bfaeb681069 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
@@ -292,6 +292,12 @@
 		compatible = "regulator-fixed";
 		regulator-name = "vcc3v3_lcd0_n";
 		regulator-boot-on;
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		enable-active-high;
+		gpio = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>;
+		vin-supply = <&vcc3v3_sys>;
+
 		regulator-state-mem {
 			regulator-off-in-suspend;
 		};
@@ -301,6 +307,12 @@
 		compatible = "regulator-fixed";
 		regulator-name = "vcc3v3_lcd1_n";
 		regulator-boot-on;
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		enable-active-high;
+		gpio = <&gpio0 RK_PC5 GPIO_ACTIVE_HIGH>;
+		vin-supply = <&vcc3v3_sys>;
+
 		regulator-state-mem {
 			regulator-off-in-suspend;
 		};

commit d4d1745bef79ae98b3cfeb35e88f1e866a7cfd00
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Fri Jun 11 18:32:41 2021 +0800

    arm64: dts: rockchip: rk3568-evb fix vcc5v0_usb nodes
    
    Add min/max voltage for usb regulators, also add vin-supply for them.
    
    From rk3568-evb1 hardware design, the power tree about usb is
    DC12V
      ->  VCC5V0_USB(controlled by EXT_EN from PMIC)
            ->  VCC5V0_HOST(controlled by GPIO0_A6)
            ->  VCC5V0_OTG(controlled by GPIO0_A5)
    
    The EXT_EN from PMIC RK809 is designed for device power off to cut off
    the usb 5.0v power, during system on, it keeps always on.
    
    Change-Id: I21e431b4b41022b101b6db92b0769d096679b67c
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
index cbb3189cc19d..3b68f66dd642 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
@@ -252,23 +252,40 @@
 		vin-supply = <&dc_12v>;
 	};
 
+	vcc5v0_usb: vcc5v0-usb {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc5v0_usb";
+		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 = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;
+		vin-supply = <&vcc5v0_usb>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&vcc5v0_host_en>;
-		regulator-name = "vcc5v0_host";
-		regulator-always-on;
 	};
 
 	vcc5v0_otg: vcc5v0-otg-regulator {
 		compatible = "regulator-fixed";
+		regulator-name = "vcc5v0_otg";
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
 		enable-active-high;
 		gpio = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>;
+		vin-supply = <&vcc5v0_usb>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&vcc5v0_otg_en>;
-		regulator-name = "vcc5v0_otg";
 	};
 
 	vcc3v3_lcd0_n: vcc3v3-lcd0-n {

commit 6de4caa7df8c6a0b76223121b7618511aeb56a26
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Tue Jun 15 11:23:42 2021 +0800

    arm64: dts: rockchip: rk356x-evb: fix pcie supply to regulator-fixed
    
    The pcie supply design is (rk3566 evb2 example)
    DC12V
      -> VCC12V_PCIE(controlled by GPIO0_C2_H)
      -> VCC3V3_PCIE(controlled by GPIO0_C2_H)
      -> VCC5V0_SYS
           -> VCC3V3_PI6C(controlled by GPIO0_C2_H)
    
    The pci phy driver only want to enable or disable the VCC3V3_PCIE power.
    
    Suggested from pcie owner to ignore the VCC12V_PCIE and VCC3V3_PI6C, so
    the dts only need to add regulator node for VCC3V3_PCIE.
    
    Most of time we keep the regulator name same as the hardware design, so
    the dts node is
        vcc3v3_pcie: gpio-regulator {
            compatible = "regulator-fixed";
            regulator-name = "vcc3v3_pcie";
            regulator-min-microvolt = <3300000>;
            regulator-max-microvolt = <3300000>;
            enable-active-high;
            gpio = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>;
            vin-supply = <&dc_12v>;
        };
    
    The regulator type is "regulator-fixed" since its voltage always be
    3.3v, min and max should be 3300000 make the regulator has a voltage
    value.
    
    The regulator can be enabled or disabled by regulator_enable or
    regulator_disable function, so make the GPIO0_B7 as "ena_pin" for the
    regulator.
    
    The regulator is supplied by DCIN_12V, so add the vin-supply.
    
    Change-Id: Iaf70abe9c9e06504af067dc0e3d60b775557c026
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-evb-mipitest-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-evb-mipitest-v10.dtsi
index d0e2f2a54b7a..4f5547faf24b 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-evb-mipitest-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-evb-mipitest-v10.dtsi
@@ -14,15 +14,14 @@
 	model = "Rockchip RK3566 EVB MIPITEST V10 Board";
 	compatible = "rockchip,rk3566-evb-mipitest-v10", "rockchip,rk3566";
 
-	pcie20_3v3: gpio-regulator {
-		compatible = "regulator-gpio";
-		regulator-name = "pcie20_3v3";
-		regulator-min-microvolt = <0100000>;
+	vcc3v3_pcie: gpio-regulator {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc3v3_pcie";
+		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpios = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>;
-		gpios-states = <0x1>;
-		states = <0100000 0x0
-			  3300000 0x1>;
+		enable-active-high;
+		gpio = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>;
+		vin-supply = <&dc_12v>;
 	};
 
 	rk_headset: rk-headset {
@@ -332,7 +331,7 @@
 
 &pcie2x1 {
 	reset-gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_HIGH>;
-	vpcie3v3-supply = <&pcie20_3v3>;
+	vpcie3v3-supply = <&vcc3v3_pcie>;
 	status = "disabled";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi
index d62cc83fbce0..913aff5e2614 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi
@@ -14,15 +14,14 @@
 	model = "Rockchip RK3566 EVB1 DDR4 V10 Board";
 	compatible = "rockchip,rk3566-evb1-ddr4-v10", "rockchip,rk3566";
 
-	pcie20_3v3: gpio-regulator {
-		compatible = "regulator-gpio";
-		regulator-name = "pcie20_3v3";
-		regulator-min-microvolt = <100000>;
+	vcc3v3_pcie: gpio-regulator {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc3v3_pcie";
+		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpios = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>;
-		gpios-states = <0x1>;
-		states = <100000 0x0
-			  3300000 0x1>;
+		enable-active-high;
+		gpio = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>;
+		vin-supply = <&dc_12v>;
 	};
 
 	rk_headset: rk-headset {
@@ -327,7 +326,7 @@
 
 &pcie2x1 {
 	reset-gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_HIGH>;
-	vpcie3v3-supply = <&pcie20_3v3>;
+	vpcie3v3-supply = <&vcc3v3_pcie>;
 	status = "okay";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi
index 2cb47ca48ea1..a23339548302 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi
@@ -15,17 +15,6 @@
 	model = "Rockchip RK3566 EVB2 LP4X V10 Board";
 	compatible = "rockchip,rk3566-evb2-lp4x-v10", "rockchip,rk3566";
 
-	pcie20_3v3: gpio-regulator {
-		compatible = "regulator-gpio";
-		regulator-name = "pcie20_3v3";
-		regulator-min-microvolt = <100000>;
-		regulator-max-microvolt = <3300000>;
-		gpios = <&gpio0 RK_PC2 GPIO_ACTIVE_HIGH>;
-		gpios-states = <0x1>;
-		states = <100000 0x0
-			  3300000 0x1>;
-	};
-
 	rk_headset: rk-headset {
 		compatible = "rockchip_headset";
 		headset_gpio = <&gpio3 RK_PA1 GPIO_ACTIVE_LOW>;
@@ -43,6 +32,16 @@
 		regulator-always-on;
 		regulator-boot-on;
 	};
+
+	vcc3v3_pcie: gpio-regulator {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc3v3_pcie";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		enable-active-high;
+		gpio = <&gpio0 RK_PC2 GPIO_ACTIVE_HIGH>;
+		vin-supply = <&dc_12v>;
+	};
 };
 
 &combphy1_usq {
@@ -416,7 +415,7 @@
 
 &pcie2x1 {
 	reset-gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_HIGH>;
-	vpcie3v3-supply = <&pcie20_3v3>;
+	vpcie3v3-supply = <&vcc3v3_pcie>;
 	status = "okay";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi
index 67da07efdcb6..e9cb9c23ba61 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi
@@ -14,15 +14,14 @@
 	model = "Rockchip RK3566 EVB5 LP4X V10 Board";
 	compatible = "rockchip,rk3566-evb5-lp4x-v10", "rockchip,rk3566";
 
-	pcie20_3v3: gpio-regulator {
-		compatible = "regulator-gpio";
-		regulator-name = "pcie20_3v3";
-		regulator-min-microvolt = <100000>;
+	vcc3v3_pcie: gpio-regulator {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc3v3_pcie";
+		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpios = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>;
-		gpios-states = <0x1>;
-		states = <100000 0x0
-			  3300000 0x1>;
+		enable-active-high;
+		gpio = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>;
+		vin-supply = <&dc_12v>;
 	};
 
 	rk_headset: rk-headset {
@@ -190,7 +189,7 @@
 
 &pcie2x1 {
 	reset-gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_HIGH>;
-	vpcie3v3-supply = <&pcie20_3v3>;
+	vpcie3v3-supply = <&vcc3v3_pcie>;
 	status = "disabled";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi
index 57eb90227ef4..505d01779c48 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi
@@ -32,46 +32,14 @@
 		vin-supply = <&vcc3v3_sys>;
 	};
 
-	pcie20_3v3: gpio-regulator {
-		compatible = "regulator-gpio";
-		regulator-name = "pcie20_3v3";
-		regulator-min-microvolt = <100000>;
-		regulator-max-microvolt = <3300000>;
-		gpios = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;
-		gpios-states = <0x1>;
-		states = <100000 0x0
-			  3300000 0x1>;
-	};
-
-	pcie30_avdd0v9: pcie30-avdd0v9 {
+	vcc3v3_pcie: gpio-regulator {
 		compatible = "regulator-fixed";
-		regulator-name = "pcie30_avdd0v9";
-		regulator-always-on;
-		regulator-boot-on;
-		regulator-min-microvolt = <900000>;
-		regulator-max-microvolt = <900000>;
-		vin-supply = <&vcc3v3_sys>;
-	};
-
-	pcie30_avdd1v8: pcie30-avdd1v8 {
-		compatible = "regulator-fixed";
-		regulator-name = "pcie30_avdd1v8";
-		regulator-always-on;
-		regulator-boot-on;
-		regulator-min-microvolt = <1800000>;
-		regulator-max-microvolt = <1800000>;
-		vin-supply = <&vcc3v3_sys>;
-	};
-
-	pcie30_3v3: gpio-regulator {
-		compatible = "regulator-gpio";
-		regulator-name = "pcie30_3v3";
-		regulator-min-microvolt = <100000>;
+		regulator-name = "vcc3v3_pcie";
+		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpios = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;
-		gpios-states = <0x1>;
-		states = <100000 0x0
-			  3300000 0x1>;
+		enable-active-high;
+		gpio = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;
+		vin-supply = <&dc_12v>;
 	};
 
 	qsgmii_3v3: gpio-regulator {
@@ -243,7 +211,7 @@
 
 &pcie2x1 {
 	reset-gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_HIGH>;
-	vpcie3v3-supply = <&pcie20_3v3>;
+	vpcie3v3-supply = <&vcc3v3_pcie>;
 	status = "okay";
 };
 
@@ -253,7 +221,7 @@
 
 &pcie3x2 {
 	reset-gpios = <&gpio0 RK_PC6 GPIO_ACTIVE_HIGH>;
-	vpcie3v3-supply = <&pcie30_3v3>;
+	vpcie3v3-supply = <&vcc3v3_pcie>;
 	status = "okay";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi
index 3780daa11c88..b8110a505c62 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi
@@ -13,48 +13,6 @@
 	model = "Rockchip RK3568 EVB6 DDR3 V10 Board";
 	compatible = "rockchip,rk3568-evb6-ddr3-v10", "rockchip,rk3568";
 
-	pcie20_3v3: gpio-regulator {
-		compatible = "regulator-gpio";
-		regulator-name = "pcie20_3v3";
-		regulator-min-microvolt = <100000>;
-		regulator-max-microvolt = <3300000>;
-		gpios = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;
-		gpios-states = <0x1>;
-		states = <100000 0x0
-			  3300000 0x1>;
-	};
-
-	pcie30_avdd0v9: pcie30-avdd0v9 {
-		compatible = "regulator-fixed";
-		regulator-name = "pcie30_avdd0v9";
-		regulator-always-on;
-		regulator-boot-on;
-		regulator-min-microvolt = <900000>;
-		regulator-max-microvolt = <900000>;
-		vin-supply = <&vcc3v3_sys>;
-	};
-
-	pcie30_avdd1v8: pcie30-avdd1v8 {
-		compatible = "regulator-fixed";
-		regulator-name = "pcie30_avdd1v8";
-		regulator-always-on;
-		regulator-boot-on;
-		regulator-min-microvolt = <1800000>;
-		regulator-max-microvolt = <1800000>;
-		vin-supply = <&vcc3v3_sys>;
-	};
-
-	pcie30_3v3: gpio-regulator {
-		compatible = "regulator-gpio";
-		regulator-name = "pcie30_3v3";
-		regulator-min-microvolt = <0100000>;
-		regulator-max-microvolt = <3300000>;
-		gpios = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;
-		gpios-states = <0x1>;
-		states = <0100000 0x0
-			  3300000 0x1>;
-	};
-
 	rk_headset: rk-headset {
 		compatible = "rockchip_headset";
 		headset_gpio = <&gpio3 RK_PC2 GPIO_ACTIVE_LOW>;
@@ -62,6 +20,16 @@
 		pinctrl-0 = <&hp_det>;
 	};
 
+	vcc3v3_pcie: gpio-regulator {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc3v3_pcie";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		enable-active-high;
+		gpio = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;
+		vin-supply = <&dc_12v>;
+	};
+
 	vcc_camera: vcc-camera-regulator {
 		compatible = "regulator-fixed";
 		gpio = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>;
@@ -333,21 +301,21 @@
 
 &pcie2x1 {
 	reset-gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_HIGH>;
-	vpcie3v3-supply = <&pcie20_3v3>;
+	vpcie3v3-supply = <&vcc3v3_pcie>;
 	status = "okay";
 };
 
 &pcie3x1 {
 	rockchip,bifurcation;
 	reset-gpios = <&gpio3 RK_PA1 GPIO_ACTIVE_HIGH>;
-	vpcie3v3-supply = <&pcie30_3v3>;
+	vpcie3v3-supply = <&vcc3v3_pcie>;
 	status = "okay";
 };
 
 &pcie3x2 {
 	rockchip,bifurcation;
 	reset-gpios = <&gpio2 RK_PD6 GPIO_ACTIVE_HIGH>;
-	vpcie3v3-supply = <&pcie30_3v3>;
+	vpcie3v3-supply = <&vcc3v3_pcie>;
 	status = "okay";
 };
 

commit 9218fe5ace8d44a27f33c91109fa6f05302b6676
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Wed Jun 16 08:49:22 2021 +0800

    pci: dwc: rockchip: fix pci power enable/disable
    
    Change-Id: I4337746b7db995b3c6de29b50b9edc7a6bc10a81
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
index caf41cce1b45..4fedaf4136e2 100644
--- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
+++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
@@ -112,9 +112,6 @@ struct reset_bulk_data	{
 
 #define PCIE_PL_ORDER_RULE_CTRL_OFF	0x8B4
 
-#define FAKE_MIN_VOL			100000
-#define FAKE_MAX_VOL			3300000
-
 struct rk_pcie {
 	struct dw_pcie			*pci;
 	enum rk_pcie_device_mode	mode;
@@ -1207,12 +1204,6 @@ static int rk_pcie_enable_power(struct rk_pcie *rk_pcie)
 	if (IS_ERR(rk_pcie->vpcie3v3))
 		return ret;
 
-	ret = regulator_set_voltage(rk_pcie->vpcie3v3, FAKE_MAX_VOL, FAKE_MAX_VOL);
-	if (ret) {
-		dev_err(dev, "fail to set vpcie3v3 regulator\n");
-		return ret;
-	}
-
 	ret = regulator_enable(rk_pcie->vpcie3v3);
 	if (ret)
 		dev_err(dev, "fail to enable vpcie3v3 regulator\n");
@@ -1228,12 +1219,6 @@ static int rk_pcie_disable_power(struct rk_pcie *rk_pcie)
 	if (IS_ERR(rk_pcie->vpcie3v3))
 		return ret;
 
-	ret = regulator_set_voltage(rk_pcie->vpcie3v3, FAKE_MIN_VOL, FAKE_MIN_VOL);
-	if (ret) {
-		dev_err(dev, "fail to set vpcie3v3 regulator\n");
-		return ret;
-	}
-
 	ret = regulator_disable(rk_pcie->vpcie3v3);
 	if (ret)
 		dev_err(dev, "fail to disable vpcie3v3 regulator\n");

commit 60080b53629d749f14cf6981b1602de6c19dd46e
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Wed Jun 16 13:01:12 2021 +0200

    Revert "perf/core: Fix endless multiplex timer"
    
    This reverts commit 2cdbfd656720 ("perf/core: Fix endless multiplex
    timer") as it is not needed because we reverted 0b4c9255a1d0
    ("perf/cgroups: Don't rotate events for cgroups unnecessarily") earlier
    as it broke the ABI.
    
    This also fixes the build breakage caused by the above commit being in
    the tree and us reverting the original change.
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I640225fb5db8f81fdf2011cabeb593c6d9f066b7

diff --git a/kernel/events/core.c b/kernel/events/core.c
index 30cceb33c4e6..9237681c8450 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -2086,7 +2086,6 @@ __perf_remove_from_context(struct perf_event *event,
 
 	if (!ctx->nr_events && ctx->is_active) {
 		ctx->is_active = 0;
-		ctx->rotate_necessary = 0;
 		if (ctx->task) {
 			WARN_ON_ONCE(cpuctx->task_ctx != ctx);
 			cpuctx->task_ctx = NULL;
@@ -2962,13 +2961,6 @@ static void ctx_sched_out(struct perf_event_context *ctx,
 	if (is_active & EVENT_FLEXIBLE) {
 		list_for_each_entry_safe(event, tmp, &ctx->flexible_active, active_list)
 			group_sched_out(event, cpuctx, ctx);
-
-		/*
-		 * Since we cleared EVENT_FLEXIBLE, also clear
-		 * rotate_necessary, is will be reset by
-		 * ctx_flexible_sched_in() when needed.
-		 */
-		ctx->rotate_necessary = 0;
 	}
 	perf_pmu_enable(ctx->pmu);
 }

commit f931d3c324845b1be4337d27b565351fb581f206
Merge: 6fcf87747e0e eb575cd5d7f6
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Wed Jun 16 12:13:27 2021 +0200

    Merge 4.19.195 into android-4.19-stable
    
    Changes in 4.19.195
            perf/core: Fix endless multiplex timer
            proc: Track /proc/$pid/attr/ opener mm_struct
            net/nfc/rawsock.c: fix a permission check bug
            ASoC: Intel: bytcr_rt5640: Add quirk for the Glavey TM800A550L tablet
            ASoC: Intel: bytcr_rt5640: Add quirk for the Lenovo Miix 3-830 tablet
            ASoC: sti-sas: add missing MODULE_DEVICE_TABLE
            isdn: mISDN: netjet: Fix crash in nj_probe:
            bonding: init notify_work earlier to avoid uninitialized use
            netlink: disable IRQs for netlink_lock_table()
            net: mdiobus: get rid of a BUG_ON()
            cgroup: disable controllers at parse time
            wq: handle VM suspension in stall detection
            net/qla3xxx: fix schedule while atomic in ql_sem_spinlock
            RDS tcp loopback connection can hang
            scsi: bnx2fc: Return failure if io_req is already in ABTS processing
            scsi: vmw_pvscsi: Set correct residual data length
            scsi: target: qla2xxx: Wait for stop_phase1 at WWN removal
            net: macb: ensure the device is available before accessing GEMGXL control registers
            net: appletalk: cops: Fix data race in cops_probe1
            nvme-fabrics: decode host pathing error for connect
            MIPS: Fix kernel hang under FUNCTION_GRAPH_TRACER and PREEMPT_TRACER
            bnx2x: Fix missing error code in bnx2x_iov_init_one()
            powerpc/fsl: set fsl,i2c-erratum-a004447 flag for P2041 i2c controllers
            powerpc/fsl: set fsl,i2c-erratum-a004447 flag for P1010 i2c controllers
            i2c: mpc: Make use of i2c_recover_bus()
            i2c: mpc: implement erratum A-004447 workaround
            ARM: dts: imx6qdl-sabresd: Assign corresponding power supply for LDOs
            ARM: dts: imx6q-dhcom: Add PU,VDD1P1,VDD2P5 regulators
            drm: Fix use-after-free read in drm_getunique()
            drm: Lock pointer access in drm_master_release()
            kvm: avoid speculation-based attacks from out-of-range memslot accesses
            staging: rtl8723bs: Fix uninitialized variables
            btrfs: return value from btrfs_mark_extent_written() in case of error
            cgroup1: don't allow '\n' in renaming
            USB: f_ncm: ncm_bitrate (speed) is unsigned
            usb: f_ncm: only first packet of aggregate needs to start timer
            usb: pd: Set PD_T_SINK_WAIT_CAP to 310ms
            usb: dwc3: ep0: fix NULL pointer exception
            usb: typec: ucsi: Clear PPM capability data in ucsi_init() error path
            usb: gadget: f_fs: Ensure io_completion_wq is idle during unbind
            USB: serial: ftdi_sio: add NovaTech OrionMX product ID
            USB: serial: omninet: add device id for Zyxel Omni 56K Plus
            USB: serial: quatech2: fix control-request directions
            USB: serial: cp210x: fix alternate function for CP2102N QFN20
            usb: gadget: eem: fix wrong eem header operation
            usb: fix various gadgets null ptr deref on 10gbps cabling.
            usb: fix various gadget panics on 10gbps cabling
            regulator: core: resolve supply for boot-on/always-on regulators
            regulator: max77620: Use device_set_of_node_from_dev()
            RDMA/mlx4: Do not map the core_clock page to user space unless enabled
            vmlinux.lds.h: Avoid orphan section with !SMP
            perf: Fix data race between pin_count increment/decrement
            sched/fair: Make sure to update tg contrib for blocked load
            IB/mlx5: Fix initializing CQ fragments buffer
            NFS: Fix a potential NULL dereference in nfs_get_client()
            NFSv4: Fix deadlock between nfs4_evict_inode() and nfs4_opendata_get_inode()
            perf session: Correct buffer copying when peeking events
            kvm: fix previous commit for 32-bit builds
            NFS: Fix use-after-free in nfs4_init_client()
            NFSv4: Fix second deadlock in nfs4_evict_inode()
            NFSv4: nfs4_proc_set_acl needs to restore NFS_CAP_UIDGID_NOMAP on error.
            scsi: core: Fix error handling of scsi_host_alloc()
            scsi: core: Put .shost_dev in failure path if host state changes to RUNNING
            scsi: core: Only put parent device if host state differs from SHOST_CREATED
            ftrace: Do not blindly read the ip address in ftrace_bug()
            tracing: Correct the length check which causes memory corruption
            proc: only require mm_struct for writing
            Linux 4.19.195
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I47594a87a8e11059356934f612ee81f8f2df6561

commit eb575cd5d7f60241d016fdd13a9e86d962093c9b
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Wed Jun 16 11:55:02 2021 +0200

    Linux 4.19.195
    
    Link: https://lore.kernel.org/r/20210614102643.797691914@linuxfoundation.org
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Jason Self <jason@bluehome.net>
    Tested-by: Hulk Robot <hulkrobot@huawei.com>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index 8ea26b64b334..9ff7a4b7b8cb 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 194
+SUBLEVEL = 195
 EXTRAVERSION =
 NAME = "People's Front"
 

commit 2bc534caba6a9650123e7ddb89b3e34845df9c7b
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date:   Tue Jun 15 09:26:19 2021 -0700

    proc: only require mm_struct for writing
    
    commit 94f0b2d4a1d0c52035aef425da5e022bd2cb1c71 upstream.
    
    Commit 591a22c14d3f ("proc: Track /proc/$pid/attr/ opener mm_struct") we
    started using __mem_open() to track the mm_struct at open-time, so that
    we could then check it for writes.
    
    But that also ended up making the permission checks at open time much
    stricter - and not just for writes, but for reads too.  And that in turn
    caused a regression for at least Fedora 29, where NIC interfaces fail to
    start when using NetworkManager.
    
    Since only the write side wanted the mm_struct test, ignore any failures
    by __mem_open() at open time, leaving reads unaffected.  The write()
    time verification of the mm_struct pointer will then catch the failure
    case because a NULL pointer will not match a valid 'current->mm'.
    
    Link: https://lore.kernel.org/netdev/YMjTlp2FSJYvoyFa@unreal/
    Fixes: 591a22c14d3f ("proc: Track /proc/$pid/attr/ opener mm_struct")
    Reported-and-tested-by: Leon Romanovsky <leon@kernel.org>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Christian Brauner <christian.brauner@ubuntu.com>
    Cc: Andrea Righi <andrea.righi@canonical.com>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/proc/base.c b/fs/proc/base.c
index 9f331abc202d..317a0762fc5f 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -2537,7 +2537,9 @@ static int proc_pident_readdir(struct file *file, struct dir_context *ctx,
 #ifdef CONFIG_SECURITY
 static int proc_pid_attr_open(struct inode *inode, struct file *file)
 {
-	return __mem_open(inode, file, PTRACE_MODE_READ_FSCREDS);
+	file->private_data = NULL;
+	__mem_open(inode, file, PTRACE_MODE_READ_FSCREDS);
+	return 0;
 }
 
 static ssize_t proc_pid_attr_read(struct file * file, char __user * buf,

commit 31ceae385556c37e4d286cb6378696448f566883
Author: Liangyan <liangyan.peng@linux.alibaba.com>
Date:   Mon Jun 7 20:57:34 2021 +0800

    tracing: Correct the length check which causes memory corruption
    
    commit 3e08a9f9760f4a70d633c328a76408e62d6f80a3 upstream.
    
    We've suffered from severe kernel crashes due to memory corruption on
    our production environment, like,
    
    Call Trace:
    [1640542.554277] general protection fault: 0000 [#1] SMP PTI
    [1640542.554856] CPU: 17 PID: 26996 Comm: python Kdump: loaded Tainted:G
    [1640542.556629] RIP: 0010:kmem_cache_alloc+0x90/0x190
    [1640542.559074] RSP: 0018:ffffb16faa597df8 EFLAGS: 00010286
    [1640542.559587] RAX: 0000000000000000 RBX: 0000000000400200 RCX:
    0000000006e931bf
    [1640542.560323] RDX: 0000000006e931be RSI: 0000000000400200 RDI:
    ffff9a45ff004300
    [1640542.560996] RBP: 0000000000400200 R08: 0000000000023420 R09:
    0000000000000000
    [1640542.561670] R10: 0000000000000000 R11: 0000000000000000 R12:
    ffffffff9a20608d
    [1640542.562366] R13: ffff9a45ff004300 R14: ffff9a45ff004300 R15:
    696c662f65636976
    [1640542.563128] FS:  00007f45d7c6f740(0000) GS:ffff9a45ff840000(0000)
    knlGS:0000000000000000
    [1640542.563937] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [1640542.564557] CR2: 00007f45d71311a0 CR3: 000000189d63e004 CR4:
    00000000003606e0
    [1640542.565279] DR0: 0000000000000000 DR1: 0000000000000000 DR2:
    0000000000000000
    [1640542.566069] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7:
    0000000000000400
    [1640542.566742] Call Trace:
    [1640542.567009]  anon_vma_clone+0x5d/0x170
    [1640542.567417]  __split_vma+0x91/0x1a0
    [1640542.567777]  do_munmap+0x2c6/0x320
    [1640542.568128]  vm_munmap+0x54/0x70
    [1640542.569990]  __x64_sys_munmap+0x22/0x30
    [1640542.572005]  do_syscall_64+0x5b/0x1b0
    [1640542.573724]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [1640542.575642] RIP: 0033:0x7f45d6e61e27
    
    James Wang has reproduced it stably on the latest 4.19 LTS.
    After some debugging, we finally proved that it's due to ftrace
    buffer out-of-bound access using a debug tool as follows:
    [   86.775200] BUG: Out-of-bounds write at addr 0xffff88aefe8b7000
    [   86.780806]  no_context+0xdf/0x3c0
    [   86.784327]  __do_page_fault+0x252/0x470
    [   86.788367]  do_page_fault+0x32/0x140
    [   86.792145]  page_fault+0x1e/0x30
    [   86.795576]  strncpy_from_unsafe+0x66/0xb0
    [   86.799789]  fetch_memory_string+0x25/0x40
    [   86.804002]  fetch_deref_string+0x51/0x60
    [   86.808134]  kprobe_trace_func+0x32d/0x3a0
    [   86.812347]  kprobe_dispatcher+0x45/0x50
    [   86.816385]  kprobe_ftrace_handler+0x90/0xf0
    [   86.820779]  ftrace_ops_assist_func+0xa1/0x140
    [   86.825340]  0xffffffffc00750bf
    [   86.828603]  do_sys_open+0x5/0x1f0
    [   86.832124]  do_syscall_64+0x5b/0x1b0
    [   86.835900]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    commit b220c049d519 ("tracing: Check length before giving out
    the filter buffer") adds length check to protect trace data
    overflow introduced in 0fc1b09ff1ff, seems that this fix can't prevent
    overflow entirely, the length check should also take the sizeof
    entry->array[0] into account, since this array[0] is filled the
    length of trace data and occupy addtional space and risk overflow.
    
    Link: https://lkml.kernel.org/r/20210607125734.1770447-1-liangyan.peng@linux.alibaba.com
    
    Cc: stable@vger.kernel.org
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Xunlei Pang <xlpang@linux.alibaba.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Fixes: b220c049d519 ("tracing: Check length before giving out the filter buffer")
    Reviewed-by: Xunlei Pang <xlpang@linux.alibaba.com>
    Reviewed-by: yinbinbin <yinbinbin@alibabacloud.com>
    Reviewed-by: Wetp Zhang <wetp.zy@linux.alibaba.com>
    Tested-by: James Wang <jnwang@linux.alibaba.com>
    Signed-off-by: Liangyan <liangyan.peng@linux.alibaba.com>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 4eea58a907f0..f8aaa7879d7d 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -2281,7 +2281,7 @@ trace_event_buffer_lock_reserve(struct ring_buffer **current_rb,
 	    (entry = this_cpu_read(trace_buffered_event))) {
 		/* Try to use the per cpu buffer first */
 		val = this_cpu_inc_return(trace_buffered_event_cnt);
-		if ((len < (PAGE_SIZE - sizeof(*entry))) && val == 1) {
+		if ((len < (PAGE_SIZE - sizeof(*entry) - sizeof(entry->array[0]))) && val == 1) {
 			trace_event_setup(entry, type, flags, pc);
 			entry->array[0] = len;
 			return entry;

commit 862dcc14f2803c556bdd73b43c27b023fafce2fb
Author: Steven Rostedt (VMware) <rostedt@goodmis.org>
Date:   Mon Jun 7 21:39:08 2021 -0400

    ftrace: Do not blindly read the ip address in ftrace_bug()
    
    commit 6c14133d2d3f768e0a35128faac8aa6ed4815051 upstream.
    
    It was reported that a bug on arm64 caused a bad ip address to be used for
    updating into a nop in ftrace_init(), but the error path (rightfully)
    returned -EINVAL and not -EFAULT, as the bug caused more than one error to
    occur. But because -EINVAL was returned, the ftrace_bug() tried to report
    what was at the location of the ip address, and read it directly. This
    caused the machine to panic, as the ip was not pointing to a valid memory
    address.
    
    Instead, read the ip address with copy_from_kernel_nofault() to safely
    access the memory, and if it faults, report that the address faulted,
    otherwise report what was in that location.
    
    Link: https://lore.kernel.org/lkml/20210607032329.28671-1-mark-pk.tsai@mediatek.com/
    
    Cc: stable@vger.kernel.org
    Fixes: 05736a427f7e1 ("ftrace: warn on failure to disable mcount callers")
    Reported-by: Mark-PK Tsai <mark-pk.tsai@mediatek.com>
    Tested-by: Mark-PK Tsai <mark-pk.tsai@mediatek.com>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index f8d82b36dd66..c5c8aafa29cf 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -1977,12 +1977,18 @@ static int ftrace_hash_ipmodify_update(struct ftrace_ops *ops,
 
 static void print_ip_ins(const char *fmt, const unsigned char *p)
 {
+	char ins[MCOUNT_INSN_SIZE];
 	int i;
 
+	if (probe_kernel_read(ins, p, MCOUNT_INSN_SIZE)) {
+		printk(KERN_CONT "%s[FAULT] %px\n", fmt, p);
+		return;
+	}
+
 	printk(KERN_CONT "%s", fmt);
 
 	for (i = 0; i < MCOUNT_INSN_SIZE; i++)
-		printk(KERN_CONT "%s%02x", i ? ":" : "", p[i]);
+		printk(KERN_CONT "%s%02x", i ? ":" : "", ins[i]);
 }
 
 enum ftrace_bug_type ftrace_bug_type;

commit 681e5c84dd98a22019200a40b6e59ad9326c3a2b
Author: Ming Lei <ming.lei@redhat.com>
Date:   Wed Jun 2 21:30:29 2021 +0800

    scsi: core: Only put parent device if host state differs from SHOST_CREATED
    
    commit 1e0d4e6225996f05271de1ebcb1a7c9381af0b27 upstream.
    
    get_device(shost->shost_gendev.parent) is called after host state has
    switched to SHOST_RUNNING. scsi_host_dev_release() shouldn't release the
    parent device if host state is still SHOST_CREATED.
    
    Link: https://lore.kernel.org/r/20210602133029.2864069-5-ming.lei@redhat.com
    Cc: Bart Van Assche <bvanassche@acm.org>
    Cc: John Garry <john.garry@huawei.com>
    Cc: Hannes Reinecke <hare@suse.de>
    Tested-by: John Garry <john.garry@huawei.com>
    Reviewed-by: John Garry <john.garry@huawei.com>
    Signed-off-by: Ming Lei <ming.lei@redhat.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index 7ffdaf438801..fa03be813f2c 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -360,7 +360,7 @@ static void scsi_host_dev_release(struct device *dev)
 
 	ida_simple_remove(&host_index_ida, shost->host_no);
 
-	if (parent)
+	if (shost->shost_state != SHOST_CREATED)
 		put_device(parent);
 	kfree(shost);
 }

commit 7dc0595263fd4294e5f355594eff74891d027e86
Author: Ming Lei <ming.lei@redhat.com>
Date:   Wed Jun 2 21:30:28 2021 +0800

    scsi: core: Put .shost_dev in failure path if host state changes to RUNNING
    
    commit 11714026c02d613c30a149c3f4c4a15047744529 upstream.
    
    scsi_host_dev_release() only frees dev_name when host state is
    SHOST_CREATED. After host state has changed to SHOST_RUNNING,
    scsi_host_dev_release() no longer cleans up.
    
    Fix this by doing a put_device(&shost->shost_dev) in the failure path when
    host state is SHOST_RUNNING. Move get_device(&shost->shost_gendev) before
    device_add(&shost->shost_dev) so that scsi_host_cls_release() can do a put
    on this reference.
    
    Link: https://lore.kernel.org/r/20210602133029.2864069-4-ming.lei@redhat.com
    Cc: Bart Van Assche <bvanassche@acm.org>
    Cc: Hannes Reinecke <hare@suse.de>
    Reported-by: John Garry <john.garry@huawei.com>
    Tested-by: John Garry <john.garry@huawei.com>
    Reviewed-by: John Garry <john.garry@huawei.com>
    Reviewed-by: Hannes Reinecke <hare@suse.de>
    Signed-off-by: Ming Lei <ming.lei@redhat.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index 5f7899e64f15..7ffdaf438801 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -261,12 +261,11 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev,
 
 	device_enable_async_suspend(&shost->shost_dev);
 
+	get_device(&shost->shost_gendev);
 	error = device_add(&shost->shost_dev);
 	if (error)
 		goto out_del_gendev;
 
-	get_device(&shost->shost_gendev);
-
 	if (shost->transportt->host_size) {
 		shost->shost_data = kzalloc(shost->transportt->host_size,
 					 GFP_KERNEL);
@@ -303,6 +302,11 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev,
  out_del_dev:
 	device_del(&shost->shost_dev);
  out_del_gendev:
+	/*
+	 * Host state is SHOST_RUNNING so we have to explicitly release
+	 * ->shost_dev.
+	 */
+	put_device(&shost->shost_dev);
 	device_del(&shost->shost_gendev);
  out_disable_runtime_pm:
 	device_disable_async_suspend(&shost->shost_gendev);

commit 2dc85045ae65b9302a1d2e2ddd7ce4c030153a6a
Author: Ming Lei <ming.lei@redhat.com>
Date:   Wed Jun 2 21:30:26 2021 +0800

    scsi: core: Fix error handling of scsi_host_alloc()
    
    commit 66a834d092930cf41d809c0e989b13cd6f9ca006 upstream.
    
    After device is initialized via device_initialize(), or its name is set via
    dev_set_name(), the device has to be freed via put_device().  Otherwise
    device name will be leaked because it is allocated dynamically in
    dev_set_name().
    
    Fix the leak by replacing kfree() with put_device(). Since
    scsi_host_dev_release() properly handles IDA and kthread removal, remove
    special-casing these from the error handling as well.
    
    Link: https://lore.kernel.org/r/20210602133029.2864069-2-ming.lei@redhat.com
    Cc: Bart Van Assche <bvanassche@acm.org>
    Cc: John Garry <john.garry@huawei.com>
    Cc: Hannes Reinecke <hare@suse.de>
    Tested-by: John Garry <john.garry@huawei.com>
    Reviewed-by: Bart Van Assche <bvanassche@acm.org>
    Reviewed-by: John Garry <john.garry@huawei.com>
    Reviewed-by: Hannes Reinecke <hare@suse.de>
    Signed-off-by: Ming Lei <ming.lei@redhat.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index ea4b0bb0c1cd..5f7899e64f15 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -403,8 +403,10 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
 	mutex_init(&shost->scan_mutex);
 
 	index = ida_simple_get(&host_index_ida, 0, 0, GFP_KERNEL);
-	if (index < 0)
-		goto fail_kfree;
+	if (index < 0) {
+		kfree(shost);
+		return NULL;
+	}
 	shost->host_no = index;
 
 	shost->dma_channel = 0xff;
@@ -491,7 +493,7 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
 		shost_printk(KERN_WARNING, shost,
 			"error handler thread failed to spawn, error = %ld\n",
 			PTR_ERR(shost->ehandler));
-		goto fail_index_remove;
+		goto fail;
 	}
 
 	shost->tmf_work_q = alloc_workqueue("scsi_tmf_%d",
@@ -500,17 +502,18 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
 	if (!shost->tmf_work_q) {
 		shost_printk(KERN_WARNING, shost,
 			     "failed to create tmf workq\n");
-		goto fail_kthread;
+		goto fail;
 	}
 	scsi_proc_hostdir_add(shost->hostt);
 	return shost;
+ fail:
+	/*
+	 * Host state is still SHOST_CREATED and that is enough to release
+	 * ->shost_gendev. scsi_host_dev_release() will free
+	 * dev_name(&shost->shost_dev).
+	 */
+	put_device(&shost->shost_gendev);
 
- fail_kthread:
-	kthread_stop(shost->ehandler);
- fail_index_remove:
-	ida_simple_remove(&host_index_ida, shost->host_no);
- fail_kfree:
-	kfree(shost);
 	return NULL;
 }
 EXPORT_SYMBOL(scsi_host_alloc);

commit 626928c3e3127867f078d986cc868c5e3c367bd9
Author: Dai Ngo <dai.ngo@oracle.com>
Date:   Wed May 19 17:15:10 2021 -0400

    NFSv4: nfs4_proc_set_acl needs to restore NFS_CAP_UIDGID_NOMAP on error.
    
    commit f8849e206ef52b584cd9227255f4724f0cc900bb upstream.
    
    Currently if __nfs4_proc_set_acl fails with NFS4ERR_BADOWNER it
    re-enables the idmapper by clearing NFS_CAP_UIDGID_NOMAP before
    retrying again. The NFS_CAP_UIDGID_NOMAP remains cleared even if
    the retry fails. This causes problem for subsequent setattr
    requests for v4 server that does not have idmapping configured.
    
    This patch modifies nfs4_proc_set_acl to detect NFS4ERR_BADOWNER
    and NFS4ERR_BADNAME and skips the retry, since the kernel isn't
    involved in encoding the ACEs, and return -EINVAL.
    
    Steps to reproduce the problem:
    
     # mount -o vers=4.1,sec=sys server:/export/test /tmp/mnt
     # touch /tmp/mnt/file1
     # chown 99 /tmp/mnt/file1
     # nfs4_setfacl -a A::unknown.user@xyz.com:wrtncy /tmp/mnt/file1
     Failed setxattr operation: Invalid argument
     # chown 99 /tmp/mnt/file1
     chown: changing ownership of ??tmp/mnt/file1?? Invalid argument
     # umount /tmp/mnt
     # mount -o vers=4.1,sec=sys server:/export/test /tmp/mnt
     # chown 99 /tmp/mnt/file1
     #
    
    v2: detect NFS4ERR_BADOWNER and NFS4ERR_BADNAME and skip retry
           in nfs4_proc_set_acl.
    Signed-off-by: Dai Ngo <dai.ngo@oracle.com>
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 0867ce7169c7..759c834b60fd 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -5580,6 +5580,14 @@ static int nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen
 	do {
 		err = __nfs4_proc_set_acl(inode, buf, buflen);
 		trace_nfs4_set_acl(inode, err);
+		if (err == -NFS4ERR_BADOWNER || err == -NFS4ERR_BADNAME) {
+			/*
+			 * no need to retry since the kernel
+			 * isn't involved in encoding the ACEs.
+			 */
+			err = -EINVAL;
+			break;
+		}
 		err = nfs4_handle_exception(NFS_SERVER(inode), err,
 				&exception);
 	} while (exception.retry);

commit 9cd420e572e85b311db6ec79a9607bd249f59659
Author: Trond Myklebust <trond.myklebust@hammerspace.com>
Date:   Tue Jun 1 11:35:56 2021 -0400

    NFSv4: Fix second deadlock in nfs4_evict_inode()
    
    commit c3aba897c6e67fa464ec02b1f17911577d619713 upstream.
    
    If the inode is being evicted but has to return a layout first, then
    that too can cause a deadlock in the corner case where the server
    reboots.
    
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 8bd5037125b3..0867ce7169c7 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -9067,15 +9067,20 @@ int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync)
 			&task_setup_data.rpc_client, &msg);
 
 	dprintk("--> %s\n", __func__);
+	lrp->inode = nfs_igrab_and_active(lrp->args.inode);
 	if (!sync) {
-		lrp->inode = nfs_igrab_and_active(lrp->args.inode);
 		if (!lrp->inode) {
 			nfs4_layoutreturn_release(lrp);
 			return -EAGAIN;
 		}
 		task_setup_data.flags |= RPC_TASK_ASYNC;
 	}
-	nfs4_init_sequence(&lrp->args.seq_args, &lrp->res.seq_res, 1, 0);
+	if (!lrp->inode)
+		nfs4_init_sequence(&lrp->args.seq_args, &lrp->res.seq_res, 1,
+				   1);
+	else
+		nfs4_init_sequence(&lrp->args.seq_args, &lrp->res.seq_res, 1,
+				   0);
 	task = rpc_run_task(&task_setup_data);
 	if (IS_ERR(task))
 		return PTR_ERR(task);

commit 42c10b0db064e45f5c5ae7019bbf2168ffab766c
Author: Anna Schumaker <Anna.Schumaker@Netapp.com>
Date:   Wed Jun 2 14:31:20 2021 -0400

    NFS: Fix use-after-free in nfs4_init_client()
    
    commit 476bdb04c501fc64bf3b8464ffddefc8dbe01577 upstream.
    
    KASAN reports a use-after-free when attempting to mount two different
    exports through two different NICs that belong to the same server.
    
    Olga was able to hit this with kernels starting somewhere between 5.7
    and 5.10, but I traced the patch that introduced the clear_bit() call to
    4.13. So something must have changed in the refcounting of the clp
    pointer to make this call to nfs_put_client() the very last one.
    
    Fixes: 8dcbec6d20 ("NFSv41: Handle EXCHID4_FLAG_CONFIRMED_R during NFSv4.1 migration")
    Cc: stable@vger.kernel.org # 4.13+
    Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c
index faaabbedc891..b5ce70c4ec87 100644
--- a/fs/nfs/nfs4client.c
+++ b/fs/nfs/nfs4client.c
@@ -431,8 +431,8 @@ struct nfs_client *nfs4_init_client(struct nfs_client *clp,
 		 */
 		nfs_mark_client_ready(clp, -EPERM);
 	}
-	nfs_put_client(clp);
 	clear_bit(NFS_CS_TSM_POSSIBLE, &clp->cl_flags);
+	nfs_put_client(clp);
 	return old;
 
 error:

commit 270dadd7ea31c1bc43a0b1de118a30c2238171a8
Author: Paolo Bonzini <pbonzini@redhat.com>
Date:   Wed Jun 9 01:49:13 2021 -0400

    kvm: fix previous commit for 32-bit builds
    
    commit 4422829e8053068e0225e4d0ef42dc41ea7c9ef5 upstream.
    
    array_index_nospec does not work for uint64_t on 32-bit builds.
    However, the size of a memory slot must be less than 20 bits wide
    on those system, since the memory slot must fit in the user
    address space.  So just store it in an unsigned long.
    
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index eb758bbdb4f6..8dd4ebb58e97 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -1023,8 +1023,8 @@ __gfn_to_hva_memslot(struct kvm_memory_slot *slot, gfn_t gfn)
 	 * table walks, do not let the processor speculate loads outside
 	 * the guest's registered memslots.
 	 */
-	unsigned long offset = array_index_nospec(gfn - slot->base_gfn,
-						  slot->npages);
+	unsigned long offset = gfn - slot->base_gfn;
+	offset = array_index_nospec(offset, slot->npages);
 	return slot->userspace_addr + offset * PAGE_SIZE;
 }
 

commit 8526240f86701eb7e8790c9ebbeb19fed5b86db2
Author: Leo Yan <leo.yan@linaro.org>
Date:   Sat Jun 5 13:29:57 2021 +0800

    perf session: Correct buffer copying when peeking events
    
    [ Upstream commit 197eecb6ecae0b04bd694432f640ff75597fed9c ]
    
    When peeking an event, it has a short path and a long path.  The short
    path uses the session pointer "one_mmap_addr" to directly fetch the
    event; and the long path needs to read out the event header and the
    following event data from file and fill into the buffer pointer passed
    through the argument "buf".
    
    The issue is in the long path that it copies the event header and event
    data into the same destination address which pointer "buf", this means
    the event header is overwritten.  We are just lucky to run into the
    short path in most cases, so we don't hit the issue in the long path.
    
    This patch adds the offset "hdr_sz" to the pointer "buf" when copying
    the event data, so that it can reserve the event header which can be
    used properly by its caller.
    
    Fixes: 5a52f33adf02 ("perf session: Add perf_session__peek_event()")
    Signed-off-by: Leo Yan <leo.yan@linaro.org>
    Acked-by: Adrian Hunter <adrian.hunter@intel.com>
    Acked-by: Jiri Olsa <jolsa@redhat.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Kan Liang <kan.liang@linux.intel.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lore.kernel.org/lkml/20210605052957.1070720-1-leo.yan@linaro.org
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 6a2037b52098..3be1534f1f03 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1478,6 +1478,7 @@ int perf_session__peek_event(struct perf_session *session, off_t file_offset,
 	if (event->header.size < hdr_sz || event->header.size > buf_sz)
 		return -1;
 
+	buf += hdr_sz;
 	rest = event->header.size - hdr_sz;
 
 	if (readn(fd, buf, rest) != (ssize_t)rest)

commit f7d2172db8c91336937ada950c697f1e7ba48e7e
Author: Trond Myklebust <trond.myklebust@hammerspace.com>
Date:   Tue Jun 1 11:10:05 2021 -0400

    NFSv4: Fix deadlock between nfs4_evict_inode() and nfs4_opendata_get_inode()
    
    [ Upstream commit dfe1fe75e00e4c724ede7b9e593f6f680e446c5f ]
    
    If the inode is being evicted, but has to return a delegation first,
    then it can cause a deadlock in the corner case where the server reboots
    before the delegreturn completes, but while the call to iget5_locked() in
    nfs4_opendata_get_inode() is waiting for the inode free to complete.
    Since the open call still holds a session slot, the reboot recovery
    cannot proceed.
    
    In order to break the logjam, we can turn the delegation return into a
    privileged operation for the case where we're evicting the inode. We
    know that in that case, there can be no other state recovery operation
    that conflicts.
    
    Reported-by: zhangxiaoxu (A) <zhangxiaoxu5@huawei.com>
    Fixes: 5fcdfacc01f3 ("NFSv4: Return delegations synchronously in evict_inode")
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
index 5b61520dce88..4dc9bd7ddf07 100644
--- a/fs/nfs/nfs4_fs.h
+++ b/fs/nfs/nfs4_fs.h
@@ -201,6 +201,7 @@ struct nfs4_exception {
 	struct inode *inode;
 	nfs4_stateid *stateid;
 	long timeout;
+	unsigned char task_is_privileged : 1;
 	unsigned char delay : 1,
 		      recovering : 1,
 		      retry : 1;
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index bcad052db065..8bd5037125b3 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -550,6 +550,8 @@ int nfs4_handle_exception(struct nfs_server *server, int errorcode, struct nfs4_
 		goto out_retry;
 	}
 	if (exception->recovering) {
+		if (exception->task_is_privileged)
+			return -EDEADLOCK;
 		ret = nfs4_wait_clnt_recover(clp);
 		if (test_bit(NFS_MIG_FAILED, &server->mig_status))
 			return -EIO;
@@ -575,6 +577,8 @@ nfs4_async_handle_exception(struct rpc_task *task, struct nfs_server *server,
 		goto out_retry;
 	}
 	if (exception->recovering) {
+		if (exception->task_is_privileged)
+			return -EDEADLOCK;
 		rpc_sleep_on(&clp->cl_rpcwaitq, task, NULL);
 		if (test_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) == 0)
 			rpc_wake_up_queued_task(&clp->cl_rpcwaitq, task);
@@ -6017,6 +6021,7 @@ static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
 	struct nfs4_exception exception = {
 		.inode = data->inode,
 		.stateid = &data->stateid,
+		.task_is_privileged = data->args.seq_args.sa_privileged,
 	};
 
 	if (!nfs4_sequence_done(task, &data->res.seq_res))
@@ -6160,7 +6165,6 @@ static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, co
 	data = kzalloc(sizeof(*data), GFP_NOFS);
 	if (data == NULL)
 		return -ENOMEM;
-	nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 1, 0);
 
 	nfs4_state_protect(server->nfs_client,
 			NFS_SP4_MACH_CRED_CLEANUP,
@@ -6190,6 +6194,12 @@ static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, co
 		data->lr.roc = false;
 	}
 
+	if (!data->inode)
+		nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 1,
+				   1);
+	else
+		nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 1,
+				   0);
 	task_setup_data.callback_data = data;
 	msg.rpc_argp = &data->args;
 	msg.rpc_resp = &data->res;

commit 4b380a7d84ef2ce3f4f5bec5d8706ed937ac6502
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Thu Jun 3 15:37:53 2021 +0300

    NFS: Fix a potential NULL dereference in nfs_get_client()
    
    [ Upstream commit 09226e8303beeec10f2ff844d2e46d1371dc58e0 ]
    
    None of the callers are expecting NULL returns from nfs_get_client() so
    this code will lead to an Oops.  It's better to return an error
    pointer.  I expect that this is dead code so hopefully no one is
    affected.
    
    Fixes: 31434f496abb ("nfs: check hostname in nfs_get_client")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/nfs/client.c b/fs/nfs/client.c
index 07c5ddd5d6d5..78b6f8bc9d76 100644
--- a/fs/nfs/client.c
+++ b/fs/nfs/client.c
@@ -407,7 +407,7 @@ struct nfs_client *nfs_get_client(const struct nfs_client_initdata *cl_init)
 
 	if (cl_init->hostname == NULL) {
 		WARN_ON(1);
-		return NULL;
+		return ERR_PTR(-EINVAL);
 	}
 
 	/* see if the client already exists */

commit 1ec2dcd680c71d0d36fa25638b327a468babd5c9
Author: Alaa Hleihel <alaa@nvidia.com>
Date:   Thu Jun 10 10:34:27 2021 +0300

    IB/mlx5: Fix initializing CQ fragments buffer
    
    commit 2ba0aa2feebda680ecfc3c552e867cf4d1b05a3a upstream.
    
    The function init_cq_frag_buf() can be called to initialize the current CQ
    fragments buffer cq->buf, or the temporary cq->resize_buf that is filled
    during CQ resize operation.
    
    However, the offending commit started to use function get_cqe() for
    getting the CQEs, the issue with this change is that get_cqe() always
    returns CQEs from cq->buf, which leads us to initialize the wrong buffer,
    and in case of enlarging the CQ we try to access elements beyond the size
    of the current cq->buf and eventually hit a kernel panic.
    
     [exception RIP: init_cq_frag_buf+103]
      [ffff9f799ddcbcd8] mlx5_ib_resize_cq at ffffffffc0835d60 [mlx5_ib]
      [ffff9f799ddcbdb0] ib_resize_cq at ffffffffc05270df [ib_core]
      [ffff9f799ddcbdc0] llt_rdma_setup_qp at ffffffffc0a6a712 [llt]
      [ffff9f799ddcbe10] llt_rdma_cc_event_action at ffffffffc0a6b411 [llt]
      [ffff9f799ddcbe98] llt_rdma_client_conn_thread at ffffffffc0a6bb75 [llt]
      [ffff9f799ddcbec8] kthread at ffffffffa66c5da1
      [ffff9f799ddcbf50] ret_from_fork_nospec_begin at ffffffffa6d95ddd
    
    Fix it by getting the needed CQE by calling mlx5_frag_buf_get_wqe() that
    takes the correct source buffer as a parameter.
    
    Fixes: 388ca8be0037 ("IB/mlx5: Implement fragmented completion queue (CQ)")
    Link: https://lore.kernel.org/r/90a0e8c924093cfa50a482880ad7e7edb73dc19a.1623309971.git.leonro@nvidia.com
    Signed-off-by: Alaa Hleihel <alaa@nvidia.com>
    Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/infiniband/hw/mlx5/cq.c b/drivers/infiniband/hw/mlx5/cq.c
index 088205d7f1a1..872985e4eebe 100644
--- a/drivers/infiniband/hw/mlx5/cq.c
+++ b/drivers/infiniband/hw/mlx5/cq.c
@@ -896,15 +896,14 @@ static void destroy_cq_user(struct mlx5_ib_cq *cq, struct ib_ucontext *context)
 	ib_umem_release(cq->buf.umem);
 }
 
-static void init_cq_frag_buf(struct mlx5_ib_cq *cq,
-			     struct mlx5_ib_cq_buf *buf)
+static void init_cq_frag_buf(struct mlx5_ib_cq_buf *buf)
 {
 	int i;
 	void *cqe;
 	struct mlx5_cqe64 *cqe64;
 
 	for (i = 0; i < buf->nent; i++) {
-		cqe = get_cqe(cq, i);
+		cqe = mlx5_frag_buf_get_wqe(&buf->fbc, i);
 		cqe64 = buf->cqe_size == 64 ? cqe : cqe + 64;
 		cqe64->op_own = MLX5_CQE_INVALID << 4;
 	}
@@ -930,7 +929,7 @@ static int create_cq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *cq,
 	if (err)
 		goto err_db;
 
-	init_cq_frag_buf(cq, &cq->buf);
+	init_cq_frag_buf(&cq->buf);
 
 	*inlen = MLX5_ST_SZ_BYTES(create_cq_in) +
 		 MLX5_FLD_SZ_BYTES(create_cq_in, pas[0]) *
@@ -1253,7 +1252,7 @@ static int resize_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *cq,
 	if (err)
 		goto ex;
 
-	init_cq_frag_buf(cq, cq->resize_buf);
+	init_cq_frag_buf(cq->resize_buf);
 
 	return 0;
 

commit 4af84445075da26439598984d1a01c1cdadb0e2d
Author: Vincent Guittot <vincent.guittot@linaro.org>
Date:   Thu May 27 14:29:16 2021 +0200

    sched/fair: Make sure to update tg contrib for blocked load
    
    commit 02da26ad5ed6ea8680e5d01f20661439611ed776 upstream.
    
    During the update of fair blocked load (__update_blocked_fair()), we
    update the contribution of the cfs in tg->load_avg if cfs_rq's pelt
    has decayed.  Nevertheless, the pelt values of a cfs_rq could have
    been recently updated while propagating the change of a child. In this
    case, cfs_rq's pelt will not decayed because it has already been
    updated and we don't update tg->load_avg.
    
    __update_blocked_fair
      ...
      for_each_leaf_cfs_rq_safe: child cfs_rq
        update cfs_rq_load_avg() for child cfs_rq
        ...
        update_load_avg(cfs_rq_of(se), se, 0)
          ...
          update cfs_rq_load_avg() for parent cfs_rq
                    -propagation of child's load makes parent cfs_rq->load_sum
                     becoming null
            -UPDATE_TG is not set so it doesn't update parent
                     cfs_rq->tg_load_avg_contrib
      ..
      for_each_leaf_cfs_rq_safe: parent cfs_rq
        update cfs_rq_load_avg() for parent cfs_rq
          - nothing to do because parent cfs_rq has already been updated
                    recently so cfs_rq->tg_load_avg_contrib is not updated
        ...
        parent cfs_rq is decayed
          list_del_leaf_cfs_rq parent cfs_rq
              - but it still contibutes to tg->load_avg
    
    we must set UPDATE_TG flags when propagting pending load to the parent
    
    Fixes: 039ae8bcf7a5 ("sched/fair: Fix O(nr_cgroups) in the load balancing path")
    Reported-by: Odin Ugedal <odin@uged.al>
    Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Odin Ugedal <odin@uged.al>
    Link: https://lkml.kernel.org/r/20210527122916.27683-3-vincent.guittot@linaro.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index f06687053f96..acb34e9df551 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -7512,7 +7512,7 @@ static void update_blocked_averages(int cpu)
 		/* Propagate pending load changes to the parent, if any: */
 		se = cfs_rq->tg->se[cpu];
 		if (se && !skip_blocked_update(se))
-			update_load_avg(cfs_rq_of(se), se, 0);
+			update_load_avg(cfs_rq_of(se), se, UPDATE_TG);
 
 		/*
 		 * There can be a lot of idle CPU cgroups.  Don't let fully

commit db72bdb5c7981e7f1f7ffb46282e784292e7f112
Author: Marco Elver <elver@google.com>
Date:   Thu May 27 12:47:11 2021 +0200

    perf: Fix data race between pin_count increment/decrement
    
    commit 6c605f8371159432ec61cbb1488dcf7ad24ad19a upstream.
    
    KCSAN reports a data race between increment and decrement of pin_count:
    
      write to 0xffff888237c2d4e0 of 4 bytes by task 15740 on cpu 1:
       find_get_context             kernel/events/core.c:4617
       __do_sys_perf_event_open     kernel/events/core.c:12097 [inline]
       __se_sys_perf_event_open     kernel/events/core.c:11933
       ...
      read to 0xffff888237c2d4e0 of 4 bytes by task 15743 on cpu 0:
       perf_unpin_context           kernel/events/core.c:1525 [inline]
       __do_sys_perf_event_open     kernel/events/core.c:12328 [inline]
       __se_sys_perf_event_open     kernel/events/core.c:11933
       ...
    
    Because neither read-modify-write here is atomic, this can lead to one
    of the operations being lost, resulting in an inconsistent pin_count.
    Fix it by adding the missing locking in the CPU-event case.
    
    Fixes: fe4b04fa31a6 ("perf: Cure task_oncpu_function_call() races")
    Reported-by: syzbot+142c9018f5962db69c7e@syzkaller.appspotmail.com
    Signed-off-by: Marco Elver <elver@google.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20210527104711.2671610-1-elver@google.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/events/core.c b/kernel/events/core.c
index 2f3e892ffce3..dd740f91de47 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -4155,7 +4155,9 @@ find_get_context(struct pmu *pmu, struct task_struct *task,
 		cpuctx = per_cpu_ptr(pmu->pmu_cpu_context, cpu);
 		ctx = &cpuctx->ctx;
 		get_ctx(ctx);
+		raw_spin_lock_irqsave(&ctx->lock, flags);
 		++ctx->pin_count;
+		raw_spin_unlock_irqrestore(&ctx->lock, flags);
 
 		return ctx;
 	}

commit a88aad73350a11dbd2db31584edc762d9c3c0395
Author: Nathan Chancellor <nathan@kernel.org>
Date:   Wed May 5 17:14:11 2021 -0700

    vmlinux.lds.h: Avoid orphan section with !SMP
    
    commit d4c6399900364facd84c9e35ce1540b6046c345f upstream.
    
    With x86_64_defconfig and the following configs, there is an orphan
    section warning:
    
    CONFIG_SMP=n
    CONFIG_AMD_MEM_ENCRYPT=y
    CONFIG_HYPERVISOR_GUEST=y
    CONFIG_KVM=y
    CONFIG_PARAVIRT=y
    
    ld: warning: orphan section `.data..decrypted' from `arch/x86/kernel/cpu/vmware.o' being placed in section `.data..decrypted'
    ld: warning: orphan section `.data..decrypted' from `arch/x86/kernel/kvm.o' being placed in section `.data..decrypted'
    
    These sections are created with DEFINE_PER_CPU_DECRYPTED, which
    ultimately turns into __PCPU_ATTRS, which in turn has a section
    attribute with a value of PER_CPU_BASE_SECTION + the section name. When
    CONFIG_SMP is not set, the base section is .data and that is not
    currently handled in any linker script.
    
    Add .data..decrypted to PERCPU_DECRYPTED_SECTION, which is included in
    PERCPU_INPUT -> PERCPU_SECTION, which is include in the x86 linker
    script when either CONFIG_X86_64 or CONFIG_SMP is unset, taking care of
    the warning.
    
    Fixes: ac26963a1175 ("percpu: Introduce DEFINE_PER_CPU_DECRYPTED")
    Link: https://github.com/ClangBuiltLinux/linux/issues/1360
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Tested-by: Nick Desaulniers <ndesaulniers@google.com> # build
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Link: https://lore.kernel.org/r/20210506001410.1026691-1-nathan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index 88484ee023ca..ad8766e1635e 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -842,6 +842,7 @@
 #ifdef CONFIG_AMD_MEM_ENCRYPT
 #define PERCPU_DECRYPTED_SECTION					\
 	. = ALIGN(PAGE_SIZE);						\
+	*(.data..decrypted)						\
 	*(.data..percpu..decrypted)					\
 	. = ALIGN(PAGE_SIZE);
 #else

commit 6fe8d68e4ce966995c56e9d8b887dea43c92acbf
Author: Shay Drory <shayd@nvidia.com>
Date:   Thu Jun 3 16:19:39 2021 +0300

    RDMA/mlx4: Do not map the core_clock page to user space unless enabled
    
    commit 404e5a12691fe797486475fe28cc0b80cb8bef2c upstream.
    
    Currently when mlx4 maps the hca_core_clock page to the user space there
    are read-modifiable registers, one of which is semaphore, on this page as
    well as the clock counter. If user reads the wrong offset, it can modify
    the semaphore and hang the device.
    
    Do not map the hca_core_clock page to the user space unless the device has
    been put in a backwards compatibility mode to support this feature.
    
    After this patch, mlx4 core_clock won't be mapped to user space on the
    majority of existing devices and the uverbs device time feature in
    ibv_query_rt_values_ex() will be disabled.
    
    Fixes: 52033cfb5aab ("IB/mlx4: Add mmap call to map the hardware clock")
    Link: https://lore.kernel.org/r/9632304e0d6790af84b3b706d8c18732bc0d5e27.1622726305.git.leonro@nvidia.com
    Signed-off-by: Shay Drory <shayd@nvidia.com>
    Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c
index eac4ade45611..e64d934f7bac 100644
--- a/drivers/infiniband/hw/mlx4/main.c
+++ b/drivers/infiniband/hw/mlx4/main.c
@@ -577,12 +577,9 @@ static int mlx4_ib_query_device(struct ib_device *ibdev,
 	props->cq_caps.max_cq_moderation_count = MLX4_MAX_CQ_COUNT;
 	props->cq_caps.max_cq_moderation_period = MLX4_MAX_CQ_PERIOD;
 
-	if (!mlx4_is_slave(dev->dev))
-		err = mlx4_get_internal_clock_params(dev->dev, &clock_params);
-
 	if (uhw->outlen >= resp.response_length + sizeof(resp.hca_core_clock_offset)) {
 		resp.response_length += sizeof(resp.hca_core_clock_offset);
-		if (!err && !mlx4_is_slave(dev->dev)) {
+		if (!mlx4_get_internal_clock_params(dev->dev, &clock_params)) {
 			resp.comp_mask |= MLX4_IB_QUERY_DEV_RESP_MASK_CORE_CLOCK_OFFSET;
 			resp.hca_core_clock_offset = clock_params.offset % PAGE_SIZE;
 		}
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c
index 926407f0bbd9..ce57df04ae87 100644
--- a/drivers/net/ethernet/mellanox/mlx4/fw.c
+++ b/drivers/net/ethernet/mellanox/mlx4/fw.c
@@ -822,6 +822,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
 #define QUERY_DEV_CAP_MAD_DEMUX_OFFSET		0xb0
 #define QUERY_DEV_CAP_DMFS_HIGH_RATE_QPN_BASE_OFFSET	0xa8
 #define QUERY_DEV_CAP_DMFS_HIGH_RATE_QPN_RANGE_OFFSET	0xac
+#define QUERY_DEV_CAP_MAP_CLOCK_TO_USER 0xc1
 #define QUERY_DEV_CAP_QP_RATE_LIMIT_NUM_OFFSET	0xcc
 #define QUERY_DEV_CAP_QP_RATE_LIMIT_MAX_OFFSET	0xd0
 #define QUERY_DEV_CAP_QP_RATE_LIMIT_MIN_OFFSET	0xd2
@@ -840,6 +841,8 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
 
 	if (mlx4_is_mfunc(dev))
 		disable_unsupported_roce_caps(outbox);
+	MLX4_GET(field, outbox, QUERY_DEV_CAP_MAP_CLOCK_TO_USER);
+	dev_cap->map_clock_to_user = field & 0x80;
 	MLX4_GET(field, outbox, QUERY_DEV_CAP_RSVD_QP_OFFSET);
 	dev_cap->reserved_qps = 1 << (field & 0xf);
 	MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_QP_OFFSET);
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.h b/drivers/net/ethernet/mellanox/mlx4/fw.h
index 8f020f26ebf5..cf64e54eecb0 100644
--- a/drivers/net/ethernet/mellanox/mlx4/fw.h
+++ b/drivers/net/ethernet/mellanox/mlx4/fw.h
@@ -131,6 +131,7 @@ struct mlx4_dev_cap {
 	u32 health_buffer_addrs;
 	struct mlx4_port_cap port_cap[MLX4_MAX_PORTS + 1];
 	bool wol_port[MLX4_MAX_PORTS + 1];
+	bool map_clock_to_user;
 };
 
 struct mlx4_func_cap {
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
index 8d7bb9a88967..a0affcb090a0 100644
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/main.c
@@ -498,6 +498,7 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
 		}
 	}
 
+	dev->caps.map_clock_to_user  = dev_cap->map_clock_to_user;
 	dev->caps.uar_page_size	     = PAGE_SIZE;
 	dev->caps.num_uars	     = dev_cap->uar_size / PAGE_SIZE;
 	dev->caps.local_ca_ack_delay = dev_cap->local_ca_ack_delay;
@@ -1949,6 +1950,11 @@ int mlx4_get_internal_clock_params(struct mlx4_dev *dev,
 	if (mlx4_is_slave(dev))
 		return -EOPNOTSUPP;
 
+	if (!dev->caps.map_clock_to_user) {
+		mlx4_dbg(dev, "Map clock to user is not supported.\n");
+		return -EOPNOTSUPP;
+	}
+
 	if (!params)
 		return -EINVAL;
 
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h
index dca6ab4eaa99..3ebdd384ae33 100644
--- a/include/linux/mlx4/device.h
+++ b/include/linux/mlx4/device.h
@@ -631,6 +631,7 @@ struct mlx4_caps {
 	bool			wol_port[MLX4_MAX_PORTS + 1];
 	struct mlx4_rate_limit_caps rl_caps;
 	u32			health_buffer_addrs;
+	bool			map_clock_to_user;
 };
 
 struct mlx4_buf_list {

commit 0856f2301d3be6bd828e8091716944b66304f812
Author: Dmitry Osipenko <digetx@gmail.com>
Date:   Mon May 24 01:42:42 2021 +0300

    regulator: max77620: Use device_set_of_node_from_dev()
    
    commit 6f55c5dd1118b3076d11d9cb17f5c5f4bc3a1162 upstream.
    
    The MAX77620 driver fails to re-probe on deferred probe because driver
    core tries to claim resources that are already claimed by the PINCTRL
    device. Use device_set_of_node_from_dev() helper which marks OF node as
    reused, skipping erroneous execution of pinctrl_bind_pins() for the PMIC
    device on the re-probe.
    
    Fixes: aea6cb99703e ("regulator: resolve supply after creating regulator")
    Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
    Link: https://lore.kernel.org/r/20210523224243.13219-2-digetx@gmail.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/regulator/max77620-regulator.c b/drivers/regulator/max77620-regulator.c
index cd93cf53e23c..28baeac3a5a4 100644
--- a/drivers/regulator/max77620-regulator.c
+++ b/drivers/regulator/max77620-regulator.c
@@ -792,6 +792,13 @@ static int max77620_regulator_probe(struct platform_device *pdev)
 	config.dev = dev;
 	config.driver_data = pmic;
 
+	/*
+	 * Set of_node_reuse flag to prevent driver core from attempting to
+	 * claim any pinmux resources already claimed by the parent device.
+	 * Otherwise PMIC driver will fail to re-probe.
+	 */
+	device_set_of_node_from_dev(&pdev->dev, pdev->dev.parent);
+
 	for (id = 0; id < MAX77620_NUM_REGS; id++) {
 		struct regulator_dev *rdev;
 		struct regulator_desc *rdesc;

commit 7f531ff06bb6e24a1fde21670c65b91d652e5972
Author: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Date:   Thu May 20 01:12:23 2021 +0300

    regulator: core: resolve supply for boot-on/always-on regulators
    
    commit 98e48cd9283dbac0e1445ee780889f10b3d1db6a upstream.
    
    For the boot-on/always-on regulators the set_machine_constrainst() is
    called before resolving rdev->supply. Thus the code would try to enable
    rdev before enabling supplying regulator. Enforce resolving supply
    regulator before enabling rdev.
    
    Fixes: aea6cb99703e ("regulator: resolve supply after creating regulator")
    Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
    Link: https://lore.kernel.org/r/20210519221224.2868496-1-dmitry.baryshkov@linaro.org
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 65e1cde13d59..088ed4ee6d83 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -1191,6 +1191,12 @@ static int set_machine_constraints(struct regulator_dev *rdev)
 	 * and we have control then make sure it is enabled.
 	 */
 	if (rdev->constraints->always_on || rdev->constraints->boot_on) {
+		/* If we want to enable this regulator, make sure that we know
+		 * the supplying regulator.
+		 */
+		if (rdev->supply_name && !rdev->supply)
+			return -EPROBE_DEFER;
+
 		if (rdev->supply) {
 			ret = regulator_enable(rdev->supply);
 			if (ret < 0) {

commit 45f9a2fe737dc0a5df270787f2231aee8985cd59
Author: Maciej Żenczykowski <maze@google.com>
Date:   Tue Jun 8 19:44:59 2021 -0700

    usb: fix various gadget panics on 10gbps cabling
    
    commit 032e288097a553db5653af552dd8035cd2a0ba96 upstream.
    
    usb_assign_descriptors() is called with 5 parameters,
    the last 4 of which are the usb_descriptor_header for:
      full-speed (USB1.1 - 12Mbps [including USB1.0 low-speed @ 1.5Mbps),
      high-speed (USB2.0 - 480Mbps),
      super-speed (USB3.0 - 5Gbps),
      super-speed-plus (USB3.1 - 10Gbps).
    
    The differences between full/high/super-speed descriptors are usually
    substantial (due to changes in the maximum usb block size from 64 to 512
    to 1024 bytes and other differences in the specs), while the difference
    between 5 and 10Gbps descriptors may be as little as nothing
    (in many cases the same tuning is simply good enough).
    
    However if a gadget driver calls usb_assign_descriptors() with
    a NULL descriptor for super-speed-plus and is then used on a max 10gbps
    configuration, the kernel will crash with a null pointer dereference,
    when a 10gbps capable device port + cable + host port combination shows up.
    (This wouldn't happen if the gadget max-speed was set to 5gbps, but
    it of course defaults to the maximum, and there's no real reason to
    artificially limit it)
    
    The fix is to simply use the 5gbps descriptor as the 10gbps descriptor,
    if a 10gbps descriptor wasn't provided.
    
    Obviously this won't fix the problem if the 5gbps descriptor is also
    NULL, but such cases can't be so trivially solved (and any such gadgets
    are unlikely to be used with USB3 ports any way).
    
    Cc: Felipe Balbi <balbi@kernel.org>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Maciej Żenczykowski <maze@google.com>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210609024459.1126080-1-zenczykowski@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/gadget/config.c b/drivers/usb/gadget/config.c
index 8bb25773b61e..05507606b2b4 100644
--- a/drivers/usb/gadget/config.c
+++ b/drivers/usb/gadget/config.c
@@ -164,6 +164,14 @@ int usb_assign_descriptors(struct usb_function *f,
 {
 	struct usb_gadget *g = f->config->cdev->gadget;
 
+	/* super-speed-plus descriptor falls back to super-speed one,
+	 * if such a descriptor was provided, thus avoiding a NULL
+	 * pointer dereference if a 5gbps capable gadget is used with
+	 * a 10gbps capable config (device port + cable + host port)
+	 */
+	if (!ssp)
+		ssp = ss;
+
 	if (fs) {
 		f->fs_descriptors = usb_copy_descriptors(fs);
 		if (!f->fs_descriptors)

commit 10770d2ac0094b053c8897d96d7b2737cd72f7c5
Author: Maciej Żenczykowski <maze@google.com>
Date:   Mon Jun 7 21:41:41 2021 -0700

    usb: fix various gadgets null ptr deref on 10gbps cabling.
    
    commit 90c4d05780d47e14a50e11a7f17373104cd47d25 upstream.
    
    This avoids a null pointer dereference in
    f_{ecm,eem,hid,loopback,printer,rndis,serial,sourcesink,subset,tcm}
    by simply reusing the 5gbps config for 10gbps.
    
    Fixes: eaef50c76057 ("usb: gadget: Update usb_assign_descriptors for SuperSpeedPlus")
    Cc: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Cc: Felipe Balbi <balbi@kernel.org>
    Cc: Gustavo A. R. Silva <gustavoars@kernel.org>
    Cc: Lorenzo Colitti <lorenzo@google.com>
    Cc: Martin K. Petersen <martin.petersen@oracle.com>
    Cc: Michael R Sweet <msweet@msweet.org>
    Cc: Mike Christie <michael.christie@oracle.com>
    Cc: Pawel Laszczak <pawell@cadence.com>
    Cc: Peter Chen <peter.chen@nxp.com>
    Cc: Sudhakar Panneerselvam <sudhakar.panneerselvam@oracle.com>
    Cc: Wei Ming Chen <jj251510319013@gmail.com>
    Cc: Will McVicker <willmcvicker@google.com>
    Cc: Zqiang <qiang.zhang@windriver.com>
    Reviewed-By: Lorenzo Colitti <lorenzo@google.com>
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Maciej Żenczykowski <maze@google.com>
    Link: https://lore.kernel.org/r/20210608044141.3898496-1-zenczykowski@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/gadget/function/f_ecm.c b/drivers/usb/gadget/function/f_ecm.c
index 7f5cf488b2b1..ffe2486fce71 100644
--- a/drivers/usb/gadget/function/f_ecm.c
+++ b/drivers/usb/gadget/function/f_ecm.c
@@ -791,7 +791,7 @@ ecm_bind(struct usb_configuration *c, struct usb_function *f)
 		fs_ecm_notify_desc.bEndpointAddress;
 
 	status = usb_assign_descriptors(f, ecm_fs_function, ecm_hs_function,
-			ecm_ss_function, NULL);
+			ecm_ss_function, ecm_ss_function);
 	if (status)
 		goto fail;
 
diff --git a/drivers/usb/gadget/function/f_eem.c b/drivers/usb/gadget/function/f_eem.c
index 0d74e561607d..bdd964ac9fa9 100644
--- a/drivers/usb/gadget/function/f_eem.c
+++ b/drivers/usb/gadget/function/f_eem.c
@@ -305,7 +305,7 @@ static int eem_bind(struct usb_configuration *c, struct usb_function *f)
 	eem_ss_out_desc.bEndpointAddress = eem_fs_out_desc.bEndpointAddress;
 
 	status = usb_assign_descriptors(f, eem_fs_function, eem_hs_function,
-			eem_ss_function, NULL);
+			eem_ss_function, eem_ss_function);
 	if (status)
 		goto fail;
 
diff --git a/drivers/usb/gadget/function/f_hid.c b/drivers/usb/gadget/function/f_hid.c
index 492bb44153b3..bc0a693c3260 100644
--- a/drivers/usb/gadget/function/f_hid.c
+++ b/drivers/usb/gadget/function/f_hid.c
@@ -808,7 +808,8 @@ static int hidg_bind(struct usb_configuration *c, struct usb_function *f)
 		hidg_fs_out_ep_desc.bEndpointAddress;
 
 	status = usb_assign_descriptors(f, hidg_fs_descriptors,
-			hidg_hs_descriptors, hidg_ss_descriptors, NULL);
+			hidg_hs_descriptors, hidg_ss_descriptors,
+			hidg_ss_descriptors);
 	if (status)
 		goto fail;
 
diff --git a/drivers/usb/gadget/function/f_loopback.c b/drivers/usb/gadget/function/f_loopback.c
index 1803646b3678..90215a81c178 100644
--- a/drivers/usb/gadget/function/f_loopback.c
+++ b/drivers/usb/gadget/function/f_loopback.c
@@ -207,7 +207,7 @@ static int loopback_bind(struct usb_configuration *c, struct usb_function *f)
 	ss_loop_sink_desc.bEndpointAddress = fs_loop_sink_desc.bEndpointAddress;
 
 	ret = usb_assign_descriptors(f, fs_loopback_descs, hs_loopback_descs,
-			ss_loopback_descs, NULL);
+			ss_loopback_descs, ss_loopback_descs);
 	if (ret)
 		return ret;
 
diff --git a/drivers/usb/gadget/function/f_printer.c b/drivers/usb/gadget/function/f_printer.c
index 0f47cd398d60..2a1868b2d24c 100644
--- a/drivers/usb/gadget/function/f_printer.c
+++ b/drivers/usb/gadget/function/f_printer.c
@@ -1063,7 +1063,8 @@ static int printer_func_bind(struct usb_configuration *c,
 	ss_ep_out_desc.bEndpointAddress = fs_ep_out_desc.bEndpointAddress;
 
 	ret = usb_assign_descriptors(f, fs_printer_function,
-			hs_printer_function, ss_printer_function, NULL);
+			hs_printer_function, ss_printer_function,
+			ss_printer_function);
 	if (ret)
 		return ret;
 
diff --git a/drivers/usb/gadget/function/f_rndis.c b/drivers/usb/gadget/function/f_rndis.c
index cc1ff5b7b60c..f20c55d42f21 100644
--- a/drivers/usb/gadget/function/f_rndis.c
+++ b/drivers/usb/gadget/function/f_rndis.c
@@ -789,7 +789,7 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f)
 	ss_notify_desc.bEndpointAddress = fs_notify_desc.bEndpointAddress;
 
 	status = usb_assign_descriptors(f, eth_fs_function, eth_hs_function,
-			eth_ss_function, NULL);
+			eth_ss_function, eth_ss_function);
 	if (status)
 		goto fail;
 
diff --git a/drivers/usb/gadget/function/f_serial.c b/drivers/usb/gadget/function/f_serial.c
index c860f30a0ea2..6db973d0c252 100644
--- a/drivers/usb/gadget/function/f_serial.c
+++ b/drivers/usb/gadget/function/f_serial.c
@@ -233,7 +233,7 @@ static int gser_bind(struct usb_configuration *c, struct usb_function *f)
 	gser_ss_out_desc.bEndpointAddress = gser_fs_out_desc.bEndpointAddress;
 
 	status = usb_assign_descriptors(f, gser_fs_function, gser_hs_function,
-			gser_ss_function, NULL);
+			gser_ss_function, gser_ss_function);
 	if (status)
 		goto fail;
 	dev_dbg(&cdev->gadget->dev, "generic ttyGS%d: %s speed IN/%s OUT/%s\n",
diff --git a/drivers/usb/gadget/function/f_sourcesink.c b/drivers/usb/gadget/function/f_sourcesink.c
index ed68a4860b7d..282737e4609c 100644
--- a/drivers/usb/gadget/function/f_sourcesink.c
+++ b/drivers/usb/gadget/function/f_sourcesink.c
@@ -431,7 +431,8 @@ sourcesink_bind(struct usb_configuration *c, struct usb_function *f)
 	ss_iso_sink_desc.bEndpointAddress = fs_iso_sink_desc.bEndpointAddress;
 
 	ret = usb_assign_descriptors(f, fs_source_sink_descs,
-			hs_source_sink_descs, ss_source_sink_descs, NULL);
+			hs_source_sink_descs, ss_source_sink_descs,
+			ss_source_sink_descs);
 	if (ret)
 		return ret;
 
diff --git a/drivers/usb/gadget/function/f_subset.c b/drivers/usb/gadget/function/f_subset.c
index 4d945254905d..51c1cae162d9 100644
--- a/drivers/usb/gadget/function/f_subset.c
+++ b/drivers/usb/gadget/function/f_subset.c
@@ -358,7 +358,7 @@ geth_bind(struct usb_configuration *c, struct usb_function *f)
 		fs_subset_out_desc.bEndpointAddress;
 
 	status = usb_assign_descriptors(f, fs_eth_function, hs_eth_function,
-			ss_eth_function, NULL);
+			ss_eth_function, ss_eth_function);
 	if (status)
 		goto fail;
 
diff --git a/drivers/usb/gadget/function/f_tcm.c b/drivers/usb/gadget/function/f_tcm.c
index 785826ab5348..3c68b3ccb8a8 100644
--- a/drivers/usb/gadget/function/f_tcm.c
+++ b/drivers/usb/gadget/function/f_tcm.c
@@ -2071,7 +2071,8 @@ static int tcm_bind(struct usb_configuration *c, struct usb_function *f)
 	uasp_fs_cmd_desc.bEndpointAddress = uasp_ss_cmd_desc.bEndpointAddress;
 
 	ret = usb_assign_descriptors(f, uasp_fs_function_desc,
-			uasp_hs_function_desc, uasp_ss_function_desc, NULL);
+			uasp_hs_function_desc, uasp_ss_function_desc,
+			uasp_ss_function_desc);
 	if (ret)
 		goto ep_fail;
 

commit e76cb5c8837d213a90899f6aff53e3ab57c442f1
Author: Linyu Yuan <linyyuan@codeaurora.com>
Date:   Wed Jun 9 07:35:47 2021 +0800

    usb: gadget: eem: fix wrong eem header operation
    
    commit 305f670846a31a261462577dd0b967c4fa796871 upstream.
    
    when skb_clone() or skb_copy_expand() fail,
    it should pull skb with lengh indicated by header,
    or not it will read network data and check it as header.
    
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Linyu Yuan <linyyuan@codeaurora.com>
    Link: https://lore.kernel.org/r/20210608233547.3767-1-linyyuan@codeaurora.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/gadget/function/f_eem.c b/drivers/usb/gadget/function/f_eem.c
index c13befa31110..0d74e561607d 100644
--- a/drivers/usb/gadget/function/f_eem.c
+++ b/drivers/usb/gadget/function/f_eem.c
@@ -498,7 +498,7 @@ static int eem_unwrap(struct gether *port,
 			skb2 = skb_clone(skb, GFP_ATOMIC);
 			if (unlikely(!skb2)) {
 				DBG(cdev, "unable to unframe EEM packet\n");
-				continue;
+				goto next;
 			}
 			skb_trim(skb2, len - ETH_FCS_LEN);
 
@@ -508,7 +508,7 @@ static int eem_unwrap(struct gether *port,
 						GFP_ATOMIC);
 			if (unlikely(!skb3)) {
 				dev_kfree_skb_any(skb2);
-				continue;
+				goto next;
 			}
 			dev_kfree_skb_any(skb2);
 			skb_queue_tail(list, skb3);

commit af9950fa7be39a1012a7abfaef2e66af84dc82cc
Author: Stefan Agner <stefan@agner.ch>
Date:   Fri May 28 22:39:31 2021 +0200

    USB: serial: cp210x: fix alternate function for CP2102N QFN20
    
    commit 6f7ec77cc8b64ff5037c1945e4650c65c458037d upstream.
    
    The QFN20 part has a different GPIO/port function assignment. The
    configuration struct bit field ordered as TX/RX/RS485/WAKEUP/CLK
    which exactly matches GPIO0-3 for QFN24/28. However, QFN20 has a
    different GPIO to primary function assignment.
    
    Special case QFN20 to follow to properly detect which GPIOs are
    available.
    
    Signed-off-by: Stefan Agner <stefan@agner.ch>
    Link: https://lore.kernel.org/r/51830b2b24118eb0f77c5c9ac64ffb2f519dbb1d.1622218300.git.stefan@agner.ch
    Fixes: c8acfe0aadbe ("USB: serial: cp210x: implement GPIO support for CP2102N")
    Cc: stable@vger.kernel.org      # 4.19
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
index 7d602e6ccbc0..851f178ff56f 100644
--- a/drivers/usb/serial/cp210x.c
+++ b/drivers/usb/serial/cp210x.c
@@ -485,6 +485,12 @@ struct cp210x_config {
 #define CP210X_2NCONFIG_GPIO_RSTLATCH_IDX	587
 #define CP210X_2NCONFIG_GPIO_CONTROL_IDX	600
 
+/* CP2102N QFN20 port configuration values */
+#define CP2102N_QFN20_GPIO2_TXLED_MODE		BIT(2)
+#define CP2102N_QFN20_GPIO3_RXLED_MODE		BIT(3)
+#define CP2102N_QFN20_GPIO1_RS485_MODE		BIT(4)
+#define CP2102N_QFN20_GPIO0_CLK_MODE		BIT(6)
+
 /* CP210X_VENDOR_SPECIFIC, CP210X_WRITE_LATCH call writes these 0x2 bytes. */
 struct cp210x_gpio_write {
 	u8	mask;
@@ -1630,7 +1636,19 @@ static int cp2102n_gpioconf_init(struct usb_serial *serial)
 	priv->gpio_pushpull = (gpio_pushpull >> 3) & 0x0f;
 
 	/* 0 indicates GPIO mode, 1 is alternate function */
-	priv->gpio_altfunc = (gpio_ctrl >> 2) & 0x0f;
+	if (priv->partnum == CP210X_PARTNUM_CP2102N_QFN20) {
+		/* QFN20 is special... */
+		if (gpio_ctrl & CP2102N_QFN20_GPIO0_CLK_MODE)   /* GPIO 0 */
+			priv->gpio_altfunc |= BIT(0);
+		if (gpio_ctrl & CP2102N_QFN20_GPIO1_RS485_MODE) /* GPIO 1 */
+			priv->gpio_altfunc |= BIT(1);
+		if (gpio_ctrl & CP2102N_QFN20_GPIO2_TXLED_MODE) /* GPIO 2 */
+			priv->gpio_altfunc |= BIT(2);
+		if (gpio_ctrl & CP2102N_QFN20_GPIO3_RXLED_MODE) /* GPIO 3 */
+			priv->gpio_altfunc |= BIT(3);
+	} else {
+		priv->gpio_altfunc = (gpio_ctrl >> 2) & 0x0f;
+	}
 
 	/*
 	 * The CP2102N does not strictly has input and output pin modes,

commit 51aa79432fe8010f2a0e2d224078ec18676515a9
Author: Johan Hovold <johan@kernel.org>
Date:   Mon May 24 11:17:05 2021 +0200

    USB: serial: quatech2: fix control-request directions
    
    commit eb8dbe80326c3d44c1e38ee4f40e0d8d3e06f2d0 upstream.
    
    The direction of the pipe argument must match the request-type direction
    bit or control requests may fail depending on the host-controller-driver
    implementation.
    
    Fix the three requests which erroneously used usb_rcvctrlpipe().
    
    Fixes: f7a33e608d9a ("USB: serial: add quatech2 usb to serial driver")
    Cc: stable@vger.kernel.org      # 3.5
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/quatech2.c b/drivers/usb/serial/quatech2.c
index 9ae57a961027..d212c80c59ac 100644
--- a/drivers/usb/serial/quatech2.c
+++ b/drivers/usb/serial/quatech2.c
@@ -416,7 +416,7 @@ static void qt2_close(struct usb_serial_port *port)
 
 	/* flush the port transmit buffer */
 	i = usb_control_msg(serial->dev,
-			    usb_rcvctrlpipe(serial->dev, 0),
+			    usb_sndctrlpipe(serial->dev, 0),
 			    QT2_FLUSH_DEVICE, 0x40, 1,
 			    port_priv->device_port, NULL, 0, QT2_USB_TIMEOUT);
 
@@ -426,7 +426,7 @@ static void qt2_close(struct usb_serial_port *port)
 
 	/* flush the port receive buffer */
 	i = usb_control_msg(serial->dev,
-			    usb_rcvctrlpipe(serial->dev, 0),
+			    usb_sndctrlpipe(serial->dev, 0),
 			    QT2_FLUSH_DEVICE, 0x40, 0,
 			    port_priv->device_port, NULL, 0, QT2_USB_TIMEOUT);
 
@@ -693,7 +693,7 @@ static int qt2_attach(struct usb_serial *serial)
 	int status;
 
 	/* power on unit */
-	status = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
+	status = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
 				 0xc2, 0x40, 0x8000, 0, NULL, 0,
 				 QT2_USB_TIMEOUT);
 	if (status < 0) {

commit 4c8e13edf0399949436d4b471d5930dffa242382
Author: Alexandre GRIVEAUX <agriveaux@deutnet.info>
Date:   Sun May 23 18:35:21 2021 +0200

    USB: serial: omninet: add device id for Zyxel Omni 56K Plus
    
    commit fc0b3dc9a11771c3919eaaaf9d649138b095aa0f upstream.
    
    Add device id for Zyxel Omni 56K Plus modem, this modem include:
    
    USB chip:
    NetChip
    NET2888
    
    Main chip:
    901041A
    F721501APGF
    
    Another modem using the same chips is the Zyxel Omni 56K DUO/NEO,
    could be added with the right USB ID.
    
    Signed-off-by: Alexandre GRIVEAUX <agriveaux@deutnet.info>
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c
index e51c9464ea42..a9b0849c5ef6 100644
--- a/drivers/usb/serial/omninet.c
+++ b/drivers/usb/serial/omninet.c
@@ -26,6 +26,7 @@
 
 #define ZYXEL_VENDOR_ID		0x0586
 #define ZYXEL_OMNINET_ID	0x1000
+#define ZYXEL_OMNI_56K_PLUS_ID	0x1500
 /* This one seems to be a re-branded ZyXEL device */
 #define BT_IGNITIONPRO_ID	0x2000
 
@@ -40,6 +41,7 @@ static int omninet_port_remove(struct usb_serial_port *port);
 
 static const struct usb_device_id id_table[] = {
 	{ USB_DEVICE(ZYXEL_VENDOR_ID, ZYXEL_OMNINET_ID) },
+	{ USB_DEVICE(ZYXEL_VENDOR_ID, ZYXEL_OMNI_56K_PLUS_ID) },
 	{ USB_DEVICE(ZYXEL_VENDOR_ID, BT_IGNITIONPRO_ID) },
 	{ }						/* Terminating entry */
 };

commit 165f3f9c24a8703189285c267865037a80af400f
Author: George McCollister <george.mccollister@gmail.com>
Date:   Thu Jun 3 19:32:08 2021 -0500

    USB: serial: ftdi_sio: add NovaTech OrionMX product ID
    
    commit bc96c72df33ee81b24d87eab953c73f7bcc04f29 upstream.
    
    Add PID for the NovaTech OrionMX so it can be automatically detected.
    
    Signed-off-by: George McCollister <george.mccollister@gmail.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index 37575d7983c0..8242bf686303 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -601,6 +601,7 @@ static const struct usb_device_id id_table_combined[] = {
 		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
 	{ USB_DEVICE(FTDI_VID, FTDI_NT_ORIONLX_PLUS_PID) },
 	{ USB_DEVICE(FTDI_VID, FTDI_NT_ORION_IO_PID) },
+	{ USB_DEVICE(FTDI_VID, FTDI_NT_ORIONMX_PID) },
 	{ USB_DEVICE(FTDI_VID, FTDI_SYNAPSE_SS200_PID) },
 	{ USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX_PID) },
 	{ USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX2_PID) },
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h
index d854e04a4286..add602bebd82 100644
--- a/drivers/usb/serial/ftdi_sio_ids.h
+++ b/drivers/usb/serial/ftdi_sio_ids.h
@@ -581,6 +581,7 @@
 #define FTDI_NT_ORIONLXM_PID		0x7c90	/* OrionLXm Substation Automation Platform */
 #define FTDI_NT_ORIONLX_PLUS_PID	0x7c91	/* OrionLX+ Substation Automation Platform */
 #define FTDI_NT_ORION_IO_PID		0x7c92	/* Orion I/O */
+#define FTDI_NT_ORIONMX_PID		0x7c93	/* OrionMX */
 
 /*
  * Synapse Wireless product ids (FTDI_VID)

commit 332b827d55f30dd2fdea255db2ba7abb013688d7
Author: Wesley Cheng <wcheng@codeaurora.org>
Date:   Fri May 21 17:44:21 2021 -0700

    usb: gadget: f_fs: Ensure io_completion_wq is idle during unbind
    
    commit 6fc1db5e6211e30fbb1cee8d7925d79d4ed2ae14 upstream.
    
    During unbind, ffs_func_eps_disable() will be executed, resulting in
    completion callbacks for any pending USB requests.  When using AIO,
    irrespective of the completion status, io_data work is queued to
    io_completion_wq to evaluate and handle the completed requests.  Since
    work runs asynchronously to the unbind() routine, there can be a
    scenario where the work runs after the USB gadget has been fully
    removed, resulting in accessing of a resource which has been already
    freed. (i.e. usb_ep_free_request() accessing the USB ep structure)
    
    Explicitly drain the io_completion_wq, instead of relying on the
    destroy_workqueue() (in ffs_data_put()) to make sure no pending
    completion work items are running.
    
    Signed-off-by: Wesley Cheng <wcheng@codeaurora.org>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/1621644261-1236-1-git-send-email-wcheng@codeaurora.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c
index dcb432860d06..f13ec86371e7 100644
--- a/drivers/usb/gadget/function/f_fs.c
+++ b/drivers/usb/gadget/function/f_fs.c
@@ -3469,6 +3469,9 @@ static void ffs_func_unbind(struct usb_configuration *c,
 		ffs->func = NULL;
 	}
 
+	/* Drain any pending AIO completions */
+	drain_workqueue(ffs->io_completion_wq);
+
 	if (!--opts->refcnt)
 		functionfs_unbind(ffs);
 

commit 83ca9ae4e03bb04f2abc1d8d78a1fed9760fd251
Author: Mayank Rana <mrana@codeaurora.org>
Date:   Wed Jun 9 00:35:35 2021 -0700

    usb: typec: ucsi: Clear PPM capability data in ucsi_init() error path
    
    commit f247f0a82a4f8c3bfed178d8fd9e069d1424ee4e upstream.
    
    If ucsi_init() fails for some reason (e.g. ucsi_register_port()
    fails or general communication failure to the PPM), particularly at
    any point after the GET_CAPABILITY command had been issued, this
    results in unwinding the initialization and returning an error.
    However the ucsi structure's ucsi_capability member retains its
    current value, including likely a non-zero num_connectors.
    And because ucsi_init() itself is done in a workqueue a UCSI
    interface driver will be unaware that it failed and may think the
    ucsi_register() call was completely successful.  Later, if
    ucsi_unregister() is called, due to this stale ucsi->cap value it
    would try to access the items in the ucsi->connector array which
    might not be in a proper state or not even allocated at all and
    results in NULL or invalid pointer dereference.
    
    Fix this by clearing the ucsi->cap value to 0 during the error
    path of ucsi_init() in order to prevent a later ucsi_unregister()
    from entering the connector cleanup loop.
    
    Fixes: c1b0bc2dabfa ("usb: typec: Add support for UCSI interface")
    Cc: stable@vger.kernel.org
    Acked-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
    Signed-off-by: Mayank Rana <mrana@codeaurora.org>
    Signed-off-by: Jack Pham <jackp@codeaurora.org>
    Link: https://lore.kernel.org/r/20210609073535.5094-1-jackp@codeaurora.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
index 8d0a6fe748bd..b7a8aad35c89 100644
--- a/drivers/usb/typec/ucsi/ucsi.c
+++ b/drivers/usb/typec/ucsi/ucsi.c
@@ -735,6 +735,7 @@ static void ucsi_init(struct work_struct *work)
 	}
 
 err_reset:
+	memset(&ucsi->cap, 0, sizeof(ucsi->cap));
 	ucsi_reset_ppm(ucsi);
 err:
 	mutex_unlock(&ucsi->ppm_lock);

commit bd551e7c85939de2182010273450bfa78c3742fc
Author: Marian-Cristian Rotariu <marian.c.rotariu@gmail.com>
Date:   Tue Jun 8 19:26:50 2021 +0300

    usb: dwc3: ep0: fix NULL pointer exception
    
    commit d00889080ab60051627dab1d85831cd9db750e2a upstream.
    
    There is no validation of the index from dwc3_wIndex_to_dep() and we might
    be referring a non-existing ep and trigger a NULL pointer exception. In
    certain configurations we might use fewer eps and the index might wrongly
    indicate a larger ep index than existing.
    
    By adding this validation from the patch we can actually report a wrong
    index back to the caller.
    
    In our usecase we are using a composite device on an older kernel, but
    upstream might use this fix also. Unfortunately, I cannot describe the
    hardware for others to reproduce the issue as it is a proprietary
    implementation.
    
    [   82.958261] Unable to handle kernel NULL pointer dereference at virtual address 00000000000000a4
    [   82.966891] Mem abort info:
    [   82.969663]   ESR = 0x96000006
    [   82.972703]   Exception class = DABT (current EL), IL = 32 bits
    [   82.978603]   SET = 0, FnV = 0
    [   82.981642]   EA = 0, S1PTW = 0
    [   82.984765] Data abort info:
    [   82.987631]   ISV = 0, ISS = 0x00000006
    [   82.991449]   CM = 0, WnR = 0
    [   82.994409] user pgtable: 4k pages, 39-bit VAs, pgdp = 00000000c6210ccc
    [   83.000999] [00000000000000a4] pgd=0000000053aa5003, pud=0000000053aa5003, pmd=0000000000000000
    [   83.009685] Internal error: Oops: 96000006 [#1] PREEMPT SMP
    [   83.026433] Process irq/62-dwc3 (pid: 303, stack limit = 0x000000003985154c)
    [   83.033470] CPU: 0 PID: 303 Comm: irq/62-dwc3 Not tainted 4.19.124 #1
    [   83.044836] pstate: 60000085 (nZCv daIf -PAN -UAO)
    [   83.049628] pc : dwc3_ep0_handle_feature+0x414/0x43c
    [   83.054558] lr : dwc3_ep0_interrupt+0x3b4/0xc94
    
    ...
    
    [   83.141788] Call trace:
    [   83.144227]  dwc3_ep0_handle_feature+0x414/0x43c
    [   83.148823]  dwc3_ep0_interrupt+0x3b4/0xc94
    [   83.181546] ---[ end trace aac6b5267d84c32f ]---
    
    Signed-off-by: Marian-Cristian Rotariu <marian.c.rotariu@gmail.com>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210608162650.58426-1-marian.c.rotariu@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c
index 0d95ca804c1e..f0e492e25f48 100644
--- a/drivers/usb/dwc3/ep0.c
+++ b/drivers/usb/dwc3/ep0.c
@@ -292,6 +292,9 @@ static struct dwc3_ep *dwc3_wIndex_to_dep(struct dwc3 *dwc, __le16 wIndex_le)
 		epnum |= 1;
 
 	dep = dwc->eps[epnum];
+	if (dep == NULL)
+		return NULL;
+
 	if (dep->flags & DWC3_EP_ENABLED)
 		return dep;
 

commit 17cd51099d8342873433f0f9d307d4384c020ff6
Author: Kyle Tso <kyletso@google.com>
Date:   Fri May 28 16:16:13 2021 +0800

    usb: pd: Set PD_T_SINK_WAIT_CAP to 310ms
    
    commit 6490fa565534fa83593278267785a694fd378a2b upstream.
    
    Current timer PD_T_SINK_WAIT_CAP is set to 240ms which will violate the
    SinkWaitCapTimer (tTypeCSinkWaitCap 310 - 620 ms) defined in the PD
    Spec if the port is faster enough when running the state machine. Set it
    to the lower bound 310ms to ensure the timeout is in Spec.
    
    Fixes: f0690a25a140 ("staging: typec: USB Type-C Port Manager (tcpm)")
    Cc: stable <stable@vger.kernel.org>
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Kyle Tso <kyletso@google.com>
    Link: https://lore.kernel.org/r/20210528081613.730661-1-kyletso@google.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/usb/pd.h b/include/linux/usb/pd.h
index bdf4c88d2aa0..c16574d4bd85 100644
--- a/include/linux/usb/pd.h
+++ b/include/linux/usb/pd.h
@@ -434,7 +434,7 @@ static inline unsigned int rdo_max_power(u32 rdo)
 #define PD_T_SENDER_RESPONSE	60	/* 24 - 30 ms, relaxed */
 #define PD_T_SOURCE_ACTIVITY	45
 #define PD_T_SINK_ACTIVITY	135
-#define PD_T_SINK_WAIT_CAP	240
+#define PD_T_SINK_WAIT_CAP	310	/* 310 - 620 ms */
 #define PD_T_PS_TRANSITION	500
 #define PD_T_SRC_TRANSITION	35
 #define PD_T_DRP_SNK		40

commit 4da95bcefbf9dae9b45fe68fa5a3034af15f6850
Author: Maciej Żenczykowski <maze@google.com>
Date:   Tue Jun 8 01:54:38 2021 -0700

    usb: f_ncm: only first packet of aggregate needs to start timer
    
    commit 1958ff5ad2d4908b44a72bcf564dfe67c981e7fe upstream.
    
    The reasoning for this change is that if we already had
    a packet pending, then we also already had a pending timer,
    and as such there is no need to reschedule it.
    
    This also prevents packets getting delayed 60 ms worst case
    under a tiny packet every 290us transmit load, by keeping the
    timeout always relative to the first queued up packet.
    (300us delay * 16KB max aggregation / 80 byte packet =~ 60 ms)
    
    As such the first packet is now at most delayed by 300us.
    
    Under low transmit load, this will simply result in us sending
    a shorter aggregate, as originally intended.
    
    This patch has the benefit of greatly reducing (by ~10 factor
    with 1500 byte frames aggregated into 16 kiB) the number of
    (potentially pretty costly) updates to the hrtimer.
    
    Cc: Brooke Basile <brookebasile@gmail.com>
    Cc: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
    Cc: Felipe Balbi <balbi@kernel.org>
    Cc: Lorenzo Colitti <lorenzo@google.com>
    Signed-off-by: Maciej Żenczykowski <maze@google.com>
    Link: https://lore.kernel.org/r/20210608085438.813960-1-zenczykowski@gmail.com
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/gadget/function/f_ncm.c b/drivers/usb/gadget/function/f_ncm.c
index 4060aa82b240..10b4612df8a7 100644
--- a/drivers/usb/gadget/function/f_ncm.c
+++ b/drivers/usb/gadget/function/f_ncm.c
@@ -1104,11 +1104,11 @@ static struct sk_buff *ncm_wrap_ntb(struct gether *port,
 			ncm->ndp_dgram_count = 1;
 
 			/* Note: we skip opts->next_ndp_index */
-		}
 
-		/* Delay the timer. */
-		hrtimer_start(&ncm->task_timer, TX_TIMEOUT_NSECS,
-			      HRTIMER_MODE_REL_SOFT);
+			/* Start the timer. */
+			hrtimer_start(&ncm->task_timer, TX_TIMEOUT_NSECS,
+				      HRTIMER_MODE_REL_SOFT);
+		}
 
 		/* Add the datagram position entries */
 		ntb_ndp = skb_put_zero(ncm->skb_tx_ndp, dgram_idx_len);

commit 24b2a63239714bc22ebce2d7f82d9f8b4a52e716
Author: Maciej Żenczykowski <maze@google.com>
Date:   Mon Jun 7 17:53:44 2021 -0700

    USB: f_ncm: ncm_bitrate (speed) is unsigned
    
    commit 3370139745853f7826895293e8ac3aec1430508e upstream.
    
    [  190.544755] configfs-gadget gadget: notify speed -44967296
    
    This is because 4250000000 - 2**32 is -44967296.
    
    Fixes: 9f6ce4240a2b ("usb: gadget: f_ncm.c added")
    Cc: Brooke Basile <brookebasile@gmail.com>
    Cc: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
    Cc: Felipe Balbi <balbi@kernel.org>
    Cc: Lorenzo Colitti <lorenzo@google.com>
    Cc: Yauheni Kaliuta <yauheni.kaliuta@nokia.com>
    Cc: Linux USB Mailing List <linux-usb@vger.kernel.org>
    Acked-By: Lorenzo Colitti <lorenzo@google.com>
    Signed-off-by: Maciej Żenczykowski <maze@google.com>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210608005344.3762668-1-zenczykowski@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/gadget/function/f_ncm.c b/drivers/usb/gadget/function/f_ncm.c
index e4aa370e86a9..4060aa82b240 100644
--- a/drivers/usb/gadget/function/f_ncm.c
+++ b/drivers/usb/gadget/function/f_ncm.c
@@ -583,7 +583,7 @@ static void ncm_do_notify(struct f_ncm *ncm)
 		data[0] = cpu_to_le32(ncm_bitrate(cdev->gadget));
 		data[1] = data[0];
 
-		DBG(cdev, "notify speed %d\n", ncm_bitrate(cdev->gadget));
+		DBG(cdev, "notify speed %u\n", ncm_bitrate(cdev->gadget));
 		ncm->notify_state = NCM_NOTIFY_CONNECT;
 		break;
 	}

commit 7e7ff4d058341ce8d1ab647585a73b38d3b493cf
Author: Alexander Kuznetsov <wwfq@yandex-team.ru>
Date:   Wed Jun 9 10:17:19 2021 +0300

    cgroup1: don't allow '\n' in renaming
    
    commit b7e24eb1caa5f8da20d405d262dba67943aedc42 upstream.
    
    cgroup_mkdir() have restriction on newline usage in names:
    $ mkdir $'/sys/fs/cgroup/cpu/test\ntest2'
    mkdir: cannot create directory
    '/sys/fs/cgroup/cpu/test\ntest2': Invalid argument
    
    But in cgroup1_rename() such check is missed.
    This allows us to make /proc/<pid>/cgroup unparsable:
    $ mkdir /sys/fs/cgroup/cpu/test
    $ mv /sys/fs/cgroup/cpu/test $'/sys/fs/cgroup/cpu/test\ntest2'
    $ echo $$ > $'/sys/fs/cgroup/cpu/test\ntest2'
    $ cat /proc/self/cgroup
    11:pids:/
    10:freezer:/
    9:hugetlb:/
    8:cpuset:/
    7:blkio:/user.slice
    6:memory:/user.slice
    5:net_cls,net_prio:/
    4:perf_event:/
    3:devices:/user.slice
    2:cpu,cpuacct:/test
    test2
    1:name=systemd:/
    0::/
    
    Signed-off-by: Alexander Kuznetsov <wwfq@yandex-team.ru>
    Reported-by: Andrey Krasichkov <buglloc@yandex-team.ru>
    Acked-by: Dmitry Yakunin <zeil@yandex-team.ru>
    Cc: stable@vger.kernel.org
    Signed-off-by: Tejun Heo <tj@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/cgroup/cgroup-v1.c b/kernel/cgroup/cgroup-v1.c
index dd8bdbfbbde1..5456611874eb 100644
--- a/kernel/cgroup/cgroup-v1.c
+++ b/kernel/cgroup/cgroup-v1.c
@@ -849,6 +849,10 @@ static int cgroup1_rename(struct kernfs_node *kn, struct kernfs_node *new_parent
 	struct cgroup *cgrp = kn->priv;
 	int ret;
 
+	/* do not accept '\n' to prevent making /proc/<pid>/cgroup unparsable */
+	if (strchr(new_name_str, '\n'))
+		return -EINVAL;
+
 	if (kernfs_type(kn) != KERNFS_DIR)
 		return -ENOTDIR;
 	if (kn->parent != new_parent)

commit 9995f42ea12182c48e8f71ae153e7fe5003193ff
Author: Ritesh Harjani <riteshh@linux.ibm.com>
Date:   Sun May 30 20:24:05 2021 +0530

    btrfs: return value from btrfs_mark_extent_written() in case of error
    
    commit e7b2ec3d3d4ebeb4cff7ae45cf430182fa6a49fb upstream.
    
    We always return 0 even in case of an error in btrfs_mark_extent_written().
    Fix it to return proper error value in case of a failure. All callers
    handle it.
    
    CC: stable@vger.kernel.org # 4.4+
    Signed-off-by: Ritesh Harjani <riteshh@linux.ibm.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index a202f2f12b1c..41ad37f8062a 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -1154,7 +1154,7 @@ int btrfs_mark_extent_written(struct btrfs_trans_handle *trans,
 	int del_nr = 0;
 	int del_slot = 0;
 	int recow;
-	int ret;
+	int ret = 0;
 	u64 ino = btrfs_ino(inode);
 
 	path = btrfs_alloc_path();
@@ -1374,7 +1374,7 @@ int btrfs_mark_extent_written(struct btrfs_trans_handle *trans,
 	}
 out:
 	btrfs_free_path(path);
-	return 0;
+	return ret;
 }
 
 /*

commit 379a3e30eff2dd082d9880f056ba1ec6980ae0e1
Author: Wenli Looi <wlooi@ucalgary.ca>
Date:   Mon Jun 7 23:46:20 2021 -0700

    staging: rtl8723bs: Fix uninitialized variables
    
    commit 43c85d770db80cb135f576f8fde6ff1a08e707a4 upstream.
    
    The sinfo.pertid and sinfo.generation variables are not initialized and
    it causes a crash when we use this as a wireless access point.
    
    [  456.873025] ------------[ cut here ]------------
    [  456.878198] kernel BUG at mm/slub.c:3968!
    [  456.882680] Internal error: Oops - BUG: 0 [#1] PREEMPT SMP ARM
    
      [ snip ]
    
    [  457.271004] Backtrace:
    [  457.273733] [<c02b7ee4>] (kfree) from [<c0e2a470>] (nl80211_send_station+0x954/0xfc4)
    [  457.282481]  r9:eccca0c0 r8:e8edfec0 r7:00000000 r6:00000011 r5:e80a9480 r4:e8edfe00
    [  457.291132] [<c0e29b1c>] (nl80211_send_station) from [<c0e2b18c>] (cfg80211_new_sta+0x90/0x1cc)
    [  457.300850]  r10:e80a9480 r9:e8edfe00 r8:ea678cca r7:00000a20 r6:00000000 r5:ec46d000
    [  457.309586]  r4:ec46d9e0
    [  457.312433] [<c0e2b0fc>] (cfg80211_new_sta) from [<bf086684>] (rtw_cfg80211_indicate_sta_assoc+0x80/0x9c [r8723bs])
    [  457.324095]  r10:00009930 r9:e85b9d80 r8:bf091050 r7:00000000 r6:00000000 r5:0000001c
    [  457.332831]  r4:c1606788
    [  457.335692] [<bf086604>] (rtw_cfg80211_indicate_sta_assoc [r8723bs]) from [<bf03df38>] (rtw_stassoc_event_callback+0x1c8/0x1d4 [r8723bs])
    [  457.349489]  r7:ea678cc0 r6:000000a1 r5:f1225f84 r4:f086b000
    [  457.355845] [<bf03dd70>] (rtw_stassoc_event_callback [r8723bs]) from [<bf048e4c>] (mlme_evt_hdl+0x8c/0xb4 [r8723bs])
    [  457.367601]  r7:c1604900 r6:f086c4b8 r5:00000000 r4:f086c000
    [  457.373959] [<bf048dc0>] (mlme_evt_hdl [r8723bs]) from [<bf03693c>] (rtw_cmd_thread+0x198/0x3d8 [r8723bs])
    [  457.384744]  r5:f086e000 r4:f086c000
    [  457.388754] [<bf0367a4>] (rtw_cmd_thread [r8723bs]) from [<c014a214>] (kthread+0x170/0x174)
    [  457.398083]  r10:ed7a57e8 r9:bf0367a4 r8:f086b000 r7:e8ede000 r6:00000000 r5:e9975200
    [  457.406828]  r4:e8369900
    [  457.409653] [<c014a0a4>] (kthread) from [<c01010e8>] (ret_from_fork+0x14/0x2c)
    [  457.417718] Exception stack(0xe8edffb0 to 0xe8edfff8)
    [  457.423356] ffa0:                                     00000000 00000000 00000000 00000000
    [  457.432492] ffc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    [  457.441618] ffe0: 00000000 00000000 00000000 00000000 00000013 00000000
    [  457.449006]  r10:00000000 r9:00000000 r8:00000000 r7:00000000 r6:00000000 r5:c014a0a4
    [  457.457750]  r4:e9975200
    [  457.460574] Code: 1a000003 e5953004 e3130001 1a000000 (e7f001f2)
    [  457.467381] ---[ end trace 4acbc8c15e9e6aa7 ]---
    
    Link: https://forum.armbian.com/topic/14727-wifi-ap-kernel-bug-in-kernel-5444/
    Fixes: 8689c051a201 ("cfg80211: dynamically allocate per-tid stats for station info")
    Fixes: f5ea9120be2e ("nl80211: add generation number to all dumps")
    Signed-off-by: Wenli Looi <wlooi@ucalgary.ca>
    Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210608064620.74059-1-wlooi@ucalgary.ca
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/staging/rtl8723bs/os_dep/ioctl_cfg80211.c b/drivers/staging/rtl8723bs/os_dep/ioctl_cfg80211.c
index db553f2e4c0b..da2e6fde938e 100644
--- a/drivers/staging/rtl8723bs/os_dep/ioctl_cfg80211.c
+++ b/drivers/staging/rtl8723bs/os_dep/ioctl_cfg80211.c
@@ -2416,7 +2416,7 @@ void rtw_cfg80211_indicate_sta_assoc(struct adapter *padapter, u8 *pmgmt_frame,
 	DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
 
 	{
-		struct station_info sinfo;
+		struct station_info sinfo = {};
 		u8 ie_offset;
 		if (GetFrameSubType(pmgmt_frame) == WIFI_ASSOCREQ)
 			ie_offset = _ASOCREQ_IE_OFFSET_;

commit 22b87fb17a28d37331bb9c1110737627b17f6781
Author: Paolo Bonzini <pbonzini@redhat.com>
Date:   Tue Jun 8 15:31:42 2021 -0400

    kvm: avoid speculation-based attacks from out-of-range memslot accesses
    
    commit da27a83fd6cc7780fea190e1f5c19e87019da65c upstream.
    
    KVM's mechanism for accessing guest memory translates a guest physical
    address (gpa) to a host virtual address using the right-shifted gpa
    (also known as gfn) and a struct kvm_memory_slot.  The translation is
    performed in __gfn_to_hva_memslot using the following formula:
    
          hva = slot->userspace_addr + (gfn - slot->base_gfn) * PAGE_SIZE
    
    It is expected that gfn falls within the boundaries of the guest's
    physical memory.  However, a guest can access invalid physical addresses
    in such a way that the gfn is invalid.
    
    __gfn_to_hva_memslot is called from kvm_vcpu_gfn_to_hva_prot, which first
    retrieves a memslot through __gfn_to_memslot.  While __gfn_to_memslot
    does check that the gfn falls within the boundaries of the guest's
    physical memory or not, a CPU can speculate the result of the check and
    continue execution speculatively using an illegal gfn. The speculation
    can result in calculating an out-of-bounds hva.  If the resulting host
    virtual address is used to load another guest physical address, this
    is effectively a Spectre gadget consisting of two consecutive reads,
    the second of which is data dependent on the first.
    
    Right now it's not clear if there are any cases in which this is
    exploitable.  One interesting case was reported by the original author
    of this patch, and involves visiting guest page tables on x86.  Right
    now these are not vulnerable because the hva read goes through get_user(),
    which contains an LFENCE speculation barrier.  However, there are
    patches in progress for x86 uaccess.h to mask kernel addresses instead of
    using LFENCE; once these land, a guest could use speculation to read
    from the VMM's ring 3 address space.  Other architectures such as ARM
    already use the address masking method, and would be susceptible to
    this same kind of data-dependent access gadgets.  Therefore, this patch
    proactively protects from these attacks by masking out-of-bounds gfns
    in __gfn_to_hva_memslot, which blocks speculation of invalid hvas.
    
    Sean Christopherson noted that this patch does not cover
    kvm_read_guest_offset_cached.  This however is limited to a few bytes
    past the end of the cache, and therefore it is unlikely to be useful in
    the context of building a chain of data dependent accesses.
    
    Reported-by: Artemiy Margaritov <artemiy.margaritov@gmail.com>
    Co-developed-by: Artemiy Margaritov <artemiy.margaritov@gmail.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index a0de4c7dc9d3..eb758bbdb4f6 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -1017,7 +1017,15 @@ __gfn_to_memslot(struct kvm_memslots *slots, gfn_t gfn)
 static inline unsigned long
 __gfn_to_hva_memslot(struct kvm_memory_slot *slot, gfn_t gfn)
 {
-	return slot->userspace_addr + (gfn - slot->base_gfn) * PAGE_SIZE;
+	/*
+	 * The index was checked originally in search_memslots.  To avoid
+	 * that a malicious guest builds a Spectre gadget out of e.g. page
+	 * table walks, do not let the processor speculate loads outside
+	 * the guest's registered memslots.
+	 */
+	unsigned long offset = array_index_nospec(gfn - slot->base_gfn,
+						  slot->npages);
+	return slot->userspace_addr + offset * PAGE_SIZE;
 }
 
 static inline int memslot_id(struct kvm *kvm, gfn_t gfn)

commit a376f7e66b654cb290fa9d16d8dab5bfef744463
Author: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
Date:   Wed Jun 9 17:21:19 2021 +0800

    drm: Lock pointer access in drm_master_release()
    
    commit c336a5ee984708db4826ef9e47d184e638e29717 upstream.
    
    This patch eliminates the following smatch warning:
    drivers/gpu/drm/drm_auth.c:320 drm_master_release() warn: unlocked access 'master' (line 318) expected lock '&dev->master_mutex'
    
    The 'file_priv->master' field should be protected by the mutex lock to
    '&dev->master_mutex'. This is because other processes can concurrently
    modify this field and free the current 'file_priv->master'
    pointer. This could result in a use-after-free error when 'master' is
    dereferenced in subsequent function calls to
    'drm_legacy_lock_master_cleanup()' or to 'drm_lease_revoke()'.
    
    An example of a scenario that would produce this error can be seen
    from a similar bug in 'drm_getunique()' that was reported by Syzbot:
    https://syzkaller.appspot.com/bug?id=148d2f1dfac64af52ffd27b661981a540724f803
    
    In the Syzbot report, another process concurrently acquired the
    device's master mutex in 'drm_setmaster_ioctl()', then overwrote
    'fpriv->master' in 'drm_new_set_master()'. The old value of
    'fpriv->master' was subsequently freed before the mutex was unlocked.
    
    Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
    Link: https://patchwork.freedesktop.org/patch/msgid/20210609092119.173590-1-desmondcheongzx@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/drm_auth.c b/drivers/gpu/drm/drm_auth.c
index 1669c42c40ed..ce098eb57de5 100644
--- a/drivers/gpu/drm/drm_auth.c
+++ b/drivers/gpu/drm/drm_auth.c
@@ -265,9 +265,10 @@ int drm_master_open(struct drm_file *file_priv)
 void drm_master_release(struct drm_file *file_priv)
 {
 	struct drm_device *dev = file_priv->minor->dev;
-	struct drm_master *master = file_priv->master;
+	struct drm_master *master;
 
 	mutex_lock(&dev->master_mutex);
+	master = file_priv->master;
 	if (file_priv->magic)
 		idr_remove(&file_priv->master->magic_map, file_priv->magic);
 

commit 7d233ba700ceb593905ea82b42dadb4ec8ef85e9
Author: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
Date:   Tue Jun 8 19:04:36 2021 +0800

    drm: Fix use-after-free read in drm_getunique()
    
    commit b436acd1cf7fac0ba987abd22955d98025c80c2b upstream.
    
    There is a time-of-check-to-time-of-use error in drm_getunique() due
    to retrieving file_priv->master prior to locking the device's master
    mutex.
    
    An example can be seen in the crash report of the use-after-free error
    found by Syzbot:
    https://syzkaller.appspot.com/bug?id=148d2f1dfac64af52ffd27b661981a540724f803
    
    In the report, the master pointer was used after being freed. This is
    because another process had acquired the device's master mutex in
    drm_setmaster_ioctl(), then overwrote fpriv->master in
    drm_new_set_master(). The old value of fpriv->master was subsequently
    freed before the mutex was unlocked.
    
    To fix this, we lock the device's master mutex before retrieving the
    pointer from from fpriv->master. This patch passes the Syzbot
    reproducer test.
    
    Reported-by: syzbot+c3a706cec1ea99e1c693@syzkaller.appspotmail.com
    Signed-off-by: Desmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
    Link: https://patchwork.freedesktop.org/patch/msgid/20210608110436.239583-1-desmondcheongzx@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
index b92682f037b2..2449b357f524 100644
--- a/drivers/gpu/drm/drm_ioctl.c
+++ b/drivers/gpu/drm/drm_ioctl.c
@@ -112,17 +112,18 @@ int drm_getunique(struct drm_device *dev, void *data,
 		  struct drm_file *file_priv)
 {
 	struct drm_unique *u = data;
-	struct drm_master *master = file_priv->master;
+	struct drm_master *master;
 
-	mutex_lock(&master->dev->master_mutex);
+	mutex_lock(&dev->master_mutex);
+	master = file_priv->master;
 	if (u->unique_len >= master->unique_len) {
 		if (copy_to_user(u->unique, master->unique, master->unique_len)) {
-			mutex_unlock(&master->dev->master_mutex);
+			mutex_unlock(&dev->master_mutex);
 			return -EFAULT;
 		}
 	}
 	u->unique_len = master->unique_len;
-	mutex_unlock(&master->dev->master_mutex);
+	mutex_unlock(&dev->master_mutex);
 
 	return 0;
 }

commit 430754aebd981251d6b7eabce1e0d331722ff004
Author: Marek Vasut <marex@denx.de>
Date:   Mon Apr 26 12:23:21 2021 +0200

    ARM: dts: imx6q-dhcom: Add PU,VDD1P1,VDD2P5 regulators
    
    commit 8967b27a6c1c19251989c7ab33c058d16e4a5f53 upstream.
    
    Per schematic, both PU and SOC regulator are supplied from LTC3676 SW1
    via VDDSOC_IN rail, add the PU input. Both VDD1P1, VDD2P5 are supplied
    from LTC3676 SW2 via VDDHIGH_IN rail, add both inputs.
    
    While no instability or problems are currently observed, the regulators
    should be fully described in DT and that description should fully match
    the hardware, else this might lead to unforseen issues later. Fix this.
    
    Fixes: 52c7a088badd ("ARM: dts: imx6q: Add support for the DHCOM iMX6 SoM and PDK2")
    Reviewed-by: Fabio Estevam <festevam@gmail.com>
    Signed-off-by: Marek Vasut <marex@denx.de>
    Cc: Christoph Niedermaier <cniedermaier@dh-electronics.com>
    Cc: Fabio Estevam <festevam@gmail.com>
    Cc: Ludwig Zenz <lzenz@dh-electronics.com>
    Cc: NXP Linux Team <linux-imx@nxp.com>
    Cc: Shawn Guo <shawnguo@kernel.org>
    Cc: stable@vger.kernel.org
    Reviewed-by: Christoph Niedermaier <cniedermaier@dh-electronics.com>
    Signed-off-by: Shawn Guo <shawnguo@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/boot/dts/imx6q-dhcom-som.dtsi b/arch/arm/boot/dts/imx6q-dhcom-som.dtsi
index 5b4d78999f80..8d4a4cd01e07 100644
--- a/arch/arm/boot/dts/imx6q-dhcom-som.dtsi
+++ b/arch/arm/boot/dts/imx6q-dhcom-som.dtsi
@@ -407,6 +407,18 @@
 	vin-supply = <&sw1_reg>;
 };
 
+&reg_pu {
+	vin-supply = <&sw1_reg>;
+};
+
+&reg_vdd1p1 {
+	vin-supply = <&sw2_reg>;
+};
+
+&reg_vdd2p5 {
+	vin-supply = <&sw2_reg>;
+};
+
 &uart1 {
 	pinctrl-names = "default";
 	pinctrl-0 = <&pinctrl_uart1>;

commit 81361b8ec1e639e0d99a7d8539f63968c990c5d5
Author: Anson Huang <anson.huang@nxp.com>
Date:   Sun May 12 09:57:20 2019 +0000

    ARM: dts: imx6qdl-sabresd: Assign corresponding power supply for LDOs
    
    commit 93385546ba369182220436f60ceb3beabe4b7de1 upstream.
    
    On i.MX6Q/DL SabreSD board, vgen5 supplies vdd1p1/vdd2p5 LDO and
    sw2 supplies vdd3p0 LDO, this patch assigns corresponding power
    supply for vdd1p1/vdd2p5/vdd3p0 to avoid confusion by below log:
    
    vdd1p1: supplied by regulator-dummy
    vdd3p0: supplied by regulator-dummy
    vdd2p5: supplied by regulator-dummy
    
    With this patch, the power supply is more accurate:
    
    vdd1p1: supplied by VGEN5
    vdd3p0: supplied by SW2
    vdd2p5: supplied by VGEN5
    
    Signed-off-by: Anson Huang <Anson.Huang@nxp.com>
    Signed-off-by: Shawn Guo <shawnguo@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
index 6e46a195b399..41384bbd2f60 100644
--- a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
@@ -671,6 +671,18 @@
        vin-supply = <&sw1c_reg>;
 };
 
+&reg_vdd1p1 {
+	vin-supply = <&vgen5_reg>;
+};
+
+&reg_vdd3p0 {
+	vin-supply = <&sw2_reg>;
+};
+
+&reg_vdd2p5 {
+	vin-supply = <&vgen5_reg>;
+};
+
 &snvs_poweroff {
 	status = "okay";
 };
diff --git a/arch/arm/boot/dts/imx6qdl.dtsi b/arch/arm/boot/dts/imx6qdl.dtsi
index e64ff80c83c5..9f88b5691f05 100644
--- a/arch/arm/boot/dts/imx6qdl.dtsi
+++ b/arch/arm/boot/dts/imx6qdl.dtsi
@@ -686,7 +686,7 @@
 					     <0 54 IRQ_TYPE_LEVEL_HIGH>,
 					     <0 127 IRQ_TYPE_LEVEL_HIGH>;
 
-				regulator-1p1 {
+				reg_vdd1p1: regulator-1p1 {
 					compatible = "fsl,anatop-regulator";
 					regulator-name = "vdd1p1";
 					regulator-min-microvolt = <1000000>;
@@ -701,7 +701,7 @@
 					anatop-enable-bit = <0>;
 				};
 
-				regulator-3p0 {
+				reg_vdd3p0: regulator-3p0 {
 					compatible = "fsl,anatop-regulator";
 					regulator-name = "vdd3p0";
 					regulator-min-microvolt = <2800000>;
@@ -716,7 +716,7 @@
 					anatop-enable-bit = <0>;
 				};
 
-				regulator-2p5 {
+				reg_vdd2p5: regulator-2p5 {
 					compatible = "fsl,anatop-regulator";
 					regulator-name = "vdd2p5";
 					regulator-min-microvolt = <2250000>;

commit 604c340040782df6b5edcf8aec143b69c5bc23ea
Author: Chris Packham <chris.packham@alliedtelesis.co.nz>
Date:   Wed May 12 09:20:52 2021 +1200

    i2c: mpc: implement erratum A-004447 workaround
    
    [ Upstream commit 8f0cdec8b5fd94135d643662506ee94ae9e98785 ]
    
    The P2040/P2041 has an erratum where the normal i2c recovery mechanism
    does not work. Implement the alternative recovery mechanism documented
    in the P2040 Chip Errata Rev Q.
    
    Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c
index 6a0d55e9e8e3..af349661fd76 100644
--- a/drivers/i2c/busses/i2c-mpc.c
+++ b/drivers/i2c/busses/i2c-mpc.c
@@ -23,6 +23,7 @@
 
 #include <linux/clk.h>
 #include <linux/io.h>
+#include <linux/iopoll.h>
 #include <linux/fsl_devices.h>
 #include <linux/i2c.h>
 #include <linux/interrupt.h>
@@ -49,6 +50,7 @@
 #define CCR_MTX  0x10
 #define CCR_TXAK 0x08
 #define CCR_RSTA 0x04
+#define CCR_RSVD 0x02
 
 #define CSR_MCF  0x80
 #define CSR_MAAS 0x40
@@ -70,6 +72,7 @@ struct mpc_i2c {
 	u8 fdr, dfsrr;
 #endif
 	struct clk *clk_per;
+	bool has_errata_A004447;
 };
 
 struct mpc_i2c_divider {
@@ -176,6 +179,75 @@ static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing)
 	return 0;
 }
 
+static int i2c_mpc_wait_sr(struct mpc_i2c *i2c, int mask)
+{
+	void __iomem *addr = i2c->base + MPC_I2C_SR;
+	u8 val;
+
+	return readb_poll_timeout(addr, val, val & mask, 0, 100);
+}
+
+/*
+ * Workaround for Erratum A004447. From the P2040CE Rev Q
+ *
+ * 1.  Set up the frequency divider and sampling rate.
+ * 2.  I2CCR - a0h
+ * 3.  Poll for I2CSR[MBB] to get set.
+ * 4.  If I2CSR[MAL] is set (an indication that SDA is stuck low), then go to
+ *     step 5. If MAL is not set, then go to step 13.
+ * 5.  I2CCR - 00h
+ * 6.  I2CCR - 22h
+ * 7.  I2CCR - a2h
+ * 8.  Poll for I2CSR[MBB] to get set.
+ * 9.  Issue read to I2CDR.
+ * 10. Poll for I2CSR[MIF] to be set.
+ * 11. I2CCR - 82h
+ * 12. Workaround complete. Skip the next steps.
+ * 13. Issue read to I2CDR.
+ * 14. Poll for I2CSR[MIF] to be set.
+ * 15. I2CCR - 80h
+ */
+static void mpc_i2c_fixup_A004447(struct mpc_i2c *i2c)
+{
+	int ret;
+	u32 val;
+
+	writeccr(i2c, CCR_MEN | CCR_MSTA);
+	ret = i2c_mpc_wait_sr(i2c, CSR_MBB);
+	if (ret) {
+		dev_err(i2c->dev, "timeout waiting for CSR_MBB\n");
+		return;
+	}
+
+	val = readb(i2c->base + MPC_I2C_SR);
+
+	if (val & CSR_MAL) {
+		writeccr(i2c, 0x00);
+		writeccr(i2c, CCR_MSTA | CCR_RSVD);
+		writeccr(i2c, CCR_MEN | CCR_MSTA | CCR_RSVD);
+		ret = i2c_mpc_wait_sr(i2c, CSR_MBB);
+		if (ret) {
+			dev_err(i2c->dev, "timeout waiting for CSR_MBB\n");
+			return;
+		}
+		val = readb(i2c->base + MPC_I2C_DR);
+		ret = i2c_mpc_wait_sr(i2c, CSR_MIF);
+		if (ret) {
+			dev_err(i2c->dev, "timeout waiting for CSR_MIF\n");
+			return;
+		}
+		writeccr(i2c, CCR_MEN | CCR_RSVD);
+	} else {
+		val = readb(i2c->base + MPC_I2C_DR);
+		ret = i2c_mpc_wait_sr(i2c, CSR_MIF);
+		if (ret) {
+			dev_err(i2c->dev, "timeout waiting for CSR_MIF\n");
+			return;
+		}
+		writeccr(i2c, CCR_MEN);
+	}
+}
+
 #if defined(CONFIG_PPC_MPC52xx) || defined(CONFIG_PPC_MPC512x)
 static const struct mpc_i2c_divider mpc_i2c_dividers_52xx[] = {
 	{20, 0x20}, {22, 0x21}, {24, 0x22}, {26, 0x23},
@@ -641,7 +713,10 @@ static int fsl_i2c_bus_recovery(struct i2c_adapter *adap)
 {
 	struct mpc_i2c *i2c = i2c_get_adapdata(adap);
 
-	mpc_i2c_fixup(i2c);
+	if (i2c->has_errata_A004447)
+		mpc_i2c_fixup_A004447(i2c);
+	else
+		mpc_i2c_fixup(i2c);
 
 	return 0;
 }
@@ -745,6 +820,8 @@ static int fsl_i2c_probe(struct platform_device *op)
 	dev_info(i2c->dev, "timeout %u us\n", mpc_ops.timeout * 1000000 / HZ);
 
 	platform_set_drvdata(op, i2c);
+	if (of_property_read_bool(op->dev.of_node, "fsl,i2c-erratum-a004447"))
+		i2c->has_errata_A004447 = true;
 
 	i2c->adap = mpc_ops;
 	of_address_to_resource(op->dev.of_node, 0, &res);

commit 3cea99e8af9875f2e99abdc6ceb3ef274564df9e
Author: Chris Packham <chris.packham@alliedtelesis.co.nz>
Date:   Mon Mar 29 14:52:03 2021 +1300

    i2c: mpc: Make use of i2c_recover_bus()
    
    [ Upstream commit 65171b2df15eb7545431d75c2729b5062da89b43 ]
    
    Move the existing calls of mpc_i2c_fixup() to a recovery function
    registered via bus_recovery_info. This makes it more obvious that
    recovery is supported and allows for a future where recovery is
    triggered by the i2c core.
    
    Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c
index d94f05c8b8b7..6a0d55e9e8e3 100644
--- a/drivers/i2c/busses/i2c-mpc.c
+++ b/drivers/i2c/busses/i2c-mpc.c
@@ -586,7 +586,7 @@ static int mpc_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
 			if ((status & (CSR_MCF | CSR_MBB | CSR_RXAK)) != 0) {
 				writeb(status & ~CSR_MAL,
 				       i2c->base + MPC_I2C_SR);
-				mpc_i2c_fixup(i2c);
+				i2c_recover_bus(&i2c->adap);
 			}
 			return -EIO;
 		}
@@ -622,7 +622,7 @@ static int mpc_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
 			if ((status & (CSR_MCF | CSR_MBB | CSR_RXAK)) != 0) {
 				writeb(status & ~CSR_MAL,
 				       i2c->base + MPC_I2C_SR);
-				mpc_i2c_fixup(i2c);
+				i2c_recover_bus(&i2c->adap);
 			}
 			return -EIO;
 		}
@@ -637,6 +637,15 @@ static u32 mpc_functionality(struct i2c_adapter *adap)
 	  | I2C_FUNC_SMBUS_READ_BLOCK_DATA | I2C_FUNC_SMBUS_BLOCK_PROC_CALL;
 }
 
+static int fsl_i2c_bus_recovery(struct i2c_adapter *adap)
+{
+	struct mpc_i2c *i2c = i2c_get_adapdata(adap);
+
+	mpc_i2c_fixup(i2c);
+
+	return 0;
+}
+
 static const struct i2c_algorithm mpc_algo = {
 	.master_xfer = mpc_xfer,
 	.functionality = mpc_functionality,
@@ -648,6 +657,10 @@ static struct i2c_adapter mpc_ops = {
 	.timeout = HZ,
 };
 
+static struct i2c_bus_recovery_info fsl_i2c_recovery_info = {
+	.recover_bus = fsl_i2c_bus_recovery,
+};
+
 static const struct of_device_id mpc_i2c_of_match[];
 static int fsl_i2c_probe(struct platform_device *op)
 {
@@ -740,6 +753,7 @@ static int fsl_i2c_probe(struct platform_device *op)
 	i2c_set_adapdata(&i2c->adap, i2c);
 	i2c->adap.dev.parent = &op->dev;
 	i2c->adap.dev.of_node = of_node_get(op->dev.of_node);
+	i2c->adap.bus_recovery_info = &fsl_i2c_recovery_info;
 
 	result = i2c_add_adapter(&i2c->adap);
 	if (result < 0)

commit 6366c6ae3267d9eb037e6cd8f7d79f8dfe676106
Author: Chris Packham <chris.packham@alliedtelesis.co.nz>
Date:   Wed May 12 09:20:51 2021 +1200

    powerpc/fsl: set fsl,i2c-erratum-a004447 flag for P1010 i2c controllers
    
    [ Upstream commit 19ae697a1e4edf1d755b413e3aa38da65e2db23b ]
    
    The i2c controllers on the P1010 have an erratum where the documented
    scheme for i2c bus recovery will not work (A-004447). A different
    mechanism is needed which is documented in the P1010 Chip Errata Rev L.
    
    Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz>
    Acked-by: Michael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi b/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi
index 1b4aafc1f6a2..9716a0484ecf 100644
--- a/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi
@@ -122,7 +122,15 @@
 	};
 
 /include/ "pq3-i2c-0.dtsi"
+	i2c@3000 {
+		fsl,i2c-erratum-a004447;
+	};
+
 /include/ "pq3-i2c-1.dtsi"
+	i2c@3100 {
+		fsl,i2c-erratum-a004447;
+	};
+
 /include/ "pq3-duart-0.dtsi"
 /include/ "pq3-espi-0.dtsi"
 	spi0: spi@7000 {

commit 4e763e819516dd5450cfd60dd4bb887253e7bdaa
Author: Chris Packham <chris.packham@alliedtelesis.co.nz>
Date:   Wed May 12 09:20:50 2021 +1200

    powerpc/fsl: set fsl,i2c-erratum-a004447 flag for P2041 i2c controllers
    
    [ Upstream commit 7adc7b225cddcfd0f346d10144fd7a3d3d9f9ea7 ]
    
    The i2c controllers on the P2040/P2041 have an erratum where the
    documented scheme for i2c bus recovery will not work (A-004447). A
    different mechanism is needed which is documented in the P2040 Chip
    Errata Rev Q (latest available at the time of writing).
    
    Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz>
    Acked-by: Michael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi b/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi
index 51e975d7631a..8921f17fca42 100644
--- a/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi
@@ -389,7 +389,23 @@
 	};
 
 /include/ "qoriq-i2c-0.dtsi"
+	i2c@118000 {
+		fsl,i2c-erratum-a004447;
+	};
+
+	i2c@118100 {
+		fsl,i2c-erratum-a004447;
+	};
+
 /include/ "qoriq-i2c-1.dtsi"
+	i2c@119000 {
+		fsl,i2c-erratum-a004447;
+	};
+
+	i2c@119100 {
+		fsl,i2c-erratum-a004447;
+	};
+
 /include/ "qoriq-duart-0.dtsi"
 /include/ "qoriq-duart-1.dtsi"
 /include/ "qoriq-gpio-0.dtsi"

commit a7743f3294d6d11761ac8f0f2b65d2ff77aed88a
Author: Jiapeng Chong <jiapeng.chong@linux.alibaba.com>
Date:   Tue May 25 19:00:12 2021 +0800

    bnx2x: Fix missing error code in bnx2x_iov_init_one()
    
    [ Upstream commit 65161c35554f7135e6656b3df1ce2c500ca0bdcf ]
    
    Eliminate the follow smatch warning:
    
    drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c:1227
    bnx2x_iov_init_one() warn: missing error code 'err'.
    
    Reported-by: Abaci Robot <abaci@linux.alibaba.com>
    Signed-off-by: Jiapeng Chong <jiapeng.chong@linux.alibaba.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
index ab60f4f9cc24..77005f6366eb 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
@@ -1244,8 +1244,10 @@ int bnx2x_iov_init_one(struct bnx2x *bp, int int_mode_param,
 		goto failed;
 
 	/* SR-IOV capability was enabled but there are no VFs*/
-	if (iov->total == 0)
+	if (iov->total == 0) {
+		err = -EINVAL;
 		goto failed;
+	}
 
 	iov->nr_virtfn = min_t(u16, iov->total, num_vfs_param);
 

commit c598216aa20d18eced30685f9fc100c1eeb16fd8
Author: Tiezhu Yang <yangtiezhu@loongson.cn>
Date:   Sat May 15 19:02:01 2021 +0800

    MIPS: Fix kernel hang under FUNCTION_GRAPH_TRACER and PREEMPT_TRACER
    
    [ Upstream commit 78cf0eb926cb1abeff2106bae67752e032fe5f3e ]
    
    When update the latest mainline kernel with the following three configs,
    the kernel hangs during startup:
    
    (1) CONFIG_FUNCTION_GRAPH_TRACER=y
    (2) CONFIG_PREEMPT_TRACER=y
    (3) CONFIG_FTRACE_STARTUP_TEST=y
    
    When update the latest mainline kernel with the above two configs (1)
    and (2), the kernel starts normally, but it still hangs when execute
    the following command:
    
    echo "function_graph" > /sys/kernel/debug/tracing/current_tracer
    
    Without CONFIG_PREEMPT_TRACER=y, the above two kinds of kernel hangs
    disappeared, so it seems that CONFIG_PREEMPT_TRACER has some influences
    with function_graph tracer at the first glance.
    
    I use ejtag to find out the epc address is related with preempt_enable()
    in the file arch/mips/lib/mips-atomic.c, because function tracing can
    trace the preempt_{enable,disable} calls that are traced, replace them
    with preempt_{enable,disable}_notrace to prevent function tracing from
    going into an infinite loop, and then it can fix the kernel hang issue.
    
    By the way, it seems that this commit is a complement and improvement of
    commit f93a1a00f2bd ("MIPS: Fix crash that occurs when function tracing
    is enabled").
    
    Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/lib/mips-atomic.c b/arch/mips/lib/mips-atomic.c
index 5530070e0d05..57497a26e79c 100644
--- a/arch/mips/lib/mips-atomic.c
+++ b/arch/mips/lib/mips-atomic.c
@@ -37,7 +37,7 @@
  */
 notrace void arch_local_irq_disable(void)
 {
-	preempt_disable();
+	preempt_disable_notrace();
 
 	__asm__ __volatile__(
 	"	.set	push						\n"
@@ -53,7 +53,7 @@ notrace void arch_local_irq_disable(void)
 	: /* no inputs */
 	: "memory");
 
-	preempt_enable();
+	preempt_enable_notrace();
 }
 EXPORT_SYMBOL(arch_local_irq_disable);
 
@@ -61,7 +61,7 @@ notrace unsigned long arch_local_irq_save(void)
 {
 	unsigned long flags;
 
-	preempt_disable();
+	preempt_disable_notrace();
 
 	__asm__ __volatile__(
 	"	.set	push						\n"
@@ -78,7 +78,7 @@ notrace unsigned long arch_local_irq_save(void)
 	: /* no inputs */
 	: "memory");
 
-	preempt_enable();
+	preempt_enable_notrace();
 
 	return flags;
 }
@@ -88,7 +88,7 @@ notrace void arch_local_irq_restore(unsigned long flags)
 {
 	unsigned long __tmp1;
 
-	preempt_disable();
+	preempt_disable_notrace();
 
 	__asm__ __volatile__(
 	"	.set	push						\n"
@@ -106,7 +106,7 @@ notrace void arch_local_irq_restore(unsigned long flags)
 	: "0" (flags)
 	: "memory");
 
-	preempt_enable();
+	preempt_enable_notrace();
 }
 EXPORT_SYMBOL(arch_local_irq_restore);
 

commit 90eaa3a1abae4046f39a00eacae49ae68328ad08
Author: Hannes Reinecke <hare@suse.de>
Date:   Fri May 21 10:23:46 2021 +0200

    nvme-fabrics: decode host pathing error for connect
    
    [ Upstream commit 4d9442bf263ac45d495bb7ecf75009e59c0622b2 ]
    
    Add an additional decoding for 'host pathing error' during connect.
    
    Signed-off-by: Hannes Reinecke <hare@suse.de>
    Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
    Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
    Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/nvme/host/fabrics.c b/drivers/nvme/host/fabrics.c
index 05dd46f98441..3ae800e87999 100644
--- a/drivers/nvme/host/fabrics.c
+++ b/drivers/nvme/host/fabrics.c
@@ -344,6 +344,11 @@ static void nvmf_log_connect_error(struct nvme_ctrl *ctrl,
 			cmd->connect.recfmt);
 		break;
 
+	case NVME_SC_HOST_PATH_ERROR:
+		dev_err(ctrl->device,
+			"Connect command failed: host path error\n");
+		break;
+
 	default:
 		dev_err(ctrl->device,
 			"Connect command failed, error wo/DNR bit: %d\n",

commit 57372e2926fe4796a3c25b1448cb041d8cfa3c78
Author: Saubhik Mukherjee <saubhik.mukherjee@gmail.com>
Date:   Mon May 24 19:07:12 2021 +0530

    net: appletalk: cops: Fix data race in cops_probe1
    
    [ Upstream commit a4dd4fc6105e54393d637450a11d4cddb5fabc4f ]
    
    In cops_probe1(), there is a write to dev->base_addr after requesting an
    interrupt line and registering the interrupt handler cops_interrupt().
    The handler might be called in parallel to handle an interrupt.
    cops_interrupt() tries to read dev->base_addr leading to a potential
    data race. So write to dev->base_addr before calling request_irq().
    
    Found by Linux Driver Verification project (linuxtesting.org).
    
    Signed-off-by: Saubhik Mukherjee <saubhik.mukherjee@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/appletalk/cops.c b/drivers/net/appletalk/cops.c
index bb49f6e40a19..0a7889abf2b2 100644
--- a/drivers/net/appletalk/cops.c
+++ b/drivers/net/appletalk/cops.c
@@ -325,6 +325,8 @@ static int __init cops_probe1(struct net_device *dev, int ioaddr)
 			break;
 	}
 
+	dev->base_addr = ioaddr;
+
 	/* Reserve any actual interrupt. */
 	if (dev->irq) {
 		retval = request_irq(dev->irq, cops_interrupt, 0, dev->name, dev);
@@ -332,8 +334,6 @@ static int __init cops_probe1(struct net_device *dev, int ioaddr)
 			goto err_out;
 	}
 
-	dev->base_addr = ioaddr;
-
         lp = netdev_priv(dev);
         spin_lock_init(&lp->lock);
 

commit 91d25454ec8e7d0530e94c2b6f3e53a47a7f62a0
Author: Zong Li <zong.li@sifive.com>
Date:   Sat May 22 17:16:11 2021 +0800

    net: macb: ensure the device is available before accessing GEMGXL control registers
    
    [ Upstream commit 5eff1461a6dec84f04fafa9128548bad51d96147 ]
    
    If runtime power menagement is enabled, the gigabit ethernet PLL would
    be disabled after macb_probe(). During this period of time, the system
    would hang up if we try to access GEMGXL control registers.
    
    We can't put runtime_pm_get/runtime_pm_put/ there due to the issue of
    sleep inside atomic section (7fa2955ff70ce453 ("sh_eth: Fix sleeping
    function called from invalid context"). Add netif_running checking to
    ensure the device is available before accessing GEMGXL device.
    
    Changed in v2:
     - Use netif_running instead of its own flag
    
    Signed-off-by: Zong Li <zong.li@sifive.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c
index 0374a1ba1010..d110aa616a95 100644
--- a/drivers/net/ethernet/cadence/macb_main.c
+++ b/drivers/net/ethernet/cadence/macb_main.c
@@ -2513,6 +2513,9 @@ static struct net_device_stats *gem_get_stats(struct macb *bp)
 	struct gem_stats *hwstat = &bp->hw_stats.gem;
 	struct net_device_stats *nstat = &bp->dev->stats;
 
+	if (!netif_running(bp->dev))
+		return nstat;
+
 	gem_update_stats(bp);
 
 	nstat->rx_errors = (hwstat->rx_frame_check_sequence_errors +

commit 8b9c91b7193c957cc6d9e8a0dafb03b31956bce2
Author: Dmitry Bogdanov <d.bogdanov@yadro.com>
Date:   Thu Apr 15 23:35:54 2021 +0300

    scsi: target: qla2xxx: Wait for stop_phase1 at WWN removal
    
    [ Upstream commit 2ef7665dfd88830f15415ba007c7c9a46be7acd8 ]
    
    Target de-configuration panics at high CPU load because TPGT and WWPN can
    be removed on separate threads.
    
    TPGT removal requests a reset HBA on a separate thread and waits for reset
    complete (phase1). Due to high CPU load that HBA reset can be delayed for
    some time.
    
    WWPN removal does qlt_stop_phase2(). There it is believed that phase1 has
    already completed and thus tgt.tgt_ops is subsequently cleared. However,
    tgt.tgt_ops is needed to process incoming traffic and therefore this will
    cause one of the following panics:
    
    NIP qlt_reset+0x7c/0x220 [qla2xxx]
    LR  qlt_reset+0x68/0x220 [qla2xxx]
    Call Trace:
    0xc000003ffff63a78 (unreliable)
    qlt_handle_imm_notify+0x800/0x10c0 [qla2xxx]
    qlt_24xx_atio_pkt+0x208/0x590 [qla2xxx]
    qlt_24xx_process_atio_queue+0x33c/0x7a0 [qla2xxx]
    qla83xx_msix_atio_q+0x54/0x90 [qla2xxx]
    
    or
    
    NIP qlt_24xx_handle_abts+0xd0/0x2a0 [qla2xxx]
    LR  qlt_24xx_handle_abts+0xb4/0x2a0 [qla2xxx]
    Call Trace:
    qlt_24xx_handle_abts+0x90/0x2a0 [qla2xxx] (unreliable)
    qlt_24xx_process_atio_queue+0x500/0x7a0 [qla2xxx]
    qla83xx_msix_atio_q+0x54/0x90 [qla2xxx]
    
    or
    
    NIP qlt_create_sess+0x90/0x4e0 [qla2xxx]
    LR  qla24xx_do_nack_work+0xa8/0x180 [qla2xxx]
    Call Trace:
    0xc0000000348fba30 (unreliable)
    qla24xx_do_nack_work+0xa8/0x180 [qla2xxx]
    qla2x00_do_work+0x674/0xbf0 [qla2xxx]
    qla2x00_iocb_work_fn
    
    The patch fixes the issue by serializing qlt_stop_phase1() and
    qlt_stop_phase2() functions to make WWPN removal wait for phase1
    completion.
    
    Link: https://lore.kernel.org/r/20210415203554.27890-1-d.bogdanov@yadro.com
    Reviewed-by: Roman Bolshakov <r.bolshakov@yadro.com>
    Signed-off-by: Dmitry Bogdanov <d.bogdanov@yadro.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
index eb6112eb475e..ec54c8f34bc8 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -1571,10 +1571,12 @@ void qlt_stop_phase2(struct qla_tgt *tgt)
 		return;
 	}
 
+	mutex_lock(&tgt->ha->optrom_mutex);
 	mutex_lock(&vha->vha_tgt.tgt_mutex);
 	tgt->tgt_stop = 0;
 	tgt->tgt_stopped = 1;
 	mutex_unlock(&vha->vha_tgt.tgt_mutex);
+	mutex_unlock(&tgt->ha->optrom_mutex);
 
 	ql_dbg(ql_dbg_tgt_mgt, vha, 0xf00c, "Stop of tgt %p finished\n",
 	    tgt);

commit 3b8ee5effb2baf8423f797275cc321c8ca46b060
Author: Matt Wang <wwentao@vmware.com>
Date:   Wed May 19 09:49:32 2021 +0000

    scsi: vmw_pvscsi: Set correct residual data length
    
    [ Upstream commit e662502b3a782d479e67736a5a1c169a703d853a ]
    
    Some commands (such as INQUIRY) may return less data than the initiator
    requested. To avoid conducting useless information, set the right residual
    count to make upper layer aware of this.
    
    Before (INQUIRY PAGE 0xB0 with 128B buffer):
    
    $ sg_raw -r 128 /dev/sda 12 01 B0 00 80 00
    SCSI Status: Good
    
    Received 128 bytes of data:
     00 00 b0 00 3c 01 00 00 00 00 00 00 00 00 00 00 00 ...<............
     10 00 00 00 00 00 01 00 00 00 00 00 40 00 00 08 00 ...........@....
     20 80 00 00 00 00 00 00 00 00 00 20 00 00 00 00 00 .......... .....
     30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
     40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
     50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
     60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
     70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
    
    After:
    
    $ sg_raw -r 128 /dev/sda 12 01 B0 00 80 00
    SCSI Status: Good
    
    Received 64 bytes of data:
    00 00 b0 00 3c 01 00 00 00 00 00 00 00 00 00 00 00 ...<............
    10 00 00 00 00 00 01 00 00 00 00 00 40 00 00 08 00 ...........@....
    20 80 00 00 00 00 00 00 00 00 00 20 00 00 00 00 00 .......... .....
    30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
    
    [mkp: clarified description]
    
    Link: https://lore.kernel.org/r/03C41093-B62E-43A2-913E-CFC92F1C70C3@vmware.com
    Signed-off-by: Matt Wang <wwentao@vmware.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/vmw_pvscsi.c b/drivers/scsi/vmw_pvscsi.c
index 64eb8ffb2ddf..2c707b5c7b0b 100644
--- a/drivers/scsi/vmw_pvscsi.c
+++ b/drivers/scsi/vmw_pvscsi.c
@@ -574,7 +574,13 @@ static void pvscsi_complete_request(struct pvscsi_adapter *adapter,
 		case BTSTAT_SUCCESS:
 		case BTSTAT_LINKED_COMMAND_COMPLETED:
 		case BTSTAT_LINKED_COMMAND_COMPLETED_WITH_FLAG:
-			/* If everything went fine, let's move on..  */
+			/*
+			 * Commands like INQUIRY may transfer less data than
+			 * requested by the initiator via bufflen. Set residual
+			 * count to make upper layer aware of the actual amount
+			 * of data returned.
+			 */
+			scsi_set_resid(cmd, scsi_bufflen(cmd) - e->dataLen);
 			cmd->result = (DID_OK << 16);
 			break;
 

commit 173bac4963c24ab921d90555f0b0cfc99ac90672
Author: Javed Hasan <jhasan@marvell.com>
Date:   Tue May 18 23:14:16 2021 -0700

    scsi: bnx2fc: Return failure if io_req is already in ABTS processing
    
    [ Upstream commit 122c81c563b0c1c6b15ff76a9159af5ee1f21563 ]
    
    Return failure from bnx2fc_eh_abort() if io_req is already in ABTS
    processing.
    
    Link: https://lore.kernel.org/r/20210519061416.19321-1-jhasan@marvell.com
    Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
    Signed-off-by: Javed Hasan <jhasan@marvell.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/bnx2fc/bnx2fc_io.c b/drivers/scsi/bnx2fc/bnx2fc_io.c
index bc9f2a2365f4..5d89cc30bf30 100644
--- a/drivers/scsi/bnx2fc/bnx2fc_io.c
+++ b/drivers/scsi/bnx2fc/bnx2fc_io.c
@@ -1218,6 +1218,7 @@ int bnx2fc_eh_abort(struct scsi_cmnd *sc_cmd)
 		   was a result from the ABTS request rather than the CLEANUP
 		   request */
 		set_bit(BNX2FC_FLAG_IO_CLEANUP,	&io_req->req_flags);
+		rc = FAILED;
 		goto done;
 	}
 

commit 0a3158ac5999fe0b9974604e630078cd1eff8be6
Author: Rao Shoaib <rao.shoaib@oracle.com>
Date:   Fri May 21 11:08:06 2021 -0700

    RDS tcp loopback connection can hang
    
    [ Upstream commit aced3ce57cd37b5ca332bcacd370d01f5a8c5371 ]
    
    When TCP is used as transport and a program on the
    system connects to RDS port 16385, connection is
    accepted but denied per the rules of RDS. However,
    RDS connections object is left in the list. Next
    loopback connection will select that connection
    object as it is at the head of list. The connection
    attempt will hang as the connection object is set
    to connect over TCP which is not allowed
    
    The issue can be reproduced easily, use rds-ping
    to ping a local IP address. After that use any
    program like ncat to connect to the same IP
    address and port 16385. This will hang so ctrl-c out.
    Now try rds-ping, it will hang.
    
    To fix the issue this patch adds checks to disallow
    the connection object creation and destroys the
    connection object.
    
    Signed-off-by: Rao Shoaib <rao.shoaib@oracle.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/rds/connection.c b/net/rds/connection.c
index 3bd2f4a5a30d..ac3300b204a6 100644
--- a/net/rds/connection.c
+++ b/net/rds/connection.c
@@ -237,12 +237,23 @@ static struct rds_connection *__rds_conn_create(struct net *net,
 	if (loop_trans) {
 		rds_trans_put(loop_trans);
 		conn->c_loopback = 1;
-		if (is_outgoing && trans->t_prefer_loopback) {
-			/* "outgoing" connection - and the transport
-			 * says it wants the connection handled by the
-			 * loopback transport. This is what TCP does.
-			 */
-			trans = &rds_loop_transport;
+		if (trans->t_prefer_loopback) {
+			if (likely(is_outgoing)) {
+				/* "outgoing" connection to local address.
+				 * Protocol says it wants the connection
+				 * handled by the loopback transport.
+				 * This is what TCP does.
+				 */
+				trans = &rds_loop_transport;
+			} else {
+				/* No transport currently in use
+				 * should end up here, but if it
+				 * does, reset/destroy the connection.
+				 */
+				kmem_cache_free(rds_conn_slab, conn);
+				conn = ERR_PTR(-EOPNOTSUPP);
+				goto out;
+			}
 		}
 	}
 
diff --git a/net/rds/tcp.c b/net/rds/tcp.c
index 18bb522df282..d0bce439198f 100644
--- a/net/rds/tcp.c
+++ b/net/rds/tcp.c
@@ -322,8 +322,8 @@ static void rds6_tcp_tc_info(struct socket *sock, unsigned int len,
 }
 #endif
 
-static int rds_tcp_laddr_check(struct net *net, const struct in6_addr *addr,
-			       __u32 scope_id)
+int rds_tcp_laddr_check(struct net *net, const struct in6_addr *addr,
+			__u32 scope_id)
 {
 	struct net_device *dev = NULL;
 #if IS_ENABLED(CONFIG_IPV6)
diff --git a/net/rds/tcp.h b/net/rds/tcp.h
index 3c69361d21c7..4620549ecbeb 100644
--- a/net/rds/tcp.h
+++ b/net/rds/tcp.h
@@ -60,7 +60,8 @@ u32 rds_tcp_snd_una(struct rds_tcp_connection *tc);
 u64 rds_tcp_map_seq(struct rds_tcp_connection *tc, u32 seq);
 extern struct rds_transport rds_tcp_transport;
 void rds_tcp_accept_work(struct sock *sk);
-
+int rds_tcp_laddr_check(struct net *net, const struct in6_addr *addr,
+			__u32 scope_id);
 /* tcp_connect.c */
 int rds_tcp_conn_path_connect(struct rds_conn_path *cp);
 void rds_tcp_conn_path_shutdown(struct rds_conn_path *conn);
diff --git a/net/rds/tcp_listen.c b/net/rds/tcp_listen.c
index c12203f646da..0d095d3f5fee 100644
--- a/net/rds/tcp_listen.c
+++ b/net/rds/tcp_listen.c
@@ -198,6 +198,12 @@ int rds_tcp_accept_one(struct socket *sock)
 	}
 #endif
 
+	if (!rds_tcp_laddr_check(sock_net(sock->sk), peer_addr, dev_if)) {
+		/* local address connection is only allowed via loopback */
+		ret = -EOPNOTSUPP;
+		goto out;
+	}
+
 	conn = rds_conn_create(sock_net(sock->sk),
 			       my_addr, peer_addr,
 			       &rds_tcp_transport, GFP_KERNEL, dev_if);

commit 92473994deec84b46ba98700810f2a025a30a9e1
Author: Zheyu Ma <zheyuma97@gmail.com>
Date:   Thu May 20 12:32:36 2021 +0000

    net/qla3xxx: fix schedule while atomic in ql_sem_spinlock
    
    [ Upstream commit 13a6f3153922391e90036ba2267d34eed63196fc ]
    
    When calling the 'ql_sem_spinlock', the driver has already acquired the
    spin lock, so the driver should not call 'ssleep' in atomic context.
    
    This bug can be fixed by using 'mdelay' instead of 'ssleep'.
    
    The KASAN's log reveals it:
    
    [    3.238124 ] BUG: scheduling while atomic: swapper/0/1/0x00000002
    [    3.238748 ] 2 locks held by swapper/0/1:
    [    3.239151 ]  #0: ffff88810177b240 (&dev->mutex){....}-{3:3}, at:
    __device_driver_lock+0x41/0x60
    [    3.240026 ]  #1: ffff888107c60e28 (&qdev->hw_lock){....}-{2:2}, at:
    ql3xxx_probe+0x2aa/0xea0
    [    3.240873 ] Modules linked in:
    [    3.241187 ] irq event stamp: 460854
    [    3.241541 ] hardirqs last  enabled at (460853): [<ffffffff843051bf>]
    _raw_spin_unlock_irqrestore+0x4f/0x70
    [    3.242245 ] hardirqs last disabled at (460854): [<ffffffff843058ca>]
    _raw_spin_lock_irqsave+0x2a/0x70
    [    3.242245 ] softirqs last  enabled at (446076): [<ffffffff846002e4>]
    __do_softirq+0x2e4/0x4b1
    [    3.242245 ] softirqs last disabled at (446069): [<ffffffff811ba5e0>]
    irq_exit_rcu+0x100/0x110
    [    3.242245 ] Preemption disabled at:
    [    3.242245 ] [<ffffffff828ca5ba>] ql3xxx_probe+0x2aa/0xea0
    [    3.242245 ] Kernel panic - not syncing: scheduling while atomic
    [    3.242245 ] CPU: 2 PID: 1 Comm: swapper/0 Not tainted
    5.13.0-rc1-00145
    -gee7dc339169-dirty #16
    [    3.242245 ] Call Trace:
    [    3.242245 ]  dump_stack+0xba/0xf5
    [    3.242245 ]  ? ql3xxx_probe+0x1f0/0xea0
    [    3.242245 ]  panic+0x15a/0x3f2
    [    3.242245 ]  ? vprintk+0x76/0x150
    [    3.242245 ]  ? ql3xxx_probe+0x2aa/0xea0
    [    3.242245 ]  __schedule_bug+0xae/0xe0
    [    3.242245 ]  __schedule+0x72e/0xa00
    [    3.242245 ]  schedule+0x43/0xf0
    [    3.242245 ]  schedule_timeout+0x28b/0x500
    [    3.242245 ]  ? del_timer_sync+0xf0/0xf0
    [    3.242245 ]  ? msleep+0x2f/0x70
    [    3.242245 ]  msleep+0x59/0x70
    [    3.242245 ]  ql3xxx_probe+0x307/0xea0
    [    3.242245 ]  ? _raw_spin_unlock_irqrestore+0x3a/0x70
    [    3.242245 ]  ? pci_device_remove+0x110/0x110
    [    3.242245 ]  local_pci_probe+0x45/0xa0
    [    3.242245 ]  pci_device_probe+0x12b/0x1d0
    [    3.242245 ]  really_probe+0x2a9/0x610
    [    3.242245 ]  driver_probe_device+0x90/0x1d0
    [    3.242245 ]  ? mutex_lock_nested+0x1b/0x20
    [    3.242245 ]  device_driver_attach+0x68/0x70
    [    3.242245 ]  __driver_attach+0x124/0x1b0
    [    3.242245 ]  ? device_driver_attach+0x70/0x70
    [    3.242245 ]  bus_for_each_dev+0xbb/0x110
    [    3.242245 ]  ? rdinit_setup+0x45/0x45
    [    3.242245 ]  driver_attach+0x27/0x30
    [    3.242245 ]  bus_add_driver+0x1eb/0x2a0
    [    3.242245 ]  driver_register+0xa9/0x180
    [    3.242245 ]  __pci_register_driver+0x82/0x90
    [    3.242245 ]  ? yellowfin_init+0x25/0x25
    [    3.242245 ]  ql3xxx_driver_init+0x23/0x25
    [    3.242245 ]  do_one_initcall+0x7f/0x3d0
    [    3.242245 ]  ? rdinit_setup+0x45/0x45
    [    3.242245 ]  ? rcu_read_lock_sched_held+0x4f/0x80
    [    3.242245 ]  kernel_init_freeable+0x2aa/0x301
    [    3.242245 ]  ? rest_init+0x2c0/0x2c0
    [    3.242245 ]  kernel_init+0x18/0x190
    [    3.242245 ]  ? rest_init+0x2c0/0x2c0
    [    3.242245 ]  ? rest_init+0x2c0/0x2c0
    [    3.242245 ]  ret_from_fork+0x1f/0x30
    [    3.242245 ] Dumping ftrace buffer:
    [    3.242245 ]    (ftrace buffer empty)
    [    3.242245 ] Kernel Offset: disabled
    [    3.242245 ] Rebooting in 1 seconds.
    
    Reported-by: Zheyu Ma <zheyuma97@gmail.com>
    Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/qlogic/qla3xxx.c b/drivers/net/ethernet/qlogic/qla3xxx.c
index 1b5e098b2367..2d71646640ac 100644
--- a/drivers/net/ethernet/qlogic/qla3xxx.c
+++ b/drivers/net/ethernet/qlogic/qla3xxx.c
@@ -115,7 +115,7 @@ static int ql_sem_spinlock(struct ql3_adapter *qdev,
 		value = readl(&port_regs->CommonRegs.semaphoreReg);
 		if ((value & (sem_mask >> 16)) == sem_bits)
 			return 0;
-		ssleep(1);
+		mdelay(1000);
 	} while (--seconds);
 	return -1;
 }

commit 50316635e644a0b9e62d3263fb4e8be2104605b6
Author: Sergey Senozhatsky <senozhatsky@chromium.org>
Date:   Thu May 20 19:14:22 2021 +0900

    wq: handle VM suspension in stall detection
    
    [ Upstream commit 940d71c6462e8151c78f28e4919aa8882ff2054e ]
    
    If VCPU is suspended (VM suspend) in wq_watchdog_timer_fn() then
    once this VCPU resumes it will see the new jiffies value, while it
    may take a while before IRQ detects PVCLOCK_GUEST_STOPPED on this
    VCPU and updates all the watchdogs via pvclock_touch_watchdogs().
    There is a small chance of misreported WQ stalls in the meantime,
    because new jiffies is time_after() old 'ts + thresh'.
    
    wq_watchdog_timer_fn()
    {
            for_each_pool(pool, pi) {
                    if (time_after(jiffies, ts + thresh)) {
                            pr_emerg("BUG: workqueue lockup - pool");
                    }
            }
    }
    
    Save jiffies at the beginning of this function and use that value
    for stall detection. If VM gets suspended then we continue using
    "old" jiffies value and old WQ touch timestamps. If IRQ at some
    point restarts the stall detection cycle (pvclock_touch_watchdogs())
    then old jiffies will always be before new 'ts + thresh'.
    
    Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org>
    Signed-off-by: Tejun Heo <tj@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 1cc49340b68a..f278e2f584fd 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -49,6 +49,7 @@
 #include <linux/uaccess.h>
 #include <linux/sched/isolation.h>
 #include <linux/nmi.h>
+#include <linux/kvm_para.h>
 
 #include "workqueue_internal.h"
 
@@ -5555,6 +5556,7 @@ static void wq_watchdog_timer_fn(struct timer_list *unused)
 {
 	unsigned long thresh = READ_ONCE(wq_watchdog_thresh) * HZ;
 	bool lockup_detected = false;
+	unsigned long now = jiffies;
 	struct worker_pool *pool;
 	int pi;
 
@@ -5569,6 +5571,12 @@ static void wq_watchdog_timer_fn(struct timer_list *unused)
 		if (list_empty(&pool->worklist))
 			continue;
 
+		/*
+		 * If a virtual machine is stopped by the host it can look to
+		 * the watchdog like a stall.
+		 */
+		kvm_check_and_clear_guest_paused();
+
 		/* get the latest of pool and touched timestamps */
 		pool_ts = READ_ONCE(pool->watchdog_ts);
 		touched = READ_ONCE(wq_watchdog_touched);
@@ -5587,12 +5595,12 @@ static void wq_watchdog_timer_fn(struct timer_list *unused)
 		}
 
 		/* did we stall? */
-		if (time_after(jiffies, ts + thresh)) {
+		if (time_after(now, ts + thresh)) {
 			lockup_detected = true;
 			pr_emerg("BUG: workqueue lockup - pool");
 			pr_cont_pool_info(pool);
 			pr_cont(" stuck for %us!\n",
-				jiffies_to_msecs(jiffies - pool_ts) / 1000);
+				jiffies_to_msecs(now - pool_ts) / 1000);
 		}
 	}
 

commit ad223fe247dfc23e331f86351bfd84a16f4d955f
Author: Shakeel Butt <shakeelb@google.com>
Date:   Wed May 12 13:19:46 2021 -0700

    cgroup: disable controllers at parse time
    
    [ Upstream commit 45e1ba40837ac2f6f4d4716bddb8d44bd7e4a251 ]
    
    This patch effectively reverts the commit a3e72739b7a7 ("cgroup: fix
    too early usage of static_branch_disable()"). The commit 6041186a3258
    ("init: initialize jump labels before command line option parsing") has
    moved the jump_label_init() before parse_args() which has made the
    commit a3e72739b7a7 unnecessary. On the other hand there are
    consequences of disabling the controllers later as there are subsystems
    doing the controller checks for different decisions. One such incident
    is reported [1] regarding the memory controller and its impact on memory
    reclaim code.
    
    [1] https://lore.kernel.org/linux-mm/921e53f3-4b13-aab8-4a9e-e83ff15371e4@nec.com
    
    Signed-off-by: Shakeel Butt <shakeelb@google.com>
    Reported-by: NOMURA JUNICHI(???淳?) <junichi.nomura@nec.com>
    Signed-off-by: Tejun Heo <tj@kernel.org>
    Tested-by: Jun'ichi Nomura <junichi.nomura@nec.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index 2a879d34bbe5..a74549693e7f 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -5347,8 +5347,6 @@ int __init cgroup_init_early(void)
 	return 0;
 }
 
-static u16 cgroup_disable_mask __initdata;
-
 /**
  * cgroup_init - cgroup initialization
  *
@@ -5408,12 +5406,8 @@ int __init cgroup_init(void)
 		 * disabled flag and cftype registration needs kmalloc,
 		 * both of which aren't available during early_init.
 		 */
-		if (cgroup_disable_mask & (1 << ssid)) {
-			static_branch_disable(cgroup_subsys_enabled_key[ssid]);
-			printk(KERN_INFO "Disabling %s control group subsystem\n",
-			       ss->name);
+		if (!cgroup_ssid_enabled(ssid))
 			continue;
-		}
 
 		if (cgroup1_ssid_disabled(ssid))
 			printk(KERN_INFO "Disabling %s control group subsystem in v1 mounts\n",
@@ -5772,7 +5766,10 @@ static int __init cgroup_disable(char *str)
 			if (strcmp(token, ss->name) &&
 			    strcmp(token, ss->legacy_name))
 				continue;
-			cgroup_disable_mask |= 1 << i;
+
+			static_branch_disable(cgroup_subsys_enabled_key[i]);
+			pr_info("Disabling %s control group subsystem\n",
+				ss->name);
 		}
 	}
 	return 1;

commit acb503deb002ca30e1544dade6059d9cd5d746bd
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Mon May 17 12:04:13 2021 +0300

    net: mdiobus: get rid of a BUG_ON()
    
    [ Upstream commit 1dde47a66d4fb181830d6fa000e5ea86907b639e ]
    
    We spotted a bug recently during a review where a driver was
    unregistering a bus that wasn't registered, which would trigger this
    BUG_ON().  Let's handle that situation more gracefully, and just print
    a warning and return.
    
    Reported-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Reviewed-by: Andrew Lunn <andrew@lunn.ch>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c
index 5c89a310359d..08c81d4cfca8 100644
--- a/drivers/net/phy/mdio_bus.c
+++ b/drivers/net/phy/mdio_bus.c
@@ -446,7 +446,8 @@ void mdiobus_unregister(struct mii_bus *bus)
 	struct mdio_device *mdiodev;
 	int i;
 
-	BUG_ON(bus->state != MDIOBUS_REGISTERED);
+	if (WARN_ON_ONCE(bus->state != MDIOBUS_REGISTERED))
+		return;
 	bus->state = MDIOBUS_UNREGISTERED;
 
 	for (i = 0; i < PHY_MAX_ADDR; i++) {

commit 59fba11d649854134c75ad88c8adafa9304ac419
Author: Johannes Berg <johannes.berg@intel.com>
Date:   Mon May 17 16:38:09 2021 +0200

    netlink: disable IRQs for netlink_lock_table()
    
    [ Upstream commit 1d482e666b8e74c7555dbdfbfb77205eeed3ff2d ]
    
    Syzbot reports that in mac80211 we have a potential deadlock
    between our "local->stop_queue_reasons_lock" (spinlock) and
    netlink's nl_table_lock (rwlock). This is because there's at
    least one situation in which we might try to send a netlink
    message with this spinlock held while it is also possible to
    take the spinlock from a hardirq context, resulting in the
    following deadlock scenario reported by lockdep:
    
           CPU0                    CPU1
           ----                    ----
      lock(nl_table_lock);
                                   local_irq_disable();
                                   lock(&local->queue_stop_reason_lock);
                                   lock(nl_table_lock);
      <Interrupt>
        lock(&local->queue_stop_reason_lock);
    
    This seems valid, we can take the queue_stop_reason_lock in
    any kind of context ("CPU0"), and call ieee80211_report_ack_skb()
    with the spinlock held and IRQs disabled ("CPU1") in some
    code path (ieee80211_do_stop() via ieee80211_free_txskb()).
    
    Short of disallowing netlink use in scenarios like these
    (which would be rather complex in mac80211's case due to
    the deep callchain), it seems the only fix for this is to
    disable IRQs while nl_table_lock is held to avoid hitting
    this scenario, this disallows the "CPU0" portion of the
    reported deadlock.
    
    Note that the writer side (netlink_table_grab()) already
    disables IRQs for this lock.
    
    Unfortunately though, this seems like a huge hammer, and
    maybe the whole netlink table locking should be reworked.
    
    Reported-by: syzbot+69ff9dff50dcfe14ddd4@syzkaller.appspotmail.com
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index 1bb9f219f07d..ac3fe507bc1c 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -461,11 +461,13 @@ void netlink_table_ungrab(void)
 static inline void
 netlink_lock_table(void)
 {
+	unsigned long flags;
+
 	/* read_lock() synchronizes us to netlink_table_grab */
 
-	read_lock(&nl_table_lock);
+	read_lock_irqsave(&nl_table_lock, flags);
 	atomic_inc(&nl_table_users);
-	read_unlock(&nl_table_lock);
+	read_unlock_irqrestore(&nl_table_lock, flags);
 }
 
 static inline void

commit f583748c2a4a1dc731812ae2c12cadca5c1a88b5
Author: Johannes Berg <johannes.berg@intel.com>
Date:   Mon May 17 16:13:35 2021 +0200

    bonding: init notify_work earlier to avoid uninitialized use
    
    [ Upstream commit 35d96e631860226d5dc4de0fad0a415362ec2457 ]
    
    If bond_kobj_init() or later kzalloc() in bond_alloc_slave() fail,
    then we call kobject_put() on the slave->kobj. This in turn calls
    the release function slave_kobj_release() which will always try to
    cancel_delayed_work_sync(&slave->notify_work), which shouldn't be
    done on an uninitialized work struct.
    
    Always initialize the work struct earlier to avoid problems here.
    
    Syzbot bisected this down to a completely pointless commit, some
    fault injection may have been at work here that caused the alloc
    failure in the first place, which may interact badly with bisect.
    
    Reported-by: syzbot+bfda097c12a00c8cae67@syzkaller.appspotmail.com
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Acked-by: Jay Vosburgh <jay.vosburgh@canonical.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index c21c4291921f..c814b266af79 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -1310,6 +1310,7 @@ static struct slave *bond_alloc_slave(struct bonding *bond,
 
 	slave->bond = bond;
 	slave->dev = slave_dev;
+	INIT_DELAYED_WORK(&slave->notify_work, bond_netdev_notify_work);
 
 	if (bond_kobj_init(slave))
 		return NULL;
@@ -1322,7 +1323,6 @@ static struct slave *bond_alloc_slave(struct bonding *bond,
 			return NULL;
 		}
 	}
-	INIT_DELAYED_WORK(&slave->notify_work, bond_netdev_notify_work);
 
 	return slave;
 }

commit bf78e25bd3f487208e042c67c8a31706c2dba265
Author: Zheyu Ma <zheyuma97@gmail.com>
Date:   Sun May 16 07:11:40 2021 +0000

    isdn: mISDN: netjet: Fix crash in nj_probe:
    
    [ Upstream commit 9f6f852550d0e1b7735651228116ae9d300f69b3 ]
    
    'nj_setup' in netjet.c might fail with -EIO and in this case
    'card->irq' is initialized and is bigger than zero. A subsequent call to
    'nj_release' will free the irq that has not been requested.
    
    Fix this bug by deleting the previous assignment to 'card->irq' and just
    keep the assignment before 'request_irq'.
    
    The KASAN's log reveals it:
    
    [    3.354615 ] WARNING: CPU: 0 PID: 1 at kernel/irq/manage.c:1826
    free_irq+0x100/0x480
    [    3.355112 ] Modules linked in:
    [    3.355310 ] CPU: 0 PID: 1 Comm: swapper/0 Not tainted
    5.13.0-rc1-00144-g25a1298726e #13
    [    3.355816 ] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS
    rel-1.12.0-59-gc9ba5276e321-prebuilt.qemu.org 04/01/2014
    [    3.356552 ] RIP: 0010:free_irq+0x100/0x480
    [    3.356820 ] Code: 6e 08 74 6f 4d 89 f4 e8 5e ac 09 00 4d 8b 74 24 18
    4d 85 f6 75 e3 e8 4f ac 09 00 8b 75 c8 48 c7 c7 78 c1 2e 85 e8 e0 cf f5
    ff <0f> 0b 48 8b 75 c0 4c 89 ff e8 72 33 0b 03 48 8b 43 40 4c 8b a0 80
    [    3.358012 ] RSP: 0000:ffffc90000017b48 EFLAGS: 00010082
    [    3.358357 ] RAX: 0000000000000000 RBX: ffff888104dc8000 RCX:
    0000000000000000
    [    3.358814 ] RDX: ffff8881003c8000 RSI: ffffffff8124a9e6 RDI:
    00000000ffffffff
    [    3.359272 ] RBP: ffffc90000017b88 R08: 0000000000000000 R09:
    0000000000000000
    [    3.359732 ] R10: ffffc900000179f0 R11: 0000000000001d04 R12:
    0000000000000000
    [    3.360195 ] R13: ffff888107dc6000 R14: ffff888107dc6928 R15:
    ffff888104dc80a8
    [    3.360652 ] FS:  0000000000000000(0000) GS:ffff88817bc00000(0000)
    knlGS:0000000000000000
    [    3.361170 ] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [    3.361538 ] CR2: 0000000000000000 CR3: 000000000582e000 CR4:
    00000000000006f0
    [    3.362003 ] DR0: 0000000000000000 DR1: 0000000000000000 DR2:
    0000000000000000
    [    3.362175 ] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7:
    0000000000000400
    [    3.362175 ] Call Trace:
    [    3.362175 ]  nj_release+0x51/0x1e0
    [    3.362175 ]  nj_probe+0x450/0x950
    [    3.362175 ]  ? pci_device_remove+0x110/0x110
    [    3.362175 ]  local_pci_probe+0x45/0xa0
    [    3.362175 ]  pci_device_probe+0x12b/0x1d0
    [    3.362175 ]  really_probe+0x2a9/0x610
    [    3.362175 ]  driver_probe_device+0x90/0x1d0
    [    3.362175 ]  ? mutex_lock_nested+0x1b/0x20
    [    3.362175 ]  device_driver_attach+0x68/0x70
    [    3.362175 ]  __driver_attach+0x124/0x1b0
    [    3.362175 ]  ? device_driver_attach+0x70/0x70
    [    3.362175 ]  bus_for_each_dev+0xbb/0x110
    [    3.362175 ]  ? rdinit_setup+0x45/0x45
    [    3.362175 ]  driver_attach+0x27/0x30
    [    3.362175 ]  bus_add_driver+0x1eb/0x2a0
    [    3.362175 ]  driver_register+0xa9/0x180
    [    3.362175 ]  __pci_register_driver+0x82/0x90
    [    3.362175 ]  ? w6692_init+0x38/0x38
    [    3.362175 ]  nj_init+0x36/0x38
    [    3.362175 ]  do_one_initcall+0x7f/0x3d0
    [    3.362175 ]  ? rdinit_setup+0x45/0x45
    [    3.362175 ]  ? rcu_read_lock_sched_held+0x4f/0x80
    [    3.362175 ]  kernel_init_freeable+0x2aa/0x301
    [    3.362175 ]  ? rest_init+0x2c0/0x2c0
    [    3.362175 ]  kernel_init+0x18/0x190
    [    3.362175 ]  ? rest_init+0x2c0/0x2c0
    [    3.362175 ]  ? rest_init+0x2c0/0x2c0
    [    3.362175 ]  ret_from_fork+0x1f/0x30
    [    3.362175 ] Kernel panic - not syncing: panic_on_warn set ...
    [    3.362175 ] CPU: 0 PID: 1 Comm: swapper/0 Not tainted
    5.13.0-rc1-00144-g25a1298726e #13
    [    3.362175 ] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS
    rel-1.12.0-59-gc9ba5276e321-prebuilt.qemu.org 04/01/2014
    [    3.362175 ] Call Trace:
    [    3.362175 ]  dump_stack+0xba/0xf5
    [    3.362175 ]  ? free_irq+0x100/0x480
    [    3.362175 ]  panic+0x15a/0x3f2
    [    3.362175 ]  ? __warn+0xf2/0x150
    [    3.362175 ]  ? free_irq+0x100/0x480
    [    3.362175 ]  __warn+0x108/0x150
    [    3.362175 ]  ? free_irq+0x100/0x480
    [    3.362175 ]  report_bug+0x119/0x1c0
    [    3.362175 ]  handle_bug+0x3b/0x80
    [    3.362175 ]  exc_invalid_op+0x18/0x70
    [    3.362175 ]  asm_exc_invalid_op+0x12/0x20
    [    3.362175 ] RIP: 0010:free_irq+0x100/0x480
    [    3.362175 ] Code: 6e 08 74 6f 4d 89 f4 e8 5e ac 09 00 4d 8b 74 24 18
    4d 85 f6 75 e3 e8 4f ac 09 00 8b 75 c8 48 c7 c7 78 c1 2e 85 e8 e0 cf f5
    ff <0f> 0b 48 8b 75 c0 4c 89 ff e8 72 33 0b 03 48 8b 43 40 4c 8b a0 80
    [    3.362175 ] RSP: 0000:ffffc90000017b48 EFLAGS: 00010082
    [    3.362175 ] RAX: 0000000000000000 RBX: ffff888104dc8000 RCX:
    0000000000000000
    [    3.362175 ] RDX: ffff8881003c8000 RSI: ffffffff8124a9e6 RDI:
    00000000ffffffff
    [    3.362175 ] RBP: ffffc90000017b88 R08: 0000000000000000 R09:
    0000000000000000
    [    3.362175 ] R10: ffffc900000179f0 R11: 0000000000001d04 R12:
    0000000000000000
    [    3.362175 ] R13: ffff888107dc6000 R14: ffff888107dc6928 R15:
    ffff888104dc80a8
    [    3.362175 ]  ? vprintk+0x76/0x150
    [    3.362175 ]  ? free_irq+0x100/0x480
    [    3.362175 ]  nj_release+0x51/0x1e0
    [    3.362175 ]  nj_probe+0x450/0x950
    [    3.362175 ]  ? pci_device_remove+0x110/0x110
    [    3.362175 ]  local_pci_probe+0x45/0xa0
    [    3.362175 ]  pci_device_probe+0x12b/0x1d0
    [    3.362175 ]  really_probe+0x2a9/0x610
    [    3.362175 ]  driver_probe_device+0x90/0x1d0
    [    3.362175 ]  ? mutex_lock_nested+0x1b/0x20
    [    3.362175 ]  device_driver_attach+0x68/0x70
    [    3.362175 ]  __driver_attach+0x124/0x1b0
    [    3.362175 ]  ? device_driver_attach+0x70/0x70
    [    3.362175 ]  bus_for_each_dev+0xbb/0x110
    [    3.362175 ]  ? rdinit_setup+0x45/0x45
    [    3.362175 ]  driver_attach+0x27/0x30
    [    3.362175 ]  bus_add_driver+0x1eb/0x2a0
    [    3.362175 ]  driver_register+0xa9/0x180
    [    3.362175 ]  __pci_register_driver+0x82/0x90
    [    3.362175 ]  ? w6692_init+0x38/0x38
    [    3.362175 ]  nj_init+0x36/0x38
    [    3.362175 ]  do_one_initcall+0x7f/0x3d0
    [    3.362175 ]  ? rdinit_setup+0x45/0x45
    [    3.362175 ]  ? rcu_read_lock_sched_held+0x4f/0x80
    [    3.362175 ]  kernel_init_freeable+0x2aa/0x301
    [    3.362175 ]  ? rest_init+0x2c0/0x2c0
    [    3.362175 ]  kernel_init+0x18/0x190
    [    3.362175 ]  ? rest_init+0x2c0/0x2c0
    [    3.362175 ]  ? rest_init+0x2c0/0x2c0
    [    3.362175 ]  ret_from_fork+0x1f/0x30
    [    3.362175 ] Dumping ftrace buffer:
    [    3.362175 ]    (ftrace buffer empty)
    [    3.362175 ] Kernel Offset: disabled
    [    3.362175 ] Rebooting in 1 seconds..
    
    Reported-by: Zheyu Ma <zheyuma97@gmail.com>
    Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/isdn/hardware/mISDN/netjet.c b/drivers/isdn/hardware/mISDN/netjet.c
index 2b317cb63d06..448370da2c3f 100644
--- a/drivers/isdn/hardware/mISDN/netjet.c
+++ b/drivers/isdn/hardware/mISDN/netjet.c
@@ -1114,7 +1114,6 @@ nj_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 		card->typ = NETJET_S_TJ300;
 
 	card->base = pci_resource_start(pdev, 0);
-	card->irq = pdev->irq;
 	pci_set_drvdata(pdev, card);
 	err = setup_instance(card);
 	if (err)

commit a0ba7000f18f91340616a50d8e80fd4875ebcc61
Author: Zou Wei <zou_wei@huawei.com>
Date:   Wed May 12 11:12:25 2021 +0800

    ASoC: sti-sas: add missing MODULE_DEVICE_TABLE
    
    [ Upstream commit e072b2671606c77538d6a4dd5dda80b508cb4816 ]
    
    This patch adds missing MODULE_DEVICE_TABLE definition which generates
    correct modalias for automatic loading of this driver when it is built
    as an external module.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zou Wei <zou_wei@huawei.com>
    Link: https://lore.kernel.org/r/1620789145-14936-1-git-send-email-zou_wei@huawei.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/codecs/sti-sas.c b/sound/soc/codecs/sti-sas.c
index 7316c80b8179..27196126f710 100644
--- a/sound/soc/codecs/sti-sas.c
+++ b/sound/soc/codecs/sti-sas.c
@@ -411,6 +411,7 @@ static const struct of_device_id sti_sas_dev_match[] = {
 	},
 	{},
 };
+MODULE_DEVICE_TABLE(of, sti_sas_dev_match);
 
 static int sti_sas_driver_probe(struct platform_device *pdev)
 {

commit 16dd58543be1ff47b0324f0b2d2460e1ec4058a0
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Sat May 8 17:01:46 2021 +0200

    ASoC: Intel: bytcr_rt5640: Add quirk for the Lenovo Miix 3-830 tablet
    
    [ Upstream commit f0353e1f53f92f7b3da91e6669f5d58ee222ebe8 ]
    
    The Lenovo Miix 3-830 tablet has only 1 speaker, has an internal analog
    mic on IN1 and uses JD2 for jack-detect, add a quirk to automatically
    apply these settings on Lenovo Miix 3-830 tablets.
    
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Link: https://lore.kernel.org/r/20210508150146.28403-2-hdegoede@redhat.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c
index 077529113ee7..186c0ee059da 100644
--- a/sound/soc/intel/boards/bytcr_rt5640.c
+++ b/sound/soc/intel/boards/bytcr_rt5640.c
@@ -643,6 +643,20 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
 					BYT_RT5640_MONO_SPEAKER |
 					BYT_RT5640_MCLK_EN),
 	},
+	{	/* Lenovo Miix 3-830 */
+		.matches = {
+			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+			DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Lenovo MIIX 3-830"),
+		},
+		.driver_data = (void *)(BYT_RT5640_IN1_MAP |
+					BYT_RT5640_JD_SRC_JD2_IN4N |
+					BYT_RT5640_OVCD_TH_2000UA |
+					BYT_RT5640_OVCD_SF_0P75 |
+					BYT_RT5640_MONO_SPEAKER |
+					BYT_RT5640_DIFF_MIC |
+					BYT_RT5640_SSP0_AIF1 |
+					BYT_RT5640_MCLK_EN),
+	},
 	{	/* Linx Linx7 tablet */
 		.matches = {
 			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LINX"),

commit 232114ae43f683c394c8ee5decc67289989b1033
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Sat May 8 17:01:45 2021 +0200

    ASoC: Intel: bytcr_rt5640: Add quirk for the Glavey TM800A550L tablet
    
    [ Upstream commit 28c268d3acdd4cbcd2ac320b85609e77f84e74a7 ]
    
    Add a quirk for the Glavey TM800A550L tablet, this BYTCR tablet has no CHAN
    package in its ACPI tables and uses SSP0-AIF1 rather then SSP0-AIF2 which
    is the default for BYTCR devices.
    
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Acked-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Link: https://lore.kernel.org/r/20210508150146.28403-1-hdegoede@redhat.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c
index 4ebc023f1507..077529113ee7 100644
--- a/sound/soc/intel/boards/bytcr_rt5640.c
+++ b/sound/soc/intel/boards/bytcr_rt5640.c
@@ -565,6 +565,17 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
 					BYT_RT5640_SSP0_AIF1 |
 					BYT_RT5640_MCLK_EN),
 	},
+	{	/* Glavey TM800A550L */
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
+			DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"),
+			/* Above strings are too generic, also match on BIOS version */
+			DMI_MATCH(DMI_BIOS_VERSION, "ZY-8-BI-PX4S70VTR400-X423B-005-D"),
+		},
+		.driver_data = (void *)(BYTCR_INPUT_DEFAULTS |
+					BYT_RT5640_SSP0_AIF1 |
+					BYT_RT5640_MCLK_EN),
+	},
 	{
 		.matches = {
 			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),

commit ec72482564ff99c6832d33610d9f8ab7ecc81b6d
Author: Jeimon <jjjinmeng.zhou@gmail.com>
Date:   Sat May 8 11:52:30 2021 +0800

    net/nfc/rawsock.c: fix a permission check bug
    
    [ Upstream commit 8ab78863e9eff11910e1ac8bcf478060c29b379e ]
    
    The function rawsock_create() calls a privileged function sk_alloc(), which requires a ns-aware check to check net->user_ns, i.e., ns_capable(). However, the original code checks the init_user_ns using capable(). So we replace the capable() with ns_capable().
    
    Signed-off-by: Jeimon <jjjinmeng.zhou@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/nfc/rawsock.c b/net/nfc/rawsock.c
index 57a07ab80d92..bdc72737fe24 100644
--- a/net/nfc/rawsock.c
+++ b/net/nfc/rawsock.c
@@ -345,7 +345,7 @@ static int rawsock_create(struct net *net, struct socket *sock,
 		return -ESOCKTNOSUPPORT;
 
 	if (sock->type == SOCK_RAW) {
-		if (!capable(CAP_NET_RAW))
+		if (!ns_capable(net->user_ns, CAP_NET_RAW))
 			return -EPERM;
 		sock->ops = &rawsock_raw_ops;
 	} else {

commit 1f41b8f9577907fba56684231c7be89c8243d960
Author: Kees Cook <keescook@chromium.org>
Date:   Tue Jun 8 10:12:21 2021 -0700

    proc: Track /proc/$pid/attr/ opener mm_struct
    
    commit 591a22c14d3f45cc38bd1931c593c221df2f1881 upstream.
    
    Commit bfb819ea20ce ("proc: Check /proc/$pid/attr/ writes against file opener")
    tried to make sure that there could not be a confusion between the opener of
    a /proc/$pid/attr/ file and the writer. It used struct cred to make sure
    the privileges didn't change. However, there were existing cases where a more
    privileged thread was passing the opened fd to a differently privileged thread
    (during container setup). Instead, use mm_struct to track whether the opener
    and writer are still the same process. (This is what several other proc files
    already do, though for different reasons.)
    
    Reported-by: Christian Brauner <christian.brauner@ubuntu.com>
    Reported-by: Andrea Righi <andrea.righi@canonical.com>
    Tested-by: Andrea Righi <andrea.righi@canonical.com>
    Fixes: bfb819ea20ce ("proc: Check /proc/$pid/attr/ writes against file opener")
    Cc: stable@vger.kernel.org
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/proc/base.c b/fs/proc/base.c
index bc736ea1192a..9f331abc202d 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -2535,6 +2535,11 @@ static int proc_pident_readdir(struct file *file, struct dir_context *ctx,
 }
 
 #ifdef CONFIG_SECURITY
+static int proc_pid_attr_open(struct inode *inode, struct file *file)
+{
+	return __mem_open(inode, file, PTRACE_MODE_READ_FSCREDS);
+}
+
 static ssize_t proc_pid_attr_read(struct file * file, char __user * buf,
 				  size_t count, loff_t *ppos)
 {
@@ -2565,7 +2570,7 @@ static ssize_t proc_pid_attr_write(struct file * file, const char __user * buf,
 	int rv;
 
 	/* A task may only write when it was the opener. */
-	if (file->f_cred != current_real_cred())
+	if (file->private_data != current->mm)
 		return -EPERM;
 
 	rcu_read_lock();
@@ -2613,9 +2618,11 @@ static ssize_t proc_pid_attr_write(struct file * file, const char __user * buf,
 }
 
 static const struct file_operations proc_pid_attr_operations = {
+	.open		= proc_pid_attr_open,
 	.read		= proc_pid_attr_read,
 	.write		= proc_pid_attr_write,
 	.llseek		= generic_file_llseek,
+	.release	= mem_release,
 };
 
 static const struct pid_entry attr_dir_stuff[] = {

commit 2cdbfd6567203ee9cf37012be0342ee830028f09
Author: Peter Zijlstra <peterz@infradead.org>
Date:   Thu Mar 5 13:38:51 2020 +0100

    perf/core: Fix endless multiplex timer
    
    commit 90c91dfb86d0ff545bd329d3ddd72c147e2ae198 upstream.
    
    Kan and Andi reported that we fail to kill rotation when the flexible
    events go empty, but the context does not. XXX moar
    
    Fixes: fd7d55172d1e ("perf/cgroups: Don't rotate events for cgroups unnecessarily")
    Reported-by: Andi Kleen <ak@linux.intel.com>
    Reported-by: Kan Liang <kan.liang@linux.intel.com>
    Tested-by: Kan Liang <kan.liang@linux.intel.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Wen Yang <wenyang@linux.alibaba.com>
    Link: https://lkml.kernel.org/r/20200305123851.GX2596@hirez.programming.kicks-ass.net
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/events/core.c b/kernel/events/core.c
index d3be2cd57af1..2f3e892ffce3 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -2086,6 +2086,7 @@ __perf_remove_from_context(struct perf_event *event,
 
 	if (!ctx->nr_events && ctx->is_active) {
 		ctx->is_active = 0;
+		ctx->rotate_necessary = 0;
 		if (ctx->task) {
 			WARN_ON_ONCE(cpuctx->task_ctx != ctx);
 			cpuctx->task_ctx = NULL;
@@ -2952,12 +2953,6 @@ static void ctx_sched_out(struct perf_event_context *ctx,
 	if (!ctx->nr_active || !(is_active & EVENT_ALL))
 		return;
 
-	/*
-	 * If we had been multiplexing, no rotations are necessary, now no events
-	 * are active.
-	 */
-	ctx->rotate_necessary = 0;
-
 	perf_pmu_disable(ctx->pmu);
 	if (is_active & EVENT_PINNED) {
 		list_for_each_entry_safe(event, tmp, &ctx->pinned_active, active_list)
@@ -2967,6 +2962,13 @@ static void ctx_sched_out(struct perf_event_context *ctx,
 	if (is_active & EVENT_FLEXIBLE) {
 		list_for_each_entry_safe(event, tmp, &ctx->flexible_active, active_list)
 			group_sched_out(event, cpuctx, ctx);
+
+		/*
+		 * Since we cleared EVENT_FLEXIBLE, also clear
+		 * rotate_necessary, is will be reset by
+		 * ctx_flexible_sched_in() when needed.
+		 */
+		ctx->rotate_necessary = 0;
 	}
 	perf_pmu_enable(ctx->pmu);
 }
@@ -3705,6 +3707,12 @@ ctx_event_to_rotate(struct perf_event_context *ctx)
 				      typeof(*event), group_node);
 	}
 
+	/*
+	 * Unconditionally clear rotate_necessary; if ctx_flexible_sched_in()
+	 * finds there are unschedulable events, it will set it again.
+	 */
+	ctx->rotate_necessary = 0;
+
 	return event;
 }
 

commit 7e1053d00b8af3061a208e50958039a4b2a229a4
Author: Mark Huang <huangjc@rock-chips.com>
Date:   Thu Jun 10 08:53:29 2021 +0800

    usb: gadget: uvc: support nv12 format
    
    Change-Id: Iafa6bdb1540ef9f3ac766bf25e917a76069f942b
    Signed-off-by: Mark Huang <huangjc@rock-chips.com>

diff --git a/drivers/usb/gadget/function/uvc_v4l2.c b/drivers/usb/gadget/function/uvc_v4l2.c
index 93e1333bc98e..2fb819e56a38 100644
--- a/drivers/usb/gadget/function/uvc_v4l2.c
+++ b/drivers/usb/gadget/function/uvc_v4l2.c
@@ -58,6 +58,7 @@ struct uvc_format {
 
 static struct uvc_format uvc_formats[] = {
 	{ 16, V4L2_PIX_FMT_YUYV  },
+	{ 12, V4L2_PIX_FMT_NV12  },
 	{ 0,  V4L2_PIX_FMT_MJPEG },
 	{ 0,  V4L2_PIX_FMT_H264  },
 	{ 0,  V4L2_PIX_FMT_H265  },

commit 61892fa501ba17693c258f4c0de559f57ee5af6f
Author: Mark Huang <huangjc@rock-chips.com>
Date:   Sat Jun 5 11:10:05 2021 +0800

    usb: gadget: f_uvc: add device name for mult uvc
    
    Change-Id: Ib19bb07a70019e474f5268475cadbb194fc4288d
    Signed-off-by: Mark Huang <huangjc@rock-chips.com>

diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c
index 06e1f8180b1e..871da4462192 100644
--- a/drivers/usb/gadget/function/f_uvc.c
+++ b/drivers/usb/gadget/function/f_uvc.c
@@ -937,6 +937,9 @@ uvc_function_bind(struct usb_configuration *c, struct usb_function *f)
 		uvc_ss_bulk_streaming_ep.bEndpointAddress = address;
 	}
 
+	if (opts->device_name)
+		uvc_en_us_strings[UVC_STRING_CONTROL_IDX].s = opts->device_name;
+
 	us = usb_gstrings_attach(cdev, uvc_function_strings,
 				 ARRAY_SIZE(uvc_en_us_strings));
 	if (IS_ERR(us)) {
@@ -1051,6 +1054,13 @@ static void uvc_free_inst(struct usb_function_instance *f)
 	struct f_uvc_opts *opts = fi_to_f_uvc_opts(f);
 
 	mutex_destroy(&opts->lock);
+
+	if (opts->device_name_allocated) {
+		opts->device_name_allocated = false;
+		kfree(opts->device_name);
+		opts->device_name = NULL;
+	}
+
 	kfree(opts);
 }
 
diff --git a/drivers/usb/gadget/function/u_uvc.h b/drivers/usb/gadget/function/u_uvc.h
index 36894a77521b..cfa81bcd2de3 100644
--- a/drivers/usb/gadget/function/u_uvc.h
+++ b/drivers/usb/gadget/function/u_uvc.h
@@ -26,6 +26,8 @@ struct f_uvc_opts {
 	unsigned int					streaming_interval;
 	unsigned int					streaming_maxpacket;
 	unsigned int					streaming_maxburst;
+	bool						device_name_allocated;
+	const char					*device_name;
 
 	unsigned int					control_interface;
 	unsigned int					streaming_interface;
diff --git a/drivers/usb/gadget/function/uvc_configfs.c b/drivers/usb/gadget/function/uvc_configfs.c
index 403bd47d75df..2b34a7333302 100644
--- a/drivers/usb/gadget/function/uvc_configfs.c
+++ b/drivers/usb/gadget/function/uvc_configfs.c
@@ -2779,6 +2779,60 @@ UVCG_OPTS_ATTR(pm_qos_latency, pm_qos_latency, PM_QOS_LATENCY_ANY);
 
 #undef UVCG_OPTS_ATTR
 
+static ssize_t f_uvc_opts_device_name_show(struct config_item *item,
+					   char *page)
+{
+	struct f_uvc_opts *opts = to_f_uvc_opts(item);
+	int ret;
+
+	mutex_lock(&opts->lock);
+	ret = sprintf(page, "%s\n", opts->device_name ?: "");
+	mutex_unlock(&opts->lock);
+
+	return ret;
+}
+
+static ssize_t f_uvc_opts_device_name_store(struct config_item *item,
+					    const char *page, size_t len)
+{
+	struct f_uvc_opts *opts = to_f_uvc_opts(item);
+	const char *old_name;
+	char *name;
+	int ret;
+
+	if (strlen(page) < len)
+		return -EOVERFLOW;
+
+	mutex_lock(&opts->lock);
+	if (opts->refcnt) {
+		ret = -EBUSY;
+		goto unlock;
+	}
+
+	name = kstrdup(page, GFP_KERNEL);
+	if (!name) {
+		ret = -ENOMEM;
+		goto unlock;
+	}
+
+	if (name[len - 1] == '\n')
+		name[len - 1] = '\0';
+
+	old_name = opts->device_name;
+	opts->device_name = name;
+
+	if (opts->device_name_allocated)
+		kfree(old_name);
+
+	opts->device_name_allocated = true;
+	ret = len;
+unlock:
+	mutex_unlock(&opts->lock);
+
+	return ret;
+}
+UVC_ATTR(f_uvc_opts_, device_name, device_name);
+
 static struct configfs_attribute *uvc_attrs[] = {
 	&f_uvc_opts_attr_streaming_bulk,
 	&f_uvc_opts_attr_streaming_interval,
@@ -2786,6 +2840,7 @@ static struct configfs_attribute *uvc_attrs[] = {
 	&f_uvc_opts_attr_streaming_maxburst,
 	&f_uvc_opts_attr_uvc_num_request,
 	&f_uvc_opts_attr_pm_qos_latency,
+	&f_uvc_opts_attr_device_name,
 	NULL,
 };
 

commit 975c26b7d1a7bc801abe759c2024e5c80509b911
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Fri Jun 11 18:55:24 2021 +0800

    media: rockchip: isp: fix same frame id
    
    cur frame end and next frame start irq will
    togeter if v-blank is short. to handle sof
    event later if this happens.
    
    Change-Id: If45300c8f640a6516624c4952e4f124afd7a9952
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c
index 6f8768befb7d..c5ea7b434af9 100644
--- a/drivers/media/platform/rockchip/isp/rkisp.c
+++ b/drivers/media/platform/rockchip/isp/rkisp.c
@@ -2913,6 +2913,7 @@ void rkisp_isp_isr(unsigned int isp_mis,
 		ISP2X_3A_RAWHIST_CH1 | ISP2X_3A_RAWHIST_CH2 |
 		ISP2X_3A_RAWAF_SUM | ISP2X_3A_RAWAF_LUM |
 		ISP2X_3A_RAWAF | ISP2X_3A_RAWAWB;
+	bool sof_event_later = false;
 
 	/*
 	 * The last time that rx perform 'back read' don't clear done flag
@@ -2967,7 +2968,9 @@ void rkisp_isp_isr(unsigned int isp_mis,
 			}
 		}
 
-		if (dev->vs_irq < 0) {
+		if (isp_mis & CIF_ISP_FRAME)
+			sof_event_later = true;
+		if (dev->vs_irq < 0 && !sof_event_later) {
 			dev->isp_sdev.frm_timestamp = ktime_get_ns();
 			rkisp_isp_queue_event_sof(&dev->isp_sdev);
 		}
@@ -3073,6 +3076,12 @@ void rkisp_isp_isr(unsigned int isp_mis,
 	 */
 	rkisp_params_isr(&dev->params_vdev, isp_mis);
 
+	/* cur frame end and next frame start irq togeter */
+	if (dev->vs_irq < 0 && sof_event_later) {
+		dev->isp_sdev.frm_timestamp = ktime_get_ns();
+		rkisp_isp_queue_event_sof(&dev->isp_sdev);
+	}
+
 	if (isp_mis & CIF_ISP_FRAME_IN)
 		rkisp_check_idle(dev, ISP_FRAME_IN);
 	if (isp_mis & CIF_ISP_FRAME)

commit 2ced9f1e5a043818bb873cf5da126f4aee643086
Author: Elaine Zhang <zhangqing@rock-chips.com>
Date:   Tue Jun 15 11:29:09 2021 +0800

    regulator: gpio: support input supply
    
    Add input supply, to create power tree.
    
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    Change-Id: If67d2d545453b6b8e7d4e276ca5367bc8fb69dd1

diff --git a/drivers/regulator/gpio-regulator.c b/drivers/regulator/gpio-regulator.c
index b2f5ec4f658a..7c80202ed180 100644
--- a/drivers/regulator/gpio-regulator.c
+++ b/drivers/regulator/gpio-regulator.c
@@ -241,6 +241,9 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np,
 				 regtype);
 	}
 
+	if (of_find_property(np, "vin-supply", NULL))
+		config->input_supply = "vin";
+
 	return config;
 }
 
@@ -275,6 +278,18 @@ static int gpio_regulator_probe(struct platform_device *pdev)
 		return -ENOMEM;
 	}
 
+	if (config->input_supply) {
+		drvdata->desc.supply_name = devm_kstrdup(&pdev->dev,
+							 config->input_supply,
+							 GFP_KERNEL);
+		if (!drvdata->desc.supply_name) {
+			dev_err(&pdev->dev,
+				"Failed to allocate input supply\n");
+			ret = -ENOMEM;
+			goto err_name;
+		}
+	}
+
 	if (config->nr_gpios != 0) {
 		drvdata->gpios = kmemdup(config->gpios,
 					 config->nr_gpios * sizeof(struct gpio),
diff --git a/include/linux/regulator/gpio-regulator.h b/include/linux/regulator/gpio-regulator.h
index 19fbd267406d..ed9b69c0ee81 100644
--- a/include/linux/regulator/gpio-regulator.h
+++ b/include/linux/regulator/gpio-regulator.h
@@ -44,6 +44,7 @@ struct gpio_regulator_state {
 /**
  * struct gpio_regulator_config - config structure
  * @supply_name:	Name of the regulator supply
+ * @input_supply:	Name of the regulator input supply
  * @enable_gpio:	GPIO to use for enable control
  *			set to -EINVAL if not used
  * @enable_high:	Polarity of enable GPIO
@@ -68,6 +69,7 @@ struct gpio_regulator_state {
  */
 struct gpio_regulator_config {
 	const char *supply_name;
+	const char *input_supply;
 
 	int enable_gpio;
 	unsigned enable_high:1;

commit a91414049b8aa2d8c0b4ac614932e71d83ddf7a1
Author: Elaine Zhang <zhangqing@rock-chips.com>
Date:   Tue Jun 15 15:58:35 2021 +0800

    regulator: gpio: add vin-supply for DT
    
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    Change-Id: Ia06eb1548040e8c0a1dbe079d791a8bd95f06efa

diff --git a/Documentation/devicetree/bindings/regulator/gpio-regulator.txt b/Documentation/devicetree/bindings/regulator/gpio-regulator.txt
index 1f496159e2bb..9b4c5d027bcc 100644
--- a/Documentation/devicetree/bindings/regulator/gpio-regulator.txt
+++ b/Documentation/devicetree/bindings/regulator/gpio-regulator.txt
@@ -16,6 +16,7 @@ Optional properties:
 - enable-active-high	: Polarity of GPIO is active high (default is low).
 - regulator-type	: Specifies what is being regulated, must be either
 			  "voltage" or "current", defaults to voltage.
+- vin-supply		: Input supply name.
 
 Any property defined as part of the core regulator binding defined in
 regulator.txt can also be used.
@@ -40,4 +41,5 @@ Example:
 
 		startup-delay-us = <100000>;
 		enable-active-high;
+		vin-supply = <&parent_reg>;
 	};

commit 2e5bb20f4e9c24f68a3fdb09f11ce31e6653b567
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Fri Jun 4 15:34:10 2021 +0800

    media: rockchip: isp: hdr direct for isp21
    
    Change-Id: Ia5befcdf241c22fe29ca3a2c0298547c8b4d664f
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/csi.c b/drivers/media/platform/rockchip/isp/csi.c
index 7b78c5e316bb..3b21c63d3b16 100644
--- a/drivers/media/platform/rockchip/isp/csi.c
+++ b/drivers/media/platform/rockchip/isp/csi.c
@@ -294,6 +294,10 @@ static int csi_config(struct rkisp_csi_device *csi)
 		if (dev->hdr.op_mode == HDR_NORMAL &&
 		    (dev->isp_inp & INP_RAWRD2 || !dev->hw_dev->is_single))
 			dev->hdr.op_mode = HDR_RDBK_FRAME1;
+		/* HDR on the fly for isp21 */
+		if (dev->isp_ver == ISP_V21 && !(dev->isp_inp & INP_RAWRD2))
+			if (dev->hdr.op_mode == HDR_RDBK_FRAME2)
+				dev->hdr.op_mode = HDR_LINEX2_DDR;
 
 		/* op_mode update by mi_cfg_upd */
 		if (!dev->hw_dev->is_mi_update)

commit 3f26b0bdf1361b4c5686cedf5863bdb59bc71e52
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Tue Jun 15 13:56:06 2021 +0800

    arm64: dts: rockchip: rk3568-evb1-ddr4-v10: gc8034 add power-domains
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I23e83600160acbef7c917e316454a1b12756a56f

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi
index 7771177a5b00..69d5d7e1e980 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi
@@ -283,6 +283,7 @@
 		reset-gpios = <&gpio3 RK_PB6 GPIO_ACTIVE_LOW>;
 		pwdn-gpios = <&gpio4 RK_PB4 GPIO_ACTIVE_LOW>;
 		rockchip,grf = <&grf>;
+		power-domains = <&power RK3568_PD_VI>;
 		rockchip,camera-module-index = <0>;
 		rockchip,camera-module-facing = "back";
 		rockchip,camera-module-name = "RK-CMK-8M-2-v1";

commit 8aeb120bce0abf75e19fbe1b4edf1462daefab96
Author: shengfei Xu <xsf@rock-chips.com>
Date:   Tue Jun 8 10:01:20 2021 +0800

    arm64: dts: rockchip: config the pmic_sleep internal pull up/down for rk356x boards
    
    Signed-off-by: shengfei Xu <xsf@rock-chips.com>
    Change-Id: I7340b4e144c3de0f3cedcf1f4d0e7e12c6480955

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink.dts
index 060dc4e40174..b0216ae1583e 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink.dts
@@ -783,12 +783,12 @@
 
 		soc_slppin_gpio: soc_slppin_gpio {
 			rockchip,pins =
-				<0 RK_PA2 RK_FUNC_GPIO &pcfg_output_low>;
+				<0 RK_PA2 RK_FUNC_GPIO &pcfg_output_low_pull_down>;
 		};
 
 		soc_slppin_slp: soc_slppin_slp {
 			rockchip,pins =
-				<0 RK_PA2 1 &pcfg_pull_none>;
+				<0 RK_PA2 1 &pcfg_pull_up>;
 		};
 
 		soc_slppin_rst: soc_slppin_rst {
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-k108.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-k108.dts
index 6354ccfba93b..cb1ae9d2546c 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-k108.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-k108.dts
@@ -1067,12 +1067,12 @@
 
 		soc_slppin_gpio: soc_slppin_gpio {
 			rockchip,pins =
-				<0 RK_PA2 RK_FUNC_GPIO &pcfg_output_low>;
+				<0 RK_PA2 RK_FUNC_GPIO &pcfg_output_low_pull_down>;
 		};
 
 		soc_slppin_slp: soc_slppin_slp {
 			rockchip,pins =
-				<0 RK_PA2 1 &pcfg_pull_none>;
+				<0 RK_PA2 1 &pcfg_pull_up>;
 		};
 
 		soc_slppin_rst: soc_slppin_rst {
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-rkg11.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-rkg11.dts
index 85b39ecf9c79..d10c0bb3989b 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-rkg11.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-rkg11.dts
@@ -977,12 +977,12 @@
 
 		soc_slppin_gpio: soc_slppin_gpio {
 			rockchip,pins =
-				<0 RK_PA2 RK_FUNC_GPIO &pcfg_output_low>;
+				<0 RK_PA2 RK_FUNC_GPIO &pcfg_output_low_pull_down>;
 		};
 
 		soc_slppin_slp: soc_slppin_slp {
 			rockchip,pins =
-				<0 RK_PA2 1 &pcfg_pull_none>;
+				<0 RK_PA2 1 &pcfg_pull_up>;
 		};
 
 		soc_slppin_rst: soc_slppin_rst {
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-v10.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-v10.dts
index fecea6b9173b..ca412b19378c 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-v10.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-v10.dts
@@ -997,12 +997,12 @@
 
 		soc_slppin_gpio: soc_slppin_gpio {
 			rockchip,pins =
-				<0 RK_PA2 RK_FUNC_GPIO &pcfg_output_low>;
+				<0 RK_PA2 RK_FUNC_GPIO &pcfg_output_low_pull_down>;
 		};
 
 		soc_slppin_slp: soc_slppin_slp {
 			rockchip,pins =
-				<0 RK_PA2 1 &pcfg_pull_none>;
+				<0 RK_PA2 1 &pcfg_pull_up>;
 		};
 
 		soc_slppin_rst: soc_slppin_rst {
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet.dts
index af52a084ac7d..ebb0feecbe02 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet.dts
@@ -999,12 +999,12 @@
 
 		soc_slppin_gpio: soc_slppin_gpio {
 			rockchip,pins =
-				<0 RK_PA2 RK_FUNC_GPIO &pcfg_output_low>;
+				<0 RK_PA2 RK_FUNC_GPIO &pcfg_output_low_pull_down>;
 		};
 
 		soc_slppin_slp: soc_slppin_slp {
 			rockchip,pins =
-				<0 RK_PA2 1 &pcfg_pull_none>;
+				<0 RK_PA2 1 &pcfg_pull_up>;
 		};
 
 		soc_slppin_rst: soc_slppin_rst {
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
index 5dd51ee7e7aa..cbb3189cc19d 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
@@ -1449,12 +1449,12 @@
 
 		soc_slppin_gpio: soc_slppin_gpio {
 			rockchip,pins =
-				<0 RK_PA2 RK_FUNC_GPIO &pcfg_output_low>;
+				<0 RK_PA2 RK_FUNC_GPIO &pcfg_output_low_pull_down>;
 		};
 
 		soc_slppin_slp: soc_slppin_slp {
 			rockchip,pins =
-				<0 RK_PA2 1 &pcfg_pull_none>;
+				<0 RK_PA2 1 &pcfg_pull_up>;
 		};
 
 		soc_slppin_rst: soc_slppin_rst {

commit 0941cc698b2ee83d6cfee1881f39459c4e4ac2e5
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Tue Jun 15 11:38:13 2021 +0800

    drm/rockchip: ebc_dev: release version v2.01
    
    remove ebc On/off notify
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: Ie5f807bfda79af9be3b76aa5db616c85f4180b1d

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index 80020268bc4a..da665bac676c 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -589,17 +589,17 @@ ebc_resume:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-.LBB906:
-.LBB907:
+.LBB910:
+.LBB911:
 	.file 2 "./include/linux/device.h"
 	.loc 2 1181 0
 	ldr	x19, [x0, 184]
-.LBE907:
-.LBE906:
+.LBE911:
+.LBE910:
 	.loc 1 2069 0
 	ldr	x1, [x19, 16]
-.LBB908:
-.LBB909:
+.LBB912:
+.LBB913:
 	.file 3 "drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic.h"
 	.loc 3 45 0
 	mov	x0, x1
@@ -607,8 +607,8 @@ ebc_resume:
 	ldr	x1, [x1, 48]
 	blr	x1
 .LVL37:
-.LBE909:
-.LBE908:
+.LBE913:
+.LBE912:
 	.loc 1 2070 0
 	str	wzr, [x19, 780]
 	.loc 1 2071 0
@@ -652,25 +652,25 @@ ebc_vdd_power_timeout:
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-.LBB910:
-.LBB911:
+.LBB914:
+.LBB915:
 	.file 4 "./include/linux/wakelock.h"
 	.loc 4 68 0
 	add	x0, x0, 400
-.LBE911:
-.LBE910:
+.LBE915:
+.LBE914:
 	.loc 1 1256 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	.loc 1 1260 0
 	str	wzr, [x0, 208]
-.LBB913:
-.LBB912:
+.LBB917:
+.LBB916:
 	.loc 4 68 0
 	bl	__pm_relax
 .LVL41:
-.LBE912:
-.LBE913:
+.LBE916:
+.LBE917:
 	.loc 1 1265 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -854,13 +854,13 @@ ebc_io_ctl:
 	bl	ebc_phy_buf_base_get
 .LVL53:
 	sub	w0, w20, w0
-.LBB914:
-.LBB915:
-.LBB916:
-.LBB917:
 .LBB918:
 .LBB919:
 .LBB920:
+.LBB921:
+.LBB922:
+.LBB923:
+.LBB924:
 	.file 5 "./arch/arm64/include/asm/current.h"
 	.loc 5 19 0
 #APP
@@ -869,27 +869,27 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL54:
 #NO_APP
-.LBE920:
-.LBE919:
+.LBE924:
+.LBE923:
 	.file 6 "./arch/arm64/include/asm/uaccess.h"
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
+.LBE922:
+.LBE921:
+.LBE920:
+.LBE919:
 .LBE918:
-.LBE917:
-.LBE916:
-.LBE915:
-.LBE914:
 	.loc 1 1525 0
 	ldp	w1, w4, [x22, 84]
 	.loc 1 1524 0
 	str	w0, [x29, 104]
 	.loc 1 1526 0
 	stp	w4, w1, [x29, 112]
-.LBB945:
-.LBB942:
-.LBB939:
-.LBB929:
-.LBB927:
+.LBB949:
+.LBB946:
+.LBB943:
+.LBB933:
+.LBB931:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL55:
@@ -897,47 +897,47 @@ ebc_io_ctl:
 	tbnz	x3, 21, .L149
 .LVL56:
 .L215:
-.LBB921:
-.LBB922:
-.LBB923:
+.LBB925:
+.LBB926:
+.LBB927:
 	.file 7 "./include/asm-generic/bitops/non-atomic.h"
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL57:
-.LBE923:
-.LBE922:
-.LBE921:
 .LBE927:
-.LBE929:
-.LBE939:
-.LBE942:
-.LBE945:
+.LBE926:
+.LBE925:
+.LBE931:
+.LBE933:
+.LBE943:
+.LBE946:
+.LBE949:
 	.loc 1 1342 0
 	mov	x0, x21
 .LVL58:
-.LBB946:
-.LBB943:
-.LBB940:
-.LBB930:
-.LBB928:
+.LBB950:
+.LBB947:
+.LBB944:
+.LBB934:
+.LBB932:
 	.loc 6 84 0
 	tbz	x2, 26, .L150
 .LVL59:
 .L149:
-.LBB924:
-.LBB925:
-.LBB926:
+.LBB928:
+.LBB929:
+.LBB930:
 	.file 8 "./include/linux/bitops.h"
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL60:
-.LBE926:
-.LBE925:
+.LBE930:
+.LBE929:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL61:
 .L150:
-.LBE924:
+.LBE928:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -950,16 +950,16 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL62:
 #NO_APP
-.LBE928:
-.LBE930:
+.LBE932:
+.LBE934:
 	.file 9 "./include/linux/uaccess.h"
 	.loc 9 132 0
 	mov	x22, 44
 	cbnz	x0, .L223
 .L151:
-.LBE940:
-.LBE943:
-.LBE946:
+.LBE944:
+.LBE947:
+.LBE950:
 	.loc 1 1528 0
 	mov	x0, x23
 .LVL63:
@@ -1050,13 +1050,13 @@ ebc_io_ctl:
 	mov	w0, 28673
 	cmp	w1, w0
 	bne	.L91
-.LBB947:
-.LBB948:
-.LBB949:
-.LBB950:
 .LBB951:
 .LBB952:
 .LBB953:
+.LBB954:
+.LBB955:
+.LBB956:
+.LBB957:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1064,8 +1064,8 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL75:
 #NO_APP
-.LBE953:
-.LBE952:
+.LBE957:
+.LBE956:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
@@ -1075,19 +1075,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L226
 .LVL77:
 .L117:
-.LBB954:
-.LBB955:
-.LBB956:
+.LBB958:
+.LBB959:
+.LBB960:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL78:
-.LBE956:
-.LBE955:
+.LBE960:
+.LBE959:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL79:
 .L118:
-.LBE954:
+.LBE958:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1100,23 +1100,23 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL80:
 #NO_APP
-.LBE951:
-.LBE950:
+.LBE955:
+.LBE954:
 	.loc 9 114 0
 	cbz	x0, .L120
-.LBB962:
-.LBB963:
-.LBB964:
-.LBB965:
 .LBB966:
+.LBB967:
+.LBB968:
+.LBB969:
+.LBB970:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL81:
-.LBE966:
-.LBE965:
-.LBE964:
-.LBB967:
-.LBB968:
+.LBE970:
+.LBE969:
+.LBE968:
+.LBB971:
+.LBB972:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1124,13 +1124,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL82:
 #NO_APP
-.LBE968:
-.LBE967:
-.LBB969:
+.LBE972:
+.LBE971:
+.LBB973:
 	.loc 6 254 0
 	and	x0, x0, x21
 .LVL83:
-.LBE969:
+.LBE973:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1145,8 +1145,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE963:
-.LBE962:
+.LBE967:
+.LBE966:
 	.loc 9 116 0
 	mov	x2, 44
 	add	x0, x29, 104
@@ -1155,9 +1155,9 @@ ebc_io_ctl:
 .LVL86:
 	.loc 9 118 0
 	cbnz	x0, .L120
-.LBE949:
-.LBE948:
-.LBE947:
+.LBE953:
+.LBE952:
+.LBE951:
 	.loc 1 1405 0
 	bl	ebc_phy_buf_base_get
 .LVL87:
@@ -1202,15 +1202,15 @@ ebc_io_ctl:
 	.loc 1 1422 0 is_stmt 1
 	mov	w0, 1
 	str	w0, [x20, 188]
-.LBB976:
-.LBB977:
+.LBB980:
+.LBB981:
 	.loc 1 1423 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
 .LVL91:
 	adrp	x0, .LANCHOR1
-.LBB978:
+.LBB982:
 	add	x0, x0, :lo12:.LANCHOR1
 	add	x21, x0, 328
 	b	.L128
@@ -1231,7 +1231,7 @@ ebc_io_ctl:
 .LVL94:
 	ldr	w1, [x20, 188]
 	cbnz	w1, .L229
-.LBE978:
+.LBE982:
 	.loc 1 1423 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
@@ -1244,8 +1244,8 @@ ebc_io_ctl:
 .LVL96:
 	.p2align 3
 .L104:
-.LBE977:
-.LBE976:
+.LBE981:
+.LBE980:
 	.loc 1 1506 0 is_stmt 1
 	bl	ebc_empty_buf_get
 .LVL97:
@@ -1269,13 +1269,13 @@ ebc_io_ctl:
 	mov	w0, 28679
 	cmp	w1, w0
 	bne	.L91
-.LBB982:
-.LBB983:
-.LBB984:
-.LBB985:
 .LBB986:
 .LBB987:
 .LBB988:
+.LBB989:
+.LBB990:
+.LBB991:
+.LBB992:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1283,8 +1283,8 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL99:
 #NO_APP
-.LBE988:
-.LBE987:
+.LBE992:
+.LBE991:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
@@ -1294,19 +1294,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L230
 .LVL101:
 .L129:
-.LBB989:
-.LBB990:
-.LBB991:
+.LBB993:
+.LBB994:
+.LBB995:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL102:
-.LBE991:
-.LBE990:
+.LBE995:
+.LBE994:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL103:
 .L130:
-.LBE989:
+.LBE993:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1319,23 +1319,23 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL104:
 #NO_APP
-.LBE986:
-.LBE985:
+.LBE990:
+.LBE989:
 	.loc 9 114 0
 	cbz	x0, .L120
-.LBB997:
-.LBB998:
-.LBB999:
-.LBB1000:
 .LBB1001:
+.LBB1002:
+.LBB1003:
+.LBB1004:
+.LBB1005:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL105:
-.LBE1001:
-.LBE1000:
-.LBE999:
-.LBB1002:
-.LBB1003:
+.LBE1005:
+.LBE1004:
+.LBE1003:
+.LBB1006:
+.LBB1007:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1343,13 +1343,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL106:
 #NO_APP
-.LBE1003:
-.LBE1002:
-.LBB1004:
+.LBE1007:
+.LBE1006:
+.LBB1008:
 	.loc 6 254 0
 	and	x0, x0, x21
 .LVL107:
-.LBE1004:
+.LBE1008:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1364,8 +1364,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE998:
-.LBE997:
+.LBE1002:
+.LBE1001:
 	.loc 9 116 0
 	mov	x2, 44
 	add	x0, x29, 104
@@ -1374,9 +1374,9 @@ ebc_io_ctl:
 .LVL110:
 	.loc 9 118 0
 	cbnz	x0, .L120
-.LBE984:
-.LBE983:
-.LBE982:
+.LBE988:
+.LBE987:
+.LBE986:
 	.loc 1 1432 0
 	bl	ebc_osd_buf_clone
 .LVL111:
@@ -1418,22 +1418,22 @@ ebc_io_ctl:
 .LVL114:
 	.p2align 3
 .L223:
-.LBB1011:
-.LBB944:
-.LBB941:
-.LBB931:
-.LBB932:
-.LBB933:
-.LBB934:
+.LBB1015:
+.LBB948:
+.LBB945:
 .LBB935:
+.LBB936:
+.LBB937:
+.LBB938:
+.LBB939:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL115:
-.LBE935:
-.LBE934:
-.LBE933:
-.LBB936:
-.LBB937:
+.LBE939:
+.LBE938:
+.LBE937:
+.LBB940:
+.LBB941:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1441,13 +1441,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL116:
 #NO_APP
-.LBE937:
-.LBE936:
-.LBB938:
+.LBE941:
+.LBE940:
+.LBB942:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL117:
-.LBE938:
+.LBE942:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL118:
@@ -1463,8 +1463,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE932:
-.LBE931:
+.LBE936:
+.LBE935:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
@@ -1476,9 +1476,9 @@ ebc_io_ctl:
 .LVL122:
 	.p2align 3
 .L102:
-.LBE941:
-.LBE944:
-.LBE1011:
+.LBE945:
+.LBE948:
+.LBE1015:
 	.loc 1 1369 0
 	bl	ebc_osd_buf_get
 .LVL123:
@@ -1488,13 +1488,13 @@ ebc_io_ctl:
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL124:
-.LBB1012:
-.LBB1013:
-.LBB1014:
-.LBB1015:
 .LBB1016:
 .LBB1017:
 .LBB1018:
+.LBB1019:
+.LBB1020:
+.LBB1021:
+.LBB1022:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1502,15 +1502,15 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL125:
 #NO_APP
-.LBE1018:
-.LBE1017:
+.LBE1022:
+.LBE1021:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
+.LBE1020:
+.LBE1019:
+.LBE1018:
+.LBE1017:
 .LBE1016:
-.LBE1015:
-.LBE1014:
-.LBE1013:
-.LBE1012:
 	.loc 1 1373 0
 	sub	w0, w22, w0
 	.loc 1 1378 0
@@ -1523,11 +1523,11 @@ ebc_io_ctl:
 	str	w1, [x29, 120]
 	.loc 1 1375 0
 	str	w0, [x29, 104]
-.LBB1045:
-.LBB1042:
-.LBB1039:
-.LBB1028:
-.LBB1025:
+.LBB1049:
+.LBB1046:
+.LBB1043:
+.LBB1032:
+.LBB1029:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL126:
@@ -1535,19 +1535,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L231
 .LVL127:
 .L108:
-.LBB1019:
-.LBB1020:
-.LBB1021:
+.LBB1023:
+.LBB1024:
+.LBB1025:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL128:
-.LBE1021:
-.LBE1020:
+.LBE1025:
+.LBE1024:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL129:
 .L109:
-.LBE1019:
+.LBE1023:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1560,24 +1560,24 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL130:
 #NO_APP
-.LBE1025:
-.LBE1028:
+.LBE1029:
+.LBE1032:
 	.loc 9 132 0
 	mov	x22, 44
 	cbz	x0, .L87
-.LBB1029:
-.LBB1030:
-.LBB1031:
-.LBB1032:
 .LBB1033:
+.LBB1034:
+.LBB1035:
+.LBB1036:
+.LBB1037:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL131:
-.LBE1033:
-.LBE1032:
-.LBE1031:
-.LBB1034:
-.LBB1035:
+.LBE1037:
+.LBE1036:
+.LBE1035:
+.LBB1038:
+.LBB1039:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1585,13 +1585,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL132:
 #NO_APP
-.LBE1035:
-.LBE1034:
-.LBB1036:
+.LBE1039:
+.LBE1038:
+.LBB1040:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL133:
-.LBE1036:
+.LBE1040:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL134:
@@ -1607,8 +1607,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1030:
-.LBE1029:
+.LBE1034:
+.LBE1033:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
@@ -1620,16 +1620,16 @@ ebc_io_ctl:
 .LVL138:
 	.p2align 3
 .L98:
-.LBE1039:
-.LBE1042:
-.LBE1045:
-.LBB1046:
-.LBB1047:
-.LBB1048:
-.LBB1049:
+.LBE1043:
+.LBE1046:
+.LBE1049:
 .LBB1050:
 .LBB1051:
 .LBB1052:
+.LBB1053:
+.LBB1054:
+.LBB1055:
+.LBB1056:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1637,22 +1637,22 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL139:
 #NO_APP
-.LBE1052:
-.LBE1051:
+.LBE1056:
+.LBE1055:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
+.LBE1054:
+.LBE1053:
+.LBE1052:
+.LBE1051:
 .LBE1050:
-.LBE1049:
-.LBE1048:
-.LBE1047:
-.LBE1046:
 	.loc 1 1459 0
 	add	x22, x20, 232
+.LBB1085:
 .LBB1081:
 .LBB1077:
-.LBB1073:
-.LBB1062:
-.LBB1059:
+.LBB1066:
+.LBB1063:
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
 .LVL140:
@@ -1660,19 +1660,19 @@ ebc_io_ctl:
 	tbz	x2, 21, .L232
 .LVL141:
 .L132:
-.LBB1053:
-.LBB1054:
-.LBB1055:
+.LBB1057:
+.LBB1058:
+.LBB1059:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL142:
-.LBE1055:
-.LBE1054:
+.LBE1059:
+.LBE1058:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL143:
 .L133:
-.LBE1053:
+.LBE1057:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1686,22 +1686,22 @@ ebc_io_ctl:
 .LVL144:
 #NO_APP
 	mov	x3, x0
-.LBE1059:
-.LBE1062:
+.LBE1063:
+.LBE1066:
 	.loc 9 114 0
 	cbz	x0, .L161
-.LBB1063:
-.LBB1064:
-.LBB1065:
-.LBB1066:
 .LBB1067:
-	.loc 8 157 0
-	sbfx	x0, x21, 0, 56
-.LBE1067:
-.LBE1066:
-.LBE1065:
 .LBB1068:
 .LBB1069:
+.LBB1070:
+.LBB1071:
+	.loc 8 157 0
+	sbfx	x0, x21, 0, 56
+.LBE1071:
+.LBE1070:
+.LBE1069:
+.LBB1072:
+.LBB1073:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1709,13 +1709,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL145:
 #NO_APP
-.LBE1069:
-.LBE1068:
-.LBB1070:
+.LBE1073:
+.LBE1072:
+.LBB1074:
 	.loc 6 254 0
 	and	x0, x0, x21
 .LVL146:
-.LBE1070:
+.LBE1074:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1730,8 +1730,8 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1064:
-.LBE1063:
+.LBE1068:
+.LBE1067:
 	.loc 9 116 0
 	mov	x2, 4
 	mov	x0, x22
@@ -1740,9 +1740,9 @@ ebc_io_ctl:
 .LVL149:
 	.loc 9 118 0
 	cbnz	x0, .L233
-.LBE1073:
 .LBE1077:
 .LBE1081:
+.LBE1085:
 	.loc 1 1463 0
 	add	x20, x20, 184
 	ldr	w2, [x20, 48]
@@ -1815,13 +1815,13 @@ ebc_io_ctl:
 	bl	ebc_phy_buf_base_get
 .LVL160:
 	sub	w0, w20, w0
-.LBB1082:
-.LBB1083:
-.LBB1084:
-.LBB1085:
 .LBB1086:
 .LBB1087:
 .LBB1088:
+.LBB1089:
+.LBB1090:
+.LBB1091:
+.LBB1092:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1829,26 +1829,26 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL161:
 #NO_APP
-.LBE1088:
-.LBE1087:
+.LBE1092:
+.LBE1091:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
+.LBE1090:
+.LBE1089:
+.LBE1088:
+.LBE1087:
 .LBE1086:
-.LBE1085:
-.LBE1084:
-.LBE1083:
-.LBE1082:
 	.loc 1 1487 0
 	ldp	w4, w1, [x22, 84]
 	.loc 1 1485 0
 	str	w0, [x29, 104]
 	.loc 1 1486 0
 	stp	w1, w4, [x29, 112]
+.LBB1097:
+.LBB1096:
+.LBB1095:
+.LBB1094:
 .LBB1093:
-.LBB1092:
-.LBB1091:
-.LBB1090:
-.LBB1089:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL162:
@@ -1858,18 +1858,18 @@ ebc_io_ctl:
 .LVL163:
 	.p2align 3
 .L94:
-.LBE1089:
-.LBE1090:
-.LBE1091:
-.LBE1092:
 .LBE1093:
-.LBB1094:
-.LBB1095:
-.LBB1096:
-.LBB1097:
+.LBE1094:
+.LBE1095:
+.LBE1096:
+.LBE1097:
 .LBB1098:
 .LBB1099:
 .LBB1100:
+.LBB1101:
+.LBB1102:
+.LBB1103:
+.LBB1104:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1877,15 +1877,15 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL164:
 #NO_APP
-.LBE1100:
-.LBE1099:
+.LBE1104:
+.LBE1103:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
+.LBE1102:
+.LBE1101:
+.LBE1100:
+.LBE1099:
 .LBE1098:
-.LBE1097:
-.LBE1096:
-.LBE1095:
-.LBE1094:
 	.loc 1 1470 0
 	ldp	w1, w0, [x20, 116]
 .LVL165:
@@ -1897,11 +1897,11 @@ ebc_io_ctl:
 	.loc 1 1468 0
 	ldr	w4, [x20, 176]
 	str	w4, [x29, 120]
+.LBB1133:
 .LBB1129:
 .LBB1125:
-.LBB1121:
-.LBB1110:
-.LBB1107:
+.LBB1114:
+.LBB1111:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL166:
@@ -1909,19 +1909,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L234
 .LVL167:
 .L136:
-.LBB1101:
-.LBB1102:
-.LBB1103:
+.LBB1105:
+.LBB1106:
+.LBB1107:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL168:
-.LBE1103:
-.LBE1102:
+.LBE1107:
+.LBE1106:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL169:
 .L137:
-.LBE1101:
+.LBE1105:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1934,14 +1934,14 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL170:
 #NO_APP
-.LBE1107:
-.LBE1110:
+.LBE1111:
+.LBE1114:
 	.loc 9 132 0
 	cbnz	x0, .L138
 .L139:
-.LBE1121:
 .LBE1125:
 .LBE1129:
+.LBE1133:
 	.loc 1 1473 0
 	ldr	x0, [x20, 272]
 .LVL171:
@@ -1985,13 +1985,13 @@ ebc_io_ctl:
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL179:
-.LBB1130:
-.LBB1131:
-.LBB1132:
-.LBB1133:
 .LBB1134:
 .LBB1135:
 .LBB1136:
+.LBB1137:
+.LBB1138:
+.LBB1139:
+.LBB1140:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -1999,15 +1999,15 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL180:
 #NO_APP
-.LBE1136:
-.LBE1135:
+.LBE1140:
+.LBE1139:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
+.LBE1138:
+.LBE1137:
+.LBE1136:
+.LBE1135:
 .LBE1134:
-.LBE1133:
-.LBE1132:
-.LBE1131:
-.LBE1130:
 	.loc 1 1387 0
 	sub	w0, w22, w0
 	.loc 1 1392 0
@@ -2020,11 +2020,11 @@ ebc_io_ctl:
 	str	w1, [x29, 120]
 	.loc 1 1389 0
 	str	w0, [x29, 104]
+.LBB1169:
 .LBB1165:
 .LBB1161:
-.LBB1157:
-.LBB1146:
-.LBB1143:
+.LBB1150:
+.LBB1147:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
 .LVL181:
@@ -2032,19 +2032,19 @@ ebc_io_ctl:
 	tbz	x3, 21, .L235
 .LVL182:
 .L113:
-.LBB1137:
-.LBB1138:
-.LBB1139:
+.LBB1141:
+.LBB1142:
+.LBB1143:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
 .LVL183:
-.LBE1139:
-.LBE1138:
+.LBE1143:
+.LBE1142:
 	.loc 6 86 0
 	and	x0, x0, x21
 .LVL184:
 .L114:
-.LBE1137:
+.LBE1141:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2057,14 +2057,14 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL185:
 #NO_APP
-.LBE1143:
-.LBE1146:
+.LBE1147:
+.LBE1150:
 	.loc 9 132 0
 	cbnz	x0, .L115
 .L116:
-.LBE1157:
 .LBE1161:
 .LBE1165:
+.LBE1169:
 	.loc 1 1396 0
 	mov	x0, x23
 .LVL186:
@@ -2078,247 +2078,247 @@ ebc_io_ctl:
 .LVL188:
 	.p2align 3
 .L230:
-.LBB1166:
+.LBB1170:
+.LBB1013:
+.LBB1011:
 .LBB1009:
-.LBB1007:
-.LBB1005:
-.LBB995:
-.LBB992:
-.LBB993:
-.LBB994:
+.LBB999:
+.LBB996:
+.LBB997:
+.LBB998:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE994:
-.LBE993:
-.LBE992:
-.LBE995:
-.LBE1005:
-.LBE1007:
+.LBE998:
+.LBE997:
+.LBE996:
+.LBE999:
 .LBE1009:
-.LBE1166:
+.LBE1011:
+.LBE1013:
+.LBE1170:
 	.loc 1 1342 0
 	mov	x0, x21
 .LVL189:
-.LBB1167:
+.LBB1171:
+.LBB1014:
+.LBB1012:
 .LBB1010:
-.LBB1008:
-.LBB1006:
-.LBB996:
+.LBB1000:
 	.loc 6 84 0
 	tbz	x2, 26, .L130
 	b	.L129
 .LVL190:
 	.p2align 3
 .L226:
-.LBE996:
-.LBE1006:
-.LBE1008:
+.LBE1000:
 .LBE1010:
-.LBE1167:
-.LBB1168:
+.LBE1012:
+.LBE1014:
+.LBE1171:
+.LBB1172:
+.LBB978:
+.LBB976:
 .LBB974:
-.LBB972:
-.LBB970:
-.LBB960:
-.LBB957:
-.LBB958:
-.LBB959:
+.LBB964:
+.LBB961:
+.LBB962:
+.LBB963:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE959:
-.LBE958:
-.LBE957:
-.LBE960:
-.LBE970:
-.LBE972:
+.LBE963:
+.LBE962:
+.LBE961:
+.LBE964:
 .LBE974:
-.LBE1168:
+.LBE976:
+.LBE978:
+.LBE1172:
 	.loc 1 1342 0
 	mov	x0, x21
 .LVL191:
-.LBB1169:
+.LBB1173:
+.LBB979:
+.LBB977:
 .LBB975:
-.LBB973:
-.LBB971:
-.LBB961:
+.LBB965:
 	.loc 6 84 0
 	tbz	x2, 26, .L118
 	b	.L117
 .LVL192:
 	.p2align 3
 .L234:
-.LBE961:
-.LBE971:
-.LBE973:
+.LBE965:
 .LBE975:
-.LBE1169:
-.LBB1170:
+.LBE977:
+.LBE979:
+.LBE1173:
+.LBB1174:
+.LBB1130:
 .LBB1126:
-.LBB1122:
-.LBB1111:
+.LBB1115:
+.LBB1112:
 .LBB1108:
-.LBB1104:
-.LBB1105:
-.LBB1106:
+.LBB1109:
+.LBB1110:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL193:
-.LBE1106:
-.LBE1105:
-.LBE1104:
+.LBE1110:
+.LBE1109:
 .LBE1108:
-.LBE1111:
-.LBE1122:
+.LBE1112:
+.LBE1115:
 .LBE1126:
-.LBE1170:
+.LBE1130:
+.LBE1174:
 	.loc 1 1342 0
 	mov	x0, x21
 .LVL194:
-.LBB1171:
+.LBB1175:
+.LBB1131:
 .LBB1127:
-.LBB1123:
-.LBB1112:
-.LBB1109:
+.LBB1116:
+.LBB1113:
 	.loc 6 84 0
 	tbz	x2, 26, .L137
 	b	.L136
 .LVL195:
 	.p2align 3
 .L232:
-.LBE1109:
-.LBE1112:
-.LBE1123:
+.LBE1113:
+.LBE1116:
 .LBE1127:
-.LBE1171:
-.LBB1172:
+.LBE1131:
+.LBE1175:
+.LBB1176:
+.LBB1082:
 .LBB1078:
-.LBB1074:
-.LBB1071:
+.LBB1075:
+.LBB1064:
 .LBB1060:
-.LBB1056:
-.LBB1057:
-.LBB1058:
+.LBB1061:
+.LBB1062:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE1058:
-.LBE1057:
-.LBE1056:
+.LBE1062:
+.LBE1061:
 .LBE1060:
-.LBE1071:
-.LBE1074:
+.LBE1064:
+.LBE1075:
 .LBE1078:
-.LBE1172:
+.LBE1082:
+.LBE1176:
 	.loc 1 1342 0
 	mov	x0, x21
 .LVL196:
-.LBB1173:
+.LBB1177:
+.LBB1083:
 .LBB1079:
-.LBB1075:
-.LBB1072:
-.LBB1061:
+.LBB1076:
+.LBB1065:
 	.loc 6 84 0
 	tbz	x2, 26, .L133
 	b	.L132
 .LVL197:
 	.p2align 3
 .L235:
-.LBE1061:
-.LBE1072:
-.LBE1075:
+.LBE1065:
+.LBE1076:
 .LBE1079:
-.LBE1173:
-.LBB1174:
+.LBE1083:
+.LBE1177:
+.LBB1178:
+.LBB1166:
 .LBB1162:
-.LBB1158:
-.LBB1147:
+.LBB1151:
+.LBB1148:
 .LBB1144:
-.LBB1140:
-.LBB1141:
-.LBB1142:
+.LBB1145:
+.LBB1146:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL198:
-.LBE1142:
-.LBE1141:
-.LBE1140:
+.LBE1146:
+.LBE1145:
 .LBE1144:
-.LBE1147:
-.LBE1158:
+.LBE1148:
+.LBE1151:
 .LBE1162:
-.LBE1174:
+.LBE1166:
+.LBE1178:
 	.loc 1 1342 0
 	mov	x0, x21
 .LVL199:
-.LBB1175:
+.LBB1179:
+.LBB1167:
 .LBB1163:
-.LBB1159:
-.LBB1148:
-.LBB1145:
+.LBB1152:
+.LBB1149:
 	.loc 6 84 0
 	tbz	x2, 26, .L114
 	b	.L113
 .LVL200:
 	.p2align 3
 .L231:
-.LBE1145:
-.LBE1148:
-.LBE1159:
+.LBE1149:
+.LBE1152:
 .LBE1163:
-.LBE1175:
-.LBB1176:
-.LBB1043:
-.LBB1040:
-.LBB1037:
+.LBE1167:
+.LBE1179:
+.LBB1180:
+.LBB1047:
+.LBB1044:
+.LBB1041:
+.LBB1030:
 .LBB1026:
-.LBB1022:
-.LBB1023:
-.LBB1024:
+.LBB1027:
+.LBB1028:
 	.loc 7 106 0
 	ldr	x2, [x2]
 .LVL201:
-.LBE1024:
-.LBE1023:
-.LBE1022:
+.LBE1028:
+.LBE1027:
 .LBE1026:
-.LBE1037:
-.LBE1040:
-.LBE1043:
-.LBE1176:
+.LBE1030:
+.LBE1041:
+.LBE1044:
+.LBE1047:
+.LBE1180:
 	.loc 1 1342 0
 	mov	x0, x21
 .LVL202:
-.LBB1177:
-.LBB1044:
-.LBB1041:
-.LBB1038:
-.LBB1027:
+.LBB1181:
+.LBB1048:
+.LBB1045:
+.LBB1042:
+.LBB1031:
 	.loc 6 84 0
 	tbz	x2, 26, .L109
 	b	.L108
 .LVL203:
 	.p2align 3
 .L138:
-.LBE1027:
-.LBE1038:
-.LBE1041:
-.LBE1044:
-.LBE1177:
-.LBB1178:
+.LBE1031:
+.LBE1042:
+.LBE1045:
+.LBE1048:
+.LBE1181:
+.LBB1182:
+.LBB1132:
 .LBB1128:
-.LBB1124:
-.LBB1113:
-.LBB1114:
-.LBB1115:
-.LBB1116:
 .LBB1117:
+.LBB1118:
+.LBB1119:
+.LBB1120:
+.LBB1121:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL204:
-.LBE1117:
-.LBE1116:
-.LBE1115:
-.LBB1118:
-.LBB1119:
+.LBE1121:
+.LBE1120:
+.LBE1119:
+.LBB1122:
+.LBB1123:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2326,13 +2326,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL205:
 #NO_APP
-.LBE1119:
-.LBE1118:
-.LBB1120:
+.LBE1123:
+.LBE1122:
+.LBB1124:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL206:
-.LBE1120:
+.LBE1124:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL207:
@@ -2348,44 +2348,44 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1114:
-.LBE1113:
+.LBE1118:
+.LBE1117:
 	.loc 9 134 0
 	mov	x2, 44
 	add	x1, x29, 104
 .LVL209:
 	bl	__arch_copy_to_user
 .LVL210:
-.LBE1124:
 .LBE1128:
-.LBE1178:
+.LBE1132:
+.LBE1182:
 	.loc 1 1472 0
 	cbnz	x0, .L139
-.LBB1179:
-.LBB979:
+.LBB1183:
+.LBB983:
 	mov	x22, 0
 	b	.L87
 .LVL211:
 	.p2align 3
 .L115:
-.LBE979:
-.LBE1179:
-.LBB1180:
+.LBE983:
+.LBE1183:
+.LBB1184:
+.LBB1168:
 .LBB1164:
-.LBB1160:
-.LBB1149:
-.LBB1150:
-.LBB1151:
-.LBB1152:
 .LBB1153:
+.LBB1154:
+.LBB1155:
+.LBB1156:
+.LBB1157:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
 .LVL212:
-.LBE1153:
-.LBE1152:
-.LBE1151:
-.LBB1154:
-.LBB1155:
+.LBE1157:
+.LBE1156:
+.LBE1155:
+.LBB1158:
+.LBB1159:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -2393,13 +2393,13 @@ ebc_io_ctl:
 // 0 "" 2
 .LVL213:
 #NO_APP
-.LBE1155:
-.LBE1154:
-.LBB1156:
+.LBE1159:
+.LBE1158:
+.LBB1160:
 	.loc 6 254 0
 	and	x1, x1, x21
 .LVL214:
-.LBE1156:
+.LBE1160:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
 .LVL215:
@@ -2415,28 +2415,28 @@ ebc_io_ctl:
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1150:
-.LBE1149:
+.LBE1154:
+.LBE1153:
 	.loc 9 134 0
 	mov	x2, 44
 	add	x1, x29, 104
 .LVL217:
 	bl	__arch_copy_to_user
 .LVL218:
-.LBE1160:
 .LBE1164:
-.LBE1180:
+.LBE1168:
+.LBE1184:
 	.loc 1 1395 0
 	cbnz	w0, .L116
-.LBB1181:
-.LBB980:
+.LBB1185:
+.LBB984:
 	mov	x22, 0
 	b	.L87
 .LVL219:
 	.p2align 3
 .L120:
-.LBE980:
-.LBE1181:
+.LBE984:
+.LBE1185:
 	.loc 1 1403 0
 	mov	x22, -14
 	b	.L87
@@ -2459,22 +2459,22 @@ ebc_io_ctl:
 	.loc 1 1421 0 discriminator 1
 	ldr	w0, [x20, 592]
 	cbz	w0, .L124
-.LBB1182:
-.LBB981:
+.LBB1186:
+.LBB985:
 	mov	x22, 0
 	b	.L87
 .LVL222:
 .L112:
-.LBE981:
-.LBE1182:
+.LBE985:
+.LBE1186:
 	.loc 1 1371 0
 	mov	x22, -1
 	b	.L87
 .LVL223:
 .L161:
-.LBB1183:
+.LBB1187:
+.LBB1084:
 .LBB1080:
-.LBB1076:
 	.loc 9 112 0
 	mov	x0, 4
 .LVL224:
@@ -2487,9 +2487,9 @@ ebc_io_ctl:
 .LVL226:
 	bl	memset
 .LVL227:
-.LBE1076:
 .LBE1080:
-.LBE1183:
+.LBE1084:
+.LBE1187:
 	.loc 1 1460 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC4
@@ -2763,16 +2763,16 @@ ebc_lut_update:
 	ldr	x3, [x0]
 	str	x3, [x29, 56]
 	mov	x3,0
-.LBB1184:
-.LBB1185:
+.LBB1188:
+.LBB1189:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
 .LVL246:
 	mov	w20, w0
-.LBE1185:
-.LBE1184:
+.LBE1189:
+.LBE1188:
 	.loc 1 812 0
 	cbnz	w0, .L250
 .LVL247:
@@ -3105,15 +3105,15 @@ pmic_vcom_read:
 	.loc 1 1622 0
 	ldr	x1, [x0, 16]
 .LVL279:
-.LBB1186:
-.LBB1187:
+.LBB1190:
+.LBB1191:
 	.loc 3 55 0
 	mov	x0, x1
 	ldr	x1, [x1, 64]
 	blr	x1
 .LVL280:
-.LBE1187:
-.LBE1186:
+.LBE1191:
+.LBE1190:
 	.loc 1 1624 0
 	mov	w2, w0
 	adrp	x1, .LC14
@@ -3154,13 +3154,13 @@ pmic_temp_read:
 	.cfi_def_cfa_register 29
 	.loc 1 1608 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-.LBB1188:
-.LBB1189:
+.LBB1192:
+.LBB1193:
 	.loc 3 50 0
 	add	x1, x29, 36
 .LVL285:
-.LBE1189:
-.LBE1188:
+.LBE1193:
+.LBE1192:
 	.loc 1 1604 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
@@ -3175,15 +3175,15 @@ pmic_temp_read:
 .LVL286:
 	.loc 1 1608 0
 	ldr	x2, [x0, 16]
-.LBB1191:
-.LBB1190:
+.LBB1195:
+.LBB1194:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
 .LVL287:
-.LBE1190:
-.LBE1191:
+.LBE1194:
+.LBE1195:
 	.loc 1 1610 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC14
@@ -3524,8 +3524,8 @@ direct_mode_data_change.isra.1:
 	cmp	x11, x7
 	.loc 1 549 0
 	and	w8, w3, 65535
-.LBB1192:
-.LBB1193:
+.LBB1196:
+.LBB1197:
 	.loc 1 130 0
 	ubfiz	w30, w9, 8, 8
 	.loc 1 131 0
@@ -3534,143 +3534,143 @@ direct_mode_data_change.isra.1:
 	add	w30, w30, w8, uxtb
 	.loc 1 131 0
 	add	w9, w9, w8, lsr 8
-.LBE1193:
-.LBE1192:
+.LBE1197:
+.LBE1196:
 	.loc 1 550 0
 	lsr	w10, w4, 16
 	lsr	w8, w3, 16
-.LBB1197:
-.LBB1198:
+.LBB1201:
+.LBB1202:
 	.loc 1 130 0
 	ubfiz	w18, w10, 8, 8
-.LBE1198:
-.LBE1197:
-.LBB1204:
-.LBB1194:
+.LBE1202:
+.LBE1201:
+.LBB1208:
+.LBB1198:
 	ldrb	w30, [x5, w30, sxtw]
-.LBE1194:
-.LBE1204:
-.LBB1205:
-.LBB1199:
+.LBE1198:
+.LBE1208:
+.LBB1209:
+.LBB1203:
 	.loc 1 131 0
 	and	w10, w10, 65280
-.LBE1199:
-.LBE1205:
-.LBB1206:
-.LBB1195:
+.LBE1203:
+.LBE1209:
+.LBB1210:
+.LBB1199:
 	ldrb	w17, [x5, w9, sxtw]
-.LBE1195:
-.LBE1206:
-.LBB1207:
-.LBB1200:
+.LBE1199:
+.LBE1210:
+.LBB1211:
+.LBB1204:
 	.loc 1 130 0
 	add	w18, w18, w8, uxtb
 	.loc 1 131 0
 	add	w10, w10, w8, lsr 8
-.LBE1200:
-.LBE1207:
+.LBE1204:
+.LBE1211:
 	.loc 1 551 0
 	ubfx	x9, x4, 32, 16
 	ubfx	x8, x3, 32, 16
 	.loc 1 552 0
 	lsr	x4, x4, 48
 .LVL331:
-.LBB1208:
-.LBB1196:
+.LBB1212:
+.LBB1200:
 	.loc 1 130 0
 	orr	w17, w30, w17, lsl 4
-.LBE1196:
-.LBE1208:
+.LBE1200:
+.LBE1212:
 	.loc 1 549 0
 	strb	w17, [x6, -4]
-.LBB1209:
-.LBB1210:
+.LBB1213:
+.LBB1214:
 	.loc 1 130 0
 	ubfiz	w17, w9, 8, 8
 	.loc 1 131 0
 	and	w9, w9, 65280
-.LBE1210:
-.LBE1209:
-.LBB1216:
-.LBB1201:
+.LBE1214:
+.LBE1213:
+.LBB1220:
+.LBB1205:
 	ldrb	w10, [x5, w10, sxtw]
-.LBE1201:
-.LBE1216:
-.LBB1217:
-.LBB1211:
+.LBE1205:
+.LBE1220:
+.LBB1221:
+.LBB1215:
 	.loc 1 130 0
 	add	w17, w17, w8, uxtb
-.LBE1211:
-.LBE1217:
-.LBB1218:
-.LBB1202:
+.LBE1215:
+.LBE1221:
+.LBB1222:
+.LBB1206:
 	ldrb	w18, [x5, w18, sxtw]
-.LBE1202:
-.LBE1218:
-.LBB1219:
-.LBB1212:
+.LBE1206:
+.LBE1222:
+.LBB1223:
+.LBB1216:
 	.loc 1 131 0
 	add	w8, w9, w8, lsr 8
-.LBE1212:
-.LBE1219:
+.LBE1216:
+.LBE1223:
 	.loc 1 552 0
 	lsr	x3, x3, 48
 .LVL332:
-.LBB1220:
-.LBB1203:
+.LBB1224:
+.LBB1207:
 	.loc 1 130 0
 	orr	w9, w18, w10, lsl 4
-.LBE1203:
-.LBE1220:
+.LBE1207:
+.LBE1224:
 	.loc 1 550 0
 	strb	w9, [x6, -3]
-.LBB1221:
-.LBB1222:
+.LBB1225:
+.LBB1226:
 	.loc 1 130 0
 	ubfiz	w9, w4, 8, 8
 	.loc 1 131 0
 	and	w4, w4, 65280
-.LBE1222:
-.LBE1221:
-.LBB1226:
-.LBB1213:
-	ldrb	w10, [x5, w8, sxtw]
-.LBE1213:
 .LBE1226:
+.LBE1225:
+.LBB1230:
+.LBB1217:
+	ldrb	w10, [x5, w8, sxtw]
+.LBE1217:
+.LBE1230:
+.LBB1231:
 .LBB1227:
-.LBB1223:
 	.loc 1 130 0
 	add	w8, w9, w3, uxtb
-.LBE1223:
 .LBE1227:
-.LBB1228:
-.LBB1214:
+.LBE1231:
+.LBB1232:
+.LBB1218:
 	ldrb	w17, [x5, w17, sxtw]
-.LBE1214:
-.LBE1228:
-.LBB1229:
-.LBB1224:
+.LBE1218:
+.LBE1232:
+.LBB1233:
+.LBB1228:
 	.loc 1 131 0
 	add	w3, w4, w3, lsr 8
-.LBE1224:
-.LBE1229:
-.LBB1230:
-.LBB1215:
+.LBE1228:
+.LBE1233:
+.LBB1234:
+.LBB1219:
 	.loc 1 130 0
 	orr	w4, w17, w10, lsl 4
-.LBE1215:
-.LBE1230:
+.LBE1219:
+.LBE1234:
 	.loc 1 551 0
 	strb	w4, [x6, -2]
-.LBB1231:
-.LBB1225:
+.LBB1235:
+.LBB1229:
 	.loc 1 131 0
 	ldrb	w3, [x5, w3, sxtw]
 	.loc 1 130 0
 	ldrb	w4, [x5, w8, sxtw]
 	orr	w3, w4, w3, lsl 4
-.LBE1225:
-.LBE1231:
+.LBE1229:
+.LBE1235:
 	.loc 1 552 0
 	strb	w3, [x6, -1]
 	.loc 1 545 0
@@ -3787,14 +3787,14 @@ direct_mode_data_change_part.isra.2:
 	mov	w12, 0
 .LVL350:
 	sub	w13, w11, #1
-.LBB1232:
-.LBB1233:
+.LBB1236:
+.LBB1237:
 	.loc 1 136 0
 	mov	w10, 3
 	add	x13, x13, 1
 	lsl	x13, x13, 3
-.LBE1233:
-.LBE1232:
+.LBE1237:
+.LBE1236:
 	.loc 1 577 0
 	cbz	w16, .L399
 .LVL351:
@@ -3836,8 +3836,8 @@ direct_mode_data_change_part.isra.2:
 	and	w17, w4, 65535
 	and	w9, w3, 65535
 .LVL357:
-.LBB1235:
-.LBB1236:
+.LBB1239:
+.LBB1240:
 	.loc 1 140 0
 	mov	w7, 0
 	.loc 1 139 0
@@ -3885,15 +3885,15 @@ direct_mode_data_change_part.isra.2:
 	and	w7, w7, 255
 .LVL359:
 .L337:
-.LBE1236:
-.LBE1235:
+.LBE1240:
+.LBE1239:
 	.loc 1 586 0
 	strb	w7, [x6, -4]
 	.loc 1 587 0
 	lsr	w17, w4, 16
 	lsr	w9, w3, 16
-.LBB1237:
-.LBB1238:
+.LBB1241:
+.LBB1242:
 	.loc 1 140 0
 	mov	w7, 0
 	.loc 1 139 0
@@ -3941,15 +3941,15 @@ direct_mode_data_change_part.isra.2:
 	and	w7, w7, 255
 .LVL361:
 .L342:
-.LBE1238:
-.LBE1237:
+.LBE1242:
+.LBE1241:
 	.loc 1 587 0
 	strb	w7, [x6, -3]
 	.loc 1 588 0
 	ubfx	x17, x4, 32, 16
 	ubfx	x9, x3, 32, 16
-.LBB1239:
-.LBB1240:
+.LBB1243:
+.LBB1244:
 	.loc 1 140 0
 	mov	w7, 0
 	.loc 1 139 0
@@ -3997,8 +3997,8 @@ direct_mode_data_change_part.isra.2:
 	and	w7, w7, 255
 .LVL363:
 .L347:
-.LBE1240:
-.LBE1239:
+.LBE1244:
+.LBE1243:
 	.loc 1 588 0
 	strb	w7, [x6, -2]
 	.loc 1 589 0
@@ -4006,8 +4006,8 @@ direct_mode_data_change_part.isra.2:
 .LVL364:
 	lsr	x3, x3, 48
 .LVL365:
-.LBB1241:
-.LBB1234:
+.LBB1245:
+.LBB1238:
 	.loc 1 140 0
 	mov	w7, 0
 	.loc 1 139 0
@@ -4056,8 +4056,8 @@ direct_mode_data_change_part.isra.2:
 	and	w7, w4, 255
 .LVL368:
 .L352:
-.LBE1234:
-.LBE1241:
+.LBE1238:
+.LBE1245:
 	.loc 1 589 0
 	strb	w7, [x6, -1]
 	add	x8, x8, 1
@@ -4198,10 +4198,10 @@ flip.isra.3:
 	.loc 1 603 0
 	ldr	x0, [x0]
 .LVL388:
-.LBB1242:
-.LBB1243:
-.LBB1244:
-.LBB1245:
+.LBB1246:
+.LBB1247:
+.LBB1248:
+.LBB1249:
 	.file 10 "./include/linux/dma-mapping.h"
 	.loc 10 266 0
 	cbz	x0, .L418
@@ -4212,37 +4212,37 @@ flip.isra.3:
 	cmp	x3, 0
 	csel	x3, x4, x3, eq
 .L416:
-.LBE1245:
-.LBE1244:
+.LBE1249:
+.LBE1248:
 	.loc 10 434 0
 	ldr	x5, [x3, 88]
 	sxtw	x19, w19
 	cbz	x5, .L417
-.LBE1243:
-.LBE1242:
+.LBE1247:
+.LBE1246:
 	.loc 1 603 0
 	add	x4, x19, x19, lsl 1
-.LBB1251:
-.LBB1248:
+.LBB1255:
+.LBB1252:
 	.loc 10 435 0
 	mov	w3, 1
-.LBE1248:
-.LBE1251:
+.LBE1252:
+.LBE1255:
 	.loc 1 603 0
 	add	x4, x20, x4, lsl 3
-.LBB1252:
-.LBB1249:
+.LBB1256:
+.LBB1253:
 	.loc 10 435 0
 	ldr	x1, [x4, 32]
 	blr	x5
 .LVL389:
 .L417:
-.LBE1249:
-.LBE1252:
+.LBE1253:
+.LBE1256:
 	.loc 1 604 0
 	ldr	x5, [x20, 8]
-.LBB1253:
-.LBB1254:
+.LBB1257:
+.LBB1258:
 	.file 11 "drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.h"
 	.loc 11 57 0
 	mov	w4, 0
@@ -4250,29 +4250,29 @@ flip.isra.3:
 	mov	w2, 0
 	mov	x0, x5
 	mov	w1, 0
-.LBE1254:
-.LBE1253:
+.LBE1258:
+.LBE1257:
 	.loc 1 605 0
 	add	x19, x19, x19, lsl 1
-.LBB1257:
-.LBB1255:
+.LBB1261:
+.LBB1259:
 	.loc 11 57 0
 	ldr	x5, [x5, 64]
-.LBE1255:
-.LBE1257:
+.LBE1259:
+.LBE1261:
 	.loc 1 605 0
 	add	x19, x20, x19, lsl 3
-.LBB1258:
-.LBB1256:
+.LBB1262:
+.LBB1260:
 	.loc 11 57 0
 	blr	x5
 .LVL390:
-.LBE1256:
-.LBE1258:
+.LBE1260:
+.LBE1262:
 	.loc 1 605 0
 	ldr	x1, [x20, 8]
-.LBB1259:
-.LBB1260:
+.LBB1263:
+.LBB1264:
 	.loc 11 62 0
 	mov	w2, 0
 	mov	x0, x1
@@ -4280,20 +4280,20 @@ flip.isra.3:
 	ldr	w1, [x19, 32]
 	blr	x3
 .LVL391:
-.LBE1260:
-.LBE1259:
+.LBE1264:
+.LBE1263:
 	.loc 1 606 0
 	ldr	x2, [x20, 8]
-.LBB1261:
-.LBB1262:
+.LBB1265:
+.LBB1266:
 	.loc 11 77 0
 	mov	w1, 1
 	mov	x0, x2
 	ldr	x2, [x2, 96]
 	blr	x2
 .LVL392:
-.LBE1262:
-.LBE1261:
+.LBE1266:
+.LBE1265:
 	.loc 1 607 0
 	ldr	w1, [x20, 72]
 	mov	w0, 1
@@ -4314,18 +4314,18 @@ flip.isra.3:
 	.p2align 3
 .L418:
 	.cfi_restore_state
-.LBB1263:
+.LBB1267:
+.LBB1254:
+.LBB1251:
 .LBB1250:
-.LBB1247:
-.LBB1246:
 	.loc 10 268 0
 	adrp	x3, dummy_dma_ops
 	add	x3, x3, :lo12:dummy_dma_ops
 	b	.L416
-.LBE1246:
-.LBE1247:
 .LBE1250:
-.LBE1263:
+.LBE1251:
+.LBE1254:
+.LBE1267:
 	.cfi_endproc
 .LFE2849:
 	.size	flip.isra.3, .-flip.isra.3
@@ -4374,8 +4374,8 @@ ebc_frame_start:
 	.loc 1 647 0
 	ldr	w0, [x19, 36]
 	cbz	w0, .L431
-.LBB1264:
-.LBB1265:
+.LBB1268:
+.LBB1269:
 	.loc 1 612 0
 	str	wzr, [x21, 72]
 	.loc 1 613 0
@@ -4383,8 +4383,8 @@ ebc_frame_start:
 	ldr	w1, [x20, 208]
 	bl	flip.isra.3
 .LVL398:
-.LBE1265:
-.LBE1264:
+.LBE1269:
+.LBE1268:
 	.loc 1 649 0
 	ldp	x1, x2, [x19, 128]
 	mov	x4, x19
@@ -4424,8 +4424,8 @@ ebc_frame_start:
 	.loc 1 629 0
 	ldr	w0, [x19, 36]
 	cbz	w0, .L429
-.LBB1266:
-.LBB1267:
+.LBB1270:
+.LBB1271:
 	.loc 1 612 0
 	str	wzr, [x21, 72]
 	.loc 1 613 0
@@ -4433,8 +4433,8 @@ ebc_frame_start:
 	ldr	w1, [x20, 208]
 	bl	flip.isra.3
 .LVL403:
-.LBE1267:
-.LBE1266:
+.LBE1271:
+.LBE1270:
 	.loc 1 693 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
@@ -4469,8 +4469,8 @@ ebc_frame_start:
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change.isra.1
 .LVL406:
-.LBB1268:
-.LBB1269:
+.LBB1272:
+.LBB1273:
 	.loc 1 612 0
 	str	wzr, [x21, 72]
 	.loc 1 613 0
@@ -4478,8 +4478,8 @@ ebc_frame_start:
 	ldr	w1, [x20, 208]
 	bl	flip.isra.3
 .LVL407:
-.LBE1269:
-.LBE1268:
+.LBE1273:
+.LBE1272:
 	.loc 1 684 0
 	ldr	w4, [x19, 40]
 	.loc 1 686 0
@@ -4525,8 +4525,8 @@ ebc_frame_start:
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change_part.isra.2
 .LVL411:
-.LBB1270:
-.LBB1271:
+.LBB1274:
+.LBB1275:
 	.loc 1 612 0
 	str	wzr, [x21, 72]
 	.loc 1 613 0
@@ -4534,8 +4534,8 @@ ebc_frame_start:
 	ldr	w1, [x20, 208]
 	bl	flip.isra.3
 .LVL412:
-.LBE1271:
-.LBE1270:
+.LBE1275:
+.LBE1274:
 	.loc 1 671 0
 	ldr	w4, [x19, 40]
 	.loc 1 673 0
@@ -4629,15 +4629,15 @@ ebc_auto_tast_function:
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
-.LBB1272:
-.LBB1273:
-.LBB1274:
+.LBB1276:
+.LBB1277:
+.LBB1278:
 	.file 12 "./include/linux/compiler.h"
 	.loc 12 234 0
 	mov	x24, 2
-.LBE1274:
-.LBE1273:
-.LBE1272:
+.LBE1278:
+.LBE1277:
+.LBE1276:
 	.loc 1 696 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -32
@@ -4652,9 +4652,9 @@ ebc_auto_tast_function:
 	str	x1, [x29, 88]
 	mov	x1,0
 	adrp	x25, system_wq
-.LBB1279:
-.LBB1276:
-.LBB1277:
+.LBB1283:
+.LBB1280:
+.LBB1281:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
@@ -4665,9 +4665,9 @@ ebc_auto_tast_function:
 	b	.L450
 	.p2align 3
 .L449:
-.LBE1277:
-.LBE1276:
-.LBE1279:
+.LBE1281:
+.LBE1280:
+.LBE1283:
 	.loc 1 759 0
 	mov	x0, x20
 	bl	up
@@ -4680,14 +4680,14 @@ ebc_auto_tast_function:
 	mov	x0, x20
 	bl	down
 .LVL424:
-.LBB1280:
-.LBB1278:
-.LBB1275:
+.LBB1284:
+.LBB1282:
+.LBB1279:
 	.loc 12 234 0
 	str	x24, [x23, 32]
-.LBE1275:
-.LBE1278:
-.LBE1280:
+.LBE1279:
+.LBE1282:
+.LBE1284:
 	.loc 1 706 0
 #APP
 // 706 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
@@ -4728,10 +4728,10 @@ ebc_auto_tast_function:
 	.loc 1 754 0
 	ccmp	w0, 18, 4, hi
 	bne	.L449
-.LBB1281:
-.LBB1282:
-.LBB1283:
-.LBB1284:
+.LBB1285:
+.LBB1286:
+.LBB1287:
+.LBB1288:
 	.file 13 "./include/linux/workqueue.h"
 	.loc 13 518 0
 	ldr	x1, [x25, #:lo12:system_wq]
@@ -4742,10 +4742,10 @@ ebc_auto_tast_function:
 	b	.L449
 	.p2align 3
 .L442:
-.LBE1284:
-.LBE1283:
-.LBE1282:
-.LBE1281:
+.LBE1288:
+.LBE1287:
+.LBE1286:
+.LBE1285:
 	.loc 1 707 0
 	cmp	w0, 18
 	beq	.L445
@@ -4839,115 +4839,206 @@ ebc_power_set.part.4:
 	.loc 1 180 0
 	.cfi_startproc
 .LVL434:
-	stp	x29, x30, [sp, -48]!
-	.cfi_def_cfa_offset 48
-	.cfi_offset 29, -48
-	.cfi_offset 30, -40
+	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, -32
-	.cfi_offset 20, -24
-	.loc 1 186 0
-	add	x20, x0, 184
-	.loc 1 180 0
-	str	x21, [sp, 32]
-	.cfi_offset 21, -16
+	.cfi_offset 19, -16
+	.cfi_offset 20, -8
 	.loc 1 180 0
 	mov	x19, x0
-	mov	w21, w1
-	.loc 1 185 0
-	mov	x0, 1
-.LVL435:
-	bl	ebc_notify
-.LVL436:
-	.loc 1 186 0
-	ldr	w0, [x20, 424]
-	cbnz	w0, .L466
-	.loc 1 187 0
-	mov	w0, 1
-	str	w0, [x20, 424]
-.LBB1285:
-.LBB1286:
-	.loc 4 58 0
-	add	x0, x19, 400
-	bl	__pm_stay_awake
-.LVL437:
-.L466:
-.LBE1286:
-.LBE1285:
-	.loc 1 190 0
-	str	w21, [x20, 184]
-.LBB1287:
-.LBB1288:
-	.loc 11 46 0
-	add	x1, x19, 24
-.LBE1288:
-.LBE1287:
-	.loc 1 191 0
-	ldr	x2, [x19, 8]
-.LBB1290:
+	.loc 1 197 0
+	str	w1, [x0, 368]
 .LBB1289:
-	.loc 11 46 0
-	mov	x0, x2
-	ldr	x2, [x2, 48]
-	blr	x2
-.LVL438:
-.LBE1289:
+.LBB1290:
+	.loc 3 35 0
+	mov	w1, 0
+.LVL435:
 .LBE1290:
-	.loc 1 192 0
-	ldr	x2, [x19, 16]
-.LBB1291:
+.LBE1289:
+	.loc 1 198 0
+	ldr	x2, [x0, 16]
 .LBB1292:
-	.loc 3 30 0
-	mov	w1, 1
+.LBB1291:
+	.loc 3 35 0
 	mov	x0, x2
+.LVL436:
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL439:
-.LBE1292:
+.LVL437:
 .LBE1291:
-	.loc 1 193 0
+.LBE1292:
+	.loc 1 199 0
+	ldr	x1, [x19, 8]
+.LBB1293:
+.LBB1294:
+	.loc 11 51 0
+	mov	x0, x1
+	ldr	x1, [x1, 56]
+	blr	x1
+.LVL438:
+.LBE1294:
+.LBE1293:
+	.loc 1 200 0
+	ldr	w0, [x19, 608]
+	cbnz	w0, .L471
+	.loc 1 204 0
 	ldr	x0, [x19]
 	adrp	x1, .LC21
 	add	x1, x1, :lo12:.LC21
 	bl	_dev_info
-.LVL440:
+.LVL439:
 	.loc 1 208 0
-	ldr	x21, [sp, 32]
-.LVL441:
 	ldp	x19, x20, [sp, 16]
-.LVL442:
-	ldp	x29, x30, [sp], 48
+.LVL440:
+	ldp	x29, x30, [sp], 32
+	.cfi_remember_state
 	.cfi_restore 30
 	.cfi_restore 29
-	.cfi_restore 21
 	.cfi_restore 19
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
+.LVL441:
+	.p2align 3
+.L471:
+	.cfi_restore_state
+	.loc 1 201 0
+	str	wzr, [x19, 608]
+.LBB1295:
+.LBB1296:
+	.loc 4 68 0
+	add	x0, x19, 400
+	bl	__pm_relax
+.LVL442:
+.LBE1296:
+.LBE1295:
+	.loc 1 204 0
+	ldr	x0, [x19]
+	adrp	x1, .LC21
+	add	x1, x1, :lo12:.LC21
+	bl	_dev_info
+.LVL443:
+	.loc 1 208 0
+	ldp	x19, x20, [sp, 16]
+.LVL444:
+	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
 .LFE2850:
 	.size	ebc_power_set.part.4, .-ebc_power_set.part.4
 	.align	2
 	.p2align 3,,7
+	.type	ebc_suspend, %function
+ebc_suspend:
+.LFB2842:
+	.loc 1 2048 0
+	.cfi_startproc
+.LVL445:
+	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
+.LBB1297:
+.LBB1298:
+	.loc 2 1181 0
+	ldr	x20, [x0, 184]
+.LBE1298:
+.LBE1297:
+	.loc 1 2052 0
+	add	x19, x20, 184
+	ldr	w0, [x19, 184]
+.LVL446:
+	cmp	w0, 1
+	beq	.L475
+.L473:
+	.loc 1 2056 0
+	mov	w0, 1
+	str	w0, [x19, 596]
+	.loc 1 2058 0
+	ldr	x1, [x20, 16]
+.LBB1299:
+.LBB1300:
+	.loc 3 40 0
+	mov	x0, x1
+	ldr	x1, [x1, 40]
+	blr	x1
+.LVL447:
+.LBE1300:
+.LBE1299:
+	.loc 1 2059 0
+	ldr	x0, [x19, 88]
+	adrp	x1, .LC23
+	add	x1, x1, :lo12:.LC23
+	bl	_dev_info
+.LVL448:
+	.loc 1 2062 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
+.L475:
+	.cfi_restore_state
+	.loc 1 2053 0
+	ldr	x0, [x19, 88]
+	adrp	x2, .LANCHOR3
+	add	x2, x2, :lo12:.LANCHOR3
+	adrp	x1, .LC22
+	add	x2, x2, 16
+	add	x1, x1, :lo12:.LC22
+	bl	_dev_info
+.LVL449:
+.LBB1301:
+.LBB1302:
+	mov	w1, 0
+	mov	x0, x20
+	bl	ebc_power_set.part.4
+.LVL450:
+	b	.L473
+.LBE1302:
+.LBE1301:
+	.cfi_endproc
+.LFE2842:
+	.size	ebc_suspend, .-ebc_suspend
+	.align	2
+	.p2align 3,,7
 	.type	ebc_probe, %function
 ebc_probe:
 .LFB2840:
 	.loc 1 1933 0
 	.cfi_startproc
-.LVL443:
+.LVL451:
 	stp	x29, x30, [sp, -208]!
 	.cfi_def_cfa_offset 208
 	.cfi_offset 29, -208
 	.cfi_offset 30, -200
-.LBB1438:
-.LBB1439:
+.LBB1448:
+.LBB1449:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
-.LBE1439:
-.LBE1438:
+.LBE1449:
+.LBE1448:
 	.loc 1 1933 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -4963,7 +5054,7 @@ ebc_probe:
 	adrp	x23, __stack_chk_guard
 	stp	x21, x22, [sp, 32]
 	add	x0, x23, :lo12:__stack_chk_guard
-.LVL444:
+.LVL452:
 	stp	x25, x26, [sp, 64]
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 21, -176
@@ -4976,487 +5067,487 @@ ebc_probe:
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
-.LBB1441:
-.LBB1440:
+.LBB1451:
+.LBB1450:
 	.loc 2 711 0
 	mov	x0, x20
 	mov	x1, 800
 	bl	devm_kmalloc
-.LVL445:
-.LBE1440:
-.LBE1441:
+.LVL453:
+.LBE1450:
+.LBE1451:
 	.loc 1 1945 0
-	cbz	x0, .L513
+	cbz	x0, .L521
 	.loc 1 1949 0
 	adrp	x25, .LANCHOR0
 	mov	x19, x0
 	.loc 1 1951 0
-	adrp	x1, .LC22
+	adrp	x1, .LC24
 	mov	w2, 0
 	.loc 1 1949 0
 	str	x0, [x25, #:lo12:.LANCHOR0]
 	.loc 1 1951 0
-	add	x1, x1, :lo12:.LC22
+	add	x1, x1, :lo12:.LC24
 	ldr	x0, [x20, 752]
 	.loc 1 1948 0
 	str	x20, [x19]
 	.loc 1 1951 0
 	bl	of_parse_phandle
-.LVL446:
+.LVL454:
 	.loc 1 1952 0
-	cbz	x0, .L553
+	cbz	x0, .L561
 	.loc 1 1957 0
 	bl	of_find_device_by_node
-.LVL447:
+.LVL455:
 	.loc 1 1959 0
-	cbz	x0, .L472
-.LBB1442:
-.LBB1443:
-.LBB1444:
+	cbz	x0, .L480
+.LBB1452:
+.LBB1453:
+.LBB1454:
 	.loc 2 1181 0
 	ldr	x0, [x0, 200]
-.LVL448:
-.LBE1444:
-.LBE1443:
-.LBE1442:
+.LVL456:
+.LBE1454:
+.LBE1453:
+.LBE1452:
 	.loc 1 1962 0
 	str	x0, [x19, 8]
 	.loc 1 1963 0
-	cbz	x0, .L472
+	cbz	x0, .L480
 	.loc 1 1965 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
 	.loc 1 1967 0
 	mov	w2, 0
-	adrp	x1, .LC24
-	add	x1, x1, :lo12:.LC24
+	adrp	x1, .LC26
+	add	x1, x1, :lo12:.LC26
 	ldr	x0, [x20, 752]
 	bl	of_parse_phandle
-.LVL449:
+.LVL457:
 	.loc 1 1968 0
-	cbz	x0, .L554
+	cbz	x0, .L562
 	.loc 1 1973 0
 	bl	of_find_i2c_device_by_node
-.LVL450:
+.LVL458:
 	.loc 1 1975 0
-	cbz	x0, .L555
-.LBB1445:
-.LBB1446:
-.LBB1447:
+	cbz	x0, .L563
+.LBB1455:
+.LBB1456:
+.LBB1457:
 	.loc 2 1181 0
 	ldr	x0, [x0, 216]
-.LVL451:
-.LBE1447:
-.LBE1446:
-.LBE1445:
+.LVL459:
+.LBE1457:
+.LBE1456:
+.LBE1455:
 	.loc 1 1979 0
 	str	x0, [x19, 16]
 	.loc 1 1980 0
-	cbz	x0, .L556
+	cbz	x0, .L564
 	.loc 1 1986 0
 	add	x21, x19, 184
-.LVL452:
+.LVL460:
 	.loc 1 1988 0
 	add	x22, x19, 24
 	.loc 1 1986 0
 	str	x20, [x21, 88]
-.LBB1448:
-.LBB1449:
-.LBB1450:
-.LBB1451:
-.LBB1452:
+.LBB1458:
+.LBB1459:
+.LBB1460:
+.LBB1461:
+.LBB1462:
 	.file 14 "./include/linux/of.h"
 	.loc 14 499 0
-	adrp	x1, .LC28
-.LBE1452:
-.LBE1451:
-.LBE1450:
-.LBE1449:
-.LBE1448:
+	adrp	x1, .LC30
+.LBE1462:
+.LBE1461:
+.LBE1460:
+.LBE1459:
+.LBE1458:
 	.loc 1 1988 0
 	str	x20, [x19, 24]
-.LBB1547:
-.LBB1543:
-.LBB1459:
-.LBB1456:
-.LBB1453:
+.LBB1557:
+.LBB1553:
+.LBB1469:
+.LBB1466:
+.LBB1463:
 	.loc 14 499 0
 	mov	x4, 0
-.LBE1453:
-.LBE1456:
-.LBE1459:
-.LBE1543:
-.LBE1547:
+.LBE1463:
+.LBE1466:
+.LBE1469:
+.LBE1553:
+.LBE1557:
 	.loc 1 1989 0
 	ldr	x2, [x19, 8]
-.LBB1548:
-.LBB1544:
-.LBB1460:
-.LBB1457:
-.LBB1454:
+.LBB1558:
+.LBB1554:
+.LBB1470:
+.LBB1467:
+.LBB1464:
 	.loc 14 499 0
-	add	x1, x1, :lo12:.LC28
-.LBE1454:
-.LBE1457:
-.LBE1460:
-.LBE1544:
-.LBE1548:
+	add	x1, x1, :lo12:.LC30
+.LBE1464:
+.LBE1467:
+.LBE1470:
+.LBE1554:
+.LBE1558:
 	.loc 1 1990 0
 	stp	x2, x0, [x22, 8]
-.LBB1549:
-.LBB1545:
-.LBB1461:
-.LBB1458:
-.LBB1455:
+.LBB1559:
+.LBB1555:
+.LBB1471:
+.LBB1468:
+.LBB1465:
 	.loc 14 499 0
 	mov	x3, 1
 	ldr	x0, [x20, 752]
 	add	x2, x19, 100
 	bl	of_property_read_variable_u32_array
-.LVL453:
-	.loc 14 501 0
-	tbnz	w0, #31, .L477
-.LBE1455:
-.LBE1458:
-.LBE1461:
-.LBB1462:
-.LBB1463:
-.LBB1464:
-	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC52
-	mov	x4, 0
-	mov	x3, 1
-	add	x2, x19, 104
-	add	x1, x1, :lo12:.LC52
-	bl	of_property_read_variable_u32_array
-.LVL454:
-	.loc 14 501 0
-	tbnz	w0, #31, .L477
-.LBE1464:
-.LBE1463:
-.LBE1462:
-.LBB1465:
-.LBB1466:
-.LBB1467:
-	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC53
-	mov	x4, 0
-	mov	x3, 1
-	add	x2, x19, 108
-	add	x1, x1, :lo12:.LC53
-	bl	of_property_read_variable_u32_array
-.LVL455:
+.LVL461:
 	.loc 14 501 0
-	tbnz	w0, #31, .L477
-.LBE1467:
-.LBE1466:
+	tbnz	w0, #31, .L485
 .LBE1465:
-.LBB1468:
-.LBB1469:
-.LBB1470:
-	.loc 14 499 0
-	ldr	x0, [x20, 752]
-	adrp	x1, .LC54
-	mov	x4, 0
-	mov	x3, 1
-	add	x2, x19, 112
-	add	x1, x1, :lo12:.LC54
-	bl	of_property_read_variable_u32_array
-.LVL456:
-	.loc 14 501 0
-	tbnz	w0, #31, .L477
-.LBE1470:
-.LBE1469:
 .LBE1468:
-.LBB1471:
+.LBE1471:
 .LBB1472:
 .LBB1473:
+.LBB1474:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC55
+	adrp	x1, .LC54
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 128
-	add	x1, x1, :lo12:.LC55
+	add	x2, x19, 104
+	add	x1, x1, :lo12:.LC54
 	bl	of_property_read_variable_u32_array
-.LVL457:
+.LVL462:
 	.loc 14 501 0
-	tbnz	w0, #31, .L477
+	tbnz	w0, #31, .L485
+.LBE1474:
 .LBE1473:
 .LBE1472:
-.LBE1471:
-.LBB1474:
 .LBB1475:
 .LBB1476:
+.LBB1477:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC56
+	adrp	x1, .LC55
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 132
-	add	x1, x1, :lo12:.LC56
+	add	x2, x19, 108
+	add	x1, x1, :lo12:.LC55
 	bl	of_property_read_variable_u32_array
-.LVL458:
+.LVL463:
 	.loc 14 501 0
-	tbnz	w0, #31, .L477
+	tbnz	w0, #31, .L485
+.LBE1477:
 .LBE1476:
 .LBE1475:
-.LBE1474:
-.LBB1477:
 .LBB1478:
 .LBB1479:
+.LBB1480:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC57
+	adrp	x1, .LC56
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 136
-	add	x1, x1, :lo12:.LC57
+	add	x2, x19, 112
+	add	x1, x1, :lo12:.LC56
 	bl	of_property_read_variable_u32_array
-.LVL459:
+.LVL464:
 	.loc 14 501 0
-	tbnz	w0, #31, .L477
+	tbnz	w0, #31, .L485
+.LBE1480:
 .LBE1479:
 .LBE1478:
-.LBE1477:
-.LBB1480:
 .LBB1481:
 .LBB1482:
+.LBB1483:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC58
+	adrp	x1, .LC57
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 140
-	add	x1, x1, :lo12:.LC58
+	add	x2, x19, 128
+	add	x1, x1, :lo12:.LC57
 	bl	of_property_read_variable_u32_array
-.LVL460:
+.LVL465:
 	.loc 14 501 0
-	tbnz	w0, #31, .L477
+	tbnz	w0, #31, .L485
+.LBE1483:
 .LBE1482:
 .LBE1481:
-.LBE1480:
-.LBB1483:
 .LBB1484:
 .LBB1485:
+.LBB1486:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC59
+	adrp	x1, .LC58
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 144
-	add	x1, x1, :lo12:.LC59
+	add	x2, x19, 132
+	add	x1, x1, :lo12:.LC58
 	bl	of_property_read_variable_u32_array
-.LVL461:
+.LVL466:
 	.loc 14 501 0
-	tbnz	w0, #31, .L477
+	tbnz	w0, #31, .L485
+.LBE1486:
 .LBE1485:
 .LBE1484:
-.LBE1483:
-.LBB1486:
 .LBB1487:
 .LBB1488:
+.LBB1489:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC60
+	adrp	x1, .LC59
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 148
-	add	x1, x1, :lo12:.LC60
+	add	x2, x19, 136
+	add	x1, x1, :lo12:.LC59
 	bl	of_property_read_variable_u32_array
-.LVL462:
+.LVL467:
 	.loc 14 501 0
-	tbnz	w0, #31, .L477
+	tbnz	w0, #31, .L485
+.LBE1489:
 .LBE1488:
 .LBE1487:
-.LBE1486:
-.LBB1489:
 .LBB1490:
 .LBB1491:
+.LBB1492:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC61
+	adrp	x1, .LC60
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 152
-	add	x1, x1, :lo12:.LC61
+	add	x2, x19, 140
+	add	x1, x1, :lo12:.LC60
 	bl	of_property_read_variable_u32_array
-.LVL463:
+.LVL468:
 	.loc 14 501 0
-	tbnz	w0, #31, .L477
+	tbnz	w0, #31, .L485
+.LBE1492:
 .LBE1491:
 .LBE1490:
-.LBE1489:
-.LBB1492:
 .LBB1493:
 .LBB1494:
+.LBB1495:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC62
+	adrp	x1, .LC61
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 156
-	add	x1, x1, :lo12:.LC62
+	add	x2, x19, 144
+	add	x1, x1, :lo12:.LC61
 	bl	of_property_read_variable_u32_array
-.LVL464:
+.LVL469:
 	.loc 14 501 0
-	tbnz	w0, #31, .L477
+	tbnz	w0, #31, .L485
+.LBE1495:
 .LBE1494:
 .LBE1493:
-.LBE1492:
-.LBB1495:
 .LBB1496:
 .LBB1497:
+.LBB1498:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC63
+	adrp	x1, .LC62
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 160
-	add	x1, x1, :lo12:.LC63
+	add	x2, x19, 148
+	add	x1, x1, :lo12:.LC62
 	bl	of_property_read_variable_u32_array
-.LVL465:
+.LVL470:
 	.loc 14 501 0
-	tbnz	w0, #31, .L477
+	tbnz	w0, #31, .L485
+.LBE1498:
 .LBE1497:
 .LBE1496:
-.LBE1495:
-.LBB1498:
 .LBB1499:
 .LBB1500:
+.LBB1501:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC64
+	adrp	x1, .LC63
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 164
-	add	x1, x1, :lo12:.LC64
+	add	x2, x19, 152
+	add	x1, x1, :lo12:.LC63
 	bl	of_property_read_variable_u32_array
-.LVL466:
+.LVL471:
 	.loc 14 501 0
-	tbnz	w0, #31, .L477
+	tbnz	w0, #31, .L485
+.LBE1501:
 .LBE1500:
 .LBE1499:
-.LBE1498:
-.LBB1501:
 .LBB1502:
 .LBB1503:
+.LBB1504:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC65
+	adrp	x1, .LC64
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 168
-	add	x1, x1, :lo12:.LC65
+	add	x2, x19, 156
+	add	x1, x1, :lo12:.LC64
 	bl	of_property_read_variable_u32_array
-.LVL467:
+.LVL472:
 	.loc 14 501 0
-	tbnz	w0, #31, .L477
+	tbnz	w0, #31, .L485
+.LBE1504:
 .LBE1503:
 .LBE1502:
-.LBE1501:
-.LBB1504:
 .LBB1505:
 .LBB1506:
+.LBB1507:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC66
+	adrp	x1, .LC65
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 172
-	add	x1, x1, :lo12:.LC66
+	add	x2, x19, 160
+	add	x1, x1, :lo12:.LC65
 	bl	of_property_read_variable_u32_array
-.LVL468:
+.LVL473:
 	.loc 14 501 0
-	tbnz	w0, #31, .L557
+	tbnz	w0, #31, .L485
+.LBE1507:
 .LBE1506:
 .LBE1505:
-.LBE1504:
-.LBB1507:
 .LBB1508:
 .LBB1509:
+.LBB1510:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC29
+	adrp	x1, .LC66
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 176
-	add	x1, x1, :lo12:.LC29
+	add	x2, x19, 164
+	add	x1, x1, :lo12:.LC66
 	bl	of_property_read_variable_u32_array
-.LVL469:
+.LVL474:
 	.loc 14 501 0
-	tbnz	w0, #31, .L478
-.L504:
+	tbnz	w0, #31, .L485
+.LBE1510:
 .LBE1509:
 .LBE1508:
-.LBE1507:
+.LBB1511:
+.LBB1512:
+.LBB1513:
+	.loc 14 499 0
+	ldr	x0, [x20, 752]
+	adrp	x1, .LC67
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x19, 168
+	add	x1, x1, :lo12:.LC67
+	bl	of_property_read_variable_u32_array
+.LVL475:
+	.loc 14 501 0
+	tbnz	w0, #31, .L485
+.LBE1513:
+.LBE1512:
+.LBE1511:
 .LBB1514:
 .LBB1515:
 .LBB1516:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC30
+	adrp	x1, .LC68
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 180
-	add	x1, x1, :lo12:.LC30
+	add	x2, x19, 172
+	add	x1, x1, :lo12:.LC68
 	bl	of_property_read_variable_u32_array
-.LVL470:
+.LVL476:
 	.loc 14 501 0
-	tbnz	w0, #31, .L479
-.L505:
+	tbnz	w0, #31, .L565
 .LBE1516:
 .LBE1515:
 .LBE1514:
-.LBB1521:
-.LBB1522:
-.LBB1523:
+.LBB1517:
+.LBB1518:
+.LBB1519:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC31
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 116
+	add	x2, x19, 176
 	add	x1, x1, :lo12:.LC31
 	bl	of_property_read_variable_u32_array
-.LVL471:
+.LVL477:
 	.loc 14 501 0
-	tbnz	w0, #31, .L480
-.L506:
-.LBE1523:
-.LBE1522:
-.LBE1521:
-.LBB1528:
-.LBB1529:
-.LBB1530:
+	tbnz	w0, #31, .L486
+.L512:
+.LBE1519:
+.LBE1518:
+.LBE1517:
+.LBB1524:
+.LBB1525:
+.LBB1526:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC32
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x19, 120
+	add	x2, x19, 180
 	add	x1, x1, :lo12:.LC32
 	bl	of_property_read_variable_u32_array
-.LVL472:
+.LVL478:
 	.loc 14 501 0
-	tbnz	w0, #31, .L481
-.L507:
-.LBE1530:
-.LBE1529:
-.LBE1528:
-.LBE1545:
-.LBE1549:
+	tbnz	w0, #31, .L487
+.L513:
+.LBE1526:
+.LBE1525:
+.LBE1524:
+.LBB1531:
+.LBB1532:
+.LBB1533:
+	.loc 14 499 0
+	ldr	x0, [x20, 752]
+	adrp	x1, .LC33
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x19, 116
+	add	x1, x1, :lo12:.LC33
+	bl	of_property_read_variable_u32_array
+.LVL479:
+	.loc 14 501 0
+	tbnz	w0, #31, .L488
+.L514:
+.LBE1533:
+.LBE1532:
+.LBE1531:
+.LBB1538:
+.LBB1539:
+.LBB1540:
+	.loc 14 499 0
+	ldr	x0, [x20, 752]
+	adrp	x1, .LC34
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x19, 120
+	add	x1, x1, :lo12:.LC34
+	bl	of_property_read_variable_u32_array
+.LVL480:
+	.loc 14 501 0
+	tbnz	w0, #31, .L489
+.L515:
+.LBE1540:
+.LBE1539:
+.LBE1538:
+.LBE1555:
+.LBE1559:
 	.loc 1 1998 0
 	ldr	w0, [x22, 88]
-.LBB1550:
-.LBB1551:
+.LBB1560:
+.LBB1561:
 	.loc 1 1735 0
 	mov	w2, 0
-.LBE1551:
-.LBE1550:
+.LBE1561:
+.LBE1560:
 	.loc 1 1998 0
 	str	w0, [x21, 52]
 	.loc 1 1999 0
@@ -5464,65 +5555,65 @@ ebc_probe:
 	str	w1, [x21, 56]
 	.loc 1 2000 0
 	mul	w0, w0, w1
-.LBB1575:
-.LBB1570:
+.LBB1585:
+.LBB1580:
 	.loc 1 1735 0
-	adrp	x1, .LC33
-	add	x1, x1, :lo12:.LC33
-.LBE1570:
-.LBE1575:
+	adrp	x1, .LC35
+	add	x1, x1, :lo12:.LC35
+.LBE1580:
+.LBE1585:
 	.loc 1 2000 0
 	lsr	w3, w0, 1
 	.loc 1 2001 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x21, 20]
-.LBB1576:
-.LBB1571:
+.LBB1586:
+.LBB1581:
 	.loc 1 1726 0
 	ldr	x26, [x19]
-.LVL473:
+.LVL481:
 	.loc 1 1735 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL474:
+.LVL482:
 	.loc 1 1736 0
-	cbz	x0, .L514
+	cbz	x0, .L522
 	.loc 1 1739 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL475:
+.LVL483:
 	mov	w24, w0
 	.loc 1 1741 0
-	cbnz	w0, .L558
-.LBB1552:
-.LBB1553:
+	cbnz	w0, .L566
+.LBB1562:
+.LBB1563:
 	.file 15 "./include/linux/ioport.h"
 	.loc 15 204 0
 	ldp	x1, x2, [x29, 104]
-.LBE1553:
-.LBE1552:
+.LBE1563:
+.LBE1562:
 	.loc 1 1746 0
 	str	x1, [x19, 184]
 	.loc 1 1749 0
 	mov	x3, 1
 	mov	x0, x26
-.LBB1555:
-.LBB1554:
+.LBB1565:
+.LBB1564:
 	.loc 15 204 0
 	add	x2, x2, 1
 	sub	x2, x2, x1
-.LBE1554:
-.LBE1555:
+.LBE1564:
+.LBE1565:
 	.loc 1 1747 0
 	str	w2, [x21, 16]
 	.loc 1 1749 0
 	sxtw	x2, w2
 	bl	devm_memremap
-.LVL476:
+.LVL484:
 	str	x0, [x21, 8]
 	.loc 1 1751 0
-	cbz	x0, .L485
+	cbz	x0, .L493
 	.loc 1 1759 0
 	mov	x1, x0
 	ldr	w2, [x21, 16]
@@ -5530,20 +5621,20 @@ ebc_probe:
 	mov	w4, 4
 	mov	w3, 2097152
 	bl	ebc_buf_init
-.LVL477:
+.LVL485:
 	.loc 1 1760 0
-	cbnz	w0, .L485
+	cbnz	w0, .L493
 	.loc 1 1765 0
 	ldr	x0, [x21, 8]
 	.loc 1 1766 0
 	mov	x5, 1048576
 	str	x5, [x22, 40]
-.LBB1556:
-.LBB1557:
+.LBB1566:
+.LBB1567:
 	.loc 2 711 0
 	mov	w2, 32960
-.LBE1557:
-.LBE1556:
+.LBE1567:
+.LBE1566:
 	.loc 1 1765 0
 	add	x6, x0, 10485760
 	str	x6, [x22, 24]
@@ -5552,13 +5643,13 @@ ebc_probe:
 	add	x1, x0, 12582912
 	.loc 1 1767 0
 	ldr	x3, [x19, 184]
-.LBB1561:
-.LBB1558:
+.LBB1571:
+.LBB1568:
 	.loc 2 711 0
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
-.LBE1558:
-.LBE1561:
+.LBE1568:
+.LBE1571:
 	.loc 1 1767 0
 	add	x7, x3, 10485760
 	str	x7, [x22, 32]
@@ -5572,148 +5663,148 @@ ebc_probe:
 	stp	x4, x3, [x22, 48]
 	.loc 1 1771 0
 	str	x1, [x21, 112]
-.LBB1562:
-.LBB1559:
+.LBB1572:
+.LBB1569:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
-.LBE1559:
-.LBE1562:
+.LBE1569:
+.LBE1572:
 	.loc 1 1768 0
 	str	x4, [x21, 176]
-.LBB1563:
-.LBB1560:
+.LBB1573:
+.LBB1570:
 	.loc 2 711 0
 	bl	devm_kmalloc
-.LVL478:
-.LBE1560:
-.LBE1563:
+.LVL486:
+.LBE1570:
+.LBE1573:
 	.loc 1 1774 0
 	str	x0, [x21, 128]
 	.loc 1 1775 0
-	cbz	x0, .L485
-.LBB1564:
-.LBB1565:
+	cbz	x0, .L493
+.LBB1574:
+.LBB1575:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL479:
-.LBE1565:
-.LBE1564:
+.LVL487:
+.LBE1575:
+.LBE1574:
 	.loc 1 1777 0
 	str	x0, [x21, 136]
 	.loc 1 1778 0
-	cbz	x0, .L485
-.LBB1566:
-.LBB1567:
+	cbz	x0, .L493
+.LBB1576:
+.LBB1577:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL480:
-.LBE1567:
-.LBE1566:
+.LVL488:
+.LBE1577:
+.LBE1576:
 	.loc 1 1780 0
 	str	x0, [x21, 144]
 	.loc 1 1781 0
-	cbz	x0, .L485
+	cbz	x0, .L493
 	.loc 1 1788 0
 	ldp	w1, w0, [x22, 84]
-.LBB1568:
-.LBB1569:
+.LBB1578:
+.LBB1579:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	mul	w1, w1, w0
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL481:
-.LBE1569:
-.LBE1568:
+.LVL489:
+.LBE1579:
+.LBE1578:
 	.loc 1 1788 0
 	str	x0, [x21, 152]
 	.loc 1 1789 0
-	cbz	x0, .L485
+	cbz	x0, .L493
 	.loc 1 1791 0
 	ldp	w2, w1, [x22, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
-.LVL482:
+.LVL490:
 	.loc 1 1792 0
 	ldrsw	x2, [x21, 20]
 	mov	w1, 255
 	ldr	x0, [x21, 144]
 	bl	memset
-.LVL483:
-.LBE1571:
-.LBE1576:
-.LBB1577:
-.LBB1578:
+.LVL491:
+.LBE1581:
+.LBE1586:
+.LBB1587:
+.LBB1588:
 	.loc 1 1686 0
 	ldr	x26, [x19, 272]
-.LVL484:
+.LVL492:
 	.loc 1 1692 0
-	adrp	x1, .LC35
+	adrp	x1, .LC37
 	mov	w2, 0
-	add	x1, x1, :lo12:.LC35
+	add	x1, x1, :lo12:.LC37
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL485:
+.LVL493:
 	.loc 1 1693 0
-	cbz	x0, .L515
+	cbz	x0, .L523
 	.loc 1 1696 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL486:
+.LVL494:
 	mov	w24, w0
 	.loc 1 1698 0
-	cbz	w0, .L559
-.L486:
-.LBE1578:
-.LBE1577:
+	cbz	w0, .L567
+.L494:
+.LBE1588:
+.LBE1587:
 	.loc 1 2013 0
-	adrp	x1, .LC68
+	adrp	x1, .LC70
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC68
+	add	x1, x1, :lo12:.LC70
 	bl	_dev_err
-.LVL487:
+.LVL495:
 	.loc 1 2014 0
-	b	.L468
-.LVL488:
+	b	.L476
+.LVL496:
 	.p2align 3
-.L477:
+.L485:
 	.loc 1 1996 0
 	mov	w24, -22
 	.loc 1 1995 0
-	adrp	x1, .LC72
+	adrp	x1, .LC74
 	mov	w2, w24
-	add	x1, x1, :lo12:.LC72
+	add	x1, x1, :lo12:.LC74
 	mov	x0, x20
 	bl	_dev_err
-.LVL489:
-.L468:
+.LVL497:
+.L476:
 	.loc 1 2038 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w24
-.LVL490:
+.LVL498:
 	ldr	x2, [x29, 200]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L560
+	cbnz	x1, .L568
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL491:
+.LVL499:
 	ldp	x23, x24, [sp, 48]
 	ldp	x25, x26, [sp, 64]
-.LVL492:
+.LVL500:
 	ldp	x27, x28, [sp, 80]
-.LVL493:
+.LVL501:
 	ldp	x29, x30, [sp], 208
 	.cfi_remember_state
 	.cfi_restore 30
@@ -5730,224 +5821,224 @@ ebc_probe:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL494:
+.LVL502:
 	.p2align 3
-.L558:
+.L566:
 	.cfi_restore_state
-.LBB1585:
-.LBB1572:
+.LBB1595:
+.LBB1582:
 	.loc 1 1742 0
-	adrp	x1, .LC34
+	adrp	x1, .LC36
 	mov	x0, x26
-	add	x1, x1, :lo12:.LC34
+	add	x1, x1, :lo12:.LC36
 	bl	_dev_err
-.LVL495:
-.L482:
-.LBE1572:
-.LBE1585:
+.LVL503:
+.L490:
+.LBE1582:
+.LBE1595:
 	.loc 1 2006 0
-	adrp	x1, .LC67
+	adrp	x1, .LC69
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC67
+	add	x1, x1, :lo12:.LC69
 	bl	_dev_err
-.LVL496:
+.LVL504:
 	.loc 1 2007 0
-	b	.L468
-.LVL497:
+	b	.L476
+.LVL505:
 	.p2align 3
-.L481:
-.LBB1586:
-.LBB1546:
+.L489:
+.LBB1596:
+.LBB1556:
 	.loc 1 1335 0
 	str	wzr, [x22, 96]
-	b	.L507
+	b	.L515
 	.p2align 3
-.L480:
-.LBB1535:
-.LBB1533:
-.LBB1531:
+.L488:
+.LBB1545:
+.LBB1543:
+.LBB1541:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC32
-.LBE1531:
-.LBE1533:
-.LBE1535:
+	adrp	x1, .LC34
+.LBE1541:
+.LBE1543:
+.LBE1545:
 	.loc 1 1332 0
 	str	wzr, [x22, 92]
-.LBB1536:
-.LBB1534:
-.LBB1532:
+.LBB1546:
+.LBB1544:
+.LBB1542:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 120
-	add	x1, x1, :lo12:.LC32
+	add	x1, x1, :lo12:.LC34
 	bl	of_property_read_variable_u32_array
-.LVL498:
+.LVL506:
 	.loc 14 501 0
-	tbz	w0, #31, .L507
-	b	.L481
+	tbz	w0, #31, .L515
+	b	.L489
 	.p2align 3
-.L479:
-.LBE1532:
-.LBE1534:
-.LBE1536:
-.LBB1537:
-.LBB1526:
-.LBB1524:
+.L487:
+.LBE1542:
+.LBE1544:
+.LBE1546:
+.LBB1547:
+.LBB1536:
+.LBB1534:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC31
-.LBE1524:
-.LBE1526:
-.LBE1537:
+	adrp	x1, .LC33
+.LBE1534:
+.LBE1536:
+.LBE1547:
 	.loc 1 1329 0
 	str	wzr, [x22, 156]
-.LBB1538:
-.LBB1527:
-.LBB1525:
+.LBB1548:
+.LBB1537:
+.LBB1535:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 116
-	add	x1, x1, :lo12:.LC31
+	add	x1, x1, :lo12:.LC33
 	bl	of_property_read_variable_u32_array
-.LVL499:
+.LVL507:
 	.loc 14 501 0
-	tbz	w0, #31, .L506
-	b	.L480
+	tbz	w0, #31, .L514
+	b	.L488
 	.p2align 3
-.L478:
-.LBE1525:
-.LBE1527:
-.LBE1538:
-.LBB1539:
-.LBB1519:
-.LBB1517:
+.L486:
+.LBE1535:
+.LBE1537:
+.LBE1548:
+.LBB1549:
+.LBB1529:
+.LBB1527:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC30
-.LBE1517:
-.LBE1519:
-.LBE1539:
+	adrp	x1, .LC32
+.LBE1527:
+.LBE1529:
+.LBE1549:
 	.loc 1 1326 0
 	str	wzr, [x22, 152]
-.LBB1540:
-.LBB1520:
-.LBB1518:
+.LBB1550:
+.LBB1530:
+.LBB1528:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 180
-	add	x1, x1, :lo12:.LC30
+	add	x1, x1, :lo12:.LC32
 	bl	of_property_read_variable_u32_array
-.LVL500:
+.LVL508:
 	.loc 14 501 0
-	tbz	w0, #31, .L505
-	b	.L479
+	tbz	w0, #31, .L513
+	b	.L487
 	.p2align 3
-.L557:
-.LBE1518:
-.LBE1520:
-.LBE1540:
-.LBB1541:
-.LBB1512:
-.LBB1510:
+.L565:
+.LBE1528:
+.LBE1530:
+.LBE1550:
+.LBB1551:
+.LBB1522:
+.LBB1520:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
-	adrp	x1, .LC29
-.LBE1510:
-.LBE1512:
-.LBE1541:
+	adrp	x1, .LC31
+.LBE1520:
+.LBE1522:
+.LBE1551:
 	.loc 1 1323 0
 	str	wzr, [x22, 148]
-.LBB1542:
-.LBB1513:
-.LBB1511:
+.LBB1552:
+.LBB1523:
+.LBB1521:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 176
-	add	x1, x1, :lo12:.LC29
+	add	x1, x1, :lo12:.LC31
 	bl	of_property_read_variable_u32_array
-.LVL501:
+.LVL509:
 	.loc 14 501 0
-	tbz	w0, #31, .L504
-	b	.L478
-.LVL502:
+	tbz	w0, #31, .L512
+	b	.L486
+.LVL510:
 	.p2align 3
-.L559:
-.LBE1511:
-.LBE1513:
-.LBE1542:
-.LBE1546:
-.LBE1586:
-.LBB1587:
-.LBB1581:
-	.loc 1 1704 0
-	mov	x0, x26
+.L567:
+.LBE1521:
+.LBE1523:
+.LBE1552:
+.LBE1556:
+.LBE1596:
+.LBB1597:
+.LBB1591:
+	.loc 1 1704 0
+	mov	x0, x26
 	mov	x3, 1
-.LBB1579:
-.LBB1580:
+.LBB1589:
+.LBB1590:
 	.loc 15 204 0
 	ldp	x1, x26, [x29, 104]
-.LVL503:
+.LVL511:
 	add	x26, x26, 1
 	sub	x26, x26, x1
-.LBE1580:
-.LBE1579:
+.LBE1590:
+.LBE1589:
 	.loc 1 1704 0
 	sxtw	x2, w26
 	bl	devm_memremap
-.LVL504:
+.LVL512:
 	str	x0, [x19, 376]
 	.loc 1 1706 0
-	cbz	x0, .L561
+	cbz	x0, .L569
 	.loc 1 1711 0
 	bl	epd_lut_from_mem_init
-.LVL505:
+.LVL513:
 	.loc 1 1712 0
-	tbnz	w0, #31, .L562
-.L488:
-.LBE1581:
-.LBE1587:
-.LBB1588:
-.LBB1589:
+	tbnz	w0, #31, .L570
+.L496:
+.LBE1591:
+.LBE1597:
+.LBB1598:
+.LBB1599:
 	.loc 1 1801 0
 	add	x0, x19, 736
 	mov	x1, 68719476704
 	str	x1, [x21, 544]
 	.loc 1 1803 0
 	add	x25, x25, :lo12:.LANCHOR0
-.LBB1590:
-.LBB1591:
-.LBB1592:
-.LBB1593:
-.LBB1594:
+.LBB1600:
+.LBB1601:
+.LBB1602:
+.LBB1603:
+.LBB1604:
 	.loc 12 234 0
 	str	x0, [x19, 736]
-.LBE1594:
-.LBE1593:
-.LBE1592:
-.LBE1591:
-.LBE1590:
+.LBE1604:
+.LBE1603:
+.LBE1602:
+.LBE1601:
+.LBE1600:
 	.loc 1 1799 0
 	mov	w26, 99
-.LBB1596:
-.LBB1595:
+.LBB1606:
+.LBB1605:
 	.file 16 "./include/linux/list.h"
 	.loc 16 29 0
 	str	x0, [x0, 8]
-.LBE1595:
-.LBE1596:
+.LBE1605:
+.LBE1606:
 	.loc 1 1801 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x21, 568]
 	.loc 1 1803 0
-	adrp	x3, .LC69
+	adrp	x3, .LC71
 	mov	w2, -1
-	add	x3, x3, :lo12:.LC69
+	add	x3, x3, :lo12:.LC71
 	mov	x1, x21
 	adrp	x0, ebc_auto_tast_function
 	.loc 1 1799 0
@@ -5955,26 +6046,26 @@ ebc_probe:
 	.loc 1 1803 0
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
-.LVL506:
+.LVL514:
 	str	x0, [x25, 8]
 	.loc 1 1804 0
 	cmn	x0, #4096
-	bhi	.L563
+	bhi	.L571
 	.loc 1 1808 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
-.LVL507:
+.LVL515:
 	.loc 1 1809 0
 	ldr	x2, [x25, 8]
-.LBB1597:
-.LBB1598:
+.LBB1607:
+.LBB1608:
 	.file 17 "./arch/arm64/include/asm/atomic_lse.h"
 	.loc 17 47 0
 	mov	w0, 1
-.LVL508:
+.LVL516:
 	add	x1, x2, 48
-.LVL509:
+.LVL517:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -6002,49 +6093,49 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL510:
+.LVL518:
 #NO_APP
-.LBE1598:
-.LBE1597:
-.LBB1599:
+.LBE1608:
+.LBE1607:
+.LBB1609:
 	.loc 1 1812 0
-	adrp	x3, .LC40
+	adrp	x3, .LC42
 	adrp	x0, ebc_thread
-.LVL511:
-	add	x3, x3, :lo12:.LC40
+.LVL519:
+	add	x3, x3, :lo12:.LC42
 	mov	w2, -1
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x21
-.LBE1599:
+.LBE1609:
 	.loc 1 1811 0
 	str	w26, [x29, 104]
-.LBB1600:
+.LBB1610:
 	.loc 1 1812 0
 	bl	kthread_create_on_node
-.LVL512:
+.LVL520:
 	mov	x25, x0
-.LVL513:
+.LVL521:
 	cmn	x0, #4096
-	bhi	.L490
+	bhi	.L498
 	bl	wake_up_process
-.LVL514:
-.LBE1600:
+.LVL522:
+.LBE1610:
 	str	x25, [x21, 120]
 	.loc 1 1817 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x25
 	bl	sched_setscheduler_nocheck
-.LVL515:
+.LVL523:
 	.loc 1 1818 0
 	ldr	x2, [x21, 120]
-.LBB1601:
-.LBB1602:
+.LBB1611:
+.LBB1612:
 	.loc 17 47 0
 	mov	w0, 1
-.LVL516:
+.LVL524:
 	add	x1, x2, 48
-.LVL517:
+.LVL525:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -6072,62 +6163,62 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL518:
+.LVL526:
 #NO_APP
-.LBE1602:
-.LBE1601:
-.LBE1589:
-.LBE1588:
-.LBB1605:
-.LBB1606:
+.LBE1612:
+.LBE1611:
+.LBE1599:
+.LBE1598:
+.LBB1615:
+.LBB1616:
 	.loc 1 1827 0
 	mov	w0, -1
-.LVL519:
+.LVL527:
 	str	w0, [x21, 48]
-.LBB1607:
-.LBB1608:
+.LBB1617:
+.LBB1618:
 	.loc 4 39 0
 	add	x0, x19, 400
-.LVL520:
-.LBE1608:
-.LBE1607:
+.LVL528:
+.LBE1618:
+.LBE1617:
 	.loc 1 1831 0
 	str	wzr, [x21, 28]
 	.loc 1 1830 0
 	str	wzr, [x21, 80]
-.LBB1613:
-.LBB1609:
+.LBB1623:
+.LBB1619:
 	.loc 4 43 0
-	adrp	x1, .LC41
-.LBE1609:
-.LBE1613:
+	adrp	x1, .LC43
+.LBE1619:
+.LBE1623:
 	.loc 1 1826 0
 	str	wzr, [x21, 184]
-.LBB1614:
-.LBB1610:
+.LBB1624:
+.LBB1620:
 	.loc 4 43 0
-	add	x1, x1, :lo12:.LC41
-.LBE1610:
-.LBE1614:
+	add	x1, x1, :lo12:.LC43
+.LBE1620:
+.LBE1624:
 	.loc 1 1828 0
 	str	wzr, [x21, 592]
 	.loc 1 1838 0
 	add	x25, x19, 616
-.LVL521:
+.LVL529:
 	.loc 1 1829 0
 	str	wzr, [x21, 596]
 	.loc 1 1839 0
 	adrp	x26, jiffies
-.LBB1615:
-.LBB1611:
+.LBB1625:
+.LBB1621:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0]
-.LBE1611:
-.LBE1615:
+.LBE1621:
+.LBE1625:
 	.loc 1 1839 0
 	mov	x27, 268435455
-.LBB1616:
-.LBB1612:
+.LBB1626:
+.LBB1622:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0, 16]
 	stp	xzr, xzr, [x0, 32]
@@ -6145,9 +6236,9 @@ ebc_probe:
 	str	x1, [x19, 400]
 	.loc 4 45 0
 	bl	wakeup_source_add
-.LVL522:
-.LBE1612:
-.LBE1616:
+.LVL530:
+.LBE1622:
+.LBE1626:
 	.loc 1 1835 0
 	str	wzr, [x21, 424]
 	.loc 1 1838 0
@@ -6158,7 +6249,7 @@ ebc_probe:
 	adrp	x1, ebc_vdd_power_timeout
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
-.LVL523:
+.LVL531:
 	.loc 1 1839 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
@@ -6167,7 +6258,7 @@ ebc_probe:
 	.loc 1 1839 0
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL524:
+.LVL532:
 	.loc 1 1842 0
 	mov	x4, 0
 	mov	x3, 0
@@ -6176,109 +6267,109 @@ ebc_probe:
 	adrp	x1, ebc_frame_timeout
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
-.LVL525:
+.LVL533:
 	.loc 1 1843 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL526:
-.LBE1606:
-.LBE1605:
-.LBB1617:
-.LBB1618:
+.LVL534:
+.LBE1616:
+.LBE1615:
+.LBB1627:
+.LBB1628:
 	.loc 1 1853 0
 	adrp	x0, saved_command_line
-	adrp	x1, .LC42
+	adrp	x1, .LC44
 	.loc 1 1850 0
 	stp	wzr, wzr, [x29, 100]
-.LVL527:
+.LVL535:
 	.loc 1 1853 0
-	add	x1, x1, :lo12:.LC42
+	add	x1, x1, :lo12:.LC44
 	ldr	x25, [x0, #:lo12:saved_command_line]
 	mov	x0, x25
 	bl	strstr
-.LVL528:
+.LVL536:
 	.loc 1 1854 0
-	adrp	x1, .LC43
+	adrp	x1, .LC45
 	.loc 1 1853 0
 	mov	x26, x0
-.LVL529:
+.LVL537:
 	.loc 1 1854 0
-	add	x1, x1, :lo12:.LC43
+	add	x1, x1, :lo12:.LC45
 	mov	x0, x25
 	bl	strstr
-.LVL530:
+.LVL538:
 	mov	x28, x0
-.LVL531:
+.LVL539:
 	.loc 1 1859 0
-	cbz	x26, .L491
+	cbz	x26, .L499
 	.loc 1 1860 0
 	add	x2, x29, 100
-	adrp	x1, .LC44
+	adrp	x1, .LC46
 	mov	x0, x26
-	add	x1, x1, :lo12:.LC44
+	add	x1, x1, :lo12:.LC46
 	bl	sscanf
-.LVL532:
+.LVL540:
 	.loc 1 1861 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
-	bls	.L564
-.L491:
+	bls	.L572
+.L499:
 	.loc 1 1873 0
 	mov	w25, 0
-.LVL533:
+.LVL541:
 	mov	x27, 0
-.LVL534:
+.LVL542:
 	.loc 1 1857 0
 	mov	x26, 0
-.LVL535:
+.LVL543:
 	.loc 1 1873 0
-	cbz	x28, .L511
-.LVL536:
-.L510:
+	cbz	x28, .L519
+.LVL544:
+.L518:
 	.loc 1 1874 0
 	add	x2, x29, 104
 	mov	x0, x28
-	adrp	x1, .LC47
-	add	x1, x1, :lo12:.LC47
+	adrp	x1, .LC49
+	add	x1, x1, :lo12:.LC49
 	bl	sscanf
-.LVL537:
+.LVL545:
 	.loc 1 1852 0
 	mov	w28, 0
-.LVL538:
+.LVL546:
 	.loc 1 1875 0
 	ldr	w2, [x29, 104]
 	.loc 1 1857 0
 	mov	x26, 0
-.LVL539:
+.LVL547:
 	.loc 1 1875 0
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
-	bls	.L565
-.L495:
+	bls	.L573
+.L503:
 	.loc 1 1887 0
-	cbnz	w25, .L494
-.LVL540:
-.L511:
+	cbnz	w25, .L502
+.LVL548:
+.L519:
 	.loc 1 1888 0
 	ldr	x0, [x21, 88]
-	adrp	x1, .LC50
-	add	x1, x1, :lo12:.LC50
+	adrp	x1, .LC52
+	add	x1, x1, :lo12:.LC52
 	bl	_dev_info
-.LVL541:
+.LVL549:
 	.loc 1 1889 0
 	ldr	x0, [x19, 16]
 	bl	ebc_pmic_verity_vcom
-.LVL542:
-.LBB1619:
-.LBB1620:
+.LVL550:
+.LBB1629:
+.LBB1630:
 	.loc 1 1243 0
 	bl	ebc_empty_buf_get
-.LVL543:
+.LVL551:
 	mov	x25, x0
-.LVL544:
+.LVL552:
 	.loc 1 1244 0
 	ldp	w2, w0, [x19, 108]
 	mov	w1, 255
@@ -6286,7 +6377,7 @@ ebc_probe:
 	ldr	x0, [x25, 16]
 	lsr	w2, w2, 1
 	bl	memset
-.LVL545:
+.LVL553:
 	.loc 1 1247 0
 	stp	wzr, wzr, [x25, 48]
 	.loc 1 1245 0
@@ -6302,151 +6393,151 @@ ebc_probe:
 	str	w1, [x25, 60]
 	.loc 1 1250 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL546:
-.L497:
-.LBE1620:
-.LBE1619:
+.LVL554:
+.L505:
+.LBE1630:
+.LBE1629:
 	.loc 1 1906 0
-	cbnz	w28, .L566
-.L499:
+	cbnz	w28, .L574
+.L507:
 	.loc 1 1919 0
 	ldr	w0, [x21, 80]
 	adrp	x22, .LANCHOR1
-	cbz	w0, .L567
-.L501:
+	cbz	w0, .L575
+.L509:
 	.loc 1 1924 0
-	cbz	x27, .L502
+	cbz	x27, .L510
 	.loc 1 1925 0
 	mov	x0, x27
 	bl	kfree
-.LVL547:
-.L502:
+.LVL555:
+.L510:
 	.loc 1 1926 0
-	cbz	x26, .L493
+	cbz	x26, .L501
 	.loc 1 1927 0
 	mov	x0, x26
 	bl	kfree
-.LVL548:
-.L493:
-.LBE1618:
-.LBE1617:
-.LBB1630:
-.LBB1631:
-.LBB1632:
+.LVL556:
+.L501:
+.LBE1628:
+.LBE1627:
+.LBB1640:
+.LBB1641:
+.LBB1642:
 	.loc 2 1186 0
 	str	x19, [x20, 184]
-.LBE1632:
-.LBE1631:
-.LBE1630:
-.LBB1633:
-.LBB1634:
+.LBE1642:
+.LBE1641:
+.LBE1640:
+.LBB1643:
+.LBB1644:
 	.loc 1 1671 0
 	add	x22, x22, :lo12:.LANCHOR1
 	add	x0, x22, 224
 	bl	misc_register
-.LVL549:
+.LVL557:
 	.loc 1 1673 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 400
 	bl	device_create_file
-.LVL550:
+.LVL558:
 	.loc 1 1674 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 432
 	bl	device_create_file
-.LVL551:
+.LVL559:
 	.loc 1 1675 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 464
 	bl	device_create_file
-.LVL552:
+.LVL560:
 	.loc 1 1676 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 496
 	bl	device_create_file
-.LVL553:
+.LVL561:
 	.loc 1 1677 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 528
 	bl	device_create_file
-.LVL554:
+.LVL562:
 	.loc 1 1678 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 560
 	bl	device_create_file
-.LVL555:
-.LBE1634:
-.LBE1633:
+.LVL563:
+.LBE1644:
+.LBE1643:
 	.loc 1 2035 0
 	ldr	x0, [x21, 88]
 	adrp	x2, .LC15
-	adrp	x1, .LC51
+	adrp	x1, .LC53
 	add	x2, x2, :lo12:.LC15
-	add	x1, x1, :lo12:.LC51
+	add	x1, x1, :lo12:.LC53
 	bl	_dev_info
-.LVL556:
+.LVL564:
 	.loc 1 2037 0
-	b	.L468
-.LVL557:
+	b	.L476
+.LVL565:
 	.p2align 3
-.L564:
-.LBB1635:
-.LBB1627:
+.L572:
+.LBB1645:
+.LBB1637:
 	.loc 1 1863 0
 	ldr	x0, [x21, 88]
-	adrp	x1, .LC45
-	add	x1, x1, :lo12:.LC45
+	adrp	x1, .LC47
+	add	x1, x1, :lo12:.LC47
 	bl	_dev_info
-.LVL558:
+.LVL566:
 	.loc 1 1864 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
-.LBB1621:
-.LBB1622:
-.LBB1623:
+.LBB1631:
+.LBB1632:
+.LBB1633:
 	.file 18 "./include/linux/slab.h"
 	.loc 18 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL559:
+.LVL567:
 	mov	x27, x0
-.LVL560:
-.LBE1623:
-.LBE1622:
-.LBE1621:
+.LVL568:
+.LBE1633:
+.LBE1632:
+.LBE1631:
 	.loc 1 1865 0
-	cbz	x0, .L568
+	cbz	x0, .L576
 	.loc 1 1869 0
 	ldp	w2, w1, [x22, 84]
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 100]
-.LVL561:
+.LVL569:
 	sub	x1, x1, x3
-.LVL562:
+.LVL570:
 	ldr	x3, [x21, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL563:
+.LVL571:
 	.loc 1 1873 0
-	cbnz	x28, .L569
+	cbnz	x28, .L577
 	.loc 1 1852 0
 	mov	w28, 0
-.LVL564:
+.LVL572:
 	.loc 1 1857 0
 	mov	x26, 0
-.LVL565:
-.L494:
+.LVL573:
+.L502:
 	.loc 1 1894 0
 	bl	ebc_empty_buf_get
-.LVL566:
+.LVL574:
 	mov	x25, x0
-.LVL567:
+.LVL575:
 	.loc 1 1895 0
-	cbz	x0, .L497
+	cbz	x0, .L505
 	.loc 1 1896 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x27
@@ -6454,7 +6545,7 @@ ebc_probe:
 	ldr	x0, [x25, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL568:
+.LVL576:
 	.loc 1 1899 0
 	stp	wzr, wzr, [x25, 48]
 	.loc 1 1897 0
@@ -6470,11 +6561,11 @@ ebc_probe:
 	str	w1, [x25, 60]
 	.loc 1 1902 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL569:
-	b	.L497
-.LVL570:
+.LVL577:
+	b	.L505
+.LVL578:
 	.p2align 3
-.L567:
+.L575:
 	.loc 1 1920 0
 	mov	w2, 1
 	str	w2, [x21, 80]
@@ -6483,35 +6574,35 @@ ebc_probe:
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL571:
-	b	.L501
-.LVL572:
+.LVL579:
+	b	.L509
+.LVL580:
 	.p2align 3
-.L565:
+.L573:
 	.loc 1 1877 0
 	ldr	x0, [x21, 88]
-	adrp	x1, .LC48
-	add	x1, x1, :lo12:.LC48
+	adrp	x1, .LC50
+	add	x1, x1, :lo12:.LC50
 	bl	_dev_info
-.LVL573:
+.LVL581:
 	.loc 1 1878 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
-.LBB1624:
-.LBB1625:
-.LBB1626:
+.LBB1634:
+.LBB1635:
+.LBB1636:
 	.loc 18 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL574:
+.LVL582:
 	mov	x26, x0
-.LBE1626:
-.LBE1625:
-.LBE1624:
+.LBE1636:
+.LBE1635:
+.LBE1634:
 	.loc 1 1879 0
-	cbz	x0, .L570
+	cbz	x0, .L578
 	.loc 1 1883 0
 	ldp	w2, w1, [x22, 84]
 	.loc 1 1876 0
@@ -6520,39 +6611,39 @@ ebc_probe:
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
-.LVL575:
+.LVL583:
 	sub	x1, x1, x3
-.LVL576:
+.LVL584:
 	ldr	x3, [x21, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL577:
-	b	.L495
-.LVL578:
+.LVL585:
+	b	.L503
+.LVL586:
 	.p2align 3
-.L485:
-.LBE1627:
-.LBE1635:
-.LBB1636:
-.LBB1573:
+.L493:
+.LBE1637:
+.LBE1645:
+.LBB1646:
+.LBB1583:
 	.loc 1 1752 0
 	mov	w24, -12
-	b	.L482
-.LVL579:
+	b	.L490
+.LVL587:
 	.p2align 3
-.L566:
-.LBE1573:
-.LBE1636:
-.LBB1637:
-.LBB1628:
+.L574:
+.LBE1583:
+.LBE1646:
+.LBB1647:
+.LBB1638:
 	.loc 1 1907 0
 	bl	ebc_empty_buf_get
-.LVL580:
+.LVL588:
 	mov	x25, x0
-.LVL581:
+.LVL589:
 	.loc 1 1908 0
-	cbz	x0, .L499
+	cbz	x0, .L507
 	.loc 1 1909 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x26
@@ -6560,7 +6651,7 @@ ebc_probe:
 	ldr	x0, [x25, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL582:
+.LVL590:
 	.loc 1 1912 0
 	stp	wzr, wzr, [x25, 48]
 	.loc 1 1910 0
@@ -6576,222 +6667,222 @@ ebc_probe:
 	str	w1, [x25, 60]
 	.loc 1 1915 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL583:
-	b	.L499
-.LVL584:
+.LVL591:
+	b	.L507
+.LVL592:
 	.p2align 3
-.L562:
-.LBE1628:
-.LBE1637:
-.LBB1638:
-.LBB1582:
+.L570:
+.LBE1638:
+.LBE1647:
+.LBB1648:
+.LBB1592:
 	.loc 1 1713 0
 	ldr	x0, [x19, 272]
-	adrp	x1, .LC37
-	add	x1, x1, :lo12:.LC37
+	adrp	x1, .LC39
+	add	x1, x1, :lo12:.LC39
 	bl	_dev_err
-.LVL585:
+.LVL593:
 	.loc 1 1714 0
 	ldr	x0, [x19, 272]
 	mov	w2, w26
 	ldr	x1, [x19, 376]
 	bl	epd_lut_from_file_init
-.LVL586:
+.LVL594:
 	.loc 1 1715 0
-	tbz	w0, #31, .L488
+	tbz	w0, #31, .L496
 	.loc 1 1716 0
 	ldr	x0, [x19, 272]
-	adrp	x1, .LC38
+	adrp	x1, .LC40
 	.loc 1 1717 0
 	mov	w24, -1
 	.loc 1 1716 0
-	add	x1, x1, :lo12:.LC38
+	add	x1, x1, :lo12:.LC40
 	bl	_dev_err
-.LVL587:
-	b	.L486
-.LVL588:
+.LVL595:
+	b	.L494
+.LVL596:
 	.p2align 3
-.L472:
-.LBE1582:
-.LBE1638:
+.L480:
+.LBE1592:
+.LBE1648:
 	.loc 1 1960 0
 	mov	w24, -517
-	b	.L468
-.LVL589:
+	b	.L476
+.LVL597:
 	.p2align 3
-.L563:
-.LBB1639:
-.LBB1603:
+.L571:
+.LBB1649:
+.LBB1613:
 	.loc 1 1805 0
 	ldr	x0, [x21, 88]
-	adrp	x1, .LC39
-	add	x1, x1, :lo12:.LC39
+	adrp	x1, .LC41
+	add	x1, x1, :lo12:.LC41
 	bl	_dev_err
-.LVL590:
-.L489:
-.LBE1603:
-.LBE1639:
+.LVL598:
+.L497:
+.LBE1613:
+.LBE1649:
 	.loc 1 2020 0
-	adrp	x1, .LC71
+	adrp	x1, .LC73
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC71
+	add	x1, x1, :lo12:.LC73
 	.loc 1 2021 0
 	mov	w24, -1
 	.loc 1 2020 0
 	bl	_dev_err
-.LVL591:
+.LVL599:
 	.loc 1 2021 0
-	b	.L468
-.LVL592:
+	b	.L476
+.LVL600:
 	.p2align 3
-.L490:
-.LBB1640:
-.LBB1604:
+.L498:
+.LBB1650:
+.LBB1614:
 	.loc 1 1814 0
 	ldr	x0, [x21, 88]
-.LVL593:
-	adrp	x1, .LC70
+.LVL601:
+	adrp	x1, .LC72
 	.loc 1 1812 0
 	str	x25, [x21, 120]
 	.loc 1 1814 0
-	add	x1, x1, :lo12:.LC70
+	add	x1, x1, :lo12:.LC72
 	bl	_dev_err
-.LVL594:
-	b	.L489
-.LVL595:
+.LVL602:
+	b	.L497
+.LVL603:
 	.p2align 3
-.L513:
-.LBE1604:
-.LBE1640:
+.L521:
+.LBE1614:
+.LBE1650:
 	.loc 1 1946 0
 	mov	w24, -12
-	b	.L468
-.LVL596:
+	b	.L476
+.LVL604:
 	.p2align 3
-.L514:
-.LBB1641:
-.LBB1574:
+.L522:
+.LBB1651:
+.LBB1584:
 	.loc 1 1737 0
 	mov	w24, -19
-	b	.L482
-.LVL597:
-.L553:
-.LBE1574:
-.LBE1641:
+	b	.L490
+.LVL605:
+.L561:
+.LBE1584:
+.LBE1651:
 	.loc 1 1953 0
-	adrp	x1, .LC23
+	adrp	x1, .LC25
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC23
+	add	x1, x1, :lo12:.LC25
 	.loc 1 1954 0
 	mov	w24, -19
 	.loc 1 1953 0
 	bl	_dev_err
-.LVL598:
+.LVL606:
 	.loc 1 1954 0
-	b	.L468
-.L556:
+	b	.L476
+.L564:
 	.loc 1 1981 0
-	adrp	x1, .LC27
+	adrp	x1, .LC29
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC27
+	add	x1, x1, :lo12:.LC29
 	.loc 1 1982 0
 	mov	w24, -517
 	.loc 1 1981 0
 	bl	_dev_err
-.LVL599:
+.LVL607:
 	.loc 1 1982 0
-	b	.L468
-.L554:
+	b	.L476
+.L562:
 	.loc 1 1969 0
-	adrp	x1, .LC25
+	adrp	x1, .LC27
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC25
+	add	x1, x1, :lo12:.LC27
 	.loc 1 1970 0
 	mov	w24, -19
 	.loc 1 1969 0
 	bl	_dev_err
-.LVL600:
+.LVL608:
 	.loc 1 1970 0
-	b	.L468
-.LVL601:
-.L515:
-.LBB1642:
-.LBB1583:
+	b	.L476
+.LVL609:
+.L523:
+.LBB1652:
+.LBB1593:
 	.loc 1 1694 0
 	mov	w24, -19
-	b	.L486
-.LVL602:
-.L555:
-.LBE1583:
-.LBE1642:
+	b	.L494
+.LVL610:
+.L563:
+.LBE1593:
+.LBE1652:
 	.loc 1 1976 0
-	adrp	x1, .LC26
+	adrp	x1, .LC28
 	mov	x0, x20
-.LVL603:
-	add	x1, x1, :lo12:.LC26
+.LVL611:
+	add	x1, x1, :lo12:.LC28
 	.loc 1 1977 0
 	mov	w24, -517
 	.loc 1 1976 0
 	bl	_dev_err
-.LVL604:
+.LVL612:
 	.loc 1 1977 0
-	b	.L468
-.LVL605:
-.L561:
-.LBB1643:
-.LBB1584:
+	b	.L476
+.LVL613:
+.L569:
+.LBB1653:
+.LBB1594:
 	.loc 1 1707 0
 	ldr	x0, [x19, 272]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
-	adrp	x1, .LC36
+	adrp	x1, .LC38
 	mov	w3, 1707
-	add	x2, x2, 16
-	add	x1, x1, :lo12:.LC36
+	add	x2, x2, 32
+	add	x1, x1, :lo12:.LC38
 	.loc 1 1708 0
 	mov	w24, -12
 	.loc 1 1707 0
 	bl	_dev_err
-.LVL606:
-	b	.L486
-.LVL607:
-.L560:
-.LBE1584:
-.LBE1643:
+.LVL614:
+	b	.L494
+.LVL615:
+.L568:
+.LBE1594:
+.LBE1653:
 	.loc 1 2038 0
 	bl	__stack_chk_fail
-.LVL608:
-.L570:
-.LBB1644:
-.LBB1629:
+.LVL616:
+.L578:
+.LBB1654:
+.LBB1639:
 	.loc 1 1880 0
 	ldr	x0, [x21, 88]
-.LVL609:
-	adrp	x1, .LC49
+.LVL617:
+	adrp	x1, .LC51
 	adrp	x22, .LANCHOR1
-	add	x1, x1, :lo12:.LC49
+	add	x1, x1, :lo12:.LC51
 	bl	_dev_err
-.LVL610:
-	b	.L493
-.LVL611:
-.L568:
+.LVL618:
+	b	.L501
+.LVL619:
+.L576:
 	.loc 1 1866 0
 	ldr	x0, [x21, 88]
-.LVL612:
-	adrp	x1, .LC46
+.LVL620:
+	adrp	x1, .LC48
 	adrp	x22, .LANCHOR1
-	add	x1, x1, :lo12:.LC46
+	add	x1, x1, :lo12:.LC48
 	bl	_dev_err
-.LVL613:
-	b	.L493
-.LVL614:
-.L569:
+.LVL621:
+	b	.L501
+.LVL622:
+.L577:
 	.loc 1 1862 0
 	mov	w25, 1
-.LVL615:
-	b	.L510
-.LBE1629:
-.LBE1644:
+.LVL623:
+	b	.L518
+.LBE1639:
+.LBE1654:
 	.cfi_endproc
 .LFE2840:
 	.size	ebc_probe, .-ebc_probe
@@ -6802,198 +6893,108 @@ ebc_power_set.constprop.8:
 .LFB2854:
 	.loc 1 180 0
 	.cfi_startproc
-.LVL616:
-	stp	x29, x30, [sp, -32]!
-	.cfi_def_cfa_offset 32
-	.cfi_offset 29, -32
-	.cfi_offset 30, -24
+.LVL624:
+	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, -16
-	.cfi_offset 20, -8
+	.cfi_offset 19, -32
+	.cfi_offset 20, -24
+	.loc 1 186 0
+	add	x20, x0, 184
+	.loc 1 180 0
+	str	x21, [sp, 32]
+	.cfi_offset 21, -16
 	.loc 1 180 0
 	mov	x19, x0
-	.loc 1 196 0
-	mov	x0, 0
-.LVL617:
-	bl	ebc_notify
-.LVL618:
-.LBB1645:
-.LBB1646:
-	.loc 3 35 0
-	mov	w1, 0
-.LBE1646:
-.LBE1645:
-	.loc 1 198 0
+	.loc 1 186 0
+	ldr	w0, [x20, 424]
+.LVL625:
+	cbz	w0, .L582
+.L580:
+	.loc 1 190 0
+	mov	w21, 1
+	str	w21, [x20, 184]
+.LBB1655:
+.LBB1656:
+	.loc 11 46 0
+	add	x1, x19, 24
+.LBE1656:
+.LBE1655:
+	.loc 1 191 0
+	ldr	x2, [x19, 8]
+.LBB1658:
+.LBB1657:
+	.loc 11 46 0
+	mov	x0, x2
+	ldr	x2, [x2, 48]
+	blr	x2
+.LVL626:
+.LBE1657:
+.LBE1658:
+	.loc 1 192 0
 	ldr	x2, [x19, 16]
-	.loc 1 197 0
-	str	wzr, [x19, 368]
-.LBB1648:
-.LBB1647:
-	.loc 3 35 0
+.LBB1659:
+.LBB1660:
+	.loc 3 30 0
+	mov	w1, w21
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL619:
-.LBE1647:
-.LBE1648:
-	.loc 1 199 0
-	ldr	x1, [x19, 8]
-.LBB1649:
-.LBB1650:
-	.loc 11 51 0
-	mov	x0, x1
-	ldr	x1, [x1, 56]
-	blr	x1
-.LVL620:
-.LBE1650:
-.LBE1649:
-	.loc 1 200 0
-	ldr	w0, [x19, 608]
-	cbnz	w0, .L577
-	.loc 1 204 0
+.LVL627:
+.LBE1660:
+.LBE1659:
+	.loc 1 193 0
 	ldr	x0, [x19]
-	adrp	x1, .LC73
-	add	x1, x1, :lo12:.LC73
+	adrp	x1, .LC75
+	add	x1, x1, :lo12:.LC75
 	bl	_dev_info
-.LVL621:
+.LVL628:
 	.loc 1 208 0
+	ldr	x21, [sp, 32]
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
-.LVL622:
-	ldp	x29, x30, [sp], 32
+.LVL629:
+	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
-.LVL623:
+.LVL630:
 	.p2align 3
-.L577:
+.L582:
 	.cfi_restore_state
-	.loc 1 201 0
-	str	wzr, [x19, 608]
-.LBB1651:
-.LBB1652:
-	.loc 4 68 0
+	.loc 1 187 0
+	mov	w0, 1
+	str	w0, [x20, 424]
+.LBB1661:
+.LBB1662:
+	.loc 4 58 0
 	add	x0, x19, 400
-	bl	__pm_relax
-.LVL624:
-.LBE1652:
-.LBE1651:
-	.loc 1 204 0
-	ldr	x0, [x19]
-	adrp	x1, .LC73
-	add	x1, x1, :lo12:.LC73
-	bl	_dev_info
-.LVL625:
-	.loc 1 208 0
-	mov	w0, 0
-	ldp	x19, x20, [sp, 16]
-.LVL626:
-	ldp	x29, x30, [sp], 32
-	.cfi_restore 20
-	.cfi_restore 19
-	.cfi_restore 29
-	.cfi_restore 30
-	.cfi_def_cfa 31, 0
-	ret
+	bl	__pm_stay_awake
+.LVL631:
+	b	.L580
+.LBE1662:
+.LBE1661:
 	.cfi_endproc
 .LFE2854:
 	.size	ebc_power_set.constprop.8, .-ebc_power_set.constprop.8
 	.align	2
 	.p2align 3,,7
-	.type	ebc_suspend, %function
-ebc_suspend:
-.LFB2842:
-	.loc 1 2048 0
-	.cfi_startproc
-.LVL627:
-	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
-.LBB1653:
-.LBB1654:
-	.loc 2 1181 0
-	ldr	x20, [x0, 184]
-.LBE1654:
-.LBE1653:
-	.loc 1 2052 0
-	add	x19, x20, 184
-	ldr	w0, [x19, 184]
-.LVL628:
-	cmp	w0, 1
-	beq	.L581
-.L579:
-	.loc 1 2056 0
-	mov	w0, 1
-	str	w0, [x19, 596]
-	.loc 1 2058 0
-	ldr	x1, [x20, 16]
-.LBB1655:
-.LBB1656:
-	.loc 3 40 0
-	mov	x0, x1
-	ldr	x1, [x1, 40]
-	blr	x1
-.LVL629:
-.LBE1656:
-.LBE1655:
-	.loc 1 2059 0
-	ldr	x0, [x19, 88]
-	adrp	x1, .LC75
-	add	x1, x1, :lo12:.LC75
-	bl	_dev_info
-.LVL630:
-	.loc 1 2062 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
-.L581:
-	.cfi_restore_state
-	.loc 1 2053 0
-	ldr	x0, [x19, 88]
-	adrp	x2, .LANCHOR3
-	add	x2, x2, :lo12:.LANCHOR3
-	adrp	x1, .LC74
-	add	x2, x2, 40
-	add	x1, x1, :lo12:.LC74
-	bl	_dev_info
-.LVL631:
-	.loc 1 2054 0
-	mov	x0, x20
-	bl	ebc_power_set.constprop.8
-.LVL632:
-	b	.L579
-	.cfi_endproc
-.LFE2842:
-	.size	ebc_suspend, .-ebc_suspend
-	.align	2
-	.p2align 3,,7
 	.global	refresh_new_image2
 	.type	refresh_new_image2, %function
 refresh_new_image2:
 .LFB2806:
 	.loc 1 212 0
 	.cfi_startproc
-.LVL633:
+.LVL632:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -7005,46 +7006,46 @@ refresh_new_image2:
 	cmp	w6, 0
 	add	w14, w6, 7
 	csel	w14, w14, w6, lt
-.LVL634:
+.LVL633:
 	.loc 1 221 0
 	cmp	w30, 0
-	ble	.L582
+	ble	.L583
 	asr	w14, w14, 3
-.LVL635:
+.LVL634:
 	mov	w16, 0
-.LVL636:
+.LVL635:
 	sub	w18, w14, #1
 	.loc 1 233 0
 	mov	w15, 15
 	add	x18, x18, 1
 	lsl	x17, x18, 2
 	lsl	x18, x18, 3
-.LVL637:
+.LVL636:
 	.p2align 2
-.L584:
+.L585:
 	.loc 1 222 0 discriminator 1
 	mov	x10, x3
 	mov	x7, 0
 	cmp	w14, 0
-	bgt	.L601
-	b	.L598
-.LVL638:
+	bgt	.L602
+	b	.L599
+.LVL637:
 	.p2align 3
-.L606:
+.L607:
 	.loc 1 243 0
 	orr	w4, w4, -65536
-.L590:
-.LVL639:
+.L591:
+.LVL638:
 	.loc 1 257 0
 	orn	w8, w11, w6
 	and	w6, w6, w11
-.LVL640:
+.LVL639:
 	.loc 1 255 0
 	bic	w9, w9, w4
 	.loc 1 257 0
 	and	w8, w8, w4
 	and	w4, w6, w4
-.LVL641:
+.LVL640:
 	cmp	w5, 18
 	orr	w6, w8, w9
 	orr	w4, w4, w9
@@ -7054,9 +7055,9 @@ refresh_new_image2:
 	add	x7, x7, 1
 	.loc 1 222 0
 	cmp	w14, w7
-	ble	.L605
-.LVL642:
-.L601:
+	ble	.L606
+.LVL641:
+.L602:
 	.loc 1 223 0
 	ldr	w8, [x10]
 	add	x10, x10, 8
@@ -7064,19 +7065,19 @@ refresh_new_image2:
 	ldr	w6, [x1, x7, lsl 2]
 	.loc 1 232 0
 	and	w4, w8, 255
-.LVL643:
+.LVL642:
 	.loc 1 226 0
 	ldr	w11, [x2, x7, lsl 2]
-.LVL644:
+.LVL643:
 	.loc 1 233 0
 	cmp	w4, 0
 	.loc 1 225 0
 	ldr	w9, [x0, x7, lsl 2]
 	.loc 1 230 0
 	mov	w4, 65535
-.LVL645:
+.LVL644:
 	.loc 1 229 0
-	cbz	w8, .L585
+	cbz	w8, .L586
 	.loc 1 233 0
 	csel	w4, wzr, w15, ne
 	.loc 1 235 0
@@ -7091,7 +7092,7 @@ refresh_new_image2:
 	tst	w8, -16777216
 	orr	w8, w4, 61440
 	csel	w4, w8, w4, eq
-.L585:
+.L586:
 	.loc 1 241 0
 	ldr	w8, [x10, -4]
 	.loc 1 247 0
@@ -7101,7 +7102,7 @@ refresh_new_image2:
 	.loc 1 247 0
 	cmp	w12, 0
 	.loc 1 242 0
-	cbz	w8, .L606
+	cbz	w8, .L607
 	.loc 1 247 0
 	csel	w4, w13, w4, eq
 	.loc 1 249 0
@@ -7116,28 +7117,28 @@ refresh_new_image2:
 	tst	w8, -16777216
 	orr	w8, w4, -268435456
 	csel	w4, w8, w4, eq
-	b	.L590
-.LVL646:
+	b	.L591
+.LVL645:
 	.p2align 3
-.L605:
+.L606:
 	add	x1, x1, x17
 	add	x2, x2, x17
 	add	x3, x3, x18
-.LVL647:
+.LVL646:
 	add	x0, x0, x17
-.LVL648:
-.L598:
+.LVL647:
+.L599:
 	.loc 1 221 0 discriminator 2
 	add	w16, w16, 1
 	cmp	w30, w16
-	bne	.L584
-.L582:
+	bne	.L585
+.L583:
 	.loc 1 263 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
-.LVL649:
+.LVL648:
 	ret
 	.cfi_endproc
 .LFE2806:
@@ -7150,14 +7151,14 @@ new_buffer_refresh:
 .LFB2807:
 	.loc 1 266 0
 	.cfi_startproc
-.LVL650:
+.LVL649:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
 	.loc 1 267 0
 	adrp	x0, .LANCHOR0
-.LVL651:
+.LVL650:
 	.loc 1 266 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -7169,12 +7170,12 @@ new_buffer_refresh:
 	add	x19, x19, :lo12:.LANCHOR1
 	.loc 1 267 0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-.LVL652:
+.LVL651:
 	.loc 1 270 0
 	add	x19, x19, 592
 	mov	x0, x19
 	bl	down_write
-.LVL653:
+.LVL652:
 	.loc 1 272 0
 	add	x4, x20, 184
 	ldr	x1, [x4, 208]
@@ -7184,14 +7185,14 @@ new_buffer_refresh:
 	ldr	w5, [x1, 40]
 	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
-.LVL654:
+.LVL653:
 	.loc 1 276 0
 	mov	x0, x19
 	bl	up_write
-.LVL655:
+.LVL654:
 	.loc 1 277 0
 	ldp	x19, x20, [sp, 16]
-.LVL656:
+.LVL655:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -7209,7 +7210,7 @@ ebc_thread:
 .LFB2819:
 	.loc 1 925 0
 	.cfi_startproc
-.LVL657:
+.LVL656:
 	stp	x29, x30, [sp, -224]!
 	.cfi_def_cfa_offset 224
 	.cfi_offset 29, -224
@@ -7218,7 +7219,7 @@ ebc_thread:
 	adrp	x1, .LANCHOR0
 	.loc 1 925 0
 	adrp	x0, __stack_chk_guard
-.LVL658:
+.LVL657:
 	add	x0, x0, :lo12:__stack_chk_guard
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -7230,30 +7231,30 @@ ebc_thread:
 	.cfi_offset 22, -184
 	adrp	x22, .LANCHOR1
 	stp	x23, x24, [sp, 48]
-.LBB1682:
-.LBB1683:
-.LBB1684:
+.LBB1686:
+.LBB1687:
+.LBB1688:
 	.loc 1 1231 0
 	add	x22, x22, :lo12:.LANCHOR1
-.LBE1684:
-.LBE1683:
-.LBE1682:
+.LBE1688:
+.LBE1687:
+.LBE1686:
 	.loc 1 926 0
 	ldr	x20, [x1, #:lo12:.LANCHOR0]
-.LVL659:
+.LVL658:
+.LBB1693:
+.LBB1691:
 .LBB1689:
-.LBB1687:
-.LBB1685:
 	.loc 1 1231 0
 	add	x19, x22, 304
-.LBE1685:
-.LBE1687:
 .LBE1689:
+.LBE1691:
+.LBE1693:
 	.loc 1 925 0
 	stp	x25, x26, [sp, 64]
 	.loc 1 930 0
 	mov	w21, 0
-.LVL660:
+.LVL659:
 	.loc 1 925 0
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 23, -176
@@ -7270,51 +7271,51 @@ ebc_thread:
 	ldr	x1, [x0]
 	str	x1, [x29, 216]
 	mov	x1,0
-.LVL661:
+.LVL660:
 	.p2align 2
-.L610:
+.L611:
 	.loc 1 936 0
 	ldr	w0, [x24, 600]
-.LVL662:
-	cbnz	w0, .L771
-.L611:
+.LVL661:
+	cbnz	w0, .L772
+.L612:
 	.loc 1 942 0
 	bl	ebc_dsp_buf_get
-.LVL663:
+.LVL662:
 	mov	x23, x0
 	.loc 1 944 0
-	cbz	x0, .L613
+	cbz	x0, .L614
 	.loc 1 944 0 is_stmt 0 discriminator 1
 	ldr	x1, [x0, 8]
-	cbz	x1, .L613
+	cbz	x1, .L614
 	.loc 1 945 0 is_stmt 1
 	ldr	w1, [x0, 40]
 	cmp	w1, 17
-	beq	.L772
+	beq	.L773
 	.loc 1 949 0
 	ldr	x2, [x24, 592]
-	cbz	x2, .L616
+	cbz	x2, .L617
 	.loc 1 950 0
 	cmp	w1, 16
-	beq	.L773
-.L764:
+	beq	.L774
+.L765:
 	.loc 1 1009 0
 	bl	ebc_remove_from_dsp_buf_list
-.LVL664:
+.LVL663:
 	.loc 1 1010 0
 	mov	x0, x23
 	bl	ebc_buf_release
-.LVL665:
+.LVL664:
 	.loc 1 936 0
 	ldr	w0, [x24, 600]
-	cbz	w0, .L611
+	cbz	w0, .L612
 	.p2align 2
-.L771:
+.L772:
 	.loc 1 937 0
 	ldr	w0, [x24, 184]
 	cmp	w0, 1
-	beq	.L774
-.L612:
+	beq	.L775
+.L613:
 	.loc 1 1237 0
 	adrp	x0, __stack_chk_guard
 	add	x1, x0, :lo12:__stack_chk_guard
@@ -7322,15 +7323,15 @@ ebc_thread:
 	ldr	x1, [x1]
 	eor	x1, x2, x1
 	mov	w0, 0
-	cbnz	x1, .L775
+	cbnz	x1, .L776
 	ldp	x19, x20, [sp, 16]
-.LVL666:
+.LVL665:
 	ldp	x21, x22, [sp, 32]
-.LVL667:
+.LVL666:
 	ldp	x23, x24, [sp, 48]
-.LVL668:
+.LVL667:
 	ldp	x25, x26, [sp, 64]
-.LVL669:
+.LVL668:
 	ldp	x27, x28, [sp, 80]
 	ldp	x29, x30, [sp], 224
 	.cfi_remember_state
@@ -7348,104 +7349,104 @@ ebc_thread:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL670:
+.LVL669:
 	.p2align 3
-.L613:
+.L614:
 	.cfi_restore_state
 	.loc 1 1218 0
 	ldr	w0, [x24, 28]
-.LVL671:
+.LVL670:
 	cmp	w0, 1
-	beq	.L776
+	beq	.L777
 	.loc 1 1227 0
 	ldr	w0, [x24, 184]
 	cmp	w0, 1
-	beq	.L777
-.LVL672:
-.L767:
+	beq	.L778
+.LVL671:
+.L768:
 	ldr	w0, [x24, 80]
-.LVL673:
+.LVL672:
 	.loc 1 1230 0
-	cbz	w0, .L778
-.L698:
-.LVL674:
-.L688:
+	cbz	w0, .L779
+.L699:
+.LVL673:
+.L689:
 	.loc 1 1232 0
 	str	wzr, [x24, 80]
-	b	.L610
-.LVL675:
+	b	.L611
+.LVL674:
 	.p2align 3
-.L778:
-.LBB1690:
-.LBB1688:
+.L779:
+.LBB1694:
+.LBB1692:
 	.loc 1 1231 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL676:
-	b	.L699
+.LVL675:
+	b	.L700
 	.p2align 3
-.L779:
-.LVL677:
-.LBB1686:
+.L780:
+.LVL676:
+.LBB1690:
 	.loc 1 1231 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L688
+	cbnz	x0, .L689
 	.loc 1 1231 0 discriminator 7
 	bl	schedule
-.LVL678:
-.L699:
+.LVL677:
+.L700:
 	.loc 1 1231 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL679:
+.LVL678:
 	ldr	w1, [x24, 80]
-	cbz	w1, .L779
-.LBE1686:
+	cbz	w1, .L780
+.LBE1690:
 	.loc 1 1231 0 discriminator 4
 	add	x1, x29, 112
 	mov	x0, x19
 	bl	finish_wait
-.LVL680:
-.LBE1688:
-.LBE1690:
+.LVL679:
+.LBE1692:
+.LBE1694:
 	.loc 1 1232 0 is_stmt 1 discriminator 4
 	str	wzr, [x24, 80]
-	b	.L610
-.LVL681:
+	b	.L611
+.LVL680:
 	.p2align 3
-.L616:
+.L617:
 	.loc 1 962 0
 	cmp	w1, 15
-	beq	.L780
+	beq	.L781
 	.loc 1 966 0
 	ldr	w2, [x24, 608]
 	sub	w0, w1, #18
-.LVL682:
+.LVL681:
 	cmp	w2, 0
 	ccmp	w1, 1, 4, ne
 	ccmp	w0, 1, 0, ne
-	bls	.L615
+	bls	.L616
 	.loc 1 967 0
 	add	x25, x22, 592
 	mov	x0, x25
 	bl	down_write
-.LVL683:
+.LVL682:
 	.loc 1 968 0
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x23, 16]
 	ldr	x0, [x24, 144]
 	bl	memcpy
-.LVL684:
+.LVL683:
 	.loc 1 969 0
 	mov	x0, x23
 	bl	ebc_remove_from_dsp_buf_list
-.LVL685:
+.LVL684:
 	.loc 1 970 0
 	mov	x0, x23
 	bl	ebc_buf_release
-.LVL686:
+.LVL685:
 	.loc 1 972 0
 	ldr	x1, [x24, 208]
 	mov	x4, x24
@@ -7454,55 +7455,54 @@ ebc_thread:
 	ldr	w5, [x1, 40]
 	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
-.LVL687:
+.LVL686:
 	.loc 1 975 0
 	mov	x0, x25
 	bl	up_write
-.LVL688:
+.LVL687:
 	.loc 1 976 0
 	ldr	w0, [x24, 28]
-	cbnz	w0, .L610
+	cbnz	w0, .L611
+	.loc 1 977 0
+	mov	w0, 1
+	str	w0, [x24, 28]
 	.loc 1 979 0
 	ldr	w0, [x24, 184]
-	.loc 1 977 0
-	mov	w1, 1
 	.loc 1 978 0
 	str	wzr, [x24, 76]
-	.loc 1 977 0
-	str	w1, [x24, 28]
 	.loc 1 979 0
-	cbz	w0, .L781
-.L620:
+	cbz	w0, .L782
+.L621:
 	.loc 1 981 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC77
 	ldrb	w2, [x24, 32]
 	add	x1, x1, :lo12:.LC77
 	bl	_dev_info
-.LVL689:
+.LVL688:
 	.loc 1 982 0
 	mov	x0, x20
 	bl	ebc_frame_start
+.LVL689:
+	b	.L611
 .LVL690:
-	b	.L610
-.LVL691:
 	.p2align 3
-.L773:
+.L774:
 	.loc 1 951 0
 	str	wzr, [x24, 592]
 	.loc 1 952 0
 	mov	x0, 3
-.LVL692:
+.LVL691:
 	bl	ebc_notify
-.LVL693:
+.LVL692:
 	.loc 1 953 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC76
 	add	x1, x1, :lo12:.LC76
 	bl	_dev_info
-.LVL694:
+.LVL693:
 	.p2align 2
-.L615:
+.L616:
 	.loc 1 987 0
 	adrp	x25, jiffies
 	mov	x1, 402653184
@@ -7510,44 +7510,44 @@ ebc_thread:
 	ldr	x2, [x25, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL695:
+.LVL694:
 	.loc 1 989 0
 	ldr	w0, [x24, 428]
-	cbz	w0, .L621
+	cbz	w0, .L622
 	ldr	x0, [x24, 200]
-.L622:
+.L623:
 	.loc 1 992 0
 	ldr	w2, [x0, 40]
 	ldr	w3, [x23, 40]
 	cmp	w3, w2
-	beq	.L623
+	beq	.L624
 	.loc 1 993 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC78
 	add	x1, x1, :lo12:.LC78
 	bl	_dev_info
-.LVL696:
+.LVL695:
 	.loc 1 994 0
 	ldr	w0, [x24, 28]
 	cmp	w0, 1
-	beq	.L782
-.L765:
+	beq	.L783
+.L766:
 	ldr	w2, [x23, 40]
-.L623:
+.L624:
 	.loc 1 1001 0
 	cmp	w2, 11
-	ble	.L783
-	cmp	w2, 17
 	ble	.L784
+	cmp	w2, 17
+	ble	.L785
 	cmp	w2, 18
-	beq	.L632
+	beq	.L633
 	cmp	w2, 19
-	bne	.L629
+	bne	.L630
 	.loc 1 1096 0
 	mov	w21, 1
 	.loc 1 1085 0
 	str	wzr, [x24, 608]
-.L633:
+.L634:
 	.loc 1 1104 0
 	ldr	x26, [x24, 200]
 	.loc 1 1105 0
@@ -7556,14 +7556,14 @@ ebc_thread:
 	cmp	w0, 1
 	.loc 1 1105 0
 	ccmp	w0, 18, 4, hi
-	bne	.L668
+	bne	.L669
 	.loc 1 1111 0
 	add	x0, x29, 152
 	str	x0, [x24, 200]
 	.loc 1 1112 0
 	ldr	x0, [x24, 136]
 	str	x0, [x29, 168]
-.L668:
+.L669:
 	.loc 1 1117 0
 	str	wzr, [x24, 76]
 	.loc 1 1118 0
@@ -7574,42 +7574,42 @@ ebc_thread:
 	sub	w0, w7, #7
 	.loc 1 1120 0
 	cmp	w0, 4
-	bls	.L785
-.LVL697:
-.L669:
+	bls	.L786
+.LVL696:
+.L670:
 	.loc 1 1135 0
-	cbnz	w21, .L708
+	cbnz	w21, .L709
 	.loc 1 1139 0
 	ldr	w1, [x24, 48]
 	mov	x0, x23
 	cmp	w1, 0
-	ble	.L676
+	ble	.L677
 	.loc 1 1140 0
 	ldr	w0, [x29, 108]
-.LVL698:
+.LVL697:
 	add	w0, w0, 1
 	str	w0, [x29, 108]
 	.loc 1 1141 0
 	cmp	w1, w0
 	mov	x0, x23
-.LVL699:
-	ble	.L786
-.L676:
+.LVL698:
+	ble	.L787
+.L677:
 	.loc 1 1148 0
 	cmp	w7, 12
-	beq	.L787
-.L677:
+	beq	.L788
+.L678:
 	.loc 1 1154 0
 	ldr	w0, [x24, 184]
-	cbz	w0, .L788
-.L678:
+	cbz	w0, .L789
+.L679:
 	.loc 1 1157 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL700:
+.LVL699:
 	mov	w21, w0
-	cbz	w0, .L679
-.L796:
+	cbz	w0, .L680
+.L797:
 	.loc 1 1158 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC83
@@ -7618,56 +7618,56 @@ ebc_thread:
 	.loc 1 1158 0
 	add	x1, x1, :lo12:.LC83
 	bl	_dev_err
-.LVL701:
+.LVL700:
 	.loc 1 1160 0
 	str	x26, [x24, 200]
-.LVL702:
-.L645:
+.LVL701:
+.L646:
 	.loc 1 1192 0
 	ldr	x0, [x24, 208]
 	ldr	w0, [x0, 40]
 	cmp	w0, 17
-	beq	.L789
-.L684:
-	.loc 1 1198 0
-	cmp	w0, 15
 	beq	.L790
 .L685:
+	.loc 1 1198 0
+	cmp	w0, 15
+	beq	.L791
+.L686:
 	.loc 1 1207 0
 	mov	x0, x23
 	bl	ebc_remove_from_dsp_buf_list
-.LVL703:
+.LVL702:
 	.loc 1 1209 0
 	ldr	w0, [x24, 428]
-	cbnz	w0, .L791
+	cbnz	w0, .L792
 	.loc 1 1212 0
 	mov	w0, 1
 	str	w0, [x24, 428]
-.L687:
+.L688:
 	.loc 1 1214 0
 	ldr	x0, [x24, 208]
 	str	x0, [x24, 200]
 	.loc 1 1215 0
-	b	.L610
+	b	.L611
 	.p2align 3
-.L621:
+.L622:
 	.loc 1 990 0
 	mov	x0, x23
 	str	x23, [x24, 200]
-	b	.L622
+	b	.L623
 	.p2align 3
-.L783:
+.L784:
 	.loc 1 1001 0
 	cmp	w2, 7
-	bge	.L633
+	bge	.L634
 	cmp	w2, 1
-	beq	.L632
-	bgt	.L703
-	cbnz	w2, .L629
+	beq	.L633
+	bgt	.L704
+	cbnz	w2, .L630
 	.loc 1 1048 0
 	add	x0, x22, 592
 	bl	down_write
-.LVL704:
+.LVL703:
 	.loc 1 1051 0
 	ldr	x0, [x24, 200]
 	.loc 1 1049 0
@@ -7675,8 +7675,8 @@ ebc_thread:
 	.loc 1 1051 0
 	ldr	w1, [x0, 40]
 	mov	x0, x23
-	cbnz	w1, .L792
-.L663:
+	cbnz	w1, .L793
+.L664:
 	.loc 1 1061 0
 	ldr	w5, [x0, 40]
 	mov	x4, x24
@@ -7684,15 +7684,15 @@ ebc_thread:
 	ldp	x2, x3, [x24, 144]
 	ldr	x0, [x24, 128]
 	bl	refresh_new_image2
-.LVL705:
-.L665:
+.LVL704:
+.L666:
 	.loc 1 1065 0
 	add	x0, x22, 592
 	bl	up_write
-.LVL706:
+.LVL705:
 	.loc 1 1067 0
 	ldr	w0, [x24, 28]
-	cbnz	w0, .L645
+	cbnz	w0, .L646
 	.loc 1 1070 0
 	ldr	w0, [x24, 184]
 	.loc 1 1068 0
@@ -7702,14 +7702,14 @@ ebc_thread:
 	.loc 1 1068 0
 	str	w1, [x24, 28]
 	.loc 1 1070 0
-	cbz	w0, .L793
-.L666:
+	cbz	w0, .L794
+.L667:
 	.loc 1 1072 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL707:
+.LVL706:
 	cmn	w0, #1
-	beq	.L794
+	beq	.L795
 	.loc 1 1077 0
 	ldr	w3, [x24, 96]
 	.loc 1 1080 0
@@ -7719,104 +7719,108 @@ ebc_thread:
 	.loc 1 1080 0
 	add	x1, x1, :lo12:.LC84
 	ldr	x0, [x24, 88]
-	b	.L766
-.LVL708:
+	b	.L767
+.LVL707:
 	.p2align 3
-.L772:
+.L773:
 	.loc 1 947 0
 	str	wzr, [x24, 604]
 	.loc 1 946 0
 	str	wzr, [x24, 608]
-	b	.L615
-.LVL709:
+	b	.L616
+.LVL708:
 	.p2align 3
-.L791:
+.L792:
 	.loc 1 1210 0
 	ldr	x0, [x24, 200]
 	bl	ebc_buf_release
-.LVL710:
-	b	.L687
+.LVL709:
+	b	.L688
 	.p2align 3
-.L776:
-.LBB1691:
+.L777:
+.LBB1695:
 	.loc 1 1219 0 discriminator 1
 	ldr	w0, [x24, 80]
-	cbnz	w0, .L688
-.LBB1692:
+	cbnz	w0, .L689
+.LBB1696:
 	.loc 1 1219 0 is_stmt 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL711:
-	b	.L692
+.LVL710:
+	b	.L693
 	.p2align 3
-.L795:
-.LBB1693:
+.L796:
+.LBB1697:
 	.loc 1 1219 0 discriminator 7
 	ldr	w1, [x24, 80]
-	cbnz	w1, .L689
-.LVL712:
+	cbnz	w1, .L690
+.LVL711:
 	.loc 1 1219 0 discriminator 9
-	cbnz	x0, .L767
+	cbnz	x0, .L768
 	.loc 1 1219 0 discriminator 11
 	bl	schedule
-.LVL713:
-.L692:
+.LVL712:
+.L693:
 	.loc 1 1219 0 discriminator 13
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL714:
+.LVL713:
 	ldr	w1, [x24, 28]
-	cbnz	w1, .L795
-.L689:
-.LBE1693:
+	cbnz	w1, .L796
+.L690:
+.LBE1697:
 	.loc 1 1219 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL715:
+.LVL714:
 	ldr	w0, [x24, 28]
-.LBE1692:
-.LBE1691:
+.LBE1696:
+.LBE1695:
 	.loc 1 1222 0 is_stmt 1 discriminator 8
-	cbnz	w0, .L767
+	cbnz	w0, .L768
 	.loc 1 1227 0
 	ldr	w0, [x24, 184]
 	cmp	w0, 1
-	bne	.L767
+	bne	.L768
 	.p2align 2
-.L777:
-	.loc 1 1228 0
+.L778:
+.LBB1698:
+.LBB1699:
+	mov	w1, 0
 	mov	x0, x20
-	bl	ebc_power_set.constprop.8
-.LVL716:
-	b	.L767
+	bl	ebc_power_set.part.4
+.LVL715:
+	b	.L768
 	.p2align 3
-.L784:
+.L785:
+.LBE1699:
+.LBE1698:
 	.loc 1 1001 0
 	cmp	w2, 14
-	bge	.L703
+	bge	.L704
 	cmp	w2, 12
-	beq	.L703
+	beq	.L704
 	cmp	w2, 13
-	beq	.L633
-.L629:
+	beq	.L634
+.L630:
 	.loc 1 1184 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC86
 	add	x1, x1, :lo12:.LC86
 	bl	_dev_err
-.LVL717:
+.LVL716:
 	.loc 1 1192 0
 	ldr	x0, [x24, 208]
 	ldr	w0, [x0, 40]
 	cmp	w0, 17
-	bne	.L684
-.LVL718:
+	bne	.L685
+.LVL717:
 	.p2align 2
-.L789:
+.L790:
 	.loc 1 1195 0
 	ldr	x0, [x24, 88]
 	.loc 1 1193 0
@@ -7830,57 +7834,53 @@ ebc_thread:
 	.loc 1 1195 0
 	add	x1, x1, :lo12:.LC87
 	bl	_dev_info
-.LVL719:
+.LVL718:
 	.loc 1 1196 0
 	mov	w2, w25
 	mov	w1, w25
 	add	x0, x22, 328
 	bl	__wake_up_sync
-.LVL720:
-	b	.L685
+.LVL719:
+	b	.L686
 	.p2align 3
-.L703:
+.L704:
 	.loc 1 1096 0
 	mov	w21, 1
-	b	.L633
-.LVL721:
+	b	.L634
+.LVL720:
 	.p2align 3
-.L708:
+.L709:
 	.loc 1 1136 0
 	str	wzr, [x29, 108]
 	mov	x0, x23
 	.loc 1 1148 0
 	cmp	w7, 12
-	bne	.L677
-.L787:
+	bne	.L678
+.L788:
 	.loc 1 1150 0
 	ldr	w1, [x26, 40]
 	sub	w1, w1, #12
 	cmp	w1, 1
-	bls	.L677
+	bls	.L678
 	.loc 1 1151 0
 	mov	w1, 13
 	str	w1, [x0, 40]
 	.loc 1 1154 0
 	ldr	w0, [x24, 184]
-	cbnz	w0, .L678
+	cbnz	w0, .L679
 	.p2align 2
-.L788:
-.LBB1694:
-.LBB1695:
-	mov	w1, 1
+.L789:
+	.loc 1 1155 0
 	mov	x0, x20
-	bl	ebc_power_set.part.4
-.LVL722:
-.LBE1695:
-.LBE1694:
+	bl	ebc_power_set.constprop.8
+.LVL721:
 	.loc 1 1157 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL723:
+.LVL722:
 	mov	w21, w0
-	cbnz	w0, .L796
-.L679:
+	cbnz	w0, .L797
+.L680:
 	.loc 1 1169 0
 	ldr	x0, [x24, 208]
 	adrp	x1, .LC85
@@ -7897,47 +7897,47 @@ ebc_thread:
 	ldr	w2, [x0, 40]
 	ldr	x0, [x24, 88]
 	bl	_dev_info
-.LVL724:
+.LVL723:
 	.loc 1 1170 0
 	mov	w0, 1
 	str	w0, [x24, 28]
 	.loc 1 1171 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL725:
+.LVL724:
 	.loc 1 1173 0
 	ldr	x1, [x25, #:lo12:jiffies]
 	mov	x0, x28
 	add	x1, x1, 900
 	bl	mod_timer
-.LVL726:
-.LBB1696:
+.LVL725:
+.LBB1700:
 	.loc 1 1174 0
 	ldr	w0, [x24, 76]
-	cbz	w0, .L797
-.L682:
-.LVL727:
-.L680:
-.LBE1696:
+	cbz	w0, .L798
+.L683:
+.LVL726:
+.L681:
+.LBE1700:
 	.loc 1 1176 0 discriminator 11
 	ldr	x2, [x25, #:lo12:jiffies]
 	mov	x0, x28
-.LVL728:
+.LVL727:
 	mov	x1, 402653184
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL729:
+.LVL728:
 	.loc 1 1177 0 discriminator 11
 	str	wzr, [x24, 76]
 	.loc 1 1179 0 discriminator 11
 	str	x26, [x24, 200]
 	.loc 1 1181 0 discriminator 11
-	b	.L645
+	b	.L646
 	.p2align 3
-.L632:
+.L633:
 	.loc 1 1004 0
 	ldr	w0, [x24, 604]
-	cbz	w0, .L637
+	cbz	w0, .L638
 	.loc 1 1017 0
 	ldr	x0, [x24, 200]
 	.loc 1 1005 0
@@ -7952,13 +7952,13 @@ ebc_thread:
 	cmp	w1, 1
 	.loc 1 1017 0
 	ccmp	w1, 18, 4, hi
-	bne	.L798
+	bne	.L799
 	mov	x0, x23
 	.loc 1 1023 0
-	cbz	w1, .L799
-.L640:
-.LBB1700:
-.LBB1701:
+	cbz	w1, .L800
+.L641:
+.LBB1704:
+.LBB1705:
 	.loc 1 297 0
 	ldp	w3, w15, [x0, 48]
 	.loc 1 298 0
@@ -7983,110 +7983,110 @@ ebc_thread:
 	.loc 1 296 0
 	asr	w10, w10, 3
 	add	w10, w10, 1
-.LVL730:
+.LVL729:
 	.loc 1 300 0
 	asr	w17, w17, 3
-.LVL731:
+.LVL730:
 	ldr	w1, [x20, 236]
 	.loc 1 303 0
 	cmp	w10, w17
 	sub	w2, w17, #1
-.LBE1701:
-.LBE1700:
+.LBE1705:
+.LBE1704:
 	.loc 1 1027 0
 	ldr	w13, [x0, 40]
+.LBB1710:
 .LBB1706:
-.LBB1702:
 	.loc 1 303 0
 	csel	w10, w2, w10, ge
-.LVL732:
+.LVL731:
 	.loc 1 305 0
 	cmp	w1, w18
 	sub	w1, w1, #1
 	.loc 1 295 0
 	asr	w16, w16, 3
-.LVL733:
+.LVL732:
 	.loc 1 305 0
 	csel	w18, w1, w18, le
-.LBE1702:
 .LBE1706:
+.LBE1710:
 	.loc 1 1027 0
 	ldr	x11, [x0, 16]
-.LVL734:
+.LVL733:
+.LBB1711:
 .LBB1707:
-.LBB1703:
 	.loc 1 307 0
 	cmp	w15, w18
-.LBE1703:
 .LBE1707:
+.LBE1711:
 	.loc 1 1027 0
 	ldr	x8, [x24, 128]
 	.loc 1 1028 0
 	ldp	x12, x26, [x24, 144]
-.LVL735:
+.LVL734:
+.LBB1712:
 .LBB1708:
-.LBB1704:
 	.loc 1 307 0
-	bgt	.L648
+	bgt	.L649
 	mul	w9, w15, w17
 	sbfiz	x25, x17, 3, 32
 	.loc 1 316 0
 	mov	w14, 15
-.LVL736:
+.LVL735:
 	.p2align 2
-.L647:
+.L648:
 	.loc 1 311 0
 	sxtw	x7, w15
-.LVL737:
+.LVL736:
 	.loc 1 312 0
 	mov	w6, w16
 	cmp	w16, w10
 	.loc 1 311 0
 	madd	x7, x7, x25, x26
-.LVL738:
+.LVL737:
 	.loc 1 312 0
-	ble	.L735
-	b	.L661
-.LVL739:
+	ble	.L736
+	b	.L662
+.LVL738:
 	.p2align 3
-.L800:
+.L801:
 	.loc 1 333 0
 	orr	w0, w0, -65536
-.L654:
-.LVL740:
+.L655:
+.LVL739:
 	.loc 1 346 0
 	orn	w2, w5, w1
 	and	w1, w1, w5
-.LVL741:
+.LVL740:
 	.loc 1 344 0
 	bic	w4, w27, w0
 	.loc 1 346 0
 	and	w2, w2, w0
 	and	w0, w1, w0
-.LVL742:
+.LVL741:
 	cmp	w13, 18
 	orr	w1, w2, w4
 	orr	w0, w0, w4
 	csel	w0, w0, w1, ne
 	.loc 1 349 0
 	str	w0, [x8, x3]
-.LVL743:
+.LVL742:
 	.loc 1 312 0
 	add	w6, w6, 1
 	cmp	w6, w10
-	bgt	.L661
-.L735:
+	bgt	.L662
+.L736:
 	.loc 1 313 0
 	sxtw	x2, w6
-.LVL744:
+.LVL743:
 	.loc 1 320 0
 	mov	w0, 65535
-.LVL745:
+.LVL744:
 	.loc 1 313 0
 	lsl	x3, x2, 2
 	.loc 1 318 0
 	lsl	x2, x2, 3
-.LVL746:
+.LVL745:
 	add	x3, x3, x9, sxtw 2
 	ldr	w4, [x7, x2]
 	.loc 1 313 0
@@ -8095,16 +8095,16 @@ ebc_thread:
 	ldr	w1, [x11, x3]
 	.loc 1 315 0
 	ldr	w5, [x12, x3]
-.LVL747:
+.LVL746:
 	.loc 1 319 0
-	cbz	w4, .L649
+	cbz	w4, .L650
 	.loc 1 322 0
 	and	w0, w4, 255
-.LVL748:
+.LVL747:
 	.loc 1 316 0
 	cmp	w0, 0
 	csel	w0, w14, wzr, eq
-.LVL749:
+.LVL748:
 	.loc 1 325 0
 	tst	w4, 65280
 	orr	w28, w0, 240
@@ -8117,12 +8117,12 @@ ebc_thread:
 	tst	w4, -16777216
 	orr	w4, w0, 61440
 	csel	w0, w4, w0, eq
-.L649:
+.L650:
 	.loc 1 331 0
 	add	x2, x7, x2
 	ldr	w2, [x2, 4]
 	.loc 1 332 0
-	cbz	w2, .L800
+	cbz	w2, .L801
 	.loc 1 335 0
 	and	w4, w2, 255
 	.loc 1 336 0
@@ -8141,12 +8141,12 @@ ebc_thread:
 	tst	w2, -16777216
 	orr	w2, w0, -268435456
 	csel	w0, w2, w0, eq
-	b	.L654
-.LVL750:
+	b	.L655
+.LVL749:
 	.p2align 3
-.L785:
-.LBE1704:
+.L786:
 .LBE1708:
+.LBE1712:
 	.loc 1 1127 0
 	ldp	w6, w0, [x20, 108]
 	.loc 1 1125 0
@@ -8159,23 +8159,23 @@ ebc_thread:
 	lsr	w6, w6, 1
 	.loc 1 1126 0
 	ldr	x5, [x0, 16]
-.LBB1709:
-.LBB1710:
+.LBB1713:
+.LBB1714:
 	.loc 1 900 0
 	asr	w0, w6, 3
-	cbz	w0, .L670
+	cbz	w0, .L671
 	.loc 1 904 0
 	ldr	x2, [x4]
 	ldr	x1, [x5]
 	cmp	x2, x1
-	bne	.L669
+	bne	.L670
 	sub	w3, w0, #1
 	mov	x0, 8
 	add	x3, x3, 1
 	lsl	x3, x3, 3
-	b	.L672
+	b	.L673
 	.p2align 3
-.L673:
+.L674:
 	.loc 1 901 0
 	ldr	x2, [x4, x0]
 	add	x0, x0, 8
@@ -8184,39 +8184,39 @@ ebc_thread:
 	.loc 1 904 0
 	ldr	x1, [x1, -8]
 	cmp	x2, x1
-	bne	.L669
-.L672:
+	bne	.L670
+.L673:
 	.loc 1 900 0
 	cmp	x3, x0
-	bne	.L673
-.L670:
+	bne	.L674
+.L671:
 	.loc 1 910 0
 	ands	w6, w6, 7
-.LVL751:
-	beq	.L674
+.LVL750:
+	beq	.L675
 	sub	w1, w6, #1
 	mov	x0, 0
 	add	x1, x1, 1
 	lsl	x1, x1, 2
-	b	.L675
+	b	.L676
 	.p2align 3
-.L801:
+.L802:
 	add	x0, x0, 4
 	.loc 1 911 0
 	cmp	x1, x0
-	beq	.L674
-.L675:
-.LBB1711:
+	beq	.L675
+.L676:
+.LBB1715:
 	.loc 1 915 0
 	ldrb	w3, [x4, x0]
 	ldrb	w2, [x5, x0]
 	cmp	w3, w2
-	beq	.L801
-	b	.L669
-.L786:
-.LBE1711:
-.LBE1710:
-.LBE1709:
+	beq	.L802
+	b	.L670
+.L787:
+.LBE1715:
+.LBE1714:
+.LBE1713:
 	.loc 1 1142 0
 	mov	w0, 2
 	str	w0, [x23, 40]
@@ -8224,97 +8224,97 @@ ebc_thread:
 	str	wzr, [x29, 108]
 	ldr	x0, [x24, 208]
 	ldr	w7, [x0, 40]
-	b	.L676
-.LVL752:
-.L782:
+	b	.L677
+.LVL751:
+.L783:
 	.loc 1 995 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC79
 	add	x1, x1, :lo12:.LC79
 	bl	_dev_info
-.LVL753:
-.LBB1712:
+.LVL752:
+.LBB1716:
 	.loc 1 996 0
 	ldr	w0, [x24, 76]
-	cbz	w0, .L802
-.L627:
-.LVL754:
-.L625:
-.LBE1712:
+	cbz	w0, .L803
+.L628:
+.LVL753:
+.L626:
+.LBE1716:
 	.loc 1 997 0 discriminator 11
 	ldr	x0, [x24, 88]
-.LVL755:
+.LVL754:
 	adrp	x1, .LC80
 	add	x1, x1, :lo12:.LC80
 	bl	_dev_info
-.LVL756:
-	b	.L765
-.L797:
-.LBB1716:
-.LBB1697:
-.LBB1698:
+.LVL755:
+	b	.L766
+.L798:
+.LBB1720:
+.LBB1701:
+.LBB1702:
 	.loc 1 1174 0 discriminator 1
 	add	x27, x22, 352
-.LBE1698:
+.LBE1702:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL757:
-	b	.L683
+.LVL756:
+	b	.L684
 	.p2align 3
-.L803:
-.LVL758:
-.LBB1699:
+.L804:
+.LVL757:
+.LBB1703:
 	.loc 1 1174 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L680
+	cbnz	x0, .L681
 	.loc 1 1174 0 discriminator 7
 	bl	schedule
-.LVL759:
-.L683:
+.LVL758:
+.L684:
 	.loc 1 1174 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x27
 	bl	prepare_to_wait_event
-.LVL760:
+.LVL759:
 	ldr	w1, [x24, 76]
-	cbz	w1, .L803
-.LBE1699:
+	cbz	w1, .L804
+.LBE1703:
 	.loc 1 1174 0 discriminator 4
 	mov	x0, x27
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL761:
-.LBE1697:
-.LBE1716:
+.LVL760:
+.LBE1701:
+.LBE1720:
 	.loc 1 1176 0 is_stmt 1 discriminator 4
 	ldr	x2, [x25, #:lo12:jiffies]
 	mov	x0, x28
 	mov	x1, 402653184
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL762:
+.LVL761:
 	.loc 1 1177 0 discriminator 4
 	str	wzr, [x24, 76]
 	.loc 1 1179 0 discriminator 4
 	str	x26, [x24, 200]
-	b	.L645
-.LVL763:
+	b	.L646
+.LVL762:
 	.p2align 3
-.L661:
-.LBB1717:
-.LBB1705:
+.L662:
+.LBB1721:
+.LBB1709:
 	.loc 1 307 0
 	add	w15, w15, 1
 	add	w9, w9, w17
 	cmp	w15, w18
-	ble	.L647
-.L648:
-.LBE1705:
-.LBE1717:
+	ble	.L648
+.L649:
+.LBE1709:
+.LBE1721:
 	.loc 1 1031 0
 	ldr	w0, [x24, 28]
-	cbnz	w0, .L645
+	cbnz	w0, .L646
 	.loc 1 1034 0
 	ldr	w0, [x24, 184]
 	.loc 1 1032 0
@@ -8324,14 +8324,14 @@ ebc_thread:
 	.loc 1 1032 0
 	str	w1, [x24, 28]
 	.loc 1 1034 0
-	cbz	w0, .L804
-.L662:
+	cbz	w0, .L805
+.L663:
 	.loc 1 1036 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL764:
+.LVL763:
 	cmn	w0, #1
-	beq	.L645
+	beq	.L646
 	.loc 1 1043 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC82
@@ -8341,8 +8341,8 @@ ebc_thread:
 	add	x1, x1, :lo12:.LC82
 	.loc 1 1040 0
 	strb	w3, [x24, 32]
-.LVL765:
-.L766:
+.LVL764:
+.L767:
 	.loc 1 1080 0
 	and	w2, w3, 255
 	.loc 1 1078 0
@@ -8350,20 +8350,20 @@ ebc_thread:
 	strb	w3, [x24, 33]
 	.loc 1 1080 0
 	bl	_dev_info
-.LVL766:
+.LVL765:
 	.loc 1 1081 0
 	mov	x0, x20
 	bl	ebc_frame_start
+.LVL766:
+	b	.L646
 .LVL767:
-	b	.L645
-.LVL768:
 	.p2align 3
-.L780:
+.L781:
 	.loc 1 963 0
 	str	wzr, [x24, 608]
-	b	.L615
-.LVL769:
-.L790:
+	b	.L616
+.LVL768:
+.L791:
 	.loc 1 1202 0
 	ldr	x0, [x24, 88]
 	.loc 1 1200 0
@@ -8380,35 +8380,35 @@ ebc_thread:
 	str	wzr, [x24, 608]
 	.loc 1 1202 0
 	bl	_dev_info
-.LVL770:
+.LVL769:
 	.loc 1 1203 0
 	mov	x0, 2
 	bl	ebc_notify
-.LVL771:
+.LVL770:
 	.loc 1 1204 0
 	mov	w2, w25
 	mov	w1, w25
 	add	x0, x22, 328
 	bl	__wake_up_sync
-.LVL772:
-	b	.L685
-.L637:
+.LVL771:
+	b	.L686
+.L638:
 	.loc 1 1008 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC81
 	add	x1, x1, :lo12:.LC81
 	bl	_dev_info
-.LVL773:
+.LVL772:
 	.loc 1 1009 0
 	mov	x0, x23
-	b	.L764
-.L792:
+	b	.L765
+.L793:
 	.loc 1 1052 0
 	ldrsw	x2, [x24, 20]
 	mov	w1, 255
 	ldr	x0, [x24, 144]
 	bl	memset
-.LVL774:
+.LVL773:
 	.loc 1 1054 0
 	ldr	x0, [x24, 200]
 	ldr	w0, [x0, 40]
@@ -8419,153 +8419,148 @@ ebc_thread:
 	.loc 1 1057 0
 	ldr	x0, [x24, 208]
 	.loc 1 1054 0
-	beq	.L663
+	beq	.L664
 	.loc 1 1057 0
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x24, 128]
 	bl	memcpy
-.LVL775:
+.LVL774:
 	.loc 1 1058 0
 	ldr	x0, [x24, 200]
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x24, 136]
 	bl	memcpy
+.LVL775:
+	b	.L666
 .LVL776:
-	b	.L665
-.LVL777:
-.L674:
+.L675:
 	.loc 1 1128 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC89
 	add	x1, x1, :lo12:.LC89
 	bl	_dev_info
-.LVL778:
+.LVL777:
 	.loc 1 1130 0
 	str	x26, [x24, 200]
 	.loc 1 1131 0
-	b	.L645
-.L794:
+	b	.L646
+.L795:
 	.loc 1 1073 0
 	ldr	x0, [x24, 88]
 	adrp	x1, .LC83
 	add	x1, x1, :lo12:.LC83
 	bl	_dev_err
-.LVL779:
+.LVL778:
 	.loc 1 1074 0
-	b	.L645
-.L793:
-.LBB1718:
-.LBB1719:
+	b	.L646
+.L794:
+	.loc 1 1071 0
 	mov	x0, x20
-	bl	ebc_power_set.part.4
-.LVL780:
-	b	.L666
-.L799:
-.LBE1719:
-.LBE1718:
+	bl	ebc_power_set.constprop.8
+.LVL779:
+	b	.L667
+.L800:
 	.loc 1 1024 0
 	ldrsw	x2, [x24, 20]
 	ldp	x1, x0, [x24, 136]
 	bl	memcpy
-.LVL781:
+.LVL780:
 	ldr	x0, [x24, 208]
-	b	.L640
-.L802:
-.LBB1720:
-.LBB1713:
-.LBB1714:
+	b	.L641
+.L803:
+.LBB1722:
+.LBB1717:
+.LBB1718:
 	.loc 1 996 0 discriminator 1
 	add	x26, x22, 352
-.LVL782:
-.LBE1714:
+.LVL781:
+.LBE1718:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL783:
-	b	.L628
+.LVL782:
+	b	.L629
 	.p2align 3
-.L805:
-.LVL784:
-.LBB1715:
+.L806:
+.LVL783:
+.LBB1719:
 	.loc 1 996 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L625
+	cbnz	x0, .L626
 	.loc 1 996 0 discriminator 7
 	bl	schedule
-.LVL785:
-.L628:
+.LVL784:
+.L629:
 	.loc 1 996 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x26
 	bl	prepare_to_wait_event
-.LVL786:
+.LVL785:
 	ldr	w1, [x24, 76]
-	cbz	w1, .L805
-.LBE1715:
+	cbz	w1, .L806
+.LBE1719:
 	.loc 1 996 0 discriminator 4
 	mov	x0, x26
 	add	x1, x29, 112
 	bl	finish_wait
+.LVL786:
+	b	.L626
 .LVL787:
-	b	.L625
-.LVL788:
-.L774:
-.LBE1713:
-.LBE1720:
-	.loc 1 938 0 is_stmt 1
+.L775:
+.LBE1717:
+.LBE1722:
+.LBB1723:
+.LBB1724:
+	mov	w1, 0
 	mov	x0, x20
-	bl	ebc_power_set.constprop.8
-.LVL789:
-	b	.L612
-.L798:
-	.loc 1 1020 0
+	bl	ebc_power_set.part.4
+.LVL788:
+	b	.L613
+.L799:
+.LBE1724:
+.LBE1723:
+	.loc 1 1020 0 is_stmt 1
 	ldr	x1, [x0, 16]
 	ldrsw	x2, [x24, 20]
 	ldr	x0, [x24, 128]
 	bl	memcpy
-.LVL790:
+.LVL789:
 	.loc 1 1021 0
 	ldr	x0, [x24, 200]
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x24, 136]
 	bl	memcpy
-.LVL791:
+.LVL790:
 	.loc 1 1022 0
 	ldr	x0, [x24, 200]
 	ldrsw	x2, [x24, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x24, 144]
 	bl	memcpy
-.LVL792:
+.LVL791:
 	ldr	x0, [x24, 208]
-	b	.L640
-.LVL793:
-.L804:
-.LBB1721:
-.LBB1722:
+	b	.L641
+.LVL792:
+.L805:
+	.loc 1 1035 0
 	mov	x0, x20
-	bl	ebc_power_set.part.4
+	bl	ebc_power_set.constprop.8
+.LVL793:
+	b	.L663
 .LVL794:
-	b	.L662
-.LVL795:
-.L781:
-.LBE1722:
-.LBE1721:
-.LBB1723:
-.LBB1724:
+.L782:
+	.loc 1 980 0
 	mov	x0, x20
-	bl	ebc_power_set.part.4
-.LVL796:
-	b	.L620
-.L775:
-.LBE1724:
-.LBE1723:
+	bl	ebc_power_set.constprop.8
+.LVL795:
+	b	.L621
+.L776:
 	.loc 1 1237 0
 	bl	__stack_chk_fail
-.LVL797:
+.LVL796:
 	.cfi_endproc
 .LFE2819:
 	.size	ebc_thread, .-ebc_thread
@@ -8590,7 +8585,7 @@ ebc_driver:
 ebc_misc:
 	.word	243
 	.zero	4
-	.xword	.LC41
+	.xword	.LC43
 	.xword	ebc_ops
 	.zero	56
 	.type	ebc_thread_wq, %object
@@ -8703,16 +8698,16 @@ __func__.34848:
 	.size	__func__.34649, 16
 __func__.34649:
 	.string	"ebc_frame_start"
-	.type	__func__.35056, %object
-	.size	__func__.35056, 19
-__func__.35056:
-	.string	"ebc_lut_table_init"
-	.zero	5
 	.type	__func__.35115, %object
 	.size	__func__.35115, 12
 __func__.35115:
 	.string	"ebc_suspend"
 	.zero	4
+	.type	__func__.35056, %object
+	.size	__func__.35056, 19
+__func__.35056:
+	.string	"ebc_lut_table_init"
+	.zero	5
 	.type	ebc_match, %object
 	.size	ebc_match, 400
 ebc_match:
@@ -8798,7 +8793,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC15:
-	.string	"2.00"
+	.string	"2.01"
 	.zero	3
 .LC16:
 	.string	"%s\n"
@@ -8816,163 +8811,163 @@ __exitcall_ebc_exit:
 	.string	"%s: auto mode no need to update\n"
 	.zero	7
 .LC21:
-	.string	"ebc hw power on\n"
-	.zero	7
+	.string	"ebc hw power off\n"
+	.zero	6
 .LC22:
+	.string	"%s: device is busy now...\n"
+	.zero	5
+.LC23:
+	.string	"device suspend\n"
+.LC24:
 	.string	"ebc_tcon"
 	.zero	7
-.LC23:
+.LC25:
 	.string	"not find ebc tcon\n"
 	.zero	5
-.LC24:
+.LC26:
 	.string	"pmic"
 	.zero	3
-.LC25:
+.LC27:
 	.string	"not find pmic node\n"
 	.zero	4
-.LC26:
+.LC28:
 	.string	"not find pmic i2c client\n"
 	.zero	6
-.LC27:
+.LC29:
 	.string	"get drvdata from pmic client failed\n"
 	.zero	3
-.LC28:
+.LC30:
 	.string	"panel,width"
 	.zero	4
-.LC29:
+.LC31:
 	.string	"panel,panel_color"
 	.zero	6
-.LC30:
+.LC32:
 	.string	"panel,mirror"
 	.zero	3
-.LC31:
+.LC33:
 	.string	"panel,width-mm"
 	.zero	1
-.LC32:
+.LC34:
 	.string	"panel,height-mm"
-.LC33:
+.LC35:
 	.string	"memory-region"
 	.zero	2
-.LC34:
+.LC36:
 	.string	"Couldn't address to resource for reserved memory\n"
 	.zero	6
-.LC35:
+.LC37:
 	.string	"waveform-region"
-.LC36:
+.LC38:
 	.string	"%s:%d: failed to get mem from reserved\n"
-.LC37:
+.LC39:
 	.string	"Failed to read waveform from mem, we use waveform file from kernel file instead\n"
 	.zero	7
-.LC38:
+.LC40:
 	.string	"Failed to read waveform file from kernel, no waveform!!!\n"
 	.zero	6
-.LC39:
+.LC41:
 	.string	"failed to create ebc_task thread\n"
 	.zero	6
-.LC40:
+.LC42:
 	.string	"ebc_thread"
 	.zero	5
-.LC41:
+.LC43:
 	.string	"ebc"
 	.zero	4
-.LC42:
+.LC44:
 	.string	"ulogo_addr="
 	.zero	4
-.LC43:
+.LC45:
 	.string	"klogo_addr="
 	.zero	4
-.LC44:
+.LC46:
 	.string	"ulogo_addr=0x%x"
-.LC45:
+.LC47:
 	.string	"have ulogo display, ulogo addr = 0x%x\n"
 	.zero	1
-.LC46:
+.LC48:
 	.string	"malloc ulogo buffer failed\n"
 	.zero	4
-.LC47:
+.LC49:
 	.string	"klogo_addr=0x%x"
-.LC48:
+.LC50:
 	.string	"need show klogo, klogo addr = 0x%x\n"
 	.zero	4
-.LC49:
+.LC51:
 	.string	"malloc klogo buffer failed\n"
 	.zero	4
-.LC50:
+.LC52:
 	.string	"no uboot logo, panel init\n"
 	.zero	5
-.LC51:
+.LC53:
 	.string	"rockchip ebc driver %s probe success\n"
 	.zero	2
-.LC52:
+.LC54:
 	.string	"panel,height"
 	.zero	3
-.LC53:
+.LC55:
 	.string	"panel,vir_width"
-.LC54:
+.LC56:
 	.string	"panel,vir_height"
 	.zero	7
-.LC55:
+.LC57:
 	.string	"panel,sdck"
 	.zero	5
-.LC56:
+.LC58:
 	.string	"panel,lsl"
 	.zero	6
-.LC57:
+.LC59:
 	.string	"panel,lbl"
 	.zero	6
-.LC58:
+.LC60:
 	.string	"panel,ldl"
 	.zero	6
-.LC59:
+.LC61:
 	.string	"panel,lel"
 	.zero	6
-.LC60:
+.LC62:
 	.string	"panel,gdck-sta"
 	.zero	1
-.LC61:
+.LC63:
 	.string	"panel,lgonl"
 	.zero	4
-.LC62:
+.LC64:
 	.string	"panel,fsl"
 	.zero	6
-.LC63:
+.LC65:
 	.string	"panel,fbl"
 	.zero	6
-.LC64:
+.LC66:
 	.string	"panel,fdl"
 	.zero	6
-.LC65:
+.LC67:
 	.string	"panel,fel"
 	.zero	6
-.LC66:
+.LC68:
 	.string	"panel,panel_16bit"
 	.zero	6
-.LC67:
+.LC69:
 	.string	"buffer manage init failed\n"
 	.zero	5
-.LC68:
+.LC70:
 	.string	"lut table init failed\n"
 	.zero	1
-.LC69:
+.LC71:
 	.string	"ebc_task"
 	.zero	7
-.LC70:
+.LC72:
 	.string	"failed to run ebc thread\n"
 	.zero	6
-.LC71:
-	.string	"task init failed\n"
-	.zero	6
-.LC72:
-	.string	"failed to probe panel: %d\n"
-	.zero	5
 .LC73:
-	.string	"ebc hw power off\n"
+	.string	"task init failed\n"
 	.zero	6
 .LC74:
-	.string	"%s: device is busy now...\n"
+	.string	"failed to probe panel: %d\n"
 	.zero	5
 .LC75:
-	.string	"device suspend\n"
+	.string	"ebc hw power on\n"
+	.zero	7
 .LC76:
 	.string	"early resume\n"
 	.zero	2
@@ -9231,7 +9226,7 @@ __exitcall_ebc_exit:
 	.file 212 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x13db5
+	.4byte	0x13d5d
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
@@ -36958,7 +36953,7 @@ __exitcall_ebc_exit:
 	.4byte	0xe644
 	.uleb128 0x4e
 	.8byte	.LVL34
-	.4byte	0x13ab9
+	.4byte	0x13a61
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3016
@@ -36972,7 +36967,7 @@ __exitcall_ebc_exit:
 	.4byte	0xe674
 	.uleb128 0x4e
 	.8byte	.LVL318
-	.4byte	0x13ac5
+	.4byte	0x13a6d
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3017
@@ -37001,28 +36996,28 @@ __exitcall_ebc_exit:
 	.2byte	0x813
 	.4byte	0xe710
 	.uleb128 0x53
-	.4byte	0x13156
-	.8byte	.LBB906
-	.8byte	.LBE906-.LBB906
+	.4byte	0x13118
+	.8byte	.LBB910
+	.8byte	.LBE910-.LBB910
 	.byte	0x1
 	.2byte	0x812
 	.4byte	0xe6e0
 	.uleb128 0x54
-	.4byte	0x13167
+	.4byte	0x13129
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12d47
-	.8byte	.LBB908
-	.8byte	.LBE908-.LBB908
+	.4byte	0x12d09
+	.8byte	.LBB912
+	.8byte	.LBE912-.LBB912
 	.byte	0x1
 	.2byte	0x815
 	.4byte	0xe702
 	.uleb128 0x54
-	.4byte	0x12d53
+	.4byte	0x12d15
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL38
-	.4byte	0x13ad1
+	.4byte	0x13a79
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -37036,13 +37031,13 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2842-.LFB2842
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe7df
+	.4byte	0xe81d
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
 	.2byte	0x7ff
 	.4byte	0xa545
-	.4byte	.LLST141
+	.4byte	.LLST118
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
@@ -37055,49 +37050,67 @@ __exitcall_ebc_exit:
 	.4byte	0xe710
 	.uleb128 0x55
 	.4byte	.LASF3020
-	.4byte	0xe7ef
+	.4byte	0xe82d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	__func__.35115
 	.uleb128 0x53
-	.4byte	0x13156
-	.8byte	.LBB1653
-	.8byte	.LBE1653-.LBB1653
+	.4byte	0x13118
+	.8byte	.LBB1297
+	.8byte	.LBE1297-.LBB1297
 	.byte	0x1
 	.2byte	0x801
 	.4byte	0xe795
 	.uleb128 0x54
-	.4byte	0x13167
+	.4byte	0x13129
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12d5f
-	.8byte	.LBB1655
-	.8byte	.LBE1655-.LBB1655
+	.4byte	0x12d21
+	.8byte	.LBB1299
+	.8byte	.LBE1299-.LBB1299
 	.byte	0x1
 	.2byte	0x80a
 	.4byte	0xe7b7
 	.uleb128 0x54
-	.4byte	0x12d6b
+	.4byte	0x12d2d
 	.byte	0
+	.uleb128 0x53
+	.4byte	0x12a6f
+	.8byte	.LBB1301
+	.8byte	.LBE1301-.LBB1301
+	.byte	0x1
+	.2byte	0x806
+	.4byte	0xe802
+	.uleb128 0x54
+	.4byte	0x12a8a
+	.uleb128 0x54
+	.4byte	0x12a7f
+	.uleb128 0x56
+	.8byte	.LBB1302
+	.8byte	.LBE1302-.LBB1302
+	.uleb128 0x57
+	.4byte	0x12a95
 	.uleb128 0x4e
-	.8byte	.LVL630
-	.4byte	0x13ad1
+	.8byte	.LVL450
+	.4byte	0x138f9
+	.byte	0
+	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL631
-	.4byte	0x13ad1
+	.8byte	.LVL448
+	.4byte	0x13a79
 	.uleb128 0x4e
-	.8byte	.LVL632
-	.4byte	0x139f6
+	.8byte	.LVL449
+	.4byte	0x13a79
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xe7ef
+	.4byte	0xe82d
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xb
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe7df
+	.4byte	0xe81d
 	.uleb128 0x4f
 	.4byte	.LASF3021
 	.byte	0x1
@@ -37107,8 +37120,8 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2841-.LFB2841
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe834
-	.uleb128 0x56
+	.4byte	0xe872
+	.uleb128 0x58
 	.4byte	.LASF3022
 	.byte	0x1
 	.2byte	0x7f8
@@ -37116,7 +37129,7 @@ __exitcall_ebc_exit:
 	.4byte	.LLST9
 	.uleb128 0x4e
 	.8byte	.LVL44
-	.4byte	0x13ade
+	.4byte	0x13a86
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3023
@@ -37127,13 +37140,13 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2840-.LFB2840
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfc21
-	.uleb128 0x56
+	.4byte	0xfc5f
+	.uleb128 0x58
 	.4byte	.LASF3022
 	.byte	0x1
 	.2byte	0x78c
 	.4byte	0xd6e9
-	.4byte	.LLST118
+	.4byte	.LLST119
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
@@ -37144,34 +37157,34 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x78f
 	.4byte	0xb869
-	.uleb128 0x57
+	.uleb128 0x59
 	.4byte	.LASF3025
 	.byte	0x1
 	.2byte	0x790
 	.4byte	0xd6e9
-	.4byte	.LLST119
+	.4byte	.LLST120
 	.uleb128 0x46
 	.4byte	.LASF3026
 	.byte	0x1
 	.2byte	0x791
 	.4byte	0xb869
-	.uleb128 0x57
+	.uleb128 0x59
 	.4byte	.LASF3027
 	.byte	0x1
 	.2byte	0x792
 	.4byte	0xc012
-	.4byte	.LLST120
+	.4byte	.LLST121
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x793
 	.4byte	0xe461
-	.uleb128 0x57
+	.uleb128 0x59
 	.4byte	.LASF2954
 	.byte	0x1
 	.2byte	0x794
 	.4byte	0xe710
-	.4byte	.LLST121
+	.4byte	.LLST122
 	.uleb128 0x46
 	.4byte	.LASF2995
 	.byte	0x1
@@ -37182,1488 +37195,1488 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x796
 	.4byte	0xc6
-	.uleb128 0x58
-	.4byte	0x13174
-	.8byte	.LBB1438
+	.uleb128 0x5a
+	.4byte	0x13136
+	.8byte	.LBB1448
 	.4byte	.Ldebug_ranges0+0x9e0
 	.byte	0x1
 	.2byte	0x798
-	.4byte	0xe913
+	.4byte	0xe951
 	.uleb128 0x54
-	.4byte	0x1319d
+	.4byte	0x1315f
 	.uleb128 0x54
-	.4byte	0x13191
+	.4byte	0x13153
 	.uleb128 0x54
-	.4byte	0x13185
+	.4byte	0x13147
 	.uleb128 0x4e
-	.8byte	.LVL445
-	.4byte	0x13aea
+	.8byte	.LVL453
+	.4byte	0x13a92
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13051
-	.8byte	.LBB1442
-	.8byte	.LBE1442-.LBB1442
+	.4byte	0x13013
+	.8byte	.LBB1452
+	.8byte	.LBE1452-.LBB1452
 	.byte	0x1
 	.2byte	0x7aa
-	.4byte	0xe952
+	.4byte	0xe990
 	.uleb128 0x54
-	.4byte	0x13061
-	.uleb128 0x59
-	.4byte	0x13156
-	.8byte	.LBB1443
-	.8byte	.LBE1443-.LBB1443
+	.4byte	0x13023
+	.uleb128 0x5b
+	.4byte	0x13118
+	.8byte	.LBB1453
+	.8byte	.LBE1453-.LBB1453
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x54
-	.4byte	0x13167
+	.4byte	0x13129
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13073
-	.8byte	.LBB1445
-	.8byte	.LBE1445-.LBB1445
+	.4byte	0x13035
+	.8byte	.LBB1455
+	.8byte	.LBE1455-.LBB1455
 	.byte	0x1
 	.2byte	0x7bb
-	.4byte	0xe992
+	.4byte	0xe9d0
 	.uleb128 0x54
-	.4byte	0x13084
-	.uleb128 0x5a
-	.4byte	0x13156
-	.8byte	.LBB1446
-	.8byte	.LBE1446-.LBB1446
+	.4byte	0x13046
+	.uleb128 0x5c
+	.4byte	0x13118
+	.8byte	.LBB1456
+	.8byte	.LBE1456-.LBB1456
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x54
-	.4byte	0x13167
+	.4byte	0x13129
 	.byte	0
 	.byte	0
-	.uleb128 0x58
-	.4byte	0x11552
-	.8byte	.LBB1448
+	.uleb128 0x5a
+	.4byte	0x11590
+	.8byte	.LBB1458
 	.4byte	.Ldebug_ranges0+0xa10
 	.byte	0x1
 	.2byte	0x7c9
-	.4byte	0xf34b
+	.4byte	0xf389
 	.uleb128 0x54
-	.4byte	0x11563
-	.uleb128 0x5b
+	.4byte	0x115a1
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xa10
-	.uleb128 0x5c
-	.4byte	0x1156f
-	.uleb128 0x58
-	.4byte	0x13097
-	.8byte	.LBB1450
+	.uleb128 0x57
+	.4byte	0x115ad
+	.uleb128 0x5a
+	.4byte	0x13059
+	.8byte	.LBB1460
 	.4byte	.Ldebug_ranges0+0xa70
 	.byte	0x1
 	.2byte	0x4fd
-	.4byte	0xea22
+	.4byte	0xea60
 	.uleb128 0x54
-	.4byte	0x130bf
+	.4byte	0x13081
 	.uleb128 0x54
-	.4byte	0x130b3
+	.4byte	0x13075
 	.uleb128 0x54
-	.4byte	0x130a8
-	.uleb128 0x5d
-	.4byte	0x130cc
-	.8byte	.LBB1451
+	.4byte	0x1306a
+	.uleb128 0x5e
+	.4byte	0x1308e
+	.8byte	.LBB1461
 	.4byte	.Ldebug_ranges0+0xa70
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13100
+	.4byte	0x130c2
 	.uleb128 0x54
-	.4byte	0x130f4
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x130e8
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x130dd
-	.uleb128 0x5b
+	.4byte	0x1309f
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xa70
-	.uleb128 0x5c
-	.4byte	0x1310b
+	.uleb128 0x57
+	.4byte	0x130cd
 	.uleb128 0x4e
-	.8byte	.LVL453
-	.4byte	0x13af7
+	.8byte	.LVL461
+	.4byte	0x13a9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13097
-	.8byte	.LBB1462
-	.8byte	.LBE1462-.LBB1462
+	.4byte	0x13059
+	.8byte	.LBB1472
+	.8byte	.LBE1472-.LBB1472
 	.byte	0x1
 	.2byte	0x500
-	.4byte	0xea9f
+	.4byte	0xeadd
 	.uleb128 0x54
-	.4byte	0x130bf
+	.4byte	0x13081
 	.uleb128 0x54
-	.4byte	0x130b3
+	.4byte	0x13075
 	.uleb128 0x54
-	.4byte	0x130a8
-	.uleb128 0x5a
-	.4byte	0x130cc
-	.8byte	.LBB1463
-	.8byte	.LBE1463-.LBB1463
+	.4byte	0x1306a
+	.uleb128 0x5c
+	.4byte	0x1308e
+	.8byte	.LBB1473
+	.8byte	.LBE1473-.LBB1473
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13100
+	.4byte	0x130c2
 	.uleb128 0x54
-	.4byte	0x130f4
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x130e8
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x130dd
-	.uleb128 0x5e
-	.8byte	.LBB1464
-	.8byte	.LBE1464-.LBB1464
-	.uleb128 0x5c
-	.4byte	0x1310b
+	.4byte	0x1309f
+	.uleb128 0x56
+	.8byte	.LBB1474
+	.8byte	.LBE1474-.LBB1474
+	.uleb128 0x57
+	.4byte	0x130cd
 	.uleb128 0x4e
-	.8byte	.LVL454
-	.4byte	0x13af7
+	.8byte	.LVL462
+	.4byte	0x13a9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13097
-	.8byte	.LBB1465
-	.8byte	.LBE1465-.LBB1465
+	.4byte	0x13059
+	.8byte	.LBB1475
+	.8byte	.LBE1475-.LBB1475
 	.byte	0x1
 	.2byte	0x503
-	.4byte	0xeb1c
+	.4byte	0xeb5a
 	.uleb128 0x54
-	.4byte	0x130bf
+	.4byte	0x13081
 	.uleb128 0x54
-	.4byte	0x130b3
+	.4byte	0x13075
 	.uleb128 0x54
-	.4byte	0x130a8
-	.uleb128 0x5a
-	.4byte	0x130cc
-	.8byte	.LBB1466
-	.8byte	.LBE1466-.LBB1466
+	.4byte	0x1306a
+	.uleb128 0x5c
+	.4byte	0x1308e
+	.8byte	.LBB1476
+	.8byte	.LBE1476-.LBB1476
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13100
+	.4byte	0x130c2
 	.uleb128 0x54
-	.4byte	0x130f4
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x130e8
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x130dd
-	.uleb128 0x5e
-	.8byte	.LBB1467
-	.8byte	.LBE1467-.LBB1467
-	.uleb128 0x5c
-	.4byte	0x1310b
+	.4byte	0x1309f
+	.uleb128 0x56
+	.8byte	.LBB1477
+	.8byte	.LBE1477-.LBB1477
+	.uleb128 0x57
+	.4byte	0x130cd
 	.uleb128 0x4e
-	.8byte	.LVL455
-	.4byte	0x13af7
+	.8byte	.LVL463
+	.4byte	0x13a9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13097
-	.8byte	.LBB1468
-	.8byte	.LBE1468-.LBB1468
+	.4byte	0x13059
+	.8byte	.LBB1478
+	.8byte	.LBE1478-.LBB1478
 	.byte	0x1
 	.2byte	0x506
-	.4byte	0xeb99
+	.4byte	0xebd7
 	.uleb128 0x54
-	.4byte	0x130bf
+	.4byte	0x13081
 	.uleb128 0x54
-	.4byte	0x130b3
+	.4byte	0x13075
 	.uleb128 0x54
-	.4byte	0x130a8
-	.uleb128 0x5a
-	.4byte	0x130cc
-	.8byte	.LBB1469
-	.8byte	.LBE1469-.LBB1469
+	.4byte	0x1306a
+	.uleb128 0x5c
+	.4byte	0x1308e
+	.8byte	.LBB1479
+	.8byte	.LBE1479-.LBB1479
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13100
+	.4byte	0x130c2
 	.uleb128 0x54
-	.4byte	0x130f4
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x130e8
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x130dd
-	.uleb128 0x5e
-	.8byte	.LBB1470
-	.8byte	.LBE1470-.LBB1470
-	.uleb128 0x5c
-	.4byte	0x1310b
+	.4byte	0x1309f
+	.uleb128 0x56
+	.8byte	.LBB1480
+	.8byte	.LBE1480-.LBB1480
+	.uleb128 0x57
+	.4byte	0x130cd
 	.uleb128 0x4e
-	.8byte	.LVL456
-	.4byte	0x13af7
+	.8byte	.LVL464
+	.4byte	0x13a9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13097
-	.8byte	.LBB1471
-	.8byte	.LBE1471-.LBB1471
+	.4byte	0x13059
+	.8byte	.LBB1481
+	.8byte	.LBE1481-.LBB1481
 	.byte	0x1
 	.2byte	0x509
-	.4byte	0xec16
+	.4byte	0xec54
 	.uleb128 0x54
-	.4byte	0x130bf
+	.4byte	0x13081
 	.uleb128 0x54
-	.4byte	0x130b3
+	.4byte	0x13075
 	.uleb128 0x54
-	.4byte	0x130a8
-	.uleb128 0x5a
-	.4byte	0x130cc
-	.8byte	.LBB1472
-	.8byte	.LBE1472-.LBB1472
+	.4byte	0x1306a
+	.uleb128 0x5c
+	.4byte	0x1308e
+	.8byte	.LBB1482
+	.8byte	.LBE1482-.LBB1482
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13100
+	.4byte	0x130c2
 	.uleb128 0x54
-	.4byte	0x130f4
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x130e8
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x130dd
-	.uleb128 0x5e
-	.8byte	.LBB1473
-	.8byte	.LBE1473-.LBB1473
-	.uleb128 0x5c
-	.4byte	0x1310b
+	.4byte	0x1309f
+	.uleb128 0x56
+	.8byte	.LBB1483
+	.8byte	.LBE1483-.LBB1483
+	.uleb128 0x57
+	.4byte	0x130cd
 	.uleb128 0x4e
-	.8byte	.LVL457
-	.4byte	0x13af7
+	.8byte	.LVL465
+	.4byte	0x13a9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13097
-	.8byte	.LBB1474
-	.8byte	.LBE1474-.LBB1474
+	.4byte	0x13059
+	.8byte	.LBB1484
+	.8byte	.LBE1484-.LBB1484
 	.byte	0x1
 	.2byte	0x50c
-	.4byte	0xec93
+	.4byte	0xecd1
 	.uleb128 0x54
-	.4byte	0x130bf
+	.4byte	0x13081
 	.uleb128 0x54
-	.4byte	0x130b3
+	.4byte	0x13075
 	.uleb128 0x54
-	.4byte	0x130a8
-	.uleb128 0x5a
-	.4byte	0x130cc
-	.8byte	.LBB1475
-	.8byte	.LBE1475-.LBB1475
+	.4byte	0x1306a
+	.uleb128 0x5c
+	.4byte	0x1308e
+	.8byte	.LBB1485
+	.8byte	.LBE1485-.LBB1485
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13100
+	.4byte	0x130c2
 	.uleb128 0x54
-	.4byte	0x130f4
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x130e8
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x130dd
-	.uleb128 0x5e
-	.8byte	.LBB1476
-	.8byte	.LBE1476-.LBB1476
-	.uleb128 0x5c
-	.4byte	0x1310b
+	.4byte	0x1309f
+	.uleb128 0x56
+	.8byte	.LBB1486
+	.8byte	.LBE1486-.LBB1486
+	.uleb128 0x57
+	.4byte	0x130cd
 	.uleb128 0x4e
-	.8byte	.LVL458
-	.4byte	0x13af7
+	.8byte	.LVL466
+	.4byte	0x13a9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13097
-	.8byte	.LBB1477
-	.8byte	.LBE1477-.LBB1477
+	.4byte	0x13059
+	.8byte	.LBB1487
+	.8byte	.LBE1487-.LBB1487
 	.byte	0x1
 	.2byte	0x50f
-	.4byte	0xed10
+	.4byte	0xed4e
 	.uleb128 0x54
-	.4byte	0x130bf
+	.4byte	0x13081
 	.uleb128 0x54
-	.4byte	0x130b3
+	.4byte	0x13075
 	.uleb128 0x54
-	.4byte	0x130a8
-	.uleb128 0x5a
-	.4byte	0x130cc
-	.8byte	.LBB1478
-	.8byte	.LBE1478-.LBB1478
+	.4byte	0x1306a
+	.uleb128 0x5c
+	.4byte	0x1308e
+	.8byte	.LBB1488
+	.8byte	.LBE1488-.LBB1488
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13100
+	.4byte	0x130c2
 	.uleb128 0x54
-	.4byte	0x130f4
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x130e8
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x130dd
-	.uleb128 0x5e
-	.8byte	.LBB1479
-	.8byte	.LBE1479-.LBB1479
-	.uleb128 0x5c
-	.4byte	0x1310b
+	.4byte	0x1309f
+	.uleb128 0x56
+	.8byte	.LBB1489
+	.8byte	.LBE1489-.LBB1489
+	.uleb128 0x57
+	.4byte	0x130cd
 	.uleb128 0x4e
-	.8byte	.LVL459
-	.4byte	0x13af7
+	.8byte	.LVL467
+	.4byte	0x13a9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13097
-	.8byte	.LBB1480
-	.8byte	.LBE1480-.LBB1480
+	.4byte	0x13059
+	.8byte	.LBB1490
+	.8byte	.LBE1490-.LBB1490
 	.byte	0x1
 	.2byte	0x512
-	.4byte	0xed8d
+	.4byte	0xedcb
 	.uleb128 0x54
-	.4byte	0x130bf
+	.4byte	0x13081
 	.uleb128 0x54
-	.4byte	0x130b3
+	.4byte	0x13075
 	.uleb128 0x54
-	.4byte	0x130a8
-	.uleb128 0x5a
-	.4byte	0x130cc
-	.8byte	.LBB1481
-	.8byte	.LBE1481-.LBB1481
+	.4byte	0x1306a
+	.uleb128 0x5c
+	.4byte	0x1308e
+	.8byte	.LBB1491
+	.8byte	.LBE1491-.LBB1491
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13100
+	.4byte	0x130c2
 	.uleb128 0x54
-	.4byte	0x130f4
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x130e8
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x130dd
-	.uleb128 0x5e
-	.8byte	.LBB1482
-	.8byte	.LBE1482-.LBB1482
-	.uleb128 0x5c
-	.4byte	0x1310b
+	.4byte	0x1309f
+	.uleb128 0x56
+	.8byte	.LBB1492
+	.8byte	.LBE1492-.LBB1492
+	.uleb128 0x57
+	.4byte	0x130cd
 	.uleb128 0x4e
-	.8byte	.LVL460
-	.4byte	0x13af7
+	.8byte	.LVL468
+	.4byte	0x13a9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13097
-	.8byte	.LBB1483
-	.8byte	.LBE1483-.LBB1483
+	.4byte	0x13059
+	.8byte	.LBB1493
+	.8byte	.LBE1493-.LBB1493
 	.byte	0x1
 	.2byte	0x515
-	.4byte	0xee0a
+	.4byte	0xee48
 	.uleb128 0x54
-	.4byte	0x130bf
+	.4byte	0x13081
 	.uleb128 0x54
-	.4byte	0x130b3
+	.4byte	0x13075
 	.uleb128 0x54
-	.4byte	0x130a8
-	.uleb128 0x5a
-	.4byte	0x130cc
-	.8byte	.LBB1484
-	.8byte	.LBE1484-.LBB1484
+	.4byte	0x1306a
+	.uleb128 0x5c
+	.4byte	0x1308e
+	.8byte	.LBB1494
+	.8byte	.LBE1494-.LBB1494
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13100
+	.4byte	0x130c2
 	.uleb128 0x54
-	.4byte	0x130f4
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x130e8
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x130dd
-	.uleb128 0x5e
-	.8byte	.LBB1485
-	.8byte	.LBE1485-.LBB1485
-	.uleb128 0x5c
-	.4byte	0x1310b
+	.4byte	0x1309f
+	.uleb128 0x56
+	.8byte	.LBB1495
+	.8byte	.LBE1495-.LBB1495
+	.uleb128 0x57
+	.4byte	0x130cd
 	.uleb128 0x4e
-	.8byte	.LVL461
-	.4byte	0x13af7
+	.8byte	.LVL469
+	.4byte	0x13a9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13097
-	.8byte	.LBB1486
-	.8byte	.LBE1486-.LBB1486
+	.4byte	0x13059
+	.8byte	.LBB1496
+	.8byte	.LBE1496-.LBB1496
 	.byte	0x1
 	.2byte	0x518
-	.4byte	0xee87
+	.4byte	0xeec5
 	.uleb128 0x54
-	.4byte	0x130bf
+	.4byte	0x13081
 	.uleb128 0x54
-	.4byte	0x130b3
+	.4byte	0x13075
 	.uleb128 0x54
-	.4byte	0x130a8
-	.uleb128 0x5a
-	.4byte	0x130cc
-	.8byte	.LBB1487
-	.8byte	.LBE1487-.LBB1487
+	.4byte	0x1306a
+	.uleb128 0x5c
+	.4byte	0x1308e
+	.8byte	.LBB1497
+	.8byte	.LBE1497-.LBB1497
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13100
+	.4byte	0x130c2
 	.uleb128 0x54
-	.4byte	0x130f4
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x130e8
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x130dd
-	.uleb128 0x5e
-	.8byte	.LBB1488
-	.8byte	.LBE1488-.LBB1488
-	.uleb128 0x5c
-	.4byte	0x1310b
+	.4byte	0x1309f
+	.uleb128 0x56
+	.8byte	.LBB1498
+	.8byte	.LBE1498-.LBB1498
+	.uleb128 0x57
+	.4byte	0x130cd
 	.uleb128 0x4e
-	.8byte	.LVL462
-	.4byte	0x13af7
+	.8byte	.LVL470
+	.4byte	0x13a9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13097
-	.8byte	.LBB1489
-	.8byte	.LBE1489-.LBB1489
+	.4byte	0x13059
+	.8byte	.LBB1499
+	.8byte	.LBE1499-.LBB1499
 	.byte	0x1
 	.2byte	0x51b
-	.4byte	0xef04
+	.4byte	0xef42
 	.uleb128 0x54
-	.4byte	0x130bf
+	.4byte	0x13081
 	.uleb128 0x54
-	.4byte	0x130b3
+	.4byte	0x13075
 	.uleb128 0x54
-	.4byte	0x130a8
-	.uleb128 0x5a
-	.4byte	0x130cc
-	.8byte	.LBB1490
-	.8byte	.LBE1490-.LBB1490
+	.4byte	0x1306a
+	.uleb128 0x5c
+	.4byte	0x1308e
+	.8byte	.LBB1500
+	.8byte	.LBE1500-.LBB1500
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13100
+	.4byte	0x130c2
 	.uleb128 0x54
-	.4byte	0x130f4
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x130e8
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x130dd
-	.uleb128 0x5e
-	.8byte	.LBB1491
-	.8byte	.LBE1491-.LBB1491
-	.uleb128 0x5c
-	.4byte	0x1310b
+	.4byte	0x1309f
+	.uleb128 0x56
+	.8byte	.LBB1501
+	.8byte	.LBE1501-.LBB1501
+	.uleb128 0x57
+	.4byte	0x130cd
 	.uleb128 0x4e
-	.8byte	.LVL463
-	.4byte	0x13af7
+	.8byte	.LVL471
+	.4byte	0x13a9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13097
-	.8byte	.LBB1492
-	.8byte	.LBE1492-.LBB1492
+	.4byte	0x13059
+	.8byte	.LBB1502
+	.8byte	.LBE1502-.LBB1502
 	.byte	0x1
 	.2byte	0x51e
-	.4byte	0xef81
+	.4byte	0xefbf
 	.uleb128 0x54
-	.4byte	0x130bf
+	.4byte	0x13081
 	.uleb128 0x54
-	.4byte	0x130b3
+	.4byte	0x13075
 	.uleb128 0x54
-	.4byte	0x130a8
-	.uleb128 0x5a
-	.4byte	0x130cc
-	.8byte	.LBB1493
-	.8byte	.LBE1493-.LBB1493
+	.4byte	0x1306a
+	.uleb128 0x5c
+	.4byte	0x1308e
+	.8byte	.LBB1503
+	.8byte	.LBE1503-.LBB1503
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13100
+	.4byte	0x130c2
 	.uleb128 0x54
-	.4byte	0x130f4
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x130e8
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x130dd
-	.uleb128 0x5e
-	.8byte	.LBB1494
-	.8byte	.LBE1494-.LBB1494
-	.uleb128 0x5c
-	.4byte	0x1310b
+	.4byte	0x1309f
+	.uleb128 0x56
+	.8byte	.LBB1504
+	.8byte	.LBE1504-.LBB1504
+	.uleb128 0x57
+	.4byte	0x130cd
 	.uleb128 0x4e
-	.8byte	.LVL464
-	.4byte	0x13af7
+	.8byte	.LVL472
+	.4byte	0x13a9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13097
-	.8byte	.LBB1495
-	.8byte	.LBE1495-.LBB1495
+	.4byte	0x13059
+	.8byte	.LBB1505
+	.8byte	.LBE1505-.LBB1505
 	.byte	0x1
 	.2byte	0x521
-	.4byte	0xeffe
+	.4byte	0xf03c
 	.uleb128 0x54
-	.4byte	0x130bf
+	.4byte	0x13081
 	.uleb128 0x54
-	.4byte	0x130b3
+	.4byte	0x13075
 	.uleb128 0x54
-	.4byte	0x130a8
-	.uleb128 0x5a
-	.4byte	0x130cc
-	.8byte	.LBB1496
-	.8byte	.LBE1496-.LBB1496
+	.4byte	0x1306a
+	.uleb128 0x5c
+	.4byte	0x1308e
+	.8byte	.LBB1506
+	.8byte	.LBE1506-.LBB1506
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13100
+	.4byte	0x130c2
 	.uleb128 0x54
-	.4byte	0x130f4
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x130e8
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x130dd
-	.uleb128 0x5e
-	.8byte	.LBB1497
-	.8byte	.LBE1497-.LBB1497
-	.uleb128 0x5c
-	.4byte	0x1310b
+	.4byte	0x1309f
+	.uleb128 0x56
+	.8byte	.LBB1507
+	.8byte	.LBE1507-.LBB1507
+	.uleb128 0x57
+	.4byte	0x130cd
 	.uleb128 0x4e
-	.8byte	.LVL465
-	.4byte	0x13af7
+	.8byte	.LVL473
+	.4byte	0x13a9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13097
-	.8byte	.LBB1498
-	.8byte	.LBE1498-.LBB1498
+	.4byte	0x13059
+	.8byte	.LBB1508
+	.8byte	.LBE1508-.LBB1508
 	.byte	0x1
 	.2byte	0x524
-	.4byte	0xf07b
+	.4byte	0xf0b9
 	.uleb128 0x54
-	.4byte	0x130bf
+	.4byte	0x13081
 	.uleb128 0x54
-	.4byte	0x130b3
+	.4byte	0x13075
 	.uleb128 0x54
-	.4byte	0x130a8
-	.uleb128 0x5a
-	.4byte	0x130cc
-	.8byte	.LBB1499
-	.8byte	.LBE1499-.LBB1499
+	.4byte	0x1306a
+	.uleb128 0x5c
+	.4byte	0x1308e
+	.8byte	.LBB1509
+	.8byte	.LBE1509-.LBB1509
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13100
+	.4byte	0x130c2
 	.uleb128 0x54
-	.4byte	0x130f4
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x130e8
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x130dd
-	.uleb128 0x5e
-	.8byte	.LBB1500
-	.8byte	.LBE1500-.LBB1500
-	.uleb128 0x5c
-	.4byte	0x1310b
+	.4byte	0x1309f
+	.uleb128 0x56
+	.8byte	.LBB1510
+	.8byte	.LBE1510-.LBB1510
+	.uleb128 0x57
+	.4byte	0x130cd
 	.uleb128 0x4e
-	.8byte	.LVL466
-	.4byte	0x13af7
+	.8byte	.LVL474
+	.4byte	0x13a9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13097
-	.8byte	.LBB1501
-	.8byte	.LBE1501-.LBB1501
+	.4byte	0x13059
+	.8byte	.LBB1511
+	.8byte	.LBE1511-.LBB1511
 	.byte	0x1
 	.2byte	0x527
-	.4byte	0xf0f8
+	.4byte	0xf136
 	.uleb128 0x54
-	.4byte	0x130bf
+	.4byte	0x13081
 	.uleb128 0x54
-	.4byte	0x130b3
+	.4byte	0x13075
 	.uleb128 0x54
-	.4byte	0x130a8
-	.uleb128 0x5a
-	.4byte	0x130cc
-	.8byte	.LBB1502
-	.8byte	.LBE1502-.LBB1502
+	.4byte	0x1306a
+	.uleb128 0x5c
+	.4byte	0x1308e
+	.8byte	.LBB1512
+	.8byte	.LBE1512-.LBB1512
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13100
+	.4byte	0x130c2
 	.uleb128 0x54
-	.4byte	0x130f4
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x130e8
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x130dd
-	.uleb128 0x5e
-	.8byte	.LBB1503
-	.8byte	.LBE1503-.LBB1503
-	.uleb128 0x5c
-	.4byte	0x1310b
+	.4byte	0x1309f
+	.uleb128 0x56
+	.8byte	.LBB1513
+	.8byte	.LBE1513-.LBB1513
+	.uleb128 0x57
+	.4byte	0x130cd
 	.uleb128 0x4e
-	.8byte	.LVL467
-	.4byte	0x13af7
+	.8byte	.LVL475
+	.4byte	0x13a9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13097
-	.8byte	.LBB1504
-	.8byte	.LBE1504-.LBB1504
+	.4byte	0x13059
+	.8byte	.LBB1514
+	.8byte	.LBE1514-.LBB1514
 	.byte	0x1
 	.2byte	0x52a
-	.4byte	0xf175
+	.4byte	0xf1b3
 	.uleb128 0x54
-	.4byte	0x130bf
+	.4byte	0x13081
 	.uleb128 0x54
-	.4byte	0x130b3
+	.4byte	0x13075
 	.uleb128 0x54
-	.4byte	0x130a8
-	.uleb128 0x5a
-	.4byte	0x130cc
-	.8byte	.LBB1505
-	.8byte	.LBE1505-.LBB1505
+	.4byte	0x1306a
+	.uleb128 0x5c
+	.4byte	0x1308e
+	.8byte	.LBB1515
+	.8byte	.LBE1515-.LBB1515
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13100
+	.4byte	0x130c2
 	.uleb128 0x54
-	.4byte	0x130f4
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x130e8
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x130dd
-	.uleb128 0x5e
-	.8byte	.LBB1506
-	.8byte	.LBE1506-.LBB1506
-	.uleb128 0x5c
-	.4byte	0x1310b
+	.4byte	0x1309f
+	.uleb128 0x56
+	.8byte	.LBB1516
+	.8byte	.LBE1516-.LBB1516
+	.uleb128 0x57
+	.4byte	0x130cd
 	.uleb128 0x4e
-	.8byte	.LVL468
-	.4byte	0x13af7
+	.8byte	.LVL476
+	.4byte	0x13a9f
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x58
-	.4byte	0x13097
-	.8byte	.LBB1507
+	.uleb128 0x5a
+	.4byte	0x13059
+	.8byte	.LBB1517
 	.4byte	.Ldebug_ranges0+0xac0
 	.byte	0x1
 	.2byte	0x52d
-	.4byte	0xf1eb
+	.4byte	0xf229
 	.uleb128 0x54
-	.4byte	0x130bf
+	.4byte	0x13081
 	.uleb128 0x54
-	.4byte	0x130b3
+	.4byte	0x13075
 	.uleb128 0x54
-	.4byte	0x130a8
-	.uleb128 0x5d
-	.4byte	0x130cc
-	.8byte	.LBB1508
+	.4byte	0x1306a
+	.uleb128 0x5e
+	.4byte	0x1308e
+	.8byte	.LBB1518
 	.4byte	.Ldebug_ranges0+0xac0
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13100
+	.4byte	0x130c2
 	.uleb128 0x54
-	.4byte	0x130f4
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x130e8
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x130dd
-	.uleb128 0x5b
+	.4byte	0x1309f
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xac0
-	.uleb128 0x5c
-	.4byte	0x1310b
+	.uleb128 0x57
+	.4byte	0x130cd
 	.uleb128 0x4e
-	.8byte	.LVL469
-	.4byte	0x13af7
+	.8byte	.LVL477
+	.4byte	0x13a9f
 	.uleb128 0x4e
-	.8byte	.LVL501
-	.4byte	0x13af7
+	.8byte	.LVL509
+	.4byte	0x13a9f
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x58
-	.4byte	0x13097
-	.8byte	.LBB1514
+	.uleb128 0x5a
+	.4byte	0x13059
+	.8byte	.LBB1524
 	.4byte	.Ldebug_ranges0+0xb00
 	.byte	0x1
 	.2byte	0x530
-	.4byte	0xf261
+	.4byte	0xf29f
 	.uleb128 0x54
-	.4byte	0x130bf
+	.4byte	0x13081
 	.uleb128 0x54
-	.4byte	0x130b3
+	.4byte	0x13075
 	.uleb128 0x54
-	.4byte	0x130a8
-	.uleb128 0x5d
-	.4byte	0x130cc
-	.8byte	.LBB1515
+	.4byte	0x1306a
+	.uleb128 0x5e
+	.4byte	0x1308e
+	.8byte	.LBB1525
 	.4byte	.Ldebug_ranges0+0xb00
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13100
+	.4byte	0x130c2
 	.uleb128 0x54
-	.4byte	0x130f4
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x130e8
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x130dd
-	.uleb128 0x5b
+	.4byte	0x1309f
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xb00
-	.uleb128 0x5c
-	.4byte	0x1310b
+	.uleb128 0x57
+	.4byte	0x130cd
 	.uleb128 0x4e
-	.8byte	.LVL470
-	.4byte	0x13af7
+	.8byte	.LVL478
+	.4byte	0x13a9f
 	.uleb128 0x4e
-	.8byte	.LVL500
-	.4byte	0x13af7
+	.8byte	.LVL508
+	.4byte	0x13a9f
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x58
-	.4byte	0x13097
-	.8byte	.LBB1521
+	.uleb128 0x5a
+	.4byte	0x13059
+	.8byte	.LBB1531
 	.4byte	.Ldebug_ranges0+0xb40
 	.byte	0x1
 	.2byte	0x533
-	.4byte	0xf2d7
+	.4byte	0xf315
 	.uleb128 0x54
-	.4byte	0x130bf
+	.4byte	0x13081
 	.uleb128 0x54
-	.4byte	0x130b3
+	.4byte	0x13075
 	.uleb128 0x54
-	.4byte	0x130a8
-	.uleb128 0x5d
-	.4byte	0x130cc
-	.8byte	.LBB1522
+	.4byte	0x1306a
+	.uleb128 0x5e
+	.4byte	0x1308e
+	.8byte	.LBB1532
 	.4byte	.Ldebug_ranges0+0xb40
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13100
+	.4byte	0x130c2
 	.uleb128 0x54
-	.4byte	0x130f4
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x130e8
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x130dd
-	.uleb128 0x5b
+	.4byte	0x1309f
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xb40
-	.uleb128 0x5c
-	.4byte	0x1310b
+	.uleb128 0x57
+	.4byte	0x130cd
 	.uleb128 0x4e
-	.8byte	.LVL471
-	.4byte	0x13af7
+	.8byte	.LVL479
+	.4byte	0x13a9f
 	.uleb128 0x4e
-	.8byte	.LVL499
-	.4byte	0x13af7
+	.8byte	.LVL507
+	.4byte	0x13a9f
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x5d
-	.4byte	0x13097
-	.8byte	.LBB1528
+	.uleb128 0x5e
+	.4byte	0x13059
+	.8byte	.LBB1538
 	.4byte	.Ldebug_ranges0+0xb80
 	.byte	0x1
 	.2byte	0x536
 	.uleb128 0x54
-	.4byte	0x130bf
+	.4byte	0x13081
 	.uleb128 0x54
-	.4byte	0x130b3
+	.4byte	0x13075
 	.uleb128 0x54
-	.4byte	0x130a8
-	.uleb128 0x5d
-	.4byte	0x130cc
-	.8byte	.LBB1529
+	.4byte	0x1306a
+	.uleb128 0x5e
+	.4byte	0x1308e
+	.8byte	.LBB1539
 	.4byte	.Ldebug_ranges0+0xb80
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13100
+	.4byte	0x130c2
 	.uleb128 0x54
-	.4byte	0x130f4
+	.4byte	0x130b6
 	.uleb128 0x54
-	.4byte	0x130e8
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x130dd
-	.uleb128 0x5b
+	.4byte	0x1309f
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xb80
-	.uleb128 0x5c
-	.4byte	0x1310b
+	.uleb128 0x57
+	.4byte	0x130cd
 	.uleb128 0x4e
-	.8byte	.LVL472
-	.4byte	0x13af7
+	.8byte	.LVL480
+	.4byte	0x13a9f
 	.uleb128 0x4e
-	.8byte	.LVL498
-	.4byte	0x13af7
+	.8byte	.LVL506
+	.4byte	0x13a9f
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x58
-	.4byte	0xfd15
-	.8byte	.LBB1550
+	.uleb128 0x5a
+	.4byte	0xfd53
+	.8byte	.LBB1560
 	.4byte	.Ldebug_ranges0+0xbc0
 	.byte	0x1
 	.2byte	0x7d4
-	.4byte	0xf4f8
+	.4byte	0xf536
 	.uleb128 0x54
-	.4byte	0xfd26
-	.uleb128 0x5b
+	.4byte	0xfd64
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xbc0
 	.uleb128 0x5f
-	.4byte	0xfd32
-	.4byte	.LLST122
-	.uleb128 0x5c
-	.4byte	0xfd3e
-	.uleb128 0x5c
-	.4byte	0xfd4a
-	.uleb128 0x5c
-	.4byte	0xfd56
+	.4byte	0xfd70
+	.4byte	.LLST123
+	.uleb128 0x57
+	.4byte	0xfd7c
+	.uleb128 0x57
+	.4byte	0xfd88
+	.uleb128 0x57
+	.4byte	0xfd94
 	.uleb128 0x60
-	.4byte	0xfd62
+	.4byte	0xfda0
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
-	.uleb128 0x5c
-	.4byte	0xfd6c
-	.uleb128 0x5c
-	.4byte	0xfd78
-	.uleb128 0x5c
-	.4byte	0xfd84
-	.uleb128 0x58
-	.4byte	0x131aa
-	.8byte	.LBB1552
+	.uleb128 0x57
+	.4byte	0xfdaa
+	.uleb128 0x57
+	.4byte	0xfdb6
+	.uleb128 0x57
+	.4byte	0xfdc2
+	.uleb128 0x5a
+	.4byte	0x1316c
+	.8byte	.LBB1562
 	.4byte	.Ldebug_ranges0+0xc30
 	.byte	0x1
 	.2byte	0x6d3
-	.4byte	0xf3bb
+	.4byte	0xf3f9
 	.uleb128 0x54
-	.4byte	0x131ba
+	.4byte	0x1317c
 	.byte	0
-	.uleb128 0x58
-	.4byte	0x13174
-	.8byte	.LBB1556
+	.uleb128 0x5a
+	.4byte	0x13136
+	.8byte	.LBB1566
 	.4byte	.Ldebug_ranges0+0xc60
 	.byte	0x1
 	.2byte	0x6ee
-	.4byte	0xf3f0
+	.4byte	0xf42e
 	.uleb128 0x54
-	.4byte	0x1319d
+	.4byte	0x1315f
 	.uleb128 0x54
-	.4byte	0x13191
+	.4byte	0x13153
 	.uleb128 0x54
-	.4byte	0x13185
+	.4byte	0x13147
 	.uleb128 0x4e
-	.8byte	.LVL478
-	.4byte	0x13aea
+	.8byte	.LVL486
+	.4byte	0x13a92
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13174
-	.8byte	.LBB1564
-	.8byte	.LBE1564-.LBB1564
+	.4byte	0x13136
+	.8byte	.LBB1574
+	.8byte	.LBE1574-.LBB1574
 	.byte	0x1
 	.2byte	0x6f1
-	.4byte	0xf429
+	.4byte	0xf467
 	.uleb128 0x54
-	.4byte	0x1319d
+	.4byte	0x1315f
 	.uleb128 0x54
-	.4byte	0x13191
+	.4byte	0x13153
 	.uleb128 0x54
-	.4byte	0x13185
+	.4byte	0x13147
 	.uleb128 0x4e
-	.8byte	.LVL479
-	.4byte	0x13aea
+	.8byte	.LVL487
+	.4byte	0x13a92
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13174
-	.8byte	.LBB1566
-	.8byte	.LBE1566-.LBB1566
+	.4byte	0x13136
+	.8byte	.LBB1576
+	.8byte	.LBE1576-.LBB1576
 	.byte	0x1
 	.2byte	0x6f4
-	.4byte	0xf462
+	.4byte	0xf4a0
 	.uleb128 0x54
-	.4byte	0x1319d
+	.4byte	0x1315f
 	.uleb128 0x54
-	.4byte	0x13191
+	.4byte	0x13153
 	.uleb128 0x54
-	.4byte	0x13185
+	.4byte	0x13147
 	.uleb128 0x4e
-	.8byte	.LVL480
-	.4byte	0x13aea
+	.8byte	.LVL488
+	.4byte	0x13a92
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13174
-	.8byte	.LBB1568
-	.8byte	.LBE1568-.LBB1568
+	.4byte	0x13136
+	.8byte	.LBB1578
+	.8byte	.LBE1578-.LBB1578
 	.byte	0x1
 	.2byte	0x6fc
-	.4byte	0xf49b
+	.4byte	0xf4d9
 	.uleb128 0x54
-	.4byte	0x1319d
+	.4byte	0x1315f
 	.uleb128 0x54
-	.4byte	0x13191
+	.4byte	0x13153
 	.uleb128 0x54
-	.4byte	0x13185
+	.4byte	0x13147
 	.uleb128 0x4e
-	.8byte	.LVL481
-	.4byte	0x13aea
+	.8byte	.LVL489
+	.4byte	0x13a92
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL474
-	.4byte	0x13b04
+	.8byte	.LVL482
+	.4byte	0x13aac
 	.uleb128 0x4e
-	.8byte	.LVL475
-	.4byte	0x13b11
+	.8byte	.LVL483
+	.4byte	0x13ab9
 	.uleb128 0x4e
-	.8byte	.LVL476
-	.4byte	0x13b1d
+	.8byte	.LVL484
+	.4byte	0x13ac5
 	.uleb128 0x4e
-	.8byte	.LVL477
-	.4byte	0x13b29
+	.8byte	.LVL485
+	.4byte	0x13ad1
 	.uleb128 0x4e
-	.8byte	.LVL482
-	.4byte	0x13b35
+	.8byte	.LVL490
+	.4byte	0x13add
 	.uleb128 0x4e
-	.8byte	.LVL483
-	.4byte	0x13b3f
+	.8byte	.LVL491
+	.4byte	0x13ae7
 	.uleb128 0x4e
-	.8byte	.LVL495
-	.4byte	0x13b4b
+	.8byte	.LVL503
+	.4byte	0x13af3
 	.byte	0
 	.byte	0
-	.uleb128 0x58
-	.4byte	0xfd8f
-	.8byte	.LBB1577
+	.uleb128 0x5a
+	.4byte	0xfdcd
+	.8byte	.LBB1587
 	.4byte	.Ldebug_ranges0+0xcb0
 	.byte	0x1
 	.2byte	0x7db
-	.4byte	0xf5da
+	.4byte	0xf618
 	.uleb128 0x54
-	.4byte	0xfda0
+	.4byte	0xfdde
 	.uleb128 0x54
-	.4byte	0xfda0
-	.uleb128 0x5b
+	.4byte	0xfdde
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xcb0
-	.uleb128 0x5c
-	.4byte	0xfdac
+	.uleb128 0x57
+	.4byte	0xfdea
 	.uleb128 0x5f
-	.4byte	0xfdb8
-	.4byte	.LLST123
-	.uleb128 0x5c
-	.4byte	0xfdc4
+	.4byte	0xfdf6
+	.4byte	.LLST124
+	.uleb128 0x57
+	.4byte	0xfe02
 	.uleb128 0x60
-	.4byte	0xfdd0
+	.4byte	0xfe0e
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5f
-	.4byte	0xfdda
-	.4byte	.LLST124
-	.uleb128 0x5c
-	.4byte	0xfde6
-	.uleb128 0x5c
-	.4byte	0xfdf2
+	.4byte	0xfe18
+	.4byte	.LLST125
+	.uleb128 0x57
+	.4byte	0xfe24
+	.uleb128 0x57
+	.4byte	0xfe30
 	.uleb128 0x53
-	.4byte	0x131aa
-	.8byte	.LBB1579
-	.8byte	.LBE1579-.LBB1579
+	.4byte	0x1316c
+	.8byte	.LBB1589
+	.8byte	.LBE1589-.LBB1589
 	.byte	0x1
 	.2byte	0x6a6
-	.4byte	0xf570
+	.4byte	0xf5ae
 	.uleb128 0x54
-	.4byte	0x131ba
+	.4byte	0x1317c
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL485
-	.4byte	0x13b04
+	.8byte	.LVL493
+	.4byte	0x13aac
 	.uleb128 0x4e
-	.8byte	.LVL486
-	.4byte	0x13b11
+	.8byte	.LVL494
+	.4byte	0x13ab9
 	.uleb128 0x4e
-	.8byte	.LVL504
-	.4byte	0x13b1d
+	.8byte	.LVL512
+	.4byte	0x13ac5
 	.uleb128 0x4e
-	.8byte	.LVL505
-	.4byte	0x13b58
+	.8byte	.LVL513
+	.4byte	0x13b00
 	.uleb128 0x4e
-	.8byte	.LVL585
-	.4byte	0x13b4b
+	.8byte	.LVL593
+	.4byte	0x13af3
 	.uleb128 0x4e
-	.8byte	.LVL586
-	.4byte	0x13b64
+	.8byte	.LVL594
+	.4byte	0x13b0c
 	.uleb128 0x4e
-	.8byte	.LVL587
-	.4byte	0x13b4b
+	.8byte	.LVL595
+	.4byte	0x13af3
 	.uleb128 0x4e
-	.8byte	.LVL606
-	.4byte	0x13b4b
+	.8byte	.LVL614
+	.4byte	0x13af3
 	.byte	0
 	.byte	0
-	.uleb128 0x58
-	.4byte	0xfcdd
-	.8byte	.LBB1588
+	.uleb128 0x5a
+	.4byte	0xfd1b
+	.8byte	.LBB1598
 	.4byte	.Ldebug_ranges0+0xd10
 	.byte	0x1
 	.2byte	0x7e2
-	.4byte	0xf767
+	.4byte	0xf7a5
 	.uleb128 0x54
-	.4byte	0xfcee
-	.uleb128 0x5b
+	.4byte	0xfd2c
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xd10
 	.uleb128 0x60
-	.4byte	0xfcfa
+	.4byte	0xfd38
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
-	.uleb128 0x58
-	.4byte	0x13380
-	.8byte	.LBB1590
+	.uleb128 0x5a
+	.4byte	0x13342
+	.8byte	.LBB1600
 	.4byte	.Ldebug_ranges0+0xd50
 	.byte	0x1
 	.2byte	0x709
-	.4byte	0xf661
+	.4byte	0xf69f
 	.uleb128 0x54
-	.4byte	0x1338c
-	.uleb128 0x5e
-	.8byte	.LBB1592
-	.8byte	.LBE1592-.LBB1592
-	.uleb128 0x5c
-	.4byte	0x133b7
-	.uleb128 0x59
-	.4byte	0x13504
-	.8byte	.LBB1593
-	.8byte	.LBE1593-.LBB1593
+	.4byte	0x1334e
+	.uleb128 0x56
+	.8byte	.LBB1602
+	.8byte	.LBE1602-.LBB1602
+	.uleb128 0x57
+	.4byte	0x13379
+	.uleb128 0x5b
+	.4byte	0x134c6
+	.8byte	.LBB1603
+	.8byte	.LBE1603-.LBB1603
 	.byte	0x10
 	.byte	0x1c
 	.uleb128 0x54
-	.4byte	0x13524
+	.4byte	0x134e6
 	.uleb128 0x54
-	.4byte	0x13519
+	.4byte	0x134db
 	.uleb128 0x54
-	.4byte	0x13510
+	.4byte	0x134d2
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13446
-	.8byte	.LBB1597
-	.8byte	.LBE1597-.LBB1597
+	.4byte	0x13408
+	.8byte	.LBB1607
+	.8byte	.LBE1607-.LBB1607
 	.byte	0x1
 	.2byte	0x711
-	.4byte	0xf6ac
+	.4byte	0xf6ea
 	.uleb128 0x54
-	.4byte	0x1345b
+	.4byte	0x1341d
 	.uleb128 0x54
-	.4byte	0x13452
-	.uleb128 0x5e
-	.8byte	.LBB1598
-	.8byte	.LBE1598-.LBB1598
-	.uleb128 0x5f
-	.4byte	0x13464
-	.4byte	.LLST125
+	.4byte	0x13414
+	.uleb128 0x56
+	.8byte	.LBB1608
+	.8byte	.LBE1608-.LBB1608
 	.uleb128 0x5f
-	.4byte	0x1346e
+	.4byte	0x13426
 	.4byte	.LLST126
+	.uleb128 0x5f
+	.4byte	0x13430
+	.4byte	.LLST127
 	.byte	0
 	.byte	0
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xd80
-	.4byte	0xf6d9
+	.4byte	0xf717
 	.uleb128 0x5f
-	.4byte	0xfd07
-	.4byte	.LLST127
+	.4byte	0xfd45
+	.4byte	.LLST128
 	.uleb128 0x4e
-	.8byte	.LVL512
-	.4byte	0x13b70
+	.8byte	.LVL520
+	.4byte	0x13b18
 	.uleb128 0x4e
-	.8byte	.LVL514
-	.4byte	0x13b7c
+	.8byte	.LVL522
+	.4byte	0x13b24
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13446
-	.8byte	.LBB1601
-	.8byte	.LBE1601-.LBB1601
+	.4byte	0x13408
+	.8byte	.LBB1611
+	.8byte	.LBE1611-.LBB1611
 	.byte	0x1
 	.2byte	0x71a
-	.4byte	0xf724
+	.4byte	0xf762
 	.uleb128 0x54
-	.4byte	0x1345b
+	.4byte	0x1341d
 	.uleb128 0x54
-	.4byte	0x13452
-	.uleb128 0x5e
-	.8byte	.LBB1602
-	.8byte	.LBE1602-.LBB1602
-	.uleb128 0x5f
-	.4byte	0x13464
-	.4byte	.LLST128
+	.4byte	0x13414
+	.uleb128 0x56
+	.8byte	.LBB1612
+	.8byte	.LBE1612-.LBB1612
 	.uleb128 0x5f
-	.4byte	0x1346e
+	.4byte	0x13426
 	.4byte	.LLST129
+	.uleb128 0x5f
+	.4byte	0x13430
+	.4byte	.LLST130
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL506
-	.4byte	0x13b70
-	.uleb128 0x4e
-	.8byte	.LVL507
-	.4byte	0x13b89
+	.8byte	.LVL514
+	.4byte	0x13b18
 	.uleb128 0x4e
 	.8byte	.LVL515
-	.4byte	0x13b89
+	.4byte	0x13b31
 	.uleb128 0x4e
-	.8byte	.LVL590
-	.4byte	0x13b4b
+	.8byte	.LVL523
+	.4byte	0x13b31
 	.uleb128 0x4e
-	.8byte	.LVL594
-	.4byte	0x13b4b
+	.8byte	.LVL598
+	.4byte	0x13af3
+	.uleb128 0x4e
+	.8byte	.LVL602
+	.4byte	0x13af3
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0xfcc3
-	.8byte	.LBB1605
-	.8byte	.LBE1605-.LBB1605
+	.4byte	0xfd01
+	.8byte	.LBB1615
+	.8byte	.LBE1615-.LBB1615
 	.byte	0x1
 	.2byte	0x7e9
-	.4byte	0xf801
+	.4byte	0xf83f
 	.uleb128 0x54
-	.4byte	0xfcd0
-	.uleb128 0x58
-	.4byte	0x12ddd
-	.8byte	.LBB1607
+	.4byte	0xfd0e
+	.uleb128 0x5a
+	.4byte	0x12d9f
+	.8byte	.LBB1617
 	.4byte	.Ldebug_ranges0+0xdb0
 	.byte	0x1
 	.2byte	0x72a
-	.4byte	0xf7cc
+	.4byte	0xf80a
 	.uleb128 0x54
-	.4byte	0x12dff
+	.4byte	0x12dc1
 	.uleb128 0x54
-	.4byte	0x12df4
+	.4byte	0x12db6
 	.uleb128 0x54
-	.4byte	0x12de9
-	.uleb128 0x5b
+	.4byte	0x12dab
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xdb0
 	.uleb128 0x5f
-	.4byte	0x12e0a
-	.4byte	.LLST130
+	.4byte	0x12dcc
+	.4byte	.LLST131
 	.uleb128 0x4e
-	.8byte	.LVL522
-	.4byte	0x13b96
+	.8byte	.LVL530
+	.4byte	0x13b3e
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL523
-	.4byte	0x13ba2
+	.8byte	.LVL531
+	.4byte	0x13b4a
 	.uleb128 0x4e
-	.8byte	.LVL524
-	.4byte	0x13bae
+	.8byte	.LVL532
+	.4byte	0x13b56
 	.uleb128 0x4e
-	.8byte	.LVL525
-	.4byte	0x13ba2
+	.8byte	.LVL533
+	.4byte	0x13b4a
 	.uleb128 0x4e
-	.8byte	.LVL526
-	.4byte	0x13bae
+	.8byte	.LVL534
+	.4byte	0x13b56
 	.byte	0
-	.uleb128 0x58
-	.4byte	0xfc21
-	.8byte	.LBB1617
+	.uleb128 0x5a
+	.4byte	0xfc5f
+	.8byte	.LBB1627
 	.4byte	.Ldebug_ranges0+0xe10
 	.byte	0x1
 	.2byte	0x7ec
-	.4byte	0xfaa4
+	.4byte	0xfae2
 	.uleb128 0x54
-	.4byte	0xfc3e
+	.4byte	0xfc7c
 	.uleb128 0x54
-	.4byte	0xfc32
-	.uleb128 0x5b
+	.4byte	0xfc70
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xe10
-	.uleb128 0x5c
-	.4byte	0xfc4a
-	.uleb128 0x5f
-	.4byte	0xfc56
-	.4byte	.LLST131
+	.uleb128 0x57
+	.4byte	0xfc88
 	.uleb128 0x5f
-	.4byte	0xfc62
+	.4byte	0xfc94
 	.4byte	.LLST132
 	.uleb128 0x5f
-	.4byte	0xfc6e
+	.4byte	0xfca0
 	.4byte	.LLST133
 	.uleb128 0x5f
-	.4byte	0xfc7a
+	.4byte	0xfcac
 	.4byte	.LLST134
 	.uleb128 0x5f
-	.4byte	0xfc86
+	.4byte	0xfcb8
 	.4byte	.LLST135
 	.uleb128 0x5f
-	.4byte	0xfc92
+	.4byte	0xfcc4
 	.4byte	.LLST136
-	.uleb128 0x5c
-	.4byte	0xfc9e
 	.uleb128 0x5f
-	.4byte	0xfcaa
+	.4byte	0xfcd0
 	.4byte	.LLST137
+	.uleb128 0x57
+	.4byte	0xfcdc
 	.uleb128 0x5f
-	.4byte	0xfcb6
+	.4byte	0xfce8
 	.4byte	.LLST138
+	.uleb128 0x5f
+	.4byte	0xfcf4
+	.4byte	.LLST139
 	.uleb128 0x53
-	.4byte	0x11616
-	.8byte	.LBB1619
-	.8byte	.LBE1619-.LBB1619
+	.4byte	0x11654
+	.8byte	.LBB1629
+	.8byte	.LBE1629-.LBB1629
 	.byte	0x1
 	.2byte	0x762
-	.4byte	0xf8e3
+	.4byte	0xf921
 	.uleb128 0x54
-	.4byte	0x11627
+	.4byte	0x11665
 	.uleb128 0x54
-	.4byte	0x11627
-	.uleb128 0x5e
-	.8byte	.LBB1620
-	.8byte	.LBE1620-.LBB1620
+	.4byte	0x11665
+	.uleb128 0x56
+	.8byte	.LBB1630
+	.8byte	.LBE1630-.LBB1630
 	.uleb128 0x5f
-	.4byte	0x11633
-	.4byte	.LLST139
+	.4byte	0x11671
+	.4byte	.LLST140
 	.uleb128 0x4e
-	.8byte	.LVL543
-	.4byte	0x13bba
+	.8byte	.LVL551
+	.4byte	0x13b62
 	.uleb128 0x4e
-	.8byte	.LVL545
-	.4byte	0x13b3f
+	.8byte	.LVL553
+	.4byte	0x13ae7
 	.uleb128 0x4e
-	.8byte	.LVL546
-	.4byte	0x13bc6
+	.8byte	.LVL554
+	.4byte	0x13b6e
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12f5a
-	.8byte	.LBB1621
-	.8byte	.LBE1621-.LBB1621
+	.4byte	0x12f1c
+	.8byte	.LBB1631
+	.8byte	.LBE1631-.LBB1631
 	.byte	0x1
 	.2byte	0x748
-	.4byte	0xf93a
+	.4byte	0xf978
 	.uleb128 0x54
-	.4byte	0x12f77
+	.4byte	0x12f39
 	.uleb128 0x54
-	.4byte	0x12f6b
-	.uleb128 0x5a
-	.4byte	0x12f84
-	.8byte	.LBB1622
-	.8byte	.LBE1622-.LBB1622
+	.4byte	0x12f2d
+	.uleb128 0x5c
+	.4byte	0x12f46
+	.8byte	.LBB1632
+	.8byte	.LBE1632-.LBB1632
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x12fa1
+	.4byte	0x12f63
 	.uleb128 0x54
-	.4byte	0x12f95
+	.4byte	0x12f57
 	.uleb128 0x4e
-	.8byte	.LVL559
-	.4byte	0x13bd2
+	.8byte	.LVL567
+	.4byte	0x13b7a
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12f5a
-	.8byte	.LBB1624
-	.8byte	.LBE1624-.LBB1624
+	.4byte	0x12f1c
+	.8byte	.LBB1634
+	.8byte	.LBE1634-.LBB1634
 	.byte	0x1
 	.2byte	0x756
-	.4byte	0xf991
+	.4byte	0xf9cf
 	.uleb128 0x54
-	.4byte	0x12f77
+	.4byte	0x12f39
 	.uleb128 0x54
-	.4byte	0x12f6b
-	.uleb128 0x5a
-	.4byte	0x12f84
-	.8byte	.LBB1625
-	.8byte	.LBE1625-.LBB1625
+	.4byte	0x12f2d
+	.uleb128 0x5c
+	.4byte	0x12f46
+	.8byte	.LBB1635
+	.8byte	.LBE1635-.LBB1635
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x12fa1
+	.4byte	0x12f63
 	.uleb128 0x54
-	.4byte	0x12f95
+	.4byte	0x12f57
 	.uleb128 0x4e
-	.8byte	.LVL574
-	.4byte	0x13bd2
+	.8byte	.LVL582
+	.4byte	0x13b7a
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL528
-	.4byte	0x13bdf
+	.8byte	.LVL536
+	.4byte	0x13b87
 	.uleb128 0x4e
-	.8byte	.LVL530
-	.4byte	0x13bdf
+	.8byte	.LVL538
+	.4byte	0x13b87
 	.uleb128 0x4e
-	.8byte	.LVL532
-	.4byte	0x13beb
+	.8byte	.LVL540
+	.4byte	0x13b93
 	.uleb128 0x4e
-	.8byte	.LVL537
-	.4byte	0x13beb
+	.8byte	.LVL545
+	.4byte	0x13b93
 	.uleb128 0x4e
-	.8byte	.LVL541
-	.4byte	0x13ad1
+	.8byte	.LVL549
+	.4byte	0x13a79
 	.uleb128 0x4e
-	.8byte	.LVL542
-	.4byte	0x13bf8
+	.8byte	.LVL550
+	.4byte	0x13ba0
 	.uleb128 0x4e
-	.8byte	.LVL547
-	.4byte	0x13c04
+	.8byte	.LVL555
+	.4byte	0x13bac
 	.uleb128 0x4e
-	.8byte	.LVL548
-	.4byte	0x13c04
+	.8byte	.LVL556
+	.4byte	0x13bac
 	.uleb128 0x4e
-	.8byte	.LVL558
-	.4byte	0x13ad1
+	.8byte	.LVL566
+	.4byte	0x13a79
 	.uleb128 0x4e
-	.8byte	.LVL563
-	.4byte	0x13c10
+	.8byte	.LVL571
+	.4byte	0x13bb8
 	.uleb128 0x4e
-	.8byte	.LVL566
-	.4byte	0x13bba
+	.8byte	.LVL574
+	.4byte	0x13b62
 	.uleb128 0x4e
-	.8byte	.LVL568
-	.4byte	0x13c10
+	.8byte	.LVL576
+	.4byte	0x13bb8
 	.uleb128 0x4e
-	.8byte	.LVL569
-	.4byte	0x13bc6
+	.8byte	.LVL577
+	.4byte	0x13b6e
 	.uleb128 0x4e
-	.8byte	.LVL571
-	.4byte	0x13c1a
+	.8byte	.LVL579
+	.4byte	0x13bc2
 	.uleb128 0x4e
-	.8byte	.LVL573
-	.4byte	0x13ad1
+	.8byte	.LVL581
+	.4byte	0x13a79
 	.uleb128 0x4e
-	.8byte	.LVL577
-	.4byte	0x13c10
+	.8byte	.LVL585
+	.4byte	0x13bb8
 	.uleb128 0x4e
-	.8byte	.LVL580
-	.4byte	0x13bba
+	.8byte	.LVL588
+	.4byte	0x13b62
 	.uleb128 0x4e
-	.8byte	.LVL582
-	.4byte	0x13c10
+	.8byte	.LVL590
+	.4byte	0x13bb8
 	.uleb128 0x4e
-	.8byte	.LVL583
-	.4byte	0x13bc6
+	.8byte	.LVL591
+	.4byte	0x13b6e
 	.uleb128 0x4e
-	.8byte	.LVL610
-	.4byte	0x13b4b
+	.8byte	.LVL618
+	.4byte	0x13af3
 	.uleb128 0x4e
-	.8byte	.LVL613
-	.4byte	0x13b4b
+	.8byte	.LVL621
+	.4byte	0x13af3
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1302e
-	.8byte	.LBB1630
-	.8byte	.LBE1630-.LBB1630
+	.4byte	0x12ff0
+	.8byte	.LBB1640
+	.8byte	.LBE1640-.LBB1640
 	.byte	0x1
 	.2byte	0x7ee
-	.4byte	0xfaed
+	.4byte	0xfb2b
 	.uleb128 0x54
-	.4byte	0x13045
+	.4byte	0x13007
 	.uleb128 0x54
-	.4byte	0x1303a
-	.uleb128 0x59
-	.4byte	0x13130
-	.8byte	.LBB1631
-	.8byte	.LBE1631-.LBB1631
+	.4byte	0x12ffc
+	.uleb128 0x5b
+	.4byte	0x130f2
+	.8byte	.LBB1641
+	.8byte	.LBE1641-.LBB1641
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x54
-	.4byte	0x13149
+	.4byte	0x1310b
 	.uleb128 0x54
-	.4byte	0x1313d
+	.4byte	0x130ff
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0xfe15
-	.8byte	.LBB1633
-	.8byte	.LBE1633-.LBB1633
+	.4byte	0xfe53
+	.8byte	.LBB1643
+	.8byte	.LBE1643-.LBB1643
 	.byte	0x1
 	.2byte	0x7f1
-	.4byte	0xfb6a
+	.4byte	0xfba8
 	.uleb128 0x54
-	.4byte	0xfe26
+	.4byte	0xfe64
 	.uleb128 0x4e
-	.8byte	.LVL549
-	.4byte	0x13c26
+	.8byte	.LVL557
+	.4byte	0x13bce
 	.uleb128 0x4e
-	.8byte	.LVL550
-	.4byte	0x13c32
+	.8byte	.LVL558
+	.4byte	0x13bda
 	.uleb128 0x4e
-	.8byte	.LVL551
-	.4byte	0x13c32
+	.8byte	.LVL559
+	.4byte	0x13bda
 	.uleb128 0x4e
-	.8byte	.LVL552
-	.4byte	0x13c32
+	.8byte	.LVL560
+	.4byte	0x13bda
 	.uleb128 0x4e
-	.8byte	.LVL553
-	.4byte	0x13c32
+	.8byte	.LVL561
+	.4byte	0x13bda
 	.uleb128 0x4e
-	.8byte	.LVL554
-	.4byte	0x13c32
+	.8byte	.LVL562
+	.4byte	0x13bda
 	.uleb128 0x4e
-	.8byte	.LVL555
-	.4byte	0x13c32
+	.8byte	.LVL563
+	.4byte	0x13bda
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL446
-	.4byte	0x13b04
-	.uleb128 0x4e
-	.8byte	.LVL447
-	.4byte	0x13c3f
-	.uleb128 0x4e
-	.8byte	.LVL449
-	.4byte	0x13b04
+	.8byte	.LVL454
+	.4byte	0x13aac
 	.uleb128 0x4e
-	.8byte	.LVL450
-	.4byte	0x13c4b
+	.8byte	.LVL455
+	.4byte	0x13be7
 	.uleb128 0x4e
-	.8byte	.LVL487
-	.4byte	0x13b4b
+	.8byte	.LVL457
+	.4byte	0x13aac
 	.uleb128 0x4e
-	.8byte	.LVL489
-	.4byte	0x13b4b
+	.8byte	.LVL458
+	.4byte	0x13bf3
 	.uleb128 0x4e
-	.8byte	.LVL496
-	.4byte	0x13b4b
+	.8byte	.LVL495
+	.4byte	0x13af3
 	.uleb128 0x4e
-	.8byte	.LVL556
-	.4byte	0x13ad1
+	.8byte	.LVL497
+	.4byte	0x13af3
 	.uleb128 0x4e
-	.8byte	.LVL591
-	.4byte	0x13b4b
+	.8byte	.LVL504
+	.4byte	0x13af3
 	.uleb128 0x4e
-	.8byte	.LVL598
-	.4byte	0x13b4b
+	.8byte	.LVL564
+	.4byte	0x13a79
 	.uleb128 0x4e
 	.8byte	.LVL599
-	.4byte	0x13b4b
+	.4byte	0x13af3
 	.uleb128 0x4e
-	.8byte	.LVL600
-	.4byte	0x13b4b
+	.8byte	.LVL606
+	.4byte	0x13af3
 	.uleb128 0x4e
-	.8byte	.LVL604
-	.4byte	0x13b4b
+	.8byte	.LVL607
+	.4byte	0x13af3
 	.uleb128 0x4e
 	.8byte	.LVL608
-	.4byte	0x13c58
+	.4byte	0x13af3
+	.uleb128 0x4e
+	.8byte	.LVL612
+	.4byte	0x13af3
+	.uleb128 0x4e
+	.8byte	.LVL616
+	.4byte	0x13c00
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3036
@@ -38671,7 +38684,7 @@ __exitcall_ebc_exit:
 	.2byte	0x736
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfcc3
+	.4byte	0xfd01
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
@@ -38738,7 +38751,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x71f
 	.byte	0x1
-	.4byte	0xfcdd
+	.4byte	0xfd1b
 	.uleb128 0x64
 	.4byte	.LASF2954
 	.byte	0x1
@@ -38751,7 +38764,7 @@ __exitcall_ebc_exit:
 	.2byte	0x705
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfd15
+	.4byte	0xfd53
 	.uleb128 0x64
 	.4byte	.LASF2954
 	.byte	0x1
@@ -38776,7 +38789,7 @@ __exitcall_ebc_exit:
 	.2byte	0x6bc
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfd8f
+	.4byte	0xfdcd
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
@@ -38829,7 +38842,7 @@ __exitcall_ebc_exit:
 	.2byte	0x693
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe00
+	.4byte	0xfe3e
 	.uleb128 0x64
 	.4byte	.LASF2954
 	.byte	0x1
@@ -38867,25 +38880,25 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.uleb128 0x67
 	.4byte	.LASF3020
-	.4byte	0xfe10
+	.4byte	0xfe4e
 	.4byte	.LASF3041
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xfe10
+	.4byte	0xfe4e
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x12
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xfe00
+	.4byte	0xfe3e
 	.uleb128 0x62
 	.4byte	.LASF3044
 	.byte	0x1
 	.2byte	0x685
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe33
+	.4byte	0xfe71
 	.uleb128 0x64
 	.4byte	.LASF2954
 	.byte	0x1
@@ -38901,14 +38914,14 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2833-.LFB2833
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfe93
-	.uleb128 0x56
+	.4byte	0xfed1
+	.uleb128 0x58
 	.4byte	.LASF2197
 	.byte	0x1
 	.2byte	0x67c
 	.4byte	0xa545
 	.4byte	.LLST71
-	.uleb128 0x56
+	.uleb128 0x58
 	.4byte	.LASF2112
 	.byte	0x1
 	.2byte	0x67d
@@ -38922,7 +38935,7 @@ __exitcall_ebc_exit:
 	.4byte	.LLST73
 	.uleb128 0x4e
 	.8byte	.LVL271
-	.4byte	0x13c62
+	.4byte	0x13c0a
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3046
@@ -38933,14 +38946,14 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2832-.LFB2832
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfef3
-	.uleb128 0x56
+	.4byte	0xff31
+	.uleb128 0x58
 	.4byte	.LASF2197
 	.byte	0x1
 	.2byte	0x673
 	.4byte	0xa545
 	.4byte	.LLST74
-	.uleb128 0x56
+	.uleb128 0x58
 	.4byte	.LASF2112
 	.byte	0x1
 	.2byte	0x674
@@ -38954,7 +38967,7 @@ __exitcall_ebc_exit:
 	.4byte	.LLST76
 	.uleb128 0x4e
 	.8byte	.LVL276
-	.4byte	0x13c62
+	.4byte	0x13c0a
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3047
@@ -38965,14 +38978,14 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2831-.LFB2831
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xffc3
-	.uleb128 0x56
+	.4byte	0x10001
+	.uleb128 0x58
 	.4byte	.LASF2197
 	.byte	0x1
 	.2byte	0x65b
 	.4byte	0xa545
 	.4byte	.LLST86
-	.uleb128 0x56
+	.uleb128 0x58
 	.4byte	.LASF2112
 	.byte	0x1
 	.2byte	0x65c
@@ -38984,7 +38997,7 @@ __exitcall_ebc_exit:
 	.2byte	0x65d
 	.4byte	0x56
 	.4byte	.LLST88
-	.uleb128 0x56
+	.uleb128 0x58
 	.4byte	.LASF380
 	.byte	0x1
 	.2byte	0x65d
@@ -38996,7 +39009,7 @@ __exitcall_ebc_exit:
 	.2byte	0x65f
 	.4byte	0xe461
 	.4byte	.LLST90
-	.uleb128 0x57
+	.uleb128 0x59
 	.4byte	.LASF2453
 	.byte	0x1
 	.2byte	0x660
@@ -39009,19 +39022,19 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.uleb128 0x4e
 	.8byte	.LVL302
-	.4byte	0x13c6f
+	.4byte	0x13c17
 	.uleb128 0x4e
 	.8byte	.LVL304
-	.4byte	0x13c7c
+	.4byte	0x13c24
 	.uleb128 0x4e
 	.8byte	.LVL309
-	.4byte	0x13b4b
+	.4byte	0x13af3
 	.uleb128 0x4e
 	.8byte	.LVL312
-	.4byte	0x13b4b
+	.4byte	0x13af3
 	.uleb128 0x4e
 	.8byte	.LVL313
-	.4byte	0x13c58
+	.4byte	0x13c00
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3048
@@ -39032,14 +39045,14 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2830-.LFB2830
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1005d
-	.uleb128 0x56
+	.4byte	0x1009b
+	.uleb128 0x58
 	.4byte	.LASF2197
 	.byte	0x1
 	.2byte	0x64f
 	.4byte	0xa545
 	.4byte	.LLST77
-	.uleb128 0x56
+	.uleb128 0x58
 	.4byte	.LASF2112
 	.byte	0x1
 	.2byte	0x650
@@ -39062,18 +39075,18 @@ __exitcall_ebc_exit:
 	.2byte	0x654
 	.4byte	0xc6
 	.uleb128 0x53
-	.4byte	0x12d06
-	.8byte	.LBB1186
-	.8byte	.LBE1186-.LBB1186
+	.4byte	0x12cc8
+	.8byte	.LBB1190
+	.8byte	.LBE1190-.LBB1190
 	.byte	0x1
 	.2byte	0x656
-	.4byte	0x1004f
+	.4byte	0x1008d
 	.uleb128 0x54
-	.4byte	0x12d16
+	.4byte	0x12cd8
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL281
-	.4byte	0x13c62
+	.4byte	0x13c0a
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3049
@@ -39084,14 +39097,14 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2829-.LFB2829
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10106
-	.uleb128 0x56
+	.4byte	0x10144
+	.uleb128 0x58
 	.4byte	.LASF2197
 	.byte	0x1
 	.2byte	0x641
 	.4byte	0xa545
 	.4byte	.LLST80
-	.uleb128 0x56
+	.uleb128 0x58
 	.4byte	.LASF2112
 	.byte	0x1
 	.2byte	0x642
@@ -39116,24 +39129,24 @@ __exitcall_ebc_exit:
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
-	.uleb128 0x58
-	.4byte	0x12d22
-	.8byte	.LBB1188
+	.uleb128 0x5a
+	.4byte	0x12ce4
+	.8byte	.LBB1192
 	.4byte	.Ldebug_ranges0+0x6a0
 	.byte	0x1
 	.2byte	0x648
-	.4byte	0x100eb
+	.4byte	0x10129
 	.uleb128 0x54
-	.4byte	0x12d3d
+	.4byte	0x12cff
 	.uleb128 0x54
-	.4byte	0x12d32
+	.4byte	0x12cf4
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL288
-	.4byte	0x13c62
+	.4byte	0x13c0a
 	.uleb128 0x4e
 	.8byte	.LVL291
-	.4byte	0x13c58
+	.4byte	0x13c00
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3050
@@ -39144,14 +39157,14 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2828-.LFB2828
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10172
-	.uleb128 0x56
+	.4byte	0x101b0
+	.uleb128 0x58
 	.4byte	.LASF2197
 	.byte	0x1
 	.2byte	0x636
 	.4byte	0xa545
 	.4byte	.LLST83
-	.uleb128 0x56
+	.uleb128 0x58
 	.4byte	.LASF2112
 	.byte	0x1
 	.2byte	0x637
@@ -39170,7 +39183,7 @@ __exitcall_ebc_exit:
 	.4byte	0xe461
 	.uleb128 0x4e
 	.8byte	.LVL296
-	.4byte	0x13c62
+	.4byte	0x13c0a
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3051
@@ -39181,14 +39194,14 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2827-.LFB2827
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x101eb
-	.uleb128 0x56
+	.4byte	0x10229
+	.uleb128 0x58
 	.4byte	.LASF2197
 	.byte	0x1
 	.2byte	0x62b
 	.4byte	0xa545
 	.4byte	.LLST92
-	.uleb128 0x56
+	.uleb128 0x58
 	.4byte	.LASF2112
 	.byte	0x1
 	.2byte	0x62c
@@ -39207,10 +39220,10 @@ __exitcall_ebc_exit:
 	.4byte	0x56
 	.uleb128 0x4e
 	.8byte	.LVL315
-	.4byte	0x13c88
+	.4byte	0x13c30
 	.uleb128 0x4e
 	.8byte	.LVL316
-	.4byte	0x13c62
+	.4byte	0x13c0a
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3053
@@ -39221,8 +39234,8 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2826-.LFB2826
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1022c
-	.uleb128 0x56
+	.4byte	0x1026a
+	.uleb128 0x58
 	.4byte	.LASF415
 	.byte	0x1
 	.2byte	0x614
@@ -39245,8 +39258,8 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2825-.LFB2825
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10295
-	.uleb128 0x56
+	.4byte	0x102d3
+	.uleb128 0x58
 	.4byte	.LASF1270
 	.byte	0x1
 	.2byte	0x605
@@ -39265,10 +39278,10 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.uleb128 0x4e
 	.8byte	.LVL46
-	.4byte	0x13c94
+	.4byte	0x13c3c
 	.uleb128 0x4e
 	.8byte	.LVL47
-	.4byte	0x13ca0
+	.4byte	0x13c48
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3055
@@ -39279,8 +39292,8 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2824-.LFB2824
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1153d
-	.uleb128 0x56
+	.4byte	0x1157b
+	.uleb128 0x58
 	.4byte	.LASF1270
 	.byte	0x1
 	.2byte	0x53c
@@ -39343,19 +39356,19 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.uleb128 0x55
 	.4byte	.LASF3020
-	.4byte	0x1154d
+	.4byte	0x1158b
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	__func__.34848
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x1a0
-	.4byte	0x103ff
+	.4byte	0x1043d
 	.uleb128 0x46
 	.4byte	.LASF3060
 	.byte	0x1
 	.2byte	0x58f
 	.4byte	0xc6
-	.uleb128 0x5b
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x1a0
 	.uleb128 0x6b
 	.4byte	.LASF3072
@@ -39376,10 +39389,10 @@ __exitcall_ebc_exit:
 	.2byte	0x58f
 	.4byte	0x194
 	.uleb128 0x6c
-	.8byte	.LBB978
-	.8byte	.LBE978-.LBB978
-	.4byte	0x103e3
-	.uleb128 0x57
+	.8byte	.LBB982
+	.8byte	.LBE982-.LBB982
+	.4byte	0x10421
+	.uleb128 0x59
 	.4byte	.LASF3062
 	.byte	0x1
 	.2byte	0x58f
@@ -39387,177 +39400,177 @@ __exitcall_ebc_exit:
 	.4byte	.LLST29
 	.uleb128 0x4e
 	.8byte	.LVL93
-	.4byte	0x13cad
+	.4byte	0x13c55
 	.uleb128 0x4e
 	.8byte	.LVL94
-	.4byte	0x13cb9
+	.4byte	0x13c61
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL91
-	.4byte	0x13cc6
+	.4byte	0x13c6e
 	.uleb128 0x4e
 	.8byte	.LVL95
-	.4byte	0x13cd2
+	.4byte	0x13c7a
 	.byte	0
 	.byte	0
-	.uleb128 0x58
-	.4byte	0x12e15
-	.8byte	.LBB914
+	.uleb128 0x5a
+	.4byte	0x12dd7
+	.8byte	.LBB918
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
 	.2byte	0x5f7
-	.4byte	0x1061f
+	.4byte	0x1065d
 	.uleb128 0x54
-	.4byte	0x12e3a
+	.4byte	0x12dfc
 	.uleb128 0x54
-	.4byte	0x12e2f
+	.4byte	0x12df1
 	.uleb128 0x54
-	.4byte	0x12e25
+	.4byte	0x12de7
 	.uleb128 0x6d
-	.4byte	0x12e73
-	.8byte	.LBB915
+	.4byte	0x12e35
+	.8byte	.LBB919
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x12e5a
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x12e4f
 	.uleb128 0x54
-	.4byte	0x12e83
+	.4byte	0x12e45
 	.uleb128 0x6e
-	.4byte	0x12f10
-	.8byte	.LBB917
+	.4byte	0x12ed2
+	.8byte	.LBB921
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10555
+	.4byte	0x10593
 	.uleb128 0x54
-	.4byte	0x12f2b
+	.4byte	0x12eed
 	.uleb128 0x6f
-	.4byte	0x12f20
+	.4byte	0x12ee2
 	.4byte	.LLST15
-	.uleb128 0x5b
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x80
 	.uleb128 0x5f
-	.4byte	0x12f36
+	.4byte	0x12ef8
 	.4byte	.LLST16
 	.uleb128 0x5f
-	.4byte	0x12f41
+	.4byte	0x12f03
 	.4byte	.LLST17
 	.uleb128 0x70
-	.4byte	0x13364
-	.8byte	.LBB919
-	.8byte	.LBE919-.LBB919
+	.4byte	0x13326
+	.8byte	.LBB923
+	.8byte	.LBE923-.LBB923
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x104bb
-	.uleb128 0x5e
-	.8byte	.LBB920
-	.8byte	.LBE920-.LBB920
+	.4byte	0x104f9
+	.uleb128 0x56
+	.8byte	.LBB924
+	.8byte	.LBE924-.LBB924
 	.uleb128 0x5f
-	.4byte	0x13374
+	.4byte	0x13336
 	.4byte	.LLST18
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13338
-	.8byte	.LBB921
-	.8byte	.LBE921-.LBB921
+	.4byte	0x132fa
+	.8byte	.LBB925
+	.8byte	.LBE925-.LBB925
 	.byte	0x6
 	.byte	0x55
-	.4byte	0x10503
+	.4byte	0x10541
 	.uleb128 0x54
-	.4byte	0x13352
+	.4byte	0x13314
 	.uleb128 0x54
-	.4byte	0x13348
-	.uleb128 0x59
-	.4byte	0x1341a
-	.8byte	.LBB922
-	.8byte	.LBE922-.LBB922
+	.4byte	0x1330a
+	.uleb128 0x5b
+	.4byte	0x133dc
+	.8byte	.LBB926
+	.8byte	.LBE926-.LBB926
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x13434
+	.4byte	0x133f6
 	.uleb128 0x54
-	.4byte	0x1342a
+	.4byte	0x133ec
 	.byte	0
 	.byte	0
-	.uleb128 0x5e
-	.8byte	.LBB924
-	.8byte	.LBE924-.LBB924
-	.uleb128 0x5c
-	.4byte	0x12f4d
-	.uleb128 0x59
-	.4byte	0x133e8
-	.8byte	.LBB925
-	.8byte	.LBE925-.LBB925
+	.uleb128 0x56
+	.8byte	.LBB928
+	.8byte	.LBE928-.LBB928
+	.uleb128 0x57
+	.4byte	0x12f0f
+	.uleb128 0x5b
+	.4byte	0x133aa
+	.8byte	.LBB929
+	.8byte	.LBE929-.LBB929
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13403
+	.4byte	0x133c5
 	.uleb128 0x54
-	.4byte	0x133f8
-	.uleb128 0x5e
-	.8byte	.LBB926
-	.8byte	.LBE926-.LBB926
-	.uleb128 0x5c
-	.4byte	0x1340e
+	.4byte	0x133ba
+	.uleb128 0x56
+	.8byte	.LBB930
+	.8byte	.LBE930-.LBB930
+	.uleb128 0x57
+	.4byte	0x133d0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12edc
-	.8byte	.LBB931
-	.8byte	.LBE931-.LBB931
+	.4byte	0x12e9e
+	.8byte	.LBB935
+	.8byte	.LBE935-.LBB935
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x10610
+	.4byte	0x1064e
 	.uleb128 0x54
-	.4byte	0x12eec
-	.uleb128 0x5e
-	.8byte	.LBB932
-	.8byte	.LBE932-.LBB932
+	.4byte	0x12eae
+	.uleb128 0x56
+	.8byte	.LBB936
+	.8byte	.LBE936-.LBB936
 	.uleb128 0x5f
-	.4byte	0x12ef7
+	.4byte	0x12eb9
 	.4byte	.LLST19
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xc0
-	.4byte	0x105db
+	.4byte	0x10619
 	.uleb128 0x5f
-	.4byte	0x12f03
+	.4byte	0x12ec5
 	.4byte	.LLST20
-	.uleb128 0x59
-	.4byte	0x133e8
-	.8byte	.LBB934
-	.8byte	.LBE934-.LBB934
+	.uleb128 0x5b
+	.4byte	0x133aa
+	.8byte	.LBB938
+	.8byte	.LBE938-.LBB938
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13403
+	.4byte	0x133c5
 	.uleb128 0x54
-	.4byte	0x133f8
-	.uleb128 0x5e
-	.8byte	.LBB935
-	.8byte	.LBE935-.LBB935
-	.uleb128 0x5c
-	.4byte	0x1340e
+	.4byte	0x133ba
+	.uleb128 0x56
+	.8byte	.LBB939
+	.8byte	.LBE939-.LBB939
+	.uleb128 0x57
+	.4byte	0x133d0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x59
-	.4byte	0x13364
-	.8byte	.LBB936
-	.8byte	.LBE936-.LBB936
+	.uleb128 0x5b
+	.4byte	0x13326
+	.8byte	.LBB940
+	.8byte	.LBE940-.LBB940
 	.byte	0x6
 	.byte	0xfd
-	.uleb128 0x5e
-	.8byte	.LBB937
-	.8byte	.LBE937-.LBB937
+	.uleb128 0x56
+	.8byte	.LBB941
+	.8byte	.LBE941-.LBB941
 	.uleb128 0x5f
-	.4byte	0x13374
+	.4byte	0x13336
 	.4byte	.LLST21
 	.byte	0
 	.byte	0
@@ -39565,171 +39578,171 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL121
-	.4byte	0x13cdf
+	.4byte	0x13c87
 	.byte	0
 	.byte	0
-	.uleb128 0x58
-	.4byte	0x12e44
-	.8byte	.LBB947
+	.uleb128 0x5a
+	.4byte	0x12e06
+	.8byte	.LBB951
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
 	.2byte	0x57a
-	.4byte	0x1084a
+	.4byte	0x10888
 	.uleb128 0x54
-	.4byte	0x12e69
+	.4byte	0x12e2b
 	.uleb128 0x54
-	.4byte	0x12e5e
+	.4byte	0x12e20
 	.uleb128 0x54
-	.4byte	0x12e54
+	.4byte	0x12e16
 	.uleb128 0x6d
-	.4byte	0x12ea2
-	.8byte	.LBB948
+	.4byte	0x12e64
+	.8byte	.LBB952
 	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x12ec7
+	.4byte	0x12e89
 	.uleb128 0x54
-	.4byte	0x12ebc
+	.4byte	0x12e7e
 	.uleb128 0x54
-	.4byte	0x12eb2
-	.uleb128 0x5b
+	.4byte	0x12e74
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xf0
-	.uleb128 0x5c
-	.4byte	0x12ed0
+	.uleb128 0x57
+	.4byte	0x12e92
 	.uleb128 0x6e
-	.4byte	0x12f10
-	.8byte	.LBB950
+	.4byte	0x12ed2
+	.8byte	.LBB954
 	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x1077f
+	.4byte	0x107bd
 	.uleb128 0x54
-	.4byte	0x12f2b
+	.4byte	0x12eed
 	.uleb128 0x6f
-	.4byte	0x12f20
+	.4byte	0x12ee2
 	.4byte	.LLST22
-	.uleb128 0x5b
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x130
 	.uleb128 0x5f
-	.4byte	0x12f36
+	.4byte	0x12ef8
 	.4byte	.LLST23
 	.uleb128 0x5f
-	.4byte	0x12f41
+	.4byte	0x12f03
 	.4byte	.LLST24
 	.uleb128 0x70
-	.4byte	0x13364
-	.8byte	.LBB952
-	.8byte	.LBE952-.LBB952
+	.4byte	0x13326
+	.8byte	.LBB956
+	.8byte	.LBE956-.LBB956
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x106e5
-	.uleb128 0x5e
-	.8byte	.LBB953
-	.8byte	.LBE953-.LBB953
+	.4byte	0x10723
+	.uleb128 0x56
+	.8byte	.LBB957
+	.8byte	.LBE957-.LBB957
 	.uleb128 0x5f
-	.4byte	0x13374
+	.4byte	0x13336
 	.4byte	.LLST25
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB954
-	.8byte	.LBE954-.LBB954
-	.4byte	0x10739
-	.uleb128 0x5c
-	.4byte	0x12f4d
-	.uleb128 0x59
-	.4byte	0x133e8
-	.8byte	.LBB955
-	.8byte	.LBE955-.LBB955
+	.8byte	.LBB958
+	.8byte	.LBE958-.LBB958
+	.4byte	0x10777
+	.uleb128 0x57
+	.4byte	0x12f0f
+	.uleb128 0x5b
+	.4byte	0x133aa
+	.8byte	.LBB959
+	.8byte	.LBE959-.LBB959
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13403
+	.4byte	0x133c5
 	.uleb128 0x54
-	.4byte	0x133f8
-	.uleb128 0x5e
-	.8byte	.LBB956
-	.8byte	.LBE956-.LBB956
-	.uleb128 0x5c
-	.4byte	0x1340e
+	.4byte	0x133ba
+	.uleb128 0x56
+	.8byte	.LBB960
+	.8byte	.LBE960-.LBB960
+	.uleb128 0x57
+	.4byte	0x133d0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x59
-	.4byte	0x13338
-	.8byte	.LBB957
-	.8byte	.LBE957-.LBB957
+	.uleb128 0x5b
+	.4byte	0x132fa
+	.8byte	.LBB961
+	.8byte	.LBE961-.LBB961
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13352
+	.4byte	0x13314
 	.uleb128 0x54
-	.4byte	0x13348
-	.uleb128 0x59
-	.4byte	0x1341a
-	.8byte	.LBB958
-	.8byte	.LBE958-.LBB958
+	.4byte	0x1330a
+	.uleb128 0x5b
+	.4byte	0x133dc
+	.8byte	.LBB962
+	.8byte	.LBE962-.LBB962
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x13434
+	.4byte	0x133f6
 	.uleb128 0x54
-	.4byte	0x1342a
+	.4byte	0x133ec
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12edc
-	.8byte	.LBB962
-	.8byte	.LBE962-.LBB962
+	.4byte	0x12e9e
+	.8byte	.LBB966
+	.8byte	.LBE966-.LBB966
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x1083a
+	.4byte	0x10878
 	.uleb128 0x54
-	.4byte	0x12eec
-	.uleb128 0x5e
-	.8byte	.LBB963
-	.8byte	.LBE963-.LBB963
+	.4byte	0x12eae
+	.uleb128 0x56
+	.8byte	.LBB967
+	.8byte	.LBE967-.LBB967
 	.uleb128 0x5f
-	.4byte	0x12ef7
+	.4byte	0x12eb9
 	.4byte	.LLST26
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x170
-	.4byte	0x10805
+	.4byte	0x10843
 	.uleb128 0x5f
-	.4byte	0x12f03
+	.4byte	0x12ec5
 	.4byte	.LLST27
-	.uleb128 0x59
-	.4byte	0x133e8
-	.8byte	.LBB965
-	.8byte	.LBE965-.LBB965
+	.uleb128 0x5b
+	.4byte	0x133aa
+	.8byte	.LBB969
+	.8byte	.LBE969-.LBB969
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13403
+	.4byte	0x133c5
 	.uleb128 0x54
-	.4byte	0x133f8
-	.uleb128 0x5e
-	.8byte	.LBB966
-	.8byte	.LBE966-.LBB966
-	.uleb128 0x5c
-	.4byte	0x1340e
+	.4byte	0x133ba
+	.uleb128 0x56
+	.8byte	.LBB970
+	.8byte	.LBE970-.LBB970
+	.uleb128 0x57
+	.4byte	0x133d0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x59
-	.4byte	0x13364
-	.8byte	.LBB967
-	.8byte	.LBE967-.LBB967
+	.uleb128 0x5b
+	.4byte	0x13326
+	.8byte	.LBB971
+	.8byte	.LBE971-.LBB971
 	.byte	0x6
 	.byte	0xfd
-	.uleb128 0x5e
-	.8byte	.LBB968
-	.8byte	.LBE968-.LBB968
+	.uleb128 0x56
+	.8byte	.LBB972
+	.8byte	.LBE972-.LBB972
 	.uleb128 0x5f
-	.4byte	0x13374
+	.4byte	0x13336
 	.4byte	.LLST28
 	.byte	0
 	.byte	0
@@ -39737,172 +39750,172 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL86
-	.4byte	0x13cec
+	.4byte	0x13c94
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x58
-	.4byte	0x12e44
-	.8byte	.LBB982
+	.uleb128 0x5a
+	.4byte	0x12e06
+	.8byte	.LBB986
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
 	.2byte	0x596
-	.4byte	0x10a75
+	.4byte	0x10ab3
 	.uleb128 0x54
-	.4byte	0x12e69
+	.4byte	0x12e2b
 	.uleb128 0x54
-	.4byte	0x12e5e
+	.4byte	0x12e20
 	.uleb128 0x54
-	.4byte	0x12e54
+	.4byte	0x12e16
 	.uleb128 0x6d
-	.4byte	0x12ea2
-	.8byte	.LBB983
+	.4byte	0x12e64
+	.8byte	.LBB987
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x12ec7
+	.4byte	0x12e89
 	.uleb128 0x54
-	.4byte	0x12ebc
+	.4byte	0x12e7e
 	.uleb128 0x54
-	.4byte	0x12eb2
-	.uleb128 0x5b
+	.4byte	0x12e74
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x1f0
-	.uleb128 0x5c
-	.4byte	0x12ed0
+	.uleb128 0x57
+	.4byte	0x12e92
 	.uleb128 0x6e
-	.4byte	0x12f10
-	.8byte	.LBB985
+	.4byte	0x12ed2
+	.8byte	.LBB989
 	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x109aa
+	.4byte	0x109e8
 	.uleb128 0x54
-	.4byte	0x12f2b
+	.4byte	0x12eed
 	.uleb128 0x6f
-	.4byte	0x12f20
+	.4byte	0x12ee2
 	.4byte	.LLST30
-	.uleb128 0x5b
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x230
 	.uleb128 0x5f
-	.4byte	0x12f36
+	.4byte	0x12ef8
 	.4byte	.LLST31
 	.uleb128 0x5f
-	.4byte	0x12f41
+	.4byte	0x12f03
 	.4byte	.LLST32
 	.uleb128 0x70
-	.4byte	0x13364
-	.8byte	.LBB987
-	.8byte	.LBE987-.LBB987
+	.4byte	0x13326
+	.8byte	.LBB991
+	.8byte	.LBE991-.LBB991
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10910
-	.uleb128 0x5e
-	.8byte	.LBB988
-	.8byte	.LBE988-.LBB988
+	.4byte	0x1094e
+	.uleb128 0x56
+	.8byte	.LBB992
+	.8byte	.LBE992-.LBB992
 	.uleb128 0x5f
-	.4byte	0x13374
+	.4byte	0x13336
 	.4byte	.LLST33
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB989
-	.8byte	.LBE989-.LBB989
-	.4byte	0x10964
-	.uleb128 0x5c
-	.4byte	0x12f4d
-	.uleb128 0x59
-	.4byte	0x133e8
-	.8byte	.LBB990
-	.8byte	.LBE990-.LBB990
+	.8byte	.LBB993
+	.8byte	.LBE993-.LBB993
+	.4byte	0x109a2
+	.uleb128 0x57
+	.4byte	0x12f0f
+	.uleb128 0x5b
+	.4byte	0x133aa
+	.8byte	.LBB994
+	.8byte	.LBE994-.LBB994
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13403
+	.4byte	0x133c5
 	.uleb128 0x54
-	.4byte	0x133f8
-	.uleb128 0x5e
-	.8byte	.LBB991
-	.8byte	.LBE991-.LBB991
-	.uleb128 0x5c
-	.4byte	0x1340e
+	.4byte	0x133ba
+	.uleb128 0x56
+	.8byte	.LBB995
+	.8byte	.LBE995-.LBB995
+	.uleb128 0x57
+	.4byte	0x133d0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x59
-	.4byte	0x13338
-	.8byte	.LBB992
-	.8byte	.LBE992-.LBB992
+	.uleb128 0x5b
+	.4byte	0x132fa
+	.8byte	.LBB996
+	.8byte	.LBE996-.LBB996
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13352
+	.4byte	0x13314
 	.uleb128 0x54
-	.4byte	0x13348
-	.uleb128 0x59
-	.4byte	0x1341a
-	.8byte	.LBB993
-	.8byte	.LBE993-.LBB993
+	.4byte	0x1330a
+	.uleb128 0x5b
+	.4byte	0x133dc
+	.8byte	.LBB997
+	.8byte	.LBE997-.LBB997
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x13434
+	.4byte	0x133f6
 	.uleb128 0x54
-	.4byte	0x1342a
+	.4byte	0x133ec
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12edc
-	.8byte	.LBB997
-	.8byte	.LBE997-.LBB997
+	.4byte	0x12e9e
+	.8byte	.LBB1001
+	.8byte	.LBE1001-.LBB1001
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10a65
+	.4byte	0x10aa3
 	.uleb128 0x54
-	.4byte	0x12eec
-	.uleb128 0x5e
-	.8byte	.LBB998
-	.8byte	.LBE998-.LBB998
+	.4byte	0x12eae
+	.uleb128 0x56
+	.8byte	.LBB1002
+	.8byte	.LBE1002-.LBB1002
 	.uleb128 0x5f
-	.4byte	0x12ef7
+	.4byte	0x12eb9
 	.4byte	.LLST34
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x270
-	.4byte	0x10a30
+	.4byte	0x10a6e
 	.uleb128 0x5f
-	.4byte	0x12f03
+	.4byte	0x12ec5
 	.4byte	.LLST35
-	.uleb128 0x59
-	.4byte	0x133e8
-	.8byte	.LBB1000
-	.8byte	.LBE1000-.LBB1000
+	.uleb128 0x5b
+	.4byte	0x133aa
+	.8byte	.LBB1004
+	.8byte	.LBE1004-.LBB1004
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13403
+	.4byte	0x133c5
 	.uleb128 0x54
-	.4byte	0x133f8
-	.uleb128 0x5e
-	.8byte	.LBB1001
-	.8byte	.LBE1001-.LBB1001
-	.uleb128 0x5c
-	.4byte	0x1340e
+	.4byte	0x133ba
+	.uleb128 0x56
+	.8byte	.LBB1005
+	.8byte	.LBE1005-.LBB1005
+	.uleb128 0x57
+	.4byte	0x133d0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x59
-	.4byte	0x13364
-	.8byte	.LBB1002
-	.8byte	.LBE1002-.LBB1002
+	.uleb128 0x5b
+	.4byte	0x13326
+	.8byte	.LBB1006
+	.8byte	.LBE1006-.LBB1006
 	.byte	0x6
 	.byte	0xfd
-	.uleb128 0x5e
-	.8byte	.LBB1003
-	.8byte	.LBE1003-.LBB1003
+	.uleb128 0x56
+	.8byte	.LBB1007
+	.8byte	.LBE1007-.LBB1007
 	.uleb128 0x5f
-	.4byte	0x13374
+	.4byte	0x13336
 	.4byte	.LLST36
 	.byte	0
 	.byte	0
@@ -39910,168 +39923,168 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL110
-	.4byte	0x13cec
+	.4byte	0x13c94
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x58
-	.4byte	0x12e15
-	.8byte	.LBB1012
+	.uleb128 0x5a
+	.4byte	0x12dd7
+	.8byte	.LBB1016
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
 	.2byte	0x564
-	.4byte	0x10c95
+	.4byte	0x10cd3
 	.uleb128 0x54
-	.4byte	0x12e3a
+	.4byte	0x12dfc
 	.uleb128 0x54
-	.4byte	0x12e2f
+	.4byte	0x12df1
 	.uleb128 0x54
-	.4byte	0x12e25
+	.4byte	0x12de7
 	.uleb128 0x6d
-	.4byte	0x12e73
-	.8byte	.LBB1013
+	.4byte	0x12e35
+	.8byte	.LBB1017
 	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x12e5a
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x12e4f
 	.uleb128 0x54
-	.4byte	0x12e83
+	.4byte	0x12e45
 	.uleb128 0x6e
-	.4byte	0x12f10
-	.8byte	.LBB1015
+	.4byte	0x12ed2
+	.8byte	.LBB1019
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10bcb
+	.4byte	0x10c09
 	.uleb128 0x54
-	.4byte	0x12f2b
+	.4byte	0x12eed
 	.uleb128 0x6f
-	.4byte	0x12f20
+	.4byte	0x12ee2
 	.4byte	.LLST37
-	.uleb128 0x5b
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x2f0
 	.uleb128 0x5f
-	.4byte	0x12f36
+	.4byte	0x12ef8
 	.4byte	.LLST38
 	.uleb128 0x5f
-	.4byte	0x12f41
+	.4byte	0x12f03
 	.4byte	.LLST39
 	.uleb128 0x70
-	.4byte	0x13364
-	.8byte	.LBB1017
-	.8byte	.LBE1017-.LBB1017
+	.4byte	0x13326
+	.8byte	.LBB1021
+	.8byte	.LBE1021-.LBB1021
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10b31
-	.uleb128 0x5e
-	.8byte	.LBB1018
-	.8byte	.LBE1018-.LBB1018
+	.4byte	0x10b6f
+	.uleb128 0x56
+	.8byte	.LBB1022
+	.8byte	.LBE1022-.LBB1022
 	.uleb128 0x5f
-	.4byte	0x13374
+	.4byte	0x13336
 	.4byte	.LLST40
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1019
-	.8byte	.LBE1019-.LBB1019
-	.4byte	0x10b85
-	.uleb128 0x5c
-	.4byte	0x12f4d
-	.uleb128 0x59
-	.4byte	0x133e8
-	.8byte	.LBB1020
-	.8byte	.LBE1020-.LBB1020
+	.8byte	.LBB1023
+	.8byte	.LBE1023-.LBB1023
+	.4byte	0x10bc3
+	.uleb128 0x57
+	.4byte	0x12f0f
+	.uleb128 0x5b
+	.4byte	0x133aa
+	.8byte	.LBB1024
+	.8byte	.LBE1024-.LBB1024
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13403
+	.4byte	0x133c5
 	.uleb128 0x54
-	.4byte	0x133f8
-	.uleb128 0x5e
-	.8byte	.LBB1021
-	.8byte	.LBE1021-.LBB1021
-	.uleb128 0x5c
-	.4byte	0x1340e
+	.4byte	0x133ba
+	.uleb128 0x56
+	.8byte	.LBB1025
+	.8byte	.LBE1025-.LBB1025
+	.uleb128 0x57
+	.4byte	0x133d0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x59
-	.4byte	0x13338
-	.8byte	.LBB1022
-	.8byte	.LBE1022-.LBB1022
+	.uleb128 0x5b
+	.4byte	0x132fa
+	.8byte	.LBB1026
+	.8byte	.LBE1026-.LBB1026
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13352
+	.4byte	0x13314
 	.uleb128 0x54
-	.4byte	0x13348
-	.uleb128 0x59
-	.4byte	0x1341a
-	.8byte	.LBB1023
-	.8byte	.LBE1023-.LBB1023
+	.4byte	0x1330a
+	.uleb128 0x5b
+	.4byte	0x133dc
+	.8byte	.LBB1027
+	.8byte	.LBE1027-.LBB1027
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x13434
+	.4byte	0x133f6
 	.uleb128 0x54
-	.4byte	0x1342a
+	.4byte	0x133ec
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12edc
-	.8byte	.LBB1029
-	.8byte	.LBE1029-.LBB1029
+	.4byte	0x12e9e
+	.8byte	.LBB1033
+	.8byte	.LBE1033-.LBB1033
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x10c86
+	.4byte	0x10cc4
 	.uleb128 0x54
-	.4byte	0x12eec
-	.uleb128 0x5e
-	.8byte	.LBB1030
-	.8byte	.LBE1030-.LBB1030
+	.4byte	0x12eae
+	.uleb128 0x56
+	.8byte	.LBB1034
+	.8byte	.LBE1034-.LBB1034
 	.uleb128 0x5f
-	.4byte	0x12ef7
+	.4byte	0x12eb9
 	.4byte	.LLST41
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x340
-	.4byte	0x10c51
+	.4byte	0x10c8f
 	.uleb128 0x5f
-	.4byte	0x12f03
+	.4byte	0x12ec5
 	.4byte	.LLST42
-	.uleb128 0x59
-	.4byte	0x133e8
-	.8byte	.LBB1032
-	.8byte	.LBE1032-.LBB1032
+	.uleb128 0x5b
+	.4byte	0x133aa
+	.8byte	.LBB1036
+	.8byte	.LBE1036-.LBB1036
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13403
+	.4byte	0x133c5
 	.uleb128 0x54
-	.4byte	0x133f8
-	.uleb128 0x5e
-	.8byte	.LBB1033
-	.8byte	.LBE1033-.LBB1033
-	.uleb128 0x5c
-	.4byte	0x1340e
+	.4byte	0x133ba
+	.uleb128 0x56
+	.8byte	.LBB1037
+	.8byte	.LBE1037-.LBB1037
+	.uleb128 0x57
+	.4byte	0x133d0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x59
-	.4byte	0x13364
-	.8byte	.LBB1034
-	.8byte	.LBE1034-.LBB1034
+	.uleb128 0x5b
+	.4byte	0x13326
+	.8byte	.LBB1038
+	.8byte	.LBE1038-.LBB1038
 	.byte	0x6
 	.byte	0xfd
-	.uleb128 0x5e
-	.8byte	.LBB1035
-	.8byte	.LBE1035-.LBB1035
+	.uleb128 0x56
+	.8byte	.LBB1039
+	.8byte	.LBE1039-.LBB1039
 	.uleb128 0x5f
-	.4byte	0x13374
+	.4byte	0x13336
 	.4byte	.LLST43
 	.byte	0
 	.byte	0
@@ -40079,172 +40092,172 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL137
-	.4byte	0x13cdf
+	.4byte	0x13c87
 	.byte	0
 	.byte	0
-	.uleb128 0x58
-	.4byte	0x12e44
-	.8byte	.LBB1046
+	.uleb128 0x5a
+	.4byte	0x12e06
+	.8byte	.LBB1050
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
 	.2byte	0x5b3
-	.4byte	0x10ed1
+	.4byte	0x10f0f
 	.uleb128 0x54
-	.4byte	0x12e69
+	.4byte	0x12e2b
 	.uleb128 0x54
-	.4byte	0x12e5e
+	.4byte	0x12e20
 	.uleb128 0x54
-	.4byte	0x12e54
+	.4byte	0x12e16
 	.uleb128 0x6d
-	.4byte	0x12ea2
-	.8byte	.LBB1047
+	.4byte	0x12e64
+	.8byte	.LBB1051
 	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x12ec7
+	.4byte	0x12e89
 	.uleb128 0x54
-	.4byte	0x12ebc
+	.4byte	0x12e7e
 	.uleb128 0x54
-	.4byte	0x12eb2
-	.uleb128 0x5b
+	.4byte	0x12e74
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x370
 	.uleb128 0x5f
-	.4byte	0x12ed0
+	.4byte	0x12e92
 	.4byte	.LLST44
 	.uleb128 0x6e
-	.4byte	0x12f10
-	.8byte	.LBB1049
+	.4byte	0x12ed2
+	.8byte	.LBB1053
 	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x10df9
+	.4byte	0x10e37
 	.uleb128 0x54
-	.4byte	0x12f2b
+	.4byte	0x12eed
 	.uleb128 0x6f
-	.4byte	0x12f20
+	.4byte	0x12ee2
 	.4byte	.LLST45
-	.uleb128 0x5b
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x5f
-	.4byte	0x12f36
+	.4byte	0x12ef8
 	.4byte	.LLST46
 	.uleb128 0x5f
-	.4byte	0x12f41
+	.4byte	0x12f03
 	.4byte	.LLST47
 	.uleb128 0x70
-	.4byte	0x13364
-	.8byte	.LBB1051
-	.8byte	.LBE1051-.LBB1051
+	.4byte	0x13326
+	.8byte	.LBB1055
+	.8byte	.LBE1055-.LBB1055
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10d5f
-	.uleb128 0x5e
-	.8byte	.LBB1052
-	.8byte	.LBE1052-.LBB1052
+	.4byte	0x10d9d
+	.uleb128 0x56
+	.8byte	.LBB1056
+	.8byte	.LBE1056-.LBB1056
 	.uleb128 0x5f
-	.4byte	0x13374
+	.4byte	0x13336
 	.4byte	.LLST48
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1053
-	.8byte	.LBE1053-.LBB1053
-	.4byte	0x10db3
-	.uleb128 0x5c
-	.4byte	0x12f4d
-	.uleb128 0x59
-	.4byte	0x133e8
-	.8byte	.LBB1054
-	.8byte	.LBE1054-.LBB1054
+	.8byte	.LBB1057
+	.8byte	.LBE1057-.LBB1057
+	.4byte	0x10df1
+	.uleb128 0x57
+	.4byte	0x12f0f
+	.uleb128 0x5b
+	.4byte	0x133aa
+	.8byte	.LBB1058
+	.8byte	.LBE1058-.LBB1058
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13403
+	.4byte	0x133c5
 	.uleb128 0x54
-	.4byte	0x133f8
-	.uleb128 0x5e
-	.8byte	.LBB1055
-	.8byte	.LBE1055-.LBB1055
-	.uleb128 0x5c
-	.4byte	0x1340e
+	.4byte	0x133ba
+	.uleb128 0x56
+	.8byte	.LBB1059
+	.8byte	.LBE1059-.LBB1059
+	.uleb128 0x57
+	.4byte	0x133d0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x59
-	.4byte	0x13338
-	.8byte	.LBB1056
-	.8byte	.LBE1056-.LBB1056
+	.uleb128 0x5b
+	.4byte	0x132fa
+	.8byte	.LBB1060
+	.8byte	.LBE1060-.LBB1060
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13352
+	.4byte	0x13314
 	.uleb128 0x54
-	.4byte	0x13348
-	.uleb128 0x59
-	.4byte	0x1341a
-	.8byte	.LBB1057
-	.8byte	.LBE1057-.LBB1057
+	.4byte	0x1330a
+	.uleb128 0x5b
+	.4byte	0x133dc
+	.8byte	.LBB1061
+	.8byte	.LBE1061-.LBB1061
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x13434
+	.4byte	0x133f6
 	.uleb128 0x54
-	.4byte	0x1342a
+	.4byte	0x133ec
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12edc
-	.8byte	.LBB1063
-	.8byte	.LBE1063-.LBB1063
+	.4byte	0x12e9e
+	.8byte	.LBB1067
+	.8byte	.LBE1067-.LBB1067
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10eb4
+	.4byte	0x10ef2
 	.uleb128 0x54
-	.4byte	0x12eec
-	.uleb128 0x5e
-	.8byte	.LBB1064
-	.8byte	.LBE1064-.LBB1064
+	.4byte	0x12eae
+	.uleb128 0x56
+	.8byte	.LBB1068
+	.8byte	.LBE1068-.LBB1068
 	.uleb128 0x5f
-	.4byte	0x12ef7
+	.4byte	0x12eb9
 	.4byte	.LLST49
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x420
-	.4byte	0x10e7f
+	.4byte	0x10ebd
 	.uleb128 0x5f
-	.4byte	0x12f03
+	.4byte	0x12ec5
 	.4byte	.LLST50
-	.uleb128 0x59
-	.4byte	0x133e8
-	.8byte	.LBB1066
-	.8byte	.LBE1066-.LBB1066
+	.uleb128 0x5b
+	.4byte	0x133aa
+	.8byte	.LBB1070
+	.8byte	.LBE1070-.LBB1070
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13403
+	.4byte	0x133c5
 	.uleb128 0x54
-	.4byte	0x133f8
-	.uleb128 0x5e
-	.8byte	.LBB1067
-	.8byte	.LBE1067-.LBB1067
-	.uleb128 0x5c
-	.4byte	0x1340e
+	.4byte	0x133ba
+	.uleb128 0x56
+	.8byte	.LBB1071
+	.8byte	.LBE1071-.LBB1071
+	.uleb128 0x57
+	.4byte	0x133d0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x59
-	.4byte	0x13364
-	.8byte	.LBB1068
-	.8byte	.LBE1068-.LBB1068
+	.uleb128 0x5b
+	.4byte	0x13326
+	.8byte	.LBB1072
+	.8byte	.LBE1072-.LBB1072
 	.byte	0x6
 	.byte	0xfd
-	.uleb128 0x5e
-	.8byte	.LBB1069
-	.8byte	.LBE1069-.LBB1069
+	.uleb128 0x56
+	.8byte	.LBB1073
+	.8byte	.LBE1073-.LBB1073
 	.uleb128 0x5f
-	.4byte	0x13374
+	.4byte	0x13336
 	.4byte	.LLST51
 	.byte	0
 	.byte	0
@@ -40252,68 +40265,68 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL149
-	.4byte	0x13cec
+	.4byte	0x13c94
 	.uleb128 0x4e
 	.8byte	.LVL227
-	.4byte	0x13b35
+	.4byte	0x13add
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x58
-	.4byte	0x12e15
-	.8byte	.LBB1082
+	.uleb128 0x5a
+	.4byte	0x12dd7
+	.8byte	.LBB1086
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
 	.2byte	0x5d0
-	.4byte	0x10f83
+	.4byte	0x10fc1
 	.uleb128 0x54
-	.4byte	0x12e3a
+	.4byte	0x12dfc
 	.uleb128 0x54
-	.4byte	0x12e2f
+	.4byte	0x12df1
 	.uleb128 0x54
-	.4byte	0x12e25
+	.4byte	0x12de7
 	.uleb128 0x6d
-	.4byte	0x12e73
-	.8byte	.LBB1083
+	.4byte	0x12e35
+	.8byte	.LBB1087
 	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x12e5a
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x12e4f
 	.uleb128 0x54
-	.4byte	0x12e83
+	.4byte	0x12e45
 	.uleb128 0x6d
-	.4byte	0x12f10
-	.8byte	.LBB1085
+	.4byte	0x12ed2
+	.8byte	.LBB1089
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x54
-	.4byte	0x12f2b
+	.4byte	0x12eed
 	.uleb128 0x71
-	.4byte	0x12f20
+	.4byte	0x12ee2
 	.uleb128 0x1
 	.byte	0x50
-	.uleb128 0x5b
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x4b0
-	.uleb128 0x5c
-	.4byte	0x12f36
+	.uleb128 0x57
+	.4byte	0x12ef8
 	.uleb128 0x5f
-	.4byte	0x12f41
+	.4byte	0x12f03
 	.4byte	.LLST52
-	.uleb128 0x59
-	.4byte	0x13364
-	.8byte	.LBB1087
-	.8byte	.LBE1087-.LBB1087
+	.uleb128 0x5b
+	.4byte	0x13326
+	.8byte	.LBB1091
+	.8byte	.LBE1091-.LBB1091
 	.byte	0x6
 	.byte	0x4d
-	.uleb128 0x5e
-	.8byte	.LBB1088
-	.8byte	.LBE1088-.LBB1088
+	.uleb128 0x56
+	.8byte	.LBB1092
+	.8byte	.LBE1092-.LBB1092
 	.uleb128 0x5f
-	.4byte	0x13374
+	.4byte	0x13336
 	.4byte	.LLST53
 	.byte	0
 	.byte	0
@@ -40321,164 +40334,164 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x58
-	.4byte	0x12e15
-	.8byte	.LBB1094
+	.uleb128 0x5a
+	.4byte	0x12dd7
+	.8byte	.LBB1098
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
 	.2byte	0x5c0
-	.4byte	0x111a3
+	.4byte	0x111e1
 	.uleb128 0x54
-	.4byte	0x12e3a
+	.4byte	0x12dfc
 	.uleb128 0x54
-	.4byte	0x12e2f
+	.4byte	0x12df1
 	.uleb128 0x54
-	.4byte	0x12e25
+	.4byte	0x12de7
 	.uleb128 0x6d
-	.4byte	0x12e73
-	.8byte	.LBB1095
+	.4byte	0x12e35
+	.8byte	.LBB1099
 	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x12e5a
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x12e4f
 	.uleb128 0x54
-	.4byte	0x12e83
+	.4byte	0x12e45
 	.uleb128 0x6e
-	.4byte	0x12f10
-	.8byte	.LBB1097
+	.4byte	0x12ed2
+	.8byte	.LBB1101
 	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x110d9
+	.4byte	0x11117
 	.uleb128 0x54
-	.4byte	0x12f2b
+	.4byte	0x12eed
 	.uleb128 0x6f
-	.4byte	0x12f20
+	.4byte	0x12ee2
 	.4byte	.LLST54
-	.uleb128 0x5b
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x540
 	.uleb128 0x5f
-	.4byte	0x12f36
+	.4byte	0x12ef8
 	.4byte	.LLST55
 	.uleb128 0x5f
-	.4byte	0x12f41
+	.4byte	0x12f03
 	.4byte	.LLST56
 	.uleb128 0x70
-	.4byte	0x13364
-	.8byte	.LBB1099
-	.8byte	.LBE1099-.LBB1099
+	.4byte	0x13326
+	.8byte	.LBB1103
+	.8byte	.LBE1103-.LBB1103
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x1103f
-	.uleb128 0x5e
-	.8byte	.LBB1100
-	.8byte	.LBE1100-.LBB1100
+	.4byte	0x1107d
+	.uleb128 0x56
+	.8byte	.LBB1104
+	.8byte	.LBE1104-.LBB1104
 	.uleb128 0x5f
-	.4byte	0x13374
+	.4byte	0x13336
 	.4byte	.LLST57
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1101
-	.8byte	.LBE1101-.LBB1101
-	.4byte	0x11093
-	.uleb128 0x5c
-	.4byte	0x12f4d
-	.uleb128 0x59
-	.4byte	0x133e8
-	.8byte	.LBB1102
-	.8byte	.LBE1102-.LBB1102
+	.8byte	.LBB1105
+	.8byte	.LBE1105-.LBB1105
+	.4byte	0x110d1
+	.uleb128 0x57
+	.4byte	0x12f0f
+	.uleb128 0x5b
+	.4byte	0x133aa
+	.8byte	.LBB1106
+	.8byte	.LBE1106-.LBB1106
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13403
+	.4byte	0x133c5
 	.uleb128 0x54
-	.4byte	0x133f8
-	.uleb128 0x5e
-	.8byte	.LBB1103
-	.8byte	.LBE1103-.LBB1103
-	.uleb128 0x5c
-	.4byte	0x1340e
+	.4byte	0x133ba
+	.uleb128 0x56
+	.8byte	.LBB1107
+	.8byte	.LBE1107-.LBB1107
+	.uleb128 0x57
+	.4byte	0x133d0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x59
-	.4byte	0x13338
-	.8byte	.LBB1104
-	.8byte	.LBE1104-.LBB1104
+	.uleb128 0x5b
+	.4byte	0x132fa
+	.8byte	.LBB1108
+	.8byte	.LBE1108-.LBB1108
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13352
+	.4byte	0x13314
 	.uleb128 0x54
-	.4byte	0x13348
-	.uleb128 0x59
-	.4byte	0x1341a
-	.8byte	.LBB1105
-	.8byte	.LBE1105-.LBB1105
+	.4byte	0x1330a
+	.uleb128 0x5b
+	.4byte	0x133dc
+	.8byte	.LBB1109
+	.8byte	.LBE1109-.LBB1109
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x13434
+	.4byte	0x133f6
 	.uleb128 0x54
-	.4byte	0x1342a
+	.4byte	0x133ec
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12edc
-	.8byte	.LBB1113
-	.8byte	.LBE1113-.LBB1113
+	.4byte	0x12e9e
+	.8byte	.LBB1117
+	.8byte	.LBE1117-.LBB1117
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x11194
+	.4byte	0x111d2
 	.uleb128 0x54
-	.4byte	0x12eec
-	.uleb128 0x5e
-	.8byte	.LBB1114
-	.8byte	.LBE1114-.LBB1114
+	.4byte	0x12eae
+	.uleb128 0x56
+	.8byte	.LBB1118
+	.8byte	.LBE1118-.LBB1118
 	.uleb128 0x5f
-	.4byte	0x12ef7
+	.4byte	0x12eb9
 	.4byte	.LLST58
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x590
-	.4byte	0x1115f
+	.4byte	0x1119d
 	.uleb128 0x5f
-	.4byte	0x12f03
+	.4byte	0x12ec5
 	.4byte	.LLST59
-	.uleb128 0x59
-	.4byte	0x133e8
-	.8byte	.LBB1116
-	.8byte	.LBE1116-.LBB1116
+	.uleb128 0x5b
+	.4byte	0x133aa
+	.8byte	.LBB1120
+	.8byte	.LBE1120-.LBB1120
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13403
+	.4byte	0x133c5
 	.uleb128 0x54
-	.4byte	0x133f8
-	.uleb128 0x5e
-	.8byte	.LBB1117
-	.8byte	.LBE1117-.LBB1117
-	.uleb128 0x5c
-	.4byte	0x1340e
+	.4byte	0x133ba
+	.uleb128 0x56
+	.8byte	.LBB1121
+	.8byte	.LBE1121-.LBB1121
+	.uleb128 0x57
+	.4byte	0x133d0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x59
-	.4byte	0x13364
-	.8byte	.LBB1118
-	.8byte	.LBE1118-.LBB1118
+	.uleb128 0x5b
+	.4byte	0x13326
+	.8byte	.LBB1122
+	.8byte	.LBE1122-.LBB1122
 	.byte	0x6
 	.byte	0xfd
-	.uleb128 0x5e
-	.8byte	.LBB1119
-	.8byte	.LBE1119-.LBB1119
+	.uleb128 0x56
+	.8byte	.LBB1123
+	.8byte	.LBE1123-.LBB1123
 	.uleb128 0x5f
-	.4byte	0x13374
+	.4byte	0x13336
 	.4byte	.LLST60
 	.byte	0
 	.byte	0
@@ -40486,167 +40499,167 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL210
-	.4byte	0x13cdf
+	.4byte	0x13c87
 	.byte	0
 	.byte	0
-	.uleb128 0x58
-	.4byte	0x12e15
-	.8byte	.LBB1130
+	.uleb128 0x5a
+	.4byte	0x12dd7
+	.8byte	.LBB1134
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
 	.2byte	0x572
-	.4byte	0x113c3
+	.4byte	0x11401
 	.uleb128 0x54
-	.4byte	0x12e3a
+	.4byte	0x12dfc
 	.uleb128 0x54
-	.4byte	0x12e2f
+	.4byte	0x12df1
 	.uleb128 0x54
-	.4byte	0x12e25
+	.4byte	0x12de7
 	.uleb128 0x6d
-	.4byte	0x12e73
-	.8byte	.LBB1131
+	.4byte	0x12e35
+	.8byte	.LBB1135
 	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x12e5a
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x12e4f
 	.uleb128 0x54
-	.4byte	0x12e83
+	.4byte	0x12e45
 	.uleb128 0x6e
-	.4byte	0x12f10
-	.8byte	.LBB1133
+	.4byte	0x12ed2
+	.8byte	.LBB1137
 	.4byte	.Ldebug_ranges0+0x620
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x112f9
+	.4byte	0x11337
 	.uleb128 0x54
-	.4byte	0x12f2b
+	.4byte	0x12eed
 	.uleb128 0x6f
-	.4byte	0x12f20
+	.4byte	0x12ee2
 	.4byte	.LLST61
-	.uleb128 0x5b
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x620
 	.uleb128 0x5f
-	.4byte	0x12f36
+	.4byte	0x12ef8
 	.4byte	.LLST62
 	.uleb128 0x5f
-	.4byte	0x12f41
+	.4byte	0x12f03
 	.4byte	.LLST63
 	.uleb128 0x70
-	.4byte	0x13364
-	.8byte	.LBB1135
-	.8byte	.LBE1135-.LBB1135
+	.4byte	0x13326
+	.8byte	.LBB1139
+	.8byte	.LBE1139-.LBB1139
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x1125f
-	.uleb128 0x5e
-	.8byte	.LBB1136
-	.8byte	.LBE1136-.LBB1136
+	.4byte	0x1129d
+	.uleb128 0x56
+	.8byte	.LBB1140
+	.8byte	.LBE1140-.LBB1140
 	.uleb128 0x5f
-	.4byte	0x13374
+	.4byte	0x13336
 	.4byte	.LLST64
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1137
-	.8byte	.LBE1137-.LBB1137
-	.4byte	0x112b3
-	.uleb128 0x5c
-	.4byte	0x12f4d
-	.uleb128 0x59
-	.4byte	0x133e8
-	.8byte	.LBB1138
-	.8byte	.LBE1138-.LBB1138
+	.8byte	.LBB1141
+	.8byte	.LBE1141-.LBB1141
+	.4byte	0x112f1
+	.uleb128 0x57
+	.4byte	0x12f0f
+	.uleb128 0x5b
+	.4byte	0x133aa
+	.8byte	.LBB1142
+	.8byte	.LBE1142-.LBB1142
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x13403
+	.4byte	0x133c5
 	.uleb128 0x54
-	.4byte	0x133f8
-	.uleb128 0x5e
-	.8byte	.LBB1139
-	.8byte	.LBE1139-.LBB1139
-	.uleb128 0x5c
-	.4byte	0x1340e
+	.4byte	0x133ba
+	.uleb128 0x56
+	.8byte	.LBB1143
+	.8byte	.LBE1143-.LBB1143
+	.uleb128 0x57
+	.4byte	0x133d0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x59
-	.4byte	0x13338
-	.8byte	.LBB1140
-	.8byte	.LBE1140-.LBB1140
+	.uleb128 0x5b
+	.4byte	0x132fa
+	.8byte	.LBB1144
+	.8byte	.LBE1144-.LBB1144
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13352
+	.4byte	0x13314
 	.uleb128 0x54
-	.4byte	0x13348
-	.uleb128 0x59
-	.4byte	0x1341a
-	.8byte	.LBB1141
-	.8byte	.LBE1141-.LBB1141
+	.4byte	0x1330a
+	.uleb128 0x5b
+	.4byte	0x133dc
+	.8byte	.LBB1145
+	.8byte	.LBE1145-.LBB1145
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x13434
+	.4byte	0x133f6
 	.uleb128 0x54
-	.4byte	0x1342a
+	.4byte	0x133ec
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12edc
-	.8byte	.LBB1149
-	.8byte	.LBE1149-.LBB1149
+	.4byte	0x12e9e
+	.8byte	.LBB1153
+	.8byte	.LBE1153-.LBB1153
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x113b4
+	.4byte	0x113f2
 	.uleb128 0x54
-	.4byte	0x12eec
-	.uleb128 0x5e
-	.8byte	.LBB1150
-	.8byte	.LBE1150-.LBB1150
+	.4byte	0x12eae
+	.uleb128 0x56
+	.8byte	.LBB1154
+	.8byte	.LBE1154-.LBB1154
 	.uleb128 0x5f
-	.4byte	0x12ef7
+	.4byte	0x12eb9
 	.4byte	.LLST65
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x670
-	.4byte	0x1137f
+	.4byte	0x113bd
 	.uleb128 0x5f
-	.4byte	0x12f03
+	.4byte	0x12ec5
 	.4byte	.LLST66
-	.uleb128 0x59
-	.4byte	0x133e8
-	.8byte	.LBB1152
-	.8byte	.LBE1152-.LBB1152
+	.uleb128 0x5b
+	.4byte	0x133aa
+	.8byte	.LBB1156
+	.8byte	.LBE1156-.LBB1156
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x13403
+	.4byte	0x133c5
 	.uleb128 0x54
-	.4byte	0x133f8
-	.uleb128 0x5e
-	.8byte	.LBB1153
-	.8byte	.LBE1153-.LBB1153
-	.uleb128 0x5c
-	.4byte	0x1340e
+	.4byte	0x133ba
+	.uleb128 0x56
+	.8byte	.LBB1157
+	.8byte	.LBE1157-.LBB1157
+	.uleb128 0x57
+	.4byte	0x133d0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x59
-	.4byte	0x13364
-	.8byte	.LBB1154
-	.8byte	.LBE1154-.LBB1154
+	.uleb128 0x5b
+	.4byte	0x13326
+	.8byte	.LBB1158
+	.8byte	.LBE1158-.LBB1158
 	.byte	0x6
 	.byte	0xfd
-	.uleb128 0x5e
-	.8byte	.LBB1155
-	.8byte	.LBE1155-.LBB1155
+	.uleb128 0x56
+	.8byte	.LBB1159
+	.8byte	.LBE1159-.LBB1159
 	.uleb128 0x5f
-	.4byte	0x13374
+	.4byte	0x13336
 	.4byte	.LLST67
 	.byte	0
 	.byte	0
@@ -40654,113 +40667,113 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL218
-	.4byte	0x13cdf
+	.4byte	0x13c87
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL51
-	.4byte	0x13bba
+	.4byte	0x13b62
 	.uleb128 0x4e
 	.8byte	.LVL52
-	.4byte	0x13c10
+	.4byte	0x13bb8
 	.uleb128 0x4e
 	.8byte	.LVL53
-	.4byte	0x13c94
+	.4byte	0x13c3c
 	.uleb128 0x4e
 	.8byte	.LVL64
-	.4byte	0x13cf9
+	.4byte	0x13ca1
 	.uleb128 0x4e
 	.8byte	.LVL67
-	.4byte	0x13b4b
+	.4byte	0x13af3
 	.uleb128 0x4e
 	.8byte	.LVL70
-	.4byte	0x13ad1
+	.4byte	0x13a79
 	.uleb128 0x4e
 	.8byte	.LVL87
-	.4byte	0x13c94
+	.4byte	0x13c3c
 	.uleb128 0x4e
 	.8byte	.LVL88
-	.4byte	0x13d05
+	.4byte	0x13cad
 	.uleb128 0x4e
 	.8byte	.LVL90
-	.4byte	0x13bc6
+	.4byte	0x13b6e
 	.uleb128 0x4e
 	.8byte	.LVL97
-	.4byte	0x13bba
+	.4byte	0x13b62
 	.uleb128 0x4e
 	.8byte	.LVL111
-	.4byte	0x13d11
+	.4byte	0x13cb9
 	.uleb128 0x4e
 	.8byte	.LVL112
-	.4byte	0x13bc6
+	.4byte	0x13b6e
 	.uleb128 0x4e
 	.8byte	.LVL113
-	.4byte	0x13c1a
+	.4byte	0x13bc2
 	.uleb128 0x4e
 	.8byte	.LVL123
-	.4byte	0x13d1d
+	.4byte	0x13cc5
 	.uleb128 0x4e
 	.8byte	.LVL124
-	.4byte	0x13c94
+	.4byte	0x13c3c
 	.uleb128 0x4e
 	.8byte	.LVL151
-	.4byte	0x13ad1
+	.4byte	0x13a79
 	.uleb128 0x4e
 	.8byte	.LVL154
-	.4byte	0x13ad1
+	.4byte	0x13a79
 	.uleb128 0x4e
 	.8byte	.LVL156
-	.4byte	0x13bba
+	.4byte	0x13b62
 	.uleb128 0x4e
 	.8byte	.LVL158
-	.4byte	0x13bba
+	.4byte	0x13b62
 	.uleb128 0x4e
 	.8byte	.LVL159
-	.4byte	0x13c10
+	.4byte	0x13bb8
 	.uleb128 0x4e
 	.8byte	.LVL160
-	.4byte	0x13c94
+	.4byte	0x13c3c
 	.uleb128 0x4e
 	.8byte	.LVL173
-	.4byte	0x13b4b
+	.4byte	0x13af3
 	.uleb128 0x4e
 	.8byte	.LVL176
-	.4byte	0x13b4b
+	.4byte	0x13af3
 	.uleb128 0x4e
 	.8byte	.LVL178
-	.4byte	0x13bba
+	.4byte	0x13b62
 	.uleb128 0x4e
 	.8byte	.LVL179
-	.4byte	0x13c94
+	.4byte	0x13c3c
 	.uleb128 0x4e
 	.8byte	.LVL187
-	.4byte	0x13cf9
+	.4byte	0x13ca1
 	.uleb128 0x4e
 	.8byte	.LVL221
-	.4byte	0x13c1a
+	.4byte	0x13bc2
 	.uleb128 0x4e
 	.8byte	.LVL228
-	.4byte	0x13b4b
+	.4byte	0x13af3
 	.uleb128 0x4e
 	.8byte	.LVL229
-	.4byte	0x13c58
+	.4byte	0x13c00
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0x1154d
+	.4byte	0x1158b
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xa
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x1153d
+	.4byte	0x1157b
 	.uleb128 0x62
 	.4byte	.LASF3063
 	.byte	0x1
 	.2byte	0x4f9
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1157c
+	.4byte	0x115ba
 	.uleb128 0x64
 	.4byte	.LASF2995
 	.byte	0x1
@@ -40780,7 +40793,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x115b6
+	.4byte	0x115f4
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
@@ -40789,7 +40802,7 @@ __exitcall_ebc_exit:
 	.4byte	.LLST68
 	.uleb128 0x4e
 	.8byte	.LVL242
-	.4byte	0x120a1
+	.4byte	0x12063
 	.byte	0
 	.uleb128 0x4d
 	.4byte	.LASF3066
@@ -40799,7 +40812,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2821-.LFB2821
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11616
+	.4byte	0x11654
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
@@ -40811,17 +40824,17 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x4e9
 	.4byte	0xe710
-	.uleb128 0x5d
-	.4byte	0x12da7
-	.8byte	.LBB910
+	.uleb128 0x5e
+	.4byte	0x12d69
+	.8byte	.LBB914
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
 	.2byte	0x4ed
 	.uleb128 0x54
-	.4byte	0x12db3
+	.4byte	0x12d75
 	.uleb128 0x4e
 	.8byte	.LVL41
-	.4byte	0x13d29
+	.4byte	0x13cd1
 	.byte	0
 	.byte	0
 	.uleb128 0x62
@@ -40830,7 +40843,7 @@ __exitcall_ebc_exit:
 	.2byte	0x4d7
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11640
+	.4byte	0x1167e
 	.uleb128 0x64
 	.4byte	.LASF2995
 	.byte	0x1
@@ -40851,7 +40864,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2819-.LFB2819
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11eb0
+	.4byte	0x11e72
 	.uleb128 0x51
 	.string	"ptr"
 	.byte	0x1
@@ -40880,13 +40893,13 @@ __exitcall_ebc_exit:
 	.2byte	0x3a1
 	.4byte	0xe3fc
 	.4byte	.LLST152
-	.uleb128 0x57
+	.uleb128 0x59
 	.4byte	.LASF3069
 	.byte	0x1
 	.2byte	0x3a2
 	.4byte	0xc6
 	.4byte	.LLST153
-	.uleb128 0x57
+	.uleb128 0x59
 	.4byte	.LASF2965
 	.byte	0x1
 	.2byte	0x3a3
@@ -40900,7 +40913,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -72
-	.uleb128 0x57
+	.uleb128 0x59
 	.4byte	.LASF3071
 	.byte	0x1
 	.2byte	0x3a5
@@ -40910,23 +40923,23 @@ __exitcall_ebc_exit:
 	.4byte	.LASF3073
 	.byte	0x1
 	.2byte	0x4a7
-	.8byte	.L645
+	.8byte	.L646
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xfd0
-	.4byte	0x1179c
+	.4byte	0x117da
 	.uleb128 0x46
 	.4byte	.LASF3060
 	.byte	0x1
 	.2byte	0x3e4
 	.4byte	0xc6
-	.uleb128 0x5e
-	.8byte	.LBB1713
-	.8byte	.LBE1713-.LBB1713
+	.uleb128 0x56
+	.8byte	.LBB1717
+	.8byte	.LBE1717-.LBB1717
 	.uleb128 0x6b
 	.4byte	.LASF3072
 	.byte	0x1
 	.2byte	0x3e4
-	.8byte	.L627
+	.8byte	.L628
 	.uleb128 0x4c
 	.4byte	.LASF3061
 	.byte	0x1
@@ -40942,44 +40955,44 @@ __exitcall_ebc_exit:
 	.4byte	0x194
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x1000
-	.4byte	0x11780
-	.uleb128 0x57
+	.4byte	0x117be
+	.uleb128 0x59
 	.4byte	.LASF3062
 	.byte	0x1
 	.2byte	0x3e4
 	.4byte	0x194
 	.4byte	.LLST170
 	.uleb128 0x4e
-	.8byte	.LVL785
-	.4byte	0x13cad
+	.8byte	.LVL784
+	.4byte	0x13c55
 	.uleb128 0x4e
-	.8byte	.LVL786
-	.4byte	0x13cb9
+	.8byte	.LVL785
+	.4byte	0x13c61
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL783
-	.4byte	0x13cc6
+	.8byte	.LVL782
+	.4byte	0x13c6e
 	.uleb128 0x4e
-	.8byte	.LVL787
-	.4byte	0x13cd2
+	.8byte	.LVL786
+	.4byte	0x13c7a
 	.byte	0
 	.byte	0
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xf10
-	.4byte	0x1183e
+	.4byte	0x1187c
 	.uleb128 0x46
 	.4byte	.LASF3060
 	.byte	0x1
 	.2byte	0x496
 	.4byte	0xc6
-	.uleb128 0x5e
-	.8byte	.LBB1697
-	.8byte	.LBE1697-.LBB1697
+	.uleb128 0x56
+	.8byte	.LBB1701
+	.8byte	.LBE1701-.LBB1701
 	.uleb128 0x6b
 	.4byte	.LASF3072
 	.byte	0x1
 	.2byte	0x496
-	.8byte	.L682
+	.8byte	.L683
 	.uleb128 0x4c
 	.4byte	.LASF3061
 	.byte	0x1
@@ -40995,40 +41008,40 @@ __exitcall_ebc_exit:
 	.4byte	0x194
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xf40
-	.4byte	0x11822
-	.uleb128 0x57
+	.4byte	0x11860
+	.uleb128 0x59
 	.4byte	.LASF3062
 	.byte	0x1
 	.2byte	0x496
 	.4byte	0x194
 	.4byte	.LLST158
 	.uleb128 0x4e
-	.8byte	.LVL759
-	.4byte	0x13cad
+	.8byte	.LVL758
+	.4byte	0x13c55
 	.uleb128 0x4e
-	.8byte	.LVL760
-	.4byte	0x13cb9
+	.8byte	.LVL759
+	.4byte	0x13c61
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL757
-	.4byte	0x13cc6
+	.8byte	.LVL756
+	.4byte	0x13c6e
 	.uleb128 0x4e
-	.8byte	.LVL761
-	.4byte	0x13cd2
+	.8byte	.LVL760
+	.4byte	0x13c7a
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1691
-	.8byte	.LBE1691-.LBB1691
-	.4byte	0x118f0
+	.8byte	.LBB1695
+	.8byte	.LBE1695-.LBB1695
+	.4byte	0x1192e
 	.uleb128 0x46
 	.4byte	.LASF3060
 	.byte	0x1
 	.2byte	0x4c3
 	.4byte	0xc6
-	.uleb128 0x5e
-	.8byte	.LBB1692
-	.8byte	.LBE1692-.LBB1692
+	.uleb128 0x56
+	.8byte	.LBB1696
+	.8byte	.LBE1696-.LBB1696
 	.uleb128 0x72
 	.4byte	.LASF3072
 	.byte	0x1
@@ -41047,45 +41060,45 @@ __exitcall_ebc_exit:
 	.2byte	0x4c3
 	.4byte	0x194
 	.uleb128 0x6c
-	.8byte	.LBB1693
-	.8byte	.LBE1693-.LBB1693
-	.4byte	0x118d4
-	.uleb128 0x57
+	.8byte	.LBB1697
+	.8byte	.LBE1697-.LBB1697
+	.4byte	0x11912
+	.uleb128 0x59
 	.4byte	.LASF3062
 	.byte	0x1
 	.2byte	0x4c3
 	.4byte	0x194
 	.4byte	.LLST157
 	.uleb128 0x4e
-	.8byte	.LVL713
-	.4byte	0x13cad
+	.8byte	.LVL712
+	.4byte	0x13c55
 	.uleb128 0x4e
-	.8byte	.LVL714
-	.4byte	0x13cb9
+	.8byte	.LVL713
+	.4byte	0x13c61
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL711
-	.4byte	0x13cc6
+	.8byte	.LVL710
+	.4byte	0x13c6e
 	.uleb128 0x4e
-	.8byte	.LVL715
-	.4byte	0x13cd2
+	.8byte	.LVL714
+	.4byte	0x13c7a
 	.byte	0
 	.byte	0
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xe90
-	.4byte	0x11986
+	.4byte	0x119c4
 	.uleb128 0x46
 	.4byte	.LASF3060
 	.byte	0x1
 	.2byte	0x4cf
 	.4byte	0xc6
-	.uleb128 0x5b
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xe90
 	.uleb128 0x6b
 	.4byte	.LASF3072
 	.byte	0x1
 	.2byte	0x4cf
-	.8byte	.L698
+	.8byte	.L699
 	.uleb128 0x4c
 	.4byte	.LASF3061
 	.byte	0x1
@@ -41101,387 +41114,351 @@ __exitcall_ebc_exit:
 	.4byte	0x194
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xed0
-	.4byte	0x1196a
-	.uleb128 0x57
+	.4byte	0x119a8
+	.uleb128 0x59
 	.4byte	.LASF3062
 	.byte	0x1
 	.2byte	0x4cf
 	.4byte	0x194
 	.4byte	.LLST156
 	.uleb128 0x4e
-	.8byte	.LVL678
-	.4byte	0x13cad
+	.8byte	.LVL677
+	.4byte	0x13c55
 	.uleb128 0x4e
-	.8byte	.LVL679
-	.4byte	0x13cb9
+	.8byte	.LVL678
+	.4byte	0x13c61
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL676
-	.4byte	0x13cc6
+	.8byte	.LVL675
+	.4byte	0x13c6e
 	.uleb128 0x4e
-	.8byte	.LVL680
-	.4byte	0x13cd2
+	.8byte	.LVL679
+	.4byte	0x13c7a
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12aad
-	.8byte	.LBB1694
-	.8byte	.LBE1694-.LBB1694
+	.4byte	0x12a6f
+	.8byte	.LBB1698
+	.8byte	.LBE1698-.LBB1698
 	.byte	0x1
-	.2byte	0x483
-	.4byte	0x119d1
+	.2byte	0x4cc
+	.4byte	0x11a0f
 	.uleb128 0x54
-	.4byte	0x12ac8
+	.4byte	0x12a8a
 	.uleb128 0x54
-	.4byte	0x12abd
-	.uleb128 0x5e
-	.8byte	.LBB1695
-	.8byte	.LBE1695-.LBB1695
-	.uleb128 0x5c
-	.4byte	0x12ad3
+	.4byte	0x12a7f
+	.uleb128 0x56
+	.8byte	.LBB1699
+	.8byte	.LBE1699-.LBB1699
+	.uleb128 0x57
+	.4byte	0x12a95
 	.uleb128 0x4e
-	.8byte	.LVL722
-	.4byte	0x13937
+	.8byte	.LVL715
+	.4byte	0x138f9
 	.byte	0
 	.byte	0
-	.uleb128 0x58
-	.4byte	0x1283a
-	.8byte	.LBB1700
+	.uleb128 0x5a
+	.4byte	0x127fc
+	.8byte	.LBB1704
 	.4byte	.Ldebug_ranges0+0xf70
 	.byte	0x1
 	.2byte	0x403
-	.4byte	0x11a97
+	.4byte	0x11ad5
 	.uleb128 0x54
-	.4byte	0x12877
+	.4byte	0x12839
 	.uleb128 0x54
-	.4byte	0x12877
+	.4byte	0x12839
 	.uleb128 0x54
-	.4byte	0x12877
+	.4byte	0x12839
 	.uleb128 0x54
-	.4byte	0x12883
+	.4byte	0x12845
 	.uleb128 0x54
-	.4byte	0x1286b
+	.4byte	0x1282d
 	.uleb128 0x54
-	.4byte	0x1285f
+	.4byte	0x12821
 	.uleb128 0x54
-	.4byte	0x12853
+	.4byte	0x12815
 	.uleb128 0x54
-	.4byte	0x12847
-	.uleb128 0x5b
+	.4byte	0x12809
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0xf70
-	.uleb128 0x5c
-	.4byte	0x1288f
+	.uleb128 0x57
+	.4byte	0x12851
 	.uleb128 0x5f
-	.4byte	0x1289b
+	.4byte	0x1285d
 	.4byte	.LLST159
-	.uleb128 0x5c
-	.4byte	0x128a7
+	.uleb128 0x57
+	.4byte	0x12869
 	.uleb128 0x5f
-	.4byte	0x128b3
+	.4byte	0x12875
 	.4byte	.LLST160
 	.uleb128 0x5f
-	.4byte	0x128bf
+	.4byte	0x12881
 	.4byte	.LLST161
-	.uleb128 0x5c
-	.4byte	0x128cb
-	.uleb128 0x5c
-	.4byte	0x128d7
-	.uleb128 0x5c
-	.4byte	0x128e3
-	.uleb128 0x5c
-	.4byte	0x128ef
+	.uleb128 0x57
+	.4byte	0x1288d
+	.uleb128 0x57
+	.4byte	0x12899
+	.uleb128 0x57
+	.4byte	0x128a5
+	.uleb128 0x57
+	.4byte	0x128b1
 	.uleb128 0x5f
-	.4byte	0x128fb
+	.4byte	0x128bd
 	.4byte	.LLST162
 	.uleb128 0x5f
-	.4byte	0x12907
+	.4byte	0x128c9
 	.4byte	.LLST163
 	.uleb128 0x60
-	.4byte	0x12913
+	.4byte	0x128d5
 	.uleb128 0x1
 	.byte	0x5f
 	.uleb128 0x5f
-	.4byte	0x1291d
+	.4byte	0x128df
 	.4byte	.LLST164
 	.uleb128 0x5f
-	.4byte	0x12927
+	.4byte	0x128e9
 	.4byte	.LLST165
 	.uleb128 0x5f
-	.4byte	0x12933
+	.4byte	0x128f5
 	.4byte	.LLST166
 	.uleb128 0x5f
-	.4byte	0x1293f
+	.4byte	0x12901
 	.4byte	.LLST167
 	.uleb128 0x5f
-	.4byte	0x1294b
+	.4byte	0x1290d
 	.4byte	.LLST168
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x11eb0
-	.8byte	.LBB1709
-	.8byte	.LBE1709-.LBB1709
+	.4byte	0x11e72
+	.8byte	.LBB1713
+	.8byte	.LBE1713-.LBB1713
 	.byte	0x1
 	.2byte	0x465
-	.4byte	0x11b1d
+	.4byte	0x11b5b
 	.uleb128 0x54
-	.4byte	0x11ed9
+	.4byte	0x11e9b
 	.uleb128 0x54
-	.4byte	0x11ecd
+	.4byte	0x11e8f
 	.uleb128 0x54
-	.4byte	0x11ec1
-	.uleb128 0x5e
-	.8byte	.LBB1710
-	.8byte	.LBE1710-.LBB1710
-	.uleb128 0x5c
-	.4byte	0x11ee5
-	.uleb128 0x5c
-	.4byte	0x11eef
-	.uleb128 0x5c
-	.4byte	0x11efb
-	.uleb128 0x5c
-	.4byte	0x11f07
+	.4byte	0x11e83
+	.uleb128 0x56
+	.8byte	.LBB1714
+	.8byte	.LBE1714-.LBB1714
+	.uleb128 0x57
+	.4byte	0x11ea7
+	.uleb128 0x57
+	.4byte	0x11eb1
+	.uleb128 0x57
+	.4byte	0x11ebd
+	.uleb128 0x57
+	.4byte	0x11ec9
 	.uleb128 0x5f
-	.4byte	0x11f13
+	.4byte	0x11ed5
 	.4byte	.LLST169
-	.uleb128 0x5c
-	.4byte	0x11f1f
-	.uleb128 0x5c
-	.4byte	0x11f2b
+	.uleb128 0x57
+	.4byte	0x11ee1
+	.uleb128 0x57
+	.4byte	0x11eed
 	.uleb128 0x73
-	.4byte	0x11f37
-	.uleb128 0x5e
-	.8byte	.LBB1711
-	.8byte	.LBE1711-.LBB1711
-	.uleb128 0x5c
-	.4byte	0x11f40
-	.uleb128 0x5c
-	.4byte	0x11f4c
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x53
-	.4byte	0x12aad
-	.8byte	.LBB1718
-	.8byte	.LBE1718-.LBB1718
-	.byte	0x1
-	.2byte	0x42f
-	.4byte	0x11b68
-	.uleb128 0x54
-	.4byte	0x12ac8
-	.uleb128 0x54
-	.4byte	0x12abd
-	.uleb128 0x5e
-	.8byte	.LBB1719
-	.8byte	.LBE1719-.LBB1719
-	.uleb128 0x5c
-	.4byte	0x12ad3
-	.uleb128 0x4e
-	.8byte	.LVL780
-	.4byte	0x13937
-	.byte	0
+	.4byte	0x11ef9
+	.uleb128 0x56
+	.8byte	.LBB1715
+	.8byte	.LBE1715-.LBB1715
+	.uleb128 0x57
+	.4byte	0x11f02
+	.uleb128 0x57
+	.4byte	0x11f0e
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x12aad
-	.8byte	.LBB1721
-	.8byte	.LBE1721-.LBB1721
-	.byte	0x1
-	.2byte	0x40b
-	.4byte	0x11bb3
-	.uleb128 0x54
-	.4byte	0x12ac8
-	.uleb128 0x54
-	.4byte	0x12abd
-	.uleb128 0x5e
-	.8byte	.LBB1722
-	.8byte	.LBE1722-.LBB1722
-	.uleb128 0x5c
-	.4byte	0x12ad3
-	.uleb128 0x4e
-	.8byte	.LVL794
-	.4byte	0x13937
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12aad
+	.4byte	0x12a6f
 	.8byte	.LBB1723
 	.8byte	.LBE1723-.LBB1723
 	.byte	0x1
-	.2byte	0x3d4
-	.4byte	0x11bfe
+	.2byte	0x3aa
+	.4byte	0x11ba6
 	.uleb128 0x54
-	.4byte	0x12ac8
+	.4byte	0x12a8a
 	.uleb128 0x54
-	.4byte	0x12abd
-	.uleb128 0x5e
+	.4byte	0x12a7f
+	.uleb128 0x56
 	.8byte	.LBB1724
 	.8byte	.LBE1724-.LBB1724
-	.uleb128 0x5c
-	.4byte	0x12ad3
+	.uleb128 0x57
+	.4byte	0x12a95
 	.uleb128 0x4e
-	.8byte	.LVL796
-	.4byte	0x13937
+	.8byte	.LVL788
+	.4byte	0x138f9
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
+	.8byte	.LVL662
+	.4byte	0x13cdd
+	.uleb128 0x4e
 	.8byte	.LVL663
-	.4byte	0x13d35
+	.4byte	0x13ce9
 	.uleb128 0x4e
 	.8byte	.LVL664
-	.4byte	0x13d41
+	.4byte	0x13ca1
 	.uleb128 0x4e
-	.8byte	.LVL665
-	.4byte	0x13cf9
+	.8byte	.LVL682
+	.4byte	0x13cf5
 	.uleb128 0x4e
 	.8byte	.LVL683
-	.4byte	0x13d4d
+	.4byte	0x13bb8
 	.uleb128 0x4e
 	.8byte	.LVL684
-	.4byte	0x13c10
+	.4byte	0x13ce9
 	.uleb128 0x4e
 	.8byte	.LVL685
-	.4byte	0x13d41
+	.4byte	0x13ca1
 	.uleb128 0x4e
 	.8byte	.LVL686
-	.4byte	0x13cf9
+	.4byte	0x1298c
 	.uleb128 0x4e
 	.8byte	.LVL687
-	.4byte	0x129ca
+	.4byte	0x13d01
 	.uleb128 0x4e
 	.8byte	.LVL688
-	.4byte	0x13d59
+	.4byte	0x13a79
 	.uleb128 0x4e
 	.8byte	.LVL689
-	.4byte	0x13ad1
+	.4byte	0x122f8
 	.uleb128 0x4e
-	.8byte	.LVL690
-	.4byte	0x12336
+	.8byte	.LVL692
+	.4byte	0x13d0d
 	.uleb128 0x4e
 	.8byte	.LVL693
-	.4byte	0x13d65
+	.4byte	0x13a79
 	.uleb128 0x4e
 	.8byte	.LVL694
-	.4byte	0x13ad1
+	.4byte	0x13b56
 	.uleb128 0x4e
 	.8byte	.LVL695
-	.4byte	0x13bae
+	.4byte	0x13a79
 	.uleb128 0x4e
-	.8byte	.LVL696
-	.4byte	0x13ad1
+	.8byte	.LVL699
+	.4byte	0x11f1c
 	.uleb128 0x4e
 	.8byte	.LVL700
-	.4byte	0x11f5a
+	.4byte	0x13af3
 	.uleb128 0x4e
-	.8byte	.LVL701
-	.4byte	0x13b4b
+	.8byte	.LVL702
+	.4byte	0x13ce9
 	.uleb128 0x4e
 	.8byte	.LVL703
-	.4byte	0x13d41
+	.4byte	0x13cf5
 	.uleb128 0x4e
 	.8byte	.LVL704
-	.4byte	0x13d4d
+	.4byte	0x1298c
 	.uleb128 0x4e
 	.8byte	.LVL705
-	.4byte	0x129ca
+	.4byte	0x13d01
 	.uleb128 0x4e
 	.8byte	.LVL706
-	.4byte	0x13d59
-	.uleb128 0x4e
-	.8byte	.LVL707
-	.4byte	0x11f5a
+	.4byte	0x11f1c
 	.uleb128 0x4e
-	.8byte	.LVL710
-	.4byte	0x13cf9
+	.8byte	.LVL709
+	.4byte	0x13ca1
 	.uleb128 0x4e
 	.8byte	.LVL716
-	.4byte	0x139f6
+	.4byte	0x13af3
 	.uleb128 0x4e
-	.8byte	.LVL717
-	.4byte	0x13b4b
+	.8byte	.LVL718
+	.4byte	0x13a79
 	.uleb128 0x4e
 	.8byte	.LVL719
-	.4byte	0x13ad1
+	.4byte	0x13bc2
 	.uleb128 0x4e
-	.8byte	.LVL720
-	.4byte	0x13c1a
+	.8byte	.LVL721
+	.4byte	0x139b3
+	.uleb128 0x4e
+	.8byte	.LVL722
+	.4byte	0x11f1c
 	.uleb128 0x4e
 	.8byte	.LVL723
-	.4byte	0x11f5a
+	.4byte	0x13a79
 	.uleb128 0x4e
 	.8byte	.LVL724
-	.4byte	0x13ad1
+	.4byte	0x122f8
 	.uleb128 0x4e
 	.8byte	.LVL725
-	.4byte	0x12336
+	.4byte	0x13b56
 	.uleb128 0x4e
-	.8byte	.LVL726
-	.4byte	0x13bae
+	.8byte	.LVL728
+	.4byte	0x13b56
 	.uleb128 0x4e
-	.8byte	.LVL729
-	.4byte	0x13bae
+	.8byte	.LVL752
+	.4byte	0x13a79
 	.uleb128 0x4e
-	.8byte	.LVL753
-	.4byte	0x13ad1
+	.8byte	.LVL755
+	.4byte	0x13a79
 	.uleb128 0x4e
-	.8byte	.LVL756
-	.4byte	0x13ad1
+	.8byte	.LVL761
+	.4byte	0x13b56
 	.uleb128 0x4e
-	.8byte	.LVL762
-	.4byte	0x13bae
+	.8byte	.LVL763
+	.4byte	0x11f1c
 	.uleb128 0x4e
-	.8byte	.LVL764
-	.4byte	0x11f5a
+	.8byte	.LVL765
+	.4byte	0x13a79
 	.uleb128 0x4e
 	.8byte	.LVL766
-	.4byte	0x13ad1
+	.4byte	0x122f8
 	.uleb128 0x4e
-	.8byte	.LVL767
-	.4byte	0x12336
+	.8byte	.LVL769
+	.4byte	0x13a79
 	.uleb128 0x4e
 	.8byte	.LVL770
-	.4byte	0x13ad1
+	.4byte	0x13d0d
 	.uleb128 0x4e
 	.8byte	.LVL771
-	.4byte	0x13d65
+	.4byte	0x13bc2
 	.uleb128 0x4e
 	.8byte	.LVL772
-	.4byte	0x13c1a
+	.4byte	0x13a79
 	.uleb128 0x4e
 	.8byte	.LVL773
-	.4byte	0x13ad1
+	.4byte	0x13ae7
 	.uleb128 0x4e
 	.8byte	.LVL774
-	.4byte	0x13b3f
+	.4byte	0x13bb8
 	.uleb128 0x4e
 	.8byte	.LVL775
-	.4byte	0x13c10
+	.4byte	0x13bb8
 	.uleb128 0x4e
-	.8byte	.LVL776
-	.4byte	0x13c10
+	.8byte	.LVL777
+	.4byte	0x13a79
 	.uleb128 0x4e
 	.8byte	.LVL778
-	.4byte	0x13ad1
+	.4byte	0x13af3
 	.uleb128 0x4e
 	.8byte	.LVL779
-	.4byte	0x13b4b
+	.4byte	0x139b3
 	.uleb128 0x4e
-	.8byte	.LVL781
-	.4byte	0x13c10
+	.8byte	.LVL780
+	.4byte	0x13bb8
 	.uleb128 0x4e
 	.8byte	.LVL789
-	.4byte	0x139f6
+	.4byte	0x13bb8
 	.uleb128 0x4e
 	.8byte	.LVL790
-	.4byte	0x13c10
+	.4byte	0x13bb8
 	.uleb128 0x4e
 	.8byte	.LVL791
-	.4byte	0x13c10
+	.4byte	0x13bb8
 	.uleb128 0x4e
-	.8byte	.LVL792
-	.4byte	0x13c10
+	.8byte	.LVL793
+	.4byte	0x139b3
+	.uleb128 0x4e
+	.8byte	.LVL795
+	.4byte	0x139b3
 	.uleb128 0x4e
-	.8byte	.LVL797
-	.4byte	0x13c58
+	.8byte	.LVL796
+	.4byte	0x13c00
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3074
@@ -41489,7 +41466,7 @@ __exitcall_ebc_exit:
 	.2byte	0x37a
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11f5a
+	.4byte	0x11f1c
 	.uleb128 0x64
 	.4byte	.LASF3075
 	.byte	0x1
@@ -41566,7 +41543,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2817-.LFB2817
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x120a1
+	.4byte	0x12063
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
@@ -41578,7 +41555,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x326
 	.4byte	0xe710
-	.uleb128 0x57
+	.uleb128 0x59
 	.4byte	.LASF3088
 	.byte	0x1
 	.2byte	0x327
@@ -41592,62 +41569,62 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x64
 	.uleb128 0x53
-	.4byte	0x12d22
-	.8byte	.LBB1184
-	.8byte	.LBE1184-.LBB1184
+	.4byte	0x12ce4
+	.8byte	.LBB1188
+	.8byte	.LBE1188-.LBB1188
 	.byte	0x1
 	.2byte	0x32b
-	.4byte	0x11fdd
+	.4byte	0x11f9f
 	.uleb128 0x54
-	.4byte	0x12d3d
+	.4byte	0x12cff
 	.uleb128 0x54
-	.4byte	0x12d32
+	.4byte	0x12cf4
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL248
-	.4byte	0x13ad1
+	.4byte	0x13a79
 	.uleb128 0x4e
 	.8byte	.LVL249
-	.4byte	0x13d71
+	.4byte	0x13d19
 	.uleb128 0x4e
 	.8byte	.LVL252
-	.4byte	0x13d71
+	.4byte	0x13d19
 	.uleb128 0x4e
 	.8byte	.LVL253
-	.4byte	0x13b4b
+	.4byte	0x13af3
 	.uleb128 0x4e
 	.8byte	.LVL255
-	.4byte	0x13b4b
+	.4byte	0x13af3
 	.uleb128 0x4e
 	.8byte	.LVL256
-	.4byte	0x13b4b
+	.4byte	0x13af3
 	.uleb128 0x4e
 	.8byte	.LVL258
-	.4byte	0x13d71
+	.4byte	0x13d19
 	.uleb128 0x4e
 	.8byte	.LVL259
-	.4byte	0x13d71
+	.4byte	0x13d19
 	.uleb128 0x4e
 	.8byte	.LVL260
-	.4byte	0x13d71
+	.4byte	0x13d19
 	.uleb128 0x4e
 	.8byte	.LVL261
-	.4byte	0x13d71
+	.4byte	0x13d19
 	.uleb128 0x4e
 	.8byte	.LVL262
-	.4byte	0x13d71
+	.4byte	0x13d19
 	.uleb128 0x4e
 	.8byte	.LVL263
-	.4byte	0x13d71
+	.4byte	0x13d19
 	.uleb128 0x4e
 	.8byte	.LVL264
-	.4byte	0x13d71
+	.4byte	0x13d19
 	.uleb128 0x4e
 	.8byte	.LVL265
-	.4byte	0x13b4b
+	.4byte	0x13af3
 	.uleb128 0x4e
 	.8byte	.LVL266
-	.4byte	0x13c58
+	.4byte	0x13c00
 	.byte	0
 	.uleb128 0x4d
 	.4byte	.LASF3089
@@ -41657,7 +41634,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2816-.LFB2816
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1215a
+	.4byte	0x1211c
 	.uleb128 0x46
 	.4byte	.LASF2954
 	.byte	0x1
@@ -41670,34 +41647,34 @@ __exitcall_ebc_exit:
 	.4byte	0xe123
 	.uleb128 0x4e
 	.8byte	.LVL231
-	.4byte	0x13b7c
+	.4byte	0x13b24
 	.uleb128 0x4e
 	.8byte	.LVL232
-	.4byte	0x13ad1
+	.4byte	0x13a79
 	.uleb128 0x4e
 	.8byte	.LVL233
-	.4byte	0x13c1a
+	.4byte	0x13bc2
 	.uleb128 0x4e
 	.8byte	.LVL234
-	.4byte	0x13c1a
+	.4byte	0x13bc2
 	.uleb128 0x4e
 	.8byte	.LVL235
-	.4byte	0x13ad1
+	.4byte	0x13a79
 	.uleb128 0x4e
 	.8byte	.LVL236
-	.4byte	0x13b35
+	.4byte	0x13add
 	.uleb128 0x4e
 	.8byte	.LVL237
-	.4byte	0x13bae
+	.4byte	0x13b56
 	.uleb128 0x4e
 	.8byte	.LVL238
-	.4byte	0x13c1a
+	.4byte	0x13bc2
 	.uleb128 0x4e
 	.8byte	.LVL239
-	.4byte	0x13c1a
+	.4byte	0x13bc2
 	.uleb128 0x4e
 	.8byte	.LVL240
-	.4byte	0x13b7c
+	.4byte	0x13b24
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3090
@@ -41708,8 +41685,8 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2815-.LFB2815
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12326
-	.uleb128 0x56
+	.4byte	0x122e8
+	.uleb128 0x58
 	.4byte	.LASF791
 	.byte	0x1
 	.2byte	0x2b7
@@ -41734,12 +41711,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe710
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x940
-	.4byte	0x12244
+	.4byte	0x12206
 	.uleb128 0x3f
 	.byte	0x8
 	.byte	0x1
 	.2byte	0x2c2
-	.4byte	0x121dd
+	.4byte	0x1219f
 	.uleb128 0x41
 	.4byte	.LASF3091
 	.byte	0x1
@@ -41749,104 +41726,104 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x1
 	.2byte	0x2c2
-	.4byte	0x12326
+	.4byte	0x122e8
 	.byte	0
 	.uleb128 0x52
 	.string	"__u"
 	.byte	0x1
 	.2byte	0x2c2
-	.4byte	0x121bb
-	.uleb128 0x58
-	.4byte	0x13504
-	.8byte	.LBB1273
+	.4byte	0x1217d
+	.uleb128 0x5a
+	.4byte	0x134c6
+	.8byte	.LBB1277
 	.4byte	.Ldebug_ranges0+0x980
 	.byte	0x1
 	.2byte	0x2c2
-	.4byte	0x12211
+	.4byte	0x121d3
 	.uleb128 0x54
-	.4byte	0x13524
+	.4byte	0x134e6
 	.uleb128 0x54
-	.4byte	0x13519
+	.4byte	0x134db
 	.uleb128 0x54
-	.4byte	0x13510
+	.4byte	0x134d2
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x13364
-	.8byte	.LBB1276
-	.8byte	.LBE1276-.LBB1276
+	.uleb128 0x5c
+	.4byte	0x13326
+	.8byte	.LBB1280
+	.8byte	.LBE1280-.LBB1280
 	.byte	0x1
 	.2byte	0x2c2
-	.uleb128 0x5e
-	.8byte	.LBB1277
-	.8byte	.LBE1277-.LBB1277
+	.uleb128 0x56
+	.8byte	.LBB1281
+	.8byte	.LBE1281-.LBB1281
 	.uleb128 0x60
-	.4byte	0x13374
+	.4byte	0x13336
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131fe
-	.8byte	.LBB1281
-	.8byte	.LBE1281-.LBB1281
+	.4byte	0x131c0
+	.8byte	.LBB1285
+	.8byte	.LBE1285-.LBB1285
 	.byte	0x1
 	.2byte	0x2f5
-	.4byte	0x12296
+	.4byte	0x12258
 	.uleb128 0x54
-	.4byte	0x1320f
-	.uleb128 0x5a
-	.4byte	0x1321c
-	.8byte	.LBB1283
-	.8byte	.LBE1283-.LBB1283
+	.4byte	0x131d1
+	.uleb128 0x5c
+	.4byte	0x131de
+	.8byte	.LBB1287
+	.8byte	.LBE1287-.LBB1287
 	.byte	0xd
 	.2byte	0x240
 	.uleb128 0x54
-	.4byte	0x13238
+	.4byte	0x131fa
 	.uleb128 0x54
-	.4byte	0x1322d
+	.4byte	0x131ef
 	.uleb128 0x4e
 	.8byte	.LVL427
-	.4byte	0x13d7d
+	.4byte	0x13d25
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL422
-	.4byte	0x13d8a
+	.4byte	0x13d32
 	.uleb128 0x4e
 	.8byte	.LVL423
-	.4byte	0x13cad
+	.4byte	0x13c55
 	.uleb128 0x4e
 	.8byte	.LVL424
-	.4byte	0x13d94
+	.4byte	0x13d3c
 	.uleb128 0x4e
 	.8byte	.LVL425
-	.4byte	0x126df
+	.4byte	0x126a1
 	.uleb128 0x4e
 	.8byte	.LVL426
-	.4byte	0x13834
+	.4byte	0x137f6
 	.uleb128 0x4e
 	.8byte	.LVL428
-	.4byte	0x13834
+	.4byte	0x137f6
 	.uleb128 0x4e
 	.8byte	.LVL429
-	.4byte	0x13536
+	.4byte	0x134f8
 	.uleb128 0x4e
 	.8byte	.LVL430
-	.4byte	0x13834
+	.4byte	0x137f6
 	.uleb128 0x4e
 	.8byte	.LVL431
-	.4byte	0x126df
+	.4byte	0x126a1
 	.uleb128 0x4e
 	.8byte	.LVL432
-	.4byte	0x13834
+	.4byte	0x137f6
 	.uleb128 0x4e
 	.8byte	.LVL433
-	.4byte	0x13676
+	.4byte	0x13638
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x12336
+	.4byte	0x122f8
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
@@ -41859,7 +41836,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2814-.LFB2814
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x124d5
+	.4byte	0x12497
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
@@ -41883,99 +41860,99 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	__func__.34649
 	.uleb128 0x53
-	.4byte	0x124d5
-	.8byte	.LBB1264
-	.8byte	.LBE1264-.LBB1264
+	.4byte	0x12497
+	.8byte	.LBB1268
+	.8byte	.LBE1268-.LBB1268
 	.byte	0x1
 	.2byte	0x288
-	.4byte	0x123c3
+	.4byte	0x12385
 	.uleb128 0x54
-	.4byte	0x124ee
+	.4byte	0x124b0
 	.uleb128 0x54
-	.4byte	0x124e2
+	.4byte	0x124a4
 	.uleb128 0x4e
 	.8byte	.LVL398
-	.4byte	0x13834
+	.4byte	0x137f6
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x124d5
-	.8byte	.LBB1266
-	.8byte	.LBE1266-.LBB1266
+	.4byte	0x12497
+	.8byte	.LBB1270
+	.8byte	.LBE1270-.LBB1270
 	.byte	0x1
 	.2byte	0x276
-	.4byte	0x123f7
+	.4byte	0x123b9
 	.uleb128 0x54
-	.4byte	0x124ee
+	.4byte	0x124b0
 	.uleb128 0x54
-	.4byte	0x124e2
+	.4byte	0x124a4
 	.uleb128 0x4e
 	.8byte	.LVL403
-	.4byte	0x13834
+	.4byte	0x137f6
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x124d5
-	.8byte	.LBB1268
-	.8byte	.LBE1268-.LBB1268
+	.4byte	0x12497
+	.8byte	.LBB1272
+	.8byte	.LBE1272-.LBB1272
 	.byte	0x1
 	.2byte	0x2ab
-	.4byte	0x1242b
+	.4byte	0x123ed
 	.uleb128 0x54
-	.4byte	0x124ee
+	.4byte	0x124b0
 	.uleb128 0x54
-	.4byte	0x124e2
+	.4byte	0x124a4
 	.uleb128 0x4e
 	.8byte	.LVL407
-	.4byte	0x13834
+	.4byte	0x137f6
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x124d5
-	.8byte	.LBB1270
-	.8byte	.LBE1270-.LBB1270
+	.4byte	0x12497
+	.8byte	.LBB1274
+	.8byte	.LBE1274-.LBB1274
 	.byte	0x1
 	.2byte	0x29e
-	.4byte	0x1245f
+	.4byte	0x12421
 	.uleb128 0x54
-	.4byte	0x124ee
+	.4byte	0x124b0
 	.uleb128 0x54
-	.4byte	0x124e2
+	.4byte	0x124a4
 	.uleb128 0x4e
 	.8byte	.LVL412
-	.4byte	0x13834
+	.4byte	0x137f6
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL397
-	.4byte	0x126df
+	.4byte	0x126a1
 	.uleb128 0x4e
 	.8byte	.LVL399
-	.4byte	0x126df
+	.4byte	0x126a1
 	.uleb128 0x4e
 	.8byte	.LVL402
-	.4byte	0x126df
+	.4byte	0x126a1
 	.uleb128 0x4e
 	.8byte	.LVL406
-	.4byte	0x13536
+	.4byte	0x134f8
 	.uleb128 0x4e
 	.8byte	.LVL408
-	.4byte	0x13536
+	.4byte	0x134f8
 	.uleb128 0x4e
 	.8byte	.LVL411
-	.4byte	0x13676
+	.4byte	0x13638
 	.uleb128 0x4e
 	.8byte	.LVL413
-	.4byte	0x13676
+	.4byte	0x13638
 	.uleb128 0x4e
 	.8byte	.LVL416
-	.4byte	0x13da0
+	.4byte	0x13d48
 	.uleb128 0x4e
 	.8byte	.LVL417
-	.4byte	0x13da0
+	.4byte	0x13d48
 	.byte	0
 	.uleb128 0x65
 	.4byte	.LASF3094
 	.byte	0x1
 	.2byte	0x262
 	.byte	0x1
-	.4byte	0x124fb
+	.4byte	0x124bd
 	.uleb128 0x64
 	.4byte	.LASF2995
 	.byte	0x1
@@ -41992,7 +41969,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x257
 	.byte	0x1
-	.4byte	0x1252d
+	.4byte	0x124ef
 	.uleb128 0x64
 	.4byte	.LASF2995
 	.byte	0x1
@@ -42007,7 +41984,7 @@ __exitcall_ebc_exit:
 	.string	"buf"
 	.byte	0x1
 	.2byte	0x259
-	.4byte	0x1252d
+	.4byte	0x124ef
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -42017,7 +41994,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x22d
 	.byte	0x1
-	.4byte	0x12609
+	.4byte	0x125cb
 	.uleb128 0x64
 	.4byte	.LASF3097
 	.byte	0x1
@@ -42109,7 +42086,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x207
 	.byte	0x1
-	.4byte	0x126df
+	.4byte	0x126a1
 	.uleb128 0x64
 	.4byte	.LASF3097
 	.byte	0x1
@@ -42204,7 +42181,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2809-.LFB2809
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1283a
+	.4byte	0x127fc
 	.uleb128 0x6a
 	.4byte	.LASF3097
 	.byte	0x1
@@ -42263,19 +42240,19 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x61
-	.uleb128 0x57
+	.uleb128 0x59
 	.4byte	.LASF261
 	.byte	0x1
 	.2byte	0x169
 	.4byte	0xc6
 	.4byte	.LLST1
-	.uleb128 0x57
+	.uleb128 0x59
 	.4byte	.LASF3100
 	.byte	0x1
 	.2byte	0x16a
 	.4byte	0x13a
 	.4byte	.LLST2
-	.uleb128 0x57
+	.uleb128 0x59
 	.4byte	.LASF3101
 	.byte	0x1
 	.2byte	0x16a
@@ -42295,7 +42272,7 @@ __exitcall_ebc_exit:
 	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x52
-	.uleb128 0x57
+	.uleb128 0x59
 	.4byte	.LASF3104
 	.byte	0x1
 	.2byte	0x16c
@@ -42340,7 +42317,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x172
 	.4byte	0x10b
-	.uleb128 0x57
+	.uleb128 0x59
 	.4byte	.LASF3113
 	.byte	0x1
 	.2byte	0x173
@@ -42352,7 +42329,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x117
 	.byte	0x1
-	.4byte	0x12958
+	.4byte	0x1291a
 	.uleb128 0x64
 	.4byte	.LASF3115
 	.byte	0x1
@@ -42477,8 +42454,8 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2807-.LFB2807
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x129ca
-	.uleb128 0x56
+	.4byte	0x1298c
+	.uleb128 0x58
 	.4byte	.LASF2271
 	.byte	0x1
 	.2byte	0x109
@@ -42496,14 +42473,14 @@ __exitcall_ebc_exit:
 	.2byte	0x10c
 	.4byte	0xe710
 	.uleb128 0x4e
+	.8byte	.LVL652
+	.4byte	0x13cf5
+	.uleb128 0x4e
 	.8byte	.LVL653
-	.4byte	0x13d4d
+	.4byte	0x1298c
 	.uleb128 0x4e
 	.8byte	.LVL654
-	.4byte	0x129ca
-	.uleb128 0x4e
-	.8byte	.LVL655
-	.4byte	0x13d59
+	.4byte	0x13d01
 	.byte	0
 	.uleb128 0x75
 	.4byte	.LASF3126
@@ -42513,7 +42490,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2806-.LFB2806
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12aad
+	.4byte	0x12a6f
 	.uleb128 0x76
 	.4byte	.LASF3115
 	.byte	0x1
@@ -42614,7 +42591,7 @@ __exitcall_ebc_exit:
 	.byte	0xb4
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x12adf
+	.4byte	0x12aa1
 	.uleb128 0x7d
 	.string	"ebc"
 	.byte	0x1
@@ -42637,7 +42614,7 @@ __exitcall_ebc_exit:
 	.byte	0x86
 	.4byte	0x10b
 	.byte	0x3
-	.4byte	0x12b27
+	.4byte	0x12ae9
 	.uleb128 0x7e
 	.4byte	.LASF2854
 	.byte	0x1
@@ -42670,7 +42647,7 @@ __exitcall_ebc_exit:
 	.byte	0x80
 	.4byte	0x10b
 	.byte	0x3
-	.4byte	0x12b59
+	.4byte	0x12b1b
 	.uleb128 0x7e
 	.4byte	.LASF2854
 	.byte	0x1
@@ -42692,7 +42669,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x12b7c
+	.4byte	0x12b3e
 	.uleb128 0x7e
 	.4byte	.LASF2929
 	.byte	0xb
@@ -42709,7 +42686,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x12baa
+	.4byte	0x12b6c
 	.uleb128 0x7e
 	.4byte	.LASF2929
 	.byte	0xb
@@ -42731,7 +42708,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x12bee
+	.4byte	0x12bb0
 	.uleb128 0x7e
 	.4byte	.LASF2929
 	.byte	0xb
@@ -42763,7 +42740,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x12c06
+	.4byte	0x12bc8
 	.uleb128 0x7e
 	.4byte	.LASF2929
 	.byte	0xb
@@ -42776,7 +42753,7 @@ __exitcall_ebc_exit:
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12c2d
+	.4byte	0x12bef
 	.uleb128 0x7e
 	.4byte	.LASF2929
 	.byte	0xb
@@ -42793,7 +42770,7 @@ __exitcall_ebc_exit:
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x12c77
+	.4byte	0x12c39
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa
@@ -42826,7 +42803,7 @@ __exitcall_ebc_exit:
 	.2byte	0x108
 	.4byte	0xb78e
 	.byte	0x3
-	.4byte	0x12c95
+	.4byte	0x12c57
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa
@@ -42839,7 +42816,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.4byte	0xb78e
 	.byte	0x3
-	.4byte	0x12cb1
+	.4byte	0x12c73
 	.uleb128 0x7d
 	.string	"bus"
 	.byte	0xc8
@@ -42852,7 +42829,7 @@ __exitcall_ebc_exit:
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12ccd
+	.4byte	0x12c8f
 	.uleb128 0x7e
 	.4byte	.LASF3147
 	.byte	0xa
@@ -42864,7 +42841,7 @@ __exitcall_ebc_exit:
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x12d06
+	.4byte	0x12cc8
 	.uleb128 0x7d
 	.string	"dev"
 	.byte	0xcb
@@ -42892,7 +42869,7 @@ __exitcall_ebc_exit:
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12d22
+	.4byte	0x12ce4
 	.uleb128 0x7e
 	.4byte	.LASF2930
 	.byte	0x3
@@ -42905,7 +42882,7 @@ __exitcall_ebc_exit:
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12d47
+	.4byte	0x12d09
 	.uleb128 0x7e
 	.4byte	.LASF2930
 	.byte	0x3
@@ -42922,7 +42899,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x12d5f
+	.4byte	0x12d21
 	.uleb128 0x7e
 	.4byte	.LASF2930
 	.byte	0x3
@@ -42934,7 +42911,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x12d77
+	.4byte	0x12d39
 	.uleb128 0x7e
 	.4byte	.LASF2930
 	.byte	0x3
@@ -42946,7 +42923,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x12d8f
+	.4byte	0x12d51
 	.uleb128 0x7e
 	.4byte	.LASF2930
 	.byte	0x3
@@ -42958,7 +42935,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x12da7
+	.4byte	0x12d69
 	.uleb128 0x7e
 	.4byte	.LASF2930
 	.byte	0x3
@@ -42970,12 +42947,12 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x12dbf
+	.4byte	0x12d81
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x12dbf
+	.4byte	0x12d81
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -42985,24 +42962,24 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x12ddd
+	.4byte	0x12d9f
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x12dbf
+	.4byte	0x12d81
 	.byte	0
 	.uleb128 0x7f
 	.4byte	.LASF3158
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x12e15
+	.4byte	0x12dd7
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x12dbf
+	.4byte	0x12d81
 	.uleb128 0x7e
 	.4byte	.LASF192
 	.byte	0x4
@@ -43025,7 +43002,7 @@ __exitcall_ebc_exit:
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12e44
+	.4byte	0x12e06
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -43048,7 +43025,7 @@ __exitcall_ebc_exit:
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12e73
+	.4byte	0x12e35
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -43071,7 +43048,7 @@ __exitcall_ebc_exit:
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12ea2
+	.4byte	0x12e64
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -43094,7 +43071,7 @@ __exitcall_ebc_exit:
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12edc
+	.4byte	0x12e9e
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -43122,7 +43099,7 @@ __exitcall_ebc_exit:
 	.byte	0xf5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x12f10
+	.4byte	0x12ed2
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0x6
@@ -43147,7 +43124,7 @@ __exitcall_ebc_exit:
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12f5a
+	.4byte	0x12f1c
 	.uleb128 0x7e
 	.4byte	.LASF1147
 	.byte	0x6
@@ -43182,7 +43159,7 @@ __exitcall_ebc_exit:
 	.2byte	0x2e5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x12f84
+	.4byte	0x12f46
 	.uleb128 0x64
 	.4byte	.LASF984
 	.byte	0x12
@@ -43200,7 +43177,7 @@ __exitcall_ebc_exit:
 	.2byte	0x216
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x12fbc
+	.4byte	0x12f7e
 	.uleb128 0x64
 	.4byte	.LASF984
 	.byte	0x12
@@ -43225,7 +43202,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1dd
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x12ff2
+	.4byte	0x12fb4
 	.uleb128 0x64
 	.4byte	.LASF984
 	.byte	0x12
@@ -43248,7 +43225,7 @@ __exitcall_ebc_exit:
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x13010
+	.4byte	0x12fd2
 	.uleb128 0x64
 	.4byte	.LASF984
 	.byte	0x12
@@ -43261,7 +43238,7 @@ __exitcall_ebc_exit:
 	.2byte	0x13d
 	.4byte	0xd772
 	.byte	0x3
-	.4byte	0x1302e
+	.4byte	0x12ff0
 	.uleb128 0x64
 	.4byte	.LASF170
 	.byte	0x12
@@ -43273,7 +43250,7 @@ __exitcall_ebc_exit:
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x13051
+	.4byte	0x13013
 	.uleb128 0x7e
 	.4byte	.LASF3022
 	.byte	0xbe
@@ -43291,12 +43268,12 @@ __exitcall_ebc_exit:
 	.byte	0xd6
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x1306d
+	.4byte	0x1302f
 	.uleb128 0x7e
 	.4byte	.LASF3022
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x1306d
+	.4byte	0x1302f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -43307,12 +43284,12 @@ __exitcall_ebc_exit:
 	.2byte	0x164
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13091
+	.4byte	0x13053
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x13091
+	.4byte	0x13053
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -43323,7 +43300,7 @@ __exitcall_ebc_exit:
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x130cc
+	.4byte	0x1308e
 	.uleb128 0x63
 	.string	"np"
 	.byte	0xe
@@ -43346,7 +43323,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13118
+	.4byte	0x130da
 	.uleb128 0x63
 	.string	"np"
 	.byte	0xe
@@ -43378,7 +43355,7 @@ __exitcall_ebc_exit:
 	.byte	0xe
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x13130
+	.4byte	0x130f2
 	.uleb128 0x7e
 	.4byte	.LASF865
 	.byte	0xe
@@ -43390,7 +43367,7 @@ __exitcall_ebc_exit:
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x13156
+	.4byte	0x13118
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -43408,7 +43385,7 @@ __exitcall_ebc_exit:
 	.2byte	0x49b
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13174
+	.4byte	0x13136
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -43421,7 +43398,7 @@ __exitcall_ebc_exit:
 	.2byte	0x2c5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x131aa
+	.4byte	0x1316c
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -43444,7 +43421,7 @@ __exitcall_ebc_exit:
 	.byte	0xca
 	.4byte	0x33c
 	.byte	0x3
-	.4byte	0x131c6
+	.4byte	0x13188
 	.uleb128 0x7d
 	.string	"res"
 	.byte	0xf
@@ -43457,7 +43434,7 @@ __exitcall_ebc_exit:
 	.byte	0x22
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x131e2
+	.4byte	0x131a4
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xcc
@@ -43470,7 +43447,7 @@ __exitcall_ebc_exit:
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x131fe
+	.4byte	0x131c0
 	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xcd
@@ -43483,7 +43460,7 @@ __exitcall_ebc_exit:
 	.2byte	0x23e
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x1321c
+	.4byte	0x131de
 	.uleb128 0x64
 	.4byte	.LASF2271
 	.byte	0xd
@@ -43496,7 +43473,7 @@ __exitcall_ebc_exit:
 	.2byte	0x203
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x13245
+	.4byte	0x13207
 	.uleb128 0x63
 	.string	"wq"
 	.byte	0xd
@@ -43513,7 +43490,7 @@ __exitcall_ebc_exit:
 	.byte	0xd
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x13268
+	.4byte	0x1322a
 	.uleb128 0x7e
 	.4byte	.LASF2271
 	.byte	0xd
@@ -43531,7 +43508,7 @@ __exitcall_ebc_exit:
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13284
+	.4byte	0x13246
 	.uleb128 0x63
 	.string	"m"
 	.byte	0x51
@@ -43544,7 +43521,7 @@ __exitcall_ebc_exit:
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x132a0
+	.4byte	0x13262
 	.uleb128 0x63
 	.string	"m"
 	.byte	0x51
@@ -43557,7 +43534,7 @@ __exitcall_ebc_exit:
 	.byte	0x8a
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x132dc
+	.4byte	0x1329e
 	.uleb128 0x7e
 	.4byte	.LASF1147
 	.byte	0xca
@@ -43584,7 +43561,7 @@ __exitcall_ebc_exit:
 	.byte	0xca
 	.byte	0x84
 	.byte	0x3
-	.4byte	0x1330c
+	.4byte	0x132ce
 	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xca
@@ -43608,7 +43585,7 @@ __exitcall_ebc_exit:
 	.byte	0xca
 	.byte	0x73
 	.byte	0x3
-	.4byte	0x13338
+	.4byte	0x132fa
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xca
@@ -43631,12 +43608,12 @@ __exitcall_ebc_exit:
 	.byte	0x52
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1335e
+	.4byte	0x13320
 	.uleb128 0x7d
 	.string	"ti"
 	.byte	0xca
 	.byte	0x52
-	.4byte	0x1335e
+	.4byte	0x13320
 	.uleb128 0x7e
 	.4byte	.LASF3203
 	.byte	0xca
@@ -43652,7 +43629,7 @@ __exitcall_ebc_exit:
 	.byte	0xf
 	.4byte	0x2eda
 	.byte	0x3
-	.4byte	0x13380
+	.4byte	0x13342
 	.uleb128 0x79
 	.4byte	.LASF3205
 	.byte	0x5
@@ -43664,7 +43641,7 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x133c4
+	.4byte	0x13386
 	.uleb128 0x7e
 	.4byte	.LASF959
 	.byte	0x10
@@ -43675,7 +43652,7 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x133b7
+	.4byte	0x13379
 	.uleb128 0x22
 	.4byte	.LASF3091
 	.byte	0x10
@@ -43685,13 +43662,13 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x12326
+	.4byte	0x122e8
 	.byte	0
 	.uleb128 0x7b
 	.string	"__u"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x13398
+	.4byte	0x1335a
 	.byte	0
 	.byte	0
 	.uleb128 0x80
@@ -43705,7 +43682,7 @@ __exitcall_ebc_exit:
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x133e8
+	.4byte	0x133aa
 	.uleb128 0x7d
 	.string	"n"
 	.byte	0xce
@@ -43718,7 +43695,7 @@ __exitcall_ebc_exit:
 	.byte	0x9a
 	.4byte	0xdd
 	.byte	0x3
-	.4byte	0x1341a
+	.4byte	0x133dc
 	.uleb128 0x7e
 	.4byte	.LASF2453
 	.byte	0x8
@@ -43741,7 +43718,7 @@ __exitcall_ebc_exit:
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13440
+	.4byte	0x13402
 	.uleb128 0x7d
 	.string	"nr"
 	.byte	0x7
@@ -43751,7 +43728,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF1147
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x13440
+	.4byte	0x13402
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -43761,7 +43738,7 @@ __exitcall_ebc_exit:
 	.byte	0x11
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x13479
+	.4byte	0x1343b
 	.uleb128 0x7d
 	.string	"i"
 	.byte	0x11
@@ -43771,7 +43748,7 @@ __exitcall_ebc_exit:
 	.string	"v"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13479
+	.4byte	0x1343b
 	.uleb128 0x7b
 	.string	"w0"
 	.byte	0x11
@@ -43781,7 +43758,7 @@ __exitcall_ebc_exit:
 	.string	"x1"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13479
+	.4byte	0x1343b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -43792,7 +43769,7 @@ __exitcall_ebc_exit:
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13499
+	.4byte	0x1345b
 	.uleb128 0x7d
 	.string	"x"
 	.byte	0xcf
@@ -43805,7 +43782,7 @@ __exitcall_ebc_exit:
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x134b5
+	.4byte	0x13477
 	.uleb128 0x7e
 	.4byte	.LASF2486
 	.byte	0xd0
@@ -43817,12 +43794,12 @@ __exitcall_ebc_exit:
 	.byte	0xd1
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x134d6
+	.4byte	0x13498
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd1
 	.byte	0xb
-	.4byte	0x134d6
+	.4byte	0x13498
 	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xd1
@@ -43831,21 +43808,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x134de
+	.4byte	0x134a0
 	.uleb128 0x81
 	.uleb128 0x3
-	.4byte	0x134dc
+	.4byte	0x1349e
 	.uleb128 0x7f
 	.4byte	.LASF3214
 	.byte	0xd1
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x13504
+	.4byte	0x134c6
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd1
 	.byte	0x9
-	.4byte	0x134d6
+	.4byte	0x13498
 	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xd1
@@ -43857,12 +43834,12 @@ __exitcall_ebc_exit:
 	.byte	0xc
 	.byte	0xe4
 	.byte	0x3
-	.4byte	0x13530
+	.4byte	0x134f2
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xc
 	.byte	0xe4
-	.4byte	0x13530
+	.4byte	0x134f2
 	.uleb128 0x7d
 	.string	"res"
 	.byte	0xc
@@ -43876,481 +43853,475 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x134dc
+	.4byte	0x1349e
 	.uleb128 0x82
-	.4byte	0x12609
+	.4byte	0x125cb
 	.8byte	.LFB2847
 	.8byte	.LFE2847-.LFB2847
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13676
+	.4byte	0x13638
 	.uleb128 0x71
-	.4byte	0x12616
+	.4byte	0x125d8
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x12622
+	.4byte	0x125e4
 	.4byte	.LLST95
 	.uleb128 0x6f
-	.4byte	0x1262e
+	.4byte	0x125f0
 	.4byte	.LLST96
 	.uleb128 0x54
-	.4byte	0x1263a
+	.4byte	0x125fc
 	.uleb128 0x54
-	.4byte	0x1263a
+	.4byte	0x125fc
 	.uleb128 0x54
-	.4byte	0x1263a
-	.uleb128 0x5c
-	.4byte	0x12646
+	.4byte	0x125fc
+	.uleb128 0x57
+	.4byte	0x12608
 	.uleb128 0x60
-	.4byte	0x12652
+	.4byte	0x12614
 	.uleb128 0x1
 	.byte	0x5c
-	.uleb128 0x5c
-	.4byte	0x1265c
+	.uleb128 0x57
+	.4byte	0x1261e
 	.uleb128 0x60
-	.4byte	0x12666
+	.4byte	0x12628
 	.uleb128 0x1
 	.byte	0x5f
-	.uleb128 0x5c
-	.4byte	0x12672
+	.uleb128 0x57
+	.4byte	0x12634
 	.uleb128 0x5f
-	.4byte	0x1267e
+	.4byte	0x12640
 	.4byte	.LLST97
 	.uleb128 0x5f
-	.4byte	0x1268a
+	.4byte	0x1264c
 	.4byte	.LLST98
 	.uleb128 0x5f
-	.4byte	0x12696
+	.4byte	0x12658
 	.4byte	.LLST99
 	.uleb128 0x5f
-	.4byte	0x126a2
+	.4byte	0x12664
 	.4byte	.LLST100
 	.uleb128 0x5f
-	.4byte	0x126ae
+	.4byte	0x12670
 	.4byte	.LLST101
 	.uleb128 0x5f
-	.4byte	0x126ba
+	.4byte	0x1267c
 	.4byte	.LLST102
 	.uleb128 0x60
-	.4byte	0x126c6
+	.4byte	0x12688
 	.uleb128 0x1
 	.byte	0x55
-	.uleb128 0x5c
-	.4byte	0x126d2
-	.uleb128 0x58
-	.4byte	0x12b27
-	.8byte	.LBB1192
+	.uleb128 0x57
+	.4byte	0x12694
+	.uleb128 0x5a
+	.4byte	0x12ae9
+	.8byte	.LBB1196
 	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
 	.2byte	0x225
-	.4byte	0x13601
+	.4byte	0x135c3
 	.uleb128 0x54
-	.4byte	0x12b4d
+	.4byte	0x12b0f
 	.uleb128 0x54
-	.4byte	0x12b42
+	.4byte	0x12b04
 	.uleb128 0x54
-	.4byte	0x12b37
+	.4byte	0x12af9
 	.byte	0
-	.uleb128 0x58
-	.4byte	0x12b27
-	.8byte	.LBB1197
+	.uleb128 0x5a
+	.4byte	0x12ae9
+	.8byte	.LBB1201
 	.4byte	.Ldebug_ranges0+0x720
 	.byte	0x1
 	.2byte	0x226
-	.4byte	0x13629
+	.4byte	0x135eb
 	.uleb128 0x54
-	.4byte	0x12b4d
+	.4byte	0x12b0f
 	.uleb128 0x54
-	.4byte	0x12b42
+	.4byte	0x12b04
 	.uleb128 0x54
-	.4byte	0x12b37
+	.4byte	0x12af9
 	.byte	0
-	.uleb128 0x58
-	.4byte	0x12b27
-	.8byte	.LBB1209
+	.uleb128 0x5a
+	.4byte	0x12ae9
+	.8byte	.LBB1213
 	.4byte	.Ldebug_ranges0+0x790
 	.byte	0x1
 	.2byte	0x227
-	.4byte	0x13651
+	.4byte	0x13613
 	.uleb128 0x54
-	.4byte	0x12b4d
+	.4byte	0x12b0f
 	.uleb128 0x54
-	.4byte	0x12b42
+	.4byte	0x12b04
 	.uleb128 0x54
-	.4byte	0x12b37
+	.4byte	0x12af9
 	.byte	0
-	.uleb128 0x5d
-	.4byte	0x12b27
-	.8byte	.LBB1221
+	.uleb128 0x5e
+	.4byte	0x12ae9
+	.8byte	.LBB1225
 	.4byte	.Ldebug_ranges0+0x800
 	.byte	0x1
 	.2byte	0x228
 	.uleb128 0x54
-	.4byte	0x12b4d
+	.4byte	0x12b0f
 	.uleb128 0x54
-	.4byte	0x12b42
+	.4byte	0x12b04
 	.uleb128 0x54
-	.4byte	0x12b37
+	.4byte	0x12af9
 	.byte	0
 	.byte	0
 	.uleb128 0x82
-	.4byte	0x12533
+	.4byte	0x124f5
 	.8byte	.LFB2848
 	.8byte	.LFE2848-.LFB2848
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13834
+	.4byte	0x137f6
 	.uleb128 0x71
-	.4byte	0x12540
+	.4byte	0x12502
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x1254c
+	.4byte	0x1250e
 	.4byte	.LLST103
 	.uleb128 0x6f
-	.4byte	0x12558
+	.4byte	0x1251a
 	.4byte	.LLST104
 	.uleb128 0x54
-	.4byte	0x12564
+	.4byte	0x12526
 	.uleb128 0x54
-	.4byte	0x12564
+	.4byte	0x12526
 	.uleb128 0x54
-	.4byte	0x12564
-	.uleb128 0x5c
-	.4byte	0x12570
+	.4byte	0x12526
+	.uleb128 0x57
+	.4byte	0x12532
 	.uleb128 0x5f
-	.4byte	0x1257c
+	.4byte	0x1253e
 	.4byte	.LLST105
 	.uleb128 0x5f
-	.4byte	0x12588
+	.4byte	0x1254a
 	.4byte	.LLST106
 	.uleb128 0x60
-	.4byte	0x12594
+	.4byte	0x12556
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x60
-	.4byte	0x125a0
+	.4byte	0x12562
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5f
-	.4byte	0x125ac
+	.4byte	0x1256e
 	.4byte	.LLST107
 	.uleb128 0x60
-	.4byte	0x125b8
+	.4byte	0x1257a
 	.uleb128 0x1
 	.byte	0x5f
 	.uleb128 0x60
-	.4byte	0x125c4
+	.4byte	0x12586
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x60
-	.4byte	0x125d0
+	.4byte	0x12592
 	.uleb128 0x1
 	.byte	0x5c
-	.uleb128 0x5c
-	.4byte	0x125da
+	.uleb128 0x57
+	.4byte	0x1259c
 	.uleb128 0x5f
-	.4byte	0x125e4
+	.4byte	0x125a6
 	.4byte	.LLST108
 	.uleb128 0x60
-	.4byte	0x125f0
+	.4byte	0x125b2
 	.uleb128 0x1
 	.byte	0x55
-	.uleb128 0x5c
-	.4byte	0x125fc
-	.uleb128 0x58
-	.4byte	0x12adf
-	.8byte	.LBB1232
+	.uleb128 0x57
+	.4byte	0x125be
+	.uleb128 0x5a
+	.4byte	0x12aa1
+	.8byte	.LBB1236
 	.4byte	.Ldebug_ranges0+0x850
 	.byte	0x1
 	.2byte	0x24d
-	.4byte	0x13753
+	.4byte	0x13715
 	.uleb128 0x54
-	.4byte	0x12b05
+	.4byte	0x12ac7
 	.uleb128 0x54
-	.4byte	0x12afa
+	.4byte	0x12abc
 	.uleb128 0x54
-	.4byte	0x12aef
-	.uleb128 0x5b
+	.4byte	0x12ab1
+	.uleb128 0x5d
 	.4byte	.Ldebug_ranges0+0x850
-	.uleb128 0x5c
-	.4byte	0x12b10
+	.uleb128 0x57
+	.4byte	0x12ad2
 	.uleb128 0x5f
-	.4byte	0x12b1b
+	.4byte	0x12add
 	.4byte	.LLST109
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12adf
-	.8byte	.LBB1235
-	.8byte	.LBE1235-.LBB1235
+	.4byte	0x12aa1
+	.8byte	.LBB1239
+	.8byte	.LBE1239-.LBB1239
 	.byte	0x1
 	.2byte	0x24a
-	.4byte	0x1379f
+	.4byte	0x13761
 	.uleb128 0x54
-	.4byte	0x12b05
+	.4byte	0x12ac7
 	.uleb128 0x54
-	.4byte	0x12afa
+	.4byte	0x12abc
 	.uleb128 0x54
-	.4byte	0x12aef
-	.uleb128 0x5e
-	.8byte	.LBB1236
-	.8byte	.LBE1236-.LBB1236
-	.uleb128 0x5c
-	.4byte	0x12b10
+	.4byte	0x12ab1
+	.uleb128 0x56
+	.8byte	.LBB1240
+	.8byte	.LBE1240-.LBB1240
+	.uleb128 0x57
+	.4byte	0x12ad2
 	.uleb128 0x5f
-	.4byte	0x12b1b
+	.4byte	0x12add
 	.4byte	.LLST110
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12adf
-	.8byte	.LBB1237
-	.8byte	.LBE1237-.LBB1237
+	.4byte	0x12aa1
+	.8byte	.LBB1241
+	.8byte	.LBE1241-.LBB1241
 	.byte	0x1
 	.2byte	0x24b
-	.4byte	0x137eb
+	.4byte	0x137ad
 	.uleb128 0x54
-	.4byte	0x12b05
+	.4byte	0x12ac7
 	.uleb128 0x54
-	.4byte	0x12afa
+	.4byte	0x12abc
 	.uleb128 0x54
-	.4byte	0x12aef
-	.uleb128 0x5e
-	.8byte	.LBB1238
-	.8byte	.LBE1238-.LBB1238
-	.uleb128 0x5c
-	.4byte	0x12b10
+	.4byte	0x12ab1
+	.uleb128 0x56
+	.8byte	.LBB1242
+	.8byte	.LBE1242-.LBB1242
+	.uleb128 0x57
+	.4byte	0x12ad2
 	.uleb128 0x5f
-	.4byte	0x12b1b
+	.4byte	0x12add
 	.4byte	.LLST111
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x12adf
-	.8byte	.LBB1239
-	.8byte	.LBE1239-.LBB1239
+	.uleb128 0x5c
+	.4byte	0x12aa1
+	.8byte	.LBB1243
+	.8byte	.LBE1243-.LBB1243
 	.byte	0x1
 	.2byte	0x24c
 	.uleb128 0x54
-	.4byte	0x12b05
+	.4byte	0x12ac7
 	.uleb128 0x54
-	.4byte	0x12afa
+	.4byte	0x12abc
 	.uleb128 0x54
-	.4byte	0x12aef
-	.uleb128 0x5e
-	.8byte	.LBB1240
-	.8byte	.LBE1240-.LBB1240
-	.uleb128 0x5c
-	.4byte	0x12b10
+	.4byte	0x12ab1
+	.uleb128 0x56
+	.8byte	.LBB1244
+	.8byte	.LBE1244-.LBB1244
+	.uleb128 0x57
+	.4byte	0x12ad2
 	.uleb128 0x5f
-	.4byte	0x12b1b
+	.4byte	0x12add
 	.4byte	.LLST112
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x124fb
+	.4byte	0x124bd
 	.8byte	.LFB2849
 	.8byte	.LFE2849-.LFB2849
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13937
+	.4byte	0x138f9
 	.uleb128 0x6f
-	.4byte	0x12508
+	.4byte	0x124ca
 	.4byte	.LLST113
 	.uleb128 0x54
-	.4byte	0x12514
-	.uleb128 0x5c
-	.4byte	0x12520
-	.uleb128 0x58
-	.4byte	0x12c2d
-	.8byte	.LBB1242
+	.4byte	0x124d6
+	.uleb128 0x57
+	.4byte	0x124e2
+	.uleb128 0x5a
+	.4byte	0x12bef
+	.8byte	.LBB1246
 	.4byte	.Ldebug_ranges0+0x880
 	.byte	0x1
 	.2byte	0x25b
-	.4byte	0x138b5
+	.4byte	0x13877
 	.uleb128 0x54
-	.4byte	0x12c5e
+	.4byte	0x12c20
 	.uleb128 0x54
-	.4byte	0x12c52
+	.4byte	0x12c14
 	.uleb128 0x54
-	.4byte	0x12c46
+	.4byte	0x12c08
 	.uleb128 0x54
-	.4byte	0x12c3a
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x880
-	.uleb128 0x5c
-	.4byte	0x12c6a
+	.4byte	0x12bfc
 	.uleb128 0x5d
-	.4byte	0x12c77
-	.8byte	.LBB1244
+	.4byte	.Ldebug_ranges0+0x880
+	.uleb128 0x57
+	.4byte	0x12c2c
+	.uleb128 0x5e
+	.4byte	0x12c39
+	.8byte	.LBB1248
 	.4byte	.Ldebug_ranges0+0x8d0
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x54
-	.4byte	0x12c88
+	.4byte	0x12c4a
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x58
-	.4byte	0x12baa
-	.8byte	.LBB1253
+	.uleb128 0x5a
+	.4byte	0x12b6c
+	.8byte	.LBB1257
 	.4byte	.Ldebug_ranges0+0x900
 	.byte	0x1
 	.2byte	0x25c
-	.4byte	0x138e7
+	.4byte	0x138a9
 	.uleb128 0x54
-	.4byte	0x12be2
+	.4byte	0x12ba4
 	.uleb128 0x54
-	.4byte	0x12bd7
+	.4byte	0x12b99
 	.uleb128 0x54
-	.4byte	0x12bcc
+	.4byte	0x12b8e
 	.uleb128 0x54
-	.4byte	0x12bc1
+	.4byte	0x12b83
 	.uleb128 0x54
-	.4byte	0x12bb6
+	.4byte	0x12b78
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12b7c
-	.8byte	.LBB1259
-	.8byte	.LBE1259-.LBB1259
+	.4byte	0x12b3e
+	.8byte	.LBB1263
+	.8byte	.LBE1263-.LBB1263
 	.byte	0x1
 	.2byte	0x25d
-	.4byte	0x13913
+	.4byte	0x138d5
 	.uleb128 0x54
-	.4byte	0x12b9e
+	.4byte	0x12b60
 	.uleb128 0x54
-	.4byte	0x12b93
+	.4byte	0x12b55
 	.uleb128 0x54
-	.4byte	0x12b88
+	.4byte	0x12b4a
 	.byte	0
-	.uleb128 0x5a
-	.4byte	0x12b59
-	.8byte	.LBB1261
-	.8byte	.LBE1261-.LBB1261
+	.uleb128 0x5c
+	.4byte	0x12b1b
+	.8byte	.LBB1265
+	.8byte	.LBE1265-.LBB1265
 	.byte	0x1
 	.2byte	0x25e
 	.uleb128 0x54
-	.4byte	0x12b70
+	.4byte	0x12b32
 	.uleb128 0x54
-	.4byte	0x12b65
+	.4byte	0x12b27
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12aad
+	.4byte	0x12a6f
 	.8byte	.LFB2850
 	.8byte	.LFE2850-.LFB2850
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x139f6
+	.4byte	0x139b3
 	.uleb128 0x6f
-	.4byte	0x12abd
+	.4byte	0x12a7f
 	.4byte	.LLST116
 	.uleb128 0x6f
-	.4byte	0x12ac8
+	.4byte	0x12a8a
 	.4byte	.LLST117
-	.uleb128 0x5c
-	.4byte	0x12ad3
-	.uleb128 0x70
-	.4byte	0x12dc5
-	.8byte	.LBB1285
-	.8byte	.LBE1285-.LBB1285
-	.byte	0x1
-	.byte	0xbc
-	.4byte	0x13998
-	.uleb128 0x54
-	.4byte	0x12dd1
-	.uleb128 0x4e
-	.8byte	.LVL437
-	.4byte	0x13dac
-	.byte	0
+	.uleb128 0x57
+	.4byte	0x12a95
 	.uleb128 0x6e
-	.4byte	0x12c06
-	.8byte	.LBB1287
+	.4byte	0x12d39
+	.8byte	.LBB1289
 	.4byte	.Ldebug_ranges0+0x9b0
 	.byte	0x1
-	.byte	0xbf
-	.4byte	0x139ba
+	.byte	0xc6
+	.4byte	0x13949
 	.uleb128 0x54
-	.4byte	0x12c21
+	.4byte	0x12d45
+	.byte	0
+	.uleb128 0x70
+	.4byte	0x12bb0
+	.8byte	.LBB1293
+	.8byte	.LBE1293-.LBB1293
+	.byte	0x1
+	.byte	0xc7
+	.4byte	0x1396a
 	.uleb128 0x54
-	.4byte	0x12c16
+	.4byte	0x12bbc
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12d8f
-	.8byte	.LBB1291
-	.8byte	.LBE1291-.LBB1291
+	.4byte	0x12d69
+	.8byte	.LBB1295
+	.8byte	.LBE1295-.LBB1295
 	.byte	0x1
-	.byte	0xc0
-	.4byte	0x139db
+	.byte	0xca
+	.4byte	0x13998
 	.uleb128 0x54
-	.4byte	0x12d9b
+	.4byte	0x12d75
+	.uleb128 0x4e
+	.8byte	.LVL442
+	.4byte	0x13cd1
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL436
-	.4byte	0x13d65
+	.8byte	.LVL439
+	.4byte	0x13a79
 	.uleb128 0x4e
-	.8byte	.LVL440
-	.4byte	0x13ad1
+	.8byte	.LVL443
+	.4byte	0x13a79
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12aad
+	.4byte	0x12a6f
 	.8byte	.LFB2854
 	.8byte	.LFE2854-.LFB2854
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13ab9
+	.4byte	0x13a61
 	.uleb128 0x6f
-	.4byte	0x12abd
-	.4byte	.LLST140
-	.uleb128 0x5c
-	.4byte	0x12ad3
+	.4byte	0x12a7f
+	.4byte	.LLST141
+	.uleb128 0x57
+	.4byte	0x12a95
 	.uleb128 0x54
-	.4byte	0x12ac8
+	.4byte	0x12a8a
 	.uleb128 0x6e
-	.4byte	0x12d77
-	.8byte	.LBB1645
+	.4byte	0x12bc8
+	.8byte	.LBB1655
 	.4byte	.Ldebug_ranges0+0xe60
 	.byte	0x1
-	.byte	0xc6
-	.4byte	0x13a42
+	.byte	0xbf
+	.4byte	0x13a04
+	.uleb128 0x54
+	.4byte	0x12be3
 	.uleb128 0x54
-	.4byte	0x12d83
+	.4byte	0x12bd8
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12bee
-	.8byte	.LBB1649
-	.8byte	.LBE1649-.LBB1649
+	.4byte	0x12d51
+	.8byte	.LBB1659
+	.8byte	.LBE1659-.LBB1659
 	.byte	0x1
-	.byte	0xc7
-	.4byte	0x13a63
+	.byte	0xc0
+	.4byte	0x13a25
 	.uleb128 0x54
-	.4byte	0x12bfa
+	.4byte	0x12d5d
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12da7
-	.8byte	.LBB1651
-	.8byte	.LBE1651-.LBB1651
+	.4byte	0x12d87
+	.8byte	.LBB1661
+	.8byte	.LBE1661-.LBB1661
 	.byte	0x1
-	.byte	0xca
-	.4byte	0x13a91
+	.byte	0xbc
+	.4byte	0x13a53
 	.uleb128 0x54
-	.4byte	0x12db3
+	.4byte	0x12d93
 	.uleb128 0x4e
-	.8byte	.LVL624
-	.4byte	0x13d29
+	.8byte	.LVL631
+	.4byte	0x13d54
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL618
-	.4byte	0x13d65
-	.uleb128 0x4e
-	.8byte	.LVL621
-	.4byte	0x13ad1
-	.uleb128 0x4e
-	.8byte	.LVL625
-	.4byte	0x13ad1
+	.8byte	.LVL628
+	.4byte	0x13a79
 	.byte	0
 	.uleb128 0x84
 	.4byte	.LASF3216
@@ -45774,6 +45745,22 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x56
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.byte	0
+	.byte	0
+	.uleb128 0x57
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x58
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -45788,7 +45775,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x57
+	.uleb128 0x59
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -45803,7 +45790,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x58
+	.uleb128 0x5a
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -45820,7 +45807,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x59
+	.uleb128 0x5b
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -45835,7 +45822,7 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
+	.uleb128 0x5c
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -45850,21 +45837,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x5
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
+	.uleb128 0x5d
 	.uleb128 0xb
 	.byte	0x1
 	.uleb128 0x55
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x31
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x5d
+	.uleb128 0x5e
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -45879,15 +45859,6 @@ __exitcall_ebc_exit:
 	.uleb128 0x5
 	.byte	0
 	.byte	0
-	.uleb128 0x5e
-	.uleb128 0xb
-	.byte	0x1
-	.uleb128 0x11
-	.uleb128 0x1
-	.uleb128 0x12
-	.uleb128 0x7
-	.byte	0
-	.byte	0
 	.uleb128 0x5f
 	.uleb128 0x34
 	.byte	0
@@ -46475,9 +46446,9 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST141:
-	.8byte	.LVL627
-	.8byte	.LVL628
+.LLST118:
+	.8byte	.LVL445
+	.8byte	.LVL446
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -46489,437 +46460,437 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST118:
-	.8byte	.LVL443
-	.8byte	.LVL444
+.LLST119:
+	.8byte	.LVL451
+	.8byte	.LVL452
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST119:
-	.8byte	.LVL447
-	.8byte	.LVL448
+.LLST120:
+	.8byte	.LVL455
+	.8byte	.LVL456
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL489
-	.8byte	.LVL490
+	.8byte	.LVL497
+	.8byte	.LVL498
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL588
-	.8byte	.LVL589
+	.8byte	.LVL596
+	.8byte	.LVL597
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST120:
-	.8byte	.LVL450
-	.8byte	.LVL451
+.LLST121:
+	.8byte	.LVL458
+	.8byte	.LVL459
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL602
-	.8byte	.LVL603
+	.8byte	.LVL610
+	.8byte	.LVL611
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST121:
-	.8byte	.LVL452
-	.8byte	.LVL491
+.LLST122:
+	.8byte	.LVL460
+	.8byte	.LVL499
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL494
-	.8byte	.LVL588
+	.8byte	.LVL502
+	.8byte	.LVL596
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL589
-	.8byte	.LVL595
+	.8byte	.LVL597
+	.8byte	.LVL603
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL596
-	.8byte	.LVL597
+	.8byte	.LVL604
+	.8byte	.LVL605
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL601
-	.8byte	.LVL602
+	.8byte	.LVL609
+	.8byte	.LVL610
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL605
+	.8byte	.LVL613
 	.8byte	.LFE2840
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST122:
-	.8byte	.LVL473
-	.8byte	.LVL484
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL489
+.LLST123:
+	.8byte	.LVL481
 	.8byte	.LVL492
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL494
 	.8byte	.LVL497
+	.8byte	.LVL500
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL578
-	.8byte	.LVL579
+	.8byte	.LVL502
+	.8byte	.LVL505
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL596
-	.8byte	.LVL597
+	.8byte	.LVL586
+	.8byte	.LVL587
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL607
-	.8byte	.LVL608
+	.8byte	.LVL604
+	.8byte	.LVL605
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL615
+	.8byte	.LVL616
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST123:
-	.8byte	.LVL484
-	.8byte	.LVL488
+.LLST124:
+	.8byte	.LVL492
+	.8byte	.LVL496
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL489
-	.8byte	.LVL492
+	.8byte	.LVL497
+	.8byte	.LVL500
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL502
-	.8byte	.LVL503
+	.8byte	.LVL510
+	.8byte	.LVL511
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL601
-	.8byte	.LVL602
+	.8byte	.LVL609
+	.8byte	.LVL610
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL607
-	.8byte	.LVL608
+	.8byte	.LVL615
+	.8byte	.LVL616
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST124:
-	.8byte	.LVL503
-	.8byte	.LVL504-1
+.LLST125:
+	.8byte	.LVL511
+	.8byte	.LVL512-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST125:
-	.8byte	.LVL508
-	.8byte	.LVL511
+.LLST126:
+	.8byte	.LVL516
+	.8byte	.LVL519
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST126:
-	.8byte	.LVL509
-	.8byte	.LVL510
+.LLST127:
+	.8byte	.LVL517
+	.8byte	.LVL518
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST127:
-	.8byte	.LVL489
-	.8byte	.LVL492
+.LLST128:
+	.8byte	.LVL497
+	.8byte	.LVL500
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL513
 	.8byte	.LVL521
+	.8byte	.LVL529
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL590
-	.8byte	.LVL592
+	.8byte	.LVL598
+	.8byte	.LVL600
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL592
-	.8byte	.LVL593
+	.8byte	.LVL600
+	.8byte	.LVL601
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL593
-	.8byte	.LVL595
+	.8byte	.LVL601
+	.8byte	.LVL603
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL607
-	.8byte	.LVL608
+	.8byte	.LVL615
+	.8byte	.LVL616
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST128:
-	.8byte	.LVL516
-	.8byte	.LVL519
+.LLST129:
+	.8byte	.LVL524
+	.8byte	.LVL527
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST129:
-	.8byte	.LVL517
-	.8byte	.LVL518
+.LLST130:
+	.8byte	.LVL525
+	.8byte	.LVL526
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST130:
-	.8byte	.LVL520
-	.8byte	.LVL522-1
+.LLST131:
+	.8byte	.LVL528
+	.8byte	.LVL530-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST131:
-	.8byte	.LVL489
-	.8byte	.LVL494
+.LLST132:
+	.8byte	.LVL497
+	.8byte	.LVL502
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL527
-	.8byte	.LVL561
+	.8byte	.LVL535
+	.8byte	.LVL569
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL561
-	.8byte	.LVL562
+	.8byte	.LVL569
+	.8byte	.LVL570
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL565
-	.8byte	.LVL578
+	.8byte	.LVL573
+	.8byte	.LVL586
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL579
-	.8byte	.LVL584
+	.8byte	.LVL587
+	.8byte	.LVL592
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL607
-	.8byte	.LVL614
+	.8byte	.LVL615
+	.8byte	.LVL622
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
 	.8byte	0
 	.8byte	0
-.LLST132:
-	.8byte	.LVL489
-	.8byte	.LVL494
+.LLST133:
+	.8byte	.LVL497
+	.8byte	.LVL502
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL527
-	.8byte	.LVL575
+	.8byte	.LVL535
+	.8byte	.LVL583
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL575
-	.8byte	.LVL576
+	.8byte	.LVL583
+	.8byte	.LVL584
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL579
-	.8byte	.LVL584
+	.8byte	.LVL587
+	.8byte	.LVL592
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL607
+	.8byte	.LVL615
 	.8byte	.LFE2840
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
 	.8byte	0
 	.8byte	0
-.LLST133:
-	.8byte	.LVL489
-	.8byte	.LVL492
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL533
-	.8byte	.LVL544
+.LLST134:
+	.8byte	.LVL497
+	.8byte	.LVL500
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL548
-	.8byte	.LVL557
+	.8byte	.LVL541
+	.8byte	.LVL552
 	.2byte	0x1
 	.byte	0x69
+	.8byte	.LVL556
 	.8byte	.LVL565
-	.8byte	.LVL567
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL572
-	.8byte	.LVL578
+	.8byte	.LVL573
+	.8byte	.LVL575
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL607
-	.8byte	.LVL611
+	.8byte	.LVL580
+	.8byte	.LVL586
 	.2byte	0x1
 	.byte	0x69
 	.8byte	.LVL615
+	.8byte	.LVL619
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL623
 	.8byte	.LFE2840
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST134:
-	.8byte	.LVL489
-	.8byte	.LVL493
+.LLST135:
+	.8byte	.LVL497
+	.8byte	.LVL501
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL538
-	.8byte	.LVL557
+	.8byte	.LVL546
+	.8byte	.LVL565
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL564
-	.8byte	.LVL578
+	.8byte	.LVL572
+	.8byte	.LVL586
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL579
-	.8byte	.LVL584
+	.8byte	.LVL587
+	.8byte	.LVL592
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL607
-	.8byte	.LVL611
+	.8byte	.LVL615
+	.8byte	.LVL619
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST135:
-	.8byte	.LVL489
-	.8byte	.LVL492
+.LLST136:
+	.8byte	.LVL497
+	.8byte	.LVL500
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL529
-	.8byte	.LVL535
+	.8byte	.LVL537
+	.8byte	.LVL543
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL536
-	.8byte	.LVL539
+	.8byte	.LVL544
+	.8byte	.LVL547
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL548
-	.8byte	.LVL565
+	.8byte	.LVL556
+	.8byte	.LVL573
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL607
-	.8byte	.LVL608
+	.8byte	.LVL615
+	.8byte	.LVL616
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL611
+	.8byte	.LVL619
 	.8byte	.LFE2840
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST136:
-	.8byte	.LVL489
-	.8byte	.LVL493
+.LLST137:
+	.8byte	.LVL497
+	.8byte	.LVL501
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL531
-	.8byte	.LVL538
+	.8byte	.LVL539
+	.8byte	.LVL546
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL540
-	.8byte	.LVL564
+	.8byte	.LVL548
+	.8byte	.LVL572
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL570
-	.8byte	.LVL572
+	.8byte	.LVL578
+	.8byte	.LVL580
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL579
-	.8byte	.LVL584
+	.8byte	.LVL587
+	.8byte	.LVL592
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL607
-	.8byte	.LVL608
+	.8byte	.LVL615
+	.8byte	.LVL616
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL611
+	.8byte	.LVL619
 	.8byte	.LFE2840
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST137:
-	.8byte	.LVL489
-	.8byte	.LVL493
+.LLST138:
+	.8byte	.LVL497
+	.8byte	.LVL501
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL534
-	.8byte	.LVL557
+	.8byte	.LVL542
+	.8byte	.LVL565
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL560
-	.8byte	.LVL578
+	.8byte	.LVL568
+	.8byte	.LVL586
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL579
-	.8byte	.LVL584
+	.8byte	.LVL587
+	.8byte	.LVL592
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL607
-	.8byte	.LVL611
+	.8byte	.LVL615
+	.8byte	.LVL619
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL611
-	.8byte	.LVL612
+	.8byte	.LVL619
+	.8byte	.LVL620
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL612
+	.8byte	.LVL620
 	.8byte	.LFE2840
 	.2byte	0x1
 	.byte	0x6b
 	.8byte	0
 	.8byte	0
-.LLST138:
-	.8byte	.LVL489
-	.8byte	.LVL492
+.LLST139:
+	.8byte	.LVL497
+	.8byte	.LVL500
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL535
-	.8byte	.LVL557
+	.8byte	.LVL543
+	.8byte	.LVL565
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL565
-	.8byte	.LVL578
+	.8byte	.LVL573
+	.8byte	.LVL586
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL579
-	.8byte	.LVL584
+	.8byte	.LVL587
+	.8byte	.LVL592
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL607
-	.8byte	.LVL608
+	.8byte	.LVL615
+	.8byte	.LVL616
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL608
-	.8byte	.LVL609
+	.8byte	.LVL616
+	.8byte	.LVL617
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL609
-	.8byte	.LVL611
+	.8byte	.LVL617
+	.8byte	.LVL619
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST139:
-	.8byte	.LVL489
-	.8byte	.LVL492
+.LLST140:
+	.8byte	.LVL497
+	.8byte	.LVL500
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL544
-	.8byte	.LVL557
+	.8byte	.LVL552
+	.8byte	.LVL565
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL570
-	.8byte	.LVL572
+	.8byte	.LVL578
+	.8byte	.LVL580
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL579
-	.8byte	.LVL581
+	.8byte	.LVL587
+	.8byte	.LVL589
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL607
-	.8byte	.LVL608
+	.8byte	.LVL615
+	.8byte	.LVL616
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
@@ -47882,436 +47853,436 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	0
 .LLST150:
+	.8byte	.LVL656
 	.8byte	.LVL657
-	.8byte	.LVL658
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST151:
-	.8byte	.LVL659
-	.8byte	.LVL666
+	.8byte	.LVL658
+	.8byte	.LVL665
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL670
+	.8byte	.LVL669
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST152:
-	.8byte	.LVL661
-	.8byte	.LVL668
+	.8byte	.LVL660
+	.8byte	.LVL667
 	.2byte	0x1
 	.byte	0x67
+	.8byte	.LVL669
 	.8byte	.LVL670
-	.8byte	.LVL671
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL671
-	.8byte	.LVL681
+	.8byte	.LVL670
+	.8byte	.LVL680
 	.2byte	0x1
 	.byte	0x67
+	.8byte	.LVL680
 	.8byte	.LVL681
-	.8byte	.LVL682
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL682
-	.8byte	.LVL691
+	.8byte	.LVL681
+	.8byte	.LVL690
 	.2byte	0x1
 	.byte	0x67
+	.8byte	.LVL690
 	.8byte	.LVL691
-	.8byte	.LVL692
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL692
-	.8byte	.LVL708
+	.8byte	.LVL691
+	.8byte	.LVL707
 	.2byte	0x1
 	.byte	0x67
+	.8byte	.LVL707
 	.8byte	.LVL708
-	.8byte	.LVL709
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL709
-	.8byte	.LVL768
+	.8byte	.LVL708
+	.8byte	.LVL767
 	.2byte	0x1
 	.byte	0x67
+	.8byte	.LVL767
 	.8byte	.LVL768
-	.8byte	.LVL769
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL769
+	.8byte	.LVL768
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x67
 	.8byte	0
 	.8byte	0
 .LLST153:
-	.8byte	.LVL660
-	.8byte	.LVL667
+	.8byte	.LVL659
+	.8byte	.LVL666
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL670
+	.8byte	.LVL669
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
 .LLST154:
+	.8byte	.LVL697
 	.8byte	.LVL698
-	.8byte	.LVL699
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST155:
-	.8byte	.LVL661
-	.8byte	.LVL669
+	.8byte	.LVL660
+	.8byte	.LVL668
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL670
-	.8byte	.LVL735
+	.8byte	.LVL669
+	.8byte	.LVL734
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL750
-	.8byte	.LVL763
+	.8byte	.LVL749
+	.8byte	.LVL762
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL765
-	.8byte	.LVL782
+	.8byte	.LVL764
+	.8byte	.LVL781
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL788
-	.8byte	.LVL793
+	.8byte	.LVL787
+	.8byte	.LVL792
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL795
+	.8byte	.LVL794
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
 .LLST170:
+	.8byte	.LVL753
 	.8byte	.LVL754
-	.8byte	.LVL755
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL784
-	.8byte	.LVL785-1
+	.8byte	.LVL783
+	.8byte	.LVL784-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST158:
+	.8byte	.LVL726
 	.8byte	.LVL727
-	.8byte	.LVL728
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL758
-	.8byte	.LVL759-1
+	.8byte	.LVL757
+	.8byte	.LVL758-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST157:
+	.8byte	.LVL671
 	.8byte	.LVL672
-	.8byte	.LVL673
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL712
-	.8byte	.LVL713-1
+	.8byte	.LVL711
+	.8byte	.LVL712-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST156:
+	.8byte	.LVL660
 	.8byte	.LVL661
-	.8byte	.LVL662
 	.2byte	0x1
 	.byte	0x50
+	.8byte	.LVL673
 	.8byte	.LVL674
-	.8byte	.LVL675
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL677
-	.8byte	.LVL678-1
+	.8byte	.LVL676
+	.8byte	.LVL677-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST159:
-	.8byte	.LVL702
-	.8byte	.LVL703-1
+	.8byte	.LVL701
+	.8byte	.LVL702-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL718
-	.8byte	.LVL719-1
+	.8byte	.LVL717
+	.8byte	.LVL718-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL731
-	.8byte	.LVL750
+	.8byte	.LVL730
+	.8byte	.LVL749
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL763
-	.8byte	.LVL764-1
+	.8byte	.LVL762
+	.8byte	.LVL763-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL769
-	.8byte	.LVL770-1
+	.8byte	.LVL768
+	.8byte	.LVL769-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL793
-	.8byte	.LVL794-1
+	.8byte	.LVL792
+	.8byte	.LVL793-1
 	.2byte	0x1
 	.byte	0x61
 	.8byte	0
 	.8byte	0
 .LLST160:
+	.8byte	.LVL739
 	.8byte	.LVL740
-	.8byte	.LVL741
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST161:
-	.8byte	.LVL702
-	.8byte	.LVL703-1
+	.8byte	.LVL701
+	.8byte	.LVL702-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL718
-	.8byte	.LVL719-1
+	.8byte	.LVL717
+	.8byte	.LVL718-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL736
-	.8byte	.LVL739
+	.8byte	.LVL735
+	.8byte	.LVL738
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL740
-	.8byte	.LVL747
+	.8byte	.LVL739
+	.8byte	.LVL746
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL763
-	.8byte	.LVL764-1
+	.8byte	.LVL762
+	.8byte	.LVL763-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL769
-	.8byte	.LVL770-1
+	.8byte	.LVL768
+	.8byte	.LVL769-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL793
-	.8byte	.LVL794-1
+	.8byte	.LVL792
+	.8byte	.LVL793-1
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST162:
-	.8byte	.LVL702
-	.8byte	.LVL703-1
+	.8byte	.LVL701
+	.8byte	.LVL702-1
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL718
-	.8byte	.LVL719-1
+	.8byte	.LVL717
+	.8byte	.LVL718-1
 	.2byte	0x1
 	.byte	0x57
+	.8byte	.LVL735
 	.8byte	.LVL736
-	.8byte	.LVL737
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL738
-	.8byte	.LVL750
+	.8byte	.LVL737
+	.8byte	.LVL749
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL763
-	.8byte	.LVL764-1
+	.8byte	.LVL762
+	.8byte	.LVL763-1
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL769
-	.8byte	.LVL770-1
+	.8byte	.LVL768
+	.8byte	.LVL769-1
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL793
-	.8byte	.LVL794-1
+	.8byte	.LVL792
+	.8byte	.LVL793-1
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
 .LLST163:
-	.8byte	.LVL739
-	.8byte	.LVL742
+	.8byte	.LVL738
+	.8byte	.LVL741
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL745
-	.8byte	.LVL748
+	.8byte	.LVL744
+	.8byte	.LVL747
 	.2byte	0x1
 	.byte	0x50
+	.8byte	.LVL748
 	.8byte	.LVL749
-	.8byte	.LVL750
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST164:
-	.8byte	.LVL702
-	.8byte	.LVL703-1
+	.8byte	.LVL701
+	.8byte	.LVL702-1
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL718
-	.8byte	.LVL719-1
+	.8byte	.LVL717
+	.8byte	.LVL718-1
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL736
-	.8byte	.LVL739
+	.8byte	.LVL735
+	.8byte	.LVL738
 	.2byte	0x1
 	.byte	0x56
+	.8byte	.LVL742
 	.8byte	.LVL743
-	.8byte	.LVL744
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL744
-	.8byte	.LVL746
+	.8byte	.LVL743
+	.8byte	.LVL745
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL763
-	.8byte	.LVL764-1
+	.8byte	.LVL762
+	.8byte	.LVL763-1
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL769
-	.8byte	.LVL770-1
+	.8byte	.LVL768
+	.8byte	.LVL769-1
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL793
-	.8byte	.LVL794-1
+	.8byte	.LVL792
+	.8byte	.LVL793-1
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
 .LLST165:
-	.8byte	.LVL702
-	.8byte	.LVL703-1
+	.8byte	.LVL701
+	.8byte	.LVL702-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL718
-	.8byte	.LVL719-1
+	.8byte	.LVL717
+	.8byte	.LVL718-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL733
-	.8byte	.LVL750
+	.8byte	.LVL732
+	.8byte	.LVL749
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL763
-	.8byte	.LVL764-1
+	.8byte	.LVL762
+	.8byte	.LVL763-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL769
-	.8byte	.LVL770-1
+	.8byte	.LVL768
+	.8byte	.LVL769-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL793
-	.8byte	.LVL794-1
+	.8byte	.LVL792
+	.8byte	.LVL793-1
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST166:
-	.8byte	.LVL702
-	.8byte	.LVL703-1
+	.8byte	.LVL701
+	.8byte	.LVL702-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL718
-	.8byte	.LVL719-1
+	.8byte	.LVL717
+	.8byte	.LVL718-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL730
-	.8byte	.LVL750
+	.8byte	.LVL729
+	.8byte	.LVL749
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL763
-	.8byte	.LVL764-1
+	.8byte	.LVL762
+	.8byte	.LVL763-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL769
-	.8byte	.LVL770-1
+	.8byte	.LVL768
+	.8byte	.LVL769-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL793
-	.8byte	.LVL794-1
+	.8byte	.LVL792
+	.8byte	.LVL793-1
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
 .LLST167:
-	.8byte	.LVL702
-	.8byte	.LVL703-1
+	.8byte	.LVL701
+	.8byte	.LVL702-1
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL718
-	.8byte	.LVL719-1
+	.8byte	.LVL717
+	.8byte	.LVL718-1
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL734
-	.8byte	.LVL737
+	.8byte	.LVL733
+	.8byte	.LVL736
 	.2byte	0x1
 	.byte	0x5f
+	.8byte	.LVL736
 	.8byte	.LVL737
-	.8byte	.LVL738
 	.2byte	0x1
 	.byte	0x57
-	.8byte	.LVL763
-	.8byte	.LVL764-1
+	.8byte	.LVL762
+	.8byte	.LVL763-1
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL769
-	.8byte	.LVL770-1
+	.8byte	.LVL768
+	.8byte	.LVL769-1
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL793
-	.8byte	.LVL794-1
+	.8byte	.LVL792
+	.8byte	.LVL793-1
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
 .LLST168:
-	.8byte	.LVL702
-	.8byte	.LVL703-1
+	.8byte	.LVL701
+	.8byte	.LVL702-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL718
-	.8byte	.LVL719-1
+	.8byte	.LVL717
+	.8byte	.LVL718-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL732
-	.8byte	.LVL750
+	.8byte	.LVL731
+	.8byte	.LVL749
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL763
-	.8byte	.LVL764-1
+	.8byte	.LVL762
+	.8byte	.LVL763-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL769
-	.8byte	.LVL770-1
+	.8byte	.LVL768
+	.8byte	.LVL769-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL793
-	.8byte	.LVL794-1
+	.8byte	.LVL792
+	.8byte	.LVL793-1
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
 .LLST169:
-	.8byte	.LVL697
-	.8byte	.LVL700-1
+	.8byte	.LVL696
+	.8byte	.LVL699-1
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL721
-	.8byte	.LVL722-1
+	.8byte	.LVL720
+	.8byte	.LVL721-1
 	.2byte	0x1
 	.byte	0x56
+	.8byte	.LVL750
 	.8byte	.LVL751
-	.8byte	.LVL752
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL777
-	.8byte	.LVL778-1
+	.8byte	.LVL776
+	.8byte	.LVL777-1
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
@@ -48483,85 +48454,85 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	0
 .LLST148:
+	.8byte	.LVL649
 	.8byte	.LVL650
-	.8byte	.LVL651
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST149:
-	.8byte	.LVL652
-	.8byte	.LVL656
+	.8byte	.LVL651
+	.8byte	.LVL655
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST142:
-	.8byte	.LVL633
-	.8byte	.LVL638
+	.8byte	.LVL632
+	.8byte	.LVL637
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL638
-	.8byte	.LVL647
+	.8byte	.LVL637
+	.8byte	.LVL646
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL647
+	.8byte	.LVL646
 	.8byte	.LFE2806
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST143:
-	.8byte	.LVL633
-	.8byte	.LVL638
+	.8byte	.LVL632
+	.8byte	.LVL637
 	.2byte	0x1
 	.byte	0x54
+	.8byte	.LVL641
 	.8byte	.LVL642
-	.8byte	.LVL643
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL648
+	.8byte	.LVL647
 	.8byte	.LFE2806
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST144:
-	.8byte	.LVL634
-	.8byte	.LVL649
+	.8byte	.LVL633
+	.8byte	.LVL648
 	.2byte	0x1
 	.byte	0x6e
 	.8byte	0
 	.8byte	0
 .LLST145:
+	.8byte	.LVL638
 	.8byte	.LVL639
-	.8byte	.LVL640
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
 .LLST146:
+	.8byte	.LVL636
 	.8byte	.LVL637
-	.8byte	.LVL638
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL639
-	.8byte	.LVL644
+	.8byte	.LVL638
+	.8byte	.LVL643
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL646
+	.8byte	.LVL645
 	.8byte	.LFE2806
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
 	.8byte	0
 .LLST147:
-	.8byte	.LVL638
-	.8byte	.LVL641
+	.8byte	.LVL637
+	.8byte	.LVL640
 	.2byte	0x1
 	.byte	0x54
+	.8byte	.LVL644
 	.8byte	.LVL645
-	.8byte	.LVL646
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
@@ -48865,37 +48836,37 @@ __exitcall_ebc_exit:
 	.8byte	0
 .LLST116:
 	.8byte	.LVL434
-	.8byte	.LVL435
+	.8byte	.LVL436
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL435
-	.8byte	.LVL442
+	.8byte	.LVL436
+	.8byte	.LVL440
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL441
+	.8byte	.LVL444
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
 .LLST117:
 	.8byte	.LVL434
-	.8byte	.LVL436-1
+	.8byte	.LVL435
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL436-1
-	.8byte	.LVL441
-	.2byte	0x1
-	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST140:
-	.8byte	.LVL616
-	.8byte	.LVL617
+.LLST141:
+	.8byte	.LVL624
+	.8byte	.LVL625
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL617
-	.8byte	.LVL622
+	.8byte	.LVL625
+	.8byte	.LVL629
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL623
-	.8byte	.LVL626
+	.8byte	.LVL630
+	.8byte	.LFE2854
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -48918,522 +48889,522 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
 .Ldebug_ranges0:
-	.8byte	.LBB910
-	.8byte	.LBE910
-	.8byte	.LBB913
-	.8byte	.LBE913
-	.8byte	0
-	.8byte	0
 	.8byte	.LBB914
 	.8byte	.LBE914
-	.8byte	.LBB945
-	.8byte	.LBE945
-	.8byte	.LBB946
-	.8byte	.LBE946
-	.8byte	.LBB1011
-	.8byte	.LBE1011
-	.8byte	0
-	.8byte	0
 	.8byte	.LBB917
 	.8byte	.LBE917
-	.8byte	.LBB929
-	.8byte	.LBE929
-	.8byte	.LBB930
-	.8byte	.LBE930
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB933
-	.8byte	.LBE933
-	.8byte	.LBB938
-	.8byte	.LBE938
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB947
-	.8byte	.LBE947
-	.8byte	.LBB1168
-	.8byte	.LBE1168
-	.8byte	.LBB1169
-	.8byte	.LBE1169
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB918
+	.8byte	.LBE918
+	.8byte	.LBB949
+	.8byte	.LBE949
 	.8byte	.LBB950
 	.8byte	.LBE950
-	.8byte	.LBB970
-	.8byte	.LBE970
-	.8byte	.LBB971
-	.8byte	.LBE971
+	.8byte	.LBB1015
+	.8byte	.LBE1015
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB964
-	.8byte	.LBE964
-	.8byte	.LBB969
-	.8byte	.LBE969
+	.8byte	.LBB921
+	.8byte	.LBE921
+	.8byte	.LBB933
+	.8byte	.LBE933
+	.8byte	.LBB934
+	.8byte	.LBE934
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB976
-	.8byte	.LBE976
-	.8byte	.LBB1179
-	.8byte	.LBE1179
-	.8byte	.LBB1181
-	.8byte	.LBE1181
-	.8byte	.LBB1182
-	.8byte	.LBE1182
+	.8byte	.LBB937
+	.8byte	.LBE937
+	.8byte	.LBB942
+	.8byte	.LBE942
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB982
-	.8byte	.LBE982
-	.8byte	.LBB1166
-	.8byte	.LBE1166
-	.8byte	.LBB1167
-	.8byte	.LBE1167
+	.8byte	.LBB951
+	.8byte	.LBE951
+	.8byte	.LBB1172
+	.8byte	.LBE1172
+	.8byte	.LBB1173
+	.8byte	.LBE1173
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB985
-	.8byte	.LBE985
-	.8byte	.LBB1005
-	.8byte	.LBE1005
-	.8byte	.LBB1006
-	.8byte	.LBE1006
+	.8byte	.LBB954
+	.8byte	.LBE954
+	.8byte	.LBB974
+	.8byte	.LBE974
+	.8byte	.LBB975
+	.8byte	.LBE975
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB999
-	.8byte	.LBE999
-	.8byte	.LBB1004
-	.8byte	.LBE1004
+	.8byte	.LBB968
+	.8byte	.LBE968
+	.8byte	.LBB973
+	.8byte	.LBE973
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1012
-	.8byte	.LBE1012
-	.8byte	.LBB1045
-	.8byte	.LBE1045
-	.8byte	.LBB1176
-	.8byte	.LBE1176
-	.8byte	.LBB1177
-	.8byte	.LBE1177
+	.8byte	.LBB980
+	.8byte	.LBE980
+	.8byte	.LBB1183
+	.8byte	.LBE1183
+	.8byte	.LBB1185
+	.8byte	.LBE1185
+	.8byte	.LBB1186
+	.8byte	.LBE1186
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1015
-	.8byte	.LBE1015
-	.8byte	.LBB1028
-	.8byte	.LBE1028
-	.8byte	.LBB1037
-	.8byte	.LBE1037
-	.8byte	.LBB1038
-	.8byte	.LBE1038
+	.8byte	.LBB986
+	.8byte	.LBE986
+	.8byte	.LBB1170
+	.8byte	.LBE1170
+	.8byte	.LBB1171
+	.8byte	.LBE1171
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1031
-	.8byte	.LBE1031
-	.8byte	.LBB1036
-	.8byte	.LBE1036
+	.8byte	.LBB989
+	.8byte	.LBE989
+	.8byte	.LBB1009
+	.8byte	.LBE1009
+	.8byte	.LBB1010
+	.8byte	.LBE1010
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1046
-	.8byte	.LBE1046
-	.8byte	.LBB1081
-	.8byte	.LBE1081
-	.8byte	.LBB1172
-	.8byte	.LBE1172
-	.8byte	.LBB1173
-	.8byte	.LBE1173
-	.8byte	.LBB1183
-	.8byte	.LBE1183
+	.8byte	.LBB1003
+	.8byte	.LBE1003
+	.8byte	.LBB1008
+	.8byte	.LBE1008
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1016
+	.8byte	.LBE1016
 	.8byte	.LBB1049
 	.8byte	.LBE1049
-	.8byte	.LBB1062
-	.8byte	.LBE1062
-	.8byte	.LBB1071
-	.8byte	.LBE1071
-	.8byte	.LBB1072
-	.8byte	.LBE1072
+	.8byte	.LBB1180
+	.8byte	.LBE1180
+	.8byte	.LBB1181
+	.8byte	.LBE1181
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1065
-	.8byte	.LBE1065
-	.8byte	.LBB1070
-	.8byte	.LBE1070
+	.8byte	.LBB1019
+	.8byte	.LBE1019
+	.8byte	.LBB1032
+	.8byte	.LBE1032
+	.8byte	.LBB1041
+	.8byte	.LBE1041
+	.8byte	.LBB1042
+	.8byte	.LBE1042
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1082
-	.8byte	.LBE1082
-	.8byte	.LBB1093
-	.8byte	.LBE1093
+	.8byte	.LBB1035
+	.8byte	.LBE1035
+	.8byte	.LBB1040
+	.8byte	.LBE1040
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1050
+	.8byte	.LBE1050
 	.8byte	.LBB1085
 	.8byte	.LBE1085
-	.8byte	.LBB1090
-	.8byte	.LBE1090
+	.8byte	.LBB1176
+	.8byte	.LBE1176
+	.8byte	.LBB1177
+	.8byte	.LBE1177
+	.8byte	.LBB1187
+	.8byte	.LBE1187
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1086
-	.8byte	.LBE1086
-	.8byte	.LBB1089
-	.8byte	.LBE1089
+	.8byte	.LBB1053
+	.8byte	.LBE1053
+	.8byte	.LBB1066
+	.8byte	.LBE1066
+	.8byte	.LBB1075
+	.8byte	.LBE1075
+	.8byte	.LBB1076
+	.8byte	.LBE1076
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1094
-	.8byte	.LBE1094
-	.8byte	.LBB1129
-	.8byte	.LBE1129
-	.8byte	.LBB1170
-	.8byte	.LBE1170
-	.8byte	.LBB1171
-	.8byte	.LBE1171
-	.8byte	.LBB1178
-	.8byte	.LBE1178
+	.8byte	.LBB1069
+	.8byte	.LBE1069
+	.8byte	.LBB1074
+	.8byte	.LBE1074
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1086
+	.8byte	.LBE1086
 	.8byte	.LBB1097
 	.8byte	.LBE1097
-	.8byte	.LBB1110
-	.8byte	.LBE1110
-	.8byte	.LBB1111
-	.8byte	.LBE1111
-	.8byte	.LBB1112
-	.8byte	.LBE1112
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1115
-	.8byte	.LBE1115
-	.8byte	.LBB1120
-	.8byte	.LBE1120
+	.8byte	.LBB1089
+	.8byte	.LBE1089
+	.8byte	.LBB1094
+	.8byte	.LBE1094
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1090
+	.8byte	.LBE1090
+	.8byte	.LBB1093
+	.8byte	.LBE1093
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1130
-	.8byte	.LBE1130
-	.8byte	.LBB1165
-	.8byte	.LBE1165
+	.8byte	.LBB1098
+	.8byte	.LBE1098
+	.8byte	.LBB1133
+	.8byte	.LBE1133
 	.8byte	.LBB1174
 	.8byte	.LBE1174
 	.8byte	.LBB1175
 	.8byte	.LBE1175
-	.8byte	.LBB1180
-	.8byte	.LBE1180
+	.8byte	.LBB1182
+	.8byte	.LBE1182
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1133
-	.8byte	.LBE1133
-	.8byte	.LBB1146
-	.8byte	.LBE1146
-	.8byte	.LBB1147
-	.8byte	.LBE1147
-	.8byte	.LBB1148
-	.8byte	.LBE1148
+	.8byte	.LBB1101
+	.8byte	.LBE1101
+	.8byte	.LBB1114
+	.8byte	.LBE1114
+	.8byte	.LBB1115
+	.8byte	.LBE1115
+	.8byte	.LBB1116
+	.8byte	.LBE1116
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1119
+	.8byte	.LBE1119
+	.8byte	.LBB1124
+	.8byte	.LBE1124
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1134
+	.8byte	.LBE1134
+	.8byte	.LBB1169
+	.8byte	.LBE1169
+	.8byte	.LBB1178
+	.8byte	.LBE1178
+	.8byte	.LBB1179
+	.8byte	.LBE1179
+	.8byte	.LBB1184
+	.8byte	.LBE1184
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1137
+	.8byte	.LBE1137
+	.8byte	.LBB1150
+	.8byte	.LBE1150
 	.8byte	.LBB1151
 	.8byte	.LBE1151
-	.8byte	.LBB1156
-	.8byte	.LBE1156
+	.8byte	.LBB1152
+	.8byte	.LBE1152
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1188
-	.8byte	.LBE1188
-	.8byte	.LBB1191
-	.8byte	.LBE1191
+	.8byte	.LBB1155
+	.8byte	.LBE1155
+	.8byte	.LBB1160
+	.8byte	.LBE1160
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1192
 	.8byte	.LBE1192
-	.8byte	.LBB1204
-	.8byte	.LBE1204
-	.8byte	.LBB1206
-	.8byte	.LBE1206
+	.8byte	.LBB1195
+	.8byte	.LBE1195
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1196
+	.8byte	.LBE1196
 	.8byte	.LBB1208
 	.8byte	.LBE1208
+	.8byte	.LBB1210
+	.8byte	.LBE1210
+	.8byte	.LBB1212
+	.8byte	.LBE1212
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1197
-	.8byte	.LBE1197
-	.8byte	.LBB1205
-	.8byte	.LBE1205
-	.8byte	.LBB1207
-	.8byte	.LBE1207
-	.8byte	.LBB1216
-	.8byte	.LBE1216
-	.8byte	.LBB1218
-	.8byte	.LBE1218
+	.8byte	.LBB1201
+	.8byte	.LBE1201
+	.8byte	.LBB1209
+	.8byte	.LBE1209
+	.8byte	.LBB1211
+	.8byte	.LBE1211
 	.8byte	.LBB1220
 	.8byte	.LBE1220
+	.8byte	.LBB1222
+	.8byte	.LBE1222
+	.8byte	.LBB1224
+	.8byte	.LBE1224
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1209
-	.8byte	.LBE1209
-	.8byte	.LBB1217
-	.8byte	.LBE1217
-	.8byte	.LBB1219
-	.8byte	.LBE1219
-	.8byte	.LBB1226
-	.8byte	.LBE1226
-	.8byte	.LBB1228
-	.8byte	.LBE1228
+	.8byte	.LBB1213
+	.8byte	.LBE1213
+	.8byte	.LBB1221
+	.8byte	.LBE1221
+	.8byte	.LBB1223
+	.8byte	.LBE1223
 	.8byte	.LBB1230
 	.8byte	.LBE1230
+	.8byte	.LBB1232
+	.8byte	.LBE1232
+	.8byte	.LBB1234
+	.8byte	.LBE1234
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1221
-	.8byte	.LBE1221
-	.8byte	.LBB1227
-	.8byte	.LBE1227
-	.8byte	.LBB1229
-	.8byte	.LBE1229
+	.8byte	.LBB1225
+	.8byte	.LBE1225
 	.8byte	.LBB1231
 	.8byte	.LBE1231
+	.8byte	.LBB1233
+	.8byte	.LBE1233
+	.8byte	.LBB1235
+	.8byte	.LBE1235
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1232
-	.8byte	.LBE1232
-	.8byte	.LBB1241
-	.8byte	.LBE1241
+	.8byte	.LBB1236
+	.8byte	.LBE1236
+	.8byte	.LBB1245
+	.8byte	.LBE1245
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1242
-	.8byte	.LBE1242
-	.8byte	.LBB1251
-	.8byte	.LBE1251
-	.8byte	.LBB1252
-	.8byte	.LBE1252
-	.8byte	.LBB1263
-	.8byte	.LBE1263
+	.8byte	.LBB1246
+	.8byte	.LBE1246
+	.8byte	.LBB1255
+	.8byte	.LBE1255
+	.8byte	.LBB1256
+	.8byte	.LBE1256
+	.8byte	.LBB1267
+	.8byte	.LBE1267
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1244
-	.8byte	.LBE1244
-	.8byte	.LBB1247
-	.8byte	.LBE1247
+	.8byte	.LBB1248
+	.8byte	.LBE1248
+	.8byte	.LBB1251
+	.8byte	.LBE1251
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1253
-	.8byte	.LBE1253
 	.8byte	.LBB1257
 	.8byte	.LBE1257
-	.8byte	.LBB1258
-	.8byte	.LBE1258
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1272
-	.8byte	.LBE1272
-	.8byte	.LBB1279
-	.8byte	.LBE1279
-	.8byte	.LBB1280
-	.8byte	.LBE1280
+	.8byte	.LBB1261
+	.8byte	.LBE1261
+	.8byte	.LBB1262
+	.8byte	.LBE1262
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1273
-	.8byte	.LBE1273
-	.8byte	.LBB1278
-	.8byte	.LBE1278
+	.8byte	.LBB1276
+	.8byte	.LBE1276
+	.8byte	.LBB1283
+	.8byte	.LBE1283
+	.8byte	.LBB1284
+	.8byte	.LBE1284
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1287
-	.8byte	.LBE1287
-	.8byte	.LBB1290
-	.8byte	.LBE1290
+	.8byte	.LBB1277
+	.8byte	.LBE1277
+	.8byte	.LBB1282
+	.8byte	.LBE1282
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1438
-	.8byte	.LBE1438
-	.8byte	.LBB1441
-	.8byte	.LBE1441
+	.8byte	.LBB1289
+	.8byte	.LBE1289
+	.8byte	.LBB1292
+	.8byte	.LBE1292
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1448
 	.8byte	.LBE1448
-	.8byte	.LBB1547
-	.8byte	.LBE1547
-	.8byte	.LBB1548
-	.8byte	.LBE1548
-	.8byte	.LBB1549
-	.8byte	.LBE1549
-	.8byte	.LBB1586
-	.8byte	.LBE1586
+	.8byte	.LBB1451
+	.8byte	.LBE1451
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1458
+	.8byte	.LBE1458
+	.8byte	.LBB1557
+	.8byte	.LBE1557
+	.8byte	.LBB1558
+	.8byte	.LBE1558
+	.8byte	.LBB1559
+	.8byte	.LBE1559
+	.8byte	.LBB1596
+	.8byte	.LBE1596
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1450
-	.8byte	.LBE1450
-	.8byte	.LBB1459
-	.8byte	.LBE1459
 	.8byte	.LBB1460
 	.8byte	.LBE1460
-	.8byte	.LBB1461
-	.8byte	.LBE1461
+	.8byte	.LBB1469
+	.8byte	.LBE1469
+	.8byte	.LBB1470
+	.8byte	.LBE1470
+	.8byte	.LBB1471
+	.8byte	.LBE1471
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1507
-	.8byte	.LBE1507
-	.8byte	.LBB1541
-	.8byte	.LBE1541
-	.8byte	.LBB1542
-	.8byte	.LBE1542
+	.8byte	.LBB1517
+	.8byte	.LBE1517
+	.8byte	.LBB1551
+	.8byte	.LBE1551
+	.8byte	.LBB1552
+	.8byte	.LBE1552
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1514
-	.8byte	.LBE1514
-	.8byte	.LBB1539
-	.8byte	.LBE1539
-	.8byte	.LBB1540
-	.8byte	.LBE1540
+	.8byte	.LBB1524
+	.8byte	.LBE1524
+	.8byte	.LBB1549
+	.8byte	.LBE1549
+	.8byte	.LBB1550
+	.8byte	.LBE1550
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1521
-	.8byte	.LBE1521
-	.8byte	.LBB1537
-	.8byte	.LBE1537
-	.8byte	.LBB1538
-	.8byte	.LBE1538
+	.8byte	.LBB1531
+	.8byte	.LBE1531
+	.8byte	.LBB1547
+	.8byte	.LBE1547
+	.8byte	.LBB1548
+	.8byte	.LBE1548
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1528
-	.8byte	.LBE1528
-	.8byte	.LBB1535
-	.8byte	.LBE1535
-	.8byte	.LBB1536
-	.8byte	.LBE1536
+	.8byte	.LBB1538
+	.8byte	.LBE1538
+	.8byte	.LBB1545
+	.8byte	.LBE1545
+	.8byte	.LBB1546
+	.8byte	.LBE1546
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1550
-	.8byte	.LBE1550
-	.8byte	.LBB1575
-	.8byte	.LBE1575
-	.8byte	.LBB1576
-	.8byte	.LBE1576
+	.8byte	.LBB1560
+	.8byte	.LBE1560
 	.8byte	.LBB1585
 	.8byte	.LBE1585
-	.8byte	.LBB1636
-	.8byte	.LBE1636
-	.8byte	.LBB1641
-	.8byte	.LBE1641
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1552
-	.8byte	.LBE1552
-	.8byte	.LBB1555
-	.8byte	.LBE1555
+	.8byte	.LBB1586
+	.8byte	.LBE1586
+	.8byte	.LBB1595
+	.8byte	.LBE1595
+	.8byte	.LBB1646
+	.8byte	.LBE1646
+	.8byte	.LBB1651
+	.8byte	.LBE1651
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1556
-	.8byte	.LBE1556
-	.8byte	.LBB1561
-	.8byte	.LBE1561
 	.8byte	.LBB1562
 	.8byte	.LBE1562
-	.8byte	.LBB1563
-	.8byte	.LBE1563
+	.8byte	.LBB1565
+	.8byte	.LBE1565
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1577
-	.8byte	.LBE1577
-	.8byte	.LBB1587
-	.8byte	.LBE1587
-	.8byte	.LBB1638
-	.8byte	.LBE1638
-	.8byte	.LBB1642
-	.8byte	.LBE1642
-	.8byte	.LBB1643
-	.8byte	.LBE1643
+	.8byte	.LBB1566
+	.8byte	.LBE1566
+	.8byte	.LBB1571
+	.8byte	.LBE1571
+	.8byte	.LBB1572
+	.8byte	.LBE1572
+	.8byte	.LBB1573
+	.8byte	.LBE1573
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1588
-	.8byte	.LBE1588
-	.8byte	.LBB1639
-	.8byte	.LBE1639
-	.8byte	.LBB1640
-	.8byte	.LBE1640
+	.8byte	.LBB1587
+	.8byte	.LBE1587
+	.8byte	.LBB1597
+	.8byte	.LBE1597
+	.8byte	.LBB1648
+	.8byte	.LBE1648
+	.8byte	.LBB1652
+	.8byte	.LBE1652
+	.8byte	.LBB1653
+	.8byte	.LBE1653
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1590
-	.8byte	.LBE1590
-	.8byte	.LBB1596
-	.8byte	.LBE1596
+	.8byte	.LBB1598
+	.8byte	.LBE1598
+	.8byte	.LBB1649
+	.8byte	.LBE1649
+	.8byte	.LBB1650
+	.8byte	.LBE1650
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1599
-	.8byte	.LBE1599
 	.8byte	.LBB1600
 	.8byte	.LBE1600
+	.8byte	.LBB1606
+	.8byte	.LBE1606
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1607
-	.8byte	.LBE1607
-	.8byte	.LBB1613
-	.8byte	.LBE1613
-	.8byte	.LBB1614
-	.8byte	.LBE1614
-	.8byte	.LBB1615
-	.8byte	.LBE1615
-	.8byte	.LBB1616
-	.8byte	.LBE1616
+	.8byte	.LBB1609
+	.8byte	.LBE1609
+	.8byte	.LBB1610
+	.8byte	.LBE1610
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1617
 	.8byte	.LBE1617
-	.8byte	.LBB1635
-	.8byte	.LBE1635
-	.8byte	.LBB1637
-	.8byte	.LBE1637
-	.8byte	.LBB1644
-	.8byte	.LBE1644
+	.8byte	.LBB1623
+	.8byte	.LBE1623
+	.8byte	.LBB1624
+	.8byte	.LBE1624
+	.8byte	.LBB1625
+	.8byte	.LBE1625
+	.8byte	.LBB1626
+	.8byte	.LBE1626
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1627
+	.8byte	.LBE1627
 	.8byte	.LBB1645
 	.8byte	.LBE1645
-	.8byte	.LBB1648
-	.8byte	.LBE1648
+	.8byte	.LBB1647
+	.8byte	.LBE1647
+	.8byte	.LBB1654
+	.8byte	.LBE1654
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1682
-	.8byte	.LBE1682
-	.8byte	.LBB1689
-	.8byte	.LBE1689
-	.8byte	.LBB1690
-	.8byte	.LBE1690
+	.8byte	.LBB1655
+	.8byte	.LBE1655
+	.8byte	.LBB1658
+	.8byte	.LBE1658
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1684
-	.8byte	.LBE1684
-	.8byte	.LBB1685
-	.8byte	.LBE1685
 	.8byte	.LBB1686
 	.8byte	.LBE1686
+	.8byte	.LBB1693
+	.8byte	.LBE1693
+	.8byte	.LBB1694
+	.8byte	.LBE1694
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1696
-	.8byte	.LBE1696
-	.8byte	.LBB1716
-	.8byte	.LBE1716
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1698
-	.8byte	.LBE1698
-	.8byte	.LBB1699
-	.8byte	.LBE1699
+	.8byte	.LBB1688
+	.8byte	.LBE1688
+	.8byte	.LBB1689
+	.8byte	.LBE1689
+	.8byte	.LBB1690
+	.8byte	.LBE1690
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1700
 	.8byte	.LBE1700
-	.8byte	.LBB1706
-	.8byte	.LBE1706
-	.8byte	.LBB1707
-	.8byte	.LBE1707
-	.8byte	.LBB1708
-	.8byte	.LBE1708
-	.8byte	.LBB1717
-	.8byte	.LBE1717
+	.8byte	.LBB1720
+	.8byte	.LBE1720
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1702
+	.8byte	.LBE1702
+	.8byte	.LBB1703
+	.8byte	.LBE1703
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1704
+	.8byte	.LBE1704
+	.8byte	.LBB1710
+	.8byte	.LBE1710
+	.8byte	.LBB1711
+	.8byte	.LBE1711
 	.8byte	.LBB1712
 	.8byte	.LBE1712
-	.8byte	.LBB1720
-	.8byte	.LBE1720
+	.8byte	.LBB1721
+	.8byte	.LBE1721
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1714
-	.8byte	.LBE1714
-	.8byte	.LBB1715
-	.8byte	.LBE1715
+	.8byte	.LBB1716
+	.8byte	.LBE1716
+	.8byte	.LBB1722
+	.8byte	.LBE1722
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1718
+	.8byte	.LBE1718
+	.8byte	.LBB1719
+	.8byte	.LBE1719
 	.8byte	0
 	.8byte	0
 	.8byte	.Ltext0

commit 96d4b9415536a454d0f260f6a8bcdda56019c72d
Author: Yiqing Zeng <zack.zeng@rock-chips.com>
Date:   Mon Jun 14 17:20:35 2021 +0800

    media: i2c: imx347 fix setting flow error and fix hdr gain error
    
    Signed-off-by: Yiqing Zeng <zack.zeng@rock-chips.com>
    Change-Id: Ib0f17bc1ce74dea8caad414c1d3b66a81c10e85c

diff --git a/drivers/media/i2c/imx347.c b/drivers/media/i2c/imx347.c
index b09eceb41172..90715032bffb 100644
--- a/drivers/media/i2c/imx347.c
+++ b/drivers/media/i2c/imx347.c
@@ -8,6 +8,7 @@
  * V0.0X01.0X01 add conversion gain control
  * V0.0X01.0X02 add debug interface for conversion gain control
  * V0.0X01.0X03 support enum sensor fmt
+ * V0.0X01.0X04 fix setting flow error according to datasheet and fix hdr gain error
  */
 
 #include <linux/clk.h>
@@ -29,7 +30,7 @@
 #include <linux/pinctrl/consumer.h>
 #include <linux/rk-preisp.h>
 
-#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x03)
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x04)
 
 #ifndef V4L2_CID_DIGITAL_GAIN
 #define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
@@ -54,6 +55,14 @@
 #define IMX347_MODE_SW_STANDBY		BIT(0)
 #define IMX347_MODE_STREAMING		0x0
 
+#define IMX347_REG_MASTER_MODE		0x3002
+#define IMX347_MASTER_MODE_STOP		BIT(0)
+#define IMX347_MASTER_MODE_START	0x0
+
+#define IMX347_REG_RESTART_MODE		0x3004
+#define IMX347_RESTART_MODE_START	0x04
+#define IMX347_RESTART_MODE_STOP	0x0
+
 #define IMX347_GAIN_SWITCH_REG		0x3019
 
 #define IMX347_LF_GAIN_REG_H		0x30E9
@@ -164,6 +173,7 @@ struct imx347_mode {
 	const struct regval *reg_list;
 	u32 hdr_mode;
 	u32 vc[PAD_MAX];
+	u8 bpp;
 };
 
 struct imx347 {
@@ -172,11 +182,9 @@ struct imx347 {
 	struct gpio_desc	*reset_gpio;
 	struct gpio_desc	*pwdn_gpio;
 	struct regulator_bulk_data supplies[IMX347_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;
@@ -213,8 +221,6 @@ static const struct regval imx347_global_regs[] = {
 };
 
 static const struct regval imx347_linear_10bit_2688x1520_regs[] = {
-	{0x3000, 0x01},
-	{0x3002, 0x00},
 	{0x300C, 0x5B},
 	{0x300D, 0x40},
 	{0x3018, 0x00},
@@ -252,6 +258,7 @@ static const struct regval imx347_linear_10bit_2688x1520_regs[] = {
 	{0x319E, 0x01},
 	{0x31A1, 0x00},
 	{0x31D7, 0x00},
+	{0x3200, 0x11},/* Each frame gain adjustment disabed in linear mode */
 	{0x3202, 0x02},
 	{0x3288, 0x22},
 	{0x328A, 0x02},
@@ -314,7 +321,6 @@ static const struct regval imx347_linear_10bit_2688x1520_regs[] = {
 	{0x3794, 0xFE},
 	{0x3795, 0x06},
 	{0x3796, 0x7F},
-	{0x3200, 0x11},
 	{0x3798, 0xBF},
 	{0x3A01, 0x01},
 	{0x3A18, 0x8F},
@@ -331,8 +337,6 @@ static const struct regval imx347_linear_10bit_2688x1520_regs[] = {
 };
 
 static const struct regval imx347_hdr_2x_10bit_2688x1520_regs[] = {
-	{0x3000, 0x01},
-	{0x3002, 0x00},
 	{0x300C, 0x5B},
 	{0x300D, 0x40},
 	{0x3018, 0x00},
@@ -370,6 +374,7 @@ static const struct regval imx347_hdr_2x_10bit_2688x1520_regs[] = {
 	{0x319E, 0x01},
 	{0x31A1, 0x00},
 	{0x31D7, 0x01},
+	{0x3200, 0x10},/* Each frame gain adjustment EN in hdr mode */
 	{0x3202, 0x02},
 	{0x3288, 0x22},
 	{0x328A, 0x02},
@@ -432,7 +437,6 @@ static const struct regval imx347_hdr_2x_10bit_2688x1520_regs[] = {
 	{0x3794, 0xFE},
 	{0x3795, 0x06},
 	{0x3796, 0x7F},
-	{0x3200, 0x00},
 	{0x3798, 0xBF},
 	{0x3A01, 0x03},
 	{0x3A18, 0x8F},
@@ -449,8 +453,6 @@ static const struct regval imx347_hdr_2x_10bit_2688x1520_regs[] = {
 };
 
 static const struct regval imx347_linear_12bit_2688x1520_regs[] = {
-	{0x3000, 0x01},
-	{0x3002, 0x00},
 	{0x300C, 0x3B},
 	{0x300D, 0x2A},
 	{0x3018, 0x04},
@@ -488,6 +490,7 @@ static const struct regval imx347_linear_12bit_2688x1520_regs[] = {
 	{0x319E, 0x02},
 	{0x31A1, 0x00},
 	{0x31D7, 0x00},
+	{0x3200, 0x11},/* Each frame gain adjustment disabed in linear mode */
 	{0x3202, 0x02},
 	{0x3288, 0x22},
 	{0x328A, 0x02},
@@ -550,7 +553,6 @@ static const struct regval imx347_linear_12bit_2688x1520_regs[] = {
 	{0x3794, 0xFE},
 	{0x3795, 0x06},
 	{0x3796, 0x7F},
-	{0x3200, 0x11},
 	{0x3798, 0xBF},
 	{0x3A01, 0x03},
 	{0x3A18, 0x6F},
@@ -567,8 +569,6 @@ static const struct regval imx347_linear_12bit_2688x1520_regs[] = {
 };
 
 static const struct regval imx347_hdr_2x_12bit_2688x1520_regs[] = {
-	{0x3000, 0x01},
-	{0x3002, 0x00},
 	{0x300C, 0x3B},
 	{0x300D, 0x2A},
 	{0x3018, 0x04},
@@ -606,6 +606,7 @@ static const struct regval imx347_hdr_2x_12bit_2688x1520_regs[] = {
 	{0x319E, 0x02},
 	{0x31A1, 0x00},
 	{0x31D7, 0x01},
+	{0x3200, 0x10},/* Each frame gain adjustment EN in hdr mode */
 	{0x3202, 0x02},
 	{0x3288, 0x22},
 	{0x328A, 0x02},
@@ -668,7 +669,6 @@ static const struct regval imx347_hdr_2x_12bit_2688x1520_regs[] = {
 	{0x3794, 0xFE},
 	{0x3795, 0x06},
 	{0x3796, 0x7F},
-	{0x3200, 0x11},
 	{0x3798, 0xBF},
 	{0x3A01, 0x03},
 	{0x3A18, 0x6F},
@@ -711,6 +711,7 @@ static const struct imx347_mode supported_modes[] = {
 		.reg_list = imx347_linear_10bit_2688x1520_regs,
 		.hdr_mode = NO_HDR,
 		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0,
+		.bpp = 10,
 	},
 	{
 		.bus_fmt = MEDIA_BUS_FMT_SRGGB10_1X10,
@@ -729,6 +730,7 @@ static const struct imx347_mode supported_modes[] = {
 		.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
+		.bpp = 10,
 	},
 	{
 		.bus_fmt = MEDIA_BUS_FMT_SRGGB12_1X12,
@@ -744,6 +746,7 @@ static const struct imx347_mode supported_modes[] = {
 		.reg_list = imx347_linear_12bit_2688x1520_regs,
 		.hdr_mode = NO_HDR,
 		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0,
+		.bpp = 12,
 	},
 	{
 		.bus_fmt = MEDIA_BUS_FMT_SRGGB12_1X12,
@@ -762,6 +765,7 @@ static const struct imx347_mode supported_modes[] = {
 		.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
+		.bpp = 12,
 	},
 };
 
@@ -1057,10 +1061,10 @@ static void imx347_get_module_inf(struct imx347 *imx347,
 				  struct rkmodule_inf *inf)
 {
 	memset(inf, 0, sizeof(*inf));
-	strlcpy(inf->base.sensor, IMX347_NAME, sizeof(inf->base.sensor));
-	strlcpy(inf->base.module, imx347->module_name,
+	strscpy(inf->base.sensor, IMX347_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, imx347->module_name,
 		sizeof(inf->base.module));
-	strlcpy(inf->base.lens, imx347->len_name, sizeof(inf->base.lens));
+	strscpy(inf->base.lens, imx347->len_name, sizeof(inf->base.lens));
 }
 
 static int imx347_set_hdrae(struct imx347 *imx347,
@@ -1383,7 +1387,6 @@ static long imx347_compat_ioctl32(struct v4l2_subdev *sd,
 {
 	void __user *up = compat_ptr(arg);
 	struct rkmodule_inf *inf;
-	struct rkmodule_awb_cfg *cfg;
 	struct rkmodule_hdr_cfg *hdr;
 	struct preisp_hdrae_exp_s *hdrae;
 	long ret;
@@ -1399,21 +1402,12 @@ static long imx347_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = imx347_ioctl(sd, cmd, inf);
-		if (!ret)
+		if (!ret) {
 			ret = copy_to_user(up, inf, sizeof(*inf));
-		kfree(inf);
-		break;
-	case RKMODULE_AWB_CFG:
-		cfg = kzalloc(sizeof(*cfg), GFP_KERNEL);
-		if (!cfg) {
-			ret = -ENOMEM;
-			return ret;
+			if (ret)
+				ret = -EFAULT;
 		}
-
-		ret = copy_from_user(cfg, up, sizeof(*cfg));
-		if (!ret)
-			ret = imx347_ioctl(sd, cmd, cfg);
-		kfree(cfg);
+		kfree(inf);
 		break;
 	case RKMODULE_GET_HDR_CFG:
 		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
@@ -1423,8 +1417,11 @@ static long imx347_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = imx347_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:
@@ -1434,9 +1431,12 @@ static long imx347_compat_ioctl32(struct v4l2_subdev *sd,
 			return ret;
 		}
 
-		ret = copy_from_user(hdr, up, sizeof(*hdr));
-		if (!ret)
-			ret = imx347_ioctl(sd, cmd, hdr);
+		if (copy_from_user(hdr, up, sizeof(*hdr))) {
+			kfree(hdr);
+			return -EFAULT;
+		}
+
+		ret = imx347_ioctl(sd, cmd, hdr);
 		kfree(hdr);
 		break;
 	case PREISP_CMD_SET_HDRAE_EXP:
@@ -1446,21 +1446,25 @@ static long imx347_compat_ioctl32(struct v4l2_subdev *sd,
 			return ret;
 		}
 
-		ret = copy_from_user(hdrae, up, sizeof(*hdrae));
-		if (!ret)
-			ret = imx347_ioctl(sd, cmd, hdrae);
+		if (copy_from_user(hdrae, up, sizeof(*hdrae))) {
+			kfree(hdrae);
+			return -EFAULT;
+		}
+
+		ret = imx347_ioctl(sd, cmd, hdrae);
 		kfree(hdrae);
 		break;
 	case RKMODULE_SET_CONVERSION_GAIN:
-		ret = copy_from_user(&cg, up, sizeof(cg));
-		if (!ret)
-			ret = imx347_ioctl(sd, cmd, &cg);
+		if (copy_from_user(&cg, up, sizeof(cg)))
+			return -EFAULT;
+
+		ret = imx347_ioctl(sd, cmd, &cg);
 		break;
 	case RKMODULE_SET_QUICK_STREAM:
-		ret = copy_from_user(&stream, up, sizeof(u32));
-		if (!ret) {
-			ret = imx347_ioctl(sd, cmd, &stream);
-		}
+		if (copy_from_user(&stream, up, sizeof(u32)))
+			return -EFAULT;
+
+		ret = imx347_ioctl(sd, cmd, &stream);
 		break;
 	default:
 		ret = -ENOIOCTLCMD;
@@ -1476,10 +1480,8 @@ static int imx347_init_conversion_gain(struct imx347 *imx347)
 	int ret = 0;
 	struct i2c_client *client = imx347->client;
 
-	ret = imx347_write_reg(client,
-		IMX347_GAIN_SWITCH_REG,
-		IMX347_REG_VALUE_08BIT,
-		0X00);
+	ret = imx347_write_reg(client, IMX347_GAIN_SWITCH_REG,
+			       IMX347_REG_VALUE_08BIT, 0x00);
 	if (!ret)
 		g_isHCG = false;
 	return ret;
@@ -1508,15 +1510,36 @@ static int __imx347_start_stream(struct imx347 *imx347)
 			return ret;
 		}
 	}
-	return imx347_write_reg(imx347->client, IMX347_REG_CTRL_MODE,
-				IMX347_REG_VALUE_08BIT, 0);
+
+	ret = imx347_write_reg(imx347->client, IMX347_REG_CTRL_MODE,
+			       IMX347_REG_VALUE_08BIT, IMX347_MODE_STREAMING);
+	ret |= imx347_write_reg(imx347->client, IMX347_REG_MASTER_MODE,
+				IMX347_REG_VALUE_08BIT, IMX347_MASTER_MODE_START);
+	return ret;
 }
 
 static int __imx347_stop_stream(struct imx347 *imx347)
 {
+	int ret = 0;
+	u32 value = 0;
+
 	imx347->has_init_exp = false;
-	return imx347_write_reg(imx347->client, IMX347_REG_CTRL_MODE,
-				IMX347_REG_VALUE_08BIT, 1);
+	ret = imx347_write_reg(imx347->client, IMX347_REG_CTRL_MODE,
+			       IMX347_REG_VALUE_08BIT, IMX347_MODE_SW_STANDBY);
+	ret |= imx347_write_reg(imx347->client, IMX347_REG_MASTER_MODE,
+				IMX347_REG_VALUE_08BIT, IMX347_MASTER_MODE_STOP);
+
+	ret |= imx347_read_reg(imx347->client, IMX347_REG_RESTART_MODE,
+			       IMX347_REG_VALUE_08BIT, &value);
+	dev_dbg(&imx347->client->dev, "reg 0x3004 = 0x%x\n", value);
+	if (value == 0x00) {
+		ret |= imx347_write_reg(imx347->client, IMX347_REG_RESTART_MODE,
+					IMX347_REG_VALUE_08BIT, IMX347_RESTART_MODE_START);
+		ret |= imx347_write_reg(imx347->client, IMX347_REG_RESTART_MODE,
+					IMX347_REG_VALUE_08BIT, IMX347_RESTART_MODE_STOP);
+	}
+
+	return ret;
 }
 
 static int imx347_s_stream(struct v4l2_subdev *sd, int on)
@@ -1525,6 +1548,10 @@ static int imx347_s_stream(struct v4l2_subdev *sd, int on)
 	struct i2c_client *client = imx347->client;
 	int ret = 0;
 
+	dev_dbg(&imx347->client->dev, "s_stream: %d. %dx%d, hdr: %d, bpp: %d\n",
+		on, imx347->cur_mode->width, imx347->cur_mode->height,
+		imx347->cur_mode->hdr_mode, imx347->cur_mode->bpp);
+
 	mutex_lock(&imx347->mutex);
 	on = !!on;
 	if (on == imx347->streaming)

commit d326c6f762532cd3ab78c1e4f5b4c39fbeb8ceff
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Thu Jun 10 16:52:11 2021 +0800

    media: spi: ms41908 fixed complete bug
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I46ec0ae903c14809c3338dc8fd6677f89579e5cf

diff --git a/drivers/media/spi/ms41908.c b/drivers/media/spi/ms41908.c
index 39c85c5cf04a..7655e338a220 100644
--- a/drivers/media/spi/ms41908.c
+++ b/drivers/media/spi/ms41908.c
@@ -1117,9 +1117,9 @@ static void motor_config_dev_next_status(struct motor_dev *motor, struct ext_dev
 		dev->is_mv_tim_update = true;
 		dev->move_status = MOTOR_STATUS_STOPPED;
 		dev->reg_op->tmp_psum = 0;
-		complete(&dev->complete);
-		complete(&dev->complete_out);
 		dev->is_running = false;
+		complete(&dev->complete_out);
+		complete(&dev->complete);
 	}
 }
 
@@ -1221,11 +1221,16 @@ static int motor_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
 	return 0;
 }
 
-static void wait_for_motor_stop(struct ext_dev *dev)
+static void wait_for_motor_stop(struct motor_dev *motor, struct ext_dev *dev)
 {
+	unsigned long ret = 0;
+
 	if (dev->is_running) {
 		reinit_completion(&dev->complete_out);
-		wait_for_completion(&dev->complete_out);
+		ret = wait_for_completion_timeout(&dev->complete_out, 10 * HZ);
+		if (ret == 0)
+			dev_info(&motor->spi->dev,
+				 "wait for complete timeout\n");
 	}
 }
 
@@ -1265,7 +1270,7 @@ static int motor_s_ctrl(struct v4l2_ctrl *ctrl)
 						       true,
 						       false,
 						       false);
-			wait_for_motor_stop(motor->piris);
+			wait_for_motor_stop(motor, motor->piris);
 			dev_dbg(&motor->spi->dev, "set piris pos %d\n", ctrl->val);
 		}
 		break;
@@ -1276,7 +1281,7 @@ static int motor_s_ctrl(struct v4l2_ctrl *ctrl)
 					       true,
 					       false,
 					       false);
-		wait_for_motor_stop(motor->focus);
+		wait_for_motor_stop(motor, motor->focus);
 		dev_dbg(&motor->spi->dev, "set focus pos %d\n", ctrl->val);
 		break;
 	case V4L2_CID_ZOOM_ABSOLUTE:
@@ -1286,7 +1291,7 @@ static int motor_s_ctrl(struct v4l2_ctrl *ctrl)
 					       true,
 					       false,
 					       false);
-		wait_for_motor_stop(motor->zoom);
+		wait_for_motor_stop(motor, motor->zoom);
 		dev_dbg(&motor->spi->dev, "set zoom pos %d\n", ctrl->val);
 		break;
 	case V4L2_CID_ZOOM_CONTINUOUS:
@@ -1296,7 +1301,7 @@ static int motor_s_ctrl(struct v4l2_ctrl *ctrl)
 					       true,
 					       false,
 					       false);
-		wait_for_motor_stop(motor->zoom1);
+		wait_for_motor_stop(motor, motor->zoom1);
 		dev_dbg(&motor->spi->dev, "set zoom1 pos %d\n", ctrl->val);
 		break;
 	default:
@@ -1340,8 +1345,8 @@ static int motor_set_zoom_follow(struct motor_dev *motor, struct rk_cam_set_zoom
 						 false,
 						 false);
 		}
-		wait_for_motor_stop(motor->focus);
-		wait_for_motor_stop(motor->zoom);
+		wait_for_motor_stop(motor, motor->focus);
+		wait_for_motor_stop(motor, motor->zoom);
 		dev_dbg(&motor->spi->dev,
 			"%s zoom %d, focus %d, i %d\n",
 			__func__,
@@ -1384,7 +1389,7 @@ static int motor_find_pi_binarysearch(struct motor_dev *motor,
 						 false,
 						 false,
 						 true);
-		wait_for_motor_stop(ext_dev);
+		wait_for_motor_stop(motor, ext_dev);
 		return mid;
 	}
 	last_pos = ext_dev->last_pos;
@@ -1402,7 +1407,7 @@ static int motor_find_pi_binarysearch(struct motor_dev *motor,
 				       false,
 				       false,
 				       true);
-	wait_for_motor_stop(ext_dev);
+	wait_for_motor_stop(motor, ext_dev);
 	gpio_val = gpiod_get_value(ext_dev->pic_gpio);
 	if (tmp_val != gpio_val) {
 		usleep_range(10, 20);
@@ -1451,7 +1456,7 @@ static int motor_find_pi(struct motor_dev *motor,
 					 false,
 					 false,
 					 false);
-		wait_for_motor_stop(ext_dev);
+		wait_for_motor_stop(motor, ext_dev);
 		gpio_val = gpiod_get_value(ext_dev->pic_gpio);
 		if (tmp_val != gpio_val) {
 			usleep_range(10, 20);
@@ -1475,7 +1480,7 @@ static int motor_find_pi(struct motor_dev *motor,
 					       false,
 					       false,
 					       true);
-			wait_for_motor_stop(ext_dev);
+			wait_for_motor_stop(motor, ext_dev);
 			gpio_val = gpiod_get_value(ext_dev->pic_gpio);
 			if (tmp_val != gpio_val) {
 				usleep_range(10, 20);
@@ -1522,7 +1527,7 @@ static int motor_reinit_piris(struct motor_dev *motor)
 					       false,
 					       false,
 					       false);
-		wait_for_motor_stop(motor->piris);
+		wait_for_motor_stop(motor, motor->piris);
 		#else
 		motor->piris->last_pos = 0;
 		#endif
@@ -1551,7 +1556,7 @@ static int motor_reinit_piris(struct motor_dev *motor)
 					       false,
 					       false,
 					       false);
-		wait_for_motor_stop(motor->piris);
+		wait_for_motor_stop(motor, motor->piris);
 	}
 	return 0;
 }
@@ -1588,7 +1593,7 @@ static int motor_reinit_focus(struct motor_dev *motor)
 					       false,
 					       false,
 					       false);
-		wait_for_motor_stop(motor->focus);
+		wait_for_motor_stop(motor, motor->focus);
 		#else
 		motor->focus->last_pos = 0;
 		#endif
@@ -1616,7 +1621,7 @@ static int motor_reinit_focus(struct motor_dev *motor)
 					       false,
 					       false,
 					       true);
-		wait_for_motor_stop(motor->focus);
+		wait_for_motor_stop(motor, motor->focus);
 	}
 	return 0;
 }
@@ -1653,7 +1658,7 @@ static int  motor_reinit_zoom(struct motor_dev *motor)
 					       false,
 					       false,
 					       false);
-		wait_for_motor_stop(motor->zoom);
+		wait_for_motor_stop(motor, motor->zoom);
 		#else
 		motor->zoom->last_pos = 0;
 		#endif
@@ -1681,7 +1686,7 @@ static int  motor_reinit_zoom(struct motor_dev *motor)
 					       false,
 					       false,
 					       true);
-		wait_for_motor_stop(motor->zoom);
+		wait_for_motor_stop(motor, motor->zoom);
 	}
 	return 0;
 }
@@ -1718,7 +1723,7 @@ static int motor_reinit_zoom1(struct motor_dev *motor)
 					       false,
 					       false,
 					       false);
-		wait_for_motor_stop(motor->zoom1);
+		wait_for_motor_stop(motor, motor->zoom1);
 		#else
 		motor->zoom1->last_pos = 0;
 		#endif
@@ -1746,7 +1751,7 @@ static int motor_reinit_zoom1(struct motor_dev *motor)
 					       false,
 					       false,
 					       true);
-		wait_for_motor_stop(motor->zoom1);
+		wait_for_motor_stop(motor, motor->zoom1);
 	}
 	return 0;
 }
@@ -1783,7 +1788,7 @@ static int motor_set_focus(struct motor_dev *motor, struct rk_cam_set_focus *mv_
 				       true,
 				       false,
 				       is_need_reback);
-	wait_for_motor_stop(motor->focus);
+	wait_for_motor_stop(motor, motor->focus);
 
 	return ret;
 }

commit 1f750c51d4b14b6458c95f198e3be4fce1ef42b9
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Thu Jun 10 16:39:55 2021 +0800

    drm/rockchip: dw_hdmi: print property name when set/get failed
    
    Change-Id: I947c5599df682f7bec0d3c75ed23cbcd7043ba29
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
index 2cd5060cb1c0..615f5c5c1982 100644
--- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
+++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
@@ -1188,7 +1188,7 @@ dw_hdmi_rockchip_set_property(struct drm_connector *connector,
 		return 0;
 	}
 
-	DRM_ERROR("failed to set rockchip hdmi connector property\n");
+	DRM_ERROR("failed to set rockchip hdmi connector property %s\n", property->name);
 	return -EINVAL;
 }
 
@@ -1253,7 +1253,7 @@ dw_hdmi_rockchip_get_property(struct drm_connector *connector,
 		return 0;
 	}
 
-	DRM_ERROR("failed to get rockchip hdmi connector property\n");
+	DRM_ERROR("failed to get rockchip hdmi connector property %s\n", property->name);
 	return -EINVAL;
 }
 

commit 6d0cb62e4792fdee03d6c76fc2ebdc186a2e6385
Author: Pascal Paillet <p.paillet@st.com>
Date:   Wed Nov 13 11:27:37 2019 +0100

    UPSTREAM: regulator: core: Let boot-on regulators be powered off
    
    Boot-on regulators are always kept on because their use_count value
    is now incremented at boot time and never cleaned.
    
    Only increment count value for alway-on regulators.
    regulator_late_cleanup() is now able to power off boot-on regulators
    when unused.
    
    Change-Id: I7adc58a78fec934e245d9ec94c4604b4d7c7ebb5
    Fixes: 05f224ca6693 ("regulator: core: Clean enabling always-on regulators + their supplies")
    Signed-off-by: Pascal Paillet <p.paillet@st.com>
    Link: https://lore.kernel.org/r/20191113102737.27831-1-p.paillet@st.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    (cherry picked from commit 089b3f61ecfc43ca4ea26d595e1d31ead6de3f7b)

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index b6724b62476e..8eba2eb0793e 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -1260,7 +1260,9 @@ static int set_machine_constraints(struct regulator_dev *rdev)
 				return ret;
 			}
 		}
-		rdev->use_count++;
+
+		if (rdev->constraints->always_on)
+			rdev->use_count++;
 	}
 
 	print_constraints(rdev);

commit 6d247974f896f3c759cb7fa144c3af6545766eef
Merge: d42add27c806 ea6ea821c590
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Fri Jun 11 21:31:21 2021 +0800

    Merge tag 'ASB-2021-06-05_4.19-stable' of https://android.googlesource.com/kernel/common
    
    https://source.android.com/security/bulletin/2021-06-01
    CVE-2020-14305
    CVE-2020-14381
    CVE-2021-0512
    CVE-2021-3347
    
    * tag 'ASB-2021-06-05_4.19-stable': (1641 commits)
      Linux 4.19.193
      usb: core: reduce power-on-good delay time of root hub
      net: hns3: check the return of skb_checksum_help()
      drivers/net/ethernet: clean up unused assignments
      hugetlbfs: hugetlb_fault_mutex_hash() cleanup
      MIPS: ralink: export rt_sysc_membase for rt2880_wdt.c
      MIPS: alchemy: xxs1500: add gpio-au1000.h header file
      sch_dsmark: fix a NULL deref in qdisc_reset()
      ipv6: record frag_max_size in atomic fragments in input path
      scsi: libsas: Use _safe() loop in sas_resume_port()
      ixgbe: fix large MTU request from VF
      bpf: Set mac_len in bpf_skb_change_head
      ASoC: cs35l33: fix an error code in probe()
      staging: emxx_udc: fix loop in _nbu2ss_nuke()
      mld: fix panic in mld_newpack()
      net: bnx2: Fix error return code in bnx2_init_board()
      openvswitch: meter: fix race when getting now_ms.
      net: mdio: octeon: Fix some double free issues
      net: mdio: thunder: Fix a double free issue in the .remove function
      net: fec: fix the potential memory leak in fec_enet_init()
      ...
    
    Change-Id: If547ecdc8654e01ea17afea2ff2dd546f7a495d2
    
    Conflicts:
            drivers/media/i2c/ov5670.c
            drivers/mmc/core/mmc_ops.c
            drivers/regulator/core.c
            drivers/usb/dwc3/gadget.c
            drivers/usb/gadget/function/f_uac1.c
            drivers/usb/gadget/function/f_uvc.c

commit d42add27c8060de0c8cbbf00806d5c286f50e214
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Thu Jun 10 18:37:43 2021 +0800

    Revert "CHROMIUM: usb: gadget: configfs: Fix KASAN use-after-free"
    
    This reverts commit d7b2c97fd05924b38edd8ed27bb443a80eb95efa.
    
    Relpaced by commit c3a4fc9f37af ("usb: gadget: configfs: Fix KASAN use-after-free").
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: I838bfe4ef5d3a7ba3ce4296f76434cfc3d33c991

diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c
index a2b0cb2ac64a..88b921e04d49 100644
--- a/drivers/usb/gadget/configfs.c
+++ b/drivers/usb/gadget/configfs.c
@@ -140,28 +140,21 @@ struct gadget_config_name {
 	struct list_head list;
 };
 
-#define MAX_USB_STRING_LEN	126
-#define MAX_USB_STRING_WITH_NULL_LEN	(MAX_USB_STRING_LEN+1)
-
 static int usb_string_copy(const char *s, char **s_copy)
 {
 	int ret;
 	char *str;
 	char *copy = *s_copy;
 	ret = strlen(s);
-	if (ret > MAX_USB_STRING_LEN)
+	if (ret > 126)
 		return -EOVERFLOW;
 
-	if (copy) {
-		str = copy;
-	} else {
-		str = kmalloc(MAX_USB_STRING_WITH_NULL_LEN, GFP_KERNEL);
-		if (!str)
-			return -ENOMEM;
-	}
-	strncpy(str, s, MAX_USB_STRING_WITH_NULL_LEN);
+	str = kstrdup(s, GFP_KERNEL);
+	if (!str)
+		return -ENOMEM;
 	if (str[ret - 1] == '\n')
 		str[ret - 1] = '\0';
+	kfree(copy);
 	*s_copy = str;
 	return 0;
 }

commit 51d8f2cdef56f63e36fd4f1cf185778b95f56944
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Thu Jun 10 18:37:19 2021 +0800

    Revert "PM / QoS: Do not call pm_qos_set_value_for_cpus()"
    
    This reverts commit 17823171af70986013f80e85c70e95e6730ae7d2.
    
    Relpaced by commit 3092012197aa ("ANDROID: GKI: QoS: Prevent usage of dev_pm_qos_request as pm_qos_request").
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: Iff9c38acdae14cee92c52ac833c7bf062c7fc74c

diff --git a/kernel/power/qos.c b/kernel/power/qos.c
index 7445e83dc5f4..789dd20b6669 100644
--- a/kernel/power/qos.c
+++ b/kernel/power/qos.c
@@ -340,9 +340,7 @@ int pm_qos_update_target(struct pm_qos_constraints *c, struct plist_node *node,
 
 	curr_value = pm_qos_get_value(c);
 	pm_qos_set_value(c, curr_value);
-#ifndef CONFIG_ARCH_ROCKCHIP
 	pm_qos_set_value_for_cpus(c);
-#endif
 
 	spin_unlock_irqrestore(&pm_qos_lock, flags);
 

commit 62df34992b2abca7aefb5b01d005d38b72fd23b9
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Thu Jun 10 18:36:21 2021 +0800

    Revert "UPSTREAM: dma-buf: Fix SET_NAME ioctl uapi"
    
    This reverts commit 97fd8955415750cf47f4b2b799fd0527c848d2d0.
    
    Relpaced by commit 06931a5d14e2 ("UPSTREAM: dma-buf: Fix SET_NAME ioctl uapi").
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: I8623aa664bca0c41967a14b7f2247927c0b26151

diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
index bf92ce7e4e3e..6bfe7cbd07c9 100644
--- a/drivers/dma-buf/dma-buf.c
+++ b/drivers/dma-buf/dma-buf.c
@@ -442,8 +442,7 @@ static long dma_buf_ioctl(struct file *file,
 
 		return ret;
 
-	case DMA_BUF_SET_NAME_A:
-	case DMA_BUF_SET_NAME_B:
+	case DMA_BUF_SET_NAME:
 		return dma_buf_set_name(dmabuf, (const char __user *)arg);
 
 	case DMA_BUF_IOCTL_SYNC_PARTIAL:
diff --git a/include/uapi/linux/dma-buf.h b/include/uapi/linux/dma-buf.h
index fa847a9f4641..8bba913a8a30 100644
--- a/include/uapi/linux/dma-buf.h
+++ b/include/uapi/linux/dma-buf.h
@@ -41,13 +41,7 @@ struct dma_buf_sync {
 
 #define DMA_BUF_BASE		'b'
 #define DMA_BUF_IOCTL_SYNC	_IOW(DMA_BUF_BASE, 0, struct dma_buf_sync)
-
-/* 32/64bitness of this uapi was botched in android, there's no difference
- * between them in actual uapi, they're just different numbers.
- */
 #define DMA_BUF_SET_NAME	_IOW(DMA_BUF_BASE, 1, const char *)
-#define DMA_BUF_SET_NAME_A	_IOW(DMA_BUF_BASE, 1, u32)
-#define DMA_BUF_SET_NAME_B	_IOW(DMA_BUF_BASE, 1, u64)
 
 struct dma_buf_sync_partial {
 	__u64 flags;

commit 9ebbcf1dc0819e6009af3396b9b371046de59a64
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Sun May 9 19:35:35 2021 +0800

    drm/rockchip: vop2: Add vcnt event
    
    The vcnt event is similar to vblank event, but
    userspace can set the time(which scan line) when
    the event occur.
    
    This add a new event type: DRM_EVENT_ROCKCHIP_CRTC_VCNT
    userspace create this event by ioctl DRM_IOCTL_ROCKCHIP_GET_VCNT_EVENT
    
    Change-Id: If3da4bb29469ac7dc379e9462994aeda3202d3d2
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index 7802d926753f..1fe7a980b0d7 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -1783,6 +1783,57 @@ static void rockchip_drm_lastclose(struct drm_device *dev)
 		drm_fb_helper_restore_fbdev_mode_unlocked(priv->fbdev_helper);
 }
 
+static struct drm_pending_vblank_event *
+rockchip_drm_add_vcnt_event(struct drm_crtc *crtc, struct drm_file *file_priv)
+{
+	struct drm_pending_vblank_event *e;
+	struct drm_device *dev = crtc->dev;
+	unsigned long flags;
+
+	e = kzalloc(sizeof(*e), GFP_KERNEL);
+	if (!e)
+		return NULL;
+
+	e->pipe = drm_crtc_index(crtc);
+	e->event.base.type = DRM_EVENT_ROCKCHIP_CRTC_VCNT;
+	e->event.base.length = sizeof(e->event.vbl);
+	e->event.vbl.crtc_id = crtc->base.id;
+	/* store crtc pipe id */
+	e->event.vbl.user_data = e->pipe;
+
+	spin_lock_irqsave(&dev->event_lock, flags);
+	drm_event_reserve_init_locked(dev, file_priv, &e->base, &e->event.base);
+	spin_unlock_irqrestore(&dev->event_lock, flags);
+
+	return e;
+}
+
+static int rockchip_drm_get_vcnt_event_ioctl(struct drm_device *dev, void *data,
+					     struct drm_file *file_priv)
+{
+	struct rockchip_drm_private *priv = dev->dev_private;
+	union drm_wait_vblank *vblwait = data;
+	struct drm_pending_vblank_event *e;
+	struct drm_crtc *crtc;
+	unsigned int flags, pipe;
+
+	flags = vblwait->request.type & (_DRM_VBLANK_FLAGS_MASK | _DRM_ROCKCHIP_VCNT_EVENT);
+	pipe = (vblwait->request.type & _DRM_VBLANK_HIGH_CRTC_MASK);
+	if (pipe)
+		pipe = pipe >> _DRM_VBLANK_HIGH_CRTC_SHIFT;
+	else
+		pipe = flags & _DRM_VBLANK_SECONDARY ? 1 : 0;
+
+	crtc = drm_crtc_from_index(dev, pipe);
+
+	if (flags & _DRM_ROCKCHIP_VCNT_EVENT) {
+		e = rockchip_drm_add_vcnt_event(crtc, file_priv);
+		priv->vcnt[pipe].event = e;
+	}
+
+	return 0;
+}
+
 static const struct drm_ioctl_desc rockchip_ioctls[] = {
 	DRM_IOCTL_DEF_DRV(ROCKCHIP_GEM_CREATE, rockchip_gem_create_ioctl,
 			  DRM_UNLOCKED | DRM_AUTH | DRM_RENDER_ALLOW),
@@ -1791,6 +1842,8 @@ static const struct drm_ioctl_desc rockchip_ioctls[] = {
 			  DRM_UNLOCKED | DRM_AUTH | DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF_DRV(ROCKCHIP_GEM_GET_PHYS, rockchip_gem_get_phys_ioctl,
 			  DRM_UNLOCKED | DRM_AUTH | DRM_RENDER_ALLOW),
+	DRM_IOCTL_DEF_DRV(ROCKCHIP_GET_VCNT_EVENT, rockchip_drm_get_vcnt_event_ioctl,
+			  DRM_UNLOCKED),
 };
 
 static const struct file_operations rockchip_drm_driver_fops = {
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h
index 4c8036a74606..9cdba584fedd 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h
@@ -146,12 +146,19 @@ struct rockchip_crtc_state {
 	int color_space;
 	int eotf;
 	u32 background;
+	u32 line_flag;
 	u8 mode_update;
 	struct rockchip_hdr_state hdr;
 };
 #define to_rockchip_crtc_state(s) \
 		container_of(s, struct rockchip_crtc_state, base)
 
+struct rockchip_drm_vcnt {
+	struct drm_pending_vblank_event *event;
+	__u32 sequence;
+	int pipe;
+};
+
 struct rockchip_logo {
 	dma_addr_t dma_addr;
 	void *kvaddr;
@@ -202,6 +209,7 @@ struct rockchip_drm_private {
 	u8 dmc_support;
 	struct list_head psr_list;
 	struct mutex psr_list_lock;
+	struct rockchip_drm_vcnt vcnt[ROCKCHIP_MAX_CRTC];
 
 	/**
 	 * @loader_protect
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 0dcd6bad19c4..1a9c1cd4ebdc 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -537,6 +537,7 @@ struct vop2 {
 	struct drm_property *vp_id_prop;
 	struct drm_property *aclk_prop;
 	struct drm_property *bg_prop;
+	struct drm_property *line_flag_prop;
 	struct drm_prop_enum_list *plane_name_list;
 	bool is_iommu_enabled;
 	bool is_iommu_needed;
@@ -3498,6 +3499,50 @@ static void vop2_crtc_cancel_pending_vblank(struct drm_crtc *crtc,
 	spin_unlock_irqrestore(&drm->event_lock, flags);
 }
 
+static int vop2_crtc_enable_line_flag_event(struct drm_crtc *crtc, uint32_t line)
+{
+	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];
+	const struct vop_intr *intr = vp_data->intr;
+	unsigned long flags;
+
+	if (WARN_ON(!vop2->is_enabled))
+		return -EPERM;
+
+	spin_lock_irqsave(&vop2->irq_lock, flags);
+
+	VOP_INTR_SET(vop2, intr, line_flag_num[1], line);
+
+	VOP_INTR_SET_TYPE(vop2, intr, clear, LINE_FLAG1_INTR, 1);
+	VOP_INTR_SET_TYPE(vop2, intr, enable, LINE_FLAG1_INTR, 1);
+
+	spin_unlock_irqrestore(&vop2->irq_lock, flags);
+
+	return 0;
+}
+
+static void vop2_crtc_disable_line_flag_event(struct drm_crtc *crtc)
+{
+	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];
+	const struct vop_intr *intr = vp_data->intr;
+	unsigned long flags;
+
+	if (WARN_ON(!vop2->is_enabled))
+		return;
+
+	spin_lock_irqsave(&vop2->irq_lock, flags);
+
+	VOP_INTR_SET_TYPE(vop2, intr, enable, LINE_FLAG1_INTR, 0);
+
+	spin_unlock_irqrestore(&vop2->irq_lock, flags);
+}
+
+
 static int vop2_crtc_loader_protect(struct drm_crtc *crtc, bool on)
 {
 	struct vop2_video_port *vp = to_vop2_video_port(crtc);
@@ -5183,6 +5228,11 @@ static void vop2_crtc_atomic_flush(struct drm_crtc *crtc, struct drm_crtc_state
 		VOP_MODULE_SET(vop2, vp, cubic_lut_update_en, 0);
 	}
 
+	if (vcstate->line_flag)
+		vop2_crtc_enable_line_flag_event(crtc, vcstate->line_flag);
+	else
+		vop2_crtc_disable_line_flag_event(crtc);
+
 	spin_lock_irqsave(&vop2->irq_lock, flags);
 	vop2_wb_commit(crtc);
 	vop2_cfg_done(crtc);
@@ -5398,6 +5448,11 @@ static int vop2_crtc_atomic_get_property(struct drm_crtc *crtc,
 		return 0;
 	}
 
+	if (property == vop2->line_flag_prop) {
+		*val = vcstate->line_flag;
+		return 0;
+	}
+
 	DRM_ERROR("failed to get vop2 crtc property: %s\n", property->name);
 
 	return -EINVAL;
@@ -5440,6 +5495,11 @@ static int vop2_crtc_atomic_set_property(struct drm_crtc *crtc,
 		return 0;
 	}
 
+	if (property == vop2->line_flag_prop) {
+		vcstate->line_flag = val;
+		return 0;
+	}
+
 	DRM_ERROR("failed to set vop2 crtc property %s\n", property->name);
 
 	return -EINVAL;
@@ -5488,6 +5548,33 @@ static void vop2_handle_vblank(struct vop2 *vop2, struct drm_crtc *crtc)
 		drm_flip_work_commit(&vp->fb_unref_work, system_unbound_wq);
 }
 
+static void vop2_handle_vcnt(struct drm_crtc *crtc)
+{
+	struct drm_device *dev = crtc->dev;
+	struct rockchip_drm_private *priv = dev->dev_private;
+	struct rockchip_drm_vcnt *vcnt;
+	struct drm_pending_vblank_event *e;
+	struct timespec64 now;
+	unsigned long irqflags;
+	int pipe;
+
+	now = ktime_to_timespec64(ktime_get());
+
+	spin_lock_irqsave(&dev->event_lock, irqflags);
+	pipe = drm_crtc_index(crtc);
+	vcnt = &priv->vcnt[pipe];
+	vcnt->sequence++;
+	if (vcnt->event) {
+		e = vcnt->event;
+		e->event.vbl.tv_sec = now.tv_sec;
+		e->event.vbl.tv_usec = now.tv_nsec / NSEC_PER_USEC;
+		e->event.vbl.sequence = vcnt->sequence;
+		drm_send_event_locked(dev, &e->base);
+		vcnt->event = NULL;
+	}
+	spin_unlock_irqrestore(&dev->event_lock, irqflags);
+}
+
 static u32 vop2_read_and_clear_active_vp_irqs(struct vop2 *vop2, int vp_id)
 {
 	const struct vop2_data *vop2_data = vop2->data;
@@ -5617,6 +5704,12 @@ static irqreturn_t vop2_isr(int irq, void *data)
 			ret = IRQ_HANDLED;
 		}
 
+		if (active_irqs & LINE_FLAG1_INTR) {
+			vop2_handle_vcnt(crtc);
+			active_irqs &= ~LINE_FLAG1_INTR;
+			ret = IRQ_HANDLED;
+		}
+
 		if (active_irqs & FS_FIELD_INTR) {
 			vop2_wb_handler(vp);
 			if (vp->layer_sel_update == false) {
@@ -6014,6 +6107,7 @@ static int vop2_create_crtc(struct vop2 *vop2)
 		drm_object_attach_property(&crtc->base, vop2->vp_id_prop, vp->id);
 		drm_object_attach_property(&crtc->base, vop2->aclk_prop, 0);
 		drm_object_attach_property(&crtc->base, vop2->bg_prop, 0);
+		drm_object_attach_property(&crtc->base, vop2->line_flag_prop, 0);
 		drm_object_attach_property(&crtc->base,
 					   drm_dev->mode_config.tv_left_margin_property, 100);
 		drm_object_attach_property(&crtc->base,
@@ -6194,7 +6288,10 @@ static int vop2_win_init(struct vop2 *vop2)
 	vop2->aclk_prop = drm_property_create_range(vop2->drm_dev, 0, "ACLK", 0, UINT_MAX);
 	vop2->bg_prop = drm_property_create_range(vop2->drm_dev, 0, "BACKGROUND", 0, UINT_MAX);
 
-	if (!vop2->soc_id_prop || !vop2->vp_id_prop || !vop2->aclk_prop || !vop2->bg_prop) {
+	vop2->line_flag_prop = drm_property_create_range(vop2->drm_dev, 0, "LINE_FLAG1", 0, UINT_MAX);
+
+	if (!vop2->soc_id_prop || !vop2->vp_id_prop || !vop2->aclk_prop || !vop2->bg_prop ||
+	    !vop2->line_flag_prop) {
 		DRM_DEV_ERROR(vop2->dev, "failed to create soc_id/vp_id/aclk property\n");
 		return -ENOMEM;
 	}
diff --git a/include/uapi/drm/rockchip_drm.h b/include/uapi/drm/rockchip_drm.h
index a4625642736d..c1271c02c65f 100644
--- a/include/uapi/drm/rockchip_drm.h
+++ b/include/uapi/drm/rockchip_drm.h
@@ -17,6 +17,13 @@
 
 #include <drm/drm.h>
 
+/*
+ * Send vcnt event instead of blocking,
+ * like _DRM_VBLANK_EVENT
+ */
+#define _DRM_ROCKCHIP_VCNT_EVENT 0x80000000
+#define DRM_EVENT_ROCKCHIP_CRTC_VCNT   0xf
+
 /* memory type definitions. */
 enum drm_rockchip_gem_mem_type {
 	/* Physically Continuous memory. */
@@ -92,11 +99,16 @@ enum rockchip_cabc_mode {
 	ROCKCHIP_DRM_CABC_MODE_USERSPACE,
 };
 
+struct drm_rockchip_vcnt_event {
+	struct drm_pending_event	base;
+};
+
 #define DRM_ROCKCHIP_GEM_CREATE		0x00
 #define DRM_ROCKCHIP_GEM_MAP_OFFSET	0x01
 #define DRM_ROCKCHIP_GEM_CPU_ACQUIRE	0x02
 #define DRM_ROCKCHIP_GEM_CPU_RELEASE	0x03
 #define DRM_ROCKCHIP_GEM_GET_PHYS	0x04
+#define DRM_ROCKCHIP_GET_VCNT_EVENT	0x05
 
 #define DRM_IOCTL_ROCKCHIP_GEM_CREATE	DRM_IOWR(DRM_COMMAND_BASE + \
 		DRM_ROCKCHIP_GEM_CREATE, struct drm_rockchip_gem_create)
@@ -112,4 +124,8 @@ enum rockchip_cabc_mode {
 
 #define DRM_IOCTL_ROCKCHIP_GEM_GET_PHYS		DRM_IOWR(DRM_COMMAND_BASE + \
 		DRM_ROCKCHIP_GEM_GET_PHYS, struct drm_rockchip_gem_phys)
+
+#define DRM_IOCTL_ROCKCHIP_GET_VCNT_EVENT	DRM_IOWR(DRM_COMMAND_BASE + \
+		DRM_ROCKCHIP_GET_VCNT_EVENT, union drm_wait_vblank)
+
 #endif /* _UAPI_ROCKCHIP_DRM_H */

commit feb6da4129a65bdcee141dd8c557cf6bd0f35b75
Author: Ziyuan Xu <xzy.xu@rock-chips.com>
Date:   Sat May 15 16:31:49 2021 +0800

    mmc: block: prefer the host's capability(card_busy) than send_status
    
    According to the specification, the controller should check the device
    status before data transport. Generally, it can get the status of device
    via CMD13. It's upset that command communication will produce a little
    interrupt inside the controller.
    
    To avoid interrupt storm whilst heavily I/O request, use card_busy
    instead of send_status(CMD13).
    
    Signed-off-by: Ziyuan Xu <xzy.xu@rock-chips.com>
    Change-Id: I3ba79ba2f563006112b0157b78aab5b31911b61a

diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
index 52c98d655979..1d7138059136 100644
--- a/drivers/mmc/core/block.c
+++ b/drivers/mmc/core/block.c
@@ -458,16 +458,22 @@ static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms,
 	do {
 		bool done = time_after(jiffies, timeout);
 
-		err = __mmc_send_status(card, &status, 5);
-		if (err) {
-			dev_err(mmc_dev(card->host),
-				"error %d requesting status\n", err);
-			return err;
-		}
+		if (card->host->ops->card_busy) {
+			status = card->host->ops->card_busy(card->host) ?
+				 0 : R1_READY_FOR_DATA | R1_STATE_TRAN << 9;
+			usleep_range(100, 150);
+		} else {
+			err = __mmc_send_status(card, &status, 5);
+			if (err) {
+				dev_err(mmc_dev(card->host),
+					"error %d requesting status\n", err);
+				return err;
+			}
 
-		/* Accumulate any response error bits seen */
-		if (resp_errs)
-			*resp_errs |= status;
+			/* Accumulate any response error bits seen */
+			if (resp_errs)
+				*resp_errs |= status;
+		}
 
 		/*
 		 * Timeout if the device never becomes ready for data and never

commit ddf2490cc94b17073e8c93c191f4251175e6be00
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Tue Jun 1 21:13:29 2021 +0800

    drivers; rkflash: Support new devices
    
    W25N04KVZEIR, DS35Q2GB-IB, EM73C044VCF-H, XT26G11C, MT29F1G01ABA,
    F50L1G41XA, JS28U1GQSCAHG-83
    
    Change-Id: I38a16e26dea1624a4e101d7f965f9abfe44a3821
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/rkflash/sfc_nand.c b/drivers/rkflash/sfc_nand.c
index 9e61d3d76ac8..7a94d97f99fe 100644
--- a/drivers/rkflash/sfc_nand.c
+++ b/drivers/rkflash/sfc_nand.c
@@ -19,6 +19,7 @@ static u32 sfc_nand_get_ecc_status4(void);
 static u32 sfc_nand_get_ecc_status5(void);
 static u32 sfc_nand_get_ecc_status6(void);
 static u32 sfc_nand_get_ecc_status7(void);
+static u32 sfc_nand_get_ecc_status8(void);
 
 static struct nand_info spi_nand_tbl[] = {
 	/* TC58CVG0S0HxAIx */
@@ -66,6 +67,8 @@ static struct nand_info spi_nand_tbl[] = {
 	{ 0xEF, 0xAA, 0x21, 4, 0x40, 1, 1024, 0x4C, 18, 0x1, 0, { 0x04, 0x14, 0x24, 0xFF }, &sfc_nand_get_ecc_status1 },
 	/* W25N02KVZEIR */
 	{ 0xEF, 0xAA, 0x22, 4, 0x40, 1, 2048, 0x4C, 19, 0x8, 0, { 0x04, 0x14, 0x24, 0xFF }, &sfc_nand_get_ecc_status0 },
+	/* W25N04KVZEIR */
+	{ 0xEF, 0xAA, 0x23, 4, 0x40, 1, 4096, 0x4C, 20, 0x8, 0, { 0x04, 0x14, 0x24, 0x34 }, &sfc_nand_get_ecc_status0 },
 	/* W25N01GW */
 	{ 0xEF, 0xBA, 0x00, 4, 0x40, 1, 1024, 0x4C, 18, 0x1, 0, { 0x04, 0x14, 0x24, 0xFF }, &sfc_nand_get_ecc_status1 },
 
@@ -99,6 +102,8 @@ static struct nand_info spi_nand_tbl[] = {
 	{ 0xE5, 0x72, 0x00, 4, 0x40, 2, 1024, 0x0C, 19, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
 	/* DS35M1GA-1B */
 	{ 0xE5, 0x21, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
+	/* DS35Q2GB-IB */
+	{ 0xE5, 0xF2, 0x00, 4, 0x40, 2, 1024, 0x0C, 19, 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 },
@@ -106,6 +111,8 @@ static struct nand_info spi_nand_tbl[] = {
 	{ 0xD5, 0x20, 0x00, 4, 0x40, 1, 2048, 0x0C, 19, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
 	/* EM73E044SNA-G */
 	{ 0xD5, 0x03, 0x00, 8, 0x40, 1, 2048, 0x4C, 20, 0x8, 1, { 0x04, 0x28, 0x08, 0x2C }, &sfc_nand_get_ecc_status0 },
+	/* EM73C044VCF-H */
+	{ 0xD5, 0x25, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
 
 	/* XT26G02A */
 	{ 0x0B, 0xE2, 0x00, 4, 0x40, 1, 2048, 0x4C, 19, 0x8, 1, { 0x08, 0x0C, 0xFF, 0xFF }, &sfc_nand_get_ecc_status4 },
@@ -123,9 +130,13 @@ static struct nand_info spi_nand_tbl[] = {
 	{ 0x0B, 0x12, 0x00, 4, 0x40, 1, 2048, 0x4C, 19, 0x8, 1, { 0x08, 0x0C, 0xFF, 0xFF }, &sfc_nand_get_ecc_status7 },
 	/* XT26G04C */
 	{ 0x0B, 0x13, 0x00, 8, 0x40, 1, 2048, 0x4C, 20, 0x8, 1, { 0x04, 0x08, 0x0C, 0x10 }, &sfc_nand_get_ecc_status7 },
+	/* XT26G11C */
+	{ 0x0B, 0x15, 0x00, 4, 0x40, 1, 1024, 0x4C, 18, 0x8, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
 
 	/* MT29F2G01ABA, XT26G02E, F50L2G41XA */
-	{ 0x2C, 0x24, 0x00, 4, 0x40, 2, 1024, 0x4C, 19, 0x1, 1, { 0x20, 0x24, 0xFF, 0xFF }, &sfc_nand_get_ecc_status6 },
+	{ 0x2C, 0x24, 0x00, 4, 0x40, 2, 1024, 0x4C, 19, 0x8, 0, { 0x20, 0x24, 0xFF, 0xFF }, &sfc_nand_get_ecc_status6 },
+	/* MT29F1G01ABA, F50L1G41XA */
+	{ 0x2C, 0x14, 0x00, 4, 0x40, 1, 1024, 0x4C, 18, 0x8, 0, { 0x20, 0x24, 0xFF, 0xFF }, &sfc_nand_get_ecc_status6 },
 
 	/* FM25S01 */
 	{ 0xA1, 0xA1, 0x00, 4, 0x40, 1, 1024, 0x4C, 18, 0x1, 0, { 0x00, 0x04, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
@@ -142,6 +153,8 @@ static struct nand_info spi_nand_tbl[] = {
 	{ 0x9B, 0x12, 0x00, 4, 0x40, 1, 1024, 0x40, 18, 0x1, 1, { 0x14, 0x24, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 },
 	/* BWJX08K-2Gb */
 	{ 0xBC, 0xB3, 0x00, 4, 0x40, 1, 2048, 0x4C, 19, 0x8, 1, { 0x04, 0x10, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 },
+	/* JS28U1GQSCAHG-83 */
+	{ 0xBF, 0x21, 0x00, 4, 0x40, 1, 1024, 0x40, 18, 0x4, 1, { 0x08, 0x0C, 0xFF, 0xFF }, &sfc_nand_get_ecc_status8 },
 };
 
 static struct nand_info *p_nand_info;
@@ -456,7 +469,7 @@ static u32 sfc_nand_get_ecc_status3(void)
  * [0b1000], Multiple bit errors were detected and
  *	not corrected.
  * [0b1100], Bit error count equals the bit flip
- *	detectionthreshold
+ *	detection threshold
  * else, reserved
  */
 static u32 sfc_nand_get_ecc_status4(void)
@@ -498,7 +511,7 @@ static u32 sfc_nand_get_ecc_status4(void)
  * [0b001, 0b011], Bit errors were detected and corrected. Not
  *	reach Flipping Bits;
  * [0b100], Bit error count equals the bit flip
- *	detectionthreshold
+ *	detection threshold
  * [0b101, 0b110], Reserved;
  * [0b111], Multiple bit errors were detected and
  *	not corrected.
@@ -624,6 +637,48 @@ static u32 sfc_nand_get_ecc_status7(void)
 	return ret;
 }
 
+/*
+ * ecc spectial type8:
+ * ecc bits: 0xC0[4,6]
+ * [0b000], No bit errors were detected;
+ * [0b001, 0b011], 1~3 Bit errors were detected and corrected. Not
+ *	reach Flipping Bits;
+ * [0b100], Bit error count equals the bit flip
+ *	detection threshold
+ * others, Reserved.
+ */
+static u32 sfc_nand_get_ecc_status8(void)
+{
+	u32 ret;
+	u32 i;
+	u8 ecc;
+	u8 status;
+	u32 timeout = 1000 * 1000;
+
+	for (i = 0; i < timeout; i++) {
+		ret = sfc_nand_read_feature(0xC0, &status);
+
+		if (ret != SFC_OK)
+			return SFC_NAND_ECC_ERROR;
+
+		if (!(status & (1 << 0)))
+			break;
+
+		sfc_delay(1);
+	}
+
+	ecc = (status >> 4) & 0x07;
+
+	if (ecc < 4)
+		ret = SFC_NAND_ECC_OK;
+	else if (ecc == 4)
+		ret = SFC_NAND_ECC_REFRESH;
+	else
+		ret = (u32)SFC_NAND_ECC_ERROR;
+
+	return ret;
+}
+
 u32 sfc_nand_erase_block(u8 cs, u32 addr)
 {
 	int ret;
@@ -849,7 +904,7 @@ u32 sfc_nand_check_bad_block(u8 cs, u32 addr)
 	ret = sfc_nand_read(addr, &marker, data_size, 2);
 
 	/* unify with mtd framework */
-	if (ret == SFC_NAND_ECC_ERROR)
+	if (ret == SFC_NAND_ECC_ERROR || (u16)marker != 0xffff)
 		rkflash_print_error("%s page= %x ret= %x spare= %x\n",
 				    __func__, addr, ret, marker);
 

commit 3938a57de892b8bc227a9c7be5ca2f54ce479cdd
Author: Fenrir Lin <fenrir.lin@rock-chips.com>
Date:   Sat May 29 10:35:52 2021 +0800

    ARM: configs: add rv1126-battery-evb.config
    
    Signed-off-by: Fenrir Lin <fenrir.lin@rock-chips.com>
    Change-Id: Ib11f46996d18dc24c836a9055077fd6e52dbaebc

diff --git a/arch/arm/configs/rv1126-battery-evb.config b/arch/arm/configs/rv1126-battery-evb.config
new file mode 100644
index 000000000000..0bf4941ef112
--- /dev/null
+++ b/arch/arm/configs/rv1126-battery-evb.config
@@ -0,0 +1,39 @@
+# CONFIG_AP6XXX is not set
+CONFIG_BATTERY_CW2015=y
+CONFIG_CHARGER_GPIO=y
+CONFIG_CYW_BCMDHD=m
+CONFIG_LEDS_PWM=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_OPT3001=y
+CONFIG_PHY_ROCKCHIP_NANENG_USB2=y
+CONFIG_POWER_RESET_GPIO=y
+CONFIG_ROCKCHIP_LOW_PERFORMANCE=y
+# CONFIG_ROCKCHIP_MPP_RKVDEC is not set
+# CONFIG_ROCKCHIP_MPP_VDPU2 is not set
+CONFIG_RTC_DRV_HYM8563=y
+# CONFIG_RTL_WIRELESS_SOLUTION is not set
+CONFIG_SDIO_KEEPALIVE=y
+CONFIG_SND=y
+CONFIG_SND_DMAENGINE_PCM=y
+CONFIG_SND_PCM=y
+CONFIG_SND_SIMPLE_CARD=y
+CONFIG_SND_SIMPLE_CARD_UTILS=y
+CONFIG_SND_SOC=y
+# CONFIG_SND_SOC_DUMMY_CODEC is not set
+CONFIG_SND_SOC_ES8311=m
+CONFIG_SND_SOC_I2C_AND_SPI=y
+CONFIG_SND_SOC_ROCKCHIP=y
+# CONFIG_SND_SOC_ROCKCHIP_I2S is not set
+CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=y
+# CONFIG_SND_SOC_ROCKCHIP_PDM is not set
+CONFIG_SND_TIMER=y
+# CONFIG_SND_USB is not set
+CONFIG_SOUND=y
+# CONFIG_USB_EHCI_HCD_PLATFORM is not set
+# CONFIG_USB_OHCI_HCD_PLATFORM is not set
+# CONFIG_VIDEO_OS04A10 is not set
+CONFIG_VIDEO_OS04C10=y
+# CONFIG_VIDEO_OV2718 is not set
+# CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP is not set
+# CONFIG_SDIO_CIS_CYW43012 is not set
+CONFIG_SDIO_CIS_CYW43438=y

commit bb512e5e7e08d20c3684dd4b58e240fb71571e10
Author: Fenrir Lin <fenrir.lin@rock-chips.com>
Date:   Sat May 29 10:34:03 2021 +0800

    ARM: dts: rockchip: add rv1126-bat-evb-v10.dts
    
    Signed-off-by: Fenrir Lin <fenrir.lin@rock-chips.com>
    Change-Id: I4762d2796454c0f4b0f02620d78e2cb6cc6f9339

diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
index cae9fe1e198b..06008b35c35e 100644
--- a/arch/arm/boot/dts/Makefile
+++ b/arch/arm/boot/dts/Makefile
@@ -854,6 +854,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += \
 	rv1126-ai-cam-ddr3-v1.dtb \
 	rv1126-ai-cam-ddr3-v1-spi-nand.dtb \
 	rv1126-ai-cam-plus.dtb \
+	rv1126-bat-evb-v10.dtb \
 	rv1126-bat-ipc-v10.dtb \
 	rv1126-bat-ipc-4k-v10.dtb \
 	rv1126-evb-ddr3-v10.dtb \
diff --git a/arch/arm/boot/dts/rv1126-bat-evb-v10.dts b/arch/arm/boot/dts/rv1126-bat-evb-v10.dts
new file mode 100644
index 000000000000..a15cbb7d3da4
--- /dev/null
+++ b/arch/arm/boot/dts/rv1126-bat-evb-v10.dts
@@ -0,0 +1,420 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2020 Rockchip Electronics Co., Ltd.
+ */
+
+/dts-v1/;
+#include "rv1126.dtsi"
+#include "rv1126-bat-ipc.dtsi"
+#include "rv1126-thunder-boot-emmc.dtsi"
+#include <dt-bindings/input/input.h>
+
+/ {
+	model = "Rockchip RV1126 BAT EVB V10 Board";
+	compatible = "rockchip,rv1126-bat-evb-v10", "rockchip,rv1126";
+
+	adc-keys {
+		compatible = "adc-keys";
+		io-channels = <&saradc 0>;
+		io-channel-names = "buttons";
+		poll-interval = <100>;
+		keyup-threshold-microvolt = <1800000>;
+
+		recovery {
+			label = "Volum_up";
+			linux,code = <KEY_VOLUMEUP>;
+			press-threshold-microvolt = <0>;
+		};
+	};
+
+	cam_ircut0: cam_ircut {
+		status = "okay";
+		compatible = "ap1511a,ircut";
+		pinctrl-names = "default";
+		pinctrl-0 = <&ir_cut_en>;
+		ircut-open-gpios = <&gpio2 RK_PD5 GPIO_ACTIVE_HIGH>;
+		led-gpios = <&gpio2 RK_PB2 GPIO_ACTIVE_HIGH>;
+		rockchip,camera-module-index = <1>;
+		rockchip,camera-module-facing = "front";
+	};
+
+	i2s0_sound: i2s0-sound {
+		status = "okay";
+		compatible = "simple-audio-card";
+		simple-audio-card,format = "i2s";
+		simple-audio-card,mclk-fs = <256>;
+		simple-audio-card,name = "rockchip,i2s0-sound";
+		simple-audio-card,cpu {
+			sound-dai = <&i2s0_8ch>;
+		};
+		simple-audio-card,codec {
+			sound-dai = <&es8311>;
+		};
+	};
+
+	leds {
+		compatible = "pwm-leds";
+
+		white {
+			label = "white";
+			pwms = <&pwm2 0 50000 0>;
+			max-brightness = <255>;
+		};
+	};
+
+	vcc1v2_dvdd: vcc1v8_dovdd: vcc2v8_avdd: vcc-camera {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc_camera";
+		regulator-always-on;
+		regulator-boot-on;
+		gpio = <&gpio0 RK_PA7 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+	};
+
+	vcc_1v8: vcc-1v8 {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc_1v8";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <1800000>;
+		regulator-max-microvolt = <1800000>;
+	};
+
+	vccio_flash: vccio-flash {
+		compatible = "regulator-fixed";
+		regulator-name = "vccio_flash";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <1800000>;
+		regulator-max-microvolt = <1800000>;
+		vin-supply = <&vcc_1v8>;
+	};
+
+	vccio_sd: vccio-sd {
+		compatible = "regulator-gpio";
+		regulator-name = "vccio_sd";
+		regulator-min-microvolt = <1800000>;
+		regulator-max-microvolt = <3300000>;
+		gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_HIGH>;
+		states = <3300000 1
+			  1800000 0>;
+	};
+
+	vdd_npu_vepu: vdd-npu-vepu {
+		compatible = "pwm-regulator";
+		pwms = <&pwm1 0 5000 1>;
+		regulator-name = "vdd_npu_vepu";
+		regulator-min-microvolt = <720000>;
+		regulator-max-microvolt = <1000000>;
+		regulator-init-microvolt = <824000>;
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-settling-time-up-us = <250>;
+		pwm-supply = <&vcc_3v3>;
+	};
+
+	wireless-wlan {
+		compatible = "wlan-platdata";
+		rockchip,grf = <&grf>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&wifi_wake_host>;
+		wifi_chip_type = "cy43438";
+		WIFI,poweren_gpio = <&gpio1 RK_PC7 GPIO_ACTIVE_LOW>;
+		WIFI,host_wake_irq = <&gpio1 RK_PD1 GPIO_ACTIVE_HIGH>;
+		status = "okay";
+	};
+};
+
+&csi_dphy0 {
+	status = "okay";
+
+	ports {
+		#address-cells = <1>;
+		#size-cells = <0>;
+		port@0 {
+			reg = <0>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			mipi_in_ucam0: endpoint@1 {
+				reg = <1>;
+				remote-endpoint = <&ucam_out0>;
+				data-lanes = <1 2 3 4>;
+			};
+		};
+		port@1 {
+			reg = <1>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			csidphy0_out: endpoint@0 {
+				reg = <0>;
+				remote-endpoint = <&isp_in>;
+			};
+		};
+	};
+};
+
+&emmc {
+	bus-width = <8>;
+	cap-mmc-highspeed;
+	non-removable;
+	mmc-hs200-1_8v;
+	rockchip,default-sample-phase = <90>;
+	supports-emmc;
+	/delete-property/ pinctrl-names;
+	/delete-property/ pinctrl-0;
+	status = "okay";
+};
+
+&i2c0 {
+	status = "okay";
+
+	hym8563: hym8563@51 {
+		compatible = "haoyu,hym8563";
+		reg = <0x51>;
+		#clock-cells = <0>;
+	};
+};
+
+&i2c1 {
+	status = "okay";
+
+	os04c10: os04c10@36 {
+		compatible = "ovti,os04c10";
+		reg = <0x36>;
+		clocks = <&cru CLK_MIPICSI_OUT>;
+		clock-names = "xvclk";
+		power-domains = <&power RV1126_PD_VI>;
+		avdd-supply = <&vcc2v8_avdd>;
+		dovdd-supply = <&vcc1v8_dovdd>;
+		dvdd-supply = <&vcc1v2_dvdd>;
+		pwdn-gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_HIGH>;
+		reset-gpios = <&gpio1 RK_PD5 GPIO_ACTIVE_LOW>;
+		rockchip,camera-module-index = <1>;
+		rockchip,camera-module-facing = "front";
+		rockchip,camera-module-name = "default";
+		rockchip,camera-module-lens-name = "default";
+		ir-cut = <&cam_ircut0>;
+
+		port {
+			ucam_out0: endpoint {
+				remote-endpoint = <&mipi_in_ucam0>;
+				data-lanes = <1 2 3 4>;
+			};
+		};
+	};
+};
+
+&i2c2 {
+	status = "okay";
+	clock-frequency = <400000>;
+
+	opt3001: opt3001@44 {
+		compatible = "ti,opt3001";
+		reg = <0x44>;
+	};
+};
+
+&i2c4 {
+	status = "okay";
+	clock-frequency = <400000>;
+	pinctrl-0 = <&i2c4m1_xfer>;
+
+	es8311: es8311@18 {
+		compatible = "everest,es8311";
+		reg = <0x18>;
+		clocks = <&cru MCLK_I2S0_TX_OUT2IO>;
+		clock-names = "mclk";
+		adc-pga-gain = <6>;  /* 18dB */
+		adc-volume = <0xbf>;  /* 0dB */
+		dac-volume = <0xbf>;  /* 0dB */
+		aec-mode = "dac left, adc right";
+		pinctrl-names = "default";
+		pinctrl-0 = <&i2s0m0_mclk &spk_ctl>;
+		assigned-clocks = <&cru MCLK_I2S0_TX_OUT2IO>;
+		assigned-clock-parents = <&cru MCLK_I2S0_TX>;
+		spk-ctl-gpios = <&gpio2 RK_PA4 GPIO_ACTIVE_HIGH>;
+		#sound-dai-cells = <0>;
+	};
+};
+
+&i2c5 {
+	status = "okay";
+	pinctrl-0 = <&i2c5m0_xfer>;
+
+	CW2015@62 {
+		compatible = "cw201x";
+		reg = <0x62>;
+		bat_config_info = <0x15 0x7E 0x7A 0x6E 0x6A 0x67 0x63 0x62 0x62 0x61 0x5E
+				   0x59 0x56 0x57 0x51 0x3C 0x30 0x27 0x29 0x29 0x2E 0x3A
+				   0x49 0x57 0x64 0x57 0x0B 0x85 0x30 0x50 0x60 0x67 0x6A
+				   0x6C 0x6A 0x6C 0x39 0x14 0x64 0x0E 0x04 0x2A 0x4E 0x81
+				   0x8E 0x90 0x90 0x43 0x64 0x83 0x96 0xA5 0x80 0x86 0xAC
+				   0xCB 0x2F 0x00 0x64 0xA5 0xB5 0x00 0xF8 0x31>;
+		monitor_sec = <5>;
+		virtual_power = <0>;
+	};
+};
+
+&i2s0_8ch {
+	status = "okay";
+	#sound-dai-cells = <0>;
+	rockchip,clk-trcm = <1>;
+	rockchip,i2s-rx-route = <0 1 2 3>;
+	pinctrl-0 = <&i2s0m0_sclk_tx
+		     &i2s0m0_lrck_tx
+		     &i2s0m0_sdo0
+		     &i2s0m0_sdi0>;
+};
+
+&isp_reserved {
+	size = <0x02400000>;
+};
+
+&npu {
+	npu-supply = <&vdd_npu_vepu>;
+};
+
+&pinctrl {
+	es8311 {
+		spk_ctl: spk-ctl {
+			rockchip,pins = <2 RK_PA4 0 &pcfg_pull_none>;
+		};
+	};
+	ir-cut {
+		/omit-if-no-ref/
+		ir_cut_en: ir-cut-en {
+			rockchip,pins = <2 RK_PD4 RK_FUNC_GPIO &pcfg_output_low>;
+		};
+	};
+	wireless-wlan {
+		/omit-if-no-ref/
+		wifi_wake_host: wifi-wake-host {
+			rockchip,pins = <1 RK_PD1 RK_FUNC_GPIO &pcfg_pull_down>;
+		};
+	};
+};
+
+&pmu_io_domains {
+	status = "okay";
+
+	pmuio0-supply = <&vcc_3v3>;
+	pmuio1-supply = <&vcc_3v3>;
+	vccio2-supply = <&vccio_sd>;
+	vccio3-supply = <&vcc_1v8>;
+	vccio4-supply = <&vcc_1v8>;
+	vccio5-supply = <&vcc_3v3>;
+	vccio7-supply = <&vcc_3v3>;
+};
+
+&pwm1 {
+	status = "okay";
+	pinctrl-names = "active";
+	pinctrl-0 = <&pwm1m0_pins_pull_down>;
+};
+
+&pwm2 {
+	status = "okay";
+	pinctrl-names = "active";
+	pinctrl-0 = <&pwm2m1_pins_pull_down>;
+};
+
+&pwm3 {
+	status = "okay";
+	pinctrl-names = "active";
+	pinctrl-0 = <&pwm3m1_pins_pull_down>;
+};
+
+&rkisp_thunderboot {
+	reg = <0x08000000 (32 * 0x00100000)>;
+};
+
+&rkisp_vir0 {
+	ports {
+		port@0 {
+			reg = <0>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			isp_in: endpoint@0 {
+				reg = <0>;
+				remote-endpoint = <&csidphy0_out>;
+			};
+		};
+	};
+};
+
+&rkisp_vir1 {
+	status = "okay";
+};
+
+&rkispp_vir1 {
+	status = "okay";
+};
+
+&rkvenc {
+	venc-supply = <&vdd_npu_vepu>;
+};
+
+&rkvenc_mmu {
+	status = "okay";
+};
+
+&mpp_srv {
+	status = "okay";
+};
+
+&rockchip_suspend {
+	status = "okay";
+	rockchip,sleep-debug-en = <1>;
+	rockchip,sleep-mode-config = <
+		(0
+		| RKPM_SLP_ARMOFF
+		| RKPM_SLP_PMU_PMUALIVE_32K
+		| RKPM_SLP_PMU_DIS_OSC
+		)
+	>;
+};
+
+&saradc {
+	status = "okay";
+	vref-supply = <&vcc_1v8>;
+};
+
+&sdio {
+	max-frequency = <50000000>;
+	bus-width = <4>;
+	cap-sd-highspeed;
+	cap-sdio-irq;
+	keep-power-in-suspend;
+	rockchip,default-sample-phase = <90>;
+	supports-sdio;
+	supports-chip-alive;
+	logic-remove-card;
+	status = "okay";
+};
+
+&sdmmc {
+	bus-width = <4>;
+	cap-mmc-highspeed;
+	cap-sd-highspeed;
+	card-detect-delay = <200>;
+	rockchip,default-sample-phase = <90>;
+	supports-sd;
+	sd-uhs-sdr12;
+	sd-uhs-sdr25;
+	sd-uhs-sdr104;
+	vqmmc-supply = <&vccio_sd>;
+	status = "okay";
+};
+
+&u2phy0 {
+	vup-gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_LOW>;
+};
+
+&uart5 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&uart5m2_xfer>;
+	status = "okay";
+};

commit 5fbad35637091c5351fed0de283b1fd4e5a31280
Author: Shunhua Lan <lsh@rock-chips.com>
Date:   Wed Jun 2 11:56:35 2021 +0800

    ARM: dts: rockchip: rk628: add i2s mclk config and select test_clkout pin as mclk output
    
    Signed-off-by: Shunhua Lan <lsh@rock-chips.com>
    Change-Id: I32ef6ae68a0ffe6ac42a75de09d7995388815f03

diff --git a/arch/arm/boot/dts/rk628.dtsi b/arch/arm/boot/dts/rk628.dtsi
index 47631dbbd23d..3a2f45c7ecfa 100644
--- a/arch/arm/boot/dts/rk628.dtsi
+++ b/arch/arm/boot/dts/rk628.dtsi
@@ -368,9 +368,12 @@
 			 <&rk628_cru CGU_CLK_HDMIRX_CEC>,
 			 <&rk628_cru CGU_SCLK_VOP>,
 			 <&rk628_cru CGU_CLK_RX_READ>,
-			 <&rk628_cru CGU_PCLK_CSI>;
+			 <&rk628_cru CGU_PCLK_CSI>,
+			 <&rk628_cru CGU_CLK_TESTOUT>;
 		clock-names = "hdmirx", "imodet", "hdmirx_aud", "hdmirx_cec",
-			      "vop", "rx_read", "csi0";
+			      "vop", "rx_read", "csi0", "i2s_mclk";
+		assigned-clocks = <&rk628_cru CGU_CLK_TESTOUT>;
+		assigned-clock-parents = <&rk628_cru CGU_CLK_HDMIRX_AUD>;
 		resets = <&rk628_cru RGU_HDMIRX>,
 			 <&rk628_cru RGU_HDMIRX_PON>,
 			 <&rk628_cru RGU_DECODER>,
@@ -382,7 +385,7 @@
 		phys = <&rk628_combrxphy>, <&rk628_combtxphy>;
 		phy-names = "combrxphy", "combtxphy";
 		pinctrl-names = "default";
-		pinctrl-0 = <&rk628_hpdm0_out_pins &rk628_ddcm0_rx_pins>;
+		pinctrl-0 = <&rk628_hpdm0_out_pins &rk628_ddcm0_rx_pins &rk628_i2sm0_pins &rk628_test_clkout_pins>;
 		status = "disabled";
 	};
 };

commit 0649982abc8afae439026a425d2c3d5493fed95d
Author: Shunhua Lan <lsh@rock-chips.com>
Date:   Wed Jun 2 11:52:04 2021 +0800

    media: i2c: rk628csi: add i2s mclk
    
    Signed-off-by: Shunhua Lan <lsh@rock-chips.com>
    Change-Id: I70b5b98f37644f881d6db4c0c35a1a84a80fdbff

diff --git a/drivers/media/i2c/rk628_csi.c b/drivers/media/i2c/rk628_csi.c
index 0585ced1f46f..1446b33226e5 100644
--- a/drivers/media/i2c/rk628_csi.c
+++ b/drivers/media/i2c/rk628_csi.c
@@ -91,6 +91,7 @@ struct rk628_csi {
 	struct clk *clk_vop;
 	struct clk *clk_rx_read;
 	struct clk *clk_csi0;
+	struct clk *clk_i2s_mclk;
 	struct regmap *grf;
 	struct regmap *rxphy_regmap;
 	struct regmap *hdmirx_regmap;
@@ -1269,6 +1270,7 @@ static void rk628_csi_initial_setup(struct v4l2_subdev *sd)
 	clk_prepare_enable(csi->clk_hdmirx_cec);
 	clk_prepare_enable(csi->clk_vop);
 	clk_prepare_enable(csi->clk_csi0);
+	clk_prepare_enable(csi->clk_i2s_mclk);
 	udelay(10);
 	reset_control_assert(csi->rst_hdmirx);
 	reset_control_assert(csi->rst_hdmirx_pon);
@@ -2181,8 +2183,11 @@ static long rk628_csi_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = rk628_csi_ioctl(sd, cmd, inf);
-		if (!ret)
+		if (!ret) {
 			ret = copy_to_user(up, inf, sizeof(*inf));
+			if (ret)
+				ret = -EFAULT;
+		}
 		kfree(inf);
 		break;
 
@@ -2347,6 +2352,15 @@ static int rk628_csi_probe_of(struct rk628_csi *csi)
 		return ret;
 	}
 
+	csi->clk_i2s_mclk = devm_clk_get_optional(dev, "i2s_mclk");
+	if (IS_ERR(csi->clk_i2s_mclk)) {
+		ret = PTR_ERR(csi->clk_i2s_mclk);
+		dev_err(dev, "failed to get i2s_mclk: %d\n", ret);
+		return ret;
+	}
+	if (csi->clk_i2s_mclk == NULL)
+		dev_warn(dev, "i2s_mclk is not configured\n");
+
 	csi->rst_hdmirx = of_reset_control_get(dev->of_node, "hdmirx");
 	if (IS_ERR(csi->rst_hdmirx)) {
 		ret = PTR_ERR(csi->rst_hdmirx);
@@ -2804,6 +2818,7 @@ static int rk628_csi_remove(struct platform_device *pdev)
 	clk_disable_unprepare(csi->clk_vop);
 	clk_disable_unprepare(csi->clk_rx_read);
 	clk_disable_unprepare(csi->clk_csi0);
+	clk_disable_unprepare(csi->clk_i2s_mclk);
 
 	return 0;
 }

commit 2b78c27d58f9ed41afb18cdcb943f009b7c047c9
Author: Fenrir Lin <fenrir.lin@rock-chips.com>
Date:   Fri Jun 11 09:26:04 2021 +0800

    media: i2c: os04c10: support thunderboot mode
    
    Signed-off-by: Fenrir Lin <fenrir.lin@rock-chips.com>
    Change-Id: Ia2fe31c7eb0ee8aba44ecc3f9d102a2f89e5443c

diff --git a/drivers/media/i2c/os04c10.c b/drivers/media/i2c/os04c10.c
index 01242878d9fa..caa501f0b5b2 100644
--- a/drivers/media/i2c/os04c10.c
+++ b/drivers/media/i2c/os04c10.c
@@ -33,8 +33,9 @@
 #define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
 #endif
 
+#define OS04C10_LANES			4
 #define MIPI_FREQ_384M			384000000
-#define PIXEL_RATE_WITH_384M		(MIPI_FREQ_384M * 2 * 2 / 10)
+#define PIXEL_RATE_WITH_384M	(MIPI_FREQ_384M * 2 / 10 * OS04C10_LANES)
 
 #define OS04C10_XVCLK_FREQ		24000000
 
@@ -73,7 +74,6 @@
 #define OS04C10_REG_VALUE_16BIT		2
 #define OS04C10_REG_VALUE_24BIT		3
 
-#define OS04C10_LANES			4
 #define OS04C10_NAME			"os04c10"
 
 #define OF_CAMERA_HDR_MODE		"rockchip,camera-hdr-mode"
@@ -144,6 +144,9 @@ struct os04c10 {
 	struct mutex		mutex;
 	bool			streaming;
 	bool			power_on;
+	bool			is_thunderboot;
+	bool			is_thunderboot_ng;
+	bool			is_first_streamoff;
 	const struct os04c10_mode *cur_mode;
 	u32			cfg_num;
 	u32			module_index;
@@ -888,9 +891,11 @@ static int __os04c10_start_stream(struct os04c10 *os04c10)
 {
 	int ret;
 
-	ret = os04c10_write_array(os04c10->client, os04c10->cur_mode->reg_list);
-	if (ret)
-		return ret;
+	if (!os04c10->is_thunderboot) {
+		ret = os04c10_write_array(os04c10->client, os04c10->cur_mode->reg_list);
+		if (ret)
+			return ret;
+	}
 
 	/* In case these controls are set before streaming */
 	ret = __v4l2_ctrl_handler_setup(&os04c10->ctrl_handler);
@@ -911,6 +916,8 @@ static int __os04c10_start_stream(struct os04c10 *os04c10)
 static int __os04c10_stop_stream(struct os04c10 *os04c10)
 {
 	os04c10->has_init_exp = false;
+	if (os04c10->is_thunderboot)
+		os04c10->is_first_streamoff = true;
 	return os04c10_write_reg(os04c10->client, OS04C10_REG_CTRL_MODE,
 		OS04C10_REG_VALUE_08BIT, OS04C10_MODE_SW_STANDBY);
 }
@@ -927,6 +934,10 @@ static int os04c10_s_stream(struct v4l2_subdev *sd, int on)
 		goto unlock_and_return;
 
 	if (on) {
+		if (os04c10->is_thunderboot && rkisp_tb_get_state() == RKISP_TB_NG) {
+			os04c10->is_thunderboot = false;
+			__os04c10_power_on(os04c10);
+		}
 		ret = pm_runtime_get_sync(&client->dev);
 		if (ret < 0) {
 			pm_runtime_put_noidle(&client->dev);
@@ -999,6 +1010,9 @@ static int __os04c10_power_on(struct os04c10 *os04c10)
 	u32 delay_us;
 	struct device *dev = &os04c10->client->dev;
 
+	if (os04c10->is_thunderboot)
+		return 0;
+
 	if (!IS_ERR_OR_NULL(os04c10->pins_default)) {
 		ret = pinctrl_select_state(os04c10->pinctrl,
 					   os04c10->pins_default);
@@ -1056,6 +1070,15 @@ static void __os04c10_power_off(struct os04c10 *os04c10)
 	int ret;
 	struct device *dev = &os04c10->client->dev;
 
+	if (os04c10->is_thunderboot) {
+		if (os04c10->is_first_streamoff) {
+			os04c10->is_thunderboot = false;
+			os04c10->is_first_streamoff = false;
+		} else {
+			return;
+		}
+	}
+
 	// To avoid bad frames from MIPI
 	os04c10_write_reg(os04c10->client, 0x3021, OS04C10_REG_VALUE_08BIT, 0x00);
 	os04c10_write_reg(os04c10->client, 0x0100, OS04C10_REG_VALUE_08BIT, 0x00);
@@ -1360,6 +1383,11 @@ static int os04c10_check_sensor_id(struct os04c10 *os04c10, struct i2c_client *c
 	u32 id = 0;
 	int ret;
 
+	if (os04c10->is_thunderboot) {
+		dev_info(dev, "Enable thunderboot mode, skip sensor id check\n");
+		return 0;
+	}
+
 	ret = os04c10_read_reg(client, OS04C10_REG_CHIP_ID,
 			       OS04C10_REG_VALUE_24BIT, &id);
 
@@ -1427,6 +1455,8 @@ static int os04c10_probe(struct i2c_client *client, const struct i2c_device_id *
 	}
 	os04c10->client = client;
 
+	os04c10->is_thunderboot = IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP);
+
 	os04c10->xvclk = devm_clk_get(dev, "xvclk");
 	if (IS_ERR(os04c10->xvclk)) {
 		dev_err(dev, "Failed to get xvclk\n");

commit dfbe2188c4945e62e53a9d7095c8a77b0216b11e
Author: Vicent Chi <vicent.chi@rock-chips.com>
Date:   Tue Mar 30 15:44:43 2021 +0800

    media: i2c: imx415: support thunderboot mode
    
    Change-Id: I1634a985880d63c1f1d2873a63923fe87dc7fe68
    Signed-off-by: Vicent Chi <vicent.chi@rock-chips.com>

diff --git a/drivers/media/i2c/imx415.c b/drivers/media/i2c/imx415.c
index cc3283cd6826..570e25331e9c 100644
--- a/drivers/media/i2c/imx415.c
+++ b/drivers/media/i2c/imx415.c
@@ -44,6 +44,7 @@
 #include <media/v4l2-subdev.h>
 #include <linux/pinctrl/consumer.h>
 #include <linux/rk-preisp.h>
+#include "../platform/rockchip/isp/rkisp_tb_helper.h"
 
 #define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x06)
 
@@ -219,6 +220,9 @@ struct imx415 {
 	struct mutex		mutex;
 	bool			streaming;
 	bool			power_on;
+	bool			is_thunderboot;
+	bool			is_thunderboot_ng;
+	bool			is_first_streamoff;
 	const struct imx415_mode *cur_mode;
 	u32			module_index;
 	u32			cfg_num;
@@ -915,8 +919,15 @@ imx415_find_best_fit(struct imx415 *imx415, struct v4l2_subdev_format *fmt)
 	return &supported_modes[cur_best_fit];
 }
 
+static int __imx415_power_on(struct imx415 *imx415);
+
 static void imx415_change_mode(struct imx415 *imx415, const struct imx415_mode *mode)
 {
+	if (imx415->is_thunderboot && rkisp_tb_get_state() == RKISP_TB_NG) {
+		imx415->is_thunderboot = false;
+		imx415->is_thunderboot_ng = true;
+		__imx415_power_on(imx415);
+	}
 	imx415->cur_mode = mode;
 	imx415->cur_vts = imx415->cur_mode->vts_def;
 	dev_dbg(&imx415->client->dev, "set fmt: cur_mode: %dx%d, hdr: %d\n",
@@ -1655,12 +1666,14 @@ static int __imx415_start_stream(struct imx415 *imx415)
 {
 	int ret;
 
-	ret = imx415_write_array(imx415->client, imx415->cur_mode->global_reg_list);
-	if (ret)
-		return ret;
-	ret = imx415_write_array(imx415->client, imx415->cur_mode->reg_list);
-	if (ret)
-		return ret;
+	if (!imx415->is_thunderboot) {
+		ret = imx415_write_array(imx415->client, imx415->cur_mode->global_reg_list);
+		if (ret)
+			return ret;
+		ret = imx415_write_array(imx415->client, imx415->cur_mode->reg_list);
+		if (ret)
+			return ret;
+	}
 
 	/* In case these controls are set before streaming */
 	ret = __v4l2_ctrl_handler_setup(&imx415->ctrl_handler);
@@ -1682,6 +1695,8 @@ static int __imx415_start_stream(struct imx415 *imx415)
 static int __imx415_stop_stream(struct imx415 *imx415)
 {
 	imx415->has_init_exp = false;
+	if (imx415->is_thunderboot)
+		imx415->is_first_streamoff = true;
 	return imx415_write_reg(imx415->client, IMX415_REG_CTRL_MODE,
 				IMX415_REG_VALUE_08BIT, 1);
 }
@@ -1702,6 +1717,10 @@ static int imx415_s_stream(struct v4l2_subdev *sd, int on)
 		goto unlock_and_return;
 
 	if (on) {
+		if (imx415->is_thunderboot && rkisp_tb_get_state() == RKISP_TB_NG) {
+			imx415->is_thunderboot = false;
+			__imx415_power_on(imx415);
+		}
 		ret = pm_runtime_get_sync(&client->dev);
 		if (ret < 0) {
 			pm_runtime_put_noidle(&client->dev);
@@ -1756,11 +1775,14 @@ static int imx415_s_power(struct v4l2_subdev *sd, int on)
 	return ret;
 }
 
-static int __imx415_power_on(struct imx415 *imx415)
+int __imx415_power_on(struct imx415 *imx415)
 {
 	int ret;
 	struct device *dev = &imx415->client->dev;
 
+	if (imx415->is_thunderboot)
+		return 0;
+
 	if (!IS_ERR_OR_NULL(imx415->pins_default)) {
 		ret = pinctrl_select_state(imx415->pinctrl,
 					   imx415->pins_default);
@@ -1774,12 +1796,12 @@ static int __imx415_power_on(struct imx415 *imx415)
 		goto err_pinctrl;
 	}
 	if (!IS_ERR(imx415->power_gpio))
-		gpiod_set_value_cansleep(imx415->power_gpio, 1);
+		gpiod_direction_output(imx415->power_gpio, 1);
 	/* At least 500ns between power raising and XCLR */
 	/* fix power on timing if insmod this ko */
 	usleep_range(10 * 1000, 20 * 1000);
 	if (!IS_ERR(imx415->reset_gpio))
-		gpiod_set_value_cansleep(imx415->reset_gpio, 0);
+		gpiod_direction_output(imx415->reset_gpio, 0);
 
 	/* At least 1us between XCLR and clk */
 	/* fix power on timing if insmod this ko */
@@ -1802,7 +1824,7 @@ static int __imx415_power_on(struct imx415 *imx415)
 
 err_clk:
 	if (!IS_ERR(imx415->reset_gpio))
-		gpiod_set_value_cansleep(imx415->reset_gpio, 1);
+		gpiod_direction_output(imx415->reset_gpio, 1);
 	regulator_bulk_disable(IMX415_NUM_SUPPLIES, imx415->supplies);
 
 err_pinctrl:
@@ -1817,8 +1839,17 @@ static void __imx415_power_off(struct imx415 *imx415)
 	int ret;
 	struct device *dev = &imx415->client->dev;
 
+	if (imx415->is_thunderboot) {
+		if (imx415->is_first_streamoff) {
+			imx415->is_thunderboot = false;
+			imx415->is_first_streamoff = false;
+		} else {
+			return;
+		}
+	}
+
 	if (!IS_ERR(imx415->reset_gpio))
-		gpiod_set_value_cansleep(imx415->reset_gpio, 1);
+		gpiod_direction_output(imx415->reset_gpio, 1);
 	clk_disable_unprepare(imx415->xvclk);
 	if (!IS_ERR_OR_NULL(imx415->pins_sleep)) {
 		ret = pinctrl_select_state(imx415->pinctrl,
@@ -1827,7 +1858,7 @@ static void __imx415_power_off(struct imx415 *imx415)
 			dev_dbg(dev, "could not set pins\n");
 	}
 	if (!IS_ERR(imx415->power_gpio))
-		gpiod_set_value_cansleep(imx415->power_gpio, 0);
+		gpiod_direction_output(imx415->power_gpio, 0);
 	regulator_bulk_disable(IMX415_NUM_SUPPLIES, imx415->supplies);
 }
 
@@ -2163,6 +2194,11 @@ static int imx415_check_sensor_id(struct imx415 *imx415,
 	u32 id = 0;
 	int ret;
 
+	if (imx415->is_thunderboot) {
+		dev_info(dev, "Enable thunderboot mode, skip sensor id check\n");
+		return 0;
+	}
+
 	ret = imx415_read_reg(client, IMX415_REG_CHIP_ID,
 			      IMX415_REG_VALUE_08BIT, &id);
 	if (id != CHIP_ID) {
@@ -2234,16 +2270,18 @@ static int imx415_probe(struct i2c_client *client,
 		}
 	}
 
+	imx415->is_thunderboot = IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP);
+
 	imx415->xvclk = devm_clk_get(dev, "xvclk");
 	if (IS_ERR(imx415->xvclk)) {
 		dev_err(dev, "Failed to get xvclk\n");
 		return -EINVAL;
 	}
 
-	imx415->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+	imx415->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_ASIS);
 	if (IS_ERR(imx415->reset_gpio))
 		dev_warn(dev, "Failed to get reset-gpios\n");
-	imx415->power_gpio = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW);
+	imx415->power_gpio = devm_gpiod_get(dev, "power", GPIOD_ASIS);
 	if (IS_ERR(imx415->power_gpio))
 		dev_warn(dev, "Failed to get power-gpios\n");
 	imx415->pinctrl = devm_pinctrl_get(dev);

commit 274d688a9f9289fbe0823e5fae219c7b409acec5
Author: Joseph Chen <chenjh@rock-chips.com>
Date:   Thu Jun 10 14:52:07 2021 +0800

    ARM: dts: rockchip: rk3308-dot-rk816-v10-aarch32: remove RKPM_DBG_FSM_SOUT
    
    RKPM_DBG_FSM_SOUT enables PMU FSM state signal output through
    GPIO4_D5/SDMMC_CLK during sleep, mainly for debug PMU FSM flow.
    
    Some one may use this pin as LED light, it's fine to drop it
    to avoid influence on LED.
    
    Signed-off-by: Joseph Chen <chenjh@rock-chips.com>
    Change-Id: I54705292226d82829bc37db0758aa0d9a9995658

diff --git a/arch/arm/boot/dts/rk3308-dot-rk816-v10-aarch32.dts b/arch/arm/boot/dts/rk3308-dot-rk816-v10-aarch32.dts
index a5e995a97160..8c5e7e71f3d8 100644
--- a/arch/arm/boot/dts/rk3308-dot-rk816-v10-aarch32.dts
+++ b/arch/arm/boot/dts/rk3308-dot-rk816-v10-aarch32.dts
@@ -429,7 +429,6 @@
 		(0
 		| RKPM_ARMOFF
 		| RKPM_PMU_HW_PLLS_PD
-		| RKPM_DBG_FSM_SOUT
 		)
 	>;
 

commit 5da4c5d59aacc6ecca24a413c5295ca4665cdad1
Author: Joseph Chen <chenjh@rock-chips.com>
Date:   Thu Jun 10 14:41:15 2021 +0800

    arm64: dts: rockchip: rk3308: remove RKPM_DBG_FSM_SOUT
    
    RKPM_DBG_FSM_SOUT enables PMU FSM state signal output through
    GPIO4_D5/SDMMC_CLK during sleep, mainly for debug PMU FSM flow.
    
    Some one may use this pin as LED light, it's fine to drop it
    to avoid influence on LED.
    
    Signed-off-by: Joseph Chen <chenjh@rock-chips.com>
    Change-Id: I82af5fa676d6db8b81e877729c44b976bbfa9ea5

diff --git a/arch/arm64/boot/dts/rockchip/rk3308.dtsi b/arch/arm64/boot/dts/rockchip/rk3308.dtsi
index dc8216b6a04f..cb3403c50de5 100644
--- a/arch/arm64/boot/dts/rockchip/rk3308.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3308.dtsi
@@ -345,7 +345,6 @@
 		rockchip,sleep-mode-config = <
 			(0
 			| RKPM_PMU_HW_PLLS_PD
-			| RKPM_DBG_FSM_SOUT
 			)
 		>;
 		rockchip,wakeup-config = <
diff --git a/arch/arm64/boot/dts/rockchip/rk3308k.dtsi b/arch/arm64/boot/dts/rockchip/rk3308k.dtsi
index c0823cdcf588..ffd53fd158c5 100644
--- a/arch/arm64/boot/dts/rockchip/rk3308k.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3308k.dtsi
@@ -22,7 +22,6 @@
 	rockchip,sleep-mode-config = <
 		(0
 		| RKPM_PMU_HW_PLLS_PD
-		| RKPM_DBG_FSM_SOUT
 		| RKPM_PWM_VOLTAGE_DEFAULT
 		)
 	>;

commit 5902a56f5252af3855aa7f867260d6d064a160a4
Author: Alex Zhao <zzc@rock-chips.com>
Date:   Thu Jun 10 17:11:36 2021 +0800

    net: rockchip_wlan: rtl8821cs: suspend don't turn off the wifi power.
    
    Signed-off-by: Alex Zhao <zzc@rock-chips.com>
    Change-Id: I97b5de41d642a05ed914e9d9f86307bd9c7adc34

diff --git a/drivers/net/wireless/rockchip_wlan/rtl8821cs/os_dep/linux/sdio_intf.c b/drivers/net/wireless/rockchip_wlan/rtl8821cs/os_dep/linux/sdio_intf.c
index 4eca7948a317..4497deb1fa8a 100644
--- a/drivers/net/wireless/rockchip_wlan/rtl8821cs/os_dep/linux/sdio_intf.c
+++ b/drivers/net/wireless/rockchip_wlan/rtl8821cs/os_dep/linux/sdio_intf.c
@@ -1191,8 +1191,8 @@ extern int pm_netdev_close(struct net_device *pnetdev, u8 bnormal);
 
 static int rtw_sdio_suspend(struct device *dev)
 {
-	struct sdio_func *func = dev_to_sdio_func(dev);
-	struct dvobj_priv *psdpriv;
+	struct sdio_func *func = NULL;
+	struct dvobj_priv *psdpriv = NULL;
 	struct pwrctrl_priv *pwrpriv = NULL;
 	_adapter *padapter = NULL;
 	struct debug_priv *pdbgpriv = NULL;
@@ -1204,7 +1204,11 @@ static int rtw_sdio_suspend(struct device *dev)
 #endif
 
 	if (dev == NULL)
-		goto exit;
+		goto exit_1;
+
+	func = dev_to_sdio_func(dev);
+	if (!func)
+		goto exit_1;
 
 	psdpriv = sdio_get_drvdata(func);
 	if (psdpriv == NULL)
@@ -1226,6 +1230,7 @@ static int rtw_sdio_suspend(struct device *dev)
 
 	ret = rtw_suspend_common(padapter);
 
+exit:
 #ifdef CONFIG_RTW_SDIO_PM_KEEP_POWER
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 34))
 	/* Android 4.0 don't support WIFI close power */
@@ -1246,7 +1251,7 @@ static int rtw_sdio_suspend(struct device *dev)
 	}
 #endif
 #endif
-exit:
+exit_1:
 	return ret;
 }
 int rtw_resume_process(_adapter *padapter)

commit 6fcf87747e0ed39902a10101a747c822b81c50e8
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Thu Jun 10 21:36:36 2021 +0200

    Revert "perf/cgroups: Don't rotate events for cgroups unnecessarily"
    
    This reverts commit 0b4c9255a1d0d08fa8a2d8bc97302756d0e9e98d as it
    breaks the abi.
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I3a4cbfa1cfbef15a6aaabf759dc2bbfaa8f2b47a

diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index b82569457509..678ccb27d087 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -761,11 +761,6 @@ struct perf_event_context {
 	int				nr_stat;
 	int				nr_freq;
 	int				rotate_disable;
-	/*
-	 * Set when nr_events != nr_active, except tolerant to events not
-	 * necessary to be active due to scheduling constraints, such as cgroups.
-	 */
-	int				rotate_necessary;
 	atomic_t			refcount;
 	struct task_struct		*task;
 
diff --git a/kernel/events/core.c b/kernel/events/core.c
index d6b9d5474ad9..8cc55f5854e4 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -2952,12 +2952,6 @@ static void ctx_sched_out(struct perf_event_context *ctx,
 	if (!ctx->nr_active || !(is_active & EVENT_ALL))
 		return;
 
-	/*
-	 * If we had been multiplexing, no rotations are necessary, now no events
-	 * are active.
-	 */
-	ctx->rotate_necessary = 0;
-
 	perf_pmu_disable(ctx->pmu);
 	if (is_active & EVENT_PINNED) {
 		list_for_each_entry_safe(event, tmp, &ctx->pinned_active, active_list)
@@ -3325,13 +3319,10 @@ static int flexible_sched_in(struct perf_event *event, void *data)
 		return 0;
 
 	if (group_can_go_on(event, sid->cpuctx, sid->can_add_hw)) {
-		int ret = group_sched_in(event, sid->cpuctx, sid->ctx);
-		if (ret) {
+		if (!group_sched_in(event, sid->cpuctx, sid->ctx))
+			list_add_tail(&event->active_list, &sid->ctx->flexible_active);
+		else
 			sid->can_add_hw = 0;
-			sid->ctx->rotate_necessary = 1;
-			return 0;
-		}
-		list_add_tail(&event->active_list, &sid->ctx->flexible_active);
 	}
 
 	return 0;
@@ -3699,17 +3690,24 @@ ctx_first_active(struct perf_event_context *ctx)
 static bool perf_rotate_context(struct perf_cpu_context *cpuctx)
 {
 	struct perf_event *cpu_event = NULL, *task_event = NULL;
-	struct perf_event_context *task_ctx = NULL;
-	int cpu_rotate, task_rotate;
+	bool cpu_rotate = false, task_rotate = false;
+	struct perf_event_context *ctx = NULL;
 
 	/*
 	 * Since we run this from IRQ context, nobody can install new
 	 * events, thus the event count values are stable.
 	 */
 
-	cpu_rotate = cpuctx->ctx.rotate_necessary;
-	task_ctx = cpuctx->task_ctx;
-	task_rotate = task_ctx ? task_ctx->rotate_necessary : 0;
+	if (cpuctx->ctx.nr_events) {
+		if (cpuctx->ctx.nr_events != cpuctx->ctx.nr_active)
+			cpu_rotate = true;
+	}
+
+	ctx = cpuctx->task_ctx;
+	if (ctx && ctx->nr_events) {
+		if (ctx->nr_events != ctx->nr_active)
+			task_rotate = true;
+	}
 
 	if (!(cpu_rotate || task_rotate))
 		return false;
@@ -3718,7 +3716,7 @@ static bool perf_rotate_context(struct perf_cpu_context *cpuctx)
 	perf_pmu_disable(cpuctx->ctx.pmu);
 
 	if (task_rotate)
-		task_event = ctx_first_active(task_ctx);
+		task_event = ctx_first_active(ctx);
 	if (cpu_rotate)
 		cpu_event = ctx_first_active(&cpuctx->ctx);
 
@@ -3726,17 +3724,17 @@ static bool perf_rotate_context(struct perf_cpu_context *cpuctx)
 	 * As per the order given at ctx_resched() first 'pop' task flexible
 	 * and then, if needed CPU flexible.
 	 */
-	if (task_event || (task_ctx && cpu_event))
-		ctx_sched_out(task_ctx, cpuctx, EVENT_FLEXIBLE);
+	if (task_event || (ctx && cpu_event))
+		ctx_sched_out(ctx, cpuctx, EVENT_FLEXIBLE);
 	if (cpu_event)
 		cpu_ctx_sched_out(cpuctx, EVENT_FLEXIBLE);
 
 	if (task_event)
-		rotate_ctx(task_ctx, task_event);
+		rotate_ctx(ctx, task_event);
 	if (cpu_event)
 		rotate_ctx(&cpuctx->ctx, cpu_event);
 
-	perf_event_sched_in(cpuctx, task_ctx, current);
+	perf_event_sched_in(cpuctx, ctx, current);
 
 	perf_pmu_enable(cpuctx->ctx.pmu);
 	perf_ctx_unlock(cpuctx, cpuctx->task_ctx);

commit 5e002cfc49c0bcd9cbd6403874243df030805698
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Thu Jun 10 21:36:32 2021 +0200

    Revert "perf/core: Fix corner case in perf_rotate_context()"
    
    This reverts commit c31789645b7bdcf6f55969974d55336831652055 as it
    breaks the abi.
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: Iac4d2decc2a576084ece3e4533eb15a01228365e

diff --git a/kernel/events/core.c b/kernel/events/core.c
index 7556f8aa33da..d6b9d5474ad9 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -3689,23 +3689,11 @@ static void rotate_ctx(struct perf_event_context *ctx, struct perf_event *event)
 	perf_event_groups_insert(&ctx->flexible_groups, event);
 }
 
-/* pick an event from the flexible_groups to rotate */
 static inline struct perf_event *
-ctx_event_to_rotate(struct perf_event_context *ctx)
+ctx_first_active(struct perf_event_context *ctx)
 {
-	struct perf_event *event;
-
-	/* pick the first active flexible event */
-	event = list_first_entry_or_null(&ctx->flexible_active,
-					 struct perf_event, active_list);
-
-	/* if no active flexible event, pick the first event */
-	if (!event) {
-		event = rb_entry_safe(rb_first(&ctx->flexible_groups.tree),
-				      typeof(*event), group_node);
-	}
-
-	return event;
+	return list_first_entry_or_null(&ctx->flexible_active,
+					struct perf_event, active_list);
 }
 
 static bool perf_rotate_context(struct perf_cpu_context *cpuctx)
@@ -3730,9 +3718,9 @@ static bool perf_rotate_context(struct perf_cpu_context *cpuctx)
 	perf_pmu_disable(cpuctx->ctx.pmu);
 
 	if (task_rotate)
-		task_event = ctx_event_to_rotate(task_ctx);
+		task_event = ctx_first_active(task_ctx);
 	if (cpu_rotate)
-		cpu_event = ctx_event_to_rotate(&cpuctx->ctx);
+		cpu_event = ctx_first_active(&cpuctx->ctx);
 
 	/*
 	 * As per the order given at ctx_resched() first 'pop' task flexible

commit 7fb3f18d8f2490509d2c7cdca8d2caf1cde63e97
Merge: ea6ea821c590 9a2dc0e6c531
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Thu Jun 10 15:08:23 2021 +0200

    Merge 4.19.194 into android-4.19-stable
    
    Changes in 4.19.194
            net: usb: cdc_ncm: don't spew notifications
            ALSA: usb: update old-style static const declaration
            nl80211: validate key indexes for cfg80211_registered_device
            efi: Allow EFI_MEMORY_XP and EFI_MEMORY_RO both to be cleared
            efi: cper: fix snprintf() use in cper_dimm_err_location()
            vfio/pci: Fix error return code in vfio_ecap_init()
            vfio/pci: zap_vma_ptes() needs MMU
            samples: vfio-mdev: fix error handing in mdpy_fb_probe()
            vfio/platform: fix module_put call in error flow
            ipvs: ignore IP_VS_SVC_F_HASHED flag when adding service
            HID: pidff: fix error return code in hid_pidff_init()
            HID: i2c-hid: fix format string mismatch
            netfilter: nfnetlink_cthelper: hit EBUSY on updates if size mismatches
            ieee802154: fix error return code in ieee802154_add_iface()
            ieee802154: fix error return code in ieee802154_llsec_getparams()
            ixgbevf: add correct exception tracing for XDP
            tipc: add extack messages for bearer/media failure
            tipc: fix unique bearer names sanity check
            Bluetooth: fix the erroneous flush_work() order
            Bluetooth: use correct lock to prevent UAF of hdev object
            net: caif: added cfserl_release function
            net: caif: add proper error handling
            net: caif: fix memory leak in caif_device_notify
            net: caif: fix memory leak in cfusbl_device_notify
            HID: multitouch: require Finger field to mark Win8 reports as MT
            ALSA: timer: Fix master timer notification
            ALSA: hda: Fix for mute key LED for HP Pavilion 15-CK0xx
            ext4: fix bug on in ext4_es_cache_extent as ext4_split_extent_at failed
            usb: dwc2: Fix build in periphal-only mode
            pid: take a reference when initializing `cad_pid`
            ocfs2: fix data corruption by fallocate
            nfc: fix NULL ptr dereference in llcp_sock_getname() after failed connect
            x86/apic: Mark _all_ legacy interrupts when IO/APIC is missing
            btrfs: mark ordered extent and inode with error if we fail to finish
            btrfs: fix error handling in btrfs_del_csums
            btrfs: return errors from btrfs_del_csums in cleanup_ref_head
            btrfs: fixup error handling in fixup_inode_link_counts
            mm, hugetlb: fix simple resv_huge_pages underflow on UFFDIO_COPY
            bpf: fix test suite to enable all unpriv program types
            bpf: test make sure to run unpriv test cases in test_verifier
            selftests/bpf: Generalize dummy program types
            bpf: Add BPF_F_ANY_ALIGNMENT.
            bpf: Adjust F_NEEDS_EFFICIENT_UNALIGNED_ACCESS handling in test_verifier.c
            bpf: Make more use of 'any' alignment in test_verifier.c
            bpf: Apply F_NEEDS_EFFICIENT_UNALIGNED_ACCESS to more ACCEPT test cases.
            selftests/bpf: add "any alignment" annotation for some tests
            selftests/bpf: Avoid running unprivileged tests with alignment requirements
            bnxt_en: Remove the setting of dev_port.
            perf/cgroups: Don't rotate events for cgroups unnecessarily
            perf/core: Fix corner case in perf_rotate_context()
            btrfs: fix unmountable seed device after fstrim
            KVM: SVM: Truncate GPR value for DR and CR accesses in !64-bit mode
            KVM: arm64: Fix debug register indexing
            ACPI: probe ECDT before loading AML tables regardless of module-level code flag
            ACPI: EC: Look for ECDT EC after calling acpi_load_tables()
            sched/fair: Optimize select_idle_cpu
            xen-pciback: redo VF placement in the virtual topology
            Linux 4.19.194
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I87188f5f931bdb7987f2946859f899a42e29f4b1

commit 9a2dc0e6c531d595bcdf2c66d0be131679bd02df
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Thu Jun 10 13:24:09 2021 +0200

    Linux 4.19.194
    
    Link: https://lore.kernel.org/r/20210608175932.263480586@linuxfoundation.org
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Link: https://lore.kernel.org/r/20210609062858.532803536@linuxfoundation.org
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Jason Self <jason@bluehome.net>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index e5d41b6792d7..8ea26b64b334 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 193
+SUBLEVEL = 194
 EXTRAVERSION =
 NAME = "People's Front"
 

commit ed6a024f4888df6fa2b8a3e92dea5f6a63649b84
Author: Jan Beulich <jbeulich@suse.com>
Date:   Tue May 18 18:13:42 2021 +0200

    xen-pciback: redo VF placement in the virtual topology
    
    The commit referenced below was incomplete: It merely affected what
    would get written to the vdev-<N> xenstore node. The guest would still
    find the function at the original function number as long as
    __xen_pcibk_get_pci_dev() wouldn't be in sync. The same goes for AER wrt
    __xen_pcibk_get_pcifront_dev().
    
    Undo overriding the function to zero and instead make sure that VFs at
    function zero remain alone in their slot. This has the added benefit of
    improving overall capacity, considering that there's only a total of 32
    slots available right now (PCI segment and bus can both only ever be
    zero at present).
    
    This is upstream commit 4ba50e7c423c29639878c00573288869aa627068.
    
    Fixes: 8a5248fe10b1 ("xen PV passthru: assign SR-IOV virtual functions to
    separate virtual slots")
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Link: https://lore.kernel.org/r/8def783b-404c-3452-196d-3f3fd4d72c9e@suse.com
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/xen/xen-pciback/vpci.c b/drivers/xen/xen-pciback/vpci.c
index f6ba18191c0f..30313084f06c 100644
--- a/drivers/xen/xen-pciback/vpci.c
+++ b/drivers/xen/xen-pciback/vpci.c
@@ -69,7 +69,7 @@ static int __xen_pcibk_add_pci_dev(struct xen_pcibk_device *pdev,
 				   struct pci_dev *dev, int devid,
 				   publish_pci_dev_cb publish_cb)
 {
-	int err = 0, slot, func = -1;
+	int err = 0, slot, func = PCI_FUNC(dev->devfn);
 	struct pci_dev_entry *t, *dev_entry;
 	struct vpci_dev_data *vpci_dev = pdev->pci_dev_data;
 
@@ -94,23 +94,26 @@ static int __xen_pcibk_add_pci_dev(struct xen_pcibk_device *pdev,
 
 	/*
 	 * Keep multi-function devices together on the virtual PCI bus, except
-	 * virtual functions.
+	 * that we want to keep virtual functions at func 0 on their own. They
+	 * aren't multi-function devices and hence their presence at func 0
+	 * may cause guests to not scan the other functions.
 	 */
-	if (!dev->is_virtfn) {
+	if (!dev->is_virtfn || func) {
 		for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
 			if (list_empty(&vpci_dev->dev_list[slot]))
 				continue;
 
 			t = list_entry(list_first(&vpci_dev->dev_list[slot]),
 				       struct pci_dev_entry, list);
+			if (t->dev->is_virtfn && !PCI_FUNC(t->dev->devfn))
+				continue;
 
 			if (match_slot(dev, t->dev)) {
 				pr_info("vpci: %s: assign to virtual slot %d func %d\n",
 					pci_name(dev), slot,
-					PCI_FUNC(dev->devfn));
+					func);
 				list_add_tail(&dev_entry->list,
 					      &vpci_dev->dev_list[slot]);
-				func = PCI_FUNC(dev->devfn);
 				goto unlock;
 			}
 		}
@@ -123,7 +126,6 @@ static int __xen_pcibk_add_pci_dev(struct xen_pcibk_device *pdev,
 				pci_name(dev), slot);
 			list_add_tail(&dev_entry->list,
 				      &vpci_dev->dev_list[slot]);
-			func = dev->is_virtfn ? 0 : PCI_FUNC(dev->devfn);
 			goto unlock;
 		}
 	}

commit b5cd7f229609cf328664aedb056a6fd744e0068b
Author: Cheng Jian <cj.chengjian@huawei.com>
Date:   Fri Dec 13 10:45:30 2019 +0800

    sched/fair: Optimize select_idle_cpu
    
    commit 60588bfa223ff675b95f866249f90616613fbe31 upstream.
    
    select_idle_cpu() will scan the LLC domain for idle CPUs,
    it's always expensive. so the next commit :
    
            1ad3aaf3fcd2 ("sched/core: Implement new approach to scale select_idle_cpu()")
    
    introduces a way to limit how many CPUs we scan.
    
    But it consume some CPUs out of 'nr' that are not allowed
    for the task and thus waste our attempts. The function
    always return nr_cpumask_bits, and we can't find a CPU
    which our task is allowed to run.
    
    Cpumask may be too big, similar to select_idle_core(), use
    per_cpu_ptr 'select_idle_mask' to prevent stack overflow.
    
    Fixes: 1ad3aaf3fcd2 ("sched/core: Implement new approach to scale select_idle_cpu()")
    Signed-off-by: Cheng Jian <cj.chengjian@huawei.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
    Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org>
    Reviewed-by: Valentin Schneider <valentin.schneider@arm.com>
    Link: https://lkml.kernel.org/r/20191213024530.28052-1-cj.chengjian@huawei.com
    Signed-off-by: Yang Wei <yang.wei@linux.alibaba.com>
    Tested-by: Yang Wei <yang.wei@linux.alibaba.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 80392cdd5f3b..f06687053f96 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -6154,6 +6154,7 @@ static inline int select_idle_smt(struct task_struct *p, struct sched_domain *sd
  */
 static int select_idle_cpu(struct task_struct *p, struct sched_domain *sd, int target)
 {
+	struct cpumask *cpus = this_cpu_cpumask_var_ptr(select_idle_mask);
 	struct sched_domain *this_sd;
 	u64 avg_cost, avg_idle;
 	u64 time, cost;
@@ -6184,11 +6185,11 @@ static int select_idle_cpu(struct task_struct *p, struct sched_domain *sd, int t
 
 	time = local_clock();
 
-	for_each_cpu_wrap(cpu, sched_domain_span(sd), target) {
+	cpumask_and(cpus, sched_domain_span(sd), &p->cpus_allowed);
+
+	for_each_cpu_wrap(cpu, cpus, target) {
 		if (!--nr)
 			return -1;
-		if (!cpumask_test_cpu(cpu, &p->cpus_allowed))
-			continue;
 		if (available_idle_cpu(cpu))
 			break;
 	}

commit f47c2c06982efbeb8f3aaa418fca1e3cf3b9792c
Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Date:   Wed Jan 9 00:34:37 2019 +0100

    ACPI: EC: Look for ECDT EC after calling acpi_load_tables()
    
    commit b1c0330823fe842dbb34641f1410f0afa51c29d3 upstream.
    
    Some systems have had functional issues since commit 5a8361f7ecce
    (ACPICA: Integrate package handling with module-level code) that,
    among other things, changed the initial values of the
    acpi_gbl_group_module_level_code and acpi_gbl_parse_table_as_term_list
    global flags in ACPICA which implicitly caused acpi_ec_ecdt_probe() to
    be called before acpi_load_tables() on the vast majority of platforms.
    
    Namely, before commit 5a8361f7ecce, acpi_load_tables() was called from
    acpi_early_init() if acpi_gbl_parse_table_as_term_list was FALSE and
    acpi_gbl_group_module_level_code was TRUE, which almost always was
    the case as FALSE and TRUE were their initial values, respectively.
    The acpi_gbl_parse_table_as_term_list value would be changed to TRUE
    for a couple of platforms in acpi_quirks_dmi_table[], but it remained
    FALSE in the vast majority of cases.
    
    After commit 5a8361f7ecce, the initial values of the two flags have
    been reversed, so in effect acpi_load_tables() has not been called
    from acpi_early_init() any more.  That, in turn, affects
    acpi_ec_ecdt_probe() which is invoked before acpi_load_tables() now
    and it is not possible to evaluate the _REG method for the EC address
    space handler installed by it.  That effectively causes the EC address
    space to be inaccessible to AML on platforms with an ECDT matching the
    EC device definition in the DSDT and functional problems ensue in
    there.
    
    Because the default behavior before commit 5a8361f7ecce was to call
    acpi_ec_ecdt_probe() after acpi_load_tables(), it should be safe to
    do that again.  Moreover, the EC address space handler installed by
    acpi_ec_ecdt_probe() is only needed for AML to be able to access the
    EC address space and the only AML that can run during acpi_load_tables()
    is module-level code which only is allowed to access address spaces
    with default handlers (memory, I/O and PCI config space).
    
    For this reason, move the acpi_ec_ecdt_probe() invocation back to
    acpi_bus_init(), from where it was taken away by commit d737f333b211
    (ACPI: probe ECDT before loading AML tables regardless of module-level
    code flag), and put it after the invocation of acpi_load_tables() to
    restore the original code ordering from before commit 5a8361f7ecce.
    
    Fixes: 5a8361f7ecce ("ACPICA: Integrate package handling with module-level code")
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=199981
    Reported-by: step-ali <sunmooon15@gmail.com>
    Reported-by: Charles Stanhope <charles.stanhope@gmail.com>
    Tested-by: Charles Stanhope <charles.stanhope@gmail.com>
    Reported-by: Paulo Nascimento <paulo.ulusu@googlemail.com>
    Reported-by: David Purton <dcpurton@marshwiggle.net>
    Reported-by: Adam Harvey <adam@adamharvey.name>
    Reported-by: Zhang Rui <rui.zhang@intel.com>
    Tested-by: Zhang Rui <rui.zhang@intel.com>
    Tested-by: Jean-Marc Lenoir <archlinux@jihemel.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Cc: Lauren?iu P?ncescu <lpancescu@gmail.com>
    Cc: Salvatore Bonaccorso <carnil@debian.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
index 1063b762dda2..d60e57d14c85 100644
--- a/drivers/acpi/bus.c
+++ b/drivers/acpi/bus.c
@@ -1054,18 +1054,6 @@ void __init acpi_early_init(void)
 		goto error0;
 	}
 
-	/*
-	 * ACPI 2.0 requires the EC driver to be loaded and work before
-	 * the EC device is found in the namespace (i.e. before
-	 * acpi_load_tables() is called).
-	 *
-	 * This is accomplished by looking for the ECDT table, and getting
-	 * the EC parameters out of that.
-	 *
-	 * Ignore the result. Not having an ECDT is not fatal.
-	 */
-	status = acpi_ec_ecdt_probe();
-
 #ifdef CONFIG_X86
 	if (!acpi_ioapic) {
 		/* compatible (0) means level (3) */
@@ -1142,6 +1130,18 @@ static int __init acpi_bus_init(void)
 		goto error1;
 	}
 
+	/*
+	 * ACPI 2.0 requires the EC driver to be loaded and work before the EC
+	 * device is found in the namespace.
+	 *
+	 * This is accomplished by looking for the ECDT table and getting the EC
+	 * parameters out of that.
+	 *
+	 * Do that before calling acpi_initialize_objects() which may trigger EC
+	 * address space accesses.
+	 */
+	acpi_ec_ecdt_probe();
+
 	status = acpi_enable_subsystem(ACPI_NO_ACPI_ENABLE);
 	if (ACPI_FAILURE(status)) {
 		printk(KERN_ERR PREFIX

commit eeb48f5ca3ab66d793a911917712929875385059
Author: Erik Schmauss <erik.schmauss@intel.com>
Date:   Wed Oct 17 15:41:21 2018 -0700

    ACPI: probe ECDT before loading AML tables regardless of module-level code flag
    
    commit d737f333b211361b6e239fc753b84c3be2634aaa upstream.
    
    It was discovered that AML tables were loaded before or after the
    ECDT depending on acpi_gbl_execute_tables_as_methods. According to
    the ACPI spec, the ECDT should be loaded before the namespace is
    populated by loading AML tables (DSDT and SSDT). Since the ECDT
    should be loaded early in the boot process, this change moves the
    ECDT probing to acpi_early_init.
    
    Signed-off-by: Erik Schmauss <erik.schmauss@intel.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Cc: Lauren?iu P?ncescu <lpancescu@gmail.com>
    Cc: Salvatore Bonaccorso <carnil@debian.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
index 92a146861086..1063b762dda2 100644
--- a/drivers/acpi/bus.c
+++ b/drivers/acpi/bus.c
@@ -1054,15 +1054,17 @@ void __init acpi_early_init(void)
 		goto error0;
 	}
 
-	if (!acpi_gbl_execute_tables_as_methods &&
-	    acpi_gbl_group_module_level_code) {
-		status = acpi_load_tables();
-		if (ACPI_FAILURE(status)) {
-			printk(KERN_ERR PREFIX
-			       "Unable to load the System Description Tables\n");
-			goto error0;
-		}
-	}
+	/*
+	 * ACPI 2.0 requires the EC driver to be loaded and work before
+	 * the EC device is found in the namespace (i.e. before
+	 * acpi_load_tables() is called).
+	 *
+	 * This is accomplished by looking for the ECDT table, and getting
+	 * the EC parameters out of that.
+	 *
+	 * Ignore the result. Not having an ECDT is not fatal.
+	 */
+	status = acpi_ec_ecdt_probe();
 
 #ifdef CONFIG_X86
 	if (!acpi_ioapic) {
@@ -1133,25 +1135,11 @@ static int __init acpi_bus_init(void)
 
 	acpi_os_initialize1();
 
-	/*
-	 * ACPI 2.0 requires the EC driver to be loaded and work before
-	 * the EC device is found in the namespace (i.e. before
-	 * acpi_load_tables() is called).
-	 *
-	 * This is accomplished by looking for the ECDT table, and getting
-	 * the EC parameters out of that.
-	 */
-	status = acpi_ec_ecdt_probe();
-	/* Ignore result. Not having an ECDT is not fatal. */
-
-	if (acpi_gbl_execute_tables_as_methods ||
-	    !acpi_gbl_group_module_level_code) {
-		status = acpi_load_tables();
-		if (ACPI_FAILURE(status)) {
-			printk(KERN_ERR PREFIX
-			       "Unable to load the System Description Tables\n");
-			goto error1;
-		}
+	status = acpi_load_tables();
+	if (ACPI_FAILURE(status)) {
+		printk(KERN_ERR PREFIX
+		       "Unable to load the System Description Tables\n");
+		goto error1;
 	}
 
 	status = acpi_enable_subsystem(ACPI_NO_ACPI_ENABLE);

commit 2ca5f9f13a3ec1f4cb75a6383a1294e384667ece
Author: Marc Zyngier <maz@kernel.org>
Date:   Fri May 14 09:05:41 2021 +0100

    KVM: arm64: Fix debug register indexing
    
    commit cb853ded1d25e5b026ce115dbcde69e3d7e2e831 upstream.
    
    Commit 03fdfb2690099 ("KVM: arm64: Don't write junk to sysregs on
    reset") flipped the register number to 0 for all the debug registers
    in the sysreg table, hereby indicating that these registers live
    in a separate shadow structure.
    
    However, the author of this patch failed to realise that all the
    accessors are using that particular index instead of the register
    encoding, resulting in all the registers hitting index 0. Not quite
    a valid implementation of the architecture...
    
    Address the issue by fixing all the accessors to use the CRm field
    of the encoding, which contains the debug register index.
    
    Fixes: 03fdfb2690099 ("KVM: arm64: Don't write junk to sysregs on reset")
    Reported-by: Ricardo Koller <ricarkol@google.com>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
index fe97b2ad82b9..98e8bc919583 100644
--- a/arch/arm64/kvm/sys_regs.c
+++ b/arch/arm64/kvm/sys_regs.c
@@ -426,14 +426,14 @@ static bool trap_bvr(struct kvm_vcpu *vcpu,
 		     struct sys_reg_params *p,
 		     const struct sys_reg_desc *rd)
 {
-	u64 *dbg_reg = &vcpu->arch.vcpu_debug_state.dbg_bvr[rd->reg];
+	u64 *dbg_reg = &vcpu->arch.vcpu_debug_state.dbg_bvr[rd->CRm];
 
 	if (p->is_write)
 		reg_to_dbg(vcpu, p, dbg_reg);
 	else
 		dbg_to_reg(vcpu, p, dbg_reg);
 
-	trace_trap_reg(__func__, rd->reg, p->is_write, *dbg_reg);
+	trace_trap_reg(__func__, rd->CRm, p->is_write, *dbg_reg);
 
 	return true;
 }
@@ -441,7 +441,7 @@ static bool trap_bvr(struct kvm_vcpu *vcpu,
 static int set_bvr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
 		const struct kvm_one_reg *reg, void __user *uaddr)
 {
-	__u64 *r = &vcpu->arch.vcpu_debug_state.dbg_bvr[rd->reg];
+	__u64 *r = &vcpu->arch.vcpu_debug_state.dbg_bvr[rd->CRm];
 
 	if (copy_from_user(r, uaddr, KVM_REG_SIZE(reg->id)) != 0)
 		return -EFAULT;
@@ -451,7 +451,7 @@ static int set_bvr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
 static int get_bvr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
 	const struct kvm_one_reg *reg, void __user *uaddr)
 {
-	__u64 *r = &vcpu->arch.vcpu_debug_state.dbg_bvr[rd->reg];
+	__u64 *r = &vcpu->arch.vcpu_debug_state.dbg_bvr[rd->CRm];
 
 	if (copy_to_user(uaddr, r, KVM_REG_SIZE(reg->id)) != 0)
 		return -EFAULT;
@@ -461,21 +461,21 @@ static int get_bvr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
 static void reset_bvr(struct kvm_vcpu *vcpu,
 		      const struct sys_reg_desc *rd)
 {
-	vcpu->arch.vcpu_debug_state.dbg_bvr[rd->reg] = rd->val;
+	vcpu->arch.vcpu_debug_state.dbg_bvr[rd->CRm] = rd->val;
 }
 
 static bool trap_bcr(struct kvm_vcpu *vcpu,
 		     struct sys_reg_params *p,
 		     const struct sys_reg_desc *rd)
 {
-	u64 *dbg_reg = &vcpu->arch.vcpu_debug_state.dbg_bcr[rd->reg];
+	u64 *dbg_reg = &vcpu->arch.vcpu_debug_state.dbg_bcr[rd->CRm];
 
 	if (p->is_write)
 		reg_to_dbg(vcpu, p, dbg_reg);
 	else
 		dbg_to_reg(vcpu, p, dbg_reg);
 
-	trace_trap_reg(__func__, rd->reg, p->is_write, *dbg_reg);
+	trace_trap_reg(__func__, rd->CRm, p->is_write, *dbg_reg);
 
 	return true;
 }
@@ -483,7 +483,7 @@ static bool trap_bcr(struct kvm_vcpu *vcpu,
 static int set_bcr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
 		const struct kvm_one_reg *reg, void __user *uaddr)
 {
-	__u64 *r = &vcpu->arch.vcpu_debug_state.dbg_bcr[rd->reg];
+	__u64 *r = &vcpu->arch.vcpu_debug_state.dbg_bcr[rd->CRm];
 
 	if (copy_from_user(r, uaddr, KVM_REG_SIZE(reg->id)) != 0)
 		return -EFAULT;
@@ -494,7 +494,7 @@ static int set_bcr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
 static int get_bcr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
 	const struct kvm_one_reg *reg, void __user *uaddr)
 {
-	__u64 *r = &vcpu->arch.vcpu_debug_state.dbg_bcr[rd->reg];
+	__u64 *r = &vcpu->arch.vcpu_debug_state.dbg_bcr[rd->CRm];
 
 	if (copy_to_user(uaddr, r, KVM_REG_SIZE(reg->id)) != 0)
 		return -EFAULT;
@@ -504,22 +504,22 @@ static int get_bcr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
 static void reset_bcr(struct kvm_vcpu *vcpu,
 		      const struct sys_reg_desc *rd)
 {
-	vcpu->arch.vcpu_debug_state.dbg_bcr[rd->reg] = rd->val;
+	vcpu->arch.vcpu_debug_state.dbg_bcr[rd->CRm] = rd->val;
 }
 
 static bool trap_wvr(struct kvm_vcpu *vcpu,
 		     struct sys_reg_params *p,
 		     const struct sys_reg_desc *rd)
 {
-	u64 *dbg_reg = &vcpu->arch.vcpu_debug_state.dbg_wvr[rd->reg];
+	u64 *dbg_reg = &vcpu->arch.vcpu_debug_state.dbg_wvr[rd->CRm];
 
 	if (p->is_write)
 		reg_to_dbg(vcpu, p, dbg_reg);
 	else
 		dbg_to_reg(vcpu, p, dbg_reg);
 
-	trace_trap_reg(__func__, rd->reg, p->is_write,
-		vcpu->arch.vcpu_debug_state.dbg_wvr[rd->reg]);
+	trace_trap_reg(__func__, rd->CRm, p->is_write,
+		vcpu->arch.vcpu_debug_state.dbg_wvr[rd->CRm]);
 
 	return true;
 }
@@ -527,7 +527,7 @@ static bool trap_wvr(struct kvm_vcpu *vcpu,
 static int set_wvr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
 		const struct kvm_one_reg *reg, void __user *uaddr)
 {
-	__u64 *r = &vcpu->arch.vcpu_debug_state.dbg_wvr[rd->reg];
+	__u64 *r = &vcpu->arch.vcpu_debug_state.dbg_wvr[rd->CRm];
 
 	if (copy_from_user(r, uaddr, KVM_REG_SIZE(reg->id)) != 0)
 		return -EFAULT;
@@ -537,7 +537,7 @@ static int set_wvr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
 static int get_wvr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
 	const struct kvm_one_reg *reg, void __user *uaddr)
 {
-	__u64 *r = &vcpu->arch.vcpu_debug_state.dbg_wvr[rd->reg];
+	__u64 *r = &vcpu->arch.vcpu_debug_state.dbg_wvr[rd->CRm];
 
 	if (copy_to_user(uaddr, r, KVM_REG_SIZE(reg->id)) != 0)
 		return -EFAULT;
@@ -547,21 +547,21 @@ static int get_wvr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
 static void reset_wvr(struct kvm_vcpu *vcpu,
 		      const struct sys_reg_desc *rd)
 {
-	vcpu->arch.vcpu_debug_state.dbg_wvr[rd->reg] = rd->val;
+	vcpu->arch.vcpu_debug_state.dbg_wvr[rd->CRm] = rd->val;
 }
 
 static bool trap_wcr(struct kvm_vcpu *vcpu,
 		     struct sys_reg_params *p,
 		     const struct sys_reg_desc *rd)
 {
-	u64 *dbg_reg = &vcpu->arch.vcpu_debug_state.dbg_wcr[rd->reg];
+	u64 *dbg_reg = &vcpu->arch.vcpu_debug_state.dbg_wcr[rd->CRm];
 
 	if (p->is_write)
 		reg_to_dbg(vcpu, p, dbg_reg);
 	else
 		dbg_to_reg(vcpu, p, dbg_reg);
 
-	trace_trap_reg(__func__, rd->reg, p->is_write, *dbg_reg);
+	trace_trap_reg(__func__, rd->CRm, p->is_write, *dbg_reg);
 
 	return true;
 }
@@ -569,7 +569,7 @@ static bool trap_wcr(struct kvm_vcpu *vcpu,
 static int set_wcr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
 		const struct kvm_one_reg *reg, void __user *uaddr)
 {
-	__u64 *r = &vcpu->arch.vcpu_debug_state.dbg_wcr[rd->reg];
+	__u64 *r = &vcpu->arch.vcpu_debug_state.dbg_wcr[rd->CRm];
 
 	if (copy_from_user(r, uaddr, KVM_REG_SIZE(reg->id)) != 0)
 		return -EFAULT;
@@ -579,7 +579,7 @@ static int set_wcr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
 static int get_wcr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
 	const struct kvm_one_reg *reg, void __user *uaddr)
 {
-	__u64 *r = &vcpu->arch.vcpu_debug_state.dbg_wcr[rd->reg];
+	__u64 *r = &vcpu->arch.vcpu_debug_state.dbg_wcr[rd->CRm];
 
 	if (copy_to_user(uaddr, r, KVM_REG_SIZE(reg->id)) != 0)
 		return -EFAULT;
@@ -589,7 +589,7 @@ static int get_wcr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
 static void reset_wcr(struct kvm_vcpu *vcpu,
 		      const struct sys_reg_desc *rd)
 {
-	vcpu->arch.vcpu_debug_state.dbg_wcr[rd->reg] = rd->val;
+	vcpu->arch.vcpu_debug_state.dbg_wcr[rd->CRm] = rd->val;
 }
 
 static void reset_amair_el1(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)

commit 982903d43ecb2a3b2550af0560c0c66482a6d99f
Author: Sean Christopherson <seanjc@google.com>
Date:   Wed Apr 21 19:21:22 2021 -0700

    KVM: SVM: Truncate GPR value for DR and CR accesses in !64-bit mode
    
    commit 0884335a2e653b8a045083aa1d57ce74269ac81d upstream.
    
    Drop bits 63:32 on loads/stores to/from DRs and CRs when the vCPU is not
    in 64-bit mode.  The APM states bits 63:32 are dropped for both DRs and
    CRs:
    
      In 64-bit mode, the operand size is fixed at 64 bits without the need
      for a REX prefix. In non-64-bit mode, the operand size is fixed at 32
      bits and the upper 32 bits of the destination are forced to 0.
    
    Fixes: 7ff76d58a9dc ("KVM: SVM: enhance MOV CR intercept handler")
    Fixes: cae3797a4639 ("KVM: SVM: enhance mov DR intercept handler")
    Cc: stable@vger.kernel.org
    Signed-off-by: Sean Christopherson <seanjc@google.com>
    Message-Id: <20210422022128.3464144-4-seanjc@google.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    [sudip: manual backport to old file]
    Signed-off-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 8cb9277aa6ff..ad24e6777277 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -4033,7 +4033,7 @@ static int cr_interception(struct vcpu_svm *svm)
 	err = 0;
 	if (cr >= 16) { /* mov to cr */
 		cr -= 16;
-		val = kvm_register_read(&svm->vcpu, reg);
+		val = kvm_register_readl(&svm->vcpu, reg);
 		switch (cr) {
 		case 0:
 			if (!check_selective_cr0_intercepted(svm, val))
@@ -4078,7 +4078,7 @@ static int cr_interception(struct vcpu_svm *svm)
 			kvm_queue_exception(&svm->vcpu, UD_VECTOR);
 			return 1;
 		}
-		kvm_register_write(&svm->vcpu, reg, val);
+		kvm_register_writel(&svm->vcpu, reg, val);
 	}
 	return kvm_complete_insn_gp(&svm->vcpu, err);
 }
@@ -4108,13 +4108,13 @@ static int dr_interception(struct vcpu_svm *svm)
 	if (dr >= 16) { /* mov to DRn */
 		if (!kvm_require_dr(&svm->vcpu, dr - 16))
 			return 1;
-		val = kvm_register_read(&svm->vcpu, reg);
+		val = kvm_register_readl(&svm->vcpu, reg);
 		kvm_set_dr(&svm->vcpu, dr - 16, val);
 	} else {
 		if (!kvm_require_dr(&svm->vcpu, dr))
 			return 1;
 		kvm_get_dr(&svm->vcpu, dr, &val);
-		kvm_register_write(&svm->vcpu, reg, val);
+		kvm_register_writel(&svm->vcpu, reg, val);
 	}
 
 	return kvm_skip_emulated_instruction(&svm->vcpu);

commit 6b678e02e63e27885b750ab8ccf7c280e34530a0
Author: Anand Jain <anand.jain@oracle.com>
Date:   Fri Apr 30 19:59:51 2021 +0800

    btrfs: fix unmountable seed device after fstrim
    
    commit 5e753a817b2d5991dfe8a801b7b1e8e79a1c5a20 upstream.
    
    The following test case reproduces an issue of wrongly freeing in-use
    blocks on the readonly seed device when fstrim is called on the rw sprout
    device. As shown below.
    
    Create a seed device and add a sprout device to it:
    
      $ mkfs.btrfs -fq -dsingle -msingle /dev/loop0
      $ btrfstune -S 1 /dev/loop0
      $ mount /dev/loop0 /btrfs
      $ btrfs dev add -f /dev/loop1 /btrfs
      BTRFS info (device loop0): relocating block group 290455552 flags system
      BTRFS info (device loop0): relocating block group 1048576 flags system
      BTRFS info (device loop0): disk added /dev/loop1
      $ umount /btrfs
    
    Mount the sprout device and run fstrim:
    
      $ mount /dev/loop1 /btrfs
      $ fstrim /btrfs
      $ umount /btrfs
    
    Now try to mount the seed device, and it fails:
    
      $ mount /dev/loop0 /btrfs
      mount: /btrfs: wrong fs type, bad option, bad superblock on /dev/loop0, missing codepage or helper program, or other error.
    
    Block 5292032 is missing on the readonly seed device:
    
     $ dmesg -kt | tail
     <snip>
     BTRFS error (device loop0): bad tree block start, want 5292032 have 0
     BTRFS warning (device loop0): couldn't read-tree root
     BTRFS error (device loop0): open_ctree failed
    
    >From the dump-tree of the seed device (taken before the fstrim). Block
    5292032 belonged to the block group starting at 5242880:
    
      $ btrfs inspect dump-tree -e /dev/loop0 | grep -A1 BLOCK_GROUP
      <snip>
      item 3 key (5242880 BLOCK_GROUP_ITEM 8388608) itemoff 16169 itemsize 24
            block group used 114688 chunk_objectid 256 flags METADATA
      <snip>
    
    >From the dump-tree of the sprout device (taken before the fstrim).
    fstrim used block-group 5242880 to find the related free space to free:
    
      $ btrfs inspect dump-tree -e /dev/loop1 | grep -A1 BLOCK_GROUP
      <snip>
      item 1 key (5242880 BLOCK_GROUP_ITEM 8388608) itemoff 16226 itemsize 24
            block group used 32768 chunk_objectid 256 flags METADATA
      <snip>
    
    BPF kernel tracing the fstrim command finds the missing block 5292032
    within the range of the discarded blocks as below:
    
      kprobe:btrfs_discard_extent {
            printf("freeing start %llu end %llu num_bytes %llu:\n",
                    arg1, arg1+arg2, arg2);
      }
    
      freeing start 5259264 end 5406720 num_bytes 147456
      <snip>
    
    Fix this by avoiding the discard command to the readonly seed device.
    
    Reported-by: Chris Murphy <lists@colorremedies.com>
    CC: stable@vger.kernel.org # 4.4+
    Reviewed-by: Filipe Manana <fdmanana@suse.com>
    Signed-off-by: Anand Jain <anand.jain@oracle.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 014f956be66a..bf46ed74eae6 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -1984,16 +1984,20 @@ int btrfs_discard_extent(struct btrfs_fs_info *fs_info, u64 bytenr,
 		for (i = 0; i < bbio->num_stripes; i++, stripe++) {
 			u64 bytes;
 			struct request_queue *req_q;
+			struct btrfs_device *device = stripe->dev;
 
-			if (!stripe->dev->bdev) {
+			if (!device->bdev) {
 				ASSERT(btrfs_test_opt(fs_info, DEGRADED));
 				continue;
 			}
-			req_q = bdev_get_queue(stripe->dev->bdev);
+			req_q = bdev_get_queue(device->bdev);
 			if (!blk_queue_discard(req_q))
 				continue;
 
-			ret = btrfs_issue_discard(stripe->dev->bdev,
+			if (!test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state))
+				continue;
+
+			ret = btrfs_issue_discard(device->bdev,
 						  stripe->physical,
 						  stripe->length,
 						  &bytes);

commit c31789645b7bdcf6f55969974d55336831652055
Author: Song Liu <songliubraving@fb.com>
Date:   Tue Oct 8 09:59:49 2019 -0700

    perf/core: Fix corner case in perf_rotate_context()
    
    commit 7fa343b7fdc4f351de4e3f28d5c285937dd1f42f upstream.
    
    In perf_rotate_context(), when the first cpu flexible event fail to
    schedule, cpu_rotate is 1, while cpu_event is NULL. Since cpu_event is
    NULL, perf_rotate_context will _NOT_ call cpu_ctx_sched_out(), thus
    cpuctx->ctx.is_active will have EVENT_FLEXIBLE set. Then, the next
    perf_event_sched_in() will skip all cpu flexible events because of the
    EVENT_FLEXIBLE bit.
    
    In the next call of perf_rotate_context(), cpu_rotate stays 1, and
    cpu_event stays NULL, so this process repeats. The end result is, flexible
    events on this cpu will not be scheduled (until another event being added
    to the cpuctx).
    
    Here is an easy repro of this issue. On Intel CPUs, where ref-cycles
    could only use one counter, run one pinned event for ref-cycles, one
    flexible event for ref-cycles, and one flexible event for cycles. The
    flexible ref-cycles is never scheduled, which is expected. However,
    because of this issue, the cycles event is never scheduled either.
    
     $ perf stat -e ref-cycles:D,ref-cycles,cycles -C 5 -I 1000
    
               time             counts unit events
        1.000152973         15,412,480      ref-cycles:D
        1.000152973      <not counted>      ref-cycles     (0.00%)
        1.000152973      <not counted>      cycles         (0.00%)
        2.000486957         18,263,120      ref-cycles:D
        2.000486957      <not counted>      ref-cycles     (0.00%)
        2.000486957      <not counted>      cycles         (0.00%)
    
    To fix this, when the flexible_active list is empty, try rotate the
    first event in the flexible_groups. Also, rename ctx_first_active() to
    ctx_event_to_rotate(), which is more accurate.
    
    Signed-off-by: Song Liu <songliubraving@fb.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Cc: <kernel-team@fb.com>
    Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Sasha Levin <sashal@kernel.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Fixes: 8d5bce0c37fa ("perf/core: Optimize perf_rotate_context() event scheduling")
    Link: https://lkml.kernel.org/r/20191008165949.920548-1-songliubraving@fb.com
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Signed-off-by: Wen Yang <wenyang@linux.alibaba.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/events/core.c b/kernel/events/core.c
index 56e3789b5c76..d3be2cd57af1 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -3689,11 +3689,23 @@ static void rotate_ctx(struct perf_event_context *ctx, struct perf_event *event)
 	perf_event_groups_insert(&ctx->flexible_groups, event);
 }
 
+/* pick an event from the flexible_groups to rotate */
 static inline struct perf_event *
-ctx_first_active(struct perf_event_context *ctx)
+ctx_event_to_rotate(struct perf_event_context *ctx)
 {
-	return list_first_entry_or_null(&ctx->flexible_active,
-					struct perf_event, active_list);
+	struct perf_event *event;
+
+	/* pick the first active flexible event */
+	event = list_first_entry_or_null(&ctx->flexible_active,
+					 struct perf_event, active_list);
+
+	/* if no active flexible event, pick the first event */
+	if (!event) {
+		event = rb_entry_safe(rb_first(&ctx->flexible_groups.tree),
+				      typeof(*event), group_node);
+	}
+
+	return event;
 }
 
 static bool perf_rotate_context(struct perf_cpu_context *cpuctx)
@@ -3718,9 +3730,9 @@ static bool perf_rotate_context(struct perf_cpu_context *cpuctx)
 	perf_pmu_disable(cpuctx->ctx.pmu);
 
 	if (task_rotate)
-		task_event = ctx_first_active(task_ctx);
+		task_event = ctx_event_to_rotate(task_ctx);
 	if (cpu_rotate)
-		cpu_event = ctx_first_active(&cpuctx->ctx);
+		cpu_event = ctx_event_to_rotate(&cpuctx->ctx);
 
 	/*
 	 * As per the order given at ctx_resched() first 'pop' task flexible

commit 0b4c9255a1d0d08fa8a2d8bc97302756d0e9e98d
Author: Ian Rogers <irogers@google.com>
Date:   Sat Jun 1 01:27:22 2019 -0700

    perf/cgroups: Don't rotate events for cgroups unnecessarily
    
    commit fd7d55172d1e2e501e6da0a5c1de25f06612dc2e upstream.
    
    Currently perf_rotate_context assumes that if the context's nr_events !=
    nr_active a rotation is necessary for perf event multiplexing. With
    cgroups, nr_events is the total count of events for all cgroups and
    nr_active will not include events in a cgroup other than the current
    task's. This makes rotation appear necessary for cgroups when it is not.
    
    Add a perf_event_context flag that is set when rotation is necessary.
    Clear the flag during sched_out and set it when a flexible sched_in
    fails due to resources.
    
    Signed-off-by: Ian Rogers <irogers@google.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Kan Liang <kan.liang@linux.intel.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Stephane Eranian <eranian@google.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Vince Weaver <vincent.weaver@maine.edu>
    Link: https://lkml.kernel.org/r/20190601082722.44543-1-irogers@google.com
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Signed-off-by: Wen Yang <wenyang@linux.alibaba.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index d8b4d31acd18..efe30b9b1190 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -747,6 +747,11 @@ struct perf_event_context {
 	int				nr_stat;
 	int				nr_freq;
 	int				rotate_disable;
+	/*
+	 * Set when nr_events != nr_active, except tolerant to events not
+	 * necessary to be active due to scheduling constraints, such as cgroups.
+	 */
+	int				rotate_necessary;
 	atomic_t			refcount;
 	struct task_struct		*task;
 
diff --git a/kernel/events/core.c b/kernel/events/core.c
index b8b74a4a524c..56e3789b5c76 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -2952,6 +2952,12 @@ static void ctx_sched_out(struct perf_event_context *ctx,
 	if (!ctx->nr_active || !(is_active & EVENT_ALL))
 		return;
 
+	/*
+	 * If we had been multiplexing, no rotations are necessary, now no events
+	 * are active.
+	 */
+	ctx->rotate_necessary = 0;
+
 	perf_pmu_disable(ctx->pmu);
 	if (is_active & EVENT_PINNED) {
 		list_for_each_entry_safe(event, tmp, &ctx->pinned_active, active_list)
@@ -3319,10 +3325,13 @@ static int flexible_sched_in(struct perf_event *event, void *data)
 		return 0;
 
 	if (group_can_go_on(event, sid->cpuctx, sid->can_add_hw)) {
-		if (!group_sched_in(event, sid->cpuctx, sid->ctx))
-			list_add_tail(&event->active_list, &sid->ctx->flexible_active);
-		else
+		int ret = group_sched_in(event, sid->cpuctx, sid->ctx);
+		if (ret) {
 			sid->can_add_hw = 0;
+			sid->ctx->rotate_necessary = 1;
+			return 0;
+		}
+		list_add_tail(&event->active_list, &sid->ctx->flexible_active);
 	}
 
 	return 0;
@@ -3690,24 +3699,17 @@ ctx_first_active(struct perf_event_context *ctx)
 static bool perf_rotate_context(struct perf_cpu_context *cpuctx)
 {
 	struct perf_event *cpu_event = NULL, *task_event = NULL;
-	bool cpu_rotate = false, task_rotate = false;
-	struct perf_event_context *ctx = NULL;
+	struct perf_event_context *task_ctx = NULL;
+	int cpu_rotate, task_rotate;
 
 	/*
 	 * Since we run this from IRQ context, nobody can install new
 	 * events, thus the event count values are stable.
 	 */
 
-	if (cpuctx->ctx.nr_events) {
-		if (cpuctx->ctx.nr_events != cpuctx->ctx.nr_active)
-			cpu_rotate = true;
-	}
-
-	ctx = cpuctx->task_ctx;
-	if (ctx && ctx->nr_events) {
-		if (ctx->nr_events != ctx->nr_active)
-			task_rotate = true;
-	}
+	cpu_rotate = cpuctx->ctx.rotate_necessary;
+	task_ctx = cpuctx->task_ctx;
+	task_rotate = task_ctx ? task_ctx->rotate_necessary : 0;
 
 	if (!(cpu_rotate || task_rotate))
 		return false;
@@ -3716,7 +3718,7 @@ static bool perf_rotate_context(struct perf_cpu_context *cpuctx)
 	perf_pmu_disable(cpuctx->ctx.pmu);
 
 	if (task_rotate)
-		task_event = ctx_first_active(ctx);
+		task_event = ctx_first_active(task_ctx);
 	if (cpu_rotate)
 		cpu_event = ctx_first_active(&cpuctx->ctx);
 
@@ -3724,17 +3726,17 @@ static bool perf_rotate_context(struct perf_cpu_context *cpuctx)
 	 * As per the order given at ctx_resched() first 'pop' task flexible
 	 * and then, if needed CPU flexible.
 	 */
-	if (task_event || (ctx && cpu_event))
-		ctx_sched_out(ctx, cpuctx, EVENT_FLEXIBLE);
+	if (task_event || (task_ctx && cpu_event))
+		ctx_sched_out(task_ctx, cpuctx, EVENT_FLEXIBLE);
 	if (cpu_event)
 		cpu_ctx_sched_out(cpuctx, EVENT_FLEXIBLE);
 
 	if (task_event)
-		rotate_ctx(ctx, task_event);
+		rotate_ctx(task_ctx, task_event);
 	if (cpu_event)
 		rotate_ctx(&cpuctx->ctx, cpu_event);
 
-	perf_event_sched_in(cpuctx, ctx, current);
+	perf_event_sched_in(cpuctx, task_ctx, current);
 
 	perf_pmu_enable(cpuctx->ctx.pmu);
 	perf_ctx_unlock(cpuctx, cpuctx->task_ctx);

commit c35461390b486a1f34340e969d333b04a348e599
Author: Michael Chan <michael.chan@broadcom.com>
Date:   Mon Jan 27 04:56:15 2020 -0500

    bnxt_en: Remove the setting of dev_port.
    
    commit 1d86859fdf31a0d50cc82b5d0d6bfb5fe98f6c00 upstream.
    
    The dev_port is meant to distinguish the network ports belonging to
    the same PCI function.  Our devices only have one network port
    associated with each PCI function and so we should not set it for
    correctness.
    
    Signed-off-by: Michael Chan <michael.chan@broadcom.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 6033970fb667..ebcf4ea66385 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -5252,7 +5252,6 @@ static int __bnxt_hwrm_func_qcaps(struct bnxt *bp)
 
 		pf->fw_fid = le16_to_cpu(resp->fid);
 		pf->port_id = le16_to_cpu(resp->port_id);
-		bp->dev->dev_port = pf->port_id;
 		memcpy(pf->mac_addr, resp->mac_address, ETH_ALEN);
 		pf->first_vf_id = le16_to_cpu(resp->first_vf_id);
 		pf->max_vfs = le16_to_cpu(resp->max_vfs);

commit 1d80154040c27c5363d04404dcf46d738919f575
Author: Björn Töpel <bjorn.topel@gmail.com>
Date:   Wed Jun 2 11:27:53 2021 +0800

    selftests/bpf: Avoid running unprivileged tests with alignment requirements
    
    commit c77b0589ca29ad1859fe7d7c1ecd63c0632379fa upstream
    
    Some architectures have strict alignment requirements. In that case,
    the BPF verifier detects if a program has unaligned accesses and
    rejects them. A user can pass BPF_F_ANY_ALIGNMENT to a program to
    override this check. That, however, will only work when a privileged
    user loads a program. An unprivileged user loading a program with this
    flag will be rejected prior entering the verifier.
    
    Hence, it does not make sense to load unprivileged programs without
    strict alignment when testing the verifier. This patch avoids exactly
    that.
    
    Signed-off-by: Björn Töpel <bjorn.topel@gmail.com>
    Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
    Acked-by: Luke Nelson <luke.r.nels@gmail.com>
    Link: https://lore.kernel.org/bpf/20201118071640.83773-3-bjorn.topel@gmail.com
    Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index b0fd67ce48bd..b44324530948 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -13045,6 +13045,19 @@ static void get_unpriv_disabled()
 
 static bool test_as_unpriv(struct bpf_test *test)
 {
+#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
+	/* Some architectures have strict alignment requirements. In
+	 * that case, the BPF verifier detects if a program has
+	 * unaligned accesses and rejects them. A user can pass
+	 * BPF_F_ANY_ALIGNMENT to a program to override this
+	 * check. That, however, will only work when a privileged user
+	 * loads a program. An unprivileged user loading a program
+	 * with this flag will be rejected prior entering the
+	 * verifier.
+	 */
+	if (test->flags & F_NEEDS_EFFICIENT_UNALIGNED_ACCESS)
+		return false;
+#endif
 	return !test->prog_type ||
 	       test->prog_type == BPF_PROG_TYPE_SOCKET_FILTER ||
 	       test->prog_type == BPF_PROG_TYPE_CGROUP_SKB;

commit 0c4acb93972e9de3c3dfaa60a532a7fa529ac708
Author: Björn Töpel <bjorn.topel@gmail.com>
Date:   Wed Jun 2 11:27:52 2021 +0800

    selftests/bpf: add "any alignment" annotation for some tests
    
    commit e2c6f50e48849298bed694de03cceb537d95cdc4 upstream
    
    RISC-V does, in-general, not have "efficient unaligned access". When
    testing the RISC-V BPF JIT, some selftests failed in the verification
    due to misaligned access. Annotate these tests with the
    F_NEEDS_EFFICIENT_UNALIGNED_ACCESS flag.
    
    Signed-off-by: Björn Töpel <bjorn.topel@gmail.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index 2241e4eefde3..b0fd67ce48bd 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -963,6 +963,7 @@ static struct bpf_test tests[] = {
 		.errstr_unpriv = "attempt to corrupt spilled",
 		.errstr = "corrupted spill",
 		.result = REJECT,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"invalid src register in STX",
@@ -1777,6 +1778,7 @@ static struct bpf_test tests[] = {
 		.errstr = "invalid bpf_context access",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_SK_MSG,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"invalid read past end of SK_MSG",
@@ -2176,6 +2178,7 @@ static struct bpf_test tests[] = {
 		},
 		.errstr = "invalid bpf_context access",
 		.result = REJECT,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"check skb->hash half load not permitted, unaligned 3",

commit 3789f9c3a4f55dff424424fd93c5aad829647dce
Author: David S. Miller <davem@davemloft.net>
Date:   Wed Jun 2 11:27:51 2021 +0800

    bpf: Apply F_NEEDS_EFFICIENT_UNALIGNED_ACCESS to more ACCEPT test cases.
    
    commit 0a68632488aa0129ed530af9ae9e8573f5650812 upstream
    
    If a testcase has alignment problems but is expected to be ACCEPT,
    verify it using F_NEEDS_EFFICIENT_UNALIGNED_ACCESS too.
    
    Maybe in the future if we add some architecture specific code to elide
    the unaligned memory access warnings during the test, we can execute
    these as well.
    
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index a402121e9812..2241e4eefde3 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -3787,6 +3787,7 @@ static struct bpf_test tests[] = {
 		},
 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
 		.result = ACCEPT,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"direct packet access: test21 (x += pkt_ptr, 2)",
@@ -3812,6 +3813,7 @@ static struct bpf_test tests[] = {
 		},
 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
 		.result = ACCEPT,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"direct packet access: test22 (x += pkt_ptr, 3)",
@@ -3842,6 +3844,7 @@ static struct bpf_test tests[] = {
 		},
 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
 		.result = ACCEPT,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"direct packet access: test23 (x += pkt_ptr, 4)",
@@ -3894,6 +3897,7 @@ static struct bpf_test tests[] = {
 		},
 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
 		.result = ACCEPT,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"direct packet access: test25 (marking on <, good access)",
@@ -6957,6 +6961,7 @@ static struct bpf_test tests[] = {
 		.result = ACCEPT,
 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
 		.retval = 0 /* csum_diff of 64-byte packet */,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"helper access to variable memory: size = 0 not allowed on NULL (!ARG_PTR_TO_MEM_OR_NULL)",
@@ -8923,6 +8928,7 @@ static struct bpf_test tests[] = {
 		},
 		.result = ACCEPT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_data' > pkt_end, bad access 1",
@@ -9094,6 +9100,7 @@ static struct bpf_test tests[] = {
 		},
 		.result = ACCEPT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_end < pkt_data', bad access 1",
@@ -9206,6 +9213,7 @@ static struct bpf_test tests[] = {
 		},
 		.result = ACCEPT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_end >= pkt_data', bad access 1",
@@ -9263,6 +9271,7 @@ static struct bpf_test tests[] = {
 		},
 		.result = ACCEPT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_data' <= pkt_end, bad access 1",
@@ -9375,6 +9384,7 @@ static struct bpf_test tests[] = {
 		},
 		.result = ACCEPT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_meta' > pkt_data, bad access 1",
@@ -9546,6 +9556,7 @@ static struct bpf_test tests[] = {
 		},
 		.result = ACCEPT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_data < pkt_meta', bad access 1",
@@ -9658,6 +9669,7 @@ static struct bpf_test tests[] = {
 		},
 		.result = ACCEPT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_data >= pkt_meta', bad access 1",
@@ -9715,6 +9727,7 @@ static struct bpf_test tests[] = {
 		},
 		.result = ACCEPT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_meta' <= pkt_data, bad access 1",
@@ -11646,6 +11659,7 @@ static struct bpf_test tests[] = {
 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
 		.result = ACCEPT,
 		.retval = 1,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"calls: pkt_ptr spill into caller stack 4",
@@ -11680,6 +11694,7 @@ static struct bpf_test tests[] = {
 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
 		.result = ACCEPT,
 		.retval = 1,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"calls: pkt_ptr spill into caller stack 5",
@@ -11825,6 +11840,7 @@ static struct bpf_test tests[] = {
 		},
 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
 		.result = ACCEPT,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"calls: pkt_ptr spill into caller stack 9",

commit f22c1cd341cd91296967f143cd7b2068779751a2
Author: David S. Miller <davem@davemloft.net>
Date:   Wed Jun 2 11:27:50 2021 +0800

    bpf: Make more use of 'any' alignment in test_verifier.c
    
    commit 2acc5fd5b8c25df0de7f3c8b8e385f5c6f8202ec upstream
    
    Use F_NEEDS_EFFICIENT_UNALIGNED_ACCESS in more tests where the
    expected result is REJECT.
    
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index 686f5d1ac74a..a402121e9812 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -1799,6 +1799,7 @@ static struct bpf_test tests[] = {
 		.errstr = "invalid bpf_context access",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_SK_MSG,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"direct packet read for SK_MSG",
@@ -2191,6 +2192,7 @@ static struct bpf_test tests[] = {
 		},
 		.errstr = "invalid bpf_context access",
 		.result = REJECT,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"check cb access: half, wrong type",
@@ -3151,6 +3153,7 @@ static struct bpf_test tests[] = {
 		.result = REJECT,
 		.errstr = "R0 invalid mem access 'inv'",
 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"raw_stack: skb_load_bytes, spilled regs corruption 2",
@@ -3181,6 +3184,7 @@ static struct bpf_test tests[] = {
 		.result = REJECT,
 		.errstr = "R3 invalid mem access 'inv'",
 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"raw_stack: skb_load_bytes, spilled regs + data",
@@ -3680,6 +3684,7 @@ static struct bpf_test tests[] = {
 		.errstr = "R2 invalid mem access 'inv'",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"direct packet access: test16 (arith on data_end)",
@@ -3863,6 +3868,7 @@ static struct bpf_test tests[] = {
 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
 		.result = REJECT,
 		.errstr = "invalid access to packet, off=0 size=8, R5(id=1,off=0,r=0)",
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"direct packet access: test24 (x += pkt_ptr, 5)",
@@ -4767,6 +4773,7 @@ static struct bpf_test tests[] = {
 		.result = REJECT,
 		.errstr = "invalid access to map value, value_size=64 off=-2 size=4",
 		.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"invalid cgroup storage access 5",
@@ -6433,6 +6440,7 @@ static struct bpf_test tests[] = {
 		.errstr = "invalid mem access 'inv'",
 		.result = REJECT,
 		.result_unpriv = REJECT,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"map element value illegal alu op, 5",
@@ -6455,6 +6463,7 @@ static struct bpf_test tests[] = {
 		.fixup_map2 = { 3 },
 		.errstr = "R0 invalid mem access 'inv'",
 		.result = REJECT,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"map element value is preserved across register spilling",
@@ -8951,6 +8960,7 @@ static struct bpf_test tests[] = {
 		.errstr = "R1 offset is outside of the packet",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_end > pkt_data', good access",
@@ -8989,6 +8999,7 @@ static struct bpf_test tests[] = {
 		.errstr = "R1 offset is outside of the packet",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_end > pkt_data', bad access 2",
@@ -9007,6 +9018,7 @@ static struct bpf_test tests[] = {
 		.errstr = "R1 offset is outside of the packet",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_data' < pkt_end, good access",
@@ -9045,6 +9057,7 @@ static struct bpf_test tests[] = {
 		.errstr = "R1 offset is outside of the packet",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_data' < pkt_end, bad access 2",
@@ -9063,6 +9076,7 @@ static struct bpf_test tests[] = {
 		.errstr = "R1 offset is outside of the packet",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_end < pkt_data', good access",
@@ -9117,6 +9131,7 @@ static struct bpf_test tests[] = {
 		.errstr = "R1 offset is outside of the packet",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_data' >= pkt_end, good access",
@@ -9153,6 +9168,7 @@ static struct bpf_test tests[] = {
 		.errstr = "R1 offset is outside of the packet",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_data' >= pkt_end, bad access 2",
@@ -9228,6 +9244,7 @@ static struct bpf_test tests[] = {
 		.errstr = "R1 offset is outside of the packet",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_data' <= pkt_end, good access",
@@ -9284,6 +9301,7 @@ static struct bpf_test tests[] = {
 		.errstr = "R1 offset is outside of the packet",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_end <= pkt_data', good access",
@@ -9320,6 +9338,7 @@ static struct bpf_test tests[] = {
 		.errstr = "R1 offset is outside of the packet",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_end <= pkt_data', bad access 2",
@@ -9393,6 +9412,7 @@ static struct bpf_test tests[] = {
 		.errstr = "R1 offset is outside of the packet",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_data > pkt_meta', good access",
@@ -9431,6 +9451,7 @@ static struct bpf_test tests[] = {
 		.errstr = "R1 offset is outside of the packet",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_data > pkt_meta', bad access 2",
@@ -9449,6 +9470,7 @@ static struct bpf_test tests[] = {
 		.errstr = "R1 offset is outside of the packet",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_meta' < pkt_data, good access",
@@ -9487,6 +9509,7 @@ static struct bpf_test tests[] = {
 		.errstr = "R1 offset is outside of the packet",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_meta' < pkt_data, bad access 2",
@@ -9505,6 +9528,7 @@ static struct bpf_test tests[] = {
 		.errstr = "R1 offset is outside of the packet",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_data < pkt_meta', good access",
@@ -9559,6 +9583,7 @@ static struct bpf_test tests[] = {
 		.errstr = "R1 offset is outside of the packet",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_meta' >= pkt_data, good access",
@@ -9595,6 +9620,7 @@ static struct bpf_test tests[] = {
 		.errstr = "R1 offset is outside of the packet",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_meta' >= pkt_data, bad access 2",
@@ -9670,6 +9696,7 @@ static struct bpf_test tests[] = {
 		.errstr = "R1 offset is outside of the packet",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_meta' <= pkt_data, good access",
@@ -9726,6 +9753,7 @@ static struct bpf_test tests[] = {
 		.errstr = "R1 offset is outside of the packet",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_data <= pkt_meta', good access",
@@ -9762,6 +9790,7 @@ static struct bpf_test tests[] = {
 		.errstr = "R1 offset is outside of the packet",
 		.result = REJECT,
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"XDP pkt read, pkt_data <= pkt_meta', bad access 2",
@@ -9876,6 +9905,7 @@ static struct bpf_test tests[] = {
 		.errstr_unpriv = "R1 has pointer with unsupported alu operation",
 		.errstr = "dereference of modified ctx ptr",
 		.result = REJECT,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"check deducing bounds from const, 8",
@@ -9890,6 +9920,7 @@ static struct bpf_test tests[] = {
 		.errstr_unpriv = "R1 has pointer with unsupported alu operation",
 		.errstr = "dereference of modified ctx ptr",
 		.result = REJECT,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"check deducing bounds from const, 9",
@@ -10365,6 +10396,7 @@ static struct bpf_test tests[] = {
 		.result = REJECT,
 		.errstr = "R6 invalid mem access 'inv'",
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"calls: two calls with args",
@@ -11230,6 +11262,7 @@ static struct bpf_test tests[] = {
 		.fixup_map1 = { 12, 22 },
 		.result = REJECT,
 		.errstr = "invalid access to map value, value_size=8 off=2 size=8",
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"calls: two calls that receive map_value via arg=ptr_stack_of_caller. test2",
@@ -11373,6 +11406,7 @@ static struct bpf_test tests[] = {
 		.fixup_map1 = { 12, 22 },
 		.result = REJECT,
 		.errstr = "invalid access to map value, value_size=8 off=2 size=8",
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"calls: two calls that receive map_value_ptr_or_null via arg. test1",
@@ -11544,6 +11578,7 @@ static struct bpf_test tests[] = {
 		.result = ACCEPT,
 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
 		.retval = POINTER_VALUE,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"calls: pkt_ptr spill into caller stack 2",
@@ -11575,6 +11610,7 @@ static struct bpf_test tests[] = {
 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
 		.errstr = "invalid access to packet",
 		.result = REJECT,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"calls: pkt_ptr spill into caller stack 3",
@@ -11677,6 +11713,7 @@ static struct bpf_test tests[] = {
 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
 		.errstr = "same insn cannot be used with different",
 		.result = REJECT,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"calls: pkt_ptr spill into caller stack 6",
@@ -11712,6 +11749,7 @@ static struct bpf_test tests[] = {
 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
 		.errstr = "R4 invalid mem access",
 		.result = REJECT,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"calls: pkt_ptr spill into caller stack 7",
@@ -11746,6 +11784,7 @@ static struct bpf_test tests[] = {
 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
 		.errstr = "R4 invalid mem access",
 		.result = REJECT,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"calls: pkt_ptr spill into caller stack 8",
@@ -11827,6 +11866,7 @@ static struct bpf_test tests[] = {
 		.prog_type = BPF_PROG_TYPE_SCHED_CLS,
 		.errstr = "invalid access to packet",
 		.result = REJECT,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"calls: caller stack init to zero or map_value_or_null",
@@ -12192,6 +12232,7 @@ static struct bpf_test tests[] = {
 		.result = REJECT,
 		.errstr = "BPF_XADD stores into R2 packet",
 		.prog_type = BPF_PROG_TYPE_XDP,
+		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 	},
 	{
 		"xadd/w check whether src/dst got mangled, 1",

commit 1e7ee04b035a268716c98a1ee22634419f30d25d
Author: David S. Miller <davem@davemloft.net>
Date:   Wed Jun 2 11:27:49 2021 +0800

    bpf: Adjust F_NEEDS_EFFICIENT_UNALIGNED_ACCESS handling in test_verifier.c
    
    commit c7665702d3208b77b8e00f0699b6b88241b04360 upstream
    
    Make it set the flag argument to bpf_verify_program() which will relax
    the alignment restrictions.
    
    Now all such test cases will go properly through the verifier even on
    inefficient unaligned access architectures.
    
    On inefficient unaligned access architectures do not try to run such
    programs, instead mark the test case as passing but annotate the
    result similarly to how it is done now in the presence of this flag.
    
    So, we get complete full coverage for all REJECT test cases, and at
    least verifier level coverage for ACCEPT test cases.
    
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index 919f97a20203..686f5d1ac74a 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -12844,13 +12844,14 @@ static int set_admin(bool admin)
 static void do_test_single(struct bpf_test *test, bool unpriv,
 			   int *passes, int *errors)
 {
-	int fd_prog, expected_ret, reject_from_alignment;
+	int fd_prog, expected_ret, alignment_prevented_execution;
 	int prog_len, prog_type = test->prog_type;
 	struct bpf_insn *prog = test->insns;
 	int map_fds[MAX_NR_MAPS];
 	const char *expected_err;
 	uint32_t expected_val;
 	uint32_t retval;
+	__u32 pflags;
 	int i, err;
 
 	for (i = 0; i < MAX_NR_MAPS; i++)
@@ -12861,9 +12862,12 @@ static void do_test_single(struct bpf_test *test, bool unpriv,
 	do_test_fixup(test, prog_type, prog, map_fds);
 	prog_len = probe_filter_length(prog);
 
-	fd_prog = bpf_verify_program(prog_type, prog, prog_len,
-				     test->flags & F_LOAD_WITH_STRICT_ALIGNMENT ?
-				     BPF_F_STRICT_ALIGNMENT : 0,
+	pflags = 0;
+	if (test->flags & F_LOAD_WITH_STRICT_ALIGNMENT)
+		pflags |= BPF_F_STRICT_ALIGNMENT;
+	if (test->flags & F_NEEDS_EFFICIENT_UNALIGNED_ACCESS)
+		pflags |= BPF_F_ANY_ALIGNMENT;
+	fd_prog = bpf_verify_program(prog_type, prog, prog_len, pflags,
 				     "GPL", 0, bpf_vlog, sizeof(bpf_vlog), 1);
 
 	expected_ret = unpriv && test->result_unpriv != UNDEF ?
@@ -12873,28 +12877,27 @@ static void do_test_single(struct bpf_test *test, bool unpriv,
 	expected_val = unpriv && test->retval_unpriv ?
 		       test->retval_unpriv : test->retval;
 
-	reject_from_alignment = fd_prog < 0 &&
-				(test->flags & F_NEEDS_EFFICIENT_UNALIGNED_ACCESS) &&
-				strstr(bpf_vlog, "misaligned");
-#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
-	if (reject_from_alignment) {
-		printf("FAIL\nFailed due to alignment despite having efficient unaligned access: '%s'!\n",
-		       strerror(errno));
-		goto fail_log;
-	}
-#endif
+	alignment_prevented_execution = 0;
+
 	if (expected_ret == ACCEPT) {
-		if (fd_prog < 0 && !reject_from_alignment) {
+		if (fd_prog < 0) {
 			printf("FAIL\nFailed to load prog '%s'!\n",
 			       strerror(errno));
 			goto fail_log;
 		}
+#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
+		if (fd_prog >= 0 &&
+		    (test->flags & F_NEEDS_EFFICIENT_UNALIGNED_ACCESS)) {
+			alignment_prevented_execution = 1;
+			goto test_ok;
+		}
+#endif
 	} else {
 		if (fd_prog >= 0) {
 			printf("FAIL\nUnexpected success to load!\n");
 			goto fail_log;
 		}
-		if (!strstr(bpf_vlog, expected_err) && !reject_from_alignment) {
+		if (!strstr(bpf_vlog, expected_err)) {
 			printf("FAIL\nUnexpected error message!\n\tEXP: %s\n\tRES: %s\n",
 			      expected_err, bpf_vlog);
 			goto fail_log;
@@ -12922,9 +12925,12 @@ static void do_test_single(struct bpf_test *test, bool unpriv,
 			goto fail_log;
 		}
 	}
+#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
+test_ok:
+#endif
 	(*passes)++;
-	printf("OK%s\n", reject_from_alignment ?
-	       " (NOTE: reject due to unknown alignment)" : "");
+	printf("OK%s\n", alignment_prevented_execution ?
+	       " (NOTE: not executed due to unknown alignment)" : "");
 close_fds:
 	close(fd_prog);
 	for (i = 0; i < MAX_NR_MAPS; i++)

commit 878470e7f5edb0f8d78f863d25d65e460da3593f
Author: David S. Miller <davem@davemloft.net>
Date:   Wed Jun 2 11:27:48 2021 +0800

    bpf: Add BPF_F_ANY_ALIGNMENT.
    
    commit e9ee9efc0d176512cdce9d27ff8549d7ffa2bfcd upstream
    
    Often we want to write tests cases that check things like bad context
    offset accesses.  And one way to do this is to use an odd offset on,
    for example, a 32-bit load.
    
    This unfortunately triggers the alignment checks first on platforms
    that do not set CONFIG_EFFICIENT_UNALIGNED_ACCESS.  So the test
    case see the alignment failure rather than what it was testing for.
    
    It is often not completely possible to respect the original intention
    of the test, or even test the same exact thing, while solving the
    alignment issue.
    
    Another option could have been to check the alignment after the
    context and other validations are performed by the verifier, but
    that is a non-trivial change to the verifier.
    
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index 71ca8c4dc290..8481fc7676c0 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -228,6 +228,20 @@ enum bpf_attach_type {
  */
 #define BPF_F_STRICT_ALIGNMENT	(1U << 0)
 
+/* If BPF_F_ANY_ALIGNMENT is used in BPF_PROF_LOAD command, the
+ * verifier will allow any alignment whatsoever.  On platforms
+ * with strict alignment requirements for loads ands stores (such
+ * as sparc and mips) the verifier validates that all loads and
+ * stores provably follow this requirement.  This flag turns that
+ * checking and enforcement off.
+ *
+ * It is mostly used for testing when we want to validate the
+ * context and memory access aspects of the verifier, but because
+ * of an unaligned access the alignment check would trigger before
+ * the one we are interested in.
+ */
+#define BPF_F_ANY_ALIGNMENT	(1U << 1)
+
 /* when bpf_ldimm64->src_reg == BPF_PSEUDO_MAP_FD, bpf_ldimm64->imm == fd */
 #define BPF_PSEUDO_MAP_FD	1
 
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index 21a366a661ac..353a8d672302 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -1367,9 +1367,14 @@ static int bpf_prog_load(union bpf_attr *attr)
 	if (CHECK_ATTR(BPF_PROG_LOAD))
 		return -EINVAL;
 
-	if (attr->prog_flags & ~BPF_F_STRICT_ALIGNMENT)
+	if (attr->prog_flags & ~(BPF_F_STRICT_ALIGNMENT | BPF_F_ANY_ALIGNMENT))
 		return -EINVAL;
 
+	if (!IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) &&
+	    (attr->prog_flags & BPF_F_ANY_ALIGNMENT) &&
+	    !capable(CAP_SYS_ADMIN))
+		return -EPERM;
+
 	/* copy eBPF program license from user space */
 	if (strncpy_from_user(license, u64_to_user_ptr(attr->license),
 			      sizeof(license) - 1) < 0)
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 1f4c88ce58de..4ce032c4acd0 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -6440,6 +6440,9 @@ int bpf_check(struct bpf_prog **prog, union bpf_attr *attr)
 	if (!IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS))
 		env->strict_alignment = true;
 
+	if (attr->prog_flags & BPF_F_ANY_ALIGNMENT)
+		env->strict_alignment = false;
+
 	ret = replace_map_fd_with_map_ptr(env);
 	if (ret < 0)
 		goto skip_full_check;
diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h
index 13944978ada5..9e060c6a01ac 100644
--- a/tools/include/uapi/linux/bpf.h
+++ b/tools/include/uapi/linux/bpf.h
@@ -226,6 +226,20 @@ enum bpf_attach_type {
  */
 #define BPF_F_STRICT_ALIGNMENT	(1U << 0)
 
+/* If BPF_F_ANY_ALIGNMENT is used in BPF_PROF_LOAD command, the
+ * verifier will allow any alignment whatsoever.  On platforms
+ * with strict alignment requirements for loads ands stores (such
+ * as sparc and mips) the verifier validates that all loads and
+ * stores provably follow this requirement.  This flag turns that
+ * checking and enforcement off.
+ *
+ * It is mostly used for testing when we want to validate the
+ * context and memory access aspects of the verifier, but because
+ * of an unaligned access the alignment check would trigger before
+ * the one we are interested in.
+ */
+#define BPF_F_ANY_ALIGNMENT	(1U << 1)
+
 /* when bpf_ldimm64->src_reg == BPF_PSEUDO_MAP_FD, bpf_ldimm64->imm == fd */
 #define BPF_PSEUDO_MAP_FD	1
 
diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c
index 482025b72839..f28ae6a68697 100644
--- a/tools/lib/bpf/bpf.c
+++ b/tools/lib/bpf/bpf.c
@@ -261,9 +261,9 @@ int bpf_load_program(enum bpf_prog_type type, const struct bpf_insn *insns,
 }
 
 int bpf_verify_program(enum bpf_prog_type type, const struct bpf_insn *insns,
-		       size_t insns_cnt, int strict_alignment,
-		       const char *license, __u32 kern_version,
-		       char *log_buf, size_t log_buf_sz, int log_level)
+		       size_t insns_cnt, __u32 prog_flags, const char *license,
+		       __u32 kern_version, char *log_buf, size_t log_buf_sz,
+		       int log_level)
 {
 	union bpf_attr attr;
 
@@ -277,7 +277,7 @@ int bpf_verify_program(enum bpf_prog_type type, const struct bpf_insn *insns,
 	attr.log_level = log_level;
 	log_buf[0] = 0;
 	attr.kern_version = kern_version;
-	attr.prog_flags = strict_alignment ? BPF_F_STRICT_ALIGNMENT : 0;
+	attr.prog_flags = prog_flags;
 
 	return sys_bpf_prog_load(&attr, sizeof(attr));
 }
diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h
index c3145ab3bdca..7f2e947d940c 100644
--- a/tools/lib/bpf/bpf.h
+++ b/tools/lib/bpf/bpf.h
@@ -79,7 +79,7 @@ int bpf_load_program(enum bpf_prog_type type, const struct bpf_insn *insns,
 		     __u32 kern_version, char *log_buf,
 		     size_t log_buf_sz);
 int bpf_verify_program(enum bpf_prog_type type, const struct bpf_insn *insns,
-		       size_t insns_cnt, int strict_alignment,
+		       size_t insns_cnt, __u32 prog_flags,
 		       const char *license, __u32 kern_version,
 		       char *log_buf, size_t log_buf_sz, int log_level);
 
diff --git a/tools/testing/selftests/bpf/test_align.c b/tools/testing/selftests/bpf/test_align.c
index 5f377ec53f2f..3c789d03b629 100644
--- a/tools/testing/selftests/bpf/test_align.c
+++ b/tools/testing/selftests/bpf/test_align.c
@@ -620,8 +620,8 @@ static int do_test_single(struct bpf_align_test *test)
 
 	prog_len = probe_filter_length(prog);
 	fd_prog = bpf_verify_program(prog_type ? : BPF_PROG_TYPE_SOCKET_FILTER,
-				     prog, prog_len, 1, "GPL", 0,
-				     bpf_vlog, sizeof(bpf_vlog), 2);
+				     prog, prog_len, BPF_F_STRICT_ALIGNMENT,
+				     "GPL", 0, bpf_vlog, sizeof(bpf_vlog), 2);
 	if (fd_prog < 0 && test->result != REJECT) {
 		printf("Failed to load program.\n");
 		printf("%s", bpf_vlog);
diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index 809d8e9ac356..919f97a20203 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -12862,7 +12862,8 @@ static void do_test_single(struct bpf_test *test, bool unpriv,
 	prog_len = probe_filter_length(prog);
 
 	fd_prog = bpf_verify_program(prog_type, prog, prog_len,
-				     test->flags & F_LOAD_WITH_STRICT_ALIGNMENT,
+				     test->flags & F_LOAD_WITH_STRICT_ALIGNMENT ?
+				     BPF_F_STRICT_ALIGNMENT : 0,
 				     "GPL", 0, bpf_vlog, sizeof(bpf_vlog), 1);
 
 	expected_ret = unpriv && test->result_unpriv != UNDEF ?

commit b6c9e3b46c3a4c78799ac550176856e7ff5e313c
Author: Joe Stringer <joe@wand.net.nz>
Date:   Wed Jun 2 11:27:47 2021 +0800

    selftests/bpf: Generalize dummy program types
    
    commit 0c586079f852187d19fea60c9a4981ad29e22ba8 upstream
    
    Don't hardcode the dummy program types to SOCKET_FILTER type, as this
    prevents testing bpf_tail_call in conjunction with other program types.
    Instead, use the program type specified in the test case.
    
    Signed-off-by: Joe Stringer <joe@wand.net.nz>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index 38dd1299bfcf..809d8e9ac356 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -12631,18 +12631,18 @@ static int create_map(uint32_t type, uint32_t size_key,
 	return fd;
 }
 
-static int create_prog_dummy1(void)
+static int create_prog_dummy1(enum bpf_map_type prog_type)
 {
 	struct bpf_insn prog[] = {
 		BPF_MOV64_IMM(BPF_REG_0, 42),
 		BPF_EXIT_INSN(),
 	};
 
-	return bpf_load_program(BPF_PROG_TYPE_SOCKET_FILTER, prog,
+	return bpf_load_program(prog_type, prog,
 				ARRAY_SIZE(prog), "GPL", 0, NULL, 0);
 }
 
-static int create_prog_dummy2(int mfd, int idx)
+static int create_prog_dummy2(enum bpf_map_type prog_type, int mfd, int idx)
 {
 	struct bpf_insn prog[] = {
 		BPF_MOV64_IMM(BPF_REG_3, idx),
@@ -12653,11 +12653,12 @@ static int create_prog_dummy2(int mfd, int idx)
 		BPF_EXIT_INSN(),
 	};
 
-	return bpf_load_program(BPF_PROG_TYPE_SOCKET_FILTER, prog,
+	return bpf_load_program(prog_type, prog,
 				ARRAY_SIZE(prog), "GPL", 0, NULL, 0);
 }
 
-static int create_prog_array(uint32_t max_elem, int p1key)
+static int create_prog_array(enum bpf_map_type prog_type, uint32_t max_elem,
+			     int p1key)
 {
 	int p2key = 1;
 	int mfd, p1fd, p2fd;
@@ -12669,8 +12670,8 @@ static int create_prog_array(uint32_t max_elem, int p1key)
 		return -1;
 	}
 
-	p1fd = create_prog_dummy1();
-	p2fd = create_prog_dummy2(mfd, p2key);
+	p1fd = create_prog_dummy1(prog_type);
+	p2fd = create_prog_dummy2(prog_type, mfd, p2key);
 	if (p1fd < 0 || p2fd < 0)
 		goto out;
 	if (bpf_map_update_elem(mfd, &p1key, &p1fd, BPF_ANY) < 0)
@@ -12725,8 +12726,8 @@ static int create_cgroup_storage(void)
 
 static char bpf_vlog[UINT_MAX >> 8];
 
-static void do_test_fixup(struct bpf_test *test, struct bpf_insn *prog,
-			  int *map_fds)
+static void do_test_fixup(struct bpf_test *test, enum bpf_map_type prog_type,
+			  struct bpf_insn *prog, int *map_fds)
 {
 	int *fixup_map1 = test->fixup_map1;
 	int *fixup_map2 = test->fixup_map2;
@@ -12781,7 +12782,7 @@ static void do_test_fixup(struct bpf_test *test, struct bpf_insn *prog,
 	}
 
 	if (*fixup_prog1) {
-		map_fds[4] = create_prog_array(4, 0);
+		map_fds[4] = create_prog_array(prog_type, 4, 0);
 		do {
 			prog[*fixup_prog1].imm = map_fds[4];
 			fixup_prog1++;
@@ -12789,7 +12790,7 @@ static void do_test_fixup(struct bpf_test *test, struct bpf_insn *prog,
 	}
 
 	if (*fixup_prog2) {
-		map_fds[5] = create_prog_array(8, 7);
+		map_fds[5] = create_prog_array(prog_type, 8, 7);
 		do {
 			prog[*fixup_prog2].imm = map_fds[5];
 			fixup_prog2++;
@@ -12855,11 +12856,13 @@ static void do_test_single(struct bpf_test *test, bool unpriv,
 	for (i = 0; i < MAX_NR_MAPS; i++)
 		map_fds[i] = -1;
 
-	do_test_fixup(test, prog, map_fds);
+	if (!prog_type)
+		prog_type = BPF_PROG_TYPE_SOCKET_FILTER;
+	do_test_fixup(test, prog_type, prog, map_fds);
 	prog_len = probe_filter_length(prog);
 
-	fd_prog = bpf_verify_program(prog_type ? : BPF_PROG_TYPE_SOCKET_FILTER,
-				     prog, prog_len, test->flags & F_LOAD_WITH_STRICT_ALIGNMENT,
+	fd_prog = bpf_verify_program(prog_type, prog, prog_len,
+				     test->flags & F_LOAD_WITH_STRICT_ALIGNMENT,
 				     "GPL", 0, bpf_vlog, sizeof(bpf_vlog), 1);
 
 	expected_ret = unpriv && test->result_unpriv != UNDEF ?

commit ac0985c8a2d8f829e7f6dfcdd543f32dd29747b7
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Wed Jun 2 11:27:46 2021 +0800

    bpf: test make sure to run unpriv test cases in test_verifier
    
    commit 832c6f2c29ec519b766923937f4f93fb1008b47d upstream
    
    Right now unprivileged tests are never executed as a BPF test run,
    only loaded. Allow for running them as well so that we can check
    the outcome and probe for regressions.
    
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index d33d1d70722e..38dd1299bfcf 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -70,7 +70,7 @@ struct bpf_test {
 	int fixup_cgroup_storage[MAX_FIXUPS];
 	const char *errstr;
 	const char *errstr_unpriv;
-	uint32_t retval;
+	uint32_t retval, retval_unpriv;
 	enum {
 		UNDEF,
 		ACCEPT,
@@ -2986,6 +2986,8 @@ static struct bpf_test tests[] = {
 		.fixup_prog1 = { 2 },
 		.result = ACCEPT,
 		.retval = 42,
+		/* Verifier rewrite for unpriv skips tail call here. */
+		.retval_unpriv = 2,
 	},
 	{
 		"stack pointer arithmetic",
@@ -12811,6 +12813,33 @@ static void do_test_fixup(struct bpf_test *test, struct bpf_insn *prog,
 	}
 }
 
+static int set_admin(bool admin)
+{
+	cap_t caps;
+	const cap_value_t cap_val = CAP_SYS_ADMIN;
+	int ret = -1;
+
+	caps = cap_get_proc();
+	if (!caps) {
+		perror("cap_get_proc");
+		return -1;
+	}
+	if (cap_set_flag(caps, CAP_EFFECTIVE, 1, &cap_val,
+				admin ? CAP_SET : CAP_CLEAR)) {
+		perror("cap_set_flag");
+		goto out;
+	}
+	if (cap_set_proc(caps)) {
+		perror("cap_set_proc");
+		goto out;
+	}
+	ret = 0;
+out:
+	if (cap_free(caps))
+		perror("cap_free");
+	return ret;
+}
+
 static void do_test_single(struct bpf_test *test, bool unpriv,
 			   int *passes, int *errors)
 {
@@ -12819,6 +12848,7 @@ static void do_test_single(struct bpf_test *test, bool unpriv,
 	struct bpf_insn *prog = test->insns;
 	int map_fds[MAX_NR_MAPS];
 	const char *expected_err;
+	uint32_t expected_val;
 	uint32_t retval;
 	int i, err;
 
@@ -12836,6 +12866,8 @@ static void do_test_single(struct bpf_test *test, bool unpriv,
 		       test->result_unpriv : test->result;
 	expected_err = unpriv && test->errstr_unpriv ?
 		       test->errstr_unpriv : test->errstr;
+	expected_val = unpriv && test->retval_unpriv ?
+		       test->retval_unpriv : test->retval;
 
 	reject_from_alignment = fd_prog < 0 &&
 				(test->flags & F_NEEDS_EFFICIENT_UNALIGNED_ACCESS) &&
@@ -12869,16 +12901,20 @@ static void do_test_single(struct bpf_test *test, bool unpriv,
 		__u8 tmp[TEST_DATA_LEN << 2];
 		__u32 size_tmp = sizeof(tmp);
 
+		if (unpriv)
+			set_admin(true);
 		err = bpf_prog_test_run(fd_prog, 1, test->data,
 					sizeof(test->data), tmp, &size_tmp,
 					&retval, NULL);
+		if (unpriv)
+			set_admin(false);
 		if (err && errno != 524/*ENOTSUPP*/ && errno != EPERM) {
 			printf("Unexpected bpf_prog_test_run error\n");
 			goto fail_log;
 		}
-		if (!err && retval != test->retval &&
-		    test->retval != POINTER_VALUE) {
-			printf("FAIL retval %d != %d\n", retval, test->retval);
+		if (!err && retval != expected_val &&
+		    expected_val != POINTER_VALUE) {
+			printf("FAIL retval %d != %d\n", retval, expected_val);
 			goto fail_log;
 		}
 	}
@@ -12921,33 +12957,6 @@ static bool is_admin(void)
 	return (sysadmin == CAP_SET);
 }
 
-static int set_admin(bool admin)
-{
-	cap_t caps;
-	const cap_value_t cap_val = CAP_SYS_ADMIN;
-	int ret = -1;
-
-	caps = cap_get_proc();
-	if (!caps) {
-		perror("cap_get_proc");
-		return -1;
-	}
-	if (cap_set_flag(caps, CAP_EFFECTIVE, 1, &cap_val,
-				admin ? CAP_SET : CAP_CLEAR)) {
-		perror("cap_set_flag");
-		goto out;
-	}
-	if (cap_set_proc(caps)) {
-		perror("cap_set_proc");
-		goto out;
-	}
-	ret = 0;
-out:
-	if (cap_free(caps))
-		perror("cap_free");
-	return ret;
-}
-
 static void get_unpriv_disabled()
 {
 	char buf[2];

commit 1b5c4b0669e0a63c9e5345c42ff6329a9001c207
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Wed Jun 2 11:27:45 2021 +0800

    bpf: fix test suite to enable all unpriv program types
    
    commit 36641ad61db5ce9befd5eb0071abb36eaff16cfc upstream
    
    Given BPF_PROG_TYPE_CGROUP_SKB program types are also valid in an
    unprivileged setting, lets not omit these tests and potentially
    have issues fall through the cracks. Make this more obvious by
    adding a small test_as_unpriv() helper.
    
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index e1e4b6ab83f7..d33d1d70722e 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -4798,6 +4798,7 @@ static struct bpf_test tests[] = {
 		.fixup_cgroup_storage = { 1 },
 		.result = REJECT,
 		.errstr = "get_local_storage() doesn't support non-zero flags",
+		.errstr_unpriv = "R2 leaks addr into helper function",
 		.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
 	},
 	{
@@ -12963,6 +12964,13 @@ static void get_unpriv_disabled()
 	fclose(fd);
 }
 
+static bool test_as_unpriv(struct bpf_test *test)
+{
+	return !test->prog_type ||
+	       test->prog_type == BPF_PROG_TYPE_SOCKET_FILTER ||
+	       test->prog_type == BPF_PROG_TYPE_CGROUP_SKB;
+}
+
 static int do_test(bool unpriv, unsigned int from, unsigned int to)
 {
 	int i, passes = 0, errors = 0, skips = 0;
@@ -12973,10 +12981,10 @@ static int do_test(bool unpriv, unsigned int from, unsigned int to)
 		/* Program types that are not supported by non-root we
 		 * skip right away.
 		 */
-		if (!test->prog_type && unpriv_disabled) {
+		if (test_as_unpriv(test) && unpriv_disabled) {
 			printf("#%d/u %s SKIP\n", i, test->descr);
 			skips++;
-		} else if (!test->prog_type) {
+		} else if (test_as_unpriv(test)) {
 			if (!unpriv)
 				set_admin(false);
 			printf("#%d/u %s ", i, test->descr);

commit 7de60c2d5a2a66ef2c5d76952a5a3a9a4ea4d436
Author: Mina Almasry <almasrymina@google.com>
Date:   Fri Jun 4 20:01:36 2021 -0700

    mm, hugetlb: fix simple resv_huge_pages underflow on UFFDIO_COPY
    
    [ Upstream commit d84cf06e3dd8c5c5b547b5d8931015fc536678e5 ]
    
    The userfaultfd hugetlb tests cause a resv_huge_pages underflow.  This
    happens when hugetlb_mcopy_atomic_pte() is called with !is_continue on
    an index for which we already have a page in the cache.  When this
    happens, we allocate a second page, double consuming the reservation,
    and then fail to insert the page into the cache and return -EEXIST.
    
    To fix this, we first check if there is a page in the cache which
    already consumed the reservation, and return -EEXIST immediately if so.
    
    There is still a rare condition where we fail to copy the page contents
    AND race with a call for hugetlb_no_page() for this index and again we
    will underflow resv_huge_pages.  That is fixed in a more complicated
    patch not targeted for -stable.
    
    Test:
    
      Hacked the code locally such that resv_huge_pages underflows produce a
      warning, then:
    
      ./tools/testing/selftests/vm/userfaultfd hugetlb_shared 10
            2 /tmp/kokonut_test/huge/userfaultfd_test && echo test success
      ./tools/testing/selftests/vm/userfaultfd hugetlb 10
            2 /tmp/kokonut_test/huge/userfaultfd_test && echo test success
    
    Both tests succeed and produce no warnings.  After the test runs number
    of free/resv hugepages is correct.
    
    [mike.kravetz@oracle.com: changelog fixes]
    
    Link: https://lkml.kernel.org/r/20210528004649.85298-1-almasrymina@google.com
    Fixes: 8fb5debc5fcd ("userfaultfd: hugetlbfs: add hugetlb_mcopy_atomic_pte for userfaultfd support")
    Signed-off-by: Mina Almasry <almasrymina@google.com>
    Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
    Cc: Axel Rasmussen <axelrasmussen@google.com>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index 2f769a661568..c69f12e4c149 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -4154,10 +4154,20 @@ int hugetlb_mcopy_atomic_pte(struct mm_struct *dst_mm,
 	struct page *page;
 
 	if (!*pagep) {
-		ret = -ENOMEM;
+		/* If a page already exists, then it's UFFDIO_COPY for
+		 * a non-missing case. Return -EEXIST.
+		 */
+		if (vm_shared &&
+		    hugetlbfs_pagecache_present(h, dst_vma, dst_addr)) {
+			ret = -EEXIST;
+			goto out;
+		}
+
 		page = alloc_huge_page(dst_vma, dst_addr, 0);
-		if (IS_ERR(page))
+		if (IS_ERR(page)) {
+			ret = -ENOMEM;
 			goto out;
+		}
 
 		ret = copy_huge_page_from_user(page,
 						(const void __user *) src_addr,

commit c5cfa81562174e585ecc40bf8766835abd058572
Author: Josef Bacik <josef@toxicpanda.com>
Date:   Wed May 19 13:13:15 2021 -0400

    btrfs: fixup error handling in fixup_inode_link_counts
    
    commit 011b28acf940eb61c000059dd9e2cfcbf52ed96b upstream.
    
    This function has the following pattern
    
            while (1) {
                    ret = whatever();
                    if (ret)
                            goto out;
            }
            ret = 0
    out:
            return ret;
    
    However several places in this while loop we simply break; when there's
    a problem, thus clearing the return value, and in one case we do a
    return -EIO, and leak the memory for the path.
    
    Fix this by re-arranging the loop to deal with ret == 1 coming from
    btrfs_search_slot, and then simply delete the
    
            ret = 0;
    out:
    
    bit so everybody can break if there is an error, which will allow for
    proper error handling to occur.
    
    CC: stable@vger.kernel.org # 4.4+
    Signed-off-by: Josef Bacik <josef@toxicpanda.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index 1cd610ddbb24..93e59ce00174 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -1699,6 +1699,7 @@ static noinline int fixup_inode_link_counts(struct btrfs_trans_handle *trans,
 			break;
 
 		if (ret == 1) {
+			ret = 0;
 			if (path->slots[0] == 0)
 				break;
 			path->slots[0]--;
@@ -1711,17 +1712,19 @@ static noinline int fixup_inode_link_counts(struct btrfs_trans_handle *trans,
 
 		ret = btrfs_del_item(trans, root, path);
 		if (ret)
-			goto out;
+			break;
 
 		btrfs_release_path(path);
 		inode = read_one_inode(root, key.offset);
-		if (!inode)
-			return -EIO;
+		if (!inode) {
+			ret = -EIO;
+			break;
+		}
 
 		ret = fixup_inode_link_count(trans, root, inode);
 		iput(inode);
 		if (ret)
-			goto out;
+			break;
 
 		/*
 		 * fixup on a directory may create new entries,
@@ -1730,8 +1733,6 @@ static noinline int fixup_inode_link_counts(struct btrfs_trans_handle *trans,
 		 */
 		key.offset = (u64)-1;
 	}
-	ret = 0;
-out:
 	btrfs_release_path(path);
 	return ret;
 }

commit adaafc32d8b0d896c71348775eee3d0fbe743052
Author: Josef Bacik <josef@toxicpanda.com>
Date:   Wed May 19 10:52:46 2021 -0400

    btrfs: return errors from btrfs_del_csums in cleanup_ref_head
    
    commit 856bd270dc4db209c779ce1e9555c7641ffbc88e upstream.
    
    We are unconditionally returning 0 in cleanup_ref_head, despite the fact
    that btrfs_del_csums could fail.  We need to return the error so the
    transaction gets aborted properly, fix this by returning ret from
    btrfs_del_csums in cleanup_ref_head.
    
    Reviewed-by: Qu Wenruo <wqu@suse.com>
    CC: stable@vger.kernel.org # 4.19+
    Signed-off-by: Josef Bacik <josef@toxicpanda.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index ce5e0f6c6af4..014f956be66a 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -2501,7 +2501,7 @@ static int cleanup_ref_head(struct btrfs_trans_handle *trans,
 				      head->qgroup_reserved);
 	btrfs_delayed_ref_unlock(head);
 	btrfs_put_delayed_ref_head(head);
-	return 0;
+	return ret;
 }
 
 /*

commit 8299bb94fae9393c922251ff90508f0a8b058ff4
Author: Josef Bacik <josef@toxicpanda.com>
Date:   Wed May 19 10:52:45 2021 -0400

    btrfs: fix error handling in btrfs_del_csums
    
    commit b86652be7c83f70bf406bed18ecf55adb9bfb91b upstream.
    
    Error injection stress would sometimes fail with checksums on disk that
    did not have a corresponding extent.  This occurred because the pattern
    in btrfs_del_csums was
    
            while (1) {
                    ret = btrfs_search_slot();
                    if (ret < 0)
                            break;
            }
            ret = 0;
    out:
            btrfs_free_path(path);
            return ret;
    
    If we got an error from btrfs_search_slot we'd clear the error because
    we were breaking instead of goto out.  Instead of using goto out, simply
    handle the cases where we may leave a random value in ret, and get rid
    of the
    
            ret = 0;
    out:
    
    pattern and simply allow break to have the proper error reporting.  With
    this fix we properly abort the transaction and do not commit thinking we
    successfully deleted the csum.
    
    Reviewed-by: Qu Wenruo <wqu@suse.com>
    CC: stable@vger.kernel.org # 4.4+
    Signed-off-by: Josef Bacik <josef@toxicpanda.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c
index 1b8a04b767ff..40db31b69ef7 100644
--- a/fs/btrfs/file-item.c
+++ b/fs/btrfs/file-item.c
@@ -586,7 +586,7 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans,
 	u64 end_byte = bytenr + len;
 	u64 csum_end;
 	struct extent_buffer *leaf;
-	int ret;
+	int ret = 0;
 	u16 csum_size = btrfs_super_csum_size(fs_info->super_copy);
 	int blocksize_bits = fs_info->sb->s_blocksize_bits;
 
@@ -605,6 +605,7 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans,
 		path->leave_spinning = 1;
 		ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
 		if (ret > 0) {
+			ret = 0;
 			if (path->slots[0] == 0)
 				break;
 			path->slots[0]--;
@@ -661,7 +662,7 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans,
 			ret = btrfs_del_items(trans, root, path,
 					      path->slots[0], del_nr);
 			if (ret)
-				goto out;
+				break;
 			if (key.offset == bytenr)
 				break;
 		} else if (key.offset < bytenr && csum_end > end_byte) {
@@ -705,8 +706,9 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans,
 			ret = btrfs_split_item(trans, root, path, &key, offset);
 			if (ret && ret != -EAGAIN) {
 				btrfs_abort_transaction(trans, ret);
-				goto out;
+				break;
 			}
+			ret = 0;
 
 			key.offset = end_byte - 1;
 		} else {
@@ -716,8 +718,6 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans,
 		}
 		btrfs_release_path(path);
 	}
-	ret = 0;
-out:
 	btrfs_free_path(path);
 	return ret;
 }

commit 543a6f5284b4cc0591e5497d1912300378043561
Author: Josef Bacik <josef@toxicpanda.com>
Date:   Wed May 19 09:38:27 2021 -0400

    btrfs: mark ordered extent and inode with error if we fail to finish
    
    commit d61bec08b904cf171835db98168f82bc338e92e4 upstream.
    
    While doing error injection testing I saw that sometimes we'd get an
    abort that wouldn't stop the current transaction commit from completing.
    This abort was coming from finish ordered IO, but at this point in the
    transaction commit we should have gotten an error and stopped.
    
    It turns out the abort came from finish ordered io while trying to write
    out the free space cache.  It occurred to me that any failure inside of
    finish_ordered_io isn't actually raised to the person doing the writing,
    so we could have any number of failures in this path and think the
    ordered extent completed successfully and the inode was fine.
    
    Fix this by marking the ordered extent with BTRFS_ORDERED_IOERR, and
    marking the mapping of the inode with mapping_set_error, so any callers
    that simply call fdatawait will also get the error.
    
    With this we're seeing the IO error on the free space inode when we fail
    to do the finish_ordered_io.
    
    CC: stable@vger.kernel.org # 4.19+
    Signed-off-by: Josef Bacik <josef@toxicpanda.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 8c6f619c9ee6..bf0e0e3e09c5 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -3162,6 +3162,18 @@ static int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent)
 	if (ret || truncated) {
 		u64 start, end;
 
+		/*
+		 * If we failed to finish this ordered extent for any reason we
+		 * need to make sure BTRFS_ORDERED_IOERR is set on the ordered
+		 * extent, and mark the inode with the error if it wasn't
+		 * already set.  Any error during writeback would have already
+		 * set the mapping error, so we need to set it if we're the ones
+		 * marking this ordered extent as failed.
+		 */
+		if (ret && !test_and_set_bit(BTRFS_ORDERED_IOERR,
+					     &ordered_extent->flags))
+			mapping_set_error(ordered_extent->inode->i_mapping, -EIO);
+
 		if (truncated)
 			start = ordered_extent->file_offset + logical_len;
 		else

commit 7e25cb1b22f81239ae3332e14a1d0cff7014bccd
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Tue May 25 13:08:41 2021 +0200

    x86/apic: Mark _all_ legacy interrupts when IO/APIC is missing
    
    commit 7d65f9e80646c595e8c853640a9d0768a33e204c upstream.
    
    PIC interrupts do not support affinity setting and they can end up on
    any online CPU. Therefore, it's required to mark the associated vectors
    as system-wide reserved. Otherwise, the corresponding irq descriptors
    are copied to the secondary CPUs but the vectors are not marked as
    assigned or reserved. This works correctly for the IO/APIC case.
    
    When the IO/APIC is disabled via config, kernel command line or lack of
    enumeration then all legacy interrupts are routed through the PIC, but
    nothing marks them as system-wide reserved vectors.
    
    As a consequence, a subsequent allocation on a secondary CPU can result in
    allocating one of these vectors, which triggers the BUG() in
    apic_update_vector() because the interrupt descriptor slot is not empty.
    
    Imran tried to work around that by marking those interrupts as allocated
    when a CPU comes online. But that's wrong in case that the IO/APIC is
    available and one of the legacy interrupts, e.g. IRQ0, has been switched to
    PIC mode because then marking them as allocated will fail as they are
    already marked as system vectors.
    
    Stay consistent and update the legacy vectors after attempting IO/APIC
    initialization and mark them as system vectors in case that no IO/APIC is
    available.
    
    Fixes: 69cde0004a4b ("x86/vector: Use matrix allocator for vector assignment")
    Reported-by: Imran Khan <imran.f.khan@oracle.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Cc: stable@vger.kernel.org
    Link: https://lkml.kernel.org/r/20210519233928.2157496-1-imran.f.khan@oracle.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
index b5354e216b07..163c2af44a44 100644
--- a/arch/x86/include/asm/apic.h
+++ b/arch/x86/include/asm/apic.h
@@ -172,6 +172,7 @@ static inline int apic_is_clustered_box(void)
 extern int setup_APIC_eilvt(u8 lvt_off, u8 vector, u8 msg_type, u8 mask);
 extern void lapic_assign_system_vectors(void);
 extern void lapic_assign_legacy_vector(unsigned int isairq, bool replace);
+extern void lapic_update_legacy_vectors(void);
 extern void lapic_online(void);
 extern void lapic_offline(void);
 
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index da6b52c70964..9791828f3fcd 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -2507,6 +2507,7 @@ void __init apic_bsp_setup(bool upmode)
 	end_local_APIC_setup();
 	irq_remap_enable_fault_handling();
 	setup_IO_APIC();
+	lapic_update_legacy_vectors();
 }
 
 #ifdef CONFIG_UP_LATE_INIT
diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c
index f0d0535e8f34..dc7c759442f1 100644
--- a/arch/x86/kernel/apic/vector.c
+++ b/arch/x86/kernel/apic/vector.c
@@ -682,6 +682,26 @@ void lapic_assign_legacy_vector(unsigned int irq, bool replace)
 	irq_matrix_assign_system(vector_matrix, ISA_IRQ_VECTOR(irq), replace);
 }
 
+void __init lapic_update_legacy_vectors(void)
+{
+	unsigned int i;
+
+	if (IS_ENABLED(CONFIG_X86_IO_APIC) && nr_ioapics > 0)
+		return;
+
+	/*
+	 * If the IO/APIC is disabled via config, kernel command line or
+	 * lack of enumeration then all legacy interrupts are routed
+	 * through the PIC. Make sure that they are marked as legacy
+	 * vectors. PIC_CASCADE_IRQ has already been marked in
+	 * lapic_assign_system_vectors().
+	 */
+	for (i = 0; i < nr_legacy_irqs(); i++) {
+		if (i != PIC_CASCADE_IR)
+			lapic_assign_legacy_vector(i, true);
+	}
+}
+
 void __init lapic_assign_system_vectors(void)
 {
 	unsigned int i, vector = 0;

commit 93e4ac2a9979a9a4ecc158409ed9c3044dc0ae1f
Author: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Date:   Mon May 31 09:21:38 2021 +0200

    nfc: fix NULL ptr dereference in llcp_sock_getname() after failed connect
    
    commit 4ac06a1e013cf5fdd963317ffd3b968560f33bba upstream.
    
    It's possible to trigger NULL pointer dereference by local unprivileged
    user, when calling getsockname() after failed bind() (e.g. the bind
    fails because LLCP_SAP_MAX used as SAP):
    
      BUG: kernel NULL pointer dereference, address: 0000000000000000
      CPU: 1 PID: 426 Comm: llcp_sock_getna Not tainted 5.13.0-rc2-next-20210521+ #9
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-1 04/01/2014
      Call Trace:
       llcp_sock_getname+0xb1/0xe0
       __sys_getpeername+0x95/0xc0
       ? lockdep_hardirqs_on_prepare+0xd5/0x180
       ? syscall_enter_from_user_mode+0x1c/0x40
       __x64_sys_getpeername+0x11/0x20
       do_syscall_64+0x36/0x70
       entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    This can be reproduced with Syzkaller C repro (bind followed by
    getpeername):
    https://syzkaller.appspot.com/x/repro.c?x=14def446e00000
    
    Cc: <stable@vger.kernel.org>
    Fixes: d646960f7986 ("NFC: Initial LLCP support")
    Reported-by: syzbot+80fb126e7f7d8b1a5914@syzkaller.appspotmail.com
    Reported-by: butt3rflyh4ck <butterflyhuangxx@gmail.com>
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Link: https://lore.kernel.org/r/20210531072138.5219-1-krzysztof.kozlowski@canonical.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/nfc/llcp_sock.c b/net/nfc/llcp_sock.c
index 59de4f54dd18..23f7116d122a 100644
--- a/net/nfc/llcp_sock.c
+++ b/net/nfc/llcp_sock.c
@@ -122,6 +122,7 @@ static int llcp_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
 	if (!llcp_sock->service_name) {
 		nfc_llcp_local_put(llcp_sock->local);
 		llcp_sock->local = NULL;
+		llcp_sock->dev = NULL;
 		ret = -ENOMEM;
 		goto put_dev;
 	}
@@ -131,6 +132,7 @@ static int llcp_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
 		llcp_sock->local = NULL;
 		kfree(llcp_sock->service_name);
 		llcp_sock->service_name = NULL;
+		llcp_sock->dev = NULL;
 		ret = -EADDRINUSE;
 		goto put_dev;
 	}

commit cec4e857ffaa8c447f51cd8ab4e72350077b6770
Author: Junxiao Bi <junxiao.bi@oracle.com>
Date:   Fri Jun 4 20:01:42 2021 -0700

    ocfs2: fix data corruption by fallocate
    
    commit 6bba4471f0cc1296fe3c2089b9e52442d3074b2e upstream.
    
    When fallocate punches holes out of inode size, if original isize is in
    the middle of last cluster, then the part from isize to the end of the
    cluster will be zeroed with buffer write, at that time isize is not yet
    updated to match the new size, if writeback is kicked in, it will invoke
    ocfs2_writepage()->block_write_full_page() where the pages out of inode
    size will be dropped.  That will cause file corruption.  Fix this by
    zero out eof blocks when extending the inode size.
    
    Running the following command with qemu-image 4.2.1 can get a corrupted
    coverted image file easily.
    
        qemu-img convert -p -t none -T none -f qcow2 $qcow_image \
                 -O qcow2 -o compat=1.1 $qcow_image.conv
    
    The usage of fallocate in qemu is like this, it first punches holes out
    of inode size, then extend the inode size.
    
        fallocate(11, FALLOC_FL_KEEP_SIZE|FALLOC_FL_PUNCH_HOLE, 2276196352, 65536) = 0
        fallocate(11, 0, 2276196352, 65536) = 0
    
    v1: https://www.spinics.net/lists/linux-fsdevel/msg193999.html
    v2: https://lore.kernel.org/linux-fsdevel/20210525093034.GB4112@quack2.suse.cz/T/
    
    Link: https://lkml.kernel.org/r/20210528210648.9124-1-junxiao.bi@oracle.com
    Signed-off-by: Junxiao Bi <junxiao.bi@oracle.com>
    Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Mark Fasheh <mark@fasheh.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Cc: Changwei Ge <gechangwei@live.cn>
    Cc: Gang He <ghe@suse.com>
    Cc: Jun Piao <piaojun@huawei.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
index 5c507569ef70..94df697e2638 100644
--- a/fs/ocfs2/file.c
+++ b/fs/ocfs2/file.c
@@ -1863,6 +1863,45 @@ int ocfs2_remove_inode_range(struct inode *inode,
 	return ret;
 }
 
+/*
+ * zero out partial blocks of one cluster.
+ *
+ * start: file offset where zero starts, will be made upper block aligned.
+ * len: it will be trimmed to the end of current cluster if "start + len"
+ *      is bigger than it.
+ */
+static int ocfs2_zeroout_partial_cluster(struct inode *inode,
+					u64 start, u64 len)
+{
+	int ret;
+	u64 start_block, end_block, nr_blocks;
+	u64 p_block, offset;
+	u32 cluster, p_cluster, nr_clusters;
+	struct super_block *sb = inode->i_sb;
+	u64 end = ocfs2_align_bytes_to_clusters(sb, start);
+
+	if (start + len < end)
+		end = start + len;
+
+	start_block = ocfs2_blocks_for_bytes(sb, start);
+	end_block = ocfs2_blocks_for_bytes(sb, end);
+	nr_blocks = end_block - start_block;
+	if (!nr_blocks)
+		return 0;
+
+	cluster = ocfs2_bytes_to_clusters(sb, start);
+	ret = ocfs2_get_clusters(inode, cluster, &p_cluster,
+				&nr_clusters, NULL);
+	if (ret)
+		return ret;
+	if (!p_cluster)
+		return 0;
+
+	offset = start_block - ocfs2_clusters_to_blocks(sb, cluster);
+	p_block = ocfs2_clusters_to_blocks(sb, p_cluster) + offset;
+	return sb_issue_zeroout(sb, p_block, nr_blocks, GFP_NOFS);
+}
+
 /*
  * Parts of this function taken from xfs_change_file_space()
  */
@@ -1873,7 +1912,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode,
 {
 	int ret;
 	s64 llen;
-	loff_t size;
+	loff_t size, orig_isize;
 	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
 	struct buffer_head *di_bh = NULL;
 	handle_t *handle;
@@ -1904,6 +1943,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode,
 		goto out_inode_unlock;
 	}
 
+	orig_isize = i_size_read(inode);
 	switch (sr->l_whence) {
 	case 0: /*SEEK_SET*/
 		break;
@@ -1911,7 +1951,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode,
 		sr->l_start += f_pos;
 		break;
 	case 2: /*SEEK_END*/
-		sr->l_start += i_size_read(inode);
+		sr->l_start += orig_isize;
 		break;
 	default:
 		ret = -EINVAL;
@@ -1965,6 +2005,14 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode,
 	default:
 		ret = -EINVAL;
 	}
+
+	/* zeroout eof blocks in the cluster. */
+	if (!ret && change_size && orig_isize < size) {
+		ret = ocfs2_zeroout_partial_cluster(inode, orig_isize,
+					size - orig_isize);
+		if (!ret)
+			i_size_write(inode, size);
+	}
 	up_write(&OCFS2_I(inode)->ip_alloc_sem);
 	if (ret) {
 		mlog_errno(ret);
@@ -1981,9 +2029,6 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode,
 		goto out_inode_unlock;
 	}
 
-	if (change_size && i_size_read(inode) < size)
-		i_size_write(inode, size);
-
 	inode->i_ctime = inode->i_mtime = current_time(inode);
 	ret = ocfs2_mark_inode_dirty(handle, inode, di_bh);
 	if (ret < 0)

commit d106f05432e60f9f62d456ef017687f5c73cb414
Author: Mark Rutland <mark.rutland@arm.com>
Date:   Fri Jun 4 20:01:14 2021 -0700

    pid: take a reference when initializing `cad_pid`
    
    commit 0711f0d7050b9e07c44bc159bbc64ac0a1022c7f upstream.
    
    During boot, kernel_init_freeable() initializes `cad_pid` to the init
    task's struct pid.  Later on, we may change `cad_pid` via a sysctl, and
    when this happens proc_do_cad_pid() will increment the refcount on the
    new pid via get_pid(), and will decrement the refcount on the old pid
    via put_pid().  As we never called get_pid() when we initialized
    `cad_pid`, we decrement a reference we never incremented, can therefore
    free the init task's struct pid early.  As there can be dangling
    references to the struct pid, we can later encounter a use-after-free
    (e.g.  when delivering signals).
    
    This was spotted when fuzzing v5.13-rc3 with Syzkaller, but seems to
    have been around since the conversion of `cad_pid` to struct pid in
    commit 9ec52099e4b8 ("[PATCH] replace cad_pid by a struct pid") from the
    pre-KASAN stone age of v2.6.19.
    
    Fix this by getting a reference to the init task's struct pid when we
    assign it to `cad_pid`.
    
    Full KASAN splat below.
    
       ==================================================================
       BUG: KASAN: use-after-free in ns_of_pid include/linux/pid.h:153 [inline]
       BUG: KASAN: use-after-free in task_active_pid_ns+0xc0/0xc8 kernel/pid.c:509
       Read of size 4 at addr ffff23794dda0004 by task syz-executor.0/273
    
       CPU: 1 PID: 273 Comm: syz-executor.0 Not tainted 5.12.0-00001-g9aef892b2d15 #1
       Hardware name: linux,dummy-virt (DT)
       Call trace:
        ns_of_pid include/linux/pid.h:153 [inline]
        task_active_pid_ns+0xc0/0xc8 kernel/pid.c:509
        do_notify_parent+0x308/0xe60 kernel/signal.c:1950
        exit_notify kernel/exit.c:682 [inline]
        do_exit+0x2334/0x2bd0 kernel/exit.c:845
        do_group_exit+0x108/0x2c8 kernel/exit.c:922
        get_signal+0x4e4/0x2a88 kernel/signal.c:2781
        do_signal arch/arm64/kernel/signal.c:882 [inline]
        do_notify_resume+0x300/0x970 arch/arm64/kernel/signal.c:936
        work_pending+0xc/0x2dc
    
       Allocated by task 0:
        slab_post_alloc_hook+0x50/0x5c0 mm/slab.h:516
        slab_alloc_node mm/slub.c:2907 [inline]
        slab_alloc mm/slub.c:2915 [inline]
        kmem_cache_alloc+0x1f4/0x4c0 mm/slub.c:2920
        alloc_pid+0xdc/0xc00 kernel/pid.c:180
        copy_process+0x2794/0x5e18 kernel/fork.c:2129
        kernel_clone+0x194/0x13c8 kernel/fork.c:2500
        kernel_thread+0xd4/0x110 kernel/fork.c:2552
        rest_init+0x44/0x4a0 init/main.c:687
        arch_call_rest_init+0x1c/0x28
        start_kernel+0x520/0x554 init/main.c:1064
        0x0
    
       Freed by task 270:
        slab_free_hook mm/slub.c:1562 [inline]
        slab_free_freelist_hook+0x98/0x260 mm/slub.c:1600
        slab_free mm/slub.c:3161 [inline]
        kmem_cache_free+0x224/0x8e0 mm/slub.c:3177
        put_pid.part.4+0xe0/0x1a8 kernel/pid.c:114
        put_pid+0x30/0x48 kernel/pid.c:109
        proc_do_cad_pid+0x190/0x1b0 kernel/sysctl.c:1401
        proc_sys_call_handler+0x338/0x4b0 fs/proc/proc_sysctl.c:591
        proc_sys_write+0x34/0x48 fs/proc/proc_sysctl.c:617
        call_write_iter include/linux/fs.h:1977 [inline]
        new_sync_write+0x3ac/0x510 fs/read_write.c:518
        vfs_write fs/read_write.c:605 [inline]
        vfs_write+0x9c4/0x1018 fs/read_write.c:585
        ksys_write+0x124/0x240 fs/read_write.c:658
        __do_sys_write fs/read_write.c:670 [inline]
        __se_sys_write fs/read_write.c:667 [inline]
        __arm64_sys_write+0x78/0xb0 fs/read_write.c:667
        __invoke_syscall arch/arm64/kernel/syscall.c:37 [inline]
        invoke_syscall arch/arm64/kernel/syscall.c:49 [inline]
        el0_svc_common.constprop.1+0x16c/0x388 arch/arm64/kernel/syscall.c:129
        do_el0_svc+0xf8/0x150 arch/arm64/kernel/syscall.c:168
        el0_svc+0x28/0x38 arch/arm64/kernel/entry-common.c:416
        el0_sync_handler+0x134/0x180 arch/arm64/kernel/entry-common.c:432
        el0_sync+0x154/0x180 arch/arm64/kernel/entry.S:701
    
       The buggy address belongs to the object at ffff23794dda0000
        which belongs to the cache pid of size 224
       The buggy address is located 4 bytes inside of
        224-byte region [ffff23794dda0000, ffff23794dda00e0)
       The buggy address belongs to the page:
       page:(____ptrval____) refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x4dda0
       head:(____ptrval____) order:1 compound_mapcount:0
       flags: 0x3fffc0000010200(slab|head)
       raw: 03fffc0000010200 dead000000000100 dead000000000122 ffff23794d40d080
       raw: 0000000000000000 0000000000190019 00000001ffffffff 0000000000000000
       page dumped because: kasan: bad access detected
    
       Memory state around the buggy address:
        ffff23794dd9ff00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
        ffff23794dd9ff80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
       >ffff23794dda0000: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
                          ^
        ffff23794dda0080: fb fb fb fb fb fb fb fb fb fb fb fb fc fc fc fc
        ffff23794dda0100: fc fc fc fc fc fc fc fc 00 00 00 00 00 00 00 00
       ==================================================================
    
    Link: https://lkml.kernel.org/r/20210524172230.38715-1-mark.rutland@arm.com
    Fixes: 9ec52099e4b8678a ("[PATCH] replace cad_pid by a struct pid")
    Signed-off-by: Mark Rutland <mark.rutland@arm.com>
    Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
    Cc: Cedric Le Goater <clg@fr.ibm.com>
    Cc: Christian Brauner <christian@brauner.io>
    Cc: Eric W. Biederman <ebiederm@xmission.com>
    Cc: Kees Cook <keescook@chromium.org
    Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/init/main.c b/init/main.c
index fdfef08da0c4..7baad67c2e93 100644
--- a/init/main.c
+++ b/init/main.c
@@ -1124,7 +1124,7 @@ static noinline void __init kernel_init_freeable(void)
 	 */
 	set_mems_allowed(node_states[N_MEMORY]);
 
-	cad_pid = task_pid(current);
+	cad_pid = get_pid(task_pid(current));
 
 	smp_prepare_cpus(setup_max_cpus);
 

commit 2132a28807cf8eda722f96628b3ab7709a236bb8
Author: Phil Elwell <phil@raspberrypi.com>
Date:   Tue Jun 8 13:00:49 2021 +0100

    usb: dwc2: Fix build in periphal-only mode
    
    In branches to which 24d209dba5a3 ("usb: dwc2: Fix hibernation between
    host and device modes.") has been back-ported, the bus_suspended member
    of struct dwc2_hsotg is only present in builds that support host-mode.
    To avoid having to pull in several more non-Fix commits in order to
    get it to compile, wrap the usage of the member in a macro conditional.
    
    Fixes: 24d209dba5a3 ("usb: dwc2: Fix hibernation between host and device modes.")
    Signed-off-by: Phil Elwell <phil@raspberrypi.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/dwc2/core_intr.c b/drivers/usb/dwc2/core_intr.c
index af26a8a20e0b..5919ecb7d4b7 100644
--- a/drivers/usb/dwc2/core_intr.c
+++ b/drivers/usb/dwc2/core_intr.c
@@ -700,7 +700,11 @@ static inline void dwc_handle_gpwrdn_disc_det(struct dwc2_hsotg *hsotg,
 	dwc2_writel(hsotg, gpwrdn_tmp, GPWRDN);
 
 	hsotg->hibernated = 0;
+
+#if IS_ENABLED(CONFIG_USB_DWC2_HOST) ||	\
+	IS_ENABLED(CONFIG_USB_DWC2_DUAL_ROLE)
 	hsotg->bus_suspended = 0;
+#endif
 
 	if (gpwrdn & GPWRDN_IDSTS) {
 		hsotg->op_state = OTG_STATE_B_PERIPHERAL;

commit 569496aa3776eea1ff0d49d0174ac1b7e861e107
Author: Ye Bin <yebin10@huawei.com>
Date:   Thu May 6 22:10:42 2021 +0800

    ext4: fix bug on in ext4_es_cache_extent as ext4_split_extent_at failed
    
    commit 082cd4ec240b8734a82a89ffb890216ac98fec68 upstream.
    
    We got follow bug_on when run fsstress with injecting IO fault:
    [130747.323114] kernel BUG at fs/ext4/extents_status.c:762!
    [130747.323117] Internal error: Oops - BUG: 0 [#1] SMP
    ......
    [130747.334329] Call trace:
    [130747.334553]  ext4_es_cache_extent+0x150/0x168 [ext4]
    [130747.334975]  ext4_cache_extents+0x64/0xe8 [ext4]
    [130747.335368]  ext4_find_extent+0x300/0x330 [ext4]
    [130747.335759]  ext4_ext_map_blocks+0x74/0x1178 [ext4]
    [130747.336179]  ext4_map_blocks+0x2f4/0x5f0 [ext4]
    [130747.336567]  ext4_mpage_readpages+0x4a8/0x7a8 [ext4]
    [130747.336995]  ext4_readpage+0x54/0x100 [ext4]
    [130747.337359]  generic_file_buffered_read+0x410/0xae8
    [130747.337767]  generic_file_read_iter+0x114/0x190
    [130747.338152]  ext4_file_read_iter+0x5c/0x140 [ext4]
    [130747.338556]  __vfs_read+0x11c/0x188
    [130747.338851]  vfs_read+0x94/0x150
    [130747.339110]  ksys_read+0x74/0xf0
    
    This patch's modification is according to Jan Kara's suggestion in:
    https://patchwork.ozlabs.org/project/linux-ext4/patch/20210428085158.3728201-1-yebin10@huawei.com/
    "I see. Now I understand your patch. Honestly, seeing how fragile is trying
    to fix extent tree after split has failed in the middle, I would probably
    go even further and make sure we fix the tree properly in case of ENOSPC
    and EDQUOT (those are easily user triggerable).  Anything else indicates a
    HW problem or fs corruption so I'd rather leave the extent tree as is and
    don't try to fix it (which also means we will not create overlapping
    extents)."
    
    Cc: stable@kernel.org
    Signed-off-by: Ye Bin <yebin10@huawei.com>
    Reviewed-by: Jan Kara <jack@suse.cz>
    Link: https://lore.kernel.org/r/20210506141042.3298679-1-yebin10@huawei.com
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index 36708d9d71cb..093cb675841b 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -3263,7 +3263,10 @@ static int ext4_split_extent_at(handle_t *handle,
 		ext4_ext_mark_unwritten(ex2);
 
 	err = ext4_ext_insert_extent(handle, inode, ppath, &newex, flags);
-	if (err == -ENOSPC && (EXT4_EXT_MAY_ZEROOUT & split_flag)) {
+	if (err != -ENOSPC && err != -EDQUOT)
+		goto out;
+
+	if (EXT4_EXT_MAY_ZEROOUT & split_flag) {
 		if (split_flag & (EXT4_EXT_DATA_VALID1|EXT4_EXT_DATA_VALID2)) {
 			if (split_flag & EXT4_EXT_DATA_VALID1) {
 				err = ext4_ext_zeroout(inode, ex2);
@@ -3289,30 +3292,30 @@ static int ext4_split_extent_at(handle_t *handle,
 					      ext4_ext_pblock(&orig_ex));
 		}
 
-		if (err)
-			goto fix_extent_len;
-		/* update the extent length and mark as initialized */
-		ex->ee_len = cpu_to_le16(ee_len);
-		ext4_ext_try_to_merge(handle, inode, path, ex);
-		err = ext4_ext_dirty(handle, inode, path + path->p_depth);
-		if (err)
-			goto fix_extent_len;
-
-		/* update extent status tree */
-		err = ext4_zeroout_es(inode, &zero_ex);
-
-		goto out;
-	} else if (err)
-		goto fix_extent_len;
-
-out:
-	ext4_ext_show_leaf(inode, path);
-	return err;
+		if (!err) {
+			/* update the extent length and mark as initialized */
+			ex->ee_len = cpu_to_le16(ee_len);
+			ext4_ext_try_to_merge(handle, inode, path, ex);
+			err = ext4_ext_dirty(handle, inode, path + path->p_depth);
+			if (!err)
+				/* update extent status tree */
+				err = ext4_zeroout_es(inode, &zero_ex);
+			/* If we failed at this point, we don't know in which
+			 * state the extent tree exactly is so don't try to fix
+			 * length of the original extent as it may do even more
+			 * damage.
+			 */
+			goto out;
+		}
+	}
 
 fix_extent_len:
 	ex->ee_len = orig_ex.ee_len;
 	ext4_ext_dirty(handle, inode, path + path->p_depth);
 	return err;
+out:
+	ext4_ext_show_leaf(inode, path);
+	return err;
 }
 
 /*

commit 1294a5d725e8d19d661c8065959128da0ab7ef52
Author: Carlos M <carlos.marr.pz@gmail.com>
Date:   Mon May 31 22:20:26 2021 +0200

    ALSA: hda: Fix for mute key LED for HP Pavilion 15-CK0xx
    
    commit 901be145a46eb79879367d853194346a549e623d upstream.
    
    For the HP Pavilion 15-CK0xx, with audio subsystem ID 0x103c:0x841c,
    adding a line in patch_realtek.c to apply the ALC269_FIXUP_HP_MUTE_LED_MIC3
    fix activates the mute key LED.
    
    Signed-off-by: Carlos M <carlos.marr.pz@gmail.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210531202026.35427-1-carlos.marr.pz@gmail.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index f9ebbee3824b..42c30fba699f 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -7095,6 +7095,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
+	SND_PCI_QUIRK(0x103c, 0x841c, "HP Pavilion 15-CK0xx", ALC269_FIXUP_HP_MUTE_LED_MIC3),
 	SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
 	SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
 	SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_LED),

commit db6e9d1cc260e3d333221d05b74029793742d5dc
Author: Takashi Iwai <tiwai@suse.de>
Date:   Wed Jun 2 13:38:23 2021 +0200

    ALSA: timer: Fix master timer notification
    
    commit 9c1fe96bded935369f8340c2ac2e9e189f697d5d upstream.
    
    snd_timer_notify1() calls the notification to each slave for a master
    event, but it passes a wrong event number.  It should be +10 offset,
    corresponding to SNDRV_TIMER_EVENT_MXXX, but it's incorrectly with
    +100 offset.  Casually this was spotted by UBSAN check via syzkaller.
    
    Reported-by: syzbot+d102fa5b35335a7e544e@syzkaller.appspotmail.com
    Reviewed-by: Jaroslav Kysela <perex@perex.cz>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/000000000000e5560e05c3bd1d63@google.com
    Link: https://lore.kernel.org/r/20210602113823.23777-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/core/timer.c b/sound/core/timer.c
index b5dc51030316..b4fe1324b56c 100644
--- a/sound/core/timer.c
+++ b/sound/core/timer.c
@@ -500,9 +500,10 @@ static void snd_timer_notify1(struct snd_timer_instance *ti, int event)
 		return;
 	if (timer->hw.flags & SNDRV_TIMER_HW_SLAVE)
 		return;
+	event += 10; /* convert to SNDRV_TIMER_EVENT_MXXX */
 	list_for_each_entry(ts, &ti->slave_active_head, active_list)
 		if (ts->ccallback)
-			ts->ccallback(ts, event + 100, &tstamp, resolution);
+			ts->ccallback(ts, event, &tstamp, resolution);
 }
 
 /* start/continue a master timer */

commit cb7bb81ac98d806ee47fc0ab3849db22df27471f
Author: Ahelenia Ziemia?ska <nabijaczleweli@nabijaczleweli.xyz>
Date:   Mon Mar 8 18:42:03 2021 +0100

    HID: multitouch: require Finger field to mark Win8 reports as MT
    
    commit a2353e3b26012ff43bcdf81d37a3eaddd7ecdbf3 upstream.
    
    This effectively changes collection_is_mt from
      contact ID in report->field
    to
      (device is Win8 => collection is finger) && contact ID in report->field
    
    Some devices erroneously report Pen for fingers, and Win8 stylus-on-touchscreen
    devices report contact ID, but mark the accompanying touchscreen device's
    collection correctly
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Ahelenia Ziemia?ska <nabijaczleweli@nabijaczleweli.xyz>
    Acked-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
index ccda72f748ee..c20945ed1dc1 100644
--- a/drivers/hid/hid-multitouch.c
+++ b/drivers/hid/hid-multitouch.c
@@ -588,9 +588,13 @@ static struct mt_report_data *mt_allocate_report_data(struct mt_device *td,
 		if (!(HID_MAIN_ITEM_VARIABLE & field->flags))
 			continue;
 
-		for (n = 0; n < field->report_count; n++) {
-			if (field->usage[n].hid == HID_DG_CONTACTID)
-				rdata->is_mt_collection = true;
+		if (field->logical == HID_DG_FINGER || td->hdev->group != HID_GROUP_MULTITOUCH_WIN_8) {
+			for (n = 0; n < field->report_count; n++) {
+				if (field->usage[n].hid == HID_DG_CONTACTID) {
+					rdata->is_mt_collection = true;
+					break;
+				}
+			}
 		}
 	}
 

commit 9ea0ab48e755d8f29fe89eb235fb86176fdb597f
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Thu Jun 3 19:39:35 2021 +0300

    net: caif: fix memory leak in cfusbl_device_notify
    
    commit 7f5d86669fa4d485523ddb1d212e0a2d90bd62bb upstream.
    
    In case of caif_enroll_dev() fail, allocated
    link_support won't be assigned to the corresponding
    structure. So simply free allocated pointer in case
    of error.
    
    Fixes: 7ad65bf68d70 ("caif: Add support for CAIF over CDC NCM USB interface")
    Cc: stable@vger.kernel.org
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/caif/caif_usb.c b/net/caif/caif_usb.c
index 1a082a946045..76d49a1bc6f6 100644
--- a/net/caif/caif_usb.c
+++ b/net/caif/caif_usb.c
@@ -116,6 +116,11 @@ static struct cflayer *cfusbl_create(int phyid, u8 ethaddr[ETH_ALEN],
 	return (struct cflayer *) this;
 }
 
+static void cfusbl_release(struct cflayer *layer)
+{
+	kfree(layer);
+}
+
 static struct packet_type caif_usb_type __read_mostly = {
 	.type = cpu_to_be16(ETH_P_802_EX1),
 };
@@ -128,6 +133,7 @@ static int cfusbl_device_notify(struct notifier_block *me, unsigned long what,
 	struct cflayer *layer, *link_support;
 	struct usbnet *usbnet;
 	struct usb_device *usbdev;
+	int res;
 
 	/* Check whether we have a NCM device, and find its VID/PID. */
 	if (!(dev->dev.parent && dev->dev.parent->driver &&
@@ -170,8 +176,11 @@ static int cfusbl_device_notify(struct notifier_block *me, unsigned long what,
 	if (dev->num_tx_queues > 1)
 		pr_warn("USB device uses more than one tx queue\n");
 
-	caif_enroll_dev(dev, &common, link_support, CFUSB_MAX_HEADLEN,
+	res = caif_enroll_dev(dev, &common, link_support, CFUSB_MAX_HEADLEN,
 			&layer, &caif_usb_type.func);
+	if (res)
+		goto err;
+
 	if (!pack_added)
 		dev_add_pack(&caif_usb_type);
 	pack_added = true;
@@ -179,6 +188,9 @@ static int cfusbl_device_notify(struct notifier_block *me, unsigned long what,
 	strlcpy(layer->name, dev->name, sizeof(layer->name));
 
 	return 0;
+err:
+	cfusbl_release(link_support);
+	return res;
 }
 
 static struct notifier_block caif_device_notifier = {

commit 3be863c11cab725add9fef4237ed4e232c3fc3bb
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Thu Jun 3 19:39:11 2021 +0300

    net: caif: fix memory leak in caif_device_notify
    
    commit b53558a950a89824938e9811eddfc8efcd94e1bb upstream.
    
    In case of caif_enroll_dev() fail, allocated
    link_support won't be assigned to the corresponding
    structure. So simply free allocated pointer in case
    of error
    
    Fixes: 7c18d2205ea7 ("caif: Restructure how link caif link layer enroll")
    Cc: stable@vger.kernel.org
    Reported-and-tested-by: syzbot+7ec324747ce876a29db6@syzkaller.appspotmail.com
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/caif/caif_dev.c b/net/caif/caif_dev.c
index 32452796b90d..cc305d84168f 100644
--- a/net/caif/caif_dev.c
+++ b/net/caif/caif_dev.c
@@ -365,6 +365,7 @@ static int caif_device_notify(struct notifier_block *me, unsigned long what,
 	struct cflayer *layer, *link_support;
 	int head_room = 0;
 	struct caif_device_entry_list *caifdevs;
+	int res;
 
 	cfg = get_cfcnfg(dev_net(dev));
 	caifdevs = caif_device_list(dev_net(dev));
@@ -390,8 +391,10 @@ static int caif_device_notify(struct notifier_block *me, unsigned long what,
 				break;
 			}
 		}
-		caif_enroll_dev(dev, caifdev, link_support, head_room,
+		res = caif_enroll_dev(dev, caifdev, link_support, head_room,
 				&layer, NULL);
+		if (res)
+			cfserl_release(link_support);
 		caifdev->flowctrl = dev_flowctrl;
 		break;
 

commit 758f725c392ec073f9f1cfbe34323ca1372afbf8
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Thu Jun 3 19:38:51 2021 +0300

    net: caif: add proper error handling
    
    commit a2805dca5107d5603f4bbc027e81e20d93476e96 upstream.
    
    caif_enroll_dev() can fail in some cases. Ingnoring
    these cases can lead to memory leak due to not assigning
    link_support pointer to anywhere.
    
    Fixes: 7c18d2205ea7 ("caif: Restructure how link caif link layer enroll")
    Cc: stable@vger.kernel.org
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/net/caif/caif_dev.h b/include/net/caif/caif_dev.h
index 028b754ae9b1..0baf2e21a533 100644
--- a/include/net/caif/caif_dev.h
+++ b/include/net/caif/caif_dev.h
@@ -119,7 +119,7 @@ void caif_free_client(struct cflayer *adap_layer);
  * The link_support layer is used to add any Link Layer specific
  * framing.
  */
-void caif_enroll_dev(struct net_device *dev, struct caif_dev_common *caifdev,
+int caif_enroll_dev(struct net_device *dev, struct caif_dev_common *caifdev,
 			struct cflayer *link_support, int head_room,
 			struct cflayer **layer, int (**rcv_func)(
 				struct sk_buff *, struct net_device *,
diff --git a/include/net/caif/cfcnfg.h b/include/net/caif/cfcnfg.h
index 70bfd017581f..219094ace893 100644
--- a/include/net/caif/cfcnfg.h
+++ b/include/net/caif/cfcnfg.h
@@ -62,7 +62,7 @@ void cfcnfg_remove(struct cfcnfg *cfg);
  * @fcs:	Specify if checksum is used in CAIF Framing Layer.
  * @head_room:	Head space needed by link specific protocol.
  */
-void
+int
 cfcnfg_add_phy_layer(struct cfcnfg *cnfg,
 		     struct net_device *dev, struct cflayer *phy_layer,
 		     enum cfcnfg_phy_preference pref,
diff --git a/net/caif/caif_dev.c b/net/caif/caif_dev.c
index 711d7156efd8..32452796b90d 100644
--- a/net/caif/caif_dev.c
+++ b/net/caif/caif_dev.c
@@ -303,7 +303,7 @@ static void dev_flowctrl(struct net_device *dev, int on)
 	caifd_put(caifd);
 }
 
-void caif_enroll_dev(struct net_device *dev, struct caif_dev_common *caifdev,
+int caif_enroll_dev(struct net_device *dev, struct caif_dev_common *caifdev,
 		     struct cflayer *link_support, int head_room,
 		     struct cflayer **layer,
 		     int (**rcv_func)(struct sk_buff *, struct net_device *,
@@ -314,11 +314,12 @@ void caif_enroll_dev(struct net_device *dev, struct caif_dev_common *caifdev,
 	enum cfcnfg_phy_preference pref;
 	struct cfcnfg *cfg = get_cfcnfg(dev_net(dev));
 	struct caif_device_entry_list *caifdevs;
+	int res;
 
 	caifdevs = caif_device_list(dev_net(dev));
 	caifd = caif_device_alloc(dev);
 	if (!caifd)
-		return;
+		return -ENOMEM;
 	*layer = &caifd->layer;
 	spin_lock_init(&caifd->flow_lock);
 
@@ -339,7 +340,7 @@ void caif_enroll_dev(struct net_device *dev, struct caif_dev_common *caifdev,
 	strlcpy(caifd->layer.name, dev->name,
 		sizeof(caifd->layer.name));
 	caifd->layer.transmit = transmit;
-	cfcnfg_add_phy_layer(cfg,
+	res = cfcnfg_add_phy_layer(cfg,
 				dev,
 				&caifd->layer,
 				pref,
@@ -349,6 +350,7 @@ void caif_enroll_dev(struct net_device *dev, struct caif_dev_common *caifdev,
 	mutex_unlock(&caifdevs->lock);
 	if (rcv_func)
 		*rcv_func = receive;
+	return res;
 }
 EXPORT_SYMBOL(caif_enroll_dev);
 
diff --git a/net/caif/cfcnfg.c b/net/caif/cfcnfg.c
index 8f00bea093b9..b456b79abd3b 100644
--- a/net/caif/cfcnfg.c
+++ b/net/caif/cfcnfg.c
@@ -450,7 +450,7 @@ cfcnfg_linkup_rsp(struct cflayer *layer, u8 channel_id, enum cfctrl_srv serv,
 	rcu_read_unlock();
 }
 
-void
+int
 cfcnfg_add_phy_layer(struct cfcnfg *cnfg,
 		     struct net_device *dev, struct cflayer *phy_layer,
 		     enum cfcnfg_phy_preference pref,
@@ -459,7 +459,7 @@ cfcnfg_add_phy_layer(struct cfcnfg *cnfg,
 {
 	struct cflayer *frml;
 	struct cfcnfg_phyinfo *phyinfo = NULL;
-	int i;
+	int i, res = 0;
 	u8 phyid;
 
 	mutex_lock(&cnfg->lock);
@@ -473,12 +473,15 @@ cfcnfg_add_phy_layer(struct cfcnfg *cnfg,
 			goto got_phyid;
 	}
 	pr_warn("Too many CAIF Link Layers (max 6)\n");
+	res = -EEXIST;
 	goto out;
 
 got_phyid:
 	phyinfo = kzalloc(sizeof(struct cfcnfg_phyinfo), GFP_ATOMIC);
-	if (!phyinfo)
+	if (!phyinfo) {
+		res = -ENOMEM;
 		goto out_err;
+	}
 
 	phy_layer->id = phyid;
 	phyinfo->pref = pref;
@@ -492,8 +495,10 @@ cfcnfg_add_phy_layer(struct cfcnfg *cnfg,
 
 	frml = cffrml_create(phyid, fcs);
 
-	if (!frml)
+	if (!frml) {
+		res = -ENOMEM;
 		goto out_err;
+	}
 	phyinfo->frm_layer = frml;
 	layer_set_up(frml, cnfg->mux);
 
@@ -511,11 +516,12 @@ cfcnfg_add_phy_layer(struct cfcnfg *cnfg,
 	list_add_rcu(&phyinfo->node, &cnfg->phys);
 out:
 	mutex_unlock(&cnfg->lock);
-	return;
+	return res;
 
 out_err:
 	kfree(phyinfo);
 	mutex_unlock(&cnfg->lock);
+	return res;
 }
 EXPORT_SYMBOL(cfcnfg_add_phy_layer);
 

commit ef1461e1198e7ede8cea9b6cb437d5dbd17b5ac7
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Thu Jun 3 19:38:12 2021 +0300

    net: caif: added cfserl_release function
    
    commit bce130e7f392ddde8cfcb09927808ebd5f9c8669 upstream.
    
    Added cfserl_release() function.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/net/caif/cfserl.h b/include/net/caif/cfserl.h
index b5b020f3c72e..bc3fae07a25f 100644
--- a/include/net/caif/cfserl.h
+++ b/include/net/caif/cfserl.h
@@ -9,4 +9,5 @@
 #include <net/caif/caif_layer.h>
 
 struct cflayer *cfserl_create(int instance, bool use_stx);
+void cfserl_release(struct cflayer *layer);
 #endif
diff --git a/net/caif/cfserl.c b/net/caif/cfserl.c
index ce60f06d76de..af1e1e36dc90 100644
--- a/net/caif/cfserl.c
+++ b/net/caif/cfserl.c
@@ -31,6 +31,11 @@ static int cfserl_transmit(struct cflayer *layr, struct cfpkt *pkt);
 static void cfserl_ctrlcmd(struct cflayer *layr, enum caif_ctrlcmd ctrl,
 			   int phyid);
 
+void cfserl_release(struct cflayer *layer)
+{
+	kfree(layer);
+}
+
 struct cflayer *cfserl_create(int instance, bool use_stx)
 {
 	struct cfserl *this = kzalloc(sizeof(struct cfserl), GFP_ATOMIC);

commit 2b9e9c2ed0f1910b5201c5d37b355b60201df415
Author: Lin Ma <linma@zju.edu.cn>
Date:   Sun May 30 21:37:43 2021 +0800

    Bluetooth: use correct lock to prevent UAF of hdev object
    
    commit e305509e678b3a4af2b3cfd410f409f7cdaabb52 upstream.
    
    The hci_sock_dev_event() function will cleanup the hdev object for
    sockets even if this object may still be in used within the
    hci_sock_bound_ioctl() function, result in UAF vulnerability.
    
    This patch replace the BH context lock to serialize these affairs
    and prevent the race condition.
    
    Signed-off-by: Lin Ma <linma@zju.edu.cn>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c
index e506c51ff765..06156de24c50 100644
--- a/net/bluetooth/hci_sock.c
+++ b/net/bluetooth/hci_sock.c
@@ -755,7 +755,7 @@ void hci_sock_dev_event(struct hci_dev *hdev, int event)
 		/* Detach sockets from device */
 		read_lock(&hci_sk_list.lock);
 		sk_for_each(sk, &hci_sk_list.head) {
-			bh_lock_sock_nested(sk);
+			lock_sock(sk);
 			if (hci_pi(sk)->hdev == hdev) {
 				hci_pi(sk)->hdev = NULL;
 				sk->sk_err = EPIPE;
@@ -764,7 +764,7 @@ void hci_sock_dev_event(struct hci_dev *hdev, int event)
 
 				hci_dev_put(hdev);
 			}
-			bh_unlock_sock(sk);
+			release_sock(sk);
 		}
 		read_unlock(&hci_sk_list.lock);
 	}

commit 64700748e8a7af4883538c72ada57999d9a78e92
Author: Lin Ma <linma@zju.edu.cn>
Date:   Tue May 25 14:39:02 2021 +0200

    Bluetooth: fix the erroneous flush_work() order
    
    commit 6a137caec23aeb9e036cdfd8a46dd8a366460e5d upstream.
    
    In the cleanup routine for failed initialization of HCI device,
    the flush_work(&hdev->rx_work) need to be finished before the
    flush_work(&hdev->cmd_work). Otherwise, the hci_rx_work() can
    possibly invoke new cmd_work and cause a bug, like double free,
    in late processings.
    
    This was assigned CVE-2021-3564.
    
    This patch reorder the flush_work() to fix this bug.
    
    Cc: Marcel Holtmann <marcel@holtmann.org>
    Cc: Johan Hedberg <johan.hedberg@gmail.com>
    Cc: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
    Cc: "David S. Miller" <davem@davemloft.net>
    Cc: Jakub Kicinski <kuba@kernel.org>
    Cc: linux-bluetooth@vger.kernel.org
    Cc: netdev@vger.kernel.org
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Lin Ma <linma@zju.edu.cn>
    Signed-off-by: Hao Xiong <mart1n@zju.edu.cn>
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 04d6f50798c9..219cdbb476fb 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -1498,8 +1498,13 @@ static int hci_dev_do_open(struct hci_dev *hdev)
 	} else {
 		/* Init failed, cleanup */
 		flush_work(&hdev->tx_work);
-		flush_work(&hdev->cmd_work);
+
+		/* Since hci_rx_work() is possible to awake new cmd_work
+		 * it should be flushed first to avoid unexpected call of
+		 * hci_cmd_work()
+		 */
 		flush_work(&hdev->rx_work);
+		flush_work(&hdev->cmd_work);
 
 		skb_queue_purge(&hdev->cmd_q);
 		skb_queue_purge(&hdev->rx_q);

commit a13a42c573a496a05b528ddbe6ea32083f44e9f1
Author: Hoang Le <hoang.h.le@dektech.com.au>
Date:   Thu Apr 1 09:30:48 2021 +0700

    tipc: fix unique bearer names sanity check
    
    [ Upstream commit f20a46c3044c3f75232b3d0e2d09af9b25efaf45 ]
    
    When enabling a bearer by name, we don't sanity check its name with
    higher slot in bearer list. This may have the effect that the name
    of an already enabled bearer bypasses the check.
    
    To fix the above issue, we just perform an extra checking with all
    existing bearers.
    
    Fixes: cb30a63384bc9 ("tipc: refactor function tipc_enable_bearer()")
    Cc: stable@vger.kernel.org
    Acked-by: Jon Maloy <jmaloy@redhat.com>
    Signed-off-by: Hoang Le <hoang.h.le@dektech.com.au>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c
index 8ab17f0da026..e1006ed4d90a 100644
--- a/net/tipc/bearer.c
+++ b/net/tipc/bearer.c
@@ -243,6 +243,7 @@ static int tipc_enable_bearer(struct net *net, const char *name,
 	int bearer_id = 0;
 	int res = -EINVAL;
 	char *errstr = "";
+	u32 i;
 
 	if (!bearer_name_validate(name, &b_names)) {
 		errstr = "illegal name";
@@ -267,31 +268,38 @@ static int tipc_enable_bearer(struct net *net, const char *name,
 		prio = m->priority;
 
 	/* Check new bearer vs existing ones and find free bearer id if any */
-	while (bearer_id < MAX_BEARERS) {
-		b = rtnl_dereference(tn->bearer_list[bearer_id]);
-		if (!b)
-			break;
+	bearer_id = MAX_BEARERS;
+	i = MAX_BEARERS;
+	while (i-- != 0) {
+		b = rtnl_dereference(tn->bearer_list[i]);
+		if (!b) {
+			bearer_id = i;
+			continue;
+		}
 		if (!strcmp(name, b->name)) {
 			errstr = "already enabled";
 			NL_SET_ERR_MSG(extack, "Already enabled");
 			goto rejected;
 		}
-		bearer_id++;
-		if (b->priority != prio)
-			continue;
-		if (++with_this_prio <= 2)
-			continue;
-		pr_warn("Bearer <%s>: already 2 bearers with priority %u\n",
-			name, prio);
-		if (prio == TIPC_MIN_LINK_PRI) {
-			errstr = "cannot adjust to lower";
-			NL_SET_ERR_MSG(extack, "Cannot adjust to lower");
-			goto rejected;
+
+		if (b->priority == prio &&
+		    (++with_this_prio > 2)) {
+			pr_warn("Bearer <%s>: already 2 bearers with priority %u\n",
+				name, prio);
+
+			if (prio == TIPC_MIN_LINK_PRI) {
+				errstr = "cannot adjust to lower";
+				NL_SET_ERR_MSG(extack, "Cannot adjust to lower");
+				goto rejected;
+			}
+
+			pr_warn("Bearer <%s>: trying with adjusted priority\n",
+				name);
+			prio--;
+			bearer_id = MAX_BEARERS;
+			i = MAX_BEARERS;
+			with_this_prio = 1;
 		}
-		pr_warn("Bearer <%s>: trying with adjusted priority\n", name);
-		prio--;
-		bearer_id = 0;
-		with_this_prio = 1;
 	}
 
 	if (bearer_id >= MAX_BEARERS) {

commit 65281d6aeca781b024a3cc83df6b55b987877ae8
Author: Hoang Le <hoang.h.le@dektech.com.au>
Date:   Thu Mar 25 08:56:41 2021 +0700

    tipc: add extack messages for bearer/media failure
    
    [ Upstream commit b83e214b2e04204f1fc674574362061492c37245 ]
    
    Add extack error messages for -EINVAL errors when enabling bearer,
    getting/setting properties for a media/bearer
    
    Acked-by: Jon Maloy <jmaloy@redhat.com>
    Signed-off-by: Hoang Le <hoang.h.le@dektech.com.au>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c
index 2649a0a0d45e..8ab17f0da026 100644
--- a/net/tipc/bearer.c
+++ b/net/tipc/bearer.c
@@ -231,7 +231,8 @@ void tipc_bearer_remove_dest(struct net *net, u32 bearer_id, u32 dest)
  */
 static int tipc_enable_bearer(struct net *net, const char *name,
 			      u32 disc_domain, u32 prio,
-			      struct nlattr *attr[])
+			      struct nlattr *attr[],
+			      struct netlink_ext_ack *extack)
 {
 	struct tipc_net *tn = tipc_net(net);
 	struct tipc_bearer_names b_names;
@@ -245,17 +246,20 @@ static int tipc_enable_bearer(struct net *net, const char *name,
 
 	if (!bearer_name_validate(name, &b_names)) {
 		errstr = "illegal name";
+		NL_SET_ERR_MSG(extack, "Illegal name");
 		goto rejected;
 	}
 
 	if (prio > TIPC_MAX_LINK_PRI && prio != TIPC_MEDIA_LINK_PRI) {
 		errstr = "illegal priority";
+		NL_SET_ERR_MSG(extack, "Illegal priority");
 		goto rejected;
 	}
 
 	m = tipc_media_find(b_names.media_name);
 	if (!m) {
 		errstr = "media not registered";
+		NL_SET_ERR_MSG(extack, "Media not registered");
 		goto rejected;
 	}
 
@@ -269,6 +273,7 @@ static int tipc_enable_bearer(struct net *net, const char *name,
 			break;
 		if (!strcmp(name, b->name)) {
 			errstr = "already enabled";
+			NL_SET_ERR_MSG(extack, "Already enabled");
 			goto rejected;
 		}
 		bearer_id++;
@@ -280,6 +285,7 @@ static int tipc_enable_bearer(struct net *net, const char *name,
 			name, prio);
 		if (prio == TIPC_MIN_LINK_PRI) {
 			errstr = "cannot adjust to lower";
+			NL_SET_ERR_MSG(extack, "Cannot adjust to lower");
 			goto rejected;
 		}
 		pr_warn("Bearer <%s>: trying with adjusted priority\n", name);
@@ -290,6 +296,7 @@ static int tipc_enable_bearer(struct net *net, const char *name,
 
 	if (bearer_id >= MAX_BEARERS) {
 		errstr = "max 3 bearers permitted";
+		NL_SET_ERR_MSG(extack, "Max 3 bearers permitted");
 		goto rejected;
 	}
 
@@ -303,6 +310,7 @@ static int tipc_enable_bearer(struct net *net, const char *name,
 	if (res) {
 		kfree(b);
 		errstr = "failed to enable media";
+		NL_SET_ERR_MSG(extack, "Failed to enable media");
 		goto rejected;
 	}
 
@@ -318,6 +326,7 @@ static int tipc_enable_bearer(struct net *net, const char *name,
 	if (res) {
 		bearer_disable(net, b);
 		errstr = "failed to create discoverer";
+		NL_SET_ERR_MSG(extack, "Failed to create discoverer");
 		goto rejected;
 	}
 
@@ -795,6 +804,7 @@ int tipc_nl_bearer_get(struct sk_buff *skb, struct genl_info *info)
 	bearer = tipc_bearer_find(net, name);
 	if (!bearer) {
 		err = -EINVAL;
+		NL_SET_ERR_MSG(info->extack, "Bearer not found");
 		goto err_out;
 	}
 
@@ -834,8 +844,10 @@ int __tipc_nl_bearer_disable(struct sk_buff *skb, struct genl_info *info)
 	name = nla_data(attrs[TIPC_NLA_BEARER_NAME]);
 
 	bearer = tipc_bearer_find(net, name);
-	if (!bearer)
+	if (!bearer) {
+		NL_SET_ERR_MSG(info->extack, "Bearer not found");
 		return -EINVAL;
+	}
 
 	bearer_disable(net, bearer);
 
@@ -893,7 +905,8 @@ int __tipc_nl_bearer_enable(struct sk_buff *skb, struct genl_info *info)
 			prio = nla_get_u32(props[TIPC_NLA_PROP_PRIO]);
 	}
 
-	return tipc_enable_bearer(net, bearer, domain, prio, attrs);
+	return tipc_enable_bearer(net, bearer, domain, prio, attrs,
+				  info->extack);
 }
 
 int tipc_nl_bearer_enable(struct sk_buff *skb, struct genl_info *info)
@@ -932,6 +945,7 @@ int tipc_nl_bearer_add(struct sk_buff *skb, struct genl_info *info)
 	b = tipc_bearer_find(net, name);
 	if (!b) {
 		rtnl_unlock();
+		NL_SET_ERR_MSG(info->extack, "Bearer not found");
 		return -EINVAL;
 	}
 
@@ -972,8 +986,10 @@ int __tipc_nl_bearer_set(struct sk_buff *skb, struct genl_info *info)
 	name = nla_data(attrs[TIPC_NLA_BEARER_NAME]);
 
 	b = tipc_bearer_find(net, name);
-	if (!b)
+	if (!b) {
+		NL_SET_ERR_MSG(info->extack, "Bearer not found");
 		return -EINVAL;
+	}
 
 	if (attrs[TIPC_NLA_BEARER_PROP]) {
 		struct nlattr *props[TIPC_NLA_PROP_MAX + 1];
@@ -992,12 +1008,18 @@ int __tipc_nl_bearer_set(struct sk_buff *skb, struct genl_info *info)
 		if (props[TIPC_NLA_PROP_WIN])
 			b->window = nla_get_u32(props[TIPC_NLA_PROP_WIN]);
 		if (props[TIPC_NLA_PROP_MTU]) {
-			if (b->media->type_id != TIPC_MEDIA_TYPE_UDP)
+			if (b->media->type_id != TIPC_MEDIA_TYPE_UDP) {
+				NL_SET_ERR_MSG(info->extack,
+					       "MTU property is unsupported");
 				return -EINVAL;
+			}
 #ifdef CONFIG_TIPC_MEDIA_UDP
 			if (tipc_udp_mtu_bad(nla_get_u32
-					     (props[TIPC_NLA_PROP_MTU])))
+					     (props[TIPC_NLA_PROP_MTU]))) {
+				NL_SET_ERR_MSG(info->extack,
+					       "MTU value is out-of-range");
 				return -EINVAL;
+			}
 			b->mtu = nla_get_u32(props[TIPC_NLA_PROP_MTU]);
 			tipc_node_apply_property(net, b, TIPC_NLA_PROP_MTU);
 #endif
@@ -1125,6 +1147,7 @@ int tipc_nl_media_get(struct sk_buff *skb, struct genl_info *info)
 	rtnl_lock();
 	media = tipc_media_find(name);
 	if (!media) {
+		NL_SET_ERR_MSG(info->extack, "Media not found");
 		err = -EINVAL;
 		goto err_out;
 	}
@@ -1161,9 +1184,10 @@ int __tipc_nl_media_set(struct sk_buff *skb, struct genl_info *info)
 	name = nla_data(attrs[TIPC_NLA_MEDIA_NAME]);
 
 	m = tipc_media_find(name);
-	if (!m)
+	if (!m) {
+		NL_SET_ERR_MSG(info->extack, "Media not found");
 		return -EINVAL;
-
+	}
 	if (attrs[TIPC_NLA_MEDIA_PROP]) {
 		struct nlattr *props[TIPC_NLA_PROP_MAX + 1];
 
@@ -1179,12 +1203,18 @@ int __tipc_nl_media_set(struct sk_buff *skb, struct genl_info *info)
 		if (props[TIPC_NLA_PROP_WIN])
 			m->window = nla_get_u32(props[TIPC_NLA_PROP_WIN]);
 		if (props[TIPC_NLA_PROP_MTU]) {
-			if (m->type_id != TIPC_MEDIA_TYPE_UDP)
+			if (m->type_id != TIPC_MEDIA_TYPE_UDP) {
+				NL_SET_ERR_MSG(info->extack,
+					       "MTU property is unsupported");
 				return -EINVAL;
+			}
 #ifdef CONFIG_TIPC_MEDIA_UDP
 			if (tipc_udp_mtu_bad(nla_get_u32
-					     (props[TIPC_NLA_PROP_MTU])))
+					     (props[TIPC_NLA_PROP_MTU]))) {
+				NL_SET_ERR_MSG(info->extack,
+					       "MTU value is out-of-range");
 				return -EINVAL;
+			}
 			m->mtu = nla_get_u32(props[TIPC_NLA_PROP_MTU]);
 #endif
 		}

commit 9144f434bebd1eab8af91e2de17d30599a5e6525
Author: Magnus Karlsson <magnus.karlsson@intel.com>
Date:   Mon May 10 11:38:53 2021 +0200

    ixgbevf: add correct exception tracing for XDP
    
    [ Upstream commit faae81420d162551b6ef2d804aafc00f4cd68e0e ]
    
    Add missing exception tracing to XDP when a number of different
    errors can occur. The support was only partial. Several errors
    where not logged which would confuse the user quite a lot not
    knowing where and why the packets disappeared.
    
    Fixes: 21092e9ce8b1 ("ixgbevf: Add support for XDP_TX action")
    Reported-by: Jesper Dangaard Brouer <brouer@redhat.com>
    Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com>
    Tested-by: Vishakha Jambekar <vishakha.jambekar@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
index a10756f0b0d8..7f94b445595c 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
@@ -1071,11 +1071,14 @@ static struct sk_buff *ixgbevf_run_xdp(struct ixgbevf_adapter *adapter,
 	case XDP_TX:
 		xdp_ring = adapter->xdp_ring[rx_ring->queue_index];
 		result = ixgbevf_xmit_xdp_ring(xdp_ring, xdp);
+		if (result == IXGBEVF_XDP_CONSUMED)
+			goto out_failure;
 		break;
 	default:
 		bpf_warn_invalid_xdp_action(act);
 		/* fallthrough */
 	case XDP_ABORTED:
+out_failure:
 		trace_xdp_exception(rx_ring->netdev, xdp_prog, act);
 		/* fallthrough -- handle aborts by dropping packet */
 	case XDP_DROP:

commit 60d59c52235201446c01b131460399b041cfc221
Author: Wei Yongjun <weiyongjun1@huawei.com>
Date:   Wed May 19 14:16:14 2021 +0000

    ieee802154: fix error return code in ieee802154_llsec_getparams()
    
    [ Upstream commit 373e864cf52403b0974c2f23ca8faf9104234555 ]
    
    Fix to return negative error code -ENOBUFS from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: 3e9c156e2c21 ("ieee802154: add netlink interfaces for llsec")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
    Link: https://lore.kernel.org/r/20210519141614.3040055-1-weiyongjun1@huawei.com
    Signed-off-by: Stefan Schmidt <stefan@datenfreihafen.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ieee802154/nl-mac.c b/net/ieee802154/nl-mac.c
index c0930b9fe848..7531cb1665d2 100644
--- a/net/ieee802154/nl-mac.c
+++ b/net/ieee802154/nl-mac.c
@@ -688,8 +688,10 @@ int ieee802154_llsec_getparams(struct sk_buff *skb, struct genl_info *info)
 	    nla_put_u8(msg, IEEE802154_ATTR_LLSEC_SECLEVEL, params.out_level) ||
 	    nla_put_u32(msg, IEEE802154_ATTR_LLSEC_FRAME_COUNTER,
 			be32_to_cpu(params.frame_counter)) ||
-	    ieee802154_llsec_fill_key_id(msg, &params.out_key))
+	    ieee802154_llsec_fill_key_id(msg, &params.out_key)) {
+		rc = -ENOBUFS;
 		goto out_free;
+	}
 
 	dev_put(dev);
 

commit 813a23e0f130c6c4f1aaf84ad0c72b5b1234a409
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Sat May 8 14:25:17 2021 +0800

    ieee802154: fix error return code in ieee802154_add_iface()
    
    [ Upstream commit 79c6b8ed30e54b401c873dbad2511f2a1c525fd5 ]
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: be51da0f3e34 ("ieee802154: Stop using NLA_PUT*().")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Link: https://lore.kernel.org/r/20210508062517.2574-1-thunder.leizhen@huawei.com
    Signed-off-by: Stefan Schmidt <stefan@datenfreihafen.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ieee802154/nl-phy.c b/net/ieee802154/nl-phy.c
index b231e40f006a..ca1dd9ff07ab 100644
--- a/net/ieee802154/nl-phy.c
+++ b/net/ieee802154/nl-phy.c
@@ -249,8 +249,10 @@ int ieee802154_add_iface(struct sk_buff *skb, struct genl_info *info)
 	}
 
 	if (nla_put_string(msg, IEEE802154_ATTR_PHY_NAME, wpan_phy_name(phy)) ||
-	    nla_put_string(msg, IEEE802154_ATTR_DEV_NAME, dev->name))
+	    nla_put_string(msg, IEEE802154_ATTR_DEV_NAME, dev->name)) {
+		rc = -EMSGSIZE;
 		goto nla_put_failure;
+	}
 	dev_put(dev);
 
 	wpan_phy_put(phy);

commit 8aed10cd9497933ebe3fc0afe8d8ddc1af8b0d48
Author: Pablo Neira Ayuso <pablo@netfilter.org>
Date:   Fri May 28 13:45:16 2021 +0200

    netfilter: nfnetlink_cthelper: hit EBUSY on updates if size mismatches
    
    [ Upstream commit 8971ee8b087750a23f3cd4dc55bff2d0303fd267 ]
    
    The private helper data size cannot be updated. However, updates that
    contain NFCTH_PRIV_DATA_LEN might bogusly hit EBUSY even if the size is
    the same.
    
    Fixes: 12f7a505331e ("netfilter: add user-space connection tracking helper infrastructure")
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netfilter/nfnetlink_cthelper.c b/net/netfilter/nfnetlink_cthelper.c
index ddcb1b607474..c8b0f1122c44 100644
--- a/net/netfilter/nfnetlink_cthelper.c
+++ b/net/netfilter/nfnetlink_cthelper.c
@@ -381,10 +381,14 @@ static int
 nfnl_cthelper_update(const struct nlattr * const tb[],
 		     struct nf_conntrack_helper *helper)
 {
+	u32 size;
 	int ret;
 
-	if (tb[NFCTH_PRIV_DATA_LEN])
-		return -EBUSY;
+	if (tb[NFCTH_PRIV_DATA_LEN]) {
+		size = ntohl(nla_get_be32(tb[NFCTH_PRIV_DATA_LEN]));
+		if (size != helper->data_len)
+			return -EBUSY;
+	}
 
 	if (tb[NFCTH_POLICY]) {
 		ret = nfnl_cthelper_update_policy(helper, tb[NFCTH_POLICY]);

commit 85e8c3b43f47a009b0ef924924d5fc35de054d54
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Fri May 14 15:58:50 2021 +0200

    HID: i2c-hid: fix format string mismatch
    
    [ Upstream commit dc5f9f55502e13ba05731d5046a14620aa2ff456 ]
    
    clang doesn't like printing a 32-bit integer using %hX format string:
    
    drivers/hid/i2c-hid/i2c-hid-core.c:994:18: error: format specifies type 'unsigned short' but the argument has type '__u32' (aka 'unsigned int') [-Werror,-Wformat]
                     client->name, hid->vendor, hid->product);
                                   ^~~~~~~~~~~
    drivers/hid/i2c-hid/i2c-hid-core.c:994:31: error: format specifies type 'unsigned short' but the argument has type '__u32' (aka 'unsigned int') [-Werror,-Wformat]
                     client->name, hid->vendor, hid->product);
                                                ^~~~~~~~~~~~
    
    Use an explicit cast to truncate it to the low 16 bits instead.
    
    Fixes: 9ee3e06610fd ("HID: i2c-hid: override HID descriptors for certain devices")
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Reviewed-by: Nathan Chancellor <nathan@kernel.org>
    Signed-off-by: Jiri Kosina <jkosina@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hid/i2c-hid/i2c-hid-core.c b/drivers/hid/i2c-hid/i2c-hid-core.c
index 1f8d403d3db4..19f4b807a5d1 100644
--- a/drivers/hid/i2c-hid/i2c-hid-core.c
+++ b/drivers/hid/i2c-hid/i2c-hid-core.c
@@ -1160,8 +1160,8 @@ static int i2c_hid_probe(struct i2c_client *client,
 	hid->vendor = le16_to_cpu(ihid->hdesc.wVendorID);
 	hid->product = le16_to_cpu(ihid->hdesc.wProductID);
 
-	snprintf(hid->name, sizeof(hid->name), "%s %04hX:%04hX",
-		 client->name, hid->vendor, hid->product);
+	snprintf(hid->name, sizeof(hid->name), "%s %04X:%04X",
+		 client->name, (u16)hid->vendor, (u16)hid->product);
 	strlcpy(hid->phys, dev_name(&client->dev), sizeof(hid->phys));
 
 	ihid->quirks = i2c_hid_lookup_quirk(hid->vendor, hid->product);

commit 173da500cfcef27f315dd3d1d1e8a6d5b146b227
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Sat May 8 10:47:37 2021 +0800

    HID: pidff: fix error return code in hid_pidff_init()
    
    [ Upstream commit 3dd653c077efda8152f4dd395359617d577a54cd ]
    
    Fix to return a negative error code from the error handling
    case instead of 0, as done elsewhere in this function.
    
    Fixes: 224ee88fe395 ("Input: add force feedback driver for PID devices")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c
index 08174d341f4a..bc75f1efa0f4 100644
--- a/drivers/hid/usbhid/hid-pidff.c
+++ b/drivers/hid/usbhid/hid-pidff.c
@@ -1304,6 +1304,7 @@ int hid_pidff_init(struct hid_device *hid)
 
 	if (pidff->pool[PID_DEVICE_MANAGED_POOL].value &&
 	    pidff->pool[PID_DEVICE_MANAGED_POOL].value[0] == 0) {
+		error = -EPERM;
 		hid_notice(hid,
 			   "device does not support device managed pool\n");
 		goto fail;

commit 6895ac910b73f7f886bb292c0a87d6e4d6eb6801
Author: Julian Anastasov <ja@ssi.bg>
Date:   Mon May 24 22:54:57 2021 +0300

    ipvs: ignore IP_VS_SVC_F_HASHED flag when adding service
    
    [ Upstream commit 56e4ee82e850026d71223262c07df7d6af3bd872 ]
    
    syzbot reported memory leak [1] when adding service with
    HASHED flag. We should ignore this flag both from sockopt
    and netlink provided data, otherwise the service is not
    hashed and not visible while releasing resources.
    
    [1]
    BUG: memory leak
    unreferenced object 0xffff888115227800 (size 512):
      comm "syz-executor263", pid 8658, jiffies 4294951882 (age 12.560s)
      hex dump (first 32 bytes):
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<ffffffff83977188>] kmalloc include/linux/slab.h:556 [inline]
        [<ffffffff83977188>] kzalloc include/linux/slab.h:686 [inline]
        [<ffffffff83977188>] ip_vs_add_service+0x598/0x7c0 net/netfilter/ipvs/ip_vs_ctl.c:1343
        [<ffffffff8397d770>] do_ip_vs_set_ctl+0x810/0xa40 net/netfilter/ipvs/ip_vs_ctl.c:2570
        [<ffffffff838449a8>] nf_setsockopt+0x68/0xa0 net/netfilter/nf_sockopt.c:101
        [<ffffffff839ae4e9>] ip_setsockopt+0x259/0x1ff0 net/ipv4/ip_sockglue.c:1435
        [<ffffffff839fa03c>] raw_setsockopt+0x18c/0x1b0 net/ipv4/raw.c:857
        [<ffffffff83691f20>] __sys_setsockopt+0x1b0/0x360 net/socket.c:2117
        [<ffffffff836920f2>] __do_sys_setsockopt net/socket.c:2128 [inline]
        [<ffffffff836920f2>] __se_sys_setsockopt net/socket.c:2125 [inline]
        [<ffffffff836920f2>] __x64_sys_setsockopt+0x22/0x30 net/socket.c:2125
        [<ffffffff84350efa>] do_syscall_64+0x3a/0xb0 arch/x86/entry/common.c:47
        [<ffffffff84400068>] entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Reported-and-tested-by: syzbot+e562383183e4b1766930@syzkaller.appspotmail.com
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Julian Anastasov <ja@ssi.bg>
    Reviewed-by: Simon Horman <horms@verge.net.au>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c
index 3ad1de081e3c..6208fa09fe71 100644
--- a/net/netfilter/ipvs/ip_vs_ctl.c
+++ b/net/netfilter/ipvs/ip_vs_ctl.c
@@ -1269,7 +1269,7 @@ ip_vs_add_service(struct netns_ipvs *ipvs, struct ip_vs_service_user_kern *u,
 	ip_vs_addr_copy(svc->af, &svc->addr, &u->addr);
 	svc->port = u->port;
 	svc->fwmark = u->fwmark;
-	svc->flags = u->flags;
+	svc->flags = u->flags & ~IP_VS_SVC_F_HASHED;
 	svc->timeout = u->timeout * HZ;
 	svc->netmask = u->netmask;
 	svc->ipvs = ipvs;

commit 2bd07ebcb949b17a431aacd0e99fa4558c4a5600
Author: Max Gurtovoy <mgurtovoy@nvidia.com>
Date:   Tue May 18 22:21:31 2021 +0300

    vfio/platform: fix module_put call in error flow
    
    [ Upstream commit dc51ff91cf2d1e9a2d941da483602f71d4a51472 ]
    
    The ->parent_module is the one that use in try_module_get. It should
    also be the one the we use in module_put during vfio_platform_open().
    
    Fixes: 32a2d71c4e80 ("vfio: platform: introduce vfio-platform-base module")
    Signed-off-by: Max Gurtovoy <mgurtovoy@nvidia.com>
    Message-Id: <20210518192133.59195-1-mgurtovoy@nvidia.com>
    Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/vfio/platform/vfio_platform_common.c b/drivers/vfio/platform/vfio_platform_common.c
index 460760d0becf..c29fc6844f84 100644
--- a/drivers/vfio/platform/vfio_platform_common.c
+++ b/drivers/vfio/platform/vfio_platform_common.c
@@ -295,7 +295,7 @@ static int vfio_platform_open(void *device_data)
 	vfio_platform_regions_cleanup(vdev);
 err_reg:
 	mutex_unlock(&driver_lock);
-	module_put(THIS_MODULE);
+	module_put(vdev->parent_module);
 	return ret;
 }
 

commit f12bd9caafedebd8e468cc3ec1dcee1920d7a9d2
Author: Wei Yongjun <weiyongjun1@huawei.com>
Date:   Thu May 20 13:36:41 2021 +0000

    samples: vfio-mdev: fix error handing in mdpy_fb_probe()
    
    [ Upstream commit 752774ce7793a1f8baa55aae31f3b4caac49cbe4 ]
    
    Fix to return a negative error code from the framebuffer_alloc() error
    handling case instead of 0, also release regions in some error handing
    cases.
    
    Fixes: cacade1946a4 ("sample: vfio mdev display - guest driver")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
    Message-Id: <20210520133641.1421378-1-weiyongjun1@huawei.com>
    Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/samples/vfio-mdev/mdpy-fb.c b/samples/vfio-mdev/mdpy-fb.c
index 2719bb259653..a760e130bd0d 100644
--- a/samples/vfio-mdev/mdpy-fb.c
+++ b/samples/vfio-mdev/mdpy-fb.c
@@ -117,22 +117,27 @@ static int mdpy_fb_probe(struct pci_dev *pdev,
 	if (format != DRM_FORMAT_XRGB8888) {
 		pci_err(pdev, "format mismatch (0x%x != 0x%x)\n",
 			format, DRM_FORMAT_XRGB8888);
-		return -EINVAL;
+		ret = -EINVAL;
+		goto err_release_regions;
 	}
 	if (width < 100	 || width > 10000) {
 		pci_err(pdev, "width (%d) out of range\n", width);
-		return -EINVAL;
+		ret = -EINVAL;
+		goto err_release_regions;
 	}
 	if (height < 100 || height > 10000) {
 		pci_err(pdev, "height (%d) out of range\n", height);
-		return -EINVAL;
+		ret = -EINVAL;
+		goto err_release_regions;
 	}
 	pci_info(pdev, "mdpy found: %dx%d framebuffer\n",
 		 width, height);
 
 	info = framebuffer_alloc(sizeof(struct mdpy_fb_par), &pdev->dev);
-	if (!info)
+	if (!info) {
+		ret = -ENOMEM;
 		goto err_release_regions;
+	}
 	pci_set_drvdata(pdev, info);
 	par = info->par;
 

commit 2b2ca3ee36e4e40d98c01b41a5819243197d4609
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Sat May 15 12:08:56 2021 -0700

    vfio/pci: zap_vma_ptes() needs MMU
    
    [ Upstream commit 2a55ca37350171d9b43d561528f23d4130097255 ]
    
    zap_vma_ptes() is only available when CONFIG_MMU is set/enabled.
    Without CONFIG_MMU, vfio_pci.o has build errors, so make
    VFIO_PCI depend on MMU.
    
    riscv64-linux-ld: drivers/vfio/pci/vfio_pci.o: in function `vfio_pci_mmap_open':
    vfio_pci.c:(.text+0x1ec): undefined reference to `zap_vma_ptes'
    riscv64-linux-ld: drivers/vfio/pci/vfio_pci.o: in function `.L0 ':
    vfio_pci.c:(.text+0x165c): undefined reference to `zap_vma_ptes'
    
    Fixes: 11c4cd07ba11 ("vfio-pci: Fault mmaps to enable vma tracking")
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Reported-by: kernel test robot <lkp@intel.com>
    Cc: Alex Williamson <alex.williamson@redhat.com>
    Cc: Cornelia Huck <cohuck@redhat.com>
    Cc: kvm@vger.kernel.org
    Cc: Jason Gunthorpe <jgg@nvidia.com>
    Cc: Eric Auger <eric.auger@redhat.com>
    Message-Id: <20210515190856.2130-1-rdunlap@infradead.org>
    Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/vfio/pci/Kconfig b/drivers/vfio/pci/Kconfig
index 42dc1d3d71cf..fcbfd0aacebc 100644
--- a/drivers/vfio/pci/Kconfig
+++ b/drivers/vfio/pci/Kconfig
@@ -1,6 +1,7 @@
 config VFIO_PCI
 	tristate "VFIO support for PCI devices"
 	depends on VFIO && PCI && EVENTFD
+	depends on MMU
 	select VFIO_VIRQFD
 	select IRQ_BYPASS_MANAGER
 	help

commit c953aee0d8a162d249dedaa47111e95dde0461cd
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Sat May 15 10:04:58 2021 +0800

    vfio/pci: Fix error return code in vfio_ecap_init()
    
    [ Upstream commit d1ce2c79156d3baf0830990ab06d296477b93c26 ]
    
    The error code returned from vfio_ext_cap_len() is stored in 'len', not
    in 'ret'.
    
    Fixes: 89e1f7d4c66d ("vfio: Add PCI device driver")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Reviewed-by: Max Gurtovoy <mgurtovoy@nvidia.com>
    Message-Id: <20210515020458.6771-1-thunder.leizhen@huawei.com>
    Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/vfio/pci/vfio_pci_config.c b/drivers/vfio/pci/vfio_pci_config.c
index a1a26465d224..86e917f1cc21 100644
--- a/drivers/vfio/pci/vfio_pci_config.c
+++ b/drivers/vfio/pci/vfio_pci_config.c
@@ -1579,7 +1579,7 @@ static int vfio_ecap_init(struct vfio_pci_device *vdev)
 			if (len == 0xFF) {
 				len = vfio_ext_cap_len(vdev, ecap, epos);
 				if (len < 0)
-					return ret;
+					return len;
 			}
 		}
 

commit dd47a33e11fdd6c9d31570500e6ecc369ba1f08e
Author: Rasmus Villemoes <linux@rasmusvillemoes.dk>
Date:   Wed Apr 21 21:46:36 2021 +0200

    efi: cper: fix snprintf() use in cper_dimm_err_location()
    
    [ Upstream commit 942859d969de7f6f7f2659a79237a758b42782da ]
    
    snprintf() should be given the full buffer size, not one less. And it
    guarantees nul-termination, so doing it manually afterwards is
    pointless.
    
    It's even potentially harmful (though probably not in practice because
    CPER_REC_LEN is 256), due to the "return how much would have been
    written had the buffer been big enough" semantics. I.e., if the bank
    and/or device strings are long enough that the "DIMM location ..."
    output gets truncated, writing to msg[n] is a buffer overflow.
    
    Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk>
    Fixes: 3760cd20402d4 ("CPER: Adjust code flow of some functions")
    Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/firmware/efi/cper.c b/drivers/firmware/efi/cper.c
index 116989cf3d45..97da083afd32 100644
--- a/drivers/firmware/efi/cper.c
+++ b/drivers/firmware/efi/cper.c
@@ -275,8 +275,7 @@ static int cper_dimm_err_location(struct cper_mem_err_compact *mem, char *msg)
 	if (!msg || !(mem->validation_bits & CPER_MEM_VALID_MODULE_HANDLE))
 		return 0;
 
-	n = 0;
-	len = CPER_REC_LEN - 1;
+	len = CPER_REC_LEN;
 	dmi_memdev_name(mem->mem_dev_handle, &bank, &device);
 	if (bank && device)
 		n = snprintf(msg, len, "DIMM location: %s %s ", bank, device);
@@ -285,7 +284,6 @@ static int cper_dimm_err_location(struct cper_mem_err_compact *mem, char *msg)
 			     "DIMM location: not present. DMI handle: 0x%.4x ",
 			     mem->mem_dev_handle);
 
-	msg[n] = '\0';
 	return n;
 }
 

commit 5fdb418b14e41b33880b949db64b18f1f448916b
Author: Heiner Kallweit <hkallweit1@gmail.com>
Date:   Fri Apr 30 16:22:51 2021 +0200

    efi: Allow EFI_MEMORY_XP and EFI_MEMORY_RO both to be cleared
    
    [ Upstream commit 45add3cc99feaaf57d4b6f01d52d532c16a1caee ]
    
    UEFI spec 2.9, p.108, table 4-1 lists the scenario that both attributes
    are cleared with the description "No memory access protection is
    possible for Entry". So we can have valid entries where both attributes
    are cleared, so remove the check.
    
    Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
    Fixes: 10f0d2f577053 ("efi: Implement generic support for the Memory Attributes table")
    Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/firmware/efi/memattr.c b/drivers/firmware/efi/memattr.c
index aac972b056d9..e0889922cc6d 100644
--- a/drivers/firmware/efi/memattr.c
+++ b/drivers/firmware/efi/memattr.c
@@ -69,11 +69,6 @@ static bool entry_is_valid(const efi_memory_desc_t *in, efi_memory_desc_t *out)
 		return false;
 	}
 
-	if (!(in->attribute & (EFI_MEMORY_RO | EFI_MEMORY_XP))) {
-		pr_warn("Entry attributes invalid: RO and XP bits both cleared\n");
-		return false;
-	}
-
 	if (PAGE_SIZE > EFI_PAGE_SIZE &&
 	    (!PAGE_ALIGNED(in->phys_addr) ||
 	     !PAGE_ALIGNED(in->num_pages << EFI_PAGE_SHIFT))) {

commit 1e9cd487b04f6715c4f14ddd81c5740be852aff2
Author: Anant Thazhemadam <anant.thazhemadam@gmail.com>
Date:   Thu Jun 3 09:28:52 2021 -0700

    nl80211: validate key indexes for cfg80211_registered_device
    
    commit 2d9463083ce92636a1bdd3e30d1236e3e95d859e upstream
    
    syzbot discovered a bug in which an OOB access was being made because
    an unsuitable key_idx value was wrongly considered to be acceptable
    while deleting a key in nl80211_del_key().
    
    Since we don't know the cipher at the time of deletion, if
    cfg80211_validate_key_settings() were to be called directly in
    nl80211_del_key(), even valid keys would be wrongly determined invalid,
    and deletion wouldn't occur correctly.
    For this reason, a new function - cfg80211_valid_key_idx(), has been
    created, to determine if the key_idx value provided is valid or not.
    cfg80211_valid_key_idx() is directly called in 2 places -
    nl80211_del_key(), and cfg80211_validate_key_settings().
    
    Reported-by: syzbot+49d4cab497c2142ee170@syzkaller.appspotmail.com
    Tested-by: syzbot+49d4cab497c2142ee170@syzkaller.appspotmail.com
    Suggested-by: Johannes Berg <johannes@sipsolutions.net>
    Signed-off-by: Anant Thazhemadam <anant.thazhemadam@gmail.com>
    Link: https://lore.kernel.org/r/20201204215825.129879-1-anant.thazhemadam@gmail.com
    Cc: stable@vger.kernel.org
    [also disallow IGTK key IDs if no IGTK cipher is supported]
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Zubin Mithra <zsm@chromium.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/wireless/core.h b/net/wireless/core.h
index f5d58652108d..5f177dad2fa8 100644
--- a/net/wireless/core.h
+++ b/net/wireless/core.h
@@ -404,6 +404,8 @@ void cfg80211_sme_abandon_assoc(struct wireless_dev *wdev);
 
 /* internal helpers */
 bool cfg80211_supported_cipher_suite(struct wiphy *wiphy, u32 cipher);
+bool cfg80211_valid_key_idx(struct cfg80211_registered_device *rdev,
+			    int key_idx, bool pairwise);
 int cfg80211_validate_key_settings(struct cfg80211_registered_device *rdev,
 				   struct key_params *params, int key_idx,
 				   bool pairwise, const u8 *mac_addr);
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 5f0605275fa3..04c4fd376e1d 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -3624,9 +3624,6 @@ static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
 	if (err)
 		return err;
 
-	if (key.idx < 0)
-		return -EINVAL;
-
 	if (info->attrs[NL80211_ATTR_MAC])
 		mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
 
@@ -3642,6 +3639,10 @@ static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
 	    key.type != NL80211_KEYTYPE_GROUP)
 		return -EINVAL;
 
+	if (!cfg80211_valid_key_idx(rdev, key.idx,
+				    key.type == NL80211_KEYTYPE_PAIRWISE))
+		return -EINVAL;
+
 	if (!rdev->ops->del_key)
 		return -EOPNOTSUPP;
 
diff --git a/net/wireless/util.c b/net/wireless/util.c
index 6f9cff2ee795..c4536468dfbe 100644
--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -214,11 +214,48 @@ bool cfg80211_supported_cipher_suite(struct wiphy *wiphy, u32 cipher)
 	return false;
 }
 
+static bool
+cfg80211_igtk_cipher_supported(struct cfg80211_registered_device *rdev)
+{
+	struct wiphy *wiphy = &rdev->wiphy;
+	int i;
+
+	for (i = 0; i < wiphy->n_cipher_suites; i++) {
+		switch (wiphy->cipher_suites[i]) {
+		case WLAN_CIPHER_SUITE_AES_CMAC:
+		case WLAN_CIPHER_SUITE_BIP_CMAC_256:
+		case WLAN_CIPHER_SUITE_BIP_GMAC_128:
+		case WLAN_CIPHER_SUITE_BIP_GMAC_256:
+			return true;
+		}
+	}
+
+	return false;
+}
+
+bool cfg80211_valid_key_idx(struct cfg80211_registered_device *rdev,
+			    int key_idx, bool pairwise)
+{
+	int max_key_idx;
+
+	if (pairwise)
+		max_key_idx = 3;
+	else if (cfg80211_igtk_cipher_supported(rdev))
+		max_key_idx = 5;
+	else
+		max_key_idx = 3;
+
+	if (key_idx < 0 || key_idx > max_key_idx)
+		return false;
+
+	return true;
+}
+
 int cfg80211_validate_key_settings(struct cfg80211_registered_device *rdev,
 				   struct key_params *params, int key_idx,
 				   bool pairwise, const u8 *mac_addr)
 {
-	if (key_idx < 0 || key_idx > 5)
+	if (!cfg80211_valid_key_idx(rdev, key_idx, pairwise))
 		return -EINVAL;
 
 	if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))

commit 3f9186ee7a306d7f974e759b084245155e5e709a
Author: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Date:   Sat Jan 11 15:47:36 2020 -0600

    ALSA: usb: update old-style static const declaration
    
    [ Upstream commit ff40e0d41af19e36b43693fcb9241b4a6795bb44 ]
    
    GCC reports the following warning with W=1
    
    sound/usb/mixer_quirks.c: In function ?snd_microii_controls_create??
    sound/usb/mixer_quirks.c:1694:2: warning: ?static??is not at beginning
    of declaration [-Wold-style-declaration]
     1694 |  const static usb_mixer_elem_resume_func_t resume_funcs[] = {
          |  ^~~~~
    
    Move static to the beginning of declaration
    
    Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Link: https://lore.kernel.org/r/20200111214736.3002-3-pierre-louis.bossart@linux.intel.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
index 169679419b39..a74e07eff60c 100644
--- a/sound/usb/mixer_quirks.c
+++ b/sound/usb/mixer_quirks.c
@@ -1708,7 +1708,7 @@ static struct snd_kcontrol_new snd_microii_mixer_spdif[] = {
 static int snd_microii_controls_create(struct usb_mixer_interface *mixer)
 {
 	int err, i;
-	const static usb_mixer_elem_resume_func_t resume_funcs[] = {
+	static const usb_mixer_elem_resume_func_t resume_funcs[] = {
 		snd_microii_spdif_default_update,
 		NULL,
 		snd_microii_spdif_switch_update

commit 24ea2de9c342a09dc7c87cc428c09176af5ee063
Author: Grant Grundler <grundler@chromium.org>
Date:   Tue Jan 19 17:12:08 2021 -0800

    net: usb: cdc_ncm: don't spew notifications
    
    [ Upstream commit de658a195ee23ca6aaffe197d1d2ea040beea0a2 ]
    
    RTL8156 sends notifications about every 32ms.
    Only display/log notifications when something changes.
    
    This issue has been reported by others:
            https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1832472
            https://lkml.org/lkml/2020/8/27/1083
    
    ...
    [785962.779840] usb 1-1: new high-speed USB device number 5 using xhci_hcd
    [785962.929944] usb 1-1: New USB device found, idVendor=0bda, idProduct=8156, bcdDevice=30.00
    [785962.929949] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=6
    [785962.929952] usb 1-1: Product: USB 10/100/1G/2.5G LAN
    [785962.929954] usb 1-1: Manufacturer: Realtek
    [785962.929956] usb 1-1: SerialNumber: 000000001
    [785962.991755] usbcore: registered new interface driver cdc_ether
    [785963.017068] cdc_ncm 1-1:2.0: MAC-Address: 00:24:27:88:08:15
    [785963.017072] cdc_ncm 1-1:2.0: setting rx_max = 16384
    [785963.017169] cdc_ncm 1-1:2.0: setting tx_max = 16384
    [785963.017682] cdc_ncm 1-1:2.0 usb0: register 'cdc_ncm' at usb-0000:00:14.0-1, CDC NCM, 00:24:27:88:08:15
    [785963.019211] usbcore: registered new interface driver cdc_ncm
    [785963.023856] usbcore: registered new interface driver cdc_wdm
    [785963.025461] usbcore: registered new interface driver cdc_mbim
    [785963.038824] cdc_ncm 1-1:2.0 enx002427880815: renamed from usb0
    [785963.089586] cdc_ncm 1-1:2.0 enx002427880815: network connection: disconnected
    [785963.121673] cdc_ncm 1-1:2.0 enx002427880815: network connection: disconnected
    [785963.153682] cdc_ncm 1-1:2.0 enx002427880815: network connection: disconnected
    ...
    
    This is about 2KB per second and will overwrite all contents of a 1MB
    dmesg buffer in under 10 minutes rendering them useless for debugging
    many kernel problems.
    
    This is also an extra 180 MB/day in /var/logs (or 1GB per week) rendering
    the majority of those logs useless too.
    
    When the link is up (expected state), spew amount is >2x higher:
    ...
    [786139.600992] cdc_ncm 2-1:2.0 enx002427880815: network connection: connected
    [786139.632997] cdc_ncm 2-1:2.0 enx002427880815: 2500 mbit/s downlink 2500 mbit/s uplink
    [786139.665097] cdc_ncm 2-1:2.0 enx002427880815: network connection: connected
    [786139.697100] cdc_ncm 2-1:2.0 enx002427880815: 2500 mbit/s downlink 2500 mbit/s uplink
    [786139.729094] cdc_ncm 2-1:2.0 enx002427880815: network connection: connected
    [786139.761108] cdc_ncm 2-1:2.0 enx002427880815: 2500 mbit/s downlink 2500 mbit/s uplink
    ...
    
    Chrome OS cannot support RTL8156 until this is fixed.
    
    Signed-off-by: Grant Grundler <grundler@chromium.org>
    Reviewed-by: Hayes Wang <hayeswang@realtek.com>
    Link: https://lore.kernel.org/r/20210120011208.3768105-1-grundler@chromium.org
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c
index faca70c3647d..82ec00a7370d 100644
--- a/drivers/net/usb/cdc_ncm.c
+++ b/drivers/net/usb/cdc_ncm.c
@@ -1590,6 +1590,15 @@ cdc_ncm_speed_change(struct usbnet *dev,
 	uint32_t rx_speed = le32_to_cpu(data->DLBitRRate);
 	uint32_t tx_speed = le32_to_cpu(data->ULBitRate);
 
+	/* if the speed hasn't changed, don't report it.
+	 * RTL8156 shipped before 2021 sends notification about every 32ms.
+	 */
+	if (dev->rx_speed == rx_speed && dev->tx_speed == tx_speed)
+		return;
+
+	dev->rx_speed = rx_speed;
+	dev->tx_speed = tx_speed;
+
 	/*
 	 * Currently the USB-NET API does not support reporting the actual
 	 * device speed. Do print it instead.
@@ -1633,7 +1642,8 @@ static void cdc_ncm_status(struct usbnet *dev, struct urb *urb)
 		 * USB_CDC_NOTIFY_NETWORK_CONNECTION notification shall be
 		 * sent by device after USB_CDC_NOTIFY_SPEED_CHANGE.
 		 */
-		usbnet_link_change(dev, !!event->wValue, 0);
+		if (netif_carrier_ok(dev->net) != !!event->wValue)
+			usbnet_link_change(dev, !!event->wValue, 0);
 		break;
 
 	case USB_CDC_NOTIFY_SPEED_CHANGE:
diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h
index e2ec3582e549..452ca06ed253 100644
--- a/include/linux/usb/usbnet.h
+++ b/include/linux/usb/usbnet.h
@@ -83,6 +83,8 @@ struct usbnet {
 #		define EVENT_LINK_CHANGE	11
 #		define EVENT_SET_RX_MODE	12
 #		define EVENT_NO_IP_ALIGN	13
+	u32			rx_speed;	/* in bps - NOT Mbps */
+	u32			tx_speed;	/* in bps - NOT Mbps */
 };
 
 static inline struct usb_driver *driver_of(struct usb_interface *intf)

commit d18b87491a71385892caf5392d9d2644fa36535e
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Sat Mar 13 17:37:48 2021 +0800

    media: i2c: add vcm driver dw9718
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: If6d1e14a20280a88718a72c244672fd42c8b2738

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index df20137abd29..ccc865a742ca 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -348,6 +348,16 @@ config VIDEO_DW9714
 	  capability. This is designed for linear control of
 	  voice coil motors, controlled via I2C serial interface.
 
+config VIDEO_DW9718
+	tristate "DW9718 lens voice coil support"
+	depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
+	depends on VIDEO_V4L2_SUBDEV_API
+	---help---
+	  This is a driver for the DW9718 camera lens voice coil.
+	  DW9718 is a 10 bit DAC with 100mA output current sink
+	  capability. This is designed for linear control of
+	  voice coil motors, controlled via I2C serial interface.
+
 config VIDEO_DW9807_VCM
 	tristate "DW9807 lens voice coil support"
 	depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index 532f117536bc..20a8c6fd8ac5 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -28,6 +28,7 @@ obj-$(CONFIG_VIDEO_SAA6752HS) += saa6752hs.o
 obj-$(CONFIG_VIDEO_AD5820)  += ad5820.o
 obj-$(CONFIG_VIDEO_AK7375)  += ak7375.o
 obj-$(CONFIG_VIDEO_DW9714)  += dw9714.o
+obj-$(CONFIG_VIDEO_DW9718)  += dw9718.o
 obj-$(CONFIG_VIDEO_DW9807_VCM)  += dw9807-vcm.o
 obj-$(CONFIG_VIDEO_FP5510)	+= fp5510.o
 obj-$(CONFIG_VIDEO_GT9760S)	+= gt9760s.o
diff --git a/drivers/media/i2c/dw9718.c b/drivers/media/i2c/dw9718.c
new file mode 100644
index 000000000000..363f5151f2c8
--- /dev/null
+++ b/drivers/media/i2c/dw9718.c
@@ -0,0 +1,649 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * dw9718 vcm driver
+ *
+ * Copyright (C) 2019 Fuzhou Rockchip Electronics Co., Ltd.
+ */
+
+#include <linux/delay.h>
+#include <linux/i2c.h>
+#include <linux/module.h>
+#include <linux/pm_runtime.h>
+#include <linux/rk-camera-module.h>
+#include <linux/version.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <linux/rk_vcm_head.h>
+
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x0)
+#define DW9718_NAME			"dw9718"
+
+#define DW9718T_PD_REG 0X00
+#define DW9718T_CONTROL 0X01
+#define DW9718T_DATAM_REG 0X02
+#define DW9718T_DATAL_REG 0X03
+#define DW9718T_SW_REG 0X04
+#define DW9718T_SACT_REG 0X05
+#define DW9718T_FLAG_REG 0X10
+
+#define DW9718_MAX_CURRENT		100U
+#define DW9718_MAX_REG			1023U
+
+#define DW9718_DEFAULT_START_CURRENT	0
+#define DW9718_DEFAULT_RATED_CURRENT	100
+#define DW9718_DEFAULT_STEP_MODE	0xd
+#define REG_NULL			0xFF
+
+#define OF_CAMERA_VCMDRV_CONTROL_MODE     "rockchip,vcm-control-mode"
+#define OF_CAMERA_VCMDRV_SACDIV_MODE      "rockchip,vcm-sacdiv-mode"
+#define VCMDRV_DEFAULT_CONTROL_MODE       4
+#define VCMDRV_DEFAULT_SACDIV_MODE        1
+
+/* dw9718 device structure */
+struct dw9718_device {
+	struct v4l2_ctrl_handler ctrls_vcm;
+	struct v4l2_subdev sd;
+	struct v4l2_device vdev;
+	u16 current_val;
+
+	unsigned short current_related_pos;
+	unsigned short current_lens_pos;
+	unsigned int start_current;
+	unsigned int rated_current;
+	unsigned int step;
+	unsigned int step_mode;
+	unsigned int control_mode;
+	unsigned int sacdiv_mode;
+	unsigned long mv_time_per_pos;
+
+	struct timeval start_move_tv;
+	struct timeval end_move_tv;
+	unsigned long move_us;
+
+	u32 module_index;
+	const char *module_facing;
+};
+
+static inline struct dw9718_device *to_dw9718_vcm(struct v4l2_ctrl *ctrl)
+{
+	return container_of(ctrl->handler, struct dw9718_device, ctrls_vcm);
+}
+
+static inline struct dw9718_device *sd_to_dw9718_vcm(struct v4l2_subdev *subdev)
+{
+	return container_of(subdev, struct dw9718_device, sd);
+}
+
+static int dw9718_read_reg(struct i2c_client *client,
+	u8 addr, u32 *val, u8 len)
+{
+	struct i2c_msg msgs[2];
+	u8 *data_be_p;
+	__be32 data_be = 0;
+	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 = 1;
+	msgs[0].buf = (u8 *)&addr;
+
+	/* 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 dw9718_write_reg(struct i2c_client *client,
+	u8 addr, u32 val, u8 len)
+{
+	u32 buf_i, val_i;
+	u8 buf[5];
+	u8 *val_p;
+	__be32 val_be;
+
+	if (len > 4)
+		return -EINVAL;
+
+	buf[0] = addr & 0xff;
+
+	val_be = cpu_to_be32(val);
+	val_p = (u8 *)&val_be;
+	buf_i = 1;
+	val_i = 4 - len;
+
+	while (val_i < 4)
+		buf[buf_i++] = val_p[val_i++];
+
+	if (i2c_master_send(client, buf, len + 1) != len + 1)
+		return -EIO;
+
+	return 0;
+}
+
+static int dw9718_get_pos(struct dw9718_device *dev_vcm,
+	unsigned int *cur_pos)
+{
+	struct i2c_client *client = v4l2_get_subdevdata(&dev_vcm->sd);
+	int ret;
+	u32 val;
+	unsigned int abs_step;
+
+	ret = dw9718_read_reg(client, DW9718T_DATAM_REG, &val, 2);
+	if (ret != 0)
+		goto err;
+
+	abs_step = val & 0x3ff;
+	if (abs_step <= dev_vcm->start_current)
+		abs_step = VCMDRV_MAX_LOG;
+	else if ((abs_step > dev_vcm->start_current) &&
+		 (abs_step <= dev_vcm->rated_current))
+		abs_step = (dev_vcm->rated_current - abs_step) / dev_vcm->step;
+	else
+		abs_step = 0;
+
+	*cur_pos = abs_step;
+	dev_dbg(&client->dev, "%s: get position %d\n", __func__, *cur_pos);
+	return 0;
+
+err:
+	dev_err(&client->dev,
+		"%s: failed with error %d\n", __func__, ret);
+	return ret;
+}
+
+static int dw9718_set_pos(struct dw9718_device *dev_vcm,
+	unsigned int dest_pos)
+{
+	int ret;
+	unsigned int position = 0;
+	struct i2c_client *client = v4l2_get_subdevdata(&dev_vcm->sd);
+
+	if (dest_pos >= VCMDRV_MAX_LOG)
+		position = dev_vcm->start_current;
+	else
+		position = dev_vcm->start_current +
+			   (dev_vcm->step * (VCMDRV_MAX_LOG - dest_pos));
+
+	if (position > DW9718_MAX_REG)
+		position = DW9718_MAX_REG;
+
+	dev_vcm->current_lens_pos = position;
+	dev_vcm->current_related_pos = dest_pos;
+	ret = dw9718_write_reg(client, DW9718T_DATAM_REG, position & 0x3ff, 2);
+	if (ret != 0)
+		goto err;
+
+	return ret;
+err:
+	dev_err(&client->dev,
+		"%s: failed with error %d\n", __func__, ret);
+	return ret;
+}
+
+static int dw9718_get_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct dw9718_device *dev_vcm = to_dw9718_vcm(ctrl);
+
+	if (ctrl->id == V4L2_CID_FOCUS_ABSOLUTE)
+		return dw9718_get_pos(dev_vcm, &ctrl->val);
+
+	return -EINVAL;
+}
+
+static int dw9718_set_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct dw9718_device *dev_vcm = to_dw9718_vcm(ctrl);
+	struct i2c_client *client = v4l2_get_subdevdata(&dev_vcm->sd);
+	unsigned int dest_pos = ctrl->val;
+	int move_pos;
+	long mv_us;
+	int ret = 0;
+
+	if (ctrl->id == V4L2_CID_FOCUS_ABSOLUTE) {
+		if (dest_pos > VCMDRV_MAX_LOG) {
+			dev_info(&client->dev,
+				"%s dest_pos is error. %d > %d\n",
+				__func__, dest_pos, VCMDRV_MAX_LOG);
+			return -EINVAL;
+		}
+		/* calculate move time */
+		move_pos = dev_vcm->current_related_pos - dest_pos;
+		if (move_pos < 0)
+			move_pos = -move_pos;
+
+		ret = dw9718_set_pos(dev_vcm, dest_pos);
+
+		if (dev_vcm->control_mode == 1)
+			dev_vcm->move_us = dev_vcm->mv_time_per_pos * move_pos;
+		else
+			dev_vcm->move_us = dev_vcm->mv_time_per_pos;
+		dev_dbg(&client->dev,
+			"dest_pos %d, move_us %ld\n",
+			dest_pos, dev_vcm->move_us);
+
+		dev_vcm->start_move_tv = ns_to_timeval(ktime_get_ns());
+		mv_us = dev_vcm->start_move_tv.tv_usec + dev_vcm->move_us;
+		if (mv_us >= 1000000) {
+			dev_vcm->end_move_tv.tv_sec =
+				dev_vcm->start_move_tv.tv_sec + 1;
+			dev_vcm->end_move_tv.tv_usec = mv_us - 1000000;
+		} else {
+			dev_vcm->end_move_tv.tv_sec =
+					dev_vcm->start_move_tv.tv_sec;
+			dev_vcm->end_move_tv.tv_usec = mv_us;
+		}
+	}
+
+	return ret;
+}
+
+static const struct v4l2_ctrl_ops dw9718_vcm_ctrl_ops = {
+	.g_volatile_ctrl = dw9718_get_ctrl,
+	.s_ctrl = dw9718_set_ctrl,
+};
+
+static int dw9718t_init(struct dw9718_device *dev)
+{
+	int ret = 0;
+	struct i2c_client *client = v4l2_get_subdevdata(&dev->sd);
+	u32 control_mode = 0;
+	u32 step_mode = 0;
+
+	/*There is need a sleep after power on for write i2c*/
+	usleep_range(10000, 11000);
+	dev_info(&client->dev, "enter vcm driver init\n");
+
+	ret = dw9718_write_reg(client, DW9718T_PD_REG, 0, 1);
+	if (ret < 0)
+		goto err;
+	/*There is need a sleep after out of standby status*/
+	msleep(100);
+	step_mode = (dev->sacdiv_mode << 6) | (dev->step_mode & 0x3f);
+	ret = dw9718_write_reg(client, DW9718T_SACT_REG, step_mode, 1);
+	if (ret < 0)
+		goto err;
+	control_mode = 0x31;
+	control_mode |= (dev->control_mode & 0x07) << 1;
+	ret = dw9718_write_reg(client, DW9718T_CONTROL, control_mode, 1);
+	if (ret < 0)
+		goto err;
+
+	return 0;
+err:
+	dev_err(&client->dev, "failed with error %d\n", ret);
+	return ret;
+}
+
+static int dw9718_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
+{
+	int rval;
+	struct dw9718_device *dev_vcm = sd_to_dw9718_vcm(sd);
+
+	rval = pm_runtime_get_sync(sd->dev);
+	if (rval < 0) {
+		pm_runtime_put_noidle(sd->dev);
+		return rval;
+	}
+
+	rval = dw9718t_init(dev_vcm);
+	if (rval < 0) {
+		pm_runtime_put_noidle(sd->dev);
+		return rval;
+	}
+	return 0;
+}
+
+static int dw9718_close(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
+{
+	pm_runtime_put(sd->dev);
+
+	return 0;
+}
+
+static const struct v4l2_subdev_internal_ops dw9718_int_ops = {
+	.open = dw9718_open,
+	.close = dw9718_close,
+};
+
+static long dw9718_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	int ret = 0;
+	struct rk_cam_vcm_tim *vcm_tim;
+	struct i2c_client *client = v4l2_get_subdevdata(sd);
+	struct dw9718_device *dw9718_dev = sd_to_dw9718_vcm(sd);
+
+	if (cmd == RK_VIDIOC_VCM_TIMEINFO) {
+		vcm_tim = (struct rk_cam_vcm_tim *)arg;
+
+		vcm_tim->vcm_start_t.tv_sec = dw9718_dev->start_move_tv.tv_sec;
+		vcm_tim->vcm_start_t.tv_usec =
+				dw9718_dev->start_move_tv.tv_usec;
+		vcm_tim->vcm_end_t.tv_sec = dw9718_dev->end_move_tv.tv_sec;
+		vcm_tim->vcm_end_t.tv_usec = dw9718_dev->end_move_tv.tv_usec;
+
+		dev_dbg(&client->dev, "dw9718_get_move_res 0x%lx, 0x%lx, 0x%lx, 0x%lx\n",
+			vcm_tim->vcm_start_t.tv_sec,
+			vcm_tim->vcm_start_t.tv_usec,
+			vcm_tim->vcm_end_t.tv_sec,
+			vcm_tim->vcm_end_t.tv_usec);
+	} else {
+		dev_err(&client->dev,
+			"cmd 0x%x not supported\n", cmd);
+		return -EINVAL;
+	}
+
+	return ret;
+}
+
+#ifdef CONFIG_COMPAT
+static long dw9718_compat_ioctl32(struct v4l2_subdev *sd,
+	unsigned int cmd, unsigned long arg)
+{
+	struct rk_cam_vcm_tim vcm_tim;
+	struct rk_cam_compat_vcm_tim compat_vcm_tim;
+	struct rk_cam_compat_vcm_tim __user *p32 = compat_ptr(arg);
+	struct i2c_client *client = v4l2_get_subdevdata(sd);
+	long ret;
+
+	if (cmd == RK_VIDIOC_COMPAT_VCM_TIMEINFO) {
+		ret = dw9718_ioctl(sd, RK_VIDIOC_VCM_TIMEINFO, &vcm_tim);
+		compat_vcm_tim.vcm_start_t.tv_sec = vcm_tim.vcm_start_t.tv_sec;
+		compat_vcm_tim.vcm_start_t.tv_usec =
+				vcm_tim.vcm_start_t.tv_usec;
+		compat_vcm_tim.vcm_end_t.tv_sec = vcm_tim.vcm_end_t.tv_sec;
+		compat_vcm_tim.vcm_end_t.tv_usec = vcm_tim.vcm_end_t.tv_usec;
+
+		put_user(compat_vcm_tim.vcm_start_t.tv_sec,
+			&p32->vcm_start_t.tv_sec);
+		put_user(compat_vcm_tim.vcm_start_t.tv_usec,
+			&p32->vcm_start_t.tv_usec);
+		put_user(compat_vcm_tim.vcm_end_t.tv_sec,
+			&p32->vcm_end_t.tv_sec);
+		put_user(compat_vcm_tim.vcm_end_t.tv_usec,
+			&p32->vcm_end_t.tv_usec);
+	} else {
+		dev_err(&client->dev,
+			"cmd 0x%x not supported\n", cmd);
+		return -EINVAL;
+	}
+
+	return ret;
+}
+#endif
+
+static const struct v4l2_subdev_core_ops dw9718_core_ops = {
+	.ioctl = dw9718_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = dw9718_compat_ioctl32
+#endif
+};
+
+static const struct v4l2_subdev_ops dw9718_ops = {
+	.core = &dw9718_core_ops,
+};
+
+static void dw9718_subdev_cleanup(struct dw9718_device *dw9718_dev)
+{
+	v4l2_device_unregister_subdev(&dw9718_dev->sd);
+	v4l2_device_unregister(&dw9718_dev->vdev);
+	v4l2_ctrl_handler_free(&dw9718_dev->ctrls_vcm);
+	media_entity_cleanup(&dw9718_dev->sd.entity);
+}
+
+static int dw9718_init_controls(struct dw9718_device *dev_vcm)
+{
+	struct v4l2_ctrl_handler *hdl = &dev_vcm->ctrls_vcm;
+	const struct v4l2_ctrl_ops *ops = &dw9718_vcm_ctrl_ops;
+
+	v4l2_ctrl_handler_init(hdl, 1);
+
+	v4l2_ctrl_new_std(hdl, ops, V4L2_CID_FOCUS_ABSOLUTE,
+			  0, VCMDRV_MAX_LOG, 1, VCMDRV_MAX_LOG);
+
+	if (hdl->error)
+		dev_err(dev_vcm->sd.dev, "%s fail error: 0x%x\n",
+			__func__, hdl->error);
+	dev_vcm->sd.ctrl_handler = hdl;
+	return hdl->error;
+}
+
+static int dw9718_probe(struct i2c_client *client,
+			const struct i2c_device_id *id)
+{
+	struct device_node *np = of_node_get(client->dev.of_node);
+	struct dw9718_device *dw9718_dev;
+	int ret;
+	int current_distance;
+	unsigned int start_current;
+	unsigned int rated_current;
+	unsigned int step_mode;
+	unsigned int control_mode;
+	unsigned int sacdiv_mode;
+	struct v4l2_subdev *sd;
+	char facing[2];
+
+	dev_info(&client->dev, "probing...\n");
+	if (of_property_read_u32(np,
+		OF_CAMERA_VCMDRV_START_CURRENT,
+		(unsigned int *)&start_current)) {
+		start_current = DW9718_DEFAULT_START_CURRENT;
+		dev_info(&client->dev,
+			"could not get module %s from dts!\n",
+			OF_CAMERA_VCMDRV_START_CURRENT);
+	}
+	if (of_property_read_u32(np,
+		OF_CAMERA_VCMDRV_RATED_CURRENT,
+		(unsigned int *)&rated_current)) {
+		rated_current = DW9718_DEFAULT_RATED_CURRENT;
+		dev_info(&client->dev,
+			"could not get module %s from dts!\n",
+			OF_CAMERA_VCMDRV_RATED_CURRENT);
+	}
+	if (of_property_read_u32(np,
+		OF_CAMERA_VCMDRV_STEP_MODE,
+		(unsigned int *)&step_mode)) {
+		step_mode = DW9718_DEFAULT_STEP_MODE;
+		dev_info(&client->dev,
+			"could not get module %s from dts!\n",
+			OF_CAMERA_VCMDRV_STEP_MODE);
+	}
+	if (of_property_read_u32(np,
+		OF_CAMERA_VCMDRV_CONTROL_MODE,
+		(unsigned int *)&control_mode)) {
+		control_mode = VCMDRV_DEFAULT_CONTROL_MODE;
+		dev_info(&client->dev,
+			"could not get module %s from dts!\n",
+			OF_CAMERA_VCMDRV_CONTROL_MODE);
+	}
+	if (of_property_read_u32(np,
+		OF_CAMERA_VCMDRV_SACDIV_MODE,
+		(unsigned int *)&sacdiv_mode)) {
+		sacdiv_mode = VCMDRV_DEFAULT_SACDIV_MODE;
+		dev_info(&client->dev,
+			"could not get module %s from dts!\n",
+			OF_CAMERA_VCMDRV_SACDIV_MODE);
+	}
+
+	dw9718_dev = devm_kzalloc(&client->dev, sizeof(*dw9718_dev),
+				  GFP_KERNEL);
+	if (dw9718_dev == NULL)
+		return -ENOMEM;
+
+	ret = of_property_read_u32(np, RKMODULE_CAMERA_MODULE_INDEX,
+				   &dw9718_dev->module_index);
+	ret |= of_property_read_string(np, RKMODULE_CAMERA_MODULE_FACING,
+				       &dw9718_dev->module_facing);
+	if (ret) {
+		dev_err(&client->dev,
+			"could not get module information!\n");
+		return -EINVAL;
+	}
+
+	v4l2_i2c_subdev_init(&dw9718_dev->sd, client, &dw9718_ops);
+	dw9718_dev->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
+	dw9718_dev->sd.internal_ops = &dw9718_int_ops;
+
+	ret = dw9718_init_controls(dw9718_dev);
+	if (ret)
+		goto err_cleanup;
+
+	ret = media_entity_pads_init(&dw9718_dev->sd.entity, 0, NULL);
+	if (ret < 0)
+		goto err_cleanup;
+
+	sd = &dw9718_dev->sd;
+	sd->entity.function = MEDIA_ENT_F_LENS;
+
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(dw9718_dev->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s",
+		 dw9718_dev->module_index, facing,
+		 DW9718_NAME, dev_name(sd->dev));
+	ret = v4l2_async_register_subdev(sd);
+	if (ret)
+		dev_err(&client->dev, "v4l2 async register subdev failed\n");
+
+	current_distance = rated_current - start_current;
+	current_distance = current_distance * DW9718_MAX_REG /
+						DW9718_MAX_CURRENT;
+	dw9718_dev->step = (current_distance + (VCMDRV_MAX_LOG - 1)) /
+						VCMDRV_MAX_LOG;
+	dw9718_dev->start_current = start_current * DW9718_MAX_REG /
+						DW9718_MAX_CURRENT;
+	dw9718_dev->rated_current = dw9718_dev->start_current +
+						VCMDRV_MAX_LOG *
+						dw9718_dev->step;
+	dw9718_dev->step_mode     = step_mode;
+	dw9718_dev->move_us       = 0;
+	dw9718_dev->current_related_pos = VCMDRV_MAX_LOG;
+	dw9718_dev->start_move_tv = ns_to_timeval(ktime_get_ns());
+	dw9718_dev->end_move_tv = ns_to_timeval(ktime_get_ns());
+
+	switch (control_mode) {
+	case 0:
+		dev_err(&client->dev, "control_mode is derect mode, not support\n");
+		return -EINVAL;
+	case 1:
+		dw9718_dev->mv_time_per_pos = (126 + step_mode * 2) * dw9718_dev->step;
+		dev_dbg(&client->dev, "control_mode is LSC mode\n");
+		break;
+	case 2:
+	case 3:
+	case 4:
+	case 5:
+	case 6:
+	case 7:
+		dw9718_dev->mv_time_per_pos = (6300 + step_mode * 100);
+		dev_dbg(&client->dev, "control_mode is LSC mode\n");
+		break;
+	default:
+		dev_err(&client->dev, "set unknown control_mode\n");
+		return -EINVAL;
+	}
+
+	switch (sacdiv_mode) {
+	case 0:
+		dw9718_dev->mv_time_per_pos *= 2;
+		dev_dbg(&client->dev, "sacdiv_mode is %d\n", sacdiv_mode);
+		break;
+	case 1:
+		dev_dbg(&client->dev, "sacdiv_mode is %d\n", sacdiv_mode);
+		break;
+	case 2:
+		dw9718_dev->mv_time_per_pos /= 2;
+		dev_dbg(&client->dev, "sacdiv_mode is %d\n", sacdiv_mode);
+		break;
+	case 3:
+		dw9718_dev->mv_time_per_pos /= 4;
+		dev_dbg(&client->dev, "sacdiv_mode is %d\n", sacdiv_mode);
+		break;
+	default:
+		dev_err(&client->dev, "set unknown control_mode\n");
+		return -EINVAL;
+	}
+
+	pm_runtime_set_active(&client->dev);
+	pm_runtime_enable(&client->dev);
+	pm_runtime_idle(&client->dev);
+
+	dev_info(&client->dev, "probing successful\n");
+
+	return 0;
+
+err_cleanup:
+	dw9718_subdev_cleanup(dw9718_dev);
+	dev_err(&client->dev, "Probe failed: %d\n", ret);
+	return ret;
+}
+
+static int dw9718_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct dw9718_device *dw9718_dev = sd_to_dw9718_vcm(sd);
+
+	pm_runtime_disable(&client->dev);
+	dw9718_subdev_cleanup(dw9718_dev);
+
+	return 0;
+}
+
+static int __maybe_unused dw9718_vcm_suspend(struct device *dev)
+{
+	return 0;
+}
+
+static int __maybe_unused dw9718_vcm_resume(struct device *dev)
+{
+	return 0;
+}
+
+static const struct i2c_device_id dw9718_id_table[] = {
+	{ DW9718_NAME, 0 },
+	{ { 0 } }
+};
+MODULE_DEVICE_TABLE(i2c, dw9718_id_table);
+
+static const struct of_device_id dw9718_of_table[] = {
+	{ .compatible = "dongwoon,dw9718" },
+	{ { 0 } }
+};
+MODULE_DEVICE_TABLE(of, dw9718_of_table);
+
+static const struct dev_pm_ops dw9718_pm_ops = {
+	SET_SYSTEM_SLEEP_PM_OPS(dw9718_vcm_suspend, dw9718_vcm_resume)
+	SET_RUNTIME_PM_OPS(dw9718_vcm_suspend, dw9718_vcm_resume, NULL)
+};
+
+static struct i2c_driver dw9718_i2c_driver = {
+	.driver = {
+		.name = DW9718_NAME,
+		.pm = &dw9718_pm_ops,
+		.of_match_table = dw9718_of_table,
+	},
+	.probe = &dw9718_probe,
+	.remove = &dw9718_remove,
+	.id_table = dw9718_id_table,
+};
+
+module_i2c_driver(dw9718_i2c_driver);
+
+MODULE_DESCRIPTION("DW9718 VCM driver");
+MODULE_LICENSE("GPL v2");

commit 291afbfb46a71cf12bfef977c4e7a21338a63106
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Sat Mar 13 17:39:29 2021 +0800

    ARM: dts: rv1126-rmsl-ddr3-v1: support dw9718
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: Ic9261a41305ce3a14bcded343828bd7e9f372f4a

diff --git a/arch/arm/boot/dts/rv1126-rmsl-ddr3-v1.dts b/arch/arm/boot/dts/rv1126-rmsl-ddr3-v1.dts
index f96cdfc3a81f..c22c21b324e5 100644
--- a/arch/arm/boot/dts/rv1126-rmsl-ddr3-v1.dts
+++ b/arch/arm/boot/dts/rv1126-rmsl-ddr3-v1.dts
@@ -154,6 +154,19 @@
 	status = "okay";
 	clock-frequency = <400000>;
 
+	dw9718: dw9718@0c {
+		compatible = "dongwoon,dw9718";
+		status = "okay";
+		reg = <0x0c>;
+		rockchip,vcm-start-current = <20>;
+		rockchip,vcm-rated-current = <54>;
+		rockchip,vcm-step-mode = <4>;
+		rockchip,vcm-sacdiv-mode = <2>;
+		rockchip,vcm-control-mode = <3>;
+		rockchip,camera-module-index = <1>;
+		rockchip,camera-module-facing = "front";
+	};
+
 	ov02k10: ov02k10@36 {
 		compatible = "ovti,ov02k10";
 		reg = <0x36>;
@@ -171,6 +184,7 @@
 		rockchip,camera-module-lens-name = "xuye";
 		// NO_HDR:0 HDR_X2:5 HDR_X3:6
 		rockchip,camera-hdr-mode = <0>;
+		lens-focus = <&dw9718>;
 		port {
 			ucam_out1: endpoint {
 				remote-endpoint = <&mipi_in_ucam1>;

commit 0c5b62a2da96313656efcf527fe5d94b77dc2081
Author: Tony Xu <tony.xu@rock-chips.com>
Date:   Tue Nov 3 09:43:54 2020 +0800

    ARM: dts: rv1126-rmsl-ddr3-v1: support psensor
    
    Signed-off-by: Tony Xu <tony.xu@rock-chips.com>
    Change-Id: I7ed60597fef8ae8ca960c7d85581d742ebe588b9

diff --git a/arch/arm/boot/dts/rv1126-rmsl-ddr3-v1.dts b/arch/arm/boot/dts/rv1126-rmsl-ddr3-v1.dts
index 5349d7bc1780..f96cdfc3a81f 100644
--- a/arch/arm/boot/dts/rv1126-rmsl-ddr3-v1.dts
+++ b/arch/arm/boot/dts/rv1126-rmsl-ddr3-v1.dts
@@ -200,6 +200,26 @@
 	};
 };
 
+&i2c2 {
+	status = "okay";
+	i2c-scl-rising-time-ns = <275>;
+	i2c-scl-falling-time-ns = <16>;
+	clock-frequency = <400000>;
+
+	ltr507als: ltr507@3a {
+		status = "okay";
+		compatible = "ltr507als";
+		reg = <0x3a>;
+		rockchip,pwr-gpio = <&gpio3 RK_PA0 GPIO_ACTIVE_HIGH>;
+		irq-gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&ltr507_irq_gpios>;
+
+		interrupt-parent = <&gpio0>;
+		interrupts = <16 IRQ_TYPE_LEVEL_HIGH>;
+	};
+};
+
 &spi0 {
 	status = "okay";
 	//assigned-clocks = <&cru SCLK_SPI0>;
@@ -277,4 +297,11 @@
 				<0 RK_PA0 1 &pcfg_pull_none>;
 		};
 	};
+	ltr507als_gpio {
+		ltr507_irq_gpios: ltr507-irq-gpios {
+			rockchip,pins =
+				<0 RK_PC0 0 &pcfg_pull_up>;
+		};
+	};
 };
+

commit 69eac309b27e021fdf243d4667c85210364e94e3
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Tue Jun 8 17:18:37 2021 +0800

    phy: phy-rockchip-snps-pcie3: Add sram_init_done check
    
    From test, sram_init_done can be used as a indicator to
    see if phy power and input clock work find. Let's yell out
    error is anything wrong with phy.
    
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: I5493e32ec5a9a6a8f6fc45e95618a657d9a21a67

diff --git a/drivers/phy/rockchip/phy-rockchip-snps-pcie3.c b/drivers/phy/rockchip/phy-rockchip-snps-pcie3.c
index 54cafe48071f..7dd320c24b1b 100644
--- a/drivers/phy/rockchip/phy-rockchip-snps-pcie3.c
+++ b/drivers/phy/rockchip/phy-rockchip-snps-pcie3.c
@@ -21,6 +21,8 @@
 #define GRF_PCIE30PHY_CON1 0x4
 #define GRF_PCIE30PHY_CON6 0x18
 #define GRF_PCIE30PHY_CON9 0x24
+#define GRF_PCIE30PHY_STATUS0 0x80
+#define SRAM_INIT_DONE(reg) (reg & BIT(14))
 
 struct rockchip_p3phy_priv {
 	void __iomem *mmio;
@@ -61,6 +63,7 @@ static int rochchip_p3phy_init(struct phy *phy)
 {
 	struct rockchip_p3phy_priv *priv = phy_get_drvdata(phy);
 	int ret;
+	u32 reg;
 
 	ret = clk_prepare_enable(priv->ref_clk_m);
 	if (ret < 0)
@@ -90,6 +93,16 @@ static int rochchip_p3phy_init(struct phy *phy)
 
 	reset_control_deassert(priv->p30phy);
 
+	ret = regmap_read_poll_timeout(priv->phy_grf,
+				       GRF_PCIE30PHY_STATUS0,
+				       reg, SRAM_INIT_DONE(reg),
+				       0, 500);
+	if (ret) {
+		pr_err("%s: lock failed 0x%x, check input refclk and power supply\n",
+		       __func__, reg);
+		goto err_pclk;
+	}
+
 	return 0;
 err_pclk:
 	clk_disable_unprepare(priv->ref_clk_n);

commit 54037be3bed51a49b557f226c4777e5564955200
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Wed May 26 10:35:53 2021 +0800

    media: i2c: sc2310 fixed hdr probabilistically fail to capture images and pm issue
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I93e764d8bb7e009fa00595f5320cb0ee54a34760

diff --git a/drivers/media/i2c/sc2310.c b/drivers/media/i2c/sc2310.c
index 8f09685b6fb5..536d96cd790b 100644
--- a/drivers/media/i2c/sc2310.c
+++ b/drivers/media/i2c/sc2310.c
@@ -369,7 +369,8 @@ static const struct regval sc2310_linear10bit_1920x1080_regs[] = {
  * Xclk 24Mhz hdr 2to1 STAGGER 1920*1080 30fps 760Mbps/lane
  */
 static __maybe_unused const struct regval sc2310_hdr10bit_1920x1080_regs[] = {
-	{0x0103, 0x01},
+	//{0x0103, 0x01},
+	{0x303f, 0x01},
 	{0x0100, 0x00},
 	{0x36e9, 0xa6},
 	{0x36f9, 0x85},
@@ -386,7 +387,6 @@ static __maybe_unused const struct regval sc2310_hdr10bit_1920x1080_regs[] = {
 	{0x3031, 0x0a},
 	{0x3001, 0xfe},
 	{0x4603, 0x00},
-	{0x303f, 0x01},
 	{0x3640, 0x00},
 	{0x3907, 0x01},
 	{0x3908, 0x01},
@@ -1180,8 +1180,12 @@ static long sc2310_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = sc2310_ioctl(sd, cmd, inf);
-		if (!ret)
-			ret = copy_to_user(up, inf, sizeof(*inf));
+		if (!ret) {
+			if (copy_to_user(up, inf, sizeof(*inf))) {
+				kfree(inf);
+				return -EFAULT;
+			}
+		}
 		kfree(inf);
 		break;
 	case RKMODULE_AWB_CFG:
@@ -1191,9 +1195,11 @@ static long sc2310_compat_ioctl32(struct v4l2_subdev *sd,
 			return ret;
 		}
 
-		ret = copy_from_user(cfg, up, sizeof(*cfg));
-		if (!ret)
-			ret = sc2310_ioctl(sd, cmd, cfg);
+		if (copy_from_user(cfg, up, sizeof(*cfg))) {
+			kfree(cfg);
+			return -EFAULT;
+		}
+		ret = sc2310_ioctl(sd, cmd, cfg);
 		kfree(cfg);
 		break;
 	case RKMODULE_GET_HDR_CFG:
@@ -1204,8 +1210,12 @@ static long sc2310_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = sc2310_ioctl(sd, cmd, hdr);
-		if (!ret)
-			ret = copy_to_user(up, hdr, sizeof(*hdr));
+		if (!ret) {
+			if (copy_to_user(up, hdr, sizeof(*hdr))) {
+				kfree(hdr);
+				return -EFAULT;
+			}
+		}
 		kfree(hdr);
 		break;
 	case RKMODULE_SET_HDR_CFG:
@@ -1215,9 +1225,11 @@ static long sc2310_compat_ioctl32(struct v4l2_subdev *sd,
 			return ret;
 		}
 
-		ret = copy_from_user(hdr, up, sizeof(*hdr));
-		if (!ret)
-			ret = sc2310_ioctl(sd, cmd, hdr);
+		if (copy_from_user(hdr, up, sizeof(*hdr))) {
+			kfree(hdr);
+			return -EFAULT;
+		}
+		ret = sc2310_ioctl(sd, cmd, hdr);
 		kfree(hdr);
 		break;
 	case PREISP_CMD_SET_HDRAE_EXP:
@@ -1227,20 +1239,22 @@ static long sc2310_compat_ioctl32(struct v4l2_subdev *sd,
 			return ret;
 		}
 
-		ret = copy_from_user(hdrae, up, sizeof(*hdrae));
-		if (!ret)
-			ret = sc2310_ioctl(sd, cmd, hdrae);
+		if (copy_from_user(hdrae, up, sizeof(*hdrae))) {
+			kfree(hdrae);
+			return -EFAULT;
+		}
+		ret = sc2310_ioctl(sd, cmd, hdrae);
 		kfree(hdrae);
 		break;
 	case RKMODULE_SET_CONVERSION_GAIN:
-		ret = copy_from_user(&cg, up, sizeof(cg));
-		if (!ret)
-			ret = sc2310_ioctl(sd, cmd, &cg);
+		if (copy_from_user(&cg, up, sizeof(cg)))
+			return -EFAULT;
+		ret = sc2310_ioctl(sd, cmd, &cg);
 		break;
 	case RKMODULE_SET_QUICK_STREAM:
-		ret = copy_from_user(&stream, up, sizeof(u32));
-		if (!ret)
-			ret = sc2310_ioctl(sd, cmd, &stream);
+		if (copy_from_user(&stream, up, sizeof(u32)))
+			return -EFAULT;
+		ret = sc2310_ioctl(sd, cmd, &stream);
 		break;
 	default:
 		ret = -ENOIOCTLCMD;
@@ -1346,6 +1360,10 @@ static int sc2310_s_power(struct v4l2_subdev *sd, int on)
 			SC2310_REG_VALUE_08BIT,
 			0x01);
 		usleep_range(100, 200);
+		ret |= sc2310_write_reg(sc2310->client,
+			0x303f,
+			SC2310_REG_VALUE_08BIT,
+			0x01);
 
 		sc2310->power_on = true;
 	} else {
@@ -1550,7 +1568,7 @@ static int sc2310_set_ctrl(struct v4l2_ctrl *ctrl)
 	switch (ctrl->id) {
 	case V4L2_CID_EXPOSURE:
 		if (sc2310->cur_mode->hdr_mode != NO_HDR)
-			return ret;
+			goto out_ctrl;
 		val = ctrl->val << 1;
 		ret = sc2310_write_reg(sc2310->client,
 					SC2310_REG_EXP_LONG_L,
@@ -1569,7 +1587,7 @@ static int sc2310_set_ctrl(struct v4l2_ctrl *ctrl)
 
 	case V4L2_CID_ANALOGUE_GAIN:
 		if (sc2310->cur_mode->hdr_mode != NO_HDR)
-			return ret;
+			goto out_ctrl;
 		sc2310_get_gain_reg(ctrl->val, &again, &again_fine, &dgain, &dgain_fine);
 		dev_dbg(&client->dev, "recv:%d set again 0x%x, again_fine 0x%x, set dgain 0x%x, dgain_fine 0x%x\n",
 			ctrl->val, again, again_fine, dgain, dgain_fine);
@@ -1631,6 +1649,7 @@ static int sc2310_set_ctrl(struct v4l2_ctrl *ctrl)
 		break;
 	}
 
+out_ctrl:
 	pm_runtime_put(&client->dev);
 
 	return ret;

commit c7659101be62b75309b7ee05a4d4b7e63dbce784
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Thu Jun 10 10:33:34 2021 +0800

    drm/rockchip: vop2: check plane state before check plane oetf
    
    We have some plane not registered to drm core(Such as cluster
    plane on some linux system), so they don't have pstate.
    
    And also we don't need to check plane state for oetf for
    a inactived plane(has no fb).
    
    Change-Id: I909b665397c3df530ff0f466e0d654dcbb3f1a40
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index e8d012631a9a..0dcd6bad19c4 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -4444,6 +4444,10 @@ static void vop2_setup_hdr10(struct vop2_video_port *vp, uint8_t win_phys_id)
 		pstate = plane->state;
 		vpstate = to_vop2_plane_state(pstate);
 
+		/* skip inactive plane */
+		if (!pstate || !pstate->fb)
+			continue;
+
 		if (vpstate->eotf != SMPTE_ST2084) {
 			have_sdr_layer = true;
 			break;

commit 762e61f66b6f298582ac2d62274f83208028ca66
Author: Yu Qiaowei <cerf.yu@rock-chips.com>
Date:   Mon Jun 7 16:32:29 2021 +0800

    video/rockchip: rga2: Fix the initialization of RGA2 version number
    
    Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
    Change-Id: Ib66a7c09def302ce7ad3c2bbff9be9946175c4c6

diff --git a/drivers/video/rockchip/rga2/rga2.h b/drivers/video/rockchip/rga2/rga2.h
index 9fe990a1ac9e..81ba59a3ba64 100644
--- a/drivers/video/rockchip/rga2/rga2.h
+++ b/drivers/video/rockchip/rga2/rga2.h
@@ -38,6 +38,7 @@
 #define RGA_BUF_GEM_TYPE_DMA       0x80
 #define RGA2_MAJOR_VERSION_MASK     (0xFF000000)
 #define RGA2_MINOR_VERSION_MASK     (0x00F00000)
+#define RGA2_SVN_VERSION_MASK       (0x000FFFFF)
 
 /* RGA2 process mode enum */
 enum
diff --git a/drivers/video/rockchip/rga2/rga2_drv.c b/drivers/video/rockchip/rga2/rga2_drv.c
index b635f23688ea..30c2f22b3d54 100644
--- a/drivers/video/rockchip/rga2/rga2_drv.c
+++ b/drivers/video/rockchip/rga2/rga2_drv.c
@@ -531,7 +531,7 @@ static inline u32 rga2_read(u32 r)
 static inline int rga2_init_version(void)
 {
 	struct rga2_drvdata_t *rga = rga2_drvdata;
-	u32 major_version, minor_version;
+	u32 major_version, minor_version, svn_version;
 	u32 reg_version;
 
 	if (!rga) {
@@ -556,13 +556,14 @@ static inline int rga2_init_version(void)
 
 	major_version = (reg_version & RGA2_MAJOR_VERSION_MASK) >> 24;
 	minor_version = (reg_version & RGA2_MINOR_VERSION_MASK) >> 20;
+	svn_version = (reg_version & RGA2_SVN_VERSION_MASK);
 
 	/*
 	 * some old rga ip has no rga version register, so force set to 2.00
 	 */
 	if (!major_version && !minor_version)
 		major_version = 2;
-	sprintf(rga->version, "%d.%02d", major_version, minor_version);
+	snprintf(rga->version, 10, "%x.%01x.%05x", major_version, minor_version, svn_version);
 
 	return 0;
 }
@@ -1697,6 +1698,8 @@ static long rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)
 	struct rga2_req req, req_first;
 	struct rga_req req_rga;
 	int ret = 0;
+	int major_version = 0, minor_version = 0;
+	char version[16] = {0};
 	rga2_session *session;
 
 	if (!rga) {
@@ -1849,12 +1852,25 @@ static long rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)
 			ret = rga2_get_result(session, arg);
 			break;
 		case RGA_GET_VERSION:
+			sscanf(rga->version, "%x.%x.%*x", &major_version, &minor_version);
+			snprintf(version, 5, "%x.%02x", major_version, minor_version);
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
+			ret = copy_to_user((void *)arg, version, sizeof(rga->version));
+#else
+			ret = copy_to_user((void *)arg, RGA2_VERSION, sizeof(RGA2_VERSION));
+#endif
+			if (ret != 0)
+				ret = -EFAULT;
+			break;
 		case RGA2_GET_VERSION:
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
-			ret = copy_to_user((void *)arg, rga->version, 16);
+			ret = copy_to_user((void *)arg, rga->version, sizeof(rga->version));
 #else
 			ret = copy_to_user((void *)arg, RGA2_VERSION, sizeof(RGA2_VERSION));
 #endif
+			if (ret != 0)
+				ret = -EFAULT;
 			break;
 		default:
 			ERR("unknown ioctl cmd!\n");
@@ -1993,10 +2009,12 @@ static long compat_rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)
 		case RGA_GET_VERSION:
 		case RGA2_GET_VERSION:
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
-				ret = copy_to_user((void *)arg, rga->version, 16);
+			ret = copy_to_user((void *)arg, rga->version, 16);
 #else
-				ret = copy_to_user((void *)arg, RGA2_VERSION, sizeof(RGA2_VERSION));
+			ret = copy_to_user((void *)arg, RGA2_VERSION, sizeof(RGA2_VERSION));
 #endif
+			if (ret != 0)
+				ret = -EFAULT;
 			break;
 		default:
 			ERR("unknown ioctl cmd!\n");

commit 0fcdebff4c145f69355994db7a716a5aedac9d51
Author: Shunqing Chen <csq@rock-chips.com>
Date:   Tue Jun 8 11:25:14 2021 +0800

    clk/rockchip/regmap: rk628: compatible with MCU mode
    
    Signed-off-by: Shunqing Chen <csq@rock-chips.com>
    Change-Id: I85f2c97ac23c585fc136eb5efa4e01fde979f883

diff --git a/drivers/clk/rockchip/regmap/clk-rk628.c b/drivers/clk/rockchip/regmap/clk-rk628.c
index 800136283548..f840164d203d 100644
--- a/drivers/clk/rockchip/regmap/clk-rk628.c
+++ b/drivers/clk/rockchip/regmap/clk-rk628.c
@@ -491,26 +491,15 @@ static const struct regmap_config rk628_cru_regmap_config = {
 	.rd_table = &rk628_cru_readable_table,
 };
 
-static int rk628_cru_probe(struct platform_device *pdev)
+static void rk628_cru_init(struct rk628_cru *cru)
 {
-	struct rk628 *rk628 = dev_get_drvdata(pdev->dev.parent);
-	struct device *dev = &pdev->dev;
-	struct rk628_cru *cru;
-	struct clk **clk_table;
-	unsigned int i;
-	int ret;
-
-	cru = devm_kzalloc(dev, sizeof(*cru), GFP_KERNEL);
-	if (!cru)
-		return -ENOMEM;
+	u32 val = 0;
+	u8 mcu_mode;
 
-	cru->regmap = devm_regmap_init_i2c(rk628->client,
-					   &rk628_cru_regmap_config);
-	if (IS_ERR(cru->regmap)) {
-		ret = PTR_ERR(cru->regmap);
-		dev_err(dev, "failed to allocate register map: %d\n", ret);
-		return ret;
-	}
+	regmap_read(cru->parent->grf, GRF_SYSTEM_STATUS0, &val);
+	mcu_mode = (val & I2C_ONLY_FLAG) ? 0 : 1;
+	if (mcu_mode)
+		return;
 
 	/* clock switch and first set gpll almost 99MHz */
 	regmap_write(cru->regmap, CRU_GPLL_CON0, 0xffff701d);
@@ -540,6 +529,34 @@ static int rk628_cru_probe(struct platform_device *pdev)
 	usleep_range(1000, 1100);
 	/* set pclk use cpll, and set pclk 99MHz */
 	regmap_write(cru->regmap, CRU_CLKSEL_CON00, 0xff000b);
+}
+
+static int rk628_cru_probe(struct platform_device *pdev)
+{
+	struct rk628 *rk628 = dev_get_drvdata(pdev->dev.parent);
+	struct device *dev = &pdev->dev;
+	struct rk628_cru *cru;
+	struct clk **clk_table;
+	unsigned int i;
+	int ret;
+
+	cru = devm_kzalloc(dev, sizeof(*cru), GFP_KERNEL);
+	if (!cru)
+		return -ENOMEM;
+
+	cru->dev = dev;
+	cru->parent = rk628;
+	platform_set_drvdata(pdev, cru);
+
+	cru->regmap = devm_regmap_init_i2c(rk628->client,
+					   &rk628_cru_regmap_config);
+	if (IS_ERR(cru->regmap)) {
+		ret = PTR_ERR(cru->regmap);
+		dev_err(dev, "failed to allocate register map: %d\n", ret);
+		return ret;
+	}
+
+	rk628_cru_init(cru);
 
 	clk_table = devm_kcalloc(dev, CGU_NR_CLKS, sizeof(struct clk *),
 				 GFP_KERNEL);
@@ -549,11 +566,8 @@ static int rk628_cru_probe(struct platform_device *pdev)
 	for (i = 0; i < CGU_NR_CLKS; i++)
 		clk_table[i] = ERR_PTR(-ENOENT);
 
-	cru->dev = dev;
-	cru->parent = rk628;
 	cru->clk_data.clks = clk_table;
 	cru->clk_data.clk_num = CGU_NR_CLKS;
-	platform_set_drvdata(pdev, cru);
 
 	rk628_clk_register_plls(cru);
 	rk628_clk_register_muxes(cru);
diff --git a/include/linux/mfd/rk628.h b/include/linux/mfd/rk628.h
index 37706444abc3..3e2a9d8f3a3a 100755
--- a/include/linux/mfd/rk628.h
+++ b/include/linux/mfd/rk628.h
@@ -184,6 +184,8 @@
 #define GRF_INTR1_STATUS		0x0118
 #define GRF_INTR1_RAW_STATUS		0x011c
 #define GRF_SYSTEM_STATUS0		0x0120
+/* 0: i2c mode and mcu mode; 1: i2c mode only */
+#define I2C_ONLY_FLAG			BIT(6)
 #define GRF_SYSTEM_STATUS3		0x012c
 #define GRF_SYSTEM_STATUS4		0x0130
 #define GRF_OS_REG0			0x0140

commit 7085d63854c6045968745e825de21755e4d8a703
Author: Wyon Bi <bivvy.bi@rock-chips.com>
Date:   Tue Jun 1 16:46:55 2021 +0800

    clk/rockchip/regmap: rk628: Add support for clk_testout
    
    Change-Id: I71f5ca1d4002d45438ff9d038ccc7eef5a28a857
    Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>

diff --git a/drivers/clk/rockchip/regmap/clk-rk628.c b/drivers/clk/rockchip/regmap/clk-rk628.c
index ca81214a07e5..800136283548 100644
--- a/drivers/clk/rockchip/regmap/clk-rk628.c
+++ b/drivers/clk/rockchip/regmap/clk-rk628.c
@@ -86,6 +86,14 @@ PNAME(mux_mclk_i2s_8ch_p) = { CNAME("clk_i2s_8ch_src"),
 			      CNAME("clk_i2s_8ch_frac"), CNAME("i2s_mclkin"),
 			      CNAME("xin_osc0_half") };
 PNAME(mux_i2s_mclkout_p) = { CNAME("mclk_i2s_8ch"), CNAME("xin_osc0_half") };
+PNAME(mux_clk_testout_p) = { CNAME("xin_osc0_func"), CNAME("xin_osc0_half"),
+			     CNAME("clk_gpll"), CNAME("clk_gpll_mux"),
+			     CNAME("clk_cpll"), CNAME("clk_gpll_mux"),
+			     CNAME("pclk_logic"), CNAME("sclk_vop"),
+			     CNAME("mclk_i2s_8ch"), CNAME("i2s_mclkout"),
+			     CNAME("dummy"), CNAME("clk_hdmirx_aud"),
+			     CNAME("clk_hdmirx_cec"), CNAME("clk_imodet"),
+			     CNAME("clk_txesc"), CNAME("clk_gpio_db0") };
 
 static const struct clk_pll_data rk628_clk_plls[] = {
 	RK628_PLL(CGU_CLK_CPLL, CNAME("clk_cpll"), CNAME("xin_osc0_func"),
@@ -248,6 +256,11 @@ static const struct clk_composite_data rk628_clk_composites[] = {
 		  CRU_CLKSEL_CON02, 0, 5,
 		  CRU_GATE_CON00, 12,
 		  0),
+	COMPOSITE(CGU_CLK_TESTOUT, CNAME("clk_testout"), mux_clk_testout_p,
+		  CRU_CLKSEL_CON06, 0, 4,
+		  CRU_CLKSEL_CON06, 8, 6,
+		  CRU_GATE_CON04, 7,
+		  0),
 };
 
 static void rk628_clk_add_lookup(struct rk628_cru *cru, struct clk *clk,
diff --git a/include/dt-bindings/clock/rk628-cgu.h b/include/dt-bindings/clock/rk628-cgu.h
index d1690907d208..dcd0db7d9951 100644
--- a/include/dt-bindings/clock/rk628-cgu.h
+++ b/include/dt-bindings/clock/rk628-cgu.h
@@ -45,6 +45,7 @@
 #define CGU_MCLK_I2S_8CH	35
 #define CGU_I2S_MCLKOUT		36
 #define CGU_BT1120DEC		37
-#define CGU_NR_CLKS		38
+#define CGU_CLK_TESTOUT		38
+#define CGU_NR_CLKS		39
 
 #endif

commit 99c097ed84151b7dfdbe7d15564083465d3aec32
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Tue Jun 8 10:25:54 2021 +0800

    drm/rockchip: ebc_dev: release version v2.00
    
    1.update auto/overlay mode
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: I816ce38a50b2446521021c5e83089ca9e7d29f20

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index 78d2e5313f28..80020268bc4a 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -23,26 +23,49 @@ __initcall_ebc_init6s:
 get_auto_image:
 .LFB2809:
 	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
-	.loc 1 330 0
+	.loc 1 356 0
 	.cfi_startproc
 .LVL0:
+	.loc 1 357 0
+	adrp	x5, .LANCHOR0
+	.loc 1 365 0
+	ldrb	w11, [x4, 32]
+.LVL1:
+	.loc 1 357 0
+	ldr	x16, [x5, #:lo12:.LANCHOR0]
+	.loc 1 369 0
+	add	x16, x16, 24
+	ldr	w18, [x16, 156]
+	.loc 1 375 0
+	ldp	w12, w17, [x16, 84]
+	.loc 1 377 0
+	str	wzr, [x4, 36]
+.LVL2:
+	.loc 1 383 0
+	cmp	w17, 0
+	ble	.L54
+	lsr	w12, w12, 3
+.LVL3:
+	.loc 1 356 0
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 331 0
-	adrp	x5, .LANCHOR0
-	.loc 1 330 0
+	sub	w15, w12, #1
+	.loc 1 383 0
+	mov	w14, 0
+.LVL4:
+	add	x15, x15, 1
+	.loc 1 356 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 331 0
-	ldr	x15, [x5, #:lo12:.LANCHOR0]
-	.loc 1 330 0
+	lsl	x30, x15, 3
+	lsl	x15, x15, 2
 	stp	x19, x20, [sp, 16]
-	.loc 1 343 0
-	add	x15, x15, 24
-	.loc 1 330 0
 	stp	x21, x22, [sp, 32]
+	.loc 1 395 0
+	mov	w13, 1
+	.loc 1 356 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 19, -48
 	.cfi_offset 20, -40
@@ -50,344 +73,327 @@ get_auto_image:
 	.cfi_offset 22, -24
 	.cfi_offset 23, -16
 	.cfi_offset 24, -8
-	.loc 1 339 0
-	ldrb	w13, [x4, 32]
-.LVL1:
-	.loc 1 347 0
-	ldp	w11, w18, [x15, 84]
-	.loc 1 343 0
-	ldr	w30, [x15, 156]
-	.loc 1 349 0
-	str	wzr, [x4, 36]
-.LVL2:
-	.loc 1 355 0
-	cmp	w18, 0
-	ble	.L1
-	lsr	w11, w11, 4
-.LVL3:
-	mov	w14, 0
-.LVL4:
-	sub	w17, w11, #1
-	.loc 1 365 0
-	mov	w12, 1
-	add	x17, x17, 1
-.LBB916:
-.LBB917:
-	.loc 1 142 0
-	mov	w10, 3
-	lsl	x16, x17, 3
 .LVL5:
 	.p2align 2
-.L31:
-.LBE917:
-.LBE916:
-	.loc 1 356 0
-	cbz	w30, .L3
-	.loc 1 357 0
-	ldp	w5, w9, [x15, 84]
+.L26:
+	.loc 1 384 0
+	cbz	w18, .L3
+	.loc 1 385 0
+	ldp	w5, w10, [x16, 84]
 .LVL6:
-	sub	w9, w9, #1
-	sub	w9, w9, w14
-	mul	w9, w9, w5
-	lsr	w9, w9, 2
-	add	x9, x0, x9
+	sub	w10, w10, #1
+	sub	w10, w10, w14
+	mul	w10, w10, w5
+	lsr	w10, w10, 2
+	add	x10, x0, x10
 .LVL7:
 .L6:
-	add	x9, x9, 4
+	add	x10, x10, 2
 .LVL8:
-	.loc 1 361 0 discriminator 1
-	mov	x7, 0
-	cbnz	w11, .L65
-	b	.L5
-	.p2align 3
-.L72:
-	.loc 1 365 0
-	str	w12, [x4, 36]
-	.loc 1 367 0
-	ldr	x8, [x4, 112]
+	add	x6, x3, 8
+	.loc 1 389 0 discriminator 1
+	mov	x9, 0
+	cbz	w12, .L5
+	.p2align 2
+.L42:
+	.loc 1 392 0
+	ldr	w7, [x1, x9, lsl 2]
 .LVL9:
-	.loc 1 366 0
-	ldrb	w19, [x3, x7]
-	.loc 1 368 0
-	add	w20, w19, 1
-	and	w20, w20, 255
-	.loc 1 367 0
-	ubfiz	x19, x19, 16, 8
-	add	x8, x8, x19
+	.loc 1 393 0
+	ldr	w5, [x2, x9, lsl 2]
 .LVL10:
-	.loc 1 369 0
-	cmp	w13, w20
-	beq	.L70
-.L8:
-	.loc 1 374 0
-	and	w22, w6, 65535
-	and	w21, w5, 65535
-.LVL11:
-.LBB919:
-.LBB920:
-	.loc 1 140 0
+	.loc 1 394 0
+	cmp	w7, w5
+	beq	.L7
+	.loc 1 396 0
+	eor	w8, w7, w5
+	.loc 1 395 0
+	str	w13, [x4, 36]
+	.loc 1 391 0
 	mov	w19, 0
-	.loc 1 139 0
-	cmp	w22, w21
-	beq	.L9
-	.loc 1 137 0
-	eor	w23, w22, w21
-.LVL12:
-	.loc 1 150 0
-	ubfiz	w24, w22, 8, 8
-	.loc 1 151 0
-	and	w22, w22, 65280
-	.loc 1 150 0
-	add	w24, w24, w21, uxtb
-	.loc 1 142 0
-	tst	x23, 15
-	.loc 1 151 0
-	add	w21, w22, w21, lsr 8
-	.loc 1 142 0
-	csel	w19, wzr, w10, eq
-	.loc 1 144 0
-	tst	w23, 240
-	orr	w22, w19, 12
-	.loc 1 150 0
-	ldrb	w24, [x8, w24, sxtw]
-	.loc 1 144 0
-	csel	w19, w22, w19, ne
-	.loc 1 146 0
-	tst	w23, 3840
-	orr	w22, w19, 48
-	.loc 1 151 0
-	ldrb	w21, [x8, w21, sxtw]
-	.loc 1 146 0
-	csel	w19, w22, w19, ne
-	.loc 1 148 0
-	tst	w23, 61440
-	orr	w22, w19, -64
-	and	w22, w22, 255
-	.loc 1 150 0
-	orr	w21, w24, w21, lsl 4
-	.loc 1 148 0
-	csel	w19, w22, w19, ne
-	.loc 1 150 0
-	and	w19, w21, w19
-	and	w19, w19, 255
-.LVL13:
+	.loc 1 397 0
+	tst	x8, 15
+	beq	.L8
+	.loc 1 398 0
+	ldrb	w21, [x6, -8]
+	.loc 1 400 0
+	ubfiz	w19, w5, 8, 8
+	ldr	x22, [x4, 112]
+	add	w19, w19, w7, uxtb
+	.loc 1 402 0
+	add	w20, w21, 1
+	.loc 1 400 0
+	add	x19, x22, x19
+	.loc 1 399 0
+	lsl	w21, w21, 16
+	.loc 1 402 0
+	and	w20, w20, 255
+	.loc 1 403 0
+	cmp	w11, w20
+	.loc 1 400 0
+	ldrb	w19, [x19, w21, sxtw]
+	and	w19, w19, 3
+	.loc 1 403 0
+	beq	.L58
 .L9:
-.LBE920:
-.LBE919:
-	.loc 1 374 0
-	strb	w19, [x9, -4]
-	.loc 1 375 0
-	lsr	w22, w6, 16
-	lsr	w21, w5, 16
-.LBB921:
-.LBB922:
-	.loc 1 140 0
-	mov	w19, 0
-	.loc 1 139 0
-	cmp	w22, w21
+	.loc 1 407 0
+	strb	w20, [x6, -8]
+.L8:
+	.loc 1 410 0
+	tst	w8, 240
+	beq	.L10
+	.loc 1 413 0
+	lsr	w20, w5, 4
+	.loc 1 411 0
+	ldrb	w21, [x6, -7]
+	.loc 1 413 0
+	ubfx	x22, x7, 4, 8
+	ubfiz	w20, w20, 8, 8
+	add	w20, w20, w22
+	ldr	x22, [x4, 112]
+	.loc 1 412 0
+	lsl	w23, w21, 16
+	.loc 1 415 0
+	add	w21, w21, 1
+	.loc 1 413 0
+	add	x20, x22, x20
+	.loc 1 415 0
+	and	w21, w21, 255
+	.loc 1 416 0
+	cmp	w11, w21
+	.loc 1 413 0
+	ldrb	w20, [x20, w23, sxtw]
+	.loc 1 414 0
+	ubfiz	w20, w20, 2, 2
+	orr	w19, w20, w19
+	.loc 1 416 0
+	beq	.L59
+.L11:
+	.loc 1 420 0
+	strb	w21, [x6, -7]
+.L10:
+	.loc 1 423 0
+	tst	w8, 3840
+	beq	.L12
+	.loc 1 424 0
+	ldrb	w22, [x6, -6]
+	.loc 1 426 0
+	and	w21, w5, 65280
+	ldr	x23, [x4, 112]
+	ubfx	x20, x7, 8, 8
+	orr	w20, w20, w21
+	.loc 1 428 0
+	add	w21, w22, 1
+	.loc 1 425 0
+	lsl	w22, w22, 16
+	.loc 1 428 0
+	and	w21, w21, 255
+	.loc 1 426 0
+	add	x20, x23, x20, uxth
+	.loc 1 429 0
+	cmp	w11, w21
+	.loc 1 426 0
+	ldrb	w20, [x20, w22, sxtw]
+	.loc 1 427 0
+	ubfiz	w20, w20, 4, 2
+	orr	w19, w20, w19
+	.loc 1 429 0
+	beq	.L60
+.L13:
+	.loc 1 433 0
+	strb	w21, [x6, -6]
+.L12:
+	.loc 1 436 0
+	tst	w8, 61440
 	beq	.L14
-	.loc 1 137 0
-	eor	w23, w22, w21
-.LVL14:
-	.loc 1 150 0
-	ubfiz	w24, w22, 8, 8
-	.loc 1 151 0
-	and	w22, w22, 65280
-	.loc 1 150 0
-	add	w24, w24, w21, uxtb
-	.loc 1 142 0
-	tst	x23, 15
-	.loc 1 151 0
-	add	w21, w22, w21, lsr 8
-	.loc 1 142 0
-	csel	w19, wzr, w10, eq
-	.loc 1 144 0
-	tst	w23, 240
-	orr	w22, w19, 12
-	.loc 1 150 0
-	ldrb	w24, [x8, w24, sxtw]
-	.loc 1 144 0
-	csel	w19, w22, w19, ne
-	.loc 1 146 0
-	tst	w23, 3840
-	orr	w22, w19, 48
-	.loc 1 151 0
-	ldrb	w21, [x8, w21, sxtw]
-	.loc 1 146 0
-	csel	w19, w22, w19, ne
-	.loc 1 148 0
-	tst	w23, 61440
-	orr	w22, w19, -64
-	and	w22, w22, 255
-	.loc 1 150 0
-	orr	w21, w24, w21, lsl 4
-	.loc 1 148 0
-	csel	w19, w22, w19, ne
-	.loc 1 150 0
-	and	w19, w21, w19
-	and	w19, w19, 255
-.LVL15:
+	.loc 1 439 0
+	lsr	w20, w5, 12
+	.loc 1 437 0
+	ldrb	w21, [x6, -5]
+	.loc 1 439 0
+	ubfx	x22, x7, 12, 8
+	ubfiz	w20, w20, 8, 8
+	add	w20, w20, w22
+	ldr	x22, [x4, 112]
+	.loc 1 438 0
+	lsl	w23, w21, 16
+	.loc 1 441 0
+	add	w21, w21, 1
+	.loc 1 439 0
+	add	x20, x22, x20
+	.loc 1 441 0
+	and	w21, w21, 255
+	.loc 1 442 0
+	cmp	w11, w21
+	.loc 1 439 0
+	ldrb	w20, [x20, w23, sxtw]
+	.loc 1 440 0
+	ubfiz	w20, w20, 6, 2
+	orr	w19, w20, w19
+	.loc 1 442 0
+	beq	.L61
+.L15:
+	.loc 1 446 0
+	strb	w21, [x6, -5]
 .L14:
-.LBE922:
-.LBE921:
-	.loc 1 375 0
-	strb	w19, [x9, -3]
-	.loc 1 376 0
-	ubfx	x22, x6, 32, 16
-	ubfx	x21, x5, 32, 16
-.LBB923:
-.LBB924:
-	.loc 1 140 0
+	.loc 1 449 0
+	strb	w19, [x10, -2]
+	.loc 1 452 0
+	tst	w8, 983040
+	.loc 1 451 0
 	mov	w19, 0
-	.loc 1 139 0
-	cmp	w22, w21
-	beq	.L19
-	.loc 1 137 0
-	eor	w23, w22, w21
-.LVL16:
-	.loc 1 150 0
-	ubfiz	w24, w22, 8, 8
-	.loc 1 151 0
-	and	w22, w22, 65280
-	.loc 1 150 0
-	add	w24, w24, w21, uxtb
-	.loc 1 142 0
-	tst	x23, 15
-	.loc 1 151 0
-	add	w21, w22, w21, lsr 8
-	.loc 1 142 0
-	csel	w19, wzr, w10, eq
-	.loc 1 144 0
-	tst	w23, 240
-	orr	w22, w19, 12
-	.loc 1 150 0
-	ldrb	w24, [x8, w24, sxtw]
-	.loc 1 144 0
-	csel	w19, w22, w19, ne
-	.loc 1 146 0
-	tst	w23, 3840
-	orr	w22, w19, 48
-	.loc 1 151 0
-	ldrb	w21, [x8, w21, sxtw]
-	.loc 1 146 0
-	csel	w19, w22, w19, ne
-	.loc 1 148 0
-	tst	w23, 61440
-	orr	w22, w19, -64
-	and	w22, w22, 255
-	.loc 1 150 0
-	orr	w21, w24, w21, lsl 4
-	.loc 1 148 0
-	csel	w19, w22, w19, ne
-	.loc 1 150 0
-	and	w19, w21, w19
-	and	w19, w19, 255
-.LVL17:
+	.loc 1 452 0
+	beq	.L16
+	.loc 1 455 0
+	lsr	w19, w5, 16
+	.loc 1 453 0
+	ldrb	w20, [x6, -4]
+	.loc 1 455 0
+	ubfx	x21, x7, 16, 8
+	ubfiz	w19, w19, 8, 8
+	add	w19, w19, w21
+	ldr	x21, [x4, 112]
+	.loc 1 454 0
+	lsl	w22, w20, 16
+	.loc 1 457 0
+	add	w20, w20, 1
+	.loc 1 455 0
+	add	x19, x21, x19
+	.loc 1 457 0
+	and	w20, w20, 255
+	.loc 1 458 0
+	cmp	w11, w20
+	.loc 1 455 0
+	ldrb	w19, [x19, w22, sxtw]
+	and	w19, w19, 3
+	.loc 1 458 0
+	beq	.L62
+.L17:
+	.loc 1 462 0
+	strb	w20, [x6, -4]
+.L16:
+	.loc 1 465 0
+	tst	w8, 15728640
+	beq	.L18
+	.loc 1 468 0
+	lsr	w20, w5, 20
+	.loc 1 466 0
+	ldrb	w21, [x6, -3]
+	.loc 1 468 0
+	ubfx	x22, x7, 20, 8
+	ubfiz	w20, w20, 8, 8
+	add	w20, w20, w22
+	ldr	x22, [x4, 112]
+	.loc 1 467 0
+	lsl	w23, w21, 16
+	.loc 1 470 0
+	add	w21, w21, 1
+	.loc 1 468 0
+	add	x20, x22, x20
+	.loc 1 470 0
+	and	w21, w21, 255
+	.loc 1 471 0
+	cmp	w11, w21
+	.loc 1 468 0
+	ldrb	w20, [x20, w23, sxtw]
+	.loc 1 469 0
+	ubfiz	w20, w20, 2, 2
+	orr	w19, w20, w19
+	.loc 1 471 0
+	beq	.L63
 .L19:
-.LBE924:
-.LBE923:
-	.loc 1 376 0
-	strb	w19, [x9, -2]
-	.loc 1 377 0
-	lsr	x6, x6, 48
-.LVL18:
-	lsr	x5, x5, 48
-.LVL19:
-.LBB925:
-.LBB918:
-	.loc 1 140 0
-	mov	w19, 0
-	.loc 1 139 0
-	cmp	w6, w5
-	beq	.L24
-	.loc 1 137 0
-	eor	w21, w6, w5
-.LVL20:
-	.loc 1 150 0
-	ubfiz	w19, w6, 8, 8
-	.loc 1 151 0
-	and	w6, w6, 65280
-	.loc 1 150 0
-	add	w19, w19, w5, uxtb
-	.loc 1 142 0
-	tst	x21, 15
-	.loc 1 151 0
-	add	w5, w6, w5, lsr 8
-	.loc 1 142 0
-	csel	w6, wzr, w10, eq
-	.loc 1 144 0
-	tst	w21, 240
-	orr	w23, w6, 12
-.LVL21:
-	.loc 1 150 0
-	ldrb	w22, [x8, w19, sxtw]
-	.loc 1 144 0
-	csel	w6, w23, w6, ne
-	.loc 1 146 0
-	tst	w21, 3840
-	orr	w23, w6, 48
-	.loc 1 151 0
-	ldrb	w19, [x8, w5, sxtw]
-	.loc 1 146 0
-	csel	w6, w23, w6, ne
-	.loc 1 148 0
-	tst	w21, 61440
-	orr	w5, w6, -64
-	and	w5, w5, 255
-	.loc 1 150 0
-	orr	w19, w22, w19, lsl 4
-	.loc 1 148 0
-	csel	w6, w5, w6, ne
-	.loc 1 150 0
-	and	w6, w19, w6
-	and	w19, w6, 255
-.LVL22:
+	.loc 1 475 0
+	strb	w21, [x6, -3]
+.L18:
+	.loc 1 478 0
+	tst	w8, 251658240
+	beq	.L20
+	.loc 1 479 0
+	ldrb	w22, [x6, -2]
+	.loc 1 481 0
+	lsr	w20, w5, 24
+	mov	w21, w20
+	lsr	w24, w7, 24
+	ldr	x23, [x4, 112]
+	add	w20, w24, w21, lsl 8
+	.loc 1 483 0
+	add	w21, w22, 1
+	.loc 1 480 0
+	lsl	w22, w22, 16
+	.loc 1 481 0
+	add	x20, x23, x20
+	.loc 1 483 0
+	and	w21, w21, 255
+	.loc 1 484 0
+	cmp	w11, w21
+	.loc 1 481 0
+	ldrb	w20, [x20, w22, sxtw]
+	.loc 1 482 0
+	ubfiz	w20, w20, 4, 2
+	orr	w19, w20, w19
+	.loc 1 484 0
+	beq	.L64
+.L21:
+	.loc 1 488 0
+	strb	w21, [x6, -2]
+.L20:
+	.loc 1 491 0
+	tst	w8, -268435456
+	beq	.L22
+	.loc 1 492 0
+	ldrb	w21, [x6, -1]
+	.loc 1 494 0
+	lsr	w8, w5, 28
+.LVL11:
+	mov	w20, w8
+	lsr	w23, w7, 28
+	ldr	x22, [x4, 112]
+	add	w8, w23, w20, lsl 8
+	.loc 1 496 0
+	add	w20, w21, 1
+	.loc 1 493 0
+	lsl	w21, w21, 16
+	.loc 1 494 0
+	add	x8, x22, x8
+	.loc 1 496 0
+	and	w20, w20, 255
+	.loc 1 497 0
+	cmp	w11, w20
+	.loc 1 494 0
+	ldrb	w8, [x8, w21, sxtw]
+	.loc 1 495 0
+	ubfiz	w8, w8, 6, 2
+	orr	w19, w8, w19
+	.loc 1 497 0
+	beq	.L65
+.L23:
+	.loc 1 501 0
+	strb	w20, [x6, -1]
+.LVL12:
+.L22:
+	.loc 1 504 0
+	str	w5, [x2, x9, lsl 2]
+	.loc 1 505 0
+	strb	w19, [x10, -1]
 .L24:
-.LBE918:
-.LBE925:
-	.loc 1 377 0
-	strb	w19, [x9, -1]
-	add	x9, x9, 4
-	.loc 1 378 0
-	strb	w20, [x3, x7]
-	add	x7, x7, 1
-	.loc 1 361 0
-	cmp	w11, w7
-	ble	.L71
-.LVL23:
-.L65:
-	.loc 1 362 0
-	ldr	x5, [x1, x7, lsl 3]
-	.loc 1 363 0
-	ldr	x6, [x2, x7, lsl 3]
-	.loc 1 364 0
-	cmp	x5, x6
-	bne	.L72
-	.loc 1 381 0
-	str	wzr, [x9, -4]
-	add	x7, x7, 1
-	add	x9, x9, 4
-	.loc 1 361 0
-	cmp	w11, w7
-	bgt	.L65
-.L71:
-	add	x3, x3, x17
-	add	x2, x2, x16
-.LVL24:
-	add	x1, x1, x16
-.LVL25:
+	add	x9, x9, 1
+	add	x10, x10, 2
+	add	x6, x6, 8
+	.loc 1 389 0 discriminator 2
+	cmp	w12, w9
+	bgt	.L42
+	add	x3, x3, x30
+	add	x2, x2, x15
+	add	x1, x1, x15
 .L5:
-	.loc 1 355 0 discriminator 2
+	.loc 1 383 0 discriminator 2
 	add	w14, w14, 1
-	cmp	w18, w14
-	bne	.L31
-.L1:
-	.loc 1 390 0
+	cmp	w17, w14
+	bne	.L26
+	.loc 1 517 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL26:
 	ldp	x23, x24, [sp, 48]
-.LVL27:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -400,24 +406,122 @@ get_auto_image:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL28:
+.LVL13:
 	.p2align 3
-.L70:
+.L65:
 	.cfi_restore_state
-	.loc 1 371 0
-	str	x5, [x2, x7, lsl 3]
-	.loc 1 370 0
+	.loc 1 499 0
+	and	w5, w5, 268435455
+.LVL14:
+	and	w7, w7, -268435456
+.LVL15:
+	orr	w5, w7, w5
+.LVL16:
+	.loc 1 498 0
 	mov	w20, 0
-	b	.L8
+	b	.L23
+.LVL17:
 	.p2align 3
-.L3:
-	.loc 1 359 0
-	ldr	w9, [x15, 84]
-	mul	w9, w14, w9
-	lsr	w9, w9, 2
-	add	x9, x0, x9
+.L64:
+	.loc 1 486 0
+	and	w5, w5, -251658241
+.LVL18:
+	and	w20, w7, 251658240
+	orr	w5, w20, w5
+.LVL19:
+	.loc 1 485 0
+	mov	w21, 0
+	b	.L21
+	.p2align 3
+.L62:
+	.loc 1 460 0
+	and	w20, w7, 983040
+	and	w5, w5, -983041
+.LVL20:
+	orr	w5, w20, w5
+.LVL21:
+	.loc 1 459 0
+	mov	w20, 0
+	b	.L17
+	.p2align 3
+.L63:
+	.loc 1 473 0
+	and	w5, w5, -15728641
+.LVL22:
+	and	w20, w7, 15728640
+	orr	w5, w20, w5
+.LVL23:
+	.loc 1 472 0
+	mov	w21, 0
+	b	.L19
+	.p2align 3
+.L61:
+	.loc 1 444 0
+	and	w5, w5, -61441
+.LVL24:
+	and	w20, w7, 61440
+	orr	w5, w20, w5
+.LVL25:
+	.loc 1 443 0
+	mov	w21, 0
+	b	.L15
+	.p2align 3
+.L59:
+	.loc 1 418 0
+	and	w5, w5, -241
+.LVL26:
+	and	w20, w7, 240
+	orr	w5, w20, w5
+.LVL27:
+	.loc 1 417 0
+	mov	w21, 0
+	b	.L11
+	.p2align 3
+.L60:
+	.loc 1 431 0
+	and	w5, w5, -3841
+.LVL28:
+	and	w20, w7, 3840
+	orr	w5, w20, w5
 .LVL29:
+	.loc 1 430 0
+	mov	w21, 0
+	b	.L13
+	.p2align 3
+.L58:
+	.loc 1 405 0
+	bfi	w5, w7, 0, 4
+	.loc 1 404 0
+	mov	w20, 0
+	b	.L9
+	.p2align 3
+.L7:
+	.loc 1 508 0
+	strb	wzr, [x10, -2]
+	.loc 1 509 0
+	strb	wzr, [x10, -1]
+	b	.L24
+	.p2align 3
+.L3:
+	.loc 1 387 0
+	ldr	w10, [x16, 84]
+	mul	w10, w14, w10
+	lsr	w10, w10, 2
+	add	x10, x0, x10
+.LVL30:
 	b	.L6
+.LVL31:
+.L54:
+	.cfi_def_cfa 31, 0
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 23
+	.cfi_restore 24
+	.cfi_restore 29
+	.cfi_restore 30
+	ret
 	.cfi_endproc
 .LFE2809:
 	.size	get_auto_image, .-get_auto_image
@@ -426,15 +530,15 @@ get_auto_image:
 	.type	ebc_open, %function
 ebc_open:
 .LFB2826:
-	.loc 1 1424 0
+	.loc 1 1557 0
 	.cfi_startproc
-.LVL30:
-	.loc 1 1428 0
+.LVL32:
+	.loc 1 1561 0
 	mov	w0, 0
-.LVL31:
-	.loc 1 1425 0
+.LVL33:
+	.loc 1 1558 0
 	str	xzr, [x1, 104]
-	.loc 1 1428 0
+	.loc 1 1561 0
 	ret
 	.cfi_endproc
 .LFE2826:
@@ -444,22 +548,22 @@ ebc_open:
 	.type	ebc_exit, %function
 ebc_exit:
 .LFB2845:
-	.loc 1 1970 0
+	.loc 1 2103 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1971 0
+	.loc 1 2104 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 1970 0
+	.loc 1 2103 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1971 0
+	.loc 1 2104 0
 	bl	platform_driver_unregister
-.LVL32:
-	.loc 1 1972 0
+.LVL34:
+	.loc 1 2105 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -474,9 +578,9 @@ ebc_exit:
 	.type	ebc_resume, %function
 ebc_resume:
 .LFB2843:
-	.loc 1 1932 0
+	.loc 1 2065 0
 	.cfi_startproc
-.LVL33:
+.LVL35:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -485,35 +589,35 @@ ebc_resume:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-.LBB926:
-.LBB927:
+.LBB906:
+.LBB907:
 	.file 2 "./include/linux/device.h"
 	.loc 2 1181 0
 	ldr	x19, [x0, 184]
-.LBE927:
-.LBE926:
-	.loc 1 1936 0
+.LBE907:
+.LBE906:
+	.loc 1 2069 0
 	ldr	x1, [x19, 16]
-.LBB928:
-.LBB929:
+.LBB908:
+.LBB909:
 	.file 3 "drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic.h"
 	.loc 3 45 0
 	mov	x0, x1
-.LVL34:
+.LVL36:
 	ldr	x1, [x1, 48]
 	blr	x1
-.LVL35:
-.LBE929:
-.LBE928:
-	.loc 1 1937 0
-	str	wzr, [x19, 788]
-	.loc 1 1938 0
+.LVL37:
+.LBE909:
+.LBE908:
+	.loc 1 2070 0
+	str	wzr, [x19, 780]
+	.loc 1 2071 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
-.LVL36:
-	.loc 1 1941 0
+.LVL38:
+	.loc 1 2074 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -530,44 +634,44 @@ ebc_resume:
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
 .LFB2821:
-	.loc 1 1123 0
+	.loc 1 1256 0
 	.cfi_startproc
-.LVL37:
-	.loc 1 1124 0
+.LVL39:
+	.loc 1 1257 0
 	adrp	x0, .LANCHOR0
-.LVL38:
+.LVL40:
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1126 0
-	ldr	w2, [x0, 616]
-	cbnz	w2, .L87
+	.loc 1 1259 0
+	ldr	w2, [x0, 608]
+	cbnz	w2, .L80
 	ret
 	.p2align 3
-.L87:
-	.loc 1 1123 0
+.L80:
+	.loc 1 1256 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-.LBB930:
-.LBB931:
+.LBB910:
+.LBB911:
 	.file 4 "./include/linux/wakelock.h"
 	.loc 4 68 0
-	add	x0, x0, 408
-.LBE931:
-.LBE930:
-	.loc 1 1123 0
+	add	x0, x0, 400
+.LBE911:
+.LBE910:
+	.loc 1 1256 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1127 0
+	.loc 1 1260 0
 	str	wzr, [x0, 208]
-.LBB933:
-.LBB932:
+.LBB913:
+.LBB912:
 	.loc 4 68 0
 	bl	__pm_relax
-.LVL39:
-.LBE932:
-.LBE933:
-	.loc 1 1132 0
+.LVL41:
+.LBE912:
+.LBE913:
+	.loc 1 1265 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -581,27 +685,27 @@ ebc_vdd_power_timeout:
 	.type	ebc_remove, %function
 ebc_remove:
 .LFB2841:
-	.loc 1 1908 0
+	.loc 1 2041 0
 	.cfi_startproc
-.LVL40:
+.LVL42:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1909 0
+	.loc 1 2042 0
 	adrp	x0, .LANCHOR1
-.LVL41:
+.LVL43:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 1908 0
+	.loc 1 2041 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1909 0
+	.loc 1 2042 0
 	add	x0, x0, 224
-	.loc 1 1908 0
-	.loc 1 1909 0
+	.loc 1 2041 0
+	.loc 1 2042 0
 	bl	misc_deregister
-.LVL42:
-	.loc 1 1912 0
+.LVL44:
+	.loc 1 2045 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -616,9 +720,9 @@ ebc_remove:
 	.type	ebc_mmap, %function
 ebc_mmap:
 .LFB2825:
-	.loc 1 1409 0
+	.loc 1 1542 0
 	.cfi_startproc
-.LVL43:
+.LVL45:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -627,35 +731,35 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1409 0
+	.loc 1 1542 0
 	mov	x19, x1
-	.loc 1 1412 0
+	.loc 1 1545 0
 	bl	ebc_phy_buf_base_get
-.LVL44:
-	.loc 1 1415 0
+.LVL46:
+	.loc 1 1548 0
 	lsr	x2, x0, 12
-	.loc 1 1413 0
+	.loc 1 1546 0
 	mov	x6, 16384
-	.loc 1 1415 0
+	.loc 1 1548 0
 	mov	x0, x19
-	.loc 1 1413 0
+	.loc 1 1546 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 1415 0
+	.loc 1 1548 0
 	ldp	x1, x3, [x19]
-	.loc 1 1413 0
+	.loc 1 1546 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 1415 0
+	.loc 1 1548 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
-.LVL45:
-	.loc 1 1418 0
+.LVL47:
+	.loc 1 1551 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 1421 0
+	.loc 1 1554 0
 	ldr	x19, [sp, 16]
-.LVL46:
+.LVL48:
 	csel	w0, w0, w1, eq
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
@@ -671,16 +775,16 @@ ebc_mmap:
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
 .LFB2824:
-	.loc 1 1208 0
+	.loc 1 1341 0
 	.cfi_startproc
-.LVL47:
+.LVL49:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 1218 0
+	.loc 1 1351 0
 	cmp	w1, 28672
-	.loc 1 1208 0
+	.loc 1 1341 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -689,150 +793,151 @@ ebc_io_ctl:
 	adrp	x19, __stack_chk_guard
 	stp	x21, x22, [sp, 32]
 	add	x0, x19, :lo12:__stack_chk_guard
-.LVL48:
+.LVL50:
 	str	x23, [sp, 48]
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
 	.cfi_offset 23, -112
-	.loc 1 1208 0
+	.loc 1 1341 0
 	mov	x21, x2
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 1210 0
+	.loc 1 1343 0
 	adrp	x0, .LANCHOR0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1218 0
-	bcc	.L95
+	.loc 1 1351 0
+	bcc	.L88
 	mov	w0, 28675
 	cmp	w1, w0
-	bls	.L96
+	bls	.L89
 	mov	w0, -28678
 	add	w0, w1, w0
 	cmp	w0, 1
-	bls	.L96
-.L95:
-	.loc 1 1234 0
+	bls	.L89
+.L88:
+	.loc 1 1367 0
 	mov	w0, 28677
 	cmp	w1, w0
-	beq	.L99
-	bls	.L228
+	beq	.L92
+	bls	.L221
 	mov	w0, 28680
 	cmp	w1, w0
-	beq	.L107
-	bls	.L229
+	beq	.L100
+	bls	.L222
 	mov	w0, 28682
 	cmp	w1, w0
-	beq	.L111
-	bcc	.L112
+	beq	.L104
+	bcc	.L105
 	mov	w0, 28683
 	cmp	w1, w0
-	bne	.L98
-	.loc 1 1386 0
+	bne	.L91
+	.loc 1 1519 0
 	bl	ebc_empty_buf_get
-.LVL49:
+.LVL51:
 	mov	x23, x0
-	.loc 1 1387 0
-	cbz	x0, .L119
-	.loc 1 1389 0
+	.loc 1 1520 0
+	cbz	x0, .L112
+	.loc 1 1522 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
-	ldr	x1, [x20, 336]
-.L225:
+	ldr	x1, [x20, 392]
+	ldr	x0, [x0, 16]
 	mul	w2, w2, w3
-	ldr	x0, [x23, 16]
+	ldr	x1, [x1, 16]
+.L218:
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL50:
-	.loc 1 1390 0
+.LVL52:
+	.loc 1 1523 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
-.LVL51:
+.LVL53:
 	sub	w0, w20, w0
-.LBB934:
-.LBB935:
-.LBB936:
-.LBB937:
-.LBB938:
-.LBB939:
-.LBB940:
+.LBB914:
+.LBB915:
+.LBB916:
+.LBB917:
+.LBB918:
+.LBB919:
+.LBB920:
 	.file 5 "./arch/arm64/include/asm/current.h"
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL52:
+.LVL54:
 #NO_APP
-.LBE940:
-.LBE939:
+.LBE920:
+.LBE919:
 	.file 6 "./arch/arm64/include/asm/uaccess.h"
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE938:
-.LBE937:
-.LBE936:
-.LBE935:
-.LBE934:
-	.loc 1 1392 0
+.LBE918:
+.LBE917:
+.LBE916:
+.LBE915:
+.LBE914:
+	.loc 1 1525 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 1391 0
+	.loc 1 1524 0
 	str	w0, [x29, 104]
-	.loc 1 1393 0
+	.loc 1 1526 0
 	stp	w4, w1, [x29, 112]
-.LBB965:
-.LBB962:
-.LBB959:
-.LBB949:
-.LBB947:
+.LBB945:
+.LBB942:
+.LBB939:
+.LBB929:
+.LBB927:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL53:
+.LVL55:
 	.loc 6 84 0
-	tbnz	x3, 21, .L156
-.LVL54:
-.L222:
-.LBB941:
-.LBB942:
-.LBB943:
+	tbnz	x3, 21, .L149
+.LVL56:
+.L215:
+.LBB921:
+.LBB922:
+.LBB923:
 	.file 7 "./include/asm-generic/bitops/non-atomic.h"
 	.loc 7 106 0
 	ldr	x2, [x2]
-.LVL55:
-.LBE943:
+.LVL57:
+.LBE923:
+.LBE922:
+.LBE921:
+.LBE927:
+.LBE929:
+.LBE939:
 .LBE942:
-.LBE941:
-.LBE947:
-.LBE949:
-.LBE959:
-.LBE962:
-.LBE965:
-	.loc 1 1209 0
+.LBE945:
+	.loc 1 1342 0
 	mov	x0, x21
-.LVL56:
-.LBB966:
-.LBB963:
-.LBB960:
-.LBB950:
-.LBB948:
-	.loc 6 84 0
-	tbz	x2, 26, .L157
-.LVL57:
-.L156:
-.LBB944:
-.LBB945:
+.LVL58:
 .LBB946:
+.LBB943:
+.LBB940:
+.LBB930:
+.LBB928:
+	.loc 6 84 0
+	tbz	x2, 26, .L150
+.LVL59:
+.L149:
+.LBB924:
+.LBB925:
+.LBB926:
 	.file 8 "./include/linux/bitops.h"
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL58:
-.LBE946:
-.LBE945:
+.LVL60:
+.LBE926:
+.LBE925:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL59:
-.L157:
-.LBE944:
+.LVL61:
+.L150:
+.LBE924:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -843,86 +948,86 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL60:
+.LVL62:
 #NO_APP
-.LBE948:
-.LBE950:
+.LBE928:
+.LBE930:
 	.file 9 "./include/linux/uaccess.h"
 	.loc 9 132 0
 	mov	x22, 44
-	cbnz	x0, .L230
-.L158:
-.LBE960:
-.LBE963:
-.LBE966:
-	.loc 1 1395 0
+	cbnz	x0, .L223
+.L151:
+.LBE940:
+.LBE943:
+.LBE946:
+	.loc 1 1528 0
 	mov	x0, x23
-.LVL61:
-	bl	ebc_buf_release
-.LVL62:
-	.loc 1 1396 0
-	b	.L94
 .LVL63:
+	bl	ebc_buf_release
+.LVL64:
+	.loc 1 1529 0
+	b	.L87
+.LVL65:
 	.p2align 3
-.L96:
-	.loc 1 1225 0
-	cbnz	x21, .L95
-	.loc 1 1226 0
+.L89:
+	.loc 1 1358 0
+	cbnz	x21, .L88
+	.loc 1 1359 0
 	ldr	x0, [x20, 272]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
-.LVL64:
+.LVL66:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC1
-	.loc 1 1227 0
+	.loc 1 1360 0
 	mov	x22, -14
-	.loc 1 1226 0
+	.loc 1 1359 0
 	bl	_dev_err
-.LVL65:
-	.loc 1 1227 0
-	b	.L94
-.LVL66:
+.LVL67:
+	.loc 1 1360 0
+	b	.L87
+.LVL68:
 	.p2align 3
-.L228:
-	.loc 1 1234 0
+.L221:
+	.loc 1 1367 0
 	mov	w0, 28674
 	cmp	w1, w0
-	beq	.L101
-	bls	.L231
+	beq	.L94
+	bls	.L224
 	mov	w0, 28675
 	cmp	w1, w0
-	beq	.L105
+	beq	.L98
 	mov	w0, 28676
 	cmp	w1, w0
-	bne	.L98
-	.loc 1 1318 0
+	bne	.L91
+	.loc 1 1451 0
 	ldr	x0, [x20, 272]
-	.loc 1 1317 0
+	.loc 1 1450 0
 	mov	w2, 1
-	str	w2, [x20, 796]
-	.loc 1 1318 0
+	str	w2, [x20, 788]
+	.loc 1 1451 0
 	adrp	x1, .LC2
-.LVL67:
-	.loc 1 1319 0
+.LVL69:
+	.loc 1 1452 0
 	mov	x22, 0
-	.loc 1 1318 0
+	.loc 1 1451 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
-.LVL68:
+.LVL70:
 	.p2align 2
-.L94:
-	.loc 1 1406 0
+.L87:
+	.loc 1 1539 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
-.LVL69:
+.LVL71:
 	ldr	x2, [x29, 152]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-.LVL70:
-	cbnz	x1, .L232
+.LVL72:
+	cbnz	x1, .L225
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL71:
+.LVL73:
 	ldr	x23, [sp, 48]
 	ldp	x29, x30, [sp], 160
 	.cfi_remember_state
@@ -935,54 +1040,54 @@ ebc_io_ctl:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL72:
+.LVL74:
 	.p2align 3
-.L231:
+.L224:
 	.cfi_restore_state
-	.loc 1 1234 0
+	.loc 1 1367 0
 	cmp	w1, 28672
-	beq	.L103
+	beq	.L96
 	mov	w0, 28673
 	cmp	w1, w0
-	bne	.L98
-.LBB967:
-.LBB968:
-.LBB969:
-.LBB970:
-.LBB971:
-.LBB972:
-.LBB973:
+	bne	.L91
+.LBB947:
+.LBB948:
+.LBB949:
+.LBB950:
+.LBB951:
+.LBB952:
+.LBB953:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL73:
+.LVL75:
 #NO_APP
-.LBE973:
-.LBE972:
+.LBE953:
+.LBE952:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
-.LVL74:
+.LVL76:
 	.loc 6 84 0
-	tbz	x2, 21, .L233
-.LVL75:
-.L124:
-.LBB974:
-.LBB975:
-.LBB976:
+	tbz	x2, 21, .L226
+.LVL77:
+.L117:
+.LBB954:
+.LBB955:
+.LBB956:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL76:
-.LBE976:
-.LBE975:
+.LVL78:
+.LBE956:
+.LBE955:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL77:
-.L125:
-.LBE974:
+.LVL79:
+.L118:
+.LBE954:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -993,39 +1098,39 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL78:
+.LVL80:
 #NO_APP
-.LBE971:
-.LBE970:
+.LBE951:
+.LBE950:
 	.loc 9 114 0
-	cbz	x0, .L127
-.LBB982:
-.LBB983:
-.LBB984:
-.LBB985:
-.LBB986:
+	cbz	x0, .L120
+.LBB962:
+.LBB963:
+.LBB964:
+.LBB965:
+.LBB966:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL79:
-.LBE986:
-.LBE985:
-.LBE984:
-.LBB987:
-.LBB988:
+.LVL81:
+.LBE966:
+.LBE965:
+.LBE964:
+.LBB967:
+.LBB968:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL80:
+.LVL82:
 #NO_APP
-.LBE988:
-.LBE987:
-.LBB989:
+.LBE968:
+.LBE967:
+.LBB969:
 	.loc 6 254 0
 	and	x0, x0, x21
-.LVL81:
-.LBE989:
+.LVL83:
+.LBE969:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1034,172 +1139,174 @@ ebc_io_ctl:
 	csel	x1, x21, xzr, eq
 
 // 0 "" 2
-.LVL82:
+.LVL84:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE983:
-.LBE982:
+.LBE963:
+.LBE962:
 	.loc 9 116 0
 	mov	x2, 44
 	add	x0, x29, 104
-.LVL83:
+.LVL85:
 	bl	__arch_copy_from_user
-.LVL84:
+.LVL86:
 	.loc 9 118 0
-	cbnz	x0, .L127
-.LBE969:
-.LBE968:
-.LBE967:
-	.loc 1 1272 0
+	cbnz	x0, .L120
+.LBE949:
+.LBE948:
+.LBE947:
+	.loc 1 1405 0
 	bl	ebc_phy_buf_base_get
-.LVL85:
+.LVL87:
 	ldrsw	x1, [x29, 104]
-	.loc 1 1273 0
+	.loc 1 1406 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
-.LVL86:
+.LVL88:
 	mov	x21, x0
-.LVL87:
-	.loc 1 1274 0
-	cbz	x0, .L134
-	.loc 1 1275 0
+.LVL89:
+	.loc 1 1407 0
+	cbz	x0, .L127
+	.loc 1 1408 0
 	ldr	w5, [x29, 108]
-	.loc 1 1284 0
+	.loc 1 1417 0
 	add	x20, x20, 184
-	.loc 1 1279 0
+	.loc 1 1412 0
 	ldp	w4, w2, [x29, 124]
-	.loc 1 1275 0
+	.loc 1 1408 0
 	str	w5, [x21, 40]
-	.loc 1 1280 0
+	.loc 1 1413 0
 	ldp	w3, w1, [x29, 132]
-	.loc 1 1279 0
+	.loc 1 1412 0
 	stp	w4, w2, [x21, 48]
-	.loc 1 1280 0
+	.loc 1 1413 0
 	stp	w3, w1, [x21, 56]
-	.loc 1 1282 0
+	.loc 1 1415 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL88:
-	.loc 1 1284 0
+.LVL90:
+	.loc 1 1417 0
 	ldr	w0, [x20, 80]
-	cbz	w0, .L234
-.L129:
-	.loc 1 1288 0
+	cbz	w0, .L227
+.L122:
+	.loc 1 1421 0
 	ldr	w0, [x21, 40]
 	cmp	w0, 15
-	beq	.L235
-	.loc 1 1288 0 is_stmt 0 discriminator 3
+	beq	.L228
+	.loc 1 1421 0 is_stmt 0 discriminator 3
 	cmp	w0, 17
-	bne	.L134
-.L131:
-	.loc 1 1289 0 is_stmt 1
+	bne	.L127
+.L124:
+	.loc 1 1422 0 is_stmt 1
 	mov	w0, 1
-	str	w0, [x20, 196]
-.LBB996:
-.LBB997:
-	.loc 1 1290 0
+	str	w0, [x20, 188]
+.LBB976:
+.LBB977:
+	.loc 1 1423 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
-.LVL89:
+.LVL91:
 	adrp	x0, .LANCHOR1
-.LBB998:
+.LBB978:
 	add	x0, x0, :lo12:.LANCHOR1
 	add	x21, x0, 328
-	b	.L135
+	b	.L128
 	.p2align 3
-.L236:
-.LVL90:
-	.loc 1 1290 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L134
-	.loc 1 1290 0 discriminator 7
+.L229:
+.LVL92:
+	.loc 1 1423 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L127
+	.loc 1 1423 0 discriminator 7
 	bl	schedule
-.LVL91:
-.L135:
-	.loc 1 1290 0 discriminator 9
+.LVL93:
+.L128:
+	.loc 1 1423 0 discriminator 9
 	add	x1, x29, 64
 	mov	w2, 1
 	mov	x0, x21
 	bl	prepare_to_wait_event
-.LVL92:
-	ldr	w1, [x20, 196]
-	cbnz	w1, .L236
-.LBE998:
-	.loc 1 1290 0 discriminator 4
+.LVL94:
+	ldr	w1, [x20, 188]
+	cbnz	w1, .L229
+.LBE978:
+	.loc 1 1423 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
 	bl	finish_wait
-.LVL93:
+.LVL95:
 	.p2align 2
-.L134:
+.L127:
 	mov	x22, 0
-	b	.L94
-.LVL94:
+	b	.L87
+.LVL96:
 	.p2align 3
-.L111:
-.LBE997:
-.LBE996:
-	.loc 1 1373 0 is_stmt 1
+.L104:
+.LBE977:
+.LBE976:
+	.loc 1 1506 0 is_stmt 1
 	bl	ebc_empty_buf_get
-.LVL95:
+.LVL97:
 	mov	x23, x0
-	.loc 1 1374 0
-	cbz	x0, .L119
-	.loc 1 1376 0
+	.loc 1 1507 0
+	cbz	x0, .L112
+	.loc 1 1509 0
+	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 328]
-	ldp	w2, w3, [x20, 108]
-	b	.L225
-.LVL96:
+	ldr	x0, [x0, 16]
+	mul	w2, w2, w3
+	b	.L218
+.LVL98:
 	.p2align 3
-.L229:
-	.loc 1 1234 0
+.L222:
+	.loc 1 1367 0
 	mov	w0, 28678
 	cmp	w1, w0
-	beq	.L109
+	beq	.L102
 	mov	w0, 28679
 	cmp	w1, w0
-	bne	.L98
-.LBB1002:
-.LBB1003:
-.LBB1004:
-.LBB1005:
-.LBB1006:
-.LBB1007:
-.LBB1008:
+	bne	.L91
+.LBB982:
+.LBB983:
+.LBB984:
+.LBB985:
+.LBB986:
+.LBB987:
+.LBB988:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL97:
+.LVL99:
 #NO_APP
-.LBE1008:
-.LBE1007:
+.LBE988:
+.LBE987:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
-.LVL98:
+.LVL100:
 	.loc 6 84 0
-	tbz	x2, 21, .L237
-.LVL99:
-.L136:
-.LBB1009:
-.LBB1010:
-.LBB1011:
+	tbz	x2, 21, .L230
+.LVL101:
+.L129:
+.LBB989:
+.LBB990:
+.LBB991:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL100:
-.LBE1011:
-.LBE1010:
+.LVL102:
+.LBE991:
+.LBE990:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL101:
-.L137:
-.LBE1009:
+.LVL103:
+.L130:
+.LBE989:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1210,39 +1317,39 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL102:
+.LVL104:
 #NO_APP
-.LBE1006:
-.LBE1005:
+.LBE986:
+.LBE985:
 	.loc 9 114 0
-	cbz	x0, .L127
-.LBB1017:
-.LBB1018:
-.LBB1019:
-.LBB1020:
-.LBB1021:
+	cbz	x0, .L120
+.LBB997:
+.LBB998:
+.LBB999:
+.LBB1000:
+.LBB1001:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL103:
-.LBE1021:
-.LBE1020:
-.LBE1019:
-.LBB1022:
-.LBB1023:
+.LVL105:
+.LBE1001:
+.LBE1000:
+.LBE999:
+.LBB1002:
+.LBB1003:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL104:
+.LVL106:
 #NO_APP
-.LBE1023:
-.LBE1022:
-.LBB1024:
+.LBE1003:
+.LBE1002:
+.LBB1004:
 	.loc 6 254 0
 	and	x0, x0, x21
-.LVL105:
-.LBE1024:
+.LVL107:
+.LBE1004:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1251,196 +1358,196 @@ ebc_io_ctl:
 	csel	x1, x21, xzr, eq
 
 // 0 "" 2
-.LVL106:
+.LVL108:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1018:
-.LBE1017:
+.LBE998:
+.LBE997:
 	.loc 9 116 0
 	mov	x2, 44
 	add	x0, x29, 104
-.LVL107:
+.LVL109:
 	bl	__arch_copy_from_user
-.LVL108:
+.LVL110:
 	.loc 9 118 0
-	cbnz	x0, .L127
-.LBE1004:
-.LBE1003:
-.LBE1002:
-	.loc 1 1299 0
+	cbnz	x0, .L120
+.LBE984:
+.LBE983:
+.LBE982:
+	.loc 1 1432 0
 	bl	ebc_osd_buf_clone
-.LVL109:
+.LVL111:
 	mov	x1, x0
-	.loc 1 1300 0
-	cbz	x0, .L134
-	.loc 1 1301 0
+	.loc 1 1433 0
+	cbz	x0, .L127
+	.loc 1 1434 0
 	ldr	w6, [x29, 108]
-	.loc 1 1310 0
+	.loc 1 1443 0
 	add	x20, x20, 184
-	.loc 1 1305 0
+	.loc 1 1438 0
 	ldp	w5, w3, [x29, 124]
-	.loc 1 1301 0
+	.loc 1 1434 0
 	str	w6, [x1, 40]
-	.loc 1 1306 0
+	.loc 1 1439 0
 	ldp	w4, w2, [x29, 132]
-	.loc 1 1305 0
+	.loc 1 1438 0
 	stp	w5, w3, [x1, 48]
-	.loc 1 1306 0
+	.loc 1 1439 0
 	stp	w4, w2, [x1, 56]
-	.loc 1 1308 0
+	.loc 1 1441 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL110:
-	.loc 1 1310 0
+.LVL112:
+	.loc 1 1443 0
 	ldr	w0, [x20, 80]
-	cbnz	w0, .L134
-	.loc 1 1311 0
+	cbnz	w0, .L127
+	.loc 1 1444 0
 	mov	w2, 1
 	str	w2, [x20, 80]
-	.loc 1 1312 0
+	.loc 1 1445 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	mov	x22, 0
 	bl	__wake_up_sync
-.LVL111:
-	b	.L94
-.LVL112:
+.LVL113:
+	b	.L87
+.LVL114:
 	.p2align 3
-.L230:
-.LBB1031:
-.LBB964:
-.LBB961:
-.LBB951:
-.LBB952:
-.LBB953:
-.LBB954:
-.LBB955:
+.L223:
+.LBB1011:
+.LBB944:
+.LBB941:
+.LBB931:
+.LBB932:
+.LBB933:
+.LBB934:
+.LBB935:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL113:
-.LBE955:
-.LBE954:
-.LBE953:
-.LBB956:
-.LBB957:
+.LVL115:
+.LBE935:
+.LBE934:
+.LBE933:
+.LBB936:
+.LBB937:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL114:
+.LVL116:
 #NO_APP
-.LBE957:
-.LBE956:
-.LBB958:
+.LBE937:
+.LBE936:
+.LBB938:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL115:
-.LBE958:
+.LVL117:
+.LBE938:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL116:
+.LVL118:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL117:
+.LVL119:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE952:
-.LBE951:
+.LBE932:
+.LBE931:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
-.LVL118:
+.LVL120:
 	bl	__arch_copy_to_user
-.LVL119:
+.LVL121:
 	sxtw	x22, w0
-	b	.L158
-.LVL120:
+	b	.L151
+.LVL122:
 	.p2align 3
-.L109:
-.LBE961:
-.LBE964:
-.LBE1031:
-	.loc 1 1236 0
+.L102:
+.LBE941:
+.LBE944:
+.LBE1011:
+	.loc 1 1369 0
 	bl	ebc_osd_buf_get
-.LVL121:
-	.loc 1 1237 0
-	cbz	x0, .L119
-	.loc 1 1240 0
+.LVL123:
+	.loc 1 1370 0
+	cbz	x0, .L112
+	.loc 1 1373 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
-.LVL122:
-.LBB1032:
-.LBB1033:
-.LBB1034:
-.LBB1035:
-.LBB1036:
-.LBB1037:
-.LBB1038:
+.LVL124:
+.LBB1012:
+.LBB1013:
+.LBB1014:
+.LBB1015:
+.LBB1016:
+.LBB1017:
+.LBB1018:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL123:
+.LVL125:
 #NO_APP
-.LBE1038:
-.LBE1037:
+.LBE1018:
+.LBE1017:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1036:
-.LBE1035:
-.LBE1034:
-.LBE1033:
-.LBE1032:
-	.loc 1 1240 0
+.LBE1016:
+.LBE1015:
+.LBE1014:
+.LBE1013:
+.LBE1012:
+	.loc 1 1373 0
 	sub	w0, w22, w0
-	.loc 1 1245 0
+	.loc 1 1378 0
 	ldr	w1, [x20, 176]
-	.loc 1 1244 0
+	.loc 1 1377 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1243 0
+	.loc 1 1376 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1245 0
+	.loc 1 1378 0
 	str	w1, [x29, 120]
-	.loc 1 1242 0
+	.loc 1 1375 0
 	str	w0, [x29, 104]
-.LBB1065:
-.LBB1062:
-.LBB1059:
-.LBB1048:
 .LBB1045:
+.LBB1042:
+.LBB1039:
+.LBB1028:
+.LBB1025:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL124:
+.LVL126:
 	.loc 6 84 0
-	tbz	x3, 21, .L238
-.LVL125:
-.L115:
-.LBB1039:
-.LBB1040:
-.LBB1041:
+	tbz	x3, 21, .L231
+.LVL127:
+.L108:
+.LBB1019:
+.LBB1020:
+.LBB1021:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL126:
-.LBE1041:
-.LBE1040:
+.LVL128:
+.LBE1021:
+.LBE1020:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL127:
-.L116:
-.LBE1039:
+.LVL129:
+.L109:
+.LBE1019:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1451,121 +1558,121 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL128:
+.LVL130:
 #NO_APP
-.LBE1045:
-.LBE1048:
+.LBE1025:
+.LBE1028:
 	.loc 9 132 0
 	mov	x22, 44
-	cbz	x0, .L94
-.LBB1049:
-.LBB1050:
-.LBB1051:
-.LBB1052:
-.LBB1053:
+	cbz	x0, .L87
+.LBB1029:
+.LBB1030:
+.LBB1031:
+.LBB1032:
+.LBB1033:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL129:
-.LBE1053:
-.LBE1052:
-.LBE1051:
-.LBB1054:
-.LBB1055:
+.LVL131:
+.LBE1033:
+.LBE1032:
+.LBE1031:
+.LBB1034:
+.LBB1035:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL130:
+.LVL132:
 #NO_APP
-.LBE1055:
-.LBE1054:
-.LBB1056:
+.LBE1035:
+.LBE1034:
+.LBB1036:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL131:
-.LBE1056:
+.LVL133:
+.LBE1036:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL132:
+.LVL134:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL133:
+.LVL135:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1050:
-.LBE1049:
+.LBE1030:
+.LBE1029:
 	.loc 9 134 0
 	mov	x2, x22
 	add	x1, x29, 104
-.LVL134:
+.LVL136:
 	bl	__arch_copy_to_user
-.LVL135:
+.LVL137:
 	sxtw	x22, w0
-	b	.L94
-.LVL136:
+	b	.L87
+.LVL138:
 	.p2align 3
-.L105:
-.LBE1059:
-.LBE1062:
-.LBE1065:
-.LBB1066:
-.LBB1067:
-.LBB1068:
-.LBB1069:
-.LBB1070:
-.LBB1071:
-.LBB1072:
+.L98:
+.LBE1039:
+.LBE1042:
+.LBE1045:
+.LBB1046:
+.LBB1047:
+.LBB1048:
+.LBB1049:
+.LBB1050:
+.LBB1051:
+.LBB1052:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL137:
+.LVL139:
 #NO_APP
-.LBE1072:
-.LBE1071:
+.LBE1052:
+.LBE1051:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
-.LBE1070:
-.LBE1069:
-.LBE1068:
-.LBE1067:
-.LBE1066:
-	.loc 1 1326 0
+.LBE1050:
+.LBE1049:
+.LBE1048:
+.LBE1047:
+.LBE1046:
+	.loc 1 1459 0
 	add	x22, x20, 232
-.LBB1101:
-.LBB1097:
-.LBB1093:
-.LBB1082:
-.LBB1079:
+.LBB1081:
+.LBB1077:
+.LBB1073:
+.LBB1062:
+.LBB1059:
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
-.LVL138:
+.LVL140:
 	.loc 6 84 0
-	tbz	x2, 21, .L239
-.LVL139:
-.L139:
-.LBB1073:
-.LBB1074:
-.LBB1075:
+	tbz	x2, 21, .L232
+.LVL141:
+.L132:
+.LBB1053:
+.LBB1054:
+.LBB1055:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL140:
-.LBE1075:
-.LBE1074:
+.LVL142:
+.LBE1055:
+.LBE1054:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL141:
-.L140:
-.LBE1073:
+.LVL143:
+.L133:
+.LBE1053:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1576,39 +1683,39 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL142:
+.LVL144:
 #NO_APP
 	mov	x3, x0
-.LBE1079:
-.LBE1082:
+.LBE1059:
+.LBE1062:
 	.loc 9 114 0
-	cbz	x0, .L168
-.LBB1083:
-.LBB1084:
-.LBB1085:
-.LBB1086:
-.LBB1087:
+	cbz	x0, .L161
+.LBB1063:
+.LBB1064:
+.LBB1065:
+.LBB1066:
+.LBB1067:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LBE1087:
-.LBE1086:
-.LBE1085:
-.LBB1088:
-.LBB1089:
+.LBE1067:
+.LBE1066:
+.LBE1065:
+.LBB1068:
+.LBB1069:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL143:
+.LVL145:
 #NO_APP
-.LBE1089:
-.LBE1088:
-.LBB1090:
+.LBE1069:
+.LBE1068:
+.LBB1070:
 	.loc 6 254 0
 	and	x0, x0, x21
-.LVL144:
-.LBE1090:
+.LVL146:
+.LBE1070:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1617,82 +1724,84 @@ ebc_io_ctl:
 	csel	x1, x21, xzr, eq
 
 // 0 "" 2
-.LVL145:
+.LVL147:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1084:
-.LBE1083:
+.LBE1064:
+.LBE1063:
 	.loc 9 116 0
 	mov	x2, 4
 	mov	x0, x22
-.LVL146:
+.LVL148:
 	bl	__arch_copy_from_user
-.LVL147:
+.LVL149:
 	.loc 9 118 0
-	cbnz	x0, .L240
-.LBE1093:
-.LBE1097:
-.LBE1101:
-	.loc 1 1330 0
+	cbnz	x0, .L233
+.LBE1073:
+.LBE1077:
+.LBE1081:
+	.loc 1 1463 0
 	add	x20, x20, 184
 	ldr	w2, [x20, 48]
 	ldr	x0, [x20, 88]
-.LVL148:
-	.loc 1 1331 0
+.LVL150:
+	.loc 1 1464 0
 	mov	x22, 0
-	.loc 1 1330 0
+	.loc 1 1463 0
 	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	_dev_info
-.LVL149:
-	.loc 1 1331 0
-	b	.L94
-.LVL150:
+.LVL151:
+	.loc 1 1464 0
+	b	.L87
+.LVL152:
 	.p2align 3
-.L99:
-	.loc 1 1323 0
+.L92:
+	.loc 1 1456 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC3
-.LVL151:
-	.loc 1 1321 0
-	str	wzr, [x20, 796]
-	.loc 1 1324 0
+.LVL153:
+	.loc 1 1454 0
+	str	wzr, [x20, 788]
+	.loc 1 1457 0
 	mov	x22, 0
-	.loc 1 1322 0
-	str	wzr, [x20, 800]
-	.loc 1 1323 0
+	.loc 1 1455 0
+	str	wzr, [x20, 792]
+	.loc 1 1456 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
-.LVL152:
-	.loc 1 1324 0
-	b	.L94
-.LVL153:
+.LVL154:
+	.loc 1 1457 0
+	b	.L87
+.LVL155:
 	.p2align 3
-.L107:
-	.loc 1 1360 0
+.L100:
+	.loc 1 1493 0
 	bl	ebc_empty_buf_get
-.LVL154:
+.LVL156:
 	mov	x23, x0
-	.loc 1 1361 0
-	cbz	x0, .L119
-	.loc 1 1363 0
+	.loc 1 1494 0
+	cbz	x0, .L112
+	.loc 1 1496 0
+	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 320]
-	ldp	w2, w3, [x20, 108]
-	b	.L225
-.LVL155:
+	ldr	x0, [x0, 16]
+	mul	w2, w2, w3
+	b	.L218
+.LVL157:
 	.p2align 3
-.L112:
-	.loc 1 1347 0
+.L105:
+	.loc 1 1480 0
 	bl	ebc_empty_buf_get
-.LVL156:
+.LVL158:
 	mov	x23, x0
-	.loc 1 1348 0
-	cbz	x0, .L119
-	.loc 1 1350 0
+	.loc 1 1481 0
+	cbz	x0, .L112
+	.loc 1 1483 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 312]
@@ -1700,119 +1809,119 @@ ebc_io_ctl:
 	mul	w2, w2, w3
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL157:
-	.loc 1 1351 0
+.LVL159:
+	.loc 1 1484 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
-.LVL158:
+.LVL160:
 	sub	w0, w20, w0
-.LBB1102:
-.LBB1103:
-.LBB1104:
-.LBB1105:
-.LBB1106:
-.LBB1107:
-.LBB1108:
+.LBB1082:
+.LBB1083:
+.LBB1084:
+.LBB1085:
+.LBB1086:
+.LBB1087:
+.LBB1088:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL159:
+.LVL161:
 #NO_APP
-.LBE1108:
-.LBE1107:
+.LBE1088:
+.LBE1087:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1106:
-.LBE1105:
-.LBE1104:
-.LBE1103:
-.LBE1102:
-	.loc 1 1354 0
+.LBE1086:
+.LBE1085:
+.LBE1084:
+.LBE1083:
+.LBE1082:
+	.loc 1 1487 0
 	ldp	w4, w1, [x22, 84]
-	.loc 1 1352 0
+	.loc 1 1485 0
 	str	w0, [x29, 104]
-	.loc 1 1353 0
+	.loc 1 1486 0
 	stp	w1, w4, [x29, 112]
-.LBB1113:
-.LBB1112:
-.LBB1111:
-.LBB1110:
-.LBB1109:
+.LBB1093:
+.LBB1092:
+.LBB1091:
+.LBB1090:
+.LBB1089:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL160:
+.LVL162:
 	.loc 6 84 0
-	tbnz	x3, 21, .L156
-	b	.L222
-.LVL161:
+	tbnz	x3, 21, .L149
+	b	.L215
+.LVL163:
 	.p2align 3
-.L101:
-.LBE1109:
-.LBE1110:
-.LBE1111:
-.LBE1112:
-.LBE1113:
-.LBB1114:
-.LBB1115:
-.LBB1116:
-.LBB1117:
-.LBB1118:
-.LBB1119:
-.LBB1120:
+.L94:
+.LBE1089:
+.LBE1090:
+.LBE1091:
+.LBE1092:
+.LBE1093:
+.LBB1094:
+.LBB1095:
+.LBB1096:
+.LBB1097:
+.LBB1098:
+.LBB1099:
+.LBB1100:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL162:
+.LVL164:
 #NO_APP
-.LBE1120:
-.LBE1119:
+.LBE1100:
+.LBE1099:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1118:
-.LBE1117:
-.LBE1116:
-.LBE1115:
-.LBE1114:
-	.loc 1 1337 0
+.LBE1098:
+.LBE1097:
+.LBE1096:
+.LBE1095:
+.LBE1094:
+	.loc 1 1470 0
 	ldp	w1, w0, [x20, 116]
-.LVL163:
+.LVL165:
 	stp	w1, w0, [x29, 140]
-	.loc 1 1334 0
+	.loc 1 1467 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 1333 0
+	.loc 1 1466 0
 	stp	w5, w6, [x29, 112]
-	.loc 1 1335 0
+	.loc 1 1468 0
 	ldr	w4, [x20, 176]
 	str	w4, [x29, 120]
-.LBB1149:
-.LBB1145:
-.LBB1141:
-.LBB1130:
-.LBB1127:
+.LBB1129:
+.LBB1125:
+.LBB1121:
+.LBB1110:
+.LBB1107:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL164:
+.LVL166:
 	.loc 6 84 0
-	tbz	x3, 21, .L241
-.LVL165:
-.L143:
-.LBB1121:
-.LBB1122:
-.LBB1123:
+	tbz	x3, 21, .L234
+.LVL167:
+.L136:
+.LBB1101:
+.LBB1102:
+.LBB1103:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL166:
-.LBE1123:
-.LBE1122:
+.LVL168:
+.LBE1103:
+.LBE1102:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL167:
-.L144:
-.LBE1121:
+.LVL169:
+.L137:
+.LBE1101:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1823,119 +1932,119 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL168:
+.LVL170:
 #NO_APP
-.LBE1127:
-.LBE1130:
+.LBE1107:
+.LBE1110:
 	.loc 9 132 0
-	cbnz	x0, .L145
-.L146:
-.LBE1141:
-.LBE1145:
-.LBE1149:
-	.loc 1 1340 0
+	cbnz	x0, .L138
+.L139:
+.LBE1121:
+.LBE1125:
+.LBE1129:
+	.loc 1 1473 0
 	ldr	x0, [x20, 272]
-.LVL169:
+.LVL171:
 	adrp	x1, .LC5
-.LVL170:
-	.loc 1 1341 0
+.LVL172:
+	.loc 1 1474 0
 	mov	x22, -14
-	.loc 1 1340 0
+	.loc 1 1473 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
-.LVL171:
-	.loc 1 1341 0
-	b	.L94
-.LVL172:
+.LVL173:
+	.loc 1 1474 0
+	b	.L87
+.LVL174:
 	.p2align 3
-.L98:
-	.loc 1 1401 0
+.L91:
+	.loc 1 1534 0
 	ldr	x0, [x20, 272]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
-.LVL173:
+.LVL175:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
-	.loc 1 1402 0
+	.loc 1 1535 0
 	mov	x22, 0
-	.loc 1 1401 0
+	.loc 1 1534 0
 	bl	_dev_err
-.LVL174:
-	.loc 1 1405 0
-	b	.L94
-.LVL175:
+.LVL176:
+	.loc 1 1538 0
+	b	.L87
+.LVL177:
 	.p2align 3
-.L103:
-	.loc 1 1250 0
+.L96:
+	.loc 1 1383 0
 	bl	ebc_empty_buf_get
-.LVL176:
+.LVL178:
 	mov	x23, x0
-	.loc 1 1251 0
-	cbz	x0, .L119
-	.loc 1 1254 0
+	.loc 1 1384 0
+	cbz	x0, .L112
+	.loc 1 1387 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
-.LVL177:
-.LBB1150:
-.LBB1151:
-.LBB1152:
-.LBB1153:
-.LBB1154:
-.LBB1155:
-.LBB1156:
+.LVL179:
+.LBB1130:
+.LBB1131:
+.LBB1132:
+.LBB1133:
+.LBB1134:
+.LBB1135:
+.LBB1136:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL178:
+.LVL180:
 #NO_APP
-.LBE1156:
-.LBE1155:
+.LBE1136:
+.LBE1135:
 	.loc 6 85 0
 	ldr	w3, [x2, 52]
-.LBE1154:
-.LBE1153:
-.LBE1152:
-.LBE1151:
-.LBE1150:
-	.loc 1 1254 0
+.LBE1134:
+.LBE1133:
+.LBE1132:
+.LBE1131:
+.LBE1130:
+	.loc 1 1387 0
 	sub	w0, w22, w0
-	.loc 1 1259 0
+	.loc 1 1392 0
 	ldr	w1, [x20, 176]
-	.loc 1 1258 0
+	.loc 1 1391 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1257 0
+	.loc 1 1390 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1259 0
+	.loc 1 1392 0
 	str	w1, [x29, 120]
-	.loc 1 1256 0
+	.loc 1 1389 0
 	str	w0, [x29, 104]
-.LBB1185:
-.LBB1181:
-.LBB1177:
-.LBB1166:
-.LBB1163:
+.LBB1165:
+.LBB1161:
+.LBB1157:
+.LBB1146:
+.LBB1143:
 	.loc 6 77 0
 	ldr	x1, [x2, 8]
-.LVL179:
+.LVL181:
 	.loc 6 84 0
-	tbz	x3, 21, .L242
-.LVL180:
-.L120:
-.LBB1157:
-.LBB1158:
-.LBB1159:
+	tbz	x3, 21, .L235
+.LVL182:
+.L113:
+.LBB1137:
+.LBB1138:
+.LBB1139:
 	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL181:
-.LBE1159:
-.LBE1158:
+.LVL183:
+.LBE1139:
+.LBE1138:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL182:
-.L121:
-.LBE1157:
+.LVL184:
+.L114:
+.LBE1137:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1946,461 +2055,461 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL183:
+.LVL185:
 #NO_APP
-.LBE1163:
-.LBE1166:
+.LBE1143:
+.LBE1146:
 	.loc 9 132 0
-	cbnz	x0, .L122
-.L123:
-.LBE1177:
-.LBE1181:
-.LBE1185:
-	.loc 1 1263 0
+	cbnz	x0, .L115
+.L116:
+.LBE1157:
+.LBE1161:
+.LBE1165:
+	.loc 1 1396 0
 	mov	x0, x23
-.LVL184:
-	.loc 1 1264 0
+.LVL186:
+	.loc 1 1397 0
 	mov	x22, -14
-	.loc 1 1263 0
+	.loc 1 1396 0
 	bl	ebc_buf_release
-.LVL185:
-	.loc 1 1264 0
-	b	.L94
-.LVL186:
-	.p2align 3
-.L237:
-.LBB1186:
-.LBB1029:
-.LBB1027:
-.LBB1025:
-.LBB1015:
-.LBB1012:
-.LBB1013:
-.LBB1014:
-	.loc 7 106 0
-	ldr	x2, [x0]
-.LBE1014:
-.LBE1013:
-.LBE1012:
-.LBE1015:
-.LBE1025:
-.LBE1027:
-.LBE1029:
-.LBE1186:
-	.loc 1 1209 0
-	mov	x0, x21
 .LVL187:
-.LBB1187:
-.LBB1030:
-.LBB1028:
-.LBB1026:
-.LBB1016:
-	.loc 6 84 0
-	tbz	x2, 26, .L137
-	b	.L136
+	.loc 1 1397 0
+	b	.L87
 .LVL188:
 	.p2align 3
-.L233:
-.LBE1016:
-.LBE1026:
-.LBE1028:
-.LBE1030:
-.LBE1187:
-.LBB1188:
-.LBB994:
+.L230:
+.LBB1166:
+.LBB1009:
+.LBB1007:
+.LBB1005:
+.LBB995:
 .LBB992:
-.LBB990:
-.LBB980:
-.LBB977:
-.LBB978:
-.LBB979:
+.LBB993:
+.LBB994:
 	.loc 7 106 0
 	ldr	x2, [x0]
-.LBE979:
-.LBE978:
-.LBE977:
-.LBE980:
-.LBE990:
-.LBE992:
 .LBE994:
-.LBE1188:
-	.loc 1 1209 0
+.LBE993:
+.LBE992:
+.LBE995:
+.LBE1005:
+.LBE1007:
+.LBE1009:
+.LBE1166:
+	.loc 1 1342 0
 	mov	x0, x21
 .LVL189:
-.LBB1189:
-.LBB995:
-.LBB993:
-.LBB991:
-.LBB981:
+.LBB1167:
+.LBB1010:
+.LBB1008:
+.LBB1006:
+.LBB996:
 	.loc 6 84 0
-	tbz	x2, 26, .L125
-	b	.L124
+	tbz	x2, 26, .L130
+	b	.L129
 .LVL190:
 	.p2align 3
-.L241:
-.LBE981:
-.LBE991:
-.LBE993:
-.LBE995:
-.LBE1189:
-.LBB1190:
-.LBB1146:
-.LBB1142:
-.LBB1131:
-.LBB1128:
-.LBB1124:
-.LBB1125:
+.L226:
+.LBE996:
+.LBE1006:
+.LBE1008:
+.LBE1010:
+.LBE1167:
+.LBB1168:
+.LBB974:
+.LBB972:
+.LBB970:
+.LBB960:
+.LBB957:
+.LBB958:
+.LBB959:
+	.loc 7 106 0
+	ldr	x2, [x0]
+.LBE959:
+.LBE958:
+.LBE957:
+.LBE960:
+.LBE970:
+.LBE972:
+.LBE974:
+.LBE1168:
+	.loc 1 1342 0
+	mov	x0, x21
+.LVL191:
+.LBB1169:
+.LBB975:
+.LBB973:
+.LBB971:
+.LBB961:
+	.loc 6 84 0
+	tbz	x2, 26, .L118
+	b	.L117
+.LVL192:
+	.p2align 3
+.L234:
+.LBE961:
+.LBE971:
+.LBE973:
+.LBE975:
+.LBE1169:
+.LBB1170:
 .LBB1126:
+.LBB1122:
+.LBB1111:
+.LBB1108:
+.LBB1104:
+.LBB1105:
+.LBB1106:
 	.loc 7 106 0
 	ldr	x2, [x2]
-.LVL191:
+.LVL193:
+.LBE1106:
+.LBE1105:
+.LBE1104:
+.LBE1108:
+.LBE1111:
+.LBE1122:
 .LBE1126:
-.LBE1125:
-.LBE1124:
-.LBE1128:
-.LBE1131:
-.LBE1142:
-.LBE1146:
-.LBE1190:
-	.loc 1 1209 0
+.LBE1170:
+	.loc 1 1342 0
 	mov	x0, x21
-.LVL192:
-.LBB1191:
-.LBB1147:
-.LBB1143:
-.LBB1132:
-.LBB1129:
+.LVL194:
+.LBB1171:
+.LBB1127:
+.LBB1123:
+.LBB1112:
+.LBB1109:
 	.loc 6 84 0
-	tbz	x2, 26, .L144
-	b	.L143
-.LVL193:
+	tbz	x2, 26, .L137
+	b	.L136
+.LVL195:
 	.p2align 3
-.L239:
-.LBE1129:
-.LBE1132:
-.LBE1143:
-.LBE1147:
-.LBE1191:
-.LBB1192:
-.LBB1098:
-.LBB1094:
-.LBB1091:
-.LBB1080:
-.LBB1076:
-.LBB1077:
+.L232:
+.LBE1109:
+.LBE1112:
+.LBE1123:
+.LBE1127:
+.LBE1171:
+.LBB1172:
 .LBB1078:
+.LBB1074:
+.LBB1071:
+.LBB1060:
+.LBB1056:
+.LBB1057:
+.LBB1058:
 	.loc 7 106 0
 	ldr	x2, [x0]
+.LBE1058:
+.LBE1057:
+.LBE1056:
+.LBE1060:
+.LBE1071:
+.LBE1074:
 .LBE1078:
-.LBE1077:
-.LBE1076:
-.LBE1080:
-.LBE1091:
-.LBE1094:
-.LBE1098:
-.LBE1192:
-	.loc 1 1209 0
+.LBE1172:
+	.loc 1 1342 0
 	mov	x0, x21
-.LVL194:
-.LBB1193:
-.LBB1099:
-.LBB1095:
-.LBB1092:
-.LBB1081:
+.LVL196:
+.LBB1173:
+.LBB1079:
+.LBB1075:
+.LBB1072:
+.LBB1061:
 	.loc 6 84 0
-	tbz	x2, 26, .L140
-	b	.L139
-.LVL195:
+	tbz	x2, 26, .L133
+	b	.L132
+.LVL197:
 	.p2align 3
-.L242:
-.LBE1081:
-.LBE1092:
-.LBE1095:
-.LBE1099:
-.LBE1193:
-.LBB1194:
-.LBB1182:
-.LBB1178:
-.LBB1167:
-.LBB1164:
-.LBB1160:
-.LBB1161:
+.L235:
+.LBE1061:
+.LBE1072:
+.LBE1075:
+.LBE1079:
+.LBE1173:
+.LBB1174:
 .LBB1162:
+.LBB1158:
+.LBB1147:
+.LBB1144:
+.LBB1140:
+.LBB1141:
+.LBB1142:
 	.loc 7 106 0
 	ldr	x2, [x2]
-.LVL196:
+.LVL198:
+.LBE1142:
+.LBE1141:
+.LBE1140:
+.LBE1144:
+.LBE1147:
+.LBE1158:
 .LBE1162:
-.LBE1161:
-.LBE1160:
-.LBE1164:
-.LBE1167:
-.LBE1178:
-.LBE1182:
-.LBE1194:
-	.loc 1 1209 0
+.LBE1174:
+	.loc 1 1342 0
 	mov	x0, x21
-.LVL197:
-.LBB1195:
-.LBB1183:
-.LBB1179:
-.LBB1168:
-.LBB1165:
+.LVL199:
+.LBB1175:
+.LBB1163:
+.LBB1159:
+.LBB1148:
+.LBB1145:
 	.loc 6 84 0
-	tbz	x2, 26, .L121
-	b	.L120
-.LVL198:
+	tbz	x2, 26, .L114
+	b	.L113
+.LVL200:
 	.p2align 3
-.L238:
-.LBE1165:
-.LBE1168:
-.LBE1179:
-.LBE1183:
-.LBE1195:
-.LBB1196:
-.LBB1063:
-.LBB1060:
-.LBB1057:
-.LBB1046:
-.LBB1042:
+.L231:
+.LBE1145:
+.LBE1148:
+.LBE1159:
+.LBE1163:
+.LBE1175:
+.LBB1176:
 .LBB1043:
-.LBB1044:
+.LBB1040:
+.LBB1037:
+.LBB1026:
+.LBB1022:
+.LBB1023:
+.LBB1024:
 	.loc 7 106 0
 	ldr	x2, [x2]
-.LVL199:
-.LBE1044:
+.LVL201:
+.LBE1024:
+.LBE1023:
+.LBE1022:
+.LBE1026:
+.LBE1037:
+.LBE1040:
 .LBE1043:
-.LBE1042:
-.LBE1046:
-.LBE1057:
-.LBE1060:
-.LBE1063:
-.LBE1196:
-	.loc 1 1209 0
+.LBE1176:
+	.loc 1 1342 0
 	mov	x0, x21
-.LVL200:
-.LBB1197:
-.LBB1064:
-.LBB1061:
-.LBB1058:
-.LBB1047:
+.LVL202:
+.LBB1177:
+.LBB1044:
+.LBB1041:
+.LBB1038:
+.LBB1027:
 	.loc 6 84 0
-	tbz	x2, 26, .L116
-	b	.L115
-.LVL201:
+	tbz	x2, 26, .L109
+	b	.L108
+.LVL203:
 	.p2align 3
-.L145:
-.LBE1047:
-.LBE1058:
-.LBE1061:
-.LBE1064:
-.LBE1197:
-.LBB1198:
-.LBB1148:
-.LBB1144:
-.LBB1133:
-.LBB1134:
-.LBB1135:
-.LBB1136:
-.LBB1137:
+.L138:
+.LBE1027:
+.LBE1038:
+.LBE1041:
+.LBE1044:
+.LBE1177:
+.LBB1178:
+.LBB1128:
+.LBB1124:
+.LBB1113:
+.LBB1114:
+.LBB1115:
+.LBB1116:
+.LBB1117:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL202:
-.LBE1137:
-.LBE1136:
-.LBE1135:
-.LBB1138:
-.LBB1139:
+.LVL204:
+.LBE1117:
+.LBE1116:
+.LBE1115:
+.LBB1118:
+.LBB1119:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL203:
+.LVL205:
 #NO_APP
-.LBE1139:
-.LBE1138:
-.LBB1140:
+.LBE1119:
+.LBE1118:
+.LBB1120:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL204:
-.LBE1140:
+.LVL206:
+.LBE1120:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL205:
+.LVL207:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL206:
+.LVL208:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1134:
-.LBE1133:
+.LBE1114:
+.LBE1113:
 	.loc 9 134 0
 	mov	x2, 44
 	add	x1, x29, 104
-.LVL207:
+.LVL209:
 	bl	__arch_copy_to_user
-.LVL208:
-.LBE1144:
-.LBE1148:
-.LBE1198:
-	.loc 1 1339 0
-	cbnz	x0, .L146
-.LBB1199:
-.LBB999:
+.LVL210:
+.LBE1124:
+.LBE1128:
+.LBE1178:
+	.loc 1 1472 0
+	cbnz	x0, .L139
+.LBB1179:
+.LBB979:
 	mov	x22, 0
-	b	.L94
-.LVL209:
+	b	.L87
+.LVL211:
 	.p2align 3
-.L122:
-.LBE999:
-.LBE1199:
-.LBB1200:
-.LBB1184:
+.L115:
+.LBE979:
+.LBE1179:
 .LBB1180:
-.LBB1169:
-.LBB1170:
-.LBB1171:
-.LBB1172:
-.LBB1173:
+.LBB1164:
+.LBB1160:
+.LBB1149:
+.LBB1150:
+.LBB1151:
+.LBB1152:
+.LBB1153:
 	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL210:
-.LBE1173:
-.LBE1172:
-.LBE1171:
-.LBB1174:
-.LBB1175:
+.LVL212:
+.LBE1153:
+.LBE1152:
+.LBE1151:
+.LBB1154:
+.LBB1155:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL211:
+.LVL213:
 #NO_APP
-.LBE1175:
-.LBE1174:
-.LBB1176:
+.LBE1155:
+.LBE1154:
+.LBB1156:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL212:
-.LBE1176:
+.LVL214:
+.LBE1156:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL213:
+.LVL215:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL214:
+.LVL216:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1170:
-.LBE1169:
+.LBE1150:
+.LBE1149:
 	.loc 9 134 0
 	mov	x2, 44
 	add	x1, x29, 104
-.LVL215:
+.LVL217:
 	bl	__arch_copy_to_user
-.LVL216:
+.LVL218:
+.LBE1160:
+.LBE1164:
 .LBE1180:
-.LBE1184:
-.LBE1200:
-	.loc 1 1262 0
-	cbnz	w0, .L123
-.LBB1201:
-.LBB1000:
+	.loc 1 1395 0
+	cbnz	w0, .L116
+.LBB1181:
+.LBB980:
 	mov	x22, 0
-	b	.L94
-.LVL217:
+	b	.L87
+.LVL219:
 	.p2align 3
-.L127:
-.LBE1000:
-.LBE1201:
-	.loc 1 1270 0
+.L120:
+.LBE980:
+.LBE1181:
+	.loc 1 1403 0
 	mov	x22, -14
-	b	.L94
-.LVL218:
+	b	.L87
+.LVL220:
 	.p2align 3
-.L234:
-	.loc 1 1285 0
+.L227:
+	.loc 1 1418 0
 	mov	w2, 1
 	str	w2, [x20, 80]
-	.loc 1 1286 0
+	.loc 1 1419 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL219:
-	b	.L129
+.LVL221:
+	b	.L122
 	.p2align 3
-.L235:
-	.loc 1 1288 0 discriminator 1
-	ldr	w0, [x20, 600]
-	cbz	w0, .L131
-.LBB1202:
-.LBB1001:
+.L228:
+	.loc 1 1421 0 discriminator 1
+	ldr	w0, [x20, 592]
+	cbz	w0, .L124
+.LBB1182:
+.LBB981:
 	mov	x22, 0
-	b	.L94
-.LVL220:
-.L119:
-.LBE1001:
-.LBE1202:
-	.loc 1 1238 0
+	b	.L87
+.LVL222:
+.L112:
+.LBE981:
+.LBE1182:
+	.loc 1 1371 0
 	mov	x22, -1
-	b	.L94
-.LVL221:
-.L168:
-.LBB1203:
-.LBB1100:
-.LBB1096:
+	b	.L87
+.LVL223:
+.L161:
+.LBB1183:
+.LBB1080:
+.LBB1076:
 	.loc 9 112 0
 	mov	x0, 4
-.LVL222:
-.L141:
+.LVL224:
+.L134:
 	.loc 9 119 0
 	mov	x2, x0
 	mov	w1, 0
-.LVL223:
+.LVL225:
 	add	x0, x22, x3
-.LVL224:
+.LVL226:
 	bl	memset
-.LVL225:
-.LBE1096:
-.LBE1100:
-.LBE1203:
-	.loc 1 1327 0
+.LVL227:
+.LBE1076:
+.LBE1080:
+.LBE1183:
+	.loc 1 1460 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC4
-	.loc 1 1328 0
+	.loc 1 1461 0
 	mov	x22, -14
-	.loc 1 1327 0
+	.loc 1 1460 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
-.LVL226:
-	.loc 1 1328 0
-	b	.L94
-.L232:
-	.loc 1 1406 0
+.LVL228:
+	.loc 1 1461 0
+	b	.L87
+.L225:
+	.loc 1 1539 0
 	bl	__stack_chk_fail
-.LVL227:
-.L240:
+.LVL229:
+.L233:
 	mov	x3, 4
 	sub	x3, x3, x0
-.LVL228:
-	b	.L141
+.LVL230:
+	b	.L134
 	.cfi_endproc
 .LFE2824:
 	.size	ebc_io_ctl, .-ebc_io_ctl
@@ -2409,44 +2518,44 @@ ebc_io_ctl:
 	.type	frame_done_callback, %function
 frame_done_callback:
 .LFB2816:
-	.loc 1 634 0
+	.loc 1 767 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 635 0
+	.loc 1 768 0
 	adrp	x0, .LANCHOR0
-	.loc 1 634 0
+	.loc 1 767 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 635 0
+	.loc 1 768 0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 634 0
+	.loc 1 767 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 638 0
+	.loc 1 771 0
 	add	x19, x20, 184
-	ldr	x1, [x19, 216]
+	ldr	x1, [x19, 208]
 	ldr	w1, [x1, 40]
-	tbnz	w1, #31, .L244
+	tbnz	w1, #31, .L237
 	cmp	w1, 1
-	ble	.L245
+	ble	.L238
 	cmp	w1, 18
-	bne	.L244
-.L245:
-	.loc 1 642 0
+	bne	.L237
+.L238:
+	.loc 1 775 0
 	ldr	w1, [x19, 36]
-	cbz	w1, .L246
-	.loc 1 643 0
+	cbz	w1, .L239
+	.loc 1 776 0
 	add	x0, x0, :lo12:.LANCHOR0
 	ldr	x0, [x0, 8]
 	bl	wake_up_process
-.LVL229:
-	.loc 1 669 0
+.LVL231:
+	.loc 1 802 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -2459,42 +2568,42 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L244:
+.L237:
 	.cfi_restore_state
-	.loc 1 657 0
+	.loc 1 790 0
 	ldr	w1, [x19, 40]
-	cbnz	w1, .L253
-	.loc 1 663 0
+	cbnz	w1, .L246
+	.loc 1 796 0
 	ldr	x0, [x19, 88]
-	.loc 1 662 0
+	.loc 1 795 0
 	mov	w20, 1
-	.loc 1 661 0
+	.loc 1 794 0
 	str	wzr, [x19, 28]
-	.loc 1 663 0
+	.loc 1 796 0
 	adrp	x1, .LC9
-	.loc 1 662 0
+	.loc 1 795 0
 	str	w20, [x19, 76]
-	.loc 1 663 0
+	.loc 1 796 0
 	add	x1, x1, :lo12:.LC9
-	.loc 1 664 0
+	.loc 1 797 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
-	.loc 1 663 0
+	.loc 1 796 0
 	bl	_dev_info
-.LVL230:
-	.loc 1 664 0
+.LVL232:
+	.loc 1 797 0
 	mov	w2, w20
 	add	x0, x19, 352
 	mov	w1, w20
 	bl	__wake_up_sync
-.LVL231:
-	.loc 1 665 0
+.LVL233:
+	.loc 1 798 0
 	mov	w2, w20
 	mov	w1, w20
 	add	x0, x19, 304
 	bl	__wake_up_sync
-.LVL232:
-	.loc 1 669 0
+.LVL234:
+	.loc 1 802 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -2507,52 +2616,51 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L246:
+.L239:
 	.cfi_restore_state
-	.loc 1 646 0
+	.loc 1 779 0
 	ldr	x0, [x19, 88]
 	adrp	x1, .LC8
 	add	x1, x1, :lo12:.LC8
-	.loc 1 651 0
+	.loc 1 784 0
 	mov	w21, 1
-	.loc 1 646 0
+	.loc 1 779 0
 	bl	_dev_info
-.LVL233:
-	.loc 1 648 0
-	ldp	w2, w3, [x20, 108]
+.LVL235:
+	.loc 1 781 0
+	ldp	w3, w2, [x20, 108]
 	mov	w1, 0
-	ldr	x0, [x19, 160]
-	mul	w2, w2, w3
-	lsr	w2, w2, 4
+	ldr	x0, [x19, 152]
+	mul	w2, w3, w2
 	bl	memset
-.LVL234:
-	.loc 1 649 0
+.LVL236:
+	.loc 1 782 0
 	adrp	x2, jiffies
-	add	x0, x20, 680
+	add	x0, x20, 672
 	mov	x1, 402653184
 	ldr	x2, [x2, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL235:
-	.loc 1 651 0
+.LVL237:
+	.loc 1 784 0
 	str	w21, [x19, 76]
-	.loc 1 650 0
+	.loc 1 783 0
 	str	wzr, [x19, 28]
-	.loc 1 652 0
+	.loc 1 785 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x19, 352
 	bl	__wake_up_sync
-.LVL236:
-	.loc 1 653 0
+.LVL238:
+	.loc 1 786 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x19, 304
 	bl	__wake_up_sync
-.LVL237:
-	.loc 1 669 0
+.LVL239:
+	.loc 1 802 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -2565,18 +2673,18 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L253:
+.L246:
 	.cfi_restore_state
-	.loc 1 659 0
+	.loc 1 792 0
 	add	x0, x0, :lo12:.LANCHOR0
-	.loc 1 658 0
+	.loc 1 791 0
 	mov	w1, 1
 	str	w1, [x19, 28]
-	.loc 1 659 0
+	.loc 1 792 0
 	ldr	x0, [x0, 8]
 	bl	wake_up_process
-.LVL238:
-	.loc 1 669 0
+.LVL240:
+	.loc 1 802 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -2595,19 +2703,19 @@ frame_done_callback:
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
 .LFB2822:
-	.loc 1 1135 0
+	.loc 1 1268 0
 	.cfi_startproc
-.LVL239:
+.LVL241:
 	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 1136 0
+	.loc 1 1269 0
 	bl	frame_done_callback
-.LVL240:
-	.loc 1 1138 0
+.LVL242:
+	.loc 1 1271 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -2621,16 +2729,16 @@ ebc_frame_timeout:
 	.type	ebc_lut_update, %function
 ebc_lut_update:
 .LFB2817:
-	.loc 1 672 0
+	.loc 1 805 0
 	.cfi_startproc
-.LVL241:
+.LVL243:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 674 0
+	.loc 1 807 0
 	mov	w3, 25
-	.loc 1 672 0
+	.loc 1 805 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x21, x22, [sp, 32]
@@ -2640,77 +2748,77 @@ ebc_lut_update:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -48
 	.cfi_offset 20, -40
-	.loc 1 674 0
+	.loc 1 807 0
 	add	x1, x29, 64
-	.loc 1 672 0
+	.loc 1 805 0
 	adrp	x19, __stack_chk_guard
 	add	x0, x19, :lo12:__stack_chk_guard
-.LVL242:
-	.loc 1 678 0
+.LVL244:
+	.loc 1 811 0
 	ldr	x2, [x21, 16]
-	.loc 1 674 0
+	.loc 1 807 0
 	str	w3, [x1, -12]!
-.LVL243:
-	.loc 1 672 0
+.LVL245:
+	.loc 1 805 0
 	ldr	x3, [x0]
 	str	x3, [x29, 56]
 	mov	x3,0
-.LBB1204:
-.LBB1205:
+.LBB1184:
+.LBB1185:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL244:
+.LVL246:
 	mov	w20, w0
-.LBE1205:
-.LBE1204:
-	.loc 1 679 0
-	cbnz	w0, .L257
-.LVL245:
-	.loc 1 680 0
+.LBE1185:
+.LBE1184:
+	.loc 1 812 0
+	cbnz	w0, .L250
+.LVL247:
+	.loc 1 813 0
 	ldr	w2, [x29, 52]
-	.loc 1 681 0
+	.loc 1 814 0
 	add	x22, x21, 184
-	.loc 1 680 0
-	tbnz	w2, #31, .L280
-	.loc 1 684 0
+	.loc 1 813 0
+	tbnz	w2, #31, .L273
+	.loc 1 817 0
 	cmp	w2, 50
-	bgt	.L281
-.L259:
-	.loc 1 692 0
+	bgt	.L274
+.L252:
+	.loc 1 825 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC12
 	add	x1, x1, :lo12:.LC12
 	bl	_dev_info
-.LVL246:
-	.loc 1 695 0
-	ldr	x0, [x22, 216]
+.LVL248:
+	.loc 1 828 0
+	ldr	x0, [x22, 208]
 	ldr	w0, [x0, 40]
 	cmp	w0, 19
-	bls	.L282
-	.loc 1 744 0
+	bls	.L275
+	.loc 1 877 0
 	ldr	w2, [x29, 52]
-.L279:
+.L272:
 	mov	w1, 7
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL247:
-	cbnz	w0, .L271
-.L274:
-	.loc 1 749 0
-	cbnz	w20, .L272
-.L256:
-	.loc 1 755 0
+.LVL249:
+	cbnz	w0, .L264
+.L267:
+	.loc 1 882 0
+	cbnz	w20, .L265
+.L249:
+	.loc 1 888 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	w0, w20
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L283
+	cbnz	x1, .L276
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL248:
+.LVL250:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -2721,172 +2829,172 @@ ebc_lut_update:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL249:
+.LVL251:
 	.p2align 3
-.L282:
+.L275:
 	.cfi_restore_state
-	.loc 1 695 0
-	adrp	x1, .L262
-	.loc 1 697 0
+	.loc 1 828 0
+	adrp	x1, .L255
+	.loc 1 830 0
 	ldr	w2, [x29, 52]
-	.loc 1 695 0
-	add	x1, x1, :lo12:.L262
+	.loc 1 828 0
+	add	x1, x1, :lo12:.L255
 	ldrb	w0, [x1,w0,uxtw]
-	adr	x1, .Lrtx262
+	adr	x1, .Lrtx255
 	add	x0, x1, w0, sxtb #2
 	br	x0
-.Lrtx262:
+.Lrtx255:
 	.section	.rodata
 	.align	0
 	.align	2
-.L262:
-	.byte	(.L261 - .Lrtx262) / 4
-	.byte	(.L261 - .Lrtx262) / 4
-	.byte	(.L279 - .Lrtx262) / 4
-	.byte	(.L264 - .Lrtx262) / 4
-	.byte	(.L265 - .Lrtx262) / 4
-	.byte	(.L266 - .Lrtx262) / 4
-	.byte	(.L267 - .Lrtx262) / 4
-	.byte	(.L279 - .Lrtx262) / 4
-	.byte	(.L264 - .Lrtx262) / 4
-	.byte	(.L265 - .Lrtx262) / 4
-	.byte	(.L266 - .Lrtx262) / 4
-	.byte	(.L267 - .Lrtx262) / 4
-	.byte	(.L268 - .Lrtx262) / 4
-	.byte	(.L269 - .Lrtx262) / 4
-	.byte	(.L270 - .Lrtx262) / 4
-	.byte	(.L279 - .Lrtx262) / 4
-	.byte	(.L279 - .Lrtx262) / 4
-	.byte	(.L279 - .Lrtx262) / 4
-	.byte	(.L261 - .Lrtx262) / 4
-	.byte	(.L279 - .Lrtx262) / 4
+.L255:
+	.byte	(.L254 - .Lrtx255) / 4
+	.byte	(.L254 - .Lrtx255) / 4
+	.byte	(.L272 - .Lrtx255) / 4
+	.byte	(.L257 - .Lrtx255) / 4
+	.byte	(.L258 - .Lrtx255) / 4
+	.byte	(.L259 - .Lrtx255) / 4
+	.byte	(.L260 - .Lrtx255) / 4
+	.byte	(.L272 - .Lrtx255) / 4
+	.byte	(.L257 - .Lrtx255) / 4
+	.byte	(.L258 - .Lrtx255) / 4
+	.byte	(.L259 - .Lrtx255) / 4
+	.byte	(.L260 - .Lrtx255) / 4
+	.byte	(.L261 - .Lrtx255) / 4
+	.byte	(.L262 - .Lrtx255) / 4
+	.byte	(.L263 - .Lrtx255) / 4
+	.byte	(.L272 - .Lrtx255) / 4
+	.byte	(.L272 - .Lrtx255) / 4
+	.byte	(.L272 - .Lrtx255) / 4
+	.byte	(.L254 - .Lrtx255) / 4
+	.byte	(.L272 - .Lrtx255) / 4
 	.text
 	.p2align 3
-.L270:
-	.loc 1 697 0
+.L263:
+	.loc 1 830 0
 	mov	w1, 1
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL250:
-	cbz	w0, .L274
+.LVL252:
+	cbz	w0, .L267
 	.p2align 2
-.L271:
-	.loc 1 686 0
+.L264:
+	.loc 1 819 0
 	mov	w20, -1
-.L272:
-	.loc 1 750 0
+.L265:
+	.loc 1 883 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC13
 	add	x1, x1, :lo12:.LC13
 	bl	_dev_err
-.LVL251:
-	.loc 1 751 0
-	b	.L256
-.LVL252:
+.LVL253:
+	.loc 1 884 0
+	b	.L249
+.LVL254:
 	.p2align 3
-.L257:
-	.loc 1 690 0
+.L250:
+	.loc 1 823 0
 	add	x22, x21, 184
 	mov	w2, w0
 	adrp	x1, .LC11
 	add	x1, x1, :lo12:.LC11
 	ldr	x0, [x22, 88]
 	bl	_dev_err
-.LVL253:
+.LVL255:
 	ldr	w2, [x29, 52]
-	b	.L259
+	b	.L252
 	.p2align 3
-.L281:
-	.loc 1 685 0
+.L274:
+	.loc 1 818 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC10
 	add	x1, x1, :lo12:.LC10
 	bl	_dev_err
-.LVL254:
-	.loc 1 686 0
+.LVL256:
+	.loc 1 819 0
 	mov	w2, 50
 	str	w2, [x29, 52]
-.LVL255:
-	b	.L259
+.LVL257:
+	b	.L252
 	.p2align 3
-.L265:
-	.loc 1 730 0
+.L258:
+	.loc 1 863 0
 	mov	w1, 9
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL256:
-	cbnz	w0, .L271
-	b	.L274
+.LVL258:
+	cbnz	w0, .L264
+	b	.L267
 	.p2align 3
-.L266:
-	.loc 1 735 0
+.L259:
+	.loc 1 868 0
 	mov	w1, 10
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL257:
-	cbnz	w0, .L271
-	b	.L274
+.LVL259:
+	cbnz	w0, .L264
+	b	.L267
 	.p2align 3
-.L267:
-	.loc 1 740 0
+.L260:
+	.loc 1 873 0
 	mov	w1, 11
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL258:
-	cbnz	w0, .L271
-	b	.L274
+.LVL260:
+	cbnz	w0, .L264
+	b	.L267
 	.p2align 3
-.L268:
-	.loc 1 716 0
+.L261:
+	.loc 1 849 0
 	mov	w1, 6
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL259:
-	cbnz	w0, .L271
-	b	.L274
+.LVL261:
+	cbnz	w0, .L264
+	b	.L267
 	.p2align 3
-.L261:
-	.loc 1 712 0
+.L254:
+	.loc 1 845 0
 	mov	w1, 5
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL260:
-	cbnz	w0, .L271
-	b	.L274
+.LVL262:
+	cbnz	w0, .L264
+	b	.L267
 	.p2align 3
-.L264:
-	.loc 1 725 0
+.L257:
+	.loc 1 858 0
 	mov	w1, 8
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL261:
-	cbnz	w0, .L271
-	b	.L274
+.LVL263:
+	cbnz	w0, .L264
+	b	.L267
 	.p2align 3
-.L269:
-	.loc 1 720 0
+.L262:
+	.loc 1 853 0
 	mov	w1, 4
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL262:
-	cbnz	w0, .L271
-	b	.L274
+.LVL264:
+	cbnz	w0, .L264
+	b	.L267
 	.p2align 3
-.L280:
-	.loc 1 681 0
+.L273:
+	.loc 1 814 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC10
 	add	x1, x1, :lo12:.LC10
 	bl	_dev_err
-.LVL263:
-	.loc 1 682 0
+.LVL265:
+	.loc 1 815 0
 	str	wzr, [x29, 52]
 	mov	w2, 0
-	b	.L259
-.L283:
-	.loc 1 755 0
+	b	.L252
+.L276:
+	.loc 1 888 0
 	bl	__stack_chk_fail
-.LVL264:
+.LVL266:
 	.cfi_endproc
 .LFE2817:
 	.size	ebc_lut_update, .-ebc_lut_update
@@ -2895,32 +3003,32 @@ ebc_lut_update:
 	.type	ebc_state_read, %function
 ebc_state_read:
 .LFB2833:
-	.loc 1 1530 0
+	.loc 1 1663 0
 	.cfi_startproc
-.LVL265:
+.LVL267:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1531 0
+	.loc 1 1664 0
 	adrp	x3, .LANCHOR0
-	.loc 1 1530 0
+	.loc 1 1663 0
 	mov	x0, x2
-.LVL266:
-	.loc 1 1531 0
+.LVL268:
+	.loc 1 1664 0
 	adrp	x1, .LC14
-.LVL267:
-	.loc 1 1530 0
+.LVL269:
+	.loc 1 1663 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1531 0
+	.loc 1 1664 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL268:
+.LVL270:
 	add	x1, x1, :lo12:.LC14
-	ldr	w2, [x2, 616]
+	ldr	w2, [x2, 608]
 	bl	sprintf
-.LVL269:
-	.loc 1 1532 0
+.LVL271:
+	.loc 1 1665 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -2935,31 +3043,31 @@ ebc_state_read:
 	.type	ebc_version_read, %function
 ebc_version_read:
 .LFB2832:
-	.loc 1 1521 0
+	.loc 1 1654 0
 	.cfi_startproc
-.LVL270:
+.LVL272:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mov	x0, x2
-.LVL271:
-	.loc 1 1522 0
+.LVL273:
+	.loc 1 1655 0
 	adrp	x1, .LC16
-.LVL272:
+.LVL274:
 	adrp	x2, .LC15
-.LVL273:
-	.loc 1 1521 0
+.LVL275:
+	.loc 1 1654 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1522 0
+	.loc 1 1655 0
 	add	x2, x2, :lo12:.LC15
-	.loc 1 1521 0
-	.loc 1 1522 0
+	.loc 1 1654 0
+	.loc 1 1655 0
 	add	x1, x1, :lo12:.LC16
 	bl	sprintf
-.LVL274:
-	.loc 1 1523 0
+.LVL276:
+	.loc 1 1656 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -2974,49 +3082,49 @@ ebc_version_read:
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
 .LFB2830:
-	.loc 1 1485 0
+	.loc 1 1618 0
 	.cfi_startproc
-.LVL275:
+.LVL277:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 1486 0
+	.loc 1 1619 0
 	adrp	x0, .LANCHOR0
-.LVL276:
-	.loc 1 1485 0
+.LVL278:
+	.loc 1 1618 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1489 0
+	.loc 1 1622 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1485 0
+	.loc 1 1618 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1485 0
+	.loc 1 1618 0
 	mov	x19, x2
-	.loc 1 1489 0
+	.loc 1 1622 0
 	ldr	x1, [x0, 16]
-.LVL277:
-.LBB1206:
-.LBB1207:
+.LVL279:
+.LBB1186:
+.LBB1187:
 	.loc 3 55 0
 	mov	x0, x1
 	ldr	x1, [x1, 64]
 	blr	x1
-.LVL278:
-.LBE1207:
-.LBE1206:
-	.loc 1 1491 0
+.LVL280:
+.LBE1187:
+.LBE1186:
+	.loc 1 1624 0
 	mov	w2, w0
 	adrp	x1, .LC14
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC14
 	bl	sprintf
-.LVL279:
-	.loc 1 1492 0
+.LVL281:
+	.loc 1 1625 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL280:
+.LVL282:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3031,65 +3139,65 @@ pmic_vcom_read:
 	.type	pmic_temp_read, %function
 pmic_temp_read:
 .LFB2829:
-	.loc 1 1471 0
+	.loc 1 1604 0
 	.cfi_startproc
-.LVL281:
+.LVL283:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 1472 0
+	.loc 1 1605 0
 	adrp	x0, .LANCHOR0
-.LVL282:
-	.loc 1 1471 0
+.LVL284:
+	.loc 1 1604 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1475 0
+	.loc 1 1608 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-.LBB1208:
-.LBB1209:
+.LBB1188:
+.LBB1189:
 	.loc 3 50 0
 	add	x1, x29, 36
-.LVL283:
-.LBE1209:
-.LBE1208:
-	.loc 1 1471 0
+.LVL285:
+.LBE1189:
+.LBE1188:
+	.loc 1 1604 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 1471 0
+	.loc 1 1604 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
-.LVL284:
-	.loc 1 1475 0
+.LVL286:
+	.loc 1 1608 0
 	ldr	x2, [x0, 16]
-.LBB1211:
-.LBB1210:
+.LBB1191:
+.LBB1190:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL285:
-.LBE1210:
-.LBE1211:
-	.loc 1 1477 0
+.LVL287:
+.LBE1190:
+.LBE1191:
+	.loc 1 1610 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC14
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC14
 	bl	sprintf
-.LVL286:
-	.loc 1 1478 0
+.LVL288:
+	.loc 1 1611 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L293
+	cbnz	x1, .L286
 	ldp	x19, x20, [sp, 16]
-.LVL287:
+.LVL289:
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -3099,11 +3207,11 @@ pmic_temp_read:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL288:
-.L293:
+.LVL290:
+.L286:
 	.cfi_restore_state
 	bl	__stack_chk_fail
-.LVL289:
+.LVL291:
 	.cfi_endproc
 .LFE2829:
 	.size	pmic_temp_read, .-pmic_temp_read
@@ -3112,33 +3220,33 @@ pmic_temp_read:
 	.type	pmic_name_read, %function
 pmic_name_read:
 .LFB2828:
-	.loc 1 1460 0
+	.loc 1 1593 0
 	.cfi_startproc
-.LVL290:
+.LVL292:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1461 0
+	.loc 1 1594 0
 	adrp	x3, .LANCHOR0
-	.loc 1 1460 0
+	.loc 1 1593 0
 	mov	x0, x2
-.LVL291:
-	.loc 1 1463 0
+.LVL293:
+	.loc 1 1596 0
 	adrp	x1, .LC16
-.LVL292:
-	.loc 1 1460 0
+.LVL294:
+	.loc 1 1593 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1463 0
+	.loc 1 1596 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL293:
+.LVL295:
 	add	x1, x1, :lo12:.LC16
 	ldr	x2, [x2, 16]
 	add	x2, x2, 8
 	bl	sprintf
-.LVL294:
-	.loc 1 1464 0
+.LVL296:
+	.loc 1 1597 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3153,17 +3261,17 @@ pmic_name_read:
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
 .LFB2831:
-	.loc 1 1497 0
+	.loc 1 1630 0
 	.cfi_startproc
-.LVL295:
+.LVL297:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 1498 0
+	.loc 1 1631 0
 	adrp	x0, .LANCHOR0
-.LVL296:
-	.loc 1 1497 0
+.LVL298:
+	.loc 1 1630 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -3173,47 +3281,47 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 1497 0
+	.loc 1 1630 0
 	add	x1, x19, :lo12:__stack_chk_guard
-.LVL297:
+.LVL299:
 	mov	x21, x2
-	.loc 1 1498 0
+	.loc 1 1631 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
-.LVL298:
-	.loc 1 1497 0
+.LVL300:
+	.loc 1 1630 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
-.LVL299:
+.LVL301:
 	mov	x20, x3
-	.loc 1 1501 0
+	.loc 1 1634 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
-.LVL300:
-	.loc 1 1502 0
-	cbnz	w0, .L303
-.LVL301:
-	.loc 1 1506 0
+.LVL302:
+	.loc 1 1635 0
+	cbnz	w0, .L296
+.LVL303:
+	.loc 1 1639 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
-.LVL302:
-	.loc 1 1507 0
-	cbnz	w0, .L304
-.L296:
-	.loc 1 1513 0
+.LVL304:
+	.loc 1 1640 0
+	cbnz	w0, .L297
+.L289:
+	.loc 1 1646 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
-.LVL303:
+.LVL305:
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L305
+	cbnz	x1, .L298
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL304:
+.LVL306:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -3224,42 +3332,42 @@ pmic_vcom_write:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL305:
+.LVL307:
 	.p2align 3
-.L303:
+.L296:
 	.cfi_restore_state
-	.loc 1 1503 0
+	.loc 1 1636 0
 	ldr	x0, [x22]
 	adrp	x1, .LC17
 	mov	x2, x21
 	add	x1, x1, :lo12:.LC17
-	.loc 1 1504 0
+	.loc 1 1637 0
 	mov	x20, -1
-.LVL306:
-	.loc 1 1503 0
-	bl	_dev_err
-.LVL307:
-	.loc 1 1504 0
-	b	.L296
 .LVL308:
+	.loc 1 1636 0
+	bl	_dev_err
+.LVL309:
+	.loc 1 1637 0
+	b	.L289
+.LVL310:
 	.p2align 3
-.L304:
-	.loc 1 1508 0
+.L297:
+	.loc 1 1641 0
 	ldr	x0, [x22]
 	adrp	x1, .LC18
-	.loc 1 1509 0
+	.loc 1 1642 0
 	mov	x20, -1
-.LVL309:
-	.loc 1 1508 0
+.LVL311:
+	.loc 1 1641 0
 	add	x1, x1, :lo12:.LC18
 	bl	_dev_err
-.LVL310:
-	.loc 1 1509 0
-	b	.L296
-.L305:
-	.loc 1 1513 0
+.LVL312:
+	.loc 1 1642 0
+	b	.L289
+.L298:
+	.loc 1 1646 0
 	bl	__stack_chk_fail
-.LVL311:
+.LVL313:
 	.cfi_endproc
 .LFE2831:
 	.size	pmic_vcom_write, .-pmic_vcom_write
@@ -3268,9 +3376,9 @@ pmic_vcom_write:
 	.type	waveform_version_read, %function
 waveform_version_read:
 .LFB2827:
-	.loc 1 1449 0
+	.loc 1 1582 0
 	.cfi_startproc
-.LVL312:
+.LVL314:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -3279,22 +3387,22 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1449 0
+	.loc 1 1582 0
 	mov	x19, x2
-	.loc 1 1450 0
+	.loc 1 1583 0
 	bl	epd_lut_get_wf_version
-.LVL313:
-	.loc 1 1452 0
+.LVL315:
+	.loc 1 1585 0
 	mov	x2, x0
 	adrp	x1, .LC16
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC16
 	bl	sprintf
-.LVL314:
-	.loc 1 1453 0
+.LVL316:
+	.loc 1 1586 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL315:
+.LVL317:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3309,23 +3417,23 @@ waveform_version_read:
 	.type	ebc_init, %function
 ebc_init:
 .LFB2844:
-	.loc 1 1965 0
+	.loc 1 2098 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1966 0
+	.loc 1 2099 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 1965 0
+	.loc 1 2098 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1966 0
+	.loc 1 2099 0
 	bl	__platform_driver_register
-.LVL316:
-	.loc 1 1967 0
+.LVL318:
+	.loc 1 2100 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3337,87 +3445,87 @@ ebc_init:
 	.text
 	.align	2
 	.p2align 3,,7
-	.type	direct_mode_data_change.isra.0, %function
-direct_mode_data_change.isra.0:
-.LFB2846:
-	.loc 1 392 0
+	.type	direct_mode_data_change.isra.1, %function
+direct_mode_data_change.isra.1:
+.LFB2847:
+	.loc 1 519 0
 	.cfi_startproc
-.LVL317:
-	.loc 1 396 0
+.LVL319:
+	.loc 1 523 0
 	adrp	x6, .LANCHOR0
-	.loc 1 392 0
+	.loc 1 519 0
 	and	w3, w3, 255
-	.loc 1 402 0
+	.loc 1 529 0
 	sub	w3, w3, w4
-.LVL318:
-	.loc 1 396 0
+.LVL320:
+	.loc 1 523 0
 	ldr	x13, [x6, #:lo12:.LANCHOR0]
-	.loc 1 403 0
+	.loc 1 530 0
 	lsl	w3, w3, 16
-.LVL319:
+.LVL321:
 	add	x5, x5, x3, sxtw
-.LVL320:
-	.loc 1 404 0
+.LVL322:
+	.loc 1 531 0
 	add	x13, x13, 24
 	ldr	w16, [x13, 156]
-	.loc 1 407 0
+	.loc 1 534 0
 	ldp	w3, w15, [x13, 84]
-.LVL321:
-	.loc 1 412 0
+.LVL323:
+	.loc 1 539 0
 	cmp	w15, 0
-	ble	.L322
+	ble	.L315
 	lsr	w14, w3, 4
 	mov	w12, 0
-.LVL322:
+.LVL324:
 	sub	w11, w14, #1
 	add	x11, x11, 1
 	lsl	x11, x11, 3
-	.loc 1 413 0
-	cbz	w16, .L325
-.LVL323:
-.L336:
-	.loc 1 414 0
+	.loc 1 540 0
+	cbz	w16, .L318
+.LVL325:
+.L329:
+	.loc 1 541 0
 	ldr	w6, [x13, 88]
-.LVL324:
+.LVL326:
 	sub	w6, w6, #1
 	sub	w6, w6, w12
 	mul	w6, w6, w3
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL325:
-.L326:
-	.loc 1 418 0
-	cbz	w14, .L334
-	.loc 1 392 0
+.LVL327:
+.L319:
+	.loc 1 545 0
+	cbz	w14, .L327
+	.loc 1 519 0
 	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
-.LVL326:
+.LVL328:
 	.p2align 2
-.L327:
-	.loc 1 418 0
+.L320:
+	.loc 1 545 0
 	mov	x7, 0
 	.p2align 2
-.L316:
-	.loc 1 420 0
+.L309:
+	.loc 1 547 0
 	ldr	x4, [x2, x7]
-.LVL327:
+.LVL329:
 	add	x6, x6, 4
-	.loc 1 419 0
+	.loc 1 546 0
 	ldr	x3, [x1, x7]
-.LVL328:
+.LVL330:
 	add	x7, x7, 8
-	.loc 1 422 0
+	.loc 1 549 0
 	and	w9, w4, 65535
-	.loc 1 418 0
+	.loc 1 545 0
 	cmp	x11, x7
-	.loc 1 422 0
+	.loc 1 549 0
 	and	w8, w3, 65535
-.LBB1212:
-.LBB1213:
+.LBB1192:
+.LBB1193:
 	.loc 1 130 0
 	ubfiz	w30, w9, 8, 8
 	.loc 1 131 0
@@ -3426,318 +3534,318 @@ direct_mode_data_change.isra.0:
 	add	w30, w30, w8, uxtb
 	.loc 1 131 0
 	add	w9, w9, w8, lsr 8
-.LBE1213:
-.LBE1212:
-	.loc 1 423 0
+.LBE1193:
+.LBE1192:
+	.loc 1 550 0
 	lsr	w10, w4, 16
 	lsr	w8, w3, 16
-.LBB1217:
-.LBB1218:
+.LBB1197:
+.LBB1198:
 	.loc 1 130 0
 	ubfiz	w18, w10, 8, 8
-.LBE1218:
-.LBE1217:
-.LBB1224:
-.LBB1214:
+.LBE1198:
+.LBE1197:
+.LBB1204:
+.LBB1194:
 	ldrb	w30, [x5, w30, sxtw]
-.LBE1214:
-.LBE1224:
-.LBB1225:
-.LBB1219:
+.LBE1194:
+.LBE1204:
+.LBB1205:
+.LBB1199:
 	.loc 1 131 0
 	and	w10, w10, 65280
-.LBE1219:
-.LBE1225:
-.LBB1226:
-.LBB1215:
+.LBE1199:
+.LBE1205:
+.LBB1206:
+.LBB1195:
 	ldrb	w17, [x5, w9, sxtw]
-.LBE1215:
-.LBE1226:
-.LBB1227:
-.LBB1220:
+.LBE1195:
+.LBE1206:
+.LBB1207:
+.LBB1200:
 	.loc 1 130 0
 	add	w18, w18, w8, uxtb
 	.loc 1 131 0
 	add	w10, w10, w8, lsr 8
-.LBE1220:
-.LBE1227:
-	.loc 1 424 0
+.LBE1200:
+.LBE1207:
+	.loc 1 551 0
 	ubfx	x9, x4, 32, 16
 	ubfx	x8, x3, 32, 16
-	.loc 1 425 0
+	.loc 1 552 0
 	lsr	x4, x4, 48
-.LVL329:
-.LBB1228:
-.LBB1216:
+.LVL331:
+.LBB1208:
+.LBB1196:
 	.loc 1 130 0
 	orr	w17, w30, w17, lsl 4
-.LBE1216:
-.LBE1228:
-	.loc 1 422 0
+.LBE1196:
+.LBE1208:
+	.loc 1 549 0
 	strb	w17, [x6, -4]
-.LBB1229:
-.LBB1230:
+.LBB1209:
+.LBB1210:
 	.loc 1 130 0
 	ubfiz	w17, w9, 8, 8
 	.loc 1 131 0
 	and	w9, w9, 65280
-.LBE1230:
-.LBE1229:
-.LBB1236:
-.LBB1221:
+.LBE1210:
+.LBE1209:
+.LBB1216:
+.LBB1201:
 	ldrb	w10, [x5, w10, sxtw]
-.LBE1221:
-.LBE1236:
-.LBB1237:
-.LBB1231:
+.LBE1201:
+.LBE1216:
+.LBB1217:
+.LBB1211:
 	.loc 1 130 0
 	add	w17, w17, w8, uxtb
-.LBE1231:
-.LBE1237:
-.LBB1238:
-.LBB1222:
+.LBE1211:
+.LBE1217:
+.LBB1218:
+.LBB1202:
 	ldrb	w18, [x5, w18, sxtw]
-.LBE1222:
-.LBE1238:
-.LBB1239:
-.LBB1232:
+.LBE1202:
+.LBE1218:
+.LBB1219:
+.LBB1212:
 	.loc 1 131 0
 	add	w8, w9, w8, lsr 8
-.LBE1232:
-.LBE1239:
-	.loc 1 425 0
+.LBE1212:
+.LBE1219:
+	.loc 1 552 0
 	lsr	x3, x3, 48
-.LVL330:
-.LBB1240:
-.LBB1223:
+.LVL332:
+.LBB1220:
+.LBB1203:
 	.loc 1 130 0
 	orr	w9, w18, w10, lsl 4
-.LBE1223:
-.LBE1240:
-	.loc 1 423 0
+.LBE1203:
+.LBE1220:
+	.loc 1 550 0
 	strb	w9, [x6, -3]
-.LBB1241:
-.LBB1242:
+.LBB1221:
+.LBB1222:
 	.loc 1 130 0
 	ubfiz	w9, w4, 8, 8
 	.loc 1 131 0
 	and	w4, w4, 65280
-.LBE1242:
-.LBE1241:
-.LBB1246:
-.LBB1233:
+.LBE1222:
+.LBE1221:
+.LBB1226:
+.LBB1213:
 	ldrb	w10, [x5, w8, sxtw]
-.LBE1233:
-.LBE1246:
-.LBB1247:
-.LBB1243:
+.LBE1213:
+.LBE1226:
+.LBB1227:
+.LBB1223:
 	.loc 1 130 0
 	add	w8, w9, w3, uxtb
-.LBE1243:
-.LBE1247:
-.LBB1248:
-.LBB1234:
+.LBE1223:
+.LBE1227:
+.LBB1228:
+.LBB1214:
 	ldrb	w17, [x5, w17, sxtw]
-.LBE1234:
-.LBE1248:
-.LBB1249:
-.LBB1244:
+.LBE1214:
+.LBE1228:
+.LBB1229:
+.LBB1224:
 	.loc 1 131 0
 	add	w3, w4, w3, lsr 8
-.LBE1244:
-.LBE1249:
-.LBB1250:
-.LBB1235:
+.LBE1224:
+.LBE1229:
+.LBB1230:
+.LBB1215:
 	.loc 1 130 0
 	orr	w4, w17, w10, lsl 4
-.LBE1235:
-.LBE1250:
-	.loc 1 424 0
+.LBE1215:
+.LBE1230:
+	.loc 1 551 0
 	strb	w4, [x6, -2]
-.LBB1251:
-.LBB1245:
+.LBB1231:
+.LBB1225:
 	.loc 1 131 0
 	ldrb	w3, [x5, w3, sxtw]
 	.loc 1 130 0
 	ldrb	w4, [x5, w8, sxtw]
 	orr	w3, w4, w3, lsl 4
-.LBE1245:
-.LBE1251:
-	.loc 1 425 0
+.LBE1225:
+.LBE1231:
+	.loc 1 552 0
 	strb	w3, [x6, -1]
-	.loc 1 418 0
-	bne	.L316
-	.loc 1 412 0
+	.loc 1 545 0
+	bne	.L309
+	.loc 1 539 0
 	add	w12, w12, 1
 	add	x1, x1, x11
-.LVL331:
+.LVL333:
 	add	x2, x2, x11
-.LVL332:
+.LVL334:
 	cmp	w15, w12
-	beq	.L310
-.L335:
+	beq	.L303
+.L328:
 	ldr	w3, [x13, 84]
-	.loc 1 413 0
-	cbz	w16, .L313
-	.loc 1 414 0
+	.loc 1 540 0
+	cbz	w16, .L306
+	.loc 1 541 0
 	ldr	w6, [x13, 88]
-.LVL333:
+.LVL335:
 	sub	w6, w6, #1
 	sub	w6, w6, w12
 	mul	w6, w6, w3
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL334:
-	.loc 1 418 0
-	cbnz	w14, .L327
-.L333:
-	.loc 1 412 0
+.LVL336:
+	.loc 1 545 0
+	cbnz	w14, .L320
+.L326:
+	.loc 1 539 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	bne	.L335
-.L310:
-	.loc 1 428 0
+	bne	.L328
+.L303:
+	.loc 1 555 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
-.LVL335:
-.L325:
-	.loc 1 416 0
-	mul	w6, w12, w3
-.LVL336:
-	lsr	w6, w6, 2
-	add	x6, x0, x6
 .LVL337:
-	b	.L326
+.L318:
+	.loc 1 543 0
+	mul	w6, w12, w3
 .LVL338:
+	lsr	w6, w6, 2
+	add	x6, x0, x6
+.LVL339:
+	b	.L319
+.LVL340:
 	.p2align 3
-.L313:
+.L306:
 	.cfi_def_cfa 29, 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mul	w6, w12, w3
-.LVL339:
+.LVL341:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL340:
-	.loc 1 418 0
-	cbnz	w14, .L327
-	b	.L333
-.LVL341:
-.L334:
+.LVL342:
+	.loc 1 545 0
+	cbnz	w14, .L320
+	b	.L326
+.LVL343:
+.L327:
 	.cfi_def_cfa 31, 0
 	.cfi_restore 29
 	.cfi_restore 30
-	.loc 1 412 0
+	.loc 1 539 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L322
+	beq	.L315
 	ldr	w3, [x13, 84]
-	.loc 1 413 0
-	cbz	w16, .L325
-	b	.L336
-.L322:
+	.loc 1 540 0
+	cbz	w16, .L318
+	b	.L329
+.L315:
 	ret
 	.cfi_endproc
-.LFE2846:
-	.size	direct_mode_data_change.isra.0, .-direct_mode_data_change.isra.0
+.LFE2847:
+	.size	direct_mode_data_change.isra.1, .-direct_mode_data_change.isra.1
 	.align	2
 	.p2align 3,,7
-	.type	direct_mode_data_change_part.isra.1, %function
-direct_mode_data_change_part.isra.1:
-.LFB2847:
-	.loc 1 430 0
+	.type	direct_mode_data_change_part.isra.2, %function
+direct_mode_data_change_part.isra.2:
+.LFB2848:
+	.loc 1 557 0
 	.cfi_startproc
-.LVL342:
-	.loc 1 434 0
+.LVL344:
+	.loc 1 561 0
 	adrp	x6, .LANCHOR0
-	.loc 1 430 0
+	.loc 1 557 0
 	and	w3, w3, 255
-	.loc 1 439 0
+	.loc 1 566 0
 	sub	w3, w3, w4
-.LVL343:
-	.loc 1 434 0
+.LVL345:
+	.loc 1 561 0
 	ldr	x14, [x6, #:lo12:.LANCHOR0]
-	.loc 1 440 0
+	.loc 1 567 0
 	lsl	w3, w3, 16
-.LVL344:
+.LVL346:
 	add	x5, x5, x3, sxtw
-.LVL345:
-	.loc 1 441 0
+.LVL347:
+	.loc 1 568 0
 	add	x14, x14, 24
 	ldr	w16, [x14, 156]
-	.loc 1 444 0
+	.loc 1 571 0
 	ldp	w3, w15, [x14, 84]
-.LVL346:
-	.loc 1 449 0
+.LVL348:
+	.loc 1 576 0
 	cmp	w15, 0
-	ble	.L403
+	ble	.L396
 	lsr	w11, w3, 4
-.LVL347:
+.LVL349:
 	mov	w12, 0
-.LVL348:
+.LVL350:
 	sub	w13, w11, #1
-.LBB1252:
-.LBB1253:
+.LBB1232:
+.LBB1233:
 	.loc 1 136 0
 	mov	w10, 3
 	add	x13, x13, 1
 	lsl	x13, x13, 3
-.LBE1253:
-.LBE1252:
-	.loc 1 450 0
-	cbz	w16, .L406
-.LVL349:
-.L421:
-	.loc 1 451 0
+.LBE1233:
+.LBE1232:
+	.loc 1 577 0
+	cbz	w16, .L399
+.LVL351:
+.L414:
+	.loc 1 578 0
 	ldr	w6, [x14, 88]
-.LVL350:
+.LVL352:
 	sub	w6, w6, #1
 	sub	w6, w6, w12
 	mul	w6, w6, w3
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL351:
-.L407:
-	.loc 1 455 0
-	cbz	w11, .L409
+.LVL353:
+.L400:
+	.loc 1 582 0
+	cbz	w11, .L402
 	add	x6, x6, 4
-.LVL352:
+.LVL354:
 	mov	x8, 0
-.LVL353:
-.L410:
-	.loc 1 456 0
+.LVL355:
+.L403:
+	.loc 1 583 0
 	ldr	x3, [x1, x8, lsl 3]
-	.loc 1 457 0
+	.loc 1 584 0
 	ldr	x4, [x2, x8, lsl 3]
-	.loc 1 458 0
+	.loc 1 585 0
 	cmp	x3, x4
-	beq	.L419
-	.loc 1 430 0
+	beq	.L412
+	.loc 1 557 0
 	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
-.LVL354:
-.L411:
-	.loc 1 459 0
+.LVL356:
+.L404:
+	.loc 1 586 0
 	and	w17, w4, 65535
 	and	w9, w3, 65535
-.LVL355:
-.LBB1255:
-.LBB1256:
+.LVL357:
+.LBB1235:
+.LBB1236:
 	.loc 1 140 0
 	mov	w7, 0
 	.loc 1 139 0
 	cmp	w17, w9
-	beq	.L344
+	beq	.L337
 	.loc 1 137 0
 	eor	w18, w17, w9
-.LVL356:
+.LVL358:
 	.loc 1 150 0
 	ubfiz	w30, w17, 8, 8
 	.loc 1 151 0
@@ -3775,25 +3883,25 @@ direct_mode_data_change_part.isra.1:
 	.loc 1 150 0
 	and	w7, w9, w7
 	and	w7, w7, 255
-.LVL357:
-.L344:
-.LBE1256:
-.LBE1255:
-	.loc 1 459 0
+.LVL359:
+.L337:
+.LBE1236:
+.LBE1235:
+	.loc 1 586 0
 	strb	w7, [x6, -4]
-	.loc 1 460 0
+	.loc 1 587 0
 	lsr	w17, w4, 16
 	lsr	w9, w3, 16
-.LBB1257:
-.LBB1258:
+.LBB1237:
+.LBB1238:
 	.loc 1 140 0
 	mov	w7, 0
 	.loc 1 139 0
 	cmp	w17, w9
-	beq	.L349
+	beq	.L342
 	.loc 1 137 0
 	eor	w18, w17, w9
-.LVL358:
+.LVL360:
 	.loc 1 150 0
 	ubfiz	w30, w17, 8, 8
 	.loc 1 151 0
@@ -3831,25 +3939,25 @@ direct_mode_data_change_part.isra.1:
 	.loc 1 150 0
 	and	w7, w9, w7
 	and	w7, w7, 255
-.LVL359:
-.L349:
-.LBE1258:
-.LBE1257:
-	.loc 1 460 0
+.LVL361:
+.L342:
+.LBE1238:
+.LBE1237:
+	.loc 1 587 0
 	strb	w7, [x6, -3]
-	.loc 1 461 0
+	.loc 1 588 0
 	ubfx	x17, x4, 32, 16
 	ubfx	x9, x3, 32, 16
-.LBB1259:
-.LBB1260:
+.LBB1239:
+.LBB1240:
 	.loc 1 140 0
 	mov	w7, 0
 	.loc 1 139 0
 	cmp	w17, w9
-	beq	.L354
+	beq	.L347
 	.loc 1 137 0
 	eor	w18, w17, w9
-.LVL360:
+.LVL362:
 	.loc 1 150 0
 	ubfiz	w30, w17, 8, 8
 	.loc 1 151 0
@@ -3887,27 +3995,27 @@ direct_mode_data_change_part.isra.1:
 	.loc 1 150 0
 	and	w7, w9, w7
 	and	w7, w7, 255
-.LVL361:
-.L354:
-.LBE1260:
-.LBE1259:
-	.loc 1 461 0
+.LVL363:
+.L347:
+.LBE1240:
+.LBE1239:
+	.loc 1 588 0
 	strb	w7, [x6, -2]
-	.loc 1 462 0
+	.loc 1 589 0
 	lsr	x4, x4, 48
-.LVL362:
+.LVL364:
 	lsr	x3, x3, 48
-.LVL363:
-.LBB1261:
-.LBB1254:
+.LVL365:
+.LBB1241:
+.LBB1234:
 	.loc 1 140 0
 	mov	w7, 0
 	.loc 1 139 0
 	cmp	w4, w3
-	beq	.L359
+	beq	.L352
 	.loc 1 137 0
 	eor	w9, w4, w3
-.LVL364:
+.LVL366:
 	.loc 1 150 0
 	ubfiz	w7, w4, 8, 8
 	.loc 1 151 0
@@ -3923,7 +4031,7 @@ direct_mode_data_change_part.isra.1:
 	.loc 1 144 0
 	tst	w9, 240
 	orr	w18, w4, 12
-.LVL365:
+.LVL367:
 	.loc 1 150 0
 	ldrb	w17, [x5, w7, sxtw]
 	.loc 1 144 0
@@ -3946,195 +4054,195 @@ direct_mode_data_change_part.isra.1:
 	.loc 1 150 0
 	and	w4, w7, w4
 	and	w7, w4, 255
-.LVL366:
-.L359:
-.LBE1254:
-.LBE1261:
-	.loc 1 462 0
+.LVL368:
+.L352:
+.LBE1234:
+.LBE1241:
+	.loc 1 589 0
 	strb	w7, [x6, -1]
 	add	x8, x8, 1
 	add	x6, x6, 4
-	.loc 1 455 0
+	.loc 1 582 0
 	cmp	w11, w8
-	ble	.L420
-.LVL367:
-.L365:
-	.loc 1 456 0
+	ble	.L413
+.LVL369:
+.L358:
+	.loc 1 583 0
 	ldr	x3, [x1, x8, lsl 3]
-	.loc 1 457 0
+	.loc 1 584 0
 	ldr	x4, [x2, x8, lsl 3]
-	.loc 1 458 0
+	.loc 1 585 0
 	cmp	x3, x4
-	bne	.L411
-	.loc 1 465 0
+	bne	.L404
+	.loc 1 592 0
 	str	wzr, [x6, -4]
 	add	x8, x8, 1
 	add	x6, x6, 4
-	.loc 1 455 0
+	.loc 1 582 0
 	cmp	w11, w8
-	bgt	.L365
-.L420:
+	bgt	.L358
+.L413:
 	add	x1, x1, x13
-.LVL368:
+.LVL370:
 	add	x2, x2, x13
-.LVL369:
-.L342:
-	.loc 1 449 0
+.LVL371:
+.L335:
+	.loc 1 576 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L337
+	beq	.L330
 	ldr	w3, [x14, 84]
-.LVL370:
-	.loc 1 450 0
-	cbz	w16, .L340
-	.loc 1 451 0
+.LVL372:
+	.loc 1 577 0
+	cbz	w16, .L333
+	.loc 1 578 0
 	ldr	w6, [x14, 88]
-.LVL371:
+.LVL373:
 	sub	w6, w6, #1
 	sub	w6, w6, w12
 	mul	w6, w6, w3
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL372:
-.L341:
-	.loc 1 455 0
-	cbz	w11, .L342
+.LVL374:
+.L334:
+	.loc 1 582 0
+	cbz	w11, .L335
 	add	x6, x6, 4
-.LVL373:
+.LVL375:
 	mov	x8, 0
-	b	.L365
-.LVL374:
+	b	.L358
+.LVL376:
 	.p2align 3
-.L419:
+.L412:
 	.cfi_def_cfa 31, 0
 	.cfi_restore 29
 	.cfi_restore 30
-	.loc 1 465 0
+	.loc 1 592 0
 	str	wzr, [x6, -4]
 	add	x8, x8, 1
-	.loc 1 455 0
+	.loc 1 582 0
 	cmp	w11, w8
 	add	x6, x6, 4
-	bgt	.L410
+	bgt	.L403
 	add	x1, x1, x13
-.LVL375:
+.LVL377:
 	add	x2, x2, x13
-.LVL376:
-.L409:
-	.loc 1 449 0
+.LVL378:
+.L402:
+	.loc 1 576 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L403
+	beq	.L396
 	ldr	w3, [x14, 84]
-.LVL377:
-	.loc 1 450 0
-	cbnz	w16, .L421
-.L406:
-	.loc 1 453 0
+.LVL379:
+	.loc 1 577 0
+	cbnz	w16, .L414
+.L399:
+	.loc 1 580 0
 	mul	w6, w12, w3
-.LVL378:
+.LVL380:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL379:
-	b	.L407
-.LVL380:
+.LVL381:
+	b	.L400
+.LVL382:
 	.p2align 3
-.L340:
+.L333:
 	.cfi_def_cfa 29, 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mul	w6, w12, w3
-.LVL381:
+.LVL383:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL382:
-	b	.L341
-.LVL383:
-.L337:
-	.loc 1 470 0
+.LVL384:
+	b	.L334
+.LVL385:
+.L330:
+	.loc 1 597 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
-.LVL384:
-.L403:
+.LVL386:
+.L396:
 	ret
 	.cfi_endproc
-.LFE2847:
-	.size	direct_mode_data_change_part.isra.1, .-direct_mode_data_change_part.isra.1
+.LFE2848:
+	.size	direct_mode_data_change_part.isra.2, .-direct_mode_data_change_part.isra.2
 	.align	2
 	.p2align 3,,7
-	.type	flip.isra.2, %function
-flip.isra.2:
-.LFB2848:
-	.loc 1 472 0
+	.type	flip.isra.3, %function
+flip.isra.3:
+.LFB2849:
+	.loc 1 599 0
 	.cfi_startproc
-.LVL385:
+.LVL387:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 476 0
+	.loc 1 603 0
 	sxtw	x2, w1
-	.loc 1 472 0
+	.loc 1 599 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 472 0
+	.loc 1 599 0
 	mov	x20, x0
-	.loc 1 474 0
+	.loc 1 601 0
 	ldr	w19, [x0, 72]
-	.loc 1 476 0
+	.loc 1 603 0
 	ldr	x0, [x0]
-.LVL386:
-.LBB1262:
-.LBB1263:
-.LBB1264:
-.LBB1265:
+.LVL388:
+.LBB1242:
+.LBB1243:
+.LBB1244:
+.LBB1245:
 	.file 10 "./include/linux/dma-mapping.h"
 	.loc 10 266 0
-	cbz	x0, .L425
+	cbz	x0, .L418
 	ldr	x3, [x0, 648]
 	.loc 10 268 0
 	adrp	x4, dummy_dma_ops
 	add	x4, x4, :lo12:dummy_dma_ops
 	cmp	x3, 0
 	csel	x3, x4, x3, eq
-.L423:
-.LBE1265:
-.LBE1264:
+.L416:
+.LBE1245:
+.LBE1244:
 	.loc 10 434 0
 	ldr	x5, [x3, 88]
 	sxtw	x19, w19
-	cbz	x5, .L424
-.LBE1263:
-.LBE1262:
-	.loc 1 476 0
+	cbz	x5, .L417
+.LBE1243:
+.LBE1242:
+	.loc 1 603 0
 	add	x4, x19, x19, lsl 1
-.LBB1271:
-.LBB1268:
+.LBB1251:
+.LBB1248:
 	.loc 10 435 0
 	mov	w3, 1
-.LBE1268:
-.LBE1271:
-	.loc 1 476 0
+.LBE1248:
+.LBE1251:
+	.loc 1 603 0
 	add	x4, x20, x4, lsl 3
-.LBB1272:
-.LBB1269:
+.LBB1252:
+.LBB1249:
 	.loc 10 435 0
 	ldr	x1, [x4, 32]
 	blr	x5
-.LVL387:
-.L424:
-.LBE1269:
-.LBE1272:
-	.loc 1 477 0
+.LVL389:
+.L417:
+.LBE1249:
+.LBE1252:
+	.loc 1 604 0
 	ldr	x5, [x20, 8]
-.LBB1273:
-.LBB1274:
+.LBB1253:
+.LBB1254:
 	.file 11 "drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.h"
 	.loc 11 57 0
 	mov	w4, 0
@@ -4142,58 +4250,58 @@ flip.isra.2:
 	mov	w2, 0
 	mov	x0, x5
 	mov	w1, 0
-.LBE1274:
-.LBE1273:
-	.loc 1 478 0
+.LBE1254:
+.LBE1253:
+	.loc 1 605 0
 	add	x19, x19, x19, lsl 1
-.LBB1277:
-.LBB1275:
+.LBB1257:
+.LBB1255:
 	.loc 11 57 0
 	ldr	x5, [x5, 64]
-.LBE1275:
-.LBE1277:
-	.loc 1 478 0
+.LBE1255:
+.LBE1257:
+	.loc 1 605 0
 	add	x19, x20, x19, lsl 3
-.LBB1278:
-.LBB1276:
+.LBB1258:
+.LBB1256:
 	.loc 11 57 0
 	blr	x5
-.LVL388:
-.LBE1276:
-.LBE1278:
-	.loc 1 478 0
+.LVL390:
+.LBE1256:
+.LBE1258:
+	.loc 1 605 0
 	ldr	x1, [x20, 8]
-.LBB1279:
-.LBB1280:
+.LBB1259:
+.LBB1260:
 	.loc 11 62 0
 	mov	w2, 0
 	mov	x0, x1
 	ldr	x3, [x1, 72]
 	ldr	w1, [x19, 32]
 	blr	x3
-.LVL389:
-.LBE1280:
-.LBE1279:
-	.loc 1 479 0
+.LVL391:
+.LBE1260:
+.LBE1259:
+	.loc 1 606 0
 	ldr	x2, [x20, 8]
-.LBB1281:
-.LBB1282:
+.LBB1261:
+.LBB1262:
 	.loc 11 77 0
 	mov	w1, 1
 	mov	x0, x2
 	ldr	x2, [x2, 96]
 	blr	x2
-.LVL390:
-.LBE1282:
-.LBE1281:
-	.loc 1 480 0
+.LVL392:
+.LBE1262:
+.LBE1261:
+	.loc 1 607 0
 	ldr	w1, [x20, 72]
 	mov	w0, 1
 	sub	w0, w0, w1
 	str	w0, [x20, 72]
-	.loc 1 481 0
+	.loc 1 608 0
 	ldp	x19, x20, [sp, 16]
-.LVL391:
+.LVL393:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -4202,33 +4310,33 @@ flip.isra.2:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL392:
+.LVL394:
 	.p2align 3
-.L425:
+.L418:
 	.cfi_restore_state
-.LBB1283:
-.LBB1270:
-.LBB1267:
-.LBB1266:
+.LBB1263:
+.LBB1250:
+.LBB1247:
+.LBB1246:
 	.loc 10 268 0
 	adrp	x3, dummy_dma_ops
 	add	x3, x3, :lo12:dummy_dma_ops
-	b	.L423
-.LBE1266:
-.LBE1267:
-.LBE1270:
-.LBE1283:
+	b	.L416
+.LBE1246:
+.LBE1247:
+.LBE1250:
+.LBE1263:
 	.cfi_endproc
-.LFE2848:
-	.size	flip.isra.2, .-flip.isra.2
+.LFE2849:
+	.size	flip.isra.3, .-flip.isra.3
 	.align	2
 	.p2align 3,,7
 	.type	ebc_frame_start, %function
 ebc_frame_start:
 .LFB2814:
-	.loc 1 490 0
+	.loc 1 617 0
 	.cfi_startproc
-.LVL393:
+.LVL395:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
@@ -4238,56 +4346,56 @@ ebc_frame_start:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 492 0
+	.loc 1 619 0
 	add	x19, x0, 184
-	.loc 1 490 0
+	.loc 1 617 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 490 0
+	.loc 1 617 0
 	mov	x20, x0
-	.loc 1 491 0
+	.loc 1 618 0
 	add	x21, x0, 24
-	.loc 1 494 0
-	ldr	x1, [x19, 216]
+	.loc 1 621 0
+	ldr	x1, [x19, 208]
 	ldr	w0, [x1, 40]
-.LVL394:
+.LVL396:
 	cmp	w0, 12
-	bgt	.L432
+	bgt	.L425
 	cmp	w0, 7
-	bge	.L433
-	cbnz	w0, .L446
-	.loc 1 510 0
-	ldr	x0, [x19, 176]
+	bge	.L426
+	cbnz	w0, .L439
+	.loc 1 642 0
+	ldr	x0, [x19, 168]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 128]
-	ldr	x3, [x19, 160]
+	ldr	x3, [x19, 152]
 	bl	get_auto_image
-.LVL395:
-	.loc 1 515 0
+.LVL397:
+	.loc 1 647 0
 	ldr	w0, [x19, 36]
-	cbz	w0, .L438
-.LBB1284:
-.LBB1285:
-	.loc 1 485 0
+	cbz	w0, .L431
+.LBB1264:
+.LBB1265:
+	.loc 1 612 0
 	str	wzr, [x21, 72]
-	.loc 1 486 0
+	.loc 1 613 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
-	bl	flip.isra.2
-.LVL396:
-.LBE1285:
-.LBE1284:
-	.loc 1 517 0
+	bl	flip.isra.3
+.LVL398:
+.LBE1265:
+.LBE1264:
+	.loc 1 649 0
 	ldp	x1, x2, [x19, 128]
 	mov	x4, x19
-	ldr	x3, [x19, 160]
-	ldr	x0, [x19, 184]
+	ldr	x3, [x19, 152]
+	ldr	x0, [x19, 176]
 	bl	get_auto_image
-.LVL397:
-.L430:
-	.loc 1 561 0
+.LVL399:
+.L423:
+	.loc 1 693 0
 	ldp	x19, x20, [sp, 16]
-.LVL398:
+.LVL400:
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -4298,39 +4406,39 @@ ebc_frame_start:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL399:
+.LVL401:
 	.p2align 3
-.L446:
+.L439:
 	.cfi_restore_state
-	.loc 1 494 0
+	.loc 1 621 0
 	cmp	w0, 1
-	bne	.L431
-.L435:
-	.loc 1 497 0
-	ldr	x0, [x19, 176]
+	bne	.L424
+.L428:
+	.loc 1 624 0
+	ldr	x0, [x19, 168]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 128]
-	ldr	x3, [x19, 160]
+	ldr	x3, [x19, 152]
 	bl	get_auto_image
-.LVL400:
-	.loc 1 502 0
+.LVL402:
+	.loc 1 629 0
 	ldr	w0, [x19, 36]
-	cbz	w0, .L436
-.LBB1286:
-.LBB1287:
-	.loc 1 485 0
+	cbz	w0, .L429
+.LBB1266:
+.LBB1267:
+	.loc 1 612 0
 	str	wzr, [x21, 72]
-	.loc 1 486 0
+	.loc 1 613 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
-	bl	flip.isra.2
-.LVL401:
-.LBE1287:
-.LBE1286:
-	.loc 1 561 0
+	bl	flip.isra.3
+.LVL403:
+.LBE1267:
+.LBE1266:
+	.loc 1 693 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL402:
+.LVL404:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -4340,57 +4448,57 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL403:
+.LVL405:
 	.p2align 3
-.L432:
+.L425:
 	.cfi_restore_state
-	.loc 1 494 0
+	.loc 1 621 0
 	cmp	w0, 18
-	beq	.L435
-.L431:
-	.loc 1 549 0
-	ldr	x2, [x19, 208]
-	.loc 1 546 0
+	beq	.L428
+.L424:
+	.loc 1 681 0
+	ldr	x2, [x19, 200]
+	.loc 1 678 0
 	ldrb	w4, [x19, 32]
 	str	w4, [x19, 40]
-	.loc 1 547 0
-	ldr	x0, [x19, 176]
+	.loc 1 679 0
+	ldr	x0, [x19, 168]
 	mov	w3, w4
 	ldr	x5, [x20, 296]
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
-	bl	direct_mode_data_change.isra.0
-.LVL404:
-.LBB1288:
-.LBB1289:
-	.loc 1 485 0
+	bl	direct_mode_data_change.isra.1
+.LVL406:
+.LBB1268:
+.LBB1269:
+	.loc 1 612 0
 	str	wzr, [x21, 72]
-	.loc 1 486 0
+	.loc 1 613 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
-	bl	flip.isra.2
-.LVL405:
-.LBE1289:
-.LBE1288:
-	.loc 1 552 0
+	bl	flip.isra.3
+.LVL407:
+.LBE1269:
+.LBE1268:
+	.loc 1 684 0
 	ldr	w4, [x19, 40]
-	.loc 1 554 0
-	ldp	x2, x1, [x19, 208]
-	.loc 1 552 0
+	.loc 1 686 0
+	ldp	x2, x1, [x19, 200]
+	.loc 1 684 0
 	sub	w4, w4, #1
 	str	w4, [x19, 40]
-	.loc 1 553 0
-	ldr	x0, [x19, 184]
+	.loc 1 685 0
+	ldr	x0, [x19, 176]
 	ldrb	w3, [x20, 216]
 	ldr	x5, [x20, 296]
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change.isra.0
-.LVL406:
-	.loc 1 561 0
+	bl	direct_mode_data_change.isra.1
+.LVL408:
+	.loc 1 693 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL407:
+.LVL409:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -4400,53 +4508,53 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL408:
+.LVL410:
 	.p2align 3
-.L433:
+.L426:
 	.cfi_restore_state
-	.loc 1 536 0
-	ldr	x2, [x19, 208]
-	.loc 1 533 0
+	.loc 1 668 0
+	ldr	x2, [x19, 200]
+	.loc 1 665 0
 	ldrb	w4, [x19, 32]
 	str	w4, [x19, 40]
-	.loc 1 534 0
-	ldr	x0, [x19, 176]
+	.loc 1 666 0
+	ldr	x0, [x19, 168]
 	mov	w3, w4
 	ldr	x5, [x20, 296]
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
-	bl	direct_mode_data_change_part.isra.1
-.LVL409:
-.LBB1290:
-.LBB1291:
-	.loc 1 485 0
+	bl	direct_mode_data_change_part.isra.2
+.LVL411:
+.LBB1270:
+.LBB1271:
+	.loc 1 612 0
 	str	wzr, [x21, 72]
-	.loc 1 486 0
+	.loc 1 613 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
-	bl	flip.isra.2
-.LVL410:
-.LBE1291:
-.LBE1290:
-	.loc 1 539 0
+	bl	flip.isra.3
+.LVL412:
+.LBE1271:
+.LBE1270:
+	.loc 1 671 0
 	ldr	w4, [x19, 40]
-	.loc 1 541 0
-	ldp	x2, x1, [x19, 208]
-	.loc 1 539 0
+	.loc 1 673 0
+	ldp	x2, x1, [x19, 200]
+	.loc 1 671 0
 	sub	w4, w4, #1
 	str	w4, [x19, 40]
-	.loc 1 540 0
-	ldr	x0, [x19, 184]
+	.loc 1 672 0
+	ldr	x0, [x19, 176]
 	ldrb	w3, [x20, 216]
 	ldr	x5, [x20, 296]
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change_part.isra.1
-.LVL411:
-	.loc 1 561 0
+	bl	direct_mode_data_change_part.isra.2
+.LVL413:
+	.loc 1 693 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL412:
+.LVL414:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -4456,30 +4564,30 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL413:
-.L438:
+.LVL415:
+.L431:
 	.cfi_restore_state
-	.loc 1 523 0
+	.loc 1 655 0
 	adrp	x1, .LANCHOR3
 	adrp	x0, .LC20
 	add	x1, x1, :lo12:.LANCHOR3
 	add	x0, x0, :lo12:.LC20
 	bl	printk
-.LVL414:
-	.loc 1 524 0
+.LVL416:
+	.loc 1 656 0
 	str	wzr, [x19, 28]
-	b	.L430
-.L436:
-	.loc 1 505 0
+	b	.L423
+.L429:
+	.loc 1 637 0
 	adrp	x1, .LANCHOR3
 	adrp	x0, .LC19
 	add	x1, x1, :lo12:.LANCHOR3
 	add	x0, x0, :lo12:.LC19
 	bl	printk
-.LVL415:
-	.loc 1 506 0
+.LVL417:
+	.loc 1 638 0
 	str	wzr, [x19, 28]
-	b	.L430
+	b	.L423
 	.cfi_endproc
 .LFE2814:
 	.size	ebc_frame_start, .-ebc_frame_start
@@ -4488,18 +4596,18 @@ ebc_frame_start:
 	.type	ebc_auto_tast_function, %function
 ebc_auto_tast_function:
 .LFB2815:
-	.loc 1 564 0
+	.loc 1 696 0
 	.cfi_startproc
-.LVL416:
+.LVL418:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
 	.cfi_offset 30, -88
-	.loc 1 565 0
+	.loc 1 697 0
 	adrp	x1, .LANCHOR0
-	.loc 1 564 0
+	.loc 1 696 0
 	adrp	x0, __stack_chk_guard
-.LVL417:
+.LVL419:
 	add	x0, x0, :lo12:__stack_chk_guard
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -4508,229 +4616,229 @@ ebc_auto_tast_function:
 	.cfi_offset 20, -72
 	adrp	x20, .LANCHOR1
 	stp	x21, x22, [sp, 32]
-	.loc 1 570 0
+	.loc 1 702 0
 	add	x20, x20, :lo12:.LANCHOR1
 	.cfi_offset 21, -64
 	.cfi_offset 22, -56
-	.loc 1 565 0
+	.loc 1 697 0
 	ldr	x22, [x1, #:lo12:.LANCHOR0]
-.LVL418:
-	.loc 1 570 0
+.LVL420:
+	.loc 1 702 0
 	add	x20, x20, 376
-	.loc 1 564 0
+	.loc 1 696 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
-.LBB1292:
-.LBB1293:
-.LBB1294:
+.LBB1272:
+.LBB1273:
+.LBB1274:
 	.file 12 "./include/linux/compiler.h"
 	.loc 12 234 0
 	mov	x24, 2
-.LBE1294:
-.LBE1293:
-.LBE1292:
-	.loc 1 564 0
+.LBE1274:
+.LBE1273:
+.LBE1272:
+	.loc 1 696 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -32
 	.cfi_offset 26, -24
-	.loc 1 566 0
+	.loc 1 698 0
 	add	x21, x22, 24
-	.loc 1 567 0
+	.loc 1 699 0
 	add	x19, x22, 184
-	add	x26, x22, 736
-	.loc 1 564 0
+	add	x26, x22, 728
+	.loc 1 696 0
 	ldr	x1, [x0]
 	str	x1, [x29, 88]
 	mov	x1,0
 	adrp	x25, system_wq
-.LBB1299:
-.LBB1296:
-.LBB1297:
+.LBB1279:
+.LBB1276:
+.LBB1277:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x23, sp_el0
 // 0 "" 2
-.LVL419:
+.LVL421:
 #NO_APP
-	b	.L457
+	b	.L450
 	.p2align 3
-.L456:
-.LBE1297:
-.LBE1296:
-.LBE1299:
-	.loc 1 626 0
+.L449:
+.LBE1277:
+.LBE1276:
+.LBE1279:
+	.loc 1 759 0
 	mov	x0, x20
 	bl	up
-.LVL420:
-	.loc 1 627 0
+.LVL422:
+	.loc 1 760 0
 	bl	schedule
-.LVL421:
-.L457:
-	.loc 1 570 0
+.LVL423:
+.L450:
+	.loc 1 702 0
 	mov	x0, x20
 	bl	down
-.LVL422:
-.LBB1300:
-.LBB1298:
-.LBB1295:
+.LVL424:
+.LBB1280:
+.LBB1278:
+.LBB1275:
 	.loc 12 234 0
 	str	x24, [x23, 32]
-.LBE1295:
-.LBE1298:
-.LBE1300:
-	.loc 1 574 0
+.LBE1275:
+.LBE1278:
+.LBE1280:
+	.loc 1 706 0
 #APP
-// 574 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
+// 706 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
 	dmb ish
 // 0 "" 2
-	.loc 1 575 0
+	.loc 1 707 0
 #NO_APP
-	ldr	x0, [x19, 216]
+	ldr	x0, [x19, 208]
 	ldr	w0, [x0, 40]
 	cmp	w0, 12
-	bgt	.L449
+	bgt	.L442
 	cmp	w0, 7
-	bge	.L450
-	cbz	w0, .L451
+	bge	.L443
+	cbz	w0, .L444
 	cmp	w0, 1
-	bne	.L448
-.L452:
-	.loc 1 578 0
+	bne	.L441
+.L445:
+	.loc 1 711 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 128]
-	add	x0, x0, 22
-	ldr	x3, [x19, 160]
-	ldr	x0, [x19, x0, lsl 3]
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 152]
+	ldr	x0, [x0, 168]
 	bl	get_auto_image
-.LVL423:
-	.loc 1 583 0
+.LVL425:
+	.loc 1 716 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
-	bl	flip.isra.2
-.LVL424:
-.L453:
-	.loc 1 621 0
-	ldr	x0, [x19, 216]
+	bl	flip.isra.3
+.LVL426:
+.L446:
+	.loc 1 754 0
+	ldr	x0, [x19, 208]
 	ldr	w0, [x0, 40]
-	.loc 1 623 0
+	.loc 1 756 0
 	cmp	w0, 1
-	.loc 1 621 0
+	.loc 1 754 0
 	ccmp	w0, 18, 4, hi
-	bne	.L456
-.LBB1301:
-.LBB1302:
-.LBB1303:
-.LBB1304:
+	bne	.L449
+.LBB1281:
+.LBB1282:
+.LBB1283:
+.LBB1284:
 	.file 13 "./include/linux/workqueue.h"
 	.loc 13 518 0
 	ldr	x1, [x25, #:lo12:system_wq]
 	mov	x2, x26
 	mov	w0, 8
 	bl	queue_work_on
-.LVL425:
-	b	.L456
+.LVL427:
+	b	.L449
 	.p2align 3
-.L449:
-.LBE1304:
-.LBE1303:
-.LBE1302:
-.LBE1301:
-	.loc 1 575 0
+.L442:
+.LBE1284:
+.LBE1283:
+.LBE1282:
+.LBE1281:
+	.loc 1 707 0
 	cmp	w0, 18
-	beq	.L452
-.L448:
-	.loc 1 609 0
+	beq	.L445
+.L441:
+	.loc 1 742 0
 	ldr	w1, [x19, 40]
-	.loc 1 610 0
+	.loc 1 743 0
 	mov	x0, x21
-	.loc 1 609 0
+	.loc 1 742 0
 	sub	w1, w1, #1
 	str	w1, [x19, 40]
-	.loc 1 610 0
+	.loc 1 743 0
 	ldr	w1, [x22, 208]
-	bl	flip.isra.2
-.LVL426:
-	.loc 1 611 0
+	bl	flip.isra.3
+.LVL428:
+	.loc 1 744 0
 	ldr	w4, [x19, 40]
-	cbz	w4, .L453
-	.loc 1 613 0
+	cbz	w4, .L446
+	.loc 1 746 0
 	ldrsw	x0, [x21, 72]
-	.loc 1 614 0
-	ldp	x2, x1, [x19, 208]
-	.loc 1 613 0
-	add	x0, x0, 22
+	.loc 1 747 0
+	ldp	x2, x1, [x19, 200]
+	.loc 1 746 0
+	add	x0, x19, x0, lsl 3
 	ldrb	w3, [x22, 216]
 	ldr	x5, [x22, 296]
-	ldr	x0, [x19, x0, lsl 3]
 	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 168]
 	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change.isra.0
-.LVL427:
-	.loc 1 617 0
-	b	.L453
+	bl	direct_mode_data_change.isra.1
+.LVL429:
+	.loc 1 750 0
+	b	.L446
 	.p2align 3
-.L451:
-	.loc 1 586 0
+.L444:
+	.loc 1 719 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
-	bl	flip.isra.2
-.LVL428:
-	.loc 1 587 0
+	bl	flip.isra.3
+.LVL430:
+	.loc 1 720 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 128]
-	add	x0, x0, 22
-	ldr	x3, [x19, 160]
-	ldr	x0, [x19, x0, lsl 3]
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 152]
+	ldr	x0, [x0, 168]
 	bl	get_auto_image
-.LVL429:
-	.loc 1 592 0
-	b	.L453
+.LVL431:
+	.loc 1 725 0
+	b	.L446
 	.p2align 3
-.L450:
-	.loc 1 599 0
+.L443:
+	.loc 1 732 0
 	ldr	w1, [x19, 40]
-	.loc 1 600 0
+	.loc 1 733 0
 	mov	x0, x21
-	.loc 1 599 0
+	.loc 1 732 0
 	sub	w1, w1, #1
 	str	w1, [x19, 40]
-	.loc 1 600 0
+	.loc 1 733 0
 	ldr	w1, [x22, 208]
-	bl	flip.isra.2
-.LVL430:
-	.loc 1 601 0
+	bl	flip.isra.3
+.LVL432:
+	.loc 1 734 0
 	ldr	w4, [x19, 40]
-	cbz	w4, .L453
-	.loc 1 603 0
+	cbz	w4, .L446
+	.loc 1 736 0
 	ldrsw	x0, [x21, 72]
-	.loc 1 604 0
-	ldp	x2, x1, [x19, 208]
-	.loc 1 603 0
-	add	x0, x0, 22
+	.loc 1 737 0
+	ldp	x2, x1, [x19, 200]
+	.loc 1 736 0
+	add	x0, x19, x0, lsl 3
 	ldrb	w3, [x22, 216]
 	ldr	x5, [x22, 296]
-	ldr	x0, [x19, x0, lsl 3]
 	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 168]
 	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change_part.isra.1
-.LVL431:
-	.loc 1 607 0
-	b	.L453
+	bl	direct_mode_data_change_part.isra.2
+.LVL433:
+	.loc 1 740 0
+	b	.L446
 	.cfi_endproc
 .LFE2815:
 	.size	ebc_auto_tast_function, .-ebc_auto_tast_function
 	.align	2
 	.p2align 3,,7
-	.type	ebc_power_set.part.3, %function
-ebc_power_set.part.3:
-.LFB2849:
+	.type	ebc_power_set.part.4, %function
+ebc_power_set.part.4:
+.LFB2850:
 	.loc 1 180 0
 	.cfi_startproc
-.LVL432:
+.LVL434:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
@@ -4750,66 +4858,66 @@ ebc_power_set.part.3:
 	mov	w21, w1
 	.loc 1 185 0
 	mov	x0, 1
-.LVL433:
+.LVL435:
 	bl	ebc_notify
-.LVL434:
+.LVL436:
 	.loc 1 186 0
-	ldr	w0, [x20, 432]
-	cbnz	w0, .L473
+	ldr	w0, [x20, 424]
+	cbnz	w0, .L466
 	.loc 1 187 0
 	mov	w0, 1
-	str	w0, [x20, 432]
-.LBB1305:
-.LBB1306:
+	str	w0, [x20, 424]
+.LBB1285:
+.LBB1286:
 	.loc 4 58 0
-	add	x0, x19, 408
+	add	x0, x19, 400
 	bl	__pm_stay_awake
-.LVL435:
-.L473:
-.LBE1306:
-.LBE1305:
+.LVL437:
+.L466:
+.LBE1286:
+.LBE1285:
 	.loc 1 190 0
-	str	w21, [x20, 192]
-.LBB1307:
-.LBB1308:
+	str	w21, [x20, 184]
+.LBB1287:
+.LBB1288:
 	.loc 11 46 0
 	add	x1, x19, 24
-.LBE1308:
-.LBE1307:
+.LBE1288:
+.LBE1287:
 	.loc 1 191 0
 	ldr	x2, [x19, 8]
-.LBB1310:
-.LBB1309:
+.LBB1290:
+.LBB1289:
 	.loc 11 46 0
 	mov	x0, x2
 	ldr	x2, [x2, 48]
 	blr	x2
-.LVL436:
-.LBE1309:
-.LBE1310:
+.LVL438:
+.LBE1289:
+.LBE1290:
 	.loc 1 192 0
 	ldr	x2, [x19, 16]
-.LBB1311:
-.LBB1312:
+.LBB1291:
+.LBB1292:
 	.loc 3 30 0
 	mov	w1, 1
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL437:
-.LBE1312:
-.LBE1311:
+.LVL439:
+.LBE1292:
+.LBE1291:
 	.loc 1 193 0
 	ldr	x0, [x19]
 	adrp	x1, .LC21
 	add	x1, x1, :lo12:.LC21
 	bl	_dev_info
-.LVL438:
+.LVL440:
 	.loc 1 208 0
 	ldr	x21, [sp, 32]
-.LVL439:
+.LVL441:
 	ldp	x19, x20, [sp, 16]
-.LVL440:
+.LVL442:
 	ldp	x29, x30, [sp], 48
 	.cfi_restore 30
 	.cfi_restore 29
@@ -4819,43 +4927,43 @@ ebc_power_set.part.3:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2849:
-	.size	ebc_power_set.part.3, .-ebc_power_set.part.3
+.LFE2850:
+	.size	ebc_power_set.part.4, .-ebc_power_set.part.4
 	.align	2
 	.p2align 3,,7
 	.type	ebc_probe, %function
 ebc_probe:
 .LFB2840:
-	.loc 1 1800 0
+	.loc 1 1933 0
 	.cfi_startproc
-.LVL441:
+.LVL443:
 	stp	x29, x30, [sp, -208]!
 	.cfi_def_cfa_offset 208
 	.cfi_offset 29, -208
 	.cfi_offset 30, -200
-.LBB1460:
-.LBB1461:
+.LBB1438:
+.LBB1439:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
-.LBE1461:
-.LBE1460:
-	.loc 1 1800 0
+.LBE1439:
+.LBE1438:
+	.loc 1 1933 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -192
 	.cfi_offset 20, -184
-	.loc 1 1801 0
+	.loc 1 1934 0
 	add	x20, x0, 16
-	.loc 1 1800 0
+	.loc 1 1933 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -160
 	.cfi_offset 24, -152
 	adrp	x23, __stack_chk_guard
 	stp	x21, x22, [sp, 32]
 	add	x0, x23, :lo12:__stack_chk_guard
-.LVL442:
+.LVL444:
 	stp	x25, x26, [sp, 64]
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 21, -176
@@ -4864,157 +4972,157 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 1800 0
+	.loc 1 1933 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
-.LBB1463:
-.LBB1462:
+.LBB1441:
+.LBB1440:
 	.loc 2 711 0
 	mov	x0, x20
-	mov	x1, 808
+	mov	x1, 800
 	bl	devm_kmalloc
-.LVL443:
-.LBE1462:
-.LBE1463:
-	.loc 1 1812 0
-	cbz	x0, .L520
-	.loc 1 1816 0
+.LVL445:
+.LBE1440:
+.LBE1441:
+	.loc 1 1945 0
+	cbz	x0, .L513
+	.loc 1 1949 0
 	adrp	x25, .LANCHOR0
 	mov	x19, x0
-	.loc 1 1818 0
+	.loc 1 1951 0
 	adrp	x1, .LC22
 	mov	w2, 0
-	.loc 1 1816 0
+	.loc 1 1949 0
 	str	x0, [x25, #:lo12:.LANCHOR0]
-	.loc 1 1818 0
+	.loc 1 1951 0
 	add	x1, x1, :lo12:.LC22
 	ldr	x0, [x20, 752]
-	.loc 1 1815 0
+	.loc 1 1948 0
 	str	x20, [x19]
-	.loc 1 1818 0
+	.loc 1 1951 0
 	bl	of_parse_phandle
-.LVL444:
-	.loc 1 1819 0
-	cbz	x0, .L563
-	.loc 1 1824 0
+.LVL446:
+	.loc 1 1952 0
+	cbz	x0, .L553
+	.loc 1 1957 0
 	bl	of_find_device_by_node
-.LVL445:
-	.loc 1 1826 0
-	cbz	x0, .L479
-.LBB1464:
-.LBB1465:
-.LBB1466:
+.LVL447:
+	.loc 1 1959 0
+	cbz	x0, .L472
+.LBB1442:
+.LBB1443:
+.LBB1444:
 	.loc 2 1181 0
 	ldr	x0, [x0, 200]
-.LVL446:
-.LBE1466:
-.LBE1465:
-.LBE1464:
-	.loc 1 1829 0
+.LVL448:
+.LBE1444:
+.LBE1443:
+.LBE1442:
+	.loc 1 1962 0
 	str	x0, [x19, 8]
-	.loc 1 1830 0
-	cbz	x0, .L479
-	.loc 1 1832 0
+	.loc 1 1963 0
+	cbz	x0, .L472
+	.loc 1 1965 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 1834 0
+	.loc 1 1967 0
 	mov	w2, 0
 	adrp	x1, .LC24
 	add	x1, x1, :lo12:.LC24
 	ldr	x0, [x20, 752]
 	bl	of_parse_phandle
-.LVL447:
-	.loc 1 1835 0
-	cbz	x0, .L564
-	.loc 1 1840 0
+.LVL449:
+	.loc 1 1968 0
+	cbz	x0, .L554
+	.loc 1 1973 0
 	bl	of_find_i2c_device_by_node
-.LVL448:
-	.loc 1 1842 0
-	cbz	x0, .L565
-.LBB1467:
-.LBB1468:
-.LBB1469:
+.LVL450:
+	.loc 1 1975 0
+	cbz	x0, .L555
+.LBB1445:
+.LBB1446:
+.LBB1447:
 	.loc 2 1181 0
 	ldr	x0, [x0, 216]
-.LVL449:
-.LBE1469:
-.LBE1468:
-.LBE1467:
-	.loc 1 1846 0
+.LVL451:
+.LBE1447:
+.LBE1446:
+.LBE1445:
+	.loc 1 1979 0
 	str	x0, [x19, 16]
-	.loc 1 1847 0
-	cbz	x0, .L566
-	.loc 1 1853 0
+	.loc 1 1980 0
+	cbz	x0, .L556
+	.loc 1 1986 0
 	add	x21, x19, 184
-.LVL450:
-	.loc 1 1855 0
+.LVL452:
+	.loc 1 1988 0
 	add	x22, x19, 24
-	.loc 1 1853 0
+	.loc 1 1986 0
 	str	x20, [x21, 88]
-.LBB1470:
-.LBB1471:
-.LBB1472:
-.LBB1473:
-.LBB1474:
+.LBB1448:
+.LBB1449:
+.LBB1450:
+.LBB1451:
+.LBB1452:
 	.file 14 "./include/linux/of.h"
 	.loc 14 499 0
 	adrp	x1, .LC28
-.LBE1474:
-.LBE1473:
-.LBE1472:
-.LBE1471:
-.LBE1470:
-	.loc 1 1855 0
+.LBE1452:
+.LBE1451:
+.LBE1450:
+.LBE1449:
+.LBE1448:
+	.loc 1 1988 0
 	str	x20, [x19, 24]
-.LBB1569:
-.LBB1565:
-.LBB1481:
-.LBB1478:
-.LBB1475:
+.LBB1547:
+.LBB1543:
+.LBB1459:
+.LBB1456:
+.LBB1453:
 	.loc 14 499 0
 	mov	x4, 0
-.LBE1475:
-.LBE1478:
-.LBE1481:
-.LBE1565:
-.LBE1569:
-	.loc 1 1856 0
+.LBE1453:
+.LBE1456:
+.LBE1459:
+.LBE1543:
+.LBE1547:
+	.loc 1 1989 0
 	ldr	x2, [x19, 8]
-.LBB1570:
-.LBB1566:
-.LBB1482:
-.LBB1479:
-.LBB1476:
+.LBB1548:
+.LBB1544:
+.LBB1460:
+.LBB1457:
+.LBB1454:
 	.loc 14 499 0
 	add	x1, x1, :lo12:.LC28
-.LBE1476:
-.LBE1479:
-.LBE1482:
-.LBE1566:
-.LBE1570:
-	.loc 1 1857 0
+.LBE1454:
+.LBE1457:
+.LBE1460:
+.LBE1544:
+.LBE1548:
+	.loc 1 1990 0
 	stp	x2, x0, [x22, 8]
-.LBB1571:
-.LBB1567:
-.LBB1483:
-.LBB1480:
-.LBB1477:
+.LBB1549:
+.LBB1545:
+.LBB1461:
+.LBB1458:
+.LBB1455:
 	.loc 14 499 0
 	mov	x3, 1
 	ldr	x0, [x20, 752]
 	add	x2, x19, 100
 	bl	of_property_read_variable_u32_array
-.LVL451:
+.LVL453:
 	.loc 14 501 0
-	tbnz	w0, #31, .L484
-.LBE1477:
-.LBE1480:
-.LBE1483:
-.LBB1484:
-.LBB1485:
-.LBB1486:
+	tbnz	w0, #31, .L477
+.LBE1455:
+.LBE1458:
+.LBE1461:
+.LBB1462:
+.LBB1463:
+.LBB1464:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC52
@@ -5023,15 +5131,15 @@ ebc_probe:
 	add	x2, x19, 104
 	add	x1, x1, :lo12:.LC52
 	bl	of_property_read_variable_u32_array
-.LVL452:
+.LVL454:
 	.loc 14 501 0
-	tbnz	w0, #31, .L484
-.LBE1486:
-.LBE1485:
-.LBE1484:
-.LBB1487:
-.LBB1488:
-.LBB1489:
+	tbnz	w0, #31, .L477
+.LBE1464:
+.LBE1463:
+.LBE1462:
+.LBB1465:
+.LBB1466:
+.LBB1467:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC53
@@ -5040,15 +5148,15 @@ ebc_probe:
 	add	x2, x19, 108
 	add	x1, x1, :lo12:.LC53
 	bl	of_property_read_variable_u32_array
-.LVL453:
+.LVL455:
 	.loc 14 501 0
-	tbnz	w0, #31, .L484
-.LBE1489:
-.LBE1488:
-.LBE1487:
-.LBB1490:
-.LBB1491:
-.LBB1492:
+	tbnz	w0, #31, .L477
+.LBE1467:
+.LBE1466:
+.LBE1465:
+.LBB1468:
+.LBB1469:
+.LBB1470:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC54
@@ -5057,15 +5165,15 @@ ebc_probe:
 	add	x2, x19, 112
 	add	x1, x1, :lo12:.LC54
 	bl	of_property_read_variable_u32_array
-.LVL454:
+.LVL456:
 	.loc 14 501 0
-	tbnz	w0, #31, .L484
-.LBE1492:
-.LBE1491:
-.LBE1490:
-.LBB1493:
-.LBB1494:
-.LBB1495:
+	tbnz	w0, #31, .L477
+.LBE1470:
+.LBE1469:
+.LBE1468:
+.LBB1471:
+.LBB1472:
+.LBB1473:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC55
@@ -5074,15 +5182,15 @@ ebc_probe:
 	add	x2, x19, 128
 	add	x1, x1, :lo12:.LC55
 	bl	of_property_read_variable_u32_array
-.LVL455:
+.LVL457:
 	.loc 14 501 0
-	tbnz	w0, #31, .L484
-.LBE1495:
-.LBE1494:
-.LBE1493:
-.LBB1496:
-.LBB1497:
-.LBB1498:
+	tbnz	w0, #31, .L477
+.LBE1473:
+.LBE1472:
+.LBE1471:
+.LBB1474:
+.LBB1475:
+.LBB1476:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC56
@@ -5091,15 +5199,15 @@ ebc_probe:
 	add	x2, x19, 132
 	add	x1, x1, :lo12:.LC56
 	bl	of_property_read_variable_u32_array
-.LVL456:
+.LVL458:
 	.loc 14 501 0
-	tbnz	w0, #31, .L484
-.LBE1498:
-.LBE1497:
-.LBE1496:
-.LBB1499:
-.LBB1500:
-.LBB1501:
+	tbnz	w0, #31, .L477
+.LBE1476:
+.LBE1475:
+.LBE1474:
+.LBB1477:
+.LBB1478:
+.LBB1479:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC57
@@ -5108,15 +5216,15 @@ ebc_probe:
 	add	x2, x19, 136
 	add	x1, x1, :lo12:.LC57
 	bl	of_property_read_variable_u32_array
-.LVL457:
+.LVL459:
 	.loc 14 501 0
-	tbnz	w0, #31, .L484
-.LBE1501:
-.LBE1500:
-.LBE1499:
-.LBB1502:
-.LBB1503:
-.LBB1504:
+	tbnz	w0, #31, .L477
+.LBE1479:
+.LBE1478:
+.LBE1477:
+.LBB1480:
+.LBB1481:
+.LBB1482:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC58
@@ -5125,15 +5233,15 @@ ebc_probe:
 	add	x2, x19, 140
 	add	x1, x1, :lo12:.LC58
 	bl	of_property_read_variable_u32_array
-.LVL458:
+.LVL460:
 	.loc 14 501 0
-	tbnz	w0, #31, .L484
-.LBE1504:
-.LBE1503:
-.LBE1502:
-.LBB1505:
-.LBB1506:
-.LBB1507:
+	tbnz	w0, #31, .L477
+.LBE1482:
+.LBE1481:
+.LBE1480:
+.LBB1483:
+.LBB1484:
+.LBB1485:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC59
@@ -5142,15 +5250,15 @@ ebc_probe:
 	add	x2, x19, 144
 	add	x1, x1, :lo12:.LC59
 	bl	of_property_read_variable_u32_array
-.LVL459:
+.LVL461:
 	.loc 14 501 0
-	tbnz	w0, #31, .L484
-.LBE1507:
-.LBE1506:
-.LBE1505:
-.LBB1508:
-.LBB1509:
-.LBB1510:
+	tbnz	w0, #31, .L477
+.LBE1485:
+.LBE1484:
+.LBE1483:
+.LBB1486:
+.LBB1487:
+.LBB1488:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC60
@@ -5159,15 +5267,15 @@ ebc_probe:
 	add	x2, x19, 148
 	add	x1, x1, :lo12:.LC60
 	bl	of_property_read_variable_u32_array
-.LVL460:
+.LVL462:
 	.loc 14 501 0
-	tbnz	w0, #31, .L484
-.LBE1510:
-.LBE1509:
-.LBE1508:
-.LBB1511:
-.LBB1512:
-.LBB1513:
+	tbnz	w0, #31, .L477
+.LBE1488:
+.LBE1487:
+.LBE1486:
+.LBB1489:
+.LBB1490:
+.LBB1491:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC61
@@ -5176,15 +5284,15 @@ ebc_probe:
 	add	x2, x19, 152
 	add	x1, x1, :lo12:.LC61
 	bl	of_property_read_variable_u32_array
-.LVL461:
+.LVL463:
 	.loc 14 501 0
-	tbnz	w0, #31, .L484
-.LBE1513:
-.LBE1512:
-.LBE1511:
-.LBB1514:
-.LBB1515:
-.LBB1516:
+	tbnz	w0, #31, .L477
+.LBE1491:
+.LBE1490:
+.LBE1489:
+.LBB1492:
+.LBB1493:
+.LBB1494:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC62
@@ -5193,15 +5301,15 @@ ebc_probe:
 	add	x2, x19, 156
 	add	x1, x1, :lo12:.LC62
 	bl	of_property_read_variable_u32_array
-.LVL462:
+.LVL464:
 	.loc 14 501 0
-	tbnz	w0, #31, .L484
-.LBE1516:
-.LBE1515:
-.LBE1514:
-.LBB1517:
-.LBB1518:
-.LBB1519:
+	tbnz	w0, #31, .L477
+.LBE1494:
+.LBE1493:
+.LBE1492:
+.LBB1495:
+.LBB1496:
+.LBB1497:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC63
@@ -5210,15 +5318,15 @@ ebc_probe:
 	add	x2, x19, 160
 	add	x1, x1, :lo12:.LC63
 	bl	of_property_read_variable_u32_array
-.LVL463:
+.LVL465:
 	.loc 14 501 0
-	tbnz	w0, #31, .L484
-.LBE1519:
-.LBE1518:
-.LBE1517:
-.LBB1520:
-.LBB1521:
-.LBB1522:
+	tbnz	w0, #31, .L477
+.LBE1497:
+.LBE1496:
+.LBE1495:
+.LBB1498:
+.LBB1499:
+.LBB1500:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC64
@@ -5227,15 +5335,15 @@ ebc_probe:
 	add	x2, x19, 164
 	add	x1, x1, :lo12:.LC64
 	bl	of_property_read_variable_u32_array
-.LVL464:
+.LVL466:
 	.loc 14 501 0
-	tbnz	w0, #31, .L484
-.LBE1522:
-.LBE1521:
-.LBE1520:
-.LBB1523:
-.LBB1524:
-.LBB1525:
+	tbnz	w0, #31, .L477
+.LBE1500:
+.LBE1499:
+.LBE1498:
+.LBB1501:
+.LBB1502:
+.LBB1503:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC65
@@ -5244,15 +5352,15 @@ ebc_probe:
 	add	x2, x19, 168
 	add	x1, x1, :lo12:.LC65
 	bl	of_property_read_variable_u32_array
-.LVL465:
+.LVL467:
 	.loc 14 501 0
-	tbnz	w0, #31, .L484
-.LBE1525:
-.LBE1524:
-.LBE1523:
-.LBB1526:
-.LBB1527:
-.LBB1528:
+	tbnz	w0, #31, .L477
+.LBE1503:
+.LBE1502:
+.LBE1501:
+.LBB1504:
+.LBB1505:
+.LBB1506:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC66
@@ -5261,15 +5369,15 @@ ebc_probe:
 	add	x2, x19, 172
 	add	x1, x1, :lo12:.LC66
 	bl	of_property_read_variable_u32_array
-.LVL466:
+.LVL468:
 	.loc 14 501 0
-	tbnz	w0, #31, .L567
-.LBE1528:
-.LBE1527:
-.LBE1526:
-.LBB1529:
-.LBB1530:
-.LBB1531:
+	tbnz	w0, #31, .L557
+.LBE1506:
+.LBE1505:
+.LBE1504:
+.LBB1507:
+.LBB1508:
+.LBB1509:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC29
@@ -5278,16 +5386,16 @@ ebc_probe:
 	add	x2, x19, 176
 	add	x1, x1, :lo12:.LC29
 	bl	of_property_read_variable_u32_array
-.LVL467:
+.LVL469:
 	.loc 14 501 0
-	tbnz	w0, #31, .L485
-.L511:
-.LBE1531:
-.LBE1530:
-.LBE1529:
-.LBB1536:
-.LBB1537:
-.LBB1538:
+	tbnz	w0, #31, .L478
+.L504:
+.LBE1509:
+.LBE1508:
+.LBE1507:
+.LBB1514:
+.LBB1515:
+.LBB1516:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC30
@@ -5296,16 +5404,16 @@ ebc_probe:
 	add	x2, x19, 180
 	add	x1, x1, :lo12:.LC30
 	bl	of_property_read_variable_u32_array
-.LVL468:
+.LVL470:
 	.loc 14 501 0
-	tbnz	w0, #31, .L486
-.L512:
-.LBE1538:
-.LBE1537:
-.LBE1536:
-.LBB1543:
-.LBB1544:
-.LBB1545:
+	tbnz	w0, #31, .L479
+.L505:
+.LBE1516:
+.LBE1515:
+.LBE1514:
+.LBB1521:
+.LBB1522:
+.LBB1523:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC31
@@ -5314,16 +5422,16 @@ ebc_probe:
 	add	x2, x19, 116
 	add	x1, x1, :lo12:.LC31
 	bl	of_property_read_variable_u32_array
-.LVL469:
+.LVL471:
 	.loc 14 501 0
-	tbnz	w0, #31, .L487
-.L513:
-.LBE1545:
-.LBE1544:
-.LBE1543:
-.LBB1550:
-.LBB1551:
-.LBB1552:
+	tbnz	w0, #31, .L480
+.L506:
+.LBE1523:
+.LBE1522:
+.LBE1521:
+.LBB1528:
+.LBB1529:
+.LBB1530:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC32
@@ -5332,305 +5440,280 @@ ebc_probe:
 	add	x2, x19, 120
 	add	x1, x1, :lo12:.LC32
 	bl	of_property_read_variable_u32_array
-.LVL470:
+.LVL472:
 	.loc 14 501 0
-	tbnz	w0, #31, .L488
-.L514:
-.LBE1552:
-.LBE1551:
-.LBE1550:
-.LBE1567:
-.LBE1571:
-	.loc 1 1865 0
+	tbnz	w0, #31, .L481
+.L507:
+.LBE1530:
+.LBE1529:
+.LBE1528:
+.LBE1545:
+.LBE1549:
+	.loc 1 1998 0
 	ldr	w0, [x22, 88]
-.LBB1572:
-.LBB1573:
-	.loc 1 1602 0
+.LBB1550:
+.LBB1551:
+	.loc 1 1735 0
 	mov	w2, 0
-.LBE1573:
-.LBE1572:
-	.loc 1 1865 0
+.LBE1551:
+.LBE1550:
+	.loc 1 1998 0
 	str	w0, [x21, 52]
-	.loc 1 1866 0
+	.loc 1 1999 0
 	ldr	w1, [x22, 84]
 	str	w1, [x21, 56]
-	.loc 1 1867 0
+	.loc 1 2000 0
 	mul	w0, w0, w1
-.LBB1601:
-.LBB1596:
-	.loc 1 1602 0
+.LBB1575:
+.LBB1570:
+	.loc 1 1735 0
 	adrp	x1, .LC33
 	add	x1, x1, :lo12:.LC33
-.LBE1596:
-.LBE1601:
-	.loc 1 1867 0
+.LBE1570:
+.LBE1575:
+	.loc 1 2000 0
 	lsr	w3, w0, 1
-	.loc 1 1868 0
+	.loc 1 2001 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x21, 20]
-.LBB1602:
-.LBB1597:
-	.loc 1 1593 0
+.LBB1576:
+.LBB1571:
+	.loc 1 1726 0
 	ldr	x26, [x19]
-.LVL471:
-	.loc 1 1602 0
+.LVL473:
+	.loc 1 1735 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL472:
-	.loc 1 1603 0
-	cbz	x0, .L521
-	.loc 1 1606 0
+.LVL474:
+	.loc 1 1736 0
+	cbz	x0, .L514
+	.loc 1 1739 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL473:
+.LVL475:
 	mov	w24, w0
-	.loc 1 1608 0
-	cbnz	w0, .L568
-.LBB1574:
-.LBB1575:
+	.loc 1 1741 0
+	cbnz	w0, .L558
+.LBB1552:
+.LBB1553:
 	.file 15 "./include/linux/ioport.h"
 	.loc 15 204 0
 	ldp	x1, x2, [x29, 104]
-.LBE1575:
-.LBE1574:
-	.loc 1 1613 0
+.LBE1553:
+.LBE1552:
+	.loc 1 1746 0
 	str	x1, [x19, 184]
-	.loc 1 1616 0
+	.loc 1 1749 0
 	mov	x3, 1
 	mov	x0, x26
-.LBB1577:
-.LBB1576:
+.LBB1555:
+.LBB1554:
 	.loc 15 204 0
 	add	x2, x2, 1
 	sub	x2, x2, x1
-.LBE1576:
-.LBE1577:
-	.loc 1 1614 0
+.LBE1554:
+.LBE1555:
+	.loc 1 1747 0
 	str	w2, [x21, 16]
-	.loc 1 1616 0
+	.loc 1 1749 0
 	sxtw	x2, w2
 	bl	devm_memremap
-.LVL474:
+.LVL476:
 	str	x0, [x21, 8]
-	.loc 1 1618 0
-	cbz	x0, .L492
-	.loc 1 1626 0
+	.loc 1 1751 0
+	cbz	x0, .L485
+	.loc 1 1759 0
 	mov	x1, x0
 	ldr	w2, [x21, 16]
 	ldr	x0, [x19, 184]
 	mov	w4, 4
 	mov	w3, 2097152
 	bl	ebc_buf_init
-.LVL475:
-	.loc 1 1627 0
-	cbnz	w0, .L492
-	.loc 1 1632 0
+.LVL477:
+	.loc 1 1760 0
+	cbnz	w0, .L485
+	.loc 1 1765 0
 	ldr	x0, [x21, 8]
-	.loc 1 1633 0
+	.loc 1 1766 0
 	mov	x5, 1048576
 	str	x5, [x22, 40]
-.LBB1578:
-.LBB1579:
+.LBB1556:
+.LBB1557:
 	.loc 2 711 0
 	mov	w2, 32960
-.LBE1579:
-.LBE1578:
-	.loc 1 1632 0
+.LBE1557:
+.LBE1556:
+	.loc 1 1765 0
 	add	x6, x0, 10485760
 	str	x6, [x22, 24]
 	add	x4, x0, 11534336
-	.loc 1 1638 0
+	.loc 1 1771 0
 	add	x1, x0, 12582912
-	.loc 1 1634 0
+	.loc 1 1767 0
 	ldr	x3, [x19, 184]
-.LBB1583:
-.LBB1580:
+.LBB1561:
+.LBB1558:
 	.loc 2 711 0
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
-.LBE1580:
-.LBE1583:
-	.loc 1 1634 0
+.LBE1558:
+.LBE1561:
+	.loc 1 1767 0
 	add	x7, x3, 10485760
 	str	x7, [x22, 32]
-	.loc 1 1635 0
-	str	x6, [x21, 176]
-	.loc 1 1634 0
+	.loc 1 1768 0
+	str	x6, [x21, 168]
+	.loc 1 1767 0
 	add	x3, x3, 11534336
-	.loc 1 1633 0
+	.loc 1 1766 0
 	str	x5, [x22, 64]
-	.loc 1 1634 0
+	.loc 1 1767 0
 	stp	x4, x3, [x22, 48]
-	.loc 1 1638 0
+	.loc 1 1771 0
 	str	x1, [x21, 112]
-.LBB1584:
-.LBB1581:
+.LBB1562:
+.LBB1559:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
-.LBE1581:
-.LBE1584:
-	.loc 1 1635 0
-	str	x4, [x21, 184]
-.LBB1585:
-.LBB1582:
+.LBE1559:
+.LBE1562:
+	.loc 1 1768 0
+	str	x4, [x21, 176]
+.LBB1563:
+.LBB1560:
 	.loc 2 711 0
 	bl	devm_kmalloc
-.LVL476:
-.LBE1582:
-.LBE1585:
-	.loc 1 1641 0
+.LVL478:
+.LBE1560:
+.LBE1563:
+	.loc 1 1774 0
 	str	x0, [x21, 128]
-	.loc 1 1642 0
-	cbz	x0, .L492
-.LBB1586:
-.LBB1587:
+	.loc 1 1775 0
+	cbz	x0, .L485
+.LBB1564:
+.LBB1565:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL477:
-.LBE1587:
-.LBE1586:
-	.loc 1 1644 0
+.LVL479:
+.LBE1565:
+.LBE1564:
+	.loc 1 1777 0
 	str	x0, [x21, 136]
-	.loc 1 1645 0
-	cbz	x0, .L492
-.LBB1588:
-.LBB1589:
+	.loc 1 1778 0
+	cbz	x0, .L485
+.LBB1566:
+.LBB1567:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL478:
-.LBE1589:
-.LBE1588:
-	.loc 1 1647 0
+.LVL480:
+.LBE1567:
+.LBE1566:
+	.loc 1 1780 0
 	str	x0, [x21, 144]
-	.loc 1 1648 0
-	cbz	x0, .L492
-.LBB1590:
-.LBB1591:
+	.loc 1 1781 0
+	cbz	x0, .L485
+	.loc 1 1788 0
+	ldp	w1, w0, [x22, 84]
+.LBB1568:
+.LBB1569:
 	.loc 2 711 0
-	ldrsw	x1, [x21, 20]
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
+	mul	w1, w1, w0
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL479:
-.LBE1591:
-.LBE1590:
-	.loc 1 1650 0
+.LVL481:
+.LBE1569:
+.LBE1568:
+	.loc 1 1788 0
 	str	x0, [x21, 152]
-	.loc 1 1651 0
-	cbz	x0, .L492
-	.loc 1 1655 0
-	ldp	w1, w2, [x22, 84]
-.LBB1592:
-.LBB1593:
-	.loc 2 711 0
-	mov	x0, x26
-.LBE1593:
-.LBE1592:
-	.loc 1 1655 0
-	mul	w1, w1, w2
-.LBB1595:
-.LBB1594:
-	.loc 2 711 0
-	mov	w2, 32960
-	movk	w2, 0x60, lsl 16
-	lsr	w1, w1, 4
-	bl	devm_kmalloc
-.LVL480:
-.LBE1594:
-.LBE1595:
-	.loc 1 1655 0
-	str	x0, [x21, 160]
-	.loc 1 1656 0
-	cbz	x0, .L492
-	.loc 1 1658 0
+	.loc 1 1789 0
+	cbz	x0, .L485
+	.loc 1 1791 0
 	ldp	w2, w1, [x22, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
-	lsr	w2, w2, 4
 	bl	memset
-.LVL481:
-	.loc 1 1659 0
+.LVL482:
+	.loc 1 1792 0
 	ldrsw	x2, [x21, 20]
 	mov	w1, 255
 	ldr	x0, [x21, 144]
 	bl	memset
-.LVL482:
-.LBE1597:
-.LBE1602:
-.LBB1603:
-.LBB1604:
-	.loc 1 1553 0
-	ldr	x26, [x19, 272]
 .LVL483:
-	.loc 1 1559 0
+.LBE1571:
+.LBE1576:
+.LBB1577:
+.LBB1578:
+	.loc 1 1686 0
+	ldr	x26, [x19, 272]
+.LVL484:
+	.loc 1 1692 0
 	adrp	x1, .LC35
 	mov	w2, 0
 	add	x1, x1, :lo12:.LC35
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL484:
-	.loc 1 1560 0
-	cbz	x0, .L522
-	.loc 1 1563 0
+.LVL485:
+	.loc 1 1693 0
+	cbz	x0, .L515
+	.loc 1 1696 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL485:
-	mov	w24, w0
-	.loc 1 1565 0
-	cbz	w0, .L569
 .LVL486:
-.L493:
-.LBE1604:
-.LBE1603:
-	.loc 1 1880 0
+	mov	w24, w0
+	.loc 1 1698 0
+	cbz	w0, .L559
+.L486:
+.LBE1578:
+.LBE1577:
+	.loc 1 2013 0
 	adrp	x1, .LC68
 	mov	x0, x20
-.LVL487:
 	add	x1, x1, :lo12:.LC68
 	bl	_dev_err
+.LVL487:
+	.loc 1 2014 0
+	b	.L468
 .LVL488:
-	.loc 1 1881 0
-	b	.L475
-.LVL489:
 	.p2align 3
-.L484:
-	.loc 1 1863 0
+.L477:
+	.loc 1 1996 0
 	mov	w24, -22
-	.loc 1 1862 0
+	.loc 1 1995 0
 	adrp	x1, .LC72
 	mov	w2, w24
 	add	x1, x1, :lo12:.LC72
 	mov	x0, x20
 	bl	_dev_err
-.LVL490:
-.L475:
-	.loc 1 1905 0
+.LVL489:
+.L468:
+	.loc 1 2038 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w24
-.LVL491:
+.LVL490:
 	ldr	x2, [x29, 200]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L570
+	cbnz	x1, .L560
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL492:
+.LVL491:
 	ldp	x23, x24, [sp, 48]
 	ldp	x25, x26, [sp, 64]
-.LVL493:
+.LVL492:
 	ldp	x27, x28, [sp, 80]
-.LVL494:
+.LVL493:
 	ldp	x29, x30, [sp], 208
 	.cfi_remember_state
 	.cfi_restore 30
@@ -5647,251 +5730,251 @@ ebc_probe:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL495:
+.LVL494:
 	.p2align 3
-.L568:
+.L558:
 	.cfi_restore_state
-.LBB1611:
-.LBB1598:
-	.loc 1 1609 0
+.LBB1585:
+.LBB1572:
+	.loc 1 1742 0
 	adrp	x1, .LC34
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC34
 	bl	_dev_err
-.LVL496:
-.L489:
-.LBE1598:
-.LBE1611:
-	.loc 1 1873 0
+.LVL495:
+.L482:
+.LBE1572:
+.LBE1585:
+	.loc 1 2006 0
 	adrp	x1, .LC67
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC67
 	bl	_dev_err
+.LVL496:
+	.loc 1 2007 0
+	b	.L468
 .LVL497:
-	.loc 1 1874 0
-	b	.L475
-.LVL498:
 	.p2align 3
-.L488:
-.LBB1612:
-.LBB1568:
-	.loc 1 1202 0
+.L481:
+.LBB1586:
+.LBB1546:
+	.loc 1 1335 0
 	str	wzr, [x22, 96]
-	b	.L514
+	b	.L507
 	.p2align 3
-.L487:
-.LBB1557:
-.LBB1555:
-.LBB1553:
+.L480:
+.LBB1535:
+.LBB1533:
+.LBB1531:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC32
-.LBE1553:
-.LBE1555:
-.LBE1557:
-	.loc 1 1199 0
+.LBE1531:
+.LBE1533:
+.LBE1535:
+	.loc 1 1332 0
 	str	wzr, [x22, 92]
-.LBB1558:
-.LBB1556:
-.LBB1554:
+.LBB1536:
+.LBB1534:
+.LBB1532:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 120
 	add	x1, x1, :lo12:.LC32
 	bl	of_property_read_variable_u32_array
-.LVL499:
+.LVL498:
 	.loc 14 501 0
-	tbz	w0, #31, .L514
-	b	.L488
+	tbz	w0, #31, .L507
+	b	.L481
 	.p2align 3
-.L486:
-.LBE1554:
-.LBE1556:
-.LBE1558:
-.LBB1559:
-.LBB1548:
-.LBB1546:
+.L479:
+.LBE1532:
+.LBE1534:
+.LBE1536:
+.LBB1537:
+.LBB1526:
+.LBB1524:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC31
-.LBE1546:
-.LBE1548:
-.LBE1559:
-	.loc 1 1196 0
+.LBE1524:
+.LBE1526:
+.LBE1537:
+	.loc 1 1329 0
 	str	wzr, [x22, 156]
-.LBB1560:
-.LBB1549:
-.LBB1547:
+.LBB1538:
+.LBB1527:
+.LBB1525:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 116
 	add	x1, x1, :lo12:.LC31
 	bl	of_property_read_variable_u32_array
-.LVL500:
+.LVL499:
 	.loc 14 501 0
-	tbz	w0, #31, .L513
-	b	.L487
+	tbz	w0, #31, .L506
+	b	.L480
 	.p2align 3
-.L485:
-.LBE1547:
-.LBE1549:
-.LBE1560:
-.LBB1561:
-.LBB1541:
+.L478:
+.LBE1525:
+.LBE1527:
+.LBE1538:
 .LBB1539:
+.LBB1519:
+.LBB1517:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC30
+.LBE1517:
+.LBE1519:
 .LBE1539:
-.LBE1541:
-.LBE1561:
-	.loc 1 1193 0
+	.loc 1 1326 0
 	str	wzr, [x22, 152]
-.LBB1562:
-.LBB1542:
 .LBB1540:
+.LBB1520:
+.LBB1518:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 180
 	add	x1, x1, :lo12:.LC30
 	bl	of_property_read_variable_u32_array
-.LVL501:
+.LVL500:
 	.loc 14 501 0
-	tbz	w0, #31, .L512
-	b	.L486
+	tbz	w0, #31, .L505
+	b	.L479
 	.p2align 3
-.L567:
+.L557:
+.LBE1518:
+.LBE1520:
 .LBE1540:
-.LBE1542:
-.LBE1562:
-.LBB1563:
-.LBB1534:
-.LBB1532:
+.LBB1541:
+.LBB1512:
+.LBB1510:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC29
-.LBE1532:
-.LBE1534:
-.LBE1563:
-	.loc 1 1190 0
+.LBE1510:
+.LBE1512:
+.LBE1541:
+	.loc 1 1323 0
 	str	wzr, [x22, 148]
-.LBB1564:
-.LBB1535:
-.LBB1533:
+.LBB1542:
+.LBB1513:
+.LBB1511:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 176
 	add	x1, x1, :lo12:.LC29
 	bl	of_property_read_variable_u32_array
-.LVL502:
+.LVL501:
 	.loc 14 501 0
-	tbz	w0, #31, .L511
-	b	.L485
-.LVL503:
+	tbz	w0, #31, .L504
+	b	.L478
+.LVL502:
 	.p2align 3
-.L569:
-.LBE1533:
-.LBE1535:
-.LBE1564:
-.LBE1568:
-.LBE1612:
-.LBB1613:
-.LBB1607:
-	.loc 1 1571 0
+.L559:
+.LBE1511:
+.LBE1513:
+.LBE1542:
+.LBE1546:
+.LBE1586:
+.LBB1587:
+.LBB1581:
+	.loc 1 1704 0
 	mov	x0, x26
 	mov	x3, 1
-.LBB1605:
-.LBB1606:
+.LBB1579:
+.LBB1580:
 	.loc 15 204 0
 	ldp	x1, x26, [x29, 104]
-.LVL504:
+.LVL503:
 	add	x26, x26, 1
 	sub	x26, x26, x1
-.LBE1606:
-.LBE1605:
-	.loc 1 1571 0
+.LBE1580:
+.LBE1579:
+	.loc 1 1704 0
 	sxtw	x2, w26
 	bl	devm_memremap
-.LVL505:
-	str	x0, [x19, 384]
-	.loc 1 1573 0
-	cbz	x0, .L571
-	.loc 1 1578 0
+.LVL504:
+	str	x0, [x19, 376]
+	.loc 1 1706 0
+	cbz	x0, .L561
+	.loc 1 1711 0
 	bl	epd_lut_from_mem_init
-.LVL506:
-	.loc 1 1579 0
-	tbnz	w0, #31, .L572
-.L495:
-.LBE1607:
-.LBE1613:
-.LBB1614:
-.LBB1615:
-	.loc 1 1668 0
-	add	x0, x19, 744
+.LVL505:
+	.loc 1 1712 0
+	tbnz	w0, #31, .L562
+.L488:
+.LBE1581:
+.LBE1587:
+.LBB1588:
+.LBB1589:
+	.loc 1 1801 0
+	add	x0, x19, 736
 	mov	x1, 68719476704
-	str	x1, [x21, 552]
-	.loc 1 1670 0
+	str	x1, [x21, 544]
+	.loc 1 1803 0
 	add	x25, x25, :lo12:.LANCHOR0
-.LBB1616:
-.LBB1617:
-.LBB1618:
-.LBB1619:
-.LBB1620:
+.LBB1590:
+.LBB1591:
+.LBB1592:
+.LBB1593:
+.LBB1594:
 	.loc 12 234 0
-	str	x0, [x19, 744]
-.LBE1620:
-.LBE1619:
-.LBE1618:
-.LBE1617:
-.LBE1616:
-	.loc 1 1666 0
+	str	x0, [x19, 736]
+.LBE1594:
+.LBE1593:
+.LBE1592:
+.LBE1591:
+.LBE1590:
+	.loc 1 1799 0
 	mov	w26, 99
-.LBB1622:
-.LBB1621:
+.LBB1596:
+.LBB1595:
 	.file 16 "./include/linux/list.h"
 	.loc 16 29 0
 	str	x0, [x0, 8]
-.LBE1621:
-.LBE1622:
-	.loc 1 1668 0
+.LBE1595:
+.LBE1596:
+	.loc 1 1801 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
-	str	x0, [x21, 576]
-	.loc 1 1670 0
+	str	x0, [x21, 568]
+	.loc 1 1803 0
 	adrp	x3, .LC69
 	mov	w2, -1
 	add	x3, x3, :lo12:.LC69
 	mov	x1, x21
 	adrp	x0, ebc_auto_tast_function
-	.loc 1 1666 0
+	.loc 1 1799 0
 	str	w26, [x29, 104]
-	.loc 1 1670 0
+	.loc 1 1803 0
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
-.LVL507:
+.LVL506:
 	str	x0, [x25, 8]
-	.loc 1 1671 0
+	.loc 1 1804 0
 	cmn	x0, #4096
-	bhi	.L573
-	.loc 1 1675 0
+	bhi	.L563
+	.loc 1 1808 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
-.LVL508:
-	.loc 1 1676 0
+.LVL507:
+	.loc 1 1809 0
 	ldr	x2, [x25, 8]
-.LBB1623:
-.LBB1624:
+.LBB1597:
+.LBB1598:
 	.file 17 "./arch/arm64/include/asm/atomic_lse.h"
 	.loc 17 47 0
 	mov	w0, 1
-.LVL509:
+.LVL508:
 	add	x1, x2, 48
-.LVL510:
+.LVL509:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -5919,49 +6002,49 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL511:
+.LVL510:
 #NO_APP
-.LBE1624:
-.LBE1623:
-.LBB1625:
-	.loc 1 1679 0
+.LBE1598:
+.LBE1597:
+.LBB1599:
+	.loc 1 1812 0
 	adrp	x3, .LC40
 	adrp	x0, ebc_thread
-.LVL512:
+.LVL511:
 	add	x3, x3, :lo12:.LC40
 	mov	w2, -1
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x21
-.LBE1625:
-	.loc 1 1678 0
+.LBE1599:
+	.loc 1 1811 0
 	str	w26, [x29, 104]
-.LBB1626:
-	.loc 1 1679 0
+.LBB1600:
+	.loc 1 1812 0
 	bl	kthread_create_on_node
-.LVL513:
+.LVL512:
 	mov	x25, x0
-.LVL514:
+.LVL513:
 	cmn	x0, #4096
-	bhi	.L497
+	bhi	.L490
 	bl	wake_up_process
-.LVL515:
-.LBE1626:
+.LVL514:
+.LBE1600:
 	str	x25, [x21, 120]
-	.loc 1 1684 0
+	.loc 1 1817 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x25
 	bl	sched_setscheduler_nocheck
-.LVL516:
-	.loc 1 1685 0
+.LVL515:
+	.loc 1 1818 0
 	ldr	x2, [x21, 120]
-.LBB1627:
-.LBB1628:
+.LBB1601:
+.LBB1602:
 	.loc 17 47 0
 	mov	w0, 1
-.LVL517:
+.LVL516:
 	add	x1, x2, 48
-.LVL518:
+.LVL517:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -5989,62 +6072,62 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL519:
+.LVL518:
 #NO_APP
-.LBE1628:
-.LBE1627:
-.LBE1615:
-.LBE1614:
-.LBB1631:
-.LBB1632:
-	.loc 1 1694 0
+.LBE1602:
+.LBE1601:
+.LBE1589:
+.LBE1588:
+.LBB1605:
+.LBB1606:
+	.loc 1 1827 0
 	mov	w0, -1
-.LVL520:
+.LVL519:
 	str	w0, [x21, 48]
-.LBB1633:
-.LBB1634:
+.LBB1607:
+.LBB1608:
 	.loc 4 39 0
-	add	x0, x19, 408
-.LVL521:
-.LBE1634:
-.LBE1633:
-	.loc 1 1698 0
+	add	x0, x19, 400
+.LVL520:
+.LBE1608:
+.LBE1607:
+	.loc 1 1831 0
 	str	wzr, [x21, 28]
-	.loc 1 1697 0
+	.loc 1 1830 0
 	str	wzr, [x21, 80]
-.LBB1639:
-.LBB1635:
+.LBB1613:
+.LBB1609:
 	.loc 4 43 0
 	adrp	x1, .LC41
-.LBE1635:
-.LBE1639:
-	.loc 1 1693 0
-	str	wzr, [x21, 192]
-.LBB1640:
-.LBB1636:
+.LBE1609:
+.LBE1613:
+	.loc 1 1826 0
+	str	wzr, [x21, 184]
+.LBB1614:
+.LBB1610:
 	.loc 4 43 0
 	add	x1, x1, :lo12:.LC41
-.LBE1636:
-.LBE1640:
-	.loc 1 1695 0
-	str	wzr, [x21, 600]
-	.loc 1 1705 0
-	add	x25, x19, 624
-.LVL522:
-	.loc 1 1696 0
-	str	wzr, [x21, 604]
-	.loc 1 1706 0
+.LBE1610:
+.LBE1614:
+	.loc 1 1828 0
+	str	wzr, [x21, 592]
+	.loc 1 1838 0
+	add	x25, x19, 616
+.LVL521:
+	.loc 1 1829 0
+	str	wzr, [x21, 596]
+	.loc 1 1839 0
 	adrp	x26, jiffies
-.LBB1641:
-.LBB1637:
+.LBB1615:
+.LBB1611:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0]
-.LBE1637:
-.LBE1641:
-	.loc 1 1706 0
+.LBE1611:
+.LBE1615:
+	.loc 1 1839 0
 	mov	x27, 268435455
-.LBB1642:
-.LBB1638:
+.LBB1616:
+.LBB1612:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0, 16]
 	stp	xzr, xzr, [x0, 32]
@@ -6059,15 +6142,15 @@ ebc_probe:
 	stp	xzr, xzr, [x0, 176]
 	stp	xzr, xzr, [x0, 192]
 	.loc 4 43 0
-	str	x1, [x19, 408]
+	str	x1, [x19, 400]
 	.loc 4 45 0
 	bl	wakeup_source_add
-.LVL523:
-.LBE1638:
-.LBE1642:
-	.loc 1 1702 0
-	str	wzr, [x21, 432]
-	.loc 1 1705 0
+.LVL522:
+.LBE1612:
+.LBE1616:
+	.loc 1 1835 0
+	str	wzr, [x21, 424]
+	.loc 1 1838 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -6075,17 +6158,17 @@ ebc_probe:
 	adrp	x1, ebc_vdd_power_timeout
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
-.LVL524:
-	.loc 1 1706 0
+.LVL523:
+	.loc 1 1839 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
-	.loc 1 1709 0
-	add	x25, x19, 680
-	.loc 1 1706 0
+	.loc 1 1842 0
+	add	x25, x19, 672
+	.loc 1 1839 0
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL525:
-	.loc 1 1709 0
+.LVL524:
+	.loc 1 1842 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -6093,631 +6176,630 @@ ebc_probe:
 	adrp	x1, ebc_frame_timeout
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
-.LVL526:
-	.loc 1 1710 0
+.LVL525:
+	.loc 1 1843 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL527:
-.LBE1632:
-.LBE1631:
-.LBB1643:
-.LBB1644:
-	.loc 1 1720 0
+.LVL526:
+.LBE1606:
+.LBE1605:
+.LBB1617:
+.LBB1618:
+	.loc 1 1853 0
 	adrp	x0, saved_command_line
 	adrp	x1, .LC42
-	.loc 1 1717 0
+	.loc 1 1850 0
 	stp	wzr, wzr, [x29, 100]
-.LVL528:
-	.loc 1 1720 0
+.LVL527:
+	.loc 1 1853 0
 	add	x1, x1, :lo12:.LC42
 	ldr	x25, [x0, #:lo12:saved_command_line]
 	mov	x0, x25
 	bl	strstr
-.LVL529:
-	.loc 1 1721 0
+.LVL528:
+	.loc 1 1854 0
 	adrp	x1, .LC43
-	.loc 1 1720 0
+	.loc 1 1853 0
 	mov	x26, x0
-.LVL530:
-	.loc 1 1721 0
+.LVL529:
+	.loc 1 1854 0
 	add	x1, x1, :lo12:.LC43
 	mov	x0, x25
 	bl	strstr
-.LVL531:
+.LVL530:
 	mov	x28, x0
-.LVL532:
-	.loc 1 1726 0
-	cbz	x26, .L498
-	.loc 1 1727 0
+.LVL531:
+	.loc 1 1859 0
+	cbz	x26, .L491
+	.loc 1 1860 0
 	add	x2, x29, 100
 	adrp	x1, .LC44
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC44
 	bl	sscanf
-.LVL533:
-	.loc 1 1728 0
+.LVL532:
+	.loc 1 1861 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
-	bls	.L574
-.L498:
-	.loc 1 1740 0
+	bls	.L564
+.L491:
+	.loc 1 1873 0
 	mov	w25, 0
-.LVL534:
+.LVL533:
 	mov	x27, 0
-.LVL535:
-	.loc 1 1724 0
+.LVL534:
+	.loc 1 1857 0
 	mov	x26, 0
+.LVL535:
+	.loc 1 1873 0
+	cbz	x28, .L511
 .LVL536:
-	.loc 1 1740 0
-	cbz	x28, .L518
-.LVL537:
-.L517:
-	.loc 1 1741 0
+.L510:
+	.loc 1 1874 0
 	add	x2, x29, 104
 	mov	x0, x28
 	adrp	x1, .LC47
 	add	x1, x1, :lo12:.LC47
 	bl	sscanf
-.LVL538:
-	.loc 1 1719 0
+.LVL537:
+	.loc 1 1852 0
 	mov	w28, 0
-.LVL539:
-	.loc 1 1742 0
+.LVL538:
+	.loc 1 1875 0
 	ldr	w2, [x29, 104]
-	.loc 1 1724 0
+	.loc 1 1857 0
 	mov	x26, 0
-.LVL540:
-	.loc 1 1742 0
+.LVL539:
+	.loc 1 1875 0
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
-	bls	.L575
-.L502:
-	.loc 1 1754 0
-	cbz	w25, .L518
-.L501:
-	.loc 1 1761 0
-	bl	ebc_empty_buf_get
+	bls	.L565
+.L495:
+	.loc 1 1887 0
+	cbnz	w25, .L494
+.LVL540:
+.L511:
+	.loc 1 1888 0
+	ldr	x0, [x21, 88]
+	adrp	x1, .LC50
+	add	x1, x1, :lo12:.LC50
+	bl	_dev_info
 .LVL541:
-	mov	x25, x0
+	.loc 1 1889 0
+	ldr	x0, [x19, 16]
+	bl	ebc_pmic_verity_vcom
 .LVL542:
-	.loc 1 1762 0
-	cbz	x0, .L504
-	.loc 1 1763 0
-	ldp	w2, w0, [x22, 84]
-	mov	x1, x27
+.LBB1619:
+.LBB1620:
+	.loc 1 1243 0
+	bl	ebc_empty_buf_get
+.LVL543:
+	mov	x25, x0
+.LVL544:
+	.loc 1 1244 0
+	ldp	w2, w0, [x19, 108]
+	mov	w1, 255
 	mul	w2, w2, w0
 	ldr	x0, [x25, 16]
 	lsr	w2, w2, 1
-	bl	memcpy
-.LVL543:
-	.loc 1 1766 0
+	bl	memset
+.LVL545:
+	.loc 1 1247 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1764 0
-	mov	w0, 7
+	.loc 1 1245 0
+	mov	w0, 14
 	str	w0, [x25, 40]
-	.loc 1 1769 0
+	.loc 1 1250 0
 	mov	x0, x25
-	.loc 1 1767 0
-	ldr	w1, [x22, 84]
+	.loc 1 1248 0
+	ldr	w1, [x19, 108]
 	str	w1, [x25, 56]
-	.loc 1 1768 0
-	ldr	w1, [x22, 88]
+	.loc 1 1249 0
+	ldr	w1, [x19, 112]
 	str	w1, [x25, 60]
-	.loc 1 1769 0
+	.loc 1 1250 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL544:
-.L504:
-	.loc 1 1773 0
-	cbnz	w28, .L576
-.L506:
-	.loc 1 1786 0
+.LVL546:
+.L497:
+.LBE1620:
+.LBE1619:
+	.loc 1 1906 0
+	cbnz	w28, .L566
+.L499:
+	.loc 1 1919 0
 	ldr	w0, [x21, 80]
 	adrp	x22, .LANCHOR1
-	cbz	w0, .L577
-.L508:
-	.loc 1 1791 0
-	cbz	x27, .L509
-	.loc 1 1792 0
+	cbz	w0, .L567
+.L501:
+	.loc 1 1924 0
+	cbz	x27, .L502
+	.loc 1 1925 0
 	mov	x0, x27
 	bl	kfree
-.LVL545:
-.L509:
-	.loc 1 1793 0
-	cbz	x26, .L500
-	.loc 1 1794 0
+.LVL547:
+.L502:
+	.loc 1 1926 0
+	cbz	x26, .L493
+	.loc 1 1927 0
 	mov	x0, x26
 	bl	kfree
-.LVL546:
-.L500:
-.LBE1644:
-.LBE1643:
-.LBB1656:
-.LBB1657:
-.LBB1658:
+.LVL548:
+.L493:
+.LBE1618:
+.LBE1617:
+.LBB1630:
+.LBB1631:
+.LBB1632:
 	.loc 2 1186 0
 	str	x19, [x20, 184]
-.LBE1658:
-.LBE1657:
-.LBE1656:
-.LBB1659:
-.LBB1660:
-	.loc 1 1538 0
+.LBE1632:
+.LBE1631:
+.LBE1630:
+.LBB1633:
+.LBB1634:
+	.loc 1 1671 0
 	add	x22, x22, :lo12:.LANCHOR1
 	add	x0, x22, 224
 	bl	misc_register
-.LVL547:
-	.loc 1 1540 0
+.LVL549:
+	.loc 1 1673 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 400
 	bl	device_create_file
-.LVL548:
-	.loc 1 1541 0
+.LVL550:
+	.loc 1 1674 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 432
 	bl	device_create_file
-.LVL549:
-	.loc 1 1542 0
+.LVL551:
+	.loc 1 1675 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 464
 	bl	device_create_file
-.LVL550:
-	.loc 1 1543 0
+.LVL552:
+	.loc 1 1676 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 496
 	bl	device_create_file
-.LVL551:
-	.loc 1 1544 0
+.LVL553:
+	.loc 1 1677 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 528
 	bl	device_create_file
-.LVL552:
-	.loc 1 1545 0
+.LVL554:
+	.loc 1 1678 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 560
 	bl	device_create_file
-.LVL553:
-.LBE1660:
-.LBE1659:
-	.loc 1 1902 0
+.LVL555:
+.LBE1634:
+.LBE1633:
+	.loc 1 2035 0
 	ldr	x0, [x21, 88]
 	adrp	x2, .LC15
 	adrp	x1, .LC51
 	add	x2, x2, :lo12:.LC15
 	add	x1, x1, :lo12:.LC51
 	bl	_dev_info
-.LVL554:
-	.loc 1 1904 0
-	b	.L475
-.LVL555:
+.LVL556:
+	.loc 1 2037 0
+	b	.L468
+.LVL557:
 	.p2align 3
-.L518:
-.LBB1661:
-.LBB1653:
-	.loc 1 1755 0
+.L564:
+.LBB1635:
+.LBB1627:
+	.loc 1 1863 0
 	ldr	x0, [x21, 88]
-	adrp	x1, .LC50
-	add	x1, x1, :lo12:.LC50
+	adrp	x1, .LC45
+	add	x1, x1, :lo12:.LC45
 	bl	_dev_info
-.LVL556:
-	.loc 1 1756 0
-	ldr	x0, [x19, 16]
-	bl	ebc_pmic_verity_vcom
-.LVL557:
-.LBB1645:
-.LBB1646:
-	.loc 1 1110 0
-	bl	ebc_empty_buf_get
 .LVL558:
-	mov	x25, x0
+	.loc 1 1864 0
+	ldp	w0, w1, [x22, 84]
+	mul	w0, w0, w1
+.LBB1621:
+.LBB1622:
+.LBB1623:
+	.file 18 "./include/linux/slab.h"
+	.loc 18 553 0
+	mov	w1, 32960
+	movk	w1, 0x60, lsl 16
+	lsr	w0, w0, 1
+	bl	__kmalloc
 .LVL559:
-	.loc 1 1111 0
-	ldp	w2, w0, [x19, 108]
-	mov	w1, 255
+	mov	x27, x0
+.LVL560:
+.LBE1623:
+.LBE1622:
+.LBE1621:
+	.loc 1 1865 0
+	cbz	x0, .L568
+	.loc 1 1869 0
+	ldp	w2, w1, [x22, 84]
+	ldr	x3, [x19, 184]
+	mul	w2, w2, w1
+	ldr	w1, [x29, 100]
+.LVL561:
+	sub	x1, x1, x3
+.LVL562:
+	ldr	x3, [x21, 8]
+	lsr	w2, w2, 1
+	add	x1, x3, x1
+	bl	memcpy
+.LVL563:
+	.loc 1 1873 0
+	cbnz	x28, .L569
+	.loc 1 1852 0
+	mov	w28, 0
+.LVL564:
+	.loc 1 1857 0
+	mov	x26, 0
+.LVL565:
+.L494:
+	.loc 1 1894 0
+	bl	ebc_empty_buf_get
+.LVL566:
+	mov	x25, x0
+.LVL567:
+	.loc 1 1895 0
+	cbz	x0, .L497
+	.loc 1 1896 0
+	ldp	w2, w0, [x22, 84]
+	mov	x1, x27
 	mul	w2, w2, w0
 	ldr	x0, [x25, 16]
 	lsr	w2, w2, 1
-	bl	memset
-.LVL560:
-	.loc 1 1114 0
+	bl	memcpy
+.LVL568:
+	.loc 1 1899 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1112 0
-	mov	w0, 14
+	.loc 1 1897 0
+	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 1117 0
+	.loc 1 1902 0
 	mov	x0, x25
-	.loc 1 1115 0
-	ldr	w1, [x19, 108]
+	.loc 1 1900 0
+	ldr	w1, [x22, 84]
 	str	w1, [x25, 56]
-	.loc 1 1116 0
-	ldr	w1, [x19, 112]
+	.loc 1 1901 0
+	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 1117 0
+	.loc 1 1902 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL561:
-	b	.L504
+.LVL569:
+	b	.L497
+.LVL570:
 	.p2align 3
-.L577:
-.LBE1646:
-.LBE1645:
-	.loc 1 1787 0
+.L567:
+	.loc 1 1920 0
 	mov	w2, 1
 	str	w2, [x21, 80]
-	.loc 1 1788 0
+	.loc 1 1921 0
 	add	x0, x22, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL562:
-	b	.L508
-.LVL563:
+.LVL571:
+	b	.L501
+.LVL572:
 	.p2align 3
-.L575:
-	.loc 1 1744 0
+.L565:
+	.loc 1 1877 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC48
 	add	x1, x1, :lo12:.LC48
 	bl	_dev_info
-.LVL564:
-	.loc 1 1745 0
+.LVL573:
+	.loc 1 1878 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
-.LBB1647:
-.LBB1648:
-.LBB1649:
-	.file 18 "./include/linux/slab.h"
+.LBB1624:
+.LBB1625:
+.LBB1626:
 	.loc 18 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL565:
+.LVL574:
 	mov	x26, x0
-.LBE1649:
-.LBE1648:
-.LBE1647:
-	.loc 1 1746 0
-	cbz	x0, .L578
-	.loc 1 1750 0
+.LBE1626:
+.LBE1625:
+.LBE1624:
+	.loc 1 1879 0
+	cbz	x0, .L570
+	.loc 1 1883 0
 	ldp	w2, w1, [x22, 84]
-	.loc 1 1743 0
+	.loc 1 1876 0
 	mov	w28, 1
-	.loc 1 1750 0
+	.loc 1 1883 0
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
-.LVL566:
+.LVL575:
 	sub	x1, x1, x3
-.LVL567:
+.LVL576:
 	ldr	x3, [x21, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL568:
-	b	.L502
-.LVL569:
+.LVL577:
+	b	.L495
+.LVL578:
 	.p2align 3
-.L492:
-.LBE1653:
-.LBE1661:
-.LBB1662:
-.LBB1599:
-	.loc 1 1619 0
+.L485:
+.LBE1627:
+.LBE1635:
+.LBB1636:
+.LBB1573:
+	.loc 1 1752 0
 	mov	w24, -12
-	b	.L489
-.LVL570:
+	b	.L482
+.LVL579:
 	.p2align 3
-.L576:
-.LBE1599:
-.LBE1662:
-.LBB1663:
-.LBB1654:
-	.loc 1 1774 0
+.L566:
+.LBE1573:
+.LBE1636:
+.LBB1637:
+.LBB1628:
+	.loc 1 1907 0
 	bl	ebc_empty_buf_get
-.LVL571:
+.LVL580:
 	mov	x25, x0
-.LVL572:
-	.loc 1 1775 0
-	cbz	x0, .L506
-	.loc 1 1776 0
+.LVL581:
+	.loc 1 1908 0
+	cbz	x0, .L499
+	.loc 1 1909 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
 	ldr	x0, [x25, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL573:
-	.loc 1 1779 0
+.LVL582:
+	.loc 1 1912 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1777 0
+	.loc 1 1910 0
 	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 1780 0
+	.loc 1 1913 0
 	ldr	w0, [x22, 84]
 	str	w0, [x25, 56]
-	.loc 1 1782 0
+	.loc 1 1915 0
 	mov	x0, x25
-	.loc 1 1781 0
+	.loc 1 1914 0
 	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 1782 0
+	.loc 1 1915 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL574:
-	b	.L506
-.LVL575:
-	.p2align 3
-.L574:
-	.loc 1 1730 0
-	ldr	x0, [x21, 88]
-	adrp	x1, .LC45
-	add	x1, x1, :lo12:.LC45
-	bl	_dev_info
-.LVL576:
-	.loc 1 1731 0
-	ldp	w0, w1, [x22, 84]
-	mul	w0, w0, w1
-.LBB1650:
-.LBB1651:
-.LBB1652:
-	.loc 18 553 0
-	mov	w1, 32960
-	movk	w1, 0x60, lsl 16
-	lsr	w0, w0, 1
-	bl	__kmalloc
-.LVL577:
-	mov	x27, x0
-.LVL578:
-.LBE1652:
-.LBE1651:
-.LBE1650:
-	.loc 1 1732 0
-	cbz	x0, .L579
-	.loc 1 1736 0
-	ldp	w2, w1, [x22, 84]
-	ldr	x3, [x19, 184]
-	mul	w2, w2, w1
-	ldr	w1, [x29, 100]
-.LVL579:
-	sub	x1, x1, x3
-.LVL580:
-	ldr	x3, [x21, 8]
-	lsr	w2, w2, 1
-	add	x1, x3, x1
-	bl	memcpy
-.LVL581:
-	.loc 1 1740 0
-	cbz	x28, .L523
-	.loc 1 1729 0
-	mov	w25, 1
-.LVL582:
-	b	.L517
 .LVL583:
+	b	.L499
+.LVL584:
 	.p2align 3
-.L572:
-.LBE1654:
-.LBE1663:
-.LBB1664:
-.LBB1608:
-	.loc 1 1580 0
+.L562:
+.LBE1628:
+.LBE1637:
+.LBB1638:
+.LBB1582:
+	.loc 1 1713 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC37
 	add	x1, x1, :lo12:.LC37
 	bl	_dev_err
-.LVL584:
-	.loc 1 1581 0
+.LVL585:
+	.loc 1 1714 0
 	ldr	x0, [x19, 272]
 	mov	w2, w26
-	ldr	x1, [x19, 384]
+	ldr	x1, [x19, 376]
 	bl	epd_lut_from_file_init
-.LVL585:
-	.loc 1 1582 0
-	tbz	w0, #31, .L495
-	.loc 1 1583 0
+.LVL586:
+	.loc 1 1715 0
+	tbz	w0, #31, .L488
+	.loc 1 1716 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC38
-	.loc 1 1584 0
+	.loc 1 1717 0
 	mov	w24, -1
-	.loc 1 1583 0
+	.loc 1 1716 0
 	add	x1, x1, :lo12:.LC38
 	bl	_dev_err
-.LVL586:
-	b	.L493
 .LVL587:
+	b	.L486
+.LVL588:
 	.p2align 3
-.L479:
-.LBE1608:
-.LBE1664:
-	.loc 1 1827 0
+.L472:
+.LBE1582:
+.LBE1638:
+	.loc 1 1960 0
 	mov	w24, -517
-	b	.L475
-.LVL588:
+	b	.L468
+.LVL589:
 	.p2align 3
-.L573:
-.LBB1665:
-.LBB1629:
-	.loc 1 1672 0
+.L563:
+.LBB1639:
+.LBB1603:
+	.loc 1 1805 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC39
 	add	x1, x1, :lo12:.LC39
 	bl	_dev_err
-.LVL589:
-.L496:
-.LBE1629:
-.LBE1665:
-	.loc 1 1887 0
+.LVL590:
+.L489:
+.LBE1603:
+.LBE1639:
+	.loc 1 2020 0
 	adrp	x1, .LC71
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC71
-	.loc 1 1888 0
+	.loc 1 2021 0
 	mov	w24, -1
-	.loc 1 1887 0
+	.loc 1 2020 0
 	bl	_dev_err
-.LVL590:
-	.loc 1 1888 0
-	b	.L475
 .LVL591:
+	.loc 1 2021 0
+	b	.L468
+.LVL592:
 	.p2align 3
-.L497:
-.LBB1666:
-.LBB1630:
-	.loc 1 1681 0
+.L490:
+.LBB1640:
+.LBB1604:
+	.loc 1 1814 0
 	ldr	x0, [x21, 88]
-.LVL592:
+.LVL593:
 	adrp	x1, .LC70
-	.loc 1 1679 0
+	.loc 1 1812 0
 	str	x25, [x21, 120]
-	.loc 1 1681 0
+	.loc 1 1814 0
 	add	x1, x1, :lo12:.LC70
 	bl	_dev_err
-.LVL593:
-	b	.L496
 .LVL594:
+	b	.L489
+.LVL595:
 	.p2align 3
-.L520:
-.LBE1630:
-.LBE1666:
-	.loc 1 1813 0
+.L513:
+.LBE1604:
+.LBE1640:
+	.loc 1 1946 0
 	mov	w24, -12
-	b	.L475
-.LVL595:
+	b	.L468
+.LVL596:
 	.p2align 3
-.L521:
-.LBB1667:
-.LBB1600:
-	.loc 1 1604 0
+.L514:
+.LBB1641:
+.LBB1574:
+	.loc 1 1737 0
 	mov	w24, -19
-	b	.L489
-.LVL596:
-.L563:
-.LBE1600:
-.LBE1667:
-	.loc 1 1820 0
+	b	.L482
+.LVL597:
+.L553:
+.LBE1574:
+.LBE1641:
+	.loc 1 1953 0
 	adrp	x1, .LC23
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC23
-	.loc 1 1821 0
+	.loc 1 1954 0
 	mov	w24, -19
-	.loc 1 1820 0
+	.loc 1 1953 0
 	bl	_dev_err
-.LVL597:
-	.loc 1 1821 0
-	b	.L475
-.L566:
-	.loc 1 1848 0
+.LVL598:
+	.loc 1 1954 0
+	b	.L468
+.L556:
+	.loc 1 1981 0
 	adrp	x1, .LC27
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC27
-	.loc 1 1849 0
+	.loc 1 1982 0
 	mov	w24, -517
-	.loc 1 1848 0
+	.loc 1 1981 0
 	bl	_dev_err
-.LVL598:
-	.loc 1 1849 0
-	b	.L475
-.L564:
-	.loc 1 1836 0
+.LVL599:
+	.loc 1 1982 0
+	b	.L468
+.L554:
+	.loc 1 1969 0
 	adrp	x1, .LC25
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC25
-	.loc 1 1837 0
+	.loc 1 1970 0
 	mov	w24, -19
-	.loc 1 1836 0
+	.loc 1 1969 0
 	bl	_dev_err
-.LVL599:
-	.loc 1 1837 0
-	b	.L475
 .LVL600:
-.L522:
-.LBB1668:
-.LBB1609:
-	.loc 1 1561 0
-	mov	w24, -19
-	b	.L493
+	.loc 1 1970 0
+	b	.L468
 .LVL601:
-.L565:
-.LBE1609:
-.LBE1668:
-	.loc 1 1843 0
+.L515:
+.LBB1642:
+.LBB1583:
+	.loc 1 1694 0
+	mov	w24, -19
+	b	.L486
+.LVL602:
+.L555:
+.LBE1583:
+.LBE1642:
+	.loc 1 1976 0
 	adrp	x1, .LC26
 	mov	x0, x20
-.LVL602:
+.LVL603:
 	add	x1, x1, :lo12:.LC26
-	.loc 1 1844 0
+	.loc 1 1977 0
 	mov	w24, -517
-	.loc 1 1843 0
+	.loc 1 1976 0
 	bl	_dev_err
-.LVL603:
-	.loc 1 1844 0
-	b	.L475
 .LVL604:
-.L571:
-.LBB1669:
-.LBB1610:
-	.loc 1 1574 0
+	.loc 1 1977 0
+	b	.L468
+.LVL605:
+.L561:
+.LBB1643:
+.LBB1584:
+	.loc 1 1707 0
 	ldr	x0, [x19, 272]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
 	adrp	x1, .LC36
-	mov	w3, 1574
+	mov	w3, 1707
 	add	x2, x2, 16
 	add	x1, x1, :lo12:.LC36
-	.loc 1 1575 0
+	.loc 1 1708 0
 	mov	w24, -12
-	.loc 1 1574 0
+	.loc 1 1707 0
 	bl	_dev_err
-.LVL605:
-	b	.L493
 .LVL606:
-.L570:
-.LBE1610:
-.LBE1669:
-	.loc 1 1905 0
-	bl	__stack_chk_fail
+	b	.L486
 .LVL607:
-.L578:
-.LBB1670:
-.LBB1655:
-	.loc 1 1747 0
-	ldr	x0, [x21, 88]
+.L560:
+.LBE1584:
+.LBE1643:
+	.loc 1 2038 0
+	bl	__stack_chk_fail
 .LVL608:
+.L570:
+.LBB1644:
+.LBB1629:
+	.loc 1 1880 0
+	ldr	x0, [x21, 88]
+.LVL609:
 	adrp	x1, .LC49
 	adrp	x22, .LANCHOR1
 	add	x1, x1, :lo12:.LC49
 	bl	_dev_err
-.LVL609:
-	b	.L500
 .LVL610:
-.L579:
-	.loc 1 1733 0
-	ldr	x0, [x21, 88]
+	b	.L493
 .LVL611:
+.L568:
+	.loc 1 1866 0
+	ldr	x0, [x21, 88]
+.LVL612:
 	adrp	x1, .LC46
 	adrp	x22, .LANCHOR1
 	add	x1, x1, :lo12:.LC46
 	bl	_dev_err
-.LVL612:
-	b	.L500
 .LVL613:
-.L523:
-	.loc 1 1719 0
-	mov	w28, 0
+	b	.L493
 .LVL614:
-	.loc 1 1724 0
-	mov	x26, 0
+.L569:
+	.loc 1 1862 0
+	mov	w25, 1
 .LVL615:
-	b	.L501
-.LBE1655:
-.LBE1670:
+	b	.L510
+.LBE1629:
+.LBE1644:
 	.cfi_endproc
 .LFE2840:
 	.size	ebc_probe, .-ebc_probe
 	.align	2
 	.p2align 3,,7
-	.type	ebc_power_set.constprop.7, %function
-ebc_power_set.constprop.7:
-.LFB2853:
+	.type	ebc_power_set.constprop.8, %function
+ebc_power_set.constprop.8:
+.LFB2854:
 	.loc 1 180 0
 	.cfi_startproc
 .LVL616:
@@ -6737,39 +6819,39 @@ ebc_power_set.constprop.7:
 .LVL617:
 	bl	ebc_notify
 .LVL618:
-.LBB1671:
-.LBB1672:
+.LBB1645:
+.LBB1646:
 	.loc 3 35 0
 	mov	w1, 0
-.LBE1672:
-.LBE1671:
+.LBE1646:
+.LBE1645:
 	.loc 1 198 0
 	ldr	x2, [x19, 16]
 	.loc 1 197 0
-	str	wzr, [x19, 376]
-.LBB1674:
-.LBB1673:
+	str	wzr, [x19, 368]
+.LBB1648:
+.LBB1647:
 	.loc 3 35 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
 .LVL619:
-.LBE1673:
-.LBE1674:
+.LBE1647:
+.LBE1648:
 	.loc 1 199 0
 	ldr	x1, [x19, 8]
-.LBB1675:
-.LBB1676:
+.LBB1649:
+.LBB1650:
 	.loc 11 51 0
 	mov	x0, x1
 	ldr	x1, [x1, 56]
 	blr	x1
 .LVL620:
-.LBE1676:
-.LBE1675:
+.LBE1650:
+.LBE1649:
 	.loc 1 200 0
-	ldr	w0, [x19, 616]
-	cbnz	w0, .L586
+	ldr	w0, [x19, 608]
+	cbnz	w0, .L577
 	.loc 1 204 0
 	ldr	x0, [x19]
 	adrp	x1, .LC73
@@ -6790,18 +6872,18 @@ ebc_power_set.constprop.7:
 	ret
 .LVL623:
 	.p2align 3
-.L586:
+.L577:
 	.cfi_restore_state
 	.loc 1 201 0
-	str	wzr, [x19, 616]
-.LBB1677:
-.LBB1678:
+	str	wzr, [x19, 608]
+.LBB1651:
+.LBB1652:
 	.loc 4 68 0
-	add	x0, x19, 408
+	add	x0, x19, 400
 	bl	__pm_relax
 .LVL624:
-.LBE1678:
-.LBE1677:
+.LBE1652:
+.LBE1651:
 	.loc 1 204 0
 	ldr	x0, [x19]
 	adrp	x1, .LC73
@@ -6820,14 +6902,14 @@ ebc_power_set.constprop.7:
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
-.LFE2853:
-	.size	ebc_power_set.constprop.7, .-ebc_power_set.constprop.7
+.LFE2854:
+	.size	ebc_power_set.constprop.8, .-ebc_power_set.constprop.8
 	.align	2
 	.p2align 3,,7
 	.type	ebc_suspend, %function
 ebc_suspend:
 .LFB2842:
-	.loc 1 1915 0
+	.loc 1 2048 0
 	.cfi_startproc
 .LVL627:
 	stp	x29, x30, [sp, -32]!
@@ -6839,40 +6921,40 @@ ebc_suspend:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-.LBB1679:
-.LBB1680:
+.LBB1653:
+.LBB1654:
 	.loc 2 1181 0
 	ldr	x20, [x0, 184]
-.LBE1680:
-.LBE1679:
-	.loc 1 1919 0
+.LBE1654:
+.LBE1653:
+	.loc 1 2052 0
 	add	x19, x20, 184
-	ldr	w0, [x19, 192]
+	ldr	w0, [x19, 184]
 .LVL628:
 	cmp	w0, 1
-	beq	.L590
-.L588:
-	.loc 1 1923 0
+	beq	.L581
+.L579:
+	.loc 1 2056 0
 	mov	w0, 1
-	str	w0, [x19, 604]
-	.loc 1 1925 0
+	str	w0, [x19, 596]
+	.loc 1 2058 0
 	ldr	x1, [x20, 16]
-.LBB1681:
-.LBB1682:
+.LBB1655:
+.LBB1656:
 	.loc 3 40 0
 	mov	x0, x1
 	ldr	x1, [x1, 40]
 	blr	x1
 .LVL629:
-.LBE1682:
-.LBE1681:
-	.loc 1 1926 0
+.LBE1656:
+.LBE1655:
+	.loc 1 2059 0
 	ldr	x0, [x19, 88]
 	adrp	x1, .LC75
 	add	x1, x1, :lo12:.LC75
 	bl	_dev_info
 .LVL630:
-	.loc 1 1929 0
+	.loc 1 2062 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -6884,9 +6966,9 @@ ebc_suspend:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L590:
+.L581:
 	.cfi_restore_state
-	.loc 1 1920 0
+	.loc 1 2053 0
 	ldr	x0, [x19, 88]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
@@ -6895,11 +6977,11 @@ ebc_suspend:
 	add	x1, x1, :lo12:.LC74
 	bl	_dev_info
 .LVL631:
-	.loc 1 1921 0
+	.loc 1 2054 0
 	mov	x0, x20
-	bl	ebc_power_set.constprop.7
+	bl	ebc_power_set.constprop.8
 .LVL632:
-	b	.L588
+	b	.L579
 	.cfi_endproc
 .LFE2842:
 	.size	ebc_suspend, .-ebc_suspend
@@ -6912,74 +6994,150 @@ refresh_new_image2:
 	.loc 1 212 0
 	.cfi_startproc
 .LVL633:
-	.loc 1 220 0
-	ldp	w15, w6, [x4, 52]
+	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 219 0
+	ldp	w30, w6, [x4, 52]
 	cmp	w6, 0
-	add	w11, w6, 15
-	csel	w11, w11, w6, lt
+	add	w14, w6, 7
+	csel	w14, w14, w6, lt
 .LVL634:
-	.loc 1 227 0
-	cmp	w15, 0
-	.loc 1 220 0
-	asr	w11, w11, 4
+	.loc 1 221 0
+	cmp	w30, 0
+	ble	.L582
+	asr	w14, w14, 3
 .LVL635:
-	.loc 1 227 0
-	ble	.L591
-	sub	w14, w11, #1
-	mov	w12, 0
+	mov	w16, 0
 .LVL636:
-	add	x14, x14, 1
-	lsl	x13, x14, 3
+	sub	w18, w14, #1
+	.loc 1 233 0
+	mov	w15, 15
+	add	x18, x18, 1
+	lsl	x17, x18, 2
+	lsl	x18, x18, 3
 .LVL637:
 	.p2align 2
-.L593:
-	.loc 1 228 0 discriminator 1
-	mov	x4, 0
+.L584:
+	.loc 1 222 0 discriminator 1
+	mov	x10, x3
+	mov	x7, 0
+	cmp	w14, 0
+	bgt	.L601
+	b	.L598
 .LVL638:
-	cmp	w11, 0
-	ble	.L598
-	.p2align 2
-.L599:
-	.loc 1 239 0
-	ldrb	w9, [x3, x4]
-	.loc 1 241 0
-	cmp	w5, 18
-	.loc 1 230 0
-	ldr	x6, [x1, x4, lsl 3]
+	.p2align 3
+.L606:
+	.loc 1 243 0
+	orr	w4, w4, -65536
+.L590:
 .LVL639:
-	.loc 1 232 0
-	ldr	x7, [x2, x4, lsl 3]
-	.loc 1 231 0
-	ldr	x8, [x0, x4, lsl 3]
-	.loc 1 241 0
-	orn	x10, x7, x6
-	and	x6, x6, x7
+	.loc 1 257 0
+	orn	w8, w11, w6
+	and	w6, w6, w11
 .LVL640:
-	.loc 1 239 0
-	cbnz	w9, .L594
-	.loc 1 241 0
-	csel	x8, x6, x10, ne
-.L594:
-	.loc 1 246 0 discriminator 2
-	str	x8, [x0, x4, lsl 3]
-	add	x4, x4, 1
-	.loc 1 228 0 discriminator 2
-	cmp	w11, w4
-	bgt	.L599
-	add	x3, x3, x14
-	add	x1, x1, x13
+	.loc 1 255 0
+	bic	w9, w9, w4
+	.loc 1 257 0
+	and	w8, w8, w4
+	and	w4, w6, w4
 .LVL641:
-	add	x2, x2, x13
+	cmp	w5, 18
+	orr	w6, w8, w9
+	orr	w4, w4, w9
+	csel	w4, w4, w6, ne
+	.loc 1 260 0
+	str	w4, [x0, x7, lsl 2]
+	add	x7, x7, 1
+	.loc 1 222 0
+	cmp	w14, w7
+	ble	.L605
 .LVL642:
-	add	x0, x0, x13
+.L601:
+	.loc 1 223 0
+	ldr	w8, [x10]
+	add	x10, x10, 8
+	.loc 1 224 0
+	ldr	w6, [x1, x7, lsl 2]
+	.loc 1 232 0
+	and	w4, w8, 255
 .LVL643:
-.L598:
-	.loc 1 227 0 discriminator 2
-	add	w12, w12, 1
-	cmp	w15, w12
-	bne	.L593
+	.loc 1 226 0
+	ldr	w11, [x2, x7, lsl 2]
 .LVL644:
-.L591:
+	.loc 1 233 0
+	cmp	w4, 0
+	.loc 1 225 0
+	ldr	w9, [x0, x7, lsl 2]
+	.loc 1 230 0
+	mov	w4, 65535
+.LVL645:
+	.loc 1 229 0
+	cbz	w8, .L585
+	.loc 1 233 0
+	csel	w4, wzr, w15, ne
+	.loc 1 235 0
+	tst	w8, 65280
+	orr	w12, w4, 240
+	csel	w4, w12, w4, eq
+	.loc 1 237 0
+	tst	w8, 16711680
+	orr	w12, w4, 3840
+	csel	w4, w12, w4, eq
+	.loc 1 239 0
+	tst	w8, -16777216
+	orr	w8, w4, 61440
+	csel	w4, w8, w4, eq
+.L585:
+	.loc 1 241 0
+	ldr	w8, [x10, -4]
+	.loc 1 247 0
+	orr	w13, w4, 983040
+	.loc 1 246 0
+	and	w12, w8, 255
+	.loc 1 247 0
+	cmp	w12, 0
+	.loc 1 242 0
+	cbz	w8, .L606
+	.loc 1 247 0
+	csel	w4, w13, w4, eq
+	.loc 1 249 0
+	tst	w8, 65280
+	orr	w12, w4, 15728640
+	csel	w4, w12, w4, eq
+	.loc 1 251 0
+	tst	w8, 16711680
+	orr	w12, w4, 251658240
+	csel	w4, w12, w4, eq
+	.loc 1 253 0
+	tst	w8, -16777216
+	orr	w8, w4, -268435456
+	csel	w4, w8, w4, eq
+	b	.L590
+.LVL646:
+	.p2align 3
+.L605:
+	add	x1, x1, x17
+	add	x2, x2, x17
+	add	x3, x3, x18
+.LVL647:
+	add	x0, x0, x17
+.LVL648:
+.L598:
+	.loc 1 221 0 discriminator 2
+	add	w16, w16, 1
+	cmp	w30, w16
+	bne	.L584
+.L582:
+	.loc 1 263 0
+	ldp	x29, x30, [sp], 16
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+.LVL649:
 	ret
 	.cfi_endproc
 .LFE2806:
@@ -6990,37 +7148,55 @@ refresh_new_image2:
 	.type	new_buffer_refresh, %function
 new_buffer_refresh:
 .LFB2807:
-	.loc 1 252 0
+	.loc 1 266 0
 	.cfi_startproc
-.LVL645:
-	stp	x29, x30, [sp, -16]!
-	.cfi_def_cfa_offset 16
-	.cfi_offset 29, -16
-	.cfi_offset 30, -8
-	.loc 1 253 0
+.LVL650:
+	stp	x29, x30, [sp, -32]!
+	.cfi_def_cfa_offset 32
+	.cfi_offset 29, -32
+	.cfi_offset 30, -24
+	.loc 1 267 0
 	adrp	x0, .LANCHOR0
-.LVL646:
-	.loc 1 252 0
+.LVL651:
+	.loc 1 266 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 253 0
-	ldr	x4, [x0, #:lo12:.LANCHOR0]
-.LVL647:
-	.loc 1 261 0
-	add	x4, x4, 184
-.LVL648:
-	.loc 1 257 0
-	ldr	x5, [x4, 216]
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -16
+	.cfi_offset 20, -8
+	.loc 1 270 0
+	adrp	x19, .LANCHOR1
+	add	x19, x19, :lo12:.LANCHOR1
+	.loc 1 267 0
+	ldr	x20, [x0, #:lo12:.LANCHOR0]
+.LVL652:
+	.loc 1 270 0
+	add	x19, x19, 592
+	mov	x0, x19
+	bl	down_write
+.LVL653:
+	.loc 1 272 0
+	add	x4, x20, 184
+	ldr	x1, [x4, 208]
+	.loc 1 271 0
 	ldr	x0, [x4, 128]
-	ldp	x2, x1, [x4, 144]
-	ldr	x3, [x4, 160]
-	ldr	w5, [x5, 40]
+	ldp	x2, x3, [x4, 144]
+	ldr	w5, [x1, 40]
+	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
-.LVL649:
-	.loc 1 263 0
-	ldp	x29, x30, [sp], 16
+.LVL654:
+	.loc 1 276 0
+	mov	x0, x19
+	bl	up_write
+.LVL655:
+	.loc 1 277 0
+	ldp	x19, x20, [sp, 16]
+.LVL656:
+	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
 	.cfi_endproc
@@ -7031,128 +7207,131 @@ new_buffer_refresh:
 	.type	ebc_thread, %function
 ebc_thread:
 .LFB2819:
-	.loc 1 792 0
+	.loc 1 925 0
 	.cfi_startproc
-.LVL650:
+.LVL657:
 	stp	x29, x30, [sp, -224]!
 	.cfi_def_cfa_offset 224
 	.cfi_offset 29, -224
 	.cfi_offset 30, -216
-	.loc 1 793 0
+	.loc 1 926 0
 	adrp	x1, .LANCHOR0
-	.loc 1 792 0
+	.loc 1 925 0
+	adrp	x0, __stack_chk_guard
+.LVL658:
+	add	x0, x0, :lo12:__stack_chk_guard
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
-	stp	x23, x24, [sp, 48]
+	stp	x21, x22, [sp, 32]
 	.cfi_offset 19, -208
 	.cfi_offset 20, -200
-	.cfi_offset 23, -176
-	.cfi_offset 24, -168
-	adrp	x23, __stack_chk_guard
-	stp	x21, x22, [sp, 32]
-	adrp	x24, .LANCHOR1
-	stp	x25, x26, [sp, 64]
-	add	x0, x23, :lo12:__stack_chk_guard
-.LVL651:
-	stp	x27, x28, [sp, 80]
 	.cfi_offset 21, -192
 	.cfi_offset 22, -184
+	adrp	x22, .LANCHOR1
+	stp	x23, x24, [sp, 48]
+.LBB1682:
+.LBB1683:
+.LBB1684:
+	.loc 1 1231 0
+	add	x22, x22, :lo12:.LANCHOR1
+.LBE1684:
+.LBE1683:
+.LBE1682:
+	.loc 1 926 0
+	ldr	x20, [x1, #:lo12:.LANCHOR0]
+.LVL659:
+.LBB1689:
+.LBB1687:
+.LBB1685:
+	.loc 1 1231 0
+	add	x19, x22, 304
+.LBE1685:
+.LBE1687:
+.LBE1689:
+	.loc 1 925 0
+	stp	x25, x26, [sp, 64]
+	.loc 1 930 0
+	mov	w21, 0
+.LVL660:
+	.loc 1 925 0
+	stp	x27, x28, [sp, 80]
+	.cfi_offset 23, -176
+	.cfi_offset 24, -168
 	.cfi_offset 25, -160
 	.cfi_offset 26, -152
 	.cfi_offset 27, -144
 	.cfi_offset 28, -136
-.LBB1708:
-.LBB1709:
-.LBB1710:
-	.loc 1 1098 0
-	add	x24, x24, :lo12:.LANCHOR1
-.LBE1710:
-.LBE1709:
-.LBE1708:
-	.loc 1 793 0
-	ldr	x20, [x1, #:lo12:.LANCHOR0]
-.LVL652:
-.LBB1715:
-.LBB1713:
-.LBB1711:
-	.loc 1 1098 0
-	add	x19, x24, 304
-.LBE1711:
-.LBE1713:
-.LBE1715:
-	.loc 1 792 0
+	.loc 1 928 0
+	add	x24, x20, 184
+	.loc 1 931 0
+	str	wzr, [x29, 108]
+	.loc 1 925 0
 	ldr	x1, [x0]
 	str	x1, [x29, 216]
 	mov	x1,0
-	.loc 1 798 0
-	mov	w26, 0
-.LVL653:
-	.loc 1 795 0
-	add	x28, x20, 184
-	.loc 1 797 0
-	mov	w22, 0
-.LVL654:
+.LVL661:
 	.p2align 2
-.L604:
-	.loc 1 803 0
-	ldr	w0, [x28, 608]
-.LVL655:
-	cbnz	w0, .L753
-.L605:
-	.loc 1 809 0
+.L610:
+	.loc 1 936 0
+	ldr	w0, [x24, 600]
+.LVL662:
+	cbnz	w0, .L771
+.L611:
+	.loc 1 942 0
 	bl	ebc_dsp_buf_get
-.LVL656:
-	mov	x27, x0
-	.loc 1 811 0
-	cbz	x0, .L607
-	.loc 1 811 0 is_stmt 0 discriminator 1
+.LVL663:
+	mov	x23, x0
+	.loc 1 944 0
+	cbz	x0, .L613
+	.loc 1 944 0 is_stmt 0 discriminator 1
 	ldr	x1, [x0, 8]
-	cbz	x1, .L607
-	.loc 1 812 0 is_stmt 1
+	cbz	x1, .L613
+	.loc 1 945 0 is_stmt 1
 	ldr	w1, [x0, 40]
 	cmp	w1, 17
-	beq	.L754
-	.loc 1 816 0
-	ldr	x2, [x28, 600]
-	cbz	x2, .L610
-	.loc 1 817 0
+	beq	.L772
+	.loc 1 949 0
+	ldr	x2, [x24, 592]
+	cbz	x2, .L616
+	.loc 1 950 0
 	cmp	w1, 16
-	beq	.L755
-.L743:
-	.loc 1 876 0
+	beq	.L773
+.L764:
+	.loc 1 1009 0
 	bl	ebc_remove_from_dsp_buf_list
-.LVL657:
-	.loc 1 877 0
-	mov	x0, x27
+.LVL664:
+	.loc 1 1010 0
+	mov	x0, x23
 	bl	ebc_buf_release
-.LVL658:
-	.loc 1 803 0
-	ldr	w0, [x28, 608]
-	cbz	w0, .L605
+.LVL665:
+	.loc 1 936 0
+	ldr	w0, [x24, 600]
+	cbz	w0, .L611
 	.p2align 2
-.L753:
-	.loc 1 804 0
-	ldr	w0, [x28, 192]
+.L771:
+	.loc 1 937 0
+	ldr	w0, [x24, 184]
 	cmp	w0, 1
-	beq	.L756
-.L606:
-	.loc 1 1104 0
-	add	x23, x23, :lo12:__stack_chk_guard
-	mov	w0, 0
+	beq	.L774
+.L612:
+	.loc 1 1237 0
+	adrp	x0, __stack_chk_guard
+	add	x1, x0, :lo12:__stack_chk_guard
 	ldr	x2, [x29, 216]
-	ldr	x1, [x23]
+	ldr	x1, [x1]
 	eor	x1, x2, x1
-	cbnz	x1, .L757
+	mov	w0, 0
+	cbnz	x1, .L775
 	ldp	x19, x20, [sp, 16]
-.LVL659:
+.LVL666:
 	ldp	x21, x22, [sp, 32]
-.LVL660:
+.LVL667:
 	ldp	x23, x24, [sp, 48]
+.LVL668:
 	ldp	x25, x26, [sp, 64]
-.LVL661:
+.LVL669:
 	ldp	x27, x28, [sp, 80]
-.LVL662:
 	ldp	x29, x30, [sp], 224
 	.cfi_remember_state
 	.cfi_restore 30
@@ -7169,1181 +7348,1224 @@ ebc_thread:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL663:
+.LVL670:
 	.p2align 3
-.L607:
+.L613:
 	.cfi_restore_state
-	.loc 1 1085 0
-	ldr	w0, [x28, 28]
-.LVL664:
+	.loc 1 1218 0
+	ldr	w0, [x24, 28]
+.LVL671:
 	cmp	w0, 1
-	beq	.L758
-	.loc 1 1094 0
-	ldr	w0, [x28, 192]
+	beq	.L776
+	.loc 1 1227 0
+	ldr	w0, [x24, 184]
 	cmp	w0, 1
-	beq	.L759
-.LVL665:
-.L748:
-	ldr	w0, [x28, 80]
-.LVL666:
-	.loc 1 1097 0
-	cbz	w0, .L760
-.L684:
-.LVL667:
-.L674:
-	.loc 1 1099 0
-	str	wzr, [x28, 80]
-	b	.L604
-.LVL668:
+	beq	.L777
+.LVL672:
+.L767:
+	ldr	w0, [x24, 80]
+.LVL673:
+	.loc 1 1230 0
+	cbz	w0, .L778
+.L698:
+.LVL674:
+.L688:
+	.loc 1 1232 0
+	str	wzr, [x24, 80]
+	b	.L610
+.LVL675:
 	.p2align 3
-.L760:
-.LBB1716:
-.LBB1714:
-	.loc 1 1098 0 discriminator 1
+.L778:
+.LBB1690:
+.LBB1688:
+	.loc 1 1231 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL669:
-	b	.L685
+.LVL676:
+	b	.L699
 	.p2align 3
-.L761:
-.LVL670:
-.LBB1712:
-	.loc 1 1098 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L674
-	.loc 1 1098 0 discriminator 7
+.L779:
+.LVL677:
+.LBB1686:
+	.loc 1 1231 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L688
+	.loc 1 1231 0 discriminator 7
 	bl	schedule
-.LVL671:
-.L685:
-	.loc 1 1098 0 discriminator 9
+.LVL678:
+.L699:
+	.loc 1 1231 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL672:
-	ldr	w1, [x28, 80]
-	cbz	w1, .L761
-.LBE1712:
-	.loc 1 1098 0 discriminator 4
+.LVL679:
+	ldr	w1, [x24, 80]
+	cbz	w1, .L779
+.LBE1686:
+	.loc 1 1231 0 discriminator 4
 	add	x1, x29, 112
 	mov	x0, x19
 	bl	finish_wait
-.LVL673:
-.LBE1714:
-.LBE1716:
-	.loc 1 1099 0 is_stmt 1 discriminator 4
-	str	wzr, [x28, 80]
-	b	.L604
-.LVL674:
+.LVL680:
+.LBE1688:
+.LBE1690:
+	.loc 1 1232 0 is_stmt 1 discriminator 4
+	str	wzr, [x24, 80]
+	b	.L610
+.LVL681:
 	.p2align 3
-.L610:
-	.loc 1 829 0
+.L616:
+	.loc 1 962 0
 	cmp	w1, 15
-	beq	.L762
-	.loc 1 833 0
-	ldr	w2, [x28, 616]
+	beq	.L780
+	.loc 1 966 0
+	ldr	w2, [x24, 608]
 	sub	w0, w1, #18
-.LVL675:
+.LVL682:
 	cmp	w2, 0
 	ccmp	w1, 1, 4, ne
 	ccmp	w0, 1, 0, ne
-	bls	.L609
-	.loc 1 835 0
-	ldrsw	x2, [x28, 20]
-	ldr	x1, [x27, 16]
-	ldr	x0, [x28, 144]
+	bls	.L615
+	.loc 1 967 0
+	add	x25, x22, 592
+	mov	x0, x25
+	bl	down_write
+.LVL683:
+	.loc 1 968 0
+	ldrsw	x2, [x24, 20]
+	ldr	x1, [x23, 16]
+	ldr	x0, [x24, 144]
 	bl	memcpy
-.LVL676:
-	.loc 1 836 0
-	mov	x0, x27
+.LVL684:
+	.loc 1 969 0
+	mov	x0, x23
 	bl	ebc_remove_from_dsp_buf_list
-.LVL677:
-	.loc 1 837 0
-	mov	x0, x27
+.LVL685:
+	.loc 1 970 0
+	mov	x0, x23
 	bl	ebc_buf_release
-.LVL678:
-	.loc 1 839 0
-	ldr	x0, [x28, 216]
-	mov	x4, x28
-	ldp	x2, x1, [x28, 144]
-	ldr	x3, [x28, 160]
-	ldr	w5, [x0, 40]
-	ldr	x0, [x28, 128]
+.LVL686:
+	.loc 1 972 0
+	ldr	x1, [x24, 208]
+	mov	x4, x24
+	ldr	x0, [x24, 128]
+	ldp	x2, x3, [x24, 144]
+	ldr	w5, [x1, 40]
+	ldr	x1, [x1, 16]
 	bl	refresh_new_image2
-.LVL679:
-	.loc 1 843 0
-	ldr	w0, [x28, 28]
-	cbnz	w0, .L604
-	.loc 1 846 0
-	ldr	w0, [x28, 192]
-	.loc 1 844 0
+.LVL687:
+	.loc 1 975 0
+	mov	x0, x25
+	bl	up_write
+.LVL688:
+	.loc 1 976 0
+	ldr	w0, [x24, 28]
+	cbnz	w0, .L610
+	.loc 1 979 0
+	ldr	w0, [x24, 184]
+	.loc 1 977 0
 	mov	w1, 1
-	.loc 1 845 0
-	str	wzr, [x28, 76]
-	.loc 1 844 0
-	str	w1, [x28, 28]
-	.loc 1 846 0
-	cbz	w0, .L763
-.L614:
-	.loc 1 848 0
-	ldr	x0, [x28, 88]
+	.loc 1 978 0
+	str	wzr, [x24, 76]
+	.loc 1 977 0
+	str	w1, [x24, 28]
+	.loc 1 979 0
+	cbz	w0, .L781
+.L620:
+	.loc 1 981 0
+	ldr	x0, [x24, 88]
 	adrp	x1, .LC77
-	ldrb	w2, [x28, 32]
+	ldrb	w2, [x24, 32]
 	add	x1, x1, :lo12:.LC77
 	bl	_dev_info
-.LVL680:
-	.loc 1 849 0
+.LVL689:
+	.loc 1 982 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL681:
-	b	.L604
-.LVL682:
+.LVL690:
+	b	.L610
+.LVL691:
 	.p2align 3
-.L755:
-	.loc 1 818 0
-	str	wzr, [x28, 600]
-	.loc 1 819 0
+.L773:
+	.loc 1 951 0
+	str	wzr, [x24, 592]
+	.loc 1 952 0
 	mov	x0, 3
-.LVL683:
+.LVL692:
 	bl	ebc_notify
-.LVL684:
-	.loc 1 820 0
-	ldr	x0, [x28, 88]
+.LVL693:
+	.loc 1 953 0
+	ldr	x0, [x24, 88]
 	adrp	x1, .LC76
 	add	x1, x1, :lo12:.LC76
 	bl	_dev_info
-.LVL685:
+.LVL694:
 	.p2align 2
-.L609:
-	.loc 1 854 0
-	adrp	x21, jiffies
-.LVL686:
+.L615:
+	.loc 1 987 0
+	adrp	x25, jiffies
 	mov	x1, 402653184
-	add	x0, x20, 624
-	ldr	x2, [x21, #:lo12:jiffies]
+	add	x0, x20, 616
+	ldr	x2, [x25, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL687:
-	.loc 1 856 0
-	ldr	w0, [x28, 436]
-	cbz	w0, .L615
-	ldr	x0, [x28, 208]
-.L616:
-	.loc 1 859 0
+.LVL695:
+	.loc 1 989 0
+	ldr	w0, [x24, 428]
+	cbz	w0, .L621
+	ldr	x0, [x24, 200]
+.L622:
+	.loc 1 992 0
 	ldr	w2, [x0, 40]
-	ldr	w3, [x27, 40]
+	ldr	w3, [x23, 40]
 	cmp	w3, w2
-	beq	.L617
-	.loc 1 860 0
-	ldr	x0, [x28, 88]
+	beq	.L623
+	.loc 1 993 0
+	ldr	x0, [x24, 88]
 	adrp	x1, .LC78
 	add	x1, x1, :lo12:.LC78
 	bl	_dev_info
-.LVL688:
-	.loc 1 861 0
-	ldr	w0, [x28, 28]
+.LVL696:
+	.loc 1 994 0
+	ldr	w0, [x24, 28]
 	cmp	w0, 1
-	beq	.L764
-.L744:
-	ldr	w2, [x27, 40]
-.L617:
-	.loc 1 868 0
+	beq	.L782
+.L765:
+	ldr	w2, [x23, 40]
+.L623:
+	.loc 1 1001 0
 	cmp	w2, 11
-	ble	.L765
+	ble	.L783
 	cmp	w2, 17
-	ble	.L766
+	ble	.L784
 	cmp	w2, 18
-	beq	.L626
+	beq	.L632
 	cmp	w2, 19
-	bne	.L623
-	.loc 1 963 0
-	mov	w22, 1
-	.loc 1 952 0
-	str	wzr, [x28, 616]
-.L627:
-	.loc 1 971 0
-	ldr	x25, [x28, 208]
-.LVL689:
-	.loc 1 972 0
-	ldr	w0, [x25, 40]
-	.loc 1 974 0
+	bne	.L629
+	.loc 1 1096 0
+	mov	w21, 1
+	.loc 1 1085 0
+	str	wzr, [x24, 608]
+.L633:
+	.loc 1 1104 0
+	ldr	x26, [x24, 200]
+	.loc 1 1105 0
+	ldr	w0, [x26, 40]
+	.loc 1 1107 0
 	cmp	w0, 1
-	.loc 1 972 0
+	.loc 1 1105 0
 	ccmp	w0, 18, 4, hi
-	bne	.L654
-	.loc 1 978 0
+	bne	.L668
+	.loc 1 1111 0
 	add	x0, x29, 152
-	str	x0, [x28, 208]
-	.loc 1 979 0
-	ldr	x0, [x28, 136]
+	str	x0, [x24, 200]
+	.loc 1 1112 0
+	ldr	x0, [x24, 136]
 	str	x0, [x29, 168]
-.L654:
-	.loc 1 984 0
-	str	wzr, [x28, 76]
-	.loc 1 985 0
-	str	x27, [x28, 216]
-	.loc 1 987 0
-	ldr	w9, [x27, 40]
-	.loc 1 990 0
-	sub	w0, w9, #7
-	.loc 1 987 0
+.L668:
+	.loc 1 1117 0
+	str	wzr, [x24, 76]
+	.loc 1 1118 0
+	str	x23, [x24, 208]
+	.loc 1 1120 0
+	ldr	w7, [x23, 40]
+	.loc 1 1123 0
+	sub	w0, w7, #7
+	.loc 1 1120 0
 	cmp	w0, 4
-	bls	.L767
-.LVL690:
-.L655:
-	.loc 1 1002 0
-	cbnz	w22, .L690
-	.loc 1 1006 0
-	ldr	w1, [x28, 48]
-	mov	x0, x27
+	bls	.L785
+.LVL697:
+.L669:
+	.loc 1 1135 0
+	cbnz	w21, .L708
+	.loc 1 1139 0
+	ldr	w1, [x24, 48]
+	mov	x0, x23
 	cmp	w1, 0
-	ble	.L662
-	.loc 1 1007 0
-	add	w26, w26, 1
-	.loc 1 1008 0
-	cmp	w1, w26
-	ble	.L768
-.L662:
-	.loc 1 1015 0
-	cmp	w9, 12
-	beq	.L769
-.L663:
-	.loc 1 1021 0
-	ldr	w0, [x28, 192]
-	cbz	w0, .L770
-.L664:
-	.loc 1 1024 0
+	ble	.L676
+	.loc 1 1140 0
+	ldr	w0, [x29, 108]
+.LVL698:
+	add	w0, w0, 1
+	str	w0, [x29, 108]
+	.loc 1 1141 0
+	cmp	w1, w0
+	mov	x0, x23
+.LVL699:
+	ble	.L786
+.L676:
+	.loc 1 1148 0
+	cmp	w7, 12
+	beq	.L787
+.L677:
+	.loc 1 1154 0
+	ldr	w0, [x24, 184]
+	cbz	w0, .L788
+.L678:
+	.loc 1 1157 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL691:
-	mov	w22, w0
-	cbz	w0, .L665
-.L778:
-	.loc 1 1025 0
-	ldr	x0, [x28, 88]
+.LVL700:
+	mov	w21, w0
+	cbz	w0, .L679
+.L796:
+	.loc 1 1158 0
+	ldr	x0, [x24, 88]
 	adrp	x1, .LC83
-	.loc 1 1028 0
-	mov	w22, 0
-	.loc 1 1025 0
+	.loc 1 1161 0
+	mov	w21, 0
+	.loc 1 1158 0
 	add	x1, x1, :lo12:.LC83
 	bl	_dev_err
-.LVL692:
-	.loc 1 1027 0
-	str	x25, [x28, 208]
-.LVL693:
-.L640:
-	.loc 1 1059 0
-	ldr	x0, [x28, 216]
+.LVL701:
+	.loc 1 1160 0
+	str	x26, [x24, 200]
+.LVL702:
+.L645:
+	.loc 1 1192 0
+	ldr	x0, [x24, 208]
 	ldr	w0, [x0, 40]
 	cmp	w0, 17
-	beq	.L771
-.L670:
-	.loc 1 1065 0
+	beq	.L789
+.L684:
+	.loc 1 1198 0
 	cmp	w0, 15
-	beq	.L772
-.L671:
-	.loc 1 1074 0
-	mov	x0, x27
+	beq	.L790
+.L685:
+	.loc 1 1207 0
+	mov	x0, x23
 	bl	ebc_remove_from_dsp_buf_list
-.LVL694:
-	.loc 1 1076 0
-	ldr	w0, [x28, 436]
-	cbnz	w0, .L773
-.L672:
-	.loc 1 1079 0
+.LVL703:
+	.loc 1 1209 0
+	ldr	w0, [x24, 428]
+	cbnz	w0, .L791
+	.loc 1 1212 0
 	mov	w0, 1
-	str	w0, [x28, 436]
-.L673:
-	.loc 1 1081 0
-	ldr	x0, [x28, 216]
-	str	x0, [x28, 208]
-	.loc 1 1082 0
-	b	.L604
-.LVL695:
+	str	w0, [x24, 428]
+.L687:
+	.loc 1 1214 0
+	ldr	x0, [x24, 208]
+	str	x0, [x24, 200]
+	.loc 1 1215 0
+	b	.L610
 	.p2align 3
-.L615:
-	.loc 1 857 0
-	mov	x0, x27
-	str	x27, [x28, 208]
-	b	.L616
+.L621:
+	.loc 1 990 0
+	mov	x0, x23
+	str	x23, [x24, 200]
+	b	.L622
 	.p2align 3
-.L765:
-	.loc 1 868 0
+.L783:
+	.loc 1 1001 0
 	cmp	w2, 7
-	bge	.L627
+	bge	.L633
 	cmp	w2, 1
-	beq	.L626
-	bgt	.L689
-	cbnz	w2, .L623
-	.loc 1 916 0
-	str	x27, [x28, 216]
-	.loc 1 917 0
-	ldrsw	x2, [x28, 20]
-	ldr	x0, [x28, 152]
-	ldr	x1, [x27, 16]
-	bl	memcpy
-.LVL696:
-	.loc 1 918 0
-	ldr	x0, [x28, 208]
-	ldr	w0, [x0, 40]
-	cbnz	w0, .L774
-.L650:
-	.loc 1 928 0
-	ldr	x0, [x28, 216]
-	mov	x4, x28
-	ldp	x2, x1, [x28, 144]
-	ldr	x3, [x28, 160]
+	beq	.L632
+	bgt	.L703
+	cbnz	w2, .L629
+	.loc 1 1048 0
+	add	x0, x22, 592
+	bl	down_write
+.LVL704:
+	.loc 1 1051 0
+	ldr	x0, [x24, 200]
+	.loc 1 1049 0
+	str	x23, [x24, 208]
+	.loc 1 1051 0
+	ldr	w1, [x0, 40]
+	mov	x0, x23
+	cbnz	w1, .L792
+.L663:
+	.loc 1 1061 0
 	ldr	w5, [x0, 40]
-	ldr	x0, [x28, 128]
+	mov	x4, x24
+	ldr	x1, [x0, 16]
+	ldp	x2, x3, [x24, 144]
+	ldr	x0, [x24, 128]
 	bl	refresh_new_image2
-.LVL697:
-.L651:
-	.loc 1 934 0
-	ldr	w0, [x28, 28]
-	cbnz	w0, .L640
-	.loc 1 937 0
-	ldr	w0, [x28, 192]
-	.loc 1 935 0
+.LVL705:
+.L665:
+	.loc 1 1065 0
+	add	x0, x22, 592
+	bl	up_write
+.LVL706:
+	.loc 1 1067 0
+	ldr	w0, [x24, 28]
+	cbnz	w0, .L645
+	.loc 1 1070 0
+	ldr	w0, [x24, 184]
+	.loc 1 1068 0
 	mov	w1, 1
-	.loc 1 936 0
-	str	wzr, [x28, 76]
-	.loc 1 935 0
-	str	w1, [x28, 28]
-	.loc 1 937 0
-	cbz	w0, .L775
-.L652:
-	.loc 1 939 0
+	.loc 1 1069 0
+	str	wzr, [x24, 76]
+	.loc 1 1068 0
+	str	w1, [x24, 28]
+	.loc 1 1070 0
+	cbz	w0, .L793
+.L666:
+	.loc 1 1072 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL698:
+.LVL707:
 	cmn	w0, #1
-	beq	.L776
-	.loc 1 947 0
-	ldr	x0, [x28, 88]
+	beq	.L794
+	.loc 1 1077 0
+	ldr	w3, [x24, 96]
+	.loc 1 1080 0
 	adrp	x1, .LC84
-	.loc 1 944 0
-	ldr	w3, [x28, 96]
-	.loc 1 947 0
-	add	x1, x1, :lo12:.LC84
-	.loc 1 944 0
-	strb	w3, [x28, 32]
-.LVL699:
-.L747:
-	.loc 1 947 0
-	and	w2, w3, 255
-	.loc 1 945 0
-	lsr	w3, w3, 8
-	strb	w3, [x28, 33]
-	.loc 1 947 0
-	bl	_dev_info
-.LVL700:
-	.loc 1 948 0
-	mov	x0, x20
-	bl	ebc_frame_start
-.LVL701:
-	.loc 1 1059 0
-	ldr	x0, [x28, 216]
-	ldr	w0, [x0, 40]
-	cmp	w0, 17
-	bne	.L670
-.LVL702:
-	.p2align 2
-.L771:
-	.loc 1 1062 0
-	ldr	x0, [x28, 88]
-	.loc 1 1060 0
-	mov	w21, 1
-.LVL703:
-	.loc 1 1061 0
-	str	wzr, [x28, 196]
-	.loc 1 1062 0
-	adrp	x1, .LC87
-	.loc 1 1060 0
-	str	w21, [x28, 608]
-	.loc 1 1062 0
-	add	x1, x1, :lo12:.LC87
-	bl	_dev_info
-.LVL704:
-	.loc 1 1063 0
-	mov	w2, w21
-	mov	w1, w21
-	add	x0, x24, 328
-	bl	__wake_up_sync
-.LVL705:
-	.loc 1 1074 0
-	mov	x0, x27
-	bl	ebc_remove_from_dsp_buf_list
-.LVL706:
-	.loc 1 1076 0
-	ldr	w0, [x28, 436]
-	cbz	w0, .L672
-.LVL707:
-	.p2align 2
-.L773:
 	.loc 1 1077 0
-	ldr	x0, [x28, 208]
-	bl	ebc_buf_release
+	strb	w3, [x24, 32]
+	.loc 1 1080 0
+	add	x1, x1, :lo12:.LC84
+	ldr	x0, [x24, 88]
+	b	.L766
 .LVL708:
-	b	.L673
+	.p2align 3
+.L772:
+	.loc 1 947 0
+	str	wzr, [x24, 604]
+	.loc 1 946 0
+	str	wzr, [x24, 608]
+	b	.L615
 .LVL709:
 	.p2align 3
-.L754:
-	.loc 1 814 0
-	str	wzr, [x28, 612]
-	.loc 1 813 0
-	str	wzr, [x28, 616]
-	b	.L609
+.L791:
+	.loc 1 1210 0
+	ldr	x0, [x24, 200]
+	bl	ebc_buf_release
 .LVL710:
+	b	.L687
 	.p2align 3
-.L758:
-.LBB1717:
-	.loc 1 1086 0 discriminator 1
-	ldr	w0, [x28, 80]
-	cbnz	w0, .L674
-.LBB1718:
-	.loc 1 1086 0 is_stmt 0 discriminator 3
+.L776:
+.LBB1691:
+	.loc 1 1219 0 discriminator 1
+	ldr	w0, [x24, 80]
+	cbnz	w0, .L688
+.LBB1692:
+	.loc 1 1219 0 is_stmt 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
 .LVL711:
-	b	.L678
+	b	.L692
 	.p2align 3
-.L777:
-.LBB1719:
-	.loc 1 1086 0 discriminator 7
-	ldr	w1, [x28, 80]
-	cbnz	w1, .L675
+.L795:
+.LBB1693:
+	.loc 1 1219 0 discriminator 7
+	ldr	w1, [x24, 80]
+	cbnz	w1, .L689
 .LVL712:
-	.loc 1 1086 0 discriminator 9
-	cbnz	x0, .L748
-	.loc 1 1086 0 discriminator 11
+	.loc 1 1219 0 discriminator 9
+	cbnz	x0, .L767
+	.loc 1 1219 0 discriminator 11
 	bl	schedule
 .LVL713:
-.L678:
-	.loc 1 1086 0 discriminator 13
+.L692:
+	.loc 1 1219 0 discriminator 13
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
 .LVL714:
-	ldr	w1, [x28, 28]
-	cbnz	w1, .L777
-.L675:
-.LBE1719:
-	.loc 1 1086 0 discriminator 8
+	ldr	w1, [x24, 28]
+	cbnz	w1, .L795
+.L689:
+.LBE1693:
+	.loc 1 1219 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 112
 	bl	finish_wait
 .LVL715:
-	ldr	w0, [x28, 28]
-.LBE1718:
-.LBE1717:
-	.loc 1 1089 0 is_stmt 1 discriminator 8
-	cbnz	w0, .L748
-	.loc 1 1094 0
-	ldr	w0, [x28, 192]
+	ldr	w0, [x24, 28]
+.LBE1692:
+.LBE1691:
+	.loc 1 1222 0 is_stmt 1 discriminator 8
+	cbnz	w0, .L767
+	.loc 1 1227 0
+	ldr	w0, [x24, 184]
 	cmp	w0, 1
-	bne	.L748
+	bne	.L767
 	.p2align 2
-.L759:
-	.loc 1 1095 0
+.L777:
+	.loc 1 1228 0
 	mov	x0, x20
-	bl	ebc_power_set.constprop.7
+	bl	ebc_power_set.constprop.8
 .LVL716:
-	b	.L748
-.LVL717:
+	b	.L767
 	.p2align 3
-.L766:
-	.loc 1 868 0
+.L784:
+	.loc 1 1001 0
 	cmp	w2, 14
-	bge	.L689
+	bge	.L703
 	cmp	w2, 12
-	beq	.L689
+	beq	.L703
 	cmp	w2, 13
-	beq	.L627
-.L623:
-	.loc 1 1051 0
-	ldr	x0, [x28, 88]
+	beq	.L633
+.L629:
+	.loc 1 1184 0
+	ldr	x0, [x24, 88]
 	adrp	x1, .LC86
 	add	x1, x1, :lo12:.LC86
 	bl	_dev_err
+.LVL717:
+	.loc 1 1192 0
+	ldr	x0, [x24, 208]
+	ldr	w0, [x0, 40]
+	cmp	w0, 17
+	bne	.L684
 .LVL718:
-	.loc 1 1052 0
-	b	.L640
-	.p2align 3
-.L689:
-	.loc 1 963 0
-	mov	w22, 1
-	b	.L627
+	.p2align 2
+.L789:
+	.loc 1 1195 0
+	ldr	x0, [x24, 88]
+	.loc 1 1193 0
+	mov	w25, 1
+	.loc 1 1194 0
+	str	wzr, [x24, 188]
+	.loc 1 1195 0
+	adrp	x1, .LC87
+	.loc 1 1193 0
+	str	w25, [x24, 600]
+	.loc 1 1195 0
+	add	x1, x1, :lo12:.LC87
+	bl	_dev_info
 .LVL719:
+	.loc 1 1196 0
+	mov	w2, w25
+	mov	w1, w25
+	add	x0, x22, 328
+	bl	__wake_up_sync
+.LVL720:
+	b	.L685
 	.p2align 3
-.L690:
-	mov	x0, x27
-	.loc 1 1003 0
-	mov	w26, 0
-	.loc 1 1015 0
-	cmp	w9, 12
-	bne	.L663
-.L769:
-	.loc 1 1017 0
-	ldr	w1, [x25, 40]
+.L703:
+	.loc 1 1096 0
+	mov	w21, 1
+	b	.L633
+.LVL721:
+	.p2align 3
+.L708:
+	.loc 1 1136 0
+	str	wzr, [x29, 108]
+	mov	x0, x23
+	.loc 1 1148 0
+	cmp	w7, 12
+	bne	.L677
+.L787:
+	.loc 1 1150 0
+	ldr	w1, [x26, 40]
 	sub	w1, w1, #12
 	cmp	w1, 1
-	bls	.L663
-	.loc 1 1018 0
+	bls	.L677
+	.loc 1 1151 0
 	mov	w1, 13
 	str	w1, [x0, 40]
-	.loc 1 1021 0
-	ldr	w0, [x28, 192]
-	cbnz	w0, .L664
+	.loc 1 1154 0
+	ldr	w0, [x24, 184]
+	cbnz	w0, .L678
 	.p2align 2
-.L770:
-.LBB1720:
-.LBB1721:
+.L788:
+.LBB1694:
+.LBB1695:
 	mov	w1, 1
 	mov	x0, x20
-	bl	ebc_power_set.part.3
-.LVL720:
-.LBE1721:
-.LBE1720:
-	.loc 1 1024 0
+	bl	ebc_power_set.part.4
+.LVL722:
+.LBE1695:
+.LBE1694:
+	.loc 1 1157 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL721:
-	mov	w22, w0
-	cbnz	w0, .L778
-.L665:
-	.loc 1 1036 0
-	ldr	x0, [x28, 216]
+.LVL723:
+	mov	w21, w0
+	cbnz	w0, .L796
+.L679:
+	.loc 1 1169 0
+	ldr	x0, [x24, 208]
 	adrp	x1, .LC85
-	.loc 1 1033 0
-	ldr	w3, [x28, 96]
-	.loc 1 1036 0
+	.loc 1 1166 0
+	ldr	w3, [x24, 96]
+	.loc 1 1169 0
 	add	x1, x1, :lo12:.LC85
-	.loc 1 1033 0
-	strb	w3, [x28, 32]
-	.loc 1 1036 0
+	.loc 1 1166 0
+	strb	w3, [x24, 32]
+	.loc 1 1173 0
+	add	x28, x20, 672
+	.loc 1 1169 0
 	and	w3, w3, 255
 	ldr	w2, [x0, 40]
-	ldr	x0, [x28, 88]
+	ldr	x0, [x24, 88]
 	bl	_dev_info
-.LVL722:
-	.loc 1 1037 0
+.LVL724:
+	.loc 1 1170 0
 	mov	w0, 1
-	str	w0, [x28, 28]
-	.loc 1 1038 0
+	str	w0, [x24, 28]
+	.loc 1 1171 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL723:
-	.loc 1 1040 0
-	ldr	x1, [x21, #:lo12:jiffies]
-	add	x0, x20, 680
-	str	x0, [x29, 96]
+.LVL725:
+	.loc 1 1173 0
+	ldr	x1, [x25, #:lo12:jiffies]
+	mov	x0, x28
 	add	x1, x1, 900
 	bl	mod_timer
-.LVL724:
-.LBB1722:
-	.loc 1 1041 0
-	ldr	w0, [x28, 76]
-	cbz	w0, .L779
-.L668:
-.LVL725:
-.L666:
-.LBE1722:
-	.loc 1 1043 0 discriminator 11
-	ldr	x2, [x21, #:lo12:jiffies]
-	mov	x1, 402653184
-	ldr	x0, [x29, 96]
 .LVL726:
-	add	x1, x2, x1
-	bl	mod_timer
+.LBB1696:
+	.loc 1 1174 0
+	ldr	w0, [x24, 76]
+	cbz	w0, .L797
+.L682:
 .LVL727:
-	.loc 1 1044 0 discriminator 11
-	str	wzr, [x28, 76]
-	.loc 1 1046 0 discriminator 11
-	str	x25, [x28, 208]
-	.loc 1 1048 0 discriminator 11
-	b	.L640
+.L680:
+.LBE1696:
+	.loc 1 1176 0 discriminator 11
+	ldr	x2, [x25, #:lo12:jiffies]
+	mov	x0, x28
 .LVL728:
-	.p2align 3
-.L626:
-	.loc 1 871 0
-	ldr	w0, [x28, 612]
-	cbz	w0, .L631
-	.loc 1 872 0
-	mov	w0, 1
-	.loc 1 882 0
-	str	x27, [x28, 216]
-	.loc 1 872 0
-	str	w0, [x28, 616]
-	.loc 1 883 0
-	ldrsw	x2, [x28, 20]
-	ldr	x1, [x27, 16]
-	ldr	x0, [x28, 152]
-	bl	memcpy
+	mov	x1, 402653184
+	add	x1, x2, x1
+	bl	mod_timer
 .LVL729:
-	.loc 1 884 0
-	ldr	x1, [x28, 208]
-	ldr	w0, [x1, 40]
-	.loc 1 886 0
-	cmp	w0, 1
-	.loc 1 884 0
-	ccmp	w0, 18, 4, hi
-	bne	.L780
-	.loc 1 890 0
-	cbz	w0, .L781
-.L634:
-	.loc 1 896 0
-	ldr	x1, [x28, 216]
-.LBB1727:
-.LBB1728:
-	.loc 1 285 0
-	ldp	w5, w4, [x28, 52]
-.LBE1728:
-.LBE1727:
-	.loc 1 894 0
-	ldr	x9, [x28, 128]
-.LBB1733:
-.LBB1729:
-	.loc 1 282 0
-	ldp	w3, w16, [x1, 48]
-	.loc 1 285 0
-	add	w0, w4, 15
-	.loc 1 283 0
-	ldp	w2, w21, [x1, 56]
-	.loc 1 280 0
+	.loc 1 1177 0 discriminator 11
+	str	wzr, [x24, 76]
+	.loc 1 1179 0 discriminator 11
+	str	x26, [x24, 200]
+	.loc 1 1181 0 discriminator 11
+	b	.L645
+	.p2align 3
+.L632:
+	.loc 1 1004 0
+	ldr	w0, [x24, 604]
+	cbz	w0, .L637
+	.loc 1 1017 0
+	ldr	x0, [x24, 200]
+	.loc 1 1005 0
+	mov	w1, 1
+	.loc 1 1015 0
+	str	x23, [x24, 208]
+	.loc 1 1005 0
+	str	w1, [x24, 608]
+	.loc 1 1017 0
+	ldr	w1, [x0, 40]
+	.loc 1 1019 0
+	cmp	w1, 1
+	.loc 1 1017 0
+	ccmp	w1, 18, 4, hi
+	bne	.L798
+	mov	x0, x23
+	.loc 1 1023 0
+	cbz	w1, .L799
+.L640:
+.LBB1700:
+.LBB1701:
+	.loc 1 297 0
+	ldp	w3, w15, [x0, 48]
+	.loc 1 298 0
+	ldp	w2, w18, [x0, 56]
+	.loc 1 295 0
 	cmp	w3, 0
-	add	w18, w3, 15
-.LVL730:
-	.loc 1 290 0
-	sub	w8, w5, #1
-	.loc 1 280 0
-	csel	w18, w18, w3, lt
-	.loc 1 281 0
-	add	w12, w2, 15
+	.loc 1 300 0
+	ldr	w1, [x20, 240]
+	.loc 1 295 0
+	add	w16, w3, 7
+	csel	w16, w16, w3, lt
+	.loc 1 296 0
+	add	w10, w2, 7
 	cmp	w2, 0
-.LBE1729:
-.LBE1733:
-	.loc 1 894 0
-	ldr	x11, [x28, 160]
-.LBB1734:
-.LBB1730:
-	.loc 1 281 0
-	csel	w12, w12, w2, lt
-	.loc 1 285 0
-	cmp	w4, 0
-	csel	w0, w0, w4, lt
-	.loc 1 281 0
-	asr	w12, w12, 4
-	add	w12, w12, 1
+	.loc 1 300 0
+	add	w17, w1, 7
+	.loc 1 296 0
+	csel	w10, w10, w2, lt
+	.loc 1 300 0
+	cmp	w1, 0
+	csel	w17, w17, w1, lt
+	.loc 1 296 0
+	asr	w10, w10, 3
+	add	w10, w10, 1
+.LVL730:
+	.loc 1 300 0
+	asr	w17, w17, 3
 .LVL731:
-	.loc 1 285 0
-	asr	w0, w0, 4
-	.loc 1 288 0
-	cmp	w12, w0
-	sub	w0, w0, #1
-	csel	w12, w0, w12, ge
+	ldr	w1, [x20, 236]
+	.loc 1 303 0
+	cmp	w10, w17
+	sub	w2, w17, #1
+.LBE1701:
+.LBE1700:
+	.loc 1 1027 0
+	ldr	w13, [x0, 40]
+.LBB1706:
+.LBB1702:
+	.loc 1 303 0
+	csel	w10, w2, w10, ge
 .LVL732:
-	.loc 1 290 0
-	cmp	w21, w5
-	csel	w21, w8, w21, ge
-.LBE1730:
-.LBE1734:
-	.loc 1 894 0
-	ldr	w15, [x1, 40]
-	ldp	x14, x13, [x28, 144]
-.LBB1735:
-.LBB1731:
-	.loc 1 280 0
-	asr	w18, w18, 4
+	.loc 1 305 0
+	cmp	w1, w18
+	sub	w1, w1, #1
+	.loc 1 295 0
+	asr	w16, w16, 3
 .LVL733:
-	.loc 1 292 0
-	cmp	w16, w21
-	bgt	.L637
-	.loc 1 314 0
-	mov	w17, 1
+	.loc 1 305 0
+	csel	w18, w1, w18, le
+.LBE1702:
+.LBE1706:
+	.loc 1 1027 0
+	ldr	x11, [x0, 16]
 .LVL734:
-	.p2align 2
-.L638:
-	.loc 1 293 0
-	mul	w4, w16, w4
-	.loc 1 297 0
-	mov	w0, w18
-	.loc 1 296 0
-	cmp	w4, 0
-	add	w10, w4, 15
-	csel	w10, w10, w4, lt
-	.loc 1 293 0
-	add	w4, w4, w4, lsr 31
-	asr	w4, w4, 1
-	.loc 1 296 0
-	asr	w10, w10, 4
-	sxtw	x10, w10
-	sxtw	x4, w4
-	.loc 1 297 0
-	cmp	w18, w12
-	bgt	.L648
-	.p2align 2
-.L721:
-	add	x1, x4, x0, sxtw 3
-	.loc 1 302 0
-	add	x3, x10, x0, sxtw
-	.loc 1 309 0
-	cmp	w15, 18
-	.loc 1 298 0
-	ldr	x25, [x9, x1]
+.LBB1707:
+.LBB1703:
+	.loc 1 307 0
+	cmp	w15, w18
+.LBE1703:
+.LBE1707:
+	.loc 1 1027 0
+	ldr	x8, [x24, 128]
+	.loc 1 1028 0
+	ldp	x12, x26, [x24, 144]
 .LVL735:
-	.loc 1 299 0
-	ldr	x2, [x13, x1]
+.LBB1708:
+.LBB1704:
+	.loc 1 307 0
+	bgt	.L648
+	mul	w9, w15, w17
+	sbfiz	x25, x17, 3, 32
+	.loc 1 316 0
+	mov	w14, 15
 .LVL736:
-	.loc 1 300 0
-	ldr	x8, [x14, x1]
-	.loc 1 302 0
-	ldrb	w5, [x11, x3]
+	.p2align 2
+.L647:
+	.loc 1 311 0
+	sxtw	x7, w15
 .LVL737:
-	.loc 1 309 0
-	beq	.L782
-	.loc 1 318 0
-	and	x2, x2, x8
+	.loc 1 312 0
+	mov	w6, w16
+	cmp	w16, w10
+	.loc 1 311 0
+	madd	x7, x7, x25, x26
 .LVL738:
-	.loc 1 317 0
-	cbz	w5, .L745
-.L646:
-	.loc 1 319 0
-	cmp	x25, x2
-	beq	.L645
-	.loc 1 320 0
-	str	x2, [x9, x1]
-	.loc 1 321 0
-	strb	w17, [x11, x3]
-.L645:
-	.loc 1 297 0
-	add	w0, w0, 1
-	cmp	w0, w12
-	ble	.L721
+	.loc 1 312 0
+	ble	.L735
+	b	.L661
 .LVL739:
-.L648:
-	.loc 1 292 0
-	add	w16, w16, 1
-	cmp	w16, w21
-	bgt	.L637
-	ldr	w4, [x28, 56]
-	b	.L638
+	.p2align 3
+.L800:
+	.loc 1 333 0
+	orr	w0, w0, -65536
+.L654:
 .LVL740:
+	.loc 1 346 0
+	orn	w2, w5, w1
+	and	w1, w1, w5
+.LVL741:
+	.loc 1 344 0
+	bic	w4, w27, w0
+	.loc 1 346 0
+	and	w2, w2, w0
+	and	w0, w1, w0
+.LVL742:
+	cmp	w13, 18
+	orr	w1, w2, w4
+	orr	w0, w0, w4
+	csel	w0, w0, w1, ne
+	.loc 1 349 0
+	str	w0, [x8, x3]
+.LVL743:
+	.loc 1 312 0
+	add	w6, w6, 1
+	cmp	w6, w10
+	bgt	.L661
+.L735:
+	.loc 1 313 0
+	sxtw	x2, w6
+.LVL744:
+	.loc 1 320 0
+	mov	w0, 65535
+.LVL745:
+	.loc 1 313 0
+	lsl	x3, x2, 2
+	.loc 1 318 0
+	lsl	x2, x2, 3
+.LVL746:
+	add	x3, x3, x9, sxtw 2
+	ldr	w4, [x7, x2]
+	.loc 1 313 0
+	ldr	w27, [x8, x3]
+	.loc 1 314 0
+	ldr	w1, [x11, x3]
+	.loc 1 315 0
+	ldr	w5, [x12, x3]
+.LVL747:
+	.loc 1 319 0
+	cbz	w4, .L649
+	.loc 1 322 0
+	and	w0, w4, 255
+.LVL748:
+	.loc 1 316 0
+	cmp	w0, 0
+	csel	w0, w14, wzr, eq
+.LVL749:
+	.loc 1 325 0
+	tst	w4, 65280
+	orr	w28, w0, 240
+	csel	w0, w28, w0, eq
+	.loc 1 327 0
+	tst	w4, 16711680
+	orr	w28, w0, 3840
+	csel	w0, w28, w0, eq
+	.loc 1 329 0
+	tst	w4, -16777216
+	orr	w4, w0, 61440
+	csel	w0, w4, w0, eq
+.L649:
+	.loc 1 331 0
+	add	x2, x7, x2
+	ldr	w2, [x2, 4]
+	.loc 1 332 0
+	cbz	w2, .L800
+	.loc 1 335 0
+	and	w4, w2, 255
+	.loc 1 336 0
+	cmp	w4, 0
+	orr	w4, w0, 983040
+	csel	w0, w4, w0, eq
+	.loc 1 338 0
+	tst	w2, 65280
+	orr	w4, w0, 15728640
+	csel	w0, w4, w0, eq
+	.loc 1 340 0
+	tst	w2, 16711680
+	orr	w4, w0, 251658240
+	csel	w0, w4, w0, eq
+	.loc 1 342 0
+	tst	w2, -16777216
+	orr	w2, w0, -268435456
+	csel	w0, w2, w0, eq
+	b	.L654
+.LVL750:
 	.p2align 3
-.L767:
-.LBE1731:
-.LBE1735:
-	.loc 1 994 0
-	ldp	w8, w0, [x20, 108]
-	.loc 1 992 0
-	ldr	x4, [x27, 16]
-	.loc 1 994 0
-	mul	w8, w8, w0
-	.loc 1 993 0
-	ldr	x0, [x28, 208]
-	.loc 1 994 0
-	lsr	w8, w8, 1
-	.loc 1 993 0
+.L785:
+.LBE1704:
+.LBE1708:
+	.loc 1 1127 0
+	ldp	w6, w0, [x20, 108]
+	.loc 1 1125 0
+	ldr	x4, [x23, 16]
+	.loc 1 1127 0
+	mul	w6, w6, w0
+	.loc 1 1126 0
+	ldr	x0, [x24, 200]
+	.loc 1 1127 0
+	lsr	w6, w6, 1
+	.loc 1 1126 0
 	ldr	x5, [x0, 16]
-.LBB1736:
-.LBB1737:
-	.loc 1 767 0
-	asr	w0, w8, 3
-	cbz	w0, .L656
-	.loc 1 771 0
-	ldr	x1, [x4]
-	ldr	x2, [x5]
+.LBB1709:
+.LBB1710:
+	.loc 1 900 0
+	asr	w0, w6, 3
+	cbz	w0, .L670
+	.loc 1 904 0
+	ldr	x2, [x4]
+	ldr	x1, [x5]
 	cmp	x2, x1
-	bne	.L655
+	bne	.L669
 	sub	w3, w0, #1
 	mov	x0, 8
 	add	x3, x3, 1
 	lsl	x3, x3, 3
-	b	.L658
+	b	.L672
 	.p2align 3
-.L659:
-	.loc 1 768 0
+.L673:
+	.loc 1 901 0
 	ldr	x2, [x4, x0]
 	add	x0, x0, 8
-	.loc 1 769 0
+	.loc 1 902 0
 	add	x1, x5, x0
-	.loc 1 771 0
+	.loc 1 904 0
 	ldr	x1, [x1, -8]
 	cmp	x2, x1
-	bne	.L655
-.L658:
-	.loc 1 767 0
+	bne	.L669
+.L672:
+	.loc 1 900 0
 	cmp	x3, x0
-	bne	.L659
-.L656:
-	.loc 1 777 0
-	ands	w8, w8, 7
-.LVL741:
-	beq	.L660
-	sub	w1, w8, #1
+	bne	.L673
+.L670:
+	.loc 1 910 0
+	ands	w6, w6, 7
+.LVL751:
+	beq	.L674
+	sub	w1, w6, #1
 	mov	x0, 0
 	add	x1, x1, 1
 	lsl	x1, x1, 2
-	.p2align 2
-.L661:
-.LBB1738:
-	.loc 1 782 0
+	b	.L675
+	.p2align 3
+.L801:
+	add	x0, x0, 4
+	.loc 1 911 0
+	cmp	x1, x0
+	beq	.L674
+.L675:
+.LBB1711:
+	.loc 1 915 0
 	ldrb	w3, [x4, x0]
 	ldrb	w2, [x5, x0]
 	cmp	w3, w2
-	bne	.L655
-	add	x0, x0, 4
-.LBE1738:
-	.loc 1 778 0
-	cmp	x0, x1
-	bne	.L661
-.L660:
-.LBE1737:
-.LBE1736:
-	.loc 1 995 0
-	ldr	x0, [x28, 88]
-	adrp	x1, .LC89
-	add	x1, x1, :lo12:.LC89
-	bl	_dev_info
-.LVL742:
-	.loc 1 997 0
-	str	x25, [x28, 208]
-	.loc 1 998 0
-	b	.L640
-.LVL743:
-.L768:
-	.loc 1 1009 0
+	beq	.L801
+	b	.L669
+.L786:
+.LBE1711:
+.LBE1710:
+.LBE1709:
+	.loc 1 1142 0
 	mov	w0, 2
-	str	w0, [x27, 40]
-	.loc 1 1010 0
-	mov	w26, 0
-	ldr	x0, [x28, 216]
-	ldr	w9, [x0, 40]
-	b	.L662
-.LVL744:
-.L631:
-	.loc 1 875 0
-	ldr	x0, [x28, 88]
-	adrp	x1, .LC81
-	add	x1, x1, :lo12:.LC81
-	bl	_dev_info
-.LVL745:
-	.loc 1 876 0
-	mov	x0, x27
-	b	.L743
-.L764:
-	.loc 1 862 0
-	ldr	x0, [x28, 88]
+	str	w0, [x23, 40]
+	.loc 1 1143 0
+	str	wzr, [x29, 108]
+	ldr	x0, [x24, 208]
+	ldr	w7, [x0, 40]
+	b	.L676
+.LVL752:
+.L782:
+	.loc 1 995 0
+	ldr	x0, [x24, 88]
 	adrp	x1, .LC79
 	add	x1, x1, :lo12:.LC79
 	bl	_dev_info
-.LVL746:
-.LBB1739:
-	.loc 1 863 0
-	ldr	w0, [x28, 76]
-	cbz	w0, .L783
-.L621:
-.LVL747:
-.L619:
-.LBE1739:
-	.loc 1 864 0 discriminator 11
-	ldr	x0, [x28, 88]
-.LVL748:
+.LVL753:
+.LBB1712:
+	.loc 1 996 0
+	ldr	w0, [x24, 76]
+	cbz	w0, .L802
+.L627:
+.LVL754:
+.L625:
+.LBE1712:
+	.loc 1 997 0 discriminator 11
+	ldr	x0, [x24, 88]
+.LVL755:
 	adrp	x1, .LC80
 	add	x1, x1, :lo12:.LC80
 	bl	_dev_info
-.LVL749:
-	b	.L744
-.LVL750:
-.L779:
-.LBB1743:
-.LBB1723:
-.LBB1724:
-	.loc 1 1041 0 discriminator 1
-	add	x0, x24, 352
-.LBE1724:
+.LVL756:
+	b	.L765
+.L797:
+.LBB1716:
+.LBB1697:
+.LBB1698:
+	.loc 1 1174 0 discriminator 1
+	add	x27, x22, 352
+.LBE1698:
 	mov	w1, 0
-.LBB1725:
-	str	x0, [x29, 104]
-.LBE1725:
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL751:
-	b	.L669
+.LVL757:
+	b	.L683
 	.p2align 3
-.L784:
-.LVL752:
-.LBB1726:
-	.loc 1 1041 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L666
-	.loc 1 1041 0 discriminator 7
+.L803:
+.LVL758:
+.LBB1699:
+	.loc 1 1174 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L680
+	.loc 1 1174 0 discriminator 7
 	bl	schedule
-.LVL753:
-.L669:
-	.loc 1 1041 0 discriminator 9
-	ldr	x0, [x29, 104]
+.LVL759:
+.L683:
+	.loc 1 1174 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
+	mov	x0, x27
 	bl	prepare_to_wait_event
-.LVL754:
-	ldr	w1, [x28, 76]
-	cbz	w1, .L784
-.LBE1726:
-	.loc 1 1041 0 discriminator 4
-	ldr	x0, [x29, 104]
+.LVL760:
+	ldr	w1, [x24, 76]
+	cbz	w1, .L803
+.LBE1699:
+	.loc 1 1174 0 discriminator 4
+	mov	x0, x27
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL755:
-.LBE1723:
-.LBE1743:
-	.loc 1 1043 0 is_stmt 1 discriminator 4
-	ldr	x2, [x21, #:lo12:jiffies]
+.LVL761:
+.LBE1697:
+.LBE1716:
+	.loc 1 1176 0 is_stmt 1 discriminator 4
+	ldr	x2, [x25, #:lo12:jiffies]
+	mov	x0, x28
 	mov	x1, 402653184
-	ldr	x0, [x29, 96]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL756:
-	.loc 1 1044 0 discriminator 4
-	str	wzr, [x28, 76]
-	.loc 1 1046 0 discriminator 4
-	str	x25, [x28, 208]
-	b	.L640
-.LVL757:
+.LVL762:
+	.loc 1 1177 0 discriminator 4
+	str	wzr, [x24, 76]
+	.loc 1 1179 0 discriminator 4
+	str	x26, [x24, 200]
+	b	.L645
+.LVL763:
 	.p2align 3
-.L762:
-	.loc 1 830 0
-	str	wzr, [x28, 616]
-	b	.L609
-.LVL758:
+.L661:
+.LBB1717:
+.LBB1705:
+	.loc 1 307 0
+	add	w15, w15, 1
+	add	w9, w9, w17
+	cmp	w15, w18
+	ble	.L647
+.L648:
+.LBE1705:
+.LBE1717:
+	.loc 1 1031 0
+	ldr	w0, [x24, 28]
+	cbnz	w0, .L645
+	.loc 1 1034 0
+	ldr	w0, [x24, 184]
+	.loc 1 1032 0
+	mov	w1, 1
+	.loc 1 1033 0
+	str	wzr, [x24, 76]
+	.loc 1 1032 0
+	str	w1, [x24, 28]
+	.loc 1 1034 0
+	cbz	w0, .L804
+.L662:
+	.loc 1 1036 0
+	mov	x0, x20
+	bl	ebc_lut_update
+.LVL764:
+	cmn	w0, #1
+	beq	.L645
+	.loc 1 1043 0
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC82
+	.loc 1 1040 0
+	ldr	w3, [x24, 96]
+	.loc 1 1043 0
+	add	x1, x1, :lo12:.LC82
+	.loc 1 1040 0
+	strb	w3, [x24, 32]
+.LVL765:
+.L766:
+	.loc 1 1080 0
+	and	w2, w3, 255
+	.loc 1 1078 0
+	lsr	w3, w3, 8
+	strb	w3, [x24, 33]
+	.loc 1 1080 0
+	bl	_dev_info
+.LVL766:
+	.loc 1 1081 0
+	mov	x0, x20
+	bl	ebc_frame_start
+.LVL767:
+	b	.L645
+.LVL768:
 	.p2align 3
-.L772:
-	.loc 1 1069 0
-	ldr	x0, [x28, 88]
-	.loc 1 1067 0
-	mov	w21, 1
-.LVL759:
-	.loc 1 1066 0
-	str	wzr, [x28, 196]
-	.loc 1 1069 0
+.L780:
+	.loc 1 963 0
+	str	wzr, [x24, 608]
+	b	.L615
+.LVL769:
+.L790:
+	.loc 1 1202 0
+	ldr	x0, [x24, 88]
+	.loc 1 1200 0
+	mov	w25, 1
+	.loc 1 1199 0
+	str	wzr, [x24, 188]
+	.loc 1 1202 0
 	adrp	x1, .LC88
-	.loc 1 1067 0
-	str	w21, [x28, 600]
-	.loc 1 1069 0
+	.loc 1 1200 0
+	str	w25, [x24, 592]
+	.loc 1 1202 0
 	add	x1, x1, :lo12:.LC88
-	.loc 1 1068 0
-	str	wzr, [x28, 616]
-	.loc 1 1069 0
+	.loc 1 1201 0
+	str	wzr, [x24, 608]
+	.loc 1 1202 0
 	bl	_dev_info
-.LVL760:
-	.loc 1 1070 0
+.LVL770:
+	.loc 1 1203 0
 	mov	x0, 2
 	bl	ebc_notify
-.LVL761:
-	.loc 1 1071 0
-	mov	w2, w21
-	mov	w1, w21
-	add	x0, x24, 328
+.LVL771:
+	.loc 1 1204 0
+	mov	w2, w25
+	mov	w1, w25
+	add	x0, x22, 328
 	bl	__wake_up_sync
-.LVL762:
-	b	.L671
-.LVL763:
-	.p2align 3
-.L782:
-.LBB1744:
-.LBB1732:
-	.loc 1 311 0
-	orn	x2, x8, x2
-.LVL764:
-	.loc 1 310 0
-	cbnz	w5, .L646
-.L745:
-	.loc 1 318 0
-	str	x2, [x9, x1]
-	b	.L645
-.LVL765:
-.L774:
-.LBE1732:
-.LBE1744:
-	.loc 1 919 0
-	ldrsw	x2, [x28, 20]
+.LVL772:
+	b	.L685
+.L637:
+	.loc 1 1008 0
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC81
+	add	x1, x1, :lo12:.LC81
+	bl	_dev_info
+.LVL773:
+	.loc 1 1009 0
+	mov	x0, x23
+	b	.L764
+.L792:
+	.loc 1 1052 0
+	ldrsw	x2, [x24, 20]
 	mov	w1, 255
-	ldr	x0, [x28, 144]
+	ldr	x0, [x24, 144]
 	bl	memset
-.LVL766:
-	.loc 1 921 0
-	ldr	x0, [x28, 208]
+.LVL774:
+	.loc 1 1054 0
+	ldr	x0, [x24, 200]
 	ldr	w0, [x0, 40]
-	.loc 1 923 0
+	.loc 1 1056 0
 	cmp	w0, 1
-	.loc 1 921 0
+	.loc 1 1054 0
 	ccmp	w0, 18, 4, hi
-	beq	.L650
-	.loc 1 924 0
-	ldr	x0, [x28, 216]
-	ldrsw	x2, [x28, 20]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x28, 128]
-	bl	memcpy
-.LVL767:
-	.loc 1 925 0
-	ldr	x0, [x28, 208]
-	ldrsw	x2, [x28, 20]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x28, 136]
-	bl	memcpy
-.LVL768:
-	b	.L651
-.L780:
-	.loc 1 887 0
-	ldrsw	x2, [x28, 20]
-	ldr	x1, [x1, 16]
-	ldr	x0, [x28, 128]
-	bl	memcpy
-.LVL769:
-	.loc 1 888 0
-	ldr	x0, [x28, 208]
-	ldrsw	x2, [x28, 20]
+	.loc 1 1057 0
+	ldr	x0, [x24, 208]
+	.loc 1 1054 0
+	beq	.L663
+	.loc 1 1057 0
+	ldrsw	x2, [x24, 20]
 	ldr	x1, [x0, 16]
-	ldr	x0, [x28, 136]
+	ldr	x0, [x24, 128]
 	bl	memcpy
-.LVL770:
-	.loc 1 889 0
-	ldr	x0, [x28, 208]
-	ldrsw	x2, [x28, 20]
+.LVL775:
+	.loc 1 1058 0
+	ldr	x0, [x24, 200]
+	ldrsw	x2, [x24, 20]
 	ldr	x1, [x0, 16]
-	ldr	x0, [x28, 144]
+	ldr	x0, [x24, 136]
 	bl	memcpy
-.LVL771:
-	b	.L634
-.L775:
-.LBB1745:
-.LBB1746:
-	mov	x0, x20
-	bl	ebc_power_set.part.3
-.LVL772:
-	b	.L652
-.L776:
-.LBE1746:
-.LBE1745:
-	.loc 1 940 0
-	ldr	x0, [x28, 88]
+.LVL776:
+	b	.L665
+.LVL777:
+.L674:
+	.loc 1 1128 0
+	ldr	x0, [x24, 88]
+	adrp	x1, .LC89
+	add	x1, x1, :lo12:.LC89
+	bl	_dev_info
+.LVL778:
+	.loc 1 1130 0
+	str	x26, [x24, 200]
+	.loc 1 1131 0
+	b	.L645
+.L794:
+	.loc 1 1073 0
+	ldr	x0, [x24, 88]
 	adrp	x1, .LC83
 	add	x1, x1, :lo12:.LC83
 	bl	_dev_err
-.LVL773:
-	.loc 1 941 0
+.LVL779:
+	.loc 1 1074 0
+	b	.L645
+.L793:
+.LBB1718:
+.LBB1719:
+	mov	x0, x20
+	bl	ebc_power_set.part.4
+.LVL780:
+	b	.L666
+.L799:
+.LBE1719:
+.LBE1718:
+	.loc 1 1024 0
+	ldrsw	x2, [x24, 20]
+	ldp	x1, x0, [x24, 136]
+	bl	memcpy
+.LVL781:
+	ldr	x0, [x24, 208]
 	b	.L640
-.L783:
-.LBB1747:
-.LBB1740:
-.LBB1741:
-	.loc 1 863 0 discriminator 1
-	add	x25, x24, 352
-.LVL774:
-.LBE1741:
+.L802:
+.LBB1720:
+.LBB1713:
+.LBB1714:
+	.loc 1 996 0 discriminator 1
+	add	x26, x22, 352
+.LVL782:
+.LBE1714:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL775:
-	b	.L622
+.LVL783:
+	b	.L628
 	.p2align 3
-.L785:
-.LVL776:
-.LBB1742:
-	.loc 1 863 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L619
-	.loc 1 863 0 discriminator 7
+.L805:
+.LVL784:
+.LBB1715:
+	.loc 1 996 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L625
+	.loc 1 996 0 discriminator 7
 	bl	schedule
-.LVL777:
-.L622:
-	.loc 1 863 0 discriminator 9
+.LVL785:
+.L628:
+	.loc 1 996 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
-	mov	x0, x25
+	mov	x0, x26
 	bl	prepare_to_wait_event
-.LVL778:
-	ldr	w1, [x28, 76]
-	cbz	w1, .L785
-.LBE1742:
-	.loc 1 863 0 discriminator 4
-	mov	x0, x25
+.LVL786:
+	ldr	w1, [x24, 76]
+	cbz	w1, .L805
+.LBE1715:
+	.loc 1 996 0 discriminator 4
+	mov	x0, x26
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL779:
-	b	.L619
-.LVL780:
-.L637:
-.LBE1740:
-.LBE1747:
-	.loc 1 898 0 is_stmt 1
-	ldr	w0, [x28, 28]
-.LVL781:
-	cbnz	w0, .L640
-	.loc 1 901 0
-	ldr	w0, [x28, 192]
-	.loc 1 899 0
-	mov	w1, 1
-	.loc 1 900 0
-	str	wzr, [x28, 76]
-	.loc 1 899 0
-	str	w1, [x28, 28]
-	.loc 1 901 0
-	cbz	w0, .L786
-.L649:
-	.loc 1 903 0
-	mov	x0, x20
-	bl	ebc_lut_update
-.LVL782:
-	cmn	w0, #1
-	beq	.L640
-	.loc 1 907 0
-	ldr	w3, [x28, 96]
-	.loc 1 910 0
-	adrp	x1, .LC82
-	.loc 1 907 0
-	strb	w3, [x28, 32]
-	.loc 1 910 0
-	add	x1, x1, :lo12:.LC82
-	ldr	x0, [x28, 88]
-	b	.L747
-.L756:
-	.loc 1 805 0
+.LVL787:
+	b	.L625
+.LVL788:
+.L774:
+.LBE1713:
+.LBE1720:
+	.loc 1 938 0 is_stmt 1
 	mov	x0, x20
-	bl	ebc_power_set.constprop.7
-.LVL783:
-	b	.L606
-.LVL784:
-.L781:
-	.loc 1 891 0
-	ldrsw	x2, [x28, 20]
-	ldp	x1, x0, [x28, 136]
+	bl	ebc_power_set.constprop.8
+.LVL789:
+	b	.L612
+.L798:
+	.loc 1 1020 0
+	ldr	x1, [x0, 16]
+	ldrsw	x2, [x24, 20]
+	ldr	x0, [x24, 128]
 	bl	memcpy
-.LVL785:
-	b	.L634
-.LVL786:
-.L786:
-.LBB1748:
-.LBB1749:
+.LVL790:
+	.loc 1 1021 0
+	ldr	x0, [x24, 200]
+	ldrsw	x2, [x24, 20]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x24, 136]
+	bl	memcpy
+.LVL791:
+	.loc 1 1022 0
+	ldr	x0, [x24, 200]
+	ldrsw	x2, [x24, 20]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x24, 144]
+	bl	memcpy
+.LVL792:
+	ldr	x0, [x24, 208]
+	b	.L640
+.LVL793:
+.L804:
+.LBB1721:
+.LBB1722:
 	mov	x0, x20
-	bl	ebc_power_set.part.3
-.LVL787:
-	b	.L649
-.L763:
-.LBE1749:
-.LBE1748:
-.LBB1750:
-.LBB1751:
+	bl	ebc_power_set.part.4
+.LVL794:
+	b	.L662
+.LVL795:
+.L781:
+.LBE1722:
+.LBE1721:
+.LBB1723:
+.LBB1724:
 	mov	x0, x20
-	bl	ebc_power_set.part.3
-.LVL788:
-	b	.L614
-.L757:
-.LBE1751:
-.LBE1750:
-	.loc 1 1104 0
+	bl	ebc_power_set.part.4
+.LVL796:
+	b	.L620
+.L775:
+.LBE1724:
+.LBE1723:
+	.loc 1 1237 0
 	bl	__stack_chk_fail
-.LVL789:
+.LVL797:
 	.cfi_endproc
 .LFE2819:
 	.size	ebc_thread, .-ebc_thread
@@ -8447,6 +8669,16 @@ dev_attr_ebc_state:
 	.zero	6
 	.xword	ebc_state_read
 	.xword	0
+	.type	auto_buf_sema, %object
+	.size	auto_buf_sema, 48
+auto_buf_sema:
+	.xword	0
+	.xword	auto_buf_sema+8
+	.xword	auto_buf_sema+8
+	.word	0
+	.word	0
+	.xword	0
+	.zero	8
 	.bss
 	.align	3
 	.set	.LANCHOR0,. + 0
@@ -8461,24 +8693,24 @@ ebc_auto_task:
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.34846, %object
-	.size	__func__.34846, 11
-__func__.34846:
+	.type	__func__.34848, %object
+	.size	__func__.34848, 11
+__func__.34848:
 	.string	"ebc_io_ctl"
 	.align	3
 	.set	.LANCHOR3,. + 0
-	.type	__func__.34647, %object
-	.size	__func__.34647, 16
-__func__.34647:
+	.type	__func__.34649, %object
+	.size	__func__.34649, 16
+__func__.34649:
 	.string	"ebc_frame_start"
-	.type	__func__.35054, %object
-	.size	__func__.35054, 19
-__func__.35054:
+	.type	__func__.35056, %object
+	.size	__func__.35056, 19
+__func__.35056:
 	.string	"ebc_lut_table_init"
 	.zero	5
-	.type	__func__.35113, %object
-	.size	__func__.35113, 12
-__func__.35113:
+	.type	__func__.35115, %object
+	.size	__func__.35115, 12
+__func__.35115:
 	.string	"ebc_suspend"
 	.zero	4
 	.type	ebc_match, %object
@@ -8509,9 +8741,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init1974, %object
-	.size	__addressable_ebc_init1974, 8
-__addressable_ebc_init1974:
+	.type	__addressable_ebc_init2107, %object
+	.size	__addressable_ebc_init2107, 8
+__addressable_ebc_init2107:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -8566,7 +8798,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC15:
-	.string	"1.14"
+	.string	"2.00"
 	.zero	3
 .LC16:
 	.string	"%s\n"
@@ -8999,16 +9231,16 @@ __exitcall_ebc_exit:
 	.file 212 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x13ea6
+	.4byte	0x13db5
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF3272
+	.4byte	.LASF3277
 	.byte	0x1
-	.4byte	.LASF3273
-	.4byte	.LASF3274
-	.4byte	.Ldebug_ranges0+0x10a0
+	.4byte	.LASF3278
+	.4byte	.LASF3279
+	.4byte	.Ldebug_ranges0+0x1030
 	.8byte	0
 	.4byte	.Ldebug_line0
 	.uleb128 0x2
@@ -36233,10 +36465,10 @@ __exitcall_ebc_exit:
 	.4byte	0xe1ba
 	.uleb128 0x26
 	.4byte	.LASF2954
-	.2byte	0x270
+	.2byte	0x268
 	.byte	0x1
 	.byte	0x33
-	.4byte	0xe3f8
+	.4byte	0xe3ec
 	.uleb128 0xe
 	.4byte	.LASF2955
 	.byte	0x1
@@ -36384,127 +36616,121 @@ __exitcall_ebc_exit:
 	.uleb128 0xe
 	.4byte	.LASF2976
 	.byte	0x1
-	.byte	0x4d
-	.4byte	0x4653
+	.byte	0x4e
+	.4byte	0xc097
 	.byte	0x98
 	.uleb128 0xe
 	.4byte	.LASF2977
 	.byte	0x1
-	.byte	0x4e
+	.byte	0x4f
 	.4byte	0xc097
 	.byte	0xa0
 	.uleb128 0xe
 	.4byte	.LASF2978
 	.byte	0x1
-	.byte	0x4f
-	.4byte	0xc097
+	.byte	0x50
+	.4byte	0xe3ec
 	.byte	0xa8
 	.uleb128 0xe
 	.4byte	.LASF2979
 	.byte	0x1
-	.byte	0x50
-	.4byte	0xe3f8
-	.byte	0xb0
-	.uleb128 0xe
-	.4byte	.LASF2980
-	.byte	0x1
 	.byte	0x51
 	.4byte	0xc6
-	.byte	0xc0
+	.byte	0xb8
 	.uleb128 0xe
-	.4byte	.LASF2981
+	.4byte	.LASF2980
 	.byte	0x1
 	.byte	0x52
 	.4byte	0xc6
-	.byte	0xc4
+	.byte	0xbc
 	.uleb128 0xe
-	.4byte	.LASF2982
+	.4byte	.LASF2981
 	.byte	0x1
 	.byte	0x53
 	.4byte	0x219
-	.byte	0xc8
+	.byte	0xc0
 	.uleb128 0xe
-	.4byte	.LASF2983
+	.4byte	.LASF2982
 	.byte	0x1
 	.byte	0x54
-	.4byte	0xe408
-	.byte	0xd0
+	.4byte	0xe3fc
+	.byte	0xc8
 	.uleb128 0xe
-	.4byte	.LASF2984
+	.4byte	.LASF2983
 	.byte	0x1
 	.byte	0x55
-	.4byte	0xe408
-	.byte	0xd8
+	.4byte	0xe3fc
+	.byte	0xd0
 	.uleb128 0xe
-	.4byte	.LASF2985
+	.4byte	.LASF2984
 	.byte	0x1
 	.byte	0x57
 	.4byte	0xd7d1
-	.byte	0xe0
+	.byte	0xd8
 	.uleb128 0x27
-	.4byte	.LASF2986
+	.4byte	.LASF2985
 	.byte	0x1
 	.byte	0x58
 	.4byte	0xc6
-	.2byte	0x1b0
+	.2byte	0x1a8
 	.uleb128 0x27
-	.4byte	.LASF2987
+	.4byte	.LASF2986
 	.byte	0x1
 	.byte	0x5a
 	.4byte	0xc6
-	.2byte	0x1b4
+	.2byte	0x1ac
 	.uleb128 0x27
-	.4byte	.LASF2988
+	.4byte	.LASF2987
 	.byte	0x1
 	.byte	0x5c
 	.4byte	0x3147
-	.2byte	0x1b8
+	.2byte	0x1b0
 	.uleb128 0x27
-	.4byte	.LASF2989
+	.4byte	.LASF2988
 	.byte	0x1
 	.byte	0x5f
 	.4byte	0x3147
-	.2byte	0x1f0
+	.2byte	0x1e8
 	.uleb128 0x27
-	.4byte	.LASF2990
+	.4byte	.LASF2989
 	.byte	0x1
 	.byte	0x62
 	.4byte	0x31e0
-	.2byte	0x228
+	.2byte	0x220
 	.uleb128 0x27
-	.4byte	.LASF2991
+	.4byte	.LASF2990
 	.byte	0x1
 	.byte	0x65
 	.4byte	0xc6
-	.2byte	0x258
+	.2byte	0x250
 	.uleb128 0x27
-	.4byte	.LASF2992
+	.4byte	.LASF2991
 	.byte	0x1
 	.byte	0x67
 	.4byte	0xc6
-	.2byte	0x25c
+	.2byte	0x254
 	.uleb128 0x27
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
 	.byte	0x69
 	.4byte	0xc6
-	.2byte	0x260
+	.2byte	0x258
 	.uleb128 0x27
-	.4byte	.LASF2994
+	.4byte	.LASF2993
 	.byte	0x1
 	.byte	0x6b
 	.4byte	0xc6
-	.2byte	0x264
+	.2byte	0x25c
 	.uleb128 0x27
-	.4byte	.LASF2995
+	.4byte	.LASF2994
 	.byte	0x1
 	.byte	0x6c
 	.4byte	0xc6
-	.2byte	0x268
+	.2byte	0x260
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x443
-	.4byte	0xe408
+	.4byte	0xe3fc
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
@@ -36514,10 +36740,10 @@ __exitcall_ebc_exit:
 	.4byte	0xd8bb
 	.uleb128 0x4a
 	.string	"ebc"
-	.2byte	0x328
+	.2byte	0x320
 	.byte	0x1
 	.byte	0x6f
-	.4byte	0xe458
+	.4byte	0xe44c
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x1
@@ -36537,7 +36763,7 @@ __exitcall_ebc_exit:
 	.4byte	0xdae3
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2996
+	.4byte	.LASF2995
 	.byte	0x1
 	.byte	0x73
 	.4byte	0xdede
@@ -36550,18 +36776,18 @@ __exitcall_ebc_exit:
 	.byte	0xb8
 	.byte	0
 	.uleb128 0x4b
-	.4byte	.LASF2997
+	.4byte	.LASF2996
 	.byte	0x1
 	.byte	0x77
-	.4byte	0xe46d
+	.4byte	0xe461
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	global_ebc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe40e
+	.4byte	0xe402
 	.uleb128 0x4b
-	.4byte	.LASF2998
+	.4byte	.LASF2997
 	.byte	0x1
 	.byte	0x78
 	.4byte	0x2eda
@@ -36569,6 +36795,14 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_auto_task
 	.uleb128 0x4b
+	.4byte	.LASF2998
+	.byte	0x1
+	.byte	0x79
+	.4byte	0x4e0b
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	auto_buf_sema
+	.uleb128 0x4b
 	.4byte	.LASF2999
 	.byte	0x1
 	.byte	0x7b
@@ -36603,7 +36837,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3003
 	.byte	0x1
-	.2byte	0x596
+	.2byte	0x61b
 	.4byte	0x7b4
 	.uleb128 0x9
 	.byte	0x3
@@ -36611,7 +36845,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x5a0
+	.2byte	0x625
 	.4byte	0xc5df
 	.uleb128 0x9
 	.byte	0x3
@@ -36619,7 +36853,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3005
 	.byte	0x1
-	.2byte	0x5af
+	.2byte	0x634
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36627,7 +36861,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3006
 	.byte	0x1
-	.2byte	0x5ba
+	.2byte	0x63f
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36635,7 +36869,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3007
 	.byte	0x1
-	.2byte	0x5c8
+	.2byte	0x64d
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36643,7 +36877,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3008
 	.byte	0x1
-	.2byte	0x5eb
+	.2byte	0x670
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36651,7 +36885,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3009
 	.byte	0x1
-	.2byte	0x5f5
+	.2byte	0x67a
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36659,7 +36893,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3010
 	.byte	0x1
-	.2byte	0x5fe
+	.2byte	0x683
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36667,32 +36901,32 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3011
 	.byte	0x1
-	.2byte	0x797
+	.2byte	0x81c
 	.4byte	0xa531
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_pm
 	.uleb128 0x5
 	.4byte	0xb170
-	.4byte	0xe5b2
+	.4byte	0xe5bb
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe5a2
+	.4byte	0xe5ab
 	.uleb128 0x4c
 	.4byte	.LASF3012
 	.byte	0x1
-	.2byte	0x79c
-	.4byte	0xe5b2
+	.2byte	0x821
+	.4byte	0xe5bb
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_match
 	.uleb128 0x4c
 	.4byte	.LASF3013
 	.byte	0x1
-	.2byte	0x7a2
+	.2byte	0x827
 	.4byte	0xd66d
 	.uleb128 0x9
 	.byte	0x3
@@ -36700,15 +36934,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3014
 	.byte	0x1
-	.2byte	0x7b6
+	.2byte	0x83b
 	.4byte	0x443
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init1974
+	.8byte	__addressable_ebc_init2107
 	.uleb128 0x4c
 	.4byte	.LASF3015
 	.byte	0x1
-	.2byte	0x7b7
+	.2byte	0x83c
 	.4byte	0x497
 	.uleb128 0x9
 	.byte	0x3
@@ -36716,79 +36950,79 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x7b1
+	.2byte	0x836
 	.8byte	.LFB2845
 	.8byte	.LFE2845-.LFB2845
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe63b
+	.4byte	0xe644
 	.uleb128 0x4e
-	.8byte	.LVL32
-	.4byte	0x13bc2
+	.8byte	.LVL34
+	.4byte	0x13ab9
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3016
 	.byte	0x1
-	.2byte	0x7ac
+	.2byte	0x831
 	.4byte	0xc6
 	.8byte	.LFB2844
 	.8byte	.LFE2844-.LFB2844
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe66b
+	.4byte	0xe674
 	.uleb128 0x4e
-	.8byte	.LVL316
-	.4byte	0x13bce
+	.8byte	.LVL318
+	.4byte	0x13ac5
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3017
 	.byte	0x1
-	.2byte	0x78b
+	.2byte	0x810
 	.4byte	0xc6
 	.8byte	.LFB2843
 	.8byte	.LFE2843-.LFB2843
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe707
+	.4byte	0xe710
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x78b
+	.2byte	0x810
 	.4byte	0xa545
-	.4byte	.LLST11
+	.4byte	.LLST7
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x78d
-	.4byte	0xe46d
+	.2byte	0x812
+	.4byte	0xe461
 	.uleb128 0x46
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x78e
-	.4byte	0xe707
+	.2byte	0x813
+	.4byte	0xe710
 	.uleb128 0x53
-	.4byte	0x1325f
-	.8byte	.LBB926
-	.8byte	.LBE926-.LBB926
+	.4byte	0x13156
+	.8byte	.LBB906
+	.8byte	.LBE906-.LBB906
 	.byte	0x1
-	.2byte	0x78d
-	.4byte	0xe6d7
+	.2byte	0x812
+	.4byte	0xe6e0
 	.uleb128 0x54
-	.4byte	0x13270
+	.4byte	0x13167
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e50
-	.8byte	.LBB928
-	.8byte	.LBE928-.LBB928
+	.4byte	0x12d47
+	.8byte	.LBB908
+	.8byte	.LBE908-.LBB908
 	.byte	0x1
-	.2byte	0x790
-	.4byte	0xe6f9
+	.2byte	0x815
+	.4byte	0xe702
 	.uleb128 0x54
-	.4byte	0x12e5c
+	.4byte	0x12d53
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL36
-	.4byte	0x13bda
+	.8byte	.LVL38
+	.4byte	0x13ad1
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -36796,2226 +37030,2208 @@ __exitcall_ebc_exit:
 	.uleb128 0x50
 	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x77a
+	.2byte	0x7ff
 	.4byte	0xc6
 	.8byte	.LFB2842
 	.8byte	.LFE2842-.LFB2842
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe7d6
+	.4byte	0xe7df
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x77a
+	.2byte	0x7ff
 	.4byte	0xa545
-	.4byte	.LLST146
+	.4byte	.LLST141
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x77c
-	.4byte	0xe46d
+	.2byte	0x801
+	.4byte	0xe461
 	.uleb128 0x46
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x77d
-	.4byte	0xe707
+	.2byte	0x802
+	.4byte	0xe710
 	.uleb128 0x55
 	.4byte	.LASF3020
-	.4byte	0xe7e6
+	.4byte	0xe7ef
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35113
+	.8byte	__func__.35115
 	.uleb128 0x53
-	.4byte	0x1325f
-	.8byte	.LBB1679
-	.8byte	.LBE1679-.LBB1679
+	.4byte	0x13156
+	.8byte	.LBB1653
+	.8byte	.LBE1653-.LBB1653
 	.byte	0x1
-	.2byte	0x77c
-	.4byte	0xe78c
+	.2byte	0x801
+	.4byte	0xe795
 	.uleb128 0x54
-	.4byte	0x13270
+	.4byte	0x13167
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e68
-	.8byte	.LBB1681
-	.8byte	.LBE1681-.LBB1681
+	.4byte	0x12d5f
+	.8byte	.LBB1655
+	.8byte	.LBE1655-.LBB1655
 	.byte	0x1
-	.2byte	0x785
-	.4byte	0xe7ae
+	.2byte	0x80a
+	.4byte	0xe7b7
 	.uleb128 0x54
-	.4byte	0x12e74
+	.4byte	0x12d6b
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL630
-	.4byte	0x13bda
+	.4byte	0x13ad1
 	.uleb128 0x4e
 	.8byte	.LVL631
-	.4byte	0x13bda
+	.4byte	0x13ad1
 	.uleb128 0x4e
 	.8byte	.LVL632
-	.4byte	0x13aff
+	.4byte	0x139f6
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xe7e6
+	.4byte	0xe7ef
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xb
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe7d6
+	.4byte	0xe7df
 	.uleb128 0x4f
 	.4byte	.LASF3021
 	.byte	0x1
-	.2byte	0x773
+	.2byte	0x7f8
 	.4byte	0xc6
 	.8byte	.LFB2841
 	.8byte	.LFE2841-.LFB2841
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe82b
+	.4byte	0xe834
 	.uleb128 0x56
 	.4byte	.LASF3022
 	.byte	0x1
-	.2byte	0x773
+	.2byte	0x7f8
 	.4byte	0xd6e9
-	.4byte	.LLST13
+	.4byte	.LLST9
 	.uleb128 0x4e
-	.8byte	.LVL42
-	.4byte	0x13be7
+	.8byte	.LVL44
+	.4byte	0x13ade
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3023
 	.byte	0x1
-	.2byte	0x707
+	.2byte	0x78c
 	.4byte	0xc6
 	.8byte	.LFB2840
 	.8byte	.LFE2840-.LFB2840
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfc51
+	.4byte	0xfc21
 	.uleb128 0x56
 	.4byte	.LASF3022
 	.byte	0x1
-	.2byte	0x707
+	.2byte	0x78c
 	.4byte	0xd6e9
-	.4byte	.LLST122
+	.4byte	.LLST118
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x709
+	.2byte	0x78e
 	.4byte	0xa545
 	.uleb128 0x46
 	.4byte	.LASF3024
 	.byte	0x1
-	.2byte	0x70a
+	.2byte	0x78f
 	.4byte	0xb869
 	.uleb128 0x57
 	.4byte	.LASF3025
 	.byte	0x1
-	.2byte	0x70b
+	.2byte	0x790
 	.4byte	0xd6e9
-	.4byte	.LLST123
+	.4byte	.LLST119
 	.uleb128 0x46
 	.4byte	.LASF3026
 	.byte	0x1
-	.2byte	0x70c
+	.2byte	0x791
 	.4byte	0xb869
 	.uleb128 0x57
 	.4byte	.LASF3027
 	.byte	0x1
-	.2byte	0x70d
+	.2byte	0x792
 	.4byte	0xc012
-	.4byte	.LLST124
+	.4byte	.LLST120
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x70e
-	.4byte	0xe46d
+	.2byte	0x793
+	.4byte	0xe461
 	.uleb128 0x57
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x70f
-	.4byte	0xe707
-	.4byte	.LLST125
+	.2byte	0x794
+	.4byte	0xe710
+	.4byte	.LLST121
 	.uleb128 0x46
-	.4byte	.LASF2996
+	.4byte	.LASF2995
 	.byte	0x1
-	.2byte	0x710
+	.2byte	0x795
 	.4byte	0xe123
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x711
+	.2byte	0x796
 	.4byte	0xc6
 	.uleb128 0x58
-	.4byte	0x1327d
-	.8byte	.LBB1460
-	.4byte	.Ldebug_ranges0+0xa10
+	.4byte	0x13174
+	.8byte	.LBB1438
+	.4byte	.Ldebug_ranges0+0x9e0
 	.byte	0x1
-	.2byte	0x713
-	.4byte	0xe90a
+	.2byte	0x798
+	.4byte	0xe913
 	.uleb128 0x54
-	.4byte	0x132a6
+	.4byte	0x1319d
 	.uleb128 0x54
-	.4byte	0x1329a
+	.4byte	0x13191
 	.uleb128 0x54
-	.4byte	0x1328e
+	.4byte	0x13185
 	.uleb128 0x4e
-	.8byte	.LVL443
-	.4byte	0x13bf3
+	.8byte	.LVL445
+	.4byte	0x13aea
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1315a
-	.8byte	.LBB1464
-	.8byte	.LBE1464-.LBB1464
+	.4byte	0x13051
+	.8byte	.LBB1442
+	.8byte	.LBE1442-.LBB1442
 	.byte	0x1
-	.2byte	0x725
-	.4byte	0xe949
+	.2byte	0x7aa
+	.4byte	0xe952
 	.uleb128 0x54
-	.4byte	0x1316a
+	.4byte	0x13061
 	.uleb128 0x59
-	.4byte	0x1325f
-	.8byte	.LBB1465
-	.8byte	.LBE1465-.LBB1465
+	.4byte	0x13156
+	.8byte	.LBB1443
+	.8byte	.LBE1443-.LBB1443
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x54
-	.4byte	0x13270
+	.4byte	0x13167
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1317c
-	.8byte	.LBB1467
-	.8byte	.LBE1467-.LBB1467
+	.4byte	0x13073
+	.8byte	.LBB1445
+	.8byte	.LBE1445-.LBB1445
 	.byte	0x1
-	.2byte	0x736
-	.4byte	0xe989
+	.2byte	0x7bb
+	.4byte	0xe992
 	.uleb128 0x54
-	.4byte	0x1318d
+	.4byte	0x13084
 	.uleb128 0x5a
-	.4byte	0x1325f
-	.8byte	.LBB1468
-	.8byte	.LBE1468-.LBB1468
+	.4byte	0x13156
+	.8byte	.LBB1446
+	.8byte	.LBE1446-.LBB1446
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x54
-	.4byte	0x13270
+	.4byte	0x13167
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x11582
-	.8byte	.LBB1470
-	.4byte	.Ldebug_ranges0+0xa40
+	.4byte	0x11552
+	.8byte	.LBB1448
+	.4byte	.Ldebug_ranges0+0xa10
 	.byte	0x1
-	.2byte	0x744
-	.4byte	0xf342
+	.2byte	0x7c9
+	.4byte	0xf34b
 	.uleb128 0x54
-	.4byte	0x11593
+	.4byte	0x11563
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xa40
+	.4byte	.Ldebug_ranges0+0xa10
 	.uleb128 0x5c
-	.4byte	0x1159f
+	.4byte	0x1156f
 	.uleb128 0x58
-	.4byte	0x131a0
-	.8byte	.LBB1472
-	.4byte	.Ldebug_ranges0+0xaa0
+	.4byte	0x13097
+	.8byte	.LBB1450
+	.4byte	.Ldebug_ranges0+0xa70
 	.byte	0x1
-	.2byte	0x478
-	.4byte	0xea19
+	.2byte	0x4fd
+	.4byte	0xea22
 	.uleb128 0x54
-	.4byte	0x131c8
+	.4byte	0x130bf
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x130b3
 	.uleb128 0x54
-	.4byte	0x131b1
+	.4byte	0x130a8
 	.uleb128 0x5d
-	.4byte	0x131d5
-	.8byte	.LBB1473
-	.4byte	.Ldebug_ranges0+0xaa0
+	.4byte	0x130cc
+	.8byte	.LBB1451
+	.4byte	.Ldebug_ranges0+0xa70
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13209
+	.4byte	0x13100
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x130f4
 	.uleb128 0x54
-	.4byte	0x131f1
+	.4byte	0x130e8
 	.uleb128 0x54
-	.4byte	0x131e6
+	.4byte	0x130dd
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xaa0
+	.4byte	.Ldebug_ranges0+0xa70
 	.uleb128 0x5c
-	.4byte	0x13214
+	.4byte	0x1310b
 	.uleb128 0x4e
-	.8byte	.LVL451
-	.4byte	0x13c00
+	.8byte	.LVL453
+	.4byte	0x13af7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131a0
-	.8byte	.LBB1484
-	.8byte	.LBE1484-.LBB1484
+	.4byte	0x13097
+	.8byte	.LBB1462
+	.8byte	.LBE1462-.LBB1462
 	.byte	0x1
-	.2byte	0x47b
-	.4byte	0xea96
+	.2byte	0x500
+	.4byte	0xea9f
 	.uleb128 0x54
-	.4byte	0x131c8
+	.4byte	0x130bf
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x130b3
 	.uleb128 0x54
-	.4byte	0x131b1
+	.4byte	0x130a8
 	.uleb128 0x5a
-	.4byte	0x131d5
-	.8byte	.LBB1485
-	.8byte	.LBE1485-.LBB1485
+	.4byte	0x130cc
+	.8byte	.LBB1463
+	.8byte	.LBE1463-.LBB1463
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13209
+	.4byte	0x13100
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x130f4
 	.uleb128 0x54
-	.4byte	0x131f1
+	.4byte	0x130e8
 	.uleb128 0x54
-	.4byte	0x131e6
+	.4byte	0x130dd
 	.uleb128 0x5e
-	.8byte	.LBB1486
-	.8byte	.LBE1486-.LBB1486
+	.8byte	.LBB1464
+	.8byte	.LBE1464-.LBB1464
 	.uleb128 0x5c
-	.4byte	0x13214
+	.4byte	0x1310b
 	.uleb128 0x4e
-	.8byte	.LVL452
-	.4byte	0x13c00
+	.8byte	.LVL454
+	.4byte	0x13af7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131a0
-	.8byte	.LBB1487
-	.8byte	.LBE1487-.LBB1487
+	.4byte	0x13097
+	.8byte	.LBB1465
+	.8byte	.LBE1465-.LBB1465
 	.byte	0x1
-	.2byte	0x47e
-	.4byte	0xeb13
+	.2byte	0x503
+	.4byte	0xeb1c
 	.uleb128 0x54
-	.4byte	0x131c8
+	.4byte	0x130bf
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x130b3
 	.uleb128 0x54
-	.4byte	0x131b1
+	.4byte	0x130a8
 	.uleb128 0x5a
-	.4byte	0x131d5
-	.8byte	.LBB1488
-	.8byte	.LBE1488-.LBB1488
+	.4byte	0x130cc
+	.8byte	.LBB1466
+	.8byte	.LBE1466-.LBB1466
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13209
+	.4byte	0x13100
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x130f4
 	.uleb128 0x54
-	.4byte	0x131f1
+	.4byte	0x130e8
 	.uleb128 0x54
-	.4byte	0x131e6
+	.4byte	0x130dd
 	.uleb128 0x5e
-	.8byte	.LBB1489
-	.8byte	.LBE1489-.LBB1489
+	.8byte	.LBB1467
+	.8byte	.LBE1467-.LBB1467
 	.uleb128 0x5c
-	.4byte	0x13214
+	.4byte	0x1310b
 	.uleb128 0x4e
-	.8byte	.LVL453
-	.4byte	0x13c00
+	.8byte	.LVL455
+	.4byte	0x13af7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131a0
-	.8byte	.LBB1490
-	.8byte	.LBE1490-.LBB1490
+	.4byte	0x13097
+	.8byte	.LBB1468
+	.8byte	.LBE1468-.LBB1468
 	.byte	0x1
-	.2byte	0x481
-	.4byte	0xeb90
+	.2byte	0x506
+	.4byte	0xeb99
 	.uleb128 0x54
-	.4byte	0x131c8
+	.4byte	0x130bf
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x130b3
 	.uleb128 0x54
-	.4byte	0x131b1
+	.4byte	0x130a8
 	.uleb128 0x5a
-	.4byte	0x131d5
-	.8byte	.LBB1491
-	.8byte	.LBE1491-.LBB1491
+	.4byte	0x130cc
+	.8byte	.LBB1469
+	.8byte	.LBE1469-.LBB1469
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13209
+	.4byte	0x13100
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x130f4
 	.uleb128 0x54
-	.4byte	0x131f1
+	.4byte	0x130e8
 	.uleb128 0x54
-	.4byte	0x131e6
+	.4byte	0x130dd
 	.uleb128 0x5e
-	.8byte	.LBB1492
-	.8byte	.LBE1492-.LBB1492
+	.8byte	.LBB1470
+	.8byte	.LBE1470-.LBB1470
 	.uleb128 0x5c
-	.4byte	0x13214
+	.4byte	0x1310b
 	.uleb128 0x4e
-	.8byte	.LVL454
-	.4byte	0x13c00
+	.8byte	.LVL456
+	.4byte	0x13af7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131a0
-	.8byte	.LBB1493
-	.8byte	.LBE1493-.LBB1493
+	.4byte	0x13097
+	.8byte	.LBB1471
+	.8byte	.LBE1471-.LBB1471
 	.byte	0x1
-	.2byte	0x484
-	.4byte	0xec0d
+	.2byte	0x509
+	.4byte	0xec16
 	.uleb128 0x54
-	.4byte	0x131c8
+	.4byte	0x130bf
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x130b3
 	.uleb128 0x54
-	.4byte	0x131b1
+	.4byte	0x130a8
 	.uleb128 0x5a
-	.4byte	0x131d5
-	.8byte	.LBB1494
-	.8byte	.LBE1494-.LBB1494
+	.4byte	0x130cc
+	.8byte	.LBB1472
+	.8byte	.LBE1472-.LBB1472
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13209
+	.4byte	0x13100
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x130f4
 	.uleb128 0x54
-	.4byte	0x131f1
+	.4byte	0x130e8
 	.uleb128 0x54
-	.4byte	0x131e6
+	.4byte	0x130dd
 	.uleb128 0x5e
-	.8byte	.LBB1495
-	.8byte	.LBE1495-.LBB1495
+	.8byte	.LBB1473
+	.8byte	.LBE1473-.LBB1473
 	.uleb128 0x5c
-	.4byte	0x13214
+	.4byte	0x1310b
 	.uleb128 0x4e
-	.8byte	.LVL455
-	.4byte	0x13c00
+	.8byte	.LVL457
+	.4byte	0x13af7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131a0
-	.8byte	.LBB1496
-	.8byte	.LBE1496-.LBB1496
+	.4byte	0x13097
+	.8byte	.LBB1474
+	.8byte	.LBE1474-.LBB1474
 	.byte	0x1
-	.2byte	0x487
-	.4byte	0xec8a
+	.2byte	0x50c
+	.4byte	0xec93
 	.uleb128 0x54
-	.4byte	0x131c8
+	.4byte	0x130bf
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x130b3
 	.uleb128 0x54
-	.4byte	0x131b1
+	.4byte	0x130a8
 	.uleb128 0x5a
-	.4byte	0x131d5
-	.8byte	.LBB1497
-	.8byte	.LBE1497-.LBB1497
+	.4byte	0x130cc
+	.8byte	.LBB1475
+	.8byte	.LBE1475-.LBB1475
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13209
+	.4byte	0x13100
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x130f4
 	.uleb128 0x54
-	.4byte	0x131f1
+	.4byte	0x130e8
 	.uleb128 0x54
-	.4byte	0x131e6
+	.4byte	0x130dd
 	.uleb128 0x5e
-	.8byte	.LBB1498
-	.8byte	.LBE1498-.LBB1498
+	.8byte	.LBB1476
+	.8byte	.LBE1476-.LBB1476
 	.uleb128 0x5c
-	.4byte	0x13214
+	.4byte	0x1310b
 	.uleb128 0x4e
-	.8byte	.LVL456
-	.4byte	0x13c00
+	.8byte	.LVL458
+	.4byte	0x13af7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131a0
-	.8byte	.LBB1499
-	.8byte	.LBE1499-.LBB1499
+	.4byte	0x13097
+	.8byte	.LBB1477
+	.8byte	.LBE1477-.LBB1477
 	.byte	0x1
-	.2byte	0x48a
-	.4byte	0xed07
+	.2byte	0x50f
+	.4byte	0xed10
 	.uleb128 0x54
-	.4byte	0x131c8
+	.4byte	0x130bf
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x130b3
 	.uleb128 0x54
-	.4byte	0x131b1
+	.4byte	0x130a8
 	.uleb128 0x5a
-	.4byte	0x131d5
-	.8byte	.LBB1500
-	.8byte	.LBE1500-.LBB1500
+	.4byte	0x130cc
+	.8byte	.LBB1478
+	.8byte	.LBE1478-.LBB1478
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13209
+	.4byte	0x13100
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x130f4
 	.uleb128 0x54
-	.4byte	0x131f1
+	.4byte	0x130e8
 	.uleb128 0x54
-	.4byte	0x131e6
+	.4byte	0x130dd
 	.uleb128 0x5e
-	.8byte	.LBB1501
-	.8byte	.LBE1501-.LBB1501
+	.8byte	.LBB1479
+	.8byte	.LBE1479-.LBB1479
 	.uleb128 0x5c
-	.4byte	0x13214
+	.4byte	0x1310b
 	.uleb128 0x4e
-	.8byte	.LVL457
-	.4byte	0x13c00
+	.8byte	.LVL459
+	.4byte	0x13af7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131a0
-	.8byte	.LBB1502
-	.8byte	.LBE1502-.LBB1502
+	.4byte	0x13097
+	.8byte	.LBB1480
+	.8byte	.LBE1480-.LBB1480
 	.byte	0x1
-	.2byte	0x48d
-	.4byte	0xed84
+	.2byte	0x512
+	.4byte	0xed8d
 	.uleb128 0x54
-	.4byte	0x131c8
+	.4byte	0x130bf
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x130b3
 	.uleb128 0x54
-	.4byte	0x131b1
+	.4byte	0x130a8
 	.uleb128 0x5a
-	.4byte	0x131d5
-	.8byte	.LBB1503
-	.8byte	.LBE1503-.LBB1503
+	.4byte	0x130cc
+	.8byte	.LBB1481
+	.8byte	.LBE1481-.LBB1481
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13209
+	.4byte	0x13100
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x130f4
 	.uleb128 0x54
-	.4byte	0x131f1
+	.4byte	0x130e8
 	.uleb128 0x54
-	.4byte	0x131e6
+	.4byte	0x130dd
 	.uleb128 0x5e
-	.8byte	.LBB1504
-	.8byte	.LBE1504-.LBB1504
+	.8byte	.LBB1482
+	.8byte	.LBE1482-.LBB1482
 	.uleb128 0x5c
-	.4byte	0x13214
+	.4byte	0x1310b
 	.uleb128 0x4e
-	.8byte	.LVL458
-	.4byte	0x13c00
+	.8byte	.LVL460
+	.4byte	0x13af7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131a0
-	.8byte	.LBB1505
-	.8byte	.LBE1505-.LBB1505
+	.4byte	0x13097
+	.8byte	.LBB1483
+	.8byte	.LBE1483-.LBB1483
 	.byte	0x1
-	.2byte	0x490
-	.4byte	0xee01
+	.2byte	0x515
+	.4byte	0xee0a
 	.uleb128 0x54
-	.4byte	0x131c8
+	.4byte	0x130bf
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x130b3
 	.uleb128 0x54
-	.4byte	0x131b1
+	.4byte	0x130a8
 	.uleb128 0x5a
-	.4byte	0x131d5
-	.8byte	.LBB1506
-	.8byte	.LBE1506-.LBB1506
+	.4byte	0x130cc
+	.8byte	.LBB1484
+	.8byte	.LBE1484-.LBB1484
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13209
+	.4byte	0x13100
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x130f4
 	.uleb128 0x54
-	.4byte	0x131f1
+	.4byte	0x130e8
 	.uleb128 0x54
-	.4byte	0x131e6
+	.4byte	0x130dd
 	.uleb128 0x5e
-	.8byte	.LBB1507
-	.8byte	.LBE1507-.LBB1507
+	.8byte	.LBB1485
+	.8byte	.LBE1485-.LBB1485
 	.uleb128 0x5c
-	.4byte	0x13214
+	.4byte	0x1310b
 	.uleb128 0x4e
-	.8byte	.LVL459
-	.4byte	0x13c00
+	.8byte	.LVL461
+	.4byte	0x13af7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131a0
-	.8byte	.LBB1508
-	.8byte	.LBE1508-.LBB1508
+	.4byte	0x13097
+	.8byte	.LBB1486
+	.8byte	.LBE1486-.LBB1486
 	.byte	0x1
-	.2byte	0x493
-	.4byte	0xee7e
+	.2byte	0x518
+	.4byte	0xee87
 	.uleb128 0x54
-	.4byte	0x131c8
+	.4byte	0x130bf
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x130b3
 	.uleb128 0x54
-	.4byte	0x131b1
+	.4byte	0x130a8
 	.uleb128 0x5a
-	.4byte	0x131d5
-	.8byte	.LBB1509
-	.8byte	.LBE1509-.LBB1509
+	.4byte	0x130cc
+	.8byte	.LBB1487
+	.8byte	.LBE1487-.LBB1487
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13209
+	.4byte	0x13100
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x130f4
 	.uleb128 0x54
-	.4byte	0x131f1
+	.4byte	0x130e8
 	.uleb128 0x54
-	.4byte	0x131e6
+	.4byte	0x130dd
 	.uleb128 0x5e
-	.8byte	.LBB1510
-	.8byte	.LBE1510-.LBB1510
+	.8byte	.LBB1488
+	.8byte	.LBE1488-.LBB1488
 	.uleb128 0x5c
-	.4byte	0x13214
+	.4byte	0x1310b
 	.uleb128 0x4e
-	.8byte	.LVL460
-	.4byte	0x13c00
+	.8byte	.LVL462
+	.4byte	0x13af7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131a0
-	.8byte	.LBB1511
-	.8byte	.LBE1511-.LBB1511
+	.4byte	0x13097
+	.8byte	.LBB1489
+	.8byte	.LBE1489-.LBB1489
 	.byte	0x1
-	.2byte	0x496
-	.4byte	0xeefb
+	.2byte	0x51b
+	.4byte	0xef04
 	.uleb128 0x54
-	.4byte	0x131c8
+	.4byte	0x130bf
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x130b3
 	.uleb128 0x54
-	.4byte	0x131b1
+	.4byte	0x130a8
 	.uleb128 0x5a
-	.4byte	0x131d5
-	.8byte	.LBB1512
-	.8byte	.LBE1512-.LBB1512
+	.4byte	0x130cc
+	.8byte	.LBB1490
+	.8byte	.LBE1490-.LBB1490
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13209
+	.4byte	0x13100
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x130f4
 	.uleb128 0x54
-	.4byte	0x131f1
+	.4byte	0x130e8
 	.uleb128 0x54
-	.4byte	0x131e6
+	.4byte	0x130dd
 	.uleb128 0x5e
-	.8byte	.LBB1513
-	.8byte	.LBE1513-.LBB1513
+	.8byte	.LBB1491
+	.8byte	.LBE1491-.LBB1491
 	.uleb128 0x5c
-	.4byte	0x13214
+	.4byte	0x1310b
 	.uleb128 0x4e
-	.8byte	.LVL461
-	.4byte	0x13c00
+	.8byte	.LVL463
+	.4byte	0x13af7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131a0
-	.8byte	.LBB1514
-	.8byte	.LBE1514-.LBB1514
+	.4byte	0x13097
+	.8byte	.LBB1492
+	.8byte	.LBE1492-.LBB1492
 	.byte	0x1
-	.2byte	0x499
-	.4byte	0xef78
+	.2byte	0x51e
+	.4byte	0xef81
 	.uleb128 0x54
-	.4byte	0x131c8
+	.4byte	0x130bf
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x130b3
 	.uleb128 0x54
-	.4byte	0x131b1
+	.4byte	0x130a8
 	.uleb128 0x5a
-	.4byte	0x131d5
-	.8byte	.LBB1515
-	.8byte	.LBE1515-.LBB1515
+	.4byte	0x130cc
+	.8byte	.LBB1493
+	.8byte	.LBE1493-.LBB1493
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13209
+	.4byte	0x13100
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x130f4
 	.uleb128 0x54
-	.4byte	0x131f1
+	.4byte	0x130e8
 	.uleb128 0x54
-	.4byte	0x131e6
+	.4byte	0x130dd
 	.uleb128 0x5e
-	.8byte	.LBB1516
-	.8byte	.LBE1516-.LBB1516
+	.8byte	.LBB1494
+	.8byte	.LBE1494-.LBB1494
 	.uleb128 0x5c
-	.4byte	0x13214
+	.4byte	0x1310b
 	.uleb128 0x4e
-	.8byte	.LVL462
-	.4byte	0x13c00
+	.8byte	.LVL464
+	.4byte	0x13af7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131a0
-	.8byte	.LBB1517
-	.8byte	.LBE1517-.LBB1517
+	.4byte	0x13097
+	.8byte	.LBB1495
+	.8byte	.LBE1495-.LBB1495
 	.byte	0x1
-	.2byte	0x49c
-	.4byte	0xeff5
+	.2byte	0x521
+	.4byte	0xeffe
 	.uleb128 0x54
-	.4byte	0x131c8
+	.4byte	0x130bf
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x130b3
 	.uleb128 0x54
-	.4byte	0x131b1
+	.4byte	0x130a8
 	.uleb128 0x5a
-	.4byte	0x131d5
-	.8byte	.LBB1518
-	.8byte	.LBE1518-.LBB1518
+	.4byte	0x130cc
+	.8byte	.LBB1496
+	.8byte	.LBE1496-.LBB1496
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13209
+	.4byte	0x13100
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x130f4
 	.uleb128 0x54
-	.4byte	0x131f1
+	.4byte	0x130e8
 	.uleb128 0x54
-	.4byte	0x131e6
+	.4byte	0x130dd
 	.uleb128 0x5e
-	.8byte	.LBB1519
-	.8byte	.LBE1519-.LBB1519
+	.8byte	.LBB1497
+	.8byte	.LBE1497-.LBB1497
 	.uleb128 0x5c
-	.4byte	0x13214
+	.4byte	0x1310b
 	.uleb128 0x4e
-	.8byte	.LVL463
-	.4byte	0x13c00
+	.8byte	.LVL465
+	.4byte	0x13af7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131a0
-	.8byte	.LBB1520
-	.8byte	.LBE1520-.LBB1520
+	.4byte	0x13097
+	.8byte	.LBB1498
+	.8byte	.LBE1498-.LBB1498
 	.byte	0x1
-	.2byte	0x49f
-	.4byte	0xf072
+	.2byte	0x524
+	.4byte	0xf07b
 	.uleb128 0x54
-	.4byte	0x131c8
+	.4byte	0x130bf
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x130b3
 	.uleb128 0x54
-	.4byte	0x131b1
+	.4byte	0x130a8
 	.uleb128 0x5a
-	.4byte	0x131d5
-	.8byte	.LBB1521
-	.8byte	.LBE1521-.LBB1521
+	.4byte	0x130cc
+	.8byte	.LBB1499
+	.8byte	.LBE1499-.LBB1499
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13209
+	.4byte	0x13100
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x130f4
 	.uleb128 0x54
-	.4byte	0x131f1
+	.4byte	0x130e8
 	.uleb128 0x54
-	.4byte	0x131e6
+	.4byte	0x130dd
 	.uleb128 0x5e
-	.8byte	.LBB1522
-	.8byte	.LBE1522-.LBB1522
+	.8byte	.LBB1500
+	.8byte	.LBE1500-.LBB1500
 	.uleb128 0x5c
-	.4byte	0x13214
+	.4byte	0x1310b
 	.uleb128 0x4e
-	.8byte	.LVL464
-	.4byte	0x13c00
+	.8byte	.LVL466
+	.4byte	0x13af7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131a0
-	.8byte	.LBB1523
-	.8byte	.LBE1523-.LBB1523
+	.4byte	0x13097
+	.8byte	.LBB1501
+	.8byte	.LBE1501-.LBB1501
 	.byte	0x1
-	.2byte	0x4a2
-	.4byte	0xf0ef
+	.2byte	0x527
+	.4byte	0xf0f8
 	.uleb128 0x54
-	.4byte	0x131c8
+	.4byte	0x130bf
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x130b3
 	.uleb128 0x54
-	.4byte	0x131b1
+	.4byte	0x130a8
 	.uleb128 0x5a
-	.4byte	0x131d5
-	.8byte	.LBB1524
-	.8byte	.LBE1524-.LBB1524
+	.4byte	0x130cc
+	.8byte	.LBB1502
+	.8byte	.LBE1502-.LBB1502
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13209
+	.4byte	0x13100
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x130f4
 	.uleb128 0x54
-	.4byte	0x131f1
+	.4byte	0x130e8
 	.uleb128 0x54
-	.4byte	0x131e6
+	.4byte	0x130dd
 	.uleb128 0x5e
-	.8byte	.LBB1525
-	.8byte	.LBE1525-.LBB1525
+	.8byte	.LBB1503
+	.8byte	.LBE1503-.LBB1503
 	.uleb128 0x5c
-	.4byte	0x13214
+	.4byte	0x1310b
 	.uleb128 0x4e
-	.8byte	.LVL465
-	.4byte	0x13c00
+	.8byte	.LVL467
+	.4byte	0x13af7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131a0
-	.8byte	.LBB1526
-	.8byte	.LBE1526-.LBB1526
+	.4byte	0x13097
+	.8byte	.LBB1504
+	.8byte	.LBE1504-.LBB1504
 	.byte	0x1
-	.2byte	0x4a5
-	.4byte	0xf16c
+	.2byte	0x52a
+	.4byte	0xf175
 	.uleb128 0x54
-	.4byte	0x131c8
+	.4byte	0x130bf
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x130b3
 	.uleb128 0x54
-	.4byte	0x131b1
+	.4byte	0x130a8
 	.uleb128 0x5a
-	.4byte	0x131d5
-	.8byte	.LBB1527
-	.8byte	.LBE1527-.LBB1527
+	.4byte	0x130cc
+	.8byte	.LBB1505
+	.8byte	.LBE1505-.LBB1505
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13209
+	.4byte	0x13100
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x130f4
 	.uleb128 0x54
-	.4byte	0x131f1
+	.4byte	0x130e8
 	.uleb128 0x54
-	.4byte	0x131e6
+	.4byte	0x130dd
 	.uleb128 0x5e
-	.8byte	.LBB1528
-	.8byte	.LBE1528-.LBB1528
+	.8byte	.LBB1506
+	.8byte	.LBE1506-.LBB1506
 	.uleb128 0x5c
-	.4byte	0x13214
+	.4byte	0x1310b
 	.uleb128 0x4e
-	.8byte	.LVL466
-	.4byte	0x13c00
+	.8byte	.LVL468
+	.4byte	0x13af7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x131a0
-	.8byte	.LBB1529
-	.4byte	.Ldebug_ranges0+0xaf0
+	.4byte	0x13097
+	.8byte	.LBB1507
+	.4byte	.Ldebug_ranges0+0xac0
 	.byte	0x1
-	.2byte	0x4a8
-	.4byte	0xf1e2
+	.2byte	0x52d
+	.4byte	0xf1eb
 	.uleb128 0x54
-	.4byte	0x131c8
+	.4byte	0x130bf
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x130b3
 	.uleb128 0x54
-	.4byte	0x131b1
+	.4byte	0x130a8
 	.uleb128 0x5d
-	.4byte	0x131d5
-	.8byte	.LBB1530
-	.4byte	.Ldebug_ranges0+0xaf0
+	.4byte	0x130cc
+	.8byte	.LBB1508
+	.4byte	.Ldebug_ranges0+0xac0
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13209
+	.4byte	0x13100
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x130f4
 	.uleb128 0x54
-	.4byte	0x131f1
+	.4byte	0x130e8
 	.uleb128 0x54
-	.4byte	0x131e6
+	.4byte	0x130dd
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xaf0
+	.4byte	.Ldebug_ranges0+0xac0
 	.uleb128 0x5c
-	.4byte	0x13214
+	.4byte	0x1310b
 	.uleb128 0x4e
-	.8byte	.LVL467
-	.4byte	0x13c00
+	.8byte	.LVL469
+	.4byte	0x13af7
 	.uleb128 0x4e
-	.8byte	.LVL502
-	.4byte	0x13c00
+	.8byte	.LVL501
+	.4byte	0x13af7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x131a0
-	.8byte	.LBB1536
-	.4byte	.Ldebug_ranges0+0xb30
+	.4byte	0x13097
+	.8byte	.LBB1514
+	.4byte	.Ldebug_ranges0+0xb00
 	.byte	0x1
-	.2byte	0x4ab
-	.4byte	0xf258
+	.2byte	0x530
+	.4byte	0xf261
 	.uleb128 0x54
-	.4byte	0x131c8
+	.4byte	0x130bf
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x130b3
 	.uleb128 0x54
-	.4byte	0x131b1
+	.4byte	0x130a8
 	.uleb128 0x5d
-	.4byte	0x131d5
-	.8byte	.LBB1537
-	.4byte	.Ldebug_ranges0+0xb30
+	.4byte	0x130cc
+	.8byte	.LBB1515
+	.4byte	.Ldebug_ranges0+0xb00
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13209
+	.4byte	0x13100
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x130f4
 	.uleb128 0x54
-	.4byte	0x131f1
+	.4byte	0x130e8
 	.uleb128 0x54
-	.4byte	0x131e6
+	.4byte	0x130dd
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xb30
+	.4byte	.Ldebug_ranges0+0xb00
 	.uleb128 0x5c
-	.4byte	0x13214
+	.4byte	0x1310b
 	.uleb128 0x4e
-	.8byte	.LVL468
-	.4byte	0x13c00
+	.8byte	.LVL470
+	.4byte	0x13af7
 	.uleb128 0x4e
-	.8byte	.LVL501
-	.4byte	0x13c00
+	.8byte	.LVL500
+	.4byte	0x13af7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x131a0
-	.8byte	.LBB1543
-	.4byte	.Ldebug_ranges0+0xb70
+	.4byte	0x13097
+	.8byte	.LBB1521
+	.4byte	.Ldebug_ranges0+0xb40
 	.byte	0x1
-	.2byte	0x4ae
-	.4byte	0xf2ce
+	.2byte	0x533
+	.4byte	0xf2d7
 	.uleb128 0x54
-	.4byte	0x131c8
+	.4byte	0x130bf
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x130b3
 	.uleb128 0x54
-	.4byte	0x131b1
+	.4byte	0x130a8
 	.uleb128 0x5d
-	.4byte	0x131d5
-	.8byte	.LBB1544
-	.4byte	.Ldebug_ranges0+0xb70
+	.4byte	0x130cc
+	.8byte	.LBB1522
+	.4byte	.Ldebug_ranges0+0xb40
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13209
+	.4byte	0x13100
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x130f4
 	.uleb128 0x54
-	.4byte	0x131f1
+	.4byte	0x130e8
 	.uleb128 0x54
-	.4byte	0x131e6
+	.4byte	0x130dd
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xb70
+	.4byte	.Ldebug_ranges0+0xb40
 	.uleb128 0x5c
-	.4byte	0x13214
+	.4byte	0x1310b
 	.uleb128 0x4e
-	.8byte	.LVL469
-	.4byte	0x13c00
+	.8byte	.LVL471
+	.4byte	0x13af7
 	.uleb128 0x4e
-	.8byte	.LVL500
-	.4byte	0x13c00
+	.8byte	.LVL499
+	.4byte	0x13af7
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x131a0
-	.8byte	.LBB1550
-	.4byte	.Ldebug_ranges0+0xbb0
+	.4byte	0x13097
+	.8byte	.LBB1528
+	.4byte	.Ldebug_ranges0+0xb80
 	.byte	0x1
-	.2byte	0x4b1
+	.2byte	0x536
 	.uleb128 0x54
-	.4byte	0x131c8
+	.4byte	0x130bf
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x130b3
 	.uleb128 0x54
-	.4byte	0x131b1
+	.4byte	0x130a8
 	.uleb128 0x5d
-	.4byte	0x131d5
-	.8byte	.LBB1551
-	.4byte	.Ldebug_ranges0+0xbb0
+	.4byte	0x130cc
+	.8byte	.LBB1529
+	.4byte	.Ldebug_ranges0+0xb80
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x13209
+	.4byte	0x13100
 	.uleb128 0x54
-	.4byte	0x131fd
+	.4byte	0x130f4
 	.uleb128 0x54
-	.4byte	0x131f1
+	.4byte	0x130e8
 	.uleb128 0x54
-	.4byte	0x131e6
+	.4byte	0x130dd
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xbb0
+	.4byte	.Ldebug_ranges0+0xb80
 	.uleb128 0x5c
-	.4byte	0x13214
+	.4byte	0x1310b
 	.uleb128 0x4e
-	.8byte	.LVL470
-	.4byte	0x13c00
+	.8byte	.LVL472
+	.4byte	0x13af7
 	.uleb128 0x4e
-	.8byte	.LVL499
-	.4byte	0x13c00
+	.8byte	.LVL498
+	.4byte	0x13af7
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0xfd45
-	.8byte	.LBB1572
-	.4byte	.Ldebug_ranges0+0xbf0
+	.4byte	0xfd15
+	.8byte	.LBB1550
+	.4byte	.Ldebug_ranges0+0xbc0
 	.byte	0x1
-	.2byte	0x74f
-	.4byte	0xf524
+	.2byte	0x7d4
+	.4byte	0xf4f8
 	.uleb128 0x54
-	.4byte	0xfd56
+	.4byte	0xfd26
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xbf0
+	.4byte	.Ldebug_ranges0+0xbc0
 	.uleb128 0x5f
-	.4byte	0xfd62
-	.4byte	.LLST126
+	.4byte	0xfd32
+	.4byte	.LLST122
 	.uleb128 0x5c
-	.4byte	0xfd6e
+	.4byte	0xfd3e
 	.uleb128 0x5c
-	.4byte	0xfd7a
+	.4byte	0xfd4a
 	.uleb128 0x5c
-	.4byte	0xfd86
+	.4byte	0xfd56
 	.uleb128 0x60
-	.4byte	0xfd92
+	.4byte	0xfd62
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5c
-	.4byte	0xfd9c
+	.4byte	0xfd6c
 	.uleb128 0x5c
-	.4byte	0xfda8
+	.4byte	0xfd78
 	.uleb128 0x5c
-	.4byte	0xfdb4
+	.4byte	0xfd84
 	.uleb128 0x58
-	.4byte	0x132b3
-	.8byte	.LBB1574
-	.4byte	.Ldebug_ranges0+0xc60
+	.4byte	0x131aa
+	.8byte	.LBB1552
+	.4byte	.Ldebug_ranges0+0xc30
 	.byte	0x1
-	.2byte	0x64e
-	.4byte	0xf3b2
+	.2byte	0x6d3
+	.4byte	0xf3bb
 	.uleb128 0x54
-	.4byte	0x132c3
+	.4byte	0x131ba
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x1327d
-	.8byte	.LBB1578
-	.4byte	.Ldebug_ranges0+0xc90
+	.4byte	0x13174
+	.8byte	.LBB1556
+	.4byte	.Ldebug_ranges0+0xc60
 	.byte	0x1
-	.2byte	0x669
-	.4byte	0xf3e7
+	.2byte	0x6ee
+	.4byte	0xf3f0
 	.uleb128 0x54
-	.4byte	0x132a6
+	.4byte	0x1319d
 	.uleb128 0x54
-	.4byte	0x1329a
+	.4byte	0x13191
 	.uleb128 0x54
-	.4byte	0x1328e
+	.4byte	0x13185
 	.uleb128 0x4e
-	.8byte	.LVL476
-	.4byte	0x13bf3
+	.8byte	.LVL478
+	.4byte	0x13aea
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1327d
-	.8byte	.LBB1586
-	.8byte	.LBE1586-.LBB1586
+	.4byte	0x13174
+	.8byte	.LBB1564
+	.8byte	.LBE1564-.LBB1564
 	.byte	0x1
-	.2byte	0x66c
-	.4byte	0xf420
+	.2byte	0x6f1
+	.4byte	0xf429
 	.uleb128 0x54
-	.4byte	0x132a6
+	.4byte	0x1319d
 	.uleb128 0x54
-	.4byte	0x1329a
+	.4byte	0x13191
 	.uleb128 0x54
-	.4byte	0x1328e
+	.4byte	0x13185
 	.uleb128 0x4e
-	.8byte	.LVL477
-	.4byte	0x13bf3
+	.8byte	.LVL479
+	.4byte	0x13aea
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1327d
-	.8byte	.LBB1588
-	.8byte	.LBE1588-.LBB1588
+	.4byte	0x13174
+	.8byte	.LBB1566
+	.8byte	.LBE1566-.LBB1566
 	.byte	0x1
-	.2byte	0x66f
-	.4byte	0xf459
+	.2byte	0x6f4
+	.4byte	0xf462
 	.uleb128 0x54
-	.4byte	0x132a6
+	.4byte	0x1319d
 	.uleb128 0x54
-	.4byte	0x1329a
+	.4byte	0x13191
 	.uleb128 0x54
-	.4byte	0x1328e
+	.4byte	0x13185
 	.uleb128 0x4e
-	.8byte	.LVL478
-	.4byte	0x13bf3
+	.8byte	.LVL480
+	.4byte	0x13aea
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1327d
-	.8byte	.LBB1590
-	.8byte	.LBE1590-.LBB1590
-	.byte	0x1
-	.2byte	0x672
-	.4byte	0xf492
-	.uleb128 0x54
-	.4byte	0x132a6
-	.uleb128 0x54
-	.4byte	0x1329a
-	.uleb128 0x54
-	.4byte	0x1328e
-	.uleb128 0x4e
-	.8byte	.LVL479
-	.4byte	0x13bf3
-	.byte	0
-	.uleb128 0x58
-	.4byte	0x1327d
-	.8byte	.LBB1592
-	.4byte	.Ldebug_ranges0+0xce0
+	.4byte	0x13174
+	.8byte	.LBB1568
+	.8byte	.LBE1568-.LBB1568
 	.byte	0x1
-	.2byte	0x677
-	.4byte	0xf4c7
+	.2byte	0x6fc
+	.4byte	0xf49b
 	.uleb128 0x54
-	.4byte	0x132a6
+	.4byte	0x1319d
 	.uleb128 0x54
-	.4byte	0x1329a
+	.4byte	0x13191
 	.uleb128 0x54
-	.4byte	0x1328e
+	.4byte	0x13185
 	.uleb128 0x4e
-	.8byte	.LVL480
-	.4byte	0x13bf3
+	.8byte	.LVL481
+	.4byte	0x13aea
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL472
-	.4byte	0x13c0d
-	.uleb128 0x4e
-	.8byte	.LVL473
-	.4byte	0x13c1a
-	.uleb128 0x4e
 	.8byte	.LVL474
-	.4byte	0x13c26
+	.4byte	0x13b04
 	.uleb128 0x4e
 	.8byte	.LVL475
-	.4byte	0x13c32
+	.4byte	0x13b11
 	.uleb128 0x4e
-	.8byte	.LVL481
-	.4byte	0x13c3e
+	.8byte	.LVL476
+	.4byte	0x13b1d
+	.uleb128 0x4e
+	.8byte	.LVL477
+	.4byte	0x13b29
 	.uleb128 0x4e
 	.8byte	.LVL482
-	.4byte	0x13c48
+	.4byte	0x13b35
 	.uleb128 0x4e
-	.8byte	.LVL496
-	.4byte	0x13c54
+	.8byte	.LVL483
+	.4byte	0x13b3f
+	.uleb128 0x4e
+	.8byte	.LVL495
+	.4byte	0x13b4b
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0xfdbf
-	.8byte	.LBB1603
-	.4byte	.Ldebug_ranges0+0xd10
+	.4byte	0xfd8f
+	.8byte	.LBB1577
+	.4byte	.Ldebug_ranges0+0xcb0
 	.byte	0x1
-	.2byte	0x756
-	.4byte	0xf60a
+	.2byte	0x7db
+	.4byte	0xf5da
 	.uleb128 0x54
-	.4byte	0xfdd0
+	.4byte	0xfda0
 	.uleb128 0x54
-	.4byte	0xfdd0
+	.4byte	0xfda0
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xd10
+	.4byte	.Ldebug_ranges0+0xcb0
 	.uleb128 0x5c
-	.4byte	0xfddc
-	.uleb128 0x5f
-	.4byte	0xfde8
-	.4byte	.LLST127
+	.4byte	0xfdac
 	.uleb128 0x5f
-	.4byte	0xfdf4
-	.4byte	.LLST128
+	.4byte	0xfdb8
+	.4byte	.LLST123
+	.uleb128 0x5c
+	.4byte	0xfdc4
 	.uleb128 0x60
-	.4byte	0xfe00
+	.4byte	0xfdd0
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5f
-	.4byte	0xfe0a
-	.4byte	.LLST129
+	.4byte	0xfdda
+	.4byte	.LLST124
 	.uleb128 0x5c
-	.4byte	0xfe16
+	.4byte	0xfde6
 	.uleb128 0x5c
-	.4byte	0xfe22
+	.4byte	0xfdf2
 	.uleb128 0x53
-	.4byte	0x132b3
-	.8byte	.LBB1605
-	.8byte	.LBE1605-.LBB1605
+	.4byte	0x131aa
+	.8byte	.LBB1579
+	.8byte	.LBE1579-.LBB1579
 	.byte	0x1
-	.2byte	0x621
-	.4byte	0xf5a0
+	.2byte	0x6a6
+	.4byte	0xf570
 	.uleb128 0x54
-	.4byte	0x132c3
+	.4byte	0x131ba
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL484
-	.4byte	0x13c0d
-	.uleb128 0x4e
 	.8byte	.LVL485
-	.4byte	0x13c1a
+	.4byte	0x13b04
 	.uleb128 0x4e
-	.8byte	.LVL505
-	.4byte	0x13c26
+	.8byte	.LVL486
+	.4byte	0x13b11
 	.uleb128 0x4e
-	.8byte	.LVL506
-	.4byte	0x13c61
+	.8byte	.LVL504
+	.4byte	0x13b1d
 	.uleb128 0x4e
-	.8byte	.LVL584
-	.4byte	0x13c54
+	.8byte	.LVL505
+	.4byte	0x13b58
 	.uleb128 0x4e
 	.8byte	.LVL585
-	.4byte	0x13c6d
+	.4byte	0x13b4b
 	.uleb128 0x4e
 	.8byte	.LVL586
-	.4byte	0x13c54
+	.4byte	0x13b64
 	.uleb128 0x4e
-	.8byte	.LVL605
-	.4byte	0x13c54
+	.8byte	.LVL587
+	.4byte	0x13b4b
+	.uleb128 0x4e
+	.8byte	.LVL606
+	.4byte	0x13b4b
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0xfd0d
-	.8byte	.LBB1614
-	.4byte	.Ldebug_ranges0+0xd70
+	.4byte	0xfcdd
+	.8byte	.LBB1588
+	.4byte	.Ldebug_ranges0+0xd10
 	.byte	0x1
-	.2byte	0x75d
-	.4byte	0xf797
+	.2byte	0x7e2
+	.4byte	0xf767
 	.uleb128 0x54
-	.4byte	0xfd1e
+	.4byte	0xfcee
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xd70
+	.4byte	.Ldebug_ranges0+0xd10
 	.uleb128 0x60
-	.4byte	0xfd2a
+	.4byte	0xfcfa
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x58
-	.4byte	0x13489
-	.8byte	.LBB1616
-	.4byte	.Ldebug_ranges0+0xdb0
+	.4byte	0x13380
+	.8byte	.LBB1590
+	.4byte	.Ldebug_ranges0+0xd50
 	.byte	0x1
-	.2byte	0x684
-	.4byte	0xf691
+	.2byte	0x709
+	.4byte	0xf661
 	.uleb128 0x54
-	.4byte	0x13495
+	.4byte	0x1338c
 	.uleb128 0x5e
-	.8byte	.LBB1618
-	.8byte	.LBE1618-.LBB1618
+	.8byte	.LBB1592
+	.8byte	.LBE1592-.LBB1592
 	.uleb128 0x5c
-	.4byte	0x134c0
+	.4byte	0x133b7
 	.uleb128 0x59
-	.4byte	0x1360d
-	.8byte	.LBB1619
-	.8byte	.LBE1619-.LBB1619
+	.4byte	0x13504
+	.8byte	.LBB1593
+	.8byte	.LBE1593-.LBB1593
 	.byte	0x10
 	.byte	0x1c
 	.uleb128 0x54
-	.4byte	0x1362d
+	.4byte	0x13524
 	.uleb128 0x54
-	.4byte	0x13622
+	.4byte	0x13519
 	.uleb128 0x54
-	.4byte	0x13619
+	.4byte	0x13510
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1354f
-	.8byte	.LBB1623
-	.8byte	.LBE1623-.LBB1623
+	.4byte	0x13446
+	.8byte	.LBB1597
+	.8byte	.LBE1597-.LBB1597
 	.byte	0x1
-	.2byte	0x68c
-	.4byte	0xf6dc
+	.2byte	0x711
+	.4byte	0xf6ac
 	.uleb128 0x54
-	.4byte	0x13564
+	.4byte	0x1345b
 	.uleb128 0x54
-	.4byte	0x1355b
+	.4byte	0x13452
 	.uleb128 0x5e
-	.8byte	.LBB1624
-	.8byte	.LBE1624-.LBB1624
+	.8byte	.LBB1598
+	.8byte	.LBE1598-.LBB1598
 	.uleb128 0x5f
-	.4byte	0x1356d
-	.4byte	.LLST130
+	.4byte	0x13464
+	.4byte	.LLST125
 	.uleb128 0x5f
-	.4byte	0x13577
-	.4byte	.LLST131
+	.4byte	0x1346e
+	.4byte	.LLST126
 	.byte	0
 	.byte	0
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xde0
-	.4byte	0xf709
+	.4byte	.Ldebug_ranges0+0xd80
+	.4byte	0xf6d9
 	.uleb128 0x5f
-	.4byte	0xfd37
-	.4byte	.LLST132
+	.4byte	0xfd07
+	.4byte	.LLST127
 	.uleb128 0x4e
-	.8byte	.LVL513
-	.4byte	0x13c79
+	.8byte	.LVL512
+	.4byte	0x13b70
 	.uleb128 0x4e
-	.8byte	.LVL515
-	.4byte	0x13c85
+	.8byte	.LVL514
+	.4byte	0x13b7c
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1354f
-	.8byte	.LBB1627
-	.8byte	.LBE1627-.LBB1627
+	.4byte	0x13446
+	.8byte	.LBB1601
+	.8byte	.LBE1601-.LBB1601
 	.byte	0x1
-	.2byte	0x695
-	.4byte	0xf754
+	.2byte	0x71a
+	.4byte	0xf724
 	.uleb128 0x54
-	.4byte	0x13564
+	.4byte	0x1345b
 	.uleb128 0x54
-	.4byte	0x1355b
+	.4byte	0x13452
 	.uleb128 0x5e
-	.8byte	.LBB1628
-	.8byte	.LBE1628-.LBB1628
+	.8byte	.LBB1602
+	.8byte	.LBE1602-.LBB1602
 	.uleb128 0x5f
-	.4byte	0x1356d
-	.4byte	.LLST133
+	.4byte	0x13464
+	.4byte	.LLST128
 	.uleb128 0x5f
-	.4byte	0x13577
-	.4byte	.LLST134
+	.4byte	0x1346e
+	.4byte	.LLST129
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL507
-	.4byte	0x13c79
+	.8byte	.LVL506
+	.4byte	0x13b70
 	.uleb128 0x4e
-	.8byte	.LVL508
-	.4byte	0x13c92
+	.8byte	.LVL507
+	.4byte	0x13b89
 	.uleb128 0x4e
-	.8byte	.LVL516
-	.4byte	0x13c92
+	.8byte	.LVL515
+	.4byte	0x13b89
 	.uleb128 0x4e
-	.8byte	.LVL589
-	.4byte	0x13c54
+	.8byte	.LVL590
+	.4byte	0x13b4b
 	.uleb128 0x4e
-	.8byte	.LVL593
-	.4byte	0x13c54
+	.8byte	.LVL594
+	.4byte	0x13b4b
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0xfcf3
-	.8byte	.LBB1631
-	.8byte	.LBE1631-.LBB1631
+	.4byte	0xfcc3
+	.8byte	.LBB1605
+	.8byte	.LBE1605-.LBB1605
 	.byte	0x1
-	.2byte	0x764
-	.4byte	0xf831
+	.2byte	0x7e9
+	.4byte	0xf801
 	.uleb128 0x54
-	.4byte	0xfd00
+	.4byte	0xfcd0
 	.uleb128 0x58
-	.4byte	0x12ee6
-	.8byte	.LBB1633
-	.4byte	.Ldebug_ranges0+0xe10
+	.4byte	0x12ddd
+	.8byte	.LBB1607
+	.4byte	.Ldebug_ranges0+0xdb0
 	.byte	0x1
-	.2byte	0x6a5
-	.4byte	0xf7fc
+	.2byte	0x72a
+	.4byte	0xf7cc
 	.uleb128 0x54
-	.4byte	0x12f08
+	.4byte	0x12dff
 	.uleb128 0x54
-	.4byte	0x12efd
+	.4byte	0x12df4
 	.uleb128 0x54
-	.4byte	0x12ef2
+	.4byte	0x12de9
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xe10
+	.4byte	.Ldebug_ranges0+0xdb0
 	.uleb128 0x5f
-	.4byte	0x12f13
-	.4byte	.LLST135
+	.4byte	0x12e0a
+	.4byte	.LLST130
 	.uleb128 0x4e
-	.8byte	.LVL523
-	.4byte	0x13c9f
+	.8byte	.LVL522
+	.4byte	0x13b96
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
+	.8byte	.LVL523
+	.4byte	0x13ba2
+	.uleb128 0x4e
 	.8byte	.LVL524
-	.4byte	0x13cab
+	.4byte	0x13bae
 	.uleb128 0x4e
 	.8byte	.LVL525
-	.4byte	0x13cb7
+	.4byte	0x13ba2
 	.uleb128 0x4e
 	.8byte	.LVL526
-	.4byte	0x13cab
-	.uleb128 0x4e
-	.8byte	.LVL527
-	.4byte	0x13cb7
+	.4byte	0x13bae
 	.byte	0
 	.uleb128 0x58
-	.4byte	0xfc51
-	.8byte	.LBB1643
-	.4byte	.Ldebug_ranges0+0xe70
+	.4byte	0xfc21
+	.8byte	.LBB1617
+	.4byte	.Ldebug_ranges0+0xe10
 	.byte	0x1
-	.2byte	0x767
-	.4byte	0xfad4
+	.2byte	0x7ec
+	.4byte	0xfaa4
 	.uleb128 0x54
-	.4byte	0xfc6e
+	.4byte	0xfc3e
 	.uleb128 0x54
-	.4byte	0xfc62
+	.4byte	0xfc32
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xe70
+	.4byte	.Ldebug_ranges0+0xe10
 	.uleb128 0x5c
+	.4byte	0xfc4a
+	.uleb128 0x5f
+	.4byte	0xfc56
+	.4byte	.LLST131
+	.uleb128 0x5f
+	.4byte	0xfc62
+	.4byte	.LLST132
+	.uleb128 0x5f
+	.4byte	0xfc6e
+	.4byte	.LLST133
+	.uleb128 0x5f
 	.4byte	0xfc7a
+	.4byte	.LLST134
 	.uleb128 0x5f
 	.4byte	0xfc86
-	.4byte	.LLST136
+	.4byte	.LLST135
 	.uleb128 0x5f
 	.4byte	0xfc92
-	.4byte	.LLST137
-	.uleb128 0x5f
+	.4byte	.LLST136
+	.uleb128 0x5c
 	.4byte	0xfc9e
-	.4byte	.LLST138
 	.uleb128 0x5f
 	.4byte	0xfcaa
-	.4byte	.LLST139
+	.4byte	.LLST137
 	.uleb128 0x5f
 	.4byte	0xfcb6
-	.4byte	.LLST140
-	.uleb128 0x5f
-	.4byte	0xfcc2
-	.4byte	.LLST141
-	.uleb128 0x5c
-	.4byte	0xfcce
-	.uleb128 0x5f
-	.4byte	0xfcda
-	.4byte	.LLST142
-	.uleb128 0x5f
-	.4byte	0xfce6
-	.4byte	.LLST143
+	.4byte	.LLST138
 	.uleb128 0x53
-	.4byte	0x11646
-	.8byte	.LBB1645
-	.8byte	.LBE1645-.LBB1645
+	.4byte	0x11616
+	.8byte	.LBB1619
+	.8byte	.LBE1619-.LBB1619
 	.byte	0x1
-	.2byte	0x6dd
-	.4byte	0xf913
+	.2byte	0x762
+	.4byte	0xf8e3
 	.uleb128 0x54
-	.4byte	0x11657
+	.4byte	0x11627
 	.uleb128 0x54
-	.4byte	0x11657
+	.4byte	0x11627
 	.uleb128 0x5e
-	.8byte	.LBB1646
-	.8byte	.LBE1646-.LBB1646
+	.8byte	.LBB1620
+	.8byte	.LBE1620-.LBB1620
 	.uleb128 0x5f
-	.4byte	0x11663
-	.4byte	.LLST144
+	.4byte	0x11633
+	.4byte	.LLST139
 	.uleb128 0x4e
-	.8byte	.LVL558
-	.4byte	0x13cc3
+	.8byte	.LVL543
+	.4byte	0x13bba
 	.uleb128 0x4e
-	.8byte	.LVL560
-	.4byte	0x13c48
+	.8byte	.LVL545
+	.4byte	0x13b3f
 	.uleb128 0x4e
-	.8byte	.LVL561
-	.4byte	0x13ccf
+	.8byte	.LVL546
+	.4byte	0x13bc6
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13063
-	.8byte	.LBB1647
-	.8byte	.LBE1647-.LBB1647
+	.4byte	0x12f5a
+	.8byte	.LBB1621
+	.8byte	.LBE1621-.LBB1621
 	.byte	0x1
-	.2byte	0x6d1
-	.4byte	0xf96a
+	.2byte	0x748
+	.4byte	0xf93a
 	.uleb128 0x54
-	.4byte	0x13080
+	.4byte	0x12f77
 	.uleb128 0x54
-	.4byte	0x13074
+	.4byte	0x12f6b
 	.uleb128 0x5a
-	.4byte	0x1308d
-	.8byte	.LBB1648
-	.8byte	.LBE1648-.LBB1648
+	.4byte	0x12f84
+	.8byte	.LBB1622
+	.8byte	.LBE1622-.LBB1622
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x12fa1
 	.uleb128 0x54
-	.4byte	0x1309e
+	.4byte	0x12f95
 	.uleb128 0x4e
-	.8byte	.LVL565
-	.4byte	0x13cdb
+	.8byte	.LVL559
+	.4byte	0x13bd2
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13063
-	.8byte	.LBB1650
-	.8byte	.LBE1650-.LBB1650
+	.4byte	0x12f5a
+	.8byte	.LBB1624
+	.8byte	.LBE1624-.LBB1624
 	.byte	0x1
-	.2byte	0x6c3
-	.4byte	0xf9c1
+	.2byte	0x756
+	.4byte	0xf991
 	.uleb128 0x54
-	.4byte	0x13080
+	.4byte	0x12f77
 	.uleb128 0x54
-	.4byte	0x13074
+	.4byte	0x12f6b
 	.uleb128 0x5a
-	.4byte	0x1308d
-	.8byte	.LBB1651
-	.8byte	.LBE1651-.LBB1651
+	.4byte	0x12f84
+	.8byte	.LBB1625
+	.8byte	.LBE1625-.LBB1625
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x130aa
+	.4byte	0x12fa1
 	.uleb128 0x54
-	.4byte	0x1309e
+	.4byte	0x12f95
 	.uleb128 0x4e
-	.8byte	.LVL577
-	.4byte	0x13cdb
+	.8byte	.LVL574
+	.4byte	0x13bd2
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL529
-	.4byte	0x13ce8
+	.8byte	.LVL528
+	.4byte	0x13bdf
 	.uleb128 0x4e
-	.8byte	.LVL531
-	.4byte	0x13ce8
+	.8byte	.LVL530
+	.4byte	0x13bdf
 	.uleb128 0x4e
-	.8byte	.LVL533
-	.4byte	0x13cf4
+	.8byte	.LVL532
+	.4byte	0x13beb
 	.uleb128 0x4e
-	.8byte	.LVL538
-	.4byte	0x13cf4
+	.8byte	.LVL537
+	.4byte	0x13beb
 	.uleb128 0x4e
 	.8byte	.LVL541
-	.4byte	0x13cc3
-	.uleb128 0x4e
-	.8byte	.LVL543
-	.4byte	0x13d01
-	.uleb128 0x4e
-	.8byte	.LVL544
-	.4byte	0x13ccf
+	.4byte	0x13ad1
 	.uleb128 0x4e
-	.8byte	.LVL545
-	.4byte	0x13d0b
+	.8byte	.LVL542
+	.4byte	0x13bf8
 	.uleb128 0x4e
-	.8byte	.LVL546
-	.4byte	0x13d0b
+	.8byte	.LVL547
+	.4byte	0x13c04
 	.uleb128 0x4e
-	.8byte	.LVL556
-	.4byte	0x13bda
+	.8byte	.LVL548
+	.4byte	0x13c04
 	.uleb128 0x4e
-	.8byte	.LVL557
-	.4byte	0x13d17
+	.8byte	.LVL558
+	.4byte	0x13ad1
 	.uleb128 0x4e
-	.8byte	.LVL562
-	.4byte	0x13d23
+	.8byte	.LVL563
+	.4byte	0x13c10
 	.uleb128 0x4e
-	.8byte	.LVL564
-	.4byte	0x13bda
+	.8byte	.LVL566
+	.4byte	0x13bba
 	.uleb128 0x4e
 	.8byte	.LVL568
-	.4byte	0x13d01
+	.4byte	0x13c10
+	.uleb128 0x4e
+	.8byte	.LVL569
+	.4byte	0x13bc6
 	.uleb128 0x4e
 	.8byte	.LVL571
-	.4byte	0x13cc3
+	.4byte	0x13c1a
 	.uleb128 0x4e
 	.8byte	.LVL573
-	.4byte	0x13d01
+	.4byte	0x13ad1
 	.uleb128 0x4e
-	.8byte	.LVL574
-	.4byte	0x13ccf
+	.8byte	.LVL577
+	.4byte	0x13c10
 	.uleb128 0x4e
-	.8byte	.LVL576
-	.4byte	0x13bda
+	.8byte	.LVL580
+	.4byte	0x13bba
 	.uleb128 0x4e
-	.8byte	.LVL581
-	.4byte	0x13d01
+	.8byte	.LVL582
+	.4byte	0x13c10
 	.uleb128 0x4e
-	.8byte	.LVL609
-	.4byte	0x13c54
+	.8byte	.LVL583
+	.4byte	0x13bc6
 	.uleb128 0x4e
-	.8byte	.LVL612
-	.4byte	0x13c54
+	.8byte	.LVL610
+	.4byte	0x13b4b
+	.uleb128 0x4e
+	.8byte	.LVL613
+	.4byte	0x13b4b
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13137
-	.8byte	.LBB1656
-	.8byte	.LBE1656-.LBB1656
+	.4byte	0x1302e
+	.8byte	.LBB1630
+	.8byte	.LBE1630-.LBB1630
 	.byte	0x1
-	.2byte	0x769
-	.4byte	0xfb1d
+	.2byte	0x7ee
+	.4byte	0xfaed
 	.uleb128 0x54
-	.4byte	0x1314e
+	.4byte	0x13045
 	.uleb128 0x54
-	.4byte	0x13143
+	.4byte	0x1303a
 	.uleb128 0x59
-	.4byte	0x13239
-	.8byte	.LBB1657
-	.8byte	.LBE1657-.LBB1657
+	.4byte	0x13130
+	.8byte	.LBB1631
+	.8byte	.LBE1631-.LBB1631
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x54
-	.4byte	0x13252
+	.4byte	0x13149
 	.uleb128 0x54
-	.4byte	0x13246
+	.4byte	0x1313d
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0xfe45
-	.8byte	.LBB1659
-	.8byte	.LBE1659-.LBB1659
+	.4byte	0xfe15
+	.8byte	.LBB1633
+	.8byte	.LBE1633-.LBB1633
 	.byte	0x1
-	.2byte	0x76c
-	.4byte	0xfb9a
+	.2byte	0x7f1
+	.4byte	0xfb6a
 	.uleb128 0x54
-	.4byte	0xfe56
-	.uleb128 0x4e
-	.8byte	.LVL547
-	.4byte	0x13d2f
-	.uleb128 0x4e
-	.8byte	.LVL548
-	.4byte	0x13d3b
+	.4byte	0xfe26
 	.uleb128 0x4e
 	.8byte	.LVL549
-	.4byte	0x13d3b
+	.4byte	0x13c26
 	.uleb128 0x4e
 	.8byte	.LVL550
-	.4byte	0x13d3b
+	.4byte	0x13c32
 	.uleb128 0x4e
 	.8byte	.LVL551
-	.4byte	0x13d3b
+	.4byte	0x13c32
 	.uleb128 0x4e
 	.8byte	.LVL552
-	.4byte	0x13d3b
+	.4byte	0x13c32
 	.uleb128 0x4e
 	.8byte	.LVL553
-	.4byte	0x13d3b
-	.byte	0
+	.4byte	0x13c32
 	.uleb128 0x4e
-	.8byte	.LVL444
-	.4byte	0x13c0d
+	.8byte	.LVL554
+	.4byte	0x13c32
 	.uleb128 0x4e
-	.8byte	.LVL445
-	.4byte	0x13d48
+	.8byte	.LVL555
+	.4byte	0x13c32
+	.byte	0
+	.uleb128 0x4e
+	.8byte	.LVL446
+	.4byte	0x13b04
 	.uleb128 0x4e
 	.8byte	.LVL447
-	.4byte	0x13c0d
+	.4byte	0x13c3f
 	.uleb128 0x4e
-	.8byte	.LVL448
-	.4byte	0x13d54
+	.8byte	.LVL449
+	.4byte	0x13b04
 	.uleb128 0x4e
-	.8byte	.LVL488
-	.4byte	0x13c54
+	.8byte	.LVL450
+	.4byte	0x13c4b
 	.uleb128 0x4e
-	.8byte	.LVL490
-	.4byte	0x13c54
+	.8byte	.LVL487
+	.4byte	0x13b4b
 	.uleb128 0x4e
-	.8byte	.LVL497
-	.4byte	0x13c54
+	.8byte	.LVL489
+	.4byte	0x13b4b
 	.uleb128 0x4e
-	.8byte	.LVL554
-	.4byte	0x13bda
+	.8byte	.LVL496
+	.4byte	0x13b4b
 	.uleb128 0x4e
-	.8byte	.LVL590
-	.4byte	0x13c54
+	.8byte	.LVL556
+	.4byte	0x13ad1
 	.uleb128 0x4e
-	.8byte	.LVL597
-	.4byte	0x13c54
+	.8byte	.LVL591
+	.4byte	0x13b4b
 	.uleb128 0x4e
 	.8byte	.LVL598
-	.4byte	0x13c54
+	.4byte	0x13b4b
 	.uleb128 0x4e
 	.8byte	.LVL599
-	.4byte	0x13c54
+	.4byte	0x13b4b
 	.uleb128 0x4e
-	.8byte	.LVL603
-	.4byte	0x13c54
+	.8byte	.LVL600
+	.4byte	0x13b4b
 	.uleb128 0x4e
-	.8byte	.LVL607
-	.4byte	0x13d61
+	.8byte	.LVL604
+	.4byte	0x13b4b
+	.uleb128 0x4e
+	.8byte	.LVL608
+	.4byte	0x13c58
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0x6b1
+	.2byte	0x736
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfcf3
+	.4byte	0xfcc3
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x6b1
-	.4byte	0xe46d
+	.2byte	0x736
+	.4byte	0xe461
 	.uleb128 0x64
-	.4byte	.LASF2996
+	.4byte	.LASF2995
 	.byte	0x1
-	.2byte	0x6b1
+	.2byte	0x736
 	.4byte	0xe123
 	.uleb128 0x46
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x6b3
-	.4byte	0xe707
+	.2byte	0x738
+	.4byte	0xe710
 	.uleb128 0x46
 	.4byte	.LASF3028
 	.byte	0x1
-	.2byte	0x6b4
+	.2byte	0x739
 	.4byte	0x6d
 	.uleb128 0x46
 	.4byte	.LASF3029
 	.byte	0x1
-	.2byte	0x6b5
+	.2byte	0x73a
 	.4byte	0x6d
 	.uleb128 0x46
 	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0x6b6
+	.2byte	0x73b
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0x6b7
+	.2byte	0x73c
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0x6b8
+	.2byte	0x73d
 	.4byte	0x219
 	.uleb128 0x46
 	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0x6b9
+	.2byte	0x73e
 	.4byte	0x219
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6ba
-	.4byte	0xe408
+	.2byte	0x73f
+	.4byte	0xe3fc
 	.uleb128 0x46
 	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0x6bb
+	.2byte	0x740
 	.4byte	0x443
 	.uleb128 0x46
 	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0x6bc
+	.2byte	0x741
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x65
 	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x69a
+	.2byte	0x71f
 	.byte	0x1
-	.4byte	0xfd0d
+	.4byte	0xfcdd
 	.uleb128 0x64
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x69a
-	.4byte	0xe707
+	.2byte	0x71f
+	.4byte	0xe710
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0x680
+	.2byte	0x705
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfd45
+	.4byte	0xfd15
 	.uleb128 0x64
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x680
-	.4byte	0xe707
+	.2byte	0x705
+	.4byte	0xe710
 	.uleb128 0x46
 	.4byte	.LASF2463
 	.byte	0x1
-	.2byte	0x682
+	.2byte	0x707
 	.4byte	0xd7e9
 	.uleb128 0x66
 	.uleb128 0x52
 	.string	"__k"
 	.byte	0x1
-	.2byte	0x68f
+	.2byte	0x714
 	.4byte	0x2eda
 	.byte	0
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0x637
+	.2byte	0x6bc
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfdbf
+	.4byte	0xfd8f
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x637
-	.4byte	0xe46d
+	.2byte	0x6bc
+	.4byte	0xe461
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x639
+	.2byte	0x6be
 	.4byte	0xa545
 	.uleb128 0x46
-	.4byte	.LASF2996
+	.4byte	.LASF2995
 	.byte	0x1
-	.2byte	0x63a
+	.2byte	0x6bf
 	.4byte	0xe123
 	.uleb128 0x46
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x63b
-	.4byte	0xe707
+	.2byte	0x6c0
+	.4byte	0xe710
 	.uleb128 0x46
 	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0x63c
+	.2byte	0x6c1
 	.4byte	0xb869
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x63d
+	.2byte	0x6c2
 	.4byte	0x9721
 	.uleb128 0x46
 	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0x63e
+	.2byte	0x6c3
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x63f
+	.2byte	0x6c4
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x63f
+	.2byte	0x6c4
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0x60e
+	.2byte	0x693
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe30
+	.4byte	0xfe00
 	.uleb128 0x64
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x60e
-	.4byte	0xe707
+	.2byte	0x693
+	.4byte	0xe710
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x610
+	.2byte	0x695
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x611
+	.2byte	0x696
 	.4byte	0xa545
 	.uleb128 0x46
 	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0x612
+	.2byte	0x697
 	.4byte	0xb869
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x613
+	.2byte	0x698
 	.4byte	0x9721
 	.uleb128 0x46
 	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0x614
+	.2byte	0x699
 	.4byte	0x29
 	.uleb128 0x46
 	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0x615
+	.2byte	0x69a
 	.4byte	0xc6
 	.uleb128 0x67
 	.4byte	.LASF3020
-	.4byte	0xfe40
+	.4byte	0xfe10
 	.4byte	.LASF3041
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xfe40
+	.4byte	0xfe10
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x12
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xfe30
+	.4byte	0xfe00
 	.uleb128 0x62
 	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0x600
+	.2byte	0x685
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe63
+	.4byte	0xfe33
 	.uleb128 0x64
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x600
-	.4byte	0xe707
+	.2byte	0x685
+	.4byte	0xe710
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0x5f7
+	.2byte	0x67c
 	.4byte	0x2d9
 	.8byte	.LFB2833
 	.8byte	.LFE2833-.LFB2833
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfec3
+	.4byte	0xfe93
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5f7
+	.2byte	0x67c
 	.4byte	0xa545
-	.4byte	.LLST75
+	.4byte	.LLST71
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5f8
+	.2byte	0x67d
 	.4byte	0xb3c0
-	.4byte	.LLST76
+	.4byte	.LLST72
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5f9
+	.2byte	0x67e
 	.4byte	0x219
-	.4byte	.LLST77
+	.4byte	.LLST73
 	.uleb128 0x4e
-	.8byte	.LVL269
-	.4byte	0x13d6b
+	.8byte	.LVL271
+	.4byte	0x13c62
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0x5ee
+	.2byte	0x673
 	.4byte	0x2d9
 	.8byte	.LFB2832
 	.8byte	.LFE2832-.LFB2832
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xff23
+	.4byte	0xfef3
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5ee
+	.2byte	0x673
 	.4byte	0xa545
-	.4byte	.LLST78
+	.4byte	.LLST74
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5ef
+	.2byte	0x674
 	.4byte	0xb3c0
-	.4byte	.LLST79
+	.4byte	.LLST75
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5f0
+	.2byte	0x675
 	.4byte	0x219
-	.4byte	.LLST80
+	.4byte	.LLST76
 	.uleb128 0x4e
-	.8byte	.LVL274
-	.4byte	0x13d6b
+	.8byte	.LVL276
+	.4byte	0x13c62
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0x5d6
+	.2byte	0x65b
 	.4byte	0x2d9
 	.8byte	.LFB2831
 	.8byte	.LFE2831-.LFB2831
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfff3
+	.4byte	0xffc3
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5d6
+	.2byte	0x65b
 	.4byte	0xa545
-	.4byte	.LLST90
+	.4byte	.LLST86
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5d7
+	.2byte	0x65c
 	.4byte	0xb3c0
-	.4byte	.LLST91
+	.4byte	.LLST87
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5d8
+	.2byte	0x65d
 	.4byte	0x56
-	.4byte	.LLST92
+	.4byte	.LLST88
 	.uleb128 0x56
 	.4byte	.LASF380
 	.byte	0x1
-	.2byte	0x5d8
+	.2byte	0x65d
 	.4byte	0x2ce
-	.4byte	.LLST93
+	.4byte	.LLST89
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x5da
-	.4byte	0xe46d
-	.4byte	.LLST94
+	.2byte	0x65f
+	.4byte	0xe461
+	.4byte	.LLST90
 	.uleb128 0x57
 	.4byte	.LASF2453
 	.byte	0x1
-	.2byte	0x5db
+	.2byte	0x660
 	.4byte	0xc6
-	.4byte	.LLST95
+	.4byte	.LLST91
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x5db
+	.2byte	0x660
 	.4byte	0xc6
 	.uleb128 0x4e
-	.8byte	.LVL300
-	.4byte	0x13d78
-	.uleb128 0x4e
 	.8byte	.LVL302
-	.4byte	0x13d85
+	.4byte	0x13c6f
 	.uleb128 0x4e
-	.8byte	.LVL307
-	.4byte	0x13c54
+	.8byte	.LVL304
+	.4byte	0x13c7c
 	.uleb128 0x4e
-	.8byte	.LVL310
-	.4byte	0x13c54
+	.8byte	.LVL309
+	.4byte	0x13b4b
 	.uleb128 0x4e
-	.8byte	.LVL311
-	.4byte	0x13d61
+	.8byte	.LVL312
+	.4byte	0x13b4b
+	.uleb128 0x4e
+	.8byte	.LVL313
+	.4byte	0x13c58
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3048
 	.byte	0x1
-	.2byte	0x5ca
+	.2byte	0x64f
 	.4byte	0x2d9
 	.8byte	.LFB2830
 	.8byte	.LFE2830-.LFB2830
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1008d
+	.4byte	0x1005d
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5ca
+	.2byte	0x64f
 	.4byte	0xa545
-	.4byte	.LLST81
+	.4byte	.LLST77
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5cb
+	.2byte	0x650
 	.4byte	0xb3c0
-	.4byte	.LLST82
+	.4byte	.LLST78
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5cc
+	.2byte	0x651
 	.4byte	0x219
-	.4byte	.LLST83
+	.4byte	.LLST79
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x5ce
-	.4byte	0xe46d
+	.2byte	0x653
+	.4byte	0xe461
 	.uleb128 0x46
 	.4byte	.LASF2453
 	.byte	0x1
-	.2byte	0x5cf
+	.2byte	0x654
 	.4byte	0xc6
 	.uleb128 0x53
-	.4byte	0x12e0f
-	.8byte	.LBB1206
-	.8byte	.LBE1206-.LBB1206
+	.4byte	0x12d06
+	.8byte	.LBB1186
+	.8byte	.LBE1186-.LBB1186
 	.byte	0x1
-	.2byte	0x5d1
-	.4byte	0x1007f
+	.2byte	0x656
+	.4byte	0x1004f
 	.uleb128 0x54
-	.4byte	0x12e1f
+	.4byte	0x12d16
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL279
-	.4byte	0x13d6b
+	.8byte	.LVL281
+	.4byte	0x13c62
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0x5bc
+	.2byte	0x641
 	.4byte	0x2d9
 	.8byte	.LFB2829
 	.8byte	.LFE2829-.LFB2829
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10136
+	.4byte	0x10106
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5bc
+	.2byte	0x641
 	.4byte	0xa545
-	.4byte	.LLST84
+	.4byte	.LLST80
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5bd
+	.2byte	0x642
 	.4byte	0xb3c0
-	.4byte	.LLST85
+	.4byte	.LLST81
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5be
+	.2byte	0x643
 	.4byte	0x219
-	.4byte	.LLST86
+	.4byte	.LLST82
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x5c0
-	.4byte	0xe46d
+	.2byte	0x645
+	.4byte	0xe461
 	.uleb128 0x69
 	.string	"t"
 	.byte	0x1
-	.2byte	0x5c1
+	.2byte	0x646
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x58
-	.4byte	0x12e2b
-	.8byte	.LBB1208
-	.4byte	.Ldebug_ranges0+0x6d0
+	.4byte	0x12d22
+	.8byte	.LBB1188
+	.4byte	.Ldebug_ranges0+0x6a0
 	.byte	0x1
-	.2byte	0x5c3
-	.4byte	0x1011b
+	.2byte	0x648
+	.4byte	0x100eb
 	.uleb128 0x54
-	.4byte	0x12e46
+	.4byte	0x12d3d
 	.uleb128 0x54
-	.4byte	0x12e3b
+	.4byte	0x12d32
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL286
-	.4byte	0x13d6b
+	.8byte	.LVL288
+	.4byte	0x13c62
 	.uleb128 0x4e
-	.8byte	.LVL289
-	.4byte	0x13d61
+	.8byte	.LVL291
+	.4byte	0x13c58
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3050
 	.byte	0x1
-	.2byte	0x5b1
+	.2byte	0x636
 	.4byte	0x2d9
 	.8byte	.LFB2828
 	.8byte	.LFE2828-.LFB2828
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x101a2
+	.4byte	0x10172
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5b1
+	.2byte	0x636
 	.4byte	0xa545
-	.4byte	.LLST87
+	.4byte	.LLST83
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5b2
+	.2byte	0x637
 	.4byte	0xb3c0
-	.4byte	.LLST88
+	.4byte	.LLST84
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5b3
+	.2byte	0x638
 	.4byte	0x219
-	.4byte	.LLST89
+	.4byte	.LLST85
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x5b5
-	.4byte	0xe46d
+	.2byte	0x63a
+	.4byte	0xe461
 	.uleb128 0x4e
-	.8byte	.LVL294
-	.4byte	0x13d6b
+	.8byte	.LVL296
+	.4byte	0x13c62
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0x5a6
+	.2byte	0x62b
 	.4byte	0x2d9
 	.8byte	.LFB2827
 	.8byte	.LFE2827-.LFB2827
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1021b
+	.4byte	0x101eb
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5a6
+	.2byte	0x62b
 	.4byte	0xa545
-	.4byte	.LLST96
+	.4byte	.LLST92
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5a7
+	.2byte	0x62c
 	.4byte	0xb3c0
-	.4byte	.LLST97
+	.4byte	.LLST93
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5a8
+	.2byte	0x62d
 	.4byte	0x219
-	.4byte	.LLST98
+	.4byte	.LLST94
 	.uleb128 0x46
 	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0x5aa
+	.2byte	0x62f
 	.4byte	0x56
 	.uleb128 0x4e
-	.8byte	.LVL313
-	.4byte	0x13d91
+	.8byte	.LVL315
+	.4byte	0x13c88
 	.uleb128 0x4e
-	.8byte	.LVL314
-	.4byte	0x13d6b
+	.8byte	.LVL316
+	.4byte	0x13c62
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0x58f
+	.2byte	0x614
 	.4byte	0xc6
 	.8byte	.LFB2826
 	.8byte	.LFE2826-.LFB2826
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1025c
+	.4byte	0x1022c
 	.uleb128 0x56
 	.4byte	.LASF415
 	.byte	0x1
-	.2byte	0x58f
+	.2byte	0x614
 	.4byte	0x1c54
-	.4byte	.LLST10
+	.4byte	.LLST6
 	.uleb128 0x6a
 	.4byte	.LASF1270
 	.byte	0x1
-	.2byte	0x58f
+	.2byte	0x614
 	.4byte	0x5531
 	.uleb128 0x1
 	.byte	0x51
@@ -39023,84 +39239,84 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0x580
+	.2byte	0x605
 	.4byte	0xc6
 	.8byte	.LFB2825
 	.8byte	.LFE2825-.LFB2825
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x102c5
+	.4byte	0x10295
 	.uleb128 0x56
 	.4byte	.LASF1270
 	.byte	0x1
-	.2byte	0x580
+	.2byte	0x605
 	.4byte	0x5531
-	.4byte	.LLST14
+	.4byte	.LLST10
 	.uleb128 0x51
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x580
+	.2byte	0x605
 	.4byte	0x3c8a
-	.4byte	.LLST15
+	.4byte	.LLST11
 	.uleb128 0x46
 	.4byte	.LASF881
 	.byte	0x1
-	.2byte	0x582
+	.2byte	0x607
 	.4byte	0x29
 	.uleb128 0x4e
-	.8byte	.LVL44
-	.4byte	0x13d9d
+	.8byte	.LVL46
+	.4byte	0x13c94
 	.uleb128 0x4e
-	.8byte	.LVL45
-	.4byte	0x13da9
+	.8byte	.LVL47
+	.4byte	0x13ca0
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0x4b7
+	.2byte	0x53c
 	.4byte	0x194
 	.8byte	.LFB2824
 	.8byte	.LFE2824-.LFB2824
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1156d
+	.4byte	0x1153d
 	.uleb128 0x56
 	.4byte	.LASF1270
 	.byte	0x1
-	.2byte	0x4b7
+	.2byte	0x53c
 	.4byte	0x5531
-	.4byte	.LLST16
+	.4byte	.LLST12
 	.uleb128 0x51
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0x4b7
+	.2byte	0x53c
 	.4byte	0x6d
-	.4byte	.LLST17
+	.4byte	.LLST13
 	.uleb128 0x51
 	.string	"arg"
 	.byte	0x1
-	.2byte	0x4b7
+	.2byte	0x53c
 	.4byte	0x29
-	.4byte	.LLST18
+	.4byte	.LLST14
 	.uleb128 0x46
 	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0x4b9
+	.2byte	0x53e
 	.4byte	0x443
 	.uleb128 0x46
-	.4byte	.LASF2996
+	.4byte	.LASF2995
 	.byte	0x1
-	.2byte	0x4ba
+	.2byte	0x53f
 	.4byte	0xe123
 	.uleb128 0x46
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x4bb
-	.4byte	0xe707
+	.2byte	0x540
+	.4byte	0xe710
 	.uleb128 0x4c
 	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0x4bc
+	.2byte	0x541
 	.4byte	0xd9c9
 	.uleb128 0x2
 	.byte	0x91
@@ -39108,48 +39324,48 @@ __exitcall_ebc_exit:
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x4bd
-	.4byte	0xe408
+	.2byte	0x542
+	.4byte	0xe3fc
 	.uleb128 0x46
 	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x4be
+	.2byte	0x543
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x4bf
+	.2byte	0x544
 	.4byte	0x29
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x4c0
+	.2byte	0x545
 	.4byte	0xc6
 	.uleb128 0x55
 	.4byte	.LASF3020
-	.4byte	0x1157d
+	.4byte	0x1154d
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34846
+	.8byte	__func__.34848
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x1d0
-	.4byte	0x1042f
+	.4byte	.Ldebug_ranges0+0x1a0
+	.4byte	0x103ff
 	.uleb128 0x46
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x50a
+	.2byte	0x58f
 	.4byte	0xc6
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x1d0
+	.4byte	.Ldebug_ranges0+0x1a0
 	.uleb128 0x6b
 	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x50a
-	.8byte	.L134
+	.2byte	0x58f
+	.8byte	.L127
 	.uleb128 0x4c
 	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x50a
+	.2byte	0x58f
 	.4byte	0x14fd
 	.uleb128 0x3
 	.byte	0x91
@@ -39157,948 +39373,948 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x50a
+	.2byte	0x58f
 	.4byte	0x194
 	.uleb128 0x6c
-	.8byte	.LBB998
-	.8byte	.LBE998-.LBB998
-	.4byte	0x10413
+	.8byte	.LBB978
+	.8byte	.LBE978-.LBB978
+	.4byte	0x103e3
 	.uleb128 0x57
 	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x50a
+	.2byte	0x58f
 	.4byte	0x194
-	.4byte	.LLST33
+	.4byte	.LLST29
 	.uleb128 0x4e
-	.8byte	.LVL91
-	.4byte	0x13db6
+	.8byte	.LVL93
+	.4byte	0x13cad
 	.uleb128 0x4e
-	.8byte	.LVL92
-	.4byte	0x13dc2
+	.8byte	.LVL94
+	.4byte	0x13cb9
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL89
-	.4byte	0x13dcf
+	.8byte	.LVL91
+	.4byte	0x13cc6
 	.uleb128 0x4e
-	.8byte	.LVL93
-	.4byte	0x13ddb
+	.8byte	.LVL95
+	.4byte	0x13cd2
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12f1e
-	.8byte	.LBB934
-	.4byte	.Ldebug_ranges0+0x60
+	.4byte	0x12e15
+	.8byte	.LBB914
+	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x572
-	.4byte	0x1064f
+	.2byte	0x5f7
+	.4byte	0x1061f
 	.uleb128 0x54
-	.4byte	0x12f43
+	.4byte	0x12e3a
 	.uleb128 0x54
-	.4byte	0x12f38
+	.4byte	0x12e2f
 	.uleb128 0x54
-	.4byte	0x12f2e
+	.4byte	0x12e25
 	.uleb128 0x6d
-	.4byte	0x12f7c
-	.8byte	.LBB935
-	.4byte	.Ldebug_ranges0+0x60
+	.4byte	0x12e73
+	.8byte	.LBB915
+	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12fa1
+	.4byte	0x12e98
 	.uleb128 0x54
-	.4byte	0x12f96
+	.4byte	0x12e8d
 	.uleb128 0x54
-	.4byte	0x12f8c
+	.4byte	0x12e83
 	.uleb128 0x6e
-	.4byte	0x13019
-	.8byte	.LBB937
-	.4byte	.Ldebug_ranges0+0xb0
+	.4byte	0x12f10
+	.8byte	.LBB917
+	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10585
+	.4byte	0x10555
 	.uleb128 0x54
-	.4byte	0x13034
+	.4byte	0x12f2b
 	.uleb128 0x6f
-	.4byte	0x13029
-	.4byte	.LLST19
+	.4byte	0x12f20
+	.4byte	.LLST15
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xb0
+	.4byte	.Ldebug_ranges0+0x80
 	.uleb128 0x5f
-	.4byte	0x1303f
-	.4byte	.LLST20
+	.4byte	0x12f36
+	.4byte	.LLST16
 	.uleb128 0x5f
-	.4byte	0x1304a
-	.4byte	.LLST21
+	.4byte	0x12f41
+	.4byte	.LLST17
 	.uleb128 0x70
-	.4byte	0x1346d
-	.8byte	.LBB939
-	.8byte	.LBE939-.LBB939
+	.4byte	0x13364
+	.8byte	.LBB919
+	.8byte	.LBE919-.LBB919
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x104eb
+	.4byte	0x104bb
 	.uleb128 0x5e
-	.8byte	.LBB940
-	.8byte	.LBE940-.LBB940
+	.8byte	.LBB920
+	.8byte	.LBE920-.LBB920
 	.uleb128 0x5f
-	.4byte	0x1347d
-	.4byte	.LLST22
+	.4byte	0x13374
+	.4byte	.LLST18
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13441
-	.8byte	.LBB941
-	.8byte	.LBE941-.LBB941
+	.4byte	0x13338
+	.8byte	.LBB921
+	.8byte	.LBE921-.LBB921
 	.byte	0x6
 	.byte	0x55
-	.4byte	0x10533
+	.4byte	0x10503
 	.uleb128 0x54
-	.4byte	0x1345b
+	.4byte	0x13352
 	.uleb128 0x54
-	.4byte	0x13451
+	.4byte	0x13348
 	.uleb128 0x59
-	.4byte	0x13523
-	.8byte	.LBB942
-	.8byte	.LBE942-.LBB942
+	.4byte	0x1341a
+	.8byte	.LBB922
+	.8byte	.LBE922-.LBB922
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x1353d
+	.4byte	0x13434
 	.uleb128 0x54
-	.4byte	0x13533
+	.4byte	0x1342a
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.8byte	.LBB944
-	.8byte	.LBE944-.LBB944
+	.8byte	.LBB924
+	.8byte	.LBE924-.LBB924
 	.uleb128 0x5c
-	.4byte	0x13056
+	.4byte	0x12f4d
 	.uleb128 0x59
-	.4byte	0x134f1
-	.8byte	.LBB945
-	.8byte	.LBE945-.LBB945
+	.4byte	0x133e8
+	.8byte	.LBB925
+	.8byte	.LBE925-.LBB925
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x1350c
+	.4byte	0x13403
 	.uleb128 0x54
-	.4byte	0x13501
+	.4byte	0x133f8
 	.uleb128 0x5e
-	.8byte	.LBB946
-	.8byte	.LBE946-.LBB946
+	.8byte	.LBB926
+	.8byte	.LBE926-.LBB926
 	.uleb128 0x5c
-	.4byte	0x13517
+	.4byte	0x1340e
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12fe5
-	.8byte	.LBB951
-	.8byte	.LBE951-.LBB951
+	.4byte	0x12edc
+	.8byte	.LBB931
+	.8byte	.LBE931-.LBB931
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x10640
+	.4byte	0x10610
 	.uleb128 0x54
-	.4byte	0x12ff5
+	.4byte	0x12eec
 	.uleb128 0x5e
-	.8byte	.LBB952
-	.8byte	.LBE952-.LBB952
+	.8byte	.LBB932
+	.8byte	.LBE932-.LBB932
 	.uleb128 0x5f
-	.4byte	0x13000
-	.4byte	.LLST23
+	.4byte	0x12ef7
+	.4byte	.LLST19
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xf0
-	.4byte	0x1060b
+	.4byte	.Ldebug_ranges0+0xc0
+	.4byte	0x105db
 	.uleb128 0x5f
-	.4byte	0x1300c
-	.4byte	.LLST24
+	.4byte	0x12f03
+	.4byte	.LLST20
 	.uleb128 0x59
-	.4byte	0x134f1
-	.8byte	.LBB954
-	.8byte	.LBE954-.LBB954
+	.4byte	0x133e8
+	.8byte	.LBB934
+	.8byte	.LBE934-.LBB934
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x1350c
+	.4byte	0x13403
 	.uleb128 0x54
-	.4byte	0x13501
+	.4byte	0x133f8
 	.uleb128 0x5e
-	.8byte	.LBB955
-	.8byte	.LBE955-.LBB955
+	.8byte	.LBB935
+	.8byte	.LBE935-.LBB935
 	.uleb128 0x5c
-	.4byte	0x13517
+	.4byte	0x1340e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x1346d
-	.8byte	.LBB956
-	.8byte	.LBE956-.LBB956
+	.4byte	0x13364
+	.8byte	.LBB936
+	.8byte	.LBE936-.LBB936
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x5e
-	.8byte	.LBB957
-	.8byte	.LBE957-.LBB957
+	.8byte	.LBB937
+	.8byte	.LBE937-.LBB937
 	.uleb128 0x5f
-	.4byte	0x1347d
-	.4byte	.LLST25
+	.4byte	0x13374
+	.4byte	.LLST21
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL119
-	.4byte	0x13de8
+	.8byte	.LVL121
+	.4byte	0x13cdf
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12f4d
-	.8byte	.LBB967
-	.4byte	.Ldebug_ranges0+0x120
+	.4byte	0x12e44
+	.8byte	.LBB947
+	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x1
-	.2byte	0x4f5
-	.4byte	0x1087a
+	.2byte	0x57a
+	.4byte	0x1084a
 	.uleb128 0x54
-	.4byte	0x12f72
+	.4byte	0x12e69
 	.uleb128 0x54
-	.4byte	0x12f67
+	.4byte	0x12e5e
 	.uleb128 0x54
-	.4byte	0x12f5d
+	.4byte	0x12e54
 	.uleb128 0x6d
-	.4byte	0x12fab
-	.8byte	.LBB968
-	.4byte	.Ldebug_ranges0+0x120
+	.4byte	0x12ea2
+	.8byte	.LBB948
+	.4byte	.Ldebug_ranges0+0xf0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x12fd0
+	.4byte	0x12ec7
 	.uleb128 0x54
-	.4byte	0x12fc5
+	.4byte	0x12ebc
 	.uleb128 0x54
-	.4byte	0x12fbb
+	.4byte	0x12eb2
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x120
+	.4byte	.Ldebug_ranges0+0xf0
 	.uleb128 0x5c
-	.4byte	0x12fd9
+	.4byte	0x12ed0
 	.uleb128 0x6e
-	.4byte	0x13019
-	.8byte	.LBB970
-	.4byte	.Ldebug_ranges0+0x160
+	.4byte	0x12f10
+	.8byte	.LBB950
+	.4byte	.Ldebug_ranges0+0x130
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x107af
+	.4byte	0x1077f
 	.uleb128 0x54
-	.4byte	0x13034
+	.4byte	0x12f2b
 	.uleb128 0x6f
-	.4byte	0x13029
-	.4byte	.LLST26
+	.4byte	0x12f20
+	.4byte	.LLST22
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x160
+	.4byte	.Ldebug_ranges0+0x130
 	.uleb128 0x5f
-	.4byte	0x1303f
-	.4byte	.LLST27
+	.4byte	0x12f36
+	.4byte	.LLST23
 	.uleb128 0x5f
-	.4byte	0x1304a
-	.4byte	.LLST28
+	.4byte	0x12f41
+	.4byte	.LLST24
 	.uleb128 0x70
-	.4byte	0x1346d
-	.8byte	.LBB972
-	.8byte	.LBE972-.LBB972
+	.4byte	0x13364
+	.8byte	.LBB952
+	.8byte	.LBE952-.LBB952
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10715
+	.4byte	0x106e5
 	.uleb128 0x5e
-	.8byte	.LBB973
-	.8byte	.LBE973-.LBB973
+	.8byte	.LBB953
+	.8byte	.LBE953-.LBB953
 	.uleb128 0x5f
-	.4byte	0x1347d
-	.4byte	.LLST29
+	.4byte	0x13374
+	.4byte	.LLST25
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB974
-	.8byte	.LBE974-.LBB974
-	.4byte	0x10769
+	.8byte	.LBB954
+	.8byte	.LBE954-.LBB954
+	.4byte	0x10739
 	.uleb128 0x5c
-	.4byte	0x13056
+	.4byte	0x12f4d
 	.uleb128 0x59
-	.4byte	0x134f1
-	.8byte	.LBB975
-	.8byte	.LBE975-.LBB975
+	.4byte	0x133e8
+	.8byte	.LBB955
+	.8byte	.LBE955-.LBB955
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x1350c
+	.4byte	0x13403
 	.uleb128 0x54
-	.4byte	0x13501
+	.4byte	0x133f8
 	.uleb128 0x5e
-	.8byte	.LBB976
-	.8byte	.LBE976-.LBB976
+	.8byte	.LBB956
+	.8byte	.LBE956-.LBB956
 	.uleb128 0x5c
-	.4byte	0x13517
+	.4byte	0x1340e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13441
-	.8byte	.LBB977
-	.8byte	.LBE977-.LBB977
+	.4byte	0x13338
+	.8byte	.LBB957
+	.8byte	.LBE957-.LBB957
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x1345b
+	.4byte	0x13352
 	.uleb128 0x54
-	.4byte	0x13451
+	.4byte	0x13348
 	.uleb128 0x59
-	.4byte	0x13523
-	.8byte	.LBB978
-	.8byte	.LBE978-.LBB978
+	.4byte	0x1341a
+	.8byte	.LBB958
+	.8byte	.LBE958-.LBB958
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x1353d
+	.4byte	0x13434
 	.uleb128 0x54
-	.4byte	0x13533
+	.4byte	0x1342a
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12fe5
-	.8byte	.LBB982
-	.8byte	.LBE982-.LBB982
+	.4byte	0x12edc
+	.8byte	.LBB962
+	.8byte	.LBE962-.LBB962
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x1086a
+	.4byte	0x1083a
 	.uleb128 0x54
-	.4byte	0x12ff5
+	.4byte	0x12eec
 	.uleb128 0x5e
-	.8byte	.LBB983
-	.8byte	.LBE983-.LBB983
+	.8byte	.LBB963
+	.8byte	.LBE963-.LBB963
 	.uleb128 0x5f
-	.4byte	0x13000
-	.4byte	.LLST30
+	.4byte	0x12ef7
+	.4byte	.LLST26
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x1a0
-	.4byte	0x10835
+	.4byte	.Ldebug_ranges0+0x170
+	.4byte	0x10805
 	.uleb128 0x5f
-	.4byte	0x1300c
-	.4byte	.LLST31
+	.4byte	0x12f03
+	.4byte	.LLST27
 	.uleb128 0x59
-	.4byte	0x134f1
-	.8byte	.LBB985
-	.8byte	.LBE985-.LBB985
+	.4byte	0x133e8
+	.8byte	.LBB965
+	.8byte	.LBE965-.LBB965
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x1350c
+	.4byte	0x13403
 	.uleb128 0x54
-	.4byte	0x13501
+	.4byte	0x133f8
 	.uleb128 0x5e
-	.8byte	.LBB986
-	.8byte	.LBE986-.LBB986
+	.8byte	.LBB966
+	.8byte	.LBE966-.LBB966
 	.uleb128 0x5c
-	.4byte	0x13517
+	.4byte	0x1340e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x1346d
-	.8byte	.LBB987
-	.8byte	.LBE987-.LBB987
+	.4byte	0x13364
+	.8byte	.LBB967
+	.8byte	.LBE967-.LBB967
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x5e
-	.8byte	.LBB988
-	.8byte	.LBE988-.LBB988
+	.8byte	.LBB968
+	.8byte	.LBE968-.LBB968
 	.uleb128 0x5f
-	.4byte	0x1347d
-	.4byte	.LLST32
+	.4byte	0x13374
+	.4byte	.LLST28
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL84
-	.4byte	0x13df5
+	.8byte	.LVL86
+	.4byte	0x13cec
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12f4d
-	.8byte	.LBB1002
-	.4byte	.Ldebug_ranges0+0x220
+	.4byte	0x12e44
+	.8byte	.LBB982
+	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
-	.2byte	0x511
-	.4byte	0x10aa5
+	.2byte	0x596
+	.4byte	0x10a75
 	.uleb128 0x54
-	.4byte	0x12f72
+	.4byte	0x12e69
 	.uleb128 0x54
-	.4byte	0x12f67
+	.4byte	0x12e5e
 	.uleb128 0x54
-	.4byte	0x12f5d
+	.4byte	0x12e54
 	.uleb128 0x6d
-	.4byte	0x12fab
-	.8byte	.LBB1003
-	.4byte	.Ldebug_ranges0+0x220
+	.4byte	0x12ea2
+	.8byte	.LBB983
+	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x12fd0
+	.4byte	0x12ec7
 	.uleb128 0x54
-	.4byte	0x12fc5
+	.4byte	0x12ebc
 	.uleb128 0x54
-	.4byte	0x12fbb
+	.4byte	0x12eb2
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x220
+	.4byte	.Ldebug_ranges0+0x1f0
 	.uleb128 0x5c
-	.4byte	0x12fd9
+	.4byte	0x12ed0
 	.uleb128 0x6e
-	.4byte	0x13019
-	.8byte	.LBB1005
-	.4byte	.Ldebug_ranges0+0x260
+	.4byte	0x12f10
+	.8byte	.LBB985
+	.4byte	.Ldebug_ranges0+0x230
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x109da
+	.4byte	0x109aa
 	.uleb128 0x54
-	.4byte	0x13034
+	.4byte	0x12f2b
 	.uleb128 0x6f
-	.4byte	0x13029
-	.4byte	.LLST34
+	.4byte	0x12f20
+	.4byte	.LLST30
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x260
+	.4byte	.Ldebug_ranges0+0x230
 	.uleb128 0x5f
-	.4byte	0x1303f
-	.4byte	.LLST35
+	.4byte	0x12f36
+	.4byte	.LLST31
 	.uleb128 0x5f
-	.4byte	0x1304a
-	.4byte	.LLST36
+	.4byte	0x12f41
+	.4byte	.LLST32
 	.uleb128 0x70
-	.4byte	0x1346d
-	.8byte	.LBB1007
-	.8byte	.LBE1007-.LBB1007
+	.4byte	0x13364
+	.8byte	.LBB987
+	.8byte	.LBE987-.LBB987
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10940
+	.4byte	0x10910
 	.uleb128 0x5e
-	.8byte	.LBB1008
-	.8byte	.LBE1008-.LBB1008
+	.8byte	.LBB988
+	.8byte	.LBE988-.LBB988
 	.uleb128 0x5f
-	.4byte	0x1347d
-	.4byte	.LLST37
+	.4byte	0x13374
+	.4byte	.LLST33
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1009
-	.8byte	.LBE1009-.LBB1009
-	.4byte	0x10994
+	.8byte	.LBB989
+	.8byte	.LBE989-.LBB989
+	.4byte	0x10964
 	.uleb128 0x5c
-	.4byte	0x13056
+	.4byte	0x12f4d
 	.uleb128 0x59
-	.4byte	0x134f1
-	.8byte	.LBB1010
-	.8byte	.LBE1010-.LBB1010
+	.4byte	0x133e8
+	.8byte	.LBB990
+	.8byte	.LBE990-.LBB990
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x1350c
+	.4byte	0x13403
 	.uleb128 0x54
-	.4byte	0x13501
+	.4byte	0x133f8
 	.uleb128 0x5e
-	.8byte	.LBB1011
-	.8byte	.LBE1011-.LBB1011
+	.8byte	.LBB991
+	.8byte	.LBE991-.LBB991
 	.uleb128 0x5c
-	.4byte	0x13517
+	.4byte	0x1340e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13441
-	.8byte	.LBB1012
-	.8byte	.LBE1012-.LBB1012
+	.4byte	0x13338
+	.8byte	.LBB992
+	.8byte	.LBE992-.LBB992
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x1345b
+	.4byte	0x13352
 	.uleb128 0x54
-	.4byte	0x13451
+	.4byte	0x13348
 	.uleb128 0x59
-	.4byte	0x13523
-	.8byte	.LBB1013
-	.8byte	.LBE1013-.LBB1013
+	.4byte	0x1341a
+	.8byte	.LBB993
+	.8byte	.LBE993-.LBB993
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x1353d
+	.4byte	0x13434
 	.uleb128 0x54
-	.4byte	0x13533
+	.4byte	0x1342a
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12fe5
-	.8byte	.LBB1017
-	.8byte	.LBE1017-.LBB1017
+	.4byte	0x12edc
+	.8byte	.LBB997
+	.8byte	.LBE997-.LBB997
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10a95
+	.4byte	0x10a65
 	.uleb128 0x54
-	.4byte	0x12ff5
+	.4byte	0x12eec
 	.uleb128 0x5e
-	.8byte	.LBB1018
-	.8byte	.LBE1018-.LBB1018
+	.8byte	.LBB998
+	.8byte	.LBE998-.LBB998
 	.uleb128 0x5f
-	.4byte	0x13000
-	.4byte	.LLST38
+	.4byte	0x12ef7
+	.4byte	.LLST34
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x2a0
-	.4byte	0x10a60
+	.4byte	.Ldebug_ranges0+0x270
+	.4byte	0x10a30
 	.uleb128 0x5f
-	.4byte	0x1300c
-	.4byte	.LLST39
+	.4byte	0x12f03
+	.4byte	.LLST35
 	.uleb128 0x59
-	.4byte	0x134f1
-	.8byte	.LBB1020
-	.8byte	.LBE1020-.LBB1020
+	.4byte	0x133e8
+	.8byte	.LBB1000
+	.8byte	.LBE1000-.LBB1000
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x1350c
+	.4byte	0x13403
 	.uleb128 0x54
-	.4byte	0x13501
+	.4byte	0x133f8
 	.uleb128 0x5e
-	.8byte	.LBB1021
-	.8byte	.LBE1021-.LBB1021
+	.8byte	.LBB1001
+	.8byte	.LBE1001-.LBB1001
 	.uleb128 0x5c
-	.4byte	0x13517
+	.4byte	0x1340e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x1346d
-	.8byte	.LBB1022
-	.8byte	.LBE1022-.LBB1022
+	.4byte	0x13364
+	.8byte	.LBB1002
+	.8byte	.LBE1002-.LBB1002
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x5e
-	.8byte	.LBB1023
-	.8byte	.LBE1023-.LBB1023
+	.8byte	.LBB1003
+	.8byte	.LBE1003-.LBB1003
 	.uleb128 0x5f
-	.4byte	0x1347d
-	.4byte	.LLST40
+	.4byte	0x13374
+	.4byte	.LLST36
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL108
-	.4byte	0x13df5
+	.8byte	.LVL110
+	.4byte	0x13cec
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12f1e
-	.8byte	.LBB1032
-	.4byte	.Ldebug_ranges0+0x2d0
+	.4byte	0x12e15
+	.8byte	.LBB1012
+	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x1
-	.2byte	0x4df
-	.4byte	0x10cc5
+	.2byte	0x564
+	.4byte	0x10c95
 	.uleb128 0x54
-	.4byte	0x12f43
+	.4byte	0x12e3a
 	.uleb128 0x54
-	.4byte	0x12f38
+	.4byte	0x12e2f
 	.uleb128 0x54
-	.4byte	0x12f2e
+	.4byte	0x12e25
 	.uleb128 0x6d
-	.4byte	0x12f7c
-	.8byte	.LBB1033
-	.4byte	.Ldebug_ranges0+0x2d0
+	.4byte	0x12e73
+	.8byte	.LBB1013
+	.4byte	.Ldebug_ranges0+0x2a0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12fa1
+	.4byte	0x12e98
 	.uleb128 0x54
-	.4byte	0x12f96
+	.4byte	0x12e8d
 	.uleb128 0x54
-	.4byte	0x12f8c
+	.4byte	0x12e83
 	.uleb128 0x6e
-	.4byte	0x13019
-	.8byte	.LBB1035
-	.4byte	.Ldebug_ranges0+0x320
+	.4byte	0x12f10
+	.8byte	.LBB1015
+	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10bfb
+	.4byte	0x10bcb
 	.uleb128 0x54
-	.4byte	0x13034
+	.4byte	0x12f2b
 	.uleb128 0x6f
-	.4byte	0x13029
-	.4byte	.LLST41
+	.4byte	0x12f20
+	.4byte	.LLST37
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x320
+	.4byte	.Ldebug_ranges0+0x2f0
 	.uleb128 0x5f
-	.4byte	0x1303f
-	.4byte	.LLST42
+	.4byte	0x12f36
+	.4byte	.LLST38
 	.uleb128 0x5f
-	.4byte	0x1304a
-	.4byte	.LLST43
+	.4byte	0x12f41
+	.4byte	.LLST39
 	.uleb128 0x70
-	.4byte	0x1346d
-	.8byte	.LBB1037
-	.8byte	.LBE1037-.LBB1037
+	.4byte	0x13364
+	.8byte	.LBB1017
+	.8byte	.LBE1017-.LBB1017
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10b61
+	.4byte	0x10b31
 	.uleb128 0x5e
-	.8byte	.LBB1038
-	.8byte	.LBE1038-.LBB1038
+	.8byte	.LBB1018
+	.8byte	.LBE1018-.LBB1018
 	.uleb128 0x5f
-	.4byte	0x1347d
-	.4byte	.LLST44
+	.4byte	0x13374
+	.4byte	.LLST40
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1039
-	.8byte	.LBE1039-.LBB1039
-	.4byte	0x10bb5
+	.8byte	.LBB1019
+	.8byte	.LBE1019-.LBB1019
+	.4byte	0x10b85
 	.uleb128 0x5c
-	.4byte	0x13056
+	.4byte	0x12f4d
 	.uleb128 0x59
-	.4byte	0x134f1
-	.8byte	.LBB1040
-	.8byte	.LBE1040-.LBB1040
+	.4byte	0x133e8
+	.8byte	.LBB1020
+	.8byte	.LBE1020-.LBB1020
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x1350c
+	.4byte	0x13403
 	.uleb128 0x54
-	.4byte	0x13501
+	.4byte	0x133f8
 	.uleb128 0x5e
-	.8byte	.LBB1041
-	.8byte	.LBE1041-.LBB1041
+	.8byte	.LBB1021
+	.8byte	.LBE1021-.LBB1021
 	.uleb128 0x5c
-	.4byte	0x13517
+	.4byte	0x1340e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13441
-	.8byte	.LBB1042
-	.8byte	.LBE1042-.LBB1042
+	.4byte	0x13338
+	.8byte	.LBB1022
+	.8byte	.LBE1022-.LBB1022
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x1345b
+	.4byte	0x13352
 	.uleb128 0x54
-	.4byte	0x13451
+	.4byte	0x13348
 	.uleb128 0x59
-	.4byte	0x13523
-	.8byte	.LBB1043
-	.8byte	.LBE1043-.LBB1043
+	.4byte	0x1341a
+	.8byte	.LBB1023
+	.8byte	.LBE1023-.LBB1023
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x1353d
+	.4byte	0x13434
 	.uleb128 0x54
-	.4byte	0x13533
+	.4byte	0x1342a
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12fe5
-	.8byte	.LBB1049
-	.8byte	.LBE1049-.LBB1049
+	.4byte	0x12edc
+	.8byte	.LBB1029
+	.8byte	.LBE1029-.LBB1029
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x10cb6
+	.4byte	0x10c86
 	.uleb128 0x54
-	.4byte	0x12ff5
+	.4byte	0x12eec
 	.uleb128 0x5e
-	.8byte	.LBB1050
-	.8byte	.LBE1050-.LBB1050
+	.8byte	.LBB1030
+	.8byte	.LBE1030-.LBB1030
 	.uleb128 0x5f
-	.4byte	0x13000
-	.4byte	.LLST45
+	.4byte	0x12ef7
+	.4byte	.LLST41
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x370
-	.4byte	0x10c81
+	.4byte	.Ldebug_ranges0+0x340
+	.4byte	0x10c51
 	.uleb128 0x5f
-	.4byte	0x1300c
-	.4byte	.LLST46
+	.4byte	0x12f03
+	.4byte	.LLST42
 	.uleb128 0x59
-	.4byte	0x134f1
-	.8byte	.LBB1052
-	.8byte	.LBE1052-.LBB1052
+	.4byte	0x133e8
+	.8byte	.LBB1032
+	.8byte	.LBE1032-.LBB1032
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x1350c
+	.4byte	0x13403
 	.uleb128 0x54
-	.4byte	0x13501
+	.4byte	0x133f8
 	.uleb128 0x5e
-	.8byte	.LBB1053
-	.8byte	.LBE1053-.LBB1053
+	.8byte	.LBB1033
+	.8byte	.LBE1033-.LBB1033
 	.uleb128 0x5c
-	.4byte	0x13517
+	.4byte	0x1340e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x1346d
-	.8byte	.LBB1054
-	.8byte	.LBE1054-.LBB1054
+	.4byte	0x13364
+	.8byte	.LBB1034
+	.8byte	.LBE1034-.LBB1034
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x5e
-	.8byte	.LBB1055
-	.8byte	.LBE1055-.LBB1055
+	.8byte	.LBB1035
+	.8byte	.LBE1035-.LBB1035
 	.uleb128 0x5f
-	.4byte	0x1347d
-	.4byte	.LLST47
+	.4byte	0x13374
+	.4byte	.LLST43
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL135
-	.4byte	0x13de8
+	.8byte	.LVL137
+	.4byte	0x13cdf
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12f4d
-	.8byte	.LBB1066
-	.4byte	.Ldebug_ranges0+0x3a0
+	.4byte	0x12e44
+	.8byte	.LBB1046
+	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x1
-	.2byte	0x52e
-	.4byte	0x10f01
+	.2byte	0x5b3
+	.4byte	0x10ed1
 	.uleb128 0x54
-	.4byte	0x12f72
+	.4byte	0x12e69
 	.uleb128 0x54
-	.4byte	0x12f67
+	.4byte	0x12e5e
 	.uleb128 0x54
-	.4byte	0x12f5d
+	.4byte	0x12e54
 	.uleb128 0x6d
-	.4byte	0x12fab
-	.8byte	.LBB1067
-	.4byte	.Ldebug_ranges0+0x3a0
+	.4byte	0x12ea2
+	.8byte	.LBB1047
+	.4byte	.Ldebug_ranges0+0x370
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x12fd0
+	.4byte	0x12ec7
 	.uleb128 0x54
-	.4byte	0x12fc5
+	.4byte	0x12ebc
 	.uleb128 0x54
-	.4byte	0x12fbb
+	.4byte	0x12eb2
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x3a0
+	.4byte	.Ldebug_ranges0+0x370
 	.uleb128 0x5f
-	.4byte	0x12fd9
-	.4byte	.LLST48
+	.4byte	0x12ed0
+	.4byte	.LLST44
 	.uleb128 0x6e
-	.4byte	0x13019
-	.8byte	.LBB1069
-	.4byte	.Ldebug_ranges0+0x400
+	.4byte	0x12f10
+	.8byte	.LBB1049
+	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x10e29
+	.4byte	0x10df9
 	.uleb128 0x54
-	.4byte	0x13034
+	.4byte	0x12f2b
 	.uleb128 0x6f
-	.4byte	0x13029
-	.4byte	.LLST49
+	.4byte	0x12f20
+	.4byte	.LLST45
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x400
+	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x5f
-	.4byte	0x1303f
-	.4byte	.LLST50
+	.4byte	0x12f36
+	.4byte	.LLST46
 	.uleb128 0x5f
-	.4byte	0x1304a
-	.4byte	.LLST51
+	.4byte	0x12f41
+	.4byte	.LLST47
 	.uleb128 0x70
-	.4byte	0x1346d
-	.8byte	.LBB1071
-	.8byte	.LBE1071-.LBB1071
+	.4byte	0x13364
+	.8byte	.LBB1051
+	.8byte	.LBE1051-.LBB1051
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10d8f
+	.4byte	0x10d5f
 	.uleb128 0x5e
-	.8byte	.LBB1072
-	.8byte	.LBE1072-.LBB1072
+	.8byte	.LBB1052
+	.8byte	.LBE1052-.LBB1052
 	.uleb128 0x5f
-	.4byte	0x1347d
-	.4byte	.LLST52
+	.4byte	0x13374
+	.4byte	.LLST48
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1073
-	.8byte	.LBE1073-.LBB1073
-	.4byte	0x10de3
+	.8byte	.LBB1053
+	.8byte	.LBE1053-.LBB1053
+	.4byte	0x10db3
 	.uleb128 0x5c
-	.4byte	0x13056
+	.4byte	0x12f4d
 	.uleb128 0x59
-	.4byte	0x134f1
-	.8byte	.LBB1074
-	.8byte	.LBE1074-.LBB1074
+	.4byte	0x133e8
+	.8byte	.LBB1054
+	.8byte	.LBE1054-.LBB1054
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x1350c
+	.4byte	0x13403
 	.uleb128 0x54
-	.4byte	0x13501
+	.4byte	0x133f8
 	.uleb128 0x5e
-	.8byte	.LBB1075
-	.8byte	.LBE1075-.LBB1075
+	.8byte	.LBB1055
+	.8byte	.LBE1055-.LBB1055
 	.uleb128 0x5c
-	.4byte	0x13517
+	.4byte	0x1340e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13441
-	.8byte	.LBB1076
-	.8byte	.LBE1076-.LBB1076
+	.4byte	0x13338
+	.8byte	.LBB1056
+	.8byte	.LBE1056-.LBB1056
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x1345b
+	.4byte	0x13352
 	.uleb128 0x54
-	.4byte	0x13451
+	.4byte	0x13348
 	.uleb128 0x59
-	.4byte	0x13523
-	.8byte	.LBB1077
-	.8byte	.LBE1077-.LBB1077
+	.4byte	0x1341a
+	.8byte	.LBB1057
+	.8byte	.LBE1057-.LBB1057
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x1353d
+	.4byte	0x13434
 	.uleb128 0x54
-	.4byte	0x13533
+	.4byte	0x1342a
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12fe5
-	.8byte	.LBB1083
-	.8byte	.LBE1083-.LBB1083
+	.4byte	0x12edc
+	.8byte	.LBB1063
+	.8byte	.LBE1063-.LBB1063
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10ee4
+	.4byte	0x10eb4
 	.uleb128 0x54
-	.4byte	0x12ff5
+	.4byte	0x12eec
 	.uleb128 0x5e
-	.8byte	.LBB1084
-	.8byte	.LBE1084-.LBB1084
+	.8byte	.LBB1064
+	.8byte	.LBE1064-.LBB1064
 	.uleb128 0x5f
-	.4byte	0x13000
-	.4byte	.LLST53
+	.4byte	0x12ef7
+	.4byte	.LLST49
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x450
-	.4byte	0x10eaf
+	.4byte	.Ldebug_ranges0+0x420
+	.4byte	0x10e7f
 	.uleb128 0x5f
-	.4byte	0x1300c
-	.4byte	.LLST54
+	.4byte	0x12f03
+	.4byte	.LLST50
 	.uleb128 0x59
-	.4byte	0x134f1
-	.8byte	.LBB1086
-	.8byte	.LBE1086-.LBB1086
+	.4byte	0x133e8
+	.8byte	.LBB1066
+	.8byte	.LBE1066-.LBB1066
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x1350c
+	.4byte	0x13403
 	.uleb128 0x54
-	.4byte	0x13501
+	.4byte	0x133f8
 	.uleb128 0x5e
-	.8byte	.LBB1087
-	.8byte	.LBE1087-.LBB1087
+	.8byte	.LBB1067
+	.8byte	.LBE1067-.LBB1067
 	.uleb128 0x5c
-	.4byte	0x13517
+	.4byte	0x1340e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x1346d
-	.8byte	.LBB1088
-	.8byte	.LBE1088-.LBB1088
+	.4byte	0x13364
+	.8byte	.LBB1068
+	.8byte	.LBE1068-.LBB1068
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x5e
-	.8byte	.LBB1089
-	.8byte	.LBE1089-.LBB1089
+	.8byte	.LBB1069
+	.8byte	.LBE1069-.LBB1069
 	.uleb128 0x5f
-	.4byte	0x1347d
-	.4byte	.LLST55
+	.4byte	0x13374
+	.4byte	.LLST51
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL147
-	.4byte	0x13df5
+	.8byte	.LVL149
+	.4byte	0x13cec
 	.uleb128 0x4e
-	.8byte	.LVL225
-	.4byte	0x13c3e
+	.8byte	.LVL227
+	.4byte	0x13b35
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12f1e
-	.8byte	.LBB1102
-	.4byte	.Ldebug_ranges0+0x480
+	.4byte	0x12e15
+	.8byte	.LBB1082
+	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x1
-	.2byte	0x54b
-	.4byte	0x10fb3
+	.2byte	0x5d0
+	.4byte	0x10f83
 	.uleb128 0x54
-	.4byte	0x12f43
+	.4byte	0x12e3a
 	.uleb128 0x54
-	.4byte	0x12f38
+	.4byte	0x12e2f
 	.uleb128 0x54
-	.4byte	0x12f2e
+	.4byte	0x12e25
 	.uleb128 0x6d
-	.4byte	0x12f7c
-	.8byte	.LBB1103
-	.4byte	.Ldebug_ranges0+0x480
+	.4byte	0x12e73
+	.8byte	.LBB1083
+	.4byte	.Ldebug_ranges0+0x450
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12fa1
+	.4byte	0x12e98
 	.uleb128 0x54
-	.4byte	0x12f96
+	.4byte	0x12e8d
 	.uleb128 0x54
-	.4byte	0x12f8c
+	.4byte	0x12e83
 	.uleb128 0x6d
-	.4byte	0x13019
-	.8byte	.LBB1105
-	.4byte	.Ldebug_ranges0+0x4b0
+	.4byte	0x12f10
+	.8byte	.LBB1085
+	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x54
-	.4byte	0x13034
+	.4byte	0x12f2b
 	.uleb128 0x71
-	.4byte	0x13029
+	.4byte	0x12f20
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x4e0
+	.4byte	.Ldebug_ranges0+0x4b0
 	.uleb128 0x5c
-	.4byte	0x1303f
+	.4byte	0x12f36
 	.uleb128 0x5f
-	.4byte	0x1304a
-	.4byte	.LLST56
+	.4byte	0x12f41
+	.4byte	.LLST52
 	.uleb128 0x59
-	.4byte	0x1346d
-	.8byte	.LBB1107
-	.8byte	.LBE1107-.LBB1107
+	.4byte	0x13364
+	.8byte	.LBB1087
+	.8byte	.LBE1087-.LBB1087
 	.byte	0x6
 	.byte	0x4d
 	.uleb128 0x5e
-	.8byte	.LBB1108
-	.8byte	.LBE1108-.LBB1108
+	.8byte	.LBB1088
+	.8byte	.LBE1088-.LBB1088
 	.uleb128 0x5f
-	.4byte	0x1347d
-	.4byte	.LLST57
+	.4byte	0x13374
+	.4byte	.LLST53
 	.byte	0
 	.byte	0
 	.byte	0
@@ -40106,580 +40322,580 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12f1e
-	.8byte	.LBB1114
-	.4byte	.Ldebug_ranges0+0x510
+	.4byte	0x12e15
+	.8byte	.LBB1094
+	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x1
-	.2byte	0x53b
-	.4byte	0x111d3
+	.2byte	0x5c0
+	.4byte	0x111a3
 	.uleb128 0x54
-	.4byte	0x12f43
+	.4byte	0x12e3a
 	.uleb128 0x54
-	.4byte	0x12f38
+	.4byte	0x12e2f
 	.uleb128 0x54
-	.4byte	0x12f2e
+	.4byte	0x12e25
 	.uleb128 0x6d
-	.4byte	0x12f7c
-	.8byte	.LBB1115
-	.4byte	.Ldebug_ranges0+0x510
+	.4byte	0x12e73
+	.8byte	.LBB1095
+	.4byte	.Ldebug_ranges0+0x4e0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12fa1
+	.4byte	0x12e98
 	.uleb128 0x54
-	.4byte	0x12f96
+	.4byte	0x12e8d
 	.uleb128 0x54
-	.4byte	0x12f8c
+	.4byte	0x12e83
 	.uleb128 0x6e
-	.4byte	0x13019
-	.8byte	.LBB1117
-	.4byte	.Ldebug_ranges0+0x570
+	.4byte	0x12f10
+	.8byte	.LBB1097
+	.4byte	.Ldebug_ranges0+0x540
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x11109
+	.4byte	0x110d9
 	.uleb128 0x54
-	.4byte	0x13034
+	.4byte	0x12f2b
 	.uleb128 0x6f
-	.4byte	0x13029
-	.4byte	.LLST58
+	.4byte	0x12f20
+	.4byte	.LLST54
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x570
+	.4byte	.Ldebug_ranges0+0x540
 	.uleb128 0x5f
-	.4byte	0x1303f
-	.4byte	.LLST59
+	.4byte	0x12f36
+	.4byte	.LLST55
 	.uleb128 0x5f
-	.4byte	0x1304a
-	.4byte	.LLST60
+	.4byte	0x12f41
+	.4byte	.LLST56
 	.uleb128 0x70
-	.4byte	0x1346d
-	.8byte	.LBB1119
-	.8byte	.LBE1119-.LBB1119
+	.4byte	0x13364
+	.8byte	.LBB1099
+	.8byte	.LBE1099-.LBB1099
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x1106f
+	.4byte	0x1103f
 	.uleb128 0x5e
-	.8byte	.LBB1120
-	.8byte	.LBE1120-.LBB1120
+	.8byte	.LBB1100
+	.8byte	.LBE1100-.LBB1100
 	.uleb128 0x5f
-	.4byte	0x1347d
-	.4byte	.LLST61
+	.4byte	0x13374
+	.4byte	.LLST57
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1121
-	.8byte	.LBE1121-.LBB1121
-	.4byte	0x110c3
+	.8byte	.LBB1101
+	.8byte	.LBE1101-.LBB1101
+	.4byte	0x11093
 	.uleb128 0x5c
-	.4byte	0x13056
+	.4byte	0x12f4d
 	.uleb128 0x59
-	.4byte	0x134f1
-	.8byte	.LBB1122
-	.8byte	.LBE1122-.LBB1122
+	.4byte	0x133e8
+	.8byte	.LBB1102
+	.8byte	.LBE1102-.LBB1102
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x1350c
+	.4byte	0x13403
 	.uleb128 0x54
-	.4byte	0x13501
+	.4byte	0x133f8
 	.uleb128 0x5e
-	.8byte	.LBB1123
-	.8byte	.LBE1123-.LBB1123
+	.8byte	.LBB1103
+	.8byte	.LBE1103-.LBB1103
 	.uleb128 0x5c
-	.4byte	0x13517
+	.4byte	0x1340e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13441
-	.8byte	.LBB1124
-	.8byte	.LBE1124-.LBB1124
+	.4byte	0x13338
+	.8byte	.LBB1104
+	.8byte	.LBE1104-.LBB1104
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x1345b
+	.4byte	0x13352
 	.uleb128 0x54
-	.4byte	0x13451
+	.4byte	0x13348
 	.uleb128 0x59
-	.4byte	0x13523
-	.8byte	.LBB1125
-	.8byte	.LBE1125-.LBB1125
+	.4byte	0x1341a
+	.8byte	.LBB1105
+	.8byte	.LBE1105-.LBB1105
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x1353d
+	.4byte	0x13434
 	.uleb128 0x54
-	.4byte	0x13533
+	.4byte	0x1342a
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12fe5
-	.8byte	.LBB1133
-	.8byte	.LBE1133-.LBB1133
+	.4byte	0x12edc
+	.8byte	.LBB1113
+	.8byte	.LBE1113-.LBB1113
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x111c4
+	.4byte	0x11194
 	.uleb128 0x54
-	.4byte	0x12ff5
+	.4byte	0x12eec
 	.uleb128 0x5e
-	.8byte	.LBB1134
-	.8byte	.LBE1134-.LBB1134
+	.8byte	.LBB1114
+	.8byte	.LBE1114-.LBB1114
 	.uleb128 0x5f
-	.4byte	0x13000
-	.4byte	.LLST62
+	.4byte	0x12ef7
+	.4byte	.LLST58
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x5c0
-	.4byte	0x1118f
+	.4byte	.Ldebug_ranges0+0x590
+	.4byte	0x1115f
 	.uleb128 0x5f
-	.4byte	0x1300c
-	.4byte	.LLST63
+	.4byte	0x12f03
+	.4byte	.LLST59
 	.uleb128 0x59
-	.4byte	0x134f1
-	.8byte	.LBB1136
-	.8byte	.LBE1136-.LBB1136
+	.4byte	0x133e8
+	.8byte	.LBB1116
+	.8byte	.LBE1116-.LBB1116
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x1350c
+	.4byte	0x13403
 	.uleb128 0x54
-	.4byte	0x13501
+	.4byte	0x133f8
 	.uleb128 0x5e
-	.8byte	.LBB1137
-	.8byte	.LBE1137-.LBB1137
+	.8byte	.LBB1117
+	.8byte	.LBE1117-.LBB1117
 	.uleb128 0x5c
-	.4byte	0x13517
+	.4byte	0x1340e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x1346d
-	.8byte	.LBB1138
-	.8byte	.LBE1138-.LBB1138
+	.4byte	0x13364
+	.8byte	.LBB1118
+	.8byte	.LBE1118-.LBB1118
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x5e
-	.8byte	.LBB1139
-	.8byte	.LBE1139-.LBB1139
+	.8byte	.LBB1119
+	.8byte	.LBE1119-.LBB1119
 	.uleb128 0x5f
-	.4byte	0x1347d
-	.4byte	.LLST64
+	.4byte	0x13374
+	.4byte	.LLST60
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL208
-	.4byte	0x13de8
+	.8byte	.LVL210
+	.4byte	0x13cdf
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12f1e
-	.8byte	.LBB1150
-	.4byte	.Ldebug_ranges0+0x5f0
+	.4byte	0x12e15
+	.8byte	.LBB1130
+	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x1
-	.2byte	0x4ed
-	.4byte	0x113f3
+	.2byte	0x572
+	.4byte	0x113c3
 	.uleb128 0x54
-	.4byte	0x12f43
+	.4byte	0x12e3a
 	.uleb128 0x54
-	.4byte	0x12f38
+	.4byte	0x12e2f
 	.uleb128 0x54
-	.4byte	0x12f2e
+	.4byte	0x12e25
 	.uleb128 0x6d
-	.4byte	0x12f7c
-	.8byte	.LBB1151
-	.4byte	.Ldebug_ranges0+0x5f0
+	.4byte	0x12e73
+	.8byte	.LBB1131
+	.4byte	.Ldebug_ranges0+0x5c0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12fa1
+	.4byte	0x12e98
 	.uleb128 0x54
-	.4byte	0x12f96
+	.4byte	0x12e8d
 	.uleb128 0x54
-	.4byte	0x12f8c
+	.4byte	0x12e83
 	.uleb128 0x6e
-	.4byte	0x13019
-	.8byte	.LBB1153
-	.4byte	.Ldebug_ranges0+0x650
+	.4byte	0x12f10
+	.8byte	.LBB1133
+	.4byte	.Ldebug_ranges0+0x620
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x11329
+	.4byte	0x112f9
 	.uleb128 0x54
-	.4byte	0x13034
+	.4byte	0x12f2b
 	.uleb128 0x6f
-	.4byte	0x13029
-	.4byte	.LLST65
+	.4byte	0x12f20
+	.4byte	.LLST61
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x650
+	.4byte	.Ldebug_ranges0+0x620
 	.uleb128 0x5f
-	.4byte	0x1303f
-	.4byte	.LLST66
+	.4byte	0x12f36
+	.4byte	.LLST62
 	.uleb128 0x5f
-	.4byte	0x1304a
-	.4byte	.LLST67
+	.4byte	0x12f41
+	.4byte	.LLST63
 	.uleb128 0x70
-	.4byte	0x1346d
-	.8byte	.LBB1155
-	.8byte	.LBE1155-.LBB1155
+	.4byte	0x13364
+	.8byte	.LBB1135
+	.8byte	.LBE1135-.LBB1135
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x1128f
+	.4byte	0x1125f
 	.uleb128 0x5e
-	.8byte	.LBB1156
-	.8byte	.LBE1156-.LBB1156
+	.8byte	.LBB1136
+	.8byte	.LBE1136-.LBB1136
 	.uleb128 0x5f
-	.4byte	0x1347d
-	.4byte	.LLST68
+	.4byte	0x13374
+	.4byte	.LLST64
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1157
-	.8byte	.LBE1157-.LBB1157
-	.4byte	0x112e3
+	.8byte	.LBB1137
+	.8byte	.LBE1137-.LBB1137
+	.4byte	0x112b3
 	.uleb128 0x5c
-	.4byte	0x13056
+	.4byte	0x12f4d
 	.uleb128 0x59
-	.4byte	0x134f1
-	.8byte	.LBB1158
-	.8byte	.LBE1158-.LBB1158
+	.4byte	0x133e8
+	.8byte	.LBB1138
+	.8byte	.LBE1138-.LBB1138
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x1350c
+	.4byte	0x13403
 	.uleb128 0x54
-	.4byte	0x13501
+	.4byte	0x133f8
 	.uleb128 0x5e
-	.8byte	.LBB1159
-	.8byte	.LBE1159-.LBB1159
+	.8byte	.LBB1139
+	.8byte	.LBE1139-.LBB1139
 	.uleb128 0x5c
-	.4byte	0x13517
+	.4byte	0x1340e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13441
-	.8byte	.LBB1160
-	.8byte	.LBE1160-.LBB1160
+	.4byte	0x13338
+	.8byte	.LBB1140
+	.8byte	.LBE1140-.LBB1140
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x1345b
+	.4byte	0x13352
 	.uleb128 0x54
-	.4byte	0x13451
+	.4byte	0x13348
 	.uleb128 0x59
-	.4byte	0x13523
-	.8byte	.LBB1161
-	.8byte	.LBE1161-.LBB1161
+	.4byte	0x1341a
+	.8byte	.LBB1141
+	.8byte	.LBE1141-.LBB1141
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x1353d
+	.4byte	0x13434
 	.uleb128 0x54
-	.4byte	0x13533
+	.4byte	0x1342a
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12fe5
-	.8byte	.LBB1169
-	.8byte	.LBE1169-.LBB1169
+	.4byte	0x12edc
+	.8byte	.LBB1149
+	.8byte	.LBE1149-.LBB1149
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x113e4
+	.4byte	0x113b4
 	.uleb128 0x54
-	.4byte	0x12ff5
+	.4byte	0x12eec
 	.uleb128 0x5e
-	.8byte	.LBB1170
-	.8byte	.LBE1170-.LBB1170
+	.8byte	.LBB1150
+	.8byte	.LBE1150-.LBB1150
 	.uleb128 0x5f
-	.4byte	0x13000
-	.4byte	.LLST69
+	.4byte	0x12ef7
+	.4byte	.LLST65
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x6a0
-	.4byte	0x113af
+	.4byte	.Ldebug_ranges0+0x670
+	.4byte	0x1137f
 	.uleb128 0x5f
-	.4byte	0x1300c
-	.4byte	.LLST70
+	.4byte	0x12f03
+	.4byte	.LLST66
 	.uleb128 0x59
-	.4byte	0x134f1
-	.8byte	.LBB1172
-	.8byte	.LBE1172-.LBB1172
+	.4byte	0x133e8
+	.8byte	.LBB1152
+	.8byte	.LBE1152-.LBB1152
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x1350c
+	.4byte	0x13403
 	.uleb128 0x54
-	.4byte	0x13501
+	.4byte	0x133f8
 	.uleb128 0x5e
-	.8byte	.LBB1173
-	.8byte	.LBE1173-.LBB1173
+	.8byte	.LBB1153
+	.8byte	.LBE1153-.LBB1153
 	.uleb128 0x5c
-	.4byte	0x13517
+	.4byte	0x1340e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x1346d
-	.8byte	.LBB1174
-	.8byte	.LBE1174-.LBB1174
+	.4byte	0x13364
+	.8byte	.LBB1154
+	.8byte	.LBE1154-.LBB1154
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x5e
-	.8byte	.LBB1175
-	.8byte	.LBE1175-.LBB1175
+	.8byte	.LBB1155
+	.8byte	.LBE1155-.LBB1155
 	.uleb128 0x5f
-	.4byte	0x1347d
-	.4byte	.LLST71
+	.4byte	0x13374
+	.4byte	.LLST67
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL216
-	.4byte	0x13de8
+	.8byte	.LVL218
+	.4byte	0x13cdf
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL49
-	.4byte	0x13cc3
-	.uleb128 0x4e
-	.8byte	.LVL50
-	.4byte	0x13d01
-	.uleb128 0x4e
 	.8byte	.LVL51
-	.4byte	0x13d9d
+	.4byte	0x13bba
 	.uleb128 0x4e
-	.8byte	.LVL62
-	.4byte	0x13e02
+	.8byte	.LVL52
+	.4byte	0x13c10
 	.uleb128 0x4e
-	.8byte	.LVL65
-	.4byte	0x13c54
+	.8byte	.LVL53
+	.4byte	0x13c94
 	.uleb128 0x4e
-	.8byte	.LVL68
-	.4byte	0x13bda
+	.8byte	.LVL64
+	.4byte	0x13cf9
 	.uleb128 0x4e
-	.8byte	.LVL85
-	.4byte	0x13d9d
+	.8byte	.LVL67
+	.4byte	0x13b4b
 	.uleb128 0x4e
-	.8byte	.LVL86
-	.4byte	0x13e0e
+	.8byte	.LVL70
+	.4byte	0x13ad1
 	.uleb128 0x4e
-	.8byte	.LVL88
-	.4byte	0x13ccf
+	.8byte	.LVL87
+	.4byte	0x13c94
 	.uleb128 0x4e
-	.8byte	.LVL95
-	.4byte	0x13cc3
+	.8byte	.LVL88
+	.4byte	0x13d05
 	.uleb128 0x4e
-	.8byte	.LVL109
-	.4byte	0x13e1a
+	.8byte	.LVL90
+	.4byte	0x13bc6
 	.uleb128 0x4e
-	.8byte	.LVL110
-	.4byte	0x13ccf
+	.8byte	.LVL97
+	.4byte	0x13bba
 	.uleb128 0x4e
 	.8byte	.LVL111
-	.4byte	0x13d23
+	.4byte	0x13d11
 	.uleb128 0x4e
-	.8byte	.LVL121
-	.4byte	0x13e26
+	.8byte	.LVL112
+	.4byte	0x13bc6
 	.uleb128 0x4e
-	.8byte	.LVL122
-	.4byte	0x13d9d
+	.8byte	.LVL113
+	.4byte	0x13c1a
 	.uleb128 0x4e
-	.8byte	.LVL149
-	.4byte	0x13bda
+	.8byte	.LVL123
+	.4byte	0x13d1d
 	.uleb128 0x4e
-	.8byte	.LVL152
-	.4byte	0x13bda
+	.8byte	.LVL124
+	.4byte	0x13c94
+	.uleb128 0x4e
+	.8byte	.LVL151
+	.4byte	0x13ad1
 	.uleb128 0x4e
 	.8byte	.LVL154
-	.4byte	0x13cc3
+	.4byte	0x13ad1
 	.uleb128 0x4e
 	.8byte	.LVL156
-	.4byte	0x13cc3
-	.uleb128 0x4e
-	.8byte	.LVL157
-	.4byte	0x13d01
+	.4byte	0x13bba
 	.uleb128 0x4e
 	.8byte	.LVL158
-	.4byte	0x13d9d
+	.4byte	0x13bba
 	.uleb128 0x4e
-	.8byte	.LVL171
-	.4byte	0x13c54
+	.8byte	.LVL159
+	.4byte	0x13c10
 	.uleb128 0x4e
-	.8byte	.LVL174
-	.4byte	0x13c54
+	.8byte	.LVL160
+	.4byte	0x13c94
+	.uleb128 0x4e
+	.8byte	.LVL173
+	.4byte	0x13b4b
 	.uleb128 0x4e
 	.8byte	.LVL176
-	.4byte	0x13cc3
+	.4byte	0x13b4b
 	.uleb128 0x4e
-	.8byte	.LVL177
-	.4byte	0x13d9d
+	.8byte	.LVL178
+	.4byte	0x13bba
 	.uleb128 0x4e
-	.8byte	.LVL185
-	.4byte	0x13e02
+	.8byte	.LVL179
+	.4byte	0x13c94
 	.uleb128 0x4e
-	.8byte	.LVL219
-	.4byte	0x13d23
+	.8byte	.LVL187
+	.4byte	0x13cf9
 	.uleb128 0x4e
-	.8byte	.LVL226
-	.4byte	0x13c54
+	.8byte	.LVL221
+	.4byte	0x13c1a
 	.uleb128 0x4e
-	.8byte	.LVL227
-	.4byte	0x13d61
+	.8byte	.LVL228
+	.4byte	0x13b4b
+	.uleb128 0x4e
+	.8byte	.LVL229
+	.4byte	0x13c58
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0x1157d
+	.4byte	0x1154d
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xa
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x1156d
+	.4byte	0x1153d
 	.uleb128 0x62
 	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x474
+	.2byte	0x4f9
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x115ac
+	.4byte	0x1157c
 	.uleb128 0x64
-	.4byte	.LASF2996
+	.4byte	.LASF2995
 	.byte	0x1
-	.2byte	0x474
+	.2byte	0x4f9
 	.4byte	0xe123
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x476
+	.2byte	0x4fb
 	.4byte	0xa545
 	.byte	0
 	.uleb128 0x4d
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x46e
+	.2byte	0x4f3
 	.8byte	.LFB2822
 	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x115e6
+	.4byte	0x115b6
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x46e
+	.2byte	0x4f3
 	.4byte	0x31a7
-	.4byte	.LLST72
+	.4byte	.LLST68
 	.uleb128 0x4e
-	.8byte	.LVL240
-	.4byte	0x120b5
+	.8byte	.LVL242
+	.4byte	0x120a1
 	.byte	0
 	.uleb128 0x4d
 	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x462
+	.2byte	0x4e7
 	.8byte	.LFB2821
 	.8byte	.LFE2821-.LFB2821
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11646
+	.4byte	0x11616
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x462
+	.2byte	0x4e7
 	.4byte	0x31a7
-	.4byte	.LLST12
+	.4byte	.LLST8
 	.uleb128 0x46
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x464
-	.4byte	0xe707
+	.2byte	0x4e9
+	.4byte	0xe710
 	.uleb128 0x5d
-	.4byte	0x12eb0
-	.8byte	.LBB930
-	.4byte	.Ldebug_ranges0+0x30
+	.4byte	0x12da7
+	.8byte	.LBB910
+	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.2byte	0x468
+	.2byte	0x4ed
 	.uleb128 0x54
-	.4byte	0x12ebc
+	.4byte	0x12db3
 	.uleb128 0x4e
-	.8byte	.LVL39
-	.4byte	0x13e32
+	.8byte	.LVL41
+	.4byte	0x13d29
 	.byte	0
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x452
+	.2byte	0x4d7
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11670
+	.4byte	0x11640
 	.uleb128 0x64
-	.4byte	.LASF2996
+	.4byte	.LASF2995
 	.byte	0x1
-	.2byte	0x452
+	.2byte	0x4d7
 	.4byte	0xe123
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x454
-	.4byte	0xe408
+	.2byte	0x4d9
+	.4byte	0xe3fc
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x317
+	.2byte	0x39c
 	.4byte	0xc6
 	.8byte	.LFB2819
 	.8byte	.LFE2819-.LFB2819
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11ec4
+	.4byte	0x11eb0
 	.uleb128 0x51
 	.string	"ptr"
 	.byte	0x1
-	.2byte	0x317
+	.2byte	0x39c
 	.4byte	0x443
-	.4byte	.LLST154
+	.4byte	.LLST150
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x319
-	.4byte	0xe46d
-	.4byte	.LLST155
+	.2byte	0x39e
+	.4byte	0xe461
+	.4byte	.LLST151
 	.uleb128 0x46
-	.4byte	.LASF2996
+	.4byte	.LASF2995
 	.byte	0x1
-	.2byte	0x31a
+	.2byte	0x39f
 	.4byte	0xe123
 	.uleb128 0x46
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x31b
-	.4byte	0xe707
+	.2byte	0x3a0
+	.4byte	0xe710
 	.uleb128 0x68
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x31c
-	.4byte	0xe408
-	.4byte	.LLST156
+	.2byte	0x3a1
+	.4byte	0xe3fc
+	.4byte	.LLST152
 	.uleb128 0x57
 	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0x31d
+	.2byte	0x3a2
 	.4byte	0xc6
-	.4byte	.LLST157
+	.4byte	.LLST153
 	.uleb128 0x57
 	.4byte	.LASF2965
 	.byte	0x1
-	.2byte	0x31e
+	.2byte	0x3a3
 	.4byte	0xc6
-	.4byte	.LLST158
+	.4byte	.LLST154
 	.uleb128 0x4c
 	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0x31f
+	.2byte	0x3a4
 	.4byte	0xd8bb
 	.uleb128 0x3
 	.byte	0x91
@@ -40687,34 +40903,34 @@ __exitcall_ebc_exit:
 	.uleb128 0x57
 	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0x320
-	.4byte	0xe408
-	.4byte	.LLST159
+	.2byte	0x3a5
+	.4byte	0xe3fc
+	.4byte	.LLST155
 	.uleb128 0x6b
 	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0x422
-	.8byte	.L640
+	.2byte	0x4a7
+	.8byte	.L645
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x1040
-	.4byte	0x117cc
+	.4byte	.Ldebug_ranges0+0xfd0
+	.4byte	0x1179c
 	.uleb128 0x46
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x35f
+	.2byte	0x3e4
 	.4byte	0xc6
 	.uleb128 0x5e
-	.8byte	.LBB1740
-	.8byte	.LBE1740-.LBB1740
+	.8byte	.LBB1713
+	.8byte	.LBE1713-.LBB1713
 	.uleb128 0x6b
 	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x35f
-	.8byte	.L621
+	.2byte	0x3e4
+	.8byte	.L627
 	.uleb128 0x4c
 	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x35f
+	.2byte	0x3e4
 	.4byte	0x14fd
 	.uleb128 0x3
 	.byte	0x91
@@ -40722,52 +40938,52 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x35f
+	.2byte	0x3e4
 	.4byte	0x194
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x1070
-	.4byte	0x117b0
+	.4byte	.Ldebug_ranges0+0x1000
+	.4byte	0x11780
 	.uleb128 0x57
 	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x35f
+	.2byte	0x3e4
 	.4byte	0x194
-	.4byte	.LLST174
+	.4byte	.LLST170
 	.uleb128 0x4e
-	.8byte	.LVL777
-	.4byte	0x13db6
+	.8byte	.LVL785
+	.4byte	0x13cad
 	.uleb128 0x4e
-	.8byte	.LVL778
-	.4byte	0x13dc2
+	.8byte	.LVL786
+	.4byte	0x13cb9
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL775
-	.4byte	0x13dcf
+	.8byte	.LVL783
+	.4byte	0x13cc6
 	.uleb128 0x4e
-	.8byte	.LVL779
-	.4byte	0x13ddb
+	.8byte	.LVL787
+	.4byte	0x13cd2
 	.byte	0
 	.byte	0
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xf70
-	.4byte	0x1186e
+	.4byte	.Ldebug_ranges0+0xf10
+	.4byte	0x1183e
 	.uleb128 0x46
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x411
+	.2byte	0x496
 	.4byte	0xc6
 	.uleb128 0x5e
-	.8byte	.LBB1723
-	.8byte	.LBE1723-.LBB1723
+	.8byte	.LBB1697
+	.8byte	.LBE1697-.LBB1697
 	.uleb128 0x6b
 	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x411
-	.8byte	.L668
+	.2byte	0x496
+	.8byte	.L682
 	.uleb128 0x4c
 	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x411
+	.2byte	0x496
 	.4byte	0x14fd
 	.uleb128 0x3
 	.byte	0x91
@@ -40775,52 +40991,52 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x411
+	.2byte	0x496
 	.4byte	0x194
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xfa0
-	.4byte	0x11852
+	.4byte	.Ldebug_ranges0+0xf40
+	.4byte	0x11822
 	.uleb128 0x57
 	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x411
+	.2byte	0x496
 	.4byte	0x194
-	.4byte	.LLST162
+	.4byte	.LLST158
 	.uleb128 0x4e
-	.8byte	.LVL753
-	.4byte	0x13db6
+	.8byte	.LVL759
+	.4byte	0x13cad
 	.uleb128 0x4e
-	.8byte	.LVL754
-	.4byte	0x13dc2
+	.8byte	.LVL760
+	.4byte	0x13cb9
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL751
-	.4byte	0x13dcf
+	.8byte	.LVL757
+	.4byte	0x13cc6
 	.uleb128 0x4e
-	.8byte	.LVL755
-	.4byte	0x13ddb
+	.8byte	.LVL761
+	.4byte	0x13cd2
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
-	.8byte	.LBB1717
-	.8byte	.LBE1717-.LBB1717
-	.4byte	0x11920
+	.8byte	.LBB1691
+	.8byte	.LBE1691-.LBB1691
+	.4byte	0x118f0
 	.uleb128 0x46
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x43e
+	.2byte	0x4c3
 	.4byte	0xc6
 	.uleb128 0x5e
-	.8byte	.LBB1718
-	.8byte	.LBE1718-.LBB1718
+	.8byte	.LBB1692
+	.8byte	.LBE1692-.LBB1692
 	.uleb128 0x72
 	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x43e
+	.2byte	0x4c3
 	.uleb128 0x4c
 	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x43e
+	.2byte	0x4c3
 	.4byte	0x14fd
 	.uleb128 0x3
 	.byte	0x91
@@ -40828,52 +41044,52 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x43e
+	.2byte	0x4c3
 	.4byte	0x194
 	.uleb128 0x6c
-	.8byte	.LBB1719
-	.8byte	.LBE1719-.LBB1719
-	.4byte	0x11904
+	.8byte	.LBB1693
+	.8byte	.LBE1693-.LBB1693
+	.4byte	0x118d4
 	.uleb128 0x57
 	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x43e
+	.2byte	0x4c3
 	.4byte	0x194
-	.4byte	.LLST161
+	.4byte	.LLST157
 	.uleb128 0x4e
 	.8byte	.LVL713
-	.4byte	0x13db6
+	.4byte	0x13cad
 	.uleb128 0x4e
 	.8byte	.LVL714
-	.4byte	0x13dc2
+	.4byte	0x13cb9
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL711
-	.4byte	0x13dcf
+	.4byte	0x13cc6
 	.uleb128 0x4e
 	.8byte	.LVL715
-	.4byte	0x13ddb
+	.4byte	0x13cd2
 	.byte	0
 	.byte	0
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xef0
-	.4byte	0x119b6
+	.4byte	.Ldebug_ranges0+0xe90
+	.4byte	0x11986
 	.uleb128 0x46
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x44a
+	.2byte	0x4cf
 	.4byte	0xc6
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xef0
+	.4byte	.Ldebug_ranges0+0xe90
 	.uleb128 0x6b
 	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x44a
-	.8byte	.L684
+	.2byte	0x4cf
+	.8byte	.L698
 	.uleb128 0x4c
 	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x44a
+	.2byte	0x4cf
 	.4byte	0x14fd
 	.uleb128 0x3
 	.byte	0x91
@@ -40881,747 +41097,756 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x44a
+	.2byte	0x4cf
 	.4byte	0x194
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xf30
-	.4byte	0x1199a
+	.4byte	.Ldebug_ranges0+0xed0
+	.4byte	0x1196a
 	.uleb128 0x57
 	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x44a
+	.2byte	0x4cf
 	.4byte	0x194
-	.4byte	.LLST160
+	.4byte	.LLST156
 	.uleb128 0x4e
-	.8byte	.LVL671
-	.4byte	0x13db6
+	.8byte	.LVL678
+	.4byte	0x13cad
 	.uleb128 0x4e
-	.8byte	.LVL672
-	.4byte	0x13dc2
+	.8byte	.LVL679
+	.4byte	0x13cb9
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL669
-	.4byte	0x13dcf
+	.8byte	.LVL676
+	.4byte	0x13cc6
 	.uleb128 0x4e
-	.8byte	.LVL673
-	.4byte	0x13ddb
+	.8byte	.LVL680
+	.4byte	0x13cd2
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12bb6
-	.8byte	.LBB1720
-	.8byte	.LBE1720-.LBB1720
+	.4byte	0x12aad
+	.8byte	.LBB1694
+	.8byte	.LBE1694-.LBB1694
 	.byte	0x1
-	.2byte	0x3fe
-	.4byte	0x11a01
+	.2byte	0x483
+	.4byte	0x119d1
 	.uleb128 0x54
-	.4byte	0x12bd1
+	.4byte	0x12ac8
 	.uleb128 0x54
-	.4byte	0x12bc6
+	.4byte	0x12abd
 	.uleb128 0x5e
-	.8byte	.LBB1721
-	.8byte	.LBE1721-.LBB1721
+	.8byte	.LBB1695
+	.8byte	.LBE1695-.LBB1695
 	.uleb128 0x5c
-	.4byte	0x12bdc
+	.4byte	0x12ad3
 	.uleb128 0x4e
-	.8byte	.LVL720
-	.4byte	0x13a40
+	.8byte	.LVL722
+	.4byte	0x13937
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12946
-	.8byte	.LBB1727
-	.4byte	.Ldebug_ranges0+0xfe0
+	.4byte	0x1283a
+	.8byte	.LBB1700
+	.4byte	.Ldebug_ranges0+0xf70
 	.byte	0x1
-	.2byte	0x37e
-	.4byte	0x11ab8
+	.2byte	0x403
+	.4byte	0x11a97
 	.uleb128 0x54
-	.4byte	0x1298f
+	.4byte	0x12877
 	.uleb128 0x54
-	.4byte	0x12983
+	.4byte	0x12877
 	.uleb128 0x54
-	.4byte	0x12977
+	.4byte	0x12877
 	.uleb128 0x54
-	.4byte	0x1296b
+	.4byte	0x12883
 	.uleb128 0x54
-	.4byte	0x1295f
+	.4byte	0x1286b
 	.uleb128 0x54
-	.4byte	0x12953
+	.4byte	0x1285f
+	.uleb128 0x54
+	.4byte	0x12853
+	.uleb128 0x54
+	.4byte	0x12847
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xfe0
-	.uleb128 0x5f
-	.4byte	0x1299b
-	.4byte	.LLST163
+	.4byte	.Ldebug_ranges0+0xf70
 	.uleb128 0x5c
-	.4byte	0x129a7
+	.4byte	0x1288f
 	.uleb128 0x5f
-	.4byte	0x129b3
-	.4byte	.LLST164
+	.4byte	0x1289b
+	.4byte	.LLST159
+	.uleb128 0x5c
+	.4byte	0x128a7
 	.uleb128 0x5f
-	.4byte	0x129bf
-	.4byte	.LLST165
+	.4byte	0x128b3
+	.4byte	.LLST160
 	.uleb128 0x5f
-	.4byte	0x129cb
-	.4byte	.LLST166
+	.4byte	0x128bf
+	.4byte	.LLST161
 	.uleb128 0x5c
-	.4byte	0x129d7
+	.4byte	0x128cb
 	.uleb128 0x5c
-	.4byte	0x129e3
+	.4byte	0x128d7
 	.uleb128 0x5c
-	.4byte	0x129ef
-	.uleb128 0x5f
-	.4byte	0x129fb
-	.4byte	.LLST167
+	.4byte	0x128e3
 	.uleb128 0x5c
-	.4byte	0x12a07
-	.uleb128 0x5f
-	.4byte	0x12a13
-	.4byte	.LLST168
+	.4byte	0x128ef
 	.uleb128 0x5f
-	.4byte	0x12a1d
-	.4byte	.LLST169
-	.uleb128 0x5f
-	.4byte	0x12a27
-	.4byte	.LLST170
+	.4byte	0x128fb
+	.4byte	.LLST162
 	.uleb128 0x5f
-	.4byte	0x12a33
-	.4byte	.LLST171
+	.4byte	0x12907
+	.4byte	.LLST163
 	.uleb128 0x60
-	.4byte	0x12a3f
+	.4byte	0x12913
 	.uleb128 0x1
-	.byte	0x60
+	.byte	0x5f
+	.uleb128 0x5f
+	.4byte	0x1291d
+	.4byte	.LLST164
+	.uleb128 0x5f
+	.4byte	0x12927
+	.4byte	.LLST165
+	.uleb128 0x5f
+	.4byte	0x12933
+	.4byte	.LLST166
+	.uleb128 0x5f
+	.4byte	0x1293f
+	.4byte	.LLST167
 	.uleb128 0x5f
-	.4byte	0x12a4b
-	.4byte	.LLST172
+	.4byte	0x1294b
+	.4byte	.LLST168
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x11ec4
-	.8byte	.LBB1736
-	.8byte	.LBE1736-.LBB1736
+	.4byte	0x11eb0
+	.8byte	.LBB1709
+	.8byte	.LBE1709-.LBB1709
 	.byte	0x1
-	.2byte	0x3e0
-	.4byte	0x11b3e
+	.2byte	0x465
+	.4byte	0x11b1d
 	.uleb128 0x54
-	.4byte	0x11eed
+	.4byte	0x11ed9
 	.uleb128 0x54
-	.4byte	0x11ee1
+	.4byte	0x11ecd
 	.uleb128 0x54
-	.4byte	0x11ed5
+	.4byte	0x11ec1
 	.uleb128 0x5e
-	.8byte	.LBB1737
-	.8byte	.LBE1737-.LBB1737
+	.8byte	.LBB1710
+	.8byte	.LBE1710-.LBB1710
 	.uleb128 0x5c
-	.4byte	0x11ef9
+	.4byte	0x11ee5
 	.uleb128 0x5c
-	.4byte	0x11f03
+	.4byte	0x11eef
 	.uleb128 0x5c
-	.4byte	0x11f0f
+	.4byte	0x11efb
 	.uleb128 0x5c
-	.4byte	0x11f1b
+	.4byte	0x11f07
 	.uleb128 0x5f
-	.4byte	0x11f27
-	.4byte	.LLST173
+	.4byte	0x11f13
+	.4byte	.LLST169
 	.uleb128 0x5c
-	.4byte	0x11f33
+	.4byte	0x11f1f
 	.uleb128 0x5c
-	.4byte	0x11f3f
+	.4byte	0x11f2b
 	.uleb128 0x73
-	.4byte	0x11f4b
+	.4byte	0x11f37
 	.uleb128 0x5e
-	.8byte	.LBB1738
-	.8byte	.LBE1738-.LBB1738
+	.8byte	.LBB1711
+	.8byte	.LBE1711-.LBB1711
 	.uleb128 0x5c
-	.4byte	0x11f54
+	.4byte	0x11f40
 	.uleb128 0x5c
-	.4byte	0x11f60
+	.4byte	0x11f4c
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12bb6
-	.8byte	.LBB1745
-	.8byte	.LBE1745-.LBB1745
+	.4byte	0x12aad
+	.8byte	.LBB1718
+	.8byte	.LBE1718-.LBB1718
 	.byte	0x1
-	.2byte	0x3aa
-	.4byte	0x11b89
+	.2byte	0x42f
+	.4byte	0x11b68
 	.uleb128 0x54
-	.4byte	0x12bd1
+	.4byte	0x12ac8
 	.uleb128 0x54
-	.4byte	0x12bc6
+	.4byte	0x12abd
 	.uleb128 0x5e
-	.8byte	.LBB1746
-	.8byte	.LBE1746-.LBB1746
+	.8byte	.LBB1719
+	.8byte	.LBE1719-.LBB1719
 	.uleb128 0x5c
-	.4byte	0x12bdc
+	.4byte	0x12ad3
 	.uleb128 0x4e
-	.8byte	.LVL772
-	.4byte	0x13a40
+	.8byte	.LVL780
+	.4byte	0x13937
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12bb6
-	.8byte	.LBB1748
-	.8byte	.LBE1748-.LBB1748
+	.4byte	0x12aad
+	.8byte	.LBB1721
+	.8byte	.LBE1721-.LBB1721
 	.byte	0x1
-	.2byte	0x386
-	.4byte	0x11bd4
+	.2byte	0x40b
+	.4byte	0x11bb3
 	.uleb128 0x54
-	.4byte	0x12bd1
+	.4byte	0x12ac8
 	.uleb128 0x54
-	.4byte	0x12bc6
+	.4byte	0x12abd
 	.uleb128 0x5e
-	.8byte	.LBB1749
-	.8byte	.LBE1749-.LBB1749
+	.8byte	.LBB1722
+	.8byte	.LBE1722-.LBB1722
 	.uleb128 0x5c
-	.4byte	0x12bdc
+	.4byte	0x12ad3
 	.uleb128 0x4e
-	.8byte	.LVL787
-	.4byte	0x13a40
+	.8byte	.LVL794
+	.4byte	0x13937
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12bb6
-	.8byte	.LBB1750
-	.8byte	.LBE1750-.LBB1750
+	.4byte	0x12aad
+	.8byte	.LBB1723
+	.8byte	.LBE1723-.LBB1723
 	.byte	0x1
-	.2byte	0x34f
-	.4byte	0x11c1f
+	.2byte	0x3d4
+	.4byte	0x11bfe
 	.uleb128 0x54
-	.4byte	0x12bd1
+	.4byte	0x12ac8
 	.uleb128 0x54
-	.4byte	0x12bc6
+	.4byte	0x12abd
 	.uleb128 0x5e
-	.8byte	.LBB1751
-	.8byte	.LBE1751-.LBB1751
+	.8byte	.LBB1724
+	.8byte	.LBE1724-.LBB1724
 	.uleb128 0x5c
-	.4byte	0x12bdc
+	.4byte	0x12ad3
 	.uleb128 0x4e
-	.8byte	.LVL788
-	.4byte	0x13a40
+	.8byte	.LVL796
+	.4byte	0x13937
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL656
-	.4byte	0x13e3e
-	.uleb128 0x4e
-	.8byte	.LVL657
-	.4byte	0x13e4a
-	.uleb128 0x4e
-	.8byte	.LVL658
-	.4byte	0x13e02
-	.uleb128 0x4e
-	.8byte	.LVL676
-	.4byte	0x13d01
-	.uleb128 0x4e
-	.8byte	.LVL677
-	.4byte	0x13e4a
-	.uleb128 0x4e
-	.8byte	.LVL678
-	.4byte	0x13e02
+	.8byte	.LVL663
+	.4byte	0x13d35
 	.uleb128 0x4e
-	.8byte	.LVL679
-	.4byte	0x12aac
+	.8byte	.LVL664
+	.4byte	0x13d41
 	.uleb128 0x4e
-	.8byte	.LVL680
-	.4byte	0x13bda
+	.8byte	.LVL665
+	.4byte	0x13cf9
 	.uleb128 0x4e
-	.8byte	.LVL681
-	.4byte	0x1234a
+	.8byte	.LVL683
+	.4byte	0x13d4d
 	.uleb128 0x4e
 	.8byte	.LVL684
-	.4byte	0x13e56
+	.4byte	0x13c10
 	.uleb128 0x4e
 	.8byte	.LVL685
-	.4byte	0x13bda
+	.4byte	0x13d41
+	.uleb128 0x4e
+	.8byte	.LVL686
+	.4byte	0x13cf9
 	.uleb128 0x4e
 	.8byte	.LVL687
-	.4byte	0x13cb7
+	.4byte	0x129ca
 	.uleb128 0x4e
 	.8byte	.LVL688
-	.4byte	0x13bda
+	.4byte	0x13d59
 	.uleb128 0x4e
-	.8byte	.LVL691
-	.4byte	0x11f6e
+	.8byte	.LVL689
+	.4byte	0x13ad1
 	.uleb128 0x4e
-	.8byte	.LVL692
-	.4byte	0x13c54
+	.8byte	.LVL690
+	.4byte	0x12336
 	.uleb128 0x4e
-	.8byte	.LVL694
-	.4byte	0x13e4a
+	.8byte	.LVL693
+	.4byte	0x13d65
 	.uleb128 0x4e
-	.8byte	.LVL696
-	.4byte	0x13d01
+	.8byte	.LVL694
+	.4byte	0x13ad1
 	.uleb128 0x4e
-	.8byte	.LVL697
-	.4byte	0x12aac
+	.8byte	.LVL695
+	.4byte	0x13bae
 	.uleb128 0x4e
-	.8byte	.LVL698
-	.4byte	0x11f6e
+	.8byte	.LVL696
+	.4byte	0x13ad1
 	.uleb128 0x4e
 	.8byte	.LVL700
-	.4byte	0x13bda
+	.4byte	0x11f5a
 	.uleb128 0x4e
 	.8byte	.LVL701
-	.4byte	0x1234a
+	.4byte	0x13b4b
+	.uleb128 0x4e
+	.8byte	.LVL703
+	.4byte	0x13d41
 	.uleb128 0x4e
 	.8byte	.LVL704
-	.4byte	0x13bda
+	.4byte	0x13d4d
 	.uleb128 0x4e
 	.8byte	.LVL705
-	.4byte	0x13d23
+	.4byte	0x129ca
 	.uleb128 0x4e
 	.8byte	.LVL706
-	.4byte	0x13e4a
+	.4byte	0x13d59
 	.uleb128 0x4e
-	.8byte	.LVL708
-	.4byte	0x13e02
+	.8byte	.LVL707
+	.4byte	0x11f5a
+	.uleb128 0x4e
+	.8byte	.LVL710
+	.4byte	0x13cf9
 	.uleb128 0x4e
 	.8byte	.LVL716
-	.4byte	0x13aff
+	.4byte	0x139f6
 	.uleb128 0x4e
-	.8byte	.LVL718
-	.4byte	0x13c54
+	.8byte	.LVL717
+	.4byte	0x13b4b
 	.uleb128 0x4e
-	.8byte	.LVL721
-	.4byte	0x11f6e
+	.8byte	.LVL719
+	.4byte	0x13ad1
 	.uleb128 0x4e
-	.8byte	.LVL722
-	.4byte	0x13bda
+	.8byte	.LVL720
+	.4byte	0x13c1a
 	.uleb128 0x4e
 	.8byte	.LVL723
-	.4byte	0x1234a
+	.4byte	0x11f5a
 	.uleb128 0x4e
 	.8byte	.LVL724
-	.4byte	0x13cb7
-	.uleb128 0x4e
-	.8byte	.LVL727
-	.4byte	0x13cb7
-	.uleb128 0x4e
-	.8byte	.LVL729
-	.4byte	0x13d01
+	.4byte	0x13ad1
 	.uleb128 0x4e
-	.8byte	.LVL742
-	.4byte	0x13bda
+	.8byte	.LVL725
+	.4byte	0x12336
 	.uleb128 0x4e
-	.8byte	.LVL745
-	.4byte	0x13bda
+	.8byte	.LVL726
+	.4byte	0x13bae
 	.uleb128 0x4e
-	.8byte	.LVL746
-	.4byte	0x13bda
+	.8byte	.LVL729
+	.4byte	0x13bae
 	.uleb128 0x4e
-	.8byte	.LVL749
-	.4byte	0x13bda
+	.8byte	.LVL753
+	.4byte	0x13ad1
 	.uleb128 0x4e
 	.8byte	.LVL756
-	.4byte	0x13cb7
-	.uleb128 0x4e
-	.8byte	.LVL760
-	.4byte	0x13bda
-	.uleb128 0x4e
-	.8byte	.LVL761
-	.4byte	0x13e56
+	.4byte	0x13ad1
 	.uleb128 0x4e
 	.8byte	.LVL762
-	.4byte	0x13d23
+	.4byte	0x13bae
+	.uleb128 0x4e
+	.8byte	.LVL764
+	.4byte	0x11f5a
 	.uleb128 0x4e
 	.8byte	.LVL766
-	.4byte	0x13c48
+	.4byte	0x13ad1
 	.uleb128 0x4e
 	.8byte	.LVL767
-	.4byte	0x13d01
-	.uleb128 0x4e
-	.8byte	.LVL768
-	.4byte	0x13d01
-	.uleb128 0x4e
-	.8byte	.LVL769
-	.4byte	0x13d01
+	.4byte	0x12336
 	.uleb128 0x4e
 	.8byte	.LVL770
-	.4byte	0x13d01
+	.4byte	0x13ad1
 	.uleb128 0x4e
 	.8byte	.LVL771
-	.4byte	0x13d01
+	.4byte	0x13d65
+	.uleb128 0x4e
+	.8byte	.LVL772
+	.4byte	0x13c1a
 	.uleb128 0x4e
 	.8byte	.LVL773
-	.4byte	0x13c54
+	.4byte	0x13ad1
 	.uleb128 0x4e
-	.8byte	.LVL782
-	.4byte	0x11f6e
+	.8byte	.LVL774
+	.4byte	0x13b3f
 	.uleb128 0x4e
-	.8byte	.LVL783
-	.4byte	0x13aff
+	.8byte	.LVL775
+	.4byte	0x13c10
 	.uleb128 0x4e
-	.8byte	.LVL785
-	.4byte	0x13d01
+	.8byte	.LVL776
+	.4byte	0x13c10
+	.uleb128 0x4e
+	.8byte	.LVL778
+	.4byte	0x13ad1
+	.uleb128 0x4e
+	.8byte	.LVL779
+	.4byte	0x13b4b
+	.uleb128 0x4e
+	.8byte	.LVL781
+	.4byte	0x13c10
 	.uleb128 0x4e
 	.8byte	.LVL789
-	.4byte	0x13d61
+	.4byte	0x139f6
+	.uleb128 0x4e
+	.8byte	.LVL790
+	.4byte	0x13c10
+	.uleb128 0x4e
+	.8byte	.LVL791
+	.4byte	0x13c10
+	.uleb128 0x4e
+	.8byte	.LVL792
+	.4byte	0x13c10
+	.uleb128 0x4e
+	.8byte	.LVL797
+	.4byte	0x13c58
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x2f5
+	.2byte	0x37a
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11f6e
+	.4byte	0x11f5a
 	.uleb128 0x64
 	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x2f5
+	.2byte	0x37a
 	.4byte	0x4653
 	.uleb128 0x64
 	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0x2f5
+	.2byte	0x37a
 	.4byte	0x4653
 	.uleb128 0x64
 	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x2f5
+	.2byte	0x37a
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x2f7
+	.2byte	0x37c
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0x2f8
+	.2byte	0x37d
 	.4byte	0x155
 	.uleb128 0x46
 	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0x2f8
+	.2byte	0x37d
 	.4byte	0x155
 	.uleb128 0x46
 	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0x2f9
+	.2byte	0x37e
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0x2fa
+	.2byte	0x37f
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0x2fb
+	.2byte	0x380
 	.4byte	0x4659
 	.uleb128 0x46
 	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0x2fc
+	.2byte	0x381
 	.4byte	0x4659
 	.uleb128 0x72
 	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0x313
+	.2byte	0x398
 	.uleb128 0x66
 	.uleb128 0x46
 	.4byte	.LASF3085
 	.byte	0x1
-	.2byte	0x30b
+	.2byte	0x390
 	.4byte	0x10b
 	.uleb128 0x46
 	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0x30b
+	.2byte	0x390
 	.4byte	0x10b
 	.byte	0
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3087
 	.byte	0x1
-	.2byte	0x29f
+	.2byte	0x324
 	.4byte	0xc6
 	.8byte	.LFB2817
 	.8byte	.LFE2817-.LFB2817
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x120b5
+	.4byte	0x120a1
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x29f
-	.4byte	0xe46d
-	.4byte	.LLST73
+	.2byte	0x324
+	.4byte	0xe461
+	.4byte	.LLST69
 	.uleb128 0x46
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x2a1
-	.4byte	0xe707
+	.2byte	0x326
+	.4byte	0xe710
 	.uleb128 0x57
 	.4byte	.LASF3088
 	.byte	0x1
-	.2byte	0x2a2
+	.2byte	0x327
 	.4byte	0xc6
-	.4byte	.LLST74
+	.4byte	.LLST70
 	.uleb128 0x69
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x2a3
+	.2byte	0x328
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x64
 	.uleb128 0x53
-	.4byte	0x12e2b
-	.8byte	.LBB1204
-	.8byte	.LBE1204-.LBB1204
+	.4byte	0x12d22
+	.8byte	.LBB1184
+	.8byte	.LBE1184-.LBB1184
 	.byte	0x1
-	.2byte	0x2a6
-	.4byte	0x11ff1
+	.2byte	0x32b
+	.4byte	0x11fdd
 	.uleb128 0x54
-	.4byte	0x12e46
+	.4byte	0x12d3d
 	.uleb128 0x54
-	.4byte	0x12e3b
+	.4byte	0x12d32
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL246
-	.4byte	0x13bda
-	.uleb128 0x4e
-	.8byte	.LVL247
-	.4byte	0x13e62
+	.8byte	.LVL248
+	.4byte	0x13ad1
 	.uleb128 0x4e
-	.8byte	.LVL250
-	.4byte	0x13e62
+	.8byte	.LVL249
+	.4byte	0x13d71
 	.uleb128 0x4e
-	.8byte	.LVL251
-	.4byte	0x13c54
+	.8byte	.LVL252
+	.4byte	0x13d71
 	.uleb128 0x4e
 	.8byte	.LVL253
-	.4byte	0x13c54
+	.4byte	0x13b4b
 	.uleb128 0x4e
-	.8byte	.LVL254
-	.4byte	0x13c54
+	.8byte	.LVL255
+	.4byte	0x13b4b
 	.uleb128 0x4e
 	.8byte	.LVL256
-	.4byte	0x13e62
-	.uleb128 0x4e
-	.8byte	.LVL257
-	.4byte	0x13e62
+	.4byte	0x13b4b
 	.uleb128 0x4e
 	.8byte	.LVL258
-	.4byte	0x13e62
+	.4byte	0x13d71
 	.uleb128 0x4e
 	.8byte	.LVL259
-	.4byte	0x13e62
+	.4byte	0x13d71
 	.uleb128 0x4e
 	.8byte	.LVL260
-	.4byte	0x13e62
+	.4byte	0x13d71
 	.uleb128 0x4e
 	.8byte	.LVL261
-	.4byte	0x13e62
+	.4byte	0x13d71
 	.uleb128 0x4e
 	.8byte	.LVL262
-	.4byte	0x13e62
+	.4byte	0x13d71
 	.uleb128 0x4e
 	.8byte	.LVL263
-	.4byte	0x13c54
+	.4byte	0x13d71
 	.uleb128 0x4e
 	.8byte	.LVL264
-	.4byte	0x13d61
+	.4byte	0x13d71
+	.uleb128 0x4e
+	.8byte	.LVL265
+	.4byte	0x13b4b
+	.uleb128 0x4e
+	.8byte	.LVL266
+	.4byte	0x13c58
 	.byte	0
 	.uleb128 0x4d
 	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x279
+	.2byte	0x2fe
 	.8byte	.LFB2816
 	.8byte	.LFE2816-.LFB2816
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1216e
+	.4byte	0x1215a
 	.uleb128 0x46
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x27b
-	.4byte	0xe707
+	.2byte	0x300
+	.4byte	0xe710
 	.uleb128 0x46
-	.4byte	.LASF2996
+	.4byte	.LASF2995
 	.byte	0x1
-	.2byte	0x27c
+	.2byte	0x301
 	.4byte	0xe123
 	.uleb128 0x4e
-	.8byte	.LVL229
-	.4byte	0x13c85
-	.uleb128 0x4e
-	.8byte	.LVL230
-	.4byte	0x13bda
-	.uleb128 0x4e
 	.8byte	.LVL231
-	.4byte	0x13d23
+	.4byte	0x13b7c
 	.uleb128 0x4e
 	.8byte	.LVL232
-	.4byte	0x13d23
+	.4byte	0x13ad1
 	.uleb128 0x4e
 	.8byte	.LVL233
-	.4byte	0x13bda
+	.4byte	0x13c1a
 	.uleb128 0x4e
 	.8byte	.LVL234
-	.4byte	0x13c3e
+	.4byte	0x13c1a
 	.uleb128 0x4e
 	.8byte	.LVL235
-	.4byte	0x13cb7
+	.4byte	0x13ad1
 	.uleb128 0x4e
 	.8byte	.LVL236
-	.4byte	0x13d23
+	.4byte	0x13b35
 	.uleb128 0x4e
 	.8byte	.LVL237
-	.4byte	0x13d23
+	.4byte	0x13bae
 	.uleb128 0x4e
 	.8byte	.LVL238
-	.4byte	0x13c85
+	.4byte	0x13c1a
+	.uleb128 0x4e
+	.8byte	.LVL239
+	.4byte	0x13c1a
+	.uleb128 0x4e
+	.8byte	.LVL240
+	.4byte	0x13b7c
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x233
+	.2byte	0x2b7
 	.4byte	0xc6
 	.8byte	.LFB2815
 	.8byte	.LFE2815-.LFB2815
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1233a
+	.4byte	0x12326
 	.uleb128 0x56
 	.4byte	.LASF791
 	.byte	0x1
-	.2byte	0x233
+	.2byte	0x2b7
 	.4byte	0x443
-	.4byte	.LLST119
+	.4byte	.LLST115
 	.uleb128 0x69
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x235
-	.4byte	0xe46d
+	.2byte	0x2b9
+	.4byte	0xe461
 	.uleb128 0x1
 	.byte	0x66
 	.uleb128 0x46
-	.4byte	.LASF2996
+	.4byte	.LASF2995
 	.byte	0x1
-	.2byte	0x236
+	.2byte	0x2ba
 	.4byte	0xe123
 	.uleb128 0x46
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x237
-	.4byte	0xe707
+	.2byte	0x2bb
+	.4byte	0xe710
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x970
-	.4byte	0x12258
+	.4byte	.Ldebug_ranges0+0x940
+	.4byte	0x12244
 	.uleb128 0x3f
 	.byte	0x8
 	.byte	0x1
-	.2byte	0x23e
-	.4byte	0x121f1
+	.2byte	0x2c2
+	.4byte	0x121dd
 	.uleb128 0x41
 	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x23e
+	.2byte	0x2c2
 	.4byte	0x19b
 	.uleb128 0x3d
 	.string	"__c"
 	.byte	0x1
-	.2byte	0x23e
-	.4byte	0x1233a
+	.2byte	0x2c2
+	.4byte	0x12326
 	.byte	0
 	.uleb128 0x52
 	.string	"__u"
 	.byte	0x1
-	.2byte	0x23e
-	.4byte	0x121cf
+	.2byte	0x2c2
+	.4byte	0x121bb
 	.uleb128 0x58
-	.4byte	0x1360d
-	.8byte	.LBB1293
-	.4byte	.Ldebug_ranges0+0x9b0
+	.4byte	0x13504
+	.8byte	.LBB1273
+	.4byte	.Ldebug_ranges0+0x980
 	.byte	0x1
-	.2byte	0x23e
-	.4byte	0x12225
+	.2byte	0x2c2
+	.4byte	0x12211
 	.uleb128 0x54
-	.4byte	0x1362d
+	.4byte	0x13524
 	.uleb128 0x54
-	.4byte	0x13622
+	.4byte	0x13519
 	.uleb128 0x54
-	.4byte	0x13619
+	.4byte	0x13510
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x1346d
-	.8byte	.LBB1296
-	.8byte	.LBE1296-.LBB1296
+	.4byte	0x13364
+	.8byte	.LBB1276
+	.8byte	.LBE1276-.LBB1276
 	.byte	0x1
-	.2byte	0x23e
+	.2byte	0x2c2
 	.uleb128 0x5e
-	.8byte	.LBB1297
-	.8byte	.LBE1297-.LBB1297
+	.8byte	.LBB1277
+	.8byte	.LBE1277-.LBB1277
 	.uleb128 0x60
-	.4byte	0x1347d
+	.4byte	0x13374
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13307
-	.8byte	.LBB1301
-	.8byte	.LBE1301-.LBB1301
+	.4byte	0x131fe
+	.8byte	.LBB1281
+	.8byte	.LBE1281-.LBB1281
 	.byte	0x1
-	.2byte	0x270
-	.4byte	0x122aa
+	.2byte	0x2f5
+	.4byte	0x12296
 	.uleb128 0x54
-	.4byte	0x13318
+	.4byte	0x1320f
 	.uleb128 0x5a
-	.4byte	0x13325
-	.8byte	.LBB1303
-	.8byte	.LBE1303-.LBB1303
+	.4byte	0x1321c
+	.8byte	.LBB1283
+	.8byte	.LBE1283-.LBB1283
 	.byte	0xd
 	.2byte	0x240
 	.uleb128 0x54
-	.4byte	0x13341
+	.4byte	0x13238
 	.uleb128 0x54
-	.4byte	0x13336
+	.4byte	0x1322d
 	.uleb128 0x4e
-	.8byte	.LVL425
-	.4byte	0x13e6e
+	.8byte	.LVL427
+	.4byte	0x13d7d
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL420
-	.4byte	0x13e7b
-	.uleb128 0x4e
-	.8byte	.LVL421
-	.4byte	0x13db6
-	.uleb128 0x4e
 	.8byte	.LVL422
-	.4byte	0x13e85
+	.4byte	0x13d8a
 	.uleb128 0x4e
 	.8byte	.LVL423
-	.4byte	0x126f3
+	.4byte	0x13cad
 	.uleb128 0x4e
 	.8byte	.LVL424
-	.4byte	0x1393d
+	.4byte	0x13d94
 	.uleb128 0x4e
-	.8byte	.LVL426
-	.4byte	0x1393d
+	.8byte	.LVL425
+	.4byte	0x126df
 	.uleb128 0x4e
-	.8byte	.LVL427
-	.4byte	0x1363f
+	.8byte	.LVL426
+	.4byte	0x13834
 	.uleb128 0x4e
 	.8byte	.LVL428
-	.4byte	0x1393d
+	.4byte	0x13834
 	.uleb128 0x4e
 	.8byte	.LVL429
-	.4byte	0x126f3
+	.4byte	0x13536
 	.uleb128 0x4e
 	.8byte	.LVL430
-	.4byte	0x1393d
+	.4byte	0x13834
 	.uleb128 0x4e
 	.8byte	.LVL431
-	.4byte	0x1377f
+	.4byte	0x126df
+	.uleb128 0x4e
+	.8byte	.LVL432
+	.4byte	0x13834
+	.uleb128 0x4e
+	.8byte	.LVL433
+	.4byte	0x13676
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x1234a
+	.4byte	0x12336
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
@@ -41629,160 +41854,160 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x1e9
+	.2byte	0x268
 	.8byte	.LFB2814
 	.8byte	.LFE2814-.LFB2814
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x124e9
+	.4byte	0x124d5
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x1e9
-	.4byte	0xe46d
-	.4byte	.LLST118
+	.2byte	0x268
+	.4byte	0xe461
+	.4byte	.LLST114
 	.uleb128 0x46
-	.4byte	.LASF2996
+	.4byte	.LASF2995
 	.byte	0x1
-	.2byte	0x1eb
+	.2byte	0x26a
 	.4byte	0xe123
 	.uleb128 0x46
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x1ec
-	.4byte	0xe707
+	.2byte	0x26b
+	.4byte	0xe710
 	.uleb128 0x55
 	.4byte	.LASF3020
 	.4byte	0xb915
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34647
+	.8byte	__func__.34649
 	.uleb128 0x53
-	.4byte	0x124e9
-	.8byte	.LBB1284
-	.8byte	.LBE1284-.LBB1284
+	.4byte	0x124d5
+	.8byte	.LBB1264
+	.8byte	.LBE1264-.LBB1264
 	.byte	0x1
-	.2byte	0x204
-	.4byte	0x123d7
+	.2byte	0x288
+	.4byte	0x123c3
 	.uleb128 0x54
-	.4byte	0x12502
+	.4byte	0x124ee
 	.uleb128 0x54
-	.4byte	0x124f6
+	.4byte	0x124e2
 	.uleb128 0x4e
-	.8byte	.LVL396
-	.4byte	0x1393d
+	.8byte	.LVL398
+	.4byte	0x13834
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x124e9
-	.8byte	.LBB1286
-	.8byte	.LBE1286-.LBB1286
+	.4byte	0x124d5
+	.8byte	.LBB1266
+	.8byte	.LBE1266-.LBB1266
 	.byte	0x1
-	.2byte	0x1f7
-	.4byte	0x1240b
+	.2byte	0x276
+	.4byte	0x123f7
 	.uleb128 0x54
-	.4byte	0x12502
+	.4byte	0x124ee
 	.uleb128 0x54
-	.4byte	0x124f6
+	.4byte	0x124e2
 	.uleb128 0x4e
-	.8byte	.LVL401
-	.4byte	0x1393d
+	.8byte	.LVL403
+	.4byte	0x13834
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x124e9
-	.8byte	.LBB1288
-	.8byte	.LBE1288-.LBB1288
+	.4byte	0x124d5
+	.8byte	.LBB1268
+	.8byte	.LBE1268-.LBB1268
 	.byte	0x1
-	.2byte	0x227
-	.4byte	0x1243f
+	.2byte	0x2ab
+	.4byte	0x1242b
 	.uleb128 0x54
-	.4byte	0x12502
+	.4byte	0x124ee
 	.uleb128 0x54
-	.4byte	0x124f6
+	.4byte	0x124e2
 	.uleb128 0x4e
-	.8byte	.LVL405
-	.4byte	0x1393d
+	.8byte	.LVL407
+	.4byte	0x13834
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x124e9
-	.8byte	.LBB1290
-	.8byte	.LBE1290-.LBB1290
+	.4byte	0x124d5
+	.8byte	.LBB1270
+	.8byte	.LBE1270-.LBB1270
 	.byte	0x1
-	.2byte	0x21a
-	.4byte	0x12473
+	.2byte	0x29e
+	.4byte	0x1245f
 	.uleb128 0x54
-	.4byte	0x12502
+	.4byte	0x124ee
 	.uleb128 0x54
-	.4byte	0x124f6
+	.4byte	0x124e2
 	.uleb128 0x4e
-	.8byte	.LVL410
-	.4byte	0x1393d
+	.8byte	.LVL412
+	.4byte	0x13834
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL395
-	.4byte	0x126f3
-	.uleb128 0x4e
 	.8byte	.LVL397
-	.4byte	0x126f3
+	.4byte	0x126df
 	.uleb128 0x4e
-	.8byte	.LVL400
-	.4byte	0x126f3
+	.8byte	.LVL399
+	.4byte	0x126df
 	.uleb128 0x4e
-	.8byte	.LVL404
-	.4byte	0x1363f
+	.8byte	.LVL402
+	.4byte	0x126df
 	.uleb128 0x4e
 	.8byte	.LVL406
-	.4byte	0x1363f
+	.4byte	0x13536
 	.uleb128 0x4e
-	.8byte	.LVL409
-	.4byte	0x1377f
+	.8byte	.LVL408
+	.4byte	0x13536
 	.uleb128 0x4e
 	.8byte	.LVL411
-	.4byte	0x1377f
+	.4byte	0x13676
 	.uleb128 0x4e
-	.8byte	.LVL414
-	.4byte	0x13e91
+	.8byte	.LVL413
+	.4byte	0x13676
 	.uleb128 0x4e
-	.8byte	.LVL415
-	.4byte	0x13e91
+	.8byte	.LVL416
+	.4byte	0x13da0
+	.uleb128 0x4e
+	.8byte	.LVL417
+	.4byte	0x13da0
 	.byte	0
 	.uleb128 0x65
 	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x1e3
+	.2byte	0x262
 	.byte	0x1
-	.4byte	0x1250f
+	.4byte	0x124fb
 	.uleb128 0x64
-	.4byte	.LASF2996
+	.4byte	.LASF2995
 	.byte	0x1
-	.2byte	0x1e3
+	.2byte	0x262
 	.4byte	0xe123
 	.uleb128 0x64
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x1e3
-	.4byte	0xe707
+	.2byte	0x262
+	.4byte	0xe710
 	.byte	0
 	.uleb128 0x65
 	.4byte	.LASF3095
 	.byte	0x1
-	.2byte	0x1d8
+	.2byte	0x257
 	.byte	0x1
-	.4byte	0x12541
+	.4byte	0x1252d
 	.uleb128 0x64
-	.4byte	.LASF2996
+	.4byte	.LASF2995
 	.byte	0x1
-	.2byte	0x1d8
+	.2byte	0x257
 	.4byte	0xe123
 	.uleb128 0x64
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x1d8
-	.4byte	0xe707
+	.2byte	0x257
+	.4byte	0xe710
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x1da
-	.4byte	0x12541
+	.2byte	0x259
+	.4byte	0x1252d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -41790,717 +42015,629 @@ __exitcall_ebc_exit:
 	.uleb128 0x65
 	.4byte	.LASF3096
 	.byte	0x1
-	.2byte	0x1ae
+	.2byte	0x22d
 	.byte	0x1
-	.4byte	0x1261d
+	.4byte	0x12609
 	.uleb128 0x64
 	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x1ae
+	.2byte	0x22d
 	.4byte	0xc097
 	.uleb128 0x64
 	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x1af
+	.2byte	0x22e
 	.4byte	0xaab
 	.uleb128 0x64
 	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x1af
+	.2byte	0x22e
 	.4byte	0xaab
 	.uleb128 0x64
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x1b0
-	.4byte	0xe707
+	.2byte	0x22f
+	.4byte	0xe710
 	.uleb128 0x46
-	.4byte	.LASF2996
+	.4byte	.LASF2995
 	.byte	0x1
-	.2byte	0x1b2
+	.2byte	0x231
 	.4byte	0xe123
 	.uleb128 0x46
 	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x1b3
+	.2byte	0x232
 	.4byte	0x155
 	.uleb128 0x46
 	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x1b3
+	.2byte	0x232
 	.4byte	0x155
 	.uleb128 0x46
 	.4byte	.LASF3102
 	.byte	0x1
-	.2byte	0x1b3
+	.2byte	0x232
 	.4byte	0x4659
 	.uleb128 0x46
 	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x1b3
+	.2byte	0x232
 	.4byte	0x4659
 	.uleb128 0x46
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x1b4
+	.2byte	0x233
 	.4byte	0xc097
 	.uleb128 0x46
 	.4byte	.LASF2893
 	.byte	0x1
-	.2byte	0x1b5
+	.2byte	0x234
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF261
 	.byte	0x1
-	.2byte	0x1b5
+	.2byte	0x234
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x1b6
+	.2byte	0x235
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x1b6
+	.2byte	0x235
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x1b7
+	.2byte	0x236
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2854
 	.byte	0x1
-	.2byte	0x1b8
+	.2byte	0x237
 	.4byte	0xc097
 	.uleb128 0x46
 	.4byte	.LASF2939
 	.byte	0x1
-	.2byte	0x1b9
+	.2byte	0x238
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x65
 	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x188
+	.2byte	0x207
 	.byte	0x1
-	.4byte	0x126f3
+	.4byte	0x126df
 	.uleb128 0x64
 	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x188
+	.2byte	0x207
 	.4byte	0xc097
 	.uleb128 0x64
 	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x189
+	.2byte	0x208
 	.4byte	0xaab
 	.uleb128 0x64
 	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x189
+	.2byte	0x208
 	.4byte	0xaab
 	.uleb128 0x64
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x18a
-	.4byte	0xe707
+	.2byte	0x209
+	.4byte	0xe710
 	.uleb128 0x46
-	.4byte	.LASF2996
+	.4byte	.LASF2995
 	.byte	0x1
-	.2byte	0x18c
+	.2byte	0x20b
 	.4byte	0xe123
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x18d
+	.2byte	0x20c
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x18d
+	.2byte	0x20c
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2893
 	.byte	0x1
-	.2byte	0x18e
+	.2byte	0x20d
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF261
 	.byte	0x1
-	.2byte	0x18f
+	.2byte	0x20e
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x190
+	.2byte	0x20f
 	.4byte	0x155
 	.uleb128 0x46
 	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x190
+	.2byte	0x20f
 	.4byte	0x155
 	.uleb128 0x46
 	.4byte	.LASF3102
 	.byte	0x1
-	.2byte	0x190
+	.2byte	0x20f
 	.4byte	0x4659
 	.uleb128 0x46
 	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x190
+	.2byte	0x20f
 	.4byte	0x4659
 	.uleb128 0x46
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x191
+	.2byte	0x210
 	.4byte	0xc097
 	.uleb128 0x46
 	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x192
+	.2byte	0x211
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2854
 	.byte	0x1
-	.2byte	0x193
+	.2byte	0x212
 	.4byte	0xc097
 	.uleb128 0x46
 	.4byte	.LASF2939
 	.byte	0x1
-	.2byte	0x194
+	.2byte	0x213
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4d
 	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x148
+	.2byte	0x162
 	.8byte	.LFB2809
 	.8byte	.LFE2809-.LFB2809
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12946
+	.4byte	0x1283a
 	.uleb128 0x6a
 	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x148
+	.2byte	0x162
 	.4byte	0xc097
 	.uleb128 0x1
 	.byte	0x50
-	.uleb128 0x56
+	.uleb128 0x6a
 	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x148
+	.2byte	0x162
 	.4byte	0xaab
-	.4byte	.LLST0
-	.uleb128 0x56
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x6a
 	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x148
+	.2byte	0x162
 	.4byte	0xaab
-	.4byte	.LLST1
+	.uleb128 0x1
+	.byte	0x52
 	.uleb128 0x6a
 	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x149
+	.2byte	0x163
 	.4byte	0xc097
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x6a
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x149
-	.4byte	0xe707
+	.2byte	0x163
+	.4byte	0xe710
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x46
-	.4byte	.LASF2996
+	.4byte	.LASF2995
 	.byte	0x1
-	.2byte	0x14b
+	.2byte	0x165
 	.4byte	0xe123
-	.uleb128 0x69
+	.uleb128 0x68
 	.string	"i"
 	.byte	0x1
-	.2byte	0x14c
+	.2byte	0x166
 	.4byte	0xc6
-	.uleb128 0x1
-	.byte	0x5e
+	.4byte	.LLST0
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x14d
+	.2byte	0x167
 	.4byte	0xc6
 	.uleb128 0x4c
 	.4byte	.LASF2893
 	.byte	0x1
-	.2byte	0x14e
+	.2byte	0x168
 	.4byte	0xc6
 	.uleb128 0x1
-	.byte	0x62
-	.uleb128 0x4c
+	.byte	0x61
+	.uleb128 0x57
 	.4byte	.LASF261
 	.byte	0x1
-	.2byte	0x14f
+	.2byte	0x169
 	.4byte	0xc6
-	.uleb128 0x1
-	.byte	0x5b
+	.4byte	.LLST1
 	.uleb128 0x57
 	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x150
-	.4byte	0x155
+	.2byte	0x16a
+	.4byte	0x13a
 	.4byte	.LLST2
 	.uleb128 0x57
 	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x150
-	.4byte	0x155
+	.2byte	0x16a
+	.4byte	0x13a
 	.4byte	.LLST3
 	.uleb128 0x4c
 	.4byte	.LASF3102
 	.byte	0x1
-	.2byte	0x151
-	.4byte	0x4659
+	.2byte	0x16b
+	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4c
 	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x151
-	.4byte	0x4659
+	.2byte	0x16b
+	.4byte	0xaab
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x57
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x152
+	.2byte	0x16c
 	.4byte	0xc097
 	.4byte	.LLST4
 	.uleb128 0x4c
 	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x153
+	.2byte	0x16d
 	.4byte	0x10b
 	.uleb128 0x1
-	.byte	0x5d
+	.byte	0x5b
 	.uleb128 0x4c
 	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x154
+	.2byte	0x16e
 	.4byte	0xc097
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x46
 	.4byte	.LASF3110
 	.byte	0x1
-	.2byte	0x155
+	.2byte	0x16f
 	.4byte	0x10b
-	.uleb128 0x57
+	.uleb128 0x46
 	.4byte	.LASF2854
 	.byte	0x1
-	.2byte	0x156
+	.2byte	0x170
 	.4byte	0xc097
-	.4byte	.LLST5
 	.uleb128 0x46
 	.4byte	.LASF2939
 	.byte	0x1
-	.2byte	0x157
+	.2byte	0x171
 	.4byte	0xc6
-	.uleb128 0x58
-	.4byte	0x12be8
-	.8byte	.LBB916
-	.4byte	.Ldebug_ranges0+0
-	.byte	0x1
-	.2byte	0x179
-	.4byte	0x12865
-	.uleb128 0x54
-	.4byte	0x12c0e
-	.uleb128 0x54
-	.4byte	0x12c03
-	.uleb128 0x54
-	.4byte	0x12bf8
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0
-	.uleb128 0x5c
-	.4byte	0x12c19
-	.uleb128 0x5f
-	.4byte	0x12c24
-	.4byte	.LLST6
-	.byte	0
-	.byte	0
-	.uleb128 0x53
-	.4byte	0x12be8
-	.8byte	.LBB919
-	.8byte	.LBE919-.LBB919
+	.uleb128 0x46
+	.4byte	.LASF3111
 	.byte	0x1
-	.2byte	0x176
-	.4byte	0x128b1
-	.uleb128 0x54
-	.4byte	0x12c0e
-	.uleb128 0x54
-	.4byte	0x12c03
-	.uleb128 0x54
-	.4byte	0x12bf8
-	.uleb128 0x5e
-	.8byte	.LBB920
-	.8byte	.LBE920-.LBB920
-	.uleb128 0x5c
-	.4byte	0x12c19
-	.uleb128 0x5f
-	.4byte	0x12c24
-	.4byte	.LLST7
-	.byte	0
-	.byte	0
-	.uleb128 0x53
-	.4byte	0x12be8
-	.8byte	.LBB921
-	.8byte	.LBE921-.LBB921
+	.2byte	0x172
+	.4byte	0x10b
+	.uleb128 0x46
+	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x177
-	.4byte	0x128fd
-	.uleb128 0x54
-	.4byte	0x12c0e
-	.uleb128 0x54
-	.4byte	0x12c03
-	.uleb128 0x54
-	.4byte	0x12bf8
-	.uleb128 0x5e
-	.8byte	.LBB922
-	.8byte	.LBE922-.LBB922
-	.uleb128 0x5c
-	.4byte	0x12c19
-	.uleb128 0x5f
-	.4byte	0x12c24
-	.4byte	.LLST8
-	.byte	0
-	.byte	0
-	.uleb128 0x5a
-	.4byte	0x12be8
-	.8byte	.LBB923
-	.8byte	.LBE923-.LBB923
+	.2byte	0x172
+	.4byte	0x10b
+	.uleb128 0x57
+	.4byte	.LASF3113
 	.byte	0x1
-	.2byte	0x178
-	.uleb128 0x54
-	.4byte	0x12c0e
-	.uleb128 0x54
-	.4byte	0x12c03
-	.uleb128 0x54
-	.4byte	0x12bf8
-	.uleb128 0x5e
-	.8byte	.LBB924
-	.8byte	.LBE924-.LBB924
-	.uleb128 0x5c
-	.4byte	0x12c19
-	.uleb128 0x5f
-	.4byte	0x12c24
-	.4byte	.LLST9
-	.byte	0
-	.byte	0
+	.2byte	0x173
+	.4byte	0x13a
+	.4byte	.LLST5
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3111
+	.4byte	.LASF3114
 	.byte	0x1
-	.2byte	0x109
+	.2byte	0x117
 	.byte	0x1
-	.4byte	0x12a58
+	.4byte	0x12958
 	.uleb128 0x64
-	.4byte	.LASF3112
+	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x109
+	.2byte	0x117
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3113
+	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x109
+	.2byte	0x117
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3114
+	.4byte	.LASF3117
 	.byte	0x1
-	.2byte	0x109
+	.2byte	0x117
 	.4byte	0xaab
 	.uleb128 0x64
 	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x109
-	.4byte	0xc097
+	.2byte	0x117
+	.4byte	0xaab
 	.uleb128 0x64
 	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x10a
-	.4byte	0xe707
+	.2byte	0x118
+	.4byte	0xe710
 	.uleb128 0x64
 	.4byte	.LASF2865
 	.byte	0x1
-	.2byte	0x10a
+	.2byte	0x118
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2893
 	.byte	0x1
-	.2byte	0x10c
+	.2byte	0x11a
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF261
 	.byte	0x1
-	.2byte	0x10c
+	.2byte	0x11a
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3115
+	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x10d
-	.4byte	0x155
+	.2byte	0x11b
+	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3116
+	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x10d
-	.4byte	0x155
+	.2byte	0x11b
+	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3117
+	.4byte	.LASF3120
 	.byte	0x1
-	.2byte	0x10d
-	.4byte	0x155
+	.2byte	0x11b
+	.4byte	0x13a
 	.uleb128 0x46
-	.4byte	.LASF3118
+	.4byte	.LASF3121
 	.byte	0x1
-	.2byte	0x10e
-	.4byte	0x4659
+	.2byte	0x11c
+	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3119
+	.4byte	.LASF3122
 	.byte	0x1
-	.2byte	0x10e
-	.4byte	0x4659
+	.2byte	0x11c
+	.4byte	0xaab
 	.uleb128 0x46
-	.4byte	.LASF3120
+	.4byte	.LASF3123
 	.byte	0x1
-	.2byte	0x10e
-	.4byte	0x4659
+	.2byte	0x11c
+	.4byte	0xaab
 	.uleb128 0x46
 	.4byte	.LASF3110
 	.byte	0x1
-	.2byte	0x10f
-	.4byte	0x10b
+	.2byte	0x11d
+	.4byte	0x13a
 	.uleb128 0x46
 	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x110
-	.4byte	0xc097
+	.2byte	0x11e
+	.4byte	0xaab
+	.uleb128 0x46
+	.4byte	.LASF3124
+	.byte	0x1
+	.2byte	0x11f
+	.4byte	0x13a
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x111
+	.2byte	0x120
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x112
+	.2byte	0x121
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2866
 	.byte	0x1
-	.2byte	0x113
+	.2byte	0x122
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2868
 	.byte	0x1
-	.2byte	0x114
+	.2byte	0x123
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2867
 	.byte	0x1
-	.2byte	0x115
+	.2byte	0x124
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2869
 	.byte	0x1
-	.2byte	0x116
+	.2byte	0x125
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x74
-	.4byte	.LASF3121
+	.4byte	.LASF3125
 	.byte	0x1
-	.byte	0xfb
+	.2byte	0x109
 	.8byte	.LFB2807
 	.8byte	.LFE2807-.LFB2807
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12aac
-	.uleb128 0x75
+	.4byte	0x129ca
+	.uleb128 0x56
 	.4byte	.LASF2271
 	.byte	0x1
-	.byte	0xfb
+	.2byte	0x109
 	.4byte	0x31da
-	.4byte	.LLST152
-	.uleb128 0x76
+	.4byte	.LLST148
+	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
-	.byte	0xfd
-	.4byte	0xe46d
-	.4byte	.LLST153
-	.uleb128 0x77
+	.2byte	0x10b
+	.4byte	0xe461
+	.4byte	.LLST149
+	.uleb128 0x46
 	.4byte	.LASF2954
 	.byte	0x1
-	.byte	0xfe
-	.4byte	0xe707
+	.2byte	0x10c
+	.4byte	0xe710
 	.uleb128 0x4e
-	.8byte	.LVL649
-	.4byte	0x12aac
+	.8byte	.LVL653
+	.4byte	0x13d4d
+	.uleb128 0x4e
+	.8byte	.LVL654
+	.4byte	0x129ca
+	.uleb128 0x4e
+	.8byte	.LVL655
+	.4byte	0x13d59
 	.byte	0
-	.uleb128 0x74
-	.4byte	.LASF3122
+	.uleb128 0x75
+	.4byte	.LASF3126
 	.byte	0x1
 	.byte	0xd2
 	.8byte	.LFB2806
 	.8byte	.LFE2806-.LFB2806
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12bb6
-	.uleb128 0x75
-	.4byte	.LASF3112
+	.4byte	0x12aad
+	.uleb128 0x76
+	.4byte	.LASF3115
 	.byte	0x1
 	.byte	0xd2
 	.4byte	0xaab
-	.4byte	.LLST147
-	.uleb128 0x75
-	.4byte	.LASF3113
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x76
+	.4byte	.LASF3116
 	.byte	0x1
 	.byte	0xd2
 	.4byte	0xaab
-	.4byte	.LLST148
-	.uleb128 0x75
-	.4byte	.LASF3114
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x76
+	.4byte	.LASF3117
 	.byte	0x1
 	.byte	0xd2
 	.4byte	0xaab
-	.4byte	.LLST149
-	.uleb128 0x78
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x77
 	.4byte	.LASF3108
 	.byte	0x1
 	.byte	0xd2
-	.4byte	0xc097
-	.uleb128 0x1
-	.byte	0x53
-	.uleb128 0x75
+	.4byte	0xaab
+	.4byte	.LLST142
+	.uleb128 0x77
 	.4byte	.LASF2954
 	.byte	0x1
 	.byte	0xd3
-	.4byte	0xe707
-	.4byte	.LLST150
-	.uleb128 0x78
+	.4byte	0xe710
+	.4byte	.LLST143
+	.uleb128 0x76
 	.4byte	.LASF2865
 	.byte	0x1
 	.byte	0xd3
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x55
-	.uleb128 0x4b
+	.uleb128 0x78
 	.4byte	.LASF2893
 	.byte	0x1
 	.byte	0xd5
 	.4byte	0xc6
-	.uleb128 0x1
-	.byte	0x5f
+	.4byte	.LLST144
 	.uleb128 0x4b
 	.4byte	.LASF261
 	.byte	0x1
 	.byte	0xd5
 	.4byte	0xc6
 	.uleb128 0x1
-	.byte	0x5b
-	.uleb128 0x4b
-	.4byte	.LASF3115
-	.byte	0x1
-	.byte	0xd6
-	.4byte	0x155
-	.uleb128 0x1
-	.byte	0x58
+	.byte	0x5e
 	.uleb128 0x79
-	.4byte	.LASF3116
-	.byte	0x1
-	.byte	0xd6
-	.4byte	0x155
-	.4byte	.LLST151
-	.uleb128 0x4b
-	.4byte	.LASF3117
-	.byte	0x1
-	.byte	0xd6
-	.4byte	0x155
-	.uleb128 0x1
-	.byte	0x57
-	.uleb128 0x4b
 	.4byte	.LASF3118
 	.byte	0x1
-	.byte	0xd7
-	.4byte	0x4659
-	.uleb128 0x1
-	.byte	0x50
-	.uleb128 0x4b
+	.byte	0xd6
+	.4byte	0x13a
+	.uleb128 0x78
 	.4byte	.LASF3119
 	.byte	0x1
-	.byte	0xd7
-	.4byte	0x4659
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x4b
+	.byte	0xd6
+	.4byte	0x13a
+	.4byte	.LLST145
+	.uleb128 0x78
 	.4byte	.LASF3120
 	.byte	0x1
-	.byte	0xd7
-	.4byte	0x4659
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x77
+	.byte	0xd6
+	.4byte	0x13a
+	.4byte	.LLST146
+	.uleb128 0x79
 	.4byte	.LASF3110
 	.byte	0x1
-	.byte	0xd8
-	.4byte	0x10b
+	.byte	0xd7
+	.4byte	0x13a
 	.uleb128 0x7a
 	.string	"i"
 	.byte	0x1
-	.byte	0xd9
+	.byte	0xd8
 	.4byte	0xc6
 	.uleb128 0x1
-	.byte	0x5c
+	.byte	0x60
 	.uleb128 0x7b
 	.string	"j"
 	.byte	0x1
-	.byte	0xd9
+	.byte	0xd8
 	.4byte	0xc6
-	.uleb128 0x4b
-	.4byte	.LASF3109
+	.uleb128 0x78
+	.4byte	.LASF3124
 	.byte	0x1
-	.byte	0xda
-	.4byte	0xc097
-	.uleb128 0x1
-	.byte	0x53
+	.byte	0xd9
+	.4byte	0x13a
+	.4byte	.LLST147
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3123
+	.4byte	.LASF3127
 	.byte	0x1
 	.byte	0xb4
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x12be8
+	.4byte	0x12adf
 	.uleb128 0x7d
 	.string	"ebc"
 	.byte	0x1
 	.byte	0xb4
-	.4byte	0xe46d
+	.4byte	0xe461
 	.uleb128 0x7e
-	.4byte	.LASF3124
+	.4byte	.LASF3128
 	.byte	0x1
 	.byte	0xb4
 	.4byte	0xc6
-	.uleb128 0x77
+	.uleb128 0x79
 	.4byte	.LASF2954
 	.byte	0x1
 	.byte	0xb6
-	.4byte	0xe707
+	.4byte	0xe710
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3125
+	.4byte	.LASF3129
 	.byte	0x1
 	.byte	0x86
 	.4byte	0x10b
 	.byte	0x3
-	.4byte	0x12c30
+	.4byte	0x12b27
 	.uleb128 0x7e
 	.4byte	.LASF2854
 	.byte	0x1
@@ -42516,24 +42653,24 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.byte	0x86
 	.4byte	0x11a
-	.uleb128 0x77
-	.4byte	.LASF3126
+	.uleb128 0x79
+	.4byte	.LASF3130
 	.byte	0x1
 	.byte	0x88
 	.4byte	0x10b
-	.uleb128 0x77
-	.4byte	.LASF3127
+	.uleb128 0x79
+	.4byte	.LASF3113
 	.byte	0x1
 	.byte	0x89
 	.4byte	0x11a
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3128
+	.4byte	.LASF3131
 	.byte	0x1
 	.byte	0x80
 	.4byte	0x10b
 	.byte	0x3
-	.4byte	0x12c62
+	.4byte	0x12b59
 	.uleb128 0x7e
 	.4byte	.LASF2854
 	.byte	0x1
@@ -42551,11 +42688,11 @@ __exitcall_ebc_exit:
 	.4byte	0x11a
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3129
+	.4byte	.LASF3132
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x12c85
+	.4byte	0x12b7c
 	.uleb128 0x7e
 	.4byte	.LASF2929
 	.byte	0xb
@@ -42568,65 +42705,65 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3130
+	.4byte	.LASF3133
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x12cb3
+	.4byte	0x12baa
 	.uleb128 0x7e
 	.4byte	.LASF2929
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0xe0e3
 	.uleb128 0x7e
-	.4byte	.LASF3131
+	.4byte	.LASF3134
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13a
 	.uleb128 0x7e
-	.4byte	.LASF3132
+	.4byte	.LASF3135
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13a
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3133
+	.4byte	.LASF3136
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x12cf7
+	.4byte	0x12bee
 	.uleb128 0x7e
 	.4byte	.LASF2929
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xe0e3
 	.uleb128 0x7e
-	.4byte	.LASF3134
+	.4byte	.LASF3137
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF3135
+	.4byte	.LASF3138
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF3136
+	.4byte	.LASF3139
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF3137
+	.4byte	.LASF3140
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3138
+	.4byte	.LASF3141
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x12d0f
+	.4byte	0x12c06
 	.uleb128 0x7e
 	.4byte	.LASF2929
 	.byte	0xb
@@ -42634,29 +42771,29 @@ __exitcall_ebc_exit:
 	.4byte	0xe0e3
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3139
+	.4byte	.LASF3142
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12d36
+	.4byte	0x12c2d
 	.uleb128 0x7e
 	.4byte	.LASF2929
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xe0e3
 	.uleb128 0x7e
-	.4byte	.LASF2996
+	.4byte	.LASF2995
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xe123
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3140
+	.4byte	.LASF3143
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x12d80
+	.4byte	0x12c77
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa
@@ -42684,12 +42821,12 @@ __exitcall_ebc_exit:
 	.4byte	0xb78e
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3141
+	.4byte	.LASF3144
 	.byte	0xa
 	.2byte	0x108
 	.4byte	0xb78e
 	.byte	0x3
-	.4byte	0x12d9e
+	.4byte	0x12c95
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa
@@ -42697,12 +42834,12 @@ __exitcall_ebc_exit:
 	.4byte	0xa545
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3142
+	.4byte	.LASF3145
 	.byte	0xc8
 	.byte	0x1d
 	.4byte	0xb78e
 	.byte	0x3
-	.4byte	0x12dba
+	.4byte	0x12cb1
 	.uleb128 0x7d
 	.string	"bus"
 	.byte	0xc8
@@ -42710,31 +42847,31 @@ __exitcall_ebc_exit:
 	.4byte	0xadac
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3143
+	.4byte	.LASF3146
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12dd6
+	.4byte	0x12ccd
 	.uleb128 0x7e
-	.4byte	.LASF3144
+	.4byte	.LASF3147
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3145
+	.4byte	.LASF3148
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x12e0f
+	.4byte	0x12d06
 	.uleb128 0x7d
 	.string	"dev"
 	.byte	0xcb
 	.byte	0xa3
 	.4byte	0xa545
 	.uleb128 0x7e
-	.4byte	.LASF3146
+	.4byte	.LASF3149
 	.byte	0xcb
 	.byte	0xa4
 	.4byte	0x310
@@ -42744,18 +42881,18 @@ __exitcall_ebc_exit:
 	.byte	0xa5
 	.4byte	0x2ce
 	.uleb128 0x7e
-	.4byte	.LASF3147
+	.4byte	.LASF3150
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3148
+	.4byte	.LASF3151
 	.byte	0x3
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12e2b
+	.4byte	0x12d22
 	.uleb128 0x7e
 	.4byte	.LASF2930
 	.byte	0x3
@@ -42763,12 +42900,12 @@ __exitcall_ebc_exit:
 	.4byte	0xdae3
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3149
+	.4byte	.LASF3152
 	.byte	0x3
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12e50
+	.4byte	0x12d47
 	.uleb128 0x7e
 	.4byte	.LASF2930
 	.byte	0x3
@@ -42781,11 +42918,11 @@ __exitcall_ebc_exit:
 	.4byte	0x4653
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3150
+	.4byte	.LASF3153
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x12e68
+	.4byte	0x12d5f
 	.uleb128 0x7e
 	.4byte	.LASF2930
 	.byte	0x3
@@ -42793,11 +42930,11 @@ __exitcall_ebc_exit:
 	.4byte	0xdae3
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3151
+	.4byte	.LASF3154
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x12e80
+	.4byte	0x12d77
 	.uleb128 0x7e
 	.4byte	.LASF2930
 	.byte	0x3
@@ -42805,11 +42942,11 @@ __exitcall_ebc_exit:
 	.4byte	0xdae3
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3152
+	.4byte	.LASF3155
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x12e98
+	.4byte	0x12d8f
 	.uleb128 0x7e
 	.4byte	.LASF2930
 	.byte	0x3
@@ -42817,11 +42954,11 @@ __exitcall_ebc_exit:
 	.4byte	0xdae3
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3153
+	.4byte	.LASF3156
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x12eb0
+	.4byte	0x12da7
 	.uleb128 0x7e
 	.4byte	.LASF2930
 	.byte	0x3
@@ -42829,16 +42966,16 @@ __exitcall_ebc_exit:
 	.4byte	0xdae3
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3154
+	.4byte	.LASF3157
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x12ec8
+	.4byte	0x12dbf
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x12ec8
+	.4byte	0x12dbf
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -42848,24 +42985,24 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x12ee6
+	.4byte	0x12ddd
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x12ec8
+	.4byte	0x12dbf
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3155
+	.4byte	.LASF3158
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x12f1e
+	.4byte	0x12e15
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x12ec8
+	.4byte	0x12dbf
 	.uleb128 0x7e
 	.4byte	.LASF192
 	.byte	0x4
@@ -42883,12 +43020,12 @@ __exitcall_ebc_exit:
 	.4byte	0xace2
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3156
+	.4byte	.LASF3159
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12f4d
+	.4byte	0x12e44
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -42906,12 +43043,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3157
+	.4byte	.LASF3160
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12f7c
+	.4byte	0x12e73
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -42929,12 +43066,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3158
+	.4byte	.LASF3161
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12fab
+	.4byte	0x12ea2
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -42952,12 +43089,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3159
+	.4byte	.LASF3162
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12fe5
+	.4byte	0x12edc
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -42980,37 +43117,37 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3160
+	.4byte	.LASF3163
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13019
+	.4byte	0x12f10
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x3091
-	.uleb128 0x77
-	.4byte	.LASF3161
+	.uleb128 0x79
+	.4byte	.LASF3164
 	.byte	0x6
 	.byte	0xf7
 	.4byte	0x443
 	.uleb128 0x66
-	.uleb128 0x77
-	.4byte	.LASF3162
+	.uleb128 0x79
+	.4byte	.LASF3165
 	.byte	0x6
 	.byte	0xfe
 	.4byte	0x155
 	.byte	0
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3163
+	.4byte	.LASF3166
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13063
+	.4byte	0x12f5a
 	.uleb128 0x7e
 	.4byte	.LASF1147
 	.byte	0x6
@@ -43026,26 +43163,26 @@ __exitcall_ebc_exit:
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
-	.uleb128 0x77
-	.4byte	.LASF3164
+	.uleb128 0x79
+	.4byte	.LASF3167
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x66
-	.uleb128 0x77
-	.4byte	.LASF3162
+	.uleb128 0x79
+	.4byte	.LASF3165
 	.byte	0x6
 	.byte	0x56
 	.4byte	0x155
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3165
+	.4byte	.LASF3168
 	.byte	0x12
 	.2byte	0x2e5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x1308d
+	.4byte	0x12f84
 	.uleb128 0x64
 	.4byte	.LASF984
 	.byte	0x12
@@ -43058,12 +43195,12 @@ __exitcall_ebc_exit:
 	.4byte	0x31b
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3166
+	.4byte	.LASF3169
 	.byte	0x12
 	.2byte	0x216
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x130c5
+	.4byte	0x12fbc
 	.uleb128 0x64
 	.4byte	.LASF984
 	.byte	0x12
@@ -43083,12 +43220,12 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3167
+	.4byte	.LASF3170
 	.byte	0x12
 	.2byte	0x1dd
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x130fb
+	.4byte	0x12ff2
 	.uleb128 0x64
 	.4byte	.LASF984
 	.byte	0x12
@@ -43100,18 +43237,18 @@ __exitcall_ebc_exit:
 	.2byte	0x1dd
 	.4byte	0x31b
 	.uleb128 0x46
-	.4byte	.LASF3168
+	.4byte	.LASF3171
 	.byte	0x12
 	.2byte	0x1df
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3169
+	.4byte	.LASF3172
 	.byte	0x12
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x13119
+	.4byte	0x13010
 	.uleb128 0x64
 	.4byte	.LASF984
 	.byte	0x12
@@ -43119,12 +43256,12 @@ __exitcall_ebc_exit:
 	.4byte	0x2ce
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3170
+	.4byte	.LASF3173
 	.byte	0x12
 	.2byte	0x13d
 	.4byte	0xd772
 	.byte	0x3
-	.4byte	0x13137
+	.4byte	0x1302e
 	.uleb128 0x64
 	.4byte	.LASF170
 	.byte	0x12
@@ -43132,11 +43269,11 @@ __exitcall_ebc_exit:
 	.4byte	0x31b
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3171
+	.4byte	.LASF3174
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x1315a
+	.4byte	0x13051
 	.uleb128 0x7e
 	.4byte	.LASF3022
 	.byte	0xbe
@@ -43149,79 +43286,79 @@ __exitcall_ebc_exit:
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3172
+	.4byte	.LASF3175
 	.byte	0xbe
 	.byte	0xd6
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13176
+	.4byte	0x1306d
 	.uleb128 0x7e
 	.4byte	.LASF3022
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x13176
+	.4byte	0x1306d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xd641
 	.uleb128 0x62
-	.4byte	.LASF3173
+	.4byte	.LASF3176
 	.byte	0xa3
 	.2byte	0x164
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x1319a
+	.4byte	0x13091
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x1319a
+	.4byte	0x13091
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc092
 	.uleb128 0x62
-	.4byte	.LASF3174
+	.4byte	.LASF3177
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x131d5
+	.4byte	0x130cc
 	.uleb128 0x63
 	.string	"np"
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xbc8f
 	.uleb128 0x64
-	.4byte	.LASF3175
+	.4byte	.LASF3178
 	.byte	0xe
 	.2byte	0x499
 	.4byte	0x56
 	.uleb128 0x64
-	.4byte	.LASF3176
+	.4byte	.LASF3179
 	.byte	0xe
 	.2byte	0x49a
 	.4byte	0xaab
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3177
+	.4byte	.LASF3180
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13221
+	.4byte	0x13118
 	.uleb128 0x63
 	.string	"np"
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xbc8f
 	.uleb128 0x64
-	.4byte	.LASF3175
+	.4byte	.LASF3178
 	.byte	0xe
 	.2byte	0x1f0
 	.4byte	0x56
 	.uleb128 0x64
-	.4byte	.LASF3178
+	.4byte	.LASF3181
 	.byte	0xe
 	.2byte	0x1f1
 	.4byte	0xaab
@@ -43237,11 +43374,11 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3179
+	.4byte	.LASF3182
 	.byte	0xe
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x13239
+	.4byte	0x13130
 	.uleb128 0x7e
 	.4byte	.LASF865
 	.byte	0xe
@@ -43249,11 +43386,11 @@ __exitcall_ebc_exit:
 	.4byte	0xb869
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3180
+	.4byte	.LASF3183
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x1325f
+	.4byte	0x13156
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -43266,12 +43403,12 @@ __exitcall_ebc_exit:
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3181
+	.4byte	.LASF3184
 	.byte	0x2
 	.2byte	0x49b
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x1327d
+	.4byte	0x13174
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -43279,12 +43416,12 @@ __exitcall_ebc_exit:
 	.4byte	0xbaff
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3182
+	.4byte	.LASF3185
 	.byte	0x2
 	.2byte	0x2c5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x132b3
+	.4byte	0x131aa
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -43302,12 +43439,12 @@ __exitcall_ebc_exit:
 	.4byte	0x31b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3183
+	.4byte	.LASF3186
 	.byte	0xf
 	.byte	0xca
 	.4byte	0x33c
 	.byte	0x3
-	.4byte	0x132cf
+	.4byte	0x131c6
 	.uleb128 0x7d
 	.string	"res"
 	.byte	0xf
@@ -43315,12 +43452,12 @@ __exitcall_ebc_exit:
 	.4byte	0xc1a3
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3184
+	.4byte	.LASF3187
 	.byte	0xcc
 	.byte	0x22
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x132eb
+	.4byte	0x131e2
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xcc
@@ -43328,12 +43465,12 @@ __exitcall_ebc_exit:
 	.4byte	0x3091
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3185
+	.4byte	.LASF3188
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13307
+	.4byte	0x131fe
 	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xcd
@@ -43341,12 +43478,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3186
+	.4byte	.LASF3189
 	.byte	0xd
 	.2byte	0x23e
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x13325
+	.4byte	0x1321c
 	.uleb128 0x64
 	.4byte	.LASF2271
 	.byte	0xd
@@ -43354,12 +43491,12 @@ __exitcall_ebc_exit:
 	.4byte	0x31da
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3187
+	.4byte	.LASF3190
 	.byte	0xd
 	.2byte	0x203
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x1334e
+	.4byte	0x13245
 	.uleb128 0x63
 	.string	"wq"
 	.byte	0xd
@@ -43372,29 +43509,29 @@ __exitcall_ebc_exit:
 	.4byte	0x31da
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3188
+	.4byte	.LASF3191
 	.byte	0xd
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x13371
+	.4byte	0x13268
 	.uleb128 0x7e
 	.4byte	.LASF2271
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0x31da
 	.uleb128 0x7e
-	.4byte	.LASF3189
+	.4byte	.LASF3192
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3190
+	.4byte	.LASF3193
 	.byte	0x51
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1338d
+	.4byte	0x13284
 	.uleb128 0x63
 	.string	"m"
 	.byte	0x51
@@ -43402,12 +43539,12 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3191
+	.4byte	.LASF3194
 	.byte	0x51
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x133a9
+	.4byte	0x132a0
 	.uleb128 0x63
 	.string	"m"
 	.byte	0x51
@@ -43415,24 +43552,24 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3192
+	.4byte	.LASF3195
 	.byte	0xca
 	.byte	0x8a
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x133e5
+	.4byte	0x132dc
 	.uleb128 0x7e
 	.4byte	.LASF1147
 	.byte	0xca
 	.byte	0x8a
 	.4byte	0x3091
 	.uleb128 0x7e
-	.4byte	.LASF3193
+	.4byte	.LASF3196
 	.byte	0xca
 	.byte	0x8a
 	.4byte	0x2ce
 	.uleb128 0x7e
-	.4byte	.LASF3194
+	.4byte	.LASF3197
 	.byte	0xca
 	.byte	0x8a
 	.4byte	0x29b
@@ -43443,11 +43580,11 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3195
+	.4byte	.LASF3198
 	.byte	0xca
 	.byte	0x84
 	.byte	0x3
-	.4byte	0x13415
+	.4byte	0x1330c
 	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xca
@@ -43459,19 +43596,19 @@ __exitcall_ebc_exit:
 	.byte	0x84
 	.4byte	0x29
 	.uleb128 0x66
-	.uleb128 0x77
-	.4byte	.LASF3196
+	.uleb128 0x79
+	.4byte	.LASF3199
 	.byte	0xca
 	.byte	0x86
 	.4byte	0xc6
 	.byte	0
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3197
+	.4byte	.LASF3200
 	.byte	0xca
 	.byte	0x73
 	.byte	0x3
-	.4byte	0x13441
+	.4byte	0x13338
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xca
@@ -43483,25 +43620,25 @@ __exitcall_ebc_exit:
 	.byte	0x73
 	.4byte	0x29
 	.uleb128 0x7e
-	.4byte	.LASF3198
+	.4byte	.LASF3201
 	.byte	0xca
 	.byte	0x74
 	.4byte	0x29b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3199
+	.4byte	.LASF3202
 	.byte	0xca
 	.byte	0x52
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13467
+	.4byte	0x1335e
 	.uleb128 0x7d
 	.string	"ti"
 	.byte	0xca
 	.byte	0x52
-	.4byte	0x13467
+	.4byte	0x1335e
 	.uleb128 0x7e
-	.4byte	.LASF3200
+	.4byte	.LASF3203
 	.byte	0xca
 	.byte	0x52
 	.4byte	0xc6
@@ -43510,24 +43647,24 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.4byte	0xc1e
 	.uleb128 0x7c
-	.4byte	.LASF3201
+	.4byte	.LASF3204
 	.byte	0x5
 	.byte	0xf
 	.4byte	0x2eda
 	.byte	0x3
-	.4byte	0x13489
-	.uleb128 0x77
-	.4byte	.LASF3202
+	.4byte	0x13380
+	.uleb128 0x79
+	.4byte	.LASF3205
 	.byte	0x5
 	.byte	0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3203
+	.4byte	.LASF3206
 	.byte	0x10
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x134cd
+	.4byte	0x133c4
 	.uleb128 0x7e
 	.4byte	.LASF959
 	.byte	0x10
@@ -43538,7 +43675,7 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x134c0
+	.4byte	0x133b7
 	.uleb128 0x22
 	.4byte	.LASF3091
 	.byte	0x10
@@ -43548,27 +43685,27 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x1233a
+	.4byte	0x12326
 	.byte	0
 	.uleb128 0x7b
 	.string	"__u"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x134a1
+	.4byte	0x13398
 	.byte	0
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3275
+	.4byte	.LASF3280
 	.byte	0x20
 	.2byte	0x126
 	.byte	0x3
 	.uleb128 0x7c
-	.4byte	.LASF3204
+	.4byte	.LASF3207
 	.byte	0xce
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x134f1
+	.4byte	0x133e8
 	.uleb128 0x7d
 	.string	"n"
 	.byte	0xce
@@ -43576,12 +43713,12 @@ __exitcall_ebc_exit:
 	.4byte	0x155
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3205
+	.4byte	.LASF3208
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xdd
 	.byte	0x3
-	.4byte	0x13523
+	.4byte	0x1341a
 	.uleb128 0x7e
 	.4byte	.LASF2453
 	.byte	0x8
@@ -43592,19 +43729,19 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xc6
-	.uleb128 0x77
+	.uleb128 0x79
 	.4byte	.LASF260
 	.byte	0x8
 	.byte	0x9c
 	.4byte	0x8b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3206
+	.4byte	.LASF3209
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13549
+	.4byte	0x13440
 	.uleb128 0x7d
 	.string	"nr"
 	.byte	0x7
@@ -43614,17 +43751,17 @@ __exitcall_ebc_exit:
 	.4byte	.LASF1147
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x13549
+	.4byte	0x13440
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x3a
 	.uleb128 0x7f
-	.4byte	.LASF3207
+	.4byte	.LASF3210
 	.byte	0x11
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x13582
+	.4byte	0x13479
 	.uleb128 0x7d
 	.string	"i"
 	.byte	0x11
@@ -43634,7 +43771,7 @@ __exitcall_ebc_exit:
 	.string	"v"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13582
+	.4byte	0x13479
 	.uleb128 0x7b
 	.string	"w0"
 	.byte	0x11
@@ -43644,18 +43781,18 @@ __exitcall_ebc_exit:
 	.string	"x1"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13582
+	.4byte	0x13479
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x367
 	.uleb128 0x7c
-	.4byte	.LASF3208
+	.4byte	.LASF3211
 	.byte	0xcf
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x135a2
+	.4byte	0x13499
 	.uleb128 0x7d
 	.string	"x"
 	.byte	0xcf
@@ -43663,12 +43800,12 @@ __exitcall_ebc_exit:
 	.4byte	0xef
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3209
+	.4byte	.LASF3212
 	.byte	0xd0
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x135be
+	.4byte	0x134b5
 	.uleb128 0x7e
 	.4byte	.LASF2486
 	.byte	0xd0
@@ -43676,16 +43813,16 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3210
+	.4byte	.LASF3213
 	.byte	0xd1
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x135df
+	.4byte	0x134d6
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd1
 	.byte	0xb
-	.4byte	0x135df
+	.4byte	0x134d6
 	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xd1
@@ -43694,21 +43831,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x135e7
+	.4byte	0x134de
 	.uleb128 0x81
 	.uleb128 0x3
-	.4byte	0x135e5
+	.4byte	0x134dc
 	.uleb128 0x7f
-	.4byte	.LASF3211
+	.4byte	.LASF3214
 	.byte	0xd1
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x1360d
+	.4byte	0x13504
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd1
 	.byte	0x9
-	.4byte	0x135df
+	.4byte	0x134d6
 	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xd1
@@ -43716,16 +43853,16 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3212
+	.4byte	.LASF3215
 	.byte	0xc
 	.byte	0xe4
 	.byte	0x3
-	.4byte	0x13639
+	.4byte	0x13530
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xc
 	.byte	0xe4
-	.4byte	0x13639
+	.4byte	0x13530
 	.uleb128 0x7d
 	.string	"res"
 	.byte	0xc
@@ -43739,759 +43876,769 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x135e5
+	.4byte	0x134dc
 	.uleb128 0x82
-	.4byte	0x1261d
-	.8byte	.LFB2846
-	.8byte	.LFE2846-.LFB2846
+	.4byte	0x12609
+	.8byte	.LFB2847
+	.8byte	.LFE2847-.LFB2847
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1377f
+	.4byte	0x13676
 	.uleb128 0x71
-	.4byte	0x1262a
+	.4byte	0x12616
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x12636
-	.4byte	.LLST99
+	.4byte	0x12622
+	.4byte	.LLST95
 	.uleb128 0x6f
-	.4byte	0x12642
-	.4byte	.LLST100
+	.4byte	0x1262e
+	.4byte	.LLST96
 	.uleb128 0x54
-	.4byte	0x1264e
+	.4byte	0x1263a
 	.uleb128 0x54
-	.4byte	0x1264e
+	.4byte	0x1263a
 	.uleb128 0x54
-	.4byte	0x1264e
+	.4byte	0x1263a
 	.uleb128 0x5c
-	.4byte	0x1265a
+	.4byte	0x12646
 	.uleb128 0x60
-	.4byte	0x12666
+	.4byte	0x12652
 	.uleb128 0x1
 	.byte	0x5c
 	.uleb128 0x5c
-	.4byte	0x12670
+	.4byte	0x1265c
 	.uleb128 0x60
-	.4byte	0x1267a
+	.4byte	0x12666
 	.uleb128 0x1
 	.byte	0x5f
 	.uleb128 0x5c
-	.4byte	0x12686
+	.4byte	0x12672
 	.uleb128 0x5f
-	.4byte	0x12692
-	.4byte	.LLST101
+	.4byte	0x1267e
+	.4byte	.LLST97
 	.uleb128 0x5f
-	.4byte	0x1269e
-	.4byte	.LLST102
+	.4byte	0x1268a
+	.4byte	.LLST98
 	.uleb128 0x5f
-	.4byte	0x126aa
-	.4byte	.LLST103
+	.4byte	0x12696
+	.4byte	.LLST99
 	.uleb128 0x5f
-	.4byte	0x126b6
-	.4byte	.LLST104
+	.4byte	0x126a2
+	.4byte	.LLST100
 	.uleb128 0x5f
-	.4byte	0x126c2
-	.4byte	.LLST105
+	.4byte	0x126ae
+	.4byte	.LLST101
 	.uleb128 0x5f
-	.4byte	0x126ce
-	.4byte	.LLST106
+	.4byte	0x126ba
+	.4byte	.LLST102
 	.uleb128 0x60
-	.4byte	0x126da
+	.4byte	0x126c6
 	.uleb128 0x1
 	.byte	0x55
 	.uleb128 0x5c
-	.4byte	0x126e6
+	.4byte	0x126d2
 	.uleb128 0x58
-	.4byte	0x12c30
-	.8byte	.LBB1212
-	.4byte	.Ldebug_ranges0+0x700
+	.4byte	0x12b27
+	.8byte	.LBB1192
+	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
-	.2byte	0x1a6
-	.4byte	0x1370a
+	.2byte	0x225
+	.4byte	0x13601
 	.uleb128 0x54
-	.4byte	0x12c56
+	.4byte	0x12b4d
 	.uleb128 0x54
-	.4byte	0x12c4b
+	.4byte	0x12b42
 	.uleb128 0x54
-	.4byte	0x12c40
+	.4byte	0x12b37
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12c30
-	.8byte	.LBB1217
-	.4byte	.Ldebug_ranges0+0x750
+	.4byte	0x12b27
+	.8byte	.LBB1197
+	.4byte	.Ldebug_ranges0+0x720
 	.byte	0x1
-	.2byte	0x1a7
-	.4byte	0x13732
+	.2byte	0x226
+	.4byte	0x13629
 	.uleb128 0x54
-	.4byte	0x12c56
+	.4byte	0x12b4d
 	.uleb128 0x54
-	.4byte	0x12c4b
+	.4byte	0x12b42
 	.uleb128 0x54
-	.4byte	0x12c40
+	.4byte	0x12b37
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12c30
-	.8byte	.LBB1229
-	.4byte	.Ldebug_ranges0+0x7c0
+	.4byte	0x12b27
+	.8byte	.LBB1209
+	.4byte	.Ldebug_ranges0+0x790
 	.byte	0x1
-	.2byte	0x1a8
-	.4byte	0x1375a
+	.2byte	0x227
+	.4byte	0x13651
 	.uleb128 0x54
-	.4byte	0x12c56
+	.4byte	0x12b4d
 	.uleb128 0x54
-	.4byte	0x12c4b
+	.4byte	0x12b42
 	.uleb128 0x54
-	.4byte	0x12c40
+	.4byte	0x12b37
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x12c30
-	.8byte	.LBB1241
-	.4byte	.Ldebug_ranges0+0x830
+	.4byte	0x12b27
+	.8byte	.LBB1221
+	.4byte	.Ldebug_ranges0+0x800
 	.byte	0x1
-	.2byte	0x1a9
+	.2byte	0x228
 	.uleb128 0x54
-	.4byte	0x12c56
+	.4byte	0x12b4d
 	.uleb128 0x54
-	.4byte	0x12c4b
+	.4byte	0x12b42
 	.uleb128 0x54
-	.4byte	0x12c40
+	.4byte	0x12b37
 	.byte	0
 	.byte	0
 	.uleb128 0x82
-	.4byte	0x12547
-	.8byte	.LFB2847
-	.8byte	.LFE2847-.LFB2847
+	.4byte	0x12533
+	.8byte	.LFB2848
+	.8byte	.LFE2848-.LFB2848
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1393d
+	.4byte	0x13834
 	.uleb128 0x71
-	.4byte	0x12554
+	.4byte	0x12540
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x12560
-	.4byte	.LLST107
+	.4byte	0x1254c
+	.4byte	.LLST103
 	.uleb128 0x6f
-	.4byte	0x1256c
-	.4byte	.LLST108
+	.4byte	0x12558
+	.4byte	.LLST104
 	.uleb128 0x54
-	.4byte	0x12578
+	.4byte	0x12564
 	.uleb128 0x54
-	.4byte	0x12578
+	.4byte	0x12564
 	.uleb128 0x54
-	.4byte	0x12578
+	.4byte	0x12564
 	.uleb128 0x5c
-	.4byte	0x12584
+	.4byte	0x12570
 	.uleb128 0x5f
-	.4byte	0x12590
-	.4byte	.LLST109
+	.4byte	0x1257c
+	.4byte	.LLST105
 	.uleb128 0x5f
-	.4byte	0x1259c
-	.4byte	.LLST110
+	.4byte	0x12588
+	.4byte	.LLST106
 	.uleb128 0x60
-	.4byte	0x125a8
+	.4byte	0x12594
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x60
-	.4byte	0x125b4
+	.4byte	0x125a0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5f
-	.4byte	0x125c0
-	.4byte	.LLST111
+	.4byte	0x125ac
+	.4byte	.LLST107
 	.uleb128 0x60
-	.4byte	0x125cc
+	.4byte	0x125b8
 	.uleb128 0x1
 	.byte	0x5f
 	.uleb128 0x60
-	.4byte	0x125d8
+	.4byte	0x125c4
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x60
-	.4byte	0x125e4
+	.4byte	0x125d0
 	.uleb128 0x1
 	.byte	0x5c
 	.uleb128 0x5c
-	.4byte	0x125ee
+	.4byte	0x125da
 	.uleb128 0x5f
-	.4byte	0x125f8
-	.4byte	.LLST112
+	.4byte	0x125e4
+	.4byte	.LLST108
 	.uleb128 0x60
-	.4byte	0x12604
+	.4byte	0x125f0
 	.uleb128 0x1
 	.byte	0x55
 	.uleb128 0x5c
-	.4byte	0x12610
+	.4byte	0x125fc
 	.uleb128 0x58
-	.4byte	0x12be8
-	.8byte	.LBB1252
-	.4byte	.Ldebug_ranges0+0x880
+	.4byte	0x12adf
+	.8byte	.LBB1232
+	.4byte	.Ldebug_ranges0+0x850
 	.byte	0x1
-	.2byte	0x1ce
-	.4byte	0x1385c
+	.2byte	0x24d
+	.4byte	0x13753
 	.uleb128 0x54
-	.4byte	0x12c0e
+	.4byte	0x12b05
 	.uleb128 0x54
-	.4byte	0x12c03
+	.4byte	0x12afa
 	.uleb128 0x54
-	.4byte	0x12bf8
+	.4byte	0x12aef
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x880
+	.4byte	.Ldebug_ranges0+0x850
 	.uleb128 0x5c
-	.4byte	0x12c19
+	.4byte	0x12b10
 	.uleb128 0x5f
-	.4byte	0x12c24
-	.4byte	.LLST113
+	.4byte	0x12b1b
+	.4byte	.LLST109
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12be8
-	.8byte	.LBB1255
-	.8byte	.LBE1255-.LBB1255
+	.4byte	0x12adf
+	.8byte	.LBB1235
+	.8byte	.LBE1235-.LBB1235
 	.byte	0x1
-	.2byte	0x1cb
-	.4byte	0x138a8
+	.2byte	0x24a
+	.4byte	0x1379f
 	.uleb128 0x54
-	.4byte	0x12c0e
+	.4byte	0x12b05
 	.uleb128 0x54
-	.4byte	0x12c03
+	.4byte	0x12afa
 	.uleb128 0x54
-	.4byte	0x12bf8
+	.4byte	0x12aef
 	.uleb128 0x5e
-	.8byte	.LBB1256
-	.8byte	.LBE1256-.LBB1256
+	.8byte	.LBB1236
+	.8byte	.LBE1236-.LBB1236
 	.uleb128 0x5c
-	.4byte	0x12c19
+	.4byte	0x12b10
 	.uleb128 0x5f
-	.4byte	0x12c24
-	.4byte	.LLST114
+	.4byte	0x12b1b
+	.4byte	.LLST110
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12be8
-	.8byte	.LBB1257
-	.8byte	.LBE1257-.LBB1257
+	.4byte	0x12adf
+	.8byte	.LBB1237
+	.8byte	.LBE1237-.LBB1237
 	.byte	0x1
-	.2byte	0x1cc
-	.4byte	0x138f4
+	.2byte	0x24b
+	.4byte	0x137eb
 	.uleb128 0x54
-	.4byte	0x12c0e
+	.4byte	0x12b05
 	.uleb128 0x54
-	.4byte	0x12c03
+	.4byte	0x12afa
 	.uleb128 0x54
-	.4byte	0x12bf8
+	.4byte	0x12aef
 	.uleb128 0x5e
-	.8byte	.LBB1258
-	.8byte	.LBE1258-.LBB1258
+	.8byte	.LBB1238
+	.8byte	.LBE1238-.LBB1238
 	.uleb128 0x5c
-	.4byte	0x12c19
+	.4byte	0x12b10
 	.uleb128 0x5f
-	.4byte	0x12c24
-	.4byte	.LLST115
+	.4byte	0x12b1b
+	.4byte	.LLST111
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12be8
-	.8byte	.LBB1259
-	.8byte	.LBE1259-.LBB1259
+	.4byte	0x12adf
+	.8byte	.LBB1239
+	.8byte	.LBE1239-.LBB1239
 	.byte	0x1
-	.2byte	0x1cd
+	.2byte	0x24c
 	.uleb128 0x54
-	.4byte	0x12c0e
+	.4byte	0x12b05
 	.uleb128 0x54
-	.4byte	0x12c03
+	.4byte	0x12afa
 	.uleb128 0x54
-	.4byte	0x12bf8
+	.4byte	0x12aef
 	.uleb128 0x5e
-	.8byte	.LBB1260
-	.8byte	.LBE1260-.LBB1260
+	.8byte	.LBB1240
+	.8byte	.LBE1240-.LBB1240
 	.uleb128 0x5c
-	.4byte	0x12c19
+	.4byte	0x12b10
 	.uleb128 0x5f
-	.4byte	0x12c24
-	.4byte	.LLST116
+	.4byte	0x12b1b
+	.4byte	.LLST112
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x1250f
-	.8byte	.LFB2848
-	.8byte	.LFE2848-.LFB2848
+	.4byte	0x124fb
+	.8byte	.LFB2849
+	.8byte	.LFE2849-.LFB2849
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13a40
+	.4byte	0x13937
 	.uleb128 0x6f
-	.4byte	0x1251c
-	.4byte	.LLST117
+	.4byte	0x12508
+	.4byte	.LLST113
 	.uleb128 0x54
-	.4byte	0x12528
+	.4byte	0x12514
 	.uleb128 0x5c
-	.4byte	0x12534
+	.4byte	0x12520
 	.uleb128 0x58
-	.4byte	0x12d36
-	.8byte	.LBB1262
-	.4byte	.Ldebug_ranges0+0x8b0
+	.4byte	0x12c2d
+	.8byte	.LBB1242
+	.4byte	.Ldebug_ranges0+0x880
 	.byte	0x1
-	.2byte	0x1dc
-	.4byte	0x139be
+	.2byte	0x25b
+	.4byte	0x138b5
 	.uleb128 0x54
-	.4byte	0x12d67
+	.4byte	0x12c5e
 	.uleb128 0x54
-	.4byte	0x12d5b
+	.4byte	0x12c52
 	.uleb128 0x54
-	.4byte	0x12d4f
+	.4byte	0x12c46
 	.uleb128 0x54
-	.4byte	0x12d43
+	.4byte	0x12c3a
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x8b0
+	.4byte	.Ldebug_ranges0+0x880
 	.uleb128 0x5c
-	.4byte	0x12d73
+	.4byte	0x12c6a
 	.uleb128 0x5d
-	.4byte	0x12d80
-	.8byte	.LBB1264
-	.4byte	.Ldebug_ranges0+0x900
+	.4byte	0x12c77
+	.8byte	.LBB1244
+	.4byte	.Ldebug_ranges0+0x8d0
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x54
-	.4byte	0x12d91
+	.4byte	0x12c88
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12cb3
-	.8byte	.LBB1273
-	.4byte	.Ldebug_ranges0+0x930
+	.4byte	0x12baa
+	.8byte	.LBB1253
+	.4byte	.Ldebug_ranges0+0x900
 	.byte	0x1
-	.2byte	0x1dd
-	.4byte	0x139f0
+	.2byte	0x25c
+	.4byte	0x138e7
 	.uleb128 0x54
-	.4byte	0x12ceb
+	.4byte	0x12be2
 	.uleb128 0x54
-	.4byte	0x12ce0
+	.4byte	0x12bd7
 	.uleb128 0x54
-	.4byte	0x12cd5
+	.4byte	0x12bcc
 	.uleb128 0x54
-	.4byte	0x12cca
+	.4byte	0x12bc1
 	.uleb128 0x54
-	.4byte	0x12cbf
+	.4byte	0x12bb6
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12c85
-	.8byte	.LBB1279
-	.8byte	.LBE1279-.LBB1279
+	.4byte	0x12b7c
+	.8byte	.LBB1259
+	.8byte	.LBE1259-.LBB1259
 	.byte	0x1
-	.2byte	0x1de
-	.4byte	0x13a1c
+	.2byte	0x25d
+	.4byte	0x13913
 	.uleb128 0x54
-	.4byte	0x12ca7
+	.4byte	0x12b9e
 	.uleb128 0x54
-	.4byte	0x12c9c
+	.4byte	0x12b93
 	.uleb128 0x54
-	.4byte	0x12c91
+	.4byte	0x12b88
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12c62
-	.8byte	.LBB1281
-	.8byte	.LBE1281-.LBB1281
+	.4byte	0x12b59
+	.8byte	.LBB1261
+	.8byte	.LBE1261-.LBB1261
 	.byte	0x1
-	.2byte	0x1df
+	.2byte	0x25e
 	.uleb128 0x54
-	.4byte	0x12c79
+	.4byte	0x12b70
 	.uleb128 0x54
-	.4byte	0x12c6e
+	.4byte	0x12b65
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12bb6
-	.8byte	.LFB2849
-	.8byte	.LFE2849-.LFB2849
+	.4byte	0x12aad
+	.8byte	.LFB2850
+	.8byte	.LFE2850-.LFB2850
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13aff
+	.4byte	0x139f6
 	.uleb128 0x6f
-	.4byte	0x12bc6
-	.4byte	.LLST120
+	.4byte	0x12abd
+	.4byte	.LLST116
 	.uleb128 0x6f
-	.4byte	0x12bd1
-	.4byte	.LLST121
+	.4byte	0x12ac8
+	.4byte	.LLST117
 	.uleb128 0x5c
-	.4byte	0x12bdc
+	.4byte	0x12ad3
 	.uleb128 0x70
-	.4byte	0x12ece
-	.8byte	.LBB1305
-	.8byte	.LBE1305-.LBB1305
+	.4byte	0x12dc5
+	.8byte	.LBB1285
+	.8byte	.LBE1285-.LBB1285
 	.byte	0x1
 	.byte	0xbc
-	.4byte	0x13aa1
+	.4byte	0x13998
 	.uleb128 0x54
-	.4byte	0x12eda
+	.4byte	0x12dd1
 	.uleb128 0x4e
-	.8byte	.LVL435
-	.4byte	0x13e9d
+	.8byte	.LVL437
+	.4byte	0x13dac
 	.byte	0
 	.uleb128 0x6e
-	.4byte	0x12d0f
-	.8byte	.LBB1307
-	.4byte	.Ldebug_ranges0+0x9e0
+	.4byte	0x12c06
+	.8byte	.LBB1287
+	.4byte	.Ldebug_ranges0+0x9b0
 	.byte	0x1
 	.byte	0xbf
-	.4byte	0x13ac3
+	.4byte	0x139ba
 	.uleb128 0x54
-	.4byte	0x12d2a
+	.4byte	0x12c21
 	.uleb128 0x54
-	.4byte	0x12d1f
+	.4byte	0x12c16
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12e98
-	.8byte	.LBB1311
-	.8byte	.LBE1311-.LBB1311
+	.4byte	0x12d8f
+	.8byte	.LBB1291
+	.8byte	.LBE1291-.LBB1291
 	.byte	0x1
 	.byte	0xc0
-	.4byte	0x13ae4
+	.4byte	0x139db
 	.uleb128 0x54
-	.4byte	0x12ea4
+	.4byte	0x12d9b
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL434
-	.4byte	0x13e56
+	.8byte	.LVL436
+	.4byte	0x13d65
 	.uleb128 0x4e
-	.8byte	.LVL438
-	.4byte	0x13bda
+	.8byte	.LVL440
+	.4byte	0x13ad1
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12bb6
-	.8byte	.LFB2853
-	.8byte	.LFE2853-.LFB2853
+	.4byte	0x12aad
+	.8byte	.LFB2854
+	.8byte	.LFE2854-.LFB2854
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13bc2
+	.4byte	0x13ab9
 	.uleb128 0x6f
-	.4byte	0x12bc6
-	.4byte	.LLST145
+	.4byte	0x12abd
+	.4byte	.LLST140
 	.uleb128 0x5c
-	.4byte	0x12bdc
+	.4byte	0x12ad3
 	.uleb128 0x54
-	.4byte	0x12bd1
+	.4byte	0x12ac8
 	.uleb128 0x6e
-	.4byte	0x12e80
-	.8byte	.LBB1671
-	.4byte	.Ldebug_ranges0+0xec0
+	.4byte	0x12d77
+	.8byte	.LBB1645
+	.4byte	.Ldebug_ranges0+0xe60
 	.byte	0x1
 	.byte	0xc6
-	.4byte	0x13b4b
+	.4byte	0x13a42
 	.uleb128 0x54
-	.4byte	0x12e8c
+	.4byte	0x12d83
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12cf7
-	.8byte	.LBB1675
-	.8byte	.LBE1675-.LBB1675
+	.4byte	0x12bee
+	.8byte	.LBB1649
+	.8byte	.LBE1649-.LBB1649
 	.byte	0x1
 	.byte	0xc7
-	.4byte	0x13b6c
+	.4byte	0x13a63
 	.uleb128 0x54
-	.4byte	0x12d03
+	.4byte	0x12bfa
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12eb0
-	.8byte	.LBB1677
-	.8byte	.LBE1677-.LBB1677
+	.4byte	0x12da7
+	.8byte	.LBB1651
+	.8byte	.LBE1651-.LBB1651
 	.byte	0x1
 	.byte	0xca
-	.4byte	0x13b9a
+	.4byte	0x13a91
 	.uleb128 0x54
-	.4byte	0x12ebc
+	.4byte	0x12db3
 	.uleb128 0x4e
 	.8byte	.LVL624
-	.4byte	0x13e32
+	.4byte	0x13d29
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL618
-	.4byte	0x13e56
+	.4byte	0x13d65
 	.uleb128 0x4e
 	.8byte	.LVL621
-	.4byte	0x13bda
+	.4byte	0x13ad1
 	.uleb128 0x4e
 	.8byte	.LVL625
-	.4byte	0x13bda
+	.4byte	0x13ad1
 	.byte	0
 	.uleb128 0x84
-	.4byte	.LASF3213
-	.4byte	.LASF3213
+	.4byte	.LASF3216
+	.4byte	.LASF3216
 	.byte	0xbe
 	.byte	0xcc
 	.uleb128 0x84
-	.4byte	.LASF3214
-	.4byte	.LASF3214
+	.4byte	.LASF3217
+	.4byte	.LASF3217
 	.byte	0xbe
 	.byte	0xca
 	.uleb128 0x85
-	.4byte	.LASF3215
-	.4byte	.LASF3215
+	.4byte	.LASF3218
+	.4byte	.LASF3218
 	.byte	0x2
 	.2byte	0x5d1
 	.uleb128 0x84
-	.4byte	.LASF3216
-	.4byte	.LASF3216
+	.4byte	.LASF3219
+	.4byte	.LASF3219
 	.byte	0xac
 	.byte	0x4f
 	.uleb128 0x85
-	.4byte	.LASF3217
-	.4byte	.LASF3217
+	.4byte	.LASF3220
+	.4byte	.LASF3220
 	.byte	0x2
 	.2byte	0x2bf
 	.uleb128 0x85
-	.4byte	.LASF3218
-	.4byte	.LASF3218
+	.4byte	.LASF3221
+	.4byte	.LASF3221
 	.byte	0xe
 	.2byte	0x149
 	.uleb128 0x85
-	.4byte	.LASF3219
-	.4byte	.LASF3219
+	.4byte	.LASF3222
+	.4byte	.LASF3222
 	.byte	0xe
 	.2byte	0x172
 	.uleb128 0x84
-	.4byte	.LASF3220
-	.4byte	.LASF3220
+	.4byte	.LASF3223
+	.4byte	.LASF3223
 	.byte	0xd2
 	.byte	0x78
 	.uleb128 0x84
-	.4byte	.LASF3221
-	.4byte	.LASF3221
+	.4byte	.LASF3224
+	.4byte	.LASF3224
 	.byte	0xaa
 	.byte	0x59
 	.uleb128 0x84
-	.4byte	.LASF3222
-	.4byte	.LASF3222
+	.4byte	.LASF3225
+	.4byte	.LASF3225
 	.byte	0xc3
 	.byte	0x2f
 	.uleb128 0x86
-	.4byte	.LASF3223
-	.4byte	.LASF3223
+	.4byte	.LASF3226
+	.4byte	.LASF3226
 	.uleb128 0x84
-	.4byte	.LASF3223
-	.4byte	.LASF3223
+	.4byte	.LASF3226
+	.4byte	.LASF3226
 	.byte	0xd3
 	.byte	0x36
 	.uleb128 0x85
-	.4byte	.LASF3224
-	.4byte	.LASF3224
+	.4byte	.LASF3227
+	.4byte	.LASF3227
 	.byte	0x2
 	.2byte	0x5cb
 	.uleb128 0x84
-	.4byte	.LASF3225
-	.4byte	.LASF3225
+	.4byte	.LASF3228
+	.4byte	.LASF3228
 	.byte	0xc2
 	.byte	0x30
 	.uleb128 0x84
-	.4byte	.LASF3226
-	.4byte	.LASF3226
+	.4byte	.LASF3229
+	.4byte	.LASF3229
 	.byte	0xc2
 	.byte	0x31
 	.uleb128 0x84
-	.4byte	.LASF3227
-	.4byte	.LASF3227
+	.4byte	.LASF3230
+	.4byte	.LASF3230
 	.byte	0xab
 	.byte	0x9
 	.uleb128 0x85
-	.4byte	.LASF3228
-	.4byte	.LASF3228
+	.4byte	.LASF3231
+	.4byte	.LASF3231
 	.byte	0x48
 	.2byte	0x6b8
 	.uleb128 0x85
-	.4byte	.LASF3229
-	.4byte	.LASF3229
+	.4byte	.LASF3232
+	.4byte	.LASF3232
 	.byte	0x48
 	.2byte	0x676
 	.uleb128 0x84
-	.4byte	.LASF3230
-	.4byte	.LASF3230
+	.4byte	.LASF3233
+	.4byte	.LASF3233
 	.byte	0x9c
 	.byte	0x67
 	.uleb128 0x84
-	.4byte	.LASF3231
-	.4byte	.LASF3231
+	.4byte	.LASF3234
+	.4byte	.LASF3234
 	.byte	0x54
 	.byte	0x53
 	.uleb128 0x84
-	.4byte	.LASF3232
-	.4byte	.LASF3232
+	.4byte	.LASF3235
+	.4byte	.LASF3235
 	.byte	0x54
 	.byte	0xa5
 	.uleb128 0x84
-	.4byte	.LASF3233
-	.4byte	.LASF3233
+	.4byte	.LASF3236
+	.4byte	.LASF3236
 	.byte	0xc3
 	.byte	0x2b
 	.uleb128 0x84
-	.4byte	.LASF3234
-	.4byte	.LASF3234
+	.4byte	.LASF3237
+	.4byte	.LASF3237
 	.byte	0xc3
 	.byte	0x27
 	.uleb128 0x85
-	.4byte	.LASF3235
-	.4byte	.LASF3235
+	.4byte	.LASF3238
+	.4byte	.LASF3238
 	.byte	0x12
 	.2byte	0x184
 	.uleb128 0x84
-	.4byte	.LASF3236
-	.4byte	.LASF3236
+	.4byte	.LASF3239
+	.4byte	.LASF3239
 	.byte	0xd4
 	.byte	0x4d
 	.uleb128 0x85
-	.4byte	.LASF3237
-	.4byte	.LASF3237
+	.4byte	.LASF3240
+	.4byte	.LASF3240
 	.byte	0x20
 	.2byte	0x1d9
-	.uleb128 0x86
-	.4byte	.LASF3238
-	.4byte	.LASF3238
 	.uleb128 0x84
-	.4byte	.LASF3239
-	.4byte	.LASF3239
-	.byte	0x12
-	.byte	0xb9
-	.uleb128 0x84
-	.4byte	.LASF3240
-	.4byte	.LASF3240
+	.4byte	.LASF3241
+	.4byte	.LASF3241
 	.byte	0x3
 	.byte	0x3b
 	.uleb128 0x84
-	.4byte	.LASF3241
-	.4byte	.LASF3241
+	.4byte	.LASF3242
+	.4byte	.LASF3242
+	.byte	0x12
+	.byte	0xb9
+	.uleb128 0x86
+	.4byte	.LASF3243
+	.4byte	.LASF3243
+	.uleb128 0x84
+	.4byte	.LASF3244
+	.4byte	.LASF3244
 	.byte	0x3a
 	.byte	0xc2
 	.uleb128 0x84
-	.4byte	.LASF3242
-	.4byte	.LASF3242
+	.4byte	.LASF3245
+	.4byte	.LASF3245
 	.byte	0xac
 	.byte	0x4e
 	.uleb128 0x85
-	.4byte	.LASF3243
-	.4byte	.LASF3243
+	.4byte	.LASF3246
+	.4byte	.LASF3246
 	.byte	0x2
 	.2byte	0x287
 	.uleb128 0x84
-	.4byte	.LASF3244
-	.4byte	.LASF3244
+	.4byte	.LASF3247
+	.4byte	.LASF3247
 	.byte	0xbf
 	.byte	0x38
 	.uleb128 0x85
-	.4byte	.LASF3245
-	.4byte	.LASF3245
+	.4byte	.LASF3248
+	.4byte	.LASF3248
 	.byte	0xa3
 	.2byte	0x379
 	.uleb128 0x86
-	.4byte	.LASF3246
-	.4byte	.LASF3246
+	.4byte	.LASF3249
+	.4byte	.LASF3249
 	.uleb128 0x85
-	.4byte	.LASF3247
-	.4byte	.LASF3247
+	.4byte	.LASF3250
+	.4byte	.LASF3250
 	.byte	0x20
 	.2byte	0x1c7
 	.uleb128 0x85
-	.4byte	.LASF3248
-	.4byte	.LASF3248
+	.4byte	.LASF3251
+	.4byte	.LASF3251
 	.byte	0x20
 	.2byte	0x17e
 	.uleb128 0x84
-	.4byte	.LASF3249
-	.4byte	.LASF3249
+	.4byte	.LASF3252
+	.4byte	.LASF3252
 	.byte	0x3
 	.byte	0x3a
 	.uleb128 0x84
-	.4byte	.LASF3250
-	.4byte	.LASF3250
+	.4byte	.LASF3253
+	.4byte	.LASF3253
 	.byte	0xc2
 	.byte	0x32
 	.uleb128 0x84
-	.4byte	.LASF3251
-	.4byte	.LASF3251
+	.4byte	.LASF3254
+	.4byte	.LASF3254
 	.byte	0xc3
 	.byte	0x2c
 	.uleb128 0x85
-	.4byte	.LASF3252
-	.4byte	.LASF3252
+	.4byte	.LASF3255
+	.4byte	.LASF3255
 	.byte	0x76
 	.2byte	0xa07
 	.uleb128 0x84
-	.4byte	.LASF3253
-	.4byte	.LASF3253
+	.4byte	.LASF3256
+	.4byte	.LASF3256
 	.byte	0x48
 	.byte	0xdc
 	.uleb128 0x85
-	.4byte	.LASF3254
-	.4byte	.LASF3254
+	.4byte	.LASF3257
+	.4byte	.LASF3257
 	.byte	0x3a
 	.2byte	0x459
 	.uleb128 0x84
-	.4byte	.LASF3255
-	.4byte	.LASF3255
+	.4byte	.LASF3258
+	.4byte	.LASF3258
 	.byte	0x3a
 	.byte	0xe9
 	.uleb128 0x85
-	.4byte	.LASF3256
-	.4byte	.LASF3256
+	.4byte	.LASF3259
+	.4byte	.LASF3259
 	.byte	0x3a
 	.2byte	0x45a
 	.uleb128 0x85
-	.4byte	.LASF3257
-	.4byte	.LASF3257
+	.4byte	.LASF3260
+	.4byte	.LASF3260
 	.byte	0x6
 	.2byte	0x19f
 	.uleb128 0x85
-	.4byte	.LASF3258
-	.4byte	.LASF3258
+	.4byte	.LASF3261
+	.4byte	.LASF3261
 	.byte	0x6
 	.2byte	0x199
 	.uleb128 0x84
-	.4byte	.LASF3259
-	.4byte	.LASF3259
+	.4byte	.LASF3262
+	.4byte	.LASF3262
 	.byte	0xc3
 	.byte	0x25
 	.uleb128 0x84
-	.4byte	.LASF3260
-	.4byte	.LASF3260
+	.4byte	.LASF3263
+	.4byte	.LASF3263
 	.byte	0xc3
 	.byte	0x2a
 	.uleb128 0x84
-	.4byte	.LASF3261
-	.4byte	.LASF3261
+	.4byte	.LASF3264
+	.4byte	.LASF3264
 	.byte	0xc3
 	.byte	0x24
 	.uleb128 0x84
-	.4byte	.LASF3262
-	.4byte	.LASF3262
+	.4byte	.LASF3265
+	.4byte	.LASF3265
 	.byte	0xc3
 	.byte	0x23
 	.uleb128 0x84
-	.4byte	.LASF3263
-	.4byte	.LASF3263
+	.4byte	.LASF3266
+	.4byte	.LASF3266
 	.byte	0x9c
 	.byte	0x73
 	.uleb128 0x84
-	.4byte	.LASF3264
-	.4byte	.LASF3264
+	.4byte	.LASF3267
+	.4byte	.LASF3267
 	.byte	0xc3
 	.byte	0x29
 	.uleb128 0x84
-	.4byte	.LASF3265
-	.4byte	.LASF3265
+	.4byte	.LASF3268
+	.4byte	.LASF3268
 	.byte	0xc3
 	.byte	0x26
 	.uleb128 0x84
-	.4byte	.LASF3266
-	.4byte	.LASF3266
+	.4byte	.LASF3269
+	.4byte	.LASF3269
+	.byte	0x72
+	.byte	0x88
+	.uleb128 0x84
+	.4byte	.LASF3270
+	.4byte	.LASF3270
+	.byte	0x72
+	.byte	0x98
+	.uleb128 0x84
+	.4byte	.LASF3271
+	.4byte	.LASF3271
 	.byte	0xc4
 	.byte	0x66
 	.uleb128 0x84
-	.4byte	.LASF3267
-	.4byte	.LASF3267
+	.4byte	.LASF3272
+	.4byte	.LASF3272
 	.byte	0xc2
 	.byte	0x33
 	.uleb128 0x85
-	.4byte	.LASF3268
-	.4byte	.LASF3268
+	.4byte	.LASF3273
+	.4byte	.LASF3273
 	.byte	0xd
 	.2byte	0x1d6
 	.uleb128 0x87
@@ -44500,18 +44647,18 @@ __exitcall_ebc_exit:
 	.byte	0x78
 	.byte	0x2c
 	.uleb128 0x84
-	.4byte	.LASF3269
-	.4byte	.LASF3269
+	.4byte	.LASF3274
+	.4byte	.LASF3274
 	.byte	0x78
 	.byte	0x27
 	.uleb128 0x84
-	.4byte	.LASF3270
-	.4byte	.LASF3270
+	.4byte	.LASF3275
+	.4byte	.LASF3275
 	.byte	0x1e
 	.byte	0xb0
 	.uleb128 0x84
-	.4byte	.LASF3271
-	.4byte	.LASF3271
+	.4byte	.LASF3276
+	.4byte	.LASF3276
 	.byte	0x9c
 	.byte	0x71
 	.byte	0
@@ -46012,7 +46159,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x3a
 	.uleb128 0xb
 	.uleb128 0x3b
-	.uleb128 0xb
+	.uleb128 0x5
 	.uleb128 0x27
 	.uleb128 0x19
 	.uleb128 0x11
@@ -46028,25 +46175,35 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x75
-	.uleb128 0x5
-	.byte	0
+	.uleb128 0x2e
+	.byte	0x1
+	.uleb128 0x3f
+	.uleb128 0x19
 	.uleb128 0x3
 	.uleb128 0xe
 	.uleb128 0x3a
 	.uleb128 0xb
 	.uleb128 0x3b
 	.uleb128 0xb
-	.uleb128 0x49
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
+	.uleb128 0x1
 	.uleb128 0x13
-	.uleb128 0x2
-	.uleb128 0x17
 	.byte	0
 	.byte	0
 	.uleb128 0x76
-	.uleb128 0x34
+	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
-	.uleb128 0x8
+	.uleb128 0xe
 	.uleb128 0x3a
 	.uleb128 0xb
 	.uleb128 0x3b
@@ -46054,11 +46211,11 @@ __exitcall_ebc_exit:
 	.uleb128 0x49
 	.uleb128 0x13
 	.uleb128 0x2
-	.uleb128 0x17
+	.uleb128 0x18
 	.byte	0
 	.byte	0
 	.uleb128 0x77
-	.uleb128 0x34
+	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
 	.uleb128 0xe
@@ -46068,10 +46225,12 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.uleb128 0x49
 	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
 	.byte	0
 	.byte	0
 	.uleb128 0x78
-	.uleb128 0x5
+	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
 	.uleb128 0xe
@@ -46082,7 +46241,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x49
 	.uleb128 0x13
 	.uleb128 0x2
-	.uleb128 0x18
+	.uleb128 0x17
 	.byte	0
 	.byte	0
 	.uleb128 0x79
@@ -46096,8 +46255,6 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.uleb128 0x49
 	.uleb128 0x13
-	.uleb128 0x2
-	.uleb128 0x17
 	.byte	0
 	.byte	0
 	.uleb128 0x7a
@@ -46311,1560 +46468,1554 @@ __exitcall_ebc_exit:
 	.byte	0
 	.section	.debug_loc,"",@progbits
 .Ldebug_loc0:
-.LLST11:
-	.8byte	.LVL33
-	.8byte	.LVL34
+.LLST7:
+	.8byte	.LVL35
+	.8byte	.LVL36
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST146:
+.LLST141:
 	.8byte	.LVL627
 	.8byte	.LVL628
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST13:
-	.8byte	.LVL40
-	.8byte	.LVL41
+.LLST9:
+	.8byte	.LVL42
+	.8byte	.LVL43
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST122:
-	.8byte	.LVL441
-	.8byte	.LVL442
+.LLST118:
+	.8byte	.LVL443
+	.8byte	.LVL444
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST123:
-	.8byte	.LVL445
-	.8byte	.LVL446
+.LLST119:
+	.8byte	.LVL447
+	.8byte	.LVL448
 	.2byte	0x1
 	.byte	0x50
+	.8byte	.LVL489
 	.8byte	.LVL490
-	.8byte	.LVL491
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL587
 	.8byte	.LVL588
+	.8byte	.LVL589
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST124:
-	.8byte	.LVL448
-	.8byte	.LVL449
+.LLST120:
+	.8byte	.LVL450
+	.8byte	.LVL451
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL601
 	.8byte	.LVL602
+	.8byte	.LVL603
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST125:
-	.8byte	.LVL450
-	.8byte	.LVL492
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL495
-	.8byte	.LVL587
+.LLST121:
+	.8byte	.LVL452
+	.8byte	.LVL491
 	.2byte	0x1
 	.byte	0x65
+	.8byte	.LVL494
 	.8byte	.LVL588
-	.8byte	.LVL594
 	.2byte	0x1
 	.byte	0x65
+	.8byte	.LVL589
 	.8byte	.LVL595
+	.2byte	0x1
+	.byte	0x65
 	.8byte	.LVL596
+	.8byte	.LVL597
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL600
 	.8byte	.LVL601
+	.8byte	.LVL602
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL604
+	.8byte	.LVL605
 	.8byte	.LFE2840
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST126:
-	.8byte	.LVL471
-	.8byte	.LVL483
+.LLST122:
+	.8byte	.LVL473
+	.8byte	.LVL484
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL490
-	.8byte	.LVL493
+	.8byte	.LVL489
+	.8byte	.LVL492
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL495
-	.8byte	.LVL498
+	.8byte	.LVL494
+	.8byte	.LVL497
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL569
-	.8byte	.LVL570
+	.8byte	.LVL578
+	.8byte	.LVL579
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL595
 	.8byte	.LVL596
+	.8byte	.LVL597
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL606
 	.8byte	.LVL607
+	.8byte	.LVL608
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST127:
-	.8byte	.LVL483
-	.8byte	.LVL489
+.LLST123:
+	.8byte	.LVL484
+	.8byte	.LVL488
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL490
-	.8byte	.LVL493
+	.8byte	.LVL489
+	.8byte	.LVL492
 	.2byte	0x1
 	.byte	0x6a
+	.8byte	.LVL502
 	.8byte	.LVL503
-	.8byte	.LVL504
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL600
 	.8byte	.LVL601
+	.8byte	.LVL602
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL606
 	.8byte	.LVL607
+	.8byte	.LVL608
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST128:
-	.8byte	.LVL484
-	.8byte	.LVL485-1
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL486
-	.8byte	.LVL487
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL600
-	.8byte	.LVL601
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST129:
-	.8byte	.LVL504
-	.8byte	.LVL505-1
+.LLST124:
+	.8byte	.LVL503
+	.8byte	.LVL504-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST130:
-	.8byte	.LVL509
-	.8byte	.LVL512
+.LLST125:
+	.8byte	.LVL508
+	.8byte	.LVL511
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST131:
+.LLST126:
+	.8byte	.LVL509
 	.8byte	.LVL510
-	.8byte	.LVL511
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST132:
-	.8byte	.LVL490
-	.8byte	.LVL493
+.LLST127:
+	.8byte	.LVL489
+	.8byte	.LVL492
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL514
-	.8byte	.LVL522
+	.8byte	.LVL513
+	.8byte	.LVL521
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL589
-	.8byte	.LVL591
+	.8byte	.LVL590
+	.8byte	.LVL592
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL591
 	.8byte	.LVL592
+	.8byte	.LVL593
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL592
-	.8byte	.LVL594
+	.8byte	.LVL593
+	.8byte	.LVL595
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL606
 	.8byte	.LVL607
+	.8byte	.LVL608
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST133:
-	.8byte	.LVL517
-	.8byte	.LVL520
+.LLST128:
+	.8byte	.LVL516
+	.8byte	.LVL519
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST134:
+.LLST129:
+	.8byte	.LVL517
 	.8byte	.LVL518
-	.8byte	.LVL519
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST135:
-	.8byte	.LVL521
-	.8byte	.LVL523-1
+.LLST130:
+	.8byte	.LVL520
+	.8byte	.LVL522-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST136:
-	.8byte	.LVL490
-	.8byte	.LVL495
+.LLST131:
+	.8byte	.LVL489
+	.8byte	.LVL494
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL528
-	.8byte	.LVL569
+	.8byte	.LVL527
+	.8byte	.LVL561
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL570
-	.8byte	.LVL579
+	.8byte	.LVL561
+	.8byte	.LVL562
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL565
+	.8byte	.LVL578
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
 	.8byte	.LVL579
-	.8byte	.LVL580
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL606
-	.8byte	.LVL613
+	.8byte	.LVL584
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	.LVL607
+	.8byte	.LVL614
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
 	.8byte	0
 	.8byte	0
-.LLST137:
-	.8byte	.LVL490
-	.8byte	.LVL495
+.LLST132:
+	.8byte	.LVL489
+	.8byte	.LVL494
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL528
-	.8byte	.LVL566
+	.8byte	.LVL527
+	.8byte	.LVL575
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL566
-	.8byte	.LVL567
+	.8byte	.LVL575
+	.8byte	.LVL576
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL570
-	.8byte	.LVL583
+	.8byte	.LVL579
+	.8byte	.LVL584
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL606
+	.8byte	.LVL607
 	.8byte	.LFE2840
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
 	.8byte	0
 	.8byte	0
-.LLST138:
-	.8byte	.LVL490
-	.8byte	.LVL493
+.LLST133:
+	.8byte	.LVL489
+	.8byte	.LVL492
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL534
-	.8byte	.LVL542
+	.8byte	.LVL533
+	.8byte	.LVL544
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL546
-	.8byte	.LVL559
+	.8byte	.LVL548
+	.8byte	.LVL557
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL563
-	.8byte	.LVL569
+	.8byte	.LVL565
+	.8byte	.LVL567
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL582
-	.8byte	.LVL583
+	.8byte	.LVL572
+	.8byte	.LVL578
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL606
-	.8byte	.LVL610
+	.8byte	.LVL607
+	.8byte	.LVL611
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL615
+	.8byte	.LFE2840
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST139:
-	.8byte	.LVL490
-	.8byte	.LVL494
+.LLST134:
+	.8byte	.LVL489
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL539
-	.8byte	.LVL569
+	.8byte	.LVL538
+	.8byte	.LVL557
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL570
-	.8byte	.LVL575
+	.8byte	.LVL564
+	.8byte	.LVL578
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL606
-	.8byte	.LVL610
+	.8byte	.LVL579
+	.8byte	.LVL584
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL614
-	.8byte	.LFE2840
+	.8byte	.LVL607
+	.8byte	.LVL611
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST140:
-	.8byte	.LVL490
-	.8byte	.LVL493
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL530
-	.8byte	.LVL536
+.LLST135:
+	.8byte	.LVL489
+	.8byte	.LVL492
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL537
-	.8byte	.LVL540
+	.8byte	.LVL529
+	.8byte	.LVL535
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL546
-	.8byte	.LVL555
+	.8byte	.LVL536
+	.8byte	.LVL539
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL575
-	.8byte	.LVL583
+	.8byte	.LVL548
+	.8byte	.LVL565
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL606
 	.8byte	.LVL607
+	.8byte	.LVL608
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL610
-	.8byte	.LVL615
+	.8byte	.LVL611
+	.8byte	.LFE2840
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST141:
-	.8byte	.LVL490
-	.8byte	.LVL494
+.LLST136:
+	.8byte	.LVL489
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL532
-	.8byte	.LVL539
+	.8byte	.LVL531
+	.8byte	.LVL538
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL544
-	.8byte	.LVL563
+	.8byte	.LVL540
+	.8byte	.LVL564
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	.LVL570
-	.8byte	.LVL583
+	.8byte	.LVL572
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL579
+	.8byte	.LVL584
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL606
 	.8byte	.LVL607
+	.8byte	.LVL608
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL610
-	.8byte	.LVL614
+	.8byte	.LVL611
+	.8byte	.LFE2840
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST142:
-	.8byte	.LVL490
-	.8byte	.LVL494
+.LLST137:
+	.8byte	.LVL489
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL535
-	.8byte	.LVL569
+	.8byte	.LVL534
+	.8byte	.LVL557
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL570
-	.8byte	.LVL575
+	.8byte	.LVL560
+	.8byte	.LVL578
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL578
-	.8byte	.LVL583
+	.8byte	.LVL579
+	.8byte	.LVL584
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL606
-	.8byte	.LVL610
+	.8byte	.LVL607
+	.8byte	.LVL611
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL610
 	.8byte	.LVL611
+	.8byte	.LVL612
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL611
+	.8byte	.LVL612
 	.8byte	.LFE2840
 	.2byte	0x1
 	.byte	0x6b
 	.8byte	0
 	.8byte	0
-.LLST143:
-	.8byte	.LVL490
-	.8byte	.LVL493
+.LLST138:
+	.8byte	.LVL489
+	.8byte	.LVL492
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL536
-	.8byte	.LVL569
+	.8byte	.LVL535
+	.8byte	.LVL557
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL570
-	.8byte	.LVL575
+	.8byte	.LVL565
+	.8byte	.LVL578
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL606
-	.8byte	.LVL607
+	.8byte	.LVL579
+	.8byte	.LVL584
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	.LVL607
 	.8byte	.LVL608
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x6a
 	.8byte	.LVL608
-	.8byte	.LVL610
+	.8byte	.LVL609
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL615
-	.8byte	.LFE2840
+	.byte	0x50
+	.8byte	.LVL609
+	.8byte	.LVL611
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST144:
-	.8byte	.LVL490
-	.8byte	.LVL493
+.LLST139:
+	.8byte	.LVL489
+	.8byte	.LVL492
 	.2byte	0x1
 	.byte	0x69
 	.8byte	.LVL544
-	.8byte	.LVL555
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL559
-	.8byte	.LVL563
+	.8byte	.LVL557
 	.2byte	0x1
 	.byte	0x69
 	.8byte	.LVL570
 	.8byte	.LVL572
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL606
+	.8byte	.LVL579
+	.8byte	.LVL581
+	.2byte	0x1
+	.byte	0x69
 	.8byte	.LVL607
+	.8byte	.LVL608
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST75:
-	.8byte	.LVL265
-	.8byte	.LVL266
+.LLST71:
+	.8byte	.LVL267
+	.8byte	.LVL268
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST76:
-	.8byte	.LVL265
+.LLST72:
 	.8byte	.LVL267
+	.8byte	.LVL269
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST77:
-	.8byte	.LVL265
-	.8byte	.LVL268
+.LLST73:
+	.8byte	.LVL267
+	.8byte	.LVL270
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL268
-	.8byte	.LVL269-1
+	.8byte	.LVL270
+	.8byte	.LVL271-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST78:
-	.8byte	.LVL270
-	.8byte	.LVL271
+.LLST74:
+	.8byte	.LVL272
+	.8byte	.LVL273
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST79:
-	.8byte	.LVL270
+.LLST75:
 	.8byte	.LVL272
+	.8byte	.LVL274
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST80:
-	.8byte	.LVL270
-	.8byte	.LVL273
+.LLST76:
+	.8byte	.LVL272
+	.8byte	.LVL275
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL273
-	.8byte	.LVL274-1
+	.8byte	.LVL275
+	.8byte	.LVL276-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST90:
-	.8byte	.LVL295
-	.8byte	.LVL296
+.LLST86:
+	.8byte	.LVL297
+	.8byte	.LVL298
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST91:
-	.8byte	.LVL295
+.LLST87:
 	.8byte	.LVL297
+	.8byte	.LVL299
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST92:
-	.8byte	.LVL295
-	.8byte	.LVL299
+.LLST88:
+	.8byte	.LVL297
+	.8byte	.LVL301
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL299
-	.8byte	.LVL304
+	.8byte	.LVL301
+	.8byte	.LVL306
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL305
+	.8byte	.LVL307
 	.8byte	.LFE2831
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST93:
-	.8byte	.LVL295
-	.8byte	.LVL300-1
+.LLST89:
+	.8byte	.LVL297
+	.8byte	.LVL302-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL300-1
-	.8byte	.LVL303
-	.2byte	0x1
-	.byte	0x64
+	.8byte	.LVL302-1
 	.8byte	.LVL305
-	.8byte	.LVL306
 	.2byte	0x1
 	.byte	0x64
+	.8byte	.LVL307
 	.8byte	.LVL308
-	.8byte	.LVL309
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL310
+	.8byte	.LVL311
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST94:
-	.8byte	.LVL298
-	.8byte	.LVL304
+.LLST90:
+	.8byte	.LVL300
+	.8byte	.LVL306
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL305
+	.8byte	.LVL307
 	.8byte	.LFE2831
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST95:
-	.8byte	.LVL301
-	.8byte	.LVL305
+.LLST91:
+	.8byte	.LVL303
+	.8byte	.LVL307
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
-	.8byte	.LVL308
+	.8byte	.LVL310
 	.8byte	.LFE2831
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
 	.8byte	0
 	.8byte	0
-.LLST81:
-	.8byte	.LVL275
-	.8byte	.LVL276
+.LLST77:
+	.8byte	.LVL277
+	.8byte	.LVL278
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST82:
-	.8byte	.LVL275
+.LLST78:
 	.8byte	.LVL277
+	.8byte	.LVL279
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST83:
-	.8byte	.LVL275
-	.8byte	.LVL278-1
+.LLST79:
+	.8byte	.LVL277
+	.8byte	.LVL280-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL278-1
-	.8byte	.LVL280
+	.8byte	.LVL280-1
+	.8byte	.LVL282
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST84:
-	.8byte	.LVL281
-	.8byte	.LVL282
+.LLST80:
+	.8byte	.LVL283
+	.8byte	.LVL284
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST85:
-	.8byte	.LVL281
+.LLST81:
 	.8byte	.LVL283
+	.8byte	.LVL285
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST86:
-	.8byte	.LVL281
-	.8byte	.LVL284
+.LLST82:
+	.8byte	.LVL283
+	.8byte	.LVL286
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL284
-	.8byte	.LVL287
+	.8byte	.LVL286
+	.8byte	.LVL289
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL288
+	.8byte	.LVL290
 	.8byte	.LFE2829
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST87:
-	.8byte	.LVL290
-	.8byte	.LVL291
+.LLST83:
+	.8byte	.LVL292
+	.8byte	.LVL293
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST88:
-	.8byte	.LVL290
+.LLST84:
 	.8byte	.LVL292
+	.8byte	.LVL294
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST89:
-	.8byte	.LVL290
-	.8byte	.LVL293
+.LLST85:
+	.8byte	.LVL292
+	.8byte	.LVL295
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL293
-	.8byte	.LVL294-1
+	.8byte	.LVL295
+	.8byte	.LVL296-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST96:
-	.8byte	.LVL312
-	.8byte	.LVL313-1
+.LLST92:
+	.8byte	.LVL314
+	.8byte	.LVL315-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST97:
-	.8byte	.LVL312
-	.8byte	.LVL313-1
+.LLST93:
+	.8byte	.LVL314
+	.8byte	.LVL315-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST98:
-	.8byte	.LVL312
-	.8byte	.LVL313-1
+.LLST94:
+	.8byte	.LVL314
+	.8byte	.LVL315-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL313-1
-	.8byte	.LVL315
+	.8byte	.LVL315-1
+	.8byte	.LVL317
 	.2byte	0x1
 	.byte	0x63
-	.8byte	0
-	.8byte	0
-.LLST10:
-	.8byte	.LVL30
-	.8byte	.LVL31
+	.8byte	0
+	.8byte	0
+.LLST6:
+	.8byte	.LVL32
+	.8byte	.LVL33
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST14:
-	.8byte	.LVL43
-	.8byte	.LVL44-1
+.LLST10:
+	.8byte	.LVL45
+	.8byte	.LVL46-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST15:
-	.8byte	.LVL43
-	.8byte	.LVL44-1
+.LLST11:
+	.8byte	.LVL45
+	.8byte	.LVL46-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL44-1
-	.8byte	.LVL46
+	.8byte	.LVL46-1
+	.8byte	.LVL48
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST16:
-	.8byte	.LVL47
-	.8byte	.LVL48
+.LLST12:
+	.8byte	.LVL49
+	.8byte	.LVL50
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST17:
-	.8byte	.LVL47
-	.8byte	.LVL49-1
+.LLST13:
+	.8byte	.LVL49
+	.8byte	.LVL51-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL63
-	.8byte	.LVL64
+	.8byte	.LVL65
+	.8byte	.LVL66
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL66
-	.8byte	.LVL67
+	.8byte	.LVL68
+	.8byte	.LVL69
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL72
 	.8byte	.LVL74
+	.8byte	.LVL76
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL94
-	.8byte	.LVL95-1
+	.8byte	.LVL96
+	.8byte	.LVL97-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL96
 	.8byte	.LVL98
+	.8byte	.LVL100
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL120
-	.8byte	.LVL121-1
+	.8byte	.LVL122
+	.8byte	.LVL123-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL136
 	.8byte	.LVL138
+	.8byte	.LVL140
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL150
-	.8byte	.LVL151
-	.2byte	0x1
-	.byte	0x51
+	.8byte	.LVL152
 	.8byte	.LVL153
-	.8byte	.LVL154-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	.LVL155
 	.8byte	.LVL156-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL161
-	.8byte	.LVL163
+	.8byte	.LVL157
+	.8byte	.LVL158-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL172
-	.8byte	.LVL173
+	.8byte	.LVL163
+	.8byte	.LVL165
 	.2byte	0x1
 	.byte	0x51
+	.8byte	.LVL174
 	.8byte	.LVL175
-	.8byte	.LVL176-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL177
+	.8byte	.LVL178-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST18:
-	.8byte	.LVL47
-	.8byte	.LVL63
+.LLST14:
+	.8byte	.LVL49
+	.8byte	.LVL65
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL63
-	.8byte	.LVL71
+	.8byte	.LVL65
+	.8byte	.LVL73
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL72
-	.8byte	.LVL87
+	.8byte	.LVL74
+	.8byte	.LVL89
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL93
-	.8byte	.LVL218
+	.8byte	.LVL95
+	.8byte	.LVL220
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL220
+	.8byte	.LVL222
 	.8byte	.LFE2824
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST33:
-	.8byte	.LVL68
-	.8byte	.LVL69
+.LLST29:
+	.8byte	.LVL70
+	.8byte	.LVL71
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL90
-	.8byte	.LVL91-1
+	.8byte	.LVL92
+	.8byte	.LVL93-1
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL93
-	.8byte	.LVL94
+	.8byte	.LVL95
+	.8byte	.LVL96
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST19:
-	.8byte	.LVL56
+.LLST15:
 	.8byte	.LVL58
+	.8byte	.LVL60
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL59
-	.8byte	.LVL60
+	.8byte	.LVL61
+	.8byte	.LVL62
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST20:
-	.8byte	.LVL59
+.LLST16:
 	.8byte	.LVL61
+	.8byte	.LVL63
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL112
 	.8byte	.LVL114
+	.8byte	.LVL116
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST21:
-	.8byte	.LVL53
-	.8byte	.LVL62-1
+.LLST17:
+	.8byte	.LVL55
+	.8byte	.LVL64-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL112
-	.8byte	.LVL113
+	.8byte	.LVL114
+	.8byte	.LVL115
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST22:
-	.8byte	.LVL52
-	.8byte	.LVL55
+.LLST18:
+	.8byte	.LVL54
+	.8byte	.LVL57
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL57
-	.8byte	.LVL62-1
+	.8byte	.LVL59
+	.8byte	.LVL64-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL112
-	.8byte	.LVL116
+	.8byte	.LVL114
+	.8byte	.LVL118
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST23:
-	.8byte	.LVL117
-	.8byte	.LVL119-1
+.LLST19:
+	.8byte	.LVL119
+	.8byte	.LVL121-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST24:
-	.8byte	.LVL115
-	.8byte	.LVL118
+.LLST20:
+	.8byte	.LVL117
+	.8byte	.LVL120
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST25:
-	.8byte	.LVL114
-	.8byte	.LVL117
+.LLST21:
+	.8byte	.LVL116
+	.8byte	.LVL119
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST26:
-	.8byte	.LVL75
-	.8byte	.LVL76
-	.2byte	0x1
-	.byte	0x50
+.LLST22:
 	.8byte	.LVL77
 	.8byte	.LVL78
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL189
-	.8byte	.LVL190
+	.8byte	.LVL79
+	.8byte	.LVL80
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL191
+	.8byte	.LVL192
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST27:
-	.8byte	.LVL68
-	.8byte	.LVL69
+.LLST23:
+	.8byte	.LVL70
+	.8byte	.LVL71
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL77
 	.8byte	.LVL79
+	.8byte	.LVL81
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL217
-	.8byte	.LVL218
+	.8byte	.LVL219
+	.8byte	.LVL220
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST28:
-	.8byte	.LVL68
+.LLST24:
 	.8byte	.LVL70
+	.8byte	.LVL72
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL74
-	.8byte	.LVL80
+	.8byte	.LVL76
+	.8byte	.LVL82
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL188
 	.8byte	.LVL190
+	.8byte	.LVL192
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL217
-	.8byte	.LVL218
+	.8byte	.LVL219
+	.8byte	.LVL220
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST29:
-	.8byte	.LVL73
-	.8byte	.LVL76
+.LLST25:
+	.8byte	.LVL75
+	.8byte	.LVL78
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL188
-	.8byte	.LVL189
+	.8byte	.LVL190
+	.8byte	.LVL191
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST30:
-	.8byte	.LVL82
-	.8byte	.LVL84-1
+.LLST26:
+	.8byte	.LVL84
+	.8byte	.LVL86-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST31:
-	.8byte	.LVL81
+.LLST27:
 	.8byte	.LVL83
+	.8byte	.LVL85
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST32:
-	.8byte	.LVL80
+.LLST28:
 	.8byte	.LVL82
+	.8byte	.LVL84
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST34:
-	.8byte	.LVL99
-	.8byte	.LVL100
-	.2byte	0x1
-	.byte	0x50
+.LLST30:
 	.8byte	.LVL101
 	.8byte	.LVL102
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL187
-	.8byte	.LVL188
+	.8byte	.LVL103
+	.8byte	.LVL104
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL189
+	.8byte	.LVL190
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST35:
-	.8byte	.LVL68
-	.8byte	.LVL69
+.LLST31:
+	.8byte	.LVL70
+	.8byte	.LVL71
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL101
 	.8byte	.LVL103
+	.8byte	.LVL105
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL217
-	.8byte	.LVL218
+	.8byte	.LVL219
+	.8byte	.LVL220
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST36:
-	.8byte	.LVL68
+.LLST32:
 	.8byte	.LVL70
+	.8byte	.LVL72
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL98
-	.8byte	.LVL104
+	.8byte	.LVL100
+	.8byte	.LVL106
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL186
 	.8byte	.LVL188
+	.8byte	.LVL190
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL217
-	.8byte	.LVL218
+	.8byte	.LVL219
+	.8byte	.LVL220
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST37:
-	.8byte	.LVL97
-	.8byte	.LVL100
+.LLST33:
+	.8byte	.LVL99
+	.8byte	.LVL102
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL186
-	.8byte	.LVL187
+	.8byte	.LVL188
+	.8byte	.LVL189
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST38:
-	.8byte	.LVL106
-	.8byte	.LVL108-1
+.LLST34:
+	.8byte	.LVL108
+	.8byte	.LVL110-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST39:
-	.8byte	.LVL105
+.LLST35:
 	.8byte	.LVL107
+	.8byte	.LVL109
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST40:
-	.8byte	.LVL104
+.LLST36:
 	.8byte	.LVL106
+	.8byte	.LVL108
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST41:
-	.8byte	.LVL125
-	.8byte	.LVL126
-	.2byte	0x1
-	.byte	0x50
+.LLST37:
 	.8byte	.LVL127
 	.8byte	.LVL128
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL200
-	.8byte	.LVL201
+	.8byte	.LVL129
+	.8byte	.LVL130
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL202
+	.8byte	.LVL203
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST42:
-	.8byte	.LVL68
-	.8byte	.LVL69
+.LLST38:
+	.8byte	.LVL70
+	.8byte	.LVL71
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL127
-	.8byte	.LVL130
+	.8byte	.LVL129
+	.8byte	.LVL132
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST43:
-	.8byte	.LVL68
+.LLST39:
 	.8byte	.LVL70
+	.8byte	.LVL72
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL124
-	.8byte	.LVL129
+	.8byte	.LVL126
+	.8byte	.LVL131
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL198
-	.8byte	.LVL201
+	.8byte	.LVL200
+	.8byte	.LVL203
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST44:
-	.8byte	.LVL68
+.LLST40:
 	.8byte	.LVL70
+	.8byte	.LVL72
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL123
-	.8byte	.LVL132
+	.8byte	.LVL125
+	.8byte	.LVL134
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL198
-	.8byte	.LVL199
+	.8byte	.LVL200
+	.8byte	.LVL201
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST45:
-	.8byte	.LVL133
-	.8byte	.LVL135-1
+.LLST41:
+	.8byte	.LVL135
+	.8byte	.LVL137-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST46:
-	.8byte	.LVL131
-	.8byte	.LVL134
+.LLST42:
+	.8byte	.LVL133
+	.8byte	.LVL136
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST47:
-	.8byte	.LVL130
-	.8byte	.LVL133
+.LLST43:
+	.8byte	.LVL132
+	.8byte	.LVL135
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST48:
-	.8byte	.LVL147
-	.8byte	.LVL148
+.LLST44:
+	.8byte	.LVL149
+	.8byte	.LVL150
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL222
 	.8byte	.LVL224
+	.8byte	.LVL226
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL227
+	.8byte	.LVL229
 	.8byte	.LFE2824
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST49:
-	.8byte	.LVL139
-	.8byte	.LVL140
-	.2byte	0x1
-	.byte	0x50
+.LLST45:
 	.8byte	.LVL141
 	.8byte	.LVL142
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL194
-	.8byte	.LVL195
+	.8byte	.LVL143
+	.8byte	.LVL144
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL196
+	.8byte	.LVL197
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST50:
-	.8byte	.LVL141
-	.8byte	.LVL147-1
+.LLST46:
+	.8byte	.LVL143
+	.8byte	.LVL149-1
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL221
-	.8byte	.LVL222
+	.8byte	.LVL223
+	.8byte	.LVL224
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL222
-	.8byte	.LVL225-1
+	.8byte	.LVL224
+	.8byte	.LVL227-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL228
+	.8byte	.LVL230
 	.8byte	.LFE2824
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST51:
-	.8byte	.LVL138
-	.8byte	.LVL143
+.LLST47:
+	.8byte	.LVL140
+	.8byte	.LVL145
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL193
 	.8byte	.LVL195
+	.8byte	.LVL197
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL221
 	.8byte	.LVL223
+	.8byte	.LVL225
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST52:
-	.8byte	.LVL137
-	.8byte	.LVL140
+.LLST48:
+	.8byte	.LVL139
+	.8byte	.LVL142
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL193
-	.8byte	.LVL194
+	.8byte	.LVL195
+	.8byte	.LVL196
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST53:
-	.8byte	.LVL145
-	.8byte	.LVL147-1
+.LLST49:
+	.8byte	.LVL147
+	.8byte	.LVL149-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST54:
-	.8byte	.LVL144
+.LLST50:
 	.8byte	.LVL146
+	.8byte	.LVL148
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST55:
-	.8byte	.LVL143
+.LLST51:
 	.8byte	.LVL145
+	.8byte	.LVL147
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST56:
-	.8byte	.LVL54
-	.8byte	.LVL60
+.LLST52:
+	.8byte	.LVL56
+	.8byte	.LVL62
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL160
-	.8byte	.LVL161
+	.8byte	.LVL162
+	.8byte	.LVL163
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST57:
-	.8byte	.LVL54
-	.8byte	.LVL55
+.LLST53:
+	.8byte	.LVL56
+	.8byte	.LVL57
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL57
-	.8byte	.LVL62-1
+	.8byte	.LVL59
+	.8byte	.LVL64-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL112
-	.8byte	.LVL116
+	.8byte	.LVL114
+	.8byte	.LVL118
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL159
 	.8byte	.LVL161
+	.8byte	.LVL163
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST58:
-	.8byte	.LVL165
-	.8byte	.LVL166
-	.2byte	0x1
-	.byte	0x50
+.LLST54:
 	.8byte	.LVL167
 	.8byte	.LVL168
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL192
-	.8byte	.LVL193
+	.8byte	.LVL169
+	.8byte	.LVL170
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL194
+	.8byte	.LVL195
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST59:
-	.8byte	.LVL167
+.LLST55:
 	.8byte	.LVL169
+	.8byte	.LVL171
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL201
 	.8byte	.LVL203
+	.8byte	.LVL205
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST60:
-	.8byte	.LVL164
-	.8byte	.LVL170
+.LLST56:
+	.8byte	.LVL166
+	.8byte	.LVL172
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL190
-	.8byte	.LVL193
+	.8byte	.LVL192
+	.8byte	.LVL195
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL201
-	.8byte	.LVL202
+	.8byte	.LVL203
+	.8byte	.LVL204
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST61:
-	.8byte	.LVL162
-	.8byte	.LVL171-1
+.LLST57:
+	.8byte	.LVL164
+	.8byte	.LVL173-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL190
-	.8byte	.LVL191
+	.8byte	.LVL192
+	.8byte	.LVL193
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL201
-	.8byte	.LVL205
+	.8byte	.LVL203
+	.8byte	.LVL207
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST62:
-	.8byte	.LVL206
-	.8byte	.LVL208-1
+.LLST58:
+	.8byte	.LVL208
+	.8byte	.LVL210-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST63:
-	.8byte	.LVL204
-	.8byte	.LVL207
+.LLST59:
+	.8byte	.LVL206
+	.8byte	.LVL209
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST64:
-	.8byte	.LVL203
-	.8byte	.LVL206
+.LLST60:
+	.8byte	.LVL205
+	.8byte	.LVL208
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST65:
-	.8byte	.LVL180
-	.8byte	.LVL181
-	.2byte	0x1
-	.byte	0x50
+.LLST61:
 	.8byte	.LVL182
 	.8byte	.LVL183
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL197
-	.8byte	.LVL198
+	.8byte	.LVL184
+	.8byte	.LVL185
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL199
+	.8byte	.LVL200
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST66:
-	.8byte	.LVL182
+.LLST62:
 	.8byte	.LVL184
+	.8byte	.LVL186
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL209
 	.8byte	.LVL211
+	.8byte	.LVL213
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST67:
-	.8byte	.LVL179
-	.8byte	.LVL185-1
+.LLST63:
+	.8byte	.LVL181
+	.8byte	.LVL187-1
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL195
-	.8byte	.LVL198
+	.byte	0x51
+	.8byte	.LVL197
+	.8byte	.LVL200
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL209
-	.8byte	.LVL210
+	.8byte	.LVL211
+	.8byte	.LVL212
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST68:
-	.8byte	.LVL178
-	.8byte	.LVL185-1
+.LLST64:
+	.8byte	.LVL180
+	.8byte	.LVL187-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL195
-	.8byte	.LVL196
+	.8byte	.LVL197
+	.8byte	.LVL198
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL209
-	.8byte	.LVL213
+	.8byte	.LVL211
+	.8byte	.LVL215
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST69:
-	.8byte	.LVL214
-	.8byte	.LVL216-1
+.LLST65:
+	.8byte	.LVL216
+	.8byte	.LVL218-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST70:
-	.8byte	.LVL212
-	.8byte	.LVL215
+.LLST66:
+	.8byte	.LVL214
+	.8byte	.LVL217
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST71:
-	.8byte	.LVL211
-	.8byte	.LVL214
+.LLST67:
+	.8byte	.LVL213
+	.8byte	.LVL216
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST72:
-	.8byte	.LVL239
-	.8byte	.LVL240-1
+.LLST68:
+	.8byte	.LVL241
+	.8byte	.LVL242-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST12:
-	.8byte	.LVL37
-	.8byte	.LVL38
+.LLST8:
+	.8byte	.LVL39
+	.8byte	.LVL40
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST154:
-	.8byte	.LVL650
-	.8byte	.LVL651
+.LLST150:
+	.8byte	.LVL657
+	.8byte	.LVL658
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST155:
-	.8byte	.LVL652
+.LLST151:
 	.8byte	.LVL659
+	.8byte	.LVL666
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL663
+	.8byte	.LVL670
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST156:
-	.8byte	.LVL654
-	.8byte	.LVL662
+.LLST152:
+	.8byte	.LVL661
+	.8byte	.LVL668
 	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL663
-	.8byte	.LVL664
+	.byte	0x67
+	.8byte	.LVL670
+	.8byte	.LVL671
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL664
-	.8byte	.LVL674
+	.8byte	.LVL671
+	.8byte	.LVL681
 	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL674
-	.8byte	.LVL675
+	.byte	0x67
+	.8byte	.LVL681
+	.8byte	.LVL682
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL675
 	.8byte	.LVL682
+	.8byte	.LVL691
 	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL682
-	.8byte	.LVL683
+	.byte	0x67
+	.8byte	.LVL691
+	.8byte	.LVL692
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL683
-	.8byte	.LVL709
+	.8byte	.LVL692
+	.8byte	.LVL708
 	.2byte	0x1
-	.byte	0x6b
+	.byte	0x67
+	.8byte	.LVL708
 	.8byte	.LVL709
-	.8byte	.LVL710
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL710
-	.8byte	.LVL757
+	.8byte	.LVL709
+	.8byte	.LVL768
 	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL757
-	.8byte	.LVL758
+	.byte	0x67
+	.8byte	.LVL768
+	.8byte	.LVL769
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL758
+	.8byte	.LVL769
 	.8byte	.LFE2819
 	.2byte	0x1
-	.byte	0x6b
+	.byte	0x67
 	.8byte	0
 	.8byte	0
-.LLST157:
-	.8byte	.LVL654
+.LLST153:
 	.8byte	.LVL660
+	.8byte	.LVL667
 	.2byte	0x1
-	.byte	0x66
-	.8byte	.LVL663
+	.byte	0x65
+	.8byte	.LVL670
 	.8byte	.LFE2819
 	.2byte	0x1
-	.byte	0x66
+	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST158:
-	.8byte	.LVL653
-	.8byte	.LVL661
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL663
-	.8byte	.LFE2819
+.LLST154:
+	.8byte	.LVL698
+	.8byte	.LVL699
 	.2byte	0x1
-	.byte	0x6a
+	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST159:
-	.8byte	.LVL654
+.LLST155:
 	.8byte	.LVL661
+	.8byte	.LVL669
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL663
+	.byte	0x6a
+	.8byte	.LVL670
 	.8byte	.LVL735
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL739
+	.byte	0x6a
+	.8byte	.LVL750
 	.8byte	.LVL763
 	.2byte	0x1
-	.byte	0x69
+	.byte	0x6a
 	.8byte	.LVL765
-	.8byte	.LVL774
+	.8byte	.LVL782
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL780
+	.byte	0x6a
+	.8byte	.LVL788
+	.8byte	.LVL793
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL795
 	.8byte	.LFE2819
 	.2byte	0x1
-	.byte	0x69
+	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST174:
-	.8byte	.LVL747
-	.8byte	.LVL748
+.LLST170:
+	.8byte	.LVL754
+	.8byte	.LVL755
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL776
-	.8byte	.LVL777-1
+	.8byte	.LVL784
+	.8byte	.LVL785-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST162:
-	.8byte	.LVL725
-	.8byte	.LVL726
+.LLST158:
+	.8byte	.LVL727
+	.8byte	.LVL728
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL752
-	.8byte	.LVL753-1
+	.8byte	.LVL758
+	.8byte	.LVL759-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST161:
-	.8byte	.LVL665
-	.8byte	.LVL666
+.LLST157:
+	.8byte	.LVL672
+	.8byte	.LVL673
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL712
@@ -47873,937 +48024,868 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST160:
-	.8byte	.LVL654
-	.8byte	.LVL655
+.LLST156:
+	.8byte	.LVL661
+	.8byte	.LVL662
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL667
-	.8byte	.LVL668
+	.8byte	.LVL674
+	.8byte	.LVL675
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL670
-	.8byte	.LVL671-1
+	.8byte	.LVL677
+	.8byte	.LVL678-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST163:
-	.8byte	.LVL693
-	.8byte	.LVL694-1
+.LLST159:
+	.8byte	.LVL702
+	.8byte	.LVL703-1
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x61
+	.8byte	.LVL718
+	.8byte	.LVL719-1
+	.2byte	0x1
+	.byte	0x61
+	.8byte	.LVL731
+	.8byte	.LVL750
+	.2byte	0x1
+	.byte	0x61
+	.8byte	.LVL763
+	.8byte	.LVL764-1
+	.2byte	0x1
+	.byte	0x61
+	.8byte	.LVL769
+	.8byte	.LVL770-1
+	.2byte	0x1
+	.byte	0x61
+	.8byte	.LVL793
+	.8byte	.LVL794-1
+	.2byte	0x1
+	.byte	0x61
+	.8byte	0
+	.8byte	0
+.LLST160:
+	.8byte	.LVL740
+	.8byte	.LVL741
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST161:
 	.8byte	.LVL702
-	.8byte	.LVL704-1
+	.8byte	.LVL703-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL730
-	.8byte	.LVL737
+	.8byte	.LVL718
+	.8byte	.LVL719-1
 	.2byte	0x1
 	.byte	0x55
+	.8byte	.LVL736
 	.8byte	.LVL739
+	.2byte	0x1
+	.byte	0x55
 	.8byte	.LVL740
+	.8byte	.LVL747
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL758
-	.8byte	.LVL760-1
+	.8byte	.LVL763
+	.8byte	.LVL764-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL780
-	.8byte	.LVL782-1
+	.8byte	.LVL769
+	.8byte	.LVL770-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL786
-	.8byte	.LVL787-1
+	.8byte	.LVL793
+	.8byte	.LVL794-1
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST164:
-	.8byte	.LVL654
-	.8byte	.LVL661
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL663
-	.8byte	.LVL689
+.LLST162:
+	.8byte	.LVL702
+	.8byte	.LVL703-1
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL693
-	.8byte	.LVL719
+	.byte	0x57
+	.8byte	.LVL718
+	.8byte	.LVL719-1
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL728
-	.8byte	.LVL740
+	.byte	0x57
+	.8byte	.LVL736
+	.8byte	.LVL737
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL744
+	.byte	0x57
+	.8byte	.LVL738
 	.8byte	.LVL750
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL757
-	.8byte	.LVL774
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL780
-	.8byte	.LFE2819
+	.byte	0x57
+	.8byte	.LVL763
+	.8byte	.LVL764-1
 	.2byte	0x1
-	.byte	0x69
-	.8byte	0
-	.8byte	0
-.LLST165:
-	.8byte	.LVL736
-	.8byte	.LVL738
+	.byte	0x57
+	.8byte	.LVL769
+	.8byte	.LVL770-1
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL763
-	.8byte	.LVL764
+	.byte	0x57
+	.8byte	.LVL793
+	.8byte	.LVL794-1
 	.2byte	0x1
-	.byte	0x52
+	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST166:
-	.8byte	.LVL693
-	.8byte	.LVL694-1
-	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL702
-	.8byte	.LVL704-1
-	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL734
-	.8byte	.LVL740
-	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL758
-	.8byte	.LVL760-1
-	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL763
-	.8byte	.LVL765
+.LLST163:
+	.8byte	.LVL739
+	.8byte	.LVL742
 	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL780
-	.8byte	.LVL782-1
+	.byte	0x50
+	.8byte	.LVL745
+	.8byte	.LVL748
 	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL786
-	.8byte	.LVL787-1
+	.byte	0x50
+	.8byte	.LVL749
+	.8byte	.LVL750
 	.2byte	0x1
-	.byte	0x58
+	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST167:
-	.8byte	.LVL693
-	.8byte	.LVL694-1
-	.2byte	0x1
-	.byte	0x55
+.LLST164:
 	.8byte	.LVL702
-	.8byte	.LVL704-1
+	.8byte	.LVL703-1
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL734
-	.8byte	.LVL740
+	.byte	0x56
+	.8byte	.LVL718
+	.8byte	.LVL719-1
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL758
-	.8byte	.LVL760-1
+	.byte	0x56
+	.8byte	.LVL736
+	.8byte	.LVL739
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x56
+	.8byte	.LVL743
+	.8byte	.LVL744
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL744
+	.8byte	.LVL746
+	.2byte	0x1
+	.byte	0x52
 	.8byte	.LVL763
-	.8byte	.LVL765
+	.8byte	.LVL764-1
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL780
-	.8byte	.LVL782-1
+	.byte	0x56
+	.8byte	.LVL769
+	.8byte	.LVL770-1
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL786
-	.8byte	.LVL787-1
+	.byte	0x56
+	.8byte	.LVL793
+	.8byte	.LVL794-1
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST168:
-	.8byte	.LVL693
-	.8byte	.LVL694-1
-	.2byte	0x1
-	.byte	0x60
+.LLST165:
 	.8byte	.LVL702
-	.8byte	.LVL704-1
+	.8byte	.LVL703-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL733
-	.8byte	.LVL740
+	.8byte	.LVL718
+	.8byte	.LVL719-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL758
-	.8byte	.LVL760-1
+	.8byte	.LVL733
+	.8byte	.LVL750
 	.2byte	0x1
 	.byte	0x60
 	.8byte	.LVL763
-	.8byte	.LVL765
+	.8byte	.LVL764-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL780
-	.8byte	.LVL782-1
+	.8byte	.LVL769
+	.8byte	.LVL770-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL786
-	.8byte	.LVL787-1
+	.8byte	.LVL793
+	.8byte	.LVL794-1
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST169:
-	.8byte	.LVL734
-	.8byte	.LVL740
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL763
-	.8byte	.LVL765
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL780
-	.8byte	.LVL781
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST170:
-	.8byte	.LVL693
-	.8byte	.LVL694-1
-	.2byte	0x1
-	.byte	0x62
+.LLST166:
 	.8byte	.LVL702
-	.8byte	.LVL704-1
+	.8byte	.LVL703-1
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL733
-	.8byte	.LVL740
+	.byte	0x5a
+	.8byte	.LVL718
+	.8byte	.LVL719-1
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL758
-	.8byte	.LVL760-1
+	.byte	0x5a
+	.8byte	.LVL730
+	.8byte	.LVL750
 	.2byte	0x1
-	.byte	0x62
+	.byte	0x5a
 	.8byte	.LVL763
-	.8byte	.LVL765
+	.8byte	.LVL764-1
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL780
-	.8byte	.LVL782-1
+	.byte	0x5a
+	.8byte	.LVL769
+	.8byte	.LVL770-1
 	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL786
-	.8byte	.LVL787-1
+	.byte	0x5a
+	.8byte	.LVL793
+	.8byte	.LVL794-1
 	.2byte	0x1
-	.byte	0x62
+	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST171:
-	.8byte	.LVL693
-	.8byte	.LVL694-1
-	.2byte	0x1
-	.byte	0x5c
+.LLST167:
 	.8byte	.LVL702
-	.8byte	.LVL704-1
+	.8byte	.LVL703-1
 	.2byte	0x1
-	.byte	0x5c
-	.8byte	.LVL731
-	.8byte	.LVL740
+	.byte	0x5f
+	.8byte	.LVL718
+	.8byte	.LVL719-1
 	.2byte	0x1
-	.byte	0x5c
-	.8byte	.LVL758
-	.8byte	.LVL760-1
+	.byte	0x5f
+	.8byte	.LVL734
+	.8byte	.LVL737
 	.2byte	0x1
-	.byte	0x5c
+	.byte	0x5f
+	.8byte	.LVL737
+	.8byte	.LVL738
+	.2byte	0x1
+	.byte	0x57
 	.8byte	.LVL763
-	.8byte	.LVL765
+	.8byte	.LVL764-1
 	.2byte	0x1
-	.byte	0x5c
-	.8byte	.LVL780
-	.8byte	.LVL782-1
+	.byte	0x5f
+	.8byte	.LVL769
+	.8byte	.LVL770-1
 	.2byte	0x1
-	.byte	0x5c
-	.8byte	.LVL786
-	.8byte	.LVL787-1
+	.byte	0x5f
+	.8byte	.LVL793
+	.8byte	.LVL794-1
 	.2byte	0x1
-	.byte	0x5c
+	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST172:
-	.8byte	.LVL654
-	.8byte	.LVL660
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL663
-	.8byte	.LVL686
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL693
-	.8byte	.LVL695
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL699
-	.8byte	.LVL703
+.LLST168:
+	.8byte	.LVL702
+	.8byte	.LVL703-1
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL707
-	.8byte	.LVL717
+	.byte	0x62
+	.8byte	.LVL718
+	.8byte	.LVL719-1
 	.2byte	0x1
-	.byte	0x65
+	.byte	0x62
 	.8byte	.LVL732
-	.8byte	.LVL740
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL757
-	.8byte	.LVL759
+	.8byte	.LVL750
 	.2byte	0x1
-	.byte	0x65
+	.byte	0x62
 	.8byte	.LVL763
-	.8byte	.LVL765
+	.8byte	.LVL764-1
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL780
-	.8byte	.LVL784
+	.byte	0x62
+	.8byte	.LVL769
+	.8byte	.LVL770-1
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL786
-	.8byte	.LFE2819
+	.byte	0x62
+	.8byte	.LVL793
+	.8byte	.LVL794-1
 	.2byte	0x1
-	.byte	0x65
+	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST173:
-	.8byte	.LVL690
-	.8byte	.LVL691-1
+.LLST169:
+	.8byte	.LVL697
+	.8byte	.LVL700-1
 	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL719
-	.8byte	.LVL720-1
+	.byte	0x56
+	.8byte	.LVL721
+	.8byte	.LVL722-1
 	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL741
-	.8byte	.LVL742-1
+	.byte	0x56
+	.8byte	.LVL751
+	.8byte	.LVL752
 	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL743
-	.8byte	.LVL744
+	.byte	0x56
+	.8byte	.LVL777
+	.8byte	.LVL778-1
 	.2byte	0x1
-	.byte	0x58
+	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST73:
-	.8byte	.LVL241
-	.8byte	.LVL242
+.LLST69:
+	.8byte	.LVL243
+	.8byte	.LVL244
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL242
-	.8byte	.LVL248
+	.8byte	.LVL244
+	.8byte	.LVL250
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL249
+	.8byte	.LVL251
 	.8byte	.LFE2817
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST74:
-	.8byte	.LVL243
+.LLST70:
 	.8byte	.LVL245
+	.8byte	.LVL247
 	.2byte	0x2
 	.byte	0x71
 	.sleb128 -12
-	.8byte	.LVL245
-	.8byte	.LVL252
+	.8byte	.LVL247
+	.8byte	.LVL254
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
-	.8byte	.LVL252
-	.8byte	.LVL255
+	.8byte	.LVL254
+	.8byte	.LVL257
 	.2byte	0x2
 	.byte	0x71
 	.sleb128 -12
-	.8byte	.LVL255
+	.8byte	.LVL257
 	.8byte	.LFE2817
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
 	.8byte	0
 	.8byte	0
-.LLST119:
-	.8byte	.LVL416
-	.8byte	.LVL417
+.LLST115:
+	.8byte	.LVL418
+	.8byte	.LVL419
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST118:
-	.8byte	.LVL393
-	.8byte	.LVL394
+.LLST114:
+	.8byte	.LVL395
+	.8byte	.LVL396
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL394
-	.8byte	.LVL398
+	.8byte	.LVL396
+	.8byte	.LVL400
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL399
-	.8byte	.LVL402
+	.8byte	.LVL401
+	.8byte	.LVL404
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL403
-	.8byte	.LVL407
+	.8byte	.LVL405
+	.8byte	.LVL409
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL408
-	.8byte	.LVL412
+	.8byte	.LVL410
+	.8byte	.LVL414
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL413
+	.8byte	.LVL415
 	.8byte	.LFE2814
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST0:
-	.8byte	.LVL0
-	.8byte	.LVL25
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL25
-	.8byte	.LFE2809
+	.8byte	.LVL4
+	.8byte	.LVL31
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x5e
 	.8byte	0
 	.8byte	0
 .LLST1:
-	.8byte	.LVL0
-	.8byte	.LVL24
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL25
-	.8byte	.LFE2809
+	.8byte	.LVL3
+	.8byte	.LVL31
 	.2byte	0x1
-	.byte	0x52
+	.byte	0x5c
 	.8byte	0
 	.8byte	0
 .LLST2:
-	.8byte	.LVL5
-	.8byte	.LVL18
-	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL23
-	.8byte	.LFE2809
-	.2byte	0x1
-	.byte	0x56
-	.8byte	0
-	.8byte	0
-.LLST3:
 	.8byte	.LVL5
 	.8byte	.LVL6
 	.2byte	0x1
 	.byte	0x55
 	.8byte	.LVL7
-	.8byte	.LVL19
+	.8byte	.LVL14
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL23
-	.8byte	.LFE2809
+	.8byte	.LVL16
+	.8byte	.LVL18
 	.2byte	0x1
 	.byte	0x55
-	.8byte	0
-	.8byte	0
-.LLST4:
-	.8byte	.LVL7
-	.8byte	.LVL8
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL29
-	.8byte	.LFE2809
-	.2byte	0x1
-	.byte	0x59
-	.8byte	0
-	.8byte	0
-.LLST5:
-	.8byte	.LVL5
-	.8byte	.LVL9
+	.8byte	.LVL19
+	.8byte	.LVL20
 	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL10
-	.8byte	.LFE2809
+	.byte	0x55
+	.8byte	.LVL21
+	.8byte	.LVL22
 	.2byte	0x1
-	.byte	0x58
-	.8byte	0
-	.8byte	0
-.LLST6:
-	.8byte	.LVL5
-	.8byte	.LVL11
+	.byte	0x55
+	.8byte	.LVL23
+	.8byte	.LVL24
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL20
+	.byte	0x55
+	.8byte	.LVL25
 	.8byte	.LVL26
 	.2byte	0x1
-	.byte	0x65
+	.byte	0x55
+	.8byte	.LVL27
 	.8byte	.LVL28
-	.8byte	.LFE2809
 	.2byte	0x1
-	.byte	0x65
+	.byte	0x55
+	.8byte	.LVL29
+	.8byte	.LVL31
+	.2byte	0x1
+	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST7:
+.LLST3:
 	.8byte	.LVL5
-	.8byte	.LVL14
+	.8byte	.LVL9
 	.2byte	0x1
-	.byte	0x67
+	.byte	0x57
+	.8byte	.LVL10
 	.8byte	.LVL15
-	.8byte	.LVL16
 	.2byte	0x1
-	.byte	0x67
+	.byte	0x57
 	.8byte	.LVL17
-	.8byte	.LVL21
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL22
-	.8byte	.LVL27
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL28
-	.8byte	.LFE2809
+	.8byte	.LVL31
 	.2byte	0x1
-	.byte	0x67
+	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST8:
-	.8byte	.LVL5
-	.8byte	.LVL12
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL13
-	.8byte	.LVL16
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL17
-	.8byte	.LVL21
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL22
-	.8byte	.LVL27
+.LLST4:
+	.8byte	.LVL7
+	.8byte	.LVL8
 	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL28
-	.8byte	.LFE2809
+	.byte	0x5a
+	.8byte	.LVL30
+	.8byte	.LVL31
 	.2byte	0x1
-	.byte	0x67
+	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST9:
+.LLST5:
 	.8byte	.LVL5
-	.8byte	.LVL12
+	.8byte	.LVL11
 	.2byte	0x1
-	.byte	0x67
+	.byte	0x58
+	.8byte	.LVL12
 	.8byte	.LVL13
-	.8byte	.LVL14
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL15
-	.8byte	.LVL21
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL22
-	.8byte	.LVL27
 	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL28
-	.8byte	.LFE2809
+	.byte	0x58
+	.8byte	.LVL17
+	.8byte	.LVL31
 	.2byte	0x1
-	.byte	0x67
+	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST152:
-	.8byte	.LVL645
-	.8byte	.LVL646
+.LLST148:
+	.8byte	.LVL650
+	.8byte	.LVL651
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST153:
-	.8byte	.LVL647
-	.8byte	.LVL648
+.LLST149:
+	.8byte	.LVL652
+	.8byte	.LVL656
 	.2byte	0x1
-	.byte	0x54
+	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST147:
+.LLST142:
 	.8byte	.LVL633
-	.8byte	.LVL643
+	.8byte	.LVL638
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL643
+	.byte	0x53
+	.8byte	.LVL638
+	.8byte	.LVL647
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL647
 	.8byte	.LFE2806
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST148:
+.LLST143:
 	.8byte	.LVL633
-	.8byte	.LVL641
+	.8byte	.LVL638
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x54
+	.8byte	.LVL642
 	.8byte	.LVL643
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL648
 	.8byte	.LFE2806
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST149:
-	.8byte	.LVL633
-	.8byte	.LVL642
+.LLST144:
+	.8byte	.LVL634
+	.8byte	.LVL649
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL643
-	.8byte	.LFE2806
+	.byte	0x6e
+	.8byte	0
+	.8byte	0
+.LLST145:
+	.8byte	.LVL639
+	.8byte	.LVL640
 	.2byte	0x1
-	.byte	0x52
+	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST150:
-	.8byte	.LVL633
+.LLST146:
+	.8byte	.LVL637
 	.8byte	.LVL638
 	.2byte	0x1
-	.byte	0x54
+	.byte	0x5b
+	.8byte	.LVL639
 	.8byte	.LVL644
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL646
 	.8byte	.LFE2806
 	.2byte	0x1
-	.byte	0x54
+	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST151:
-	.8byte	.LVL639
-	.8byte	.LVL640
+.LLST147:
+	.8byte	.LVL638
+	.8byte	.LVL641
 	.2byte	0x1
-	.byte	0x56
+	.byte	0x54
+	.8byte	.LVL645
+	.8byte	.LVL646
+	.2byte	0x1
+	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST99:
-	.8byte	.LVL317
-	.8byte	.LVL331
+.LLST95:
+	.8byte	.LVL319
+	.8byte	.LVL333
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL335
-	.8byte	.LVL338
+	.8byte	.LVL337
+	.8byte	.LVL340
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL341
-	.8byte	.LFE2846
+	.8byte	.LVL343
+	.8byte	.LFE2847
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST100:
-	.8byte	.LVL317
-	.8byte	.LVL332
+.LLST96:
+	.8byte	.LVL319
+	.8byte	.LVL334
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL335
-	.8byte	.LVL338
+	.8byte	.LVL337
+	.8byte	.LVL340
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL341
-	.8byte	.LFE2846
+	.8byte	.LVL343
+	.8byte	.LFE2847
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST101:
-	.8byte	.LVL327
+.LLST97:
 	.8byte	.LVL329
+	.8byte	.LVL331
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST102:
-	.8byte	.LVL328
+.LLST98:
 	.8byte	.LVL330
+	.8byte	.LVL332
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST103:
-	.8byte	.LVL326
-	.8byte	.LVL335
+.LLST99:
+	.8byte	.LVL328
+	.8byte	.LVL337
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL338
-	.8byte	.LVL341
+	.8byte	.LVL340
+	.8byte	.LVL343
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST104:
-	.8byte	.LVL326
-	.8byte	.LVL335
+.LLST100:
+	.8byte	.LVL328
+	.8byte	.LVL337
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL338
-	.8byte	.LVL341
+	.8byte	.LVL340
+	.8byte	.LVL343
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST105:
-	.8byte	.LVL323
-	.8byte	.LVL324
+.LLST101:
+	.8byte	.LVL325
+	.8byte	.LVL326
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL325
-	.8byte	.LVL333
+	.8byte	.LVL327
+	.8byte	.LVL335
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL334
 	.8byte	.LVL336
+	.8byte	.LVL338
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL337
 	.8byte	.LVL339
+	.8byte	.LVL341
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL340
-	.8byte	.LFE2846
+	.8byte	.LVL342
+	.8byte	.LFE2847
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST106:
-	.8byte	.LVL318
-	.8byte	.LVL319
+.LLST102:
+	.8byte	.LVL320
+	.8byte	.LVL321
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST107:
-	.8byte	.LVL342
-	.8byte	.LVL368
+.LLST103:
+	.8byte	.LVL344
+	.8byte	.LVL370
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL374
-	.8byte	.LVL375
+	.8byte	.LVL376
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL376
-	.8byte	.LVL380
+	.8byte	.LVL378
+	.8byte	.LVL382
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL384
-	.8byte	.LFE2847
+	.8byte	.LVL386
+	.8byte	.LFE2848
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST108:
-	.8byte	.LVL342
-	.8byte	.LVL369
+.LLST104:
+	.8byte	.LVL344
+	.8byte	.LVL371
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL374
-	.8byte	.LVL380
+	.8byte	.LVL376
+	.8byte	.LVL382
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL384
-	.8byte	.LFE2847
+	.8byte	.LVL386
+	.8byte	.LFE2848
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST109:
-	.8byte	.LVL349
-	.8byte	.LVL362
+.LLST105:
+	.8byte	.LVL351
+	.8byte	.LVL364
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL367
-	.8byte	.LFE2847
+	.8byte	.LVL369
+	.8byte	.LFE2848
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST110:
-	.8byte	.LVL353
-	.8byte	.LVL363
+.LLST106:
+	.8byte	.LVL355
+	.8byte	.LVL365
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL367
-	.8byte	.LVL370
+	.8byte	.LVL369
+	.8byte	.LVL372
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL374
-	.8byte	.LVL377
+	.8byte	.LVL376
+	.8byte	.LVL379
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL383
-	.8byte	.LFE2847
+	.8byte	.LVL385
+	.8byte	.LFE2848
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST111:
-	.8byte	.LVL349
-	.8byte	.LVL350
-	.2byte	0x1
-	.byte	0x56
+.LLST107:
 	.8byte	.LVL351
 	.8byte	.LVL352
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL369
-	.8byte	.LVL371
+	.8byte	.LVL353
+	.8byte	.LVL354
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL372
+	.8byte	.LVL371
 	.8byte	.LVL373
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL376
+	.8byte	.LVL374
+	.8byte	.LVL375
+	.2byte	0x1
+	.byte	0x56
 	.8byte	.LVL378
+	.8byte	.LVL380
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL379
 	.8byte	.LVL381
+	.8byte	.LVL383
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL382
-	.8byte	.LFE2847
+	.8byte	.LVL384
+	.8byte	.LFE2848
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST112:
-	.8byte	.LVL343
-	.8byte	.LVL344
+.LLST108:
+	.8byte	.LVL345
+	.8byte	.LVL346
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST113:
-	.8byte	.LVL354
-	.8byte	.LVL355
+.LLST109:
+	.8byte	.LVL356
+	.8byte	.LVL357
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL364
-	.8byte	.LVL374
+	.8byte	.LVL366
+	.8byte	.LVL376
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL380
-	.8byte	.LVL384
+	.8byte	.LVL382
+	.8byte	.LVL386
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST114:
-	.8byte	.LVL354
-	.8byte	.LVL358
-	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL359
+.LLST110:
+	.8byte	.LVL356
 	.8byte	.LVL360
 	.2byte	0x1
 	.byte	0x62
 	.8byte	.LVL361
-	.8byte	.LVL365
+	.8byte	.LVL362
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL366
-	.8byte	.LVL374
+	.8byte	.LVL363
+	.8byte	.LVL367
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL380
-	.8byte	.LVL384
+	.8byte	.LVL368
+	.8byte	.LVL376
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL382
+	.8byte	.LVL386
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST115:
-	.8byte	.LVL354
+.LLST111:
 	.8byte	.LVL356
+	.8byte	.LVL358
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL357
-	.8byte	.LVL360
+	.8byte	.LVL359
+	.8byte	.LVL362
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL361
-	.8byte	.LVL365
+	.8byte	.LVL363
+	.8byte	.LVL367
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL366
-	.8byte	.LVL374
+	.8byte	.LVL368
+	.8byte	.LVL376
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL380
-	.8byte	.LVL384
+	.8byte	.LVL382
+	.8byte	.LVL386
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST116:
-	.8byte	.LVL354
+.LLST112:
 	.8byte	.LVL356
-	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL357
 	.8byte	.LVL358
 	.2byte	0x1
 	.byte	0x62
 	.8byte	.LVL359
-	.8byte	.LVL365
+	.8byte	.LVL360
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL366
-	.8byte	.LVL374
+	.8byte	.LVL361
+	.8byte	.LVL367
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL380
-	.8byte	.LVL384
+	.8byte	.LVL368
+	.8byte	.LVL376
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL382
+	.8byte	.LVL386
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST117:
-	.8byte	.LVL385
-	.8byte	.LVL386
+.LLST113:
+	.8byte	.LVL387
+	.8byte	.LVL388
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL386
-	.8byte	.LVL391
+	.8byte	.LVL388
+	.8byte	.LVL393
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL392
-	.8byte	.LFE2848
+	.8byte	.LVL394
+	.8byte	.LFE2849
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST120:
-	.8byte	.LVL432
-	.8byte	.LVL433
+.LLST116:
+	.8byte	.LVL434
+	.8byte	.LVL435
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL433
-	.8byte	.LVL440
+	.8byte	.LVL435
+	.8byte	.LVL442
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST121:
-	.8byte	.LVL432
-	.8byte	.LVL434-1
+.LLST117:
+	.8byte	.LVL434
+	.8byte	.LVL436-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL434-1
-	.8byte	.LVL439
+	.8byte	.LVL436-1
+	.8byte	.LVL441
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST145:
+.LLST140:
 	.8byte	.LVL616
 	.8byte	.LVL617
 	.2byte	0x1
@@ -48836,142 +48918,148 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
 .Ldebug_ranges0:
-	.8byte	.LBB916
-	.8byte	.LBE916
-	.8byte	.LBB925
-	.8byte	.LBE925
+	.8byte	.LBB910
+	.8byte	.LBE910
+	.8byte	.LBB913
+	.8byte	.LBE913
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB914
+	.8byte	.LBE914
+	.8byte	.LBB945
+	.8byte	.LBE945
+	.8byte	.LBB946
+	.8byte	.LBE946
+	.8byte	.LBB1011
+	.8byte	.LBE1011
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB917
+	.8byte	.LBE917
+	.8byte	.LBB929
+	.8byte	.LBE929
 	.8byte	.LBB930
 	.8byte	.LBE930
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB933
 	.8byte	.LBE933
+	.8byte	.LBB938
+	.8byte	.LBE938
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB934
-	.8byte	.LBE934
-	.8byte	.LBB965
-	.8byte	.LBE965
-	.8byte	.LBB966
-	.8byte	.LBE966
-	.8byte	.LBB1031
-	.8byte	.LBE1031
+	.8byte	.LBB947
+	.8byte	.LBE947
+	.8byte	.LBB1168
+	.8byte	.LBE1168
+	.8byte	.LBB1169
+	.8byte	.LBE1169
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB937
-	.8byte	.LBE937
-	.8byte	.LBB949
-	.8byte	.LBE949
 	.8byte	.LBB950
 	.8byte	.LBE950
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB953
-	.8byte	.LBE953
-	.8byte	.LBB958
-	.8byte	.LBE958
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB967
-	.8byte	.LBE967
-	.8byte	.LBB1188
-	.8byte	.LBE1188
-	.8byte	.LBB1189
-	.8byte	.LBE1189
-	.8byte	0
-	.8byte	0
 	.8byte	.LBB970
 	.8byte	.LBE970
-	.8byte	.LBB990
-	.8byte	.LBE990
-	.8byte	.LBB991
-	.8byte	.LBE991
+	.8byte	.LBB971
+	.8byte	.LBE971
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB984
-	.8byte	.LBE984
-	.8byte	.LBB989
-	.8byte	.LBE989
+	.8byte	.LBB964
+	.8byte	.LBE964
+	.8byte	.LBB969
+	.8byte	.LBE969
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB996
-	.8byte	.LBE996
-	.8byte	.LBB1199
-	.8byte	.LBE1199
-	.8byte	.LBB1201
-	.8byte	.LBE1201
-	.8byte	.LBB1202
-	.8byte	.LBE1202
+	.8byte	.LBB976
+	.8byte	.LBE976
+	.8byte	.LBB1179
+	.8byte	.LBE1179
+	.8byte	.LBB1181
+	.8byte	.LBE1181
+	.8byte	.LBB1182
+	.8byte	.LBE1182
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1002
-	.8byte	.LBE1002
-	.8byte	.LBB1186
-	.8byte	.LBE1186
-	.8byte	.LBB1187
-	.8byte	.LBE1187
+	.8byte	.LBB982
+	.8byte	.LBE982
+	.8byte	.LBB1166
+	.8byte	.LBE1166
+	.8byte	.LBB1167
+	.8byte	.LBE1167
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB985
+	.8byte	.LBE985
 	.8byte	.LBB1005
 	.8byte	.LBE1005
-	.8byte	.LBB1025
-	.8byte	.LBE1025
-	.8byte	.LBB1026
-	.8byte	.LBE1026
+	.8byte	.LBB1006
+	.8byte	.LBE1006
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1019
-	.8byte	.LBE1019
-	.8byte	.LBB1024
-	.8byte	.LBE1024
+	.8byte	.LBB999
+	.8byte	.LBE999
+	.8byte	.LBB1004
+	.8byte	.LBE1004
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1032
-	.8byte	.LBE1032
-	.8byte	.LBB1065
-	.8byte	.LBE1065
-	.8byte	.LBB1196
-	.8byte	.LBE1196
-	.8byte	.LBB1197
-	.8byte	.LBE1197
+	.8byte	.LBB1012
+	.8byte	.LBE1012
+	.8byte	.LBB1045
+	.8byte	.LBE1045
+	.8byte	.LBB1176
+	.8byte	.LBE1176
+	.8byte	.LBB1177
+	.8byte	.LBE1177
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1035
-	.8byte	.LBE1035
-	.8byte	.LBB1048
-	.8byte	.LBE1048
-	.8byte	.LBB1057
-	.8byte	.LBE1057
-	.8byte	.LBB1058
-	.8byte	.LBE1058
+	.8byte	.LBB1015
+	.8byte	.LBE1015
+	.8byte	.LBB1028
+	.8byte	.LBE1028
+	.8byte	.LBB1037
+	.8byte	.LBE1037
+	.8byte	.LBB1038
+	.8byte	.LBE1038
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1051
-	.8byte	.LBE1051
-	.8byte	.LBB1056
-	.8byte	.LBE1056
+	.8byte	.LBB1031
+	.8byte	.LBE1031
+	.8byte	.LBB1036
+	.8byte	.LBE1036
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1066
-	.8byte	.LBE1066
-	.8byte	.LBB1101
-	.8byte	.LBE1101
-	.8byte	.LBB1192
-	.8byte	.LBE1192
-	.8byte	.LBB1193
-	.8byte	.LBE1193
-	.8byte	.LBB1203
-	.8byte	.LBE1203
+	.8byte	.LBB1046
+	.8byte	.LBE1046
+	.8byte	.LBB1081
+	.8byte	.LBE1081
+	.8byte	.LBB1172
+	.8byte	.LBE1172
+	.8byte	.LBB1173
+	.8byte	.LBE1173
+	.8byte	.LBB1183
+	.8byte	.LBE1183
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1049
+	.8byte	.LBE1049
+	.8byte	.LBB1062
+	.8byte	.LBE1062
+	.8byte	.LBB1071
+	.8byte	.LBE1071
+	.8byte	.LBB1072
+	.8byte	.LBE1072
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1065
+	.8byte	.LBE1065
+	.8byte	.LBB1070
+	.8byte	.LBE1070
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1069
-	.8byte	.LBE1069
 	.8byte	.LBB1082
 	.8byte	.LBE1082
-	.8byte	.LBB1091
-	.8byte	.LBE1091
-	.8byte	.LBB1092
-	.8byte	.LBE1092
+	.8byte	.LBB1093
+	.8byte	.LBE1093
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1085
@@ -48980,392 +49068,372 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1090
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1102
-	.8byte	.LBE1102
-	.8byte	.LBB1113
-	.8byte	.LBE1113
+	.8byte	.LBB1086
+	.8byte	.LBE1086
+	.8byte	.LBB1089
+	.8byte	.LBE1089
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1105
-	.8byte	.LBE1105
-	.8byte	.LBB1110
-	.8byte	.LBE1110
+	.8byte	.LBB1094
+	.8byte	.LBE1094
+	.8byte	.LBB1129
+	.8byte	.LBE1129
+	.8byte	.LBB1170
+	.8byte	.LBE1170
+	.8byte	.LBB1171
+	.8byte	.LBE1171
+	.8byte	.LBB1178
+	.8byte	.LBE1178
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1106
-	.8byte	.LBE1106
-	.8byte	.LBB1109
-	.8byte	.LBE1109
+	.8byte	.LBB1097
+	.8byte	.LBE1097
+	.8byte	.LBB1110
+	.8byte	.LBE1110
+	.8byte	.LBB1111
+	.8byte	.LBE1111
+	.8byte	.LBB1112
+	.8byte	.LBE1112
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1114
-	.8byte	.LBE1114
-	.8byte	.LBB1149
-	.8byte	.LBE1149
-	.8byte	.LBB1190
-	.8byte	.LBE1190
-	.8byte	.LBB1191
-	.8byte	.LBE1191
-	.8byte	.LBB1198
-	.8byte	.LBE1198
+	.8byte	.LBB1115
+	.8byte	.LBE1115
+	.8byte	.LBB1120
+	.8byte	.LBE1120
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1117
-	.8byte	.LBE1117
 	.8byte	.LBB1130
 	.8byte	.LBE1130
-	.8byte	.LBB1131
-	.8byte	.LBE1131
-	.8byte	.LBB1132
-	.8byte	.LBE1132
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1135
-	.8byte	.LBE1135
-	.8byte	.LBB1140
-	.8byte	.LBE1140
+	.8byte	.LBB1165
+	.8byte	.LBE1165
+	.8byte	.LBB1174
+	.8byte	.LBE1174
+	.8byte	.LBB1175
+	.8byte	.LBE1175
+	.8byte	.LBB1180
+	.8byte	.LBE1180
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1150
-	.8byte	.LBE1150
-	.8byte	.LBB1185
-	.8byte	.LBE1185
-	.8byte	.LBB1194
-	.8byte	.LBE1194
-	.8byte	.LBB1195
-	.8byte	.LBE1195
-	.8byte	.LBB1200
-	.8byte	.LBE1200
+	.8byte	.LBB1133
+	.8byte	.LBE1133
+	.8byte	.LBB1146
+	.8byte	.LBE1146
+	.8byte	.LBB1147
+	.8byte	.LBE1147
+	.8byte	.LBB1148
+	.8byte	.LBE1148
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1153
-	.8byte	.LBE1153
-	.8byte	.LBB1166
-	.8byte	.LBE1166
-	.8byte	.LBB1167
-	.8byte	.LBE1167
-	.8byte	.LBB1168
-	.8byte	.LBE1168
+	.8byte	.LBB1151
+	.8byte	.LBE1151
+	.8byte	.LBB1156
+	.8byte	.LBE1156
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1171
-	.8byte	.LBE1171
-	.8byte	.LBB1176
-	.8byte	.LBE1176
+	.8byte	.LBB1188
+	.8byte	.LBE1188
+	.8byte	.LBB1191
+	.8byte	.LBE1191
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1192
+	.8byte	.LBE1192
+	.8byte	.LBB1204
+	.8byte	.LBE1204
+	.8byte	.LBB1206
+	.8byte	.LBE1206
 	.8byte	.LBB1208
 	.8byte	.LBE1208
-	.8byte	.LBB1211
-	.8byte	.LBE1211
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1212
-	.8byte	.LBE1212
-	.8byte	.LBB1224
-	.8byte	.LBE1224
+	.8byte	.LBB1197
+	.8byte	.LBE1197
+	.8byte	.LBB1205
+	.8byte	.LBE1205
+	.8byte	.LBB1207
+	.8byte	.LBE1207
+	.8byte	.LBB1216
+	.8byte	.LBE1216
+	.8byte	.LBB1218
+	.8byte	.LBE1218
+	.8byte	.LBB1220
+	.8byte	.LBE1220
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1209
+	.8byte	.LBE1209
+	.8byte	.LBB1217
+	.8byte	.LBE1217
+	.8byte	.LBB1219
+	.8byte	.LBE1219
 	.8byte	.LBB1226
 	.8byte	.LBE1226
 	.8byte	.LBB1228
 	.8byte	.LBE1228
+	.8byte	.LBB1230
+	.8byte	.LBE1230
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1217
-	.8byte	.LBE1217
-	.8byte	.LBB1225
-	.8byte	.LBE1225
+	.8byte	.LBB1221
+	.8byte	.LBE1221
 	.8byte	.LBB1227
 	.8byte	.LBE1227
-	.8byte	.LBB1236
-	.8byte	.LBE1236
-	.8byte	.LBB1238
-	.8byte	.LBE1238
-	.8byte	.LBB1240
-	.8byte	.LBE1240
-	.8byte	0
-	.8byte	0
 	.8byte	.LBB1229
 	.8byte	.LBE1229
-	.8byte	.LBB1237
-	.8byte	.LBE1237
-	.8byte	.LBB1239
-	.8byte	.LBE1239
-	.8byte	.LBB1246
-	.8byte	.LBE1246
-	.8byte	.LBB1248
-	.8byte	.LBE1248
-	.8byte	.LBB1250
-	.8byte	.LBE1250
+	.8byte	.LBB1231
+	.8byte	.LBE1231
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1232
+	.8byte	.LBE1232
 	.8byte	.LBB1241
 	.8byte	.LBE1241
-	.8byte	.LBB1247
-	.8byte	.LBE1247
-	.8byte	.LBB1249
-	.8byte	.LBE1249
-	.8byte	.LBB1251
-	.8byte	.LBE1251
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1242
+	.8byte	.LBE1242
+	.8byte	.LBB1251
+	.8byte	.LBE1251
 	.8byte	.LBB1252
 	.8byte	.LBE1252
-	.8byte	.LBB1261
-	.8byte	.LBE1261
+	.8byte	.LBB1263
+	.8byte	.LBE1263
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1262
-	.8byte	.LBE1262
-	.8byte	.LBB1271
-	.8byte	.LBE1271
-	.8byte	.LBB1272
-	.8byte	.LBE1272
-	.8byte	.LBB1283
-	.8byte	.LBE1283
+	.8byte	.LBB1244
+	.8byte	.LBE1244
+	.8byte	.LBB1247
+	.8byte	.LBE1247
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1264
-	.8byte	.LBE1264
-	.8byte	.LBB1267
-	.8byte	.LBE1267
+	.8byte	.LBB1253
+	.8byte	.LBE1253
+	.8byte	.LBB1257
+	.8byte	.LBE1257
+	.8byte	.LBB1258
+	.8byte	.LBE1258
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1272
+	.8byte	.LBE1272
+	.8byte	.LBB1279
+	.8byte	.LBE1279
+	.8byte	.LBB1280
+	.8byte	.LBE1280
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1273
 	.8byte	.LBE1273
-	.8byte	.LBB1277
-	.8byte	.LBE1277
 	.8byte	.LBB1278
 	.8byte	.LBE1278
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1292
-	.8byte	.LBE1292
-	.8byte	.LBB1299
-	.8byte	.LBE1299
-	.8byte	.LBB1300
-	.8byte	.LBE1300
+	.8byte	.LBB1287
+	.8byte	.LBE1287
+	.8byte	.LBB1290
+	.8byte	.LBE1290
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1293
-	.8byte	.LBE1293
-	.8byte	.LBB1298
-	.8byte	.LBE1298
+	.8byte	.LBB1438
+	.8byte	.LBE1438
+	.8byte	.LBB1441
+	.8byte	.LBE1441
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1307
-	.8byte	.LBE1307
-	.8byte	.LBB1310
-	.8byte	.LBE1310
+	.8byte	.LBB1448
+	.8byte	.LBE1448
+	.8byte	.LBB1547
+	.8byte	.LBE1547
+	.8byte	.LBB1548
+	.8byte	.LBE1548
+	.8byte	.LBB1549
+	.8byte	.LBE1549
+	.8byte	.LBB1586
+	.8byte	.LBE1586
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1450
+	.8byte	.LBE1450
+	.8byte	.LBB1459
+	.8byte	.LBE1459
 	.8byte	.LBB1460
 	.8byte	.LBE1460
-	.8byte	.LBB1463
-	.8byte	.LBE1463
+	.8byte	.LBB1461
+	.8byte	.LBE1461
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1470
-	.8byte	.LBE1470
-	.8byte	.LBB1569
-	.8byte	.LBE1569
-	.8byte	.LBB1570
-	.8byte	.LBE1570
-	.8byte	.LBB1571
-	.8byte	.LBE1571
-	.8byte	.LBB1612
-	.8byte	.LBE1612
+	.8byte	.LBB1507
+	.8byte	.LBE1507
+	.8byte	.LBB1541
+	.8byte	.LBE1541
+	.8byte	.LBB1542
+	.8byte	.LBE1542
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1472
-	.8byte	.LBE1472
-	.8byte	.LBB1481
-	.8byte	.LBE1481
-	.8byte	.LBB1482
-	.8byte	.LBE1482
-	.8byte	.LBB1483
-	.8byte	.LBE1483
+	.8byte	.LBB1514
+	.8byte	.LBE1514
+	.8byte	.LBB1539
+	.8byte	.LBE1539
+	.8byte	.LBB1540
+	.8byte	.LBE1540
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1529
-	.8byte	.LBE1529
-	.8byte	.LBB1563
-	.8byte	.LBE1563
-	.8byte	.LBB1564
-	.8byte	.LBE1564
+	.8byte	.LBB1521
+	.8byte	.LBE1521
+	.8byte	.LBB1537
+	.8byte	.LBE1537
+	.8byte	.LBB1538
+	.8byte	.LBE1538
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1528
+	.8byte	.LBE1528
+	.8byte	.LBB1535
+	.8byte	.LBE1535
 	.8byte	.LBB1536
 	.8byte	.LBE1536
-	.8byte	.LBB1561
-	.8byte	.LBE1561
-	.8byte	.LBB1562
-	.8byte	.LBE1562
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1543
-	.8byte	.LBE1543
-	.8byte	.LBB1559
-	.8byte	.LBE1559
-	.8byte	.LBB1560
-	.8byte	.LBE1560
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1550
 	.8byte	.LBE1550
-	.8byte	.LBB1557
-	.8byte	.LBE1557
-	.8byte	.LBB1558
-	.8byte	.LBE1558
+	.8byte	.LBB1575
+	.8byte	.LBE1575
+	.8byte	.LBB1576
+	.8byte	.LBE1576
+	.8byte	.LBB1585
+	.8byte	.LBE1585
+	.8byte	.LBB1636
+	.8byte	.LBE1636
+	.8byte	.LBB1641
+	.8byte	.LBE1641
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1572
-	.8byte	.LBE1572
-	.8byte	.LBB1601
-	.8byte	.LBE1601
-	.8byte	.LBB1602
-	.8byte	.LBE1602
-	.8byte	.LBB1611
-	.8byte	.LBE1611
-	.8byte	.LBB1662
-	.8byte	.LBE1662
-	.8byte	.LBB1667
-	.8byte	.LBE1667
+	.8byte	.LBB1552
+	.8byte	.LBE1552
+	.8byte	.LBB1555
+	.8byte	.LBE1555
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1556
+	.8byte	.LBE1556
+	.8byte	.LBB1561
+	.8byte	.LBE1561
+	.8byte	.LBB1562
+	.8byte	.LBE1562
+	.8byte	.LBB1563
+	.8byte	.LBE1563
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1574
-	.8byte	.LBE1574
 	.8byte	.LBB1577
 	.8byte	.LBE1577
+	.8byte	.LBB1587
+	.8byte	.LBE1587
+	.8byte	.LBB1638
+	.8byte	.LBE1638
+	.8byte	.LBB1642
+	.8byte	.LBE1642
+	.8byte	.LBB1643
+	.8byte	.LBE1643
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1578
-	.8byte	.LBE1578
-	.8byte	.LBB1583
-	.8byte	.LBE1583
-	.8byte	.LBB1584
-	.8byte	.LBE1584
-	.8byte	.LBB1585
-	.8byte	.LBE1585
+	.8byte	.LBB1588
+	.8byte	.LBE1588
+	.8byte	.LBB1639
+	.8byte	.LBE1639
+	.8byte	.LBB1640
+	.8byte	.LBE1640
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1592
-	.8byte	.LBE1592
-	.8byte	.LBB1595
-	.8byte	.LBE1595
+	.8byte	.LBB1590
+	.8byte	.LBE1590
+	.8byte	.LBB1596
+	.8byte	.LBE1596
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1603
-	.8byte	.LBE1603
-	.8byte	.LBB1613
-	.8byte	.LBE1613
-	.8byte	.LBB1664
-	.8byte	.LBE1664
-	.8byte	.LBB1668
-	.8byte	.LBE1668
-	.8byte	.LBB1669
-	.8byte	.LBE1669
+	.8byte	.LBB1599
+	.8byte	.LBE1599
+	.8byte	.LBB1600
+	.8byte	.LBE1600
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1607
+	.8byte	.LBE1607
+	.8byte	.LBB1613
+	.8byte	.LBE1613
 	.8byte	.LBB1614
 	.8byte	.LBE1614
-	.8byte	.LBB1665
-	.8byte	.LBE1665
-	.8byte	.LBB1666
-	.8byte	.LBE1666
-	.8byte	0
-	.8byte	0
+	.8byte	.LBB1615
+	.8byte	.LBE1615
 	.8byte	.LBB1616
 	.8byte	.LBE1616
-	.8byte	.LBB1622
-	.8byte	.LBE1622
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1625
-	.8byte	.LBE1625
-	.8byte	.LBB1626
-	.8byte	.LBE1626
+	.8byte	.LBB1617
+	.8byte	.LBE1617
+	.8byte	.LBB1635
+	.8byte	.LBE1635
+	.8byte	.LBB1637
+	.8byte	.LBE1637
+	.8byte	.LBB1644
+	.8byte	.LBE1644
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1633
-	.8byte	.LBE1633
-	.8byte	.LBB1639
-	.8byte	.LBE1639
-	.8byte	.LBB1640
-	.8byte	.LBE1640
-	.8byte	.LBB1641
-	.8byte	.LBE1641
-	.8byte	.LBB1642
-	.8byte	.LBE1642
+	.8byte	.LBB1645
+	.8byte	.LBE1645
+	.8byte	.LBB1648
+	.8byte	.LBE1648
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1643
-	.8byte	.LBE1643
-	.8byte	.LBB1661
-	.8byte	.LBE1661
-	.8byte	.LBB1663
-	.8byte	.LBE1663
-	.8byte	.LBB1670
-	.8byte	.LBE1670
+	.8byte	.LBB1682
+	.8byte	.LBE1682
+	.8byte	.LBB1689
+	.8byte	.LBE1689
+	.8byte	.LBB1690
+	.8byte	.LBE1690
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1671
-	.8byte	.LBE1671
-	.8byte	.LBB1674
-	.8byte	.LBE1674
+	.8byte	.LBB1684
+	.8byte	.LBE1684
+	.8byte	.LBB1685
+	.8byte	.LBE1685
+	.8byte	.LBB1686
+	.8byte	.LBE1686
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1708
-	.8byte	.LBE1708
-	.8byte	.LBB1715
-	.8byte	.LBE1715
+	.8byte	.LBB1696
+	.8byte	.LBE1696
 	.8byte	.LBB1716
 	.8byte	.LBE1716
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1710
-	.8byte	.LBE1710
-	.8byte	.LBB1711
-	.8byte	.LBE1711
-	.8byte	.LBB1712
-	.8byte	.LBE1712
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1722
-	.8byte	.LBE1722
-	.8byte	.LBB1743
-	.8byte	.LBE1743
+	.8byte	.LBB1698
+	.8byte	.LBE1698
+	.8byte	.LBB1699
+	.8byte	.LBE1699
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1724
-	.8byte	.LBE1724
-	.8byte	.LBB1725
-	.8byte	.LBE1725
-	.8byte	.LBB1726
-	.8byte	.LBE1726
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1727
-	.8byte	.LBE1727
-	.8byte	.LBB1733
-	.8byte	.LBE1733
-	.8byte	.LBB1734
-	.8byte	.LBE1734
-	.8byte	.LBB1735
-	.8byte	.LBE1735
-	.8byte	.LBB1744
-	.8byte	.LBE1744
+	.8byte	.LBB1700
+	.8byte	.LBE1700
+	.8byte	.LBB1706
+	.8byte	.LBE1706
+	.8byte	.LBB1707
+	.8byte	.LBE1707
+	.8byte	.LBB1708
+	.8byte	.LBE1708
+	.8byte	.LBB1717
+	.8byte	.LBE1717
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1739
-	.8byte	.LBE1739
-	.8byte	.LBB1747
-	.8byte	.LBE1747
+	.8byte	.LBB1712
+	.8byte	.LBE1712
+	.8byte	.LBB1720
+	.8byte	.LBE1720
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1741
-	.8byte	.LBE1741
-	.8byte	.LBB1742
-	.8byte	.LBE1742
+	.8byte	.LBB1714
+	.8byte	.LBE1714
+	.8byte	.LBB1715
+	.8byte	.LBE1715
 	.8byte	0
 	.8byte	0
 	.8byte	.Ltext0
@@ -49455,7 +49523,7 @@ __exitcall_ebc_exit:
 	.string	"dev_kobj"
 .LASF472:
 	.string	"d_release"
-.LASF3142:
+.LASF3145:
 	.string	"get_arch_dma_ops"
 .LASF304:
 	.string	"__ctors_start"
@@ -49523,15 +49591,15 @@ __exitcall_ebc_exit:
 	.string	"system_wq"
 .LASF601:
 	.string	"rcu_read_lock_nesting"
-.LASF2985:
+.LASF2984:
 	.string	"suspend_lock"
 .LASF2527:
 	.string	"gpio_desc"
 .LASF959:
 	.string	"list"
-.LASF3159:
+.LASF3162:
 	.string	"_copy_from_user"
-.LASF3185:
+.LASF3188:
 	.string	"get_order"
 .LASF942:
 	.string	"si_errno"
@@ -49589,7 +49657,7 @@ __exitcall_ebc_exit:
 	.string	"n_node"
 .LASF1621:
 	.string	"qsize_t"
-.LASF3182:
+.LASF3185:
 	.string	"devm_kzalloc"
 .LASF377:
 	.string	"sequence"
@@ -49675,7 +49743,7 @@ __exitcall_ebc_exit:
 	.string	"size_t"
 .LASF208:
 	.string	"compat_elf_hwcap"
-.LASF3254:
+.LASF3257:
 	.string	"prepare_to_wait_event"
 .LASF1107:
 	.string	"cap_permitted"
@@ -49717,7 +49785,7 @@ __exitcall_ebc_exit:
 	.string	"__reserved"
 .LASF937:
 	.string	"_sigfault"
-.LASF3114:
+.LASF3117:
 	.string	"image_bg"
 .LASF2855:
 	.string	"ebc_buf_status"
@@ -49769,7 +49837,7 @@ __exitcall_ebc_exit:
 	.string	"bin_attribute"
 .LASF1600:
 	.string	"percpu_counter"
-.LASF2987:
+.LASF2986:
 	.string	"first_in"
 .LASF2326:
 	.string	"dev_groups"
@@ -49809,7 +49877,7 @@ __exitcall_ebc_exit:
 	.string	"dq_id"
 .LASF3109:
 	.string	"frame_count_tmp"
-.LASF3113:
+.LASF3116:
 	.string	"image_fb"
 .LASF1786:
 	.string	"write_end"
@@ -49817,7 +49885,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ION_HEAP_POOL"
 .LASF1421:
 	.string	"sysctl_protected_hardlinks"
-.LASF3258:
+.LASF3261:
 	.string	"__arch_copy_from_user"
 .LASF1174:
 	.string	"scan_objects"
@@ -49825,7 +49893,7 @@ __exitcall_ebc_exit:
 	.string	"pageset"
 .LASF1235:
 	.string	"wb_err"
-.LASF3156:
+.LASF3159:
 	.string	"copy_to_user"
 .LASF732:
 	.string	"trace_recursion"
@@ -49937,7 +50005,7 @@ __exitcall_ebc_exit:
 	.string	"pcpu_chosen_fc"
 .LASF388:
 	.string	"dentry_stat_t"
-.LASF3207:
+.LASF3210:
 	.string	"atomic_add"
 .LASF1640:
 	.string	"dqi_bgrace"
@@ -49955,7 +50023,7 @@ __exitcall_ebc_exit:
 	.string	"ctl_table"
 .LASF43:
 	.string	"uid_t"
-.LASF3236:
+.LASF3239:
 	.string	"strstr"
 .LASF2845:
 	.string	"WF_TYPE_A2"
@@ -50017,7 +50085,7 @@ __exitcall_ebc_exit:
 	.string	"pteval_t"
 .LASF427:
 	.string	"i_ino"
-.LASF3275:
+.LASF3280:
 	.string	"might_fault"
 .LASF1559:
 	.string	"compact_cached_free_pfn"
@@ -50135,7 +50203,7 @@ __exitcall_ebc_exit:
 	.string	"pidfd_fops"
 .LASF1914:
 	.string	"lm_put_owner"
-.LASF3240:
+.LASF3241:
 	.string	"ebc_pmic_verity_vcom"
 .LASF2521:
 	.string	"set_sda"
@@ -50201,7 +50269,7 @@ __exitcall_ebc_exit:
 	.string	"func"
 .LASF1138:
 	.string	"perf_event_context"
-.LASF2998:
+.LASF2997:
 	.string	"ebc_auto_task"
 .LASF93:
 	.string	"printk_delay_msec"
@@ -50241,6 +50309,8 @@ __exitcall_ebc_exit:
 	.string	"sysfs_dev_block_kobj"
 .LASF552:
 	.string	"upid"
+.LASF3269:
+	.string	"down_write"
 .LASF1096:
 	.string	"completion"
 .LASF3071:
@@ -50343,13 +50413,13 @@ __exitcall_ebc_exit:
 	.string	"RPM_SUSPENDED"
 .LASF695:
 	.string	"reclaim_state"
-.LASF3274:
+.LASF3279:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF137:
 	.string	"vendor_panic_cb"
 .LASF3066:
 	.string	"ebc_vdd_power_timeout"
-.LASF3128:
+.LASF3131:
 	.string	"ebc_get_4pix_wf"
 .LASF2796:
 	.string	"num_symtab"
@@ -50377,13 +50447,13 @@ __exitcall_ebc_exit:
 	.string	"module_alloc_base"
 .LASF1749:
 	.string	"core_kallsyms"
-.LASF3238:
+.LASF3243:
 	.string	"memcpy"
 .LASF2890:
 	.string	"EPD_FORCE_FULL"
 .LASF2398:
 	.string	"get_sgtable"
-.LASF3127:
+.LASF3113:
 	.string	"xor_val"
 .LASF2153:
 	.string	"envp_idx"
@@ -50399,7 +50469,7 @@ __exitcall_ebc_exit:
 	.string	"gray_old"
 .LASF67:
 	.string	"hlist_node"
-.LASF3247:
+.LASF3250:
 	.string	"sprintf"
 .LASF1906:
 	.string	"fl_ops"
@@ -50409,7 +50479,7 @@ __exitcall_ebc_exit:
 	.string	"debug_guardpage_ops"
 .LASF2671:
 	.string	"COMPACTISOLATED"
-.LASF3218:
+.LASF3221:
 	.string	"of_property_read_variable_u32_array"
 .LASF325:
 	.string	"__inittext_begin"
@@ -50445,7 +50515,7 @@ __exitcall_ebc_exit:
 	.string	"DOMAIN_BUS_WAKEUP"
 .LASF1220:
 	.string	"arm64_el2_vector_last_slot"
-.LASF3268:
+.LASF3273:
 	.string	"queue_work_on"
 .LASF2333:
 	.string	"online"
@@ -50453,7 +50523,7 @@ __exitcall_ebc_exit:
 	.string	"runtime_resume"
 .LASF1205:
 	.string	"dup_xol_work"
-.LASF3149:
+.LASF3152:
 	.string	"ebc_pmic_read_temp"
 .LASF2873:
 	.string	"EPD_FULL_GC16"
@@ -50463,7 +50533,7 @@ __exitcall_ebc_exit:
 	.string	"kernel_kobj"
 .LASF2585:
 	.string	"funcs"
-.LASF2994:
+.LASF2993:
 	.string	"overlay_enable"
 .LASF1105:
 	.string	"securebits"
@@ -50483,7 +50553,7 @@ __exitcall_ebc_exit:
 	.string	"DOMAIN_BUS_NEXUS"
 .LASF2036:
 	.string	"sysctl_mount_point"
-.LASF2990:
+.LASF2989:
 	.string	"auto_buffer_work"
 .LASF266:
 	.string	"user_mask"
@@ -50567,7 +50637,7 @@ __exitcall_ebc_exit:
 	.string	"driver"
 .LASF1542:
 	.string	"ZONE_NORMAL"
-.LASF3115:
+.LASF3118:
 	.string	"image_new_data"
 .LASF423:
 	.string	"i_op"
@@ -50621,7 +50691,7 @@ __exitcall_ebc_exit:
 	.string	"huge_fault"
 .LASF2006:
 	.string	"kstatfs"
-.LASF3152:
+.LASF3155:
 	.string	"ebc_pmic_power_off"
 .LASF2632:
 	.string	"PGPGOUTCLEAN"
@@ -50693,7 +50763,7 @@ __exitcall_ebc_exit:
 	.string	"get_next_id"
 .LASF237:
 	.string	"rwlock_t"
-.LASF3273:
+.LASF3278:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
 .LASF838:
 	.string	"pgprot"
@@ -50721,7 +50791,7 @@ __exitcall_ebc_exit:
 	.string	"__icache_flags"
 .LASF147:
 	.string	"crash_kexec_post_notifiers"
-.LASF3137:
+.LASF3140:
 	.string	"eink_mode"
 .LASF1695:
 	.string	"rt_spc_warnlimit"
@@ -50743,6 +50813,8 @@ __exitcall_ebc_exit:
 	.string	"_pid"
 .LASF1154:
 	.string	"init_stack"
+.LASF3124:
+	.string	"dmask"
 .LASF1223:
 	.string	"address_space"
 .LASF1214:
@@ -50809,7 +50881,7 @@ __exitcall_ebc_exit:
 	.string	"normal_prio"
 .LASF1286:
 	.string	"f_ep_links"
-.LASF3119:
+.LASF3122:
 	.string	"image_fb_tmp"
 .LASF2292:
 	.string	"last_busy"
@@ -50821,7 +50893,7 @@ __exitcall_ebc_exit:
 	.string	"host"
 .LASF184:
 	.string	"uaddr"
-.LASF3265:
+.LASF3268:
 	.string	"ebc_remove_from_dsp_buf_list"
 .LASF659:
 	.string	"real_start_time"
@@ -50857,11 +50929,11 @@ __exitcall_ebc_exit:
 	.string	"devres_head"
 .LASF425:
 	.string	"i_mapping"
-.LASF3242:
+.LASF3245:
 	.string	"misc_register"
 .LASF720:
 	.string	"rseq_sig"
-.LASF3171:
+.LASF3174:
 	.string	"platform_set_drvdata"
 .LASF340:
 	.string	"cpu_context"
@@ -50869,7 +50941,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pm_domain"
 .LASF1511:
 	.string	"nr_zones"
-.LASF3194:
+.LASF3197:
 	.string	"is_source"
 .LASF1373:
 	.string	"migrate_mode"
@@ -50891,11 +50963,11 @@ __exitcall_ebc_exit:
 	.string	"d_hash"
 .LASF1073:
 	.string	"dl_bw"
-.LASF3164:
+.LASF3167:
 	.string	"limit"
 .LASF2143:
 	.string	"kobj"
-.LASF3248:
+.LASF3251:
 	.string	"kstrtouint"
 .LASF113:
 	.string	"fsync"
@@ -50905,9 +50977,9 @@ __exitcall_ebc_exit:
 	.string	"i_flags"
 .LASF2887:
 	.string	"EPD_RESUME"
-.LASF3237:
+.LASF3240:
 	.string	"sscanf"
-.LASF3233:
+.LASF3236:
 	.string	"ebc_empty_buf_get"
 .LASF1472:
 	.string	"NR_ISOLATED_ANON"
@@ -50921,7 +50993,7 @@ __exitcall_ebc_exit:
 	.string	"rb_node"
 .LASF611:
 	.string	"pushable_tasks"
-.LASF3120:
+.LASF3123:
 	.string	"image_bg_tmp"
 .LASF2200:
 	.string	"platform_data"
@@ -50951,7 +51023,7 @@ __exitcall_ebc_exit:
 	.string	"last_update_time"
 .LASF1135:
 	.string	"robust_list_head"
-.LASF3231:
+.LASF3234:
 	.string	"init_timer_key"
 .LASF1478:
 	.string	"NR_ANON_MAPPED"
@@ -50965,7 +51037,7 @@ __exitcall_ebc_exit:
 	.string	"srcversion"
 .LASF856:
 	.string	"pcpu_unit_offsets"
-.LASF3140:
+.LASF3143:
 	.string	"dma_sync_single_for_device"
 .LASF2952:
 	.string	"dsp_end_callback"
@@ -51007,7 +51079,7 @@ __exitcall_ebc_exit:
 	.string	"task_rss_stat"
 .LASF1139:
 	.string	"pipe_inode_info"
-.LASF2980:
+.LASF2979:
 	.string	"ebc_power_status"
 .LASF958:
 	.string	"ratelimit"
@@ -51031,7 +51103,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_INACTIVE_ANON"
 .LASF726:
 	.string	"nr_dirtied"
-.LASF3181:
+.LASF3184:
 	.string	"dev_get_drvdata"
 .LASF2393:
 	.string	"linear_revmap"
@@ -51075,11 +51147,11 @@ __exitcall_ebc_exit:
 	.string	"sysctl_memory_failure_early_kill"
 .LASF2758:
 	.string	"param_ops_bool_enable_only"
-.LASF3124:
+.LASF3128:
 	.string	"power_status"
 .LASF306:
 	.string	"__start_opd"
-.LASF3245:
+.LASF3248:
 	.string	"of_find_i2c_device_by_node"
 .LASF153:
 	.string	"SYSTEM_RUNNING"
@@ -51115,7 +51187,7 @@ __exitcall_ebc_exit:
 	.string	"sigval_t"
 .LASF1931:
 	.string	"fa_file"
-.LASF2996:
+.LASF2995:
 	.string	"panel"
 .LASF2430:
 	.string	"irq_data"
@@ -51153,7 +51225,7 @@ __exitcall_ebc_exit:
 	.string	"taint_flags"
 .LASF1345:
 	.string	"membarrier_state"
-.LASF3131:
+.LASF3134:
 	.string	"pre_image_addr"
 .LASF2176:
 	.string	"suspend"
@@ -51219,7 +51291,7 @@ __exitcall_ebc_exit:
 	.string	"exit_code"
 .LASF1054:
 	.string	"exec_start"
-.LASF3270:
+.LASF3275:
 	.string	"printk"
 .LASF2379:
 	.string	"consumers"
@@ -51305,7 +51377,7 @@ __exitcall_ebc_exit:
 	.string	"optimistic_spin_queue"
 .LASF2957:
 	.string	"ebc_buffer_size"
-.LASF3249:
+.LASF3252:
 	.string	"ebc_pmic_set_vcom"
 .LASF2639:
 	.string	"ALLOCSTALL_NORMAL"
@@ -51477,7 +51549,7 @@ __exitcall_ebc_exit:
 	.string	"seq_show"
 .LASF764:
 	.string	"ate_match_dt"
-.LASF3179:
+.LASF3182:
 	.string	"of_node_put"
 .LASF1358:
 	.string	"cow_page"
@@ -51501,7 +51573,7 @@ __exitcall_ebc_exit:
 	.string	"s_shrink"
 .LASF1523:
 	.string	"kcompactd_classzone_idx"
-.LASF3169:
+.LASF3172:
 	.string	"kmalloc_index"
 .LASF867:
 	.string	"hrtimer_restart"
@@ -51509,7 +51581,7 @@ __exitcall_ebc_exit:
 	.string	"totalram_pages"
 .LASF2484:
 	.string	"i2c_smbus_data"
-.LASF2984:
+.LASF2983:
 	.string	"curr_dsp_buf"
 .LASF1066:
 	.string	"time_slice"
@@ -51549,7 +51621,7 @@ __exitcall_ebc_exit:
 	.string	"wake_lock"
 .LASF2268:
 	.string	"may_skip_resume"
-.LASF2992:
+.LASF2991:
 	.string	"is_deep_sleep"
 .LASF1172:
 	.string	"shrinker"
@@ -51611,7 +51683,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_DELAYED_BIT"
 .LASF1036:
 	.string	"nr_failed_migrations_affine"
-.LASF3184:
+.LASF3187:
 	.string	"IS_ERR"
 .LASF859:
 	.string	"PCPU_FC_EMBED"
@@ -51625,7 +51697,7 @@ __exitcall_ebc_exit:
 	.string	"pi_top_task"
 .LASF803:
 	.string	"WORK_NR_COLORS"
-.LASF3122:
+.LASF3126:
 	.string	"refresh_new_image2"
 .LASF525:
 	.string	"s_fsnotify_inode_refs"
@@ -51637,7 +51709,7 @@ __exitcall_ebc_exit:
 	.string	"uprobe"
 .LASF526:
 	.string	"s_readonly_remount"
-.LASF3210:
+.LASF3213:
 	.string	"kasan_check_write"
 .LASF375:
 	.string	"hlist_bl_node"
@@ -51663,7 +51735,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_FLAG_MASK"
 .LASF1269:
 	.string	"units"
-.LASF3225:
+.LASF3228:
 	.string	"epd_lut_from_mem_init"
 .LASF309:
 	.string	"__nosave_begin"
@@ -51683,7 +51755,7 @@ __exitcall_ebc_exit:
 	.string	"user_namespace"
 .LASF2754:
 	.string	"param_ops_ulong"
-.LASF3201:
+.LASF3204:
 	.string	"get_current"
 .LASF231:
 	.string	"raw_spinlock"
@@ -51715,9 +51787,9 @@ __exitcall_ebc_exit:
 	.string	"PGREFILL"
 .LASF2760:
 	.string	"param_ops_bint"
-.LASF3234:
+.LASF3237:
 	.string	"ebc_add_to_dsp_buf_list"
-.LASF3239:
+.LASF3242:
 	.string	"kfree"
 .LASF1800:
 	.string	"swap_deactivate"
@@ -51741,6 +51813,8 @@ __exitcall_ebc_exit:
 	.string	"gtime"
 .LASF570:
 	.string	"debug_locks"
+.LASF2998:
+	.string	"auto_buf_sema"
 .LASF1781:
 	.string	"readpage"
 .LASF2669:
@@ -51783,7 +51857,7 @@ __exitcall_ebc_exit:
 	.string	"boost_expires"
 .LASF2907:
 	.string	"DMA_BIDIRECTIONAL"
-.LASF3257:
+.LASF3260:
 	.string	"__arch_copy_to_user"
 .LASF235:
 	.string	"spinlock"
@@ -51825,7 +51899,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_OFFQ_POOL_BITS"
 .LASF1903:
 	.string	"fl_fasync"
-.LASF3134:
+.LASF3137:
 	.string	"update_mode"
 .LASF2934:
 	.string	"direct_mode"
@@ -51899,13 +51973,13 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_HIGH_WMARK_HIT_QUICKLY"
 .LASF3045:
 	.string	"ebc_state_read"
-.LASF3246:
+.LASF3249:
 	.string	"__stack_chk_fail"
 .LASF2905:
 	.string	"pmic_set_vcom"
 .LASF2697:
 	.string	"stack_guard_gap"
-.LASF3193:
+.LASF3196:
 	.string	"bytes"
 .LASF1736:
 	.string	"gpl_future_crcs"
@@ -52023,7 +52097,7 @@ __exitcall_ebc_exit:
 	.string	"MODULE_STATE_COMING"
 .LASF2229:
 	.string	"offline_disabled"
-.LASF3177:
+.LASF3180:
 	.string	"of_property_read_u32_array"
 .LASF2474:
 	.string	"select"
@@ -52047,7 +52121,7 @@ __exitcall_ebc_exit:
 	.string	"async_put_work"
 .LASF2114:
 	.string	"kernfs_syscall_ops"
-.LASF2981:
+.LASF2980:
 	.string	"ebc_last_display"
 .LASF1855:
 	.string	"mknod"
@@ -52089,7 +52163,7 @@ __exitcall_ebc_exit:
 	.string	"writeback_control"
 .LASF1902:
 	.string	"fl_end"
-.LASF3260:
+.LASF3263:
 	.string	"ebc_find_buf_by_phy_addr"
 .LASF1949:
 	.string	"super_operations"
@@ -52135,7 +52209,7 @@ __exitcall_ebc_exit:
 	.string	"enable"
 .LASF953:
 	.string	"pipe_bufs"
-.LASF3198:
+.LASF3201:
 	.string	"to_user"
 .LASF2122:
 	.string	"KOBJ_NS_TYPE_NET"
@@ -52153,7 +52227,7 @@ __exitcall_ebc_exit:
 	.string	"__rb_parent_color"
 .LASF2222:
 	.string	"devres_lock"
-.LASF3121:
+.LASF3125:
 	.string	"new_buffer_refresh"
 .LASF363:
 	.string	"bits"
@@ -52169,9 +52243,9 @@ __exitcall_ebc_exit:
 	.string	"lookup"
 .LASF1588:
 	.string	"cpu_topology"
-.LASF3202:
+.LASF3205:
 	.string	"sp_el0"
-.LASF3264:
+.LASF3267:
 	.string	"ebc_dsp_buf_get"
 .LASF2894:
 	.string	"panel_color"
@@ -52179,7 +52253,7 @@ __exitcall_ebc_exit:
 	.string	"fl_owner"
 .LASF2849:
 	.string	"WF_TYPE_GLD16"
-.LASF2993:
+.LASF2992:
 	.string	"is_power_off"
 .LASF977:
 	.string	"vm_private_data"
@@ -52201,7 +52275,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_AUTO"
 .LASF1225:
 	.string	"i_pages"
-.LASF3161:
+.LASF3164:
 	.string	"safe_ptr"
 .LASF374:
 	.string	"hlist_bl_head"
@@ -52241,7 +52315,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_LOW_WMARK_HIT_QUICKLY"
 .LASF992:
 	.string	"syscfs"
-.LASF3154:
+.LASF3157:
 	.string	"wake_unlock"
 .LASF2443:
 	.string	"graph_get_port_parent"
@@ -52249,7 +52323,7 @@ __exitcall_ebc_exit:
 	.string	"UNEVICTABLE_PGRESCUED"
 .LASF2207:
 	.string	"msi_list"
-.LASF3204:
+.LASF3207:
 	.string	"__ilog2_u64"
 .LASF545:
 	.string	"compat_time_t"
@@ -52273,7 +52347,7 @@ __exitcall_ebc_exit:
 	.string	"cap_effective"
 .LASF1744:
 	.string	"taints"
-.LASF3220:
+.LASF3223:
 	.string	"of_address_to_resource"
 .LASF1010:
 	.string	"enqueued"
@@ -52301,7 +52375,7 @@ __exitcall_ebc_exit:
 	.string	"bd_private"
 .LASF1901:
 	.string	"fl_start"
-.LASF3176:
+.LASF3179:
 	.string	"out_value"
 .LASF1959:
 	.string	"freeze_fs"
@@ -52309,7 +52383,7 @@ __exitcall_ebc_exit:
 	.string	"sigset_t"
 .LASF1915:
 	.string	"lm_notify"
-.LASF3133:
+.LASF3136:
 	.string	"ebc_tcon_dsp_mode_set"
 .LASF878:
 	.string	"running"
@@ -52347,13 +52421,13 @@ __exitcall_ebc_exit:
 	.string	"copy_file_range"
 .LASF2683:
 	.string	"UNEVICTABLE_PGCLEARED"
-.LASF3250:
+.LASF3253:
 	.string	"epd_lut_get_wf_version"
 .LASF2045:
 	.string	"key_type"
 .LASF795:
 	.string	"WORK_STRUCT_LINKED_BIT"
-.LASF3195:
+.LASF3198:
 	.string	"copy_overflow"
 .LASF2439:
 	.string	"get_named_child_node"
@@ -52369,13 +52443,13 @@ __exitcall_ebc_exit:
 	.string	"module_kobject"
 .LASF3039:
 	.string	"memory"
-.LASF3168:
+.LASF3171:
 	.string	"order"
 .LASF737:
 	.string	"active_memcg"
 .LASF1330:
 	.string	"def_flags"
-.LASF2997:
+.LASF2996:
 	.string	"global_ebc"
 .LASF1471:
 	.string	"NR_SLAB_UNRECLAIMABLE"
@@ -52419,7 +52493,7 @@ __exitcall_ebc_exit:
 	.string	"arm64_ftr_reg_ctrel0"
 .LASF1242:
 	.string	"counters"
-.LASF3211:
+.LASF3214:
 	.string	"kasan_check_read"
 .LASF2057:
 	.string	"name_link"
@@ -52481,7 +52555,7 @@ __exitcall_ebc_exit:
 	.string	"nr_irqs"
 .LASF892:
 	.string	"max_hang_time"
-.LASF3157:
+.LASF3160:
 	.string	"copy_from_user"
 .LASF2465:
 	.string	"DOMAIN_BUS_ANY"
@@ -52495,7 +52569,7 @@ __exitcall_ebc_exit:
 	.string	"mmap_miss"
 .LASF1652:
 	.string	"quota_format_ops"
-.LASF3262:
+.LASF3265:
 	.string	"ebc_osd_buf_get"
 .LASF3056:
 	.string	"argp"
@@ -52535,7 +52609,7 @@ __exitcall_ebc_exit:
 	.string	"thread_keyring"
 .LASF2743:
 	.string	"kparam_array"
-.LASF3213:
+.LASF3216:
 	.string	"platform_driver_unregister"
 .LASF650:
 	.string	"utime"
@@ -52545,7 +52619,7 @@ __exitcall_ebc_exit:
 	.string	"ebc_driver"
 .LASF2603:
 	.string	"dev_page_free_t"
-.LASF3174:
+.LASF3177:
 	.string	"of_property_read_u32"
 .LASF1396:
 	.string	"guid_t"
@@ -52573,7 +52647,7 @@ __exitcall_ebc_exit:
 	.string	"cpumask_t"
 .LASF133:
 	.string	"kmsg_fops"
-.LASF3259:
+.LASF3262:
 	.string	"ebc_buf_release"
 .LASF817:
 	.string	"WORK_STRUCT_NO_POOL"
@@ -52595,7 +52669,7 @@ __exitcall_ebc_exit:
 	.string	"sched_rt_entity"
 .LASF116:
 	.string	"sendpage"
-.LASF3126:
+.LASF3130:
 	.string	"ret_val"
 .LASF864:
 	.string	"timerqueue_node"
@@ -52605,7 +52679,7 @@ __exitcall_ebc_exit:
 	.string	"mem_dqblk"
 .LASF2770:
 	.string	"plt_entry"
-.LASF3135:
+.LASF3138:
 	.string	"display_mode"
 .LASF1978:
 	.string	"nr_cached_objects"
@@ -52637,11 +52711,11 @@ __exitcall_ebc_exit:
 	.string	"fops"
 .LASF1271:
 	.string	"f_path"
-.LASF3227:
+.LASF3230:
 	.string	"kthread_create_on_node"
 .LASF709:
 	.string	"cgroups"
-.LASF3160:
+.LASF3163:
 	.string	"__uaccess_mask_ptr"
 .LASF2342:
 	.string	"probe_type"
@@ -52661,9 +52735,9 @@ __exitcall_ebc_exit:
 	.string	"userspace_clients"
 .LASF2141:
 	.string	"uevent_seqnum"
-.LASF3223:
+.LASF3226:
 	.string	"memset"
-.LASF3132:
+.LASF3135:
 	.string	"cur_image_addr"
 .LASF2142:
 	.string	"list_lock"
@@ -52711,6 +52785,8 @@ __exitcall_ebc_exit:
 	.string	"qf_fmt_id"
 .LASF1048:
 	.string	"nr_wakeups_idle"
+.LASF3270:
+	.string	"up_write"
 .LASF1456:
 	.string	"NR_MLOCK"
 .LASF2824:
@@ -52745,7 +52821,7 @@ __exitcall_ebc_exit:
 	.string	"console_printk"
 .LASF700:
 	.string	"ioac"
-.LASF3188:
+.LASF3191:
 	.string	"__init_work"
 .LASF1169:
 	.string	"nr_to_scan"
@@ -52757,7 +52833,7 @@ __exitcall_ebc_exit:
 	.string	"exec_max"
 .LASF1401:
 	.string	"uuid_index"
-.LASF3189:
+.LASF3192:
 	.string	"onstack"
 .LASF189:
 	.string	"compat_rmtp"
@@ -52851,7 +52927,7 @@ __exitcall_ebc_exit:
 	.string	"d_rt_space"
 .LASF264:
 	.string	"name"
-.LASF3232:
+.LASF3235:
 	.string	"mod_timer"
 .LASF150:
 	.string	"early_boot_irqs_disabled"
@@ -52893,7 +52969,7 @@ __exitcall_ebc_exit:
 	.string	"self_exec_id"
 .LASF1905:
 	.string	"fl_downgrade_time"
-.LASF2977:
+.LASF2976:
 	.string	"auto_frame_count"
 .LASF2102:
 	.string	"kernfs_ops"
@@ -52921,7 +52997,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_WRITE_PENDING"
 .LASF1294:
 	.string	"close"
-.LASF3116:
+.LASF3119:
 	.string	"image_fb_data"
 .LASF3035:
 	.string	"klogo_buf"
@@ -52933,13 +53009,13 @@ __exitcall_ebc_exit:
 	.string	"ebc_wq"
 .LASF734:
 	.string	"memcg_oom_gfp_mask"
-.LASF3191:
+.LASF3194:
 	.string	"_msecs_to_jiffies"
 .LASF1681:
 	.string	"d_spc_timer"
 .LASF1757:
 	.string	"jump_entries"
-.LASF3199:
+.LASF3202:
 	.string	"test_ti_thread_flag"
 .LASF2253:
 	.string	"async_suspend"
@@ -52949,7 +53025,7 @@ __exitcall_ebc_exit:
 	.string	"read_pos"
 .LASF479:
 	.string	"super_block"
-.LASF3162:
+.LASF3165:
 	.string	"__addr"
 .LASF2320:
 	.string	"dma_coherent"
@@ -52997,11 +53073,11 @@ __exitcall_ebc_exit:
 	.string	"devkmsg_log_str"
 .LASF254:
 	.string	"FTR_HIGHER_SAFE"
-.LASF3173:
+.LASF3176:
 	.string	"i2c_get_clientdata"
-.LASF3158:
+.LASF3161:
 	.string	"_copy_to_user"
-.LASF3206:
+.LASF3209:
 	.string	"test_bit"
 .LASF248:
 	.string	"__start___jump_table"
@@ -53033,9 +53109,9 @@ __exitcall_ebc_exit:
 	.string	"futex"
 .LASF1023:
 	.string	"wait_max"
-.LASF3230:
+.LASF3233:
 	.string	"wakeup_source_add"
-.LASF3151:
+.LASF3154:
 	.string	"ebc_pmic_suspend"
 .LASF1156:
 	.string	"result_mask"
@@ -53047,9 +53123,9 @@ __exitcall_ebc_exit:
 	.string	"dquot_operations"
 .LASF1222:
 	.string	"mapping"
-.LASF3183:
+.LASF3186:
 	.string	"resource_size"
-.LASF3228:
+.LASF3231:
 	.string	"wake_up_process"
 .LASF1352:
 	.string	"kioctx_table"
@@ -53081,7 +53157,7 @@ __exitcall_ebc_exit:
 	.string	"__initdata_end"
 .LASF2499:
 	.string	"bus_lock"
-.LASF3170:
+.LASF3173:
 	.string	"kmalloc_type"
 .LASF385:
 	.string	"qstr"
@@ -53093,7 +53169,7 @@ __exitcall_ebc_exit:
 	.string	"WORKINGSET_RESTORE"
 .LASF626:
 	.string	"sched_psi_wake_requeue"
-.LASF3192:
+.LASF3195:
 	.string	"check_copy_size"
 .LASF735:
 	.string	"memcg_oom_order"
@@ -53149,17 +53225,17 @@ __exitcall_ebc_exit:
 	.string	"core_state"
 .LASF866:
 	.string	"timerqueue_head"
-.LASF3229:
+.LASF3232:
 	.string	"sched_setscheduler_nocheck"
 .LASF1289:
 	.string	"f_wb_err"
-.LASF3186:
+.LASF3189:
 	.string	"schedule_work"
 .LASF2428:
 	.string	"rt_mutex"
 .LASF988:
 	.string	"rchar"
-.LASF3143:
+.LASF3146:
 	.string	"valid_dma_direction"
 .LASF1816:
 	.string	"bd_contains"
@@ -53199,7 +53275,7 @@ __exitcall_ebc_exit:
 	.string	"epoll_watches"
 .LASF2675:
 	.string	"KCOMPACTD_WAKE"
-.LASF3111:
+.LASF3114:
 	.string	"refresh_new_image"
 .LASF2072:
 	.string	"non_rcu"
@@ -53233,8 +53309,6 @@ __exitcall_ebc_exit:
 	.string	"_uid"
 .LASF337:
 	.string	"hbp_break"
-.LASF2976:
-	.string	"auto_image_cur"
 .LASF3026:
 	.string	"pmic_node"
 .LASF138:
@@ -53275,13 +53349,13 @@ __exitcall_ebc_exit:
 	.string	"need"
 .LASF502:
 	.string	"s_encoding"
-.LASF3187:
+.LASF3190:
 	.string	"queue_work"
 .LASF1732:
 	.string	"gpl_crcs"
 .LASF1718:
 	.string	"get_state"
-.LASF3146:
+.LASF3149:
 	.string	"dma_handle"
 .LASF1357:
 	.string	"orig_pte"
@@ -53367,7 +53441,7 @@ __exitcall_ebc_exit:
 	.string	"__u8"
 .LASF115:
 	.string	"lock"
-.LASF3150:
+.LASF3153:
 	.string	"ebc_pmic_resume"
 .LASF1560:
 	.string	"compact_cached_migrate_pfn"
@@ -53375,7 +53449,7 @@ __exitcall_ebc_exit:
 	.string	"PGALLOC_DMA32"
 .LASF2753:
 	.string	"param_ops_long"
-.LASF2995:
+.LASF2994:
 	.string	"overlay_start"
 .LASF2949:
 	.string	"frame_addr_set"
@@ -53409,7 +53483,7 @@ __exitcall_ebc_exit:
 	.string	"compact_order_failed"
 .LASF1103:
 	.string	"fsuid"
-.LASF3200:
+.LASF3203:
 	.string	"flag"
 .LASF1473:
 	.string	"NR_ISOLATED_FILE"
@@ -53421,9 +53495,9 @@ __exitcall_ebc_exit:
 	.string	"managed_pages"
 .LASF2587:
 	.string	"__tracepoint_page_ref_set"
-.LASF3139:
+.LASF3142:
 	.string	"ebc_tcon_enable"
-.LASF3272:
+.LASF3277:
 	.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"
@@ -53453,8 +53527,6 @@ __exitcall_ebc_exit:
 	.string	"nr_reserved_highatomic"
 .LASF2362:
 	.string	"shutdown_pre"
-.LASF3014:
-	.string	"__addressable_ebc_init1974"
 .LASF2282:
 	.string	"no_callbacks"
 .LASF2822:
@@ -53473,13 +53545,13 @@ __exitcall_ebc_exit:
 	.string	"s_vop"
 .LASF1648:
 	.string	"qf_owner"
-.LASF3212:
+.LASF3215:
 	.string	"__write_once_size"
 .LASF2829:
 	.string	"kmalloc_cache_type"
 .LASF572:
 	.string	"mutex"
-.LASF3178:
+.LASF3181:
 	.string	"out_values"
 .LASF837:
 	.string	"pgd_t"
@@ -53493,7 +53565,7 @@ __exitcall_ebc_exit:
 	.string	"raw_spinlock_t"
 .LASF2932:
 	.string	"vir_width"
-.LASF3203:
+.LASF3206:
 	.string	"INIT_LIST_HEAD"
 .LASF1936:
 	.string	"fs_flags"
@@ -53509,7 +53581,7 @@ __exitcall_ebc_exit:
 	.string	"dma_pfn_offset"
 .LASF1187:
 	.string	"radix_tree_node"
-.LASF3205:
+.LASF3208:
 	.string	"sign_extend64"
 .LASF2311:
 	.string	"wake_irq"
@@ -53531,7 +53603,7 @@ __exitcall_ebc_exit:
 	.string	"ptraced"
 .LASF2749:
 	.string	"param_ops_short"
-.LASF3244:
+.LASF3247:
 	.string	"of_find_device_by_node"
 .LASF2551:
 	.string	"HRTIMER_SOFTIRQ"
@@ -53557,7 +53629,7 @@ __exitcall_ebc_exit:
 	.string	"addr"
 .LASF2383:
 	.string	"device_private"
-.LASF3141:
+.LASF3144:
 	.string	"get_dma_ops"
 .LASF2695:
 	.string	"watermark_scale_factor"
@@ -53573,7 +53645,7 @@ __exitcall_ebc_exit:
 	.string	"mkobj"
 .LASF2959:
 	.string	"direct_buf_real_size"
-.LASF3263:
+.LASF3266:
 	.string	"__pm_relax"
 .LASF470:
 	.string	"d_delete"
@@ -53617,7 +53689,7 @@ __exitcall_ebc_exit:
 	.string	"kill"
 .LASF1027:
 	.string	"iowait_sum"
-.LASF3112:
+.LASF3115:
 	.string	"image_new"
 .LASF15:
 	.string	"__u64"
@@ -53643,7 +53715,7 @@ __exitcall_ebc_exit:
 	.string	"i_blkbits"
 .LASF2453:
 	.string	"value"
-.LASF2989:
+.LASF2988:
 	.string	"frame_timer"
 .LASF1030:
 	.string	"sum_sleep_runtime"
@@ -53695,7 +53767,7 @@ __exitcall_ebc_exit:
 	.string	"buffer_new"
 .LASF212:
 	.string	"user_fpsimd_state"
-.LASF3243:
+.LASF3246:
 	.string	"device_create_file"
 .LASF518:
 	.string	"s_time_gran"
@@ -53719,11 +53791,11 @@ __exitcall_ebc_exit:
 	.string	"s_bdi"
 .LASF2854:
 	.string	"wf_table"
-.LASF3118:
+.LASF3121:
 	.string	"image_new_tmp"
 .LASF1729:
 	.string	"num_kp"
-.LASF3271:
+.LASF3276:
 	.string	"__pm_stay_awake"
 .LASF2562:
 	.string	"vmap_area_list"
@@ -53777,7 +53849,7 @@ __exitcall_ebc_exit:
 	.string	"names_cachep"
 .LASF782:
 	.string	"preset_lpj"
-.LASF2988:
+.LASF2987:
 	.string	"vdd_timer"
 .LASF2218:
 	.string	"archdata"
@@ -53867,7 +53939,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_RESUMING"
 .LASF468:
 	.string	"d_weak_revalidate"
-.LASF2983:
+.LASF2982:
 	.string	"prev_dsp_buf"
 .LASF1490:
 	.string	"NR_VMSCAN_IMMEDIATE"
@@ -53951,7 +54023,7 @@ __exitcall_ebc_exit:
 	.string	"maj_flt"
 .LASF228:
 	.string	"arch_rwlock_t"
-.LASF3261:
+.LASF3264:
 	.string	"ebc_osd_buf_clone"
 .LASF161:
 	.string	"c_false"
@@ -53977,7 +54049,7 @@ __exitcall_ebc_exit:
 	.string	"minor"
 .LASF1696:
 	.string	"nextents"
-.LASF3144:
+.LASF3147:
 	.string	"dma_direction"
 .LASF1:
 	.string	"sizetype"
@@ -54001,7 +54073,7 @@ __exitcall_ebc_exit:
 	.string	"next_timer"
 .LASF738:
 	.string	"throttle_queue"
-.LASF3256:
+.LASF3259:
 	.string	"finish_wait"
 .LASF1477:
 	.string	"WORKINGSET_NODERECLAIM"
@@ -54011,7 +54083,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_REQ_RESUME"
 .LASF2042:
 	.string	"keyring_index_key"
-.LASF3138:
+.LASF3141:
 	.string	"ebc_tcon_disable"
 .LASF1418:
 	.string	"leases_enable"
@@ -54051,7 +54123,7 @@ __exitcall_ebc_exit:
 	.string	"num_vf"
 .LASF1532:
 	.string	"isolate_mode_t"
-.LASF3145:
+.LASF3148:
 	.string	"debug_dma_sync_single_for_device"
 .LASF98:
 	.string	"llseek"
@@ -54093,9 +54165,9 @@ __exitcall_ebc_exit:
 	.string	"target"
 .LASF2543:
 	.string	"HI_SOFTIRQ"
-.LASF3147:
+.LASF3150:
 	.string	"direction"
-.LASF3117:
+.LASF3120:
 	.string	"image_bg_data"
 .LASF955:
 	.string	"session_keyring"
@@ -54119,7 +54191,7 @@ __exitcall_ebc_exit:
 	.string	"i2c_bus_type"
 .LASF882:
 	.string	"hrtimer_cpu_base"
-.LASF3266:
+.LASF3271:
 	.string	"ebc_notify"
 .LASF1388:
 	.string	"cb_head"
@@ -54147,7 +54219,7 @@ __exitcall_ebc_exit:
 	.string	"cpus_requested"
 .LASF2591:
 	.string	"__tracepoint_page_ref_mod_unless"
-.LASF3155:
+.LASF3158:
 	.string	"wake_lock_init"
 .LASF1183:
 	.string	"list_lru"
@@ -54171,7 +54243,7 @@ __exitcall_ebc_exit:
 	.string	"d_iput"
 .LASF107:
 	.string	"compat_ioctl"
-.LASF3163:
+.LASF3166:
 	.string	"__range_ok"
 .LASF286:
 	.string	"__start_ro_after_init"
@@ -54179,7 +54251,7 @@ __exitcall_ebc_exit:
 	.string	"num_poisoned_pages"
 .LASF902:
 	.string	"filter"
-.LASF3148:
+.LASF3151:
 	.string	"ebc_pmic_get_vcom"
 .LASF2940:
 	.string	"ebc_tcon"
@@ -54289,11 +54361,11 @@ __exitcall_ebc_exit:
 	.string	"power"
 .LASF265:
 	.string	"strict_mask"
-.LASF3255:
+.LASF3258:
 	.string	"init_wait_entry"
 .LASF2784:
 	.string	"module_state"
-.LASF3215:
+.LASF3218:
 	.string	"_dev_info"
 .LASF414:
 	.string	"d_subdirs"
@@ -54339,7 +54411,7 @@ __exitcall_ebc_exit:
 	.string	"removed_mem"
 .LASF247:
 	.string	"jump_label_t"
-.LASF3129:
+.LASF3132:
 	.string	"ebc_tcon_frame_start"
 .LASF2709:
 	.string	"Elf64_Half"
@@ -54353,6 +54425,8 @@ __exitcall_ebc_exit:
 	.string	"can_wakeup"
 .LASF2544:
 	.string	"TIMER_SOFTIRQ"
+.LASF3112:
+	.string	"temp_data"
 .LASF1212:
 	.string	"xol_area"
 .LASF234:
@@ -54377,15 +54451,15 @@ __exitcall_ebc_exit:
 	.string	"init_on_free"
 .LASF1149:
 	.string	"nr_pages"
-.LASF3123:
+.LASF3127:
 	.string	"ebc_power_set"
 .LASF1759:
 	.string	"num_trace_bprintk_fmt"
-.LASF3209:
+.LASF3212:
 	.string	"__fls"
 .LASF1127:
 	.string	"ioprio"
-.LASF2991:
+.LASF2990:
 	.string	"is_early_suspend"
 .LASF1161:
 	.string	"rdev"
@@ -54407,9 +54481,9 @@ __exitcall_ebc_exit:
 	.string	"persistent_clock_is_local"
 .LASF2411:
 	.string	"dma_supported"
-.LASF3180:
+.LASF3183:
 	.string	"dev_set_drvdata"
-.LASF3267:
+.LASF3272:
 	.string	"epd_lut_get"
 .LASF1533:
 	.string	"per_cpu_pages"
@@ -54421,6 +54495,8 @@ __exitcall_ebc_exit:
 	.string	"release"
 .LASF2368:
 	.string	"max_segment_size"
+.LASF3014:
+	.string	"__addressable_ebc_init2107"
 .LASF36:
 	.string	"__kernel_dev_t"
 .LASF2107:
@@ -54445,7 +54521,7 @@ __exitcall_ebc_exit:
 	.string	"BLOCK_SOFTIRQ"
 .LASF1409:
 	.string	"files_stat_struct"
-.LASF3221:
+.LASF3224:
 	.string	"devm_memremap"
 .LASF841:
 	.string	"pgtable_t"
@@ -54513,7 +54589,7 @@ __exitcall_ebc_exit:
 	.string	"rm_xquota"
 .LASF1082:
 	.string	"dl_timer"
-.LASF3252:
+.LASF3255:
 	.string	"remap_pfn_range"
 .LASF2373:
 	.string	"DL_DEV_NO_DRIVER"
@@ -54527,7 +54603,7 @@ __exitcall_ebc_exit:
 	.string	"watermark"
 .LASF2421:
 	.string	"deadprops"
-.LASF3217:
+.LASF3220:
 	.string	"devm_kmalloc"
 .LASF16:
 	.string	"long long unsigned int"
@@ -54557,7 +54633,7 @@ __exitcall_ebc_exit:
 	.string	"flc_lease"
 .LASF2404:
 	.string	"unmap_resource"
-.LASF2986:
+.LASF2985:
 	.string	"wake_lock_is_set"
 .LASF2356:
 	.string	"driver_private"
@@ -54663,7 +54739,7 @@ __exitcall_ebc_exit:
 	.string	"free_list"
 .LASF587:
 	.string	"prio"
-.LASF3172:
+.LASF3175:
 	.string	"platform_get_drvdata"
 .LASF2553:
 	.string	"NR_SOFTIRQS"
@@ -54685,7 +54761,7 @@ __exitcall_ebc_exit:
 	.string	"atomic_t"
 .LASF810:
 	.string	"WORK_OFFQ_FLAG_BITS"
-.LASF3130:
+.LASF3133:
 	.string	"ebc_tcon_image_addr_set"
 .LASF2529:
 	.string	"max_num_msgs"
@@ -54705,7 +54781,7 @@ __exitcall_ebc_exit:
 	.string	"scatterlist"
 .LASF1265:
 	.string	"altmap_valid"
-.LASF3269:
+.LASF3274:
 	.string	"down"
 .LASF101:
 	.string	"read_iter"
@@ -54743,7 +54819,7 @@ __exitcall_ebc_exit:
 	.string	"pm_domain_data"
 .LASF2485:
 	.string	"byte"
-.LASF3241:
+.LASF3244:
 	.string	"__wake_up_sync"
 .LASF2000:
 	.string	"poll_table_struct"
@@ -54769,7 +54845,7 @@ __exitcall_ebc_exit:
 	.string	"page_fault"
 .LASF1467:
 	.string	"NR_INACTIVE_FILE"
-.LASF3196:
+.LASF3199:
 	.string	"__ret_warn_on"
 .LASF1623:
 	.string	"kqid"
@@ -54889,7 +54965,7 @@ __exitcall_ebc_exit:
 	.string	"of_match_table"
 .LASF2576:
 	.string	"percpu_count_ptr"
-.LASF3251:
+.LASF3254:
 	.string	"ebc_phy_buf_base_get"
 .LASF2077:
 	.string	"loops_per_jiffy"
@@ -54911,7 +54987,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_INODESTEAL"
 .LASF1173:
 	.string	"count_objects"
-.LASF3208:
+.LASF3211:
 	.string	"fls64"
 .LASF919:
 	.string	"_stime"
@@ -54947,11 +55023,11 @@ __exitcall_ebc_exit:
 	.string	"sync_sg_for_device"
 .LASF1962:
 	.string	"statfs"
-.LASF3235:
+.LASF3238:
 	.string	"__kmalloc"
-.LASF3224:
+.LASF3227:
 	.string	"_dev_err"
-.LASF3214:
+.LASF3217:
 	.string	"__platform_driver_register"
 .LASF2958:
 	.string	"ebc_buf_real_size"
@@ -55051,11 +55127,11 @@ __exitcall_ebc_exit:
 	.string	"i_acl"
 .LASF1787:
 	.string	"bmap"
-.LASF3222:
+.LASF3225:
 	.string	"ebc_buf_init"
 .LASF2046:
 	.string	"key_payload"
-.LASF2978:
+.LASF2977:
 	.string	"auto_image_osd"
 .LASF478:
 	.string	"d_real"
@@ -55091,7 +55167,7 @@ __exitcall_ebc_exit:
 	.string	"fallocate"
 .LASF1705:
 	.string	"i_spc_warnlimit"
-.LASF3197:
+.LASF3200:
 	.string	"check_object_size"
 .LASF1513:
 	.string	"node_present_pages"
@@ -55155,7 +55231,7 @@ __exitcall_ebc_exit:
 	.string	"hiwater_vm"
 .LASF3048:
 	.string	"pmic_vcom_read"
-.LASF3216:
+.LASF3219:
 	.string	"misc_deregister"
 .LASF1246:
 	.string	"compound_head"
@@ -55175,7 +55251,7 @@ __exitcall_ebc_exit:
 	.string	"bd_write_holder"
 .LASF2192:
 	.string	"poweroff_noirq"
-.LASF3219:
+.LASF3222:
 	.string	"of_parse_phandle"
 .LASF1856:
 	.string	"rename"
@@ -55205,9 +55281,9 @@ __exitcall_ebc_exit:
 	.string	"sync_single_for_cpu"
 .LASF791:
 	.string	"data"
-.LASF3165:
+.LASF3168:
 	.string	"kzalloc"
-.LASF3190:
+.LASF3193:
 	.string	"msecs_to_jiffies"
 .LASF1917:
 	.string	"lm_break"
@@ -55243,7 +55319,7 @@ __exitcall_ebc_exit:
 	.string	"signed char"
 .LASF373:
 	.string	"rcu_scheduler_active"
-.LASF3175:
+.LASF3178:
 	.string	"propname"
 .LASF2099:
 	.string	"priv"
@@ -55369,7 +55445,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_GCC16"
 .LASF2512:
 	.string	"i2c_lock_operations"
-.LASF3125:
+.LASF3129:
 	.string	"ebc_get_4pix_wf_part"
 .LASF1618:
 	.string	"USRQUOTA"
@@ -55415,7 +55491,9 @@ __exitcall_ebc_exit:
 	.string	"f_inode"
 .LASF2029:
 	.string	"procname"
-.LASF3226:
+.LASF3111:
+	.string	"point_data"
+.LASF3229:
 	.string	"epd_lut_from_file_init"
 .LASF1667:
 	.string	"mark_dirty"
@@ -55567,7 +55645,7 @@ __exitcall_ebc_exit:
 	.string	"percpu_size"
 .LASF1321:
 	.string	"mmap_sem"
-.LASF3253:
+.LASF3256:
 	.string	"schedule"
 .LASF3086:
 	.string	"old_buf_left"
@@ -55707,7 +55785,7 @@ __exitcall_ebc_exit:
 	.string	"text_size"
 .LASF1651:
 	.string	"stat"
-.LASF2982:
+.LASF2981:
 	.string	"lut_ddr_vir"
 .LASF1319:
 	.string	"map_count"
@@ -55767,7 +55845,7 @@ __exitcall_ebc_exit:
 	.string	"compound_mapcount"
 .LASF1447:
 	.string	"zone_stat_item"
-.LASF3167:
+.LASF3170:
 	.string	"kmalloc_large"
 .LASF2624:
 	.string	"PE_SIZE_PMD"
@@ -55839,7 +55917,7 @@ __exitcall_ebc_exit:
 	.string	"last_waited"
 .LASF3053:
 	.string	"ebc_open"
-.LASF3136:
+.LASF3139:
 	.string	"three_win_mode"
 .LASF2872:
 	.string	"EPD_OVERLAY"
@@ -55847,7 +55925,7 @@ __exitcall_ebc_exit:
 	.string	"dqb_bsoftlimit"
 .LASF218:
 	.string	"pending"
-.LASF2979:
+.LASF2978:
 	.string	"direct_buffer"
 .LASF2490:
 	.string	"i2c_client_type"
@@ -55891,7 +55969,7 @@ __exitcall_ebc_exit:
 	.string	"timer_expires"
 .LASF2825:
 	.string	"mmlist_lock"
-.LASF3153:
+.LASF3156:
 	.string	"ebc_pmic_power_on"
 .LASF1763:
 	.string	"trace_evals"
@@ -55933,7 +56011,7 @@ __exitcall_ebc_exit:
 	.string	"relax_count"
 .LASF1411:
 	.string	"nr_free_files"
-.LASF3166:
+.LASF3169:
 	.string	"kmalloc"
 	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
 	.section	.note.GNU-stack,"",@progbits

commit 12931bb8172c4dd5b2975245e6396a8475433d15
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Mon Jun 7 18:10:00 2021 +0800

    media: rockchip: isp/ispp to version v1.6.1
    
    Change-Id: I6a9cdac4874a02cb0465c87aa23d7180d2109d3d
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/version.h b/drivers/media/platform/rockchip/isp/version.h
index a59efa602afa..c70ac7747371 100644
--- a/drivers/media/platform/rockchip/isp/version.h
+++ b/drivers/media/platform/rockchip/isp/version.h
@@ -123,6 +123,23 @@
  * 9. fix err of mp dump raw for isp20
  * 10. make sure 3dlut no continuous read twice
  * 11. adjust rdbk times with mulit dev for isp2.0
+ *
+ * v1.6.1:
+ * 1.fix multi dev refcnt
+ * 2.update procfs info
+ * 3.add check for params subscribe event
+ * 4.resolution limit for isp21
+ * 5.dma buf alloc limit to DMA32
+ * 6.add monitor to restart if abnormal
+ * 7.adjust probe order
+ * 8.max height 3072 for isp21
+ * 9.dmatx support embedded and shield pixels data
+ * 10.separate rdbk from csi subdev
+ * 11.add bt601/bt709/bt2020 colorspace
+ * 12.apply en params if no match for isp20
+ * 13.apply en params if no match for isp21
+ * 14.isp21 get 3a stats from ddr
+ * 15.reserved memory using rdma_sg ops
  */
 
 #define RKISP_DRIVER_VERSION RKISP_API_VERSION
diff --git a/drivers/media/platform/rockchip/ispp/version.h b/drivers/media/platform/rockchip/ispp/version.h
index feba8cf64fbd..69979689aca3 100644
--- a/drivers/media/platform/rockchip/ispp/version.h
+++ b/drivers/media/platform/rockchip/ispp/version.h
@@ -99,6 +99,10 @@
  * 9. add cru reset
  * 10. check SHARP_CORE_CTRL after update
  * 11. add uvnr sd32 self en control
+ *
+ * v1.6.1
+ * 1. reserved memory using rdma_sg ops
+ * 2. destory ispp buffers if start_stream failed
  */
 
 #define RKISPP_DRIVER_VERSION ISPP_API_VERSION
diff --git a/include/uapi/linux/rkisp2-config.h b/include/uapi/linux/rkisp2-config.h
index eab435765d23..079bd9c7e2d4 100644
--- a/include/uapi/linux/rkisp2-config.h
+++ b/include/uapi/linux/rkisp2-config.h
@@ -10,7 +10,7 @@
 #include <linux/types.h>
 #include <linux/v4l2-controls.h>
 
-#define RKISP_API_VERSION		KERNEL_VERSION(1, 6, 0)
+#define RKISP_API_VERSION		KERNEL_VERSION(1, 6, 1)
 
 #define RKISP_CMD_TRIGGER_READ_BACK \
 	_IOW('V', BASE_VIDIOC_PRIVATE + 0, struct isp2x_csi_trigger)

commit 7dde7286ee47c8b24feae6b2e62b93bb0890ec54
Author: Shunqian Zheng <zhengsq@rock-chips.com>
Date:   Sat Jun 5 16:38:47 2021 +0800

    media: rockchip: ispp: destory ispp buffers if start_stream failed
    
    Clean up the buffer pool if start streaming failed.
    
    BUG=redmine:#301918
    
    Signed-off-by: Shunqian Zheng <zhengsq@rock-chips.com>
    Change-Id: I4abcf17ef0c66dabcddcfac7395c7efabbfe6e47

diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c
index c768bbe724ae..b589c46d3103 100644
--- a/drivers/media/platform/rockchip/ispp/stream.c
+++ b/drivers/media/platform/rockchip/ispp/stream.c
@@ -1810,6 +1810,7 @@ static int rkispp_start_streaming(struct vb2_queue *queue,
 	rkispp_free_common_dummy_buf(stream->isppdev);
 free_buf_queue:
 	destroy_buf_queue(stream, VB2_BUF_STATE_QUEUED);
+	rkispp_destroy_buf(stream);
 	atomic_dec(&dev->stream_vdev.refcnt);
 	stream->streaming = false;
 	stream->is_upd = false;

commit 664855bbb110cabecc783f919cae5c58b47fe1f1
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Fri Jun 4 14:13:35 2021 +0800

    drm/rockchip: vop2: only when have active win then need to wait win close
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: Ieaf6497a8597d5d6d3f4a0eb0169fba55c93b4e2

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 72a545176e28..e8d012631a9a 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -1721,18 +1721,21 @@ static void vop2_disable_all_planes_for_crtc(struct drm_crtc *crtc)
 	struct vop2_win *win;
 	unsigned long win_mask = vp->win_mask;
 	int phys_id, ret;
-	bool active;
-
+	bool active, need_wait_win_disabled = false;
 
 	for_each_set_bit(phys_id, &win_mask, ROCKCHIP_MAX_LAYER) {
 		win = vop2_find_win_by_phys_id(vop2, phys_id);
+		need_wait_win_disabled |= VOP_WIN_GET(vop2, win, enable);
 		vop2_win_disable(win);
 	}
-	vop2_cfg_done(crtc);
-	ret = readx_poll_timeout_atomic(vop2_is_allwin_disabled, crtc,
-					active, active, 0, 500 * 1000);
-	if (ret)
-		DRM_DEV_ERROR(vop2->dev, "wait win close timeout\n");
+
+	if (need_wait_win_disabled) {
+		vop2_cfg_done(crtc);
+		ret = readx_poll_timeout_atomic(vop2_is_allwin_disabled, crtc,
+						active, active, 0, 500 * 1000);
+		if (ret)
+			DRM_DEV_ERROR(vop2->dev, "wait win close timeout\n");
+	}
 }
 
 /*

commit b312a6cefb02b63278242950c30d8a4f99b135be
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Fri Jun 4 09:26:49 2021 +0800

    drm/rockchip: vop2: use default sdr2hdr(1000nit) curve
    
    keep sdr2hdr result consistent between VOP and GPU
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: I3ef6b289978d4b0c083d99e93d97a95b2e7f0b25

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 0a2006d84a9f..72a545176e28 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -4400,7 +4400,7 @@ static void vop2_setup_hdr10(struct vop2_video_port *vp, uint8_t win_phys_id)
 	bool sdr2hdr_en = 0;
 	bool sdr2hdr_tf = 0;
 	bool hdr2sdr_tf_update = 1;
-	bool sdr2hdr_tf_update = 1;
+	bool sdr2hdr_tf_update = 0; /* default sdr2hdr curve is 1000 nit */
 	unsigned long win_mask = vp->win_mask;
 	int phys_id;
 	bool have_sdr_layer = false;

commit a433c6370df503b4e95f9ed0d5e8fc21e46d5395
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Wed Jun 2 17:37:33 2021 +0800

    drm/rockchip: vop2: fix csc config error when at hdr mode
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: Ide5b9deb13882a561765a2e2be660e3463d1764f

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 48655e5e0319..0a2006d84a9f 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -1784,10 +1784,26 @@ static void vop2_setup_csc_mode(struct vop2_video_port *vp,
 
 	/* hdr2sdr and sdr2hdr will do csc itself */
 	if (vpstate->hdr2sdr_en) {
-	/* This is hdr2sdr enabled plane */
+		/*
+		 * 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);
+		}
 		return;
 	} else if (!vpstate->hdr_in && vp->sdr2hdr_en) {
-	/* This is sdr2hdr enabled plane */
+		/*
+		 * 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);
+		}
 		return;
 	}
 

commit 916008d27e7f9c46d5de394e96fb2544f0f02848
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Wed Jun 2 15:10:06 2021 +0800

    drm/rockchip: vop2: add more sdr2hdr scene
    
    maybe appear the following scene for sdr2hdr:
    1. one sdr layer      -> vop[sdr2hdr]   -> hdr output
    2. one hdr layer      -> vop[bypass]  |
                                          | -> hdr output
       one/more sdr layer -> vop[sdr2hdr] |
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: I042baf68d36f6f9a089d81928c783e52a2b21499

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 332840a29da0..48655e5e0319 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -4385,6 +4385,9 @@ static void vop2_setup_hdr10(struct vop2_video_port *vp, uint8_t win_phys_id)
 	bool sdr2hdr_tf = 0;
 	bool hdr2sdr_tf_update = 1;
 	bool sdr2hdr_tf_update = 1;
+	unsigned long win_mask = vp->win_mask;
+	int phys_id;
+	bool have_sdr_layer = false;
 
 	/*
 	 * Check whether this video port support hdr or not
@@ -4410,13 +4413,27 @@ static void vop2_setup_hdr10(struct vop2_video_port *vp, uint8_t win_phys_id)
 	 */
 	if (vp->hdr_in && !vp->hdr_out)
 		hdr2sdr_en = 1;
+	vpstate->hdr_in = hdr_en;
+	vpstate->hdr2sdr_en = hdr2sdr_en;
 
-	if (!vp->hdr_in && vp->hdr_out)
-		sdr2hdr_en = 1;
+	/*
+	 * 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);
+
+		if (vpstate->eotf != SMPTE_ST2084) {
+			have_sdr_layer = true;
+			break;
+		}
+	}
 
+	if (have_sdr_layer && vp->hdr_out)
+		sdr2hdr_en = 1;
 	vp->sdr2hdr_en = sdr2hdr_en;
-	vpstate->hdr_in = hdr_en;
-	vpstate->hdr2sdr_en = hdr2sdr_en;
 
 	if (sdr2hdr_en) {
 		sdr2hdr_r2r_mode = BT709_TO_BT2020;
@@ -4945,8 +4962,8 @@ static void vop2_crtc_atomic_begin(struct drm_crtc *crtc, struct drm_crtc_state
 
 		sort(vop2_zpos, nr_layers, sizeof(vop2_zpos[0]), vop2_zpos_cmp, NULL);
 
-		vop2_setup_hdr10(vp, vop2_zpos[0].win_phys_id);
 		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);

commit c6ce255dd060c58351c5c8e633acff3946f29252
Author: Ding Wei <leo.ding@rock-chips.com>
Date:   Tue Jun 1 10:07:44 2021 +0800

    arm64: dts: rockchip: rk3568: vepu && jpegd: Disable auto freqence set
    
    reason: In rk356x, due to the hardware, vepu and jpegd should
    disable auto freqence.
    
    Change-Id: I2da5b5a7fc3b86180aef28b378a7b651e31a6b7a
    Signed-off-by: Ding Wei <leo.ding@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index fc3458987c4e..f42cf09c5066 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -1326,7 +1326,7 @@
 		interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
 		clocks = <&cru ACLK_JDEC>, <&cru HCLK_JDEC>;
 		clock-names = "aclk_vcodec", "hclk_vcodec";
-		rockchip,normal-rates = <297000000>, <0>;
+		rockchip,disable-auto-freq;
 		resets = <&cru SRST_A_JDEC>, <&cru SRST_H_JDEC>;
 		reset-names = "video_a", "video_h";
 		iommus = <&jpegd_mmu>;
@@ -1355,7 +1355,7 @@
 		interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>;
 		clocks = <&cru ACLK_JENC>, <&cru HCLK_JENC>;
 		clock-names = "aclk_vcodec", "hclk_vcodec";
-		rockchip,normal-rates = <297000000>, <0>;
+		rockchip,disable-auto-freq;
 		resets = <&cru SRST_A_JENC>, <&cru SRST_H_JENC>;
 		reset-names = "video_a", "video_h";
 		iommus = <&vepu_mmu>;

commit dd1b793a866ddf159b689bc7ff4da98482ca5d69
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Fri Jun 4 14:36:13 2021 +0800

    media: rockchip: ispp: reserved memory using rdma_sg ops
    
    Change-Id: I7bc3cb977c56fc6c81c15baa67d38e3ce59a409f
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/ispp/common.c b/drivers/media/platform/rockchip/ispp/common.c
index ebd31d319a1c..49962c39b81c 100644
--- a/drivers/media/platform/rockchip/ispp/common.c
+++ b/drivers/media/platform/rockchip/ispp/common.c
@@ -86,7 +86,7 @@ int rkispp_allow_buffer(struct rkispp_device *dev,
 	}
 
 	buf->mem_priv = mem_priv;
-	if (dev->hw_dev->is_mmu) {
+	if (dev->hw_dev->is_dma_sg_ops) {
 		sg_tbl = (struct sg_table *)g_ops->cookie(mem_priv);
 		buf->dma_addr = sg_dma_address(sg_tbl->sgl);
 	} else {
@@ -312,7 +312,7 @@ static int rkispp_init_pool(struct rkispp_hw_dev *hw, struct rkisp_ispp_buf *dbu
 		ret = g_ops->map_dmabuf(mem);
 		if (ret)
 			goto err;
-		if (hw->is_mmu) {
+		if (hw->is_dma_sg_ops) {
 			sg_tbl = (struct sg_table *)g_ops->cookie(mem);
 			pool->dma[i] = sg_dma_address(sg_tbl->sgl);
 		} else {
diff --git a/drivers/media/platform/rockchip/ispp/hw.c b/drivers/media/platform/rockchip/ispp/hw.c
index b5d2faf7548a..7028b5e30b59 100644
--- a/drivers/media/platform/rockchip/ispp/hw.c
+++ b/drivers/media/platform/rockchip/ispp/hw.c
@@ -227,6 +227,7 @@ static int rkispp_hw_probe(struct platform_device *pdev)
 	struct rkispp_hw_dev *hw_dev;
 	struct resource *res;
 	int i, ret, irq;
+	bool is_mem_reserved = true;
 
 	match = of_match_node(rkispp_hw_of_match, node);
 	if (IS_ERR(match))
@@ -325,23 +326,29 @@ static int rkispp_hw_probe(struct platform_device *pdev)
 	hw_dev->is_single = true;
 	hw_dev->is_fec_ext = false;
 	hw_dev->is_dma_contig = true;
+	hw_dev->is_dma_sg_ops = false;
 	hw_dev->is_shutdown = false;
 	hw_dev->is_first = true;
 	hw_dev->first_frame_dma = -1;
 	hw_dev->is_mmu = is_iommu_enable(dev);
 	ret = of_reserved_mem_device_init(dev);
 	if (ret) {
+		is_mem_reserved = false;
 		if (!hw_dev->is_mmu)
-			dev_warn(dev, "No reserved memory region. default cma area!\n");
+			dev_info(dev, "No reserved memory region. default cma area!\n");
 		else
 			hw_dev->is_dma_contig = false;
 	}
-	if (!hw_dev->is_mmu)
-		hw_dev->mem_ops = &vb2_dma_contig_memops;
-	else if (!hw_dev->is_dma_contig)
-		hw_dev->mem_ops = &vb2_dma_sg_memops;
-	else
+	if (is_mem_reserved) {
+		/* reserved memory using rdma_sg */
 		hw_dev->mem_ops = &vb2_rdma_sg_memops;
+		hw_dev->is_dma_sg_ops = true;
+	} else if (hw_dev->is_mmu) {
+		hw_dev->mem_ops = &vb2_dma_sg_memops;
+		hw_dev->is_dma_sg_ops = true;
+	} else {
+		hw_dev->mem_ops = &vb2_dma_contig_memops;
+	}
 
 	rkispp_register_fec(hw_dev);
 	pm_runtime_enable(&pdev->dev);
diff --git a/drivers/media/platform/rockchip/ispp/hw.h b/drivers/media/platform/rockchip/ispp/hw.h
index 8b79039ce3e8..d750dae270e6 100644
--- a/drivers/media/platform/rockchip/ispp/hw.h
+++ b/drivers/media/platform/rockchip/ispp/hw.h
@@ -59,6 +59,7 @@ struct rkispp_hw_dev {
 	bool is_single;
 	bool is_fec_ext;
 	bool is_dma_contig;
+	bool is_dma_sg_ops;
 	bool is_shutdown;
 	bool is_first;
 };
diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c
index fb2908a78794..c768bbe724ae 100644
--- a/drivers/media/platform/rockchip/ispp/stream.c
+++ b/drivers/media/platform/rockchip/ispp/stream.c
@@ -1505,7 +1505,7 @@ static void rkispp_buf_queue(struct vb2_buffer *vb)
 	memset(isppbuf->buff_addr, 0, sizeof(isppbuf->buff_addr));
 	for (i = 0; i < cap_fmt->mplanes; i++) {
 		vb2_plane_vaddr(vb, i);
-		if (stream->isppdev->hw_dev->is_mmu) {
+		if (stream->isppdev->hw_dev->is_dma_sg_ops) {
 			sgt = vb2_dma_sg_plane_desc(vb, i);
 			isppbuf->buff_addr[i] = sg_dma_address(sgt->sgl);
 		} else {

commit 72e161eacbfcf34cdf1246c6b05cbd8b54e7d49d
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Fri Jun 4 14:03:04 2021 +0800

    media: rockchip: isp: reserved memory using rdma_sg ops
    
    Change-Id: Ia01770c3f54bfbb3d65a73c7db0e8ab8730ab29d
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/capture_v1x.c b/drivers/media/platform/rockchip/isp/capture_v1x.c
index 67fff9c34e60..2230bd24b5d8 100644
--- a/drivers/media/platform/rockchip/isp/capture_v1x.c
+++ b/drivers/media/platform/rockchip/isp/capture_v1x.c
@@ -607,7 +607,7 @@ static void rkisp_buf_queue(struct vb2_buffer *vb)
 	memset(ispbuf->buff_addr, 0, sizeof(ispbuf->buff_addr));
 	for (i = 0; i < isp_fmt->mplanes; i++) {
 		vb2_plane_vaddr(vb, i);
-		if (stream->ispdev->hw_dev->is_mmu) {
+		if (stream->ispdev->hw_dev->is_dma_sg_ops) {
 			sgt = vb2_dma_sg_plane_desc(vb, i);
 			ispbuf->buff_addr[i] = sg_dma_address(sgt->sgl);
 		} else {
diff --git a/drivers/media/platform/rockchip/isp/capture_v20.c b/drivers/media/platform/rockchip/isp/capture_v20.c
index 16cfc6861e8b..5d3cc8c3b154 100644
--- a/drivers/media/platform/rockchip/isp/capture_v20.c
+++ b/drivers/media/platform/rockchip/isp/capture_v20.c
@@ -1671,7 +1671,7 @@ static void rkisp_buf_queue(struct vb2_buffer *vb)
 	memset(ispbuf->buff_addr, 0, sizeof(ispbuf->buff_addr));
 	for (i = 0; i < isp_fmt->mplanes; i++) {
 		vb2_plane_vaddr(vb, i);
-		if (stream->ispdev->hw_dev->is_mmu) {
+		if (stream->ispdev->hw_dev->is_dma_sg_ops) {
 			sgt = vb2_dma_sg_plane_desc(vb, i);
 			ispbuf->buff_addr[i] = sg_dma_address(sgt->sgl);
 		} else {
diff --git a/drivers/media/platform/rockchip/isp/capture_v21.c b/drivers/media/platform/rockchip/isp/capture_v21.c
index e9d8a86c869f..06260f1641e3 100644
--- a/drivers/media/platform/rockchip/isp/capture_v21.c
+++ b/drivers/media/platform/rockchip/isp/capture_v21.c
@@ -970,7 +970,7 @@ static void rkisp_buf_queue(struct vb2_buffer *vb)
 	memset(ispbuf->buff_addr, 0, sizeof(ispbuf->buff_addr));
 	for (i = 0; i < isp_fmt->mplanes; i++) {
 		vb2_plane_vaddr(vb, i);
-		if (stream->ispdev->hw_dev->is_mmu) {
+		if (stream->ispdev->hw_dev->is_dma_sg_ops) {
 			sgt = vb2_dma_sg_plane_desc(vb, i);
 			ispbuf->buff_addr[i] = sg_dma_address(sgt->sgl);
 		} else {
diff --git a/drivers/media/platform/rockchip/isp/common.c b/drivers/media/platform/rockchip/isp/common.c
index f4d641e8e79a..a890fb4480ef 100644
--- a/drivers/media/platform/rockchip/isp/common.c
+++ b/drivers/media/platform/rockchip/isp/common.c
@@ -94,7 +94,7 @@ int rkisp_alloc_buffer(struct rkisp_device *dev,
 	}
 
 	buf->mem_priv = mem_priv;
-	if (dev->hw_dev->is_mmu) {
+	if (dev->hw_dev->is_dma_sg_ops) {
 		sg_tbl = (struct sg_table *)g_ops->cookie(mem_priv);
 		buf->dma_addr = sg_dma_address(sg_tbl->sgl);
 	} else {
diff --git a/drivers/media/platform/rockchip/isp/dmarx.c b/drivers/media/platform/rockchip/isp/dmarx.c
index fabdfb520196..c46007ac12f9 100644
--- a/drivers/media/platform/rockchip/isp/dmarx.c
+++ b/drivers/media/platform/rockchip/isp/dmarx.c
@@ -493,7 +493,7 @@ static void rkisp_buf_queue(struct vb2_buffer *vb)
 
 	memset(ispbuf->buff_addr, 0, sizeof(ispbuf->buff_addr));
 	for (i = 0; i < isp_fmt->mplanes; i++) {
-		if (stream->ispdev->hw_dev->is_mmu) {
+		if (stream->ispdev->hw_dev->is_dma_sg_ops) {
 			sgt = vb2_dma_sg_plane_desc(vb, i);
 			ispbuf->buff_addr[i] = sg_dma_address(sgt->sgl);
 		} else {
diff --git a/drivers/media/platform/rockchip/isp/hw.c b/drivers/media/platform/rockchip/isp/hw.c
index 8bc2c0662044..626d20204b62 100644
--- a/drivers/media/platform/rockchip/isp/hw.c
+++ b/drivers/media/platform/rockchip/isp/hw.c
@@ -647,6 +647,7 @@ static int rkisp_hw_probe(struct platform_device *pdev)
 	struct rkisp_hw_dev *hw_dev;
 	struct resource *res;
 	int i, ret;
+	bool is_mem_reserved = true;
 
 	match = of_match_node(rkisp_hw_of_match, node);
 	if (IS_ERR(match))
@@ -737,22 +738,29 @@ static int rkisp_hw_probe(struct platform_device *pdev)
 	hw_dev->is_single = true;
 	hw_dev->is_mi_update = false;
 	hw_dev->is_dma_contig = true;
+	hw_dev->is_dma_sg_ops = false;
 	hw_dev->is_buf_init = false;
 	hw_dev->is_shutdown = false;
 	hw_dev->is_mmu = is_iommu_enable(dev);
 	ret = of_reserved_mem_device_init(dev);
 	if (ret) {
+		is_mem_reserved = false;
+
 		if (!hw_dev->is_mmu)
-			dev_warn(dev, "No reserved memory region. default cma area!\n");
+			dev_info(dev, "No reserved memory region. default cma area!\n");
 		else
 			hw_dev->is_dma_contig = false;
 	}
-	if (!hw_dev->is_mmu)
-		hw_dev->mem_ops = &vb2_dma_contig_memops;
-	else if (!hw_dev->is_dma_contig)
-		hw_dev->mem_ops = &vb2_dma_sg_memops;
-	else
+	if (is_mem_reserved) {
+		/* reserved memory using rdma_sg */
 		hw_dev->mem_ops = &vb2_rdma_sg_memops;
+		hw_dev->is_dma_sg_ops = true;
+	} else if (hw_dev->is_mmu) {
+		hw_dev->mem_ops = &vb2_dma_sg_memops;
+		hw_dev->is_dma_sg_ops = true;
+	} else {
+		hw_dev->mem_ops = &vb2_dma_contig_memops;
+	}
 
 	pm_runtime_enable(dev);
 
diff --git a/drivers/media/platform/rockchip/isp/hw.h b/drivers/media/platform/rockchip/isp/hw.h
index 80ed119081db..8b34e203bd6a 100644
--- a/drivers/media/platform/rockchip/isp/hw.h
+++ b/drivers/media/platform/rockchip/isp/hw.h
@@ -71,6 +71,7 @@ struct rkisp_hw_dev {
 	int buf_init_cnt;
 	bool is_feature_on;
 	bool is_dma_contig;
+	bool is_dma_sg_ops;
 	bool is_mmu;
 	bool is_idle;
 	bool is_single;

commit 78c5b7ae9fcd37dd6ea7423a2a1808ea19d72124
Author: William Wu <william.wu@rock-chips.com>
Date:   Mon May 31 12:48:28 2021 +0800

    usb: dwc3: gadget: fix XferInProgress event for isoc ep
    
    On XferInProgress events, if the endpoint is isochronous
    type, do not kick transfer directly even if the pending_list
    isn't empty. Because it needs to wait for XferNotReady
    event to start isoc transfer. Without this patch, it will
    trigger a large number of unuseful XferInProgress events,
    and easily cause loss of synchronization data if the cpu
    core unable to handle the dwc3 thread interrupt in time.
    
    Fixes: b77df211071a ("usb: dwc3: gadget: Continue to process pending requests")
    Change-Id: I14d16240a6e10db466fd9822b4fdc35d79817508
    Signed-off-by: William Wu <william.wu@rock-chips.com>

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index eec38152ed3e..c09eb92aca05 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -2922,7 +2922,8 @@ static void dwc3_gadget_endpoint_transfer_in_progress(struct dwc3_ep *dep,
 	if (event->status & DEPEVT_STATUS_MISSED_ISOC &&
 	    list_empty(&dep->started_list))
 		dwc3_stop_active_transfer(dep, true, true);
-	else if (dwc3_gadget_ep_should_continue(dep))
+	else if (!usb_endpoint_xfer_isoc(dep->endpoint.desc) &&
+		 dwc3_gadget_ep_should_continue(dep))
 		__dwc3_gadget_kick_transfer(dep);
 
 	/*

commit b6d806aab12f93a6ed03183af2d70705d912afb8
Author: Yiqing Zeng <zack.zeng@rock-chips.com>
Date:   Fri Jun 4 17:29:00 2021 +0800

    media: i2c: imx178 fix some errors for exposure and gain
    
    1.fix vts_def/hts_def wrong value;
    2.fix gain wrong value;
    
    Signed-off-by: Yiqing Zeng <zack.zeng@rock-chips.com>
    Change-Id: I9e0d8b403eb57b4e031ef87179c5dc327628ed9b

diff --git a/drivers/media/i2c/imx178.c b/drivers/media/i2c/imx178.c
index 51ceb539eba2..509dcee519a9 100644
--- a/drivers/media/i2c/imx178.c
+++ b/drivers/media/i2c/imx178.c
@@ -5,9 +5,12 @@
  * Copyright (C) 2020 Rockchip Electronics Co., Ltd.
  *
  * V0.0X01.0X00 first version.
+ * V0.0X01.0X01 fix some errors for exposure and gain.
+ * 1.fix vts_def/hts_def wrong value;
+ * 2.fix gain wrong value;
  */
 
-#define DEBUG
+//#define DEBUG
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/gpio/consumer.h>
@@ -28,15 +31,15 @@
 #include <media/v4l2-fwnode.h>
 #include <media/v4l2-subdev.h>
 
-#define DRIVER_VERSION		KERNEL_VERSION(0, 0x01, 0x00)
+#define DRIVER_VERSION		KERNEL_VERSION(0, 0x01, 0x01)
 
 #define OF_CAMERA_PINCTRL_STATE_DEFAULT	"rockchip,camera_default"
 #define OF_CAMERA_PINCTRL_STATE_SLEEP	"rockchip,camera_sleep"
 
 #define IMX178_NAME				"imx178"
 #define IMX178_MEDIA_BUS_FMT	MEDIA_BUS_FMT_SRGGB10_1X10
-#define MIPI_FREQ				594000000 // w*h*fps*bits_per_pixel/lanes/2
-#define IMX178_XVCLK_FREQ		19500000
+#define MIPI_FREQ				594000000
+#define IMX178_XVCLK_FREQ		37125000
 #define BITS_PER_SAMPLE			10
 
 #define IMX178_REG_CHIP_ID		0x33be
@@ -61,14 +64,16 @@
 #define IMX178_MODE_SW_STANDBY	0x0
 #define IMX178_MODE_STREAMING	1
 
-#define IMX178_REG_HOLD			0x3007
+#define IMX178_REG_HOLD		0x3007
+#define IMX178_REG_HOLD_START	0x01
+#define IMX178_REG_HOLD_LUNCH	0X00
 
-#define IMX178_REG_VMAX_H	0x302e  //vmax
-#define IMX178_REG_VMAX_M   0x302d
+#define IMX178_REG_VMAX_H	0x302e
+#define IMX178_REG_VMAX_M	0x302d
 #define IMX178_REG_VMAX_L	0x302c
 
 #define IMX178_VTS_MAX		0x3FFF
-#define IMX178_HTS_MAX		0xFFF
+#define IMX178_HTS_MAX		0x0FFF
 
 #define IMX178_EXPOSURE_NORMAL_MAX  0x118A
 #define IMX178_EXPOSURE_NORMAL_MIN  3
@@ -132,8 +137,6 @@ struct imx178 {
 	struct v4l2_ctrl    *anal_gain;
 	struct v4l2_ctrl    *hblank;
 	struct v4l2_ctrl    *vblank;
-	struct v4l2_ctrl    *h_flip;
-	struct v4l2_ctrl    *v_flip;
 	struct v4l2_ctrl    *link_freq;
 	struct v4l2_ctrl    *pixel_rate;
 	struct mutex        lock;
@@ -145,7 +148,7 @@ struct imx178 {
 	const char      *module_facing;
 	const char      *module_name;
 	const char      *len_name;
-	bool			  has_init_exp;
+	bool		has_init_exp;
 	u32		cur_vts;
 };
 
@@ -160,9 +163,9 @@ static const s64 link_freq_menu_items[] = {
 };
 
 /*
- * window size=3840*2160 mipi@4lane
- * mclk=27M mipi_clk=708.75Mbps
- * pixel_line_total=xxxx line_frame_total=2256
+ * window size=3072*1728 mipi@4lane
+ * mclk=37.125M mipi_clk=708.75Mbps
+ * pixel_line_total=999 line_frame_total=2500
  * row_time=29.62us frame_rate=30fps
  */
 static const struct reg_sequence imx178_3072_1728_liner_30fps_settings[] = {
@@ -282,9 +285,9 @@ static const struct imx178_mode supported_modes[] = {
 			.numerator = 10000,
 			.denominator = 300000,
 		},
-		.exp_def = 0x6ee - 0x8,
-		.hts_def = 0xc18,
-		.vts_def = 0x6ee,
+		.exp_def = 0x0008,
+		.hts_def = 0x03de * 4,
+		.vts_def = 0x09c4,
 		.link_freq_index = LINK_FREQ_INDEX,
 		.reg_list = imx178_3072_1728_liner_30fps_settings,
 		.reg_num = ARRAY_SIZE(imx178_3072_1728_liner_30fps_settings),
@@ -345,19 +348,18 @@ static inline int imx178_write_reg(struct imx178 *imx178, u16 addr, u8 value)
 static int imx178_set_ctrl(struct v4l2_ctrl *ctrl)
 {
 	struct imx178 *imx178 = container_of(ctrl->handler,
-							struct imx178, ctrl_handler);
+					     struct imx178, ctrl_handler);
 	const struct imx178_mode *mode = imx178->cur_mode;
 	s64 max;
 	int ret = 0;
 	u8 val = 0;
-	u32 vts = 0;
-	u32 shr0 = 0;
+	u32 vts = 0, shr0 = 0, again = 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 = mode->height + ctrl->val - 4;
+		max = mode->height + ctrl->val;
 		__v4l2_ctrl_modify_range(imx178->exposure,
 					 imx178->exposure->minimum, max,
 					 imx178->exposure->step,
@@ -370,42 +372,38 @@ static int imx178_set_ctrl(struct v4l2_ctrl *ctrl)
 
 	switch (ctrl->id) {
 	case V4L2_CID_EXPOSURE:
+		dev_info(imx178->dev, "set exposure 0x%x", ctrl->val);
 		shr0 = imx178->cur_vts - ctrl->val;
-		ret  = imx178_write_reg(imx178, IMX178_REG_HOLD, 0x01);
-		ret |= imx178_write_reg(imx178, IMX178_REG_SHS_H,
-			(shr0 >> 16) & 0x1);
-		ret |= imx178_write_reg(imx178, IMX178_REG_SHS_M,
-			(shr0 >> 8) & 0xff);
-		ret |= imx178_write_reg(imx178, IMX178_REG_SHS_L,
-			(shr0 & 0xff));
-		ret |= imx178_write_reg(imx178, IMX178_REG_HOLD, 0x00);
+		ret  = imx178_write_reg(imx178, IMX178_REG_HOLD, IMX178_REG_HOLD_START);
+		ret |= imx178_write_reg(imx178, IMX178_REG_SHS_H, (shr0 >> 16) & 0x1);
+		ret |= imx178_write_reg(imx178, IMX178_REG_SHS_M, (shr0 >> 8) & 0xff);
+		ret |= imx178_write_reg(imx178, IMX178_REG_SHS_L, (shr0 & 0xff));
+		ret |= imx178_write_reg(imx178, IMX178_REG_HOLD, IMX178_REG_HOLD_LUNCH);
 		break;
 	case V4L2_CID_ANALOGUE_GAIN:
-		ret  = imx178_write_reg(imx178, IMX178_REG_HOLD, 0x01);
-		ret |= imx178_write_reg(imx178, IMX178_GAIN_REG_H,
-			(ctrl->val >> 8) & 0x01);
-		ret |= imx178_write_reg(imx178, IMX178_GAIN_REG_L,
-			ctrl->val & 0xff);
-		ret |= imx178_write_reg(imx178, IMX178_REG_HOLD, 0x00);
+		dev_info(imx178->dev, "set anal_gain 0x%x", ctrl->val);
+		again = ctrl->val * 3;
+		ret  = imx178_write_reg(imx178, IMX178_REG_HOLD, IMX178_REG_HOLD_START);
+		ret |= imx178_write_reg(imx178, IMX178_GAIN_REG_H, (again >> 8) & 0x01);
+		ret |= imx178_write_reg(imx178, IMX178_GAIN_REG_L, again & 0xff);
+		ret |= imx178_write_reg(imx178, IMX178_REG_HOLD, IMX178_REG_HOLD_LUNCH);
 		break;
 	case V4L2_CID_VBLANK:
+		dev_info(imx178->dev, "set vblank 0x%x", ctrl->val);
 		vts = ctrl->val + mode->height;
-		ret = imx178_write_reg(imx178, IMX178_REG_VMAX_H,
-			vts >> 16);
-		ret |= imx178_write_reg(imx178, IMX178_REG_VMAX_M,
-			vts >> 8);
-		ret |= imx178_write_reg(imx178, IMX178_REG_VMAX_L,
-			vts & 0xff);
+		ret = imx178_write_reg(imx178, IMX178_REG_VMAX_H, vts >> 16);
+		ret |= imx178_write_reg(imx178, IMX178_REG_VMAX_M, vts >> 8);
+		ret |= imx178_write_reg(imx178, IMX178_REG_VMAX_L, vts & 0xff);
 		break;
 	case V4L2_CID_HFLIP:
 		ret = imx178_read_reg(imx178, IMX178_REG_MIRROR_FLIP, &val);
 		ret |= imx178_write_reg(imx178, IMX178_REG_MIRROR_FLIP,
-			IMX178_FETCH_MIRROR(val, ctrl->val));
+					IMX178_FETCH_MIRROR(val, ctrl->val));
 		break;
 	case V4L2_CID_VFLIP:
 		ret = imx178_read_reg(imx178, IMX178_REG_MIRROR_FLIP, &val);
 		ret |= imx178_write_reg(imx178, IMX178_REG_MIRROR_FLIP,
-			IMX178_FETCH_FLIP(val, ctrl->val));
+					IMX178_FETCH_FLIP(val, ctrl->val));
 		break;
 	default:
 		dev_warn(imx178->dev, "%s Unhandled id:0x%x, val:0x%x\n",
@@ -448,35 +446,35 @@ static int imx178_initialize_controls(struct imx178 *imx178)
 
 	handler->lock = &imx178->lock;
 	imx178->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, V4L2_CID_LINK_FREQ,
-						  ARRAY_SIZE(link_freq_menu_items) - 1, 0,
-						  link_freq_menu_items);
+						   ARRAY_SIZE(link_freq_menu_items) - 1, 0,
+						   link_freq_menu_items);
 	imx178->pixel_rate = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE,
-					      0, to_pixel_rate(LINK_FREQ_INDEX),
-					      1, to_pixel_rate(LINK_FREQ_INDEX));
+					       0, to_pixel_rate(LINK_FREQ_INDEX),
+					       1, to_pixel_rate(LINK_FREQ_INDEX));
 	h_blank = mode->hts_def - mode->width;
 	imx178->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
-					  h_blank, h_blank, 1, h_blank);
+					   h_blank, h_blank, 1, h_blank);
 	if (imx178->hblank)
 		imx178->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
 	vblank_def = mode->vts_def - mode->height;
 	imx178->vblank = v4l2_ctrl_new_std(handler, &imx178_ctrl_ops,
-					  V4L2_CID_VBLANK, vblank_def,
-					  IMX178_VTS_MAX - mode->height,
-					  1, vblank_def);
+					   V4L2_CID_VBLANK, vblank_def,
+					   IMX178_VTS_MAX - mode->height,
+					   1, vblank_def);
 	imx178->cur_vts = mode->vts_def;
 	exposure_max =  mode->vts_def - 1;
 	imx178->exposure = v4l2_ctrl_new_std(handler, &imx178_ctrl_ops,
-					    V4L2_CID_EXPOSURE, IMX178_EXPOSURE_NORMAL_MIN,
-					    exposure_max, IMX178_EXPOSURE_NORMAL_STEP,
-					    mode->exp_def);
+					     V4L2_CID_EXPOSURE, IMX178_EXPOSURE_NORMAL_MIN,
+					     exposure_max, IMX178_EXPOSURE_NORMAL_STEP,
+					     mode->exp_def);
 	imx178->anal_gain = v4l2_ctrl_new_std(handler, &imx178_ctrl_ops,
-					     V4L2_CID_ANALOGUE_GAIN, IMX178_GAIN_MIN,
-					     IMX178_GAIN_MAX, IMX178_GAIN_STEP,
-					     IMX178_GAIN_DEFAULT);
-	imx178->h_flip = v4l2_ctrl_new_std(handler, &imx178_ctrl_ops,
-					  V4L2_CID_HFLIP, 0, 1, 1, 0);
-	imx178->v_flip = v4l2_ctrl_new_std(handler, &imx178_ctrl_ops,
-					  V4L2_CID_VFLIP, 0, 1, 1, 0);
+					      V4L2_CID_ANALOGUE_GAIN, IMX178_GAIN_MIN,
+					      IMX178_GAIN_MAX, IMX178_GAIN_STEP,
+					      IMX178_GAIN_DEFAULT);
+	v4l2_ctrl_new_std(handler, &imx178_ctrl_ops,
+			  V4L2_CID_HFLIP, 0, 1, 1, 0);
+	v4l2_ctrl_new_std(handler, &imx178_ctrl_ops,
+			  V4L2_CID_VFLIP, 0, 1, 1, 0);
 	if (handler->error) {
 		ret = handler->error;
 		dev_err(imx178->dev, "Failed to init controls(%d)\n", ret);
@@ -590,6 +588,11 @@ static long imx178_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 		hdr_cfg->esp.mode = HDR_NORMAL_VC;
 		hdr_cfg->hdr_mode = imx178->cur_mode->hdr_mode;
 		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr_cfg = (struct rkmodule_hdr_cfg *)arg;
+		if (hdr_cfg->hdr_mode != 0)
+			ret = -1;
+		break;
 	case RKMODULE_GET_MODULE_INFO:
 		imx178_get_module_inf(imx178, (struct rkmodule_inf *)arg);
 		break;
@@ -652,9 +655,13 @@ static long imx178_compat_ioctl32(struct v4l2_subdev *sd,
 			ret = -ENOMEM;
 			return ret;
 		}
+
 		ret = imx178_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_GET_HDR_CFG:
@@ -663,9 +670,26 @@ static long imx178_compat_ioctl32(struct v4l2_subdev *sd,
 			ret = -ENOMEM;
 			return ret;
 		}
+
 		ret = imx178_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:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		if (copy_from_user(hdr, up, sizeof(*hdr)))
+			return -EFAULT;
+
+		ret = imx178_ioctl(sd, cmd, hdr);
 		kfree(hdr);
 		break;
 	case RKMODULE_GET_LVDS_CFG:
@@ -674,9 +698,13 @@ static long imx178_compat_ioctl32(struct v4l2_subdev *sd,
 			ret = -ENOMEM;
 			return ret;
 		}
+
 		ret = imx178_ioctl(sd, cmd, lvds_cfg);
-		if (!ret)
+		if (!ret) {
 			ret = copy_to_user(up, lvds_cfg, sizeof(*lvds_cfg));
+			if (ret)
+				ret = -EFAULT;
+		}
 		kfree(lvds_cfg);
 		break;
 	default:
@@ -772,8 +800,8 @@ static int imx178_enum_frame_sizes(struct v4l2_subdev *sd,
 }
 
 static int imx178_enum_frame_interval(struct v4l2_subdev *sd,
-						  struct v4l2_subdev_pad_config *cfg,
-						  struct v4l2_subdev_frame_interval_enum *fie)
+				      struct v4l2_subdev_pad_config *cfg,
+				      struct v4l2_subdev_frame_interval_enum *fie)
 {
 	struct imx178 *imx178 = to_imx178(sd);
 
@@ -976,7 +1004,7 @@ static const struct dev_pm_ops imx178_pm_ops = {
 };
 
 static int imx178_probe(struct i2c_client *client,
-			 const struct i2c_device_id *id)
+			const struct i2c_device_id *id)
 {
 	struct device *dev = &client->dev;
 	struct device_node *node = dev->of_node;
@@ -1157,5 +1185,5 @@ static void __exit sensor_mod_exit(void)
 device_initcall_sync(sensor_mod_init);
 module_exit(sensor_mod_exit);
 
-MODULE_DESCRIPTION("Smartsens imx178 Image Sensor Driver");
+MODULE_DESCRIPTION("Sony imx178 Image Sensor Driver");
 MODULE_LICENSE("GPL v2");

commit 73444eb25e93cff4b441de8f6f1aa469812bbb26
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Wed Jun 2 11:04:45 2021 +0800

    drm/rockchip: vop2: Support set background color from userspace
    
    Add a BACKGROUND property for each crtc.
    8 bit for every color channel(r/g/b/y/u/v).
    
    Change-Id: I9439bf16a8142e936508e843cc25b6263e2f661d
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h
index cfe406457e1b..4c8036a74606 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h
@@ -145,6 +145,7 @@ struct rockchip_crtc_state {
 	int bcsh_en;
 	int color_space;
 	int eotf;
+	u32 background;
 	u8 mode_update;
 	struct rockchip_hdr_state hdr;
 };
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index b74c392a9069..332840a29da0 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -140,7 +140,6 @@
 #define VOP2_COLOR_KEY_NONE		(0 << 31)
 #define VOP2_COLOR_KEY_MASK		(1 << 31)
 
-
 enum vop2_data_format {
 	VOP2_FMT_ARGB8888 = 0,
 	VOP2_FMT_RGB888,
@@ -537,6 +536,7 @@ struct vop2 {
 	struct drm_property *soc_id_prop;
 	struct drm_property *vp_id_prop;
 	struct drm_property *aclk_prop;
+	struct drm_property *bg_prop;
 	struct drm_prop_enum_list *plane_name_list;
 	bool is_iommu_enabled;
 	bool is_iommu_needed;
@@ -5065,15 +5065,30 @@ static void vop2_cfg_update(struct drm_crtc *crtc,
 	struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(crtc->state);
 	struct vop2 *vop2 = vp->vop2;
 	uint32_t val;
+	uint32_t r, g, b;
 
 	spin_lock(&vop2->reg_lock);
 
 	VOP_MODULE_SET(vop2, vp, overlay_mode, vcstate->yuv_overlay);
 
-	if (vcstate->yuv_overlay)
-		val = 0x20010200;
-	else
-		val = 0;
+	/*
+	 * userspace specified background.
+	 */
+	if (vcstate->background) {
+		r = (vcstate->background & 0xff0000) >> 16;
+		g = (vcstate->background & 0xff00) >> 8;
+		b = (vcstate->background & 0xff);
+		r <<= 2;
+		g <<= 2;
+		b <<= 2;
+		val = (r << 20) | (g << 10) | b;
+	} else {
+		if (vcstate->yuv_overlay)
+			val = 0x20010200;
+		else
+			val = 0;
+	}
+
 	VOP_MODULE_SET(vop2, vp, dsp_background, val);
 
 	vop2_tv_config_update(crtc, old_crtc_state);
@@ -5204,6 +5219,7 @@ static void vop2_crtc_reset(struct drm_crtc *crtc)
 	vcstate->right_margin = 100;
 	vcstate->top_margin = 100;
 	vcstate->bottom_margin = 100;
+	vcstate->background = 0;
 }
 
 static struct drm_crtc_state *vop2_crtc_duplicate_state(struct drm_crtc *crtc)
@@ -5336,7 +5352,14 @@ static int vop2_crtc_atomic_get_property(struct drm_crtc *crtc,
 		return 0;
 	}
 
-	DRM_ERROR("failed to get vop2 crtc property\n");
+
+	if (property == vop2->bg_prop) {
+		*val = vcstate->background;
+		return 0;
+	}
+
+	DRM_ERROR("failed to get vop2 crtc property: %s\n", property->name);
+
 	return -EINVAL;
 }
 
@@ -5346,8 +5369,10 @@ static int vop2_crtc_atomic_set_property(struct drm_crtc *crtc,
 					 uint64_t val)
 {
 	struct drm_device *drm_dev = crtc->dev;
-	struct drm_mode_config *mode_config = &drm_dev->mode_config;
 	struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(state);
+	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;
 
 	if (property == mode_config->tv_left_margin_property) {
 		vcstate->left_margin = val;
@@ -5369,7 +5394,14 @@ static int vop2_crtc_atomic_set_property(struct drm_crtc *crtc,
 		return 0;
 	}
 
-	DRM_ERROR("failed to set vop2 crtc property\n");
+
+	if (property == vop2->bg_prop) {
+		vcstate->background = val;
+		return 0;
+	}
+
+	DRM_ERROR("failed to set vop2 crtc property %s\n", property->name);
+
 	return -EINVAL;
 }
 
@@ -5941,6 +5973,7 @@ static int vop2_create_crtc(struct vop2 *vop2)
 		drm_object_attach_property(&crtc->base, vop2->soc_id_prop, soc_id);
 		drm_object_attach_property(&crtc->base, vop2->vp_id_prop, vp->id);
 		drm_object_attach_property(&crtc->base, vop2->aclk_prop, 0);
+		drm_object_attach_property(&crtc->base, vop2->bg_prop, 0);
 		drm_object_attach_property(&crtc->base,
 					   drm_dev->mode_config.tv_left_margin_property, 100);
 		drm_object_attach_property(&crtc->base,
@@ -6119,8 +6152,9 @@ static int vop2_win_init(struct vop2 *vop2)
 	vop2->vp_id_prop = prop;
 
 	vop2->aclk_prop = drm_property_create_range(vop2->drm_dev, 0, "ACLK", 0, UINT_MAX);
+	vop2->bg_prop = drm_property_create_range(vop2->drm_dev, 0, "BACKGROUND", 0, UINT_MAX);
 
-	if (!vop2->soc_id_prop || !vop2->vp_id_prop || !vop2->aclk_prop) {
+	if (!vop2->soc_id_prop || !vop2->vp_id_prop || !vop2->aclk_prop || !vop2->bg_prop) {
 		DRM_DEV_ERROR(vop2->dev, "failed to create soc_id/vp_id/aclk property\n");
 		return -ENOMEM;
 	}

commit cd98dfb7fd13324ccf0a7d0b86e709fd4c05b787
Author: Zhichao Yu <zhichao.yu@rock-chips.com>
Date:   Mon May 10 19:11:29 2021 +0800

    media: i2c: support imx462 sensor driver
    
    1.support mipi 1080P@30fps linear/hdr2 dol mode
    2.support lvds 1080P@60fps linear mode and 1080P@30fps hdr2 dol mode
    
    Change-Id: Ic2cce1f9119cf27685c35c99993bb1c82bd3838a
    Signed-off-by: Zhichao Yu <zhichao.yu@rock-chips.com>
    Signed-off-by: Yiqing Zeng <zack.zeng@rock-chips.com>

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index 34e550943edf..df20137abd29 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -801,6 +801,17 @@ config VIDEO_IMX415
 	  To compile this driver as a module, choose M here: the
 	  module will be called imx415.
 
+config VIDEO_IMX462
+	tristate "Sony IMX462 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
+	  IMX462 camera.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called imx462.
+
 config VIDEO_IMX464
 	tristate "Sony IMX464 sensor support"
 	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index 1b83f21eb16f..532f117536bc 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -156,6 +156,7 @@ obj-$(CONFIG_VIDEO_IMX335)	+= imx335.o
 obj-$(CONFIG_VIDEO_IMX347)	+= imx347.o
 obj-$(CONFIG_VIDEO_IMX378)	+= imx378.o
 obj-$(CONFIG_VIDEO_IMX415)	+= imx415.o
+obj-$(CONFIG_VIDEO_IMX462)	+= imx462.o
 obj-$(CONFIG_VIDEO_IMX464)	+= imx464.o
 obj-$(CONFIG_VIDEO_GC02M2)	+= gc02m2.o
 obj-$(CONFIG_VIDEO_GC0312)	+= gc0312.o
diff --git a/drivers/media/i2c/imx462.c b/drivers/media/i2c/imx462.c
new file mode 100644
index 000000000000..5cf58f94e811
--- /dev/null
+++ b/drivers/media/i2c/imx462.c
@@ -0,0 +1,2160 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * imx462 driver
+ *
+ * Copyright (C) 2020 Rockchip Electronics Co., Ltd.
+ * v1.0x01.0x00 first version
+ */
+
+//#define DEBUG
+#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 <linux/of_graph.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>
+
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x00)
+#ifndef V4L2_CID_DIGITAL_GAIN
+#define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
+#endif
+
+#define IMX462_LINK_FREQ_111M		111370000
+#define IMX462_LINK_FREQ_222M		222750000
+#define IMX462_2LANES			2
+#define IMX462_4LANES			4
+#define IMX462_BITS_PER_SAMPLE		10
+
+/* pixel rate = link frequency * 2 * lanes / BITS_PER_SAMPLE */
+#define IMX462_PIXEL_RATE_NORMAL (IMX462_LINK_FREQ_222M * 2 / 10 * IMX462_4LANES)
+#define IMX462_PIXEL_RATE_HDR (IMX462_LINK_FREQ_222M * 2 / 10 * IMX462_4LANES)
+
+#define IMX462_XVCLK_FREQ		37125000
+
+#define CHIP_ID				0xb2
+#define IMX462_REG_CHIP_ID		0x301e
+
+#define IMX462_REG_CTRL_MODE		0x3000
+#define IMX462_MODE_SW_STANDBY		0x1
+#define IMX462_MODE_STREAMING		0x0
+
+#define IMX462_REG_SHS1_H		0x3022
+#define IMX462_REG_SHS1_M		0x3021
+#define IMX462_REG_SHS1_L		0x3020
+
+#define IMX462_REG_SHS2_H		0x3026
+#define IMX462_REG_SHS2_M		0x3025
+#define IMX462_REG_SHS2_L		0x3024
+
+#define IMX462_REG_RHS1_H		0x3032 //readout time
+#define IMX462_REG_RHS1_M		0x3031
+#define IMX462_REG_RHS1_L		0x3030
+
+#define IMX462_FETCH_HIGH_BYTE_EXP(VAL)	(((VAL) >> 16) & 0x0F)
+#define IMX462_FETCH_MID_BYTE_EXP(VAL)	(((VAL) >> 8) & 0xFF)
+#define IMX462_FETCH_LOW_BYTE_EXP(VAL)	((VAL) & 0xFF)
+
+#define	IMX462_EXPOSURE_MIN		2
+#define	IMX462_EXPOSURE_STEP		1
+#define IMX462_VTS_MAX			0x7fff
+
+#define IMX462_GAIN_SWITCH_REG		0x3009
+#define IMX462_REG_LF_GAIN		0x3014
+#define IMX462_REG_SF_GAIN		0x30f2
+
+#define IMX462_GAIN_MIN			0x00
+#define IMX462_GAIN_MAX			0xee
+#define IMX462_GAIN_STEP		1
+#define IMX462_GAIN_DEFAULT		0x00
+
+#define IMX462_GROUP_HOLD_REG		0x3001
+#define IMX462_GROUP_HOLD_START		0x01
+#define IMX462_GROUP_HOLD_END		0x00
+
+#define USED_TEST_PATTERN
+#ifdef USED_TEST_PATTERN
+#define IMX462_REG_TEST_PATTERN		0x308c
+#define	IMX462_TEST_PATTERN_ENABLE	BIT(0)
+#endif
+
+#define IMX462_REG_VTS_H		0x301a
+#define IMX462_REG_VTS_M		0x3019
+#define IMX462_REG_VTS_L		0x3018
+#define IMX462_FETCH_HIGH_BYTE_VTS(VAL)	(((VAL) >> 16) & 0x03)
+#define IMX462_FETCH_MID_BYTE_VTS(VAL)	(((VAL) >> 8) & 0xFF)
+#define IMX462_FETCH_LOW_BYTE_VTS(VAL)	((VAL) & 0xFF)
+
+#define REG_NULL			0xFFFF
+#define REG_DELAY			0xFFFE
+
+#define IMX462_REG_VALUE_08BIT		1
+#define IMX462_REG_VALUE_16BIT		2
+#define IMX462_REG_VALUE_24BIT		3
+
+static bool g_isHCG;
+
+#define IMX462_NAME			"imx462"
+
+#define OF_CAMERA_PINCTRL_STATE_DEFAULT	"rockchip,camera_default"
+#define OF_CAMERA_PINCTRL_STATE_SLEEP	"rockchip,camera_sleep"
+
+#define IMX462_FLIP_REG			0x3007
+#define MIRROR_BIT_MASK			BIT(1)
+#define FLIP_BIT_MASK			BIT(0)
+
+static const char * const imx462_supply_names[] = {
+	"avdd",		/* Analog power */
+	"dovdd",	/* Digital I/O power */
+	"dvdd",		/* Digital core power */
+};
+
+#define IMX462_NUM_SUPPLIES ARRAY_SIZE(imx462_supply_names)
+
+struct regval {
+	u16 addr;
+	u8 val;
+};
+
+struct imx462_mode {
+	u32 bus_fmt;
+	u32 width;
+	u32 height;
+	struct v4l2_fract max_fps;
+	u32 hts_def;
+	u32 vts_def;
+	u32 exp_def;
+	const struct regval *reg_list;
+	u32 hdr_mode;
+	struct rkmodule_lvds_cfg lvds_cfg;
+};
+
+struct imx462 {
+	struct i2c_client	*client;
+	struct clk		*xvclk;
+	struct gpio_desc	*reset_gpio;
+	struct gpio_desc	*pwdn_gpio;
+	struct regulator_bulk_data supplies[IMX462_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;
+#ifdef USED_TEST_PATTERN
+	struct v4l2_ctrl	*test_pattern;
+#endif
+	struct mutex		mutex;
+	bool			streaming;
+	bool			power_on;
+	const struct imx462_mode *support_modes;
+	u32			support_modes_num;
+	const struct imx462_mode *cur_mode;
+	u32			module_index;
+	const char		*module_facing;
+	const char		*module_name;
+	const char		*len_name;
+	u32			cur_vts;
+	bool			has_init_exp;
+	struct preisp_hdrae_exp_s init_hdrae_exp;
+	struct v4l2_fwnode_endpoint bus_cfg;
+	u8			flip;
+};
+
+#define to_imx462(sd) container_of(sd, struct imx462, subdev)
+
+/*
+ * Xclk 37.125Mhz
+ */
+static const struct regval imx462_global_regs[] = {
+	{REG_NULL, 0x00},
+};
+
+/*
+ * Xclk 37.125Mhz
+ * max_framerate 60fps
+ * lvds_datarate per lane 445.5Mbps 4 lane
+ */
+static const struct regval imx462_linear_1920x1080_60fps_lvds_regs[] = {
+	{0x3003, 0x01},
+	{REG_DELAY, 0x10},
+	{0x3000, 0x01},
+	{0x3001, 0x00},
+	{0x3002, 0x01},
+	{0x3005, 0x00},
+	{0x3009, 0x01},
+	{0x300A, 0x3C},
+	{0x300F, 0x00},
+	{0x3010, 0x21},
+	{0x3011, 0x02},
+	{0x3012, 0x64},
+	{0x3016, 0x09},
+	{0x301C, 0x98},
+	{0x301D, 0x08},
+	{0x3020, 0x02},
+	{0x3046, 0xE0},
+	{0x305C, 0x18},
+	{0x305E, 0x20},
+	{0x3070, 0x02},
+	{0x3071, 0x11},
+	{0x309B, 0x10},
+	{0x309C, 0x21},
+	{0x30A2, 0x02},
+	{0x30A6, 0x20},
+	{0x30A8, 0x20},
+	{0x30AA, 0x20},
+	{0x30AC, 0x20},
+	{0x30B0, 0x43},
+	{0x3119, 0x9E},
+	{0x311C, 0x1E},
+	{0x311E, 0x08},
+	{0x3128, 0x05},
+	{0x3129, 0x1D},
+	{0x313D, 0x83},
+	{0x3150, 0x03},
+	{0x315E, 0x1A},
+	{0x3164, 0x1A},
+	{0x317C, 0x12},
+	{0x317E, 0x00},
+	{0x31EC, 0x37},
+	{0x3257, 0x03},
+	{0x3264, 0x1A},
+	{0x3265, 0xB0},
+	{0x3266, 0x02},
+	{0x326B, 0x10},
+	{0x3274, 0x1B},
+	{0x3275, 0xA0},
+	{0x3276, 0x02},
+	{0x32B8, 0x50},
+	{0x32B9, 0x10},
+	{0x32BA, 0x00},
+	{0x32BB, 0x04},
+	{0x32C8, 0x50},
+	{0x32C9, 0x10},
+	{0x32CA, 0x00},
+	{0x32CB, 0x04},
+	{0x332C, 0xD3},
+	{0x332D, 0x10},
+	{0x332E, 0x0D},
+	{0x3358, 0x06},
+	{0x3359, 0xE1},
+	{0x335A, 0x11},
+	{0x3360, 0x1E},
+	{0x3361, 0x61},
+	{0x3362, 0x10},
+	{0x33B0, 0x50},
+	{0x33B2, 0x1A},
+	{0x33B3, 0x04},
+	{0x3480, 0x49},
+	{0x3002, 0x00},
+	{REG_NULL, 0x00},
+};
+
+/*
+ * Xclk 37.125Mhz
+ * max_framerate 30fps
+ * lvds_datarate per lane 445.5Mbps 4 lane
+ */
+static const struct regval imx462_hdr2_1920x1080_lvds_regs[] = {
+	{0x3003, 0x01},
+	{REG_DELAY, 0x10},
+	{0x3000, 0x01},
+	{0x3001, 0x00},
+	{0x3002, 0x01},
+	{0x3005, 0x00},
+	{0x3009, 0x01},
+	{0x300A, 0x3C},
+	{0x300C, 0x11},
+	{0x300F, 0x00},
+	{0x3010, 0x21},
+	{0x3011, 0x02},
+	{0x3012, 0x64},
+	{0x3016, 0x09},
+	{0x301C, 0x98},
+	{0x301D, 0x08},
+	{0x3020, 0x02},
+	{0x3024, 0xE1},
+	{0x3030, 0x09},
+	{0x3045, 0x03},
+	{0x3046, 0xE0},
+	{0x305C, 0x18},
+	{0x305E, 0x20},
+	{0x3070, 0x02},
+	{0x3071, 0x11},
+	{0x309B, 0x10},
+	{0x309C, 0x21},
+	{0x30A2, 0x02},
+	{0x30A6, 0x20},
+	{0x30A8, 0x20},
+	{0x30AA, 0x20},
+	{0x30AC, 0x20},
+	{0x30B0, 0x43},
+	{0x3106, 0x91},
+	{0x3119, 0x9E},
+	{0x311C, 0x1E},
+	{0x311E, 0x08},
+	{0x3128, 0x05},
+	{0x3129, 0x1D},
+	{0x313D, 0x83},
+	{0x3150, 0x03},
+	{0x315E, 0x1A},
+	{0x3164, 0x1A},
+	{0x31A0, 0xB4},
+	{0x31A1, 0x02},
+	{0x317C, 0x12},
+	{0x317E, 0x00},
+	{0x31EC, 0x37},
+	{0x3257, 0x03},
+	{0x3264, 0x1A},
+	{0x3265, 0xB0},
+	{0x3266, 0x02},
+	{0x326B, 0x10},
+	{0x3274, 0x1B},
+	{0x3275, 0xA0},
+	{0x3276, 0x02},
+	{0x32B8, 0x50},
+	{0x32B9, 0x10},
+	{0x32BA, 0x00},
+	{0x32BB, 0x04},
+	{0x32C8, 0x50},
+	{0x32C9, 0x10},
+	{0x32CA, 0x00},
+	{0x32CB, 0x04},
+	{0x332C, 0xD3},
+	{0x332D, 0x10},
+	{0x332E, 0x0D},
+	{0x3358, 0x06},
+	{0x3359, 0xE1},
+	{0x335A, 0x11},
+	{0x3360, 0x1E},
+	{0x3361, 0x61},
+	{0x3362, 0x10},
+	{0x33B0, 0x50},
+	{0x33B2, 0x1A},
+	{0x33B3, 0x04},
+	{0x3415, 0x00},
+	{0x3418, 0xB2},
+	{0x3419, 0x08},
+	{0x347B, 0x23},
+	{0x3480, 0x49},
+	{0x3002, 0x00},
+	{REG_NULL, 0x00},
+};
+
+/*
+ * Xclk 37.125Mhz
+ * max_framerate 60fps
+ * mipi_datarate per lane 445Mbps 4 lane
+ */
+static const struct regval imx462_linear_1920x1080_mipi_regs[] = {
+	{0x3003, 0x01},
+	{REG_DELAY, 0x10},
+	{0x3000, 0x01},
+	{0x3001, 0x00},
+	{0x3002, 0x01},
+	{0x3005, 0x00},
+	{0x3007, 0x00},
+	{0x3009, 0x02},
+	{0x300A, 0x3c},
+	{0x3010, 0x21},
+	{0x3011, 0x0a},
+	{0x3018, 0x65},
+	{0x3019, 0x04},
+	{0x301C, 0x30},
+	{0x301D, 0x11},
+	{0x3046, 0x00},
+	{0x304B, 0x0A},
+	{0x305C, 0x18},
+	{0x305D, 0x03},
+	{0x305E, 0x20},
+	{0x305F, 0x01},
+	{0x309E, 0x4A},
+	{0x309F, 0x4A},
+	{0x311c, 0x0e},
+	{0x3128, 0x04},
+	{0x3129, 0x1d},
+	{0x313B, 0x41},
+	{0x315E, 0x1A},
+	{0x3164, 0x1A},
+	{0x317C, 0x12},
+	{0x31EC, 0x37},
+	{0x3405, 0x20},
+	{0x3407, 0x03},
+	{0x3414, 0x0A},
+	{0x3418, 0x49},
+	{0x3419, 0x04},
+	{0x3441, 0x0a},
+	{0x3442, 0x0a},
+	{0x3443, 0x03},
+	{0x3444, 0x20},
+	{0x3445, 0x25},
+	{0x3446, 0x47},
+	{0x3447, 0x00},
+	{0x3448, 0x1f},
+	{0x3449, 0x00},
+	{0x344A, 0x17},
+	{0x344B, 0x00},
+	{0x344C, 0x0F},
+	{0x344D, 0x00},
+	{0x344E, 0x17},
+	{0x344F, 0x00},
+	{0x3450, 0x47},
+	{0x3451, 0x00},
+	{0x3452, 0x0F},
+	{0x3453, 0x00},
+	{0x3454, 0x0f},
+	{0x3455, 0x00},
+	{0x3472, 0x9c},
+	{0x3473, 0x07},
+	{0x3480, 0x49},
+	{0x3002, 0x00},
+	{REG_NULL, 0x00},
+};
+
+/*
+ * Xclk 37.125Mhz
+ * max_framerate 30fps
+ * mipi_datarate per lane 445.5Mbps 4 lane
+ */
+static const struct regval imx462_hdr2_1920x1080_mipi_regs[] = {
+	{0x3003, 0x01},
+	{REG_DELAY, 0x10},
+	{0x3000, 0x01},
+	{0x3001, 0x00},
+	{0x3002, 0x01},
+	{0x3005, 0x00},
+	{0x3007, 0x40},
+	{0x3009, 0x01},
+	{0x300a, 0x3c},
+	{0x300c, 0x11},
+	{0x3011, 0x02},
+	{0x3018, 0xc4},
+	{0x3019, 0x04},
+	{0x301a, 0x00},
+	{0x301c, 0xEc},
+	{0x301d, 0x07},
+	{0x3045, 0x05},
+	{0x3046, 0x00},
+	{0x304b, 0x0a},
+	{0x305c, 0x18},
+	{0x305d, 0x03},
+	{0x305e, 0x20},
+	{0x305f, 0x01},
+	{0x309e, 0x4a},
+	{0x309f, 0x4a},
+	{0x30d2, 0x19},
+	{0x30d7, 0x03},
+	{0x3106, 0x11},
+	{0x3129, 0x1d},
+	{0x313b, 0x61},
+	{0x315e, 0x1a},
+	{0x3164, 0x1a},
+	{0x317c, 0x12},
+	{0x31ec, 0x37},
+	{0x3405, 0x10},
+	{0x3407, 0x03},
+	{0x3414, 0x00},
+	{0x3415, 0x00},
+	{0x3418, 0x72},
+	{0x3419, 0x09},
+	{0x3441, 0x0a},
+	{0x3442, 0x0a},
+	{0x3443, 0x03},
+	{0x3444, 0x20},
+	{0x3445, 0x25},
+	{0x3446, 0x57},
+	{0x3447, 0x00},
+	{0x3448, 0x37},
+	{0x3449, 0x00},
+	{0x344a, 0x1f},
+	{0x344b, 0x00},
+	{0x344c, 0x1f},
+	{0x344d, 0x00},
+	{0x344e, 0x1f},
+	{0x344f, 0x00},
+	{0x3450, 0x77},
+	{0x3451, 0x00},
+	{0x3452, 0x1f},
+	{0x3453, 0x00},
+	{0x3454, 0x17},
+	{0x3455, 0x00},
+	{0x3472, 0xa0},
+	{0x3473, 0x07},
+	{0x347b, 0x23},
+	{0x3480, 0x49},
+	{0x31a0, 0xb4},
+	{0x31a1, 0x02},
+	{0x3020, 0x02},
+	{0x3021, 0x00},
+	{0x3022, 0x00},
+	{0x3030, 0xe1},
+	{0x3031, 0x00},
+	{0x3032, 0x00},
+	{0x31A0, 0xe8},
+	{0x31A1, 0x01},
+	{0x303c, 0x04},
+	{0x303d, 0x00},
+	{0x303e, 0x41},
+	{0x303f, 0x04},
+	{0x303A, 0x08},
+	{0x3024, 0xc9},
+	{0x3025, 0x06},
+	{0x3026, 0x00},
+	{0x3010, 0x61},
+	{0x3014, 0x00},
+	{0x30F0, 0x64},
+	{0x30f2, 0x00},
+	{0x3002, 0x00},
+	{REG_NULL, 0x00},
+};
+
+/*
+ * The width and height must be configured to be
+ * the same as the current output resolution of the sensor.
+ * The input width of the isp needs to be 16 aligned.
+ * The input height of the isp needs to be 8 aligned.
+ * If the width or height does not meet the alignment rules,
+ * you can configure the cropping parameters with the following function to
+ * crop out the appropriate resolution.
+ * struct v4l2_subdev_pad_ops {
+ *	.get_selection
+ * }
+ */
+static const struct imx462_mode lvds_supported_modes[] = {
+	{
+		.bus_fmt = MEDIA_BUS_FMT_SRGGB10_1X10,
+		.width = 1948,
+		.height = 1110,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 600000,
+		},
+		.exp_def = 0x03fe,
+		.hts_def = 0x0898,
+		.vts_def = 0x0465,
+		.reg_list = imx462_linear_1920x1080_60fps_lvds_regs,
+		.hdr_mode = NO_HDR,
+		.lvds_cfg = {
+			.mode = LS_FIRST,
+			.frm_sync_code[LVDS_CODE_GRP_LINEAR] = {
+				.odd_sync_code = {
+					.act = {
+						.sav = 0x200,
+						.eav = 0x274,
+					},
+					.blk = {
+						.sav = 0x2ac,
+						.eav = 0x2d8,
+					},
+				},
+			},
+		},
+	},
+	{
+		.bus_fmt = MEDIA_BUS_FMT_SRGGB10_1X10,
+		.width = 1948,
+		.height = 1098,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x0473,
+		.hts_def = 0x0898,
+		.vts_def = 0x0465 * 2,
+		.reg_list = imx462_hdr2_1920x1080_lvds_regs,
+		.hdr_mode = HDR_X2,
+		.lvds_cfg = {
+			.mode  = SONY_DOL_HDR_1,
+			.frm_sync_code[LVDS_CODE_GRP_LONG] = {
+				.odd_sync_code = {
+					.act = {
+						.sav = 0x001,
+						.eav = 0x075,
+					},
+					.blk = {
+						.sav = 0x0ac,
+						.eav = 0x0d8,
+					},
+				},//FID0 =1 N FRAME
+				.even_sync_code = {
+					.act = {
+						.sav = 0x101,
+						.eav = 0x175,
+					},
+					.blk = {
+						.sav = 0x1ac,
+						.eav = 0x1d8,
+					},
+				},//FID0 =1 N+1 FRAME
+			},
+			.frm_sync_code[LVDS_CODE_GRP_SHORT] = {
+				.odd_sync_code = {
+					.act = {
+						.sav = 0x002,
+						.eav = 0x076,
+					},
+					.blk = {
+						.sav = 0x0ac,
+						.eav = 0x0d8,
+					},
+				},//FID1 =1 N FRAME
+				.even_sync_code = {
+					.act = {
+						.sav = 0x102,
+						.eav = 0x176,
+					},
+					.blk = {
+						.sav = 0x1ac,
+						.eav = 0x1d8,
+					},
+				},//FID0 =1 N+1 FRAME
+			},
+		},
+	},
+
+};
+
+static const struct imx462_mode mipi_supported_modes[] = {
+	{
+		.bus_fmt = MEDIA_BUS_FMT_SRGGB10_1X10,
+		.width = 1948,
+		.height = 1097,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x03fe,
+		.hts_def = 0x1130,
+		.vts_def = 0x0465,
+		.reg_list = imx462_linear_1920x1080_mipi_regs,
+		.hdr_mode = NO_HDR,
+	}, {
+		.bus_fmt = MEDIA_BUS_FMT_SRGGB10_1X10,
+		.width = 1952,
+		.height = 1089,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x0473,
+		.hts_def = 0x07ec,
+		.vts_def = 0x04c4 * 2,
+		.reg_list = imx462_hdr2_1920x1080_mipi_regs,
+		.hdr_mode = HDR_X2,
+	},
+};
+
+static const s64 link_freq_menu_items[] = {
+	IMX462_LINK_FREQ_111M,
+	IMX462_LINK_FREQ_222M
+};
+
+#ifdef USED_TEST_PATTERN
+static const char * const imx462_test_pattern_menu[] = {
+	"Disabled",
+	"Bar Type 1",
+	"Bar Type 2",
+	"Bar Type 3",
+	"Bar Type 4",
+	"Bar Type 5",
+	"Bar Type 6",
+	"Bar Type 7",
+	"Bar Type 8",
+	"Bar Type 9",
+	"Bar Type 10",
+	"Bar Type 11",
+	"Bar Type 12",
+	"Bar Type 13",
+	"Bar Type 14",
+	"Bar Type 15"
+};
+#endif
+
+/* Write registers up to 4 at a time */
+static int imx462_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;
+
+	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 imx462_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++)
+		if (unlikely(regs[i].addr == REG_DELAY))
+			usleep_range(regs[i].val * 1000, regs[i].val * 2000);
+		else
+			ret = imx462_write_reg(client, regs[i].addr,
+				IMX462_REG_VALUE_08BIT,
+				regs[i].val);
+
+	return ret;
+}
+
+/* Read registers up to 4 at a time */
+static int imx462_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 *)&reg_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 imx462_get_reso_dist(const struct imx462_mode *mode,
+				 struct v4l2_mbus_framefmt *framefmt)
+{
+	return abs(mode->width - framefmt->width) +
+	       abs(mode->height - framefmt->height);
+}
+
+static const struct imx462_mode *
+imx462_find_best_fit(struct imx462 *imx462, 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 < imx462->support_modes_num; i++) {
+		dist = imx462_get_reso_dist(&imx462->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 &imx462->support_modes[cur_best_fit];
+}
+
+static int imx462_set_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct imx462 *imx462 = to_imx462(sd);
+	const struct imx462_mode *mode;
+	s64 h_blank, vblank_def;
+	s32 dst_link_freq = 0;
+	s64 dst_pixel_rate = 0;
+
+	mutex_lock(&imx462->mutex);
+
+	mode = imx462_find_best_fit(imx462, fmt);
+	fmt->format.code = mode->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(&imx462->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		imx462->cur_mode = mode;
+		h_blank = mode->hts_def - mode->width;
+		__v4l2_ctrl_modify_range(imx462->hblank, h_blank,
+					 h_blank, 1, h_blank);
+		vblank_def = mode->vts_def - mode->height;
+		__v4l2_ctrl_modify_range(imx462->vblank, vblank_def,
+					 IMX462_VTS_MAX - mode->height,
+					 1, vblank_def);
+		if (imx462->cur_mode->hdr_mode == NO_HDR) {
+			dst_link_freq = 0;
+			dst_pixel_rate = IMX462_LINK_FREQ_111M;
+		} else {
+			dst_link_freq = 1;
+			dst_pixel_rate = IMX462_LINK_FREQ_222M;
+		}
+		__v4l2_ctrl_s_ctrl_int64(imx462->pixel_rate,
+					 dst_pixel_rate);
+		__v4l2_ctrl_s_ctrl(imx462->link_freq,
+				   dst_link_freq);
+		imx462->cur_vts = mode->vts_def;
+	}
+
+	mutex_unlock(&imx462->mutex);
+
+	return 0;
+}
+
+static int imx462_get_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct imx462 *imx462 = to_imx462(sd);
+	const struct imx462_mode *mode = imx462->cur_mode;
+
+	mutex_lock(&imx462->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(&imx462->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		fmt->format.width = mode->width;
+		fmt->format.height = mode->height;
+		fmt->format.code = mode->bus_fmt;
+		fmt->format.field = V4L2_FIELD_NONE;
+	}
+	mutex_unlock(&imx462->mutex);
+	return 0;
+}
+
+static int imx462_enum_mbus_code(struct v4l2_subdev *sd,
+				 struct v4l2_subdev_pad_config *cfg,
+				 struct v4l2_subdev_mbus_code_enum *code)
+{
+	struct imx462 *imx462 = to_imx462(sd);
+	const struct imx462_mode *mode = imx462->cur_mode;
+
+	if (code->index != 0)
+		return -EINVAL;
+	code->code = mode->bus_fmt;
+
+	return 0;
+}
+
+static int imx462_enum_frame_sizes(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_pad_config *cfg,
+				   struct v4l2_subdev_frame_size_enum *fse)
+{
+	struct imx462 *imx462 = to_imx462(sd);
+
+	if (fse->index >= imx462->support_modes_num)
+		return -EINVAL;
+
+	if (fse->code != imx462->support_modes[fse->index].bus_fmt)
+		return -EINVAL;
+
+	fse->min_width  = imx462->support_modes[fse->index].width;
+	fse->max_width  = imx462->support_modes[fse->index].width;
+	fse->max_height = imx462->support_modes[fse->index].height;
+	fse->min_height = imx462->support_modes[fse->index].height;
+
+	return 0;
+}
+
+#ifdef USED_TEST_PATTERN
+static int imx462_enable_test_pattern(struct imx462 *imx462, u32 pattern)
+{
+	u32 val = 0;
+
+	imx462_read_reg(imx462->client,
+			IMX462_REG_TEST_PATTERN,
+			IMX462_REG_VALUE_08BIT,
+			&val);
+	if (pattern) {
+		val = ((pattern - 1) << 4) | IMX462_TEST_PATTERN_ENABLE;
+		imx462_write_reg(imx462->client,
+				 0x300a,
+				 IMX462_REG_VALUE_08BIT,
+				 0x00);
+		imx462_write_reg(imx462->client,
+				 0x300e,
+				 IMX462_REG_VALUE_08BIT,
+				 0x00);
+	} else {
+		val &= ~IMX462_TEST_PATTERN_ENABLE;
+		imx462_write_reg(imx462->client,
+				 0x300a,
+				 IMX462_REG_VALUE_08BIT,
+				 0x3c);
+		imx462_write_reg(imx462->client,
+				 0x300e,
+				 IMX462_REG_VALUE_08BIT,
+				 0x01);
+	}
+	return imx462_write_reg(imx462->client,
+				IMX462_REG_TEST_PATTERN,
+				IMX462_REG_VALUE_08BIT,
+				val);
+}
+#endif
+
+static int imx462_g_frame_interval(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_frame_interval *fi)
+{
+	struct imx462 *imx462 = to_imx462(sd);
+	const struct imx462_mode *mode = imx462->cur_mode;
+
+	mutex_lock(&imx462->mutex);
+	fi->interval = mode->max_fps;
+	mutex_unlock(&imx462->mutex);
+
+	return 0;
+}
+
+static int imx462_g_mbus_config(struct v4l2_subdev *sd,
+				struct v4l2_mbus_config *config)
+{
+	struct imx462 *imx462 = to_imx462(sd);
+	u32 val = 0;
+
+	val = 1 << (IMX462_4LANES - 1) |
+			V4L2_MBUS_CSI2_CHANNEL_0 |
+			V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
+	if (imx462->bus_cfg.bus_type == 3)
+		config->type = V4L2_MBUS_CCP2;
+	else
+		config->type = V4L2_MBUS_CSI2;
+	config->flags = val;
+
+	return 0;
+}
+
+static int imx462_set_hdrae(struct imx462 *imx462,
+			    struct preisp_hdrae_exp_s *ae)
+{
+	u32 l_exp_time, m_exp_time, s_exp_time;
+	u32 l_gain, m_gain, s_gain;
+	u32 shs1 = 0, shs2 = 0, rhs1 = 0;
+	u32 gain_switch = 0;
+	int ret = 0;
+	u8 cg_mode = 0;
+	u32 fsc = imx462->cur_vts;//The HDR mode vts is double by default to workaround T-line
+
+	if (!imx462->has_init_exp && !imx462->streaming) {
+		imx462->init_hdrae_exp = *ae;
+		imx462->has_init_exp = true;
+		dev_dbg(&imx462->client->dev, "imx462 don't stream, record exp for hdr!\n");
+		return ret;
+	}
+
+	l_exp_time = ae->long_exp_reg;
+	m_exp_time = ae->middle_exp_reg;
+	s_exp_time = ae->short_exp_reg;
+	l_gain = ae->long_gain_reg;
+	m_gain = ae->middle_gain_reg;
+	s_gain = ae->short_gain_reg;
+
+	if (imx462->cur_mode->hdr_mode == HDR_X2) {
+		//2 stagger
+		l_gain = m_gain;
+		l_exp_time = m_exp_time;
+		cg_mode = ae->middle_cg_mode;
+	}
+	dev_dbg(&imx462->client->dev,
+		"rev exp req: L_time=%d, gain=%d, S_time=%d, gain=%d\n",
+		l_exp_time, l_gain,
+		s_exp_time, s_gain);
+	ret = imx462_read_reg(imx462->client, IMX462_GAIN_SWITCH_REG,
+				IMX462_REG_VALUE_08BIT, &gain_switch);
+	if (!g_isHCG && cg_mode == GAIN_MODE_HCG) {
+		gain_switch |= 0x0110;
+		g_isHCG = true;
+	} else if (g_isHCG && cg_mode == GAIN_MODE_LCG) {
+		gain_switch &= 0xef;
+		gain_switch |= 0x100;
+		g_isHCG = false;
+	}
+
+	rhs1 = 0x09;
+	shs1 = rhs1 - s_exp_time - 1;
+	shs2 = fsc - l_exp_time - 1;
+	if (shs1 < 2)
+		shs1 = 2;
+	if (shs2 < (rhs1 + 2))
+		shs2 = rhs1 + 2;
+	else if (shs2 > (fsc - 2))
+		shs2 = fsc - 2;
+
+	ret |= imx462_write_reg(imx462->client, IMX462_REG_SHS1_L,
+		IMX462_REG_VALUE_08BIT,
+		IMX462_FETCH_LOW_BYTE_EXP(shs1));
+	ret |= imx462_write_reg(imx462->client, IMX462_REG_SHS1_M,
+		IMX462_REG_VALUE_08BIT,
+		IMX462_FETCH_MID_BYTE_EXP(shs1));
+	ret |= imx462_write_reg(imx462->client, IMX462_REG_SHS1_H,
+		IMX462_REG_VALUE_08BIT,
+		IMX462_FETCH_HIGH_BYTE_EXP(shs1));
+
+	ret |= imx462_write_reg(imx462->client, IMX462_REG_SHS2_L,
+		IMX462_REG_VALUE_08BIT,
+		IMX462_FETCH_LOW_BYTE_EXP(shs2));
+	ret |= imx462_write_reg(imx462->client, IMX462_REG_SHS2_M,
+		IMX462_REG_VALUE_08BIT,
+		IMX462_FETCH_MID_BYTE_EXP(shs2));
+	ret |= imx462_write_reg(imx462->client, IMX462_REG_SHS2_H,
+		IMX462_REG_VALUE_08BIT,
+		IMX462_FETCH_HIGH_BYTE_EXP(shs2));
+
+	ret |= imx462_write_reg(imx462->client, IMX462_REG_LF_GAIN,
+		IMX462_REG_VALUE_08BIT,
+		l_gain);
+	ret |= imx462_write_reg(imx462->client, IMX462_REG_SF_GAIN,
+		IMX462_REG_VALUE_08BIT,
+		s_gain);
+
+	if (gain_switch & 0x100) {
+		ret |= imx462_write_reg(imx462->client,
+				IMX462_GROUP_HOLD_REG,
+				IMX462_REG_VALUE_08BIT,
+				IMX462_GROUP_HOLD_START);
+		ret |= imx462_write_reg(imx462->client, IMX462_GAIN_SWITCH_REG,
+				IMX462_REG_VALUE_08BIT, gain_switch);
+		ret |= imx462_write_reg(imx462->client,
+				IMX462_GROUP_HOLD_REG,
+				IMX462_REG_VALUE_08BIT,
+				IMX462_GROUP_HOLD_END);
+	}
+	dev_dbg(&imx462->client->dev,
+		"set l_gain:0x%x s_gain:0x%x shs2:0x%x shs1:0x%x\n",
+		l_gain, s_gain, shs2, shs1);
+	return ret;
+}
+
+static void imx462_get_module_inf(struct imx462 *imx462,
+				  struct rkmodule_inf *inf)
+{
+	memset(inf, 0, sizeof(*inf));
+	strscpy(inf->base.sensor, IMX462_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, imx462->module_name,
+		sizeof(inf->base.module));
+	strscpy(inf->base.lens, imx462->len_name, sizeof(inf->base.lens));
+}
+
+static int imx462_set_conversion_gain(struct imx462 *imx462, u32 *cg)
+{
+	int ret = 0;
+	struct i2c_client *client = imx462->client;
+	int cur_cg = *cg;
+	u32 gain_switch = 0;
+
+	ret = imx462_read_reg(client,
+		IMX462_GAIN_SWITCH_REG,
+		IMX462_REG_VALUE_08BIT,
+		&gain_switch);
+	if (g_isHCG && cur_cg == GAIN_MODE_LCG) {
+		gain_switch &= 0xef;
+		gain_switch |= 0x0100;
+		g_isHCG = false;
+	} else if (!g_isHCG && cur_cg == GAIN_MODE_HCG) {
+		gain_switch |= 0x0110;
+		g_isHCG = true;
+	}
+
+	if (gain_switch & 0x100) {
+		ret |= imx462_write_reg(client,
+			IMX462_GROUP_HOLD_REG,
+			IMX462_REG_VALUE_08BIT,
+			IMX462_GROUP_HOLD_START);
+		ret |= imx462_write_reg(client,
+			IMX462_GAIN_SWITCH_REG,
+			IMX462_REG_VALUE_08BIT,
+			gain_switch & 0xff);
+		ret |= imx462_write_reg(client,
+			IMX462_GROUP_HOLD_REG,
+			IMX462_REG_VALUE_08BIT,
+			IMX462_GROUP_HOLD_END);
+	}
+
+	return ret;
+}
+
+#define USED_SYS_DEBUG
+#ifdef USED_SYS_DEBUG
+//ag: echo 0 >  /sys/devices/platform/ff510000.i2c/i2c-1/1-0037/cam_s_cg
+static ssize_t set_conversion_gain_status(struct device *dev,
+	struct device_attribute *attr,
+	const char *buf,
+	size_t count)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct imx462 *imx462 = to_imx462(sd);
+	int status = 0;
+	int ret = 0;
+
+	ret = kstrtoint(buf, 0, &status);
+	if (!ret && status >= 0 && status < 2)
+		imx462_set_conversion_gain(imx462, &status);
+	else
+		dev_err(dev, "input 0 for LCG, 1 for HCG, cur %d\n", status);
+	return count;
+}
+
+static struct device_attribute attributes[] = {
+	__ATTR(cam_s_cg, S_IWUSR, NULL, set_conversion_gain_status),
+};
+
+static int add_sysfs_interfaces(struct device *dev)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(attributes); i++)
+		if (device_create_file(dev, attributes + i))
+			goto undo;
+	return 0;
+undo:
+	for (i--; i >= 0 ; i--)
+		device_remove_file(dev, attributes + i);
+	dev_err(dev, "%s: failed to create sysfs interface\n", __func__);
+	return -ENODEV;
+}
+#endif
+
+static long imx462_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	struct imx462 *imx462 = to_imx462(sd);
+	struct rkmodule_hdr_cfg *hdr;
+	struct rkmodule_lvds_cfg *lvds_cfg;
+	u32 i, h, w;
+	long ret = 0;
+	s64 dst_pixel_rate = 0;
+	s32 dst_link_freq = 0;
+	u32 stream = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		imx462_get_module_inf(imx462, (struct rkmodule_inf *)arg);
+		break;
+	case PREISP_CMD_SET_HDRAE_EXP:
+		ret = imx462_set_hdrae(imx462, arg);
+		break;
+	case RKMODULE_GET_HDR_CFG:
+		hdr = (struct rkmodule_hdr_cfg *)arg;
+		if (imx462->cur_mode->hdr_mode == NO_HDR)
+			hdr->esp.mode = HDR_NORMAL_VC;
+		else
+			hdr->esp.mode = HDR_ID_CODE;
+		hdr->hdr_mode = imx462->cur_mode->hdr_mode;
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr = (struct rkmodule_hdr_cfg *)arg;
+		for (i = 0; i < imx462->support_modes_num; i++) {
+			if (imx462->support_modes[i].hdr_mode == hdr->hdr_mode) {
+				imx462->cur_mode = &imx462->support_modes[i];
+				break;
+			}
+		}
+		if (i == imx462->support_modes_num) {
+			dev_err(&imx462->client->dev,
+				"not find hdr mode:%d config\n",
+				hdr->hdr_mode);
+			ret = -EINVAL;
+		} else {
+			w = imx462->cur_mode->hts_def - imx462->cur_mode->width;
+			h = imx462->cur_mode->vts_def - imx462->cur_mode->height;
+			__v4l2_ctrl_modify_range(imx462->hblank, w, w, 1, w);
+			__v4l2_ctrl_modify_range(imx462->vblank, h,
+				IMX462_VTS_MAX - imx462->cur_mode->height,
+				1, h);
+			if (imx462->cur_mode->hdr_mode == NO_HDR) {
+				dst_link_freq = 0;
+				dst_pixel_rate = IMX462_PIXEL_RATE_NORMAL;
+			} else {
+				dst_link_freq = 1;
+				dst_pixel_rate = IMX462_PIXEL_RATE_HDR;
+			}
+			__v4l2_ctrl_s_ctrl_int64(imx462->pixel_rate,
+						 dst_pixel_rate);
+			__v4l2_ctrl_s_ctrl(imx462->link_freq,
+					   dst_link_freq);
+			imx462->cur_vts = imx462->cur_mode->vts_def;
+		}
+		break;
+	case RKMODULE_SET_CONVERSION_GAIN:
+		ret = imx462_set_conversion_gain(imx462, (u32 *)arg);
+		break;
+	case RKMODULE_GET_LVDS_CFG:
+		lvds_cfg = (struct rkmodule_lvds_cfg *)arg;
+		if (imx462->bus_cfg.bus_type == 3)
+			memcpy(lvds_cfg, &imx462->cur_mode->lvds_cfg,
+				sizeof(struct rkmodule_lvds_cfg));
+		else
+			ret = -ENOIOCTLCMD;
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+
+		stream = *((u32 *)arg);
+
+		if (stream)
+			ret = imx462_write_reg(imx462->client,
+					       IMX462_REG_CTRL_MODE,
+					       IMX462_REG_VALUE_08BIT,
+					       0);
+		else
+			ret = imx462_write_reg(imx462->client,
+					       IMX462_REG_CTRL_MODE,
+					       IMX462_REG_VALUE_08BIT,
+					       1);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+	return ret;
+}
+
+#ifdef CONFIG_COMPAT
+static long imx462_compat_ioctl32(struct v4l2_subdev *sd,
+				  unsigned int cmd, unsigned long arg)
+{
+	void __user *up = compat_ptr(arg);
+	struct rkmodule_inf *inf;
+	struct rkmodule_hdr_cfg *hdr;
+	struct preisp_hdrae_exp_s *hdrae;
+	long ret;
+	u32 cg = 0;
+	u32 stream = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		inf = kzalloc(sizeof(*inf), GFP_KERNEL);
+		if (!inf) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = imx462_ioctl(sd, cmd, inf);
+		if (!ret) {
+			ret = copy_to_user(up, inf, sizeof(*inf));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(inf);
+		break;
+	case RKMODULE_GET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = imx462_ioctl(sd, cmd, hdr);
+		if (!ret) {
+			ret = copy_to_user(up, hdr, sizeof(*hdr));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(hdr);
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		if (copy_from_user(hdr, up, sizeof(*hdr)))
+			return -EFAULT;
+
+		ret = imx462_ioctl(sd, cmd, hdr);
+		kfree(hdr);
+		break;
+	case PREISP_CMD_SET_HDRAE_EXP:
+		hdrae = kzalloc(sizeof(*hdrae), GFP_KERNEL);
+		if (!hdrae) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		if (copy_from_user(hdrae, up, sizeof(*hdrae)))
+			return -EFAULT;
+
+		ret = imx462_ioctl(sd, cmd, hdrae);
+		kfree(hdrae);
+		break;
+	case RKMODULE_SET_CONVERSION_GAIN:
+		if (copy_from_user(&cg, up, sizeof(cg)))
+			return -EFAULT;
+
+		ret = imx462_ioctl(sd, cmd, &cg);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		if (copy_from_user(&stream, up, sizeof(u32)))
+			return -EFAULT;
+
+		ret = imx462_ioctl(sd, cmd, &stream);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+#endif
+
+static int imx462_init_conversion_gain(struct imx462 *imx462)
+{
+	int ret = 0;
+	struct i2c_client *client = imx462->client;
+	u32 val = 0;
+
+	ret = imx462_read_reg(client,
+		IMX462_GAIN_SWITCH_REG,
+		IMX462_REG_VALUE_08BIT,
+		&val);
+	val &= 0xef;
+	ret |= imx462_write_reg(client,
+		IMX462_GAIN_SWITCH_REG,
+		IMX462_REG_VALUE_08BIT,
+		val);
+	if (!ret)
+		g_isHCG = false;
+	return ret;
+}
+
+static int __imx462_start_stream(struct imx462 *imx462)
+{
+	int ret;
+
+	ret = imx462_write_array(imx462->client, imx462->cur_mode->reg_list);
+	if (ret)
+		return ret;
+	ret = imx462_init_conversion_gain(imx462);
+	if (ret)
+		return ret;
+	/* In case these controls are set before streaming */
+	ret = __v4l2_ctrl_handler_setup(&imx462->ctrl_handler);
+	if (ret)
+		return ret;
+	if (imx462->has_init_exp && imx462->cur_mode->hdr_mode != NO_HDR) {
+		ret = imx462_ioctl(&imx462->subdev, PREISP_CMD_SET_HDRAE_EXP,
+			&imx462->init_hdrae_exp);
+		if (ret) {
+			dev_err(&imx462->client->dev,
+				"init exp fail in hdr mode\n");
+			return ret;
+		}
+	}
+
+	ret = imx462_write_reg(imx462->client,
+		IMX462_REG_CTRL_MODE,
+		IMX462_REG_VALUE_08BIT,
+		0);
+	return ret;
+}
+
+static int __imx462_stop_stream(struct imx462 *imx462)
+{
+	return imx462_write_reg(imx462->client,
+		IMX462_REG_CTRL_MODE,
+		IMX462_REG_VALUE_08BIT,
+		1);
+}
+
+static int imx462_s_stream(struct v4l2_subdev *sd, int on)
+{
+	struct imx462 *imx462 = to_imx462(sd);
+	struct i2c_client *client = imx462->client;
+	int ret = 0;
+
+	mutex_lock(&imx462->mutex);
+	on = !!on;
+	if (on == imx462->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 = __imx462_start_stream(imx462);
+		if (ret) {
+			v4l2_err(sd, "start stream failed while write regs\n");
+			pm_runtime_put(&client->dev);
+			goto unlock_and_return;
+		}
+	} else {
+		__imx462_stop_stream(imx462);
+		pm_runtime_put(&client->dev);
+	}
+
+	imx462->streaming = on;
+
+unlock_and_return:
+	mutex_unlock(&imx462->mutex);
+
+	return ret;
+}
+
+static int imx462_s_power(struct v4l2_subdev *sd, int on)
+{
+	struct imx462 *imx462 = to_imx462(sd);
+	struct i2c_client *client = imx462->client;
+	int ret = 0;
+
+	mutex_lock(&imx462->mutex);
+
+	/* If the power state is not modified - no work to do. */
+	if (imx462->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;
+		}
+
+		ret = imx462_write_array(imx462->client, imx462_global_regs);
+		if (ret) {
+			v4l2_err(sd, "could not set init registers\n");
+			pm_runtime_put_noidle(&client->dev);
+			goto unlock_and_return;
+		}
+
+		imx462->power_on = true;
+	} else {
+		pm_runtime_put(&client->dev);
+		imx462->power_on = false;
+	}
+
+unlock_and_return:
+	mutex_unlock(&imx462->mutex);
+
+	return ret;
+}
+
+/* Calculate the delay in us by clock rate and clock cycles */
+static inline u32 imx462_cal_delay(u32 cycles)
+{
+	return DIV_ROUND_UP(cycles, IMX462_XVCLK_FREQ / 1000 / 1000);
+}
+
+static int __imx462_power_on(struct imx462 *imx462)
+{
+	int ret;
+	u32 delay_us;
+	struct device *dev = &imx462->client->dev;
+
+	if (!IS_ERR_OR_NULL(imx462->pins_default)) {
+		ret = pinctrl_select_state(imx462->pinctrl,
+					   imx462->pins_default);
+		if (ret < 0)
+			dev_err(dev, "could not set pins\n");
+	}
+
+	ret = clk_set_rate(imx462->xvclk, IMX462_XVCLK_FREQ);
+	if (ret < 0)
+		dev_warn(dev, "Failed to set xvclk rate (37.125M Hz)\n");
+
+	if (clk_get_rate(imx462->xvclk) != IMX462_XVCLK_FREQ)
+		dev_warn(dev, "xvclk mismatched,based on 24M Hz\n");
+
+	ret = clk_prepare_enable(imx462->xvclk);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable xvclk\n");
+		return ret;
+	}
+
+
+	ret = regulator_bulk_enable(IMX462_NUM_SUPPLIES, imx462->supplies);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable regulators\n");
+		goto disable_clk;
+	}
+
+	if (!IS_ERR(imx462->reset_gpio))
+		gpiod_set_value_cansleep(imx462->reset_gpio, 0);
+	usleep_range(500, 1000);
+	if (!IS_ERR(imx462->reset_gpio))
+		gpiod_set_value_cansleep(imx462->reset_gpio, 1);
+
+	if (!IS_ERR(imx462->pwdn_gpio))
+		gpiod_set_value_cansleep(imx462->pwdn_gpio, 1);
+
+	/* 8192 cycles prior to first SCCB transaction */
+	delay_us = imx462_cal_delay(8192);
+	usleep_range(delay_us, delay_us * 2);
+	usleep_range(5000, 10000);
+	return 0;
+
+disable_clk:
+	clk_disable_unprepare(imx462->xvclk);
+
+	return ret;
+}
+
+static void __imx462_power_off(struct imx462 *imx462)
+{
+	int ret;
+	struct device *dev = &imx462->client->dev;
+
+	if (!IS_ERR(imx462->pwdn_gpio))
+		gpiod_set_value_cansleep(imx462->pwdn_gpio, 0);
+	clk_disable_unprepare(imx462->xvclk);
+	if (!IS_ERR(imx462->reset_gpio))
+		gpiod_set_value_cansleep(imx462->reset_gpio, 0);
+	if (!IS_ERR_OR_NULL(imx462->pins_sleep)) {
+		ret = pinctrl_select_state(imx462->pinctrl,
+					   imx462->pins_sleep);
+		if (ret < 0)
+			dev_dbg(dev, "could not set pins\n");
+	}
+	regulator_bulk_disable(IMX462_NUM_SUPPLIES, imx462->supplies);
+}
+
+static int imx462_runtime_resume(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct imx462 *imx462 = to_imx462(sd);
+
+	return __imx462_power_on(imx462);
+}
+
+static int imx462_runtime_suspend(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct imx462 *imx462 = to_imx462(sd);
+
+	__imx462_power_off(imx462);
+
+	return 0;
+}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static int imx462_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
+{
+	struct imx462 *imx462 = to_imx462(sd);
+	struct v4l2_mbus_framefmt *try_fmt =
+				v4l2_subdev_get_try_format(sd, fh->pad, 0);
+	const struct imx462_mode *def_mode = &imx462->support_modes[0];
+
+	mutex_lock(&imx462->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->field = V4L2_FIELD_NONE;
+
+	mutex_unlock(&imx462->mutex);
+	/* No crop or compose */
+
+	return 0;
+}
+#endif
+
+static int imx462_enum_frame_interval(struct v4l2_subdev *sd,
+				       struct v4l2_subdev_pad_config *cfg,
+				       struct v4l2_subdev_frame_interval_enum *fie)
+{
+	struct imx462 *imx462 = to_imx462(sd);
+
+	if (fie->index >= imx462->support_modes_num)
+		return -EINVAL;
+
+	fie->code = imx462->support_modes[fie->index].bus_fmt;
+	fie->width = imx462->support_modes[fie->index].width;
+	fie->height = imx462->support_modes[fie->index].height;
+	fie->interval = imx462->support_modes[fie->index].max_fps;
+	fie->reserved[0] = imx462->support_modes[fie->index].hdr_mode;
+	return 0;
+}
+
+#define CROP_START(SRC, DST) (((SRC) - (DST)) / 2 / 4 * 4)
+#define DST_WIDTH 1920
+#define DST_HEIGHT 1080
+
+/*
+ * The resolution of the driver configuration needs to be exactly
+ * the same as the current output resolution of the sensor,
+ * the input width of the isp needs to be 16 aligned,
+ * the input height of the isp needs to be 8 aligned.
+ * Can be cropped to standard resolution by this function,
+ * otherwise it will crop out strange resolution according
+ * to the alignment rules.
+ */
+
+static int imx462_get_selection(struct v4l2_subdev *sd,
+				struct v4l2_subdev_pad_config *cfg,
+				struct v4l2_subdev_selection *sel)
+{
+	struct imx462 *imx462 = to_imx462(sd);
+
+	if (sel->target == V4L2_SEL_TGT_CROP_BOUNDS) {
+		sel->r.left = CROP_START(imx462->cur_mode->width, DST_WIDTH);
+		sel->r.width = DST_WIDTH;
+		if (imx462->bus_cfg.bus_type == 3) {
+			if (imx462->cur_mode->hdr_mode == NO_HDR)
+				sel->r.top = 21;
+			else
+				sel->r.top = 13;
+		} else {
+			sel->r.top = CROP_START(imx462->cur_mode->height, DST_HEIGHT);
+		}
+		sel->r.height = DST_HEIGHT;
+		return 0;
+	}
+	return -EINVAL;
+}
+
+static const struct dev_pm_ops imx462_pm_ops = {
+	SET_RUNTIME_PM_OPS(imx462_runtime_suspend,
+			   imx462_runtime_resume, NULL)
+};
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static const struct v4l2_subdev_internal_ops imx462_internal_ops = {
+	.open = imx462_open,
+};
+#endif
+
+static const struct v4l2_subdev_core_ops imx462_core_ops = {
+	.s_power = imx462_s_power,
+	.ioctl = imx462_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = imx462_compat_ioctl32,
+#endif
+};
+
+static const struct v4l2_subdev_video_ops imx462_video_ops = {
+	.s_stream = imx462_s_stream,
+	.g_frame_interval = imx462_g_frame_interval,
+	.g_mbus_config = imx462_g_mbus_config,
+};
+
+static const struct v4l2_subdev_pad_ops imx462_pad_ops = {
+	.enum_mbus_code = imx462_enum_mbus_code,
+	.enum_frame_size = imx462_enum_frame_sizes,
+	.enum_frame_interval = imx462_enum_frame_interval,
+	.get_fmt = imx462_get_fmt,
+	.set_fmt = imx462_set_fmt,
+	.get_selection = imx462_get_selection,
+};
+
+static const struct v4l2_subdev_ops imx462_subdev_ops = {
+	.core	= &imx462_core_ops,
+	.video	= &imx462_video_ops,
+	.pad	= &imx462_pad_ops,
+};
+
+static int imx462_set_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct imx462 *imx462 = container_of(ctrl->handler,
+					     struct imx462, ctrl_handler);
+	struct i2c_client *client = imx462->client;
+	s64 max;
+	int ret = 0;
+	u32 shs1 = 0;
+	u32 vts = 0;
+	u32 val = 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 = imx462->cur_mode->height + ctrl->val - 2;
+		__v4l2_ctrl_modify_range(imx462->exposure,
+					 imx462->exposure->minimum, max,
+					 imx462->exposure->step,
+					 imx462->exposure->default_value);
+		break;
+	}
+
+	if (!pm_runtime_get_if_in_use(&client->dev))
+		return 0;
+
+	switch (ctrl->id) {
+	case V4L2_CID_EXPOSURE:
+		shs1 = imx462->cur_vts - (ctrl->val + 1);
+		ret = imx462_write_reg(imx462->client,
+			IMX462_REG_SHS1_H,
+			IMX462_REG_VALUE_08BIT,
+			IMX462_FETCH_HIGH_BYTE_EXP(shs1));
+		ret |= imx462_write_reg(imx462->client,
+			IMX462_REG_SHS1_M,
+			IMX462_REG_VALUE_08BIT,
+			IMX462_FETCH_MID_BYTE_EXP(shs1));
+		ret |= imx462_write_reg(imx462->client,
+			IMX462_REG_SHS1_L,
+			IMX462_REG_VALUE_08BIT,
+			IMX462_FETCH_LOW_BYTE_EXP(shs1));
+		dev_dbg(&client->dev, "set exposure 0x%x, cur_vts 0x%x,shs1 0x%x\n",
+			ctrl->val, imx462->cur_vts, shs1);
+		break;
+	case V4L2_CID_ANALOGUE_GAIN:
+		ret = imx462_write_reg(imx462->client,
+			IMX462_REG_LF_GAIN,
+			IMX462_REG_VALUE_08BIT,
+			ctrl->val);
+		dev_dbg(&client->dev, "set analog gain 0x%x\n",
+			ctrl->val);
+		break;
+	case V4L2_CID_VBLANK:
+		vts = ctrl->val + imx462->cur_mode->height;
+		imx462->cur_vts = vts;
+		if (imx462->cur_mode->hdr_mode == HDR_X2)
+			vts /= 2;
+		ret = imx462_write_reg(imx462->client,
+			IMX462_REG_VTS_H,
+			IMX462_REG_VALUE_08BIT,
+			IMX462_FETCH_HIGH_BYTE_VTS(vts));
+		ret |= imx462_write_reg(imx462->client,
+			IMX462_REG_VTS_M,
+			IMX462_REG_VALUE_08BIT,
+			IMX462_FETCH_MID_BYTE_VTS(vts));
+		ret |= imx462_write_reg(imx462->client,
+			IMX462_REG_VTS_L,
+			IMX462_REG_VALUE_08BIT,
+			IMX462_FETCH_LOW_BYTE_VTS(vts));
+		dev_dbg(&client->dev, "set vts 0x%x\n",
+			vts);
+		break;
+	case V4L2_CID_TEST_PATTERN:
+#ifdef USED_TEST_PATTERN
+		ret = imx462_enable_test_pattern(imx462, ctrl->val);
+#endif
+		break;
+	case V4L2_CID_HFLIP:
+		ret = imx462_read_reg(client,
+				      IMX462_FLIP_REG,
+				      IMX462_REG_VALUE_08BIT,
+				      &val);
+		if (ctrl->val)
+			val |= MIRROR_BIT_MASK;
+		else
+			val &= ~MIRROR_BIT_MASK;
+		ret |= imx462_write_reg(client,
+					IMX462_FLIP_REG,
+					IMX462_REG_VALUE_08BIT,
+					val);
+		if (ret == 0)
+			imx462->flip = val;
+		break;
+	case V4L2_CID_VFLIP:
+		ret = imx462_read_reg(client,
+				      IMX462_FLIP_REG,
+				      IMX462_REG_VALUE_08BIT,
+				      &val);
+		if (ctrl->val)
+			val |= FLIP_BIT_MASK;
+		else
+			val &= ~FLIP_BIT_MASK;
+		ret |= imx462_write_reg(client,
+					IMX462_FLIP_REG,
+					IMX462_REG_VALUE_08BIT,
+					val);
+		if (ret == 0)
+			imx462->flip = 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 imx462_ctrl_ops = {
+	.s_ctrl = imx462_set_ctrl,
+};
+
+static int imx462_initialize_controls(struct imx462 *imx462)
+{
+	const struct imx462_mode *mode;
+	struct v4l2_ctrl_handler *handler;
+	s64 exposure_max, vblank_def;
+	u32 h_blank;
+	int ret;
+	s32 dst_link_freq = 0;
+	s64 dst_pixel_rate = 0;
+
+	handler = &imx462->ctrl_handler;
+	mode = imx462->cur_mode;
+	ret = v4l2_ctrl_handler_init(handler, 9);
+	if (ret)
+		return ret;
+	handler->lock = &imx462->mutex;
+
+	imx462->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, V4L2_CID_LINK_FREQ,
+				      0, 0, link_freq_menu_items);
+
+	if (imx462->cur_mode->hdr_mode == NO_HDR) {
+		dst_link_freq = 0;
+		dst_pixel_rate = IMX462_PIXEL_RATE_NORMAL;
+	} else {
+		dst_link_freq = 1;
+		dst_pixel_rate = IMX462_PIXEL_RATE_HDR;
+	}
+	__v4l2_ctrl_s_ctrl(imx462->link_freq,
+			   dst_link_freq);
+	imx462->pixel_rate = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE,
+			  0, IMX462_PIXEL_RATE_HDR, 1, dst_pixel_rate);
+
+	h_blank = mode->hts_def - mode->width;
+
+	imx462->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
+				h_blank, h_blank, 1, h_blank);
+	if (imx462->hblank)
+		imx462->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+
+	vblank_def = mode->vts_def - mode->height;
+	imx462->cur_vts = mode->vts_def;
+	imx462->vblank = v4l2_ctrl_new_std(handler, &imx462_ctrl_ops,
+				V4L2_CID_VBLANK, vblank_def,
+				IMX462_VTS_MAX - mode->height,
+				1, vblank_def);
+
+	exposure_max = mode->vts_def - 4;
+
+	imx462->exposure = v4l2_ctrl_new_std(handler, &imx462_ctrl_ops,
+				V4L2_CID_EXPOSURE, IMX462_EXPOSURE_MIN,
+				exposure_max, IMX462_EXPOSURE_STEP,
+				mode->exp_def);
+
+	imx462->anal_gain = v4l2_ctrl_new_std(handler, &imx462_ctrl_ops,
+				V4L2_CID_ANALOGUE_GAIN, IMX462_GAIN_MIN,
+				IMX462_GAIN_MAX, IMX462_GAIN_STEP,
+				IMX462_GAIN_DEFAULT);
+
+#ifdef USED_TEST_PATTERN
+	imx462->test_pattern = v4l2_ctrl_new_std_menu_items(handler,
+				&imx462_ctrl_ops, V4L2_CID_TEST_PATTERN,
+				ARRAY_SIZE(imx462_test_pattern_menu) - 1,
+				0, 0, imx462_test_pattern_menu);
+#endif
+	v4l2_ctrl_new_std(handler, &imx462_ctrl_ops,
+				V4L2_CID_HFLIP, 0, 1, 1, 0);
+
+	v4l2_ctrl_new_std(handler, &imx462_ctrl_ops,
+				V4L2_CID_VFLIP, 0, 1, 1, 0);
+	imx462->flip = 0;
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(&imx462->client->dev,
+			"Failed to init controls(%d)\n", ret);
+		goto err_free_handler;
+	}
+
+	imx462->subdev.ctrl_handler = handler;
+	imx462->has_init_exp = false;
+
+	return 0;
+
+err_free_handler:
+	v4l2_ctrl_handler_free(handler);
+
+	return ret;
+}
+
+static int imx462_check_sensor_id(struct imx462 *imx462,
+				  struct i2c_client *client)
+{
+	struct device *dev = &imx462->client->dev;
+	u32 id = 0;
+	int ret;
+
+	ret = imx462_read_reg(client, IMX462_REG_CHIP_ID,
+			      IMX462_REG_VALUE_08BIT, &id);
+
+	if (id != CHIP_ID) {
+		dev_err(dev, "Unexpected sensor id(%06x), ret(%d)\n", id, ret);
+		return -EINVAL;
+	}
+	return ret;
+}
+
+static int imx462_configure_regulators(struct imx462 *imx462)
+{
+	unsigned int i;
+
+	for (i = 0; i < IMX462_NUM_SUPPLIES; i++)
+		imx462->supplies[i].supply = imx462_supply_names[i];
+
+	return devm_regulator_bulk_get(&imx462->client->dev,
+				       IMX462_NUM_SUPPLIES,
+				       imx462->supplies);
+}
+
+static int imx462_probe(struct i2c_client *client,
+			 const struct i2c_device_id *id)
+{
+	struct device *dev = &client->dev;
+	struct device_node *node = dev->of_node;
+	struct imx462 *imx462;
+	struct v4l2_subdev *sd;
+	char facing[2];
+	int ret;
+	struct device_node *endpoint;
+
+	dev_info(dev, "driver version: %02x.%02x.%02x",
+		DRIVER_VERSION >> 16,
+		(DRIVER_VERSION & 0xff00) >> 8,
+		DRIVER_VERSION & 0x00ff);
+
+	imx462 = devm_kzalloc(dev, sizeof(*imx462), GFP_KERNEL);
+	if (!imx462)
+		return -ENOMEM;
+
+	ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
+				   &imx462->module_index);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
+				       &imx462->module_facing);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME,
+				       &imx462->module_name);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME,
+				       &imx462->len_name);
+	if (ret) {
+		dev_err(dev, "could not get module information!\n");
+		return -EINVAL;
+	}
+	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),
+		&imx462->bus_cfg);
+	if (ret)
+		dev_warn(dev, "could not get bus config!\n");
+	if (imx462->bus_cfg.bus_type == 3) {
+		imx462->support_modes = lvds_supported_modes;
+		imx462->support_modes_num = ARRAY_SIZE(lvds_supported_modes);
+	} else {
+		imx462->support_modes = mipi_supported_modes;
+		imx462->support_modes_num = ARRAY_SIZE(mipi_supported_modes);
+	}
+	imx462->client = client;
+	imx462->cur_mode = &imx462->support_modes[1];
+
+	imx462->xvclk = devm_clk_get(dev, "xvclk");
+	if (IS_ERR(imx462->xvclk)) {
+		dev_err(dev, "Failed to get xvclk\n");
+		return -EINVAL;
+	}
+
+	imx462->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+	if (IS_ERR(imx462->reset_gpio))
+		dev_warn(dev, "Failed to get reset-gpios\n");
+
+	imx462->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW);
+	if (IS_ERR(imx462->pwdn_gpio))
+		dev_warn(dev, "Failed to get pwdn-gpios\n");
+
+	ret = imx462_configure_regulators(imx462);
+	if (ret) {
+		dev_err(dev, "Failed to get power regulators\n");
+		return ret;
+	}
+
+	imx462->pinctrl = devm_pinctrl_get(dev);
+	if (!IS_ERR(imx462->pinctrl)) {
+		imx462->pins_default =
+			pinctrl_lookup_state(imx462->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_DEFAULT);
+		if (IS_ERR(imx462->pins_default))
+			dev_err(dev, "could not get default pinstate\n");
+
+		imx462->pins_sleep =
+			pinctrl_lookup_state(imx462->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_SLEEP);
+		if (IS_ERR(imx462->pins_sleep))
+			dev_err(dev, "could not get sleep pinstate\n");
+	}
+
+	mutex_init(&imx462->mutex);
+
+	sd = &imx462->subdev;
+	v4l2_i2c_subdev_init(sd, client, &imx462_subdev_ops);
+	ret = imx462_initialize_controls(imx462);
+	if (ret)
+		goto err_destroy_mutex;
+
+	ret = __imx462_power_on(imx462);
+	if (ret)
+		goto err_free_handler;
+
+	ret = imx462_check_sensor_id(imx462, client);
+	if (ret)
+		goto err_power_off;
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+	dev_err(dev, "set the video v4l2 subdev api\n");
+	sd->internal_ops = &imx462_internal_ops;
+	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
+		     V4L2_SUBDEV_FL_HAS_EVENTS;
+#endif
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	dev_err(dev, "set the media controller\n");
+	imx462->pad.flags = MEDIA_PAD_FL_SOURCE;
+	sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
+	ret = media_entity_pads_init(&sd->entity, 1, &imx462->pad);
+	if (ret < 0)
+		goto err_power_off;
+#endif
+
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(imx462->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s",
+		 imx462->module_index, facing,
+		 IMX462_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);
+	g_isHCG = false;
+#ifdef USED_SYS_DEBUG
+	add_sysfs_interfaces(dev);
+#endif
+	dev_err(dev, "v4l2 async register subdev success\n");
+	return 0;
+
+err_clean_entity:
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	media_entity_cleanup(&sd->entity);
+#endif
+err_power_off:
+	__imx462_power_off(imx462);
+err_free_handler:
+	v4l2_ctrl_handler_free(&imx462->ctrl_handler);
+err_destroy_mutex:
+	mutex_destroy(&imx462->mutex);
+
+	return ret;
+}
+
+static int imx462_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct imx462 *imx462 = to_imx462(sd);
+
+	v4l2_async_unregister_subdev(sd);
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	media_entity_cleanup(&sd->entity);
+#endif
+	v4l2_ctrl_handler_free(&imx462->ctrl_handler);
+	mutex_destroy(&imx462->mutex);
+
+	pm_runtime_disable(&client->dev);
+	if (!pm_runtime_status_suspended(&client->dev))
+		__imx462_power_off(imx462);
+	pm_runtime_set_suspended(&client->dev);
+
+	return 0;
+}
+
+#if IS_ENABLED(CONFIG_OF)
+static const struct of_device_id imx462_of_match[] = {
+	{ .compatible = "sony,imx462" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, imx462_of_match);
+#endif
+
+static const struct i2c_device_id imx462_match_id[] = {
+	{ "sony,imx462", 0 },
+	{ },
+};
+
+static struct i2c_driver imx462_i2c_driver = {
+	.driver = {
+		.name = IMX462_NAME,
+		.pm = &imx462_pm_ops,
+		.of_match_table = of_match_ptr(imx462_of_match),
+	},
+	.probe		= &imx462_probe,
+	.remove		= &imx462_remove,
+	.id_table	= imx462_match_id,
+};
+
+static int __init sensor_mod_init(void)
+{
+	return i2c_add_driver(&imx462_i2c_driver);
+}
+
+static void __exit sensor_mod_exit(void)
+{
+	i2c_del_driver(&imx462_i2c_driver);
+}
+
+device_initcall_sync(sensor_mod_init);
+module_exit(sensor_mod_exit);
+
+MODULE_DESCRIPTION("Sony imx462 sensor driver");
+MODULE_LICENSE("GPL v2");

commit b5995924b3ca7c31073c15ec38b4e492a0b38e1e
Author: Shunqing Chen <csq@rock-chips.com>
Date:   Thu May 27 19:39:09 2021 +0800

    drm: rockchip: rk618: hpd io pull down
    
    Signed-off-by: Shunqing Chen <csq@rock-chips.com>
    Change-Id: I309bc695dbd94281880ce934415c1864c5abc8c8

diff --git a/drivers/gpu/drm/rockchip/rk618/rk618_hdmi.c b/drivers/gpu/drm/rockchip/rk618/rk618_hdmi.c
index 12c9475e9d80..678b527a831a 100644
--- a/drivers/gpu/drm/rockchip/rk618/rk618_hdmi.c
+++ b/drivers/gpu/drm/rockchip/rk618/rk618_hdmi.c
@@ -1521,6 +1521,9 @@ static int rk618_hdmi_probe(struct platform_device *pdev)
 		return PTR_ERR(hdmi->clock);
 	}
 
+	/* hpd io pull down */
+	regmap_write(rk618->regmap, RK618_IO_CON0, HDMI_IO_PULL_UP_DISABLE);
+
 	rk618_hdmi_pol_init(hdmi, 0);
 	rk618_hdmi_reset(hdmi);
 

commit ce633552f78a96d620717185273b3425367c2650
Author: Liang Chen <cl@rock-chips.com>
Date:   Thu Jun 3 10:44:58 2021 +0800

    sched/core: reduce rescheduling IPI for non-preempt kernel
    
    It is not necessary to send rescheduling IPI when target cpu is not
    idle for non-preempt kernel, because the target cpu will pick all the
    tasks on the run-queue before enter idle.
    
    Test this patch on RK3568-NVR, make cpu load to 100% with command:
    
    taskset 01 yes > /dev/null &
    taskset 02 yes > /dev/null &
    taskset 04 yes > /dev/null &
    taskset 08 yes > /dev/null &
    
    So that the cpu will not enter idle.
    
    without the patch, 32 channel video@25fps:
    [root@RK356X:/]# cat /proc/interrupts | grep IPI0; sleep 10; cat /proc/interrupts | grep IPI0
    IPI0:     74204      58815      99596      81177       Rescheduling interrupts
    IPI0:     79503      76143     106149      87676       Rescheduling interrupts
    
    with the patch, 32 channel video@25fps:
    [root@RK356X:/]# cat /proc/interrupts | grep IPI0; sleep 10; cat /proc/interrupts | grep IPI0
    IPI0:     28814      59314      60173      56759       Rescheduling interrupts
    IPI0:     28814      59314      60173      56759       Rescheduling interrupts
    
    Change-Id: I0d45a3d999696503124e693e7d6e145df719174a
    Signed-off-by: Liang Chen <cl@rock-chips.com>

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 6334ed78ed5a..a8aa99caf405 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -477,7 +477,11 @@ void resched_curr(struct rq *rq)
 		return;
 	}
 
+#ifdef CONFIG_PREEMPT
 	if (set_nr_and_not_polling(curr))
+#else
+	if (set_nr_and_not_polling(curr) && (rq->curr == rq->idle))
+#endif
 		smp_send_reschedule(cpu);
 	else
 		trace_sched_wake_idle_without_ipi(cpu);

commit a6baf499976773c3bb78034163922c20f528fc3c
Author: Liang Chen <cl@rock-chips.com>
Date:   Tue Jun 1 15:12:25 2021 +0800

    arm64: dts: rockchip: rk356x: enable bus_npu for some boards
    
    Enable bus_npu so that we can enable npu@1.0G safely when necessary.
    
    Change-Id: I1a6ce1652aba7bafe91135bc79881cad0d5980ce
    Signed-off-by: Liang Chen <cl@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi
index efe739f4988e..7818060dcc0f 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi
@@ -168,6 +168,12 @@
 	};
 };
 
+&bus_npu {
+	bus-supply = <&vdd_logic>;
+	pvtm-supply = <&vdd_cpu>;
+	status = "okay";
+};
+
 &cpu0 {
 	cpu-supply = <&vdd_cpu>;
 };
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet.dts
index c3e223cd8ff2..af52a084ac7d 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet.dts
@@ -214,6 +214,12 @@
 	};
 };
 
+&bus_npu {
+	bus-supply = <&vdd_logic>;
+	pvtm-supply = <&vdd_cpu>;
+	status = "okay";
+};
+
 &cpu0 {
 	cpu-supply = <&vdd_cpu>;
 };
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi
index 7dd5524fddb6..b222f4107258 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi
@@ -177,6 +177,12 @@
 	};
 };
 
+&bus_npu {
+	bus-supply = <&vdd_logic>;
+	pvtm-supply = <&vdd_cpu>;
+	status = "okay";
+};
+
 &combphy0_us {
 	status = "okay";
 };

commit fd1e62d4913ecbdd750a1addb5a6e67beda7cdd4
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Wed Jun 2 14:17:06 2021 +0800

    Documentation: devicetree: rockchip-io-domain add rk3568 support
    
    RK3568 has 3 pmu io-domain, pmuio0/1/2, but the pmuio0 is 1.8v only, and
    pmuio1 is 3.3v only, only pmuio2 support to select 1.8v or 3.3v.
    
    RK3568 also has 7 io-domain, vccio1/2/3/4/5/6/7, but the vccio2
    defaultly selected by the FLASH_VOL_SEL(GPIO0_A7).
    
    Change-Id: I55ea1263c641112705b1443ff919c508cb3be2f0
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/Documentation/devicetree/bindings/power/rockchip-io-domain.txt b/Documentation/devicetree/bindings/power/rockchip-io-domain.txt
index eb93fba21448..c43c870e34e0 100644
--- a/Documentation/devicetree/bindings/power/rockchip-io-domain.txt
+++ b/Documentation/devicetree/bindings/power/rockchip-io-domain.txt
@@ -42,6 +42,7 @@ Required properties:
   - "rockchip,rk3368-pmu-io-voltage-domain" for rk3368 pmu-domains
   - "rockchip,rk3399-io-voltage-domain" for rk3399
   - "rockchip,rk3399-pmu-io-voltage-domain" for rk3399 pmu-domains
+  - "rockchip,rk3568-pmu-io-voltage-domain" for rk3568 pmu-domains
   - "rockchip,rv1108-io-voltage-domain" for rv1108
   - "rockchip,rv1108-pmu-io-voltage-domain" for rv1108 pmu-domains
   - "rockchip,rv1126-pmu-io-voltage-domain" for rv1126 pmu-domains
@@ -114,11 +115,22 @@ Possible supplies for rk3399:
 - bt656-supply:  The supply connected to APIO2_VDD.
 - audio-supply:  The supply connected to APIO5_VDD.
 - sdmmc-supply:  The supply connected to SDMMC0_VDD.
-- gpio1830       The supply connected to APIO4_VDD.
+- gpio1830-supply:  The supply connected to APIO4_VDD.
 
 Possible supplies for rk3399 pmu-domains:
 - pmu1830-supply:The supply connected to PMUIO2_VDD.
 
+Possible supplies for rk3568 pmu-domains:
+- vccio1-supply:The supply connected to VCCIO1.
+- vccio2-supply:The supply connected to VCCIO2, can be reserved since ignored by driver.
+- vccio3-supply:The supply connected to VCCIO3.
+- vccio4-supply:The supply connected to VCCIO4.
+- vccio5-supply:The supply connected to VCCIO5.
+- vccio6-supply:The supply connected to VCCIO6.
+- vccio7-supply:The supply connected to VCCIO7.
+- pmuio1-supply:The supply connected to PMUIO1, 3.3v only can be reserved
+- pmuio2-supply:The supply connected to PMUIO2.
+
 Possible supplies for rv1126 pmu-domains:
 - vccio1-supply:The supply connected to VCCIO1_VDD.
 - vccio2-supply:The supply connected to VCCIO2_VDD.

commit 275b0b1950baf200b899f06094529c357820707d
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Thu Jun 3 10:33:04 2021 +0800

    arm64: dts: rockchip: remove all rockchip,txclk-tapnum for rk356x
    
    We finally decide to set 16 for tx delay in driver, so no need for
    dts to set it now.
    
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: I642ed3039db5410ca478b255166d07a035e971aa

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts
index 76835f90c6e4..a72bfe1ec459 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts
@@ -1041,7 +1041,6 @@
 	supports-emmc;
 	non-removable;
 	keep-power-in-suspend;
-	rockchip,txclk-tapnum = <0x8>;
 	max-frequency = <200000000>;
 	status = "okay";
 };
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w6.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w6.dts
index abf696d333ae..27d3c69b6355 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w6.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w6.dts
@@ -894,7 +894,6 @@
 	supports-emmc;
 	non-removable;
 	keep-power-in-suspend;
-	rockchip,txclk-tapnum = <0x8>;
 	max-frequency = <200000000>;
 	status = "okay";
 };
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink.dts
index 9c81edc443f0..060dc4e40174 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink.dts
@@ -868,7 +868,6 @@
 	supports-emmc;
 	non-removable;
 	keep-power-in-suspend;
-	rockchip,txclk-tapnum = <0x8>;
 	max-frequency = <200000000>;
 	status = "okay";
 };
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-k108.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-k108.dts
index f2f7aa5e8c8b..6354ccfba93b 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-k108.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-k108.dts
@@ -1200,7 +1200,6 @@
 	bus-width = <8>;
 	supports-emmc;
 	non-removable;
-	rockchip,txclk-tapnum = <0x8>;
 	max-frequency = <200000000>;
 	status = "okay";
 };
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-rkg11.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-rkg11.dts
index e65cbd102968..85b39ecf9c79 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-rkg11.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-rkg11.dts
@@ -1106,7 +1106,6 @@
 	bus-width = <8>;
 	supports-emmc;
 	non-removable;
-	rockchip,txclk-tapnum = <0x8>;
 	max-frequency = <200000000>;
 	status = "okay";
 };
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-v10.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-v10.dts
index 700d610d4f69..fecea6b9173b 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-v10.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet-v10.dts
@@ -1118,7 +1118,6 @@
 	bus-width = <8>;
 	supports-emmc;
 	non-removable;
-	rockchip,txclk-tapnum = <0x8>;
 	max-frequency = <200000000>;
 	status = "okay";
 };
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet.dts
index 14cd97f23674..c3e223cd8ff2 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet.dts
@@ -1115,7 +1115,6 @@
 	bus-width = <8>;
 	supports-emmc;
 	non-removable;
-	rockchip,txclk-tapnum = <0x8>;
 	max-frequency = <200000000>;
 	status = "okay";
 };
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
index 8afcb855b1d1..5dd51ee7e7aa 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
@@ -1678,7 +1678,6 @@
 	bus-width = <8>;
 	supports-emmc;
 	non-removable;
-	rockchip,txclk-tapnum = <0x8>;
 	max-frequency = <200000000>;
 	status = "okay";
 };
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-iotest-ddr3-v10-linux.dts b/arch/arm64/boot/dts/rockchip/rk3568-iotest-ddr3-v10-linux.dts
index 62862f4035cf..8e4d810693da 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-iotest-ddr3-v10-linux.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3568-iotest-ddr3-v10-linux.dts
@@ -39,7 +39,6 @@
 	bus-width = <8>;
 	supports-emmc;
 	non-removable;
-	rockchip,txclk-tapnum = <0x10>;
 	max-frequency = <200000000>;
 	status = "okay";
 };

commit aa4a1a95edde7e9d30f16cc8e303ac89b383576b
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Thu Jun 3 10:28:34 2021 +0800

    mmc: sdhci-of-dwcmshc: Set default tx delay to 16
    
    According to the new test result, set tx delay to 16
    by default.
    
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: I8e0bacfbf14f8c5db60a4d56a624d63c49e23051

diff --git a/drivers/mmc/host/sdhci-of-dwcmshc.c b/drivers/mmc/host/sdhci-of-dwcmshc.c
index 92df58aee350..878a28819726 100644
--- a/drivers/mmc/host/sdhci-of-dwcmshc.c
+++ b/drivers/mmc/host/sdhci-of-dwcmshc.c
@@ -41,7 +41,7 @@
 #define DWCMSHC_EMMC_DLL_START_POINT	16
 #define DWCMSHC_EMMC_DLL_INC		8
 #define DWCMSHC_EMMC_DLL_DLYENA		BIT(27)
-#define DLL_TXCLK_TAPNUM_DEFAULT	0x8
+#define DLL_TXCLK_TAPNUM_DEFAULT	0x16
 #define DLL_STRBIN_TAPNUM_DEFAULT	0x8
 #define DLL_TXCLK_TAPNUM_FROM_SW	BIT(24)
 #define DLL_STRBIN_TAPNUM_FROM_SW	BIT(24)

commit 32c877b98b2a14e632d42dc03c3b73c4614a7e6b
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Mon May 31 15:41:03 2021 +0800

    ASoC: rockchip: i2s-tdm: Remove sync reset for latest soc
    
    Do sync reset only for PX30/RK1808/RK3308, because the BUG 'fsync
    is out of sync' had been fixed on the latest version controller.
    
    Change-Id: Ia4cd711a213cc03221726f7b6e89de3c317dc965
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/sound/soc/rockchip/rockchip_i2s_tdm.c b/sound/soc/rockchip/rockchip_i2s_tdm.c
index 3b0a957f5cc9..57c7f01a7097 100644
--- a/sound/soc/rockchip/rockchip_i2s_tdm.c
+++ b/sound/soc/rockchip/rockchip_i2s_tdm.c
@@ -1621,6 +1621,7 @@ static int rockchip_i2s_tdm_probe(struct platform_device *pdev)
 	struct snd_soc_dai_driver *soc_dai;
 	struct resource *res;
 	void __iomem *regs;
+	bool sync;
 	int ret;
 	int val;
 
@@ -1668,7 +1669,11 @@ static int rockchip_i2s_tdm_probe(struct platform_device *pdev)
 	if (IS_ERR(i2s_tdm->grf))
 		return PTR_ERR(i2s_tdm->grf);
 
-	if (i2s_tdm->clk_trcm) {
+	sync = of_device_is_compatible(node, "rockchip,px30-i2s-tdm") ||
+	       of_device_is_compatible(node, "rockchip,rk1808-i2s-tdm") ||
+	       of_device_is_compatible(node, "rockchip,rk3308-i2s-tdm");
+
+	if (i2s_tdm->clk_trcm && sync) {
 		cru_node = of_parse_phandle(node, "rockchip,cru", 0);
 		i2s_tdm->cru_base = of_iomap(cru_node, 0);
 		if (!i2s_tdm->cru_base)

commit 69d256016a91c5aa88ded53fd14b6ce7fa35b97b
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Thu May 20 15:44:23 2021 +0800

    media: rockchip: isp: isp21 get 3a stats from ddr
    
    Change-Id: I223a654d65377f866e1b71d0652f889a5ffbf079
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v21.c b/drivers/media/platform/rockchip/isp/isp_stats_v21.c
index ba55aa14880f..c51e82356603 100644
--- a/drivers/media/platform/rockchip/isp/isp_stats_v21.c
+++ b/drivers/media/platform/rockchip/isp/isp_stats_v21.c
@@ -474,10 +474,6 @@ rkisp_stats_get_rawawb_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 	u64 msb, lsb;
 	u32 i;
 
-	value = rkisp_read(stats_vdev->dev, ISP21_RAWAWB_CTRL, true);
-	if (!(value & ISP2X_3A_MEAS_DONE))
-		return -ENODATA;
-
 	if (!pbuf)
 		return 0;
 
@@ -507,32 +503,14 @@ rkisp_stats_get_rawawb_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 		rawawb->ro_yhist_bin[2 * i + 1] = (value & 0xFFFF0000) >> 16;
 	}
 
-	for (i = 0; i < ISP2X_RAWAWB_RAMDATA_NUM / 2; i++) {
-		lsb = raw_addr[4 * i];
-		msb = raw_addr[4 * i + 1];
-		rawawb->ramdata[2 * i].b = lsb & 0x3FFFF;
-		rawawb->ramdata[2 * i].g = ((lsb & 0xFFFC0000) >> 18) | (msb & 0xF) << 14;
-		rawawb->ramdata[2 * i].r = (msb & 0x3FFFF0) >> 4;
-		rawawb->ramdata[2 * i].wp = (msb & 0xFFC00000) >> 22;
-
-		lsb = ((raw_addr[4 * i + 2] & 0x3FFFFFF) << 6) |
-		      ((raw_addr[4 * i + 1] & 0xFC000000) >> 26);
-		msb = ((raw_addr[4 * i + 3] & 0x3FFFFFF) << 6) |
-		      ((raw_addr[4 * i + 2] & 0xFC000000) >> 26);
-		rawawb->ramdata[2 * i + 1].b = lsb & 0x3FFFF;
-		value = ((lsb & 0xFFFC0000) >> 18) | (msb & 0xF) << 14;
-		rawawb->ramdata[2 * i + 1].g = value;
-		rawawb->ramdata[2 * i + 1].r = (msb & 0x3FFFF0) >> 4;
-		rawawb->ramdata[2 * i + 1].wp = (msb & 0xFFC00000) >> 22;
+	for (i = 0; i < ISP2X_RAWAWB_RAMDATA_NUM; i++) {
+		lsb = raw_addr[2 * i];
+		msb = raw_addr[2 * i + 1];
+		rawawb->ramdata[i].b = lsb & 0x3FFFF;
+		rawawb->ramdata[i].g = ((lsb & 0xFFFC0000) >> 18) | (msb & 0xF) << 14;
+		rawawb->ramdata[i].r = (msb & 0x3FFFF0) >> 4;
+		rawawb->ramdata[i].wp = (msb & 0xFFC00000) >> 22;
 	}
-
-	lsb = raw_addr[4 * i];
-	msb = raw_addr[4 * i + 1];
-	rawawb->ramdata[2 * i].b = lsb & 0x3FFFF;
-	rawawb->ramdata[2 * i].g = ((lsb & 0xFFFC0000) >> 18) | (msb & 0xF) << 14;
-	rawawb->ramdata[2 * i].r = (msb & 0x3FFFF0) >> 4;
-	rawawb->ramdata[2 * i].wp = (msb & 0xFFC00000) >> 22;
-
 	return 0;
 }
 
@@ -542,12 +520,7 @@ rkisp_stats_get_rawaf_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 {
 	u32 *ddr_addr;
 	struct isp2x_rawaf_stat *af;
-	u32 value, rd_buf_idx;
-	int i;
-
-	value = rkisp_read(stats_vdev->dev, ISP_RAWAF_CTRL, true);
-	if (!(value & ISP2X_3A_MEAS_DONE))
-		return -ENODATA;
+	u32 i, rd_buf_idx;
 
 	if (!pbuf)
 		return 0;
@@ -575,9 +548,7 @@ rkisp_stats_get_rawaebig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 				  struct isp2x_rawaebig_stat *ae, u32 blk_no)
 {
 	u32 *ddr_addr;
-	u32 value, rd_buf_idx;
-	u32 addr;
-	int i;
+	u32 i, value, addr, rd_buf_idx;
 
 	rd_buf_idx = stats_vdev->rd_buf_idx;
 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr;
@@ -596,10 +567,6 @@ rkisp_stats_get_rawaebig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 		break;
 	}
 
-	value = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_CTRL, true);
-	if (!(value & ISP2X_3A_MEAS_DONE))
-		return -ENODATA;
-
 	if (!ae)
 		return 0;
 
@@ -627,31 +594,22 @@ rkisp_stats_get_rawhstbig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 				   struct isp2x_rawhistbig_stat *hst, u32 blk_no)
 {
 	u32 *ddr_addr;
-	u32 value, rd_buf_idx;
-	u32 addr;
-	int i;
+	u32 i, rd_buf_idx;
 
 	rd_buf_idx = stats_vdev->rd_buf_idx;
 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x0C00;
 
 	switch (blk_no) {
 	case 1:
-		addr = ISP_RAWHIST_BIG2_BASE;
 		ddr_addr += 0x0800 >> 2;
 		break;
 	case 2:
-		addr = ISP_RAWHIST_BIG3_BASE;
 		ddr_addr += 0x0C00 >> 2;
 		break;
 	default:
-		addr = ISP_RAWHIST_BIG1_BASE;
 		break;
 	}
 
-	value = rkisp_read(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, true);
-	if (!(value & ISP2X_3A_MEAS_DONE))
-		return -ENODATA;
-
 	if (!hst)
 		return 0;
 
@@ -665,60 +623,102 @@ static int
 rkisp_stats_get_rawae1_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 				struct rkisp_isp21_stat_buffer *pbuf)
 {
-	if (!pbuf)
-		return rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 1);
-	else
-		return rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae1, 1);
+	int ret = 0;
+
+	if (!pbuf) {
+		rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 1);
+	} else {
+		ret = rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae1, 1);
+		if (!ret)
+			pbuf->meas_type |= ISP2X_STAT_RAWAE1;
+	}
+
+	return ret;
 }
 
 static int
 rkisp_stats_get_rawhst1_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 				 struct rkisp_isp21_stat_buffer *pbuf)
 {
-	if (!pbuf)
-		return rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 1);
-	else
-		return rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist1, 1);
+	int ret = 0;
+
+	if (!pbuf) {
+		rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 1);
+	} else {
+		ret = rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist1, 1);
+		if (!ret)
+			pbuf->meas_type |= ISP2X_STAT_RAWHST1;
+	}
+
+	return ret;
 }
 
 static int
 rkisp_stats_get_rawae2_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 				struct rkisp_isp21_stat_buffer *pbuf)
 {
-	if (!pbuf)
-		return rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 2);
-	else
-		return rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae2, 2);
+	int ret = 0;
+
+	if (!pbuf) {
+		rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 2);
+	} else {
+		ret = rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae2, 2);
+		if (!ret)
+			pbuf->meas_type |= ISP2X_STAT_RAWAE2;
+	}
+
+	return ret;
 }
 
 static int
 rkisp_stats_get_rawhst2_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 				 struct rkisp_isp21_stat_buffer *pbuf)
 {
-	if (!pbuf)
-		return rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 2);
-	else
-		return rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist2, 2);
+	int ret = 0;
+
+	if (!pbuf) {
+		rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 2);
+	} else {
+		ret = rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist2, 2);
+		if (!ret)
+			pbuf->meas_type |= ISP2X_STAT_RAWHST2;
+	}
+
+	return ret;
 }
 
 static int
 rkisp_stats_get_rawae3_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 				struct rkisp_isp21_stat_buffer *pbuf)
 {
-	if (!pbuf)
-		return rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 0);
-	else
-		return rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae3, 0);
+	int ret = 0;
+
+	if (!pbuf) {
+		rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 0);
+	} else {
+		ret = rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae3, 0);
+		if (!ret)
+			pbuf->meas_type |= ISP2X_STAT_RAWAE3;
+	}
+
+	return ret;
 }
 
 static int
 rkisp_stats_get_rawhst3_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 				 struct rkisp_isp21_stat_buffer *pbuf)
 {
-	if (!pbuf)
-		return rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 0);
-	else
-		return rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist3, 0);
+	int ret = 0;
+
+	if (!pbuf) {
+		rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 0);
+	} else {
+		ret = rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist3, 0);
+		if (!ret)
+			pbuf->meas_type |= ISP2X_STAT_RAWHST3;
+	}
+
+	return ret;
 }
 
 static int
@@ -727,16 +727,12 @@ rkisp_stats_get_rawaelite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 {
 	struct isp2x_rawaelite_stat *ae;
 	u32 *ddr_addr;
-	u32 value, rd_buf_idx;
-	int i;
-
-	value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true);
-	if ((value & ISP2X_3A_MEAS_DONE) == 0)
-		return -ENODATA;
+	u32 i, value, rd_buf_idx;
 
 	if (!pbuf)
 		return 0;
 
+	pbuf->meas_type |= ISP2X_STAT_RAWAE0;
 	ae = &pbuf->params.rawae0;
 	rd_buf_idx = stats_vdev->rd_buf_idx;
 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x0AB0;
@@ -755,17 +751,12 @@ rkisp_stats_get_rawhstlite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
 				    struct rkisp_isp21_stat_buffer *pbuf)
 {
 	struct isp2x_rawhistlite_stat *hst;
-	u32 *ddr_addr;
-	u32 value, rd_buf_idx;
-	int i;
-
-	value = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, true);
-	if ((value & ISP2X_3A_MEAS_DONE) == 0)
-		return -ENODATA;
+	u32 *ddr_addr, rd_buf_idx, i;
 
 	if (!pbuf)
 		return 0;
 
+	pbuf->meas_type |= ISP2X_STAT_RAWHST0;
 	hst = &pbuf->params.rawhist0;
 	rd_buf_idx = stats_vdev->rd_buf_idx;
 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x0C00 + 0x0400;
@@ -797,8 +788,8 @@ rkisp_stats_restart_rawawb_meas(struct rkisp_isp_stats_vdev *stats_vdev)
 	u32 value;
 
 	value = rkisp_read(stats_vdev->dev, ISP21_RAWAWB_CTRL, true);
-	value |= ISP2X_3A_MEAS_DONE;
-	rkisp_write(stats_vdev->dev, ISP21_RAWAWB_CTRL, value, true);
+	if (value & ISP2X_3A_MEAS_DONE)
+		rkisp_write(stats_vdev->dev, ISP21_RAWAWB_CTRL, value, true);
 	return 0;
 }
 
@@ -808,9 +799,10 @@ rkisp_stats_restart_rawaf_meas(struct rkisp_isp_stats_vdev *stats_vdev)
 	u32 value;
 
 	value = rkisp_read(stats_vdev->dev, ISP_RAWAF_CTRL, true);
-	value |= ISP2X_3A_MEAS_DONE;
-	rkisp_write(stats_vdev->dev, ISP_RAWAF_CTRL, value, true);
-	rkisp_write(stats_vdev->dev, ISP_RAWAF_INT_STATE, 0, true);
+	if (value & ISP2X_3A_MEAS_DONE) {
+		rkisp_write(stats_vdev->dev, ISP_RAWAF_CTRL, value, true);
+		rkisp_write(stats_vdev->dev, ISP_RAWAF_INT_STATE, 0, true);
+	}
 	return 0;
 }
 
@@ -835,8 +827,8 @@ rkisp_stats_restart_rawaebig_meas(struct rkisp_isp_stats_vdev *stats_vdev, u32 b
 	}
 
 	value = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_CTRL, true);
-	value |= ISP2X_3A_MEAS_DONE;
-	rkisp_write(stats_vdev->dev, addr + RAWAE_BIG_CTRL, value, true);
+	if (value & ISP2X_3A_MEAS_DONE)
+		rkisp_write(stats_vdev->dev, addr + RAWAE_BIG_CTRL, value, true);
 	return 0;
 }
 
@@ -861,8 +853,8 @@ rkisp_stats_restart_rawhstbig_meas(struct rkisp_isp_stats_vdev *stats_vdev, u32
 	}
 
 	value = rkisp_read(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, true);
-	value |= ISP2X_3A_MEAS_DONE;
-	rkisp_write(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, value, true);
+	if (value & ISP2X_3A_MEAS_DONE)
+		rkisp_write(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, value, true);
 	return 0;
 }
 
@@ -908,8 +900,8 @@ rkisp_stats_restart_rawae0_meas(struct rkisp_isp_stats_vdev *stats_vdev)
 	u32 value;
 
 	value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true);
-	value |= ISP2X_3A_MEAS_DONE;
-	rkisp_write(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, value, true);
+	if (value & ISP2X_3A_MEAS_DONE)
+		rkisp_write(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, value, true);
 	return 0;
 }
 
@@ -919,13 +911,28 @@ rkisp_stats_restart_rawhst0_meas(struct rkisp_isp_stats_vdev *stats_vdev)
 	u32 value;
 
 	value = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, true);
-	value |= ISP2X_3A_MEAS_DONE;
-	rkisp_write(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, value, true);
+	if (value & ISP2X_3A_MEAS_DONE)
+		rkisp_write(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, value, true);
 	return 0;
 }
 
 static void
-rkisp_stats_send_meas_v2x(struct rkisp_isp_stats_vdev *stats_vdev,
+rkisp_stats_restart_meas(struct rkisp_isp_stats_vdev *stats_vdev)
+{
+	rkisp_stats_restart_rawawb_meas(stats_vdev);
+	rkisp_stats_restart_rawaf_meas(stats_vdev);
+	rkisp_stats_restart_rawae1_meas(stats_vdev);
+	rkisp_stats_restart_rawae2_meas(stats_vdev);
+	rkisp_stats_restart_rawae3_meas(stats_vdev);
+	rkisp_stats_restart_rawae0_meas(stats_vdev);
+	rkisp_stats_restart_rawhst1_meas(stats_vdev);
+	rkisp_stats_restart_rawhst2_meas(stats_vdev);
+	rkisp_stats_restart_rawhst3_meas(stats_vdev);
+	rkisp_stats_restart_rawhst0_meas(stats_vdev);
+}
+
+static void
+rkisp_stats_send_meas_v21(struct rkisp_isp_stats_vdev *stats_vdev,
 			  struct rkisp_isp_readout_work *meas_work)
 {
 	unsigned int cur_frame_id = -1;
@@ -1004,18 +1011,7 @@ rkisp_stats_send_meas_v2x(struct rkisp_isp_stats_vdev *stats_vdev,
 		ret |= ops->get_dhaz_stats(stats_vdev, cur_stat_buf);
 	}
 
-	if (!ret) {
-		rkisp_stats_restart_rawawb_meas(stats_vdev);
-		rkisp_stats_restart_rawaf_meas(stats_vdev);
-		rkisp_stats_restart_rawae1_meas(stats_vdev);
-		rkisp_stats_restart_rawae2_meas(stats_vdev);
-		rkisp_stats_restart_rawae3_meas(stats_vdev);
-		rkisp_stats_restart_rawae0_meas(stats_vdev);
-		rkisp_stats_restart_rawhst1_meas(stats_vdev);
-		rkisp_stats_restart_rawhst2_meas(stats_vdev);
-		rkisp_stats_restart_rawhst3_meas(stats_vdev);
-		rkisp_stats_restart_rawhst0_meas(stats_vdev);
-	}
+	rkisp_stats_restart_meas(stats_vdev);
 
 	if (cur_buf && !ret) {
 		vb2_set_plane_payload(&cur_buf->vb.vb2_buf, 0,
@@ -1030,64 +1026,21 @@ rkisp_stats_send_meas_v2x(struct rkisp_isp_stats_vdev *stats_vdev,
 }
 
 static void
-rkisp_stats_clr_3a_isr(struct rkisp_isp_stats_vdev *stats_vdev,
-		u32 isp_ris, u32 isp3a_ris)
-{
-	struct rkisp_stats_v21_ops *ops =
-		(struct rkisp_stats_v21_ops *)stats_vdev->priv_ops;
-
-	if (isp3a_ris & ISP2X_3A_RAWAWB)
-		ops->get_rawawb_meas(stats_vdev, NULL);
-
-	if (isp3a_ris & ISP2X_3A_RAWAF)
-		ops->get_rawaf_meas(stats_vdev, NULL);
-
-	if (isp3a_ris & ISP2X_3A_RAWAE_BIG)
-		ops->get_rawae3_meas(stats_vdev, NULL);
-
-	if (isp3a_ris & ISP2X_3A_RAWHIST_BIG)
-		ops->get_rawhst3_meas(stats_vdev, NULL);
-
-	if (isp3a_ris & ISP2X_3A_RAWAE_CH0)
-		ops->get_rawae0_meas(stats_vdev, NULL);
-
-	if (isp3a_ris & ISP2X_3A_RAWAE_CH1)
-		ops->get_rawae1_meas(stats_vdev, NULL);
-
-	if (isp3a_ris & ISP2X_3A_RAWAE_CH2)
-		ops->get_rawae2_meas(stats_vdev, NULL);
-
-	if (isp3a_ris & ISP2X_3A_RAWHIST_CH0)
-		ops->get_rawhst0_meas(stats_vdev, NULL);
-
-	if (isp3a_ris & ISP2X_3A_RAWHIST_CH1)
-		ops->get_rawhst1_meas(stats_vdev, NULL);
-
-	if (isp3a_ris & ISP2X_3A_RAWHIST_CH2)
-		ops->get_rawhst2_meas(stats_vdev, NULL);
-}
-
-static void
-rkisp_stats_isr_v2x(struct rkisp_isp_stats_vdev *stats_vdev,
+rkisp_stats_isr_v21(struct rkisp_isp_stats_vdev *stats_vdev,
 		    u32 isp_ris, u32 isp3a_ris)
 {
 	struct rkisp_device *dev = stats_vdev->dev;
-	u32 isp_mis_tmp = 0;
 	struct rkisp_isp_readout_work work;
-	u32 cur_frame_id;
 	u32 iq_isr_mask = ISP2X_SIAWB_DONE | ISP2X_SIAF_FIN |
 		ISP2X_YUVAE_END | ISP2X_SIHST_RDY | ISP2X_AFM_SUM_OF | ISP2X_AFM_LUM_OF;
-	u32 iq_3a_mask = 0;
-	u32 hdl_ris, hdl_3aris, unhdl_ris, unhdl_3aris;
-	u32 wr_buf_idx;
-	u32 temp_isp_ris, temp_isp3a_ris;
+	u32 cur_frame_id, isp_mis_tmp = 0, iq_3a_mask = 0;
+	u32 wr_buf_idx, temp_isp_ris, temp_isp3a_ris;
 
 	rkisp_dmarx_get_frame(stats_vdev->dev, &cur_frame_id, NULL, NULL, true);
-#ifdef LOG_ISR_EXE_TIME
-	ktime_t in_t = ktime_get();
-#endif
+
 	if (IS_HDR_RDBK(dev->hdr.op_mode))
 		iq_3a_mask = ISP2X_3A_RAWAE_BIG;
+
 	spin_lock(&stats_vdev->irq_lock);
 
 	temp_isp_ris = rkisp_read(stats_vdev->dev, ISP_ISP_RIS, true);
@@ -1120,7 +1073,7 @@ rkisp_stats_isr_v2x(struct rkisp_isp_stats_vdev *stats_vdev,
 	if ((isp_ris & ISP2X_FRAME) && stats_vdev->rd_stats_from_ddr) {
 		wr_buf_idx = stats_vdev->wr_buf_idx;
 		stats_vdev->rd_buf_idx = wr_buf_idx;
-
+		rkisp_finish_buffer(dev, &stats_vdev->stats_buf[wr_buf_idx]);
 		wr_buf_idx = (wr_buf_idx + 1) % RKISP_STATS_DDR_BUF_NUM;
 		stats_vdev->wr_buf_idx = wr_buf_idx;
 		rkisp_write(stats_vdev->dev, MI_DBR_WR_SIZE,
@@ -1131,16 +1084,6 @@ rkisp_stats_isr_v2x(struct rkisp_isp_stats_vdev *stats_vdev,
 			       SW_3A_DDR_WRITE_EN, false);
 	}
 
-	unhdl_ris = 0;
-	unhdl_3aris = 0;
-	if (stats_vdev->rdbk_mode) {
-		hdl_ris = isp_ris & ~stats_vdev->isp_rdbk;
-		hdl_3aris = isp3a_ris & ~stats_vdev->isp3a_rdbk;
-		unhdl_ris = isp_ris & stats_vdev->isp_rdbk;
-		unhdl_3aris = isp3a_ris & stats_vdev->isp3a_rdbk;
-		stats_vdev->isp_rdbk |= hdl_ris;
-		stats_vdev->isp3a_rdbk |= hdl_3aris;
-	}
 
 	if (isp_ris & CIF_ISP_FRAME) {
 		work.readout = RKISP_ISP_READOUT_MEAS;
@@ -1149,47 +1092,15 @@ rkisp_stats_isr_v2x(struct rkisp_isp_stats_vdev *stats_vdev,
 		work.isp3a_ris = temp_isp3a_ris | iq_3a_mask;
 		work.timestamp = ktime_get_ns();
 
-		if (!IS_HDR_RDBK(dev->hdr.op_mode)) {
-			if (!kfifo_is_full(&stats_vdev->rd_kfifo))
-				kfifo_in(&stats_vdev->rd_kfifo,
-					 &work, sizeof(work));
-			else
-				v4l2_err(stats_vdev->vnode.vdev.v4l2_dev,
-					 "stats kfifo is full\n");
-
-			tasklet_schedule(&stats_vdev->rd_tasklet);
-		} else {
-			rkisp_stats_send_meas_v2x(stats_vdev, &work);
-		}
+		rkisp_stats_send_meas_v21(stats_vdev, &work);
 	}
 
-	/*
-	 * The last time that rx perform 'back read' don't clear done flag
-	 * in advance, otherwise the statistics will be abnormal.
-	 */
-	if (!(isp3a_ris & ISP2X_3A_RAWAE_BIG) ||
-	    stats_vdev->dev->params_vdev.rdbk_times > 1)
-		rkisp_stats_clr_3a_isr(stats_vdev, unhdl_ris, unhdl_3aris);
-
-#ifdef LOG_ISR_EXE_TIME
-	if (isp_ris & iq_isr_mask) {
-		unsigned int diff_us =
-		    ktime_to_us(ktime_sub(ktime_get(), in_t));
-
-		if (diff_us > g_longest_isr_time)
-			g_longest_isr_time = diff_us;
-
-		v4l2_info(stats_vdev->vnode.vdev.v4l2_dev,
-			  "isp_isr time %d %d\n", diff_us, g_longest_isr_time);
-	}
-#endif
-
 unlock:
 	spin_unlock(&stats_vdev->irq_lock);
 }
 
 static void
-rkisp_stats_rdbk_enable_v2x(struct rkisp_isp_stats_vdev *stats_vdev, bool en)
+rkisp_stats_rdbk_enable_v21(struct rkisp_isp_stats_vdev *stats_vdev, bool en)
 {
 	if (!en) {
 		stats_vdev->isp_rdbk = 0;
@@ -1200,16 +1111,22 @@ rkisp_stats_rdbk_enable_v2x(struct rkisp_isp_stats_vdev *stats_vdev, bool en)
 }
 
 static struct rkisp_isp_stats_ops rkisp_isp_stats_ops_tbl = {
-	.isr_hdl = rkisp_stats_isr_v2x,
-	.send_meas = rkisp_stats_send_meas_v2x,
-	.rdbk_enable = rkisp_stats_rdbk_enable_v2x,
+	.isr_hdl = rkisp_stats_isr_v21,
+	.send_meas = rkisp_stats_send_meas_v21,
+	.rdbk_enable = rkisp_stats_rdbk_enable_v21,
 };
 
 void rkisp_stats_first_ddr_config_v21(struct rkisp_isp_stats_vdev *stats_vdev)
 {
-	if (stats_vdev->rd_stats_from_ddr) {
-		stats_vdev->wr_buf_idx = 0;
+	stats_vdev->rd_stats_from_ddr = false;
+	stats_vdev->priv_ops = &rkisp_stats_reg_ops_v21;
+
+	if (!IS_HDR_RDBK(stats_vdev->dev->hdr.op_mode) &&
+	    stats_vdev->stats_buf[0].mem_priv) {
+		stats_vdev->priv_ops = &rkisp_stats_ddr_ops_v21;
+		stats_vdev->rd_stats_from_ddr = true;
 		stats_vdev->rd_buf_idx = 0;
+		stats_vdev->wr_buf_idx = 0;
 
 		rkisp_write(stats_vdev->dev, MI_DBR_WR_SIZE,
 			    RKISP_RD_STATS_BUF_SIZE, false);
@@ -1222,6 +1139,8 @@ void rkisp_stats_first_ddr_config_v21(struct rkisp_isp_stats_vdev *stats_vdev)
 
 void rkisp_init_stats_vdev_v21(struct rkisp_isp_stats_vdev *stats_vdev)
 {
+	int i;
+
 	stats_vdev->vdev_fmt.fmt.meta.dataformat =
 		V4L2_META_FMT_RK_ISP1_STAT_3A;
 	stats_vdev->vdev_fmt.fmt.meta.buffersize =
@@ -1229,22 +1148,13 @@ void rkisp_init_stats_vdev_v21(struct rkisp_isp_stats_vdev *stats_vdev)
 
 	stats_vdev->ops = &rkisp_isp_stats_ops_tbl;
 	stats_vdev->priv_ops = &rkisp_stats_reg_ops_v21;
+	stats_vdev->rd_stats_from_ddr = false;
 
-#ifdef RKISP_RD_STATS_FROM_DDR
-	{
-		int i;
-
-		stats_vdev->priv_ops = &rkisp_stats_ddr_ops_v21;
-		stats_vdev->rd_stats_from_ddr = true;
-		stats_vdev->rd_buf_idx = 0;
-		stats_vdev->wr_buf_idx = 0;
-		for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) {
-			stats_vdev->stats_buf[i].is_need_vaddr = true;
-			stats_vdev->stats_buf[i].size = RKISP_RD_STATS_BUF_SIZE;
-			rkisp_alloc_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]);
-		}
+	for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) {
+		stats_vdev->stats_buf[i].is_need_vaddr = true;
+		stats_vdev->stats_buf[i].size = RKISP_RD_STATS_BUF_SIZE;
+		rkisp_alloc_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]);
 	}
-#endif
 }
 
 void rkisp_uninit_stats_vdev_v21(struct rkisp_isp_stats_vdev *stats_vdev)
diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v21.h b/drivers/media/platform/rockchip/isp/isp_stats_v21.h
index d3df57426c9a..da9acd99234a 100644
--- a/drivers/media/platform/rockchip/isp/isp_stats_v21.h
+++ b/drivers/media/platform/rockchip/isp/isp_stats_v21.h
@@ -9,7 +9,6 @@
 #include <linux/kfifo.h>
 #include "common.h"
 
-//#define RKISP_RD_STATS_FROM_DDR
 #define RKISP_RD_STATS_BUF_SIZE		0x35000
 
 struct rkisp_isp_stats_vdev;
diff --git a/drivers/media/platform/rockchip/isp/procfs.c b/drivers/media/platform/rockchip/isp/procfs.c
index c317595937f7..0ce3eb390fe6 100644
--- a/drivers/media/platform/rockchip/isp/procfs.c
+++ b/drivers/media/platform/rockchip/isp/procfs.c
@@ -155,7 +155,7 @@ static void isp21_show(struct rkisp_device *dev, struct seq_file *p)
 		(val & 1) ? "ON" : "OFF", val,
 		effect[(val & CIF_IMG_EFF_CTRL_MODE_MASK) >> 1]);
 	val = rkisp_read(dev, ISP21_DRC_CTRL0, false);
-	seq_printf(p, "%-10s %s(0x%x)\n", "HDRTMO", (val & 1) ? "ON" : "OFF", val);
+	seq_printf(p, "%-10s %s(0x%x)\n", "HDRDRC", (val & 1) ? "ON" : "OFF", val);
 	val = rkisp_read(dev, ISP_HDRMGE_CTRL, false);
 	seq_printf(p, "%-10s %s(0x%x)\n", "HDRMGE", (val & 1) ? "ON" : "OFF", val);
 	val = rkisp_read(dev, ISP21_BAYNR_CTRL, false);

commit a396d69b9e6ccc8f5f75054cb53ecf3449741e9b
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Fri May 7 15:20:47 2021 +0800

    media: rockchip: isp: apply en params if no match for isp21
    
    Change-Id: I72bf7551ac78d035561405d9a61bb40990925085
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/isp_params_v21.c b/drivers/media/platform/rockchip/isp/isp_params_v21.c
index 0369b19693c1..e955e80ca4b9 100644
--- a/drivers/media/platform/rockchip/isp/isp_params_v21.c
+++ b/drivers/media/platform/rockchip/isp/isp_params_v21.c
@@ -621,7 +621,7 @@ isp_lsc_matrix_cfg_ddr(struct rkisp_isp_params_vdev *params_vdev,
 				0);
 		vaddr[3][index[3]++] = data;
 	}
-
+	rkisp_prepare_buffer(params_vdev->dev, &priv_val->buf_lsclut[buf_idx]);
 	data = priv_val->buf_lsclut[buf_idx].dma_addr;
 	rkisp_iowrite32(params_vdev, data, MI_LUT_LSC_RD_BASE);
 	rkisp_iowrite32(params_vdev, RKISP_PARAM_LSC_LUT_BUF_SIZE, MI_LUT_LSC_RD_WSIZE);
@@ -671,13 +671,11 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev,
 
 	/* restore the lsc ctrl status */
 	if (lsc_ctrl & ISP_LSC_EN) {
-		isp_param_set_bits(params_vdev,
-				   ISP_LSC_CTRL,
-				   ISP_LSC_EN);
+		if (!IS_HDR_RDBK(dev->rd_mode))
+			lsc_ctrl |= ISP_LSC_LUT_EN;
+		isp_param_set_bits(params_vdev, ISP_LSC_CTRL, lsc_ctrl);
 	} else {
-		isp_param_clear_bits(params_vdev,
-				     ISP_LSC_CTRL,
-				     ISP_LSC_EN);
+		isp_param_clear_bits(params_vdev, ISP_LSC_CTRL, ISP_LSC_EN);
 	}
 
 	params_vdev->cur_lsccfg = *arg;
@@ -2746,7 +2744,7 @@ isp_3dlut_config(struct rkisp_isp_params_vdev *params_vdev,
 		data[i] = (arg->lut_b[i] & 0x3FF) |
 			  (arg->lut_g[i] & 0xFFF) << 10 |
 			  (arg->lut_r[i] & 0x3FF) << 22;
-
+	rkisp_prepare_buffer(params_vdev->dev, &priv_val->buf_3dlut[buf_idx]);
 	value = priv_val->buf_3dlut[buf_idx].dma_addr;
 	rkisp_iowrite32(params_vdev, value, MI_LUT_3D_RD_BASE);
 	rkisp_iowrite32(params_vdev, arg->actual_size, MI_LUT_3D_RD_WSIZE);
@@ -2818,7 +2816,7 @@ isp_ldch_config(struct rkisp_isp_params_vdev *params_vdev,
 	ldch_head = (struct isp2x_ldch_head *)priv_val->buf_ldch[buf_idx].vaddr;
 	ldch_head->stat = LDCH_BUF_CHIPINUSE;
 	priv_val->buf_ldch_idx = buf_idx;
-
+	rkisp_prepare_buffer(dev, &priv_val->buf_ldch[buf_idx]);
 	value = priv_val->buf_ldch[buf_idx].dma_addr + ldch_head->data_oft;
 	rkisp_iowrite32(params_vdev, value, MI_LUT_LDCH_RD_BASE);
 	rkisp_iowrite32(params_vdev, arg->hsize, MI_LUT_LDCH_RD_H_WSIZE);
@@ -3418,293 +3416,187 @@ void __isp_isr_other_config(struct rkisp_isp_params_vdev *params_vdev,
 			    const struct isp21_isp_params_cfg *new_params,
 			    enum rkisp_params_type type)
 {
-	u64 module_en_update, module_cfg_update, module_ens;
 	struct rkisp_isp_params_v21_ops *ops =
 		(struct rkisp_isp_params_v21_ops *)params_vdev->priv_ops;
-	struct rkisp_isp_params_val_v21 *priv_val =
-		(struct rkisp_isp_params_val_v21 *)params_vdev->priv_val;
-	struct rkisp_device *ispdev = params_vdev->dev;
-	bool is_feature_on = ispdev->hw_dev->is_feature_on;
-	u64 iq_feature = ispdev->hw_dev->iq_feature;
-
-	module_en_update = new_params->module_en_update;
-	module_cfg_update = new_params->module_cfg_update;
-	module_ens = new_params->module_ens;
-
-	if (is_feature_on) {
-		module_en_update &= ~ISP2X_MODULE_HDRMGE;
-		if (module_en_update & ~iq_feature) {
-			dev_err(ispdev->dev,
-				"some iq features(0x%llx, 0x%llx) are not supported\n",
-				module_en_update, iq_feature);
-			module_en_update &= iq_feature;
-		}
-	}
+	u64 module_cfg_update = new_params->module_cfg_update;
 
 	if (type == RKISP_PARAMS_SHD) {
-		if ((module_en_update & ISP2X_MODULE_HDRMGE) ||
-		    (module_cfg_update & ISP2X_MODULE_HDRMGE)) {
-			if ((module_cfg_update & ISP2X_MODULE_HDRMGE))
-				ops->hdrmge_config(params_vdev,
-					&new_params->others.hdrmge_cfg, type);
-
-			if (module_en_update & ISP2X_MODULE_HDRMGE) {
-				ops->hdrmge_enable(params_vdev,
-					!!(module_ens & ISP2X_MODULE_HDRMGE));
-				priv_val->mge_en = !!(module_ens & ISP2X_MODULE_HDRMGE);
-			}
-		}
-
-		if ((module_en_update & ISP2X_MODULE_DRC) ||
-		    (module_cfg_update & ISP2X_MODULE_DRC)) {
-			if ((module_cfg_update & ISP2X_MODULE_DRC))
-				ops->hdrdrc_config(params_vdev,
-					&new_params->others.drc_cfg, type);
-
-			if (module_en_update & ISP2X_MODULE_DRC)
-				ops->hdrdrc_enable(params_vdev,
-					!!(module_ens & ISP2X_MODULE_DRC));
-		}
+		if ((module_cfg_update & ISP2X_MODULE_HDRMGE))
+			ops->hdrmge_config(params_vdev, &new_params->others.hdrmge_cfg, type);
 
+		if ((module_cfg_update & ISP2X_MODULE_DRC))
+			ops->hdrdrc_config(params_vdev, &new_params->others.drc_cfg, type);
 		return;
 	}
 
-	if ((module_en_update & ISP2X_MODULE_DPCC) ||
-	    (module_cfg_update & ISP2X_MODULE_DPCC)) {
-		if ((module_cfg_update & ISP2X_MODULE_DPCC))
-			ops->dpcc_config(params_vdev,
-				&new_params->others.dpcc_cfg);
+	if ((module_cfg_update & ISP2X_MODULE_DPCC))
+		ops->dpcc_config(params_vdev, &new_params->others.dpcc_cfg);
 
-		if (module_en_update & ISP2X_MODULE_DPCC)
-			ops->dpcc_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_DPCC));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_BLS))
+		ops->bls_config(params_vdev, &new_params->others.bls_cfg);
 
-	if ((module_en_update & ISP2X_MODULE_BLS) ||
-	    (module_cfg_update & ISP2X_MODULE_BLS)) {
-		if ((module_cfg_update & ISP2X_MODULE_BLS))
-			ops->bls_config(params_vdev,
-				&new_params->others.bls_cfg);
+	if ((module_cfg_update & ISP2X_MODULE_SDG))
+		ops->sdg_config(params_vdev, &new_params->others.sdg_cfg);
 
-		if (module_en_update & ISP2X_MODULE_BLS)
-			ops->bls_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_BLS));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_LSC))
+		ops->lsc_config(params_vdev, &new_params->others.lsc_cfg);
 
-	if ((module_en_update & ISP2X_MODULE_SDG) ||
-	    (module_cfg_update & ISP2X_MODULE_SDG)) {
-		if ((module_cfg_update & ISP2X_MODULE_SDG))
-			ops->sdg_config(params_vdev,
-				&new_params->others.sdg_cfg);
+	if ((module_cfg_update & ISP2X_MODULE_AWB_GAIN))
+		ops->awbgain_config(params_vdev, &new_params->others.awb_gain_cfg);
 
-		if (module_en_update & ISP2X_MODULE_SDG)
-			ops->sdg_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_SDG));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_DEBAYER))
+		ops->debayer_config(params_vdev, &new_params->others.debayer_cfg);
 
-	if ((module_en_update & ISP2X_MODULE_LSC) ||
-	    (module_cfg_update & ISP2X_MODULE_LSC)) {
-		if ((module_cfg_update & ISP2X_MODULE_LSC))
-			ops->lsc_config(params_vdev,
-				&new_params->others.lsc_cfg);
+	if ((module_cfg_update & ISP2X_MODULE_CCM))
+		ops->ccm_config(params_vdev, &new_params->others.ccm_cfg);
 
-		if (module_en_update & ISP2X_MODULE_LSC) {
-			ops->lsc_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_LSC));
-			priv_val->lsc_en = !!(module_ens & ISP2X_MODULE_LSC);
-		}
-	}
+	if ((module_cfg_update & ISP2X_MODULE_GOC))
+		ops->goc_config(params_vdev, &new_params->others.gammaout_cfg);
 
-	if ((module_en_update & ISP2X_MODULE_AWB_GAIN) ||
-	    (module_cfg_update & ISP2X_MODULE_AWB_GAIN)) {
-		if ((module_cfg_update & ISP2X_MODULE_AWB_GAIN))
-			ops->awbgain_config(params_vdev,
-				&new_params->others.awb_gain_cfg);
+	if ((module_cfg_update & ISP2X_MODULE_CPROC))
+		ops->cproc_config(params_vdev, &new_params->others.cproc_cfg);
 
-		if (module_en_update & ISP2X_MODULE_AWB_GAIN)
-			ops->awbgain_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_AWB_GAIN));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_IE))
+		ops->ie_config(params_vdev, &new_params->others.ie_cfg);
 
-	if ((module_en_update & ISP2X_MODULE_DEBAYER) ||
-	    (module_cfg_update & ISP2X_MODULE_DEBAYER)) {
-		if ((module_cfg_update & ISP2X_MODULE_DEBAYER))
-			ops->debayer_config(params_vdev,
-				&new_params->others.debayer_cfg);
+	if ((module_cfg_update & ISP2X_MODULE_HDRMGE))
+		ops->hdrmge_config(params_vdev, &new_params->others.hdrmge_cfg, type);
 
-		if (module_en_update & ISP2X_MODULE_DEBAYER)
-			ops->debayer_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_DEBAYER));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_DRC))
+		ops->hdrdrc_config(params_vdev, &new_params->others.drc_cfg, type);
 
-	if ((module_en_update & ISP2X_MODULE_CCM) ||
-	    (module_cfg_update & ISP2X_MODULE_CCM)) {
-		if ((module_cfg_update & ISP2X_MODULE_CCM))
-			ops->ccm_config(params_vdev,
-				&new_params->others.ccm_cfg);
+	if ((module_cfg_update & ISP2X_MODULE_GIC))
+		ops->gic_config(params_vdev, &new_params->others.gic_cfg);
 
-		if (module_en_update & ISP2X_MODULE_CCM)
-			ops->ccm_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_CCM));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_DHAZ))
+		ops->dhaz_config(params_vdev, &new_params->others.dhaz_cfg);
 
-	if ((module_en_update & ISP2X_MODULE_GOC) ||
-	    (module_cfg_update & ISP2X_MODULE_GOC)) {
-		if ((module_cfg_update & ISP2X_MODULE_GOC))
-			ops->goc_config(params_vdev,
-				&new_params->others.gammaout_cfg);
+	if ((module_cfg_update & ISP2X_MODULE_3DLUT))
+		ops->isp3dlut_config(params_vdev, &new_params->others.isp3dlut_cfg);
 
-		if (module_en_update & ISP2X_MODULE_GOC)
-			ops->goc_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_GOC));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_LDCH))
+		ops->ldch_config(params_vdev, &new_params->others.ldch_cfg);
 
-	if ((module_en_update & ISP2X_MODULE_CPROC) ||
-	    (module_cfg_update & ISP2X_MODULE_CPROC)) {
-		if ((module_cfg_update & ISP2X_MODULE_CPROC))
-			ops->cproc_config(params_vdev,
-				&new_params->others.cproc_cfg);
+	if ((module_cfg_update & ISP2X_MODULE_YNR))
+		ops->ynr_config(params_vdev, &new_params->others.ynr_cfg);
 
-		if (module_en_update & ISP2X_MODULE_CPROC)
-			ops->cproc_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_CPROC));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_CNR))
+		ops->cnr_config(params_vdev, &new_params->others.cnr_cfg);
 
-	if ((module_en_update & ISP2X_MODULE_IE) ||
-	    (module_cfg_update & ISP2X_MODULE_IE)) {
-		if ((module_cfg_update & ISP2X_MODULE_IE))
-			ops->ie_config(params_vdev,
-				&new_params->others.ie_cfg);
+	if ((module_cfg_update & ISP2X_MODULE_SHARP))
+		ops->sharp_config(params_vdev, &new_params->others.sharp_cfg);
 
-		if (module_en_update & ISP2X_MODULE_IE)
-			ops->ie_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_IE));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_BAYNR))
+		ops->baynr_config(params_vdev, &new_params->others.baynr_cfg);
 
-	if ((module_en_update & ISP2X_MODULE_HDRMGE) ||
-	    (module_cfg_update & ISP2X_MODULE_HDRMGE)) {
-		if ((module_cfg_update & ISP2X_MODULE_HDRMGE))
-			ops->hdrmge_config(params_vdev,
-				&new_params->others.hdrmge_cfg, type);
+	if ((module_cfg_update & ISP2X_MODULE_BAY3D))
+		ops->bay3d_config(params_vdev, &new_params->others.bay3d_cfg);
+}
+
+static __maybe_unused
+void __isp_isr_other_en(struct rkisp_isp_params_vdev *params_vdev,
+			const struct isp21_isp_params_cfg *new_params,
+			enum rkisp_params_type type)
+{
+	struct rkisp_isp_params_v21_ops *ops =
+		(struct rkisp_isp_params_v21_ops *)params_vdev->priv_ops;
+	struct rkisp_isp_params_val_v21 *priv_val =
+		(struct rkisp_isp_params_val_v21 *)params_vdev->priv_val;
+	struct rkisp_device *ispdev = params_vdev->dev;
+	bool is_feature_on = ispdev->hw_dev->is_feature_on;
+	u64 iq_feature = ispdev->hw_dev->iq_feature;
+	u64 module_en_update = new_params->module_en_update;
+	u64 module_ens = new_params->module_ens;
 
-		if (module_en_update & ISP2X_MODULE_HDRMGE) {
-			ops->hdrmge_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_HDRMGE));
-			priv_val->mge_en = !!(module_ens & ISP2X_MODULE_HDRMGE);
+	if (type == RKISP_PARAMS_SHD)
+		return;
+
+	if (is_feature_on) {
+		module_en_update &= ~ISP2X_MODULE_HDRMGE;
+		if (module_en_update & ~iq_feature) {
+			dev_err(ispdev->dev,
+				"some iq features(0x%llx, 0x%llx) are not supported\n",
+				module_en_update, iq_feature);
+			module_en_update &= iq_feature;
 		}
 	}
 
-	if ((module_en_update & ISP2X_MODULE_DRC) ||
-	    (module_cfg_update & ISP2X_MODULE_DRC)) {
-		if ((module_cfg_update & ISP2X_MODULE_DRC))
-			ops->hdrdrc_config(params_vdev,
-				&new_params->others.drc_cfg, type);
-
-		if (module_en_update & ISP2X_MODULE_DRC)
-			ops->hdrdrc_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_DRC));
+	if (module_en_update & ISP2X_MODULE_HDRMGE) {
+		ops->hdrmge_enable(params_vdev, !!(module_ens & ISP2X_MODULE_HDRMGE));
+		priv_val->mge_en = !!(module_ens & ISP2X_MODULE_HDRMGE);
 	}
 
-	if ((module_en_update & ISP2X_MODULE_GIC) ||
-	    (module_cfg_update & ISP2X_MODULE_GIC)) {
-		if ((module_cfg_update & ISP2X_MODULE_GIC))
-			ops->gic_config(params_vdev,
-				&new_params->others.gic_cfg);
+	if (module_en_update & ISP2X_MODULE_DRC)
+		ops->hdrdrc_enable(params_vdev, !!(module_ens & ISP2X_MODULE_DRC));
 
-		if (module_en_update & ISP2X_MODULE_GIC)
-			ops->gic_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_GIC));
-	}
+	if (module_en_update & ISP2X_MODULE_DPCC)
+		ops->dpcc_enable(params_vdev, !!(module_ens & ISP2X_MODULE_DPCC));
 
-	if ((module_en_update & ISP2X_MODULE_DHAZ) ||
-	    (module_cfg_update & ISP2X_MODULE_DHAZ)) {
-		if ((module_cfg_update & ISP2X_MODULE_DHAZ))
-			ops->dhaz_config(params_vdev,
-				&new_params->others.dhaz_cfg);
+	if (module_en_update & ISP2X_MODULE_BLS)
+		ops->bls_enable(params_vdev, !!(module_ens & ISP2X_MODULE_BLS));
 
-		if (module_en_update & ISP2X_MODULE_DHAZ) {
-			ops->dhaz_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_DHAZ));
-			priv_val->dhaz_en = !!(module_ens & ISP2X_MODULE_DHAZ);
-		}
+	if (module_en_update & ISP2X_MODULE_SDG)
+		ops->sdg_enable(params_vdev, !!(module_ens & ISP2X_MODULE_SDG));
+
+	if (module_en_update & ISP2X_MODULE_LSC) {
+		ops->lsc_enable(params_vdev, !!(module_ens & ISP2X_MODULE_LSC));
+		priv_val->lsc_en = !!(module_ens & ISP2X_MODULE_LSC);
 	}
 
-	if ((module_en_update & ISP2X_MODULE_3DLUT) ||
-	    (module_cfg_update & ISP2X_MODULE_3DLUT)) {
-		if ((module_cfg_update & ISP2X_MODULE_3DLUT))
-			ops->isp3dlut_config(params_vdev,
-				&new_params->others.isp3dlut_cfg);
+	if (module_en_update & ISP2X_MODULE_AWB_GAIN)
+		ops->awbgain_enable(params_vdev, !!(module_ens & ISP2X_MODULE_AWB_GAIN));
 
-		if (module_en_update & ISP2X_MODULE_3DLUT)
-			ops->isp3dlut_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_3DLUT));
-	}
+	if (module_en_update & ISP2X_MODULE_DEBAYER)
+		ops->debayer_enable(params_vdev, !!(module_ens & ISP2X_MODULE_DEBAYER));
 
-	if ((module_en_update & ISP2X_MODULE_LDCH) ||
-	    (module_cfg_update & ISP2X_MODULE_LDCH)) {
-		if ((module_cfg_update & ISP2X_MODULE_LDCH))
-			ops->ldch_config(params_vdev,
-				&new_params->others.ldch_cfg);
+	if (module_en_update & ISP2X_MODULE_CCM)
+		ops->ccm_enable(params_vdev, !!(module_ens & ISP2X_MODULE_CCM));
 
-		if (module_en_update & ISP2X_MODULE_LDCH)
-			ops->ldch_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_LDCH));
-	}
+	if (module_en_update & ISP2X_MODULE_GOC)
+		ops->goc_enable(params_vdev, !!(module_ens & ISP2X_MODULE_GOC));
 
-	if ((module_en_update & ISP2X_MODULE_YNR) ||
-	    (module_cfg_update & ISP2X_MODULE_YNR)) {
-		if ((module_cfg_update & ISP2X_MODULE_YNR))
-			ops->ynr_config(params_vdev,
-				&new_params->others.ynr_cfg);
+	if (module_en_update & ISP2X_MODULE_CPROC)
+		ops->cproc_enable(params_vdev, !!(module_ens & ISP2X_MODULE_CPROC));
 
-		if (module_en_update & ISP2X_MODULE_YNR)
-			ops->ynr_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_YNR), &new_params->others.ynr_cfg);
+	if (module_en_update & ISP2X_MODULE_IE)
+		ops->ie_enable(params_vdev, !!(module_ens & ISP2X_MODULE_IE));
+
+	if (module_en_update & ISP2X_MODULE_HDRMGE) {
+		ops->hdrmge_enable(params_vdev, !!(module_ens & ISP2X_MODULE_HDRMGE));
+		priv_val->mge_en = !!(module_ens & ISP2X_MODULE_HDRMGE);
 	}
 
-	if ((module_en_update & ISP2X_MODULE_CNR) ||
-	    (module_cfg_update & ISP2X_MODULE_CNR)) {
-		if ((module_cfg_update & ISP2X_MODULE_CNR))
-			ops->cnr_config(params_vdev,
-				&new_params->others.cnr_cfg);
+	if (module_en_update & ISP2X_MODULE_DRC)
+		ops->hdrdrc_enable(params_vdev, !!(module_ens & ISP2X_MODULE_DRC));
+
+	if (module_en_update & ISP2X_MODULE_GIC)
+		ops->gic_enable(params_vdev, !!(module_ens & ISP2X_MODULE_GIC));
 
-		if (module_en_update & ISP2X_MODULE_CNR)
-			ops->cnr_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_CNR), &new_params->others.cnr_cfg);
+	if (module_en_update & ISP2X_MODULE_DHAZ) {
+		ops->dhaz_enable(params_vdev, !!(module_ens & ISP2X_MODULE_DHAZ));
+		priv_val->dhaz_en = !!(module_ens & ISP2X_MODULE_DHAZ);
 	}
 
-	if ((module_en_update & ISP2X_MODULE_SHARP) ||
-	    (module_cfg_update & ISP2X_MODULE_SHARP)) {
-		if ((module_cfg_update & ISP2X_MODULE_SHARP))
-			ops->sharp_config(params_vdev,
-				&new_params->others.sharp_cfg);
+	if (module_en_update & ISP2X_MODULE_3DLUT)
+		ops->isp3dlut_enable(params_vdev, !!(module_ens & ISP2X_MODULE_3DLUT));
 
-		if (module_en_update & ISP2X_MODULE_SHARP)
-			ops->sharp_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_SHARP));
-	}
+	if (module_en_update & ISP2X_MODULE_LDCH)
+		ops->ldch_enable(params_vdev, !!(module_ens & ISP2X_MODULE_LDCH));
 
-	if ((module_en_update & ISP2X_MODULE_BAYNR) ||
-	    (module_cfg_update & ISP2X_MODULE_BAYNR)) {
-		if ((module_cfg_update & ISP2X_MODULE_BAYNR))
-			ops->baynr_config(params_vdev,
-				&new_params->others.baynr_cfg);
+	if (module_en_update & ISP2X_MODULE_YNR)
+		ops->ynr_enable(params_vdev, !!(module_ens & ISP2X_MODULE_YNR), &new_params->others.ynr_cfg);
 
-		if (module_en_update & ISP2X_MODULE_BAYNR)
-			ops->baynr_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_BAYNR));
-	}
+	if (module_en_update & ISP2X_MODULE_CNR)
+		ops->cnr_enable(params_vdev, !!(module_ens & ISP2X_MODULE_CNR), &new_params->others.cnr_cfg);
 
-	if ((module_en_update & ISP2X_MODULE_BAY3D) ||
-	    (module_cfg_update & ISP2X_MODULE_BAY3D)) {
-		if ((module_cfg_update & ISP2X_MODULE_BAY3D))
-			ops->bay3d_config(params_vdev,
-				&new_params->others.bay3d_cfg);
+	if (module_en_update & ISP2X_MODULE_SHARP)
+		ops->sharp_enable(params_vdev, !!(module_ens & ISP2X_MODULE_SHARP));
 
-		if (module_en_update & ISP2X_MODULE_BAY3D)
-			ops->bay3d_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_BAY3D));
-	}
+	if (module_en_update & ISP2X_MODULE_BAYNR)
+		ops->baynr_enable(params_vdev, !!(module_ens & ISP2X_MODULE_BAYNR));
+
+	if (module_en_update & ISP2X_MODULE_BAY3D)
+		ops->bay3d_enable(params_vdev, !!(module_ens & ISP2X_MODULE_BAY3D));
 }
 
 static __maybe_unused
@@ -3712,139 +3604,99 @@ void __isp_isr_meas_config(struct rkisp_isp_params_vdev *params_vdev,
 			   struct isp21_isp_params_cfg *new_params,
 			   enum rkisp_params_type type)
 {
-	u64 module_en_update, module_cfg_update, module_ens;
 	struct rkisp_isp_params_v21_ops *ops =
 		(struct rkisp_isp_params_v21_ops *)params_vdev->priv_ops;
-	struct rkisp_device *ispdev = params_vdev->dev;
-	bool is_feature_on = ispdev->hw_dev->is_feature_on;
-	u64 iq_feature = ispdev->hw_dev->iq_feature;
+	u64 module_cfg_update = new_params->module_cfg_update;
 
 	if (type == RKISP_PARAMS_SHD)
 		return;
 
-	module_en_update = new_params->module_en_update;
-	module_cfg_update = new_params->module_cfg_update;
-	module_ens = new_params->module_ens;
+	if ((module_cfg_update & ISP2X_MODULE_RAWAE0))
+		ops->rawae0_config(params_vdev, &new_params->meas.rawae0);
 
-	if (is_feature_on) {
-		module_en_update &= ~ISP2X_MODULE_HDRMGE;
-		if (module_en_update & ~iq_feature) {
-			dev_err(ispdev->dev,
-				"some iq features(0x%llx, 0x%llx) are not supported\n",
-				module_en_update, iq_feature);
-			module_en_update &= iq_feature;
-		}
-	}
+	if ((module_cfg_update & ISP2X_MODULE_RAWAE1))
+		ops->rawae1_config(params_vdev, &new_params->meas.rawae1);
 
-	if ((module_en_update & ISP2X_MODULE_RAWAE0) ||
-	    (module_cfg_update & ISP2X_MODULE_RAWAE0)) {
-		if ((module_cfg_update & ISP2X_MODULE_RAWAE0))
-			ops->rawae0_config(params_vdev,
-				&new_params->meas.rawae0);
+	if ((module_cfg_update & ISP2X_MODULE_RAWAE2))
+		ops->rawae2_config(params_vdev, &new_params->meas.rawae2);
 
-		if (module_en_update & ISP2X_MODULE_RAWAE0)
-			ops->rawae0_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RAWAE0));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_RAWAE3))
+		ops->rawae3_config(params_vdev, &new_params->meas.rawae3);
 
-	if ((module_en_update & ISP2X_MODULE_RAWAE1) ||
-	    (module_cfg_update & ISP2X_MODULE_RAWAE1)) {
-		if ((module_cfg_update & ISP2X_MODULE_RAWAE1))
-			ops->rawae1_config(params_vdev,
-				&new_params->meas.rawae1);
+	if ((module_cfg_update & ISP2X_MODULE_RAWHIST0))
+		ops->rawhst0_config(params_vdev, &new_params->meas.rawhist0);
 
-		if (module_en_update & ISP2X_MODULE_RAWAE1)
-			ops->rawae1_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RAWAE1));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_RAWHIST1))
+		ops->rawhst1_config(params_vdev, &new_params->meas.rawhist1);
 
-	if ((module_en_update & ISP2X_MODULE_RAWAE2) ||
-	    (module_cfg_update & ISP2X_MODULE_RAWAE2)) {
-		if ((module_cfg_update & ISP2X_MODULE_RAWAE2))
-			ops->rawae2_config(params_vdev,
-				&new_params->meas.rawae2);
+	if ((module_cfg_update & ISP2X_MODULE_RAWHIST2))
+		ops->rawhst2_config(params_vdev, &new_params->meas.rawhist2);
 
-		if (module_en_update & ISP2X_MODULE_RAWAE2)
-			ops->rawae2_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RAWAE2));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_RAWHIST3))
+		ops->rawhst3_config(params_vdev, &new_params->meas.rawhist3);
 
-	if ((module_en_update & ISP2X_MODULE_RAWAE3) ||
-	    (module_cfg_update & ISP2X_MODULE_RAWAE3)) {
-		if ((module_cfg_update & ISP2X_MODULE_RAWAE3))
-			ops->rawae3_config(params_vdev,
-				&new_params->meas.rawae3);
+	if ((module_cfg_update & ISP2X_MODULE_RAWAWB))
+		ops->rawawb_config(params_vdev, &new_params->meas.rawawb);
 
-		if (module_en_update & ISP2X_MODULE_RAWAE3)
-			ops->rawae3_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RAWAE3));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_RAWAF))
+		ops->rawaf_config(params_vdev, &new_params->meas.rawaf);
+}
 
-	if ((module_en_update & ISP2X_MODULE_RAWHIST0) ||
-	    (module_cfg_update & ISP2X_MODULE_RAWHIST0)) {
-		if ((module_cfg_update & ISP2X_MODULE_RAWHIST0))
-			ops->rawhst0_config(params_vdev,
-				&new_params->meas.rawhist0);
+static __maybe_unused
+void __isp_isr_meas_en(struct rkisp_isp_params_vdev *params_vdev,
+		       struct isp21_isp_params_cfg *new_params,
+		       enum rkisp_params_type type)
+{
+	struct rkisp_isp_params_v21_ops *ops =
+		(struct rkisp_isp_params_v21_ops *)params_vdev->priv_ops;
+	struct rkisp_device *ispdev = params_vdev->dev;
+	bool is_feature_on = ispdev->hw_dev->is_feature_on;
+	u64 iq_feature = ispdev->hw_dev->iq_feature;
+	u64 module_en_update = new_params->module_en_update;
+	u64 module_ens = new_params->module_ens;
+
+	if (type == RKISP_PARAMS_SHD)
+		return;
 
-		if (module_en_update & ISP2X_MODULE_RAWHIST0)
-			ops->rawhst0_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RAWHIST0));
+	if (is_feature_on) {
+		module_en_update &= ~ISP2X_MODULE_HDRMGE;
+		if (module_en_update & ~iq_feature) {
+			dev_err(ispdev->dev,
+				"some iq features(0x%llx, 0x%llx) are not supported\n",
+				module_en_update, iq_feature);
+			module_en_update &= iq_feature;
+		}
 	}
 
-	if ((module_en_update & ISP2X_MODULE_RAWHIST1) ||
-	    (module_cfg_update & ISP2X_MODULE_RAWHIST1)) {
-		if ((module_cfg_update & ISP2X_MODULE_RAWHIST1))
-			ops->rawhst1_config(params_vdev,
-				&new_params->meas.rawhist1);
+	if (module_en_update & ISP2X_MODULE_RAWAE0)
+		ops->rawae0_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWAE0));
 
-		if (module_en_update & ISP2X_MODULE_RAWHIST1)
-			ops->rawhst1_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RAWHIST1));
-	}
+	if (module_en_update & ISP2X_MODULE_RAWAE1)
+		ops->rawae1_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWAE1));
 
-	if ((module_en_update & ISP2X_MODULE_RAWHIST2) ||
-	    (module_cfg_update & ISP2X_MODULE_RAWHIST2)) {
-		if ((module_cfg_update & ISP2X_MODULE_RAWHIST2))
-			ops->rawhst2_config(params_vdev,
-				&new_params->meas.rawhist2);
+	if (module_en_update & ISP2X_MODULE_RAWAE2)
+		ops->rawae2_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWAE2));
 
-		if (module_en_update & ISP2X_MODULE_RAWHIST2)
-			ops->rawhst2_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RAWHIST2));
-	}
+	if (module_en_update & ISP2X_MODULE_RAWAE3)
+		ops->rawae3_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWAE3));
 
-	if ((module_en_update & ISP2X_MODULE_RAWHIST3) ||
-	    (module_cfg_update & ISP2X_MODULE_RAWHIST3)) {
-		if ((module_cfg_update & ISP2X_MODULE_RAWHIST3))
-			ops->rawhst3_config(params_vdev,
-				&new_params->meas.rawhist3);
+	if (module_en_update & ISP2X_MODULE_RAWHIST0)
+		ops->rawhst0_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWHIST0));
 
-		if (module_en_update & ISP2X_MODULE_RAWHIST3)
-			ops->rawhst3_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RAWHIST3));
-	}
+	if (module_en_update & ISP2X_MODULE_RAWHIST1)
+		ops->rawhst1_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWHIST1));
 
-	if ((module_en_update & ISP2X_MODULE_RAWAWB) ||
-	    (module_cfg_update & ISP2X_MODULE_RAWAWB)) {
-		if ((module_cfg_update & ISP2X_MODULE_RAWAWB))
-			ops->rawawb_config(params_vdev,
-				&new_params->meas.rawawb);
+	if (module_en_update & ISP2X_MODULE_RAWHIST2)
+		ops->rawhst2_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWHIST2));
 
-		if (module_en_update & ISP2X_MODULE_RAWAWB)
-			ops->rawawb_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RAWAWB));
-	}
+	if (module_en_update & ISP2X_MODULE_RAWHIST3)
+		ops->rawhst3_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWHIST3));
 
-	if ((module_en_update & ISP2X_MODULE_RAWAF) ||
-	    (module_cfg_update & ISP2X_MODULE_RAWAF)) {
-		if ((module_cfg_update & ISP2X_MODULE_RAWAF))
-			ops->rawaf_config(params_vdev,
-				&new_params->meas.rawaf);
+	if (module_en_update & ISP2X_MODULE_RAWAWB)
+		ops->rawawb_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWAWB));
 
-		if (module_en_update & ISP2X_MODULE_RAWAF)
-			ops->rawaf_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RAWAF));
-	}
+	if (module_en_update & ISP2X_MODULE_RAWAF)
+		ops->rawaf_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWAF));
 }
 
 static __maybe_unused
@@ -3860,12 +3712,6 @@ void __isp_config_hdrshd(struct rkisp_isp_params_vdev *params_vdev)
 			   &params_vdev->last_hdrdrc, RKISP_PARAMS_SHD);
 }
 
-static __maybe_unused
-void __preisp_isr_update_hdrae_para(struct rkisp_isp_params_vdev *params_vdev,
-				    struct isp21_isp_params_cfg *new_params)
-{
-}
-
 static
 void rkisp_params_cfgsram_v2x(struct rkisp_isp_params_vdev *params_vdev)
 {
@@ -3926,8 +3772,9 @@ rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev)
 	priv_val->lsc_en = 0;
 	priv_val->mge_en = 0;
 	__isp_isr_other_config(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL);
+	__isp_isr_other_en(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL);
 	__isp_isr_meas_config(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL);
-	__preisp_isr_update_hdrae_para(params_vdev, params_vdev->isp21_params);
+	__isp_isr_meas_en(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL);
 	if (width <= ISP2X_AUTO_BIGMODE_WIDTH && size > ISP2X_NOBIG_OVERFLOW_SIZE) {
 		rkisp_set_bits(params_vdev->dev, ISP_CTRL1,
 			       ISP2X_SYS_BIGMODE_MANUAL | ISP2X_SYS_BIGMODE_FORCEEN,
@@ -4108,6 +3955,26 @@ rkisp_params_disable_isp_v2x(struct rkisp_isp_params_vdev *params_vdev)
 	ops->bay3d_enable(params_vdev, false);
 }
 
+static void
+ldch_data_abandon(struct rkisp_isp_params_vdev *params_vdev,
+		  struct isp21_isp_params_cfg *params)
+{
+	const struct isp2x_ldch_cfg *arg = &params->others.ldch_cfg;
+	struct rkisp_isp_params_val_v21 *priv_val;
+	struct isp2x_ldch_head *ldch_head;
+	int i;
+
+	priv_val = (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val;
+	for (i = 0; i < ISP2X_LDCH_BUF_NUM; i++) {
+		if (arg->buf_fd == priv_val->buf_ldch[i].dma_fd &&
+		    priv_val->buf_ldch[i].vaddr) {
+			ldch_head = (struct isp2x_ldch_head *)priv_val->buf_ldch[i].vaddr;
+			ldch_head->stat = LDCH_BUF_CHIPINUSE;
+			break;
+		}
+	}
+}
+
 static void
 rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev,
 		     u32 frame_id, enum rkisp_params_type type)
@@ -4126,14 +3993,18 @@ rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev,
 		cur_buf = list_first_entry(&params_vdev->params,
 				struct rkisp_buffer, queue);
 
-		if (!IS_HDR_RDBK(dev->rd_mode)) {
-			list_del(&cur_buf->queue);
-			break;
-		}
-
 		new_params = (struct isp21_isp_params_cfg *)(cur_buf->vaddr[0]);
 		if (new_params->frame_id < frame_id) {
 			list_del(&cur_buf->queue);
+			if (list_empty(&params_vdev->params))
+				break;
+			else if (new_params->module_en_update) {
+				/* update en immediately */
+				__isp_isr_other_en(params_vdev, new_params, type);
+				__isp_isr_meas_en(params_vdev, new_params, type);
+			}
+			if (new_params->module_cfg_update & ISP2X_MODULE_LDCH)
+				ldch_data_abandon(params_vdev, new_params);
 			vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
 			cur_buf = NULL;
 			continue;
@@ -4150,7 +4021,9 @@ rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev,
 
 	new_params = (struct isp21_isp_params_cfg *)(cur_buf->vaddr[0]);
 	__isp_isr_other_config(params_vdev, new_params, type);
+	__isp_isr_other_en(params_vdev, new_params, type);
 	__isp_isr_meas_config(params_vdev, new_params, type);
+	__isp_isr_meas_en(params_vdev, new_params, type);
 	if (!hw_dev->is_single && type != RKISP_PARAMS_SHD)
 		__isp_config_hdrshd(params_vdev);
 
@@ -4215,7 +4088,7 @@ rkisp_params_isr_v2x(struct rkisp_isp_params_vdev *params_vdev,
 		rkisp_params_clear_fstflg(params_vdev);
 
 	if ((isp_mis & CIF_ISP_FRAME) && !IS_HDR_RDBK(dev->rd_mode))
-		rkisp_params_cfg_v2x(params_vdev, cur_frame_id, RKISP_PARAMS_ALL);
+		rkisp_params_cfg_v2x(params_vdev, cur_frame_id + 1, RKISP_PARAMS_ALL);
 }
 
 static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = {

commit c1b4d9854515f98259e714a016a38378cb5f1b52
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Fri May 7 15:20:26 2021 +0800

    media: rockchip: isp: apply en params if no match for isp20
    
    Change-Id: I47bc2b58aae016df1bb6ba0a1425431bed53ca9d
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.c b/drivers/media/platform/rockchip/isp/isp_params_v2x.c
index 9d7f9beb7016..9902d0c42db5 100644
--- a/drivers/media/platform/rockchip/isp/isp_params_v2x.c
+++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.c
@@ -697,7 +697,7 @@ isp_lsc_matrix_cfg_ddr(struct rkisp_isp_params_vdev *params_vdev,
 				0);
 		vaddr[3][index[3]++] = data;
 	}
-
+	rkisp_prepare_buffer(params_vdev->dev, &priv_val->buf_lsclut[buf_idx]);
 	data = priv_val->buf_lsclut[buf_idx].dma_addr;
 	rkisp_iowrite32(params_vdev, data, MI_LUT_LSC_RD_BASE);
 	rkisp_iowrite32(params_vdev, RKISP_PARAM_LSC_LUT_BUF_SIZE, MI_LUT_LSC_RD_WSIZE);
@@ -747,13 +747,11 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev,
 
 	/* restore the lsc ctrl status */
 	if (lsc_ctrl & ISP_LSC_EN) {
-		isp_param_set_bits(params_vdev,
-				   ISP_LSC_CTRL,
-				   ISP_LSC_EN);
+		if (!IS_HDR_RDBK(dev->rd_mode))
+			lsc_ctrl |= ISP_LSC_LUT_EN;
+		isp_param_set_bits(params_vdev, ISP_LSC_CTRL, lsc_ctrl);
 	} else {
-		isp_param_clear_bits(params_vdev,
-				     ISP_LSC_CTRL,
-				     ISP_LSC_EN);
+		isp_param_clear_bits(params_vdev, ISP_LSC_CTRL, ISP_LSC_EN);
 	}
 
 	params_vdev->cur_lsccfg = *arg;
@@ -3111,7 +3109,7 @@ isp_rawnr_enable(struct rkisp_isp_params_vdev *params_vdev,
 
 static void isp_hdrtmo_wait_first_line(struct rkisp_isp_params_vdev *params_vdev)
 {
-	s32 retry = 8;
+	s32 retry = 10;
 	u32 value, line_cnt, frame_id;
 	struct v4l2_rect *out_crop = &params_vdev->dev->isp_sdev.out_crop;
 
@@ -3126,10 +3124,6 @@ static void isp_hdrtmo_wait_first_line(struct rkisp_isp_params_vdev *params_vdev
 		else
 			break;
 	} while (retry-- > 0);
-
-	if (retry < 0)
-		dev_err(params_vdev->dev->dev, "hdr line_cnt(%d) < 1line\n",
-			line_cnt);
 }
 
 static void
@@ -3528,7 +3522,7 @@ isp_3dlut_config(struct rkisp_isp_params_vdev *params_vdev,
 		data[i] = (arg->lut_b[i] & 0x3FF) |
 			  (arg->lut_g[i] & 0xFFF) << 10 |
 			  (arg->lut_r[i] & 0x3FF) << 22;
-
+	rkisp_prepare_buffer(params_vdev->dev, &priv_val->buf_3dlut[buf_idx]);
 	value = priv_val->buf_3dlut[buf_idx].dma_addr;
 	rkisp_iowrite32(params_vdev, value, MI_LUT_3D_RD_BASE);
 	rkisp_iowrite32(params_vdev, arg->actual_size, MI_LUT_3D_RD_WSIZE);
@@ -3612,6 +3606,7 @@ isp_ldch_config(struct rkisp_isp_params_vdev *params_vdev,
 		if (dev->rd_mode == HDR_RDBK_FRAME1)
 			vsize += cnt;
 	}
+	rkisp_prepare_buffer(dev, &priv_val->buf_ldch[buf_idx]);
 	value = priv_val->buf_ldch[buf_idx].dma_addr + ldch_head->data_oft;
 	rkisp_iowrite32(params_vdev, value, MI_LUT_LDCH_RD_BASE);
 	rkisp_iowrite32(params_vdev, arg->hsize, MI_LUT_LDCH_RD_H_WSIZE);
@@ -3750,454 +3745,294 @@ static __maybe_unused
 void __isp_isr_other_config(struct rkisp_isp_params_vdev *params_vdev,
 			    const struct isp2x_isp_params_cfg *new_params, enum rkisp_params_type type)
 {
-	u64 module_en_update, module_cfg_update, module_ens;
 	struct rkisp_isp_params_v2x_ops *ops =
 		(struct rkisp_isp_params_v2x_ops *)params_vdev->priv_ops;
-	struct rkisp_isp_params_val_v2x *priv_val =
-		(struct rkisp_isp_params_val_v2x *)params_vdev->priv_val;
-
-	module_en_update = new_params->module_en_update;
-	module_cfg_update = new_params->module_cfg_update;
-	module_ens = new_params->module_ens;
+	u64 module_cfg_update = new_params->module_cfg_update;
 
 	if (type == RKISP_PARAMS_SHD) {
-		if ((module_en_update & ISP2X_MODULE_HDRMGE) ||
-		    (module_cfg_update & ISP2X_MODULE_HDRMGE)) {
-			if ((module_cfg_update & ISP2X_MODULE_HDRMGE))
-				ops->hdrmge_config(params_vdev,
-					&new_params->others.hdrmge_cfg, type);
-
-			if (module_en_update & ISP2X_MODULE_HDRMGE) {
-				ops->hdrmge_enable(params_vdev,
-					!!(module_ens & ISP2X_MODULE_HDRMGE));
-				priv_val->mge_en = !!(module_ens & ISP2X_MODULE_HDRMGE);
-			}
-		}
+		if ((module_cfg_update & ISP2X_MODULE_HDRMGE))
+			ops->hdrmge_config(params_vdev,	&new_params->others.hdrmge_cfg, type);
 
-		if ((module_en_update & ISP2X_MODULE_HDRTMO) ||
-		    (module_cfg_update & ISP2X_MODULE_HDRTMO)) {
-			if ((module_cfg_update & ISP2X_MODULE_HDRTMO))
-				ops->hdrtmo_config(params_vdev,
-					&new_params->others.hdrtmo_cfg, type);
+		if ((module_cfg_update & ISP2X_MODULE_HDRTMO))
+			ops->hdrtmo_config(params_vdev, &new_params->others.hdrtmo_cfg, type);
 
-			if (module_en_update & ISP2X_MODULE_HDRTMO) {
-				ops->hdrtmo_enable(params_vdev,
-					!!(module_ens & ISP2X_MODULE_HDRTMO));
-				priv_val->tmo_en = !!(module_ens & ISP2X_MODULE_HDRTMO);
-			}
-		}
 		return;
 	}
 
-	if ((module_en_update & ISP2X_MODULE_DPCC) ||
-	    (module_cfg_update & ISP2X_MODULE_DPCC)) {
-		if ((module_cfg_update & ISP2X_MODULE_DPCC))
-			ops->dpcc_config(params_vdev,
-				&new_params->others.dpcc_cfg);
+	if ((module_cfg_update & ISP2X_MODULE_DPCC))
+		ops->dpcc_config(params_vdev, &new_params->others.dpcc_cfg);
 
-		if (module_en_update & ISP2X_MODULE_DPCC)
-			ops->dpcc_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_DPCC));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_BLS))
+		ops->bls_config(params_vdev, &new_params->others.bls_cfg);
 
-	if ((module_en_update & ISP2X_MODULE_BLS) ||
-	    (module_cfg_update & ISP2X_MODULE_BLS)) {
-		if ((module_cfg_update & ISP2X_MODULE_BLS))
-			ops->bls_config(params_vdev,
-				&new_params->others.bls_cfg);
+	if ((module_cfg_update & ISP2X_MODULE_SDG))
+		ops->sdg_config(params_vdev, &new_params->others.sdg_cfg);
 
-		if (module_en_update & ISP2X_MODULE_BLS)
-			ops->bls_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_BLS));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_LSC))
+		ops->lsc_config(params_vdev, &new_params->others.lsc_cfg);
 
-	if ((module_en_update & ISP2X_MODULE_SDG) ||
-	    (module_cfg_update & ISP2X_MODULE_SDG)) {
-		if ((module_cfg_update & ISP2X_MODULE_SDG))
-			ops->sdg_config(params_vdev,
-				&new_params->others.sdg_cfg);
+	if ((module_cfg_update & ISP2X_MODULE_AWB_GAIN))
+		ops->awbgain_config(params_vdev, &new_params->others.awb_gain_cfg);
 
-		if (module_en_update & ISP2X_MODULE_SDG)
-			ops->sdg_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_SDG));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_DEBAYER))
+		ops->debayer_config(params_vdev, &new_params->others.debayer_cfg);
 
-	if ((module_en_update & ISP2X_MODULE_LSC) ||
-	    (module_cfg_update & ISP2X_MODULE_LSC)) {
-		if ((module_cfg_update & ISP2X_MODULE_LSC))
-			ops->lsc_config(params_vdev,
-				&new_params->others.lsc_cfg);
+	if ((module_cfg_update & ISP2X_MODULE_CCM))
+		ops->ccm_config(params_vdev, &new_params->others.ccm_cfg);
 
-		if (module_en_update & ISP2X_MODULE_LSC) {
-			ops->lsc_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_LSC));
-			priv_val->lsc_en = !!(module_ens & ISP2X_MODULE_LSC);
-		}
-	}
+	if ((module_cfg_update & ISP2X_MODULE_GOC))
+		ops->goc_config(params_vdev, &new_params->others.gammaout_cfg);
 
-	if ((module_en_update & ISP2X_MODULE_AWB_GAIN) ||
-	    (module_cfg_update & ISP2X_MODULE_AWB_GAIN)) {
-		if ((module_cfg_update & ISP2X_MODULE_AWB_GAIN))
-			ops->awbgain_config(params_vdev,
-				&new_params->others.awb_gain_cfg);
+	if ((module_cfg_update & ISP2X_MODULE_CPROC))
+		ops->cproc_config(params_vdev, &new_params->others.cproc_cfg);
 
-		if (module_en_update & ISP2X_MODULE_AWB_GAIN)
-			ops->awbgain_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_AWB_GAIN));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_IE))
+		ops->ie_config(params_vdev, &new_params->others.ie_cfg);
 
-	if ((module_en_update & ISP2X_MODULE_DEBAYER) ||
-	    (module_cfg_update & ISP2X_MODULE_DEBAYER)) {
-		if ((module_cfg_update & ISP2X_MODULE_DEBAYER))
-			ops->debayer_config(params_vdev,
-				&new_params->others.debayer_cfg);
+	if ((module_cfg_update & ISP2X_MODULE_WDR))
+		ops->wdr_config(params_vdev, &new_params->others.wdr_cfg);
 
-		if (module_en_update & ISP2X_MODULE_DEBAYER)
-			ops->debayer_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_DEBAYER));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_RK_IESHARP))
+		ops->iesharp_config(params_vdev, &new_params->others.rkiesharp_cfg);
 
-	if ((module_en_update & ISP2X_MODULE_CCM) ||
-	    (module_cfg_update & ISP2X_MODULE_CCM)) {
-		if ((module_cfg_update & ISP2X_MODULE_CCM))
-			ops->ccm_config(params_vdev,
-				&new_params->others.ccm_cfg);
+	if ((module_cfg_update & ISP2X_MODULE_HDRMGE))
+		ops->hdrmge_config(params_vdev, &new_params->others.hdrmge_cfg, type);
 
-		if (module_en_update & ISP2X_MODULE_CCM)
-			ops->ccm_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_CCM));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_RAWNR))
+		ops->rawnr_config(params_vdev, &new_params->others.rawnr_cfg);
 
-	if ((module_en_update & ISP2X_MODULE_GOC) ||
-	    (module_cfg_update & ISP2X_MODULE_GOC)) {
-		if ((module_cfg_update & ISP2X_MODULE_GOC))
-			ops->goc_config(params_vdev,
-				&new_params->others.gammaout_cfg);
+	if ((module_cfg_update & ISP2X_MODULE_HDRTMO))
+		ops->hdrtmo_config(params_vdev, &new_params->others.hdrtmo_cfg, type);
 
-		if (module_en_update & ISP2X_MODULE_GOC)
-			ops->goc_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_GOC));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_GIC))
+		ops->gic_config(params_vdev, &new_params->others.gic_cfg);
 
-	if ((module_en_update & ISP2X_MODULE_CPROC) ||
-	    (module_cfg_update & ISP2X_MODULE_CPROC)) {
-		if ((module_cfg_update & ISP2X_MODULE_CPROC))
-			ops->cproc_config(params_vdev,
-				&new_params->others.cproc_cfg);
+	if ((module_cfg_update & ISP2X_MODULE_DHAZ))
+		ops->dhaz_config(params_vdev, &new_params->others.dhaz_cfg);
 
-		if (module_en_update & ISP2X_MODULE_CPROC)
-			ops->cproc_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_CPROC));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_3DLUT))
+		ops->isp3dlut_config(params_vdev, &new_params->others.isp3dlut_cfg);
 
-	if ((module_en_update & ISP2X_MODULE_IE) ||
-	    (module_cfg_update & ISP2X_MODULE_IE)) {
-		if ((module_cfg_update & ISP2X_MODULE_IE))
-			ops->ie_config(params_vdev,
-				&new_params->others.ie_cfg);
+	if ((module_cfg_update & ISP2X_MODULE_LDCH))
+		ops->ldch_config(params_vdev, &new_params->others.ldch_cfg);
 
-		if (module_en_update & ISP2X_MODULE_IE)
-			ops->ie_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_IE));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_GAIN))
+		ops->gain_config(params_vdev, &new_params->others.gain_cfg);
+}
 
-	if ((module_en_update & ISP2X_MODULE_WDR) ||
-	    (module_cfg_update & ISP2X_MODULE_WDR)) {
-		if ((module_cfg_update & ISP2X_MODULE_WDR))
-			ops->wdr_config(params_vdev,
-				&new_params->others.wdr_cfg);
+static __maybe_unused
+void __isp_isr_other_en(struct rkisp_isp_params_vdev *params_vdev,
+			const struct isp2x_isp_params_cfg *new_params, enum rkisp_params_type type)
+{
+	struct rkisp_isp_params_v2x_ops *ops =
+		(struct rkisp_isp_params_v2x_ops *)params_vdev->priv_ops;
+	struct rkisp_isp_params_val_v2x *priv_val =
+		(struct rkisp_isp_params_val_v2x *)params_vdev->priv_val;
+	u64 module_en_update = new_params->module_en_update;
+	u64 module_ens = new_params->module_ens;
 
-		if (module_en_update & ISP2X_MODULE_WDR) {
-			ops->wdr_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_WDR));
-			priv_val->wdr_en = !!(module_ens & ISP2X_MODULE_WDR);
-		}
-	}
+	if (type == RKISP_PARAMS_SHD)
+		return;
 
-	if ((module_en_update & ISP2X_MODULE_RK_IESHARP) ||
-	    (module_cfg_update & ISP2X_MODULE_RK_IESHARP)) {
-		if ((module_cfg_update & ISP2X_MODULE_RK_IESHARP))
-			ops->iesharp_config(params_vdev,
-				&new_params->others.rkiesharp_cfg);
+	if (module_en_update & ISP2X_MODULE_HDRMGE) {
+		ops->hdrmge_enable(params_vdev, !!(module_ens & ISP2X_MODULE_HDRMGE));
+		priv_val->mge_en = !!(module_ens & ISP2X_MODULE_HDRMGE);
+	}
 
-		if (module_en_update & ISP2X_MODULE_RK_IESHARP)
-			ops->iesharp_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RK_IESHARP));
+	if (module_en_update & ISP2X_MODULE_HDRTMO) {
+		ops->hdrtmo_enable(params_vdev,	!!(module_ens & ISP2X_MODULE_HDRTMO));
+		priv_val->tmo_en = !!(module_ens & ISP2X_MODULE_HDRTMO);
 	}
 
-	if ((module_en_update & ISP2X_MODULE_HDRMGE) ||
-	    (module_cfg_update & ISP2X_MODULE_HDRMGE)) {
-		if ((module_cfg_update & ISP2X_MODULE_HDRMGE))
-			ops->hdrmge_config(params_vdev,
-				&new_params->others.hdrmge_cfg, type);
+	if (module_en_update & ISP2X_MODULE_DPCC)
+		ops->dpcc_enable(params_vdev, !!(module_ens & ISP2X_MODULE_DPCC));
 
-		if (module_en_update & ISP2X_MODULE_HDRMGE) {
-			ops->hdrmge_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_HDRMGE));
-			priv_val->mge_en = !!(module_ens & ISP2X_MODULE_HDRMGE);
-		}
-	}
+	if (module_en_update & ISP2X_MODULE_BLS)
+		ops->bls_enable(params_vdev, !!(module_ens & ISP2X_MODULE_BLS));
 
-	if ((module_en_update & ISP2X_MODULE_RAWNR) ||
-	    (module_cfg_update & ISP2X_MODULE_RAWNR)) {
-		if ((module_cfg_update & ISP2X_MODULE_RAWNR))
-			ops->rawnr_config(params_vdev,
-				&new_params->others.rawnr_cfg);
+	if (module_en_update & ISP2X_MODULE_SDG)
+		ops->sdg_enable(params_vdev, !!(module_ens & ISP2X_MODULE_SDG));
 
-		if (module_en_update & ISP2X_MODULE_RAWNR)
-			ops->rawnr_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RAWNR));
+	if (module_en_update & ISP2X_MODULE_LSC) {
+		ops->lsc_enable(params_vdev, !!(module_ens & ISP2X_MODULE_LSC));
+		priv_val->lsc_en = !!(module_ens & ISP2X_MODULE_LSC);
 	}
 
-	if ((module_en_update & ISP2X_MODULE_HDRTMO) ||
-	    (module_cfg_update & ISP2X_MODULE_HDRTMO)) {
-		if ((module_cfg_update & ISP2X_MODULE_HDRTMO))
-			ops->hdrtmo_config(params_vdev,
-				&new_params->others.hdrtmo_cfg, type);
+	if (module_en_update & ISP2X_MODULE_AWB_GAIN)
+		ops->awbgain_enable(params_vdev, !!(module_ens & ISP2X_MODULE_AWB_GAIN));
 
-		if (module_en_update & ISP2X_MODULE_HDRTMO) {
-			ops->hdrtmo_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_HDRTMO));
-			priv_val->tmo_en = !!(module_ens & ISP2X_MODULE_HDRTMO);
-		}
-	}
+	if (module_en_update & ISP2X_MODULE_DEBAYER)
+		ops->debayer_enable(params_vdev, !!(module_ens & ISP2X_MODULE_DEBAYER));
 
-	if ((module_en_update & ISP2X_MODULE_GIC) ||
-	    (module_cfg_update & ISP2X_MODULE_GIC)) {
-		if ((module_cfg_update & ISP2X_MODULE_GIC))
-			ops->gic_config(params_vdev,
-				&new_params->others.gic_cfg);
+	if (module_en_update & ISP2X_MODULE_CCM)
+		ops->ccm_enable(params_vdev, !!(module_ens & ISP2X_MODULE_CCM));
 
-		if (module_en_update & ISP2X_MODULE_GIC)
-			ops->gic_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_GIC));
+	if (module_en_update & ISP2X_MODULE_GOC)
+		ops->goc_enable(params_vdev, !!(module_ens & ISP2X_MODULE_GOC));
+
+	if (module_en_update & ISP2X_MODULE_CPROC)
+		ops->cproc_enable(params_vdev, !!(module_ens & ISP2X_MODULE_CPROC));
+
+	if (module_en_update & ISP2X_MODULE_IE)
+		ops->ie_enable(params_vdev, !!(module_ens & ISP2X_MODULE_IE));
+
+	if (module_en_update & ISP2X_MODULE_WDR) {
+		ops->wdr_enable(params_vdev, !!(module_ens & ISP2X_MODULE_WDR));
+		priv_val->wdr_en = !!(module_ens & ISP2X_MODULE_WDR);
 	}
 
-	if ((module_en_update & ISP2X_MODULE_DHAZ) ||
-	    (module_cfg_update & ISP2X_MODULE_DHAZ)) {
-		if ((module_cfg_update & ISP2X_MODULE_DHAZ))
-			ops->dhaz_config(params_vdev,
-				&new_params->others.dhaz_cfg);
+	if (module_en_update & ISP2X_MODULE_RK_IESHARP)
+		ops->iesharp_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RK_IESHARP));
 
-		if (module_en_update & ISP2X_MODULE_DHAZ) {
-			ops->dhaz_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_DHAZ));
-			priv_val->dhaz_en = !!(module_ens & ISP2X_MODULE_DHAZ);
-		}
+	if (module_en_update & ISP2X_MODULE_HDRMGE) {
+		ops->hdrmge_enable(params_vdev, !!(module_ens & ISP2X_MODULE_HDRMGE));
+		priv_val->mge_en = !!(module_ens & ISP2X_MODULE_HDRMGE);
 	}
 
-	if ((module_en_update & ISP2X_MODULE_3DLUT) ||
-	    (module_cfg_update & ISP2X_MODULE_3DLUT)) {
-		if ((module_cfg_update & ISP2X_MODULE_3DLUT))
-			ops->isp3dlut_config(params_vdev,
-				&new_params->others.isp3dlut_cfg);
+	if (module_en_update & ISP2X_MODULE_RAWNR)
+		ops->rawnr_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWNR));
 
-		if (module_en_update & ISP2X_MODULE_3DLUT)
-			ops->isp3dlut_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_3DLUT));
+	if (module_en_update & ISP2X_MODULE_HDRTMO) {
+		ops->hdrtmo_enable(params_vdev, !!(module_ens & ISP2X_MODULE_HDRTMO));
+		priv_val->tmo_en = !!(module_ens & ISP2X_MODULE_HDRTMO);
 	}
 
-	if ((module_en_update & ISP2X_MODULE_LDCH) ||
-	    (module_cfg_update & ISP2X_MODULE_LDCH)) {
-		if ((module_cfg_update & ISP2X_MODULE_LDCH))
-			ops->ldch_config(params_vdev,
-				&new_params->others.ldch_cfg);
-
-		if (module_en_update & ISP2X_MODULE_LDCH) {
-			/*
-			 * lsc read table from sram in mult-isp mode,
-			 * so don't delay in mult-isp mode.
-			 */
-			if (params_vdev->first_cfg_params &&
-			    !!(module_ens & ISP2X_MODULE_LDCH) &&
-			    params_vdev->dev->hw_dev->is_single)
-				priv_val->delay_en_ldch = true;
-			else
-				ops->ldch_enable(params_vdev,
-						!!(module_ens & ISP2X_MODULE_LDCH));
-		}
+	if (module_en_update & ISP2X_MODULE_GIC)
+		ops->gic_enable(params_vdev, !!(module_ens & ISP2X_MODULE_GIC));
+
+	if (module_en_update & ISP2X_MODULE_DHAZ) {
+		ops->dhaz_enable(params_vdev, !!(module_ens & ISP2X_MODULE_DHAZ));
+		priv_val->dhaz_en = !!(module_ens & ISP2X_MODULE_DHAZ);
 	}
 
-	if ((module_en_update & ISP2X_MODULE_GAIN) ||
-	    (module_cfg_update & ISP2X_MODULE_GAIN)) {
-		if ((module_cfg_update & ISP2X_MODULE_GAIN))
-			ops->gain_config(params_vdev,
-				&new_params->others.gain_cfg);
+	if (module_en_update & ISP2X_MODULE_3DLUT)
+		ops->isp3dlut_enable(params_vdev, !!(module_ens & ISP2X_MODULE_3DLUT));
 
-		if (module_en_update & ISP2X_MODULE_GAIN)
-			ops->gain_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_GAIN));
+	if (module_en_update & ISP2X_MODULE_LDCH) {
+		/*
+		 * lsc read table from sram in mult-isp mode,
+		 * so don't delay in mult-isp mode.
+		 */
+		if (params_vdev->first_cfg_params &&
+		    !!(module_ens & ISP2X_MODULE_LDCH) &&
+		    params_vdev->dev->hw_dev->is_single)
+			priv_val->delay_en_ldch = true;
+		else
+			ops->ldch_enable(params_vdev,
+					!!(module_ens & ISP2X_MODULE_LDCH));
 	}
+
+	if (module_en_update & ISP2X_MODULE_GAIN)
+		ops->gain_enable(params_vdev, !!(module_ens & ISP2X_MODULE_GAIN));
 }
 
 static __maybe_unused
 void __isp_isr_meas_config(struct rkisp_isp_params_vdev *params_vdev,
 			   struct isp2x_isp_params_cfg *new_params, enum rkisp_params_type type)
 {
-	u64 module_en_update, module_cfg_update, module_ens;
 	struct rkisp_isp_params_v2x_ops *ops =
 		(struct rkisp_isp_params_v2x_ops *)params_vdev->priv_ops;
+	u64 module_cfg_update = new_params->module_cfg_update;
 
 	if (type == RKISP_PARAMS_SHD)
 		return;
 
-	module_en_update = new_params->module_en_update;
-	module_cfg_update = new_params->module_cfg_update;
-	module_ens = new_params->module_ens;
+	if ((module_cfg_update & ISP2X_MODULE_YUVAE))
+		ops->yuvae_config(params_vdev, &new_params->meas.yuvae);
 
-	if ((module_en_update & ISP2X_MODULE_YUVAE) ||
-	    (module_cfg_update & ISP2X_MODULE_YUVAE)) {
-		if ((module_cfg_update & ISP2X_MODULE_YUVAE))
-			ops->yuvae_config(params_vdev,
-				&new_params->meas.yuvae);
+	if ((module_cfg_update & ISP2X_MODULE_RAWAE0))
+		ops->rawae0_config(params_vdev, &new_params->meas.rawae0);
 
-		if (module_en_update & ISP2X_MODULE_YUVAE)
-			ops->yuvae_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_YUVAE));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_RAWAE1))
+		ops->rawae1_config(params_vdev, &new_params->meas.rawae1);
 
-	if ((module_en_update & ISP2X_MODULE_RAWAE0) ||
-	    (module_cfg_update & ISP2X_MODULE_RAWAE0)) {
-		if ((module_cfg_update & ISP2X_MODULE_RAWAE0))
-			ops->rawae0_config(params_vdev,
-				&new_params->meas.rawae0);
+	if ((module_cfg_update & ISP2X_MODULE_RAWAE2))
+		ops->rawae2_config(params_vdev, &new_params->meas.rawae2);
 
-		if (module_en_update & ISP2X_MODULE_RAWAE0)
-			ops->rawae0_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RAWAE0));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_RAWAE3))
+		ops->rawae3_config(params_vdev, &new_params->meas.rawae3);
 
-	if ((module_en_update & ISP2X_MODULE_RAWAE1) ||
-	    (module_cfg_update & ISP2X_MODULE_RAWAE1)) {
-		if ((module_cfg_update & ISP2X_MODULE_RAWAE1))
-			ops->rawae1_config(params_vdev,
-				&new_params->meas.rawae1);
+	if ((module_cfg_update & ISP2X_MODULE_SIHST))
+		ops->sihst_config(params_vdev, &new_params->meas.sihst);
 
-		if (module_en_update & ISP2X_MODULE_RAWAE1)
-			ops->rawae1_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RAWAE1));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_RAWHIST0))
+		ops->rawhst0_config(params_vdev, &new_params->meas.rawhist0);
 
-	if ((module_en_update & ISP2X_MODULE_RAWAE2) ||
-	    (module_cfg_update & ISP2X_MODULE_RAWAE2)) {
-		if ((module_cfg_update & ISP2X_MODULE_RAWAE2))
-			ops->rawae2_config(params_vdev,
-				&new_params->meas.rawae2);
+	if ((module_cfg_update & ISP2X_MODULE_RAWHIST1))
+		ops->rawhst1_config(params_vdev, &new_params->meas.rawhist1);
 
-		if (module_en_update & ISP2X_MODULE_RAWAE2)
-			ops->rawae2_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RAWAE2));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_RAWHIST2))
+		ops->rawhst2_config(params_vdev, &new_params->meas.rawhist2);
 
-	if ((module_en_update & ISP2X_MODULE_RAWAE3) ||
-	    (module_cfg_update & ISP2X_MODULE_RAWAE3)) {
-		if ((module_cfg_update & ISP2X_MODULE_RAWAE3))
-			ops->rawae3_config(params_vdev,
-				&new_params->meas.rawae3);
+	if ((module_cfg_update & ISP2X_MODULE_RAWHIST3))
+		ops->rawhst3_config(params_vdev, &new_params->meas.rawhist3);
 
-		if (module_en_update & ISP2X_MODULE_RAWAE3)
-			ops->rawae3_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RAWAE3));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_SIAWB))
+		ops->siawb_config(params_vdev, &new_params->meas.siawb);
 
-	if ((module_en_update & ISP2X_MODULE_SIHST) ||
-	    (module_cfg_update & ISP2X_MODULE_SIHST)) {
-		if ((module_cfg_update & ISP2X_MODULE_SIHST))
-			ops->sihst_config(params_vdev,
-				&new_params->meas.sihst);
+	if ((module_cfg_update & ISP2X_MODULE_RAWAWB))
+		ops->rawawb_config(params_vdev, &new_params->meas.rawawb);
 
-		if (module_en_update & ISP2X_MODULE_SIHST)
-			ops->sihst_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_SIHST));
-	}
+	if ((module_cfg_update & ISP2X_MODULE_SIAF))
+		ops->siaf_config(params_vdev, &new_params->meas.siaf);
 
-	if ((module_en_update & ISP2X_MODULE_RAWHIST0) ||
-	    (module_cfg_update & ISP2X_MODULE_RAWHIST0)) {
-		if ((module_cfg_update & ISP2X_MODULE_RAWHIST0))
-			ops->rawhst0_config(params_vdev,
-				&new_params->meas.rawhist0);
+	if ((module_cfg_update & ISP2X_MODULE_RAWAF))
+		ops->rawaf_config(params_vdev, &new_params->meas.rawaf);
+}
 
-		if (module_en_update & ISP2X_MODULE_RAWHIST0)
-			ops->rawhst0_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RAWHIST0));
-	}
+static __maybe_unused
+void __isp_isr_meas_en(struct rkisp_isp_params_vdev *params_vdev,
+		       struct isp2x_isp_params_cfg *new_params, enum rkisp_params_type type)
+{
+	struct rkisp_isp_params_v2x_ops *ops =
+		(struct rkisp_isp_params_v2x_ops *)params_vdev->priv_ops;
+	u64 module_en_update = new_params->module_en_update;
+	u64 module_ens = new_params->module_ens;
 
-	if ((module_en_update & ISP2X_MODULE_RAWHIST1) ||
-	    (module_cfg_update & ISP2X_MODULE_RAWHIST1)) {
-		if ((module_cfg_update & ISP2X_MODULE_RAWHIST1))
-			ops->rawhst1_config(params_vdev,
-				&new_params->meas.rawhist1);
+	if (type == RKISP_PARAMS_SHD)
+		return;
 
-		if (module_en_update & ISP2X_MODULE_RAWHIST1)
-			ops->rawhst1_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RAWHIST1));
-	}
+	if (module_en_update & ISP2X_MODULE_YUVAE)
+		ops->yuvae_enable(params_vdev, !!(module_ens & ISP2X_MODULE_YUVAE));
 
-	if ((module_en_update & ISP2X_MODULE_RAWHIST2) ||
-	    (module_cfg_update & ISP2X_MODULE_RAWHIST2)) {
-		if ((module_cfg_update & ISP2X_MODULE_RAWHIST2))
-			ops->rawhst2_config(params_vdev,
-				&new_params->meas.rawhist2);
+	if (module_en_update & ISP2X_MODULE_RAWAE0)
+		ops->rawae0_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWAE0));
 
-		if (module_en_update & ISP2X_MODULE_RAWHIST2)
-			ops->rawhst2_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RAWHIST2));
-	}
+	if (module_en_update & ISP2X_MODULE_RAWAE1)
+		ops->rawae1_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWAE1));
 
-	if ((module_en_update & ISP2X_MODULE_RAWHIST3) ||
-	    (module_cfg_update & ISP2X_MODULE_RAWHIST3)) {
-		if ((module_cfg_update & ISP2X_MODULE_RAWHIST3))
-			ops->rawhst3_config(params_vdev,
-				&new_params->meas.rawhist3);
+	if (module_en_update & ISP2X_MODULE_RAWAE2)
+		ops->rawae2_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWAE2));
 
-		if (module_en_update & ISP2X_MODULE_RAWHIST3)
-			ops->rawhst3_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RAWHIST3));
-	}
+	if (module_en_update & ISP2X_MODULE_RAWAE3)
+		ops->rawae3_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWAE3));
 
-	if ((module_en_update & ISP2X_MODULE_SIAWB) ||
-	    (module_cfg_update & ISP2X_MODULE_SIAWB)) {
-		if ((module_cfg_update & ISP2X_MODULE_SIAWB))
-			ops->siawb_config(params_vdev,
-				&new_params->meas.siawb);
+	if (module_en_update & ISP2X_MODULE_SIHST)
+		ops->sihst_enable(params_vdev, !!(module_ens & ISP2X_MODULE_SIHST));
 
-		if (module_en_update & ISP2X_MODULE_SIAWB)
-			ops->siawb_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_SIAWB));
-	}
+	if (module_en_update & ISP2X_MODULE_RAWHIST0)
+		ops->rawhst0_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWHIST0));
 
-	if ((module_en_update & ISP2X_MODULE_RAWAWB) ||
-	    (module_cfg_update & ISP2X_MODULE_RAWAWB)) {
-		if ((module_cfg_update & ISP2X_MODULE_RAWAWB))
-			ops->rawawb_config(params_vdev,
-				&new_params->meas.rawawb);
+	if (module_en_update & ISP2X_MODULE_RAWHIST1)
+		ops->rawhst1_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWHIST1));
 
-		if (module_en_update & ISP2X_MODULE_RAWAWB)
-			ops->rawawb_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RAWAWB));
-	}
+	if (module_en_update & ISP2X_MODULE_RAWHIST2)
+		ops->rawhst2_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWHIST2));
 
-	if ((module_en_update & ISP2X_MODULE_SIAF) ||
-	    (module_cfg_update & ISP2X_MODULE_SIAF)) {
-		if ((module_cfg_update & ISP2X_MODULE_SIAF))
-			ops->siaf_config(params_vdev,
-				&new_params->meas.siaf);
+	if (module_en_update & ISP2X_MODULE_RAWHIST3)
+		ops->rawhst3_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWHIST3));
 
-		if (module_en_update & ISP2X_MODULE_SIAF)
-			ops->siaf_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_SIAF));
-	}
+	if (module_en_update & ISP2X_MODULE_SIAWB)
+		ops->siawb_enable(params_vdev, !!(module_ens & ISP2X_MODULE_SIAWB));
 
-	if ((module_en_update & ISP2X_MODULE_RAWAF) ||
-	    (module_cfg_update & ISP2X_MODULE_RAWAF)) {
-		if ((module_cfg_update & ISP2X_MODULE_RAWAF))
-			ops->rawaf_config(params_vdev,
-				&new_params->meas.rawaf);
+	if (module_en_update & ISP2X_MODULE_RAWAWB)
+		ops->rawawb_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWAWB));
 
-		if (module_en_update & ISP2X_MODULE_RAWAF)
-			ops->rawaf_enable(params_vdev,
-				!!(module_ens & ISP2X_MODULE_RAWAF));
-	}
+	if (module_en_update & ISP2X_MODULE_SIAF)
+		ops->siaf_enable(params_vdev, !!(module_ens & ISP2X_MODULE_SIAF));
+
+	if (module_en_update & ISP2X_MODULE_RAWAF)
+		ops->rawaf_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWAF));
 }
 
 static __maybe_unused
@@ -4212,12 +4047,6 @@ void __isp_config_hdrshd(struct rkisp_isp_params_vdev *params_vdev)
 			   &params_vdev->last_hdrtmo, RKISP_PARAMS_ALL);
 }
 
-static __maybe_unused
-void __preisp_isr_update_hdrae_para(struct rkisp_isp_params_vdev *params_vdev,
-				    struct isp2x_isp_params_cfg *new_params)
-{
-}
-
 static
 void rkisp_params_cfgsram_v2x(struct rkisp_isp_params_vdev *params_vdev)
 {
@@ -4247,8 +4076,9 @@ rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev)
 	priv_val->delay_en_ldch = false;
 	params_vdev->first_cfg_params = true;
 	__isp_isr_other_config(params_vdev, params_vdev->isp2x_params, RKISP_PARAMS_ALL);
+	__isp_isr_other_en(params_vdev, params_vdev->isp2x_params, RKISP_PARAMS_ALL);
 	__isp_isr_meas_config(params_vdev, params_vdev->isp2x_params, RKISP_PARAMS_ALL);
-	__preisp_isr_update_hdrae_para(params_vdev, params_vdev->isp2x_params);
+	__isp_isr_meas_en(params_vdev, params_vdev->isp2x_params, RKISP_PARAMS_ALL);
 	params_vdev->first_cfg_params = false;
 
 	params_vdev->cur_hdrtmo = params_vdev->isp2x_params->others.hdrtmo_cfg;
@@ -4420,6 +4250,26 @@ rkisp_params_disable_isp_v2x(struct rkisp_isp_params_vdev *params_vdev)
 	ops->isp3dlut_enable(params_vdev, false);
 }
 
+static void
+ldch_data_abandon(struct rkisp_isp_params_vdev *params_vdev,
+		  struct isp2x_isp_params_cfg *params)
+{
+	const struct isp2x_ldch_cfg *arg = &params->others.ldch_cfg;
+	struct rkisp_isp_params_val_v2x *priv_val;
+	struct isp2x_ldch_head *ldch_head;
+	int i;
+
+	priv_val = (struct rkisp_isp_params_val_v2x *)params_vdev->priv_val;
+	for (i = 0; i < ISP2X_LDCH_BUF_NUM; i++) {
+		if (arg->buf_fd == priv_val->buf_ldch[i].dma_fd &&
+		    priv_val->buf_ldch[i].vaddr) {
+			ldch_head = (struct isp2x_ldch_head *)priv_val->buf_ldch[i].vaddr;
+			ldch_head->stat = LDCH_BUF_CHIPINUSE;
+			break;
+		}
+	}
+}
+
 static void
 rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev,
 		     u32 frame_id, enum rkisp_params_type type)
@@ -4438,14 +4288,18 @@ rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev,
 		cur_buf = list_first_entry(&params_vdev->params,
 				struct rkisp_buffer, queue);
 
-		if (!IS_HDR_RDBK(dev->rd_mode)) {
-			list_del(&cur_buf->queue);
-			break;
-		}
-
 		new_params = (struct isp2x_isp_params_cfg *)(cur_buf->vaddr[0]);
 		if (new_params->frame_id < frame_id) {
 			list_del(&cur_buf->queue);
+			if (list_empty(&params_vdev->params))
+				break;
+			else if (new_params->module_en_update) {
+				/* update en immediately */
+				__isp_isr_other_en(params_vdev, new_params, type);
+				__isp_isr_meas_en(params_vdev, new_params, type);
+			}
+			if (new_params->module_cfg_update & ISP2X_MODULE_LDCH)
+				ldch_data_abandon(params_vdev, new_params);
 			vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
 			cur_buf = NULL;
 			continue;
@@ -4462,7 +4316,9 @@ rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev,
 
 	new_params = (struct isp2x_isp_params_cfg *)(cur_buf->vaddr[0]);
 	__isp_isr_other_config(params_vdev, new_params, type);
+	__isp_isr_other_en(params_vdev, new_params, type);
 	__isp_isr_meas_config(params_vdev, new_params, type);
+	__isp_isr_meas_en(params_vdev, new_params, type);
 	if (!hw_dev->is_single && type != RKISP_PARAMS_SHD)
 		__isp_config_hdrshd(params_vdev);
 
@@ -4647,7 +4503,7 @@ rkisp_params_isr_v2x(struct rkisp_isp_params_vdev *params_vdev,
 	}
 
 	if ((isp_mis & CIF_ISP_FRAME) && !IS_HDR_RDBK(dev->rd_mode))
-		rkisp_params_cfg_v2x(params_vdev, cur_frame_id, RKISP_PARAMS_ALL);
+		rkisp_params_cfg_v2x(params_vdev, cur_frame_id + 1, RKISP_PARAMS_ALL);
 }
 
 static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = {

commit 975b7434846740af037fcce60d5fc6eab517ccbc
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Thu Apr 29 14:52:44 2021 +0800

    media: rockchip: isp: add bt601/bt709/bt2020 colorspace
    
    rkisp-isp-subdev pad2 to change colorspace and quantization
    
    Change-Id: I077eb9482cd09119c11f2515e848dca203c42357
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/isp_params_v1x.c b/drivers/media/platform/rockchip/isp/isp_params_v1x.c
index a38f1b2dfcfa..6719422bf8ca 100644
--- a/drivers/media/platform/rockchip/isp/isp_params_v1x.c
+++ b/drivers/media/platform/rockchip/isp/isp_params_v1x.c
@@ -2214,12 +2214,6 @@ static void rkisp1_params_first_cfg_v1x(struct rkisp_isp_params_vdev *params_vde
 				   hst_params_default_config.mode);
 	}
 
-	/* set the  range */
-	if (params_vdev->quantization == V4L2_QUANTIZATION_FULL_RANGE)
-		ops->csm_config(params_vdev, true);
-	else
-		ops->csm_config(params_vdev, false);
-
 	/* disable color related config for grey sensor */
 	if (params_vdev->in_mbus_code == MEDIA_BUS_FMT_Y8_1X8 ||
 	    params_vdev->in_mbus_code == MEDIA_BUS_FMT_Y10_1X10 ||
diff --git a/drivers/media/platform/rockchip/isp/isp_params_v21.c b/drivers/media/platform/rockchip/isp/isp_params_v21.c
index c12272d5e356..0369b19693c1 100644
--- a/drivers/media/platform/rockchip/isp/isp_params_v21.c
+++ b/drivers/media/platform/rockchip/isp/isp_params_v21.c
@@ -3906,8 +3906,6 @@ static void
 rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev)
 {
 	struct device *dev = params_vdev->dev->dev;
-	struct rkisp_isp_params_v21_ops *ops =
-		(struct rkisp_isp_params_v21_ops *)params_vdev->priv_ops;
 	struct rkisp_isp_params_val_v21 *priv_val =
 		(struct rkisp_isp_params_val_v21 *)params_vdev->priv_val;
 	struct rkisp_hw_dev *hw = params_vdev->dev->hw_dev;
@@ -3922,12 +3920,6 @@ rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev)
 	    !params_vdev->isp21_params->module_en_update)
 		dev_warn(dev, "can not get first iq setting in stream on\n");
 
-	/* set the  range */
-	if (params_vdev->quantization == V4L2_QUANTIZATION_FULL_RANGE)
-		ops->csm_config(params_vdev, true);
-	else
-		ops->csm_config(params_vdev, false);
-
 	priv_val->dhaz_en = 0;
 	priv_val->wdr_en = 0;
 	priv_val->tmo_en = 0;
diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.c b/drivers/media/platform/rockchip/isp/isp_params_v2x.c
index b8b1934dfb62..9d7f9beb7016 100644
--- a/drivers/media/platform/rockchip/isp/isp_params_v2x.c
+++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.c
@@ -4230,8 +4230,6 @@ static void
 rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev)
 {
 	struct device *dev = params_vdev->dev->dev;
-	struct rkisp_isp_params_v2x_ops *ops =
-		(struct rkisp_isp_params_v2x_ops *)params_vdev->priv_ops;
 	struct rkisp_isp_params_val_v2x *priv_val =
 		(struct rkisp_isp_params_val_v2x *)params_vdev->priv_val;
 
@@ -4241,12 +4239,6 @@ rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev)
 	    !params_vdev->isp2x_params->module_en_update)
 		dev_warn(dev, "can not get first iq setting in stream on\n");
 
-	/* set the  range */
-	if (params_vdev->quantization == V4L2_QUANTIZATION_FULL_RANGE)
-		ops->csm_config(params_vdev, true);
-	else
-		ops->csm_config(params_vdev, false);
-
 	priv_val->dhaz_en = 0;
 	priv_val->wdr_en = 0;
 	priv_val->tmo_en = 0;
diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c
index f357c85cb011..6f8768befb7d 100644
--- a/drivers/media/platform/rockchip/isp/rkisp.c
+++ b/drivers/media/platform/rockchip/isp/rkisp.c
@@ -1029,6 +1029,67 @@ static void rkisp_monitor_init(struct rkisp_device *dev)
 	INIT_WORK(&monitor->work, rkisp_restart_monitor);
 }
 
+/*
+ * RGB to YUV color space, default BT601
+ * BT601:
+ * Y = 0.299R + 0.587G + 0.114B
+ * CB = -0.1687R - 0.3313G + 0.5B
+ * CR = 0.5R - 0.4187G - 0.0813B
+ * BT709:
+ * Y = 0.2126R + 0.7152G + 0.0722B
+ * CB = -0.1146R - 0.3854G + 0.5B
+ * CR = 0.5R - 0.4542G - 0.0458B
+ * BT2020:
+ * Y = 0.2627R + 0.678G + 0.0593B
+ * CB = -0.1396R - 0.3604G + 0.5B
+ * CR = 0.5R - 0.4598G - 0.0402B
+ * 9 bit coeffs are signed integer values with 7 bit fractional
+ */
+static void rkisp_config_color_space(struct rkisp_device *dev)
+{
+	u16 bt601_coeff[] = {
+		0x0026, 0x004b, 0x000f,
+		0x01ea, 0x01d6, 0x0040,
+		0x0040, 0x01ca, 0x01f6
+	};
+	u16 bt709_coeff[] = {
+		0x001b, 0x005c, 0x0009,
+		0x01f1, 0x01cf, 0x0040,
+		0x0040, 0x01c6, 0x01fa
+	};
+	u16 bt2020_coeff[] = {
+		0x0022, 0x0057, 0x0008,
+		0x01ee, 0x01d2, 0x0040,
+		0x0040, 0x01c5, 0x01fb
+	};
+	u16 i, *coeff;
+
+	switch (dev->isp_sdev.colorspace) {
+	case V4L2_COLORSPACE_REC709:
+		coeff = bt709_coeff;
+		break;
+	case V4L2_COLORSPACE_BT2020:
+		coeff = bt2020_coeff;
+		break;
+	case V4L2_COLORSPACE_SMPTE170M:
+	default:
+		coeff = bt601_coeff;
+		break;
+	}
+
+	for (i = 0; i < 9; i++)
+		rkisp_write(dev, CIF_ISP_CC_COEFF_0 + i * 4, *(coeff + i), false);
+
+	if (dev->isp_sdev.quantization == V4L2_QUANTIZATION_FULL_RANGE)
+		rkisp_set_bits(dev, CIF_ISP_CTRL, 0,
+			       CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA |
+			       CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA, false);
+	else
+		rkisp_clear_bits(dev, CIF_ISP_CTRL,
+				 CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA |
+				 CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA, false);
+}
+
 /*
  * configure isp blocks with input format, size......
  */
@@ -1168,12 +1229,13 @@ static int rkisp_config_isp(struct rkisp_device *dev)
 		rkisp_write(dev, ISP_ISP3A_IMSC, irq_mask, true);
 	}
 
-	if (out_fmt->fmt_type == FMT_BAYER)
+	if (out_fmt->fmt_type == FMT_BAYER) {
 		rkisp_params_disable_isp(&dev->params_vdev);
-	else
+	} else {
+		rkisp_config_color_space(dev);
 		rkisp_params_first_cfg(&dev->params_vdev, in_fmt,
 				       dev->isp_sdev.quantization);
-
+	}
 	if (!dev->hw_dev->is_single && atomic_read(&dev->hw_dev->refcnt) <= 1) {
 		rkisp_update_regs(dev, CIF_ISP_ACQ_H_OFFS, CIF_ISP_ACQ_V_SIZE);
 		rkisp_update_regs(dev, CIF_ISP_OUT_H_SIZE, CIF_ISP_OUT_V_SIZE);
@@ -1903,6 +1965,7 @@ static int rkisp_isp_sd_get_fmt(struct v4l2_subdev *sd,
 		mf->width = isp_sd->out_crop.width;
 		mf->height = isp_sd->out_crop.height;
 		mf->quantization = isp_sd->quantization;
+		mf->colorspace = isp_sd->colorspace;
 	}
 	mf->field = V4L2_FIELD_NONE;
 
@@ -1955,13 +2018,15 @@ static int rkisp_isp_sd_set_fmt(struct v4l2_subdev *sd,
 		mf->width  = isp_sd->out_crop.width;
 		mf->height = isp_sd->out_crop.height;
 		/* full range by default */
-		if (!mf->quantization)
+		if (mf->quantization == V4L2_QUANTIZATION_DEFAULT)
 			mf->quantization = V4L2_QUANTIZATION_FULL_RANGE;
-		/*
-		 * It is quantization for output,
-		 * isp use bt601 limit-range in internal
-		 */
+		/* BT601 default */
+		if (mf->colorspace != V4L2_COLORSPACE_SMPTE170M &&
+		    mf->colorspace != V4L2_COLORSPACE_REC709 &&
+		    mf->colorspace != V4L2_COLORSPACE_BT2020)
+			mf->colorspace = V4L2_COLORSPACE_SMPTE170M;
 		isp_sd->quantization = mf->quantization;
+		isp_sd->colorspace = mf->colorspace;
 	}
 
 	mf->field = V4L2_FIELD_NONE;
@@ -2488,45 +2553,44 @@ static long rkisp_compat_ioctl32(struct v4l2_subdev *sd,
 
 	switch (cmd) {
 	case RKISP_CMD_TRIGGER_READ_BACK:
-		ret = copy_from_user(&trigger, up, sizeof(trigger));
-		if (!ret)
-			ret = rkisp_ioctl(sd, cmd, &trigger);
+		if (copy_from_user(&trigger, up, sizeof(trigger)))
+			return -EFAULT;
+		ret = rkisp_ioctl(sd, cmd, &trigger);
 		break;
 	case RKISP_CMD_CSI_MEMORY_MODE:
-		ret = copy_from_user(&mode, up, sizeof(int));
-		if (!ret)
-			ret = rkisp_ioctl(sd, cmd, &mode);
+		if (copy_from_user(&mode, up, sizeof(int)))
+			return -EFAULT;
+		ret = rkisp_ioctl(sd, cmd, &mode);
 		break;
 	case RKISP_CMD_GET_SHARED_BUF:
 		ret = rkisp_ioctl(sd, cmd, &resmem);
-		if (!ret)
-			ret = copy_to_user(up, &resmem, sizeof(resmem));
+		if (!ret && copy_to_user(up, &resmem, sizeof(resmem)))
+			ret = -EFAULT;
 		break;
 	case RKISP_CMD_FREE_SHARED_BUF:
 		ret = rkisp_ioctl(sd, cmd, NULL);
 		break;
 	case RKISP_CMD_GET_LDCHBUF_INFO:
 		ret = rkisp_ioctl(sd, cmd, &ldchbuf);
-		if (!ret)
-			ret = copy_to_user(up, &ldchbuf, sizeof(ldchbuf));
+		if (!ret && copy_to_user(up, &ldchbuf, sizeof(ldchbuf)))
+			ret = -EFAULT;
 		break;
 	case RKISP_CMD_SET_LDCHBUF_SIZE:
-		ret = copy_from_user(&ldchsize, up, sizeof(ldchsize));
-		if (!ret)
-			ret = rkisp_ioctl(sd, cmd, &ldchsize);
+		if (copy_from_user(&ldchsize, up, sizeof(ldchsize)))
+			return -EFAULT;
+		ret = rkisp_ioctl(sd, cmd, &ldchsize);
 		break;
 	case RKISP_CMD_GET_SHM_BUFFD:
-		ret = copy_from_user(&shmem, up, sizeof(shmem));
-		if (!ret) {
-			ret = rkisp_ioctl(sd, cmd, &shmem);
-			if (!ret)
-				ret = copy_to_user(up, &shmem, sizeof(shmem));
-		}
+		if (copy_from_user(&shmem, up, sizeof(shmem)))
+			return -EFAULT;
+		ret = rkisp_ioctl(sd, cmd, &shmem);
+		if (!ret && copy_to_user(up, &shmem, sizeof(shmem)))
+			ret = -EFAULT;
 		break;
 	case RKISP_CMD_GET_FBCBUF_FD:
 		ret = rkisp_ioctl(sd, cmd, &idxfd);
-		if (!ret)
-			ret = copy_to_user(up, &idxfd, sizeof(idxfd));
+		if (!ret && copy_to_user(up, &idxfd, sizeof(idxfd)))
+			ret = -EFAULT;
 		break;
 	default:
 		ret = -ENOIOCTLCMD;
@@ -2593,6 +2657,8 @@ static void rkisp_isp_sd_init_default_fmt(struct rkisp_isp_subdev *isp_sd)
 	/* propagate to source */
 	*out_crop = *in_crop;
 	*out_fmt = rkisp_isp_output_formats[0];
+	isp_sd->quantization = V4L2_QUANTIZATION_FULL_RANGE;
+	isp_sd->colorspace = V4L2_COLORSPACE_SMPTE170M;
 }
 
 int rkisp_register_isp_subdev(struct rkisp_device *isp_dev,
diff --git a/drivers/media/platform/rockchip/isp/rkisp.h b/drivers/media/platform/rockchip/isp/rkisp.h
index 3d7ecd50456a..39266569e14c 100644
--- a/drivers/media/platform/rockchip/isp/rkisp.h
+++ b/drivers/media/platform/rockchip/isp/rkisp.h
@@ -121,6 +121,7 @@ struct rkisp_isp_subdev {
 	bool dphy_errctrl_disabled;
 	atomic_t frm_sync_seq;
 	enum v4l2_quantization quantization;
+	enum v4l2_colorspace colorspace;
 	u64 frm_timestamp;
 	struct frame_debug_info dbg;
 };

commit f0d532ee6659ed922e25eb721cb976fd264e072f
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Wed Jun 2 17:55:07 2021 +0800

    PCI: rockchip: dw: Restore DBI COMMAND register
    
    It isn't sticky when link goes down for whatever reason.
    If devices want to reset the modules by puting link into D3
    state or whatever, we should restore it the. Otherwise devices
    cannot access RC's resource even if the link is recovered.
    
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: Ie5b5a0b7f6ab03961658b4217c9db2cada0edb93

diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
index fdc3597ed6d5..caf41cce1b45 100644
--- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
+++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
@@ -84,6 +84,7 @@ struct reset_bulk_data	{
 #define PCIE_CAP_LINK_CONTROL2_LINK_STATUS	0xa0
 
 #define PCIE_CLIENT_INTR_STATUS_LEGACY	0x08
+#define PCIE_CLIENT_INTR_STATUS_MISC	0x10
 #define PCIE_CLIENT_INTR_MASK_LEGACY	0x1c
 #define UNMASK_ALL_LEGACY_INT		0xffff0000
 #define PCIE_CLIENT_INTR_MASK		0x24
@@ -447,6 +448,9 @@ static int rk_pcie_establish_link(struct dw_pcie *pci)
 	rk_pcie_link_status_clear(rk_pcie);
 	rk_pcie_enable_debug(rk_pcie);
 
+	/* Enable client reset or link down interrupt */
+	rk_pcie_writel_apb(rk_pcie, PCIE_CLIENT_INTR_MASK, 0x40000);
+
 	/* Enable LTSSM */
 	rk_pcie_enable_ltssm(rk_pcie);
 
@@ -997,6 +1001,7 @@ static irqreturn_t rk_pcie_sys_irq_handler(int irq, void *arg)
 	u32 chn = 0;
 	union int_status status;
 	union int_clear clears;
+	u32 reg, val;
 
 	status.asdword = dw_pcie_readl_dbi(rk_pcie->pci, PCIE_DMA_OFFSET +
 					   PCIE_DMA_WR_INT_STATUS);
@@ -1018,6 +1023,18 @@ static irqreturn_t rk_pcie_sys_irq_handler(int irq, void *arg)
 				   PCIE_DMA_WR_INT_CLEAR, clears.asdword);
 	}
 
+	reg = rk_pcie_readl_apb(rk_pcie, PCIE_CLIENT_INTR_STATUS_MISC);
+	if (reg & BIT(2)) {
+		/* Setup command register */
+		val = dw_pcie_readl_dbi(rk_pcie->pci, PCI_COMMAND);
+		val &= 0xffff0000;
+		val |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
+		       PCI_COMMAND_MASTER | PCI_COMMAND_SERR;
+		dw_pcie_writel_dbi(rk_pcie->pci, PCI_COMMAND, val);
+	}
+
+	rk_pcie_writel_apb(rk_pcie, PCIE_CLIENT_INTR_STATUS_MISC, reg);
+
 	return IRQ_HANDLED;
 }
 

commit 2e213f3bdf059d3b3b033fd98a3cbf67bd1a5bbf
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Thu Jun 3 15:06:44 2021 +0800

    arm64: dts: rockchip: pinconf.dtsi add output level with pull up/down
    
    Change-Id: I3ce795514365e3f7f2302dfbc1deb73884b645be
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rockchip-pinconf.dtsi b/arch/arm64/boot/dts/rockchip/rockchip-pinconf.dtsi
index bba97f68371b..fc0145333257 100644
--- a/arch/arm64/boot/dts/rockchip/rockchip-pinconf.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rockchip-pinconf.dtsi
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: (GPL-2.0+ OR MIT)
 /*
- * Copyright (c) 2020 Rockchip Electronics Co., Ltd.
+ * Copyright (c) 2020~2021 Rockchip Electronics Co., Ltd.
  */
 
 &pinctrl {
@@ -338,9 +338,45 @@
 		output-high;
 	};
 
+	/omit-if-no-ref/
+	pcfg_output_high_pull_up: pcfg-output-high-pull-up {
+		output-high;
+		bias-pull-up;
+	};
+
+	/omit-if-no-ref/
+	pcfg_output_high_pull_down: pcfg-output-high-pull-down {
+		output-high;
+		bias-pull-down;
+	};
+
+	/omit-if-no-ref/
+	pcfg_output_high_pull_none: pcfg-output-high-pull-none {
+		output-high;
+		bias-disable;
+	};
+
 	/omit-if-no-ref/
 	pcfg_output_low: pcfg-output-low {
 		output-low;
 	};
+
+	/omit-if-no-ref/
+	pcfg_output_low_pull_up: pcfg-output-low-pull-up {
+		output-low;
+		bias-pull-up;
+	};
+
+	/omit-if-no-ref/
+	pcfg_output_low_pull_down: pcfg-output-low-pull-down {
+		output-low;
+		bias-pull-down;
+	};
+
+	/omit-if-no-ref/
+	pcfg_output_low_pull_none: pcfg-output-low-pull-none {
+		output-low;
+		bias-disable;
+	};
 };
 

commit a38e11873b06996836abc84ba8510135d87a59ec
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Thu Jun 3 15:05:50 2021 +0800

    ARM: dts: rockchip: pinconf.dtsi add output level with pull up/down
    
    Change-Id: Id40ca9a6efbbfa05df6bc4ebe36a07874b9a837d
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/arch/arm/boot/dts/rockchip-pinconf.dtsi b/arch/arm/boot/dts/rockchip-pinconf.dtsi
index 32bbb98b1ec2..fc0145333257 100644
--- a/arch/arm/boot/dts/rockchip-pinconf.dtsi
+++ b/arch/arm/boot/dts/rockchip-pinconf.dtsi
@@ -1,7 +1,8 @@
 // SPDX-License-Identifier: (GPL-2.0+ OR MIT)
 /*
- * Copyright (c) 2020 Fuzhou Rockchip Electronics Co., Ltd
+ * Copyright (c) 2020~2021 Rockchip Electronics Co., Ltd.
  */
+
 &pinctrl {
 
 	/omit-if-no-ref/
@@ -337,9 +338,45 @@
 		output-high;
 	};
 
+	/omit-if-no-ref/
+	pcfg_output_high_pull_up: pcfg-output-high-pull-up {
+		output-high;
+		bias-pull-up;
+	};
+
+	/omit-if-no-ref/
+	pcfg_output_high_pull_down: pcfg-output-high-pull-down {
+		output-high;
+		bias-pull-down;
+	};
+
+	/omit-if-no-ref/
+	pcfg_output_high_pull_none: pcfg-output-high-pull-none {
+		output-high;
+		bias-disable;
+	};
+
 	/omit-if-no-ref/
 	pcfg_output_low: pcfg-output-low {
 		output-low;
 	};
+
+	/omit-if-no-ref/
+	pcfg_output_low_pull_up: pcfg-output-low-pull-up {
+		output-low;
+		bias-pull-up;
+	};
+
+	/omit-if-no-ref/
+	pcfg_output_low_pull_down: pcfg-output-low-pull-down {
+		output-low;
+		bias-pull-down;
+	};
+
+	/omit-if-no-ref/
+	pcfg_output_low_pull_none: pcfg-output-low-pull-none {
+		output-low;
+		bias-disable;
+	};
 };
 

commit ed104924c3ad81fc87f99eb77acf4fc339379e83
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Thu May 27 14:51:54 2021 +0800

    media: spi: add motor driver ms41908
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: Ifad84f0abad6af9ae3b97a5efe9a89842a18e9c7

diff --git a/drivers/media/spi/Kconfig b/drivers/media/spi/Kconfig
index fcc2e849c154..0d74bf402308 100644
--- a/drivers/media/spi/Kconfig
+++ b/drivers/media/spi/Kconfig
@@ -9,6 +9,12 @@ config VIDEO_GS1662
 	---help---
 	  Enable the GS1662 driver which serializes video streams.
 
+config VIDEO_MS41908
+	tristate "Relmon MS41908 motor driver"
+	depends on SPI && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
+	---help---
+	  Support motor driver By MS41908 for camera Lens.
+
 config VIDEO_ROCKCHIP_PREISP
 	tristate "Rockchip Image Signal Pre-processing driver"
 	depends on VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API && SPI_MASTER
diff --git a/drivers/media/spi/Makefile b/drivers/media/spi/Makefile
index a570cfda3572..5a323a7b556e 100644
--- a/drivers/media/spi/Makefile
+++ b/drivers/media/spi/Makefile
@@ -1,4 +1,5 @@
 obj-$(CONFIG_VIDEO_GS1662) += gs1662.o
+obj-$(CONFIG_VIDEO_MS41908) += ms41908.o
 obj-$(CONFIG_VIDEO_ROCKCHIP_PREISP) += rk1608.o rk1608_dphy.o
 obj-$(CONFIG_CXD2880_SPI_DRV) += cxd2880-spi.o
 
diff --git a/drivers/media/spi/ms41908.c b/drivers/media/spi/ms41908.c
new file mode 100644
index 000000000000..39c85c5cf04a
--- /dev/null
+++ b/drivers/media/spi/ms41908.c
@@ -0,0 +1,2776 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * motor  driver
+ *
+ * Copyright (C) 2020 Rockchip Electronics Co., Ltd.
+ *
+ */
+//#define DEBUG
+#include <linux/io.h>
+#include <linux/of_gpio.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/device.h>
+#include <linux/fb.h>
+#include <linux/interrupt.h>
+#include <linux/kernel.h>
+#include <linux/gpio/consumer.h>
+#include <linux/of_irq.h>
+#include <linux/platform_device.h>
+#include <linux/wakelock.h>
+#include <linux/hrtimer.h>
+#include <linux/pwm.h>
+#include <linux/delay.h>
+#include <media/v4l2-subdev.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <linux/mutex.h>
+#include <linux/version.h>
+#include <linux/rk-camera-module.h>
+#include <linux/completion.h>
+#include "linux/rk_vcm_head.h"
+#include <linux/time.h>
+#include <linux/semaphore.h>
+
+#define DRIVER_VERSION	KERNEL_VERSION(0, 0x01, 0x00)
+
+#define DRIVER_NAME "ms41908"
+
+#define PSUMAB	0X24
+#define INTCTAB	0X25
+#define PSUMCD	0X29
+#define INTCTCD	0X2A
+
+#define START_UP_HZ_DEF			(800)
+#define PIRIS_MAX_STEP_DEF		(80)
+#define FOCUS_MAX_STEP_DEF		(3060)
+#define ZOOM_MAX_STEP_DEF		(1520)
+
+#define DCIRIS_MAX_LOG			1023
+
+#define VD_FZ_US			10000
+
+#define PPW_DEF				0xff
+#define MICRO_DEF			64
+#define PHMODE_DEF			0
+#define PPW_STOP			0x00
+
+#define FOCUS_MAX_BACK_DELAY		4
+#define ZOOM_MAX_BACK_DELAY		4
+#define ZOOM1_MAX_BACK_DELAY		4
+
+#define to_motor_dev(sd) container_of(sd, struct motor_dev, subdev)
+
+enum {
+	MOTOR_STATUS_STOPPED = 0,
+	MOTOR_STATUS_CCW = 1,
+	MOTOR_STATUS_CW = 2,
+};
+
+enum ext_dev_type {
+	TYPE_IRIS = 0,
+	TYPE_FOCUS = 1,
+	TYPE_ZOOM = 2,
+	TYPE_ZOOM1 = 3,
+};
+
+struct motor_reg_s {
+	u16 dt2_phmod;
+	u16 ppw;
+	u16 psum;
+	u16 intct;
+};
+
+struct reg_op_s {
+	struct motor_reg_s reg;
+	u16 tmp_psum;
+	bool is_used;
+};
+
+struct run_data_s {
+	u32 count;
+	u32 cur_count;
+	u32 psum;
+	u32 psum_last;
+	u32 intct;
+	u32 ppw;
+	u32 ppw_stop;
+	u32 phmode;
+	u32 micro;
+};
+
+struct ext_dev {
+	u8 type;
+	u32 step_max;
+	int last_pos;
+	u32 start_up_speed;
+	u32 move_status;
+	u32 reback_status;
+	u32 move_time_us;
+	u32 reback_move_time_us;
+	u32 backlash;
+	int reback;
+	u32 last_dir;
+	int min_pos;
+	int max_pos;
+	bool is_half_step_mode;
+	bool is_mv_tim_update;
+	bool is_need_update_tim;
+	bool is_dir_opp;
+	bool is_need_reback;
+	struct rk_cam_vcm_tim mv_tim;
+	struct run_data_s run_data;
+	struct run_data_s reback_data;
+	struct completion complete;
+	struct reg_op_s *reg_op;
+	struct gpio_desc *pic_gpio;
+	struct gpio_desc *pia_gpio;
+	struct gpio_desc *pie_gpio;
+	int cur_back_delay;
+	int max_back_delay;
+	struct completion complete_out;
+	bool is_running;
+};
+
+struct dciris_dev {
+	u32 last_log;
+	u32 max_log;
+	bool is_reversed_polarity;
+	struct gpio_desc *vd_iris_gpio;
+};
+
+struct motor_dev {
+	struct spi_device *spi;
+	struct v4l2_subdev subdev;
+	struct v4l2_ctrl_handler ctrl_handler;
+	struct v4l2_ctrl *iris_ctrl;
+	struct v4l2_ctrl *focus_ctrl;
+	struct v4l2_ctrl *zoom_ctrl;
+	struct v4l2_ctrl *zoom1_ctrl;
+	struct hrtimer timer;
+	struct mutex mutex;
+	u32 module_index;
+	const char *module_facing;
+	struct ext_dev *piris;
+	struct ext_dev *focus;
+	struct ext_dev *zoom;
+	struct ext_dev *zoom1;
+	struct ext_dev *dev0;
+	struct ext_dev *dev1;
+	bool is_use_dc_iris;
+	bool is_use_p_iris;
+	bool is_use_focus;
+	bool is_use_zoom;
+	bool is_use_zoom1;
+	struct gpio_desc *reset_gpio;
+	struct gpio_desc *vd_fz_gpio;
+	bool is_timer_restart;
+	bool is_should_wait;
+	struct motor_work_s *wk;
+	u32 vd_fz_period_us;
+	struct reg_op_s motor_op[2];
+	struct dciris_dev *dciris;
+	int id;
+	int wait_cnt;
+};
+
+struct motor_work_s {
+	struct work_struct work;
+	struct motor_dev *dev;
+};
+
+static const struct reg_op_s g_motor_op[2] = {{{0x22, 0x23, 0x24, 0x25}, 0, 0},
+					   {{0x27, 0x28, 0x29, 0x2a}, 0, 0}};
+
+static int spi_write_reg(struct spi_device *spi, u8 reg, u16 val)
+{
+	int ret = 0;
+	u8 buf_reg = reg;
+	u16 buf_val = val;
+
+	struct spi_message msg;
+	struct spi_transfer tx[] = {
+		{
+			.tx_buf = &buf_reg,
+			.len = 1,
+			.delay_usecs = 1,
+		}, {
+			.tx_buf = &buf_val,
+			.len = 2,
+			.delay_usecs = 1,
+		},
+	};
+	spi_message_init(&msg);
+	spi_message_add_tail(&tx[0], &msg);
+	spi_message_add_tail(&tx[1], &msg);
+	ret = spi_sync(spi, &msg);
+	return ret;
+}
+
+static __maybe_unused int spi_read_reg(struct spi_device *spi, u8 reg, u16 *val)
+{
+	int ret = 0;
+	u8 buf_reg = reg | 0x40;
+	u16 buf_val = 0;
+
+	struct spi_message msg;
+	struct spi_transfer tx[] = {
+		{
+			.tx_buf = &buf_reg,
+			.len = 1,
+			.delay_usecs = 1,
+		}, {
+			.rx_buf = &buf_val,
+			.len = 2,
+			.delay_usecs = 1,
+		},
+	};
+	spi_message_init(&msg);
+	spi_message_add_tail(&tx[0], &msg);
+	spi_message_add_tail(&tx[1], &msg);
+	ret = spi_sync(spi, &msg);
+	*val = buf_val;
+
+	return ret;
+}
+
+static int set_motor_running_status(struct motor_dev *motor,
+				    struct ext_dev *ext_dev,
+				    s32 pos,
+				    bool is_need_update_tim,
+				    bool is_should_wait,
+				    bool is_need_reback)
+{
+	int ret = 0;
+	u32 step = 0;
+	u16 psum = 0;
+	struct run_data_s run_data = ext_dev->run_data;
+	u32 micro = 0;
+	u32 mv_cnt = 0;
+	int status = 0;
+
+	if (ext_dev->move_status != MOTOR_STATUS_STOPPED)
+		wait_for_completion(&ext_dev->complete);
+	ext_dev->is_mv_tim_update = false;
+
+	ext_dev->move_time_us = 0;
+	mv_cnt = abs(pos - ext_dev->last_pos);
+	if (is_need_reback)
+		mv_cnt += ext_dev->reback;
+	dev_dbg(&motor->spi->dev,
+		"dev type %d pos %d, last_pos %d, mv_cnt %d, status %d is_need_reback %d\n",
+		ext_dev->type, pos, ext_dev->last_pos, mv_cnt, status, is_need_reback);
+	if (mv_cnt == 0) {
+		mutex_lock(&motor->mutex);
+		if (is_need_update_tim) {
+			ext_dev->mv_tim.vcm_start_t = ns_to_timeval(ktime_get_ns());
+			ext_dev->mv_tim.vcm_end_t = ext_dev->mv_tim.vcm_start_t;
+			ext_dev->is_mv_tim_update = true;
+		}
+		if (is_should_wait) {
+			motor->wait_cnt++;
+		} else if (motor->is_timer_restart == false && motor->wait_cnt) {
+			hrtimer_start(&motor->timer, ktime_set(0, 0), HRTIMER_MODE_REL);
+			motor->wait_cnt = 0;
+		} else {
+			motor->wait_cnt = 0;
+		}
+		mutex_unlock(&motor->mutex);
+		return 0;
+	}
+	ext_dev->is_running = true;
+	reinit_completion(&ext_dev->complete);
+
+	if (ext_dev->is_dir_opp) {
+		if (pos > ext_dev->last_pos) {
+			if (ext_dev->last_dir == MOTOR_STATUS_CCW)
+				mv_cnt += ext_dev->backlash;
+			status = MOTOR_STATUS_CW;
+		} else {
+			if (ext_dev->last_dir == MOTOR_STATUS_CW)
+				mv_cnt += ext_dev->backlash;
+			status = MOTOR_STATUS_CCW;
+		}
+	} else {
+		if (pos > ext_dev->last_pos) {
+			if (ext_dev->last_dir == MOTOR_STATUS_CW)
+				mv_cnt += ext_dev->backlash;
+			status = MOTOR_STATUS_CCW;
+		} else {
+			if (ext_dev->last_dir == MOTOR_STATUS_CCW)
+				mv_cnt += ext_dev->backlash;
+			status = MOTOR_STATUS_CW;
+		}
+	}
+
+	if (ext_dev->is_half_step_mode)
+		step = mv_cnt * 4;
+	else
+		step = mv_cnt * 8;
+
+	run_data.count = (step + run_data.psum - 1) / run_data.psum;
+	run_data.cur_count = run_data.count;
+	run_data.psum_last = step % run_data.psum;
+	if (run_data.psum_last == 0)
+		run_data.psum_last = run_data.psum;
+
+	switch (run_data.micro) {
+	case 64:
+		micro = 0x03;
+		break;
+	case 128:
+		micro = 0x02;
+		break;
+	case 256:
+		micro = 0x00;
+		break;
+	default:
+		micro = 0x00;
+		break;
+	};
+	if (run_data.count == 1)
+		psum = ((status - 1) << 8) |
+		       (1 << 10) |
+		       (micro << 12) |
+		       (run_data.psum_last);
+	else
+		psum = ((status - 1) << 8) |
+		       (1 << 10) |
+		       (micro << 12) |
+		       (run_data.psum);
+	mutex_lock(&motor->mutex);
+	ext_dev->is_need_update_tim = is_need_update_tim;
+	ext_dev->is_need_reback = is_need_reback;
+	ext_dev->move_time_us = (run_data.count + 1) * (motor->vd_fz_period_us + 500);
+	if (is_need_reback)
+		ext_dev->move_time_us += ext_dev->reback_move_time_us;
+
+	ext_dev->last_pos = pos;
+	ext_dev->run_data = run_data;
+	ext_dev->move_status = status;
+	spi_write_reg(motor->spi, 0x20, 0x1a01);
+	spi_write_reg(motor->spi, ext_dev->reg_op->reg.ppw, run_data.ppw | (run_data.ppw << 8));
+	spi_write_reg(motor->spi, ext_dev->reg_op->reg.psum, psum);
+	spi_write_reg(motor->spi, ext_dev->reg_op->reg.intct, ext_dev->run_data.intct);
+	ext_dev->reg_op->tmp_psum = psum;
+
+	ext_dev->last_dir = status;
+	if (is_should_wait) {
+		motor->wait_cnt++;
+	} else if (motor->is_timer_restart == false) {
+		hrtimer_start(&motor->timer, ktime_set(0, 0), HRTIMER_MODE_REL);
+		motor->wait_cnt = 0;
+	} else {
+		motor->wait_cnt = 0;
+	}
+	mutex_unlock(&motor->mutex);
+	dev_dbg(&motor->spi->dev,
+		 "ext_dev type %d move count %d, psum %d, psum_last %d, move_time_us %u!\n",
+		 ext_dev->type,
+		 ext_dev->run_data.count,
+		 ext_dev->run_data.psum,
+		 ext_dev->run_data.psum_last,
+		 ext_dev->move_time_us);
+
+	return ret;
+}
+
+static int motor_dev_parse_dt(struct motor_dev *motor)
+{
+	struct device_node *node = motor->spi->dev.of_node;
+	int ret = 0;
+	const char *str;
+	int step_motor_cnt = 0;
+
+	motor->is_use_dc_iris =
+		device_property_read_bool(&motor->spi->dev, "use-dc-iris");
+	motor->is_use_p_iris =
+		device_property_read_bool(&motor->spi->dev, "use-p-iris");
+	motor->is_use_focus =
+		device_property_read_bool(&motor->spi->dev, "use-focus");
+	motor->is_use_zoom =
+		device_property_read_bool(&motor->spi->dev, "use-zoom");
+	motor->is_use_zoom1 =
+		device_property_read_bool(&motor->spi->dev, "use-zoom1");
+
+	/* get reset gpio */
+	motor->reset_gpio = devm_gpiod_get(&motor->spi->dev,
+					     "reset", GPIOD_OUT_LOW);
+	if (IS_ERR(motor->reset_gpio))
+		dev_err(&motor->spi->dev, "Failed to get reset-gpios\n");
+
+	/* get vd_fz gpio */
+	motor->vd_fz_gpio = devm_gpiod_get(&motor->spi->dev,
+					      "vd_fz", GPIOD_OUT_LOW);
+	if (IS_ERR(motor->vd_fz_gpio))
+		dev_info(&motor->spi->dev, "Failed to get vd_fz-gpios\n");
+
+	ret = of_property_read_u32(node,
+				   "vd_fz-period-us",
+				   &motor->vd_fz_period_us);
+	if (ret != 0) {
+		motor->vd_fz_period_us = VD_FZ_US;
+		dev_err(&motor->spi->dev,
+			"failed get vd_fz-period-us,use dafult value\n");
+	}
+
+	ret = of_property_read_u32(node,
+				   "id",
+				   &motor->id);
+	if (ret != 0) {
+		motor->id = 0;
+		dev_err(&motor->spi->dev,
+			"failed get driver id,use dafult value\n");
+	}
+
+	if (motor->is_use_dc_iris) {
+		motor->dciris = devm_kzalloc(&motor->spi->dev, sizeof(*motor->dciris), GFP_KERNEL);
+		if (!motor->dciris) {
+			dev_err(&motor->spi->dev,
+				"__line__ %d, devm_kzalloc return fail!\n", __LINE__);
+			return -ENOMEM;
+		}
+			/* get vd_iris gpio */
+		motor->dciris->vd_iris_gpio = devm_gpiod_get(&motor->spi->dev,
+					     "vd_iris", GPIOD_OUT_LOW);
+		if (IS_ERR(motor->dciris->vd_iris_gpio))
+			dev_info(&motor->spi->dev, "Failed to get vd_iris-gpios\n");
+		motor->dciris->is_reversed_polarity =
+			device_property_read_bool(&motor->spi->dev, "dc-iris-reserved-polarity");
+		ret = of_property_read_u32(node,
+					   "dc-iris-max-log",
+					   &motor->dciris->max_log);
+		if (ret != 0) {
+			motor->dciris->max_log = DCIRIS_MAX_LOG;
+			dev_err(&motor->spi->dev,
+				"failed get dc-iris max log,use dafult value\n");
+		}
+	}
+
+	if (motor->is_use_p_iris) {
+		if (motor->is_use_dc_iris) {
+			dev_err(&motor->spi->dev,
+				"Does not support p-iris and dc-iris on the same module\n");
+			return -EINVAL;
+		}
+		step_motor_cnt++;
+		motor->piris = devm_kzalloc(&motor->spi->dev, sizeof(*motor->piris), GFP_KERNEL);
+		if (!motor->piris) {
+			dev_err(&motor->spi->dev,
+				"__line__ %d, devm_kzalloc return fail!\n", __LINE__);
+			return -ENOMEM;
+		}
+		ret = of_property_read_string(node, "piris-used-pin",
+					       &str);
+		if (ret != 0) {
+			dev_err(&motor->spi->dev,
+				"get piris-used-pin fail, please check it!\n");
+			return -EINVAL;
+		}
+		if (strcmp(str, "ab") == 0) {
+			motor->piris->reg_op = &motor->motor_op[0];
+			if (motor->piris->reg_op->is_used) {
+				dev_err(&motor->spi->dev,
+					"__line__ %d, pin already been used\n", __LINE__);
+				return -EINVAL;
+			}
+			motor->piris->reg_op->is_used = true;
+		} else if (strcmp(str, "cd") == 0) {
+			motor->piris->reg_op = &motor->motor_op[1];
+			if (motor->piris->reg_op->is_used) {
+				dev_err(&motor->spi->dev,
+					"__line__ %d, pin already been used\n", __LINE__);
+				return -EINVAL;
+			}
+			motor->piris->reg_op->is_used = true;
+		} else {
+			dev_err(&motor->spi->dev,
+				"__line__ %d, pin require error\n", __LINE__);
+			return -EINVAL;
+		}
+		ret = of_property_read_u32(node,
+					   "piris-backlash",
+					   &motor->piris->backlash);
+		if (ret != 0) {
+			motor->piris->backlash = 0;
+			dev_err(&motor->spi->dev,
+				"failed get motor backlash,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "piris-start-up-speed",
+					   &motor->piris->start_up_speed);
+		if (ret != 0) {
+			motor->piris->start_up_speed = START_UP_HZ_DEF;
+			dev_err(&motor->spi->dev,
+				"failed get motor start up speed,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "piris-step-max",
+					   &motor->piris->step_max);
+		if (ret != 0) {
+			motor->piris->step_max = PIRIS_MAX_STEP_DEF;
+			dev_err(&motor->spi->dev,
+				"failed get piris pos_max,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "piris-ppw",
+					   &motor->piris->run_data.ppw);
+		if (ret != 0 || (motor->piris->run_data.ppw > 0xff)) {
+			motor->piris->run_data.ppw = PPW_DEF;
+			dev_err(&motor->spi->dev,
+				"failed get piris ppw,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "piris-ppw-stop",
+					   &motor->piris->run_data.ppw_stop);
+		if (ret != 0 || (motor->piris->run_data.ppw_stop > 0xff)) {
+			motor->piris->run_data.ppw_stop = PPW_STOP;
+			dev_err(&motor->spi->dev,
+				"failed get piris ppw_stop,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "piris-phmode",
+					   &motor->piris->run_data.phmode);
+		if (ret != 0 || (motor->piris->run_data.phmode > 0x3f)) {
+			motor->piris->run_data.phmode = PHMODE_DEF;
+			dev_err(&motor->spi->dev,
+				"failed get piris phmode,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "piris-micro",
+					   &motor->piris->run_data.micro);
+		if (ret != 0) {
+			motor->piris->run_data.micro = MICRO_DEF;
+			dev_err(&motor->spi->dev,
+				"failed get piris micro,use dafult value\n");
+		}
+		/* get piris pi gpio */
+		motor->piris->pic_gpio = devm_gpiod_get(&motor->spi->dev,
+							"piris_pic", GPIOD_IN);
+		if (IS_ERR(motor->piris->pic_gpio))
+			dev_err(&motor->spi->dev, "Failed to get piris-pi-c-gpios\n");
+		motor->piris->pia_gpio = devm_gpiod_get(&motor->spi->dev,
+							"piris_pia", GPIOD_OUT_LOW);
+		if (IS_ERR(motor->piris->pia_gpio))
+			dev_err(&motor->spi->dev, "Failed to get piris-pi-a-gpios\n");
+		motor->piris->pie_gpio = devm_gpiod_get(&motor->spi->dev,
+							"piris_pie", GPIOD_OUT_LOW);
+		if (IS_ERR(motor->piris->pie_gpio))
+			dev_err(&motor->spi->dev, "Failed to get piris-pi-e-gpios\n");
+		motor->piris->is_half_step_mode =
+			device_property_read_bool(&motor->spi->dev, "piris-1-2phase-excitation");
+		motor->piris->is_dir_opp =
+			device_property_read_bool(&motor->spi->dev, "piris-dir-opposite");
+		ret = of_property_read_s32(node,
+					   "piris-min-pos",
+					   &motor->piris->min_pos);
+		if (ret != 0) {
+			motor->piris->min_pos = 0;
+			dev_err(&motor->spi->dev,
+				"failed get piris min pos,use dafult value\n");
+		}
+		ret = of_property_read_s32(node,
+					   "piris-max-pos",
+					   &motor->piris->max_pos);
+		if (ret != 0) {
+			motor->piris->max_pos = motor->piris->step_max;
+			dev_err(&motor->spi->dev,
+				"failed get piris max_pos pos,use dafult value\n");
+		}
+		if (step_motor_cnt == 1)
+			motor->dev0 = motor->piris;
+		else if (step_motor_cnt == 2)
+			motor->dev1 = motor->piris;
+		ret = of_property_read_u32(node,
+					   "piris-reback-distance",
+					   &motor->piris->reback);
+		if (ret != 0) {
+			dev_err(&motor->spi->dev,
+				"failed get piris reback distance, return\n");
+			return -EINVAL;
+		}
+	}
+
+	if (motor->is_use_focus) {
+		step_motor_cnt++;
+		motor->focus = devm_kzalloc(&motor->spi->dev, sizeof(*motor->focus), GFP_KERNEL);
+		if (!motor->focus) {
+			dev_err(&motor->spi->dev,
+				"__line__ %d, devm_kzalloc return fail!\n", __LINE__);
+			return -ENOMEM;
+		}
+		ret = of_property_read_string(node, "focus-used-pin",
+					       &str);
+		if (ret != 0) {
+			dev_err(&motor->spi->dev,
+				"get focus-used-pin fail, please check it!\n");
+			return -EINVAL;
+		}
+		if (strcmp(str, "ab") == 0) {
+			motor->focus->reg_op = &motor->motor_op[0];
+			if (motor->focus->reg_op->is_used) {
+				dev_err(&motor->spi->dev,
+					"__line__ %d, pin already been used\n", __LINE__);
+				return -EINVAL;
+			}
+			motor->focus->reg_op->is_used = true;
+		} else if (strcmp(str, "cd") == 0) {
+			motor->focus->reg_op = &motor->motor_op[1];
+			if (motor->focus->reg_op->is_used) {
+				dev_err(&motor->spi->dev,
+					"__line__ %d, pin already been used\n", __LINE__);
+				return -EINVAL;
+			}
+			motor->focus->reg_op->is_used = true;
+		} else {
+			dev_err(&motor->spi->dev,
+				"__line__ %d, pin require error\n", __LINE__);
+			return -EINVAL;
+		}
+		ret = of_property_read_u32(node,
+					   "focus-backlash",
+					   &motor->focus->backlash);
+		if (ret != 0) {
+			motor->focus->backlash = 0;
+			dev_err(&motor->spi->dev,
+				"failed get motor backlash,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "focus-start-up-speed",
+					   &motor->focus->start_up_speed);
+		if (ret != 0) {
+			motor->focus->start_up_speed = START_UP_HZ_DEF;
+			dev_err(&motor->spi->dev,
+				"failed get motor start up speed,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "focus-step-max",
+					   &motor->focus->step_max);
+		if (ret != 0) {
+			motor->focus->step_max = FOCUS_MAX_STEP_DEF;
+			dev_err(&motor->spi->dev,
+				"failed get focus_pos_max,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "focus-ppw",
+					   &motor->focus->run_data.ppw);
+		if (ret != 0 || (motor->focus->run_data.ppw > 0xff)) {
+			motor->focus->run_data.ppw = PPW_DEF;
+			dev_err(&motor->spi->dev,
+				"failed get focus ppw,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "focus-ppw-stop",
+					   &motor->focus->run_data.ppw_stop);
+		if (ret != 0 || (motor->focus->run_data.ppw_stop > 0xff)) {
+			motor->focus->run_data.ppw_stop = PPW_STOP;
+			dev_err(&motor->spi->dev,
+				"failed get focus ppw_stop,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "focus-phmode",
+					   &motor->focus->run_data.phmode);
+		if (ret != 0 || (motor->focus->run_data.phmode > 0x3f)) {
+			motor->focus->run_data.phmode = PHMODE_DEF;
+			dev_err(&motor->spi->dev,
+				"failed get focus phmode,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "focus-micro",
+					   &motor->focus->run_data.micro);
+		if (ret != 0) {
+			motor->focus->run_data.micro = MICRO_DEF;
+			dev_err(&motor->spi->dev,
+				"failed get focus micro,use dafult value\n");
+		}
+		if (step_motor_cnt == 1)
+			motor->dev0 = motor->focus;
+		else if (step_motor_cnt == 2)
+			motor->dev1 = motor->focus;
+		/* get focus pi gpio */
+		motor->focus->pic_gpio = devm_gpiod_get(&motor->spi->dev,
+							"focus_pic", GPIOD_IN);
+		if (IS_ERR(motor->focus->pic_gpio))
+			dev_err(&motor->spi->dev, "Failed to get focus-pi-c-gpios\n");
+		motor->focus->pia_gpio = devm_gpiod_get(&motor->spi->dev,
+							"focus_pia", GPIOD_OUT_LOW);
+		if (IS_ERR(motor->focus->pia_gpio))
+			dev_err(&motor->spi->dev, "Failed to get focus-pi-a-gpios\n");
+		motor->focus->pie_gpio = devm_gpiod_get(&motor->spi->dev,
+							"focus_pie", GPIOD_OUT_LOW);
+		if (IS_ERR(motor->focus->pie_gpio))
+			dev_err(&motor->spi->dev, "Failed to get focus-pi-e-gpios\n");
+		ret = of_property_read_u32(node,
+					   "focus-reback-distance",
+					   &motor->focus->reback);
+		if (ret != 0) {
+			dev_err(&motor->spi->dev,
+				"failed get focus reback distance, return\n");
+			return -EINVAL;
+		}
+		motor->focus->is_half_step_mode =
+			device_property_read_bool(&motor->spi->dev, "focus-1-2phase-excitation");
+		motor->focus->is_dir_opp =
+			device_property_read_bool(&motor->spi->dev, "focus-dir-opposite");
+		ret = of_property_read_s32(node,
+					   "focus-min-pos",
+					   &motor->focus->min_pos);
+		if (ret != 0) {
+			motor->focus->min_pos = 0;
+			dev_err(&motor->spi->dev,
+				"failed get focus min pos,use dafult value\n");
+		}
+		ret = of_property_read_s32(node,
+					   "focus-max-pos",
+					   &motor->focus->max_pos);
+		if (ret != 0) {
+			motor->focus->max_pos = motor->focus->step_max;
+			dev_err(&motor->spi->dev,
+				"failed get focus max_pos pos,use dafult value\n");
+		}
+	}
+
+	if (motor->is_use_zoom) {
+		if (step_motor_cnt >= 2) {
+			dev_err(&motor->spi->dev,
+				"The driver support step-motor max num is 2\n");
+			return -EINVAL;
+		}
+		step_motor_cnt++;
+		motor->zoom = devm_kzalloc(&motor->spi->dev, sizeof(*motor->zoom), GFP_KERNEL);
+		if (!motor->zoom) {
+			dev_err(&motor->spi->dev,
+				"__line__ %d, devm_kzalloc return fail!\n", __LINE__);
+			return -ENOMEM;
+		}
+		ret = of_property_read_string(node, "zoom-used-pin",
+					       &str);
+		if (ret != 0) {
+			dev_err(&motor->spi->dev,
+				"get zoom-used-pin fail, please check it!\n");
+			return -EINVAL;
+		}
+		if (strcmp(str, "ab") == 0) {
+			motor->zoom->reg_op = &motor->motor_op[0];
+			if (motor->zoom->reg_op->is_used) {
+				dev_err(&motor->spi->dev,
+					"__line__ %d, pin already been used\n", __LINE__);
+				return -EINVAL;
+			}
+			motor->zoom->reg_op->is_used = true;
+		} else if (strcmp(str, "cd") == 0) {
+			motor->zoom->reg_op = &motor->motor_op[1];
+			if (motor->zoom->reg_op->is_used) {
+				dev_err(&motor->spi->dev,
+					"__line__ %d, pin already been used\n", __LINE__);
+				return -EINVAL;
+			}
+			motor->zoom->reg_op->is_used = true;
+		} else {
+			dev_err(&motor->spi->dev,
+				"__line__ %d, pin require error\n", __LINE__);
+			return -EINVAL;
+		}
+		ret = of_property_read_u32(node,
+					   "zoom-backlash",
+					   &motor->zoom->backlash);
+		if (ret != 0) {
+			motor->zoom->backlash = 0;
+			dev_err(&motor->spi->dev,
+				"failed get motor backlash,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "zoom-step-max",
+					   &motor->zoom->step_max);
+		if (ret != 0) {
+			motor->zoom->step_max = ZOOM_MAX_STEP_DEF;
+			dev_err(&motor->spi->dev,
+				"failed get iris zoom_pos_max,use dafult value\n");
+		}
+
+		ret = of_property_read_u32(node,
+					   "zoom-start-up-speed",
+					   &motor->zoom->start_up_speed);
+		if (ret != 0) {
+			motor->zoom->start_up_speed = START_UP_HZ_DEF;
+			dev_err(&motor->spi->dev,
+				"failed get motor start up speed,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "zoom-ppw",
+					   &motor->zoom->run_data.ppw);
+		if (ret != 0 || (motor->zoom->run_data.ppw > 0xff)) {
+			motor->zoom->run_data.ppw = PPW_DEF;
+			dev_err(&motor->spi->dev,
+				"failed get zoom ppw,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "zoom-ppw-stop",
+					   &motor->zoom->run_data.ppw_stop);
+		if (ret != 0 || (motor->zoom->run_data.ppw_stop > 0xff)) {
+			motor->zoom->run_data.ppw_stop = PPW_STOP;
+			dev_err(&motor->spi->dev,
+				"failed get zoom ppw_stop,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "zoom-phmode",
+					   &motor->zoom->run_data.phmode);
+		if (ret != 0 || (motor->zoom->run_data.phmode > 0x3ff)) {
+			motor->zoom->run_data.phmode = PHMODE_DEF;
+			dev_err(&motor->spi->dev,
+				"failed get zoom phmode,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "zoom-micro",
+					   &motor->zoom->run_data.micro);
+		if (ret != 0) {
+			motor->zoom->run_data.micro = MICRO_DEF;
+			dev_err(&motor->spi->dev,
+				"failed get zoom micro,use dafult value\n");
+		}
+		motor->zoom->pic_gpio = devm_gpiod_get(&motor->spi->dev,
+						       "zoom_pic", GPIOD_IN);
+		if (IS_ERR(motor->zoom->pic_gpio))
+			dev_err(&motor->spi->dev, "Failed to get zoom-pi-c-gpios\n");
+		motor->zoom->is_half_step_mode =
+			device_property_read_bool(&motor->spi->dev, "zoom-1-2phase-excitation");
+		motor->zoom->is_dir_opp =
+			device_property_read_bool(&motor->spi->dev, "zoom-dir-opposite");
+		if (step_motor_cnt == 1)
+			motor->dev0 = motor->zoom;
+		else if (step_motor_cnt == 2)
+			motor->dev1 = motor->zoom;
+		ret = of_property_read_s32(node,
+					   "zoom-min-pos",
+					   &motor->zoom->min_pos);
+		if (ret != 0) {
+			motor->zoom->min_pos = 0;
+			dev_err(&motor->spi->dev,
+				"failed get zoom min pos,use dafult value\n");
+		}
+		ret = of_property_read_s32(node,
+					   "zoom-max-pos",
+					   &motor->zoom->max_pos);
+		if (ret != 0) {
+			motor->zoom->max_pos = motor->zoom->step_max;
+			dev_err(&motor->spi->dev,
+				"failed get zoom max_pos pos,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "zoom-reback-distance",
+					   &motor->zoom->reback);
+		if (ret != 0) {
+			dev_err(&motor->spi->dev,
+				"failed get zoom reback distance, return\n");
+			return -EINVAL;
+		}
+	}
+
+	if (motor->is_use_zoom1) {
+		if (step_motor_cnt >= 2) {
+			dev_err(&motor->spi->dev,
+				"The driver support step-motor max num is 2\n");
+			return -EINVAL;
+		}
+		step_motor_cnt++;
+		motor->zoom1 = devm_kzalloc(&motor->spi->dev, sizeof(*motor->zoom1), GFP_KERNEL);
+		if (!motor->zoom1) {
+			dev_err(&motor->spi->dev,
+				"__line__ %d, devm_kzalloc return fail!\n", __LINE__);
+			return -ENOMEM;
+		}
+		ret = of_property_read_string(node, "zoom1-used-pin",
+					       &str);
+		if (ret != 0) {
+			dev_err(&motor->spi->dev,
+				"get zoom1-used-pin fail, please check it!\n");
+			return -EINVAL;
+		}
+		if (strcmp(str, "ab") == 0) {
+			motor->zoom1->reg_op = &motor->motor_op[0];
+			if (motor->zoom1->reg_op->is_used) {
+				dev_err(&motor->spi->dev,
+					"__line__ %d, pin already been used\n", __LINE__);
+				return -EINVAL;
+			}
+			motor->zoom1->reg_op->is_used = true;
+		} else if (strcmp(str, "cd") == 0) {
+			motor->zoom1->reg_op = &motor->motor_op[1];
+			if (motor->zoom1->reg_op->is_used) {
+				dev_err(&motor->spi->dev,
+					"__line__ %d, pin already been used\n", __LINE__);
+				return -EINVAL;
+			}
+			motor->zoom1->reg_op->is_used = true;
+		} else {
+			dev_err(&motor->spi->dev,
+				"__line__ %d, pin require error\n", __LINE__);
+			return -EINVAL;
+		}
+		ret = of_property_read_u32(node,
+					   "zoom1-backlash",
+					   &motor->zoom1->backlash);
+		if (ret != 0) {
+			motor->zoom1->backlash = 0;
+			dev_err(&motor->spi->dev,
+				"failed get motor backlash,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "zoom1-step-max",
+					   &motor->zoom1->step_max);
+		if (ret != 0) {
+			motor->zoom1->step_max = ZOOM_MAX_STEP_DEF;
+			dev_err(&motor->spi->dev,
+				"failed get zoom_pos_max,use dafult value\n");
+		}
+
+		ret = of_property_read_u32(node,
+					   "zoom1-start-up-speed",
+					   &motor->zoom1->start_up_speed);
+		if (ret != 0) {
+			motor->zoom1->start_up_speed = START_UP_HZ_DEF;
+			dev_err(&motor->spi->dev,
+				"failed get motor start up speed,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "zoom1-ppw",
+					   &motor->zoom1->run_data.ppw);
+		if (ret != 0 || (motor->zoom1->run_data.ppw > 0xff)) {
+			motor->zoom1->run_data.ppw = PPW_DEF;
+			dev_err(&motor->spi->dev,
+				"failed get zoom1 ppw,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "zoom1-ppw-stop",
+					   &motor->zoom1->run_data.ppw_stop);
+		if (ret != 0 || (motor->zoom1->run_data.ppw_stop > 0xff)) {
+			motor->zoom1->run_data.ppw_stop = PPW_STOP;
+			dev_err(&motor->spi->dev,
+				"failed get zoom1 ppw_stop,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "zoom1-phmode",
+					   &motor->zoom1->run_data.phmode);
+		if (ret != 0 || (motor->zoom1->run_data.phmode > 0x3f)) {
+			motor->zoom1->run_data.phmode = PHMODE_DEF;
+			dev_err(&motor->spi->dev,
+				"failed get zoom1 phmode,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "zoom1-micro",
+					   &motor->zoom1->run_data.micro);
+		if (ret != 0) {
+			motor->zoom1->run_data.micro = MICRO_DEF;
+			dev_err(&motor->spi->dev,
+				"failed get zoom1 micro,use dafult value\n");
+		}
+		/* get zoom1 pi gpio */
+		motor->zoom1->pic_gpio = devm_gpiod_get(&motor->spi->dev,
+							"zoom1_pic", GPIOD_IN);
+		if (IS_ERR(motor->zoom1->pic_gpio))
+			dev_err(&motor->spi->dev, "Failed to get zoom1-pi-c-gpios\n");
+		motor->zoom1->pia_gpio = devm_gpiod_get(&motor->spi->dev,
+							"zoom1_pia", GPIOD_OUT_LOW);
+		if (IS_ERR(motor->zoom1->pia_gpio))
+			dev_err(&motor->spi->dev, "Failed to get zoom1-pi-a-gpios\n");
+		motor->zoom1->pie_gpio = devm_gpiod_get(&motor->spi->dev,
+							"zoom1_pie", GPIOD_OUT_LOW);
+		if (IS_ERR(motor->zoom1->pie_gpio))
+			dev_err(&motor->spi->dev, "Failed to get zoom1-pi-e-gpios\n");
+		motor->zoom1->is_half_step_mode =
+			device_property_read_bool(&motor->spi->dev, "zoom1-1-2phase-excitation");
+		motor->zoom1->is_dir_opp =
+			device_property_read_bool(&motor->spi->dev, "zoom1-dir-opposite");
+		if (step_motor_cnt == 1)
+			motor->dev0 = motor->zoom1;
+		else if (step_motor_cnt == 2)
+			motor->dev1 = motor->zoom1;
+		ret = of_property_read_s32(node,
+					   "zoom1-min-pos",
+					   &motor->zoom1->min_pos);
+		if (ret != 0) {
+			motor->zoom1->min_pos = 0;
+			dev_err(&motor->spi->dev,
+				"failed get zoom1 min pos,use dafult value\n");
+		}
+		ret = of_property_read_s32(node,
+					   "zoom1-max-pos",
+					   &motor->zoom1->max_pos);
+		if (ret != 0) {
+			motor->zoom1->max_pos = motor->zoom1->step_max;
+			dev_err(&motor->spi->dev,
+				"failed get zoom1 max_pos pos,use dafult value\n");
+		}
+		ret = of_property_read_u32(node,
+					   "zoom1-reback-distance",
+					   &motor->zoom1->reback);
+		if (ret != 0) {
+			dev_err(&motor->spi->dev,
+				"failed get zoom1 reback distance, return\n");
+			return -EINVAL;
+		}
+	}
+
+	ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
+				   &motor->module_index);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
+				       &motor->module_facing);
+	if (ret) {
+		dev_err(&motor->spi->dev,
+			"could not get module information!\n");
+		return -EINVAL;
+	}
+	return 0;
+}
+
+static void motor_config_dev_next_status(struct motor_dev *motor, struct ext_dev *dev)
+{
+	u16 ppw = 0;
+	u16 psum = 0;
+	u16 micro = 0;
+	struct spi_device *spi = motor->spi;
+#ifdef DEBUG
+	u16 intct = 0;
+	int i = 0;
+	u16 val = 0;
+
+	if (dev->move_status != MOTOR_STATUS_STOPPED) {
+		dev_dbg(&spi->dev,
+			"__line__ %d dev type %d, cur_count %d !\n", __LINE__,
+			dev->type,
+			dev->run_data.cur_count);
+		dev_dbg(&spi->dev,
+			"__line__ %d, motor reg table: 0x%02x 0x%02x 0x%02x!\n", __LINE__,
+			dev->reg_op->reg.ppw,
+			dev->reg_op->reg.psum,
+			dev->reg_op->reg.intct);
+		for (i = 0; i < 11; i++) {
+			spi_read_reg(spi, 0x20 + i, &val);
+			dev_dbg(&spi->dev,
+				"========reg,val= 0x%02x, 0x%04x========\n",
+				0x20 + i,
+				val);
+		}
+	}
+#endif
+
+#ifdef DEBUG
+	spi_read_reg(spi, dev->reg_op->reg.ppw, &ppw);
+	spi_read_reg(spi, dev->reg_op->reg.psum, &psum);
+	spi_read_reg(spi, dev->reg_op->reg.intct, &intct);
+	dev_info(&spi->dev,
+		 "__line__ %d dev type %d, cur_count %d , status %d! ppw 0x%x, psum 0x%x intct 0x%x\n", __LINE__,
+		 dev->type,
+		 dev->run_data.cur_count,
+		 dev->move_status, ppw, psum, intct);
+#endif
+	if (dev->run_data.cur_count != 0) {
+		if (dev->run_data.cur_count == dev->run_data.count &&
+		    dev->is_need_update_tim) {
+			dev->mv_tim.vcm_start_t = ns_to_timeval(ktime_get_ns());
+			dev->is_need_update_tim = false;
+		}
+		dev->run_data.cur_count--;
+		ppw = (dev->run_data.ppw << 8) | dev->run_data.ppw;
+		switch (dev->run_data.micro) {
+		case 64:
+			micro = 0x03;
+			break;
+		case 128:
+			micro = 0x02;
+			break;
+		case 256:
+			micro = 0x00;
+			break;
+		default:
+			micro = 0x00;
+			break;
+		};
+		switch (dev->run_data.cur_count) {
+		case 0:
+			psum = ((dev->move_status - 1) << 8) |
+			       (micro << 12) |
+			       (1 << 10);
+			ppw = (dev->run_data.ppw_stop << 8) | dev->run_data.ppw_stop;
+			break;
+		case 1:
+			psum = ((dev->move_status - 1) << 8) |
+			       (1 << 10) |
+			       (micro << 12) |
+			       (dev->run_data.psum_last);
+			break;
+		default:
+			psum = ((dev->move_status - 1) << 8) |
+			       (1 << 10) |
+			       (micro << 12) |
+			       (dev->run_data.psum);
+			break;
+		};
+		spi_write_reg(motor->spi, 0x20, 0x1a01);
+		spi_write_reg(spi, dev->reg_op->reg.ppw, ppw);
+		spi_write_reg(spi, dev->reg_op->reg.psum, psum);
+		spi_write_reg(spi, dev->reg_op->reg.intct,
+			      dev->run_data.intct);
+		dev->reg_op->tmp_psum = psum;
+	} else if (dev->move_status != MOTOR_STATUS_STOPPED) {
+		dev->mv_tim.vcm_end_t = ns_to_timeval(ktime_get_ns());
+		dev->is_mv_tim_update = true;
+		dev->move_status = MOTOR_STATUS_STOPPED;
+		dev->reg_op->tmp_psum = 0;
+		complete(&dev->complete);
+		complete(&dev->complete_out);
+		dev->is_running = false;
+	}
+}
+
+static void motor_op_work(struct work_struct *work)
+{
+	struct motor_work_s *wk =
+		container_of(work, struct motor_work_s, work);
+	struct motor_dev *motor = wk->dev;
+	static struct timeval tv_last = {0};
+	struct timeval tv = {0};
+	u64 time_dist = 0;
+
+	do_gettimeofday(&tv);
+	time_dist = tv.tv_sec * 1000000 + tv.tv_usec - (tv_last.tv_sec * 1000000 + tv_last.tv_usec);
+	tv_last = tv;
+	if (time_dist < motor->vd_fz_period_us && motor->is_timer_restart)
+		dev_info(&motor->spi->dev,
+			 "Timer error, Current interrupt interval %llu\n", time_dist);
+	mutex_lock(&motor->mutex);
+	gpiod_set_value(motor->vd_fz_gpio, 1);
+	usleep_range(30, 60);
+	gpiod_set_value(motor->vd_fz_gpio, 0);
+	if (motor->dev0 && motor->dev0->run_data.cur_count == 0 &&
+	   motor->dev0->is_need_reback) {
+		if (motor->dev0->cur_back_delay < motor->dev0->max_back_delay) {
+			motor->dev0->cur_back_delay++;
+			motor->dev0->run_data.cur_count = 1;
+		} else {
+			motor->dev0->run_data = motor->dev0->reback_data;
+			motor->dev0->is_need_reback = false;
+			motor->dev0->move_status = motor->dev0->reback_status;
+			motor->dev0->last_dir = motor->dev1->reback_status;
+			motor->dev0->cur_back_delay = 0;
+		}
+	}
+	if (motor->dev1 && motor->dev1->run_data.cur_count == 0 &&
+	   motor->dev1->is_need_reback) {
+		if (motor->dev1->cur_back_delay < motor->dev1->max_back_delay) {
+			motor->dev1->cur_back_delay++;
+			motor->dev1->run_data.cur_count = 1;
+		} else {
+			motor->dev1->run_data = motor->dev1->reback_data;
+			motor->dev1->is_need_reback = false;
+			motor->dev1->move_status = motor->dev1->reback_status;
+			motor->dev1->last_dir = motor->dev1->reback_status;
+			motor->dev1->cur_back_delay = 0;
+		}
+	}
+	if ((motor->dev0 && motor->dev0->run_data.cur_count > 0) ||
+	   (motor->dev1 && motor->dev1->run_data.cur_count > 0)) {
+		motor->is_timer_restart = true;
+		hrtimer_start(&motor->timer,
+			      motor->vd_fz_period_us * 1000,
+			      HRTIMER_MODE_REL);
+	} else {
+		motor->is_timer_restart = false;
+	}
+	usleep_range(660, 700);//delay more than DT1
+
+	if (motor->dev0 && motor->dev0->move_status != MOTOR_STATUS_STOPPED)
+		motor_config_dev_next_status(motor, motor->dev0);
+	if (motor->dev1 && motor->dev1->move_status != MOTOR_STATUS_STOPPED)
+		motor_config_dev_next_status(motor, motor->dev1);
+	mutex_unlock(&motor->mutex);
+	motor->is_should_wait = false;
+}
+
+static enum hrtimer_restart motor_timer_func(struct hrtimer *timer)
+{
+	struct motor_dev *motor = container_of(timer, struct motor_dev, timer);
+
+	motor->is_should_wait = true;
+	schedule_work_on(smp_processor_id(), &motor->wk->work);
+	return HRTIMER_NORESTART;
+}
+
+static int motor_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct motor_dev *motor = container_of(ctrl->handler,
+					     struct motor_dev, ctrl_handler);
+
+	switch (ctrl->id) {
+	case V4L2_CID_IRIS_ABSOLUTE:
+		if (motor->is_use_dc_iris)
+			ctrl->val = motor->dciris->last_log;
+		else if (motor->is_use_p_iris)
+			ctrl->val = motor->piris->last_pos;
+		return 0;
+	case V4L2_CID_FOCUS_ABSOLUTE:
+		ctrl->val = motor->focus->last_pos;
+		return 0;
+	case V4L2_CID_ZOOM_ABSOLUTE:
+		ctrl->val = motor->zoom->last_pos;
+		return 0;
+	case V4L2_CID_ZOOM_CONTINUOUS:
+		ctrl->val = motor->zoom1->last_pos;
+		return 0;
+	}
+	return 0;
+}
+
+static void wait_for_motor_stop(struct ext_dev *dev)
+{
+	if (dev->is_running) {
+		reinit_completion(&dev->complete_out);
+		wait_for_completion(&dev->complete_out);
+	}
+}
+
+static int motor_s_ctrl(struct v4l2_ctrl *ctrl)
+{
+#ifdef DEBUG
+	int i = 0;
+	u16 val = 0;
+#endif
+	int ret = 0;
+	struct motor_dev *motor = container_of(ctrl->handler,
+					     struct motor_dev, ctrl_handler);
+
+	switch (ctrl->id) {
+	case V4L2_CID_IRIS_ABSOLUTE:
+		if (motor->is_use_dc_iris) {
+			if (motor->dciris->is_reversed_polarity)
+				spi_write_reg(motor->spi, 0x00,
+					      motor->dciris->max_log - ctrl->val);
+			else
+				spi_write_reg(motor->spi, 0x00, ctrl->val);
+			gpiod_set_value(motor->dciris->vd_iris_gpio, 1);
+			usleep_range(200, 400);
+			gpiod_set_value(motor->dciris->vd_iris_gpio, 0);
+			motor->dciris->last_log = ctrl->val;
+			dev_dbg(&motor->spi->dev, "set iris pos %d\n", ctrl->val);
+#ifdef DEBUG
+			for (i = 0; i < 16; i++) {
+				spi_read_reg(motor->spi, i, &val);
+				dev_dbg(&motor->spi->dev, "reg,val=0x%02x,0x%04x\n", i, val);
+			}
+#endif
+		} else if (motor->is_use_p_iris) {
+			ret = set_motor_running_status(motor,
+						       motor->piris,
+						       ctrl->val,
+						       true,
+						       false,
+						       false);
+			wait_for_motor_stop(motor->piris);
+			dev_dbg(&motor->spi->dev, "set piris pos %d\n", ctrl->val);
+		}
+		break;
+	case V4L2_CID_FOCUS_ABSOLUTE:
+		ret = set_motor_running_status(motor,
+					       motor->focus,
+					       ctrl->val,
+					       true,
+					       false,
+					       false);
+		wait_for_motor_stop(motor->focus);
+		dev_dbg(&motor->spi->dev, "set focus pos %d\n", ctrl->val);
+		break;
+	case V4L2_CID_ZOOM_ABSOLUTE:
+		ret = set_motor_running_status(motor,
+					       motor->zoom,
+					       ctrl->val,
+					       true,
+					       false,
+					       false);
+		wait_for_motor_stop(motor->zoom);
+		dev_dbg(&motor->spi->dev, "set zoom pos %d\n", ctrl->val);
+		break;
+	case V4L2_CID_ZOOM_CONTINUOUS:
+		ret = set_motor_running_status(motor,
+					       motor->zoom1,
+					       ctrl->val,
+					       true,
+					       false,
+					       false);
+		wait_for_motor_stop(motor->zoom1);
+		dev_dbg(&motor->spi->dev, "set zoom1 pos %d\n", ctrl->val);
+		break;
+	default:
+		dev_err(&motor->spi->dev, "not support cmd %d\n", ctrl->id);
+		break;
+	}
+	return ret;
+}
+
+static int motor_set_zoom_follow(struct motor_dev *motor, struct rk_cam_set_zoom *mv_param)
+{
+	int i = 0;
+	int ret = 0;
+	bool is_need_reback = mv_param->is_need_reback;
+
+	for (i = 0; i < mv_param->setzoom_cnt; i++) {
+		if (i == (mv_param->setzoom_cnt - 1)) {
+			ret = set_motor_running_status(motor,
+						       motor->focus,
+						       mv_param->zoom_pos[i].focus_pos,
+						       true,
+						       true,
+						       is_need_reback);
+			ret = set_motor_running_status(motor,
+						       motor->zoom,
+						       mv_param->zoom_pos[i].zoom_pos,
+						       true,
+						       false,
+						       is_need_reback);
+		} else {
+			set_motor_running_status(motor,
+						 motor->focus,
+						 mv_param->zoom_pos[i].focus_pos,
+						 false,
+						 true,
+						 false);
+			set_motor_running_status(motor,
+						 motor->zoom,
+						 mv_param->zoom_pos[i].zoom_pos,
+						 false,
+						 false,
+						 false);
+		}
+		wait_for_motor_stop(motor->focus);
+		wait_for_motor_stop(motor->zoom);
+		dev_dbg(&motor->spi->dev,
+			"%s zoom %d, focus %d, i %d\n",
+			__func__,
+			mv_param->zoom_pos[i].zoom_pos,
+			mv_param->zoom_pos[i].focus_pos,
+			i);
+	}
+	return ret;
+}
+
+static int motor_find_pi_binarysearch(struct motor_dev *motor,
+			 struct ext_dev *ext_dev,
+			 int min, int max)
+{
+	int gpio_val = 0;
+	int tmp_val = 0;
+	int mid = 0;
+	int last_pos = 0;
+	int new_min = 0;
+	int new_max = 0;
+
+	if (min > max)
+		return -EINVAL;
+	tmp_val = gpiod_get_value(ext_dev->pic_gpio);
+	mid = (min + max) / 2;
+	if (mid == min) {
+		dev_dbg(&motor->spi->dev,
+			"ext dev %d find pi %d\n", ext_dev->type, mid);
+		if (ext_dev->last_pos < mid)
+			set_motor_running_status(motor,
+						 ext_dev,
+						 mid,
+						 false,
+						 false,
+						 false);
+		else
+			set_motor_running_status(motor,
+						 ext_dev,
+						 mid,
+						 false,
+						 false,
+						 true);
+		wait_for_motor_stop(ext_dev);
+		return mid;
+	}
+	last_pos = ext_dev->last_pos;
+	if (last_pos < mid)
+		set_motor_running_status(motor,
+					 ext_dev,
+					 mid,
+					 false,
+					 false,
+					 false);
+	else
+		set_motor_running_status(motor,
+				       ext_dev,
+				       mid,
+				       false,
+				       false,
+				       true);
+	wait_for_motor_stop(ext_dev);
+	gpio_val = gpiod_get_value(ext_dev->pic_gpio);
+	if (tmp_val != gpio_val) {
+		usleep_range(10, 20);
+		gpio_val = gpiod_get_value(ext_dev->pic_gpio);
+	}
+
+	dev_dbg(&motor->spi->dev,
+		"__line__ %d ext_dev type %d, get pi value %d, tmp_val %d, min %d, max %d\n",
+		__LINE__, ext_dev->type, gpio_val, tmp_val, min, max);
+	if (tmp_val != gpio_val) {
+		if (last_pos == min) {
+			new_min = min;
+			new_max = mid;
+		} else {
+			new_min = mid;
+			new_max = max;
+		}
+	} else {
+		if (last_pos == min) {
+			new_min = mid;
+			new_max = max;
+		} else {
+			new_min = min;
+			new_max = mid;
+		}
+	}
+	return motor_find_pi_binarysearch(motor, ext_dev, new_min, new_max);
+}
+
+static int motor_find_pi(struct motor_dev *motor,
+		     struct ext_dev *ext_dev, int step)
+{
+	int i = 0;
+	int idx_max = ext_dev->step_max + step - 1;
+	int tmp_val = 0;
+	int gpio_val = 0;
+	int min = 0;
+	int max = 0;
+	bool is_find_pi = false;
+
+	tmp_val = gpiod_get_value(ext_dev->pic_gpio);
+	for (i = ext_dev->last_pos + step; i < idx_max; i += step) {
+		set_motor_running_status(motor,
+					 ext_dev,
+					 i,
+					 false,
+					 false,
+					 false);
+		wait_for_motor_stop(ext_dev);
+		gpio_val = gpiod_get_value(ext_dev->pic_gpio);
+		if (tmp_val != gpio_val) {
+			usleep_range(10, 20);
+			gpio_val = gpiod_get_value(ext_dev->pic_gpio);
+		}
+		dev_dbg(&motor->spi->dev,
+			"__line__ %d ext_dev type %d, get pi value %d, i %d, tmp_val %d\n",
+			__LINE__, ext_dev->type, gpio_val, i, tmp_val);
+		if (tmp_val != gpio_val) {
+			min = i - step;
+			max = i;
+			is_find_pi = true;
+			break;
+		}
+	}
+	if (i > idx_max) {
+		for (i = ext_dev->last_pos - step; i > 0; i -= step) {
+			set_motor_running_status(motor,
+					       ext_dev,
+					       i,
+					       false,
+					       false,
+					       true);
+			wait_for_motor_stop(ext_dev);
+			gpio_val = gpiod_get_value(ext_dev->pic_gpio);
+			if (tmp_val != gpio_val) {
+				usleep_range(10, 20);
+				gpio_val = gpiod_get_value(ext_dev->pic_gpio);
+			}
+			dev_dbg(&motor->spi->dev,
+				"__line__ %d ext_dev type %d, get pi value %d, i %d, tmp_val %d\n",
+				__LINE__, ext_dev->type, gpio_val, i, tmp_val);
+			if (tmp_val != gpio_val) {
+				min = i;
+				max = i + step;
+				is_find_pi = true;
+				break;
+			}
+		}
+	}
+	if (is_find_pi) {
+		if (abs(step) == 1)
+			return ext_dev->last_pos;
+		else
+			return motor_find_pi_binarysearch(motor, ext_dev,
+							  min,
+							  max);
+	} else {
+		return -EINVAL;
+	}
+}
+
+static int motor_reinit_piris(struct motor_dev *motor)
+{
+	int ret = 0;
+
+	if (!IS_ERR(motor->piris->pic_gpio)) {
+		if (!IS_ERR(motor->piris->pia_gpio))
+			gpiod_set_value(motor->piris->pia_gpio, 1);
+		if (!IS_ERR(motor->piris->pie_gpio))
+			gpiod_set_value(motor->piris->pie_gpio, 0);
+		msleep(250);
+		#ifdef PI_TEST
+		motor->piris->last_pos = motor->piris->step_max;
+		ret = set_motor_running_status(motor,
+					       motor->piris,
+					       0,
+					       false,
+					       false,
+					       false);
+		wait_for_motor_stop(motor->piris);
+		#else
+		motor->piris->last_pos = 0;
+		#endif
+		ret = motor_find_pi(motor, motor->piris, 10);
+		if (ret < 0) {
+			dev_err(&motor->spi->dev,
+				"get piris pi fail, pls check it\n");
+			return -EINVAL;
+		}
+		#ifdef PI_TEST
+		min = -ret;
+		max = motor->piris->step_max + min;
+		motor->piris->min_pos = min;
+		motor->piris->max_pos = max;
+		#endif
+		if (!IS_ERR(motor->piris->pia_gpio))
+			gpiod_set_value(motor->piris->pia_gpio, 0);
+		if (!IS_ERR(motor->piris->pie_gpio))
+			gpiod_set_value(motor->piris->pie_gpio, 0);
+		motor->piris->last_pos = 0;
+	} else {
+		motor->piris->last_pos = motor->piris->step_max;
+		ret = set_motor_running_status(motor,
+					       motor->piris,
+					       0,
+					       false,
+					       false,
+					       false);
+		wait_for_motor_stop(motor->piris);
+	}
+	return 0;
+}
+
+static void motor_reinit_piris_pos(struct motor_dev *motor)
+{
+	if (!motor->piris) {
+		dev_err(&motor->spi->dev,
+			"not support piris\n");
+		return;
+	}
+	motor_reinit_piris(motor);
+	motor->piris->last_pos = 0;
+	__v4l2_ctrl_modify_range(motor->iris_ctrl, motor->piris->min_pos,
+				 motor->piris->max_pos - motor->piris->reback,
+				 1, 0);
+}
+
+static int motor_reinit_focus(struct motor_dev *motor)
+{
+	int ret = 0;
+
+	if (!IS_ERR(motor->focus->pic_gpio)) {
+		if (!IS_ERR(motor->focus->pia_gpio))
+			gpiod_set_value(motor->focus->pia_gpio, 1);
+		if (!IS_ERR(motor->focus->pie_gpio))
+			gpiod_set_value(motor->focus->pie_gpio, 0);
+		msleep(250);
+		#ifdef PI_TEST
+		motor->focus->last_pos = motor->focus->step_max;
+		ret = set_motor_running_status(motor,
+					       motor->focus,
+					       0,
+					       false,
+					       false,
+					       false);
+		wait_for_motor_stop(motor->focus);
+		#else
+		motor->focus->last_pos = 0;
+		#endif
+		ret = motor_find_pi(motor, motor->focus, 200);
+		if (ret < 0) {
+			dev_info(&motor->spi->dev,
+				 "get focus pi fail, pls check it\n");
+			return -EINVAL;
+		}
+		#ifdef PI_TEST
+		min = -ret;
+		max = motor->focus->step_max + min;
+		motor->focus->min_pos = min;
+		motor->focus->max_pos = max;
+		#endif
+		if (!IS_ERR(motor->focus->pia_gpio))
+			gpiod_set_value(motor->focus->pia_gpio, 0);
+		if (!IS_ERR(motor->focus->pie_gpio))
+			gpiod_set_value(motor->focus->pie_gpio, 0);
+	} else {
+		motor->focus->last_pos = motor->focus->step_max;
+		ret = set_motor_running_status(motor,
+					       motor->focus,
+					       0,
+					       false,
+					       false,
+					       true);
+		wait_for_motor_stop(motor->focus);
+	}
+	return 0;
+}
+
+static void motor_reinit_focus_pos(struct motor_dev *motor)
+{
+	if (!motor->focus) {
+		dev_err(&motor->spi->dev,
+			"not support focus\n");
+		return;
+	}
+	motor_reinit_focus(motor);
+	motor->focus->last_pos = 0;
+	__v4l2_ctrl_modify_range(motor->focus_ctrl, motor->focus->min_pos,
+				 motor->focus->max_pos - motor->focus->reback,
+				 1, 0);
+}
+
+static int  motor_reinit_zoom(struct motor_dev *motor)
+{
+	int ret = 0;
+
+	if (!IS_ERR(motor->zoom->pic_gpio)) {
+		if (!IS_ERR(motor->focus->pia_gpio))
+			gpiod_set_value(motor->focus->pia_gpio, 1);
+		if (!IS_ERR(motor->focus->pie_gpio))
+			gpiod_set_value(motor->focus->pie_gpio, 0);
+		msleep(250);
+		#ifdef PI_TEST
+		motor->zoom->last_pos = motor->zoom->step_max;
+		ret = set_motor_running_status(motor,
+					       motor->zoom,
+					       0,
+					       false,
+					       false,
+					       false);
+		wait_for_motor_stop(motor->zoom);
+		#else
+		motor->zoom->last_pos = 0;
+		#endif
+		ret = motor_find_pi(motor, motor->zoom, 200);
+		if (ret < 0) {
+			dev_err(&motor->spi->dev,
+				"get zoom pi fail, pls check it\n");
+			return -EINVAL;
+		}
+		#ifdef PI_TEST
+		min = -ret;
+		max = motor->zoom->step_max + min;
+		motor->zoom->min_pos = min;
+		motor->zoom->max_pos = max;
+		#endif
+		if (!IS_ERR(motor->focus->pia_gpio))
+			gpiod_set_value(motor->focus->pia_gpio, 0);
+		if (!IS_ERR(motor->focus->pie_gpio))
+			gpiod_set_value(motor->focus->pie_gpio, 0);
+	} else {
+		motor->zoom->last_pos = motor->zoom->step_max;
+		ret = set_motor_running_status(motor,
+					       motor->zoom,
+					       0,
+					       false,
+					       false,
+					       true);
+		wait_for_motor_stop(motor->zoom);
+	}
+	return 0;
+}
+
+static void motor_reinit_zoom_pos(struct motor_dev *motor)
+{
+	if (!motor->zoom) {
+		dev_err(&motor->spi->dev,
+			"not support zoom\n");
+		return;
+	}
+	motor_reinit_zoom(motor);
+	motor->zoom->last_pos = 0;
+	__v4l2_ctrl_modify_range(motor->zoom_ctrl, motor->zoom->min_pos,
+				 motor->zoom->max_pos - motor->zoom->reback,
+				 1, 0);
+}
+
+static int motor_reinit_zoom1(struct motor_dev *motor)
+{
+	int ret = 0;
+
+	if (!IS_ERR(motor->zoom1->pic_gpio)) {
+		if (!IS_ERR(motor->zoom1->pia_gpio))
+			gpiod_set_value(motor->zoom1->pia_gpio, 1);
+		if (!IS_ERR(motor->zoom1->pie_gpio))
+			gpiod_set_value(motor->zoom1->pie_gpio, 0);
+		msleep(250);
+		#ifdef PI_TEST
+		motor->zoom1->last_pos = motor->zoom1->step_max;
+		ret = set_motor_running_status(motor,
+					       motor->zoom1,
+					       0,
+					       false,
+					       false,
+					       false);
+		wait_for_motor_stop(motor->zoom1);
+		#else
+		motor->zoom1->last_pos = 0;
+		#endif
+		ret = motor_find_pi(motor, motor->zoom1, 200);
+		if (ret < 0) {
+			dev_err(&motor->spi->dev,
+				"get zoom1 pi fail, pls check it\n");
+			return -EINVAL;
+		}
+		#ifdef PI_TEST
+		min = -ret;
+		max = motor->zoom1->step_max + min;
+		motor->zoom1->min_pos = min;
+		motor->zoom1->max_pos = max;
+		#endif
+		if (!IS_ERR(motor->zoom1->pia_gpio))
+			gpiod_set_value(motor->zoom1->pia_gpio, 0);
+		if (!IS_ERR(motor->zoom1->pie_gpio))
+			gpiod_set_value(motor->zoom1->pie_gpio, 0);
+	}  else {
+		motor->zoom1->last_pos = motor->zoom1->step_max;
+		ret = set_motor_running_status(motor,
+					       motor->zoom1,
+					       0,
+					       false,
+					       false,
+					       true);
+		wait_for_motor_stop(motor->zoom1);
+	}
+	return 0;
+}
+
+static void motor_reinit_zoom1_pos(struct motor_dev *motor)
+{
+	if (!motor->zoom1) {
+		dev_err(&motor->spi->dev,
+			"not support zoom1\n");
+		return;
+	}
+	motor_reinit_zoom1(motor);
+	motor->zoom1->last_pos = 0;
+	__v4l2_ctrl_modify_range(motor->zoom1_ctrl, motor->zoom1->min_pos,
+				 motor->zoom1->max_pos - motor->zoom1->reback,
+				 1, 0);
+}
+
+//#define REBACK_CTRL_BY_DRV
+static int motor_set_focus(struct motor_dev *motor, struct rk_cam_set_focus *mv_param)
+{
+	int ret = 0;
+	bool is_need_reback = mv_param->is_need_reback;
+
+#ifdef REBACK_CTRL_BY_DRV
+	if (mv_param->focus_pos > motor->focus->last_pos)
+		is_need_reback = false;
+	else
+		is_need_reback = true;
+#endif
+	ret = set_motor_running_status(motor,
+				       motor->focus,
+				       mv_param->focus_pos,
+				       true,
+				       false,
+				       is_need_reback);
+	wait_for_motor_stop(motor->focus);
+
+	return ret;
+}
+
+static long motor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	struct rk_cam_vcm_tim *mv_tim;
+	struct motor_dev *motor = to_motor_dev(sd);
+	u32 *pbacklash = 0;
+	struct rk_cam_set_zoom *mv_param;
+	struct rk_cam_set_focus *focus_param;
+	int ret = 0;
+	struct rk_cam_modify_pos *pos;
+
+	switch (cmd) {
+	case RK_VIDIOC_IRIS_TIMEINFO:
+		mv_tim = (struct rk_cam_vcm_tim *)arg;
+		if (!motor->piris->is_mv_tim_update)
+			usleep_range(motor->piris->move_time_us,
+				     motor->piris->move_time_us + 1000);
+		if (motor->piris->is_mv_tim_update) {
+			memcpy(mv_tim, &motor->piris->mv_tim, sizeof(*mv_tim));
+
+			dev_dbg(&motor->spi->dev,
+				"get_piris_move_tim 0x%lx, 0x%lx, 0x%lx, 0x%lx\n",
+				mv_tim->vcm_start_t.tv_sec,
+				mv_tim->vcm_start_t.tv_usec,
+				mv_tim->vcm_end_t.tv_sec,
+				mv_tim->vcm_end_t.tv_usec);
+		} else {
+			dev_err(&motor->spi->dev, "get_piris_move_tim failed\n");
+			return -EINVAL;
+		}
+		break;
+	case RK_VIDIOC_VCM_TIMEINFO:
+		mv_tim = (struct rk_cam_vcm_tim *)arg;
+		if (!motor->focus->is_mv_tim_update)
+			usleep_range(motor->focus->move_time_us,
+				     motor->focus->move_time_us + 1000);
+		if (motor->focus->is_mv_tim_update) {
+			memcpy(mv_tim, &motor->focus->mv_tim, sizeof(*mv_tim));
+
+			dev_dbg(&motor->spi->dev,
+				"get_focus_move_tim 0x%lx, 0x%lx, 0x%lx, 0x%lx\n",
+				mv_tim->vcm_start_t.tv_sec,
+				mv_tim->vcm_start_t.tv_usec,
+				mv_tim->vcm_end_t.tv_sec,
+				mv_tim->vcm_end_t.tv_usec);
+		} else {
+			dev_err(&motor->spi->dev, "get_focus_move_tim failed\n");
+			return -EINVAL;
+		}
+		break;
+	case RK_VIDIOC_ZOOM_TIMEINFO:
+		mv_tim = (struct rk_cam_vcm_tim *)arg;
+		if (!motor->zoom->is_mv_tim_update)
+			usleep_range(motor->zoom->move_time_us,
+				     motor->zoom->move_time_us + 1000);
+		if (motor->zoom->is_mv_tim_update) {
+			memcpy(mv_tim, &motor->zoom->mv_tim, sizeof(*mv_tim));
+
+			dev_dbg(&motor->spi->dev,
+				"get_zoom_move_tim 0x%lx, 0x%lx, 0x%lx, 0x%lx\n",
+				mv_tim->vcm_start_t.tv_sec,
+				mv_tim->vcm_start_t.tv_usec,
+				mv_tim->vcm_end_t.tv_sec,
+				mv_tim->vcm_end_t.tv_usec);
+		} else {
+			dev_err(&motor->spi->dev, "get_zoom_move_tim failed\n");
+			return -EINVAL;
+		}
+		break;
+	case RK_VIDIOC_ZOOM1_TIMEINFO:
+		mv_tim = (struct rk_cam_vcm_tim *)arg;
+		if (!motor->zoom1->is_mv_tim_update)
+			usleep_range(motor->zoom1->move_time_us,
+				     motor->zoom1->move_time_us + 1000);
+		if (motor->zoom1->is_mv_tim_update) {
+			memcpy(mv_tim, &motor->zoom1->mv_tim, sizeof(*mv_tim));
+
+			dev_dbg(&motor->spi->dev,
+				"get_zoom_move_tim 0x%lx, 0x%lx, 0x%lx, 0x%lx\n",
+				mv_tim->vcm_start_t.tv_sec,
+				mv_tim->vcm_start_t.tv_usec,
+				mv_tim->vcm_end_t.tv_sec,
+				mv_tim->vcm_end_t.tv_usec);
+		} else {
+			dev_err(&motor->spi->dev, "get_zoom_move_tim failed\n");
+			return -EINVAL;
+		}
+		break;
+	case RK_VIDIOC_IRIS_SET_BACKLASH:
+		pbacklash = (u32 *)arg;
+		motor->piris->backlash = *pbacklash;
+		break;
+	case RK_VIDIOC_FOCUS_SET_BACKLASH:
+		pbacklash = (u32 *)arg;
+		motor->focus->backlash = *pbacklash;
+		break;
+	case RK_VIDIOC_ZOOM_SET_BACKLASH:
+		pbacklash = (u32 *)arg;
+		motor->zoom->backlash = *pbacklash;
+		break;
+	case RK_VIDIOC_ZOOM1_SET_BACKLASH:
+		pbacklash = (u32 *)arg;
+		motor->zoom1->backlash = *pbacklash;
+		break;
+	case RK_VIDIOC_IRIS_CORRECTION:
+		motor_reinit_piris_pos(motor);
+		break;
+	case RK_VIDIOC_FOCUS_CORRECTION:
+		motor_reinit_focus_pos(motor);
+		break;
+	case RK_VIDIOC_ZOOM_CORRECTION:
+		motor_reinit_zoom_pos(motor);
+		break;
+	case RK_VIDIOC_ZOOM1_CORRECTION:
+		motor_reinit_zoom1_pos(motor);
+		break;
+	case RK_VIDIOC_ZOOM_SET_POSITION:
+		mv_param = (struct rk_cam_set_zoom *)arg;
+		ret = motor_set_zoom_follow(motor, mv_param);
+		break;
+	case RK_VIDIOC_FOCUS_SET_POSITION:
+		focus_param = (struct rk_cam_set_focus *)arg;
+		ret = motor_set_focus(motor, focus_param);
+		break;
+	case RK_VIDIOC_MODIFY_POSITION:
+		pos = (struct rk_cam_modify_pos *)arg;
+		if (motor->focus)
+			motor->focus->last_pos = pos->focus_pos;
+		if (motor->zoom)
+			motor->zoom->last_pos = pos->zoom_pos;
+		if (motor->zoom1)
+			motor->zoom1->last_pos = pos->zoom1_pos;
+		break;
+	default:
+		break;
+	}
+	return ret;
+}
+
+#ifdef CONFIG_COMPAT
+static long motor_compat_ioctl32(struct v4l2_subdev *sd, unsigned int cmd, unsigned long arg)
+{
+	void __user *up = compat_ptr(arg);
+	struct rk_cam_vcm_tim *mv_tim;
+	int ret = 0;
+	u32 val = 0;
+	struct rk_cam_set_zoom *mv_param;
+	struct rk_cam_set_focus *focus_param;
+
+	switch (cmd) {
+	case RK_VIDIOC_IRIS_TIMEINFO:
+	case RK_VIDIOC_VCM_TIMEINFO:
+	case RK_VIDIOC_ZOOM_TIMEINFO:
+	case RK_VIDIOC_ZOOM1_TIMEINFO:
+		mv_tim = kzalloc(sizeof(*mv_tim), GFP_KERNEL);
+		if (!mv_tim) {
+			ret = -ENOMEM;
+			return ret;
+		}
+		ret = motor_ioctl(sd, cmd, mv_tim);
+		if (!ret) {
+			if (copy_to_user(up, mv_tim, sizeof(*mv_tim))) {
+				kfree(mv_tim);
+				return -EFAULT;
+			}
+		}
+		kfree(mv_tim);
+		break;
+	case RK_VIDIOC_IRIS_SET_BACKLASH:
+	case RK_VIDIOC_FOCUS_SET_BACKLASH:
+	case RK_VIDIOC_ZOOM_SET_BACKLASH:
+	case RK_VIDIOC_ZOOM1_SET_BACKLASH:
+		if (copy_from_user(&val, up, sizeof(val)))
+			return -EFAULT;
+		ret = motor_ioctl(sd, cmd, &val);
+		break;
+	case RK_VIDIOC_IRIS_CORRECTION:
+	case RK_VIDIOC_FOCUS_CORRECTION:
+	case RK_VIDIOC_ZOOM_CORRECTION:
+	case RK_VIDIOC_ZOOM1_CORRECTION:
+		if (copy_from_user(&val, up, sizeof(val)))
+			return -EFAULT;
+		ret = motor_ioctl(sd, cmd, &val);
+		break;
+	case RK_VIDIOC_ZOOM_SET_POSITION:
+		mv_param = kzalloc(sizeof(*mv_param), GFP_KERNEL);
+		if (!mv_param) {
+			ret = -ENOMEM;
+			return ret;
+		}
+		if (copy_from_user(mv_param, up, sizeof(*mv_param))) {
+			kfree(mv_param);
+			return -EFAULT;
+		}
+		ret = motor_ioctl(sd, cmd, mv_param);
+		kfree(mv_param);
+		break;
+	case RK_VIDIOC_FOCUS_SET_POSITION:
+		focus_param = kzalloc(sizeof(*focus_param), GFP_KERNEL);
+		if (!focus_param) {
+			ret = -ENOMEM;
+			return ret;
+		}
+		if (copy_from_user(focus_param, up, sizeof(*focus_param))) {
+			kfree(focus_param);
+			return -EFAULT;
+		}
+		ret = motor_ioctl(sd, cmd, focus_param);
+		kfree(focus_param);
+		break;
+	default:
+		break;
+	}
+	return ret;
+}
+#endif
+
+#define USED_SYS_DEBUG
+#ifdef USED_SYS_DEBUG
+static ssize_t set_pid_dgain(struct device *dev,
+	struct device_attribute *attr,
+	const char *buf,
+	size_t count)
+{
+	struct v4l2_subdev *sd = dev_get_drvdata(dev);
+	struct motor_dev *motor = to_motor_dev(sd);
+	int val = 0;
+	int ret = 0;
+	u16 reg_val = 0;
+
+	ret = kstrtoint(buf, 0, &val);
+	if (!ret) {
+		if (motor->is_use_dc_iris) {
+			spi_read_reg(motor->spi, 0x01, &reg_val);
+			reg_val &= 0x01ff;
+			reg_val |= (val & 0x7f) << 9;
+			spi_write_reg(motor->spi, 0x01, reg_val);
+			gpiod_set_value(motor->dciris->vd_iris_gpio, 1);
+			usleep_range(200, 400);
+			gpiod_set_value(motor->dciris->vd_iris_gpio, 0);
+			dev_info(dev, "set pid dgain %d, reg val 0x%x\n", val, reg_val);
+			spi_read_reg(motor->spi, 0x01, &reg_val);
+			dev_info(dev, "pid dgain reg val 0x%x, read from register\n", reg_val);
+		} else {
+			dev_err(dev, "not support dc-iris, do nothing\n");
+		}
+	}
+	return count;
+}
+
+static ssize_t set_pid_zero(struct device *dev,
+	struct device_attribute *attr,
+	const char *buf,
+	size_t count)
+{
+	struct v4l2_subdev *sd = dev_get_drvdata(dev);
+	struct motor_dev *motor = to_motor_dev(sd);
+	int val = 0;
+	int ret = 0;
+	u16 reg_val = 0;
+
+	ret = kstrtoint(buf, 0, &val);
+	if (!ret) {
+		if (motor->is_use_dc_iris) {
+			spi_read_reg(motor->spi, 0x02, &reg_val);
+			reg_val &= 0xf0ff;
+			reg_val |= (val & 0xf) << 8;
+			spi_write_reg(motor->spi, 0x02, reg_val);
+			gpiod_set_value(motor->dciris->vd_iris_gpio, 1);
+			usleep_range(200, 400);
+			gpiod_set_value(motor->dciris->vd_iris_gpio, 0);
+			dev_info(dev, "set pid zero %d, reg val 0x%x\n", val, reg_val);
+			spi_read_reg(motor->spi, 0x02, &reg_val);
+			dev_info(dev, "pid zero reg val 0x%x, read from register\n", reg_val);
+		} else {
+			dev_err(dev, "not support dc-iris, do nothing\n");
+		}
+	}
+	return count;
+}
+
+static ssize_t set_pid_pole(struct device *dev,
+	struct device_attribute *attr,
+	const char *buf,
+	size_t count)
+{
+	struct v4l2_subdev *sd = dev_get_drvdata(dev);
+	struct motor_dev *motor = to_motor_dev(sd);
+	int val = 0;
+	int ret = 0;
+	u16 reg_val = 0;
+
+	ret = kstrtoint(buf, 0, &val);
+	if (!ret) {
+		if (motor->is_use_dc_iris) {
+			spi_read_reg(motor->spi, 0x02, &reg_val);
+			reg_val &= 0x0fff;
+			reg_val |= (val & 0xf) << 12;
+			spi_write_reg(motor->spi, 0x02, reg_val);
+			gpiod_set_value(motor->dciris->vd_iris_gpio, 1);
+			usleep_range(200, 400);
+			gpiod_set_value(motor->dciris->vd_iris_gpio, 0);
+			dev_info(dev, "set pid pole %d, reg val 0x%x\n", val, reg_val);
+			spi_read_reg(motor->spi, 0x02, &reg_val);
+			dev_info(dev, "pid pole reg val 0x%x, read from register\n", reg_val);
+		} else {
+			dev_err(dev, "not support dc-iris, do nothing\n");
+		}
+	}
+	return count;
+}
+
+static ssize_t set_hall_bias(struct device *dev,
+	struct device_attribute *attr,
+	const char *buf,
+	size_t count)
+{
+	struct v4l2_subdev *sd = dev_get_drvdata(dev);
+	struct motor_dev *motor = to_motor_dev(sd);
+	int val = 0;
+	int ret = 0;
+	u16 reg_val = 0;
+
+	ret = kstrtoint(buf, 0, &val);
+	if (!ret) {
+		if (motor->is_use_dc_iris) {
+			spi_read_reg(motor->spi, 0x04, &reg_val);
+			reg_val &= 0xff00;
+			reg_val |= val & 0xff;
+			spi_write_reg(motor->spi, 0x04, reg_val);
+			gpiod_set_value(motor->dciris->vd_iris_gpio, 1);
+			usleep_range(200, 400);
+			gpiod_set_value(motor->dciris->vd_iris_gpio, 0);
+			dev_info(dev, "set hall_bias %d, reg val 0x%x\n", val, reg_val);
+			spi_read_reg(motor->spi, 0x04, &reg_val);
+			dev_info(dev, "hall bias reg val 0x%x, read from register\n", reg_val);
+		} else {
+			dev_err(dev, "not support dc-iris, do nothing\n");
+		}
+	}
+	return count;
+}
+
+static ssize_t set_hall_offset(struct device *dev,
+	struct device_attribute *attr,
+	const char *buf,
+	size_t count)
+{
+	struct v4l2_subdev *sd = dev_get_drvdata(dev);
+	struct motor_dev *motor = to_motor_dev(sd);
+	int val = 0;
+	int ret = 0;
+	u16 reg_val = 0;
+
+	ret = kstrtoint(buf, 0, &val);
+	if (!ret) {
+		if (motor->is_use_dc_iris) {
+			spi_read_reg(motor->spi, 0x04, &reg_val);
+			reg_val &= 0x00ff;
+			reg_val |= (val & 0xff) << 8;
+			spi_write_reg(motor->spi, 0x04, reg_val);
+			gpiod_set_value(motor->dciris->vd_iris_gpio, 1);
+			usleep_range(200, 400);
+			gpiod_set_value(motor->dciris->vd_iris_gpio, 0);
+			dev_info(dev, "set hall_offset %d, reg val 0x%x\n", val, reg_val);
+			spi_read_reg(motor->spi, 0x04, &reg_val);
+			dev_info(dev, "hall offset reg val 0x%x, read from register\n", reg_val);
+		} else {
+			dev_err(dev, "not support dc-iris, do nothing\n");
+		}
+	}
+	return count;
+}
+
+static ssize_t set_hall_gain(struct device *dev,
+	struct device_attribute *attr,
+	const char *buf,
+	size_t count)
+{
+	struct v4l2_subdev *sd = dev_get_drvdata(dev);
+	struct motor_dev *motor = to_motor_dev(sd);
+	int val = 0;
+	int ret = 0;
+	u16 reg_val = 0;
+
+	ret = kstrtoint(buf, 0, &val);
+	if (!ret) {
+		if (motor->is_use_dc_iris) {
+			spi_read_reg(motor->spi, 0x05, &reg_val);
+			reg_val &= 0xf0ff;
+			reg_val |= (val & 0xf) << 8;
+			spi_write_reg(motor->spi, 0x05, reg_val);
+			gpiod_set_value(motor->dciris->vd_iris_gpio, 1);
+			usleep_range(200, 400);
+			gpiod_set_value(motor->dciris->vd_iris_gpio, 0);
+			dev_info(dev, "set hall_offset %d, reg val 0x%04x\n", val, reg_val);
+			spi_read_reg(motor->spi, 0x05, &reg_val);
+			dev_info(dev, "hall gain reg val 0x%04x, read from register\n", reg_val);
+		} else {
+			dev_err(dev, "not support dc-iris, do nothing\n");
+		}
+	}
+	return count;
+}
+
+static ssize_t reinit_piris_pos(struct device *dev,
+	struct device_attribute *attr,
+	const char *buf,
+	size_t count)
+{
+	struct v4l2_subdev *sd = dev_get_drvdata(dev);
+	struct motor_dev *motor = to_motor_dev(sd);
+	int val = 0;
+	int ret = 0;
+
+	ret = kstrtoint(buf, 0, &val);
+	if (!ret) {
+		if (val == 1)
+			motor_reinit_piris_pos(motor);
+	}
+	return count;
+}
+
+static ssize_t reinit_focus_pos(struct device *dev,
+	struct device_attribute *attr,
+	const char *buf,
+	size_t count)
+{
+	struct v4l2_subdev *sd = dev_get_drvdata(dev);
+	struct motor_dev *motor = to_motor_dev(sd);
+	int val = 0;
+	int ret = 0;
+
+	ret = kstrtoint(buf, 0, &val);
+	if (!ret) {
+		if (val == 1)
+			motor_reinit_focus_pos(motor);
+	}
+	return count;
+}
+
+static ssize_t reinit_zoom_pos(struct device *dev,
+	struct device_attribute *attr,
+	const char *buf,
+	size_t count)
+{
+	struct v4l2_subdev *sd = dev_get_drvdata(dev);
+	struct motor_dev *motor = to_motor_dev(sd);
+	int val = 0;
+	int ret = 0;
+
+	ret = kstrtoint(buf, 0, &val);
+	if (!ret) {
+		if (val == 1)
+			motor_reinit_zoom_pos(motor);
+	}
+	return count;
+}
+
+static ssize_t reinit_zoom1_pos(struct device *dev,
+	struct device_attribute *attr,
+	const char *buf,
+	size_t count)
+{
+	struct v4l2_subdev *sd = dev_get_drvdata(dev);
+	struct motor_dev *motor = to_motor_dev(sd);
+	int val = 0;
+	int ret = 0;
+
+	ret = kstrtoint(buf, 0, &val);
+	if (!ret) {
+		if (val == 1)
+			motor_reinit_zoom1_pos(motor);
+	}
+	return count;
+}
+
+static struct device_attribute attributes[] = {
+	__ATTR(pid_dgain, S_IWUSR, NULL, set_pid_dgain),
+	__ATTR(pid_zero, S_IWUSR, NULL, set_pid_zero),
+	__ATTR(pid_pole, S_IWUSR, NULL, set_pid_pole),
+	__ATTR(hall_bias, S_IWUSR, NULL, set_hall_bias),
+	__ATTR(hall_offset, S_IWUSR, NULL, set_hall_offset),
+	__ATTR(hall_gain, S_IWUSR, NULL, set_hall_gain),
+	__ATTR(reinit_piris, S_IWUSR, NULL, reinit_piris_pos),
+	__ATTR(reinit_focus, S_IWUSR, NULL, reinit_focus_pos),
+	__ATTR(reinit_zoom, S_IWUSR, NULL, reinit_zoom_pos),
+	__ATTR(reinit_zoom1, S_IWUSR, NULL, reinit_zoom1_pos),
+};
+
+static int add_sysfs_interfaces(struct device *dev)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(attributes); i++)
+		if (device_create_file(dev, attributes + i))
+			goto undo;
+	return 0;
+undo:
+	for (i--; i >= 0 ; i--)
+		device_remove_file(dev, attributes + i);
+	dev_err(dev, "%s: failed to create sysfs interface\n", __func__);
+	return -ENODEV;
+}
+
+static int remove_sysfs_interfaces(struct device *dev)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(attributes); i++)
+		device_remove_file(dev, attributes + i);
+	return 0;
+}
+#endif
+
+static const struct v4l2_subdev_core_ops motor_core_ops = {
+	.ioctl = motor_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = motor_compat_ioctl32
+#endif
+};
+
+static const struct v4l2_subdev_ops motor_subdev_ops = {
+	.core	= &motor_core_ops,
+};
+
+static const struct v4l2_ctrl_ops motor_ctrl_ops = {
+	.g_volatile_ctrl = motor_g_volatile_ctrl,
+	.s_ctrl = motor_s_ctrl,
+};
+
+static int motor_initialize_controls(struct motor_dev *motor)
+{
+	struct v4l2_ctrl_handler *handler;
+	int ret = 0;
+	#ifdef PI_TEST
+	int min = 0;
+	int max = 0;
+	#endif
+	unsigned long flags = V4L2_CTRL_FLAG_EXECUTE_ON_WRITE | V4L2_CTRL_FLAG_VOLATILE;
+
+	handler = &motor->ctrl_handler;
+	ret = v4l2_ctrl_handler_init(handler, 3);
+	if (ret)
+		return ret;
+	if (motor->is_use_dc_iris) {
+		motor->iris_ctrl = v4l2_ctrl_new_std(handler, &motor_ctrl_ops,
+			V4L2_CID_IRIS_ABSOLUTE, 0, motor->dciris->max_log, 1, 0);
+		if (motor->iris_ctrl)
+			motor->iris_ctrl->flags |= flags;
+
+	} else if (motor->is_use_p_iris) {
+		#ifdef REINIT_BOOT
+		ret = motor_reinit_piris(motor);
+		if (ret < 0)
+			return -EINVAL;
+		#endif
+		motor->piris->last_pos = motor->piris->min_pos;
+		motor->iris_ctrl = v4l2_ctrl_new_std(handler, &motor_ctrl_ops,
+						     V4L2_CID_IRIS_ABSOLUTE,
+						     motor->piris->min_pos,
+						     motor->piris->max_pos,
+						     1, motor->piris->min_pos);
+		if (motor->iris_ctrl)
+			motor->iris_ctrl->flags |= flags;
+	}
+	if (motor->is_use_focus) {
+		#ifdef REINIT_BOOT
+		ret = motor_reinit_focus(motor);
+		if (ret < 0)
+			return -EINVAL;
+		#endif
+		motor->focus->last_pos = motor->focus->min_pos;
+		motor->focus_ctrl = v4l2_ctrl_new_std(handler, &motor_ctrl_ops,
+				    V4L2_CID_FOCUS_ABSOLUTE, motor->focus->min_pos,
+				    motor->focus->max_pos - motor->focus->reback,
+				    1, motor->focus->min_pos);
+		if (motor->focus_ctrl)
+			motor->focus_ctrl->flags |= flags;
+	}
+	if (motor->is_use_zoom) {
+		#ifdef REINIT_BOOT
+		ret = motor_reinit_zoom(motor);
+		if (ret < 0)
+			return -EINVAL;
+		#endif
+		motor->zoom->last_pos = motor->zoom->min_pos;
+		motor->zoom_ctrl = v4l2_ctrl_new_std(handler, &motor_ctrl_ops,
+				    V4L2_CID_ZOOM_ABSOLUTE,
+				    motor->zoom->min_pos,
+				    motor->zoom->max_pos - motor->zoom->reback,
+				    1, motor->zoom->min_pos);
+		if (motor->zoom_ctrl)
+			motor->zoom_ctrl->flags |= flags;
+	}
+	if (motor->is_use_zoom1) {
+		#ifdef REINIT_BOOT
+		ret = motor_reinit_zoom1(motor);
+		if (ret < 0)
+			return -EINVAL;
+		#endif
+		motor->zoom1->last_pos = motor->zoom1->min_pos;
+		motor->zoom1_ctrl = v4l2_ctrl_new_std(handler, &motor_ctrl_ops,
+				    V4L2_CID_ZOOM_CONTINUOUS,
+				    motor->zoom1->min_pos,
+				    motor->zoom1->max_pos,
+				    1, motor->zoom1->min_pos);
+		if (motor->zoom1_ctrl)
+			motor->zoom1_ctrl->flags |= flags;
+	}
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(&motor->spi->dev,
+			"Failed to init controls(%d)\n", ret);
+		goto err_free_handler;
+	}
+
+	motor->subdev.ctrl_handler = handler;
+	return ret;
+
+err_free_handler:
+	v4l2_ctrl_handler_free(handler);
+
+	return ret;
+}
+
+static void dev_param_init(struct motor_dev *motor)
+{
+	int step = 0;
+	u32 mv_cnt = 0;
+	u32 status = 0;
+	u32 reback_vd_cnt = 0;
+
+	if (motor->is_use_dc_iris)
+		motor->dciris->last_log = 0;
+	if (motor->is_use_p_iris) {
+		motor->piris->is_mv_tim_update = false;
+		motor->piris->is_need_update_tim = false;
+		motor->piris->move_status = MOTOR_STATUS_STOPPED;
+		motor->piris->type = TYPE_IRIS;
+		motor->piris->mv_tim.vcm_start_t = ns_to_timeval(ktime_get_ns());
+		motor->piris->mv_tim.vcm_end_t = ns_to_timeval(ktime_get_ns());
+		init_completion(&motor->piris->complete);
+		init_completion(&motor->piris->complete_out);
+		motor->piris->run_data.psum = motor->vd_fz_period_us *
+					      motor->piris->start_up_speed * 8 / 1000000;
+		motor->piris->run_data.intct = 27 * motor->vd_fz_period_us /
+					       (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",
+			 motor->vd_fz_period_us,
+			 motor->piris->run_data.intct);
+	}
+	if (motor->is_use_focus) {
+		motor->focus->is_mv_tim_update = false;
+		motor->focus->is_need_update_tim = false;
+		motor->focus->move_status = MOTOR_STATUS_STOPPED;
+		motor->focus->type = TYPE_FOCUS;
+		motor->focus->mv_tim.vcm_start_t = ns_to_timeval(ktime_get_ns());
+		motor->focus->mv_tim.vcm_end_t = ns_to_timeval(ktime_get_ns());
+		init_completion(&motor->focus->complete);
+		init_completion(&motor->focus->complete_out);
+		motor->focus->run_data.psum = motor->vd_fz_period_us *
+					      motor->focus->start_up_speed * 8 / 1000000;
+		motor->focus->run_data.intct = 27 * motor->vd_fz_period_us /
+					       (motor->focus->run_data.psum * 24);
+		motor->focus->is_running = false;
+		dev_info(&motor->spi->dev,
+			 "focus vd_fz_period_us %u, inict %d\n",
+			 motor->vd_fz_period_us,
+			 motor->focus->run_data.intct);
+		if (motor->focus->reback != 0) {
+			motor->focus->cur_back_delay = 0;
+			motor->focus->max_back_delay = FOCUS_MAX_BACK_DELAY;
+			motor->focus->reback_data = motor->focus->run_data;
+			mv_cnt = motor->focus->reback;
+			if (motor->focus->is_dir_opp) {
+				mv_cnt += motor->focus->backlash;
+				status = MOTOR_STATUS_CW;
+			} else {
+				mv_cnt += motor->focus->backlash;
+				status = MOTOR_STATUS_CCW;
+			}
+			motor->focus->reback_status = status;
+			if (motor->focus->is_half_step_mode)
+				step = mv_cnt * 4;
+			else
+				step = mv_cnt * 8;
+			motor->focus->reback_data.count = (step + motor->focus->reback_data.psum - 1) /
+							   motor->focus->reback_data.psum + 1;
+			motor->focus->reback_data.cur_count = motor->focus->reback_data.count;
+			motor->focus->reback_data.psum_last = step % motor->focus->reback_data.psum;
+			if (motor->focus->reback_data.psum_last == 0)
+				motor->focus->reback_data.psum_last = motor->focus->reback_data.psum;
+			reback_vd_cnt = motor->focus->reback_data.count + motor->focus->max_back_delay;
+			motor->focus->reback_move_time_us = reback_vd_cnt * (motor->vd_fz_period_us + 500);
+		}
+	}
+	if (motor->is_use_zoom) {
+		motor->zoom->is_mv_tim_update = false;
+		motor->zoom->is_need_update_tim = false;
+		motor->zoom->move_status = MOTOR_STATUS_STOPPED;
+		motor->zoom->type = TYPE_ZOOM;
+		motor->zoom->mv_tim.vcm_start_t = ns_to_timeval(ktime_get_ns());
+		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 /
+					      (motor->zoom->run_data.psum * 24);
+		motor->zoom->is_running = false;
+		if (motor->zoom->reback != 0) {
+			motor->zoom->cur_back_delay = 0;
+			motor->zoom->max_back_delay = ZOOM_MAX_BACK_DELAY;
+			motor->zoom->reback_data = motor->zoom->run_data;
+			mv_cnt = motor->zoom->reback;
+			if (motor->zoom->is_dir_opp) {
+				mv_cnt += motor->zoom->backlash;
+				status = MOTOR_STATUS_CW;
+			} else {
+				mv_cnt += motor->zoom->backlash;
+				status = MOTOR_STATUS_CCW;
+			}
+			motor->zoom->reback_status = status;
+			if (motor->zoom->is_half_step_mode)
+				step = mv_cnt * 4;
+			else
+				step = mv_cnt * 8;
+			motor->zoom->reback_data.count = (step + motor->zoom->reback_data.psum - 1) /
+							   motor->zoom->reback_data.psum + 1;
+			motor->zoom->reback_data.cur_count = motor->zoom->reback_data.count;
+			motor->zoom->reback_data.psum_last = step % motor->zoom->reback_data.psum;
+			if (motor->zoom->reback_data.psum_last == 0)
+				motor->zoom->reback_data.psum_last = motor->zoom->reback_data.psum;
+			reback_vd_cnt = motor->zoom->reback_data.count + motor->zoom->max_back_delay;
+			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",
+			 motor->vd_fz_period_us,
+			 motor->zoom->run_data.intct);
+	}
+	if (motor->is_use_zoom1) {
+		motor->zoom1->is_mv_tim_update = false;
+		motor->zoom1->is_need_update_tim = false;
+		motor->zoom1->move_status = MOTOR_STATUS_STOPPED;
+		motor->zoom1->type = TYPE_ZOOM1;
+		motor->zoom1->mv_tim.vcm_start_t = ns_to_timeval(ktime_get_ns());
+		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 /
+					       (motor->zoom1->run_data.psum * 24);
+		motor->zoom1->is_running = false;
+		dev_info(&motor->spi->dev,
+			 "zoom1 vd_fz_period_us %u, inict %d\n",
+			 motor->vd_fz_period_us,
+			 motor->zoom1->run_data.intct);
+	}
+
+	motor->is_should_wait = false;
+	motor->is_timer_restart = false;
+	motor->wait_cnt = 0;
+}
+
+static void dev_reg_init(struct motor_dev *motor)
+{
+	spi_write_reg(motor->spi, 0x20, 0x1a01);//27M/(30*2^3*2^0)
+	spi_write_reg(motor->spi, 0x21, 0x0085);
+	spi_write_reg(motor->spi, 0x23, PPW_STOP);
+	spi_write_reg(motor->spi, 0x28, PPW_STOP);
+	if (motor->dev0)
+		spi_write_reg(motor->spi,
+			      motor->dev0->reg_op->reg.dt2_phmod,
+			     (motor->dev0->run_data.phmode << 8) | 0x0001);
+	if (motor->dev1)
+		spi_write_reg(motor->spi,
+			      motor->dev1->reg_op->reg.dt2_phmod,
+			     (motor->dev1->run_data.phmode << 8) | 0x0001);
+
+	spi_write_reg(motor->spi, 0x0b, 0x0480);
+	if (motor->is_use_dc_iris) {
+		//DC-IRIS reg init
+		if (motor->dciris->is_reversed_polarity)
+			spi_write_reg(motor->spi, 0x00,
+				      motor->dciris->max_log - motor->dciris->last_log);
+		else
+			spi_write_reg(motor->spi, 0x00, motor->dciris->last_log);
+		spi_write_reg(motor->spi, 0x01, 0x6000);
+		spi_write_reg(motor->spi, 0x02, 0x66f0);
+		spi_write_reg(motor->spi, 0x03, 0x0e10);
+		spi_write_reg(motor->spi, 0x04, 0xd640);
+		spi_write_reg(motor->spi, 0x05, 0x0004);
+		spi_write_reg(motor->spi, 0x0b, 0x0480);
+		spi_write_reg(motor->spi, 0x0a, 0x0000);
+		spi_write_reg(motor->spi, 0x0e, 0x0300);
+
+	}
+	if (!IS_ERR(motor->vd_fz_gpio))
+		gpiod_set_value(motor->vd_fz_gpio, 1);
+	if (motor->is_use_dc_iris && (!IS_ERR(motor->dciris->vd_iris_gpio)))
+		gpiod_set_value(motor->dciris->vd_iris_gpio, 1);
+	usleep_range(100, 200);
+	if (!IS_ERR(motor->vd_fz_gpio))
+		gpiod_set_value(motor->vd_fz_gpio, 0);
+	if (motor->is_use_dc_iris && (!IS_ERR(motor->dciris->vd_iris_gpio)))
+		gpiod_set_value(motor->dciris->vd_iris_gpio, 0);
+}
+
+
+static int motor_check_id(struct motor_dev *motor)
+{
+	u16 val = 0xffff;
+	int i = 0;
+
+	for (i = 0; i < 0x20; i++)
+		spi_read_reg(motor->spi, i, &val);
+	spi_read_reg(motor->spi, 0x20, &val);
+	if (val == 0xffff) {
+		dev_err(&motor->spi->dev,
+			"check id fail, spi transfer err or driver not connect, val 0x%x\n",
+			val);
+		return -EINVAL;
+	}
+	return 0;
+}
+
+static int dev_init(struct motor_dev *motor)
+{
+	int ret = 0;
+
+	if (!IS_ERR(motor->reset_gpio)) {
+		gpiod_set_value_cansleep(motor->reset_gpio, 0);
+		usleep_range(100, 200);
+		gpiod_set_value_cansleep(motor->reset_gpio, 1);
+	}
+	ret = motor_check_id(motor);
+	if (ret < 0)
+		return -EINVAL;
+	dev_param_init(motor);
+	dev_reg_init(motor);
+
+	motor->wk = devm_kzalloc(&motor->spi->dev, sizeof(*motor->wk), GFP_KERNEL);
+	if (!motor->wk) {
+		dev_err(&motor->spi->dev, "failed to alloc work struct\n");
+		return -ENOMEM;
+	}
+	motor->wk->dev = motor;
+	INIT_WORK(&motor->wk->work, motor_op_work);
+
+	return 0;
+}
+
+static int motor_dev_probe(struct spi_device *spi)
+{
+	int ret = 0;
+	struct device *dev = &spi->dev;
+	struct motor_dev *motor;
+	struct v4l2_subdev *sd;
+	char facing[2];
+
+	dev_info(dev, "driver version: %02x.%02x.%02x",
+		DRIVER_VERSION >> 16,
+		(DRIVER_VERSION & 0xff00) >> 8,
+		DRIVER_VERSION & 0x00ff);
+	motor = devm_kzalloc(dev, sizeof(*motor), GFP_KERNEL);
+	if (!motor)
+		return -ENOMEM;
+	spi->mode = SPI_MODE_3 | SPI_LSB_FIRST | SPI_CS_HIGH;
+	spi->irq = -1;
+	spi->max_speed_hz = 5000000;
+	spi->bits_per_word = 8;
+	ret = spi_setup(spi);
+	if (ret < 0) {
+		dev_err(dev, "could not setup spi!\n");
+		return -EINVAL;
+	}
+	motor->spi = spi;
+	motor->motor_op[0] = g_motor_op[0];
+	motor->motor_op[1] = g_motor_op[1];
+
+	if (motor_dev_parse_dt(motor)) {
+		dev_err(&motor->spi->dev, "parse dt error\n");
+		return -EINVAL;
+	}
+	ret = dev_init(motor);
+	if (ret)
+		goto err_free;
+
+	mutex_init(&motor->mutex);
+	hrtimer_init(&motor->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+	motor->timer.function = motor_timer_func;
+
+	sd = &motor->subdev;
+	v4l2_spi_subdev_init(sd, spi, &motor_subdev_ops);
+	sd->entity.function = MEDIA_ENT_F_LENS;
+	sd->entity.flags = 0;
+	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
+	motor_initialize_controls(motor);
+	ret = media_entity_pads_init(&motor->subdev.entity, 0, NULL);
+	if (ret < 0)
+		goto err_free;
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(motor->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s_%d",
+		 motor->module_index, facing,
+		 DRIVER_NAME,
+		 motor->id);
+	ret = v4l2_async_register_subdev(sd);
+	if (ret)
+		dev_err(&spi->dev, "v4l2 async register subdev failed\n");
+#ifdef USED_SYS_DEBUG
+	add_sysfs_interfaces(dev);
+#endif
+	dev_info(&motor->spi->dev, "gpio motor driver probe success\n");
+	return 0;
+err_free:
+	v4l2_ctrl_handler_free(&motor->ctrl_handler);
+	v4l2_device_unregister_subdev(&motor->subdev);
+	media_entity_cleanup(&motor->subdev.entity);
+	return ret;
+}
+
+static int motor_dev_remove(struct spi_device *spi)
+{
+	struct v4l2_subdev *sd = spi_get_drvdata(spi);
+	struct motor_dev *motor = to_motor_dev(sd);
+
+	hrtimer_cancel(&motor->timer);
+	if (sd)
+		v4l2_device_unregister_subdev(sd);
+	v4l2_ctrl_handler_free(&motor->ctrl_handler);
+	media_entity_cleanup(&motor->subdev.entity);
+#ifdef USED_SYS_DEBUG
+	remove_sysfs_interfaces(&spi->dev);
+#endif
+	return 0;
+}
+
+static const struct spi_device_id motor_match_id[] = {
+	{"relmon,ms41908", 0 },
+	{ }
+};
+MODULE_DEVICE_TABLE(spi, motor_match_id);
+
+#if defined(CONFIG_OF)
+static const struct of_device_id motor_dev_of_match[] = {
+	{.compatible = "relmon,ms41908", },
+	{},
+};
+#endif
+
+static struct spi_driver motor_dev_driver = {
+	.driver = {
+		.name = DRIVER_NAME,
+		.of_match_table = of_match_ptr(motor_dev_of_match),
+	},
+	.probe		= &motor_dev_probe,
+	.remove		= &motor_dev_remove,
+	.id_table	= motor_match_id,
+};
+
+static int __init motor_mod_init(void)
+{
+	return spi_register_driver(&motor_dev_driver);
+}
+
+static void __exit motor_mod_exit(void)
+{
+	spi_unregister_driver(&motor_dev_driver);
+}
+
+device_initcall_sync(motor_mod_init);
+module_exit(motor_mod_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:motor");
+MODULE_AUTHOR("zefa.chen@rock-chips.com");

commit 4f4dc8f1f05877bae2560fb4430894f44cbdb4ef
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Thu May 27 14:47:33 2021 +0800

    include: uapi/linux/rk_vcm_head.h update to v0.2.0
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I07fbfd6f0c18845ae6d3557a5746b95aa7c96dbd

diff --git a/include/uapi/linux/rk_vcm_head.h b/include/uapi/linux/rk_vcm_head.h
index 97b9e48d9884..0fd2f42ad2b4 100644
--- a/include/uapi/linux/rk_vcm_head.h
+++ b/include/uapi/linux/rk_vcm_head.h
@@ -4,7 +4,7 @@
 #ifndef RK_VCM_HEAD_H
 #define RK_VCM_HEAD_H
 
-#define RK_VCM_HEAD_VERSION	KERNEL_VERSION(0, 0x01, 0x0)
+#define RK_VCM_HEAD_VERSION	KERNEL_VERSION(0, 0x02, 0x0)
 /*
  * Focus position values:
  * 65 logical positions ( 0 - 64 )
@@ -19,6 +19,7 @@
 #define OF_CAMERA_VCMDRV_DLC_ENABLE	"rockchip,vcm-dlc-enable"
 #define OF_CAMERA_VCMDRV_MCLK		"rockchip,vcm-mclk"
 #define OF_CAMERA_VCMDRV_T_SRC		"rockchip,vcm-t-src"
+#define VCMDRV_SETZOOM_MAXCNT	300U
 
 #define RK_VIDIOC_VCM_TIMEINFO \
 	_IOR('V', BASE_VIDIOC_PRIVATE + 0, struct rk_cam_vcm_tim)
@@ -39,6 +40,27 @@
 #define RK_VIDIOC_ZOOM_CORRECTION \
 	_IOR('V', BASE_VIDIOC_PRIVATE + 7, unsigned int)
 
+#define RK_VIDIOC_FOCUS_SET_BACKLASH \
+	_IOR('V', BASE_VIDIOC_PRIVATE + 8, unsigned int)
+#define RK_VIDIOC_IRIS_SET_BACKLASH \
+	_IOR('V', BASE_VIDIOC_PRIVATE + 9, unsigned int)
+#define RK_VIDIOC_ZOOM_SET_BACKLASH \
+	_IOR('V', BASE_VIDIOC_PRIVATE + 10, unsigned int)
+
+#define RK_VIDIOC_ZOOM1_TIMEINFO \
+	_IOR('V', BASE_VIDIOC_PRIVATE + 11, struct rk_cam_vcm_tim)
+#define RK_VIDIOC_ZOOM1_CORRECTION \
+	_IOR('V', BASE_VIDIOC_PRIVATE + 12, unsigned int)
+#define RK_VIDIOC_ZOOM1_SET_BACKLASH \
+	_IOR('V', BASE_VIDIOC_PRIVATE + 13, unsigned int)
+
+#define RK_VIDIOC_ZOOM_SET_POSITION \
+	_IOW('V', BASE_VIDIOC_PRIVATE + 14, struct rk_cam_set_zoom)
+#define RK_VIDIOC_FOCUS_SET_POSITION \
+	_IOW('V', BASE_VIDIOC_PRIVATE + 15, struct rk_cam_set_focus)
+#define RK_VIDIOC_MODIFY_POSITION \
+	_IOW('V', BASE_VIDIOC_PRIVATE + 16, struct rk_cam_modify_pos)
+
 #ifdef CONFIG_COMPAT
 #define RK_VIDIOC_COMPAT_VCM_TIMEINFO \
 	_IOR('V', BASE_VIDIOC_PRIVATE + 0, struct rk_cam_compat_vcm_tim)
@@ -46,8 +68,32 @@
 	_IOR('V', BASE_VIDIOC_PRIVATE + 1, struct rk_cam_compat_vcm_tim)
 #define RK_VIDIOC_COMPAT_ZOOM_TIMEINFO \
 	_IOR('V', BASE_VIDIOC_PRIVATE + 2, struct rk_cam_compat_vcm_tim)
+#define RK_VIDIOC_COMPAT_ZOOM1_TIMEINFO \
+	_IOR('V', BASE_VIDIOC_PRIVATE + 11, struct rk_cam_compat_vcm_tim)
 #endif
 
+struct rk_cam_modify_pos {
+	s32 focus_pos;
+	s32 zoom_pos;
+	s32 zoom1_pos;
+};
+
+struct rk_cam_set_focus {
+	bool is_need_reback;
+	s32 focus_pos;
+};
+
+struct rk_cam_zoom_pos {
+	s32 zoom_pos;
+	s32 focus_pos;
+};
+
+struct rk_cam_set_zoom {
+	bool is_need_reback;
+	u32 setzoom_cnt;
+	struct rk_cam_zoom_pos zoom_pos[VCMDRV_SETZOOM_MAXCNT];
+};
+
 struct rk_cam_vcm_tim {
 	struct timeval vcm_start_t;
 	struct timeval vcm_end_t;

commit caf0e14b16d6d3c9ecb2cdacb6b9a4f50605dfb5
Author: Huang zhibao <hzb@rock-chips.com>
Date:   Tue Jun 1 11:04:24 2021 +0800

    arm64: dts: rockchip: nvr: incluede rk3568-nvr-linux instead of rk3568-linux
    
    Signed-off-by: Huang zhibao <hzb@rock-chips.com>
    Change-Id: I954c67c806714e72043e9613e7fa13d1e04069cf

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10-linux-spi-nand.dts b/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10-linux-spi-nand.dts
index 235f232cff9c..50bd024528df 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10-linux-spi-nand.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10-linux-spi-nand.dts
@@ -6,7 +6,7 @@
 /dts-v1/;
 
 #include "rk3568-nvr-demo-v10.dtsi"
-#include "rk3568-linux.dtsi"
+#include "rk3568-nvr-linux.dtsi"
 
 / {
 	model = "Rockchip RK3568 NVR DEMO DDR4 V10 Linux SPI NAND Board";
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10-linux.dts b/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10-linux.dts
index d3e5a8bfa54a..3317db6ee671 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10-linux.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10-linux.dts
@@ -7,7 +7,7 @@
 /dts-v1/;
 
 #include "rk3568-nvr-demo-v10.dtsi"
-#include "rk3568-linux.dtsi"
+#include "rk3568-nvr-linux.dtsi"
 
 / {
 	model = "Rockchip RK3568 NVR DEMO DDR4 V10 Linux Board";
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v12-linux-spi-nand.dts b/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v12-linux-spi-nand.dts
index 88cff39ba1d4..de8c1a1e734f 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v12-linux-spi-nand.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v12-linux-spi-nand.dts
@@ -6,7 +6,7 @@
 /dts-v1/;
 
 #include "rk3568-nvr-demo-v12.dtsi"
-#include "rk3568-linux.dtsi"
+#include "rk3568-nvr-linux.dtsi"
 
 / {
 	model = "Rockchip RK3568 NVR DEMO DDR4 V12 Linux SPI NAND Board";
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v12-linux.dts b/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v12-linux.dts
index 996172e9d601..b605c3d57d26 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v12-linux.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v12-linux.dts
@@ -7,7 +7,7 @@
 /dts-v1/;
 
 #include "rk3568-nvr-demo-v12.dtsi"
-#include "rk3568-linux.dtsi"
+#include "rk3568-nvr-linux.dtsi"
 
 / {
 	model = "Rockchip RK3568 NVR DEMO DDR4 V12 Linux Board";
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-nvr-linux.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-nvr-linux.dtsi
new file mode 100644
index 000000000000..f9908b61cb41
--- /dev/null
+++ b/arch/arm64/boot/dts/rockchip/rk3568-nvr-linux.dtsi
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+/ {
+	chosen: chosen {
+		bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rw rootwait";
+	};
+
+	fiq-debugger {
+		compatible = "rockchip,fiq-debugger";
+		rockchip,serial-id = <2>;
+		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 252 IRQ_TYPE_LEVEL_LOW>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&uart2m0_xfer>;
+		status = "okay";
+	};
+
+	debug: debug@fd904000 {
+		compatible = "rockchip,debug";
+		reg = <0x0 0xfd904000 0x0 0x1000>,
+			<0x0 0xfd905000 0x0 0x1000>,
+			<0x0 0xfd906000 0x0 0x1000>,
+			<0x0 0xfd907000 0x0 0x1000>;
+	};
+
+	cspmu: cspmu@fd90c000 {
+		compatible = "rockchip,cspmu";
+		reg = <0x0 0xfd90c000 0x0 0x1000>,
+			<0x0 0xfd90d000 0x0 0x1000>,
+			<0x0 0xfd90e000 0x0 0x1000>,
+			<0x0 0xfd90f000 0x0 0x1000>;
+	};
+};
+
+&reserved_memory {
+	ramoops: ramoops@110000 {
+		compatible = "ramoops";
+		reg = <0x0 0x110000 0x0 0xf0000>;
+		record-size = <0x20000>;
+		console-size = <0x80000>;
+		ftrace-size = <0x00000>;
+		pmsg-size = <0x50000>;
+	};
+};
+
+&rng {
+	status = "okay";
+};

commit b5416435725904f86c7022ceba58e170fba5891d
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Tue Apr 20 16:05:19 2021 +0800

    drm/rockchip: disable output poll when shutdown
    
    we find sometimes hdmi will trigger a plugout irq when system
    shutdown, but actually it is connected, so when drm core run
    a connect->detect callback it will find the hdmi is on connected
    state, than run drm_fb_helper_hotplug_event, this drive all
    the drm system run again.
    
    But we are on the system shutdwon process, the running
    drm core may cause many problem.
    
    So we disable output poll to prevent drm_fb_helper_hotplug_event
    when system shutdown.
    
    And also the we should figure out why hdmi driver trigger the
    wrong plugout irq at shutdown process.
    
    Requesting system reboot
    [   26.466261] cpu cpu0: min=816000, max=816000
    [   26.476177] dwhdmi-rockchip fe0a0000.hdmi: dw hdmi plug out
    [   26.492452] rockchip_drm_platform_shutdown
    [   26.579331] dw-mipi-dsi fe060000.dsi: [drm:dw_mipi_dsi_transfer] *ERROR* generic write fifo is full
    [   26.580141] panel-simple-dsi fe060000.dsi.0: failed to write dcs cmd: -110
    [   26.581771] dw-mipi-dsi fe060000.dsi: [drm:dw_mipi_dsi_transfer] *ERROR* generic write fifo is full
    [   26.582577] panel-simple-dsi fe060000.dsi.0: failed to write dcs cmd: -110
    [   26.667890] rkisp_hw fdff0000.rkisp: rkisp_hw_shutdown
    [   26.675465] fan53555-regulator 0-001c: fan53555..... reset
    [   26.676891] fan53555-regulator 0-001c: reset: force fan53555_reset ok!
    [   26.677867] mpp_rkvdec2 fdf80200.rkvdec: shutdown device
    [   26.678381] mpp_jpgdec fded0000.jpegd: shutdown device
    [   26.678853] mpp-iep2 fdef0000.iep: shutdown device
    [   26.679288] mpp_vepu2 fdee0000.vepu: shutdown device
    [   26.679745] mpp_vdpu2 fdea0400.vdpu: shutdown device
    [   26.680201] mpp_rkvenc fdf40000.rkvenc: shutdown device
    [   26.680664] mpp_rkvenc fdf40000.rkvenc: shutdown success
    [   26.777723] rockchip_drm_output_poll_changed
    [   26.890773] rockchip-vop2 fe040000.vop: [drm:vop2_crtc_atomic_enable] Update mode to 1080x1920p60, type: 16 for vp1
    [   27.392083] rockchip-vop2 fe040000.vop: [drm:vop2_disable_all_planes_for_crtc] *ERROR* wait win close timeout
    [   27.393012] dw-mipi-dsi fe060000.dsi: [drm:dw_mipi_dsi_encoder_enable] final DSI-Link bandwidth: 880 x 4 Mbps
    
    Change-Id: Ib1454636b1b35bf310252ab9469a107fcbf7e37c
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index 3e906dce5311..7802d926753f 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -2230,8 +2230,10 @@ static void rockchip_drm_platform_shutdown(struct platform_device *pdev)
 {
 	struct drm_device *drm = platform_get_drvdata(pdev);
 
-	if (drm)
+	if (drm) {
+		drm_kms_helper_poll_fini(drm);
 		drm_atomic_helper_shutdown(drm);
+	}
 }
 
 static const struct of_device_id rockchip_drm_dt_ids[] = {
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
index 2adf1c678125..c00245d9f523 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
@@ -226,7 +226,7 @@ static void rockchip_drm_output_poll_changed(struct drm_device *dev)
 	struct rockchip_drm_private *private = dev->dev_private;
 	struct drm_fb_helper *fb_helper = private->fbdev_helper;
 
-	if (fb_helper && !private->loader_protect)
+	if (fb_helper && dev->mode_config.poll_enabled && !private->loader_protect)
 		drm_fb_helper_hotplug_event(fb_helper);
 }
 

commit 4231420df4301b5125764e9579b64fd54f1c6a82
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Tue Jun 1 19:09:19 2021 +0800

    drm/rockchip: vop2: Fix color key shift to 10bit
    
    Fixes: 8c59d20b75f0 ("drm/rockchip: vop2: Add color key support")
    Change-Id: I449f32eb9e69297b2c37feb85611a550310f2304
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index c394bd69a93e..b74c392a9069 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -2882,7 +2882,7 @@ static void vop2_plane_setup_color_key(struct drm_plane *plane)
 		break;
 	}
 
-	color_key = (r << 20) || (g << 10) || b;
+	color_key = (r << 20) | (g << 10) | b;
 	VOP_WIN_SET(vop2, win, color_key_en, color_key_en);
 	VOP_WIN_SET(vop2, win, color_key, color_key);
 }

commit 2b9f8eaf219962187cb4e30c24704c72b5b939c7
Author: Ding Wei <leo.ding@rock-chips.com>
Date:   Tue Jun 1 11:13:51 2021 +0800

    arm64: dts: rockchip: rk3568: Set rcb-min-with=512 on rkvdec2
    
    Change-Id: I0735307ea023517c731ed33387f5f074b0362841
    Signed-off-by: Ding Wei <leo.ding@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index e80b6800639b..fc3458987c4e 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -1515,6 +1515,7 @@
 		rockchip,sram = <&rkvdec_sram>;
 		/* rcb_iova: start and size */
 		rockchip,rcb-iova = <0x10000000 65536>;
+		rockchip,rcb-min-width = <512>;
 		status = "disabled";
 	};
 

commit 9cf57bf5c7d5e1e15eaf4ef3cc3cc97b2c3b0f47
Author: Ding Wei <leo.ding@rock-chips.com>
Date:   Tue Jun 1 10:58:03 2021 +0800

    video: rockchip: mpp: rkvdec2: add rcb-min-width info for rcb usage
    
    tips:
        for rk356x, when image width less than 512, it may occur very
    small probability for sram read and write.
    
    Change-Id: I57bdfeb776dc0762870f3d7a3a6d81a1c146240d
    Signed-off-by: Ding Wei <leo.ding@rock-chips.com>

diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2.c b/drivers/video/rockchip/mpp/mpp_rkvdec2.c
index 8bd58e67437f..f1a1307f1a0e 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvdec2.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec2.c
@@ -188,6 +188,7 @@ struct rkvdec2_dev {
 	u32 rcb_size;
 	dma_addr_t rcb_iova;
 	struct page *rcb_page;
+	u32 rcb_min_width;
 };
 
 /*
@@ -338,6 +339,10 @@ static int mpp_set_rcbbuf(struct mpp_dev *mpp,
 		int i;
 		u32 reg_idx, rcb_size, rcb_offset;
 		struct rkvdec2_rcb_info *rcb_inf = &priv->rcb_inf;
+		u32 width = priv->codec_info[DEC_INFO_WIDTH].val;
+
+		if (width < dec->rcb_min_width)
+			goto done;
 
 		rcb_offset = 0;
 		for (i = 0; i < rcb_inf->cnt; i++) {
@@ -353,7 +358,7 @@ static int mpp_set_rcbbuf(struct mpp_dev *mpp,
 			rcb_offset += rcb_size;
 		}
 	}
-
+done:
 	mpp_debug_leave();
 
 	return 0;
@@ -1070,9 +1075,14 @@ static int rkvdec2_alloc_rcbbuf(struct platform_device *pdev, struct rkvdec2_dev
 	dec->sram_size = sram_size;
 	dec->rcb_size = rcb_size;
 	dec->rcb_iova = iova;
-
-	dev_info(dev, "sram_start %pa, rcb_iova %pad, sram_size %u, rcb_size=%u\n",
-		 &sram_start, &dec->rcb_iova, dec->sram_size, dec->rcb_size);
+	dev_info(dev, "sram_start %pa\n", &sram_start);
+	dev_info(dev, "rcb_iova %pad\n", &dec->rcb_iova);
+	dev_info(dev, "sram_size %u\n", dec->sram_size);
+	dev_info(dev, "rcb_size %u\n", dec->rcb_size);
+
+	ret = of_property_read_u32(dev->of_node, "rockchip,rcb-min-width", &dec->rcb_min_width);
+	if (!ret && dec->rcb_min_width)
+		dev_info(dev, "min_width %u\n", dec->rcb_min_width);
 
 	return 0;
 

commit 014548c589633c38d728816f2679e4ed022c9434
Author: Huang zhibao <hzb@rock-chips.com>
Date:   Tue Jun 1 10:50:17 2021 +0800

    arm64: dts: rockchip: rk3568-nvr: io-domian all default set 3.3V for rk356x boards
    
    io-domian  default as:
    &pmu_io_domains {
        status = "okay";
        pmuio2-supply = <&vcc_3v3>;
        vccio1-supply = <&vcc_3v3>;
        vccio3-supply = <&vcc_3v3>;
        vccio4-supply = <&vcc_3v3>;
        vccio5-supply = <&vcc_3v3>;
        vccio6-supply = <&vcc_3v3>;
        vccio7-supply = <&vcc_3v3>;
    };
    TODO:
    Need to be modified according to the actual hardware
    for example rk3568-nvr-demo v10/V12 board:
    &pmu_io_domains {
        status = "okay";
        pmuio2-supply = <&vcc_3v3>;
        vccio1-supply = <&vcc_3v3>;
        vccio3-supply = <&vcc_3v3>;
        vccio4-supply = <&vcc_1v8>;
        vccio5-supply = <&vcc_3v3>;
        vccio6-supply = <&vcc_1v8>;
        vccio7-supply = <&vcc_3v3>;
    };
    
    Signed-off-by: Huang zhibao <hzb@rock-chips.com>
    Change-Id: I707ee8fbce7564db908ca0682c3ead5bf621f95e

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi
index fc66945c445d..7dd5524fddb6 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi
@@ -311,15 +311,15 @@
 	status = "okay";
 };
 
+/* Need to be modified according to the actual hardware */
 &pmu_io_domains {
 	status = "okay";
-	pmuio1-supply = <&vcc_3v3>;
 	pmuio2-supply = <&vcc_3v3>;
 	vccio1-supply = <&vcc_3v3>;
 	vccio3-supply = <&vcc_3v3>;
-	vccio4-supply = <&vcc_1v8>;
+	vccio4-supply = <&vcc_3v3>;
 	vccio5-supply = <&vcc_3v3>;
-	vccio6-supply = <&vcc_1v8>;
+	vccio6-supply = <&vcc_3v3>;
 	vccio7-supply = <&vcc_3v3>;
 };
 

commit 4faa44ee7f5b46d215cc5b8324e9054f5ee00f6c
Author: Huang zhibao <hzb@rock-chips.com>
Date:   Tue Jun 1 10:44:05 2021 +0800

    arm64: dts: rockchip: rk3566-box: io-domian all default set 3.3V for rk356x boards
    
    io-domian  default as:
    &pmu_io_domains {
        status = "okay";
        pmuio2-supply = <&vcc_3v3>;
        vccio1-supply = <&vcc_3v3>;
        vccio3-supply = <&vcc_3v3>;
        vccio4-supply = <&vcc_3v3>;
        vccio5-supply = <&vcc_3v3>;
        vccio6-supply = <&vcc_3v3>;
        vccio7-supply = <&vcc_3v3>;
    };
    TODO:
    Need to be modified according to the actual hardware
    for example rk3566-box-demo v10 board:
    &pmu_io_domains {
        status = "okay";
        pmuio2-supply = <&vcc_3v3>;
        vccio1-supply = <&vcc_3v3>;
        vccio3-supply = <&vcc_3v3>;
        vccio4-supply = <&vcc_1v8>;
        vccio5-supply = <&vcc_3v3>;
        vccio6-supply = <&vcc_1v8>;
        vccio7-supply = <&vcc_3v3>;
    };
    
    Signed-off-by: Huang zhibao <hzb@rock-chips.com>
    Change-Id: Ifda027a8ceb0bd9cb7ae34a6f0599100abc431b4

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-box-demo-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-box-demo-v10.dtsi
index 8d810a6c17c6..aee433bbb9ad 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-box-demo-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-box-demo-v10.dtsi
@@ -367,15 +367,15 @@
 	};
 };
 
+/* Need to be modified according to the actual hardware */
 &pmu_io_domains {
 	status = "okay";
-	pmuio1-supply = <&vcc_3v3>;
 	pmuio2-supply = <&vcc_3v3>;
 	vccio1-supply = <&vcc_3v3>;
 	vccio3-supply = <&vcc_3v3>;
-	vccio4-supply = <&vcc_1v8>;
+	vccio4-supply = <&vcc_3v3>;
 	vccio5-supply = <&vcc_3v3>;
-	vccio6-supply = <&vcc_1v8>;
+	vccio6-supply = <&vcc_3v3>;
 	vccio7-supply = <&vcc_3v3>;
 };
 

commit ab1a6c6c64b129eac13d9c656f3f36a8ed452b57
Author: Yiqing Zeng <zack.zeng@rock-chips.com>
Date:   Mon May 31 18:34:29 2021 +0800

    media: i2c: sc035hgs fix time sequence error when streaming on
    
    Signed-off-by: Yiqing Zeng <zack.zeng@rock-chips.com>
    Change-Id: Ic2363298f81d07a49dc3544473f55a5f08e05133

diff --git a/drivers/media/i2c/sc035hgs.c b/drivers/media/i2c/sc035hgs.c
index 8fd3f911eb3a..7d2dfac25c0e 100644
--- a/drivers/media/i2c/sc035hgs.c
+++ b/drivers/media/i2c/sc035hgs.c
@@ -5,6 +5,7 @@
  * Copyright (C) 2021 Fuzhou Rockchip Electronics Co., Ltd.
  *
  * V0.0X01.0X00 first version.
+ * V0.0X01.0X01 fix time sequence error when streaming on.
  */
 
 //#define DEBUG
@@ -25,7 +26,7 @@
 #include <media/v4l2-ctrls.h>
 #include <media/v4l2-subdev.h>
 
-#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x00)
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x01)
 
 #ifndef V4L2_CID_DIGITAL_GAIN
 #define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
@@ -127,7 +128,6 @@ struct sc035hgs {
 	struct v4l2_ctrl	*digi_gain;
 	struct v4l2_ctrl	*hblank;
 	struct v4l2_ctrl	*vblank;
-	struct v4l2_ctrl	*test_pattern;
 	struct mutex		mutex;
 	bool			streaming;
 	bool			power_on;
@@ -301,10 +301,6 @@ static const struct regval sc035hgs_640x480_120fps_1lane_regs[] = {
 	{0x598f, 0x17},
 	{0x36e9, 0x62},
 	{0x36f9, 0x62},
-	{0x0100, 0x01},
-	{0x4418, 0x08},
-	{0x363d, 0x10},
-	{0x4419, 0x80},
 	{REG_NULL, 0x00}
 };
 
@@ -554,7 +550,7 @@ static int sc035hgs_enable_test_pattern(struct sc035hgs *sc035hgs, u32 pattern)
 		val = SC035HGS_TEST_PATTERN_DISABLE;
 
 	return sc035hgs_write_reg(sc035hgs->client, SC035HGS_REG_TEST_PATTERN,
-				SC035HGS_REG_VALUE_08BIT, val);
+				  SC035HGS_REG_VALUE_08BIT, val);
 }
 
 static void sc035hgs_get_module_inf(struct sc035hgs *sc035hgs,
@@ -587,10 +583,12 @@ static long sc035hgs_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 		stream = *((u32 *)arg);
 		if (stream)
 			ret = sc035hgs_write_reg(sc035hgs->client, SC035HGS_REG_CTRL_MODE,
-				SC035HGS_REG_VALUE_08BIT, SC035HGS_MODE_STREAMING);
+						 SC035HGS_REG_VALUE_08BIT,
+						 SC035HGS_MODE_STREAMING);
 		else
 			ret = sc035hgs_write_reg(sc035hgs->client, SC035HGS_REG_CTRL_MODE,
-				SC035HGS_REG_VALUE_08BIT, SC035HGS_MODE_SW_STANDBY);
+						 SC035HGS_REG_VALUE_08BIT,
+						 SC035HGS_MODE_SW_STANDBY);
 		break;
 	default:
 		ret = -ENOIOCTLCMD;
@@ -700,40 +698,43 @@ static int sc035hgs_set_ctrl_gain(struct sc035hgs *sc035hgs, u32 a_gain)
 		coarse_dgain = 0x0f;
 	}
 
-	dev_dbg(dev, ">>>set fine_again = 0x%x, coarse_again = 0x%x, coarse_dgain=0x%x, fine_dgain=0x%x\n",
+	dev_dbg(dev, "set fine_again = 0x%x, coarse_again = 0x%x, coarse_dgain=0x%x, fine_dgain=0x%x\n",
 			fine_again, coarse_again, coarse_dgain, fine_dgain);
 
 	if (a_gain < 0x20)
-		ret = sc035hgs_write_array(sc035hgs->client, image_optimize_gain_1x_2x_regs);
+		ret = sc035hgs_write_array(sc035hgs->client,
+					   image_optimize_gain_1x_2x_regs);
 	else if (a_gain < 0x40)
-		ret |= sc035hgs_write_array(sc035hgs->client, image_optimize_gain_2x_4x_regs);
+		ret |= sc035hgs_write_array(sc035hgs->client,
+					    image_optimize_gain_2x_4x_regs);
 	else
-		ret |= sc035hgs_write_array(sc035hgs->client, image_optimize_regs);
+		ret |= sc035hgs_write_array(sc035hgs->client,
+					    image_optimize_regs);
 
 	ret |= sc035hgs_write_reg(sc035hgs->client,
-		SC035HGS_GROUP_HOLD,
-		SC035HGS_REG_VALUE_08BIT,
-		SC035HGS_GROUP_HOLD_START);
+				  SC035HGS_GROUP_HOLD,
+				  SC035HGS_REG_VALUE_08BIT,
+				  SC035HGS_GROUP_HOLD_START);
 	ret |= sc035hgs_write_reg(sc035hgs->client,
-		SC035HGS_REG_COARSE_AGAIN,
-		SC035HGS_REG_VALUE_08BIT,
-		coarse_again);
+				  SC035HGS_REG_COARSE_AGAIN,
+				  SC035HGS_REG_VALUE_08BIT,
+				  coarse_again);
 	ret |= sc035hgs_write_reg(sc035hgs->client,
-		SC035HGS_REG_FINE_AGAIN,
-		SC035HGS_REG_VALUE_08BIT,
-		fine_again);
+				  SC035HGS_REG_FINE_AGAIN,
+				  SC035HGS_REG_VALUE_08BIT,
+				  fine_again);
 	ret |= sc035hgs_write_reg(sc035hgs->client,
-		SC035HGS_REG_COARSE_DGAIN,
-		SC035HGS_REG_VALUE_08BIT,
-		coarse_dgain);
+				  SC035HGS_REG_COARSE_DGAIN,
+				  SC035HGS_REG_VALUE_08BIT,
+				  coarse_dgain);
 	ret |= sc035hgs_write_reg(sc035hgs->client,
-		SC035HGS_REG_FINE_DGAIN,
-		SC035HGS_REG_VALUE_08BIT,
-		fine_dgain);
+				  SC035HGS_REG_FINE_DGAIN,
+				  SC035HGS_REG_VALUE_08BIT,
+				  fine_dgain);
 	ret |= sc035hgs_write_reg(sc035hgs->client,
-		SC035HGS_GROUP_HOLD,
-		SC035HGS_REG_VALUE_08BIT,
-		SC035HGS_GROUP_HOLD_LUNCH);
+				  SC035HGS_GROUP_HOLD,
+				  SC035HGS_REG_VALUE_08BIT,
+				  SC035HGS_GROUP_HOLD_LUNCH);
 
 	return ret;
 }
@@ -742,10 +743,6 @@ static int __sc035hgs_start_stream(struct sc035hgs *sc035hgs)
 {
 	int ret;
 
-	ret = sc035hgs_write_array(sc035hgs->client, sc035hgs->cur_mode->reg_list);
-	if (ret)
-		return ret;
-
 	/* In case these controls are set before streaming */
 	mutex_unlock(&sc035hgs->mutex);
 	ret = v4l2_ctrl_handler_setup(&sc035hgs->ctrl_handler);
@@ -753,14 +750,27 @@ static int __sc035hgs_start_stream(struct sc035hgs *sc035hgs)
 	if (ret)
 		return ret;
 
-	return sc035hgs_write_reg(sc035hgs->client, SC035HGS_REG_CTRL_MODE,
-			SC035HGS_REG_VALUE_08BIT, SC035HGS_MODE_STREAMING);
+	ret = sc035hgs_write_reg(sc035hgs->client, SC035HGS_REG_CTRL_MODE,
+				 SC035HGS_REG_VALUE_08BIT, SC035HGS_MODE_STREAMING);
+
+	usleep_range(10 * 1000, 20 * 1000);
+
+	ret |= sc035hgs_write_reg(sc035hgs->client, 0x4418,
+				  SC035HGS_REG_VALUE_08BIT, 0x08);
+	ret |= sc035hgs_write_reg(sc035hgs->client, 0x363d,
+				  SC035HGS_REG_VALUE_08BIT, 0x10);
+	ret |= sc035hgs_write_reg(sc035hgs->client, 0x4419,
+				  SC035HGS_REG_VALUE_08BIT, 0x80);
+	if (ret)
+		return ret;
+
+	return ret;
 }
 
 static int __sc035hgs_stop_stream(struct sc035hgs *sc035hgs)
 {
 	return sc035hgs_write_reg(sc035hgs->client, SC035HGS_REG_CTRL_MODE,
-			SC035HGS_REG_VALUE_08BIT, SC035HGS_MODE_SW_STANDBY);
+				  SC035HGS_REG_VALUE_08BIT, SC035HGS_MODE_SW_STANDBY);
 }
 
 static int sc035hgs_s_stream(struct v4l2_subdev *sd, int on)
@@ -832,6 +842,12 @@ static int sc035hgs_s_power(struct v4l2_subdev *sd, int on)
 			goto unlock_and_return;
 		}
 
+		ret = sc035hgs_write_array(sc035hgs->client, sc035hgs->cur_mode->reg_list);
+		if (ret < 0) {
+			pm_runtime_put_noidle(&client->dev);
+			goto unlock_and_return;
+		}
+
 		sc035hgs->power_on = true;
 	} else {
 		pm_runtime_put(&client->dev);
@@ -940,7 +956,7 @@ static int sc035hgs_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
 #endif
 
 static int sc035hgs_g_mbus_config(struct v4l2_subdev *sd,
-				 struct v4l2_mbus_config *config)
+				  struct v4l2_mbus_config *config)
 {
 	u32 val = 0;
 
@@ -955,8 +971,8 @@ static int sc035hgs_g_mbus_config(struct v4l2_subdev *sd,
 }
 
 static int sc035hgs_enum_frame_interval(struct v4l2_subdev *sd,
-				      struct v4l2_subdev_pad_config *cfg,
-				      struct v4l2_subdev_frame_interval_enum *fie)
+					struct v4l2_subdev_pad_config *cfg,
+					struct v4l2_subdev_frame_interval_enum *fie)
 {
 	if (fie->index >= ARRAY_SIZE(supported_modes))
 		return -EINVAL;
@@ -1039,11 +1055,13 @@ static int sc035hgs_set_ctrl(struct v4l2_ctrl *ctrl)
 	case V4L2_CID_EXPOSURE:
 		dev_dbg(&client->dev, "set exposure 0x%x\n", ctrl->val);
 		ret = sc035hgs_write_reg(sc035hgs->client, SC035HGS_GROUP_HOLD,
-			SC035HGS_REG_VALUE_08BIT, SC035HGS_GROUP_HOLD_START);
+					 SC035HGS_REG_VALUE_08BIT,
+					 SC035HGS_GROUP_HOLD_START);
 		ret |= sc035hgs_write_reg(sc035hgs->client, SC035HGS_REG_EXPOSURE,
-			SC035HGS_REG_VALUE_16BIT, ctrl->val << 4);
+					  SC035HGS_REG_VALUE_16BIT, ctrl->val << 4);
 		ret |= sc035hgs_write_reg(sc035hgs->client, SC035HGS_GROUP_HOLD,
-			SC035HGS_REG_VALUE_08BIT, SC035HGS_GROUP_HOLD_LUNCH);
+					  SC035HGS_REG_VALUE_08BIT,
+					  SC035HGS_GROUP_HOLD_LUNCH);
 		break;
 	case V4L2_CID_ANALOGUE_GAIN:
 		dev_dbg(&client->dev, "set again 0x%x\n", ctrl->val);
@@ -1053,14 +1071,14 @@ static int sc035hgs_set_ctrl(struct v4l2_ctrl *ctrl)
 		vts = ctrl->val + sc035hgs->cur_mode->height;
 		dev_dbg(&client->dev, "set vts 0x%x\n", vts);
 		ret = sc035hgs_write_reg(sc035hgs->client, SC035HGS_REG_VTS,
-			SC035HGS_REG_VALUE_16BIT, vts);
+					 SC035HGS_REG_VALUE_16BIT, vts);
 		break;
 	case V4L2_CID_TEST_PATTERN:
 		ret = sc035hgs_enable_test_pattern(sc035hgs, ctrl->val);
 		break;
 	case V4L2_CID_HFLIP:
 		ret = sc035hgs_read_reg(sc035hgs->client, SC035HGS_REG_FLIP_MIRROR,
-			SC035HGS_REG_VALUE_08BIT, &val);
+					SC035HGS_REG_VALUE_08BIT, &val);
 		if (ret)
 			break;
 		if (ctrl->val)
@@ -1068,11 +1086,11 @@ static int sc035hgs_set_ctrl(struct v4l2_ctrl *ctrl)
 		else
 			val &= ~SC035HGS_MIRROR_MASK;
 		ret |= sc035hgs_write_reg(sc035hgs->client, SC035HGS_REG_FLIP_MIRROR,
-			SC035HGS_REG_VALUE_08BIT, val);
+					  SC035HGS_REG_VALUE_08BIT, val);
 		break;
 	case V4L2_CID_VFLIP:
 		ret = sc035hgs_read_reg(sc035hgs->client, SC035HGS_REG_FLIP_MIRROR,
-			SC035HGS_REG_VALUE_08BIT, &val);
+					SC035HGS_REG_VALUE_08BIT, &val);
 		if (ret)
 			break;
 		if (ctrl->val)
@@ -1080,7 +1098,7 @@ static int sc035hgs_set_ctrl(struct v4l2_ctrl *ctrl)
 		else
 			val &= ~SC035HGS_FLIP_MASK;
 		ret |= sc035hgs_write_reg(sc035hgs->client, SC035HGS_REG_FLIP_MIRROR,
-			SC035HGS_REG_VALUE_08BIT, val);
+					  SC035HGS_REG_VALUE_08BIT, val);
 		break;
 	default:
 		dev_warn(&client->dev, "%s Unhandled id:0x%x, val:0x%x\n",
@@ -1123,37 +1141,37 @@ static int sc035hgs_initialize_controls(struct sc035hgs *sc035hgs)
 
 	h_blank = mode->hts_def - mode->width;
 	sc035hgs->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
-				h_blank, h_blank, 1, h_blank);
+					     h_blank, h_blank, 1, h_blank);
 	if (sc035hgs->hblank)
 		sc035hgs->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
 
 	vblank_def = mode->vts_def - mode->height;
 	sc035hgs->vblank = v4l2_ctrl_new_std(handler, &sc035hgs_ctrl_ops,
-				V4L2_CID_VBLANK, vblank_def,
-				SC035HGS_VTS_MAX - mode->height,
-				1, vblank_def);
+					     V4L2_CID_VBLANK, vblank_def,
+					     SC035HGS_VTS_MAX - mode->height,
+					     1, vblank_def);
 
 	exposure_max = mode->vts_def - 6;
 	sc035hgs->exposure = v4l2_ctrl_new_std(handler, &sc035hgs_ctrl_ops,
-				V4L2_CID_EXPOSURE, SC035HGS_EXPOSURE_MIN,
-				exposure_max, SC035HGS_EXPOSURE_STEP,
-				mode->exp_def);
+					       V4L2_CID_EXPOSURE, SC035HGS_EXPOSURE_MIN,
+					       exposure_max, SC035HGS_EXPOSURE_STEP,
+					       mode->exp_def);
 
 	sc035hgs->anal_gain = v4l2_ctrl_new_std(handler, &sc035hgs_ctrl_ops,
-				V4L2_CID_ANALOGUE_GAIN, ANALOG_GAIN_MIN,
-				ANALOG_GAIN_MAX, ANALOG_GAIN_STEP,
-				ANALOG_GAIN_DEFAULT);
+						V4L2_CID_ANALOGUE_GAIN, ANALOG_GAIN_MIN,
+						ANALOG_GAIN_MAX, ANALOG_GAIN_STEP,
+						ANALOG_GAIN_DEFAULT);
 
-	sc035hgs->test_pattern = v4l2_ctrl_new_std_menu_items(handler,
-				&sc035hgs_ctrl_ops, V4L2_CID_TEST_PATTERN,
-				ARRAY_SIZE(sc035hgs_test_pattern_menu) - 1,
-				0, 0, sc035hgs_test_pattern_menu);
+	v4l2_ctrl_new_std_menu_items(handler, &sc035hgs_ctrl_ops,
+				     V4L2_CID_TEST_PATTERN,
+				     ARRAY_SIZE(sc035hgs_test_pattern_menu) - 1,
+				     0, 0, sc035hgs_test_pattern_menu);
 
 	v4l2_ctrl_new_std(handler, &sc035hgs_ctrl_ops,
-					   V4L2_CID_HFLIP, 0, 1, 1, 0);
+			  V4L2_CID_HFLIP, 0, 1, 1, 0);
 
 	v4l2_ctrl_new_std(handler, &sc035hgs_ctrl_ops,
-					   V4L2_CID_VFLIP, 0, 1, 1, 0);
+			  V4L2_CID_VFLIP, 0, 1, 1, 0);
 
 	if (handler->error) {
 		ret = handler->error;
@@ -1180,7 +1198,7 @@ static int sc035hgs_check_sensor_id(struct sc035hgs *sc035hgs,
 	int ret;
 
 	ret = sc035hgs_read_reg(client, SC035HGS_REG_CHIP_ID,
-			      SC035HGS_REG_VALUE_24BIT, &id);
+				SC035HGS_REG_VALUE_24BIT, &id);
 	if (id != CHIP_ID) {
 		dev_err(dev, "Unexpected sensor id(%04x), ret(%d)\n", id, ret);
 		return -ENODEV;

commit a2367b28c41b5c61aef583fcb440ca2532e31c5f
Author: Finley Xiao <finley.xiao@rock-chips.com>
Date:   Mon May 17 10:40:23 2021 +0800

    ARM: dts: rv1126: Modify pvtm voltage table for CPU and NPU
    
    In order to improve stability for CPU and NPU.
    
    Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
    Change-Id: I2934ce2a0ceb9fd8816b0e4711e40c800348f040

diff --git a/arch/arm/boot/dts/rv1126.dtsi b/arch/arm/boot/dts/rv1126.dtsi
index c0b9bb304066..ebf06e4177c8 100644
--- a/arch/arm/boot/dts/rv1126.dtsi
+++ b/arch/arm/boot/dts/rv1126.dtsi
@@ -132,10 +132,9 @@
 			1	0
 		>;
 		rockchip,pvtm-voltage-sel = <
-			0        100500   1
-			100501   104500   2
-			104501   109500   3
-			109501   999999   4
+			0        106000   1
+			106001   112000   2
+			112001   999999   3
 		>;
 		rockchip,pvtm-freq = <408000>;
 		rockchip,pvtm-volt = <800000>;
@@ -173,7 +172,6 @@
 			opp-microvolt-L1 = <775000 775000 1000000>;
 			opp-microvolt-L2 = <775000 775000 1000000>;
 			opp-microvolt-L3 = <750000 750000 1000000>;
-			opp-microvolt-L4 = <725000 725000 1000000>;
 			clock-latency-ns = <40000>;
 		};
 		opp-1200000000 {
@@ -183,7 +181,6 @@
 			opp-microvolt-L1 = <850000 850000 1000000>;
 			opp-microvolt-L2 = <850000 850000 1000000>;
 			opp-microvolt-L3 = <825000 825000 1000000>;
-			opp-microvolt-L4 = <800000 800000 1000000>;
 			clock-latency-ns = <40000>;
 		};
 		opp-1296000000 {
@@ -192,7 +189,6 @@
 			opp-microvolt-L1 = <875000 875000 1000000>;
 			opp-microvolt-L2 = <875000 875000 1000000>;
 			opp-microvolt-L3 = <850000 850000 1000000>;
-			opp-microvolt-L4 = <825000 825000 1000000>;
 			clock-latency-ns = <40000>;
 		};
 		opp-1416000000 {
@@ -201,7 +197,6 @@
 			opp-microvolt-L1 = <925000 925000 1000000>;
 			opp-microvolt-L2 = <925000 925000 1000000>;
 			opp-microvolt-L3 = <900000 900000 1000000>;
-			opp-microvolt-L4 = <875000 875000 1000000>;
 			clock-latency-ns = <40000>;
 		};
 		opp-1512000000 {
@@ -210,7 +205,6 @@
 			opp-microvolt-L1 = <975000 975000 1000000>;
 			opp-microvolt-L2 = <950000 950000 1000000>;
 			opp-microvolt-L3 = <925000 925000 1000000>;
-			opp-microvolt-L4 = <900000 900000 1000000>;
 			clock-latency-ns = <40000>;
 		};
 	};
@@ -2454,9 +2448,9 @@
 			2	0
 		>;
 		rockchip,pvtm-voltage-sel = <
-			0        108500   1
-			108501   113500   2
-			113501   999999   3
+			0        112500   1
+			112501   117500   2
+			117501   999999   3
 		>;
 		rockchip,pvtm-freq = <396000>;
 		rockchip,pvtm-volt = <800000>;

commit 63c22fafe59fb757e152654ca8abb5f09140503d
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Tue Jun 1 09:33:59 2021 +0800

    drm/rockchip: ebc_dev: release version v1.14
    
    1.add EPD_OVERLAY_WHITE mode to support draw white line
    2.add EPD_FORCE_FULL mode which can be used under overlay mode
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: I6d4d3f12fe4e100904f181588bc51d5147fd8453

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c b/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
index 17ff91d36639..9e157cc1e946 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
+++ b/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
@@ -83,7 +83,9 @@ int ebc_add_to_dsp_buf_list(struct ebc_buf_s *dsp_buf)
 		case EPD_RESUME:
 		case EPD_POWER_OFF:
 		case EPD_OVERLAY:
+		case EPD_OVERLAY_WHITE:
 		case EPD_RESET:
+		case EPD_FORCE_FULL:
 			break;
 
 		default:
@@ -91,24 +93,11 @@ int ebc_add_to_dsp_buf_list(struct ebc_buf_s *dsp_buf)
 				temp_pos = ebc_buf_info.dsp_buf_list->nb_elt;
 				while (--temp_pos) {
 					temp_buf = (struct ebc_buf_s *)buf_list_get(ebc_buf_info.dsp_buf_list, temp_pos);
-					if ((temp_buf->buf_mode != EPD_FULL_GC16) &&
-					    (temp_buf->buf_mode != EPD_FULL_GL16) &&
-					    (temp_buf->buf_mode != EPD_FULL_GLR16) &&
-					    (temp_buf->buf_mode != EPD_FULL_GLD16) &&
-					    (temp_buf->buf_mode != EPD_FULL_GCC16) &&
-					    (temp_buf->buf_mode != EPD_OVERLAY) &&
-					    (temp_buf->buf_mode != EPD_DU) &&
-					    (temp_buf->buf_mode != EPD_SUSPEND) &&
-					    (temp_buf->buf_mode != EPD_RESUME) &&
-					    (temp_buf->buf_mode != EPD_POWER_OFF)) {
+					if ((temp_buf->buf_mode >= EPD_PART_GC16) && (temp_buf->buf_mode <= EPD_A2)) {
 						buf_list_remove(ebc_buf_info.dsp_buf_list, temp_pos);
 						ebc_buf_release(temp_buf);
-					} else if ((1 == is_full_mode) &&
-						   (temp_buf->buf_mode != EPD_DU) &&
-						   (temp_buf->buf_mode != EPD_OVERLAY) &&
-						   (temp_buf->buf_mode != EPD_SUSPEND) &&
-						   (temp_buf->buf_mode != EPD_RESUME) &&
-						   (temp_buf->buf_mode != EPD_POWER_OFF)) {
+					} else if ((1 == is_full_mode) && (temp_buf->buf_mode >= EPD_FULL_GC16)
+						   && (temp_buf->buf_mode <= EPD_FULL_GCC16)) {
 						buf_list_remove(ebc_buf_info.dsp_buf_list, temp_pos);
 						ebc_buf_release(temp_buf);
 					} else {
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
index c0a5d2c77edf..da257ee213c8 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
@@ -75,6 +75,8 @@ enum panel_refresh_mode {
 	EPD_SUSPEND		= 15,
 	EPD_RESUME		= 16,
 	EPD_POWER_OFF		= 17,
+	EPD_OVERLAY_WHITE	= 18,
+	EPD_FORCE_FULL		= 19,
 };
 
 /*
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index b1ba882345c1..78d2e5313f28 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -23,25 +23,25 @@ __initcall_ebc_init6s:
 get_auto_image:
 .LFB2809:
 	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
-	.loc 1 338 0
+	.loc 1 330 0
 	.cfi_startproc
 .LVL0:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 339 0
+	.loc 1 331 0
 	adrp	x5, .LANCHOR0
-	.loc 1 338 0
+	.loc 1 330 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 339 0
+	.loc 1 331 0
 	ldr	x15, [x5, #:lo12:.LANCHOR0]
-	.loc 1 338 0
+	.loc 1 330 0
 	stp	x19, x20, [sp, 16]
-	.loc 1 351 0
+	.loc 1 343 0
 	add	x15, x15, 24
-	.loc 1 338 0
+	.loc 1 330 0
 	stp	x21, x22, [sp, 32]
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 19, -48
@@ -50,17 +50,17 @@ get_auto_image:
 	.cfi_offset 22, -24
 	.cfi_offset 23, -16
 	.cfi_offset 24, -8
-	.loc 1 347 0
+	.loc 1 339 0
 	ldrb	w13, [x4, 32]
 .LVL1:
-	.loc 1 355 0
+	.loc 1 347 0
 	ldp	w11, w18, [x15, 84]
-	.loc 1 351 0
+	.loc 1 343 0
 	ldr	w30, [x15, 156]
-	.loc 1 357 0
+	.loc 1 349 0
 	str	wzr, [x4, 36]
 .LVL2:
-	.loc 1 363 0
+	.loc 1 355 0
 	cmp	w18, 0
 	ble	.L1
 	lsr	w11, w11, 4
@@ -68,7 +68,7 @@ get_auto_image:
 	mov	w14, 0
 .LVL4:
 	sub	w17, w11, #1
-	.loc 1 373 0
+	.loc 1 365 0
 	mov	w12, 1
 	add	x17, x17, 1
 .LBB916:
@@ -81,9 +81,9 @@ get_auto_image:
 .L31:
 .LBE917:
 .LBE916:
-	.loc 1 364 0
+	.loc 1 356 0
 	cbz	w30, .L3
-	.loc 1 365 0
+	.loc 1 357 0
 	ldp	w5, w9, [x15, 84]
 .LVL6:
 	sub	w9, w9, #1
@@ -95,31 +95,31 @@ get_auto_image:
 .L6:
 	add	x9, x9, 4
 .LVL8:
-	.loc 1 369 0 discriminator 1
+	.loc 1 361 0 discriminator 1
 	mov	x7, 0
 	cbnz	w11, .L65
 	b	.L5
 	.p2align 3
 .L72:
-	.loc 1 373 0
+	.loc 1 365 0
 	str	w12, [x4, 36]
-	.loc 1 375 0
+	.loc 1 367 0
 	ldr	x8, [x4, 112]
 .LVL9:
-	.loc 1 374 0
+	.loc 1 366 0
 	ldrb	w19, [x3, x7]
-	.loc 1 376 0
+	.loc 1 368 0
 	add	w20, w19, 1
 	and	w20, w20, 255
-	.loc 1 375 0
+	.loc 1 367 0
 	ubfiz	x19, x19, 16, 8
 	add	x8, x8, x19
 .LVL10:
-	.loc 1 377 0
+	.loc 1 369 0
 	cmp	w13, w20
 	beq	.L70
 .L8:
-	.loc 1 382 0
+	.loc 1 374 0
 	and	w22, w6, 65535
 	and	w21, w5, 65535
 .LVL11:
@@ -174,9 +174,9 @@ get_auto_image:
 .L9:
 .LBE920:
 .LBE919:
-	.loc 1 382 0
+	.loc 1 374 0
 	strb	w19, [x9, -4]
-	.loc 1 383 0
+	.loc 1 375 0
 	lsr	w22, w6, 16
 	lsr	w21, w5, 16
 .LBB921:
@@ -230,9 +230,9 @@ get_auto_image:
 .L14:
 .LBE922:
 .LBE921:
-	.loc 1 383 0
+	.loc 1 375 0
 	strb	w19, [x9, -3]
-	.loc 1 384 0
+	.loc 1 376 0
 	ubfx	x22, x6, 32, 16
 	ubfx	x21, x5, 32, 16
 .LBB923:
@@ -286,9 +286,9 @@ get_auto_image:
 .L19:
 .LBE924:
 .LBE923:
-	.loc 1 384 0
+	.loc 1 376 0
 	strb	w19, [x9, -2]
-	.loc 1 385 0
+	.loc 1 377 0
 	lsr	x6, x6, 48
 .LVL18:
 	lsr	x5, x5, 48
@@ -345,29 +345,29 @@ get_auto_image:
 .L24:
 .LBE918:
 .LBE925:
-	.loc 1 385 0
+	.loc 1 377 0
 	strb	w19, [x9, -1]
 	add	x9, x9, 4
-	.loc 1 386 0
+	.loc 1 378 0
 	strb	w20, [x3, x7]
 	add	x7, x7, 1
-	.loc 1 369 0
+	.loc 1 361 0
 	cmp	w11, w7
 	ble	.L71
 .LVL23:
 .L65:
-	.loc 1 370 0
+	.loc 1 362 0
 	ldr	x5, [x1, x7, lsl 3]
-	.loc 1 371 0
+	.loc 1 363 0
 	ldr	x6, [x2, x7, lsl 3]
-	.loc 1 372 0
+	.loc 1 364 0
 	cmp	x5, x6
 	bne	.L72
-	.loc 1 389 0
+	.loc 1 381 0
 	str	wzr, [x9, -4]
 	add	x7, x7, 1
 	add	x9, x9, 4
-	.loc 1 369 0
+	.loc 1 361 0
 	cmp	w11, w7
 	bgt	.L65
 .L71:
@@ -377,12 +377,12 @@ get_auto_image:
 	add	x1, x1, x16
 .LVL25:
 .L5:
-	.loc 1 363 0 discriminator 2
+	.loc 1 355 0 discriminator 2
 	add	w14, w14, 1
 	cmp	w18, w14
 	bne	.L31
 .L1:
-	.loc 1 398 0
+	.loc 1 390 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 .LVL26:
@@ -404,14 +404,14 @@ get_auto_image:
 	.p2align 3
 .L70:
 	.cfi_restore_state
-	.loc 1 379 0
+	.loc 1 371 0
 	str	x5, [x2, x7, lsl 3]
-	.loc 1 378 0
+	.loc 1 370 0
 	mov	w20, 0
 	b	.L8
 	.p2align 3
 .L3:
-	.loc 1 367 0
+	.loc 1 359 0
 	ldr	w9, [x15, 84]
 	mul	w9, w14, w9
 	lsr	w9, w9, 2
@@ -426,15 +426,15 @@ get_auto_image:
 	.type	ebc_open, %function
 ebc_open:
 .LFB2826:
-	.loc 1 1419 0
+	.loc 1 1424 0
 	.cfi_startproc
 .LVL30:
-	.loc 1 1423 0
+	.loc 1 1428 0
 	mov	w0, 0
 .LVL31:
-	.loc 1 1420 0
+	.loc 1 1425 0
 	str	xzr, [x1, 104]
-	.loc 1 1423 0
+	.loc 1 1428 0
 	ret
 	.cfi_endproc
 .LFE2826:
@@ -444,22 +444,22 @@ ebc_open:
 	.type	ebc_exit, %function
 ebc_exit:
 .LFB2845:
-	.loc 1 1965 0
+	.loc 1 1970 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1966 0
+	.loc 1 1971 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 1965 0
+	.loc 1 1970 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1966 0
+	.loc 1 1971 0
 	bl	platform_driver_unregister
 .LVL32:
-	.loc 1 1967 0
+	.loc 1 1972 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -474,7 +474,7 @@ ebc_exit:
 	.type	ebc_resume, %function
 ebc_resume:
 .LFB2843:
-	.loc 1 1927 0
+	.loc 1 1932 0
 	.cfi_startproc
 .LVL33:
 	stp	x29, x30, [sp, -32]!
@@ -492,7 +492,7 @@ ebc_resume:
 	ldr	x19, [x0, 184]
 .LBE927:
 .LBE926:
-	.loc 1 1931 0
+	.loc 1 1936 0
 	ldr	x1, [x19, 16]
 .LBB928:
 .LBB929:
@@ -505,15 +505,15 @@ ebc_resume:
 .LVL35:
 .LBE929:
 .LBE928:
-	.loc 1 1932 0
+	.loc 1 1937 0
 	str	wzr, [x19, 788]
-	.loc 1 1933 0
+	.loc 1 1938 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
 .LVL36:
-	.loc 1 1936 0
+	.loc 1 1941 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -530,20 +530,20 @@ ebc_resume:
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
 .LFB2821:
-	.loc 1 1118 0
+	.loc 1 1123 0
 	.cfi_startproc
 .LVL37:
-	.loc 1 1119 0
+	.loc 1 1124 0
 	adrp	x0, .LANCHOR0
 .LVL38:
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1121 0
+	.loc 1 1126 0
 	ldr	w2, [x0, 616]
 	cbnz	w2, .L87
 	ret
 	.p2align 3
 .L87:
-	.loc 1 1118 0
+	.loc 1 1123 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -555,10 +555,10 @@ ebc_vdd_power_timeout:
 	add	x0, x0, 408
 .LBE931:
 .LBE930:
-	.loc 1 1118 0
+	.loc 1 1123 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1122 0
+	.loc 1 1127 0
 	str	wzr, [x0, 208]
 .LBB933:
 .LBB932:
@@ -567,7 +567,7 @@ ebc_vdd_power_timeout:
 .LVL39:
 .LBE932:
 .LBE933:
-	.loc 1 1127 0
+	.loc 1 1132 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -581,27 +581,27 @@ ebc_vdd_power_timeout:
 	.type	ebc_remove, %function
 ebc_remove:
 .LFB2841:
-	.loc 1 1903 0
+	.loc 1 1908 0
 	.cfi_startproc
 .LVL40:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1904 0
+	.loc 1 1909 0
 	adrp	x0, .LANCHOR1
 .LVL41:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 1903 0
+	.loc 1 1908 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1904 0
+	.loc 1 1909 0
 	add	x0, x0, 224
-	.loc 1 1903 0
-	.loc 1 1904 0
+	.loc 1 1908 0
+	.loc 1 1909 0
 	bl	misc_deregister
 .LVL42:
-	.loc 1 1907 0
+	.loc 1 1912 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -616,7 +616,7 @@ ebc_remove:
 	.type	ebc_mmap, %function
 ebc_mmap:
 .LFB2825:
-	.loc 1 1404 0
+	.loc 1 1409 0
 	.cfi_startproc
 .LVL43:
 	stp	x29, x30, [sp, -32]!
@@ -627,33 +627,33 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1404 0
+	.loc 1 1409 0
 	mov	x19, x1
-	.loc 1 1407 0
+	.loc 1 1412 0
 	bl	ebc_phy_buf_base_get
 .LVL44:
-	.loc 1 1410 0
+	.loc 1 1415 0
 	lsr	x2, x0, 12
-	.loc 1 1408 0
+	.loc 1 1413 0
 	mov	x6, 16384
-	.loc 1 1410 0
+	.loc 1 1415 0
 	mov	x0, x19
-	.loc 1 1408 0
+	.loc 1 1413 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 1410 0
+	.loc 1 1415 0
 	ldp	x1, x3, [x19]
-	.loc 1 1408 0
+	.loc 1 1413 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 1410 0
+	.loc 1 1415 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
 .LVL45:
-	.loc 1 1413 0
+	.loc 1 1418 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 1416 0
+	.loc 1 1421 0
 	ldr	x19, [sp, 16]
 .LVL46:
 	csel	w0, w0, w1, eq
@@ -671,16 +671,16 @@ ebc_mmap:
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
 .LFB2824:
-	.loc 1 1203 0
+	.loc 1 1208 0
 	.cfi_startproc
 .LVL47:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 1213 0
+	.loc 1 1218 0
 	cmp	w1, 28672
-	.loc 1 1203 0
+	.loc 1 1208 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -694,15 +694,15 @@ ebc_io_ctl:
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
 	.cfi_offset 23, -112
-	.loc 1 1203 0
+	.loc 1 1208 0
 	mov	x21, x2
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 1205 0
+	.loc 1 1210 0
 	adrp	x0, .LANCHOR0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1213 0
+	.loc 1 1218 0
 	bcc	.L95
 	mov	w0, 28675
 	cmp	w1, w0
@@ -712,7 +712,7 @@ ebc_io_ctl:
 	cmp	w0, 1
 	bls	.L96
 .L95:
-	.loc 1 1229 0
+	.loc 1 1234 0
 	mov	w0, 28677
 	cmp	w1, w0
 	beq	.L99
@@ -728,13 +728,13 @@ ebc_io_ctl:
 	mov	w0, 28683
 	cmp	w1, w0
 	bne	.L98
-	.loc 1 1381 0
+	.loc 1 1386 0
 	bl	ebc_empty_buf_get
 .LVL49:
 	mov	x23, x0
-	.loc 1 1382 0
+	.loc 1 1387 0
 	cbz	x0, .L119
-	.loc 1 1384 0
+	.loc 1 1389 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 336]
@@ -744,7 +744,7 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL50:
-	.loc 1 1385 0
+	.loc 1 1390 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL51:
@@ -774,11 +774,11 @@ ebc_io_ctl:
 .LBE936:
 .LBE935:
 .LBE934:
-	.loc 1 1387 0
+	.loc 1 1392 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 1386 0
+	.loc 1 1391 0
 	str	w0, [x29, 104]
-	.loc 1 1388 0
+	.loc 1 1393 0
 	stp	w4, w1, [x29, 112]
 .LBB965:
 .LBB962:
@@ -807,7 +807,7 @@ ebc_io_ctl:
 .LBE959:
 .LBE962:
 .LBE965:
-	.loc 1 1204 0
+	.loc 1 1209 0
 	mov	x0, x21
 .LVL56:
 .LBB966:
@@ -855,36 +855,36 @@ ebc_io_ctl:
 .LBE960:
 .LBE963:
 .LBE966:
-	.loc 1 1390 0
+	.loc 1 1395 0
 	mov	x0, x23
 .LVL61:
 	bl	ebc_buf_release
 .LVL62:
-	.loc 1 1391 0
+	.loc 1 1396 0
 	b	.L94
 .LVL63:
 	.p2align 3
 .L96:
-	.loc 1 1220 0
+	.loc 1 1225 0
 	cbnz	x21, .L95
-	.loc 1 1221 0
+	.loc 1 1226 0
 	ldr	x0, [x20, 272]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
 .LVL64:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC1
-	.loc 1 1222 0
+	.loc 1 1227 0
 	mov	x22, -14
-	.loc 1 1221 0
+	.loc 1 1226 0
 	bl	_dev_err
 .LVL65:
-	.loc 1 1222 0
+	.loc 1 1227 0
 	b	.L94
 .LVL66:
 	.p2align 3
 .L228:
-	.loc 1 1229 0
+	.loc 1 1234 0
 	mov	w0, 28674
 	cmp	w1, w0
 	beq	.L101
@@ -895,23 +895,23 @@ ebc_io_ctl:
 	mov	w0, 28676
 	cmp	w1, w0
 	bne	.L98
-	.loc 1 1313 0
+	.loc 1 1318 0
 	ldr	x0, [x20, 272]
-	.loc 1 1312 0
+	.loc 1 1317 0
 	mov	w2, 1
 	str	w2, [x20, 796]
-	.loc 1 1313 0
+	.loc 1 1318 0
 	adrp	x1, .LC2
 .LVL67:
-	.loc 1 1314 0
+	.loc 1 1319 0
 	mov	x22, 0
-	.loc 1 1313 0
+	.loc 1 1318 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
 .LVL68:
 	.p2align 2
 .L94:
-	.loc 1 1401 0
+	.loc 1 1406 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
 .LVL69:
@@ -939,7 +939,7 @@ ebc_io_ctl:
 	.p2align 3
 .L231:
 	.cfi_restore_state
-	.loc 1 1229 0
+	.loc 1 1234 0
 	cmp	w1, 28672
 	beq	.L103
 	mov	w0, 28673
@@ -1053,53 +1053,53 @@ ebc_io_ctl:
 .LBE969:
 .LBE968:
 .LBE967:
-	.loc 1 1267 0
+	.loc 1 1272 0
 	bl	ebc_phy_buf_base_get
 .LVL85:
 	ldrsw	x1, [x29, 104]
-	.loc 1 1268 0
+	.loc 1 1273 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
 .LVL86:
 	mov	x21, x0
 .LVL87:
-	.loc 1 1269 0
+	.loc 1 1274 0
 	cbz	x0, .L134
-	.loc 1 1270 0
+	.loc 1 1275 0
 	ldr	w5, [x29, 108]
-	.loc 1 1279 0
+	.loc 1 1284 0
 	add	x20, x20, 184
-	.loc 1 1274 0
+	.loc 1 1279 0
 	ldp	w4, w2, [x29, 124]
-	.loc 1 1270 0
-	str	w5, [x21, 40]
 	.loc 1 1275 0
+	str	w5, [x21, 40]
+	.loc 1 1280 0
 	ldp	w3, w1, [x29, 132]
-	.loc 1 1274 0
+	.loc 1 1279 0
 	stp	w4, w2, [x21, 48]
-	.loc 1 1275 0
+	.loc 1 1280 0
 	stp	w3, w1, [x21, 56]
-	.loc 1 1277 0
+	.loc 1 1282 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL88:
-	.loc 1 1279 0
+	.loc 1 1284 0
 	ldr	w0, [x20, 80]
 	cbz	w0, .L234
 .L129:
-	.loc 1 1283 0
+	.loc 1 1288 0
 	ldr	w0, [x21, 40]
 	cmp	w0, 15
 	beq	.L235
-	.loc 1 1283 0 is_stmt 0 discriminator 3
+	.loc 1 1288 0 is_stmt 0 discriminator 3
 	cmp	w0, 17
 	bne	.L134
 .L131:
-	.loc 1 1284 0 is_stmt 1
+	.loc 1 1289 0 is_stmt 1
 	mov	w0, 1
 	str	w0, [x20, 196]
 .LBB996:
 .LBB997:
-	.loc 1 1285 0
+	.loc 1 1290 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
@@ -1112,13 +1112,13 @@ ebc_io_ctl:
 	.p2align 3
 .L236:
 .LVL90:
-	.loc 1 1285 0 is_stmt 0 discriminator 5
+	.loc 1 1290 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L134
-	.loc 1 1285 0 discriminator 7
+	.loc 1 1290 0 discriminator 7
 	bl	schedule
 .LVL91:
 .L135:
-	.loc 1 1285 0 discriminator 9
+	.loc 1 1290 0 discriminator 9
 	add	x1, x29, 64
 	mov	w2, 1
 	mov	x0, x21
@@ -1127,7 +1127,7 @@ ebc_io_ctl:
 	ldr	w1, [x20, 196]
 	cbnz	w1, .L236
 .LBE998:
-	.loc 1 1285 0 discriminator 4
+	.loc 1 1290 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
 	bl	finish_wait
@@ -1141,13 +1141,13 @@ ebc_io_ctl:
 .L111:
 .LBE997:
 .LBE996:
-	.loc 1 1368 0 is_stmt 1
+	.loc 1 1373 0 is_stmt 1
 	bl	ebc_empty_buf_get
 .LVL95:
 	mov	x23, x0
-	.loc 1 1369 0
+	.loc 1 1374 0
 	cbz	x0, .L119
-	.loc 1 1371 0
+	.loc 1 1376 0
 	add	x22, x20, 24
 	ldr	x1, [x20, 328]
 	ldp	w2, w3, [x20, 108]
@@ -1155,7 +1155,7 @@ ebc_io_ctl:
 .LVL96:
 	.p2align 3
 .L229:
-	.loc 1 1229 0
+	.loc 1 1234 0
 	mov	w0, 28678
 	cmp	w1, w0
 	beq	.L109
@@ -1270,36 +1270,36 @@ ebc_io_ctl:
 .LBE1004:
 .LBE1003:
 .LBE1002:
-	.loc 1 1294 0
+	.loc 1 1299 0
 	bl	ebc_osd_buf_clone
 .LVL109:
 	mov	x1, x0
-	.loc 1 1295 0
+	.loc 1 1300 0
 	cbz	x0, .L134
-	.loc 1 1296 0
+	.loc 1 1301 0
 	ldr	w6, [x29, 108]
-	.loc 1 1305 0
+	.loc 1 1310 0
 	add	x20, x20, 184
-	.loc 1 1300 0
+	.loc 1 1305 0
 	ldp	w5, w3, [x29, 124]
-	.loc 1 1296 0
-	str	w6, [x1, 40]
 	.loc 1 1301 0
+	str	w6, [x1, 40]
+	.loc 1 1306 0
 	ldp	w4, w2, [x29, 132]
-	.loc 1 1300 0
+	.loc 1 1305 0
 	stp	w5, w3, [x1, 48]
-	.loc 1 1301 0
+	.loc 1 1306 0
 	stp	w4, w2, [x1, 56]
-	.loc 1 1303 0
+	.loc 1 1308 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL110:
-	.loc 1 1305 0
+	.loc 1 1310 0
 	ldr	w0, [x20, 80]
 	cbnz	w0, .L134
-	.loc 1 1306 0
+	.loc 1 1311 0
 	mov	w2, 1
 	str	w2, [x20, 80]
-	.loc 1 1307 0
+	.loc 1 1312 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -1372,12 +1372,12 @@ ebc_io_ctl:
 .LBE961:
 .LBE964:
 .LBE1031:
-	.loc 1 1231 0
+	.loc 1 1236 0
 	bl	ebc_osd_buf_get
 .LVL121:
-	.loc 1 1232 0
+	.loc 1 1237 0
 	cbz	x0, .L119
-	.loc 1 1235 0
+	.loc 1 1240 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL122:
@@ -1404,17 +1404,17 @@ ebc_io_ctl:
 .LBE1034:
 .LBE1033:
 .LBE1032:
-	.loc 1 1235 0
-	sub	w0, w22, w0
 	.loc 1 1240 0
+	sub	w0, w22, w0
+	.loc 1 1245 0
 	ldr	w1, [x20, 176]
-	.loc 1 1239 0
+	.loc 1 1244 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1238 0
+	.loc 1 1243 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1240 0
+	.loc 1 1245 0
 	str	w1, [x29, 120]
-	.loc 1 1237 0
+	.loc 1 1242 0
 	str	w0, [x29, 104]
 .LBB1065:
 .LBB1062:
@@ -1539,7 +1539,7 @@ ebc_io_ctl:
 .LBE1068:
 .LBE1067:
 .LBE1066:
-	.loc 1 1321 0
+	.loc 1 1326 0
 	add	x22, x20, 232
 .LBB1101:
 .LBB1097:
@@ -1636,49 +1636,49 @@ ebc_io_ctl:
 .LBE1093:
 .LBE1097:
 .LBE1101:
-	.loc 1 1325 0
+	.loc 1 1330 0
 	add	x20, x20, 184
 	ldr	w2, [x20, 48]
 	ldr	x0, [x20, 88]
 .LVL148:
-	.loc 1 1326 0
+	.loc 1 1331 0
 	mov	x22, 0
-	.loc 1 1325 0
+	.loc 1 1330 0
 	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	_dev_info
 .LVL149:
-	.loc 1 1326 0
+	.loc 1 1331 0
 	b	.L94
 .LVL150:
 	.p2align 3
 .L99:
-	.loc 1 1318 0
+	.loc 1 1323 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC3
 .LVL151:
-	.loc 1 1316 0
+	.loc 1 1321 0
 	str	wzr, [x20, 796]
-	.loc 1 1319 0
+	.loc 1 1324 0
 	mov	x22, 0
-	.loc 1 1317 0
+	.loc 1 1322 0
 	str	wzr, [x20, 800]
-	.loc 1 1318 0
+	.loc 1 1323 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
 .LVL152:
-	.loc 1 1319 0
+	.loc 1 1324 0
 	b	.L94
 .LVL153:
 	.p2align 3
 .L107:
-	.loc 1 1355 0
+	.loc 1 1360 0
 	bl	ebc_empty_buf_get
 .LVL154:
 	mov	x23, x0
-	.loc 1 1356 0
+	.loc 1 1361 0
 	cbz	x0, .L119
-	.loc 1 1358 0
+	.loc 1 1363 0
 	add	x22, x20, 24
 	ldr	x1, [x20, 320]
 	ldp	w2, w3, [x20, 108]
@@ -1686,13 +1686,13 @@ ebc_io_ctl:
 .LVL155:
 	.p2align 3
 .L112:
-	.loc 1 1342 0
+	.loc 1 1347 0
 	bl	ebc_empty_buf_get
 .LVL156:
 	mov	x23, x0
-	.loc 1 1343 0
+	.loc 1 1348 0
 	cbz	x0, .L119
-	.loc 1 1345 0
+	.loc 1 1350 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 312]
@@ -1701,7 +1701,7 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL157:
-	.loc 1 1346 0
+	.loc 1 1351 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL158:
@@ -1729,11 +1729,11 @@ ebc_io_ctl:
 .LBE1104:
 .LBE1103:
 .LBE1102:
-	.loc 1 1349 0
+	.loc 1 1354 0
 	ldp	w4, w1, [x22, 84]
-	.loc 1 1347 0
+	.loc 1 1352 0
 	str	w0, [x29, 104]
-	.loc 1 1348 0
+	.loc 1 1353 0
 	stp	w1, w4, [x29, 112]
 .LBB1113:
 .LBB1112:
@@ -1777,15 +1777,15 @@ ebc_io_ctl:
 .LBE1116:
 .LBE1115:
 .LBE1114:
-	.loc 1 1332 0
+	.loc 1 1337 0
 	ldp	w1, w0, [x20, 116]
 .LVL163:
 	stp	w1, w0, [x29, 140]
-	.loc 1 1329 0
+	.loc 1 1334 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 1328 0
+	.loc 1 1333 0
 	stp	w5, w6, [x29, 112]
-	.loc 1 1330 0
+	.loc 1 1335 0
 	ldr	w4, [x20, 176]
 	str	w4, [x29, 120]
 .LBB1149:
@@ -1833,46 +1833,46 @@ ebc_io_ctl:
 .LBE1141:
 .LBE1145:
 .LBE1149:
-	.loc 1 1335 0
+	.loc 1 1340 0
 	ldr	x0, [x20, 272]
 .LVL169:
 	adrp	x1, .LC5
 .LVL170:
-	.loc 1 1336 0
+	.loc 1 1341 0
 	mov	x22, -14
-	.loc 1 1335 0
+	.loc 1 1340 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
 .LVL171:
-	.loc 1 1336 0
+	.loc 1 1341 0
 	b	.L94
 .LVL172:
 	.p2align 3
 .L98:
-	.loc 1 1396 0
+	.loc 1 1401 0
 	ldr	x0, [x20, 272]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
 .LVL173:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
-	.loc 1 1397 0
+	.loc 1 1402 0
 	mov	x22, 0
-	.loc 1 1396 0
+	.loc 1 1401 0
 	bl	_dev_err
 .LVL174:
-	.loc 1 1400 0
+	.loc 1 1405 0
 	b	.L94
 .LVL175:
 	.p2align 3
 .L103:
-	.loc 1 1245 0
+	.loc 1 1250 0
 	bl	ebc_empty_buf_get
 .LVL176:
 	mov	x23, x0
-	.loc 1 1246 0
+	.loc 1 1251 0
 	cbz	x0, .L119
-	.loc 1 1249 0
+	.loc 1 1254 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL177:
@@ -1899,17 +1899,17 @@ ebc_io_ctl:
 .LBE1152:
 .LBE1151:
 .LBE1150:
-	.loc 1 1249 0
-	sub	w0, w22, w0
 	.loc 1 1254 0
+	sub	w0, w22, w0
+	.loc 1 1259 0
 	ldr	w1, [x20, 176]
-	.loc 1 1253 0
+	.loc 1 1258 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1252 0
+	.loc 1 1257 0
 	stp	w4, w5, [x29, 112]
-	.loc 1 1254 0
+	.loc 1 1259 0
 	str	w1, [x29, 120]
-	.loc 1 1251 0
+	.loc 1 1256 0
 	str	w0, [x29, 104]
 .LBB1185:
 .LBB1181:
@@ -1956,15 +1956,15 @@ ebc_io_ctl:
 .LBE1177:
 .LBE1181:
 .LBE1185:
-	.loc 1 1258 0
+	.loc 1 1263 0
 	mov	x0, x23
 .LVL184:
-	.loc 1 1259 0
+	.loc 1 1264 0
 	mov	x22, -14
-	.loc 1 1258 0
+	.loc 1 1263 0
 	bl	ebc_buf_release
 .LVL185:
-	.loc 1 1259 0
+	.loc 1 1264 0
 	b	.L94
 .LVL186:
 	.p2align 3
@@ -1987,7 +1987,7 @@ ebc_io_ctl:
 .LBE1027:
 .LBE1029:
 .LBE1186:
-	.loc 1 1204 0
+	.loc 1 1209 0
 	mov	x0, x21
 .LVL187:
 .LBB1187:
@@ -2024,7 +2024,7 @@ ebc_io_ctl:
 .LBE992:
 .LBE994:
 .LBE1188:
-	.loc 1 1204 0
+	.loc 1 1209 0
 	mov	x0, x21
 .LVL189:
 .LBB1189:
@@ -2062,7 +2062,7 @@ ebc_io_ctl:
 .LBE1142:
 .LBE1146:
 .LBE1190:
-	.loc 1 1204 0
+	.loc 1 1209 0
 	mov	x0, x21
 .LVL192:
 .LBB1191:
@@ -2099,7 +2099,7 @@ ebc_io_ctl:
 .LBE1094:
 .LBE1098:
 .LBE1192:
-	.loc 1 1204 0
+	.loc 1 1209 0
 	mov	x0, x21
 .LVL194:
 .LBB1193:
@@ -2137,7 +2137,7 @@ ebc_io_ctl:
 .LBE1178:
 .LBE1182:
 .LBE1194:
-	.loc 1 1204 0
+	.loc 1 1209 0
 	mov	x0, x21
 .LVL197:
 .LBB1195:
@@ -2175,7 +2175,7 @@ ebc_io_ctl:
 .LBE1060:
 .LBE1063:
 .LBE1196:
-	.loc 1 1204 0
+	.loc 1 1209 0
 	mov	x0, x21
 .LVL200:
 .LBB1197:
@@ -2250,7 +2250,7 @@ ebc_io_ctl:
 .LBE1144:
 .LBE1148:
 .LBE1198:
-	.loc 1 1334 0
+	.loc 1 1339 0
 	cbnz	x0, .L146
 .LBB1199:
 .LBB999:
@@ -2317,7 +2317,7 @@ ebc_io_ctl:
 .LBE1180:
 .LBE1184:
 .LBE1200:
-	.loc 1 1257 0
+	.loc 1 1262 0
 	cbnz	w0, .L123
 .LBB1201:
 .LBB1000:
@@ -2328,16 +2328,16 @@ ebc_io_ctl:
 .L127:
 .LBE1000:
 .LBE1201:
-	.loc 1 1265 0
+	.loc 1 1270 0
 	mov	x22, -14
 	b	.L94
 .LVL218:
 	.p2align 3
 .L234:
-	.loc 1 1280 0
+	.loc 1 1285 0
 	mov	w2, 1
 	str	w2, [x20, 80]
-	.loc 1 1281 0
+	.loc 1 1286 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -2347,7 +2347,7 @@ ebc_io_ctl:
 	b	.L129
 	.p2align 3
 .L235:
-	.loc 1 1283 0 discriminator 1
+	.loc 1 1288 0 discriminator 1
 	ldr	w0, [x20, 600]
 	cbz	w0, .L131
 .LBB1202:
@@ -2358,7 +2358,7 @@ ebc_io_ctl:
 .L119:
 .LBE1001:
 .LBE1202:
-	.loc 1 1233 0
+	.loc 1 1238 0
 	mov	x22, -1
 	b	.L94
 .LVL221:
@@ -2381,19 +2381,19 @@ ebc_io_ctl:
 .LBE1096:
 .LBE1100:
 .LBE1203:
-	.loc 1 1322 0
+	.loc 1 1327 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC4
-	.loc 1 1323 0
+	.loc 1 1328 0
 	mov	x22, -14
-	.loc 1 1322 0
+	.loc 1 1327 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
 .LVL226:
-	.loc 1 1323 0
+	.loc 1 1328 0
 	b	.L94
 .L232:
-	.loc 1 1401 0
+	.loc 1 1406 0
 	bl	__stack_chk_fail
 .LVL227:
 .L240:
@@ -2409,40 +2409,44 @@ ebc_io_ctl:
 	.type	frame_done_callback, %function
 frame_done_callback:
 .LFB2816:
-	.loc 1 639 0
+	.loc 1 634 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 640 0
+	.loc 1 635 0
 	adrp	x0, .LANCHOR0
-	add	x1, x0, :lo12:.LANCHOR0
-	.loc 1 639 0
+	.loc 1 634 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 640 0
+	.loc 1 635 0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 639 0
+	.loc 1 634 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 643 0
+	.loc 1 638 0
 	add	x19, x20, 184
-	ldr	x0, [x19, 216]
-	ldr	w0, [x0, 40]
-	cmp	w0, 1
-	bhi	.L244
-	.loc 1 646 0
-	ldr	w0, [x19, 36]
-	cbz	w0, .L246
-	.loc 1 647 0
-	ldr	x0, [x1, 8]
+	ldr	x1, [x19, 216]
+	ldr	w1, [x1, 40]
+	tbnz	w1, #31, .L244
+	cmp	w1, 1
+	ble	.L245
+	cmp	w1, 18
+	bne	.L244
+.L245:
+	.loc 1 642 0
+	ldr	w1, [x19, 36]
+	cbz	w1, .L246
+	.loc 1 643 0
+	add	x0, x0, :lo12:.LANCHOR0
+	ldr	x0, [x0, 8]
 	bl	wake_up_process
 .LVL229:
-	.loc 1 673 0
+	.loc 1 669 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -2457,40 +2461,40 @@ frame_done_callback:
 	.p2align 3
 .L244:
 	.cfi_restore_state
-	.loc 1 661 0
-	ldr	w0, [x19, 40]
-	cbnz	w0, .L250
-	.loc 1 667 0
+	.loc 1 657 0
+	ldr	w1, [x19, 40]
+	cbnz	w1, .L253
+	.loc 1 663 0
 	ldr	x0, [x19, 88]
-	.loc 1 666 0
+	.loc 1 662 0
 	mov	w20, 1
-	.loc 1 665 0
+	.loc 1 661 0
 	str	wzr, [x19, 28]
-	.loc 1 667 0
+	.loc 1 663 0
 	adrp	x1, .LC9
-	.loc 1 666 0
+	.loc 1 662 0
 	str	w20, [x19, 76]
-	.loc 1 667 0
+	.loc 1 663 0
 	add	x1, x1, :lo12:.LC9
-	.loc 1 668 0
+	.loc 1 664 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
-	.loc 1 667 0
+	.loc 1 663 0
 	bl	_dev_info
 .LVL230:
-	.loc 1 668 0
+	.loc 1 664 0
 	mov	w2, w20
 	add	x0, x19, 352
 	mov	w1, w20
 	bl	__wake_up_sync
 .LVL231:
-	.loc 1 669 0
+	.loc 1 665 0
 	mov	w2, w20
 	mov	w1, w20
 	add	x0, x19, 304
 	bl	__wake_up_sync
 .LVL232:
-	.loc 1 673 0
+	.loc 1 669 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -2505,16 +2509,16 @@ frame_done_callback:
 	.p2align 3
 .L246:
 	.cfi_restore_state
-	.loc 1 650 0
+	.loc 1 646 0
 	ldr	x0, [x19, 88]
 	adrp	x1, .LC8
 	add	x1, x1, :lo12:.LC8
-	.loc 1 655 0
+	.loc 1 651 0
 	mov	w21, 1
-	.loc 1 650 0
+	.loc 1 646 0
 	bl	_dev_info
 .LVL233:
-	.loc 1 652 0
+	.loc 1 648 0
 	ldp	w2, w3, [x20, 108]
 	mov	w1, 0
 	ldr	x0, [x19, 160]
@@ -2522,7 +2526,7 @@ frame_done_callback:
 	lsr	w2, w2, 4
 	bl	memset
 .LVL234:
-	.loc 1 653 0
+	.loc 1 649 0
 	adrp	x2, jiffies
 	add	x0, x20, 680
 	mov	x1, 402653184
@@ -2530,11 +2534,11 @@ frame_done_callback:
 	add	x1, x2, x1
 	bl	mod_timer
 .LVL235:
-	.loc 1 655 0
+	.loc 1 651 0
 	str	w21, [x19, 76]
-	.loc 1 654 0
+	.loc 1 650 0
 	str	wzr, [x19, 28]
-	.loc 1 656 0
+	.loc 1 652 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
 	mov	w2, w21
@@ -2542,13 +2546,13 @@ frame_done_callback:
 	add	x0, x19, 352
 	bl	__wake_up_sync
 .LVL236:
-	.loc 1 657 0
+	.loc 1 653 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x19, 304
 	bl	__wake_up_sync
 .LVL237:
-	.loc 1 673 0
+	.loc 1 669 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -2561,17 +2565,18 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L250:
+.L253:
 	.cfi_restore_state
-	.loc 1 663 0
-	ldr	x0, [x1, 8]
-	.loc 1 662 0
+	.loc 1 659 0
+	add	x0, x0, :lo12:.LANCHOR0
+	.loc 1 658 0
 	mov	w1, 1
 	str	w1, [x19, 28]
-	.loc 1 663 0
+	.loc 1 659 0
+	ldr	x0, [x0, 8]
 	bl	wake_up_process
 .LVL238:
-	.loc 1 673 0
+	.loc 1 669 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -2590,7 +2595,7 @@ frame_done_callback:
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
 .LFB2822:
-	.loc 1 1130 0
+	.loc 1 1135 0
 	.cfi_startproc
 .LVL239:
 	stp	x29, x30, [sp, -16]!
@@ -2599,10 +2604,10 @@ ebc_frame_timeout:
 	.cfi_offset 30, -8
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1131 0
+	.loc 1 1136 0
 	bl	frame_done_callback
 .LVL240:
-	.loc 1 1133 0
+	.loc 1 1138 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -2616,16 +2621,16 @@ ebc_frame_timeout:
 	.type	ebc_lut_update, %function
 ebc_lut_update:
 .LFB2817:
-	.loc 1 676 0
+	.loc 1 672 0
 	.cfi_startproc
 .LVL241:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 678 0
+	.loc 1 674 0
 	mov	w3, 25
-	.loc 1 676 0
+	.loc 1 672 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x21, x22, [sp, 32]
@@ -2635,18 +2640,18 @@ ebc_lut_update:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -48
 	.cfi_offset 20, -40
-	.loc 1 678 0
+	.loc 1 674 0
 	add	x1, x29, 64
-	.loc 1 676 0
+	.loc 1 672 0
 	adrp	x19, __stack_chk_guard
 	add	x0, x19, :lo12:__stack_chk_guard
 .LVL242:
-	.loc 1 682 0
-	ldr	x2, [x21, 16]
 	.loc 1 678 0
+	ldr	x2, [x21, 16]
+	.loc 1 674 0
 	str	w3, [x1, -12]!
 .LVL243:
-	.loc 1 676 0
+	.loc 1 672 0
 	ldr	x3, [x0]
 	str	x3, [x29, 56]
 	mov	x3,0
@@ -2660,49 +2665,49 @@ ebc_lut_update:
 	mov	w20, w0
 .LBE1205:
 .LBE1204:
-	.loc 1 683 0
-	cbnz	w0, .L254
+	.loc 1 679 0
+	cbnz	w0, .L257
 .LVL245:
-	.loc 1 684 0
+	.loc 1 680 0
 	ldr	w2, [x29, 52]
-	.loc 1 685 0
+	.loc 1 681 0
 	add	x22, x21, 184
+	.loc 1 680 0
+	tbnz	w2, #31, .L280
 	.loc 1 684 0
-	tbnz	w2, #31, .L277
-	.loc 1 688 0
 	cmp	w2, 50
-	bgt	.L278
-.L256:
-	.loc 1 696 0
+	bgt	.L281
+.L259:
+	.loc 1 692 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC12
 	add	x1, x1, :lo12:.LC12
 	bl	_dev_info
 .LVL246:
-	.loc 1 699 0
+	.loc 1 695 0
 	ldr	x0, [x22, 216]
 	ldr	w0, [x0, 40]
-	cmp	w0, 17
-	bls	.L279
-	.loc 1 746 0
+	cmp	w0, 19
+	bls	.L282
+	.loc 1 744 0
 	ldr	w2, [x29, 52]
-.L276:
+.L279:
 	mov	w1, 7
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL247:
-	cbnz	w0, .L268
-.L271:
-	.loc 1 751 0
-	cbnz	w20, .L269
-.L253:
-	.loc 1 757 0
+	cbnz	w0, .L271
+.L274:
+	.loc 1 749 0
+	cbnz	w20, .L272
+.L256:
+	.loc 1 755 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	w0, w20
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L280
+	cbnz	x1, .L283
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 .LVL248:
@@ -2718,67 +2723,69 @@ ebc_lut_update:
 	ret
 .LVL249:
 	.p2align 3
-.L279:
+.L282:
 	.cfi_restore_state
-	.loc 1 699 0
-	adrp	x1, .L259
-	.loc 1 701 0
+	.loc 1 695 0
+	adrp	x1, .L262
+	.loc 1 697 0
 	ldr	w2, [x29, 52]
-	.loc 1 699 0
-	add	x1, x1, :lo12:.L259
+	.loc 1 695 0
+	add	x1, x1, :lo12:.L262
 	ldrb	w0, [x1,w0,uxtw]
-	adr	x1, .Lrtx259
+	adr	x1, .Lrtx262
 	add	x0, x1, w0, sxtb #2
 	br	x0
-.Lrtx259:
+.Lrtx262:
 	.section	.rodata
 	.align	0
 	.align	2
-.L259:
-	.byte	(.L258 - .Lrtx259) / 4
-	.byte	(.L258 - .Lrtx259) / 4
-	.byte	(.L276 - .Lrtx259) / 4
-	.byte	(.L261 - .Lrtx259) / 4
-	.byte	(.L262 - .Lrtx259) / 4
-	.byte	(.L263 - .Lrtx259) / 4
-	.byte	(.L264 - .Lrtx259) / 4
-	.byte	(.L276 - .Lrtx259) / 4
-	.byte	(.L261 - .Lrtx259) / 4
-	.byte	(.L262 - .Lrtx259) / 4
-	.byte	(.L263 - .Lrtx259) / 4
-	.byte	(.L264 - .Lrtx259) / 4
-	.byte	(.L265 - .Lrtx259) / 4
-	.byte	(.L266 - .Lrtx259) / 4
-	.byte	(.L267 - .Lrtx259) / 4
-	.byte	(.L276 - .Lrtx259) / 4
-	.byte	(.L276 - .Lrtx259) / 4
-	.byte	(.L276 - .Lrtx259) / 4
+.L262:
+	.byte	(.L261 - .Lrtx262) / 4
+	.byte	(.L261 - .Lrtx262) / 4
+	.byte	(.L279 - .Lrtx262) / 4
+	.byte	(.L264 - .Lrtx262) / 4
+	.byte	(.L265 - .Lrtx262) / 4
+	.byte	(.L266 - .Lrtx262) / 4
+	.byte	(.L267 - .Lrtx262) / 4
+	.byte	(.L279 - .Lrtx262) / 4
+	.byte	(.L264 - .Lrtx262) / 4
+	.byte	(.L265 - .Lrtx262) / 4
+	.byte	(.L266 - .Lrtx262) / 4
+	.byte	(.L267 - .Lrtx262) / 4
+	.byte	(.L268 - .Lrtx262) / 4
+	.byte	(.L269 - .Lrtx262) / 4
+	.byte	(.L270 - .Lrtx262) / 4
+	.byte	(.L279 - .Lrtx262) / 4
+	.byte	(.L279 - .Lrtx262) / 4
+	.byte	(.L279 - .Lrtx262) / 4
+	.byte	(.L261 - .Lrtx262) / 4
+	.byte	(.L279 - .Lrtx262) / 4
 	.text
 	.p2align 3
-.L267:
-	.loc 1 701 0
+.L270:
+	.loc 1 697 0
 	mov	w1, 1
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL250:
-	cbz	w0, .L271
+	cbz	w0, .L274
 	.p2align 2
-.L268:
-	.loc 1 690 0
+.L271:
+	.loc 1 686 0
 	mov	w20, -1
-.L269:
-	.loc 1 752 0
+.L272:
+	.loc 1 750 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC13
 	add	x1, x1, :lo12:.LC13
 	bl	_dev_err
 .LVL251:
-	.loc 1 753 0
-	b	.L253
+	.loc 1 751 0
+	b	.L256
 .LVL252:
 	.p2align 3
-.L254:
-	.loc 1 694 0
+.L257:
+	.loc 1 690 0
 	add	x22, x21, 184
 	mov	w2, w0
 	adrp	x1, .LC11
@@ -2787,97 +2794,97 @@ ebc_lut_update:
 	bl	_dev_err
 .LVL253:
 	ldr	w2, [x29, 52]
-	b	.L256
+	b	.L259
 	.p2align 3
-.L278:
-	.loc 1 689 0
+.L281:
+	.loc 1 685 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC10
 	add	x1, x1, :lo12:.LC10
 	bl	_dev_err
 .LVL254:
-	.loc 1 690 0
+	.loc 1 686 0
 	mov	w2, 50
 	str	w2, [x29, 52]
 .LVL255:
-	b	.L256
+	b	.L259
 	.p2align 3
-.L262:
-	.loc 1 732 0
+.L265:
+	.loc 1 730 0
 	mov	w1, 9
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL256:
-	cbnz	w0, .L268
-	b	.L271
+	cbnz	w0, .L271
+	b	.L274
 	.p2align 3
-.L263:
-	.loc 1 737 0
+.L266:
+	.loc 1 735 0
 	mov	w1, 10
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL257:
-	cbnz	w0, .L268
-	b	.L271
+	cbnz	w0, .L271
+	b	.L274
 	.p2align 3
-.L264:
-	.loc 1 742 0
+.L267:
+	.loc 1 740 0
 	mov	w1, 11
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL258:
-	cbnz	w0, .L268
-	b	.L271
+	cbnz	w0, .L271
+	b	.L274
 	.p2align 3
-.L265:
-	.loc 1 718 0
+.L268:
+	.loc 1 716 0
 	mov	w1, 6
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL259:
-	cbnz	w0, .L268
-	b	.L271
+	cbnz	w0, .L271
+	b	.L274
 	.p2align 3
-.L258:
-	.loc 1 714 0
+.L261:
+	.loc 1 712 0
 	mov	w1, 5
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL260:
-	cbnz	w0, .L268
-	b	.L271
+	cbnz	w0, .L271
+	b	.L274
 	.p2align 3
-.L261:
-	.loc 1 727 0
+.L264:
+	.loc 1 725 0
 	mov	w1, 8
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL261:
-	cbnz	w0, .L268
-	b	.L271
+	cbnz	w0, .L271
+	b	.L274
 	.p2align 3
-.L266:
-	.loc 1 722 0
+.L269:
+	.loc 1 720 0
 	mov	w1, 4
 	add	x0, x21, 280
 	bl	epd_lut_get
 .LVL262:
-	cbnz	w0, .L268
-	b	.L271
+	cbnz	w0, .L271
+	b	.L274
 	.p2align 3
-.L277:
-	.loc 1 685 0
+.L280:
+	.loc 1 681 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC10
 	add	x1, x1, :lo12:.LC10
 	bl	_dev_err
 .LVL263:
-	.loc 1 686 0
+	.loc 1 682 0
 	str	wzr, [x29, 52]
 	mov	w2, 0
-	b	.L256
-.L280:
-	.loc 1 757 0
+	b	.L259
+.L283:
+	.loc 1 755 0
 	bl	__stack_chk_fail
 .LVL264:
 	.cfi_endproc
@@ -2888,32 +2895,32 @@ ebc_lut_update:
 	.type	ebc_state_read, %function
 ebc_state_read:
 .LFB2833:
-	.loc 1 1525 0
+	.loc 1 1530 0
 	.cfi_startproc
 .LVL265:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1526 0
+	.loc 1 1531 0
 	adrp	x3, .LANCHOR0
-	.loc 1 1525 0
+	.loc 1 1530 0
 	mov	x0, x2
 .LVL266:
-	.loc 1 1526 0
+	.loc 1 1531 0
 	adrp	x1, .LC14
 .LVL267:
-	.loc 1 1525 0
+	.loc 1 1530 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1526 0
+	.loc 1 1531 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL268:
 	add	x1, x1, :lo12:.LC14
 	ldr	w2, [x2, 616]
 	bl	sprintf
 .LVL269:
-	.loc 1 1527 0
+	.loc 1 1532 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -2928,7 +2935,7 @@ ebc_state_read:
 	.type	ebc_version_read, %function
 ebc_version_read:
 .LFB2832:
-	.loc 1 1516 0
+	.loc 1 1521 0
 	.cfi_startproc
 .LVL270:
 	stp	x29, x30, [sp, -16]!
@@ -2937,22 +2944,22 @@ ebc_version_read:
 	.cfi_offset 30, -8
 	mov	x0, x2
 .LVL271:
-	.loc 1 1517 0
+	.loc 1 1522 0
 	adrp	x1, .LC16
 .LVL272:
 	adrp	x2, .LC15
 .LVL273:
-	.loc 1 1516 0
+	.loc 1 1521 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1517 0
+	.loc 1 1522 0
 	add	x2, x2, :lo12:.LC15
-	.loc 1 1516 0
-	.loc 1 1517 0
+	.loc 1 1521 0
+	.loc 1 1522 0
 	add	x1, x1, :lo12:.LC16
 	bl	sprintf
 .LVL274:
-	.loc 1 1518 0
+	.loc 1 1523 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -2967,27 +2974,27 @@ ebc_version_read:
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
 .LFB2830:
-	.loc 1 1480 0
+	.loc 1 1485 0
 	.cfi_startproc
 .LVL275:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 1481 0
+	.loc 1 1486 0
 	adrp	x0, .LANCHOR0
 .LVL276:
-	.loc 1 1480 0
+	.loc 1 1485 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1484 0
+	.loc 1 1489 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1480 0
+	.loc 1 1485 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1480 0
+	.loc 1 1485 0
 	mov	x19, x2
-	.loc 1 1484 0
+	.loc 1 1489 0
 	ldr	x1, [x0, 16]
 .LVL277:
 .LBB1206:
@@ -2999,14 +3006,14 @@ pmic_vcom_read:
 .LVL278:
 .LBE1207:
 .LBE1206:
-	.loc 1 1486 0
+	.loc 1 1491 0
 	mov	w2, w0
 	adrp	x1, .LC14
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC14
 	bl	sprintf
 .LVL279:
-	.loc 1 1487 0
+	.loc 1 1492 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL280:
@@ -3024,20 +3031,20 @@ pmic_vcom_read:
 	.type	pmic_temp_read, %function
 pmic_temp_read:
 .LFB2829:
-	.loc 1 1466 0
+	.loc 1 1471 0
 	.cfi_startproc
 .LVL281:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 1467 0
+	.loc 1 1472 0
 	adrp	x0, .LANCHOR0
 .LVL282:
-	.loc 1 1466 0
+	.loc 1 1471 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1470 0
+	.loc 1 1475 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
 .LBB1208:
 .LBB1209:
@@ -3046,11 +3053,11 @@ pmic_temp_read:
 .LVL283:
 .LBE1209:
 .LBE1208:
-	.loc 1 1466 0
+	.loc 1 1471 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 1466 0
+	.loc 1 1471 0
 	adrp	x19, __stack_chk_guard
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x20, x2
@@ -3058,7 +3065,7 @@ pmic_temp_read:
 	str	x2, [x29, 40]
 	mov	x2,0
 .LVL284:
-	.loc 1 1470 0
+	.loc 1 1475 0
 	ldr	x2, [x0, 16]
 .LBB1211:
 .LBB1210:
@@ -3069,18 +3076,18 @@ pmic_temp_read:
 .LVL285:
 .LBE1210:
 .LBE1211:
-	.loc 1 1472 0
+	.loc 1 1477 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC14
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC14
 	bl	sprintf
 .LVL286:
-	.loc 1 1473 0
+	.loc 1 1478 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L290
+	cbnz	x1, .L293
 	ldp	x19, x20, [sp, 16]
 .LVL287:
 	sxtw	x0, w0
@@ -3093,7 +3100,7 @@ pmic_temp_read:
 	.cfi_def_cfa 31, 0
 	ret
 .LVL288:
-.L290:
+.L293:
 	.cfi_restore_state
 	bl	__stack_chk_fail
 .LVL289:
@@ -3105,25 +3112,25 @@ pmic_temp_read:
 	.type	pmic_name_read, %function
 pmic_name_read:
 .LFB2828:
-	.loc 1 1455 0
+	.loc 1 1460 0
 	.cfi_startproc
 .LVL290:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1456 0
+	.loc 1 1461 0
 	adrp	x3, .LANCHOR0
-	.loc 1 1455 0
+	.loc 1 1460 0
 	mov	x0, x2
 .LVL291:
-	.loc 1 1458 0
+	.loc 1 1463 0
 	adrp	x1, .LC16
 .LVL292:
-	.loc 1 1455 0
+	.loc 1 1460 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1458 0
+	.loc 1 1463 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL293:
 	add	x1, x1, :lo12:.LC16
@@ -3131,7 +3138,7 @@ pmic_name_read:
 	add	x2, x2, 8
 	bl	sprintf
 .LVL294:
-	.loc 1 1459 0
+	.loc 1 1464 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3146,17 +3153,17 @@ pmic_name_read:
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
 .LFB2831:
-	.loc 1 1492 0
+	.loc 1 1497 0
 	.cfi_startproc
 .LVL295:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 1493 0
+	.loc 1 1498 0
 	adrp	x0, .LANCHOR0
 .LVL296:
-	.loc 1 1492 0
+	.loc 1 1497 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -3166,44 +3173,44 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 1492 0
+	.loc 1 1497 0
 	add	x1, x19, :lo12:__stack_chk_guard
 .LVL297:
 	mov	x21, x2
-	.loc 1 1493 0
+	.loc 1 1498 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
 .LVL298:
-	.loc 1 1492 0
+	.loc 1 1497 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
 .LVL299:
 	mov	x20, x3
-	.loc 1 1496 0
+	.loc 1 1501 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
 .LVL300:
-	.loc 1 1497 0
-	cbnz	w0, .L300
+	.loc 1 1502 0
+	cbnz	w0, .L303
 .LVL301:
-	.loc 1 1501 0
+	.loc 1 1506 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
 .LVL302:
-	.loc 1 1502 0
-	cbnz	w0, .L301
-.L293:
-	.loc 1 1508 0
+	.loc 1 1507 0
+	cbnz	w0, .L304
+.L296:
+	.loc 1 1513 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
 .LVL303:
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L302
+	cbnz	x1, .L305
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 .LVL304:
@@ -3219,38 +3226,38 @@ pmic_vcom_write:
 	ret
 .LVL305:
 	.p2align 3
-.L300:
+.L303:
 	.cfi_restore_state
-	.loc 1 1498 0
+	.loc 1 1503 0
 	ldr	x0, [x22]
 	adrp	x1, .LC17
 	mov	x2, x21
 	add	x1, x1, :lo12:.LC17
-	.loc 1 1499 0
+	.loc 1 1504 0
 	mov	x20, -1
 .LVL306:
-	.loc 1 1498 0
+	.loc 1 1503 0
 	bl	_dev_err
 .LVL307:
-	.loc 1 1499 0
-	b	.L293
+	.loc 1 1504 0
+	b	.L296
 .LVL308:
 	.p2align 3
-.L301:
-	.loc 1 1503 0
+.L304:
+	.loc 1 1508 0
 	ldr	x0, [x22]
 	adrp	x1, .LC18
-	.loc 1 1504 0
+	.loc 1 1509 0
 	mov	x20, -1
 .LVL309:
-	.loc 1 1503 0
+	.loc 1 1508 0
 	add	x1, x1, :lo12:.LC18
 	bl	_dev_err
 .LVL310:
-	.loc 1 1504 0
-	b	.L293
-.L302:
-	.loc 1 1508 0
+	.loc 1 1509 0
+	b	.L296
+.L305:
+	.loc 1 1513 0
 	bl	__stack_chk_fail
 .LVL311:
 	.cfi_endproc
@@ -3261,7 +3268,7 @@ pmic_vcom_write:
 	.type	waveform_version_read, %function
 waveform_version_read:
 .LFB2827:
-	.loc 1 1444 0
+	.loc 1 1449 0
 	.cfi_startproc
 .LVL312:
 	stp	x29, x30, [sp, -32]!
@@ -3272,19 +3279,19 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1444 0
+	.loc 1 1449 0
 	mov	x19, x2
-	.loc 1 1445 0
+	.loc 1 1450 0
 	bl	epd_lut_get_wf_version
 .LVL313:
-	.loc 1 1447 0
+	.loc 1 1452 0
 	mov	x2, x0
 	adrp	x1, .LC16
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC16
 	bl	sprintf
 .LVL314:
-	.loc 1 1448 0
+	.loc 1 1453 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL315:
@@ -3302,23 +3309,23 @@ waveform_version_read:
 	.type	ebc_init, %function
 ebc_init:
 .LFB2844:
-	.loc 1 1960 0
+	.loc 1 1965 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1961 0
+	.loc 1 1966 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 1960 0
+	.loc 1 1965 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1961 0
+	.loc 1 1966 0
 	bl	__platform_driver_register
 .LVL316:
-	.loc 1 1962 0
+	.loc 1 1967 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -3333,43 +3340,43 @@ ebc_init:
 	.type	direct_mode_data_change.isra.0, %function
 direct_mode_data_change.isra.0:
 .LFB2846:
-	.loc 1 400 0
+	.loc 1 392 0
 	.cfi_startproc
 .LVL317:
-	.loc 1 404 0
+	.loc 1 396 0
 	adrp	x6, .LANCHOR0
-	.loc 1 400 0
+	.loc 1 392 0
 	and	w3, w3, 255
-	.loc 1 410 0
+	.loc 1 402 0
 	sub	w3, w3, w4
 .LVL318:
-	.loc 1 404 0
+	.loc 1 396 0
 	ldr	x13, [x6, #:lo12:.LANCHOR0]
-	.loc 1 411 0
+	.loc 1 403 0
 	lsl	w3, w3, 16
 .LVL319:
 	add	x5, x5, x3, sxtw
 .LVL320:
-	.loc 1 412 0
+	.loc 1 404 0
 	add	x13, x13, 24
 	ldr	w16, [x13, 156]
-	.loc 1 415 0
+	.loc 1 407 0
 	ldp	w3, w15, [x13, 84]
 .LVL321:
-	.loc 1 420 0
+	.loc 1 412 0
 	cmp	w15, 0
-	ble	.L319
+	ble	.L322
 	lsr	w14, w3, 4
 	mov	w12, 0
 .LVL322:
 	sub	w11, w14, #1
 	add	x11, x11, 1
 	lsl	x11, x11, 3
-	.loc 1 421 0
-	cbz	w16, .L322
+	.loc 1 413 0
+	cbz	w16, .L325
 .LVL323:
-.L333:
-	.loc 1 422 0
+.L336:
+	.loc 1 414 0
 	ldr	w6, [x13, 88]
 .LVL324:
 	sub	w6, w6, #1
@@ -3378,10 +3385,10 @@ direct_mode_data_change.isra.0:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
 .LVL325:
-.L323:
-	.loc 1 426 0
-	cbz	w14, .L331
-	.loc 1 400 0
+.L326:
+	.loc 1 418 0
+	cbz	w14, .L334
+	.loc 1 392 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -3390,24 +3397,24 @@ direct_mode_data_change.isra.0:
 	.cfi_def_cfa_register 29
 .LVL326:
 	.p2align 2
-.L324:
-	.loc 1 426 0
+.L327:
+	.loc 1 418 0
 	mov	x7, 0
 	.p2align 2
-.L313:
-	.loc 1 428 0
+.L316:
+	.loc 1 420 0
 	ldr	x4, [x2, x7]
 .LVL327:
 	add	x6, x6, 4
-	.loc 1 427 0
+	.loc 1 419 0
 	ldr	x3, [x1, x7]
 .LVL328:
 	add	x7, x7, 8
-	.loc 1 430 0
+	.loc 1 422 0
 	and	w9, w4, 65535
-	.loc 1 426 0
+	.loc 1 418 0
 	cmp	x11, x7
-	.loc 1 430 0
+	.loc 1 422 0
 	and	w8, w3, 65535
 .LBB1212:
 .LBB1213:
@@ -3421,7 +3428,7 @@ direct_mode_data_change.isra.0:
 	add	w9, w9, w8, lsr 8
 .LBE1213:
 .LBE1212:
-	.loc 1 431 0
+	.loc 1 423 0
 	lsr	w10, w4, 16
 	lsr	w8, w3, 16
 .LBB1217:
@@ -3454,10 +3461,10 @@ direct_mode_data_change.isra.0:
 	add	w10, w10, w8, lsr 8
 .LBE1220:
 .LBE1227:
-	.loc 1 432 0
+	.loc 1 424 0
 	ubfx	x9, x4, 32, 16
 	ubfx	x8, x3, 32, 16
-	.loc 1 433 0
+	.loc 1 425 0
 	lsr	x4, x4, 48
 .LVL329:
 .LBB1228:
@@ -3466,7 +3473,7 @@ direct_mode_data_change.isra.0:
 	orr	w17, w30, w17, lsl 4
 .LBE1216:
 .LBE1228:
-	.loc 1 430 0
+	.loc 1 422 0
 	strb	w17, [x6, -4]
 .LBB1229:
 .LBB1230:
@@ -3498,7 +3505,7 @@ direct_mode_data_change.isra.0:
 	add	w8, w9, w8, lsr 8
 .LBE1232:
 .LBE1239:
-	.loc 1 433 0
+	.loc 1 425 0
 	lsr	x3, x3, 48
 .LVL330:
 .LBB1240:
@@ -3507,7 +3514,7 @@ direct_mode_data_change.isra.0:
 	orr	w9, w18, w10, lsl 4
 .LBE1223:
 .LBE1240:
-	.loc 1 431 0
+	.loc 1 423 0
 	strb	w9, [x6, -3]
 .LBB1241:
 .LBB1242:
@@ -3545,7 +3552,7 @@ direct_mode_data_change.isra.0:
 	orr	w4, w17, w10, lsl 4
 .LBE1235:
 .LBE1250:
-	.loc 1 432 0
+	.loc 1 424 0
 	strb	w4, [x6, -2]
 .LBB1251:
 .LBB1245:
@@ -3556,23 +3563,23 @@ direct_mode_data_change.isra.0:
 	orr	w3, w4, w3, lsl 4
 .LBE1245:
 .LBE1251:
-	.loc 1 433 0
+	.loc 1 425 0
 	strb	w3, [x6, -1]
-	.loc 1 426 0
-	bne	.L313
-	.loc 1 420 0
+	.loc 1 418 0
+	bne	.L316
+	.loc 1 412 0
 	add	w12, w12, 1
 	add	x1, x1, x11
 .LVL331:
 	add	x2, x2, x11
 .LVL332:
 	cmp	w15, w12
-	beq	.L307
-.L332:
+	beq	.L310
+.L335:
 	ldr	w3, [x13, 84]
-	.loc 1 421 0
-	cbz	w16, .L310
-	.loc 1 422 0
+	.loc 1 413 0
+	cbz	w16, .L313
+	.loc 1 414 0
 	ldr	w6, [x13, 88]
 .LVL333:
 	sub	w6, w6, #1
@@ -3581,32 +3588,32 @@ direct_mode_data_change.isra.0:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
 .LVL334:
-	.loc 1 426 0
-	cbnz	w14, .L324
-.L330:
-	.loc 1 420 0
+	.loc 1 418 0
+	cbnz	w14, .L327
+.L333:
+	.loc 1 412 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	bne	.L332
-.L307:
-	.loc 1 436 0
+	bne	.L335
+.L310:
+	.loc 1 428 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 .LVL335:
-.L322:
-	.loc 1 424 0
+.L325:
+	.loc 1 416 0
 	mul	w6, w12, w3
 .LVL336:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
 .LVL337:
-	b	.L323
+	b	.L326
 .LVL338:
 	.p2align 3
-.L310:
+.L313:
 	.cfi_def_cfa 29, 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
@@ -3615,23 +3622,23 @@ direct_mode_data_change.isra.0:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
 .LVL340:
-	.loc 1 426 0
-	cbnz	w14, .L324
-	b	.L330
+	.loc 1 418 0
+	cbnz	w14, .L327
+	b	.L333
 .LVL341:
-.L331:
+.L334:
 	.cfi_def_cfa 31, 0
 	.cfi_restore 29
 	.cfi_restore 30
-	.loc 1 420 0
+	.loc 1 412 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L319
+	beq	.L322
 	ldr	w3, [x13, 84]
-	.loc 1 421 0
-	cbz	w16, .L322
-	b	.L333
-.L319:
+	.loc 1 413 0
+	cbz	w16, .L325
+	b	.L336
+.L322:
 	ret
 	.cfi_endproc
 .LFE2846:
@@ -3641,32 +3648,32 @@ direct_mode_data_change.isra.0:
 	.type	direct_mode_data_change_part.isra.1, %function
 direct_mode_data_change_part.isra.1:
 .LFB2847:
-	.loc 1 438 0
+	.loc 1 430 0
 	.cfi_startproc
 .LVL342:
-	.loc 1 442 0
+	.loc 1 434 0
 	adrp	x6, .LANCHOR0
-	.loc 1 438 0
+	.loc 1 430 0
 	and	w3, w3, 255
-	.loc 1 447 0
+	.loc 1 439 0
 	sub	w3, w3, w4
 .LVL343:
-	.loc 1 442 0
+	.loc 1 434 0
 	ldr	x14, [x6, #:lo12:.LANCHOR0]
-	.loc 1 448 0
+	.loc 1 440 0
 	lsl	w3, w3, 16
 .LVL344:
 	add	x5, x5, x3, sxtw
 .LVL345:
-	.loc 1 449 0
+	.loc 1 441 0
 	add	x14, x14, 24
 	ldr	w16, [x14, 156]
-	.loc 1 452 0
+	.loc 1 444 0
 	ldp	w3, w15, [x14, 84]
 .LVL346:
-	.loc 1 457 0
+	.loc 1 449 0
 	cmp	w15, 0
-	ble	.L400
+	ble	.L403
 	lsr	w11, w3, 4
 .LVL347:
 	mov	w12, 0
@@ -3680,11 +3687,11 @@ direct_mode_data_change_part.isra.1:
 	lsl	x13, x13, 3
 .LBE1253:
 .LBE1252:
-	.loc 1 458 0
-	cbz	w16, .L403
+	.loc 1 450 0
+	cbz	w16, .L406
 .LVL349:
-.L418:
-	.loc 1 459 0
+.L421:
+	.loc 1 451 0
 	ldr	w6, [x14, 88]
 .LVL350:
 	sub	w6, w6, #1
@@ -3693,22 +3700,22 @@ direct_mode_data_change_part.isra.1:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
 .LVL351:
-.L404:
-	.loc 1 463 0
-	cbz	w11, .L406
+.L407:
+	.loc 1 455 0
+	cbz	w11, .L409
 	add	x6, x6, 4
 .LVL352:
 	mov	x8, 0
 .LVL353:
-.L407:
-	.loc 1 464 0
+.L410:
+	.loc 1 456 0
 	ldr	x3, [x1, x8, lsl 3]
-	.loc 1 465 0
+	.loc 1 457 0
 	ldr	x4, [x2, x8, lsl 3]
-	.loc 1 466 0
+	.loc 1 458 0
 	cmp	x3, x4
-	beq	.L416
-	.loc 1 438 0
+	beq	.L419
+	.loc 1 430 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -3716,8 +3723,8 @@ direct_mode_data_change_part.isra.1:
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 .LVL354:
-.L408:
-	.loc 1 467 0
+.L411:
+	.loc 1 459 0
 	and	w17, w4, 65535
 	and	w9, w3, 65535
 .LVL355:
@@ -3727,7 +3734,7 @@ direct_mode_data_change_part.isra.1:
 	mov	w7, 0
 	.loc 1 139 0
 	cmp	w17, w9
-	beq	.L341
+	beq	.L344
 	.loc 1 137 0
 	eor	w18, w17, w9
 .LVL356:
@@ -3769,12 +3776,12 @@ direct_mode_data_change_part.isra.1:
 	and	w7, w9, w7
 	and	w7, w7, 255
 .LVL357:
-.L341:
+.L344:
 .LBE1256:
 .LBE1255:
-	.loc 1 467 0
+	.loc 1 459 0
 	strb	w7, [x6, -4]
-	.loc 1 468 0
+	.loc 1 460 0
 	lsr	w17, w4, 16
 	lsr	w9, w3, 16
 .LBB1257:
@@ -3783,7 +3790,7 @@ direct_mode_data_change_part.isra.1:
 	mov	w7, 0
 	.loc 1 139 0
 	cmp	w17, w9
-	beq	.L346
+	beq	.L349
 	.loc 1 137 0
 	eor	w18, w17, w9
 .LVL358:
@@ -3825,12 +3832,12 @@ direct_mode_data_change_part.isra.1:
 	and	w7, w9, w7
 	and	w7, w7, 255
 .LVL359:
-.L346:
+.L349:
 .LBE1258:
 .LBE1257:
-	.loc 1 468 0
+	.loc 1 460 0
 	strb	w7, [x6, -3]
-	.loc 1 469 0
+	.loc 1 461 0
 	ubfx	x17, x4, 32, 16
 	ubfx	x9, x3, 32, 16
 .LBB1259:
@@ -3839,7 +3846,7 @@ direct_mode_data_change_part.isra.1:
 	mov	w7, 0
 	.loc 1 139 0
 	cmp	w17, w9
-	beq	.L351
+	beq	.L354
 	.loc 1 137 0
 	eor	w18, w17, w9
 .LVL360:
@@ -3881,12 +3888,12 @@ direct_mode_data_change_part.isra.1:
 	and	w7, w9, w7
 	and	w7, w7, 255
 .LVL361:
-.L351:
+.L354:
 .LBE1260:
 .LBE1259:
-	.loc 1 469 0
+	.loc 1 461 0
 	strb	w7, [x6, -2]
-	.loc 1 470 0
+	.loc 1 462 0
 	lsr	x4, x4, 48
 .LVL362:
 	lsr	x3, x3, 48
@@ -3897,7 +3904,7 @@ direct_mode_data_change_part.isra.1:
 	mov	w7, 0
 	.loc 1 139 0
 	cmp	w4, w3
-	beq	.L356
+	beq	.L359
 	.loc 1 137 0
 	eor	w9, w4, w3
 .LVL364:
@@ -3940,47 +3947,47 @@ direct_mode_data_change_part.isra.1:
 	and	w4, w7, w4
 	and	w7, w4, 255
 .LVL366:
-.L356:
+.L359:
 .LBE1254:
 .LBE1261:
-	.loc 1 470 0
+	.loc 1 462 0
 	strb	w7, [x6, -1]
 	add	x8, x8, 1
 	add	x6, x6, 4
-	.loc 1 463 0
+	.loc 1 455 0
 	cmp	w11, w8
-	ble	.L417
+	ble	.L420
 .LVL367:
-.L362:
-	.loc 1 464 0
+.L365:
+	.loc 1 456 0
 	ldr	x3, [x1, x8, lsl 3]
-	.loc 1 465 0
+	.loc 1 457 0
 	ldr	x4, [x2, x8, lsl 3]
-	.loc 1 466 0
+	.loc 1 458 0
 	cmp	x3, x4
-	bne	.L408
-	.loc 1 473 0
+	bne	.L411
+	.loc 1 465 0
 	str	wzr, [x6, -4]
 	add	x8, x8, 1
 	add	x6, x6, 4
-	.loc 1 463 0
+	.loc 1 455 0
 	cmp	w11, w8
-	bgt	.L362
-.L417:
+	bgt	.L365
+.L420:
 	add	x1, x1, x13
 .LVL368:
 	add	x2, x2, x13
 .LVL369:
-.L339:
-	.loc 1 457 0
+.L342:
+	.loc 1 449 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L334
+	beq	.L337
 	ldr	w3, [x14, 84]
 .LVL370:
-	.loc 1 458 0
-	cbz	w16, .L337
-	.loc 1 459 0
+	.loc 1 450 0
+	cbz	w16, .L340
+	.loc 1 451 0
 	ldr	w6, [x14, 88]
 .LVL371:
 	sub	w6, w6, #1
@@ -3989,50 +3996,50 @@ direct_mode_data_change_part.isra.1:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
 .LVL372:
-.L338:
-	.loc 1 463 0
-	cbz	w11, .L339
+.L341:
+	.loc 1 455 0
+	cbz	w11, .L342
 	add	x6, x6, 4
 .LVL373:
 	mov	x8, 0
-	b	.L362
+	b	.L365
 .LVL374:
 	.p2align 3
-.L416:
+.L419:
 	.cfi_def_cfa 31, 0
 	.cfi_restore 29
 	.cfi_restore 30
-	.loc 1 473 0
+	.loc 1 465 0
 	str	wzr, [x6, -4]
 	add	x8, x8, 1
-	.loc 1 463 0
+	.loc 1 455 0
 	cmp	w11, w8
 	add	x6, x6, 4
-	bgt	.L407
+	bgt	.L410
 	add	x1, x1, x13
 .LVL375:
 	add	x2, x2, x13
 .LVL376:
-.L406:
-	.loc 1 457 0
+.L409:
+	.loc 1 449 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L400
+	beq	.L403
 	ldr	w3, [x14, 84]
 .LVL377:
-	.loc 1 458 0
-	cbnz	w16, .L418
-.L403:
-	.loc 1 461 0
+	.loc 1 450 0
+	cbnz	w16, .L421
+.L406:
+	.loc 1 453 0
 	mul	w6, w12, w3
 .LVL378:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
 .LVL379:
-	b	.L404
+	b	.L407
 .LVL380:
 	.p2align 3
-.L337:
+.L340:
 	.cfi_def_cfa 29, 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
@@ -4041,17 +4048,17 @@ direct_mode_data_change_part.isra.1:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
 .LVL382:
-	b	.L338
+	b	.L341
 .LVL383:
-.L334:
-	.loc 1 478 0
+.L337:
+	.loc 1 470 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
 .LVL384:
-.L400:
+.L403:
 	ret
 	.cfi_endproc
 .LFE2847:
@@ -4061,26 +4068,26 @@ direct_mode_data_change_part.isra.1:
 	.type	flip.isra.2, %function
 flip.isra.2:
 .LFB2848:
-	.loc 1 480 0
+	.loc 1 472 0
 	.cfi_startproc
 .LVL385:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 484 0
+	.loc 1 476 0
 	sxtw	x2, w1
-	.loc 1 480 0
+	.loc 1 472 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 480 0
+	.loc 1 472 0
 	mov	x20, x0
-	.loc 1 482 0
+	.loc 1 474 0
 	ldr	w19, [x0, 72]
-	.loc 1 484 0
+	.loc 1 476 0
 	ldr	x0, [x0]
 .LVL386:
 .LBB1262:
@@ -4089,23 +4096,23 @@ flip.isra.2:
 .LBB1265:
 	.file 10 "./include/linux/dma-mapping.h"
 	.loc 10 266 0
-	cbz	x0, .L422
+	cbz	x0, .L425
 	ldr	x3, [x0, 648]
 	.loc 10 268 0
 	adrp	x4, dummy_dma_ops
 	add	x4, x4, :lo12:dummy_dma_ops
 	cmp	x3, 0
 	csel	x3, x4, x3, eq
-.L420:
+.L423:
 .LBE1265:
 .LBE1264:
 	.loc 10 434 0
 	ldr	x5, [x3, 88]
 	sxtw	x19, w19
-	cbz	x5, .L421
+	cbz	x5, .L424
 .LBE1263:
 .LBE1262:
-	.loc 1 484 0
+	.loc 1 476 0
 	add	x4, x19, x19, lsl 1
 .LBB1271:
 .LBB1268:
@@ -4113,7 +4120,7 @@ flip.isra.2:
 	mov	w3, 1
 .LBE1268:
 .LBE1271:
-	.loc 1 484 0
+	.loc 1 476 0
 	add	x4, x20, x4, lsl 3
 .LBB1272:
 .LBB1269:
@@ -4121,10 +4128,10 @@ flip.isra.2:
 	ldr	x1, [x4, 32]
 	blr	x5
 .LVL387:
-.L421:
+.L424:
 .LBE1269:
 .LBE1272:
-	.loc 1 485 0
+	.loc 1 477 0
 	ldr	x5, [x20, 8]
 .LBB1273:
 .LBB1274:
@@ -4137,7 +4144,7 @@ flip.isra.2:
 	mov	w1, 0
 .LBE1274:
 .LBE1273:
-	.loc 1 486 0
+	.loc 1 478 0
 	add	x19, x19, x19, lsl 1
 .LBB1277:
 .LBB1275:
@@ -4145,7 +4152,7 @@ flip.isra.2:
 	ldr	x5, [x5, 64]
 .LBE1275:
 .LBE1277:
-	.loc 1 486 0
+	.loc 1 478 0
 	add	x19, x20, x19, lsl 3
 .LBB1278:
 .LBB1276:
@@ -4154,7 +4161,7 @@ flip.isra.2:
 .LVL388:
 .LBE1276:
 .LBE1278:
-	.loc 1 486 0
+	.loc 1 478 0
 	ldr	x1, [x20, 8]
 .LBB1279:
 .LBB1280:
@@ -4167,7 +4174,7 @@ flip.isra.2:
 .LVL389:
 .LBE1280:
 .LBE1279:
-	.loc 1 487 0
+	.loc 1 479 0
 	ldr	x2, [x20, 8]
 .LBB1281:
 .LBB1282:
@@ -4179,12 +4186,12 @@ flip.isra.2:
 .LVL390:
 .LBE1282:
 .LBE1281:
-	.loc 1 488 0
+	.loc 1 480 0
 	ldr	w1, [x20, 72]
 	mov	w0, 1
 	sub	w0, w0, w1
 	str	w0, [x20, 72]
-	.loc 1 489 0
+	.loc 1 481 0
 	ldp	x19, x20, [sp, 16]
 .LVL391:
 	ldp	x29, x30, [sp], 32
@@ -4197,7 +4204,7 @@ flip.isra.2:
 	ret
 .LVL392:
 	.p2align 3
-.L422:
+.L425:
 	.cfi_restore_state
 .LBB1283:
 .LBB1270:
@@ -4206,7 +4213,7 @@ flip.isra.2:
 	.loc 10 268 0
 	adrp	x3, dummy_dma_ops
 	add	x3, x3, :lo12:dummy_dma_ops
-	b	.L420
+	b	.L423
 .LBE1266:
 .LBE1267:
 .LBE1270:
@@ -4219,7 +4226,7 @@ flip.isra.2:
 	.type	ebc_frame_start, %function
 ebc_frame_start:
 .LFB2814:
-	.loc 1 498 0
+	.loc 1 490 0
 	.cfi_startproc
 .LVL393:
 	stp	x29, x30, [sp, -48]!
@@ -4231,53 +4238,54 @@ ebc_frame_start:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 500 0
+	.loc 1 492 0
 	add	x19, x0, 184
-	.loc 1 498 0
+	.loc 1 490 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 498 0
+	.loc 1 490 0
 	mov	x20, x0
-	.loc 1 499 0
+	.loc 1 491 0
 	add	x21, x0, 24
-	.loc 1 502 0
+	.loc 1 494 0
 	ldr	x1, [x19, 216]
 	ldr	w0, [x1, 40]
 .LVL394:
-	cmp	w0, 1
-	beq	.L429
-	bgt	.L430
-	cbnz	w0, .L428
-	.loc 1 517 0
+	cmp	w0, 12
+	bgt	.L432
+	cmp	w0, 7
+	bge	.L433
+	cbnz	w0, .L446
+	.loc 1 510 0
 	ldr	x0, [x19, 176]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 128]
 	ldr	x3, [x19, 160]
 	bl	get_auto_image
 .LVL395:
-	.loc 1 522 0
+	.loc 1 515 0
 	ldr	w0, [x19, 36]
-	cbz	w0, .L435
+	cbz	w0, .L438
 .LBB1284:
 .LBB1285:
-	.loc 1 493 0
+	.loc 1 485 0
 	str	wzr, [x21, 72]
-	.loc 1 494 0
+	.loc 1 486 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.2
 .LVL396:
 .LBE1285:
 .LBE1284:
-	.loc 1 524 0
+	.loc 1 517 0
 	ldp	x1, x2, [x19, 128]
 	mov	x4, x19
 	ldr	x3, [x19, 160]
 	ldr	x0, [x19, 184]
 	bl	get_auto_image
 .LVL397:
-.L427:
-	.loc 1 568 0
+.L430:
+	.loc 1 561 0
 	ldp	x19, x20, [sp, 16]
 .LVL398:
 	ldr	x21, [sp, 32]
@@ -4292,55 +4300,37 @@ ebc_frame_start:
 	ret
 .LVL399:
 	.p2align 3
-.L430:
+.L446:
 	.cfi_restore_state
-	.loc 1 502 0
-	sub	w0, w0, #7
-	cmp	w0, 5
-	bhi	.L428
-	.loc 1 543 0
-	ldr	x2, [x19, 208]
-	.loc 1 540 0
-	ldrb	w4, [x19, 32]
-	str	w4, [x19, 40]
-	.loc 1 541 0
+	.loc 1 494 0
+	cmp	w0, 1
+	bne	.L431
+.L435:
+	.loc 1 497 0
 	ldr	x0, [x19, 176]
-	mov	w3, w4
-	ldr	x5, [x20, 296]
-	ldr	x2, [x2, 16]
-	ldr	x1, [x1, 16]
-	bl	direct_mode_data_change_part.isra.1
+	mov	x4, x19
+	ldp	x1, x2, [x19, 128]
+	ldr	x3, [x19, 160]
+	bl	get_auto_image
 .LVL400:
+	.loc 1 502 0
+	ldr	w0, [x19, 36]
+	cbz	w0, .L436
 .LBB1286:
 .LBB1287:
-	.loc 1 493 0
+	.loc 1 485 0
 	str	wzr, [x21, 72]
-	.loc 1 494 0
+	.loc 1 486 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.2
 .LVL401:
 .LBE1287:
 .LBE1286:
-	.loc 1 546 0
-	ldr	w4, [x19, 40]
-	.loc 1 548 0
-	ldp	x2, x1, [x19, 208]
-	.loc 1 546 0
-	sub	w4, w4, #1
-	str	w4, [x19, 40]
-	.loc 1 547 0
-	ldr	x0, [x19, 184]
-	ldrb	w3, [x20, 216]
-	ldr	x5, [x20, 296]
-	ldr	x1, [x1, 16]
-	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change_part.isra.1
-.LVL402:
-	.loc 1 568 0
+	.loc 1 561 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL403:
+.LVL402:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -4350,32 +4340,54 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL404:
+.LVL403:
 	.p2align 3
-.L429:
+.L432:
 	.cfi_restore_state
-	.loc 1 504 0
+	.loc 1 494 0
+	cmp	w0, 18
+	beq	.L435
+.L431:
+	.loc 1 549 0
+	ldr	x2, [x19, 208]
+	.loc 1 546 0
+	ldrb	w4, [x19, 32]
+	str	w4, [x19, 40]
+	.loc 1 547 0
 	ldr	x0, [x19, 176]
-	mov	x4, x19
-	ldp	x1, x2, [x19, 128]
-	ldr	x3, [x19, 160]
-	bl	get_auto_image
-.LVL405:
-	.loc 1 509 0
-	ldr	w0, [x19, 36]
-	cbz	w0, .L433
+	mov	w3, w4
+	ldr	x5, [x20, 296]
+	ldr	x2, [x2, 16]
+	ldr	x1, [x1, 16]
+	bl	direct_mode_data_change.isra.0
+.LVL404:
 .LBB1288:
 .LBB1289:
-	.loc 1 493 0
+	.loc 1 485 0
 	str	wzr, [x21, 72]
-	.loc 1 494 0
+	.loc 1 486 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.2
-.LVL406:
+.LVL405:
 .LBE1289:
 .LBE1288:
-	.loc 1 568 0
+	.loc 1 552 0
+	ldr	w4, [x19, 40]
+	.loc 1 554 0
+	ldp	x2, x1, [x19, 208]
+	.loc 1 552 0
+	sub	w4, w4, #1
+	str	w4, [x19, 40]
+	.loc 1 553 0
+	ldr	x0, [x19, 184]
+	ldrb	w3, [x20, 216]
+	ldr	x5, [x20, 296]
+	ldr	x1, [x1, 16]
+	ldr	x2, [x2, 16]
+	bl	direct_mode_data_change.isra.0
+.LVL406:
+	.loc 1 561 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 .LVL407:
@@ -4390,48 +4402,48 @@ ebc_frame_start:
 	ret
 .LVL408:
 	.p2align 3
-.L428:
+.L433:
 	.cfi_restore_state
-	.loc 1 556 0
+	.loc 1 536 0
 	ldr	x2, [x19, 208]
-	.loc 1 553 0
+	.loc 1 533 0
 	ldrb	w4, [x19, 32]
 	str	w4, [x19, 40]
-	.loc 1 554 0
+	.loc 1 534 0
 	ldr	x0, [x19, 176]
 	mov	w3, w4
 	ldr	x5, [x20, 296]
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
-	bl	direct_mode_data_change.isra.0
+	bl	direct_mode_data_change_part.isra.1
 .LVL409:
 .LBB1290:
 .LBB1291:
-	.loc 1 493 0
+	.loc 1 485 0
 	str	wzr, [x21, 72]
-	.loc 1 494 0
+	.loc 1 486 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.2
 .LVL410:
 .LBE1291:
 .LBE1290:
-	.loc 1 559 0
+	.loc 1 539 0
 	ldr	w4, [x19, 40]
-	.loc 1 561 0
+	.loc 1 541 0
 	ldp	x2, x1, [x19, 208]
-	.loc 1 559 0
+	.loc 1 539 0
 	sub	w4, w4, #1
 	str	w4, [x19, 40]
-	.loc 1 560 0
+	.loc 1 540 0
 	ldr	x0, [x19, 184]
 	ldrb	w3, [x20, 216]
 	ldr	x5, [x20, 296]
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change.isra.0
+	bl	direct_mode_data_change_part.isra.1
 .LVL411:
-	.loc 1 568 0
+	.loc 1 561 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 .LVL412:
@@ -4445,29 +4457,29 @@ ebc_frame_start:
 	.cfi_def_cfa 31, 0
 	ret
 .LVL413:
-.L435:
+.L438:
 	.cfi_restore_state
-	.loc 1 530 0
+	.loc 1 523 0
 	adrp	x1, .LANCHOR3
 	adrp	x0, .LC20
 	add	x1, x1, :lo12:.LANCHOR3
 	add	x0, x0, :lo12:.LC20
 	bl	printk
 .LVL414:
-	.loc 1 531 0
+	.loc 1 524 0
 	str	wzr, [x19, 28]
-	b	.L427
-.L433:
-	.loc 1 512 0
+	b	.L430
+.L436:
+	.loc 1 505 0
 	adrp	x1, .LANCHOR3
 	adrp	x0, .LC19
 	add	x1, x1, :lo12:.LANCHOR3
 	add	x0, x0, :lo12:.LC19
 	bl	printk
 .LVL415:
-	.loc 1 513 0
+	.loc 1 506 0
 	str	wzr, [x19, 28]
-	b	.L427
+	b	.L430
 	.cfi_endproc
 .LFE2814:
 	.size	ebc_frame_start, .-ebc_frame_start
@@ -4476,16 +4488,16 @@ ebc_frame_start:
 	.type	ebc_auto_tast_function, %function
 ebc_auto_tast_function:
 .LFB2815:
-	.loc 1 571 0
+	.loc 1 564 0
 	.cfi_startproc
 .LVL416:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
 	.cfi_offset 30, -88
-	.loc 1 572 0
+	.loc 1 565 0
 	adrp	x1, .LANCHOR0
-	.loc 1 571 0
+	.loc 1 564 0
 	adrp	x0, __stack_chk_guard
 .LVL417:
 	add	x0, x0, :lo12:__stack_chk_guard
@@ -4496,16 +4508,16 @@ ebc_auto_tast_function:
 	.cfi_offset 20, -72
 	adrp	x20, .LANCHOR1
 	stp	x21, x22, [sp, 32]
-	.loc 1 577 0
+	.loc 1 570 0
 	add	x20, x20, :lo12:.LANCHOR1
 	.cfi_offset 21, -64
 	.cfi_offset 22, -56
-	.loc 1 572 0
+	.loc 1 565 0
 	ldr	x22, [x1, #:lo12:.LANCHOR0]
 .LVL418:
-	.loc 1 577 0
+	.loc 1 570 0
 	add	x20, x20, 376
-	.loc 1 571 0
+	.loc 1 564 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
@@ -4518,16 +4530,16 @@ ebc_auto_tast_function:
 .LBE1294:
 .LBE1293:
 .LBE1292:
-	.loc 1 571 0
+	.loc 1 564 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -32
 	.cfi_offset 26, -24
-	.loc 1 573 0
+	.loc 1 566 0
 	add	x21, x22, 24
-	.loc 1 574 0
+	.loc 1 567 0
 	add	x19, x22, 184
 	add	x26, x22, 736
-	.loc 1 571 0
+	.loc 1 564 0
 	ldr	x1, [x0]
 	str	x1, [x29, 88]
 	mov	x1,0
@@ -4542,47 +4554,24 @@ ebc_auto_tast_function:
 // 0 "" 2
 .LVL419:
 #NO_APP
-	b	.L448
+	b	.L457
 	.p2align 3
 .L456:
 .LBE1297:
 .LBE1296:
 .LBE1299:
-	.loc 1 582 0
-	cbnz	w0, .L439
-	.loc 1 592 0
-	ldr	w1, [x22, 208]
-	mov	x0, x21
-	bl	flip.isra.2
-.LVL420:
-	.loc 1 593 0
-	ldrsw	x0, [x21, 72]
-	mov	x4, x19
-	ldp	x1, x2, [x19, 128]
-	add	x0, x0, 22
-	ldr	x3, [x19, 160]
-	ldr	x0, [x19, x0, lsl 3]
-	bl	get_auto_image
-.LVL421:
-.L444:
-	.loc 1 627 0
-	ldr	x0, [x19, 216]
-	ldr	w0, [x0, 40]
-	cmp	w0, 1
-	bls	.L455
-.L447:
-	.loc 1 631 0
+	.loc 1 626 0
 	mov	x0, x20
 	bl	up
-.LVL422:
-	.loc 1 632 0
+.LVL420:
+	.loc 1 627 0
 	bl	schedule
-.LVL423:
-.L448:
-	.loc 1 577 0
+.LVL421:
+.L457:
+	.loc 1 570 0
 	mov	x0, x20
 	bl	down
-.LVL424:
+.LVL422:
 .LBB1300:
 .LBB1298:
 .LBB1295:
@@ -4591,55 +4580,46 @@ ebc_auto_tast_function:
 .LBE1295:
 .LBE1298:
 .LBE1300:
-	.loc 1 581 0
+	.loc 1 574 0
 #APP
-// 581 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
+// 574 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
 	dmb ish
 // 0 "" 2
-	.loc 1 582 0
+	.loc 1 575 0
 #NO_APP
 	ldr	x0, [x19, 216]
 	ldr	w0, [x0, 40]
+	cmp	w0, 12
+	bgt	.L449
+	cmp	w0, 7
+	bge	.L450
+	cbz	w0, .L451
 	cmp	w0, 1
-	beq	.L440
-	ble	.L456
-	sub	w0, w0, #7
-	cmp	w0, 5
-	bhi	.L439
-	.loc 1 605 0
-	ldr	w1, [x19, 40]
-	.loc 1 606 0
-	mov	x0, x21
-	.loc 1 605 0
-	sub	w1, w1, #1
-	str	w1, [x19, 40]
-	.loc 1 606 0
-	ldr	w1, [x22, 208]
-	bl	flip.isra.2
-.LVL425:
-	.loc 1 607 0
-	ldr	w4, [x19, 40]
-	cbz	w4, .L444
-	.loc 1 609 0
+	bne	.L448
+.L452:
+	.loc 1 578 0
 	ldrsw	x0, [x21, 72]
-	.loc 1 610 0
-	ldp	x2, x1, [x19, 208]
-	.loc 1 609 0
+	mov	x4, x19
+	ldp	x1, x2, [x19, 128]
 	add	x0, x0, 22
-	ldrb	w3, [x22, 216]
-	ldr	x5, [x22, 296]
+	ldr	x3, [x19, 160]
 	ldr	x0, [x19, x0, lsl 3]
-	ldr	x1, [x1, 16]
-	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change_part.isra.1
-.LVL426:
-	.loc 1 627 0
+	bl	get_auto_image
+.LVL423:
+	.loc 1 583 0
+	ldr	w1, [x22, 208]
+	mov	x0, x21
+	bl	flip.isra.2
+.LVL424:
+.L453:
+	.loc 1 621 0
 	ldr	x0, [x19, 216]
 	ldr	w0, [x0, 40]
+	.loc 1 623 0
 	cmp	w0, 1
-	bhi	.L447
-	.p2align 2
-.L455:
+	.loc 1 621 0
+	ccmp	w0, 18, 4, hi
+	bne	.L456
 .LBB1301:
 .LBB1302:
 .LBB1303:
@@ -4650,15 +4630,55 @@ ebc_auto_tast_function:
 	mov	x2, x26
 	mov	w0, 8
 	bl	queue_work_on
-.LVL427:
-	b	.L447
+.LVL425:
+	b	.L456
 	.p2align 3
-.L440:
+.L449:
 .LBE1304:
 .LBE1303:
 .LBE1302:
 .LBE1301:
-	.loc 1 584 0
+	.loc 1 575 0
+	cmp	w0, 18
+	beq	.L452
+.L448:
+	.loc 1 609 0
+	ldr	w1, [x19, 40]
+	.loc 1 610 0
+	mov	x0, x21
+	.loc 1 609 0
+	sub	w1, w1, #1
+	str	w1, [x19, 40]
+	.loc 1 610 0
+	ldr	w1, [x22, 208]
+	bl	flip.isra.2
+.LVL426:
+	.loc 1 611 0
+	ldr	w4, [x19, 40]
+	cbz	w4, .L453
+	.loc 1 613 0
+	ldrsw	x0, [x21, 72]
+	.loc 1 614 0
+	ldp	x2, x1, [x19, 208]
+	.loc 1 613 0
+	add	x0, x0, 22
+	ldrb	w3, [x22, 216]
+	ldr	x5, [x22, 296]
+	ldr	x0, [x19, x0, lsl 3]
+	ldr	x1, [x1, 16]
+	ldr	x2, [x2, 16]
+	bl	direct_mode_data_change.isra.0
+.LVL427:
+	.loc 1 617 0
+	b	.L453
+	.p2align 3
+.L451:
+	.loc 1 586 0
+	ldr	w1, [x22, 208]
+	mov	x0, x21
+	bl	flip.isra.2
+.LVL428:
+	.loc 1 587 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 128]
@@ -4666,45 +4686,40 @@ ebc_auto_tast_function:
 	ldr	x3, [x19, 160]
 	ldr	x0, [x19, x0, lsl 3]
 	bl	get_auto_image
-.LVL428:
-	.loc 1 589 0
-	ldr	w1, [x22, 208]
-	mov	x0, x21
-	bl	flip.isra.2
 .LVL429:
-	.loc 1 590 0
-	b	.L444
+	.loc 1 592 0
+	b	.L453
 	.p2align 3
-.L439:
-	.loc 1 615 0
+.L450:
+	.loc 1 599 0
 	ldr	w1, [x19, 40]
-	.loc 1 616 0
+	.loc 1 600 0
 	mov	x0, x21
-	.loc 1 615 0
+	.loc 1 599 0
 	sub	w1, w1, #1
 	str	w1, [x19, 40]
-	.loc 1 616 0
+	.loc 1 600 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.2
 .LVL430:
-	.loc 1 617 0
+	.loc 1 601 0
 	ldr	w4, [x19, 40]
-	cbz	w4, .L444
-	.loc 1 619 0
+	cbz	w4, .L453
+	.loc 1 603 0
 	ldrsw	x0, [x21, 72]
-	.loc 1 620 0
+	.loc 1 604 0
 	ldp	x2, x1, [x19, 208]
-	.loc 1 619 0
+	.loc 1 603 0
 	add	x0, x0, 22
 	ldrb	w3, [x22, 216]
 	ldr	x5, [x22, 296]
 	ldr	x0, [x19, x0, lsl 3]
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change.isra.0
+	bl	direct_mode_data_change_part.isra.1
 .LVL431:
-	.loc 1 623 0
-	b	.L444
+	.loc 1 607 0
+	b	.L453
 	.cfi_endproc
 .LFE2815:
 	.size	ebc_auto_tast_function, .-ebc_auto_tast_function
@@ -4740,7 +4755,7 @@ ebc_power_set.part.3:
 .LVL434:
 	.loc 1 186 0
 	ldr	w0, [x20, 432]
-	cbnz	w0, .L458
+	cbnz	w0, .L473
 	.loc 1 187 0
 	mov	w0, 1
 	str	w0, [x20, 432]
@@ -4750,7 +4765,7 @@ ebc_power_set.part.3:
 	add	x0, x19, 408
 	bl	__pm_stay_awake
 .LVL435:
-.L458:
+.L473:
 .LBE1306:
 .LBE1305:
 	.loc 1 190 0
@@ -4811,7 +4826,7 @@ ebc_power_set.part.3:
 	.type	ebc_probe, %function
 ebc_probe:
 .LFB2840:
-	.loc 1 1795 0
+	.loc 1 1800 0
 	.cfi_startproc
 .LVL441:
 	stp	x29, x30, [sp, -208]!
@@ -4825,15 +4840,15 @@ ebc_probe:
 	movk	w2, 0x60, lsl 16
 .LBE1461:
 .LBE1460:
-	.loc 1 1795 0
+	.loc 1 1800 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -192
 	.cfi_offset 20, -184
-	.loc 1 1796 0
+	.loc 1 1801 0
 	add	x20, x0, 16
-	.loc 1 1795 0
+	.loc 1 1800 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -160
 	.cfi_offset 24, -152
@@ -4849,7 +4864,7 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 1795 0
+	.loc 1 1800 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
@@ -4862,31 +4877,31 @@ ebc_probe:
 .LVL443:
 .LBE1462:
 .LBE1463:
-	.loc 1 1807 0
-	cbz	x0, .L505
-	.loc 1 1811 0
+	.loc 1 1812 0
+	cbz	x0, .L520
+	.loc 1 1816 0
 	adrp	x25, .LANCHOR0
 	mov	x19, x0
-	.loc 1 1813 0
+	.loc 1 1818 0
 	adrp	x1, .LC22
 	mov	w2, 0
-	.loc 1 1811 0
+	.loc 1 1816 0
 	str	x0, [x25, #:lo12:.LANCHOR0]
-	.loc 1 1813 0
+	.loc 1 1818 0
 	add	x1, x1, :lo12:.LC22
 	ldr	x0, [x20, 752]
-	.loc 1 1810 0
+	.loc 1 1815 0
 	str	x20, [x19]
-	.loc 1 1813 0
+	.loc 1 1818 0
 	bl	of_parse_phandle
 .LVL444:
-	.loc 1 1814 0
-	cbz	x0, .L548
 	.loc 1 1819 0
+	cbz	x0, .L563
+	.loc 1 1824 0
 	bl	of_find_device_by_node
 .LVL445:
-	.loc 1 1821 0
-	cbz	x0, .L464
+	.loc 1 1826 0
+	cbz	x0, .L479
 .LBB1464:
 .LBB1465:
 .LBB1466:
@@ -4896,28 +4911,28 @@ ebc_probe:
 .LBE1466:
 .LBE1465:
 .LBE1464:
-	.loc 1 1824 0
+	.loc 1 1829 0
 	str	x0, [x19, 8]
-	.loc 1 1825 0
-	cbz	x0, .L464
-	.loc 1 1827 0
+	.loc 1 1830 0
+	cbz	x0, .L479
+	.loc 1 1832 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 1829 0
+	.loc 1 1834 0
 	mov	w2, 0
 	adrp	x1, .LC24
 	add	x1, x1, :lo12:.LC24
 	ldr	x0, [x20, 752]
 	bl	of_parse_phandle
 .LVL447:
-	.loc 1 1830 0
-	cbz	x0, .L549
 	.loc 1 1835 0
+	cbz	x0, .L564
+	.loc 1 1840 0
 	bl	of_find_i2c_device_by_node
 .LVL448:
-	.loc 1 1837 0
-	cbz	x0, .L550
+	.loc 1 1842 0
+	cbz	x0, .L565
 .LBB1467:
 .LBB1468:
 .LBB1469:
@@ -4927,16 +4942,16 @@ ebc_probe:
 .LBE1469:
 .LBE1468:
 .LBE1467:
-	.loc 1 1841 0
+	.loc 1 1846 0
 	str	x0, [x19, 16]
-	.loc 1 1842 0
-	cbz	x0, .L551
-	.loc 1 1848 0
+	.loc 1 1847 0
+	cbz	x0, .L566
+	.loc 1 1853 0
 	add	x21, x19, 184
 .LVL450:
-	.loc 1 1850 0
+	.loc 1 1855 0
 	add	x22, x19, 24
-	.loc 1 1848 0
+	.loc 1 1853 0
 	str	x20, [x21, 88]
 .LBB1470:
 .LBB1471:
@@ -4951,7 +4966,7 @@ ebc_probe:
 .LBE1472:
 .LBE1471:
 .LBE1470:
-	.loc 1 1850 0
+	.loc 1 1855 0
 	str	x20, [x19, 24]
 .LBB1569:
 .LBB1565:
@@ -4965,7 +4980,7 @@ ebc_probe:
 .LBE1481:
 .LBE1565:
 .LBE1569:
-	.loc 1 1851 0
+	.loc 1 1856 0
 	ldr	x2, [x19, 8]
 .LBB1570:
 .LBB1566:
@@ -4979,7 +4994,7 @@ ebc_probe:
 .LBE1482:
 .LBE1566:
 .LBE1570:
-	.loc 1 1852 0
+	.loc 1 1857 0
 	stp	x2, x0, [x22, 8]
 .LBB1571:
 .LBB1567:
@@ -4993,7 +5008,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL451:
 	.loc 14 501 0
-	tbnz	w0, #31, .L469
+	tbnz	w0, #31, .L484
 .LBE1477:
 .LBE1480:
 .LBE1483:
@@ -5010,7 +5025,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL452:
 	.loc 14 501 0
-	tbnz	w0, #31, .L469
+	tbnz	w0, #31, .L484
 .LBE1486:
 .LBE1485:
 .LBE1484:
@@ -5027,7 +5042,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL453:
 	.loc 14 501 0
-	tbnz	w0, #31, .L469
+	tbnz	w0, #31, .L484
 .LBE1489:
 .LBE1488:
 .LBE1487:
@@ -5044,7 +5059,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL454:
 	.loc 14 501 0
-	tbnz	w0, #31, .L469
+	tbnz	w0, #31, .L484
 .LBE1492:
 .LBE1491:
 .LBE1490:
@@ -5061,7 +5076,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL455:
 	.loc 14 501 0
-	tbnz	w0, #31, .L469
+	tbnz	w0, #31, .L484
 .LBE1495:
 .LBE1494:
 .LBE1493:
@@ -5078,7 +5093,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL456:
 	.loc 14 501 0
-	tbnz	w0, #31, .L469
+	tbnz	w0, #31, .L484
 .LBE1498:
 .LBE1497:
 .LBE1496:
@@ -5095,7 +5110,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL457:
 	.loc 14 501 0
-	tbnz	w0, #31, .L469
+	tbnz	w0, #31, .L484
 .LBE1501:
 .LBE1500:
 .LBE1499:
@@ -5112,7 +5127,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL458:
 	.loc 14 501 0
-	tbnz	w0, #31, .L469
+	tbnz	w0, #31, .L484
 .LBE1504:
 .LBE1503:
 .LBE1502:
@@ -5129,7 +5144,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL459:
 	.loc 14 501 0
-	tbnz	w0, #31, .L469
+	tbnz	w0, #31, .L484
 .LBE1507:
 .LBE1506:
 .LBE1505:
@@ -5146,7 +5161,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL460:
 	.loc 14 501 0
-	tbnz	w0, #31, .L469
+	tbnz	w0, #31, .L484
 .LBE1510:
 .LBE1509:
 .LBE1508:
@@ -5163,7 +5178,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL461:
 	.loc 14 501 0
-	tbnz	w0, #31, .L469
+	tbnz	w0, #31, .L484
 .LBE1513:
 .LBE1512:
 .LBE1511:
@@ -5180,7 +5195,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL462:
 	.loc 14 501 0
-	tbnz	w0, #31, .L469
+	tbnz	w0, #31, .L484
 .LBE1516:
 .LBE1515:
 .LBE1514:
@@ -5197,7 +5212,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL463:
 	.loc 14 501 0
-	tbnz	w0, #31, .L469
+	tbnz	w0, #31, .L484
 .LBE1519:
 .LBE1518:
 .LBE1517:
@@ -5214,7 +5229,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL464:
 	.loc 14 501 0
-	tbnz	w0, #31, .L469
+	tbnz	w0, #31, .L484
 .LBE1522:
 .LBE1521:
 .LBE1520:
@@ -5231,7 +5246,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL465:
 	.loc 14 501 0
-	tbnz	w0, #31, .L469
+	tbnz	w0, #31, .L484
 .LBE1525:
 .LBE1524:
 .LBE1523:
@@ -5248,7 +5263,7 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL466:
 	.loc 14 501 0
-	tbnz	w0, #31, .L552
+	tbnz	w0, #31, .L567
 .LBE1528:
 .LBE1527:
 .LBE1526:
@@ -5265,8 +5280,8 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL467:
 	.loc 14 501 0
-	tbnz	w0, #31, .L470
-.L496:
+	tbnz	w0, #31, .L485
+.L511:
 .LBE1531:
 .LBE1530:
 .LBE1529:
@@ -5283,8 +5298,8 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL468:
 	.loc 14 501 0
-	tbnz	w0, #31, .L471
-.L497:
+	tbnz	w0, #31, .L486
+.L512:
 .LBE1538:
 .LBE1537:
 .LBE1536:
@@ -5301,8 +5316,8 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL469:
 	.loc 14 501 0
-	tbnz	w0, #31, .L472
-.L498:
+	tbnz	w0, #31, .L487
+.L513:
 .LBE1545:
 .LBE1544:
 .LBE1543:
@@ -5319,59 +5334,59 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL470:
 	.loc 14 501 0
-	tbnz	w0, #31, .L473
-.L499:
+	tbnz	w0, #31, .L488
+.L514:
 .LBE1552:
 .LBE1551:
 .LBE1550:
 .LBE1567:
 .LBE1571:
-	.loc 1 1860 0
+	.loc 1 1865 0
 	ldr	w0, [x22, 88]
 .LBB1572:
 .LBB1573:
-	.loc 1 1597 0
+	.loc 1 1602 0
 	mov	w2, 0
 .LBE1573:
 .LBE1572:
-	.loc 1 1860 0
+	.loc 1 1865 0
 	str	w0, [x21, 52]
-	.loc 1 1861 0
+	.loc 1 1866 0
 	ldr	w1, [x22, 84]
 	str	w1, [x21, 56]
-	.loc 1 1862 0
+	.loc 1 1867 0
 	mul	w0, w0, w1
 .LBB1601:
 .LBB1596:
-	.loc 1 1597 0
+	.loc 1 1602 0
 	adrp	x1, .LC33
 	add	x1, x1, :lo12:.LC33
 .LBE1596:
 .LBE1601:
-	.loc 1 1862 0
+	.loc 1 1867 0
 	lsr	w3, w0, 1
-	.loc 1 1863 0
+	.loc 1 1868 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x21, 20]
 .LBB1602:
 .LBB1597:
-	.loc 1 1588 0
+	.loc 1 1593 0
 	ldr	x26, [x19]
 .LVL471:
-	.loc 1 1597 0
+	.loc 1 1602 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL472:
-	.loc 1 1598 0
-	cbz	x0, .L506
-	.loc 1 1601 0
+	.loc 1 1603 0
+	cbz	x0, .L521
+	.loc 1 1606 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL473:
 	mov	w24, w0
-	.loc 1 1603 0
-	cbnz	w0, .L553
+	.loc 1 1608 0
+	cbnz	w0, .L568
 .LBB1574:
 .LBB1575:
 	.file 15 "./include/linux/ioport.h"
@@ -5379,9 +5394,9 @@ ebc_probe:
 	ldp	x1, x2, [x29, 104]
 .LBE1575:
 .LBE1574:
-	.loc 1 1608 0
+	.loc 1 1613 0
 	str	x1, [x19, 184]
-	.loc 1 1611 0
+	.loc 1 1616 0
 	mov	x3, 1
 	mov	x0, x26
 .LBB1577:
@@ -5391,16 +5406,16 @@ ebc_probe:
 	sub	x2, x2, x1
 .LBE1576:
 .LBE1577:
-	.loc 1 1609 0
+	.loc 1 1614 0
 	str	w2, [x21, 16]
-	.loc 1 1611 0
+	.loc 1 1616 0
 	sxtw	x2, w2
 	bl	devm_memremap
 .LVL474:
 	str	x0, [x21, 8]
-	.loc 1 1613 0
-	cbz	x0, .L477
-	.loc 1 1621 0
+	.loc 1 1618 0
+	cbz	x0, .L492
+	.loc 1 1626 0
 	mov	x1, x0
 	ldr	w2, [x21, 16]
 	ldr	x0, [x19, 184]
@@ -5408,11 +5423,11 @@ ebc_probe:
 	mov	w3, 2097152
 	bl	ebc_buf_init
 .LVL475:
-	.loc 1 1622 0
-	cbnz	w0, .L477
 	.loc 1 1627 0
+	cbnz	w0, .L492
+	.loc 1 1632 0
 	ldr	x0, [x21, 8]
-	.loc 1 1628 0
+	.loc 1 1633 0
 	mov	x5, 1048576
 	str	x5, [x22, 40]
 .LBB1578:
@@ -5421,13 +5436,13 @@ ebc_probe:
 	mov	w2, 32960
 .LBE1579:
 .LBE1578:
-	.loc 1 1627 0
+	.loc 1 1632 0
 	add	x6, x0, 10485760
 	str	x6, [x22, 24]
 	add	x4, x0, 11534336
-	.loc 1 1633 0
+	.loc 1 1638 0
 	add	x1, x0, 12582912
-	.loc 1 1629 0
+	.loc 1 1634 0
 	ldr	x3, [x19, 184]
 .LBB1583:
 .LBB1580:
@@ -5436,18 +5451,18 @@ ebc_probe:
 	mov	x0, x26
 .LBE1580:
 .LBE1583:
-	.loc 1 1629 0
+	.loc 1 1634 0
 	add	x7, x3, 10485760
 	str	x7, [x22, 32]
-	.loc 1 1630 0
+	.loc 1 1635 0
 	str	x6, [x21, 176]
-	.loc 1 1629 0
+	.loc 1 1634 0
 	add	x3, x3, 11534336
-	.loc 1 1628 0
+	.loc 1 1633 0
 	str	x5, [x22, 64]
-	.loc 1 1629 0
+	.loc 1 1634 0
 	stp	x4, x3, [x22, 48]
-	.loc 1 1633 0
+	.loc 1 1638 0
 	str	x1, [x21, 112]
 .LBB1584:
 .LBB1581:
@@ -5455,7 +5470,7 @@ ebc_probe:
 	ldrsw	x1, [x21, 20]
 .LBE1581:
 .LBE1584:
-	.loc 1 1630 0
+	.loc 1 1635 0
 	str	x4, [x21, 184]
 .LBB1585:
 .LBB1582:
@@ -5464,10 +5479,10 @@ ebc_probe:
 .LVL476:
 .LBE1582:
 .LBE1585:
-	.loc 1 1636 0
+	.loc 1 1641 0
 	str	x0, [x21, 128]
-	.loc 1 1637 0
-	cbz	x0, .L477
+	.loc 1 1642 0
+	cbz	x0, .L492
 .LBB1586:
 .LBB1587:
 	.loc 2 711 0
@@ -5479,10 +5494,10 @@ ebc_probe:
 .LVL477:
 .LBE1587:
 .LBE1586:
-	.loc 1 1639 0
+	.loc 1 1644 0
 	str	x0, [x21, 136]
-	.loc 1 1640 0
-	cbz	x0, .L477
+	.loc 1 1645 0
+	cbz	x0, .L492
 .LBB1588:
 .LBB1589:
 	.loc 2 711 0
@@ -5494,10 +5509,10 @@ ebc_probe:
 .LVL478:
 .LBE1589:
 .LBE1588:
-	.loc 1 1642 0
+	.loc 1 1647 0
 	str	x0, [x21, 144]
-	.loc 1 1643 0
-	cbz	x0, .L477
+	.loc 1 1648 0
+	cbz	x0, .L492
 .LBB1590:
 .LBB1591:
 	.loc 2 711 0
@@ -5509,11 +5524,11 @@ ebc_probe:
 .LVL479:
 .LBE1591:
 .LBE1590:
-	.loc 1 1645 0
-	str	x0, [x21, 152]
-	.loc 1 1646 0
-	cbz	x0, .L477
 	.loc 1 1650 0
+	str	x0, [x21, 152]
+	.loc 1 1651 0
+	cbz	x0, .L492
+	.loc 1 1655 0
 	ldp	w1, w2, [x22, 84]
 .LBB1592:
 .LBB1593:
@@ -5521,7 +5536,7 @@ ebc_probe:
 	mov	x0, x26
 .LBE1593:
 .LBE1592:
-	.loc 1 1650 0
+	.loc 1 1655 0
 	mul	w1, w1, w2
 .LBB1595:
 .LBB1594:
@@ -5533,18 +5548,18 @@ ebc_probe:
 .LVL480:
 .LBE1594:
 .LBE1595:
-	.loc 1 1650 0
+	.loc 1 1655 0
 	str	x0, [x21, 160]
-	.loc 1 1651 0
-	cbz	x0, .L477
-	.loc 1 1653 0
+	.loc 1 1656 0
+	cbz	x0, .L492
+	.loc 1 1658 0
 	ldp	w2, w1, [x22, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	lsr	w2, w2, 4
 	bl	memset
 .LVL481:
-	.loc 1 1654 0
+	.loc 1 1659 0
 	ldrsw	x2, [x21, 20]
 	mov	w1, 255
 	ldr	x0, [x21, 144]
@@ -5554,60 +5569,60 @@ ebc_probe:
 .LBE1602:
 .LBB1603:
 .LBB1604:
-	.loc 1 1548 0
+	.loc 1 1553 0
 	ldr	x26, [x19, 272]
 .LVL483:
-	.loc 1 1554 0
+	.loc 1 1559 0
 	adrp	x1, .LC35
 	mov	w2, 0
 	add	x1, x1, :lo12:.LC35
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL484:
-	.loc 1 1555 0
-	cbz	x0, .L507
-	.loc 1 1558 0
+	.loc 1 1560 0
+	cbz	x0, .L522
+	.loc 1 1563 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL485:
 	mov	w24, w0
-	.loc 1 1560 0
-	cbz	w0, .L554
+	.loc 1 1565 0
+	cbz	w0, .L569
 .LVL486:
-.L478:
+.L493:
 .LBE1604:
 .LBE1603:
-	.loc 1 1875 0
+	.loc 1 1880 0
 	adrp	x1, .LC68
 	mov	x0, x20
 .LVL487:
 	add	x1, x1, :lo12:.LC68
 	bl	_dev_err
 .LVL488:
-	.loc 1 1876 0
-	b	.L460
+	.loc 1 1881 0
+	b	.L475
 .LVL489:
 	.p2align 3
-.L469:
-	.loc 1 1858 0
+.L484:
+	.loc 1 1863 0
 	mov	w24, -22
-	.loc 1 1857 0
+	.loc 1 1862 0
 	adrp	x1, .LC72
 	mov	w2, w24
 	add	x1, x1, :lo12:.LC72
 	mov	x0, x20
 	bl	_dev_err
 .LVL490:
-.L460:
-	.loc 1 1900 0
+.L475:
+	.loc 1 1905 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w24
 .LVL491:
 	ldr	x2, [x29, 200]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L555
+	cbnz	x1, .L570
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 .LVL492:
@@ -5634,37 +5649,37 @@ ebc_probe:
 	ret
 .LVL495:
 	.p2align 3
-.L553:
+.L568:
 	.cfi_restore_state
 .LBB1611:
 .LBB1598:
-	.loc 1 1604 0
+	.loc 1 1609 0
 	adrp	x1, .LC34
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC34
 	bl	_dev_err
 .LVL496:
-.L474:
+.L489:
 .LBE1598:
 .LBE1611:
-	.loc 1 1868 0
+	.loc 1 1873 0
 	adrp	x1, .LC67
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC67
 	bl	_dev_err
 .LVL497:
-	.loc 1 1869 0
-	b	.L460
+	.loc 1 1874 0
+	b	.L475
 .LVL498:
 	.p2align 3
-.L473:
+.L488:
 .LBB1612:
 .LBB1568:
-	.loc 1 1197 0
+	.loc 1 1202 0
 	str	wzr, [x22, 96]
-	b	.L499
+	b	.L514
 	.p2align 3
-.L472:
+.L487:
 .LBB1557:
 .LBB1555:
 .LBB1553:
@@ -5674,7 +5689,7 @@ ebc_probe:
 .LBE1553:
 .LBE1555:
 .LBE1557:
-	.loc 1 1194 0
+	.loc 1 1199 0
 	str	wzr, [x22, 92]
 .LBB1558:
 .LBB1556:
@@ -5687,10 +5702,10 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL499:
 	.loc 14 501 0
-	tbz	w0, #31, .L499
-	b	.L473
+	tbz	w0, #31, .L514
+	b	.L488
 	.p2align 3
-.L471:
+.L486:
 .LBE1554:
 .LBE1556:
 .LBE1558:
@@ -5703,7 +5718,7 @@ ebc_probe:
 .LBE1546:
 .LBE1548:
 .LBE1559:
-	.loc 1 1191 0
+	.loc 1 1196 0
 	str	wzr, [x22, 156]
 .LBB1560:
 .LBB1549:
@@ -5716,10 +5731,10 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL500:
 	.loc 14 501 0
-	tbz	w0, #31, .L498
-	b	.L472
+	tbz	w0, #31, .L513
+	b	.L487
 	.p2align 3
-.L470:
+.L485:
 .LBE1547:
 .LBE1549:
 .LBE1560:
@@ -5732,7 +5747,7 @@ ebc_probe:
 .LBE1539:
 .LBE1541:
 .LBE1561:
-	.loc 1 1188 0
+	.loc 1 1193 0
 	str	wzr, [x22, 152]
 .LBB1562:
 .LBB1542:
@@ -5745,10 +5760,10 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL501:
 	.loc 14 501 0
-	tbz	w0, #31, .L497
-	b	.L471
+	tbz	w0, #31, .L512
+	b	.L486
 	.p2align 3
-.L552:
+.L567:
 .LBE1540:
 .LBE1542:
 .LBE1562:
@@ -5761,7 +5776,7 @@ ebc_probe:
 .LBE1532:
 .LBE1534:
 .LBE1563:
-	.loc 1 1185 0
+	.loc 1 1190 0
 	str	wzr, [x22, 148]
 .LBB1564:
 .LBB1535:
@@ -5774,11 +5789,11 @@ ebc_probe:
 	bl	of_property_read_variable_u32_array
 .LVL502:
 	.loc 14 501 0
-	tbz	w0, #31, .L496
-	b	.L470
+	tbz	w0, #31, .L511
+	b	.L485
 .LVL503:
 	.p2align 3
-.L554:
+.L569:
 .LBE1533:
 .LBE1535:
 .LBE1564:
@@ -5786,7 +5801,7 @@ ebc_probe:
 .LBE1612:
 .LBB1613:
 .LBB1607:
-	.loc 1 1566 0
+	.loc 1 1571 0
 	mov	x0, x26
 	mov	x3, 1
 .LBB1605:
@@ -5798,28 +5813,28 @@ ebc_probe:
 	sub	x26, x26, x1
 .LBE1606:
 .LBE1605:
-	.loc 1 1566 0
+	.loc 1 1571 0
 	sxtw	x2, w26
 	bl	devm_memremap
 .LVL505:
 	str	x0, [x19, 384]
-	.loc 1 1568 0
-	cbz	x0, .L556
 	.loc 1 1573 0
+	cbz	x0, .L571
+	.loc 1 1578 0
 	bl	epd_lut_from_mem_init
 .LVL506:
-	.loc 1 1574 0
-	tbnz	w0, #31, .L557
-.L480:
+	.loc 1 1579 0
+	tbnz	w0, #31, .L572
+.L495:
 .LBE1607:
 .LBE1613:
 .LBB1614:
 .LBB1615:
-	.loc 1 1663 0
+	.loc 1 1668 0
 	add	x0, x19, 744
 	mov	x1, 68719476704
 	str	x1, [x21, 552]
-	.loc 1 1665 0
+	.loc 1 1670 0
 	add	x25, x25, :lo12:.LANCHOR0
 .LBB1616:
 .LBB1617:
@@ -5833,7 +5848,7 @@ ebc_probe:
 .LBE1618:
 .LBE1617:
 .LBE1616:
-	.loc 1 1661 0
+	.loc 1 1666 0
 	mov	w26, 99
 .LBB1622:
 .LBB1621:
@@ -5842,32 +5857,32 @@ ebc_probe:
 	str	x0, [x0, 8]
 .LBE1621:
 .LBE1622:
-	.loc 1 1663 0
+	.loc 1 1668 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x21, 576]
-	.loc 1 1665 0
+	.loc 1 1670 0
 	adrp	x3, .LC69
 	mov	w2, -1
 	add	x3, x3, :lo12:.LC69
 	mov	x1, x21
 	adrp	x0, ebc_auto_tast_function
-	.loc 1 1661 0
+	.loc 1 1666 0
 	str	w26, [x29, 104]
-	.loc 1 1665 0
+	.loc 1 1670 0
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
 .LVL507:
 	str	x0, [x25, 8]
-	.loc 1 1666 0
+	.loc 1 1671 0
 	cmn	x0, #4096
-	bhi	.L558
-	.loc 1 1670 0
+	bhi	.L573
+	.loc 1 1675 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
 .LVL508:
-	.loc 1 1671 0
+	.loc 1 1676 0
 	ldr	x2, [x25, 8]
 .LBB1623:
 .LBB1624:
@@ -5909,7 +5924,7 @@ ebc_probe:
 .LBE1624:
 .LBE1623:
 .LBB1625:
-	.loc 1 1674 0
+	.loc 1 1679 0
 	adrp	x3, .LC40
 	adrp	x0, ebc_thread
 .LVL512:
@@ -5918,27 +5933,27 @@ ebc_probe:
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x21
 .LBE1625:
-	.loc 1 1673 0
+	.loc 1 1678 0
 	str	w26, [x29, 104]
 .LBB1626:
-	.loc 1 1674 0
+	.loc 1 1679 0
 	bl	kthread_create_on_node
 .LVL513:
 	mov	x25, x0
 .LVL514:
 	cmn	x0, #4096
-	bhi	.L482
+	bhi	.L497
 	bl	wake_up_process
 .LVL515:
 .LBE1626:
 	str	x25, [x21, 120]
-	.loc 1 1679 0
+	.loc 1 1684 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x25
 	bl	sched_setscheduler_nocheck
 .LVL516:
-	.loc 1 1680 0
+	.loc 1 1685 0
 	ldr	x2, [x21, 120]
 .LBB1627:
 .LBB1628:
@@ -5982,7 +5997,7 @@ ebc_probe:
 .LBE1614:
 .LBB1631:
 .LBB1632:
-	.loc 1 1689 0
+	.loc 1 1694 0
 	mov	w0, -1
 .LVL520:
 	str	w0, [x21, 48]
@@ -5993,9 +6008,9 @@ ebc_probe:
 .LVL521:
 .LBE1634:
 .LBE1633:
-	.loc 1 1693 0
+	.loc 1 1698 0
 	str	wzr, [x21, 28]
-	.loc 1 1692 0
+	.loc 1 1697 0
 	str	wzr, [x21, 80]
 .LBB1639:
 .LBB1635:
@@ -6003,7 +6018,7 @@ ebc_probe:
 	adrp	x1, .LC41
 .LBE1635:
 .LBE1639:
-	.loc 1 1688 0
+	.loc 1 1693 0
 	str	wzr, [x21, 192]
 .LBB1640:
 .LBB1636:
@@ -6011,14 +6026,14 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC41
 .LBE1636:
 .LBE1640:
-	.loc 1 1690 0
+	.loc 1 1695 0
 	str	wzr, [x21, 600]
-	.loc 1 1700 0
+	.loc 1 1705 0
 	add	x25, x19, 624
 .LVL522:
-	.loc 1 1691 0
+	.loc 1 1696 0
 	str	wzr, [x21, 604]
-	.loc 1 1701 0
+	.loc 1 1706 0
 	adrp	x26, jiffies
 .LBB1641:
 .LBB1637:
@@ -6026,7 +6041,7 @@ ebc_probe:
 	stp	xzr, xzr, [x0]
 .LBE1637:
 .LBE1641:
-	.loc 1 1701 0
+	.loc 1 1706 0
 	mov	x27, 268435455
 .LBB1642:
 .LBB1638:
@@ -6050,9 +6065,9 @@ ebc_probe:
 .LVL523:
 .LBE1638:
 .LBE1642:
-	.loc 1 1697 0
+	.loc 1 1702 0
 	str	wzr, [x21, 432]
-	.loc 1 1700 0
+	.loc 1 1705 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -6061,16 +6076,16 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
 .LVL524:
-	.loc 1 1701 0
+	.loc 1 1706 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
-	.loc 1 1704 0
+	.loc 1 1709 0
 	add	x25, x19, 680
-	.loc 1 1701 0
+	.loc 1 1706 0
 	add	x1, x1, x27
 	bl	mod_timer
 .LVL525:
-	.loc 1 1704 0
+	.loc 1 1709 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -6079,7 +6094,7 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
 .LVL526:
-	.loc 1 1705 0
+	.loc 1 1710 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
 	add	x1, x1, x27
@@ -6089,88 +6104,88 @@ ebc_probe:
 .LBE1631:
 .LBB1643:
 .LBB1644:
-	.loc 1 1715 0
+	.loc 1 1720 0
 	adrp	x0, saved_command_line
 	adrp	x1, .LC42
-	.loc 1 1712 0
+	.loc 1 1717 0
 	stp	wzr, wzr, [x29, 100]
 .LVL528:
-	.loc 1 1715 0
+	.loc 1 1720 0
 	add	x1, x1, :lo12:.LC42
 	ldr	x25, [x0, #:lo12:saved_command_line]
 	mov	x0, x25
 	bl	strstr
 .LVL529:
-	.loc 1 1716 0
+	.loc 1 1721 0
 	adrp	x1, .LC43
-	.loc 1 1715 0
+	.loc 1 1720 0
 	mov	x26, x0
 .LVL530:
-	.loc 1 1716 0
+	.loc 1 1721 0
 	add	x1, x1, :lo12:.LC43
 	mov	x0, x25
 	bl	strstr
 .LVL531:
 	mov	x28, x0
 .LVL532:
-	.loc 1 1721 0
-	cbz	x26, .L483
-	.loc 1 1722 0
+	.loc 1 1726 0
+	cbz	x26, .L498
+	.loc 1 1727 0
 	add	x2, x29, 100
 	adrp	x1, .LC44
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC44
 	bl	sscanf
 .LVL533:
-	.loc 1 1723 0
+	.loc 1 1728 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
-	bls	.L559
-.L483:
-	.loc 1 1735 0
+	bls	.L574
+.L498:
+	.loc 1 1740 0
 	mov	w25, 0
 .LVL534:
 	mov	x27, 0
 .LVL535:
-	.loc 1 1719 0
+	.loc 1 1724 0
 	mov	x26, 0
 .LVL536:
-	.loc 1 1735 0
-	cbz	x28, .L503
+	.loc 1 1740 0
+	cbz	x28, .L518
 .LVL537:
-.L502:
-	.loc 1 1736 0
+.L517:
+	.loc 1 1741 0
 	add	x2, x29, 104
 	mov	x0, x28
 	adrp	x1, .LC47
 	add	x1, x1, :lo12:.LC47
 	bl	sscanf
 .LVL538:
-	.loc 1 1714 0
+	.loc 1 1719 0
 	mov	w28, 0
 .LVL539:
-	.loc 1 1737 0
+	.loc 1 1742 0
 	ldr	w2, [x29, 104]
-	.loc 1 1719 0
+	.loc 1 1724 0
 	mov	x26, 0
 .LVL540:
-	.loc 1 1737 0
+	.loc 1 1742 0
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
-	bls	.L560
-.L487:
-	.loc 1 1749 0
-	cbz	w25, .L503
-.L486:
-	.loc 1 1756 0
+	bls	.L575
+.L502:
+	.loc 1 1754 0
+	cbz	w25, .L518
+.L501:
+	.loc 1 1761 0
 	bl	ebc_empty_buf_get
 .LVL541:
 	mov	x25, x0
 .LVL542:
-	.loc 1 1757 0
-	cbz	x0, .L489
-	.loc 1 1758 0
+	.loc 1 1762 0
+	cbz	x0, .L504
+	.loc 1 1763 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
@@ -6178,45 +6193,45 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL543:
-	.loc 1 1761 0
+	.loc 1 1766 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1759 0
+	.loc 1 1764 0
 	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 1764 0
+	.loc 1 1769 0
 	mov	x0, x25
-	.loc 1 1762 0
+	.loc 1 1767 0
 	ldr	w1, [x22, 84]
 	str	w1, [x25, 56]
-	.loc 1 1763 0
+	.loc 1 1768 0
 	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 1764 0
+	.loc 1 1769 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL544:
-.L489:
-	.loc 1 1768 0
-	cbnz	w28, .L561
-.L491:
-	.loc 1 1781 0
+.L504:
+	.loc 1 1773 0
+	cbnz	w28, .L576
+.L506:
+	.loc 1 1786 0
 	ldr	w0, [x21, 80]
 	adrp	x22, .LANCHOR1
-	cbz	w0, .L562
-.L493:
-	.loc 1 1786 0
-	cbz	x27, .L494
-	.loc 1 1787 0
+	cbz	w0, .L577
+.L508:
+	.loc 1 1791 0
+	cbz	x27, .L509
+	.loc 1 1792 0
 	mov	x0, x27
 	bl	kfree
 .LVL545:
-.L494:
-	.loc 1 1788 0
-	cbz	x26, .L485
-	.loc 1 1789 0
+.L509:
+	.loc 1 1793 0
+	cbz	x26, .L500
+	.loc 1 1794 0
 	mov	x0, x26
 	bl	kfree
 .LVL546:
-.L485:
+.L500:
 .LBE1644:
 .LBE1643:
 .LBB1656:
@@ -6229,44 +6244,44 @@ ebc_probe:
 .LBE1656:
 .LBB1659:
 .LBB1660:
-	.loc 1 1533 0
+	.loc 1 1538 0
 	add	x22, x22, :lo12:.LANCHOR1
 	add	x0, x22, 224
 	bl	misc_register
 .LVL547:
-	.loc 1 1535 0
+	.loc 1 1540 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 400
 	bl	device_create_file
 .LVL548:
-	.loc 1 1536 0
+	.loc 1 1541 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 432
 	bl	device_create_file
 .LVL549:
-	.loc 1 1537 0
+	.loc 1 1542 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 464
 	bl	device_create_file
 .LVL550:
-	.loc 1 1538 0
+	.loc 1 1543 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 496
 	bl	device_create_file
 .LVL551:
-	.loc 1 1539 0
+	.loc 1 1544 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 528
 	bl	device_create_file
 .LVL552:
-	.loc 1 1540 0
+	.loc 1 1545 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 560
 	bl	device_create_file
 .LVL553:
 .LBE1660:
 .LBE1659:
-	.loc 1 1897 0
+	.loc 1 1902 0
 	ldr	x0, [x21, 88]
 	adrp	x2, .LC15
 	adrp	x1, .LC51
@@ -6274,31 +6289,31 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC51
 	bl	_dev_info
 .LVL554:
-	.loc 1 1899 0
-	b	.L460
+	.loc 1 1904 0
+	b	.L475
 .LVL555:
 	.p2align 3
-.L503:
+.L518:
 .LBB1661:
 .LBB1653:
-	.loc 1 1750 0
+	.loc 1 1755 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC50
 	add	x1, x1, :lo12:.LC50
 	bl	_dev_info
 .LVL556:
-	.loc 1 1751 0
+	.loc 1 1756 0
 	ldr	x0, [x19, 16]
 	bl	ebc_pmic_verity_vcom
 .LVL557:
 .LBB1645:
 .LBB1646:
-	.loc 1 1105 0
+	.loc 1 1110 0
 	bl	ebc_empty_buf_get
 .LVL558:
 	mov	x25, x0
 .LVL559:
-	.loc 1 1106 0
+	.loc 1 1111 0
 	ldp	w2, w0, [x19, 108]
 	mov	w1, 255
 	mul	w2, w2, w0
@@ -6306,47 +6321,47 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memset
 .LVL560:
-	.loc 1 1109 0
+	.loc 1 1114 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1107 0
+	.loc 1 1112 0
 	mov	w0, 14
 	str	w0, [x25, 40]
-	.loc 1 1112 0
+	.loc 1 1117 0
 	mov	x0, x25
-	.loc 1 1110 0
+	.loc 1 1115 0
 	ldr	w1, [x19, 108]
 	str	w1, [x25, 56]
-	.loc 1 1111 0
+	.loc 1 1116 0
 	ldr	w1, [x19, 112]
 	str	w1, [x25, 60]
-	.loc 1 1112 0
+	.loc 1 1117 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL561:
-	b	.L489
+	b	.L504
 	.p2align 3
-.L562:
+.L577:
 .LBE1646:
 .LBE1645:
-	.loc 1 1782 0
+	.loc 1 1787 0
 	mov	w2, 1
 	str	w2, [x21, 80]
-	.loc 1 1783 0
+	.loc 1 1788 0
 	add	x0, x22, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
 .LVL562:
-	b	.L493
+	b	.L508
 .LVL563:
 	.p2align 3
-.L560:
-	.loc 1 1739 0
+.L575:
+	.loc 1 1744 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC48
 	add	x1, x1, :lo12:.LC48
 	bl	_dev_info
 .LVL564:
-	.loc 1 1740 0
+	.loc 1 1745 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
 .LBB1647:
@@ -6363,13 +6378,13 @@ ebc_probe:
 .LBE1649:
 .LBE1648:
 .LBE1647:
-	.loc 1 1741 0
-	cbz	x0, .L563
-	.loc 1 1745 0
+	.loc 1 1746 0
+	cbz	x0, .L578
+	.loc 1 1750 0
 	ldp	w2, w1, [x22, 84]
-	.loc 1 1738 0
+	.loc 1 1743 0
 	mov	w28, 1
-	.loc 1 1745 0
+	.loc 1 1750 0
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
@@ -6381,32 +6396,32 @@ ebc_probe:
 	add	x1, x3, x1
 	bl	memcpy
 .LVL568:
-	b	.L487
+	b	.L502
 .LVL569:
 	.p2align 3
-.L477:
+.L492:
 .LBE1653:
 .LBE1661:
 .LBB1662:
 .LBB1599:
-	.loc 1 1614 0
+	.loc 1 1619 0
 	mov	w24, -12
-	b	.L474
+	b	.L489
 .LVL570:
 	.p2align 3
-.L561:
+.L576:
 .LBE1599:
 .LBE1662:
 .LBB1663:
 .LBB1654:
-	.loc 1 1769 0
+	.loc 1 1774 0
 	bl	ebc_empty_buf_get
 .LVL571:
 	mov	x25, x0
 .LVL572:
-	.loc 1 1770 0
-	cbz	x0, .L491
-	.loc 1 1771 0
+	.loc 1 1775 0
+	cbz	x0, .L506
+	.loc 1 1776 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
@@ -6414,33 +6429,33 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL573:
-	.loc 1 1774 0
+	.loc 1 1779 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1772 0
+	.loc 1 1777 0
 	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 1775 0
+	.loc 1 1780 0
 	ldr	w0, [x22, 84]
 	str	w0, [x25, 56]
-	.loc 1 1777 0
+	.loc 1 1782 0
 	mov	x0, x25
-	.loc 1 1776 0
+	.loc 1 1781 0
 	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 1777 0
+	.loc 1 1782 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL574:
-	b	.L491
+	b	.L506
 .LVL575:
 	.p2align 3
-.L559:
-	.loc 1 1725 0
+.L574:
+	.loc 1 1730 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC45
 	add	x1, x1, :lo12:.LC45
 	bl	_dev_info
 .LVL576:
-	.loc 1 1726 0
+	.loc 1 1731 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
 .LBB1650:
@@ -6457,9 +6472,9 @@ ebc_probe:
 .LBE1652:
 .LBE1651:
 .LBE1650:
-	.loc 1 1727 0
-	cbz	x0, .L564
-	.loc 1 1731 0
+	.loc 1 1732 0
+	cbz	x0, .L579
+	.loc 1 1736 0
 	ldp	w2, w1, [x22, 84]
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
@@ -6472,199 +6487,199 @@ ebc_probe:
 	add	x1, x3, x1
 	bl	memcpy
 .LVL581:
-	.loc 1 1735 0
-	cbz	x28, .L508
-	.loc 1 1724 0
+	.loc 1 1740 0
+	cbz	x28, .L523
+	.loc 1 1729 0
 	mov	w25, 1
 .LVL582:
-	b	.L502
+	b	.L517
 .LVL583:
 	.p2align 3
-.L557:
+.L572:
 .LBE1654:
 .LBE1663:
 .LBB1664:
 .LBB1608:
-	.loc 1 1575 0
+	.loc 1 1580 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC37
 	add	x1, x1, :lo12:.LC37
 	bl	_dev_err
 .LVL584:
-	.loc 1 1576 0
+	.loc 1 1581 0
 	ldr	x0, [x19, 272]
 	mov	w2, w26
 	ldr	x1, [x19, 384]
 	bl	epd_lut_from_file_init
 .LVL585:
-	.loc 1 1577 0
-	tbz	w0, #31, .L480
-	.loc 1 1578 0
+	.loc 1 1582 0
+	tbz	w0, #31, .L495
+	.loc 1 1583 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC38
-	.loc 1 1579 0
+	.loc 1 1584 0
 	mov	w24, -1
-	.loc 1 1578 0
+	.loc 1 1583 0
 	add	x1, x1, :lo12:.LC38
 	bl	_dev_err
 .LVL586:
-	b	.L478
+	b	.L493
 .LVL587:
 	.p2align 3
-.L464:
+.L479:
 .LBE1608:
 .LBE1664:
-	.loc 1 1822 0
+	.loc 1 1827 0
 	mov	w24, -517
-	b	.L460
+	b	.L475
 .LVL588:
 	.p2align 3
-.L558:
+.L573:
 .LBB1665:
 .LBB1629:
-	.loc 1 1667 0
+	.loc 1 1672 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC39
 	add	x1, x1, :lo12:.LC39
 	bl	_dev_err
 .LVL589:
-.L481:
+.L496:
 .LBE1629:
 .LBE1665:
-	.loc 1 1882 0
+	.loc 1 1887 0
 	adrp	x1, .LC71
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC71
-	.loc 1 1883 0
+	.loc 1 1888 0
 	mov	w24, -1
-	.loc 1 1882 0
+	.loc 1 1887 0
 	bl	_dev_err
 .LVL590:
-	.loc 1 1883 0
-	b	.L460
+	.loc 1 1888 0
+	b	.L475
 .LVL591:
 	.p2align 3
-.L482:
+.L497:
 .LBB1666:
 .LBB1630:
-	.loc 1 1676 0
+	.loc 1 1681 0
 	ldr	x0, [x21, 88]
 .LVL592:
 	adrp	x1, .LC70
-	.loc 1 1674 0
+	.loc 1 1679 0
 	str	x25, [x21, 120]
-	.loc 1 1676 0
+	.loc 1 1681 0
 	add	x1, x1, :lo12:.LC70
 	bl	_dev_err
 .LVL593:
-	b	.L481
+	b	.L496
 .LVL594:
 	.p2align 3
-.L505:
+.L520:
 .LBE1630:
 .LBE1666:
-	.loc 1 1808 0
+	.loc 1 1813 0
 	mov	w24, -12
-	b	.L460
+	b	.L475
 .LVL595:
 	.p2align 3
-.L506:
+.L521:
 .LBB1667:
 .LBB1600:
-	.loc 1 1599 0
+	.loc 1 1604 0
 	mov	w24, -19
-	b	.L474
+	b	.L489
 .LVL596:
-.L548:
+.L563:
 .LBE1600:
 .LBE1667:
-	.loc 1 1815 0
+	.loc 1 1820 0
 	adrp	x1, .LC23
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC23
-	.loc 1 1816 0
+	.loc 1 1821 0
 	mov	w24, -19
-	.loc 1 1815 0
+	.loc 1 1820 0
 	bl	_dev_err
 .LVL597:
-	.loc 1 1816 0
-	b	.L460
-.L551:
-	.loc 1 1843 0
+	.loc 1 1821 0
+	b	.L475
+.L566:
+	.loc 1 1848 0
 	adrp	x1, .LC27
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC27
-	.loc 1 1844 0
+	.loc 1 1849 0
 	mov	w24, -517
-	.loc 1 1843 0
+	.loc 1 1848 0
 	bl	_dev_err
 .LVL598:
-	.loc 1 1844 0
-	b	.L460
-.L549:
-	.loc 1 1831 0
+	.loc 1 1849 0
+	b	.L475
+.L564:
+	.loc 1 1836 0
 	adrp	x1, .LC25
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC25
-	.loc 1 1832 0
+	.loc 1 1837 0
 	mov	w24, -19
-	.loc 1 1831 0
+	.loc 1 1836 0
 	bl	_dev_err
 .LVL599:
-	.loc 1 1832 0
-	b	.L460
+	.loc 1 1837 0
+	b	.L475
 .LVL600:
-.L507:
+.L522:
 .LBB1668:
 .LBB1609:
-	.loc 1 1556 0
+	.loc 1 1561 0
 	mov	w24, -19
-	b	.L478
+	b	.L493
 .LVL601:
-.L550:
+.L565:
 .LBE1609:
 .LBE1668:
-	.loc 1 1838 0
+	.loc 1 1843 0
 	adrp	x1, .LC26
 	mov	x0, x20
 .LVL602:
 	add	x1, x1, :lo12:.LC26
-	.loc 1 1839 0
+	.loc 1 1844 0
 	mov	w24, -517
-	.loc 1 1838 0
+	.loc 1 1843 0
 	bl	_dev_err
 .LVL603:
-	.loc 1 1839 0
-	b	.L460
+	.loc 1 1844 0
+	b	.L475
 .LVL604:
-.L556:
+.L571:
 .LBB1669:
 .LBB1610:
-	.loc 1 1569 0
+	.loc 1 1574 0
 	ldr	x0, [x19, 272]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
 	adrp	x1, .LC36
-	mov	w3, 1569
+	mov	w3, 1574
 	add	x2, x2, 16
 	add	x1, x1, :lo12:.LC36
-	.loc 1 1570 0
+	.loc 1 1575 0
 	mov	w24, -12
-	.loc 1 1569 0
+	.loc 1 1574 0
 	bl	_dev_err
 .LVL605:
-	b	.L478
+	b	.L493
 .LVL606:
-.L555:
+.L570:
 .LBE1610:
 .LBE1669:
-	.loc 1 1900 0
+	.loc 1 1905 0
 	bl	__stack_chk_fail
 .LVL607:
-.L563:
+.L578:
 .LBB1670:
 .LBB1655:
-	.loc 1 1742 0
+	.loc 1 1747 0
 	ldr	x0, [x21, 88]
 .LVL608:
 	adrp	x1, .LC49
@@ -6672,10 +6687,10 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC49
 	bl	_dev_err
 .LVL609:
-	b	.L485
+	b	.L500
 .LVL610:
-.L564:
-	.loc 1 1728 0
+.L579:
+	.loc 1 1733 0
 	ldr	x0, [x21, 88]
 .LVL611:
 	adrp	x1, .LC46
@@ -6683,16 +6698,16 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC46
 	bl	_dev_err
 .LVL612:
-	b	.L485
+	b	.L500
 .LVL613:
-.L508:
-	.loc 1 1714 0
+.L523:
+	.loc 1 1719 0
 	mov	w28, 0
 .LVL614:
-	.loc 1 1719 0
+	.loc 1 1724 0
 	mov	x26, 0
 .LVL615:
-	b	.L486
+	b	.L501
 .LBE1655:
 .LBE1670:
 	.cfi_endproc
@@ -6754,7 +6769,7 @@ ebc_power_set.constprop.7:
 .LBE1675:
 	.loc 1 200 0
 	ldr	w0, [x19, 616]
-	cbnz	w0, .L571
+	cbnz	w0, .L586
 	.loc 1 204 0
 	ldr	x0, [x19]
 	adrp	x1, .LC73
@@ -6775,7 +6790,7 @@ ebc_power_set.constprop.7:
 	ret
 .LVL623:
 	.p2align 3
-.L571:
+.L586:
 	.cfi_restore_state
 	.loc 1 201 0
 	str	wzr, [x19, 616]
@@ -6812,7 +6827,7 @@ ebc_power_set.constprop.7:
 	.type	ebc_suspend, %function
 ebc_suspend:
 .LFB2842:
-	.loc 1 1910 0
+	.loc 1 1915 0
 	.cfi_startproc
 .LVL627:
 	stp	x29, x30, [sp, -32]!
@@ -6830,17 +6845,17 @@ ebc_suspend:
 	ldr	x20, [x0, 184]
 .LBE1680:
 .LBE1679:
-	.loc 1 1914 0
+	.loc 1 1919 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 192]
 .LVL628:
 	cmp	w0, 1
-	beq	.L575
-.L573:
-	.loc 1 1918 0
+	beq	.L590
+.L588:
+	.loc 1 1923 0
 	mov	w0, 1
 	str	w0, [x19, 604]
-	.loc 1 1920 0
+	.loc 1 1925 0
 	ldr	x1, [x20, 16]
 .LBB1681:
 .LBB1682:
@@ -6851,13 +6866,13 @@ ebc_suspend:
 .LVL629:
 .LBE1682:
 .LBE1681:
-	.loc 1 1921 0
+	.loc 1 1926 0
 	ldr	x0, [x19, 88]
 	adrp	x1, .LC75
 	add	x1, x1, :lo12:.LC75
 	bl	_dev_info
 .LVL630:
-	.loc 1 1924 0
+	.loc 1 1929 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -6869,9 +6884,9 @@ ebc_suspend:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L575:
+.L590:
 	.cfi_restore_state
-	.loc 1 1915 0
+	.loc 1 1920 0
 	ldr	x0, [x19, 88]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
@@ -6880,11 +6895,11 @@ ebc_suspend:
 	add	x1, x1, :lo12:.LC74
 	bl	_dev_info
 .LVL631:
-	.loc 1 1916 0
+	.loc 1 1921 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.7
 .LVL632:
-	b	.L573
+	b	.L588
 	.cfi_endproc
 .LFE2842:
 	.size	ebc_suspend, .-ebc_suspend
@@ -6898,74 +6913,73 @@ refresh_new_image2:
 	.cfi_startproc
 .LVL633:
 	.loc 1 220 0
-	ldp	w14, w6, [x4, 52]
+	ldp	w15, w6, [x4, 52]
 	cmp	w6, 0
-	add	w10, w6, 15
-	csel	w10, w10, w6, lt
+	add	w11, w6, 15
+	csel	w11, w11, w6, lt
 .LVL634:
 	.loc 1 227 0
-	cmp	w14, 0
+	cmp	w15, 0
 	.loc 1 220 0
-	asr	w10, w10, 4
+	asr	w11, w11, 4
 .LVL635:
 	.loc 1 227 0
-	ble	.L576
-	sub	w13, w10, #1
-	mov	w11, 0
+	ble	.L591
+	sub	w14, w11, #1
+	mov	w12, 0
 .LVL636:
-	add	x13, x13, 1
-	lsl	x12, x13, 3
+	add	x14, x14, 1
+	lsl	x13, x14, 3
 .LVL637:
 	.p2align 2
-.L578:
+.L593:
 	.loc 1 228 0 discriminator 1
 	mov	x4, 0
 .LVL638:
-	cmp	w10, 0
-	ble	.L583
+	cmp	w11, 0
+	ble	.L598
 	.p2align 2
-.L585:
-	.loc 1 229 0
+.L599:
+	.loc 1 239 0
 	ldrb	w9, [x3, x4]
-	.loc 1 233 0
-	mov	x6, -1
-.LVL639:
+	.loc 1 241 0
+	cmp	w5, 18
 	.loc 1 230 0
-	ldr	x8, [x1, x4, lsl 3]
-	.loc 1 231 0
-	ldr	x7, [x0, x4, lsl 3]
-	.loc 1 243 0
-	cmp	w9, 0
+	ldr	x6, [x1, x4, lsl 3]
+.LVL639:
 	.loc 1 232 0
-	cbz	w5, .L579
-	.loc 1 235 0
-	ldr	x6, [x2]
+	ldr	x7, [x2, x4, lsl 3]
+	.loc 1 231 0
+	ldr	x8, [x0, x4, lsl 3]
+	.loc 1 241 0
+	orn	x10, x7, x6
+	and	x6, x6, x7
 .LVL640:
-	add	x2, x2, 8
+	.loc 1 239 0
+	cbnz	w9, .L594
+	.loc 1 241 0
+	csel	x8, x6, x10, ne
+.L594:
+	.loc 1 246 0 discriminator 2
+	str	x8, [x0, x4, lsl 3]
+	add	x4, x4, 1
+	.loc 1 228 0 discriminator 2
+	cmp	w11, w4
+	bgt	.L599
+	add	x3, x3, x14
+	add	x1, x1, x13
 .LVL641:
-.L579:
-	.loc 1 243 0
-	and	x6, x6, x8
+	add	x2, x2, x13
 .LVL642:
-	csel	x7, x6, x7, eq
-	.loc 1 253 0
-	str	x7, [x0, x4, lsl 3]
-	add	x4, x4, 1
-	.loc 1 228 0
-	cmp	w10, w4
-	bgt	.L585
-	add	x3, x3, x13
-	add	x1, x1, x12
+	add	x0, x0, x13
 .LVL643:
-	add	x0, x0, x12
-.LVL644:
-.L583:
+.L598:
 	.loc 1 227 0 discriminator 2
-	add	w11, w11, 1
-	cmp	w14, w11
-	bne	.L578
-.LVL645:
-.L576:
+	add	w12, w12, 1
+	cmp	w15, w12
+	bne	.L593
+.LVL644:
+.L591:
 	ret
 	.cfi_endproc
 .LFE2806:
@@ -6976,34 +6990,34 @@ refresh_new_image2:
 	.type	new_buffer_refresh, %function
 new_buffer_refresh:
 .LFB2807:
-	.loc 1 259 0
+	.loc 1 252 0
 	.cfi_startproc
-.LVL646:
+.LVL645:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 260 0
+	.loc 1 253 0
 	adrp	x0, .LANCHOR0
-.LVL647:
-	.loc 1 259 0
+.LVL646:
+	.loc 1 252 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 260 0
+	.loc 1 253 0
 	ldr	x4, [x0, #:lo12:.LANCHOR0]
-.LVL648:
-	.loc 1 268 0
+.LVL647:
+	.loc 1 261 0
 	add	x4, x4, 184
-.LVL649:
-	.loc 1 264 0
+.LVL648:
+	.loc 1 257 0
 	ldr	x5, [x4, 216]
 	ldr	x0, [x4, 128]
 	ldp	x2, x1, [x4, 144]
 	ldr	x3, [x4, 160]
 	ldr	w5, [x5, 40]
 	bl	refresh_new_image2
-.LVL650:
-	.loc 1 270 0
+.LVL649:
+	.loc 1 263 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -7017,16 +7031,16 @@ new_buffer_refresh:
 	.type	ebc_thread, %function
 ebc_thread:
 .LFB2819:
-	.loc 1 794 0
+	.loc 1 792 0
 	.cfi_startproc
-.LVL651:
+.LVL650:
 	stp	x29, x30, [sp, -224]!
 	.cfi_def_cfa_offset 224
 	.cfi_offset 29, -224
 	.cfi_offset 30, -216
-	.loc 1 795 0
+	.loc 1 793 0
 	adrp	x1, .LANCHOR0
-	.loc 1 794 0
+	.loc 1 792 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -7040,7 +7054,7 @@ ebc_thread:
 	adrp	x24, .LANCHOR1
 	stp	x25, x26, [sp, 64]
 	add	x0, x23, :lo12:__stack_chk_guard
-.LVL652:
+.LVL651:
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 21, -192
 	.cfi_offset 22, -184
@@ -7051,94 +7065,94 @@ ebc_thread:
 .LBB1708:
 .LBB1709:
 .LBB1710:
-	.loc 1 1093 0
+	.loc 1 1098 0
 	add	x24, x24, :lo12:.LANCHOR1
 .LBE1710:
 .LBE1709:
 .LBE1708:
-	.loc 1 795 0
+	.loc 1 793 0
 	ldr	x20, [x1, #:lo12:.LANCHOR0]
-.LVL653:
+.LVL652:
 .LBB1715:
 .LBB1713:
 .LBB1711:
-	.loc 1 1093 0
+	.loc 1 1098 0
 	add	x19, x24, 304
 .LBE1711:
 .LBE1713:
 .LBE1715:
-	.loc 1 794 0
+	.loc 1 792 0
 	ldr	x1, [x0]
 	str	x1, [x29, 216]
 	mov	x1,0
-	.loc 1 800 0
+	.loc 1 798 0
 	mov	w26, 0
-.LVL654:
-	.loc 1 797 0
+.LVL653:
+	.loc 1 795 0
 	add	x28, x20, 184
-	.loc 1 799 0
+	.loc 1 797 0
 	mov	w22, 0
-.LVL655:
+.LVL654:
 	.p2align 2
-.L591:
-	.loc 1 805 0
+.L604:
+	.loc 1 803 0
 	ldr	w0, [x28, 608]
-.LVL656:
-	cbnz	w0, .L721
-.L592:
-	.loc 1 811 0
+.LVL655:
+	cbnz	w0, .L753
+.L605:
+	.loc 1 809 0
 	bl	ebc_dsp_buf_get
-.LVL657:
+.LVL656:
 	mov	x27, x0
-	.loc 1 813 0
-	cbz	x0, .L594
-	.loc 1 813 0 is_stmt 0 discriminator 1
+	.loc 1 811 0
+	cbz	x0, .L607
+	.loc 1 811 0 is_stmt 0 discriminator 1
 	ldr	x1, [x0, 8]
-	cbz	x1, .L594
-	.loc 1 814 0 is_stmt 1
+	cbz	x1, .L607
+	.loc 1 812 0 is_stmt 1
 	ldr	w1, [x0, 40]
 	cmp	w1, 17
-	beq	.L722
-	.loc 1 818 0
+	beq	.L754
+	.loc 1 816 0
 	ldr	x2, [x28, 600]
-	cbz	x2, .L597
-	.loc 1 819 0
+	cbz	x2, .L610
+	.loc 1 817 0
 	cmp	w1, 16
-	beq	.L723
-.L714:
+	beq	.L755
+.L743:
 	.loc 1 876 0
 	bl	ebc_remove_from_dsp_buf_list
-.LVL658:
+.LVL657:
 	.loc 1 877 0
 	mov	x0, x27
 	bl	ebc_buf_release
-.LVL659:
-	.loc 1 805 0
+.LVL658:
+	.loc 1 803 0
 	ldr	w0, [x28, 608]
-	cbz	w0, .L592
+	cbz	w0, .L605
 	.p2align 2
-.L721:
-	.loc 1 806 0
+.L753:
+	.loc 1 804 0
 	ldr	w0, [x28, 192]
 	cmp	w0, 1
-	beq	.L724
-.L593:
-	.loc 1 1099 0
+	beq	.L756
+.L606:
+	.loc 1 1104 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, 0
 	ldr	x2, [x29, 216]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L725
+	cbnz	x1, .L757
 	ldp	x19, x20, [sp, 16]
-.LVL660:
+.LVL659:
 	ldp	x21, x22, [sp, 32]
-.LVL661:
+.LVL660:
 	ldp	x23, x24, [sp, 48]
 	ldp	x25, x26, [sp, 64]
-.LVL662:
+.LVL661:
 	ldp	x27, x28, [sp, 80]
-.LVL663:
+.LVL662:
 	ldp	x29, x30, [sp], 224
 	.cfi_remember_state
 	.cfi_restore 30
@@ -7155,98 +7169,100 @@ ebc_thread:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL664:
+.LVL663:
 	.p2align 3
-.L594:
+.L607:
 	.cfi_restore_state
-	.loc 1 1080 0
+	.loc 1 1085 0
 	ldr	w0, [x28, 28]
-.LVL665:
+.LVL664:
 	cmp	w0, 1
-	beq	.L726
-	.loc 1 1089 0
+	beq	.L758
+	.loc 1 1094 0
 	ldr	w0, [x28, 192]
 	cmp	w0, 1
-	beq	.L727
-.LVL666:
-.L717:
+	beq	.L759
+.LVL665:
+.L748:
 	ldr	w0, [x28, 80]
+.LVL666:
+	.loc 1 1097 0
+	cbz	w0, .L760
+.L684:
 .LVL667:
-	.loc 1 1092 0
-	cbz	w0, .L728
-.L668:
-.LVL668:
-.L658:
-	.loc 1 1094 0
+.L674:
+	.loc 1 1099 0
 	str	wzr, [x28, 80]
-	b	.L591
-.LVL669:
+	b	.L604
+.LVL668:
 	.p2align 3
-.L728:
+.L760:
 .LBB1716:
 .LBB1714:
-	.loc 1 1093 0 discriminator 1
+	.loc 1 1098 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL670:
-	b	.L669
+.LVL669:
+	b	.L685
 	.p2align 3
-.L729:
-.LVL671:
+.L761:
+.LVL670:
 .LBB1712:
-	.loc 1 1093 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L658
-	.loc 1 1093 0 discriminator 7
+	.loc 1 1098 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L674
+	.loc 1 1098 0 discriminator 7
 	bl	schedule
-.LVL672:
-.L669:
-	.loc 1 1093 0 discriminator 9
+.LVL671:
+.L685:
+	.loc 1 1098 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL673:
+.LVL672:
 	ldr	w1, [x28, 80]
-	cbz	w1, .L729
+	cbz	w1, .L761
 .LBE1712:
-	.loc 1 1093 0 discriminator 4
+	.loc 1 1098 0 discriminator 4
 	add	x1, x29, 112
 	mov	x0, x19
 	bl	finish_wait
-.LVL674:
+.LVL673:
 .LBE1714:
 .LBE1716:
-	.loc 1 1094 0 is_stmt 1 discriminator 4
+	.loc 1 1099 0 is_stmt 1 discriminator 4
 	str	wzr, [x28, 80]
-	b	.L591
-.LVL675:
+	b	.L604
+.LVL674:
 	.p2align 3
-.L597:
-	.loc 1 831 0
+.L610:
+	.loc 1 829 0
 	cmp	w1, 15
-	beq	.L730
-	.loc 1 834 0
-	ldr	w0, [x28, 616]
-.LVL676:
-	cmp	w0, 0
+	beq	.L762
+	.loc 1 833 0
+	ldr	w2, [x28, 616]
+	sub	w0, w1, #18
+.LVL675:
+	cmp	w2, 0
 	ccmp	w1, 1, 4, ne
-	beq	.L596
-	.loc 1 836 0
+	ccmp	w0, 1, 0, ne
+	bls	.L609
+	.loc 1 835 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x27, 16]
 	ldr	x0, [x28, 144]
 	bl	memcpy
-.LVL677:
-	.loc 1 837 0
+.LVL676:
+	.loc 1 836 0
 	mov	x0, x27
 	bl	ebc_remove_from_dsp_buf_list
-.LVL678:
-	.loc 1 838 0
+.LVL677:
+	.loc 1 837 0
 	mov	x0, x27
 	bl	ebc_buf_release
-.LVL679:
-	.loc 1 840 0
+.LVL678:
+	.loc 1 839 0
 	ldr	x0, [x28, 216]
 	mov	x4, x28
 	ldp	x2, x1, [x28, 144]
@@ -7254,105 +7270,225 @@ ebc_thread:
 	ldr	w5, [x0, 40]
 	ldr	x0, [x28, 128]
 	bl	refresh_new_image2
-.LVL680:
-	.loc 1 844 0
+.LVL679:
+	.loc 1 843 0
 	ldr	w0, [x28, 28]
-	cbnz	w0, .L591
-	.loc 1 847 0
+	cbnz	w0, .L604
+	.loc 1 846 0
 	ldr	w0, [x28, 192]
-	.loc 1 845 0
+	.loc 1 844 0
 	mov	w1, 1
-	.loc 1 846 0
-	str	wzr, [x28, 76]
 	.loc 1 845 0
+	str	wzr, [x28, 76]
+	.loc 1 844 0
 	str	w1, [x28, 28]
-	.loc 1 847 0
-	cbz	w0, .L731
-.L601:
-	.loc 1 849 0
+	.loc 1 846 0
+	cbz	w0, .L763
+.L614:
+	.loc 1 848 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC77
 	ldrb	w2, [x28, 32]
 	add	x1, x1, :lo12:.LC77
 	bl	_dev_info
-.LVL681:
-	.loc 1 850 0
+.LVL680:
+	.loc 1 849 0
 	mov	x0, x20
 	bl	ebc_frame_start
+.LVL681:
+	b	.L604
 .LVL682:
-	b	.L591
-.LVL683:
 	.p2align 3
-.L723:
-	.loc 1 820 0
+.L755:
+	.loc 1 818 0
 	str	wzr, [x28, 600]
-	.loc 1 821 0
+	.loc 1 819 0
 	mov	x0, 3
-.LVL684:
+.LVL683:
 	bl	ebc_notify
-.LVL685:
-	.loc 1 822 0
+.LVL684:
+	.loc 1 820 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC76
 	add	x1, x1, :lo12:.LC76
 	bl	_dev_info
-.LVL686:
+.LVL685:
 	.p2align 2
-.L596:
-	.loc 1 855 0
+.L609:
+	.loc 1 854 0
 	adrp	x21, jiffies
+.LVL686:
 	mov	x1, 402653184
 	add	x0, x20, 624
 	ldr	x2, [x21, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
 .LVL687:
-	.loc 1 857 0
+	.loc 1 856 0
 	ldr	w0, [x28, 436]
-	cbz	w0, .L602
+	cbz	w0, .L615
 	ldr	x0, [x28, 208]
-.L603:
-	.loc 1 860 0
+.L616:
+	.loc 1 859 0
 	ldr	w2, [x0, 40]
 	ldr	w3, [x27, 40]
 	cmp	w3, w2
-	beq	.L604
-	.loc 1 861 0
+	beq	.L617
+	.loc 1 860 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC78
 	add	x1, x1, :lo12:.LC78
 	bl	_dev_info
 .LVL688:
-	.loc 1 862 0
+	.loc 1 861 0
 	ldr	w0, [x28, 28]
 	cmp	w0, 1
-	beq	.L732
-.L715:
+	beq	.L764
+.L744:
 	ldr	w2, [x27, 40]
-.L604:
-	.loc 1 869 0
+.L617:
+	.loc 1 868 0
 	cmp	w2, 11
-	bgt	.L611
+	ble	.L765
+	cmp	w2, 17
+	ble	.L766
+	cmp	w2, 18
+	beq	.L626
+	cmp	w2, 19
+	bne	.L623
+	.loc 1 963 0
+	mov	w22, 1
+	.loc 1 952 0
+	str	wzr, [x28, 616]
+.L627:
+	.loc 1 971 0
+	ldr	x25, [x28, 208]
+.LVL689:
+	.loc 1 972 0
+	ldr	w0, [x25, 40]
+	.loc 1 974 0
+	cmp	w0, 1
+	.loc 1 972 0
+	ccmp	w0, 18, 4, hi
+	bne	.L654
+	.loc 1 978 0
+	add	x0, x29, 152
+	str	x0, [x28, 208]
+	.loc 1 979 0
+	ldr	x0, [x28, 136]
+	str	x0, [x29, 168]
+.L654:
+	.loc 1 984 0
+	str	wzr, [x28, 76]
+	.loc 1 985 0
+	str	x27, [x28, 216]
+	.loc 1 987 0
+	ldr	w9, [x27, 40]
+	.loc 1 990 0
+	sub	w0, w9, #7
+	.loc 1 987 0
+	cmp	w0, 4
+	bls	.L767
+.LVL690:
+.L655:
+	.loc 1 1002 0
+	cbnz	w22, .L690
+	.loc 1 1006 0
+	ldr	w1, [x28, 48]
+	mov	x0, x27
+	cmp	w1, 0
+	ble	.L662
+	.loc 1 1007 0
+	add	w26, w26, 1
+	.loc 1 1008 0
+	cmp	w1, w26
+	ble	.L768
+.L662:
+	.loc 1 1015 0
+	cmp	w9, 12
+	beq	.L769
+.L663:
+	.loc 1 1021 0
+	ldr	w0, [x28, 192]
+	cbz	w0, .L770
+.L664:
+	.loc 1 1024 0
+	mov	x0, x20
+	bl	ebc_lut_update
+.LVL691:
+	mov	w22, w0
+	cbz	w0, .L665
+.L778:
+	.loc 1 1025 0
+	ldr	x0, [x28, 88]
+	adrp	x1, .LC83
+	.loc 1 1028 0
+	mov	w22, 0
+	.loc 1 1025 0
+	add	x1, x1, :lo12:.LC83
+	bl	_dev_err
+.LVL692:
+	.loc 1 1027 0
+	str	x25, [x28, 208]
+.LVL693:
+.L640:
+	.loc 1 1059 0
+	ldr	x0, [x28, 216]
+	ldr	w0, [x0, 40]
+	cmp	w0, 17
+	beq	.L771
+.L670:
+	.loc 1 1065 0
+	cmp	w0, 15
+	beq	.L772
+.L671:
+	.loc 1 1074 0
+	mov	x0, x27
+	bl	ebc_remove_from_dsp_buf_list
+.LVL694:
+	.loc 1 1076 0
+	ldr	w0, [x28, 436]
+	cbnz	w0, .L773
+.L672:
+	.loc 1 1079 0
+	mov	w0, 1
+	str	w0, [x28, 436]
+.L673:
+	.loc 1 1081 0
+	ldr	x0, [x28, 216]
+	str	x0, [x28, 208]
+	.loc 1 1082 0
+	b	.L604
+.LVL695:
+	.p2align 3
+.L615:
+	.loc 1 857 0
+	mov	x0, x27
+	str	x27, [x28, 208]
+	b	.L616
+	.p2align 3
+.L765:
+	.loc 1 868 0
 	cmp	w2, 7
-	bge	.L614
+	bge	.L627
 	cmp	w2, 1
-	beq	.L613
-	bgt	.L673
-	cbnz	w2, .L610
-	.loc 1 915 0
-	str	x27, [x28, 216]
+	beq	.L626
+	bgt	.L689
+	cbnz	w2, .L623
 	.loc 1 916 0
+	str	x27, [x28, 216]
+	.loc 1 917 0
 	ldrsw	x2, [x28, 20]
 	ldr	x0, [x28, 152]
 	ldr	x1, [x27, 16]
 	bl	memcpy
-.LVL689:
-	.loc 1 917 0
+.LVL696:
+	.loc 1 918 0
 	ldr	x0, [x28, 208]
 	ldr	w0, [x0, 40]
-	cbnz	w0, .L733
-.L634:
-	.loc 1 926 0
+	cbnz	w0, .L774
+.L650:
+	.loc 1 928 0
 	ldr	x0, [x28, 216]
 	mov	x4, x28
 	ldp	x2, x1, [x28, 144]
@@ -7360,931 +7496,854 @@ ebc_thread:
 	ldr	w5, [x0, 40]
 	ldr	x0, [x28, 128]
 	bl	refresh_new_image2
-.LVL690:
-.L635:
-	.loc 1 932 0
+.LVL697:
+.L651:
+	.loc 1 934 0
 	ldr	w0, [x28, 28]
-	cbnz	w0, .L625
-	.loc 1 935 0
+	cbnz	w0, .L640
+	.loc 1 937 0
 	ldr	w0, [x28, 192]
-	.loc 1 933 0
+	.loc 1 935 0
 	mov	w1, 1
-	.loc 1 934 0
+	.loc 1 936 0
 	str	wzr, [x28, 76]
-	.loc 1 933 0
-	str	w1, [x28, 28]
 	.loc 1 935 0
-	cbz	w0, .L734
-.L636:
+	str	w1, [x28, 28]
 	.loc 1 937 0
+	cbz	w0, .L775
+.L652:
+	.loc 1 939 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL691:
+.LVL698:
 	cmn	w0, #1
-	beq	.L735
-	.loc 1 945 0
+	beq	.L776
+	.loc 1 947 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC84
-	.loc 1 942 0
+	.loc 1 944 0
 	ldr	w3, [x28, 96]
-	.loc 1 945 0
+	.loc 1 947 0
 	add	x1, x1, :lo12:.LC84
-	.loc 1 942 0
+	.loc 1 944 0
 	strb	w3, [x28, 32]
-.L716:
-	.loc 1 945 0
+.LVL699:
+.L747:
+	.loc 1 947 0
 	and	w2, w3, 255
-	.loc 1 943 0
+	.loc 1 945 0
 	lsr	w3, w3, 8
 	strb	w3, [x28, 33]
-	.loc 1 945 0
+	.loc 1 947 0
 	bl	_dev_info
-.LVL692:
-	.loc 1 946 0
+.LVL700:
+	.loc 1 948 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL693:
-	.loc 1 1054 0
+.LVL701:
+	.loc 1 1059 0
 	ldr	x0, [x28, 216]
 	ldr	w0, [x0, 40]
 	cmp	w0, 17
-	bne	.L654
-.LVL694:
+	bne	.L670
+.LVL702:
 	.p2align 2
-.L741:
-	.loc 1 1057 0
+.L771:
+	.loc 1 1062 0
 	ldr	x0, [x28, 88]
-	.loc 1 1055 0
+	.loc 1 1060 0
 	mov	w21, 1
-	.loc 1 1056 0
+.LVL703:
+	.loc 1 1061 0
 	str	wzr, [x28, 196]
-	.loc 1 1057 0
+	.loc 1 1062 0
 	adrp	x1, .LC87
-	.loc 1 1055 0
+	.loc 1 1060 0
 	str	w21, [x28, 608]
-	.loc 1 1057 0
+	.loc 1 1062 0
 	add	x1, x1, :lo12:.LC87
 	bl	_dev_info
-.LVL695:
-	.loc 1 1058 0
+.LVL704:
+	.loc 1 1063 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x24, 328
 	bl	__wake_up_sync
-.LVL696:
-	.loc 1 1069 0
+.LVL705:
+	.loc 1 1074 0
 	mov	x0, x27
 	bl	ebc_remove_from_dsp_buf_list
-.LVL697:
-	.loc 1 1071 0
+.LVL706:
+	.loc 1 1076 0
 	ldr	w0, [x28, 436]
-	cbz	w0, .L656
+	cbz	w0, .L672
+.LVL707:
 	.p2align 2
-.L743:
-	.loc 1 1072 0
+.L773:
+	.loc 1 1077 0
 	ldr	x0, [x28, 208]
 	bl	ebc_buf_release
-.LVL698:
-	b	.L657
-	.p2align 3
-.L602:
-	.loc 1 858 0
-	mov	x0, x27
-	str	x27, [x28, 208]
-	b	.L603
-.LVL699:
+.LVL708:
+	b	.L673
+.LVL709:
 	.p2align 3
-.L722:
-	.loc 1 816 0
+.L754:
+	.loc 1 814 0
 	str	wzr, [x28, 612]
-	.loc 1 815 0
+	.loc 1 813 0
 	str	wzr, [x28, 616]
-	b	.L596
-.LVL700:
-	.p2align 3
-.L611:
-	.loc 1 869 0
-	cmp	w2, 13
-	beq	.L614
-	blt	.L673
-	cmp	w2, 17
-	bgt	.L610
-.L673:
-	.loc 1 959 0
-	mov	w22, 1
-.L614:
-	.loc 1 967 0
-	ldr	x25, [x28, 208]
-	.loc 1 968 0
-	ldr	w0, [x25, 40]
-	cmp	w0, 1
-	bls	.L736
-.L638:
-	.loc 1 979 0
-	str	wzr, [x28, 76]
-	.loc 1 980 0
-	str	x27, [x28, 216]
-	.loc 1 982 0
-	ldr	w9, [x27, 40]
-	.loc 1 985 0
-	sub	w0, w9, #7
-	.loc 1 982 0
-	cmp	w0, 4
-	bls	.L737
-.LVL701:
-.L639:
-	.loc 1 997 0
-	cbnz	w22, .L675
-	.loc 1 1001 0
-	ldr	w1, [x28, 48]
-	mov	x0, x27
-	cmp	w1, 0
-	ble	.L646
-	.loc 1 1002 0
-	add	w26, w26, 1
-	.loc 1 1003 0
-	cmp	w1, w26
-	ble	.L738
-.L646:
-	.loc 1 1010 0
-	cmp	w9, 12
-	beq	.L739
-.L647:
-	.loc 1 1016 0
-	ldr	w0, [x28, 192]
-	cbz	w0, .L740
-.L648:
-	.loc 1 1019 0
-	mov	x0, x20
-	bl	ebc_lut_update
-.LVL702:
-	mov	w22, w0
-	cbz	w0, .L649
-	.loc 1 1020 0
-	ldr	x0, [x28, 88]
-	adrp	x1, .LC83
-	.loc 1 1023 0
-	mov	w22, 0
-	.loc 1 1020 0
-	add	x1, x1, :lo12:.LC83
-	bl	_dev_err
-.LVL703:
-	.loc 1 1022 0
-	str	x25, [x28, 208]
-.LVL704:
-.L625:
-	.loc 1 1054 0
-	ldr	x0, [x28, 216]
-	ldr	w0, [x0, 40]
-	cmp	w0, 17
-	beq	.L741
-.L654:
-	.loc 1 1060 0
-	cmp	w0, 15
-	beq	.L742
-.L655:
-	.loc 1 1069 0
-	mov	x0, x27
-	bl	ebc_remove_from_dsp_buf_list
-.LVL705:
-	.loc 1 1071 0
-	ldr	w0, [x28, 436]
-	cbnz	w0, .L743
-.L656:
-	.loc 1 1074 0
-	mov	w0, 1
-	str	w0, [x28, 436]
-.L657:
-	.loc 1 1076 0
-	ldr	x0, [x28, 216]
-	str	x0, [x28, 208]
-	.loc 1 1077 0
-	b	.L591
+	b	.L609
+.LVL710:
 	.p2align 3
-.L726:
+.L758:
 .LBB1717:
-	.loc 1 1081 0 discriminator 1
+	.loc 1 1086 0 discriminator 1
 	ldr	w0, [x28, 80]
-	cbnz	w0, .L658
+	cbnz	w0, .L674
 .LBB1718:
-	.loc 1 1081 0 is_stmt 0 discriminator 3
+	.loc 1 1086 0 is_stmt 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL706:
-	b	.L662
+.LVL711:
+	b	.L678
 	.p2align 3
-.L744:
+.L777:
 .LBB1719:
-	.loc 1 1081 0 discriminator 7
+	.loc 1 1086 0 discriminator 7
 	ldr	w1, [x28, 80]
-	cbnz	w1, .L659
-.LVL707:
-	.loc 1 1081 0 discriminator 9
-	cbnz	x0, .L717
-	.loc 1 1081 0 discriminator 11
+	cbnz	w1, .L675
+.LVL712:
+	.loc 1 1086 0 discriminator 9
+	cbnz	x0, .L748
+	.loc 1 1086 0 discriminator 11
 	bl	schedule
-.LVL708:
-.L662:
-	.loc 1 1081 0 discriminator 13
+.LVL713:
+.L678:
+	.loc 1 1086 0 discriminator 13
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL709:
+.LVL714:
 	ldr	w1, [x28, 28]
-	cbnz	w1, .L744
-.L659:
+	cbnz	w1, .L777
+.L675:
 .LBE1719:
-	.loc 1 1081 0 discriminator 8
+	.loc 1 1086 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL710:
+.LVL715:
 	ldr	w0, [x28, 28]
 .LBE1718:
 .LBE1717:
-	.loc 1 1084 0 is_stmt 1 discriminator 8
-	cbnz	w0, .L717
-	.loc 1 1089 0
+	.loc 1 1089 0 is_stmt 1 discriminator 8
+	cbnz	w0, .L748
+	.loc 1 1094 0
 	ldr	w0, [x28, 192]
 	cmp	w0, 1
-	bne	.L717
+	bne	.L748
 	.p2align 2
-.L727:
-	.loc 1 1090 0
+.L759:
+	.loc 1 1095 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.7
-.LVL711:
-	b	.L717
-	.p2align 3
-.L613:
-	.loc 1 871 0
-	ldr	w0, [x28, 612]
-	cbz	w0, .L616
-	.loc 1 872 0
-	str	w2, [x28, 616]
-	.loc 1 882 0
-	str	x27, [x28, 216]
-	.loc 1 883 0
-	ldr	x0, [x28, 152]
-	ldr	x1, [x27, 16]
-	ldrsw	x2, [x28, 20]
-	bl	memcpy
-.LVL712:
-	.loc 1 884 0
-	ldr	x1, [x28, 208]
-	ldr	w0, [x1, 40]
-	cmp	w0, 1
-	bls	.L745
-	.loc 1 886 0
-	ldrsw	x2, [x28, 20]
-	ldr	x1, [x1, 16]
-	ldr	x0, [x28, 128]
-	bl	memcpy
-.LVL713:
-	.loc 1 887 0
-	ldr	x0, [x28, 208]
-	ldrsw	x2, [x28, 20]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x28, 136]
-	bl	memcpy
-.LVL714:
-	.loc 1 888 0
-	ldr	x0, [x28, 208]
-	ldrsw	x2, [x28, 20]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x28, 144]
-	bl	memcpy
-.LVL715:
-.L619:
-	.loc 1 895 0
-	ldr	x1, [x28, 216]
-.LBB1720:
-.LBB1721:
-	.loc 1 292 0
-	ldp	w4, w5, [x28, 52]
-.LBE1721:
-.LBE1720:
-	.loc 1 893 0
-	ldr	x8, [x28, 128]
-.LBB1726:
-.LBB1722:
-	.loc 1 289 0
-	ldp	w3, w14, [x1, 48]
-	.loc 1 292 0
-	add	w0, w5, 15
-	.loc 1 290 0
-	ldp	w2, w17, [x1, 56]
-	.loc 1 287 0
-	cmp	w3, 0
-	add	w16, w3, 15
 .LVL716:
-	.loc 1 297 0
-	sub	w9, w4, #1
-	.loc 1 287 0
-	csel	w16, w16, w3, lt
-	.loc 1 288 0
-	add	w10, w2, 15
-	cmp	w2, 0
-.LBE1722:
-.LBE1726:
-	.loc 1 893 0
-	ldr	w12, [x1, 40]
-.LBB1727:
-.LBB1723:
-	.loc 1 288 0
-	csel	w10, w10, w2, lt
-	.loc 1 292 0
-	cmp	w5, 0
-	csel	w0, w0, w5, lt
-	.loc 1 288 0
-	asr	w10, w10, 4
-	add	w10, w10, 1
+	b	.L748
 .LVL717:
-	.loc 1 292 0
-	asr	w0, w0, 4
-	.loc 1 295 0
-	cmp	w10, w0
-	sub	w0, w0, #1
-	csel	w10, w0, w10, ge
-.LVL718:
-	.loc 1 297 0
-	cmp	w17, w4
-	csel	w17, w9, w17, ge
-	.loc 1 287 0
-	asr	w16, w16, 4
-.LVL719:
-.LBE1723:
-.LBE1727:
-	.loc 1 893 0
-	ldp	x13, x11, [x28, 144]
-.LVL720:
-.LBB1728:
-.LBB1724:
-	.loc 1 299 0
-	cmp	w14, w17
-.LBE1724:
-.LBE1728:
-	.loc 1 893 0
-	ldr	x9, [x28, 160]
-.LBB1729:
-.LBB1725:
-	.loc 1 299 0
-	bgt	.L622
-	.loc 1 323 0
-	mov	w15, 1
-.LVL721:
-	.p2align 2
-.L623:
-	.loc 1 300 0
-	mul	w5, w14, w5
-	.loc 1 304 0
-	mov	w0, w16
-	.loc 1 303 0
-	cmp	w5, 0
-	add	w21, w5, 15
-	csel	w21, w21, w5, lt
-	.loc 1 300 0
-	add	w5, w5, w5, lsr 31
-	asr	w5, w5, 1
-	.loc 1 303 0
-	asr	w21, w21, 4
-	sxtw	x21, w21
-	sxtw	x5, w5
-	.loc 1 304 0
-	cmp	w16, w10
-	ble	.L696
-	b	.L632
-.LVL722:
-	.p2align 3
-.L746:
-	.loc 1 319 0
-	and	x2, x2, x4
-.LVL723:
-	str	x2, [x8, x3]
-.L630:
-	.loc 1 304 0
-	add	w0, w0, 1
-	cmp	w0, w10
-	bgt	.L632
-.LVL724:
-.L696:
-	add	x3, x5, x0, sxtw 3
-	.loc 1 305 0
-	sxtw	x1, w0
-	.loc 1 308 0
-	mov	x4, -1
-.LVL725:
-	.loc 1 306 0
-	ldr	x2, [x11, x3]
-.LVL726:
-	.loc 1 307 0
-	cbz	w12, .L628
-	.loc 1 310 0
-	ldr	x4, [x13, x3]
-.L628:
-	.loc 1 312 0
-	add	x1, x21, x1
-	.loc 1 318 0
-	ldrb	w18, [x9, x1]
-	cbz	w18, .L746
-	.loc 1 321 0
-	ldr	x18, [x8, x3]
-	and	x2, x2, x4
-.LVL727:
-	cmp	x18, x2
-	beq	.L630
-	.loc 1 322 0
-	str	x2, [x8, x3]
-	.loc 1 304 0
-	add	w0, w0, 1
-	.loc 1 323 0
-	strb	w15, [x9, x1]
-	.loc 1 304 0
-	cmp	w0, w10
-	ble	.L696
-.LVL728:
-.L632:
-	.loc 1 299 0
-	add	w14, w14, 1
-	cmp	w14, w17
-	bgt	.L622
-	ldr	w5, [x28, 56]
-	b	.L623
-.LVL729:
 	.p2align 3
-.L610:
-.LBE1725:
-.LBE1729:
-	.loc 1 1046 0
+.L766:
+	.loc 1 868 0
+	cmp	w2, 14
+	bge	.L689
+	cmp	w2, 12
+	beq	.L689
+	cmp	w2, 13
+	beq	.L627
+.L623:
+	.loc 1 1051 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC86
 	add	x1, x1, :lo12:.LC86
 	bl	_dev_err
-.LVL730:
-	.loc 1 1047 0
-	b	.L625
-.LVL731:
+.LVL718:
+	.loc 1 1052 0
+	b	.L640
 	.p2align 3
-.L649:
-	.loc 1 1031 0
+.L689:
+	.loc 1 963 0
+	mov	w22, 1
+	b	.L627
+.LVL719:
+	.p2align 3
+.L690:
+	mov	x0, x27
+	.loc 1 1003 0
+	mov	w26, 0
+	.loc 1 1015 0
+	cmp	w9, 12
+	bne	.L663
+.L769:
+	.loc 1 1017 0
+	ldr	w1, [x25, 40]
+	sub	w1, w1, #12
+	cmp	w1, 1
+	bls	.L663
+	.loc 1 1018 0
+	mov	w1, 13
+	str	w1, [x0, 40]
+	.loc 1 1021 0
+	ldr	w0, [x28, 192]
+	cbnz	w0, .L664
+	.p2align 2
+.L770:
+.LBB1720:
+.LBB1721:
+	mov	w1, 1
+	mov	x0, x20
+	bl	ebc_power_set.part.3
+.LVL720:
+.LBE1721:
+.LBE1720:
+	.loc 1 1024 0
+	mov	x0, x20
+	bl	ebc_lut_update
+.LVL721:
+	mov	w22, w0
+	cbnz	w0, .L778
+.L665:
+	.loc 1 1036 0
 	ldr	x0, [x28, 216]
-.LVL732:
 	adrp	x1, .LC85
-	.loc 1 1028 0
+	.loc 1 1033 0
 	ldr	w3, [x28, 96]
-	.loc 1 1031 0
+	.loc 1 1036 0
 	add	x1, x1, :lo12:.LC85
-	.loc 1 1028 0
+	.loc 1 1033 0
 	strb	w3, [x28, 32]
-	.loc 1 1031 0
+	.loc 1 1036 0
 	and	w3, w3, 255
 	ldr	w2, [x0, 40]
 	ldr	x0, [x28, 88]
 	bl	_dev_info
-.LVL733:
-	.loc 1 1032 0
+.LVL722:
+	.loc 1 1037 0
 	mov	w0, 1
 	str	w0, [x28, 28]
-	.loc 1 1033 0
+	.loc 1 1038 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL734:
-	.loc 1 1035 0
+.LVL723:
+	.loc 1 1040 0
 	ldr	x1, [x21, #:lo12:jiffies]
 	add	x0, x20, 680
 	str	x0, [x29, 96]
 	add	x1, x1, 900
 	bl	mod_timer
-.LVL735:
-.LBB1730:
-	.loc 1 1036 0
+.LVL724:
+.LBB1722:
+	.loc 1 1041 0
 	ldr	w0, [x28, 76]
-	cbz	w0, .L747
-.L652:
-.LVL736:
-.L650:
-.LBE1730:
-	.loc 1 1038 0 discriminator 11
+	cbz	w0, .L779
+.L668:
+.LVL725:
+.L666:
+.LBE1722:
+	.loc 1 1043 0 discriminator 11
 	ldr	x2, [x21, #:lo12:jiffies]
 	mov	x1, 402653184
 	ldr	x0, [x29, 96]
-.LVL737:
+.LVL726:
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL738:
-	.loc 1 1039 0 discriminator 11
+.LVL727:
+	.loc 1 1044 0 discriminator 11
 	str	wzr, [x28, 76]
-	.loc 1 1041 0 discriminator 11
+	.loc 1 1046 0 discriminator 11
 	str	x25, [x28, 208]
-	.loc 1 1043 0 discriminator 11
-	b	.L625
-.LVL739:
+	.loc 1 1048 0 discriminator 11
+	b	.L640
+.LVL728:
 	.p2align 3
-.L675:
-	mov	x0, x27
-	.loc 1 998 0
-	mov	w26, 0
-	.loc 1 1010 0
-	cmp	w9, 12
-	bne	.L647
-.L739:
-	.loc 1 1012 0
-	ldr	w1, [x25, 40]
-	sub	w1, w1, #12
-	cmp	w1, 1
-	bls	.L647
-	.loc 1 1013 0
-	mov	w1, 13
-	str	w1, [x0, 40]
-	.loc 1 1016 0
-	ldr	w0, [x28, 192]
-	cbnz	w0, .L648
-	.p2align 2
-.L740:
+.L626:
+	.loc 1 871 0
+	ldr	w0, [x28, 612]
+	cbz	w0, .L631
+	.loc 1 872 0
+	mov	w0, 1
+	.loc 1 882 0
+	str	x27, [x28, 216]
+	.loc 1 872 0
+	str	w0, [x28, 616]
+	.loc 1 883 0
+	ldrsw	x2, [x28, 20]
+	ldr	x1, [x27, 16]
+	ldr	x0, [x28, 152]
+	bl	memcpy
+.LVL729:
+	.loc 1 884 0
+	ldr	x1, [x28, 208]
+	ldr	w0, [x1, 40]
+	.loc 1 886 0
+	cmp	w0, 1
+	.loc 1 884 0
+	ccmp	w0, 18, 4, hi
+	bne	.L780
+	.loc 1 890 0
+	cbz	w0, .L781
+.L634:
+	.loc 1 896 0
+	ldr	x1, [x28, 216]
+.LBB1727:
+.LBB1728:
+	.loc 1 285 0
+	ldp	w5, w4, [x28, 52]
+.LBE1728:
+.LBE1727:
+	.loc 1 894 0
+	ldr	x9, [x28, 128]
+.LBB1733:
+.LBB1729:
+	.loc 1 282 0
+	ldp	w3, w16, [x1, 48]
+	.loc 1 285 0
+	add	w0, w4, 15
+	.loc 1 283 0
+	ldp	w2, w21, [x1, 56]
+	.loc 1 280 0
+	cmp	w3, 0
+	add	w18, w3, 15
+.LVL730:
+	.loc 1 290 0
+	sub	w8, w5, #1
+	.loc 1 280 0
+	csel	w18, w18, w3, lt
+	.loc 1 281 0
+	add	w12, w2, 15
+	cmp	w2, 0
+.LBE1729:
+.LBE1733:
+	.loc 1 894 0
+	ldr	x11, [x28, 160]
+.LBB1734:
+.LBB1730:
+	.loc 1 281 0
+	csel	w12, w12, w2, lt
+	.loc 1 285 0
+	cmp	w4, 0
+	csel	w0, w0, w4, lt
+	.loc 1 281 0
+	asr	w12, w12, 4
+	add	w12, w12, 1
+.LVL731:
+	.loc 1 285 0
+	asr	w0, w0, 4
+	.loc 1 288 0
+	cmp	w12, w0
+	sub	w0, w0, #1
+	csel	w12, w0, w12, ge
+.LVL732:
+	.loc 1 290 0
+	cmp	w21, w5
+	csel	w21, w8, w21, ge
+.LBE1730:
+.LBE1734:
+	.loc 1 894 0
+	ldr	w15, [x1, 40]
+	ldp	x14, x13, [x28, 144]
 .LBB1735:
-.LBB1736:
-	mov	w1, 1
-	mov	x0, x20
-	bl	ebc_power_set.part.3
+.LBB1731:
+	.loc 1 280 0
+	asr	w18, w18, 4
+.LVL733:
+	.loc 1 292 0
+	cmp	w16, w21
+	bgt	.L637
+	.loc 1 314 0
+	mov	w17, 1
+.LVL734:
+	.p2align 2
+.L638:
+	.loc 1 293 0
+	mul	w4, w16, w4
+	.loc 1 297 0
+	mov	w0, w18
+	.loc 1 296 0
+	cmp	w4, 0
+	add	w10, w4, 15
+	csel	w10, w10, w4, lt
+	.loc 1 293 0
+	add	w4, w4, w4, lsr 31
+	asr	w4, w4, 1
+	.loc 1 296 0
+	asr	w10, w10, 4
+	sxtw	x10, w10
+	sxtw	x4, w4
+	.loc 1 297 0
+	cmp	w18, w12
+	bgt	.L648
+	.p2align 2
+.L721:
+	add	x1, x4, x0, sxtw 3
+	.loc 1 302 0
+	add	x3, x10, x0, sxtw
+	.loc 1 309 0
+	cmp	w15, 18
+	.loc 1 298 0
+	ldr	x25, [x9, x1]
+.LVL735:
+	.loc 1 299 0
+	ldr	x2, [x13, x1]
+.LVL736:
+	.loc 1 300 0
+	ldr	x8, [x14, x1]
+	.loc 1 302 0
+	ldrb	w5, [x11, x3]
+.LVL737:
+	.loc 1 309 0
+	beq	.L782
+	.loc 1 318 0
+	and	x2, x2, x8
+.LVL738:
+	.loc 1 317 0
+	cbz	w5, .L745
+.L646:
+	.loc 1 319 0
+	cmp	x25, x2
+	beq	.L645
+	.loc 1 320 0
+	str	x2, [x9, x1]
+	.loc 1 321 0
+	strb	w17, [x11, x3]
+.L645:
+	.loc 1 297 0
+	add	w0, w0, 1
+	cmp	w0, w12
+	ble	.L721
+.LVL739:
+.L648:
+	.loc 1 292 0
+	add	w16, w16, 1
+	cmp	w16, w21
+	bgt	.L637
+	ldr	w4, [x28, 56]
+	b	.L638
 .LVL740:
-	b	.L648
 	.p2align 3
-.L737:
-.LBE1736:
+.L767:
+.LBE1731:
 .LBE1735:
-	.loc 1 989 0
+	.loc 1 994 0
 	ldp	w8, w0, [x20, 108]
-	.loc 1 987 0
+	.loc 1 992 0
 	ldr	x4, [x27, 16]
-	.loc 1 989 0
+	.loc 1 994 0
 	mul	w8, w8, w0
-	.loc 1 988 0
+	.loc 1 993 0
 	ldr	x0, [x28, 208]
-	.loc 1 989 0
+	.loc 1 994 0
 	lsr	w8, w8, 1
-	.loc 1 988 0
+	.loc 1 993 0
 	ldr	x5, [x0, 16]
+.LBB1736:
 .LBB1737:
-.LBB1738:
-	.loc 1 769 0
+	.loc 1 767 0
 	asr	w0, w8, 3
-	cbz	w0, .L640
-	.loc 1 773 0
+	cbz	w0, .L656
+	.loc 1 771 0
 	ldr	x1, [x4]
 	ldr	x2, [x5]
 	cmp	x2, x1
-	bne	.L639
+	bne	.L655
 	sub	w3, w0, #1
 	mov	x0, 8
 	add	x3, x3, 1
 	lsl	x3, x3, 3
-	b	.L642
+	b	.L658
 	.p2align 3
-.L643:
-	.loc 1 770 0
+.L659:
+	.loc 1 768 0
 	ldr	x2, [x4, x0]
 	add	x0, x0, 8
-	.loc 1 771 0
+	.loc 1 769 0
 	add	x1, x5, x0
-	.loc 1 773 0
+	.loc 1 771 0
 	ldr	x1, [x1, -8]
 	cmp	x2, x1
-	bne	.L639
-.L642:
-	.loc 1 769 0
+	bne	.L655
+.L658:
+	.loc 1 767 0
 	cmp	x3, x0
-	bne	.L643
-.L640:
-	.loc 1 779 0
+	bne	.L659
+.L656:
+	.loc 1 777 0
 	ands	w8, w8, 7
 .LVL741:
-	beq	.L644
+	beq	.L660
 	sub	w1, w8, #1
 	mov	x0, 0
 	add	x1, x1, 1
 	lsl	x1, x1, 2
-	b	.L645
-	.p2align 3
-.L748:
-	add	x0, x0, 4
-	.loc 1 780 0
-	cmp	x0, x1
-	beq	.L644
-.L645:
-.LBB1739:
-	.loc 1 784 0
+	.p2align 2
+.L661:
+.LBB1738:
+	.loc 1 782 0
 	ldrb	w3, [x4, x0]
 	ldrb	w2, [x5, x0]
 	cmp	w3, w2
-	beq	.L748
-	b	.L639
-.LVL742:
-.L616:
-.LBE1739:
+	bne	.L655
+	add	x0, x0, 4
 .LBE1738:
+	.loc 1 778 0
+	cmp	x0, x1
+	bne	.L661
+.L660:
 .LBE1737:
+.LBE1736:
+	.loc 1 995 0
+	ldr	x0, [x28, 88]
+	adrp	x1, .LC89
+	add	x1, x1, :lo12:.LC89
+	bl	_dev_info
+.LVL742:
+	.loc 1 997 0
+	str	x25, [x28, 208]
+	.loc 1 998 0
+	b	.L640
+.LVL743:
+.L768:
+	.loc 1 1009 0
+	mov	w0, 2
+	str	w0, [x27, 40]
+	.loc 1 1010 0
+	mov	w26, 0
+	ldr	x0, [x28, 216]
+	ldr	w9, [x0, 40]
+	b	.L662
+.LVL744:
+.L631:
 	.loc 1 875 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC81
 	add	x1, x1, :lo12:.LC81
 	bl	_dev_info
-.LVL743:
+.LVL745:
 	.loc 1 876 0
 	mov	x0, x27
-	b	.L714
-.L732:
-	.loc 1 863 0
+	b	.L743
+.L764:
+	.loc 1 862 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC79
 	add	x1, x1, :lo12:.LC79
 	bl	_dev_info
-.LVL744:
-.LBB1740:
-	.loc 1 864 0
+.LVL746:
+.LBB1739:
+	.loc 1 863 0
 	ldr	w0, [x28, 76]
-	cbz	w0, .L749
-.L608:
-.LVL745:
-.L606:
-.LBE1740:
-	.loc 1 865 0 discriminator 11
+	cbz	w0, .L783
+.L621:
+.LVL747:
+.L619:
+.LBE1739:
+	.loc 1 864 0 discriminator 11
 	ldr	x0, [x28, 88]
-.LVL746:
+.LVL748:
 	adrp	x1, .LC80
 	add	x1, x1, :lo12:.LC80
 	bl	_dev_info
-.LVL747:
-	b	.L715
-.LVL748:
-	.p2align 3
-.L730:
-	.loc 1 832 0
-	str	wzr, [x28, 616]
-	b	.L596
 .LVL749:
-	.p2align 3
-.L736:
-	.loc 1 973 0
-	add	x0, x29, 152
-	str	x0, [x28, 208]
-	.loc 1 974 0
-	ldr	x0, [x28, 136]
-	str	x0, [x29, 168]
-	b	.L638
+	b	.L744
 .LVL750:
+.L779:
+.LBB1743:
+.LBB1723:
+.LBB1724:
+	.loc 1 1041 0 discriminator 1
+	add	x0, x24, 352
+.LBE1724:
+	mov	w1, 0
+.LBB1725:
+	str	x0, [x29, 104]
+.LBE1725:
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL751:
+	b	.L669
 	.p2align 3
-.L742:
-	.loc 1 1064 0
+.L784:
+.LVL752:
+.LBB1726:
+	.loc 1 1041 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L666
+	.loc 1 1041 0 discriminator 7
+	bl	schedule
+.LVL753:
+.L669:
+	.loc 1 1041 0 discriminator 9
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+	mov	w2, 1
+	bl	prepare_to_wait_event
+.LVL754:
+	ldr	w1, [x28, 76]
+	cbz	w1, .L784
+.LBE1726:
+	.loc 1 1041 0 discriminator 4
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+	bl	finish_wait
+.LVL755:
+.LBE1723:
+.LBE1743:
+	.loc 1 1043 0 is_stmt 1 discriminator 4
+	ldr	x2, [x21, #:lo12:jiffies]
+	mov	x1, 402653184
+	ldr	x0, [x29, 96]
+	add	x1, x2, x1
+	bl	mod_timer
+.LVL756:
+	.loc 1 1044 0 discriminator 4
+	str	wzr, [x28, 76]
+	.loc 1 1046 0 discriminator 4
+	str	x25, [x28, 208]
+	b	.L640
+.LVL757:
+	.p2align 3
+.L762:
+	.loc 1 830 0
+	str	wzr, [x28, 616]
+	b	.L609
+.LVL758:
+	.p2align 3
+.L772:
+	.loc 1 1069 0
 	ldr	x0, [x28, 88]
-	.loc 1 1062 0
+	.loc 1 1067 0
 	mov	w21, 1
-	.loc 1 1061 0
+.LVL759:
+	.loc 1 1066 0
 	str	wzr, [x28, 196]
-	.loc 1 1064 0
+	.loc 1 1069 0
 	adrp	x1, .LC88
-	.loc 1 1062 0
+	.loc 1 1067 0
 	str	w21, [x28, 600]
-	.loc 1 1064 0
+	.loc 1 1069 0
 	add	x1, x1, :lo12:.LC88
-	.loc 1 1063 0
+	.loc 1 1068 0
 	str	wzr, [x28, 616]
-	.loc 1 1064 0
+	.loc 1 1069 0
 	bl	_dev_info
-.LVL751:
-	.loc 1 1065 0
+.LVL760:
+	.loc 1 1070 0
 	mov	x0, 2
 	bl	ebc_notify
-.LVL752:
-	.loc 1 1066 0
+.LVL761:
+	.loc 1 1071 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x24, 328
 	bl	__wake_up_sync
-.LVL753:
-	b	.L655
-.LVL754:
-.L738:
-	.loc 1 1004 0
-	mov	w0, 2
-	str	w0, [x27, 40]
-	.loc 1 1005 0
-	mov	w26, 0
-	ldr	x0, [x28, 216]
-	ldr	w9, [x0, 40]
-	b	.L646
-.LVL755:
-.L733:
-	.loc 1 918 0
+.LVL762:
+	b	.L671
+.LVL763:
+	.p2align 3
+.L782:
+.LBB1744:
+.LBB1732:
+	.loc 1 311 0
+	orn	x2, x8, x2
+.LVL764:
+	.loc 1 310 0
+	cbnz	w5, .L646
+.L745:
+	.loc 1 318 0
+	str	x2, [x9, x1]
+	b	.L645
+.LVL765:
+.L774:
+.LBE1732:
+.LBE1744:
+	.loc 1 919 0
 	ldrsw	x2, [x28, 20]
 	mov	w1, 255
 	ldr	x0, [x28, 144]
 	bl	memset
-.LVL756:
-	.loc 1 920 0
+.LVL766:
+	.loc 1 921 0
 	ldr	x0, [x28, 208]
 	ldr	w0, [x0, 40]
+	.loc 1 923 0
 	cmp	w0, 1
-	bls	.L634
-	.loc 1 922 0
+	.loc 1 921 0
+	ccmp	w0, 18, 4, hi
+	beq	.L650
+	.loc 1 924 0
 	ldr	x0, [x28, 216]
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x28, 128]
 	bl	memcpy
-.LVL757:
-	.loc 1 923 0
+.LVL767:
+	.loc 1 925 0
 	ldr	x0, [x28, 208]
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x28, 136]
 	bl	memcpy
-.LVL758:
-	b	.L635
-.L747:
-.LBB1744:
-.LBB1731:
-.LBB1732:
-	.loc 1 1036 0 discriminator 1
-	add	x0, x24, 352
-.LBE1732:
-	mov	w1, 0
-.LBB1733:
-	str	x0, [x29, 104]
-.LBE1733:
-	add	x0, x29, 112
-	bl	init_wait_entry
-.LVL759:
-	b	.L653
-	.p2align 3
-.L750:
-.LVL760:
-.LBB1734:
-	.loc 1 1036 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L650
-	.loc 1 1036 0 discriminator 7
-	bl	schedule
-.LVL761:
-.L653:
-	.loc 1 1036 0 discriminator 9
-	ldr	x0, [x29, 104]
-	add	x1, x29, 112
-	mov	w2, 1
-	bl	prepare_to_wait_event
-.LVL762:
-	ldr	w1, [x28, 76]
-	cbz	w1, .L750
-.LBE1734:
-	.loc 1 1036 0 discriminator 4
-	ldr	x0, [x29, 104]
-	add	x1, x29, 112
-	bl	finish_wait
-.LVL763:
-	b	.L650
-.L745:
-.LBE1731:
-.LBE1744:
-	.loc 1 889 0 is_stmt 1
-	cbnz	w0, .L619
-	.loc 1 890 0
+.LVL768:
+	b	.L651
+.L780:
+	.loc 1 887 0
 	ldrsw	x2, [x28, 20]
-	ldp	x1, x0, [x28, 136]
+	ldr	x1, [x1, 16]
+	ldr	x0, [x28, 128]
 	bl	memcpy
-.LVL764:
-	b	.L619
-.L749:
+.LVL769:
+	.loc 1 888 0
+	ldr	x0, [x28, 208]
+	ldrsw	x2, [x28, 20]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x28, 136]
+	bl	memcpy
+.LVL770:
+	.loc 1 889 0
+	ldr	x0, [x28, 208]
+	ldrsw	x2, [x28, 20]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x28, 144]
+	bl	memcpy
+.LVL771:
+	b	.L634
+.L775:
 .LBB1745:
+.LBB1746:
+	mov	x0, x20
+	bl	ebc_power_set.part.3
+.LVL772:
+	b	.L652
+.L776:
+.LBE1746:
+.LBE1745:
+	.loc 1 940 0
+	ldr	x0, [x28, 88]
+	adrp	x1, .LC83
+	add	x1, x1, :lo12:.LC83
+	bl	_dev_err
+.LVL773:
+	.loc 1 941 0
+	b	.L640
+.L783:
+.LBB1747:
+.LBB1740:
 .LBB1741:
-.LBB1742:
-	.loc 1 864 0 discriminator 1
+	.loc 1 863 0 discriminator 1
 	add	x25, x24, 352
-.LVL765:
-.LBE1742:
+.LVL774:
+.LBE1741:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL766:
-	b	.L609
+.LVL775:
+	b	.L622
 	.p2align 3
-.L751:
-.LVL767:
-.LBB1743:
-	.loc 1 864 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L606
-	.loc 1 864 0 discriminator 7
+.L785:
+.LVL776:
+.LBB1742:
+	.loc 1 863 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L619
+	.loc 1 863 0 discriminator 7
 	bl	schedule
-.LVL768:
-.L609:
-	.loc 1 864 0 discriminator 9
+.LVL777:
+.L622:
+	.loc 1 863 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x25
 	bl	prepare_to_wait_event
-.LVL769:
+.LVL778:
 	ldr	w1, [x28, 76]
-	cbz	w1, .L751
-.LBE1743:
-	.loc 1 864 0 discriminator 4
+	cbz	w1, .L785
+.LBE1742:
+	.loc 1 863 0 discriminator 4
 	mov	x0, x25
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL770:
-	b	.L606
-.LVL771:
-.L622:
-.LBE1741:
-.LBE1745:
-	.loc 1 897 0 is_stmt 1
+.LVL779:
+	b	.L619
+.LVL780:
+.L637:
+.LBE1740:
+.LBE1747:
+	.loc 1 898 0 is_stmt 1
 	ldr	w0, [x28, 28]
-.LVL772:
-	cbnz	w0, .L625
-	.loc 1 900 0
+.LVL781:
+	cbnz	w0, .L640
+	.loc 1 901 0
 	ldr	w0, [x28, 192]
-	.loc 1 898 0
-	mov	w1, 1
 	.loc 1 899 0
+	mov	w1, 1
+	.loc 1 900 0
 	str	wzr, [x28, 76]
-	.loc 1 898 0
+	.loc 1 899 0
 	str	w1, [x28, 28]
-	.loc 1 900 0
-	cbz	w0, .L752
-.L633:
-	.loc 1 902 0
+	.loc 1 901 0
+	cbz	w0, .L786
+.L649:
+	.loc 1 903 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL773:
+.LVL782:
 	cmn	w0, #1
-	beq	.L625
-	.loc 1 906 0
+	beq	.L640
+	.loc 1 907 0
 	ldr	w3, [x28, 96]
-	.loc 1 909 0
+	.loc 1 910 0
 	adrp	x1, .LC82
-	.loc 1 906 0
+	.loc 1 907 0
 	strb	w3, [x28, 32]
-	.loc 1 909 0
+	.loc 1 910 0
 	add	x1, x1, :lo12:.LC82
 	ldr	x0, [x28, 88]
-	b	.L716
-.L724:
-	.loc 1 807 0
+	b	.L747
+.L756:
+	.loc 1 805 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.7
-.LVL774:
-	b	.L593
-.LVL775:
-.L644:
-	.loc 1 990 0
-	ldr	x0, [x28, 88]
-	adrp	x1, .LC89
-	add	x1, x1, :lo12:.LC89
-	bl	_dev_info
-.LVL776:
-	.loc 1 992 0
-	str	x25, [x28, 208]
-	.loc 1 993 0
-	b	.L625
-.L734:
-.LBB1746:
-.LBB1747:
-	mov	x0, x20
-	bl	ebc_power_set.part.3
-.LVL777:
-	b	.L636
-.L735:
-.LBE1747:
-.LBE1746:
-	.loc 1 938 0
-	ldr	x0, [x28, 88]
-	adrp	x1, .LC83
-	add	x1, x1, :lo12:.LC83
-	bl	_dev_err
-.LVL778:
-	.loc 1 939 0
-	b	.L625
-.LVL779:
-.L752:
+.LVL783:
+	b	.L606
+.LVL784:
+.L781:
+	.loc 1 891 0
+	ldrsw	x2, [x28, 20]
+	ldp	x1, x0, [x28, 136]
+	bl	memcpy
+.LVL785:
+	b	.L634
+.LVL786:
+.L786:
 .LBB1748:
 .LBB1749:
 	mov	x0, x20
 	bl	ebc_power_set.part.3
-.LVL780:
-	b	.L633
-.L731:
+.LVL787:
+	b	.L649
+.L763:
 .LBE1749:
 .LBE1748:
 .LBB1750:
 .LBB1751:
 	mov	x0, x20
 	bl	ebc_power_set.part.3
-.LVL781:
-	b	.L601
-.L725:
+.LVL788:
+	b	.L614
+.L757:
 .LBE1751:
 .LBE1750:
-	.loc 1 1099 0
+	.loc 1 1104 0
 	bl	__stack_chk_fail
-.LVL782:
+.LVL789:
 	.cfi_endproc
 .LFE2819:
 	.size	ebc_thread, .-ebc_thread
@@ -8402,24 +8461,24 @@ ebc_auto_task:
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.34837, %object
-	.size	__func__.34837, 11
-__func__.34837:
+	.type	__func__.34846, %object
+	.size	__func__.34846, 11
+__func__.34846:
 	.string	"ebc_io_ctl"
 	.align	3
 	.set	.LANCHOR3,. + 0
-	.type	__func__.34644, %object
-	.size	__func__.34644, 16
-__func__.34644:
+	.type	__func__.34647, %object
+	.size	__func__.34647, 16
+__func__.34647:
 	.string	"ebc_frame_start"
-	.type	__func__.35045, %object
-	.size	__func__.35045, 19
-__func__.35045:
+	.type	__func__.35054, %object
+	.size	__func__.35054, 19
+__func__.35054:
 	.string	"ebc_lut_table_init"
 	.zero	5
-	.type	__func__.35104, %object
-	.size	__func__.35104, 12
-__func__.35104:
+	.type	__func__.35113, %object
+	.size	__func__.35113, 12
+__func__.35113:
 	.string	"ebc_suspend"
 	.zero	4
 	.type	ebc_match, %object
@@ -8450,9 +8509,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init1969, %object
-	.size	__addressable_ebc_init1969, 8
-__addressable_ebc_init1969:
+	.type	__addressable_ebc_init1974, %object
+	.size	__addressable_ebc_init1974, 8
+__addressable_ebc_init1974:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -8507,7 +8566,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC15:
-	.string	"1.13"
+	.string	"1.14"
 	.zero	3
 .LC16:
 	.string	"%s\n"
@@ -8940,15 +8999,15 @@ __exitcall_ebc_exit:
 	.file 212 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x13e7c
+	.4byte	0x13ea6
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF3270
-	.byte	0x1
-	.4byte	.LASF3271
 	.4byte	.LASF3272
+	.byte	0x1
+	.4byte	.LASF3273
+	.4byte	.LASF3274
 	.4byte	.Ldebug_ranges0+0x10a0
 	.8byte	0
 	.4byte	.Ldebug_line0
@@ -26480,7 +26539,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x3
 	.4byte	0x91f9
 	.uleb128 0x46
-	.4byte	.LASF3016
+	.4byte	.LASF3018
 	.byte	0x1f
 	.2byte	0xba2
 	.4byte	0x9209
@@ -30949,121 +31008,121 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2396
 	.byte	0xa
 	.byte	0x85
-	.4byte	0xdc0f
+	.4byte	0xdc1b
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF2397
 	.byte	0xa
 	.byte	0x88
-	.4byte	0xdc34
+	.4byte	0xdc40
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF108
 	.byte	0xa
 	.byte	0x8b
-	.4byte	0xdc62
+	.4byte	0xdc6e
 	.byte	0x10
 	.uleb128 0xe
 	.4byte	.LASF2398
 	.byte	0xa
 	.byte	0x8f
-	.4byte	0xdc96
+	.4byte	0xdca2
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF2399
 	.byte	0xa
 	.byte	0x92
-	.4byte	0xdcc4
+	.4byte	0xdcd0
 	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF2400
 	.byte	0xa
 	.byte	0x96
-	.4byte	0xdce9
+	.4byte	0xdcf5
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF2401
 	.byte	0xa
 	.byte	0x9d
-	.4byte	0xdd12
+	.4byte	0xdd1e
 	.byte	0x30
 	.uleb128 0xe
 	.4byte	.LASF2402
 	.byte	0xa
 	.byte	0xa0
-	.4byte	0xdd37
+	.4byte	0xdd43
 	.byte	0x38
 	.uleb128 0xe
 	.4byte	.LASF2403
 	.byte	0xa
 	.byte	0xa4
-	.4byte	0xdd60
+	.4byte	0xdd6c
 	.byte	0x40
 	.uleb128 0xe
 	.4byte	.LASF2404
 	.byte	0xa
 	.byte	0xa7
-	.4byte	0xdce9
+	.4byte	0xdcf5
 	.byte	0x48
 	.uleb128 0xe
 	.4byte	.LASF2405
 	.byte	0xa
 	.byte	0xaa
-	.4byte	0xdd80
+	.4byte	0xdd8c
 	.byte	0x50
 	.uleb128 0xe
 	.4byte	.LASF2406
 	.byte	0xa
 	.byte	0xad
-	.4byte	0xdd80
+	.4byte	0xdd8c
 	.byte	0x58
 	.uleb128 0xe
 	.4byte	.LASF2407
 	.byte	0xa
 	.byte	0xb0
-	.4byte	0xdda0
+	.4byte	0xddac
 	.byte	0x60
 	.uleb128 0xe
 	.4byte	.LASF2408
 	.byte	0xa
 	.byte	0xb3
-	.4byte	0xdda0
+	.4byte	0xddac
 	.byte	0x68
 	.uleb128 0xe
 	.4byte	.LASF2409
 	.byte	0xa
 	.byte	0xb6
-	.4byte	0xddc0
+	.4byte	0xddcc
 	.byte	0x70
 	.uleb128 0xe
 	.4byte	.LASF2410
 	.byte	0xa
 	.byte	0xb8
-	.4byte	0xddda
+	.4byte	0xdde6
 	.byte	0x78
 	.uleb128 0xe
 	.4byte	.LASF2411
 	.byte	0xa
 	.byte	0xb9
-	.4byte	0xddf4
+	.4byte	0xde00
 	.byte	0x80
 	.uleb128 0xe
 	.4byte	.LASF2412
 	.byte	0xa
 	.byte	0xba
-	.4byte	0xddf4
+	.4byte	0xde00
 	.byte	0x88
 	.uleb128 0xe
 	.4byte	.LASF2413
 	.byte	0xa
 	.byte	0xbb
-	.4byte	0xde1d
+	.4byte	0xde29
 	.byte	0x90
 	.uleb128 0xe
 	.4byte	.LASF2414
 	.byte	0xa
 	.byte	0xbd
-	.4byte	0xde38
+	.4byte	0xde44
 	.byte	0x98
 	.uleb128 0xe
 	.4byte	.LASF129
@@ -35149,7 +35208,7 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0xc4
 	.byte	0x3b
-	.4byte	0xd9bd
+	.4byte	0xd9c9
 	.uleb128 0xc
 	.4byte	.LASF2871
 	.byte	0
@@ -35204,86 +35263,92 @@ __exitcall_ebc_exit:
 	.uleb128 0xc
 	.4byte	.LASF2888
 	.byte	0x11
+	.uleb128 0xc
+	.4byte	.LASF2889
+	.byte	0x12
+	.uleb128 0xc
+	.4byte	.LASF2890
+	.byte	0x13
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2889
+	.4byte	.LASF2891
 	.byte	0x2c
 	.byte	0xc4
-	.byte	0x53
-	.4byte	0xda4e
+	.byte	0x55
+	.4byte	0xda5a
 	.uleb128 0xe
 	.4byte	.LASF881
 	.byte	0xc4
-	.byte	0x54
+	.byte	0x56
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2890
+	.4byte	.LASF2892
 	.byte	0xc4
-	.byte	0x55
+	.byte	0x57
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
-	.4byte	.LASF2891
+	.4byte	.LASF2893
 	.byte	0xc4
-	.byte	0x56
+	.byte	0x58
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF261
 	.byte	0xc4
-	.byte	0x57
+	.byte	0x59
 	.4byte	0xc6
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF2892
+	.4byte	.LASF2894
 	.byte	0xc4
-	.byte	0x58
+	.byte	0x5a
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
 	.4byte	.LASF2866
 	.byte	0xc4
-	.byte	0x59
+	.byte	0x5b
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
 	.4byte	.LASF2867
 	.byte	0xc4
-	.byte	0x5a
+	.byte	0x5c
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF2868
 	.byte	0xc4
-	.byte	0x5b
+	.byte	0x5d
 	.4byte	0xc6
 	.byte	0x1c
 	.uleb128 0xe
 	.4byte	.LASF2869
 	.byte	0xc4
-	.byte	0x5c
+	.byte	0x5e
 	.4byte	0xc6
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2893
+	.4byte	.LASF2895
 	.byte	0xc4
-	.byte	0x5d
+	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x24
 	.uleb128 0xe
-	.4byte	.LASF2894
+	.4byte	.LASF2896
 	.byte	0xc4
-	.byte	0x5e
+	.byte	0x60
 	.4byte	0xc6
 	.byte	0x28
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2895
+	.4byte	.LASF2897
 	.byte	0x50
 	.byte	0x3
 	.byte	0x10
-	.4byte	0xdac7
+	.4byte	0xdad3
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x3
@@ -35291,134 +35356,134 @@ __exitcall_ebc_exit:
 	.4byte	0xa545
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2896
+	.4byte	.LASF2898
 	.byte	0x3
 	.byte	0x12
 	.4byte	0x47ad
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2897
+	.4byte	.LASF2899
 	.byte	0x3
 	.byte	0x13
 	.4byte	0x443
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2898
+	.4byte	.LASF2900
 	.byte	0x3
 	.byte	0x14
-	.4byte	0xdadd
+	.4byte	0xdae9
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2899
+	.4byte	.LASF2901
 	.byte	0x3
 	.byte	0x15
-	.4byte	0xdaee
+	.4byte	0xdafa
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2900
+	.4byte	.LASF2902
 	.byte	0x3
 	.byte	0x16
-	.4byte	0xdaee
+	.4byte	0xdafa
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2901
+	.4byte	.LASF2903
 	.byte	0x3
 	.byte	0x17
-	.4byte	0xdb08
+	.4byte	0xdb14
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2902
+	.4byte	.LASF2904
 	.byte	0x3
 	.byte	0x18
-	.4byte	0xdb1d
+	.4byte	0xdb29
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2903
+	.4byte	.LASF2905
 	.byte	0x3
 	.byte	0x19
-	.4byte	0xdb37
+	.4byte	0xdb43
 	.byte	0x48
 	.byte	0
 	.uleb128 0x10
-	.4byte	0xdad7
+	.4byte	0xdae3
 	.uleb128 0x11
-	.4byte	0xdad7
+	.4byte	0xdae3
 	.uleb128 0x11
 	.4byte	0x29b
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xda4e
+	.4byte	0xda5a
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdac7
+	.4byte	0xdad3
 	.uleb128 0x10
-	.4byte	0xdaee
+	.4byte	0xdafa
 	.uleb128 0x11
-	.4byte	0xdad7
+	.4byte	0xdae3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdae3
+	.4byte	0xdaef
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdb08
+	.4byte	0xdb14
 	.uleb128 0x11
-	.4byte	0xdad7
+	.4byte	0xdae3
 	.uleb128 0x11
 	.4byte	0x4653
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdaf4
+	.4byte	0xdb00
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdb1d
+	.4byte	0xdb29
 	.uleb128 0x11
-	.4byte	0xdad7
+	.4byte	0xdae3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb0e
+	.4byte	0xdb1a
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdb37
+	.4byte	0xdb43
 	.uleb128 0x11
-	.4byte	0xdad7
+	.4byte	0xdae3
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb23
+	.4byte	0xdb2f
 	.uleb128 0x1f
-	.4byte	.LASF2904
+	.4byte	.LASF2906
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc5
 	.byte	0x5
-	.4byte	0xdb66
+	.4byte	0xdb72
 	.uleb128 0xc
-	.4byte	.LASF2905
+	.4byte	.LASF2907
 	.byte	0
 	.uleb128 0xc
-	.4byte	.LASF2906
+	.4byte	.LASF2908
 	.byte	0x1
 	.uleb128 0xc
-	.4byte	.LASF2907
+	.4byte	.LASF2909
 	.byte	0x2
 	.uleb128 0xc
-	.4byte	.LASF2908
+	.4byte	.LASF2910
 	.byte	0x3
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2909
+	.4byte	.LASF2911
 	.byte	0x20
 	.byte	0xc6
 	.byte	0xb
-	.4byte	0xdbaf
+	.4byte	0xdbbb
 	.uleb128 0xe
-	.4byte	.LASF2910
+	.4byte	.LASF2912
 	.byte	0xc6
 	.byte	0xc
 	.4byte	0x29
@@ -35436,38 +35501,38 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0xc
 	.uleb128 0xe
-	.4byte	.LASF2911
+	.4byte	.LASF2913
 	.byte	0xc6
 	.byte	0xf
 	.4byte	0x310
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2912
+	.4byte	.LASF2914
 	.byte	0xc6
 	.byte	0x11
 	.4byte	0x6d
 	.byte	0x18
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2913
+	.4byte	.LASF2915
 	.byte	0x10
 	.byte	0xc6
 	.byte	0x2a
-	.4byte	0xdbe0
+	.4byte	0xdbec
 	.uleb128 0x20
 	.string	"sgl"
 	.byte	0xc6
 	.byte	0x2b
-	.4byte	0xdbe0
+	.4byte	0xdbec
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2914
+	.4byte	.LASF2916
 	.byte	0xc6
 	.byte	0x2c
 	.4byte	0x6d
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2915
+	.4byte	.LASF2917
 	.byte	0xc6
 	.byte	0x2d
 	.4byte	0x6d
@@ -35475,16 +35540,16 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdb66
+	.4byte	0xdb72
 	.uleb128 0x14
 	.4byte	0x443
-	.4byte	0xdc09
+	.4byte	0xdc15
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdc09
+	.4byte	0xdc15
 	.uleb128 0x11
 	.4byte	0x31b
 	.uleb128 0x11
@@ -35495,9 +35560,9 @@ __exitcall_ebc_exit:
 	.4byte	0x310
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdbe6
+	.4byte	0xdbf2
 	.uleb128 0x10
-	.4byte	0xdc34
+	.4byte	0xdc40
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -35511,10 +35576,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc15
+	.4byte	0xdc21
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdc62
+	.4byte	0xdc6e
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -35530,14 +35595,14 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc3a
+	.4byte	0xdc46
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdc90
+	.4byte	0xdc9c
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
-	.4byte	0xdc90
+	.4byte	0xdc9c
 	.uleb128 0x11
 	.4byte	0x443
 	.uleb128 0x11
@@ -35549,13 +35614,13 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdbaf
+	.4byte	0xdbbb
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc68
+	.4byte	0xdc74
 	.uleb128 0x14
 	.4byte	0x310
-	.4byte	0xdcc4
+	.4byte	0xdcd0
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -35565,15 +35630,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdb3d
+	.4byte	0xdb49
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdc9c
+	.4byte	0xdca8
 	.uleb128 0x10
-	.4byte	0xdce9
+	.4byte	0xdcf5
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -35581,49 +35646,49 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdb3d
+	.4byte	0xdb49
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdcca
+	.4byte	0xdcd6
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xdd12
+	.4byte	0xdd1e
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
-	.4byte	0xdbe0
+	.4byte	0xdbec
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdb3d
+	.4byte	0xdb49
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdcef
+	.4byte	0xdcfb
 	.uleb128 0x10
-	.4byte	0xdd37
+	.4byte	0xdd43
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
-	.4byte	0xdbe0
+	.4byte	0xdbec
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdb3d
+	.4byte	0xdb49
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd18
+	.4byte	0xdd24
 	.uleb128 0x14
 	.4byte	0x310
-	.4byte	0xdd60
+	.4byte	0xdd6c
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -35631,15 +35696,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdb3d
+	.4byte	0xdb49
 	.uleb128 0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd3d
+	.4byte	0xdd49
 	.uleb128 0x10
-	.4byte	0xdd80
+	.4byte	0xdd8c
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -35647,27 +35712,27 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdb3d
+	.4byte	0xdb49
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd66
+	.4byte	0xdd72
 	.uleb128 0x10
-	.4byte	0xdda0
+	.4byte	0xddac
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
-	.4byte	0xdbe0
+	.4byte	0xdbec
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
-	.4byte	0xdb3d
+	.4byte	0xdb49
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdd86
+	.4byte	0xdd92
 	.uleb128 0x10
-	.4byte	0xddc0
+	.4byte	0xddcc
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -35675,14 +35740,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x11
 	.4byte	0x2ce
 	.uleb128 0x11
-	.4byte	0xdb3d
+	.4byte	0xdb49
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdda6
+	.4byte	0xddb2
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xddda
+	.4byte	0xdde6
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -35690,10 +35755,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xddc6
+	.4byte	0xddd2
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xddf4
+	.4byte	0xde00
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -35701,10 +35766,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdde0
+	.4byte	0xddec
 	.uleb128 0x14
 	.4byte	0x443
-	.4byte	0xde1d
+	.4byte	0xde29
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -35718,9 +35783,9 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xddfa
+	.4byte	0xde06
 	.uleb128 0x10
-	.4byte	0xde38
+	.4byte	0xde44
 	.uleb128 0x11
 	.4byte	0xa545
 	.uleb128 0x11
@@ -35730,58 +35795,58 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde23
+	.4byte	0xde2f
 	.uleb128 0x19
-	.4byte	.LASF2916
+	.4byte	.LASF2918
 	.byte	0xa
 	.byte	0xc9
 	.4byte	0xb789
 	.uleb128 0x19
-	.4byte	.LASF2917
+	.4byte	.LASF2919
 	.byte	0xa
 	.byte	0xca
 	.4byte	0xb789
 	.uleb128 0x19
-	.4byte	.LASF2918
+	.4byte	.LASF2920
 	.byte	0xa
 	.byte	0xcb
 	.4byte	0xb789
 	.uleb128 0x24
-	.4byte	.LASF2919
+	.4byte	.LASF2921
 	.uleb128 0x19
-	.4byte	.LASF2920
+	.4byte	.LASF2922
 	.byte	0xc7
 	.byte	0x7
-	.4byte	0xde6f
+	.4byte	0xde7b
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde5f
+	.4byte	0xde6b
 	.uleb128 0x24
-	.4byte	.LASF2921
+	.4byte	.LASF2923
 	.uleb128 0x19
-	.4byte	.LASF2922
+	.4byte	.LASF2924
 	.byte	0xc7
 	.byte	0x8
-	.4byte	0xde85
+	.4byte	0xde91
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xde75
+	.4byte	0xde81
 	.uleb128 0x19
-	.4byte	.LASF2923
+	.4byte	.LASF2925
 	.byte	0xc7
 	.byte	0x16
 	.4byte	0xb78e
 	.uleb128 0x19
-	.4byte	.LASF2924
+	.4byte	.LASF2926
 	.byte	0xc8
 	.byte	0x1b
 	.4byte	0xb789
 	.uleb128 0xd
-	.4byte	.LASF2925
+	.4byte	.LASF2927
 	.byte	0x18
 	.byte	0xc9
 	.byte	0xf
-	.4byte	0xded2
+	.4byte	0xdede
 	.uleb128 0xe
 	.4byte	.LASF2863
 	.byte	0xc9
@@ -35802,11 +35867,11 @@ __exitcall_ebc_exit:
 	.byte	0x10
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2926
+	.4byte	.LASF2928
 	.byte	0xa0
 	.byte	0xc9
 	.byte	0x15
-	.4byte	0xe016
+	.4byte	0xe022
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xc9
@@ -35814,25 +35879,25 @@ __exitcall_ebc_exit:
 	.4byte	0xa545
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2927
+	.4byte	.LASF2929
 	.byte	0xc9
 	.byte	0x17
-	.4byte	0xe0d7
+	.4byte	0xe0e3
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2928
+	.4byte	.LASF2930
 	.byte	0xc9
 	.byte	0x18
-	.4byte	0xdad7
+	.4byte	0xdae3
 	.byte	0x10
 	.uleb128 0x20
 	.string	"fb"
 	.byte	0xc9
 	.byte	0x19
-	.4byte	0xe0dd
+	.4byte	0xe0e9
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2929
+	.4byte	.LASF2931
 	.byte	0xc9
 	.byte	0x1a
 	.4byte	0xc6
@@ -35844,43 +35909,43 @@ __exitcall_ebc_exit:
 	.4byte	0x13a
 	.byte	0x4c
 	.uleb128 0xe
-	.4byte	.LASF2891
+	.4byte	.LASF2893
 	.byte	0xc9
 	.byte	0x1d
 	.4byte	0x13a
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2930
+	.4byte	.LASF2932
 	.byte	0xc9
 	.byte	0x1e
 	.4byte	0x13a
 	.byte	0x54
 	.uleb128 0xe
-	.4byte	.LASF2931
+	.4byte	.LASF2933
 	.byte	0xc9
 	.byte	0x1f
 	.4byte	0x13a
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2893
+	.4byte	.LASF2895
 	.byte	0xc9
 	.byte	0x20
 	.4byte	0x13a
 	.byte	0x5c
 	.uleb128 0xe
-	.4byte	.LASF2894
+	.4byte	.LASF2896
 	.byte	0xc9
 	.byte	0x21
 	.4byte	0x13a
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2932
+	.4byte	.LASF2934
 	.byte	0xc9
 	.byte	0x22
 	.4byte	0x13a
 	.byte	0x64
 	.uleb128 0xe
-	.4byte	.LASF2933
+	.4byte	.LASF2935
 	.byte	0xc9
 	.byte	0x23
 	.4byte	0x13a
@@ -35910,13 +35975,13 @@ __exitcall_ebc_exit:
 	.4byte	0x13a
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2934
+	.4byte	.LASF2936
 	.byte	0xc9
 	.byte	0x28
 	.4byte	0x13a
 	.byte	0x7c
 	.uleb128 0xe
-	.4byte	.LASF2935
+	.4byte	.LASF2937
 	.byte	0xc9
 	.byte	0x29
 	.4byte	0x13a
@@ -35946,30 +36011,30 @@ __exitcall_ebc_exit:
 	.4byte	0x13a
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2936
+	.4byte	.LASF2938
 	.byte	0xc9
 	.byte	0x2e
 	.4byte	0x13a
 	.byte	0x94
 	.uleb128 0xe
-	.4byte	.LASF2892
+	.4byte	.LASF2894
 	.byte	0xc9
 	.byte	0x2f
 	.4byte	0x13a
 	.byte	0x98
 	.uleb128 0xe
-	.4byte	.LASF2937
+	.4byte	.LASF2939
 	.byte	0xc9
 	.byte	0x30
 	.4byte	0x13a
 	.byte	0x9c
 	.byte	0
 	.uleb128 0xd
-	.4byte	.LASF2938
+	.4byte	.LASF2940
 	.byte	0x70
 	.byte	0xb
 	.byte	0x17
-	.4byte	0xe0d7
+	.4byte	0xe0e3
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0xb
@@ -35977,7 +36042,7 @@ __exitcall_ebc_exit:
 	.4byte	0xa545
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2939
+	.4byte	.LASF2941
 	.byte	0xb
 	.byte	0x19
 	.4byte	0x443
@@ -35995,67 +36060,67 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2940
+	.4byte	.LASF2942
 	.byte	0xb
 	.byte	0x1d
-	.4byte	0xe0f2
+	.4byte	0xe0fe
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2941
+	.4byte	.LASF2943
 	.byte	0xb
 	.byte	0x1e
-	.4byte	0xe0f2
+	.4byte	0xe0fe
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2942
+	.4byte	.LASF2944
 	.byte	0xb
 	.byte	0x1f
-	.4byte	0xe0fd
+	.4byte	0xe109
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2943
+	.4byte	.LASF2945
 	.byte	0xb
 	.byte	0x21
-	.4byte	0xe11d
+	.4byte	0xe129
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2944
+	.4byte	.LASF2946
 	.byte	0xb
 	.byte	0x22
-	.4byte	0xe12e
+	.4byte	0xe13a
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2945
+	.4byte	.LASF2947
 	.byte	0xb
 	.byte	0x23
-	.4byte	0xe153
+	.4byte	0xe15f
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2946
+	.4byte	.LASF2948
 	.byte	0xb
 	.byte	0x24
-	.4byte	0xe16e
+	.4byte	0xe17a
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2947
+	.4byte	.LASF2949
 	.byte	0xb
 	.byte	0x25
-	.4byte	0xe184
+	.4byte	0xe190
 	.byte	0x50
 	.uleb128 0xe
-	.4byte	.LASF2948
+	.4byte	.LASF2950
 	.byte	0xb
 	.byte	0x26
-	.4byte	0xe1a8
+	.4byte	0xe1b4
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2949
+	.4byte	.LASF2951
 	.byte	0xb
 	.byte	0x27
-	.4byte	0xe1be
+	.4byte	0xe1ca
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2950
+	.4byte	.LASF2952
 	.byte	0xb
 	.byte	0x29
 	.4byte	0x4a2
@@ -36063,10 +36128,10 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe016
+	.4byte	0xe022
 	.uleb128 0x5
-	.4byte	0xdea1
-	.4byte	0xe0ed
+	.4byte	0xdead
+	.4byte	0xe0f9
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
@@ -36075,38 +36140,38 @@ __exitcall_ebc_exit:
 	.string	"clk"
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe0ed
+	.4byte	0xe0f9
 	.uleb128 0x24
-	.4byte	.LASF2951
+	.4byte	.LASF2953
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe0f8
+	.4byte	0xe104
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xe117
+	.4byte	0xe123
 	.uleb128 0x11
-	.4byte	0xe0d7
+	.4byte	0xe0e3
 	.uleb128 0x11
-	.4byte	0xe117
+	.4byte	0xe123
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xded2
+	.4byte	0xdede
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe103
+	.4byte	0xe10f
 	.uleb128 0x10
-	.4byte	0xe12e
+	.4byte	0xe13a
 	.uleb128 0x11
-	.4byte	0xe0d7
+	.4byte	0xe0e3
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe123
+	.4byte	0xe12f
 	.uleb128 0x10
-	.4byte	0xe153
+	.4byte	0xe15f
 	.uleb128 0x11
-	.4byte	0xe0d7
+	.4byte	0xe0e3
 	.uleb128 0x11
 	.4byte	0xc6
 	.uleb128 0x11
@@ -36118,11 +36183,11 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe134
+	.4byte	0xe140
 	.uleb128 0x10
-	.4byte	0xe16e
+	.4byte	0xe17a
 	.uleb128 0x11
-	.4byte	0xe0d7
+	.4byte	0xe0e3
 	.uleb128 0x11
 	.4byte	0x13a
 	.uleb128 0x11
@@ -36130,22 +36195,22 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe159
+	.4byte	0xe165
 	.uleb128 0x10
-	.4byte	0xe184
+	.4byte	0xe190
 	.uleb128 0x11
-	.4byte	0xe0d7
+	.4byte	0xe0e3
 	.uleb128 0x11
 	.4byte	0x13a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe174
+	.4byte	0xe180
 	.uleb128 0x14
 	.4byte	0xc6
-	.4byte	0xe1a8
+	.4byte	0xe1b4
 	.uleb128 0x11
-	.4byte	0xe0d7
+	.4byte	0xe0e3
 	.uleb128 0x11
 	.4byte	0x3548
 	.uleb128 0x11
@@ -36155,97 +36220,97 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe18a
+	.4byte	0xe196
 	.uleb128 0x10
-	.4byte	0xe1be
+	.4byte	0xe1ca
 	.uleb128 0x11
-	.4byte	0xe0d7
+	.4byte	0xe0e3
 	.uleb128 0x11
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1ae
+	.4byte	0xe1ba
 	.uleb128 0x26
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.2byte	0x270
 	.byte	0x1
 	.byte	0x33
-	.4byte	0xe3ec
+	.4byte	0xe3f8
 	.uleb128 0xe
-	.4byte	.LASF2953
+	.4byte	.LASF2955
 	.byte	0x1
 	.byte	0x34
 	.4byte	0x29
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2954
+	.4byte	.LASF2956
 	.byte	0x1
 	.byte	0x35
 	.4byte	0x219
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2955
+	.4byte	.LASF2957
 	.byte	0x1
 	.byte	0x36
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2956
+	.4byte	.LASF2958
 	.byte	0x1
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
-	.4byte	.LASF2957
+	.4byte	.LASF2959
 	.byte	0x1
 	.byte	0x38
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
-	.4byte	.LASF2958
+	.4byte	.LASF2960
 	.byte	0x1
 	.byte	0x39
 	.4byte	0xc6
 	.byte	0x1c
 	.uleb128 0xe
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
 	.byte	0x3a
 	.4byte	0x61
 	.byte	0x20
 	.uleb128 0xe
-	.4byte	.LASF2960
+	.4byte	.LASF2962
 	.byte	0x1
 	.byte	0x3b
 	.4byte	0x61
 	.byte	0x21
 	.uleb128 0xe
-	.4byte	.LASF2961
+	.4byte	.LASF2963
 	.byte	0x1
 	.byte	0x3c
 	.4byte	0xc6
 	.byte	0x24
 	.uleb128 0xe
-	.4byte	.LASF2962
+	.4byte	.LASF2964
 	.byte	0x1
 	.byte	0x3d
 	.4byte	0xc6
 	.byte	0x28
 	.uleb128 0xe
-	.4byte	.LASF2963
+	.4byte	.LASF2965
 	.byte	0x1
 	.byte	0x3e
 	.4byte	0xc6
 	.byte	0x2c
 	.uleb128 0xe
-	.4byte	.LASF2964
+	.4byte	.LASF2966
 	.byte	0x1
 	.byte	0x3f
 	.4byte	0xc6
 	.byte	0x30
 	.uleb128 0xe
-	.4byte	.LASF2891
+	.4byte	.LASF2893
 	.byte	0x1
 	.byte	0x40
 	.4byte	0xc6
@@ -36257,25 +36322,25 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0x38
 	.uleb128 0xe
-	.4byte	.LASF2965
+	.4byte	.LASF2967
 	.byte	0x1
 	.byte	0x42
 	.4byte	0x4653
 	.byte	0x40
 	.uleb128 0xe
-	.4byte	.LASF2966
+	.4byte	.LASF2968
 	.byte	0x1
 	.byte	0x43
 	.4byte	0xc6
 	.byte	0x48
 	.uleb128 0xe
-	.4byte	.LASF2967
+	.4byte	.LASF2969
 	.byte	0x1
 	.byte	0x44
 	.4byte	0xc6
 	.byte	0x4c
 	.uleb128 0xe
-	.4byte	.LASF2968
+	.4byte	.LASF2970
 	.byte	0x1
 	.byte	0x45
 	.4byte	0xc6
@@ -36287,151 +36352,151 @@ __exitcall_ebc_exit:
 	.4byte	0xa545
 	.byte	0x58
 	.uleb128 0xe
-	.4byte	.LASF2969
+	.4byte	.LASF2971
 	.byte	0x1
 	.byte	0x47
 	.4byte	0xd85b
 	.byte	0x60
 	.uleb128 0xe
-	.4byte	.LASF2970
+	.4byte	.LASF2972
 	.byte	0x1
 	.byte	0x48
 	.4byte	0x2eda
 	.byte	0x78
 	.uleb128 0xe
-	.4byte	.LASF2971
+	.4byte	.LASF2973
 	.byte	0x1
 	.byte	0x4a
 	.4byte	0x4653
 	.byte	0x80
 	.uleb128 0xe
-	.4byte	.LASF2972
+	.4byte	.LASF2974
 	.byte	0x1
 	.byte	0x4b
 	.4byte	0x4653
 	.byte	0x88
 	.uleb128 0xe
-	.4byte	.LASF2973
+	.4byte	.LASF2975
 	.byte	0x1
 	.byte	0x4c
 	.4byte	0x4653
 	.byte	0x90
 	.uleb128 0xe
-	.4byte	.LASF2974
+	.4byte	.LASF2976
 	.byte	0x1
 	.byte	0x4d
 	.4byte	0x4653
 	.byte	0x98
 	.uleb128 0xe
-	.4byte	.LASF2975
+	.4byte	.LASF2977
 	.byte	0x1
 	.byte	0x4e
 	.4byte	0xc097
 	.byte	0xa0
 	.uleb128 0xe
-	.4byte	.LASF2976
+	.4byte	.LASF2978
 	.byte	0x1
 	.byte	0x4f
 	.4byte	0xc097
 	.byte	0xa8
 	.uleb128 0xe
-	.4byte	.LASF2977
+	.4byte	.LASF2979
 	.byte	0x1
 	.byte	0x50
-	.4byte	0xe3ec
+	.4byte	0xe3f8
 	.byte	0xb0
 	.uleb128 0xe
-	.4byte	.LASF2978
+	.4byte	.LASF2980
 	.byte	0x1
 	.byte	0x51
 	.4byte	0xc6
 	.byte	0xc0
 	.uleb128 0xe
-	.4byte	.LASF2979
+	.4byte	.LASF2981
 	.byte	0x1
 	.byte	0x52
 	.4byte	0xc6
 	.byte	0xc4
 	.uleb128 0xe
-	.4byte	.LASF2980
+	.4byte	.LASF2982
 	.byte	0x1
 	.byte	0x53
 	.4byte	0x219
 	.byte	0xc8
 	.uleb128 0xe
-	.4byte	.LASF2981
+	.4byte	.LASF2983
 	.byte	0x1
 	.byte	0x54
-	.4byte	0xe3fc
+	.4byte	0xe408
 	.byte	0xd0
 	.uleb128 0xe
-	.4byte	.LASF2982
+	.4byte	.LASF2984
 	.byte	0x1
 	.byte	0x55
-	.4byte	0xe3fc
+	.4byte	0xe408
 	.byte	0xd8
 	.uleb128 0xe
-	.4byte	.LASF2983
+	.4byte	.LASF2985
 	.byte	0x1
 	.byte	0x57
 	.4byte	0xd7d1
 	.byte	0xe0
 	.uleb128 0x27
-	.4byte	.LASF2984
+	.4byte	.LASF2986
 	.byte	0x1
 	.byte	0x58
 	.4byte	0xc6
 	.2byte	0x1b0
 	.uleb128 0x27
-	.4byte	.LASF2985
+	.4byte	.LASF2987
 	.byte	0x1
 	.byte	0x5a
 	.4byte	0xc6
 	.2byte	0x1b4
 	.uleb128 0x27
-	.4byte	.LASF2986
+	.4byte	.LASF2988
 	.byte	0x1
 	.byte	0x5c
 	.4byte	0x3147
 	.2byte	0x1b8
 	.uleb128 0x27
-	.4byte	.LASF2987
+	.4byte	.LASF2989
 	.byte	0x1
 	.byte	0x5f
 	.4byte	0x3147
 	.2byte	0x1f0
 	.uleb128 0x27
-	.4byte	.LASF2988
+	.4byte	.LASF2990
 	.byte	0x1
 	.byte	0x62
 	.4byte	0x31e0
 	.2byte	0x228
 	.uleb128 0x27
-	.4byte	.LASF2989
+	.4byte	.LASF2991
 	.byte	0x1
 	.byte	0x65
 	.4byte	0xc6
 	.2byte	0x258
 	.uleb128 0x27
-	.4byte	.LASF2990
+	.4byte	.LASF2992
 	.byte	0x1
 	.byte	0x67
 	.4byte	0xc6
 	.2byte	0x25c
 	.uleb128 0x27
-	.4byte	.LASF2991
+	.4byte	.LASF2993
 	.byte	0x1
 	.byte	0x69
 	.4byte	0xc6
 	.2byte	0x260
 	.uleb128 0x27
-	.4byte	.LASF2992
+	.4byte	.LASF2994
 	.byte	0x1
 	.byte	0x6b
 	.4byte	0xc6
 	.2byte	0x264
 	.uleb128 0x27
-	.4byte	.LASF2993
+	.4byte	.LASF2995
 	.byte	0x1
 	.byte	0x6c
 	.4byte	0xc6
@@ -36439,7 +36504,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x443
-	.4byte	0xe3fc
+	.4byte	0xe408
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
@@ -36452,7 +36517,7 @@ __exitcall_ebc_exit:
 	.2byte	0x328
 	.byte	0x1
 	.byte	0x6f
-	.4byte	0xe44c
+	.4byte	0xe458
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x1
@@ -36460,43 +36525,43 @@ __exitcall_ebc_exit:
 	.4byte	0xa545
 	.byte	0
 	.uleb128 0xe
-	.4byte	.LASF2927
+	.4byte	.LASF2929
 	.byte	0x1
 	.byte	0x71
-	.4byte	0xe0d7
+	.4byte	0xe0e3
 	.byte	0x8
 	.uleb128 0xe
-	.4byte	.LASF2928
+	.4byte	.LASF2930
 	.byte	0x1
 	.byte	0x72
-	.4byte	0xdad7
+	.4byte	0xdae3
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2994
+	.4byte	.LASF2996
 	.byte	0x1
 	.byte	0x73
-	.4byte	0xded2
+	.4byte	0xdede
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF1771
 	.byte	0x1
 	.byte	0x74
-	.4byte	0xe1c4
+	.4byte	0xe1d0
 	.byte	0xb8
 	.byte	0
 	.uleb128 0x4b
-	.4byte	.LASF2995
+	.4byte	.LASF2997
 	.byte	0x1
 	.byte	0x77
-	.4byte	0xe461
+	.4byte	0xe46d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	global_ebc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe402
+	.4byte	0xe40e
 	.uleb128 0x4b
-	.4byte	.LASF2996
+	.4byte	.LASF2998
 	.byte	0x1
 	.byte	0x78
 	.4byte	0x2eda
@@ -36504,7 +36569,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_auto_task
 	.uleb128 0x4b
-	.4byte	.LASF2997
+	.4byte	.LASF2999
 	.byte	0x1
 	.byte	0x7b
 	.4byte	0x156f
@@ -36512,7 +36577,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_wq
 	.uleb128 0x4b
-	.4byte	.LASF2998
+	.4byte	.LASF3000
 	.byte	0x1
 	.byte	0x7c
 	.4byte	0x156f
@@ -36520,7 +36585,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_thread_wq
 	.uleb128 0x4b
-	.4byte	.LASF2999
+	.4byte	.LASF3001
 	.byte	0x1
 	.byte	0x7d
 	.4byte	0x156f
@@ -36528,7 +36593,7 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_poweroff_wq
 	.uleb128 0x4b
-	.4byte	.LASF3000
+	.4byte	.LASF3002
 	.byte	0x1
 	.byte	0x7e
 	.4byte	0x5b46
@@ -36536,2738 +36601,2738 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	ebc_auto_thread_sem
 	.uleb128 0x4c
-	.4byte	.LASF3001
+	.4byte	.LASF3003
 	.byte	0x1
-	.2byte	0x591
+	.2byte	0x596
 	.4byte	0x7b4
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_ops
 	.uleb128 0x4c
-	.4byte	.LASF3002
+	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x59b
+	.2byte	0x5a0
 	.4byte	0xc5df
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_misc
 	.uleb128 0x4c
-	.4byte	.LASF3003
+	.4byte	.LASF3005
 	.byte	0x1
-	.2byte	0x5aa
+	.2byte	0x5af
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_waveform_version
 	.uleb128 0x4c
-	.4byte	.LASF3004
+	.4byte	.LASF3006
 	.byte	0x1
-	.2byte	0x5b5
+	.2byte	0x5ba
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_name
 	.uleb128 0x4c
-	.4byte	.LASF3005
+	.4byte	.LASF3007
 	.byte	0x1
-	.2byte	0x5c3
+	.2byte	0x5c8
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_temp
 	.uleb128 0x4c
-	.4byte	.LASF3006
+	.4byte	.LASF3008
 	.byte	0x1
-	.2byte	0x5e6
+	.2byte	0x5eb
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_vcom
 	.uleb128 0x4c
-	.4byte	.LASF3007
+	.4byte	.LASF3009
 	.byte	0x1
-	.2byte	0x5f0
+	.2byte	0x5f5
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_version
 	.uleb128 0x4c
-	.4byte	.LASF3008
+	.4byte	.LASF3010
 	.byte	0x1
-	.2byte	0x5f9
+	.2byte	0x5fe
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_state
 	.uleb128 0x4c
-	.4byte	.LASF3009
+	.4byte	.LASF3011
 	.byte	0x1
-	.2byte	0x792
+	.2byte	0x797
 	.4byte	0xa531
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_pm
 	.uleb128 0x5
 	.4byte	0xb170
-	.4byte	0xe5a6
+	.4byte	0xe5b2
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe596
+	.4byte	0xe5a2
 	.uleb128 0x4c
-	.4byte	.LASF3010
+	.4byte	.LASF3012
 	.byte	0x1
-	.2byte	0x797
-	.4byte	0xe5a6
+	.2byte	0x79c
+	.4byte	0xe5b2
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_match
 	.uleb128 0x4c
-	.4byte	.LASF3011
+	.4byte	.LASF3013
 	.byte	0x1
-	.2byte	0x79d
+	.2byte	0x7a2
 	.4byte	0xd66d
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_driver
 	.uleb128 0x4c
-	.4byte	.LASF3012
+	.4byte	.LASF3014
 	.byte	0x1
-	.2byte	0x7b1
+	.2byte	0x7b6
 	.4byte	0x443
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init1969
+	.8byte	__addressable_ebc_init1974
 	.uleb128 0x4c
-	.4byte	.LASF3013
+	.4byte	.LASF3015
 	.byte	0x1
-	.2byte	0x7b2
+	.2byte	0x7b7
 	.4byte	0x497
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	__exitcall_ebc_exit
 	.uleb128 0x4d
-	.4byte	.LASF3062
+	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x7ac
+	.2byte	0x7b1
 	.8byte	.LFB2845
 	.8byte	.LFE2845-.LFB2845
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe62f
+	.4byte	0xe63b
 	.uleb128 0x4e
 	.8byte	.LVL32
-	.4byte	0x13b98
+	.4byte	0x13bc2
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3014
+	.4byte	.LASF3016
 	.byte	0x1
-	.2byte	0x7a7
+	.2byte	0x7ac
 	.4byte	0xc6
 	.8byte	.LFB2844
 	.8byte	.LFE2844-.LFB2844
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe65f
+	.4byte	0xe66b
 	.uleb128 0x4e
 	.8byte	.LVL316
-	.4byte	0x13ba4
+	.4byte	0x13bce
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3015
+	.4byte	.LASF3017
 	.byte	0x1
-	.2byte	0x786
+	.2byte	0x78b
 	.4byte	0xc6
 	.8byte	.LFB2843
 	.8byte	.LFE2843-.LFB2843
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe6fb
+	.4byte	0xe707
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x786
+	.2byte	0x78b
 	.4byte	0xa545
 	.4byte	.LLST11
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x788
-	.4byte	0xe461
+	.2byte	0x78d
+	.4byte	0xe46d
 	.uleb128 0x46
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x789
-	.4byte	0xe6fb
+	.2byte	0x78e
+	.4byte	0xe707
 	.uleb128 0x53
-	.4byte	0x13235
+	.4byte	0x1325f
 	.8byte	.LBB926
 	.8byte	.LBE926-.LBB926
 	.byte	0x1
-	.2byte	0x788
-	.4byte	0xe6cb
+	.2byte	0x78d
+	.4byte	0xe6d7
 	.uleb128 0x54
-	.4byte	0x13246
+	.4byte	0x13270
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e26
+	.4byte	0x12e50
 	.8byte	.LBB928
 	.8byte	.LBE928-.LBB928
 	.byte	0x1
-	.2byte	0x78b
-	.4byte	0xe6ed
+	.2byte	0x790
+	.4byte	0xe6f9
 	.uleb128 0x54
-	.4byte	0x12e32
+	.4byte	0x12e5c
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL36
-	.4byte	0x13bb0
+	.4byte	0x13bda
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe1c4
+	.4byte	0xe1d0
 	.uleb128 0x50
-	.4byte	.LASF3017
+	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x775
+	.2byte	0x77a
 	.4byte	0xc6
 	.8byte	.LFB2842
 	.8byte	.LFE2842-.LFB2842
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe7ca
+	.4byte	0xe7d6
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x775
+	.2byte	0x77a
 	.4byte	0xa545
 	.4byte	.LLST146
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x777
-	.4byte	0xe461
+	.2byte	0x77c
+	.4byte	0xe46d
 	.uleb128 0x46
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x778
-	.4byte	0xe6fb
+	.2byte	0x77d
+	.4byte	0xe707
 	.uleb128 0x55
-	.4byte	.LASF3018
-	.4byte	0xe7da
+	.4byte	.LASF3020
+	.4byte	0xe7e6
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35104
+	.8byte	__func__.35113
 	.uleb128 0x53
-	.4byte	0x13235
+	.4byte	0x1325f
 	.8byte	.LBB1679
 	.8byte	.LBE1679-.LBB1679
 	.byte	0x1
-	.2byte	0x777
-	.4byte	0xe780
+	.2byte	0x77c
+	.4byte	0xe78c
 	.uleb128 0x54
-	.4byte	0x13246
+	.4byte	0x13270
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e3e
+	.4byte	0x12e68
 	.8byte	.LBB1681
 	.8byte	.LBE1681-.LBB1681
 	.byte	0x1
-	.2byte	0x780
-	.4byte	0xe7a2
+	.2byte	0x785
+	.4byte	0xe7ae
 	.uleb128 0x54
-	.4byte	0x12e4a
+	.4byte	0x12e74
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL630
-	.4byte	0x13bb0
+	.4byte	0x13bda
 	.uleb128 0x4e
 	.8byte	.LVL631
-	.4byte	0x13bb0
+	.4byte	0x13bda
 	.uleb128 0x4e
 	.8byte	.LVL632
-	.4byte	0x13ad5
+	.4byte	0x13aff
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xe7da
+	.4byte	0xe7e6
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xb
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe7ca
+	.4byte	0xe7d6
 	.uleb128 0x4f
-	.4byte	.LASF3019
+	.4byte	.LASF3021
 	.byte	0x1
-	.2byte	0x76e
+	.2byte	0x773
 	.4byte	0xc6
 	.8byte	.LFB2841
 	.8byte	.LFE2841-.LFB2841
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe81f
+	.4byte	0xe82b
 	.uleb128 0x56
-	.4byte	.LASF3020
+	.4byte	.LASF3022
 	.byte	0x1
-	.2byte	0x76e
+	.2byte	0x773
 	.4byte	0xd6e9
 	.4byte	.LLST13
 	.uleb128 0x4e
 	.8byte	.LVL42
-	.4byte	0x13bbd
+	.4byte	0x13be7
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3021
+	.4byte	.LASF3023
 	.byte	0x1
-	.2byte	0x702
+	.2byte	0x707
 	.4byte	0xc6
 	.8byte	.LFB2840
 	.8byte	.LFE2840-.LFB2840
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfc45
+	.4byte	0xfc51
 	.uleb128 0x56
-	.4byte	.LASF3020
+	.4byte	.LASF3022
 	.byte	0x1
-	.2byte	0x702
+	.2byte	0x707
 	.4byte	0xd6e9
 	.4byte	.LLST122
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x704
+	.2byte	0x709
 	.4byte	0xa545
 	.uleb128 0x46
-	.4byte	.LASF3022
+	.4byte	.LASF3024
 	.byte	0x1
-	.2byte	0x705
+	.2byte	0x70a
 	.4byte	0xb869
 	.uleb128 0x57
-	.4byte	.LASF3023
+	.4byte	.LASF3025
 	.byte	0x1
-	.2byte	0x706
+	.2byte	0x70b
 	.4byte	0xd6e9
 	.4byte	.LLST123
 	.uleb128 0x46
-	.4byte	.LASF3024
+	.4byte	.LASF3026
 	.byte	0x1
-	.2byte	0x707
+	.2byte	0x70c
 	.4byte	0xb869
 	.uleb128 0x57
-	.4byte	.LASF3025
+	.4byte	.LASF3027
 	.byte	0x1
-	.2byte	0x708
+	.2byte	0x70d
 	.4byte	0xc012
 	.4byte	.LLST124
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x709
-	.4byte	0xe461
+	.2byte	0x70e
+	.4byte	0xe46d
 	.uleb128 0x57
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x70a
-	.4byte	0xe6fb
+	.2byte	0x70f
+	.4byte	0xe707
 	.4byte	.LLST125
 	.uleb128 0x46
-	.4byte	.LASF2994
+	.4byte	.LASF2996
 	.byte	0x1
-	.2byte	0x70b
-	.4byte	0xe117
+	.2byte	0x710
+	.4byte	0xe123
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x70c
+	.2byte	0x711
 	.4byte	0xc6
 	.uleb128 0x58
-	.4byte	0x13253
+	.4byte	0x1327d
 	.8byte	.LBB1460
 	.4byte	.Ldebug_ranges0+0xa10
 	.byte	0x1
-	.2byte	0x70e
-	.4byte	0xe8fe
+	.2byte	0x713
+	.4byte	0xe90a
 	.uleb128 0x54
-	.4byte	0x1327c
+	.4byte	0x132a6
 	.uleb128 0x54
-	.4byte	0x13270
+	.4byte	0x1329a
 	.uleb128 0x54
-	.4byte	0x13264
+	.4byte	0x1328e
 	.uleb128 0x4e
 	.8byte	.LVL443
-	.4byte	0x13bc9
+	.4byte	0x13bf3
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13130
+	.4byte	0x1315a
 	.8byte	.LBB1464
 	.8byte	.LBE1464-.LBB1464
 	.byte	0x1
-	.2byte	0x720
-	.4byte	0xe93d
+	.2byte	0x725
+	.4byte	0xe949
 	.uleb128 0x54
-	.4byte	0x13140
+	.4byte	0x1316a
 	.uleb128 0x59
-	.4byte	0x13235
+	.4byte	0x1325f
 	.8byte	.LBB1465
 	.8byte	.LBE1465-.LBB1465
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x54
-	.4byte	0x13246
+	.4byte	0x13270
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13152
+	.4byte	0x1317c
 	.8byte	.LBB1467
 	.8byte	.LBE1467-.LBB1467
 	.byte	0x1
-	.2byte	0x731
-	.4byte	0xe97d
+	.2byte	0x736
+	.4byte	0xe989
 	.uleb128 0x54
-	.4byte	0x13163
+	.4byte	0x1318d
 	.uleb128 0x5a
-	.4byte	0x13235
+	.4byte	0x1325f
 	.8byte	.LBB1468
 	.8byte	.LBE1468-.LBB1468
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x54
-	.4byte	0x13246
+	.4byte	0x13270
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x11576
+	.4byte	0x11582
 	.8byte	.LBB1470
 	.4byte	.Ldebug_ranges0+0xa40
 	.byte	0x1
-	.2byte	0x73f
-	.4byte	0xf336
+	.2byte	0x744
+	.4byte	0xf342
 	.uleb128 0x54
-	.4byte	0x11587
+	.4byte	0x11593
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0xa40
 	.uleb128 0x5c
-	.4byte	0x11593
+	.4byte	0x1159f
 	.uleb128 0x58
-	.4byte	0x13176
+	.4byte	0x131a0
 	.8byte	.LBB1472
 	.4byte	.Ldebug_ranges0+0xaa0
 	.byte	0x1
-	.2byte	0x473
-	.4byte	0xea0d
+	.2byte	0x478
+	.4byte	0xea19
 	.uleb128 0x54
-	.4byte	0x1319e
+	.4byte	0x131c8
 	.uleb128 0x54
-	.4byte	0x13192
+	.4byte	0x131bc
 	.uleb128 0x54
-	.4byte	0x13187
+	.4byte	0x131b1
 	.uleb128 0x5d
-	.4byte	0x131ab
+	.4byte	0x131d5
 	.8byte	.LBB1473
 	.4byte	.Ldebug_ranges0+0xaa0
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x131df
+	.4byte	0x13209
 	.uleb128 0x54
-	.4byte	0x131d3
+	.4byte	0x131fd
 	.uleb128 0x54
-	.4byte	0x131c7
+	.4byte	0x131f1
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x131e6
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0xaa0
 	.uleb128 0x5c
-	.4byte	0x131ea
+	.4byte	0x13214
 	.uleb128 0x4e
 	.8byte	.LVL451
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13176
+	.4byte	0x131a0
 	.8byte	.LBB1484
 	.8byte	.LBE1484-.LBB1484
 	.byte	0x1
-	.2byte	0x476
-	.4byte	0xea8a
+	.2byte	0x47b
+	.4byte	0xea96
 	.uleb128 0x54
-	.4byte	0x1319e
+	.4byte	0x131c8
 	.uleb128 0x54
-	.4byte	0x13192
+	.4byte	0x131bc
 	.uleb128 0x54
-	.4byte	0x13187
+	.4byte	0x131b1
 	.uleb128 0x5a
-	.4byte	0x131ab
+	.4byte	0x131d5
 	.8byte	.LBB1485
 	.8byte	.LBE1485-.LBB1485
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x131df
+	.4byte	0x13209
 	.uleb128 0x54
-	.4byte	0x131d3
+	.4byte	0x131fd
 	.uleb128 0x54
-	.4byte	0x131c7
+	.4byte	0x131f1
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x131e6
 	.uleb128 0x5e
 	.8byte	.LBB1486
 	.8byte	.LBE1486-.LBB1486
 	.uleb128 0x5c
-	.4byte	0x131ea
+	.4byte	0x13214
 	.uleb128 0x4e
 	.8byte	.LVL452
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13176
+	.4byte	0x131a0
 	.8byte	.LBB1487
 	.8byte	.LBE1487-.LBB1487
 	.byte	0x1
-	.2byte	0x479
-	.4byte	0xeb07
+	.2byte	0x47e
+	.4byte	0xeb13
 	.uleb128 0x54
-	.4byte	0x1319e
+	.4byte	0x131c8
 	.uleb128 0x54
-	.4byte	0x13192
+	.4byte	0x131bc
 	.uleb128 0x54
-	.4byte	0x13187
+	.4byte	0x131b1
 	.uleb128 0x5a
-	.4byte	0x131ab
+	.4byte	0x131d5
 	.8byte	.LBB1488
 	.8byte	.LBE1488-.LBB1488
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x131df
+	.4byte	0x13209
 	.uleb128 0x54
-	.4byte	0x131d3
+	.4byte	0x131fd
 	.uleb128 0x54
-	.4byte	0x131c7
+	.4byte	0x131f1
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x131e6
 	.uleb128 0x5e
 	.8byte	.LBB1489
 	.8byte	.LBE1489-.LBB1489
 	.uleb128 0x5c
-	.4byte	0x131ea
+	.4byte	0x13214
 	.uleb128 0x4e
 	.8byte	.LVL453
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13176
+	.4byte	0x131a0
 	.8byte	.LBB1490
 	.8byte	.LBE1490-.LBB1490
 	.byte	0x1
-	.2byte	0x47c
-	.4byte	0xeb84
+	.2byte	0x481
+	.4byte	0xeb90
 	.uleb128 0x54
-	.4byte	0x1319e
+	.4byte	0x131c8
 	.uleb128 0x54
-	.4byte	0x13192
+	.4byte	0x131bc
 	.uleb128 0x54
-	.4byte	0x13187
+	.4byte	0x131b1
 	.uleb128 0x5a
-	.4byte	0x131ab
+	.4byte	0x131d5
 	.8byte	.LBB1491
 	.8byte	.LBE1491-.LBB1491
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x131df
+	.4byte	0x13209
 	.uleb128 0x54
-	.4byte	0x131d3
+	.4byte	0x131fd
 	.uleb128 0x54
-	.4byte	0x131c7
+	.4byte	0x131f1
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x131e6
 	.uleb128 0x5e
 	.8byte	.LBB1492
 	.8byte	.LBE1492-.LBB1492
 	.uleb128 0x5c
-	.4byte	0x131ea
+	.4byte	0x13214
 	.uleb128 0x4e
 	.8byte	.LVL454
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13176
+	.4byte	0x131a0
 	.8byte	.LBB1493
 	.8byte	.LBE1493-.LBB1493
 	.byte	0x1
-	.2byte	0x47f
-	.4byte	0xec01
+	.2byte	0x484
+	.4byte	0xec0d
 	.uleb128 0x54
-	.4byte	0x1319e
+	.4byte	0x131c8
 	.uleb128 0x54
-	.4byte	0x13192
+	.4byte	0x131bc
 	.uleb128 0x54
-	.4byte	0x13187
+	.4byte	0x131b1
 	.uleb128 0x5a
-	.4byte	0x131ab
+	.4byte	0x131d5
 	.8byte	.LBB1494
 	.8byte	.LBE1494-.LBB1494
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x131df
+	.4byte	0x13209
 	.uleb128 0x54
-	.4byte	0x131d3
+	.4byte	0x131fd
 	.uleb128 0x54
-	.4byte	0x131c7
+	.4byte	0x131f1
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x131e6
 	.uleb128 0x5e
 	.8byte	.LBB1495
 	.8byte	.LBE1495-.LBB1495
 	.uleb128 0x5c
-	.4byte	0x131ea
+	.4byte	0x13214
 	.uleb128 0x4e
 	.8byte	.LVL455
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13176
+	.4byte	0x131a0
 	.8byte	.LBB1496
 	.8byte	.LBE1496-.LBB1496
 	.byte	0x1
-	.2byte	0x482
-	.4byte	0xec7e
+	.2byte	0x487
+	.4byte	0xec8a
 	.uleb128 0x54
-	.4byte	0x1319e
+	.4byte	0x131c8
 	.uleb128 0x54
-	.4byte	0x13192
+	.4byte	0x131bc
 	.uleb128 0x54
-	.4byte	0x13187
+	.4byte	0x131b1
 	.uleb128 0x5a
-	.4byte	0x131ab
+	.4byte	0x131d5
 	.8byte	.LBB1497
 	.8byte	.LBE1497-.LBB1497
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x131df
+	.4byte	0x13209
 	.uleb128 0x54
-	.4byte	0x131d3
+	.4byte	0x131fd
 	.uleb128 0x54
-	.4byte	0x131c7
+	.4byte	0x131f1
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x131e6
 	.uleb128 0x5e
 	.8byte	.LBB1498
 	.8byte	.LBE1498-.LBB1498
 	.uleb128 0x5c
-	.4byte	0x131ea
+	.4byte	0x13214
 	.uleb128 0x4e
 	.8byte	.LVL456
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13176
+	.4byte	0x131a0
 	.8byte	.LBB1499
 	.8byte	.LBE1499-.LBB1499
 	.byte	0x1
-	.2byte	0x485
-	.4byte	0xecfb
+	.2byte	0x48a
+	.4byte	0xed07
 	.uleb128 0x54
-	.4byte	0x1319e
+	.4byte	0x131c8
 	.uleb128 0x54
-	.4byte	0x13192
+	.4byte	0x131bc
 	.uleb128 0x54
-	.4byte	0x13187
+	.4byte	0x131b1
 	.uleb128 0x5a
-	.4byte	0x131ab
+	.4byte	0x131d5
 	.8byte	.LBB1500
 	.8byte	.LBE1500-.LBB1500
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x131df
+	.4byte	0x13209
 	.uleb128 0x54
-	.4byte	0x131d3
+	.4byte	0x131fd
 	.uleb128 0x54
-	.4byte	0x131c7
+	.4byte	0x131f1
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x131e6
 	.uleb128 0x5e
 	.8byte	.LBB1501
 	.8byte	.LBE1501-.LBB1501
 	.uleb128 0x5c
-	.4byte	0x131ea
+	.4byte	0x13214
 	.uleb128 0x4e
 	.8byte	.LVL457
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13176
+	.4byte	0x131a0
 	.8byte	.LBB1502
 	.8byte	.LBE1502-.LBB1502
 	.byte	0x1
-	.2byte	0x488
-	.4byte	0xed78
+	.2byte	0x48d
+	.4byte	0xed84
 	.uleb128 0x54
-	.4byte	0x1319e
+	.4byte	0x131c8
 	.uleb128 0x54
-	.4byte	0x13192
+	.4byte	0x131bc
 	.uleb128 0x54
-	.4byte	0x13187
+	.4byte	0x131b1
 	.uleb128 0x5a
-	.4byte	0x131ab
+	.4byte	0x131d5
 	.8byte	.LBB1503
 	.8byte	.LBE1503-.LBB1503
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x131df
+	.4byte	0x13209
 	.uleb128 0x54
-	.4byte	0x131d3
+	.4byte	0x131fd
 	.uleb128 0x54
-	.4byte	0x131c7
+	.4byte	0x131f1
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x131e6
 	.uleb128 0x5e
 	.8byte	.LBB1504
 	.8byte	.LBE1504-.LBB1504
 	.uleb128 0x5c
-	.4byte	0x131ea
+	.4byte	0x13214
 	.uleb128 0x4e
 	.8byte	.LVL458
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13176
+	.4byte	0x131a0
 	.8byte	.LBB1505
 	.8byte	.LBE1505-.LBB1505
 	.byte	0x1
-	.2byte	0x48b
-	.4byte	0xedf5
+	.2byte	0x490
+	.4byte	0xee01
 	.uleb128 0x54
-	.4byte	0x1319e
+	.4byte	0x131c8
 	.uleb128 0x54
-	.4byte	0x13192
+	.4byte	0x131bc
 	.uleb128 0x54
-	.4byte	0x13187
+	.4byte	0x131b1
 	.uleb128 0x5a
-	.4byte	0x131ab
+	.4byte	0x131d5
 	.8byte	.LBB1506
 	.8byte	.LBE1506-.LBB1506
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x131df
+	.4byte	0x13209
 	.uleb128 0x54
-	.4byte	0x131d3
+	.4byte	0x131fd
 	.uleb128 0x54
-	.4byte	0x131c7
+	.4byte	0x131f1
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x131e6
 	.uleb128 0x5e
 	.8byte	.LBB1507
 	.8byte	.LBE1507-.LBB1507
 	.uleb128 0x5c
-	.4byte	0x131ea
+	.4byte	0x13214
 	.uleb128 0x4e
 	.8byte	.LVL459
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13176
+	.4byte	0x131a0
 	.8byte	.LBB1508
 	.8byte	.LBE1508-.LBB1508
 	.byte	0x1
-	.2byte	0x48e
-	.4byte	0xee72
+	.2byte	0x493
+	.4byte	0xee7e
 	.uleb128 0x54
-	.4byte	0x1319e
+	.4byte	0x131c8
 	.uleb128 0x54
-	.4byte	0x13192
+	.4byte	0x131bc
 	.uleb128 0x54
-	.4byte	0x13187
+	.4byte	0x131b1
 	.uleb128 0x5a
-	.4byte	0x131ab
+	.4byte	0x131d5
 	.8byte	.LBB1509
 	.8byte	.LBE1509-.LBB1509
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x131df
+	.4byte	0x13209
 	.uleb128 0x54
-	.4byte	0x131d3
+	.4byte	0x131fd
 	.uleb128 0x54
-	.4byte	0x131c7
+	.4byte	0x131f1
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x131e6
 	.uleb128 0x5e
 	.8byte	.LBB1510
 	.8byte	.LBE1510-.LBB1510
 	.uleb128 0x5c
-	.4byte	0x131ea
+	.4byte	0x13214
 	.uleb128 0x4e
 	.8byte	.LVL460
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13176
+	.4byte	0x131a0
 	.8byte	.LBB1511
 	.8byte	.LBE1511-.LBB1511
 	.byte	0x1
-	.2byte	0x491
-	.4byte	0xeeef
+	.2byte	0x496
+	.4byte	0xeefb
 	.uleb128 0x54
-	.4byte	0x1319e
+	.4byte	0x131c8
 	.uleb128 0x54
-	.4byte	0x13192
+	.4byte	0x131bc
 	.uleb128 0x54
-	.4byte	0x13187
+	.4byte	0x131b1
 	.uleb128 0x5a
-	.4byte	0x131ab
+	.4byte	0x131d5
 	.8byte	.LBB1512
 	.8byte	.LBE1512-.LBB1512
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x131df
+	.4byte	0x13209
 	.uleb128 0x54
-	.4byte	0x131d3
+	.4byte	0x131fd
 	.uleb128 0x54
-	.4byte	0x131c7
+	.4byte	0x131f1
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x131e6
 	.uleb128 0x5e
 	.8byte	.LBB1513
 	.8byte	.LBE1513-.LBB1513
 	.uleb128 0x5c
-	.4byte	0x131ea
+	.4byte	0x13214
 	.uleb128 0x4e
 	.8byte	.LVL461
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13176
+	.4byte	0x131a0
 	.8byte	.LBB1514
 	.8byte	.LBE1514-.LBB1514
 	.byte	0x1
-	.2byte	0x494
-	.4byte	0xef6c
+	.2byte	0x499
+	.4byte	0xef78
 	.uleb128 0x54
-	.4byte	0x1319e
+	.4byte	0x131c8
 	.uleb128 0x54
-	.4byte	0x13192
+	.4byte	0x131bc
 	.uleb128 0x54
-	.4byte	0x13187
+	.4byte	0x131b1
 	.uleb128 0x5a
-	.4byte	0x131ab
+	.4byte	0x131d5
 	.8byte	.LBB1515
 	.8byte	.LBE1515-.LBB1515
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x131df
+	.4byte	0x13209
 	.uleb128 0x54
-	.4byte	0x131d3
+	.4byte	0x131fd
 	.uleb128 0x54
-	.4byte	0x131c7
+	.4byte	0x131f1
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x131e6
 	.uleb128 0x5e
 	.8byte	.LBB1516
 	.8byte	.LBE1516-.LBB1516
 	.uleb128 0x5c
-	.4byte	0x131ea
+	.4byte	0x13214
 	.uleb128 0x4e
 	.8byte	.LVL462
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13176
+	.4byte	0x131a0
 	.8byte	.LBB1517
 	.8byte	.LBE1517-.LBB1517
 	.byte	0x1
-	.2byte	0x497
-	.4byte	0xefe9
+	.2byte	0x49c
+	.4byte	0xeff5
 	.uleb128 0x54
-	.4byte	0x1319e
+	.4byte	0x131c8
 	.uleb128 0x54
-	.4byte	0x13192
+	.4byte	0x131bc
 	.uleb128 0x54
-	.4byte	0x13187
+	.4byte	0x131b1
 	.uleb128 0x5a
-	.4byte	0x131ab
+	.4byte	0x131d5
 	.8byte	.LBB1518
 	.8byte	.LBE1518-.LBB1518
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x131df
+	.4byte	0x13209
 	.uleb128 0x54
-	.4byte	0x131d3
+	.4byte	0x131fd
 	.uleb128 0x54
-	.4byte	0x131c7
+	.4byte	0x131f1
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x131e6
 	.uleb128 0x5e
 	.8byte	.LBB1519
 	.8byte	.LBE1519-.LBB1519
 	.uleb128 0x5c
-	.4byte	0x131ea
+	.4byte	0x13214
 	.uleb128 0x4e
 	.8byte	.LVL463
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13176
+	.4byte	0x131a0
 	.8byte	.LBB1520
 	.8byte	.LBE1520-.LBB1520
 	.byte	0x1
-	.2byte	0x49a
-	.4byte	0xf066
+	.2byte	0x49f
+	.4byte	0xf072
 	.uleb128 0x54
-	.4byte	0x1319e
+	.4byte	0x131c8
 	.uleb128 0x54
-	.4byte	0x13192
+	.4byte	0x131bc
 	.uleb128 0x54
-	.4byte	0x13187
+	.4byte	0x131b1
 	.uleb128 0x5a
-	.4byte	0x131ab
+	.4byte	0x131d5
 	.8byte	.LBB1521
 	.8byte	.LBE1521-.LBB1521
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x131df
+	.4byte	0x13209
 	.uleb128 0x54
-	.4byte	0x131d3
+	.4byte	0x131fd
 	.uleb128 0x54
-	.4byte	0x131c7
+	.4byte	0x131f1
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x131e6
 	.uleb128 0x5e
 	.8byte	.LBB1522
 	.8byte	.LBE1522-.LBB1522
 	.uleb128 0x5c
-	.4byte	0x131ea
+	.4byte	0x13214
 	.uleb128 0x4e
 	.8byte	.LVL464
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13176
+	.4byte	0x131a0
 	.8byte	.LBB1523
 	.8byte	.LBE1523-.LBB1523
 	.byte	0x1
-	.2byte	0x49d
-	.4byte	0xf0e3
+	.2byte	0x4a2
+	.4byte	0xf0ef
 	.uleb128 0x54
-	.4byte	0x1319e
+	.4byte	0x131c8
 	.uleb128 0x54
-	.4byte	0x13192
+	.4byte	0x131bc
 	.uleb128 0x54
-	.4byte	0x13187
+	.4byte	0x131b1
 	.uleb128 0x5a
-	.4byte	0x131ab
+	.4byte	0x131d5
 	.8byte	.LBB1524
 	.8byte	.LBE1524-.LBB1524
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x131df
+	.4byte	0x13209
 	.uleb128 0x54
-	.4byte	0x131d3
+	.4byte	0x131fd
 	.uleb128 0x54
-	.4byte	0x131c7
+	.4byte	0x131f1
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x131e6
 	.uleb128 0x5e
 	.8byte	.LBB1525
 	.8byte	.LBE1525-.LBB1525
 	.uleb128 0x5c
-	.4byte	0x131ea
+	.4byte	0x13214
 	.uleb128 0x4e
 	.8byte	.LVL465
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13176
+	.4byte	0x131a0
 	.8byte	.LBB1526
 	.8byte	.LBE1526-.LBB1526
 	.byte	0x1
-	.2byte	0x4a0
-	.4byte	0xf160
+	.2byte	0x4a5
+	.4byte	0xf16c
 	.uleb128 0x54
-	.4byte	0x1319e
+	.4byte	0x131c8
 	.uleb128 0x54
-	.4byte	0x13192
+	.4byte	0x131bc
 	.uleb128 0x54
-	.4byte	0x13187
+	.4byte	0x131b1
 	.uleb128 0x5a
-	.4byte	0x131ab
+	.4byte	0x131d5
 	.8byte	.LBB1527
 	.8byte	.LBE1527-.LBB1527
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x131df
+	.4byte	0x13209
 	.uleb128 0x54
-	.4byte	0x131d3
+	.4byte	0x131fd
 	.uleb128 0x54
-	.4byte	0x131c7
+	.4byte	0x131f1
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x131e6
 	.uleb128 0x5e
 	.8byte	.LBB1528
 	.8byte	.LBE1528-.LBB1528
 	.uleb128 0x5c
-	.4byte	0x131ea
+	.4byte	0x13214
 	.uleb128 0x4e
 	.8byte	.LVL466
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x13176
+	.4byte	0x131a0
 	.8byte	.LBB1529
 	.4byte	.Ldebug_ranges0+0xaf0
 	.byte	0x1
-	.2byte	0x4a3
-	.4byte	0xf1d6
+	.2byte	0x4a8
+	.4byte	0xf1e2
 	.uleb128 0x54
-	.4byte	0x1319e
+	.4byte	0x131c8
 	.uleb128 0x54
-	.4byte	0x13192
+	.4byte	0x131bc
 	.uleb128 0x54
-	.4byte	0x13187
+	.4byte	0x131b1
 	.uleb128 0x5d
-	.4byte	0x131ab
+	.4byte	0x131d5
 	.8byte	.LBB1530
 	.4byte	.Ldebug_ranges0+0xaf0
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x131df
+	.4byte	0x13209
 	.uleb128 0x54
-	.4byte	0x131d3
+	.4byte	0x131fd
 	.uleb128 0x54
-	.4byte	0x131c7
+	.4byte	0x131f1
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x131e6
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0xaf0
 	.uleb128 0x5c
-	.4byte	0x131ea
+	.4byte	0x13214
 	.uleb128 0x4e
 	.8byte	.LVL467
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.uleb128 0x4e
 	.8byte	.LVL502
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x13176
+	.4byte	0x131a0
 	.8byte	.LBB1536
 	.4byte	.Ldebug_ranges0+0xb30
 	.byte	0x1
-	.2byte	0x4a6
-	.4byte	0xf24c
+	.2byte	0x4ab
+	.4byte	0xf258
 	.uleb128 0x54
-	.4byte	0x1319e
+	.4byte	0x131c8
 	.uleb128 0x54
-	.4byte	0x13192
+	.4byte	0x131bc
 	.uleb128 0x54
-	.4byte	0x13187
+	.4byte	0x131b1
 	.uleb128 0x5d
-	.4byte	0x131ab
+	.4byte	0x131d5
 	.8byte	.LBB1537
 	.4byte	.Ldebug_ranges0+0xb30
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x131df
+	.4byte	0x13209
 	.uleb128 0x54
-	.4byte	0x131d3
+	.4byte	0x131fd
 	.uleb128 0x54
-	.4byte	0x131c7
+	.4byte	0x131f1
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x131e6
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0xb30
 	.uleb128 0x5c
-	.4byte	0x131ea
+	.4byte	0x13214
 	.uleb128 0x4e
 	.8byte	.LVL468
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.uleb128 0x4e
 	.8byte	.LVL501
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x13176
+	.4byte	0x131a0
 	.8byte	.LBB1543
 	.4byte	.Ldebug_ranges0+0xb70
 	.byte	0x1
-	.2byte	0x4a9
-	.4byte	0xf2c2
+	.2byte	0x4ae
+	.4byte	0xf2ce
 	.uleb128 0x54
-	.4byte	0x1319e
+	.4byte	0x131c8
 	.uleb128 0x54
-	.4byte	0x13192
+	.4byte	0x131bc
 	.uleb128 0x54
-	.4byte	0x13187
+	.4byte	0x131b1
 	.uleb128 0x5d
-	.4byte	0x131ab
+	.4byte	0x131d5
 	.8byte	.LBB1544
 	.4byte	.Ldebug_ranges0+0xb70
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x131df
+	.4byte	0x13209
 	.uleb128 0x54
-	.4byte	0x131d3
+	.4byte	0x131fd
 	.uleb128 0x54
-	.4byte	0x131c7
+	.4byte	0x131f1
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x131e6
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0xb70
 	.uleb128 0x5c
-	.4byte	0x131ea
+	.4byte	0x13214
 	.uleb128 0x4e
 	.8byte	.LVL469
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.uleb128 0x4e
 	.8byte	.LVL500
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x13176
+	.4byte	0x131a0
 	.8byte	.LBB1550
 	.4byte	.Ldebug_ranges0+0xbb0
 	.byte	0x1
-	.2byte	0x4ac
+	.2byte	0x4b1
 	.uleb128 0x54
-	.4byte	0x1319e
+	.4byte	0x131c8
 	.uleb128 0x54
-	.4byte	0x13192
+	.4byte	0x131bc
 	.uleb128 0x54
-	.4byte	0x13187
+	.4byte	0x131b1
 	.uleb128 0x5d
-	.4byte	0x131ab
+	.4byte	0x131d5
 	.8byte	.LBB1551
 	.4byte	.Ldebug_ranges0+0xbb0
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x131df
+	.4byte	0x13209
 	.uleb128 0x54
-	.4byte	0x131d3
+	.4byte	0x131fd
 	.uleb128 0x54
-	.4byte	0x131c7
+	.4byte	0x131f1
 	.uleb128 0x54
-	.4byte	0x131bc
+	.4byte	0x131e6
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0xbb0
 	.uleb128 0x5c
-	.4byte	0x131ea
+	.4byte	0x13214
 	.uleb128 0x4e
 	.8byte	.LVL470
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.uleb128 0x4e
 	.8byte	.LVL499
-	.4byte	0x13bd6
+	.4byte	0x13c00
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0xfd39
+	.4byte	0xfd45
 	.8byte	.LBB1572
 	.4byte	.Ldebug_ranges0+0xbf0
 	.byte	0x1
-	.2byte	0x74a
-	.4byte	0xf518
+	.2byte	0x74f
+	.4byte	0xf524
 	.uleb128 0x54
-	.4byte	0xfd4a
+	.4byte	0xfd56
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0xbf0
 	.uleb128 0x5f
-	.4byte	0xfd56
-	.4byte	.LLST126
-	.uleb128 0x5c
 	.4byte	0xfd62
+	.4byte	.LLST126
 	.uleb128 0x5c
 	.4byte	0xfd6e
 	.uleb128 0x5c
 	.4byte	0xfd7a
-	.uleb128 0x60
+	.uleb128 0x5c
 	.4byte	0xfd86
+	.uleb128 0x60
+	.4byte	0xfd92
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5c
-	.4byte	0xfd90
-	.uleb128 0x5c
 	.4byte	0xfd9c
 	.uleb128 0x5c
 	.4byte	0xfda8
+	.uleb128 0x5c
+	.4byte	0xfdb4
 	.uleb128 0x58
-	.4byte	0x13289
+	.4byte	0x132b3
 	.8byte	.LBB1574
 	.4byte	.Ldebug_ranges0+0xc60
 	.byte	0x1
-	.2byte	0x649
-	.4byte	0xf3a6
+	.2byte	0x64e
+	.4byte	0xf3b2
 	.uleb128 0x54
-	.4byte	0x13299
+	.4byte	0x132c3
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x13253
+	.4byte	0x1327d
 	.8byte	.LBB1578
 	.4byte	.Ldebug_ranges0+0xc90
 	.byte	0x1
-	.2byte	0x664
-	.4byte	0xf3db
+	.2byte	0x669
+	.4byte	0xf3e7
 	.uleb128 0x54
-	.4byte	0x1327c
+	.4byte	0x132a6
 	.uleb128 0x54
-	.4byte	0x13270
+	.4byte	0x1329a
 	.uleb128 0x54
-	.4byte	0x13264
+	.4byte	0x1328e
 	.uleb128 0x4e
 	.8byte	.LVL476
-	.4byte	0x13bc9
+	.4byte	0x13bf3
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13253
+	.4byte	0x1327d
 	.8byte	.LBB1586
 	.8byte	.LBE1586-.LBB1586
 	.byte	0x1
-	.2byte	0x667
-	.4byte	0xf414
+	.2byte	0x66c
+	.4byte	0xf420
 	.uleb128 0x54
-	.4byte	0x1327c
+	.4byte	0x132a6
 	.uleb128 0x54
-	.4byte	0x13270
+	.4byte	0x1329a
 	.uleb128 0x54
-	.4byte	0x13264
+	.4byte	0x1328e
 	.uleb128 0x4e
 	.8byte	.LVL477
-	.4byte	0x13bc9
+	.4byte	0x13bf3
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13253
+	.4byte	0x1327d
 	.8byte	.LBB1588
 	.8byte	.LBE1588-.LBB1588
 	.byte	0x1
-	.2byte	0x66a
-	.4byte	0xf44d
+	.2byte	0x66f
+	.4byte	0xf459
 	.uleb128 0x54
-	.4byte	0x1327c
+	.4byte	0x132a6
 	.uleb128 0x54
-	.4byte	0x13270
+	.4byte	0x1329a
 	.uleb128 0x54
-	.4byte	0x13264
+	.4byte	0x1328e
 	.uleb128 0x4e
 	.8byte	.LVL478
-	.4byte	0x13bc9
+	.4byte	0x13bf3
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13253
+	.4byte	0x1327d
 	.8byte	.LBB1590
 	.8byte	.LBE1590-.LBB1590
 	.byte	0x1
-	.2byte	0x66d
-	.4byte	0xf486
+	.2byte	0x672
+	.4byte	0xf492
 	.uleb128 0x54
-	.4byte	0x1327c
+	.4byte	0x132a6
 	.uleb128 0x54
-	.4byte	0x13270
+	.4byte	0x1329a
 	.uleb128 0x54
-	.4byte	0x13264
+	.4byte	0x1328e
 	.uleb128 0x4e
 	.8byte	.LVL479
-	.4byte	0x13bc9
+	.4byte	0x13bf3
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x13253
+	.4byte	0x1327d
 	.8byte	.LBB1592
 	.4byte	.Ldebug_ranges0+0xce0
 	.byte	0x1
-	.2byte	0x672
-	.4byte	0xf4bb
+	.2byte	0x677
+	.4byte	0xf4c7
 	.uleb128 0x54
-	.4byte	0x1327c
+	.4byte	0x132a6
 	.uleb128 0x54
-	.4byte	0x13270
+	.4byte	0x1329a
 	.uleb128 0x54
-	.4byte	0x13264
+	.4byte	0x1328e
 	.uleb128 0x4e
 	.8byte	.LVL480
-	.4byte	0x13bc9
+	.4byte	0x13bf3
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL472
-	.4byte	0x13be3
+	.4byte	0x13c0d
 	.uleb128 0x4e
 	.8byte	.LVL473
-	.4byte	0x13bf0
+	.4byte	0x13c1a
 	.uleb128 0x4e
 	.8byte	.LVL474
-	.4byte	0x13bfc
+	.4byte	0x13c26
 	.uleb128 0x4e
 	.8byte	.LVL475
-	.4byte	0x13c08
+	.4byte	0x13c32
 	.uleb128 0x4e
 	.8byte	.LVL481
-	.4byte	0x13c14
+	.4byte	0x13c3e
 	.uleb128 0x4e
 	.8byte	.LVL482
-	.4byte	0x13c1e
+	.4byte	0x13c48
 	.uleb128 0x4e
 	.8byte	.LVL496
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0xfdb3
+	.4byte	0xfdbf
 	.8byte	.LBB1603
 	.4byte	.Ldebug_ranges0+0xd10
 	.byte	0x1
-	.2byte	0x751
-	.4byte	0xf5fe
+	.2byte	0x756
+	.4byte	0xf60a
 	.uleb128 0x54
-	.4byte	0xfdc4
+	.4byte	0xfdd0
 	.uleb128 0x54
-	.4byte	0xfdc4
+	.4byte	0xfdd0
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0xd10
 	.uleb128 0x5c
-	.4byte	0xfdd0
-	.uleb128 0x5f
 	.4byte	0xfddc
-	.4byte	.LLST127
 	.uleb128 0x5f
 	.4byte	0xfde8
+	.4byte	.LLST127
+	.uleb128 0x5f
+	.4byte	0xfdf4
 	.4byte	.LLST128
 	.uleb128 0x60
-	.4byte	0xfdf4
+	.4byte	0xfe00
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x5f
-	.4byte	0xfdfe
-	.4byte	.LLST129
-	.uleb128 0x5c
 	.4byte	0xfe0a
+	.4byte	.LLST129
 	.uleb128 0x5c
 	.4byte	0xfe16
+	.uleb128 0x5c
+	.4byte	0xfe22
 	.uleb128 0x53
-	.4byte	0x13289
+	.4byte	0x132b3
 	.8byte	.LBB1605
 	.8byte	.LBE1605-.LBB1605
 	.byte	0x1
-	.2byte	0x61c
-	.4byte	0xf594
+	.2byte	0x621
+	.4byte	0xf5a0
 	.uleb128 0x54
-	.4byte	0x13299
+	.4byte	0x132c3
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL484
-	.4byte	0x13be3
+	.4byte	0x13c0d
 	.uleb128 0x4e
 	.8byte	.LVL485
-	.4byte	0x13bf0
+	.4byte	0x13c1a
 	.uleb128 0x4e
 	.8byte	.LVL505
-	.4byte	0x13bfc
+	.4byte	0x13c26
 	.uleb128 0x4e
 	.8byte	.LVL506
-	.4byte	0x13c37
+	.4byte	0x13c61
 	.uleb128 0x4e
 	.8byte	.LVL584
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL585
-	.4byte	0x13c43
+	.4byte	0x13c6d
 	.uleb128 0x4e
 	.8byte	.LVL586
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL605
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0xfd01
+	.4byte	0xfd0d
 	.8byte	.LBB1614
 	.4byte	.Ldebug_ranges0+0xd70
 	.byte	0x1
-	.2byte	0x758
-	.4byte	0xf78b
+	.2byte	0x75d
+	.4byte	0xf797
 	.uleb128 0x54
-	.4byte	0xfd12
+	.4byte	0xfd1e
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0xd70
 	.uleb128 0x60
-	.4byte	0xfd1e
+	.4byte	0xfd2a
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x58
-	.4byte	0x1345f
+	.4byte	0x13489
 	.8byte	.LBB1616
 	.4byte	.Ldebug_ranges0+0xdb0
 	.byte	0x1
-	.2byte	0x67f
-	.4byte	0xf685
+	.2byte	0x684
+	.4byte	0xf691
 	.uleb128 0x54
-	.4byte	0x1346b
+	.4byte	0x13495
 	.uleb128 0x5e
 	.8byte	.LBB1618
 	.8byte	.LBE1618-.LBB1618
 	.uleb128 0x5c
-	.4byte	0x13496
+	.4byte	0x134c0
 	.uleb128 0x59
-	.4byte	0x135e3
+	.4byte	0x1360d
 	.8byte	.LBB1619
 	.8byte	.LBE1619-.LBB1619
 	.byte	0x10
 	.byte	0x1c
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x1362d
 	.uleb128 0x54
-	.4byte	0x135f8
+	.4byte	0x13622
 	.uleb128 0x54
-	.4byte	0x135ef
+	.4byte	0x13619
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13525
+	.4byte	0x1354f
 	.8byte	.LBB1623
 	.8byte	.LBE1623-.LBB1623
 	.byte	0x1
-	.2byte	0x687
-	.4byte	0xf6d0
+	.2byte	0x68c
+	.4byte	0xf6dc
 	.uleb128 0x54
-	.4byte	0x1353a
+	.4byte	0x13564
 	.uleb128 0x54
-	.4byte	0x13531
+	.4byte	0x1355b
 	.uleb128 0x5e
 	.8byte	.LBB1624
 	.8byte	.LBE1624-.LBB1624
 	.uleb128 0x5f
-	.4byte	0x13543
+	.4byte	0x1356d
 	.4byte	.LLST130
 	.uleb128 0x5f
-	.4byte	0x1354d
+	.4byte	0x13577
 	.4byte	.LLST131
 	.byte	0
 	.byte	0
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xde0
-	.4byte	0xf6fd
+	.4byte	0xf709
 	.uleb128 0x5f
-	.4byte	0xfd2b
+	.4byte	0xfd37
 	.4byte	.LLST132
 	.uleb128 0x4e
 	.8byte	.LVL513
-	.4byte	0x13c4f
+	.4byte	0x13c79
 	.uleb128 0x4e
 	.8byte	.LVL515
-	.4byte	0x13c5b
+	.4byte	0x13c85
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13525
+	.4byte	0x1354f
 	.8byte	.LBB1627
 	.8byte	.LBE1627-.LBB1627
 	.byte	0x1
-	.2byte	0x690
-	.4byte	0xf748
+	.2byte	0x695
+	.4byte	0xf754
 	.uleb128 0x54
-	.4byte	0x1353a
+	.4byte	0x13564
 	.uleb128 0x54
-	.4byte	0x13531
+	.4byte	0x1355b
 	.uleb128 0x5e
 	.8byte	.LBB1628
 	.8byte	.LBE1628-.LBB1628
 	.uleb128 0x5f
-	.4byte	0x13543
+	.4byte	0x1356d
 	.4byte	.LLST133
 	.uleb128 0x5f
-	.4byte	0x1354d
+	.4byte	0x13577
 	.4byte	.LLST134
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL507
-	.4byte	0x13c4f
+	.4byte	0x13c79
 	.uleb128 0x4e
 	.8byte	.LVL508
-	.4byte	0x13c68
+	.4byte	0x13c92
 	.uleb128 0x4e
 	.8byte	.LVL516
-	.4byte	0x13c68
+	.4byte	0x13c92
 	.uleb128 0x4e
 	.8byte	.LVL589
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL593
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0xfce7
+	.4byte	0xfcf3
 	.8byte	.LBB1631
 	.8byte	.LBE1631-.LBB1631
 	.byte	0x1
-	.2byte	0x75f
-	.4byte	0xf825
+	.2byte	0x764
+	.4byte	0xf831
 	.uleb128 0x54
-	.4byte	0xfcf4
+	.4byte	0xfd00
 	.uleb128 0x58
-	.4byte	0x12ebc
+	.4byte	0x12ee6
 	.8byte	.LBB1633
 	.4byte	.Ldebug_ranges0+0xe10
 	.byte	0x1
-	.2byte	0x6a0
-	.4byte	0xf7f0
+	.2byte	0x6a5
+	.4byte	0xf7fc
 	.uleb128 0x54
-	.4byte	0x12ede
+	.4byte	0x12f08
 	.uleb128 0x54
-	.4byte	0x12ed3
+	.4byte	0x12efd
 	.uleb128 0x54
-	.4byte	0x12ec8
+	.4byte	0x12ef2
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0xe10
 	.uleb128 0x5f
-	.4byte	0x12ee9
+	.4byte	0x12f13
 	.4byte	.LLST135
 	.uleb128 0x4e
 	.8byte	.LVL523
-	.4byte	0x13c75
+	.4byte	0x13c9f
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL524
-	.4byte	0x13c81
+	.4byte	0x13cab
 	.uleb128 0x4e
 	.8byte	.LVL525
-	.4byte	0x13c8d
+	.4byte	0x13cb7
 	.uleb128 0x4e
 	.8byte	.LVL526
-	.4byte	0x13c81
+	.4byte	0x13cab
 	.uleb128 0x4e
 	.8byte	.LVL527
-	.4byte	0x13c8d
+	.4byte	0x13cb7
 	.byte	0
 	.uleb128 0x58
-	.4byte	0xfc45
+	.4byte	0xfc51
 	.8byte	.LBB1643
 	.4byte	.Ldebug_ranges0+0xe70
 	.byte	0x1
-	.2byte	0x762
-	.4byte	0xfac8
+	.2byte	0x767
+	.4byte	0xfad4
 	.uleb128 0x54
-	.4byte	0xfc62
+	.4byte	0xfc6e
 	.uleb128 0x54
-	.4byte	0xfc56
+	.4byte	0xfc62
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0xe70
 	.uleb128 0x5c
-	.4byte	0xfc6e
-	.uleb128 0x5f
 	.4byte	0xfc7a
-	.4byte	.LLST136
 	.uleb128 0x5f
 	.4byte	0xfc86
-	.4byte	.LLST137
+	.4byte	.LLST136
 	.uleb128 0x5f
 	.4byte	0xfc92
-	.4byte	.LLST138
+	.4byte	.LLST137
 	.uleb128 0x5f
 	.4byte	0xfc9e
-	.4byte	.LLST139
+	.4byte	.LLST138
 	.uleb128 0x5f
 	.4byte	0xfcaa
-	.4byte	.LLST140
+	.4byte	.LLST139
 	.uleb128 0x5f
 	.4byte	0xfcb6
+	.4byte	.LLST140
+	.uleb128 0x5f
+	.4byte	0xfcc2
 	.4byte	.LLST141
 	.uleb128 0x5c
-	.4byte	0xfcc2
-	.uleb128 0x5f
 	.4byte	0xfcce
-	.4byte	.LLST142
 	.uleb128 0x5f
 	.4byte	0xfcda
+	.4byte	.LLST142
+	.uleb128 0x5f
+	.4byte	0xfce6
 	.4byte	.LLST143
 	.uleb128 0x53
-	.4byte	0x1163a
+	.4byte	0x11646
 	.8byte	.LBB1645
 	.8byte	.LBE1645-.LBB1645
 	.byte	0x1
-	.2byte	0x6d8
-	.4byte	0xf907
+	.2byte	0x6dd
+	.4byte	0xf913
 	.uleb128 0x54
-	.4byte	0x1164b
+	.4byte	0x11657
 	.uleb128 0x54
-	.4byte	0x1164b
+	.4byte	0x11657
 	.uleb128 0x5e
 	.8byte	.LBB1646
 	.8byte	.LBE1646-.LBB1646
 	.uleb128 0x5f
-	.4byte	0x11657
+	.4byte	0x11663
 	.4byte	.LLST144
 	.uleb128 0x4e
 	.8byte	.LVL558
-	.4byte	0x13c99
+	.4byte	0x13cc3
 	.uleb128 0x4e
 	.8byte	.LVL560
-	.4byte	0x13c1e
+	.4byte	0x13c48
 	.uleb128 0x4e
 	.8byte	.LVL561
-	.4byte	0x13ca5
+	.4byte	0x13ccf
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13039
+	.4byte	0x13063
 	.8byte	.LBB1647
 	.8byte	.LBE1647-.LBB1647
 	.byte	0x1
-	.2byte	0x6cc
-	.4byte	0xf95e
+	.2byte	0x6d1
+	.4byte	0xf96a
 	.uleb128 0x54
-	.4byte	0x13056
+	.4byte	0x13080
 	.uleb128 0x54
-	.4byte	0x1304a
+	.4byte	0x13074
 	.uleb128 0x5a
-	.4byte	0x13063
+	.4byte	0x1308d
 	.8byte	.LBB1648
 	.8byte	.LBE1648-.LBB1648
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x13080
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x13074
+	.4byte	0x1309e
 	.uleb128 0x4e
 	.8byte	.LVL565
-	.4byte	0x13cb1
+	.4byte	0x13cdb
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x13039
+	.4byte	0x13063
 	.8byte	.LBB1650
 	.8byte	.LBE1650-.LBB1650
 	.byte	0x1
-	.2byte	0x6be
-	.4byte	0xf9b5
+	.2byte	0x6c3
+	.4byte	0xf9c1
 	.uleb128 0x54
-	.4byte	0x13056
+	.4byte	0x13080
 	.uleb128 0x54
-	.4byte	0x1304a
+	.4byte	0x13074
 	.uleb128 0x5a
-	.4byte	0x13063
+	.4byte	0x1308d
 	.8byte	.LBB1651
 	.8byte	.LBE1651-.LBB1651
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x13080
+	.4byte	0x130aa
 	.uleb128 0x54
-	.4byte	0x13074
+	.4byte	0x1309e
 	.uleb128 0x4e
 	.8byte	.LVL577
-	.4byte	0x13cb1
+	.4byte	0x13cdb
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL529
-	.4byte	0x13cbe
+	.4byte	0x13ce8
 	.uleb128 0x4e
 	.8byte	.LVL531
-	.4byte	0x13cbe
+	.4byte	0x13ce8
 	.uleb128 0x4e
 	.8byte	.LVL533
-	.4byte	0x13cca
+	.4byte	0x13cf4
 	.uleb128 0x4e
 	.8byte	.LVL538
-	.4byte	0x13cca
+	.4byte	0x13cf4
 	.uleb128 0x4e
 	.8byte	.LVL541
-	.4byte	0x13c99
+	.4byte	0x13cc3
 	.uleb128 0x4e
 	.8byte	.LVL543
-	.4byte	0x13cd7
+	.4byte	0x13d01
 	.uleb128 0x4e
 	.8byte	.LVL544
-	.4byte	0x13ca5
+	.4byte	0x13ccf
 	.uleb128 0x4e
 	.8byte	.LVL545
-	.4byte	0x13ce1
+	.4byte	0x13d0b
 	.uleb128 0x4e
 	.8byte	.LVL546
-	.4byte	0x13ce1
+	.4byte	0x13d0b
 	.uleb128 0x4e
 	.8byte	.LVL556
-	.4byte	0x13bb0
+	.4byte	0x13bda
 	.uleb128 0x4e
 	.8byte	.LVL557
-	.4byte	0x13ced
+	.4byte	0x13d17
 	.uleb128 0x4e
 	.8byte	.LVL562
-	.4byte	0x13cf9
+	.4byte	0x13d23
 	.uleb128 0x4e
 	.8byte	.LVL564
-	.4byte	0x13bb0
+	.4byte	0x13bda
 	.uleb128 0x4e
 	.8byte	.LVL568
-	.4byte	0x13cd7
+	.4byte	0x13d01
 	.uleb128 0x4e
 	.8byte	.LVL571
-	.4byte	0x13c99
+	.4byte	0x13cc3
 	.uleb128 0x4e
 	.8byte	.LVL573
-	.4byte	0x13cd7
+	.4byte	0x13d01
 	.uleb128 0x4e
 	.8byte	.LVL574
-	.4byte	0x13ca5
+	.4byte	0x13ccf
 	.uleb128 0x4e
 	.8byte	.LVL576
-	.4byte	0x13bb0
+	.4byte	0x13bda
 	.uleb128 0x4e
 	.8byte	.LVL581
-	.4byte	0x13cd7
+	.4byte	0x13d01
 	.uleb128 0x4e
 	.8byte	.LVL609
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL612
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1310d
+	.4byte	0x13137
 	.8byte	.LBB1656
 	.8byte	.LBE1656-.LBB1656
 	.byte	0x1
-	.2byte	0x764
-	.4byte	0xfb11
+	.2byte	0x769
+	.4byte	0xfb1d
 	.uleb128 0x54
-	.4byte	0x13124
+	.4byte	0x1314e
 	.uleb128 0x54
-	.4byte	0x13119
+	.4byte	0x13143
 	.uleb128 0x59
-	.4byte	0x1320f
+	.4byte	0x13239
 	.8byte	.LBB1657
 	.8byte	.LBE1657-.LBB1657
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x54
-	.4byte	0x13228
+	.4byte	0x13252
 	.uleb128 0x54
-	.4byte	0x1321c
+	.4byte	0x13246
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0xfe39
+	.4byte	0xfe45
 	.8byte	.LBB1659
 	.8byte	.LBE1659-.LBB1659
 	.byte	0x1
-	.2byte	0x767
-	.4byte	0xfb8e
+	.2byte	0x76c
+	.4byte	0xfb9a
 	.uleb128 0x54
-	.4byte	0xfe4a
+	.4byte	0xfe56
 	.uleb128 0x4e
 	.8byte	.LVL547
-	.4byte	0x13d05
+	.4byte	0x13d2f
 	.uleb128 0x4e
 	.8byte	.LVL548
-	.4byte	0x13d11
+	.4byte	0x13d3b
 	.uleb128 0x4e
 	.8byte	.LVL549
-	.4byte	0x13d11
+	.4byte	0x13d3b
 	.uleb128 0x4e
 	.8byte	.LVL550
-	.4byte	0x13d11
+	.4byte	0x13d3b
 	.uleb128 0x4e
 	.8byte	.LVL551
-	.4byte	0x13d11
+	.4byte	0x13d3b
 	.uleb128 0x4e
 	.8byte	.LVL552
-	.4byte	0x13d11
+	.4byte	0x13d3b
 	.uleb128 0x4e
 	.8byte	.LVL553
-	.4byte	0x13d11
+	.4byte	0x13d3b
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL444
-	.4byte	0x13be3
+	.4byte	0x13c0d
 	.uleb128 0x4e
 	.8byte	.LVL445
-	.4byte	0x13d1e
+	.4byte	0x13d48
 	.uleb128 0x4e
 	.8byte	.LVL447
-	.4byte	0x13be3
+	.4byte	0x13c0d
 	.uleb128 0x4e
 	.8byte	.LVL448
-	.4byte	0x13d2a
+	.4byte	0x13d54
 	.uleb128 0x4e
 	.8byte	.LVL488
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL490
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL497
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL554
-	.4byte	0x13bb0
+	.4byte	0x13bda
 	.uleb128 0x4e
 	.8byte	.LVL590
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL597
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL598
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL599
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL603
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL607
-	.4byte	0x13d37
+	.4byte	0x13d61
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3034
+	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0x6ac
+	.2byte	0x6b1
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfce7
+	.4byte	0xfcf3
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x6ac
-	.4byte	0xe461
+	.2byte	0x6b1
+	.4byte	0xe46d
 	.uleb128 0x64
-	.4byte	.LASF2994
+	.4byte	.LASF2996
 	.byte	0x1
-	.2byte	0x6ac
-	.4byte	0xe117
+	.2byte	0x6b1
+	.4byte	0xe123
 	.uleb128 0x46
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x6ae
-	.4byte	0xe6fb
+	.2byte	0x6b3
+	.4byte	0xe707
 	.uleb128 0x46
-	.4byte	.LASF3026
+	.4byte	.LASF3028
 	.byte	0x1
-	.2byte	0x6af
+	.2byte	0x6b4
 	.4byte	0x6d
 	.uleb128 0x46
-	.4byte	.LASF3027
+	.4byte	.LASF3029
 	.byte	0x1
-	.2byte	0x6b0
+	.2byte	0x6b5
 	.4byte	0x6d
 	.uleb128 0x46
-	.4byte	.LASF3028
+	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0x6b1
+	.2byte	0x6b6
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3029
+	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0x6b2
+	.2byte	0x6b7
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3030
+	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0x6b3
+	.2byte	0x6b8
 	.4byte	0x219
 	.uleb128 0x46
-	.4byte	.LASF3031
+	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0x6b4
+	.2byte	0x6b9
 	.4byte	0x219
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6b5
-	.4byte	0xe3fc
+	.2byte	0x6ba
+	.4byte	0xe408
 	.uleb128 0x46
-	.4byte	.LASF3032
+	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0x6b6
+	.2byte	0x6bb
 	.4byte	0x443
 	.uleb128 0x46
-	.4byte	.LASF3033
+	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0x6b7
+	.2byte	0x6bc
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3091
+	.4byte	.LASF3093
 	.byte	0x1
-	.2byte	0x695
+	.2byte	0x69a
 	.byte	0x1
-	.4byte	0xfd01
+	.4byte	0xfd0d
 	.uleb128 0x64
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x695
-	.4byte	0xe6fb
+	.2byte	0x69a
+	.4byte	0xe707
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3035
+	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0x67b
+	.2byte	0x680
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfd39
+	.4byte	0xfd45
 	.uleb128 0x64
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x67b
-	.4byte	0xe6fb
+	.2byte	0x680
+	.4byte	0xe707
 	.uleb128 0x46
 	.4byte	.LASF2463
 	.byte	0x1
-	.2byte	0x67d
+	.2byte	0x682
 	.4byte	0xd7e9
 	.uleb128 0x66
 	.uleb128 0x52
 	.string	"__k"
 	.byte	0x1
-	.2byte	0x68a
+	.2byte	0x68f
 	.4byte	0x2eda
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3036
+	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0x632
+	.2byte	0x637
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfdb3
+	.4byte	0xfdbf
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x632
-	.4byte	0xe461
+	.2byte	0x637
+	.4byte	0xe46d
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x634
+	.2byte	0x639
 	.4byte	0xa545
 	.uleb128 0x46
-	.4byte	.LASF2994
+	.4byte	.LASF2996
 	.byte	0x1
-	.2byte	0x635
-	.4byte	0xe117
+	.2byte	0x63a
+	.4byte	0xe123
 	.uleb128 0x46
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x636
-	.4byte	0xe6fb
+	.2byte	0x63b
+	.4byte	0xe707
 	.uleb128 0x46
-	.4byte	.LASF3037
+	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0x637
+	.2byte	0x63c
 	.4byte	0xb869
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x638
+	.2byte	0x63d
 	.4byte	0x9721
 	.uleb128 0x46
-	.4byte	.LASF3038
+	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0x639
+	.2byte	0x63e
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x63a
+	.2byte	0x63f
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x63a
+	.2byte	0x63f
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3039
+	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0x609
+	.2byte	0x60e
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe24
+	.4byte	0xfe30
 	.uleb128 0x64
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x609
-	.4byte	0xe6fb
+	.2byte	0x60e
+	.4byte	0xe707
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x60b
+	.2byte	0x610
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x60c
+	.2byte	0x611
 	.4byte	0xa545
 	.uleb128 0x46
-	.4byte	.LASF3037
+	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0x60d
+	.2byte	0x612
 	.4byte	0xb869
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x60e
+	.2byte	0x613
 	.4byte	0x9721
 	.uleb128 0x46
-	.4byte	.LASF3040
+	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0x60f
+	.2byte	0x614
 	.4byte	0x29
 	.uleb128 0x46
-	.4byte	.LASF3041
+	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0x610
+	.2byte	0x615
 	.4byte	0xc6
 	.uleb128 0x67
-	.4byte	.LASF3018
-	.4byte	0xfe34
-	.4byte	.LASF3039
+	.4byte	.LASF3020
+	.4byte	0xfe40
+	.4byte	.LASF3041
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xfe34
+	.4byte	0xfe40
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x12
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xfe24
+	.4byte	0xfe30
 	.uleb128 0x62
-	.4byte	.LASF3042
+	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0x5fb
+	.2byte	0x600
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xfe57
+	.4byte	0xfe63
 	.uleb128 0x64
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x5fb
-	.4byte	0xe6fb
+	.2byte	0x600
+	.4byte	0xe707
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3043
+	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0x5f2
+	.2byte	0x5f7
 	.4byte	0x2d9
 	.8byte	.LFB2833
 	.8byte	.LFE2833-.LFB2833
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfeb7
+	.4byte	0xfec3
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5f2
+	.2byte	0x5f7
 	.4byte	0xa545
 	.4byte	.LLST75
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5f3
+	.2byte	0x5f8
 	.4byte	0xb3c0
 	.4byte	.LLST76
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5f4
+	.2byte	0x5f9
 	.4byte	0x219
 	.4byte	.LLST77
 	.uleb128 0x4e
 	.8byte	.LVL269
-	.4byte	0x13d41
+	.4byte	0x13d6b
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3044
+	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0x5e9
+	.2byte	0x5ee
 	.4byte	0x2d9
 	.8byte	.LFB2832
 	.8byte	.LFE2832-.LFB2832
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xff17
+	.4byte	0xff23
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5e9
+	.2byte	0x5ee
 	.4byte	0xa545
 	.4byte	.LLST78
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5ea
+	.2byte	0x5ef
 	.4byte	0xb3c0
 	.4byte	.LLST79
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5eb
+	.2byte	0x5f0
 	.4byte	0x219
 	.4byte	.LLST80
 	.uleb128 0x4e
 	.8byte	.LVL274
-	.4byte	0x13d41
+	.4byte	0x13d6b
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3045
+	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0x5d1
+	.2byte	0x5d6
 	.4byte	0x2d9
 	.8byte	.LFB2831
 	.8byte	.LFE2831-.LFB2831
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xffe7
+	.4byte	0xfff3
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5d1
+	.2byte	0x5d6
 	.4byte	0xa545
 	.4byte	.LLST90
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5d2
+	.2byte	0x5d7
 	.4byte	0xb3c0
 	.4byte	.LLST91
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5d3
+	.2byte	0x5d8
 	.4byte	0x56
 	.4byte	.LLST92
 	.uleb128 0x56
 	.4byte	.LASF380
 	.byte	0x1
-	.2byte	0x5d3
+	.2byte	0x5d8
 	.4byte	0x2ce
 	.4byte	.LLST93
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x5d5
-	.4byte	0xe461
+	.2byte	0x5da
+	.4byte	0xe46d
 	.4byte	.LLST94
 	.uleb128 0x57
 	.4byte	.LASF2453
 	.byte	0x1
-	.2byte	0x5d6
+	.2byte	0x5db
 	.4byte	0xc6
 	.4byte	.LLST95
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x5d6
+	.2byte	0x5db
 	.4byte	0xc6
 	.uleb128 0x4e
 	.8byte	.LVL300
-	.4byte	0x13d4e
+	.4byte	0x13d78
 	.uleb128 0x4e
 	.8byte	.LVL302
-	.4byte	0x13d5b
+	.4byte	0x13d85
 	.uleb128 0x4e
 	.8byte	.LVL307
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL310
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL311
-	.4byte	0x13d37
+	.4byte	0x13d61
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3046
+	.4byte	.LASF3048
 	.byte	0x1
-	.2byte	0x5c5
+	.2byte	0x5ca
 	.4byte	0x2d9
 	.8byte	.LFB2830
 	.8byte	.LFE2830-.LFB2830
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10081
+	.4byte	0x1008d
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5c5
+	.2byte	0x5ca
 	.4byte	0xa545
 	.4byte	.LLST81
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5c6
+	.2byte	0x5cb
 	.4byte	0xb3c0
 	.4byte	.LLST82
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5c7
+	.2byte	0x5cc
 	.4byte	0x219
 	.4byte	.LLST83
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x5c9
-	.4byte	0xe461
+	.2byte	0x5ce
+	.4byte	0xe46d
 	.uleb128 0x46
 	.4byte	.LASF2453
 	.byte	0x1
-	.2byte	0x5ca
+	.2byte	0x5cf
 	.4byte	0xc6
 	.uleb128 0x53
-	.4byte	0x12de5
+	.4byte	0x12e0f
 	.8byte	.LBB1206
 	.8byte	.LBE1206-.LBB1206
 	.byte	0x1
-	.2byte	0x5cc
-	.4byte	0x10073
+	.2byte	0x5d1
+	.4byte	0x1007f
 	.uleb128 0x54
-	.4byte	0x12df5
+	.4byte	0x12e1f
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL279
-	.4byte	0x13d41
+	.4byte	0x13d6b
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3047
+	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0x5b7
+	.2byte	0x5bc
 	.4byte	0x2d9
 	.8byte	.LFB2829
 	.8byte	.LFE2829-.LFB2829
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1012a
+	.4byte	0x10136
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5b7
+	.2byte	0x5bc
 	.4byte	0xa545
 	.4byte	.LLST84
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5b8
+	.2byte	0x5bd
 	.4byte	0xb3c0
 	.4byte	.LLST85
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5b9
+	.2byte	0x5be
 	.4byte	0x219
 	.4byte	.LLST86
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x5bb
-	.4byte	0xe461
+	.2byte	0x5c0
+	.4byte	0xe46d
 	.uleb128 0x69
 	.string	"t"
 	.byte	0x1
-	.2byte	0x5bc
+	.2byte	0x5c1
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x58
-	.4byte	0x12e01
+	.4byte	0x12e2b
 	.8byte	.LBB1208
 	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
-	.2byte	0x5be
-	.4byte	0x1010f
+	.2byte	0x5c3
+	.4byte	0x1011b
 	.uleb128 0x54
-	.4byte	0x12e1c
+	.4byte	0x12e46
 	.uleb128 0x54
-	.4byte	0x12e11
+	.4byte	0x12e3b
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL286
-	.4byte	0x13d41
+	.4byte	0x13d6b
 	.uleb128 0x4e
 	.8byte	.LVL289
-	.4byte	0x13d37
+	.4byte	0x13d61
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3048
+	.4byte	.LASF3050
 	.byte	0x1
-	.2byte	0x5ac
+	.2byte	0x5b1
 	.4byte	0x2d9
 	.8byte	.LFB2828
 	.8byte	.LFE2828-.LFB2828
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10196
+	.4byte	0x101a2
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5ac
+	.2byte	0x5b1
 	.4byte	0xa545
 	.4byte	.LLST87
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5ad
+	.2byte	0x5b2
 	.4byte	0xb3c0
 	.4byte	.LLST88
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5ae
+	.2byte	0x5b3
 	.4byte	0x219
 	.4byte	.LLST89
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x5b0
-	.4byte	0xe461
+	.2byte	0x5b5
+	.4byte	0xe46d
 	.uleb128 0x4e
 	.8byte	.LVL294
-	.4byte	0x13d41
+	.4byte	0x13d6b
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3049
+	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0x5a1
+	.2byte	0x5a6
 	.4byte	0x2d9
 	.8byte	.LFB2827
 	.8byte	.LFE2827-.LFB2827
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1020f
+	.4byte	0x1021b
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5a1
+	.2byte	0x5a6
 	.4byte	0xa545
 	.4byte	.LLST96
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5a2
+	.2byte	0x5a7
 	.4byte	0xb3c0
 	.4byte	.LLST97
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5a3
+	.2byte	0x5a8
 	.4byte	0x219
 	.4byte	.LLST98
 	.uleb128 0x46
-	.4byte	.LASF3050
+	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0x5a5
+	.2byte	0x5aa
 	.4byte	0x56
 	.uleb128 0x4e
 	.8byte	.LVL313
-	.4byte	0x13d67
+	.4byte	0x13d91
 	.uleb128 0x4e
 	.8byte	.LVL314
-	.4byte	0x13d41
+	.4byte	0x13d6b
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3051
+	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0x58a
+	.2byte	0x58f
 	.4byte	0xc6
 	.8byte	.LFB2826
 	.8byte	.LFE2826-.LFB2826
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10250
+	.4byte	0x1025c
 	.uleb128 0x56
 	.4byte	.LASF415
 	.byte	0x1
-	.2byte	0x58a
+	.2byte	0x58f
 	.4byte	0x1c54
 	.4byte	.LLST10
 	.uleb128 0x6a
 	.4byte	.LASF1270
 	.byte	0x1
-	.2byte	0x58a
+	.2byte	0x58f
 	.4byte	0x5531
 	.uleb128 0x1
 	.byte	0x51
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3052
+	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0x57b
+	.2byte	0x580
 	.4byte	0xc6
 	.8byte	.LFB2825
 	.8byte	.LFE2825-.LFB2825
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x102b9
+	.4byte	0x102c5
 	.uleb128 0x56
 	.4byte	.LASF1270
 	.byte	0x1
-	.2byte	0x57b
+	.2byte	0x580
 	.4byte	0x5531
 	.4byte	.LLST14
 	.uleb128 0x51
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x57b
+	.2byte	0x580
 	.4byte	0x3c8a
 	.4byte	.LLST15
 	.uleb128 0x46
 	.4byte	.LASF881
 	.byte	0x1
-	.2byte	0x57d
+	.2byte	0x582
 	.4byte	0x29
 	.uleb128 0x4e
 	.8byte	.LVL44
-	.4byte	0x13d73
+	.4byte	0x13d9d
 	.uleb128 0x4e
 	.8byte	.LVL45
-	.4byte	0x13d7f
+	.4byte	0x13da9
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3053
+	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0x4b2
+	.2byte	0x4b7
 	.4byte	0x194
 	.8byte	.LFB2824
 	.8byte	.LFE2824-.LFB2824
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11561
+	.4byte	0x1156d
 	.uleb128 0x56
 	.4byte	.LASF1270
 	.byte	0x1
-	.2byte	0x4b2
+	.2byte	0x4b7
 	.4byte	0x5531
 	.4byte	.LLST16
 	.uleb128 0x51
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0x4b2
+	.2byte	0x4b7
 	.4byte	0x6d
 	.4byte	.LLST17
 	.uleb128 0x51
 	.string	"arg"
 	.byte	0x1
-	.2byte	0x4b2
+	.2byte	0x4b7
 	.4byte	0x29
 	.4byte	.LLST18
 	.uleb128 0x46
-	.4byte	.LASF3054
+	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0x4b4
+	.2byte	0x4b9
 	.4byte	0x443
 	.uleb128 0x46
-	.4byte	.LASF2994
+	.4byte	.LASF2996
 	.byte	0x1
-	.2byte	0x4b5
-	.4byte	0xe117
+	.2byte	0x4ba
+	.4byte	0xe123
 	.uleb128 0x46
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x4b6
-	.4byte	0xe6fb
+	.2byte	0x4bb
+	.4byte	0xe707
 	.uleb128 0x4c
-	.4byte	.LASF3055
+	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0x4b7
-	.4byte	0xd9bd
+	.2byte	0x4bc
+	.4byte	0xd9c9
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 -56
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x4b8
-	.4byte	0xe3fc
+	.2byte	0x4bd
+	.4byte	0xe408
 	.uleb128 0x46
-	.4byte	.LASF3056
+	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x4b9
+	.2byte	0x4be
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3057
+	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x4ba
+	.2byte	0x4bf
 	.4byte	0x29
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x4bb
+	.2byte	0x4c0
 	.4byte	0xc6
 	.uleb128 0x55
-	.4byte	.LASF3018
-	.4byte	0x11571
+	.4byte	.LASF3020
+	.4byte	0x1157d
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34837
+	.8byte	__func__.34846
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x1d0
-	.4byte	0x10423
+	.4byte	0x1042f
 	.uleb128 0x46
-	.4byte	.LASF3058
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x505
+	.2byte	0x50a
 	.4byte	0xc6
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0x1d0
 	.uleb128 0x6b
-	.4byte	.LASF3070
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x505
+	.2byte	0x50a
 	.8byte	.L134
 	.uleb128 0x4c
-	.4byte	.LASF3059
+	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x505
+	.2byte	0x50a
 	.4byte	0x14fd
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -96
 	.uleb128 0x46
-	.4byte	.LASF3058
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x505
+	.2byte	0x50a
 	.4byte	0x194
 	.uleb128 0x6c
 	.8byte	.LBB998
 	.8byte	.LBE998-.LBB998
-	.4byte	0x10407
+	.4byte	0x10413
 	.uleb128 0x57
-	.4byte	.LASF3060
+	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x505
+	.2byte	0x50a
 	.4byte	0x194
 	.4byte	.LLST33
 	.uleb128 0x4e
 	.8byte	.LVL91
-	.4byte	0x13d8c
+	.4byte	0x13db6
 	.uleb128 0x4e
 	.8byte	.LVL92
-	.4byte	0x13d98
+	.4byte	0x13dc2
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL89
-	.4byte	0x13da5
+	.4byte	0x13dcf
 	.uleb128 0x4e
 	.8byte	.LVL93
-	.4byte	0x13db1
+	.4byte	0x13ddb
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12ef4
+	.4byte	0x12f1e
 	.8byte	.LBB934
 	.4byte	.Ldebug_ranges0+0x60
 	.byte	0x1
-	.2byte	0x56d
-	.4byte	0x10643
+	.2byte	0x572
+	.4byte	0x1064f
 	.uleb128 0x54
-	.4byte	0x12f19
+	.4byte	0x12f43
 	.uleb128 0x54
-	.4byte	0x12f0e
+	.4byte	0x12f38
 	.uleb128 0x54
-	.4byte	0x12f04
+	.4byte	0x12f2e
 	.uleb128 0x6d
-	.4byte	0x12f52
+	.4byte	0x12f7c
 	.8byte	.LBB935
 	.4byte	.Ldebug_ranges0+0x60
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12f77
+	.4byte	0x12fa1
 	.uleb128 0x54
-	.4byte	0x12f6c
+	.4byte	0x12f96
 	.uleb128 0x54
-	.4byte	0x12f62
+	.4byte	0x12f8c
 	.uleb128 0x6e
-	.4byte	0x12fef
+	.4byte	0x13019
 	.8byte	.LBB937
 	.4byte	.Ldebug_ranges0+0xb0
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10579
+	.4byte	0x10585
 	.uleb128 0x54
-	.4byte	0x1300a
+	.4byte	0x13034
 	.uleb128 0x6f
-	.4byte	0x12fff
+	.4byte	0x13029
 	.4byte	.LLST19
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0xb0
 	.uleb128 0x5f
-	.4byte	0x13015
+	.4byte	0x1303f
 	.4byte	.LLST20
 	.uleb128 0x5f
-	.4byte	0x13020
+	.4byte	0x1304a
 	.4byte	.LLST21
 	.uleb128 0x70
-	.4byte	0x13443
+	.4byte	0x1346d
 	.8byte	.LBB939
 	.8byte	.LBE939-.LBB939
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x104df
+	.4byte	0x104eb
 	.uleb128 0x5e
 	.8byte	.LBB940
 	.8byte	.LBE940-.LBB940
 	.uleb128 0x5f
-	.4byte	0x13453
+	.4byte	0x1347d
 	.4byte	.LLST22
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x13417
+	.4byte	0x13441
 	.8byte	.LBB941
 	.8byte	.LBE941-.LBB941
 	.byte	0x6
 	.byte	0x55
-	.4byte	0x10527
+	.4byte	0x10533
 	.uleb128 0x54
-	.4byte	0x13431
+	.4byte	0x1345b
 	.uleb128 0x54
-	.4byte	0x13427
+	.4byte	0x13451
 	.uleb128 0x59
-	.4byte	0x134f9
+	.4byte	0x13523
 	.8byte	.LBB942
 	.8byte	.LBE942-.LBB942
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x13513
+	.4byte	0x1353d
 	.uleb128 0x54
-	.4byte	0x13509
+	.4byte	0x13533
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
 	.8byte	.LBB944
 	.8byte	.LBE944-.LBB944
 	.uleb128 0x5c
-	.4byte	0x1302c
+	.4byte	0x13056
 	.uleb128 0x59
-	.4byte	0x134c7
+	.4byte	0x134f1
 	.8byte	.LBB945
 	.8byte	.LBE945-.LBB945
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x134e2
+	.4byte	0x1350c
 	.uleb128 0x54
-	.4byte	0x134d7
+	.4byte	0x13501
 	.uleb128 0x5e
 	.8byte	.LBB946
 	.8byte	.LBE946-.LBB946
 	.uleb128 0x5c
-	.4byte	0x134ed
+	.4byte	0x13517
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12fbb
+	.4byte	0x12fe5
 	.8byte	.LBB951
 	.8byte	.LBE951-.LBB951
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x10634
+	.4byte	0x10640
 	.uleb128 0x54
-	.4byte	0x12fcb
+	.4byte	0x12ff5
 	.uleb128 0x5e
 	.8byte	.LBB952
 	.8byte	.LBE952-.LBB952
 	.uleb128 0x5f
-	.4byte	0x12fd6
+	.4byte	0x13000
 	.4byte	.LLST23
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xf0
-	.4byte	0x105ff
+	.4byte	0x1060b
 	.uleb128 0x5f
-	.4byte	0x12fe2
+	.4byte	0x1300c
 	.4byte	.LLST24
 	.uleb128 0x59
-	.4byte	0x134c7
+	.4byte	0x134f1
 	.8byte	.LBB954
 	.8byte	.LBE954-.LBB954
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x134e2
+	.4byte	0x1350c
 	.uleb128 0x54
-	.4byte	0x134d7
+	.4byte	0x13501
 	.uleb128 0x5e
 	.8byte	.LBB955
 	.8byte	.LBE955-.LBB955
 	.uleb128 0x5c
-	.4byte	0x134ed
+	.4byte	0x13517
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13443
+	.4byte	0x1346d
 	.8byte	.LBB956
 	.8byte	.LBE956-.LBB956
 	.byte	0x6
@@ -39276,7 +39341,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB957
 	.8byte	.LBE957-.LBB957
 	.uleb128 0x5f
-	.4byte	0x13453
+	.4byte	0x1347d
 	.4byte	.LLST25
 	.byte	0
 	.byte	0
@@ -39284,162 +39349,162 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL119
-	.4byte	0x13dbe
+	.4byte	0x13de8
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12f23
+	.4byte	0x12f4d
 	.8byte	.LBB967
 	.4byte	.Ldebug_ranges0+0x120
 	.byte	0x1
-	.2byte	0x4f0
-	.4byte	0x1086e
+	.2byte	0x4f5
+	.4byte	0x1087a
 	.uleb128 0x54
-	.4byte	0x12f48
+	.4byte	0x12f72
 	.uleb128 0x54
-	.4byte	0x12f3d
+	.4byte	0x12f67
 	.uleb128 0x54
-	.4byte	0x12f33
+	.4byte	0x12f5d
 	.uleb128 0x6d
-	.4byte	0x12f81
+	.4byte	0x12fab
 	.8byte	.LBB968
 	.4byte	.Ldebug_ranges0+0x120
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x12fa6
+	.4byte	0x12fd0
 	.uleb128 0x54
-	.4byte	0x12f9b
+	.4byte	0x12fc5
 	.uleb128 0x54
-	.4byte	0x12f91
+	.4byte	0x12fbb
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0x120
 	.uleb128 0x5c
-	.4byte	0x12faf
+	.4byte	0x12fd9
 	.uleb128 0x6e
-	.4byte	0x12fef
+	.4byte	0x13019
 	.8byte	.LBB970
 	.4byte	.Ldebug_ranges0+0x160
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x107a3
+	.4byte	0x107af
 	.uleb128 0x54
-	.4byte	0x1300a
+	.4byte	0x13034
 	.uleb128 0x6f
-	.4byte	0x12fff
+	.4byte	0x13029
 	.4byte	.LLST26
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0x160
 	.uleb128 0x5f
-	.4byte	0x13015
+	.4byte	0x1303f
 	.4byte	.LLST27
 	.uleb128 0x5f
-	.4byte	0x13020
+	.4byte	0x1304a
 	.4byte	.LLST28
 	.uleb128 0x70
-	.4byte	0x13443
+	.4byte	0x1346d
 	.8byte	.LBB972
 	.8byte	.LBE972-.LBB972
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10709
+	.4byte	0x10715
 	.uleb128 0x5e
 	.8byte	.LBB973
 	.8byte	.LBE973-.LBB973
 	.uleb128 0x5f
-	.4byte	0x13453
+	.4byte	0x1347d
 	.4byte	.LLST29
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB974
 	.8byte	.LBE974-.LBB974
-	.4byte	0x1075d
+	.4byte	0x10769
 	.uleb128 0x5c
-	.4byte	0x1302c
+	.4byte	0x13056
 	.uleb128 0x59
-	.4byte	0x134c7
+	.4byte	0x134f1
 	.8byte	.LBB975
 	.8byte	.LBE975-.LBB975
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x134e2
+	.4byte	0x1350c
 	.uleb128 0x54
-	.4byte	0x134d7
+	.4byte	0x13501
 	.uleb128 0x5e
 	.8byte	.LBB976
 	.8byte	.LBE976-.LBB976
 	.uleb128 0x5c
-	.4byte	0x134ed
+	.4byte	0x13517
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13417
+	.4byte	0x13441
 	.8byte	.LBB977
 	.8byte	.LBE977-.LBB977
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13431
+	.4byte	0x1345b
 	.uleb128 0x54
-	.4byte	0x13427
+	.4byte	0x13451
 	.uleb128 0x59
-	.4byte	0x134f9
+	.4byte	0x13523
 	.8byte	.LBB978
 	.8byte	.LBE978-.LBB978
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x13513
+	.4byte	0x1353d
 	.uleb128 0x54
-	.4byte	0x13509
+	.4byte	0x13533
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12fbb
+	.4byte	0x12fe5
 	.8byte	.LBB982
 	.8byte	.LBE982-.LBB982
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x1085e
+	.4byte	0x1086a
 	.uleb128 0x54
-	.4byte	0x12fcb
+	.4byte	0x12ff5
 	.uleb128 0x5e
 	.8byte	.LBB983
 	.8byte	.LBE983-.LBB983
 	.uleb128 0x5f
-	.4byte	0x12fd6
+	.4byte	0x13000
 	.4byte	.LLST30
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x1a0
-	.4byte	0x10829
+	.4byte	0x10835
 	.uleb128 0x5f
-	.4byte	0x12fe2
+	.4byte	0x1300c
 	.4byte	.LLST31
 	.uleb128 0x59
-	.4byte	0x134c7
+	.4byte	0x134f1
 	.8byte	.LBB985
 	.8byte	.LBE985-.LBB985
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x134e2
+	.4byte	0x1350c
 	.uleb128 0x54
-	.4byte	0x134d7
+	.4byte	0x13501
 	.uleb128 0x5e
 	.8byte	.LBB986
 	.8byte	.LBE986-.LBB986
 	.uleb128 0x5c
-	.4byte	0x134ed
+	.4byte	0x13517
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13443
+	.4byte	0x1346d
 	.8byte	.LBB987
 	.8byte	.LBE987-.LBB987
 	.byte	0x6
@@ -39448,7 +39513,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB988
 	.8byte	.LBE988-.LBB988
 	.uleb128 0x5f
-	.4byte	0x13453
+	.4byte	0x1347d
 	.4byte	.LLST32
 	.byte	0
 	.byte	0
@@ -39456,163 +39521,163 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL84
-	.4byte	0x13dcb
+	.4byte	0x13df5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12f23
+	.4byte	0x12f4d
 	.8byte	.LBB1002
 	.4byte	.Ldebug_ranges0+0x220
 	.byte	0x1
-	.2byte	0x50c
-	.4byte	0x10a99
+	.2byte	0x511
+	.4byte	0x10aa5
 	.uleb128 0x54
-	.4byte	0x12f48
+	.4byte	0x12f72
 	.uleb128 0x54
-	.4byte	0x12f3d
+	.4byte	0x12f67
 	.uleb128 0x54
-	.4byte	0x12f33
+	.4byte	0x12f5d
 	.uleb128 0x6d
-	.4byte	0x12f81
+	.4byte	0x12fab
 	.8byte	.LBB1003
 	.4byte	.Ldebug_ranges0+0x220
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x12fa6
+	.4byte	0x12fd0
 	.uleb128 0x54
-	.4byte	0x12f9b
+	.4byte	0x12fc5
 	.uleb128 0x54
-	.4byte	0x12f91
+	.4byte	0x12fbb
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0x220
 	.uleb128 0x5c
-	.4byte	0x12faf
+	.4byte	0x12fd9
 	.uleb128 0x6e
-	.4byte	0x12fef
+	.4byte	0x13019
 	.8byte	.LBB1005
 	.4byte	.Ldebug_ranges0+0x260
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x109ce
+	.4byte	0x109da
 	.uleb128 0x54
-	.4byte	0x1300a
+	.4byte	0x13034
 	.uleb128 0x6f
-	.4byte	0x12fff
+	.4byte	0x13029
 	.4byte	.LLST34
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0x260
 	.uleb128 0x5f
-	.4byte	0x13015
+	.4byte	0x1303f
 	.4byte	.LLST35
 	.uleb128 0x5f
-	.4byte	0x13020
+	.4byte	0x1304a
 	.4byte	.LLST36
 	.uleb128 0x70
-	.4byte	0x13443
+	.4byte	0x1346d
 	.8byte	.LBB1007
 	.8byte	.LBE1007-.LBB1007
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10934
+	.4byte	0x10940
 	.uleb128 0x5e
 	.8byte	.LBB1008
 	.8byte	.LBE1008-.LBB1008
 	.uleb128 0x5f
-	.4byte	0x13453
+	.4byte	0x1347d
 	.4byte	.LLST37
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1009
 	.8byte	.LBE1009-.LBB1009
-	.4byte	0x10988
+	.4byte	0x10994
 	.uleb128 0x5c
-	.4byte	0x1302c
+	.4byte	0x13056
 	.uleb128 0x59
-	.4byte	0x134c7
+	.4byte	0x134f1
 	.8byte	.LBB1010
 	.8byte	.LBE1010-.LBB1010
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x134e2
+	.4byte	0x1350c
 	.uleb128 0x54
-	.4byte	0x134d7
+	.4byte	0x13501
 	.uleb128 0x5e
 	.8byte	.LBB1011
 	.8byte	.LBE1011-.LBB1011
 	.uleb128 0x5c
-	.4byte	0x134ed
+	.4byte	0x13517
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13417
+	.4byte	0x13441
 	.8byte	.LBB1012
 	.8byte	.LBE1012-.LBB1012
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13431
+	.4byte	0x1345b
 	.uleb128 0x54
-	.4byte	0x13427
+	.4byte	0x13451
 	.uleb128 0x59
-	.4byte	0x134f9
+	.4byte	0x13523
 	.8byte	.LBB1013
 	.8byte	.LBE1013-.LBB1013
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x13513
+	.4byte	0x1353d
 	.uleb128 0x54
-	.4byte	0x13509
+	.4byte	0x13533
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12fbb
+	.4byte	0x12fe5
 	.8byte	.LBB1017
 	.8byte	.LBE1017-.LBB1017
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10a89
+	.4byte	0x10a95
 	.uleb128 0x54
-	.4byte	0x12fcb
+	.4byte	0x12ff5
 	.uleb128 0x5e
 	.8byte	.LBB1018
 	.8byte	.LBE1018-.LBB1018
 	.uleb128 0x5f
-	.4byte	0x12fd6
+	.4byte	0x13000
 	.4byte	.LLST38
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x2a0
-	.4byte	0x10a54
+	.4byte	0x10a60
 	.uleb128 0x5f
-	.4byte	0x12fe2
+	.4byte	0x1300c
 	.4byte	.LLST39
 	.uleb128 0x59
-	.4byte	0x134c7
+	.4byte	0x134f1
 	.8byte	.LBB1020
 	.8byte	.LBE1020-.LBB1020
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x134e2
+	.4byte	0x1350c
 	.uleb128 0x54
-	.4byte	0x134d7
+	.4byte	0x13501
 	.uleb128 0x5e
 	.8byte	.LBB1021
 	.8byte	.LBE1021-.LBB1021
 	.uleb128 0x5c
-	.4byte	0x134ed
+	.4byte	0x13517
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13443
+	.4byte	0x1346d
 	.8byte	.LBB1022
 	.8byte	.LBE1022-.LBB1022
 	.byte	0x6
@@ -39621,7 +39686,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1023
 	.8byte	.LBE1023-.LBB1023
 	.uleb128 0x5f
-	.4byte	0x13453
+	.4byte	0x1347d
 	.4byte	.LLST40
 	.byte	0
 	.byte	0
@@ -39629,159 +39694,159 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL108
-	.4byte	0x13dcb
+	.4byte	0x13df5
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12ef4
+	.4byte	0x12f1e
 	.8byte	.LBB1032
 	.4byte	.Ldebug_ranges0+0x2d0
 	.byte	0x1
-	.2byte	0x4da
-	.4byte	0x10cb9
+	.2byte	0x4df
+	.4byte	0x10cc5
 	.uleb128 0x54
-	.4byte	0x12f19
+	.4byte	0x12f43
 	.uleb128 0x54
-	.4byte	0x12f0e
+	.4byte	0x12f38
 	.uleb128 0x54
-	.4byte	0x12f04
+	.4byte	0x12f2e
 	.uleb128 0x6d
-	.4byte	0x12f52
+	.4byte	0x12f7c
 	.8byte	.LBB1033
 	.4byte	.Ldebug_ranges0+0x2d0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12f77
+	.4byte	0x12fa1
 	.uleb128 0x54
-	.4byte	0x12f6c
+	.4byte	0x12f96
 	.uleb128 0x54
-	.4byte	0x12f62
+	.4byte	0x12f8c
 	.uleb128 0x6e
-	.4byte	0x12fef
+	.4byte	0x13019
 	.8byte	.LBB1035
 	.4byte	.Ldebug_ranges0+0x320
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x10bef
+	.4byte	0x10bfb
 	.uleb128 0x54
-	.4byte	0x1300a
+	.4byte	0x13034
 	.uleb128 0x6f
-	.4byte	0x12fff
+	.4byte	0x13029
 	.4byte	.LLST41
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0x320
 	.uleb128 0x5f
-	.4byte	0x13015
+	.4byte	0x1303f
 	.4byte	.LLST42
 	.uleb128 0x5f
-	.4byte	0x13020
+	.4byte	0x1304a
 	.4byte	.LLST43
 	.uleb128 0x70
-	.4byte	0x13443
+	.4byte	0x1346d
 	.8byte	.LBB1037
 	.8byte	.LBE1037-.LBB1037
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10b55
+	.4byte	0x10b61
 	.uleb128 0x5e
 	.8byte	.LBB1038
 	.8byte	.LBE1038-.LBB1038
 	.uleb128 0x5f
-	.4byte	0x13453
+	.4byte	0x1347d
 	.4byte	.LLST44
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1039
 	.8byte	.LBE1039-.LBB1039
-	.4byte	0x10ba9
+	.4byte	0x10bb5
 	.uleb128 0x5c
-	.4byte	0x1302c
+	.4byte	0x13056
 	.uleb128 0x59
-	.4byte	0x134c7
+	.4byte	0x134f1
 	.8byte	.LBB1040
 	.8byte	.LBE1040-.LBB1040
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x134e2
+	.4byte	0x1350c
 	.uleb128 0x54
-	.4byte	0x134d7
+	.4byte	0x13501
 	.uleb128 0x5e
 	.8byte	.LBB1041
 	.8byte	.LBE1041-.LBB1041
 	.uleb128 0x5c
-	.4byte	0x134ed
+	.4byte	0x13517
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13417
+	.4byte	0x13441
 	.8byte	.LBB1042
 	.8byte	.LBE1042-.LBB1042
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13431
+	.4byte	0x1345b
 	.uleb128 0x54
-	.4byte	0x13427
+	.4byte	0x13451
 	.uleb128 0x59
-	.4byte	0x134f9
+	.4byte	0x13523
 	.8byte	.LBB1043
 	.8byte	.LBE1043-.LBB1043
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x13513
+	.4byte	0x1353d
 	.uleb128 0x54
-	.4byte	0x13509
+	.4byte	0x13533
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12fbb
+	.4byte	0x12fe5
 	.8byte	.LBB1049
 	.8byte	.LBE1049-.LBB1049
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x10caa
+	.4byte	0x10cb6
 	.uleb128 0x54
-	.4byte	0x12fcb
+	.4byte	0x12ff5
 	.uleb128 0x5e
 	.8byte	.LBB1050
 	.8byte	.LBE1050-.LBB1050
 	.uleb128 0x5f
-	.4byte	0x12fd6
+	.4byte	0x13000
 	.4byte	.LLST45
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x370
-	.4byte	0x10c75
+	.4byte	0x10c81
 	.uleb128 0x5f
-	.4byte	0x12fe2
+	.4byte	0x1300c
 	.4byte	.LLST46
 	.uleb128 0x59
-	.4byte	0x134c7
+	.4byte	0x134f1
 	.8byte	.LBB1052
 	.8byte	.LBE1052-.LBB1052
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x134e2
+	.4byte	0x1350c
 	.uleb128 0x54
-	.4byte	0x134d7
+	.4byte	0x13501
 	.uleb128 0x5e
 	.8byte	.LBB1053
 	.8byte	.LBE1053-.LBB1053
 	.uleb128 0x5c
-	.4byte	0x134ed
+	.4byte	0x13517
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13443
+	.4byte	0x1346d
 	.8byte	.LBB1054
 	.8byte	.LBE1054-.LBB1054
 	.byte	0x6
@@ -39790,7 +39855,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1055
 	.8byte	.LBE1055-.LBB1055
 	.uleb128 0x5f
-	.4byte	0x13453
+	.4byte	0x1347d
 	.4byte	.LLST47
 	.byte	0
 	.byte	0
@@ -39798,163 +39863,163 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL135
-	.4byte	0x13dbe
+	.4byte	0x13de8
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12f23
+	.4byte	0x12f4d
 	.8byte	.LBB1066
 	.4byte	.Ldebug_ranges0+0x3a0
 	.byte	0x1
-	.2byte	0x529
-	.4byte	0x10ef5
+	.2byte	0x52e
+	.4byte	0x10f01
 	.uleb128 0x54
-	.4byte	0x12f48
+	.4byte	0x12f72
 	.uleb128 0x54
-	.4byte	0x12f3d
+	.4byte	0x12f67
 	.uleb128 0x54
-	.4byte	0x12f33
+	.4byte	0x12f5d
 	.uleb128 0x6d
-	.4byte	0x12f81
+	.4byte	0x12fab
 	.8byte	.LBB1067
 	.4byte	.Ldebug_ranges0+0x3a0
 	.byte	0x9
 	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x12fa6
+	.4byte	0x12fd0
 	.uleb128 0x54
-	.4byte	0x12f9b
+	.4byte	0x12fc5
 	.uleb128 0x54
-	.4byte	0x12f91
+	.4byte	0x12fbb
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0x3a0
 	.uleb128 0x5f
-	.4byte	0x12faf
+	.4byte	0x12fd9
 	.4byte	.LLST48
 	.uleb128 0x6e
-	.4byte	0x12fef
+	.4byte	0x13019
 	.8byte	.LBB1069
 	.4byte	.Ldebug_ranges0+0x400
 	.byte	0x9
 	.byte	0x72
-	.4byte	0x10e1d
+	.4byte	0x10e29
 	.uleb128 0x54
-	.4byte	0x1300a
+	.4byte	0x13034
 	.uleb128 0x6f
-	.4byte	0x12fff
+	.4byte	0x13029
 	.4byte	.LLST49
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0x400
 	.uleb128 0x5f
-	.4byte	0x13015
+	.4byte	0x1303f
 	.4byte	.LLST50
 	.uleb128 0x5f
-	.4byte	0x13020
+	.4byte	0x1304a
 	.4byte	.LLST51
 	.uleb128 0x70
-	.4byte	0x13443
+	.4byte	0x1346d
 	.8byte	.LBB1071
 	.8byte	.LBE1071-.LBB1071
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10d83
+	.4byte	0x10d8f
 	.uleb128 0x5e
 	.8byte	.LBB1072
 	.8byte	.LBE1072-.LBB1072
 	.uleb128 0x5f
-	.4byte	0x13453
+	.4byte	0x1347d
 	.4byte	.LLST52
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1073
 	.8byte	.LBE1073-.LBB1073
-	.4byte	0x10dd7
+	.4byte	0x10de3
 	.uleb128 0x5c
-	.4byte	0x1302c
+	.4byte	0x13056
 	.uleb128 0x59
-	.4byte	0x134c7
+	.4byte	0x134f1
 	.8byte	.LBB1074
 	.8byte	.LBE1074-.LBB1074
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x134e2
+	.4byte	0x1350c
 	.uleb128 0x54
-	.4byte	0x134d7
+	.4byte	0x13501
 	.uleb128 0x5e
 	.8byte	.LBB1075
 	.8byte	.LBE1075-.LBB1075
 	.uleb128 0x5c
-	.4byte	0x134ed
+	.4byte	0x13517
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13417
+	.4byte	0x13441
 	.8byte	.LBB1076
 	.8byte	.LBE1076-.LBB1076
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13431
+	.4byte	0x1345b
 	.uleb128 0x54
-	.4byte	0x13427
+	.4byte	0x13451
 	.uleb128 0x59
-	.4byte	0x134f9
+	.4byte	0x13523
 	.8byte	.LBB1077
 	.8byte	.LBE1077-.LBB1077
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x13513
+	.4byte	0x1353d
 	.uleb128 0x54
-	.4byte	0x13509
+	.4byte	0x13533
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12fbb
+	.4byte	0x12fe5
 	.8byte	.LBB1083
 	.8byte	.LBE1083-.LBB1083
 	.byte	0x9
 	.byte	0x74
-	.4byte	0x10ed8
+	.4byte	0x10ee4
 	.uleb128 0x54
-	.4byte	0x12fcb
+	.4byte	0x12ff5
 	.uleb128 0x5e
 	.8byte	.LBB1084
 	.8byte	.LBE1084-.LBB1084
 	.uleb128 0x5f
-	.4byte	0x12fd6
+	.4byte	0x13000
 	.4byte	.LLST53
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x450
-	.4byte	0x10ea3
+	.4byte	0x10eaf
 	.uleb128 0x5f
-	.4byte	0x12fe2
+	.4byte	0x1300c
 	.4byte	.LLST54
 	.uleb128 0x59
-	.4byte	0x134c7
+	.4byte	0x134f1
 	.8byte	.LBB1086
 	.8byte	.LBE1086-.LBB1086
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x134e2
+	.4byte	0x1350c
 	.uleb128 0x54
-	.4byte	0x134d7
+	.4byte	0x13501
 	.uleb128 0x5e
 	.8byte	.LBB1087
 	.8byte	.LBE1087-.LBB1087
 	.uleb128 0x5c
-	.4byte	0x134ed
+	.4byte	0x13517
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13443
+	.4byte	0x1346d
 	.8byte	.LBB1088
 	.8byte	.LBE1088-.LBB1088
 	.byte	0x6
@@ -39963,7 +40028,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1089
 	.8byte	.LBE1089-.LBB1089
 	.uleb128 0x5f
-	.4byte	0x13453
+	.4byte	0x1347d
 	.4byte	.LLST55
 	.byte	0
 	.byte	0
@@ -39971,59 +40036,59 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL147
-	.4byte	0x13dcb
+	.4byte	0x13df5
 	.uleb128 0x4e
 	.8byte	.LVL225
-	.4byte	0x13c14
+	.4byte	0x13c3e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12ef4
+	.4byte	0x12f1e
 	.8byte	.LBB1102
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x1
-	.2byte	0x546
-	.4byte	0x10fa7
+	.2byte	0x54b
+	.4byte	0x10fb3
 	.uleb128 0x54
-	.4byte	0x12f19
+	.4byte	0x12f43
 	.uleb128 0x54
-	.4byte	0x12f0e
+	.4byte	0x12f38
 	.uleb128 0x54
-	.4byte	0x12f04
+	.4byte	0x12f2e
 	.uleb128 0x6d
-	.4byte	0x12f52
+	.4byte	0x12f7c
 	.8byte	.LBB1103
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12f77
+	.4byte	0x12fa1
 	.uleb128 0x54
-	.4byte	0x12f6c
+	.4byte	0x12f96
 	.uleb128 0x54
-	.4byte	0x12f62
+	.4byte	0x12f8c
 	.uleb128 0x6d
-	.4byte	0x12fef
+	.4byte	0x13019
 	.8byte	.LBB1105
 	.4byte	.Ldebug_ranges0+0x4b0
 	.byte	0x9
 	.byte	0x84
 	.uleb128 0x54
-	.4byte	0x1300a
+	.4byte	0x13034
 	.uleb128 0x71
-	.4byte	0x12fff
+	.4byte	0x13029
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0x4e0
 	.uleb128 0x5c
-	.4byte	0x13015
+	.4byte	0x1303f
 	.uleb128 0x5f
-	.4byte	0x13020
+	.4byte	0x1304a
 	.4byte	.LLST56
 	.uleb128 0x59
-	.4byte	0x13443
+	.4byte	0x1346d
 	.8byte	.LBB1107
 	.8byte	.LBE1107-.LBB1107
 	.byte	0x6
@@ -40032,7 +40097,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1108
 	.8byte	.LBE1108-.LBB1108
 	.uleb128 0x5f
-	.4byte	0x13453
+	.4byte	0x1347d
 	.4byte	.LLST57
 	.byte	0
 	.byte	0
@@ -40041,154 +40106,154 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12ef4
+	.4byte	0x12f1e
 	.8byte	.LBB1114
 	.4byte	.Ldebug_ranges0+0x510
 	.byte	0x1
-	.2byte	0x536
-	.4byte	0x111c7
+	.2byte	0x53b
+	.4byte	0x111d3
 	.uleb128 0x54
-	.4byte	0x12f19
+	.4byte	0x12f43
 	.uleb128 0x54
-	.4byte	0x12f0e
+	.4byte	0x12f38
 	.uleb128 0x54
-	.4byte	0x12f04
+	.4byte	0x12f2e
 	.uleb128 0x6d
-	.4byte	0x12f52
+	.4byte	0x12f7c
 	.8byte	.LBB1115
 	.4byte	.Ldebug_ranges0+0x510
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12f77
+	.4byte	0x12fa1
 	.uleb128 0x54
-	.4byte	0x12f6c
+	.4byte	0x12f96
 	.uleb128 0x54
-	.4byte	0x12f62
+	.4byte	0x12f8c
 	.uleb128 0x6e
-	.4byte	0x12fef
+	.4byte	0x13019
 	.8byte	.LBB1117
 	.4byte	.Ldebug_ranges0+0x570
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x110fd
+	.4byte	0x11109
 	.uleb128 0x54
-	.4byte	0x1300a
+	.4byte	0x13034
 	.uleb128 0x6f
-	.4byte	0x12fff
+	.4byte	0x13029
 	.4byte	.LLST58
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0x570
 	.uleb128 0x5f
-	.4byte	0x13015
+	.4byte	0x1303f
 	.4byte	.LLST59
 	.uleb128 0x5f
-	.4byte	0x13020
+	.4byte	0x1304a
 	.4byte	.LLST60
 	.uleb128 0x70
-	.4byte	0x13443
+	.4byte	0x1346d
 	.8byte	.LBB1119
 	.8byte	.LBE1119-.LBB1119
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x11063
+	.4byte	0x1106f
 	.uleb128 0x5e
 	.8byte	.LBB1120
 	.8byte	.LBE1120-.LBB1120
 	.uleb128 0x5f
-	.4byte	0x13453
+	.4byte	0x1347d
 	.4byte	.LLST61
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1121
 	.8byte	.LBE1121-.LBB1121
-	.4byte	0x110b7
+	.4byte	0x110c3
 	.uleb128 0x5c
-	.4byte	0x1302c
+	.4byte	0x13056
 	.uleb128 0x59
-	.4byte	0x134c7
+	.4byte	0x134f1
 	.8byte	.LBB1122
 	.8byte	.LBE1122-.LBB1122
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x134e2
+	.4byte	0x1350c
 	.uleb128 0x54
-	.4byte	0x134d7
+	.4byte	0x13501
 	.uleb128 0x5e
 	.8byte	.LBB1123
 	.8byte	.LBE1123-.LBB1123
 	.uleb128 0x5c
-	.4byte	0x134ed
+	.4byte	0x13517
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13417
+	.4byte	0x13441
 	.8byte	.LBB1124
 	.8byte	.LBE1124-.LBB1124
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13431
+	.4byte	0x1345b
 	.uleb128 0x54
-	.4byte	0x13427
+	.4byte	0x13451
 	.uleb128 0x59
-	.4byte	0x134f9
+	.4byte	0x13523
 	.8byte	.LBB1125
 	.8byte	.LBE1125-.LBB1125
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x13513
+	.4byte	0x1353d
 	.uleb128 0x54
-	.4byte	0x13509
+	.4byte	0x13533
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12fbb
+	.4byte	0x12fe5
 	.8byte	.LBB1133
 	.8byte	.LBE1133-.LBB1133
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x111b8
+	.4byte	0x111c4
 	.uleb128 0x54
-	.4byte	0x12fcb
+	.4byte	0x12ff5
 	.uleb128 0x5e
 	.8byte	.LBB1134
 	.8byte	.LBE1134-.LBB1134
 	.uleb128 0x5f
-	.4byte	0x12fd6
+	.4byte	0x13000
 	.4byte	.LLST62
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x5c0
-	.4byte	0x11183
+	.4byte	0x1118f
 	.uleb128 0x5f
-	.4byte	0x12fe2
+	.4byte	0x1300c
 	.4byte	.LLST63
 	.uleb128 0x59
-	.4byte	0x134c7
+	.4byte	0x134f1
 	.8byte	.LBB1136
 	.8byte	.LBE1136-.LBB1136
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x134e2
+	.4byte	0x1350c
 	.uleb128 0x54
-	.4byte	0x134d7
+	.4byte	0x13501
 	.uleb128 0x5e
 	.8byte	.LBB1137
 	.8byte	.LBE1137-.LBB1137
 	.uleb128 0x5c
-	.4byte	0x134ed
+	.4byte	0x13517
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13443
+	.4byte	0x1346d
 	.8byte	.LBB1138
 	.8byte	.LBE1138-.LBB1138
 	.byte	0x6
@@ -40197,7 +40262,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1139
 	.8byte	.LBE1139-.LBB1139
 	.uleb128 0x5f
-	.4byte	0x13453
+	.4byte	0x1347d
 	.4byte	.LLST64
 	.byte	0
 	.byte	0
@@ -40205,158 +40270,158 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL208
-	.4byte	0x13dbe
+	.4byte	0x13de8
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12ef4
+	.4byte	0x12f1e
 	.8byte	.LBB1150
 	.4byte	.Ldebug_ranges0+0x5f0
 	.byte	0x1
-	.2byte	0x4e8
-	.4byte	0x113e7
+	.2byte	0x4ed
+	.4byte	0x113f3
 	.uleb128 0x54
-	.4byte	0x12f19
+	.4byte	0x12f43
 	.uleb128 0x54
-	.4byte	0x12f0e
+	.4byte	0x12f38
 	.uleb128 0x54
-	.4byte	0x12f04
+	.4byte	0x12f2e
 	.uleb128 0x6d
-	.4byte	0x12f52
+	.4byte	0x12f7c
 	.8byte	.LBB1151
 	.4byte	.Ldebug_ranges0+0x5f0
 	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12f77
+	.4byte	0x12fa1
 	.uleb128 0x54
-	.4byte	0x12f6c
+	.4byte	0x12f96
 	.uleb128 0x54
-	.4byte	0x12f62
+	.4byte	0x12f8c
 	.uleb128 0x6e
-	.4byte	0x12fef
+	.4byte	0x13019
 	.8byte	.LBB1153
 	.4byte	.Ldebug_ranges0+0x650
 	.byte	0x9
 	.byte	0x84
-	.4byte	0x1131d
+	.4byte	0x11329
 	.uleb128 0x54
-	.4byte	0x1300a
+	.4byte	0x13034
 	.uleb128 0x6f
-	.4byte	0x12fff
+	.4byte	0x13029
 	.4byte	.LLST65
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0x650
 	.uleb128 0x5f
-	.4byte	0x13015
+	.4byte	0x1303f
 	.4byte	.LLST66
 	.uleb128 0x5f
-	.4byte	0x13020
+	.4byte	0x1304a
 	.4byte	.LLST67
 	.uleb128 0x70
-	.4byte	0x13443
+	.4byte	0x1346d
 	.8byte	.LBB1155
 	.8byte	.LBE1155-.LBB1155
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x11283
+	.4byte	0x1128f
 	.uleb128 0x5e
 	.8byte	.LBB1156
 	.8byte	.LBE1156-.LBB1156
 	.uleb128 0x5f
-	.4byte	0x13453
+	.4byte	0x1347d
 	.4byte	.LLST68
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1157
 	.8byte	.LBE1157-.LBB1157
-	.4byte	0x112d7
+	.4byte	0x112e3
 	.uleb128 0x5c
-	.4byte	0x1302c
+	.4byte	0x13056
 	.uleb128 0x59
-	.4byte	0x134c7
+	.4byte	0x134f1
 	.8byte	.LBB1158
 	.8byte	.LBE1158-.LBB1158
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x134e2
+	.4byte	0x1350c
 	.uleb128 0x54
-	.4byte	0x134d7
+	.4byte	0x13501
 	.uleb128 0x5e
 	.8byte	.LBB1159
 	.8byte	.LBE1159-.LBB1159
 	.uleb128 0x5c
-	.4byte	0x134ed
+	.4byte	0x13517
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13417
+	.4byte	0x13441
 	.8byte	.LBB1160
 	.8byte	.LBE1160-.LBB1160
 	.byte	0x6
 	.byte	0x55
 	.uleb128 0x54
-	.4byte	0x13431
+	.4byte	0x1345b
 	.uleb128 0x54
-	.4byte	0x13427
+	.4byte	0x13451
 	.uleb128 0x59
-	.4byte	0x134f9
+	.4byte	0x13523
 	.8byte	.LBB1161
 	.8byte	.LBE1161-.LBB1161
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x13513
+	.4byte	0x1353d
 	.uleb128 0x54
-	.4byte	0x13509
+	.4byte	0x13533
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12fbb
+	.4byte	0x12fe5
 	.8byte	.LBB1169
 	.8byte	.LBE1169-.LBB1169
 	.byte	0x9
 	.byte	0x86
-	.4byte	0x113d8
+	.4byte	0x113e4
 	.uleb128 0x54
-	.4byte	0x12fcb
+	.4byte	0x12ff5
 	.uleb128 0x5e
 	.8byte	.LBB1170
 	.8byte	.LBE1170-.LBB1170
 	.uleb128 0x5f
-	.4byte	0x12fd6
+	.4byte	0x13000
 	.4byte	.LLST69
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x6a0
-	.4byte	0x113a3
+	.4byte	0x113af
 	.uleb128 0x5f
-	.4byte	0x12fe2
+	.4byte	0x1300c
 	.4byte	.LLST70
 	.uleb128 0x59
-	.4byte	0x134c7
+	.4byte	0x134f1
 	.8byte	.LBB1172
 	.8byte	.LBE1172-.LBB1172
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x134e2
+	.4byte	0x1350c
 	.uleb128 0x54
-	.4byte	0x134d7
+	.4byte	0x13501
 	.uleb128 0x5e
 	.8byte	.LBB1173
 	.8byte	.LBE1173-.LBB1173
 	.uleb128 0x5c
-	.4byte	0x134ed
+	.4byte	0x13517
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13443
+	.4byte	0x1346d
 	.8byte	.LBB1174
 	.8byte	.LBE1174-.LBB1174
 	.byte	0x6
@@ -40365,7 +40430,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1175
 	.8byte	.LBE1175-.LBB1175
 	.uleb128 0x5f
-	.4byte	0x13453
+	.4byte	0x1347d
 	.4byte	.LLST71
 	.byte	0
 	.byte	0
@@ -40373,1945 +40438,1953 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL216
-	.4byte	0x13dbe
+	.4byte	0x13de8
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL49
-	.4byte	0x13c99
+	.4byte	0x13cc3
 	.uleb128 0x4e
 	.8byte	.LVL50
-	.4byte	0x13cd7
+	.4byte	0x13d01
 	.uleb128 0x4e
 	.8byte	.LVL51
-	.4byte	0x13d73
+	.4byte	0x13d9d
 	.uleb128 0x4e
 	.8byte	.LVL62
-	.4byte	0x13dd8
+	.4byte	0x13e02
 	.uleb128 0x4e
 	.8byte	.LVL65
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL68
-	.4byte	0x13bb0
+	.4byte	0x13bda
 	.uleb128 0x4e
 	.8byte	.LVL85
-	.4byte	0x13d73
+	.4byte	0x13d9d
 	.uleb128 0x4e
 	.8byte	.LVL86
-	.4byte	0x13de4
+	.4byte	0x13e0e
 	.uleb128 0x4e
 	.8byte	.LVL88
-	.4byte	0x13ca5
+	.4byte	0x13ccf
 	.uleb128 0x4e
 	.8byte	.LVL95
-	.4byte	0x13c99
+	.4byte	0x13cc3
 	.uleb128 0x4e
 	.8byte	.LVL109
-	.4byte	0x13df0
+	.4byte	0x13e1a
 	.uleb128 0x4e
 	.8byte	.LVL110
-	.4byte	0x13ca5
+	.4byte	0x13ccf
 	.uleb128 0x4e
 	.8byte	.LVL111
-	.4byte	0x13cf9
+	.4byte	0x13d23
 	.uleb128 0x4e
 	.8byte	.LVL121
-	.4byte	0x13dfc
+	.4byte	0x13e26
 	.uleb128 0x4e
 	.8byte	.LVL122
-	.4byte	0x13d73
+	.4byte	0x13d9d
 	.uleb128 0x4e
 	.8byte	.LVL149
-	.4byte	0x13bb0
+	.4byte	0x13bda
 	.uleb128 0x4e
 	.8byte	.LVL152
-	.4byte	0x13bb0
+	.4byte	0x13bda
 	.uleb128 0x4e
 	.8byte	.LVL154
-	.4byte	0x13c99
+	.4byte	0x13cc3
 	.uleb128 0x4e
 	.8byte	.LVL156
-	.4byte	0x13c99
+	.4byte	0x13cc3
 	.uleb128 0x4e
 	.8byte	.LVL157
-	.4byte	0x13cd7
+	.4byte	0x13d01
 	.uleb128 0x4e
 	.8byte	.LVL158
-	.4byte	0x13d73
+	.4byte	0x13d9d
 	.uleb128 0x4e
 	.8byte	.LVL171
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL174
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL176
-	.4byte	0x13c99
+	.4byte	0x13cc3
 	.uleb128 0x4e
 	.8byte	.LVL177
-	.4byte	0x13d73
+	.4byte	0x13d9d
 	.uleb128 0x4e
 	.8byte	.LVL185
-	.4byte	0x13dd8
+	.4byte	0x13e02
 	.uleb128 0x4e
 	.8byte	.LVL219
-	.4byte	0x13cf9
+	.4byte	0x13d23
 	.uleb128 0x4e
 	.8byte	.LVL226
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL227
-	.4byte	0x13d37
+	.4byte	0x13d61
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0x11571
+	.4byte	0x1157d
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xa
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x11561
+	.4byte	0x1156d
 	.uleb128 0x62
-	.4byte	.LASF3061
+	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x46f
+	.2byte	0x474
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x115a0
+	.4byte	0x115ac
 	.uleb128 0x64
-	.4byte	.LASF2994
+	.4byte	.LASF2996
 	.byte	0x1
-	.2byte	0x46f
-	.4byte	0xe117
+	.2byte	0x474
+	.4byte	0xe123
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x471
+	.2byte	0x476
 	.4byte	0xa545
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3063
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x469
+	.2byte	0x46e
 	.8byte	.LFB2822
 	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x115da
+	.4byte	0x115e6
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x469
+	.2byte	0x46e
 	.4byte	0x31a7
 	.4byte	.LLST72
 	.uleb128 0x4e
 	.8byte	.LVL240
-	.4byte	0x12087
+	.4byte	0x120b5
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3064
+	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x45d
+	.2byte	0x462
 	.8byte	.LFB2821
 	.8byte	.LFE2821-.LFB2821
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1163a
+	.4byte	0x11646
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x45d
+	.2byte	0x462
 	.4byte	0x31a7
 	.4byte	.LLST12
 	.uleb128 0x46
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x45f
-	.4byte	0xe6fb
+	.2byte	0x464
+	.4byte	0xe707
 	.uleb128 0x5d
-	.4byte	0x12e86
+	.4byte	0x12eb0
 	.8byte	.LBB930
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x463
+	.2byte	0x468
 	.uleb128 0x54
-	.4byte	0x12e92
+	.4byte	0x12ebc
 	.uleb128 0x4e
 	.8byte	.LVL39
-	.4byte	0x13e08
+	.4byte	0x13e32
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3065
+	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x44d
+	.2byte	0x452
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11664
+	.4byte	0x11670
 	.uleb128 0x64
-	.4byte	.LASF2994
+	.4byte	.LASF2996
 	.byte	0x1
-	.2byte	0x44d
-	.4byte	0xe117
+	.2byte	0x452
+	.4byte	0xe123
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x44f
-	.4byte	0xe3fc
+	.2byte	0x454
+	.4byte	0xe408
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3066
+	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x319
+	.2byte	0x317
 	.4byte	0xc6
 	.8byte	.LFB2819
 	.8byte	.LFE2819-.LFB2819
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11e96
+	.4byte	0x11ec4
 	.uleb128 0x51
 	.string	"ptr"
 	.byte	0x1
-	.2byte	0x319
+	.2byte	0x317
 	.4byte	0x443
 	.4byte	.LLST154
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x31b
-	.4byte	0xe461
+	.2byte	0x319
+	.4byte	0xe46d
 	.4byte	.LLST155
 	.uleb128 0x46
-	.4byte	.LASF2994
+	.4byte	.LASF2996
 	.byte	0x1
-	.2byte	0x31c
-	.4byte	0xe117
+	.2byte	0x31a
+	.4byte	0xe123
 	.uleb128 0x46
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x31d
-	.4byte	0xe6fb
+	.2byte	0x31b
+	.4byte	0xe707
 	.uleb128 0x68
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x31e
-	.4byte	0xe3fc
+	.2byte	0x31c
+	.4byte	0xe408
 	.4byte	.LLST156
 	.uleb128 0x57
-	.4byte	.LASF3067
+	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0x31f
+	.2byte	0x31d
 	.4byte	0xc6
 	.4byte	.LLST157
 	.uleb128 0x57
-	.4byte	.LASF2963
+	.4byte	.LASF2965
 	.byte	0x1
-	.2byte	0x320
+	.2byte	0x31e
 	.4byte	0xc6
 	.4byte	.LLST158
 	.uleb128 0x4c
-	.4byte	.LASF3068
+	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0x321
+	.2byte	0x31f
 	.4byte	0xd8bb
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -72
 	.uleb128 0x57
-	.4byte	.LASF3069
+	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0x322
-	.4byte	0xe3fc
+	.2byte	0x320
+	.4byte	0xe408
 	.4byte	.LLST159
 	.uleb128 0x6b
-	.4byte	.LASF3071
+	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0x41d
-	.8byte	.L625
+	.2byte	0x422
+	.8byte	.L640
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x1040
-	.4byte	0x117c0
+	.4byte	0x117cc
 	.uleb128 0x46
-	.4byte	.LASF3058
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x360
+	.2byte	0x35f
 	.4byte	0xc6
 	.uleb128 0x5e
-	.8byte	.LBB1741
-	.8byte	.LBE1741-.LBB1741
+	.8byte	.LBB1740
+	.8byte	.LBE1740-.LBB1740
 	.uleb128 0x6b
-	.4byte	.LASF3070
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x360
-	.8byte	.L608
+	.2byte	0x35f
+	.8byte	.L621
 	.uleb128 0x4c
-	.4byte	.LASF3059
+	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x360
+	.2byte	0x35f
 	.4byte	0x14fd
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3058
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x360
+	.2byte	0x35f
 	.4byte	0x194
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x1070
-	.4byte	0x117a4
+	.4byte	0x117b0
 	.uleb128 0x57
-	.4byte	.LASF3060
+	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x360
+	.2byte	0x35f
 	.4byte	0x194
-	.4byte	.LLST172
+	.4byte	.LLST174
 	.uleb128 0x4e
-	.8byte	.LVL768
-	.4byte	0x13d8c
+	.8byte	.LVL777
+	.4byte	0x13db6
 	.uleb128 0x4e
-	.8byte	.LVL769
-	.4byte	0x13d98
+	.8byte	.LVL778
+	.4byte	0x13dc2
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL766
-	.4byte	0x13da5
+	.8byte	.LVL775
+	.4byte	0x13dcf
 	.uleb128 0x4e
-	.8byte	.LVL770
-	.4byte	0x13db1
+	.8byte	.LVL779
+	.4byte	0x13ddb
 	.byte	0
 	.byte	0
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xfd0
-	.4byte	0x11862
+	.4byte	.Ldebug_ranges0+0xf70
+	.4byte	0x1186e
 	.uleb128 0x46
-	.4byte	.LASF3058
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x40c
+	.2byte	0x411
 	.4byte	0xc6
 	.uleb128 0x5e
-	.8byte	.LBB1731
-	.8byte	.LBE1731-.LBB1731
+	.8byte	.LBB1723
+	.8byte	.LBE1723-.LBB1723
 	.uleb128 0x6b
-	.4byte	.LASF3070
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x40c
-	.8byte	.L652
+	.2byte	0x411
+	.8byte	.L668
 	.uleb128 0x4c
-	.4byte	.LASF3059
+	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x40c
+	.2byte	0x411
 	.4byte	0x14fd
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3058
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x40c
+	.2byte	0x411
 	.4byte	0x194
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x1000
-	.4byte	0x11846
+	.4byte	.Ldebug_ranges0+0xfa0
+	.4byte	0x11852
 	.uleb128 0x57
-	.4byte	.LASF3060
+	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x40c
+	.2byte	0x411
 	.4byte	0x194
-	.4byte	.LLST170
+	.4byte	.LLST162
 	.uleb128 0x4e
-	.8byte	.LVL761
-	.4byte	0x13d8c
+	.8byte	.LVL753
+	.4byte	0x13db6
 	.uleb128 0x4e
-	.8byte	.LVL762
-	.4byte	0x13d98
+	.8byte	.LVL754
+	.4byte	0x13dc2
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL759
-	.4byte	0x13da5
+	.8byte	.LVL751
+	.4byte	0x13dcf
 	.uleb128 0x4e
-	.8byte	.LVL763
-	.4byte	0x13db1
+	.8byte	.LVL755
+	.4byte	0x13ddb
 	.byte	0
 	.byte	0
 	.uleb128 0x6c
 	.8byte	.LBB1717
 	.8byte	.LBE1717-.LBB1717
-	.4byte	0x11914
+	.4byte	0x11920
 	.uleb128 0x46
-	.4byte	.LASF3058
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x439
+	.2byte	0x43e
 	.4byte	0xc6
 	.uleb128 0x5e
 	.8byte	.LBB1718
 	.8byte	.LBE1718-.LBB1718
 	.uleb128 0x72
-	.4byte	.LASF3070
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x439
+	.2byte	0x43e
 	.uleb128 0x4c
-	.4byte	.LASF3059
+	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x439
+	.2byte	0x43e
 	.4byte	0x14fd
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3058
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x439
+	.2byte	0x43e
 	.4byte	0x194
 	.uleb128 0x6c
 	.8byte	.LBB1719
 	.8byte	.LBE1719-.LBB1719
-	.4byte	0x118f8
+	.4byte	0x11904
 	.uleb128 0x57
-	.4byte	.LASF3060
+	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x439
+	.2byte	0x43e
 	.4byte	0x194
 	.4byte	.LLST161
 	.uleb128 0x4e
-	.8byte	.LVL708
-	.4byte	0x13d8c
+	.8byte	.LVL713
+	.4byte	0x13db6
 	.uleb128 0x4e
-	.8byte	.LVL709
-	.4byte	0x13d98
+	.8byte	.LVL714
+	.4byte	0x13dc2
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL706
-	.4byte	0x13da5
+	.8byte	.LVL711
+	.4byte	0x13dcf
 	.uleb128 0x4e
-	.8byte	.LVL710
-	.4byte	0x13db1
+	.8byte	.LVL715
+	.4byte	0x13ddb
 	.byte	0
 	.byte	0
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xef0
-	.4byte	0x119aa
+	.4byte	0x119b6
 	.uleb128 0x46
-	.4byte	.LASF3058
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x445
+	.2byte	0x44a
 	.4byte	0xc6
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0xef0
 	.uleb128 0x6b
-	.4byte	.LASF3070
+	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x445
-	.8byte	.L668
+	.2byte	0x44a
+	.8byte	.L684
 	.uleb128 0x4c
-	.4byte	.LASF3059
+	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x445
+	.2byte	0x44a
 	.4byte	0x14fd
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -112
 	.uleb128 0x46
-	.4byte	.LASF3058
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x445
+	.2byte	0x44a
 	.4byte	0x194
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xf30
-	.4byte	0x1198e
+	.4byte	0x1199a
 	.uleb128 0x57
-	.4byte	.LASF3060
+	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x445
+	.2byte	0x44a
 	.4byte	0x194
 	.4byte	.LLST160
 	.uleb128 0x4e
+	.8byte	.LVL671
+	.4byte	0x13db6
+	.uleb128 0x4e
 	.8byte	.LVL672
-	.4byte	0x13d8c
+	.4byte	0x13dc2
+	.byte	0
+	.uleb128 0x4e
+	.8byte	.LVL669
+	.4byte	0x13dcf
 	.uleb128 0x4e
 	.8byte	.LVL673
-	.4byte	0x13d98
+	.4byte	0x13ddb
 	.byte	0
+	.byte	0
+	.uleb128 0x53
+	.4byte	0x12bb6
+	.8byte	.LBB1720
+	.8byte	.LBE1720-.LBB1720
+	.byte	0x1
+	.2byte	0x3fe
+	.4byte	0x11a01
+	.uleb128 0x54
+	.4byte	0x12bd1
+	.uleb128 0x54
+	.4byte	0x12bc6
+	.uleb128 0x5e
+	.8byte	.LBB1721
+	.8byte	.LBE1721-.LBB1721
+	.uleb128 0x5c
+	.4byte	0x12bdc
 	.uleb128 0x4e
-	.8byte	.LVL670
-	.4byte	0x13da5
-	.uleb128 0x4e
-	.8byte	.LVL674
-	.4byte	0x13db1
+	.8byte	.LVL720
+	.4byte	0x13a40
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12918
-	.8byte	.LBB1720
-	.4byte	.Ldebug_ranges0+0xf70
+	.4byte	0x12946
+	.8byte	.LBB1727
+	.4byte	.Ldebug_ranges0+0xfe0
 	.byte	0x1
-	.2byte	0x37d
-	.4byte	0x11a59
+	.2byte	0x37e
+	.4byte	0x11ab8
 	.uleb128 0x54
-	.4byte	0x12961
+	.4byte	0x1298f
 	.uleb128 0x54
-	.4byte	0x12955
+	.4byte	0x12983
 	.uleb128 0x54
-	.4byte	0x12949
+	.4byte	0x12977
 	.uleb128 0x54
-	.4byte	0x1293d
+	.4byte	0x1296b
 	.uleb128 0x54
-	.4byte	0x12931
+	.4byte	0x1295f
 	.uleb128 0x54
-	.4byte	0x12925
+	.4byte	0x12953
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xf70
-	.uleb128 0x5f
-	.4byte	0x1296d
-	.4byte	.LLST162
-	.uleb128 0x5c
-	.4byte	0x12979
-	.uleb128 0x5c
-	.4byte	0x12985
+	.4byte	.Ldebug_ranges0+0xfe0
 	.uleb128 0x5f
-	.4byte	0x12991
+	.4byte	0x1299b
 	.4byte	.LLST163
+	.uleb128 0x5c
+	.4byte	0x129a7
 	.uleb128 0x5f
-	.4byte	0x1299d
+	.4byte	0x129b3
 	.4byte	.LLST164
-	.uleb128 0x5c
-	.4byte	0x129a9
-	.uleb128 0x5c
-	.4byte	0x129b5
-	.uleb128 0x5c
-	.4byte	0x129c1
-	.uleb128 0x5c
-	.4byte	0x129cd
-	.uleb128 0x5c
-	.4byte	0x129d9
 	.uleb128 0x5f
-	.4byte	0x129e5
+	.4byte	0x129bf
 	.4byte	.LLST165
 	.uleb128 0x5f
-	.4byte	0x129ef
+	.4byte	0x129cb
 	.4byte	.LLST166
+	.uleb128 0x5c
+	.4byte	0x129d7
+	.uleb128 0x5c
+	.4byte	0x129e3
+	.uleb128 0x5c
+	.4byte	0x129ef
 	.uleb128 0x5f
-	.4byte	0x129f9
+	.4byte	0x129fb
 	.4byte	.LLST167
+	.uleb128 0x5c
+	.4byte	0x12a07
 	.uleb128 0x5f
-	.4byte	0x12a05
+	.4byte	0x12a13
 	.4byte	.LLST168
-	.uleb128 0x60
-	.4byte	0x12a11
-	.uleb128 0x1
-	.byte	0x5e
 	.uleb128 0x5f
 	.4byte	0x12a1d
 	.4byte	.LLST169
+	.uleb128 0x5f
+	.4byte	0x12a27
+	.4byte	.LLST170
+	.uleb128 0x5f
+	.4byte	0x12a33
+	.4byte	.LLST171
+	.uleb128 0x60
+	.4byte	0x12a3f
+	.uleb128 0x1
+	.byte	0x60
+	.uleb128 0x5f
+	.4byte	0x12a4b
+	.4byte	.LLST172
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12b8c
-	.8byte	.LBB1735
-	.8byte	.LBE1735-.LBB1735
-	.byte	0x1
-	.2byte	0x3f9
-	.4byte	0x11aa4
-	.uleb128 0x54
-	.4byte	0x12ba7
-	.uleb128 0x54
-	.4byte	0x12b9c
-	.uleb128 0x5e
+	.4byte	0x11ec4
 	.8byte	.LBB1736
 	.8byte	.LBE1736-.LBB1736
-	.uleb128 0x5c
-	.4byte	0x12bb2
-	.uleb128 0x4e
-	.8byte	.LVL740
-	.4byte	0x13a16
-	.byte	0
-	.byte	0
-	.uleb128 0x53
-	.4byte	0x11e96
-	.8byte	.LBB1737
-	.8byte	.LBE1737-.LBB1737
 	.byte	0x1
-	.2byte	0x3db
-	.4byte	0x11b2a
+	.2byte	0x3e0
+	.4byte	0x11b3e
 	.uleb128 0x54
-	.4byte	0x11ebf
+	.4byte	0x11eed
 	.uleb128 0x54
-	.4byte	0x11eb3
+	.4byte	0x11ee1
 	.uleb128 0x54
-	.4byte	0x11ea7
+	.4byte	0x11ed5
 	.uleb128 0x5e
-	.8byte	.LBB1738
-	.8byte	.LBE1738-.LBB1738
+	.8byte	.LBB1737
+	.8byte	.LBE1737-.LBB1737
 	.uleb128 0x5c
-	.4byte	0x11ecb
+	.4byte	0x11ef9
 	.uleb128 0x5c
-	.4byte	0x11ed5
+	.4byte	0x11f03
 	.uleb128 0x5c
-	.4byte	0x11ee1
+	.4byte	0x11f0f
 	.uleb128 0x5c
-	.4byte	0x11eed
+	.4byte	0x11f1b
 	.uleb128 0x5f
-	.4byte	0x11ef9
-	.4byte	.LLST171
+	.4byte	0x11f27
+	.4byte	.LLST173
 	.uleb128 0x5c
-	.4byte	0x11f05
+	.4byte	0x11f33
 	.uleb128 0x5c
-	.4byte	0x11f11
+	.4byte	0x11f3f
 	.uleb128 0x73
-	.4byte	0x11f1d
+	.4byte	0x11f4b
 	.uleb128 0x5e
-	.8byte	.LBB1739
-	.8byte	.LBE1739-.LBB1739
+	.8byte	.LBB1738
+	.8byte	.LBE1738-.LBB1738
 	.uleb128 0x5c
-	.4byte	0x11f26
+	.4byte	0x11f54
 	.uleb128 0x5c
-	.4byte	0x11f32
+	.4byte	0x11f60
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12b8c
-	.8byte	.LBB1746
-	.8byte	.LBE1746-.LBB1746
+	.4byte	0x12bb6
+	.8byte	.LBB1745
+	.8byte	.LBE1745-.LBB1745
 	.byte	0x1
-	.2byte	0x3a8
-	.4byte	0x11b75
+	.2byte	0x3aa
+	.4byte	0x11b89
 	.uleb128 0x54
-	.4byte	0x12ba7
+	.4byte	0x12bd1
 	.uleb128 0x54
-	.4byte	0x12b9c
+	.4byte	0x12bc6
 	.uleb128 0x5e
-	.8byte	.LBB1747
-	.8byte	.LBE1747-.LBB1747
+	.8byte	.LBB1746
+	.8byte	.LBE1746-.LBB1746
 	.uleb128 0x5c
-	.4byte	0x12bb2
+	.4byte	0x12bdc
 	.uleb128 0x4e
-	.8byte	.LVL777
-	.4byte	0x13a16
+	.8byte	.LVL772
+	.4byte	0x13a40
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12b8c
+	.4byte	0x12bb6
 	.8byte	.LBB1748
 	.8byte	.LBE1748-.LBB1748
 	.byte	0x1
-	.2byte	0x385
-	.4byte	0x11bc0
+	.2byte	0x386
+	.4byte	0x11bd4
 	.uleb128 0x54
-	.4byte	0x12ba7
+	.4byte	0x12bd1
 	.uleb128 0x54
-	.4byte	0x12b9c
+	.4byte	0x12bc6
 	.uleb128 0x5e
 	.8byte	.LBB1749
 	.8byte	.LBE1749-.LBB1749
 	.uleb128 0x5c
-	.4byte	0x12bb2
+	.4byte	0x12bdc
 	.uleb128 0x4e
-	.8byte	.LVL780
-	.4byte	0x13a16
+	.8byte	.LVL787
+	.4byte	0x13a40
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12b8c
+	.4byte	0x12bb6
 	.8byte	.LBB1750
 	.8byte	.LBE1750-.LBB1750
 	.byte	0x1
-	.2byte	0x350
-	.4byte	0x11c0b
+	.2byte	0x34f
+	.4byte	0x11c1f
 	.uleb128 0x54
-	.4byte	0x12ba7
+	.4byte	0x12bd1
 	.uleb128 0x54
-	.4byte	0x12b9c
+	.4byte	0x12bc6
 	.uleb128 0x5e
 	.8byte	.LBB1751
 	.8byte	.LBE1751-.LBB1751
 	.uleb128 0x5c
-	.4byte	0x12bb2
+	.4byte	0x12bdc
 	.uleb128 0x4e
-	.8byte	.LVL781
-	.4byte	0x13a16
+	.8byte	.LVL788
+	.4byte	0x13a40
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
+	.8byte	.LVL656
+	.4byte	0x13e3e
+	.uleb128 0x4e
 	.8byte	.LVL657
-	.4byte	0x13e14
+	.4byte	0x13e4a
 	.uleb128 0x4e
 	.8byte	.LVL658
-	.4byte	0x13e20
+	.4byte	0x13e02
 	.uleb128 0x4e
-	.8byte	.LVL659
-	.4byte	0x13dd8
+	.8byte	.LVL676
+	.4byte	0x13d01
 	.uleb128 0x4e
 	.8byte	.LVL677
-	.4byte	0x13cd7
+	.4byte	0x13e4a
 	.uleb128 0x4e
 	.8byte	.LVL678
-	.4byte	0x13e20
+	.4byte	0x13e02
 	.uleb128 0x4e
 	.8byte	.LVL679
-	.4byte	0x13dd8
+	.4byte	0x12aac
 	.uleb128 0x4e
 	.8byte	.LVL680
-	.4byte	0x12a82
+	.4byte	0x13bda
 	.uleb128 0x4e
 	.8byte	.LVL681
-	.4byte	0x13bb0
+	.4byte	0x1234a
 	.uleb128 0x4e
-	.8byte	.LVL682
-	.4byte	0x1231c
+	.8byte	.LVL684
+	.4byte	0x13e56
 	.uleb128 0x4e
 	.8byte	.LVL685
-	.4byte	0x13e2c
-	.uleb128 0x4e
-	.8byte	.LVL686
-	.4byte	0x13bb0
+	.4byte	0x13bda
 	.uleb128 0x4e
 	.8byte	.LVL687
-	.4byte	0x13c8d
+	.4byte	0x13cb7
 	.uleb128 0x4e
 	.8byte	.LVL688
-	.4byte	0x13bb0
-	.uleb128 0x4e
-	.8byte	.LVL689
-	.4byte	0x13cd7
-	.uleb128 0x4e
-	.8byte	.LVL690
-	.4byte	0x12a82
+	.4byte	0x13bda
 	.uleb128 0x4e
 	.8byte	.LVL691
-	.4byte	0x11f40
+	.4byte	0x11f6e
 	.uleb128 0x4e
 	.8byte	.LVL692
-	.4byte	0x13bb0
-	.uleb128 0x4e
-	.8byte	.LVL693
-	.4byte	0x1231c
+	.4byte	0x13c54
 	.uleb128 0x4e
-	.8byte	.LVL695
-	.4byte	0x13bb0
+	.8byte	.LVL694
+	.4byte	0x13e4a
 	.uleb128 0x4e
 	.8byte	.LVL696
-	.4byte	0x13cf9
+	.4byte	0x13d01
 	.uleb128 0x4e
 	.8byte	.LVL697
-	.4byte	0x13e20
+	.4byte	0x12aac
 	.uleb128 0x4e
 	.8byte	.LVL698
-	.4byte	0x13dd8
+	.4byte	0x11f6e
 	.uleb128 0x4e
-	.8byte	.LVL702
-	.4byte	0x11f40
+	.8byte	.LVL700
+	.4byte	0x13bda
 	.uleb128 0x4e
-	.8byte	.LVL703
-	.4byte	0x13c2a
+	.8byte	.LVL701
+	.4byte	0x1234a
+	.uleb128 0x4e
+	.8byte	.LVL704
+	.4byte	0x13bda
 	.uleb128 0x4e
 	.8byte	.LVL705
-	.4byte	0x13e20
+	.4byte	0x13d23
 	.uleb128 0x4e
-	.8byte	.LVL711
-	.4byte	0x13ad5
+	.8byte	.LVL706
+	.4byte	0x13e4a
 	.uleb128 0x4e
-	.8byte	.LVL712
-	.4byte	0x13cd7
+	.8byte	.LVL708
+	.4byte	0x13e02
 	.uleb128 0x4e
-	.8byte	.LVL713
-	.4byte	0x13cd7
+	.8byte	.LVL716
+	.4byte	0x13aff
 	.uleb128 0x4e
-	.8byte	.LVL714
-	.4byte	0x13cd7
+	.8byte	.LVL718
+	.4byte	0x13c54
 	.uleb128 0x4e
-	.8byte	.LVL715
-	.4byte	0x13cd7
+	.8byte	.LVL721
+	.4byte	0x11f6e
 	.uleb128 0x4e
-	.8byte	.LVL730
-	.4byte	0x13c2a
+	.8byte	.LVL722
+	.4byte	0x13bda
 	.uleb128 0x4e
-	.8byte	.LVL733
-	.4byte	0x13bb0
+	.8byte	.LVL723
+	.4byte	0x1234a
 	.uleb128 0x4e
-	.8byte	.LVL734
-	.4byte	0x1231c
+	.8byte	.LVL724
+	.4byte	0x13cb7
 	.uleb128 0x4e
-	.8byte	.LVL735
-	.4byte	0x13c8d
+	.8byte	.LVL727
+	.4byte	0x13cb7
 	.uleb128 0x4e
-	.8byte	.LVL738
-	.4byte	0x13c8d
+	.8byte	.LVL729
+	.4byte	0x13d01
 	.uleb128 0x4e
-	.8byte	.LVL743
-	.4byte	0x13bb0
+	.8byte	.LVL742
+	.4byte	0x13bda
 	.uleb128 0x4e
-	.8byte	.LVL744
-	.4byte	0x13bb0
+	.8byte	.LVL745
+	.4byte	0x13bda
 	.uleb128 0x4e
-	.8byte	.LVL747
-	.4byte	0x13bb0
+	.8byte	.LVL746
+	.4byte	0x13bda
 	.uleb128 0x4e
-	.8byte	.LVL751
-	.4byte	0x13bb0
+	.8byte	.LVL749
+	.4byte	0x13bda
 	.uleb128 0x4e
-	.8byte	.LVL752
-	.4byte	0x13e2c
+	.8byte	.LVL756
+	.4byte	0x13cb7
 	.uleb128 0x4e
-	.8byte	.LVL753
-	.4byte	0x13cf9
+	.8byte	.LVL760
+	.4byte	0x13bda
 	.uleb128 0x4e
-	.8byte	.LVL756
-	.4byte	0x13c1e
+	.8byte	.LVL761
+	.4byte	0x13e56
 	.uleb128 0x4e
-	.8byte	.LVL757
-	.4byte	0x13cd7
+	.8byte	.LVL762
+	.4byte	0x13d23
 	.uleb128 0x4e
-	.8byte	.LVL758
-	.4byte	0x13cd7
+	.8byte	.LVL766
+	.4byte	0x13c48
 	.uleb128 0x4e
-	.8byte	.LVL764
-	.4byte	0x13cd7
+	.8byte	.LVL767
+	.4byte	0x13d01
 	.uleb128 0x4e
-	.8byte	.LVL773
-	.4byte	0x11f40
+	.8byte	.LVL768
+	.4byte	0x13d01
 	.uleb128 0x4e
-	.8byte	.LVL774
-	.4byte	0x13ad5
+	.8byte	.LVL769
+	.4byte	0x13d01
 	.uleb128 0x4e
-	.8byte	.LVL776
-	.4byte	0x13bb0
+	.8byte	.LVL770
+	.4byte	0x13d01
 	.uleb128 0x4e
-	.8byte	.LVL778
-	.4byte	0x13c2a
+	.8byte	.LVL771
+	.4byte	0x13d01
+	.uleb128 0x4e
+	.8byte	.LVL773
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL782
-	.4byte	0x13d37
+	.4byte	0x11f6e
+	.uleb128 0x4e
+	.8byte	.LVL783
+	.4byte	0x13aff
+	.uleb128 0x4e
+	.8byte	.LVL785
+	.4byte	0x13d01
+	.uleb128 0x4e
+	.8byte	.LVL789
+	.4byte	0x13d61
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3072
+	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x2f7
+	.2byte	0x2f5
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11f40
+	.4byte	0x11f6e
 	.uleb128 0x64
-	.4byte	.LASF3073
+	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x2f7
+	.2byte	0x2f5
 	.4byte	0x4653
 	.uleb128 0x64
-	.4byte	.LASF3074
+	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0x2f7
+	.2byte	0x2f5
 	.4byte	0x4653
 	.uleb128 0x64
-	.4byte	.LASF3075
+	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x2f7
+	.2byte	0x2f5
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x2f9
+	.2byte	0x2f7
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3076
+	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0x2fa
+	.2byte	0x2f8
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3077
+	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0x2fa
+	.2byte	0x2f8
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3078
+	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0x2fb
+	.2byte	0x2f9
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3079
+	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0x2fc
+	.2byte	0x2fa
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3080
+	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0x2fd
+	.2byte	0x2fb
 	.4byte	0x4659
 	.uleb128 0x46
-	.4byte	.LASF3081
+	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0x2fe
+	.2byte	0x2fc
 	.4byte	0x4659
 	.uleb128 0x72
-	.4byte	.LASF3082
+	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0x315
+	.2byte	0x313
 	.uleb128 0x66
 	.uleb128 0x46
-	.4byte	.LASF3083
+	.4byte	.LASF3085
 	.byte	0x1
-	.2byte	0x30d
+	.2byte	0x30b
 	.4byte	0x10b
 	.uleb128 0x46
-	.4byte	.LASF3084
+	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0x30d
+	.2byte	0x30b
 	.4byte	0x10b
 	.byte	0
 	.byte	0
 	.uleb128 0x50
-	.4byte	.LASF3085
+	.4byte	.LASF3087
 	.byte	0x1
-	.2byte	0x2a3
+	.2byte	0x29f
 	.4byte	0xc6
 	.8byte	.LFB2817
 	.8byte	.LFE2817-.LFB2817
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12087
+	.4byte	0x120b5
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x2a3
-	.4byte	0xe461
+	.2byte	0x29f
+	.4byte	0xe46d
 	.4byte	.LLST73
 	.uleb128 0x46
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x2a5
-	.4byte	0xe6fb
+	.2byte	0x2a1
+	.4byte	0xe707
 	.uleb128 0x57
-	.4byte	.LASF3086
+	.4byte	.LASF3088
 	.byte	0x1
-	.2byte	0x2a6
+	.2byte	0x2a2
 	.4byte	0xc6
 	.4byte	.LLST74
 	.uleb128 0x69
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x2a7
+	.2byte	0x2a3
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x64
 	.uleb128 0x53
-	.4byte	0x12e01
+	.4byte	0x12e2b
 	.8byte	.LBB1204
 	.8byte	.LBE1204-.LBB1204
 	.byte	0x1
-	.2byte	0x2aa
-	.4byte	0x11fc3
+	.2byte	0x2a6
+	.4byte	0x11ff1
 	.uleb128 0x54
-	.4byte	0x12e1c
+	.4byte	0x12e46
 	.uleb128 0x54
-	.4byte	0x12e11
+	.4byte	0x12e3b
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL246
-	.4byte	0x13bb0
+	.4byte	0x13bda
 	.uleb128 0x4e
 	.8byte	.LVL247
-	.4byte	0x13e38
+	.4byte	0x13e62
 	.uleb128 0x4e
 	.8byte	.LVL250
-	.4byte	0x13e38
+	.4byte	0x13e62
 	.uleb128 0x4e
 	.8byte	.LVL251
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL253
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL254
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL256
-	.4byte	0x13e38
+	.4byte	0x13e62
 	.uleb128 0x4e
 	.8byte	.LVL257
-	.4byte	0x13e38
+	.4byte	0x13e62
 	.uleb128 0x4e
 	.8byte	.LVL258
-	.4byte	0x13e38
+	.4byte	0x13e62
 	.uleb128 0x4e
 	.8byte	.LVL259
-	.4byte	0x13e38
+	.4byte	0x13e62
 	.uleb128 0x4e
 	.8byte	.LVL260
-	.4byte	0x13e38
+	.4byte	0x13e62
 	.uleb128 0x4e
 	.8byte	.LVL261
-	.4byte	0x13e38
+	.4byte	0x13e62
 	.uleb128 0x4e
 	.8byte	.LVL262
-	.4byte	0x13e38
+	.4byte	0x13e62
 	.uleb128 0x4e
 	.8byte	.LVL263
-	.4byte	0x13c2a
+	.4byte	0x13c54
 	.uleb128 0x4e
 	.8byte	.LVL264
-	.4byte	0x13d37
+	.4byte	0x13d61
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3087
+	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x27e
+	.2byte	0x279
 	.8byte	.LFB2816
 	.8byte	.LFE2816-.LFB2816
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12140
+	.4byte	0x1216e
 	.uleb128 0x46
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x280
-	.4byte	0xe6fb
+	.2byte	0x27b
+	.4byte	0xe707
 	.uleb128 0x46
-	.4byte	.LASF2994
+	.4byte	.LASF2996
 	.byte	0x1
-	.2byte	0x281
-	.4byte	0xe117
+	.2byte	0x27c
+	.4byte	0xe123
 	.uleb128 0x4e
 	.8byte	.LVL229
-	.4byte	0x13c5b
+	.4byte	0x13c85
 	.uleb128 0x4e
 	.8byte	.LVL230
-	.4byte	0x13bb0
+	.4byte	0x13bda
 	.uleb128 0x4e
 	.8byte	.LVL231
-	.4byte	0x13cf9
+	.4byte	0x13d23
 	.uleb128 0x4e
 	.8byte	.LVL232
-	.4byte	0x13cf9
+	.4byte	0x13d23
 	.uleb128 0x4e
 	.8byte	.LVL233
-	.4byte	0x13bb0
+	.4byte	0x13bda
 	.uleb128 0x4e
 	.8byte	.LVL234
-	.4byte	0x13c14
+	.4byte	0x13c3e
 	.uleb128 0x4e
 	.8byte	.LVL235
-	.4byte	0x13c8d
+	.4byte	0x13cb7
 	.uleb128 0x4e
 	.8byte	.LVL236
-	.4byte	0x13cf9
+	.4byte	0x13d23
 	.uleb128 0x4e
 	.8byte	.LVL237
-	.4byte	0x13cf9
+	.4byte	0x13d23
 	.uleb128 0x4e
 	.8byte	.LVL238
-	.4byte	0x13c5b
+	.4byte	0x13c85
 	.byte	0
 	.uleb128 0x4f
-	.4byte	.LASF3088
+	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x23a
+	.2byte	0x233
 	.4byte	0xc6
 	.8byte	.LFB2815
 	.8byte	.LFE2815-.LFB2815
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1230c
+	.4byte	0x1233a
 	.uleb128 0x56
 	.4byte	.LASF791
 	.byte	0x1
-	.2byte	0x23a
+	.2byte	0x233
 	.4byte	0x443
 	.4byte	.LLST119
 	.uleb128 0x69
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x23c
-	.4byte	0xe461
+	.2byte	0x235
+	.4byte	0xe46d
 	.uleb128 0x1
 	.byte	0x66
 	.uleb128 0x46
-	.4byte	.LASF2994
+	.4byte	.LASF2996
 	.byte	0x1
-	.2byte	0x23d
-	.4byte	0xe117
+	.2byte	0x236
+	.4byte	0xe123
 	.uleb128 0x46
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x23e
-	.4byte	0xe6fb
+	.2byte	0x237
+	.4byte	0xe707
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x970
-	.4byte	0x1222a
+	.4byte	0x12258
 	.uleb128 0x3f
 	.byte	0x8
 	.byte	0x1
-	.2byte	0x245
-	.4byte	0x121c3
+	.2byte	0x23e
+	.4byte	0x121f1
 	.uleb128 0x41
-	.4byte	.LASF3089
+	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x245
+	.2byte	0x23e
 	.4byte	0x19b
 	.uleb128 0x3d
 	.string	"__c"
 	.byte	0x1
-	.2byte	0x245
-	.4byte	0x1230c
+	.2byte	0x23e
+	.4byte	0x1233a
 	.byte	0
 	.uleb128 0x52
 	.string	"__u"
 	.byte	0x1
-	.2byte	0x245
-	.4byte	0x121a1
+	.2byte	0x23e
+	.4byte	0x121cf
 	.uleb128 0x58
-	.4byte	0x135e3
+	.4byte	0x1360d
 	.8byte	.LBB1293
 	.4byte	.Ldebug_ranges0+0x9b0
 	.byte	0x1
-	.2byte	0x245
-	.4byte	0x121f7
+	.2byte	0x23e
+	.4byte	0x12225
 	.uleb128 0x54
-	.4byte	0x13603
+	.4byte	0x1362d
 	.uleb128 0x54
-	.4byte	0x135f8
+	.4byte	0x13622
 	.uleb128 0x54
-	.4byte	0x135ef
+	.4byte	0x13619
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13443
+	.4byte	0x1346d
 	.8byte	.LBB1296
 	.8byte	.LBE1296-.LBB1296
 	.byte	0x1
-	.2byte	0x245
+	.2byte	0x23e
 	.uleb128 0x5e
 	.8byte	.LBB1297
 	.8byte	.LBE1297-.LBB1297
 	.uleb128 0x60
-	.4byte	0x13453
+	.4byte	0x1347d
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x132dd
+	.4byte	0x13307
 	.8byte	.LBB1301
 	.8byte	.LBE1301-.LBB1301
 	.byte	0x1
-	.2byte	0x275
-	.4byte	0x1227c
+	.2byte	0x270
+	.4byte	0x122aa
 	.uleb128 0x54
-	.4byte	0x132ee
+	.4byte	0x13318
 	.uleb128 0x5a
-	.4byte	0x132fb
+	.4byte	0x13325
 	.8byte	.LBB1303
 	.8byte	.LBE1303-.LBB1303
 	.byte	0xd
 	.2byte	0x240
 	.uleb128 0x54
-	.4byte	0x13317
+	.4byte	0x13341
 	.uleb128 0x54
-	.4byte	0x1330c
+	.4byte	0x13336
 	.uleb128 0x4e
-	.8byte	.LVL427
-	.4byte	0x13e44
+	.8byte	.LVL425
+	.4byte	0x13e6e
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL420
-	.4byte	0x13913
+	.4byte	0x13e7b
 	.uleb128 0x4e
 	.8byte	.LVL421
-	.4byte	0x126c5
+	.4byte	0x13db6
 	.uleb128 0x4e
 	.8byte	.LVL422
-	.4byte	0x13e51
+	.4byte	0x13e85
 	.uleb128 0x4e
 	.8byte	.LVL423
-	.4byte	0x13d8c
+	.4byte	0x126f3
 	.uleb128 0x4e
 	.8byte	.LVL424
-	.4byte	0x13e5b
-	.uleb128 0x4e
-	.8byte	.LVL425
-	.4byte	0x13913
+	.4byte	0x1393d
 	.uleb128 0x4e
 	.8byte	.LVL426
-	.4byte	0x13755
+	.4byte	0x1393d
+	.uleb128 0x4e
+	.8byte	.LVL427
+	.4byte	0x1363f
 	.uleb128 0x4e
 	.8byte	.LVL428
-	.4byte	0x126c5
+	.4byte	0x1393d
 	.uleb128 0x4e
 	.8byte	.LVL429
-	.4byte	0x13913
+	.4byte	0x126f3
 	.uleb128 0x4e
 	.8byte	.LVL430
-	.4byte	0x13913
+	.4byte	0x1393d
 	.uleb128 0x4e
 	.8byte	.LVL431
-	.4byte	0x13615
+	.4byte	0x1377f
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x1231c
+	.4byte	0x1234a
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3090
+	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x1f1
+	.2byte	0x1e9
 	.8byte	.LFB2814
 	.8byte	.LFE2814-.LFB2814
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x124bb
+	.4byte	0x124e9
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x1f1
-	.4byte	0xe461
+	.2byte	0x1e9
+	.4byte	0xe46d
 	.4byte	.LLST118
 	.uleb128 0x46
-	.4byte	.LASF2994
+	.4byte	.LASF2996
 	.byte	0x1
-	.2byte	0x1f3
-	.4byte	0xe117
+	.2byte	0x1eb
+	.4byte	0xe123
 	.uleb128 0x46
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x1f4
-	.4byte	0xe6fb
+	.2byte	0x1ec
+	.4byte	0xe707
 	.uleb128 0x55
-	.4byte	.LASF3018
+	.4byte	.LASF3020
 	.4byte	0xb915
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34644
+	.8byte	__func__.34647
 	.uleb128 0x53
-	.4byte	0x124bb
+	.4byte	0x124e9
 	.8byte	.LBB1284
 	.8byte	.LBE1284-.LBB1284
 	.byte	0x1
-	.2byte	0x20b
-	.4byte	0x123a9
+	.2byte	0x204
+	.4byte	0x123d7
 	.uleb128 0x54
-	.4byte	0x124d4
+	.4byte	0x12502
 	.uleb128 0x54
-	.4byte	0x124c8
+	.4byte	0x124f6
 	.uleb128 0x4e
 	.8byte	.LVL396
-	.4byte	0x13913
+	.4byte	0x1393d
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x124bb
+	.4byte	0x124e9
 	.8byte	.LBB1286
 	.8byte	.LBE1286-.LBB1286
 	.byte	0x1
-	.2byte	0x221
-	.4byte	0x123dd
+	.2byte	0x1f7
+	.4byte	0x1240b
 	.uleb128 0x54
-	.4byte	0x124d4
+	.4byte	0x12502
 	.uleb128 0x54
-	.4byte	0x124c8
+	.4byte	0x124f6
 	.uleb128 0x4e
 	.8byte	.LVL401
-	.4byte	0x13913
+	.4byte	0x1393d
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x124bb
+	.4byte	0x124e9
 	.8byte	.LBB1288
 	.8byte	.LBE1288-.LBB1288
 	.byte	0x1
-	.2byte	0x1fe
-	.4byte	0x12411
+	.2byte	0x227
+	.4byte	0x1243f
 	.uleb128 0x54
-	.4byte	0x124d4
+	.4byte	0x12502
 	.uleb128 0x54
-	.4byte	0x124c8
+	.4byte	0x124f6
 	.uleb128 0x4e
-	.8byte	.LVL406
-	.4byte	0x13913
+	.8byte	.LVL405
+	.4byte	0x1393d
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x124bb
+	.4byte	0x124e9
 	.8byte	.LBB1290
 	.8byte	.LBE1290-.LBB1290
 	.byte	0x1
-	.2byte	0x22e
-	.4byte	0x12445
+	.2byte	0x21a
+	.4byte	0x12473
 	.uleb128 0x54
-	.4byte	0x124d4
+	.4byte	0x12502
 	.uleb128 0x54
-	.4byte	0x124c8
+	.4byte	0x124f6
 	.uleb128 0x4e
 	.8byte	.LVL410
-	.4byte	0x13913
+	.4byte	0x1393d
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL395
-	.4byte	0x126c5
+	.4byte	0x126f3
 	.uleb128 0x4e
 	.8byte	.LVL397
-	.4byte	0x126c5
+	.4byte	0x126f3
 	.uleb128 0x4e
 	.8byte	.LVL400
-	.4byte	0x13755
+	.4byte	0x126f3
 	.uleb128 0x4e
-	.8byte	.LVL402
-	.4byte	0x13755
+	.8byte	.LVL404
+	.4byte	0x1363f
 	.uleb128 0x4e
-	.8byte	.LVL405
-	.4byte	0x126c5
+	.8byte	.LVL406
+	.4byte	0x1363f
 	.uleb128 0x4e
 	.8byte	.LVL409
-	.4byte	0x13615
+	.4byte	0x1377f
 	.uleb128 0x4e
 	.8byte	.LVL411
-	.4byte	0x13615
+	.4byte	0x1377f
 	.uleb128 0x4e
 	.8byte	.LVL414
-	.4byte	0x13e67
+	.4byte	0x13e91
 	.uleb128 0x4e
 	.8byte	.LVL415
-	.4byte	0x13e67
+	.4byte	0x13e91
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3092
+	.4byte	.LASF3094
 	.byte	0x1
-	.2byte	0x1eb
+	.2byte	0x1e3
 	.byte	0x1
-	.4byte	0x124e1
+	.4byte	0x1250f
 	.uleb128 0x64
-	.4byte	.LASF2994
+	.4byte	.LASF2996
 	.byte	0x1
-	.2byte	0x1eb
-	.4byte	0xe117
+	.2byte	0x1e3
+	.4byte	0xe123
 	.uleb128 0x64
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x1eb
-	.4byte	0xe6fb
+	.2byte	0x1e3
+	.4byte	0xe707
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3093
+	.4byte	.LASF3095
 	.byte	0x1
-	.2byte	0x1e0
+	.2byte	0x1d8
 	.byte	0x1
-	.4byte	0x12513
+	.4byte	0x12541
 	.uleb128 0x64
-	.4byte	.LASF2994
+	.4byte	.LASF2996
 	.byte	0x1
-	.2byte	0x1e0
-	.4byte	0xe117
+	.2byte	0x1d8
+	.4byte	0xe123
 	.uleb128 0x64
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x1e0
-	.4byte	0xe6fb
+	.2byte	0x1d8
+	.4byte	0xe707
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x1e2
-	.4byte	0x12513
+	.2byte	0x1da
+	.4byte	0x12541
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xdea1
+	.4byte	0xdead
 	.uleb128 0x65
-	.4byte	.LASF3094
+	.4byte	.LASF3096
 	.byte	0x1
-	.2byte	0x1b6
+	.2byte	0x1ae
 	.byte	0x1
-	.4byte	0x125ef
+	.4byte	0x1261d
 	.uleb128 0x64
-	.4byte	.LASF3095
+	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x1b6
+	.2byte	0x1ae
 	.4byte	0xc097
 	.uleb128 0x64
-	.4byte	.LASF3096
+	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x1b7
+	.2byte	0x1af
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3097
+	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x1b7
+	.2byte	0x1af
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x1b8
-	.4byte	0xe6fb
+	.2byte	0x1b0
+	.4byte	0xe707
 	.uleb128 0x46
-	.4byte	.LASF2994
+	.4byte	.LASF2996
 	.byte	0x1
-	.2byte	0x1ba
-	.4byte	0xe117
+	.2byte	0x1b2
+	.4byte	0xe123
 	.uleb128 0x46
-	.4byte	.LASF3098
+	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x1bb
+	.2byte	0x1b3
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3099
+	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x1bb
+	.2byte	0x1b3
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3100
+	.4byte	.LASF3102
 	.byte	0x1
-	.2byte	0x1bb
+	.2byte	0x1b3
 	.4byte	0x4659
 	.uleb128 0x46
-	.4byte	.LASF3101
+	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x1bb
+	.2byte	0x1b3
 	.4byte	0x4659
 	.uleb128 0x46
-	.4byte	.LASF3102
+	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x1bc
+	.2byte	0x1b4
 	.4byte	0xc097
 	.uleb128 0x46
-	.4byte	.LASF2891
+	.4byte	.LASF2893
 	.byte	0x1
-	.2byte	0x1bd
+	.2byte	0x1b5
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF261
 	.byte	0x1
-	.2byte	0x1bd
+	.2byte	0x1b5
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x1be
+	.2byte	0x1b6
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x1be
+	.2byte	0x1b6
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3103
+	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x1bf
+	.2byte	0x1b7
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2854
 	.byte	0x1
-	.2byte	0x1c0
+	.2byte	0x1b8
 	.4byte	0xc097
 	.uleb128 0x46
-	.4byte	.LASF2937
+	.4byte	.LASF2939
 	.byte	0x1
-	.2byte	0x1c1
+	.2byte	0x1b9
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3104
+	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x190
+	.2byte	0x188
 	.byte	0x1
-	.4byte	0x126c5
+	.4byte	0x126f3
 	.uleb128 0x64
-	.4byte	.LASF3095
+	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x190
+	.2byte	0x188
 	.4byte	0xc097
 	.uleb128 0x64
-	.4byte	.LASF3096
+	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x191
+	.2byte	0x189
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3097
+	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x191
+	.2byte	0x189
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x192
-	.4byte	0xe6fb
+	.2byte	0x18a
+	.4byte	0xe707
 	.uleb128 0x46
-	.4byte	.LASF2994
+	.4byte	.LASF2996
 	.byte	0x1
-	.2byte	0x194
-	.4byte	0xe117
+	.2byte	0x18c
+	.4byte	0xe123
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x195
+	.2byte	0x18d
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x195
+	.2byte	0x18d
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2891
+	.4byte	.LASF2893
 	.byte	0x1
-	.2byte	0x196
+	.2byte	0x18e
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF261
 	.byte	0x1
-	.2byte	0x197
+	.2byte	0x18f
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3098
+	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x198
+	.2byte	0x190
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3099
+	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x198
+	.2byte	0x190
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3100
+	.4byte	.LASF3102
 	.byte	0x1
-	.2byte	0x198
+	.2byte	0x190
 	.4byte	0x4659
 	.uleb128 0x46
-	.4byte	.LASF3101
+	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x198
+	.2byte	0x190
 	.4byte	0x4659
 	.uleb128 0x46
-	.4byte	.LASF3102
+	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x199
+	.2byte	0x191
 	.4byte	0xc097
 	.uleb128 0x46
-	.4byte	.LASF3103
+	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x19a
+	.2byte	0x192
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2854
 	.byte	0x1
-	.2byte	0x19b
+	.2byte	0x193
 	.4byte	0xc097
 	.uleb128 0x46
-	.4byte	.LASF2937
+	.4byte	.LASF2939
 	.byte	0x1
-	.2byte	0x19c
+	.2byte	0x194
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3105
+	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x150
+	.2byte	0x148
 	.8byte	.LFB2809
 	.8byte	.LFE2809-.LFB2809
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12918
+	.4byte	0x12946
 	.uleb128 0x6a
-	.4byte	.LASF3095
+	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0x150
+	.2byte	0x148
 	.4byte	0xc097
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x56
-	.4byte	.LASF3096
+	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x150
+	.2byte	0x148
 	.4byte	0xaab
 	.4byte	.LLST0
 	.uleb128 0x56
-	.4byte	.LASF3097
+	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x150
+	.2byte	0x148
 	.4byte	0xaab
 	.4byte	.LLST1
 	.uleb128 0x6a
-	.4byte	.LASF3106
+	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x151
+	.2byte	0x149
 	.4byte	0xc097
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x6a
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x151
-	.4byte	0xe6fb
+	.2byte	0x149
+	.4byte	0xe707
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x46
-	.4byte	.LASF2994
+	.4byte	.LASF2996
 	.byte	0x1
-	.2byte	0x153
-	.4byte	0xe117
+	.2byte	0x14b
+	.4byte	0xe123
 	.uleb128 0x69
 	.string	"i"
 	.byte	0x1
-	.2byte	0x154
+	.2byte	0x14c
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5e
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x155
+	.2byte	0x14d
 	.4byte	0xc6
 	.uleb128 0x4c
-	.4byte	.LASF2891
+	.4byte	.LASF2893
 	.byte	0x1
-	.2byte	0x156
+	.2byte	0x14e
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x62
 	.uleb128 0x4c
 	.4byte	.LASF261
 	.byte	0x1
-	.2byte	0x157
+	.2byte	0x14f
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x57
-	.4byte	.LASF3098
+	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x158
+	.2byte	0x150
 	.4byte	0x155
 	.4byte	.LLST2
 	.uleb128 0x57
-	.4byte	.LASF3099
+	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x158
+	.2byte	0x150
 	.4byte	0x155
 	.4byte	.LLST3
 	.uleb128 0x4c
-	.4byte	.LASF3100
+	.4byte	.LASF3102
 	.byte	0x1
-	.2byte	0x159
+	.2byte	0x151
 	.4byte	0x4659
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x4c
-	.4byte	.LASF3101
+	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x159
+	.2byte	0x151
 	.4byte	0x4659
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x57
-	.4byte	.LASF3102
+	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x15a
+	.2byte	0x152
 	.4byte	0xc097
 	.4byte	.LLST4
 	.uleb128 0x4c
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0x1
-	.2byte	0x15b
+	.2byte	0x153
 	.4byte	0x10b
 	.uleb128 0x1
 	.byte	0x5d
 	.uleb128 0x4c
-	.4byte	.LASF3107
+	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x15c
+	.2byte	0x154
 	.4byte	0xc097
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x46
-	.4byte	.LASF3108
+	.4byte	.LASF3110
 	.byte	0x1
-	.2byte	0x15d
+	.2byte	0x155
 	.4byte	0x10b
 	.uleb128 0x57
 	.4byte	.LASF2854
 	.byte	0x1
-	.2byte	0x15e
+	.2byte	0x156
 	.4byte	0xc097
 	.4byte	.LLST5
 	.uleb128 0x46
-	.4byte	.LASF2937
+	.4byte	.LASF2939
 	.byte	0x1
-	.2byte	0x15f
+	.2byte	0x157
 	.4byte	0xc6
 	.uleb128 0x58
-	.4byte	0x12bbe
+	.4byte	0x12be8
 	.8byte	.LBB916
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.2byte	0x181
-	.4byte	0x12837
+	.2byte	0x179
+	.4byte	0x12865
 	.uleb128 0x54
-	.4byte	0x12be4
+	.4byte	0x12c0e
 	.uleb128 0x54
-	.4byte	0x12bd9
+	.4byte	0x12c03
 	.uleb128 0x54
-	.4byte	0x12bce
+	.4byte	0x12bf8
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0
 	.uleb128 0x5c
-	.4byte	0x12bef
+	.4byte	0x12c19
 	.uleb128 0x5f
-	.4byte	0x12bfa
+	.4byte	0x12c24
 	.4byte	.LLST6
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12bbe
+	.4byte	0x12be8
 	.8byte	.LBB919
 	.8byte	.LBE919-.LBB919
 	.byte	0x1
-	.2byte	0x17e
-	.4byte	0x12883
+	.2byte	0x176
+	.4byte	0x128b1
 	.uleb128 0x54
-	.4byte	0x12be4
+	.4byte	0x12c0e
 	.uleb128 0x54
-	.4byte	0x12bd9
+	.4byte	0x12c03
 	.uleb128 0x54
-	.4byte	0x12bce
+	.4byte	0x12bf8
 	.uleb128 0x5e
 	.8byte	.LBB920
 	.8byte	.LBE920-.LBB920
 	.uleb128 0x5c
-	.4byte	0x12bef
+	.4byte	0x12c19
 	.uleb128 0x5f
-	.4byte	0x12bfa
+	.4byte	0x12c24
 	.4byte	.LLST7
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12bbe
+	.4byte	0x12be8
 	.8byte	.LBB921
 	.8byte	.LBE921-.LBB921
 	.byte	0x1
-	.2byte	0x17f
-	.4byte	0x128cf
+	.2byte	0x177
+	.4byte	0x128fd
 	.uleb128 0x54
-	.4byte	0x12be4
+	.4byte	0x12c0e
 	.uleb128 0x54
-	.4byte	0x12bd9
+	.4byte	0x12c03
 	.uleb128 0x54
-	.4byte	0x12bce
+	.4byte	0x12bf8
 	.uleb128 0x5e
 	.8byte	.LBB922
 	.8byte	.LBE922-.LBB922
 	.uleb128 0x5c
-	.4byte	0x12bef
+	.4byte	0x12c19
 	.uleb128 0x5f
-	.4byte	0x12bfa
+	.4byte	0x12c24
 	.4byte	.LLST8
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12bbe
+	.4byte	0x12be8
 	.8byte	.LBB923
 	.8byte	.LBE923-.LBB923
 	.byte	0x1
-	.2byte	0x180
+	.2byte	0x178
 	.uleb128 0x54
-	.4byte	0x12be4
+	.4byte	0x12c0e
 	.uleb128 0x54
-	.4byte	0x12bd9
+	.4byte	0x12c03
 	.uleb128 0x54
-	.4byte	0x12bce
+	.4byte	0x12bf8
 	.uleb128 0x5e
 	.8byte	.LBB924
 	.8byte	.LBE924-.LBB924
 	.uleb128 0x5c
-	.4byte	0x12bef
+	.4byte	0x12c19
 	.uleb128 0x5f
-	.4byte	0x12bfa
+	.4byte	0x12c24
 	.4byte	.LLST9
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3109
+	.4byte	.LASF3111
 	.byte	0x1
-	.2byte	0x110
+	.2byte	0x109
 	.byte	0x1
-	.4byte	0x12a2a
+	.4byte	0x12a58
 	.uleb128 0x64
-	.4byte	.LASF3110
+	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x110
+	.2byte	0x109
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3111
+	.4byte	.LASF3113
 	.byte	0x1
-	.2byte	0x110
+	.2byte	0x109
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3112
+	.4byte	.LASF3114
 	.byte	0x1
-	.2byte	0x110
+	.2byte	0x109
 	.4byte	0xaab
 	.uleb128 0x64
-	.4byte	.LASF3106
+	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x110
+	.2byte	0x109
 	.4byte	0xc097
 	.uleb128 0x64
-	.4byte	.LASF2952
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x111
-	.4byte	0xe6fb
+	.2byte	0x10a
+	.4byte	0xe707
 	.uleb128 0x64
 	.4byte	.LASF2865
 	.byte	0x1
-	.2byte	0x111
+	.2byte	0x10a
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF2891
+	.4byte	.LASF2893
 	.byte	0x1
-	.2byte	0x113
+	.2byte	0x10c
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF261
 	.byte	0x1
-	.2byte	0x113
+	.2byte	0x10c
 	.4byte	0xc6
 	.uleb128 0x46
-	.4byte	.LASF3113
+	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x114
+	.2byte	0x10d
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3114
+	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x114
+	.2byte	0x10d
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3115
+	.4byte	.LASF3117
 	.byte	0x1
-	.2byte	0x114
+	.2byte	0x10d
 	.4byte	0x155
 	.uleb128 0x46
-	.4byte	.LASF3116
+	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x115
+	.2byte	0x10e
 	.4byte	0x4659
 	.uleb128 0x46
-	.4byte	.LASF3117
+	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x115
+	.2byte	0x10e
 	.4byte	0x4659
 	.uleb128 0x46
-	.4byte	.LASF3118
+	.4byte	.LASF3120
 	.byte	0x1
-	.2byte	0x115
+	.2byte	0x10e
 	.4byte	0x4659
 	.uleb128 0x46
-	.4byte	.LASF3108
+	.4byte	.LASF3110
 	.byte	0x1
-	.2byte	0x116
+	.2byte	0x10f
 	.4byte	0x10b
 	.uleb128 0x46
-	.4byte	.LASF3107
+	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x117
+	.2byte	0x110
 	.4byte	0xc097
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x118
+	.2byte	0x111
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"j"
 	.byte	0x1
-	.2byte	0x119
+	.2byte	0x112
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2866
 	.byte	0x1
-	.2byte	0x11a
+	.2byte	0x113
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2868
 	.byte	0x1
-	.2byte	0x11b
+	.2byte	0x114
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2867
 	.byte	0x1
-	.2byte	0x11c
+	.2byte	0x115
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF2869
 	.byte	0x1
-	.2byte	0x11d
+	.2byte	0x116
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x74
-	.4byte	.LASF3119
+	.4byte	.LASF3121
 	.byte	0x1
-	.2byte	0x102
+	.byte	0xfb
 	.8byte	.LFB2807
 	.8byte	.LFE2807-.LFB2807
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12a82
-	.uleb128 0x56
+	.4byte	0x12aac
+	.uleb128 0x75
 	.4byte	.LASF2271
 	.byte	0x1
-	.2byte	0x102
+	.byte	0xfb
 	.4byte	0x31da
 	.4byte	.LLST152
-	.uleb128 0x68
+	.uleb128 0x76
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x104
-	.4byte	0xe461
+	.byte	0xfd
+	.4byte	0xe46d
 	.4byte	.LLST153
-	.uleb128 0x46
-	.4byte	.LASF2952
+	.uleb128 0x77
+	.4byte	.LASF2954
 	.byte	0x1
-	.2byte	0x105
-	.4byte	0xe6fb
+	.byte	0xfe
+	.4byte	0xe707
 	.uleb128 0x4e
-	.8byte	.LVL650
-	.4byte	0x12a82
+	.8byte	.LVL649
+	.4byte	0x12aac
 	.byte	0
-	.uleb128 0x75
-	.4byte	.LASF3120
+	.uleb128 0x74
+	.4byte	.LASF3122
 	.byte	0x1
 	.byte	0xd2
 	.8byte	.LFB2806
 	.8byte	.LFE2806-.LFB2806
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12b8c
-	.uleb128 0x76
-	.4byte	.LASF3110
+	.4byte	0x12bb6
+	.uleb128 0x75
+	.4byte	.LASF3112
 	.byte	0x1
 	.byte	0xd2
 	.4byte	0xaab
 	.4byte	.LLST147
-	.uleb128 0x76
-	.4byte	.LASF3111
+	.uleb128 0x75
+	.4byte	.LASF3113
 	.byte	0x1
 	.byte	0xd2
 	.4byte	0xaab
 	.4byte	.LLST148
-	.uleb128 0x76
-	.4byte	.LASF3112
+	.uleb128 0x75
+	.4byte	.LASF3114
 	.byte	0x1
 	.byte	0xd2
 	.4byte	0xaab
 	.4byte	.LLST149
-	.uleb128 0x77
-	.4byte	.LASF3106
+	.uleb128 0x78
+	.4byte	.LASF3108
 	.byte	0x1
 	.byte	0xd2
 	.4byte	0xc097
 	.uleb128 0x1
 	.byte	0x53
-	.uleb128 0x76
-	.4byte	.LASF2952
+	.uleb128 0x75
+	.4byte	.LASF2954
 	.byte	0x1
 	.byte	0xd3
-	.4byte	0xe6fb
+	.4byte	0xe707
 	.4byte	.LLST150
-	.uleb128 0x77
+	.uleb128 0x78
 	.4byte	.LASF2865
 	.byte	0x1
 	.byte	0xd3
@@ -42319,79 +42392,79 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x55
 	.uleb128 0x4b
-	.4byte	.LASF2891
+	.4byte	.LASF2893
 	.byte	0x1
 	.byte	0xd5
 	.4byte	0xc6
 	.uleb128 0x1
-	.byte	0x5e
+	.byte	0x5f
 	.uleb128 0x4b
 	.4byte	.LASF261
 	.byte	0x1
 	.byte	0xd5
 	.4byte	0xc6
 	.uleb128 0x1
-	.byte	0x5a
+	.byte	0x5b
 	.uleb128 0x4b
-	.4byte	.LASF3113
+	.4byte	.LASF3115
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0x155
 	.uleb128 0x1
-	.byte	0x57
-	.uleb128 0x4b
-	.4byte	.LASF3114
+	.byte	0x58
+	.uleb128 0x79
+	.4byte	.LASF3116
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0x155
-	.uleb128 0x1
-	.byte	0x58
-	.uleb128 0x78
-	.4byte	.LASF3115
+	.4byte	.LLST151
+	.uleb128 0x4b
+	.4byte	.LASF3117
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0x155
-	.4byte	.LLST151
+	.uleb128 0x1
+	.byte	0x57
 	.uleb128 0x4b
-	.4byte	.LASF3116
+	.4byte	.LASF3118
 	.byte	0x1
 	.byte	0xd7
 	.4byte	0x4659
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x4b
-	.4byte	.LASF3117
+	.4byte	.LASF3119
 	.byte	0x1
 	.byte	0xd7
 	.4byte	0x4659
 	.uleb128 0x1
 	.byte	0x51
-	.uleb128 0x79
-	.4byte	.LASF3118
+	.uleb128 0x4b
+	.4byte	.LASF3120
 	.byte	0x1
 	.byte	0xd7
 	.4byte	0x4659
-	.uleb128 0x4b
-	.4byte	.LASF3108
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x77
+	.4byte	.LASF3110
 	.byte	0x1
 	.byte	0xd8
 	.4byte	0x10b
-	.uleb128 0x1
-	.byte	0x59
 	.uleb128 0x7a
 	.string	"i"
 	.byte	0x1
 	.byte	0xd9
 	.4byte	0xc6
 	.uleb128 0x1
-	.byte	0x5b
+	.byte	0x5c
 	.uleb128 0x7b
 	.string	"j"
 	.byte	0x1
 	.byte	0xd9
 	.4byte	0xc6
 	.uleb128 0x4b
-	.4byte	.LASF3107
+	.4byte	.LASF3109
 	.byte	0x1
 	.byte	0xda
 	.4byte	0xc097
@@ -42399,191 +42472,191 @@ __exitcall_ebc_exit:
 	.byte	0x53
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3121
+	.4byte	.LASF3123
 	.byte	0x1
 	.byte	0xb4
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x12bbe
+	.4byte	0x12be8
 	.uleb128 0x7d
 	.string	"ebc"
 	.byte	0x1
 	.byte	0xb4
-	.4byte	0xe461
+	.4byte	0xe46d
 	.uleb128 0x7e
-	.4byte	.LASF3122
+	.4byte	.LASF3124
 	.byte	0x1
 	.byte	0xb4
 	.4byte	0xc6
-	.uleb128 0x79
-	.4byte	.LASF2952
+	.uleb128 0x77
+	.4byte	.LASF2954
 	.byte	0x1
 	.byte	0xb6
-	.4byte	0xe6fb
+	.4byte	0xe707
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3123
+	.4byte	.LASF3125
 	.byte	0x1
 	.byte	0x86
 	.4byte	0x10b
 	.byte	0x3
-	.4byte	0x12c06
+	.4byte	0x12c30
 	.uleb128 0x7e
 	.4byte	.LASF2854
 	.byte	0x1
 	.byte	0x86
 	.4byte	0xc097
 	.uleb128 0x7e
-	.4byte	.LASF3098
+	.4byte	.LASF3100
 	.byte	0x1
 	.byte	0x86
 	.4byte	0x11a
 	.uleb128 0x7e
-	.4byte	.LASF3099
+	.4byte	.LASF3101
 	.byte	0x1
 	.byte	0x86
 	.4byte	0x11a
-	.uleb128 0x79
-	.4byte	.LASF3124
+	.uleb128 0x77
+	.4byte	.LASF3126
 	.byte	0x1
 	.byte	0x88
 	.4byte	0x10b
-	.uleb128 0x79
-	.4byte	.LASF3125
+	.uleb128 0x77
+	.4byte	.LASF3127
 	.byte	0x1
 	.byte	0x89
 	.4byte	0x11a
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3126
+	.4byte	.LASF3128
 	.byte	0x1
 	.byte	0x80
 	.4byte	0x10b
 	.byte	0x3
-	.4byte	0x12c38
+	.4byte	0x12c62
 	.uleb128 0x7e
 	.4byte	.LASF2854
 	.byte	0x1
 	.byte	0x80
 	.4byte	0xc097
 	.uleb128 0x7e
-	.4byte	.LASF3098
+	.4byte	.LASF3100
 	.byte	0x1
 	.byte	0x80
 	.4byte	0x11a
 	.uleb128 0x7e
-	.4byte	.LASF3099
+	.4byte	.LASF3101
 	.byte	0x1
 	.byte	0x80
 	.4byte	0x11a
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3127
+	.4byte	.LASF3129
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x12c5b
+	.4byte	0x12c85
 	.uleb128 0x7e
-	.4byte	.LASF2927
+	.4byte	.LASF2929
 	.byte	0xb
 	.byte	0x4b
-	.4byte	0xe0d7
+	.4byte	0xe0e3
 	.uleb128 0x7e
-	.4byte	.LASF2959
+	.4byte	.LASF2961
 	.byte	0xb
 	.byte	0x4b
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3128
+	.4byte	.LASF3130
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x12c89
+	.4byte	0x12cb3
 	.uleb128 0x7e
-	.4byte	.LASF2927
+	.4byte	.LASF2929
 	.byte	0xb
 	.byte	0x3c
-	.4byte	0xe0d7
+	.4byte	0xe0e3
 	.uleb128 0x7e
-	.4byte	.LASF3129
+	.4byte	.LASF3131
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13a
 	.uleb128 0x7e
-	.4byte	.LASF3130
+	.4byte	.LASF3132
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13a
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3131
+	.4byte	.LASF3133
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x12ccd
+	.4byte	0x12cf7
 	.uleb128 0x7e
-	.4byte	.LASF2927
+	.4byte	.LASF2929
 	.byte	0xb
 	.byte	0x36
-	.4byte	0xe0d7
+	.4byte	0xe0e3
 	.uleb128 0x7e
-	.4byte	.LASF3132
+	.4byte	.LASF3134
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF3133
+	.4byte	.LASF3135
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF3134
+	.4byte	.LASF3136
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.uleb128 0x7e
-	.4byte	.LASF3135
+	.4byte	.LASF3137
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3136
+	.4byte	.LASF3138
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x12ce5
+	.4byte	0x12d0f
 	.uleb128 0x7e
-	.4byte	.LASF2927
+	.4byte	.LASF2929
 	.byte	0xb
 	.byte	0x31
-	.4byte	0xe0d7
+	.4byte	0xe0e3
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3137
+	.4byte	.LASF3139
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12d0c
+	.4byte	0x12d36
 	.uleb128 0x7e
-	.4byte	.LASF2927
+	.4byte	.LASF2929
 	.byte	0xb
 	.byte	0x2c
-	.4byte	0xe0d7
+	.4byte	0xe0e3
 	.uleb128 0x7e
-	.4byte	.LASF2994
+	.4byte	.LASF2996
 	.byte	0xb
 	.byte	0x2c
-	.4byte	0xe117
+	.4byte	0xe123
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3138
+	.4byte	.LASF3140
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x12d56
+	.4byte	0x12d80
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa
@@ -42603,7 +42676,7 @@ __exitcall_ebc_exit:
 	.string	"dir"
 	.byte	0xa
 	.2byte	0x1ad
-	.4byte	0xdb3d
+	.4byte	0xdb49
 	.uleb128 0x52
 	.string	"ops"
 	.byte	0xa
@@ -42611,12 +42684,12 @@ __exitcall_ebc_exit:
 	.4byte	0xb78e
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3139
+	.4byte	.LASF3141
 	.byte	0xa
 	.2byte	0x108
 	.4byte	0xb78e
 	.byte	0x3
-	.4byte	0x12d74
+	.4byte	0x12d9e
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa
@@ -42624,12 +42697,12 @@ __exitcall_ebc_exit:
 	.4byte	0xa545
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3140
+	.4byte	.LASF3142
 	.byte	0xc8
 	.byte	0x1d
 	.4byte	0xb78e
 	.byte	0x3
-	.4byte	0x12d90
+	.4byte	0x12dba
 	.uleb128 0x7d
 	.string	"bus"
 	.byte	0xc8
@@ -42637,31 +42710,31 @@ __exitcall_ebc_exit:
 	.4byte	0xadac
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3141
+	.4byte	.LASF3143
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12dac
+	.4byte	0x12dd6
 	.uleb128 0x7e
-	.4byte	.LASF3142
+	.4byte	.LASF3144
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3143
+	.4byte	.LASF3145
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x12de5
+	.4byte	0x12e0f
 	.uleb128 0x7d
 	.string	"dev"
 	.byte	0xcb
 	.byte	0xa3
 	.4byte	0xa545
 	.uleb128 0x7e
-	.4byte	.LASF3144
+	.4byte	.LASF3146
 	.byte	0xcb
 	.byte	0xa4
 	.4byte	0x310
@@ -42671,36 +42744,36 @@ __exitcall_ebc_exit:
 	.byte	0xa5
 	.4byte	0x2ce
 	.uleb128 0x7e
-	.4byte	.LASF3145
+	.4byte	.LASF3147
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3146
+	.4byte	.LASF3148
 	.byte	0x3
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12e01
+	.4byte	0x12e2b
 	.uleb128 0x7e
-	.4byte	.LASF2928
+	.4byte	.LASF2930
 	.byte	0x3
 	.byte	0x35
-	.4byte	0xdad7
+	.4byte	0xdae3
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3147
+	.4byte	.LASF3149
 	.byte	0x3
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12e26
+	.4byte	0x12e50
 	.uleb128 0x7e
-	.4byte	.LASF2928
+	.4byte	.LASF2930
 	.byte	0x3
 	.byte	0x30
-	.4byte	0xdad7
+	.4byte	0xdae3
 	.uleb128 0x7d
 	.string	"t"
 	.byte	0x3
@@ -42708,64 +42781,64 @@ __exitcall_ebc_exit:
 	.4byte	0x4653
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3148
+	.4byte	.LASF3150
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x12e3e
+	.4byte	0x12e68
 	.uleb128 0x7e
-	.4byte	.LASF2928
+	.4byte	.LASF2930
 	.byte	0x3
 	.byte	0x2b
-	.4byte	0xdad7
+	.4byte	0xdae3
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3149
+	.4byte	.LASF3151
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x12e56
+	.4byte	0x12e80
 	.uleb128 0x7e
-	.4byte	.LASF2928
+	.4byte	.LASF2930
 	.byte	0x3
 	.byte	0x26
-	.4byte	0xdad7
+	.4byte	0xdae3
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3150
+	.4byte	.LASF3152
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x12e6e
+	.4byte	0x12e98
 	.uleb128 0x7e
-	.4byte	.LASF2928
+	.4byte	.LASF2930
 	.byte	0x3
 	.byte	0x21
-	.4byte	0xdad7
+	.4byte	0xdae3
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3151
+	.4byte	.LASF3153
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x12e86
+	.4byte	0x12eb0
 	.uleb128 0x7e
-	.4byte	.LASF2928
+	.4byte	.LASF2930
 	.byte	0x3
 	.byte	0x1c
-	.4byte	0xdad7
+	.4byte	0xdae3
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3152
+	.4byte	.LASF3154
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x12e9e
+	.4byte	0x12ec8
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x12e9e
+	.4byte	0x12ec8
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -42775,24 +42848,24 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x12ebc
+	.4byte	0x12ee6
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x12e9e
+	.4byte	0x12ec8
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3153
+	.4byte	.LASF3155
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x12ef4
+	.4byte	0x12f1e
 	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x12e9e
+	.4byte	0x12ec8
 	.uleb128 0x7e
 	.4byte	.LASF192
 	.byte	0x4
@@ -42810,12 +42883,12 @@ __exitcall_ebc_exit:
 	.4byte	0xace2
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3154
+	.4byte	.LASF3156
 	.byte	0x9
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12f23
+	.4byte	0x12f4d
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -42833,12 +42906,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3155
+	.4byte	.LASF3157
 	.byte	0x9
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12f52
+	.4byte	0x12f7c
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -42856,12 +42929,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3156
+	.4byte	.LASF3158
 	.byte	0x9
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12f81
+	.4byte	0x12fab
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -42879,12 +42952,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3157
+	.4byte	.LASF3159
 	.byte	0x9
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12fbb
+	.4byte	0x12fe5
 	.uleb128 0x7d
 	.string	"to"
 	.byte	0x9
@@ -42907,37 +42980,37 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3158
+	.4byte	.LASF3160
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x12fef
+	.4byte	0x13019
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x3091
-	.uleb128 0x79
-	.4byte	.LASF3159
+	.uleb128 0x77
+	.4byte	.LASF3161
 	.byte	0x6
 	.byte	0xf7
 	.4byte	0x443
 	.uleb128 0x66
-	.uleb128 0x79
-	.4byte	.LASF3160
+	.uleb128 0x77
+	.4byte	.LASF3162
 	.byte	0x6
 	.byte	0xfe
 	.4byte	0x155
 	.byte	0
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3161
+	.4byte	.LASF3163
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13039
+	.4byte	0x13063
 	.uleb128 0x7e
 	.4byte	.LASF1147
 	.byte	0x6
@@ -42953,26 +43026,26 @@ __exitcall_ebc_exit:
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
-	.uleb128 0x79
-	.4byte	.LASF3162
+	.uleb128 0x77
+	.4byte	.LASF3164
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x66
-	.uleb128 0x79
-	.4byte	.LASF3160
+	.uleb128 0x77
+	.4byte	.LASF3162
 	.byte	0x6
 	.byte	0x56
 	.4byte	0x155
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3163
+	.4byte	.LASF3165
 	.byte	0x12
 	.2byte	0x2e5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13063
+	.4byte	0x1308d
 	.uleb128 0x64
 	.4byte	.LASF984
 	.byte	0x12
@@ -42985,12 +43058,12 @@ __exitcall_ebc_exit:
 	.4byte	0x31b
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3164
+	.4byte	.LASF3166
 	.byte	0x12
 	.2byte	0x216
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x1309b
+	.4byte	0x130c5
 	.uleb128 0x64
 	.4byte	.LASF984
 	.byte	0x12
@@ -43010,12 +43083,12 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3165
+	.4byte	.LASF3167
 	.byte	0x12
 	.2byte	0x1dd
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x130d1
+	.4byte	0x130fb
 	.uleb128 0x64
 	.4byte	.LASF984
 	.byte	0x12
@@ -43027,18 +43100,18 @@ __exitcall_ebc_exit:
 	.2byte	0x1dd
 	.4byte	0x31b
 	.uleb128 0x46
-	.4byte	.LASF3166
+	.4byte	.LASF3168
 	.byte	0x12
 	.2byte	0x1df
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3167
+	.4byte	.LASF3169
 	.byte	0x12
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x130ef
+	.4byte	0x13119
 	.uleb128 0x64
 	.4byte	.LASF984
 	.byte	0x12
@@ -43046,12 +43119,12 @@ __exitcall_ebc_exit:
 	.4byte	0x2ce
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3168
+	.4byte	.LASF3170
 	.byte	0x12
 	.2byte	0x13d
 	.4byte	0xd772
 	.byte	0x3
-	.4byte	0x1310d
+	.4byte	0x13137
 	.uleb128 0x64
 	.4byte	.LASF170
 	.byte	0x12
@@ -43059,13 +43132,13 @@ __exitcall_ebc_exit:
 	.4byte	0x31b
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3169
+	.4byte	.LASF3171
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x13130
+	.4byte	0x1315a
 	.uleb128 0x7e
-	.4byte	.LASF3020
+	.4byte	.LASF3022
 	.byte	0xbe
 	.byte	0xdb
 	.4byte	0xd6e9
@@ -43076,79 +43149,79 @@ __exitcall_ebc_exit:
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3170
+	.4byte	.LASF3172
 	.byte	0xbe
 	.byte	0xd6
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x1314c
+	.4byte	0x13176
 	.uleb128 0x7e
-	.4byte	.LASF3020
+	.4byte	.LASF3022
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x1314c
+	.4byte	0x13176
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xd641
 	.uleb128 0x62
-	.4byte	.LASF3171
+	.4byte	.LASF3173
 	.byte	0xa3
 	.2byte	0x164
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13170
+	.4byte	0x1319a
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x13170
+	.4byte	0x1319a
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc092
 	.uleb128 0x62
-	.4byte	.LASF3172
+	.4byte	.LASF3174
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x131ab
+	.4byte	0x131d5
 	.uleb128 0x63
 	.string	"np"
 	.byte	0xe
 	.2byte	0x498
 	.4byte	0xbc8f
 	.uleb128 0x64
-	.4byte	.LASF3173
+	.4byte	.LASF3175
 	.byte	0xe
 	.2byte	0x499
 	.4byte	0x56
 	.uleb128 0x64
-	.4byte	.LASF3174
+	.4byte	.LASF3176
 	.byte	0xe
 	.2byte	0x49a
 	.4byte	0xaab
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3175
+	.4byte	.LASF3177
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x131f7
+	.4byte	0x13221
 	.uleb128 0x63
 	.string	"np"
 	.byte	0xe
 	.2byte	0x1ef
 	.4byte	0xbc8f
 	.uleb128 0x64
-	.4byte	.LASF3173
+	.4byte	.LASF3175
 	.byte	0xe
 	.2byte	0x1f0
 	.4byte	0x56
 	.uleb128 0x64
-	.4byte	.LASF3176
+	.4byte	.LASF3178
 	.byte	0xe
 	.2byte	0x1f1
 	.4byte	0xaab
@@ -43164,11 +43237,11 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3177
+	.4byte	.LASF3179
 	.byte	0xe
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x1320f
+	.4byte	0x13239
 	.uleb128 0x7e
 	.4byte	.LASF865
 	.byte	0xe
@@ -43176,11 +43249,11 @@ __exitcall_ebc_exit:
 	.4byte	0xb869
 	.byte	0
 	.uleb128 0x65
-	.4byte	.LASF3178
+	.4byte	.LASF3180
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x13235
+	.4byte	0x1325f
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -43193,12 +43266,12 @@ __exitcall_ebc_exit:
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3179
+	.4byte	.LASF3181
 	.byte	0x2
 	.2byte	0x49b
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13253
+	.4byte	0x1327d
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -43206,12 +43279,12 @@ __exitcall_ebc_exit:
 	.4byte	0xbaff
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3180
+	.4byte	.LASF3182
 	.byte	0x2
 	.2byte	0x2c5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x13289
+	.4byte	0x132b3
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -43229,12 +43302,12 @@ __exitcall_ebc_exit:
 	.4byte	0x31b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3181
+	.4byte	.LASF3183
 	.byte	0xf
 	.byte	0xca
 	.4byte	0x33c
 	.byte	0x3
-	.4byte	0x132a5
+	.4byte	0x132cf
 	.uleb128 0x7d
 	.string	"res"
 	.byte	0xf
@@ -43242,12 +43315,12 @@ __exitcall_ebc_exit:
 	.4byte	0xc1a3
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3182
+	.4byte	.LASF3184
 	.byte	0xcc
 	.byte	0x22
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x132c1
+	.4byte	0x132eb
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xcc
@@ -43255,12 +43328,12 @@ __exitcall_ebc_exit:
 	.4byte	0x3091
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3183
+	.4byte	.LASF3185
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x132dd
+	.4byte	0x13307
 	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xcd
@@ -43268,12 +43341,12 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3184
+	.4byte	.LASF3186
 	.byte	0xd
 	.2byte	0x23e
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x132fb
+	.4byte	0x13325
 	.uleb128 0x64
 	.4byte	.LASF2271
 	.byte	0xd
@@ -43281,12 +43354,12 @@ __exitcall_ebc_exit:
 	.4byte	0x31da
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3185
+	.4byte	.LASF3187
 	.byte	0xd
 	.2byte	0x203
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x13324
+	.4byte	0x1334e
 	.uleb128 0x63
 	.string	"wq"
 	.byte	0xd
@@ -43299,29 +43372,29 @@ __exitcall_ebc_exit:
 	.4byte	0x31da
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3186
+	.4byte	.LASF3188
 	.byte	0xd
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x13347
+	.4byte	0x13371
 	.uleb128 0x7e
 	.4byte	.LASF2271
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0x31da
 	.uleb128 0x7e
-	.4byte	.LASF3187
+	.4byte	.LASF3189
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3188
+	.4byte	.LASF3190
 	.byte	0x51
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13363
+	.4byte	0x1338d
 	.uleb128 0x63
 	.string	"m"
 	.byte	0x51
@@ -43329,12 +43402,12 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x62
-	.4byte	.LASF3189
+	.4byte	.LASF3191
 	.byte	0x51
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x1337f
+	.4byte	0x133a9
 	.uleb128 0x63
 	.string	"m"
 	.byte	0x51
@@ -43342,24 +43415,24 @@ __exitcall_ebc_exit:
 	.4byte	0x74
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3190
+	.4byte	.LASF3192
 	.byte	0xca
 	.byte	0x8a
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x133bb
+	.4byte	0x133e5
 	.uleb128 0x7e
 	.4byte	.LASF1147
 	.byte	0xca
 	.byte	0x8a
 	.4byte	0x3091
 	.uleb128 0x7e
-	.4byte	.LASF3191
+	.4byte	.LASF3193
 	.byte	0xca
 	.byte	0x8a
 	.4byte	0x2ce
 	.uleb128 0x7e
-	.4byte	.LASF3192
+	.4byte	.LASF3194
 	.byte	0xca
 	.byte	0x8a
 	.4byte	0x29b
@@ -43370,11 +43443,11 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3193
+	.4byte	.LASF3195
 	.byte	0xca
 	.byte	0x84
 	.byte	0x3
-	.4byte	0x133eb
+	.4byte	0x13415
 	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xca
@@ -43386,19 +43459,19 @@ __exitcall_ebc_exit:
 	.byte	0x84
 	.4byte	0x29
 	.uleb128 0x66
-	.uleb128 0x79
-	.4byte	.LASF3194
+	.uleb128 0x77
+	.4byte	.LASF3196
 	.byte	0xca
 	.byte	0x86
 	.4byte	0xc6
 	.byte	0
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3195
+	.4byte	.LASF3197
 	.byte	0xca
 	.byte	0x73
 	.byte	0x3
-	.4byte	0x13417
+	.4byte	0x13441
 	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xca
@@ -43410,25 +43483,25 @@ __exitcall_ebc_exit:
 	.byte	0x73
 	.4byte	0x29
 	.uleb128 0x7e
-	.4byte	.LASF3196
+	.4byte	.LASF3198
 	.byte	0xca
 	.byte	0x74
 	.4byte	0x29b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3197
+	.4byte	.LASF3199
 	.byte	0xca
 	.byte	0x52
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1343d
+	.4byte	0x13467
 	.uleb128 0x7d
 	.string	"ti"
 	.byte	0xca
 	.byte	0x52
-	.4byte	0x1343d
+	.4byte	0x13467
 	.uleb128 0x7e
-	.4byte	.LASF3198
+	.4byte	.LASF3200
 	.byte	0xca
 	.byte	0x52
 	.4byte	0xc6
@@ -43437,24 +43510,24 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.4byte	0xc1e
 	.uleb128 0x7c
-	.4byte	.LASF3199
+	.4byte	.LASF3201
 	.byte	0x5
 	.byte	0xf
 	.4byte	0x2eda
 	.byte	0x3
-	.4byte	0x1345f
-	.uleb128 0x79
-	.4byte	.LASF3200
+	.4byte	0x13489
+	.uleb128 0x77
+	.4byte	.LASF3202
 	.byte	0x5
 	.byte	0x11
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3201
+	.4byte	.LASF3203
 	.byte	0x10
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x134a3
+	.4byte	0x134cd
 	.uleb128 0x7e
 	.4byte	.LASF959
 	.byte	0x10
@@ -43465,9 +43538,9 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x13496
+	.4byte	0x134c0
 	.uleb128 0x22
-	.4byte	.LASF3089
+	.4byte	.LASF3091
 	.byte	0x10
 	.byte	0x1c
 	.4byte	0x3b7
@@ -43475,27 +43548,27 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x1230c
+	.4byte	0x1233a
 	.byte	0
 	.uleb128 0x7b
 	.string	"__u"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x13477
+	.4byte	0x134a1
 	.byte	0
 	.byte	0
 	.uleb128 0x80
-	.4byte	.LASF3273
+	.4byte	.LASF3275
 	.byte	0x20
 	.2byte	0x126
 	.byte	0x3
 	.uleb128 0x7c
-	.4byte	.LASF3202
+	.4byte	.LASF3204
 	.byte	0xce
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x134c7
+	.4byte	0x134f1
 	.uleb128 0x7d
 	.string	"n"
 	.byte	0xce
@@ -43503,12 +43576,12 @@ __exitcall_ebc_exit:
 	.4byte	0x155
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3203
+	.4byte	.LASF3205
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xdd
 	.byte	0x3
-	.4byte	0x134f9
+	.4byte	0x13523
 	.uleb128 0x7e
 	.4byte	.LASF2453
 	.byte	0x8
@@ -43519,19 +43592,19 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x9a
 	.4byte	0xc6
-	.uleb128 0x79
+	.uleb128 0x77
 	.4byte	.LASF260
 	.byte	0x8
 	.byte	0x9c
 	.4byte	0x8b
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3204
+	.4byte	.LASF3206
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1351f
+	.4byte	0x13549
 	.uleb128 0x7d
 	.string	"nr"
 	.byte	0x7
@@ -43541,17 +43614,17 @@ __exitcall_ebc_exit:
 	.4byte	.LASF1147
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x1351f
+	.4byte	0x13549
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x3a
 	.uleb128 0x7f
-	.4byte	.LASF3205
+	.4byte	.LASF3207
 	.byte	0x11
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x13558
+	.4byte	0x13582
 	.uleb128 0x7d
 	.string	"i"
 	.byte	0x11
@@ -43561,7 +43634,7 @@ __exitcall_ebc_exit:
 	.string	"v"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13558
+	.4byte	0x13582
 	.uleb128 0x7b
 	.string	"w0"
 	.byte	0x11
@@ -43571,18 +43644,18 @@ __exitcall_ebc_exit:
 	.string	"x1"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13558
+	.4byte	0x13582
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x367
 	.uleb128 0x7c
-	.4byte	.LASF3206
+	.4byte	.LASF3208
 	.byte	0xcf
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13578
+	.4byte	0x135a2
 	.uleb128 0x7d
 	.string	"x"
 	.byte	0xcf
@@ -43590,12 +43663,12 @@ __exitcall_ebc_exit:
 	.4byte	0xef
 	.byte	0
 	.uleb128 0x7c
-	.4byte	.LASF3207
+	.4byte	.LASF3209
 	.byte	0xd0
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13594
+	.4byte	0x135be
 	.uleb128 0x7e
 	.4byte	.LASF2486
 	.byte	0xd0
@@ -43603,16 +43676,16 @@ __exitcall_ebc_exit:
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3208
+	.4byte	.LASF3210
 	.byte	0xd1
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x135b5
+	.4byte	0x135df
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd1
 	.byte	0xb
-	.4byte	0x135b5
+	.4byte	0x135df
 	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xd1
@@ -43621,21 +43694,21 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x135bd
+	.4byte	0x135e7
 	.uleb128 0x81
 	.uleb128 0x3
-	.4byte	0x135bb
+	.4byte	0x135e5
 	.uleb128 0x7f
-	.4byte	.LASF3209
+	.4byte	.LASF3211
 	.byte	0xd1
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x135e3
+	.4byte	0x1360d
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd1
 	.byte	0x9
-	.4byte	0x135b5
+	.4byte	0x135df
 	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xd1
@@ -43643,16 +43716,16 @@ __exitcall_ebc_exit:
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0x7f
-	.4byte	.LASF3210
+	.4byte	.LASF3212
 	.byte	0xc
 	.byte	0xe4
 	.byte	0x3
-	.4byte	0x1360f
+	.4byte	0x13639
 	.uleb128 0x7d
 	.string	"p"
 	.byte	0xc
 	.byte	0xe4
-	.4byte	0x1360f
+	.4byte	0x13639
 	.uleb128 0x7d
 	.string	"res"
 	.byte	0xc
@@ -43666,759 +43739,759 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x135bb
+	.4byte	0x135e5
 	.uleb128 0x82
-	.4byte	0x125ef
+	.4byte	0x1261d
 	.8byte	.LFB2846
 	.8byte	.LFE2846-.LFB2846
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13755
+	.4byte	0x1377f
 	.uleb128 0x71
-	.4byte	0x125fc
+	.4byte	0x1262a
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x12608
+	.4byte	0x12636
 	.4byte	.LLST99
 	.uleb128 0x6f
-	.4byte	0x12614
+	.4byte	0x12642
 	.4byte	.LLST100
 	.uleb128 0x54
-	.4byte	0x12620
+	.4byte	0x1264e
 	.uleb128 0x54
-	.4byte	0x12620
+	.4byte	0x1264e
 	.uleb128 0x54
-	.4byte	0x12620
+	.4byte	0x1264e
 	.uleb128 0x5c
-	.4byte	0x1262c
+	.4byte	0x1265a
 	.uleb128 0x60
-	.4byte	0x12638
+	.4byte	0x12666
 	.uleb128 0x1
 	.byte	0x5c
 	.uleb128 0x5c
-	.4byte	0x12642
+	.4byte	0x12670
 	.uleb128 0x60
-	.4byte	0x1264c
+	.4byte	0x1267a
 	.uleb128 0x1
 	.byte	0x5f
 	.uleb128 0x5c
-	.4byte	0x12658
+	.4byte	0x12686
 	.uleb128 0x5f
-	.4byte	0x12664
+	.4byte	0x12692
 	.4byte	.LLST101
 	.uleb128 0x5f
-	.4byte	0x12670
+	.4byte	0x1269e
 	.4byte	.LLST102
 	.uleb128 0x5f
-	.4byte	0x1267c
+	.4byte	0x126aa
 	.4byte	.LLST103
 	.uleb128 0x5f
-	.4byte	0x12688
+	.4byte	0x126b6
 	.4byte	.LLST104
 	.uleb128 0x5f
-	.4byte	0x12694
+	.4byte	0x126c2
 	.4byte	.LLST105
 	.uleb128 0x5f
-	.4byte	0x126a0
+	.4byte	0x126ce
 	.4byte	.LLST106
 	.uleb128 0x60
-	.4byte	0x126ac
+	.4byte	0x126da
 	.uleb128 0x1
 	.byte	0x55
 	.uleb128 0x5c
-	.4byte	0x126b8
+	.4byte	0x126e6
 	.uleb128 0x58
-	.4byte	0x12c06
+	.4byte	0x12c30
 	.8byte	.LBB1212
 	.4byte	.Ldebug_ranges0+0x700
 	.byte	0x1
-	.2byte	0x1ae
-	.4byte	0x136e0
+	.2byte	0x1a6
+	.4byte	0x1370a
 	.uleb128 0x54
-	.4byte	0x12c2c
+	.4byte	0x12c56
 	.uleb128 0x54
-	.4byte	0x12c21
+	.4byte	0x12c4b
 	.uleb128 0x54
-	.4byte	0x12c16
+	.4byte	0x12c40
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12c06
+	.4byte	0x12c30
 	.8byte	.LBB1217
 	.4byte	.Ldebug_ranges0+0x750
 	.byte	0x1
-	.2byte	0x1af
-	.4byte	0x13708
+	.2byte	0x1a7
+	.4byte	0x13732
 	.uleb128 0x54
-	.4byte	0x12c2c
+	.4byte	0x12c56
 	.uleb128 0x54
-	.4byte	0x12c21
+	.4byte	0x12c4b
 	.uleb128 0x54
-	.4byte	0x12c16
+	.4byte	0x12c40
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12c06
+	.4byte	0x12c30
 	.8byte	.LBB1229
 	.4byte	.Ldebug_ranges0+0x7c0
 	.byte	0x1
-	.2byte	0x1b0
-	.4byte	0x13730
+	.2byte	0x1a8
+	.4byte	0x1375a
 	.uleb128 0x54
-	.4byte	0x12c2c
+	.4byte	0x12c56
 	.uleb128 0x54
-	.4byte	0x12c21
+	.4byte	0x12c4b
 	.uleb128 0x54
-	.4byte	0x12c16
+	.4byte	0x12c40
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x12c06
+	.4byte	0x12c30
 	.8byte	.LBB1241
 	.4byte	.Ldebug_ranges0+0x830
 	.byte	0x1
-	.2byte	0x1b1
+	.2byte	0x1a9
 	.uleb128 0x54
-	.4byte	0x12c2c
+	.4byte	0x12c56
 	.uleb128 0x54
-	.4byte	0x12c21
+	.4byte	0x12c4b
 	.uleb128 0x54
-	.4byte	0x12c16
+	.4byte	0x12c40
 	.byte	0
 	.byte	0
 	.uleb128 0x82
-	.4byte	0x12519
+	.4byte	0x12547
 	.8byte	.LFB2847
 	.8byte	.LFE2847-.LFB2847
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13913
+	.4byte	0x1393d
 	.uleb128 0x71
-	.4byte	0x12526
+	.4byte	0x12554
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x12532
+	.4byte	0x12560
 	.4byte	.LLST107
 	.uleb128 0x6f
-	.4byte	0x1253e
+	.4byte	0x1256c
 	.4byte	.LLST108
 	.uleb128 0x54
-	.4byte	0x1254a
+	.4byte	0x12578
 	.uleb128 0x54
-	.4byte	0x1254a
+	.4byte	0x12578
 	.uleb128 0x54
-	.4byte	0x1254a
+	.4byte	0x12578
 	.uleb128 0x5c
-	.4byte	0x12556
+	.4byte	0x12584
 	.uleb128 0x5f
-	.4byte	0x12562
+	.4byte	0x12590
 	.4byte	.LLST109
 	.uleb128 0x5f
-	.4byte	0x1256e
+	.4byte	0x1259c
 	.4byte	.LLST110
 	.uleb128 0x60
-	.4byte	0x1257a
+	.4byte	0x125a8
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x60
-	.4byte	0x12586
+	.4byte	0x125b4
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5f
-	.4byte	0x12592
+	.4byte	0x125c0
 	.4byte	.LLST111
 	.uleb128 0x60
-	.4byte	0x1259e
+	.4byte	0x125cc
 	.uleb128 0x1
 	.byte	0x5f
 	.uleb128 0x60
-	.4byte	0x125aa
+	.4byte	0x125d8
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x60
-	.4byte	0x125b6
+	.4byte	0x125e4
 	.uleb128 0x1
 	.byte	0x5c
 	.uleb128 0x5c
-	.4byte	0x125c0
+	.4byte	0x125ee
 	.uleb128 0x5f
-	.4byte	0x125ca
+	.4byte	0x125f8
 	.4byte	.LLST112
 	.uleb128 0x60
-	.4byte	0x125d6
+	.4byte	0x12604
 	.uleb128 0x1
 	.byte	0x55
 	.uleb128 0x5c
-	.4byte	0x125e2
+	.4byte	0x12610
 	.uleb128 0x58
-	.4byte	0x12bbe
+	.4byte	0x12be8
 	.8byte	.LBB1252
 	.4byte	.Ldebug_ranges0+0x880
 	.byte	0x1
-	.2byte	0x1d6
-	.4byte	0x13832
+	.2byte	0x1ce
+	.4byte	0x1385c
 	.uleb128 0x54
-	.4byte	0x12be4
+	.4byte	0x12c0e
 	.uleb128 0x54
-	.4byte	0x12bd9
+	.4byte	0x12c03
 	.uleb128 0x54
-	.4byte	0x12bce
+	.4byte	0x12bf8
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0x880
 	.uleb128 0x5c
-	.4byte	0x12bef
+	.4byte	0x12c19
 	.uleb128 0x5f
-	.4byte	0x12bfa
+	.4byte	0x12c24
 	.4byte	.LLST113
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12bbe
+	.4byte	0x12be8
 	.8byte	.LBB1255
 	.8byte	.LBE1255-.LBB1255
 	.byte	0x1
-	.2byte	0x1d3
-	.4byte	0x1387e
+	.2byte	0x1cb
+	.4byte	0x138a8
 	.uleb128 0x54
-	.4byte	0x12be4
+	.4byte	0x12c0e
 	.uleb128 0x54
-	.4byte	0x12bd9
+	.4byte	0x12c03
 	.uleb128 0x54
-	.4byte	0x12bce
+	.4byte	0x12bf8
 	.uleb128 0x5e
 	.8byte	.LBB1256
 	.8byte	.LBE1256-.LBB1256
 	.uleb128 0x5c
-	.4byte	0x12bef
+	.4byte	0x12c19
 	.uleb128 0x5f
-	.4byte	0x12bfa
+	.4byte	0x12c24
 	.4byte	.LLST114
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12bbe
+	.4byte	0x12be8
 	.8byte	.LBB1257
 	.8byte	.LBE1257-.LBB1257
 	.byte	0x1
-	.2byte	0x1d4
-	.4byte	0x138ca
+	.2byte	0x1cc
+	.4byte	0x138f4
 	.uleb128 0x54
-	.4byte	0x12be4
+	.4byte	0x12c0e
 	.uleb128 0x54
-	.4byte	0x12bd9
+	.4byte	0x12c03
 	.uleb128 0x54
-	.4byte	0x12bce
+	.4byte	0x12bf8
 	.uleb128 0x5e
 	.8byte	.LBB1258
 	.8byte	.LBE1258-.LBB1258
 	.uleb128 0x5c
-	.4byte	0x12bef
+	.4byte	0x12c19
 	.uleb128 0x5f
-	.4byte	0x12bfa
+	.4byte	0x12c24
 	.4byte	.LLST115
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12bbe
+	.4byte	0x12be8
 	.8byte	.LBB1259
 	.8byte	.LBE1259-.LBB1259
 	.byte	0x1
-	.2byte	0x1d5
+	.2byte	0x1cd
 	.uleb128 0x54
-	.4byte	0x12be4
+	.4byte	0x12c0e
 	.uleb128 0x54
-	.4byte	0x12bd9
+	.4byte	0x12c03
 	.uleb128 0x54
-	.4byte	0x12bce
+	.4byte	0x12bf8
 	.uleb128 0x5e
 	.8byte	.LBB1260
 	.8byte	.LBE1260-.LBB1260
 	.uleb128 0x5c
-	.4byte	0x12bef
+	.4byte	0x12c19
 	.uleb128 0x5f
-	.4byte	0x12bfa
+	.4byte	0x12c24
 	.4byte	.LLST116
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x124e1
+	.4byte	0x1250f
 	.8byte	.LFB2848
 	.8byte	.LFE2848-.LFB2848
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13a16
+	.4byte	0x13a40
 	.uleb128 0x6f
-	.4byte	0x124ee
+	.4byte	0x1251c
 	.4byte	.LLST117
 	.uleb128 0x54
-	.4byte	0x124fa
+	.4byte	0x12528
 	.uleb128 0x5c
-	.4byte	0x12506
+	.4byte	0x12534
 	.uleb128 0x58
-	.4byte	0x12d0c
+	.4byte	0x12d36
 	.8byte	.LBB1262
 	.4byte	.Ldebug_ranges0+0x8b0
 	.byte	0x1
-	.2byte	0x1e4
-	.4byte	0x13994
+	.2byte	0x1dc
+	.4byte	0x139be
 	.uleb128 0x54
-	.4byte	0x12d3d
+	.4byte	0x12d67
 	.uleb128 0x54
-	.4byte	0x12d31
+	.4byte	0x12d5b
 	.uleb128 0x54
-	.4byte	0x12d25
+	.4byte	0x12d4f
 	.uleb128 0x54
-	.4byte	0x12d19
+	.4byte	0x12d43
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0x8b0
 	.uleb128 0x5c
-	.4byte	0x12d49
+	.4byte	0x12d73
 	.uleb128 0x5d
-	.4byte	0x12d56
+	.4byte	0x12d80
 	.8byte	.LBB1264
 	.4byte	.Ldebug_ranges0+0x900
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x54
-	.4byte	0x12d67
+	.4byte	0x12d91
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12c89
+	.4byte	0x12cb3
 	.8byte	.LBB1273
 	.4byte	.Ldebug_ranges0+0x930
 	.byte	0x1
-	.2byte	0x1e5
-	.4byte	0x139c6
+	.2byte	0x1dd
+	.4byte	0x139f0
 	.uleb128 0x54
-	.4byte	0x12cc1
+	.4byte	0x12ceb
 	.uleb128 0x54
-	.4byte	0x12cb6
+	.4byte	0x12ce0
 	.uleb128 0x54
-	.4byte	0x12cab
+	.4byte	0x12cd5
 	.uleb128 0x54
-	.4byte	0x12ca0
+	.4byte	0x12cca
 	.uleb128 0x54
-	.4byte	0x12c95
+	.4byte	0x12cbf
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12c5b
+	.4byte	0x12c85
 	.8byte	.LBB1279
 	.8byte	.LBE1279-.LBB1279
 	.byte	0x1
-	.2byte	0x1e6
-	.4byte	0x139f2
+	.2byte	0x1de
+	.4byte	0x13a1c
 	.uleb128 0x54
-	.4byte	0x12c7d
+	.4byte	0x12ca7
 	.uleb128 0x54
-	.4byte	0x12c72
+	.4byte	0x12c9c
 	.uleb128 0x54
-	.4byte	0x12c67
+	.4byte	0x12c91
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12c38
+	.4byte	0x12c62
 	.8byte	.LBB1281
 	.8byte	.LBE1281-.LBB1281
 	.byte	0x1
-	.2byte	0x1e7
+	.2byte	0x1df
 	.uleb128 0x54
-	.4byte	0x12c4f
+	.4byte	0x12c79
 	.uleb128 0x54
-	.4byte	0x12c44
+	.4byte	0x12c6e
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12b8c
+	.4byte	0x12bb6
 	.8byte	.LFB2849
 	.8byte	.LFE2849-.LFB2849
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13ad5
+	.4byte	0x13aff
 	.uleb128 0x6f
-	.4byte	0x12b9c
+	.4byte	0x12bc6
 	.4byte	.LLST120
 	.uleb128 0x6f
-	.4byte	0x12ba7
+	.4byte	0x12bd1
 	.4byte	.LLST121
 	.uleb128 0x5c
-	.4byte	0x12bb2
+	.4byte	0x12bdc
 	.uleb128 0x70
-	.4byte	0x12ea4
+	.4byte	0x12ece
 	.8byte	.LBB1305
 	.8byte	.LBE1305-.LBB1305
 	.byte	0x1
 	.byte	0xbc
-	.4byte	0x13a77
+	.4byte	0x13aa1
 	.uleb128 0x54
-	.4byte	0x12eb0
+	.4byte	0x12eda
 	.uleb128 0x4e
 	.8byte	.LVL435
-	.4byte	0x13e73
+	.4byte	0x13e9d
 	.byte	0
 	.uleb128 0x6e
-	.4byte	0x12ce5
+	.4byte	0x12d0f
 	.8byte	.LBB1307
 	.4byte	.Ldebug_ranges0+0x9e0
 	.byte	0x1
 	.byte	0xbf
-	.4byte	0x13a99
+	.4byte	0x13ac3
 	.uleb128 0x54
-	.4byte	0x12d00
+	.4byte	0x12d2a
 	.uleb128 0x54
-	.4byte	0x12cf5
+	.4byte	0x12d1f
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12e6e
+	.4byte	0x12e98
 	.8byte	.LBB1311
 	.8byte	.LBE1311-.LBB1311
 	.byte	0x1
 	.byte	0xc0
-	.4byte	0x13aba
+	.4byte	0x13ae4
 	.uleb128 0x54
-	.4byte	0x12e7a
+	.4byte	0x12ea4
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL434
-	.4byte	0x13e2c
+	.4byte	0x13e56
 	.uleb128 0x4e
 	.8byte	.LVL438
-	.4byte	0x13bb0
+	.4byte	0x13bda
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x12b8c
+	.4byte	0x12bb6
 	.8byte	.LFB2853
 	.8byte	.LFE2853-.LFB2853
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13b98
+	.4byte	0x13bc2
 	.uleb128 0x6f
-	.4byte	0x12b9c
+	.4byte	0x12bc6
 	.4byte	.LLST145
 	.uleb128 0x5c
-	.4byte	0x12bb2
+	.4byte	0x12bdc
 	.uleb128 0x54
-	.4byte	0x12ba7
+	.4byte	0x12bd1
 	.uleb128 0x6e
-	.4byte	0x12e56
+	.4byte	0x12e80
 	.8byte	.LBB1671
 	.4byte	.Ldebug_ranges0+0xec0
 	.byte	0x1
 	.byte	0xc6
-	.4byte	0x13b21
+	.4byte	0x13b4b
 	.uleb128 0x54
-	.4byte	0x12e62
+	.4byte	0x12e8c
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12ccd
+	.4byte	0x12cf7
 	.8byte	.LBB1675
 	.8byte	.LBE1675-.LBB1675
 	.byte	0x1
 	.byte	0xc7
-	.4byte	0x13b42
+	.4byte	0x13b6c
 	.uleb128 0x54
-	.4byte	0x12cd9
+	.4byte	0x12d03
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12e86
+	.4byte	0x12eb0
 	.8byte	.LBB1677
 	.8byte	.LBE1677-.LBB1677
 	.byte	0x1
 	.byte	0xca
-	.4byte	0x13b70
+	.4byte	0x13b9a
 	.uleb128 0x54
-	.4byte	0x12e92
+	.4byte	0x12ebc
 	.uleb128 0x4e
 	.8byte	.LVL624
-	.4byte	0x13e08
+	.4byte	0x13e32
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL618
-	.4byte	0x13e2c
+	.4byte	0x13e56
 	.uleb128 0x4e
 	.8byte	.LVL621
-	.4byte	0x13bb0
+	.4byte	0x13bda
 	.uleb128 0x4e
 	.8byte	.LVL625
-	.4byte	0x13bb0
+	.4byte	0x13bda
 	.byte	0
 	.uleb128 0x84
-	.4byte	.LASF3211
-	.4byte	.LASF3211
+	.4byte	.LASF3213
+	.4byte	.LASF3213
 	.byte	0xbe
 	.byte	0xcc
 	.uleb128 0x84
-	.4byte	.LASF3212
-	.4byte	.LASF3212
+	.4byte	.LASF3214
+	.4byte	.LASF3214
 	.byte	0xbe
 	.byte	0xca
 	.uleb128 0x85
-	.4byte	.LASF3213
-	.4byte	.LASF3213
+	.4byte	.LASF3215
+	.4byte	.LASF3215
 	.byte	0x2
 	.2byte	0x5d1
 	.uleb128 0x84
-	.4byte	.LASF3214
-	.4byte	.LASF3214
+	.4byte	.LASF3216
+	.4byte	.LASF3216
 	.byte	0xac
 	.byte	0x4f
 	.uleb128 0x85
-	.4byte	.LASF3215
-	.4byte	.LASF3215
+	.4byte	.LASF3217
+	.4byte	.LASF3217
 	.byte	0x2
 	.2byte	0x2bf
 	.uleb128 0x85
-	.4byte	.LASF3216
-	.4byte	.LASF3216
+	.4byte	.LASF3218
+	.4byte	.LASF3218
 	.byte	0xe
 	.2byte	0x149
 	.uleb128 0x85
-	.4byte	.LASF3217
-	.4byte	.LASF3217
+	.4byte	.LASF3219
+	.4byte	.LASF3219
 	.byte	0xe
 	.2byte	0x172
 	.uleb128 0x84
-	.4byte	.LASF3218
-	.4byte	.LASF3218
+	.4byte	.LASF3220
+	.4byte	.LASF3220
 	.byte	0xd2
 	.byte	0x78
 	.uleb128 0x84
-	.4byte	.LASF3219
-	.4byte	.LASF3219
+	.4byte	.LASF3221
+	.4byte	.LASF3221
 	.byte	0xaa
 	.byte	0x59
 	.uleb128 0x84
-	.4byte	.LASF3220
-	.4byte	.LASF3220
+	.4byte	.LASF3222
+	.4byte	.LASF3222
 	.byte	0xc3
 	.byte	0x2f
 	.uleb128 0x86
-	.4byte	.LASF3221
-	.4byte	.LASF3221
+	.4byte	.LASF3223
+	.4byte	.LASF3223
 	.uleb128 0x84
-	.4byte	.LASF3221
-	.4byte	.LASF3221
+	.4byte	.LASF3223
+	.4byte	.LASF3223
 	.byte	0xd3
 	.byte	0x36
 	.uleb128 0x85
-	.4byte	.LASF3222
-	.4byte	.LASF3222
+	.4byte	.LASF3224
+	.4byte	.LASF3224
 	.byte	0x2
 	.2byte	0x5cb
 	.uleb128 0x84
-	.4byte	.LASF3223
-	.4byte	.LASF3223
+	.4byte	.LASF3225
+	.4byte	.LASF3225
 	.byte	0xc2
 	.byte	0x30
 	.uleb128 0x84
-	.4byte	.LASF3224
-	.4byte	.LASF3224
+	.4byte	.LASF3226
+	.4byte	.LASF3226
 	.byte	0xc2
 	.byte	0x31
 	.uleb128 0x84
-	.4byte	.LASF3225
-	.4byte	.LASF3225
+	.4byte	.LASF3227
+	.4byte	.LASF3227
 	.byte	0xab
 	.byte	0x9
 	.uleb128 0x85
-	.4byte	.LASF3226
-	.4byte	.LASF3226
+	.4byte	.LASF3228
+	.4byte	.LASF3228
 	.byte	0x48
 	.2byte	0x6b8
 	.uleb128 0x85
-	.4byte	.LASF3227
-	.4byte	.LASF3227
+	.4byte	.LASF3229
+	.4byte	.LASF3229
 	.byte	0x48
 	.2byte	0x676
 	.uleb128 0x84
-	.4byte	.LASF3228
-	.4byte	.LASF3228
+	.4byte	.LASF3230
+	.4byte	.LASF3230
 	.byte	0x9c
 	.byte	0x67
 	.uleb128 0x84
-	.4byte	.LASF3229
-	.4byte	.LASF3229
+	.4byte	.LASF3231
+	.4byte	.LASF3231
 	.byte	0x54
 	.byte	0x53
 	.uleb128 0x84
-	.4byte	.LASF3230
-	.4byte	.LASF3230
+	.4byte	.LASF3232
+	.4byte	.LASF3232
 	.byte	0x54
 	.byte	0xa5
 	.uleb128 0x84
-	.4byte	.LASF3231
-	.4byte	.LASF3231
+	.4byte	.LASF3233
+	.4byte	.LASF3233
 	.byte	0xc3
 	.byte	0x2b
 	.uleb128 0x84
-	.4byte	.LASF3232
-	.4byte	.LASF3232
+	.4byte	.LASF3234
+	.4byte	.LASF3234
 	.byte	0xc3
 	.byte	0x27
 	.uleb128 0x85
-	.4byte	.LASF3233
-	.4byte	.LASF3233
+	.4byte	.LASF3235
+	.4byte	.LASF3235
 	.byte	0x12
 	.2byte	0x184
 	.uleb128 0x84
-	.4byte	.LASF3234
-	.4byte	.LASF3234
+	.4byte	.LASF3236
+	.4byte	.LASF3236
 	.byte	0xd4
 	.byte	0x4d
 	.uleb128 0x85
-	.4byte	.LASF3235
-	.4byte	.LASF3235
+	.4byte	.LASF3237
+	.4byte	.LASF3237
 	.byte	0x20
 	.2byte	0x1d9
 	.uleb128 0x86
-	.4byte	.LASF3236
-	.4byte	.LASF3236
+	.4byte	.LASF3238
+	.4byte	.LASF3238
 	.uleb128 0x84
-	.4byte	.LASF3237
-	.4byte	.LASF3237
+	.4byte	.LASF3239
+	.4byte	.LASF3239
 	.byte	0x12
 	.byte	0xb9
 	.uleb128 0x84
-	.4byte	.LASF3238
-	.4byte	.LASF3238
+	.4byte	.LASF3240
+	.4byte	.LASF3240
 	.byte	0x3
 	.byte	0x3b
 	.uleb128 0x84
-	.4byte	.LASF3239
-	.4byte	.LASF3239
+	.4byte	.LASF3241
+	.4byte	.LASF3241
 	.byte	0x3a
 	.byte	0xc2
 	.uleb128 0x84
-	.4byte	.LASF3240
-	.4byte	.LASF3240
+	.4byte	.LASF3242
+	.4byte	.LASF3242
 	.byte	0xac
 	.byte	0x4e
 	.uleb128 0x85
-	.4byte	.LASF3241
-	.4byte	.LASF3241
+	.4byte	.LASF3243
+	.4byte	.LASF3243
 	.byte	0x2
 	.2byte	0x287
 	.uleb128 0x84
-	.4byte	.LASF3242
-	.4byte	.LASF3242
+	.4byte	.LASF3244
+	.4byte	.LASF3244
 	.byte	0xbf
 	.byte	0x38
 	.uleb128 0x85
-	.4byte	.LASF3243
-	.4byte	.LASF3243
+	.4byte	.LASF3245
+	.4byte	.LASF3245
 	.byte	0xa3
 	.2byte	0x379
 	.uleb128 0x86
-	.4byte	.LASF3244
-	.4byte	.LASF3244
+	.4byte	.LASF3246
+	.4byte	.LASF3246
 	.uleb128 0x85
-	.4byte	.LASF3245
-	.4byte	.LASF3245
+	.4byte	.LASF3247
+	.4byte	.LASF3247
 	.byte	0x20
 	.2byte	0x1c7
 	.uleb128 0x85
-	.4byte	.LASF3246
-	.4byte	.LASF3246
+	.4byte	.LASF3248
+	.4byte	.LASF3248
 	.byte	0x20
 	.2byte	0x17e
 	.uleb128 0x84
-	.4byte	.LASF3247
-	.4byte	.LASF3247
+	.4byte	.LASF3249
+	.4byte	.LASF3249
 	.byte	0x3
 	.byte	0x3a
 	.uleb128 0x84
-	.4byte	.LASF3248
-	.4byte	.LASF3248
+	.4byte	.LASF3250
+	.4byte	.LASF3250
 	.byte	0xc2
 	.byte	0x32
 	.uleb128 0x84
-	.4byte	.LASF3249
-	.4byte	.LASF3249
+	.4byte	.LASF3251
+	.4byte	.LASF3251
 	.byte	0xc3
 	.byte	0x2c
 	.uleb128 0x85
-	.4byte	.LASF3250
-	.4byte	.LASF3250
+	.4byte	.LASF3252
+	.4byte	.LASF3252
 	.byte	0x76
 	.2byte	0xa07
 	.uleb128 0x84
-	.4byte	.LASF3251
-	.4byte	.LASF3251
+	.4byte	.LASF3253
+	.4byte	.LASF3253
 	.byte	0x48
 	.byte	0xdc
 	.uleb128 0x85
-	.4byte	.LASF3252
-	.4byte	.LASF3252
+	.4byte	.LASF3254
+	.4byte	.LASF3254
 	.byte	0x3a
 	.2byte	0x459
 	.uleb128 0x84
-	.4byte	.LASF3253
-	.4byte	.LASF3253
+	.4byte	.LASF3255
+	.4byte	.LASF3255
 	.byte	0x3a
 	.byte	0xe9
 	.uleb128 0x85
-	.4byte	.LASF3254
-	.4byte	.LASF3254
+	.4byte	.LASF3256
+	.4byte	.LASF3256
 	.byte	0x3a
 	.2byte	0x45a
 	.uleb128 0x85
-	.4byte	.LASF3255
-	.4byte	.LASF3255
+	.4byte	.LASF3257
+	.4byte	.LASF3257
 	.byte	0x6
 	.2byte	0x19f
 	.uleb128 0x85
-	.4byte	.LASF3256
-	.4byte	.LASF3256
-	.byte	0x6
-	.2byte	0x199
-	.uleb128 0x84
-	.4byte	.LASF3257
-	.4byte	.LASF3257
-	.byte	0xc3
-	.byte	0x25
-	.uleb128 0x84
 	.4byte	.LASF3258
 	.4byte	.LASF3258
-	.byte	0xc3
-	.byte	0x2a
+	.byte	0x6
+	.2byte	0x199
 	.uleb128 0x84
 	.4byte	.LASF3259
 	.4byte	.LASF3259
 	.byte	0xc3
-	.byte	0x24
+	.byte	0x25
 	.uleb128 0x84
 	.4byte	.LASF3260
 	.4byte	.LASF3260
 	.byte	0xc3
-	.byte	0x23
+	.byte	0x2a
 	.uleb128 0x84
 	.4byte	.LASF3261
 	.4byte	.LASF3261
-	.byte	0x9c
-	.byte	0x73
+	.byte	0xc3
+	.byte	0x24
 	.uleb128 0x84
 	.4byte	.LASF3262
 	.4byte	.LASF3262
 	.byte	0xc3
-	.byte	0x29
+	.byte	0x23
 	.uleb128 0x84
 	.4byte	.LASF3263
 	.4byte	.LASF3263
-	.byte	0xc3
-	.byte	0x26
+	.byte	0x9c
+	.byte	0x73
 	.uleb128 0x84
 	.4byte	.LASF3264
 	.4byte	.LASF3264
-	.byte	0xc4
-	.byte	0x64
+	.byte	0xc3
+	.byte	0x29
 	.uleb128 0x84
 	.4byte	.LASF3265
 	.4byte	.LASF3265
+	.byte	0xc3
+	.byte	0x26
+	.uleb128 0x84
+	.4byte	.LASF3266
+	.4byte	.LASF3266
+	.byte	0xc4
+	.byte	0x66
+	.uleb128 0x84
+	.4byte	.LASF3267
+	.4byte	.LASF3267
 	.byte	0xc2
 	.byte	0x33
 	.uleb128 0x85
-	.4byte	.LASF3266
-	.4byte	.LASF3266
+	.4byte	.LASF3268
+	.4byte	.LASF3268
 	.byte	0xd
 	.2byte	0x1d6
 	.uleb128 0x87
@@ -44427,18 +44500,18 @@ __exitcall_ebc_exit:
 	.byte	0x78
 	.byte	0x2c
 	.uleb128 0x84
-	.4byte	.LASF3267
-	.4byte	.LASF3267
+	.4byte	.LASF3269
+	.4byte	.LASF3269
 	.byte	0x78
 	.byte	0x27
 	.uleb128 0x84
-	.4byte	.LASF3268
-	.4byte	.LASF3268
+	.4byte	.LASF3270
+	.4byte	.LASF3270
 	.byte	0x1e
 	.byte	0xb0
 	.uleb128 0x84
-	.4byte	.LASF3269
-	.4byte	.LASF3269
+	.4byte	.LASF3271
+	.4byte	.LASF3271
 	.byte	0x9c
 	.byte	0x71
 	.byte	0
@@ -45939,7 +46012,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x3a
 	.uleb128 0xb
 	.uleb128 0x3b
-	.uleb128 0x5
+	.uleb128 0xb
 	.uleb128 0x27
 	.uleb128 0x19
 	.uleb128 0x11
@@ -45955,35 +46028,25 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x75
-	.uleb128 0x2e
-	.byte	0x1
-	.uleb128 0x3f
-	.uleb128 0x19
+	.uleb128 0x5
+	.byte	0
 	.uleb128 0x3
 	.uleb128 0xe
 	.uleb128 0x3a
 	.uleb128 0xb
 	.uleb128 0x3b
 	.uleb128 0xb
-	.uleb128 0x27
-	.uleb128 0x19
-	.uleb128 0x11
-	.uleb128 0x1
-	.uleb128 0x12
-	.uleb128 0x7
-	.uleb128 0x40
-	.uleb128 0x18
-	.uleb128 0x2117
-	.uleb128 0x19
-	.uleb128 0x1
+	.uleb128 0x49
 	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
 	.byte	0
 	.byte	0
 	.uleb128 0x76
-	.uleb128 0x5
+	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
-	.uleb128 0xe
+	.uleb128 0x8
 	.uleb128 0x3a
 	.uleb128 0xb
 	.uleb128 0x3b
@@ -45995,7 +46058,7 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x77
-	.uleb128 0x5
+	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
 	.uleb128 0xe
@@ -46005,12 +46068,10 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.uleb128 0x49
 	.uleb128 0x13
-	.uleb128 0x2
-	.uleb128 0x18
 	.byte	0
 	.byte	0
 	.uleb128 0x78
-	.uleb128 0x34
+	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
 	.uleb128 0xe
@@ -46021,7 +46082,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x49
 	.uleb128 0x13
 	.uleb128 0x2
-	.uleb128 0x17
+	.uleb128 0x18
 	.byte	0
 	.byte	0
 	.uleb128 0x79
@@ -46035,6 +46096,8 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.uleb128 0x49
 	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
 	.byte	0
 	.byte	0
 	.uleb128 0x7a
@@ -47668,374 +47731,464 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	0
 .LLST154:
+	.8byte	.LVL650
 	.8byte	.LVL651
-	.8byte	.LVL652
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST155:
-	.8byte	.LVL653
-	.8byte	.LVL660
+	.8byte	.LVL652
+	.8byte	.LVL659
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL664
+	.8byte	.LVL663
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST156:
-	.8byte	.LVL655
-	.8byte	.LVL663
+	.8byte	.LVL654
+	.8byte	.LVL662
 	.2byte	0x1
 	.byte	0x6b
+	.8byte	.LVL663
 	.8byte	.LVL664
-	.8byte	.LVL665
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL665
-	.8byte	.LVL675
+	.8byte	.LVL664
+	.8byte	.LVL674
 	.2byte	0x1
 	.byte	0x6b
+	.8byte	.LVL674
 	.8byte	.LVL675
-	.8byte	.LVL676
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL676
-	.8byte	.LVL683
+	.8byte	.LVL675
+	.8byte	.LVL682
 	.2byte	0x1
 	.byte	0x6b
+	.8byte	.LVL682
 	.8byte	.LVL683
-	.8byte	.LVL684
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL684
-	.8byte	.LVL699
+	.8byte	.LVL683
+	.8byte	.LVL709
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL699
-	.8byte	.LVL700
+	.8byte	.LVL709
+	.8byte	.LVL710
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL700
-	.8byte	.LVL748
+	.8byte	.LVL710
+	.8byte	.LVL757
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL748
-	.8byte	.LVL749
+	.8byte	.LVL757
+	.8byte	.LVL758
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL749
+	.8byte	.LVL758
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x6b
 	.8byte	0
 	.8byte	0
 .LLST157:
-	.8byte	.LVL655
-	.8byte	.LVL661
-	.2byte	0x1
-	.byte	0x66
-	.8byte	.LVL664
-	.8byte	.LVL731
+	.8byte	.LVL654
+	.8byte	.LVL660
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL731
-	.8byte	.LVL732
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL732
+	.8byte	.LVL663
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
 .LLST158:
-	.8byte	.LVL654
-	.8byte	.LVL662
+	.8byte	.LVL653
+	.8byte	.LVL661
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL664
+	.8byte	.LVL663
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
 .LLST159:
-	.8byte	.LVL655
-	.8byte	.LVL662
+	.8byte	.LVL654
+	.8byte	.LVL661
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL663
+	.8byte	.LVL735
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL739
+	.8byte	.LVL763
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL664
 	.8byte	.LVL765
+	.8byte	.LVL774
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL771
+	.8byte	.LVL780
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST172:
-	.8byte	.LVL745
-	.8byte	.LVL746
+.LLST174:
+	.8byte	.LVL747
+	.8byte	.LVL748
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL767
-	.8byte	.LVL768-1
+	.8byte	.LVL776
+	.8byte	.LVL777-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST170:
-	.8byte	.LVL736
-	.8byte	.LVL737
+.LLST162:
+	.8byte	.LVL725
+	.8byte	.LVL726
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL760
-	.8byte	.LVL761-1
+	.8byte	.LVL752
+	.8byte	.LVL753-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST161:
+	.8byte	.LVL665
 	.8byte	.LVL666
-	.8byte	.LVL667
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL707
-	.8byte	.LVL708-1
+	.8byte	.LVL712
+	.8byte	.LVL713-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST160:
+	.8byte	.LVL654
 	.8byte	.LVL655
-	.8byte	.LVL656
 	.2byte	0x1
 	.byte	0x50
+	.8byte	.LVL667
 	.8byte	.LVL668
-	.8byte	.LVL669
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL671
-	.8byte	.LVL672-1
+	.8byte	.LVL670
+	.8byte	.LVL671-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST162:
-	.8byte	.LVL694
-	.8byte	.LVL695-1
+.LLST163:
+	.8byte	.LVL693
+	.8byte	.LVL694-1
 	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL704
-	.8byte	.LVL705-1
+	.byte	0x55
+	.8byte	.LVL702
+	.8byte	.LVL704-1
 	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL716
-	.8byte	.LVL722
+	.byte	0x55
+	.8byte	.LVL730
+	.8byte	.LVL737
 	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL724
-	.8byte	.LVL725
+	.byte	0x55
+	.8byte	.LVL739
+	.8byte	.LVL740
 	.2byte	0x1
-	.byte	0x54
+	.byte	0x55
+	.8byte	.LVL758
+	.8byte	.LVL760-1
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL780
+	.8byte	.LVL782-1
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL786
+	.8byte	.LVL787-1
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST164:
+	.8byte	.LVL654
+	.8byte	.LVL661
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL663
+	.8byte	.LVL689
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL693
+	.8byte	.LVL719
+	.2byte	0x1
+	.byte	0x69
 	.8byte	.LVL728
-	.8byte	.LVL729
+	.8byte	.LVL740
 	.2byte	0x1
-	.byte	0x54
+	.byte	0x69
+	.8byte	.LVL744
 	.8byte	.LVL750
-	.8byte	.LVL751-1
 	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL771
-	.8byte	.LVL773-1
+	.byte	0x69
+	.8byte	.LVL757
+	.8byte	.LVL774
 	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL779
-	.8byte	.LVL780-1
+	.byte	0x69
+	.8byte	.LVL780
+	.8byte	.LFE2819
 	.2byte	0x1
-	.byte	0x54
+	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST163:
-	.8byte	.LVL722
-	.8byte	.LVL723
+.LLST165:
+	.8byte	.LVL736
+	.8byte	.LVL738
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL726
-	.8byte	.LVL727
+	.8byte	.LVL763
+	.8byte	.LVL764
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST164:
-	.8byte	.LVL694
-	.8byte	.LVL695-1
+.LLST166:
+	.8byte	.LVL693
+	.8byte	.LVL694-1
 	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL704
-	.8byte	.LVL705-1
+	.byte	0x58
+	.8byte	.LVL702
+	.8byte	.LVL704-1
 	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL721
-	.8byte	.LVL729
+	.byte	0x58
+	.8byte	.LVL734
+	.8byte	.LVL740
 	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL750
-	.8byte	.LVL751-1
+	.byte	0x58
+	.8byte	.LVL758
+	.8byte	.LVL760-1
 	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL771
-	.8byte	.LVL773-1
+	.byte	0x58
+	.8byte	.LVL763
+	.8byte	.LVL765
 	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL779
-	.8byte	.LVL780-1
+	.byte	0x58
+	.8byte	.LVL780
+	.8byte	.LVL782-1
 	.2byte	0x1
-	.byte	0x54
+	.byte	0x58
+	.8byte	.LVL786
+	.8byte	.LVL787-1
+	.2byte	0x1
+	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST165:
-	.8byte	.LVL694
-	.8byte	.LVL695-1
-	.2byte	0x1
-	.byte	0x5e
-	.8byte	.LVL704
-	.8byte	.LVL705-1
+.LLST167:
+	.8byte	.LVL693
+	.8byte	.LVL694-1
 	.2byte	0x1
-	.byte	0x5e
-	.8byte	.LVL720
-	.8byte	.LVL729
+	.byte	0x55
+	.8byte	.LVL702
+	.8byte	.LVL704-1
 	.2byte	0x1
-	.byte	0x5e
-	.8byte	.LVL750
-	.8byte	.LVL751-1
+	.byte	0x55
+	.8byte	.LVL734
+	.8byte	.LVL740
 	.2byte	0x1
-	.byte	0x5e
-	.8byte	.LVL771
-	.8byte	.LVL773-1
+	.byte	0x55
+	.8byte	.LVL758
+	.8byte	.LVL760-1
 	.2byte	0x1
-	.byte	0x5e
-	.8byte	.LVL779
-	.8byte	.LVL780-1
+	.byte	0x55
+	.8byte	.LVL763
+	.8byte	.LVL765
 	.2byte	0x1
-	.byte	0x5e
-	.8byte	0
-	.8byte	0
-.LLST166:
-	.8byte	.LVL721
-	.8byte	.LVL729
+	.byte	0x55
+	.8byte	.LVL780
+	.8byte	.LVL782-1
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL771
-	.8byte	.LVL772
+	.byte	0x55
+	.8byte	.LVL786
+	.8byte	.LVL787-1
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST167:
-	.8byte	.LVL694
-	.8byte	.LVL695-1
+.LLST168:
+	.8byte	.LVL693
+	.8byte	.LVL694-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL704
-	.8byte	.LVL705-1
+	.8byte	.LVL702
+	.8byte	.LVL704-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL719
-	.8byte	.LVL729
+	.8byte	.LVL733
+	.8byte	.LVL740
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL750
-	.8byte	.LVL751-1
+	.8byte	.LVL758
+	.8byte	.LVL760-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL771
-	.8byte	.LVL773-1
+	.8byte	.LVL763
+	.8byte	.LVL765
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL779
-	.8byte	.LVL780-1
+	.8byte	.LVL780
+	.8byte	.LVL782-1
+	.2byte	0x1
+	.byte	0x60
+	.8byte	.LVL786
+	.8byte	.LVL787-1
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST168:
-	.8byte	.LVL694
-	.8byte	.LVL695-1
+.LLST169:
+	.8byte	.LVL734
+	.8byte	.LVL740
 	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL704
-	.8byte	.LVL705-1
+	.byte	0x50
+	.8byte	.LVL763
+	.8byte	.LVL765
 	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL717
-	.8byte	.LVL729
+	.byte	0x50
+	.8byte	.LVL780
+	.8byte	.LVL781
 	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL750
-	.8byte	.LVL751-1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST170:
+	.8byte	.LVL693
+	.8byte	.LVL694-1
 	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL771
-	.8byte	.LVL773-1
+	.byte	0x62
+	.8byte	.LVL702
+	.8byte	.LVL704-1
 	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL779
-	.8byte	.LVL780-1
+	.byte	0x62
+	.8byte	.LVL733
+	.8byte	.LVL740
 	.2byte	0x1
-	.byte	0x5a
+	.byte	0x62
+	.8byte	.LVL758
+	.8byte	.LVL760-1
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL763
+	.8byte	.LVL765
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL780
+	.8byte	.LVL782-1
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL786
+	.8byte	.LVL787-1
+	.2byte	0x1
+	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST169:
-	.8byte	.LVL694
-	.8byte	.LVL695-1
+.LLST171:
+	.8byte	.LVL693
+	.8byte	.LVL694-1
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL704
-	.8byte	.LVL705-1
+	.byte	0x5c
+	.8byte	.LVL702
+	.8byte	.LVL704-1
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL718
-	.8byte	.LVL729
+	.byte	0x5c
+	.8byte	.LVL731
+	.8byte	.LVL740
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL750
-	.8byte	.LVL751-1
+	.byte	0x5c
+	.8byte	.LVL758
+	.8byte	.LVL760-1
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL771
-	.8byte	.LVL773-1
+	.byte	0x5c
+	.8byte	.LVL763
+	.8byte	.LVL765
 	.2byte	0x1
-	.byte	0x61
-	.8byte	.LVL779
-	.8byte	.LVL780-1
+	.byte	0x5c
+	.8byte	.LVL780
+	.8byte	.LVL782-1
 	.2byte	0x1
-	.byte	0x61
+	.byte	0x5c
+	.8byte	.LVL786
+	.8byte	.LVL787-1
+	.2byte	0x1
+	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST171:
-	.8byte	.LVL701
-	.8byte	.LVL702-1
+.LLST172:
+	.8byte	.LVL654
+	.8byte	.LVL660
 	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL739
-	.8byte	.LVL740-1
+	.byte	0x65
+	.8byte	.LVL663
+	.8byte	.LVL686
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL693
+	.8byte	.LVL695
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL699
+	.8byte	.LVL703
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL707
+	.8byte	.LVL717
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL732
+	.8byte	.LVL740
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL757
+	.8byte	.LVL759
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL763
+	.8byte	.LVL765
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL780
+	.8byte	.LVL784
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL786
+	.8byte	.LFE2819
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST173:
+	.8byte	.LVL690
+	.8byte	.LVL691-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL741
-	.8byte	.LVL742
+	.8byte	.LVL719
+	.8byte	.LVL720-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL754
-	.8byte	.LVL755
+	.8byte	.LVL741
+	.8byte	.LVL742-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL775
-	.8byte	.LVL776-1
+	.8byte	.LVL743
+	.8byte	.LVL744
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
@@ -48095,10 +48248,10 @@ __exitcall_ebc_exit:
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL399
-	.8byte	.LVL403
+	.8byte	.LVL402
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL404
+	.8byte	.LVL403
 	.8byte	.LVL407
 	.2byte	0x1
 	.byte	0x64
@@ -48267,25 +48420,25 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.8byte	0
 .LLST152:
+	.8byte	.LVL645
 	.8byte	.LVL646
-	.8byte	.LVL647
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST153:
+	.8byte	.LVL647
 	.8byte	.LVL648
-	.8byte	.LVL649
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST147:
 	.8byte	.LVL633
-	.8byte	.LVL644
+	.8byte	.LVL643
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL644
+	.8byte	.LVL643
 	.8byte	.LFE2806
 	.2byte	0x1
 	.byte	0x50
@@ -48293,10 +48446,10 @@ __exitcall_ebc_exit:
 	.8byte	0
 .LLST148:
 	.8byte	.LVL633
-	.8byte	.LVL643
+	.8byte	.LVL641
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL644
+	.8byte	.LVL643
 	.8byte	.LFE2806
 	.2byte	0x1
 	.byte	0x51
@@ -48304,10 +48457,10 @@ __exitcall_ebc_exit:
 	.8byte	0
 .LLST149:
 	.8byte	.LVL633
-	.8byte	.LVL640
+	.8byte	.LVL642
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL641
+	.8byte	.LVL643
 	.8byte	.LFE2806
 	.2byte	0x1
 	.byte	0x52
@@ -48318,7 +48471,7 @@ __exitcall_ebc_exit:
 	.8byte	.LVL638
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL645
+	.8byte	.LVL644
 	.8byte	.LFE2806
 	.2byte	0x1
 	.byte	0x54
@@ -48326,7 +48479,7 @@ __exitcall_ebc_exit:
 	.8byte	0
 .LLST151:
 	.8byte	.LVL639
-	.8byte	.LVL642
+	.8byte	.LVL640
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
@@ -49177,42 +49330,42 @@ __exitcall_ebc_exit:
 	.8byte	.LBE1712
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1720
-	.8byte	.LBE1720
-	.8byte	.LBB1726
-	.8byte	.LBE1726
-	.8byte	.LBB1727
-	.8byte	.LBE1727
-	.8byte	.LBB1728
-	.8byte	.LBE1728
-	.8byte	.LBB1729
-	.8byte	.LBE1729
+	.8byte	.LBB1722
+	.8byte	.LBE1722
+	.8byte	.LBB1743
+	.8byte	.LBE1743
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1730
-	.8byte	.LBE1730
-	.8byte	.LBB1744
-	.8byte	.LBE1744
+	.8byte	.LBB1724
+	.8byte	.LBE1724
+	.8byte	.LBB1725
+	.8byte	.LBE1725
+	.8byte	.LBB1726
+	.8byte	.LBE1726
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1732
-	.8byte	.LBE1732
+	.8byte	.LBB1727
+	.8byte	.LBE1727
 	.8byte	.LBB1733
 	.8byte	.LBE1733
 	.8byte	.LBB1734
 	.8byte	.LBE1734
+	.8byte	.LBB1735
+	.8byte	.LBE1735
+	.8byte	.LBB1744
+	.8byte	.LBE1744
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1740
-	.8byte	.LBE1740
-	.8byte	.LBB1745
-	.8byte	.LBE1745
+	.8byte	.LBB1739
+	.8byte	.LBE1739
+	.8byte	.LBB1747
+	.8byte	.LBE1747
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1741
+	.8byte	.LBE1741
 	.8byte	.LBB1742
 	.8byte	.LBE1742
-	.8byte	.LBB1743
-	.8byte	.LBE1743
 	.8byte	0
 	.8byte	0
 	.8byte	.Ltext0
@@ -49244,7 +49397,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_REQ_IDLE"
 .LASF2378:
 	.string	"suppliers"
-.LASF3036:
+.LASF3038:
 	.string	"ebc_buffer_manage_init"
 .LASF2877:
 	.string	"EPD_FULL_GCC16"
@@ -49256,7 +49409,7 @@ __exitcall_ebc_exit:
 	.string	"PE_SIZE_PUD"
 .LASF2588:
 	.string	"__tracepoint_page_ref_mod"
-.LASF2964:
+.LASF2966:
 	.string	"full_mode_num"
 .LASF1040:
 	.string	"nr_wakeups"
@@ -49302,7 +49455,7 @@ __exitcall_ebc_exit:
 	.string	"dev_kobj"
 .LASF472:
 	.string	"d_release"
-.LASF3140:
+.LASF3142:
 	.string	"get_arch_dma_ops"
 .LASF304:
 	.string	"__ctors_start"
@@ -49310,11 +49463,11 @@ __exitcall_ebc_exit:
 	.string	"state"
 .LASF521:
 	.string	"s_d_op"
-.LASF2954:
+.LASF2956:
 	.string	"ebc_buffer_vir"
 .LASF906:
 	.string	"node_states"
-.LASF2898:
+.LASF2900:
 	.string	"pmic_power_req"
 .LASF898:
 	.string	"hrtimer_resolution"
@@ -49336,7 +49489,7 @@ __exitcall_ebc_exit:
 	.string	"si_code"
 .LASF646:
 	.string	"thread_node"
-.LASF3086:
+.LASF3088:
 	.string	"temperature"
 .LASF1299:
 	.string	"map_pages"
@@ -49370,15 +49523,15 @@ __exitcall_ebc_exit:
 	.string	"system_wq"
 .LASF601:
 	.string	"rcu_read_lock_nesting"
-.LASF2983:
+.LASF2985:
 	.string	"suspend_lock"
 .LASF2527:
 	.string	"gpio_desc"
 .LASF959:
 	.string	"list"
-.LASF3157:
+.LASF3159:
 	.string	"_copy_from_user"
-.LASF3183:
+.LASF3185:
 	.string	"get_order"
 .LASF942:
 	.string	"si_errno"
@@ -49402,7 +49555,7 @@ __exitcall_ebc_exit:
 	.string	"trace_events"
 .LASF1340:
 	.string	"env_start"
-.LASF2907:
+.LASF2909:
 	.string	"DMA_FROM_DEVICE"
 .LASF753:
 	.string	"cpu_number"
@@ -49412,7 +49565,7 @@ __exitcall_ebc_exit:
 	.string	"mm_rb"
 .LASF2184:
 	.string	"freeze_late"
-.LASF3055:
+.LASF3057:
 	.string	"buf_info"
 .LASF406:
 	.string	"d_inode"
@@ -49426,7 +49579,7 @@ __exitcall_ebc_exit:
 	.string	"locked"
 .LASF72:
 	.string	"exitcall_t"
-.LASF2939:
+.LASF2941:
 	.string	"regs"
 .LASF1034:
 	.string	"slice_max"
@@ -49436,7 +49589,7 @@ __exitcall_ebc_exit:
 	.string	"n_node"
 .LASF1621:
 	.string	"qsize_t"
-.LASF3180:
+.LASF3182:
 	.string	"devm_kzalloc"
 .LASF377:
 	.string	"sequence"
@@ -49472,7 +49625,7 @@ __exitcall_ebc_exit:
 	.string	"param_ops_uint"
 .LASF888:
 	.string	"softirq_activated"
-.LASF3020:
+.LASF3022:
 	.string	"pdev"
 .LASF824:
 	.string	"system_long_wq"
@@ -49496,7 +49649,7 @@ __exitcall_ebc_exit:
 	.string	"c_true"
 .LASF1575:
 	.string	"notifier_call"
-.LASF3062:
+.LASF3064:
 	.string	"ebc_exit"
 .LASF1830:
 	.string	"gendisk"
@@ -49522,7 +49675,7 @@ __exitcall_ebc_exit:
 	.string	"size_t"
 .LASF208:
 	.string	"compat_elf_hwcap"
-.LASF3252:
+.LASF3254:
 	.string	"prepare_to_wait_event"
 .LASF1107:
 	.string	"cap_permitted"
@@ -49564,7 +49717,7 @@ __exitcall_ebc_exit:
 	.string	"__reserved"
 .LASF937:
 	.string	"_sigfault"
-.LASF3112:
+.LASF3114:
 	.string	"image_bg"
 .LASF2855:
 	.string	"ebc_buf_status"
@@ -49604,7 +49757,7 @@ __exitcall_ebc_exit:
 	.string	"delayed_call"
 .LASF917:
 	.string	"_status"
-.LASF2896:
+.LASF2898:
 	.string	"pmic_name"
 .LASF1461:
 	.string	"NR_FREE_CMA_PAGES"
@@ -49616,11 +49769,11 @@ __exitcall_ebc_exit:
 	.string	"bin_attribute"
 .LASF1600:
 	.string	"percpu_counter"
-.LASF2985:
+.LASF2987:
 	.string	"first_in"
 .LASF2326:
 	.string	"dev_groups"
-.LASF2946:
+.LASF2948:
 	.string	"image_addr_set"
 .LASF300:
 	.string	"__softirqentry_text_start"
@@ -49654,9 +49807,9 @@ __exitcall_ebc_exit:
 	.string	"irqchip_fwnode_ops"
 .LASF1611:
 	.string	"dq_id"
-.LASF3107:
+.LASF3109:
 	.string	"frame_count_tmp"
-.LASF3111:
+.LASF3113:
 	.string	"image_fb"
 .LASF1786:
 	.string	"write_end"
@@ -49664,7 +49817,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ION_HEAP_POOL"
 .LASF1421:
 	.string	"sysctl_protected_hardlinks"
-.LASF3256:
+.LASF3258:
 	.string	"__arch_copy_from_user"
 .LASF1174:
 	.string	"scan_objects"
@@ -49672,7 +49825,7 @@ __exitcall_ebc_exit:
 	.string	"pageset"
 .LASF1235:
 	.string	"wb_err"
-.LASF3154:
+.LASF3156:
 	.string	"copy_to_user"
 .LASF732:
 	.string	"trace_recursion"
@@ -49686,7 +49839,7 @@ __exitcall_ebc_exit:
 	.string	"jit_keyring"
 .LASF168:
 	.string	"file_disp"
-.LASF2961:
+.LASF2963:
 	.string	"auto_need_refresh"
 .LASF2843:
 	.string	"WF_TYPE_GRAY2"
@@ -49764,11 +49917,11 @@ __exitcall_ebc_exit:
 	.string	"latch_tree_node"
 .LASF1152:
 	.string	"cad_pid"
-.LASF2935:
+.LASF2937:
 	.string	"lgonl"
 .LASF532:
 	.string	"destroy_work"
-.LASF3071:
+.LASF3073:
 	.string	"one_buffer_end"
 .LASF253:
 	.string	"FTR_LOWER_SAFE"
@@ -49784,7 +49937,7 @@ __exitcall_ebc_exit:
 	.string	"pcpu_chosen_fc"
 .LASF388:
 	.string	"dentry_stat_t"
-.LASF3205:
+.LASF3207:
 	.string	"atomic_add"
 .LASF1640:
 	.string	"dqi_bgrace"
@@ -49802,7 +49955,7 @@ __exitcall_ebc_exit:
 	.string	"ctl_table"
 .LASF43:
 	.string	"uid_t"
-.LASF3234:
+.LASF3236:
 	.string	"strstr"
 .LASF2845:
 	.string	"WF_TYPE_A2"
@@ -49822,7 +49975,7 @@ __exitcall_ebc_exit:
 	.string	"write"
 .LASF2592:
 	.string	"__tracepoint_page_ref_freeze"
-.LASF2925:
+.LASF2927:
 	.string	"panel_buffer"
 .LASF314:
 	.string	"__exception_text_end"
@@ -49864,7 +50017,7 @@ __exitcall_ebc_exit:
 	.string	"pteval_t"
 .LASF427:
 	.string	"i_ino"
-.LASF3273:
+.LASF3275:
 	.string	"might_fault"
 .LASF1559:
 	.string	"compact_cached_free_pfn"
@@ -49872,7 +50025,7 @@ __exitcall_ebc_exit:
 	.string	"index"
 .LASF2201:
 	.string	"driver_data"
-.LASF2933:
+.LASF2935:
 	.string	"sdck"
 .LASF2806:
 	.string	"module_kset"
@@ -49982,7 +50135,7 @@ __exitcall_ebc_exit:
 	.string	"pidfd_fops"
 .LASF1914:
 	.string	"lm_put_owner"
-.LASF3238:
+.LASF3240:
 	.string	"ebc_pmic_verity_vcom"
 .LASF2521:
 	.string	"set_sda"
@@ -50048,7 +50201,7 @@ __exitcall_ebc_exit:
 	.string	"func"
 .LASF1138:
 	.string	"perf_event_context"
-.LASF2996:
+.LASF2998:
 	.string	"ebc_auto_task"
 .LASF93:
 	.string	"printk_delay_msec"
@@ -50080,7 +50233,7 @@ __exitcall_ebc_exit:
 	.string	"request_key_auth"
 .LASF1951:
 	.string	"destroy_inode"
-.LASF2958:
+.LASF2960:
 	.string	"is_busy_now"
 .LASF57:
 	.string	"irq_hw_number_t"
@@ -50090,7 +50243,7 @@ __exitcall_ebc_exit:
 	.string	"upid"
 .LASF1096:
 	.string	"completion"
-.LASF3069:
+.LASF3071:
 	.string	"old_prev_buf"
 .LASF1497:
 	.string	"NR_GPU_HEAP"
@@ -50104,13 +50257,13 @@ __exitcall_ebc_exit:
 	.string	"__con_initcall_end"
 .LASF1143:
 	.string	"active_uprobe"
-.LASF2999:
+.LASF3001:
 	.string	"ebc_poweroff_wq"
 .LASF1969:
 	.string	"show_options"
 .LASF2140:
 	.string	"uevent_helper"
-.LASF3040:
+.LASF3042:
 	.string	"lut_buffer_phy"
 .LASF109:
 	.string	"mmap_supported_flags"
@@ -50190,13 +50343,13 @@ __exitcall_ebc_exit:
 	.string	"RPM_SUSPENDED"
 .LASF695:
 	.string	"reclaim_state"
-.LASF3272:
+.LASF3274:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF137:
 	.string	"vendor_panic_cb"
-.LASF3064:
+.LASF3066:
 	.string	"ebc_vdd_power_timeout"
-.LASF3126:
+.LASF3128:
 	.string	"ebc_get_4pix_wf"
 .LASF2796:
 	.string	"num_symtab"
@@ -50224,11 +50377,13 @@ __exitcall_ebc_exit:
 	.string	"module_alloc_base"
 .LASF1749:
 	.string	"core_kallsyms"
-.LASF3236:
+.LASF3238:
 	.string	"memcpy"
+.LASF2890:
+	.string	"EPD_FORCE_FULL"
 .LASF2398:
 	.string	"get_sgtable"
-.LASF3125:
+.LASF3127:
 	.string	"xor_val"
 .LASF2153:
 	.string	"envp_idx"
@@ -50240,11 +50395,11 @@ __exitcall_ebc_exit:
 	.string	"OOM_KILL"
 .LASF442:
 	.string	"i_hash"
-.LASF3098:
+.LASF3100:
 	.string	"gray_old"
 .LASF67:
 	.string	"hlist_node"
-.LASF3245:
+.LASF3247:
 	.string	"sprintf"
 .LASF1906:
 	.string	"fl_ops"
@@ -50254,7 +50409,7 @@ __exitcall_ebc_exit:
 	.string	"debug_guardpage_ops"
 .LASF2671:
 	.string	"COMPACTISOLATED"
-.LASF3216:
+.LASF3218:
 	.string	"of_property_read_variable_u32_array"
 .LASF325:
 	.string	"__inittext_begin"
@@ -50290,7 +50445,7 @@ __exitcall_ebc_exit:
 	.string	"DOMAIN_BUS_WAKEUP"
 .LASF1220:
 	.string	"arm64_el2_vector_last_slot"
-.LASF3266:
+.LASF3268:
 	.string	"queue_work_on"
 .LASF2333:
 	.string	"online"
@@ -50298,17 +50453,17 @@ __exitcall_ebc_exit:
 	.string	"runtime_resume"
 .LASF1205:
 	.string	"dup_xol_work"
-.LASF3147:
+.LASF3149:
 	.string	"ebc_pmic_read_temp"
 .LASF2873:
 	.string	"EPD_FULL_GC16"
-.LASF3008:
+.LASF3010:
 	.string	"dev_attr_ebc_state"
 .LASF2159:
 	.string	"kernel_kobj"
 .LASF2585:
 	.string	"funcs"
-.LASF2992:
+.LASF2994:
 	.string	"overlay_enable"
 .LASF1105:
 	.string	"securebits"
@@ -50328,7 +50483,7 @@ __exitcall_ebc_exit:
 	.string	"DOMAIN_BUS_NEXUS"
 .LASF2036:
 	.string	"sysctl_mount_point"
-.LASF2988:
+.LASF2990:
 	.string	"auto_buffer_work"
 .LASF266:
 	.string	"user_mask"
@@ -50372,7 +50527,7 @@ __exitcall_ebc_exit:
 	.string	"UNEVICTABLE_PGMLOCKED"
 .LASF834:
 	.string	"pgdval_t"
-.LASF2910:
+.LASF2912:
 	.string	"page_link"
 .LASF1857:
 	.string	"setattr"
@@ -50384,7 +50539,7 @@ __exitcall_ebc_exit:
 	.string	"prepare"
 .LASF2136:
 	.string	"bin_attrs"
-.LASF2920:
+.LASF2922:
 	.string	"HYPERVISOR_shared_info"
 .LASF680:
 	.string	"sas_ss_flags"
@@ -50392,7 +50547,7 @@ __exitcall_ebc_exit:
 	.string	"f_mode"
 .LASF1427:
 	.string	"ki_complete"
-.LASF3023:
+.LASF3025:
 	.string	"ebc_tcon_pdev"
 .LASF1753:
 	.string	"percpu"
@@ -50412,13 +50567,13 @@ __exitcall_ebc_exit:
 	.string	"driver"
 .LASF1542:
 	.string	"ZONE_NORMAL"
-.LASF3113:
+.LASF3115:
 	.string	"image_new_data"
 .LASF423:
 	.string	"i_op"
 .LASF1684:
 	.string	"d_rt_spc_hardlimit"
-.LASF2970:
+.LASF2972:
 	.string	"ebc_task"
 .LASF2124:
 	.string	"kobj_ns_type_operations"
@@ -50460,13 +50615,13 @@ __exitcall_ebc_exit:
 	.string	"trace_bprintk_fmt_start"
 .LASF663:
 	.string	"cpu_timers"
-.LASF2944:
+.LASF2946:
 	.string	"disable"
 .LASF1298:
 	.string	"huge_fault"
 .LASF2006:
 	.string	"kstatfs"
-.LASF3150:
+.LASF3152:
 	.string	"ebc_pmic_power_off"
 .LASF2632:
 	.string	"PGPGOUTCLEAN"
@@ -50484,7 +50639,7 @@ __exitcall_ebc_exit:
 	.string	"i_dentry"
 .LASF2126:
 	.string	"grab_current_ns"
-.LASF3038:
+.LASF3040:
 	.string	"fb_size"
 .LASF881:
 	.string	"offset"
@@ -50494,7 +50649,7 @@ __exitcall_ebc_exit:
 	.string	"fsnotify_mark_connector"
 .LASF939:
 	.string	"_sigsys"
-.LASF3085:
+.LASF3087:
 	.string	"ebc_lut_update"
 .LASF1919:
 	.string	"lm_setup"
@@ -50528,7 +50683,7 @@ __exitcall_ebc_exit:
 	.string	"idmap_pg_dir"
 .LASF2516:
 	.string	"i2c_bus_recovery_info"
-.LASF3041:
+.LASF3043:
 	.string	"lut_buffer_size"
 .LASF481:
 	.string	"s_dev"
@@ -50538,7 +50693,7 @@ __exitcall_ebc_exit:
 	.string	"get_next_id"
 .LASF237:
 	.string	"rwlock_t"
-.LASF3271:
+.LASF3273:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
 .LASF838:
 	.string	"pgprot"
@@ -50554,7 +50709,7 @@ __exitcall_ebc_exit:
 	.string	"PIDTYPE_TGID"
 .LASF1913:
 	.string	"lm_get_owner"
-.LASF2897:
+.LASF2899:
 	.string	"drvpar"
 .LASF2629:
 	.string	"vm_event_item"
@@ -50566,7 +50721,7 @@ __exitcall_ebc_exit:
 	.string	"__icache_flags"
 .LASF147:
 	.string	"crash_kexec_post_notifiers"
-.LASF3135:
+.LASF3137:
 	.string	"eink_mode"
 .LASF1695:
 	.string	"rt_spc_warnlimit"
@@ -50598,15 +50753,15 @@ __exitcall_ebc_exit:
 	.string	"sysctl_nr_open"
 .LASF81:
 	.string	"reset_devices"
-.LASF2973:
+.LASF2975:
 	.string	"auto_image_bg"
 .LASF444:
 	.string	"i_wb"
 .LASF2084:
 	.string	"idr_next"
-.LASF3108:
+.LASF3110:
 	.string	"frame_count_data"
-.LASF2949:
+.LASF2951:
 	.string	"frame_start"
 .LASF1248:
 	.string	"compound_order"
@@ -50654,7 +50809,7 @@ __exitcall_ebc_exit:
 	.string	"normal_prio"
 .LASF1286:
 	.string	"f_ep_links"
-.LASF3117:
+.LASF3119:
 	.string	"image_fb_tmp"
 .LASF2292:
 	.string	"last_busy"
@@ -50666,7 +50821,7 @@ __exitcall_ebc_exit:
 	.string	"host"
 .LASF184:
 	.string	"uaddr"
-.LASF3263:
+.LASF3265:
 	.string	"ebc_remove_from_dsp_buf_list"
 .LASF659:
 	.string	"real_start_time"
@@ -50702,11 +50857,11 @@ __exitcall_ebc_exit:
 	.string	"devres_head"
 .LASF425:
 	.string	"i_mapping"
-.LASF3240:
+.LASF3242:
 	.string	"misc_register"
 .LASF720:
 	.string	"rseq_sig"
-.LASF3169:
+.LASF3171:
 	.string	"platform_set_drvdata"
 .LASF340:
 	.string	"cpu_context"
@@ -50714,7 +50869,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pm_domain"
 .LASF1511:
 	.string	"nr_zones"
-.LASF3192:
+.LASF3194:
 	.string	"is_source"
 .LASF1373:
 	.string	"migrate_mode"
@@ -50736,11 +50891,11 @@ __exitcall_ebc_exit:
 	.string	"d_hash"
 .LASF1073:
 	.string	"dl_bw"
-.LASF3162:
+.LASF3164:
 	.string	"limit"
 .LASF2143:
 	.string	"kobj"
-.LASF3246:
+.LASF3248:
 	.string	"kstrtouint"
 .LASF113:
 	.string	"fsync"
@@ -50750,13 +50905,13 @@ __exitcall_ebc_exit:
 	.string	"i_flags"
 .LASF2887:
 	.string	"EPD_RESUME"
-.LASF3235:
+.LASF3237:
 	.string	"sscanf"
-.LASF3231:
+.LASF3233:
 	.string	"ebc_empty_buf_get"
 .LASF1472:
 	.string	"NR_ISOLATED_ANON"
-.LASF3039:
+.LASF3041:
 	.string	"ebc_lut_table_init"
 .LASF1211:
 	.string	"uprobes_state"
@@ -50766,7 +50921,7 @@ __exitcall_ebc_exit:
 	.string	"rb_node"
 .LASF611:
 	.string	"pushable_tasks"
-.LASF3118:
+.LASF3120:
 	.string	"image_bg_tmp"
 .LASF2200:
 	.string	"platform_data"
@@ -50796,7 +50951,7 @@ __exitcall_ebc_exit:
 	.string	"last_update_time"
 .LASF1135:
 	.string	"robust_list_head"
-.LASF3229:
+.LASF3231:
 	.string	"init_timer_key"
 .LASF1478:
 	.string	"NR_ANON_MAPPED"
@@ -50810,9 +50965,9 @@ __exitcall_ebc_exit:
 	.string	"srcversion"
 .LASF856:
 	.string	"pcpu_unit_offsets"
-.LASF3138:
+.LASF3140:
 	.string	"dma_sync_single_for_device"
-.LASF2950:
+.LASF2952:
 	.string	"dsp_end_callback"
 .LASF458:
 	.string	"i_data"
@@ -50836,7 +50991,7 @@ __exitcall_ebc_exit:
 	.string	"usage_count"
 .LASF2075:
 	.string	"show"
-.LASF3005:
+.LASF3007:
 	.string	"dev_attr_pmic_temp"
 .LASF7:
 	.string	"unsigned char"
@@ -50852,7 +51007,7 @@ __exitcall_ebc_exit:
 	.string	"task_rss_stat"
 .LASF1139:
 	.string	"pipe_inode_info"
-.LASF2978:
+.LASF2980:
 	.string	"ebc_power_status"
 .LASF958:
 	.string	"ratelimit"
@@ -50868,7 +51023,7 @@ __exitcall_ebc_exit:
 	.string	"uevent_ops"
 .LASF543:
 	.string	"rename_lock"
-.LASF3070:
+.LASF3072:
 	.string	"__out"
 .LASF678:
 	.string	"sas_ss_sp"
@@ -50876,7 +51031,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_INACTIVE_ANON"
 .LASF726:
 	.string	"nr_dirtied"
-.LASF3179:
+.LASF3181:
 	.string	"dev_get_drvdata"
 .LASF2393:
 	.string	"linear_revmap"
@@ -50920,11 +51075,11 @@ __exitcall_ebc_exit:
 	.string	"sysctl_memory_failure_early_kill"
 .LASF2758:
 	.string	"param_ops_bool_enable_only"
-.LASF3122:
+.LASF3124:
 	.string	"power_status"
 .LASF306:
 	.string	"__start_opd"
-.LASF3243:
+.LASF3245:
 	.string	"of_find_i2c_device_by_node"
 .LASF153:
 	.string	"SYSTEM_RUNNING"
@@ -50942,7 +51097,7 @@ __exitcall_ebc_exit:
 	.string	"icq_hint"
 .LASF1992:
 	.string	"fiemap_extent_info"
-.LASF2906:
+.LASF2908:
 	.string	"DMA_TO_DEVICE"
 .LASF2727:
 	.string	"elf64_shdr"
@@ -50960,11 +51115,11 @@ __exitcall_ebc_exit:
 	.string	"sigval_t"
 .LASF1931:
 	.string	"fa_file"
-.LASF2994:
+.LASF2996:
 	.string	"panel"
 .LASF2430:
 	.string	"irq_data"
-.LASF3077:
+.LASF3079:
 	.string	"old_buffer_temp"
 .LASF2703:
 	.string	"sysctl_memory_failure_recovery"
@@ -50982,7 +51137,7 @@ __exitcall_ebc_exit:
 	.string	"st_shndx"
 .LASF2397:
 	.string	"free"
-.LASF3045:
+.LASF3047:
 	.string	"pmic_vcom_write"
 .LASF2131:
 	.string	"attribute"
@@ -50998,7 +51153,7 @@ __exitcall_ebc_exit:
 	.string	"taint_flags"
 .LASF1345:
 	.string	"membarrier_state"
-.LASF3129:
+.LASF3131:
 	.string	"pre_image_addr"
 .LASF2176:
 	.string	"suspend"
@@ -51064,7 +51219,7 @@ __exitcall_ebc_exit:
 	.string	"exit_code"
 .LASF1054:
 	.string	"exec_start"
-.LASF3268:
+.LASF3270:
 	.string	"printk"
 .LASF2379:
 	.string	"consumers"
@@ -51088,7 +51243,7 @@ __exitcall_ebc_exit:
 	.string	"unlink"
 .LASF2715:
 	.string	"d_ptr"
-.LASF3047:
+.LASF3049:
 	.string	"pmic_temp_read"
 .LASF1650:
 	.string	"dqstats"
@@ -51110,11 +51265,11 @@ __exitcall_ebc_exit:
 	.string	"mmap_rnd_bits"
 .LASF2459:
 	.string	"of_stdout"
-.LASF3068:
+.LASF3070:
 	.string	"new_prev_buf"
 .LASF974:
 	.string	"vm_ops"
-.LASF2926:
+.LASF2928:
 	.string	"ebc_panel"
 .LASF1300:
 	.string	"pagesize"
@@ -51126,7 +51281,7 @@ __exitcall_ebc_exit:
 	.string	"timer"
 .LASF2460:
 	.string	"devtree_lock"
-.LASF3058:
+.LASF3060:
 	.string	"__ret"
 .LASF1862:
 	.string	"update_time"
@@ -51148,17 +51303,17 @@ __exitcall_ebc_exit:
 	.string	"expiry"
 .LASF569:
 	.string	"optimistic_spin_queue"
-.LASF2955:
+.LASF2957:
 	.string	"ebc_buffer_size"
-.LASF3247:
+.LASF3249:
 	.string	"ebc_pmic_set_vcom"
 .LASF2639:
 	.string	"ALLOCSTALL_NORMAL"
-.LASF3102:
+.LASF3104:
 	.string	"data_buf_tmp"
 .LASF323:
 	.string	"__initdata_begin"
-.LASF2900:
+.LASF2902:
 	.string	"pmic_pm_resume"
 .LASF224:
 	.string	"__lstate"
@@ -51232,7 +51387,7 @@ __exitcall_ebc_exit:
 	.string	"algo_data"
 .LASF1509:
 	.string	"node_zones"
-.LASF3006:
+.LASF3008:
 	.string	"dev_attr_pmic_vcom"
 .LASF1557:
 	.string	"initialized"
@@ -51246,7 +51401,7 @@ __exitcall_ebc_exit:
 	.string	"mod_plt_sec"
 .LASF634:
 	.string	"tgid"
-.LASF2890:
+.LASF2892:
 	.string	"epd_mode"
 .LASF1136:
 	.string	"compat_robust_list_head"
@@ -51322,7 +51477,7 @@ __exitcall_ebc_exit:
 	.string	"seq_show"
 .LASF764:
 	.string	"ate_match_dt"
-.LASF3177:
+.LASF3179:
 	.string	"of_node_put"
 .LASF1358:
 	.string	"cow_page"
@@ -51346,7 +51501,7 @@ __exitcall_ebc_exit:
 	.string	"s_shrink"
 .LASF1523:
 	.string	"kcompactd_classzone_idx"
-.LASF3167:
+.LASF3169:
 	.string	"kmalloc_index"
 .LASF867:
 	.string	"hrtimer_restart"
@@ -51354,7 +51509,7 @@ __exitcall_ebc_exit:
 	.string	"totalram_pages"
 .LASF2484:
 	.string	"i2c_smbus_data"
-.LASF2982:
+.LASF2984:
 	.string	"curr_dsp_buf"
 .LASF1066:
 	.string	"time_slice"
@@ -51394,7 +51549,7 @@ __exitcall_ebc_exit:
 	.string	"wake_lock"
 .LASF2268:
 	.string	"may_skip_resume"
-.LASF2990:
+.LASF2992:
 	.string	"is_deep_sleep"
 .LASF1172:
 	.string	"shrinker"
@@ -51426,7 +51581,7 @@ __exitcall_ebc_exit:
 	.string	"ate_match_local_cap_id"
 .LASF2451:
 	.string	"property"
-.LASF3042:
+.LASF3044:
 	.string	"ebc_sysfs_init"
 .LASF989:
 	.string	"wchar"
@@ -51436,7 +51591,7 @@ __exitcall_ebc_exit:
 	.string	"platform_notify"
 .LASF61:
 	.string	"kernel_symbol"
-.LASF2918:
+.LASF2920:
 	.string	"dma_virt_ops"
 .LASF2296:
 	.string	"subsys_data"
@@ -51456,7 +51611,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_DELAYED_BIT"
 .LASF1036:
 	.string	"nr_failed_migrations_affine"
-.LASF3182:
+.LASF3184:
 	.string	"IS_ERR"
 .LASF859:
 	.string	"PCPU_FC_EMBED"
@@ -51470,7 +51625,7 @@ __exitcall_ebc_exit:
 	.string	"pi_top_task"
 .LASF803:
 	.string	"WORK_NR_COLORS"
-.LASF3120:
+.LASF3122:
 	.string	"refresh_new_image2"
 .LASF525:
 	.string	"s_fsnotify_inode_refs"
@@ -51482,7 +51637,7 @@ __exitcall_ebc_exit:
 	.string	"uprobe"
 .LASF526:
 	.string	"s_readonly_remount"
-.LASF3208:
+.LASF3210:
 	.string	"kasan_check_write"
 .LASF375:
 	.string	"hlist_bl_node"
@@ -51508,7 +51663,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_FLAG_MASK"
 .LASF1269:
 	.string	"units"
-.LASF3223:
+.LASF3225:
 	.string	"epd_lut_from_mem_init"
 .LASF309:
 	.string	"__nosave_begin"
@@ -51528,7 +51683,7 @@ __exitcall_ebc_exit:
 	.string	"user_namespace"
 .LASF2754:
 	.string	"param_ops_ulong"
-.LASF3199:
+.LASF3201:
 	.string	"get_current"
 .LASF231:
 	.string	"raw_spinlock"
@@ -51552,7 +51707,7 @@ __exitcall_ebc_exit:
 	.string	"fault_address"
 .LASF1604:
 	.string	"dq_inuse"
-.LASF3094:
+.LASF3096:
 	.string	"direct_mode_data_change_part"
 .LASF1639:
 	.string	"dqi_flags"
@@ -51560,13 +51715,13 @@ __exitcall_ebc_exit:
 	.string	"PGREFILL"
 .LASF2760:
 	.string	"param_ops_bint"
-.LASF3232:
+.LASF3234:
 	.string	"ebc_add_to_dsp_buf_list"
-.LASF3237:
+.LASF3239:
 	.string	"kfree"
 .LASF1800:
 	.string	"swap_deactivate"
-.LASF2934:
+.LASF2936:
 	.string	"gdck_sta"
 .LASF1141:
 	.string	"request_queue"
@@ -51604,7 +51759,7 @@ __exitcall_ebc_exit:
 	.string	"perm"
 .LASF712:
 	.string	"compat_robust_list"
-.LASF2953:
+.LASF2955:
 	.string	"ebc_buffer_phy"
 .LASF2475:
 	.string	"unmap"
@@ -51626,9 +51781,9 @@ __exitcall_ebc_exit:
 	.string	"alternatives_applied"
 .LASF595:
 	.string	"boost_expires"
-.LASF2905:
+.LASF2907:
 	.string	"DMA_BIDIRECTIONAL"
-.LASF3255:
+.LASF3257:
 	.string	"__arch_copy_to_user"
 .LASF235:
 	.string	"spinlock"
@@ -51646,13 +51801,13 @@ __exitcall_ebc_exit:
 	.string	"d_compare"
 .LASF969:
 	.string	"vm_mm"
-.LASF3078:
+.LASF3080:
 	.string	"need_refresh"
 .LASF2818:
 	.string	"platform_bus_type"
-.LASF3095:
+.LASF3097:
 	.string	"data_buf"
-.LASF3032:
+.LASF3034:
 	.string	"ulogo_buf"
 .LASF1635:
 	.string	"mem_dqinfo"
@@ -51670,15 +51825,15 @@ __exitcall_ebc_exit:
 	.string	"WORK_OFFQ_POOL_BITS"
 .LASF1903:
 	.string	"fl_fasync"
-.LASF3132:
+.LASF3134:
 	.string	"update_mode"
-.LASF2932:
+.LASF2934:
 	.string	"direct_mode"
 .LASF2409:
 	.string	"cache_sync"
 .LASF433:
 	.string	"i_lock"
-.LASF2968:
+.LASF2970:
 	.string	"ebc_dsp_buf_status"
 .LASF405:
 	.string	"d_name"
@@ -51712,7 +51867,7 @@ __exitcall_ebc_exit:
 	.string	"last_switch_time"
 .LASF563:
 	.string	"fs_overflowuid"
-.LASF2921:
+.LASF2923:
 	.string	"start_info"
 .LASF2691:
 	.string	"vm_zone_stat"
@@ -51742,15 +51897,15 @@ __exitcall_ebc_exit:
 	.string	"page_ext_operations"
 .LASF2661:
 	.string	"KSWAPD_HIGH_WMARK_HIT_QUICKLY"
-.LASF3043:
+.LASF3045:
 	.string	"ebc_state_read"
-.LASF3244:
+.LASF3246:
 	.string	"__stack_chk_fail"
-.LASF2903:
+.LASF2905:
 	.string	"pmic_set_vcom"
 .LASF2697:
 	.string	"stack_guard_gap"
-.LASF3191:
+.LASF3193:
 	.string	"bytes"
 .LASF1736:
 	.string	"gpl_future_crcs"
@@ -51782,7 +51937,7 @@ __exitcall_ebc_exit:
 	.string	"thaw_noirq"
 .LASF967:
 	.string	"vm_rb"
-.LASF3016:
+.LASF3018:
 	.string	"kernel_read_file_str"
 .LASF566:
 	.string	"init_user_ns"
@@ -51790,7 +51945,7 @@ __exitcall_ebc_exit:
 	.string	"add_links"
 .LASF2172:
 	.string	"pm_message_t"
-.LASF2923:
+.LASF2925:
 	.string	"xen_dma_ops"
 .LASF1442:
 	.string	"page_group_by_mobility_disabled"
@@ -51824,9 +51979,9 @@ __exitcall_ebc_exit:
 	.string	"payload"
 .LASF1387:
 	.string	"cb_state"
-.LASF2915:
+.LASF2917:
 	.string	"orig_nents"
-.LASF3057:
+.LASF3059:
 	.string	"buf_addr"
 .LASF410:
 	.string	"d_sb"
@@ -51852,9 +52007,11 @@ __exitcall_ebc_exit:
 	.string	"private_lock"
 .LASF431:
 	.string	"i_mtime"
+.LASF2889:
+	.string	"EPD_OVERLAY_WHITE"
 .LASF2602:
 	.string	"dev_page_fault_t"
-.LASF3088:
+.LASF3090:
 	.string	"ebc_auto_tast_function"
 .LASF24:
 	.string	"__kernel_gid32_t"
@@ -51866,7 +52023,7 @@ __exitcall_ebc_exit:
 	.string	"MODULE_STATE_COMING"
 .LASF2229:
 	.string	"offline_disabled"
-.LASF3175:
+.LASF3177:
 	.string	"of_property_read_u32_array"
 .LASF2474:
 	.string	"select"
@@ -51890,7 +52047,7 @@ __exitcall_ebc_exit:
 	.string	"async_put_work"
 .LASF2114:
 	.string	"kernfs_syscall_ops"
-.LASF2979:
+.LASF2981:
 	.string	"ebc_last_display"
 .LASF1855:
 	.string	"mknod"
@@ -51898,7 +52055,7 @@ __exitcall_ebc_exit:
 	.string	"SYSTEM_BOOTING"
 .LASF1598:
 	.string	"max_freq_scale"
-.LASF2916:
+.LASF2918:
 	.string	"dma_direct_ops"
 .LASF2250:
 	.string	"dev_pm_info"
@@ -51912,7 +52069,7 @@ __exitcall_ebc_exit:
 	.string	"dev_pagemap"
 .LASF2646:
 	.string	"PGDEACTIVATE"
-.LASF3101:
+.LASF3103:
 	.string	"buffer_old_tmp"
 .LASF1782:
 	.string	"writepages"
@@ -51932,13 +52089,13 @@ __exitcall_ebc_exit:
 	.string	"writeback_control"
 .LASF1902:
 	.string	"fl_end"
-.LASF3258:
+.LASF3260:
 	.string	"ebc_find_buf_by_phy_addr"
 .LASF1949:
 	.string	"super_operations"
 .LASF392:
 	.string	"want_pages"
-.LASF2942:
+.LASF2944:
 	.string	"regmap_base"
 .LASF336:
 	.string	"wps_disabled"
@@ -51964,9 +52121,7 @@ __exitcall_ebc_exit:
 	.string	"i_security"
 .LASF2642:
 	.string	"PGSCAN_SKIP_NORMAL"
-.LASF3012:
-	.string	"__addressable_ebc_init1969"
-.LASF2914:
+.LASF2916:
 	.string	"nents"
 .LASF754:
 	.string	"__smp_cross_call"
@@ -51974,13 +52129,13 @@ __exitcall_ebc_exit:
 	.string	"core"
 .LASF1813:
 	.string	"bd_holders"
-.LASF3092:
+.LASF3094:
 	.string	"reset_and_flip"
-.LASF2943:
+.LASF2945:
 	.string	"enable"
 .LASF953:
 	.string	"pipe_bufs"
-.LASF3196:
+.LASF3198:
 	.string	"to_user"
 .LASF2122:
 	.string	"KOBJ_NS_TYPE_NET"
@@ -51998,7 +52153,7 @@ __exitcall_ebc_exit:
 	.string	"__rb_parent_color"
 .LASF2222:
 	.string	"devres_lock"
-.LASF3119:
+.LASF3121:
 	.string	"new_buffer_refresh"
 .LASF363:
 	.string	"bits"
@@ -52014,17 +52169,17 @@ __exitcall_ebc_exit:
 	.string	"lookup"
 .LASF1588:
 	.string	"cpu_topology"
-.LASF3200:
+.LASF3202:
 	.string	"sp_el0"
-.LASF3262:
+.LASF3264:
 	.string	"ebc_dsp_buf_get"
-.LASF2892:
+.LASF2894:
 	.string	"panel_color"
 .LASF1894:
 	.string	"fl_owner"
 .LASF2849:
 	.string	"WF_TYPE_GLD16"
-.LASF2991:
+.LASF2993:
 	.string	"is_power_off"
 .LASF977:
 	.string	"vm_private_data"
@@ -52038,7 +52193,7 @@ __exitcall_ebc_exit:
 	.string	"kobj_type"
 .LASF2620:
 	.string	"sysctl_overcommit_kbytes"
-.LASF2962:
+.LASF2964:
 	.string	"frame_left"
 .LASF2477:
 	.string	"deactivate"
@@ -52046,7 +52201,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_AUTO"
 .LASF1225:
 	.string	"i_pages"
-.LASF3159:
+.LASF3161:
 	.string	"safe_ptr"
 .LASF374:
 	.string	"hlist_bl_head"
@@ -52076,9 +52231,9 @@ __exitcall_ebc_exit:
 	.string	"unix_inflight"
 .LASF1724:
 	.string	"holders_dir"
-.LASF3059:
+.LASF3061:
 	.string	"__wq_entry"
-.LASF3073:
+.LASF3075:
 	.string	"new_buffer"
 .LASF461:
 	.string	"i_fsnotify_mask"
@@ -52086,7 +52241,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_LOW_WMARK_HIT_QUICKLY"
 .LASF992:
 	.string	"syscfs"
-.LASF3152:
+.LASF3154:
 	.string	"wake_unlock"
 .LASF2443:
 	.string	"graph_get_port_parent"
@@ -52094,7 +52249,7 @@ __exitcall_ebc_exit:
 	.string	"UNEVICTABLE_PGRESCUED"
 .LASF2207:
 	.string	"msi_list"
-.LASF3202:
+.LASF3204:
 	.string	"__ilog2_u64"
 .LASF545:
 	.string	"compat_time_t"
@@ -52118,7 +52273,7 @@ __exitcall_ebc_exit:
 	.string	"cap_effective"
 .LASF1744:
 	.string	"taints"
-.LASF3218:
+.LASF3220:
 	.string	"of_address_to_resource"
 .LASF1010:
 	.string	"enqueued"
@@ -52128,7 +52283,7 @@ __exitcall_ebc_exit:
 	.string	"hex_asc_upper"
 .LASF504:
 	.string	"s_roots"
-.LASF2904:
+.LASF2906:
 	.string	"dma_data_direction"
 .LASF1687:
 	.string	"d_rt_spc_timer"
@@ -52146,7 +52301,7 @@ __exitcall_ebc_exit:
 	.string	"bd_private"
 .LASF1901:
 	.string	"fl_start"
-.LASF3174:
+.LASF3176:
 	.string	"out_value"
 .LASF1959:
 	.string	"freeze_fs"
@@ -52154,7 +52309,7 @@ __exitcall_ebc_exit:
 	.string	"sigset_t"
 .LASF1915:
 	.string	"lm_notify"
-.LASF3131:
+.LASF3133:
 	.string	"ebc_tcon_dsp_mode_set"
 .LASF878:
 	.string	"running"
@@ -52180,7 +52335,7 @@ __exitcall_ebc_exit:
 	.string	"d_automount"
 .LASF1263:
 	.string	"page_free"
-.LASF3089:
+.LASF3091:
 	.string	"__val"
 .LASF1479:
 	.string	"NR_FILE_MAPPED"
@@ -52192,19 +52347,19 @@ __exitcall_ebc_exit:
 	.string	"copy_file_range"
 .LASF2683:
 	.string	"UNEVICTABLE_PGCLEARED"
-.LASF3248:
+.LASF3250:
 	.string	"epd_lut_get_wf_version"
 .LASF2045:
 	.string	"key_type"
 .LASF795:
 	.string	"WORK_STRUCT_LINKED_BIT"
-.LASF3193:
+.LASF3195:
 	.string	"copy_overflow"
 .LASF2439:
 	.string	"get_named_child_node"
 .LASF2256:
 	.string	"is_suspended"
-.LASF2912:
+.LASF2914:
 	.string	"dma_length"
 .LASF2064:
 	.string	"burst"
@@ -52212,15 +52367,15 @@ __exitcall_ebc_exit:
 	.string	"clone_mnt_data"
 .LASF2775:
 	.string	"module_kobject"
-.LASF3037:
+.LASF3039:
 	.string	"memory"
-.LASF3166:
+.LASF3168:
 	.string	"order"
 .LASF737:
 	.string	"active_memcg"
 .LASF1330:
 	.string	"def_flags"
-.LASF2995:
+.LASF2997:
 	.string	"global_ebc"
 .LASF1471:
 	.string	"NR_SLAB_UNRECLAIMABLE"
@@ -52228,7 +52383,7 @@ __exitcall_ebc_exit:
 	.string	"refcount"
 .LASF1788:
 	.string	"invalidatepage"
-.LASF3063:
+.LASF3065:
 	.string	"ebc_frame_timeout"
 .LASF361:
 	.string	"wait_queue_head_t"
@@ -52250,7 +52405,7 @@ __exitcall_ebc_exit:
 	.string	"EPD_A2"
 .LASF2100:
 	.string	"kernfs_elem_attr"
-.LASF3076:
+.LASF3078:
 	.string	"new_buffer_temp"
 .LASF2297:
 	.string	"set_latency_tolerance"
@@ -52264,7 +52419,7 @@ __exitcall_ebc_exit:
 	.string	"arm64_ftr_reg_ctrel0"
 .LASF1242:
 	.string	"counters"
-.LASF3209:
+.LASF3211:
 	.string	"kasan_check_read"
 .LASF2057:
 	.string	"name_link"
@@ -52284,9 +52439,9 @@ __exitcall_ebc_exit:
 	.string	"policy"
 .LASF1291:
 	.string	"shared"
-.LASF3010:
+.LASF3012:
 	.string	"ebc_match"
-.LASF2941:
+.LASF2943:
 	.string	"dclk"
 .LASF2215:
 	.string	"dma_mem"
@@ -52306,7 +52461,7 @@ __exitcall_ebc_exit:
 	.string	"module_sysfs_initialized"
 .LASF1000:
 	.string	"task_cputime"
-.LASF2965:
+.LASF2967:
 	.string	"lut_addr"
 .LASF1194:
 	.string	"rnode"
@@ -52316,7 +52471,7 @@ __exitcall_ebc_exit:
 	.string	"__con_initcall_start"
 .LASF1715:
 	.string	"get_dqblk"
-.LASF3022:
+.LASF3024:
 	.string	"ebc_tcon_node"
 .LASF2815:
 	.string	"id_entry"
@@ -52326,7 +52481,7 @@ __exitcall_ebc_exit:
 	.string	"nr_irqs"
 .LASF892:
 	.string	"max_hang_time"
-.LASF3155:
+.LASF3157:
 	.string	"copy_from_user"
 .LASF2465:
 	.string	"DOMAIN_BUS_ANY"
@@ -52340,9 +52495,9 @@ __exitcall_ebc_exit:
 	.string	"mmap_miss"
 .LASF1652:
 	.string	"quota_format_ops"
-.LASF3260:
+.LASF3262:
 	.string	"ebc_osd_buf_get"
-.LASF3054:
+.LASF3056:
 	.string	"argp"
 .LASF1752:
 	.string	"args"
@@ -52354,13 +52509,13 @@ __exitcall_ebc_exit:
 	.string	"run_delay"
 .LASF1996:
 	.string	"fi_extents_start"
-.LASF2924:
+.LASF2926:
 	.string	"dummy_dma_ops"
 .LASF238:
 	.string	"static_key_initialized"
 .LASF2782:
 	.string	"module_uevent"
-.LASF3067:
+.LASF3069:
 	.string	"is_full_mode"
 .LASF2595:
 	.string	"base_pfn"
@@ -52368,29 +52523,29 @@ __exitcall_ebc_exit:
 	.string	"width"
 .LASF927:
 	.string	"_addr_pkey"
-.LASF3050:
+.LASF3052:
 	.string	"waveform_buffer"
 .LASF296:
 	.string	"__start_rodata"
 .LASF1466:
 	.string	"NR_ACTIVE_ANON"
-.LASF2927:
+.LASF2929:
 	.string	"tcon"
 .LASF1113:
 	.string	"thread_keyring"
 .LASF2743:
 	.string	"kparam_array"
-.LASF3211:
+.LASF3213:
 	.string	"platform_driver_unregister"
 .LASF650:
 	.string	"utime"
 .LASF1332:
 	.string	"start_code"
-.LASF3011:
+.LASF3013:
 	.string	"ebc_driver"
 .LASF2603:
 	.string	"dev_page_free_t"
-.LASF3172:
+.LASF3174:
 	.string	"of_property_read_u32"
 .LASF1396:
 	.string	"guid_t"
@@ -52408,7 +52563,7 @@ __exitcall_ebc_exit:
 	.string	"tz_minuteswest"
 .LASF2457:
 	.string	"of_chosen"
-.LASF3090:
+.LASF3092:
 	.string	"ebc_frame_start"
 .LASF346:
 	.string	"sve_state"
@@ -52418,7 +52573,7 @@ __exitcall_ebc_exit:
 	.string	"cpumask_t"
 .LASF133:
 	.string	"kmsg_fops"
-.LASF3257:
+.LASF3259:
 	.string	"ebc_buf_release"
 .LASF817:
 	.string	"WORK_STRUCT_NO_POOL"
@@ -52440,7 +52595,7 @@ __exitcall_ebc_exit:
 	.string	"sched_rt_entity"
 .LASF116:
 	.string	"sendpage"
-.LASF3124:
+.LASF3126:
 	.string	"ret_val"
 .LASF864:
 	.string	"timerqueue_node"
@@ -52450,7 +52605,7 @@ __exitcall_ebc_exit:
 	.string	"mem_dqblk"
 .LASF2770:
 	.string	"plt_entry"
-.LASF3133:
+.LASF3135:
 	.string	"display_mode"
 .LASF1978:
 	.string	"nr_cached_objects"
@@ -52482,11 +52637,11 @@ __exitcall_ebc_exit:
 	.string	"fops"
 .LASF1271:
 	.string	"f_path"
-.LASF3225:
+.LASF3227:
 	.string	"kthread_create_on_node"
 .LASF709:
 	.string	"cgroups"
-.LASF3158:
+.LASF3160:
 	.string	"__uaccess_mask_ptr"
 .LASF2342:
 	.string	"probe_type"
@@ -52506,9 +52661,9 @@ __exitcall_ebc_exit:
 	.string	"userspace_clients"
 .LASF2141:
 	.string	"uevent_seqnum"
-.LASF3221:
+.LASF3223:
 	.string	"memset"
-.LASF3130:
+.LASF3132:
 	.string	"cur_image_addr"
 .LASF2142:
 	.string	"list_lock"
@@ -52542,7 +52697,7 @@ __exitcall_ebc_exit:
 	.string	"file_lock_operations"
 .LASF341:
 	.string	"tp_value"
-.LASF3019:
+.LASF3021:
 	.string	"ebc_remove"
 .LASF1891:
 	.string	"fl_list"
@@ -52570,11 +52725,11 @@ __exitcall_ebc_exit:
 	.string	"sysctl_drop_caches"
 .LASF1971:
 	.string	"show_devname"
-.LASF2936:
+.LASF2938:
 	.string	"panel_16bit"
 .LASF1320:
 	.string	"page_table_lock"
-.LASF3009:
+.LASF3011:
 	.string	"ebc_pm"
 .LASF2838:
 	.string	"sched_priority"
@@ -52590,7 +52745,7 @@ __exitcall_ebc_exit:
 	.string	"console_printk"
 .LASF700:
 	.string	"ioac"
-.LASF3186:
+.LASF3188:
 	.string	"__init_work"
 .LASF1169:
 	.string	"nr_to_scan"
@@ -52602,7 +52757,7 @@ __exitcall_ebc_exit:
 	.string	"exec_max"
 .LASF1401:
 	.string	"uuid_index"
-.LASF3187:
+.LASF3189:
 	.string	"onstack"
 .LASF189:
 	.string	"compat_rmtp"
@@ -52630,7 +52785,7 @@ __exitcall_ebc_exit:
 	.string	"__i_nlink"
 .LASF144:
 	.string	"panic_on_warn"
-.LASF3061:
+.LASF3063:
 	.string	"ebc_panel_probe"
 .LASF79:
 	.string	"boot_command_line"
@@ -52648,13 +52803,13 @@ __exitcall_ebc_exit:
 	.string	"d_spc_warns"
 .LASF1038:
 	.string	"nr_failed_migrations_hot"
-.LASF2928:
+.LASF2930:
 	.string	"pmic"
 .LASF1134:
 	.string	"css_set"
 .LASF1400:
 	.string	"guid_index"
-.LASF2967:
+.LASF2969:
 	.string	"ebc_irq_status"
 .LASF2542:
 	.string	"force_irqthreads"
@@ -52696,13 +52851,13 @@ __exitcall_ebc_exit:
 	.string	"d_rt_space"
 .LASF264:
 	.string	"name"
-.LASF3230:
+.LASF3232:
 	.string	"mod_timer"
 .LASF150:
 	.string	"early_boot_irqs_disabled"
 .LASF656:
 	.string	"nvcsw"
-.LASF3035:
+.LASF3037:
 	.string	"ebc_task_init"
 .LASF2830:
 	.string	"KMALLOC_NORMAL"
@@ -52722,7 +52877,7 @@ __exitcall_ebc_exit:
 	.string	"i_gid"
 .LASF1617:
 	.string	"quota_type"
-.LASF3097:
+.LASF3099:
 	.string	"buffer_old"
 .LASF1534:
 	.string	"high"
@@ -52738,11 +52893,11 @@ __exitcall_ebc_exit:
 	.string	"self_exec_id"
 .LASF1905:
 	.string	"fl_downgrade_time"
-.LASF2975:
+.LASF2977:
 	.string	"auto_frame_count"
 .LASF2102:
 	.string	"kernfs_ops"
-.LASF2971:
+.LASF2973:
 	.string	"auto_image_new"
 .LASF805:
 	.string	"WORK_CPU_UNBOUND"
@@ -52766,25 +52921,25 @@ __exitcall_ebc_exit:
 	.string	"NR_ZONE_WRITE_PENDING"
 .LASF1294:
 	.string	"close"
-.LASF3114:
+.LASF3116:
 	.string	"image_fb_data"
-.LASF3033:
+.LASF3035:
 	.string	"klogo_buf"
 .LASF2888:
 	.string	"EPD_POWER_OFF"
 .LASF1499:
 	.string	"zone_reclaim_stat"
-.LASF2997:
+.LASF2999:
 	.string	"ebc_wq"
 .LASF734:
 	.string	"memcg_oom_gfp_mask"
-.LASF3189:
+.LASF3191:
 	.string	"_msecs_to_jiffies"
 .LASF1681:
 	.string	"d_spc_timer"
 .LASF1757:
 	.string	"jump_entries"
-.LASF3197:
+.LASF3199:
 	.string	"test_ti_thread_flag"
 .LASF2253:
 	.string	"async_suspend"
@@ -52794,7 +52949,7 @@ __exitcall_ebc_exit:
 	.string	"read_pos"
 .LASF479:
 	.string	"super_block"
-.LASF3160:
+.LASF3162:
 	.string	"__addr"
 .LASF2320:
 	.string	"dma_coherent"
@@ -52830,11 +52985,11 @@ __exitcall_ebc_exit:
 	.string	"plt_max_entries"
 .LASF2401:
 	.string	"map_sg"
-.LASF2966:
+.LASF2968:
 	.string	"buffer_need_check"
 .LASF1157:
 	.string	"nlink"
-.LASF3028:
+.LASF3030:
 	.string	"ulogo_addr_valid"
 .LASF2575:
 	.string	"percpu_ref"
@@ -52842,11 +52997,11 @@ __exitcall_ebc_exit:
 	.string	"devkmsg_log_str"
 .LASF254:
 	.string	"FTR_HIGHER_SAFE"
-.LASF3171:
+.LASF3173:
 	.string	"i2c_get_clientdata"
-.LASF3156:
+.LASF3158:
 	.string	"_copy_to_user"
-.LASF3204:
+.LASF3206:
 	.string	"test_bit"
 .LASF248:
 	.string	"__start___jump_table"
@@ -52862,7 +53017,7 @@ __exitcall_ebc_exit:
 	.string	"mems_allowed_seq"
 .LASF1768:
 	.string	"refcnt"
-.LASF3080:
+.LASF3082:
 	.string	"pbuf_new"
 .LASF2179:
 	.string	"thaw"
@@ -52878,9 +53033,9 @@ __exitcall_ebc_exit:
 	.string	"futex"
 .LASF1023:
 	.string	"wait_max"
-.LASF3228:
+.LASF3230:
 	.string	"wakeup_source_add"
-.LASF3149:
+.LASF3151:
 	.string	"ebc_pmic_suspend"
 .LASF1156:
 	.string	"result_mask"
@@ -52892,15 +53047,15 @@ __exitcall_ebc_exit:
 	.string	"dquot_operations"
 .LASF1222:
 	.string	"mapping"
-.LASF3181:
+.LASF3183:
 	.string	"resource_size"
-.LASF3226:
+.LASF3228:
 	.string	"wake_up_process"
 .LASF1352:
 	.string	"kioctx_table"
 .LASF850:
 	.string	"rb_right"
-.LASF3100:
+.LASF3102:
 	.string	"buffer_new_tmp"
 .LASF976:
 	.string	"vm_file"
@@ -52926,11 +53081,11 @@ __exitcall_ebc_exit:
 	.string	"__initdata_end"
 .LASF2499:
 	.string	"bus_lock"
-.LASF3168:
+.LASF3170:
 	.string	"kmalloc_type"
 .LASF385:
 	.string	"qstr"
-.LASF3099:
+.LASF3101:
 	.string	"gray_new"
 .LASF1090:
 	.string	"futex_state"
@@ -52938,7 +53093,7 @@ __exitcall_ebc_exit:
 	.string	"WORKINGSET_RESTORE"
 .LASF626:
 	.string	"sched_psi_wake_requeue"
-.LASF3190:
+.LASF3192:
 	.string	"check_copy_size"
 .LASF735:
 	.string	"memcg_oom_order"
@@ -52994,17 +53149,17 @@ __exitcall_ebc_exit:
 	.string	"core_state"
 .LASF866:
 	.string	"timerqueue_head"
-.LASF3227:
+.LASF3229:
 	.string	"sched_setscheduler_nocheck"
 .LASF1289:
 	.string	"f_wb_err"
-.LASF3184:
+.LASF3186:
 	.string	"schedule_work"
 .LASF2428:
 	.string	"rt_mutex"
 .LASF988:
 	.string	"rchar"
-.LASF3141:
+.LASF3143:
 	.string	"valid_dma_direction"
 .LASF1816:
 	.string	"bd_contains"
@@ -53038,13 +53193,13 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_FLAG_BITS"
 .LASF2446:
 	.string	"fwnode_endpoint"
-.LASF3060:
+.LASF3062:
 	.string	"__int"
 .LASF950:
 	.string	"epoll_watches"
 .LASF2675:
 	.string	"KCOMPACTD_WAKE"
-.LASF3109:
+.LASF3111:
 	.string	"refresh_new_image"
 .LASF2072:
 	.string	"non_rcu"
@@ -53078,9 +53233,9 @@ __exitcall_ebc_exit:
 	.string	"_uid"
 .LASF337:
 	.string	"hbp_break"
-.LASF2974:
+.LASF2976:
 	.string	"auto_image_cur"
-.LASF3024:
+.LASF3026:
 	.string	"pmic_node"
 .LASF138:
 	.string	"panic_blink"
@@ -53120,13 +53275,13 @@ __exitcall_ebc_exit:
 	.string	"need"
 .LASF502:
 	.string	"s_encoding"
-.LASF3185:
+.LASF3187:
 	.string	"queue_work"
 .LASF1732:
 	.string	"gpl_crcs"
 .LASF1718:
 	.string	"get_state"
-.LASF3144:
+.LASF3146:
 	.string	"dma_handle"
 .LASF1357:
 	.string	"orig_pte"
@@ -53144,7 +53299,7 @@ __exitcall_ebc_exit:
 	.string	"__s8"
 .LASF350:
 	.string	"fault_code"
-.LASF3003:
+.LASF3005:
 	.string	"dev_attr_waveform_version"
 .LASF2209:
 	.string	"dma_mask"
@@ -53178,9 +53333,9 @@ __exitcall_ebc_exit:
 	.string	"__kernel_ulong_t"
 .LASF2604:
 	.string	"max_mapnr"
-.LASF2951:
+.LASF2953:
 	.string	"regmap"
-.LASF2919:
+.LASF2921:
 	.string	"shared_info"
 .LASF770:
 	.string	"read_cntp_tval_el0"
@@ -53212,7 +53367,7 @@ __exitcall_ebc_exit:
 	.string	"__u8"
 .LASF115:
 	.string	"lock"
-.LASF3148:
+.LASF3150:
 	.string	"ebc_pmic_resume"
 .LASF1560:
 	.string	"compact_cached_migrate_pfn"
@@ -53220,9 +53375,9 @@ __exitcall_ebc_exit:
 	.string	"PGALLOC_DMA32"
 .LASF2753:
 	.string	"param_ops_long"
-.LASF2993:
+.LASF2995:
 	.string	"overlay_start"
-.LASF2947:
+.LASF2949:
 	.string	"frame_addr_set"
 .LASF1075:
 	.string	"runtime"
@@ -53248,13 +53403,13 @@ __exitcall_ebc_exit:
 	.string	"xattr_handler"
 .LASF1424:
 	.string	"kiocb"
-.LASF2893:
+.LASF2895:
 	.string	"width_mm"
 .LASF1563:
 	.string	"compact_order_failed"
 .LASF1103:
 	.string	"fsuid"
-.LASF3198:
+.LASF3200:
 	.string	"flag"
 .LASF1473:
 	.string	"NR_ISOLATED_FILE"
@@ -53266,9 +53421,9 @@ __exitcall_ebc_exit:
 	.string	"managed_pages"
 .LASF2587:
 	.string	"__tracepoint_page_ref_set"
-.LASF3137:
+.LASF3139:
 	.string	"ebc_tcon_enable"
-.LASF3270:
+.LASF3272:
 	.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"
@@ -53298,6 +53453,8 @@ __exitcall_ebc_exit:
 	.string	"nr_reserved_highatomic"
 .LASF2362:
 	.string	"shutdown_pre"
+.LASF3014:
+	.string	"__addressable_ebc_init1974"
 .LASF2282:
 	.string	"no_callbacks"
 .LASF2822:
@@ -53316,13 +53473,13 @@ __exitcall_ebc_exit:
 	.string	"s_vop"
 .LASF1648:
 	.string	"qf_owner"
-.LASF3210:
+.LASF3212:
 	.string	"__write_once_size"
 .LASF2829:
 	.string	"kmalloc_cache_type"
 .LASF572:
 	.string	"mutex"
-.LASF3176:
+.LASF3178:
 	.string	"out_values"
 .LASF837:
 	.string	"pgd_t"
@@ -53334,9 +53491,9 @@ __exitcall_ebc_exit:
 	.string	"NR_VM_NODE_STAT_ITEMS"
 .LASF233:
 	.string	"raw_spinlock_t"
-.LASF2930:
+.LASF2932:
 	.string	"vir_width"
-.LASF3201:
+.LASF3203:
 	.string	"INIT_LIST_HEAD"
 .LASF1936:
 	.string	"fs_flags"
@@ -53352,11 +53509,11 @@ __exitcall_ebc_exit:
 	.string	"dma_pfn_offset"
 .LASF1187:
 	.string	"radix_tree_node"
-.LASF3203:
+.LASF3205:
 	.string	"sign_extend64"
 .LASF2311:
 	.string	"wake_irq"
-.LASF3026:
+.LASF3028:
 	.string	"ulogo_addr"
 .LASF857:
 	.string	"pcpu_fc"
@@ -53374,7 +53531,7 @@ __exitcall_ebc_exit:
 	.string	"ptraced"
 .LASF2749:
 	.string	"param_ops_short"
-.LASF3242:
+.LASF3244:
 	.string	"of_find_device_by_node"
 .LASF2551:
 	.string	"HRTIMER_SOFTIRQ"
@@ -53394,13 +53551,13 @@ __exitcall_ebc_exit:
 	.string	"d_lockref"
 .LASF2240:
 	.string	"rpm_request"
-.LASF3053:
+.LASF3055:
 	.string	"ebc_io_ctl"
 .LASF1147:
 	.string	"addr"
 .LASF2383:
 	.string	"device_private"
-.LASF3139:
+.LASF3141:
 	.string	"get_dma_ops"
 .LASF2695:
 	.string	"watermark_scale_factor"
@@ -53414,9 +53571,9 @@ __exitcall_ebc_exit:
 	.string	"mm_rss_stat"
 .LASF1720:
 	.string	"mkobj"
-.LASF2957:
+.LASF2959:
 	.string	"direct_buf_real_size"
-.LASF3261:
+.LASF3263:
 	.string	"__pm_relax"
 .LASF470:
 	.string	"d_delete"
@@ -53426,7 +53583,7 @@ __exitcall_ebc_exit:
 	.string	"begin"
 .LASF2734:
 	.string	"sh_link"
-.LASF3017:
+.LASF3019:
 	.string	"ebc_suspend"
 .LASF2355:
 	.string	"cls_msk"
@@ -53448,19 +53605,19 @@ __exitcall_ebc_exit:
 	.string	"num_resources"
 .LASF1573:
 	.string	"notifier_fn_t"
-.LASF3025:
+.LASF3027:
 	.string	"pmic_client"
 .LASF2569:
 	.string	"miscdevice"
 .LASF653:
 	.string	"time_in_state"
-.LASF3034:
+.LASF3036:
 	.string	"ebc_logo_init"
 .LASF1266:
 	.string	"kill"
 .LASF1027:
 	.string	"iowait_sum"
-.LASF3110:
+.LASF3112:
 	.string	"image_new"
 .LASF15:
 	.string	"__u64"
@@ -53486,13 +53643,13 @@ __exitcall_ebc_exit:
 	.string	"i_blkbits"
 .LASF2453:
 	.string	"value"
-.LASF2987:
+.LASF2989:
 	.string	"frame_timer"
 .LASF1030:
 	.string	"sum_sleep_runtime"
-.LASF3030:
+.LASF3032:
 	.string	"ulogo_addr_str"
-.LASF3093:
+.LASF3095:
 	.string	"flip"
 .LASF1076:
 	.string	"deadline"
@@ -53534,11 +53691,11 @@ __exitcall_ebc_exit:
 	.string	"read_dqblk"
 .LASF1613:
 	.string	"dq_flags"
-.LASF3096:
+.LASF3098:
 	.string	"buffer_new"
 .LASF212:
 	.string	"user_fpsimd_state"
-.LASF3241:
+.LASF3243:
 	.string	"device_create_file"
 .LASF518:
 	.string	"s_time_gran"
@@ -53562,15 +53719,15 @@ __exitcall_ebc_exit:
 	.string	"s_bdi"
 .LASF2854:
 	.string	"wf_table"
-.LASF3116:
+.LASF3118:
 	.string	"image_new_tmp"
 .LASF1729:
 	.string	"num_kp"
-.LASF3269:
+.LASF3271:
 	.string	"__pm_stay_awake"
 .LASF2562:
 	.string	"vmap_area_list"
-.LASF3000:
+.LASF3002:
 	.string	"ebc_auto_thread_sem"
 .LASF627:
 	.string	"in_execve"
@@ -53620,7 +53777,7 @@ __exitcall_ebc_exit:
 	.string	"names_cachep"
 .LASF782:
 	.string	"preset_lpj"
-.LASF2986:
+.LASF2988:
 	.string	"vdd_timer"
 .LASF2218:
 	.string	"archdata"
@@ -53672,7 +53829,7 @@ __exitcall_ebc_exit:
 	.string	"seeks"
 .LASF574:
 	.string	"task_struct"
-.LASF2894:
+.LASF2896:
 	.string	"height_mm"
 .LASF2637:
 	.string	"PGALLOC_MOVABLE"
@@ -53710,7 +53867,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_RESUMING"
 .LASF468:
 	.string	"d_weak_revalidate"
-.LASF2981:
+.LASF2983:
 	.string	"prev_dsp_buf"
 .LASF1490:
 	.string	"NR_VMSCAN_IMMEDIATE"
@@ -53726,7 +53883,7 @@ __exitcall_ebc_exit:
 	.string	"setup_max_cpus"
 .LASF1831:
 	.string	"i_nlink"
-.LASF2937:
+.LASF2939:
 	.string	"mirror"
 .LASF1785:
 	.string	"write_begin"
@@ -53734,11 +53891,11 @@ __exitcall_ebc_exit:
 	.string	"groups"
 .LASF691:
 	.string	"pi_blocked_on"
-.LASF3021:
+.LASF3023:
 	.string	"ebc_probe"
 .LASF498:
 	.string	"s_xattr"
-.LASF3031:
+.LASF3033:
 	.string	"klogo_addr_str"
 .LASF990:
 	.string	"syscr"
@@ -53772,7 +53929,7 @@ __exitcall_ebc_exit:
 	.string	"s_inode_list_lock"
 .LASF2597:
 	.string	"align"
-.LASF3103:
+.LASF3105:
 	.string	"frame_idx"
 .LASF203:
 	.string	"mm_segment_t"
@@ -53794,13 +53951,13 @@ __exitcall_ebc_exit:
 	.string	"maj_flt"
 .LASF228:
 	.string	"arch_rwlock_t"
-.LASF3259:
+.LASF3261:
 	.string	"ebc_osd_buf_clone"
 .LASF161:
 	.string	"c_false"
 .LASF897:
 	.string	"clock_base"
-.LASF2901:
+.LASF2903:
 	.string	"pmic_read_temperature"
 .LASF1795:
 	.string	"launder_page"
@@ -53820,7 +53977,7 @@ __exitcall_ebc_exit:
 	.string	"minor"
 .LASF1696:
 	.string	"nextents"
-.LASF3142:
+.LASF3144:
 	.string	"dma_direction"
 .LASF1:
 	.string	"sizetype"
@@ -53830,13 +53987,13 @@ __exitcall_ebc_exit:
 	.string	"arg_lock"
 .LASF1738:
 	.string	"num_exentries"
-.LASF3082:
+.LASF3084:
 	.string	"check_out"
 .LASF2606:
 	.string	"high_memory"
 .LASF48:
 	.string	"int32_t"
-.LASF3013:
+.LASF3015:
 	.string	"__exitcall_ebc_exit"
 .LASF1037:
 	.string	"nr_failed_migrations_running"
@@ -53844,7 +54001,7 @@ __exitcall_ebc_exit:
 	.string	"next_timer"
 .LASF738:
 	.string	"throttle_queue"
-.LASF3254:
+.LASF3256:
 	.string	"finish_wait"
 .LASF1477:
 	.string	"WORKINGSET_NODERECLAIM"
@@ -53854,7 +54011,7 @@ __exitcall_ebc_exit:
 	.string	"RPM_REQ_RESUME"
 .LASF2042:
 	.string	"keyring_index_key"
-.LASF3136:
+.LASF3138:
 	.string	"ebc_tcon_disable"
 .LASF1418:
 	.string	"leases_enable"
@@ -53876,7 +54033,7 @@ __exitcall_ebc_exit:
 	.string	"lock_key"
 .LASF2560:
 	.string	"tramp_pg_dir"
-.LASF3007:
+.LASF3009:
 	.string	"dev_attr_ebc_version"
 .LASF861:
 	.string	"PCPU_FC_NR"
@@ -53894,7 +54051,7 @@ __exitcall_ebc_exit:
 	.string	"num_vf"
 .LASF1532:
 	.string	"isolate_mode_t"
-.LASF3143:
+.LASF3145:
 	.string	"debug_dma_sync_single_for_device"
 .LASF98:
 	.string	"llseek"
@@ -53928,7 +54085,7 @@ __exitcall_ebc_exit:
 	.string	"file_lock"
 .LASF322:
 	.string	"__idmap_text_end"
-.LASF2959:
+.LASF2961:
 	.string	"frame_total"
 .LASF773:
 	.string	"read_cntvct_el0"
@@ -53936,9 +54093,9 @@ __exitcall_ebc_exit:
 	.string	"target"
 .LASF2543:
 	.string	"HI_SOFTIRQ"
-.LASF3145:
+.LASF3147:
 	.string	"direction"
-.LASF3115:
+.LASF3117:
 	.string	"image_bg_data"
 .LASF955:
 	.string	"session_keyring"
@@ -53948,7 +54105,7 @@ __exitcall_ebc_exit:
 	.string	"key_restrict_link_func_t"
 .LASF1482:
 	.string	"NR_WRITEBACK"
-.LASF3106:
+.LASF3108:
 	.string	"frame_count"
 .LASF484:
 	.string	"s_maxbytes"
@@ -53962,7 +54119,7 @@ __exitcall_ebc_exit:
 	.string	"i2c_bus_type"
 .LASF882:
 	.string	"hrtimer_cpu_base"
-.LASF3264:
+.LASF3266:
 	.string	"ebc_notify"
 .LASF1388:
 	.string	"cb_head"
@@ -53990,7 +54147,7 @@ __exitcall_ebc_exit:
 	.string	"cpus_requested"
 .LASF2591:
 	.string	"__tracepoint_page_ref_mod_unless"
-.LASF3153:
+.LASF3155:
 	.string	"wake_lock_init"
 .LASF1183:
 	.string	"list_lru"
@@ -54014,7 +54171,7 @@ __exitcall_ebc_exit:
 	.string	"d_iput"
 .LASF107:
 	.string	"compat_ioctl"
-.LASF3161:
+.LASF3163:
 	.string	"__range_ok"
 .LASF286:
 	.string	"__start_ro_after_init"
@@ -54022,9 +54179,9 @@ __exitcall_ebc_exit:
 	.string	"num_poisoned_pages"
 .LASF902:
 	.string	"filter"
-.LASF3146:
+.LASF3148:
 	.string	"ebc_pmic_get_vcom"
-.LASF2938:
+.LASF2940:
 	.string	"ebc_tcon"
 .LASF2608:
 	.string	"sysctl_legacy_va_layout"
@@ -54108,13 +54265,13 @@ __exitcall_ebc_exit:
 	.string	"saved_sigmask"
 .LASF411:
 	.string	"d_time"
-.LASF2952:
+.LASF2954:
 	.string	"ebc_info"
 .LASF239:
 	.string	"entries"
 .LASF998:
 	.string	"cpu_id"
-.LASF2945:
+.LASF2947:
 	.string	"dsp_mode_set"
 .LASF2649:
 	.string	"PGMAJFAULT"
@@ -54132,11 +54289,11 @@ __exitcall_ebc_exit:
 	.string	"power"
 .LASF265:
 	.string	"strict_mask"
-.LASF3253:
+.LASF3255:
 	.string	"init_wait_entry"
 .LASF2784:
 	.string	"module_state"
-.LASF3213:
+.LASF3215:
 	.string	"_dev_info"
 .LASF414:
 	.string	"d_subdirs"
@@ -54158,7 +54315,7 @@ __exitcall_ebc_exit:
 	.string	"wait_pidfd"
 .LASF1943:
 	.string	"s_umount_key"
-.LASF2922:
+.LASF2924:
 	.string	"xen_start_info"
 .LASF2455:
 	.string	"of_fwnode_ops"
@@ -54182,13 +54339,13 @@ __exitcall_ebc_exit:
 	.string	"removed_mem"
 .LASF247:
 	.string	"jump_label_t"
-.LASF3127:
+.LASF3129:
 	.string	"ebc_tcon_frame_start"
 .LASF2709:
 	.string	"Elf64_Half"
 .LASF2284:
 	.string	"use_autosuspend"
-.LASF3014:
+.LASF3016:
 	.string	"ebc_init"
 .LASF672:
 	.string	"nsproxy"
@@ -54220,15 +54377,15 @@ __exitcall_ebc_exit:
 	.string	"init_on_free"
 .LASF1149:
 	.string	"nr_pages"
-.LASF3121:
+.LASF3123:
 	.string	"ebc_power_set"
 .LASF1759:
 	.string	"num_trace_bprintk_fmt"
-.LASF3207:
+.LASF3209:
 	.string	"__fls"
 .LASF1127:
 	.string	"ioprio"
-.LASF2989:
+.LASF2991:
 	.string	"is_early_suspend"
 .LASF1161:
 	.string	"rdev"
@@ -54250,9 +54407,9 @@ __exitcall_ebc_exit:
 	.string	"persistent_clock_is_local"
 .LASF2411:
 	.string	"dma_supported"
-.LASF3178:
+.LASF3180:
 	.string	"dev_set_drvdata"
-.LASF3265:
+.LASF3267:
 	.string	"epd_lut_get"
 .LASF1533:
 	.string	"per_cpu_pages"
@@ -54288,7 +54445,7 @@ __exitcall_ebc_exit:
 	.string	"BLOCK_SOFTIRQ"
 .LASF1409:
 	.string	"files_stat_struct"
-.LASF3219:
+.LASF3221:
 	.string	"devm_memremap"
 .LASF841:
 	.string	"pgtable_t"
@@ -54300,13 +54457,13 @@ __exitcall_ebc_exit:
 	.string	"symlink"
 .LASF1572:
 	.string	"mem_map"
-.LASF3074:
+.LASF3076:
 	.string	"old_buffer"
-.LASF2948:
+.LASF2950:
 	.string	"lut_data_set"
 .LASF788:
 	.string	"sysctl_timer_migration"
-.LASF2908:
+.LASF2910:
 	.string	"DMA_NONE"
 .LASF1896:
 	.string	"fl_type"
@@ -54356,7 +54513,7 @@ __exitcall_ebc_exit:
 	.string	"rm_xquota"
 .LASF1082:
 	.string	"dl_timer"
-.LASF3250:
+.LASF3252:
 	.string	"remap_pfn_range"
 .LASF2373:
 	.string	"DL_DEV_NO_DRIVER"
@@ -54370,7 +54527,7 @@ __exitcall_ebc_exit:
 	.string	"watermark"
 .LASF2421:
 	.string	"deadprops"
-.LASF3215:
+.LASF3217:
 	.string	"devm_kmalloc"
 .LASF16:
 	.string	"long long unsigned int"
@@ -54400,7 +54557,7 @@ __exitcall_ebc_exit:
 	.string	"flc_lease"
 .LASF2404:
 	.string	"unmap_resource"
-.LASF2984:
+.LASF2986:
 	.string	"wake_lock_is_set"
 .LASF2356:
 	.string	"driver_private"
@@ -54446,7 +54603,7 @@ __exitcall_ebc_exit:
 	.string	"pstate_check_t"
 .LASF828:
 	.string	"system_freezable_power_efficient_wq"
-.LASF3018:
+.LASF3020:
 	.string	"__func__"
 .LASF56:
 	.string	"resource_size_t"
@@ -54468,7 +54625,7 @@ __exitcall_ebc_exit:
 	.string	"_stext"
 .LASF1708:
 	.string	"quotactl_ops"
-.LASF3079:
+.LASF3081:
 	.string	"aligned_left"
 .LASF533:
 	.string	"s_sync_lock"
@@ -54478,7 +54635,7 @@ __exitcall_ebc_exit:
 	.string	"__kernel_clock_t"
 .LASF390:
 	.string	"nr_unused"
-.LASF2911:
+.LASF2913:
 	.string	"dma_address"
 .LASF2613:
 	.string	"mmap_rnd_compat_bits_max"
@@ -54498,15 +54655,15 @@ __exitcall_ebc_exit:
 	.string	"vregs"
 .LASF2622:
 	.string	"page_entry_size"
-.LASF2969:
+.LASF2971:
 	.string	"lut_data"
-.LASF3091:
+.LASF3093:
 	.string	"ebc_other_init"
 .LASF1444:
 	.string	"free_list"
 .LASF587:
 	.string	"prio"
-.LASF3170:
+.LASF3172:
 	.string	"platform_get_drvdata"
 .LASF2553:
 	.string	"NR_SOFTIRQS"
@@ -54528,7 +54685,7 @@ __exitcall_ebc_exit:
 	.string	"atomic_t"
 .LASF810:
 	.string	"WORK_OFFQ_FLAG_BITS"
-.LASF3128:
+.LASF3130:
 	.string	"ebc_tcon_image_addr_set"
 .LASF2529:
 	.string	"max_num_msgs"
@@ -54544,11 +54701,11 @@ __exitcall_ebc_exit:
 	.string	"short int"
 .LASF2352:
 	.string	"of_device_id"
-.LASF2909:
+.LASF2911:
 	.string	"scatterlist"
 .LASF1265:
 	.string	"altmap_valid"
-.LASF3267:
+.LASF3269:
 	.string	"down"
 .LASF101:
 	.string	"read_iter"
@@ -54586,7 +54743,7 @@ __exitcall_ebc_exit:
 	.string	"pm_domain_data"
 .LASF2485:
 	.string	"byte"
-.LASF3239:
+.LASF3241:
 	.string	"__wake_up_sync"
 .LASF2000:
 	.string	"poll_table_struct"
@@ -54596,11 +54753,11 @@ __exitcall_ebc_exit:
 	.string	"current_may_mount"
 .LASF379:
 	.string	"seqlock_t"
-.LASF2940:
+.LASF2942:
 	.string	"hclk"
 .LASF2113:
 	.string	"kernfs_iattrs"
-.LASF2902:
+.LASF2904:
 	.string	"pmic_get_vcom"
 .LASF624:
 	.string	"sched_migrated"
@@ -54612,7 +54769,7 @@ __exitcall_ebc_exit:
 	.string	"page_fault"
 .LASF1467:
 	.string	"NR_INACTIVE_FILE"
-.LASF3194:
+.LASF3196:
 	.string	"__ret_warn_on"
 .LASF1623:
 	.string	"kqid"
@@ -54702,7 +54859,7 @@ __exitcall_ebc_exit:
 	.string	"thread_id"
 .LASF730:
 	.string	"default_timer_slack_ns"
-.LASF3049:
+.LASF3051:
 	.string	"waveform_version_read"
 .LASF1765:
 	.string	"source_list"
@@ -54732,7 +54889,7 @@ __exitcall_ebc_exit:
 	.string	"of_match_table"
 .LASF2576:
 	.string	"percpu_count_ptr"
-.LASF3249:
+.LASF3251:
 	.string	"ebc_phy_buf_base_get"
 .LASF2077:
 	.string	"loops_per_jiffy"
@@ -54744,7 +54901,7 @@ __exitcall_ebc_exit:
 	.string	"uuid_t"
 .LASF2435:
 	.string	"property_read_int_array"
-.LASF2972:
+.LASF2974:
 	.string	"auto_image_old"
 .LASF1858:
 	.string	"setattr2"
@@ -54754,7 +54911,7 @@ __exitcall_ebc_exit:
 	.string	"KSWAPD_INODESTEAL"
 .LASF1173:
 	.string	"count_objects"
-.LASF3206:
+.LASF3208:
 	.string	"fls64"
 .LASF919:
 	.string	"_stime"
@@ -54772,9 +54929,9 @@ __exitcall_ebc_exit:
 	.string	"atomic_notifier_head"
 .LASF1058:
 	.string	"statistics"
-.LASF2929:
+.LASF2931:
 	.string	"current_buffer"
-.LASF3104:
+.LASF3106:
 	.string	"direct_mode_data_change"
 .LASF1616:
 	.string	"kprojid_t"
@@ -54790,15 +54947,15 @@ __exitcall_ebc_exit:
 	.string	"sync_sg_for_device"
 .LASF1962:
 	.string	"statfs"
-.LASF3233:
+.LASF3235:
 	.string	"__kmalloc"
-.LASF3222:
+.LASF3224:
 	.string	"_dev_err"
-.LASF3212:
+.LASF3214:
 	.string	"__platform_driver_register"
-.LASF2956:
+.LASF2958:
 	.string	"ebc_buf_real_size"
-.LASF2998:
+.LASF3000:
 	.string	"ebc_thread_wq"
 .LASF1792:
 	.string	"migratepage"
@@ -54806,7 +54963,7 @@ __exitcall_ebc_exit:
 	.string	"DROP_PAGECACHE"
 .LASF790:
 	.string	"work_struct"
-.LASF2891:
+.LASF2893:
 	.string	"height"
 .LASF1092:
 	.string	"task_group"
@@ -54848,7 +55005,7 @@ __exitcall_ebc_exit:
 	.string	"max_comb_1st_msg_len"
 .LASF1543:
 	.string	"ZONE_MOVABLE"
-.LASF3002:
+.LASF3004:
 	.string	"ebc_misc"
 .LASF2390:
 	.string	"revmap_size"
@@ -54880,7 +55037,7 @@ __exitcall_ebc_exit:
 	.string	"WORK_STRUCT_PENDING_BIT"
 .LASF718:
 	.string	"rseq"
-.LASF3105:
+.LASF3107:
 	.string	"get_auto_image"
 .LASF195:
 	.string	"nfds"
@@ -54894,17 +55051,17 @@ __exitcall_ebc_exit:
 	.string	"i_acl"
 .LASF1787:
 	.string	"bmap"
-.LASF3220:
+.LASF3222:
 	.string	"ebc_buf_init"
 .LASF2046:
 	.string	"key_payload"
-.LASF2976:
+.LASF2978:
 	.string	"auto_image_osd"
 .LASF478:
 	.string	"d_real"
 .LASF2558:
 	.string	"swapper_pg_end"
-.LASF3004:
+.LASF3006:
 	.string	"dev_attr_pmic_name"
 .LASF629:
 	.string	"in_user_fault"
@@ -54934,7 +55091,7 @@ __exitcall_ebc_exit:
 	.string	"fallocate"
 .LASF1705:
 	.string	"i_spc_warnlimit"
-.LASF3195:
+.LASF3197:
 	.string	"check_object_size"
 .LASF1513:
 	.string	"node_present_pages"
@@ -54984,7 +55141,7 @@ __exitcall_ebc_exit:
 	.string	"__idmap_text_start"
 .LASF1714:
 	.string	"set_info"
-.LASF3052:
+.LASF3054:
 	.string	"ebc_mmap"
 .LASF2617:
 	.string	"sysctl_admin_reserve_kbytes"
@@ -54996,9 +55153,9 @@ __exitcall_ebc_exit:
 	.string	"lock_ops"
 .LASF1324:
 	.string	"hiwater_vm"
-.LASF3046:
+.LASF3048:
 	.string	"pmic_vcom_read"
-.LASF3214:
+.LASF3216:
 	.string	"misc_deregister"
 .LASF1246:
 	.string	"compound_head"
@@ -55018,7 +55175,7 @@ __exitcall_ebc_exit:
 	.string	"bd_write_holder"
 .LASF2192:
 	.string	"poweroff_noirq"
-.LASF3217:
+.LASF3219:
 	.string	"of_parse_phandle"
 .LASF1856:
 	.string	"rename"
@@ -55038,9 +55195,9 @@ __exitcall_ebc_exit:
 	.string	"i_rt_spc_timelimit"
 .LASF139:
 	.string	"oops_in_progress"
-.LASF3001:
+.LASF3003:
 	.string	"ebc_ops"
-.LASF3027:
+.LASF3029:
 	.string	"klogo_addr"
 .LASF1649:
 	.string	"qf_next"
@@ -55048,9 +55205,9 @@ __exitcall_ebc_exit:
 	.string	"sync_single_for_cpu"
 .LASF791:
 	.string	"data"
-.LASF3163:
+.LASF3165:
 	.string	"kzalloc"
-.LASF3188:
+.LASF3190:
 	.string	"msecs_to_jiffies"
 .LASF1917:
 	.string	"lm_break"
@@ -55064,7 +55221,7 @@ __exitcall_ebc_exit:
 	.string	"personality"
 .LASF1823:
 	.string	"bd_queue"
-.LASF3015:
+.LASF3017:
 	.string	"ebc_resume"
 .LASF2827:
 	.string	"init_task"
@@ -55086,7 +55243,7 @@ __exitcall_ebc_exit:
 	.string	"signed char"
 .LASF373:
 	.string	"rcu_scheduler_active"
-.LASF3173:
+.LASF3175:
 	.string	"propname"
 .LASF2099:
 	.string	"priv"
@@ -55140,7 +55297,7 @@ __exitcall_ebc_exit:
 	.string	"arch"
 .LASF2259:
 	.string	"no_pm"
-.LASF2889:
+.LASF2891:
 	.string	"ebc_buf_info"
 .LASF934:
 	.string	"_kill"
@@ -55166,7 +55323,7 @@ __exitcall_ebc_exit:
 	.string	"sve_vl"
 .LASF2652:
 	.string	"PGSTEAL_KSWAPD"
-.LASF3029:
+.LASF3031:
 	.string	"klogo_addr_valid"
 .LASF2600:
 	.string	"MEMORY_DEVICE_PUBLIC"
@@ -55212,7 +55369,7 @@ __exitcall_ebc_exit:
 	.string	"WF_TYPE_GCC16"
 .LASF2512:
 	.string	"i2c_lock_operations"
-.LASF3123:
+.LASF3125:
 	.string	"ebc_get_4pix_wf_part"
 .LASF1618:
 	.string	"USRQUOTA"
@@ -55220,7 +55377,7 @@ __exitcall_ebc_exit:
 	.string	"description"
 .LASF2795:
 	.string	"symtab"
-.LASF2913:
+.LASF2915:
 	.string	"sg_table"
 .LASF1122:
 	.string	"rt_mutex_waiter"
@@ -55234,7 +55391,7 @@ __exitcall_ebc_exit:
 	.string	"in_iowait"
 .LASF2584:
 	.string	"unregfunc"
-.LASF2899:
+.LASF2901:
 	.string	"pmic_pm_suspend"
 .LASF1102:
 	.string	"egid"
@@ -55258,7 +55415,7 @@ __exitcall_ebc_exit:
 	.string	"f_inode"
 .LASF2029:
 	.string	"procname"
-.LASF3224:
+.LASF3226:
 	.string	"epd_lut_from_file_init"
 .LASF1667:
 	.string	"mark_dirty"
@@ -55282,19 +55439,19 @@ __exitcall_ebc_exit:
 	.string	"__kernel_clockid_t"
 .LASF683:
 	.string	"seccomp"
-.LASF3065:
+.LASF3067:
 	.string	"ebc_rst_panel"
 .LASF1789:
 	.string	"releasepage"
 .LASF1700:
 	.string	"qc_info"
-.LASF3066:
+.LASF3068:
 	.string	"ebc_thread"
-.LASF3081:
+.LASF3083:
 	.string	"pbuf_old"
 .LASF1501:
 	.string	"recent_scanned"
-.LASF2931:
+.LASF2933:
 	.string	"vir_height"
 .LASF1741:
 	.string	"core_layout"
@@ -55306,7 +55463,7 @@ __exitcall_ebc_exit:
 	.string	"win_y1"
 .LASF2869:
 	.string	"win_y2"
-.LASF3075:
+.LASF3077:
 	.string	"buf_size"
 .LASF2086:
 	.string	"bitmap"
@@ -55346,11 +55503,11 @@ __exitcall_ebc_exit:
 	.string	"MIGRATE_SYNC_LIGHT"
 .LASF1035:
 	.string	"nr_migrations_cold"
-.LASF3044:
+.LASF3046:
 	.string	"ebc_version_read"
 .LASF303:
 	.string	"__end_once"
-.LASF2917:
+.LASF2919:
 	.string	"dma_noncoherent_ops"
 .LASF1503:
 	.string	"lists"
@@ -55366,7 +55523,7 @@ __exitcall_ebc_exit:
 	.string	"inactive_age"
 .LASF2601:
 	.string	"MEMORY_DEVICE_FS_DAX"
-.LASF2960:
+.LASF2962:
 	.string	"frame_bw_total"
 .LASF2793:
 	.string	"ro_after_init_size"
@@ -55410,9 +55567,9 @@ __exitcall_ebc_exit:
 	.string	"percpu_size"
 .LASF1321:
 	.string	"mmap_sem"
-.LASF3251:
+.LASF3253:
 	.string	"schedule"
-.LASF3084:
+.LASF3086:
 	.string	"old_buf_left"
 .LASF2440:
 	.string	"get_reference_args"
@@ -55472,7 +55629,7 @@ __exitcall_ebc_exit:
 	.string	"ki_flags"
 .LASF1389:
 	.string	"gp_type"
-.LASF2963:
+.LASF2965:
 	.string	"part_mode_count"
 .LASF398:
 	.string	"d_in_lookup_hash"
@@ -55498,7 +55655,7 @@ __exitcall_ebc_exit:
 	.string	"lock_stat"
 .LASF2392:
 	.string	"revmap_tree_mutex"
-.LASF3048:
+.LASF3050:
 	.string	"pmic_name_read"
 .LASF1077:
 	.string	"dl_throttled"
@@ -55524,7 +55681,7 @@ __exitcall_ebc_exit:
 	.string	"dma_configure"
 .LASF2290:
 	.string	"runtime_error"
-.LASF3056:
+.LASF3058:
 	.string	"temp_offset"
 .LASF947:
 	.string	"__count"
@@ -55550,7 +55707,7 @@ __exitcall_ebc_exit:
 	.string	"text_size"
 .LASF1651:
 	.string	"stat"
-.LASF2980:
+.LASF2982:
 	.string	"lut_ddr_vir"
 .LASF1319:
 	.string	"map_count"
@@ -55564,11 +55721,11 @@ __exitcall_ebc_exit:
 	.string	"uid_keyring"
 .LASF723:
 	.string	"splice_pipe"
-.LASF3087:
+.LASF3089:
 	.string	"frame_done_callback"
 .LASF1798:
 	.string	"error_remove_page"
-.LASF3083:
+.LASF3085:
 	.string	"new_buf_left"
 .LASF2321:
 	.string	"pdev_archdata"
@@ -55610,7 +55767,7 @@ __exitcall_ebc_exit:
 	.string	"compound_mapcount"
 .LASF1447:
 	.string	"zone_stat_item"
-.LASF3165:
+.LASF3167:
 	.string	"kmalloc_large"
 .LASF2624:
 	.string	"PE_SIZE_PMD"
@@ -55648,7 +55805,7 @@ __exitcall_ebc_exit:
 	.string	"gp_count"
 .LASF2049:
 	.string	"key_restriction"
-.LASF3072:
+.LASF3074:
 	.string	"check_part_mode"
 .LASF616:
 	.string	"exit_state"
@@ -55680,9 +55837,9 @@ __exitcall_ebc_exit:
 	.string	"fs_supers"
 .LASF1129:
 	.string	"last_waited"
-.LASF3051:
+.LASF3053:
 	.string	"ebc_open"
-.LASF3134:
+.LASF3136:
 	.string	"three_win_mode"
 .LASF2872:
 	.string	"EPD_OVERLAY"
@@ -55690,7 +55847,7 @@ __exitcall_ebc_exit:
 	.string	"dqb_bsoftlimit"
 .LASF218:
 	.string	"pending"
-.LASF2977:
+.LASF2979:
 	.string	"direct_buffer"
 .LASF2490:
 	.string	"i2c_client_type"
@@ -55716,7 +55873,7 @@ __exitcall_ebc_exit:
 	.string	"pt_mm"
 .LASF1502:
 	.string	"lruvec"
-.LASF2895:
+.LASF2897:
 	.string	"ebc_pmic"
 .LASF14:
 	.string	"long long int"
@@ -55734,7 +55891,7 @@ __exitcall_ebc_exit:
 	.string	"timer_expires"
 .LASF2825:
 	.string	"mmlist_lock"
-.LASF3151:
+.LASF3153:
 	.string	"ebc_pmic_power_on"
 .LASF1763:
 	.string	"trace_evals"
@@ -55776,7 +55933,7 @@ __exitcall_ebc_exit:
 	.string	"relax_count"
 .LASF1411:
 	.string	"nr_free_files"
-.LASF3164:
+.LASF3166:
 	.string	"kmalloc"
 	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
 	.section	.note.GNU-stack,"",@progbits

commit d8d6cb35c4dd7bd91a19787062ee93706782ac2a
Author: Radu Rendec <radu.rendec@gmail.com>
Date:   Thu Nov 15 21:09:54 2018 -0500

    UPSTREAM: kernfs: Improve kernfs_notify() poll notification latency
    
    kernfs_notify() does two notifications: poll and fsnotify. Originally,
    both notifications were done from scheduled work context and all that
    kernfs_notify() did was schedule the work.
    
    This patch simply moves the poll notification from the scheduled work
    handler to kernfs_notify(). The fsnotify notification still needs to be
    done from scheduled work context because it can sleep (it needs to lock
    a mutex).
    
    If the poll notification is time critical (the notified thread needs to
    wake as quickly as possible), it's better to do it from kernfs_notify()
    directly. One example is calling sysfs_notify_dirent() from a hardware
    interrupt handler to wake up a thread and handle the interrupt in user
    space.
    
    Change-Id: If4983487f6aadecfb2185acbafeff47a1c7bb66f
    Signed-off-by: Radu Rendec <radu.rendec@gmail.com>
    Acked-by: Tejun Heo <tj@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    (cherry picked from commit 03c0a9208bb10821e5e3f1c81e6218df32524311)

diff --git a/fs/kernfs/file.c b/fs/kernfs/file.c
index 2d8b91f4475d..ae948aaa4c53 100644
--- a/fs/kernfs/file.c
+++ b/fs/kernfs/file.c
@@ -866,7 +866,6 @@ static __poll_t kernfs_fop_poll(struct file *filp, poll_table *wait)
 static void kernfs_notify_workfn(struct work_struct *work)
 {
 	struct kernfs_node *kn;
-	struct kernfs_open_node *on;
 	struct kernfs_super_info *info;
 repeat:
 	/* pop one off the notify_list */
@@ -880,17 +879,6 @@ static void kernfs_notify_workfn(struct work_struct *work)
 	kn->attr.notify_next = NULL;
 	spin_unlock_irq(&kernfs_notify_lock);
 
-	/* kick poll */
-	spin_lock_irq(&kernfs_open_node_lock);
-
-	on = kn->attr.open;
-	if (on) {
-		atomic_inc(&on->event);
-		wake_up_interruptible(&on->poll);
-	}
-
-	spin_unlock_irq(&kernfs_open_node_lock);
-
 	/* kick fsnotify */
 	mutex_lock(&kernfs_mutex);
 
@@ -943,10 +931,21 @@ void kernfs_notify(struct kernfs_node *kn)
 {
 	static DECLARE_WORK(kernfs_notify_work, kernfs_notify_workfn);
 	unsigned long flags;
+	struct kernfs_open_node *on;
 
 	if (WARN_ON(kernfs_type(kn) != KERNFS_FILE))
 		return;
 
+	/* kick poll immediately */
+	spin_lock_irqsave(&kernfs_open_node_lock, flags);
+	on = kn->attr.open;
+	if (on) {
+		atomic_inc(&on->event);
+		wake_up_interruptible(&on->poll);
+	}
+	spin_unlock_irqrestore(&kernfs_open_node_lock, flags);
+
+	/* schedule work to kick fsnotify */
 	spin_lock_irqsave(&kernfs_notify_lock, flags);
 	if (!kn->attr.notify_next) {
 		kernfs_get(kn);

commit 06fc5af0658f98035aa061b8d32bc91b23b8ee15
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Mon May 31 16:59:50 2021 +0800

    media: platform: cif fix fs/fe count error
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I56a6f5de22065f246a419f698385e3620142fd57

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index 83636607e251..7e66403866f3 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -5208,7 +5208,7 @@ void rkcif_irq_pingpong(struct rkcif_device *cif_dev)
 
 			if (detect_stream->fs_cnt_in_single_frame >= 1)
 				v4l2_warn(&cif_dev->v4l2_dev,
-					  "%s:warn: fs has been incread:%d(frm0)\n",
+					  "%s:warn: fs has been incread:%u(frm0)\n",
 					  __func__, detect_stream->fs_cnt_in_single_frame);
 			detect_stream->fs_cnt_in_single_frame++;
 		}
@@ -5220,7 +5220,7 @@ void rkcif_irq_pingpong(struct rkcif_device *cif_dev)
 				rkcif_lvds_event_inc_sof(cif_dev);
 
 			if (detect_stream->fs_cnt_in_single_frame >= 1)
-				v4l2_warn(&cif_dev->v4l2_dev, "%s:warn: fs has been incread:%d(frm1)\n",
+				v4l2_warn(&cif_dev->v4l2_dev, "%s:warn: fs has been incread:%u(frm1)\n",
 				 __func__, detect_stream->fs_cnt_in_single_frame);
 			detect_stream->fs_cnt_in_single_frame++;
 		}
@@ -5272,18 +5272,19 @@ void rkcif_irq_pingpong(struct rkcif_device *cif_dev)
 
 			rkcif_update_stream(cif_dev, stream, mipi_id);
 			rkcif_monitor_reset_event(cif_dev);
-			if (stream->id == RKCIF_STREAM_MIPI_ID0 &&
-			    (intstat & (CSI_FRAME1_START_ID0 | CSI_FRAME0_START_ID0)) == 0 &&
-			     detect_stream->fs_cnt_in_single_frame > 1) {
-				v4l2_err(&cif_dev->v4l2_dev,
-					 "%s ERR: multi fs in oneframe, bak_int:0x%x, fs_num:%d\n",
-					 __func__,
-					 bak_intstat,
-					 detect_stream->fs_cnt_in_single_frame);
-				detect_stream->is_fs_fe_not_paired = true;
-				detect_stream->fs_cnt_in_single_frame = 0;
-			} else {
-				detect_stream->fs_cnt_in_single_frame--;
+			if (mipi_id == RKCIF_STREAM_MIPI_ID0) {
+				if ((intstat & (CSI_FRAME1_START_ID0 | CSI_FRAME0_START_ID0)) == 0 &&
+				    detect_stream->fs_cnt_in_single_frame > 1) {
+					v4l2_err(&cif_dev->v4l2_dev,
+						 "%s ERR: multi fs in oneframe, bak_int:0x%x, fs_num:%u\n",
+						 __func__,
+						 bak_intstat,
+						 detect_stream->fs_cnt_in_single_frame);
+					detect_stream->is_fs_fe_not_paired = true;
+					detect_stream->fs_cnt_in_single_frame = 0;
+				} else {
+					detect_stream->fs_cnt_in_single_frame--;
+				}
 			}
 		}
 		cif_dev->irq_stats.all_frm_end_cnt++;

commit 4346e71373adf03df155da69e0e7dab95749f708
Author: Wang Panzhenzhuan <randy.wang@rock-chips.com>
Date:   Mon May 31 17:47:23 2021 +0800

    media: i2c: sc200ai: fix set exposue bug
    
    ctrl->val = ctrl->val * 2 will return
    ctrl->val to v4l2 framework, and if next time
    set ctrl->val is 2 * previous ctrl->val, will not actually set;
    so fix it.
    
    Signed-off-by: Wang Panzhenzhuan <randy.wang@rock-chips.com>
    Change-Id: I965f33f2e592a88ab2b8f6e362ca399260fe98ab

diff --git a/drivers/media/i2c/sc200ai.c b/drivers/media/i2c/sc200ai.c
index 9f5e098aaba2..8b9dd82ada0b 100644
--- a/drivers/media/i2c/sc200ai.c
+++ b/drivers/media/i2c/sc200ai.c
@@ -10,6 +10,9 @@
  * V0.0X01.0X04 add enum_frame_interval function.
  * V0.0X01.0X05 add quick stream on/off.
  * V0.0X01.0X06 fix set vflip/hflip failed bug.
+ * V0.0X01.0X07
+ * 1. fix set double times exposue value failed issue.
+ * 2. add some debug info.
  */
 
 #include <linux/clk.h>
@@ -31,7 +34,7 @@
 #include <media/v4l2-subdev.h>
 #include <linux/pinctrl/consumer.h>
 
-#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x06)
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x07)
 
 #ifndef V4L2_CID_DIGITAL_GAIN
 #define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
@@ -1471,6 +1474,7 @@ static int sc200ai_set_ctrl(struct v4l2_ctrl *ctrl)
 	s64 max;
 	int ret = 0;
 	u32 val = 0;
+	s32 temp = 0;
 
 	/* Propagate change of current control to all related controls */
 	switch (ctrl->id) {
@@ -1489,28 +1493,31 @@ static int sc200ai_set_ctrl(struct v4l2_ctrl *ctrl)
 
 	switch (ctrl->id) {
 	case V4L2_CID_EXPOSURE:
+		dev_dbg(&client->dev, "set exposure value 0x%x\n", ctrl->val);
 		if (sc200ai->cur_mode->hdr_mode == NO_HDR) {
-			ctrl->val = ctrl->val * 2;
+			temp = ctrl->val * 2;
 			/* 4 least significant bits of expsoure are fractional part */
 			ret = sc200ai_write_reg(sc200ai->client,
 						SC200AI_REG_EXPOSURE_H,
 						SC200AI_REG_VALUE_08BIT,
-						SC200AI_FETCH_EXP_H(ctrl->val));
+						SC200AI_FETCH_EXP_H(temp));
 			ret |= sc200ai_write_reg(sc200ai->client,
 						 SC200AI_REG_EXPOSURE_M,
 						 SC200AI_REG_VALUE_08BIT,
-						 SC200AI_FETCH_EXP_M(ctrl->val));
+						 SC200AI_FETCH_EXP_M(temp));
 			ret |= sc200ai_write_reg(sc200ai->client,
 						 SC200AI_REG_EXPOSURE_L,
 						 SC200AI_REG_VALUE_08BIT,
-						 SC200AI_FETCH_EXP_L(ctrl->val));
+						 SC200AI_FETCH_EXP_L(temp));
 		}
 		break;
 	case V4L2_CID_ANALOGUE_GAIN:
+		dev_dbg(&client->dev, "set gain value 0x%x\n", ctrl->val);
 		if (sc200ai->cur_mode->hdr_mode == NO_HDR)
 			ret = sc200ai_set_gain_reg(sc200ai, ctrl->val, SC200AI_LGAIN);
 		break;
 	case V4L2_CID_VBLANK:
+		dev_dbg(&client->dev, "set blank value 0x%x\n", ctrl->val);
 		ret = sc200ai_write_reg(sc200ai->client,
 					SC200AI_REG_VTS_H,
 					SC200AI_REG_VALUE_08BIT,

commit 066a36326ee1598aff98c1066e77c4e1ce08349e
Author: David Wu <david.wu@rock-chips.com>
Date:   Mon Apr 26 17:12:00 2021 +0800

    arm64: dts: rockchip: Add QSGMII support for rk3568-evb2
    
    Maybe some people want to use the Ethernet function of evb2,
    which is turned on by default so that the Ethernet can work.
    
    Signed-off-by: David Wu <david.wu@rock-chips.com>
    Change-Id: I314ac4e0d51804ea3463735d6cc9c90a536d173a

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi
index a431b0b54a37..57eb90227ef4 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi
@@ -74,6 +74,17 @@
 			  3300000 0x1>;
 	};
 
+	qsgmii_3v3: gpio-regulator {
+		compatible = "regulator-gpio";
+		regulator-name = "qsgmii_3v3";
+		regulator-min-microvolt = <0100000>;
+		regulator-max-microvolt = <3300000>;
+		gpios = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>;
+		gpios-states = <0x1>;
+		states = <0100000 0x0
+			  3300000 0x1>;
+	};
+
 	vcc3v3_bu: vcc3v3-bu {
 		compatible = "regulator-fixed";
 		regulator-name = "vcc3v3_bu";
@@ -138,57 +149,39 @@
 };
 
 &gmac0 {
-	phy-mode = "rgmii";
-	clock_in_out = "output";
+	phy-supply = <&qsgmii_3v3>;
+	phy-mode = "qsgmii";
+	rockchip,xpcs = <&xpcs>;
 
-	snps,reset-gpio = <&gpio2 RK_PD3 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_GMAC0_RX_TX>, <&cru SCLK_GMAC0>;
-	assigned-clock-parents = <&cru SCLK_GMAC0_RGMII_SPEED>, <&cru CLK_MAC0_2TOP>;
-	assigned-clock-rates = <0>, <125000000>;
+	assigned-clocks = <&cru SCLK_GMAC0_RX_TX>;
+	assigned-clock-parents = <&gmac0_xpcsclk>;
 
-	pinctrl-names = "default";
-	pinctrl-0 = <&gmac0_miim
-		     &gmac0_tx_bus2
-		     &gmac0_rx_bus2
-		     &gmac0_rgmii_clk
-		     &gmac0_rgmii_bus>;
-
-	tx_delay = <0x3c>;
-	rx_delay = <0x2f>;
+	power-domains = <&power RK3568_PD_PIPE>;
+	phys = <&combphy1_usq PHY_TYPE_QSGMII>;
+	phy-handle = <&qsgmii_phy0>;
 
-	phy-handle = <&rgmii_phy0>;
-	status = "disabled";
+	status = "okay";
 };
 
 &gmac1 {
-	phy-mode = "rgmii";
-	clock_in_out = "output";
+	phy-supply = <&qsgmii_3v3>;
+	phy-mode = "qsgmii";
 
-	snps,reset-gpio = <&gpio2 RK_PD1 GPIO_ACTIVE_LOW>;
+	snps,reset-gpio = <&gpio3 RK_PD5 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>;
+	assigned-clocks = <&cru SCLK_GMAC1_RX_TX>;
+	assigned-clock-parents = <&gmac1_xpcsclk>;
 
 	pinctrl-names = "default";
-	pinctrl-0 = <&gmac1m1_miim
-		     &gmac1m1_tx_bus2
-		     &gmac1m1_rx_bus2
-		     &gmac1m1_rgmii_clk
-		     &gmac1m1_rgmii_bus>;
+	pinctrl-0 = <&gmac1m1_miim>;
 
-	tx_delay = <0x4f>;
-	rx_delay = <0x26>;
+	power-domains = <&power RK3568_PD_PIPE>;
+	phy-handle = <&qsgmii_phy1>;
 
-	phy-handle = <&rgmii_phy1>;
-	status = "disabled";
+	status = "okay";
 };
 
 /*
@@ -221,18 +214,23 @@
 	status = "disabled";
 };
 
-&mdio0 {
-	rgmii_phy0: phy@0 {
-		compatible = "ethernet-phy-ieee802.3-c22";
-		reg = <0x0>;
-	};
-};
-
 &mdio1 {
-	rgmii_phy1: phy@0 {
-		compatible = "ethernet-phy-ieee802.3-c22";
+	qsgmii_phy0: phy@0 {
+		compatible = "ethernet-phy-id001c.c942", "ethernet-phy-ieee802.3-c22";
 		reg = <0x0>;
 	};
+	qsgmii_phy1: phy@1 {
+		compatible = "ethernet-phy-id001c.c942", "ethernet-phy-ieee802.3-c22";
+		reg = <0x1>;
+	};
+	qsgmii_phy2: phy@2 {
+		compatible = "ethernet-phy-id001c.c942", "ethernet-phy-ieee802.3-c22";
+		reg = <0x2>;
+	};
+	qsgmii_phy3: phy@3 {
+		compatible = "ethernet-phy-id001c.c942", "ethernet-phy-ieee802.3-c22";
+		reg = <0x3>;
+	};
 };
 
 &mipi_dphy0 {
@@ -488,3 +486,7 @@
 	BT,wake_host_irq = <&gpio2 RK_PC0 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
+
+&xpcs {
+	status = "okay";
+};

commit 03eca205254a273e4b2815a0ea8bf082757c4e5d
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Mon May 31 10:31:20 2021 +0800

    ASoC: rockchip: i2s-tdm: Delay for reset successfully
    
    This patch Adds delay after reset deassert to make sure
    reset done before do enabling xfer.
    
    Considering the follow situation:
    
    - i2s_mclk for 8K capture [2.048M]
    - i2s_hclk for i2s register access [150M]
    - pclk_cru for cru register access [100M]
    
           SW                               HW
    
    i2s reset assert   [pclk_cru]           |
            |                               |
       delay time                           |
            |                       i2s reset assert   [i2s_mclk]
    i2s reset deassert [pclk_cru]           |
            |                               |
    i2s xfer enable    [i2s_hclk]           |
            |                       i2s reset deassert [i2s_mclk]
    
    Obviously, pclk_cru(10ns per cycle) is much faster than i2s_mclk
    (500ns per cycle). so delay should be added after reset deassert
    to make sure hw reset done. Otherwise, the race between reset and
    enable xfer maybe break i2s data aligned.
    
    Fixes: A 10us delay is enough
    
           SW                               HW
    
    i2s reset assert   [pclk_cru]           |
            |                               |
       delay 10us                           |
            |                       i2s reset assert   [i2s_mclk]
    i2s reset deassert [pclk_cru]           |
            |                               |
       delay 10us                           |
            |                       i2s reset deassert [i2s_mclk]
    i2s xfer enable    [i2s_hclk]           |
            |                               |
    
    Change-Id: Id370b0aa13f771053841ce04a554b408e9e3c831
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/sound/soc/rockchip/rockchip_i2s_tdm.c b/sound/soc/rockchip/rockchip_i2s_tdm.c
index 42d160766bb6..3b0a957f5cc9 100644
--- a/sound/soc/rockchip/rockchip_i2s_tdm.c
+++ b/sound/soc/rockchip/rockchip_i2s_tdm.c
@@ -216,6 +216,8 @@ static void rockchip_snd_xfer_reset_assert(struct rk_i2s_tdm_dev *i2s_tdm,
 		local_irq_restore(flags);
 		break;
 	}
+	/* delay for reset assert done */
+	udelay(10);
 }
 
 static void rockchip_snd_xfer_reset_deassert(struct rk_i2s_tdm_dev *i2s_tdm,
@@ -260,6 +262,8 @@ static void rockchip_snd_xfer_reset_deassert(struct rk_i2s_tdm_dev *i2s_tdm,
 		local_irq_restore(flags);
 		break;
 	}
+	/* delay for reset deassert done */
+	udelay(10);
 }
 
 /*
@@ -289,9 +293,6 @@ static void rockchip_snd_xfer_sync_reset(struct rk_i2s_tdm_dev *i2s_tdm)
 
 	rockchip_snd_xfer_reset_assert(i2s_tdm, tx_bank, tx_offset,
 				       rx_bank, rx_offset);
-
-	udelay(150);
-
 	rockchip_snd_xfer_reset_deassert(i2s_tdm, tx_bank, tx_offset,
 					 rx_bank, rx_offset);
 }

commit b5fc70f67165fa7be1508aa3665bcda1ccfb935a
Author: Jisheng Zhang <Jisheng.Zhang@synaptics.com>
Date:   Mon May 31 17:06:09 2021 +0800

    UPSTREAM: mmc: sdhci-of-dwcmshc: fix rpmb access
    
    Commit a44f7cb93732 ("mmc: core: use mrq->sbc when sending CMD23 for
    RPMB") began to use ACMD23 for RPMB if the host supports ACMD23. In
    RPMB ACM23 case, we need to set bit 31 to CMD23 argument, otherwise
    RPMB write operation will return general fail.
    
    However, no matter V4 is enabled or not, the dwcmshc's ARGUMENT2
    register is 32-bit block count register which doesn't support stuff
    bits of CMD23 argument. So let's handle this specific ACMD23 case.
    
    From another side, this patch also prepare for future v4 enabling
    for dwcmshc, because from the 4.10 spec, the ARGUMENT2 register is
    redefined as 32bit block count which doesn't support stuff bits of
    CMD23 argument.
    
    Fixes: a44f7cb93732 ("mmc: core: use mrq->sbc when sending CMD23 for RPMB")
    Signed-off-by: Jisheng Zhang <Jisheng.Zhang@synaptics.com>
    Acked-by: Adrian Hunter <adrian.hunter@intel.com>
    Link: https://lore.kernel.org/r/20201229161625.38255233@xhacker.debian
    Cc: stable@vger.kernel.org
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: Ic31c6f626b869620a2656cb84ecb01fe03700a4e
    (cherry picked from commit ca1219c0a7432272324660fc9f61a9940f90c50b)

diff --git a/drivers/mmc/host/sdhci-of-dwcmshc.c b/drivers/mmc/host/sdhci-of-dwcmshc.c
index 434af283a1cd..92df58aee350 100644
--- a/drivers/mmc/host/sdhci-of-dwcmshc.c
+++ b/drivers/mmc/host/sdhci-of-dwcmshc.c
@@ -19,6 +19,8 @@
 
 #include "sdhci-pltfm.h"
 
+#define SDHCI_DWCMSHC_ARG2_STUFF	GENMASK(31, 16)
+
 /* DWCMSHC specific Mode Select value */
 #define DWCMSHC_CTRL_HS400		0x7
 
@@ -88,6 +90,29 @@ static void dwcmshc_adma_write_desc(struct sdhci_host *host, void **desc,
 	sdhci_adma_write_desc(host, desc, addr, len, cmd);
 }
 
+static void dwcmshc_check_auto_cmd23(struct mmc_host *mmc,
+				     struct mmc_request *mrq)
+{
+	struct sdhci_host *host = mmc_priv(mmc);
+
+	/*
+	 * No matter V4 is enabled or not, ARGUMENT2 register is 32-bit
+	 * block count register which doesn't support stuff bits of
+	 * CMD23 argument on dwcmsch host controller.
+	 */
+	if (mrq->sbc && (mrq->sbc->arg & SDHCI_DWCMSHC_ARG2_STUFF))
+		host->flags &= ~SDHCI_AUTO_CMD23;
+	else
+		host->flags |= SDHCI_AUTO_CMD23;
+}
+
+static void dwcmshc_request(struct mmc_host *mmc, struct mmc_request *mrq)
+{
+	dwcmshc_check_auto_cmd23(mmc, mrq);
+
+	sdhci_request(mmc, mrq);
+}
+
 static void dwcmshc_set_uhs_signaling(struct sdhci_host *host,
 				      unsigned int timing)
 {
@@ -347,6 +372,8 @@ static int dwcmshc_probe(struct platform_device *pdev)
 			goto err_clk;
 	}
 
+	host->mmc_host_ops.request = dwcmshc_request;
+
 	err = sdhci_add_host(host);
 	if (err)
 		goto err_clk;

commit 382b763ef5bc023cd3c9acbc4f19924761a30760
Author: Aapo Vienamo <avienamo@nvidia.com>
Date:   Mon Aug 20 12:23:32 2018 +0300

    UPSTREAM: mmc: sdhci: Export sdhci_request()
    
    Allow SDHCI drivers to hook code before and after sdhci_request() by
    making it externally visible.
    
    Signed-off-by: Aapo Vienamo <avienamo@nvidia.com>
    Acked-by: Adrian Hunter <adrian.hunter@intel.com>
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: I3e144e8f597d49479fbed8528519c257f740d3f2
    (cherry picked from commit d462c1b474529f004437e967bffb8e55471ef1fa)

diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index db416e544e0f..b4b61714fff6 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -1650,7 +1650,7 @@ EXPORT_SYMBOL_GPL(sdhci_set_power);
  *                                                                           *
 \*****************************************************************************/
 
-static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
+void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
 {
 	struct sdhci_host *host;
 	int present;
@@ -1689,6 +1689,7 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
 	mmiowb();
 	spin_unlock_irqrestore(&host->lock, flags);
 }
+EXPORT_SYMBOL_GPL(sdhci_request);
 
 void sdhci_set_bus_width(struct sdhci_host *host, int width)
 {
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
index 076f7398f81b..f0c6b76f8abb 100644
--- a/drivers/mmc/host/sdhci.h
+++ b/drivers/mmc/host/sdhci.h
@@ -737,6 +737,7 @@ void sdhci_set_power(struct sdhci_host *host, unsigned char mode,
 		     unsigned short vdd);
 void sdhci_set_power_noreg(struct sdhci_host *host, unsigned char mode,
 			   unsigned short vdd);
+void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq);
 void sdhci_set_bus_width(struct sdhci_host *host, int width);
 void sdhci_reset(struct sdhci_host *host, u8 mask);
 void sdhci_set_uhs_signaling(struct sdhci_host *host, unsigned timing);

commit 0bde59fad73ae7e1eacb34cb24527c6f799ac9ff
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Thu Jun 3 11:37:20 2021 +0800

    ARM: configs: rockchip_defconfig enable ION_CMA_HEAP
    
    Select ION_CMA_HEAP to support cma memory allocated from ion driver.
    
    Change-Id: I9bb44004e8e86e00795f85c31946eb8bb3f12006
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/arch/arm/configs/rockchip_defconfig b/arch/arm/configs/rockchip_defconfig
index dcb984e008a5..a439a52ead46 100644
--- a/arch/arm/configs/rockchip_defconfig
+++ b/arch/arm/configs/rockchip_defconfig
@@ -589,6 +589,7 @@ CONFIG_STAGING=y
 CONFIG_ASHMEM=y
 CONFIG_ION=y
 CONFIG_ION_SYSTEM_HEAP=y
+CONFIG_ION_CMA_HEAP=y
 CONFIG_ION_FORCE_DMA_SYNC=y
 CONFIG_FIQ_DEBUGGER=y
 CONFIG_FIQ_DEBUGGER_NO_SLEEP=y

commit 8af7024239917e2fb7b73d34751d430a5de948f2
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Thu Jun 3 11:36:19 2021 +0800

    ARM: configs: rockchip_defconfig enable ION_FORCE_DMA_SYNC
    
    The ion allocates memory defaultly with memset to zero, userspace should
    do cache sync before read/wirte after map.
    
    But the userspace always not to do that.
    
    This patch supports to do force sync for memory allocated first time
    from page pools with memset zero.
    
    Change-Id: I8a65b1a3259d315459a0489f9c51ab0855957a70
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/arch/arm/configs/rockchip_defconfig b/arch/arm/configs/rockchip_defconfig
index cdbe78b783d9..dcb984e008a5 100644
--- a/arch/arm/configs/rockchip_defconfig
+++ b/arch/arm/configs/rockchip_defconfig
@@ -589,6 +589,7 @@ CONFIG_STAGING=y
 CONFIG_ASHMEM=y
 CONFIG_ION=y
 CONFIG_ION_SYSTEM_HEAP=y
+CONFIG_ION_FORCE_DMA_SYNC=y
 CONFIG_FIQ_DEBUGGER=y
 CONFIG_FIQ_DEBUGGER_NO_SLEEP=y
 CONFIG_FIQ_DEBUGGER_CONSOLE=y

commit 1a469bd2951761c525c7546a003b2034ea437614
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Thu May 27 16:05:45 2021 +0800

    drm/rockchip: vop2: add more debug info
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: I9277ff4a0f363fdb53aed88a33007a31e6f47f4c

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index a40f2c944e36..c394bd69a93e 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -2617,6 +2617,7 @@ static void vop2_crtc_atomic_disable(struct drm_crtc *crtc,
 
 	WARN_ON(vp->event);
 	vop2_lock(vop2);
+	DRM_DEV_INFO(vop2->dev, "Crtc atomic disable vp%d\n", vp->id);
 	drm_crtc_vblank_off(crtc);
 	vop2_disable_all_planes_for_crtc(crtc);
 
@@ -2912,6 +2913,7 @@ static void vop2_plane_atomic_update(struct drm_plane *plane, struct drm_plane_s
 	uint32_t lb_mode;
 	uint32_t stride;
 	uint32_t transform_offset;
+	struct drm_format_name_buf format_name;
 
 #if defined(CONFIG_ROCKCHIP_DRM_DEBUG)
 	bool AFBC_flag = false;
@@ -2967,14 +2969,14 @@ static void vop2_plane_atomic_update(struct drm_plane *plane, struct drm_plane_s
 	actual_h = drm_rect_height(src) >> 16;
 	dsp_w = drm_rect_width(dest);
 	if (dest->x1 + dsp_w > adjusted_mode->hdisplay) {
-		DRM_ERROR("%s dest->x1[%d] + dsp_w[%d] exceed mode hdisplay[%d]\n",
-			  win->name, dest->x1, dsp_w, adjusted_mode->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);
 		dsp_w = adjusted_mode->hdisplay - dest->x1;
 	}
 	dsp_h = drm_rect_height(dest);
 	if (dest->y1 + dsp_h > adjusted_mode->vdisplay) {
-		DRM_ERROR("%s dest->y1[%d] + dsp_h[%d] exceed mode vdisplay[%d]\n",
-			  win->name, dest->y1, dsp_h, adjusted_mode->vdisplay);
+		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);
 		dsp_h = adjusted_mode->vdisplay - dest->y1;
 	}
 
@@ -2984,14 +2986,14 @@ static void vop2_plane_atomic_update(struct drm_plane *plane, struct drm_plane_s
 	 */
 	if (!(win->feature & WIN_FEATURE_AFBDC)) {
 		if (actual_w > dsp_w && (actual_w & 0xf) == 1) {
-			DRM_WARN("%s act_w[%d] MODE 16 == 1\n", win->name, actual_w);
+			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("%s actual_w[%d] should align as 4 pixel when enable afbc\n",
-			  win->name, actual_w);
+		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);
 	}
 
@@ -3007,6 +3009,11 @@ static void vop2_plane_atomic_update(struct drm_plane *plane, struct drm_plane_s
 	vop2_setup_csc_mode(vp, vpstate);
 
 	spin_lock(&vop2->reg_lock);
+	DRM_DEV_DEBUG(vop2->dev, "vp%d update %s[%dx%d->%dx%d@%dx%d] fmt[%.4s_%s] addr[%pad]\n",
+		      vp->id, win->name, actual_w, actual_h, dsp_w, dsp_h,
+		      dsp_stx, dsp_sty,
+		      drm_get_format_name(fb->format->format, &format_name),
+		      vpstate->afbc_en ? "AFBC" : "", &vpstate->yrgb_mst);
 
 	if (vpstate->afbc_en) {
 		/* the afbc superblock is 16 x 16 */
@@ -3021,8 +3028,8 @@ static void vop2_plane_atomic_update(struct drm_plane *plane, struct drm_plane_s
 		stride = (fb->pitches[0] << 3) / bpp;
 		if ((stride & 0x3f) &&
 		    (vpstate->xmirror_en || vpstate->rotate_90_en || vpstate->rotate_270_en))
-			DRM_ERROR("%s stride[%d] must align as 64 pixel when enable xmirror/rotate_90/rotate_270[0x%x]\n",
-				  win->name, stride, pstate->rotation);
+			DRM_ERROR("vp%d %s stride[%d] must align as 64 pixel when enable xmirror/rotate_90/rotate_270[0x%x]\n",
+				  vp->id, win->name, stride, pstate->rotation);
 
 		rb_swap = vop2_afbc_rb_swap(fb->format->format);
 		uv_swap = vop2_afbc_uv_swap(fb->format->format);
@@ -4901,8 +4908,8 @@ static void vop2_crtc_atomic_begin(struct drm_crtc *crtc, struct drm_crtc_state
 		main_win->two_win_mode = true;
 		vop2_setup_cluster_alpha(vop2, &cluster);
 		if (abs(main_win->base.state->zpos - win->base.state->zpos) != 1)
-			DRM_ERROR("Cluster%d win0[zpos:%d] must next to win1[zpos:%d]\n",
-				  cluster.main->phys_id,
+			DRM_ERROR("vp%d Cluster%d win0[zpos:%d] must next to win1[zpos:%d]\n",
+				  vp->id, cluster.main->phys_id,
 				  main_win->base.state->zpos, win->base.state->zpos);
 	}
 
@@ -5097,7 +5104,7 @@ static void vop2_crtc_atomic_flush(struct drm_crtc *crtc, struct drm_crtc_state
 		if (ret) {
 			vop2->is_iommu_enabled = false;
 			vop2_disable_all_planes_for_crtc(crtc);
-			DRM_DEV_ERROR(vop2->dev, "failed to attach dma mapping, %d\n", ret);
+			DRM_DEV_ERROR(vop2->dev, "vp%d failed to attach dma mapping, %d\n", vp->id, ret);
 		} else {
 			vop2->is_iommu_enabled = true;
 			VOP_CTRL_SET(vop2, dma_stop, 0);

commit 6dd0792bf246517f6d02541d4f97f230e4ab15c5
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Thu May 27 15:21:04 2021 +0800

    drm/rockchip: vop2: make sure layer sel is take effect when it's updated
    
    when vp0 and vp1 indenpendent config layer_sel register, this register take effect
    time is prone to error, so we add the following measures to workaround this issue:
    
    1. Add commit_lock to make sure vp0 and vp1 config register is mutually exclusive;
    2. Make sure layer sel register is take effect when it's update.
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: Ief832e2bf7e18567f4ea663843c77f0afbd21cf7

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
index 4a8ba874ab12..2adf1c678125 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
@@ -424,7 +424,9 @@ rockchip_atomic_commit_complete(struct rockchip_atomic_commit *commit)
 		rockchip_dmcfreq_vop_bandwidth_update(prv->devfreq, bandwidth,
 						      plane_num);
 
+	mutex_lock(&prv->commit_lock);
 	drm_atomic_helper_commit_planes(dev, state, true);
+	mutex_unlock(&prv->commit_lock);
 
 	rockchip_drm_psr_inhibit_put_state(state);
 
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 1353e7e3b4a3..a40f2c944e36 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -414,6 +414,7 @@ struct vop2_video_port {
 	struct vop2 *vop2;
 	struct clk *dclk;
 	uint8_t id;
+	bool layer_sel_update;
 	const struct vop2_video_port_regs *regs;
 
 	struct completion dsp_hold_completion;
@@ -1026,6 +1027,9 @@ static inline void vop2_cfg_done(struct drm_crtc *crtc)
 	struct vop2 *vop2 = vp->vop2;
 	uint32_t done_bits;
 	uint32_t val;
+	u32 old_layer_sel_val, cfg_layer_sel_val;
+	struct vop2_layer *layer = &vop2->layers[0];
+	u32 layer_sel_offset = layer->regs->layer_sel.offset;
 
 	/*
 	 * This is a workaround, the config done bits of VP0,
@@ -1045,7 +1049,23 @@ static inline void vop2_cfg_done(struct drm_crtc *crtc)
 	 */
 	done_bits = vop2_pending_done_bits(vp);
 	val = RK3568_VOP2_GLB_CFG_DONE_EN | BIT(vp->id) | done_bits;
+	old_layer_sel_val = vop2_readl(vop2, layer_sel_offset);
+	cfg_layer_sel_val = vop2->regsbak[layer_sel_offset >> 2];
+	/**
+	 * This is rather low probability for miss some done bit.
+	 */
+	val |= vop2_readl(vop2, RK3568_REG_CFG_DONE) & 0x7;
 	vop2_writel(vop2, 0, val);
+
+	/**
+	 * Make sure the layer sel is take effect when it's updated.
+	 */
+	if (old_layer_sel_val != cfg_layer_sel_val) {
+		vp->layer_sel_update = true;
+		vop2_wait_for_fs_by_done_bit_status(vp);
+		DRM_DEV_DEBUG(vop2->dev, "vp%d need to wait fs as old layer_sel val[0x%x] != new val[0x%x]\n",
+			      vp->id, old_layer_sel_val, cfg_layer_sel_val);
+	}
 }
 
 static inline void vop2_wb_cfg_done(struct vop2_video_port *vp)
@@ -5114,6 +5134,12 @@ static void vop2_crtc_atomic_flush(struct drm_crtc *crtc, struct drm_crtc_state
 	 */
 	vop2_wait_for_irq_handler(crtc);
 
+	/**
+	 * move here is to make sure current fs call function is complete,
+	 * so when layer_sel_update is true, we can skip current vblank correctly.
+	 */
+	vp->layer_sel_update = false;
+
 	spin_lock_irq(&crtc->dev->event_lock);
 	if (crtc->state->event) {
 		WARN_ON(drm_crtc_vblank_get(crtc) != 0);
@@ -5514,8 +5540,10 @@ static irqreturn_t vop2_isr(int irq, void *data)
 
 		if (active_irqs & FS_FIELD_INTR) {
 			vop2_wb_handler(vp);
-			drm_crtc_handle_vblank(crtc);
-			vop2_handle_vblank(vop2, crtc);
+			if (vp->layer_sel_update == false) {
+				drm_crtc_handle_vblank(crtc);
+				vop2_handle_vblank(vop2, crtc);
+			}
 			active_irqs &= ~FS_FIELD_INTR;
 			ret = IRQ_HANDLED;
 		}

commit a6d22c4a7eaf1d50e024634f25bc84d8bed83532
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Thu May 27 14:39:06 2021 +0800

    drm/rockchip: vop2: use wait done bit instead of fs raw bit
    
    the fs raw bit will be cleared by vop2_isr() fs irq and lead to
    vop2_wait_for_fs_by_raw_status() time out, so we use
    vop2_wait_for_fs_by_done_bit_status() to wait done bit from 1 to 0 is
    more reliable.
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: Ice35fb9bfe6c2ef7a49496b15b9f58bf93e95d4e

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 1b5e541ec2c2..1353e7e3b4a3 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -881,31 +881,28 @@ static void vop2_wait_for_irq_handler(struct drm_crtc *crtc)
 	synchronize_irq(vop2->irq);
 }
 
-static bool vop2_fs_raw_status_pending(struct vop2_video_port *vp)
+static bool vop2_vp_done_bit_status(struct vop2_video_port *vp)
 {
 	struct vop2 *vop2 = vp->vop2;
-	uint32_t offset = vp->id * 0x10;
-
-	return vop2_readl(vop2, RK3568_VP0_INT_RAW_STATUS + offset) & 0x20;
+	u32 done_bits = vop2_readl(vop2, RK3568_REG_CFG_DONE) & BIT(vp->id);
 
+	/*
+	 * When done bit is 0, indicate current frame is take effect.
+	 */
+	return done_bits == 0 ? true : false;
 }
 
-static void vop2_wait_for_fs_by_raw_status(struct vop2_video_port *vp)
+static void vop2_wait_for_fs_by_done_bit_status(struct vop2_video_port *vp)
 {
 	struct vop2 *vop2 = vp->vop2;
-	bool pending;
+	bool done_bit;
 	int ret;
 
-	/*
-	 * Spin until frame start interrupt raw status bit goes high,
-	 * which means the configuration before the previous config done
-	 * has take effect.
-	 */
-	ret = readx_poll_timeout_atomic(vop2_fs_raw_status_pending, vp, pending,
-					pending, 0, 50 * 1000);
+	ret = readx_poll_timeout_atomic(vop2_vp_done_bit_status, vp, done_bit,
+					done_bit, 0, 50 * 1000);
 	if (ret)
-		DRM_DEV_ERROR(vop2->dev, "wait vp%d raw fs statu timeout\n", vp->id);
-
+		DRM_DEV_ERROR(vop2->dev, "wait vp%d done bit status timeout, vcnt: %d\n",
+			      vp->id, vop2_read_vcnt(vp));
 }
 
 static uint16_t vop2_read_port_mux(struct vop2 *vop2)
@@ -964,7 +961,7 @@ static int32_t vop2_pending_done_bits(struct vop2_video_port *vp)
 			vcnt >>= 1;
 		/* if close to the last 1/8 frame, wait to next frame */
 		if (vcnt > (adjusted_mode->crtc_vtotal * 7 >> 3)) {
-			vop2_wait_for_fs_by_raw_status(done_vp);
+			vop2_wait_for_fs_by_done_bit_status(done_vp);
 			done_bits = 0;
 		}
 	} else { /* exist the other two vp done bit */
@@ -1010,13 +1007,13 @@ static int32_t vop2_pending_done_bits(struct vop2_video_port *vp)
 		else
 			wait_vp = second_done_vp;
 
-		vop2_wait_for_fs_by_raw_status(wait_vp);
+		vop2_wait_for_fs_by_done_bit_status(wait_vp);
 
 		done_bits = vop2_readl(vop2, RK3568_REG_CFG_DONE) & 0x7;
 		if (done_bits) {
 			vp_id = ffs(done_bits) - 1;
 			done_vp = &vop2->vps[vp_id];
-			vop2_wait_for_fs_by_raw_status(done_vp);
+			vop2_wait_for_fs_by_done_bit_status(done_vp);
 		}
 		done_bits = 0;
 	}

commit ea6ea821c5903033d86031f96b2189ef4431c6bb
Merge: 485921204039 1722257b8ece
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Thu Jun 3 09:05:30 2021 +0200

    Merge 4.19.193 into android-4.19-stable
    
    Changes in 4.19.193
            mm, vmstat: drop zone->lock in /proc/pagetypeinfo
            usb: dwc3: gadget: Enable suspend events
            NFC: nci: fix memory leak in nci_allocate_device
            cifs: set server->cipher_type to AES-128-CCM for SMB3.0
            NFSv4: Fix a NULL pointer dereference in pnfs_mark_matching_lsegs_return()
            iommu/vt-d: Fix sysfs leak in alloc_iommu()
            perf intel-pt: Fix sample instruction bytes
            perf intel-pt: Fix transaction abort handling
            proc: Check /proc/$pid/attr/ writes against file opener
            net: hso: fix control-request directions
            mac80211: assure all fragments are encrypted
            mac80211: prevent mixed key and fragment cache attacks
            mac80211: properly handle A-MSDUs that start with an RFC 1042 header
            cfg80211: mitigate A-MSDU aggregation attacks
            mac80211: drop A-MSDUs on old ciphers
            mac80211: add fragment cache to sta_info
            mac80211: check defrag PN against current frame
            mac80211: prevent attacks on TKIP/WEP as well
            mac80211: do not accept/forward invalid EAPOL frames
            mac80211: extend protection against mixed key and fragment cache attacks
            ath10k: Validate first subframe of A-MSDU before processing the list
            dm snapshot: properly fix a crash when an origin has no snapshots
            kgdb: fix gcc-11 warnings harder
            misc/uss720: fix memory leak in uss720_probe
            thunderbolt: dma_port: Fix NVM read buffer bounds and offset issue
            mei: request autosuspend after sending rx flow control
            staging: iio: cdc: ad7746: avoid overwrite of num_channels
            iio: adc: ad7793: Add missing error code in ad7793_setup()
            USB: trancevibrator: fix control-request direction
            USB: usbfs: Don't WARN about excessively large memory allocations
            serial: sh-sci: Fix off-by-one error in FIFO threshold register setting
            serial: rp2: use 'request_firmware' instead of 'request_firmware_nowait'
            USB: serial: ti_usb_3410_5052: add startech.com device id
            USB: serial: option: add Telit LE910-S1 compositions 0x7010, 0x7011
            USB: serial: ftdi_sio: add IDs for IDS GmbH Products
            USB: serial: pl2303: add device id for ADLINK ND-6530 GC
            usb: dwc3: gadget: Properly track pending and queued SG
            usb: gadget: udc: renesas_usb3: Fix a race in usb3_start_pipen()
            net: usb: fix memory leak in smsc75xx_bind
            bpf: fix up selftests after backports were fixed
            bpf, selftests: Fix up some test_verifier cases for unprivileged
            selftests/bpf: Test narrow loads with off > 0 in test_verifier
            selftests/bpf: add selftest part of "bpf: improve verifier branch analysis"
            bpf: extend is_branch_taken to registers
            bpf: Test_verifier, bpf_get_stack return value add <0
            bpf, test_verifier: switch bpf_get_stack's 0 s> r8 test
            bpf: Move off_reg into sanitize_ptr_alu
            bpf: Ensure off_reg has no mixed signed bounds for all types
            bpf: Rework ptr_limit into alu_limit and add common error path
            bpf: Improve verifier error messages for users
            bpf: Refactor and streamline bounds check into helper
            bpf: Move sanitize_val_alu out of op switch
            bpf: Tighten speculative pointer arithmetic mask
            bpf: Update selftests to reflect new error states
            bpf: Fix leakage of uninitialized bpf stack under speculation
            bpf: Wrap aux data inside bpf_sanitize_info container
            bpf: Fix mask direction swap upon off reg sign change
            bpf: No need to simulate speculative domain for immediates
            spi: gpio: Don't leak SPI master in probe error path
            spi: mt7621: Disable clock in probe error path
            spi: mt7621: Don't leak SPI master in probe error path
            Bluetooth: cmtp: fix file refcount when cmtp_attach_device fails
            NFS: fix an incorrect limit in filelayout_decode_layout()
            NFS: Don't corrupt the value of pg_bytes_written in nfs_do_recoalesce()
            NFSv4: Fix v4.0/v4.1 SEEK_DATA return -ENOTSUPP when set NFS_V4_2 config
            drm/meson: fix shutdown crash when component not probed
            net/mlx4: Fix EEPROM dump support
            Revert "net:tipc: Fix a double free in tipc_sk_mcast_rcv"
            tipc: skb_linearize the head skb when reassembling msgs
            net: dsa: mt7530: fix VLAN traffic leaks
            net: dsa: fix a crash if ->get_sset_count() fails
            i2c: s3c2410: fix possible NULL pointer deref on read message after write
            i2c: i801: Don't generate an interrupt on bus reset
            perf jevents: Fix getting maximum number of fds
            platform/x86: hp_accel: Avoid invoking _INI to speed up resume
            serial: max310x: unregister uart driver in case of failure and abort
            net: fujitsu: fix potential null-ptr-deref
            net: caif: remove BUG_ON(dev == NULL) in caif_xmit
            char: hpet: add checks after calling ioremap
            isdn: mISDNinfineon: check/cleanup ioremap failure correctly in setup_io
            dmaengine: qcom_hidma: comment platform_driver_register call
            libertas: register sysfs groups properly
            ASoC: cs43130: handle errors in cs43130_probe() properly
            media: dvb: Add check on sp8870_readreg return
            media: gspca: properly check for errors in po1030_probe()
            scsi: BusLogic: Fix 64-bit system enumeration error for Buslogic
            openrisc: Define memory barrier mb
            btrfs: do not BUG_ON in link_to_fixup_dir
            platform/x86: hp-wireless: add AMD's hardware id to the supported list
            platform/x86: intel_punit_ipc: Append MODULE_DEVICE_TABLE for ACPI
            SMB3: incorrect file id in requests compounded with open
            drm/amd/display: Disconnect non-DP with no EDID
            drm/amd/amdgpu: fix refcount leak
            drm/amdgpu: Fix a use-after-free
            net: netcp: Fix an error message
            net: dsa: fix error code getting shifted with 4 in dsa_slave_get_sset_count
            net: fec: fix the potential memory leak in fec_enet_init()
            net: mdio: thunder: Fix a double free issue in the .remove function
            net: mdio: octeon: Fix some double free issues
            openvswitch: meter: fix race when getting now_ms.
            net: bnx2: Fix error return code in bnx2_init_board()
            mld: fix panic in mld_newpack()
            staging: emxx_udc: fix loop in _nbu2ss_nuke()
            ASoC: cs35l33: fix an error code in probe()
            bpf: Set mac_len in bpf_skb_change_head
            ixgbe: fix large MTU request from VF
            scsi: libsas: Use _safe() loop in sas_resume_port()
            ipv6: record frag_max_size in atomic fragments in input path
            sch_dsmark: fix a NULL deref in qdisc_reset()
            MIPS: alchemy: xxs1500: add gpio-au1000.h header file
            MIPS: ralink: export rt_sysc_membase for rt2880_wdt.c
            hugetlbfs: hugetlb_fault_mutex_hash() cleanup
            drivers/net/ethernet: clean up unused assignments
            net: hns3: check the return of skb_checksum_help()
            usb: core: reduce power-on-good delay time of root hub
            Linux 4.19.193
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I0cac54fabadef0bc664d6958b1c8fcda4078ba4b

commit 1722257b8ececec9b3b83a8b14058f8209d78071
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Thu Jun 3 08:38:13 2021 +0200

    Linux 4.19.193
    
    Link: https://lore.kernel.org/r/20210531130640.131924542@linuxfoundation.org
    Tested-by: Jason Self <jason@bluehome.net>
    Tested-by: Hulk Robot <hulkrobot@huawei.com>
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index 51ee6da4c1ab..e5d41b6792d7 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 192
+SUBLEVEL = 193
 EXTRAVERSION =
 NAME = "People's Front"
 

commit 4e400034553096aaf9efb7cea398cffa9f695a12
Author: Chunfeng Yun <chunfeng.yun@mediatek.com>
Date:   Sat Apr 10 09:20:45 2021 +0800

    usb: core: reduce power-on-good delay time of root hub
    
    commit 90d28fb53d4a51299ff324dede015d5cb11b88a2 upstream.
    
    Return the exactly delay time given by root hub descriptor,
    this helps to reduce resume time etc.
    
    Due to the root hub descriptor is usually provided by the host
    controller driver, if there is compatibility for a root hub,
    we can fix it easily without affect other root hub
    
    Acked-by: Alan Stern <stern@rowland.harvard.edu>
    Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
    Link: https://lore.kernel.org/r/1618017645-12259-1-git-send-email-chunfeng.yun@mediatek.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h
index d0bbbd76ba8e..df3aa0b69188 100644
--- a/drivers/usb/core/hub.h
+++ b/drivers/usb/core/hub.h
@@ -146,8 +146,10 @@ static inline unsigned hub_power_on_good_delay(struct usb_hub *hub)
 {
 	unsigned delay = hub->descriptor->bPwrOn2PwrGood * 2;
 
-	/* Wait at least 100 msec for power to become stable */
-	return max(delay, 100U);
+	if (!hub->hdev->parent)	/* root hub */
+		return delay;
+	else /* Wait at least 100 msec for power to become stable */
+		return max(delay, 100U);
 }
 
 static inline int hub_port_debounce_be_connected(struct usb_hub *hub,

commit 210946e53a372e8fba194d142e8a74c880ceff5b
Author: Yunsheng Lin <linyunsheng@huawei.com>
Date:   Tue May 18 19:36:03 2021 +0800

    net: hns3: check the return of skb_checksum_help()
    
    commit 9bb5a495424fd4bfa672eb1f31481248562fa156 upstream.
    
    Currently skb_checksum_help()'s return is ignored, but it may
    return error when it fails to allocate memory when linearizing.
    
    So adds checking for the return of skb_checksum_help().
    
    Fixes: 76ad4f0ee747("net: hns3: Add support of HNS3 Ethernet Driver for hip08 SoC")
    Fixes: 3db084d28dc0("net: hns3: Fix for vxlan tx checksum bug")
    Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com>
    Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
index 3b89673f09da..19165a3548bf 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
@@ -702,8 +702,6 @@ static bool hns3_tunnel_csum_bug(struct sk_buff *skb)
 	if (!(!skb->encapsulation && l4.udp->dest == htons(IANA_VXLAN_PORT)))
 		return false;
 
-	skb_checksum_help(skb);
-
 	return true;
 }
 
@@ -764,8 +762,7 @@ static int hns3_set_l3l4_type_csum(struct sk_buff *skb, u8 ol4_proto,
 			/* the stack computes the IP header already,
 			 * driver calculate l4 checksum when not TSO.
 			 */
-			skb_checksum_help(skb);
-			return 0;
+			return skb_checksum_help(skb);
 		}
 
 		l3.hdr = skb_inner_network_header(skb);
@@ -796,7 +793,7 @@ static int hns3_set_l3l4_type_csum(struct sk_buff *skb, u8 ol4_proto,
 		break;
 	case IPPROTO_UDP:
 		if (hns3_tunnel_csum_bug(skb))
-			break;
+			return skb_checksum_help(skb);
 
 		hnae3_set_bit(*type_cs_vlan_tso, HNS3_TXD_L4CS_B, 1);
 		hnae3_set_field(*type_cs_vlan_tso,
@@ -821,8 +818,7 @@ static int hns3_set_l3l4_type_csum(struct sk_buff *skb, u8 ol4_proto,
 		/* the stack computes the IP header already,
 		 * driver calculate l4 checksum when not TSO.
 		 */
-		skb_checksum_help(skb);
-		return 0;
+		return skb_checksum_help(skb);
 	}
 
 	return 0;

commit 5c3c0b21b379900c235b08559d801ddcc7026398
Author: Jesse Brandeburg <jesse.brandeburg@intel.com>
Date:   Fri Sep 25 15:24:39 2020 -0700

    drivers/net/ethernet: clean up unused assignments
    
    commit 7c8c0291f84027558bd5fca5729cbcf288c510f4 upstream.
    
    As part of the W=1 compliation series, these lines all created
    warnings about unused variables that were assigned a value. Most
    of them are from register reads, but some are just picking up
    a return value from a function and never doing anything with it.
    
    Fixed warnings:
    .../ethernet/brocade/bna/bnad.c:3280:6: warning: variable ?rx_count??set but not used [-Wunused-but-set-variable]
    .../ethernet/brocade/bna/bnad.c:3280:6: warning: variable ?rx_count??set but not used [-Wunused-but-set-variable]
    .../ethernet/cortina/gemini.c:512:6: warning: variable ?val??set but not used [-Wunused-but-set-variable]
    .../ethernet/cortina/gemini.c:2110:21: warning: variable ?config0??set but not used [-Wunused-but-set-variable]
    .../ethernet/cavium/liquidio/octeon_device.c:1327:6: warning: variable ?val32??set but not used [-Wunused-but-set-variable]
    .../ethernet/cavium/liquidio/octeon_device.c:1358:6: warning: variable ?val32??set but not used [-Wunused-but-set-variable]
    .../ethernet/dec/tulip/media.c:322:8: warning: variable ?setup??set but not used [-Wunused-but-set-variable]
    .../ethernet/dec/tulip/de4x5.c:4928:13: warning: variable ?r3??set but not used [-Wunused-but-set-variable]
    .../ethernet/micrel/ksz884x.c:1652:7: warning: variable ?dummy??set but not used [-Wunused-but-set-variable]
    .../ethernet/micrel/ksz884x.c:1652:7: warning: variable ?dummy??set but not used [-Wunused-but-set-variable]
    .../ethernet/micrel/ksz884x.c:1652:7: warning: variable ?dummy??set but not used [-Wunused-but-set-variable]
    .../ethernet/micrel/ksz884x.c:1652:7: warning: variable ?dummy??set but not used [-Wunused-but-set-variable]
    .../ethernet/micrel/ksz884x.c:4981:6: warning: variable ?rx_status??set but not used [-Wunused-but-set-variable]
    .../ethernet/micrel/ksz884x.c:6510:6: warning: variable ?rc??set but not used [-Wunused-but-set-variable]
    .../ethernet/micrel/ksz884x.c:6087: warning: cannot understand function prototype: 'struct hw_regs '
    .../ethernet/microchip/lan743x_main.c:161:6: warning: variable ?int_en??set but not used [-Wunused-but-set-variable]
    .../ethernet/microchip/lan743x_main.c:1702:6: warning: variable ?int_sts??set but not used [-Wunused-but-set-variable]
    .../ethernet/microchip/lan743x_main.c:3041:6: warning: variable ?ret??set but not used [-Wunused-but-set-variable]
    .../ethernet/natsemi/ns83820.c:603:6: warning: variable ?tbisr??set but not used [-Wunused-but-set-variable]
    .../ethernet/natsemi/ns83820.c:1207:11: warning: variable ?tanar??set but not used [-Wunused-but-set-variable]
    .../ethernet/marvell/mvneta.c:754:6: warning: variable ?dummy??set but not used [-Wunused-but-set-variable]
    .../ethernet/neterion/vxge/vxge-traffic.c:33:6: warning: variable ?val64??set but not used [-Wunused-but-set-variable]
    .../ethernet/neterion/vxge/vxge-traffic.c:160:6: warning: variable ?val64??set but not used [-Wunused-but-set-variable]
    .../ethernet/neterion/vxge/vxge-traffic.c:490:6: warning: variable ?val32??set but not used [-Wunused-but-set-variable]
    .../ethernet/neterion/vxge/vxge-traffic.c:2378:6: warning: variable ?val64??set but not used [-Wunused-but-set-variable]
    .../ethernet/packetengines/yellowfin.c:1063:18: warning: variable ?yf_size??set but not used [-Wunused-but-set-variable]
    .../ethernet/realtek/8139cp.c:1242:6: warning: variable ?rc??set but not used [-Wunused-but-set-variable]
    .../ethernet/mellanox/mlx4/en_tx.c:858:6: warning: variable ?ring_cons??set but not used [-Wunused-but-set-variable]
    .../ethernet/sis/sis900.c:792:6: warning: variable ?status??set but not used [-Wunused-but-set-variable]
    .../ethernet/sfc/falcon/farch.c:878:11: warning: variable ?rx_ev_pkt_type??set but not used [-Wunused-but-set-variable]
    .../ethernet/sfc/falcon/farch.c:877:23: warning: variable ?rx_ev_mcast_pkt??set but not used [-Wunused-but-set-variable]
    .../ethernet/sfc/falcon/farch.c:877:7: warning: variable ?rx_ev_hdr_type??set but not used [-Wunused-but-set-variable]
    .../ethernet/sfc/falcon/farch.c:876:7: warning: variable ?rx_ev_other_err??set but not used [-Wunused-but-set-variable]
    .../ethernet/sfc/falcon/farch.c:1646:21: warning: variable ?buftbl_min??set but not used [-Wunused-but-set-variable]
    .../ethernet/sfc/falcon/farch.c:2535:32: warning: variable ?spec??set but not used [-Wunused-but-set-variable]
    .../ethernet/via/via-velocity.c:880:6: warning: variable ?curr_status??set but not used [-Wunused-but-set-variable]
    .../ethernet/ti/tlan.c:656:6: warning: variable ?rc??set but not used [-Wunused-but-set-variable]
    .../ethernet/ti/davinci_emac.c:1230:6: warning: variable ?num_tx_pkts??set but not used [-Wunused-but-set-variable]
    .../ethernet/synopsys/dwc-xlgmac-common.c:516:8: warning: variable ?str??set but not used [-Wunused-but-set-variable]
    .../ethernet/ti/cpsw_new.c:1662:22: warning: variable ?priv??set but not used [-Wunused-but-set-variable]
    
    The register reads should be OK, because the current
    implementation of readl and friends will always execute even
    without an lvalue.
    
    When it makes sense, just remove the lvalue assignment and the
    local. Other times, just remove the offending code, and
    occasionally, just mark the variable as maybe unused since it
    could be used in an ifdef or debug scenario.
    
    Only compile tested with W=1.
    
    Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
    Acked-by: Edward Cree <ecree@solarflare.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    [fixes gcc-11 build warnings - gregkh]
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c
index ea5f32ea308a..1e25c3b5f563 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.c
+++ b/drivers/net/ethernet/brocade/bna/bnad.c
@@ -3290,7 +3290,7 @@ bnad_change_mtu(struct net_device *netdev, int new_mtu)
 {
 	int err, mtu;
 	struct bnad *bnad = netdev_priv(netdev);
-	u32 rx_count = 0, frame, new_frame;
+	u32 frame, new_frame;
 
 	mutex_lock(&bnad->conf_mutex);
 
@@ -3306,12 +3306,9 @@ bnad_change_mtu(struct net_device *netdev, int new_mtu)
 		/* only when transition is over 4K */
 		if ((frame <= 4096 && new_frame > 4096) ||
 		    (frame > 4096 && new_frame <= 4096))
-			rx_count = bnad_reinit_rx(bnad);
+			bnad_reinit_rx(bnad);
 	}
 
-	/* rx_count > 0 - new rx created
-	 *	- Linux set err = 0 and return
-	 */
 	err = bnad_mtu_set(bnad, new_frame);
 	if (err)
 		err = -EBUSY;
diff --git a/drivers/net/ethernet/dec/tulip/de4x5.c b/drivers/net/ethernet/dec/tulip/de4x5.c
index f16853c3c851..c813e6f2b371 100644
--- a/drivers/net/ethernet/dec/tulip/de4x5.c
+++ b/drivers/net/ethernet/dec/tulip/de4x5.c
@@ -4927,11 +4927,11 @@ mii_get_oui(u_char phyaddr, u_long ioaddr)
 	u_char breg[2];
     } a;
     int i, r2, r3, ret=0;*/
-    int r2, r3;
+    int r2;
 
     /* Read r2 and r3 */
     r2 = mii_rd(MII_ID0, phyaddr, ioaddr);
-    r3 = mii_rd(MII_ID1, phyaddr, ioaddr);
+    mii_rd(MII_ID1, phyaddr, ioaddr);
                                                 /* SEEQ and Cypress way * /
     / * Shuffle r2 and r3 * /
     a.reg=0;
diff --git a/drivers/net/ethernet/dec/tulip/media.c b/drivers/net/ethernet/dec/tulip/media.c
index dcf21a36a9cf..011604787b8e 100644
--- a/drivers/net/ethernet/dec/tulip/media.c
+++ b/drivers/net/ethernet/dec/tulip/media.c
@@ -319,13 +319,8 @@ void tulip_select_media(struct net_device *dev, int startup)
 			break;
 		}
 		case 5: case 6: {
-			u16 setup[5];
-
 			new_csr6 = 0; /* FIXME */
 
-			for (i = 0; i < 5; i++)
-				setup[i] = get_u16(&p[i*2 + 1]);
-
 			if (startup && mtable->has_reset) {
 				struct medialeaf *rleaf = &mtable->mleaf[mtable->has_reset];
 				unsigned char *rst = rleaf->leafdata;
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
index 29041d4a3f28..6517e53da520 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
@@ -862,6 +862,7 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
 	struct mlx4_en_tx_desc *tx_desc;
 	struct mlx4_wqe_data_seg *data;
 	struct mlx4_en_tx_info *tx_info;
+	u32 __maybe_unused ring_cons;
 	int tx_ind;
 	int nr_txbb;
 	int desc_size;
@@ -875,7 +876,6 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
 	bool stop_queue;
 	bool inline_ok;
 	u8 data_offset;
-	u32 ring_cons;
 	bool bf_ok;
 
 	tx_ind = skb_get_queue_mapping(skb);
diff --git a/drivers/net/ethernet/micrel/ksz884x.c b/drivers/net/ethernet/micrel/ksz884x.c
index ebbdfb908745..623a05d78343 100644
--- a/drivers/net/ethernet/micrel/ksz884x.c
+++ b/drivers/net/ethernet/micrel/ksz884x.c
@@ -1657,8 +1657,7 @@ static inline void set_tx_len(struct ksz_desc *desc, u32 len)
 
 #define HW_DELAY(hw, reg)			\
 	do {					\
-		u16 dummy;			\
-		dummy = readw(hw->io + reg);	\
+		readw(hw->io + reg);		\
 	} while (0)
 
 /**
diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c
index df4519c04ba0..0d681714878b 100644
--- a/drivers/net/ethernet/microchip/lan743x_main.c
+++ b/drivers/net/ethernet/microchip/lan743x_main.c
@@ -156,9 +156,8 @@ static void lan743x_tx_isr(void *context, u32 int_sts, u32 flags)
 	struct lan743x_tx *tx = context;
 	struct lan743x_adapter *adapter = tx->adapter;
 	bool enable_flag = true;
-	u32 int_en = 0;
 
-	int_en = lan743x_csr_read(adapter, INT_EN_SET);
+	lan743x_csr_read(adapter, INT_EN_SET);
 	if (flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_CLEAR) {
 		lan743x_csr_write(adapter, INT_EN_CLR,
 				  INT_BIT_DMA_TX_(tx->channel_number));
@@ -1635,10 +1634,9 @@ static int lan743x_tx_napi_poll(struct napi_struct *napi, int weight)
 	bool start_transmitter = false;
 	unsigned long irq_flags = 0;
 	u32 ioc_bit = 0;
-	u32 int_sts = 0;
 
 	ioc_bit = DMAC_INT_BIT_TX_IOC_(tx->channel_number);
-	int_sts = lan743x_csr_read(adapter, DMAC_INT_STS);
+	lan743x_csr_read(adapter, DMAC_INT_STS);
 	if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_W2C)
 		lan743x_csr_write(adapter, DMAC_INT_STS, ioc_bit);
 	spin_lock_irqsave(&tx->ring_lock, irq_flags);
diff --git a/drivers/net/ethernet/neterion/vxge/vxge-traffic.c b/drivers/net/ethernet/neterion/vxge/vxge-traffic.c
index 0c3b5dea2858..ad3702d3d831 100644
--- a/drivers/net/ethernet/neterion/vxge/vxge-traffic.c
+++ b/drivers/net/ethernet/neterion/vxge/vxge-traffic.c
@@ -29,8 +29,6 @@
  */
 enum vxge_hw_status vxge_hw_vpath_intr_enable(struct __vxge_hw_vpath_handle *vp)
 {
-	u64 val64;
-
 	struct __vxge_hw_virtualpath *vpath;
 	struct vxge_hw_vpath_reg __iomem *vp_reg;
 	enum vxge_hw_status status = VXGE_HW_OK;
@@ -83,7 +81,7 @@ enum vxge_hw_status vxge_hw_vpath_intr_enable(struct __vxge_hw_vpath_handle *vp)
 	__vxge_hw_pio_mem_write32_upper((u32)VXGE_HW_INTR_MASK_ALL,
 			&vp_reg->xgmac_vp_int_status);
 
-	val64 = readq(&vp_reg->vpath_general_int_status);
+	readq(&vp_reg->vpath_general_int_status);
 
 	/* Mask unwanted interrupts */
 
@@ -156,8 +154,6 @@ enum vxge_hw_status vxge_hw_vpath_intr_enable(struct __vxge_hw_vpath_handle *vp)
 enum vxge_hw_status vxge_hw_vpath_intr_disable(
 			struct __vxge_hw_vpath_handle *vp)
 {
-	u64 val64;
-
 	struct __vxge_hw_virtualpath *vpath;
 	enum vxge_hw_status status = VXGE_HW_OK;
 	struct vxge_hw_vpath_reg __iomem *vp_reg;
@@ -178,8 +174,6 @@ enum vxge_hw_status vxge_hw_vpath_intr_disable(
 		(u32)VXGE_HW_INTR_MASK_ALL,
 		&vp_reg->vpath_general_int_mask);
 
-	val64 = VXGE_HW_TIM_CLR_INT_EN_VP(1 << (16 - vpath->vp_id));
-
 	writeq(VXGE_HW_INTR_MASK_ALL, &vp_reg->kdfcctl_errors_mask);
 
 	__vxge_hw_pio_mem_write32_upper((u32)VXGE_HW_INTR_MASK_ALL,
@@ -486,9 +480,7 @@ void vxge_hw_device_unmask_all(struct __vxge_hw_device *hldev)
  */
 void vxge_hw_device_flush_io(struct __vxge_hw_device *hldev)
 {
-	u32 val32;
-
-	val32 = readl(&hldev->common_reg->titan_general_int_status);
+	readl(&hldev->common_reg->titan_general_int_status);
 }
 
 /**
@@ -1726,8 +1718,8 @@ void vxge_hw_fifo_txdl_free(struct __vxge_hw_fifo *fifo, void *txdlh)
 enum vxge_hw_status
 vxge_hw_vpath_mac_addr_add(
 	struct __vxge_hw_vpath_handle *vp,
-	u8 (macaddr)[ETH_ALEN],
-	u8 (macaddr_mask)[ETH_ALEN],
+	u8 *macaddr,
+	u8 *macaddr_mask,
 	enum vxge_hw_vpath_mac_addr_add_mode duplicate_mode)
 {
 	u32 i;
@@ -1789,8 +1781,8 @@ vxge_hw_vpath_mac_addr_add(
 enum vxge_hw_status
 vxge_hw_vpath_mac_addr_get(
 	struct __vxge_hw_vpath_handle *vp,
-	u8 (macaddr)[ETH_ALEN],
-	u8 (macaddr_mask)[ETH_ALEN])
+	u8 *macaddr,
+	u8 *macaddr_mask)
 {
 	u32 i;
 	u64 data1 = 0ULL;
@@ -1841,8 +1833,8 @@ vxge_hw_vpath_mac_addr_get(
 enum vxge_hw_status
 vxge_hw_vpath_mac_addr_get_next(
 	struct __vxge_hw_vpath_handle *vp,
-	u8 (macaddr)[ETH_ALEN],
-	u8 (macaddr_mask)[ETH_ALEN])
+	u8 *macaddr,
+	u8 *macaddr_mask)
 {
 	u32 i;
 	u64 data1 = 0ULL;
@@ -1894,8 +1886,8 @@ vxge_hw_vpath_mac_addr_get_next(
 enum vxge_hw_status
 vxge_hw_vpath_mac_addr_delete(
 	struct __vxge_hw_vpath_handle *vp,
-	u8 (macaddr)[ETH_ALEN],
-	u8 (macaddr_mask)[ETH_ALEN])
+	u8 *macaddr,
+	u8 *macaddr_mask)
 {
 	u32 i;
 	u64 data1 = 0ULL;
@@ -2385,7 +2377,6 @@ enum vxge_hw_status vxge_hw_vpath_poll_rx(struct __vxge_hw_ring *ring)
 	u8 t_code;
 	enum vxge_hw_status status = VXGE_HW_OK;
 	void *first_rxdh;
-	u64 val64 = 0;
 	int new_count = 0;
 
 	ring->cmpl_cnt = 0;
@@ -2413,8 +2404,7 @@ enum vxge_hw_status vxge_hw_vpath_poll_rx(struct __vxge_hw_ring *ring)
 			}
 			writeq(VXGE_HW_PRC_RXD_DOORBELL_NEW_QW_CNT(new_count),
 				&ring->vp_reg->prc_rxd_doorbell);
-			val64 =
-			  readl(&ring->common_reg->titan_general_int_status);
+			readl(&ring->common_reg->titan_general_int_status);
 			ring->doorbell_cnt = 0;
 		}
 	}
diff --git a/drivers/net/ethernet/sfc/falcon/farch.c b/drivers/net/ethernet/sfc/falcon/farch.c
index 411a2f419447..8a14f7716302 100644
--- a/drivers/net/ethernet/sfc/falcon/farch.c
+++ b/drivers/net/ethernet/sfc/falcon/farch.c
@@ -873,17 +873,12 @@ static u16 ef4_farch_handle_rx_not_ok(struct ef4_rx_queue *rx_queue,
 {
 	struct ef4_channel *channel = ef4_rx_queue_channel(rx_queue);
 	struct ef4_nic *efx = rx_queue->efx;
-	bool rx_ev_buf_owner_id_err, rx_ev_ip_hdr_chksum_err;
+	bool __maybe_unused rx_ev_buf_owner_id_err, rx_ev_ip_hdr_chksum_err;
 	bool rx_ev_tcp_udp_chksum_err, rx_ev_eth_crc_err;
 	bool rx_ev_frm_trunc, rx_ev_drib_nib, rx_ev_tobe_disc;
-	bool rx_ev_other_err, rx_ev_pause_frm;
-	bool rx_ev_hdr_type, rx_ev_mcast_pkt;
-	unsigned rx_ev_pkt_type;
+	bool rx_ev_pause_frm;
 
-	rx_ev_hdr_type = EF4_QWORD_FIELD(*event, FSF_AZ_RX_EV_HDR_TYPE);
-	rx_ev_mcast_pkt = EF4_QWORD_FIELD(*event, FSF_AZ_RX_EV_MCAST_PKT);
 	rx_ev_tobe_disc = EF4_QWORD_FIELD(*event, FSF_AZ_RX_EV_TOBE_DISC);
-	rx_ev_pkt_type = EF4_QWORD_FIELD(*event, FSF_AZ_RX_EV_PKT_TYPE);
 	rx_ev_buf_owner_id_err = EF4_QWORD_FIELD(*event,
 						 FSF_AZ_RX_EV_BUF_OWNER_ID_ERR);
 	rx_ev_ip_hdr_chksum_err = EF4_QWORD_FIELD(*event,
@@ -896,10 +891,6 @@ static u16 ef4_farch_handle_rx_not_ok(struct ef4_rx_queue *rx_queue,
 			  0 : EF4_QWORD_FIELD(*event, FSF_AA_RX_EV_DRIB_NIB));
 	rx_ev_pause_frm = EF4_QWORD_FIELD(*event, FSF_AZ_RX_EV_PAUSE_FRM_ERR);
 
-	/* Every error apart from tobe_disc and pause_frm */
-	rx_ev_other_err = (rx_ev_drib_nib | rx_ev_tcp_udp_chksum_err |
-			   rx_ev_buf_owner_id_err | rx_ev_eth_crc_err |
-			   rx_ev_frm_trunc | rx_ev_ip_hdr_chksum_err);
 
 	/* Count errors that are not in MAC stats.  Ignore expected
 	 * checksum errors during self-test. */
@@ -919,6 +910,13 @@ static u16 ef4_farch_handle_rx_not_ok(struct ef4_rx_queue *rx_queue,
 	 * to a FIFO overflow.
 	 */
 #ifdef DEBUG
+	{
+	/* Every error apart from tobe_disc and pause_frm */
+
+	bool rx_ev_other_err = (rx_ev_drib_nib | rx_ev_tcp_udp_chksum_err |
+				rx_ev_buf_owner_id_err | rx_ev_eth_crc_err |
+				rx_ev_frm_trunc | rx_ev_ip_hdr_chksum_err);
+
 	if (rx_ev_other_err && net_ratelimit()) {
 		netif_dbg(efx, rx_err, efx->net_dev,
 			  " RX queue %d unexpected RX event "
@@ -935,6 +933,7 @@ static u16 ef4_farch_handle_rx_not_ok(struct ef4_rx_queue *rx_queue,
 			  rx_ev_tobe_disc ? " [TOBE_DISC]" : "",
 			  rx_ev_pause_frm ? " [PAUSE]" : "");
 	}
+	}
 #endif
 
 	/* The frame must be discarded if any of these are true. */
@@ -1646,15 +1645,11 @@ void ef4_farch_rx_push_indir_table(struct ef4_nic *efx)
  */
 void ef4_farch_dimension_resources(struct ef4_nic *efx, unsigned sram_lim_qw)
 {
-	unsigned vi_count, buftbl_min;
+	unsigned vi_count;
 
 	/* Account for the buffer table entries backing the datapath channels
 	 * and the descriptor caches for those channels.
 	 */
-	buftbl_min = ((efx->n_rx_channels * EF4_MAX_DMAQ_SIZE +
-		       efx->n_tx_channels * EF4_TXQ_TYPES * EF4_MAX_DMAQ_SIZE +
-		       efx->n_channels * EF4_MAX_EVQ_SIZE)
-		      * sizeof(ef4_qword_t) / EF4_BUF_SIZE);
 	vi_count = max(efx->n_channels, efx->n_tx_channels * EF4_TXQ_TYPES);
 
 	efx->tx_dc_base = sram_lim_qw - vi_count * TX_DC_ENTRIES;
@@ -2535,7 +2530,6 @@ int ef4_farch_filter_remove_safe(struct ef4_nic *efx,
 	enum ef4_farch_filter_table_id table_id;
 	struct ef4_farch_filter_table *table;
 	unsigned int filter_idx;
-	struct ef4_farch_filter_spec *spec;
 	int rc;
 
 	table_id = ef4_farch_filter_id_table_id(filter_id);
@@ -2546,7 +2540,6 @@ int ef4_farch_filter_remove_safe(struct ef4_nic *efx,
 	filter_idx = ef4_farch_filter_id_index(filter_id);
 	if (filter_idx >= table->size)
 		return -ENOENT;
-	spec = &table->spec[filter_idx];
 
 	spin_lock_bh(&efx->filter_lock);
 	rc = ef4_farch_filter_remove(efx, table, filter_idx, priority);
diff --git a/drivers/net/ethernet/sis/sis900.c b/drivers/net/ethernet/sis/sis900.c
index d5bcbc40a55f..823873030a21 100644
--- a/drivers/net/ethernet/sis/sis900.c
+++ b/drivers/net/ethernet/sis/sis900.c
@@ -783,10 +783,9 @@ static u16 sis900_default_phy(struct net_device * net_dev)
 static void sis900_set_capability(struct net_device *net_dev, struct mii_phy *phy)
 {
 	u16 cap;
-	u16 status;
 
-	status = mdio_read(net_dev, phy->phy_addr, MII_STATUS);
-	status = mdio_read(net_dev, phy->phy_addr, MII_STATUS);
+	mdio_read(net_dev, phy->phy_addr, MII_STATUS);
+	mdio_read(net_dev, phy->phy_addr, MII_STATUS);
 
 	cap = MII_NWAY_CSMA_CD |
 		((phy->status & MII_STAT_CAN_TX_FDX)? MII_NWAY_TX_FDX:0) |
diff --git a/drivers/net/ethernet/synopsys/dwc-xlgmac-common.c b/drivers/net/ethernet/synopsys/dwc-xlgmac-common.c
index eb1c6b03c329..df26cea45904 100644
--- a/drivers/net/ethernet/synopsys/dwc-xlgmac-common.c
+++ b/drivers/net/ethernet/synopsys/dwc-xlgmac-common.c
@@ -513,7 +513,7 @@ void xlgmac_get_all_hw_features(struct xlgmac_pdata *pdata)
 
 void xlgmac_print_all_hw_features(struct xlgmac_pdata *pdata)
 {
-	char *str = NULL;
+	char __maybe_unused *str = NULL;
 
 	XLGMAC_PR("\n");
 	XLGMAC_PR("=====================================================\n");
diff --git a/drivers/net/ethernet/ti/davinci_emac.c b/drivers/net/ethernet/ti/davinci_emac.c
index 9bb84d83afc1..56130cf293f3 100644
--- a/drivers/net/ethernet/ti/davinci_emac.c
+++ b/drivers/net/ethernet/ti/davinci_emac.c
@@ -1240,7 +1240,7 @@ static int emac_poll(struct napi_struct *napi, int budget)
 	struct net_device *ndev = priv->ndev;
 	struct device *emac_dev = &ndev->dev;
 	u32 status = 0;
-	u32 num_tx_pkts = 0, num_rx_pkts = 0;
+	u32 num_rx_pkts = 0;
 
 	/* Check interrupt vectors and call packet processing */
 	status = emac_read(EMAC_MACINVECTOR);
@@ -1251,8 +1251,7 @@ static int emac_poll(struct napi_struct *napi, int budget)
 		mask = EMAC_DM646X_MAC_IN_VECTOR_TX_INT_VEC;
 
 	if (status & mask) {
-		num_tx_pkts = cpdma_chan_process(priv->txchan,
-					      EMAC_DEF_TX_MAX_SERVICE);
+		cpdma_chan_process(priv->txchan, EMAC_DEF_TX_MAX_SERVICE);
 	} /* TX processing */
 
 	mask = EMAC_DM644X_MAC_IN_VECTOR_RX_INT_VEC;
diff --git a/drivers/net/ethernet/ti/tlan.c b/drivers/net/ethernet/ti/tlan.c
index 93d142867c2a..01f99e5df145 100644
--- a/drivers/net/ethernet/ti/tlan.c
+++ b/drivers/net/ethernet/ti/tlan.c
@@ -671,7 +671,6 @@ module_exit(tlan_exit);
 static void  __init tlan_eisa_probe(void)
 {
 	long	ioaddr;
-	int	rc = -ENODEV;
 	int	irq;
 	u16	device_id;
 
@@ -736,8 +735,7 @@ static void  __init tlan_eisa_probe(void)
 
 
 		/* Setup the newly found eisa adapter */
-		rc = tlan_probe1(NULL, ioaddr, irq,
-				 12, NULL);
+		tlan_probe1(NULL, ioaddr, irq, 12, NULL);
 		continue;
 
 out:
diff --git a/drivers/net/ethernet/via/via-velocity.c b/drivers/net/ethernet/via/via-velocity.c
index ef9538ee53d0..f0c33d00dcb4 100644
--- a/drivers/net/ethernet/via/via-velocity.c
+++ b/drivers/net/ethernet/via/via-velocity.c
@@ -875,26 +875,13 @@ static u32 check_connection_type(struct mac_regs __iomem *regs)
  */
 static int velocity_set_media_mode(struct velocity_info *vptr, u32 mii_status)
 {
-	u32 curr_status;
 	struct mac_regs __iomem *regs = vptr->mac_regs;
 
 	vptr->mii_status = mii_check_media_mode(vptr->mac_regs);
-	curr_status = vptr->mii_status & (~VELOCITY_LINK_FAIL);
 
 	/* Set mii link status */
 	set_mii_flow_control(vptr);
 
-	/*
-	   Check if new status is consistent with current status
-	   if (((mii_status & curr_status) & VELOCITY_AUTONEG_ENABLE) ||
-	       (mii_status==curr_status)) {
-	   vptr->mii_status=mii_check_media_mode(vptr->mac_regs);
-	   vptr->mii_status=check_connection_type(vptr->mac_regs);
-	   VELOCITY_PRT(MSG_LEVEL_INFO, "Velocity link no change\n");
-	   return 0;
-	   }
-	 */
-
 	if (PHYID_GET_PHY_ID(vptr->phy_id) == PHYID_CICADA_CS8201)
 		MII_REG_BITS_ON(AUXCR_MDPPS, MII_NCONFIG, vptr->mac_regs);
 

commit a92212ef6326c8dc09003c7af4e1ba7da0b77e44
Author: Mike Kravetz <mike.kravetz@oracle.com>
Date:   Sat Nov 30 17:56:30 2019 -0800

    hugetlbfs: hugetlb_fault_mutex_hash() cleanup
    
    commit 552546366a30d88bd1d6f5efe848b2ab50fd57e5 upstream.
    
    A new clang diagnostic (-Wsizeof-array-div) warns about the calculation
    to determine the number of u32's in an array of unsigned longs.
    Suppress warning by adding parentheses.
    
    While looking at the above issue, noticed that the 'address' parameter
    to hugetlb_fault_mutex_hash is no longer used.  So, remove it from the
    definition and all callers.
    
    No functional change.
    
    Link: http://lkml.kernel.org/r/20190919011847.18400-1-mike.kravetz@oracle.com
    Signed-off-by: Mike Kravetz <mike.kravetz@oracle.com>
    Reported-by: Nathan Chancellor <natechancellor@gmail.com>
    Reviewed-by: Nathan Chancellor <natechancellor@gmail.com>
    Reviewed-by: Davidlohr Bueso <dbueso@suse.de>
    Reviewed-by: Andrew Morton <akpm@linux-foundation.org>
    Cc: Nick Desaulniers <ndesaulniers@google.com>
    Cc: Ilie Halip <ilie.halip@gmail.com>
    Cc: David Bolvansky <david.bolvansky@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index 3a2fea8d211d..b313627b1801 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -426,7 +426,7 @@ static void remove_inode_hugepages(struct inode *inode, loff_t lstart,
 			u32 hash;
 
 			index = page->index;
-			hash = hugetlb_fault_mutex_hash(h, mapping, index, 0);
+			hash = hugetlb_fault_mutex_hash(h, mapping, index);
 			mutex_lock(&hugetlb_fault_mutex_table[hash]);
 
 			/*
@@ -623,7 +623,7 @@ static long hugetlbfs_fallocate(struct file *file, int mode, loff_t offset,
 		addr = index * hpage_size;
 
 		/* mutex taken here, fault path and hole punch */
-		hash = hugetlb_fault_mutex_hash(h, mapping, index, addr);
+		hash = hugetlb_fault_mutex_hash(h, mapping, index);
 		mutex_lock(&hugetlb_fault_mutex_table[hash]);
 
 		/* See if already present in mapping to avoid alloc/free */
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
index cae7fd680448..c129c1c14c5f 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -124,7 +124,7 @@ void free_huge_page(struct page *page);
 void hugetlb_fix_reserve_counts(struct inode *inode);
 extern struct mutex *hugetlb_fault_mutex_table;
 u32 hugetlb_fault_mutex_hash(struct hstate *h, struct address_space *mapping,
-				pgoff_t idx, unsigned long address);
+				pgoff_t idx);
 
 pte_t *huge_pmd_share(struct mm_struct *mm, unsigned long addr, pud_t *pud);
 
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index 1dfaec50ff93..2f769a661568 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -3862,7 +3862,7 @@ static vm_fault_t hugetlb_no_page(struct mm_struct *mm,
 			 * handling userfault.  Reacquire after handling
 			 * fault to make calling code simpler.
 			 */
-			hash = hugetlb_fault_mutex_hash(h, mapping, idx, haddr);
+			hash = hugetlb_fault_mutex_hash(h, mapping, idx);
 			mutex_unlock(&hugetlb_fault_mutex_table[hash]);
 			ret = handle_userfault(&vmf, VM_UFFD_MISSING);
 			mutex_lock(&hugetlb_fault_mutex_table[hash]);
@@ -3971,7 +3971,7 @@ static vm_fault_t hugetlb_no_page(struct mm_struct *mm,
 
 #ifdef CONFIG_SMP
 u32 hugetlb_fault_mutex_hash(struct hstate *h, struct address_space *mapping,
-			    pgoff_t idx, unsigned long address)
+			    pgoff_t idx)
 {
 	unsigned long key[2];
 	u32 hash;
@@ -3979,7 +3979,7 @@ u32 hugetlb_fault_mutex_hash(struct hstate *h, struct address_space *mapping,
 	key[0] = (unsigned long) mapping;
 	key[1] = idx;
 
-	hash = jhash2((u32 *)&key, sizeof(key)/sizeof(u32), 0);
+	hash = jhash2((u32 *)&key, sizeof(key)/(sizeof(u32)), 0);
 
 	return hash & (num_fault_mutexes - 1);
 }
@@ -3989,7 +3989,7 @@ u32 hugetlb_fault_mutex_hash(struct hstate *h, struct address_space *mapping,
  * return 0 and avoid the hashing overhead.
  */
 u32 hugetlb_fault_mutex_hash(struct hstate *h, struct address_space *mapping,
-			    pgoff_t idx, unsigned long address)
+			    pgoff_t idx)
 {
 	return 0;
 }
@@ -4033,7 +4033,7 @@ vm_fault_t hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
 	 * get spurious allocation failures if two CPUs race to instantiate
 	 * the same page in the page cache.
 	 */
-	hash = hugetlb_fault_mutex_hash(h, mapping, idx, haddr);
+	hash = hugetlb_fault_mutex_hash(h, mapping, idx);
 	mutex_lock(&hugetlb_fault_mutex_table[hash]);
 
 	entry = huge_ptep_get(ptep);
diff --git a/mm/userfaultfd.c b/mm/userfaultfd.c
index 7529d3fcc899..93a12cc107c9 100644
--- a/mm/userfaultfd.c
+++ b/mm/userfaultfd.c
@@ -271,7 +271,7 @@ static __always_inline ssize_t __mcopy_atomic_hugetlb(struct mm_struct *dst_mm,
 		 */
 		idx = linear_page_index(dst_vma, dst_addr);
 		mapping = dst_vma->vm_file->f_mapping;
-		hash = hugetlb_fault_mutex_hash(h, mapping, idx, dst_addr);
+		hash = hugetlb_fault_mutex_hash(h, mapping, idx);
 		mutex_lock(&hugetlb_fault_mutex_table[hash]);
 
 		err = -ENOMEM;

commit 84a9886356c9a9f43e2645ed7602ec76c7c70f68
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Sun May 16 17:54:17 2021 -0700

    MIPS: ralink: export rt_sysc_membase for rt2880_wdt.c
    
    [ Upstream commit fef532ea0cd871afab7d9a7b6e9da99ac2c24371 ]
    
    rt2880_wdt.c uses (well, attempts to use) rt_sysc_membase. However,
    when this watchdog driver is built as a loadable module, there is a
    build error since the rt_sysc_membase symbol is not exported.
    Export it to quell the build error.
    
    ERROR: modpost: "rt_sysc_membase" [drivers/watchdog/rt2880_wdt.ko] undefined!
    
    Fixes: 473cf939ff34 ("watchdog: add ralink watchdog driver")
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Cc: Guenter Roeck <linux@roeck-us.net>
    Cc: Wim Van Sebroeck <wim@iguana.be>
    Cc: John Crispin <john@phrozen.org>
    Cc: linux-mips@vger.kernel.org
    Cc: linux-watchdog@vger.kernel.org
    Acked-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/ralink/of.c b/arch/mips/ralink/of.c
index 1ada8492733b..92b3d4849996 100644
--- a/arch/mips/ralink/of.c
+++ b/arch/mips/ralink/of.c
@@ -10,6 +10,7 @@
 
 #include <linux/io.h>
 #include <linux/clk.h>
+#include <linux/export.h>
 #include <linux/init.h>
 #include <linux/sizes.h>
 #include <linux/of_fdt.h>
@@ -27,6 +28,7 @@
 
 __iomem void *rt_sysc_membase;
 __iomem void *rt_memc_membase;
+EXPORT_SYMBOL_GPL(rt_sysc_membase);
 
 __iomem void *plat_of_remap_node(const char *node)
 {

commit 0bcab1a47152dd2754087a96d464334a87ae6773
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Sun May 16 17:01:08 2021 -0700

    MIPS: alchemy: xxs1500: add gpio-au1000.h header file
    
    [ Upstream commit ff4cff962a7eedc73e54b5096693da7f86c61346 ]
    
    board-xxs1500.c references 2 functions without declaring them, so add
    the header file to placate the build.
    
    ../arch/mips/alchemy/board-xxs1500.c: In function 'board_setup':
    ../arch/mips/alchemy/board-xxs1500.c:56:2: error: implicit declaration of function 'alchemy_gpio1_input_enable' [-Werror=implicit-function-declaration]
       56 |  alchemy_gpio1_input_enable();
    ../arch/mips/alchemy/board-xxs1500.c:57:2: error: implicit declaration of function 'alchemy_gpio2_enable'; did you mean 'alchemy_uart_enable'? [-Werror=implicit-function-declaration]
       57 |  alchemy_gpio2_enable();
    
    Fixes: 8e026910fcd4 ("MIPS: Alchemy: merge GPR/MTX-1/XXS1500 board code into single files")
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Cc: linux-mips@vger.kernel.org
    Cc: Manuel Lauss <manuel.lauss@googlemail.com>
    Cc: Ralf Baechle <ralf@linux-mips.org>
    Acked-by: Manuel Lauss <manuel.lauss@gmail.com>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/alchemy/board-xxs1500.c b/arch/mips/alchemy/board-xxs1500.c
index 5f05b8714385..b968cff5baa7 100644
--- a/arch/mips/alchemy/board-xxs1500.c
+++ b/arch/mips/alchemy/board-xxs1500.c
@@ -31,6 +31,7 @@
 #include <asm/reboot.h>
 #include <asm/setup.h>
 #include <asm/mach-au1x00/au1000.h>
+#include <asm/mach-au1x00/gpio-au1000.h>
 #include <prom.h>
 
 const char *get_system_type(void)

commit a98c6f44783b3df3e873418eeb907deb402a362e
Author: Taehee Yoo <ap420073@gmail.com>
Date:   Sun May 23 14:38:53 2021 +0000

    sch_dsmark: fix a NULL deref in qdisc_reset()
    
    [ Upstream commit 9b76eade16423ef06829cccfe3e100cfce31afcd ]
    
    If Qdisc_ops->init() is failed, Qdisc_ops->reset() would be called.
    When dsmark_init(Qdisc_ops->init()) is failed, it possibly doesn't
    initialize dsmark_qdisc_data->q. But dsmark_reset(Qdisc_ops->reset())
    uses dsmark_qdisc_data->q pointer wihtout any null checking.
    So, panic would occur.
    
    Test commands:
        sysctl net.core.default_qdisc=dsmark -w
        ip link add dummy0 type dummy
        ip link add vw0 link dummy0 type virt_wifi
        ip link set vw0 up
    
    Splat looks like:
    KASAN: null-ptr-deref in range [0x0000000000000018-0x000000000000001f]
    CPU: 3 PID: 684 Comm: ip Not tainted 5.12.0+ #910
    RIP: 0010:qdisc_reset+0x2b/0x680
    Code: 1f 44 00 00 48 b8 00 00 00 00 00 fc ff df 41 57 41 56 41 55 41 54
    55 48 89 fd 48 83 c7 18 53 48 89 fa 48 c1 ea 03 48 83 ec 20 <80> 3c 02
    00 0f 85 09 06 00 00 4c 8b 65 18 0f 1f 44 00 00 65 8b 1d
    RSP: 0018:ffff88800fda6bf8 EFLAGS: 00010282
    RAX: dffffc0000000000 RBX: ffff8880050ed800 RCX: 0000000000000000
    RDX: 0000000000000003 RSI: ffffffff99e34100 RDI: 0000000000000018
    RBP: 0000000000000000 R08: fffffbfff346b553 R09: fffffbfff346b553
    R10: 0000000000000001 R11: fffffbfff346b552 R12: ffffffffc0824940
    R13: ffff888109e83800 R14: 00000000ffffffff R15: ffffffffc08249e0
    FS:  00007f5042287680(0000) GS:ffff888119800000(0000)
    knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 000055ae1f4dbd90 CR3: 0000000006760002 CR4: 00000000003706e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
     ? rcu_read_lock_bh_held+0xa0/0xa0
     dsmark_reset+0x3d/0xf0 [sch_dsmark]
     qdisc_reset+0xa9/0x680
     qdisc_destroy+0x84/0x370
     qdisc_create_dflt+0x1fe/0x380
     attach_one_default_qdisc.constprop.41+0xa4/0x180
     dev_activate+0x4d5/0x8c0
     ? __dev_open+0x268/0x390
     __dev_open+0x270/0x390
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Taehee Yoo <ap420073@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c
index 1c2fce8c45b2..fe030af9272c 100644
--- a/net/sched/sch_dsmark.c
+++ b/net/sched/sch_dsmark.c
@@ -402,7 +402,8 @@ static void dsmark_reset(struct Qdisc *sch)
 	struct dsmark_qdisc_data *p = qdisc_priv(sch);
 
 	pr_debug("%s(sch %p,[qdisc %p])\n", __func__, sch, p);
-	qdisc_reset(p->q);
+	if (p->q)
+		qdisc_reset(p->q);
 	sch->qstats.backlog = 0;
 	sch->q.qlen = 0;
 }

commit ea9ef822d541859b65696b62647ccc4ab43c1129
Author: Francesco Ruggeri <fruggeri@arista.com>
Date:   Fri May 21 13:21:14 2021 -0700

    ipv6: record frag_max_size in atomic fragments in input path
    
    [ Upstream commit e29f011e8fc04b2cdc742a2b9bbfa1b62518381a ]
    
    Commit dbd1759e6a9c ("ipv6: on reassembly, record frag_max_size")
    filled the frag_max_size field in IP6CB in the input path.
    The field should also be filled in case of atomic fragments.
    
    Fixes: dbd1759e6a9c ('ipv6: on reassembly, record frag_max_size')
    Signed-off-by: Francesco Ruggeri <fruggeri@arista.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c
index c6132e39ab16..60dfd0d11851 100644
--- a/net/ipv6/reassembly.c
+++ b/net/ipv6/reassembly.c
@@ -347,7 +347,7 @@ static int ipv6_frag_rcv(struct sk_buff *skb)
 	hdr = ipv6_hdr(skb);
 	fhdr = (struct frag_hdr *)skb_transport_header(skb);
 
-	if (!(fhdr->frag_off & htons(0xFFF9))) {
+	if (!(fhdr->frag_off & htons(IP6_OFFSET | IP6_MF))) {
 		/* It is not a fragmented frame */
 		skb->transport_header += sizeof(struct frag_hdr);
 		__IP6_INC_STATS(net,
@@ -355,6 +355,8 @@ static int ipv6_frag_rcv(struct sk_buff *skb)
 
 		IP6CB(skb)->nhoff = (u8 *)fhdr - skb_network_header(skb);
 		IP6CB(skb)->flags |= IP6SKB_FRAGMENTED;
+		IP6CB(skb)->frag_max_size = ntohs(hdr->payload_len) +
+					    sizeof(struct ipv6hdr);
 		return 1;
 	}
 

commit 94e2701600ecc5505d4727d580c83b66ecc80ec7
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Wed May 19 17:20:27 2021 +0300

    scsi: libsas: Use _safe() loop in sas_resume_port()
    
    [ Upstream commit 8c7e7b8486cda21269d393245883c5e4737d5ee7 ]
    
    If sas_notify_lldd_dev_found() fails then this code calls:
    
            sas_unregister_dev(port, dev);
    
    which removes "dev", our list iterator, from the list.  This could lead to
    an endless loop.  We need to use list_for_each_entry_safe().
    
    Link: https://lore.kernel.org/r/YKUeq6gwfGcvvhty@mwanda
    Fixes: 303694eeee5e ("[SCSI] libsas: suspend / resume support")
    Reviewed-by: John Garry <john.garry@huawei.com>
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/libsas/sas_port.c b/drivers/scsi/libsas/sas_port.c
index fad23dd39114..1a0b2ce398f7 100644
--- a/drivers/scsi/libsas/sas_port.c
+++ b/drivers/scsi/libsas/sas_port.c
@@ -41,7 +41,7 @@ static bool phy_is_wideport_member(struct asd_sas_port *port, struct asd_sas_phy
 
 static void sas_resume_port(struct asd_sas_phy *phy)
 {
-	struct domain_device *dev;
+	struct domain_device *dev, *n;
 	struct asd_sas_port *port = phy->port;
 	struct sas_ha_struct *sas_ha = phy->ha;
 	struct sas_internal *si = to_sas_internal(sas_ha->core.shost->transportt);
@@ -60,7 +60,7 @@ static void sas_resume_port(struct asd_sas_phy *phy)
 	 * 1/ presume every device came back
 	 * 2/ force the next revalidation to check all expander phys
 	 */
-	list_for_each_entry(dev, &port->dev_list, dev_list_node) {
+	list_for_each_entry_safe(dev, n, &port->dev_list, dev_list_node) {
 		int i, rc;
 
 		rc = sas_notify_lldd_dev_found(dev);

commit 938ffd6d2dd78fb83b9346c9b689e2a3a6fe7174
Author: Jesse Brandeburg <jesse.brandeburg@intel.com>
Date:   Thu May 20 11:18:35 2021 -0700

    ixgbe: fix large MTU request from VF
    
    [ Upstream commit 63e39d29b3da02e901349f6cd71159818a4737a6 ]
    
    Check that the MTU value requested by the VF is in the supported
    range of MTUs before attempting to set the VF large packet enable,
    otherwise reject the request. This also avoids unnecessary
    register updates in the case of the 82599 controller.
    
    Fixes: 872844ddb9e4 ("ixgbe: Enable jumbo frames support w/ SR-IOV")
    Co-developed-by: Piotr Skajewski <piotrx.skajewski@intel.com>
    Signed-off-by: Piotr Skajewski <piotrx.skajewski@intel.com>
    Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
    Co-developed-by: Mateusz Palczewski <mateusz.palczewski@intel.com>
    Signed-off-by: Mateusz Palczewski <mateusz.palczewski@intel.com>
    Tested-by: Konrad Jankowski <konrad0.jankowski@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
index f6ffd9fb2079..8aaf856771d7 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
@@ -467,12 +467,16 @@ static int ixgbe_set_vf_vlan(struct ixgbe_adapter *adapter, int add, int vid,
 	return err;
 }
 
-static s32 ixgbe_set_vf_lpe(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf)
+static int ixgbe_set_vf_lpe(struct ixgbe_adapter *adapter, u32 max_frame, u32 vf)
 {
 	struct ixgbe_hw *hw = &adapter->hw;
-	int max_frame = msgbuf[1];
 	u32 max_frs;
 
+	if (max_frame < ETH_MIN_MTU || max_frame > IXGBE_MAX_JUMBO_FRAME_SIZE) {
+		e_err(drv, "VF max_frame %d out of range\n", max_frame);
+		return -EINVAL;
+	}
+
 	/*
 	 * For 82599EB we have to keep all PFs and VFs operating with
 	 * the same max_frame value in order to avoid sending an oversize
@@ -532,12 +536,6 @@ static s32 ixgbe_set_vf_lpe(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf)
 		}
 	}
 
-	/* MTU < 68 is an error and causes problems on some kernels */
-	if (max_frame > IXGBE_MAX_JUMBO_FRAME_SIZE) {
-		e_err(drv, "VF max_frame %d out of range\n", max_frame);
-		return -EINVAL;
-	}
-
 	/* pull current max frame size from hardware */
 	max_frs = IXGBE_READ_REG(hw, IXGBE_MAXFRS);
 	max_frs &= IXGBE_MHADD_MFS_MASK;
@@ -1240,7 +1238,7 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
 		retval = ixgbe_set_vf_vlan_msg(adapter, msgbuf, vf);
 		break;
 	case IXGBE_VF_SET_LPE:
-		retval = ixgbe_set_vf_lpe(adapter, msgbuf, vf);
+		retval = ixgbe_set_vf_lpe(adapter, msgbuf[1], vf);
 		break;
 	case IXGBE_VF_SET_MACVLAN:
 		retval = ixgbe_set_vf_macvlan_msg(adapter, msgbuf, vf);

commit 3a0363bf507dfd8a7c3cb8904561f2d20da66d76
Author: Jussi Maki <joamaki@gmail.com>
Date:   Wed May 19 15:47:42 2021 +0000

    bpf: Set mac_len in bpf_skb_change_head
    
    [ Upstream commit 84316ca4e100d8cbfccd9f774e23817cb2059868 ]
    
    The skb_change_head() helper did not set "skb->mac_len", which is
    problematic when it's used in combination with skb_redirect_peer().
    Without it, redirecting a packet from a L3 device such as wireguard to
    the veth peer device will cause skb->data to point to the middle of the
    IP header on entry to tcp_v4_rcv() since the L2 header is not pulled
    correctly due to mac_len=0.
    
    Fixes: 3a0af8fd61f9 ("bpf: BPF for lightweight tunnel infrastructure")
    Signed-off-by: Jussi Maki <joamaki@gmail.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Link: https://lore.kernel.org/bpf/20210519154743.2554771-2-joamaki@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/core/filter.c b/net/core/filter.c
index 6272570fe139..01561268d216 100644
--- a/net/core/filter.c
+++ b/net/core/filter.c
@@ -3020,6 +3020,7 @@ static inline int __bpf_skb_change_head(struct sk_buff *skb, u32 head_room,
 		__skb_push(skb, head_room);
 		memset(skb->data, 0, head_room);
 		skb_reset_mac_header(skb);
+		skb_reset_mac_len(skb);
 	}
 
 	return ret;

commit 0f6e6872a7d819da81d2f92dd513ca7eae55369e
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Thu May 20 08:08:24 2021 +0300

    ASoC: cs35l33: fix an error code in probe()
    
    [ Upstream commit 833bc4cf9754643acc69b3c6b65988ca78df4460 ]
    
    This error path returns zero (success) but it should return -EINVAL.
    
    Fixes: 3333cb7187b9 ("ASoC: cs35l33: Initial commit of the cs35l33 CODEC driver.")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com>
    Link: https://lore.kernel.org/r/YKXuyGEzhPT35R3G@mwanda
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/codecs/cs35l33.c b/sound/soc/codecs/cs35l33.c
index 668cd3754209..73fa784646e5 100644
--- a/sound/soc/codecs/cs35l33.c
+++ b/sound/soc/codecs/cs35l33.c
@@ -1204,6 +1204,7 @@ static int cs35l33_i2c_probe(struct i2c_client *i2c_client,
 		dev_err(&i2c_client->dev,
 			"CS35L33 Device ID (%X). Expected ID %X\n",
 			devid, CS35L33_CHIP_ID);
+		ret = -EINVAL;
 		goto err_enable;
 	}
 

commit 1d0fb540a3fd683d9fd12731267d953b0caa9d56
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Wed May 19 17:16:50 2021 +0300

    staging: emxx_udc: fix loop in _nbu2ss_nuke()
    
    [ Upstream commit e0112a7c9e847ada15a631b88e279d547e8f26a7 ]
    
    The _nbu2ss_ep_done() function calls:
    
            list_del_init(&req->queue);
    
    which means that the loop will never exit.
    
    Fixes: ca3d253eb967 ("Staging: emxx_udc: Iterate list using list_for_each_entry")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Link: https://lore.kernel.org/r/YKUd0sDyjm/lkJfJ@mwanda
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/staging/emxx_udc/emxx_udc.c b/drivers/staging/emxx_udc/emxx_udc.c
index 3e51476a7045..d2cb2bd6d913 100644
--- a/drivers/staging/emxx_udc/emxx_udc.c
+++ b/drivers/staging/emxx_udc/emxx_udc.c
@@ -2148,7 +2148,7 @@ static int _nbu2ss_nuke(struct nbu2ss_udc *udc,
 			struct nbu2ss_ep *ep,
 			int status)
 {
-	struct nbu2ss_req *req;
+	struct nbu2ss_req *req, *n;
 
 	/* Endpoint Disable */
 	_nbu2ss_epn_exit(udc, ep);
@@ -2160,7 +2160,7 @@ static int _nbu2ss_nuke(struct nbu2ss_udc *udc,
 		return 0;
 
 	/* called with irqs blocked */
-	list_for_each_entry(req, &ep->queue, queue) {
+	list_for_each_entry_safe(req, n, &ep->queue, queue) {
 		_nbu2ss_ep_done(ep, req, status);
 	}
 

commit 4b77ad9097067b31237eeeee0bf70f80849680a0
Author: Taehee Yoo <ap420073@gmail.com>
Date:   Sun May 16 14:44:42 2021 +0000

    mld: fix panic in mld_newpack()
    
    [ Upstream commit 020ef930b826d21c5446fdc9db80fd72a791bc21 ]
    
    mld_newpack() doesn't allow to allocate high order page,
    only order-0 allocation is allowed.
    If headroom size is too large, a kernel panic could occur in skb_put().
    
    Test commands:
        ip netns del A
        ip netns del B
        ip netns add A
        ip netns add B
        ip link add veth0 type veth peer name veth1
        ip link set veth0 netns A
        ip link set veth1 netns B
    
        ip netns exec A ip link set lo up
        ip netns exec A ip link set veth0 up
        ip netns exec A ip -6 a a 2001:db8:0::1/64 dev veth0
        ip netns exec B ip link set lo up
        ip netns exec B ip link set veth1 up
        ip netns exec B ip -6 a a 2001:db8:0::2/64 dev veth1
        for i in {1..99}
        do
            let A=$i-1
            ip netns exec A ip link add ip6gre$i type ip6gre \
            local 2001:db8:$A::1 remote 2001:db8:$A::2 encaplimit 100
            ip netns exec A ip -6 a a 2001:db8:$i::1/64 dev ip6gre$i
            ip netns exec A ip link set ip6gre$i up
    
            ip netns exec B ip link add ip6gre$i type ip6gre \
            local 2001:db8:$A::2 remote 2001:db8:$A::1 encaplimit 100
            ip netns exec B ip -6 a a 2001:db8:$i::2/64 dev ip6gre$i
            ip netns exec B ip link set ip6gre$i up
        done
    
    Splat looks like:
    kernel BUG at net/core/skbuff.c:110!
    invalid opcode: 0000 [#1] SMP DEBUG_PAGEALLOC KASAN PTI
    CPU: 0 PID: 7 Comm: kworker/0:1 Not tainted 5.12.0+ #891
    Workqueue: ipv6_addrconf addrconf_dad_work
    RIP: 0010:skb_panic+0x15d/0x15f
    Code: 92 fe 4c 8b 4c 24 10 53 8b 4d 70 45 89 e0 48 c7 c7 00 ae 79 83
    41 57 41 56 41 55 48 8b 54 24 a6 26 f9 ff <0f> 0b 48 8b 6c 24 20 89
    34 24 e8 4a 4e 92 fe 8b 34 24 48 c7 c1 20
    RSP: 0018:ffff88810091f820 EFLAGS: 00010282
    RAX: 0000000000000089 RBX: ffff8881086e9000 RCX: 0000000000000000
    RDX: 0000000000000089 RSI: 0000000000000008 RDI: ffffed1020123efb
    RBP: ffff888005f6eac0 R08: ffffed1022fc0031 R09: ffffed1022fc0031
    R10: ffff888117e00187 R11: ffffed1022fc0030 R12: 0000000000000028
    R13: ffff888008284eb0 R14: 0000000000000ed8 R15: 0000000000000ec0
    FS:  0000000000000000(0000) GS:ffff888117c00000(0000)
    knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007f8b801c5640 CR3: 0000000033c2c006 CR4: 00000000003706f0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
     ? ip6_mc_hdr.isra.26.constprop.46+0x12a/0x600
     ? ip6_mc_hdr.isra.26.constprop.46+0x12a/0x600
     skb_put.cold.104+0x22/0x22
     ip6_mc_hdr.isra.26.constprop.46+0x12a/0x600
     ? rcu_read_lock_sched_held+0x91/0xc0
     mld_newpack+0x398/0x8f0
     ? ip6_mc_hdr.isra.26.constprop.46+0x600/0x600
     ? lock_contended+0xc40/0xc40
     add_grhead.isra.33+0x280/0x380
     add_grec+0x5ca/0xff0
     ? mld_sendpack+0xf40/0xf40
     ? lock_downgrade+0x690/0x690
     mld_send_initial_cr.part.34+0xb9/0x180
     ipv6_mc_dad_complete+0x15d/0x1b0
     addrconf_dad_completed+0x8d2/0xbb0
     ? lock_downgrade+0x690/0x690
     ? addrconf_rs_timer+0x660/0x660
     ? addrconf_dad_work+0x73c/0x10e0
     addrconf_dad_work+0x73c/0x10e0
    
    Allowing high order page allocation could fix this problem.
    
    Fixes: 72e09ad107e7 ("ipv6: avoid high order allocations")
    Signed-off-by: Taehee Yoo <ap420073@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c
index f2f8551416c3..3d048401141f 100644
--- a/net/ipv6/mcast.c
+++ b/net/ipv6/mcast.c
@@ -1606,10 +1606,7 @@ static struct sk_buff *mld_newpack(struct inet6_dev *idev, unsigned int mtu)
 		     IPV6_TLV_PADN, 0 };
 
 	/* we assume size > sizeof(ra) here */
-	/* limit our allocations to order-0 page */
-	size = min_t(int, size, SKB_MAX_ORDER(0, 0));
 	skb = sock_alloc_send_skb(sk, size, 1, &err);
-
 	if (!skb)
 		return NULL;
 

commit e8b56dfb32da16daa67ed012fc9a7e67dcea7de4
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Sat May 15 15:16:05 2021 +0800

    net: bnx2: Fix error return code in bnx2_init_board()
    
    [ Upstream commit 28c66b6da4087b8cfe81c2ec0a46eb6116dafda9 ]
    
    Fix to return -EPERM from the error handling case instead of 0, as done
    elsewhere in this function.
    
    Fixes: b6016b767397 ("[BNX2]: New Broadcom gigabit network driver.")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Reviewed-by: Michael Chan <michael.chan@broadcom.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/broadcom/bnx2.c b/drivers/net/ethernet/broadcom/bnx2.c
index 122fdb80a789..9993f1162ac6 100644
--- a/drivers/net/ethernet/broadcom/bnx2.c
+++ b/drivers/net/ethernet/broadcom/bnx2.c
@@ -8253,9 +8253,9 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)
 		BNX2_WR(bp, PCI_COMMAND, reg);
 	} else if ((BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A1) &&
 		!(bp->flags & BNX2_FLAG_PCIX)) {
-
 		dev_err(&pdev->dev,
 			"5706 A1 can only be used in a PCIX bus, aborting\n");
+		rc = -EPERM;
 		goto err_out_unmap;
 	}
 

commit 8d23e166d690faf873c6f72e436c05c556e5a397
Author: Tao Liu <thomas.liu@ucloud.cn>
Date:   Thu May 13 21:08:00 2021 +0800

    openvswitch: meter: fix race when getting now_ms.
    
    [ Upstream commit e4df1b0c24350a0f00229ff895a91f1072bd850d ]
    
    We have observed meters working unexpected if traffic is 3+Gbit/s
    with multiple connections.
    
    now_ms is not pretected by meter->lock, we may get a negative
    long_delta_ms when another cpu updated meter->used, then:
        delta_ms = (u32)long_delta_ms;
    which will be a large value.
    
        band->bucket += delta_ms * band->rate;
    then we get a wrong band->bucket.
    
    OpenVswitch userspace datapath has fixed the same issue[1] some
    time ago, and we port the implementation to kernel datapath.
    
    [1] https://patchwork.ozlabs.org/project/openvswitch/patch/20191025114436.9746-1-i.maximets@ovn.org/
    
    Fixes: 96fbc13d7e77 ("openvswitch: Add meter infrastructure")
    Signed-off-by: Tao Liu <thomas.liu@ucloud.cn>
    Suggested-by: Ilya Maximets <i.maximets@ovn.org>
    Reviewed-by: Ilya Maximets <i.maximets@ovn.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/openvswitch/meter.c b/net/openvswitch/meter.c
index 5ea2471ffc03..9b0c54f0702c 100644
--- a/net/openvswitch/meter.c
+++ b/net/openvswitch/meter.c
@@ -464,6 +464,14 @@ bool ovs_meter_execute(struct datapath *dp, struct sk_buff *skb,
 	spin_lock(&meter->lock);
 
 	long_delta_ms = (now_ms - meter->used); /* ms */
+	if (long_delta_ms < 0) {
+		/* This condition means that we have several threads fighting
+		 * for a meter lock, and the one who received the packets a
+		 * bit later wins. Assuming that all racing threads received
+		 * packets at the same time to avoid overflow.
+		 */
+		long_delta_ms = 0;
+	}
 
 	/* Make sure delta_ms will not be too large, so that bucket will not
 	 * wrap around below.

commit e1c38c2f03f17eb657acec71ec867acdc0265165
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Thu May 13 09:24:55 2021 +0200

    net: mdio: octeon: Fix some double free issues
    
    [ Upstream commit e1d027dd97e1e750669cdc0d3b016a4f54e473eb ]
    
    'bus->mii_bus' has been allocated with 'devm_mdiobus_alloc_size()' in the
    probe function. So it must not be freed explicitly or there will be a
    double free.
    
    Remove the incorrect 'mdiobus_free' in the error handling path of the
    probe function and in remove function.
    
    Suggested-By: Andrew Lunn <andrew@lunn.ch>
    Fixes: 35d2aeac9810 ("phy: mdio-octeon: Use devm_mdiobus_alloc_size()")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Reviewed-by: Russell King <rmk+kernel@armlinux.org.uk>
    Reviewed-by: Andrew Lunn <andrew@lunn.ch>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/phy/mdio-octeon.c b/drivers/net/phy/mdio-octeon.c
index ab6914f8bd50..1da104150f44 100644
--- a/drivers/net/phy/mdio-octeon.c
+++ b/drivers/net/phy/mdio-octeon.c
@@ -75,7 +75,6 @@ static int octeon_mdiobus_probe(struct platform_device *pdev)
 
 	return 0;
 fail_register:
-	mdiobus_free(bus->mii_bus);
 	smi_en.u64 = 0;
 	oct_mdio_writeq(smi_en.u64, bus->register_base + SMI_EN);
 	return err;
@@ -89,7 +88,6 @@ static int octeon_mdiobus_remove(struct platform_device *pdev)
 	bus = platform_get_drvdata(pdev);
 
 	mdiobus_unregister(bus->mii_bus);
-	mdiobus_free(bus->mii_bus);
 	smi_en.u64 = 0;
 	oct_mdio_writeq(smi_en.u64, bus->register_base + SMI_EN);
 	return 0;

commit f97bec565fda2954bbb31f2053b0dc96c23d157a
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Thu May 13 09:44:49 2021 +0200

    net: mdio: thunder: Fix a double free issue in the .remove function
    
    [ Upstream commit a93a0a15876d2a077a3bc260b387d2457a051f24 ]
    
    'bus->mii_bus' have been allocated with 'devm_mdiobus_alloc_size()' in the
    probe function. So it must not be freed explicitly or there will be a
    double free.
    
    Remove the incorrect 'mdiobus_free' in the remove function.
    
    Fixes: 379d7ac7ca31 ("phy: mdio-thunder: Add driver for Cavium Thunder SoC MDIO buses.")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Reviewed-by: Russell King <rmk+kernel@armlinux.org.uk>
    Reviewed-by: Andrew Lunn <andrew@lunn.ch>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/phy/mdio-thunder.c b/drivers/net/phy/mdio-thunder.c
index 564616968cad..c0c922eff760 100644
--- a/drivers/net/phy/mdio-thunder.c
+++ b/drivers/net/phy/mdio-thunder.c
@@ -129,7 +129,6 @@ static void thunder_mdiobus_pci_remove(struct pci_dev *pdev)
 			continue;
 
 		mdiobus_unregister(bus->mii_bus);
-		mdiobus_free(bus->mii_bus);
 		oct_mdio_writeq(0, bus->register_base + SMI_EN);
 	}
 	pci_set_drvdata(pdev, NULL);

commit 15102886bc8f5f29daaadf2d925591d564c17e9f
Author: Fugang Duan <fugang.duan@nxp.com>
Date:   Wed May 12 10:43:59 2021 +0800

    net: fec: fix the potential memory leak in fec_enet_init()
    
    [ Upstream commit 619fee9eb13b5d29e4267cb394645608088c28a8 ]
    
    If the memory allocated for cbd_base is failed, it should
    free the memory allocated for the queues, otherwise it causes
    memory leak.
    
    And if the memory allocated for the queues is failed, it can
    return error directly.
    
    Fixes: 59d0f7465644 ("net: fec: init multi queue date structure")
    Signed-off-by: Fugang Duan <fugang.duan@nxp.com>
    Signed-off-by: Joakim Zhang <qiangqing.zhang@nxp.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 7d1a669416f2..6b9eada1feb2 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -3221,7 +3221,9 @@ static int fec_enet_init(struct net_device *ndev)
 		return ret;
 	}
 
-	fec_enet_alloc_queue(ndev);
+	ret = fec_enet_alloc_queue(ndev);
+	if (ret)
+		return ret;
 
 	bd_size = (fep->total_tx_ring_size + fep->total_rx_ring_size) * dsize;
 
@@ -3229,7 +3231,8 @@ static int fec_enet_init(struct net_device *ndev)
 	cbd_base = dmam_alloc_coherent(&fep->pdev->dev, bd_size, &bd_dma,
 				       GFP_KERNEL);
 	if (!cbd_base) {
-		return -ENOMEM;
+		ret = -ENOMEM;
+		goto free_queue_mem;
 	}
 
 	memset(cbd_base, 0, bd_size);
@@ -3309,6 +3312,10 @@ static int fec_enet_init(struct net_device *ndev)
 		fec_enet_update_ethtool_stats(ndev);
 
 	return 0;
+
+free_queue_mem:
+	fec_enet_free_queue(ndev);
+	return ret;
 }
 
 #ifdef CONFIG_OF

commit 3b985e4dce4d83f03f3d025ca15d36e432e88f2b
Author: Vladimir Oltean <vladimir.oltean@nxp.com>
Date:   Sun May 9 22:33:38 2021 +0300

    net: dsa: fix error code getting shifted with 4 in dsa_slave_get_sset_count
    
    [ Upstream commit b94cbc909f1d80378a1f541968309e5c1178c98b ]
    
    DSA implements a bunch of 'standardized' ethtool statistics counters,
    namely tx_packets, tx_bytes, rx_packets, rx_bytes. So whatever the
    hardware driver returns in .get_sset_count(), we need to add 4 to that.
    
    That is ok, except that .get_sset_count() can return a negative error
    code, for example:
    
    b53_get_sset_count
    -> phy_ethtool_get_sset_count
       -> return -EIO
    
    -EIO is -5, and with 4 added to it, it becomes -1, aka -EPERM. One can
    imagine that certain error codes may even become positive, although
    based on code inspection I did not see instances of that.
    
    Check the error code first, if it is negative return it as-is.
    
    Based on a similar patch for dsa_master_get_strings from Dan Carpenter:
    https://patchwork.kernel.org/project/netdevbpf/patch/YJaSe3RPgn7gKxZv@mwanda/
    
    Fixes: 91da11f870f0 ("net: Distributed Switch Architecture protocol support")
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
    Reviewed-by: Andrew Lunn <andrew@lunn.ch>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index 11f1560de639..b887d9edb9c3 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -598,13 +598,15 @@ static int dsa_slave_get_sset_count(struct net_device *dev, int sset)
 	struct dsa_switch *ds = dp->ds;
 
 	if (sset == ETH_SS_STATS) {
-		int count;
+		int count = 0;
 
-		count = 4;
-		if (ds->ops->get_sset_count)
-			count += ds->ops->get_sset_count(ds, dp->index, sset);
+		if (ds->ops->get_sset_count) {
+			count = ds->ops->get_sset_count(ds, dp->index, sset);
+			if (count < 0)
+				return count;
+		}
 
-		return count;
+		return count + 4;
 	}
 
 	return -EOPNOTSUPP;

commit 44dc04eff0306ca7bcc7c73fb8f4dea92e2e97c5
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Sat May 8 07:38:22 2021 +0200

    net: netcp: Fix an error message
    
    [ Upstream commit ddb6e00f8413e885ff826e32521cff7924661de0 ]
    
    'ret' is known to be 0 here.
    The expected error code is stored in 'tx_pipe->dma_queue', so use it
    instead.
    
    While at it, switch from %d to %pe which is more user friendly.
    
    Fixes: 84640e27f230 ("net: netcp: Add Keystone NetCP core ethernet driver")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/ti/netcp_core.c b/drivers/net/ethernet/ti/netcp_core.c
index a1d335a3c5e4..6099865217f2 100644
--- a/drivers/net/ethernet/ti/netcp_core.c
+++ b/drivers/net/ethernet/ti/netcp_core.c
@@ -1364,9 +1364,9 @@ int netcp_txpipe_open(struct netcp_tx_pipe *tx_pipe)
 	tx_pipe->dma_queue = knav_queue_open(name, tx_pipe->dma_queue_id,
 					     KNAV_QUEUE_SHARED);
 	if (IS_ERR(tx_pipe->dma_queue)) {
+		ret = PTR_ERR(tx_pipe->dma_queue);
 		dev_err(dev, "Could not open DMA queue for channel \"%s\": %d\n",
 			name, ret);
-		ret = PTR_ERR(tx_pipe->dma_queue);
 		goto err;
 	}
 

commit a849e218556f932576c0fb1c5a88714b61709a17
Author: xinhui pan <xinhui.pan@amd.com>
Date:   Tue May 18 10:56:07 2021 +0800

    drm/amdgpu: Fix a use-after-free
    
    [ Upstream commit 1e5c37385097c35911b0f8a0c67ffd10ee1af9a2 ]
    
    looks like we forget to set ttm->sg to NULL.
    Hit panic below
    
    [ 1235.844104] general protection fault, probably for non-canonical address 0x6b6b6b6b6b6b7b4b: 0000 [#1] SMP DEBUG_PAGEALLOC NOPTI
    [ 1235.989074] Call Trace:
    [ 1235.991751]  sg_free_table+0x17/0x20
    [ 1235.995667]  amdgpu_ttm_backend_unbind.cold+0x4d/0xf7 [amdgpu]
    [ 1236.002288]  amdgpu_ttm_backend_destroy+0x29/0x130 [amdgpu]
    [ 1236.008464]  ttm_tt_destroy+0x1e/0x30 [ttm]
    [ 1236.013066]  ttm_bo_cleanup_memtype_use+0x51/0xa0 [ttm]
    [ 1236.018783]  ttm_bo_release+0x262/0xa50 [ttm]
    [ 1236.023547]  ttm_bo_put+0x82/0xd0 [ttm]
    [ 1236.027766]  amdgpu_bo_unref+0x26/0x50 [amdgpu]
    [ 1236.032809]  amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu+0x7aa/0xd90 [amdgpu]
    [ 1236.040400]  kfd_ioctl_alloc_memory_of_gpu+0xe2/0x330 [amdgpu]
    [ 1236.046912]  kfd_ioctl+0x463/0x690 [amdgpu]
    
    Signed-off-by: xinhui pan <xinhui.pan@amd.com>
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 757fa486aac4..50807d621eca 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -1277,6 +1277,7 @@ static void amdgpu_ttm_tt_unpopulate(struct ttm_tt *ttm)
 	if (gtt && gtt->userptr) {
 		amdgpu_ttm_tt_set_user_pages(ttm, NULL);
 		kfree(ttm->sg);
+		ttm->sg = NULL;
 		ttm->page_flags &= ~TTM_PAGE_FLAG_SG;
 		return;
 	}

commit 599e5d61ace952b0bb9bd942b198bbd0cfded1d7
Author: Jingwen Chen <Jingwen.Chen2@amd.com>
Date:   Mon May 17 16:16:10 2021 +0800

    drm/amd/amdgpu: fix refcount leak
    
    [ Upstream commit fa7e6abc75f3d491bc561734312d065dc9dc2a77 ]
    
    [Why]
    the gem object rfb->base.obj[0] is get according to num_planes
    in amdgpufb_create, but is not put according to num_planes
    
    [How]
    put rfb->base.obj[0] in amdgpu_fbdev_destroy according to num_planes
    
    Signed-off-by: Jingwen Chen <Jingwen.Chen2@amd.com>
    Acked-by: Christian König <christian.koenig@amd.com>
    Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
index 69c5d22f29bd..d55ff59584c8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
@@ -297,10 +297,13 @@ static int amdgpufb_create(struct drm_fb_helper *helper,
 static int amdgpu_fbdev_destroy(struct drm_device *dev, struct amdgpu_fbdev *rfbdev)
 {
 	struct amdgpu_framebuffer *rfb = &rfbdev->rfb;
+	int i;
 
 	drm_fb_helper_unregister_fbi(&rfbdev->helper);
 
 	if (rfb->base.obj[0]) {
+		for (i = 0; i < rfb->base.format->num_planes; i++)
+			drm_gem_object_put(rfb->base.obj[0]);
 		amdgpufb_destroy_pinned_object(rfb->base.obj[0]);
 		rfb->base.obj[0] = NULL;
 		drm_framebuffer_unregister_private(&rfb->base);

commit 155495176b1cd5536073da66130a960b4cf0f80d
Author: Chris Park <Chris.Park@amd.com>
Date:   Tue May 4 16:20:55 2021 -0400

    drm/amd/display: Disconnect non-DP with no EDID
    
    [ Upstream commit 080039273b126eeb0185a61c045893a25dbc046e ]
    
    [Why]
    Active DP dongles return no EDID when dongle
    is connected, but VGA display is taken out.
    Current driver behavior does not remove the
    active display when this happens, and this is
    a gap between dongle DTP and dongle behavior.
    
    [How]
    For active DP dongles and non-DP scenario,
    disconnect sink on detection when no EDID
    is read due to timeout.
    
    Signed-off-by: Chris Park <Chris.Park@amd.com>
    Reviewed-by: Nicholas Kazlauskas <Nicholas.Kazlauskas@amd.com>
    Acked-by: Stylon Wang <stylon.wang@amd.com>
    Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
index e3bedf4cc9c0..c9c81090d580 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
@@ -768,6 +768,24 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
 			    dc_is_dvi_signal(link->connector_signal)) {
 				if (prev_sink != NULL)
 					dc_sink_release(prev_sink);
+				link_disconnect_sink(link);
+
+				return false;
+			}
+			/*
+			 * Abort detection for DP connectors if we have
+			 * no EDID and connector is active converter
+			 * as there are no display downstream
+			 *
+			 */
+			if (dc_is_dp_sst_signal(link->connector_signal) &&
+				(link->dpcd_caps.dongle_type ==
+						DISPLAY_DONGLE_DP_VGA_CONVERTER ||
+				link->dpcd_caps.dongle_type ==
+						DISPLAY_DONGLE_DP_DVI_CONVERTER)) {
+				if (prev_sink)
+					dc_sink_release(prev_sink);
+				link_disconnect_sink(link);
 
 				return false;
 			}

commit 66988dc4dc62adf9d86e8f1e844fc747bbee28b7
Author: Steve French <stfrench@microsoft.com>
Date:   Sat May 15 09:52:22 2021 -0500

    SMB3: incorrect file id in requests compounded with open
    
    [ Upstream commit c0d46717b95735b0eacfddbcca9df37a49de9c7a ]
    
    See MS-SMB2 3.2.4.1.4, file ids in compounded requests should be set to
    0xFFFFFFFFFFFFFFFF (we were treating it as u32 not u64 and setting
    it incorrectly).
    
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Reported-by: Stefan Metzmacher <metze@samba.org>
    Reviewed-by: Shyam Prasad N <sprasad@microsoft.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
index 07d1c79a79ea..43478ec6fd67 100644
--- a/fs/cifs/smb2pdu.c
+++ b/fs/cifs/smb2pdu.c
@@ -3124,10 +3124,10 @@ smb2_new_read_req(void **buf, unsigned int *total_len,
 			 * Related requests use info from previous read request
 			 * in chain.
 			 */
-			shdr->SessionId = 0xFFFFFFFF;
+			shdr->SessionId = 0xFFFFFFFFFFFFFFFF;
 			shdr->TreeId = 0xFFFFFFFF;
-			req->PersistentFileId = 0xFFFFFFFF;
-			req->VolatileFileId = 0xFFFFFFFF;
+			req->PersistentFileId = 0xFFFFFFFFFFFFFFFF;
+			req->VolatileFileId = 0xFFFFFFFFFFFFFFFF;
 		}
 	}
 	if (remaining_bytes > io_parms->length)

commit 210768d095a70b204ad43847be155e3884703638
Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date:   Wed May 19 13:15:21 2021 +0300

    platform/x86: intel_punit_ipc: Append MODULE_DEVICE_TABLE for ACPI
    
    [ Upstream commit bc1eca606d8084465e6f89fd646cc71defbad490 ]
    
    The intel_punit_ipc driver might be compiled as a module.
    When udev handles the event of the devices appearing
    the intel_punit_ipc module is missing.
    
    Append MODULE_DEVICE_TABLE for ACPI case to fix the loading issue.
    
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Link: https://lore.kernel.org/r/20210519101521.79338-1-andriy.shevchenko@linux.intel.com
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/platform/x86/intel_punit_ipc.c b/drivers/platform/x86/intel_punit_ipc.c
index 2efeab650345..d6a7039a0591 100644
--- a/drivers/platform/x86/intel_punit_ipc.c
+++ b/drivers/platform/x86/intel_punit_ipc.c
@@ -331,6 +331,7 @@ static const struct acpi_device_id punit_ipc_acpi_ids[] = {
 	{ "INT34D4", 0 },
 	{ }
 };
+MODULE_DEVICE_TABLE(acpi, punit_ipc_acpi_ids);
 
 static struct platform_driver intel_punit_ipc_driver = {
 	.probe = intel_punit_ipc_probe,

commit b328686f11a4958227582299b370ebd6c5a21956
Author: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
Date:   Fri May 14 23:30:47 2021 +0530

    platform/x86: hp-wireless: add AMD's hardware id to the supported list
    
    [ Upstream commit f048630bdd55eb5379ef35f971639fe52fabe499 ]
    
    Newer AMD based laptops uses AMDI0051 as the hardware id to support the
    airplane mode button. Adding this to the supported list.
    
    Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
    Link: https://lore.kernel.org/r/20210514180047.1697543-1-Shyam-sundar.S-k@amd.com
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/platform/x86/hp-wireless.c b/drivers/platform/x86/hp-wireless.c
index d6ea5e998fb8..bb95bec0b110 100644
--- a/drivers/platform/x86/hp-wireless.c
+++ b/drivers/platform/x86/hp-wireless.c
@@ -30,12 +30,14 @@ MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Alex Hung");
 MODULE_ALIAS("acpi*:HPQ6001:*");
 MODULE_ALIAS("acpi*:WSTADEF:*");
+MODULE_ALIAS("acpi*:AMDI0051:*");
 
 static struct input_dev *hpwl_input_dev;
 
 static const struct acpi_device_id hpwl_ids[] = {
 	{"HPQ6001", 0},
 	{"WSTADEF", 0},
+	{"AMDI0051", 0},
 	{"", 0},
 };
 

commit 6eccfb28f8dca70c9b1b3bb3194ca54cbe73a9fa
Author: Josef Bacik <josef@toxicpanda.com>
Date:   Fri May 14 10:56:16 2021 -0400

    btrfs: do not BUG_ON in link_to_fixup_dir
    
    [ Upstream commit 91df99a6eb50d5a1bc70fff4a09a0b7ae6aab96d ]
    
    While doing error injection testing I got the following panic
    
      kernel BUG at fs/btrfs/tree-log.c:1862!
      invalid opcode: 0000 [#1] SMP NOPTI
      CPU: 1 PID: 7836 Comm: mount Not tainted 5.13.0-rc1+ #305
      Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.13.0-2.fc32 04/01/2014
      RIP: 0010:link_to_fixup_dir+0xd5/0xe0
      RSP: 0018:ffffb5800180fa30 EFLAGS: 00010216
      RAX: fffffffffffffffb RBX: 00000000fffffffb RCX: ffff8f595287faf0
      RDX: ffffb5800180fa37 RSI: ffff8f5954978800 RDI: 0000000000000000
      RBP: ffff8f5953af9450 R08: 0000000000000019 R09: 0000000000000001
      R10: 000151f408682970 R11: 0000000120021001 R12: ffff8f5954978800
      R13: ffff8f595287faf0 R14: ffff8f5953c77dd0 R15: 0000000000000065
      FS:  00007fc5284c8c40(0000) GS:ffff8f59bbd00000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 00007fc5287f47c0 CR3: 000000011275e002 CR4: 0000000000370ee0
      Call Trace:
       replay_one_buffer+0x409/0x470
       ? btree_read_extent_buffer_pages+0xd0/0x110
       walk_up_log_tree+0x157/0x1e0
       walk_log_tree+0xa6/0x1d0
       btrfs_recover_log_trees+0x1da/0x360
       ? replay_one_extent+0x7b0/0x7b0
       open_ctree+0x1486/0x1720
       btrfs_mount_root.cold+0x12/0xea
       ? __kmalloc_track_caller+0x12f/0x240
       legacy_get_tree+0x24/0x40
       vfs_get_tree+0x22/0xb0
       vfs_kern_mount.part.0+0x71/0xb0
       btrfs_mount+0x10d/0x380
       ? vfs_parse_fs_string+0x4d/0x90
       legacy_get_tree+0x24/0x40
       vfs_get_tree+0x22/0xb0
       path_mount+0x433/0xa10
       __x64_sys_mount+0xe3/0x120
       do_syscall_64+0x3d/0x80
       entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    We can get -EIO or any number of legitimate errors from
    btrfs_search_slot(), panicing here is not the appropriate response.  The
    error path for this code handles errors properly, simply return the
    error.
    
    Signed-off-by: Josef Bacik <josef@toxicpanda.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index 7b940264c7b9..1cd610ddbb24 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -1770,8 +1770,6 @@ static noinline int link_to_fixup_dir(struct btrfs_trans_handle *trans,
 		ret = btrfs_update_inode(trans, root, inode);
 	} else if (ret == -EEXIST) {
 		ret = 0;
-	} else {
-		BUG(); /* Logic Error */
 	}
 	iput(inode);
 

commit 2191a85943ca848ec756ad79623774d2116a3be4
Author: Peter Zijlstra <peterz@infradead.org>
Date:   Wed Apr 14 14:45:43 2021 +0200

    openrisc: Define memory barrier mb
    
    [ Upstream commit 8b549c18ae81dbc36fb11e4aa08b8378c599ca95 ]
    
    This came up in the discussion of the requirements of qspinlock on an
    architecture.  OpenRISC uses qspinlock, but it was noticed that the
    memmory barrier was not defined.
    
    Peter defined it in the mail thread writing:
    
        As near as I can tell this should do. The arch spec only lists
        this one instruction and the text makes it sound like a completion
        barrier.
    
    This is correct so applying this patch.
    
    Signed-off-by: Peter Zijlstra <peterz@infradead.org>
    [shorne@gmail.com:Turned the mail into a patch]
    Signed-off-by: Stafford Horne <shorne@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/openrisc/include/asm/barrier.h b/arch/openrisc/include/asm/barrier.h
new file mode 100644
index 000000000000..7538294721be
--- /dev/null
+++ b/arch/openrisc/include/asm/barrier.h
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __ASM_BARRIER_H
+#define __ASM_BARRIER_H
+
+#define mb() asm volatile ("l.msync" ::: "memory")
+
+#include <asm-generic/barrier.h>
+
+#endif /* __ASM_BARRIER_H */

commit 8f9221c442a38d2efc08d6c15d1287dbc95e6c87
Author: Matt Wang <wwentao@vmware.com>
Date:   Tue May 11 03:04:37 2021 +0000

    scsi: BusLogic: Fix 64-bit system enumeration error for Buslogic
    
    [ Upstream commit 56f396146af278135c0ff958c79b5ee1bd22453d ]
    
    Commit 391e2f25601e ("[SCSI] BusLogic: Port driver to 64-bit")
    introduced a serious issue for 64-bit systems.  With this commit,
    64-bit kernel will enumerate 8*15 non-existing disks.  This is caused
    by the broken CCB structure.  The change from u32 data to void *data
    increased CCB length on 64-bit system, which introduced an extra 4
    byte offset of the CDB.  This leads to incorrect response to INQUIRY
    commands during enumeration.
    
    Fix disk enumeration failure by reverting the portion of the commit
    above which switched the data pointer from u32 to void.
    
    Link: https://lore.kernel.org/r/C325637F-1166-4340-8F0F-3BCCD59D4D54@vmware.com
    Acked-by: Khalid Aziz <khalid@gonehiking.org>
    Signed-off-by: Matt Wang <wwentao@vmware.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c
index 0d4ffe0ae306..79b5c5457cc2 100644
--- a/drivers/scsi/BusLogic.c
+++ b/drivers/scsi/BusLogic.c
@@ -3081,11 +3081,11 @@ static int blogic_qcmd_lck(struct scsi_cmnd *command,
 		ccb->opcode = BLOGIC_INITIATOR_CCB_SG;
 		ccb->datalen = count * sizeof(struct blogic_sg_seg);
 		if (blogic_multimaster_type(adapter))
-			ccb->data = (void *)((unsigned int) ccb->dma_handle +
+			ccb->data = (unsigned int) ccb->dma_handle +
 					((unsigned long) &ccb->sglist -
-					(unsigned long) ccb));
+					(unsigned long) ccb);
 		else
-			ccb->data = ccb->sglist;
+			ccb->data = virt_to_32bit_virt(ccb->sglist);
 
 		scsi_for_each_sg(command, sg, count, i) {
 			ccb->sglist[i].segbytes = sg_dma_len(sg);
diff --git a/drivers/scsi/BusLogic.h b/drivers/scsi/BusLogic.h
index 8d47e2c88d24..1a33a4b28d45 100644
--- a/drivers/scsi/BusLogic.h
+++ b/drivers/scsi/BusLogic.h
@@ -821,7 +821,7 @@ struct blogic_ccb {
 	unsigned char cdblen;				/* Byte 2 */
 	unsigned char sense_datalen;			/* Byte 3 */
 	u32 datalen;					/* Bytes 4-7 */
-	void *data;					/* Bytes 8-11 */
+	u32 data;					/* Bytes 8-11 */
 	unsigned char:8;				/* Byte 12 */
 	unsigned char:8;				/* Byte 13 */
 	enum blogic_adapter_status adapter_status;	/* Byte 14 */

commit 4109e657479ad17939d9a7d566310bf9c3e89242
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon May 3 13:57:30 2021 +0200

    media: gspca: properly check for errors in po1030_probe()
    
    [ Upstream commit dacb408ca6f0e34df22b40d8dd5fae7f8e777d84 ]
    
    If m5602_write_sensor() or m5602_write_bridge() fail, do not continue to
    initialize the device but return the error to the calling funtion.
    
    Cc: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
    Link: https://lore.kernel.org/r/20210503115736.2104747-64-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/usb/gspca/m5602/m5602_po1030.c b/drivers/media/usb/gspca/m5602/m5602_po1030.c
index 37d2891e5f5b..81d8eb72ac41 100644
--- a/drivers/media/usb/gspca/m5602/m5602_po1030.c
+++ b/drivers/media/usb/gspca/m5602/m5602_po1030.c
@@ -159,6 +159,7 @@ static const struct v4l2_ctrl_config po1030_greenbal_cfg = {
 int po1030_probe(struct sd *sd)
 {
 	u8 dev_id_h = 0, i;
+	int err;
 	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
 
 	if (force_sensor) {
@@ -177,10 +178,13 @@ int po1030_probe(struct sd *sd)
 	for (i = 0; i < ARRAY_SIZE(preinit_po1030); i++) {
 		u8 data = preinit_po1030[i][2];
 		if (preinit_po1030[i][0] == SENSOR)
-			m5602_write_sensor(sd,
-				preinit_po1030[i][1], &data, 1);
+			err = m5602_write_sensor(sd, preinit_po1030[i][1],
+						 &data, 1);
 		else
-			m5602_write_bridge(sd, preinit_po1030[i][1], data);
+			err = m5602_write_bridge(sd, preinit_po1030[i][1],
+						 data);
+		if (err < 0)
+			return err;
 	}
 
 	if (m5602_read_sensor(sd, PO1030_DEVID_H, &dev_id_h, 1))

commit ad6a0f237fbbc32e8d512b3dcb0866c9e139c513
Author: Alaa Emad <alaaemadhossney.ae@gmail.com>
Date:   Mon May 3 13:57:26 2021 +0200

    media: dvb: Add check on sp8870_readreg return
    
    [ Upstream commit c6d822c56e7fd29e6fa1b1bb91b98f6a1e942b3c ]
    
    The function sp8870_readreg returns a negative value when i2c_transfer
    fails so properly check for this and return the error if it happens.
    
    Cc: Sean Young <sean@mess.org>
    Cc: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
    Signed-off-by: Alaa Emad <alaaemadhossney.ae@gmail.com>
    Link: https://lore.kernel.org/r/20210503115736.2104747-60-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/dvb-frontends/sp8870.c b/drivers/media/dvb-frontends/sp8870.c
index 8d31cf3f4f07..3a577788041d 100644
--- a/drivers/media/dvb-frontends/sp8870.c
+++ b/drivers/media/dvb-frontends/sp8870.c
@@ -293,7 +293,9 @@ static int sp8870_set_frontend_parameters(struct dvb_frontend *fe)
 	sp8870_writereg(state, 0xc05, reg0xc05);
 
 	// read status reg in order to clear pending irqs
-	sp8870_readreg(state, 0x200);
+	err = sp8870_readreg(state, 0x200);
+	if (err < 0)
+		return err;
 
 	// system controller start
 	sp8870_microcontroller_start(state);

commit 9f1b3a5eaf4483cda3ac95df8e038a548787869b
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon May 3 13:57:24 2021 +0200

    ASoC: cs43130: handle errors in cs43130_probe() properly
    
    [ Upstream commit 2da441a6491d93eff8ffff523837fd621dc80389 ]
    
    cs43130_probe() does not do any valid error checking of things it
    initializes, OR what it does, it does not unwind properly if there are
    errors.
    
    Fix this up by moving the sysfs files to an attribute group so the
    driver core will correctly add/remove them all at once and handle errors
    with them, and correctly check for creating a new workqueue and
    unwinding if that fails.
    
    Cc: Mark Brown <broonie@kernel.org>
    Link: https://lore.kernel.org/r/20210503115736.2104747-58-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/codecs/cs43130.c b/sound/soc/codecs/cs43130.c
index 80dc42197154..cf29dec28b5e 100644
--- a/sound/soc/codecs/cs43130.c
+++ b/sound/soc/codecs/cs43130.c
@@ -1738,6 +1738,14 @@ static DEVICE_ATTR(hpload_dc_r, 0444, cs43130_show_dc_r, NULL);
 static DEVICE_ATTR(hpload_ac_l, 0444, cs43130_show_ac_l, NULL);
 static DEVICE_ATTR(hpload_ac_r, 0444, cs43130_show_ac_r, NULL);
 
+static struct attribute *hpload_attrs[] = {
+	&dev_attr_hpload_dc_l.attr,
+	&dev_attr_hpload_dc_r.attr,
+	&dev_attr_hpload_ac_l.attr,
+	&dev_attr_hpload_ac_r.attr,
+};
+ATTRIBUTE_GROUPS(hpload);
+
 static struct reg_sequence hp_en_cal_seq[] = {
 	{CS43130_INT_MASK_4, CS43130_INT_MASK_ALL},
 	{CS43130_HP_MEAS_LOAD_1, 0},
@@ -2305,23 +2313,15 @@ static int cs43130_probe(struct snd_soc_component *component)
 
 	cs43130->hpload_done = false;
 	if (cs43130->dc_meas) {
-		ret = device_create_file(component->dev, &dev_attr_hpload_dc_l);
-		if (ret < 0)
-			return ret;
-
-		ret = device_create_file(component->dev, &dev_attr_hpload_dc_r);
-		if (ret < 0)
-			return ret;
-
-		ret = device_create_file(component->dev, &dev_attr_hpload_ac_l);
-		if (ret < 0)
-			return ret;
-
-		ret = device_create_file(component->dev, &dev_attr_hpload_ac_r);
-		if (ret < 0)
+		ret = sysfs_create_groups(&component->dev->kobj, hpload_groups);
+		if (ret)
 			return ret;
 
 		cs43130->wq = create_singlethread_workqueue("cs43130_hp");
+		if (!cs43130->wq) {
+			sysfs_remove_groups(&component->dev->kobj, hpload_groups);
+			return -ENOMEM;
+		}
 		INIT_WORK(&cs43130->work, cs43130_imp_meas);
 	}
 

commit fdcf6f9f16ab738e6c76fafc5feeea27e1fe2c83
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon May 3 13:57:20 2021 +0200

    libertas: register sysfs groups properly
    
    [ Upstream commit 7e79b38fe9a403b065ac5915465f620a8fb3de84 ]
    
    The libertas driver was trying to register sysfs groups "by hand" which
    causes them to be created _after_ the device is initialized and
    announced to userspace, which causes races and can prevent userspace
    tools from seeing the sysfs files correctly.
    
    Fix this up by using the built-in sysfs_groups pointers in struct
    net_device which were created for this very reason, fixing the race
    condition, and properly allowing for any error that might have occured
    to be handled properly.
    
    Cc: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210503115736.2104747-54-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/marvell/libertas/mesh.c b/drivers/net/wireless/marvell/libertas/mesh.c
index b0cb16ef8d1d..b313c78e2154 100644
--- a/drivers/net/wireless/marvell/libertas/mesh.c
+++ b/drivers/net/wireless/marvell/libertas/mesh.c
@@ -793,19 +793,6 @@ static const struct attribute_group mesh_ie_group = {
 	.attrs = mesh_ie_attrs,
 };
 
-static void lbs_persist_config_init(struct net_device *dev)
-{
-	int ret;
-	ret = sysfs_create_group(&(dev->dev.kobj), &boot_opts_group);
-	ret = sysfs_create_group(&(dev->dev.kobj), &mesh_ie_group);
-}
-
-static void lbs_persist_config_remove(struct net_device *dev)
-{
-	sysfs_remove_group(&(dev->dev.kobj), &boot_opts_group);
-	sysfs_remove_group(&(dev->dev.kobj), &mesh_ie_group);
-}
-
 
 /***************************************************************************
  * Initializing and starting, stopping mesh
@@ -1005,6 +992,10 @@ static int lbs_add_mesh(struct lbs_private *priv)
 	SET_NETDEV_DEV(priv->mesh_dev, priv->dev->dev.parent);
 
 	mesh_dev->flags |= IFF_BROADCAST | IFF_MULTICAST;
+	mesh_dev->sysfs_groups[0] = &lbs_mesh_attr_group;
+	mesh_dev->sysfs_groups[1] = &boot_opts_group;
+	mesh_dev->sysfs_groups[2] = &mesh_ie_group;
+
 	/* Register virtual mesh interface */
 	ret = register_netdev(mesh_dev);
 	if (ret) {
@@ -1012,19 +1003,10 @@ static int lbs_add_mesh(struct lbs_private *priv)
 		goto err_free_netdev;
 	}
 
-	ret = sysfs_create_group(&(mesh_dev->dev.kobj), &lbs_mesh_attr_group);
-	if (ret)
-		goto err_unregister;
-
-	lbs_persist_config_init(mesh_dev);
-
 	/* Everything successful */
 	ret = 0;
 	goto done;
 
-err_unregister:
-	unregister_netdev(mesh_dev);
-
 err_free_netdev:
 	free_netdev(mesh_dev);
 
@@ -1045,8 +1027,6 @@ void lbs_remove_mesh(struct lbs_private *priv)
 
 	netif_stop_queue(mesh_dev);
 	netif_carrier_off(mesh_dev);
-	sysfs_remove_group(&(mesh_dev->dev.kobj), &lbs_mesh_attr_group);
-	lbs_persist_config_remove(mesh_dev);
 	unregister_netdev(mesh_dev);
 	priv->mesh_dev = NULL;
 	kfree(mesh_dev->ieee80211_ptr);

commit 5bbe8ae1cb97682dc17beeaef637fed6cbc90237
Author: Phillip Potter <phil@philpotter.co.uk>
Date:   Mon May 3 13:57:18 2021 +0200

    dmaengine: qcom_hidma: comment platform_driver_register call
    
    [ Upstream commit 4df2a8b0ad634d98a67e540a4e18a60f943e7d9f ]
    
    Place a comment in hidma_mgmt_init explaining why success must
    currently be assumed, due to the cleanup issue that would need to
    be considered were this module ever to be unloadable or were this
    platform_driver_register call ever to fail.
    
    Acked-By: Vinod Koul <vkoul@kernel.org>
    Acked-By: Sinan Kaya <okaya@kernel.org>
    Signed-off-by: Phillip Potter <phil@philpotter.co.uk>
    Link: https://lore.kernel.org/r/20210503115736.2104747-52-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/dma/qcom/hidma_mgmt.c b/drivers/dma/qcom/hidma_mgmt.c
index d64edeb6771a..f9640e37b139 100644
--- a/drivers/dma/qcom/hidma_mgmt.c
+++ b/drivers/dma/qcom/hidma_mgmt.c
@@ -423,6 +423,20 @@ static int __init hidma_mgmt_init(void)
 		hidma_mgmt_of_populate_channels(child);
 	}
 #endif
+	/*
+	 * We do not check for return value here, as it is assumed that
+	 * platform_driver_register must not fail. The reason for this is that
+	 * the (potential) hidma_mgmt_of_populate_channels calls above are not
+	 * cleaned up if it does fail, and to do this work is quite
+	 * complicated. In particular, various calls of of_address_to_resource,
+	 * of_irq_to_resource, platform_device_register_full, of_dma_configure,
+	 * and of_msi_configure which then call other functions and so on, must
+	 * be cleaned up - this is not a trivial exercise.
+	 *
+	 * Currently, this module is not intended to be unloaded, and there is
+	 * no module_exit function defined which does the needed cleanup. For
+	 * this reason, we have to assume success here.
+	 */
 	platform_driver_register(&hidma_mgmt_driver);
 
 	return 0;

commit 5761baafe988d4d0eaac0e5b0e64949074d9b15d
Author: Phillip Potter <phil@philpotter.co.uk>
Date:   Mon May 3 13:57:08 2021 +0200

    isdn: mISDNinfineon: check/cleanup ioremap failure correctly in setup_io
    
    [ Upstream commit c446f0d4702d316e1c6bf621f70e79678d28830a ]
    
    Move hw->cfg.mode and hw->addr.mode assignments from hw->ci->cfg_mode
    and hw->ci->addr_mode respectively, to be before the subsequent checks
    for memory IO mode (and possible ioremap calls in this case).
    
    Also introduce ioremap error checks at both locations. This allows
    resources to be properly freed on ioremap failure, as when the caller
    of setup_io then subsequently calls release_io via its error path,
    release_io can now correctly determine the mode as it has been set
    before the ioremap call.
    
    Finally, refactor release_io function so that it will call
    release_mem_region in the memory IO case, regardless of whether or not
    hw->cfg.p/hw->addr.p are NULL. This means resources are then properly
    released on failure.
    
    This properly implements the original reverted commit (d721fe99f6ad)
    from the University of Minnesota, whilst also implementing the ioremap
    check for the hw->ci->cfg_mode if block as well.
    
    Cc: David S. Miller <davem@davemloft.net>
    Signed-off-by: Phillip Potter <phil@philpotter.co.uk>
    Link: https://lore.kernel.org/r/20210503115736.2104747-42-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/isdn/hardware/mISDN/mISDNinfineon.c b/drivers/isdn/hardware/mISDN/mISDNinfineon.c
index 3e01012be4ab..95a0d728eecc 100644
--- a/drivers/isdn/hardware/mISDN/mISDNinfineon.c
+++ b/drivers/isdn/hardware/mISDN/mISDNinfineon.c
@@ -645,17 +645,19 @@ static void
 release_io(struct inf_hw *hw)
 {
 	if (hw->cfg.mode) {
-		if (hw->cfg.p) {
+		if (hw->cfg.mode == AM_MEMIO) {
 			release_mem_region(hw->cfg.start, hw->cfg.size);
-			iounmap(hw->cfg.p);
+			if (hw->cfg.p)
+				iounmap(hw->cfg.p);
 		} else
 			release_region(hw->cfg.start, hw->cfg.size);
 		hw->cfg.mode = AM_NONE;
 	}
 	if (hw->addr.mode) {
-		if (hw->addr.p) {
+		if (hw->addr.mode == AM_MEMIO) {
 			release_mem_region(hw->addr.start, hw->addr.size);
-			iounmap(hw->addr.p);
+			if (hw->addr.p)
+				iounmap(hw->addr.p);
 		} else
 			release_region(hw->addr.start, hw->addr.size);
 		hw->addr.mode = AM_NONE;
@@ -685,9 +687,12 @@ setup_io(struct inf_hw *hw)
 				(ulong)hw->cfg.start, (ulong)hw->cfg.size);
 			return err;
 		}
-		if (hw->ci->cfg_mode == AM_MEMIO)
-			hw->cfg.p = ioremap(hw->cfg.start, hw->cfg.size);
 		hw->cfg.mode = hw->ci->cfg_mode;
+		if (hw->ci->cfg_mode == AM_MEMIO) {
+			hw->cfg.p = ioremap(hw->cfg.start, hw->cfg.size);
+			if (!hw->cfg.p)
+				return -ENOMEM;
+		}
 		if (debug & DEBUG_HW)
 			pr_notice("%s: IO cfg %lx (%lu bytes) mode%d\n",
 				  hw->name, (ulong)hw->cfg.start,
@@ -712,9 +717,12 @@ setup_io(struct inf_hw *hw)
 				(ulong)hw->addr.start, (ulong)hw->addr.size);
 			return err;
 		}
-		if (hw->ci->addr_mode == AM_MEMIO)
-			hw->addr.p = ioremap(hw->addr.start, hw->addr.size);
 		hw->addr.mode = hw->ci->addr_mode;
+		if (hw->ci->addr_mode == AM_MEMIO) {
+			hw->addr.p = ioremap(hw->addr.start, hw->addr.size);
+			if (!hw->addr.p)
+				return -ENOMEM;
+		}
 		if (debug & DEBUG_HW)
 			pr_notice("%s: IO addr %lx (%lu bytes) mode%d\n",
 				  hw->name, (ulong)hw->addr.start,

commit 73522d083d50bbd524beae832a691ae28eb092c4
Author: Tom Seewald <tseewald@gmail.com>
Date:   Mon May 3 13:56:56 2021 +0200

    char: hpet: add checks after calling ioremap
    
    [ Upstream commit b11701c933112d49b808dee01cb7ff854ba6a77a ]
    
    The function hpet_resources() calls ioremap() two times, but in both
    cases it does not check if ioremap() returned a null pointer. Fix this
    by adding null pointer checks and returning an appropriate error.
    
    Signed-off-by: Tom Seewald <tseewald@gmail.com>
    Link: https://lore.kernel.org/r/20210503115736.2104747-30-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c
index c0732f032248..68f02318cee3 100644
--- a/drivers/char/hpet.c
+++ b/drivers/char/hpet.c
@@ -975,6 +975,8 @@ static acpi_status hpet_resources(struct acpi_resource *res, void *data)
 	if (ACPI_SUCCESS(status)) {
 		hdp->hd_phys_address = addr.address.minimum;
 		hdp->hd_address = ioremap(addr.address.minimum, addr.address.address_length);
+		if (!hdp->hd_address)
+			return AE_ERROR;
 
 		if (hpet_is_known(hdp)) {
 			iounmap(hdp->hd_address);
@@ -988,6 +990,8 @@ static acpi_status hpet_resources(struct acpi_resource *res, void *data)
 		hdp->hd_phys_address = fixmem32->address;
 		hdp->hd_address = ioremap(fixmem32->address,
 						HPET_RANGE_SIZE);
+		if (!hdp->hd_address)
+			return AE_ERROR;
 
 		if (hpet_is_known(hdp)) {
 			iounmap(hdp->hd_address);

commit 48ac9e474beef32ada4e62b174d2fbed03b4b052
Author: Du Cheng <ducheng2@gmail.com>
Date:   Mon May 3 13:56:46 2021 +0200

    net: caif: remove BUG_ON(dev == NULL) in caif_xmit
    
    [ Upstream commit 65a67792e3416f7c5d7daa47d99334cbb19a7449 ]
    
    The condition of dev == NULL is impossible in caif_xmit(), hence it is
    for the removal.
    
    Explanation:
    The static caif_xmit() is only called upon via a function pointer
    `ndo_start_xmit` defined in include/linux/netdevice.h:
    ```
    struct net_device_ops {
        ...
        netdev_tx_t     (*ndo_start_xmit)(struct sk_buff *skb, struct net_device *dev);
        ...
    }
    ```
    
    The exhausive list of call points are:
    ```
    drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c
        dev->netdev_ops->ndo_start_xmit(skb, dev);
        ^                                    ^
    
    drivers/infiniband/ulp/opa_vnic/opa_vnic_netdev.c
        struct opa_vnic_adapter *adapter = opa_vnic_priv(netdev);
                                 ^                       ^
        return adapter->rn_ops->ndo_start_xmit(skb, netdev); // adapter would crash first
               ^                                    ^
    
    drivers/usb/gadget/function/f_ncm.c
        ncm->netdev->netdev_ops->ndo_start_xmit(NULL, ncm->netdev);
                  ^                                   ^
    
    include/linux/netdevice.h
    static inline netdev_tx_t __netdev_start_xmit(...
    {
        return ops->ndo_start_xmit(skb, dev);
                                        ^
    }
    
        const struct net_device_ops *ops = dev->netdev_ops;
                                           ^
        rc = __netdev_start_xmit(ops, skb, dev, more);
                                           ^
    ```
    
    In each of the enumerated scenarios, it is impossible for the NULL-valued dev to
    reach the caif_xmit() without crashing the kernel earlier, therefore `BUG_ON(dev ==
    NULL)` is rather useless, hence the removal.
    
    Cc: David S. Miller <davem@davemloft.net>
    Signed-off-by: Du Cheng <ducheng2@gmail.com>
    Link: https://lore.kernel.org/r/20210503115736.2104747-20-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/caif/caif_serial.c b/drivers/net/caif/caif_serial.c
index a0f954f36c09..94d5ce9419ca 100644
--- a/drivers/net/caif/caif_serial.c
+++ b/drivers/net/caif/caif_serial.c
@@ -279,7 +279,6 @@ static int caif_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	struct ser_device *ser;
 
-	BUG_ON(dev == NULL);
 	ser = netdev_priv(dev);
 
 	/* Send flow off once, on high water mark */

commit 7883d3895d0fbb0ba9bff0f8665f99974b45210f
Author: Anirudh Rayabharam <mail@anirudhrb.com>
Date:   Mon May 3 13:56:42 2021 +0200

    net: fujitsu: fix potential null-ptr-deref
    
    [ Upstream commit 52202be1cd996cde6e8969a128dc27ee45a7cb5e ]
    
    In fmvj18x_get_hwinfo(), if ioremap fails there will be NULL pointer
    deref. To fix this, check the return value of ioremap and return -1
    to the caller in case of failure.
    
    Cc: "David S. Miller" <davem@davemloft.net>
    Acked-by: Dominik Brodowski <linux@dominikbrodowski.net>
    Signed-off-by: Anirudh Rayabharam <mail@anirudhrb.com>
    Link: https://lore.kernel.org/r/20210503115736.2104747-16-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/fujitsu/fmvj18x_cs.c b/drivers/net/ethernet/fujitsu/fmvj18x_cs.c
index a69cd19a55ae..b8fc9bbeca2c 100644
--- a/drivers/net/ethernet/fujitsu/fmvj18x_cs.c
+++ b/drivers/net/ethernet/fujitsu/fmvj18x_cs.c
@@ -547,6 +547,11 @@ static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id)
 	return -1;
 
     base = ioremap(link->resource[2]->start, resource_size(link->resource[2]));
+    if (!base) {
+	pcmcia_release_window(link, link->resource[2]);
+	return -1;
+    }
+
     pcmcia_map_mem_page(link, link->resource[2], 0);
 
     /*

commit 6a41643e59ad2d19538b3143707319511992153a
Author: Atul Gopinathan <atulgopinathan@gmail.com>
Date:   Mon May 3 13:56:38 2021 +0200

    serial: max310x: unregister uart driver in case of failure and abort
    
    [ Upstream commit 3890e3dea315f1a257d1b940a2a4e2fa16a7b095 ]
    
    The macro "spi_register_driver" invokes the function
    "__spi_register_driver()" which has a return type of int and can fail,
    returning a negative value in such a case. This is currently ignored and
    the init() function yields success even if the spi driver failed to
    register.
    
    Fix this by collecting the return value of "__spi_register_driver()" and
    also unregister the uart driver in case of failure.
    
    Cc: Jiri Slaby <jirislaby@kernel.org>
    Signed-off-by: Atul Gopinathan <atulgopinathan@gmail.com>
    Link: https://lore.kernel.org/r/20210503115736.2104747-12-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c
index 0c35c3c5e373..c1ab0dbda8a9 100644
--- a/drivers/tty/serial/max310x.c
+++ b/drivers/tty/serial/max310x.c
@@ -1480,10 +1480,12 @@ static int __init max310x_uart_init(void)
 		return ret;
 
 #ifdef CONFIG_SPI_MASTER
-	spi_register_driver(&max310x_spi_driver);
+	ret = spi_register_driver(&max310x_spi_driver);
+	if (ret)
+		uart_unregister_driver(&max310x_uart);
 #endif
 
-	return 0;
+	return ret;
 }
 module_init(max310x_uart_init);
 

commit 8c40acd3ee3cfbdf5df5fc1a6f3423d36ef27a64
Author: Kai-Heng Feng <kai.heng.feng@canonical.com>
Date:   Fri Apr 30 14:07:35 2021 +0800

    platform/x86: hp_accel: Avoid invoking _INI to speed up resume
    
    [ Upstream commit 79d341e26ebcdbc622348aaaab6f8f89b6fdb25f ]
    
    hp_accel can take almost two seconds to resume on some HP laptops.
    
    The bottleneck is on evaluating _INI, which is only needed to run once.
    
    Resolve the issue by only invoking _INI when it's necessary. Namely, on
    probe and on hibernation restore.
    
    Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
    Acked-by: ?ric Piel <eric.piel@trempplin-utc.net>
    Link: https://lore.kernel.org/r/20210430060736.590321-1-kai.heng.feng@canonical.com
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/misc/lis3lv02d/lis3lv02d.h b/drivers/misc/lis3lv02d/lis3lv02d.h
index c439c827eea8..0ef759671b54 100644
--- a/drivers/misc/lis3lv02d/lis3lv02d.h
+++ b/drivers/misc/lis3lv02d/lis3lv02d.h
@@ -284,6 +284,7 @@ struct lis3lv02d {
 	int			regs_size;
 	u8                      *reg_cache;
 	bool			regs_stored;
+	bool			init_required;
 	u8                      odr_mask;  /* ODR bit mask */
 	u8			whoami;    /* indicates measurement precision */
 	s16 (*read_data) (struct lis3lv02d *lis3, int reg);
diff --git a/drivers/platform/x86/hp_accel.c b/drivers/platform/x86/hp_accel.c
index 7b12abe86b94..9c3c83ef445b 100644
--- a/drivers/platform/x86/hp_accel.c
+++ b/drivers/platform/x86/hp_accel.c
@@ -101,6 +101,9 @@ MODULE_DEVICE_TABLE(acpi, lis3lv02d_device_ids);
 static int lis3lv02d_acpi_init(struct lis3lv02d *lis3)
 {
 	struct acpi_device *dev = lis3->bus_priv;
+	if (!lis3->init_required)
+		return 0;
+
 	if (acpi_evaluate_object(dev->handle, METHOD_NAME__INI,
 				 NULL, NULL) != AE_OK)
 		return -EINVAL;
@@ -367,6 +370,7 @@ static int lis3lv02d_add(struct acpi_device *device)
 	}
 
 	/* call the core layer do its init */
+	lis3_dev.init_required = true;
 	ret = lis3lv02d_init_device(&lis3_dev);
 	if (ret)
 		return ret;
@@ -414,11 +418,27 @@ static int lis3lv02d_suspend(struct device *dev)
 
 static int lis3lv02d_resume(struct device *dev)
 {
+	lis3_dev.init_required = false;
+	lis3lv02d_poweron(&lis3_dev);
+	return 0;
+}
+
+static int lis3lv02d_restore(struct device *dev)
+{
+	lis3_dev.init_required = true;
 	lis3lv02d_poweron(&lis3_dev);
 	return 0;
 }
 
-static SIMPLE_DEV_PM_OPS(hp_accel_pm, lis3lv02d_suspend, lis3lv02d_resume);
+static const struct dev_pm_ops hp_accel_pm = {
+	.suspend = lis3lv02d_suspend,
+	.resume = lis3lv02d_resume,
+	.freeze = lis3lv02d_suspend,
+	.thaw = lis3lv02d_resume,
+	.poweroff = lis3lv02d_suspend,
+	.restore = lis3lv02d_restore,
+};
+
 #define HP_ACCEL_PM (&hp_accel_pm)
 #else
 #define HP_ACCEL_PM NULL

commit 75513044dc2941b542132d855efcfa6034d7e4bc
Author: Felix Fietkau <nbd@nbd.name>
Date:   Tue May 25 18:07:58 2021 +0200

    perf jevents: Fix getting maximum number of fds
    
    commit 75ea44e356b5de8c817f821c9dd68ae329e82add upstream.
    
    On some hosts, rlim.rlim_max can be returned as RLIM_INFINITY.
    By casting it to int, it is interpreted as -1, which will cause get_maxfds
    to return 0, causing "Invalid argument" errors in nftw() calls.
    Fix this by casting the second argument of min() to rlim_t instead.
    
    Fixes: 80eeb67fe577 ("perf jevents: Program to convert JSON file")
    Signed-off-by: Felix Fietkau <nbd@nbd.name>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Andi Kleen <ak@linux.intel.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
    Link: http://lore.kernel.org/lkml/20210525160758.97829-1-nbd@nbd.name
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/perf/pmu-events/jevents.c b/tools/perf/pmu-events/jevents.c
index 6631970f9683..31331c42b0e3 100644
--- a/tools/perf/pmu-events/jevents.c
+++ b/tools/perf/pmu-events/jevents.c
@@ -858,7 +858,7 @@ static int get_maxfds(void)
 	struct rlimit rlim;
 
 	if (getrlimit(RLIMIT_NOFILE, &rlim) == 0)
-		return min((int)rlim.rlim_max / 2, 512);
+		return min(rlim.rlim_max / 2, (rlim_t)512);
 
 	return 512;
 }

commit c70e1ba2e7e65255a0ce004f531dd90dada97a8c
Author: Jean Delvare <jdelvare@suse.de>
Date:   Tue May 25 17:03:36 2021 +0200

    i2c: i801: Don't generate an interrupt on bus reset
    
    commit e4d8716c3dcec47f1557024add24e1f3c09eb24b upstream.
    
    Now that the i2c-i801 driver supports interrupts, setting the KILL bit
    in a attempt to recover from a timed out transaction triggers an
    interrupt. Unfortunately, the interrupt handler (i801_isr) is not
    prepared for this situation and will try to process the interrupt as
    if it was signaling the end of a successful transaction. In the case
    of a block transaction, this can result in an out-of-range memory
    access.
    
    This condition was reproduced several times by syzbot:
    https://syzkaller.appspot.com/bug?extid=ed71512d469895b5b34e
    https://syzkaller.appspot.com/bug?extid=8c8dedc0ba9e03f6c79e
    https://syzkaller.appspot.com/bug?extid=c8ff0b6d6c73d81b610e
    https://syzkaller.appspot.com/bug?extid=33f6c360821c399d69eb
    https://syzkaller.appspot.com/bug?extid=be15dc0b1933f04b043a
    https://syzkaller.appspot.com/bug?extid=b4d3fd1dfd53e90afd79
    
    So disable interrupts while trying to reset the bus. Interrupts will
    be enabled again for the following transaction.
    
    Fixes: 636752bcb517 ("i2c-i801: Enable IRQ for SMBus transactions")
    Reported-by: syzbot+b4d3fd1dfd53e90afd79@syzkaller.appspotmail.com
    Signed-off-by: Jean Delvare <jdelvare@suse.de>
    Acked-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Cc: Jarkko Nikula <jarkko.nikula@linux.intel.com>
    Tested-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c
index 3ac3b26cc931..efafd028c5d1 100644
--- a/drivers/i2c/busses/i2c-i801.c
+++ b/drivers/i2c/busses/i2c-i801.c
@@ -384,11 +384,9 @@ static int i801_check_post(struct i801_priv *priv, int status)
 		dev_err(&priv->pci_dev->dev, "Transaction timeout\n");
 		/* try to stop the current command */
 		dev_dbg(&priv->pci_dev->dev, "Terminating the current operation\n");
-		outb_p(inb_p(SMBHSTCNT(priv)) | SMBHSTCNT_KILL,
-		       SMBHSTCNT(priv));
+		outb_p(SMBHSTCNT_KILL, SMBHSTCNT(priv));
 		usleep_range(1000, 2000);
-		outb_p(inb_p(SMBHSTCNT(priv)) & (~SMBHSTCNT_KILL),
-		       SMBHSTCNT(priv));
+		outb_p(0, SMBHSTCNT(priv));
 
 		/* Check if it worked */
 		status = inb_p(SMBHSTSTS(priv));

commit 124c1dbe01ca5761eb47a83b60cea5209aeafaee
Author: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Date:   Wed May 26 08:39:37 2021 -0400

    i2c: s3c2410: fix possible NULL pointer deref on read message after write
    
    commit 24990423267ec283b9d86f07f362b753eb9b0ed5 upstream.
    
    Interrupt handler processes multiple message write requests one after
    another, till the driver message queue is drained.  However if driver
    encounters a read message without preceding START, it stops the I2C
    transfer as it is an invalid condition for the controller.  At least the
    comment describes a requirement "the controller forces us to send a new
    START when we change direction".  This stop results in clearing the
    message queue (i2c->msg = NULL).
    
    The code however immediately jumped back to label "retry_write" which
    dereferenced the "i2c->msg" making it a possible NULL pointer
    dereference.
    
    The Coverity analysis:
    1. Condition !is_msgend(i2c), taking false branch.
       if (!is_msgend(i2c)) {
    
    2. Condition !is_lastmsg(i2c), taking true branch.
       } else if (!is_lastmsg(i2c)) {
    
    3. Condition i2c->msg->flags & 1, taking true branch.
       if (i2c->msg->flags & I2C_M_RD) {
    
    4. write_zero_model: Passing i2c to s3c24xx_i2c_stop, which sets i2c->msg to NULL.
       s3c24xx_i2c_stop(i2c, -EINVAL);
    
    5. Jumping to label retry_write.
       goto retry_write;
    
    6. var_deref_model: Passing i2c to is_msgend, which dereferences null i2c->msg.
       if (!is_msgend(i2c)) {"
    
    All previous calls to s3c24xx_i2c_stop() in this interrupt service
    routine are followed by jumping to end of function (acknowledging
    the interrupt and returning).  This seems a reasonable choice also here
    since message buffer was entirely emptied.
    
    Addresses-Coverity: Explicit null dereferenced
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c
index 2f2e28d60ef5..d3603e261a84 100644
--- a/drivers/i2c/busses/i2c-s3c2410.c
+++ b/drivers/i2c/busses/i2c-s3c2410.c
@@ -493,7 +493,10 @@ static int i2c_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)
 					 * forces us to send a new START
 					 * when we change direction
 					 */
+					dev_dbg(i2c->dev,
+						"missing START before write->read\n");
 					s3c24xx_i2c_stop(i2c, -EINVAL);
+					break;
 				}
 
 				goto retry_write;

commit 0f2cb08c57edefb0e7b5045e0e3e9980a3d3aa37
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Sat May 8 16:30:35 2021 +0300

    net: dsa: fix a crash if ->get_sset_count() fails
    
    commit a269333fa5c0c8e53c92b5a28a6076a28cde3e83 upstream.
    
    If ds->ops->get_sset_count() fails then it "count" is a negative error
    code such as -EOPNOTSUPP.  Because "i" is an unsigned int, the negative
    error code is type promoted to a very high value and the loop will
    corrupt memory until the system crashes.
    
    Fix this by checking for error codes and changing the type of "i" to
    just int.
    
    Fixes: badf3ada60ab ("net: dsa: Provide CPU port statistics to master netdev")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Reviewed-by: Andrew Lunn <andrew@lunn.ch>
    Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
    Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/dsa/master.c b/net/dsa/master.c
index aae478d61101..22e9ce6e51a4 100644
--- a/net/dsa/master.c
+++ b/net/dsa/master.c
@@ -87,8 +87,7 @@ static void dsa_master_get_strings(struct net_device *dev, uint32_t stringset,
 	struct dsa_switch *ds = cpu_dp->ds;
 	int port = cpu_dp->index;
 	int len = ETH_GSTRING_LEN;
-	int mcount = 0, count;
-	unsigned int i;
+	int mcount = 0, count, i;
 	uint8_t pfx[4];
 	uint8_t *ndata;
 
@@ -118,6 +117,8 @@ static void dsa_master_get_strings(struct net_device *dev, uint32_t stringset,
 		 */
 		ds->ops->get_strings(ds, port, stringset, ndata);
 		count = ds->ops->get_sset_count(ds, port, stringset);
+		if (count < 0)
+			return;
 		for (i = 0; i < count; i++) {
 			memmove(ndata + (i * len + sizeof(pfx)),
 				ndata + i * len, len - sizeof(pfx));

commit ae389812733b1b1e8e07fcc238e41db166b5c78d
Author: DENG Qingfang <dqfext@gmail.com>
Date:   Sun May 23 22:51:54 2021 +0800

    net: dsa: mt7530: fix VLAN traffic leaks
    
    commit 474a2ddaa192777522a7499784f1d60691cd831a upstream.
    
    PCR_MATRIX field was set to all 1's when VLAN filtering is enabled, but
    was not reset when it is disabled, which may cause traffic leaks:
    
            ip link add br0 type bridge vlan_filtering 1
            ip link add br1 type bridge vlan_filtering 1
            ip link set swp0 master br0
            ip link set swp1 master br1
            ip link set br0 type bridge vlan_filtering 0
            ip link set br1 type bridge vlan_filtering 0
            # traffic in br0 and br1 will start leaking to each other
    
    As port_bridge_{add,del} have set up PCR_MATRIX properly, remove the
    PCR_MATRIX write from mt7530_port_set_vlan_aware.
    
    Fixes: 83163f7dca56 ("net: dsa: mediatek: add VLAN support for MT7530")
    Signed-off-by: DENG Qingfang <dqfext@gmail.com>
    Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c
index 616afd81536a..6335c4ea0957 100644
--- a/drivers/net/dsa/mt7530.c
+++ b/drivers/net/dsa/mt7530.c
@@ -851,14 +851,6 @@ mt7530_port_set_vlan_aware(struct dsa_switch *ds, int port)
 {
 	struct mt7530_priv *priv = ds->priv;
 
-	/* The real fabric path would be decided on the membership in the
-	 * entry of VLAN table. PCR_MATRIX set up here with ALL_MEMBERS
-	 * means potential VLAN can be consisting of certain subset of all
-	 * ports.
-	 */
-	mt7530_rmw(priv, MT7530_PCR_P(port),
-		   PCR_MATRIX_MASK, PCR_MATRIX(MT7530_ALL_MEMBERS));
-
 	/* Trapped into security mode allows packet forwarding through VLAN
 	 * table lookup. CPU port is set to fallback mode to let untagged
 	 * frames pass through.

commit 4b1761898861117c97066aea6c58f68a7787f0bf
Author: Xin Long <lucien.xin@gmail.com>
Date:   Sat May 8 03:57:03 2021 +0800

    tipc: skb_linearize the head skb when reassembling msgs
    
    commit b7df21cf1b79ab7026f545e7bf837bd5750ac026 upstream.
    
    It's not a good idea to append the frag skb to a skb's frag_list if
    the frag_list already has skbs from elsewhere, such as this skb was
    created by pskb_copy() where the frag_list was cloned (all the skbs
    in it were skb_get'ed) and shared by multiple skbs.
    
    However, the new appended frag skb should have been only seen by the
    current skb. Otherwise, it will cause use after free crashes as this
    appended frag skb are seen by multiple skbs but it only got skb_get
    called once.
    
    The same thing happens with a skb updated by pskb_may_pull() with a
    skb_cloned skb. Li Shuang has reported quite a few crashes caused
    by this when doing testing over macvlan devices:
    
      [] kernel BUG at net/core/skbuff.c:1970!
      [] Call Trace:
      []  skb_clone+0x4d/0xb0
      []  macvlan_broadcast+0xd8/0x160 [macvlan]
      []  macvlan_process_broadcast+0x148/0x150 [macvlan]
      []  process_one_work+0x1a7/0x360
      []  worker_thread+0x30/0x390
    
      [] kernel BUG at mm/usercopy.c:102!
      [] Call Trace:
      []  __check_heap_object+0xd3/0x100
      []  __check_object_size+0xff/0x16b
      []  simple_copy_to_iter+0x1c/0x30
      []  __skb_datagram_iter+0x7d/0x310
      []  __skb_datagram_iter+0x2a5/0x310
      []  skb_copy_datagram_iter+0x3b/0x90
      []  tipc_recvmsg+0x14a/0x3a0 [tipc]
      []  ____sys_recvmsg+0x91/0x150
      []  ___sys_recvmsg+0x7b/0xc0
    
      [] kernel BUG at mm/slub.c:305!
      [] Call Trace:
      []  <IRQ>
      []  kmem_cache_free+0x3ff/0x400
      []  __netif_receive_skb_core+0x12c/0xc40
      []  ? kmem_cache_alloc+0x12e/0x270
      []  netif_receive_skb_internal+0x3d/0xb0
      []  ? get_rx_page_info+0x8e/0xa0 [be2net]
      []  be_poll+0x6ef/0xd00 [be2net]
      []  ? irq_exit+0x4f/0x100
      []  net_rx_action+0x149/0x3b0
    
      ...
    
    This patch is to fix it by linearizing the head skb if it has frag_list
    set in tipc_buf_append(). Note that we choose to do this before calling
    skb_unshare(), as __skb_linearize() will avoid skb_copy(). Also, we can
    not just drop the frag_list either as the early time.
    
    Fixes: 45c8b7b175ce ("tipc: allow non-linear first fragment buffer")
    Reported-by: Li Shuang <shuali@redhat.com>
    Signed-off-by: Xin Long <lucien.xin@gmail.com>
    Acked-by: Jon Maloy <jmaloy@redhat.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/tipc/msg.c b/net/tipc/msg.c
index f04843ca8216..0ac270444974 100644
--- a/net/tipc/msg.c
+++ b/net/tipc/msg.c
@@ -141,18 +141,13 @@ int tipc_buf_append(struct sk_buff **headbuf, struct sk_buff **buf)
 		if (unlikely(head))
 			goto err;
 		*buf = NULL;
+		if (skb_has_frag_list(frag) && __skb_linearize(frag))
+			goto err;
 		frag = skb_unshare(frag, GFP_ATOMIC);
 		if (unlikely(!frag))
 			goto err;
 		head = *headbuf = frag;
 		TIPC_SKB_CB(head)->tail = NULL;
-		if (skb_is_nonlinear(head)) {
-			skb_walk_frags(head, tail) {
-				TIPC_SKB_CB(head)->tail = tail;
-			}
-		} else {
-			skb_frag_list_init(head);
-		}
 		return 0;
 	}
 

commit cb803a1edeff61487a038c5c1e8820ab831e7a52
Author: Hoang Le <hoang.h.le@dektech.com.au>
Date:   Fri May 14 08:23:03 2021 +0700

    Revert "net:tipc: Fix a double free in tipc_sk_mcast_rcv"
    
    commit 75016891357a628d2b8acc09e2b9b2576c18d318 upstream.
    
    This reverts commit 6bf24dc0cc0cc43b29ba344b66d78590e687e046.
    Above fix is not correct and caused memory leak issue.
    
    Fixes: 6bf24dc0cc0c ("net:tipc: Fix a double free in tipc_sk_mcast_rcv")
    Acked-by: Jon Maloy <jmaloy@redhat.com>
    Acked-by: Tung Nguyen <tung.q.nguyen@dektech.com.au>
    Signed-off-by: Hoang Le <hoang.h.le@dektech.com.au>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index 4c35f9893081..3c41fb8edc5f 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -1187,7 +1187,10 @@ void tipc_sk_mcast_rcv(struct net *net, struct sk_buff_head *arrvq,
 		spin_lock_bh(&inputq->lock);
 		if (skb_peek(arrvq) == skb) {
 			skb_queue_splice_tail_init(&tmpq, inputq);
-			__skb_dequeue(arrvq);
+			/* Decrease the skb's refcnt as increasing in the
+			 * function tipc_skb_peek
+			 */
+			kfree_skb(__skb_dequeue(arrvq));
 		}
 		spin_unlock_bh(&inputq->lock);
 		__skb_queue_purge(&tmpq);

commit c10f958492436787ca46da6019926fe0b8b36cc7
Author: Vladyslav Tarasiuk <vladyslavt@nvidia.com>
Date:   Sun May 9 09:43:18 2021 +0300

    net/mlx4: Fix EEPROM dump support
    
    commit db825feefc6868896fed5e361787ba3bee2fd906 upstream.
    
    Fix SFP and QSFP* EEPROM queries by setting i2c_address, offset and page
    number correctly. For SFP set the following params:
    - I2C address for offsets 0-255 is 0x50. For 256-511 - 0x51.
    - Page number is zero.
    - Offset is 0-255.
    
    At the same time, QSFP* parameters are different:
    - I2C address is always 0x50.
    - Page number is not limited to zero.
    - Offset is 0-255 for page zero and 128-255 for others.
    
    To set parameters accordingly to cable used, implement function to query
    module ID and implement respective helper functions to set parameters
    correctly.
    
    Fixes: 135dd9594f12 ("net/mlx4_en: ethtool, Remove unsupported SFP EEPROM high pages query")
    Signed-off-by: Vladyslav Tarasiuk <vladyslavt@nvidia.com>
    Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
index 7a99eb1572fd..6a005014d46a 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
@@ -2011,8 +2011,6 @@ static int mlx4_en_set_tunable(struct net_device *dev,
 	return ret;
 }
 
-#define MLX4_EEPROM_PAGE_LEN 256
-
 static int mlx4_en_get_module_info(struct net_device *dev,
 				   struct ethtool_modinfo *modinfo)
 {
@@ -2047,7 +2045,7 @@ static int mlx4_en_get_module_info(struct net_device *dev,
 		break;
 	case MLX4_MODULE_ID_SFP:
 		modinfo->type = ETH_MODULE_SFF_8472;
-		modinfo->eeprom_len = MLX4_EEPROM_PAGE_LEN;
+		modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN;
 		break;
 	default:
 		return -EINVAL;
diff --git a/drivers/net/ethernet/mellanox/mlx4/port.c b/drivers/net/ethernet/mellanox/mlx4/port.c
index ba6ac31a339d..256a06b3c096 100644
--- a/drivers/net/ethernet/mellanox/mlx4/port.c
+++ b/drivers/net/ethernet/mellanox/mlx4/port.c
@@ -1973,6 +1973,7 @@ EXPORT_SYMBOL(mlx4_get_roce_gid_from_slave);
 #define I2C_ADDR_LOW  0x50
 #define I2C_ADDR_HIGH 0x51
 #define I2C_PAGE_SIZE 256
+#define I2C_HIGH_PAGE_SIZE 128
 
 /* Module Info Data */
 struct mlx4_cable_info {
@@ -2026,6 +2027,88 @@ static inline const char *cable_info_mad_err_str(u16 mad_status)
 	return "Unknown Error";
 }
 
+static int mlx4_get_module_id(struct mlx4_dev *dev, u8 port, u8 *module_id)
+{
+	struct mlx4_cmd_mailbox *inbox, *outbox;
+	struct mlx4_mad_ifc *inmad, *outmad;
+	struct mlx4_cable_info *cable_info;
+	int ret;
+
+	inbox = mlx4_alloc_cmd_mailbox(dev);
+	if (IS_ERR(inbox))
+		return PTR_ERR(inbox);
+
+	outbox = mlx4_alloc_cmd_mailbox(dev);
+	if (IS_ERR(outbox)) {
+		mlx4_free_cmd_mailbox(dev, inbox);
+		return PTR_ERR(outbox);
+	}
+
+	inmad = (struct mlx4_mad_ifc *)(inbox->buf);
+	outmad = (struct mlx4_mad_ifc *)(outbox->buf);
+
+	inmad->method = 0x1; /* Get */
+	inmad->class_version = 0x1;
+	inmad->mgmt_class = 0x1;
+	inmad->base_version = 0x1;
+	inmad->attr_id = cpu_to_be16(0xFF60); /* Module Info */
+
+	cable_info = (struct mlx4_cable_info *)inmad->data;
+	cable_info->dev_mem_address = 0;
+	cable_info->page_num = 0;
+	cable_info->i2c_addr = I2C_ADDR_LOW;
+	cable_info->size = cpu_to_be16(1);
+
+	ret = mlx4_cmd_box(dev, inbox->dma, outbox->dma, port, 3,
+			   MLX4_CMD_MAD_IFC, MLX4_CMD_TIME_CLASS_C,
+			   MLX4_CMD_NATIVE);
+	if (ret)
+		goto out;
+
+	if (be16_to_cpu(outmad->status)) {
+		/* Mad returned with bad status */
+		ret = be16_to_cpu(outmad->status);
+		mlx4_warn(dev,
+			  "MLX4_CMD_MAD_IFC Get Module ID attr(%x) port(%d) i2c_addr(%x) offset(%d) size(%d): Response Mad Status(%x) - %s\n",
+			  0xFF60, port, I2C_ADDR_LOW, 0, 1, ret,
+			  cable_info_mad_err_str(ret));
+		ret = -ret;
+		goto out;
+	}
+	cable_info = (struct mlx4_cable_info *)outmad->data;
+	*module_id = cable_info->data[0];
+out:
+	mlx4_free_cmd_mailbox(dev, inbox);
+	mlx4_free_cmd_mailbox(dev, outbox);
+	return ret;
+}
+
+static void mlx4_sfp_eeprom_params_set(u8 *i2c_addr, u8 *page_num, u16 *offset)
+{
+	*i2c_addr = I2C_ADDR_LOW;
+	*page_num = 0;
+
+	if (*offset < I2C_PAGE_SIZE)
+		return;
+
+	*i2c_addr = I2C_ADDR_HIGH;
+	*offset -= I2C_PAGE_SIZE;
+}
+
+static void mlx4_qsfp_eeprom_params_set(u8 *i2c_addr, u8 *page_num, u16 *offset)
+{
+	/* Offsets 0-255 belong to page 0.
+	 * Offsets 256-639 belong to pages 01, 02, 03.
+	 * For example, offset 400 is page 02: 1 + (400 - 256) / 128 = 2
+	 */
+	if (*offset < I2C_PAGE_SIZE)
+		*page_num = 0;
+	else
+		*page_num = 1 + (*offset - I2C_PAGE_SIZE) / I2C_HIGH_PAGE_SIZE;
+	*i2c_addr = I2C_ADDR_LOW;
+	*offset -= *page_num * I2C_HIGH_PAGE_SIZE;
+}
+
 /**
  * mlx4_get_module_info - Read cable module eeprom data
  * @dev: mlx4_dev.
@@ -2045,12 +2128,30 @@ int mlx4_get_module_info(struct mlx4_dev *dev, u8 port,
 	struct mlx4_cmd_mailbox *inbox, *outbox;
 	struct mlx4_mad_ifc *inmad, *outmad;
 	struct mlx4_cable_info *cable_info;
-	u16 i2c_addr;
+	u8 module_id, i2c_addr, page_num;
 	int ret;
 
 	if (size > MODULE_INFO_MAX_READ)
 		size = MODULE_INFO_MAX_READ;
 
+	ret = mlx4_get_module_id(dev, port, &module_id);
+	if (ret)
+		return ret;
+
+	switch (module_id) {
+	case MLX4_MODULE_ID_SFP:
+		mlx4_sfp_eeprom_params_set(&i2c_addr, &page_num, &offset);
+		break;
+	case MLX4_MODULE_ID_QSFP:
+	case MLX4_MODULE_ID_QSFP_PLUS:
+	case MLX4_MODULE_ID_QSFP28:
+		mlx4_qsfp_eeprom_params_set(&i2c_addr, &page_num, &offset);
+		break;
+	default:
+		mlx4_err(dev, "Module ID not recognized: %#x\n", module_id);
+		return -EINVAL;
+	}
+
 	inbox = mlx4_alloc_cmd_mailbox(dev);
 	if (IS_ERR(inbox))
 		return PTR_ERR(inbox);
@@ -2076,11 +2177,9 @@ int mlx4_get_module_info(struct mlx4_dev *dev, u8 port,
 		 */
 		size -= offset + size - I2C_PAGE_SIZE;
 
-	i2c_addr = I2C_ADDR_LOW;
-
 	cable_info = (struct mlx4_cable_info *)inmad->data;
 	cable_info->dev_mem_address = cpu_to_be16(offset);
-	cable_info->page_num = 0;
+	cable_info->page_num = page_num;
 	cable_info->i2c_addr = i2c_addr;
 	cable_info->size = cpu_to_be16(size);
 

commit e256a0eb43e17209e347409a80805b1659398d68
Author: Neil Armstrong <narmstrong@baylibre.com>
Date:   Fri Apr 30 10:27:44 2021 +0200

    drm/meson: fix shutdown crash when component not probed
    
    commit 7cfc4ea78fc103ea51ecbacd9236abb5b1c490d2 upstream.
    
    When main component is not probed, by example when the dw-hdmi module is
    not loaded yet or in probe defer, the following crash appears on shutdown:
    
    Unable to handle kernel NULL pointer dereference at virtual address 0000000000000038
    ...
    pc : meson_drv_shutdown+0x24/0x50
    lr : platform_drv_shutdown+0x20/0x30
    ...
    Call trace:
    meson_drv_shutdown+0x24/0x50
    platform_drv_shutdown+0x20/0x30
    device_shutdown+0x158/0x360
    kernel_restart_prepare+0x38/0x48
    kernel_restart+0x18/0x68
    __do_sys_reboot+0x224/0x250
    __arm64_sys_reboot+0x24/0x30
    ...
    
    Simply check if the priv struct has been allocated before using it.
    
    Fixes: fa0c16caf3d7 ("drm: meson_drv add shutdown function")
    Reported-by: Stefan Agner <stefan@agner.ch>
    Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
    Tested-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
    Reviewed-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20210430082744.3638743-1-narmstrong@baylibre.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/meson/meson_drv.c b/drivers/gpu/drm/meson/meson_drv.c
index 25b06771f238..1887473cdd79 100644
--- a/drivers/gpu/drm/meson/meson_drv.c
+++ b/drivers/gpu/drm/meson/meson_drv.c
@@ -387,11 +387,12 @@ static int meson_probe_remote(struct platform_device *pdev,
 static void meson_drv_shutdown(struct platform_device *pdev)
 {
 	struct meson_drm *priv = dev_get_drvdata(&pdev->dev);
-	struct drm_device *drm = priv->drm;
 
-	DRM_DEBUG_DRIVER("\n");
-	drm_kms_helper_poll_fini(drm);
-	drm_atomic_helper_shutdown(drm);
+	if (!priv)
+		return;
+
+	drm_kms_helper_poll_fini(priv->drm);
+	drm_atomic_helper_shutdown(priv->drm);
 }
 
 static int meson_drv_probe(struct platform_device *pdev)

commit 1cfca6c32c2a6c41370010fcc4067e2d8dcfa02b
Author: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>
Date:   Tue May 25 23:32:35 2021 -0400

    NFSv4: Fix v4.0/v4.1 SEEK_DATA return -ENOTSUPP when set NFS_V4_2 config
    
    commit e67afa7ee4a59584d7253e45d7f63b9528819a13 upstream.
    
    Since commit bdcc2cd14e4e ("NFSv4.2: handle NFS-specific llseek errors"),
    nfs42_proc_llseek would return -EOPNOTSUPP rather than -ENOTSUPP when
    SEEK_DATA on NFSv4.0/v4.1.
    
    This will lead xfstests generic/285 not run on NFSv4.0/v4.1 when set the
    CONFIG_NFS_V4_2, rather than run failed.
    
    Fixes: bdcc2cd14e4e ("NFSv4.2: handle NFS-specific llseek errors")
    Cc: <stable.vger.kernel.org> # 4.2
    Signed-off-by: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c
index 75d3cf86f172..e053a883d08d 100644
--- a/fs/nfs/nfs4file.c
+++ b/fs/nfs/nfs4file.c
@@ -148,7 +148,7 @@ static loff_t nfs4_file_llseek(struct file *filep, loff_t offset, int whence)
 	case SEEK_HOLE:
 	case SEEK_DATA:
 		ret = nfs42_proc_llseek(filep, offset, whence);
-		if (ret != -ENOTSUPP)
+		if (ret != -EOPNOTSUPP)
 			return ret;
 		/* Fall through */
 	default:

commit 40f139a6d50c232c0d1fd1c5e65a845c62db0ede
Author: Trond Myklebust <trond.myklebust@hammerspace.com>
Date:   Tue May 25 10:40:12 2021 -0400

    NFS: Don't corrupt the value of pg_bytes_written in nfs_do_recoalesce()
    
    commit 0d0ea309357dea0d85a82815f02157eb7fcda39f upstream.
    
    The value of mirror->pg_bytes_written should only be updated after a
    successful attempt to flush out the requests on the list.
    
    Fixes: a7d42ddb3099 ("nfs: add mirroring support to pgio layer")
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c
index 2c7d76b4c5e1..a9e1bcdd9394 100644
--- a/fs/nfs/pagelist.c
+++ b/fs/nfs/pagelist.c
@@ -987,17 +987,16 @@ static void nfs_pageio_doio(struct nfs_pageio_descriptor *desc)
 {
 	struct nfs_pgio_mirror *mirror = nfs_pgio_current_mirror(desc);
 
-
 	if (!list_empty(&mirror->pg_list)) {
 		int error = desc->pg_ops->pg_doio(desc);
 		if (error < 0)
 			desc->pg_error = error;
-		else
+		if (list_empty(&mirror->pg_list)) {
 			mirror->pg_bytes_written += mirror->pg_count;
-	}
-	if (list_empty(&mirror->pg_list)) {
-		mirror->pg_count = 0;
-		mirror->pg_base = 0;
+			mirror->pg_count = 0;
+			mirror->pg_base = 0;
+			mirror->pg_recoalesce = 0;
+		}
 	}
 }
 
@@ -1095,7 +1094,6 @@ static int nfs_do_recoalesce(struct nfs_pageio_descriptor *desc)
 
 	do {
 		list_splice_init(&mirror->pg_list, &head);
-		mirror->pg_bytes_written -= mirror->pg_count;
 		mirror->pg_count = 0;
 		mirror->pg_base = 0;
 		mirror->pg_recoalesce = 0;

commit 945ebef997227ca8c20bad7f8a8358c8ee57a84a
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Tue May 11 11:49:42 2021 +0300

    NFS: fix an incorrect limit in filelayout_decode_layout()
    
    commit 769b01ea68b6c49dc3cde6adf7e53927dacbd3a8 upstream.
    
    The "sizeof(struct nfs_fh)" is two bytes too large and could lead to
    memory corruption.  It should be NFS_MAXFHSIZE because that's the size
    of the ->data[] buffer.
    
    I reversed the size of the arguments to put the variable on the left.
    
    Fixes: 16b374ca439f ("NFSv4.1: pnfs: filelayout: add driver's LAYOUTGET and GETDEVICEINFO infrastructure")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/nfs/filelayout/filelayout.c b/fs/nfs/filelayout/filelayout.c
index 2478a69da0f0..e8e825497cbd 100644
--- a/fs/nfs/filelayout/filelayout.c
+++ b/fs/nfs/filelayout/filelayout.c
@@ -717,7 +717,7 @@ filelayout_decode_layout(struct pnfs_layout_hdr *flo,
 		if (unlikely(!p))
 			goto out_err;
 		fl->fh_array[i]->size = be32_to_cpup(p++);
-		if (sizeof(struct nfs_fh) < fl->fh_array[i]->size) {
+		if (fl->fh_array[i]->size > NFS_MAXFHSIZE) {
 			printk(KERN_ERR "NFS: Too big fh %d received %d\n",
 			       i, fl->fh_array[i]->size);
 			goto out_err;

commit f8be26b9950710fe50fb45358df5bd01ad18efb7
Author: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
Date:   Tue Apr 13 13:21:03 2021 -0300

    Bluetooth: cmtp: fix file refcount when cmtp_attach_device fails
    
    commit 8da3a0b87f4f1c3a3bbc4bfb78cf68476e97d183 upstream.
    
    When cmtp_attach_device fails, cmtp_add_connection returns the error value
    which leads to the caller to doing fput through sockfd_put. But
    cmtp_session kthread, which is stopped in this path will also call fput,
    leading to a potential refcount underflow or a use-after-free.
    
    Add a refcount before we signal the kthread to stop. The kthread will try
    to grab the cmtp_session_sem mutex before doing the fput, which is held
    when get_file is called, so there should be no races there.
    
    Reported-by: Ryota Shiga
    Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/bluetooth/cmtp/core.c b/net/bluetooth/cmtp/core.c
index 7f26a5a19ff6..9873684a9d8f 100644
--- a/net/bluetooth/cmtp/core.c
+++ b/net/bluetooth/cmtp/core.c
@@ -391,6 +391,11 @@ int cmtp_add_connection(struct cmtp_connadd_req *req, struct socket *sock)
 	if (!(session->flags & BIT(CMTP_LOOPBACK))) {
 		err = cmtp_attach_device(session);
 		if (err < 0) {
+			/* Caller will call fput in case of failure, and so
+			 * will cmtp_session kthread.
+			 */
+			get_file(session->sock->file);
+
 			atomic_inc(&session->terminate);
 			wake_up_interruptible(sk_sleep(session->sock->sk));
 			up_write(&cmtp_session_sem);

commit c4b70e0d2acd019800b72b954012ed2fc3c4fef6
Author: Lukas Wunner <lukas@wunner.de>
Date:   Mon Dec 7 09:17:14 2020 +0100

    spi: mt7621: Don't leak SPI master in probe error path
    
    commit 46b5c4fb87ce8211e0f9b0383dbde72c3652d2ba upstream.
    
    If the calls to device_reset() or devm_spi_register_controller() fail on
    probe of the MediaTek MT7621 SPI driver, the spi_controller struct is
    erroneously not freed.  Fix by switching over to the new
    devm_spi_alloc_master() helper.
    
    Additionally, there's an ordering issue in mt7621_spi_remove() wherein
    the spi_controller is unregistered after disabling the SYS clock.
    The correct order is to call spi_unregister_controller() *before* this
    teardown step because bus accesses may still be ongoing until that
    function returns.
    
    All of these bugs have existed since the driver was first introduced,
    so it seems fair to fix them together in a single commit.
    
    Fixes: 1ab7f2a43558 ("staging: mt7621-spi: add mt7621 support")
    Signed-off-by: Lukas Wunner <lukas@wunner.de>
    Reviewed-by: Stefan Roese <sr@denx.de>
    Cc: <stable@vger.kernel.org> # v4.17+: 5e844cc37a5c: spi: Introduce device-managed SPI controller allocation
    Cc: <stable@vger.kernel.org> # v4.17+
    Link: https://lore.kernel.org/r/72b680796149f5fcda0b3f530ffb7ee73b04f224.1607286887.git.lukas@wunner.de
    Signed-off-by: Mark Brown <broonie@kernel.org>
    [lukas: backport to v4.19.192]
    Signed-off-by: Lukas Wunner <lukas@wunner.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/staging/mt7621-spi/spi-mt7621.c b/drivers/staging/mt7621-spi/spi-mt7621.c
index ebfbe5ee479a..75ed48f60c8c 100644
--- a/drivers/staging/mt7621-spi/spi-mt7621.c
+++ b/drivers/staging/mt7621-spi/spi-mt7621.c
@@ -452,7 +452,7 @@ static int mt7621_spi_probe(struct platform_device *pdev)
 	if (status)
 		return status;
 
-	master = spi_alloc_master(&pdev->dev, sizeof(*rs));
+	master = devm_spi_alloc_master(&pdev->dev, sizeof(*rs));
 	if (master == NULL) {
 		dev_info(&pdev->dev, "master allocation failed\n");
 		clk_disable_unprepare(clk);
@@ -502,8 +502,8 @@ static int mt7621_spi_remove(struct platform_device *pdev)
 	master = dev_get_drvdata(&pdev->dev);
 	rs = spi_master_get_devdata(master);
 
-	clk_disable(rs->clk);
 	spi_unregister_master(master);
+	clk_disable_unprepare(rs->clk);
 
 	return 0;
 }

commit bea17822847f2ecd51d2f5d2ff465df8c163adcb
Author: Lukas Wunner <lukas@wunner.de>
Date:   Mon Dec 7 09:17:13 2020 +0100

    spi: mt7621: Disable clock in probe error path
    
    commit 24f7033405abe195224ec793dbc3d7a27dec0b98 upstream.
    
    Commit 702b15cb9712 ("spi: mt7621: fix missing clk_disable_unprepare()
    on error in mt7621_spi_probe") sought to disable the SYS clock on probe
    errors, but only did so for 2 of 3 potentially failing calls:  The clock
    needs to be disabled on failure of devm_spi_register_controller() as
    well.
    
    Moreover, the commit purports to fix a bug in commit cbd66c626e16 ("spi:
    mt7621: Move SPI driver out of staging") but in reality the bug has
    existed since the driver was first introduced.
    
    Fixes: 1ab7f2a43558 ("staging: mt7621-spi: add mt7621 support")
    Signed-off-by: Lukas Wunner <lukas@wunner.de>
    Cc: <stable@vger.kernel.org> # v4.17+: 702b15cb9712: spi: mt7621: fix missing clk_disable_unprepare() on error in mt7621_spi_probe
    Cc: <stable@vger.kernel.org> # v4.17+
    Cc: Qinglang Miao <miaoqinglang@huawei.com>
    Link: https://lore.kernel.org/r/36ad42760087952fb7c10aae7d2628547c26a7ec.1607286887.git.lukas@wunner.de
    Signed-off-by: Mark Brown <broonie@kernel.org>
    [lukas: backport to v4.19.192]
    Signed-off-by: Lukas Wunner <lukas@wunner.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/staging/mt7621-spi/spi-mt7621.c b/drivers/staging/mt7621-spi/spi-mt7621.c
index 33c747bc8320..ebfbe5ee479a 100644
--- a/drivers/staging/mt7621-spi/spi-mt7621.c
+++ b/drivers/staging/mt7621-spi/spi-mt7621.c
@@ -487,7 +487,11 @@ static int mt7621_spi_probe(struct platform_device *pdev)
 
 	mt7621_spi_reset(rs, 0);
 
-	return spi_register_master(master);
+	ret = spi_register_master(master);
+	if (ret)
+		clk_disable_unprepare(clk);
+
+	return ret;
 }
 
 static int mt7621_spi_remove(struct platform_device *pdev)

commit 992957c2dbbe1bae4915d6fc938a82323405c944
Author: Lukas Wunner <lukas@wunner.de>
Date:   Mon Dec 7 09:17:09 2020 +0100

    spi: gpio: Don't leak SPI master in probe error path
    
    commit 7174dc655ef0578877b0b4598e69619d2be28b4d upstream.
    
    If the call to devm_spi_register_master() fails on probe of the GPIO SPI
    driver, the spi_master struct is erroneously not freed:
    
    After allocating the spi_master, its reference count is 1.  The driver
    unconditionally decrements the reference count on unbind using a devm
    action.  Before calling devm_spi_register_master(), the driver
    unconditionally increments the reference count because on success,
    that function will decrement the reference count on unbind.  However on
    failure, devm_spi_register_master() does *not* decrement the reference
    count, so the spi_master is leaked.
    
    The issue was introduced by commits 8b797490b4db ("spi: gpio: Make sure
    spi_master_put() is called in every error path") and 79567c1a321e ("spi:
    gpio: Use devm_spi_register_master()"), which sought to plug leaks
    introduced by 9b00bc7b901f ("spi: spi-gpio: Rewrite to use GPIO
    descriptors") but missed this remaining leak.
    
    The situation was later aggravated by commit d3b0ffa1d75d ("spi: gpio:
    prevent memory leak in spi_gpio_probe"), which introduced a
    use-after-free because it releases a reference on the spi_master if
    devm_add_action_or_reset() fails even though the function already
    does that.
    
    Fix by switching over to the new devm_spi_alloc_master() helper.
    
    Fixes: 9b00bc7b901f ("spi: spi-gpio: Rewrite to use GPIO descriptors")
    Signed-off-by: Lukas Wunner <lukas@wunner.de>
    Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
    Cc: <stable@vger.kernel.org> # v4.17+: 5e844cc37a5c: spi: Introduce device-managed SPI controller allocation
    Cc: <stable@vger.kernel.org> # v5.1-: 8b797490b4db: spi: gpio: Make sure spi_master_put() is called in every error path
    Cc: <stable@vger.kernel.org> # v5.1-: 45beec351998: spi: bitbang: Introduce spi_bitbang_init()
    Cc: <stable@vger.kernel.org> # v5.1-: 79567c1a321e: spi: gpio: Use devm_spi_register_master()
    Cc: <stable@vger.kernel.org> # v5.4-: d3b0ffa1d75d: spi: gpio: prevent memory leak in spi_gpio_probe
    Cc: <stable@vger.kernel.org> # v4.17+
    Cc: Navid Emamdoost <navid.emamdoost@gmail.com>
    Cc: Andrey Smirnov <andrew.smirnov@gmail.com>
    Link: https://lore.kernel.org/r/86eaed27431c3d709e3748eb76ceecbfc790dd37.1607286887.git.lukas@wunner.de
    Signed-off-by: Mark Brown <broonie@kernel.org>
    [lukas: backport to v4.19.192]
    Signed-off-by: Lukas Wunner <lukas@wunner.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/spi/spi-gpio.c b/drivers/spi/spi-gpio.c
index 77838d8fd9bb..341d2953d7fc 100644
--- a/drivers/spi/spi-gpio.c
+++ b/drivers/spi/spi-gpio.c
@@ -382,7 +382,7 @@ static int spi_gpio_probe(struct platform_device *pdev)
 		return -ENODEV;
 #endif
 
-	master = spi_alloc_master(&pdev->dev, sizeof(*spi_gpio));
+	master = devm_spi_alloc_master(&pdev->dev, sizeof(*spi_gpio));
 	if (!master)
 		return -ENOMEM;
 
@@ -438,11 +438,7 @@ static int spi_gpio_probe(struct platform_device *pdev)
 	}
 	spi_gpio->bitbang.setup_transfer = spi_bitbang_setup_transfer;
 
-	status = spi_bitbang_start(&spi_gpio->bitbang);
-	if (status)
-		spi_master_put(master);
-
-	return status;
+	return spi_bitbang_start(&spi_gpio->bitbang);
 }
 
 static int spi_gpio_remove(struct platform_device *pdev)

commit a9d5ac78e7ca194d8fc570d26640395ffd6e9367
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Fri May 28 13:38:10 2021 +0300

    bpf: No need to simulate speculative domain for immediates
    
    commit a7036191277f9fa68d92f2071ddc38c09b1e5ee5 upstream
    
    In 801c6058d14a ("bpf: Fix leakage of uninitialized bpf stack under
    speculation") we replaced masking logic with direct loads of immediates
    if the register is a known constant. Given in this case we do not apply
    any masking, there is also no reason for the operation to be truncated
    under the speculative domain.
    
    Therefore, there is also zero reason for the verifier to branch-off and
    simulate this case, it only needs to do it for unknown but bounded scalars.
    As a side-effect, this also enables few test cases that were previously
    rejected due to simulation under zero truncation.
    
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: Piotr Krysiuk <piotras@gmail.com>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index a235342507a8..1f4c88ce58de 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -2874,8 +2874,12 @@ static int sanitize_ptr_alu(struct bpf_verifier_env *env,
 	/* If we're in commit phase, we're done here given we already
 	 * pushed the truncated dst_reg into the speculative verification
 	 * stack.
+	 *
+	 * Also, when register is a known constant, we rewrite register-based
+	 * operation to immediate-based, and thus do not need masking (and as
+	 * a consequence, do not need to simulate the zero-truncation either).
 	 */
-	if (commit_window)
+	if (commit_window || off_is_imm)
 		return 0;
 
 	/* Simulate and find potential out-of-bounds access under

commit 9324bd041d5c0a9c41238d390838778b9387030e
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Fri May 28 13:38:09 2021 +0300

    bpf: Fix mask direction swap upon off reg sign change
    
    commit bb01a1bba579b4b1c5566af24d95f1767859771e upstream
    
    Masking direction as indicated via mask_to_left is considered to be
    calculated once and then used to derive pointer limits. Thus, this
    needs to be placed into bpf_sanitize_info instead so we can pass it
    to sanitize_ptr_alu() call after the pointer move. Piotr noticed a
    corner case where the off reg causes masking direction change which
    then results in an incorrect final aux->alu_limit.
    
    Fixes: 7fedb63a8307 ("bpf: Tighten speculative pointer arithmetic mask")
    Reported-by: Piotr Krysiuk <piotras@gmail.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: Piotr Krysiuk <piotras@gmail.com>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 0066ea8ecdaa..a235342507a8 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -2738,18 +2738,10 @@ enum {
 };
 
 static int retrieve_ptr_limit(const struct bpf_reg_state *ptr_reg,
-			      const struct bpf_reg_state *off_reg,
-			      u32 *alu_limit, u8 opcode)
+			      u32 *alu_limit, bool mask_to_left)
 {
-	bool off_is_neg = off_reg->smin_value < 0;
-	bool mask_to_left = (opcode == BPF_ADD &&  off_is_neg) ||
-			    (opcode == BPF_SUB && !off_is_neg);
 	u32 max = 0, ptr_limit = 0;
 
-	if (!tnum_is_const(off_reg->var_off) &&
-	    (off_reg->smin_value < 0) != (off_reg->smax_value < 0))
-		return REASON_BOUNDS;
-
 	switch (ptr_reg->type) {
 	case PTR_TO_STACK:
 		/* Offset 0 is out-of-bounds, but acceptable start for the
@@ -2817,6 +2809,7 @@ static bool sanitize_needed(u8 opcode)
 
 struct bpf_sanitize_info {
 	struct bpf_insn_aux_data aux;
+	bool mask_to_left;
 };
 
 static int sanitize_ptr_alu(struct bpf_verifier_env *env,
@@ -2848,7 +2841,16 @@ static int sanitize_ptr_alu(struct bpf_verifier_env *env,
 	if (vstate->speculative)
 		goto do_sim;
 
-	err = retrieve_ptr_limit(ptr_reg, off_reg, &alu_limit, opcode);
+	if (!commit_window) {
+		if (!tnum_is_const(off_reg->var_off) &&
+		    (off_reg->smin_value < 0) != (off_reg->smax_value < 0))
+			return REASON_BOUNDS;
+
+		info->mask_to_left = (opcode == BPF_ADD &&  off_is_neg) ||
+				     (opcode == BPF_SUB && !off_is_neg);
+	}
+
+	err = retrieve_ptr_limit(ptr_reg, &alu_limit, info->mask_to_left);
 	if (err < 0)
 		return err;
 

commit 963e62364c8028090b64818ac455fbe40a52579e
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Fri May 28 13:38:08 2021 +0300

    bpf: Wrap aux data inside bpf_sanitize_info container
    
    commit 3d0220f6861d713213b015b582e9f21e5b28d2e0 upstream
    
    Add a container structure struct bpf_sanitize_info which holds
    the current aux info, and update call-sites to sanitize_ptr_alu()
    to pass it in. This is needed for passing in additional state
    later on.
    
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: Piotr Krysiuk <piotras@gmail.com>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index faae834aac49..0066ea8ecdaa 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -2815,15 +2815,19 @@ static bool sanitize_needed(u8 opcode)
 	return opcode == BPF_ADD || opcode == BPF_SUB;
 }
 
+struct bpf_sanitize_info {
+	struct bpf_insn_aux_data aux;
+};
+
 static int sanitize_ptr_alu(struct bpf_verifier_env *env,
 			    struct bpf_insn *insn,
 			    const struct bpf_reg_state *ptr_reg,
 			    const struct bpf_reg_state *off_reg,
 			    struct bpf_reg_state *dst_reg,
-			    struct bpf_insn_aux_data *tmp_aux,
+			    struct bpf_sanitize_info *info,
 			    const bool commit_window)
 {
-	struct bpf_insn_aux_data *aux = commit_window ? cur_aux(env) : tmp_aux;
+	struct bpf_insn_aux_data *aux = commit_window ? cur_aux(env) : &info->aux;
 	struct bpf_verifier_state *vstate = env->cur_state;
 	bool off_is_imm = tnum_is_const(off_reg->var_off);
 	bool off_is_neg = off_reg->smin_value < 0;
@@ -2852,8 +2856,8 @@ static int sanitize_ptr_alu(struct bpf_verifier_env *env,
 		/* In commit phase we narrow the masking window based on
 		 * the observed pointer move after the simulated operation.
 		 */
-		alu_state = tmp_aux->alu_state;
-		alu_limit = abs(tmp_aux->alu_limit - alu_limit);
+		alu_state = info->aux.alu_state;
+		alu_limit = abs(info->aux.alu_limit - alu_limit);
 	} else {
 		alu_state  = off_is_neg ? BPF_ALU_NEG_VALUE : 0;
 		alu_state |= off_is_imm ? BPF_ALU_IMMEDIATE : 0;
@@ -2983,7 +2987,7 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
 	    smin_ptr = ptr_reg->smin_value, smax_ptr = ptr_reg->smax_value;
 	u64 umin_val = off_reg->umin_value, umax_val = off_reg->umax_value,
 	    umin_ptr = ptr_reg->umin_value, umax_ptr = ptr_reg->umax_value;
-	struct bpf_insn_aux_data tmp_aux = {};
+	struct bpf_sanitize_info info = {};
 	u8 opcode = BPF_OP(insn->code);
 	u32 dst = insn->dst_reg;
 	int ret;
@@ -3035,7 +3039,7 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
 
 	if (sanitize_needed(opcode)) {
 		ret = sanitize_ptr_alu(env, insn, ptr_reg, off_reg, dst_reg,
-				       &tmp_aux, false);
+				       &info, false);
 		if (ret < 0)
 			return sanitize_err(env, insn, ret, off_reg, dst_reg);
 	}
@@ -3176,7 +3180,7 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
 		return -EACCES;
 	if (sanitize_needed(opcode)) {
 		ret = sanitize_ptr_alu(env, insn, dst_reg, off_reg, dst_reg,
-				       &tmp_aux, true);
+				       &info, true);
 		if (ret < 0)
 			return sanitize_err(env, insn, ret, off_reg, dst_reg);
 	}

commit bd9df99da9569befff2234b1201ac4e065e363d0
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Fri May 28 13:38:07 2021 +0300

    bpf: Fix leakage of uninitialized bpf stack under speculation
    
    commit 801c6058d14a82179a7ee17a4b532cac6fad067f upstream.
    
    The current implemented mechanisms to mitigate data disclosure under
    speculation mainly address stack and map value oob access from the
    speculative domain. However, Piotr discovered that uninitialized BPF
    stack is not protected yet, and thus old data from the kernel stack,
    potentially including addresses of kernel structures, could still be
    extracted from that 512 bytes large window. The BPF stack is special
    compared to map values since it's not zero initialized for every
    program invocation, whereas map values /are/ zero initialized upon
    their initial allocation and thus cannot leak any prior data in either
    domain. In the non-speculative domain, the verifier ensures that every
    stack slot read must have a prior stack slot write by the BPF program
    to avoid such data leaking issue.
    
    However, this is not enough: for example, when the pointer arithmetic
    operation moves the stack pointer from the last valid stack offset to
    the first valid offset, the sanitation logic allows for any intermediate
    offsets during speculative execution, which could then be used to
    extract any restricted stack content via side-channel.
    
    Given for unprivileged stack pointer arithmetic the use of unknown
    but bounded scalars is generally forbidden, we can simply turn the
    register-based arithmetic operation into an immediate-based arithmetic
    operation without the need for masking. This also gives the benefit
    of reducing the needed instructions for the operation. Given after
    the work in 7fedb63a8307 ("bpf: Tighten speculative pointer arithmetic
    mask"), the aux->alu_limit already holds the final immediate value for
    the offset register with the known scalar. Thus, a simple mov of the
    immediate to AX register with using AX as the source for the original
    instruction is sufficient and possible now in this case.
    
    Reported-by: Piotr Krysiuk <piotras@gmail.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Tested-by: Piotr Krysiuk <piotras@gmail.com>
    Reviewed-by: Piotr Krysiuk <piotras@gmail.com>
    Reviewed-by: John Fastabend <john.fastabend@gmail.com>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h
index 91393724e933..1c8517320ea6 100644
--- a/include/linux/bpf_verifier.h
+++ b/include/linux/bpf_verifier.h
@@ -144,10 +144,11 @@ struct bpf_verifier_state_list {
 };
 
 /* Possible states for alu_state member. */
-#define BPF_ALU_SANITIZE_SRC		1U
-#define BPF_ALU_SANITIZE_DST		2U
+#define BPF_ALU_SANITIZE_SRC		(1U << 0)
+#define BPF_ALU_SANITIZE_DST		(1U << 1)
 #define BPF_ALU_NEG_VALUE		(1U << 2)
 #define BPF_ALU_NON_POINTER		(1U << 3)
+#define BPF_ALU_IMMEDIATE		(1U << 4)
 #define BPF_ALU_SANITIZE		(BPF_ALU_SANITIZE_SRC | \
 					 BPF_ALU_SANITIZE_DST)
 
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 908251977bef..faae834aac49 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -2825,6 +2825,7 @@ static int sanitize_ptr_alu(struct bpf_verifier_env *env,
 {
 	struct bpf_insn_aux_data *aux = commit_window ? cur_aux(env) : tmp_aux;
 	struct bpf_verifier_state *vstate = env->cur_state;
+	bool off_is_imm = tnum_is_const(off_reg->var_off);
 	bool off_is_neg = off_reg->smin_value < 0;
 	bool ptr_is_dst_reg = ptr_reg == dst_reg;
 	u8 opcode = BPF_OP(insn->code);
@@ -2855,6 +2856,7 @@ static int sanitize_ptr_alu(struct bpf_verifier_env *env,
 		alu_limit = abs(tmp_aux->alu_limit - alu_limit);
 	} else {
 		alu_state  = off_is_neg ? BPF_ALU_NEG_VALUE : 0;
+		alu_state |= off_is_imm ? BPF_ALU_IMMEDIATE : 0;
 		alu_state |= ptr_is_dst_reg ?
 			     BPF_ALU_SANITIZE_SRC : BPF_ALU_SANITIZE_DST;
 	}
@@ -6172,7 +6174,7 @@ static int fixup_bpf_calls(struct bpf_verifier_env *env)
 			const u8 code_sub = BPF_ALU64 | BPF_SUB | BPF_X;
 			struct bpf_insn insn_buf[16];
 			struct bpf_insn *patch = &insn_buf[0];
-			bool issrc, isneg;
+			bool issrc, isneg, isimm;
 			u32 off_reg;
 
 			aux = &env->insn_aux_data[i + delta];
@@ -6183,16 +6185,21 @@ static int fixup_bpf_calls(struct bpf_verifier_env *env)
 			isneg = aux->alu_state & BPF_ALU_NEG_VALUE;
 			issrc = (aux->alu_state & BPF_ALU_SANITIZE) ==
 				BPF_ALU_SANITIZE_SRC;
+			isimm = aux->alu_state & BPF_ALU_IMMEDIATE;
 
 			off_reg = issrc ? insn->src_reg : insn->dst_reg;
-			if (isneg)
-				*patch++ = BPF_ALU64_IMM(BPF_MUL, off_reg, -1);
-			*patch++ = BPF_MOV32_IMM(BPF_REG_AX, aux->alu_limit);
-			*patch++ = BPF_ALU64_REG(BPF_SUB, BPF_REG_AX, off_reg);
-			*patch++ = BPF_ALU64_REG(BPF_OR, BPF_REG_AX, off_reg);
-			*patch++ = BPF_ALU64_IMM(BPF_NEG, BPF_REG_AX, 0);
-			*patch++ = BPF_ALU64_IMM(BPF_ARSH, BPF_REG_AX, 63);
-			*patch++ = BPF_ALU64_REG(BPF_AND, BPF_REG_AX, off_reg);
+			if (isimm) {
+				*patch++ = BPF_MOV32_IMM(BPF_REG_AX, aux->alu_limit);
+			} else {
+				if (isneg)
+					*patch++ = BPF_ALU64_IMM(BPF_MUL, off_reg, -1);
+				*patch++ = BPF_MOV32_IMM(BPF_REG_AX, aux->alu_limit);
+				*patch++ = BPF_ALU64_REG(BPF_SUB, BPF_REG_AX, off_reg);
+				*patch++ = BPF_ALU64_REG(BPF_OR, BPF_REG_AX, off_reg);
+				*patch++ = BPF_ALU64_IMM(BPF_NEG, BPF_REG_AX, 0);
+				*patch++ = BPF_ALU64_IMM(BPF_ARSH, BPF_REG_AX, 63);
+				*patch++ = BPF_ALU64_REG(BPF_AND, BPF_REG_AX, off_reg);
+			}
 			if (!issrc)
 				*patch++ = BPF_MOV64_REG(insn->dst_reg, insn->src_reg);
 			insn->src_reg = BPF_REG_AX;
@@ -6200,7 +6207,7 @@ static int fixup_bpf_calls(struct bpf_verifier_env *env)
 				insn->code = insn->code == code_add ?
 					     code_sub : code_add;
 			*patch++ = *insn;
-			if (issrc && isneg)
+			if (issrc && isneg && !isimm)
 				*patch++ = BPF_ALU64_IMM(BPF_MUL, off_reg, -1);
 			cnt = patch - insn_buf;
 

commit 138b0ec1064c8f154a32297458e562591a94773f
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Fri May 28 13:38:06 2021 +0300

    bpf: Update selftests to reflect new error states
    
    commit d7a5091351756d0ae8e63134313c455624e36a13 upstream
    
    Update various selftest error messages:
    
     * The 'Rx tried to sub from different maps, paths, or prohibited types'
       is reworked into more specific/differentiated error messages for better
       guidance.
    
     * The change into 'value -4294967168 makes map_value pointer be out of
       bounds' is due to moving the mixed bounds check into the speculation
       handling and thus occuring slightly later than above mentioned sanity
       check.
    
     * The change into 'math between map_value pointer and register with
       unbounded min value' is similarly due to register sanity check coming
       before the mixed bounds check.
    
     * The case of 'map access: known scalar += value_ptr from different maps'
       now loads fine given masks are the same from the different paths (despite
       max map value size being different).
    
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: John Fastabend <john.fastabend@gmail.com>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    [OP: 4.19 backport, account for split test_verifier and
    different / missing tests]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index 662d6acaaab0..e1e4b6ab83f7 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -2873,7 +2873,7 @@ static struct bpf_test tests[] = {
 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, -8),
 			BPF_EXIT_INSN(),
 		},
-		.errstr_unpriv = "R1 tried to add from different maps, paths, or prohibited types",
+		.errstr_unpriv = "R1 stack pointer arithmetic goes out of range",
 		.result_unpriv = REJECT,
 		.result = ACCEPT,
 	},
@@ -7501,7 +7501,6 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
-		.errstr_unpriv = "R1 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7526,7 +7525,6 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
-		.errstr_unpriv = "R1 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7553,7 +7551,6 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
-		.errstr_unpriv = "R8 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7579,7 +7576,6 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
-		.errstr_unpriv = "R8 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7628,7 +7624,6 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
-		.errstr_unpriv = "R1 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7700,7 +7695,6 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
-		.errstr_unpriv = "R1 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7752,7 +7746,6 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
-		.errstr_unpriv = "R1 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7780,7 +7773,6 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
-		.errstr_unpriv = "R1 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7807,7 +7799,6 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
-		.errstr_unpriv = "R1 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7837,7 +7828,6 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
-		.errstr_unpriv = "R7 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7868,7 +7858,6 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 4 },
 		.errstr = "unbounded min value",
-		.errstr_unpriv = "R1 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7897,7 +7886,6 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
-		.errstr_unpriv = "R1 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 		.result_unpriv = REJECT,
 	},
@@ -9799,7 +9787,7 @@ static struct bpf_test tests[] = {
 			BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
 			BPF_EXIT_INSN(),
 		},
-		.errstr_unpriv = "R0 tried to sub from different maps, paths, or prohibited types",
+		.errstr_unpriv = "R1 has pointer with unsupported alu operation",
 		.errstr = "R0 tried to subtract pointer from scalar",
 		.result = REJECT,
 	},
@@ -9814,7 +9802,7 @@ static struct bpf_test tests[] = {
 			BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0),
 			BPF_EXIT_INSN(),
 		},
-		.errstr_unpriv = "R1 tried to sub from different maps, paths, or prohibited types",
+		.errstr_unpriv = "R1 has pointer with unsupported alu operation",
 		.result_unpriv = REJECT,
 		.result = ACCEPT,
 		.retval = 1,
@@ -9827,22 +9815,23 @@ static struct bpf_test tests[] = {
 			BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
 			BPF_EXIT_INSN(),
 		},
-		.errstr_unpriv = "R0 tried to sub from different maps, paths, or prohibited types",
+		.errstr_unpriv = "R1 has pointer with unsupported alu operation",
 		.errstr = "R0 tried to subtract pointer from scalar",
 		.result = REJECT,
 	},
 	{
 		"check deducing bounds from const, 4",
 		.insns = {
+			BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
 			BPF_MOV64_IMM(BPF_REG_0, 0),
 			BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 0, 1),
 			BPF_EXIT_INSN(),
 			BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1),
 			BPF_EXIT_INSN(),
-			BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0),
+			BPF_ALU64_REG(BPF_SUB, BPF_REG_6, BPF_REG_0),
 			BPF_EXIT_INSN(),
 		},
-		.errstr_unpriv = "R1 tried to sub from different maps, paths, or prohibited types",
+		.errstr_unpriv = "R6 has pointer with unsupported alu operation",
 		.result_unpriv = REJECT,
 		.result = ACCEPT,
 	},
@@ -9854,7 +9843,7 @@ static struct bpf_test tests[] = {
 			BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
 			BPF_EXIT_INSN(),
 		},
-		.errstr_unpriv = "R0 tried to sub from different maps, paths, or prohibited types",
+		.errstr_unpriv = "R1 has pointer with unsupported alu operation",
 		.errstr = "R0 tried to subtract pointer from scalar",
 		.result = REJECT,
 	},
@@ -9867,7 +9856,7 @@ static struct bpf_test tests[] = {
 			BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
 			BPF_EXIT_INSN(),
 		},
-		.errstr_unpriv = "R0 tried to sub from different maps, paths, or prohibited types",
+		.errstr_unpriv = "R1 has pointer with unsupported alu operation",
 		.errstr = "R0 tried to subtract pointer from scalar",
 		.result = REJECT,
 	},
@@ -9881,7 +9870,7 @@ static struct bpf_test tests[] = {
 				    offsetof(struct __sk_buff, mark)),
 			BPF_EXIT_INSN(),
 		},
-		.errstr_unpriv = "R1 tried to sub from different maps, paths, or prohibited types",
+		.errstr_unpriv = "R1 has pointer with unsupported alu operation",
 		.errstr = "dereference of modified ctx ptr",
 		.result = REJECT,
 	},
@@ -9895,7 +9884,7 @@ static struct bpf_test tests[] = {
 				    offsetof(struct __sk_buff, mark)),
 			BPF_EXIT_INSN(),
 		},
-		.errstr_unpriv = "R1 tried to add from different maps, paths, or prohibited types",
+		.errstr_unpriv = "R1 has pointer with unsupported alu operation",
 		.errstr = "dereference of modified ctx ptr",
 		.result = REJECT,
 	},
@@ -9907,7 +9896,7 @@ static struct bpf_test tests[] = {
 			BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
 			BPF_EXIT_INSN(),
 		},
-		.errstr_unpriv = "R0 tried to sub from different maps, paths, or prohibited types",
+		.errstr_unpriv = "R1 has pointer with unsupported alu operation",
 		.errstr = "R0 tried to subtract pointer from scalar",
 		.result = REJECT,
 	},

commit 45bfdd767e235a5f20d43d6abbdfb267d372430a
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Fri May 28 13:38:05 2021 +0300

    bpf: Tighten speculative pointer arithmetic mask
    
    commit 7fedb63a8307dda0ec3b8969a3b233a1dd7ea8e0 upstream.
    
    This work tightens the offset mask we use for unprivileged pointer arithmetic
    in order to mitigate a corner case reported by Piotr and Benedict where in
    the speculative domain it is possible to advance, for example, the map value
    pointer by up to value_size-1 out-of-bounds in order to leak kernel memory
    via side-channel to user space.
    
    Before this change, the computed ptr_limit for retrieve_ptr_limit() helper
    represents largest valid distance when moving pointer to the right or left
    which is then fed as aux->alu_limit to generate masking instructions against
    the offset register. After the change, the derived aux->alu_limit represents
    the largest potential value of the offset register which we mask against which
    is just a narrower subset of the former limit.
    
    For minimal complexity, we call sanitize_ptr_alu() from 2 observation points
    in adjust_ptr_min_max_vals(), that is, before and after the simulated alu
    operation. In the first step, we retieve the alu_state and alu_limit before
    the operation as well as we branch-off a verifier path and push it to the
    verification stack as we did before which checks the dst_reg under truncation,
    in other words, when the speculative domain would attempt to move the pointer
    out-of-bounds.
    
    In the second step, we retrieve the new alu_limit and calculate the absolute
    distance between both. Moreover, we commit the alu_state and final alu_limit
    via update_alu_sanitation_state() to the env's instruction aux data, and bail
    out from there if there is a mismatch due to coming from different verification
    paths with different states.
    
    Reported-by: Piotr Krysiuk <piotras@gmail.com>
    Reported-by: Benedict Schlueter <benedict.schlueter@rub.de>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: John Fastabend <john.fastabend@gmail.com>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    Tested-by: Benedict Schlueter <benedict.schlueter@rub.de>
    [fllinden@amazon.com: backported to 5.4]
    Signed-off-by: Frank van der Linden <fllinden@amazon.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    [OP: backport to 4.19]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 094f70876923..908251977bef 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -2744,7 +2744,7 @@ static int retrieve_ptr_limit(const struct bpf_reg_state *ptr_reg,
 	bool off_is_neg = off_reg->smin_value < 0;
 	bool mask_to_left = (opcode == BPF_ADD &&  off_is_neg) ||
 			    (opcode == BPF_SUB && !off_is_neg);
-	u32 off, max = 0, ptr_limit = 0;
+	u32 max = 0, ptr_limit = 0;
 
 	if (!tnum_is_const(off_reg->var_off) &&
 	    (off_reg->smin_value < 0) != (off_reg->smax_value < 0))
@@ -2753,23 +2753,18 @@ static int retrieve_ptr_limit(const struct bpf_reg_state *ptr_reg,
 	switch (ptr_reg->type) {
 	case PTR_TO_STACK:
 		/* Offset 0 is out-of-bounds, but acceptable start for the
-		 * left direction, see BPF_REG_FP.
+		 * left direction, see BPF_REG_FP. Also, unknown scalar
+		 * offset where we would need to deal with min/max bounds is
+		 * currently prohibited for unprivileged.
 		 */
 		max = MAX_BPF_STACK + mask_to_left;
-		off = ptr_reg->off + ptr_reg->var_off.value;
-		if (mask_to_left)
-			ptr_limit = MAX_BPF_STACK + off;
-		else
-			ptr_limit = -off - 1;
+		ptr_limit = -(ptr_reg->var_off.value + ptr_reg->off);
 		break;
 	case PTR_TO_MAP_VALUE:
 		max = ptr_reg->map_ptr->value_size;
-		if (mask_to_left) {
-			ptr_limit = ptr_reg->umax_value + ptr_reg->off;
-		} else {
-			off = ptr_reg->smin_value + ptr_reg->off;
-			ptr_limit = ptr_reg->map_ptr->value_size - off - 1;
-		}
+		ptr_limit = (mask_to_left ?
+			     ptr_reg->smin_value :
+			     ptr_reg->umax_value) + ptr_reg->off;
 		break;
 	default:
 		return REASON_TYPE;
@@ -2824,10 +2819,12 @@ static int sanitize_ptr_alu(struct bpf_verifier_env *env,
 			    struct bpf_insn *insn,
 			    const struct bpf_reg_state *ptr_reg,
 			    const struct bpf_reg_state *off_reg,
-			    struct bpf_reg_state *dst_reg)
+			    struct bpf_reg_state *dst_reg,
+			    struct bpf_insn_aux_data *tmp_aux,
+			    const bool commit_window)
 {
+	struct bpf_insn_aux_data *aux = commit_window ? cur_aux(env) : tmp_aux;
 	struct bpf_verifier_state *vstate = env->cur_state;
-	struct bpf_insn_aux_data *aux = cur_aux(env);
 	bool off_is_neg = off_reg->smin_value < 0;
 	bool ptr_is_dst_reg = ptr_reg == dst_reg;
 	u8 opcode = BPF_OP(insn->code);
@@ -2846,18 +2843,33 @@ static int sanitize_ptr_alu(struct bpf_verifier_env *env,
 	if (vstate->speculative)
 		goto do_sim;
 
-	alu_state  = off_is_neg ? BPF_ALU_NEG_VALUE : 0;
-	alu_state |= ptr_is_dst_reg ?
-		     BPF_ALU_SANITIZE_SRC : BPF_ALU_SANITIZE_DST;
-
 	err = retrieve_ptr_limit(ptr_reg, off_reg, &alu_limit, opcode);
 	if (err < 0)
 		return err;
 
+	if (commit_window) {
+		/* In commit phase we narrow the masking window based on
+		 * the observed pointer move after the simulated operation.
+		 */
+		alu_state = tmp_aux->alu_state;
+		alu_limit = abs(tmp_aux->alu_limit - alu_limit);
+	} else {
+		alu_state  = off_is_neg ? BPF_ALU_NEG_VALUE : 0;
+		alu_state |= ptr_is_dst_reg ?
+			     BPF_ALU_SANITIZE_SRC : BPF_ALU_SANITIZE_DST;
+	}
+
 	err = update_alu_sanitation_state(aux, alu_state, alu_limit);
 	if (err < 0)
 		return err;
 do_sim:
+	/* If we're in commit phase, we're done here given we already
+	 * pushed the truncated dst_reg into the speculative verification
+	 * stack.
+	 */
+	if (commit_window)
+		return 0;
+
 	/* Simulate and find potential out-of-bounds access under
 	 * speculative execution from truncation as a result of
 	 * masking when off was not within expected range. If off
@@ -2969,6 +2981,7 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
 	    smin_ptr = ptr_reg->smin_value, smax_ptr = ptr_reg->smax_value;
 	u64 umin_val = off_reg->umin_value, umax_val = off_reg->umax_value,
 	    umin_ptr = ptr_reg->umin_value, umax_ptr = ptr_reg->umax_value;
+	struct bpf_insn_aux_data tmp_aux = {};
 	u8 opcode = BPF_OP(insn->code);
 	u32 dst = insn->dst_reg;
 	int ret;
@@ -3018,12 +3031,15 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
 	    !check_reg_sane_offset(env, ptr_reg, ptr_reg->type))
 		return -EINVAL;
 
-	switch (opcode) {
-	case BPF_ADD:
-		ret = sanitize_ptr_alu(env, insn, ptr_reg, off_reg, dst_reg);
+	if (sanitize_needed(opcode)) {
+		ret = sanitize_ptr_alu(env, insn, ptr_reg, off_reg, dst_reg,
+				       &tmp_aux, false);
 		if (ret < 0)
 			return sanitize_err(env, insn, ret, off_reg, dst_reg);
+	}
 
+	switch (opcode) {
+	case BPF_ADD:
 		/* We can take a fixed offset as long as it doesn't overflow
 		 * the s32 'off' field
 		 */
@@ -3074,10 +3090,6 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
 		}
 		break;
 	case BPF_SUB:
-		ret = sanitize_ptr_alu(env, insn, ptr_reg, off_reg, dst_reg);
-		if (ret < 0)
-			return sanitize_err(env, insn, ret, off_reg, dst_reg);
-
 		if (dst_reg == off_reg) {
 			/* scalar -= pointer.  Creates an unknown scalar */
 			verbose(env, "R%d tried to subtract pointer from scalar\n",
@@ -3160,6 +3172,12 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
 
 	if (sanitize_check_bounds(env, insn, dst_reg) < 0)
 		return -EACCES;
+	if (sanitize_needed(opcode)) {
+		ret = sanitize_ptr_alu(env, insn, dst_reg, off_reg, dst_reg,
+				       &tmp_aux, true);
+		if (ret < 0)
+			return sanitize_err(env, insn, ret, off_reg, dst_reg);
+	}
 
 	return 0;
 }

commit 7d2617351898876e6e51f010f3abe8000226583e
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Fri May 28 13:38:04 2021 +0300

    bpf: Move sanitize_val_alu out of op switch
    
    commit f528819334881fd622fdadeddb3f7edaed8b7c9b upstream.
    
    Add a small sanitize_needed() helper function and move sanitize_val_alu()
    out of the main opcode switch. In upcoming work, we'll move sanitize_ptr_alu()
    as well out of its opcode switch so this helps to streamline both.
    
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: John Fastabend <john.fastabend@gmail.com>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    [fllinden@amazon.com: backported to 5.4]
    Signed-off-by: Frank van der Linden <fllinden@amazon.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index faa2a4c3467d..094f70876923 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -2815,6 +2815,11 @@ static int sanitize_val_alu(struct bpf_verifier_env *env,
 	return update_alu_sanitation_state(aux, BPF_ALU_NON_POINTER, 0);
 }
 
+static bool sanitize_needed(u8 opcode)
+{
+	return opcode == BPF_ADD || opcode == BPF_SUB;
+}
+
 static int sanitize_ptr_alu(struct bpf_verifier_env *env,
 			    struct bpf_insn *insn,
 			    const struct bpf_reg_state *ptr_reg,
@@ -3207,11 +3212,14 @@ static int adjust_scalar_min_max_vals(struct bpf_verifier_env *env,
 		return 0;
 	}
 
-	switch (opcode) {
-	case BPF_ADD:
+	if (sanitize_needed(opcode)) {
 		ret = sanitize_val_alu(env, insn);
 		if (ret < 0)
 			return sanitize_err(env, insn, ret, NULL, NULL);
+	}
+
+	switch (opcode) {
+	case BPF_ADD:
 		if (signed_add_overflows(dst_reg->smin_value, smin_val) ||
 		    signed_add_overflows(dst_reg->smax_value, smax_val)) {
 			dst_reg->smin_value = S64_MIN;
@@ -3231,9 +3239,6 @@ static int adjust_scalar_min_max_vals(struct bpf_verifier_env *env,
 		dst_reg->var_off = tnum_add(dst_reg->var_off, src_reg.var_off);
 		break;
 	case BPF_SUB:
-		ret = sanitize_val_alu(env, insn);
-		if (ret < 0)
-			return sanitize_err(env, insn, ret, NULL, NULL);
 		if (signed_sub_overflows(dst_reg->smin_value, smax_val) ||
 		    signed_sub_overflows(dst_reg->smax_value, smin_val)) {
 			/* Overflow possible, we know nothing */

commit 8827288cb63949f5d79f84feaf2f7baf35d484fd
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Fri May 28 13:38:03 2021 +0300

    bpf: Refactor and streamline bounds check into helper
    
    commit 073815b756c51ba9d8384d924c5d1c03ca3d1ae4 upstream.
    
    Move the bounds check in adjust_ptr_min_max_vals() into a small helper named
    sanitize_check_bounds() in order to simplify the former a bit.
    
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: John Fastabend <john.fastabend@gmail.com>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    [fllinden@amazon.com: backport to 5.4]
    Signed-off-by: Frank van der Linden <fllinden@amazon.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 473b59126f61..faa2a4c3467d 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -2911,6 +2911,41 @@ static int sanitize_err(struct bpf_verifier_env *env,
 	return -EACCES;
 }
 
+static int sanitize_check_bounds(struct bpf_verifier_env *env,
+				 const struct bpf_insn *insn,
+				 const struct bpf_reg_state *dst_reg)
+{
+	u32 dst = insn->dst_reg;
+
+	/* For unprivileged we require that resulting offset must be in bounds
+	 * in order to be able to sanitize access later on.
+	 */
+	if (env->allow_ptr_leaks)
+		return 0;
+
+	switch (dst_reg->type) {
+	case PTR_TO_STACK:
+		if (check_stack_access(env, dst_reg, dst_reg->off +
+				       dst_reg->var_off.value, 1)) {
+			verbose(env, "R%d stack pointer arithmetic goes out of range, "
+				"prohibited for !root\n", dst);
+			return -EACCES;
+		}
+		break;
+	case PTR_TO_MAP_VALUE:
+		if (check_map_access(env, dst, dst_reg->off, 1, false)) {
+			verbose(env, "R%d pointer arithmetic of map value goes out of range, "
+				"prohibited for !root\n", dst);
+			return -EACCES;
+		}
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
 /* Handles arithmetic on a pointer and a scalar: computes new min/max and var_off.
  * Caller should also handle BPF_MOV case separately.
  * If we return -EACCES, caller may want to try again treating pointer as a
@@ -3118,23 +3153,8 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
 	__reg_deduce_bounds(dst_reg);
 	__reg_bound_offset(dst_reg);
 
-	/* For unprivileged we require that resulting offset must be in bounds
-	 * in order to be able to sanitize access later on.
-	 */
-	if (!env->allow_ptr_leaks) {
-		if (dst_reg->type == PTR_TO_MAP_VALUE &&
-		    check_map_access(env, dst, dst_reg->off, 1, false)) {
-			verbose(env, "R%d pointer arithmetic of map value goes out of range, "
-				"prohibited for !root\n", dst);
-			return -EACCES;
-		} else if (dst_reg->type == PTR_TO_STACK &&
-			   check_stack_access(env, dst_reg, dst_reg->off +
-					      dst_reg->var_off.value, 1)) {
-			verbose(env, "R%d stack pointer arithmetic goes out of range, "
-				"prohibited for !root\n", dst);
-			return -EACCES;
-		}
-	}
+	if (sanitize_check_bounds(env, insn, dst_reg) < 0)
+		return -EACCES;
 
 	return 0;
 }

commit 656b3f9ef4471e4ea242a3975c0dfa0051d9f548
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Fri May 28 13:38:02 2021 +0300

    bpf: Improve verifier error messages for users
    
    commit a6aaece00a57fa6f22575364b3903dfbccf5345d upstream
    
    Consolidate all error handling and provide more user-friendly error messages
    from sanitize_ptr_alu() and sanitize_val_alu().
    
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: John Fastabend <john.fastabend@gmail.com>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    [fllinden@amazon.com: backport to 5.4]
    Signed-off-by: Frank van der Linden <fllinden@amazon.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index adc833c6088f..473b59126f61 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -2729,6 +2729,14 @@ static struct bpf_insn_aux_data *cur_aux(struct bpf_verifier_env *env)
 	return &env->insn_aux_data[env->insn_idx];
 }
 
+enum {
+	REASON_BOUNDS	= -1,
+	REASON_TYPE	= -2,
+	REASON_PATHS	= -3,
+	REASON_LIMIT	= -4,
+	REASON_STACK	= -5,
+};
+
 static int retrieve_ptr_limit(const struct bpf_reg_state *ptr_reg,
 			      const struct bpf_reg_state *off_reg,
 			      u32 *alu_limit, u8 opcode)
@@ -2740,7 +2748,7 @@ static int retrieve_ptr_limit(const struct bpf_reg_state *ptr_reg,
 
 	if (!tnum_is_const(off_reg->var_off) &&
 	    (off_reg->smin_value < 0) != (off_reg->smax_value < 0))
-		return -EACCES;
+		return REASON_BOUNDS;
 
 	switch (ptr_reg->type) {
 	case PTR_TO_STACK:
@@ -2764,11 +2772,11 @@ static int retrieve_ptr_limit(const struct bpf_reg_state *ptr_reg,
 		}
 		break;
 	default:
-		return -EINVAL;
+		return REASON_TYPE;
 	}
 
 	if (ptr_limit >= max)
-		return -ERANGE;
+		return REASON_LIMIT;
 	*alu_limit = ptr_limit;
 	return 0;
 }
@@ -2788,7 +2796,7 @@ static int update_alu_sanitation_state(struct bpf_insn_aux_data *aux,
 	if (aux->alu_state &&
 	    (aux->alu_state != alu_state ||
 	     aux->alu_limit != alu_limit))
-		return -EACCES;
+		return REASON_PATHS;
 
 	/* Corresponding fixup done in fixup_bpf_calls(). */
 	aux->alu_state = alu_state;
@@ -2861,7 +2869,46 @@ static int sanitize_ptr_alu(struct bpf_verifier_env *env,
 	ret = push_stack(env, env->insn_idx + 1, env->insn_idx, true);
 	if (!ptr_is_dst_reg && ret)
 		*dst_reg = tmp;
-	return !ret ? -EFAULT : 0;
+	return !ret ? REASON_STACK : 0;
+}
+
+static int sanitize_err(struct bpf_verifier_env *env,
+			const struct bpf_insn *insn, int reason,
+			const struct bpf_reg_state *off_reg,
+			const struct bpf_reg_state *dst_reg)
+{
+	static const char *err = "pointer arithmetic with it prohibited for !root";
+	const char *op = BPF_OP(insn->code) == BPF_ADD ? "add" : "sub";
+	u32 dst = insn->dst_reg, src = insn->src_reg;
+
+	switch (reason) {
+	case REASON_BOUNDS:
+		verbose(env, "R%d has unknown scalar with mixed signed bounds, %s\n",
+			off_reg == dst_reg ? dst : src, err);
+		break;
+	case REASON_TYPE:
+		verbose(env, "R%d has pointer with unsupported alu operation, %s\n",
+			off_reg == dst_reg ? src : dst, err);
+		break;
+	case REASON_PATHS:
+		verbose(env, "R%d tried to %s from different maps, paths or scalars, %s\n",
+			dst, op, err);
+		break;
+	case REASON_LIMIT:
+		verbose(env, "R%d tried to %s beyond pointer bounds, %s\n",
+			dst, op, err);
+		break;
+	case REASON_STACK:
+		verbose(env, "R%d could not be pushed for speculative verification, %s\n",
+			dst, err);
+		break;
+	default:
+		verbose(env, "verifier internal error: unknown reason (%d)\n",
+			reason);
+		break;
+	}
+
+	return -EACCES;
 }
 
 /* Handles arithmetic on a pointer and a scalar: computes new min/max and var_off.
@@ -2934,10 +2981,9 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
 	switch (opcode) {
 	case BPF_ADD:
 		ret = sanitize_ptr_alu(env, insn, ptr_reg, off_reg, dst_reg);
-		if (ret < 0) {
-			verbose(env, "R%d tried to add from different maps, paths, or prohibited types\n", dst);
-			return ret;
-		}
+		if (ret < 0)
+			return sanitize_err(env, insn, ret, off_reg, dst_reg);
+
 		/* We can take a fixed offset as long as it doesn't overflow
 		 * the s32 'off' field
 		 */
@@ -2989,10 +3035,9 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
 		break;
 	case BPF_SUB:
 		ret = sanitize_ptr_alu(env, insn, ptr_reg, off_reg, dst_reg);
-		if (ret < 0) {
-			verbose(env, "R%d tried to sub from different maps, paths, or prohibited types\n", dst);
-			return ret;
-		}
+		if (ret < 0)
+			return sanitize_err(env, insn, ret, off_reg, dst_reg);
+
 		if (dst_reg == off_reg) {
 			/* scalar -= pointer.  Creates an unknown scalar */
 			verbose(env, "R%d tried to subtract pointer from scalar\n",
@@ -3109,7 +3154,6 @@ static int adjust_scalar_min_max_vals(struct bpf_verifier_env *env,
 	s64 smin_val, smax_val;
 	u64 umin_val, umax_val;
 	u64 insn_bitness = (BPF_CLASS(insn->code) == BPF_ALU64) ? 64 : 32;
-	u32 dst = insn->dst_reg;
 	int ret;
 
 	if (insn_bitness == 32) {
@@ -3146,10 +3190,8 @@ static int adjust_scalar_min_max_vals(struct bpf_verifier_env *env,
 	switch (opcode) {
 	case BPF_ADD:
 		ret = sanitize_val_alu(env, insn);
-		if (ret < 0) {
-			verbose(env, "R%d tried to add from different pointers or scalars\n", dst);
-			return ret;
-		}
+		if (ret < 0)
+			return sanitize_err(env, insn, ret, NULL, NULL);
 		if (signed_add_overflows(dst_reg->smin_value, smin_val) ||
 		    signed_add_overflows(dst_reg->smax_value, smax_val)) {
 			dst_reg->smin_value = S64_MIN;
@@ -3170,10 +3212,8 @@ static int adjust_scalar_min_max_vals(struct bpf_verifier_env *env,
 		break;
 	case BPF_SUB:
 		ret = sanitize_val_alu(env, insn);
-		if (ret < 0) {
-			verbose(env, "R%d tried to sub from different pointers or scalars\n", dst);
-			return ret;
-		}
+		if (ret < 0)
+			return sanitize_err(env, insn, ret, NULL, NULL);
 		if (signed_sub_overflows(dst_reg->smin_value, smax_val) ||
 		    signed_sub_overflows(dst_reg->smax_value, smin_val)) {
 			/* Overflow possible, we know nothing */

commit 8ab6572e2081f82eef28a972af86676467192225
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Fri May 28 13:38:01 2021 +0300

    bpf: Rework ptr_limit into alu_limit and add common error path
    
    commit b658bbb844e28f1862867f37e8ca11a8e2aa94a3 upstream.
    
    Small refactor with no semantic changes in order to consolidate the max
    ptr_limit boundary check.
    
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: John Fastabend <john.fastabend@gmail.com>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    [OP: backport to 4.19]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index cdef8c7769ef..adc833c6088f 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -2731,12 +2731,12 @@ static struct bpf_insn_aux_data *cur_aux(struct bpf_verifier_env *env)
 
 static int retrieve_ptr_limit(const struct bpf_reg_state *ptr_reg,
 			      const struct bpf_reg_state *off_reg,
-			      u32 *ptr_limit, u8 opcode)
+			      u32 *alu_limit, u8 opcode)
 {
 	bool off_is_neg = off_reg->smin_value < 0;
 	bool mask_to_left = (opcode == BPF_ADD &&  off_is_neg) ||
 			    (opcode == BPF_SUB && !off_is_neg);
-	u32 off, max;
+	u32 off, max = 0, ptr_limit = 0;
 
 	if (!tnum_is_const(off_reg->var_off) &&
 	    (off_reg->smin_value < 0) != (off_reg->smax_value < 0))
@@ -2750,22 +2750,27 @@ static int retrieve_ptr_limit(const struct bpf_reg_state *ptr_reg,
 		max = MAX_BPF_STACK + mask_to_left;
 		off = ptr_reg->off + ptr_reg->var_off.value;
 		if (mask_to_left)
-			*ptr_limit = MAX_BPF_STACK + off;
+			ptr_limit = MAX_BPF_STACK + off;
 		else
-			*ptr_limit = -off - 1;
-		return *ptr_limit >= max ? -ERANGE : 0;
+			ptr_limit = -off - 1;
+		break;
 	case PTR_TO_MAP_VALUE:
 		max = ptr_reg->map_ptr->value_size;
 		if (mask_to_left) {
-			*ptr_limit = ptr_reg->umax_value + ptr_reg->off;
+			ptr_limit = ptr_reg->umax_value + ptr_reg->off;
 		} else {
 			off = ptr_reg->smin_value + ptr_reg->off;
-			*ptr_limit = ptr_reg->map_ptr->value_size - off - 1;
+			ptr_limit = ptr_reg->map_ptr->value_size - off - 1;
 		}
-		return *ptr_limit >= max ? -ERANGE : 0;
+		break;
 	default:
 		return -EINVAL;
 	}
+
+	if (ptr_limit >= max)
+		return -ERANGE;
+	*alu_limit = ptr_limit;
+	return 0;
 }
 
 static bool can_skip_alu_sanitation(const struct bpf_verifier_env *env,

commit 167743a5eae1c586aa408c6fac4429224e4e4663
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Fri May 28 13:38:00 2021 +0300

    bpf: Ensure off_reg has no mixed signed bounds for all types
    
    commit 24c109bb1537c12c02aeed2d51a347b4d6a9b76e upstream.
    
    The mixed signed bounds check really belongs into retrieve_ptr_limit()
    instead of outside of it in adjust_ptr_min_max_vals(). The reason is
    that this check is not tied to PTR_TO_MAP_VALUE only, but to all pointer
    types that we handle in retrieve_ptr_limit() and given errors from the latter
    propagate back to adjust_ptr_min_max_vals() and lead to rejection of the
    program, it's a better place to reside to avoid anything slipping through
    for future types. The reason why we must reject such off_reg is that we
    otherwise would not be able to derive a mask, see details in 9d7eceede769
    ("bpf: restrict unknown scalars of mixed signed bounds for unprivileged").
    
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: John Fastabend <john.fastabend@gmail.com>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    [fllinden@amazon.com: backport to 5.4]
    Signed-off-by: Frank van der Linden <fllinden@amazon.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    [OP: backport to 4.19]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 4edae9b29cd1..cdef8c7769ef 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -2730,12 +2730,18 @@ static struct bpf_insn_aux_data *cur_aux(struct bpf_verifier_env *env)
 }
 
 static int retrieve_ptr_limit(const struct bpf_reg_state *ptr_reg,
-			      u32 *ptr_limit, u8 opcode, bool off_is_neg)
+			      const struct bpf_reg_state *off_reg,
+			      u32 *ptr_limit, u8 opcode)
 {
+	bool off_is_neg = off_reg->smin_value < 0;
 	bool mask_to_left = (opcode == BPF_ADD &&  off_is_neg) ||
 			    (opcode == BPF_SUB && !off_is_neg);
 	u32 off, max;
 
+	if (!tnum_is_const(off_reg->var_off) &&
+	    (off_reg->smin_value < 0) != (off_reg->smax_value < 0))
+		return -EACCES;
+
 	switch (ptr_reg->type) {
 	case PTR_TO_STACK:
 		/* Offset 0 is out-of-bounds, but acceptable start for the
@@ -2826,7 +2832,7 @@ static int sanitize_ptr_alu(struct bpf_verifier_env *env,
 	alu_state |= ptr_is_dst_reg ?
 		     BPF_ALU_SANITIZE_SRC : BPF_ALU_SANITIZE_DST;
 
-	err = retrieve_ptr_limit(ptr_reg, &alu_limit, opcode, off_is_neg);
+	err = retrieve_ptr_limit(ptr_reg, off_reg, &alu_limit, opcode);
 	if (err < 0)
 		return err;
 
@@ -2871,8 +2877,8 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
 	    smin_ptr = ptr_reg->smin_value, smax_ptr = ptr_reg->smax_value;
 	u64 umin_val = off_reg->umin_value, umax_val = off_reg->umax_value,
 	    umin_ptr = ptr_reg->umin_value, umax_ptr = ptr_reg->umax_value;
-	u32 dst = insn->dst_reg, src = insn->src_reg;
 	u8 opcode = BPF_OP(insn->code);
+	u32 dst = insn->dst_reg;
 	int ret;
 
 	dst_reg = &regs[dst];
@@ -2909,12 +2915,6 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
 			dst);
 		return -EACCES;
 	}
-	if (ptr_reg->type == PTR_TO_MAP_VALUE &&
-	    !env->allow_ptr_leaks && !known && (smin_val < 0) != (smax_val < 0)) {
-		verbose(env, "R%d has unknown scalar with mixed signed bounds, pointer arithmetic with it prohibited for !root\n",
-			off_reg == dst_reg ? dst : src);
-		return -EACCES;
-	}
 
 	/* In case of 'scalar += pointer', dst_reg inherits pointer type and id.
 	 * The id may be overwritten later if we create a new variable offset.

commit f1c2a82c11c8f16dbf028b7b0ee15ea0adcfaf40
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Fri May 28 13:37:59 2021 +0300

    bpf: Move off_reg into sanitize_ptr_alu
    
    commit 6f55b2f2a1178856c19bbce2f71449926e731914 upstream.
    
    Small refactor to drag off_reg into sanitize_ptr_alu(), so we later on can
    use off_reg for generalizing some of the checks for all pointer types.
    
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: John Fastabend <john.fastabend@gmail.com>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 275c1078d80b..4edae9b29cd1 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -2799,11 +2799,12 @@ static int sanitize_val_alu(struct bpf_verifier_env *env,
 static int sanitize_ptr_alu(struct bpf_verifier_env *env,
 			    struct bpf_insn *insn,
 			    const struct bpf_reg_state *ptr_reg,
-			    struct bpf_reg_state *dst_reg,
-			    bool off_is_neg)
+			    const struct bpf_reg_state *off_reg,
+			    struct bpf_reg_state *dst_reg)
 {
 	struct bpf_verifier_state *vstate = env->cur_state;
 	struct bpf_insn_aux_data *aux = cur_aux(env);
+	bool off_is_neg = off_reg->smin_value < 0;
 	bool ptr_is_dst_reg = ptr_reg == dst_reg;
 	u8 opcode = BPF_OP(insn->code);
 	u32 alu_state, alu_limit;
@@ -2927,7 +2928,7 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
 
 	switch (opcode) {
 	case BPF_ADD:
-		ret = sanitize_ptr_alu(env, insn, ptr_reg, dst_reg, smin_val < 0);
+		ret = sanitize_ptr_alu(env, insn, ptr_reg, off_reg, dst_reg);
 		if (ret < 0) {
 			verbose(env, "R%d tried to add from different maps, paths, or prohibited types\n", dst);
 			return ret;
@@ -2982,7 +2983,7 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
 		}
 		break;
 	case BPF_SUB:
-		ret = sanitize_ptr_alu(env, insn, ptr_reg, dst_reg, smin_val < 0);
+		ret = sanitize_ptr_alu(env, insn, ptr_reg, off_reg, dst_reg);
 		if (ret < 0) {
 			verbose(env, "R%d tried to sub from different maps, paths, or prohibited types\n", dst);
 			return ret;

commit d1e281d6cb8841122c4677b47fcebdc6f410bd74
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Fri May 28 13:37:58 2021 +0300

    bpf, test_verifier: switch bpf_get_stack's 0 s> r8 test
    
    [ no upstream commit ]
    
    Switch the comparison, so that is_branch_taken() will recognize that below
    branch is never taken:
    
      [...]
      17: [...] R1_w=inv0 [...] R8_w=inv(id=0,smin_value=-2147483648,smax_value=-1,umin_value=18446744071562067968,var_off=(0xffffffff80000000; 0x7fffffff)) [...]
      17: (67) r8 <<= 32
      18: [...] R8_w=inv(id=0,smax_value=-4294967296,umin_value=9223372036854775808,umax_value=18446744069414584320,var_off=(0x8000000000000000; 0x7fffffff00000000)) [...]
      18: (c7) r8 s>>= 32
      19: [...] R8_w=inv(id=0,smin_value=-2147483648,smax_value=-1,umin_value=18446744071562067968,var_off=(0xffffffff80000000; 0x7fffffff)) [...]
      19: (6d) if r1 s> r8 goto pc+16
      [...] R1_w=inv0 [...] R8_w=inv(id=0,smin_value=-2147483648,smax_value=-1,umin_value=18446744071562067968,var_off=(0xffffffff80000000; 0x7fffffff)) [...]
      [...]
    
    Currently we check for is_branch_taken() only if either K is source, or source
    is a scalar value that is const. For upstream it would be good to extend this
    properly to check whether dst is const and src not.
    
    For the sake of the test_verifier, it is probably not needed here:
    
      # ./test_verifier 101
      #101/p bpf_get_stack return R0 within range OK
      Summary: 1 PASSED, 0 SKIPPED, 0 FAILED
    
    I haven't seen this issue in test_progs* though, they are passing fine:
    
      # ./test_progs-no_alu32 -t get_stack
      Switching to flavor 'no_alu32' subdirectory...
      #20 get_stack_raw_tp:OK
      Summary: 1/0 PASSED, 0 SKIPPED, 0 FAILED
    
      # ./test_progs -t get_stack
      #20 get_stack_raw_tp:OK
      Summary: 1/0 PASSED, 0 SKIPPED, 0 FAILED
    
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    Acked-by: John Fastabend <john.fastabend@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    [OP: backport to 4.19]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index da985a5e7cc5..662d6acaaab0 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -12263,7 +12263,7 @@ static struct bpf_test tests[] = {
 			BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_8, 32),
 			BPF_ALU64_IMM(BPF_ARSH, BPF_REG_8, 32),
-			BPF_JMP_REG(BPF_JSGT, BPF_REG_1, BPF_REG_8, 16),
+			BPF_JMP_REG(BPF_JSLT, BPF_REG_8, BPF_REG_1, 16),
 			BPF_ALU64_REG(BPF_SUB, BPF_REG_9, BPF_REG_8),
 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
 			BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_8),

commit f915e7975fc2d593ddb60b67d14eef314eb6dd08
Author: John Fastabend <john.fastabend@gmail.com>
Date:   Fri May 28 13:37:57 2021 +0300

    bpf: Test_verifier, bpf_get_stack return value add <0
    
    commit 9ac26e9973bac5716a2a542e32f380c84db2b88c upstream.
    
    With current ALU32 subreg handling and retval refine fix from last
    patches we see an expected failure in test_verifier. With verbose
    verifier state being printed at each step for clarity we have the
    following relavent lines [I omit register states that are not
    necessarily useful to see failure cause],
    
    #101/p bpf_get_stack return R0 within range FAIL
    Failed to load prog 'Success'!
    [..]
    14: (85) call bpf_get_stack#67
     R0_w=map_value(id=0,off=0,ks=8,vs=48,imm=0)
     R3_w=inv48
    15:
     R0=inv(id=0,smax_value=48,var32_off=(0x0; 0xffffffff))
    15: (b7) r1 = 0
    16:
     R0=inv(id=0,smax_value=48,var32_off=(0x0; 0xffffffff))
     R1_w=inv0
    16: (bf) r8 = r0
    17:
     R0=inv(id=0,smax_value=48,var32_off=(0x0; 0xffffffff))
     R1_w=inv0
     R8_w=inv(id=0,smax_value=48,var32_off=(0x0; 0xffffffff))
    17: (67) r8 <<= 32
    18:
     R0=inv(id=0,smax_value=48,var32_off=(0x0; 0xffffffff))
     R1_w=inv0
     R8_w=inv(id=0,smax_value=9223372032559808512,
                   umax_value=18446744069414584320,
                   var_off=(0x0; 0xffffffff00000000),
                   s32_min_value=0,
                   s32_max_value=0,
                   u32_max_value=0,
                   var32_off=(0x0; 0x0))
    18: (c7) r8 s>>= 32
    19
     R0=inv(id=0,smax_value=48,var32_off=(0x0; 0xffffffff))
     R1_w=inv0
     R8_w=inv(id=0,smin_value=-2147483648,
                   smax_value=2147483647,
                   var32_off=(0x0; 0xffffffff))
    19: (cd) if r1 s< r8 goto pc+16
     R0=inv(id=0,smax_value=48,var32_off=(0x0; 0xffffffff))
     R1_w=inv0
     R8_w=inv(id=0,smin_value=-2147483648,
                   smax_value=0,
                   var32_off=(0x0; 0xffffffff))
    20:
     R0=inv(id=0,smax_value=48,var32_off=(0x0; 0xffffffff))
     R1_w=inv0
     R8_w=inv(id=0,smin_value=-2147483648,
                   smax_value=0,
     R9=inv48
    20: (1f) r9 -= r8
    21: (bf) r2 = r7
    22:
     R2_w=map_value(id=0,off=0,ks=8,vs=48,imm=0)
    22: (0f) r2 += r8
    value -2147483648 makes map_value pointer be out of bounds
    
    After call bpf_get_stack() on line 14 and some moves we have at line 16
    an r8 bound with max_value 48 but an unknown min value. This is to be
    expected bpf_get_stack call can only return a max of the input size but
    is free to return any negative error in the 32-bit register space. The
    C helper is returning an int so will use lower 32-bits.
    
    Lines 17 and 18 clear the top 32 bits with a left/right shift but use
    ARSH so we still have worst case min bound before line 19 of -2147483648.
    At this point the signed check 'r1 s< r8' meant to protect the addition
    on line 22 where dst reg is a map_value pointer may very well return
    true with a large negative number. Then the final line 22 will detect
    this as an invalid operation and fail the program. What we want to do
    is proceed only if r8 is positive non-error. So change 'r1 s< r8' to
    'r1 s> r8' so that we jump if r8 is negative.
    
    Next we will throw an error because we access past the end of the map
    value. The map value size is 48 and sizeof(struct test_val) is 48 so
    we walk off the end of the map value on the second call to
    get bpf_get_stack(). Fix this by changing sizeof(struct test_val) to
    24 by using 'sizeof(struct test_val) / 2'. After this everything passes
    as expected.
    
    Signed-off-by: John Fastabend <john.fastabend@gmail.com>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Link: https://lore.kernel.org/bpf/158560426019.10843.3285429543232025187.stgit@john-Precision-5820-Tower
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    [OP: backport to 4.19]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index a34552aadc12..da985a5e7cc5 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -12253,17 +12253,17 @@ static struct bpf_test tests[] = {
 				     BPF_FUNC_map_lookup_elem),
 			BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 28),
 			BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
-			BPF_MOV64_IMM(BPF_REG_9, sizeof(struct test_val)),
+			BPF_MOV64_IMM(BPF_REG_9, sizeof(struct test_val)/2),
 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
-			BPF_MOV64_IMM(BPF_REG_3, sizeof(struct test_val)),
+			BPF_MOV64_IMM(BPF_REG_3, sizeof(struct test_val)/2),
 			BPF_MOV64_IMM(BPF_REG_4, 256),
 			BPF_EMIT_CALL(BPF_FUNC_get_stack),
 			BPF_MOV64_IMM(BPF_REG_1, 0),
 			BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
 			BPF_ALU64_IMM(BPF_LSH, BPF_REG_8, 32),
 			BPF_ALU64_IMM(BPF_ARSH, BPF_REG_8, 32),
-			BPF_JMP_REG(BPF_JSLT, BPF_REG_1, BPF_REG_8, 16),
+			BPF_JMP_REG(BPF_JSGT, BPF_REG_1, BPF_REG_8, 16),
 			BPF_ALU64_REG(BPF_SUB, BPF_REG_9, BPF_REG_8),
 			BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
 			BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_8),
@@ -12273,7 +12273,7 @@ static struct bpf_test tests[] = {
 			BPF_MOV64_REG(BPF_REG_3, BPF_REG_2),
 			BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_1),
 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
-			BPF_MOV64_IMM(BPF_REG_5, sizeof(struct test_val)),
+			BPF_MOV64_IMM(BPF_REG_5, sizeof(struct test_val)/2),
 			BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_5),
 			BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 4),
 			BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),

commit e0b86677fb3e4622b444dcdd8546caa0dba8a689
Author: Alexei Starovoitov <ast@kernel.org>
Date:   Fri May 28 13:37:56 2021 +0300

    bpf: extend is_branch_taken to registers
    
    commit fb8d251ee2a6bf4d7f4af5548e9c8f4fb5f90402 upstream
    
    This patch extends is_branch_taken() logic from JMP+K instructions
    to JMP+X instructions.
    Conditional branches are often done when src and dst registers
    contain known scalars. In such case the verifier can follow
    the branch that is going to be taken when program executes.
    That speeds up the verification and is essential feature to support
    bounded loops.
    
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Acked-by: Andrii Nakryiko <andriin@fb.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    [OP: drop is_jmp32 parameter from is_branch_taken() calls and
         adjust context]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index f49f84b71a6b..275c1078d80b 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -4127,8 +4127,9 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env,
 	struct bpf_verifier_state *this_branch = env->cur_state;
 	struct bpf_verifier_state *other_branch;
 	struct bpf_reg_state *regs = this_branch->frame[this_branch->curframe]->regs;
-	struct bpf_reg_state *dst_reg, *other_branch_regs;
+	struct bpf_reg_state *dst_reg, *other_branch_regs, *src_reg = NULL;
 	u8 opcode = BPF_OP(insn->code);
+	int pred = -1;
 	int err;
 
 	if (opcode > BPF_JSLE) {
@@ -4152,6 +4153,7 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env,
 				insn->src_reg);
 			return -EACCES;
 		}
+		src_reg = &regs[insn->src_reg];
 	} else {
 		if (insn->src_reg != BPF_REG_0) {
 			verbose(env, "BPF_JMP uses reserved fields\n");
@@ -4166,19 +4168,21 @@ static int check_cond_jmp_op(struct bpf_verifier_env *env,
 
 	dst_reg = &regs[insn->dst_reg];
 
-	if (BPF_SRC(insn->code) == BPF_K) {
-		int pred = is_branch_taken(dst_reg, insn->imm, opcode);
-
-		if (pred == 1) {
-			 /* only follow the goto, ignore fall-through */
-			*insn_idx += insn->off;
-			return 0;
-		} else if (pred == 0) {
-			/* only follow fall-through branch, since
-			 * that's where the program will go
-			 */
-			return 0;
-		}
+	if (BPF_SRC(insn->code) == BPF_K)
+		pred = is_branch_taken(dst_reg, insn->imm, opcode);
+	else if (src_reg->type == SCALAR_VALUE &&
+		 tnum_is_const(src_reg->var_off))
+		pred = is_branch_taken(dst_reg, src_reg->var_off.value,
+				       opcode);
+	if (pred == 1) {
+		/* only follow the goto, ignore fall-through */
+		*insn_idx += insn->off;
+		return 0;
+	} else if (pred == 0) {
+		/* only follow fall-through branch, since
+		 * that's where the program will go
+		 */
+		return 0;
 	}
 
 	other_branch = push_stack(env, *insn_idx + insn->off + 1, *insn_idx,

commit c905bfe767e98a13dd886bf241ba9ee0640a53ff
Author: Ovidiu Panait <ovidiu.panait@windriver.com>
Date:   Fri May 28 13:37:55 2021 +0300

    selftests/bpf: add selftest part of "bpf: improve verifier branch analysis"
    
    Backport the missing selftest part of commit 7da6cd690c43 ("bpf: improve
    verifier branch analysis") in order to fix the following test_verifier
    failures:
    
    ...
    Unexpected success to load!
    0: (b7) r0 = 0
    1: (75) if r0 s>= 0x0 goto pc+1
    3: (95) exit
    processed 3 insns (limit 131072), stack depth 0
    Unexpected success to load!
    0: (b7) r0 = 0
    1: (75) if r0 s>= 0x0 goto pc+1
    3: (95) exit
    processed 3 insns (limit 131072), stack depth 0
    ...
    
    The changesets apply with a minor context difference.
    
    Fixes: 7da6cd690c43 ("bpf: improve verifier branch analysis")
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index fdc093f29818..a34552aadc12 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -7867,7 +7867,7 @@ static struct bpf_test tests[] = {
 			BPF_JMP_IMM(BPF_JA, 0, 0, -7),
 		},
 		.fixup_map1 = { 4 },
-		.errstr = "R0 invalid mem access 'inv'",
+		.errstr = "unbounded min value",
 		.errstr_unpriv = "R1 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
@@ -9850,7 +9850,7 @@ static struct bpf_test tests[] = {
 		"check deducing bounds from const, 5",
 		.insns = {
 			BPF_MOV64_IMM(BPF_REG_0, 0),
-			BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1),
+			BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 1, 1),
 			BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
 			BPF_EXIT_INSN(),
 		},

commit 737f5f3a633518feae7b2793f4666c67e39bcc5a
Author: Andrey Ignatov <rdna@fb.com>
Date:   Fri May 28 13:37:54 2021 +0300

    selftests/bpf: Test narrow loads with off > 0 in test_verifier
    
    commit 6c2afb674dbda9b736b8f09c976516e1e788860a upstream
    
    Test the following narrow loads in test_verifier for context __sk_buff:
    * off=1, size=1 - ok;
    * off=2, size=1 - ok;
    * off=3, size=1 - ok;
    * off=0, size=2 - ok;
    * off=1, size=2 - fail;
    * off=0, size=2 - ok;
    * off=3, size=2 - fail.
    
    Signed-off-by: Andrey Ignatov <rdna@fb.com>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index 29d42f7796d9..fdc093f29818 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -2002,29 +2002,27 @@ static struct bpf_test tests[] = {
 		.result = ACCEPT,
 	},
 	{
-		"check skb->hash byte load not permitted 1",
+		"check skb->hash byte load permitted 1",
 		.insns = {
 			BPF_MOV64_IMM(BPF_REG_0, 0),
 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
 				    offsetof(struct __sk_buff, hash) + 1),
 			BPF_EXIT_INSN(),
 		},
-		.errstr = "invalid bpf_context access",
-		.result = REJECT,
+		.result = ACCEPT,
 	},
 	{
-		"check skb->hash byte load not permitted 2",
+		"check skb->hash byte load permitted 2",
 		.insns = {
 			BPF_MOV64_IMM(BPF_REG_0, 0),
 			BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1,
 				    offsetof(struct __sk_buff, hash) + 2),
 			BPF_EXIT_INSN(),
 		},
-		.errstr = "invalid bpf_context access",
-		.result = REJECT,
+		.result = ACCEPT,
 	},
 	{
-		"check skb->hash byte load not permitted 3",
+		"check skb->hash byte load permitted 3",
 		.insns = {
 			BPF_MOV64_IMM(BPF_REG_0, 0),
 #if __BYTE_ORDER == __LITTLE_ENDIAN
@@ -2036,8 +2034,7 @@ static struct bpf_test tests[] = {
 #endif
 			BPF_EXIT_INSN(),
 		},
-		.errstr = "invalid bpf_context access",
-		.result = REJECT,
+		.result = ACCEPT,
 	},
 	{
 		"check cb access: byte, wrong type",
@@ -2149,7 +2146,7 @@ static struct bpf_test tests[] = {
 		.result = ACCEPT,
 	},
 	{
-		"check skb->hash half load not permitted",
+		"check skb->hash half load permitted 2",
 		.insns = {
 			BPF_MOV64_IMM(BPF_REG_0, 0),
 #if __BYTE_ORDER == __LITTLE_ENDIAN
@@ -2158,6 +2155,37 @@ static struct bpf_test tests[] = {
 #else
 			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
 				    offsetof(struct __sk_buff, hash)),
+#endif
+			BPF_EXIT_INSN(),
+		},
+		.result = ACCEPT,
+	},
+	{
+		"check skb->hash half load not permitted, unaligned 1",
+		.insns = {
+			BPF_MOV64_IMM(BPF_REG_0, 0),
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
+				    offsetof(struct __sk_buff, hash) + 1),
+#else
+			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
+				    offsetof(struct __sk_buff, hash) + 3),
+#endif
+			BPF_EXIT_INSN(),
+		},
+		.errstr = "invalid bpf_context access",
+		.result = REJECT,
+	},
+	{
+		"check skb->hash half load not permitted, unaligned 3",
+		.insns = {
+			BPF_MOV64_IMM(BPF_REG_0, 0),
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
+				    offsetof(struct __sk_buff, hash) + 3),
+#else
+			BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
+				    offsetof(struct __sk_buff, hash) + 1),
 #endif
 			BPF_EXIT_INSN(),
 		},

commit 1982f436a9a990e338ac4d7ed80a9fb40e0a1885
Author: Piotr Krysiuk <piotras@gmail.com>
Date:   Fri May 28 13:37:53 2021 +0300

    bpf, selftests: Fix up some test_verifier cases for unprivileged
    
    commit 0a13e3537ea67452d549a6a80da3776d6b7dedb3 upstream
    
    Fix up test_verifier error messages for the case where the original error
    message changed, or for the case where pointer alu errors differ between
    privileged and unprivileged tests. Also, add alternative tests for keeping
    coverage of the original verifier rejection error message (fp alu), and
    newly reject map_ptr += rX where rX == 0 given we now forbid alu on these
    types for unprivileged. All test_verifier cases pass after the change. The
    test case fixups were kept separate to ease backporting of core changes.
    
    Signed-off-by: Piotr Krysiuk <piotras@gmail.com>
    Co-developed-by: Daniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    [OP: backport to 4.19, skipping non-existent tests]
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index fef1c9e3c4b8..29d42f7796d9 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -2837,7 +2837,7 @@ static struct bpf_test tests[] = {
 		.result = ACCEPT,
 	},
 	{
-		"unpriv: adding of fp",
+		"unpriv: adding of fp, reg",
 		.insns = {
 			BPF_MOV64_IMM(BPF_REG_0, 0),
 			BPF_MOV64_IMM(BPF_REG_1, 0),
@@ -2845,6 +2845,19 @@ static struct bpf_test tests[] = {
 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, -8),
 			BPF_EXIT_INSN(),
 		},
+		.errstr_unpriv = "R1 tried to add from different maps, paths, or prohibited types",
+		.result_unpriv = REJECT,
+		.result = ACCEPT,
+	},
+	{
+		"unpriv: adding of fp, imm",
+		.insns = {
+		BPF_MOV64_IMM(BPF_REG_0, 0),
+		BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
+		BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0),
+		BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, -8),
+		BPF_EXIT_INSN(),
+		},
 		.errstr_unpriv = "R1 stack pointer arithmetic goes out of range",
 		.result_unpriv = REJECT,
 		.result = ACCEPT,
@@ -9758,8 +9771,9 @@ static struct bpf_test tests[] = {
 			BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
 			BPF_EXIT_INSN(),
 		},
-		.result = REJECT,
+		.errstr_unpriv = "R0 tried to sub from different maps, paths, or prohibited types",
 		.errstr = "R0 tried to subtract pointer from scalar",
+		.result = REJECT,
 	},
 	{
 		"check deducing bounds from const, 2",
@@ -9772,6 +9786,8 @@ static struct bpf_test tests[] = {
 			BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0),
 			BPF_EXIT_INSN(),
 		},
+		.errstr_unpriv = "R1 tried to sub from different maps, paths, or prohibited types",
+		.result_unpriv = REJECT,
 		.result = ACCEPT,
 		.retval = 1,
 	},
@@ -9783,8 +9799,9 @@ static struct bpf_test tests[] = {
 			BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
 			BPF_EXIT_INSN(),
 		},
-		.result = REJECT,
+		.errstr_unpriv = "R0 tried to sub from different maps, paths, or prohibited types",
 		.errstr = "R0 tried to subtract pointer from scalar",
+		.result = REJECT,
 	},
 	{
 		"check deducing bounds from const, 4",
@@ -9797,6 +9814,8 @@ static struct bpf_test tests[] = {
 			BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0),
 			BPF_EXIT_INSN(),
 		},
+		.errstr_unpriv = "R1 tried to sub from different maps, paths, or prohibited types",
+		.result_unpriv = REJECT,
 		.result = ACCEPT,
 	},
 	{
@@ -9807,8 +9826,9 @@ static struct bpf_test tests[] = {
 			BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
 			BPF_EXIT_INSN(),
 		},
-		.result = REJECT,
+		.errstr_unpriv = "R0 tried to sub from different maps, paths, or prohibited types",
 		.errstr = "R0 tried to subtract pointer from scalar",
+		.result = REJECT,
 	},
 	{
 		"check deducing bounds from const, 6",
@@ -9819,8 +9839,9 @@ static struct bpf_test tests[] = {
 			BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
 			BPF_EXIT_INSN(),
 		},
-		.result = REJECT,
+		.errstr_unpriv = "R0 tried to sub from different maps, paths, or prohibited types",
 		.errstr = "R0 tried to subtract pointer from scalar",
+		.result = REJECT,
 	},
 	{
 		"check deducing bounds from const, 7",
@@ -9832,8 +9853,9 @@ static struct bpf_test tests[] = {
 				    offsetof(struct __sk_buff, mark)),
 			BPF_EXIT_INSN(),
 		},
-		.result = REJECT,
+		.errstr_unpriv = "R1 tried to sub from different maps, paths, or prohibited types",
 		.errstr = "dereference of modified ctx ptr",
+		.result = REJECT,
 	},
 	{
 		"check deducing bounds from const, 8",
@@ -9845,8 +9867,9 @@ static struct bpf_test tests[] = {
 				    offsetof(struct __sk_buff, mark)),
 			BPF_EXIT_INSN(),
 		},
-		.result = REJECT,
+		.errstr_unpriv = "R1 tried to add from different maps, paths, or prohibited types",
 		.errstr = "dereference of modified ctx ptr",
+		.result = REJECT,
 	},
 	{
 		"check deducing bounds from const, 9",
@@ -9856,8 +9879,9 @@ static struct bpf_test tests[] = {
 			BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
 			BPF_EXIT_INSN(),
 		},
-		.result = REJECT,
+		.errstr_unpriv = "R0 tried to sub from different maps, paths, or prohibited types",
 		.errstr = "R0 tried to subtract pointer from scalar",
+		.result = REJECT,
 	},
 	{
 		"check deducing bounds from const, 10",
@@ -9869,8 +9893,8 @@ static struct bpf_test tests[] = {
 			BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
 			BPF_EXIT_INSN(),
 		},
-		.result = REJECT,
 		.errstr = "math between ctx pointer and register with unbounded min value is not allowed",
+		.result = REJECT,
 	},
 	{
 		"bpf_exit with invalid return code. test1",

commit b190383c714a379002b00bc8de43371e78d291d8
Author: Ovidiu Panait <ovidiu.panait@windriver.com>
Date:   Fri May 28 13:37:52 2021 +0300

    bpf: fix up selftests after backports were fixed
    
    After the backport of the changes to fix CVE 2019-7308, the
    selftests also need to be fixed up, as was done originally
    in mainline 80c9b2fae87b ("bpf: add various test cases to selftests").
    
    This is a backport of upstream commit 80c9b2fae87b ("bpf: add various test
    cases to selftests") adapted to 4.19 in order to fix the
    selftests that began to fail after CVE-2019-7308 fixes.
    
    Suggested-by: Frank van der Linden <fllinden@amazon.com>
    Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index 9db5a7378f40..fef1c9e3c4b8 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -2448,6 +2448,7 @@ static struct bpf_test tests[] = {
 		},
 		.result = REJECT,
 		.errstr = "invalid stack off=-79992 size=8",
+		.errstr_unpriv = "R1 stack pointer arithmetic goes out of range",
 	},
 	{
 		"PTR_TO_STACK store/load - out of bounds high",
@@ -2844,6 +2845,8 @@ static struct bpf_test tests[] = {
 			BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, -8),
 			BPF_EXIT_INSN(),
 		},
+		.errstr_unpriv = "R1 stack pointer arithmetic goes out of range",
+		.result_unpriv = REJECT,
 		.result = ACCEPT,
 	},
 	{
@@ -7457,6 +7460,7 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
+		.errstr_unpriv = "R1 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7481,6 +7485,7 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
+		.errstr_unpriv = "R1 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7507,6 +7512,7 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
+		.errstr_unpriv = "R8 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7532,6 +7538,7 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
+		.errstr_unpriv = "R8 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7580,6 +7587,7 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
+		.errstr_unpriv = "R1 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7651,6 +7659,7 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
+		.errstr_unpriv = "R1 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7702,6 +7711,7 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
+		.errstr_unpriv = "R1 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7729,6 +7739,7 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
+		.errstr_unpriv = "R1 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7755,6 +7766,7 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
+		.errstr_unpriv = "R1 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7784,6 +7796,7 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
+		.errstr_unpriv = "R7 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7814,6 +7827,7 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 4 },
 		.errstr = "R0 invalid mem access 'inv'",
+		.errstr_unpriv = "R1 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -7842,6 +7856,7 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "unbounded min value",
+		.errstr_unpriv = "R1 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 		.result_unpriv = REJECT,
 	},
@@ -7894,6 +7909,7 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "R0 min value is negative, either use unsigned index or do a if (index >=0) check.",
+		.errstr_unpriv = "R1 has unknown scalar with mixed signed bounds",
 		.result = REJECT,
 	},
 	{
@@ -8266,6 +8282,7 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "pointer offset 1073741822",
+		.errstr_unpriv = "R0 pointer arithmetic of map value goes out of range",
 		.result = REJECT
 	},
 	{
@@ -8287,6 +8304,7 @@ static struct bpf_test tests[] = {
 		},
 		.fixup_map1 = { 3 },
 		.errstr = "pointer offset -1073741822",
+		.errstr_unpriv = "R0 pointer arithmetic of map value goes out of range",
 		.result = REJECT
 	},
 	{
@@ -8458,6 +8476,7 @@ static struct bpf_test tests[] = {
 			BPF_EXIT_INSN()
 		},
 		.errstr = "fp pointer offset 1073741822",
+		.errstr_unpriv = "R1 stack pointer arithmetic goes out of range",
 		.result = REJECT
 	},
 	{

commit 9e6a3eccb28779710cbbafc4f4258d92509c6d07
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Mon May 24 23:02:08 2021 +0300

    net: usb: fix memory leak in smsc75xx_bind
    
    commit 46a8b29c6306d8bbfd92b614ef65a47c900d8e70 upstream.
    
    Syzbot reported memory leak in smsc75xx_bind().
    The problem was is non-freed memory in case of
    errors after memory allocation.
    
    backtrace:
      [<ffffffff84245b62>] kmalloc include/linux/slab.h:556 [inline]
      [<ffffffff84245b62>] kzalloc include/linux/slab.h:686 [inline]
      [<ffffffff84245b62>] smsc75xx_bind+0x7a/0x334 drivers/net/usb/smsc75xx.c:1460
      [<ffffffff82b5b2e6>] usbnet_probe+0x3b6/0xc30 drivers/net/usb/usbnet.c:1728
    
    Fixes: d0cad871703b ("smsc75xx: SMSC LAN75xx USB gigabit ethernet adapter driver")
    Cc: stable@kernel.vger.org
    Reported-and-tested-by: syzbot+b558506ba8165425fee2@syzkaller.appspotmail.com
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/usb/smsc75xx.c b/drivers/net/usb/smsc75xx.c
index ec287c9741e8..62f2862c9775 100644
--- a/drivers/net/usb/smsc75xx.c
+++ b/drivers/net/usb/smsc75xx.c
@@ -1495,7 +1495,7 @@ static int smsc75xx_bind(struct usbnet *dev, struct usb_interface *intf)
 	ret = smsc75xx_wait_ready(dev, 0);
 	if (ret < 0) {
 		netdev_warn(dev->net, "device not ready in smsc75xx_bind\n");
-		return ret;
+		goto err;
 	}
 
 	smsc75xx_init_mac_address(dev);
@@ -1504,7 +1504,7 @@ static int smsc75xx_bind(struct usbnet *dev, struct usb_interface *intf)
 	ret = smsc75xx_reset(dev);
 	if (ret < 0) {
 		netdev_warn(dev->net, "smsc75xx_reset error %d\n", ret);
-		return ret;
+		goto err;
 	}
 
 	dev->net->netdev_ops = &smsc75xx_netdev_ops;
@@ -1514,6 +1514,10 @@ static int smsc75xx_bind(struct usbnet *dev, struct usb_interface *intf)
 	dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len;
 	dev->net->max_mtu = MAX_SINGLE_PACKET_SIZE;
 	return 0;
+
+err:
+	kfree(pdata);
+	return ret;
 }
 
 static void smsc75xx_unbind(struct usbnet *dev, struct usb_interface *intf)

commit 94888d73fb426b91385cd36170f46527d8b4e5e7
Author: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Date:   Mon May 24 15:01:55 2021 +0900

    usb: gadget: udc: renesas_usb3: Fix a race in usb3_start_pipen()
    
    commit e752dbc59e1241b13b8c4f7b6eb582862e7668fe upstream.
    
    The usb3_start_pipen() is called by renesas_usb3_ep_queue() and
    usb3_request_done_pipen() so that usb3_start_pipen() is possible
    to cause a race when getting usb3_first_req like below:
    
    renesas_usb3_ep_queue()
     spin_lock_irqsave()
     list_add_tail()
     spin_unlock_irqrestore()
     usb3_start_pipen()
      usb3_first_req = usb3_get_request() --- [1]
     --- interrupt ---
     usb3_irq_dma_int()
     usb3_request_done_pipen()
      usb3_get_request()
      usb3_start_pipen()
      usb3_first_req = usb3_get_request()
      ...
      (the req is possible to be finished in the interrupt)
    
    The usb3_first_req [1] above may have been finished after the interrupt
    ended so that this driver caused to start a transfer wrongly. To fix this
    issue, getting/checking the usb3_first_req are under spin_lock_irqsave()
    in the same section.
    
    Fixes: 746bfe63bba3 ("usb: gadget: renesas_usb3: add support for Renesas USB3.0 peripheral controller")
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
    Link: https://lore.kernel.org/r/20210524060155.1178724-1-yoshihiro.shimoda.uh@renesas.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/gadget/udc/renesas_usb3.c b/drivers/usb/gadget/udc/renesas_usb3.c
index a5254e82d628..c17d7a71e29a 100644
--- a/drivers/usb/gadget/udc/renesas_usb3.c
+++ b/drivers/usb/gadget/udc/renesas_usb3.c
@@ -1466,7 +1466,7 @@ static void usb3_start_pipen(struct renesas_usb3_ep *usb3_ep,
 			     struct renesas_usb3_request *usb3_req)
 {
 	struct renesas_usb3 *usb3 = usb3_ep_to_usb3(usb3_ep);
-	struct renesas_usb3_request *usb3_req_first = usb3_get_request(usb3_ep);
+	struct renesas_usb3_request *usb3_req_first;
 	unsigned long flags;
 	int ret = -EAGAIN;
 	u32 enable_bits = 0;
@@ -1474,7 +1474,8 @@ static void usb3_start_pipen(struct renesas_usb3_ep *usb3_ep,
 	spin_lock_irqsave(&usb3->lock, flags);
 	if (usb3_ep->halt || usb3_ep->started)
 		goto out;
-	if (usb3_req != usb3_req_first)
+	usb3_req_first = __usb3_get_request(usb3_ep);
+	if (!usb3_req_first || usb3_req != usb3_req_first)
 		goto out;
 
 	if (usb3_pn_change(usb3, usb3_ep->num) < 0)

commit 330de682e4d7d2299b990720157351b8122c81ba
Author: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Date:   Wed May 12 20:17:09 2021 -0700

    usb: dwc3: gadget: Properly track pending and queued SG
    
    commit 25dda9fc56bd90d45f9a4516bcfa5211e61b4290 upstream.
    
    The driver incorrectly uses req->num_pending_sgs to track both the
    number of pending and queued SG entries. It only prepares the next
    request if the previous is done, and it doesn't update num_pending_sgs
    until there is TRB completion interrupt. This may starve the controller
    of more TRBs until the num_pending_sgs is decremented.
    
    Fix this by decrementing the num_pending_sgs after they are queued and
    properly track both num_mapped_sgs and num_queued_sgs.
    
    Fixes: c96e6725db9d ("usb: dwc3: gadget: Correct the logic for queuing sgs")
    Cc: <stable@vger.kernel.org>
    Reported-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
    Tested-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
    Acked-by: Felipe Balbi <balbi@kernel.org>
    Signed-off-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
    Link: https://lore.kernel.org/r/ba24591dbcaad8f244a3e88bd449bb7205a5aec3.1620874069.git.Thinh.Nguyen@synopsys.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 2eac817a43d6..1396ee529792 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -1162,6 +1162,7 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep,
 			req->start_sg = sg_next(s);
 
 		req->num_queued_sgs++;
+		req->num_pending_sgs--;
 
 		/*
 		 * The number of pending SG entries may not correspond to the
@@ -1169,7 +1170,7 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep,
 		 * don't include unused SG entries.
 		 */
 		if (length == 0) {
-			req->num_pending_sgs -= req->request.num_mapped_sgs - req->num_queued_sgs;
+			req->num_pending_sgs = 0;
 			break;
 		}
 
@@ -2361,15 +2362,15 @@ static int dwc3_gadget_ep_reclaim_trb_sg(struct dwc3_ep *dep,
 	struct dwc3_trb *trb = &dep->trb_pool[dep->trb_dequeue];
 	struct scatterlist *sg = req->sg;
 	struct scatterlist *s;
-	unsigned int pending = req->num_pending_sgs;
+	unsigned int num_queued = req->num_queued_sgs;
 	unsigned int i;
 	int ret = 0;
 
-	for_each_sg(sg, s, pending, i) {
+	for_each_sg(sg, s, num_queued, i) {
 		trb = &dep->trb_pool[dep->trb_dequeue];
 
 		req->sg = sg_next(s);
-		req->num_pending_sgs--;
+		req->num_queued_sgs--;
 
 		ret = dwc3_gadget_ep_reclaim_completed_trb(dep, req,
 				trb, event, status, true);
@@ -2392,7 +2393,7 @@ static int dwc3_gadget_ep_reclaim_trb_linear(struct dwc3_ep *dep,
 
 static bool dwc3_gadget_ep_request_completed(struct dwc3_request *req)
 {
-	return req->num_pending_sgs == 0;
+	return req->num_pending_sgs == 0 && req->num_queued_sgs == 0;
 }
 
 static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep,
@@ -2401,7 +2402,7 @@ static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep,
 {
 	int ret;
 
-	if (req->num_pending_sgs)
+	if (req->request.num_mapped_sgs)
 		ret = dwc3_gadget_ep_reclaim_trb_sg(dep, req, event,
 				status);
 	else

commit 78000a5b2f0f98bdfb0b73548b3be3cc72e04027
Author: Zolton Jheng <s6668c2t@gmail.com>
Date:   Mon May 10 10:32:00 2021 +0800

    USB: serial: pl2303: add device id for ADLINK ND-6530 GC
    
    commit f8e8c1b2f782e7391e8a1c25648ce756e2a7d481 upstream.
    
    This adds the device id for the ADLINK ND-6530 which is a PL2303GC based
    device.
    
    Signed-off-by: Zolton Jheng <s6668c2t@gmail.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
index 2d78ad2842a4..7df0fbede21b 100644
--- a/drivers/usb/serial/pl2303.c
+++ b/drivers/usb/serial/pl2303.c
@@ -107,6 +107,7 @@ static const struct usb_device_id id_table[] = {
 	{ USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
 	{ USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) },
 	{ USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) },
+	{ USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530GC_PRODUCT_ID) },
 	{ USB_DEVICE(SMART_VENDOR_ID, SMART_PRODUCT_ID) },
 	{ USB_DEVICE(AT_VENDOR_ID, AT_VTKIT3_PRODUCT_ID) },
 	{ }					/* Terminating entry */
diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h
index a897680473a7..3e5442573fe4 100644
--- a/drivers/usb/serial/pl2303.h
+++ b/drivers/usb/serial/pl2303.h
@@ -152,6 +152,7 @@
 /* ADLINK ND-6530 RS232,RS485 and RS422 adapter */
 #define ADLINK_VENDOR_ID		0x0b63
 #define ADLINK_ND6530_PRODUCT_ID	0x6530
+#define ADLINK_ND6530GC_PRODUCT_ID	0x653a
 
 /* SMART USB Serial Adapter */
 #define SMART_VENDOR_ID	0x0b8c

commit a24f21492193209cb1769db32befce9745126988
Author: Dominik Andreas Schorpp <dominik.a.schorpp@ids.de>
Date:   Thu Apr 22 09:58:52 2021 +0200

    USB: serial: ftdi_sio: add IDs for IDS GmbH Products
    
    commit c5a80540e425a5f9a82b0f3163e3b6a4331f33bc upstream.
    
    Add the IDS GmbH Vendor ID and the Product IDs for SI31A (2xRS232)
    and CM31A (LoRaWAN Modem).
    
    Signed-off-by: Dominik Andreas Schorpp <dominik.a.schorpp@ids.de>
    Signed-off-by: Juergen Borleis <jbe@pengutronix.de>
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index a5891cb2c72e..37575d7983c0 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -1024,6 +1024,9 @@ static const struct usb_device_id id_table_combined[] = {
 	/* Sienna devices */
 	{ USB_DEVICE(FTDI_VID, FTDI_SIENNA_PID) },
 	{ USB_DEVICE(ECHELON_VID, ECHELON_U20_PID) },
+	/* IDS GmbH devices */
+	{ USB_DEVICE(IDS_VID, IDS_SI31A_PID) },
+	{ USB_DEVICE(IDS_VID, IDS_CM31A_PID) },
 	/* U-Blox devices */
 	{ USB_DEVICE(UBLOX_VID, UBLOX_C099F9P_ZED_PID) },
 	{ USB_DEVICE(UBLOX_VID, UBLOX_C099F9P_ODIN_PID) },
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h
index 3d47c6d72256..d854e04a4286 100644
--- a/drivers/usb/serial/ftdi_sio_ids.h
+++ b/drivers/usb/serial/ftdi_sio_ids.h
@@ -1567,6 +1567,13 @@
 #define UNJO_VID			0x22B7
 #define UNJO_ISODEBUG_V1_PID		0x150D
 
+/*
+ * IDS GmbH
+ */
+#define IDS_VID				0x2CAF
+#define IDS_SI31A_PID			0x13A2
+#define IDS_CM31A_PID			0x13A3
+
 /*
  * U-Blox products (http://www.u-blox.com).
  */

commit 153a5808b2e11a891341228d4eecad14ec2bb1e2
Author: Daniele Palmas <dnlplm@gmail.com>
Date:   Wed Apr 28 09:26:34 2021 +0200

    USB: serial: option: add Telit LE910-S1 compositions 0x7010, 0x7011
    
    commit e467714f822b5d167a7fb03d34af91b5b6af1827 upstream.
    
    Add support for the following Telit LE910-S1 compositions:
    
    0x7010: rndis, tty, tty, tty
    0x7011: ecm, tty, tty, tty
    
    Signed-off-by: Daniele Palmas <dnlplm@gmail.com>
    Link: https://lore.kernel.org/r/20210428072634.5091-1-dnlplm@gmail.com
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index aeaa3756f6ee..5e3430d456f3 100644
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -1240,6 +1240,10 @@ static const struct usb_device_id option_ids[] = {
 	  .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(TELIT_VENDOR_ID, 0x9010),				/* Telit SBL FN980 flashing device */
 	  .driver_info = NCTRL(0) | ZLP },
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */

commit 8de82ac33b7fea57caa13afe1703d318da88b803
Author: Sean MacLennan <seanm@seanm.ca>
Date:   Sat May 1 20:40:45 2021 -0400

    USB: serial: ti_usb_3410_5052: add startech.com device id
    
    commit 89b1a3d811e6f8065d6ae8a25e7682329b4a31e2 upstream.
    
    This adds support for the Startech.com generic serial to USB converter.
    It seems to be a bone stock TI_3410. I have been using this patch for
    years.
    
    Signed-off-by: Sean MacLennan <seanm@seanm.ca>
    Cc: stable@vger.kernel.org
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c
index c9201e0a8241..ccd516ea2962 100644
--- a/drivers/usb/serial/ti_usb_3410_5052.c
+++ b/drivers/usb/serial/ti_usb_3410_5052.c
@@ -37,6 +37,7 @@
 /* Vendor and product ids */
 #define TI_VENDOR_ID			0x0451
 #define IBM_VENDOR_ID			0x04b3
+#define STARTECH_VENDOR_ID		0x14b0
 #define TI_3410_PRODUCT_ID		0x3410
 #define IBM_4543_PRODUCT_ID		0x4543
 #define IBM_454B_PRODUCT_ID		0x454b
@@ -374,6 +375,7 @@ static const struct usb_device_id ti_id_table_3410[] = {
 	{ USB_DEVICE(MXU1_VENDOR_ID, MXU1_1131_PRODUCT_ID) },
 	{ USB_DEVICE(MXU1_VENDOR_ID, MXU1_1150_PRODUCT_ID) },
 	{ USB_DEVICE(MXU1_VENDOR_ID, MXU1_1151_PRODUCT_ID) },
+	{ USB_DEVICE(STARTECH_VENDOR_ID, TI_3410_PRODUCT_ID) },
 	{ }	/* terminator */
 };
 
@@ -412,6 +414,7 @@ static const struct usb_device_id ti_id_table_combined[] = {
 	{ USB_DEVICE(MXU1_VENDOR_ID, MXU1_1131_PRODUCT_ID) },
 	{ USB_DEVICE(MXU1_VENDOR_ID, MXU1_1150_PRODUCT_ID) },
 	{ USB_DEVICE(MXU1_VENDOR_ID, MXU1_1151_PRODUCT_ID) },
+	{ USB_DEVICE(STARTECH_VENDOR_ID, TI_3410_PRODUCT_ID) },
 	{ }	/* terminator */
 };
 

commit 35265552c7fe9553c75e324c80f45e28ff14eb6e
Author: Zheyu Ma <zheyuma97@gmail.com>
Date:   Fri May 21 06:08:43 2021 +0000

    serial: rp2: use 'request_firmware' instead of 'request_firmware_nowait'
    
    commit 016002848c82eeb5d460489ce392d91fe18c475c upstream.
    
    In 'rp2_probe', the driver registers 'rp2_uart_interrupt' then calls
    'rp2_fw_cb' through 'request_firmware_nowait'. In 'rp2_fw_cb', if the
    firmware don't exists, function just return without initializing ports
    of 'rp2_card'. But now the interrupt handler function has been
    registered, and when an interrupt comes, 'rp2_uart_interrupt' may access
    those ports then causing NULL pointer dereference or other bugs.
    
    Because the driver does some initialization work in 'rp2_fw_cb', in
    order to make the driver ready to handle interrupts, 'request_firmware'
    should be used instead of asynchronous 'request_firmware_nowait'.
    
    This report reveals it:
    
    INFO: trying to register non-static key.
    the code is fine but needs lockdep annotation.
    turning off the locking correctness validator.
    CPU: 2 PID: 0 Comm: swapper/2 Not tainted 4.19.177-gdba4159c14ef-dirty #45
    Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.12.0-59-
    gc9ba5276e321-prebuilt.qemu.org 04/01/2014
    Call Trace:
     <IRQ>
     __dump_stack lib/dump_stack.c:77 [inline]
     dump_stack+0xec/0x156 lib/dump_stack.c:118
     assign_lock_key kernel/locking/lockdep.c:727 [inline]
     register_lock_class+0x14e5/0x1ba0 kernel/locking/lockdep.c:753
     __lock_acquire+0x187/0x3750 kernel/locking/lockdep.c:3303
     lock_acquire+0x124/0x340 kernel/locking/lockdep.c:3907
     __raw_spin_lock include/linux/spinlock_api_smp.h:142 [inline]
     _raw_spin_lock+0x32/0x50 kernel/locking/spinlock.c:144
     spin_lock include/linux/spinlock.h:329 [inline]
     rp2_ch_interrupt drivers/tty/serial/rp2.c:466 [inline]
     rp2_asic_interrupt.isra.9+0x15d/0x990 drivers/tty/serial/rp2.c:493
     rp2_uart_interrupt+0x49/0xe0 drivers/tty/serial/rp2.c:504
     __handle_irq_event_percpu+0xfb/0x770 kernel/irq/handle.c:149
     handle_irq_event_percpu+0x79/0x150 kernel/irq/handle.c:189
     handle_irq_event+0xac/0x140 kernel/irq/handle.c:206
     handle_fasteoi_irq+0x232/0x5c0 kernel/irq/chip.c:725
     generic_handle_irq_desc include/linux/irqdesc.h:155 [inline]
     handle_irq+0x230/0x3a0 arch/x86/kernel/irq_64.c:87
     do_IRQ+0xa7/0x1e0 arch/x86/kernel/irq.c:247
     common_interrupt+0xf/0xf arch/x86/entry/entry_64.S:670
     </IRQ>
    RIP: 0010:native_safe_halt+0x28/0x30 arch/x86/include/asm/irqflags.h:61
    Code: 00 00 55 be 04 00 00 00 48 c7 c7 00 c2 2f 8c 48 89 e5 e8 fb 31 e7 f8
    8b 05 75 af 8d 03 85 c0 7e 07 0f 00 2d 8a 61 65 00 fb f4 <5d> c3 90 90 90
    90 90 90 0f 1f 44 00 00 55 48 89 e5 41 57 41 56 41
    RSP: 0018:ffff88806b71fcc8 EFLAGS: 00000246 ORIG_RAX: ffffffffffffffde
    RAX: 0000000000000000 RBX: ffffffff8bde7e48 RCX: ffffffff88a21285
    RDX: 0000000000000000 RSI: 0000000000000004 RDI: ffffffff8c2fc200
    RBP: ffff88806b71fcc8 R08: fffffbfff185f840 R09: fffffbfff185f840
    R10: 0000000000000001 R11: fffffbfff185f840 R12: 0000000000000002
    R13: ffffffff8bea18a0 R14: 0000000000000000 R15: 0000000000000000
     arch_safe_halt arch/x86/include/asm/paravirt.h:94 [inline]
     default_idle+0x6f/0x360 arch/x86/kernel/process.c:557
     arch_cpu_idle+0xf/0x20 arch/x86/kernel/process.c:548
     default_idle_call+0x3b/0x60 kernel/sched/idle.c:93
     cpuidle_idle_call kernel/sched/idle.c:153 [inline]
     do_idle+0x2ab/0x3c0 kernel/sched/idle.c:263
     cpu_startup_entry+0xcb/0xe0 kernel/sched/idle.c:369
     start_secondary+0x3b8/0x4e0 arch/x86/kernel/smpboot.c:271
     secondary_startup_64+0xa4/0xb0 arch/x86/kernel/head_64.S:243
    BUG: unable to handle kernel NULL pointer dereference at 0000000000000010
    PGD 8000000056d27067 P4D 8000000056d27067 PUD 56d28067 PMD 0
    Oops: 0000 [#1] PREEMPT SMP KASAN PTI
    CPU: 2 PID: 0 Comm: swapper/2 Not tainted 4.19.177-gdba4159c14ef-dirty #45
    Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.12.0-59-
    gc9ba5276e321-prebuilt.qemu.org 04/01/2014
    RIP: 0010:readl arch/x86/include/asm/io.h:59 [inline]
    RIP: 0010:rp2_ch_interrupt drivers/tty/serial/rp2.c:472 [inline]
    RIP: 0010:rp2_asic_interrupt.isra.9+0x181/0x990 drivers/tty/serial/rp2.c:
    493
    Code: df e8 43 5d c2 05 48 8d 83 e8 01 00 00 48 89 85 60 ff ff ff 48 c1 e8
    03 42 80 3c 30 00 0f 85 aa 07 00 00 48 8b 83 e8 01 00 00 <8b> 40 10 89 c1
    89 85 68 ff ff ff 48 8b 83 e8 01 00 00 89 48 10 83
    RSP: 0018:ffff88806c287cd0 EFLAGS: 00010046
    RAX: 0000000000000000 RBX: ffff88806ade6820 RCX: ffffffff814300b1
    RDX: 1ffff1100d5bcd06 RSI: 0000000000000004 RDI: ffff88806ade6820
    RBP: ffff88806c287db8 R08: ffffed100d5bcd05 R09: ffffed100d5bcd05
    R10: 0000000000000001 R11: ffffed100d5bcd04 R12: ffffc90001e00000
    R13: ffff888069654e10 R14: dffffc0000000000 R15: ffff888069654df0
    FS:  0000000000000000(0000) GS:ffff88806c280000(0000) knlGS:
    0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 0000000000000010 CR3: 000000006892c000 CR4: 00000000000006e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
     <IRQ>
     rp2_uart_interrupt+0x49/0xe0 drivers/tty/serial/rp2.c:504
     __handle_irq_event_percpu+0xfb/0x770 kernel/irq/handle.c:149
     handle_irq_event_percpu+0x79/0x150 kernel/irq/handle.c:189
     handle_irq_event+0xac/0x140 kernel/irq/handle.c:206
     handle_fasteoi_irq+0x232/0x5c0 kernel/irq/chip.c:725
     generic_handle_irq_desc include/linux/irqdesc.h:155 [inline]
     handle_irq+0x230/0x3a0 arch/x86/kernel/irq_64.c:87
     do_IRQ+0xa7/0x1e0 arch/x86/kernel/irq.c:247
     common_interrupt+0xf/0xf arch/x86/entry/entry_64.S:670
     </IRQ>
    RIP: 0010:native_safe_halt+0x28/0x30 arch/x86/include/asm/irqflags.h:61
    Code: 00 00 55 be 04 00 00 00 48 c7 c7 00 c2 2f 8c 48 89 e5 e8 fb 31 e7
    f8 8b 05 75 af 8d 03 85 c0 7e 07 0f 00 2d 8a 61 65 00 fb f4 <5d> c3 90
    90 90 90 90 90 0f 1f 44 00 00 55 48 89 e5 41 57 41 56 41
    RSP: 0018:ffff88806b71fcc8 EFLAGS: 00000246 ORIG_RAX: ffffffffffffffde
    RAX: 0000000000000000 RBX: ffffffff8bde7e48 RCX: ffffffff88a21285
    RDX: 0000000000000000 RSI: 0000000000000004 RDI: ffffffff8c2fc200
    RBP: ffff88806b71fcc8 R08: fffffbfff185f840 R09: fffffbfff185f840
    R10: 0000000000000001 R11: fffffbfff185f840 R12: 0000000000000002
    R13: ffffffff8bea18a0 R14: 0000000000000000 R15: 0000000000000000
     arch_safe_halt arch/x86/include/asm/paravirt.h:94 [inline]
     default_idle+0x6f/0x360 arch/x86/kernel/process.c:557
     arch_cpu_idle+0xf/0x20 arch/x86/kernel/process.c:548
     default_idle_call+0x3b/0x60 kernel/sched/idle.c:93
     cpuidle_idle_call kernel/sched/idle.c:153 [inline]
     do_idle+0x2ab/0x3c0 kernel/sched/idle.c:263
     cpu_startup_entry+0xcb/0xe0 kernel/sched/idle.c:369
     start_secondary+0x3b8/0x4e0 arch/x86/kernel/smpboot.c:271
     secondary_startup_64+0xa4/0xb0 arch/x86/kernel/head_64.S:243
    Modules linked in:
    Dumping ftrace buffer:
       (ftrace buffer empty)
    CR2: 0000000000000010
    ---[ end trace 11804dbb55cb1a64 ]---
    RIP: 0010:readl arch/x86/include/asm/io.h:59 [inline]
    RIP: 0010:rp2_ch_interrupt drivers/tty/serial/rp2.c:472 [inline]
    RIP: 0010:rp2_asic_interrupt.isra.9+0x181/0x990 drivers/tty/serial/rp2.c:
    493
    Code: df e8 43 5d c2 05 48 8d 83 e8 01 00 00 48 89 85 60 ff ff ff 48 c1
    e8 03 42 80 3c 30 00 0f 85 aa 07 00 00 48 8b 83 e8 01 00 00 <8b> 40 10 89
    c1 89 85 68 ff ff ff 48 8b 83 e8 01 00 00 89 48 10 83
    RSP: 0018:ffff88806c287cd0 EFLAGS: 00010046
    RAX: 0000000000000000 RBX: ffff88806ade6820 RCX: ffffffff814300b1
    RDX: 1ffff1100d5bcd06 RSI: 0000000000000004 RDI: ffff88806ade6820
    RBP: ffff88806c287db8 R08: ffffed100d5bcd05 R09: ffffed100d5bcd05
    R10: 0000000000000001 R11: ffffed100d5bcd04 R12: ffffc90001e00000
    R13: ffff888069654e10 R14: dffffc0000000000 R15: ffff888069654df0
    FS:  0000000000000000(0000) GS:ffff88806c280000(0000) knlGS:
    0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 0000000000000010 CR3: 000000006892c000 CR4: 00000000000006e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    
    Reported-by: Zheyu Ma <zheyuma97@gmail.com>
    Signed-off-by: Zheyu Ma <zheyuma97@gmail.com>
    Link: https://lore.kernel.org/r/1621577323-1541-1-git-send-email-zheyuma97@gmail.com
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/tty/serial/rp2.c b/drivers/tty/serial/rp2.c
index 5690c09cc041..944a4c010579 100644
--- a/drivers/tty/serial/rp2.c
+++ b/drivers/tty/serial/rp2.c
@@ -195,7 +195,6 @@ struct rp2_card {
 	void __iomem			*bar0;
 	void __iomem			*bar1;
 	spinlock_t			card_lock;
-	struct completion		fw_loaded;
 };
 
 #define RP_ID(prod) PCI_VDEVICE(RP, (prod))
@@ -664,17 +663,10 @@ static void rp2_remove_ports(struct rp2_card *card)
 	card->initialized_ports = 0;
 }
 
-static void rp2_fw_cb(const struct firmware *fw, void *context)
+static int rp2_load_firmware(struct rp2_card *card, const struct firmware *fw)
 {
-	struct rp2_card *card = context;
 	resource_size_t phys_base;
-	int i, rc = -ENOENT;
-
-	if (!fw) {
-		dev_err(&card->pdev->dev, "cannot find '%s' firmware image\n",
-			RP2_FW_NAME);
-		goto no_fw;
-	}
+	int i, rc = 0;
 
 	phys_base = pci_resource_start(card->pdev, 1);
 
@@ -720,23 +712,13 @@ static void rp2_fw_cb(const struct firmware *fw, void *context)
 		card->initialized_ports++;
 	}
 
-	release_firmware(fw);
-no_fw:
-	/*
-	 * rp2_fw_cb() is called from a workqueue long after rp2_probe()
-	 * has already returned success.  So if something failed here,
-	 * we'll just leave the now-dormant device in place until somebody
-	 * unbinds it.
-	 */
-	if (rc)
-		dev_warn(&card->pdev->dev, "driver initialization failed\n");
-
-	complete(&card->fw_loaded);
+	return rc;
 }
 
 static int rp2_probe(struct pci_dev *pdev,
 				   const struct pci_device_id *id)
 {
+	const struct firmware *fw;
 	struct rp2_card *card;
 	struct rp2_uart_port *ports;
 	void __iomem * const *bars;
@@ -747,7 +729,6 @@ static int rp2_probe(struct pci_dev *pdev,
 		return -ENOMEM;
 	pci_set_drvdata(pdev, card);
 	spin_lock_init(&card->card_lock);
-	init_completion(&card->fw_loaded);
 
 	rc = pcim_enable_device(pdev);
 	if (rc)
@@ -780,21 +761,23 @@ static int rp2_probe(struct pci_dev *pdev,
 		return -ENOMEM;
 	card->ports = ports;
 
-	rc = devm_request_irq(&pdev->dev, pdev->irq, rp2_uart_interrupt,
-			      IRQF_SHARED, DRV_NAME, card);
-	if (rc)
+	rc = request_firmware(&fw, RP2_FW_NAME, &pdev->dev);
+	if (rc < 0) {
+		dev_err(&pdev->dev, "cannot find '%s' firmware image\n",
+			RP2_FW_NAME);
 		return rc;
+	}
 
-	/*
-	 * Only catastrophic errors (e.g. ENOMEM) are reported here.
-	 * If the FW image is missing, we'll find out in rp2_fw_cb()
-	 * and print an error message.
-	 */
-	rc = request_firmware_nowait(THIS_MODULE, 1, RP2_FW_NAME, &pdev->dev,
-				     GFP_KERNEL, card, rp2_fw_cb);
+	rc = rp2_load_firmware(card, fw);
+
+	release_firmware(fw);
+	if (rc < 0)
+		return rc;
+
+	rc = devm_request_irq(&pdev->dev, pdev->irq, rp2_uart_interrupt,
+			      IRQF_SHARED, DRV_NAME, card);
 	if (rc)
 		return rc;
-	dev_dbg(&pdev->dev, "waiting for firmware blob...\n");
 
 	return 0;
 }
@@ -803,7 +786,6 @@ static void rp2_remove(struct pci_dev *pdev)
 {
 	struct rp2_card *card = pci_get_drvdata(pdev);
 
-	wait_for_completion(&card->fw_loaded);
 	rp2_remove_ports(card);
 }
 

commit b22a4bc0638d6892941df8ba5c5d2fe5b3e685d9
Author: Geert Uytterhoeven <geert+renesas@glider.be>
Date:   Mon May 10 14:07:55 2021 +0200

    serial: sh-sci: Fix off-by-one error in FIFO threshold register setting
    
    commit 2ea2e019c190ee3973ef7bcaf829d8762e56e635 upstream.
    
    The Receive FIFO Data Count Trigger field (RTRG[6:0]) in the Receive
    FIFO Data Count Trigger Register (HSRTRGR) of HSCIF can only hold values
    ranging from 0-127.  As the FIFO size is equal to 128 on HSCIF, the user
    can write an out-of-range value, touching reserved bits.
    
    Fix this by limiting the trigger value to the FIFO size minus one.
    Reverse the order of the checks, to avoid rx_trig becoming zero if the
    FIFO size is one.
    
    Note that this change has no impact on other SCIF variants, as their
    maximum supported trigger value is lower than the FIFO size anyway, and
    the code below takes care of enforcing these limits.
    
    Fixes: a380ed461f66d1b8 ("serial: sh-sci: implement FIFO threshold register setting")
    Reported-by: Linh Phung <linh.phung.jy@renesas.com>
    Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
    Reviewed-by: Ulrich Hecht <uli+renesas@fpond.eu>
    Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/5eff320aef92ffb33d00e57979fd3603bbb4a70f.1620648218.git.geert+renesas@glider.be
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
index 8aaa7900927a..bfbfe0d68d82 100644
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@ -1026,10 +1026,10 @@ static int scif_set_rtrg(struct uart_port *port, int rx_trig)
 {
 	unsigned int bits;
 
+	if (rx_trig >= port->fifosize)
+		rx_trig = port->fifosize - 1;
 	if (rx_trig < 1)
 		rx_trig = 1;
-	if (rx_trig >= port->fifosize)
-		rx_trig = port->fifosize;
 
 	/* HSCIF can be set to an arbitrary level. */
 	if (sci_getreg(port, HSRTRGR)->size) {

commit 2ab21d6e1411999b5fb43434f421f00bf50002eb
Author: Alan Stern <stern@rowland.harvard.edu>
Date:   Tue May 18 16:18:35 2021 -0400

    USB: usbfs: Don't WARN about excessively large memory allocations
    
    commit 4f2629ea67e7225c3fd292c7fe4f5b3c9d6392de upstream.
    
    Syzbot found that the kernel generates a WARNing if the user tries to
    submit a bulk transfer through usbfs with a buffer that is way too
    large.  This isn't a bug in the kernel; it's merely an invalid request
    from the user and the usbfs code does handle it correctly.
    
    In theory the same thing can happen with async transfers, or with the
    packet descriptor table for isochronous transfers.
    
    To prevent the MM subsystem from complaining about these bad
    allocation requests, add the __GFP_NOWARN flag to the kmalloc calls
    for these buffers.
    
    CC: Andrew Morton <akpm@linux-foundation.org>
    CC: <stable@vger.kernel.org>
    Reported-and-tested-by: syzbot+882a85c0c8ec4a3e2281@syzkaller.appspotmail.com
    Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
    Link: https://lore.kernel.org/r/20210518201835.GA1140918@rowland.harvard.edu
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
index 732e7f1687dd..a45443482e0b 100644
--- a/drivers/usb/core/devio.c
+++ b/drivers/usb/core/devio.c
@@ -1189,7 +1189,12 @@ static int proc_bulk(struct usb_dev_state *ps, void __user *arg)
 	ret = usbfs_increase_memory_usage(len1 + sizeof(struct urb));
 	if (ret)
 		return ret;
-	tbuf = kmalloc(len1, GFP_KERNEL);
+
+	/*
+	 * len1 can be almost arbitrarily large.  Don't WARN if it's
+	 * too big, just fail the request.
+	 */
+	tbuf = kmalloc(len1, GFP_KERNEL | __GFP_NOWARN);
 	if (!tbuf) {
 		ret = -ENOMEM;
 		goto done;
@@ -1631,7 +1636,7 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb
 	if (num_sgs) {
 		as->urb->sg = kmalloc_array(num_sgs,
 					    sizeof(struct scatterlist),
-					    GFP_KERNEL);
+					    GFP_KERNEL | __GFP_NOWARN);
 		if (!as->urb->sg) {
 			ret = -ENOMEM;
 			goto error;
@@ -1666,7 +1671,7 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb
 					(uurb_start - as->usbm->vm_start);
 		} else {
 			as->urb->transfer_buffer = kmalloc(uurb->buffer_length,
-					GFP_KERNEL);
+					GFP_KERNEL | __GFP_NOWARN);
 			if (!as->urb->transfer_buffer) {
 				ret = -ENOMEM;
 				goto error;

commit a1ce679523298ba2b85b9c25a62aeb926c17a92b
Author: Johan Hovold <johan@kernel.org>
Date:   Fri May 21 15:31:09 2021 +0200

    USB: trancevibrator: fix control-request direction
    
    commit 746e4acf87bcacf1406e05ef24a0b7139147c63e upstream.
    
    The direction of the pipe argument must match the request-type direction
    bit or control requests may fail depending on the host-controller-driver
    implementation.
    
    Fix the set-speed request which erroneously used USB_DIR_IN and update
    the default timeout argument to match (same value).
    
    Fixes: 5638e4d92e77 ("USB: add PlayStation 2 Trance Vibrator driver")
    Cc: stable@vger.kernel.org      # 2.6.19
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20210521133109.17396-1-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/misc/trancevibrator.c b/drivers/usb/misc/trancevibrator.c
index b3e1f553954a..ed63e954970a 100644
--- a/drivers/usb/misc/trancevibrator.c
+++ b/drivers/usb/misc/trancevibrator.c
@@ -59,9 +59,9 @@ static ssize_t speed_store(struct device *dev, struct device_attribute *attr,
 	/* Set speed */
 	retval = usb_control_msg(tv->udev, usb_sndctrlpipe(tv->udev, 0),
 				 0x01, /* vendor request: set speed */
-				 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+				 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
 				 tv->speed, /* speed value */
-				 0, NULL, 0, USB_CTRL_GET_TIMEOUT);
+				 0, NULL, 0, USB_CTRL_SET_TIMEOUT);
 	if (retval) {
 		tv->speed = old;
 		dev_dbg(&tv->udev->dev, "retval = %d\n", retval);

commit e95ba554ec505bca2fcafff9f90a22c2b916435a
Author: YueHaibing <yuehaibing@huawei.com>
Date:   Fri May 14 16:02:54 2021 +0800

    iio: adc: ad7793: Add missing error code in ad7793_setup()
    
    commit 4ed243b1da169bcbc1ec5507867e56250c5f1ff9 upstream.
    
    Set error code while device ID query failed.
    
    Fixes: 88bc30548aae ("IIO: ADC: New driver for AD7792/AD7793 3 Channel SPI ADC")
    Signed-off-by: YueHaibing <yuehaibing@huawei.com>
    Cc: <Stable@vger.kernel.org>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iio/adc/ad7793.c b/drivers/iio/adc/ad7793.c
index 23a6e7baa396..b5952ee3031c 100644
--- a/drivers/iio/adc/ad7793.c
+++ b/drivers/iio/adc/ad7793.c
@@ -279,6 +279,7 @@ static int ad7793_setup(struct iio_dev *indio_dev,
 	id &= AD7793_ID_MASK;
 
 	if (id != st->chip_info->id) {
+		ret = -ENODEV;
 		dev_err(&st->sd.spi->dev, "device ID query failed\n");
 		goto out;
 	}

commit accd3ec6c2879c2ed948d1a16eb0ece13c223acc
Author: Lucas Stankus <lucas.p.stankus@gmail.com>
Date:   Tue May 11 17:54:18 2021 -0300

    staging: iio: cdc: ad7746: avoid overwrite of num_channels
    
    commit 04f5b9f539ce314f758d919a14dc7a669f3b7838 upstream.
    
    AD7745 devices don't have the CIN2 pins and therefore can't handle related
    channels. Forcing the number of AD7746 channels may lead to enabling more
    channels than what the hardware actually supports.
    Avoid num_channels being overwritten after first assignment.
    
    Signed-off-by: Lucas Stankus <lucas.p.stankus@gmail.com>
    Fixes: 83e416f458d53 ("staging: iio: adc: Replace, rewrite ad7745 from scratch.")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Cc: <Stable@vger.kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/staging/iio/cdc/ad7746.c b/drivers/staging/iio/cdc/ad7746.c
index f53612a6461d..18a73ee48e7c 100644
--- a/drivers/staging/iio/cdc/ad7746.c
+++ b/drivers/staging/iio/cdc/ad7746.c
@@ -703,7 +703,6 @@ static int ad7746_probe(struct i2c_client *client,
 		indio_dev->num_channels = ARRAY_SIZE(ad7746_channels);
 	else
 		indio_dev->num_channels =  ARRAY_SIZE(ad7746_channels) - 2;
-	indio_dev->num_channels = ARRAY_SIZE(ad7746_channels);
 	indio_dev->modes = INDIO_DIRECT_MODE;
 
 	if (pdata) {

commit 4de2f9caefafd38ac420525adeb9cb61bc5b32ae
Author: Alexander Usyskin <alexander.usyskin@intel.com>
Date:   Wed May 26 22:33:34 2021 +0300

    mei: request autosuspend after sending rx flow control
    
    commit bbf0a94744edfeee298e4a9ab6fd694d639a5cdf upstream.
    
    A rx flow control waiting in the control queue may block autosuspend.
    Re-request autosuspend after flow control been sent to unblock
    the transition to the low power state.
    
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
    Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
    Link: https://lore.kernel.org/r/20210526193334.445759-1-tomas.winkler@intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/misc/mei/interrupt.c b/drivers/misc/mei/interrupt.c
index 5a661cbdf2ae..66f4d12d0060 100644
--- a/drivers/misc/mei/interrupt.c
+++ b/drivers/misc/mei/interrupt.c
@@ -224,6 +224,9 @@ static int mei_cl_irq_read(struct mei_cl *cl, struct mei_cl_cb *cb,
 		return ret;
 	}
 
+	pm_runtime_mark_last_busy(dev->dev);
+	pm_request_autosuspend(dev->dev);
+
 	list_move_tail(&cb->list, &cl->rd_pending);
 
 	return 0;

commit 73d4262de798478a1fc5055fe6f58b507a8315bf
Author: Mathias Nyman <mathias.nyman@linux.intel.com>
Date:   Tue Apr 27 15:48:29 2021 +0300

    thunderbolt: dma_port: Fix NVM read buffer bounds and offset issue
    
    commit b106776080a1cf953a1b2fd50cb2a995db4732be upstream.
    
    Up to 64 bytes of data can be read from NVM in one go. Read address
    must be dword aligned. Data is read into a local buffer.
    
    If caller asks to read data starting at an unaligned address then full
    dword is anyway read from NVM into a local buffer. Data is then copied
    from the local buffer starting at the unaligned offset to the caller
    buffer.
    
    In cases where asked data length + unaligned offset is over 64 bytes
    we need to make sure we don't read past the 64 bytes in the local
    buffer when copying to caller buffer, and make sure that we don't
    skip copying unaligned offset bytes from local buffer anymore after
    the first round of 64 byte NVM data read.
    
    Fixes: 3e13676862f9 ("thunderbolt: Add support for DMA configuration based mailbox")
    Cc: stable@vger.kernel.org
    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/thunderbolt/dma_port.c b/drivers/thunderbolt/dma_port.c
index f2701194f810..994ac759d364 100644
--- a/drivers/thunderbolt/dma_port.c
+++ b/drivers/thunderbolt/dma_port.c
@@ -367,15 +367,15 @@ int dma_port_flash_read(struct tb_dma_port *dma, unsigned int address,
 			void *buf, size_t size)
 {
 	unsigned int retries = DMA_PORT_RETRIES;
-	unsigned int offset;
-
-	offset = address & 3;
-	address = address & ~3;
 
 	do {
-		u32 nbytes = min_t(u32, size, MAIL_DATA_DWORDS * 4);
+		unsigned int offset;
+		size_t nbytes;
 		int ret;
 
+		offset = address & 3;
+		nbytes = min_t(size_t, size + offset, MAIL_DATA_DWORDS * 4);
+
 		ret = dma_port_flash_read_block(dma, address, dma->buf,
 						ALIGN(nbytes, 4));
 		if (ret) {
@@ -387,6 +387,7 @@ int dma_port_flash_read(struct tb_dma_port *dma, unsigned int address,
 			return ret;
 		}
 
+		nbytes -= offset;
 		memcpy(buf, dma->buf + offset, nbytes);
 
 		size -= nbytes;

commit 386918878ce4cd676e4607233866e03c9399a46a
Author: Dongliang Mu <mudongliangabcd@gmail.com>
Date:   Fri May 14 20:43:48 2021 +0800

    misc/uss720: fix memory leak in uss720_probe
    
    commit dcb4b8ad6a448532d8b681b5d1a7036210b622de upstream.
    
    uss720_probe forgets to decrease the refcount of usbdev in uss720_probe.
    Fix this by decreasing the refcount of usbdev by usb_put_dev.
    
    BUG: memory leak
    unreferenced object 0xffff888101113800 (size 2048):
      comm "kworker/0:1", pid 7, jiffies 4294956777 (age 28.870s)
      hex dump (first 32 bytes):
        ff ff ff ff 31 00 00 00 00 00 00 00 00 00 00 00  ....1...........
        00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00  ................
      backtrace:
        [<ffffffff82b8e822>] kmalloc include/linux/slab.h:554 [inline]
        [<ffffffff82b8e822>] kzalloc include/linux/slab.h:684 [inline]
        [<ffffffff82b8e822>] usb_alloc_dev+0x32/0x450 drivers/usb/core/usb.c:582
        [<ffffffff82b98441>] hub_port_connect drivers/usb/core/hub.c:5129 [inline]
        [<ffffffff82b98441>] hub_port_connect_change drivers/usb/core/hub.c:5363 [inline]
        [<ffffffff82b98441>] port_event drivers/usb/core/hub.c:5509 [inline]
        [<ffffffff82b98441>] hub_event+0x1171/0x20c0 drivers/usb/core/hub.c:5591
        [<ffffffff81259229>] process_one_work+0x2c9/0x600 kernel/workqueue.c:2275
        [<ffffffff81259b19>] worker_thread+0x59/0x5d0 kernel/workqueue.c:2421
        [<ffffffff81261228>] kthread+0x178/0x1b0 kernel/kthread.c:292
        [<ffffffff8100227f>] ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:294
    
    Fixes: 0f36163d3abe ("[PATCH] usb: fix uss720 schedule with interrupts off")
    Cc: stable <stable@vger.kernel.org>
    Reported-by: syzbot+636c58f40a86b4a879e7@syzkaller.appspotmail.com
    Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Link: https://lore.kernel.org/r/20210514124348.6587-1-mudongliangabcd@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/misc/uss720.c b/drivers/usb/misc/uss720.c
index b5d661644263..748139d26263 100644
--- a/drivers/usb/misc/uss720.c
+++ b/drivers/usb/misc/uss720.c
@@ -736,6 +736,7 @@ static int uss720_probe(struct usb_interface *intf,
 	parport_announce_port(pp);
 
 	usb_set_intfdata(intf, pp);
+	usb_put_dev(usbdev);
 	return 0;
 
 probe_abort:

commit cc480bc964f589bde5f5a88530ee52f27675278d
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Thu May 20 15:08:39 2021 +0200

    kgdb: fix gcc-11 warnings harder
    
    commit bda7d3ab06f19c02dcef61fefcb9dd954dfd5e4f upstream.
    
    40cc3a80bb42 ("kgdb: fix gcc-11 warning on indentation") tried to fix up
    the gcc-11 complaints in this file by just reformatting the #defines.
    That worked for gcc 11.1.0, but in gcc 11.1.1 as shipped by Fedora 34,
    the warning came back for one of the #defines.
    
    Fix this up again by putting { } around the if statement, now it is
    quiet again.
    
    Fixes: 40cc3a80bb42 ("kgdb: fix gcc-11 warning on indentation")
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Daniel Thompson <daniel.thompson@linaro.org>
    Cc: Jason Wessel <jason.wessel@windriver.com>
    Link: https://lore.kernel.org/r/20210520130839.51987-1-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/misc/kgdbts.c b/drivers/misc/kgdbts.c
index f2cfc9619425..49e08b6133f5 100644
--- a/drivers/misc/kgdbts.c
+++ b/drivers/misc/kgdbts.c
@@ -112,8 +112,9 @@
 		printk(KERN_INFO a);	\
 } while (0)
 #define v2printk(a...) do {		\
-	if (verbose > 1)		\
+	if (verbose > 1) {		\
 		printk(KERN_INFO a);	\
+	}				\
 	touch_nmi_watchdog();		\
 } while (0)
 #define eprintk(a...) do {		\

commit 3fe7be3c1d77af7038ebb3d4972b00ebea5f8183
Author: Mikulas Patocka <mpatocka@redhat.com>
Date:   Tue May 25 13:17:19 2021 -0400

    dm snapshot: properly fix a crash when an origin has no snapshots
    
    commit 7e768532b2396bcb7fbf6f82384b85c0f1d2f197 upstream.
    
    If an origin target has no snapshots, o->split_boundary is set to 0.
    This causes BUG_ON(sectors <= 0) in block/bio.c:bio_split().
    
    Fix this by initializing chunk_size, and in turn split_boundary, to
    rounddown_pow_of_two(UINT_MAX) -- the largest power of two that fits
    into "unsigned" type.
    
    Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Mike Snitzer <snitzer@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c
index 7d9683629471..52101e5c7258 100644
--- a/drivers/md/dm-snap.c
+++ b/drivers/md/dm-snap.c
@@ -794,7 +794,7 @@ static int dm_add_exception(void *context, chunk_t old, chunk_t new)
 static uint32_t __minimum_chunk_size(struct origin *o)
 {
 	struct dm_snapshot *snap;
-	unsigned chunk_size = 0;
+	unsigned chunk_size = rounddown_pow_of_two(UINT_MAX);
 
 	if (o)
 		list_for_each_entry(snap, &o->snapshots, list)

commit d0d46edbe05747b8523fd41db76f0cb02976ec8d
Author: Sriram R <srirrama@codeaurora.org>
Date:   Tue May 11 20:02:57 2021 +0200

    ath10k: Validate first subframe of A-MSDU before processing the list
    
    commit 62a8ff67eba52dae9b107e1fb8827054ed00a265 upstream.
    
    In certain scenarios a normal MSDU can be received as an A-MSDU when
    the A-MSDU present bit of a QoS header gets flipped during reception.
    Since this bit is unauthenticated, the hardware crypto engine can pass
    the frame to the driver without any error indication.
    
    This could result in processing unintended subframes collected in the
    A-MSDU list. Hence, validate A-MSDU list by checking if the first frame
    has a valid subframe header.
    
    Comparing the non-aggregated MSDU and an A-MSDU, the fields of the first
    subframe DA matches the LLC/SNAP header fields of a normal MSDU.
    In order to avoid processing such frames, add a validation to
    filter such A-MSDU frames where the first subframe header DA matches
    with the LLC/SNAP header pattern.
    
    Tested-on: QCA9984 hw1.0 PCI 10.4-3.10-00047
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Sriram R <srirrama@codeaurora.org>
    Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
    Link: https://lore.kernel.org/r/20210511200110.e6f5eb7b9847.I38a77ae26096862527a5eab73caebd7346af8b66@changeid
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c
index 68cda1564c77..0a7551dc0f94 100644
--- a/drivers/net/wireless/ath/ath10k/htt_rx.c
+++ b/drivers/net/wireless/ath/ath10k/htt_rx.c
@@ -1769,14 +1769,62 @@ static void ath10k_htt_rx_h_unchain(struct ath10k *ar,
 	ath10k_unchain_msdu(amsdu, unchain_cnt);
 }
 
+static bool ath10k_htt_rx_validate_amsdu(struct ath10k *ar,
+					 struct sk_buff_head *amsdu)
+{
+	u8 *subframe_hdr;
+	struct sk_buff *first;
+	bool is_first, is_last;
+	struct htt_rx_desc *rxd;
+	struct ieee80211_hdr *hdr;
+	size_t hdr_len, crypto_len;
+	enum htt_rx_mpdu_encrypt_type enctype;
+	int bytes_aligned = ar->hw_params.decap_align_bytes;
+
+	first = skb_peek(amsdu);
+
+	rxd = (void *)first->data - sizeof(*rxd);
+	hdr = (void *)rxd->rx_hdr_status;
+
+	is_first = !!(rxd->msdu_end.common.info0 &
+		      __cpu_to_le32(RX_MSDU_END_INFO0_FIRST_MSDU));
+	is_last = !!(rxd->msdu_end.common.info0 &
+		     __cpu_to_le32(RX_MSDU_END_INFO0_LAST_MSDU));
+
+	/* Return in case of non-aggregated msdu */
+	if (is_first && is_last)
+		return true;
+
+	/* First msdu flag is not set for the first msdu of the list */
+	if (!is_first)
+		return false;
+
+	enctype = MS(__le32_to_cpu(rxd->mpdu_start.info0),
+		     RX_MPDU_START_INFO0_ENCRYPT_TYPE);
+
+	hdr_len = ieee80211_hdrlen(hdr->frame_control);
+	crypto_len = ath10k_htt_rx_crypto_param_len(ar, enctype);
+
+	subframe_hdr = (u8 *)hdr + round_up(hdr_len, bytes_aligned) +
+		       crypto_len;
+
+	/* Validate if the amsdu has a proper first subframe.
+	 * There are chances a single msdu can be received as amsdu when
+	 * the unauthenticated amsdu flag of a QoS header
+	 * gets flipped in non-SPP AMSDU's, in such cases the first
+	 * subframe has llc/snap header in place of a valid da.
+	 * return false if the da matches rfc1042 pattern
+	 */
+	if (ether_addr_equal(subframe_hdr, rfc1042_header))
+		return false;
+
+	return true;
+}
+
 static bool ath10k_htt_rx_amsdu_allowed(struct ath10k *ar,
 					struct sk_buff_head *amsdu,
 					struct ieee80211_rx_status *rx_status)
 {
-	/* FIXME: It might be a good idea to do some fuzzy-testing to drop
-	 * invalid/dangerous frames.
-	 */
-
 	if (!rx_status->freq) {
 		ath10k_dbg(ar, ATH10K_DBG_HTT, "no channel configured; ignoring frame(s)!\n");
 		return false;
@@ -1787,6 +1835,11 @@ static bool ath10k_htt_rx_amsdu_allowed(struct ath10k *ar,
 		return false;
 	}
 
+	if (!ath10k_htt_rx_validate_amsdu(ar, amsdu)) {
+		ath10k_dbg(ar, ATH10K_DBG_HTT, "invalid amsdu received\n");
+		return false;
+	}
+
 	return true;
 }
 

commit 8b8713c47b032088f83385876a0a7beb00a5be89
Author: Wen Gong <wgong@codeaurora.org>
Date:   Tue May 11 20:02:51 2021 +0200

    mac80211: extend protection against mixed key and fragment cache attacks
    
    commit 3edc6b0d6c061a70d8ca3c3c72eb1f58ce29bfb1 upstream.
    
    For some chips/drivers, e.g., QCA6174 with ath10k, the decryption is
    done by the hardware, and the Protected bit in the Frame Control field
    is cleared in the lower level driver before the frame is passed to
    mac80211. In such cases, the condition for ieee80211_has_protected() is
    not met in ieee80211_rx_h_defragment() of mac80211 and the new security
    validation steps are not executed.
    
    Extend mac80211 to cover the case where the Protected bit has been
    cleared, but the frame is indicated as having been decrypted by the
    hardware. This extends protection against mixed key and fragment cache
    attack for additional drivers/chips. This fixes CVE-2020-24586 and
    CVE-2020-24587 for such cases.
    
    Tested-on: QCA6174 hw3.2 PCI WLAN.RM.4.4.1-00110-QCARMSWP-1
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Wen Gong <wgong@codeaurora.org>
    Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
    Link: https://lore.kernel.org/r/20210511200110.037aa5ca0390.I7bb888e2965a0db02a67075fcb5deb50eb7408aa@changeid
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 6705a104e4a3..2ba19decb126 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -2113,6 +2113,7 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
 	unsigned int frag, seq;
 	struct ieee80211_fragment_entry *entry;
 	struct sk_buff *skb;
+	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);
 
 	hdr = (struct ieee80211_hdr *)rx->skb->data;
 	fc = hdr->frame_control;
@@ -2171,7 +2172,9 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
 				     sizeof(rx->key->u.gcmp.rx_pn[queue]));
 			BUILD_BUG_ON(IEEE80211_CCMP_PN_LEN !=
 				     IEEE80211_GCMP_PN_LEN);
-		} else if (rx->key && ieee80211_has_protected(fc)) {
+		} else if (rx->key &&
+			   (ieee80211_has_protected(fc) ||
+			    (status->flag & RX_FLAG_DECRYPTED))) {
 			entry->is_protected = true;
 			entry->key_color = rx->key->color;
 		}
@@ -2216,13 +2219,19 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
 			return RX_DROP_UNUSABLE;
 		memcpy(entry->last_pn, pn, IEEE80211_CCMP_PN_LEN);
 	} else if (entry->is_protected &&
-		   (!rx->key || !ieee80211_has_protected(fc) ||
+		   (!rx->key ||
+		    (!ieee80211_has_protected(fc) &&
+		     !(status->flag & RX_FLAG_DECRYPTED)) ||
 		    rx->key->color != entry->key_color)) {
 		/* Drop this as a mixed key or fragment cache attack, even
 		 * if for TKIP Michael MIC should protect us, and WEP is a
 		 * lost cause anyway.
 		 */
 		return RX_DROP_UNUSABLE;
+	} else if (entry->is_protected && rx->key &&
+		   entry->key_color != rx->key->color &&
+		   (status->flag & RX_FLAG_DECRYPTED)) {
+		return RX_DROP_UNUSABLE;
 	}
 
 	skb_pull(rx->skb, ieee80211_hdrlen(fc));

commit 24347f561816634ab780bf7e03deeb049898b3bc
Author: Johannes Berg <johannes.berg@intel.com>
Date:   Tue May 11 20:02:50 2021 +0200

    mac80211: do not accept/forward invalid EAPOL frames
    
    commit a8c4d76a8dd4fb9666fc8919a703d85fb8f44ed8 upstream.
    
    EAPOL frames are used for authentication and key management between the
    AP and each individual STA associated in the BSS. Those frames are not
    supposed to be sent by one associated STA to another associated STA
    (either unicast for broadcast/multicast).
    
    Similarly, in 802.11 they're supposed to be sent to the authenticator
    (AP) address.
    
    Since it is possible for unexpected EAPOL frames to result in misbehavior
    in supplicant implementations, it is better for the AP to not allow such
    cases to be forwarded to other clients either directly, or indirectly if
    the AP interface is part of a bridge.
    
    Accept EAPOL (control port) frames only if they're transmitted to the
    own address, or, due to interoperability concerns, to the PAE group
    address.
    
    Disable forwarding of EAPOL (or well, the configured control port
    protocol) frames back to wireless medium in all cases. Previously, these
    frames were accepted from fully authenticated and authorized stations
    and also from unauthenticated stations for one of the cases.
    
    Additionally, to avoid forwarding by the bridge, rewrite the PAE group
    address case to the local MAC address.
    
    Cc: stable@vger.kernel.org
    Co-developed-by: Jouni Malinen <jouni@codeaurora.org>
    Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
    Link: https://lore.kernel.org/r/20210511200110.cb327ed0cabe.Ib7dcffa2a31f0913d660de65ba3c8aca75b1d10f@changeid
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 6db71e0b8376..6705a104e4a3 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -2408,13 +2408,13 @@ static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx, __le16 fc)
 	struct ethhdr *ehdr = (struct ethhdr *) rx->skb->data;
 
 	/*
-	 * Allow EAPOL frames to us/the PAE group address regardless
-	 * of whether the frame was encrypted or not.
+	 * Allow EAPOL frames to us/the PAE group address regardless of
+	 * whether the frame was encrypted or not, and always disallow
+	 * all other destination addresses for them.
 	 */
-	if (ehdr->h_proto == rx->sdata->control_port_protocol &&
-	    (ether_addr_equal(ehdr->h_dest, rx->sdata->vif.addr) ||
-	     ether_addr_equal(ehdr->h_dest, pae_group_addr)))
-		return true;
+	if (unlikely(ehdr->h_proto == rx->sdata->control_port_protocol))
+		return ether_addr_equal(ehdr->h_dest, rx->sdata->vif.addr) ||
+		       ether_addr_equal(ehdr->h_dest, pae_group_addr);
 
 	if (ieee80211_802_1x_port_control(rx) ||
 	    ieee80211_drop_unencrypted(rx, fc))
@@ -2438,8 +2438,28 @@ static void ieee80211_deliver_skb_to_local_stack(struct sk_buff *skb,
 		cfg80211_rx_control_port(dev, skb, noencrypt);
 		dev_kfree_skb(skb);
 	} else {
+		struct ethhdr *ehdr = (void *)skb_mac_header(skb);
+
 		memset(skb->cb, 0, sizeof(skb->cb));
 
+		/*
+		 * 802.1X over 802.11 requires that the authenticator address
+		 * be used for EAPOL frames. However, 802.1X allows the use of
+		 * the PAE group address instead. If the interface is part of
+		 * a bridge and we pass the frame with the PAE group address,
+		 * then the bridge will forward it to the network (even if the
+		 * client was not associated yet), which isn't supposed to
+		 * happen.
+		 * To avoid that, rewrite the destination address to our own
+		 * address, so that the authenticator (e.g. hostapd) will see
+		 * the frame, but bridge won't forward it anywhere else. Note
+		 * that due to earlier filtering, the only other address can
+		 * be the PAE group address.
+		 */
+		if (unlikely(skb->protocol == sdata->control_port_protocol &&
+			     !ether_addr_equal(ehdr->h_dest, sdata->vif.addr)))
+			ether_addr_copy(ehdr->h_dest, sdata->vif.addr);
+
 		/* deliver to local stack */
 		if (rx->napi)
 			napi_gro_receive(rx->napi, skb);
@@ -2479,6 +2499,7 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx)
 	if ((sdata->vif.type == NL80211_IFTYPE_AP ||
 	     sdata->vif.type == NL80211_IFTYPE_AP_VLAN) &&
 	    !(sdata->flags & IEEE80211_SDATA_DONT_BRIDGE_PACKETS) &&
+	    ehdr->h_proto != rx->sdata->control_port_protocol &&
 	    (sdata->vif.type != NL80211_IFTYPE_AP_VLAN || !sdata->u.vlan.sta)) {
 		if (is_multicast_ether_addr(ehdr->h_dest) &&
 		    ieee80211_vif_get_num_mcast_if(sdata) != 0) {

commit 059e9ee62166a4d7393ed879a2b7e2d8561ad450
Author: Johannes Berg <johannes.berg@intel.com>
Date:   Tue May 11 20:02:49 2021 +0200

    mac80211: prevent attacks on TKIP/WEP as well
    
    commit 7e44a0b597f04e67eee8cdcbe7ee706c6f5de38b upstream.
    
    Similar to the issues fixed in previous patches, TKIP and WEP
    should be protected even if for TKIP we have the Michael MIC
    protecting it, and WEP is broken anyway.
    
    However, this also somewhat protects potential other algorithms
    that drivers might implement.
    
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210511200110.430e8c202313.Ia37e4e5b6b3eaab1a5ae050e015f6c92859dbe27@changeid
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index bfb9d9db8aff..6db71e0b8376 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -2158,6 +2158,7 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
 			 * next fragment has a sequential PN value.
 			 */
 			entry->check_sequential_pn = true;
+			entry->is_protected = true;
 			entry->key_color = rx->key->color;
 			memcpy(entry->last_pn,
 			       rx->key->u.ccmp.rx_pn[queue],
@@ -2170,6 +2171,9 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
 				     sizeof(rx->key->u.gcmp.rx_pn[queue]));
 			BUILD_BUG_ON(IEEE80211_CCMP_PN_LEN !=
 				     IEEE80211_GCMP_PN_LEN);
+		} else if (rx->key && ieee80211_has_protected(fc)) {
+			entry->is_protected = true;
+			entry->key_color = rx->key->color;
 		}
 		return RX_QUEUED;
 	}
@@ -2211,6 +2215,14 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
 		if (memcmp(pn, rpn, IEEE80211_CCMP_PN_LEN))
 			return RX_DROP_UNUSABLE;
 		memcpy(entry->last_pn, pn, IEEE80211_CCMP_PN_LEN);
+	} else if (entry->is_protected &&
+		   (!rx->key || !ieee80211_has_protected(fc) ||
+		    rx->key->color != entry->key_color)) {
+		/* Drop this as a mixed key or fragment cache attack, even
+		 * if for TKIP Michael MIC should protect us, and WEP is a
+		 * lost cause anyway.
+		 */
+		return RX_DROP_UNUSABLE;
 	}
 
 	skb_pull(rx->skb, ieee80211_hdrlen(fc));
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
index b6e37af56146..c33bc5fc0f2d 100644
--- a/net/mac80211/sta_info.h
+++ b/net/mac80211/sta_info.h
@@ -429,7 +429,8 @@ struct ieee80211_fragment_entry {
 	u16 extra_len;
 	u16 last_frag;
 	u8 rx_queue;
-	bool check_sequential_pn; /* needed for CCMP/GCMP */
+	u8 check_sequential_pn:1, /* needed for CCMP/GCMP */
+	   is_protected:1;
 	u8 last_pn[6]; /* PN of the last fragment if CCMP was used */
 	unsigned int key_color;
 };

commit 0f716b48ed25503e6961f4b5b40ece36f7e4ed26
Author: Johannes Berg <johannes.berg@intel.com>
Date:   Tue May 11 20:02:48 2021 +0200

    mac80211: check defrag PN against current frame
    
    commit bf30ca922a0c0176007e074b0acc77ed345e9990 upstream.
    
    As pointed out by Mathy Vanhoef, we implement the RX PN check
    on fragmented frames incorrectly - we check against the last
    received PN prior to the new frame, rather than to the one in
    this frame itself.
    
    Prior patches addressed the security issue here, but in order
    to be able to reason better about the code, fix it to really
    compare against the current frame's PN, not the last stored
    one.
    
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210511200110.bfbc340ff071.Id0b690e581da7d03d76df90bb0e3fd55930bc8a0@changeid
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index 6bfd31657f40..6c9d9c94983b 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -225,8 +225,15 @@ struct ieee80211_rx_data {
 	 */
 	int security_idx;
 
-	u32 tkip_iv32;
-	u16 tkip_iv16;
+	union {
+		struct {
+			u32 iv32;
+			u16 iv16;
+		} tkip;
+		struct {
+			u8 pn[IEEE80211_CCMP_PN_LEN];
+		} ccm_gcm;
+	};
 };
 
 struct ieee80211_csa_settings {
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 21ce593c732b..bfb9d9db8aff 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -2192,7 +2192,6 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
 	if (entry->check_sequential_pn) {
 		int i;
 		u8 pn[IEEE80211_CCMP_PN_LEN], *rpn;
-		int queue;
 
 		if (!requires_sequential_pn(rx, fc))
 			return RX_DROP_UNUSABLE;
@@ -2207,8 +2206,8 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
 			if (pn[i])
 				break;
 		}
-		queue = rx->security_idx;
-		rpn = rx->key->u.ccmp.rx_pn[queue];
+
+		rpn = rx->ccm_gcm.pn;
 		if (memcmp(pn, rpn, IEEE80211_CCMP_PN_LEN))
 			return RX_DROP_UNUSABLE;
 		memcpy(entry->last_pn, pn, IEEE80211_CCMP_PN_LEN);
diff --git a/net/mac80211/wpa.c b/net/mac80211/wpa.c
index 5dd48f0a4b1b..dbeccccf0fdf 100644
--- a/net/mac80211/wpa.c
+++ b/net/mac80211/wpa.c
@@ -2,6 +2,7 @@
  * Copyright 2002-2004, Instant802 Networks, Inc.
  * Copyright 2008, Jouni Malinen <j@w1.fi>
  * Copyright (C) 2016-2017 Intel Deutschland GmbH
+ * Copyright (C) 2020-2021 Intel Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -170,8 +171,8 @@ ieee80211_rx_h_michael_mic_verify(struct ieee80211_rx_data *rx)
 
 update_iv:
 	/* update IV in key information to be able to detect replays */
-	rx->key->u.tkip.rx[rx->security_idx].iv32 = rx->tkip_iv32;
-	rx->key->u.tkip.rx[rx->security_idx].iv16 = rx->tkip_iv16;
+	rx->key->u.tkip.rx[rx->security_idx].iv32 = rx->tkip.iv32;
+	rx->key->u.tkip.rx[rx->security_idx].iv16 = rx->tkip.iv16;
 
 	return RX_CONTINUE;
 
@@ -297,8 +298,8 @@ ieee80211_crypto_tkip_decrypt(struct ieee80211_rx_data *rx)
 					  key, skb->data + hdrlen,
 					  skb->len - hdrlen, rx->sta->sta.addr,
 					  hdr->addr1, hwaccel, rx->security_idx,
-					  &rx->tkip_iv32,
-					  &rx->tkip_iv16);
+					  &rx->tkip.iv32,
+					  &rx->tkip.iv16);
 	if (res != TKIP_DECRYPT_OK)
 		return RX_DROP_UNUSABLE;
 
@@ -556,6 +557,8 @@ ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx,
 		}
 
 		memcpy(key->u.ccmp.rx_pn[queue], pn, IEEE80211_CCMP_PN_LEN);
+		if (unlikely(ieee80211_is_frag(hdr)))
+			memcpy(rx->ccm_gcm.pn, pn, IEEE80211_CCMP_PN_LEN);
 	}
 
 	/* Remove CCMP header and MIC */
@@ -784,6 +787,8 @@ ieee80211_crypto_gcmp_decrypt(struct ieee80211_rx_data *rx)
 		}
 
 		memcpy(key->u.gcmp.rx_pn[queue], pn, IEEE80211_GCMP_PN_LEN);
+		if (unlikely(ieee80211_is_frag(hdr)))
+			memcpy(rx->ccm_gcm.pn, pn, IEEE80211_CCMP_PN_LEN);
 	}
 
 	/* Remove GCMP header and MIC */

commit 6f1451fd4133911f765d47c8c588cf8c6853fbc5
Author: Johannes Berg <johannes.berg@intel.com>
Date:   Tue May 11 20:02:47 2021 +0200

    mac80211: add fragment cache to sta_info
    
    commit 3a11ce08c45b50d69c891d71760b7c5b92074709 upstream.
    
    Prior patches protected against fragmentation cache attacks
    by coloring keys, but this shows that it can lead to issues
    when multiple stations use the same sequence number. Add a
    fragment cache to struct sta_info (in addition to the one in
    the interface) to separate fragments for different stations
    properly.
    
    This then automatically clear most of the fragment cache when a
    station disconnects (or reassociates) from an AP, or when client
    interfaces disconnect from the network, etc.
    
    On the way, also fix the comment there since this brings us in line
    with the recommendation in 802.11-2016 ("An AP should support ...").
    Additionally, remove a useless condition (since there's no problem
    purging an already empty list).
    
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210511200110.fc35046b0d52.I1ef101e3784d13e8f6600d83de7ec9a3a45bcd52@changeid
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index db113013416c..6bfd31657f40 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -53,12 +53,6 @@ struct ieee80211_local;
 #define IEEE80211_ENCRYPT_HEADROOM 8
 #define IEEE80211_ENCRYPT_TAILROOM 18
 
-/* IEEE 802.11 (Ch. 9.5 Defragmentation) requires support for concurrent
- * reception of at least three fragmented frames. This limit can be increased
- * by changing this define, at the cost of slower frame reassembly and
- * increased memory use (about 2 kB of RAM per entry). */
-#define IEEE80211_FRAGMENT_MAX 4
-
 /* power level hasn't been configured (or set to automatic) */
 #define IEEE80211_UNSET_POWER_LEVEL	INT_MIN
 
@@ -91,19 +85,6 @@ extern const u8 ieee80211_ac_to_qos_mask[IEEE80211_NUM_ACS];
 
 #define IEEE80211_MAX_NAN_INSTANCE_ID 255
 
-struct ieee80211_fragment_entry {
-	struct sk_buff_head skb_list;
-	unsigned long first_frag_time;
-	u16 seq;
-	u16 extra_len;
-	u16 last_frag;
-	u8 rx_queue;
-	bool check_sequential_pn; /* needed for CCMP/GCMP */
-	u8 last_pn[6]; /* PN of the last fragment if CCMP was used */
-	unsigned int key_color;
-};
-
-
 struct ieee80211_bss {
 	u32 device_ts_beacon, device_ts_presp;
 
@@ -885,9 +866,7 @@ struct ieee80211_sub_if_data {
 
 	char name[IFNAMSIZ];
 
-	/* Fragment table for host-based reassembly */
-	struct ieee80211_fragment_entry	fragments[IEEE80211_FRAGMENT_MAX];
-	unsigned int fragment_next;
+	struct ieee80211_fragment_cache frags;
 
 	/* TID bitmap for NoAck policy */
 	u16 noack_map;
@@ -2205,4 +2184,7 @@ extern const struct ethtool_ops ieee80211_ethtool_ops;
 #define debug_noinline
 #endif
 
+void ieee80211_init_frag_cache(struct ieee80211_fragment_cache *cache);
+void ieee80211_destroy_frag_cache(struct ieee80211_fragment_cache *cache);
+
 #endif /* IEEE80211_I_H */
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index 511ca6f74239..358028a09ce4 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -7,7 +7,7 @@
  * Copyright 2008, Johannes Berg <johannes@sipsolutions.net>
  * Copyright 2013-2014  Intel Mobile Communications GmbH
  * Copyright (c) 2016        Intel Deutschland GmbH
- * Copyright (C) 2018 Intel Corporation
+ * Copyright (C) 2018-2021 Intel Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -1111,16 +1111,12 @@ static void ieee80211_set_multicast_list(struct net_device *dev)
  */
 static void ieee80211_teardown_sdata(struct ieee80211_sub_if_data *sdata)
 {
-	int i;
-
 	/* free extra data */
 	ieee80211_free_keys(sdata, false);
 
 	ieee80211_debugfs_remove_netdev(sdata);
 
-	for (i = 0; i < IEEE80211_FRAGMENT_MAX; i++)
-		__skb_queue_purge(&sdata->fragments[i].skb_list);
-	sdata->fragment_next = 0;
+	ieee80211_destroy_frag_cache(&sdata->frags);
 
 	if (ieee80211_vif_is_mesh(&sdata->vif))
 		ieee80211_mesh_teardown_sdata(sdata);
@@ -1832,8 +1828,7 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
 	sdata->wdev.wiphy = local->hw.wiphy;
 	sdata->local = local;
 
-	for (i = 0; i < IEEE80211_FRAGMENT_MAX; i++)
-		skb_queue_head_init(&sdata->fragments[i].skb_list);
+	ieee80211_init_frag_cache(&sdata->frags);
 
 	INIT_LIST_HEAD(&sdata->key_list);
 
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 2e79182afc4f..21ce593c732b 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -2009,19 +2009,34 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
 	return result;
 }
 
+void ieee80211_init_frag_cache(struct ieee80211_fragment_cache *cache)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(cache->entries); i++)
+		skb_queue_head_init(&cache->entries[i].skb_list);
+}
+
+void ieee80211_destroy_frag_cache(struct ieee80211_fragment_cache *cache)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(cache->entries); i++)
+		__skb_queue_purge(&cache->entries[i].skb_list);
+}
+
 static inline struct ieee80211_fragment_entry *
-ieee80211_reassemble_add(struct ieee80211_sub_if_data *sdata,
+ieee80211_reassemble_add(struct ieee80211_fragment_cache *cache,
 			 unsigned int frag, unsigned int seq, int rx_queue,
 			 struct sk_buff **skb)
 {
 	struct ieee80211_fragment_entry *entry;
 
-	entry = &sdata->fragments[sdata->fragment_next++];
-	if (sdata->fragment_next >= IEEE80211_FRAGMENT_MAX)
-		sdata->fragment_next = 0;
+	entry = &cache->entries[cache->next++];
+	if (cache->next >= IEEE80211_FRAGMENT_MAX)
+		cache->next = 0;
 
-	if (!skb_queue_empty(&entry->skb_list))
-		__skb_queue_purge(&entry->skb_list);
+	__skb_queue_purge(&entry->skb_list);
 
 	__skb_queue_tail(&entry->skb_list, *skb); /* no need for locking */
 	*skb = NULL;
@@ -2036,14 +2051,14 @@ ieee80211_reassemble_add(struct ieee80211_sub_if_data *sdata,
 }
 
 static inline struct ieee80211_fragment_entry *
-ieee80211_reassemble_find(struct ieee80211_sub_if_data *sdata,
+ieee80211_reassemble_find(struct ieee80211_fragment_cache *cache,
 			  unsigned int frag, unsigned int seq,
 			  int rx_queue, struct ieee80211_hdr *hdr)
 {
 	struct ieee80211_fragment_entry *entry;
 	int i, idx;
 
-	idx = sdata->fragment_next;
+	idx = cache->next;
 	for (i = 0; i < IEEE80211_FRAGMENT_MAX; i++) {
 		struct ieee80211_hdr *f_hdr;
 
@@ -2051,7 +2066,7 @@ ieee80211_reassemble_find(struct ieee80211_sub_if_data *sdata,
 		if (idx < 0)
 			idx = IEEE80211_FRAGMENT_MAX - 1;
 
-		entry = &sdata->fragments[idx];
+		entry = &cache->entries[idx];
 		if (skb_queue_empty(&entry->skb_list) || entry->seq != seq ||
 		    entry->rx_queue != rx_queue ||
 		    entry->last_frag + 1 != frag)
@@ -2091,6 +2106,7 @@ static bool requires_sequential_pn(struct ieee80211_rx_data *rx, __le16 fc)
 static ieee80211_rx_result debug_noinline
 ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
 {
+	struct ieee80211_fragment_cache *cache = &rx->sdata->frags;
 	struct ieee80211_hdr *hdr;
 	u16 sc;
 	__le16 fc;
@@ -2112,6 +2128,9 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
 		goto out_no_led;
 	}
 
+	if (rx->sta)
+		cache = &rx->sta->frags;
+
 	if (likely(!ieee80211_has_morefrags(fc) && frag == 0))
 		goto out;
 
@@ -2130,7 +2149,7 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
 
 	if (frag == 0) {
 		/* This is the first fragment of a new frame. */
-		entry = ieee80211_reassemble_add(rx->sdata, frag, seq,
+		entry = ieee80211_reassemble_add(cache, frag, seq,
 						 rx->seqno_idx, &(rx->skb));
 		if (requires_sequential_pn(rx, fc)) {
 			int queue = rx->security_idx;
@@ -2158,7 +2177,7 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
 	/* This is a fragment for a frame that should already be pending in
 	 * fragment cache. Add this fragment to the end of the pending entry.
 	 */
-	entry = ieee80211_reassemble_find(rx->sdata, frag, seq,
+	entry = ieee80211_reassemble_find(cache, frag, seq,
 					  rx->seqno_idx, hdr);
 	if (!entry) {
 		I802_DEBUG_INC(rx->local->rx_handlers_drop_defrag);
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
index c0fae954082b..71c6a462277f 100644
--- a/net/mac80211/sta_info.c
+++ b/net/mac80211/sta_info.c
@@ -3,7 +3,7 @@
  * Copyright 2006-2007	Jiri Benc <jbenc@suse.cz>
  * Copyright 2013-2014  Intel Mobile Communications GmbH
  * Copyright (C) 2015 - 2017 Intel Deutschland GmbH
- * Copyright (C) 2018-2020 Intel Corporation
+ * Copyright (C) 2018-2021 Intel Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -369,6 +369,8 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
 
 	u64_stats_init(&sta->rx_stats.syncp);
 
+	ieee80211_init_frag_cache(&sta->frags);
+
 	sta->sta_state = IEEE80211_STA_NONE;
 
 	/* Mark TID as unreserved */
@@ -1032,6 +1034,8 @@ static void __sta_info_destroy_part2(struct sta_info *sta)
 	rate_control_remove_sta_debugfs(sta);
 	ieee80211_sta_debugfs_remove(sta);
 
+	ieee80211_destroy_frag_cache(&sta->frags);
+
 	cleanup_single_sta(sta);
 }
 
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
index 9a04327d71d1..b6e37af56146 100644
--- a/net/mac80211/sta_info.h
+++ b/net/mac80211/sta_info.h
@@ -2,6 +2,7 @@
  * Copyright 2002-2005, Devicescape Software, Inc.
  * Copyright 2013-2014  Intel Mobile Communications GmbH
  * Copyright(c) 2015-2017 Intel Deutschland GmbH
+ * Copyright(c) 2020-2021 Intel Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -411,6 +412,33 @@ struct ieee80211_sta_rx_stats {
 	u64 msdu[IEEE80211_NUM_TIDS + 1];
 };
 
+/*
+ * IEEE 802.11-2016 (10.6 "Defragmentation") recommends support for "concurrent
+ * reception of at least one MSDU per access category per associated STA"
+ * on APs, or "at least one MSDU per access category" on other interface types.
+ *
+ * This limit can be increased by changing this define, at the cost of slower
+ * frame reassembly and increased memory use while fragments are pending.
+ */
+#define IEEE80211_FRAGMENT_MAX 4
+
+struct ieee80211_fragment_entry {
+	struct sk_buff_head skb_list;
+	unsigned long first_frag_time;
+	u16 seq;
+	u16 extra_len;
+	u16 last_frag;
+	u8 rx_queue;
+	bool check_sequential_pn; /* needed for CCMP/GCMP */
+	u8 last_pn[6]; /* PN of the last fragment if CCMP was used */
+	unsigned int key_color;
+};
+
+struct ieee80211_fragment_cache {
+	struct ieee80211_fragment_entry	entries[IEEE80211_FRAGMENT_MAX];
+	unsigned int next;
+};
+
 /*
  * The bandwidth threshold below which the per-station CoDel parameters will be
  * scaled to be more lenient (to prevent starvation of slow stations). This
@@ -482,6 +510,7 @@ struct ieee80211_sta_rx_stats {
  * @pcpu_rx_stats: per-CPU RX statistics, assigned only if the driver needs
  *	this (by advertising the USES_RSS hw flag)
  * @status_stats: TX status statistics
+ * @frags: fragment cache
  */
 struct sta_info {
 	/* General information, mostly static */
@@ -583,6 +612,8 @@ struct sta_info {
 
 	struct cfg80211_chan_def tdls_chandef;
 
+	struct ieee80211_fragment_cache frags;
+
 	/* keep last! */
 	struct ieee80211_sta sta;
 };

commit ecefa9018e091c941d87e290f8f038675355c57d
Author: Johannes Berg <johannes.berg@intel.com>
Date:   Tue May 11 20:02:46 2021 +0200

    mac80211: drop A-MSDUs on old ciphers
    
    commit 270032a2a9c4535799736142e1e7c413ca7b836e upstream.
    
    With old ciphers (WEP and TKIP) we shouldn't be using A-MSDUs
    since A-MSDUs are only supported if we know that they are, and
    the only practical way for that is HT support which doesn't
    support old ciphers.
    
    However, we would normally accept them anyway. Since we check
    the MMIC before deaggregating A-MSDUs, and the A-MSDU bit in
    the QoS header is not protected in TKIP (or WEP), this enables
    attacks similar to CVE-2020-24588. To prevent that, drop A-MSDUs
    completely with old ciphers.
    
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210511200110.076543300172.I548e6e71f1ee9cad4b9a37bf212ae7db723587aa@changeid
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 783bbd2c62eb..2e79182afc4f 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -5,7 +5,7 @@
  * Copyright 2007-2010	Johannes Berg <johannes@sipsolutions.net>
  * Copyright 2013-2014  Intel Mobile Communications GmbH
  * Copyright(c) 2015 - 2017 Intel Deutschland GmbH
- * Copyright (C) 2018 Intel Corporation
+ * Copyright (C) 2018-2021 Intel Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -2614,6 +2614,23 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx)
 	if (is_multicast_ether_addr(hdr->addr1))
 		return RX_DROP_UNUSABLE;
 
+	if (rx->key) {
+		/*
+		 * We should not receive A-MSDUs on pre-HT connections,
+		 * and HT connections cannot use old ciphers. Thus drop
+		 * them, as in those cases we couldn't even have SPP
+		 * A-MSDUs or such.
+		 */
+		switch (rx->key->conf.cipher) {
+		case WLAN_CIPHER_SUITE_WEP40:
+		case WLAN_CIPHER_SUITE_WEP104:
+		case WLAN_CIPHER_SUITE_TKIP:
+			return RX_DROP_UNUSABLE;
+		default:
+			break;
+		}
+	}
+
 	return __ieee80211_rx_h_amsdu(rx, 0);
 }
 

commit 8ea9e997642360ea097710cfa7b1cd750a73fe64
Author: Mathy Vanhoef <Mathy.Vanhoef@kuleuven.be>
Date:   Tue May 11 20:02:45 2021 +0200

    cfg80211: mitigate A-MSDU aggregation attacks
    
    commit 2b8a1fee3488c602aca8bea004a087e60806a5cf upstream.
    
    Mitigate A-MSDU injection attacks (CVE-2020-24588) by detecting if the
    destination address of a subframe equals an RFC1042 (i.e., LLC/SNAP)
    header, and if so dropping the complete A-MSDU frame. This mitigates
    known attacks, although new (unknown) aggregation-based attacks may
    remain possible.
    
    This defense works because in A-MSDU aggregation injection attacks, a
    normal encrypted Wi-Fi frame is turned into an A-MSDU frame. This means
    the first 6 bytes of the first A-MSDU subframe correspond to an RFC1042
    header. In other words, the destination MAC address of the first A-MSDU
    subframe contains the start of an RFC1042 header during an aggregation
    attack. We can detect this and thereby prevent this specific attack.
    For details, see Section 7.2 of "Fragment and Forge: Breaking Wi-Fi
    Through Frame Aggregation and Fragmentation".
    
    Note that for kernel 4.9 and above this patch depends on "mac80211:
    properly handle A-MSDUs that start with a rfc1042 header". Otherwise
    this patch has no impact and attacks will remain possible.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Mathy Vanhoef <Mathy.Vanhoef@kuleuven.be>
    Link: https://lore.kernel.org/r/20210511200110.25d93176ddaf.I9e265b597f2cd23eb44573f35b625947b386a9de@changeid
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/wireless/util.c b/net/wireless/util.c
index 456a54b229f1..6f9cff2ee795 100644
--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -652,6 +652,9 @@ void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list,
 		remaining = skb->len - offset;
 		if (subframe_len > remaining)
 			goto purge;
+		/* mitigate A-MSDU aggregation injection attacks */
+		if (ether_addr_equal(eth.h_dest, rfc1042_header))
+			goto purge;
 
 		offset += sizeof(struct ethhdr);
 		last = remaining <= subframe_len + padding;

commit 8861806d59aa4f2e421292784dd163a449fa35f1
Author: Mathy Vanhoef <Mathy.Vanhoef@kuleuven.be>
Date:   Tue May 11 20:02:44 2021 +0200

    mac80211: properly handle A-MSDUs that start with an RFC 1042 header
    
    commit a1d5ff5651ea592c67054233b14b30bf4452999c upstream.
    
    Properly parse A-MSDUs whose first 6 bytes happen to equal a rfc1042
    header. This can occur in practice when the destination MAC address
    equals AA:AA:03:00:00:00. More importantly, this simplifies the next
    patch to mitigate A-MSDU injection attacks.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Mathy Vanhoef <Mathy.Vanhoef@kuleuven.be>
    Link: https://lore.kernel.org/r/20210511200110.0b2b886492f0.I23dd5d685fe16d3b0ec8106e8f01b59f499dffed@changeid
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index ae936cd5567e..b96debd18e14 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -4605,7 +4605,7 @@ unsigned int ieee80211_get_mesh_hdrlen(struct ieee80211s_hdr *meshhdr);
  */
 int ieee80211_data_to_8023_exthdr(struct sk_buff *skb, struct ethhdr *ehdr,
 				  const u8 *addr, enum nl80211_iftype iftype,
-				  u8 data_offset);
+				  u8 data_offset, bool is_amsdu);
 
 /**
  * ieee80211_data_to_8023 - convert an 802.11 data frame to 802.3
@@ -4617,7 +4617,7 @@ int ieee80211_data_to_8023_exthdr(struct sk_buff *skb, struct ethhdr *ehdr,
 static inline int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr,
 					 enum nl80211_iftype iftype)
 {
-	return ieee80211_data_to_8023_exthdr(skb, NULL, addr, iftype, 0);
+	return ieee80211_data_to_8023_exthdr(skb, NULL, addr, iftype, 0, false);
 }
 
 /**
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 83d8b27167f1..783bbd2c62eb 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -2557,7 +2557,7 @@ __ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx, u8 data_offset)
 	if (ieee80211_data_to_8023_exthdr(skb, &ethhdr,
 					  rx->sdata->vif.addr,
 					  rx->sdata->vif.type,
-					  data_offset))
+					  data_offset, true))
 		return RX_DROP_UNUSABLE;
 
 	ieee80211_amsdu_to_8023s(skb, &frame_list, dev->dev_addr,
diff --git a/net/wireless/util.c b/net/wireless/util.c
index 1a878b84cbd0..456a54b229f1 100644
--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -422,7 +422,7 @@ EXPORT_SYMBOL(ieee80211_get_mesh_hdrlen);
 
 int ieee80211_data_to_8023_exthdr(struct sk_buff *skb, struct ethhdr *ehdr,
 				  const u8 *addr, enum nl80211_iftype iftype,
-				  u8 data_offset)
+				  u8 data_offset, bool is_amsdu)
 {
 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
 	struct {
@@ -510,7 +510,7 @@ int ieee80211_data_to_8023_exthdr(struct sk_buff *skb, struct ethhdr *ehdr,
 	skb_copy_bits(skb, hdrlen, &payload, sizeof(payload));
 	tmp.h_proto = payload.proto;
 
-	if (likely((ether_addr_equal(payload.hdr, rfc1042_header) &&
+	if (likely((!is_amsdu && ether_addr_equal(payload.hdr, rfc1042_header) &&
 		    tmp.h_proto != htons(ETH_P_AARP) &&
 		    tmp.h_proto != htons(ETH_P_IPX)) ||
 		   ether_addr_equal(payload.hdr, bridge_tunnel_header)))

commit 76ffc27967211afba6f0045ac840e7027fbeefcf
Author: Mathy Vanhoef <Mathy.Vanhoef@kuleuven.be>
Date:   Tue May 11 20:02:43 2021 +0200

    mac80211: prevent mixed key and fragment cache attacks
    
    commit 94034c40ab4a3fcf581fbc7f8fdf4e29943c4a24 upstream.
    
    Simultaneously prevent mixed key attacks (CVE-2020-24587) and fragment
    cache attacks (CVE-2020-24586). This is accomplished by assigning a
    unique color to every key (per interface) and using this to track which
    key was used to decrypt a fragment. When reassembling frames, it is
    now checked whether all fragments were decrypted using the same key.
    
    To assure that fragment cache attacks are also prevented, the ID that is
    assigned to keys is unique even over (re)associations and (re)connects.
    This means fragments separated by a (re)association or (re)connect will
    not be reassembled. Because mac80211 now also prevents the reassembly of
    mixed encrypted and plaintext fragments, all cache attacks are prevented.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Mathy Vanhoef <Mathy.Vanhoef@kuleuven.be>
    Link: https://lore.kernel.org/r/20210511200110.3f8290e59823.I622a67769ed39257327a362cfc09c812320eb979@changeid
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index fc715bba5914..db113013416c 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -100,6 +100,7 @@ struct ieee80211_fragment_entry {
 	u8 rx_queue;
 	bool check_sequential_pn; /* needed for CCMP/GCMP */
 	u8 last_pn[6]; /* PN of the last fragment if CCMP was used */
+	unsigned int key_color;
 };
 
 
diff --git a/net/mac80211/key.c b/net/mac80211/key.c
index f20bb39f492d..6775d6cb7d3d 100644
--- a/net/mac80211/key.c
+++ b/net/mac80211/key.c
@@ -653,6 +653,7 @@ int ieee80211_key_link(struct ieee80211_key *key,
 		       struct ieee80211_sub_if_data *sdata,
 		       struct sta_info *sta)
 {
+	static atomic_t key_color = ATOMIC_INIT(0);
 	struct ieee80211_local *local = sdata->local;
 	struct ieee80211_key *old_key;
 	int idx = key->conf.keyidx;
@@ -688,6 +689,12 @@ int ieee80211_key_link(struct ieee80211_key *key,
 	key->sdata = sdata;
 	key->sta = sta;
 
+	/*
+	 * Assign a unique ID to every key so we can easily prevent mixed
+	 * key and fragment cache attacks.
+	 */
+	key->color = atomic_inc_return(&key_color);
+
 	increment_tailroom_need_count(sdata);
 
 	ieee80211_key_replace(sdata, sta, pairwise, old_key, key);
diff --git a/net/mac80211/key.h b/net/mac80211/key.h
index ebdb80b85dc3..d8e187bcb751 100644
--- a/net/mac80211/key.h
+++ b/net/mac80211/key.h
@@ -127,6 +127,8 @@ struct ieee80211_key {
 	} debugfs;
 #endif
 
+	unsigned int color;
+
 	/*
 	 * key config, must be last because it contains key
 	 * material as variable length member
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index bf100fe67439..83d8b27167f1 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -2139,6 +2139,7 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
 			 * next fragment has a sequential PN value.
 			 */
 			entry->check_sequential_pn = true;
+			entry->key_color = rx->key->color;
 			memcpy(entry->last_pn,
 			       rx->key->u.ccmp.rx_pn[queue],
 			       IEEE80211_CCMP_PN_LEN);
@@ -2176,6 +2177,11 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
 
 		if (!requires_sequential_pn(rx, fc))
 			return RX_DROP_UNUSABLE;
+
+		/* Prevent mixed key and fragment cache attacks */
+		if (entry->key_color != rx->key->color)
+			return RX_DROP_UNUSABLE;
+
 		memcpy(pn, entry->last_pn, IEEE80211_CCMP_PN_LEN);
 		for (i = IEEE80211_CCMP_PN_LEN - 1; i >= 0; i--) {
 			pn[i]++;

commit 3c919823e4cad7bdc2c92b0dd3b4dc463c9315bd
Author: Mathy Vanhoef <Mathy.Vanhoef@kuleuven.be>
Date:   Tue May 11 20:02:42 2021 +0200

    mac80211: assure all fragments are encrypted
    
    commit 965a7d72e798eb7af0aa67210e37cf7ecd1c9cad upstream.
    
    Do not mix plaintext and encrypted fragments in protected Wi-Fi
    networks. This fixes CVE-2020-26147.
    
    Previously, an attacker was able to first forward a legitimate encrypted
    fragment towards a victim, followed by a plaintext fragment. The
    encrypted and plaintext fragment would then be reassembled. For further
    details see Section 6.3 and Appendix D in the paper "Fragment and Forge:
    Breaking Wi-Fi Through Frame Aggregation and Fragmentation".
    
    Because of this change there are now two equivalent conditions in the
    code to determine if a received fragment requires sequential PNs, so we
    also move this test to a separate function to make the code easier to
    maintain.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Mathy Vanhoef <Mathy.Vanhoef@kuleuven.be>
    Link: https://lore.kernel.org/r/20210511200110.30c4394bb835.I5acfdb552cc1d20c339c262315950b3eac491397@changeid
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 9e92e5e2336b..bf100fe67439 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -2078,6 +2078,16 @@ ieee80211_reassemble_find(struct ieee80211_sub_if_data *sdata,
 	return NULL;
 }
 
+static bool requires_sequential_pn(struct ieee80211_rx_data *rx, __le16 fc)
+{
+	return rx->key &&
+		(rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP ||
+		 rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP_256 ||
+		 rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP ||
+		 rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP_256) &&
+		ieee80211_has_protected(fc);
+}
+
 static ieee80211_rx_result debug_noinline
 ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
 {
@@ -2122,12 +2132,7 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
 		/* This is the first fragment of a new frame. */
 		entry = ieee80211_reassemble_add(rx->sdata, frag, seq,
 						 rx->seqno_idx, &(rx->skb));
-		if (rx->key &&
-		    (rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP ||
-		     rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP_256 ||
-		     rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP ||
-		     rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP_256) &&
-		    ieee80211_has_protected(fc)) {
+		if (requires_sequential_pn(rx, fc)) {
 			int queue = rx->security_idx;
 
 			/* Store CCMP/GCMP PN so that we can verify that the
@@ -2169,11 +2174,7 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
 		u8 pn[IEEE80211_CCMP_PN_LEN], *rpn;
 		int queue;
 
-		if (!rx->key ||
-		    (rx->key->conf.cipher != WLAN_CIPHER_SUITE_CCMP &&
-		     rx->key->conf.cipher != WLAN_CIPHER_SUITE_CCMP_256 &&
-		     rx->key->conf.cipher != WLAN_CIPHER_SUITE_GCMP &&
-		     rx->key->conf.cipher != WLAN_CIPHER_SUITE_GCMP_256))
+		if (!requires_sequential_pn(rx, fc))
 			return RX_DROP_UNUSABLE;
 		memcpy(pn, entry->last_pn, IEEE80211_CCMP_PN_LEN);
 		for (i = IEEE80211_CCMP_PN_LEN - 1; i >= 0; i--) {

commit d4a6f0df89cbc105ab0cbe9fd2dda64756684451
Author: Johan Hovold <johan@kernel.org>
Date:   Mon May 24 11:25:11 2021 +0200

    net: hso: fix control-request directions
    
    commit 1a6e9a9c68c1f183872e4bcc947382111c2e04eb upstream.
    
    The direction of the pipe argument must match the request-type direction
    bit or control requests may fail depending on the host-controller-driver
    implementation.
    
    Fix the tiocmset and rfkill requests which erroneously used
    usb_rcvctrlpipe().
    
    Fixes: 72dc1c096c70 ("HSO: add option hso driver")
    Cc: stable@vger.kernel.org      # 2.6.27
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c
index 94f1c2422f84..a66077f51457 100644
--- a/drivers/net/usb/hso.c
+++ b/drivers/net/usb/hso.c
@@ -1703,7 +1703,7 @@ static int hso_serial_tiocmset(struct tty_struct *tty,
 	spin_unlock_irqrestore(&serial->serial_lock, flags);
 
 	return usb_control_msg(serial->parent->usb,
-			       usb_rcvctrlpipe(serial->parent->usb, 0), 0x22,
+			       usb_sndctrlpipe(serial->parent->usb, 0), 0x22,
 			       0x21, val, if_num, NULL, 0,
 			       USB_CTRL_SET_TIMEOUT);
 }
@@ -2450,7 +2450,7 @@ static int hso_rfkill_set_block(void *data, bool blocked)
 	if (hso_dev->usb_gone)
 		rv = 0;
 	else
-		rv = usb_control_msg(hso_dev->usb, usb_rcvctrlpipe(hso_dev->usb, 0),
+		rv = usb_control_msg(hso_dev->usb, usb_sndctrlpipe(hso_dev->usb, 0),
 				       enabled ? 0x82 : 0x81, 0x40, 0, 0, NULL, 0,
 				       USB_CTRL_SET_TIMEOUT);
 	mutex_unlock(&hso_dev->mutex);

commit 582a9b9813ecc89a3b5944ea412f383d02904c50
Author: Kees Cook <keescook@chromium.org>
Date:   Tue May 25 12:37:35 2021 -0700

    proc: Check /proc/$pid/attr/ writes against file opener
    
    commit bfb819ea20ce8bbeeba17e1a6418bf8bda91fc28 upstream.
    
    Fix another "confused deputy" weakness[1]. Writes to /proc/$pid/attr/
    files need to check the opener credentials, since these fds do not
    transition state across execve(). Without this, it is possible to
    trick another process (which may have different credentials) to write
    to its own /proc/$pid/attr/ files, leading to unexpected and possibly
    exploitable behaviors.
    
    [1] https://www.kernel.org/doc/html/latest/security/credentials.html?highlight=confused#open-file-credentials
    
    Fixes: 1da177e4c3f41 ("Linux-2.6.12-rc2")
    Cc: stable@vger.kernel.org
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/proc/base.c b/fs/proc/base.c
index 5e705fa9a913..bc736ea1192a 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -2564,6 +2564,10 @@ static ssize_t proc_pid_attr_write(struct file * file, const char __user * buf,
 	void *page;
 	int rv;
 
+	/* A task may only write when it was the opener. */
+	if (file->f_cred != current_real_cred())
+		return -EPERM;
+
 	rcu_read_lock();
 	task = pid_task(proc_pid(inode), PIDTYPE_PID);
 	if (!task) {

commit f69369435c796d6b3fa0656fa04b2784de35c580
Author: Adrian Hunter <adrian.hunter@intel.com>
Date:   Wed May 19 10:45:13 2021 +0300

    perf intel-pt: Fix transaction abort handling
    
    commit cb7987837c31b217b28089bbc78922d5c9187869 upstream.
    
    When adding support for power events, some handling of FUP packets was
    unified. That resulted in breaking reporting of TSX aborts, by not
    considering the associated TIP packet. Fix that.
    
    Example:
    
    A machine that supports TSX is required. It will have flag "rtm". Kernel
    parameter tsx=on may be required.
    
     # for w in `cat /proc/cpuinfo | grep -m1 flags `;do echo $w | grep rtm ; done
     rtm
    
    Test program:
    
     #include <stdio.h>
     #include <immintrin.h>
    
     int main()
     {
            int x = 0;
    
            if (_xbegin() == _XBEGIN_STARTED) {
                    x = 1;
                    _xabort(1);
            } else {
                    printf("x = %d\n", x);
            }
            return 0;
     }
    
    Compile with -mrtm i.e.
    
     gcc -Wall -Wextra -mrtm xabort.c -o xabort
    
    Record:
    
     perf record -e intel_pt/cyc/u --filter 'filter main @ ./xabort' ./xabort
    
    Before:
    
     # perf script --itrace=be -F+flags,+addr,-period,-event --ns
              xabort  1478 [007] 92161.431348552:   tr strt                             0 [unknown] ([unknown]) =>           400b6d main+0x0 (/root/xabort)
              xabort  1478 [007] 92161.431348624:   jmp                            400b96 main+0x29 (/root/xabort) =>           400bae main+0x41 (/root/xabort)
              xabort  1478 [007] 92161.431348624:   return                         400bb4 main+0x47 (/root/xabort) =>           400b87 main+0x1a (/root/xabort)
              xabort  1478 [007] 92161.431348637:   jcc                            400b8a main+0x1d (/root/xabort) =>           400b98 main+0x2b (/root/xabort)
              xabort  1478 [007] 92161.431348644:   tr end  call                   400ba9 main+0x3c (/root/xabort) =>           40f690 printf+0x0 (/root/xabort)
              xabort  1478 [007] 92161.431360859:   tr strt                             0 [unknown] ([unknown]) =>           400bae main+0x41 (/root/xabort)
              xabort  1478 [007] 92161.431360882:   tr end  return                 400bb4 main+0x47 (/root/xabort) =>           401139 __libc_start_main+0x309 (/root/xabort)
    
    After:
    
     # perf script --itrace=be -F+flags,+addr,-period,-event --ns
              xabort  1478 [007] 92161.431348552:   tr strt                             0 [unknown] ([unknown]) =>           400b6d main+0x0 (/root/xabort)
              xabort  1478 [007] 92161.431348624:   tx abrt                        400b93 main+0x26 (/root/xabort) =>           400b87 main+0x1a (/root/xabort)
              xabort  1478 [007] 92161.431348637:   jcc                            400b8a main+0x1d (/root/xabort) =>           400b98 main+0x2b (/root/xabort)
              xabort  1478 [007] 92161.431348644:   tr end  call                   400ba9 main+0x3c (/root/xabort) =>           40f690 printf+0x0 (/root/xabort)
              xabort  1478 [007] 92161.431360859:   tr strt                             0 [unknown] ([unknown]) =>           400bae main+0x41 (/root/xabort)
              xabort  1478 [007] 92161.431360882:   tr end  return                 400bb4 main+0x47 (/root/xabort) =>           401139 __libc_start_main+0x309 (/root/xabort)
    
    Fixes: a472e65fc490a ("perf intel-pt: Add decoder support for ptwrite and power event packets")
    Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Andi Kleen <ak@linux.intel.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: stable@vger.kernel.org
    Link: http://lore.kernel.org/lkml/20210519074515.9262-2-adrian.hunter@intel.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
index e2f038f84dbc..e2a6c22959f2 100644
--- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
+++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
@@ -1063,6 +1063,8 @@ static bool intel_pt_fup_event(struct intel_pt_decoder *decoder)
 		decoder->set_fup_tx_flags = false;
 		decoder->tx_flags = decoder->fup_tx_flags;
 		decoder->state.type = INTEL_PT_TRANSACTION;
+		if (decoder->fup_tx_flags & INTEL_PT_ABORT_TX)
+			decoder->state.type |= INTEL_PT_BRANCH;
 		decoder->state.from_ip = decoder->ip;
 		decoder->state.to_ip = 0;
 		decoder->state.flags = decoder->fup_tx_flags;
@@ -1129,8 +1131,10 @@ static int intel_pt_walk_fup(struct intel_pt_decoder *decoder)
 			return 0;
 		if (err == -EAGAIN ||
 		    intel_pt_fup_with_nlip(decoder, &intel_pt_insn, ip, err)) {
+			bool no_tip = decoder->pkt_state != INTEL_PT_STATE_FUP;
+
 			decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
-			if (intel_pt_fup_event(decoder))
+			if (intel_pt_fup_event(decoder) && no_tip)
 				return 0;
 			return -EAGAIN;
 		}

commit b88de944ff56d5693c82b88b92ae88f3bef1b2ee
Author: Adrian Hunter <adrian.hunter@intel.com>
Date:   Wed May 19 10:45:14 2021 +0300

    perf intel-pt: Fix sample instruction bytes
    
    commit c954eb72b31a9dc56c99b450253ec5b121add320 upstream.
    
    The decoder reports the current instruction if it was decoded. In some
    cases the current instruction is not decoded, in which case the instruction
    bytes length must be set to zero. Ensure that is always done.
    
    Note perf script can anyway get the instruction bytes for any samples where
    they are not present.
    
    Also note, that there is a redundant "ptq->insn_len = 0" statement which is
    not removed until a subsequent patch in order to make this patch apply
    cleanly to stable branches.
    
    Example:
    
    A machne that supports TSX is required. It will have flag "rtm". Kernel
    parameter tsx=on may be required.
    
     # for w in `cat /proc/cpuinfo | grep -m1 flags `;do echo $w | grep rtm ; done
     rtm
    
    Test program:
    
     #include <stdio.h>
     #include <immintrin.h>
    
     int main()
     {
            int x = 0;
    
            if (_xbegin() == _XBEGIN_STARTED) {
                    x = 1;
                    _xabort(1);
            } else {
                    printf("x = %d\n", x);
            }
            return 0;
     }
    
    Compile with -mrtm i.e.
    
     gcc -Wall -Wextra -mrtm xabort.c -o xabort
    
    Record:
    
     perf record -e intel_pt/cyc/u --filter 'filter main @ ./xabort' ./xabort
    
    Before:
    
     # perf script --itrace=xe -F+flags,+insn,-period --xed --ns
              xabort  1478 [007] 92161.431348581:   transactions:   x                              400b81 main+0x14 (/root/xabort)          mov $0xffffffff, %eax
              xabort  1478 [007] 92161.431348624:   transactions:   tx abrt                        400b93 main+0x26 (/root/xabort)          mov $0xffffffff, %eax
    
    After:
    
     # perf script --itrace=xe -F+flags,+insn,-period --xed --ns
              xabort  1478 [007] 92161.431348581:   transactions:   x                              400b81 main+0x14 (/root/xabort)          xbegin 0x6
              xabort  1478 [007] 92161.431348624:   transactions:   tx abrt                        400b93 main+0x26 (/root/xabort)          xabort $0x1
    
    Fixes: faaa87680b25d ("perf intel-pt/bts: Report instruction bytes and length in sample")
    Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Andi Kleen <ak@linux.intel.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: stable@vger.kernel.org
    Link: http://lore.kernel.org/lkml/20210519074515.9262-3-adrian.hunter@intel.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c
index 2434a0014491..256b4755c087 100644
--- a/tools/perf/util/intel-pt.c
+++ b/tools/perf/util/intel-pt.c
@@ -505,8 +505,10 @@ static int intel_pt_walk_next_insn(struct intel_pt_insn *intel_pt_insn,
 
 			*ip += intel_pt_insn->length;
 
-			if (to_ip && *ip == to_ip)
+			if (to_ip && *ip == to_ip) {
+				intel_pt_insn->length = 0;
 				goto out_no_cache;
+			}
 
 			if (*ip >= al.map->end)
 				break;
@@ -893,6 +895,7 @@ static void intel_pt_set_pid_tid_cpu(struct intel_pt *pt,
 
 static void intel_pt_sample_flags(struct intel_pt_queue *ptq)
 {
+	ptq->insn_len = 0;
 	if (ptq->state->flags & INTEL_PT_ABORT_TX) {
 		ptq->flags = PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_TX_ABORT;
 	} else if (ptq->state->flags & INTEL_PT_ASYNC) {

commit 2ec5e9bb6b0560c90d315559c28a99723c80b996
Author: Rolf Eike Beer <eb@emlix.com>
Date:   Tue May 25 15:08:02 2021 +0800

    iommu/vt-d: Fix sysfs leak in alloc_iommu()
    
    commit 0ee74d5a48635c848c20f152d0d488bf84641304 upstream.
    
    iommu_device_sysfs_add() is called before, so is has to be cleaned on subsequent
    errors.
    
    Fixes: 39ab9555c2411 ("iommu: Add sysfs bindings for struct iommu_device")
    Cc: stable@vger.kernel.org # 4.11.x
    Signed-off-by: Rolf Eike Beer <eb@emlix.com>
    Acked-by: Lu Baolu <baolu.lu@linux.intel.com>
    Link: https://lore.kernel.org/r/17411490.HIIP88n32C@mobilepool36.emlix.com
    Link: https://lore.kernel.org/r/20210525070802.361755-2-baolu.lu@linux.intel.com
    Signed-off-by: Joerg Roedel <jroedel@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c
index 3f0c2c1ef0cb..bc565f8e8ac2 100644
--- a/drivers/iommu/dmar.c
+++ b/drivers/iommu/dmar.c
@@ -1119,7 +1119,7 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
 
 		err = iommu_device_register(&iommu->iommu);
 		if (err)
-			goto err_unmap;
+			goto err_sysfs;
 	}
 
 	drhd->iommu = iommu;
@@ -1127,6 +1127,8 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
 
 	return 0;
 
+err_sysfs:
+	iommu_device_sysfs_remove(&iommu->iommu);
 err_unmap:
 	unmap_iommu(iommu);
 error_free_seq_id:

commit 39785761feadf261bc5101372b0b0bbaf6a94494
Author: Anna Schumaker <Anna.Schumaker@Netapp.com>
Date:   Wed May 19 12:54:51 2021 -0400

    NFSv4: Fix a NULL pointer dereference in pnfs_mark_matching_lsegs_return()
    
    commit a421d218603ffa822a0b8045055c03eae394a7eb upstream.
    
    Commit de144ff4234f changes _pnfs_return_layout() to call
    pnfs_mark_matching_lsegs_return() passing NULL as the struct
    pnfs_layout_range argument. Unfortunately,
    pnfs_mark_matching_lsegs_return() doesn't check if we have a value here
    before dereferencing it, causing an oops.
    
    I'm able to hit this crash consistently when running connectathon basic
    tests on NFS v4.1/v4.2 against Ontap.
    
    Fixes: de144ff4234f ("NFSv4: Don't discard segments marked for return in _pnfs_return_layout()")
    Cc: stable@vger.kernel.org
    Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index af255109c5bf..c900cb2119ba 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1268,6 +1268,11 @@ _pnfs_return_layout(struct inode *ino)
 {
 	struct pnfs_layout_hdr *lo = NULL;
 	struct nfs_inode *nfsi = NFS_I(ino);
+	struct pnfs_layout_range range = {
+		.iomode		= IOMODE_ANY,
+		.offset		= 0,
+		.length		= NFS4_MAX_UINT64,
+	};
 	LIST_HEAD(tmp_list);
 	nfs4_stateid stateid;
 	int status = 0;
@@ -1294,16 +1299,10 @@ _pnfs_return_layout(struct inode *ino)
 	}
 	valid_layout = pnfs_layout_is_valid(lo);
 	pnfs_clear_layoutcommit(ino, &tmp_list);
-	pnfs_mark_matching_lsegs_return(lo, &tmp_list, NULL, 0);
+	pnfs_mark_matching_lsegs_return(lo, &tmp_list, &range, 0);
 
-	if (NFS_SERVER(ino)->pnfs_curr_ld->return_range) {
-		struct pnfs_layout_range range = {
-			.iomode		= IOMODE_ANY,
-			.offset		= 0,
-			.length		= NFS4_MAX_UINT64,
-		};
+	if (NFS_SERVER(ino)->pnfs_curr_ld->return_range)
 		NFS_SERVER(ino)->pnfs_curr_ld->return_range(lo, &range);
-	}
 
 	/* Don't send a LAYOUTRETURN if list was initially empty */
 	if (!test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags) ||

commit d094067852cd1eefbcdc3c110c69265b6ce8c981
Author: Aurelien Aptel <aaptel@suse.com>
Date:   Fri May 21 17:19:27 2021 +0200

    cifs: set server->cipher_type to AES-128-CCM for SMB3.0
    
    commit 6d2fcfe6b517fe7cbf2687adfb0a16cdcd5d9243 upstream.
    
    SMB3.0 doesn't have encryption negotiate context but simply uses
    the SMB2_GLOBAL_CAP_ENCRYPTION flag.
    
    When that flag is present in the neg response cifs.ko uses AES-128-CCM
    which is the only cipher available in this context.
    
    cipher_type was set to the server cipher only when parsing encryption
    negotiate context (SMB3.1.1).
    
    For SMB3.0 it was set to 0. This means cipher_type value can be 0 or 1
    for AES-128-CCM.
    
    Fix this by checking for SMB3.0 and encryption capability and setting
    cipher_type appropriately.
    
    Signed-off-by: Aurelien Aptel <aaptel@suse.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
index ee824131c02e..07d1c79a79ea 100644
--- a/fs/cifs/smb2pdu.c
+++ b/fs/cifs/smb2pdu.c
@@ -791,6 +791,13 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
 	/* Internal types */
 	server->capabilities |= SMB2_NT_FIND | SMB2_LARGE_FILES;
 
+	/*
+	 * SMB3.0 supports only 1 cipher and doesn't have a encryption neg context
+	 * Set the cipher type manually.
+	 */
+	if (server->dialect == SMB30_PROT_ID && (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION))
+		server->cipher_type = SMB2_ENCRYPTION_AES128_CCM;
+
 	security_blob = smb2_get_data_area_len(&blob_offset, &blob_length,
 					       (struct smb2_sync_hdr *)rsp);
 	/*

commit 0365701bc44e078682ee1224866a71897495c7ef
Author: Dongliang Mu <mudongliangabcd@gmail.com>
Date:   Sat May 15 07:29:06 2021 +0800

    NFC: nci: fix memory leak in nci_allocate_device
    
    commit e0652f8bb44d6294eeeac06d703185357f25d50b upstream.
    
    nfcmrvl_disconnect fails to free the hci_dev field in struct nci_dev.
    Fix this by freeing hci_dev in nci_free_device.
    
    BUG: memory leak
    unreferenced object 0xffff888111ea6800 (size 1024):
      comm "kworker/1:0", pid 19, jiffies 4294942308 (age 13.580s)
      hex dump (first 32 bytes):
        00 00 00 00 00 00 00 00 00 60 fd 0c 81 88 ff ff  .........`......
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<000000004bc25d43>] kmalloc include/linux/slab.h:552 [inline]
        [<000000004bc25d43>] kzalloc include/linux/slab.h:682 [inline]
        [<000000004bc25d43>] nci_hci_allocate+0x21/0xd0 net/nfc/nci/hci.c:784
        [<00000000c59cff92>] nci_allocate_device net/nfc/nci/core.c:1170 [inline]
        [<00000000c59cff92>] nci_allocate_device+0x10b/0x160 net/nfc/nci/core.c:1132
        [<00000000006e0a8e>] nfcmrvl_nci_register_dev+0x10a/0x1c0 drivers/nfc/nfcmrvl/main.c:153
        [<000000004da1b57e>] nfcmrvl_probe+0x223/0x290 drivers/nfc/nfcmrvl/usb.c:345
        [<00000000d506aed9>] usb_probe_interface+0x177/0x370 drivers/usb/core/driver.c:396
        [<00000000bc632c92>] really_probe+0x159/0x4a0 drivers/base/dd.c:554
        [<00000000f5009125>] driver_probe_device+0x84/0x100 drivers/base/dd.c:740
        [<000000000ce658ca>] __device_attach_driver+0xee/0x110 drivers/base/dd.c:846
        [<000000007067d05f>] bus_for_each_drv+0xb7/0x100 drivers/base/bus.c:431
        [<00000000f8e13372>] __device_attach+0x122/0x250 drivers/base/dd.c:914
        [<000000009cf68860>] bus_probe_device+0xc6/0xe0 drivers/base/bus.c:491
        [<00000000359c965a>] device_add+0x5be/0xc30 drivers/base/core.c:3109
        [<00000000086e4bd3>] usb_set_configuration+0x9d9/0xb90 drivers/usb/core/message.c:2164
        [<00000000ca036872>] usb_generic_driver_probe+0x8c/0xc0 drivers/usb/core/generic.c:238
        [<00000000d40d36f6>] usb_probe_device+0x5c/0x140 drivers/usb/core/driver.c:293
        [<00000000bc632c92>] really_probe+0x159/0x4a0 drivers/base/dd.c:554
    
    Reported-by: syzbot+19bcfc64a8df1318d1c3@syzkaller.appspotmail.com
    Fixes: 11f54f228643 ("NFC: nci: Add HCI over NCI protocol support")
    Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/net/nfc/nci_core.h b/include/net/nfc/nci_core.h
index df5c69db68af..e67564af6f93 100644
--- a/include/net/nfc/nci_core.h
+++ b/include/net/nfc/nci_core.h
@@ -310,6 +310,7 @@ int nci_nfcc_loopback(struct nci_dev *ndev, void *data, size_t data_len,
 		      struct sk_buff **resp);
 
 struct nci_hci_dev *nci_hci_allocate(struct nci_dev *ndev);
+void nci_hci_deallocate(struct nci_dev *ndev);
 int nci_hci_send_event(struct nci_dev *ndev, u8 gate, u8 event,
 		       const u8 *param, size_t param_len);
 int nci_hci_send_cmd(struct nci_dev *ndev, u8 gate,
diff --git a/net/nfc/nci/core.c b/net/nfc/nci/core.c
index 074960154993..33c23af6709d 100644
--- a/net/nfc/nci/core.c
+++ b/net/nfc/nci/core.c
@@ -1187,6 +1187,7 @@ EXPORT_SYMBOL(nci_allocate_device);
 void nci_free_device(struct nci_dev *ndev)
 {
 	nfc_free_device(ndev->nfc_dev);
+	nci_hci_deallocate(ndev);
 	kfree(ndev);
 }
 EXPORT_SYMBOL(nci_free_device);
diff --git a/net/nfc/nci/hci.c b/net/nfc/nci/hci.c
index c0d323b58e73..c972c212e7ca 100644
--- a/net/nfc/nci/hci.c
+++ b/net/nfc/nci/hci.c
@@ -807,3 +807,8 @@ struct nci_hci_dev *nci_hci_allocate(struct nci_dev *ndev)
 
 	return hdev;
 }
+
+void nci_hci_deallocate(struct nci_dev *ndev)
+{
+	kfree(ndev->hci_dev);
+}

commit e8fbd40aa4f3a5b77584cc44c21228b7912ccc70
Author: Jack Pham <jackp@codeaurora.org>
Date:   Wed Apr 28 02:01:10 2021 -0700

    usb: dwc3: gadget: Enable suspend events
    
    commit d1d90dd27254c44d087ad3f8b5b3e4fff0571f45 upstream.
    
    commit 72704f876f50 ("dwc3: gadget: Implement the suspend entry event
    handler") introduced (nearly 5 years ago!) an interrupt handler for
    U3/L1-L2 suspend events.  The problem is that these events aren't
    currently enabled in the DEVTEN register so the handler is never
    even invoked.  Fix this simply by enabling the corresponding bit
    in dwc3_gadget_enable_irq() using the same revision check as found
    in the handler.
    
    Fixes: 72704f876f50 ("dwc3: gadget: Implement the suspend entry event handler")
    Acked-by: Felipe Balbi <balbi@kernel.org>
    Signed-off-by: Jack Pham <jackp@codeaurora.org>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210428090111.3370-1-jackp@codeaurora.org
    [jackp@codeaurora.org: backport to pre-5.7 by replacing
     DWC3_IS_VER_PRIOR check with direct comparison of dwc->revision]
    Signed-off-by: Jack Pham <jackp@codeaurora.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 8ce13f5e83c7..2eac817a43d6 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -1834,6 +1834,10 @@ static void dwc3_gadget_enable_irq(struct dwc3 *dwc)
 	if (dwc->revision < DWC3_REVISION_250A)
 		reg |= DWC3_DEVTEN_ULSTCNGEN;
 
+	/* On 2.30a and above this bit enables U3/L2-L1 Suspend Events */
+	if (dwc->revision >= DWC3_REVISION_230A)
+		reg |= DWC3_DEVTEN_EOPFEN;
+
 	dwc3_writel(dwc->regs, DWC3_DEVTEN, reg);
 }
 

commit b8a9a6df60319813ccbdc3e613792c211b7d511e
Author: Stephen Brennan <stephen.s.brennan@oracle.com>
Date:   Wed May 26 10:46:13 2021 -0700

    mm, vmstat: drop zone->lock in /proc/pagetypeinfo
    
    Commit 93b3a674485f6a4b8ffff85d1682d5e8b7c51560 upstream
    
    Commit 93b3a674485f ("mm,vmstat: reduce zone->lock holding time by
    /proc/pagetypeinfo") upstream caps the number of iterations over each
    free_list at 100,000, and also drops the zone->lock in between each
    migrate type. Capping the iteration count alters the file contents in
    some cases, which means this approach may not be suitable for stable
    backports.
    
    However, dropping zone->lock in between migrate types (and, as a result,
    page orders) will not change the /proc/pagetypeinfo file contents. It
    can significantly reduce the length of time spent with IRQs disabled,
    which can prevent missed interrupts or soft lockups which we have
    observed on systems with particularly large memory.
    
    Thus, this commit is a modified version of the upstream one which only
    drops the lock in between migrate types.
    
    Fixes: 467c996c1e19 ("Print out statistics in relation to fragmentation avoidance to /proc/pagetypeinfo")
    Signed-off-by: Stephen Brennan <stephen.s.brennan@oracle.com>
    Reviewed-by: Aruna Ramakrishna <aruna.ramakrishna@oracle.com>
    Reviewed-by: Khalid Aziz <khalid.aziz@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/mm/vmstat.c b/mm/vmstat.c
index ce81b0a7d018..21e07e71ea2d 100644
--- a/mm/vmstat.c
+++ b/mm/vmstat.c
@@ -1384,6 +1384,9 @@ static void pagetypeinfo_showfree_print(struct seq_file *m,
 			list_for_each(curr, &area->free_list[mtype])
 				freecount++;
 			seq_printf(m, "%6lu ", freecount);
+			spin_unlock_irq(&zone->lock);
+			cond_resched();
+			spin_lock_irq(&zone->lock);
 		}
 		seq_putc(m, '\n');
 	}

commit 12557ec00cba732c4c0b465bc9b7c6fc144d43da
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Fri May 28 16:45:40 2021 +0800

    power/avs: rockchip-io-domain: dump power supply-map when probe
    
    Tested on RK3568-evb2 with io-domain node as following:
        pmuio2-supply = <&vcc3v3_pmu>;
        vccio1-supply = <&vccio_acodec>;
        vccio3-supply = <&vccio_sd>;
        vccio4-supply = <&vcc_3v3>;
        vccio5-supply = <&vcc_3v3>;
        vccio6-supply = <&vcc_3v3>;
        vccio7-supply = <&vcc_3v3>;
    
    With this patch, the system bootup log shows:
    [    0.773089] rockchip-iodomain fdc20000.syscon:io-domains: pmuio2(3300000 uV) supplied by vcc3v3_pmu
    [    0.773247] rockchip-iodomain fdc20000.syscon:io-domains: vccio1(3300000 uV) supplied by vccio_acodec
    [    0.773426] rockchip-iodomain fdc20000.syscon:io-domains: vccio3(3300000 uV) supplied by vccio_sd
    [    0.773603] rockchip-iodomain fdc20000.syscon:io-domains: vccio4(3300000 uV) supplied by vcc_3v3
    [    0.773721] rockchip-iodomain fdc20000.syscon:io-domains: vccio5(3300000 uV) supplied by vcc_3v3
    [    0.773839] rockchip-iodomain fdc20000.syscon:io-domains: vccio6(3300000 uV) supplied by vcc_3v3
    [    0.773989] rockchip-iodomain fdc20000.syscon:io-domains: vccio7(3300000 uV) supplied by vcc_3v3
    
    Change-Id: Ib4bcb78bf932b07beb03b3b39a0224ecb6699a54
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/power/avs/rockchip-io-domain.c b/drivers/power/avs/rockchip-io-domain.c
index c2134e363324..d723bcfae918 100644
--- a/drivers/power/avs/rockchip-io-domain.c
+++ b/drivers/power/avs/rockchip-io-domain.c
@@ -23,6 +23,12 @@
 #include <linux/platform_device.h>
 #include <linux/regmap.h>
 #include <linux/regulator/consumer.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/regulator/of_regulator.h>
+#include <linux/regulator/driver.h>
+#include <linux/regulator/machine.h>
+#include "../../regulator/internal.h"
 
 #define MAX_SUPPLIES		16
 
@@ -644,6 +650,77 @@ static const struct file_operations rockchip_iodomain_vol_fops = {
 static const struct file_operations rockchip_iodomain_vol_fops = { };
 #endif
 
+static const char *rdev_get_name(struct regulator_dev *rdev)
+{
+	if (rdev->constraints && rdev->constraints->name)
+		return rdev->constraints->name;
+	else if (rdev->desc->name)
+		return rdev->desc->name;
+	else
+		return "";
+}
+
+static struct device_node *of_get_child_regulator(struct device_node *parent,
+						  const char *prop_name)
+{
+	struct device_node *regnode = NULL;
+	struct device_node *child = NULL;
+
+	for_each_child_of_node(parent, child) {
+		regnode = of_parse_phandle(child, prop_name, 0);
+
+		if (!regnode) {
+			regnode = of_get_child_regulator(child, prop_name);
+			if (regnode)
+				return regnode;
+		} else {
+			return regnode;
+		}
+	}
+	return NULL;
+}
+
+static struct device_node *of_get_regulator(struct device *dev, const char *supply)
+{
+	struct device_node *regnode = NULL;
+	char prop_name[256];
+
+	dev_dbg(dev, "Looking up %s-supply from device tree\n", supply);
+
+	snprintf(prop_name, sizeof(prop_name), "%s-supply", supply);
+	regnode = of_parse_phandle(dev->of_node, prop_name, 0);
+
+	if (!regnode) {
+		regnode = of_get_child_regulator(dev->of_node, prop_name);
+		if (regnode)
+			return regnode;
+
+		dev_dbg(dev, "Looking up %s property in node %pOF failed\n",
+				prop_name, dev->of_node);
+		return NULL;
+	}
+	return regnode;
+}
+
+static void rockchip_iodomain_dump(const struct platform_device *pdev,
+				   struct rockchip_iodomain_supply *supply)
+{
+	struct rockchip_iodomain *iod = supply->iod;
+	const char *name = iod->soc_data->supply_names[supply->idx];
+	struct device *dev = iod->dev;
+	struct device_node *node;
+	struct regulator_dev *r = NULL;
+
+	node = of_get_regulator(dev, name);
+	if (node) {
+		r = of_find_regulator_by_node(node);
+		if (!IS_ERR_OR_NULL(r))
+			dev_info(&pdev->dev, "%s(%d uV) supplied by %s\n",
+				name, regulator_get_voltage(supply->reg),
+				rdev_get_name(r));
+	}
+}
+
 static int rockchip_iodomain_probe(struct platform_device *pdev)
 {
 	struct device_node *np = pdev->dev.of_node;
@@ -748,6 +825,7 @@ static int rockchip_iodomain_probe(struct platform_device *pdev)
 			goto unreg_notify;
 		}
 
+		rockchip_iodomain_dump(pdev, supply);
 		debugfs_supply = debugfs_create_dir(supply_name, debugfs_root);
 		debugfs_create_file("voltage", 0444, debugfs_supply,
 				    (void *)supply,

commit 7ada44e48bc71328aa58ce72b02448d1b7976d11
Author: Yu Qiaowei <cerf.yu@rock-chips.com>
Date:   Mon May 31 14:41:59 2021 +0800

    video/rockchip: rga2: Add support for full csc (RGB2YUV/YUV2YUV).
    
    Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
    Change-Id: I72fcbc85a5bc24357d64579dd56b8a20715e59bc

diff --git a/drivers/video/rockchip/rga2/rga2.h b/drivers/video/rockchip/rga2/rga2.h
index 01b461233d72..9fe990a1ac9e 100644
--- a/drivers/video/rockchip/rga2/rga2.h
+++ b/drivers/video/rockchip/rga2/rga2.h
@@ -284,6 +284,21 @@ typedef struct line_draw_t
 }
 line_draw_t;
 
+/* color space convert coefficient. */
+typedef struct csc_coe_t {
+    int16_t r_v;
+    int16_t g_y;
+    int16_t b_u;
+    int32_t off;
+} csc_coe_t;
+
+typedef struct full_csc_t {
+    unsigned char flag;
+    csc_coe_t coe_y;
+    csc_coe_t coe_u;
+    csc_coe_t coe_v;
+} full_csc_t;
+
 typedef struct rga_img_info_t
 {
     unsigned long yrgb_addr;      /* yrgb    mem addr         */
@@ -394,6 +409,8 @@ struct rga_req {
     uint8_t  src_trans_mode;
 
     uint8_t dither_mode;
+
+    full_csc_t full_csc;            /* full color space convert */
 };
 struct rga_req_32
 {
@@ -446,6 +463,8 @@ struct rga_req_32
     uint8_t  src_trans_mode;
 
     uint8_t dither_mode;
+
+    full_csc_t full_csc;            /* full color space convert */
 };
 
 
@@ -530,13 +549,18 @@ struct rga2_req
     u8 src_a_global_val;    /* src global alpha value        */
     u8 dst_a_global_val;    /* dst global alpha value        */
 
-
     u8  rop_mode;	    /* rop mode select 0 : rop2 1 : rop3 2 : rop4 */
     u16 rop_code;           /* rop2/3/4 code */
 
     u8 palette_mode;        /* (enum) color palatte  0/1bpp, 1/2bpp 2/4bpp 3/8bpp*/
 
     u8 yuv2rgb_mode;        /* (enum) BT.601 MPEG / BT.601 JPEG / BT.709  */
+                            /* [1:0]   src0 csc mode        */
+                            /* [3:2]   dst csc mode         */
+                            /* [4]     dst csc clip enable  */
+                            /* [6:5]   src1 csc mdoe        */
+                            /* [7]     src1 csc clip enable */
+    full_csc_t full_csc;    /* full color space convert */
 
     u8 endian_mode;         /* 0/little endian 1/big endian */
 
@@ -688,6 +712,7 @@ struct rga2_reg {
 	struct list_head	session_link;
 	struct list_head	status_link;
 	uint32_t  sys_reg[8];
+	uint32_t  csc_reg[12];
 	uint32_t  cmd_reg[32];
 
 	uint32_t *MMU_src0_base;
@@ -749,6 +774,9 @@ struct rga2_service_info {
 #define RGA2_MMU_CTRL0            0x018
 #define RGA2_MMU_CMD_BASE         0x01c
 
+//Full Csc Coefficient
+#define RGA2_CSC_COE_BASE         0x60
+
 //Command code start
 #define RGA2_MODE_CTRL            0x100
 #define RGA_BLIT_COMPLETE_EVENT 1
diff --git a/drivers/video/rockchip/rga2/rga2_drv.c b/drivers/video/rockchip/rga2/rga2_drv.c
index a86f0d4ef893..b635f23688ea 100644
--- a/drivers/video/rockchip/rga2/rga2_drv.c
+++ b/drivers/video/rockchip/rga2/rga2_drv.c
@@ -871,7 +871,7 @@ static struct rga2_reg * rga2_reg_init(rga2_session *session, struct rga2_req *r
         }
     }
 
-    if(RGA2_gen_reg_info((uint8_t *)reg->cmd_reg, req) == -1) {
+    if (RGA2_gen_reg_info((uint8_t *)reg->cmd_reg, (uint8_t *)reg->csc_reg, req) == -1) {
         printk("gen reg info error\n");
         free_page((unsigned long)reg);
 
@@ -934,6 +934,7 @@ static void rga2_service_session_clear(rga2_session *session)
 /* Caller must hold rga_service.lock */
 static void rga2_try_set_reg(void)
 {
+	int i;
 	struct rga2_reg *reg ;
 
 	if (list_empty(&rga2_service.running))
@@ -958,16 +959,29 @@ static void rga2_try_set_reg(void)
 			/* CMD buff */
 			rga2_write(virt_to_phys(reg->cmd_reg), RGA2_CMD_BASE);
 
+			/* full csc reg */
+			for (i = 0; i < 12; i++) {
+				rga2_write(reg->csc_reg[i], RGA2_CSC_COE_BASE + i * 4);
+			}
+
 #if RGA2_DEBUGFS
 			if (RGA2_TEST_REG) {
 				if (rga2_flag) {
-					int32_t i, *p;
+					int32_t *p;
+
 					p = rga2_service.cmd_buff;
 					INFO("CMD_REG\n");
 					for (i=0; i<8; i++)
 						INFO("%.8x %.8x %.8x %.8x\n",
 						     p[0 + i * 4], p[1 + i * 4],
 						     p[2 + i * 4], p[3 + i * 4]);
+
+					p = reg->csc_reg;
+					INFO("CSC_REG\n");
+					for (i = 0; i < 3; i++)
+						INFO("%.8x %.8x %.8x %.8x\n",
+						     p[0 + i * 4], p[1 + i * 4],
+						     p[2 + i * 4], p[3 + i * 4]);
 				}
 			}
 #endif
@@ -989,7 +1003,6 @@ static void rga2_try_set_reg(void)
 #if RGA2_DEBUGFS
 			if (RGA2_TEST_REG) {
 				if (rga2_flag) {
-					uint32_t i;
 					INFO("CMD_READ_BACK_REG\n");
 					for (i=0; i<8; i++)
 						INFO("%.8x %.8x %.8x %.8x\n",
@@ -997,6 +1010,14 @@ static void rga2_try_set_reg(void)
 						     rga2_read(0x100 + i * 16 + 4),
 						     rga2_read(0x100 + i * 16 + 8),
 						     rga2_read(0x100 + i * 16 + 12));
+
+					INFO("CSC_READ_BACK_REG\n");
+					for (i = 0; i < 3; i++)
+						INFO("%.8x %.8x %.8x %.8x\n",
+						     rga2_read(RGA2_CSC_COE_BASE + i * 16 + 0),
+						     rga2_read(RGA2_CSC_COE_BASE + i * 16 + 4),
+						     rga2_read(RGA2_CSC_COE_BASE + i * 16 + 8),
+						     rga2_read(RGA2_CSC_COE_BASE + i * 16 + 12));
 				}
 
 			}
diff --git a/drivers/video/rockchip/rga2/rga2_reg_info.c b/drivers/video/rockchip/rga2/rga2_reg_info.c
index 1514c92ab5c4..51231e80d9cb 100644
--- a/drivers/video/rockchip/rga2/rga2_reg_info.c
+++ b/drivers/video/rockchip/rga2/rga2_reg_info.c
@@ -476,6 +476,8 @@ static void RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
     reg = ((reg & (~m_RGA2_DST_INFO_SW_DITHER_MODE)) | (s_RGA2_DST_INFO_SW_DITHER_MODE(msg->dither_mode)));
     reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_CSC_MODE)) | (s_RGA2_DST_INFO_SW_DST_CSC_MODE(msg->yuv2rgb_mode >> 2)));
     reg = ((reg & (~m_RGA2_DST_INFO_SW_CSC_CLIP_MODE)) | (s_RGA2_DST_INFO_SW_CSC_CLIP_MODE(msg->yuv2rgb_mode >> 4)));
+    /* full csc enable */
+    reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_CSC_MODE_2)) | (s_RGA2_DST_INFO_SW_DST_CSC_MODE_2(msg->full_csc.flag)));
     /* Some older chips do not support src1 csc mode, they do not have these two registers. */
     reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_CSC_MODE)) | (s_RGA2_DST_INFO_SW_SRC1_CSC_MODE(msg->yuv2rgb_mode >> 5)));
     reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_CSC_CLIP_MODE)) | (s_RGA2_DST_INFO_SW_SRC1_CSC_CLIP_MODE(msg->yuv2rgb_mode >> 7)));
@@ -790,6 +792,56 @@ static void RGA2_set_reg_rop_info(u8 *base, struct rga2_req *msg)
 
 }
 
+static void RGA2_set_reg_full_csc(u8 *base, struct rga2_req *msg)
+{
+	RK_U32 *bRGA2_DST_CSC_00;
+	RK_U32 *bRGA2_DST_CSC_01;
+	RK_U32 *bRGA2_DST_CSC_02;
+	RK_U32 *bRGA2_DST_CSC_OFF0;
+
+	RK_U32 *bRGA2_DST_CSC_10;
+	RK_U32 *bRGA2_DST_CSC_11;
+	RK_U32 *bRGA2_DST_CSC_12;
+	RK_U32 *bRGA2_DST_CSC_OFF1;
+
+	RK_U32 *bRGA2_DST_CSC_20;
+	RK_U32 *bRGA2_DST_CSC_21;
+	RK_U32 *bRGA2_DST_CSC_22;
+	RK_U32 *bRGA2_DST_CSC_OFF2;
+
+	bRGA2_DST_CSC_00 = (RK_U32 *)(base + RGA2_DST_CSC_00_OFFSET);
+	bRGA2_DST_CSC_01 = (RK_U32 *)(base + RGA2_DST_CSC_01_OFFSET);
+	bRGA2_DST_CSC_02 = (RK_U32 *)(base + RGA2_DST_CSC_02_OFFSET);
+	bRGA2_DST_CSC_OFF0 = (RK_U32 *)(base + RGA2_DST_CSC_OFF0_OFFSET);
+
+	bRGA2_DST_CSC_10 = (RK_U32 *)(base + RGA2_DST_CSC_10_OFFSET);
+	bRGA2_DST_CSC_11 = (RK_U32 *)(base + RGA2_DST_CSC_11_OFFSET);
+	bRGA2_DST_CSC_12 = (RK_U32 *)(base + RGA2_DST_CSC_12_OFFSET);
+	bRGA2_DST_CSC_OFF1 = (RK_U32 *)(base + RGA2_DST_CSC_OFF1_OFFSET);
+
+	bRGA2_DST_CSC_20 = (RK_U32 *)(base + RGA2_DST_CSC_20_OFFSET);
+	bRGA2_DST_CSC_21 = (RK_U32 *)(base + RGA2_DST_CSC_21_OFFSET);
+	bRGA2_DST_CSC_22 = (RK_U32 *)(base + RGA2_DST_CSC_22_OFFSET);
+	bRGA2_DST_CSC_OFF2 = (RK_U32 *)(base + RGA2_DST_CSC_OFF2_OFFSET);
+
+	/* full csc coefficient */
+	/* Y coefficient */
+	*bRGA2_DST_CSC_00 = msg->full_csc.coe_y.r_v;
+	*bRGA2_DST_CSC_01 = msg->full_csc.coe_y.g_y;
+	*bRGA2_DST_CSC_02 = msg->full_csc.coe_y.b_u;
+	*bRGA2_DST_CSC_OFF0 = msg->full_csc.coe_y.off;
+	/* U coefficient */
+	*bRGA2_DST_CSC_10 = msg->full_csc.coe_u.r_v;
+	*bRGA2_DST_CSC_11 = msg->full_csc.coe_u.g_y;
+	*bRGA2_DST_CSC_12 = msg->full_csc.coe_u.b_u;
+	*bRGA2_DST_CSC_OFF1 = msg->full_csc.coe_u.off;
+	/* V coefficient */
+	*bRGA2_DST_CSC_20 = msg->full_csc.coe_v.r_v;
+	*bRGA2_DST_CSC_21 = msg->full_csc.coe_v.g_y;
+	*bRGA2_DST_CSC_22 = msg->full_csc.coe_v.b_u;
+	*bRGA2_DST_CSC_OFF2 = msg->full_csc.coe_v.off;
+}
+
 static void RGA2_set_reg_color_palette(RK_U8 *base, struct rga2_req *msg)
 {
     RK_U32 *bRGA_SRC_BASE0, *bRGA_SRC_INFO, *bRGA_SRC_VIR_INFO, *bRGA_SRC_ACT_INFO, *bRGA_SRC_FG_COLOR, *bRGA_SRC_BG_COLOR;
@@ -989,9 +1041,8 @@ static void RGA2_set_mmu_info(RK_U8 *base, struct rga2_req *msg)
     *bRGA_MMU_ELS_BASE  = (RK_U32)(msg->mmu_info.els_base_addr)  >> 4;
 }
 
-
 int
-RGA2_gen_reg_info(RK_U8 *base , struct rga2_req *msg)
+RGA2_gen_reg_info(RK_U8 *base, RK_U8 *csc_base, struct rga2_req *msg)
 {
 	RK_U8 dst_nn_quantize_en = 0;
 
@@ -1011,6 +1062,10 @@ RGA2_gen_reg_info(RK_U8 *base , struct rga2_req *msg)
 					RGA2_set_reg_rop_info(base, msg);
 				}
 			}
+
+			if (msg->full_csc.flag) {
+				RGA2_set_reg_full_csc(csc_base, msg);
+			}
             break;
         case color_fill_mode :
             RGA2_set_reg_color_fill(base, msg);
@@ -1195,6 +1250,7 @@ void RGA_MSG_2_RGA2_MSG(struct rga_req *req_rga, struct rga2_req *req)
     req->fg_color = req_rga->fg_color;
     req->bg_color = req_rga->bg_color;
     memcpy(&req->gr_color, &req_rga->gr_color, sizeof(req_rga->gr_color));
+    memcpy(&req->full_csc, &req_rga->full_csc, sizeof(req_rga->full_csc));
 
     req->palette_mode = req_rga->palette_mode;
     req->yuv2rgb_mode = req_rga->yuv2rgb_mode;
@@ -1455,6 +1511,8 @@ void RGA_MSG_2_RGA2_MSG_32(struct rga_req_32 *req_rga, struct rga2_req *req)
     req->fg_color = req_rga->fg_color;
     req->bg_color = req_rga->bg_color;
     memcpy(&req->gr_color, &req_rga->gr_color, sizeof(req_rga->gr_color));
+    memcpy(&req->full_csc, &req_rga->full_csc, sizeof(req_rga->full_csc));
+
     req->palette_mode = req_rga->palette_mode;
     req->yuv2rgb_mode = req_rga->yuv2rgb_mode;
     req->endian_mode = req_rga->endian_mode;
diff --git a/drivers/video/rockchip/rga2/rga2_reg_info.h b/drivers/video/rockchip/rga2/rga2_reg_info.h
index 3f51652bbde8..7aaac7d3502b 100644
--- a/drivers/video/rockchip/rga2/rga2_reg_info.h
+++ b/drivers/video/rockchip/rga2/rga2_reg_info.h
@@ -142,6 +142,7 @@
 #define m_RGA2_DST_INFO_SW_DITHER_MODE               (  0x3<<14)
 #define m_RGA2_DST_INFO_SW_DST_CSC_MODE              (  0x3<<16)    //add
 #define m_RGA2_DST_INFO_SW_CSC_CLIP_MODE             (  0x1<<18)
+#define m_RGA2_DST_INFO_SW_DST_CSC_MODE_2            (  0x1<<19)    //add
 #define m_RGA2_DST_INFO_SW_DST_FMT_YUV400_EN         (  0x1<<24)
 #define m_RGA2_DST_INFO_SW_DST_FMT_Y4_EN             (  0x1<<25)
 #define m_RGA2_DST_INFO_SW_DST_NN_QUANTIZE_EN        (  0x1<<26)
@@ -160,6 +161,7 @@
 #define s_RGA2_DST_INFO_SW_DITHER_MODE(x)               (  (x&0x3)<<14)
 #define s_RGA2_DST_INFO_SW_DST_CSC_MODE(x)              (  (x&0x3)<<16)    //add
 #define s_RGA2_DST_INFO_SW_CSC_CLIP_MODE(x)             (  (x&0x1)<<18)
+#define s_RGA2_DST_INFO_SW_DST_CSC_MODE_2(x)            (  (x&0x1)<<19)    //add
 #define s_RGA2_DST_INFO_SW_DST_FMT_YUV400_EN(x)         (  (x&0x1)<<24)
 #define s_RGA2_DST_INFO_SW_DST_FMT_Y4_EN(x)             (  (x&0x1)<<25)
 #define s_RGA2_DST_INFO_SW_DST_NN_QUANTIZE_EN(x)        (  (x&0x1)<<26)
@@ -264,6 +266,19 @@
 #define RGA2_INT_OFFSET                  0x10
 #define RGA2_MMU_CTRL0_OFFSET            0x14
 #define RGA2_MMU_CMD_BASE_OFFSET         0x18
+/* dst full csc */
+#define RGA2_DST_CSC_00_OFFSET                  0x0
+#define RGA2_DST_CSC_01_OFFSET                  0x4
+#define RGA2_DST_CSC_02_OFFSET                  0x8
+#define RGA2_DST_CSC_OFF0_OFFSET                0xc
+#define RGA2_DST_CSC_10_OFFSET                  0x10
+#define RGA2_DST_CSC_11_OFFSET                  0x14
+#define RGA2_DST_CSC_12_OFFSET                  0x18
+#define RGA2_DST_CSC_OFF1_OFFSET                0x1c
+#define RGA2_DST_CSC_20_OFFSET                  0x20
+#define RGA2_DST_CSC_21_OFFSET                  0x24
+#define RGA2_DST_CSC_22_OFFSET                  0x28
+#define RGA2_DST_CSC_OFF2_OFFSET                0x2c
 
 #define RGA2_MODE_CTRL_OFFSET                   0x00
 #define RGA2_SRC_INFO_OFFSET                    0x04
@@ -306,7 +321,7 @@
 #define RGA2_MMU_DST_BASE_OFFSET                0x78
 #define RGA2_MMU_ELS_BASE_OFFSET                0x7c
 
-int RGA2_gen_reg_info(unsigned char *base, struct rga2_req *msg);
+int RGA2_gen_reg_info(unsigned char *base, unsigned char *csc_base, struct rga2_req *msg);
 void RGA_MSG_2_RGA2_MSG(struct rga_req *req_rga, struct rga2_req *req);
 void RGA_MSG_2_RGA2_MSG_32(struct rga_req_32 *req_rga, struct rga2_req *req);
 

commit d16e0cc62cc8f2307b6c6ab3473f0e02d27fedbf
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Fri May 14 11:33:07 2021 +0800

    drm/rockchip: vop2: Enable sd2hdr when we have a sdr plane but hdr output
    
    We thought when userspace switch hdmi to hdr mode, it must
    give vop a hdr plane, but We meet a case: composer give
    vop only one sdr plane, but switch hdmi to hdr mode.
    
    so we don't check the plane number for sdr2hdr_en;
    
    Change-Id: I4804a88321af84328735d6499ac9df610bf2cb85
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 7fe2f47bfbb5..1b5e541ec2c2 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -4360,7 +4360,7 @@ static void vop2_setup_hdr10(struct vop2_video_port *vp, uint8_t win_phys_id)
 	bool sdr2hdr_en = 0;
 	bool sdr2hdr_tf = 0;
 	bool hdr2sdr_tf_update = 1;
-	bool sdr2hdr_tf_update = 0;
+	bool sdr2hdr_tf_update = 1;
 
 	/*
 	 * Check whether this video port support hdr or not
@@ -4387,7 +4387,7 @@ static void vop2_setup_hdr10(struct vop2_video_port *vp, uint8_t win_phys_id)
 	if (vp->hdr_in && !vp->hdr_out)
 		hdr2sdr_en = 1;
 
-	if (vp->hdr_out && (vp->nr_layers > 1))
+	if (!vp->hdr_in && vp->hdr_out)
 		sdr2hdr_en = 1;
 
 	vp->sdr2hdr_en = sdr2hdr_en;
@@ -4396,7 +4396,7 @@ static void vop2_setup_hdr10(struct vop2_video_port *vp, uint8_t win_phys_id)
 
 	if (sdr2hdr_en) {
 		sdr2hdr_r2r_mode = BT709_TO_BT2020;
-		if (vp->hdr_in)
+		if (vp->hdr_out)
 			sdr2hdr_tf = SDR2HDR_FOR_HDR;
 		else
 			sdr2hdr_tf = SDR2HDR_FOR_BT2020;

commit 48592120403931faa73339b63344d45d13ccb50b
Merge: 8ff7a6bc60f9 6b7b0056defc
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Mon May 31 09:17:27 2021 +0200

    Merge 4.19.192 into android-4.19-stable
    
    Changes in 4.19.192
            firmware: arm_scpi: Prevent the ternary sign expansion bug
            openrisc: Fix a memory leak
            RDMA/rxe: Clear all QP fields if creation failed
            scsi: qla2xxx: Fix error return code in qla82xx_write_flash_dword()
            RDMA/mlx5: Recover from fatal event in dual port mode
            platform/x86: dell-smbios-wmi: Fix oops on rmmod dell_smbios
            ptrace: make ptrace() fail if the tracee changed its pid unexpectedly
            nvmet: seset ns->file when open fails
            locking/mutex: clear MUTEX_FLAGS if wait_list is empty due to signal
            cifs: fix memory leak in smb2_copychunk_range
            ALSA: dice: fix stream format for TC Electronic Konnekt Live at high sampling transfer frequency
            ALSA: line6: Fix racy initialization of LINE6 MIDI
            ALSA: dice: fix stream format at middle sampling rate for Alesis iO 26
            ALSA: usb-audio: Validate MS endpoint descriptors
            ALSA: bebob/oxfw: fix Kconfig entry for Mackie d.2 Pro
            Revert "ALSA: sb8: add a check for request_region"
            ALSA: hda/realtek: reset eapd coeff to default value for alc287
            ALSA: hda/realtek: Add some CLOVE SSIDs of ALC293
            Revert "rapidio: fix a NULL pointer dereference when create_workqueue() fails"
            rapidio: handle create_workqueue() failure
            Revert "serial: mvebu-uart: Fix to avoid a potential NULL pointer dereference"
            xen-pciback: reconfigure also from backend watch handler
            dm snapshot: fix crash with transient storage and zero chunk size
            Revert "video: hgafb: fix potential NULL pointer dereference"
            Revert "net: stmicro: fix a missing check of clk_prepare"
            Revert "leds: lp5523: fix a missing check of return value of lp55xx_read"
            Revert "hwmon: (lm80) fix a missing check of bus read in lm80 probe"
            Revert "video: imsttfb: fix potential NULL pointer dereferences"
            Revert "ecryptfs: replace BUG_ON with error handling code"
            Revert "scsi: ufs: fix a missing check of devm_reset_control_get"
            Revert "gdrom: fix a memory leak bug"
            cdrom: gdrom: deallocate struct gdrom_unit fields in remove_gdrom
            cdrom: gdrom: initialize global variable at init time
            Revert "media: rcar_drif: fix a memory disclosure"
            Revert "rtlwifi: fix a potential NULL pointer dereference"
            Revert "qlcnic: Avoid potential NULL pointer dereference"
            Revert "niu: fix missing checks of niu_pci_eeprom_read"
            ethernet: sun: niu: fix missing checks of niu_pci_eeprom_read()
            net: stmicro: handle clk_prepare() failure during init
            scsi: ufs: handle cleanup correctly on devm_reset_control_get error
            net: rtlwifi: properly check for alloc_workqueue() failure
            leds: lp5523: check return value of lp5xx_read and jump to cleanup code
            qlcnic: Add null check after calling netdev_alloc_skb
            video: hgafb: fix potential NULL pointer dereference
            vgacon: Record video mode changes with VT_RESIZEX
            vt: Fix character height handling with VT_RESIZEX
            tty: vt: always invoke vc->vc_sw->con_resize callback
            video: hgafb: correctly handle card detect failure during probe
            Bluetooth: SMP: Fail if remote and local public keys are identical
            Linux 4.19.192
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I120d11a184c53fb969144fd232ca11098f61d6d6

commit 8ff7a6bc60f9731e8aef9ff0ebfd32bc1c46ffff
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Sun May 30 16:58:33 2021 +0200

    Revert "spi: Fix use-after-free with devm_spi_alloc_*"
    
    This reverts commit 28a5529068c51cdf0295ab1e11a99a3a909a03e4 which is
    commit 794aaf01444d4e765e2b067cba01cc69c1c68ed9 upstream.
    
    It breaks the abi for SPI drivers and shouldn't be a problem for Android
    devices.
    
    Bug: 161946584
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I6bfd496ebbdcc490058e9e6c29ab29b8fee57b3e

diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index bbe33016d371..7dabbc82b646 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -2084,7 +2084,6 @@ struct spi_controller *__devm_spi_alloc_controller(struct device *dev,
 
 	ctlr = __spi_alloc_controller(dev, size, slave);
 	if (ctlr) {
-		ctlr->devm_allocated = true;
 		*ptr = ctlr;
 		devres_add(dev, ptr);
 	} else {
@@ -2345,6 +2344,11 @@ int devm_spi_register_controller(struct device *dev,
 }
 EXPORT_SYMBOL_GPL(devm_spi_register_controller);
 
+static int devm_spi_match_controller(struct device *dev, void *res, void *ctlr)
+{
+	return *(struct spi_controller **)res == ctlr;
+}
+
 static int __unregister(struct device *dev, void *null)
 {
 	spi_unregister_device(to_spi_device(dev));
@@ -2391,7 +2395,8 @@ void spi_unregister_controller(struct spi_controller *ctlr)
 	/* Release the last reference on the controller if its driver
 	 * has not yet been converted to devm_spi_alloc_master/slave().
 	 */
-	if (!ctlr->devm_allocated)
+	if (!devres_find(ctlr->dev.parent, devm_spi_release_controller,
+			 devm_spi_match_controller, ctlr))
 		put_device(&ctlr->dev);
 
 	/* free bus id */
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h
index 16158fe097a8..8ceba9b8e51e 100644
--- a/include/linux/spi/spi.h
+++ b/include/linux/spi/spi.h
@@ -450,9 +450,6 @@ struct spi_controller {
 
 #define SPI_MASTER_GPIO_SS		BIT(5)	/* GPIO CS must select slave */
 
-	/* flag indicating this is a non-devres managed controller */
-	bool			devm_allocated;
-
 	/* flag indicating this is an SPI slave controller */
 	bool			slave;
 

commit dd4d5fdb582dbcd3e1aee93c9cc1fce5edc410fd
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Sun May 30 16:43:54 2021 +0200

    Revert "modules: inherit TAINT_PROPRIETARY_MODULE"
    
    This reverts commit 2ab98abf0d2a820efa726a5e143133fc5993ed56 which is
    commit 262e6ae7081df304fc625cf368d5c2cbba2bb991 upstream.
    
    It breaks the ABI here, and it's not something needed in this old kernel
    that is not getting new devices added for it.
    
    Bug: 161946584
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I5058656c9ab1988b669b90ab90a07ad77cd8eb6b

diff --git a/include/linux/module.h b/include/linux/module.h
index 3c693fd31ed8..ebfa6af7a173 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -365,7 +365,6 @@ struct module {
 	unsigned int num_gpl_syms;
 	const struct kernel_symbol *gpl_syms;
 	const s32 *gpl_crcs;
-	bool using_gplonly_symbols;
 
 #ifdef CONFIG_UNUSED_SYMBOLS
 	/* unused exported symbols. */
diff --git a/kernel/module.c b/kernel/module.c
index 369de5381fe8..60150d2d918e 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -1379,25 +1379,6 @@ static inline int same_magic(const char *amagic, const char *bmagic,
 }
 #endif /* CONFIG_MODVERSIONS */
 
-static bool inherit_taint(struct module *mod, struct module *owner)
-{
-	if (!owner || !test_bit(TAINT_PROPRIETARY_MODULE, &owner->taints))
-		return true;
-
-	if (mod->using_gplonly_symbols) {
-		pr_err("%s: module using GPL-only symbols uses symbols from proprietary module %s.\n",
-			mod->name, owner->name);
-		return false;
-	}
-
-	if (!test_bit(TAINT_PROPRIETARY_MODULE, &mod->taints)) {
-		pr_warn("%s: module uses symbols from proprietary module %s, inheriting taint.\n",
-			mod->name, owner->name);
-		set_bit(TAINT_PROPRIETARY_MODULE, &mod->taints);
-	}
-	return true;
-}
-
 /* Resolve a symbol for this module.  I.e. if we find one, record usage. */
 static const struct kernel_symbol *resolve_symbol(struct module *mod,
 						  const struct load_info *info,
@@ -1422,14 +1403,6 @@ static const struct kernel_symbol *resolve_symbol(struct module *mod,
 	if (!sym)
 		goto unlock;
 
-	if (license == GPL_ONLY)
-		mod->using_gplonly_symbols = true;
-
-	if (!inherit_taint(mod, owner)) {
-		sym = NULL;
-		goto getname;
-	}
-
 	if (!check_version(info, name, mod, crc)) {
 		sym = ERR_PTR(-EINVAL);
 		goto getname;

commit 5d325f423b90cb8b9f8ad33074b17343dfb4f940
Author: Liang Chen <cl@rock-chips.com>
Date:   Fri May 28 10:43:00 2021 +0800

    arm64: dts: rockchip: rk356x: adjust opp-table for correlation chips
    
    1. limit vmin of cpu/gpu/npu/logic by mbist_vmin.
    2. raise vdd_logic when npu run at 1.0GHz or venc run at 400MHz.
    3. disable npu@1.0GHz and venc@400MHz by default.
    4. reduce vdd_logic for the chips with big leakage.
    5. adjust low-temp-adjust-volt table.
    
    Change-Id: If7ce6f010422d20e2dfd643a6894fa7304e6372f
    Signed-off-by: Liang Chen <cl@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3566.dtsi b/arch/arm64/boot/dts/rockchip/rk3566.dtsi
index cb91161d4e6b..9c221b095208 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566.dtsi
@@ -34,6 +34,8 @@
 	opp-1056000000 {
 		opp-hz = /bits/ 64 <1056000000>;
 		opp-microvolt = <900000>;
+		opp-microvolt-L0 = <900000>;
+		opp-microvolt-L1 = <850000>;
 	};
 	/delete-node/ opp-1560000000;
 };
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
index d45a1b03eee7..8afcb855b1d1 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
@@ -333,6 +333,12 @@
 	};
 };
 
+&bus_npu {
+	bus-supply = <&vdd_logic>;
+	pvtm-supply = <&vdd_cpu>;
+	status = "okay";
+};
+
 &can0 {
 	assigned-clocks = <&cru CLK_CAN0>;
 	assigned-clock-rates = <150000000>;
@@ -1641,6 +1647,7 @@
 };
 
 &rkvenc {
+	venc-supply = <&vdd_logic>;
 	status = "okay";
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index fe7b78868b9d..e80b6800639b 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -132,16 +132,30 @@
 		compatible = "operating-points-v2";
 		opp-shared;
 
+		mbist-vmin = <825000 900000 950000>;
+		nvmem-cells = <&cpu_leakage>, <&core_pvtm>, <&mbist_vmin>;
+		nvmem-cell-names = "leakage", "pvtm", "mbist-vmin";
+		rockchip,pvtm-voltage-sel = <
+			0        82000   0
+			82001    93000   1
+			93001    100000  2
+		>;
+		rockchip,pvtm-freq = <408000>;
+		rockchip,pvtm-volt = <900000>;
+		rockchip,pvtm-ch = <0 5>;
+		rockchip,pvtm-sample-time = <1000>;
+		rockchip,pvtm-number = <10>;
+		rockchip,pvtm-error = <1000>;
+		rockchip,pvtm-ref-temp = <40>;
+		rockchip,pvtm-temp-prop = <26 26>;
+		rockchip,thermal-zone = "soc-thermal";
 		rockchip,temp-hysteresis = <5000>;
 		rockchip,low-temp = <0>;
 		rockchip,low-temp-adjust-volt = <
 			/* MHz    MHz    uV */
-			1104      1608   75000
+			   0      1608   75000
 		>;
 
-		nvmem-cells = <&cpu_leakage>;
-		nvmem-cell-names = "leakage";
-
 		opp-408000000 {
 			opp-hz = /bits/ 64 <408000000>;
 			opp-microvolt = <825000 825000 1150000>;
@@ -1068,16 +1082,16 @@
 	npu_opp_table: npu-opp-table {
 		compatible = "operating-points-v2";
 
+		mbist-vmin = <825000 900000 950000>;
+		nvmem-cells = <&npu_leakage>, <&core_pvtm>, <&mbist_vmin>;
+		nvmem-cell-names = "leakage", "pvtm", "mbist-vmin";
 		rockchip,temp-hysteresis = <5000>;
 		rockchip,low-temp = <0>;
 		rockchip,low-temp-adjust-volt = <
 			/* MHz    MHz    uV */
-			700       700    50000
+			   0      700    50000
 		>;
 
-		nvmem-cells = <&npu_leakage>;
-		nvmem-cell-names = "leakage";
-
 		opp-200000000 {
 			opp-hz = /bits/ 64 <200000000>;
 			opp-microvolt = <825000 825000 1000000>;
@@ -1109,6 +1123,42 @@
 		opp-1000000000 {
 			opp-hz = /bits/ 64 <1000000000>;
 			opp-microvolt = <1000000 1000000 1000000>;
+			status = "disabled";
+		};
+	};
+
+	bus_npu: bus-npu {
+		compatible = "rockchip,rk3568-bus";
+		rockchip,busfreq-policy = "clkfreq";
+		clocks = <&scmi_clk 2>;
+		clock-names = "bus";
+		operating-points-v2 = <&bus_npu_opp_table>;
+		status = "disabled";
+	};
+
+	bus_npu_opp_table: bus-npu-opp-table {
+		compatible = "operating-points-v2";
+		opp-shared;
+
+		nvmem-cells = <&core_pvtm>;
+		nvmem-cell-names = "pvtm";
+		rockchip,pvtm-voltage-sel = <
+			0        82000   0
+			82001    93000   1
+			93001    100000  2
+		>;
+		rockchip,pvtm-ch = <0 5>;
+
+		opp-1000000000 {
+			opp-hz = /bits/ 64 <1000000000>;
+			opp-microvolt = <950000>;
+			opp-microvolt-L0 = <950000>;
+			opp-microvolt-L1 = <925000>;
+			opp-microvolt-L2 = <0>;
+		};
+		opp-900000000 {
+			opp-hz = /bits/ 64 <900000000>;
+			opp-microvolt = <0>;
 		};
 	};
 
@@ -1157,8 +1207,9 @@
 	gpu_opp_table: opp-table2 {
 		compatible = "operating-points-v2";
 
-		nvmem-cells = <&gpu_leakage>;
-		nvmem-cell-names = "leakage";
+		mbist-vmin = <825000 900000 950000>;
+		nvmem-cells = <&gpu_leakage>, <&core_pvtm>, <&mbist_vmin>;
+		nvmem-cell-names = "leakage", "pvtm", "mbist-vmin";
 
 		opp-200000000 {
 			opp-hz = /bits/ 64 <200000000>;
@@ -1374,7 +1425,7 @@
 		clocks = <&cru ACLK_RKVENC>, <&cru HCLK_RKVENC>,
 			<&cru CLK_RKVENC_CORE>;
 		clock-names = "aclk_vcodec", "hclk_vcodec", "clk_core";
-		rockchip,normal-rates = <297000000>, <0>, <400000000>;
+		rockchip,normal-rates = <297000000>, <0>, <297000000>;
 		resets = <&cru SRST_A_RKVENC>, <&cru SRST_H_RKVENC>,
 			<&cru SRST_RKVENC_CORE>;
 		reset-names = "video_a", "video_h", "video_core";
@@ -1386,9 +1437,38 @@
 		rockchip,taskqueue-node = <3>;
 		rockchip,resetgroup-node = <3>;
 		power-domains = <&power RK3568_PD_RKVENC>;
+		operating-points-v2 = <&rkvenc_opp_table>;
 		status = "disabled";
 	};
 
+	rkvenc_opp_table: rkvenc-opp-table {
+		compatible = "operating-points-v2";
+
+		nvmem-cells = <&core_pvtm>;
+		nvmem-cell-names = "pvtm";
+		rockchip,pvtm-voltage-sel = <
+			0        82000   0
+			82001    93000   1
+			93001    100000  2
+		>;
+		rockchip,pvtm-ch = <0 5>;
+
+		opp-297000000 {
+			opp-hz = /bits/ 64 <297000000>;
+			opp-microvolt = <900000>;
+			opp-microvolt-L0 = <900000>;
+			opp-microvolt-L1 = <900000>;
+			opp-microvolt-L2 = <850000>;
+		};
+		opp-400000000 {
+			opp-hz = /bits/ 64 <400000000>;
+			opp-microvolt = <950000>;
+			opp-microvolt-L0 = <950000>;
+			opp-microvolt-L1 = <900000>;
+			opp-microvolt-L2 = <850000>;
+		};
+	};
+
 	rkvenc_mmu: iommu@fdf40f00 {
 		compatible = "rockchip,iommu-v2";
 		reg = <0x0 0xfdf40f00 0x0 0x40>, <0x0 0xfdf40f40 0x0 0x40>;
@@ -2076,33 +2156,50 @@
 	dmc_opp_table: dmc-opp-table {
 		compatible = "operating-points-v2";
 
+		mbist-vmin = <825000 900000 950000>;
+		nvmem-cells = <&log_leakage>, <&core_pvtm>, <&mbist_vmin>;
+		nvmem-cell-names = "leakage", "pvtm", "mbist-vmin";
 		rockchip,temp-hysteresis = <5000>;
 		rockchip,low-temp = <0>;
 		rockchip,low-temp-adjust-volt = <
 			/* MHz    MHz    uV */
-			0         1560   25000
+			   0      1560   25000
+		>;
+		rockchip,leakage-voltage-sel = <
+			1   80    0
+			81  254   1
 		>;
 
 		opp-324000000 {
 			opp-hz = /bits/ 64 <324000000>;
 			opp-microvolt = <900000>;
+			opp-microvolt-L0 = <900000>;
+			opp-microvolt-L1 = <850000>;
 		};
 		opp-528000000 {
 			opp-hz = /bits/ 64 <528000000>;
 			opp-microvolt = <900000>;
+			opp-microvolt-L0 = <900000>;
+			opp-microvolt-L1 = <850000>;
 		};
 		opp-780000000 {
 			opp-hz = /bits/ 64 <780000000>;
 			opp-microvolt = <900000>;
+			opp-microvolt-L0 = <900000>;
+			opp-microvolt-L1 = <850000>;
 		};
 		opp-920000000 {
 			opp-hz = /bits/ 64 <920000000>;
 			opp-microvolt = <900000>;
+			opp-microvolt-L0 = <900000>;
+			opp-microvolt-L1 = <850000>;
 			status = "disabled";
 		};
 		opp-1560000000 {
 			opp-hz = /bits/ 64 <1560000000>;
 			opp-microvolt = <900000>;
+			opp-microvolt-L0 = <900000>;
+			opp-microvolt-L1 = <850000>;
 		};
 	};
 
@@ -2419,6 +2516,10 @@
 			reg = <0x08 0x1>;
 			bits = <3 3>;
 		};
+		mbist_vmin: mbist-vmin@9 {
+			reg = <0x09 0x1>;
+			bits = <0 4>;
+		};
 		otp_id: id@a {
 			reg = <0x0a 0x10>;
 		};
@@ -2434,6 +2535,9 @@
 		gpu_leakage: gpu-leakage@1d {
 			reg = <0x1d 0x1>;
 		};
+		core_pvtm:core-pvtm@2a {
+			reg = <0x2a 0x2>;
+		};
 	};
 
 	i2s0_8ch: i2s@fe400000 {

commit 23c8b1ac26e7d9dc7f261908f5cbe219bbd358e2
Author: Liang Chen <cl@rock-chips.com>
Date:   Fri May 28 08:50:00 2021 +0800

    PM / devfreq: rockchip_bus: add support for rk3568
    
    Add support for rk3568 and init opp-table with rockchip_init_opp_table()
    so that rockchip_bus can support pvtm and leakage.
    
    Change-Id: Ief17dba8264906f987d4dac93b2e7344c98bc8fa
    Signed-off-by: Liang Chen <cl@rock-chips.com>

diff --git a/drivers/devfreq/rockchip_bus.c b/drivers/devfreq/rockchip_bus.c
index 663fda7e0f9e..4d4206e7cab2 100644
--- a/drivers/devfreq/rockchip_bus.c
+++ b/drivers/devfreq/rockchip_bus.c
@@ -17,6 +17,7 @@
 #include <linux/rockchip/rockchip_sip.h>
 #include <linux/slab.h>
 #include <linux/string.h>
+#include <soc/rockchip/rockchip_opp_select.h>
 
 #define CLUSTER0	0
 #define CLUSTER1	1
@@ -163,7 +164,7 @@ static int rockchip_bus_power_control_init(struct rockchip_bus *bus)
 		return PTR_ERR(bus->regulator);
 	}
 
-	ret = dev_pm_opp_of_add_table(dev);
+	ret = rockchip_init_opp_table(dev, NULL, "leakage", "pvtm");
 	if (ret < 0) {
 		dev_err(dev, "failed to get OPP table\n");
 		return ret;
@@ -446,6 +447,7 @@ static const struct of_device_id rockchip_busfreq_of_match[] = {
 	{ .compatible = "rockchip,rk3288-bus", },
 	{ .compatible = "rockchip,rk3368-bus", },
 	{ .compatible = "rockchip,rk3399-bus", },
+	{ .compatible = "rockchip,rk3568-bus", },
 	{ .compatible = "rockchip,rv1126-bus", },
 	{ },
 };

commit 79d32ab7d43b552ced757ade145d0fd9ee092b75
Author: Liang Chen <cl@rock-chips.com>
Date:   Fri May 28 08:38:06 2021 +0800

    soc: rockchip: opp_select: adjust opp-table by pvtm and mbist_vmin
    
    1. support get pvtm from otp.
    2. adjust opp-table by mbist_vmit which is get from otp.
    
    Change-Id: Ie3703873880b65b2af03ae474065d541c7f9d605
    Signed-off-by: Liang Chen <cl@rock-chips.com>

diff --git a/drivers/soc/rockchip/rockchip_opp_select.c b/drivers/soc/rockchip/rockchip_opp_select.c
index b2151c1489ab..6f1b50be9682 100644
--- a/drivers/soc/rockchip/rockchip_opp_select.c
+++ b/drivers/soc/rockchip/rockchip_opp_select.c
@@ -149,6 +149,49 @@ int rockchip_get_efuse_value(struct device_node *np, char *porp_name,
 }
 EXPORT_SYMBOL(rockchip_get_efuse_value);
 
+static int rockchip_nvmem_cell_read_common(struct device_node *np,
+					   const char *cell_id,
+					   void *val, size_t count)
+{
+	struct nvmem_cell *cell;
+	void *buf;
+	size_t len;
+
+	cell = of_nvmem_cell_get(np, cell_id);
+	if (IS_ERR(cell))
+		return PTR_ERR(cell);
+
+	buf = nvmem_cell_read(cell, &len);
+	if (IS_ERR(buf)) {
+		nvmem_cell_put(cell);
+		return PTR_ERR(buf);
+	}
+	if (len != count) {
+		kfree(buf);
+		nvmem_cell_put(cell);
+		return -EINVAL;
+	}
+	memcpy(val, buf, count);
+	kfree(buf);
+	nvmem_cell_put(cell);
+
+	return 0;
+}
+
+static int rockchip_nvmem_cell_read_u8(struct device_node *np,
+					const char *cell_id,
+					u8 *val)
+{
+	return rockchip_nvmem_cell_read_common(np, cell_id, val, sizeof(*val));
+}
+
+static int rockchip_nvmem_cell_read_u16(struct device_node *np,
+					const char *cell_id,
+					u16 *val)
+{
+	return rockchip_nvmem_cell_read_common(np, cell_id, val, sizeof(*val));
+}
+
 static int rockchip_get_sel_table(struct device_node *np, char *porp_name,
 				  struct sel_table **table)
 {
@@ -326,23 +369,12 @@ static int rockchip_get_pvtm_specific_value(struct device *dev,
 {
 	struct pvtm_config *pvtm;
 	unsigned long old_freq;
-	unsigned int old_volt, ch[2];
+	unsigned int old_volt;
 	int cur_temp, diff_temp;
 	int cur_value, total_value, avg_value, diff_value;
 	int min_value, max_value;
 	int ret = 0, i = 0, retry = 2;
 
-	if (of_property_read_u32_array(np, "rockchip,pvtm-ch", ch, 2))
-		return -EINVAL;
-
-	if (ch[0] >= PVTM_CH_MAX || ch[1] >= PVTM_SUB_CH_MAX)
-		return -EINVAL;
-
-	if (pvtm_value[ch[0]][ch[1]]) {
-		*target_value = pvtm_value[ch[0]][ch[1]];
-		return 0;
-	}
-
 	pvtm = kzalloc(sizeof(*pvtm), GFP_KERNEL);
 	if (!pvtm)
 		return -ENOMEM;
@@ -689,33 +721,65 @@ void rockchip_of_get_lkg_sel(struct device *dev, struct device_node *np,
 }
 EXPORT_SYMBOL(rockchip_of_get_lkg_sel);
 
-void rockchip_of_get_pvtm_sel(struct device *dev, struct device_node *np,
-			      char *reg_name, int process,
-			      int *volt_sel, int *scale_sel)
+
+static int rockchip_get_pvtm(struct device *dev, struct device_node *np,
+			     char *reg_name)
 {
-	struct property *prop = NULL;
 	struct regulator *reg;
 	struct clk *clk;
-	int pvtm = -EINVAL, ret;
-	char name[NAME_MAX];
+	unsigned int ch[2];
+	int pvtm = 0;
+	u16 tmp = 0;
+
+	if (!rockchip_nvmem_cell_read_u16(np, "pvtm", &tmp) && tmp) {
+		pvtm = 10 * tmp;
+		dev_info(dev, "pvtm = %d, from nvmem\n", pvtm);
+		return pvtm;
+	}
+
+	if (of_property_read_u32_array(np, "rockchip,pvtm-ch", ch, 2))
+		return -EINVAL;
+
+	if (ch[0] >= PVTM_CH_MAX || ch[1] >= PVTM_SUB_CH_MAX)
+		return -EINVAL;
+
+	if (pvtm_value[ch[0]][ch[1]]) {
+		dev_info(dev, "pvtm = %d, form pvtm_value\n", pvtm_value[ch[0]][ch[1]]);
+		return pvtm_value[ch[0]][ch[1]];
+	}
 
 	clk = clk_get(dev, NULL);
 	if (IS_ERR_OR_NULL(clk)) {
 		dev_warn(dev, "Failed to get clk\n");
-		return;
+		return PTR_ERR_OR_ZERO(clk);
 	}
 
 	reg = regulator_get_optional(dev, reg_name);
 	if (IS_ERR_OR_NULL(reg)) {
 		dev_warn(dev, "Failed to get reg\n");
-		goto clk_err;
+		clk_put(clk);
+		return PTR_ERR_OR_ZERO(reg);
 	}
 
-	ret = rockchip_get_pvtm_specific_value(dev, np, clk, reg, &pvtm);
-	if (ret) {
-		dev_err(dev, "Failed to get pvtm\n");
-		goto out;
-	}
+	rockchip_get_pvtm_specific_value(dev, np, clk, reg, &pvtm);
+
+	regulator_put(reg);
+	clk_put(clk);
+
+	return pvtm;
+}
+
+void rockchip_of_get_pvtm_sel(struct device *dev, struct device_node *np,
+			      char *reg_name, int process,
+			      int *volt_sel, int *scale_sel)
+{
+	struct property *prop = NULL;
+	char name[NAME_MAX];
+	int pvtm, ret;
+
+	pvtm = rockchip_get_pvtm(dev, np, reg_name);
+	if (pvtm <= 0)
+		return;
 
 	if (!volt_sel)
 		goto next;
@@ -732,7 +796,7 @@ void rockchip_of_get_pvtm_sel(struct device *dev, struct device_node *np,
 
 next:
 	if (!scale_sel)
-		goto out;
+		return;
 	if (process >= 0) {
 		snprintf(name, sizeof(name),
 			 "rockchip,p%d-pvtm-scaling-sel", process);
@@ -743,11 +807,6 @@ void rockchip_of_get_pvtm_sel(struct device *dev, struct device_node *np,
 	ret = rockchip_get_sel(np, name, pvtm, scale_sel);
 	if (!ret)
 		dev_info(dev, "pvtm-scale=%d\n", *scale_sel);
-
-out:
-	regulator_put(reg);
-clk_err:
-	clk_put(clk);
 }
 EXPORT_SYMBOL(rockchip_of_get_pvtm_sel);
 
@@ -940,6 +999,37 @@ static int rockchip_adjust_opp_by_irdrop(struct device *dev,
 	return ret;
 }
 
+static void rockchip_adjust_opp_by_mbist_vmin(struct device *dev,
+					      struct device_node *np)
+{
+	struct opp_table *opp_table;
+	struct dev_pm_opp *opp;
+	u32 vmin = 0;
+	u8 index = 0;
+
+	if (rockchip_nvmem_cell_read_u8(np, "mbist-vmin", &index))
+		return;
+
+	if (!index)
+		return;
+
+	if (of_property_read_u32_index(np, "mbist-vmin", index-1, &vmin))
+		return;
+
+	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->supplies->u_volt < vmin) {
+			opp->supplies->u_volt = vmin;
+			opp->supplies->u_volt_min = vmin;
+		}
+	}
+	mutex_unlock(&opp_table->lock);
+}
+
 static int rockchip_adjust_opp_table(struct device *dev,
 				     unsigned long scale_rate)
 {
@@ -986,6 +1076,7 @@ int rockchip_adjust_power_scale(struct device *dev, int scale)
 	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_mbist_vmin(dev, np);
 	rockchip_adjust_opp_by_irdrop(dev, np, &safe_rate, &max_rate);
 
 	dev_info(dev, "avs=%d\n", avs);

commit a0b1f8c7ae4e2cb0e9974bc23735090b53d67180
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Thu May 27 12:37:42 2021 +0800

    power/avs: rockchip: add debugfs 'iodomain'
    
    This patch adds a 'iodomain' debug node.
    
    Change-Id: I2f85d073aa59f87c20eb309f151e76a05a2f4bc1
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/power/avs/rockchip-io-domain.c b/drivers/power/avs/rockchip-io-domain.c
index d156698445a6..c2134e363324 100644
--- a/drivers/power/avs/rockchip-io-domain.c
+++ b/drivers/power/avs/rockchip-io-domain.c
@@ -16,6 +16,7 @@
 
 #include <linux/kernel.h>
 #include <linux/module.h>
+#include <linux/debugfs.h>
 #include <linux/err.h>
 #include <linux/mfd/syscon.h>
 #include <linux/of.h>
@@ -618,11 +619,37 @@ static const struct of_device_id rockchip_iodomain_match[] = {
 };
 MODULE_DEVICE_TABLE(of, rockchip_iodomain_match);
 
+#ifdef CONFIG_DEBUG_FS
+static ssize_t rockchip_iodomain_vol_read(struct file *file, char __user *user_buf,
+					  size_t count, loff_t *ppos)
+{
+	char buf[256];
+	unsigned int len;
+	struct rockchip_iodomain_supply *supply = file->private_data;
+	struct regulator *reg = supply->reg;
+
+	if (reg)
+		len = snprintf(buf, sizeof(buf), "%d\n", regulator_get_voltage(reg));
+	else
+		len = snprintf(buf, sizeof(buf), "invalid regulator\n");
+
+	return simple_read_from_buffer(user_buf, count, ppos, buf, len);
+}
+
+static const struct file_operations rockchip_iodomain_vol_fops = {
+	.open		= simple_open,
+	.read		= rockchip_iodomain_vol_read,
+};
+#else
+static const struct file_operations rockchip_iodomain_vol_fops = { };
+#endif
+
 static int rockchip_iodomain_probe(struct platform_device *pdev)
 {
 	struct device_node *np = pdev->dev.of_node;
 	const struct of_device_id *match;
 	struct rockchip_iodomain *iod;
+	struct dentry *debugfs_root;
 	struct device *parent;
 	int i, ret = 0;
 
@@ -657,10 +684,13 @@ static int rockchip_iodomain_probe(struct platform_device *pdev)
 		return PTR_ERR(iod->grf);
 	}
 
+	debugfs_root = debugfs_create_dir("iodomain", NULL);
+
 	for (i = 0; i < MAX_SUPPLIES; i++) {
 		const char *supply_name = iod->soc_data->supply_names[i];
 		struct rockchip_iodomain_supply *supply = &iod->supplies[i];
 		struct regulator *reg;
+		struct dentry *debugfs_supply;
 		int uV;
 
 		if (!supply_name)
@@ -717,6 +747,11 @@ static int rockchip_iodomain_probe(struct platform_device *pdev)
 			supply->reg = NULL;
 			goto unreg_notify;
 		}
+
+		debugfs_supply = debugfs_create_dir(supply_name, debugfs_root);
+		debugfs_create_file("voltage", 0444, debugfs_supply,
+				    (void *)supply,
+				    &rockchip_iodomain_vol_fops);
 	}
 
 	if (iod->soc_data->init)
@@ -732,6 +767,7 @@ static int rockchip_iodomain_probe(struct platform_device *pdev)
 			regulator_unregister_notifier(io_supply->reg,
 						      &io_supply->nb);
 	}
+	debugfs_remove_recursive(debugfs_root);
 
 	return ret;
 }
@@ -749,6 +785,8 @@ static int rockchip_iodomain_remove(struct platform_device *pdev)
 						      &io_supply->nb);
 	}
 
+	debugfs_remove_recursive(debugfs_lookup("iodomain", NULL));
+
 	return 0;
 }
 

commit 4f736fc5ad6e2cbfb3927e64a9f84e8b2b5cd752
Author: Caesar Wang <wxt@rock-chips.com>
Date:   Fri May 28 16:08:10 2021 +0800

    scripts: remove PMUIO1 in io-domain.sh
    
    Fixes: b25c12a00a9a ("scripts: add io-domain.sh for rk356x io-domain check")
    
    Signed-off-by: Caesar Wang <wxt@rock-chips.com>
    Change-Id: I5b8d8706b48f32a6ba2dbeebabf3a5bd2ba24678

diff --git a/scripts/io-domain.sh b/scripts/io-domain.sh
index 42729e4753ed..040d88580ede 100755
--- a/scripts/io-domain.sh
+++ b/scripts/io-domain.sh
@@ -2,7 +2,6 @@
 # SPDX-License-Identifier: (GPL-2.0+ OR MIT)
 # Copyright (c) 2021 Rockchip Electronics Co., Ltd.
 
-PMUIO1=0
 PMUIO2=0
 VCCIO1=0
 VCCIO3=0
@@ -11,7 +10,6 @@ VCCIO5=0
 VCCIO6=0
 VCCIO7=0
 
-DTS_PMUIO1=0
 DTS_PMUIO2=0
 DTS_VCCIO1=0
 DTS_VCCIO3=0
@@ -28,16 +26,6 @@ GetVoltageFromDtsVal=0
 
 ShowChecklist()
 {
-	PMUIO1=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
-	"Get the corresponding value from the hardware schematic diagram" 15 60 2 \
-	"1800000" "PMUIO1 Supply Power Voltage(uV)" \
-	"3300000" "PMUIO1 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
-	exitstatus=$?
-	if [ $exitstatus != 0 ]; then
-		echo "You chose Cancel."
-		checklistRst=1
-	fi
-
 	PMUIO2=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
 	"Get the corresponding value from the hardware schematic diagram" 15 60 2 \
 	"1800000" "PMUIO2 Supply Power Voltage(uV)" \
@@ -145,8 +133,6 @@ DtsIoDomainVoltage()
 
 GetIoDomainVoltageFromDts()
 {
-	DtsIoDomainVoltage "pmuio1-supply"
-	DTS_PMUIO1=$DtsIoDomainVoltageVal
 	DtsIoDomainVoltage "pmuio2-supply"
 	DTS_PMUIO2=$DtsIoDomainVoltageVal
 	DtsIoDomainVoltage "vccio1-supply"
@@ -166,13 +152,6 @@ GetIoDomainVoltageFromDts()
 CheckVoltageWithBackupfile()
 {
 	CheckBckfileRet=2
-	val=$(cat $DTS_NAME.domain \
-			| grep PMUIO1 \
-			| cut -d ":" -f 2)
-	if [ "$val" != "$DTS_PMUIO1" ];then
-		CheckBckfileRet=1
-		echo "PMUIO1 Supply Power Voltage has changed!!! please reconfirm!!!"
-	fi
 	val=$(cat $DTS_NAME.domain \
 			| grep PMUIO2 \
 			| cut -d ":" -f 2)
@@ -225,10 +204,6 @@ CheckVoltageWithBackupfile()
 CheckVoltageWithEnter()
 {
 	checklistRst=0
-	if [ "$PMUIO1" -ne "$DTS_PMUIO1" ];then
-		checklistRst=1
-		echo "PMUIO1 Supply Power Voltage has changed!!! please reconfirm!!!"
-	fi
 	if [ $PMUIO2 -ne $DTS_PMUIO2 ];then
 		checklistRst=1
 		echo "PMUIO2 Supply Power Voltage has changed!!! please reconfirm!!!"
@@ -278,7 +253,6 @@ if [ "$CheckBckfileRet" != "2" ];then
 			rm -rf $DTS_NAME.domain
 		fi
 
-		echo "PMUIO1 Supply Power Voltage1:$PMUIO1" >> $DTS_NAME.domain
 		echo "PMUIO2 Supply Power Voltage1:$PMUIO2" >> $DTS_NAME.domain
 		echo "VCCIO1 Supply Power Voltage1:$VCCIO1" >> $DTS_NAME.domain
 		echo "VCCIO3 Supply Power Voltage1:$VCCIO3" >> $DTS_NAME.domain

commit 144566ce73be6c6cb7f41d15ce11eb3949a4a970
Author: Finley Xiao <finley.xiao@rock-chips.com>
Date:   Mon May 17 09:32:21 2021 +0800

    arm64: dts: rockchip: rk3568: Add vop-bw-dmc-freq property for dmc
    
    Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
    Change-Id: I20367d84fa3fee5b008ea8fbaba33ec296dd2721

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index 6ae0c1e8d118..fe7b78868b9d 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -2048,6 +2048,11 @@
 		clock-names = "dmc_clk";
 		operating-points-v2 = <&dmc_opp_table>;
 		ddr_timing = <&ddr_timing>;
+		vop-bw-dmc-freq = <
+		/* min_bw(MB/s) max_bw(MB/s) freq(KHz) */
+			0	505	324000
+			506	99999	528000
+		>;
 		upthreshold = <40>;
 		downdifferential = <20>;
 		system-status-freq = <

commit d0dfe9f8d310a0fdf27f62155456c0830112c7cf
Author: Finley Xiao <finley.xiao@rock-chips.com>
Date:   Mon May 17 09:28:44 2021 +0800

    arm64: dts: rockchip: rk3568: Add devfreq property for display_subsystem
    
    Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
    Change-Id: I3bb6e7d486d52c586b55ed70ca33b0f3c10f29bf

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index 80a0b45e00eb..6ae0c1e8d118 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -205,6 +205,7 @@
 		memory-region = <&drm_logo>, <&drm_cubic_lut>;
 		memory-region-names = "drm-logo", "drm-cubic-lut";
 		ports = <&vop_out>;
+		devfreq = <&dmc>;
 
 		route {
 			route_dsi0: route-dsi0 {

commit 5730f8b50f67b76563483c167b4924a186ffdbce
Author: Sudeep Holla <sudeep.holla@arm.com>
Date:   Mon Sep 7 12:06:01 2020 +0100

    UPSTREAM: firmware: arm_scmi: Move scmi protocols registration into the driver
    
    In preparation to enable building SCMI as a single module, let us move
    the SCMI protocol registration call into the driver. This enables us
    to also add unregistration of the SCMI protocols.
    
    The main reason for this is to keep it simple instead of maintaining
    it as separate modules and dealing with all possible initcall races
    and deferred probe handling. We can move it as separate modules if
    needed in future.
    
    Link: https://lore.kernel.org/r/20200907195046.56615-4-sudeep.holla@arm.com
    Tested-by: Cristian Marussi <cristian.marussi@arm.com>
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    (cherry picked from commit 1eaf18e35a783a007ef03e09f1dfc3de81eace7c)
    
    Conflicts:
            drivers/firmware/arm_scmi/reset.c
            drivers/firmware/arm_scmi/system.c
    
    Change-Id: Iec1dbc42c49367a1fa7299cb359f1214021ada6b
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>

diff --git a/drivers/firmware/arm_scmi/clock.c b/drivers/firmware/arm_scmi/clock.c
index 0a194af92438..a6a8bc081dac 100644
--- a/drivers/firmware/arm_scmi/clock.c
+++ b/drivers/firmware/arm_scmi/clock.c
@@ -337,9 +337,4 @@ static int scmi_clock_protocol_init(struct scmi_handle *handle)
 	return 0;
 }
 
-static int __init scmi_clock_init(void)
-{
-	return scmi_protocol_register(SCMI_PROTOCOL_CLOCK,
-				      &scmi_clock_protocol_init);
-}
-subsys_initcall(scmi_clock_init);
+DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(SCMI_PROTOCOL_CLOCK, clock)
diff --git a/drivers/firmware/arm_scmi/common.h b/drivers/firmware/arm_scmi/common.h
index 475b46338b46..8dce680c7ba8 100644
--- a/drivers/firmware/arm_scmi/common.h
+++ b/drivers/firmware/arm_scmi/common.h
@@ -155,6 +155,27 @@ int scmi_base_protocol_init(struct scmi_handle *h);
 int __init scmi_bus_init(void);
 void __exit scmi_bus_exit(void);
 
+#define DECLARE_SCMI_REGISTER_UNREGISTER(func)		\
+	int __init scmi_##func##_register(void);	\
+	void __exit scmi_##func##_unregister(void)
+DECLARE_SCMI_REGISTER_UNREGISTER(clock);
+DECLARE_SCMI_REGISTER_UNREGISTER(perf);
+DECLARE_SCMI_REGISTER_UNREGISTER(power);
+DECLARE_SCMI_REGISTER_UNREGISTER(reset);
+DECLARE_SCMI_REGISTER_UNREGISTER(sensors);
+DECLARE_SCMI_REGISTER_UNREGISTER(system);
+
+#define DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(id, name) \
+int __init scmi_##name##_register(void) \
+{ \
+	return scmi_protocol_register((id), &scmi_##name##_protocol_init); \
+} \
+\
+void __exit scmi_##name##_unregister(void) \
+{ \
+	scmi_protocol_unregister((id)); \
+}
+
 /* SCMI Transport */
 /**
  * struct scmi_chan_info - Structure representing a SCMI channel information
diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
index b5da746a468a..ad725ebdbdd8 100644
--- a/drivers/firmware/arm_scmi/driver.c
+++ b/drivers/firmware/arm_scmi/driver.c
@@ -801,14 +801,24 @@ static int __init scmi_driver_init(void)
 {
 	scmi_bus_init();
 
+	scmi_clock_register();
+	scmi_perf_register();
+	scmi_power_register();
+	scmi_sensors_register();
+
 	return platform_driver_register(&scmi_driver);
 }
-module_init(scmi_driver_init);
+subsys_initcall(scmi_driver_init);
 
 static void __exit scmi_driver_exit(void)
 {
 	scmi_bus_exit();
 
+	scmi_clock_unregister();
+	scmi_perf_unregister();
+	scmi_power_unregister();
+	scmi_sensors_unregister();
+
 	platform_driver_unregister(&scmi_driver);
 }
 module_exit(scmi_driver_exit);
diff --git a/drivers/firmware/arm_scmi/perf.c b/drivers/firmware/arm_scmi/perf.c
index 3c8ae7cc35de..8bbf2ea89209 100644
--- a/drivers/firmware/arm_scmi/perf.c
+++ b/drivers/firmware/arm_scmi/perf.c
@@ -502,9 +502,4 @@ static int scmi_perf_protocol_init(struct scmi_handle *handle)
 	return 0;
 }
 
-static int __init scmi_perf_init(void)
-{
-	return scmi_protocol_register(SCMI_PROTOCOL_PERF,
-				      &scmi_perf_protocol_init);
-}
-subsys_initcall(scmi_perf_init);
+DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(SCMI_PROTOCOL_PERF, perf)
diff --git a/drivers/firmware/arm_scmi/power.c b/drivers/firmware/arm_scmi/power.c
index 62f3401a1f01..e1fc104bed10 100644
--- a/drivers/firmware/arm_scmi/power.c
+++ b/drivers/firmware/arm_scmi/power.c
@@ -213,9 +213,4 @@ static int scmi_power_protocol_init(struct scmi_handle *handle)
 	return 0;
 }
 
-static int __init scmi_power_init(void)
-{
-	return scmi_protocol_register(SCMI_PROTOCOL_POWER,
-				      &scmi_power_protocol_init);
-}
-subsys_initcall(scmi_power_init);
+DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(SCMI_PROTOCOL_POWER, power)
diff --git a/drivers/firmware/arm_scmi/sensors.c b/drivers/firmware/arm_scmi/sensors.c
index c00287b5f2c2..abd9aeb2cd7e 100644
--- a/drivers/firmware/arm_scmi/sensors.c
+++ b/drivers/firmware/arm_scmi/sensors.c
@@ -283,9 +283,4 @@ static int scmi_sensors_protocol_init(struct scmi_handle *handle)
 	return 0;
 }
 
-static int __init scmi_sensors_init(void)
-{
-	return scmi_protocol_register(SCMI_PROTOCOL_SENSOR,
-				      &scmi_sensors_protocol_init);
-}
-subsys_initcall(scmi_sensors_init);
+DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(SCMI_PROTOCOL_SENSOR, sensors)

commit f6fd0a5cd7f577ba4925a228e663e5d1f7c60cc0
Author: Sudeep Holla <sudeep.holla@arm.com>
Date:   Mon Sep 7 12:00:04 2020 +0100

    UPSTREAM: firmware: arm_scmi: Move scmi bus init and exit calls into the driver
    
    In preparation to enable building scmi as a single module, let us move
    the scmi bus {de-,}initialisation call into the driver.
    
    The main reason for this is to keep it simple instead of maintaining
    it as separate modules and dealing with all possible initcall races
    and deferred probe handling. We can move it as separate modules if
    needed in future.
    
    Link: https://lore.kernel.org/r/20200907195046.56615-3-sudeep.holla@arm.com
    Change-Id: I6f1a6ce7cc4c2b6f281add5f5d6a7ca3cbad9eca
    Tested-by: Cristian Marussi <cristian.marussi@arm.com>
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    (cherry picked from commit 5a2f0a0bdf201e2183904b6217f9c74774c961a8)

diff --git a/drivers/firmware/arm_scmi/bus.c b/drivers/firmware/arm_scmi/bus.c
index 3714e6307b05..8ea04b069129 100644
--- a/drivers/firmware/arm_scmi/bus.c
+++ b/drivers/firmware/arm_scmi/bus.c
@@ -221,7 +221,7 @@ static void scmi_devices_unregister(void)
 	bus_for_each_dev(&scmi_bus_type, NULL, NULL, __scmi_devices_unregister);
 }
 
-static int __init scmi_bus_init(void)
+int __init scmi_bus_init(void)
 {
 	int retval;
 
@@ -231,12 +231,10 @@ static int __init scmi_bus_init(void)
 
 	return retval;
 }
-subsys_initcall(scmi_bus_init);
 
-static void __exit scmi_bus_exit(void)
+void __exit scmi_bus_exit(void)
 {
 	scmi_devices_unregister();
 	bus_unregister(&scmi_bus_type);
 	ida_destroy(&scmi_bus_id);
 }
-module_exit(scmi_bus_exit);
diff --git a/drivers/firmware/arm_scmi/common.h b/drivers/firmware/arm_scmi/common.h
index 238e05fdfc70..475b46338b46 100644
--- a/drivers/firmware/arm_scmi/common.h
+++ b/drivers/firmware/arm_scmi/common.h
@@ -152,6 +152,9 @@ void scmi_setup_protocol_implemented(const struct scmi_handle *handle,
 
 int scmi_base_protocol_init(struct scmi_handle *h);
 
+int __init scmi_bus_init(void);
+void __exit scmi_bus_exit(void);
+
 /* SCMI Transport */
 /**
  * struct scmi_chan_info - Structure representing a SCMI channel information
diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
index 31725ad5fb0f..b5da746a468a 100644
--- a/drivers/firmware/arm_scmi/driver.c
+++ b/drivers/firmware/arm_scmi/driver.c
@@ -797,7 +797,21 @@ static struct platform_driver scmi_driver = {
 	.remove = scmi_remove,
 };
 
-module_platform_driver(scmi_driver);
+static int __init scmi_driver_init(void)
+{
+	scmi_bus_init();
+
+	return platform_driver_register(&scmi_driver);
+}
+module_init(scmi_driver_init);
+
+static void __exit scmi_driver_exit(void)
+{
+	scmi_bus_exit();
+
+	platform_driver_unregister(&scmi_driver);
+}
+module_exit(scmi_driver_exit);
 
 MODULE_ALIAS("platform: arm-scmi");
 MODULE_AUTHOR("Sudeep Holla <sudeep.holla@arm.com>");

commit 20115da8e05d531c967cf30d18409cc1f92c9f39
Author: Bin Yang <yangbin@rock-chips.com>
Date:   Thu May 27 20:34:37 2021 +0800

    phy: rockchip: inno-usb2: fix iddig issues for rk3568
    
    RK3568 u2phy used shared interrupt and do not used id irq.
    
    Signed-off-by: Bin Yang <yangbin@rock-chips.com>
    Change-Id: I341cc0edb0f74996f159c095545465673cc2a990

diff --git a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
index b8dbae612539..26e8346fe38d 100644
--- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
+++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
@@ -2311,7 +2311,7 @@ static int rockchip_usb2phy_pm_suspend(struct device *dev)
 			continue;
 
 		if (rport->port_id == USB2PHY_PORT_OTG &&
-		    rport->id_irq > 0) {
+		    (rport->id_irq > 0 || rphy->irq > 0)) {
 			mutex_lock(&rport->mutex);
 			rport->prev_iddig = property_enabled(rphy->grf,
 						&rport->port_cfg->utmi_iddig);
@@ -2369,7 +2369,7 @@ static int rockchip_usb2phy_pm_resume(struct device *dev)
 			continue;
 
 		if (rport->port_id == USB2PHY_PORT_OTG &&
-		    rport->id_irq > 0) {
+		    (rport->id_irq > 0 || rphy->irq > 0)) {
 			mutex_lock(&rport->mutex);
 			iddig = property_enabled(rphy->grf,
 						 &rport->port_cfg->utmi_iddig);

commit 05035b24f641f1939230f6843a4fa53457cc1dc4
Author: Huang zhibao <hzb@rock-chips.com>
Date:   Fri May 28 11:24:22 2021 +0800

    arm64: dts: rockchip: rk3566-box: fix vdd_logic max-microvolt
    
    Signed-off-by: Huang zhibao <hzb@rock-chips.com>
    Change-Id: I19469288b52b58824fd8a7f9d70a1991c5835fba

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi
index f652d9fb3049..efe739f4988e 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi
@@ -158,7 +158,7 @@
 		pwms = <&pwm1 0 5000 1>;
 		regulator-name = "vdd_logic";
 		regulator-min-microvolt = <800000>;
-		regulator-max-microvolt = <1200000>;
+		regulator-max-microvolt = <1100000>;
 		regulator-init-microvolt = <950000>;
 		regulator-always-on;
 		regulator-boot-on;

commit e70f2f4ac48542dac72c7e437ed7af38bf220de1
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Thu May 27 20:46:52 2021 +0800

    Revert "ANDROID: GKI: arm64: add support for NO_KERNEL_MAPPING and STRONGLY_ORDERED"
    
    This reverts commit 4ac42c440404fcda2d6baae7db6eb0a75136cf6d.
    
    DMA_ATTR_NO_KERNEL_MAPPING is not well supported on apply_to_page_range(),
    which causes the following error:
    
    [    2.268586] nvme nvme0: pci function 0002:21:00.0
    [    2.268649] nvme 0002:21:00.0: enabling device (0000 -> 0002)
    [    2.376361] nvme nvme0: missing or invalid SUBNQN field.
    [    2.378661] Unable to handle kernel paging request at virtual address ffffffc400000000
    [    2.379360] Mem abort info:
    [    2.379616]   ESR = 0x96000045
    [    2.379895]   Exception class = DABT (current EL), IL = 32 bits
    [    2.380414]   SET = 0, FnV = 0
    [    2.380691]   EA = 0, S1PTW = 0
    [    2.380970] Data abort info:
    [    2.381237]   ISV = 0, ISS = 0x00000045
    [    2.381575]   CM = 0, WnR = 1
    [    2.381846] swapper pgtable: 4k pages, 39-bit VAs, pgdp = 000000005a0c0862
    [    2.382446] [ffffffc400000000] pgd=0000000000000000, pud=0000000000000000
    [    2.383049] Internal error: Oops: 96000045 [#1] PREEMPT SMP
    [    2.383546] Modules linked in:
    [    2.383827] Process kworker/u8:0 (pid: 7, stack limit = 0x00000000b285d686)
    [    2.384441] CPU: 3 PID: 7 Comm: kworker/u8:0 Not tainted 4.19.172 #134
    [    2.385017] Hardware name: Rockchip RK3568 EVB1 DDR4 V10 Board (DT)
    [    2.385580] Workqueue: nvme-reset-wq nvme_reset_work
    [    2.386022] pstate: 60c00009 (nZCv daif +PAN +UAO)
    [    2.386453] pc : __dma_clear_pte+0x0/0xc
    [    2.386804] lr : apply_to_page_range+0x1bc/0x274
    [    2.519225]
    [    2.519366] Call trace:
    [    2.519593]  __dma_clear_pte+0x0/0xc
    [    2.519908]  __dma_alloc+0x240/0x3f0
    [    2.520224]  nvme_reset_work+0xaf4/0xf14
    [    2.520575]  process_one_work+0x26c/0x438
    [    2.520935]  worker_thread+0x260/0x4a8
    [    2.521272]  kthread+0x13c/0x14c
    [    2.521564]  ret_from_fork+0x10/0x18
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: Ifb10b05af6b9778990cad23e3d45cc440bbecb2f

diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
index f309ad38fa94..3edcbd008507 100644
--- a/arch/arm64/mm/dma-mapping.c
+++ b/arch/arm64/mm/dma-mapping.c
@@ -45,9 +45,7 @@ static int swiotlb __ro_after_init;
 static pgprot_t __get_dma_pgprot(unsigned long attrs, pgprot_t prot,
 				 bool coherent)
 {
-	if (attrs & DMA_ATTR_STRONGLY_ORDERED)
-		return pgprot_noncached(prot);
-	else if (!coherent || (attrs & DMA_ATTR_WRITE_COMBINE))
+	if (!coherent || (attrs & DMA_ATTR_WRITE_COMBINE))
 		return pgprot_writecombine(prot);
 	return prot;
 }
@@ -66,7 +64,6 @@ static bool is_dma_coherent(struct device *dev, unsigned long attrs)
 }
 static struct gen_pool *atomic_pool __ro_after_init;
 
-#define NO_KERNEL_MAPPING_DUMMY 0x2222
 #define DEFAULT_DMA_COHERENT_POOL_SIZE  SZ_256K
 static size_t atomic_pool_size __initdata = DEFAULT_DMA_COHERENT_POOL_SIZE;
 
@@ -114,43 +111,6 @@ static int __free_from_pool(void *start, size_t size)
 	return 1;
 }
 
-static int __dma_update_pte(pte_t *pte, pgtable_t token, unsigned long addr,
-			    void *data)
-{
-	struct page *page = virt_to_page(addr);
-	pgprot_t prot = *(pgprot_t *)data;
-
-	set_pte(pte, mk_pte(page, prot));
-	return 0;
-}
-
-static int __dma_clear_pte(pte_t *pte, pgtable_t token, unsigned long addr,
-			    void *data)
-{
-	pte_clear(&init_mm, addr, pte);
-	return 0;
-}
-
-static void __dma_remap(struct page *page, size_t size, pgprot_t prot,
-			bool no_kernel_map)
-{
-	unsigned long start = (unsigned long) page_address(page);
-	unsigned long end = start + size;
-	int (*func)(pte_t *pte, pgtable_t token, unsigned long addr,
-			    void *data);
-
-	if (no_kernel_map)
-		func = __dma_clear_pte;
-	else
-		func = __dma_update_pte;
-
-	apply_to_page_range(&init_mm, start, size, func, &prot);
-	/* ensure prot is applied before returning */
-	mb();
-	flush_tlb_kernel_range(start, end);
-}
-
-
 static void *__dma_alloc(struct device *dev, size_t size,
 			 dma_addr_t *dma_handle, gfp_t flags,
 			 unsigned long attrs)
@@ -181,31 +141,19 @@ static void *__dma_alloc(struct device *dev, size_t size,
 	if (coherent)
 		return ptr;
 
+	/* remove any dirty cache lines on the kernel alias */
 	__dma_flush_area(ptr, size);
 
-	if (attrs & DMA_ATTR_NO_KERNEL_MAPPING) {
-		coherent_ptr = (void *)NO_KERNEL_MAPPING_DUMMY;
-		__dma_remap(virt_to_page(ptr), size, __pgprot(0), true);
-	} else {
-		if ((attrs & DMA_ATTR_STRONGLY_ORDERED))
-			__dma_remap(virt_to_page(ptr), size, __pgprot(0), true);
-
-		/* create a coherent mapping */
-		page = virt_to_page(ptr);
-		coherent_ptr = dma_common_contiguous_remap(
-					page, size, VM_USERMAP, prot,
-					__builtin_return_address(0));
-		if (!coherent_ptr)
-			goto no_map;
-	}
+	/* create a coherent mapping */
+	page = virt_to_page(ptr);
+	coherent_ptr = dma_common_contiguous_remap(page, size, VM_USERMAP,
+						   prot, __builtin_return_address(0));
+	if (!coherent_ptr)
+		goto no_map;
+
 	return coherent_ptr;
 
 no_map:
-	if ((attrs & DMA_ATTR_NO_KERNEL_MAPPING) ||
-	    (attrs & DMA_ATTR_STRONGLY_ORDERED))
-		__dma_remap(phys_to_page(dma_to_phys(dev, *dma_handle)),
-				size, PAGE_KERNEL, false);
-
 	swiotlb_free(dev, size, ptr, *dma_handle, attrs);
 no_mem:
 	return NULL;
@@ -219,17 +167,11 @@ static void __dma_free(struct device *dev, size_t size,
 
 	size = PAGE_ALIGN(size);
 
-	if (!is_dma_coherent(dev, attrs)) {
+	if (!is_device_dma_coherent(dev)) {
 		if (__free_from_pool(vaddr, size))
 			return;
-		if (!(attrs & DMA_ATTR_NO_KERNEL_MAPPING))
-			vunmap(vaddr);
+		vunmap(vaddr);
 	}
-	if ((attrs & DMA_ATTR_NO_KERNEL_MAPPING) ||
-	    (attrs & DMA_ATTR_STRONGLY_ORDERED))
-		__dma_remap(phys_to_page(dma_to_phys(dev, dma_handle)),
-				size, PAGE_KERNEL, false);
-
 	swiotlb_free(dev, size, swiotlb_addr, dma_handle, attrs);
 }
 

commit a2cb2cc59cd4b78ae3b3313e3f48a392c8a798ba
Author: Caesar Wang <wxt@rock-chips.com>
Date:   Thu May 27 17:03:07 2021 +0800

    arm64: dts: rockchip: update pmu_io_domains in rk3568-evb.dtsi
    
    Signed-off-by: Caesar Wang <wxt@rock-chips.com>
    Change-Id: Idf4e71ce021267e9098018abff6d540476fca1ba

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
index 40ecb18c3973..d45a1b03eee7 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
@@ -1488,9 +1488,24 @@
 	};
 };
 
+ /*
+  * There are 10 independent IO domains in RK3566/RK3568, including PMUIO[0:2] and VCCIO[1:7].
+  * 1/ PMUIO0 and PMUIO1 are fixed-level power domains which cannot be configured;
+  * 2/ PMUIO2 and VCCIO1,VCCIO[3:7] domains require that their hardware power supply voltages
+  *    must be consistent with the software configuration correspondingly
+  *	a/ When the hardware IO level is connected to 1.8V, the software voltage configuration
+  *	   should also be configured to 1.8V accordingly;
+  *	b/ When the hardware IO level is connected to 3.3V, the software voltage configuration
+  *	   should also be configured to 3.3V accordingly;
+  * 3/ VCCIO2 voltage control selection (0xFDC20140)
+  *	BIT[0]: 0x0: from GPIO_0A7 (default)
+  *	BIT[0]: 0x1: from GRF
+  *    Default is determined by Pin FLASH_VOL_SEL/GPIO0_A7:
+  *	L:VCCIO2 must supply 3.3V
+  *	H:VCCIO2 must supply 1.8V
+  */
 &pmu_io_domains {
 	status = "okay";
-	pmuio1-supply = <&vcc3v3_pmu>;
 	pmuio2-supply = <&vcc3v3_pmu>;
 	vccio1-supply = <&vccio_acodec>;
 	vccio3-supply = <&vccio_sd>;

commit af1fb0dc8214815dad1841f08c8f856474c13664
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Thu May 27 12:34:49 2021 +0800

    power/avs: rockchip: rk3568 iodomain ignore pmuio1 and vccio2
    
    1. pmuio1 on RK3568 SoC supports 3.3v only, no register to set.
    2. vccio2 used for flash, which select by hardware
    
    Change-Id: Ie168626906b52dea5b789b6b4dfcf1e45eb5f08a
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/power/avs/rockchip-io-domain.c b/drivers/power/avs/rockchip-io-domain.c
index b7e3ee1999da..d156698445a6 100644
--- a/drivers/power/avs/rockchip-io-domain.c
+++ b/drivers/power/avs/rockchip-io-domain.c
@@ -103,6 +103,7 @@ static int rk3568_pmu_iodomain_write(struct rockchip_iodomain_supply *supply,
 
 	switch (supply->idx) {
 	case 0: /* pmuio1 */
+		break;
 	case 1: /* pmuio2 */
 		b = supply->idx;
 		val0 = BIT(16 + b) | (is_3v3 ? 0 : BIT(b));
@@ -112,8 +113,9 @@ static int rk3568_pmu_iodomain_write(struct rockchip_iodomain_supply *supply,
 		regmap_write(iod->grf, RK3568_PMU_GRF_IO_VSEL2, val0);
 		regmap_write(iod->grf, RK3568_PMU_GRF_IO_VSEL2, val1);
 		break;
-	case 2: /* vccio1 */
 	case 3: /* vccio2 */
+		break;
+	case 2: /* vccio1 */
 	case 4: /* vccio3 */
 	case 5: /* vccio4 */
 	case 6: /* vccio5 */

commit 42256c1a8f6b612aeee9b456fe605ef3570dd6ae
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Wed May 26 09:17:33 2021 +0800

    drm/rockchip: gem: fix dma_free_attrs() parameter error
    
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>
    Change-Id: I84204ef5348d3429aa104c6e8a307458d1a88504

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
index fd98fc2443c1..aa2ab2b97c27 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
@@ -258,7 +258,7 @@ static int rockchip_gem_alloc_dma(struct rockchip_gem_object *rk_obj,
 		rk_obj->dma_attrs |= DMA_ATTR_NO_KERNEL_MAPPING;
 
 	rk_obj->kvaddr = dma_alloc_attrs(drm->dev, obj->size,
-					 &rk_obj->dma_handle, GFP_KERNEL,
+					 &rk_obj->dma_addr, GFP_KERNEL,
 					 rk_obj->dma_attrs);
 	if (!rk_obj->kvaddr) {
 		DRM_ERROR("failed to allocate %zu byte dma buffer", obj->size);
@@ -272,7 +272,7 @@ static int rockchip_gem_alloc_dma(struct rockchip_gem_object *rk_obj,
 	}
 
 	ret = dma_get_sgtable_attrs(drm->dev, sgt, rk_obj->kvaddr,
-				    rk_obj->dma_handle, obj->size,
+				    rk_obj->dma_addr, obj->size,
 				    rk_obj->dma_attrs);
 	if (ret) {
 		DRM_ERROR("failed to allocate sgt, %d\n", ret);
@@ -352,7 +352,7 @@ static int rockchip_gem_alloc_secure(struct rockchip_gem_object *rk_obj)
 		return -ENOMEM;
 	}
 
-	rk_obj->dma_handle = paddr;
+	rk_obj->dma_addr = paddr;
 	rk_obj->num_pages = rk_obj->base.size >> PAGE_SHIFT;
 
 	rk_obj->pages = drm_calloc_large(rk_obj->num_pages,
@@ -396,7 +396,7 @@ static void rockchip_gem_free_secure(struct rockchip_gem_object *rk_obj)
 	drm_free_large(rk_obj->pages);
 	sg_free_table(rk_obj->sgt);
 	kfree(rk_obj->sgt);
-	gen_pool_free(private->secure_buffer_pool, rk_obj->dma_handle,
+	gen_pool_free(private->secure_buffer_pool, rk_obj->dma_addr,
 		      rk_obj->base.size);
 }
 
@@ -449,8 +449,7 @@ static int rockchip_gem_alloc_buf(struct rockchip_gem_object *rk_obj,
 		if (ret < 0)
 			goto err_free;
 	} else {
-		WARN_ON(!rk_obj->dma_handle);
-		rk_obj->dma_addr = rk_obj->dma_handle;
+		WARN_ON(!rk_obj->dma_addr);
 	}
 
 	return 0;
@@ -477,7 +476,7 @@ static void rockchip_gem_free_dma(struct rockchip_gem_object *rk_obj)
 	sg_free_table(rk_obj->sgt);
 	kfree(rk_obj->sgt);
 	dma_free_attrs(drm->dev, obj->size, rk_obj->kvaddr,
-		       rk_obj->dma_handle, rk_obj->dma_attrs);
+		       rk_obj->dma_addr, rk_obj->dma_attrs);
 }
 
 static void rockchip_gem_free_buf(struct rockchip_gem_object *rk_obj)
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h
index 2b299b848465..7469cbe62922 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h
@@ -31,7 +31,6 @@ struct rockchip_gem_object {
 	void *kvaddr;
 	void *cookie;
 	dma_addr_t dma_addr;
-	dma_addr_t dma_handle;
 
 	/* Used when IOMMU is disabled */
 	unsigned long dma_attrs;

commit 6aef0738cff72229b71fa2e3b4c5359729888f7f
Author: shengfei Xu <xsf@rock-chips.com>
Date:   Wed May 26 17:20:09 2021 +0800

    regulator: fan53555: fix regulator resume error
    
    if the default voltage and the regulator on/off in suspend can't be
    changed in runtime, the fan53555 not need the resume function.
    fix regulator resume error as follows log:
    [   12.726012] dpm_run_callback(): regulator_resume+0x0/0x68 returns -1
    [   12.726041] PM: Device regulator.1 failed to resume: error -1
    [   12.726623] dpm_run_callback(): regulator_resume+0x0/0x68 returns -1
    [   12.726641] PM: Device regulator.2 failed to resume: error -1
    [   12.727216] dpm_run_callback(): regulator_resume+0x0/0x68 returns -1
    [   12.727246] PM: Device regulator.3 failed to resume: error -1
    [   12.727826] dpm_run_callback(): regulator_resume+0x0/0x68 returns -1
    [   12.727855] PM: Device regulator.4 failed to resume: error -1
    [   12.728437] dpm_run_callback(): regulator_resume+0x0/0x68 returns -1
    [   12.728467] PM: Device regulator.5 failed to resume: error -1
    [   12.729045] dpm_run_callback(): regulator_resume+0x0/0x68 returns -1
    [   12.729074] PM: Device regulator.6 failed to resume: error -1
    [   12.729653] dpm_run_callback(): regulator_resume+0x0/0x68 returns -1
    [   12.729683] PM: Device regulator.7 failed to resume: error -1
    [   12.730195] dpm_run_callback(): regulator_resume+0x0/0x68 returns -1
    [   12.730222] PM: Device regulator.8 failed to resume: error -1
    [   12.730783] dpm_run_callback(): regulator_resume+0x0/0x68 returns -1
    [   12.730812] PM: Device regulator.9 failed to resume: error -1
    
    Fixes: af1b6e88fa5f ("regulator: fan53555: add fan53555 resume")
    Change-Id: Iab3ef39e6bc218eab12430d43299f8e85d6e465e
    Signed-off-by: shengfei Xu <xsf@rock-chips.com>

diff --git a/drivers/regulator/fan53555.c b/drivers/regulator/fan53555.c
index 1c52203578eb..192c2edceb93 100644
--- a/drivers/regulator/fan53555.c
+++ b/drivers/regulator/fan53555.c
@@ -204,6 +204,9 @@ static int fan53555_resume(struct regulator_dev *rdev)
 {
 	int ret;
 
+	if (!rdev->constraints->state_mem.changeable)
+		return 0;
+
 	ret = fan53555_set_suspend_enable(rdev);
 	if (ret)
 		return ret;

commit dc69c8c7820d6f694123f92d5c29cb342744a621
Author: Elaine Zhang <zhangqing@rock-chips.com>
Date:   Tue May 11 17:07:26 2021 +0800

    UPSTREAM: clk: rockchip: Optimize PLL table memory usage
    
    Before the change: The sizeof rk3568_pll_rates = 2544
    Use union: The sizeof rk3568_pll_rates = 1696
    
    In future Soc, more PLL types will be added, and the
    rockchip_pll_rate_table will add more members,
    and the space savings will be even more pronounced
    by using union.
    
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    Link: https://lore.kernel.org/r/20210511090726.15146-1-zhangqing@rock-chips.com
    Signed-off-by: Heiko Stuebner <heiko@sntech.de>
    (cherry picked from commit 23029150a05b59ebacca6dd76f6c14dc67a95877
     git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip.git v5.14-clk/next)
    Change-Id: Ia8f038861c327feb41602cc9a997e82333fae67b

diff --git a/drivers/clk/rockchip/clk.h b/drivers/clk/rockchip/clk.h
index fb47672e7643..45630b5b86b5 100644
--- a/drivers/clk/rockchip/clk.h
+++ b/drivers/clk/rockchip/clk.h
@@ -339,17 +339,24 @@ struct rockchip_clk_provider {
 
 struct rockchip_pll_rate_table {
 	unsigned long rate;
-	unsigned int nr;
-	unsigned int nf;
-	unsigned int no;
-	unsigned int nb;
-	/* for RK3036/RK3399 */
-	unsigned int fbdiv;
-	unsigned int postdiv1;
-	unsigned int refdiv;
-	unsigned int postdiv2;
-	unsigned int dsmpd;
-	unsigned int frac;
+	union {
+		struct {
+			/* for RK3066 */
+			unsigned int nr;
+			unsigned int nf;
+			unsigned int no;
+			unsigned int nb;
+		};
+		struct {
+			/* for RK3036/RK3399 */
+			unsigned int fbdiv;
+			unsigned int postdiv1;
+			unsigned int refdiv;
+			unsigned int postdiv2;
+			unsigned int dsmpd;
+			unsigned int frac;
+		};
+	};
 };
 
 /**

commit b4ea08d1ede949a3b9dc1c90c732b4aa40d9b9b3
Author: Caesar Wang <wxt@rock-chips.com>
Date:   Wed May 26 14:13:20 2021 +0800

    scripts: io-domain.sh: update docs
    
    Fixes: b25c12a00a9a ("scripts: add io-domain.sh for rk356x io-domain check")
    Signed-off-by: Caesar Wang <wxt@rock-chips.com>
    Change-Id: I7e1c657102fd782a359c3aabfbbdbdf63875f675

diff --git a/scripts/io-domain.sh b/scripts/io-domain.sh
index 58d9b6bccd9a..42729e4753ed 100755
--- a/scripts/io-domain.sh
+++ b/scripts/io-domain.sh
@@ -314,8 +314,16 @@ if [ "$CheckBckfileRet" != "2" ];then
 				vccio6-supply = <&vcc_1v8>;
 				vccio7-supply = <&vcc_3v3>;
 			};
+
 		io-domain docs:
-		RKDocs/common/IO-Domain/Rockchip_RK356X_Introduction_IO_Power_Domains_Configuration.pdf
+
+		Android11 SDK:
+		RKDocs/android/Rockchip_Developer_Guide_Android11_SDK_V1.1.2_CN.pdf or newer.
+
+		RK356X Linux SDK:
+		docs/RK356X/Rockchip_RK356X_Introduction_IO_Power_Domains_Configuration.pdf
+		docs/Common/IO-DOMAIN/Rockchip_Developer_Guide_Linux_IO_DOMAIN_CN.pdf
+
 		"
 
 		exit 1

commit 6b7b0056defc6eb5c87bbe4690ccda547b2891aa
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Wed May 26 11:48:36 2021 +0200

    Linux 4.19.192
    
    Link: https://lore.kernel.org/r/20210524152324.382084875@linuxfoundation.org
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Jason Self <jason@bluehome.net>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Tested-by: Hulk Robot <hulkrobot@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index 586a2d128ffb..51ee6da4c1ab 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 191
+SUBLEVEL = 192
 EXTRAVERSION =
 NAME = "People's Front"
 

commit 30126d4ba73119565f1748b116b9869ac6bbda6b
Author: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Date:   Wed Mar 10 14:13:08 2021 -0800

    Bluetooth: SMP: Fail if remote and local public keys are identical
    
    commit 6d19628f539fccf899298ff02ee4c73e4bf6df3f upstream.
    
    This fails the pairing procedure when both remote and local non-debug
    public keys are identical.
    
    Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c
index cc2f7ca91ccd..719ae1dff7b4 100644
--- a/net/bluetooth/smp.c
+++ b/net/bluetooth/smp.c
@@ -2703,6 +2703,15 @@ static int smp_cmd_public_key(struct l2cap_conn *conn, struct sk_buff *skb)
 	if (skb->len < sizeof(*key))
 		return SMP_INVALID_PARAMS;
 
+	/* Check if remote and local public keys are the same and debug key is
+	 * not in use.
+	 */
+	if (!test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags) &&
+	    !crypto_memneq(key, smp->local_pk, 64)) {
+		bt_dev_err(hdev, "Remote and local public keys are identical");
+		return SMP_UNSPECIFIED;
+	}
+
 	memcpy(smp->remote_pk, key, 64);
 
 	if (test_bit(SMP_FLAG_REMOTE_OOB, &smp->flags)) {

commit 1dfd47b684c28eaa568f7d1d1702a110bd9eb612
Author: Anirudh Rayabharam <mail@anirudhrb.com>
Date:   Mon May 17 00:57:14 2021 +0530

    video: hgafb: correctly handle card detect failure during probe
    
    commit 02625c965239b71869326dd0461615f27307ecb3 upstream.
    
    The return value of hga_card_detect() is not properly handled causing
    the probe to succeed even though hga_card_detect() failed. Since probe
    succeeds, hgafb_open() can be called which will end up operating on an
    unmapped hga_vram. This results in an out-of-bounds access as reported
    by kernel test robot [1].
    
    To fix this, correctly detect failure of hga_card_detect() by checking
    for a non-zero error code.
    
    [1]: https://lore.kernel.org/lkml/20210516150019.GB25903@xsang-OptiPlex-9020/
    
    Fixes: dc13cac4862c ("video: hgafb: fix potential NULL pointer dereference")
    Cc: stable <stable@vger.kernel.org>
    Reported-by: kernel test robot <oliver.sang@intel.com>
    Reviewed-by: Igor Matheus Andrade Torrente <igormtorrente@gmail.com>
    Signed-off-by: Anirudh Rayabharam <mail@anirudhrb.com>
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Link: https://lore.kernel.org/r/20210516192714.25823-1-mail@anirudhrb.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/video/fbdev/hgafb.c b/drivers/video/fbdev/hgafb.c
index b2b996196132..03c0b1b8747b 100644
--- a/drivers/video/fbdev/hgafb.c
+++ b/drivers/video/fbdev/hgafb.c
@@ -558,7 +558,7 @@ static int hgafb_probe(struct platform_device *pdev)
 	int ret;
 
 	ret = hga_card_detect();
-	if (!ret)
+	if (ret)
 		return ret;
 
 	printk(KERN_INFO "hgafb: %s with %ldK of memory detected.\n",

commit 17d6c58c5fc522561daa4d3fb270edba933ac0a6
Author: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Date:   Sat May 15 03:00:37 2021 +0000

    tty: vt: always invoke vc->vc_sw->con_resize callback
    
    commit ffb324e6f874121f7dce5bdae5e05d02baae7269 upstream.
    
    syzbot is reporting OOB write at vga16fb_imageblit() [1], for
    resize_screen() from ioctl(VT_RESIZE) returns 0 without checking whether
    requested rows/columns fit the amount of memory reserved for the graphical
    screen if current mode is KD_GRAPHICS.
    
    ----------
      #include <sys/types.h>
      #include <sys/stat.h>
      #include <fcntl.h>
      #include <sys/ioctl.h>
      #include <linux/kd.h>
      #include <linux/vt.h>
    
      int main(int argc, char *argv[])
      {
            const int fd = open("/dev/char/4:1", O_RDWR);
            struct vt_sizes vt = { 0x4100, 2 };
    
            ioctl(fd, KDSETMODE, KD_GRAPHICS);
            ioctl(fd, VT_RESIZE, &vt);
            ioctl(fd, KDSETMODE, KD_TEXT);
            return 0;
      }
    ----------
    
    Allow framebuffer drivers to return -EINVAL, by moving vc->vc_mode !=
    KD_GRAPHICS check from resize_screen() to fbcon_resize().
    
    Link: https://syzkaller.appspot.com/bug?extid=1f29e126cf461c4de3b3 [1]
    Reported-by: syzbot <syzbot+1f29e126cf461c4de3b3@syzkaller.appspotmail.com>
    Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Tested-by: syzbot <syzbot+1f29e126cf461c4de3b3@syzkaller.appspotmail.com>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 1fad4978a3b4..b2b5f19fb2fb 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -1169,7 +1169,7 @@ static inline int resize_screen(struct vc_data *vc, int width, int height,
 	/* Resizes the resolution of the display adapater */
 	int err = 0;
 
-	if (vc->vc_mode != KD_GRAPHICS && vc->vc_sw->con_resize)
+	if (vc->vc_sw->con_resize)
 		err = vc->vc_sw->con_resize(vc, width, height, user);
 
 	return err;
diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index cf0e025416e5..bf7959fdf9f4 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -2025,7 +2025,7 @@ static int fbcon_resize(struct vc_data *vc, unsigned int width,
 			return -EINVAL;
 
 		DPRINTK("resize now %ix%i\n", var.xres, var.yres);
-		if (con_is_visible(vc)) {
+		if (con_is_visible(vc) && vc->vc_mode == KD_TEXT) {
 			var.activate = FB_ACTIVATE_NOW |
 				FB_ACTIVATE_FORCE;
 			fb_set_var(info, &var);

commit 8c5ec4a731e1e2d9b6906bcde62de57a609a9b86
Author: Maciej W. Rozycki <macro@orcam.me.uk>
Date:   Thu May 13 11:51:50 2021 +0200

    vt: Fix character height handling with VT_RESIZEX
    
    commit 860dafa902595fb5f1d23bbcce1215188c3341e6 upstream.
    
    Restore the original intent of the VT_RESIZEX ioctl's `v_clin' parameter
    which is the number of pixel rows per character (cell) rather than the
    height of the font used.
    
    For framebuffer devices the two values are always the same, because the
    former is inferred from the latter one.  For VGA used as a true text
    mode device these two parameters are independent from each other: the
    number of pixel rows per character is set in the CRT controller, while
    font height is in fact hardwired to 32 pixel rows and fonts of heights
    below that value are handled by padding their data with blanks when
    loaded to hardware for use by the character generator.  One can change
    the setting in the CRT controller and it will update the screen contents
    accordingly regardless of the font loaded.
    
    The `v_clin' parameter is used by the `vgacon' driver to set the height
    of the character cell and then the cursor position within.  Make the
    parameter explicit then, by defining a new `vc_cell_height' struct
    member of `vc_data', set it instead of `vc_font.height' from `v_clin' in
    the VT_RESIZEX ioctl, and then use it throughout the `vgacon' driver
    except where actual font data is accessed which as noted above is
    independent from the CRTC setting.
    
    This way the framebuffer console driver is free to ignore the `v_clin'
    parameter as irrelevant, as it always should have, avoiding any issues
    attempts to give the parameter a meaning there could have caused, such
    as one that has led to commit 988d0763361b ("vt_ioctl: make VT_RESIZEX
    behave like VT_RESIZE"):
    
     "syzbot is reporting UAF/OOB read at bit_putcs()/soft_cursor() [1][2],
      for vt_resizex() from ioctl(VT_RESIZEX) allows setting font height
      larger than actual font height calculated by con_font_set() from
      ioctl(PIO_FONT). Since fbcon_set_font() from con_font_set() allocates
      minimal amount of memory based on actual font height calculated by
      con_font_set(), use of vt_resizex() can cause UAF/OOB read for font
      data."
    
    The problem first appeared around Linux 2.5.66 which predates our repo
    history, but the origin could be identified with the old MIPS/Linux repo
    also at: <git://git.kernel.org/pub/scm/linux/kernel/git/ralf/linux.git>
    as commit 9736a3546de7 ("Merge with Linux 2.5.66."), where VT_RESIZEX
    code in `vt_ioctl' was updated as follows:
    
                    if (clin)
    -                       video_font_height = clin;
    +                       vc->vc_font.height = clin;
    
    making the parameter apply to framebuffer devices as well, perhaps due
    to the use of "font" in the name of the original `video_font_height'
    variable.  Use "cell" in the new struct member then to avoid ambiguity.
    
    References:
    
    [1] https://syzkaller.appspot.com/bug?id=32577e96d88447ded2d3b76d71254fb855245837
    [2] https://syzkaller.appspot.com/bug?id=6b8355d27b2b94fb5cedf4655e3a59162d9e48e3
    
    Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk>
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: stable@vger.kernel.org # v2.6.12+
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/tty/vt/vt_ioctl.c b/drivers/tty/vt/vt_ioctl.c
index 2e959563af53..ce6c7dd7bc12 100644
--- a/drivers/tty/vt/vt_ioctl.c
+++ b/drivers/tty/vt/vt_ioctl.c
@@ -895,17 +895,17 @@ int vt_ioctl(struct tty_struct *tty,
 			if (vcp) {
 				int ret;
 				int save_scan_lines = vcp->vc_scan_lines;
-				int save_font_height = vcp->vc_font.height;
+				int save_cell_height = vcp->vc_cell_height;
 
 				if (v.v_vlin)
 					vcp->vc_scan_lines = v.v_vlin;
 				if (v.v_clin)
-					vcp->vc_font.height = v.v_clin;
+					vcp->vc_cell_height = v.v_clin;
 				vcp->vc_resize_user = 1;
 				ret = vc_resize(vcp, v.v_cols, v.v_rows);
 				if (ret) {
 					vcp->vc_scan_lines = save_scan_lines;
-					vcp->vc_font.height = save_font_height;
+					vcp->vc_cell_height = save_cell_height;
 					console_unlock();
 					return ret;
 				}
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index 4509d0547087..a992d922b3a7 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -384,7 +384,7 @@ static void vgacon_init(struct vc_data *c, int init)
 		vc_resize(c, vga_video_num_columns, vga_video_num_lines);
 
 	c->vc_scan_lines = vga_scan_lines;
-	c->vc_font.height = vga_video_font_height;
+	c->vc_font.height = c->vc_cell_height = vga_video_font_height;
 	c->vc_complement_mask = 0x7700;
 	if (vga_512_chars)
 		c->vc_hi_font_mask = 0x0800;
@@ -517,32 +517,32 @@ static void vgacon_cursor(struct vc_data *c, int mode)
 		switch (c->vc_cursor_type & 0x0f) {
 		case CUR_UNDERLINE:
 			vgacon_set_cursor_size(c->vc_x,
-					       c->vc_font.height -
-					       (c->vc_font.height <
+					       c->vc_cell_height -
+					       (c->vc_cell_height <
 						10 ? 2 : 3),
-					       c->vc_font.height -
-					       (c->vc_font.height <
+					       c->vc_cell_height -
+					       (c->vc_cell_height <
 						10 ? 1 : 2));
 			break;
 		case CUR_TWO_THIRDS:
 			vgacon_set_cursor_size(c->vc_x,
-					       c->vc_font.height / 3,
-					       c->vc_font.height -
-					       (c->vc_font.height <
+					       c->vc_cell_height / 3,
+					       c->vc_cell_height -
+					       (c->vc_cell_height <
 						10 ? 1 : 2));
 			break;
 		case CUR_LOWER_THIRD:
 			vgacon_set_cursor_size(c->vc_x,
-					       (c->vc_font.height * 2) / 3,
-					       c->vc_font.height -
-					       (c->vc_font.height <
+					       (c->vc_cell_height * 2) / 3,
+					       c->vc_cell_height -
+					       (c->vc_cell_height <
 						10 ? 1 : 2));
 			break;
 		case CUR_LOWER_HALF:
 			vgacon_set_cursor_size(c->vc_x,
-					       c->vc_font.height / 2,
-					       c->vc_font.height -
-					       (c->vc_font.height <
+					       c->vc_cell_height / 2,
+					       c->vc_cell_height -
+					       (c->vc_cell_height <
 						10 ? 1 : 2));
 			break;
 		case CUR_NONE:
@@ -553,7 +553,7 @@ static void vgacon_cursor(struct vc_data *c, int mode)
 			break;
 		default:
 			vgacon_set_cursor_size(c->vc_x, 1,
-					       c->vc_font.height);
+					       c->vc_cell_height);
 			break;
 		}
 		break;
@@ -564,13 +564,13 @@ static int vgacon_doresize(struct vc_data *c,
 		unsigned int width, unsigned int height)
 {
 	unsigned long flags;
-	unsigned int scanlines = height * c->vc_font.height;
+	unsigned int scanlines = height * c->vc_cell_height;
 	u8 scanlines_lo = 0, r7 = 0, vsync_end = 0, mode, max_scan;
 
 	raw_spin_lock_irqsave(&vga_lock, flags);
 
 	vgacon_xres = width * VGA_FONTWIDTH;
-	vgacon_yres = height * c->vc_font.height;
+	vgacon_yres = height * c->vc_cell_height;
 	if (vga_video_type >= VIDEO_TYPE_VGAC) {
 		outb_p(VGA_CRTC_MAX_SCAN, vga_video_port_reg);
 		max_scan = inb_p(vga_video_port_val);
@@ -625,9 +625,9 @@ static int vgacon_doresize(struct vc_data *c,
 static int vgacon_switch(struct vc_data *c)
 {
 	int x = c->vc_cols * VGA_FONTWIDTH;
-	int y = c->vc_rows * c->vc_font.height;
+	int y = c->vc_rows * c->vc_cell_height;
 	int rows = screen_info.orig_video_lines * vga_default_font_height/
-		c->vc_font.height;
+		c->vc_cell_height;
 	/*
 	 * We need to save screen size here as it's the only way
 	 * we can spot the screen has been resized and we need to
@@ -1058,7 +1058,7 @@ static int vgacon_adjust_height(struct vc_data *vc, unsigned fontheight)
 				cursor_size_lastto = 0;
 				c->vc_sw->con_cursor(c, CM_DRAW);
 			}
-			c->vc_font.height = fontheight;
+			c->vc_font.height = c->vc_cell_height = fontheight;
 			vc_resize(c, 0, rows);	/* Adjust console size */
 		}
 	}
@@ -1113,12 +1113,12 @@ static int vgacon_resize(struct vc_data *c, unsigned int width,
 		 */
 		screen_info.orig_video_cols = width;
 		screen_info.orig_video_lines = height;
-		vga_default_font_height = c->vc_font.height;
+		vga_default_font_height = c->vc_cell_height;
 		return 0;
 	}
 	if (width % 2 || width > screen_info.orig_video_cols ||
 	    height > (screen_info.orig_video_lines * vga_default_font_height)/
-	    c->vc_font.height)
+	    c->vc_cell_height)
 		return -EINVAL;
 
 	if (con_is_visible(c) && !vga_is_gfx) /* who knows */
diff --git a/include/linux/console_struct.h b/include/linux/console_struct.h
index fea64f2692a0..8b5bc3a47bf5 100644
--- a/include/linux/console_struct.h
+++ b/include/linux/console_struct.h
@@ -62,6 +62,7 @@ struct vc_data {
 	unsigned int	vc_rows;
 	unsigned int	vc_size_row;		/* Bytes per row */
 	unsigned int	vc_scan_lines;		/* # of scan lines */
+	unsigned int	vc_cell_height;		/* CRTC character cell height */
 	unsigned long	vc_origin;		/* [!] Start of real screen */
 	unsigned long	vc_scr_end;		/* [!] End of real screen */
 	unsigned long	vc_visible_origin;	/* [!] Top of visible window */

commit 9a71ed8da907c36de4e96a8d78216231c0fe8df5
Author: Maciej W. Rozycki <macro@orcam.me.uk>
Date:   Thu May 13 11:51:41 2021 +0200

    vgacon: Record video mode changes with VT_RESIZEX
    
    commit d4d0ad57b3865795c4cde2fb5094c594c2e8f469 upstream.
    
    Fix an issue with VGA console font size changes made after the initial
    video text mode has been changed with a user tool like `svgatextmode'
    calling the VT_RESIZEX ioctl.  As it stands in that case the original
    screen geometry continues being used to validate further VT resizing.
    
    Consequently when the video adapter is firstly reprogrammed from the
    original say 80x25 text mode using a 9x16 character cell (720x400 pixel
    resolution) to say 80x37 text mode and the same character cell (720x592
    pixel resolution), and secondly the CRTC character cell updated to 9x8
    (by loading a suitable font with the KD_FONT_OP_SET request of the
    KDFONTOP ioctl), the VT geometry does not get further updated from 80x37
    and only upper half of the screen is used for the VT, with the lower
    half showing rubbish corresponding to whatever happens to be there in
    the video memory that maps to that part of the screen.  Of course the
    proportions change according to text mode geometries and font sizes
    chosen.
    
    Address the problem then, by updating the text mode geometry defaults
    rather than checking against them whenever the VT is resized via a user
    ioctl.
    
    Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk>
    Fixes: e400b6ec4ede ("vt/vgacon: Check if screen resize request comes from userspace")
    Cc: stable@vger.kernel.org # v2.6.24+
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
index 55507df335bd..4509d0547087 100644
--- a/drivers/video/console/vgacon.c
+++ b/drivers/video/console/vgacon.c
@@ -1106,12 +1106,20 @@ static int vgacon_resize(struct vc_data *c, unsigned int width,
 	if ((width << 1) * height > vga_vram_size)
 		return -EINVAL;
 
+	if (user) {
+		/*
+		 * Ho ho!  Someone (svgatextmode, eh?) may have reprogrammed
+		 * the video mode!  Set the new defaults then and go away.
+		 */
+		screen_info.orig_video_cols = width;
+		screen_info.orig_video_lines = height;
+		vga_default_font_height = c->vc_font.height;
+		return 0;
+	}
 	if (width % 2 || width > screen_info.orig_video_cols ||
 	    height > (screen_info.orig_video_lines * vga_default_font_height)/
 	    c->vc_font.height)
-		/* let svgatextmode tinker with video timings and
-		   return success */
-		return (user) ? 0 : -EINVAL;
+		return -EINVAL;
 
 	if (con_is_visible(c) && !vga_is_gfx) /* who knows */
 		vgacon_doresize(c, width, height);

commit fd8f21c9d234111e1d73903e74672df8862d8c3a
Author: Igor Matheus Andrade Torrente <igormtorrente@gmail.com>
Date:   Mon May 3 13:57:06 2021 +0200

    video: hgafb: fix potential NULL pointer dereference
    
    commit dc13cac4862cc68ec74348a80b6942532b7735fa upstream.
    
    The return of ioremap if not checked, and can lead to a NULL to be
    assigned to hga_vram. Potentially leading to a NULL pointer
    dereference.
    
    The fix adds code to deal with this case in the error label and
    changes how the hgafb_probe handles the return of hga_card_detect.
    
    Cc: Ferenc Bakonyi <fero@drama.obuda.kando.hu>
    Cc: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Igor Matheus Andrade Torrente <igormtorrente@gmail.com>
    Link: https://lore.kernel.org/r/20210503115736.2104747-40-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/video/fbdev/hgafb.c b/drivers/video/fbdev/hgafb.c
index 463028543173..b2b996196132 100644
--- a/drivers/video/fbdev/hgafb.c
+++ b/drivers/video/fbdev/hgafb.c
@@ -285,6 +285,8 @@ static int hga_card_detect(void)
 	hga_vram_len  = 0x08000;
 
 	hga_vram = ioremap(0xb0000, hga_vram_len);
+	if (!hga_vram)
+		return -ENOMEM;
 
 	if (request_region(0x3b0, 12, "hgafb"))
 		release_io_ports = 1;
@@ -344,13 +346,18 @@ static int hga_card_detect(void)
 			hga_type_name = "Hercules";
 			break;
 	}
-	return 1;
+	return 0;
 error:
 	if (release_io_ports)
 		release_region(0x3b0, 12);
 	if (release_io_port)
 		release_region(0x3bf, 1);
-	return 0;
+
+	iounmap(hga_vram);
+
+	pr_err("hgafb: HGA card not detected.\n");
+
+	return -EINVAL;
 }
 
 /**
@@ -548,13 +555,11 @@ static struct fb_ops hgafb_ops = {
 static int hgafb_probe(struct platform_device *pdev)
 {
 	struct fb_info *info;
+	int ret;
 
-	if (! hga_card_detect()) {
-		printk(KERN_INFO "hgafb: HGA card not detected.\n");
-		if (hga_vram)
-			iounmap(hga_vram);
-		return -EINVAL;
-	}
+	ret = hga_card_detect();
+	if (!ret)
+		return ret;
 
 	printk(KERN_INFO "hgafb: %s with %ldK of memory detected.\n",
 		hga_type_name, hga_vram_len/1024);

commit 2ca93aca35867187f35ed8d64b1588c07f525e9c
Author: Tom Seewald <tseewald@gmail.com>
Date:   Mon May 3 13:56:52 2021 +0200

    qlcnic: Add null check after calling netdev_alloc_skb
    
    commit 84460f01cba382553199bc1361f69a872d5abed4 upstream.
    
    The function qlcnic_dl_lb_test() currently calls netdev_alloc_skb()
    without checking afterwards that the allocation succeeded. Fix this by
    checking if the skb is NULL and returning an error in such a case.
    Breaking out of the loop if the skb is NULL is not correct as no error
    would be reported to the caller and no message would be printed for the
    user.
    
    Cc: David S. Miller <davem@davemloft.net>
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Tom Seewald <tseewald@gmail.com>
    Link: https://lore.kernel.org/r/20210503115736.2104747-26-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
index 3b0adda7cc9c..4fb3dcb03819 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
@@ -1048,6 +1048,8 @@ int qlcnic_do_lb_test(struct qlcnic_adapter *adapter, u8 mode)
 
 	for (i = 0; i < QLCNIC_NUM_ILB_PKT; i++) {
 		skb = netdev_alloc_skb(adapter->netdev, QLCNIC_ILB_PKT_SIZE);
+		if (!skb)
+			goto error;
 		qlcnic_create_loopback_buff(skb->data, adapter->mac_addr);
 		skb_put(skb, QLCNIC_ILB_PKT_SIZE);
 		adapter->ahw->diag_cnt = 0;
@@ -1071,6 +1073,7 @@ int qlcnic_do_lb_test(struct qlcnic_adapter *adapter, u8 mode)
 			cnt++;
 	}
 	if (cnt != i) {
+error:
 		dev_err(&adapter->pdev->dev,
 			"LB Test: failed, TX[%d], RX[%d]\n", i, cnt);
 		if (mode != QLCNIC_ILB_MODE)

commit 8c5548e36f24271119ee21b415f1fbba2f128b0f
Author: Phillip Potter <phil@philpotter.co.uk>
Date:   Mon May 3 13:56:36 2021 +0200

    leds: lp5523: check return value of lp5xx_read and jump to cleanup code
    
    commit 6647f7a06eb030a2384ec71f0bb2e78854afabfe upstream.
    
    Check return value of lp5xx_read and if non-zero, jump to code at end of
    the function, causing lp5523_stop_all_engines to be executed before
    returning the error value up the call chain. This fixes the original
    commit (248b57015f35) which was reverted due to the University of Minnesota
    problems.
    
    Cc: stable <stable@vger.kernel.org>
    Acked-by: Jacek Anaszewski <jacek.anaszewski@gmail.com>
    Signed-off-by: Phillip Potter <phil@philpotter.co.uk>
    Link: https://lore.kernel.org/r/20210503115736.2104747-10-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/leds/leds-lp5523.c b/drivers/leds/leds-lp5523.c
index a2e74feee2b2..e5413d93f0a1 100644
--- a/drivers/leds/leds-lp5523.c
+++ b/drivers/leds/leds-lp5523.c
@@ -318,7 +318,9 @@ static int lp5523_init_program_engine(struct lp55xx_chip *chip)
 
 	/* Let the programs run for couple of ms and check the engine status */
 	usleep_range(3000, 6000);
-	lp55xx_read(chip, LP5523_REG_STATUS, &status);
+	ret = lp55xx_read(chip, LP5523_REG_STATUS, &status);
+	if (ret)
+		goto out;
 	status &= LP5523_ENG_STATUS_MASK;
 
 	if (status != LP5523_ENG_STATUS_MASK) {

commit 3ac4e35dbc418aa811b1dc4a03e58e666f6d5d9b
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon May 3 13:56:40 2021 +0200

    net: rtlwifi: properly check for alloc_workqueue() failure
    
    commit 30b0e0ee9d02b97b68705c46b41444786effc40c upstream.
    
    If alloc_workqueue() fails, properly catch this and propagate the error
    to the calling functions, so that the devuce initialization will
    properly error out.
    
    Cc: Kalle Valo <kvalo@codeaurora.org>
    Cc: Bryan Brattlof <hello@bryanbrattlof.com>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210503115736.2104747-14-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/realtek/rtlwifi/base.c b/drivers/net/wireless/realtek/rtlwifi/base.c
index ef9b502ce576..6d1b6a4a8150 100644
--- a/drivers/net/wireless/realtek/rtlwifi/base.c
+++ b/drivers/net/wireless/realtek/rtlwifi/base.c
@@ -457,9 +457,14 @@ static void _rtl_init_mac80211(struct ieee80211_hw *hw)
 	}
 }
 
-static void _rtl_init_deferred_work(struct ieee80211_hw *hw)
+static int _rtl_init_deferred_work(struct ieee80211_hw *hw)
 {
 	struct rtl_priv *rtlpriv = rtl_priv(hw);
+	struct workqueue_struct *wq;
+
+	wq = alloc_workqueue("%s", 0, 0, rtlpriv->cfg->name);
+	if (!wq)
+		return -ENOMEM;
 
 	/* <1> timer */
 	timer_setup(&rtlpriv->works.watchdog_timer,
@@ -468,7 +473,8 @@ static void _rtl_init_deferred_work(struct ieee80211_hw *hw)
 		    rtl_easy_concurrent_retrytimer_callback, 0);
 	/* <2> work queue */
 	rtlpriv->works.hw = hw;
-	rtlpriv->works.rtl_wq = alloc_workqueue("%s", 0, 0, rtlpriv->cfg->name);
+	rtlpriv->works.rtl_wq = wq;
+
 	INIT_DELAYED_WORK(&rtlpriv->works.watchdog_wq,
 			  (void *)rtl_watchdog_wq_callback);
 	INIT_DELAYED_WORK(&rtlpriv->works.ips_nic_off_wq,
@@ -481,7 +487,7 @@ static void _rtl_init_deferred_work(struct ieee80211_hw *hw)
 			  (void *)rtl_fwevt_wq_callback);
 	INIT_DELAYED_WORK(&rtlpriv->works.c2hcmd_wq,
 			  (void *)rtl_c2hcmd_wq_callback);
-
+	return 0;
 }
 
 void rtl_deinit_deferred_work(struct ieee80211_hw *hw, bool ips_wq)
@@ -581,9 +587,7 @@ int rtl_init_core(struct ieee80211_hw *hw)
 	rtlmac->link_state = MAC80211_NOLINK;
 
 	/* <6> init deferred work */
-	_rtl_init_deferred_work(hw);
-
-	return 0;
+	return _rtl_init_deferred_work(hw);
 }
 EXPORT_SYMBOL_GPL(rtl_init_core);
 

commit 11ffb2d6035fcd7c445ca93b2ed835da6e7f8757
Author: Phillip Potter <phil@philpotter.co.uk>
Date:   Mon May 3 13:56:58 2021 +0200

    scsi: ufs: handle cleanup correctly on devm_reset_control_get error
    
    commit 2f4a784f40f8d337d6590e2e93f46429052e15ac upstream.
    
    Move ufshcd_set_variant call in ufs_hisi_init_common to common error
    section at end of the function, and then jump to this from the error
    checking statements for both devm_reset_control_get and
    ufs_hisi_get_resource. This fixes the original commit (63a06181d7ce)
    which was reverted due to the University of Minnesota problems.
    
    Suggested-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Avri Altman <avri.altman@wdc.com>
    Cc: Martin K. Petersen <martin.petersen@oracle.com>
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Phillip Potter <phil@philpotter.co.uk>
    Link: https://lore.kernel.org/r/20210503115736.2104747-32-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/scsi/ufs/ufs-hisi.c b/drivers/scsi/ufs/ufs-hisi.c
index 452e19f8fb47..2bb8bdc2539b 100644
--- a/drivers/scsi/ufs/ufs-hisi.c
+++ b/drivers/scsi/ufs/ufs-hisi.c
@@ -543,17 +543,24 @@ static int ufs_hisi_init_common(struct ufs_hba *hba)
 	host->hba = hba;
 	ufshcd_set_variant(hba, host);
 
-	host->rst  = devm_reset_control_get(dev, "rst");
+	host->rst = devm_reset_control_get(dev, "rst");
+	if (IS_ERR(host->rst)) {
+		dev_err(dev, "%s: failed to get reset control\n", __func__);
+		err = PTR_ERR(host->rst);
+		goto error;
+	}
 
 	ufs_hisi_set_pm_lvl(hba);
 
 	err = ufs_hisi_get_resource(host);
-	if (err) {
-		ufshcd_set_variant(hba, NULL);
-		return err;
-	}
+	if (err)
+		goto error;
 
 	return 0;
+
+error:
+	ufshcd_set_variant(hba, NULL);
+	return err;
 }
 
 static int ufs_hi3660_init(struct ufs_hba *hba)

commit 6db3667f75922d5be6a7418b165f0d5bcc22e463
Author: Anirudh Rayabharam <mail@anirudhrb.com>
Date:   Mon May 3 13:56:48 2021 +0200

    net: stmicro: handle clk_prepare() failure during init
    
    commit 0c32a96d000f260b5ebfabb4145a86ae1cd71847 upstream.
    
    In case clk_prepare() fails, capture and propagate the error code up the
    stack. If regulator_enable() was called earlier, properly unwind it by
    calling regulator_disable().
    
    Signed-off-by: Anirudh Rayabharam <mail@anirudhrb.com>
    Cc: David S. Miller <davem@davemloft.net>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210503115736.2104747-22-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
index c0824c6fe86d..f31067659e95 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
@@ -39,7 +39,7 @@ struct sunxi_priv_data {
 static int sun7i_gmac_init(struct platform_device *pdev, void *priv)
 {
 	struct sunxi_priv_data *gmac = priv;
-	int ret;
+	int ret = 0;
 
 	if (gmac->regulator) {
 		ret = regulator_enable(gmac->regulator);
@@ -59,10 +59,12 @@ static int sun7i_gmac_init(struct platform_device *pdev, void *priv)
 		gmac->clk_enabled = 1;
 	} else {
 		clk_set_rate(gmac->tx_clk, SUN7I_GMAC_MII_RATE);
-		clk_prepare(gmac->tx_clk);
+		ret = clk_prepare(gmac->tx_clk);
+		if (ret && gmac->regulator)
+			regulator_disable(gmac->regulator);
 	}
 
-	return 0;
+	return ret;
 }
 
 static void sun7i_gmac_exit(struct platform_device *pdev, void *priv)

commit 9b4a9f267aac1ad488329e78e0da09f0691198bd
Author: Du Cheng <ducheng2@gmail.com>
Date:   Mon May 3 13:56:50 2021 +0200

    ethernet: sun: niu: fix missing checks of niu_pci_eeprom_read()
    
    commit e6e337708c22f80824b82d4af645f20715730ad0 upstream.
    
    niu_pci_eeprom_read() may fail, so add checks to its return value and
    propagate the error up the callstack.
    
    An examination of the callstack up to niu_pci_eeprom_read shows that:
    
    niu_pci_eeprom_read() // returns int
        niu_pci_vpd_scan_props() // returns int
            niu_pci_vpd_fetch() // returns *void*
                niu_get_invariants() // returns int
    
    since niu_pci_vpd_fetch() returns void which breaks the bubbling up,
    change its return type to int so that error is propagated upwards.
    
    Signed-off-by: Du Cheng <ducheng2@gmail.com>
    Cc: Shannon Nelson <shannon.lee.nelson@gmail.com>
    Cc: David S. Miller <davem@davemloft.net>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210503115736.2104747-24-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/sun/niu.c b/drivers/net/ethernet/sun/niu.c
index c225118dd599..5894edf79d65 100644
--- a/drivers/net/ethernet/sun/niu.c
+++ b/drivers/net/ethernet/sun/niu.c
@@ -8098,6 +8098,8 @@ static int niu_pci_vpd_scan_props(struct niu *np, u32 start, u32 end)
 		start += 3;
 
 		prop_len = niu_pci_eeprom_read(np, start + 4);
+		if (prop_len < 0)
+			return prop_len;
 		err = niu_pci_vpd_get_propname(np, start + 5, namebuf, 64);
 		if (err < 0)
 			return err;
@@ -8142,8 +8144,12 @@ static int niu_pci_vpd_scan_props(struct niu *np, u32 start, u32 end)
 			netif_printk(np, probe, KERN_DEBUG, np->dev,
 				     "VPD_SCAN: Reading in property [%s] len[%d]\n",
 				     namebuf, prop_len);
-			for (i = 0; i < prop_len; i++)
-				*prop_buf++ = niu_pci_eeprom_read(np, off + i);
+			for (i = 0; i < prop_len; i++) {
+				err =  niu_pci_eeprom_read(np, off + i);
+				if (err < 0)
+					return err;
+				*prop_buf++ = err;
+			}
 		}
 
 		start += len;
@@ -8153,14 +8159,14 @@ static int niu_pci_vpd_scan_props(struct niu *np, u32 start, u32 end)
 }
 
 /* ESPC_PIO_EN_ENABLE must be set */
-static void niu_pci_vpd_fetch(struct niu *np, u32 start)
+static int niu_pci_vpd_fetch(struct niu *np, u32 start)
 {
 	u32 offset;
 	int err;
 
 	err = niu_pci_eeprom_read16_swp(np, start + 1);
 	if (err < 0)
-		return;
+		return err;
 
 	offset = err + 3;
 
@@ -8169,12 +8175,14 @@ static void niu_pci_vpd_fetch(struct niu *np, u32 start)
 		u32 end;
 
 		err = niu_pci_eeprom_read(np, here);
+		if (err < 0)
+			return err;
 		if (err != 0x90)
-			return;
+			return -EINVAL;
 
 		err = niu_pci_eeprom_read16_swp(np, here + 1);
 		if (err < 0)
-			return;
+			return err;
 
 		here = start + offset + 3;
 		end = start + offset + err;
@@ -8182,9 +8190,12 @@ static void niu_pci_vpd_fetch(struct niu *np, u32 start)
 		offset += err;
 
 		err = niu_pci_vpd_scan_props(np, here, end);
-		if (err < 0 || err == 1)
-			return;
+		if (err < 0)
+			return err;
+		if (err == 1)
+			return -EINVAL;
 	}
+	return 0;
 }
 
 /* ESPC_PIO_EN_ENABLE must be set */
@@ -9275,8 +9286,11 @@ static int niu_get_invariants(struct niu *np)
 		offset = niu_pci_vpd_offset(np);
 		netif_printk(np, probe, KERN_DEBUG, np->dev,
 			     "%s() VPD offset [%08x]\n", __func__, offset);
-		if (offset)
-			niu_pci_vpd_fetch(np, offset);
+		if (offset) {
+			err = niu_pci_vpd_fetch(np, offset);
+			if (err < 0)
+				return err;
+		}
 		nw64(ESPC_PIO_EN, 0);
 
 		if (np->flags & NIU_FLAGS_VPD_VALID) {

commit 8432db9d8a34f26030cee45e64a56a2e033d3ba6
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon May 3 13:56:49 2021 +0200

    Revert "niu: fix missing checks of niu_pci_eeprom_read"
    
    commit 7930742d6a0ff091c85b92ef4e076432d8d8cb79 upstream.
    
    This reverts commit 26fd962bde0b15e54234fe762d86bc0349df1de4.
    
    Because of recent interactions with developers from @umn.edu, all
    commits from them have been recently re-reviewed to ensure if they were
    correct or not.
    
    Upon review, this commit was found to be incorrect for the reasons
    below, so it must be reverted.  It will be fixed up "correctly" in a
    later kernel change.
    
    The change here was incorrect.  While it is nice to check if
    niu_pci_eeprom_read() succeeded or not when using the data, any error
    that might have happened was not propagated upwards properly, causing
    the kernel to assume that these reads were successful, which results in
    invalid data in the buffer that was to contain the successfully read
    data.
    
    Cc: Kangjie Lu <kjlu@umn.edu>
    Cc: Shannon Nelson <shannon.lee.nelson@gmail.com>
    Cc: David S. Miller <davem@davemloft.net>
    Fixes: 26fd962bde0b ("niu: fix missing checks of niu_pci_eeprom_read")
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210503115736.2104747-23-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/sun/niu.c b/drivers/net/ethernet/sun/niu.c
index 602a2025717a..c225118dd599 100644
--- a/drivers/net/ethernet/sun/niu.c
+++ b/drivers/net/ethernet/sun/niu.c
@@ -8098,8 +8098,6 @@ static int niu_pci_vpd_scan_props(struct niu *np, u32 start, u32 end)
 		start += 3;
 
 		prop_len = niu_pci_eeprom_read(np, start + 4);
-		if (prop_len < 0)
-			return prop_len;
 		err = niu_pci_vpd_get_propname(np, start + 5, namebuf, 64);
 		if (err < 0)
 			return err;
@@ -8144,12 +8142,8 @@ static int niu_pci_vpd_scan_props(struct niu *np, u32 start, u32 end)
 			netif_printk(np, probe, KERN_DEBUG, np->dev,
 				     "VPD_SCAN: Reading in property [%s] len[%d]\n",
 				     namebuf, prop_len);
-			for (i = 0; i < prop_len; i++) {
-				err = niu_pci_eeprom_read(np, off + i);
-				if (err >= 0)
-					*prop_buf = err;
-				++prop_buf;
-			}
+			for (i = 0; i < prop_len; i++)
+				*prop_buf++ = niu_pci_eeprom_read(np, off + i);
 		}
 
 		start += len;

commit 4190fc7c261cc0431483f44adedcce87320a6b8e
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon May 3 13:56:51 2021 +0200

    Revert "qlcnic: Avoid potential NULL pointer dereference"
    
    commit b95b57dfe7a142bf2446548eb7f49340fd73e78b upstream.
    
    This reverts commit 5bf7295fe34a5251b1d241b9736af4697b590670.
    
    Because of recent interactions with developers from @umn.edu, all
    commits from them have been recently re-reviewed to ensure if they were
    correct or not.
    
    Upon review, this commit was found to be incorrect for the reasons
    below, so it must be reverted.  It will be fixed up "correctly" in a
    later kernel change.
    
    This commit does not properly detect if an error happens because the
    logic after this loop will not detect that there was a failed
    allocation.
    
    Cc: Aditya Pakki <pakki001@umn.edu>
    Cc: David S. Miller <davem@davemloft.net>
    Fixes: 5bf7295fe34a ("qlcnic: Avoid potential NULL pointer dereference")
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210503115736.2104747-25-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
index a4cd6f2cfb86..3b0adda7cc9c 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
@@ -1048,8 +1048,6 @@ int qlcnic_do_lb_test(struct qlcnic_adapter *adapter, u8 mode)
 
 	for (i = 0; i < QLCNIC_NUM_ILB_PKT; i++) {
 		skb = netdev_alloc_skb(adapter->netdev, QLCNIC_ILB_PKT_SIZE);
-		if (!skb)
-			break;
 		qlcnic_create_loopback_buff(skb->data, adapter->mac_addr);
 		skb_put(skb, QLCNIC_ILB_PKT_SIZE);
 		adapter->ahw->diag_cnt = 0;

commit ff867789b504162c982b99d463b77d4320fe478d
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon May 3 13:56:39 2021 +0200

    Revert "rtlwifi: fix a potential NULL pointer dereference"
    
    commit 68c5634c4a7278672a3bed00eb5646884257c413 upstream.
    
    This reverts commit 765976285a8c8db3f0eb7f033829a899d0c2786e.
    
    Because of recent interactions with developers from @umn.edu, all
    commits from them have been recently re-reviewed to ensure if they were
    correct or not.
    
    Upon review, this commit was found to be incorrect for the reasons
    below, so it must be reverted.  It will be fixed up "correctly" in a
    later kernel change.
    
    This commit is not correct, it should not have used unlikely() and is
    not propagating the error properly to the calling function, so it should
    be reverted at this point in time.  Also, if the check failed, the
    work queue was still assumed to be allocated, so further accesses would
    have continued to fail, meaning this patch does nothing to solve the
    root issues at all.
    
    Cc: Kangjie Lu <kjlu@umn.edu>
    Cc: Kalle Valo <kvalo@codeaurora.org>
    Cc: Bryan Brattlof <hello@bryanbrattlof.com>
    Fixes: 765976285a8c ("rtlwifi: fix a potential NULL pointer dereference")
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210503115736.2104747-13-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/realtek/rtlwifi/base.c b/drivers/net/wireless/realtek/rtlwifi/base.c
index a3189294ecb8..ef9b502ce576 100644
--- a/drivers/net/wireless/realtek/rtlwifi/base.c
+++ b/drivers/net/wireless/realtek/rtlwifi/base.c
@@ -469,11 +469,6 @@ static void _rtl_init_deferred_work(struct ieee80211_hw *hw)
 	/* <2> work queue */
 	rtlpriv->works.hw = hw;
 	rtlpriv->works.rtl_wq = alloc_workqueue("%s", 0, 0, rtlpriv->cfg->name);
-	if (unlikely(!rtlpriv->works.rtl_wq)) {
-		pr_err("Failed to allocate work queue\n");
-		return;
-	}
-
 	INIT_DELAYED_WORK(&rtlpriv->works.watchdog_wq,
 			  (void *)rtl_watchdog_wq_callback);
 	INIT_DELAYED_WORK(&rtlpriv->works.ips_nic_off_wq,

commit 4d08695b76ba20eff037ccb32cf3945f46498185
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon May 3 13:56:30 2021 +0200

    Revert "media: rcar_drif: fix a memory disclosure"
    
    commit 3e465fc3846734e9489273d889f19cc17b4cf4bd upstream.
    
    This reverts commit d39083234c60519724c6ed59509a2129fd2aed41.
    
    Because of recent interactions with developers from @umn.edu, all
    commits from them have been recently re-reviewed to ensure if they were
    correct or not.
    
    Upon review, it was determined that this commit is not needed at all as
    the media core already prevents memory disclosure on this codepath, so
    just drop the extra memset happening here.
    
    Cc: Kangjie Lu <kjlu@umn.edu>
    Cc: Geert Uytterhoeven <geert+renesas@glider.be>
    Cc: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Cc: Mauro Carvalho Chehab <mchehab@kernel.org>
    Fixes: d39083234c60 ("media: rcar_drif: fix a memory disclosure")
    Cc: stable <stable@vger.kernel.org>
    Reviewed-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Reviewed-by: Fabrizio Castro <fabrizio.castro.jz@renesas.com>
    Link: https://lore.kernel.org/r/20210503115736.2104747-4-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/media/platform/rcar_drif.c b/drivers/media/platform/rcar_drif.c
index b677d014e7ba..81413ab52475 100644
--- a/drivers/media/platform/rcar_drif.c
+++ b/drivers/media/platform/rcar_drif.c
@@ -912,7 +912,6 @@ static int rcar_drif_g_fmt_sdr_cap(struct file *file, void *priv,
 {
 	struct rcar_drif_sdr *sdr = video_drvdata(file);
 
-	memset(f->fmt.sdr.reserved, 0, sizeof(f->fmt.sdr.reserved));
 	f->fmt.sdr.pixelformat = sdr->fmt->pixelformat;
 	f->fmt.sdr.buffersize = sdr->fmt->buffersize;
 

commit b85a5f191e459b331063099bfe4916593f1d276d
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Thu May 6 16:00:47 2021 +0200

    cdrom: gdrom: initialize global variable at init time
    
    commit 9183f01b5e6e32eb3f17b5f3f8d5ad5ac9786c49 upstream.
    
    As Peter points out, if we were to disconnect and then reconnect this
    driver from a device, the "global" state of the device would contain odd
    values and could cause problems.  Fix this up by just initializing the
    whole thing to 0 at probe() time.
    
    Ideally this would be a per-device variable, but given the age and the
    total lack of users of it, that would require a lot of s/./->/g changes
    for really no good reason.
    
    Reported-by: Peter Rosin <peda@axentia.se>
    Cc: Jens Axboe <axboe@kernel.dk>
    Reviewed-by: Peter Rosin <peda@axentia.se>
    Link: https://lore.kernel.org/r/YJP2j6AU82MqEY2M@kroah.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/cdrom/gdrom.c b/drivers/cdrom/gdrom.c
index d0325d2c9071..c4192f9e4db9 100644
--- a/drivers/cdrom/gdrom.c
+++ b/drivers/cdrom/gdrom.c
@@ -775,6 +775,13 @@ static int probe_gdrom_setupqueue(void)
 static int probe_gdrom(struct platform_device *devptr)
 {
 	int err;
+
+	/*
+	 * Ensure our "one" device is initialized properly in case of previous
+	 * usages of it
+	 */
+	memset(&gd, 0, sizeof(gd));
+
 	/* Start the device */
 	if (gdrom_execute_diagnostic() != 1) {
 		pr_warning("ATA Probe for GDROM failed\n");
@@ -874,7 +881,7 @@ static struct platform_driver gdrom_driver = {
 static int __init init_gdrom(void)
 {
 	int rc;
-	gd.toc = NULL;
+
 	rc = platform_driver_register(&gdrom_driver);
 	if (rc)
 		return rc;

commit 0a1a60339889e1ec3bbcc4b76bac5b7636a2273b
Author: Atul Gopinathan <atulgopinathan@gmail.com>
Date:   Mon May 3 13:56:54 2021 +0200

    cdrom: gdrom: deallocate struct gdrom_unit fields in remove_gdrom
    
    commit d03d1021da6fe7f46efe9f2a7335564e7c9db5ab upstream.
    
    The fields, "toc" and "cd_info", of "struct gdrom_unit gd" are allocated
    in "probe_gdrom()". Prevent a memory leak by making sure "gd.cd_info" is
    deallocated in the "remove_gdrom()" function.
    
    Also prevent double free of the field "gd.toc" by moving it from the
    module's exit function to "remove_gdrom()". This is because, in
    "probe_gdrom()", the function makes sure to deallocate "gd.toc" in case
    of any errors, so the exit function invoked later would again free
    "gd.toc".
    
    The patch also maintains consistency by deallocating the above mentioned
    fields in "remove_gdrom()" along with another memory allocated field
    "gd.disk".
    
    Suggested-by: Jens Axboe <axboe@kernel.dk>
    Cc: Peter Rosin <peda@axentia.se>
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Atul Gopinathan <atulgopinathan@gmail.com>
    Link: https://lore.kernel.org/r/20210503115736.2104747-28-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/cdrom/gdrom.c b/drivers/cdrom/gdrom.c
index ae3a7537cf0f..d0325d2c9071 100644
--- a/drivers/cdrom/gdrom.c
+++ b/drivers/cdrom/gdrom.c
@@ -857,6 +857,8 @@ static int remove_gdrom(struct platform_device *devptr)
 	if (gdrom_major)
 		unregister_blkdev(gdrom_major, GDROM_DEV_NAME);
 	unregister_cdrom(gd.cd_info);
+	kfree(gd.cd_info);
+	kfree(gd.toc);
 
 	return 0;
 }
@@ -888,7 +890,6 @@ static void __exit exit_gdrom(void)
 {
 	platform_device_unregister(pd);
 	platform_driver_unregister(&gdrom_driver);
-	kfree(gd.toc);
 }
 
 module_init(init_gdrom);

commit 69d17230341a313091ad10713acd2aa33acfc3b7
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon May 3 13:56:53 2021 +0200

    Revert "gdrom: fix a memory leak bug"
    
    commit 257343d3ed557f11d580d0b7c515dc154f64a42b upstream.
    
    This reverts commit 093c48213ee37c3c3ff1cf5ac1aa2a9d8bc66017.
    
    Because of recent interactions with developers from @umn.edu, all
    commits from them have been recently re-reviewed to ensure if they were
    correct or not.
    
    Upon review, this commit was found to be incorrect for the reasons
    below, so it must be reverted.  It will be fixed up "correctly" in a
    later kernel change.
    
    Because of this, all submissions from this group must be reverted from
    the kernel tree and will need to be re-reviewed again to determine if
    they actually are a valid fix.  Until that work is complete, remove this
    change to ensure that no problems are being introduced into the
    codebase.
    
    Cc: Wenwen Wang <wang6495@umn.edu>
    Cc: Peter Rosin <peda@axentia.se>
    Cc: Jens Axboe <axboe@kernel.dk>
    Fixes: 093c48213ee3 ("gdrom: fix a memory leak bug")
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210503115736.2104747-27-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/cdrom/gdrom.c b/drivers/cdrom/gdrom.c
index 72cd96a8eb19..ae3a7537cf0f 100644
--- a/drivers/cdrom/gdrom.c
+++ b/drivers/cdrom/gdrom.c
@@ -889,7 +889,6 @@ static void __exit exit_gdrom(void)
 	platform_device_unregister(pd);
 	platform_driver_unregister(&gdrom_driver);
 	kfree(gd.toc);
-	kfree(gd.cd_info);
 }
 
 module_init(init_gdrom);

commit 12b6934b22083a9ab30db104d81c49e43a5ab1c8
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon May 3 13:56:57 2021 +0200

    Revert "scsi: ufs: fix a missing check of devm_reset_control_get"
    
    commit 4d427b408c4c2ff1676966c72119a3a559f8e39b upstream.
    
    This reverts commit 63a06181d7ce169d09843645c50fea1901bc9f0a.
    
    Because of recent interactions with developers from @umn.edu, all
    commits from them have been recently re-reviewed to ensure if they were
    correct or not.
    
    Upon review, this commit was found to be incorrect for the reasons
    below, so it must be reverted.  It will be fixed up "correctly" in a
    later kernel change.
    
    The original commit is incorrect, it does not properly clean up on the
    error path, so I'll keep the revert and fix it up properly with a
    follow-on patch.
    
    Cc: Kangjie Lu <kjlu@umn.edu>
    Cc: Avri Altman <avri.altman@wdc.com>
    Cc: Martin K. Petersen <martin.petersen@oracle.com>
    Fixes: 63a06181d7ce ("scsi: ufs: fix a missing check of devm_reset_control_get")
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210503115736.2104747-31-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/scsi/ufs/ufs-hisi.c b/drivers/scsi/ufs/ufs-hisi.c
index c2cee73a8560..452e19f8fb47 100644
--- a/drivers/scsi/ufs/ufs-hisi.c
+++ b/drivers/scsi/ufs/ufs-hisi.c
@@ -544,10 +544,6 @@ static int ufs_hisi_init_common(struct ufs_hba *hba)
 	ufshcd_set_variant(hba, host);
 
 	host->rst  = devm_reset_control_get(dev, "rst");
-	if (IS_ERR(host->rst)) {
-		dev_err(dev, "%s: failed to get reset control\n", __func__);
-		return PTR_ERR(host->rst);
-	}
 
 	ufs_hisi_set_pm_lvl(hba);
 

commit b3af22579552bc449ad2e68d4a5c7b5221ecf45b
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon May 3 13:57:15 2021 +0200

    Revert "ecryptfs: replace BUG_ON with error handling code"
    
    commit e1436df2f2550bc89d832ffd456373fdf5d5b5d7 upstream.
    
    This reverts commit 2c2a7552dd6465e8fde6bc9cccf8d66ed1c1eb72.
    
    Because of recent interactions with developers from @umn.edu, all
    commits from them have been recently re-reviewed to ensure if they were
    correct or not.
    
    Upon review, this commit was found to be incorrect for the reasons
    below, so it must be reverted.  It will be fixed up "correctly" in a
    later kernel change.
    
    The original commit log for this change was incorrect, no "error
    handling code" was added, things will blow up just as badly as before if
    any of these cases ever were true.  As this BUG_ON() never fired, and
    most of these checks are "obviously" never going to be true, let's just
    revert to the original code for now until this gets unwound to be done
    correctly in the future.
    
    Cc: Aditya Pakki <pakki001@umn.edu>
    Fixes: 2c2a7552dd64 ("ecryptfs: replace BUG_ON with error handling code")
    Cc: stable <stable@vger.kernel.org>
    Acked-by: Tyler Hicks <code@tyhicks.com>
    Link: https://lore.kernel.org/r/20210503115736.2104747-49-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c
index 8e5353bd72cf..708f931c36f1 100644
--- a/fs/ecryptfs/crypto.c
+++ b/fs/ecryptfs/crypto.c
@@ -325,10 +325,8 @@ static int crypt_scatterlist(struct ecryptfs_crypt_stat *crypt_stat,
 	struct extent_crypt_result ecr;
 	int rc = 0;
 
-	if (!crypt_stat || !crypt_stat->tfm
-	       || !(crypt_stat->flags & ECRYPTFS_STRUCT_INITIALIZED))
-		return -EINVAL;
-
+	BUG_ON(!crypt_stat || !crypt_stat->tfm
+	       || !(crypt_stat->flags & ECRYPTFS_STRUCT_INITIALIZED));
 	if (unlikely(ecryptfs_verbosity > 0)) {
 		ecryptfs_printk(KERN_DEBUG, "Key size [%zd]; key:\n",
 				crypt_stat->key_size);

commit 94deabc3da468888b9abd8d7f4df3e7d1a43e497
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon May 3 13:57:33 2021 +0200

    Revert "video: imsttfb: fix potential NULL pointer dereferences"
    
    commit ed04fe8a0e87d7b5ea17d47f4ac9ec962b24814a upstream.
    
    This reverts commit 1d84353d205a953e2381044953b7fa31c8c9702d.
    
    Because of recent interactions with developers from @umn.edu, all
    commits from them have been recently re-reviewed to ensure if they were
    correct or not.
    
    Upon review, this commit was found to be incorrect for the reasons
    below, so it must be reverted.  It will be fixed up "correctly" in a
    later kernel change.
    
    The original commit here, while technically correct, did not fully
    handle all of the reported issues that the commit stated it was fixing,
    so revert it until it can be "fixed" fully.
    
    Note, ioremap() probably will never fail for old hardware like this, and
    if anyone actually used this hardware (a PowerMac era PCI display card),
    they would not be using fbdev anymore.
    
    Cc: Kangjie Lu <kjlu@umn.edu>
    Cc: Aditya Pakki <pakki001@umn.edu>
    Cc: Finn Thain <fthain@telegraphics.com.au>
    Cc: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
    Reviewed-by: Rob Herring <robh@kernel.org>
    Fixes: 1d84353d205a ("video: imsttfb: fix potential NULL pointer dereferences")
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210503115736.2104747-67-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/video/fbdev/imsttfb.c b/drivers/video/fbdev/imsttfb.c
index ffcf553719a3..ecdcf358ad5e 100644
--- a/drivers/video/fbdev/imsttfb.c
+++ b/drivers/video/fbdev/imsttfb.c
@@ -1516,11 +1516,6 @@ static int imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	info->fix.smem_start = addr;
 	info->screen_base = (__u8 *)ioremap(addr, par->ramdac == IBM ?
 					    0x400000 : 0x800000);
-	if (!info->screen_base) {
-		release_mem_region(addr, size);
-		framebuffer_release(info);
-		return -ENOMEM;
-	}
 	info->fix.mmio_start = addr + 0x800000;
 	par->dc_regs = ioremap(addr + 0x800000, 0x1000);
 	par->cmap_regs_phys = addr + 0x840000;

commit ec19a4fba56a0ca3143f2ac192764f769f88453a
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon May 3 13:56:31 2021 +0200

    Revert "hwmon: (lm80) fix a missing check of bus read in lm80 probe"
    
    commit 99ae3417672a6d4a3bf68d4fc43d7c6ca074d477 upstream.
    
    This reverts commit 9aa3aa15f4c2f74f47afd6c5db4b420fadf3f315.
    
    Because of recent interactions with developers from @umn.edu, all
    commits from them have been recently re-reviewed to ensure if they were
    correct or not.
    
    Upon review, it was determined that this commit is not needed at all so
    just revert it.  Also, the call to lm80_init_client() was not properly
    handled, so if error handling is needed in the lm80_probe() function,
    then it should be done properly, not half-baked like the commit being
    reverted here did.
    
    Cc: Kangjie Lu <kjlu@umn.edu>
    Fixes: 9aa3aa15f4c2 ("hwmon: (lm80) fix a missing check of bus read in lm80 probe")
    Cc: stable <stable@vger.kernel.org>
    Acked-by: Guenter Roeck <linux@roeck-us.net>
    Link: https://lore.kernel.org/r/20210503115736.2104747-5-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/hwmon/lm80.c b/drivers/hwmon/lm80.c
index f9b8e3e23a8e..dc2bd82b3202 100644
--- a/drivers/hwmon/lm80.c
+++ b/drivers/hwmon/lm80.c
@@ -630,7 +630,6 @@ static int lm80_probe(struct i2c_client *client,
 	struct device *dev = &client->dev;
 	struct device *hwmon_dev;
 	struct lm80_data *data;
-	int rv;
 
 	data = devm_kzalloc(dev, sizeof(struct lm80_data), GFP_KERNEL);
 	if (!data)
@@ -643,14 +642,8 @@ static int lm80_probe(struct i2c_client *client,
 	lm80_init_client(client);
 
 	/* A few vars need to be filled upon startup */
-	rv = lm80_read_value(client, LM80_REG_FAN_MIN(1));
-	if (rv < 0)
-		return rv;
-	data->fan[f_min][0] = rv;
-	rv = lm80_read_value(client, LM80_REG_FAN_MIN(2));
-	if (rv < 0)
-		return rv;
-	data->fan[f_min][1] = rv;
+	data->fan[f_min][0] = lm80_read_value(client, LM80_REG_FAN_MIN(1));
+	data->fan[f_min][1] = lm80_read_value(client, LM80_REG_FAN_MIN(2));
 
 	hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
 							   data, lm80_groups);

commit f7bce372a9e415990c6b9852febc7fb0ffc93729
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon May 3 13:56:35 2021 +0200

    Revert "leds: lp5523: fix a missing check of return value of lp55xx_read"
    
    commit 8d1beda5f11953ffe135a5213287f0b25b4da41b upstream.
    
    This reverts commit 248b57015f35c94d4eae2fdd8c6febf5cd703900.
    
    Because of recent interactions with developers from @umn.edu, all
    commits from them have been recently re-reviewed to ensure if they were
    correct or not.
    
    Upon review, this commit was found to be incorrect for the reasons
    below, so it must be reverted.  It will be fixed up "correctly" in a
    later kernel change.
    
    The original commit does not properly unwind if there is an error
    condition so it needs to be reverted at this point in time.
    
    Cc: Kangjie Lu <kjlu@umn.edu>
    Cc: Jacek Anaszewski <jacek.anaszewski@gmail.com>
    Cc: stable <stable@vger.kernel.org>
    Fixes: 248b57015f35 ("leds: lp5523: fix a missing check of return value of lp55xx_read")
    Link: https://lore.kernel.org/r/20210503115736.2104747-9-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/leds/leds-lp5523.c b/drivers/leds/leds-lp5523.c
index fd64df5a57a5..a2e74feee2b2 100644
--- a/drivers/leds/leds-lp5523.c
+++ b/drivers/leds/leds-lp5523.c
@@ -318,9 +318,7 @@ static int lp5523_init_program_engine(struct lp55xx_chip *chip)
 
 	/* Let the programs run for couple of ms and check the engine status */
 	usleep_range(3000, 6000);
-	ret = lp55xx_read(chip, LP5523_REG_STATUS, &status);
-	if (ret)
-		return ret;
+	lp55xx_read(chip, LP5523_REG_STATUS, &status);
 	status &= LP5523_ENG_STATUS_MASK;
 
 	if (status != LP5523_ENG_STATUS_MASK) {

commit 84a7ffe7a4a3a742180109e273d2e400ed0c1ace
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon May 3 13:56:47 2021 +0200

    Revert "net: stmicro: fix a missing check of clk_prepare"
    
    commit bee1b0511844c8c79fccf1f2b13472393b6b91f7 upstream.
    
    This reverts commit f86a3b83833e7cfe558ca4d70b64ebc48903efec.
    
    Because of recent interactions with developers from @umn.edu, all
    commits from them have been recently re-reviewed to ensure if they were
    correct or not.
    
    Upon review, this commit was found to be incorrect for the reasons
    below, so it must be reverted.  It will be fixed up "correctly" in a
    later kernel change.
    
    The original commit causes a memory leak when it is trying to claim it
    is properly handling errors.  Revert this change and fix it up properly
    in a follow-on commit.
    
    Cc: Kangjie Lu <kjlu@umn.edu>
    Cc: David S. Miller <davem@davemloft.net>
    Fixes: f86a3b83833e ("net: stmicro: fix a missing check of clk_prepare")
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210503115736.2104747-21-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
index 57694eada995..c0824c6fe86d 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
@@ -59,9 +59,7 @@ static int sun7i_gmac_init(struct platform_device *pdev, void *priv)
 		gmac->clk_enabled = 1;
 	} else {
 		clk_set_rate(gmac->tx_clk, SUN7I_GMAC_MII_RATE);
-		ret = clk_prepare(gmac->tx_clk);
-		if (ret)
-			return ret;
+		clk_prepare(gmac->tx_clk);
 	}
 
 	return 0;

commit 84c19f6a5cbb0c4bc96fbb7b29acdba918e94992
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon May 3 13:57:05 2021 +0200

    Revert "video: hgafb: fix potential NULL pointer dereference"
    
    commit 58c0cc2d90f1e37c4eb63ae7f164c83830833f78 upstream.
    
    This reverts commit ec7f6aad57ad29e4e66cc2e18e1e1599ddb02542.
    
    Because of recent interactions with developers from @umn.edu, all
    commits from them have been recently re-reviewed to ensure if they were
    correct or not.
    
    Upon review, this commit was found to be incorrect for the reasons
    below, so it must be reverted.  It will be fixed up "correctly" in a
    later kernel change.
    
    This patch "looks" correct, but the driver keeps on running and will
    fail horribly right afterward if this error condition ever trips.
    
    So points for trying to resolve an issue, but a huge NEGATIVE value for
    providing a "fake" fix for the problem as nothing actually got resolved
    at all.  I'll go fix this up properly...
    
    Cc: Kangjie Lu <kjlu@umn.edu>
    Cc: Aditya Pakki <pakki001@umn.edu>
    Cc: Ferenc Bakonyi <fero@drama.obuda.kando.hu>
    Cc: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
    Fixes: ec7f6aad57ad ("video: hgafb: fix potential NULL pointer dereference")
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210503115736.2104747-39-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/video/fbdev/hgafb.c b/drivers/video/fbdev/hgafb.c
index 59e1cae57948..463028543173 100644
--- a/drivers/video/fbdev/hgafb.c
+++ b/drivers/video/fbdev/hgafb.c
@@ -285,8 +285,6 @@ static int hga_card_detect(void)
 	hga_vram_len  = 0x08000;
 
 	hga_vram = ioremap(0xb0000, hga_vram_len);
-	if (!hga_vram)
-		goto error;
 
 	if (request_region(0x3b0, 12, "hgafb"))
 		release_io_ports = 1;

commit 1ff004c41c8205d7677f7b9d7da238a5d9a29274
Author: Mikulas Patocka <mpatocka@redhat.com>
Date:   Mon May 10 14:49:05 2021 -0400

    dm snapshot: fix crash with transient storage and zero chunk size
    
    commit c699a0db2d62e3bbb7f0bf35c87edbc8d23e3062 upstream.
    
    The following commands will crash the kernel:
    
    modprobe brd rd_size=1048576
    dmsetup create o --table "0 `blockdev --getsize /dev/ram0` snapshot-origin /dev/ram0"
    dmsetup create s --table "0 `blockdev --getsize /dev/ram0` snapshot /dev/ram0 /dev/ram1 N 0"
    
    The reason is that when we test for zero chunk size, we jump to the label
    bad_read_metadata without setting the "r" variable. The function
    snapshot_ctr destroys all the structures and then exits with "r == 0". The
    kernel then crashes because it falsely believes that snapshot_ctr
    succeeded.
    
    In order to fix the bug, we set the variable "r" to -EINVAL.
    
    Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Mike Snitzer <snitzer@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c
index 9e930a150aa2..7d9683629471 100644
--- a/drivers/md/dm-snap.c
+++ b/drivers/md/dm-snap.c
@@ -1286,6 +1286,7 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv)
 
 	if (!s->store->chunk_size) {
 		ti->error = "Chunk size not set";
+		r = -EINVAL;
 		goto bad_read_metadata;
 	}
 

commit 3ad47f4a7a1312f545bd8a1bd4d134ce00f07a59
Author: Jan Beulich <jbeulich@suse.com>
Date:   Tue May 18 18:14:07 2021 +0200

    xen-pciback: reconfigure also from backend watch handler
    
    commit c81d3d24602540f65256f98831d0a25599ea6b87 upstream.
    
    When multiple PCI devices get assigned to a guest right at boot, libxl
    incrementally populates the backend tree. The writes for the first of
    the devices trigger the backend watch. In turn xen_pcibk_setup_backend()
    will set the XenBus state to Initialised, at which point no further
    reconfigures would happen unless a device got hotplugged. Arrange for
    reconfigure to also get triggered from the backend watch handler.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Cc: stable@vger.kernel.org
    Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Link: https://lore.kernel.org/r/2337cbd6-94b9-4187-9862-c03ea12e0c61@suse.com
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/xen/xen-pciback/xenbus.c b/drivers/xen/xen-pciback/xenbus.c
index 1e2a996c7515..4fb6aacf9614 100644
--- a/drivers/xen/xen-pciback/xenbus.c
+++ b/drivers/xen/xen-pciback/xenbus.c
@@ -358,7 +358,8 @@ static int xen_pcibk_publish_pci_root(struct xen_pcibk_device *pdev,
 	return err;
 }
 
-static int xen_pcibk_reconfigure(struct xen_pcibk_device *pdev)
+static int xen_pcibk_reconfigure(struct xen_pcibk_device *pdev,
+				 enum xenbus_state state)
 {
 	int err = 0;
 	int num_devs;
@@ -372,9 +373,7 @@ static int xen_pcibk_reconfigure(struct xen_pcibk_device *pdev)
 	dev_dbg(&pdev->xdev->dev, "Reconfiguring device ...\n");
 
 	mutex_lock(&pdev->dev_lock);
-	/* Make sure we only reconfigure once */
-	if (xenbus_read_driver_state(pdev->xdev->nodename) !=
-	    XenbusStateReconfiguring)
+	if (xenbus_read_driver_state(pdev->xdev->nodename) != state)
 		goto out;
 
 	err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename, "num_devs", "%d",
@@ -499,6 +498,10 @@ static int xen_pcibk_reconfigure(struct xen_pcibk_device *pdev)
 		}
 	}
 
+	if (state != XenbusStateReconfiguring)
+		/* Make sure we only reconfigure once. */
+		goto out;
+
 	err = xenbus_switch_state(pdev->xdev, XenbusStateReconfigured);
 	if (err) {
 		xenbus_dev_fatal(pdev->xdev, err,
@@ -524,7 +527,7 @@ static void xen_pcibk_frontend_changed(struct xenbus_device *xdev,
 		break;
 
 	case XenbusStateReconfiguring:
-		xen_pcibk_reconfigure(pdev);
+		xen_pcibk_reconfigure(pdev, XenbusStateReconfiguring);
 		break;
 
 	case XenbusStateConnected:
@@ -663,6 +666,15 @@ static void xen_pcibk_be_watch(struct xenbus_watch *watch,
 		xen_pcibk_setup_backend(pdev);
 		break;
 
+	case XenbusStateInitialised:
+		/*
+		 * We typically move to Initialised when the first device was
+		 * added. Hence subsequent devices getting added may need
+		 * reconfiguring.
+		 */
+		xen_pcibk_reconfigure(pdev, XenbusStateInitialised);
+		break;
+
 	default:
 		break;
 	}

commit c5fc7a18c0616f468b30430ce34498d51481bfac
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon May 3 13:56:32 2021 +0200

    Revert "serial: mvebu-uart: Fix to avoid a potential NULL pointer dereference"
    
    commit 754f39158441f4c0d7a8255209dd9a939f08ce80 upstream.
    
    This reverts commit 32f47179833b63de72427131169809065db6745e.
    
    Because of recent interactions with developers from @umn.edu, all
    commits from them have been recently re-reviewed to ensure if they were
    correct or not.
    
    Upon review, this commit was found to be not be needed at all as the
    change was useless because this function can only be called when
    of_match_device matched on something.  So it should be reverted.
    
    Cc: Aditya Pakki <pakki001@umn.edu>
    Cc: stable <stable@vger.kernel.org>
    Fixes: 32f47179833b ("serial: mvebu-uart: Fix to avoid a potential NULL pointer dereference")
    Acked-by: Jiri Slaby <jirislaby@kernel.org>
    Link: https://lore.kernel.org/r/20210503115736.2104747-6-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/tty/serial/mvebu-uart.c b/drivers/tty/serial/mvebu-uart.c
index 330522be708f..0515b5e6326d 100644
--- a/drivers/tty/serial/mvebu-uart.c
+++ b/drivers/tty/serial/mvebu-uart.c
@@ -807,9 +807,6 @@ static int mvebu_uart_probe(struct platform_device *pdev)
 		return -EINVAL;
 	}
 
-	if (!match)
-		return -ENODEV;
-
 	/* Assume that all UART ports have a DT alias or none has */
 	id = of_alias_get_id(pdev->dev.of_node, "serial");
 	if (!pdev->dev.of_node || id < 0)

commit 4e2c772c90a1998395581ec1b83b2a9289e557fa
Author: Anirudh Rayabharam <mail@anirudhrb.com>
Date:   Mon May 3 13:57:12 2021 +0200

    rapidio: handle create_workqueue() failure
    
    commit 69ce3ae36dcb03cdf416b0862a45369ddbf50fdf upstream.
    
    In case create_workqueue() fails, release all resources and return -ENOMEM
    to caller to avoid potential NULL pointer deref later. Move up the
    create_workequeue() call to return early and avoid unwinding the call to
    riocm_rx_fill().
    
    Cc: Alexandre Bounine <alex.bou9@gmail.com>
    Cc: Matt Porter <mporter@kernel.crashing.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Anirudh Rayabharam <mail@anirudhrb.com>
    Link: https://lore.kernel.org/r/20210503115736.2104747-46-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/rapidio/rio_cm.c b/drivers/rapidio/rio_cm.c
index cf45829585cb..ab57a1eb519f 100644
--- a/drivers/rapidio/rio_cm.c
+++ b/drivers/rapidio/rio_cm.c
@@ -2136,6 +2136,14 @@ static int riocm_add_mport(struct device *dev,
 		return -ENODEV;
 	}
 
+	cm->rx_wq = create_workqueue(DRV_NAME "/rxq");
+	if (!cm->rx_wq) {
+		rio_release_inb_mbox(mport, cmbox);
+		rio_release_outb_mbox(mport, cmbox);
+		kfree(cm);
+		return -ENOMEM;
+	}
+
 	/*
 	 * Allocate and register inbound messaging buffers to be ready
 	 * to receive channel and system management requests
@@ -2146,7 +2154,6 @@ static int riocm_add_mport(struct device *dev,
 	cm->rx_slots = RIOCM_RX_RING_SIZE;
 	mutex_init(&cm->rx_lock);
 	riocm_rx_fill(cm, RIOCM_RX_RING_SIZE);
-	cm->rx_wq = create_workqueue(DRV_NAME "/rxq");
 	INIT_WORK(&cm->rx_work, rio_ibmsg_handler);
 
 	cm->tx_slot = 0;

commit 15d3547758b369db1690adda381a360a0e821bed
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon May 3 13:57:11 2021 +0200

    Revert "rapidio: fix a NULL pointer dereference when create_workqueue() fails"
    
    commit 5e68b86c7b7c059c0f0ec4bf8adabe63f84a61eb upstream.
    
    This reverts commit 23015b22e47c5409620b1726a677d69e5cd032ba.
    
    Because of recent interactions with developers from @umn.edu, all
    commits from them have been recently re-reviewed to ensure if they were
    correct or not.
    
    Upon review, this commit was found to be incorrect for the reasons
    below, so it must be reverted.  It will be fixed up "correctly" in a
    later kernel change.
    
    The original commit has a memory leak on the error path here, it does
    not clean up everything properly.
    
    Cc: Kangjie Lu <kjlu@umn.edu>
    Cc: Alexandre Bounine <alex.bou9@gmail.com>
    Cc: Matt Porter <mporter@kernel.crashing.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Fixes: 23015b22e47c ("rapidio: fix a NULL pointer dereference when create_workqueue() fails")
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210503115736.2104747-45-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/rapidio/rio_cm.c b/drivers/rapidio/rio_cm.c
index b29fc258eeba..cf45829585cb 100644
--- a/drivers/rapidio/rio_cm.c
+++ b/drivers/rapidio/rio_cm.c
@@ -2147,14 +2147,6 @@ static int riocm_add_mport(struct device *dev,
 	mutex_init(&cm->rx_lock);
 	riocm_rx_fill(cm, RIOCM_RX_RING_SIZE);
 	cm->rx_wq = create_workqueue(DRV_NAME "/rxq");
-	if (!cm->rx_wq) {
-		riocm_error("failed to allocate IBMBOX_%d on %s",
-			    cmbox, mport->name);
-		rio_release_outb_mbox(mport, cmbox);
-		kfree(cm);
-		return -ENOMEM;
-	}
-
 	INIT_WORK(&cm->rx_work, rio_ibmsg_handler);
 
 	cm->tx_slot = 0;

commit 5407ea9f5c9db4695153a3ac14008e4c73ae9f0f
Author: PeiSen Hou <pshou@realtek.com>
Date:   Fri May 14 12:50:48 2021 +0200

    ALSA: hda/realtek: Add some CLOVE SSIDs of ALC293
    
    commit 1d5cfca286178ce81fb0c8a5f5777ef123cd69e4 upstream.
    
    Fix "use as headset mic, without its own jack detect" problen.
    
    Signed-off-by: PeiSen Hou <pshou@realtek.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/d0746eaf29f248a5acc30313e3ba4f99@realtek.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index ff62ecfaff70..f9ebbee3824b 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -7169,12 +7169,19 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x50f2, "Clevo NH50E[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x50f5, "Clevo NH55EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x50f6, "Clevo NH55DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x70f2, "Clevo NH79EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x70f3, "Clevo NH77DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x70f4, "Clevo NH77EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x70f6, "Clevo NH77DPQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
@@ -7192,9 +7199,17 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0x9600, "Clevo N960K[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL53RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0xa600, "Clevo NL5XNU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0xb018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0xb019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0xb022, "Clevo NH77D[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0xc018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0xc019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x1558, 0xc022, "Clevo NH77[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
 	SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
 	SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),

commit 35014b745c1860cfb0774de17b30c452d9f181b2
Author: Hui Wang <hui.wang@canonical.com>
Date:   Fri May 7 10:44:52 2021 +0800

    ALSA: hda/realtek: reset eapd coeff to default value for alc287
    
    commit 8822702f6e4c8917c83ba79e0ebf2c8c218910d4 upstream.
    
    Ubuntu users reported an audio bug on the Lenovo Yoga Slim 7 14IIL05,
    he installed dual OS (Windows + Linux), if he booted to the Linux
    from Windows, the Speaker can't work well, it has crackling noise,
    if he poweroff the machine first after Windows, the Speaker worked
    well.
    
    Before rebooting or shutdown from Windows, the Windows changes the
    codec eapd coeff value, but the BIOS doesn't re-initialize its value,
    when booting into the Linux from Windows, the eapd coeff value is not
    correct. To fix it, set the codec default value to that coeff register
    in the alsa driver.
    
    BugLink: http://bugs.launchpad.net/bugs/1925057
    Suggested-by: Kailang Yang <kailang@realtek.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Hui Wang <hui.wang@canonical.com>
    Link: https://lore.kernel.org/r/20210507024452.8300-1-hui.wang@canonical.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index c4a9141a449c..ff62ecfaff70 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -388,7 +388,6 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)
 	case 0x10ec0282:
 	case 0x10ec0283:
 	case 0x10ec0286:
-	case 0x10ec0287:
 	case 0x10ec0288:
 	case 0x10ec0285:
 	case 0x10ec0298:
@@ -399,6 +398,10 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)
 	case 0x10ec0275:
 		alc_update_coef_idx(codec, 0xe, 0, 1<<0);
 		break;
+	case 0x10ec0287:
+		alc_update_coef_idx(codec, 0x10, 1<<9, 0);
+		alc_write_coef_idx(codec, 0x8, 0x4ab7);
+		break;
 	case 0x10ec0293:
 		alc_update_coef_idx(codec, 0xa, 1<<13, 0);
 		break;

commit 14b3bb3da626129da01f6db48e13b9220b7913ed
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon May 3 13:57:01 2021 +0200

    Revert "ALSA: sb8: add a check for request_region"
    
    commit 94f88309f201821073f57ae6005caefa61bf7b7e upstream.
    
    This reverts commit dcd0feac9bab901d5739de51b3f69840851f8919.
    
    Because of recent interactions with developers from @umn.edu, all
    commits from them have been recently re-reviewed to ensure if they were
    correct or not.
    
    Upon review, this commit was found to be incorrect for the reasons
    below, so it must be reverted.  It will be fixed up "correctly" in a
    later kernel change.
    
    The original commit message for this change was incorrect as the code
    path can never result in a NULL dereference, alluding to the fact that
    whatever tool was used to "find this" is broken.  It's just an optional
    resource reservation, so removing this check is fine.
    
    Cc: Kangjie Lu <kjlu@umn.edu>
    Acked-by: Takashi Iwai <tiwai@suse.de>
    Fixes: dcd0feac9bab ("ALSA: sb8: add a check for request_region")
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210503115736.2104747-35-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/isa/sb/sb8.c b/sound/isa/sb/sb8.c
index 1eb8b61a185b..d77dcba276b5 100644
--- a/sound/isa/sb/sb8.c
+++ b/sound/isa/sb/sb8.c
@@ -111,10 +111,6 @@ static int snd_sb8_probe(struct device *pdev, unsigned int dev)
 
 	/* block the 0x388 port to avoid PnP conflicts */
 	acard->fm_res = request_region(0x388, 4, "SoundBlaster FM");
-	if (!acard->fm_res) {
-		err = -EBUSY;
-		goto _err;
-	}
 
 	if (port[dev] != SNDRV_AUTO_PORT) {
 		if ((err = snd_sbdsp_create(card, port[dev], irq[dev],

commit 0550a986f60d978dd3224e63d0ac6ae5c469aa43
Author: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Date:   Thu May 13 21:56:49 2021 +0900

    ALSA: bebob/oxfw: fix Kconfig entry for Mackie d.2 Pro
    
    commit 0edabdfe89581669609eaac5f6a8d0ae6fe95e7f upstream.
    
    Mackie d.2 has an extension card for IEEE 1394 communication, which uses
    BridgeCo DM1000 ASIC. On the other hand, Mackie d.4 Pro has built-in
    function for IEEE 1394 communication by Oxford Semiconductor OXFW971,
    according to schematic diagram available in Mackie website. Although I
    misunderstood that Mackie d.2 Pro would be also a model with OXFW971,
    it's wrong. Mackie d.2 Pro is a model which includes the extension card
    as factory settings.
    
    This commit fixes entries in Kconfig and comment in ALSA OXFW driver.
    
    Cc: <stable@vger.kernel.org>
    Fixes: fd6f4b0dc167 ("ALSA: bebob: Add skelton for BeBoB based devices")
    Fixes: ec4dba5053e1 ("ALSA: oxfw: Add support for Behringer/Mackie devices")
    Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
    Link: https://lore.kernel.org/r/20210513125652.110249-3-o-takashi@sakamocchi.jp
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/firewire/Kconfig b/sound/firewire/Kconfig
index 0cb65d0864cc..a2ed164d80b4 100644
--- a/sound/firewire/Kconfig
+++ b/sound/firewire/Kconfig
@@ -37,7 +37,7 @@ config SND_OXFW
 	   * Mackie(Loud) Onyx 1640i (former model)
 	   * Mackie(Loud) Onyx Satellite
 	   * Mackie(Loud) Tapco Link.Firewire
-	   * Mackie(Loud) d.2 pro/d.4 pro
+	   * Mackie(Loud) d.4 pro
 	   * Mackie(Loud) U.420/U.420d
 	   * TASCAM FireOne
 	   * Stanton Controllers & Systems 1 Deck/Mixer
@@ -83,7 +83,7 @@ config SND_BEBOB
 	  * PreSonus FIREBOX/FIREPOD/FP10/Inspire1394
 	  * BridgeCo RDAudio1/Audio5
 	  * Mackie Onyx 1220/1620/1640 (FireWire I/O Card)
-	  * Mackie d.2 (FireWire Option)
+	  * Mackie d.2 (FireWire Option) and d.2 Pro
 	  * Stanton FinalScratch 2 (ScratchAmp)
 	  * Tascam IF-FW/DM
 	  * Behringer XENIX UFX 1204/1604
diff --git a/sound/firewire/bebob/bebob.c b/sound/firewire/bebob/bebob.c
index 5636e89ce5c7..2bcfeee75853 100644
--- a/sound/firewire/bebob/bebob.c
+++ b/sound/firewire/bebob/bebob.c
@@ -414,7 +414,7 @@ static const struct ieee1394_device_id bebob_id_table[] = {
 	SND_BEBOB_DEV_ENTRY(VEN_BRIDGECO, 0x00010049, &spec_normal),
 	/* Mackie, Onyx 1220/1620/1640 (Firewire I/O Card) */
 	SND_BEBOB_DEV_ENTRY(VEN_MACKIE2, 0x00010065, &spec_normal),
-	/* Mackie, d.2 (Firewire Option) */
+	// Mackie, d.2 (Firewire option card) and d.2 Pro (the card is built-in).
 	SND_BEBOB_DEV_ENTRY(VEN_MACKIE1, 0x00010067, &spec_normal),
 	/* Stanton, ScratchAmp */
 	SND_BEBOB_DEV_ENTRY(VEN_STANTON, 0x00000001, &spec_normal),
diff --git a/sound/firewire/oxfw/oxfw.c b/sound/firewire/oxfw/oxfw.c
index 4ecaf69569dc..3c9aa797747b 100644
--- a/sound/firewire/oxfw/oxfw.c
+++ b/sound/firewire/oxfw/oxfw.c
@@ -400,7 +400,6 @@ static const struct ieee1394_device_id oxfw_id_table[] = {
 	 *  Onyx-i series (former models):	0x081216
 	 *  Mackie Onyx Satellite:		0x00200f
 	 *  Tapco LINK.firewire 4x6:		0x000460
-	 *  d.2 pro:				Unknown
 	 *  d.4 pro:				Unknown
 	 *  U.420:				Unknown
 	 *  U.420d:				Unknown

commit c841d7adb8797dcf4da35f542e25392845b6a32e
Author: Takashi Iwai <tiwai@suse.de>
Date:   Mon May 10 17:06:59 2021 +0200

    ALSA: usb-audio: Validate MS endpoint descriptors
    
    commit e84749a78dc82bc545f12ce009e3dbcc2c5a8a91 upstream.
    
    snd_usbmidi_get_ms_info() may access beyond the border when a
    malformed descriptor is passed.  This patch adds the sanity checks of
    the given MS endpoint descriptors, and skips invalid ones.
    
    Reported-by: syzbot+6bb23a5d5548b93c94aa@syzkaller.appspotmail.com
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210510150659.17710-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/usb/midi.c b/sound/usb/midi.c
index 4553db0ef084..1ac8c84c3369 100644
--- a/sound/usb/midi.c
+++ b/sound/usb/midi.c
@@ -1890,8 +1890,12 @@ static int snd_usbmidi_get_ms_info(struct snd_usb_midi *umidi,
 		ms_ep = find_usb_ms_endpoint_descriptor(hostep);
 		if (!ms_ep)
 			continue;
+		if (ms_ep->bLength <= sizeof(*ms_ep))
+			continue;
 		if (ms_ep->bNumEmbMIDIJack > 0x10)
 			continue;
+		if (ms_ep->bLength < sizeof(*ms_ep) + ms_ep->bNumEmbMIDIJack)
+			continue;
 		if (usb_endpoint_dir_out(ep)) {
 			if (endpoints[epidx].out_ep) {
 				if (++epidx >= MIDI_MAX_ENDPOINTS) {

commit 52b18cb6841f46912e8e57e849e4c3a2782476c2
Author: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Date:   Thu May 13 21:56:48 2021 +0900

    ALSA: dice: fix stream format at middle sampling rate for Alesis iO 26
    
    commit 1b6604896e78969baffc1b6cc6bc175f95929ac4 upstream.
    
    Alesis iO 26 FireWire has two pairs of digital optical interface. It
    delivers PCM frames from the interfaces by second isochronous packet
    streaming. Although both of the interfaces are available at 44.1/48.0
    kHz, first one of them is only available at 88.2/96.0 kHz. It reduces
    the number of PCM samples to 4 in Multi Bit Linear Audio data channel
    of data blocks on the second isochronous packet streaming.
    
    This commit fixes hardcoded stream formats.
    
    Cc: <stable@vger.kernel.org>
    Fixes: 28b208f600a3 ("ALSA: dice: add parameters of stream formats for models produced by Alesis")
    Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
    Link: https://lore.kernel.org/r/20210513125652.110249-2-o-takashi@sakamocchi.jp
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/firewire/dice/dice-alesis.c b/sound/firewire/dice/dice-alesis.c
index f5b325263b67..39a4ef8c8543 100644
--- a/sound/firewire/dice/dice-alesis.c
+++ b/sound/firewire/dice/dice-alesis.c
@@ -16,7 +16,7 @@ alesis_io14_tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT] = {
 static const unsigned int
 alesis_io26_tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT] = {
 	{10, 10, 4},	/* Tx0 = Analog + S/PDIF. */
-	{16, 8, 0},	/* Tx1 = ADAT1 + ADAT2. */
+	{16, 4, 0},	/* Tx1 = ADAT1 + ADAT2 (available at low rate). */
 };
 
 int snd_dice_detect_alesis_formats(struct snd_dice *dice)

commit fe6ca009bf3343826d90833fbfc6fdccecae28a4
Author: Takashi Iwai <tiwai@suse.de>
Date:   Tue May 18 10:39:39 2021 +0200

    ALSA: line6: Fix racy initialization of LINE6 MIDI
    
    commit 05ca447630334c323c9e2b788b61133ab75d60d3 upstream.
    
    The initialization of MIDI devices that are found on some LINE6
    drivers are currently done in a racy way; namely, the MIDI buffer
    instance is allocated and initialized in each private_init callback
    while the communication with the interface is already started via
    line6_init_cap_control() call before that point.  This may lead to
    Oops in line6_data_received() when a spurious event is received, as
    reported by syzkaller.
    
    This patch moves the MIDI initialization to line6_init_cap_control()
    as well instead of the too-lately-called private_init for avoiding the
    race.  Also this reduces slightly more lines, so it's a win-win
    change.
    
    Reported-by: syzbot+0d2b3feb0a2887862e06@syzkallerlkml..appspotmail.com
    Link: https://lore.kernel.org/r/000000000000a4be9405c28520de@google.com
    Link: https://lore.kernel.org/r/20210517132725.GA50495@hyeyoo
    Cc: Hyeonggon Yoo <42.hyeyoo@gmail.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210518083939.1927-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/usb/line6/driver.c b/sound/usb/line6/driver.c
index 18b436e7a2cc..2163fd6dce66 100644
--- a/sound/usb/line6/driver.c
+++ b/sound/usb/line6/driver.c
@@ -705,6 +705,10 @@ static int line6_init_cap_control(struct usb_line6 *line6)
 		line6->buffer_message = kmalloc(LINE6_MIDI_MESSAGE_MAXLEN, GFP_KERNEL);
 		if (!line6->buffer_message)
 			return -ENOMEM;
+
+		ret = line6_init_midi(line6);
+		if (ret < 0)
+			return ret;
 	} else {
 		ret = line6_hwdep_init(line6);
 		if (ret < 0)
diff --git a/sound/usb/line6/pod.c b/sound/usb/line6/pod.c
index 020c81818951..dff8e7d5f305 100644
--- a/sound/usb/line6/pod.c
+++ b/sound/usb/line6/pod.c
@@ -420,11 +420,6 @@ static int pod_init(struct usb_line6 *line6,
 	if (err < 0)
 		return err;
 
-	/* initialize MIDI subsystem: */
-	err = line6_init_midi(line6);
-	if (err < 0)
-		return err;
-
 	/* initialize PCM subsystem: */
 	err = line6_init_pcm(line6, &pod_pcm_properties);
 	if (err < 0)
diff --git a/sound/usb/line6/variax.c b/sound/usb/line6/variax.c
index e8c852b2ce35..163a08a8244d 100644
--- a/sound/usb/line6/variax.c
+++ b/sound/usb/line6/variax.c
@@ -217,7 +217,6 @@ static int variax_init(struct usb_line6 *line6,
 		       const struct usb_device_id *id)
 {
 	struct usb_line6_variax *variax = (struct usb_line6_variax *) line6;
-	int err;
 
 	line6->process_message = line6_variax_process_message;
 	line6->disconnect = line6_variax_disconnect;
@@ -233,11 +232,6 @@ static int variax_init(struct usb_line6 *line6,
 	if (variax->buffer_activate == NULL)
 		return -ENOMEM;
 
-	/* initialize MIDI subsystem: */
-	err = line6_init_midi(&variax->line6);
-	if (err < 0)
-		return err;
-
 	/* initiate startup procedure: */
 	variax_startup1(variax);
 	return 0;

commit c9e99de7ca83776c883a6fcc8399f05505912691
Author: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Date:   Tue May 18 10:26:12 2021 +0900

    ALSA: dice: fix stream format for TC Electronic Konnekt Live at high sampling transfer frequency
    
    commit 4c6fe8c547e3c9e8c15dabdd23c569ee0df3adb1 upstream.
    
    At high sampling transfer frequency, TC Electronic Konnekt Live
    transfers/receives 6 audio data frames in multi bit linear audio data
    channel of data block in CIP payload. Current hard-coded stream format
    is wrong.
    
    Cc: <stable@vger.kernel.org>
    Fixes: f1f0f330b1d0 ("ALSA: dice: add parameters of stream formats for models produced by TC Electronic")
    Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
    Link: https://lore.kernel.org/r/20210518012612.37268-1-o-takashi@sakamocchi.jp
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/firewire/dice/dice-tcelectronic.c b/sound/firewire/dice/dice-tcelectronic.c
index a8875d24ba2a..43a3bcb15b3d 100644
--- a/sound/firewire/dice/dice-tcelectronic.c
+++ b/sound/firewire/dice/dice-tcelectronic.c
@@ -38,8 +38,8 @@ static const struct dice_tc_spec konnekt_24d = {
 };
 
 static const struct dice_tc_spec konnekt_live = {
-	.tx_pcm_chs = {{16, 16, 16}, {0, 0, 0} },
-	.rx_pcm_chs = {{16, 16, 16}, {0, 0, 0} },
+	.tx_pcm_chs = {{16, 16, 6}, {0, 0, 0} },
+	.rx_pcm_chs = {{16, 16, 6}, {0, 0, 0} },
 	.has_midi = true,
 };
 

commit 4e95d8160aa7eaaa185b8c1d16294d9e79444aeb
Author: Ronnie Sahlberg <lsahlber@redhat.com>
Date:   Wed May 19 08:40:11 2021 +1000

    cifs: fix memory leak in smb2_copychunk_range
    
    commit d201d7631ca170b038e7f8921120d05eec70d7c5 upstream.
    
    When using smb2_copychunk_range() for large ranges we will
    run through several iterations of a loop calling SMB2_ioctl()
    but never actually free the returned buffer except for the final
    iteration.
    This leads to memory leaks everytime a large copychunk is requested.
    
    Fixes: 9bf0c9cd4314 ("CIFS: Fix SMB2/SMB3 Copy offload support (refcopy) for large files")
    Cc: <stable@vger.kernel.org>
    Reviewed-by: Aurelien Aptel <aaptel@suse.com>
    Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
index 9d94abaff8fc..5a14f518cd97 100644
--- a/fs/cifs/smb2ops.c
+++ b/fs/cifs/smb2ops.c
@@ -1174,6 +1174,8 @@ smb2_copychunk_range(const unsigned int xid,
 			cpu_to_le32(min_t(u32, len, tcon->max_bytes_chunk));
 
 		/* Request server copy to target from src identified by key */
+		kfree(retbuf);
+		retbuf = NULL;
 		rc = SMB2_ioctl(xid, tcon, trgtfile->fid.persistent_fid,
 			trgtfile->fid.volatile_fid, FSCTL_SRV_COPYCHUNK_WRITE,
 			true /* is_fsctl */, (char *)pcchunk,

commit b31395e0d19017aaa83ee0e2dc0862954aca3aa3
Author: Zqiang <qiang.zhang@windriver.com>
Date:   Mon May 17 11:40:05 2021 +0800

    locking/mutex: clear MUTEX_FLAGS if wait_list is empty due to signal
    
    [ Upstream commit 3a010c493271f04578b133de977e0e5dd2848cea ]
    
    When a interruptible mutex locker is interrupted by a signal
    without acquiring this lock and removed from the wait queue.
    if the mutex isn't contended enough to have a waiter
    put into the wait queue again, the setting of the WAITER
    bit will force mutex locker to go into the slowpath to
    acquire the lock every time, so if the wait queue is empty,
    the WAITER bit need to be clear.
    
    Fixes: 040a0a371005 ("mutex: Add support for wound/wait style locks")
    Suggested-by: Peter Zijlstra <peterz@infradead.org>
    Signed-off-by: Zqiang <qiang.zhang@windriver.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20210517034005.30828-1-qiang.zhang@windriver.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/locking/mutex-debug.c b/kernel/locking/mutex-debug.c
index 9aa713629387..839df4383799 100644
--- a/kernel/locking/mutex-debug.c
+++ b/kernel/locking/mutex-debug.c
@@ -57,7 +57,7 @@ void debug_mutex_add_waiter(struct mutex *lock, struct mutex_waiter *waiter,
 	task->blocked_on = waiter;
 }
 
-void mutex_remove_waiter(struct mutex *lock, struct mutex_waiter *waiter,
+void debug_mutex_remove_waiter(struct mutex *lock, struct mutex_waiter *waiter,
 			 struct task_struct *task)
 {
 	DEBUG_LOCKS_WARN_ON(list_empty(&waiter->list));
@@ -65,7 +65,7 @@ void mutex_remove_waiter(struct mutex *lock, struct mutex_waiter *waiter,
 	DEBUG_LOCKS_WARN_ON(task->blocked_on != waiter);
 	task->blocked_on = NULL;
 
-	list_del_init(&waiter->list);
+	INIT_LIST_HEAD(&waiter->list);
 	waiter->task = NULL;
 }
 
diff --git a/kernel/locking/mutex-debug.h b/kernel/locking/mutex-debug.h
index 1edd3f45a4ec..53e631e1d76d 100644
--- a/kernel/locking/mutex-debug.h
+++ b/kernel/locking/mutex-debug.h
@@ -22,7 +22,7 @@ extern void debug_mutex_free_waiter(struct mutex_waiter *waiter);
 extern void debug_mutex_add_waiter(struct mutex *lock,
 				   struct mutex_waiter *waiter,
 				   struct task_struct *task);
-extern void mutex_remove_waiter(struct mutex *lock, struct mutex_waiter *waiter,
+extern void debug_mutex_remove_waiter(struct mutex *lock, struct mutex_waiter *waiter,
 				struct task_struct *task);
 extern void debug_mutex_unlock(struct mutex *lock);
 extern void debug_mutex_init(struct mutex *lock, const char *name,
diff --git a/kernel/locking/mutex.c b/kernel/locking/mutex.c
index b3da782cdfbd..354151fef06a 100644
--- a/kernel/locking/mutex.c
+++ b/kernel/locking/mutex.c
@@ -177,7 +177,7 @@ static inline bool __mutex_waiter_is_first(struct mutex *lock, struct mutex_wait
  * Add @waiter to a given location in the lock wait_list and set the
  * FLAG_WAITERS flag if it's the first waiter.
  */
-static void __sched
+static void
 __mutex_add_waiter(struct mutex *lock, struct mutex_waiter *waiter,
 		   struct list_head *list)
 {
@@ -188,6 +188,16 @@ __mutex_add_waiter(struct mutex *lock, struct mutex_waiter *waiter,
 		__mutex_set_flag(lock, MUTEX_FLAG_WAITERS);
 }
 
+static void
+__mutex_remove_waiter(struct mutex *lock, struct mutex_waiter *waiter)
+{
+	list_del(&waiter->list);
+	if (likely(list_empty(&lock->wait_list)))
+		__mutex_clear_flag(lock, MUTEX_FLAGS);
+
+	debug_mutex_remove_waiter(lock, waiter, current);
+}
+
 /*
  * Give up ownership to a specific task, when @task = NULL, this is equivalent
  * to a regular unlock. Sets PICKUP on a handoff, clears HANDOF, preserves
@@ -1040,9 +1050,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,
 			__ww_mutex_check_waiters(lock, ww_ctx);
 	}
 
-	mutex_remove_waiter(lock, &waiter, current);
-	if (likely(list_empty(&lock->wait_list)))
-		__mutex_clear_flag(lock, MUTEX_FLAGS);
+	__mutex_remove_waiter(lock, &waiter);
 
 	debug_mutex_free_waiter(&waiter);
 
@@ -1059,7 +1067,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,
 
 err:
 	__set_current_state(TASK_RUNNING);
-	mutex_remove_waiter(lock, &waiter, current);
+	__mutex_remove_waiter(lock, &waiter);
 err_early_kill:
 	spin_unlock(&lock->wait_lock);
 	debug_mutex_free_waiter(&waiter);
diff --git a/kernel/locking/mutex.h b/kernel/locking/mutex.h
index 1c2287d3fa71..f0c710b1d192 100644
--- a/kernel/locking/mutex.h
+++ b/kernel/locking/mutex.h
@@ -10,12 +10,10 @@
  * !CONFIG_DEBUG_MUTEXES case. Most of them are NOPs:
  */
 
-#define mutex_remove_waiter(lock, waiter, task) \
-		__list_del((waiter)->list.prev, (waiter)->list.next)
-
 #define debug_mutex_wake_waiter(lock, waiter)		do { } while (0)
 #define debug_mutex_free_waiter(waiter)			do { } while (0)
 #define debug_mutex_add_waiter(lock, waiter, ti)	do { } while (0)
+#define debug_mutex_remove_waiter(lock, waiter, ti)     do { } while (0)
 #define debug_mutex_unlock(lock)			do { } while (0)
 #define debug_mutex_init(lock, name, key)		do { } while (0)
 

commit 6671cd54fd21fe8c31fa5c4b28d3c7e96945cd35
Author: Daniel Wagner <dwagner@suse.de>
Date:   Wed May 12 16:50:05 2021 +0200

    nvmet: seset ns->file when open fails
    
    [ Upstream commit 85428beac80dbcace5b146b218697c73e367dcf5 ]
    
    Reset the ns->file value to NULL also in the error case in
    nvmet_file_ns_enable().
    
    The ns->file variable points either to file object or contains the
    error code after the filp_open() call. This can lead to following
    problem:
    
    When the user first setups an invalid file backend and tries to enable
    the ns, it will fail. Then the user switches over to a bdev backend
    and enables successfully the ns. The first received I/O will crash the
    system because the IO backend is chosen based on the ns->file value:
    
    static u16 nvmet_parse_io_cmd(struct nvmet_req *req)
    {
            [...]
    
            if (req->ns->file)
                    return nvmet_file_parse_io_cmd(req);
    
            return nvmet_bdev_parse_io_cmd(req);
    }
    
    Reported-by: Enzo Matsumiya <ematsumiya@suse.com>
    Signed-off-by: Daniel Wagner <dwagner@suse.de>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/nvme/target/io-cmd-file.c b/drivers/nvme/target/io-cmd-file.c
index 39d972e2595f..ad6263cf7303 100644
--- a/drivers/nvme/target/io-cmd-file.c
+++ b/drivers/nvme/target/io-cmd-file.c
@@ -38,9 +38,11 @@ int nvmet_file_ns_enable(struct nvmet_ns *ns)
 
 	ns->file = filp_open(ns->device_path, flags, 0);
 	if (IS_ERR(ns->file)) {
-		pr_err("failed to open file %s: (%ld)\n",
-				ns->device_path, PTR_ERR(ns->file));
-		return PTR_ERR(ns->file);
+		ret = PTR_ERR(ns->file);
+		pr_err("failed to open file %s: (%d)\n",
+			ns->device_path, ret);
+		ns->file = NULL;
+		return ret;
 	}
 
 	ret = vfs_getattr(&ns->file->f_path,

commit 365e5534cf89cff7def13f94b18f26ae4670e0cd
Author: Oleg Nesterov <oleg@redhat.com>
Date:   Wed May 12 15:33:08 2021 +0200

    ptrace: make ptrace() fail if the tracee changed its pid unexpectedly
    
    [ Upstream commit dbb5afad100a828c97e012c6106566d99f041db6 ]
    
    Suppose we have 2 threads, the group-leader L and a sub-theread T,
    both parked in ptrace_stop(). Debugger tries to resume both threads
    and does
    
            ptrace(PTRACE_CONT, T);
            ptrace(PTRACE_CONT, L);
    
    If the sub-thread T execs in between, the 2nd PTRACE_CONT doesn not
    resume the old leader L, it resumes the post-exec thread T which was
    actually now stopped in PTHREAD_EVENT_EXEC. In this case the
    PTHREAD_EVENT_EXEC event is lost, and the tracer can't know that the
    tracee changed its pid.
    
    This patch makes ptrace() fail in this case until debugger does wait()
    and consumes PTHREAD_EVENT_EXEC which reports old_pid. This affects all
    ptrace requests except the "asynchronous" PTRACE_INTERRUPT/KILL.
    
    The patch doesn't add the new PTRACE_ option to not complicate the API,
    and I _hope_ this won't cause any noticeable regression:
    
            - If debugger uses PTRACE_O_TRACEEXEC and the thread did an exec
              and the tracer does a ptrace request without having consumed
              the exec event, it's 100% sure that the thread the ptracer
              thinks it is targeting does not exist anymore, or isn't the
              same as the one it thinks it is targeting.
    
            - To some degree this patch adds nothing new. In the scenario
              above ptrace(L) can fail with -ESRCH if it is called after the
              execing sub-thread wakes the leader up and before it "steals"
              the leader's pid.
    
    Test-case:
    
            #include <stdio.h>
            #include <unistd.h>
            #include <signal.h>
            #include <sys/ptrace.h>
            #include <sys/wait.h>
            #include <errno.h>
            #include <pthread.h>
            #include <assert.h>
    
            void *tf(void *arg)
            {
                    execve("/usr/bin/true", NULL, NULL);
                    assert(0);
    
                    return NULL;
            }
    
            int main(void)
            {
                    int leader = fork();
                    if (!leader) {
                            kill(getpid(), SIGSTOP);
    
                            pthread_t th;
                            pthread_create(&th, NULL, tf, NULL);
                            for (;;)
                                    pause();
    
                            return 0;
                    }
    
                    waitpid(leader, NULL, WSTOPPED);
    
                    ptrace(PTRACE_SEIZE, leader, 0,
                                    PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXEC);
                    waitpid(leader, NULL, 0);
    
                    ptrace(PTRACE_CONT, leader, 0,0);
                    waitpid(leader, NULL, 0);
    
                    int status, thread = waitpid(-1, &status, 0);
                    assert(thread > 0 && thread != leader);
                    assert(status == 0x80137f);
    
                    ptrace(PTRACE_CONT, thread, 0,0);
                    /*
                     * waitid() because waitpid(leader, &status, WNOWAIT) does not
                     * report status. Why ????
                     *
                     * Why WEXITED? because we have another kernel problem connected
                     * to mt-exec.
                     */
                    siginfo_t info;
                    assert(waitid(P_PID, leader, &info, WSTOPPED|WEXITED|WNOWAIT) == 0);
                    assert(info.si_pid == leader && info.si_status == 0x0405);
    
                    /* OK, it sleeps in ptrace(PTRACE_EVENT_EXEC == 0x04) */
                    assert(ptrace(PTRACE_CONT, leader, 0,0) == -1);
                    assert(errno == ESRCH);
    
                    assert(leader == waitpid(leader, &status, WNOHANG));
                    assert(status == 0x04057f);
    
                    assert(ptrace(PTRACE_CONT, leader, 0,0) == 0);
    
                    return 0;
            }
    
    Signed-off-by: Oleg Nesterov <oleg@redhat.com>
    Reported-by: Simon Marchi <simon.marchi@efficios.com>
    Acked-by: "Eric W. Biederman" <ebiederm@xmission.com>
    Acked-by: Pedro Alves <palves@redhat.com>
    Acked-by: Simon Marchi <simon.marchi@efficios.com>
    Acked-by: Jan Kratochvil <jan.kratochvil@redhat.com>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/ptrace.c b/kernel/ptrace.c
index ecdb7402072f..af74e843221b 100644
--- a/kernel/ptrace.c
+++ b/kernel/ptrace.c
@@ -163,6 +163,21 @@ void __ptrace_unlink(struct task_struct *child)
 	spin_unlock(&child->sighand->siglock);
 }
 
+static bool looks_like_a_spurious_pid(struct task_struct *task)
+{
+	if (task->exit_code != ((PTRACE_EVENT_EXEC << 8) | SIGTRAP))
+		return false;
+
+	if (task_pid_vnr(task) == task->ptrace_message)
+		return false;
+	/*
+	 * The tracee changed its pid but the PTRACE_EVENT_EXEC event
+	 * was not wait()'ed, most probably debugger targets the old
+	 * leader which was destroyed in de_thread().
+	 */
+	return true;
+}
+
 /* Ensure that nothing can wake it up, even SIGKILL */
 static bool ptrace_freeze_traced(struct task_struct *task)
 {
@@ -173,7 +188,8 @@ static bool ptrace_freeze_traced(struct task_struct *task)
 		return ret;
 
 	spin_lock_irq(&task->sighand->siglock);
-	if (task_is_traced(task) && !__fatal_signal_pending(task)) {
+	if (task_is_traced(task) && !looks_like_a_spurious_pid(task) &&
+	    !__fatal_signal_pending(task)) {
 		task->state = __TASK_TRACED;
 		ret = true;
 	}

commit 75cfc833da4a2111106d4c134e93e0c7f41e35e7
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Tue May 18 14:50:27 2021 +0200

    platform/x86: dell-smbios-wmi: Fix oops on rmmod dell_smbios
    
    [ Upstream commit 3a53587423d25c87af4b4126a806a0575104b45e ]
    
    init_dell_smbios_wmi() only registers the dell_smbios_wmi_driver on systems
    where the Dell WMI interface is supported. While exit_dell_smbios_wmi()
    unregisters it unconditionally, this leads to the following oops:
    
    [  175.722921] ------------[ cut here ]------------
    [  175.722925] Unexpected driver unregister!
    [  175.722939] WARNING: CPU: 1 PID: 3630 at drivers/base/driver.c:194 driver_unregister+0x38/0x40
    ...
    [  175.723089] Call Trace:
    [  175.723094]  cleanup_module+0x5/0xedd [dell_smbios]
    ...
    [  175.723148] ---[ end trace 064c34e1ad49509d ]---
    
    Make the unregister happen on the same condition the register happens
    to fix this.
    
    Cc: Mario Limonciello <mario.limonciello@outlook.com>
    Fixes: 1a258e670434 ("platform/x86: dell-smbios-wmi: Add new WMI dispatcher driver")
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Reviewed-by: Mario Limonciello <mario.limonciello@outlook.com>
    Reviewed-by: Mark Gross <mgross@linux.intel.com>
    Link: https://lore.kernel.org/r/20210518125027.21824-1-hdegoede@redhat.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/platform/x86/dell-smbios-wmi.c b/drivers/platform/x86/dell-smbios-wmi.c
index cf2229ece9ff..ccccce9b67ef 100644
--- a/drivers/platform/x86/dell-smbios-wmi.c
+++ b/drivers/platform/x86/dell-smbios-wmi.c
@@ -274,7 +274,8 @@ int init_dell_smbios_wmi(void)
 
 void exit_dell_smbios_wmi(void)
 {
-	wmi_driver_unregister(&dell_smbios_wmi_driver);
+	if (wmi_supported)
+		wmi_driver_unregister(&dell_smbios_wmi_driver);
 }
 
 MODULE_ALIAS("wmi:" DELL_WMI_SMBIOS_GUID);

commit f64444a21320b5b45b88877ee0fffdbd9d44957a
Author: Maor Gottlieb <maorg@nvidia.com>
Date:   Tue May 11 08:48:29 2021 +0300

    RDMA/mlx5: Recover from fatal event in dual port mode
    
    [ Upstream commit 97f30d324ce6645a4de4ffb71e4ae9b8ca36ff04 ]
    
    When there is fatal event on the slave port, the device is marked as not
    active. We need to mark it as active again when the slave is recovered to
    regain full functionality.
    
    Fixes: d69a24e03659 ("IB/mlx5: Move IB event processing onto a workqueue")
    Link: https://lore.kernel.org/r/8906754455bb23019ef223c725d2c0d38acfb80b.1620711734.git.leonro@nvidia.com
    Signed-off-by: Maor Gottlieb <maorg@nvidia.com>
    Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index 1695605eeb52..13513466df01 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -6339,6 +6339,7 @@ static void *mlx5_ib_add_slave_port(struct mlx5_core_dev *mdev)
 
 		if (bound) {
 			rdma_roce_rescan_device(&dev->ib_dev);
+			mpi->ibdev->ib_active = true;
 			break;
 		}
 	}

commit bff40e0b05cb4c2c0d716170e0ba1ca71ce85aac
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Fri May 14 17:09:52 2021 +0800

    scsi: qla2xxx: Fix error return code in qla82xx_write_flash_dword()
    
    [ Upstream commit 5cb289bf2d7c34ca1abd794ce116c4f19185a1d4 ]
    
    Fix to return a negative error code from the error handling case instead of
    0 as done elsewhere in this function.
    
    Link: https://lore.kernel.org/r/20210514090952.6715-1-thunder.leizhen@huawei.com
    Fixes: a9083016a531 ("[SCSI] qla2xxx: Add ISP82XX support.")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/qla2xxx/qla_nx.c b/drivers/scsi/qla2xxx/qla_nx.c
index 3007eecfa509..7451355f20e0 100644
--- a/drivers/scsi/qla2xxx/qla_nx.c
+++ b/drivers/scsi/qla2xxx/qla_nx.c
@@ -1107,7 +1107,8 @@ qla82xx_write_flash_dword(struct qla_hw_data *ha, uint32_t flashaddr,
 		return ret;
 	}
 
-	if (qla82xx_flash_set_write_enable(ha))
+	ret = qla82xx_flash_set_write_enable(ha);
+	if (ret < 0)
 		goto done_write;
 
 	qla82xx_wr_32(ha, QLA82XX_ROMUSB_ROM_WDATA, data);

commit f3783c415bf6d2ead3d7aa2c38802bbe10723646
Author: Leon Romanovsky <leonro@nvidia.com>
Date:   Tue May 11 10:26:03 2021 +0300

    RDMA/rxe: Clear all QP fields if creation failed
    
    [ Upstream commit 67f29896fdc83298eed5a6576ff8f9873f709228 ]
    
    rxe_qp_do_cleanup() relies on valid pointer values in QP for the properly
    created ones, but in case rxe_qp_from_init() failed it was filled with
    garbage and caused tot the following error.
    
      refcount_t: underflow; use-after-free.
      WARNING: CPU: 1 PID: 12560 at lib/refcount.c:28 refcount_warn_saturate+0x1d1/0x1e0 lib/refcount.c:28
      Modules linked in:
      CPU: 1 PID: 12560 Comm: syz-executor.4 Not tainted 5.12.0-syzkaller #0
      Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
      RIP: 0010:refcount_warn_saturate+0x1d1/0x1e0 lib/refcount.c:28
      Code: e9 db fe ff ff 48 89 df e8 2c c2 ea fd e9 8a fe ff ff e8 72 6a a7 fd 48 c7 c7 e0 b2 c1 89 c6 05 dc 3a e6 09 01 e8 ee 74 fb 04 <0f> 0b e9 af fe ff ff 0f 1f 84 00 00 00 00 00 41 56 41 55 41 54 55
      RSP: 0018:ffffc900097ceba8 EFLAGS: 00010286
      RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
      RDX: 0000000000040000 RSI: ffffffff815bb075 RDI: fffff520012f9d67
      RBP: 0000000000000003 R08: 0000000000000000 R09: 0000000000000000
      R10: ffffffff815b4eae R11: 0000000000000000 R12: ffff8880322a4800
      R13: ffff8880322a4940 R14: ffff888033044e00 R15: 0000000000000000
      FS:  00007f6eb2be3700(0000) GS:ffff8880b9d00000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 00007fdbe5d41000 CR3: 000000001d181000 CR4: 00000000001506e0
      DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      Call Trace:
       __refcount_sub_and_test include/linux/refcount.h:283 [inline]
       __refcount_dec_and_test include/linux/refcount.h:315 [inline]
       refcount_dec_and_test include/linux/refcount.h:333 [inline]
       kref_put include/linux/kref.h:64 [inline]
       rxe_qp_do_cleanup+0x96f/0xaf0 drivers/infiniband/sw/rxe/rxe_qp.c:805
       execute_in_process_context+0x37/0x150 kernel/workqueue.c:3327
       rxe_elem_release+0x9f/0x180 drivers/infiniband/sw/rxe/rxe_pool.c:391
       kref_put include/linux/kref.h:65 [inline]
       rxe_create_qp+0x2cd/0x310 drivers/infiniband/sw/rxe/rxe_verbs.c:425
       _ib_create_qp drivers/infiniband/core/core_priv.h:331 [inline]
       ib_create_named_qp+0x2ad/0x1370 drivers/infiniband/core/verbs.c:1231
       ib_create_qp include/rdma/ib_verbs.h:3644 [inline]
       create_mad_qp+0x177/0x2d0 drivers/infiniband/core/mad.c:2920
       ib_mad_port_open drivers/infiniband/core/mad.c:3001 [inline]
       ib_mad_init_device+0xd6f/0x1400 drivers/infiniband/core/mad.c:3092
       add_client_context+0x405/0x5e0 drivers/infiniband/core/device.c:717
       enable_device_and_get+0x1cd/0x3b0 drivers/infiniband/core/device.c:1331
       ib_register_device drivers/infiniband/core/device.c:1413 [inline]
       ib_register_device+0x7c7/0xa50 drivers/infiniband/core/device.c:1365
       rxe_register_device+0x3d5/0x4a0 drivers/infiniband/sw/rxe/rxe_verbs.c:1147
       rxe_add+0x12fe/0x16d0 drivers/infiniband/sw/rxe/rxe.c:247
       rxe_net_add+0x8c/0xe0 drivers/infiniband/sw/rxe/rxe_net.c:503
       rxe_newlink drivers/infiniband/sw/rxe/rxe.c:269 [inline]
       rxe_newlink+0xb7/0xe0 drivers/infiniband/sw/rxe/rxe.c:250
       nldev_newlink+0x30e/0x550 drivers/infiniband/core/nldev.c:1555
       rdma_nl_rcv_msg+0x36d/0x690 drivers/infiniband/core/netlink.c:195
       rdma_nl_rcv_skb drivers/infiniband/core/netlink.c:239 [inline]
       rdma_nl_rcv+0x2ee/0x430 drivers/infiniband/core/netlink.c:259
       netlink_unicast_kernel net/netlink/af_netlink.c:1312 [inline]
       netlink_unicast+0x533/0x7d0 net/netlink/af_netlink.c:1338
       netlink_sendmsg+0x856/0xd90 net/netlink/af_netlink.c:1927
       sock_sendmsg_nosec net/socket.c:654 [inline]
       sock_sendmsg+0xcf/0x120 net/socket.c:674
       ____sys_sendmsg+0x6e8/0x810 net/socket.c:2350
       ___sys_sendmsg+0xf3/0x170 net/socket.c:2404
       __sys_sendmsg+0xe5/0x1b0 net/socket.c:2433
       do_syscall_64+0x3a/0xb0 arch/x86/entry/common.c:47
       entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Fixes: 8700e3e7c485 ("Soft RoCE driver")
    Link: https://lore.kernel.org/r/7bf8d548764d406dbbbaf4b574960ebfd5af8387.1620717918.git.leonro@nvidia.com
    Reported-by: syzbot+36a7f280de4e11c6f04e@syzkaller.appspotmail.com
    Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
    Reviewed-by: Zhu Yanjun <zyjzyj2000@gmail.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c b/drivers/infiniband/sw/rxe/rxe_qp.c
index 8a22ab8b29e9..41c9ede98c26 100644
--- a/drivers/infiniband/sw/rxe/rxe_qp.c
+++ b/drivers/infiniband/sw/rxe/rxe_qp.c
@@ -250,6 +250,7 @@ static int rxe_qp_init_req(struct rxe_dev *rxe, struct rxe_qp *qp,
 	if (err) {
 		vfree(qp->sq.queue->buf);
 		kfree(qp->sq.queue);
+		qp->sq.queue = NULL;
 		return err;
 	}
 
@@ -303,6 +304,7 @@ static int rxe_qp_init_resp(struct rxe_dev *rxe, struct rxe_qp *qp,
 		if (err) {
 			vfree(qp->rq.queue->buf);
 			kfree(qp->rq.queue);
+			qp->rq.queue = NULL;
 			return err;
 		}
 	}
@@ -363,6 +365,11 @@ int rxe_qp_from_init(struct rxe_dev *rxe, struct rxe_qp *qp, struct rxe_pd *pd,
 err2:
 	rxe_queue_cleanup(qp->sq.queue);
 err1:
+	qp->pd = NULL;
+	qp->rcq = NULL;
+	qp->scq = NULL;
+	qp->srq = NULL;
+
 	if (srq)
 		rxe_drop_ref(srq);
 	rxe_drop_ref(scq);

commit 2f25cf42907a420af6045b6f3750c802a6a62cc6
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Fri Apr 23 17:09:28 2021 +0200

    openrisc: Fix a memory leak
    
    [ Upstream commit c019d92457826bb7b2091c86f36adb5de08405f9 ]
    
    'setup_find_cpu_node()' take a reference on the node it returns.
    This reference must be decremented when not needed anymore, or there will
    be a leak.
    
    Add the missing 'of_node_put(cpu)'.
    
    Note that 'setup_cpuinfo()' that also calls this function already has a
    correct 'of_node_put(cpu)' at its end.
    
    Fixes: 9d02a4283e9c ("OpenRISC: Boot code")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Signed-off-by: Stafford Horne <shorne@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/openrisc/kernel/setup.c b/arch/openrisc/kernel/setup.c
index 9d28ab14d139..f3a7375ac3cd 100644
--- a/arch/openrisc/kernel/setup.c
+++ b/arch/openrisc/kernel/setup.c
@@ -281,6 +281,8 @@ void calibrate_delay(void)
 	pr_cont("%lu.%02lu BogoMIPS (lpj=%lu)\n",
 		loops_per_jiffy / (500000 / HZ),
 		(loops_per_jiffy / (5000 / HZ)) % 100, loops_per_jiffy);
+
+	of_node_put(cpu);
 }
 
 void __init setup_arch(char **cmdline_p)

commit dcbce0b6f38476b380a0dec28e237d9398ca2bfe
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Thu Apr 22 12:02:29 2021 +0300

    firmware: arm_scpi: Prevent the ternary sign expansion bug
    
    [ Upstream commit d9cd78edb2e6b7e26747c0ec312be31e7ef196fe ]
    
    How the type promotion works in ternary expressions is a bit tricky.
    The problem is that scpi_clk_get_val() returns longs, "ret" is a int
    which holds a negative error code, and le32_to_cpu() is an unsigned int.
    We want the negative error code to be cast to a negative long.  But
    because le32_to_cpu() is an u32 then "ret" is type promoted to u32 and
    becomes a high positive and then it is promoted to long and it is still
    a high positive value.
    
    Fix this by getting rid of the ternary.
    
    Link: https://lore.kernel.org/r/YIE7pdqV/h10tEAK@mwanda
    Fixes: 8cb7cf56c9fe ("firmware: add support for ARM System Control and Power Interface(SCPI) protocol")
    Reviewed-by: Cristian Marussi <cristian.marussi@arm.com>
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    [sudeep.holla: changed to return 0 as clock rate on error]
    Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/firmware/arm_scpi.c b/drivers/firmware/arm_scpi.c
index c7d06a36b23a..baa7280eccb3 100644
--- a/drivers/firmware/arm_scpi.c
+++ b/drivers/firmware/arm_scpi.c
@@ -563,8 +563,10 @@ static unsigned long scpi_clk_get_val(u16 clk_id)
 
 	ret = scpi_send_message(CMD_GET_CLOCK_VALUE, &le_clk_id,
 				sizeof(le_clk_id), &rate, sizeof(rate));
+	if (ret)
+		return 0;
 
-	return ret ? ret : le32_to_cpu(rate);
+	return le32_to_cpu(rate);
 }
 
 static int scpi_clk_set_val(u16 clk_id, unsigned long rate)

commit e774833d4f1e457588003e3a3247719c852606a0
Author: Huang zhibao <hzb@rock-chips.com>
Date:   Thu May 20 11:21:25 2021 +0800

    ARM: dts: rv1126-ai-cam.dtsi: set not used io group domain to 3.3v
    
    Signed-off-by: Huang zhibao <hzb@rock-chips.com>
    Change-Id: I95e89bb9d9951d5d96f6f3feaa6d9579184d62a0

diff --git a/arch/arm/boot/dts/rv1126-ai-cam.dtsi b/arch/arm/boot/dts/rv1126-ai-cam.dtsi
index a395107b8e00..58c787731447 100644
--- a/arch/arm/boot/dts/rv1126-ai-cam.dtsi
+++ b/arch/arm/boot/dts/rv1126-ai-cam.dtsi
@@ -267,10 +267,10 @@
 	pmuio0-supply = <&vcc_3v3>;
 	pmuio1-supply = <&vcc_3v3>;
 	vccio2-supply = <&vcc_3v3>;
-	vccio3-supply = <&vcc_1v8>;
+	vccio3-supply = <&vcc_3v3>;
 	vccio4-supply = <&vcc_1v8>;
 	vccio5-supply = <&vcc_3v3>;
-	vccio6-supply = <&vcc_1v8>;
+	vccio6-supply = <&vcc_3v3>;
 	vccio7-supply = <&vcc_1v8>;
 };
 

commit 8b3bd9721ed970a74d4d3533c30c5aa41087b128
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Tue May 25 11:20:38 2021 +0800

    ARM: rv1126_defconfig: Replace CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU by CONFIG_SQUASHFS_DECOMP_MULTI
    
    The squashfs multi CPU decompressor makes use of get_cpu_ptr() to
    acquire a pointer to per-CPU data. get_cpu_ptr() implicitly disables
    preemption which serializes the access to the per-CPU data.
    
    But decompression can take quite some time depending on the size. The
    observed preempt disabled times in real world scenarios went up to 32ms,
    causing massive wakeup latencies. This happens on all CPUs as the
    decompression is fully parallelized.
    
    So replace CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU by CONFIG_SQUASHFS_DECOMP_MULTI.
    
    Change-Id: I3fb74bca595ee2345f2f7c276eaf8cc68bcd249b
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>

diff --git a/arch/arm/configs/rv1126_defconfig b/arch/arm/configs/rv1126_defconfig
index 9c2657d2191e..176351715cc6 100644
--- a/arch/arm/configs/rv1126_defconfig
+++ b/arch/arm/configs/rv1126_defconfig
@@ -338,7 +338,7 @@ CONFIG_UBIFS_FS=y
 CONFIG_UBIFS_FS_ADVANCED_COMPR=y
 # CONFIG_UBIFS_FS_ZLIB is not set
 CONFIG_SQUASHFS=y
-CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y
+CONFIG_SQUASHFS_DECOMP_MULTI=y
 # CONFIG_SQUASHFS_ZLIB is not set
 CONFIG_SQUASHFS_LZ4=y
 CONFIG_SQUASHFS_4K_DEVBLK_SIZE=y

commit 8f4114af5317d9ac593e54cda846e8d8788f7d68
Author: Wang Panzhenzhuan <randy.wang@rock-chips.com>
Date:   Tue May 18 21:06:36 2021 +0800

    media: i2c: gc2385 match vts and 30fps strictly for cts
    
    fix cts  CaptureRequestTest#testEdgeModeControl[1] &
    CaptureRequestTest#testNoiseReductionModeControl[1]  failed
    failed log:
    Frame duration must be in the range of [33333333, 66666666],
    value 32813000 is out of range [32833332, 67666664])
    
    Signed-off-by: Wang Panzhenzhuan <randy.wang@rock-chips.com>
    Change-Id: Icdc6a89f33d6d0fd8332c51033afe6303e246ce3

diff --git a/drivers/media/i2c/gc2385.c b/drivers/media/i2c/gc2385.c
index 5a26a793f35f..ca6579b1b430 100644
--- a/drivers/media/i2c/gc2385.c
+++ b/drivers/media/i2c/gc2385.c
@@ -9,6 +9,7 @@
  * V0.0X01.0X03 add enum_frame_interval function.
  * V0.0X01.0X04 add quick stream on/off
  * V0.0X01.0X05 add function g_mbus_config
+ * V0.0X01.0X06 set max framerate to strictly 30FPS for cts
  */
 
 #include <linux/clk.h>
@@ -235,11 +236,11 @@ static const struct gc2385_mode supported_modes[] = {
 		.height = 1200,
 		.max_fps = {
 			.numerator = 10000,
-			.denominator = 304472,
+			.denominator = 300000,
 		},
 		.exp_def = 0x0480,
 		.hts_def = 0x10DC,
-		.vts_def = 0x04E0,
+		.vts_def = 0x04F0,
 		.reg_list = gc2385_1600x1200_regs,
 	},
 };

commit 181068321ec278876cd188e6d7004fd5d2e192a7
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Wed May 26 10:30:12 2021 +0800

    arm64: dts: rockchip: rk3568: isp iommu v2
    
    Fixes: 28f15a48873b ("arm64: dts: rockchip: rk3568: add isp node")
    Change-Id: I1959b21216e539ad4dc482262496c99ccbc3db30
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index ebf052798e87..80a0b45e00eb 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -1544,7 +1544,7 @@
 	};
 
 	rkisp_mmu: iommu@fdff1a00 {
-		compatible = "rockchip,iommu";
+		compatible = "rockchip,iommu-v2";
 		reg = <0x0 0xfdff1a00 0x0 0x100>;
 		interrupts = <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH>;
 		interrupt-names = "isp_mmu";

commit 8fc61e3ff6b5ca6c1e33116675d9397af0a9dea3
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Wed May 26 09:23:41 2021 +0800

    ASoC: rockchip: i2s: Add support for frame inversion
    
    Change-Id: Ic77122501224cec45200ae64416745a82fb67d76
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c
index 2552bd5648d3..b8592c7631f2 100644
--- a/sound/soc/rockchip/rockchip_i2s.c
+++ b/sound/soc/rockchip/rockchip_i2s.c
@@ -251,13 +251,27 @@ static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
 
 	regmap_update_bits(i2s->regmap, I2S_CKR, mask, val);
 
-	mask = I2S_CKR_CKP_MASK;
+	mask = I2S_CKR_CKP_MASK | I2S_CKR_TLP_MASK | I2S_CKR_RLP_MASK;
 	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
 	case SND_SOC_DAIFMT_NB_NF:
-		val = I2S_CKR_CKP_NEG;
+		val = I2S_CKR_CKP_NORMAL |
+		      I2S_CKR_TLP_NORMAL |
+		      I2S_CKR_RLP_NORMAL;
+		break;
+	case SND_SOC_DAIFMT_NB_IF:
+		val = I2S_CKR_CKP_NORMAL |
+		      I2S_CKR_TLP_INVERTED |
+		      I2S_CKR_RLP_INVERTED;
 		break;
 	case SND_SOC_DAIFMT_IB_NF:
-		val = I2S_CKR_CKP_POS;
+		val = I2S_CKR_CKP_INVERTED |
+		      I2S_CKR_TLP_NORMAL |
+		      I2S_CKR_RLP_NORMAL;
+		break;
+	case SND_SOC_DAIFMT_IB_IF:
+		val = I2S_CKR_CKP_INVERTED |
+		      I2S_CKR_TLP_INVERTED |
+		      I2S_CKR_RLP_INVERTED;
 		break;
 	default:
 		ret = -EINVAL;
diff --git a/sound/soc/rockchip/rockchip_i2s.h b/sound/soc/rockchip/rockchip_i2s.h
index a7b8527d8a73..b3ab9dee3d48 100644
--- a/sound/soc/rockchip/rockchip_i2s.h
+++ b/sound/soc/rockchip/rockchip_i2s.h
@@ -91,15 +91,17 @@
 #define I2S_CKR_MSS_SLAVE	(1 << I2S_CKR_MSS_SHIFT)
 #define I2S_CKR_MSS_MASK	(1 << I2S_CKR_MSS_SHIFT)
 #define I2S_CKR_CKP_SHIFT	26
-#define I2S_CKR_CKP_NEG		(0 << I2S_CKR_CKP_SHIFT)
-#define I2S_CKR_CKP_POS		(1 << I2S_CKR_CKP_SHIFT)
+#define I2S_CKR_CKP_NORMAL	(0 << I2S_CKR_CKP_SHIFT)
+#define I2S_CKR_CKP_INVERTED	(1 << I2S_CKR_CKP_SHIFT)
 #define I2S_CKR_CKP_MASK	(1 << I2S_CKR_CKP_SHIFT)
 #define I2S_CKR_RLP_SHIFT	25
 #define I2S_CKR_RLP_NORMAL	(0 << I2S_CKR_RLP_SHIFT)
-#define I2S_CKR_RLP_OPPSITE	(1 << I2S_CKR_RLP_SHIFT)
+#define I2S_CKR_RLP_INVERTED	(1 << I2S_CKR_RLP_SHIFT)
+#define I2S_CKR_RLP_MASK	(1 << I2S_CKR_RLP_SHIFT)
 #define I2S_CKR_TLP_SHIFT	24
 #define I2S_CKR_TLP_NORMAL	(0 << I2S_CKR_TLP_SHIFT)
-#define I2S_CKR_TLP_OPPSITE	(1 << I2S_CKR_TLP_SHIFT)
+#define I2S_CKR_TLP_INVERTED	(1 << I2S_CKR_TLP_SHIFT)
+#define I2S_CKR_TLP_MASK	(1 << I2S_CKR_TLP_SHIFT)
 #define I2S_CKR_MDIV_SHIFT	16
 #define I2S_CKR_MDIV(x)		((x - 1) << I2S_CKR_MDIV_SHIFT)
 #define I2S_CKR_MDIV_MASK	(0xff << I2S_CKR_MDIV_SHIFT)

commit e3390a9335517bef5fe024335111e8bc1e55a218
Author: Wang Panzhenzhuan <randy.wang@rock-chips.com>
Date:   Mon May 17 15:42:02 2021 +0800

    media: platform: rockchip: cif: fix rk356x iommu issue
    
    when open video0/1/2/3 first, then close it;
    if reopen video0, the output data is green;
    if not enable iommu, it's ok; fix it;
    
    Signed-off-by: Wang Panzhenzhuan <randy.wang@rock-chips.com>
    Change-Id: Ib977c34f005548bbc21cc93ca39c10d871235ad9

diff --git a/drivers/media/platform/rockchip/cif/hw.c b/drivers/media/platform/rockchip/cif/hw.c
index 33077ef22932..54a943dd98ad 100644
--- a/drivers/media/platform/rockchip/cif/hw.c
+++ b/drivers/media/platform/rockchip/cif/hw.c
@@ -764,17 +764,17 @@ int rkcif_enable_sys_clk(struct rkcif_hw *cif_hw)
 
 static void rkcif_iommu_cleanup(struct rkcif_hw *cif_hw)
 {
-	struct iommu_domain *domain;
+	if (cif_hw->domain)
+		cif_hw->domain->ops->detach_dev(cif_hw->domain, cif_hw->dev);
+}
 
-	dev_err(cif_hw->dev, "%s enter\n", __func__);
+static void rkcif_iommu_enable(struct rkcif_hw *cif_hw)
+{
+	if (!cif_hw->domain)
+		cif_hw->domain = iommu_get_domain_for_dev(cif_hw->dev);
 
-	domain = iommu_get_domain_for_dev(cif_hw->dev);
-	if (domain) {
-#ifdef CONFIG_IOMMU_API
-		domain->ops->detach_dev(domain, cif_hw->dev);
-		domain->ops->attach_dev(domain, cif_hw->dev);
-#endif
-	}
+	if (cif_hw->domain)
+		cif_hw->domain->ops->attach_dev(cif_hw->domain, cif_hw->dev);
 }
 
 static inline bool is_iommu_enable(struct device *dev)
@@ -809,6 +809,9 @@ void rkcif_hw_soft_reset(struct rkcif_hw *cif_hw, bool is_rst_iommu)
 	for (i = 0; i < ARRAY_SIZE(cif_hw->cif_rst); i++)
 		if (cif_hw->cif_rst[i])
 			reset_control_deassert(cif_hw->cif_rst[i]);
+
+	if (cif_hw->iommu_en && is_rst_iommu)
+		rkcif_iommu_enable(cif_hw);
 }
 
 static int rkcif_plat_hw_probe(struct platform_device *pdev)

commit a427c869426af6aee865f15c53a1e2803ed907ed
Author: Allon Huang <allon.huang@rock-chips.com>
Date:   Thu May 20 14:13:32 2021 +0800

    media: platform: rockchip: cif: set stopping time out as fps when reset cif
    
    Signed-off-by: Allon Huang <allon.huang@rock-chips.com>
    Change-Id: I1376766c27ba08453a6d2b93ea5a5a3d188a1c42

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index b79a6d3c26a7..83636607e251 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -4730,8 +4730,10 @@ static int rkcif_do_reset_work(struct rkcif_device *cif_dev,
 	struct rkcif_stream *resume_stream[RKCIF_MAX_STREAM_MIPI] = { NULL };
 	struct rkcif_sensor_info *terminal_sensor = &cif_dev->terminal_sensor;
 	struct rkcif_resume_info *resume_info = &cif_dev->reset_work.resume_info;
+	struct rkcif_timer *timer = &cif_dev->reset_watchdog_timer;
 	int i, j, ret = 0;
 	u32 on, sof_cnt;
+	u64 fps;
 
 	mutex_lock(&cif_dev->stream_lock);
 
@@ -4740,6 +4742,7 @@ static int rkcif_do_reset_work(struct rkcif_device *cif_dev,
 
 	v4l2_dbg(1, rkcif_debug, &cif_dev->v4l2_dev, "do rkcif reset\n");
 
+	fps = div_u64(timer->frame_end_cycle_us, 1000);
 	for (i = 0, j = 0; i < RKCIF_MAX_STREAM_MIPI; i++) {
 		stream = &cif_dev->stream[i];
 
@@ -4752,7 +4755,7 @@ static int rkcif_do_reset_work(struct rkcif_device *cif_dev,
 
 			ret = wait_event_timeout(stream->wq_stopped,
 						 stream->state != RKCIF_STATE_STREAMING,
-						 msecs_to_jiffies(1000));
+						 msecs_to_jiffies(fps));
 			if (!ret) {
 				rkcif_stream_stop(stream);
 				stream->stopping = false;
@@ -4885,7 +4888,7 @@ static int rkcif_do_reset_work(struct rkcif_device *cif_dev,
 	return ret;
 }
 
-static void rkcif_reset_work(struct work_struct *work)
+void rkcif_reset_work(struct work_struct *work)
 {
 	struct rkcif_work_struct *reset_work = container_of(work,
 							    struct rkcif_work_struct,
@@ -4893,12 +4896,14 @@ static void rkcif_reset_work(struct work_struct *work)
 	struct rkcif_device *dev = container_of(reset_work,
 						struct rkcif_device,
 						reset_work);
+	struct rkcif_timer *timer = &dev->reset_watchdog_timer;
 	int ret;
 
 	ret = rkcif_do_reset_work(dev, reset_work->reset_src);
 	if (ret)
 		v4l2_info(&dev->v4l2_dev, "do reset work failed!\n");
 
+	timer->has_been_init = false;
 }
 
 static bool rkcif_is_reduced_frame_rate(struct rkcif_device *dev)
@@ -4970,6 +4975,9 @@ static void rkcif_init_reset_work(struct rkcif_timer *timer)
 						reset_watchdog_timer);
 	unsigned long lock_flags = 0;
 
+	if (timer->has_been_init)
+		return;
+
 	v4l2_info(&dev->v4l2_dev,
 		  "do reset work schedule, run_cnt:%d, reset source:%d\n",
 		  timer->run_cnt, timer->reset_src);
@@ -4985,14 +4993,14 @@ static void rkcif_init_reset_work(struct rkcif_timer *timer)
 	spin_unlock_irqrestore(&timer->timer_lock, lock_flags);
 
 	dev->reset_work.reset_src = timer->reset_src;
-	INIT_WORK(&dev->reset_work.work, rkcif_reset_work);
-	if (schedule_work(&dev->reset_work.work))
-		v4l2_err(&dev->v4l2_dev,
+	if (schedule_work(&dev->reset_work.work)) {
+		timer->has_been_init = true;
+		v4l2_info(&dev->v4l2_dev,
 			 "schedule reset work successfully\n");
-	else
-		v4l2_err(&dev->v4l2_dev,
+	} else {
+		v4l2_info(&dev->v4l2_dev,
 			 "schedule reset work failed\n");
-
+	}
 }
 
 void rkcif_reset_watchdog_timer_handler(struct timer_list *t)
@@ -5063,7 +5071,7 @@ void rkcif_reset_watchdog_timer_handler(struct timer_list *t)
 
 		if (is_reset) {
 			rkcif_init_reset_work(timer);
-				return;
+			return;
 		}
 
 		if (timer->monitor_mode == RKCIF_MONITOR_MODE_CONTINUE ||
diff --git a/drivers/media/platform/rockchip/cif/dev.c b/drivers/media/platform/rockchip/cif/dev.c
index 8f6458094320..33310e0bb9be 100644
--- a/drivers/media/platform/rockchip/cif/dev.c
+++ b/drivers/media/platform/rockchip/cif/dev.c
@@ -1008,7 +1008,7 @@ static void rkcif_init_reset_monitor(struct rkcif_device *dev)
 	notifier->priority = 1;
 	notifier->notifier_call = rkcif_reset_notifier;
 	rkcif_csi2_register_notifier(notifier);
-
+	INIT_WORK(&dev->reset_work.work, rkcif_reset_work);
 }
 
 int rkcif_plat_init(struct rkcif_device *cif_dev, struct device_node *node, int inf_id)
diff --git a/drivers/media/platform/rockchip/cif/dev.h b/drivers/media/platform/rockchip/cif/dev.h
index 176c23162547..539a0dd5b4b9 100644
--- a/drivers/media/platform/rockchip/cif/dev.h
+++ b/drivers/media/platform/rockchip/cif/dev.h
@@ -363,6 +363,7 @@ struct rkcif_timer {
 	bool			is_buf_stop_update;
 	bool			is_running;
 	bool			is_csi2_err_occurred;
+	bool			has_been_init;
 	enum rkcif_monitor_mode	monitor_mode;
 	enum rkmodule_reset_src	reset_src;
 };
@@ -562,5 +563,5 @@ void rkcif_reset_watchdog_timer_handler(struct timer_list *t);
 void rkcif_config_dvp_clk_sampling_edge(struct rkcif_device *dev,
 					enum rkcif_clk_edge edge);
 void rkcif_enable_dvp_clk_dual_edge(struct rkcif_device *dev, bool on);
-
+void rkcif_reset_work(struct work_struct *work);
 #endif

commit ff16b2d5058f992d7cd447575b5f55ee2b8fc9d2
Author: Allon Huang <allon.huang@rock-chips.com>
Date:   Fri May 14 13:13:15 2021 +0800

    media: platform: rockchip: cif: do reset when mipi fs & fe are not paired
    
    Signed-off-by: Allon Huang <allon.huang@rock-chips.com>
    Change-Id: If22316faffcdeb5a619d214eb8b650f300d1c41c

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index 67a8918b6588..b79a6d3c26a7 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -2625,6 +2625,8 @@ static int rkcif_start_streaming(struct vb2_queue *queue, unsigned int count)
 		goto destroy_buf;
 	}
 
+	stream->fs_cnt_in_single_frame = 0;
+
 	if (dev->active_sensor) {
 		ret = rkcif_update_sensor_info(stream);
 		if (ret < 0) {
@@ -2990,6 +2992,8 @@ void rkcif_stream_init(struct rkcif_device *dev, u32 id)
 		stream->extend_line.is_extended = false;
 
 	stream->is_dvp_yuv_addr_init = false;
+	stream->is_fs_fe_not_paired = false;
+	stream->fs_cnt_in_single_frame = 0;
 
 }
 
@@ -4180,6 +4184,7 @@ static bool rkcif_is_csi2_err_trigger_reset(struct rkcif_timer *timer)
 	struct rkcif_device *dev = container_of(timer,
 						struct rkcif_device,
 						reset_watchdog_timer);
+	struct rkcif_stream *stream = &dev->stream[RKCIF_STREAM_MIPI_ID0];
 
 	bool is_triggered = false;
 	unsigned long lock_flags;
@@ -4195,6 +4200,16 @@ static bool rkcif_is_csi2_err_trigger_reset(struct rkcif_timer *timer)
 		v4l2_info(&dev->v4l2_dev, "do csi2 err reset\n");
 	}
 
+	/*
+	 * when fs cnt is beyond 2, it indicates that frame end is not coming,
+	 * or fs and fe had been not paired.
+	 */
+	if (stream->is_fs_fe_not_paired ||
+	    stream->fs_cnt_in_single_frame > RKCIF_FS_DETECTED_NUM) {
+		is_triggered = true;
+		v4l2_info(&dev->v4l2_dev, "reset for fs & fe not paired\n");
+	}
+
 	spin_unlock_irqrestore(&timer->csi2_err_lock, lock_flags);
 
 	return is_triggered;
@@ -4716,7 +4731,7 @@ static int rkcif_do_reset_work(struct rkcif_device *cif_dev,
 	struct rkcif_sensor_info *terminal_sensor = &cif_dev->terminal_sensor;
 	struct rkcif_resume_info *resume_info = &cif_dev->reset_work.resume_info;
 	int i, j, ret = 0;
-	u32 on;
+	u32 on, sof_cnt;
 
 	mutex_lock(&cif_dev->stream_lock);
 
@@ -4743,10 +4758,23 @@ static int rkcif_do_reset_work(struct rkcif_device *cif_dev,
 				stream->stopping = false;
 			}
 
-			if (stream->id == RKCIF_STREAM_MIPI_ID0)
-				resume_info->frm_sync_seq = rkcif_get_sof(cif_dev) + 1;
+			if (stream->id == RKCIF_STREAM_MIPI_ID0) {
+				sof_cnt = rkcif_get_sof(cif_dev);
+				v4l2_err(&cif_dev->v4l2_dev,
+					 "%s: stream[%d] sync frmid & csi_sof, frm_id:%d, csi_sof:%d\n",
+					 __func__,
+					 stream->id,
+					 stream->frame_idx,
+					 sof_cnt);
+
+				resume_info->frm_sync_seq = sof_cnt;
+				if (stream->frame_idx != sof_cnt)
+					stream->frame_idx = sof_cnt;
+			}
 
 			stream->state = RKCIF_STATE_RESET_IN_STREAMING;
+			stream->is_fs_fe_not_paired = false;
+			stream->fs_cnt_in_single_frame = 0;
 			resume_stream[j] = stream;
 			j += 1;
 
@@ -4797,6 +4825,7 @@ static int rkcif_do_reset_work(struct rkcif_device *cif_dev,
 	}
 
 	for (i = 0; i < j; i++) {
+		resume_stream[i]->fs_cnt_in_single_frame = 0;
 		ret = rkcif_csi_stream_start(resume_stream[i]);
 		if (ret) {
 			v4l2_err(&cif_dev->v4l2_dev, "%s:resume stream[%d] failed\n",
@@ -5112,8 +5141,9 @@ int rkcif_reset_notifier(struct notifier_block *nb,
 void rkcif_irq_pingpong(struct rkcif_device *cif_dev)
 {
 	struct rkcif_stream *stream;
+	struct rkcif_stream *detect_stream = &cif_dev->stream[0];
 	struct v4l2_mbus_config *mbus;
-	unsigned int intstat, i = 0xff;
+	unsigned int intstat = 0x0, i = 0xff, bak_intstat = 0x0;
 
 	if (!cif_dev->active_sensor)
 		return;
@@ -5156,11 +5186,23 @@ void rkcif_irq_pingpong(struct rkcif_device *cif_dev)
 			return;
 		}
 
+		if ((intstat & (CSI_FRAME0_START_ID0 | CSI_FRAME1_START_ID0)) ==
+			(CSI_FRAME0_START_ID0 | CSI_FRAME1_START_ID0)) {
+			v4l2_err(&cif_dev->v4l2_dev, "%s:ERR: double fs in one fs int\n",
+				 __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);
+
+			if (detect_stream->fs_cnt_in_single_frame >= 1)
+				v4l2_warn(&cif_dev->v4l2_dev,
+					  "%s:warn: fs has been incread:%d(frm0)\n",
+					  __func__, detect_stream->fs_cnt_in_single_frame);
+			detect_stream->fs_cnt_in_single_frame++;
 		}
 
 		if (intstat & CSI_FRAME1_START_ID0) {
@@ -5168,6 +5210,11 @@ void rkcif_irq_pingpong(struct rkcif_device *cif_dev)
 				rkcif_csi2_event_inc_sof();
 			else if (mbus->type == V4L2_MBUS_CCP2)
 				rkcif_lvds_event_inc_sof(cif_dev);
+
+			if (detect_stream->fs_cnt_in_single_frame >= 1)
+				v4l2_warn(&cif_dev->v4l2_dev, "%s:warn: fs has been incread:%d(frm1)\n",
+				 __func__, detect_stream->fs_cnt_in_single_frame);
+			detect_stream->fs_cnt_in_single_frame++;
 		}
 
 		/* if do not reach frame dma end, return irq */
@@ -5217,6 +5264,19 @@ void rkcif_irq_pingpong(struct rkcif_device *cif_dev)
 
 			rkcif_update_stream(cif_dev, stream, mipi_id);
 			rkcif_monitor_reset_event(cif_dev);
+			if (stream->id == RKCIF_STREAM_MIPI_ID0 &&
+			    (intstat & (CSI_FRAME1_START_ID0 | CSI_FRAME0_START_ID0)) == 0 &&
+			     detect_stream->fs_cnt_in_single_frame > 1) {
+				v4l2_err(&cif_dev->v4l2_dev,
+					 "%s ERR: multi fs in oneframe, bak_int:0x%x, fs_num:%d\n",
+					 __func__,
+					 bak_intstat,
+					 detect_stream->fs_cnt_in_single_frame);
+				detect_stream->is_fs_fe_not_paired = true;
+				detect_stream->fs_cnt_in_single_frame = 0;
+			} else {
+				detect_stream->fs_cnt_in_single_frame--;
+			}
 		}
 		cif_dev->irq_stats.all_frm_end_cnt++;
 	} else {
diff --git a/drivers/media/platform/rockchip/cif/dev.h b/drivers/media/platform/rockchip/cif/dev.h
index f88ab66eeef1..176c23162547 100644
--- a/drivers/media/platform/rockchip/cif/dev.h
+++ b/drivers/media/platform/rockchip/cif/dev.h
@@ -65,6 +65,7 @@
 
 #define RKCIF_DEFAULT_WIDTH	640
 #define RKCIF_DEFAULT_HEIGHT	480
+#define RKCIF_FS_DETECTED_NUM	2
 
 /*
  * for HDR mode sync buf
@@ -415,6 +416,8 @@ struct rkcif_stream {
 	struct rkcif_fps_stats		fps_stats;
 	struct rkcif_extend_info	extend_line;
 	bool				is_dvp_yuv_addr_init;
+	bool				is_fs_fe_not_paired;
+	unsigned int			fs_cnt_in_single_frame;
 };
 
 struct rkcif_lvds_subdev {
diff --git a/include/uapi/linux/rk-camera-module.h b/include/uapi/linux/rk-camera-module.h
index 526eb75f3652..2b362766f476 100644
--- a/include/uapi/linux/rk-camera-module.h
+++ b/include/uapi/linux/rk-camera-module.h
@@ -92,7 +92,7 @@
 	_IOR('V', BASE_VIDIOC_PRIVATE + 15, struct rkmodule_vicap_reset_info)
 
 #define RKMODULE_SET_VICAP_RST_INFO	\
-	_IOR('V', BASE_VIDIOC_PRIVATE + 16, struct rkmodule_vicap_reset_info)
+	_IOW('V', BASE_VIDIOC_PRIVATE + 16, struct rkmodule_vicap_reset_info)
 
 #define RKMODULE_GET_BT656_MBUS_INFO	\
 	_IOR('V', BASE_VIDIOC_PRIVATE + 17, struct rkmodule_bt656_mbus_info)

commit 1c41457a25e44f92e1d57de231e6309de6e470f1
Author: Allon Huang <allon.huang@rock-chips.com>
Date:   Fri May 14 12:47:57 2021 +0800

    media: platform: rockchip: cif: fix iommu lose effectiveness when do cru reset
    
    Signed-off-by: Allon Huang <allon.huang@rock-chips.com>
    Change-Id: I9e116d4ea8af2bac787fb9df18fede3637f27c3c

diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c
index 36f8c26f3441..67a8918b6588 100644
--- a/drivers/media/platform/rockchip/cif/capture.c
+++ b/drivers/media/platform/rockchip/cif/capture.c
@@ -8,6 +8,7 @@
 #include <linux/delay.h>
 #include <linux/pm_runtime.h>
 #include <linux/reset.h>
+#include <linux/iommu.h>
 #include <media/v4l2-common.h>
 #include <media/v4l2-event.h>
 #include <media/v4l2-fh.h>
@@ -1955,6 +1956,15 @@ static void rkcif_do_cru_reset(struct rkcif_device *dev)
 		if (cif_hw->cif_rst[i])
 			reset_control_deassert(cif_hw->cif_rst[i]);
 
+	if (cif_hw->iommu_en) {
+		struct iommu_domain *domain;
+
+		domain = iommu_get_domain_for_dev(cif_hw->dev);
+		if (domain) {
+			domain->ops->detach_dev(domain, cif_hw->dev);
+			domain->ops->attach_dev(domain, cif_hw->dev);
+		}
+	}
 }
 
 static void rkcif_release_rdbk_buf(struct rkcif_stream *stream)
@@ -4834,6 +4844,8 @@ static int rkcif_do_reset_work(struct rkcif_device *cif_dev,
 	rkcif_start_luma(&cif_dev->luma_vdev,
 			 cif_dev->stream[RKCIF_STREAM_MIPI_ID0].cif_fmt_in);
 
+	rkcif_monitor_reset_event(cif_dev);
+
 	v4l2_dbg(1, rkcif_debug, &cif_dev->v4l2_dev, "do rkcif reset successfully!\n");
 
 	mutex_unlock(&cif_dev->stream_lock);

commit 9aff3a5f410d917772cfd1218db3f5a6470a1a3b
Author: Lin Jinhan <troy.lin@rock-chips.com>
Date:   Tue Apr 27 10:02:05 2021 +0800

    crypto: rockchip: move algs private data from rk_crypto_dev
    
    Algos private data should store in tfm's ctx field to avoid
    modify by other algos while calculating.
    
    Change-Id: I1c77e408e3374c697849ec508323131bf5f488b2
    Signed-off-by: Lin Jinhan <troy.lin@rock-chips.com>

diff --git a/drivers/crypto/rockchip/rk_crypto_core.c b/drivers/crypto/rockchip/rk_crypto_core.c
index 07a2256edb97..5e6cc2ec7b84 100644
--- a/drivers/crypto/rockchip/rk_crypto_core.c
+++ b/drivers/crypto/rockchip/rk_crypto_core.c
@@ -51,6 +51,37 @@
 	.default_pka_offset = 0x0480,\
 }
 
+static void dump_alg_ctx(struct crypto_async_request *async_req)
+{
+	struct rk_alg_ctx *alg_ctx = crypto_tfm_ctx(async_req->tfm);
+	struct scatterlist *cur_sg = NULL;
+	unsigned int i;
+
+	CRYPTO_TRACE("\n");
+
+	CRYPTO_TRACE("------ req_src addr = %llx, nents = %zu ------",
+		     (long long)alg_ctx->req_src, alg_ctx->src_nents);
+
+	for_each_sg(alg_ctx->req_src, cur_sg, alg_ctx->src_nents, i)
+		CRYPTO_TRACE("sg %llx: virt = %llx, off = %u, len = %u",
+			     (long long)cur_sg, (long long)sg_virt(cur_sg),
+			     cur_sg->offset, cur_sg->length);
+
+	CRYPTO_TRACE("\n");
+
+	if (!alg_ctx->req_dst)
+		return;
+
+	CRYPTO_TRACE("------ req_dst addr = %llx, nents = %zu ------",
+		     (long long)alg_ctx->req_dst, alg_ctx->dst_nents);
+
+	for_each_sg(alg_ctx->req_dst, cur_sg, alg_ctx->dst_nents, i)
+		CRYPTO_TRACE("sg %llx: virt = %llx, off = %u, len = %u\n",
+			     (long long)cur_sg, (long long)sg_virt(cur_sg),
+			     cur_sg->offset, cur_sg->length);
+	CRYPTO_TRACE("\n");
+}
+
 static int rk_crypto_enable_clk(struct rk_crypto_dev *rk_dev)
 {
 	int ret;
@@ -96,15 +127,19 @@ static int rk_load_data(struct rk_crypto_dev *rk_dev,
 	int ret = -EINVAL;
 	unsigned int count;
 	struct device *dev = rk_dev->dev;
+	struct rk_alg_ctx *alg_ctx = crypto_tfm_ctx(rk_dev->async_req->tfm);
 
 	mutex_lock(&rk_dev->mutex);
 
-	rk_dev->aligned = rk_dev->aligned ?
-		check_alignment(sg_src, sg_dst, rk_dev->align_size) :
-		rk_dev->aligned;
-	if (rk_dev->aligned) {
-		count = min_t(unsigned int, rk_dev->left_bytes, sg_src->length);
-		rk_dev->left_bytes -= count;
+	alg_ctx->aligned = check_alignment(sg_src, sg_dst, alg_ctx->align_size);
+
+	CRYPTO_TRACE("aligned = %d, total = %u, left_bytes = %u\n",
+		     alg_ctx->aligned, alg_ctx->total, alg_ctx->left_bytes);
+
+	if (alg_ctx->aligned) {
+		count = min_t(unsigned int, alg_ctx->left_bytes,
+			     sg_src->length);
+		alg_ctx->left_bytes -= count;
 
 		if (!dma_map_sg(dev, sg_src, 1, DMA_TO_DEVICE)) {
 			dev_err(dev, "[%s:%d] dma_map_sg(src)  error\n",
@@ -112,7 +147,7 @@ static int rk_load_data(struct rk_crypto_dev *rk_dev,
 			ret = -EINVAL;
 			goto error;
 		}
-		rk_dev->addr_in = sg_dma_address(sg_src);
+		alg_ctx->addr_in = sg_dma_address(sg_src);
 
 		if (sg_dst) {
 			if (!dma_map_sg(dev, sg_dst, 1, DMA_FROM_DEVICE)) {
@@ -124,75 +159,93 @@ static int rk_load_data(struct rk_crypto_dev *rk_dev,
 				ret = -EINVAL;
 				goto error;
 			}
-			rk_dev->addr_out = sg_dma_address(sg_dst);
+			alg_ctx->addr_out = sg_dma_address(sg_dst);
 		}
 	} else {
-		count = (rk_dev->left_bytes > PAGE_SIZE) ?
-			PAGE_SIZE : rk_dev->left_bytes;
+		count = (alg_ctx->left_bytes > PAGE_SIZE) ?
+			PAGE_SIZE : alg_ctx->left_bytes;
 
-		if (!sg_pcopy_to_buffer(rk_dev->first, rk_dev->src_nents,
+		if (!sg_pcopy_to_buffer(alg_ctx->req_src, alg_ctx->src_nents,
 					rk_dev->addr_vir, count,
-					rk_dev->total - rk_dev->left_bytes)) {
+					alg_ctx->total - alg_ctx->left_bytes)) {
 			dev_err(dev, "[%s:%d] pcopy err\n",
 				__func__, __LINE__);
 			ret = -EINVAL;
 			goto error;
 		}
-		rk_dev->left_bytes -= count;
-		sg_init_one(&rk_dev->sg_tmp, rk_dev->addr_vir, count);
-		if (!dma_map_sg(dev, &rk_dev->sg_tmp, 1, DMA_TO_DEVICE)) {
+		alg_ctx->left_bytes -= count;
+		sg_init_one(&alg_ctx->sg_tmp, rk_dev->addr_vir, count);
+		if (!dma_map_sg(dev, &alg_ctx->sg_tmp, 1, DMA_TO_DEVICE)) {
 			dev_err(dev, "[%s:%d] dma_map_sg(sg_tmp)  error\n",
 				__func__, __LINE__);
 			ret = -ENOMEM;
 			goto error;
 		}
-		rk_dev->addr_in = sg_dma_address(&rk_dev->sg_tmp);
+		alg_ctx->addr_in = sg_dma_address(&alg_ctx->sg_tmp);
 
 		if (sg_dst) {
-			if (!dma_map_sg(dev, &rk_dev->sg_tmp, 1,
+			if (!dma_map_sg(dev, &alg_ctx->sg_tmp, 1,
 					DMA_FROM_DEVICE)) {
 				dev_err(dev,
 					"[%s:%d] dma_map_sg(sg_tmp)  error\n",
 					__func__, __LINE__);
-				dma_unmap_sg(dev, &rk_dev->sg_tmp, 1,
+				dma_unmap_sg(dev, &alg_ctx->sg_tmp, 1,
 					     DMA_TO_DEVICE);
 				ret = -ENOMEM;
 				goto error;
 			}
-			rk_dev->addr_out = sg_dma_address(&rk_dev->sg_tmp);
+			alg_ctx->addr_out = sg_dma_address(&alg_ctx->sg_tmp);
 		}
 	}
 
-	rk_dev->count = count;
+	alg_ctx->count = count;
 	return 0;
 error:
 	mutex_unlock(&rk_dev->mutex);
 	return ret;
 }
 
-static void rk_unload_data(struct rk_crypto_dev *rk_dev)
+static int rk_unload_data(struct rk_crypto_dev *rk_dev)
 {
+	int ret = 0;
 	struct scatterlist *sg_in, *sg_out;
+	struct rk_alg_ctx *alg_ctx = crypto_tfm_ctx(rk_dev->async_req->tfm);
 
-	sg_in = rk_dev->aligned ? rk_dev->sg_src : &rk_dev->sg_tmp;
+	CRYPTO_TRACE("aligned = %d, total = %u, left_bytes = %u\n",
+		     alg_ctx->aligned, alg_ctx->total, alg_ctx->left_bytes);
+
+	sg_in = alg_ctx->aligned ? alg_ctx->sg_src : &alg_ctx->sg_tmp;
 	dma_unmap_sg(rk_dev->dev, sg_in, 1, DMA_TO_DEVICE);
 
-	if (rk_dev->sg_dst) {
-		sg_out = rk_dev->aligned ? rk_dev->sg_dst : &rk_dev->sg_tmp;
+	if (alg_ctx->sg_dst) {
+		sg_out = alg_ctx->aligned ? alg_ctx->sg_dst : &alg_ctx->sg_tmp;
 		dma_unmap_sg(rk_dev->dev, sg_out, 1, DMA_FROM_DEVICE);
 	}
 
+	if (!alg_ctx->aligned && alg_ctx->req_dst) {
+		if (!sg_pcopy_from_buffer(alg_ctx->req_dst, alg_ctx->dst_nents,
+					  rk_dev->addr_vir, alg_ctx->count,
+					  alg_ctx->total - alg_ctx->left_bytes -
+					  alg_ctx->count)) {
+			ret = -EINVAL;
+			goto exit;
+		}
+	}
+
+exit:
 	mutex_unlock(&rk_dev->mutex);
+	return ret;
 }
 
 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 = crypto_tfm_ctx(rk_dev->async_req->tfm);
 
 	spin_lock(&rk_dev->lock);
 
-	if (rk_dev->irq_handle)
-		rk_dev->irq_handle(irq, dev_id);
+	if (alg_ctx->ops.irq_handle)
+		alg_ctx->ops.irq_handle(irq, dev_id);
 
 	tasklet_schedule(&rk_dev->done_task);
 
@@ -201,7 +254,7 @@ static irqreturn_t rk_crypto_irq_handle(int irq, void *dev_id)
 }
 
 static int rk_crypto_enqueue(struct rk_crypto_dev *rk_dev,
-			      struct crypto_async_request *async_req)
+			     struct crypto_async_request *async_req)
 {
 	unsigned long flags;
 	int ret;
@@ -223,6 +276,7 @@ static void rk_crypto_queue_task_cb(unsigned long data)
 {
 	struct rk_crypto_dev *rk_dev = (struct rk_crypto_dev *)data;
 	struct crypto_async_request *async_req, *backlog;
+	struct rk_alg_ctx *alg_ctx;
 	unsigned long flags;
 	int err = 0;
 
@@ -243,24 +297,29 @@ static void rk_crypto_queue_task_cb(unsigned long data)
 		backlog = NULL;
 	}
 
+	alg_ctx = crypto_tfm_ctx(async_req->tfm);
+
 	rk_dev->async_req = async_req;
-	err = rk_dev->start(rk_dev);
+	err = alg_ctx->ops.start(rk_dev);
 	if (err)
-		rk_dev->complete(rk_dev->async_req, err);
+		alg_ctx->ops.complete(rk_dev->async_req, err);
+
+	dump_alg_ctx(async_req);
 }
 
 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 = crypto_tfm_ctx(rk_dev->async_req->tfm);
 
 	if (rk_dev->err) {
-		rk_dev->complete(rk_dev->async_req, rk_dev->err);
+		alg_ctx->ops.complete(rk_dev->async_req, rk_dev->err);
 		return;
 	}
 
-	rk_dev->err = rk_dev->update(rk_dev);
+	rk_dev->err = alg_ctx->ops.update(rk_dev);
 	if (rk_dev->err)
-		rk_dev->complete(rk_dev->async_req, rk_dev->err);
+		alg_ctx->ops.complete(rk_dev->async_req, rk_dev->err);
 }
 
 static struct rk_crypto_algt *rk_crypto_find_algs(struct rk_crypto_dev *rk_dev,
diff --git a/drivers/crypto/rockchip/rk_crypto_core.h b/drivers/crypto/rockchip/rk_crypto_core.h
index d04c1f8f39bd..3dc2f0c57498 100644
--- a/drivers/crypto/rockchip/rk_crypto_core.h
+++ b/drivers/crypto/rockchip/rk_crypto_core.h
@@ -60,10 +60,32 @@ struct rk_crypto_dev {
 	/* the public variable */
 	struct crypto_async_request	*async_req;
 	void				*addr_vir;
+
+	bool				busy;
+	void (*request_crypto)(struct rk_crypto_dev *rk_dev, const char *name);
+	void (*release_crypto)(struct rk_crypto_dev *rk_dev, const char *name);
+	int (*load_data)(struct rk_crypto_dev *rk_dev,
+			 struct scatterlist *sg_src,
+			 struct scatterlist *sg_dst);
+	int (*unload_data)(struct rk_crypto_dev *rk_dev);
+	int (*enqueue)(struct rk_crypto_dev *rk_dev,
+		       struct crypto_async_request *async_req);
+};
+
+struct rk_alg_ops {
+	int (*start)(struct rk_crypto_dev *rk_dev);
+	int (*update)(struct rk_crypto_dev *rk_dev);
+	void (*complete)(struct crypto_async_request *base, int err);
+	int (*irq_handle)(int irq, void *dev_id);
+};
+
+struct rk_alg_ctx {
+	struct rk_alg_ops		ops;
 	struct scatterlist		*sg_src;
 	struct scatterlist		*sg_dst;
 	struct scatterlist		sg_tmp;
-	struct scatterlist		*first;
+	struct scatterlist		*req_src;
+	struct scatterlist		*req_dst;
 	size_t				src_nents;
 	size_t				dst_nents;
 
@@ -76,24 +98,11 @@ struct rk_crypto_dev {
 
 	int				aligned;
 	int				align_size;
-
-	bool				busy;
-	void (*request_crypto)(struct rk_crypto_dev *rk_dev, const char *name);
-	void (*release_crypto)(struct rk_crypto_dev *rk_dev, const char *name);
-	int (*start)(struct rk_crypto_dev *rk_dev);
-	int (*update)(struct rk_crypto_dev *rk_dev);
-	void (*complete)(struct crypto_async_request *base, int err);
-	int (*irq_handle)(int irq, void *dev_id);
-	int (*load_data)(struct rk_crypto_dev *rk_dev,
-			 struct scatterlist *sg_src,
-			 struct scatterlist *sg_dst);
-	void (*unload_data)(struct rk_crypto_dev *rk_dev);
-	int (*enqueue)(struct rk_crypto_dev *rk_dev,
-		       struct crypto_async_request *async_req);
 };
 
 /* the private variable of hash */
 struct rk_ahash_ctx {
+	struct rk_alg_ctx		algs_ctx;
 	struct rk_crypto_dev		*rk_dev;
 	u8				authkey[SHA512_BLOCK_SIZE];
 
@@ -103,12 +112,14 @@ struct rk_ahash_ctx {
 
 /* the privete variable of hash for fallback */
 struct rk_ahash_rctx {
+	struct rk_alg_ctx		algs_ctx;
 	struct ahash_request		fallback_req;
 	u32				mode;
 };
 
 /* the private variable of cipher */
 struct rk_cipher_ctx {
+	struct rk_alg_ctx		algs_ctx;
 	struct rk_crypto_dev		*rk_dev;
 	unsigned char			key[AES_MAX_KEY_SIZE * 2];
 	unsigned int			keylen;
@@ -120,6 +131,7 @@ struct rk_cipher_ctx {
 };
 
 struct rk_rsa_ctx {
+	struct rk_alg_ctx		algs_ctx;
 	struct rk_bignum *n;
 	struct rk_bignum *e;
 	struct rk_bignum *d;
diff --git a/drivers/crypto/rockchip/rk_crypto_v1_ablkcipher.c b/drivers/crypto/rockchip/rk_crypto_v1_ablkcipher.c
index 3a1376b1e455..d684c466f930 100644
--- a/drivers/crypto/rockchip/rk_crypto_v1_ablkcipher.c
+++ b/drivers/crypto/rockchip/rk_crypto_v1_ablkcipher.c
@@ -14,6 +14,17 @@
 
 #define RK_CRYPTO_DEC			BIT(0)
 
+static struct rk_alg_ctx *rk_alg_ctx_cast(
+	struct rk_crypto_dev *rk_dev)
+{
+	struct ablkcipher_request *req =
+		ablkcipher_request_cast(rk_dev->async_req);
+	struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
+	struct rk_cipher_ctx *ctx = crypto_ablkcipher_ctx(tfm);
+
+	return &ctx->algs_ctx;
+}
+
 static int rk_crypto_irq_handle(int irq, void *dev_id)
 {
 	struct rk_crypto_dev *rk_dev  = platform_get_drvdata(dev_id);
@@ -39,7 +50,9 @@ static void rk_crypto_complete(struct crypto_async_request *base, int err)
 static int rk_handle_req(struct rk_crypto_dev *rk_dev,
 			 struct ablkcipher_request *req)
 {
-	if (!IS_ALIGNED(req->nbytes, rk_dev->align_size))
+	struct rk_cipher_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
+
+	if (!IS_ALIGNED(req->nbytes, ctx->algs_ctx.align_size))
 		return -EINVAL;
 	else
 		return rk_dev->enqueue(rk_dev, &req->base);
@@ -217,9 +230,11 @@ static void rk_ablk_hw_init(struct rk_crypto_dev *rk_dev)
 
 static void crypto_dma_start(struct rk_crypto_dev *rk_dev)
 {
-	CRYPTO_WRITE(rk_dev, RK_CRYPTO_BRDMAS, rk_dev->addr_in);
-	CRYPTO_WRITE(rk_dev, RK_CRYPTO_BRDMAL, rk_dev->count / 4);
-	CRYPTO_WRITE(rk_dev, RK_CRYPTO_BTDMAS, rk_dev->addr_out);
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
+
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_BRDMAS, alg_ctx->addr_in);
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_BRDMAL, alg_ctx->count / 4);
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_BTDMAS, alg_ctx->addr_out);
 	CRYPTO_WRITE(rk_dev, RK_CRYPTO_CTRL, RK_CRYPTO_BLOCK_START |
 		     _SBF(RK_CRYPTO_BLOCK_START, 16));
 }
@@ -231,20 +246,21 @@ static int rk_set_data_start(struct rk_crypto_dev *rk_dev)
 		ablkcipher_request_cast(rk_dev->async_req);
 	struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
 	struct rk_cipher_ctx *ctx = crypto_ablkcipher_ctx(tfm);
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
 	u32 ivsize = crypto_ablkcipher_ivsize(tfm);
-	u8 *src_last_blk = page_address(sg_page(rk_dev->sg_src)) +
-		rk_dev->sg_src->offset + rk_dev->sg_src->length - ivsize;
+	u8 *src_last_blk = page_address(sg_page(alg_ctx->sg_src)) +
+		alg_ctx->sg_src->offset + alg_ctx->sg_src->length - ivsize;
 
 	/* Store the iv that need to be updated in chain mode.
 	 * And update the IV buffer to contain the next IV for decryption mode.
 	 */
 	if (ctx->mode & RK_CRYPTO_DEC) {
 		memcpy(ctx->iv, src_last_blk, ivsize);
-		sg_pcopy_to_buffer(rk_dev->first, rk_dev->src_nents, req->info,
-				   ivsize, rk_dev->total - ivsize);
+		sg_pcopy_to_buffer(alg_ctx->req_src, alg_ctx->src_nents,
+				   req->info, ivsize, alg_ctx->total - ivsize);
 	}
 
-	err = rk_dev->load_data(rk_dev, rk_dev->sg_src, rk_dev->sg_dst);
+	err = rk_dev->load_data(rk_dev, alg_ctx->sg_src, alg_ctx->sg_dst);
 	if (!err)
 		crypto_dma_start(rk_dev);
 	return err;
@@ -254,17 +270,18 @@ static int rk_ablk_start(struct rk_crypto_dev *rk_dev)
 {
 	struct ablkcipher_request *req =
 		ablkcipher_request_cast(rk_dev->async_req);
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
 	unsigned long flags;
 	int err = 0;
 
-	rk_dev->left_bytes = req->nbytes;
-	rk_dev->total      = req->nbytes;
-	rk_dev->sg_src     = req->src;
-	rk_dev->first      = req->src;
-	rk_dev->src_nents  = sg_nents(req->src);
-	rk_dev->sg_dst     = req->dst;
-	rk_dev->dst_nents  = sg_nents(req->dst);
-	rk_dev->aligned    = 1;
+	alg_ctx->left_bytes = req->nbytes;
+	alg_ctx->total      = req->nbytes;
+	alg_ctx->sg_src     = req->src;
+	alg_ctx->req_src    = req->src;
+	alg_ctx->src_nents  = sg_nents_for_len(req->src, req->nbytes);
+	alg_ctx->sg_dst     = req->dst;
+	alg_ctx->req_dst    = req->dst;
+	alg_ctx->dst_nents  = sg_nents_for_len(req->dst, req->nbytes);
 
 	spin_lock_irqsave(&rk_dev->lock, flags);
 	rk_ablk_hw_init(rk_dev);
@@ -279,16 +296,17 @@ static void rk_iv_copyback(struct rk_crypto_dev *rk_dev)
 		ablkcipher_request_cast(rk_dev->async_req);
 	struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
 	struct rk_cipher_ctx *ctx = crypto_ablkcipher_ctx(tfm);
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
 	u32 ivsize = crypto_ablkcipher_ivsize(tfm);
 
 	/* Update the IV buffer to contain the next IV for encryption mode. */
 	if (!(ctx->mode & RK_CRYPTO_DEC) && req->info) {
-		if (rk_dev->aligned) {
-			memcpy(req->info, sg_virt(rk_dev->sg_dst) +
-				rk_dev->sg_dst->length - ivsize, ivsize);
+		if (alg_ctx->aligned) {
+			memcpy(req->info, sg_virt(alg_ctx->sg_dst) +
+				alg_ctx->sg_dst->length - ivsize, ivsize);
 		} else {
 			memcpy(req->info, rk_dev->addr_vir +
-				rk_dev->count - ivsize, ivsize);
+				alg_ctx->count - ivsize, ivsize);
 		}
 	}
 }
@@ -299,15 +317,16 @@ static void rk_update_iv(struct rk_crypto_dev *rk_dev)
 		ablkcipher_request_cast(rk_dev->async_req);
 	struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
 	struct rk_cipher_ctx *ctx = crypto_ablkcipher_ctx(tfm);
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
 	u32 ivsize = crypto_ablkcipher_ivsize(tfm);
 	u8 *new_iv = NULL;
 
 	if (ctx->mode & RK_CRYPTO_DEC) {
 		new_iv = ctx->iv;
 	} else {
-		new_iv = page_address(sg_page(rk_dev->sg_dst)) +
-			 rk_dev->sg_dst->offset +
-			 rk_dev->sg_dst->length - ivsize;
+		new_iv = page_address(sg_page(alg_ctx->sg_dst)) +
+			 alg_ctx->sg_dst->offset +
+			 alg_ctx->sg_dst->length - ivsize;
 	}
 
 	if (ivsize == DES_BLOCK_SIZE)
@@ -323,36 +342,31 @@ static void rk_update_iv(struct rk_crypto_dev *rk_dev)
 static int rk_ablk_rx(struct rk_crypto_dev *rk_dev)
 {
 	int err = 0;
-	struct ablkcipher_request *req =
-		ablkcipher_request_cast(rk_dev->async_req);
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
 
-	rk_dev->unload_data(rk_dev);
-	if (!rk_dev->aligned) {
-		if (!sg_pcopy_from_buffer(req->dst, rk_dev->dst_nents,
-					  rk_dev->addr_vir, rk_dev->count,
-					  rk_dev->total - rk_dev->left_bytes -
-					  rk_dev->count)) {
-			err = -EINVAL;
-			goto out_rx;
-		}
-	}
-	if (rk_dev->left_bytes) {
+	CRYPTO_TRACE("left_bytes = %u\n", alg_ctx->left_bytes);
+
+	err = rk_dev->unload_data(rk_dev);
+	if (err)
+		goto out_rx;
+
+	if (alg_ctx->left_bytes) {
 		rk_update_iv(rk_dev);
-		if (rk_dev->aligned) {
-			if (sg_is_last(rk_dev->sg_src)) {
+		if (alg_ctx->aligned) {
+			if (sg_is_last(alg_ctx->sg_src)) {
 				dev_err(rk_dev->dev, "[%s:%d] Lack of data\n",
 					__func__, __LINE__);
 				err = -ENOMEM;
 				goto out_rx;
 			}
-			rk_dev->sg_src = sg_next(rk_dev->sg_src);
-			rk_dev->sg_dst = sg_next(rk_dev->sg_dst);
+			alg_ctx->sg_src = sg_next(alg_ctx->sg_src);
+			alg_ctx->sg_dst = sg_next(alg_ctx->sg_dst);
 		}
 		err = rk_set_data_start(rk_dev);
 	} else {
 		rk_iv_copyback(rk_dev);
 		/* here show the calculation is over without any err */
-		rk_dev->complete(rk_dev->async_req, 0);
+		alg_ctx->ops.complete(rk_dev->async_req, 0);
 		tasklet_schedule(&rk_dev->queue_task);
 	}
 out_rx:
@@ -363,22 +377,26 @@ static int rk_ablk_cra_init(struct crypto_tfm *tfm)
 {
 	struct rk_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
 	struct crypto_alg *alg = tfm->__crt_alg;
+	struct rk_alg_ctx *alg_ctx = &ctx->algs_ctx;
 	struct rk_crypto_algt *algt;
 	struct rk_crypto_dev *rk_dev;
 
 	algt = container_of(alg, struct rk_crypto_algt, alg.crypto);
 	rk_dev = algt->rk_dev;
 
+	memset(ctx, 0x00, sizeof(*ctx));
+
 	if (!rk_dev->request_crypto)
 		return -EFAULT;
 
 	rk_dev->request_crypto(rk_dev, crypto_tfm_alg_name(tfm));
 
-	rk_dev->align_size = crypto_tfm_alg_alignmask(tfm) + 1;
-	rk_dev->start      = rk_ablk_start;
-	rk_dev->update     = rk_ablk_rx;
-	rk_dev->complete   = rk_crypto_complete;
-	rk_dev->irq_handle = rk_crypto_irq_handle;
+	alg_ctx->align_size     = crypto_tfm_alg_alignmask(tfm) + 1;
+
+	alg_ctx->ops.start      = rk_ablk_start;
+	alg_ctx->ops.update     = rk_ablk_rx;
+	alg_ctx->ops.complete   = rk_crypto_complete;
+	alg_ctx->ops.irq_handle = rk_crypto_irq_handle;
 
 	ctx->rk_dev = rk_dev;
 
diff --git a/drivers/crypto/rockchip/rk_crypto_v1_ahash.c b/drivers/crypto/rockchip/rk_crypto_v1_ahash.c
index 853036791aa1..2a5f4272d45c 100644
--- a/drivers/crypto/rockchip/rk_crypto_v1_ahash.c
+++ b/drivers/crypto/rockchip/rk_crypto_v1_ahash.c
@@ -17,6 +17,18 @@
  * so we put the fixed hash out when met zero message.
  */
 
+static struct rk_alg_ctx *rk_alg_ctx_cast(
+	struct rk_crypto_dev *rk_dev)
+{
+	struct ahash_request *req =
+		ahash_request_cast(rk_dev->async_req);
+
+	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
+	struct rk_ahash_ctx *ctx = crypto_ahash_ctx(tfm);
+
+	return &ctx->algs_ctx;
+}
+
 static int rk_crypto_irq_handle(int irq, void *dev_id)
 {
 	struct rk_crypto_dev *rk_dev  = platform_get_drvdata(dev_id);
@@ -65,6 +77,7 @@ static void rk_ahash_reg_init(struct rk_crypto_dev *rk_dev)
 {
 	struct ahash_request *req = ahash_request_cast(rk_dev->async_req);
 	struct rk_ahash_rctx *rctx = ahash_request_ctx(req);
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
 	int reg_status = 0;
 
 	reg_status = CRYPTO_READ(rk_dev, RK_CRYPTO_CTRL) |
@@ -91,7 +104,7 @@ static void rk_ahash_reg_init(struct rk_crypto_dev *rk_dev)
 					  RK_CRYPTO_BYTESWAP_BRFIFO |
 					  RK_CRYPTO_BYTESWAP_BTFIFO);
 
-	CRYPTO_WRITE(rk_dev, RK_CRYPTO_HASH_MSG_LEN, rk_dev->total);
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_HASH_MSG_LEN, alg_ctx->total);
 }
 
 static int rk_ahash_init(struct ahash_request *req)
@@ -192,8 +205,10 @@ static int rk_ahash_digest(struct ahash_request *req)
 
 static void crypto_ahash_dma_start(struct rk_crypto_dev *rk_dev)
 {
-	CRYPTO_WRITE(rk_dev, RK_CRYPTO_HRDMAS, rk_dev->addr_in);
-	CRYPTO_WRITE(rk_dev, RK_CRYPTO_HRDMAL, (rk_dev->count + 3) / 4);
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
+
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_HRDMAS, alg_ctx->addr_in);
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_HRDMAL, (alg_ctx->count + 3) / 4);
 	CRYPTO_WRITE(rk_dev, RK_CRYPTO_CTRL, RK_CRYPTO_HASH_START |
 					  (RK_CRYPTO_HASH_START << 16));
 }
@@ -201,8 +216,9 @@ static void crypto_ahash_dma_start(struct rk_crypto_dev *rk_dev)
 static int rk_ahash_set_data_start(struct rk_crypto_dev *rk_dev)
 {
 	int err;
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
 
-	err = rk_dev->load_data(rk_dev, rk_dev->sg_src, NULL);
+	err = rk_dev->load_data(rk_dev, alg_ctx->sg_src, NULL);
 	if (!err)
 		crypto_ahash_dma_start(rk_dev);
 	return err;
@@ -211,22 +227,18 @@ static int rk_ahash_set_data_start(struct rk_crypto_dev *rk_dev)
 static int rk_ahash_start(struct rk_crypto_dev *rk_dev)
 {
 	struct ahash_request *req = ahash_request_cast(rk_dev->async_req);
-	struct crypto_ahash *tfm;
-	struct rk_ahash_rctx *rctx;
-
-	rk_dev->total      = req->nbytes;
-	rk_dev->left_bytes = req->nbytes;
-	rk_dev->aligned    = 0;
-	rk_dev->align_size = 4;
-	rk_dev->sg_dst     = NULL;
-	rk_dev->sg_src     = req->src;
-	rk_dev->first      = req->src;
-	rk_dev->src_nents   = sg_nents(req->src);
-
-	rctx = ahash_request_ctx(req);
+	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
+	struct rk_ahash_rctx *rctx = ahash_request_ctx(req);
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
+
+	alg_ctx->total      = req->nbytes;
+	alg_ctx->left_bytes = req->nbytes;
+	alg_ctx->sg_src     = req->src;
+	alg_ctx->req_src    = req->src;
+	alg_ctx->src_nents  = sg_nents_for_len(req->src, req->nbytes);
+
 	rctx->mode = 0;
 
-	tfm = crypto_ahash_reqtfm(req);
 	switch (crypto_ahash_digestsize(tfm)) {
 	case SHA1_DIGEST_SIZE:
 		rctx->mode = RK_CRYPTO_HASH_SHA1;
@@ -249,18 +261,24 @@ static int rk_ahash_crypto_rx(struct rk_crypto_dev *rk_dev)
 {
 	int err = 0;
 	struct ahash_request *req = ahash_request_cast(rk_dev->async_req);
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
 	struct crypto_ahash *tfm;
 
-	rk_dev->unload_data(rk_dev);
-	if (rk_dev->left_bytes) {
-		if (rk_dev->aligned) {
-			if (sg_is_last(rk_dev->sg_src)) {
+	CRYPTO_TRACE("left_bytes = %u\n", alg_ctx->left_bytes);
+
+	err = rk_dev->unload_data(rk_dev);
+	if (err)
+		goto out_rx;
+
+	if (alg_ctx->left_bytes) {
+		if (alg_ctx->aligned) {
+			if (sg_is_last(alg_ctx->sg_src)) {
 				dev_warn(rk_dev->dev, "[%s:%d], Lack of data\n",
 					 __func__, __LINE__);
 				err = -ENOMEM;
 				goto out_rx;
 			}
-			rk_dev->sg_src = sg_next(rk_dev->sg_src);
+			alg_ctx->sg_src = sg_next(alg_ctx->sg_src);
 		}
 		err = rk_ahash_set_data_start(rk_dev);
 	} else {
@@ -280,7 +298,7 @@ static int rk_ahash_crypto_rx(struct rk_crypto_dev *rk_dev)
 		tfm = crypto_ahash_reqtfm(req);
 		memcpy_fromio(req->result, rk_dev->reg + RK_CRYPTO_HASH_DOUT_0,
 			      crypto_ahash_digestsize(tfm));
-		rk_dev->complete(rk_dev->async_req, 0);
+		alg_ctx->ops.complete(rk_dev->async_req, 0);
 		tasklet_schedule(&rk_dev->queue_task);
 	}
 
@@ -294,20 +312,25 @@ static int rk_cra_hash_init(struct crypto_tfm *tfm)
 	struct rk_crypto_algt *algt;
 	struct ahash_alg *alg = __crypto_ahash_alg(tfm->__crt_alg);
 	const char *alg_name = crypto_tfm_alg_name(tfm);
+	struct rk_alg_ctx *alg_ctx = &ctx->algs_ctx;
 	struct rk_crypto_dev *rk_dev;
 
 	algt = container_of(alg, struct rk_crypto_algt, alg.hash);
 	rk_dev = algt->rk_dev;
 
+	memset(ctx, 0x00, sizeof(*ctx));
+
 	if (!rk_dev->request_crypto)
 		return -EFAULT;
 
 	rk_dev->request_crypto(rk_dev, crypto_tfm_alg_name(tfm));
 
-	rk_dev->start      = rk_ahash_start;
-	rk_dev->update     = rk_ahash_crypto_rx;
-	rk_dev->complete   = rk_ahash_crypto_complete;
-	rk_dev->irq_handle = rk_crypto_irq_handle;
+	alg_ctx->align_size     = 4;
+
+	alg_ctx->ops.start      = rk_ahash_start;
+	alg_ctx->ops.update     = rk_ahash_crypto_rx;
+	alg_ctx->ops.complete   = rk_ahash_crypto_complete;
+	alg_ctx->ops.irq_handle = rk_crypto_irq_handle;
 
 	ctx->rk_dev = rk_dev;
 
diff --git a/drivers/crypto/rockchip/rk_crypto_v2_ablkcipher.c b/drivers/crypto/rockchip/rk_crypto_v2_ablkcipher.c
index d47260c79b5d..44b1acd6ebb9 100644
--- a/drivers/crypto/rockchip/rk_crypto_v2_ablkcipher.c
+++ b/drivers/crypto/rockchip/rk_crypto_v2_ablkcipher.c
@@ -8,6 +8,7 @@
  *
  * Some ideas are from marvell-cesa.c and s5p-sss.c driver.
  */
+
 #include <linux/module.h>
 #include <linux/platform_device.h>
 
@@ -34,12 +35,24 @@ static const u32 cipher_mode2bc[] = {
 	[CIPHER_MODE_XTS] = CRYPTO_BC_XTS,
 };
 
+static struct rk_alg_ctx *rk_alg_ctx_cast(
+	struct rk_crypto_dev *rk_dev)
+{
+	struct ablkcipher_request *req =
+		ablkcipher_request_cast(rk_dev->async_req);
+	struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
+	struct rk_cipher_ctx *ctx = crypto_ablkcipher_ctx(tfm);
+
+	return &ctx->algs_ctx;
+}
+
 static int rk_crypto_irq_handle(int irq, void *dev_id)
 {
 	struct rk_crypto_dev *rk_dev = platform_get_drvdata(dev_id);
 	u32 interrupt_status;
 	struct rk_hw_crypto_v2_info *hw_info =
 			(struct rk_hw_crypto_v2_info *)rk_dev->hw_info;
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
 
 	interrupt_status = CRYPTO_READ(rk_dev, CRYPTO_DMA_INT_ST);
 	CRYPTO_WRITE(rk_dev, CRYPTO_DMA_INT_ST, interrupt_status);
@@ -49,10 +62,10 @@ static int rk_crypto_irq_handle(int irq, void *dev_id)
 	if (interrupt_status != CRYPTO_DST_ITEM_DONE_INT_ST) {
 		dev_err(rk_dev->dev, "DMA desc = %p\n", hw_info->desc);
 		dev_err(rk_dev->dev, "DMA addr_in = %08x\n",
-			(u32)rk_dev->addr_in);
+			(u32)alg_ctx->addr_in);
 		dev_err(rk_dev->dev, "DMA addr_out = %08x\n",
-			(u32)rk_dev->addr_out);
-		dev_err(rk_dev->dev, "DMA count = %08x\n", rk_dev->count);
+			(u32)alg_ctx->addr_out);
+		dev_err(rk_dev->dev, "DMA count = %08x\n", alg_ctx->count);
 		dev_err(rk_dev->dev, "DMA desc_dma = %08x\n",
 			(u32)hw_info->desc_dma);
 		dev_err(rk_dev->dev, "DMA Error status = %08x\n",
@@ -158,10 +171,8 @@ static bool is_use_fallback(struct rk_cipher_ctx *ctx)
 	return ctx->keylen == AES_KEYSIZE_192 && ctx->fallback_tfm;
 }
 
-static bool is_no_multi_blocksize(struct rk_crypto_dev *rk_dev)
+static bool is_no_multi_blocksize(struct ablkcipher_request *req)
 {
-	struct ablkcipher_request *req =
-		ablkcipher_request_cast(rk_dev->async_req);
 	struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(req);
 	struct rk_crypto_algt *algt = rk_cipher_get_algt(cipher);
 
@@ -179,8 +190,10 @@ static void rk_crypto_complete(struct crypto_async_request *base, int err)
 static int rk_handle_req(struct rk_crypto_dev *rk_dev,
 			 struct ablkcipher_request *req)
 {
-	if (!IS_ALIGNED(req->nbytes, rk_dev->align_size) &&
-	    !is_no_multi_blocksize(rk_dev))
+	struct rk_cipher_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
+
+	if (!IS_ALIGNED(req->nbytes, ctx->algs_ctx.align_size) &&
+	    !is_no_multi_blocksize(req))
 		return -EINVAL;
 	else
 		return rk_dev->enqueue(rk_dev, &req->base);
@@ -361,7 +374,10 @@ static void crypto_dma_start(struct rk_crypto_dev *rk_dev)
 {
 	struct rk_hw_crypto_v2_info *hw_info =
 			(struct rk_hw_crypto_v2_info *)rk_dev->hw_info;
-	u32 calc_len = rk_dev->count;
+	struct ablkcipher_request *req =
+		ablkcipher_request_cast(rk_dev->async_req);
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
+	u32 calc_len = alg_ctx->count;
 
 	memset(hw_info->desc, 0x00, sizeof(*hw_info->desc));
 
@@ -369,12 +385,12 @@ static void crypto_dma_start(struct rk_crypto_dev *rk_dev)
 	 *	the data length is not aligned will use addr_vir to calculate,
 	 *	so crypto v2 could round up date date length to align_size
 	 */
-	if (is_no_multi_blocksize(rk_dev))
-		calc_len = round_up(calc_len, rk_dev->align_size);
+	if (is_no_multi_blocksize(req))
+		calc_len = round_up(calc_len, alg_ctx->align_size);
 
-	hw_info->desc->src_addr    = rk_dev->addr_in;
+	hw_info->desc->src_addr    = alg_ctx->addr_in;
 	hw_info->desc->src_len     = calc_len;
-	hw_info->desc->dst_addr    = rk_dev->addr_out;
+	hw_info->desc->dst_addr    = alg_ctx->addr_out;
 	hw_info->desc->dst_len     = calc_len;
 	hw_info->desc->next_addr   = 0;
 	hw_info->desc->dma_ctrl    = 0x00000201;
@@ -389,8 +405,9 @@ static void crypto_dma_start(struct rk_crypto_dev *rk_dev)
 static int rk_set_data_start(struct rk_crypto_dev *rk_dev)
 {
 	int err;
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
 
-	err = rk_dev->load_data(rk_dev, rk_dev->sg_src, rk_dev->sg_dst);
+	err = rk_dev->load_data(rk_dev, alg_ctx->sg_src, alg_ctx->sg_dst);
 	if (!err)
 		crypto_dma_start(rk_dev);
 	return err;
@@ -400,17 +417,20 @@ static int rk_ablk_start(struct rk_crypto_dev *rk_dev)
 {
 	struct ablkcipher_request *req =
 		ablkcipher_request_cast(rk_dev->async_req);
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
 	unsigned long flags;
 	int err = 0;
 
-	rk_dev->left_bytes = req->nbytes;
-	rk_dev->total      = req->nbytes;
-	rk_dev->sg_src     = req->src;
-	rk_dev->first      = req->src;
-	rk_dev->src_nents  = sg_nents(req->src);
-	rk_dev->sg_dst     = req->dst;
-	rk_dev->dst_nents  = sg_nents(req->dst);
-	rk_dev->aligned    = 1;
+	alg_ctx->left_bytes = req->nbytes;
+	alg_ctx->total      = req->nbytes;
+	alg_ctx->sg_src     = req->src;
+	alg_ctx->req_src    = req->src;
+	alg_ctx->src_nents  = sg_nents_for_len(req->src, req->nbytes);
+	alg_ctx->sg_dst     = req->dst;
+	alg_ctx->req_dst    = req->dst;
+	alg_ctx->dst_nents  = sg_nents_for_len(req->dst, req->nbytes);
+
+	CRYPTO_TRACE("total = %u", alg_ctx->total);
 
 	spin_lock_irqsave(&rk_dev->lock, flags);
 	rk_ablk_hw_init(rk_dev);
@@ -425,17 +445,18 @@ static void rk_iv_copyback(struct rk_crypto_dev *rk_dev)
 		ablkcipher_request_cast(rk_dev->async_req);
 	struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
 	struct rk_cipher_ctx *ctx = crypto_ablkcipher_ctx(tfm);
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
 
 	u32 ivsize = crypto_ablkcipher_ivsize(tfm);
 
 	/* Update the IV buffer to contain the next IV for encryption mode. */
 	if (!IS_BC_DECRYPT(ctx->mode) && req->info) {
-		if (rk_dev->aligned) {
-			memcpy(req->info, sg_virt(rk_dev->sg_dst) +
-				rk_dev->count - ivsize, ivsize);
+		if (alg_ctx->aligned) {
+			memcpy(req->info, sg_virt(alg_ctx->sg_dst) +
+				alg_ctx->count - ivsize, ivsize);
 		} else {
 			memcpy(req->info, rk_dev->addr_vir +
-				rk_dev->count - ivsize, ivsize);
+				alg_ctx->count - ivsize, ivsize);
 		}
 	}
 
@@ -448,35 +469,30 @@ static void rk_iv_copyback(struct rk_crypto_dev *rk_dev)
 static int rk_ablk_rx(struct rk_crypto_dev *rk_dev)
 {
 	int err = 0;
-	struct ablkcipher_request *req =
-		ablkcipher_request_cast(rk_dev->async_req);
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
 
-	rk_dev->unload_data(rk_dev);
-	if (!rk_dev->aligned) {
-		if (!sg_pcopy_from_buffer(req->dst, rk_dev->dst_nents,
-					  rk_dev->addr_vir, rk_dev->count,
-					  rk_dev->total - rk_dev->left_bytes -
-					  rk_dev->count)) {
-			err = -EINVAL;
-			goto out_rx;
-		}
-	}
-	if (rk_dev->left_bytes) {
-		if (rk_dev->aligned) {
-			if (sg_is_last(rk_dev->sg_src)) {
+	CRYPTO_TRACE("left_bytes = %u\n", alg_ctx->left_bytes);
+
+	err = rk_dev->unload_data(rk_dev);
+	if (err)
+		goto out_rx;
+
+	if (alg_ctx->left_bytes) {
+		if (alg_ctx->aligned) {
+			if (sg_is_last(alg_ctx->sg_src)) {
 				dev_err(rk_dev->dev, "[%s:%d] Lack of data\n",
 					__func__, __LINE__);
 				err = -ENOMEM;
 				goto out_rx;
 			}
-			rk_dev->sg_src = sg_next(rk_dev->sg_src);
-			rk_dev->sg_dst = sg_next(rk_dev->sg_dst);
+			alg_ctx->sg_src = sg_next(alg_ctx->sg_src);
+			alg_ctx->sg_dst = sg_next(alg_ctx->sg_dst);
 		}
 		err = rk_set_data_start(rk_dev);
 	} else {
 		rk_iv_copyback(rk_dev);
 		/* here show the calculation is over without any err */
-		rk_dev->complete(rk_dev->async_req, 0);
+		alg_ctx->ops.complete(rk_dev->async_req, 0);
 		tasklet_schedule(&rk_dev->queue_task);
 	}
 out_rx:
@@ -490,19 +506,23 @@ static int rk_ablk_cra_init(struct crypto_tfm *tfm)
 	struct rk_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
 	const char *alg_name = crypto_tfm_alg_name(tfm);
 	struct rk_crypto_dev *rk_dev = algt->rk_dev;
+	struct rk_alg_ctx *alg_ctx = &ctx->algs_ctx;
 
 	CRYPTO_TRACE();
 
+	memset(ctx, 0x00, sizeof(*ctx));
+
 	if (!rk_dev->request_crypto)
 		return -EFAULT;
 
 	rk_dev->request_crypto(rk_dev, alg_name);
 
-	rk_dev->align_size = crypto_tfm_alg_blocksize(tfm);
-	rk_dev->start      = rk_ablk_start;
-	rk_dev->update     = rk_ablk_rx;
-	rk_dev->complete   = rk_crypto_complete;
-	rk_dev->irq_handle = rk_crypto_irq_handle;
+	alg_ctx->align_size     = crypto_tfm_alg_blocksize(tfm);
+
+	alg_ctx->ops.start      = rk_ablk_start;
+	alg_ctx->ops.update     = rk_ablk_rx;
+	alg_ctx->ops.complete   = rk_crypto_complete;
+	alg_ctx->ops.irq_handle = rk_crypto_irq_handle;
 
 	ctx->rk_dev = rk_dev;
 
diff --git a/drivers/crypto/rockchip/rk_crypto_v2_ahash.c b/drivers/crypto/rockchip/rk_crypto_v2_ahash.c
index d3b04f1f1909..d02117b498e5 100644
--- a/drivers/crypto/rockchip/rk_crypto_v2_ahash.c
+++ b/drivers/crypto/rockchip/rk_crypto_v2_ahash.c
@@ -16,10 +16,6 @@
 #include "rk_crypto_v2.h"
 #include "rk_crypto_v2_reg.h"
 
-struct rk_hash_ctx {
-	u32 reserved;
-};
-
 #define RK_HASH_CTX_MAGIC	0x1A1A1A1A
 #define RK_POLL_PERIOD_US	100
 #define RK_POLL_TIMEOUT_US	50000
@@ -77,6 +73,18 @@ const char *hash_algo2name[] = {
 	[HASH_ALGO_SM3]    = "sm3",
 };
 
+static struct rk_alg_ctx *rk_alg_ctx_cast(
+	struct rk_crypto_dev *rk_dev)
+{
+	struct ahash_request *req =
+		ahash_request_cast(rk_dev->async_req);
+
+	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
+	struct rk_ahash_ctx *ctx = crypto_ahash_ctx(tfm);
+
+	return &ctx->algs_ctx;
+}
+
 static inline void word2byte_be(u32 word, u8 *ch)
 {
 	ch[0] = (word >> 24) & 0xff;
@@ -133,6 +141,7 @@ static int rk_crypto_irq_handle(int irq, void *dev_id)
 	u32 interrupt_status;
 	struct rk_hw_crypto_v2_info *hw_info =
 			(struct rk_hw_crypto_v2_info *)rk_dev->hw_info;
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
 
 	interrupt_status = CRYPTO_READ(rk_dev, CRYPTO_DMA_INT_ST);
 	CRYPTO_WRITE(rk_dev, CRYPTO_DMA_INT_ST, interrupt_status);
@@ -142,10 +151,10 @@ static int rk_crypto_irq_handle(int irq, void *dev_id)
 	if (interrupt_status != CRYPTO_SRC_ITEM_DONE_INT_ST) {
 		dev_err(rk_dev->dev, "DMA desc = %p\n", hw_info->desc);
 		dev_err(rk_dev->dev, "DMA addr_in = %08x\n",
-			(u32)rk_dev->addr_in);
+			(u32)alg_ctx->addr_in);
 		dev_err(rk_dev->dev, "DMA addr_out = %08x\n",
-			(u32)rk_dev->addr_out);
-		dev_err(rk_dev->dev, "DMA count = %08x\n", rk_dev->count);
+			(u32)alg_ctx->addr_out);
+		dev_err(rk_dev->dev, "DMA count = %08x\n", alg_ctx->count);
 		dev_err(rk_dev->dev, "DMA desc_dma = %08x\n",
 			(u32)hw_info->desc_dma);
 		dev_err(rk_dev->dev, "DMA Error status = %08x\n",
@@ -402,13 +411,14 @@ static void rk_ahash_dma_start(struct rk_crypto_dev *rk_dev)
 {
 	struct rk_hw_crypto_v2_info *hw_info =
 			(struct rk_hw_crypto_v2_info *)rk_dev->hw_info;
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
 
 	CRYPTO_TRACE();
 
 	memset(hw_info->desc, 0x00, sizeof(*hw_info->desc));
 
-	hw_info->desc->src_addr = rk_dev->addr_in;
-	hw_info->desc->src_len  = rk_dev->count;
+	hw_info->desc->src_addr = alg_ctx->addr_in;
+	hw_info->desc->src_len  = alg_ctx->count;
 	hw_info->desc->next_addr = 0;
 	hw_info->desc->dma_ctrl = 0x00000401;
 	hw_info->desc->user_define = 0x7;
@@ -427,10 +437,11 @@ static void rk_ahash_dma_start(struct rk_crypto_dev *rk_dev)
 static int rk_ahash_set_data_start(struct rk_crypto_dev *rk_dev)
 {
 	int err;
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
 
 	CRYPTO_TRACE();
 
-	err = rk_dev->load_data(rk_dev, rk_dev->sg_src, rk_dev->sg_dst);
+	err = rk_dev->load_data(rk_dev, alg_ctx->sg_src, alg_ctx->sg_dst);
 	if (!err)
 		rk_ahash_dma_start(rk_dev);
 	return err;
@@ -442,18 +453,16 @@ static int rk_ahash_start(struct rk_crypto_dev *rk_dev)
 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
 	struct rk_crypto_algt *algt = rk_ahash_get_algt(tfm);
 	struct rk_ahash_ctx *ctx = crypto_ahash_ctx(tfm);
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
 	u32 reg_ctrl = 0;
 
 	CRYPTO_TRACE();
 
-	rk_dev->total      = req->nbytes;
-	rk_dev->left_bytes = req->nbytes;
-	rk_dev->aligned    = 0;
-	rk_dev->align_size = 4;
-	rk_dev->sg_dst     = NULL;
-	rk_dev->sg_src     = req->src;
-	rk_dev->first      = req->src;
-	rk_dev->src_nents  = sg_nents(req->src);
+	alg_ctx->total      = req->nbytes;
+	alg_ctx->left_bytes = req->nbytes;
+	alg_ctx->sg_src     = req->src;
+	alg_ctx->req_src    = req->src;
+	alg_ctx->src_nents  = sg_nents_for_len(req->src, req->nbytes);
 
 	if (algt->algo >= ARRAY_SIZE(hash_algo2bc))
 		goto exit;
@@ -517,21 +526,24 @@ static int rk_ahash_crypto_rx(struct rk_crypto_dev *rk_dev)
 {
 	int err = 0;
 	struct ahash_request *req = ahash_request_cast(rk_dev->async_req);
+	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
 	struct crypto_ahash *tfm;
 
-	CRYPTO_TRACE();
+	CRYPTO_TRACE("left bytes = %u", alg_ctx->left_bytes);
+
+	err = rk_dev->unload_data(rk_dev);
+	if (err)
+		goto out_rx;
 
-	rk_dev->unload_data(rk_dev);
-	CRYPTO_TRACE("left bytes = %u", rk_dev->left_bytes);
-	if (rk_dev->left_bytes) {
-		if (rk_dev->aligned) {
-			if (sg_is_last(rk_dev->sg_src)) {
+	if (alg_ctx->left_bytes) {
+		if (alg_ctx->aligned) {
+			if (sg_is_last(alg_ctx->sg_src)) {
 				dev_warn(rk_dev->dev, "[%s:%d], Lack of data\n",
 					 __func__, __LINE__);
 				err = -ENOMEM;
 				goto out_rx;
 			}
-			rk_dev->sg_src = sg_next(rk_dev->sg_src);
+			alg_ctx->sg_src = sg_next(alg_ctx->sg_src);
 		}
 		err = rk_ahash_set_data_start(rk_dev);
 	} else {
@@ -545,7 +557,7 @@ static int rk_ahash_crypto_rx(struct rk_crypto_dev *rk_dev)
 		err = rk_ahash_get_result(rk_dev, req->result,
 					  crypto_ahash_digestsize(tfm));
 
-		rk_dev->complete(rk_dev->async_req, err);
+		alg_ctx->ops.complete(rk_dev->async_req, err);
 		tasklet_schedule(&rk_dev->queue_task);
 	}
 
@@ -561,20 +573,23 @@ static int rk_cra_hash_init(struct crypto_tfm *tfm)
 	const char *alg_name = crypto_tfm_alg_name(tfm);
 	struct rk_ahash_ctx *ctx = crypto_tfm_ctx(tfm);
 	struct rk_crypto_dev *rk_dev = algt->rk_dev;
+	struct rk_alg_ctx *alg_ctx = &ctx->algs_ctx;
 
 	CRYPTO_TRACE();
 
+	memset(ctx, 0x00, sizeof(*ctx));
+
 	if (!rk_dev->request_crypto)
 		return -EFAULT;
 
 	rk_dev->request_crypto(rk_dev, alg_name);
 
-	rk_dev->start      = rk_ahash_start;
-	rk_dev->update     = rk_ahash_crypto_rx;
-	rk_dev->complete   = rk_ahash_crypto_complete;
-	rk_dev->irq_handle = rk_crypto_irq_handle;
+	alg_ctx->align_size     = 4;
 
-	memset(ctx, 0x00, sizeof(*ctx));
+	alg_ctx->ops.start      = rk_ahash_start;
+	alg_ctx->ops.update     = rk_ahash_crypto_rx;
+	alg_ctx->ops.complete   = rk_ahash_crypto_complete;
+	alg_ctx->ops.irq_handle = rk_crypto_irq_handle;
 
 	ctx->rk_dev = rk_dev;
 
diff --git a/drivers/crypto/rockchip/rk_crypto_v2_akcipher.c b/drivers/crypto/rockchip/rk_crypto_v2_akcipher.c
index 2781c963fd0b..928545e12432 100644
--- a/drivers/crypto/rockchip/rk_crypto_v2_akcipher.c
+++ b/drivers/crypto/rockchip/rk_crypto_v2_akcipher.c
@@ -248,9 +248,12 @@ static int rk_rsa_init_tfm(struct crypto_akcipher *tfm)
 	struct akcipher_alg *alg = __crypto_akcipher_alg(tfm->base.__crt_alg);
 	struct rk_crypto_algt *algt;
 	struct rk_crypto_dev *rk_dev;
+	struct rk_alg_ctx *alg_ctx = &ctx->algs_ctx;
 
 	CRYPTO_TRACE();
 
+	memset(ctx, 0x00, sizeof(*ctx));
+
 	algt = container_of(alg, struct rk_crypto_algt, alg.asym);
 	rk_dev = algt->rk_dev;
 
@@ -259,10 +262,11 @@ static int rk_rsa_init_tfm(struct crypto_akcipher *tfm)
 
 	rk_dev->request_crypto(rk_dev, "rsa");
 
-	rk_dev->align_size = crypto_tfm_alg_alignmask(&tfm->base) + 1;
-	rk_dev->start      = rk_rsa_start;
-	rk_dev->update     = rk_rsa_crypto_rx;
-	rk_dev->complete   = rk_rsa_complete;
+	alg_ctx->align_size     = crypto_tfm_alg_alignmask(&tfm->base) + 1;
+
+	alg_ctx->ops.start      = rk_rsa_start;
+	alg_ctx->ops.update     = rk_rsa_crypto_rx;
+	alg_ctx->ops.complete   = rk_rsa_complete;
 
 	ctx->rk_dev = rk_dev;
 

commit e9611f31d7386eecbc375b4754ab357650267f82
Author: Lin Jinhan <troy.lin@rock-chips.com>
Date:   Fri Apr 23 17:51:44 2021 +0800

    crypto: rockchip: optimize the coding style
    
    Rename some struct name and variable name been more clearly.
    
    Change-Id: Icf5e6f9d1a7e3f4abfbe05b3fb0034651a120039
    Signed-off-by: Lin Jinhan <troy.lin@rock-chips.com>

diff --git a/drivers/crypto/rockchip/rk_crypto_core.c b/drivers/crypto/rockchip/rk_crypto_core.c
index 9bf7b65acdee..07a2256edb97 100644
--- a/drivers/crypto/rockchip/rk_crypto_core.c
+++ b/drivers/crypto/rockchip/rk_crypto_core.c
@@ -51,25 +51,25 @@
 	.default_pka_offset = 0x0480,\
 }
 
-static int rk_crypto_enable_clk(struct rk_crypto_info *dev)
+static int rk_crypto_enable_clk(struct rk_crypto_dev *rk_dev)
 {
 	int ret;
 
-	dev_dbg(dev->dev, "clk_bulk_prepare_enable.\n");
+	dev_dbg(rk_dev->dev, "clk_bulk_prepare_enable.\n");
 
-	ret = clk_bulk_prepare_enable(dev->clks_num,
-				      dev->clk_bulks);
+	ret = clk_bulk_prepare_enable(rk_dev->clks_num,
+				      rk_dev->clk_bulks);
 	if (ret < 0)
-		dev_err(dev->dev, "failed to enable clks %d\n", ret);
+		dev_err(rk_dev->dev, "failed to enable clks %d\n", ret);
 
 	return ret;
 }
 
-static void rk_crypto_disable_clk(struct rk_crypto_info *dev)
+static void rk_crypto_disable_clk(struct rk_crypto_dev *rk_dev)
 {
-	dev_dbg(dev->dev, "clk_bulk_disable_unprepare.\n");
+	dev_dbg(rk_dev->dev, "clk_bulk_disable_unprepare.\n");
 
-	clk_bulk_disable_unprepare(dev->clks_num, dev->clk_bulks);
+	clk_bulk_disable_unprepare(rk_dev->clks_num, rk_dev->clk_bulks);
 }
 
 static int check_alignment(struct scatterlist *sg_src,
@@ -89,190 +89,192 @@ static int check_alignment(struct scatterlist *sg_src,
 	return (align && (sg_src->length == sg_dst->length));
 }
 
-static int rk_load_data(struct rk_crypto_info *dev,
+static int rk_load_data(struct rk_crypto_dev *rk_dev,
 			struct scatterlist *sg_src,
 			struct scatterlist *sg_dst)
 {
 	int ret = -EINVAL;
 	unsigned int count;
+	struct device *dev = rk_dev->dev;
 
-	mutex_lock(&dev->mutex);
+	mutex_lock(&rk_dev->mutex);
 
-	dev->aligned = dev->aligned ?
-		check_alignment(sg_src, sg_dst, dev->align_size) :
-		dev->aligned;
-	if (dev->aligned) {
-		count = min_t(unsigned int, dev->left_bytes, sg_src->length);
-		dev->left_bytes -= count;
+	rk_dev->aligned = rk_dev->aligned ?
+		check_alignment(sg_src, sg_dst, rk_dev->align_size) :
+		rk_dev->aligned;
+	if (rk_dev->aligned) {
+		count = min_t(unsigned int, rk_dev->left_bytes, sg_src->length);
+		rk_dev->left_bytes -= count;
 
-		if (!dma_map_sg(dev->dev, sg_src, 1, DMA_TO_DEVICE)) {
-			dev_err(dev->dev, "[%s:%d] dma_map_sg(src)  error\n",
+		if (!dma_map_sg(dev, sg_src, 1, DMA_TO_DEVICE)) {
+			dev_err(dev, "[%s:%d] dma_map_sg(src)  error\n",
 				__func__, __LINE__);
 			ret = -EINVAL;
 			goto error;
 		}
-		dev->addr_in = sg_dma_address(sg_src);
+		rk_dev->addr_in = sg_dma_address(sg_src);
 
 		if (sg_dst) {
-			if (!dma_map_sg(dev->dev, sg_dst, 1, DMA_FROM_DEVICE)) {
-				dev_err(dev->dev,
+			if (!dma_map_sg(dev, sg_dst, 1, DMA_FROM_DEVICE)) {
+				dev_err(dev,
 					"[%s:%d] dma_map_sg(dst)  error\n",
 					__func__, __LINE__);
-				dma_unmap_sg(dev->dev, sg_src, 1,
+				dma_unmap_sg(dev, sg_src, 1,
 					     DMA_TO_DEVICE);
 				ret = -EINVAL;
 				goto error;
 			}
-			dev->addr_out = sg_dma_address(sg_dst);
+			rk_dev->addr_out = sg_dma_address(sg_dst);
 		}
 	} else {
-		count = (dev->left_bytes > PAGE_SIZE) ?
-			PAGE_SIZE : dev->left_bytes;
+		count = (rk_dev->left_bytes > PAGE_SIZE) ?
+			PAGE_SIZE : rk_dev->left_bytes;
 
-		if (!sg_pcopy_to_buffer(dev->first, dev->src_nents,
-					dev->addr_vir, count,
-					dev->total - dev->left_bytes)) {
-			dev_err(dev->dev, "[%s:%d] pcopy err\n",
+		if (!sg_pcopy_to_buffer(rk_dev->first, rk_dev->src_nents,
+					rk_dev->addr_vir, count,
+					rk_dev->total - rk_dev->left_bytes)) {
+			dev_err(dev, "[%s:%d] pcopy err\n",
 				__func__, __LINE__);
 			ret = -EINVAL;
 			goto error;
 		}
-		dev->left_bytes -= count;
-		sg_init_one(&dev->sg_tmp, dev->addr_vir, count);
-		if (!dma_map_sg(dev->dev, &dev->sg_tmp, 1, DMA_TO_DEVICE)) {
-			dev_err(dev->dev, "[%s:%d] dma_map_sg(sg_tmp)  error\n",
+		rk_dev->left_bytes -= count;
+		sg_init_one(&rk_dev->sg_tmp, rk_dev->addr_vir, count);
+		if (!dma_map_sg(dev, &rk_dev->sg_tmp, 1, DMA_TO_DEVICE)) {
+			dev_err(dev, "[%s:%d] dma_map_sg(sg_tmp)  error\n",
 				__func__, __LINE__);
 			ret = -ENOMEM;
 			goto error;
 		}
-		dev->addr_in = sg_dma_address(&dev->sg_tmp);
+		rk_dev->addr_in = sg_dma_address(&rk_dev->sg_tmp);
 
 		if (sg_dst) {
-			if (!dma_map_sg(dev->dev, &dev->sg_tmp, 1,
+			if (!dma_map_sg(dev, &rk_dev->sg_tmp, 1,
 					DMA_FROM_DEVICE)) {
-				dev_err(dev->dev,
+				dev_err(dev,
 					"[%s:%d] dma_map_sg(sg_tmp)  error\n",
 					__func__, __LINE__);
-				dma_unmap_sg(dev->dev, &dev->sg_tmp, 1,
+				dma_unmap_sg(dev, &rk_dev->sg_tmp, 1,
 					     DMA_TO_DEVICE);
 				ret = -ENOMEM;
 				goto error;
 			}
-			dev->addr_out = sg_dma_address(&dev->sg_tmp);
+			rk_dev->addr_out = sg_dma_address(&rk_dev->sg_tmp);
 		}
 	}
 
-	dev->count = count;
+	rk_dev->count = count;
 	return 0;
 error:
-	mutex_unlock(&dev->mutex);
+	mutex_unlock(&rk_dev->mutex);
 	return ret;
 }
 
-static void rk_unload_data(struct rk_crypto_info *dev)
+static void rk_unload_data(struct rk_crypto_dev *rk_dev)
 {
 	struct scatterlist *sg_in, *sg_out;
 
-	sg_in = dev->aligned ? dev->sg_src : &dev->sg_tmp;
-	dma_unmap_sg(dev->dev, sg_in, 1, DMA_TO_DEVICE);
+	sg_in = rk_dev->aligned ? rk_dev->sg_src : &rk_dev->sg_tmp;
+	dma_unmap_sg(rk_dev->dev, sg_in, 1, DMA_TO_DEVICE);
 
-	if (dev->sg_dst) {
-		sg_out = dev->aligned ? dev->sg_dst : &dev->sg_tmp;
-		dma_unmap_sg(dev->dev, sg_out, 1, DMA_FROM_DEVICE);
+	if (rk_dev->sg_dst) {
+		sg_out = rk_dev->aligned ? rk_dev->sg_dst : &rk_dev->sg_tmp;
+		dma_unmap_sg(rk_dev->dev, sg_out, 1, DMA_FROM_DEVICE);
 	}
 
-	mutex_unlock(&dev->mutex);
+	mutex_unlock(&rk_dev->mutex);
 }
 
 static irqreturn_t rk_crypto_irq_handle(int irq, void *dev_id)
 {
-	struct rk_crypto_info *dev  = platform_get_drvdata(dev_id);
+	struct rk_crypto_dev *rk_dev  = platform_get_drvdata(dev_id);
 
-	spin_lock(&dev->lock);
+	spin_lock(&rk_dev->lock);
 
-	if (dev->irq_handle)
-		dev->irq_handle(irq, dev_id);
+	if (rk_dev->irq_handle)
+		rk_dev->irq_handle(irq, dev_id);
 
-	tasklet_schedule(&dev->done_task);
+	tasklet_schedule(&rk_dev->done_task);
 
-	spin_unlock(&dev->lock);
+	spin_unlock(&rk_dev->lock);
 	return IRQ_HANDLED;
 }
 
-static int rk_crypto_enqueue(struct rk_crypto_info *dev,
+static int rk_crypto_enqueue(struct rk_crypto_dev *rk_dev,
 			      struct crypto_async_request *async_req)
 {
 	unsigned long flags;
 	int ret;
 
-	spin_lock_irqsave(&dev->lock, flags);
-	ret = crypto_enqueue_request(&dev->queue, async_req);
-	if (dev->busy) {
-		spin_unlock_irqrestore(&dev->lock, flags);
+	spin_lock_irqsave(&rk_dev->lock, flags);
+	ret = crypto_enqueue_request(&rk_dev->queue, async_req);
+	if (rk_dev->busy) {
+		spin_unlock_irqrestore(&rk_dev->lock, flags);
 		return ret;
 	}
-	dev->busy = true;
-	spin_unlock_irqrestore(&dev->lock, flags);
-	tasklet_schedule(&dev->queue_task);
+	rk_dev->busy = true;
+	spin_unlock_irqrestore(&rk_dev->lock, flags);
+	tasklet_schedule(&rk_dev->queue_task);
 
 	return ret;
 }
 
 static void rk_crypto_queue_task_cb(unsigned long data)
 {
-	struct rk_crypto_info *dev = (struct rk_crypto_info *)data;
+	struct rk_crypto_dev *rk_dev = (struct rk_crypto_dev *)data;
 	struct crypto_async_request *async_req, *backlog;
 	unsigned long flags;
 	int err = 0;
 
-	dev->err = 0;
-	spin_lock_irqsave(&dev->lock, flags);
-	backlog   = crypto_get_backlog(&dev->queue);
-	async_req = crypto_dequeue_request(&dev->queue);
+	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) {
-		dev->busy = false;
-		spin_unlock_irqrestore(&dev->lock, flags);
+		rk_dev->busy = false;
+		spin_unlock_irqrestore(&rk_dev->lock, flags);
 		return;
 	}
-	spin_unlock_irqrestore(&dev->lock, flags);
+	spin_unlock_irqrestore(&rk_dev->lock, flags);
 
 	if (backlog) {
 		backlog->complete(backlog, -EINPROGRESS);
 		backlog = NULL;
 	}
 
-	dev->async_req = async_req;
-	err = dev->start(dev);
+	rk_dev->async_req = async_req;
+	err = rk_dev->start(rk_dev);
 	if (err)
-		dev->complete(dev->async_req, err);
+		rk_dev->complete(rk_dev->async_req, err);
 }
 
 static void rk_crypto_done_task_cb(unsigned long data)
 {
-	struct rk_crypto_info *dev = (struct rk_crypto_info *)data;
+	struct rk_crypto_dev *rk_dev = (struct rk_crypto_dev *)data;
 
-	if (dev->err) {
-		dev->complete(dev->async_req, dev->err);
+	if (rk_dev->err) {
+		rk_dev->complete(rk_dev->async_req, rk_dev->err);
 		return;
 	}
 
-	dev->err = dev->update(dev);
-	if (dev->err)
-		dev->complete(dev->async_req, dev->err);
+	rk_dev->err = rk_dev->update(rk_dev);
+	if (rk_dev->err)
+		rk_dev->complete(rk_dev->async_req, rk_dev->err);
 }
 
-static struct rk_crypto_tmp *rk_crypto_find_algs(struct rk_crypto_info *crypto_info, char *name)
+static struct rk_crypto_algt *rk_crypto_find_algs(struct rk_crypto_dev *rk_dev,
+						  char *name)
 {
 	u32 i;
-	struct rk_crypto_tmp **algs;
-	struct rk_crypto_tmp *tmp_algs;
+	struct rk_crypto_algt **algs;
+	struct rk_crypto_algt *tmp_algs;
 
-	algs = crypto_info->soc_data->total_algs;
+	algs = rk_dev->soc_data->total_algs;
 
-	for (i = 0; i < crypto_info->soc_data->total_algs_num; i++, algs++) {
+	for (i = 0; i < rk_dev->soc_data->total_algs_num; i++, algs++) {
 		tmp_algs = *algs;
-		tmp_algs->dev = crypto_info;
+		tmp_algs->rk_dev = rk_dev;
 
 		if (strcmp(tmp_algs->name, name) == 0)
 			return tmp_algs;
@@ -281,20 +283,20 @@ static struct rk_crypto_tmp *rk_crypto_find_algs(struct rk_crypto_info *crypto_i
 	return NULL;
 }
 
-static int rk_crypto_register(struct rk_crypto_info *crypto_info)
+static int rk_crypto_register(struct rk_crypto_dev *rk_dev)
 {
 	unsigned int i, k;
 	char **algs_name;
-	struct rk_crypto_tmp *tmp_algs;
+	struct rk_crypto_algt *tmp_algs;
 	struct rk_crypto_soc_data *soc_data;
 	int err = 0;
 
-	soc_data = crypto_info->soc_data;
+	soc_data = rk_dev->soc_data;
 
 	algs_name = soc_data->valid_algs_name;
 
 	for (i = 0; i < soc_data->valid_algs_num; i++, algs_name++) {
-		tmp_algs = rk_crypto_find_algs(crypto_info, *algs_name);
+		tmp_algs = rk_crypto_find_algs(rk_dev, *algs_name);
 		if (!tmp_algs) {
 			CRYPTO_TRACE("%s not matched!!!\n", *algs_name);
 			continue;
@@ -302,7 +304,7 @@ static int rk_crypto_register(struct rk_crypto_info *crypto_info)
 
 		CRYPTO_TRACE("%s matched!!!\n", *algs_name);
 
-		tmp_algs->dev = crypto_info;
+		tmp_algs->rk_dev = rk_dev;
 
 		if (tmp_algs->type == ALG_TYPE_CIPHER) {
 			if (tmp_algs->algo == CIPHER_ALGO_AES &&
@@ -330,7 +332,7 @@ static int rk_crypto_register(struct rk_crypto_info *crypto_info)
 	algs_name = soc_data->valid_algs_name;
 
 	for (k = 0; k < i; k++, algs_name++) {
-		tmp_algs = rk_crypto_find_algs(crypto_info, *algs_name);
+		tmp_algs = rk_crypto_find_algs(rk_dev, *algs_name);
 		if (tmp_algs->type == ALG_TYPE_CIPHER)
 			crypto_unregister_alg(&tmp_algs->alg.crypto);
 		else if (tmp_algs->type == ALG_TYPE_HASH || tmp_algs->type == ALG_TYPE_HMAC)
@@ -341,16 +343,16 @@ static int rk_crypto_register(struct rk_crypto_info *crypto_info)
 	return err;
 }
 
-static void rk_crypto_unregister(struct rk_crypto_info *crypto_info)
+static void rk_crypto_unregister(struct rk_crypto_dev *rk_dev)
 {
 	unsigned int i;
 	char **algs_name;
-	struct rk_crypto_tmp *tmp_algs;
+	struct rk_crypto_algt *tmp_algs;
 
-	algs_name = crypto_info->soc_data->valid_algs_name;
+	algs_name = rk_dev->soc_data->valid_algs_name;
 
-	for (i = 0; i < crypto_info->soc_data->valid_algs_num; i++, algs_name++) {
-		tmp_algs = rk_crypto_find_algs(crypto_info, *algs_name);
+	for (i = 0; i < rk_dev->soc_data->valid_algs_num; i++, algs_name++) {
+		tmp_algs = rk_crypto_find_algs(rk_dev, *algs_name);
 		if (tmp_algs->type == ALG_TYPE_CIPHER)
 			crypto_unregister_alg(&tmp_algs->alg.crypto);
 		else if (tmp_algs->type == ALG_TYPE_HASH || tmp_algs->type == ALG_TYPE_HMAC)
@@ -360,33 +362,33 @@ static void rk_crypto_unregister(struct rk_crypto_info *crypto_info)
 	}
 }
 
-static void rk_crypto_request(struct rk_crypto_info *dev, const char *name)
+static void rk_crypto_request(struct rk_crypto_dev *rk_dev, const char *name)
 {
 	CRYPTO_TRACE("Crypto is requested by %s\n", name);
 
-	rk_crypto_enable_clk(dev);
+	rk_crypto_enable_clk(rk_dev);
 }
 
-static void rk_crypto_release(struct rk_crypto_info *dev, const char *name)
+static void rk_crypto_release(struct rk_crypto_dev *rk_dev, const char *name)
 {
 	CRYPTO_TRACE("Crypto is released by %s\n", name);
 
-	rk_crypto_disable_clk(dev);
+	rk_crypto_disable_clk(rk_dev);
 }
 
 static void rk_crypto_action(void *data)
 {
-	struct rk_crypto_info *crypto_info = data;
+	struct rk_crypto_dev *rk_dev = data;
 
-	if (crypto_info->rst)
-		reset_control_assert(crypto_info->rst);
+	if (rk_dev->rst)
+		reset_control_assert(rk_dev->rst);
 }
 
 static const char * const crypto_v2_rsts[] = {
 	"crypto-rst",
 };
 
-static struct rk_crypto_tmp *crypto_v2_algs[] = {
+static struct rk_crypto_algt *crypto_v2_algs[] = {
 	&rk_v2_ecb_sm4_alg,		/* ecb(sm4) */
 	&rk_v2_cbc_sm4_alg,		/* cbc(sm4) */
 	&rk_v2_xts_sm4_alg,		/* xts(sm4) */
@@ -417,11 +419,11 @@ static struct rk_crypto_tmp *crypto_v2_algs[] = {
 	&rk_v2_ahash_md5,		/* md5 */
 	&rk_v2_ahash_sm3,		/* sm3 */
 
-	&rk_v2_ahash_hmac_sha1,		/* hmac(sha1) */
-	&rk_v2_ahash_hmac_sha256,	/* hmac(sha256) */
-	&rk_v2_ahash_hmac_sha512,	/* hmac(sha512) */
-	&rk_v2_ahash_hmac_md5,		/* hmac(md5) */
-	&rk_v2_ahash_hmac_sm3,		/* hmac(sm3) */
+	&rk_v2_hmac_sha1,		/* hmac(sha1) */
+	&rk_v2_hmac_sha256,		/* hmac(sha256) */
+	&rk_v2_hmac_sha512,		/* hmac(sha512) */
+	&rk_v2_hmac_md5,		/* hmac(md5) */
+	&rk_v2_hmac_sm3,		/* hmac(sm3) */
 
 	&rk_v2_asym_rsa,		/* rsa */
 };
@@ -466,7 +468,7 @@ static const char * const crypto_v1_rsts[] = {
 	"crypto-rst",
 };
 
-static struct rk_crypto_tmp *crypto_v1_algs[] = {
+static struct rk_crypto_algt *crypto_v1_algs[] = {
 	&rk_v1_ecb_aes_alg,		/* ecb(aes) */
 	&rk_v1_cbc_aes_alg,		/* cbc(aes) */
 
@@ -520,117 +522,117 @@ static int rk_crypto_probe(struct platform_device *pdev)
 	struct resource *res;
 	struct device *dev = &pdev->dev;
 	struct device_node *np = pdev->dev.of_node;
+	struct rk_crypto_soc_data *soc_data;
 	const struct of_device_id *match;
-	struct rk_crypto_info *crypto_info;
+	struct rk_crypto_dev *rk_dev;
 	int err = 0;
 
-	crypto_info = devm_kzalloc(&pdev->dev,
-				   sizeof(*crypto_info), GFP_KERNEL);
-	if (!crypto_info) {
+	rk_dev = devm_kzalloc(&pdev->dev,
+				   sizeof(*rk_dev), GFP_KERNEL);
+	if (!rk_dev) {
 		err = -ENOMEM;
 		goto err_crypto;
 	}
 
 	match = of_match_node(crypto_of_id_table, np);
-	crypto_info->soc_data = (struct rk_crypto_soc_data *)match->data;
-
-	if (crypto_info->soc_data->rsts[0]) {
-		crypto_info->rst =
-			devm_reset_control_get(dev,
-					       crypto_info->soc_data->rsts[0]);
-		if (IS_ERR(crypto_info->rst)) {
-			err = PTR_ERR(crypto_info->rst);
+	soc_data = (struct rk_crypto_soc_data *)match->data;
+	rk_dev->soc_data = soc_data;
+
+	if (soc_data->rsts[0]) {
+		rk_dev->rst =
+			devm_reset_control_get(dev, soc_data->rsts[0]);
+		if (IS_ERR(rk_dev->rst)) {
+			err = PTR_ERR(rk_dev->rst);
 			goto err_crypto;
 		}
-		reset_control_assert(crypto_info->rst);
+		reset_control_assert(rk_dev->rst);
 		usleep_range(10, 20);
-		reset_control_deassert(crypto_info->rst);
+		reset_control_deassert(rk_dev->rst);
 	}
 
-	err = devm_add_action_or_reset(dev, rk_crypto_action, crypto_info);
+	err = devm_add_action_or_reset(dev, rk_crypto_action, rk_dev);
 	if (err)
 		goto err_crypto;
 
-	spin_lock_init(&crypto_info->lock);
+	spin_lock_init(&rk_dev->lock);
 
 	/* get crypto base */
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-	crypto_info->reg = devm_ioremap_resource(&pdev->dev, res);
-	if (IS_ERR(crypto_info->reg)) {
-		err = PTR_ERR(crypto_info->reg);
+	rk_dev->reg = devm_ioremap_resource(dev, res);
+	if (IS_ERR(rk_dev->reg)) {
+		err = PTR_ERR(rk_dev->reg);
 		goto err_crypto;
 	}
 
 	/* get pka base, if pka reg not set, pka reg = crypto + pka offset */
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
-	crypto_info->pka_reg = devm_ioremap_resource(&pdev->dev, res);
-	if (IS_ERR(crypto_info->pka_reg))
-		crypto_info->pka_reg = crypto_info->reg + crypto_info->soc_data->default_pka_offset;
+	rk_dev->pka_reg = devm_ioremap_resource(dev, res);
+	if (IS_ERR(rk_dev->pka_reg))
+		rk_dev->pka_reg = rk_dev->reg + soc_data->default_pka_offset;
 
-	crypto_info->clks_num = devm_clk_bulk_get_all(&pdev->dev, &crypto_info->clk_bulks);
-	if (crypto_info->clks_num < 0) {
-		dev_err(&pdev->dev, "failed to get clks property\n");
+	rk_dev->clks_num = devm_clk_bulk_get_all(dev, &rk_dev->clk_bulks);
+	if (rk_dev->clks_num < 0) {
+		dev_err(dev, "failed to get clks property\n");
 		goto err_crypto;
 	}
 
-	crypto_info->irq = platform_get_irq(pdev, 0);
-	if (crypto_info->irq < 0) {
-		dev_warn(crypto_info->dev,
+	rk_dev->irq = platform_get_irq(pdev, 0);
+	if (rk_dev->irq < 0) {
+		dev_warn(dev,
 			 "control Interrupt is not available.\n");
-		err = crypto_info->irq;
+		err = rk_dev->irq;
 		goto err_crypto;
 	}
 
-	err = devm_request_irq(&pdev->dev, crypto_info->irq,
+	err = devm_request_irq(dev, rk_dev->irq,
 			       rk_crypto_irq_handle, IRQF_SHARED,
 			       "rk-crypto", pdev);
 
 	if (err) {
-		dev_err(crypto_info->dev, "irq request failed.\n");
+		dev_err(dev, "irq request failed.\n");
 		goto err_crypto;
 	}
 
-	crypto_info->dev = &pdev->dev;
+	rk_dev->dev = dev;
 
-	crypto_info->hw_info =
-		devm_kzalloc(&pdev->dev,
-			     crypto_info->soc_data->hw_info_size, GFP_KERNEL);
-	if (!crypto_info->hw_info) {
+	rk_dev->hw_info =
+		devm_kzalloc(dev, soc_data->hw_info_size, GFP_KERNEL);
+	if (!rk_dev->hw_info) {
 		err = -ENOMEM;
 		goto err_crypto;
 	}
 
-	err = crypto_info->soc_data->hw_init(&pdev->dev, crypto_info->hw_info);
+	err = soc_data->hw_init(dev, rk_dev->hw_info);
 	if (err) {
-		dev_err(crypto_info->dev, "hw_init failed.\n");
+		dev_err(dev, "hw_init failed.\n");
 		goto err_crypto;
 	}
 
-	crypto_info->addr_vir = (char *)__get_free_page(GFP_KERNEL);
-	if (!crypto_info->addr_vir) {
+	rk_dev->addr_vir = (char *)__get_free_page(GFP_KERNEL);
+	if (!rk_dev->addr_vir) {
 		err = -ENOMEM;
-		dev_err(crypto_info->dev, "__get_free_page failed.\n");
+		dev_err(dev, "__get_free_page failed.\n");
 		goto err_crypto;
 	}
 
-	platform_set_drvdata(pdev, crypto_info);
+	platform_set_drvdata(pdev, rk_dev);
 
-	tasklet_init(&crypto_info->queue_task,
-		     rk_crypto_queue_task_cb, (unsigned long)crypto_info);
-	tasklet_init(&crypto_info->done_task,
-		     rk_crypto_done_task_cb, (unsigned long)crypto_info);
-	crypto_init_queue(&crypto_info->queue, 50);
+	tasklet_init(&rk_dev->queue_task,
+		     rk_crypto_queue_task_cb, (unsigned long)rk_dev);
+	tasklet_init(&rk_dev->done_task,
+		     rk_crypto_done_task_cb, (unsigned long)rk_dev);
+	crypto_init_queue(&rk_dev->queue, 50);
 
-	mutex_init(&crypto_info->mutex);
+	mutex_init(&rk_dev->mutex);
 
-	crypto_info->request_crypto = rk_crypto_request;
-	crypto_info->release_crypto = rk_crypto_release;
-	crypto_info->load_data = rk_load_data;
-	crypto_info->unload_data = rk_unload_data;
-	crypto_info->enqueue = rk_crypto_enqueue;
-	crypto_info->busy = false;
+	rk_dev->request_crypto = rk_crypto_request;
+	rk_dev->release_crypto = rk_crypto_release;
+	rk_dev->load_data = rk_load_data;
+	rk_dev->unload_data = rk_unload_data;
+	rk_dev->enqueue = rk_crypto_enqueue;
+	rk_dev->busy = false;
 
-	err = rk_crypto_register(crypto_info);
+	err = rk_crypto_register(rk_dev);
 	if (err) {
 		dev_err(dev, "err in register alg");
 		goto err_register_alg;
@@ -640,27 +642,27 @@ static int rk_crypto_probe(struct platform_device *pdev)
 	return 0;
 
 err_register_alg:
-	mutex_destroy(&crypto_info->mutex);
-	tasklet_kill(&crypto_info->queue_task);
-	tasklet_kill(&crypto_info->done_task);
+	mutex_destroy(&rk_dev->mutex);
+	tasklet_kill(&rk_dev->queue_task);
+	tasklet_kill(&rk_dev->done_task);
 err_crypto:
 	return err;
 }
 
 static int rk_crypto_remove(struct platform_device *pdev)
 {
-	struct rk_crypto_info *crypto_info = platform_get_drvdata(pdev);
+	struct rk_crypto_dev *rk_dev = platform_get_drvdata(pdev);
 
-	rk_crypto_unregister(crypto_info);
-	tasklet_kill(&crypto_info->done_task);
-	tasklet_kill(&crypto_info->queue_task);
+	rk_crypto_unregister(rk_dev);
+	tasklet_kill(&rk_dev->done_task);
+	tasklet_kill(&rk_dev->queue_task);
 
-	if (crypto_info->addr_vir)
-		free_page((unsigned long)crypto_info->addr_vir);
+	if (rk_dev->addr_vir)
+		free_page((unsigned long)rk_dev->addr_vir);
 
-	crypto_info->soc_data->hw_deinit(&pdev->dev, crypto_info->hw_info);
+	rk_dev->soc_data->hw_deinit(&pdev->dev, rk_dev->hw_info);
 
-	mutex_destroy(&crypto_info->mutex);
+	mutex_destroy(&rk_dev->mutex);
 
 	return 0;
 }
diff --git a/drivers/crypto/rockchip/rk_crypto_core.h b/drivers/crypto/rockchip/rk_crypto_core.h
index 8b81fc4364a6..d04c1f8f39bd 100644
--- a/drivers/crypto/rockchip/rk_crypto_core.h
+++ b/drivers/crypto/rockchip/rk_crypto_core.h
@@ -27,7 +27,7 @@
 struct rk_crypto_soc_data {
 	char				**valid_algs_name;
 	int				valid_algs_num;
-	struct rk_crypto_tmp		**total_algs;
+	struct rk_crypto_algt		**total_algs;
 	int				total_algs_num;
 	const char * const		*rsts;
 	int				rsts_num;
@@ -38,7 +38,7 @@ struct rk_crypto_soc_data {
 	void (*hw_deinit)(struct device *dev, void *hw_info);
 };
 
-struct rk_crypto_info {
+struct rk_crypto_dev {
 	struct device			*dev;
 	struct reset_control		*rst;
 	void __iomem			*reg;
@@ -47,49 +47,54 @@ struct rk_crypto_info {
 	struct crypto_queue		queue;
 	struct tasklet_struct		queue_task;
 	struct tasklet_struct		done_task;
-	struct crypto_async_request	*async_req;
 	int				err;
 	void				*hw_info;
+	struct rk_crypto_soc_data	*soc_data;
+	int clks_num;
+	struct clk_bulk_data		*clk_bulks;
+
 	/* device lock */
 	spinlock_t			lock;
 	struct mutex			mutex;
 
 	/* the public variable */
+	struct crypto_async_request	*async_req;
+	void				*addr_vir;
 	struct scatterlist		*sg_src;
 	struct scatterlist		*sg_dst;
 	struct scatterlist		sg_tmp;
 	struct scatterlist		*first;
-	struct rk_crypto_soc_data	*soc_data;
-	int clks_num;
-	struct clk_bulk_data		*clk_bulks;
-	unsigned int			left_bytes;
-	void				*addr_vir;
-	int				aligned;
-	int				align_size;
 	size_t				src_nents;
 	size_t				dst_nents;
+
 	unsigned int			total;
 	unsigned int			count;
+	unsigned int			left_bytes;
+
 	dma_addr_t			addr_in;
 	dma_addr_t			addr_out;
+
+	int				aligned;
+	int				align_size;
+
 	bool				busy;
-	void (*request_crypto)(struct rk_crypto_info *dev, const char *name);
-	void (*release_crypto)(struct rk_crypto_info *dev, const char *name);
-	int (*start)(struct rk_crypto_info *dev);
-	int (*update)(struct rk_crypto_info *dev);
+	void (*request_crypto)(struct rk_crypto_dev *rk_dev, const char *name);
+	void (*release_crypto)(struct rk_crypto_dev *rk_dev, const char *name);
+	int (*start)(struct rk_crypto_dev *rk_dev);
+	int (*update)(struct rk_crypto_dev *rk_dev);
 	void (*complete)(struct crypto_async_request *base, int err);
 	int (*irq_handle)(int irq, void *dev_id);
-	int (*load_data)(struct rk_crypto_info *dev,
+	int (*load_data)(struct rk_crypto_dev *rk_dev,
 			 struct scatterlist *sg_src,
 			 struct scatterlist *sg_dst);
-	void (*unload_data)(struct rk_crypto_info *dev);
-	int (*enqueue)(struct rk_crypto_info *dev,
+	void (*unload_data)(struct rk_crypto_dev *rk_dev);
+	int (*enqueue)(struct rk_crypto_dev *rk_dev,
 		       struct crypto_async_request *async_req);
 };
 
 /* the private variable of hash */
 struct rk_ahash_ctx {
-	struct rk_crypto_info		*dev;
+	struct rk_crypto_dev		*rk_dev;
 	u8				authkey[SHA512_BLOCK_SIZE];
 
 	/* for fallback */
@@ -104,7 +109,7 @@ struct rk_ahash_rctx {
 
 /* the private variable of cipher */
 struct rk_cipher_ctx {
-	struct rk_crypto_info		*dev;
+	struct rk_crypto_dev		*rk_dev;
 	unsigned char			key[AES_MAX_KEY_SIZE * 2];
 	unsigned int			keylen;
 	u32				mode;
@@ -119,7 +124,7 @@ struct rk_rsa_ctx {
 	struct rk_bignum *e;
 	struct rk_bignum *d;
 
-	struct rk_crypto_info		*dev;
+	struct rk_crypto_dev		*rk_dev;
 };
 
 enum alg_type {
@@ -129,8 +134,8 @@ enum alg_type {
 	ALG_TYPE_ASYM,
 };
 
-struct rk_crypto_tmp {
-	struct rk_crypto_info		*dev;
+struct rk_crypto_algt {
+	struct rk_crypto_dev		*rk_dev;
 	union {
 		struct crypto_alg	crypto;
 		struct ahash_alg	hash;
diff --git a/drivers/crypto/rockchip/rk_crypto_v1.h b/drivers/crypto/rockchip/rk_crypto_v1.h
index 348257428009..d02ad537871a 100644
--- a/drivers/crypto/rockchip/rk_crypto_v1.h
+++ b/drivers/crypto/rockchip/rk_crypto_v1.h
@@ -11,18 +11,18 @@ struct rk_hw_crypto_v1_info {
 	int	reserved;
 };
 
-extern struct rk_crypto_tmp rk_v1_ecb_aes_alg;
-extern struct rk_crypto_tmp rk_v1_cbc_aes_alg;
+extern struct rk_crypto_algt rk_v1_ecb_aes_alg;
+extern struct rk_crypto_algt rk_v1_cbc_aes_alg;
 
-extern struct rk_crypto_tmp rk_v1_ecb_des_alg;
-extern struct rk_crypto_tmp rk_v1_cbc_des_alg;
+extern struct rk_crypto_algt rk_v1_ecb_des_alg;
+extern struct rk_crypto_algt rk_v1_cbc_des_alg;
 
-extern struct rk_crypto_tmp rk_v1_ecb_des3_ede_alg;
-extern struct rk_crypto_tmp rk_v1_cbc_des3_ede_alg;
+extern struct rk_crypto_algt rk_v1_ecb_des3_ede_alg;
+extern struct rk_crypto_algt rk_v1_cbc_des3_ede_alg;
 
-extern struct rk_crypto_tmp rk_v1_ahash_sha1;
-extern struct rk_crypto_tmp rk_v1_ahash_sha256;
-extern struct rk_crypto_tmp rk_v1_ahash_md5;
+extern struct rk_crypto_algt rk_v1_ahash_sha1;
+extern struct rk_crypto_algt rk_v1_ahash_sha256;
+extern struct rk_crypto_algt rk_v1_ahash_md5;
 
 int rk_hw_crypto_v1_init(struct device *dev, void *hw_info);
 void rk_hw_crypto_v1_deinit(struct device *dev, void *hw_info);
diff --git a/drivers/crypto/rockchip/rk_crypto_v1_ablkcipher.c b/drivers/crypto/rockchip/rk_crypto_v1_ablkcipher.c
index 69ad820ffe48..3a1376b1e455 100644
--- a/drivers/crypto/rockchip/rk_crypto_v1_ablkcipher.c
+++ b/drivers/crypto/rockchip/rk_crypto_v1_ablkcipher.c
@@ -16,15 +16,15 @@
 
 static int rk_crypto_irq_handle(int irq, void *dev_id)
 {
-	struct rk_crypto_info *dev  = platform_get_drvdata(dev_id);
+	struct rk_crypto_dev *rk_dev  = platform_get_drvdata(dev_id);
 	u32 interrupt_status;
 
-	interrupt_status = CRYPTO_READ(dev, RK_CRYPTO_INTSTS);
-	CRYPTO_WRITE(dev, RK_CRYPTO_INTSTS, interrupt_status);
+	interrupt_status = CRYPTO_READ(rk_dev, RK_CRYPTO_INTSTS);
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_INTSTS, interrupt_status);
 
 	if (interrupt_status & 0x0a) {
-		dev_warn(dev->dev, "DMA Error\n");
-		dev->err = -EFAULT;
+		dev_warn(rk_dev->dev, "DMA Error\n");
+		rk_dev->err = -EFAULT;
 	}
 
 	return 0;
@@ -36,13 +36,13 @@ static void rk_crypto_complete(struct crypto_async_request *base, int err)
 		base->complete(base, err);
 }
 
-static int rk_handle_req(struct rk_crypto_info *dev,
+static int rk_handle_req(struct rk_crypto_dev *rk_dev,
 			 struct ablkcipher_request *req)
 {
-	if (!IS_ALIGNED(req->nbytes, dev->align_size))
+	if (!IS_ALIGNED(req->nbytes, rk_dev->align_size))
 		return -EINVAL;
 	else
-		return dev->enqueue(dev, &req->base);
+		return rk_dev->enqueue(rk_dev, &req->base);
 }
 
 static int rk_get_bc(u32 algo, u32 mode, u32 *bc_val)
@@ -85,10 +85,10 @@ static int rk_cipher_setkey(struct crypto_ablkcipher *cipher,
 	struct crypto_tfm *tfm = crypto_ablkcipher_tfm(cipher);
 	struct rk_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
 	struct crypto_alg *alg = tfm->__crt_alg;
-	struct rk_crypto_tmp *algt;
+	struct rk_crypto_algt *algt;
 	u32 tmp[DES_EXPKEY_WORDS];
 
-	algt = container_of(alg, struct rk_crypto_tmp, alg.crypto);
+	algt = container_of(alg, struct rk_crypto_algt, alg.crypto);
 
 	CRYPTO_MSG("algo = %x, mode = %x, key_len = %d\n",
 		   algt->algo, algt->mode, keylen);
@@ -134,11 +134,11 @@ static int rk_cipher_encrypt(struct ablkcipher_request *req)
 	struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
 	struct rk_cipher_ctx *ctx = crypto_ablkcipher_ctx(tfm);
 	struct crypto_alg *alg = tfm->base.__crt_alg;
-	struct rk_crypto_info *dev = ctx->dev;
-	struct rk_crypto_tmp *algt;
+	struct rk_crypto_dev *rk_dev = ctx->rk_dev;
+	struct rk_crypto_algt *algt;
 	int ret;
 
-	algt = container_of(alg, struct rk_crypto_tmp, alg.crypto);
+	algt = container_of(alg, struct rk_crypto_algt, alg.crypto);
 
 	ret = rk_get_bc(algt->algo, algt->mode, &ctx->mode);
 	if (ret)
@@ -146,7 +146,7 @@ static int rk_cipher_encrypt(struct ablkcipher_request *req)
 
 	CRYPTO_MSG("ctx->mode = %x\n", ctx->mode);
 
-	return rk_handle_req(dev, req);
+	return rk_handle_req(rk_dev, req);
 }
 
 static int rk_cipher_decrypt(struct ablkcipher_request *req)
@@ -154,11 +154,11 @@ static int rk_cipher_decrypt(struct ablkcipher_request *req)
 	struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
 	struct rk_cipher_ctx *ctx = crypto_ablkcipher_ctx(tfm);
 	struct crypto_alg *alg = tfm->base.__crt_alg;
-	struct rk_crypto_info *dev = ctx->dev;
-	struct rk_crypto_tmp *algt;
+	struct rk_crypto_dev *rk_dev = ctx->rk_dev;
+	struct rk_crypto_algt *algt;
 	int ret;
 
-	algt = container_of(alg, struct rk_crypto_tmp, alg.crypto);
+	algt = container_of(alg, struct rk_crypto_algt, alg.crypto);
 
 	ret = rk_get_bc(algt->algo, algt->mode, &ctx->mode);
 	if (ret)
@@ -168,13 +168,13 @@ static int rk_cipher_decrypt(struct ablkcipher_request *req)
 
 	CRYPTO_MSG("ctx->mode = %x\n", ctx->mode);
 
-	return rk_handle_req(dev, req);
+	return rk_handle_req(rk_dev, req);
 }
 
-static void rk_ablk_hw_init(struct rk_crypto_info *dev)
+static void rk_ablk_hw_init(struct rk_crypto_dev *rk_dev)
 {
 	struct ablkcipher_request *req =
-		ablkcipher_request_cast(dev->async_req);
+		ablkcipher_request_cast(rk_dev->async_req);
 	struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(req);
 	struct crypto_tfm *tfm = crypto_ablkcipher_tfm(cipher);
 	struct rk_cipher_ctx *ctx = crypto_ablkcipher_ctx(cipher);
@@ -184,16 +184,17 @@ static void rk_ablk_hw_init(struct rk_crypto_info *dev)
 	ivsize = crypto_ablkcipher_ivsize(cipher);
 
 	if (block == DES_BLOCK_SIZE) {
-		memcpy_toio(ctx->dev->reg + RK_CRYPTO_TDES_KEY1_0,
+		memcpy_toio(ctx->rk_dev->reg + RK_CRYPTO_TDES_KEY1_0,
 			    ctx->key, ctx->keylen);
 		ctx->mode |= RK_CRYPTO_TDES_FIFO_MODE |
 			     RK_CRYPTO_TDES_BYTESWAP_KEY |
 			     RK_CRYPTO_TDES_BYTESWAP_IV;
-		CRYPTO_WRITE(dev, RK_CRYPTO_TDES_CTRL, ctx->mode);
-		memcpy_toio(dev->reg + RK_CRYPTO_TDES_IV_0, req->info, ivsize);
+		CRYPTO_WRITE(rk_dev, RK_CRYPTO_TDES_CTRL, ctx->mode);
+		memcpy_toio(rk_dev->reg + RK_CRYPTO_TDES_IV_0,
+			    req->info, ivsize);
 		conf_reg = RK_CRYPTO_DESSEL;
 	} else {
-		memcpy_toio(ctx->dev->reg + RK_CRYPTO_AES_KEY_0,
+		memcpy_toio(ctx->rk_dev->reg + RK_CRYPTO_AES_KEY_0,
 			    ctx->key, ctx->keylen);
 		ctx->mode |= RK_CRYPTO_AES_FIFO_MODE |
 			     RK_CRYPTO_AES_KEY_CHANGE |
@@ -203,98 +204,99 @@ static void rk_ablk_hw_init(struct rk_crypto_info *dev)
 			ctx->mode |= RK_CRYPTO_AES_192BIT_key;
 		else if (ctx->keylen == AES_KEYSIZE_256)
 			ctx->mode |= RK_CRYPTO_AES_256BIT_key;
-		CRYPTO_WRITE(dev, RK_CRYPTO_AES_CTRL, ctx->mode);
-		memcpy_toio(dev->reg + RK_CRYPTO_AES_IV_0, req->info, ivsize);
+		CRYPTO_WRITE(rk_dev, RK_CRYPTO_AES_CTRL, ctx->mode);
+		memcpy_toio(rk_dev->reg + RK_CRYPTO_AES_IV_0,
+			    req->info, ivsize);
 	}
 	conf_reg |= RK_CRYPTO_BYTESWAP_BTFIFO |
 		    RK_CRYPTO_BYTESWAP_BRFIFO;
-	CRYPTO_WRITE(dev, RK_CRYPTO_CONF, conf_reg);
-	CRYPTO_WRITE(dev, RK_CRYPTO_INTENA,
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_CONF, conf_reg);
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_INTENA,
 		     RK_CRYPTO_BCDMA_ERR_ENA | RK_CRYPTO_BCDMA_DONE_ENA);
 }
 
-static void crypto_dma_start(struct rk_crypto_info *dev)
+static void crypto_dma_start(struct rk_crypto_dev *rk_dev)
 {
-	CRYPTO_WRITE(dev, RK_CRYPTO_BRDMAS, dev->addr_in);
-	CRYPTO_WRITE(dev, RK_CRYPTO_BRDMAL, dev->count / 4);
-	CRYPTO_WRITE(dev, RK_CRYPTO_BTDMAS, dev->addr_out);
-	CRYPTO_WRITE(dev, RK_CRYPTO_CTRL, RK_CRYPTO_BLOCK_START |
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_BRDMAS, rk_dev->addr_in);
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_BRDMAL, rk_dev->count / 4);
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_BTDMAS, rk_dev->addr_out);
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_CTRL, RK_CRYPTO_BLOCK_START |
 		     _SBF(RK_CRYPTO_BLOCK_START, 16));
 }
 
-static int rk_set_data_start(struct rk_crypto_info *dev)
+static int rk_set_data_start(struct rk_crypto_dev *rk_dev)
 {
 	int err;
 	struct ablkcipher_request *req =
-		ablkcipher_request_cast(dev->async_req);
+		ablkcipher_request_cast(rk_dev->async_req);
 	struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
 	struct rk_cipher_ctx *ctx = crypto_ablkcipher_ctx(tfm);
 	u32 ivsize = crypto_ablkcipher_ivsize(tfm);
-	u8 *src_last_blk = page_address(sg_page(dev->sg_src)) +
-		dev->sg_src->offset + dev->sg_src->length - ivsize;
+	u8 *src_last_blk = page_address(sg_page(rk_dev->sg_src)) +
+		rk_dev->sg_src->offset + rk_dev->sg_src->length - ivsize;
 
 	/* Store the iv that need to be updated in chain mode.
 	 * And update the IV buffer to contain the next IV for decryption mode.
 	 */
 	if (ctx->mode & RK_CRYPTO_DEC) {
 		memcpy(ctx->iv, src_last_blk, ivsize);
-		sg_pcopy_to_buffer(dev->first, dev->src_nents, req->info,
-				   ivsize, dev->total - ivsize);
+		sg_pcopy_to_buffer(rk_dev->first, rk_dev->src_nents, req->info,
+				   ivsize, rk_dev->total - ivsize);
 	}
 
-	err = dev->load_data(dev, dev->sg_src, dev->sg_dst);
+	err = rk_dev->load_data(rk_dev, rk_dev->sg_src, rk_dev->sg_dst);
 	if (!err)
-		crypto_dma_start(dev);
+		crypto_dma_start(rk_dev);
 	return err;
 }
 
-static int rk_ablk_start(struct rk_crypto_info *dev)
+static int rk_ablk_start(struct rk_crypto_dev *rk_dev)
 {
 	struct ablkcipher_request *req =
-		ablkcipher_request_cast(dev->async_req);
+		ablkcipher_request_cast(rk_dev->async_req);
 	unsigned long flags;
 	int err = 0;
 
-	dev->left_bytes = req->nbytes;
-	dev->total = req->nbytes;
-	dev->sg_src = req->src;
-	dev->first = req->src;
-	dev->src_nents = sg_nents(req->src);
-	dev->sg_dst = req->dst;
-	dev->dst_nents = sg_nents(req->dst);
-	dev->aligned = 1;
-
-	spin_lock_irqsave(&dev->lock, flags);
-	rk_ablk_hw_init(dev);
-	err = rk_set_data_start(dev);
-	spin_unlock_irqrestore(&dev->lock, flags);
+	rk_dev->left_bytes = req->nbytes;
+	rk_dev->total      = req->nbytes;
+	rk_dev->sg_src     = req->src;
+	rk_dev->first      = req->src;
+	rk_dev->src_nents  = sg_nents(req->src);
+	rk_dev->sg_dst     = req->dst;
+	rk_dev->dst_nents  = sg_nents(req->dst);
+	rk_dev->aligned    = 1;
+
+	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;
 }
 
-static void rk_iv_copyback(struct rk_crypto_info *dev)
+static void rk_iv_copyback(struct rk_crypto_dev *rk_dev)
 {
 	struct ablkcipher_request *req =
-		ablkcipher_request_cast(dev->async_req);
+		ablkcipher_request_cast(rk_dev->async_req);
 	struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
 	struct rk_cipher_ctx *ctx = crypto_ablkcipher_ctx(tfm);
 	u32 ivsize = crypto_ablkcipher_ivsize(tfm);
 
 	/* Update the IV buffer to contain the next IV for encryption mode. */
 	if (!(ctx->mode & RK_CRYPTO_DEC) && req->info) {
-		if (dev->aligned) {
-			memcpy(req->info, sg_virt(dev->sg_dst) +
-				dev->sg_dst->length - ivsize, ivsize);
+		if (rk_dev->aligned) {
+			memcpy(req->info, sg_virt(rk_dev->sg_dst) +
+				rk_dev->sg_dst->length - ivsize, ivsize);
 		} else {
-			memcpy(req->info, dev->addr_vir +
-				dev->count - ivsize, ivsize);
+			memcpy(req->info, rk_dev->addr_vir +
+				rk_dev->count - ivsize, ivsize);
 		}
 	}
 }
 
-static void rk_update_iv(struct rk_crypto_info *dev)
+static void rk_update_iv(struct rk_crypto_dev *rk_dev)
 {
 	struct ablkcipher_request *req =
-		ablkcipher_request_cast(dev->async_req);
+		ablkcipher_request_cast(rk_dev->async_req);
 	struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
 	struct rk_cipher_ctx *ctx = crypto_ablkcipher_ctx(tfm);
 	u32 ivsize = crypto_ablkcipher_ivsize(tfm);
@@ -303,54 +305,55 @@ static void rk_update_iv(struct rk_crypto_info *dev)
 	if (ctx->mode & RK_CRYPTO_DEC) {
 		new_iv = ctx->iv;
 	} else {
-		new_iv = page_address(sg_page(dev->sg_dst)) +
-			 dev->sg_dst->offset + dev->sg_dst->length - ivsize;
+		new_iv = page_address(sg_page(rk_dev->sg_dst)) +
+			 rk_dev->sg_dst->offset +
+			 rk_dev->sg_dst->length - ivsize;
 	}
 
 	if (ivsize == DES_BLOCK_SIZE)
-		memcpy_toio(dev->reg + RK_CRYPTO_TDES_IV_0, new_iv, ivsize);
+		memcpy_toio(rk_dev->reg + RK_CRYPTO_TDES_IV_0, new_iv, ivsize);
 	else if (ivsize == AES_BLOCK_SIZE)
-		memcpy_toio(dev->reg + RK_CRYPTO_AES_IV_0, new_iv, ivsize);
+		memcpy_toio(rk_dev->reg + RK_CRYPTO_AES_IV_0, new_iv, ivsize);
 }
 
 /* return:
  *	true	some err was occurred
  *	fault	no err, continue
  */
-static int rk_ablk_rx(struct rk_crypto_info *dev)
+static int rk_ablk_rx(struct rk_crypto_dev *rk_dev)
 {
 	int err = 0;
 	struct ablkcipher_request *req =
-		ablkcipher_request_cast(dev->async_req);
-
-	dev->unload_data(dev);
-	if (!dev->aligned) {
-		if (!sg_pcopy_from_buffer(req->dst, dev->dst_nents,
-					  dev->addr_vir, dev->count,
-					  dev->total - dev->left_bytes -
-					  dev->count)) {
+		ablkcipher_request_cast(rk_dev->async_req);
+
+	rk_dev->unload_data(rk_dev);
+	if (!rk_dev->aligned) {
+		if (!sg_pcopy_from_buffer(req->dst, rk_dev->dst_nents,
+					  rk_dev->addr_vir, rk_dev->count,
+					  rk_dev->total - rk_dev->left_bytes -
+					  rk_dev->count)) {
 			err = -EINVAL;
 			goto out_rx;
 		}
 	}
-	if (dev->left_bytes) {
-		rk_update_iv(dev);
-		if (dev->aligned) {
-			if (sg_is_last(dev->sg_src)) {
-				dev_err(dev->dev, "[%s:%d] Lack of data\n",
+	if (rk_dev->left_bytes) {
+		rk_update_iv(rk_dev);
+		if (rk_dev->aligned) {
+			if (sg_is_last(rk_dev->sg_src)) {
+				dev_err(rk_dev->dev, "[%s:%d] Lack of data\n",
 					__func__, __LINE__);
 				err = -ENOMEM;
 				goto out_rx;
 			}
-			dev->sg_src = sg_next(dev->sg_src);
-			dev->sg_dst = sg_next(dev->sg_dst);
+			rk_dev->sg_src = sg_next(rk_dev->sg_src);
+			rk_dev->sg_dst = sg_next(rk_dev->sg_dst);
 		}
-		err = rk_set_data_start(dev);
+		err = rk_set_data_start(rk_dev);
 	} else {
-		rk_iv_copyback(dev);
+		rk_iv_copyback(rk_dev);
 		/* here show the calculation is over without any err */
-		dev->complete(dev->async_req, 0);
-		tasklet_schedule(&dev->queue_task);
+		rk_dev->complete(rk_dev->async_req, 0);
+		tasklet_schedule(&rk_dev->queue_task);
 	}
 out_rx:
 	return err;
@@ -360,24 +363,24 @@ static int rk_ablk_cra_init(struct crypto_tfm *tfm)
 {
 	struct rk_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
 	struct crypto_alg *alg = tfm->__crt_alg;
-	struct rk_crypto_tmp *algt;
-	struct rk_crypto_info *info;
+	struct rk_crypto_algt *algt;
+	struct rk_crypto_dev *rk_dev;
 
-	algt = container_of(alg, struct rk_crypto_tmp, alg.crypto);
-	info = algt->dev;
+	algt = container_of(alg, struct rk_crypto_algt, alg.crypto);
+	rk_dev = algt->rk_dev;
 
-	if (!info->request_crypto)
+	if (!rk_dev->request_crypto)
 		return -EFAULT;
 
-	info->request_crypto(info, crypto_tfm_alg_name(tfm));
+	rk_dev->request_crypto(rk_dev, crypto_tfm_alg_name(tfm));
 
-	info->align_size = crypto_tfm_alg_alignmask(tfm) + 1;
-	info->start = rk_ablk_start;
-	info->update = rk_ablk_rx;
-	info->complete = rk_crypto_complete;
-	info->irq_handle = rk_crypto_irq_handle;
+	rk_dev->align_size = crypto_tfm_alg_alignmask(tfm) + 1;
+	rk_dev->start      = rk_ablk_start;
+	rk_dev->update     = rk_ablk_rx;
+	rk_dev->complete   = rk_crypto_complete;
+	rk_dev->irq_handle = rk_crypto_irq_handle;
 
-	ctx->dev = info;
+	ctx->rk_dev = rk_dev;
 
 	return 0;
 }
@@ -386,7 +389,7 @@ static void rk_ablk_cra_exit(struct crypto_tfm *tfm)
 {
 	struct rk_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
 
-	ctx->dev->release_crypto(ctx->dev, crypto_tfm_alg_name(tfm));
+	ctx->rk_dev->release_crypto(ctx->rk_dev, crypto_tfm_alg_name(tfm));
 }
 
 int rk_hw_crypto_v1_init(struct device *dev, void *hw_info)
@@ -399,20 +402,20 @@ void rk_hw_crypto_v1_deinit(struct device *dev, void *hw_info)
 
 }
 
-struct rk_crypto_tmp rk_v1_ecb_aes_alg =
+struct rk_crypto_algt rk_v1_ecb_aes_alg =
 	RK_CIPHER_ALGO_INIT(AES, ECB, ecb(aes), ecb-aes-rk);
 
-struct rk_crypto_tmp rk_v1_cbc_aes_alg =
+struct rk_crypto_algt rk_v1_cbc_aes_alg =
 	RK_CIPHER_ALGO_INIT(AES, CBC, cbc(aes), cbc-aes-rk);
 
-struct rk_crypto_tmp rk_v1_ecb_des_alg =
+struct rk_crypto_algt rk_v1_ecb_des_alg =
 	RK_CIPHER_ALGO_INIT(DES, ECB, ecb(des), ecb-des-rk);
 
-struct rk_crypto_tmp rk_v1_cbc_des_alg =
+struct rk_crypto_algt rk_v1_cbc_des_alg =
 	RK_CIPHER_ALGO_INIT(DES, CBC, cbc(des), cbc-des-rk);
 
-struct rk_crypto_tmp rk_v1_ecb_des3_ede_alg =
+struct rk_crypto_algt rk_v1_ecb_des3_ede_alg =
 	RK_CIPHER_ALGO_INIT(DES3_EDE, ECB, ecb(des3_ede), ecb-des3_ede-rk);
 
-struct rk_crypto_tmp rk_v1_cbc_des3_ede_alg =
+struct rk_crypto_algt rk_v1_cbc_des3_ede_alg =
 	RK_CIPHER_ALGO_INIT(DES3_EDE, CBC, cbc(des3_ede), cbc-des3_ede-rk);
diff --git a/drivers/crypto/rockchip/rk_crypto_v1_ahash.c b/drivers/crypto/rockchip/rk_crypto_v1_ahash.c
index 0bc93fde535c..853036791aa1 100644
--- a/drivers/crypto/rockchip/rk_crypto_v1_ahash.c
+++ b/drivers/crypto/rockchip/rk_crypto_v1_ahash.c
@@ -19,15 +19,15 @@
 
 static int rk_crypto_irq_handle(int irq, void *dev_id)
 {
-	struct rk_crypto_info *dev  = platform_get_drvdata(dev_id);
+	struct rk_crypto_dev *rk_dev  = platform_get_drvdata(dev_id);
 	u32 interrupt_status;
 
-	interrupt_status = CRYPTO_READ(dev, RK_CRYPTO_INTSTS);
-	CRYPTO_WRITE(dev, RK_CRYPTO_INTSTS, interrupt_status);
+	interrupt_status = CRYPTO_READ(rk_dev, RK_CRYPTO_INTSTS);
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_INTSTS, interrupt_status);
 
 	if (interrupt_status & 0x0a) {
-		dev_warn(dev->dev, "DMA Error\n");
-		dev->err = -EFAULT;
+		dev_warn(rk_dev->dev, "DMA Error\n");
+		rk_dev->err = -EFAULT;
 	}
 
 	return 0;
@@ -61,37 +61,37 @@ static void rk_ahash_crypto_complete(struct crypto_async_request *base, int err)
 		base->complete(base, err);
 }
 
-static void rk_ahash_reg_init(struct rk_crypto_info *dev)
+static void rk_ahash_reg_init(struct rk_crypto_dev *rk_dev)
 {
-	struct ahash_request *req = ahash_request_cast(dev->async_req);
+	struct ahash_request *req = ahash_request_cast(rk_dev->async_req);
 	struct rk_ahash_rctx *rctx = ahash_request_ctx(req);
 	int reg_status = 0;
 
-	reg_status = CRYPTO_READ(dev, RK_CRYPTO_CTRL) |
+	reg_status = CRYPTO_READ(rk_dev, RK_CRYPTO_CTRL) |
 		     RK_CRYPTO_HASH_FLUSH | _SBF(0xffff, 16);
-	CRYPTO_WRITE(dev, RK_CRYPTO_CTRL, reg_status);
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_CTRL, reg_status);
 
-	reg_status = CRYPTO_READ(dev, RK_CRYPTO_CTRL);
+	reg_status = CRYPTO_READ(rk_dev, RK_CRYPTO_CTRL);
 	reg_status &= (~RK_CRYPTO_HASH_FLUSH);
 	reg_status |= _SBF(0xffff, 16);
-	CRYPTO_WRITE(dev, RK_CRYPTO_CTRL, reg_status);
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_CTRL, reg_status);
 
-	memset_io(dev->reg + RK_CRYPTO_HASH_DOUT_0, 0, 32);
+	memset_io(rk_dev->reg + RK_CRYPTO_HASH_DOUT_0, 0, 32);
 
-	CRYPTO_WRITE(dev, RK_CRYPTO_INTENA, RK_CRYPTO_HRDMA_ERR_ENA |
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_INTENA, RK_CRYPTO_HRDMA_ERR_ENA |
 					    RK_CRYPTO_HRDMA_DONE_ENA);
 
-	CRYPTO_WRITE(dev, RK_CRYPTO_INTSTS, RK_CRYPTO_HRDMA_ERR_INT |
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_INTSTS, RK_CRYPTO_HRDMA_ERR_INT |
 					    RK_CRYPTO_HRDMA_DONE_INT);
 
-	CRYPTO_WRITE(dev, RK_CRYPTO_HASH_CTRL, rctx->mode |
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_HASH_CTRL, rctx->mode |
 					       RK_CRYPTO_HASH_SWAP_DO);
 
-	CRYPTO_WRITE(dev, RK_CRYPTO_CONF, RK_CRYPTO_BYTESWAP_HRFIFO |
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_CONF, RK_CRYPTO_BYTESWAP_HRFIFO |
 					  RK_CRYPTO_BYTESWAP_BRFIFO |
 					  RK_CRYPTO_BYTESWAP_BTFIFO);
 
-	CRYPTO_WRITE(dev, RK_CRYPTO_HASH_MSG_LEN, dev->total);
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_HASH_MSG_LEN, rk_dev->total);
 }
 
 static int rk_ahash_init(struct ahash_request *req)
@@ -182,46 +182,47 @@ static int rk_ahash_export(struct ahash_request *req, void *out)
 static int rk_ahash_digest(struct ahash_request *req)
 {
 	struct rk_ahash_ctx *tctx = crypto_tfm_ctx(req->base.tfm);
-	struct rk_crypto_info *dev = tctx->dev;
+	struct rk_crypto_dev *rk_dev = tctx->rk_dev;
 
 	if (!req->nbytes)
 		return zero_message_process(req);
 	else
-		return dev->enqueue(dev, &req->base);
+		return rk_dev->enqueue(rk_dev, &req->base);
 }
 
-static void crypto_ahash_dma_start(struct rk_crypto_info *dev)
+static void crypto_ahash_dma_start(struct rk_crypto_dev *rk_dev)
 {
-	CRYPTO_WRITE(dev, RK_CRYPTO_HRDMAS, dev->addr_in);
-	CRYPTO_WRITE(dev, RK_CRYPTO_HRDMAL, (dev->count + 3) / 4);
-	CRYPTO_WRITE(dev, RK_CRYPTO_CTRL, RK_CRYPTO_HASH_START |
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_HRDMAS, rk_dev->addr_in);
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_HRDMAL, (rk_dev->count + 3) / 4);
+	CRYPTO_WRITE(rk_dev, RK_CRYPTO_CTRL, RK_CRYPTO_HASH_START |
 					  (RK_CRYPTO_HASH_START << 16));
 }
 
-static int rk_ahash_set_data_start(struct rk_crypto_info *dev)
+static int rk_ahash_set_data_start(struct rk_crypto_dev *rk_dev)
 {
 	int err;
 
-	err = dev->load_data(dev, dev->sg_src, NULL);
+	err = rk_dev->load_data(rk_dev, rk_dev->sg_src, NULL);
 	if (!err)
-		crypto_ahash_dma_start(dev);
+		crypto_ahash_dma_start(rk_dev);
 	return err;
 }
 
-static int rk_ahash_start(struct rk_crypto_info *dev)
+static int rk_ahash_start(struct rk_crypto_dev *rk_dev)
 {
-	struct ahash_request *req = ahash_request_cast(dev->async_req);
+	struct ahash_request *req = ahash_request_cast(rk_dev->async_req);
 	struct crypto_ahash *tfm;
 	struct rk_ahash_rctx *rctx;
 
-	dev->total = req->nbytes;
-	dev->left_bytes = req->nbytes;
-	dev->aligned = 0;
-	dev->align_size = 4;
-	dev->sg_dst = NULL;
-	dev->sg_src = req->src;
-	dev->first = req->src;
-	dev->src_nents = sg_nents(req->src);
+	rk_dev->total      = req->nbytes;
+	rk_dev->left_bytes = req->nbytes;
+	rk_dev->aligned    = 0;
+	rk_dev->align_size = 4;
+	rk_dev->sg_dst     = NULL;
+	rk_dev->sg_src     = req->src;
+	rk_dev->first      = req->src;
+	rk_dev->src_nents   = sg_nents(req->src);
+
 	rctx = ahash_request_ctx(req);
 	rctx->mode = 0;
 
@@ -240,28 +241,28 @@ static int rk_ahash_start(struct rk_crypto_info *dev)
 		return -EINVAL;
 	}
 
-	rk_ahash_reg_init(dev);
-	return rk_ahash_set_data_start(dev);
+	rk_ahash_reg_init(rk_dev);
+	return rk_ahash_set_data_start(rk_dev);
 }
 
-static int rk_ahash_crypto_rx(struct rk_crypto_info *dev)
+static int rk_ahash_crypto_rx(struct rk_crypto_dev *rk_dev)
 {
 	int err = 0;
-	struct ahash_request *req = ahash_request_cast(dev->async_req);
+	struct ahash_request *req = ahash_request_cast(rk_dev->async_req);
 	struct crypto_ahash *tfm;
 
-	dev->unload_data(dev);
-	if (dev->left_bytes) {
-		if (dev->aligned) {
-			if (sg_is_last(dev->sg_src)) {
-				dev_warn(dev->dev, "[%s:%d], Lack of data\n",
+	rk_dev->unload_data(rk_dev);
+	if (rk_dev->left_bytes) {
+		if (rk_dev->aligned) {
+			if (sg_is_last(rk_dev->sg_src)) {
+				dev_warn(rk_dev->dev, "[%s:%d], Lack of data\n",
 					 __func__, __LINE__);
 				err = -ENOMEM;
 				goto out_rx;
 			}
-			dev->sg_src = sg_next(dev->sg_src);
+			rk_dev->sg_src = sg_next(rk_dev->sg_src);
 		}
-		err = rk_ahash_set_data_start(dev);
+		err = rk_ahash_set_data_start(rk_dev);
 	} else {
 		/*
 		 * it will take some time to process date after last dma
@@ -273,14 +274,14 @@ static int rk_ahash_crypto_rx(struct rk_crypto_info *dev)
 		 * efficiency, and make it response quickly when dma
 		 * complete.
 		 */
-		while (!CRYPTO_READ(dev, RK_CRYPTO_HASH_STS))
+		while (!CRYPTO_READ(rk_dev, RK_CRYPTO_HASH_STS))
 			udelay(10);
 
 		tfm = crypto_ahash_reqtfm(req);
-		memcpy_fromio(req->result, dev->reg + RK_CRYPTO_HASH_DOUT_0,
+		memcpy_fromio(req->result, rk_dev->reg + RK_CRYPTO_HASH_DOUT_0,
 			      crypto_ahash_digestsize(tfm));
-		dev->complete(dev->async_req, 0);
-		tasklet_schedule(&dev->queue_task);
+		rk_dev->complete(rk_dev->async_req, 0);
+		tasklet_schedule(&rk_dev->queue_task);
 	}
 
 out_rx:
@@ -290,31 +291,31 @@ static int rk_ahash_crypto_rx(struct rk_crypto_info *dev)
 static int rk_cra_hash_init(struct crypto_tfm *tfm)
 {
 	struct rk_ahash_ctx *ctx = crypto_tfm_ctx(tfm);
-	struct rk_crypto_tmp *algt;
+	struct rk_crypto_algt *algt;
 	struct ahash_alg *alg = __crypto_ahash_alg(tfm->__crt_alg);
 	const char *alg_name = crypto_tfm_alg_name(tfm);
-	struct rk_crypto_info *info;
+	struct rk_crypto_dev *rk_dev;
 
-	algt = container_of(alg, struct rk_crypto_tmp, alg.hash);
-	info = algt->dev;
+	algt = container_of(alg, struct rk_crypto_algt, alg.hash);
+	rk_dev = algt->rk_dev;
 
-	if (!info->request_crypto)
+	if (!rk_dev->request_crypto)
 		return -EFAULT;
 
-	info->request_crypto(info, crypto_tfm_alg_name(tfm));
+	rk_dev->request_crypto(rk_dev, crypto_tfm_alg_name(tfm));
 
-	info->start = rk_ahash_start;
-	info->update = rk_ahash_crypto_rx;
-	info->complete = rk_ahash_crypto_complete;
-	info->irq_handle = rk_crypto_irq_handle;
+	rk_dev->start      = rk_ahash_start;
+	rk_dev->update     = rk_ahash_crypto_rx;
+	rk_dev->complete   = rk_ahash_crypto_complete;
+	rk_dev->irq_handle = rk_crypto_irq_handle;
 
-	ctx->dev = info;
+	ctx->rk_dev = rk_dev;
 
 	/* for fallback */
 	ctx->fallback_tfm = crypto_alloc_ahash(alg_name, 0,
 					       CRYPTO_ALG_NEED_FALLBACK);
 	if (IS_ERR(ctx->fallback_tfm)) {
-		dev_err(info->dev, "Could not load fallback driver.\n");
+		dev_err(rk_dev->dev, "Could not load fallback driver.\n");
 		return PTR_ERR(ctx->fallback_tfm);
 	}
 	crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
@@ -333,10 +334,10 @@ static void rk_cra_hash_exit(struct crypto_tfm *tfm)
 	if (ctx->fallback_tfm)
 		crypto_free_ahash(ctx->fallback_tfm);
 
-	ctx->dev->release_crypto(ctx->dev, crypto_tfm_alg_name(tfm));
+	ctx->rk_dev->release_crypto(ctx->rk_dev, crypto_tfm_alg_name(tfm));
 }
 
-struct rk_crypto_tmp rk_v1_ahash_sha1 = RK_HASH_ALGO_INIT(SHA1, sha1);
-struct rk_crypto_tmp rk_v1_ahash_sha256 = RK_HASH_ALGO_INIT(SHA256, sha256);
-struct rk_crypto_tmp rk_v1_ahash_md5 = RK_HASH_ALGO_INIT(MD5, md5);
+struct rk_crypto_algt rk_v1_ahash_sha1   = RK_HASH_ALGO_INIT(SHA1, sha1);
+struct rk_crypto_algt rk_v1_ahash_sha256 = RK_HASH_ALGO_INIT(SHA256, sha256);
+struct rk_crypto_algt rk_v1_ahash_md5    = RK_HASH_ALGO_INIT(MD5, md5);
 
diff --git a/drivers/crypto/rockchip/rk_crypto_v2.h b/drivers/crypto/rockchip/rk_crypto_v2.h
index 76253ea34728..a166fc6effdf 100644
--- a/drivers/crypto/rockchip/rk_crypto_v2.h
+++ b/drivers/crypto/rockchip/rk_crypto_v2.h
@@ -23,43 +23,43 @@ struct rk_hw_crypto_v2_info {
 	dma_addr_t			desc_dma;
 };
 
-extern struct rk_crypto_tmp rk_v2_ecb_sm4_alg;
-extern struct rk_crypto_tmp rk_v2_cbc_sm4_alg;
-extern struct rk_crypto_tmp rk_v2_xts_sm4_alg;
-extern struct rk_crypto_tmp rk_v2_cfb_sm4_alg;
-extern struct rk_crypto_tmp rk_v2_ofb_sm4_alg;
-extern struct rk_crypto_tmp rk_v2_ctr_sm4_alg;
-
-extern struct rk_crypto_tmp rk_v2_ecb_aes_alg;
-extern struct rk_crypto_tmp rk_v2_cbc_aes_alg;
-extern struct rk_crypto_tmp rk_v2_xts_aes_alg;
-extern struct rk_crypto_tmp rk_v2_cfb_aes_alg;
-extern struct rk_crypto_tmp rk_v2_ofb_aes_alg;
-extern struct rk_crypto_tmp rk_v2_ctr_aes_alg;
-
-extern struct rk_crypto_tmp rk_v2_ecb_des_alg;
-extern struct rk_crypto_tmp rk_v2_cbc_des_alg;
-extern struct rk_crypto_tmp rk_v2_cfb_des_alg;
-extern struct rk_crypto_tmp rk_v2_ofb_des_alg;
-
-extern struct rk_crypto_tmp rk_v2_ecb_des3_ede_alg;
-extern struct rk_crypto_tmp rk_v2_cbc_des3_ede_alg;
-extern struct rk_crypto_tmp rk_v2_cfb_des3_ede_alg;
-extern struct rk_crypto_tmp rk_v2_ofb_des3_ede_alg;
-
-extern struct rk_crypto_tmp rk_v2_ahash_sha1;
-extern struct rk_crypto_tmp rk_v2_ahash_sha256;
-extern struct rk_crypto_tmp rk_v2_ahash_sha512;
-extern struct rk_crypto_tmp rk_v2_ahash_md5;
-extern struct rk_crypto_tmp rk_v2_ahash_sm3;
-
-extern struct rk_crypto_tmp rk_v2_ahash_hmac_md5;
-extern struct rk_crypto_tmp rk_v2_ahash_hmac_sha1;
-extern struct rk_crypto_tmp rk_v2_ahash_hmac_sha256;
-extern struct rk_crypto_tmp rk_v2_ahash_hmac_sha512;
-extern struct rk_crypto_tmp rk_v2_ahash_hmac_sm3;
-
-extern struct rk_crypto_tmp rk_v2_asym_rsa;
+extern struct rk_crypto_algt rk_v2_ecb_sm4_alg;
+extern struct rk_crypto_algt rk_v2_cbc_sm4_alg;
+extern struct rk_crypto_algt rk_v2_xts_sm4_alg;
+extern struct rk_crypto_algt rk_v2_cfb_sm4_alg;
+extern struct rk_crypto_algt rk_v2_ofb_sm4_alg;
+extern struct rk_crypto_algt rk_v2_ctr_sm4_alg;
+
+extern struct rk_crypto_algt rk_v2_ecb_aes_alg;
+extern struct rk_crypto_algt rk_v2_cbc_aes_alg;
+extern struct rk_crypto_algt rk_v2_xts_aes_alg;
+extern struct rk_crypto_algt rk_v2_cfb_aes_alg;
+extern struct rk_crypto_algt rk_v2_ofb_aes_alg;
+extern struct rk_crypto_algt rk_v2_ctr_aes_alg;
+
+extern struct rk_crypto_algt rk_v2_ecb_des_alg;
+extern struct rk_crypto_algt rk_v2_cbc_des_alg;
+extern struct rk_crypto_algt rk_v2_cfb_des_alg;
+extern struct rk_crypto_algt rk_v2_ofb_des_alg;
+
+extern struct rk_crypto_algt rk_v2_ecb_des3_ede_alg;
+extern struct rk_crypto_algt rk_v2_cbc_des3_ede_alg;
+extern struct rk_crypto_algt rk_v2_cfb_des3_ede_alg;
+extern struct rk_crypto_algt rk_v2_ofb_des3_ede_alg;
+
+extern struct rk_crypto_algt rk_v2_ahash_sha1;
+extern struct rk_crypto_algt rk_v2_ahash_sha256;
+extern struct rk_crypto_algt rk_v2_ahash_sha512;
+extern struct rk_crypto_algt rk_v2_ahash_md5;
+extern struct rk_crypto_algt rk_v2_ahash_sm3;
+
+extern struct rk_crypto_algt rk_v2_hmac_md5;
+extern struct rk_crypto_algt rk_v2_hmac_sha1;
+extern struct rk_crypto_algt rk_v2_hmac_sha256;
+extern struct rk_crypto_algt rk_v2_hmac_sha512;
+extern struct rk_crypto_algt rk_v2_hmac_sm3;
+
+extern struct rk_crypto_algt rk_v2_asym_rsa;
 
 int rk_hw_crypto_v2_init(struct device *dev, void *hw_info);
 void rk_hw_crypto_v2_deinit(struct device *dev, void *hw_info);
diff --git a/drivers/crypto/rockchip/rk_crypto_v2_ablkcipher.c b/drivers/crypto/rockchip/rk_crypto_v2_ablkcipher.c
index 87b09a539f21..d47260c79b5d 100644
--- a/drivers/crypto/rockchip/rk_crypto_v2_ablkcipher.c
+++ b/drivers/crypto/rockchip/rk_crypto_v2_ablkcipher.c
@@ -36,61 +36,52 @@ static const u32 cipher_mode2bc[] = {
 
 static int rk_crypto_irq_handle(int irq, void *dev_id)
 {
-	struct rk_crypto_info *dev = platform_get_drvdata(dev_id);
+	struct rk_crypto_dev *rk_dev = platform_get_drvdata(dev_id);
 	u32 interrupt_status;
 	struct rk_hw_crypto_v2_info *hw_info =
-			(struct rk_hw_crypto_v2_info *)dev->hw_info;
+			(struct rk_hw_crypto_v2_info *)rk_dev->hw_info;
 
-	interrupt_status = CRYPTO_READ(dev, CRYPTO_DMA_INT_ST);
-	CRYPTO_WRITE(dev, CRYPTO_DMA_INT_ST, interrupt_status);
+	interrupt_status = CRYPTO_READ(rk_dev, CRYPTO_DMA_INT_ST);
+	CRYPTO_WRITE(rk_dev, CRYPTO_DMA_INT_ST, interrupt_status);
 
 	interrupt_status &= CRYPTO_LOCKSTEP_MASK;
 
 	if (interrupt_status != CRYPTO_DST_ITEM_DONE_INT_ST) {
-		dev_err(dev->dev, "DMA desc = %p\n", hw_info->desc);
-		dev_err(dev->dev, "DMA addr_in = %08x\n",
-			(u32)dev->addr_in);
-		dev_err(dev->dev, "DMA addr_out = %08x\n",
-			(u32)dev->addr_out);
-		dev_err(dev->dev, "DMA count = %08x\n", dev->count);
-		dev_err(dev->dev, "DMA desc_dma = %08x\n",
+		dev_err(rk_dev->dev, "DMA desc = %p\n", hw_info->desc);
+		dev_err(rk_dev->dev, "DMA addr_in = %08x\n",
+			(u32)rk_dev->addr_in);
+		dev_err(rk_dev->dev, "DMA addr_out = %08x\n",
+			(u32)rk_dev->addr_out);
+		dev_err(rk_dev->dev, "DMA count = %08x\n", rk_dev->count);
+		dev_err(rk_dev->dev, "DMA desc_dma = %08x\n",
 			(u32)hw_info->desc_dma);
-		dev_err(dev->dev, "DMA Error status = %08x\n",
+		dev_err(rk_dev->dev, "DMA Error status = %08x\n",
 			interrupt_status);
-		dev_err(dev->dev, "DMA CRYPTO_DMA_LLI_ADDR status = %08x\n",
-			CRYPTO_READ(dev, CRYPTO_DMA_LLI_ADDR));
-		dev_err(dev->dev, "DMA CRYPTO_DMA_ST status = %08x\n",
-			CRYPTO_READ(dev, CRYPTO_DMA_ST));
-		dev_err(dev->dev, "DMA CRYPTO_DMA_STATE status = %08x\n",
-			CRYPTO_READ(dev, CRYPTO_DMA_STATE));
-		dev_err(dev->dev, "DMA CRYPTO_DMA_LLI_RADDR status = %08x\n",
-			CRYPTO_READ(dev, CRYPTO_DMA_LLI_RADDR));
-		dev_err(dev->dev, "DMA CRYPTO_DMA_SRC_RADDR status = %08x\n",
-			CRYPTO_READ(dev, CRYPTO_DMA_SRC_RADDR));
-		dev_err(dev->dev, "DMA CRYPTO_DMA_DST_RADDR status = %08x\n",
-			CRYPTO_READ(dev, CRYPTO_DMA_DST_RADDR));
-		dev->err = -EFAULT;
+		dev_err(rk_dev->dev, "DMA CRYPTO_DMA_LLI_ADDR status = %08x\n",
+			CRYPTO_READ(rk_dev, CRYPTO_DMA_LLI_ADDR));
+		dev_err(rk_dev->dev, "DMA CRYPTO_DMA_ST status = %08x\n",
+			CRYPTO_READ(rk_dev, CRYPTO_DMA_ST));
+		dev_err(rk_dev->dev, "DMA CRYPTO_DMA_STATE status = %08x\n",
+			CRYPTO_READ(rk_dev, CRYPTO_DMA_STATE));
+		dev_err(rk_dev->dev, "DMA CRYPTO_DMA_LLI_RADDR status = %08x\n",
+			CRYPTO_READ(rk_dev, CRYPTO_DMA_LLI_RADDR));
+		dev_err(rk_dev->dev, "DMA CRYPTO_DMA_SRC_RADDR status = %08x\n",
+			CRYPTO_READ(rk_dev, CRYPTO_DMA_SRC_RADDR));
+		dev_err(rk_dev->dev, "DMA CRYPTO_DMA_DST_RADDR status = %08x\n",
+			CRYPTO_READ(rk_dev, CRYPTO_DMA_DST_RADDR));
+		rk_dev->err = -EFAULT;
 	}
 
 	return 0;
 }
 
-static u32 byte2word(const u8 *ch, u32 endian)
+static inline u32 byte2word_be(const u8 *ch)
 {
-	u32 w = 0;
-
-	/* 0: Big-Endian 1: Little-Endian */
-	if (endian == BIG_ENDIAN)
-		w = (*ch << 24) + (*(ch + 1) << 16) +
+	return (*ch << 24) + (*(ch + 1) << 16) +
 		    (*(ch + 2) << 8) + *(ch + 3);
-	else if (endian == LITTLE_ENDIAN)
-		w = (*(ch + 3) << 24) + (*(ch + 2) << 16) +
-		    (*(ch + 1) << 8) + *ch;
-
-	return w;
 }
 
-static void set_iv_reg(struct rk_crypto_info *dev, const u8 *iv, u32 iv_len)
+static void set_iv_reg(struct rk_crypto_dev *rk_dev, const u8 *iv, u32 iv_len)
 {
 	u32 i;
 	u8 tmp_buf[4];
@@ -102,64 +93,64 @@ static void set_iv_reg(struct rk_crypto_info *dev, const u8 *iv, u32 iv_len)
 	base_iv = CRYPTO_CH0_IV_0;
 	/* write iv data to reg */
 	for (i = 0; i < iv_len / 4; i++, base_iv += 4)
-		CRYPTO_WRITE(dev, base_iv, byte2word(iv + i * 4, BIG_ENDIAN));
+		CRYPTO_WRITE(rk_dev, base_iv, byte2word_be(iv + i * 4));
 
 	if (iv_len % 4) {
 		memset(tmp_buf, 0x00, sizeof(tmp_buf));
 		memcpy((u8 *)tmp_buf, iv + (iv_len / 4) * 4, iv_len % 4);
-		CRYPTO_WRITE(dev, base_iv, byte2word(tmp_buf, BIG_ENDIAN));
+		CRYPTO_WRITE(rk_dev, base_iv, byte2word_be(tmp_buf));
 	}
 
-	CRYPTO_WRITE(dev, CRYPTO_CH0_IV_LEN_0, iv_len);
+	CRYPTO_WRITE(rk_dev, CRYPTO_CH0_IV_LEN_0, iv_len);
 }
 
-static void write_key_reg(struct rk_crypto_info *dev, const u8 *key,
+static void write_key_reg(struct rk_crypto_dev *rk_dev, const u8 *key,
 			  u32 key_len)
 {
 	u32 i;
 	u8 tmp_buf[4];
-	u32 chn_base_addr;
+	u32 base_addr;
 
-	chn_base_addr = CRYPTO_CH0_KEY_0;
+	base_addr = CRYPTO_CH0_KEY_0;
 
-	for (i = 0; i < key_len / 4; i++, chn_base_addr += 4)
-		CRYPTO_WRITE(dev, chn_base_addr,
-			     byte2word(key + i * 4, BIG_ENDIAN));
+	for (i = 0; i < key_len / 4; i++, base_addr += 4)
+		CRYPTO_WRITE(rk_dev, base_addr,
+			     byte2word_be(key + i * 4));
 
 	if (key_len % 4) {
 		memset(tmp_buf, 0x00, sizeof(tmp_buf));
 		memcpy((u8 *)tmp_buf, key + i * 4, key_len % 4);
-		CRYPTO_WRITE(dev, chn_base_addr,
-			     byte2word(tmp_buf, BIG_ENDIAN));
+		CRYPTO_WRITE(rk_dev, base_addr,
+			     byte2word_be(tmp_buf));
 	}
 }
 
-static void write_tkey_reg(struct rk_crypto_info *dev, const u8 *key,
+static void write_tkey_reg(struct rk_crypto_dev *rk_dev, const u8 *key,
 			   u32 key_len)
 {
 	u32 i;
 	u8 tmp_buf[4];
-	u32 chn_base_addr;
+	u32 base_addr;
 
-	chn_base_addr = CRYPTO_CH4_KEY_0;
+	base_addr = CRYPTO_CH4_KEY_0;
 
-	for (i = 0; i < key_len / 4; i++, chn_base_addr += 4)
-		CRYPTO_WRITE(dev, chn_base_addr,
-			     byte2word(key + i * 4, BIG_ENDIAN));
+	for (i = 0; i < key_len / 4; i++, base_addr += 4)
+		CRYPTO_WRITE(rk_dev, base_addr,
+			     byte2word_be(key + i * 4));
 
 	if (key_len % 4) {
 		memset(tmp_buf, 0x00, sizeof(tmp_buf));
 		memcpy((u8 *)tmp_buf, key + i * 4, key_len % 4);
-		CRYPTO_WRITE(dev, chn_base_addr,
-			     byte2word(tmp_buf, BIG_ENDIAN));
+		CRYPTO_WRITE(rk_dev, base_addr,
+			     byte2word_be(tmp_buf));
 	}
 }
 
-static struct rk_crypto_tmp *rk_cipher_get_algt(struct crypto_ablkcipher *tfm)
+static struct rk_crypto_algt *rk_cipher_get_algt(struct crypto_ablkcipher *tfm)
 {
 	struct crypto_alg *alg = tfm->base.__crt_alg;
 
-	return container_of(alg, struct rk_crypto_tmp, alg.crypto);
+	return container_of(alg, struct rk_crypto_algt, alg.crypto);
 }
 
 static bool is_use_fallback(struct rk_cipher_ctx *ctx)
@@ -167,12 +158,12 @@ static bool is_use_fallback(struct rk_cipher_ctx *ctx)
 	return ctx->keylen == AES_KEYSIZE_192 && ctx->fallback_tfm;
 }
 
-static bool is_no_multi_blocksize(struct rk_crypto_info *dev)
+static bool is_no_multi_blocksize(struct rk_crypto_dev *rk_dev)
 {
 	struct ablkcipher_request *req =
-		ablkcipher_request_cast(dev->async_req);
+		ablkcipher_request_cast(rk_dev->async_req);
 	struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(req);
-	struct rk_crypto_tmp *algt = rk_cipher_get_algt(cipher);
+	struct rk_crypto_algt *algt = rk_cipher_get_algt(cipher);
 
 	return (algt->mode == CIPHER_MODE_CFB ||
 			algt->mode == CIPHER_MODE_OFB ||
@@ -185,21 +176,21 @@ static void rk_crypto_complete(struct crypto_async_request *base, int err)
 		base->complete(base, err);
 }
 
-static int rk_handle_req(struct rk_crypto_info *dev,
+static int rk_handle_req(struct rk_crypto_dev *rk_dev,
 			 struct ablkcipher_request *req)
 {
-	if (!IS_ALIGNED(req->nbytes, dev->align_size) &&
-	    !is_no_multi_blocksize(dev))
+	if (!IS_ALIGNED(req->nbytes, rk_dev->align_size) &&
+	    !is_no_multi_blocksize(rk_dev))
 		return -EINVAL;
 	else
-		return dev->enqueue(dev, &req->base);
+		return rk_dev->enqueue(rk_dev, &req->base);
 }
 
 static int rk_cipher_setkey(struct crypto_ablkcipher *cipher,
 			    const u8 *key, unsigned int keylen)
 {
 	struct crypto_tfm *tfm = crypto_ablkcipher_tfm(cipher);
-	struct rk_crypto_tmp *algt = rk_cipher_get_algt(cipher);
+	struct rk_crypto_algt *algt = rk_cipher_get_algt(cipher);
 	struct rk_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
 	u32 tmp[DES_EXPKEY_WORDS];
 	int ret = -EINVAL;
@@ -269,88 +260,84 @@ static int rk_cipher_setkey(struct crypto_ablkcipher *cipher,
 	return ret;
 }
 
-static int rk_cipher_encrypt(struct ablkcipher_request *req)
+static int rk_cipher_fallback(struct ablkcipher_request *req,
+			      struct rk_cipher_ctx *ctx,
+			      bool encrypt)
 {
-	struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
-	struct rk_cipher_ctx *ctx = crypto_ablkcipher_ctx(tfm);
-	struct rk_crypto_tmp *algt = rk_cipher_get_algt(tfm);
-	int ret = -EINVAL;
+	int ret;
 
-	CRYPTO_TRACE();
+	SKCIPHER_REQUEST_ON_STACK(subreq, ctx->fallback_tfm);
 
-	if (is_use_fallback(ctx)) {
-		SKCIPHER_REQUEST_ON_STACK(subreq, ctx->fallback_tfm);
-
-		CRYPTO_MSG("use fallback tfm");
+	CRYPTO_MSG("use fallback tfm");
 
-		skcipher_request_set_tfm(subreq, ctx->fallback_tfm);
-		skcipher_request_set_callback(subreq, req->base.flags,
-					      NULL, NULL);
-		skcipher_request_set_crypt(subreq, req->src, req->dst,
-					   req->nbytes, req->info);
-		ret =  crypto_skcipher_encrypt(subreq);
-		skcipher_request_zero(subreq);
-	} else {
-		ctx->mode = cipher_algo2bc[algt->algo] | cipher_mode2bc[algt->mode];
-		CRYPTO_MSG("ctx->mode = %x\n", ctx->mode);
-		ret = rk_handle_req(ctx->dev, req);
-	}
+	skcipher_request_set_tfm(subreq, ctx->fallback_tfm);
+	skcipher_request_set_callback(subreq, req->base.flags,
+				      NULL, NULL);
+	skcipher_request_set_crypt(subreq, req->src, req->dst,
+				   req->nbytes, req->info);
+	ret = encrypt ? crypto_skcipher_encrypt(subreq) :
+			crypto_skcipher_decrypt(subreq);
+	skcipher_request_zero(subreq);
 
 	return ret;
 }
 
-static int rk_cipher_decrypt(struct ablkcipher_request *req)
+static int rk_cipher_crypt(struct ablkcipher_request *req, bool encrypt)
 {
 	struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
 	struct rk_cipher_ctx *ctx = crypto_ablkcipher_ctx(tfm);
-	struct rk_crypto_tmp *algt = rk_cipher_get_algt(tfm);
+	struct rk_crypto_algt *algt = rk_cipher_get_algt(tfm);
 	int ret = -EINVAL;
 
-	CRYPTO_TRACE();
+	CRYPTO_TRACE("%s total = %u",
+		     encrypt ? "encrypt" : "decrypt", req->nbytes);
 
 	if (is_use_fallback(ctx)) {
-		SKCIPHER_REQUEST_ON_STACK(subreq, ctx->fallback_tfm);
-
-		CRYPTO_MSG("use soft fallback tfm");
-
-		skcipher_request_set_tfm(subreq, ctx->fallback_tfm);
-		skcipher_request_set_callback(subreq, req->base.flags,
-					      NULL, NULL);
-		skcipher_request_set_crypt(subreq, req->src, req->dst,
-					   req->nbytes, req->info);
-		ret =  crypto_skcipher_decrypt(subreq);
-		skcipher_request_zero(subreq);
+		ret = rk_cipher_fallback(req, ctx, encrypt);
 	} else {
 		ctx->mode = cipher_algo2bc[algt->algo] |
-			    cipher_mode2bc[algt->mode] |
-			    CRYPTO_BC_DECRYPT;
+			    cipher_mode2bc[algt->mode];
+		if (!encrypt)
+			ctx->mode |= CRYPTO_BC_DECRYPT;
+
 		CRYPTO_MSG("ctx->mode = %x\n", ctx->mode);
-		ret = rk_handle_req(ctx->dev, req);
+		ret = rk_handle_req(ctx->rk_dev, req);
 	}
 
 	return ret;
 }
 
-static void rk_ablk_hw_init(struct rk_crypto_info *dev)
+static int rk_cipher_encrypt(struct ablkcipher_request *req)
+{
+	return rk_cipher_crypt(req, true);
+}
+
+static int rk_cipher_decrypt(struct ablkcipher_request *req)
+{
+	return rk_cipher_crypt(req, false);
+}
+
+static void rk_ablk_hw_init(struct rk_crypto_dev *rk_dev)
 {
 	struct ablkcipher_request *req =
-		ablkcipher_request_cast(dev->async_req);
+		ablkcipher_request_cast(rk_dev->async_req);
 	struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(req);
 	struct crypto_tfm *tfm = crypto_ablkcipher_tfm(cipher);
 	struct rk_cipher_ctx *ctx = crypto_ablkcipher_ctx(cipher);
 	u32 ivsize, block;
 
-	CRYPTO_WRITE(dev, CRYPTO_BC_CTL, 0x00010000);
+	CRYPTO_WRITE(rk_dev, CRYPTO_BC_CTL, 0x00010000);
 
 	block = crypto_tfm_alg_blocksize(tfm);
 	ivsize = crypto_ablkcipher_ivsize(cipher);
 
-	write_key_reg(ctx->dev, ctx->key, ctx->keylen);
+	write_key_reg(ctx->rk_dev, ctx->key, ctx->keylen);
 	if (MASK_BC_MODE(ctx->mode) == CRYPTO_BC_XTS)
-		write_tkey_reg(ctx->dev, ctx->key + ctx->keylen, ctx->keylen);
+		write_tkey_reg(ctx->rk_dev,
+			       ctx->key + ctx->keylen, ctx->keylen);
 
 	if (MASK_BC_MODE(ctx->mode) != CRYPTO_BC_ECB)
-		set_iv_reg(dev, req->info, ivsize);
+		set_iv_reg(rk_dev, req->info, ivsize);
 
 	if (block != DES_BLOCK_SIZE) {
 		if (ctx->keylen == AES_KEYSIZE_128)
@@ -363,18 +350,18 @@ static void rk_ablk_hw_init(struct rk_crypto_info *dev)
 
 	ctx->mode |= CRYPTO_BC_ENABLE;
 
-	CRYPTO_WRITE(dev, CRYPTO_FIFO_CTL, 0x00030003);
+	CRYPTO_WRITE(rk_dev, CRYPTO_FIFO_CTL, 0x00030003);
 
-	CRYPTO_WRITE(dev, CRYPTO_DMA_INT_EN, 0x7f);
+	CRYPTO_WRITE(rk_dev, CRYPTO_DMA_INT_EN, 0x7f);
 
-	CRYPTO_WRITE(dev, CRYPTO_BC_CTL, ctx->mode | CRYPTO_WRITE_MASK_ALL);
+	CRYPTO_WRITE(rk_dev, CRYPTO_BC_CTL, ctx->mode | CRYPTO_WRITE_MASK_ALL);
 }
 
-static void crypto_dma_start(struct rk_crypto_info *dev)
+static void crypto_dma_start(struct rk_crypto_dev *rk_dev)
 {
 	struct rk_hw_crypto_v2_info *hw_info =
-			(struct rk_hw_crypto_v2_info *)dev->hw_info;
-	u32 calc_len = dev->count;
+			(struct rk_hw_crypto_v2_info *)rk_dev->hw_info;
+	u32 calc_len = rk_dev->count;
 
 	memset(hw_info->desc, 0x00, sizeof(*hw_info->desc));
 
@@ -382,60 +369,60 @@ static void crypto_dma_start(struct rk_crypto_info *dev)
 	 *	the data length is not aligned will use addr_vir to calculate,
 	 *	so crypto v2 could round up date date length to align_size
 	 */
-	if (is_no_multi_blocksize(dev))
-		calc_len = round_up(calc_len, dev->align_size);
-
-	hw_info->desc->src_addr = dev->addr_in;
-	hw_info->desc->src_len  = calc_len;
-	hw_info->desc->dst_addr = dev->addr_out;
-	hw_info->desc->dst_len  = calc_len;
-	hw_info->desc->next_addr = 0;
-	hw_info->desc->dma_ctrl = 0x00000201;
+	if (is_no_multi_blocksize(rk_dev))
+		calc_len = round_up(calc_len, rk_dev->align_size);
+
+	hw_info->desc->src_addr    = rk_dev->addr_in;
+	hw_info->desc->src_len     = calc_len;
+	hw_info->desc->dst_addr    = rk_dev->addr_out;
+	hw_info->desc->dst_len     = calc_len;
+	hw_info->desc->next_addr   = 0;
+	hw_info->desc->dma_ctrl    = 0x00000201;
 	hw_info->desc->user_define = 0x7;
 
 	dma_wmb();
 
-	CRYPTO_WRITE(dev, CRYPTO_DMA_LLI_ADDR, hw_info->desc_dma);
-	CRYPTO_WRITE(dev, CRYPTO_DMA_CTL, 0x00010001);/* start */
+	CRYPTO_WRITE(rk_dev, CRYPTO_DMA_LLI_ADDR, hw_info->desc_dma);
+	CRYPTO_WRITE(rk_dev, CRYPTO_DMA_CTL, 0x00010001);/* start */
 }
 
-static int rk_set_data_start(struct rk_crypto_info *dev)
+static int rk_set_data_start(struct rk_crypto_dev *rk_dev)
 {
 	int err;
 
-	err = dev->load_data(dev, dev->sg_src, dev->sg_dst);
+	err = rk_dev->load_data(rk_dev, rk_dev->sg_src, rk_dev->sg_dst);
 	if (!err)
-		crypto_dma_start(dev);
+		crypto_dma_start(rk_dev);
 	return err;
 }
 
-static int rk_ablk_start(struct rk_crypto_info *dev)
+static int rk_ablk_start(struct rk_crypto_dev *rk_dev)
 {
 	struct ablkcipher_request *req =
-		ablkcipher_request_cast(dev->async_req);
+		ablkcipher_request_cast(rk_dev->async_req);
 	unsigned long flags;
 	int err = 0;
 
-	dev->left_bytes = req->nbytes;
-	dev->total = req->nbytes;
-	dev->sg_src = req->src;
-	dev->first = req->src;
-	dev->src_nents = sg_nents(req->src);
-	dev->sg_dst = req->dst;
-	dev->dst_nents = sg_nents(req->dst);
-	dev->aligned = 1;
-
-	spin_lock_irqsave(&dev->lock, flags);
-	rk_ablk_hw_init(dev);
-	err = rk_set_data_start(dev);
-	spin_unlock_irqrestore(&dev->lock, flags);
+	rk_dev->left_bytes = req->nbytes;
+	rk_dev->total      = req->nbytes;
+	rk_dev->sg_src     = req->src;
+	rk_dev->first      = req->src;
+	rk_dev->src_nents  = sg_nents(req->src);
+	rk_dev->sg_dst     = req->dst;
+	rk_dev->dst_nents  = sg_nents(req->dst);
+	rk_dev->aligned    = 1;
+
+	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;
 }
 
-static void rk_iv_copyback(struct rk_crypto_info *dev)
+static void rk_iv_copyback(struct rk_crypto_dev *rk_dev)
 {
 	struct ablkcipher_request *req =
-		ablkcipher_request_cast(dev->async_req);
+		ablkcipher_request_cast(rk_dev->async_req);
 	struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
 	struct rk_cipher_ctx *ctx = crypto_ablkcipher_ctx(tfm);
 
@@ -443,12 +430,12 @@ static void rk_iv_copyback(struct rk_crypto_info *dev)
 
 	/* Update the IV buffer to contain the next IV for encryption mode. */
 	if (!IS_BC_DECRYPT(ctx->mode) && req->info) {
-		if (dev->aligned) {
-			memcpy(req->info, sg_virt(dev->sg_dst) +
-				dev->count - ivsize, ivsize);
+		if (rk_dev->aligned) {
+			memcpy(req->info, sg_virt(rk_dev->sg_dst) +
+				rk_dev->count - ivsize, ivsize);
 		} else {
-			memcpy(req->info, dev->addr_vir +
-				dev->count - ivsize, ivsize);
+			memcpy(req->info, rk_dev->addr_vir +
+				rk_dev->count - ivsize, ivsize);
 		}
 	}
 
@@ -458,39 +445,39 @@ static void rk_iv_copyback(struct rk_crypto_info *dev)
  *	true	some err was occurred
  *	fault	no err, continue
  */
-static int rk_ablk_rx(struct rk_crypto_info *dev)
+static int rk_ablk_rx(struct rk_crypto_dev *rk_dev)
 {
 	int err = 0;
 	struct ablkcipher_request *req =
-		ablkcipher_request_cast(dev->async_req);
-
-	dev->unload_data(dev);
-	if (!dev->aligned) {
-		if (!sg_pcopy_from_buffer(req->dst, dev->dst_nents,
-					  dev->addr_vir, dev->count,
-					  dev->total - dev->left_bytes -
-					  dev->count)) {
+		ablkcipher_request_cast(rk_dev->async_req);
+
+	rk_dev->unload_data(rk_dev);
+	if (!rk_dev->aligned) {
+		if (!sg_pcopy_from_buffer(req->dst, rk_dev->dst_nents,
+					  rk_dev->addr_vir, rk_dev->count,
+					  rk_dev->total - rk_dev->left_bytes -
+					  rk_dev->count)) {
 			err = -EINVAL;
 			goto out_rx;
 		}
 	}
-	if (dev->left_bytes) {
-		if (dev->aligned) {
-			if (sg_is_last(dev->sg_src)) {
-				dev_err(dev->dev, "[%s:%d] Lack of data\n",
+	if (rk_dev->left_bytes) {
+		if (rk_dev->aligned) {
+			if (sg_is_last(rk_dev->sg_src)) {
+				dev_err(rk_dev->dev, "[%s:%d] Lack of data\n",
 					__func__, __LINE__);
 				err = -ENOMEM;
 				goto out_rx;
 			}
-			dev->sg_src = sg_next(dev->sg_src);
-			dev->sg_dst = sg_next(dev->sg_dst);
+			rk_dev->sg_src = sg_next(rk_dev->sg_src);
+			rk_dev->sg_dst = sg_next(rk_dev->sg_dst);
 		}
-		err = rk_set_data_start(dev);
+		err = rk_set_data_start(rk_dev);
 	} else {
-		rk_iv_copyback(dev);
+		rk_iv_copyback(rk_dev);
 		/* here show the calculation is over without any err */
-		dev->complete(dev->async_req, 0);
-		tasklet_schedule(&dev->queue_task);
+		rk_dev->complete(rk_dev->async_req, 0);
+		tasklet_schedule(&rk_dev->queue_task);
 	}
 out_rx:
 	return err;
@@ -498,25 +485,26 @@ static int rk_ablk_rx(struct rk_crypto_info *dev)
 
 static int rk_ablk_cra_init(struct crypto_tfm *tfm)
 {
-	struct rk_crypto_tmp *algt = rk_cipher_get_algt(__crypto_ablkcipher_cast(tfm));
+	struct rk_crypto_algt *algt =
+		rk_cipher_get_algt(__crypto_ablkcipher_cast(tfm));
 	struct rk_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
 	const char *alg_name = crypto_tfm_alg_name(tfm);
-	struct rk_crypto_info *info = algt->dev;
+	struct rk_crypto_dev *rk_dev = algt->rk_dev;
 
 	CRYPTO_TRACE();
 
-	if (!info->request_crypto)
+	if (!rk_dev->request_crypto)
 		return -EFAULT;
 
-	info->request_crypto(info, alg_name);
+	rk_dev->request_crypto(rk_dev, alg_name);
 
-	info->align_size = crypto_tfm_alg_blocksize(tfm);
-	info->start = rk_ablk_start;
-	info->update = rk_ablk_rx;
-	info->complete = rk_crypto_complete;
-	info->irq_handle = rk_crypto_irq_handle;
+	rk_dev->align_size = crypto_tfm_alg_blocksize(tfm);
+	rk_dev->start      = rk_ablk_start;
+	rk_dev->update     = rk_ablk_rx;
+	rk_dev->complete   = rk_crypto_complete;
+	rk_dev->irq_handle = rk_crypto_irq_handle;
 
-	ctx->dev = info;
+	ctx->rk_dev = rk_dev;
 
 	if (algt->alg.crypto.cra_flags & CRYPTO_ALG_NEED_FALLBACK) {
 		CRYPTO_MSG("alloc fallback tfm, name = %s", alg_name);
@@ -524,7 +512,7 @@ static int rk_ablk_cra_init(struct crypto_tfm *tfm)
 							  CRYPTO_ALG_ASYNC |
 							  CRYPTO_ALG_NEED_FALLBACK);
 		if (IS_ERR(ctx->fallback_tfm)) {
-			dev_err(info->dev, "Could not load fallback driver %s : %ld.\n",
+			dev_err(rk_dev->dev, "Could not load fallback driver %s : %ld.\n",
 				alg_name, PTR_ERR(ctx->fallback_tfm));
 			return PTR_ERR(ctx->fallback_tfm);
 		}
@@ -544,7 +532,7 @@ static void rk_ablk_cra_exit(struct crypto_tfm *tfm)
 		crypto_free_skcipher(ctx->fallback_tfm);
 	}
 
-	ctx->dev->release_crypto(ctx->dev, crypto_tfm_alg_name(tfm));
+	ctx->rk_dev->release_crypto(ctx->rk_dev, crypto_tfm_alg_name(tfm));
 }
 
 int rk_hw_crypto_v2_init(struct device *dev, void *hw_info)
@@ -576,63 +564,63 @@ void rk_hw_crypto_v2_deinit(struct device *dev, void *hw_info)
 				  info->desc, info->desc_dma);
 }
 
-struct rk_crypto_tmp rk_v2_ecb_sm4_alg =
+struct rk_crypto_algt rk_v2_ecb_sm4_alg =
 	RK_CIPHER_ALGO_INIT(SM4, ECB, ecb(sm4), ecb-sm4-rk);
 
-struct rk_crypto_tmp rk_v2_cbc_sm4_alg =
+struct rk_crypto_algt rk_v2_cbc_sm4_alg =
 	RK_CIPHER_ALGO_INIT(SM4, CBC, cbc(sm4), cbc-sm4-rk);
 
-struct rk_crypto_tmp rk_v2_xts_sm4_alg =
+struct rk_crypto_algt rk_v2_xts_sm4_alg =
 	RK_CIPHER_ALGO_XTS_INIT(SM4, xts(sm4), xts-sm4-rk);
 
-struct rk_crypto_tmp rk_v2_cfb_sm4_alg =
+struct rk_crypto_algt rk_v2_cfb_sm4_alg =
 	RK_CIPHER_ALGO_INIT(SM4, CFB, cfb(sm4), cfb-sm4-rk);
 
-struct rk_crypto_tmp rk_v2_ofb_sm4_alg =
+struct rk_crypto_algt rk_v2_ofb_sm4_alg =
 	RK_CIPHER_ALGO_INIT(SM4, OFB, ofb(sm4), ofb-sm4-rk);
 
-struct rk_crypto_tmp rk_v2_ctr_sm4_alg =
+struct rk_crypto_algt rk_v2_ctr_sm4_alg =
 	RK_CIPHER_ALGO_INIT(SM4, CTR, ctr(sm4), ctr-sm4-rk);
 
-struct rk_crypto_tmp rk_v2_ecb_aes_alg =
+struct rk_crypto_algt rk_v2_ecb_aes_alg =
 	RK_CIPHER_ALGO_INIT(AES, ECB, ecb(aes), ecb-aes-rk);
 
-struct rk_crypto_tmp rk_v2_cbc_aes_alg =
+struct rk_crypto_algt rk_v2_cbc_aes_alg =
 	RK_CIPHER_ALGO_INIT(AES, CBC, cbc(aes), cbc-aes-rk);
 
-struct rk_crypto_tmp rk_v2_xts_aes_alg =
+struct rk_crypto_algt rk_v2_xts_aes_alg =
 	RK_CIPHER_ALGO_XTS_INIT(AES, xts(aes), xts-aes-rk);
 
-struct rk_crypto_tmp rk_v2_cfb_aes_alg =
+struct rk_crypto_algt rk_v2_cfb_aes_alg =
 	RK_CIPHER_ALGO_INIT(AES, CFB, cfb(aes), cfb-aes-rk);
 
-struct rk_crypto_tmp rk_v2_ofb_aes_alg =
+struct rk_crypto_algt rk_v2_ofb_aes_alg =
 	RK_CIPHER_ALGO_INIT(AES, OFB, ofb(aes), ofb-aes-rk);
 
-struct rk_crypto_tmp rk_v2_ctr_aes_alg =
+struct rk_crypto_algt rk_v2_ctr_aes_alg =
 	RK_CIPHER_ALGO_INIT(AES, CTR, ctr(aes), ctr-aes-rk);
 
-struct rk_crypto_tmp rk_v2_ecb_des_alg =
+struct rk_crypto_algt rk_v2_ecb_des_alg =
 	RK_CIPHER_ALGO_INIT(DES, ECB, ecb(des), ecb-des-rk);
 
-struct rk_crypto_tmp rk_v2_cbc_des_alg =
+struct rk_crypto_algt rk_v2_cbc_des_alg =
 	RK_CIPHER_ALGO_INIT(DES, CBC, cbc(des), cbc-des-rk);
 
-struct rk_crypto_tmp rk_v2_cfb_des_alg =
+struct rk_crypto_algt rk_v2_cfb_des_alg =
 	RK_CIPHER_ALGO_INIT(DES, CFB, cfb(des), cfb-des-rk);
 
-struct rk_crypto_tmp rk_v2_ofb_des_alg =
+struct rk_crypto_algt rk_v2_ofb_des_alg =
 	RK_CIPHER_ALGO_INIT(DES, OFB, ofb(des), ofb-des-rk);
 
-struct rk_crypto_tmp rk_v2_ecb_des3_ede_alg =
+struct rk_crypto_algt rk_v2_ecb_des3_ede_alg =
 	RK_CIPHER_ALGO_INIT(DES3_EDE, ECB, ecb(des3_ede), ecb-des3_ede-rk);
 
-struct rk_crypto_tmp rk_v2_cbc_des3_ede_alg =
+struct rk_crypto_algt rk_v2_cbc_des3_ede_alg =
 	RK_CIPHER_ALGO_INIT(DES3_EDE, CBC, cbc(des3_ede), cbc-des3_ede-rk);
 
-struct rk_crypto_tmp rk_v2_cfb_des3_ede_alg =
+struct rk_crypto_algt rk_v2_cfb_des3_ede_alg =
 	RK_CIPHER_ALGO_INIT(DES3_EDE, CFB, cfb(des3_ede), cfb-des3_ede-rk);
 
-struct rk_crypto_tmp rk_v2_ofb_des3_ede_alg =
+struct rk_crypto_algt rk_v2_ofb_des3_ede_alg =
 	RK_CIPHER_ALGO_INIT(DES3_EDE, OFB, ofb(des3_ede), ofb-des3_ede-rk);
 
diff --git a/drivers/crypto/rockchip/rk_crypto_v2_ahash.c b/drivers/crypto/rockchip/rk_crypto_v2_ahash.c
index 71ba22dc8c03..d3b04f1f1909 100644
--- a/drivers/crypto/rockchip/rk_crypto_v2_ahash.c
+++ b/drivers/crypto/rockchip/rk_crypto_v2_ahash.c
@@ -77,54 +77,32 @@ const char *hash_algo2name[] = {
 	[HASH_ALGO_SM3]    = "sm3",
 };
 
-static void word2byte(u32 word, u8 *ch, u32 endian)
+static inline void word2byte_be(u32 word, u8 *ch)
 {
-	/* 0: Big-Endian 1: Little-Endian */
-	if (endian == BIG_ENDIAN) {
-		ch[0] = (word >> 24) & 0xff;
-		ch[1] = (word >> 16) & 0xff;
-		ch[2] = (word >> 8) & 0xff;
-		ch[3] = (word >> 0) & 0xff;
-	} else if (endian == LITTLE_ENDIAN) {
-		ch[0] = (word >> 0) & 0xff;
-		ch[1] = (word >> 8) & 0xff;
-		ch[2] = (word >> 16) & 0xff;
-		ch[3] = (word >> 24) & 0xff;
-	} else {
-		ch[0] = 0;
-		ch[1] = 0;
-		ch[2] = 0;
-		ch[3] = 0;
-	}
+	ch[0] = (word >> 24) & 0xff;
+	ch[1] = (word >> 16) & 0xff;
+	ch[2] = (word >> 8) & 0xff;
+	ch[3] = (word >> 0) & 0xff;
 }
 
-static u32 byte2word(const u8 *ch, u32 endian)
+static inline u32 byte2word_be(const u8 *ch)
 {
-	u32 w = 0;
-
-	/* 0: Big-Endian 1: Little-Endian */
-	if (endian == BIG_ENDIAN)
-		w = (*ch << 24) + (*(ch + 1) << 16) +
+	return (*ch << 24) + (*(ch + 1) << 16) +
 		    (*(ch + 2) << 8) + *(ch + 3);
-	else if (endian == LITTLE_ENDIAN)
-		w = (*(ch + 3) << 24) + (*(ch + 2) << 16) +
-		    (*(ch + 1) << 8) + *ch;
-
-	return w;
 }
 
-static struct rk_crypto_tmp *rk_ahash_get_algt(struct crypto_ahash *tfm)
+static struct rk_crypto_algt *rk_ahash_get_algt(struct crypto_ahash *tfm)
 {
 	struct ahash_alg *alg = __crypto_ahash_alg(tfm->base.__crt_alg);
 
-	return container_of(alg, struct rk_crypto_tmp, alg.hash);
+	return container_of(alg, struct rk_crypto_algt, alg.hash);
 }
 
 static int zero_message_process(struct ahash_request *req)
 {
 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
 	int rk_digest_size = crypto_ahash_digestsize(tfm);
-	struct rk_crypto_tmp *algt = rk_ahash_get_algt(tfm);
+	struct rk_crypto_algt *algt = rk_ahash_get_algt(tfm);
 
 	switch (algt->algo) {
 	case HASH_ALGO_MD5:
@@ -151,40 +129,40 @@ static int zero_message_process(struct ahash_request *req)
 
 static int rk_crypto_irq_handle(int irq, void *dev_id)
 {
-	struct rk_crypto_info *dev  = platform_get_drvdata(dev_id);
+	struct rk_crypto_dev *rk_dev  = platform_get_drvdata(dev_id);
 	u32 interrupt_status;
 	struct rk_hw_crypto_v2_info *hw_info =
-			(struct rk_hw_crypto_v2_info *)dev->hw_info;
+			(struct rk_hw_crypto_v2_info *)rk_dev->hw_info;
 
-	interrupt_status = CRYPTO_READ(dev, CRYPTO_DMA_INT_ST);
-	CRYPTO_WRITE(dev, CRYPTO_DMA_INT_ST, interrupt_status);
+	interrupt_status = CRYPTO_READ(rk_dev, CRYPTO_DMA_INT_ST);
+	CRYPTO_WRITE(rk_dev, CRYPTO_DMA_INT_ST, interrupt_status);
 
 	interrupt_status &= CRYPTO_LOCKSTEP_MASK;
 
 	if (interrupt_status != CRYPTO_SRC_ITEM_DONE_INT_ST) {
-		dev_err(dev->dev, "DMA desc = %p\n", hw_info->desc);
-		dev_err(dev->dev, "DMA addr_in = %08x\n",
-			(u32)dev->addr_in);
-		dev_err(dev->dev, "DMA addr_out = %08x\n",
-			(u32)dev->addr_out);
-		dev_err(dev->dev, "DMA count = %08x\n", dev->count);
-		dev_err(dev->dev, "DMA desc_dma = %08x\n",
+		dev_err(rk_dev->dev, "DMA desc = %p\n", hw_info->desc);
+		dev_err(rk_dev->dev, "DMA addr_in = %08x\n",
+			(u32)rk_dev->addr_in);
+		dev_err(rk_dev->dev, "DMA addr_out = %08x\n",
+			(u32)rk_dev->addr_out);
+		dev_err(rk_dev->dev, "DMA count = %08x\n", rk_dev->count);
+		dev_err(rk_dev->dev, "DMA desc_dma = %08x\n",
 			(u32)hw_info->desc_dma);
-		dev_err(dev->dev, "DMA Error status = %08x\n",
+		dev_err(rk_dev->dev, "DMA Error status = %08x\n",
 			interrupt_status);
-		dev_err(dev->dev, "DMA CRYPTO_DMA_LLI_ADDR status = %08x\n",
-			CRYPTO_READ(dev, CRYPTO_DMA_LLI_ADDR));
-		dev_err(dev->dev, "DMA CRYPTO_DMA_ST status = %08x\n",
-			CRYPTO_READ(dev, CRYPTO_DMA_ST));
-		dev_err(dev->dev, "DMA CRYPTO_DMA_STATE status = %08x\n",
-			CRYPTO_READ(dev, CRYPTO_DMA_STATE));
-		dev_err(dev->dev, "DMA CRYPTO_DMA_LLI_RADDR status = %08x\n",
-			CRYPTO_READ(dev, CRYPTO_DMA_LLI_RADDR));
-		dev_err(dev->dev, "DMA CRYPTO_DMA_SRC_RADDR status = %08x\n",
-			CRYPTO_READ(dev, CRYPTO_DMA_SRC_RADDR));
-		dev_err(dev->dev, "DMA CRYPTO_DMA_DST_RADDR status = %08x\n",
-			CRYPTO_READ(dev, CRYPTO_DMA_DST_RADDR));
-		dev->err = -EFAULT;
+		dev_err(rk_dev->dev, "DMA CRYPTO_DMA_LLI_ADDR status = %08x\n",
+			CRYPTO_READ(rk_dev, CRYPTO_DMA_LLI_ADDR));
+		dev_err(rk_dev->dev, "DMA CRYPTO_DMA_ST status = %08x\n",
+			CRYPTO_READ(rk_dev, CRYPTO_DMA_ST));
+		dev_err(rk_dev->dev, "DMA CRYPTO_DMA_STATE status = %08x\n",
+			CRYPTO_READ(rk_dev, CRYPTO_DMA_STATE));
+		dev_err(rk_dev->dev, "DMA CRYPTO_DMA_LLI_RADDR status = %08x\n",
+			CRYPTO_READ(rk_dev, CRYPTO_DMA_LLI_RADDR));
+		dev_err(rk_dev->dev, "DMA CRYPTO_DMA_SRC_RADDR status = %08x\n",
+			CRYPTO_READ(rk_dev, CRYPTO_DMA_SRC_RADDR));
+		dev_err(rk_dev->dev, "DMA CRYPTO_DMA_DST_RADDR status = %08x\n",
+			CRYPTO_READ(rk_dev, CRYPTO_DMA_DST_RADDR));
+		rk_dev->err = -EFAULT;
 	}
 
 	return 0;
@@ -196,16 +174,16 @@ static void rk_ahash_crypto_complete(struct crypto_async_request *base, int err)
 		base->complete(base, err);
 }
 
-static inline void clear_hash_out_reg(struct rk_crypto_info *dev)
+static inline void clear_hash_out_reg(struct rk_crypto_dev *rk_dev)
 {
 	int i;
 
 	/*clear out register*/
 	for (i = 0; i < 16; i++)
-		CRYPTO_WRITE(dev, CRYPTO_HASH_DOUT_0 + 4 * i, 0);
+		CRYPTO_WRITE(rk_dev, CRYPTO_HASH_DOUT_0 + 4 * i, 0);
 }
 
-static void write_key_reg(struct rk_crypto_info *dev, const u8 *key,
+static void write_key_reg(struct rk_crypto_dev *rk_dev, const u8 *key,
 			  u32 key_len)
 {
 	u32 i;
@@ -214,8 +192,8 @@ static void write_key_reg(struct rk_crypto_info *dev, const u8 *key,
 	chn_base_addr = CRYPTO_CH0_KEY_0;
 
 	for (i = 0; i < key_len / 4; i++, chn_base_addr += 4)
-		CRYPTO_WRITE(dev, chn_base_addr,
-			     byte2word(key + i * 4, BIG_ENDIAN));
+		CRYPTO_WRITE(rk_dev, chn_base_addr,
+			     byte2word_be(key + i * 4));
 }
 
 static int rk_ahash_init(struct ahash_request *req)
@@ -319,8 +297,8 @@ static int rk_ahash_digest(struct ahash_request *req)
 {
 	struct rk_ahash_ctx *tctx = crypto_tfm_ctx(req->base.tfm);
 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
-	struct rk_crypto_tmp *algt = rk_ahash_get_algt(tfm);
-	struct rk_crypto_info *dev = tctx->dev;
+	struct rk_crypto_algt *algt = rk_ahash_get_algt(tfm);
+	struct rk_crypto_dev *rk_dev = tctx->rk_dev;
 
 	CRYPTO_TRACE("calc data %u bytes.", req->nbytes);
 
@@ -329,7 +307,7 @@ static int rk_ahash_digest(struct ahash_request *req)
 		       crypto_ahash_digest(req) :
 		       zero_message_process(req);
 	else
-		return dev->enqueue(dev, &req->base);
+		return rk_dev->enqueue(rk_dev, &req->base);
 }
 
 static int rk_ahash_calc_digest(const char *alg_name, const u8 *key, u32 keylen,
@@ -378,7 +356,7 @@ static int rk_ahash_hmac_setkey(struct crypto_ahash *tfm, const u8 *key,
 {
 	unsigned int blocksize = crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
 	unsigned int digestsize = crypto_ahash_digestsize(tfm);
-	struct rk_crypto_tmp *algt = rk_ahash_get_algt(tfm);
+	struct rk_crypto_algt *algt = rk_ahash_get_algt(tfm);
 	struct rk_ahash_ctx *ctx = crypto_ahash_ctx(tfm);
 	const char *alg_name;
 	int ret;
@@ -420,95 +398,97 @@ static int rk_ahash_hmac_setkey(struct crypto_ahash *tfm, const u8 *key,
 	return ret;
 }
 
-static void rk_ahash_dma_start(struct rk_crypto_info *dev)
+static void rk_ahash_dma_start(struct rk_crypto_dev *rk_dev)
 {
 	struct rk_hw_crypto_v2_info *hw_info =
-			(struct rk_hw_crypto_v2_info *)dev->hw_info;
+			(struct rk_hw_crypto_v2_info *)rk_dev->hw_info;
 
 	CRYPTO_TRACE();
 
 	memset(hw_info->desc, 0x00, sizeof(*hw_info->desc));
 
-	hw_info->desc->src_addr = dev->addr_in;
-	hw_info->desc->src_len  = dev->count;
+	hw_info->desc->src_addr = rk_dev->addr_in;
+	hw_info->desc->src_len  = rk_dev->count;
 	hw_info->desc->next_addr = 0;
 	hw_info->desc->dma_ctrl = 0x00000401;
 	hw_info->desc->user_define = 0x7;
 
 	dma_wmb();
 
-	CRYPTO_WRITE(dev, CRYPTO_DMA_LLI_ADDR, hw_info->desc_dma);
-	CRYPTO_WRITE(dev, CRYPTO_HASH_CTL,
+	CRYPTO_WRITE(rk_dev, CRYPTO_DMA_LLI_ADDR, hw_info->desc_dma);
+	CRYPTO_WRITE(rk_dev, CRYPTO_HASH_CTL,
 		     (CRYPTO_HASH_ENABLE <<
 		      CRYPTO_WRITE_MASK_SHIFT) |
 		      CRYPTO_HASH_ENABLE);
 
-	CRYPTO_WRITE(dev, CRYPTO_DMA_CTL, 0x00010001);/* start */
+	CRYPTO_WRITE(rk_dev, CRYPTO_DMA_CTL, 0x00010001);/* start */
 }
 
-static int rk_ahash_set_data_start(struct rk_crypto_info *dev)
+static int rk_ahash_set_data_start(struct rk_crypto_dev *rk_dev)
 {
 	int err;
 
 	CRYPTO_TRACE();
 
-	err = dev->load_data(dev, dev->sg_src, dev->sg_dst);
+	err = rk_dev->load_data(rk_dev, rk_dev->sg_src, rk_dev->sg_dst);
 	if (!err)
-		rk_ahash_dma_start(dev);
+		rk_ahash_dma_start(rk_dev);
 	return err;
 }
 
-static int rk_ahash_start(struct rk_crypto_info *dev)
+static int rk_ahash_start(struct rk_crypto_dev *rk_dev)
 {
-	struct ahash_request *req = ahash_request_cast(dev->async_req);
+	struct ahash_request *req = ahash_request_cast(rk_dev->async_req);
 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
-	struct rk_crypto_tmp *algt = rk_ahash_get_algt(tfm);
+	struct rk_crypto_algt *algt = rk_ahash_get_algt(tfm);
 	struct rk_ahash_ctx *ctx = crypto_ahash_ctx(tfm);
 	u32 reg_ctrl = 0;
 
 	CRYPTO_TRACE();
 
-	dev->total = req->nbytes;
-	dev->left_bytes = req->nbytes;
-	dev->aligned = 0;
-	dev->align_size = 4;
-	dev->sg_dst = NULL;
-	dev->sg_src = req->src;
-	dev->first = req->src;
-	dev->src_nents = sg_nents(req->src);
+	rk_dev->total      = req->nbytes;
+	rk_dev->left_bytes = req->nbytes;
+	rk_dev->aligned    = 0;
+	rk_dev->align_size = 4;
+	rk_dev->sg_dst     = NULL;
+	rk_dev->sg_src     = req->src;
+	rk_dev->first      = req->src;
+	rk_dev->src_nents  = sg_nents(req->src);
 
 	if (algt->algo >= ARRAY_SIZE(hash_algo2bc))
 		goto exit;
 
 	reg_ctrl |= hash_algo2bc[algt->algo];
-	clear_hash_out_reg(dev);
+	clear_hash_out_reg(rk_dev);
 
 	reg_ctrl |= CRYPTO_HW_PAD_ENABLE;
 
 	if (IS_TYPE_HMAC(algt->type)) {
 		CRYPTO_TRACE("this is hmac");
 		reg_ctrl |= CRYPTO_HMAC_ENABLE;
-		write_key_reg(dev, ctx->authkey, sizeof(ctx->authkey));
+		write_key_reg(rk_dev, ctx->authkey, sizeof(ctx->authkey));
 	}
 
-	CRYPTO_WRITE(dev, CRYPTO_HASH_CTL, reg_ctrl | CRYPTO_WRITE_MASK_ALL);
+	CRYPTO_WRITE(rk_dev, CRYPTO_HASH_CTL, reg_ctrl | CRYPTO_WRITE_MASK_ALL);
 
-	CRYPTO_WRITE(dev, CRYPTO_FIFO_CTL, 0x00030003);
-	CRYPTO_WRITE(dev, CRYPTO_DMA_INT_EN, 0x7f);
+	CRYPTO_WRITE(rk_dev, CRYPTO_FIFO_CTL, 0x00030003);
+	CRYPTO_WRITE(rk_dev, CRYPTO_DMA_INT_EN, 0x7f);
 
-	return rk_ahash_set_data_start(dev);
+	return rk_ahash_set_data_start(rk_dev);
 exit:
-	CRYPTO_WRITE(dev, CRYPTO_HASH_CTL, CRYPTO_WRITE_MASK_ALL | 0);
+	CRYPTO_WRITE(rk_dev, CRYPTO_HASH_CTL, CRYPTO_WRITE_MASK_ALL | 0);
 	return -1;
 }
 
-static int rk_ahash_get_result(struct rk_crypto_info *dev, uint8_t *data, uint32_t data_len)
+static int rk_ahash_get_result(struct rk_crypto_dev *rk_dev,
+			       uint8_t *data, uint32_t data_len)
 {
 	int ret;
 	u32 i, offset;
 	u32 reg_ctrl = 0;
 
-	ret = readl_poll_timeout_atomic(dev->reg + CRYPTO_HASH_VALID, reg_ctrl,
+	ret = readl_poll_timeout_atomic(rk_dev->reg + CRYPTO_HASH_VALID,
+					reg_ctrl,
 					reg_ctrl & CRYPTO_HASH_IS_VALID,
 					RK_POLL_PERIOD_US,
 					RK_POLL_TIMEOUT_US);
@@ -517,43 +497,43 @@ static int rk_ahash_get_result(struct rk_crypto_info *dev, uint8_t *data, uint32
 
 	offset = CRYPTO_HASH_DOUT_0;
 	for (i = 0; i < data_len / 4; i++, offset += 4)
-		word2byte(CRYPTO_READ(dev, offset),
-			  data + i * 4, BIG_ENDIAN);
+		word2byte_be(CRYPTO_READ(rk_dev, offset),
+			  data + i * 4);
 
 	if (data_len % 4) {
 		uint8_t tmp_buf[4];
 
-		word2byte(CRYPTO_READ(dev, offset), tmp_buf, BIG_ENDIAN);
+		word2byte_be(CRYPTO_READ(rk_dev, offset), tmp_buf);
 		memcpy(data + i * 4, tmp_buf, data_len % 4);
 	}
 
-	CRYPTO_WRITE(dev, CRYPTO_HASH_VALID, CRYPTO_HASH_IS_VALID);
+	CRYPTO_WRITE(rk_dev, CRYPTO_HASH_VALID, CRYPTO_HASH_IS_VALID);
 
 exit:
 	return ret;
 }
 
-static int rk_ahash_crypto_rx(struct rk_crypto_info *dev)
+static int rk_ahash_crypto_rx(struct rk_crypto_dev *rk_dev)
 {
 	int err = 0;
-	struct ahash_request *req = ahash_request_cast(dev->async_req);
+	struct ahash_request *req = ahash_request_cast(rk_dev->async_req);
 	struct crypto_ahash *tfm;
 
 	CRYPTO_TRACE();
 
-	dev->unload_data(dev);
-	CRYPTO_TRACE("left bytes = %u", dev->left_bytes);
-	if (dev->left_bytes) {
-		if (dev->aligned) {
-			if (sg_is_last(dev->sg_src)) {
-				dev_warn(dev->dev, "[%s:%d], Lack of data\n",
+	rk_dev->unload_data(rk_dev);
+	CRYPTO_TRACE("left bytes = %u", rk_dev->left_bytes);
+	if (rk_dev->left_bytes) {
+		if (rk_dev->aligned) {
+			if (sg_is_last(rk_dev->sg_src)) {
+				dev_warn(rk_dev->dev, "[%s:%d], Lack of data\n",
 					 __func__, __LINE__);
 				err = -ENOMEM;
 				goto out_rx;
 			}
-			dev->sg_src = sg_next(dev->sg_src);
+			rk_dev->sg_src = sg_next(rk_dev->sg_src);
 		}
-		err = rk_ahash_set_data_start(dev);
+		err = rk_ahash_set_data_start(rk_dev);
 	} else {
 		/*
 		 * it will take some time to process date after last dma
@@ -562,10 +542,11 @@ static int rk_ahash_crypto_rx(struct rk_crypto_info *dev)
 
 		tfm = crypto_ahash_reqtfm(req);
 
-		err = rk_ahash_get_result(dev, req->result, crypto_ahash_digestsize(tfm));
+		err = rk_ahash_get_result(rk_dev, req->result,
+					  crypto_ahash_digestsize(tfm));
 
-		dev->complete(dev->async_req, err);
-		tasklet_schedule(&dev->queue_task);
+		rk_dev->complete(rk_dev->async_req, err);
+		tasklet_schedule(&rk_dev->queue_task);
 	}
 
 out_rx:
@@ -575,31 +556,33 @@ static int rk_ahash_crypto_rx(struct rk_crypto_info *dev)
 
 static int rk_cra_hash_init(struct crypto_tfm *tfm)
 {
-	struct rk_crypto_tmp *algt = rk_ahash_get_algt(__crypto_ahash_cast(tfm));
+	struct rk_crypto_algt *algt =
+		rk_ahash_get_algt(__crypto_ahash_cast(tfm));
 	const char *alg_name = crypto_tfm_alg_name(tfm);
 	struct rk_ahash_ctx *ctx = crypto_tfm_ctx(tfm);
-	struct rk_crypto_info *info = algt->dev;
+	struct rk_crypto_dev *rk_dev = algt->rk_dev;
 
 	CRYPTO_TRACE();
 
-	if (!info->request_crypto)
+	if (!rk_dev->request_crypto)
 		return -EFAULT;
 
-	info->request_crypto(info, alg_name);
-	info->start = rk_ahash_start;
-	info->update = rk_ahash_crypto_rx;
-	info->complete = rk_ahash_crypto_complete;
-	info->irq_handle = rk_crypto_irq_handle;
+	rk_dev->request_crypto(rk_dev, alg_name);
+
+	rk_dev->start      = rk_ahash_start;
+	rk_dev->update     = rk_ahash_crypto_rx;
+	rk_dev->complete   = rk_ahash_crypto_complete;
+	rk_dev->irq_handle = rk_crypto_irq_handle;
 
 	memset(ctx, 0x00, sizeof(*ctx));
 
-	ctx->dev = info;
+	ctx->rk_dev = rk_dev;
 
 	/* for fallback */
 	ctx->fallback_tfm = crypto_alloc_ahash(alg_name, 0,
 					       CRYPTO_ALG_NEED_FALLBACK);
 	if (IS_ERR(ctx->fallback_tfm)) {
-		dev_err(info->dev, "Could not load fallback driver.\n");
+		dev_err(rk_dev->dev, "Could not load fallback driver.\n");
 		return PTR_ERR(ctx->fallback_tfm);
 	}
 
@@ -621,18 +604,18 @@ static void rk_cra_hash_exit(struct crypto_tfm *tfm)
 	if (ctx->fallback_tfm)
 		crypto_free_ahash(ctx->fallback_tfm);
 
-	ctx->dev->release_crypto(ctx->dev, crypto_tfm_alg_name(tfm));
+	ctx->rk_dev->release_crypto(ctx->rk_dev, crypto_tfm_alg_name(tfm));
 }
 
-struct rk_crypto_tmp rk_v2_ahash_md5 = RK_HASH_ALGO_INIT(MD5, md5);
-struct rk_crypto_tmp rk_v2_ahash_sha1 = RK_HASH_ALGO_INIT(SHA1, sha1);
-struct rk_crypto_tmp rk_v2_ahash_sha256 = RK_HASH_ALGO_INIT(SHA256, sha256);
-struct rk_crypto_tmp rk_v2_ahash_sha512 = RK_HASH_ALGO_INIT(SHA512, sha512);
-struct rk_crypto_tmp rk_v2_ahash_sm3 = RK_HASH_ALGO_INIT(SM3, sm3);
-
-struct rk_crypto_tmp rk_v2_ahash_hmac_md5 = RK_HMAC_ALGO_INIT(MD5, md5);
-struct rk_crypto_tmp rk_v2_ahash_hmac_sha1 = RK_HMAC_ALGO_INIT(SHA1, sha1);
-struct rk_crypto_tmp rk_v2_ahash_hmac_sha256 = RK_HMAC_ALGO_INIT(SHA256, sha256);
-struct rk_crypto_tmp rk_v2_ahash_hmac_sha512 = RK_HMAC_ALGO_INIT(SHA512, sha512);
-struct rk_crypto_tmp rk_v2_ahash_hmac_sm3 = RK_HMAC_ALGO_INIT(SM3, sm3);
+struct rk_crypto_algt rk_v2_ahash_md5    = RK_HASH_ALGO_INIT(MD5, md5);
+struct rk_crypto_algt rk_v2_ahash_sha1   = RK_HASH_ALGO_INIT(SHA1, sha1);
+struct rk_crypto_algt rk_v2_ahash_sha256 = RK_HASH_ALGO_INIT(SHA256, sha256);
+struct rk_crypto_algt rk_v2_ahash_sha512 = RK_HASH_ALGO_INIT(SHA512, sha512);
+struct rk_crypto_algt rk_v2_ahash_sm3    = RK_HASH_ALGO_INIT(SM3, sm3);
+
+struct rk_crypto_algt rk_v2_hmac_md5     = RK_HMAC_ALGO_INIT(MD5, md5);
+struct rk_crypto_algt rk_v2_hmac_sha1    = RK_HMAC_ALGO_INIT(SHA1, sha1);
+struct rk_crypto_algt rk_v2_hmac_sha256  = RK_HMAC_ALGO_INIT(SHA256, sha256);
+struct rk_crypto_algt rk_v2_hmac_sha512  = RK_HMAC_ALGO_INIT(SHA512, sha512);
+struct rk_crypto_algt rk_v2_hmac_sm3     = RK_HMAC_ALGO_INIT(SM3, sm3);
 
diff --git a/drivers/crypto/rockchip/rk_crypto_v2_akcipher.c b/drivers/crypto/rockchip/rk_crypto_v2_akcipher.c
index 4daf1e94b158..2781c963fd0b 100644
--- a/drivers/crypto/rockchip/rk_crypto_v2_akcipher.c
+++ b/drivers/crypto/rockchip/rk_crypto_v2_akcipher.c
@@ -162,7 +162,7 @@ static int rk_rsa_calc(struct akcipher_request *req, bool encypt)
 		goto exit;
 
 	if (!sg_copy_to_buffer(req->src, sg_nents(req->src), tmp_buf, req->src_len)) {
-		dev_err(ctx->dev->dev, "[%s:%d] sg copy err\n",
+		dev_err(ctx->rk_dev->dev, "[%s:%d] sg copy err\n",
 			__func__, __LINE__);
 		ret =  -EINVAL;
 		goto exit;
@@ -190,7 +190,7 @@ static int rk_rsa_calc(struct akcipher_request *req, bool encypt)
 	CRYPTO_DUMPHEX("tmp_buf = ", tmp_buf, key_byte_size);
 
 	if (!sg_copy_from_buffer(req->dst, sg_nents(req->dst), tmp_buf, key_byte_size)) {
-		dev_err(ctx->dev->dev, "[%s:%d] sg copy err\n",
+		dev_err(ctx->rk_dev->dev, "[%s:%d] sg copy err\n",
 			__func__, __LINE__);
 		ret =  -EINVAL;
 		goto exit;
@@ -222,14 +222,14 @@ static int rk_rsa_dec(struct akcipher_request *req)
 	return rk_rsa_calc(req, false);
 }
 
-static int rk_rsa_start(struct rk_crypto_info *dev)
+static int rk_rsa_start(struct rk_crypto_dev *rk_dev)
 {
 	CRYPTO_TRACE();
 
 	return -ENOSYS;
 }
 
-static int rk_rsa_crypto_rx(struct rk_crypto_info *dev)
+static int rk_rsa_crypto_rx(struct rk_crypto_dev *rk_dev)
 {
 	CRYPTO_TRACE();
 
@@ -246,27 +246,27 @@ static int rk_rsa_init_tfm(struct crypto_akcipher *tfm)
 {
 	struct rk_rsa_ctx *ctx = akcipher_tfm_ctx(tfm);
 	struct akcipher_alg *alg = __crypto_akcipher_alg(tfm->base.__crt_alg);
-	struct rk_crypto_tmp *algt;
-	struct rk_crypto_info *info;
+	struct rk_crypto_algt *algt;
+	struct rk_crypto_dev *rk_dev;
 
 	CRYPTO_TRACE();
 
-	algt = container_of(alg, struct rk_crypto_tmp, alg.asym);
-	info = algt->dev;
+	algt = container_of(alg, struct rk_crypto_algt, alg.asym);
+	rk_dev = algt->rk_dev;
 
-	if (!info->request_crypto)
+	if (!rk_dev->request_crypto)
 		return -EFAULT;
 
-	info->request_crypto(info, "rsa");
+	rk_dev->request_crypto(rk_dev, "rsa");
 
-	info->align_size = crypto_tfm_alg_alignmask(&tfm->base) + 1;
-	info->start = rk_rsa_start;
-	info->update = rk_rsa_crypto_rx;
-	info->complete = rk_rsa_complete;
+	rk_dev->align_size = crypto_tfm_alg_alignmask(&tfm->base) + 1;
+	rk_dev->start      = rk_rsa_start;
+	rk_dev->update     = rk_rsa_crypto_rx;
+	rk_dev->complete   = rk_rsa_complete;
 
-	ctx->dev = info;
+	ctx->rk_dev = rk_dev;
 
-	rk_pka_set_crypto_base(ctx->dev->pka_reg);
+	rk_pka_set_crypto_base(ctx->rk_dev->pka_reg);
 
 	return 0;
 }
@@ -279,10 +279,10 @@ static void rk_rsa_exit_tfm(struct crypto_akcipher *tfm)
 
 	rk_rsa_clear_ctx(ctx);
 
-	ctx->dev->release_crypto(ctx->dev, "rsa");
+	ctx->rk_dev->release_crypto(ctx->rk_dev, "rsa");
 }
 
-struct rk_crypto_tmp rk_v2_asym_rsa = {
+struct rk_crypto_algt rk_v2_asym_rsa = {
 	.name = "rsa",
 	.type = ALG_TYPE_ASYM,
 	.alg.asym = {
diff --git a/drivers/crypto/rockchip/rk_crypto_v2_reg.h b/drivers/crypto/rockchip/rk_crypto_v2_reg.h
index 69330dd967bd..c2a0ef10e85e 100644
--- a/drivers/crypto/rockchip/rk_crypto_v2_reg.h
+++ b/drivers/crypto/rockchip/rk_crypto_v2_reg.h
@@ -319,10 +319,5 @@
 #define	CRYPTO_SRAM_BASE		(0x01000 - CRYPTO_PKA_BASE_OFFSET)
 #define	CRYPTO_SRAM_SIZE		0x01000
 
-enum endian_mode {
-	BIG_ENDIAN = 0,
-	LITTLE_ENDIAN
-};
-
 #endif
 

commit 50f13f96cedc54a7ba5abaccf1d54b7efb15c1d8
Author: Lin Jinhan <troy.lin@rock-chips.com>
Date:   Tue May 11 16:13:43 2021 +0800

    crypto: rockchip: add rk3568 support
    
    Change-Id: Ie83dc798cd584d74d9e9b068af17518596ac82dc
    Signed-off-by: Lin Jinhan <troy.lin@rock-chips.com>

diff --git a/drivers/crypto/rockchip/rk_crypto_core.c b/drivers/crypto/rockchip/rk_crypto_core.c
index fd8c425312cb..9bf7b65acdee 100644
--- a/drivers/crypto/rockchip/rk_crypto_core.c
+++ b/drivers/crypto/rockchip/rk_crypto_core.c
@@ -443,12 +443,25 @@ static char *rv1126_algs_name[] = {
 	"rsa"
 };
 
+static char *rk3568_algs_name[] = {
+	"ecb(sm4)", "cbc(sm4)", "cfb(sm4)", "ofb(sm4)", "ctr(sm4)", "xts(sm4)",
+	"ecb(aes)", "cbc(aes)", "cfb(aes)", "ctr(aes)", "xts(aes)",
+	"ecb(des)", "cbc(des)", "cfb(des)", "ofb(des)",
+	"ecb(des3_ede)", "cbc(des3_ede)", "cfb(des3_ede)", "ofb(des3_ede)",
+	"sha1", "sha256", "sha512", "md5", "sm3",
+	"hmac(sha1)", "hmac(sha256)", "hmac(sha512)", "hmac(md5)", "hmac(sm3)",
+	"rsa"
+};
+
 static const struct rk_crypto_soc_data px30_soc_data =
 	RK_CRYPTO_V2_SOC_DATA_INIT(px30_algs_name, false);
 
 static const struct rk_crypto_soc_data rv1126_soc_data =
 	RK_CRYPTO_V2_SOC_DATA_INIT(rv1126_algs_name, true);
 
+static const struct rk_crypto_soc_data rk3568_soc_data =
+	RK_CRYPTO_V2_SOC_DATA_INIT(rk3568_algs_name, false);
+
 static const char * const crypto_v1_rsts[] = {
 	"crypto-rst",
 };
@@ -488,6 +501,10 @@ static const struct of_device_id crypto_of_id_table[] = {
 		.compatible = "rockchip,rv1126-crypto",
 		.data = (void *)&rv1126_soc_data,
 	},
+	{
+		.compatible = "rockchip,rk3568-crypto",
+		.data = (void *)&rk3568_soc_data,
+	},
 	/* crypto v1 in belows */
 	{
 		.compatible = "rockchip,rk3288-crypto",

commit 44e7c0083349a557654fc61c034d68622d0c9f88
Author: Lin Jinhan <troy.lin@rock-chips.com>
Date:   Tue May 11 16:12:32 2021 +0800

    arm64: dts: rockchip: rk3568: add crypto node
    
    Change-Id: Icb7a7e01ec83ebe01f32224108c102a1c7bf2fdd
    Signed-off-by: Lin Jinhan <troy.lin@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index eb6dfe1db61e..ebf052798e87 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -2370,6 +2370,20 @@
 		status = "disabled";
 	};
 
+	crypto: crypto@fe380000 {
+		compatible = "rockchip,rk3568-crypto";
+		reg = <0x0 0xfe380000 0x0 0x4000>;
+		interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&cru ACLK_CRYPTO_NS>, <&cru HCLK_CRYPTO_NS>,
+			<&cru CLK_CRYPTO_NS_CORE>, <&cru CLK_CRYPTO_NS_PKA>;
+		clock-names = "aclk", "hclk", "sclk", "apb_pclk";
+		assigned-clocks = <&cru CLK_CRYPTO_NS_CORE>;
+		assigned-clock-rates = <200000000>;
+		resets = <&cru SRST_CRYPTO_NS_CORE>;
+		reset-names = "crypto-rst";
+		status = "disabled";
+	};
+
 	rng: rng@fe388000 {
 		compatible = "rockchip,cryptov2-rng";
 		reg = <0x0 0xfe388000 0x0 0x2000>;

commit 788e3c89ee1eaebe7f0c9436c441ee79c87ba64a
Author: Lin Jinhan <troy.lin@rock-chips.com>
Date:   Tue May 11 16:09:25 2021 +0800

    crypto: rockchip: mask lock_step error int flag
    
    lock_step will accidentally triggered sometimes.
    
    Change-Id: I401c662d515cf17e6c89dfb2dfa4b33b6866b8a5
    Signed-off-by: Lin Jinhan <troy.lin@rock-chips.com>

diff --git a/drivers/crypto/rockchip/rk_crypto_v2_ablkcipher.c b/drivers/crypto/rockchip/rk_crypto_v2_ablkcipher.c
index 960129c11c90..87b09a539f21 100644
--- a/drivers/crypto/rockchip/rk_crypto_v2_ablkcipher.c
+++ b/drivers/crypto/rockchip/rk_crypto_v2_ablkcipher.c
@@ -44,6 +44,8 @@ static int rk_crypto_irq_handle(int irq, void *dev_id)
 	interrupt_status = CRYPTO_READ(dev, CRYPTO_DMA_INT_ST);
 	CRYPTO_WRITE(dev, CRYPTO_DMA_INT_ST, interrupt_status);
 
+	interrupt_status &= CRYPTO_LOCKSTEP_MASK;
+
 	if (interrupt_status != CRYPTO_DST_ITEM_DONE_INT_ST) {
 		dev_err(dev->dev, "DMA desc = %p\n", hw_info->desc);
 		dev_err(dev->dev, "DMA addr_in = %08x\n",
diff --git a/drivers/crypto/rockchip/rk_crypto_v2_ahash.c b/drivers/crypto/rockchip/rk_crypto_v2_ahash.c
index 5733380c3e4d..71ba22dc8c03 100644
--- a/drivers/crypto/rockchip/rk_crypto_v2_ahash.c
+++ b/drivers/crypto/rockchip/rk_crypto_v2_ahash.c
@@ -159,6 +159,8 @@ static int rk_crypto_irq_handle(int irq, void *dev_id)
 	interrupt_status = CRYPTO_READ(dev, CRYPTO_DMA_INT_ST);
 	CRYPTO_WRITE(dev, CRYPTO_DMA_INT_ST, interrupt_status);
 
+	interrupt_status &= CRYPTO_LOCKSTEP_MASK;
+
 	if (interrupt_status != CRYPTO_SRC_ITEM_DONE_INT_ST) {
 		dev_err(dev->dev, "DMA desc = %p\n", hw_info->desc);
 		dev_err(dev->dev, "DMA addr_in = %08x\n",
diff --git a/drivers/crypto/rockchip/rk_crypto_v2_reg.h b/drivers/crypto/rockchip/rk_crypto_v2_reg.h
index 96b6cd446419..69330dd967bd 100644
--- a/drivers/crypto/rockchip/rk_crypto_v2_reg.h
+++ b/drivers/crypto/rockchip/rk_crypto_v2_reg.h
@@ -32,6 +32,7 @@
 #define CRYPTO_LIST_DONE_INT_EN		BIT(0)
 
 #define CRYPTO_DMA_INT_ST		0x000C
+#define CRYPTO_LOCKSTEP_INT_ST		BIT(7)
 #define CRYPTO_ZERO_LEN_INT_ST		BIT(6)
 #define CRYPTO_LIST_ERR_INT_ST		BIT(5)
 #define CRYPTO_SRC_ERR_INT_ST		BIT(4)
@@ -40,6 +41,7 @@
 #define CRYPTO_DST_ITEM_DONE_INT_ST	BIT(1)
 #define CRYPTO_LIST_DONE_INT_ST		BIT(0)
 
+#define CRYPTO_LOCKSTEP_MASK		(~((u32)CRYPTO_LOCKSTEP_INT_ST))
 #define CRYPTO_DMA_CTL			0x0010
 #define CRYPTO_DMA_RESTART		BIT(1)
 #define CRYPTO_DMA_START		BIT(0)

commit b25c12a00a9aeac8d8678ca469c5f3bcb6e2c200
Author: Wu Liangqing <wlq@rock-chips.com>
Date:   Mon May 24 17:12:21 2021 +0800

    scripts: add io-domain.sh for rk356x io-domain check
    
    Change-Id: Iac84a3236835fcc4dc686a579ef2930343885690
    Signed-off-by: Wu Liangqing <wlq@rock-chips.com>

diff --git a/scripts/io-domain.sh b/scripts/io-domain.sh
new file mode 100755
index 000000000000..58d9b6bccd9a
--- /dev/null
+++ b/scripts/io-domain.sh
@@ -0,0 +1,323 @@
+#!/bin/sh
+# SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+# Copyright (c) 2021 Rockchip Electronics Co., Ltd.
+
+PMUIO1=0
+PMUIO2=0
+VCCIO1=0
+VCCIO3=0
+VCCIO4=0
+VCCIO5=0
+VCCIO6=0
+VCCIO7=0
+
+DTS_PMUIO1=0
+DTS_PMUIO2=0
+DTS_VCCIO1=0
+DTS_VCCIO3=0
+DTS_VCCIO4=0
+DTS_VCCIO5=0
+DTS_VCCIO6=0
+DTS_VCCIO7=0
+
+DTS_NAME=$1.dts.tmp
+
+CheckBckfileRet=0
+checklistRst=0
+GetVoltageFromDtsVal=0
+
+ShowChecklist()
+{
+	PMUIO1=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
+	"Get the corresponding value from the hardware schematic diagram" 15 60 2 \
+	"1800000" "PMUIO1 Supply Power Voltage(uV)" \
+	"3300000" "PMUIO1 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
+	exitstatus=$?
+	if [ $exitstatus != 0 ]; then
+		echo "You chose Cancel."
+		checklistRst=1
+	fi
+
+	PMUIO2=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
+	"Get the corresponding value from the hardware schematic diagram" 15 60 2 \
+	"1800000" "PMUIO2 Supply Power Voltage(uV)" \
+	"3300000" "PMUIO2 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
+	exitstatus=$?
+	if [ $exitstatus != 0 ]; then
+		echo "You chose Cancel."
+		checklistRst=1
+	fi
+
+	VCCIO1=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
+	"Get the corresponding value from the hardware schematic diagram" 15 60 2 \
+	"1800000" "VCCIO1 Supply Power Voltage(uV)" \
+	"3300000" "VCCIO1 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
+	exitstatus=$?
+	if [ $exitstatus != 0 ]; then
+		echo "You chose Cancel."
+		checklistRst=1
+	fi
+
+	VCCIO3=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
+	"Get the corresponding value from the hardware schematic diagram" 15 60 2 \
+	"1800000" "VCCIO3 Supply Power Voltage(uV)" \
+	"3300000" "VCCIO3 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
+	exitstatus=$?
+	if [ $exitstatus != 0 ]; then
+		echo "You chose Cancel."
+		checklistRst=1
+	fi
+
+	VCCIO4=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
+	"Get the corresponding value from the hardware schematic diagram" 15 60 2 \
+	"1800000" "VCCIO4 Supply Power Voltage(uV)" \
+	"3300000" "VCCIO4 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
+	exitstatus=$?
+	if [ $exitstatus != 0 ]; then
+		echo "You chose Cancel."
+		checklistRst=1
+	fi
+
+	VCCIO5=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
+	"Get the corresponding value from the hardware schematic diagram" 15 60 2 \
+	"1800000" "VCCIO5 Supply Power Voltage(uV)" \
+	"3300000" "VCCIO5 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
+	exitstatus=$?
+	if [ $exitstatus != 0 ]; then
+		echo "You chose Cancel."
+		checklistRst=1
+	fi
+
+	VCCIO6=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
+	"Get the corresponding value from the hardware schematic diagram" 15 60 2 \
+	"1800000" "VCCIO6 Supply Power Voltage(uV)" \
+	"3300000" "VCCIO6 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
+	exitstatus=$?
+	if [ $exitstatus != 0 ]; then
+		echo "You chose Cancel."
+		checklistRst=1
+	fi
+
+	VCCIO7=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
+	"Get the corresponding value from the hardware schematic diagram" 15 60 2 \
+	"1800000" "VCCIO7 Supply Power Voltage(uV)" \
+	"3300000" "VCCIO7 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
+	exitstatus=$?
+	if [ $exitstatus != 0 ]; then
+		echo "You chose Cancel."
+		checklistRst=1
+	fi
+}
+
+DtsIoDomainVoltageVal=0
+DtsIoDomainVoltage()
+{
+	DtsIoDomainVoltageVal=0
+	flags=0
+	if [ -f $DTS_NAME ];then
+		echo "found $DTS_NAME"
+	fi
+	supply=$(cat $DTS_NAME \
+			| grep $1 \
+			| cut -d "&" -f 2 \
+			| cut -d ">" -f 1)
+	#supply_str=$supply":"
+
+	ldo_str=$(cat $DTS_NAME  \
+		| awk 'BEGIN {RS="\n\n+";ORS="\n\n"}/regulator-name/{print $0}' \
+		| awk BEGIN{RS=EOF}'{gsub(/\n/," ");print $0}' \
+		| grep $supply \
+		| awk '{print $2}' \
+		| awk -F 'SWITCH_REG' '{print $2}')
+
+	if [ "$ldo_str" != "" ];then
+		DtsIoDomainVoltageVal=3300000
+	else
+		DtsIoDomainVoltageVal=$(cat $DTS_NAME  \
+			| awk 'BEGIN {RS="\n\n+";ORS="\n\n"}/regulator-name/{print $0}' \
+			| awk BEGIN{RS=EOF}'{gsub(/\n/," ");print $0}' \
+			|grep $supply \
+			| awk -F 'regulator-max-microvolt' '{print $2}' \
+			| cut -d "<" -f 2 \
+			| cut -d ">" -f 1)
+	fi
+}
+
+GetIoDomainVoltageFromDts()
+{
+	DtsIoDomainVoltage "pmuio1-supply"
+	DTS_PMUIO1=$DtsIoDomainVoltageVal
+	DtsIoDomainVoltage "pmuio2-supply"
+	DTS_PMUIO2=$DtsIoDomainVoltageVal
+	DtsIoDomainVoltage "vccio1-supply"
+	DTS_VCCIO1=$DtsIoDomainVoltageVal
+	DtsIoDomainVoltage "vccio3-supply"
+	DTS_VCCIO3=$DtsIoDomainVoltageVal
+	DtsIoDomainVoltage "vccio4-supply"
+	DTS_VCCIO4=$DtsIoDomainVoltageVal
+	DtsIoDomainVoltage "vccio5-supply"
+	DTS_VCCIO5=$DtsIoDomainVoltageVal
+	DtsIoDomainVoltage "vccio6-supply"
+	DTS_VCCIO6=$DtsIoDomainVoltageVal
+	DtsIoDomainVoltage "vccio7-supply"
+	DTS_VCCIO7=$DtsIoDomainVoltageVal
+}
+
+CheckVoltageWithBackupfile()
+{
+	CheckBckfileRet=2
+	val=$(cat $DTS_NAME.domain \
+			| grep PMUIO1 \
+			| cut -d ":" -f 2)
+	if [ "$val" != "$DTS_PMUIO1" ];then
+		CheckBckfileRet=1
+		echo "PMUIO1 Supply Power Voltage has changed!!! please reconfirm!!!"
+	fi
+	val=$(cat $DTS_NAME.domain \
+			| grep PMUIO2 \
+			| cut -d ":" -f 2)
+	if [ "$val" != "$DTS_PMUIO2" ];then
+		CheckBckfileRet=1
+		echo "PMUIO2 Supply Power Voltage has changed!!! please reconfirm!!!"
+	fi
+	val=$(cat $DTS_NAME.domain \
+			| grep VCCIO1 \
+			| cut -d ":" -f 2)
+	if [ "$val" != "$DTS_VCCIO1" ];then
+		CheckBckfileRet=1
+		echo "VCCIO1 Supply Power Voltage has changed!!! please reconfirm!!!"
+	fi
+	val=$(cat $DTS_NAME.domain \
+			| grep VCCIO3 \
+			| cut -d ":" -f 2)
+	if [ "$val" != "$DTS_VCCIO3" ];then
+		CheckBckfileRet=1
+		echo "VCCIO3 Supply Power Voltage has changed!!! please reconfirm!!!"
+	fi
+	val=$(cat $DTS_NAME.domain | grep VCCIO4 | cut -d ":" -f 2)
+	if [ "$val" != "$DTS_VCCIO4" ];then
+		ret=1
+		echo "VCCIO4 Supply Power Voltage has changed!!! please reconfirm!!!"
+	fi
+	val=$(cat $DTS_NAME.domain \
+			| grep VCCIO5 \
+			| cut -d ":" -f 2)
+	if [ "$val" != "$DTS_VCCIO5" ];then
+		CheckBckfileRet=1
+		echo "VCCIO5 Supply Power Voltage has changed!!! please reconfirm!!!"
+	fi
+	val=$(cat $DTS_NAME.domain \
+			| grep VCCIO6 \
+			| cut -d ":" -f 2)
+	if [ "$val" != "$DTS_VCCIO6" ];then
+		CheckBckfileRet=1
+		echo "VCCIO6 Supply Power Voltage has changed!!! please reconfirm!!!"
+	fi
+	val=$(cat $DTS_NAME.domain \
+			| grep VCCIO7 \
+			| cut -d ":" -f 2)
+	if [ "$val" != "$DTS_VCCIO7" ];then
+		CheckBckfileRet=1
+		echo "VCCIO7 Supply Power Voltage has changed!!! please reconfirm!!!"
+	fi
+}
+
+CheckVoltageWithEnter()
+{
+	checklistRst=0
+	if [ "$PMUIO1" -ne "$DTS_PMUIO1" ];then
+		checklistRst=1
+		echo "PMUIO1 Supply Power Voltage has changed!!! please reconfirm!!!"
+	fi
+	if [ $PMUIO2 -ne $DTS_PMUIO2 ];then
+		checklistRst=1
+		echo "PMUIO2 Supply Power Voltage has changed!!! please reconfirm!!!"
+	fi
+	if [ $VCCIO1 -ne $DTS_VCCIO1 ];then
+		checklistRst=1
+		echo "VCCIO1 Supply Power Voltage has changed!!! please reconfirm!!!"
+	fi
+	if [ $VCCIO3 -ne $DTS_VCCIO3 ];then
+		checklistRst=1
+		echo "VCCIO3 Supply Power Voltage has changed!!! please reconfirm!!!"
+	fi
+	if [ $VCCIO4 -ne $DTS_VCCIO4 ];then
+		checklistRst=1
+		echo "VCCIO4 Supply Power Voltage has changed!!! please reconfirm!!!"
+	fi
+	if [ $VCCIO5 -ne $DTS_VCCIO5 ];then
+		checklistRst=1
+		echo "VCCIO5 Supply Power Voltage has changed!!! please reconfirm!!!"
+	fi
+	if [ $VCCIO6 -ne $DTS_VCCIO6 ];then
+		checklistRst=1
+		echo "VCCIO6 Supply Power Voltage has changed!!! please reconfirm!!!"
+	fi
+	if [ $VCCIO7 -ne $DTS_VCCIO7 ];then
+		checklistRst=1
+		echo "VCCIO7 Supply Power Voltage has changed!!! please reconfirm!!!"
+	fi
+}
+
+IsRK356x=$(cat $DTS_NAME | grep sdhci@fe310000)
+if [ "$IsRK356x" = "" ];then
+	echo "is not rk356x"
+	exit 0
+fi
+
+GetIoDomainVoltageFromDts
+if [ -f $DTS_NAME.domain ];then
+	CheckVoltageWithBackupfile
+fi
+
+if [ "$CheckBckfileRet" != "2" ];then
+	ShowChecklist
+	CheckVoltageWithEnter
+	if [ $checklistRst -eq 0 ]; then
+		if [ -f $DTS_NAME.domain ];then
+			rm -rf $DTS_NAME.domain
+		fi
+
+		echo "PMUIO1 Supply Power Voltage1:$PMUIO1" >> $DTS_NAME.domain
+		echo "PMUIO2 Supply Power Voltage1:$PMUIO2" >> $DTS_NAME.domain
+		echo "VCCIO1 Supply Power Voltage1:$VCCIO1" >> $DTS_NAME.domain
+		echo "VCCIO3 Supply Power Voltage1:$VCCIO3" >> $DTS_NAME.domain
+		echo "VCCIO4 Supply Power Voltage1:$VCCIO4" >> $DTS_NAME.domain
+		echo "VCCIO5 Supply Power Voltage1:$VCCIO5" >> $DTS_NAME.domain
+		echo "VCCIO6 Supply Power Voltage1:$VCCIO6" >> $DTS_NAME.domain
+		echo "VCCIO7 Supply Power Voltage1:$VCCIO7" >> $DTS_NAME.domain
+		echo 0
+	else
+		echo "io-domian  default as:
+		    	&pmu_io_domains {
+				status = "okay";
+				pmuio1-supply = <&vcc3v3_pmu>;
+				pmuio2-supply = <&vcc3v3_pmu>;
+				vccio1-supply = <&vccio_acodec>;
+				vccio3-supply = <&vccio_sd>;
+				vccio4-supply = <&vcc_3v3>;
+				vccio5-supply = <&vcc_3v3>;
+				vccio6-supply = <&vcc_3v3>;
+				vccio7-supply = <&vcc_3v3>;
+			};
+			TODO:
+			Need to be modified according to the actual hardware
+			for example rk3568-evb:
+			&pmu_io_domains {
+				status = "okay";
+				pmuio1-supply = <&vcc3v3_pmu>;
+				pmuio2-supply = <&vcc3v3_pmu>;
+				vccio1-supply = <&vccio_acodec>;
+				vccio3-supply = <&vccio_sd>;
+				vccio4-supply = <&vcc_1v8>;
+				vccio5-supply = <&vcc_3v3>;
+				vccio6-supply = <&vcc_1v8>;
+				vccio7-supply = <&vcc_3v3>;
+			};
+		io-domain docs:
+		RKDocs/common/IO-Domain/Rockchip_RK356X_Introduction_IO_Power_Domains_Configuration.pdf
+		"
+
+		exit 1
+	fi
+fi
diff --git a/scripts/mkimg b/scripts/mkimg
index 63e3da6f402c..2944a6dc1c51 100755
--- a/scripts/mkimg
+++ b/scripts/mkimg
@@ -222,6 +222,11 @@ if [ "${srctree}" != "${objtree}" ]; then
 	fi
 fi
 scripts/resource_tool ${DTB_PATH} ${LOGO} ${LOGO_KERNEL} >/dev/null
+
+if [ "${ARCH}" == "arm64" ]; then
+	./scripts/io-domain.sh ${srctree}/arch/arm64/boot/dts/rockchip/.${DTB}
+fi
+
 echo "  Image:  resource.img (with ${DTB} ${LOGO} ${LOGO_KERNEL}) is ready"
 
 if [ -f "${BOOT_IMG}" ]; then

commit e18c51f465dd0dd0185f5f80a72699fca0a68adc
Author: Wu Liangqing <wlq@rock-chips.com>
Date:   Mon May 24 09:31:10 2021 +0800

    arm64: dts: rockchip: io-domian all default set 3.3V for rk356x boards
    
    io-domian  default as:
    &pmu_io_domains {
         status = "okay";
         pmuio1-supply = <&vcc3v3_pmu>;
         pmuio2-supply = <&vcc3v3_pmu>;
         vccio1-supply = <&vccio_acodec>;
         vccio3-supply = <&vccio_sd>;
         vccio4-supply = <&vcc_3v3>;
         vccio5-supply = <&vcc_3v3>;
         vccio6-supply = <&vcc_3v3>;
         vccio7-supply = <&vcc_3v3>;
    };
    TODO:
    Need to be modified according to the actual hardware
    for example rk3568-evb:
    &pmu_io_domains {
         status = "okay";
         pmuio1-supply = <&vcc3v3_pmu>;
         pmuio2-supply = <&vcc3v3_pmu>;
         vccio1-supply = <&vccio_acodec>;
         vccio3-supply = <&vccio_sd>;
         vccio4-supply = <&vcc_1v8>;
         vccio5-supply = <&vcc_3v3>;
         vccio6-supply = <&vcc_1v8>;
         vccio7-supply = <&vcc_3v3>;
    };
    
    Signed-off-by: Wu Liangqing <wlq@rock-chips.com>
    Change-Id: I296a696851c2a85618d08cce82da546c72266699

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink.dts
index 134027202020..9c81edc443f0 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink.dts
@@ -828,10 +828,10 @@
 	pmuio2-supply = <&vcc3v3_pmu>;
 	vccio1-supply = <&vccio_acodec>;
 	vccio3-supply = <&vccio_sd>;
-	vccio4-supply = <&vcca1v8_pmu>;
+	vccio4-supply = <&vcc_3v3>;
 	vccio5-supply = <&vcc_3v3>;
 	vccio6-supply = <&vcc_3v3>;
-	vccio7-supply = <&vcc1v8_dvp>;
+	vccio7-supply = <&vcc_3v3>;
 };
 
 &pwm4 {
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet.dts
index 3f96be72757e..14cd97f23674 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-tablet.dts
@@ -1041,12 +1041,12 @@
 &pmu_io_domains {
 	status = "okay";
 	pmuio1-supply = <&vcc3v3_pmu>;
-	pmuio2-supply = <&vcca1v8_pmu>;
+	pmuio2-supply = <&vcc_3v3>;
 	vccio1-supply = <&vccio_acodec>;
 	vccio3-supply = <&vccio_sd>;
-	vccio4-supply = <&vcca1v8_pmu>;
-	vccio5-supply = <&vcc_1v8>;
-	vccio6-supply = <&vcc1v8_dvp>;
+	vccio4-supply = <&vcc_3v3>;
+	vccio5-supply = <&vcc_3v3>;
+	vccio6-supply = <&vcc_3v3>;
 	vccio7-supply = <&vcc_3v3>;
 };
 
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
index ea2eff593670..40ecb18c3973 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
@@ -1494,9 +1494,9 @@
 	pmuio2-supply = <&vcc3v3_pmu>;
 	vccio1-supply = <&vccio_acodec>;
 	vccio3-supply = <&vccio_sd>;
-	vccio4-supply = <&vcc_1v8>;
+	vccio4-supply = <&vcc_3v3>;
 	vccio5-supply = <&vcc_3v3>;
-	vccio6-supply = <&vcc_1v8>;
+	vccio6-supply = <&vcc_3v3>;
 	vccio7-supply = <&vcc_3v3>;
 };
 

commit c20865f33225609b1c18dc05803a08cabff3b656
Author: XiaoDong Huang <derrick.huang@rock-chips.com>
Date:   Mon May 24 19:33:43 2021 +0800

    firmware: rockchip_sip: don't update fiq_target_cpu in sip_fiq_debugger_uart_irq_tf_init
    
    To fix problem in redmine #297983, make some rules about fiq_target_cpu:
    The default value of fiq_target_cpu is zero and
    can only be updated in sip_fiq_debugger_switch_cpu
    or sip_fiq_debugger_enable_fiq.
    
    View redmine#297983 for details.
    
    Change-Id: I947a73c3ffc0c818a611e108a343f05b8465645b
    Signed-off-by: XiaoDong Huang <derrick.huang@rock-chips.com>

diff --git a/drivers/firmware/rockchip_sip.c b/drivers/firmware/rockchip_sip.c
index 4b00f33f3a05..1e1d8cac0ab0 100644
--- a/drivers/firmware/rockchip_sip.c
+++ b/drivers/firmware/rockchip_sip.c
@@ -361,8 +361,6 @@ int sip_fiq_debugger_uart_irq_tf_init(u32 irq_id, void *callback_fn)
 {
 	struct arm_smccc_res res;
 
-	fiq_target_cpu = 0;
-
 	/* init fiq debugger callback */
 	sip_fiq_debugger_uart_irq_tf = callback_fn;
 	res = __invoke_sip_fn_smc(SIP_UARTDBG_FN, irq_id,

commit feea10898f5ce4c6b7e3a8e6f4aa5037fbca1576
Author: Yifeng Zhao <yifeng.zhao@rock-chips.com>
Date:   Fri May 21 16:09:00 2021 +0800

    arm64: dts: rockchip: change naneng combphy ref clock to 100mhz for rk3568
    
    When using 24MHz reference clock, some devices can't identify
    the SATA PM chip, And the signal quality is not as good as 100MHz.
    so change the reference clock to 100MHz.
    
    Signed-off-by: Yifeng Zhao <yifeng.zhao@rock-chips.com>
    Change-Id: If7d951a0b77d503f9faf1c1f88c78a9e07471e47

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index 91c2f944d32a..eb6dfe1db61e 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -3116,7 +3116,7 @@
 			 <&cru PCLK_PIPE>;
 		clock-names = "refclk", "apbclk", "pipe_clk";
 		assigned-clocks = <&pmucru CLK_PCIEPHY0_REF>;
-		assigned-clock-rates = <24000000>;
+		assigned-clock-rates = <100000000>;
 		resets = <&cru SRST_P_PIPEPHY0>, <&cru SRST_PIPEPHY0>;
 		reset-names = "combphy-apb", "combphy";
 		rockchip,pipe-grf = <&pipegrf>;
@@ -3132,7 +3132,7 @@
 			 <&cru PCLK_PIPE>;
 		clock-names = "refclk", "apbclk", "pipe_clk";
 		assigned-clocks = <&pmucru CLK_PCIEPHY1_REF>;
-		assigned-clock-rates = <24000000>;
+		assigned-clock-rates = <100000000>;
 		resets = <&cru SRST_P_PIPEPHY1>, <&cru SRST_PIPEPHY1>;
 		reset-names = "combphy-apb", "combphy";
 		rockchip,pipe-grf = <&pipegrf>;

commit b9305c6dacf3fb6d45410bbe8db0eba92a186d62
Author: Yiqing Zeng <zack.zeng@rock-chips.com>
Date:   Mon May 24 16:18:25 2021 +0800

    media: i2c: os02g10 fix set flip/mirror failed bug and fix wrong vts_def
    
    Signed-off-by: Yiqing Zeng <zack.zeng@rock-chips.com>
    Change-Id: Ie143b7311798eb328f665772caeaaf49f412b8f3

diff --git a/drivers/media/i2c/os02g10.c b/drivers/media/i2c/os02g10.c
index 743618cf18bc..60f7ba228951 100644
--- a/drivers/media/i2c/os02g10.c
+++ b/drivers/media/i2c/os02g10.c
@@ -5,6 +5,8 @@
  * Copyright (C) 2020 Rockchip Electronics Co., Ltd.
  *
  * V0.0X01.0X00 first version.
+ * V0.0X01.0X01 update init setting.
+ * V0.0X01.0X02 fix set flip/mirror failed bug and fix wrong vts_def value.
  */
 
 #include <linux/clk.h>
@@ -27,29 +29,36 @@
 #include <linux/rk-preisp.h>
 #include "../platform/rockchip/isp/rkisp_tb_helper.h"
 
-#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x00)
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x02)
 
 #ifndef V4L2_CID_DIGITAL_GAIN
 #define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
 #endif
 
-#define MIPI_FREQ_360M			360000000
-#define PIXEL_RATE_WITH_360M		(MIPI_FREQ_360M * 2 * 2 / 10)
-
-#define OS02G10_XVCLK_FREQ		24000000
-
 #define OS02G10_CHIP_ID			0x5602
 #define OS02G10_REG_CHIP_ID_H		0x02
 #define OS02G10_REG_CHIP_ID_L		0x03
 
-#define OS02G10_REG_PAGE_SELECT		0xFD
+#define OS02G10_XVCLK_FREQ		24000000
+#define BITS_PER_SAMPLE			10
+#define MIPI_FREQ_360M			360000000
+#define OS02G10_LANES			2
+#define PIXEL_RATE_WITH_360M	(MIPI_FREQ_360M * OS02G10_LANES * 2 / BITS_PER_SAMPLE)
+
+#define OS02G10_REG_PAGE_SELECT		0xfd
 
 #define OS02G10_REG_EXP_H		0x03
 #define OS02G10_REG_EXP_L		0x04
+#define OS02G10_EXPOSURE_MIN		4
+#define OS02G10_EXPOSURE_STEP		1
 
 #define OS02G10_REG_AGAIN		0x24
 #define OS02G10_REG_DGAIN_H		0x37
 #define OS02G10_REG_DGAIN_L		0x39
+#define OS02G10_GAIN_MIN		0x10
+#define OS02G10_GAIN_MAX		0x2000
+#define OS02G10_GAIN_STEP		1
+#define OS02G10_GAIN_DEFAULT	0x10
 
 #define OS02G10_REG_HTS_H		0x41
 #define OS02G10_REG_HTS_L		0x42
@@ -59,29 +68,21 @@
 #define OS02G10_REG_VBLANK_H		0x05
 #define OS02G10_REG_VBLANK_L		0x06
 
-#define OS02G10_VTS_MAX			0xFFFF
+#define OS02G10_VTS_MAX			0xffff
 #define OS02G10_REG_RESTART		0x01
 
 #define OS02G10_REG_CTRL_MODE		0xb1
 #define OS02G10_MODE_SW_STANDBY		0x0
 #define OS02G10_MODE_STREAMING		0x03
 
-#define OS02G10_REG_SOFTWARE_RESET	0xFC
+#define OS02G10_REG_SOFTWARE_RESET	0xfc
 #define OS02G10_SOFTWARE_RESET_VAL	0x1
 
-#define OS02G10_GAIN_MIN		0x10
-#define OS02G10_GAIN_MAX		0x2000
-#define OS02G10_GAIN_STEP		1
-#define OS02G10_GAIN_DEFAULT		0x10
-
-#define OS02G10_EXPOSURE_MIN		4
-#define OS02G10_EXPOSURE_STEP		1
-
 #define OS02G10_FLIP_REG		0x3f
 #define MIRROR_BIT_MASK			BIT(0)
 #define FLIP_BIT_MASK			BIT(1)
+#define OS02G10_REG_BAYER_ORDER		0x5e
 
-#define OS02G10_LANES			2
 #define OS02G10_NAME			"os02g10"
 
 #define OF_CAMERA_HDR_MODE		"rockchip,camera-hdr-mode"
@@ -89,7 +90,7 @@
 #define OF_CAMERA_PINCTRL_STATE_SLEEP	"rockchip,camera_sleep"
 
 #define REG_NULL			0xFF
-#define REG_DELAY			0x00
+
 #define SENSOR_ID(_msb, _lsb)   ((_msb) << 8 | (_lsb))
 
 static const char * const OS02G10_supply_names[] = {
@@ -132,11 +133,9 @@ struct os02g10 {
 	struct gpio_desc	*reset_gpio;
 	struct gpio_desc	*pwdn_gpio;
 	struct regulator_bulk_data supplies[OS02G10_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;
@@ -147,8 +146,6 @@ struct os02g10 {
 	struct v4l2_ctrl	*vblank;
 	struct v4l2_ctrl	*pixel_rate;
 	struct v4l2_ctrl	*link_freq;
-	struct v4l2_ctrl	*h_flip;
-	struct v4l2_ctrl	*v_flip;
 	struct mutex		mutex;
 	bool			streaming;
 	bool			power_on;
@@ -165,15 +162,7 @@ struct os02g10 {
 
 #define to_os02g10(sd) container_of(sd, struct os02g10, subdev)
 
-/*
- * Xclk 24Mhz
- */
 static const struct regval os02g10_linear10bit_1920x1080_regs[] = {
-	{0xfd, 0x00},
-	{0x36, 0x01},
-	{0xfd, 0x00},
-	{0x36, 0x00},
-	{REG_DELAY, 0x05},
 	{0xfd, 0x00},
 	{0xfd, 0x00},
 	{0x30, 0x0a},
@@ -285,7 +274,6 @@ static const struct regval os02g10_linear10bit_1920x1080_regs[] = {
 	{0x9c, 0x0e},
 	{0xb1, 0x01},
 	{0xfd, 0x01},
-	//{0xb1, 0x03},
 	{REG_NULL, 0x00},
 };
 
@@ -308,11 +296,11 @@ static const struct os02g10_mode supported_modes[] = {
 		.height = 1080,
 		.max_fps = {
 			.numerator = 10000,
-			.denominator = 300000,
+			.denominator = 250000,
 		},
 		.exp_def = 0x044c,
 		.hts_def = 0x043a * 2,
-		.vts_def = 0x0533,
+		.vts_def = 0x0516,
 		.reg_list = os02g10_linear10bit_1920x1080_regs,
 		.hdr_mode = NO_HDR,
 		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0,
@@ -323,11 +311,6 @@ static const s64 link_freq_menu_items[] = {
 	MIPI_FREQ_360M,
 };
 
-static int __os02g10_power_on(struct os02g10 *os02g10);
-
-static int os02g10_check_sensor_id(struct os02g10 *os02g10,
-                                   struct i2c_client *client);
-
 /* sensor register write */
 static int os02g10_write_reg(struct i2c_client *client, u8 reg, u8 val)
 {
@@ -344,11 +327,11 @@ static int os02g10_write_reg(struct i2c_client *client, u8 reg, u8 val)
 	msg.len = sizeof(buf);
 
 	ret = i2c_transfer(client->adapter, &msg, 1);
+
 	if (ret >= 0)
 		return 0;
 
-	dev_err(&client->dev,
-	        "os02g10 write reg(0x%x val:0x%x) failed !\n", reg, val);
+	dev_err(&client->dev, "write reg(0x%x val:0x%x) failed !\n", reg, val);
 
 	return ret;
 }
@@ -356,21 +339,14 @@ static int os02g10_write_reg(struct i2c_client *client, u8 reg, u8 val)
 static int os02g10_write_array(struct i2c_client *client,
                                const struct regval *regs)
 {
-	int i, delay_us, ret = 0;
+	int i, ret = 0;
 
 	i = 0;
 	while (regs[i].addr != REG_NULL) {
-		if (regs[i].addr == REG_DELAY) {
-			if (regs[i].val) {
-				delay_us = regs[i].val * 1000;
-				usleep_range(delay_us, 2 * delay_us);
-			}
-		} else {
-			ret = os02g10_write_reg(client, regs[i].addr, regs[i].val);
-			if (ret) {
-				dev_err(&client->dev, "%s failed !\n", __func__);
-				break;
-			}
+		ret = os02g10_write_reg(client, regs[i].addr, regs[i].val);
+		if (ret) {
+			dev_err(&client->dev, "%s failed !\n", __func__);
+			break;
 		}
 		i++;
 	}
@@ -575,11 +551,6 @@ static int os02g10_g_mbus_config(struct v4l2_subdev *sd,
 		val = 1 << (OS02G10_LANES - 1) |
 		      V4L2_MBUS_CSI2_CHANNEL_0 |
 		      V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
-	if (mode->hdr_mode == HDR_X2)
-		val = 1 << (OS02G10_LANES - 1) |
-		      V4L2_MBUS_CSI2_CHANNEL_0 |
-		      V4L2_MBUS_CSI2_CONTINUOUS_CLOCK |
-		      V4L2_MBUS_CSI2_CHANNEL_1;
 
 	config->type = V4L2_MBUS_CSI2;
 	config->flags = val;
@@ -591,10 +562,10 @@ static void os02g10_get_module_inf(struct os02g10 *os02g10,
                                    struct rkmodule_inf *inf)
 {
 	memset(inf, 0, sizeof(*inf));
-	strlcpy(inf->base.sensor, OS02G10_NAME, sizeof(inf->base.sensor));
-	strlcpy(inf->base.module, os02g10->module_name,
+	strscpy(inf->base.sensor, OS02G10_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, os02g10->module_name,
 	        sizeof(inf->base.module));
-	strlcpy(inf->base.lens, os02g10->len_name, sizeof(inf->base.lens));
+	strscpy(inf->base.lens, os02g10->len_name, sizeof(inf->base.lens));
 }
 
 static long os02g10_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
@@ -605,24 +576,19 @@ static long os02g10_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 	u32 stream = 0;
 
 	switch (cmd) {
-	case PREISP_CMD_SET_HDRAE_EXP:
-		ret = -1;
+	case RKMODULE_GET_MODULE_INFO:
+		os02g10_get_module_inf(os02g10, (struct rkmodule_inf *)arg);
 		break;
 	case RKMODULE_SET_HDR_CFG:
 		hdr_cfg = (struct rkmodule_hdr_cfg *)arg;
 		if (hdr_cfg->hdr_mode != 0)
 			ret = -1;
 		break;
-	case RKMODULE_GET_MODULE_INFO:
-		os02g10_get_module_inf(os02g10, (struct rkmodule_inf *)arg);
-		break;
 	case RKMODULE_GET_HDR_CFG:
 		hdr_cfg = (struct rkmodule_hdr_cfg *)arg;
 		hdr_cfg->esp.mode = HDR_NORMAL_VC;
 		hdr_cfg->hdr_mode = os02g10->cur_mode->hdr_mode;
 		break;
-	case RKMODULE_SET_CONVERSION_GAIN:
-		break;
 	case RKMODULE_SET_QUICK_STREAM:
 		stream = *((u32 *)arg);
 		if (stream)
@@ -646,11 +612,8 @@ static long os02g10_compat_ioctl32(struct v4l2_subdev *sd,
 {
 	void __user *up = compat_ptr(arg);
 	struct rkmodule_inf *inf;
-	struct rkmodule_awb_cfg *cfg;
 	struct rkmodule_hdr_cfg *hdr;
-	struct preisp_hdrae_exp_s *hdrae;
 	long ret;
-	u32 cg = 0;
 	u32 stream = 0;
 
 	switch (cmd) {
@@ -662,21 +625,12 @@ static long os02g10_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = os02g10_ioctl(sd, cmd, inf);
-		if (!ret)
+		if (!ret) {
 			ret = copy_to_user(up, inf, sizeof(*inf));
-		kfree(inf);
-		break;
-	case RKMODULE_AWB_CFG:
-		cfg = kzalloc(sizeof(*cfg), GFP_KERNEL);
-		if (!cfg) {
-			ret = -ENOMEM;
-			return ret;
+			if (ret)
+				ret = -EFAULT;
 		}
-
-		ret = copy_from_user(cfg, up, sizeof(*cfg));
-		if (!ret)
-			ret = os02g10_ioctl(sd, cmd, cfg);
-		kfree(cfg);
+		kfree(inf);
 		break;
 	case RKMODULE_GET_HDR_CFG:
 		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
@@ -686,8 +640,11 @@ static long os02g10_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = os02g10_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:
@@ -697,32 +654,17 @@ static long os02g10_compat_ioctl32(struct v4l2_subdev *sd,
 			return ret;
 		}
 
-		ret = copy_from_user(hdr, up, sizeof(*hdr));
-		if (!ret)
-			ret = os02g10_ioctl(sd, cmd, hdr);
-		kfree(hdr);
-		break;
-	case PREISP_CMD_SET_HDRAE_EXP:
-		hdrae = kzalloc(sizeof(*hdrae), GFP_KERNEL);
-		if (!hdrae) {
-			ret = -ENOMEM;
-			return ret;
-		}
+		if (copy_from_user(hdr, up, sizeof(*hdr)))
+			return -EFAULT;
 
-		ret = copy_from_user(hdrae, up, sizeof(*hdrae));
-		if (!ret)
-			ret = os02g10_ioctl(sd, cmd, hdrae);
-		kfree(hdrae);
-		break;
-	case RKMODULE_SET_CONVERSION_GAIN:
-		ret = copy_from_user(&cg, up, sizeof(cg));
-		if (!ret)
-			ret = os02g10_ioctl(sd, cmd, &cg);
+		ret = os02g10_ioctl(sd, cmd, hdr);
+		kfree(hdr);
 		break;
 	case RKMODULE_SET_QUICK_STREAM:
-		ret = copy_from_user(&stream, up, sizeof(u32));
-		if (!ret)
-			ret = os02g10_ioctl(sd, cmd, &stream);
+		if (copy_from_user(&stream, up, sizeof(u32)))
+			return -EFAULT;
+
+		ret = os02g10_ioctl(sd, cmd, &stream);
 		break;
 	default:
 		ret = -ENOIOCTLCMD;
@@ -735,9 +677,17 @@ static long os02g10_compat_ioctl32(struct v4l2_subdev *sd,
 
 static int __os02g10_start_stream(struct os02g10 *os02g10)
 {
-	int ret;
+	int ret = 0;
+
+	ret |= os02g10_write_reg(os02g10->client, 0xfd, 0x00);
+	ret |= os02g10_write_reg(os02g10->client, 0x36, 0x01);
+	ret |= os02g10_write_reg(os02g10->client, 0xfd, 0x00);
+	ret |= os02g10_write_reg(os02g10->client, 0x36, 0x00);
+	ret |= os02g10_write_reg(os02g10->client, 0xfd, 0x00);
 
-	ret = os02g10_write_array(os02g10->client, os02g10->cur_mode->reg_list);
+	usleep_range(5000, 6000);
+
+	ret |= os02g10_write_array(os02g10->client, os02g10->cur_mode->reg_list);
 	if (ret)
 		return ret;
 
@@ -1117,11 +1067,17 @@ static int os02g10_set_ctrl(struct v4l2_ctrl *ctrl)
 			os02g10->flip &= ~MIRROR_BIT_MASK;
 
 		ret = os02g10_write_reg(os02g10->client,
-		                        OS02G10_REG_PAGE_SELECT, 0x01);
+					OS02G10_REG_PAGE_SELECT, 0x01);
 		ret |= os02g10_write_reg(os02g10->client,
-		                         OS02G10_FLIP_REG, os02g10->flip);
+					OS02G10_FLIP_REG, os02g10->flip);
 		ret |= os02g10_write_reg(os02g10->client,
-		                         OS02G10_REG_RESTART, 0x01);
+					OS02G10_REG_PAGE_SELECT, 0x02);
+		ret |= os02g10_write_reg(os02g10->client,
+					OS02G10_REG_BAYER_ORDER, 0x32);
+		ret |= os02g10_write_reg(os02g10->client,
+					OS02G10_REG_PAGE_SELECT, 0x01);
+		ret |= os02g10_write_reg(os02g10->client,
+					OS02G10_REG_RESTART, 0x01);
 		dev_dbg(&client->dev, "set hflip 0x%x\n", os02g10->flip);
 		break;
 	case V4L2_CID_VFLIP:
@@ -1131,11 +1087,17 @@ static int os02g10_set_ctrl(struct v4l2_ctrl *ctrl)
 			os02g10->flip &= ~FLIP_BIT_MASK;
 
 		ret = os02g10_write_reg(os02g10->client,
-		                        OS02G10_REG_PAGE_SELECT, 0x01);
+					OS02G10_REG_PAGE_SELECT, 0x01);
 		ret |= os02g10_write_reg(os02g10->client,
-		                         OS02G10_FLIP_REG, os02g10->flip);
+					OS02G10_FLIP_REG, os02g10->flip);
 		ret |= os02g10_write_reg(os02g10->client,
-		                         OS02G10_REG_RESTART, 0x01);
+					OS02G10_REG_PAGE_SELECT, 0x02);
+		ret |= os02g10_write_reg(os02g10->client,
+					OS02G10_REG_BAYER_ORDER, 0x32);
+		ret |= os02g10_write_reg(os02g10->client,
+					OS02G10_REG_PAGE_SELECT, 0x01);
+		ret |= os02g10_write_reg(os02g10->client,
+					OS02G10_REG_RESTART, 0x01);
 		dev_dbg(&client->dev, "set vflip 0x%x\n", os02g10->flip);
 		break;
 	default:
@@ -1170,8 +1132,9 @@ static int os02g10_initialize_controls(struct os02g10 *os02g10)
 	handler->lock = &os02g10->mutex;
 
 	os02g10->link_freq = v4l2_ctrl_new_int_menu(handler, NULL,
-	                     V4L2_CID_LINK_FREQ,
-	                     1, 0, link_freq_menu_items);
+						    V4L2_CID_LINK_FREQ,
+						    1, 0,
+						    link_freq_menu_items);
 
 	if (os02g10->cur_mode->bus_fmt == MEDIA_BUS_FMT_SBGGR10_1X10) {
 		dst_link_freq = 0;
@@ -1179,42 +1142,42 @@ static int os02g10_initialize_controls(struct os02g10 *os02g10)
 	}
 	/* pixel rate = link frequency * 2 * lanes / BITS_PER_SAMPLE */
 	os02g10->pixel_rate = v4l2_ctrl_new_std(handler, NULL,
-	                                        V4L2_CID_PIXEL_RATE,
-	                                        0, PIXEL_RATE_WITH_360M,
-	                                        1, dst_pixel_rate);
+						V4L2_CID_PIXEL_RATE,
+						0, PIXEL_RATE_WITH_360M,
+						1, dst_pixel_rate);
 
 	__v4l2_ctrl_s_ctrl(os02g10->link_freq,
 	                   dst_link_freq);
 
 	h_blank = mode->hts_def - mode->width;
 	os02g10->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
-	                                    h_blank, h_blank, 1, h_blank);
+					    h_blank, h_blank, 1, h_blank);
 	if (os02g10->hblank)
 		os02g10->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
 
 	vblank_def = mode->vts_def - mode->height;
 	os02g10->vblank = v4l2_ctrl_new_std(handler, &os02g10_ctrl_ops,
-	                                    V4L2_CID_VBLANK, vblank_def,
-	                                    OS02G10_VTS_MAX - mode->height,
-	                                    1, vblank_def);
+					    V4L2_CID_VBLANK, vblank_def,
+					    OS02G10_VTS_MAX - mode->height,
+					    1, vblank_def);
 
 	exposure_max = mode->vts_def - 8;
 	os02g10->exposure = v4l2_ctrl_new_std(handler, &os02g10_ctrl_ops,
-	                                      V4L2_CID_EXPOSURE, OS02G10_EXPOSURE_MIN,
-	                                      exposure_max, OS02G10_EXPOSURE_STEP,
-	                                      mode->exp_def);
+					      V4L2_CID_EXPOSURE, OS02G10_EXPOSURE_MIN,
+					      exposure_max, OS02G10_EXPOSURE_STEP,
+					      mode->exp_def);
 
 	os02g10->anal_gain = v4l2_ctrl_new_std(handler, &os02g10_ctrl_ops,
-	                                       V4L2_CID_ANALOGUE_GAIN, OS02G10_GAIN_MIN,
-	                                       OS02G10_GAIN_MAX, OS02G10_GAIN_STEP,
-	                                       OS02G10_GAIN_DEFAULT);
+					      V4L2_CID_ANALOGUE_GAIN, OS02G10_GAIN_MIN,
+					      OS02G10_GAIN_MAX, OS02G10_GAIN_STEP,
+					      OS02G10_GAIN_DEFAULT);
 
-	os02g10->h_flip = v4l2_ctrl_new_std(handler, &os02g10_ctrl_ops,
-	                                    V4L2_CID_HFLIP, 0, 1, 1, 0);
+	v4l2_ctrl_new_std(handler, &os02g10_ctrl_ops, V4L2_CID_HFLIP, 0, 1, 1, 0);
+
+	v4l2_ctrl_new_std(handler, &os02g10_ctrl_ops, V4L2_CID_VFLIP, 0, 1, 1, 0);
 
-	os02g10->v_flip = v4l2_ctrl_new_std(handler, &os02g10_ctrl_ops,
-	                                    V4L2_CID_VFLIP, 0, 1, 1, 0);
 	os02g10->flip = 0;
+
 	if (handler->error) {
 		ret = handler->error;
 		dev_err(&os02g10->client->dev,
@@ -1261,8 +1224,8 @@ static int os02g10_configure_regulators(struct os02g10 *os02g10)
 		os02g10->supplies[i].supply = OS02G10_supply_names[i];
 
 	return devm_regulator_bulk_get(&os02g10->client->dev,
-	                               OS02G10_NUM_SUPPLIES,
-	                               os02g10->supplies);
+				       OS02G10_NUM_SUPPLIES,
+				       os02g10->supplies);
 }
 
 static int os02g10_probe(struct i2c_client *client,

commit 10f466ce6b9083837a1d9038d89da1e77e2b4d87
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Tue May 25 10:47:39 2021 +0800

    drm/rockchip: ebc_dev: release version v1.13
    
    EPD_A2 mode use part update to save panel power cost
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: I65181c3ef51034b9302532f9f1276ebd2724d0ee

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index 3c013921809a..b1ba882345c1 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -426,15 +426,15 @@ get_auto_image:
 	.type	ebc_open, %function
 ebc_open:
 .LFB2826:
-	.loc 1 1417 0
+	.loc 1 1419 0
 	.cfi_startproc
 .LVL30:
-	.loc 1 1421 0
+	.loc 1 1423 0
 	mov	w0, 0
 .LVL31:
-	.loc 1 1418 0
+	.loc 1 1420 0
 	str	xzr, [x1, 104]
-	.loc 1 1421 0
+	.loc 1 1423 0
 	ret
 	.cfi_endproc
 .LFE2826:
@@ -444,22 +444,22 @@ ebc_open:
 	.type	ebc_exit, %function
 ebc_exit:
 .LFB2845:
-	.loc 1 1963 0
+	.loc 1 1965 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1964 0
+	.loc 1 1966 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 1963 0
+	.loc 1 1965 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1964 0
+	.loc 1 1966 0
 	bl	platform_driver_unregister
 .LVL32:
-	.loc 1 1965 0
+	.loc 1 1967 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -474,7 +474,7 @@ ebc_exit:
 	.type	ebc_resume, %function
 ebc_resume:
 .LFB2843:
-	.loc 1 1925 0
+	.loc 1 1927 0
 	.cfi_startproc
 .LVL33:
 	stp	x29, x30, [sp, -32]!
@@ -492,7 +492,7 @@ ebc_resume:
 	ldr	x19, [x0, 184]
 .LBE927:
 .LBE926:
-	.loc 1 1929 0
+	.loc 1 1931 0
 	ldr	x1, [x19, 16]
 .LBB928:
 .LBB929:
@@ -505,15 +505,15 @@ ebc_resume:
 .LVL35:
 .LBE929:
 .LBE928:
-	.loc 1 1930 0
+	.loc 1 1932 0
 	str	wzr, [x19, 788]
-	.loc 1 1931 0
+	.loc 1 1933 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
 .LVL36:
-	.loc 1 1934 0
+	.loc 1 1936 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -530,20 +530,20 @@ ebc_resume:
 	.type	ebc_vdd_power_timeout, %function
 ebc_vdd_power_timeout:
 .LFB2821:
-	.loc 1 1116 0
+	.loc 1 1118 0
 	.cfi_startproc
 .LVL37:
-	.loc 1 1117 0
+	.loc 1 1119 0
 	adrp	x0, .LANCHOR0
 .LVL38:
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1119 0
+	.loc 1 1121 0
 	ldr	w2, [x0, 616]
 	cbnz	w2, .L87
 	ret
 	.p2align 3
 .L87:
-	.loc 1 1116 0
+	.loc 1 1118 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -555,10 +555,10 @@ ebc_vdd_power_timeout:
 	add	x0, x0, 408
 .LBE931:
 .LBE930:
-	.loc 1 1116 0
+	.loc 1 1118 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1120 0
+	.loc 1 1122 0
 	str	wzr, [x0, 208]
 .LBB933:
 .LBB932:
@@ -567,7 +567,7 @@ ebc_vdd_power_timeout:
 .LVL39:
 .LBE932:
 .LBE933:
-	.loc 1 1125 0
+	.loc 1 1127 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -581,27 +581,27 @@ ebc_vdd_power_timeout:
 	.type	ebc_remove, %function
 ebc_remove:
 .LFB2841:
-	.loc 1 1901 0
+	.loc 1 1903 0
 	.cfi_startproc
 .LVL40:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1902 0
+	.loc 1 1904 0
 	adrp	x0, .LANCHOR1
 .LVL41:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 1901 0
+	.loc 1 1903 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1902 0
+	.loc 1 1904 0
 	add	x0, x0, 224
-	.loc 1 1901 0
-	.loc 1 1902 0
+	.loc 1 1903 0
+	.loc 1 1904 0
 	bl	misc_deregister
 .LVL42:
-	.loc 1 1905 0
+	.loc 1 1907 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -616,7 +616,7 @@ ebc_remove:
 	.type	ebc_mmap, %function
 ebc_mmap:
 .LFB2825:
-	.loc 1 1402 0
+	.loc 1 1404 0
 	.cfi_startproc
 .LVL43:
 	stp	x29, x30, [sp, -32]!
@@ -627,33 +627,33 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1402 0
+	.loc 1 1404 0
 	mov	x19, x1
-	.loc 1 1405 0
+	.loc 1 1407 0
 	bl	ebc_phy_buf_base_get
 .LVL44:
-	.loc 1 1408 0
+	.loc 1 1410 0
 	lsr	x2, x0, 12
-	.loc 1 1406 0
-	mov	x6, 16384
 	.loc 1 1408 0
+	mov	x6, 16384
+	.loc 1 1410 0
 	mov	x0, x19
-	.loc 1 1406 0
+	.loc 1 1408 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 1408 0
+	.loc 1 1410 0
 	ldp	x1, x3, [x19]
-	.loc 1 1406 0
+	.loc 1 1408 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 1408 0
+	.loc 1 1410 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
 .LVL45:
-	.loc 1 1411 0
+	.loc 1 1413 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 1414 0
+	.loc 1 1416 0
 	ldr	x19, [sp, 16]
 .LVL46:
 	csel	w0, w0, w1, eq
@@ -671,16 +671,16 @@ ebc_mmap:
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
 .LFB2824:
-	.loc 1 1201 0
+	.loc 1 1203 0
 	.cfi_startproc
 .LVL47:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 1211 0
+	.loc 1 1213 0
 	cmp	w1, 28672
-	.loc 1 1201 0
+	.loc 1 1203 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -694,15 +694,15 @@ ebc_io_ctl:
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
 	.cfi_offset 23, -112
-	.loc 1 1201 0
+	.loc 1 1203 0
 	mov	x21, x2
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 1203 0
+	.loc 1 1205 0
 	adrp	x0, .LANCHOR0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1211 0
+	.loc 1 1213 0
 	bcc	.L95
 	mov	w0, 28675
 	cmp	w1, w0
@@ -712,7 +712,7 @@ ebc_io_ctl:
 	cmp	w0, 1
 	bls	.L96
 .L95:
-	.loc 1 1227 0
+	.loc 1 1229 0
 	mov	w0, 28677
 	cmp	w1, w0
 	beq	.L99
@@ -728,13 +728,13 @@ ebc_io_ctl:
 	mov	w0, 28683
 	cmp	w1, w0
 	bne	.L98
-	.loc 1 1379 0
+	.loc 1 1381 0
 	bl	ebc_empty_buf_get
 .LVL49:
 	mov	x23, x0
-	.loc 1 1380 0
-	cbz	x0, .L119
 	.loc 1 1382 0
+	cbz	x0, .L119
+	.loc 1 1384 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 336]
@@ -744,7 +744,7 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL50:
-	.loc 1 1383 0
+	.loc 1 1385 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL51:
@@ -774,11 +774,11 @@ ebc_io_ctl:
 .LBE936:
 .LBE935:
 .LBE934:
-	.loc 1 1385 0
+	.loc 1 1387 0
 	ldp	w1, w4, [x22, 84]
-	.loc 1 1384 0
-	str	w0, [x29, 104]
 	.loc 1 1386 0
+	str	w0, [x29, 104]
+	.loc 1 1388 0
 	stp	w4, w1, [x29, 112]
 .LBB965:
 .LBB962:
@@ -807,7 +807,7 @@ ebc_io_ctl:
 .LBE959:
 .LBE962:
 .LBE965:
-	.loc 1 1202 0
+	.loc 1 1204 0
 	mov	x0, x21
 .LVL56:
 .LBB966:
@@ -855,36 +855,36 @@ ebc_io_ctl:
 .LBE960:
 .LBE963:
 .LBE966:
-	.loc 1 1388 0
+	.loc 1 1390 0
 	mov	x0, x23
 .LVL61:
 	bl	ebc_buf_release
 .LVL62:
-	.loc 1 1389 0
+	.loc 1 1391 0
 	b	.L94
 .LVL63:
 	.p2align 3
 .L96:
-	.loc 1 1218 0
+	.loc 1 1220 0
 	cbnz	x21, .L95
-	.loc 1 1219 0
+	.loc 1 1221 0
 	ldr	x0, [x20, 272]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC1
 .LVL64:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC1
-	.loc 1 1220 0
+	.loc 1 1222 0
 	mov	x22, -14
-	.loc 1 1219 0
+	.loc 1 1221 0
 	bl	_dev_err
 .LVL65:
-	.loc 1 1220 0
+	.loc 1 1222 0
 	b	.L94
 .LVL66:
 	.p2align 3
 .L228:
-	.loc 1 1227 0
+	.loc 1 1229 0
 	mov	w0, 28674
 	cmp	w1, w0
 	beq	.L101
@@ -895,23 +895,23 @@ ebc_io_ctl:
 	mov	w0, 28676
 	cmp	w1, w0
 	bne	.L98
-	.loc 1 1311 0
+	.loc 1 1313 0
 	ldr	x0, [x20, 272]
-	.loc 1 1310 0
+	.loc 1 1312 0
 	mov	w2, 1
 	str	w2, [x20, 796]
-	.loc 1 1311 0
+	.loc 1 1313 0
 	adrp	x1, .LC2
 .LVL67:
-	.loc 1 1312 0
+	.loc 1 1314 0
 	mov	x22, 0
-	.loc 1 1311 0
+	.loc 1 1313 0
 	add	x1, x1, :lo12:.LC2
 	bl	_dev_info
 .LVL68:
 	.p2align 2
 .L94:
-	.loc 1 1399 0
+	.loc 1 1401 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x22
 .LVL69:
@@ -939,7 +939,7 @@ ebc_io_ctl:
 	.p2align 3
 .L231:
 	.cfi_restore_state
-	.loc 1 1227 0
+	.loc 1 1229 0
 	cmp	w1, 28672
 	beq	.L103
 	mov	w0, 28673
@@ -1053,53 +1053,53 @@ ebc_io_ctl:
 .LBE969:
 .LBE968:
 .LBE967:
-	.loc 1 1265 0
+	.loc 1 1267 0
 	bl	ebc_phy_buf_base_get
 .LVL85:
 	ldrsw	x1, [x29, 104]
-	.loc 1 1266 0
+	.loc 1 1268 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
 .LVL86:
 	mov	x21, x0
 .LVL87:
-	.loc 1 1267 0
+	.loc 1 1269 0
 	cbz	x0, .L134
-	.loc 1 1268 0
+	.loc 1 1270 0
 	ldr	w5, [x29, 108]
-	.loc 1 1277 0
+	.loc 1 1279 0
 	add	x20, x20, 184
-	.loc 1 1272 0
+	.loc 1 1274 0
 	ldp	w4, w2, [x29, 124]
-	.loc 1 1268 0
+	.loc 1 1270 0
 	str	w5, [x21, 40]
-	.loc 1 1273 0
+	.loc 1 1275 0
 	ldp	w3, w1, [x29, 132]
-	.loc 1 1272 0
+	.loc 1 1274 0
 	stp	w4, w2, [x21, 48]
-	.loc 1 1273 0
-	stp	w3, w1, [x21, 56]
 	.loc 1 1275 0
+	stp	w3, w1, [x21, 56]
+	.loc 1 1277 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL88:
-	.loc 1 1277 0
+	.loc 1 1279 0
 	ldr	w0, [x20, 80]
 	cbz	w0, .L234
 .L129:
-	.loc 1 1281 0
+	.loc 1 1283 0
 	ldr	w0, [x21, 40]
 	cmp	w0, 15
 	beq	.L235
-	.loc 1 1281 0 is_stmt 0 discriminator 3
+	.loc 1 1283 0 is_stmt 0 discriminator 3
 	cmp	w0, 17
 	bne	.L134
 .L131:
-	.loc 1 1282 0 is_stmt 1
+	.loc 1 1284 0 is_stmt 1
 	mov	w0, 1
 	str	w0, [x20, 196]
 .LBB996:
 .LBB997:
-	.loc 1 1283 0
+	.loc 1 1285 0
 	mov	w1, 0
 	add	x0, x29, 64
 	bl	init_wait_entry
@@ -1112,13 +1112,13 @@ ebc_io_ctl:
 	.p2align 3
 .L236:
 .LVL90:
-	.loc 1 1283 0 is_stmt 0 discriminator 5
+	.loc 1 1285 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L134
-	.loc 1 1283 0 discriminator 7
+	.loc 1 1285 0 discriminator 7
 	bl	schedule
 .LVL91:
 .L135:
-	.loc 1 1283 0 discriminator 9
+	.loc 1 1285 0 discriminator 9
 	add	x1, x29, 64
 	mov	w2, 1
 	mov	x0, x21
@@ -1127,7 +1127,7 @@ ebc_io_ctl:
 	ldr	w1, [x20, 196]
 	cbnz	w1, .L236
 .LBE998:
-	.loc 1 1283 0 discriminator 4
+	.loc 1 1285 0 discriminator 4
 	add	x1, x29, 64
 	mov	x0, x21
 	bl	finish_wait
@@ -1141,13 +1141,13 @@ ebc_io_ctl:
 .L111:
 .LBE997:
 .LBE996:
-	.loc 1 1366 0 is_stmt 1
+	.loc 1 1368 0 is_stmt 1
 	bl	ebc_empty_buf_get
 .LVL95:
 	mov	x23, x0
-	.loc 1 1367 0
-	cbz	x0, .L119
 	.loc 1 1369 0
+	cbz	x0, .L119
+	.loc 1 1371 0
 	add	x22, x20, 24
 	ldr	x1, [x20, 328]
 	ldp	w2, w3, [x20, 108]
@@ -1155,7 +1155,7 @@ ebc_io_ctl:
 .LVL96:
 	.p2align 3
 .L229:
-	.loc 1 1227 0
+	.loc 1 1229 0
 	mov	w0, 28678
 	cmp	w1, w0
 	beq	.L109
@@ -1270,36 +1270,36 @@ ebc_io_ctl:
 .LBE1004:
 .LBE1003:
 .LBE1002:
-	.loc 1 1292 0
+	.loc 1 1294 0
 	bl	ebc_osd_buf_clone
 .LVL109:
 	mov	x1, x0
-	.loc 1 1293 0
+	.loc 1 1295 0
 	cbz	x0, .L134
-	.loc 1 1294 0
+	.loc 1 1296 0
 	ldr	w6, [x29, 108]
-	.loc 1 1303 0
+	.loc 1 1305 0
 	add	x20, x20, 184
-	.loc 1 1298 0
+	.loc 1 1300 0
 	ldp	w5, w3, [x29, 124]
-	.loc 1 1294 0
+	.loc 1 1296 0
 	str	w6, [x1, 40]
-	.loc 1 1299 0
+	.loc 1 1301 0
 	ldp	w4, w2, [x29, 132]
-	.loc 1 1298 0
+	.loc 1 1300 0
 	stp	w5, w3, [x1, 48]
-	.loc 1 1299 0
-	stp	w4, w2, [x1, 56]
 	.loc 1 1301 0
+	stp	w4, w2, [x1, 56]
+	.loc 1 1303 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL110:
-	.loc 1 1303 0
+	.loc 1 1305 0
 	ldr	w0, [x20, 80]
 	cbnz	w0, .L134
-	.loc 1 1304 0
+	.loc 1 1306 0
 	mov	w2, 1
 	str	w2, [x20, 80]
-	.loc 1 1305 0
+	.loc 1 1307 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -1372,12 +1372,12 @@ ebc_io_ctl:
 .LBE961:
 .LBE964:
 .LBE1031:
-	.loc 1 1229 0
+	.loc 1 1231 0
 	bl	ebc_osd_buf_get
 .LVL121:
-	.loc 1 1230 0
+	.loc 1 1232 0
 	cbz	x0, .L119
-	.loc 1 1233 0
+	.loc 1 1235 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL122:
@@ -1404,17 +1404,17 @@ ebc_io_ctl:
 .LBE1034:
 .LBE1033:
 .LBE1032:
-	.loc 1 1233 0
+	.loc 1 1235 0
 	sub	w0, w22, w0
-	.loc 1 1238 0
+	.loc 1 1240 0
 	ldr	w1, [x20, 176]
-	.loc 1 1237 0
+	.loc 1 1239 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1236 0
-	stp	w4, w5, [x29, 112]
 	.loc 1 1238 0
+	stp	w4, w5, [x29, 112]
+	.loc 1 1240 0
 	str	w1, [x29, 120]
-	.loc 1 1235 0
+	.loc 1 1237 0
 	str	w0, [x29, 104]
 .LBB1065:
 .LBB1062:
@@ -1539,7 +1539,7 @@ ebc_io_ctl:
 .LBE1068:
 .LBE1067:
 .LBE1066:
-	.loc 1 1319 0
+	.loc 1 1321 0
 	add	x22, x20, 232
 .LBB1101:
 .LBB1097:
@@ -1636,49 +1636,49 @@ ebc_io_ctl:
 .LBE1093:
 .LBE1097:
 .LBE1101:
-	.loc 1 1323 0
+	.loc 1 1325 0
 	add	x20, x20, 184
 	ldr	w2, [x20, 48]
 	ldr	x0, [x20, 88]
 .LVL148:
-	.loc 1 1324 0
+	.loc 1 1326 0
 	mov	x22, 0
-	.loc 1 1323 0
+	.loc 1 1325 0
 	adrp	x1, .LC7
 	add	x1, x1, :lo12:.LC7
 	bl	_dev_info
 .LVL149:
-	.loc 1 1324 0
+	.loc 1 1326 0
 	b	.L94
 .LVL150:
 	.p2align 3
 .L99:
-	.loc 1 1316 0
+	.loc 1 1318 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC3
 .LVL151:
-	.loc 1 1314 0
+	.loc 1 1316 0
 	str	wzr, [x20, 796]
-	.loc 1 1317 0
+	.loc 1 1319 0
 	mov	x22, 0
-	.loc 1 1315 0
+	.loc 1 1317 0
 	str	wzr, [x20, 800]
-	.loc 1 1316 0
+	.loc 1 1318 0
 	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
 .LVL152:
-	.loc 1 1317 0
+	.loc 1 1319 0
 	b	.L94
 .LVL153:
 	.p2align 3
 .L107:
-	.loc 1 1353 0
+	.loc 1 1355 0
 	bl	ebc_empty_buf_get
 .LVL154:
 	mov	x23, x0
-	.loc 1 1354 0
-	cbz	x0, .L119
 	.loc 1 1356 0
+	cbz	x0, .L119
+	.loc 1 1358 0
 	add	x22, x20, 24
 	ldr	x1, [x20, 320]
 	ldp	w2, w3, [x20, 108]
@@ -1686,13 +1686,13 @@ ebc_io_ctl:
 .LVL155:
 	.p2align 3
 .L112:
-	.loc 1 1340 0
+	.loc 1 1342 0
 	bl	ebc_empty_buf_get
 .LVL156:
 	mov	x23, x0
-	.loc 1 1341 0
-	cbz	x0, .L119
 	.loc 1 1343 0
+	cbz	x0, .L119
+	.loc 1 1345 0
 	ldp	w2, w3, [x20, 108]
 	add	x22, x20, 24
 	ldr	x1, [x20, 312]
@@ -1701,7 +1701,7 @@ ebc_io_ctl:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL157:
-	.loc 1 1344 0
+	.loc 1 1346 0
 	ldr	x20, [x23, 8]
 	bl	ebc_phy_buf_base_get
 .LVL158:
@@ -1729,11 +1729,11 @@ ebc_io_ctl:
 .LBE1104:
 .LBE1103:
 .LBE1102:
-	.loc 1 1347 0
+	.loc 1 1349 0
 	ldp	w4, w1, [x22, 84]
-	.loc 1 1345 0
+	.loc 1 1347 0
 	str	w0, [x29, 104]
-	.loc 1 1346 0
+	.loc 1 1348 0
 	stp	w1, w4, [x29, 112]
 .LBB1113:
 .LBB1112:
@@ -1777,15 +1777,15 @@ ebc_io_ctl:
 .LBE1116:
 .LBE1115:
 .LBE1114:
-	.loc 1 1330 0
+	.loc 1 1332 0
 	ldp	w1, w0, [x20, 116]
 .LVL163:
 	stp	w1, w0, [x29, 140]
-	.loc 1 1327 0
+	.loc 1 1329 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 1326 0
-	stp	w5, w6, [x29, 112]
 	.loc 1 1328 0
+	stp	w5, w6, [x29, 112]
+	.loc 1 1330 0
 	ldr	w4, [x20, 176]
 	str	w4, [x29, 120]
 .LBB1149:
@@ -1833,46 +1833,46 @@ ebc_io_ctl:
 .LBE1141:
 .LBE1145:
 .LBE1149:
-	.loc 1 1333 0
+	.loc 1 1335 0
 	ldr	x0, [x20, 272]
 .LVL169:
 	adrp	x1, .LC5
 .LVL170:
-	.loc 1 1334 0
+	.loc 1 1336 0
 	mov	x22, -14
-	.loc 1 1333 0
+	.loc 1 1335 0
 	add	x1, x1, :lo12:.LC5
 	bl	_dev_err
 .LVL171:
-	.loc 1 1334 0
+	.loc 1 1336 0
 	b	.L94
 .LVL172:
 	.p2align 3
 .L98:
-	.loc 1 1394 0
+	.loc 1 1396 0
 	ldr	x0, [x20, 272]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
 .LVL173:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
-	.loc 1 1395 0
+	.loc 1 1397 0
 	mov	x22, 0
-	.loc 1 1394 0
+	.loc 1 1396 0
 	bl	_dev_err
 .LVL174:
-	.loc 1 1398 0
+	.loc 1 1400 0
 	b	.L94
 .LVL175:
 	.p2align 3
 .L103:
-	.loc 1 1243 0
+	.loc 1 1245 0
 	bl	ebc_empty_buf_get
 .LVL176:
 	mov	x23, x0
-	.loc 1 1244 0
+	.loc 1 1246 0
 	cbz	x0, .L119
-	.loc 1 1247 0
+	.loc 1 1249 0
 	ldr	x22, [x0, 8]
 	bl	ebc_phy_buf_base_get
 .LVL177:
@@ -1899,17 +1899,17 @@ ebc_io_ctl:
 .LBE1152:
 .LBE1151:
 .LBE1150:
-	.loc 1 1247 0
+	.loc 1 1249 0
 	sub	w0, w22, w0
-	.loc 1 1252 0
+	.loc 1 1254 0
 	ldr	w1, [x20, 176]
-	.loc 1 1251 0
+	.loc 1 1253 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 1250 0
-	stp	w4, w5, [x29, 112]
 	.loc 1 1252 0
+	stp	w4, w5, [x29, 112]
+	.loc 1 1254 0
 	str	w1, [x29, 120]
-	.loc 1 1249 0
+	.loc 1 1251 0
 	str	w0, [x29, 104]
 .LBB1185:
 .LBB1181:
@@ -1956,15 +1956,15 @@ ebc_io_ctl:
 .LBE1177:
 .LBE1181:
 .LBE1185:
-	.loc 1 1256 0
+	.loc 1 1258 0
 	mov	x0, x23
 .LVL184:
-	.loc 1 1257 0
+	.loc 1 1259 0
 	mov	x22, -14
-	.loc 1 1256 0
+	.loc 1 1258 0
 	bl	ebc_buf_release
 .LVL185:
-	.loc 1 1257 0
+	.loc 1 1259 0
 	b	.L94
 .LVL186:
 	.p2align 3
@@ -1987,7 +1987,7 @@ ebc_io_ctl:
 .LBE1027:
 .LBE1029:
 .LBE1186:
-	.loc 1 1202 0
+	.loc 1 1204 0
 	mov	x0, x21
 .LVL187:
 .LBB1187:
@@ -2024,7 +2024,7 @@ ebc_io_ctl:
 .LBE992:
 .LBE994:
 .LBE1188:
-	.loc 1 1202 0
+	.loc 1 1204 0
 	mov	x0, x21
 .LVL189:
 .LBB1189:
@@ -2062,7 +2062,7 @@ ebc_io_ctl:
 .LBE1142:
 .LBE1146:
 .LBE1190:
-	.loc 1 1202 0
+	.loc 1 1204 0
 	mov	x0, x21
 .LVL192:
 .LBB1191:
@@ -2099,7 +2099,7 @@ ebc_io_ctl:
 .LBE1094:
 .LBE1098:
 .LBE1192:
-	.loc 1 1202 0
+	.loc 1 1204 0
 	mov	x0, x21
 .LVL194:
 .LBB1193:
@@ -2137,7 +2137,7 @@ ebc_io_ctl:
 .LBE1178:
 .LBE1182:
 .LBE1194:
-	.loc 1 1202 0
+	.loc 1 1204 0
 	mov	x0, x21
 .LVL197:
 .LBB1195:
@@ -2175,7 +2175,7 @@ ebc_io_ctl:
 .LBE1060:
 .LBE1063:
 .LBE1196:
-	.loc 1 1202 0
+	.loc 1 1204 0
 	mov	x0, x21
 .LVL200:
 .LBB1197:
@@ -2250,7 +2250,7 @@ ebc_io_ctl:
 .LBE1144:
 .LBE1148:
 .LBE1198:
-	.loc 1 1332 0
+	.loc 1 1334 0
 	cbnz	x0, .L146
 .LBB1199:
 .LBB999:
@@ -2317,7 +2317,7 @@ ebc_io_ctl:
 .LBE1180:
 .LBE1184:
 .LBE1200:
-	.loc 1 1255 0
+	.loc 1 1257 0
 	cbnz	w0, .L123
 .LBB1201:
 .LBB1000:
@@ -2328,16 +2328,16 @@ ebc_io_ctl:
 .L127:
 .LBE1000:
 .LBE1201:
-	.loc 1 1263 0
+	.loc 1 1265 0
 	mov	x22, -14
 	b	.L94
 .LVL218:
 	.p2align 3
 .L234:
-	.loc 1 1278 0
+	.loc 1 1280 0
 	mov	w2, 1
 	str	w2, [x20, 80]
-	.loc 1 1279 0
+	.loc 1 1281 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w1, w2
@@ -2347,7 +2347,7 @@ ebc_io_ctl:
 	b	.L129
 	.p2align 3
 .L235:
-	.loc 1 1281 0 discriminator 1
+	.loc 1 1283 0 discriminator 1
 	ldr	w0, [x20, 600]
 	cbz	w0, .L131
 .LBB1202:
@@ -2358,7 +2358,7 @@ ebc_io_ctl:
 .L119:
 .LBE1001:
 .LBE1202:
-	.loc 1 1231 0
+	.loc 1 1233 0
 	mov	x22, -1
 	b	.L94
 .LVL221:
@@ -2381,19 +2381,19 @@ ebc_io_ctl:
 .LBE1096:
 .LBE1100:
 .LBE1203:
-	.loc 1 1320 0
+	.loc 1 1322 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC4
-	.loc 1 1321 0
+	.loc 1 1323 0
 	mov	x22, -14
-	.loc 1 1320 0
+	.loc 1 1322 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
 .LVL226:
-	.loc 1 1321 0
+	.loc 1 1323 0
 	b	.L94
 .L232:
-	.loc 1 1399 0
+	.loc 1 1401 0
 	bl	__stack_chk_fail
 .LVL227:
 .L240:
@@ -2409,40 +2409,40 @@ ebc_io_ctl:
 	.type	frame_done_callback, %function
 frame_done_callback:
 .LFB2816:
-	.loc 1 637 0
+	.loc 1 639 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 638 0
+	.loc 1 640 0
 	adrp	x0, .LANCHOR0
 	add	x1, x0, :lo12:.LANCHOR0
-	.loc 1 637 0
+	.loc 1 639 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 638 0
+	.loc 1 640 0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 637 0
+	.loc 1 639 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 641 0
+	.loc 1 643 0
 	add	x19, x20, 184
 	ldr	x0, [x19, 216]
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
 	bhi	.L244
-	.loc 1 644 0
+	.loc 1 646 0
 	ldr	w0, [x19, 36]
 	cbz	w0, .L246
-	.loc 1 645 0
+	.loc 1 647 0
 	ldr	x0, [x1, 8]
 	bl	wake_up_process
 .LVL229:
-	.loc 1 671 0
+	.loc 1 673 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -2457,40 +2457,40 @@ frame_done_callback:
 	.p2align 3
 .L244:
 	.cfi_restore_state
-	.loc 1 659 0
+	.loc 1 661 0
 	ldr	w0, [x19, 40]
 	cbnz	w0, .L250
-	.loc 1 665 0
+	.loc 1 667 0
 	ldr	x0, [x19, 88]
-	.loc 1 664 0
+	.loc 1 666 0
 	mov	w20, 1
-	.loc 1 663 0
-	str	wzr, [x19, 28]
 	.loc 1 665 0
+	str	wzr, [x19, 28]
+	.loc 1 667 0
 	adrp	x1, .LC9
-	.loc 1 664 0
+	.loc 1 666 0
 	str	w20, [x19, 76]
-	.loc 1 665 0
+	.loc 1 667 0
 	add	x1, x1, :lo12:.LC9
-	.loc 1 666 0
+	.loc 1 668 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
-	.loc 1 665 0
+	.loc 1 667 0
 	bl	_dev_info
 .LVL230:
-	.loc 1 666 0
+	.loc 1 668 0
 	mov	w2, w20
 	add	x0, x19, 352
 	mov	w1, w20
 	bl	__wake_up_sync
 .LVL231:
-	.loc 1 667 0
+	.loc 1 669 0
 	mov	w2, w20
 	mov	w1, w20
 	add	x0, x19, 304
 	bl	__wake_up_sync
 .LVL232:
-	.loc 1 671 0
+	.loc 1 673 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -2505,16 +2505,16 @@ frame_done_callback:
 	.p2align 3
 .L246:
 	.cfi_restore_state
-	.loc 1 648 0
+	.loc 1 650 0
 	ldr	x0, [x19, 88]
 	adrp	x1, .LC8
 	add	x1, x1, :lo12:.LC8
-	.loc 1 653 0
+	.loc 1 655 0
 	mov	w21, 1
-	.loc 1 648 0
+	.loc 1 650 0
 	bl	_dev_info
 .LVL233:
-	.loc 1 650 0
+	.loc 1 652 0
 	ldp	w2, w3, [x20, 108]
 	mov	w1, 0
 	ldr	x0, [x19, 160]
@@ -2522,7 +2522,7 @@ frame_done_callback:
 	lsr	w2, w2, 4
 	bl	memset
 .LVL234:
-	.loc 1 651 0
+	.loc 1 653 0
 	adrp	x2, jiffies
 	add	x0, x20, 680
 	mov	x1, 402653184
@@ -2530,11 +2530,11 @@ frame_done_callback:
 	add	x1, x2, x1
 	bl	mod_timer
 .LVL235:
-	.loc 1 653 0
+	.loc 1 655 0
 	str	w21, [x19, 76]
-	.loc 1 652 0
-	str	wzr, [x19, 28]
 	.loc 1 654 0
+	str	wzr, [x19, 28]
+	.loc 1 656 0
 	adrp	x19, .LANCHOR1
 	add	x19, x19, :lo12:.LANCHOR1
 	mov	w2, w21
@@ -2542,13 +2542,13 @@ frame_done_callback:
 	add	x0, x19, 352
 	bl	__wake_up_sync
 .LVL236:
-	.loc 1 655 0
+	.loc 1 657 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x19, 304
 	bl	__wake_up_sync
 .LVL237:
-	.loc 1 671 0
+	.loc 1 673 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -2563,15 +2563,15 @@ frame_done_callback:
 	.p2align 3
 .L250:
 	.cfi_restore_state
-	.loc 1 661 0
+	.loc 1 663 0
 	ldr	x0, [x1, 8]
-	.loc 1 660 0
+	.loc 1 662 0
 	mov	w1, 1
 	str	w1, [x19, 28]
-	.loc 1 661 0
+	.loc 1 663 0
 	bl	wake_up_process
 .LVL238:
-	.loc 1 671 0
+	.loc 1 673 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -2590,7 +2590,7 @@ frame_done_callback:
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
 .LFB2822:
-	.loc 1 1128 0
+	.loc 1 1130 0
 	.cfi_startproc
 .LVL239:
 	stp	x29, x30, [sp, -16]!
@@ -2599,10 +2599,10 @@ ebc_frame_timeout:
 	.cfi_offset 30, -8
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1129 0
+	.loc 1 1131 0
 	bl	frame_done_callback
 .LVL240:
-	.loc 1 1131 0
+	.loc 1 1133 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -2616,16 +2616,16 @@ ebc_frame_timeout:
 	.type	ebc_lut_update, %function
 ebc_lut_update:
 .LFB2817:
-	.loc 1 674 0
+	.loc 1 676 0
 	.cfi_startproc
 .LVL241:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 676 0
+	.loc 1 678 0
 	mov	w3, 25
-	.loc 1 674 0
+	.loc 1 676 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x21, x22, [sp, 32]
@@ -2635,18 +2635,18 @@ ebc_lut_update:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -48
 	.cfi_offset 20, -40
-	.loc 1 676 0
+	.loc 1 678 0
 	add	x1, x29, 64
-	.loc 1 674 0
+	.loc 1 676 0
 	adrp	x19, __stack_chk_guard
 	add	x0, x19, :lo12:__stack_chk_guard
 .LVL242:
-	.loc 1 680 0
+	.loc 1 682 0
 	ldr	x2, [x21, 16]
-	.loc 1 676 0
+	.loc 1 678 0
 	str	w3, [x1, -12]!
 .LVL243:
-	.loc 1 674 0
+	.loc 1 676 0
 	ldr	x3, [x0]
 	str	x3, [x29, 56]
 	mov	x3,0
@@ -2660,31 +2660,31 @@ ebc_lut_update:
 	mov	w20, w0
 .LBE1205:
 .LBE1204:
-	.loc 1 681 0
+	.loc 1 683 0
 	cbnz	w0, .L254
 .LVL245:
-	.loc 1 682 0
+	.loc 1 684 0
 	ldr	w2, [x29, 52]
-	.loc 1 683 0
+	.loc 1 685 0
 	add	x22, x21, 184
-	.loc 1 682 0
+	.loc 1 684 0
 	tbnz	w2, #31, .L277
-	.loc 1 686 0
+	.loc 1 688 0
 	cmp	w2, 50
 	bgt	.L278
 .L256:
-	.loc 1 694 0
+	.loc 1 696 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC12
 	add	x1, x1, :lo12:.LC12
 	bl	_dev_info
 .LVL246:
-	.loc 1 697 0
+	.loc 1 699 0
 	ldr	x0, [x22, 216]
 	ldr	w0, [x0, 40]
 	cmp	w0, 17
 	bls	.L279
-	.loc 1 744 0
+	.loc 1 746 0
 	ldr	w2, [x29, 52]
 .L276:
 	mov	w1, 7
@@ -2693,10 +2693,10 @@ ebc_lut_update:
 .LVL247:
 	cbnz	w0, .L268
 .L271:
-	.loc 1 749 0
+	.loc 1 751 0
 	cbnz	w20, .L269
 .L253:
-	.loc 1 755 0
+	.loc 1 757 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	w0, w20
 	ldr	x2, [x29, 56]
@@ -2720,11 +2720,11 @@ ebc_lut_update:
 	.p2align 3
 .L279:
 	.cfi_restore_state
-	.loc 1 697 0
-	adrp	x1, .L259
 	.loc 1 699 0
+	adrp	x1, .L259
+	.loc 1 701 0
 	ldr	w2, [x29, 52]
-	.loc 1 697 0
+	.loc 1 699 0
 	add	x1, x1, :lo12:.L259
 	ldrb	w0, [x1,w0,uxtw]
 	adr	x1, .Lrtx259
@@ -2756,7 +2756,7 @@ ebc_lut_update:
 	.text
 	.p2align 3
 .L267:
-	.loc 1 699 0
+	.loc 1 701 0
 	mov	w1, 1
 	add	x0, x21, 280
 	bl	epd_lut_get
@@ -2764,21 +2764,21 @@ ebc_lut_update:
 	cbz	w0, .L271
 	.p2align 2
 .L268:
-	.loc 1 688 0
+	.loc 1 690 0
 	mov	w20, -1
 .L269:
-	.loc 1 750 0
+	.loc 1 752 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC13
 	add	x1, x1, :lo12:.LC13
 	bl	_dev_err
 .LVL251:
-	.loc 1 751 0
+	.loc 1 753 0
 	b	.L253
 .LVL252:
 	.p2align 3
 .L254:
-	.loc 1 692 0
+	.loc 1 694 0
 	add	x22, x21, 184
 	mov	w2, w0
 	adrp	x1, .LC11
@@ -2790,20 +2790,20 @@ ebc_lut_update:
 	b	.L256
 	.p2align 3
 .L278:
-	.loc 1 687 0
+	.loc 1 689 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC10
 	add	x1, x1, :lo12:.LC10
 	bl	_dev_err
 .LVL254:
-	.loc 1 688 0
+	.loc 1 690 0
 	mov	w2, 50
 	str	w2, [x29, 52]
 .LVL255:
 	b	.L256
 	.p2align 3
 .L262:
-	.loc 1 730 0
+	.loc 1 732 0
 	mov	w1, 9
 	add	x0, x21, 280
 	bl	epd_lut_get
@@ -2812,7 +2812,7 @@ ebc_lut_update:
 	b	.L271
 	.p2align 3
 .L263:
-	.loc 1 735 0
+	.loc 1 737 0
 	mov	w1, 10
 	add	x0, x21, 280
 	bl	epd_lut_get
@@ -2821,7 +2821,7 @@ ebc_lut_update:
 	b	.L271
 	.p2align 3
 .L264:
-	.loc 1 740 0
+	.loc 1 742 0
 	mov	w1, 11
 	add	x0, x21, 280
 	bl	epd_lut_get
@@ -2830,7 +2830,7 @@ ebc_lut_update:
 	b	.L271
 	.p2align 3
 .L265:
-	.loc 1 716 0
+	.loc 1 718 0
 	mov	w1, 6
 	add	x0, x21, 280
 	bl	epd_lut_get
@@ -2839,7 +2839,7 @@ ebc_lut_update:
 	b	.L271
 	.p2align 3
 .L258:
-	.loc 1 712 0
+	.loc 1 714 0
 	mov	w1, 5
 	add	x0, x21, 280
 	bl	epd_lut_get
@@ -2848,7 +2848,7 @@ ebc_lut_update:
 	b	.L271
 	.p2align 3
 .L261:
-	.loc 1 725 0
+	.loc 1 727 0
 	mov	w1, 8
 	add	x0, x21, 280
 	bl	epd_lut_get
@@ -2857,7 +2857,7 @@ ebc_lut_update:
 	b	.L271
 	.p2align 3
 .L266:
-	.loc 1 720 0
+	.loc 1 722 0
 	mov	w1, 4
 	add	x0, x21, 280
 	bl	epd_lut_get
@@ -2866,18 +2866,18 @@ ebc_lut_update:
 	b	.L271
 	.p2align 3
 .L277:
-	.loc 1 683 0
+	.loc 1 685 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC10
 	add	x1, x1, :lo12:.LC10
 	bl	_dev_err
 .LVL263:
-	.loc 1 684 0
+	.loc 1 686 0
 	str	wzr, [x29, 52]
 	mov	w2, 0
 	b	.L256
 .L280:
-	.loc 1 755 0
+	.loc 1 757 0
 	bl	__stack_chk_fail
 .LVL264:
 	.cfi_endproc
@@ -2888,32 +2888,32 @@ ebc_lut_update:
 	.type	ebc_state_read, %function
 ebc_state_read:
 .LFB2833:
-	.loc 1 1523 0
+	.loc 1 1525 0
 	.cfi_startproc
 .LVL265:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1524 0
+	.loc 1 1526 0
 	adrp	x3, .LANCHOR0
-	.loc 1 1523 0
+	.loc 1 1525 0
 	mov	x0, x2
 .LVL266:
-	.loc 1 1524 0
+	.loc 1 1526 0
 	adrp	x1, .LC14
 .LVL267:
-	.loc 1 1523 0
+	.loc 1 1525 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1524 0
+	.loc 1 1526 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL268:
 	add	x1, x1, :lo12:.LC14
 	ldr	w2, [x2, 616]
 	bl	sprintf
 .LVL269:
-	.loc 1 1525 0
+	.loc 1 1527 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -2928,7 +2928,7 @@ ebc_state_read:
 	.type	ebc_version_read, %function
 ebc_version_read:
 .LFB2832:
-	.loc 1 1514 0
+	.loc 1 1516 0
 	.cfi_startproc
 .LVL270:
 	stp	x29, x30, [sp, -16]!
@@ -2937,22 +2937,22 @@ ebc_version_read:
 	.cfi_offset 30, -8
 	mov	x0, x2
 .LVL271:
-	.loc 1 1515 0
+	.loc 1 1517 0
 	adrp	x1, .LC16
 .LVL272:
 	adrp	x2, .LC15
 .LVL273:
-	.loc 1 1514 0
+	.loc 1 1516 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1515 0
+	.loc 1 1517 0
 	add	x2, x2, :lo12:.LC15
-	.loc 1 1514 0
-	.loc 1 1515 0
+	.loc 1 1516 0
+	.loc 1 1517 0
 	add	x1, x1, :lo12:.LC16
 	bl	sprintf
 .LVL274:
-	.loc 1 1516 0
+	.loc 1 1518 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -2967,27 +2967,27 @@ ebc_version_read:
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
 .LFB2830:
-	.loc 1 1478 0
+	.loc 1 1480 0
 	.cfi_startproc
 .LVL275:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 1479 0
+	.loc 1 1481 0
 	adrp	x0, .LANCHOR0
 .LVL276:
-	.loc 1 1478 0
+	.loc 1 1480 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1482 0
+	.loc 1 1484 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1478 0
+	.loc 1 1480 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1478 0
+	.loc 1 1480 0
 	mov	x19, x2
-	.loc 1 1482 0
+	.loc 1 1484 0
 	ldr	x1, [x0, 16]
 .LVL277:
 .LBB1206:
@@ -2999,14 +2999,14 @@ pmic_vcom_read:
 .LVL278:
 .LBE1207:
 .LBE1206:
-	.loc 1 1484 0
+	.loc 1 1486 0
 	mov	w2, w0
 	adrp	x1, .LC14
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC14
 	bl	sprintf
 .LVL279:
-	.loc 1 1485 0
+	.loc 1 1487 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL280:
@@ -3024,20 +3024,20 @@ pmic_vcom_read:
 	.type	pmic_temp_read, %function
 pmic_temp_read:
 .LFB2829:
-	.loc 1 1464 0
+	.loc 1 1466 0
 	.cfi_startproc
 .LVL281:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 1465 0
+	.loc 1 1467 0
 	adrp	x0, .LANCHOR0
 .LVL282:
-	.loc 1 1464 0
+	.loc 1 1466 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1468 0
+	.loc 1 1470 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
 .LBB1208:
 .LBB1209:
@@ -3046,11 +3046,11 @@ pmic_temp_read:
 .LVL283:
 .LBE1209:
 .LBE1208:
-	.loc 1 1464 0
+	.loc 1 1466 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 1464 0
+	.loc 1 1466 0
 	adrp	x19, __stack_chk_guard
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x20, x2
@@ -3058,7 +3058,7 @@ pmic_temp_read:
 	str	x2, [x29, 40]
 	mov	x2,0
 .LVL284:
-	.loc 1 1468 0
+	.loc 1 1470 0
 	ldr	x2, [x0, 16]
 .LBB1211:
 .LBB1210:
@@ -3069,14 +3069,14 @@ pmic_temp_read:
 .LVL285:
 .LBE1210:
 .LBE1211:
-	.loc 1 1470 0
+	.loc 1 1472 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC14
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC14
 	bl	sprintf
 .LVL286:
-	.loc 1 1471 0
+	.loc 1 1473 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
@@ -3105,25 +3105,25 @@ pmic_temp_read:
 	.type	pmic_name_read, %function
 pmic_name_read:
 .LFB2828:
-	.loc 1 1453 0
+	.loc 1 1455 0
 	.cfi_startproc
 .LVL290:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1454 0
+	.loc 1 1456 0
 	adrp	x3, .LANCHOR0
-	.loc 1 1453 0
+	.loc 1 1455 0
 	mov	x0, x2
 .LVL291:
-	.loc 1 1456 0
+	.loc 1 1458 0
 	adrp	x1, .LC16
 .LVL292:
-	.loc 1 1453 0
+	.loc 1 1455 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1456 0
+	.loc 1 1458 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL293:
 	add	x1, x1, :lo12:.LC16
@@ -3131,7 +3131,7 @@ pmic_name_read:
 	add	x2, x2, 8
 	bl	sprintf
 .LVL294:
-	.loc 1 1457 0
+	.loc 1 1459 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -3146,17 +3146,17 @@ pmic_name_read:
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
 .LFB2831:
-	.loc 1 1490 0
+	.loc 1 1492 0
 	.cfi_startproc
 .LVL295:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 1491 0
+	.loc 1 1493 0
 	adrp	x0, .LANCHOR0
 .LVL296:
-	.loc 1 1490 0
+	.loc 1 1492 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -3166,37 +3166,37 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 1490 0
+	.loc 1 1492 0
 	add	x1, x19, :lo12:__stack_chk_guard
 .LVL297:
 	mov	x21, x2
-	.loc 1 1491 0
+	.loc 1 1493 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
 .LVL298:
-	.loc 1 1490 0
+	.loc 1 1492 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
 .LVL299:
 	mov	x20, x3
-	.loc 1 1494 0
+	.loc 1 1496 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
 .LVL300:
-	.loc 1 1495 0
+	.loc 1 1497 0
 	cbnz	w0, .L300
 .LVL301:
-	.loc 1 1499 0
+	.loc 1 1501 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
 .LVL302:
-	.loc 1 1500 0
+	.loc 1 1502 0
 	cbnz	w0, .L301
 .L293:
-	.loc 1 1506 0
+	.loc 1 1508 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
 .LVL303:
@@ -3221,36 +3221,36 @@ pmic_vcom_write:
 	.p2align 3
 .L300:
 	.cfi_restore_state
-	.loc 1 1496 0
+	.loc 1 1498 0
 	ldr	x0, [x22]
 	adrp	x1, .LC17
 	mov	x2, x21
 	add	x1, x1, :lo12:.LC17
-	.loc 1 1497 0
+	.loc 1 1499 0
 	mov	x20, -1
 .LVL306:
-	.loc 1 1496 0
+	.loc 1 1498 0
 	bl	_dev_err
 .LVL307:
-	.loc 1 1497 0
+	.loc 1 1499 0
 	b	.L293
 .LVL308:
 	.p2align 3
 .L301:
-	.loc 1 1501 0
+	.loc 1 1503 0
 	ldr	x0, [x22]
 	adrp	x1, .LC18
-	.loc 1 1502 0
+	.loc 1 1504 0
 	mov	x20, -1
 .LVL309:
-	.loc 1 1501 0
+	.loc 1 1503 0
 	add	x1, x1, :lo12:.LC18
 	bl	_dev_err
 .LVL310:
-	.loc 1 1502 0
+	.loc 1 1504 0
 	b	.L293
 .L302:
-	.loc 1 1506 0
+	.loc 1 1508 0
 	bl	__stack_chk_fail
 .LVL311:
 	.cfi_endproc
@@ -3261,7 +3261,7 @@ pmic_vcom_write:
 	.type	waveform_version_read, %function
 waveform_version_read:
 .LFB2827:
-	.loc 1 1442 0
+	.loc 1 1444 0
 	.cfi_startproc
 .LVL312:
 	stp	x29, x30, [sp, -32]!
@@ -3272,19 +3272,19 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1442 0
+	.loc 1 1444 0
 	mov	x19, x2
-	.loc 1 1443 0
+	.loc 1 1445 0
 	bl	epd_lut_get_wf_version
 .LVL313:
-	.loc 1 1445 0
+	.loc 1 1447 0
 	mov	x2, x0
 	adrp	x1, .LC16
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC16
 	bl	sprintf
 .LVL314:
-	.loc 1 1446 0
+	.loc 1 1448 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL315:
@@ -3302,23 +3302,23 @@ waveform_version_read:
 	.type	ebc_init, %function
 ebc_init:
 .LFB2844:
-	.loc 1 1958 0
+	.loc 1 1960 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1959 0
+	.loc 1 1961 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 1958 0
+	.loc 1 1960 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1959 0
+	.loc 1 1961 0
 	bl	__platform_driver_register
 .LVL316:
-	.loc 1 1960 0
+	.loc 1 1962 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -4277,7 +4277,7 @@ ebc_frame_start:
 	bl	get_auto_image
 .LVL397:
 .L427:
-	.loc 1 567 0
+	.loc 1 568 0
 	ldp	x19, x20, [sp, 16]
 .LVL398:
 	ldr	x21, [sp, 32]
@@ -4296,14 +4296,14 @@ ebc_frame_start:
 	.cfi_restore_state
 	.loc 1 502 0
 	sub	w0, w0, #7
-	cmp	w0, 4
+	cmp	w0, 5
 	bhi	.L428
-	.loc 1 542 0
+	.loc 1 543 0
 	ldr	x2, [x19, 208]
-	.loc 1 539 0
+	.loc 1 540 0
 	ldrb	w4, [x19, 32]
 	str	w4, [x19, 40]
-	.loc 1 540 0
+	.loc 1 541 0
 	ldr	x0, [x19, 176]
 	mov	w3, w4
 	ldr	x5, [x20, 296]
@@ -4322,14 +4322,14 @@ ebc_frame_start:
 .LVL401:
 .LBE1287:
 .LBE1286:
-	.loc 1 545 0
+	.loc 1 546 0
 	ldr	w4, [x19, 40]
-	.loc 1 547 0
+	.loc 1 548 0
 	ldp	x2, x1, [x19, 208]
-	.loc 1 545 0
+	.loc 1 546 0
 	sub	w4, w4, #1
 	str	w4, [x19, 40]
-	.loc 1 546 0
+	.loc 1 547 0
 	ldr	x0, [x19, 184]
 	ldrb	w3, [x20, 216]
 	ldr	x5, [x20, 296]
@@ -4337,7 +4337,7 @@ ebc_frame_start:
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part.isra.1
 .LVL402:
-	.loc 1 567 0
+	.loc 1 568 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 .LVL403:
@@ -4375,7 +4375,7 @@ ebc_frame_start:
 .LVL406:
 .LBE1289:
 .LBE1288:
-	.loc 1 567 0
+	.loc 1 568 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 .LVL407:
@@ -4392,12 +4392,12 @@ ebc_frame_start:
 	.p2align 3
 .L428:
 	.cfi_restore_state
-	.loc 1 555 0
+	.loc 1 556 0
 	ldr	x2, [x19, 208]
-	.loc 1 552 0
+	.loc 1 553 0
 	ldrb	w4, [x19, 32]
 	str	w4, [x19, 40]
-	.loc 1 553 0
+	.loc 1 554 0
 	ldr	x0, [x19, 176]
 	mov	w3, w4
 	ldr	x5, [x20, 296]
@@ -4416,14 +4416,14 @@ ebc_frame_start:
 .LVL410:
 .LBE1291:
 .LBE1290:
-	.loc 1 558 0
+	.loc 1 559 0
 	ldr	w4, [x19, 40]
-	.loc 1 560 0
+	.loc 1 561 0
 	ldp	x2, x1, [x19, 208]
-	.loc 1 558 0
+	.loc 1 559 0
 	sub	w4, w4, #1
 	str	w4, [x19, 40]
-	.loc 1 559 0
+	.loc 1 560 0
 	ldr	x0, [x19, 184]
 	ldrb	w3, [x20, 216]
 	ldr	x5, [x20, 296]
@@ -4431,7 +4431,7 @@ ebc_frame_start:
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change.isra.0
 .LVL411:
-	.loc 1 567 0
+	.loc 1 568 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 .LVL412:
@@ -4476,16 +4476,16 @@ ebc_frame_start:
 	.type	ebc_auto_tast_function, %function
 ebc_auto_tast_function:
 .LFB2815:
-	.loc 1 570 0
+	.loc 1 571 0
 	.cfi_startproc
 .LVL416:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
 	.cfi_offset 30, -88
-	.loc 1 571 0
+	.loc 1 572 0
 	adrp	x1, .LANCHOR0
-	.loc 1 570 0
+	.loc 1 571 0
 	adrp	x0, __stack_chk_guard
 .LVL417:
 	add	x0, x0, :lo12:__stack_chk_guard
@@ -4496,16 +4496,16 @@ ebc_auto_tast_function:
 	.cfi_offset 20, -72
 	adrp	x20, .LANCHOR1
 	stp	x21, x22, [sp, 32]
-	.loc 1 576 0
+	.loc 1 577 0
 	add	x20, x20, :lo12:.LANCHOR1
 	.cfi_offset 21, -64
 	.cfi_offset 22, -56
-	.loc 1 571 0
+	.loc 1 572 0
 	ldr	x22, [x1, #:lo12:.LANCHOR0]
 .LVL418:
-	.loc 1 576 0
+	.loc 1 577 0
 	add	x20, x20, 376
-	.loc 1 570 0
+	.loc 1 571 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
@@ -4518,16 +4518,16 @@ ebc_auto_tast_function:
 .LBE1294:
 .LBE1293:
 .LBE1292:
-	.loc 1 570 0
+	.loc 1 571 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -32
 	.cfi_offset 26, -24
-	.loc 1 572 0
-	add	x21, x22, 24
 	.loc 1 573 0
+	add	x21, x22, 24
+	.loc 1 574 0
 	add	x19, x22, 184
 	add	x26, x22, 736
-	.loc 1 570 0
+	.loc 1 571 0
 	ldr	x1, [x0]
 	str	x1, [x29, 88]
 	mov	x1,0
@@ -4548,14 +4548,14 @@ ebc_auto_tast_function:
 .LBE1297:
 .LBE1296:
 .LBE1299:
-	.loc 1 581 0
+	.loc 1 582 0
 	cbnz	w0, .L439
-	.loc 1 591 0
+	.loc 1 592 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
 	bl	flip.isra.2
 .LVL420:
-	.loc 1 592 0
+	.loc 1 593 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 128]
@@ -4565,21 +4565,21 @@ ebc_auto_tast_function:
 	bl	get_auto_image
 .LVL421:
 .L444:
-	.loc 1 625 0
+	.loc 1 627 0
 	ldr	x0, [x19, 216]
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
 	bls	.L455
 .L447:
-	.loc 1 629 0
+	.loc 1 631 0
 	mov	x0, x20
 	bl	up
 .LVL422:
-	.loc 1 630 0
+	.loc 1 632 0
 	bl	schedule
 .LVL423:
 .L448:
-	.loc 1 576 0
+	.loc 1 577 0
 	mov	x0, x20
 	bl	down
 .LVL424:
@@ -4591,12 +4591,12 @@ ebc_auto_tast_function:
 .LBE1295:
 .LBE1298:
 .LBE1300:
-	.loc 1 580 0
+	.loc 1 581 0
 #APP
-// 580 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
+// 581 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
 	dmb ish
 // 0 "" 2
-	.loc 1 581 0
+	.loc 1 582 0
 #NO_APP
 	ldr	x0, [x19, 216]
 	ldr	w0, [x0, 40]
@@ -4604,27 +4604,27 @@ ebc_auto_tast_function:
 	beq	.L440
 	ble	.L456
 	sub	w0, w0, #7
-	cmp	w0, 4
+	cmp	w0, 5
 	bhi	.L439
-	.loc 1 603 0
+	.loc 1 605 0
 	ldr	w1, [x19, 40]
-	.loc 1 604 0
+	.loc 1 606 0
 	mov	x0, x21
-	.loc 1 603 0
+	.loc 1 605 0
 	sub	w1, w1, #1
 	str	w1, [x19, 40]
-	.loc 1 604 0
+	.loc 1 606 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.2
 .LVL425:
-	.loc 1 605 0
+	.loc 1 607 0
 	ldr	w4, [x19, 40]
 	cbz	w4, .L444
-	.loc 1 607 0
+	.loc 1 609 0
 	ldrsw	x0, [x21, 72]
-	.loc 1 608 0
+	.loc 1 610 0
 	ldp	x2, x1, [x19, 208]
-	.loc 1 607 0
+	.loc 1 609 0
 	add	x0, x0, 22
 	ldrb	w3, [x22, 216]
 	ldr	x5, [x22, 296]
@@ -4633,7 +4633,7 @@ ebc_auto_tast_function:
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part.isra.1
 .LVL426:
-	.loc 1 625 0
+	.loc 1 627 0
 	ldr	x0, [x19, 216]
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
@@ -4658,7 +4658,7 @@ ebc_auto_tast_function:
 .LBE1303:
 .LBE1302:
 .LBE1301:
-	.loc 1 583 0
+	.loc 1 584 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 128]
@@ -4667,34 +4667,34 @@ ebc_auto_tast_function:
 	ldr	x0, [x19, x0, lsl 3]
 	bl	get_auto_image
 .LVL428:
-	.loc 1 588 0
+	.loc 1 589 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
 	bl	flip.isra.2
 .LVL429:
-	.loc 1 589 0
+	.loc 1 590 0
 	b	.L444
 	.p2align 3
 .L439:
-	.loc 1 613 0
+	.loc 1 615 0
 	ldr	w1, [x19, 40]
-	.loc 1 614 0
+	.loc 1 616 0
 	mov	x0, x21
-	.loc 1 613 0
+	.loc 1 615 0
 	sub	w1, w1, #1
 	str	w1, [x19, 40]
-	.loc 1 614 0
+	.loc 1 616 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.2
 .LVL430:
-	.loc 1 615 0
+	.loc 1 617 0
 	ldr	w4, [x19, 40]
 	cbz	w4, .L444
-	.loc 1 617 0
+	.loc 1 619 0
 	ldrsw	x0, [x21, 72]
-	.loc 1 618 0
+	.loc 1 620 0
 	ldp	x2, x1, [x19, 208]
-	.loc 1 617 0
+	.loc 1 619 0
 	add	x0, x0, 22
 	ldrb	w3, [x22, 216]
 	ldr	x5, [x22, 296]
@@ -4703,7 +4703,7 @@ ebc_auto_tast_function:
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change.isra.0
 .LVL431:
-	.loc 1 621 0
+	.loc 1 623 0
 	b	.L444
 	.cfi_endproc
 .LFE2815:
@@ -4811,7 +4811,7 @@ ebc_power_set.part.3:
 	.type	ebc_probe, %function
 ebc_probe:
 .LFB2840:
-	.loc 1 1793 0
+	.loc 1 1795 0
 	.cfi_startproc
 .LVL441:
 	stp	x29, x30, [sp, -208]!
@@ -4825,15 +4825,15 @@ ebc_probe:
 	movk	w2, 0x60, lsl 16
 .LBE1461:
 .LBE1460:
-	.loc 1 1793 0
+	.loc 1 1795 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -192
 	.cfi_offset 20, -184
-	.loc 1 1794 0
+	.loc 1 1796 0
 	add	x20, x0, 16
-	.loc 1 1793 0
+	.loc 1 1795 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -160
 	.cfi_offset 24, -152
@@ -4849,7 +4849,7 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 1793 0
+	.loc 1 1795 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
@@ -4862,30 +4862,30 @@ ebc_probe:
 .LVL443:
 .LBE1462:
 .LBE1463:
-	.loc 1 1805 0
+	.loc 1 1807 0
 	cbz	x0, .L505
-	.loc 1 1809 0
+	.loc 1 1811 0
 	adrp	x25, .LANCHOR0
 	mov	x19, x0
-	.loc 1 1811 0
+	.loc 1 1813 0
 	adrp	x1, .LC22
 	mov	w2, 0
-	.loc 1 1809 0
-	str	x0, [x25, #:lo12:.LANCHOR0]
 	.loc 1 1811 0
+	str	x0, [x25, #:lo12:.LANCHOR0]
+	.loc 1 1813 0
 	add	x1, x1, :lo12:.LC22
 	ldr	x0, [x20, 752]
-	.loc 1 1808 0
+	.loc 1 1810 0
 	str	x20, [x19]
-	.loc 1 1811 0
+	.loc 1 1813 0
 	bl	of_parse_phandle
 .LVL444:
-	.loc 1 1812 0
+	.loc 1 1814 0
 	cbz	x0, .L548
-	.loc 1 1817 0
+	.loc 1 1819 0
 	bl	of_find_device_by_node
 .LVL445:
-	.loc 1 1819 0
+	.loc 1 1821 0
 	cbz	x0, .L464
 .LBB1464:
 .LBB1465:
@@ -4896,27 +4896,27 @@ ebc_probe:
 .LBE1466:
 .LBE1465:
 .LBE1464:
-	.loc 1 1822 0
+	.loc 1 1824 0
 	str	x0, [x19, 8]
-	.loc 1 1823 0
-	cbz	x0, .L464
 	.loc 1 1825 0
+	cbz	x0, .L464
+	.loc 1 1827 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 1827 0
+	.loc 1 1829 0
 	mov	w2, 0
 	adrp	x1, .LC24
 	add	x1, x1, :lo12:.LC24
 	ldr	x0, [x20, 752]
 	bl	of_parse_phandle
 .LVL447:
-	.loc 1 1828 0
+	.loc 1 1830 0
 	cbz	x0, .L549
-	.loc 1 1833 0
+	.loc 1 1835 0
 	bl	of_find_i2c_device_by_node
 .LVL448:
-	.loc 1 1835 0
+	.loc 1 1837 0
 	cbz	x0, .L550
 .LBB1467:
 .LBB1468:
@@ -4927,16 +4927,16 @@ ebc_probe:
 .LBE1469:
 .LBE1468:
 .LBE1467:
-	.loc 1 1839 0
+	.loc 1 1841 0
 	str	x0, [x19, 16]
-	.loc 1 1840 0
+	.loc 1 1842 0
 	cbz	x0, .L551
-	.loc 1 1846 0
+	.loc 1 1848 0
 	add	x21, x19, 184
 .LVL450:
-	.loc 1 1848 0
+	.loc 1 1850 0
 	add	x22, x19, 24
-	.loc 1 1846 0
+	.loc 1 1848 0
 	str	x20, [x21, 88]
 .LBB1470:
 .LBB1471:
@@ -4951,7 +4951,7 @@ ebc_probe:
 .LBE1472:
 .LBE1471:
 .LBE1470:
-	.loc 1 1848 0
+	.loc 1 1850 0
 	str	x20, [x19, 24]
 .LBB1569:
 .LBB1565:
@@ -4965,7 +4965,7 @@ ebc_probe:
 .LBE1481:
 .LBE1565:
 .LBE1569:
-	.loc 1 1849 0
+	.loc 1 1851 0
 	ldr	x2, [x19, 8]
 .LBB1570:
 .LBB1566:
@@ -4979,7 +4979,7 @@ ebc_probe:
 .LBE1482:
 .LBE1566:
 .LBE1570:
-	.loc 1 1850 0
+	.loc 1 1852 0
 	stp	x2, x0, [x22, 8]
 .LBB1571:
 .LBB1567:
@@ -5326,51 +5326,51 @@ ebc_probe:
 .LBE1550:
 .LBE1567:
 .LBE1571:
-	.loc 1 1858 0
+	.loc 1 1860 0
 	ldr	w0, [x22, 88]
 .LBB1572:
 .LBB1573:
-	.loc 1 1595 0
+	.loc 1 1597 0
 	mov	w2, 0
 .LBE1573:
 .LBE1572:
-	.loc 1 1858 0
+	.loc 1 1860 0
 	str	w0, [x21, 52]
-	.loc 1 1859 0
+	.loc 1 1861 0
 	ldr	w1, [x22, 84]
 	str	w1, [x21, 56]
-	.loc 1 1860 0
+	.loc 1 1862 0
 	mul	w0, w0, w1
 .LBB1601:
 .LBB1596:
-	.loc 1 1595 0
+	.loc 1 1597 0
 	adrp	x1, .LC33
 	add	x1, x1, :lo12:.LC33
 .LBE1596:
 .LBE1601:
-	.loc 1 1860 0
+	.loc 1 1862 0
 	lsr	w3, w0, 1
-	.loc 1 1861 0
+	.loc 1 1863 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x21, 20]
 .LBB1602:
 .LBB1597:
-	.loc 1 1586 0
+	.loc 1 1588 0
 	ldr	x26, [x19]
 .LVL471:
-	.loc 1 1595 0
+	.loc 1 1597 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL472:
-	.loc 1 1596 0
+	.loc 1 1598 0
 	cbz	x0, .L506
-	.loc 1 1599 0
+	.loc 1 1601 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL473:
 	mov	w24, w0
-	.loc 1 1601 0
+	.loc 1 1603 0
 	cbnz	w0, .L553
 .LBB1574:
 .LBB1575:
@@ -5379,9 +5379,9 @@ ebc_probe:
 	ldp	x1, x2, [x29, 104]
 .LBE1575:
 .LBE1574:
-	.loc 1 1606 0
+	.loc 1 1608 0
 	str	x1, [x19, 184]
-	.loc 1 1609 0
+	.loc 1 1611 0
 	mov	x3, 1
 	mov	x0, x26
 .LBB1577:
@@ -5391,16 +5391,16 @@ ebc_probe:
 	sub	x2, x2, x1
 .LBE1576:
 .LBE1577:
-	.loc 1 1607 0
-	str	w2, [x21, 16]
 	.loc 1 1609 0
+	str	w2, [x21, 16]
+	.loc 1 1611 0
 	sxtw	x2, w2
 	bl	devm_memremap
 .LVL474:
 	str	x0, [x21, 8]
-	.loc 1 1611 0
+	.loc 1 1613 0
 	cbz	x0, .L477
-	.loc 1 1619 0
+	.loc 1 1621 0
 	mov	x1, x0
 	ldr	w2, [x21, 16]
 	ldr	x0, [x19, 184]
@@ -5408,11 +5408,11 @@ ebc_probe:
 	mov	w3, 2097152
 	bl	ebc_buf_init
 .LVL475:
-	.loc 1 1620 0
+	.loc 1 1622 0
 	cbnz	w0, .L477
-	.loc 1 1625 0
+	.loc 1 1627 0
 	ldr	x0, [x21, 8]
-	.loc 1 1626 0
+	.loc 1 1628 0
 	mov	x5, 1048576
 	str	x5, [x22, 40]
 .LBB1578:
@@ -5421,13 +5421,13 @@ ebc_probe:
 	mov	w2, 32960
 .LBE1579:
 .LBE1578:
-	.loc 1 1625 0
+	.loc 1 1627 0
 	add	x6, x0, 10485760
 	str	x6, [x22, 24]
 	add	x4, x0, 11534336
-	.loc 1 1631 0
+	.loc 1 1633 0
 	add	x1, x0, 12582912
-	.loc 1 1627 0
+	.loc 1 1629 0
 	ldr	x3, [x19, 184]
 .LBB1583:
 .LBB1580:
@@ -5436,18 +5436,18 @@ ebc_probe:
 	mov	x0, x26
 .LBE1580:
 .LBE1583:
-	.loc 1 1627 0
+	.loc 1 1629 0
 	add	x7, x3, 10485760
 	str	x7, [x22, 32]
-	.loc 1 1628 0
+	.loc 1 1630 0
 	str	x6, [x21, 176]
-	.loc 1 1627 0
+	.loc 1 1629 0
 	add	x3, x3, 11534336
-	.loc 1 1626 0
+	.loc 1 1628 0
 	str	x5, [x22, 64]
-	.loc 1 1627 0
+	.loc 1 1629 0
 	stp	x4, x3, [x22, 48]
-	.loc 1 1631 0
+	.loc 1 1633 0
 	str	x1, [x21, 112]
 .LBB1584:
 .LBB1581:
@@ -5455,7 +5455,7 @@ ebc_probe:
 	ldrsw	x1, [x21, 20]
 .LBE1581:
 .LBE1584:
-	.loc 1 1628 0
+	.loc 1 1630 0
 	str	x4, [x21, 184]
 .LBB1585:
 .LBB1582:
@@ -5464,9 +5464,9 @@ ebc_probe:
 .LVL476:
 .LBE1582:
 .LBE1585:
-	.loc 1 1634 0
+	.loc 1 1636 0
 	str	x0, [x21, 128]
-	.loc 1 1635 0
+	.loc 1 1637 0
 	cbz	x0, .L477
 .LBB1586:
 .LBB1587:
@@ -5479,9 +5479,9 @@ ebc_probe:
 .LVL477:
 .LBE1587:
 .LBE1586:
-	.loc 1 1637 0
+	.loc 1 1639 0
 	str	x0, [x21, 136]
-	.loc 1 1638 0
+	.loc 1 1640 0
 	cbz	x0, .L477
 .LBB1588:
 .LBB1589:
@@ -5494,9 +5494,9 @@ ebc_probe:
 .LVL478:
 .LBE1589:
 .LBE1588:
-	.loc 1 1640 0
+	.loc 1 1642 0
 	str	x0, [x21, 144]
-	.loc 1 1641 0
+	.loc 1 1643 0
 	cbz	x0, .L477
 .LBB1590:
 .LBB1591:
@@ -5509,11 +5509,11 @@ ebc_probe:
 .LVL479:
 .LBE1591:
 .LBE1590:
-	.loc 1 1643 0
+	.loc 1 1645 0
 	str	x0, [x21, 152]
-	.loc 1 1644 0
+	.loc 1 1646 0
 	cbz	x0, .L477
-	.loc 1 1648 0
+	.loc 1 1650 0
 	ldp	w1, w2, [x22, 84]
 .LBB1592:
 .LBB1593:
@@ -5521,7 +5521,7 @@ ebc_probe:
 	mov	x0, x26
 .LBE1593:
 .LBE1592:
-	.loc 1 1648 0
+	.loc 1 1650 0
 	mul	w1, w1, w2
 .LBB1595:
 .LBB1594:
@@ -5533,18 +5533,18 @@ ebc_probe:
 .LVL480:
 .LBE1594:
 .LBE1595:
-	.loc 1 1648 0
+	.loc 1 1650 0
 	str	x0, [x21, 160]
-	.loc 1 1649 0
-	cbz	x0, .L477
 	.loc 1 1651 0
+	cbz	x0, .L477
+	.loc 1 1653 0
 	ldp	w2, w1, [x22, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	lsr	w2, w2, 4
 	bl	memset
 .LVL481:
-	.loc 1 1652 0
+	.loc 1 1654 0
 	ldrsw	x2, [x21, 20]
 	mov	w1, 255
 	ldr	x0, [x21, 144]
@@ -5554,45 +5554,45 @@ ebc_probe:
 .LBE1602:
 .LBB1603:
 .LBB1604:
-	.loc 1 1546 0
+	.loc 1 1548 0
 	ldr	x26, [x19, 272]
 .LVL483:
-	.loc 1 1552 0
+	.loc 1 1554 0
 	adrp	x1, .LC35
 	mov	w2, 0
 	add	x1, x1, :lo12:.LC35
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL484:
-	.loc 1 1553 0
+	.loc 1 1555 0
 	cbz	x0, .L507
-	.loc 1 1556 0
+	.loc 1 1558 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL485:
 	mov	w24, w0
-	.loc 1 1558 0
+	.loc 1 1560 0
 	cbz	w0, .L554
 .LVL486:
 .L478:
 .LBE1604:
 .LBE1603:
-	.loc 1 1873 0
+	.loc 1 1875 0
 	adrp	x1, .LC68
 	mov	x0, x20
 .LVL487:
 	add	x1, x1, :lo12:.LC68
 	bl	_dev_err
 .LVL488:
-	.loc 1 1874 0
+	.loc 1 1876 0
 	b	.L460
 .LVL489:
 	.p2align 3
 .L469:
-	.loc 1 1856 0
+	.loc 1 1858 0
 	mov	w24, -22
-	.loc 1 1855 0
+	.loc 1 1857 0
 	adrp	x1, .LC72
 	mov	w2, w24
 	add	x1, x1, :lo12:.LC72
@@ -5600,7 +5600,7 @@ ebc_probe:
 	bl	_dev_err
 .LVL490:
 .L460:
-	.loc 1 1898 0
+	.loc 1 1900 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w24
 .LVL491:
@@ -5638,7 +5638,7 @@ ebc_probe:
 	.cfi_restore_state
 .LBB1611:
 .LBB1598:
-	.loc 1 1602 0
+	.loc 1 1604 0
 	adrp	x1, .LC34
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC34
@@ -5647,20 +5647,20 @@ ebc_probe:
 .L474:
 .LBE1598:
 .LBE1611:
-	.loc 1 1866 0
+	.loc 1 1868 0
 	adrp	x1, .LC67
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC67
 	bl	_dev_err
 .LVL497:
-	.loc 1 1867 0
+	.loc 1 1869 0
 	b	.L460
 .LVL498:
 	.p2align 3
 .L473:
 .LBB1612:
 .LBB1568:
-	.loc 1 1195 0
+	.loc 1 1197 0
 	str	wzr, [x22, 96]
 	b	.L499
 	.p2align 3
@@ -5674,7 +5674,7 @@ ebc_probe:
 .LBE1553:
 .LBE1555:
 .LBE1557:
-	.loc 1 1192 0
+	.loc 1 1194 0
 	str	wzr, [x22, 92]
 .LBB1558:
 .LBB1556:
@@ -5703,7 +5703,7 @@ ebc_probe:
 .LBE1546:
 .LBE1548:
 .LBE1559:
-	.loc 1 1189 0
+	.loc 1 1191 0
 	str	wzr, [x22, 156]
 .LBB1560:
 .LBB1549:
@@ -5732,7 +5732,7 @@ ebc_probe:
 .LBE1539:
 .LBE1541:
 .LBE1561:
-	.loc 1 1186 0
+	.loc 1 1188 0
 	str	wzr, [x22, 152]
 .LBB1562:
 .LBB1542:
@@ -5761,7 +5761,7 @@ ebc_probe:
 .LBE1532:
 .LBE1534:
 .LBE1563:
-	.loc 1 1183 0
+	.loc 1 1185 0
 	str	wzr, [x22, 148]
 .LBB1564:
 .LBB1535:
@@ -5786,7 +5786,7 @@ ebc_probe:
 .LBE1612:
 .LBB1613:
 .LBB1607:
-	.loc 1 1564 0
+	.loc 1 1566 0
 	mov	x0, x26
 	mov	x3, 1
 .LBB1605:
@@ -5798,28 +5798,28 @@ ebc_probe:
 	sub	x26, x26, x1
 .LBE1606:
 .LBE1605:
-	.loc 1 1564 0
+	.loc 1 1566 0
 	sxtw	x2, w26
 	bl	devm_memremap
 .LVL505:
 	str	x0, [x19, 384]
-	.loc 1 1566 0
+	.loc 1 1568 0
 	cbz	x0, .L556
-	.loc 1 1571 0
+	.loc 1 1573 0
 	bl	epd_lut_from_mem_init
 .LVL506:
-	.loc 1 1572 0
+	.loc 1 1574 0
 	tbnz	w0, #31, .L557
 .L480:
 .LBE1607:
 .LBE1613:
 .LBB1614:
 .LBB1615:
-	.loc 1 1661 0
+	.loc 1 1663 0
 	add	x0, x19, 744
 	mov	x1, 68719476704
 	str	x1, [x21, 552]
-	.loc 1 1663 0
+	.loc 1 1665 0
 	add	x25, x25, :lo12:.LANCHOR0
 .LBB1616:
 .LBB1617:
@@ -5833,7 +5833,7 @@ ebc_probe:
 .LBE1618:
 .LBE1617:
 .LBE1616:
-	.loc 1 1659 0
+	.loc 1 1661 0
 	mov	w26, 99
 .LBB1622:
 .LBB1621:
@@ -5842,32 +5842,32 @@ ebc_probe:
 	str	x0, [x0, 8]
 .LBE1621:
 .LBE1622:
-	.loc 1 1661 0
+	.loc 1 1663 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x21, 576]
-	.loc 1 1663 0
+	.loc 1 1665 0
 	adrp	x3, .LC69
 	mov	w2, -1
 	add	x3, x3, :lo12:.LC69
 	mov	x1, x21
 	adrp	x0, ebc_auto_tast_function
-	.loc 1 1659 0
+	.loc 1 1661 0
 	str	w26, [x29, 104]
-	.loc 1 1663 0
+	.loc 1 1665 0
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
 .LVL507:
 	str	x0, [x25, 8]
-	.loc 1 1664 0
+	.loc 1 1666 0
 	cmn	x0, #4096
 	bhi	.L558
-	.loc 1 1668 0
+	.loc 1 1670 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
 .LVL508:
-	.loc 1 1669 0
+	.loc 1 1671 0
 	ldr	x2, [x25, 8]
 .LBB1623:
 .LBB1624:
@@ -5909,7 +5909,7 @@ ebc_probe:
 .LBE1624:
 .LBE1623:
 .LBB1625:
-	.loc 1 1672 0
+	.loc 1 1674 0
 	adrp	x3, .LC40
 	adrp	x0, ebc_thread
 .LVL512:
@@ -5918,10 +5918,10 @@ ebc_probe:
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x21
 .LBE1625:
-	.loc 1 1671 0
+	.loc 1 1673 0
 	str	w26, [x29, 104]
 .LBB1626:
-	.loc 1 1672 0
+	.loc 1 1674 0
 	bl	kthread_create_on_node
 .LVL513:
 	mov	x25, x0
@@ -5932,13 +5932,13 @@ ebc_probe:
 .LVL515:
 .LBE1626:
 	str	x25, [x21, 120]
-	.loc 1 1677 0
+	.loc 1 1679 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x25
 	bl	sched_setscheduler_nocheck
 .LVL516:
-	.loc 1 1678 0
+	.loc 1 1680 0
 	ldr	x2, [x21, 120]
 .LBB1627:
 .LBB1628:
@@ -5982,7 +5982,7 @@ ebc_probe:
 .LBE1614:
 .LBB1631:
 .LBB1632:
-	.loc 1 1687 0
+	.loc 1 1689 0
 	mov	w0, -1
 .LVL520:
 	str	w0, [x21, 48]
@@ -5993,9 +5993,9 @@ ebc_probe:
 .LVL521:
 .LBE1634:
 .LBE1633:
-	.loc 1 1691 0
+	.loc 1 1693 0
 	str	wzr, [x21, 28]
-	.loc 1 1690 0
+	.loc 1 1692 0
 	str	wzr, [x21, 80]
 .LBB1639:
 .LBB1635:
@@ -6003,7 +6003,7 @@ ebc_probe:
 	adrp	x1, .LC41
 .LBE1635:
 .LBE1639:
-	.loc 1 1686 0
+	.loc 1 1688 0
 	str	wzr, [x21, 192]
 .LBB1640:
 .LBB1636:
@@ -6011,14 +6011,14 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC41
 .LBE1636:
 .LBE1640:
-	.loc 1 1688 0
+	.loc 1 1690 0
 	str	wzr, [x21, 600]
-	.loc 1 1698 0
+	.loc 1 1700 0
 	add	x25, x19, 624
 .LVL522:
-	.loc 1 1689 0
+	.loc 1 1691 0
 	str	wzr, [x21, 604]
-	.loc 1 1699 0
+	.loc 1 1701 0
 	adrp	x26, jiffies
 .LBB1641:
 .LBB1637:
@@ -6026,7 +6026,7 @@ ebc_probe:
 	stp	xzr, xzr, [x0]
 .LBE1637:
 .LBE1641:
-	.loc 1 1699 0
+	.loc 1 1701 0
 	mov	x27, 268435455
 .LBB1642:
 .LBB1638:
@@ -6050,9 +6050,9 @@ ebc_probe:
 .LVL523:
 .LBE1638:
 .LBE1642:
-	.loc 1 1695 0
+	.loc 1 1697 0
 	str	wzr, [x21, 432]
-	.loc 1 1698 0
+	.loc 1 1700 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -6061,16 +6061,16 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
 .LVL524:
-	.loc 1 1699 0
+	.loc 1 1701 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
-	.loc 1 1702 0
+	.loc 1 1704 0
 	add	x25, x19, 680
-	.loc 1 1699 0
+	.loc 1 1701 0
 	add	x1, x1, x27
 	bl	mod_timer
 .LVL525:
-	.loc 1 1702 0
+	.loc 1 1704 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -6079,7 +6079,7 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
 .LVL526:
-	.loc 1 1703 0
+	.loc 1 1705 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
 	add	x1, x1, x27
@@ -6089,88 +6089,88 @@ ebc_probe:
 .LBE1631:
 .LBB1643:
 .LBB1644:
-	.loc 1 1713 0
+	.loc 1 1715 0
 	adrp	x0, saved_command_line
 	adrp	x1, .LC42
-	.loc 1 1710 0
+	.loc 1 1712 0
 	stp	wzr, wzr, [x29, 100]
 .LVL528:
-	.loc 1 1713 0
+	.loc 1 1715 0
 	add	x1, x1, :lo12:.LC42
 	ldr	x25, [x0, #:lo12:saved_command_line]
 	mov	x0, x25
 	bl	strstr
 .LVL529:
-	.loc 1 1714 0
+	.loc 1 1716 0
 	adrp	x1, .LC43
-	.loc 1 1713 0
+	.loc 1 1715 0
 	mov	x26, x0
 .LVL530:
-	.loc 1 1714 0
+	.loc 1 1716 0
 	add	x1, x1, :lo12:.LC43
 	mov	x0, x25
 	bl	strstr
 .LVL531:
 	mov	x28, x0
 .LVL532:
-	.loc 1 1719 0
+	.loc 1 1721 0
 	cbz	x26, .L483
-	.loc 1 1720 0
+	.loc 1 1722 0
 	add	x2, x29, 100
 	adrp	x1, .LC44
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC44
 	bl	sscanf
 .LVL533:
-	.loc 1 1721 0
+	.loc 1 1723 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
 	bls	.L559
 .L483:
-	.loc 1 1733 0
+	.loc 1 1735 0
 	mov	w25, 0
 .LVL534:
 	mov	x27, 0
 .LVL535:
-	.loc 1 1717 0
+	.loc 1 1719 0
 	mov	x26, 0
 .LVL536:
-	.loc 1 1733 0
+	.loc 1 1735 0
 	cbz	x28, .L503
 .LVL537:
 .L502:
-	.loc 1 1734 0
+	.loc 1 1736 0
 	add	x2, x29, 104
 	mov	x0, x28
 	adrp	x1, .LC47
 	add	x1, x1, :lo12:.LC47
 	bl	sscanf
 .LVL538:
-	.loc 1 1712 0
+	.loc 1 1714 0
 	mov	w28, 0
 .LVL539:
-	.loc 1 1735 0
+	.loc 1 1737 0
 	ldr	w2, [x29, 104]
-	.loc 1 1717 0
+	.loc 1 1719 0
 	mov	x26, 0
 .LVL540:
-	.loc 1 1735 0
+	.loc 1 1737 0
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
 	bls	.L560
 .L487:
-	.loc 1 1747 0
+	.loc 1 1749 0
 	cbz	w25, .L503
 .L486:
-	.loc 1 1754 0
+	.loc 1 1756 0
 	bl	ebc_empty_buf_get
 .LVL541:
 	mov	x25, x0
 .LVL542:
-	.loc 1 1755 0
+	.loc 1 1757 0
 	cbz	x0, .L489
-	.loc 1 1756 0
+	.loc 1 1758 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
@@ -6178,41 +6178,41 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL543:
-	.loc 1 1759 0
+	.loc 1 1761 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1757 0
+	.loc 1 1759 0
 	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 1762 0
+	.loc 1 1764 0
 	mov	x0, x25
-	.loc 1 1760 0
+	.loc 1 1762 0
 	ldr	w1, [x22, 84]
 	str	w1, [x25, 56]
-	.loc 1 1761 0
+	.loc 1 1763 0
 	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 1762 0
+	.loc 1 1764 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL544:
 .L489:
-	.loc 1 1766 0
+	.loc 1 1768 0
 	cbnz	w28, .L561
 .L491:
-	.loc 1 1779 0
+	.loc 1 1781 0
 	ldr	w0, [x21, 80]
 	adrp	x22, .LANCHOR1
 	cbz	w0, .L562
 .L493:
-	.loc 1 1784 0
+	.loc 1 1786 0
 	cbz	x27, .L494
-	.loc 1 1785 0
+	.loc 1 1787 0
 	mov	x0, x27
 	bl	kfree
 .LVL545:
 .L494:
-	.loc 1 1786 0
+	.loc 1 1788 0
 	cbz	x26, .L485
-	.loc 1 1787 0
+	.loc 1 1789 0
 	mov	x0, x26
 	bl	kfree
 .LVL546:
@@ -6229,44 +6229,44 @@ ebc_probe:
 .LBE1656:
 .LBB1659:
 .LBB1660:
-	.loc 1 1531 0
+	.loc 1 1533 0
 	add	x22, x22, :lo12:.LANCHOR1
 	add	x0, x22, 224
 	bl	misc_register
 .LVL547:
-	.loc 1 1533 0
+	.loc 1 1535 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 400
 	bl	device_create_file
 .LVL548:
-	.loc 1 1534 0
+	.loc 1 1536 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 432
 	bl	device_create_file
 .LVL549:
-	.loc 1 1535 0
+	.loc 1 1537 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 464
 	bl	device_create_file
 .LVL550:
-	.loc 1 1536 0
+	.loc 1 1538 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 496
 	bl	device_create_file
 .LVL551:
-	.loc 1 1537 0
+	.loc 1 1539 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 528
 	bl	device_create_file
 .LVL552:
-	.loc 1 1538 0
+	.loc 1 1540 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 560
 	bl	device_create_file
 .LVL553:
 .LBE1660:
 .LBE1659:
-	.loc 1 1895 0
+	.loc 1 1897 0
 	ldr	x0, [x21, 88]
 	adrp	x2, .LC15
 	adrp	x1, .LC51
@@ -6274,31 +6274,31 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC51
 	bl	_dev_info
 .LVL554:
-	.loc 1 1897 0
+	.loc 1 1899 0
 	b	.L460
 .LVL555:
 	.p2align 3
 .L503:
 .LBB1661:
 .LBB1653:
-	.loc 1 1748 0
+	.loc 1 1750 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC50
 	add	x1, x1, :lo12:.LC50
 	bl	_dev_info
 .LVL556:
-	.loc 1 1749 0
+	.loc 1 1751 0
 	ldr	x0, [x19, 16]
 	bl	ebc_pmic_verity_vcom
 .LVL557:
 .LBB1645:
 .LBB1646:
-	.loc 1 1103 0
+	.loc 1 1105 0
 	bl	ebc_empty_buf_get
 .LVL558:
 	mov	x25, x0
 .LVL559:
-	.loc 1 1104 0
+	.loc 1 1106 0
 	ldp	w2, w0, [x19, 108]
 	mov	w1, 255
 	mul	w2, w2, w0
@@ -6306,20 +6306,20 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memset
 .LVL560:
-	.loc 1 1107 0
+	.loc 1 1109 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1105 0
+	.loc 1 1107 0
 	mov	w0, 14
 	str	w0, [x25, 40]
-	.loc 1 1110 0
+	.loc 1 1112 0
 	mov	x0, x25
-	.loc 1 1108 0
+	.loc 1 1110 0
 	ldr	w1, [x19, 108]
 	str	w1, [x25, 56]
-	.loc 1 1109 0
+	.loc 1 1111 0
 	ldr	w1, [x19, 112]
 	str	w1, [x25, 60]
-	.loc 1 1110 0
+	.loc 1 1112 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL561:
 	b	.L489
@@ -6327,10 +6327,10 @@ ebc_probe:
 .L562:
 .LBE1646:
 .LBE1645:
-	.loc 1 1780 0
+	.loc 1 1782 0
 	mov	w2, 1
 	str	w2, [x21, 80]
-	.loc 1 1781 0
+	.loc 1 1783 0
 	add	x0, x22, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
@@ -6340,13 +6340,13 @@ ebc_probe:
 .LVL563:
 	.p2align 3
 .L560:
-	.loc 1 1737 0
+	.loc 1 1739 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC48
 	add	x1, x1, :lo12:.LC48
 	bl	_dev_info
 .LVL564:
-	.loc 1 1738 0
+	.loc 1 1740 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
 .LBB1647:
@@ -6363,13 +6363,13 @@ ebc_probe:
 .LBE1649:
 .LBE1648:
 .LBE1647:
-	.loc 1 1739 0
+	.loc 1 1741 0
 	cbz	x0, .L563
-	.loc 1 1743 0
+	.loc 1 1745 0
 	ldp	w2, w1, [x22, 84]
-	.loc 1 1736 0
+	.loc 1 1738 0
 	mov	w28, 1
-	.loc 1 1743 0
+	.loc 1 1745 0
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
@@ -6389,7 +6389,7 @@ ebc_probe:
 .LBE1661:
 .LBB1662:
 .LBB1599:
-	.loc 1 1612 0
+	.loc 1 1614 0
 	mov	w24, -12
 	b	.L474
 .LVL570:
@@ -6399,14 +6399,14 @@ ebc_probe:
 .LBE1662:
 .LBB1663:
 .LBB1654:
-	.loc 1 1767 0
+	.loc 1 1769 0
 	bl	ebc_empty_buf_get
 .LVL571:
 	mov	x25, x0
 .LVL572:
-	.loc 1 1768 0
+	.loc 1 1770 0
 	cbz	x0, .L491
-	.loc 1 1769 0
+	.loc 1 1771 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
@@ -6414,33 +6414,33 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL573:
-	.loc 1 1772 0
+	.loc 1 1774 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1770 0
+	.loc 1 1772 0
 	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 1773 0
+	.loc 1 1775 0
 	ldr	w0, [x22, 84]
 	str	w0, [x25, 56]
-	.loc 1 1775 0
+	.loc 1 1777 0
 	mov	x0, x25
-	.loc 1 1774 0
+	.loc 1 1776 0
 	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 1775 0
+	.loc 1 1777 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL574:
 	b	.L491
 .LVL575:
 	.p2align 3
 .L559:
-	.loc 1 1723 0
+	.loc 1 1725 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC45
 	add	x1, x1, :lo12:.LC45
 	bl	_dev_info
 .LVL576:
-	.loc 1 1724 0
+	.loc 1 1726 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
 .LBB1650:
@@ -6457,9 +6457,9 @@ ebc_probe:
 .LBE1652:
 .LBE1651:
 .LBE1650:
-	.loc 1 1725 0
+	.loc 1 1727 0
 	cbz	x0, .L564
-	.loc 1 1729 0
+	.loc 1 1731 0
 	ldp	w2, w1, [x22, 84]
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
@@ -6472,9 +6472,9 @@ ebc_probe:
 	add	x1, x3, x1
 	bl	memcpy
 .LVL581:
-	.loc 1 1733 0
+	.loc 1 1735 0
 	cbz	x28, .L508
-	.loc 1 1722 0
+	.loc 1 1724 0
 	mov	w25, 1
 .LVL582:
 	b	.L502
@@ -6485,26 +6485,26 @@ ebc_probe:
 .LBE1663:
 .LBB1664:
 .LBB1608:
-	.loc 1 1573 0
+	.loc 1 1575 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC37
 	add	x1, x1, :lo12:.LC37
 	bl	_dev_err
 .LVL584:
-	.loc 1 1574 0
+	.loc 1 1576 0
 	ldr	x0, [x19, 272]
 	mov	w2, w26
 	ldr	x1, [x19, 384]
 	bl	epd_lut_from_file_init
 .LVL585:
-	.loc 1 1575 0
+	.loc 1 1577 0
 	tbz	w0, #31, .L480
-	.loc 1 1576 0
+	.loc 1 1578 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC38
-	.loc 1 1577 0
+	.loc 1 1579 0
 	mov	w24, -1
-	.loc 1 1576 0
+	.loc 1 1578 0
 	add	x1, x1, :lo12:.LC38
 	bl	_dev_err
 .LVL586:
@@ -6514,7 +6514,7 @@ ebc_probe:
 .L464:
 .LBE1608:
 .LBE1664:
-	.loc 1 1820 0
+	.loc 1 1822 0
 	mov	w24, -517
 	b	.L460
 .LVL588:
@@ -6522,7 +6522,7 @@ ebc_probe:
 .L558:
 .LBB1665:
 .LBB1629:
-	.loc 1 1665 0
+	.loc 1 1667 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC39
 	add	x1, x1, :lo12:.LC39
@@ -6531,29 +6531,29 @@ ebc_probe:
 .L481:
 .LBE1629:
 .LBE1665:
-	.loc 1 1880 0
+	.loc 1 1882 0
 	adrp	x1, .LC71
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC71
-	.loc 1 1881 0
+	.loc 1 1883 0
 	mov	w24, -1
-	.loc 1 1880 0
+	.loc 1 1882 0
 	bl	_dev_err
 .LVL590:
-	.loc 1 1881 0
+	.loc 1 1883 0
 	b	.L460
 .LVL591:
 	.p2align 3
 .L482:
 .LBB1666:
 .LBB1630:
-	.loc 1 1674 0
+	.loc 1 1676 0
 	ldr	x0, [x21, 88]
 .LVL592:
 	adrp	x1, .LC70
-	.loc 1 1672 0
-	str	x25, [x21, 120]
 	.loc 1 1674 0
+	str	x25, [x21, 120]
+	.loc 1 1676 0
 	add	x1, x1, :lo12:.LC70
 	bl	_dev_err
 .LVL593:
@@ -6563,7 +6563,7 @@ ebc_probe:
 .L505:
 .LBE1630:
 .LBE1666:
-	.loc 1 1806 0
+	.loc 1 1808 0
 	mov	w24, -12
 	b	.L460
 .LVL595:
@@ -6571,86 +6571,86 @@ ebc_probe:
 .L506:
 .LBB1667:
 .LBB1600:
-	.loc 1 1597 0
+	.loc 1 1599 0
 	mov	w24, -19
 	b	.L474
 .LVL596:
 .L548:
 .LBE1600:
 .LBE1667:
-	.loc 1 1813 0
+	.loc 1 1815 0
 	adrp	x1, .LC23
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC23
-	.loc 1 1814 0
+	.loc 1 1816 0
 	mov	w24, -19
-	.loc 1 1813 0
+	.loc 1 1815 0
 	bl	_dev_err
 .LVL597:
-	.loc 1 1814 0
+	.loc 1 1816 0
 	b	.L460
 .L551:
-	.loc 1 1841 0
+	.loc 1 1843 0
 	adrp	x1, .LC27
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC27
-	.loc 1 1842 0
+	.loc 1 1844 0
 	mov	w24, -517
-	.loc 1 1841 0
+	.loc 1 1843 0
 	bl	_dev_err
 .LVL598:
-	.loc 1 1842 0
+	.loc 1 1844 0
 	b	.L460
 .L549:
-	.loc 1 1829 0
+	.loc 1 1831 0
 	adrp	x1, .LC25
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC25
-	.loc 1 1830 0
+	.loc 1 1832 0
 	mov	w24, -19
-	.loc 1 1829 0
+	.loc 1 1831 0
 	bl	_dev_err
 .LVL599:
-	.loc 1 1830 0
+	.loc 1 1832 0
 	b	.L460
 .LVL600:
 .L507:
 .LBB1668:
 .LBB1609:
-	.loc 1 1554 0
+	.loc 1 1556 0
 	mov	w24, -19
 	b	.L478
 .LVL601:
 .L550:
 .LBE1609:
 .LBE1668:
-	.loc 1 1836 0
+	.loc 1 1838 0
 	adrp	x1, .LC26
 	mov	x0, x20
 .LVL602:
 	add	x1, x1, :lo12:.LC26
-	.loc 1 1837 0
+	.loc 1 1839 0
 	mov	w24, -517
-	.loc 1 1836 0
+	.loc 1 1838 0
 	bl	_dev_err
 .LVL603:
-	.loc 1 1837 0
+	.loc 1 1839 0
 	b	.L460
 .LVL604:
 .L556:
 .LBB1669:
 .LBB1610:
-	.loc 1 1567 0
+	.loc 1 1569 0
 	ldr	x0, [x19, 272]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
 	adrp	x1, .LC36
-	mov	w3, 1567
+	mov	w3, 1569
 	add	x2, x2, 16
 	add	x1, x1, :lo12:.LC36
-	.loc 1 1568 0
+	.loc 1 1570 0
 	mov	w24, -12
-	.loc 1 1567 0
+	.loc 1 1569 0
 	bl	_dev_err
 .LVL605:
 	b	.L478
@@ -6658,13 +6658,13 @@ ebc_probe:
 .L555:
 .LBE1610:
 .LBE1669:
-	.loc 1 1898 0
+	.loc 1 1900 0
 	bl	__stack_chk_fail
 .LVL607:
 .L563:
 .LBB1670:
 .LBB1655:
-	.loc 1 1740 0
+	.loc 1 1742 0
 	ldr	x0, [x21, 88]
 .LVL608:
 	adrp	x1, .LC49
@@ -6675,7 +6675,7 @@ ebc_probe:
 	b	.L485
 .LVL610:
 .L564:
-	.loc 1 1726 0
+	.loc 1 1728 0
 	ldr	x0, [x21, 88]
 .LVL611:
 	adrp	x1, .LC46
@@ -6686,10 +6686,10 @@ ebc_probe:
 	b	.L485
 .LVL613:
 .L508:
-	.loc 1 1712 0
+	.loc 1 1714 0
 	mov	w28, 0
 .LVL614:
-	.loc 1 1717 0
+	.loc 1 1719 0
 	mov	x26, 0
 .LVL615:
 	b	.L486
@@ -6812,7 +6812,7 @@ ebc_power_set.constprop.7:
 	.type	ebc_suspend, %function
 ebc_suspend:
 .LFB2842:
-	.loc 1 1908 0
+	.loc 1 1910 0
 	.cfi_startproc
 .LVL627:
 	stp	x29, x30, [sp, -32]!
@@ -6830,17 +6830,17 @@ ebc_suspend:
 	ldr	x20, [x0, 184]
 .LBE1680:
 .LBE1679:
-	.loc 1 1912 0
+	.loc 1 1914 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 192]
 .LVL628:
 	cmp	w0, 1
 	beq	.L575
 .L573:
-	.loc 1 1916 0
+	.loc 1 1918 0
 	mov	w0, 1
 	str	w0, [x19, 604]
-	.loc 1 1918 0
+	.loc 1 1920 0
 	ldr	x1, [x20, 16]
 .LBB1681:
 .LBB1682:
@@ -6851,13 +6851,13 @@ ebc_suspend:
 .LVL629:
 .LBE1682:
 .LBE1681:
-	.loc 1 1919 0
+	.loc 1 1921 0
 	ldr	x0, [x19, 88]
 	adrp	x1, .LC75
 	add	x1, x1, :lo12:.LC75
 	bl	_dev_info
 .LVL630:
-	.loc 1 1922 0
+	.loc 1 1924 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -6871,7 +6871,7 @@ ebc_suspend:
 	.p2align 3
 .L575:
 	.cfi_restore_state
-	.loc 1 1913 0
+	.loc 1 1915 0
 	ldr	x0, [x19, 88]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
@@ -6880,7 +6880,7 @@ ebc_suspend:
 	add	x1, x1, :lo12:.LC74
 	bl	_dev_info
 .LVL631:
-	.loc 1 1914 0
+	.loc 1 1916 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.7
 .LVL632:
@@ -7017,16 +7017,16 @@ new_buffer_refresh:
 	.type	ebc_thread, %function
 ebc_thread:
 .LFB2819:
-	.loc 1 792 0
+	.loc 1 794 0
 	.cfi_startproc
 .LVL651:
 	stp	x29, x30, [sp, -224]!
 	.cfi_def_cfa_offset 224
 	.cfi_offset 29, -224
 	.cfi_offset 30, -216
-	.loc 1 793 0
+	.loc 1 795 0
 	adrp	x1, .LANCHOR0
-	.loc 1 792 0
+	.loc 1 794 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -7051,79 +7051,79 @@ ebc_thread:
 .LBB1708:
 .LBB1709:
 .LBB1710:
-	.loc 1 1091 0
+	.loc 1 1093 0
 	add	x24, x24, :lo12:.LANCHOR1
 .LBE1710:
 .LBE1709:
 .LBE1708:
-	.loc 1 793 0
+	.loc 1 795 0
 	ldr	x20, [x1, #:lo12:.LANCHOR0]
 .LVL653:
 .LBB1715:
 .LBB1713:
 .LBB1711:
-	.loc 1 1091 0
+	.loc 1 1093 0
 	add	x19, x24, 304
 .LBE1711:
 .LBE1713:
 .LBE1715:
-	.loc 1 792 0
+	.loc 1 794 0
 	ldr	x1, [x0]
 	str	x1, [x29, 216]
 	mov	x1,0
-	.loc 1 798 0
+	.loc 1 800 0
 	mov	w26, 0
 .LVL654:
-	.loc 1 795 0
-	add	x28, x20, 184
 	.loc 1 797 0
+	add	x28, x20, 184
+	.loc 1 799 0
 	mov	w22, 0
 .LVL655:
 	.p2align 2
 .L591:
-	.loc 1 803 0
+	.loc 1 805 0
 	ldr	w0, [x28, 608]
 .LVL656:
 	cbnz	w0, .L721
 .L592:
-	.loc 1 809 0
+	.loc 1 811 0
 	bl	ebc_dsp_buf_get
 .LVL657:
 	mov	x27, x0
-	.loc 1 811 0
+	.loc 1 813 0
 	cbz	x0, .L594
-	.loc 1 811 0 is_stmt 0 discriminator 1
+	.loc 1 813 0 is_stmt 0 discriminator 1
 	ldr	x1, [x0, 8]
 	cbz	x1, .L594
-	.loc 1 812 0 is_stmt 1
+	.loc 1 814 0 is_stmt 1
 	ldr	w1, [x0, 40]
 	cmp	w1, 17
 	beq	.L722
-	.loc 1 816 0
+	.loc 1 818 0
 	ldr	x2, [x28, 600]
 	cbz	x2, .L597
-	.loc 1 817 0
+	.loc 1 819 0
 	cmp	w1, 16
 	beq	.L723
 .L714:
-	.loc 1 874 0
+	.loc 1 876 0
 	bl	ebc_remove_from_dsp_buf_list
 .LVL658:
-	.loc 1 875 0
+	.loc 1 877 0
 	mov	x0, x27
 	bl	ebc_buf_release
 .LVL659:
-	.loc 1 803 0
+	.loc 1 805 0
 	ldr	w0, [x28, 608]
 	cbz	w0, .L592
 	.p2align 2
 .L721:
-	.loc 1 804 0
+	.loc 1 806 0
 	ldr	w0, [x28, 192]
 	cmp	w0, 1
 	beq	.L724
 .L593:
-	.loc 1 1097 0
+	.loc 1 1099 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, 0
 	ldr	x2, [x29, 216]
@@ -7159,12 +7159,12 @@ ebc_thread:
 	.p2align 3
 .L594:
 	.cfi_restore_state
-	.loc 1 1078 0
+	.loc 1 1080 0
 	ldr	w0, [x28, 28]
 .LVL665:
 	cmp	w0, 1
 	beq	.L726
-	.loc 1 1087 0
+	.loc 1 1089 0
 	ldr	w0, [x28, 192]
 	cmp	w0, 1
 	beq	.L727
@@ -7172,12 +7172,12 @@ ebc_thread:
 .L717:
 	ldr	w0, [x28, 80]
 .LVL667:
-	.loc 1 1090 0
+	.loc 1 1092 0
 	cbz	w0, .L728
 .L668:
 .LVL668:
 .L658:
-	.loc 1 1092 0
+	.loc 1 1094 0
 	str	wzr, [x28, 80]
 	b	.L591
 .LVL669:
@@ -7185,7 +7185,7 @@ ebc_thread:
 .L728:
 .LBB1716:
 .LBB1714:
-	.loc 1 1091 0 discriminator 1
+	.loc 1 1093 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
@@ -7195,13 +7195,13 @@ ebc_thread:
 .L729:
 .LVL671:
 .LBB1712:
-	.loc 1 1091 0 is_stmt 0 discriminator 5
+	.loc 1 1093 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L658
-	.loc 1 1091 0 discriminator 7
+	.loc 1 1093 0 discriminator 7
 	bl	schedule
 .LVL672:
 .L669:
-	.loc 1 1091 0 discriminator 9
+	.loc 1 1093 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
@@ -7210,43 +7210,43 @@ ebc_thread:
 	ldr	w1, [x28, 80]
 	cbz	w1, .L729
 .LBE1712:
-	.loc 1 1091 0 discriminator 4
+	.loc 1 1093 0 discriminator 4
 	add	x1, x29, 112
 	mov	x0, x19
 	bl	finish_wait
 .LVL674:
 .LBE1714:
 .LBE1716:
-	.loc 1 1092 0 is_stmt 1 discriminator 4
+	.loc 1 1094 0 is_stmt 1 discriminator 4
 	str	wzr, [x28, 80]
 	b	.L591
 .LVL675:
 	.p2align 3
 .L597:
-	.loc 1 829 0
+	.loc 1 831 0
 	cmp	w1, 15
 	beq	.L730
-	.loc 1 832 0
+	.loc 1 834 0
 	ldr	w0, [x28, 616]
 .LVL676:
 	cmp	w0, 0
 	ccmp	w1, 1, 4, ne
 	beq	.L596
-	.loc 1 834 0
+	.loc 1 836 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x27, 16]
 	ldr	x0, [x28, 144]
 	bl	memcpy
 .LVL677:
-	.loc 1 835 0
+	.loc 1 837 0
 	mov	x0, x27
 	bl	ebc_remove_from_dsp_buf_list
 .LVL678:
-	.loc 1 836 0
+	.loc 1 838 0
 	mov	x0, x27
 	bl	ebc_buf_release
 .LVL679:
-	.loc 1 838 0
+	.loc 1 840 0
 	ldr	x0, [x28, 216]
 	mov	x4, x28
 	ldp	x2, x1, [x28, 144]
@@ -7255,28 +7255,28 @@ ebc_thread:
 	ldr	x0, [x28, 128]
 	bl	refresh_new_image2
 .LVL680:
-	.loc 1 842 0
+	.loc 1 844 0
 	ldr	w0, [x28, 28]
 	cbnz	w0, .L591
-	.loc 1 845 0
+	.loc 1 847 0
 	ldr	w0, [x28, 192]
-	.loc 1 843 0
+	.loc 1 845 0
 	mov	w1, 1
-	.loc 1 844 0
+	.loc 1 846 0
 	str	wzr, [x28, 76]
-	.loc 1 843 0
-	str	w1, [x28, 28]
 	.loc 1 845 0
+	str	w1, [x28, 28]
+	.loc 1 847 0
 	cbz	w0, .L731
 .L601:
-	.loc 1 847 0
+	.loc 1 849 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC77
 	ldrb	w2, [x28, 32]
 	add	x1, x1, :lo12:.LC77
 	bl	_dev_info
 .LVL681:
-	.loc 1 848 0
+	.loc 1 850 0
 	mov	x0, x20
 	bl	ebc_frame_start
 .LVL682:
@@ -7284,14 +7284,14 @@ ebc_thread:
 .LVL683:
 	.p2align 3
 .L723:
-	.loc 1 818 0
+	.loc 1 820 0
 	str	wzr, [x28, 600]
-	.loc 1 819 0
+	.loc 1 821 0
 	mov	x0, 3
 .LVL684:
 	bl	ebc_notify
 .LVL685:
-	.loc 1 820 0
+	.loc 1 822 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC76
 	add	x1, x1, :lo12:.LC76
@@ -7299,7 +7299,7 @@ ebc_thread:
 .LVL686:
 	.p2align 2
 .L596:
-	.loc 1 853 0
+	.loc 1 855 0
 	adrp	x21, jiffies
 	mov	x1, 402653184
 	add	x0, x20, 624
@@ -7307,30 +7307,30 @@ ebc_thread:
 	add	x1, x2, x1
 	bl	mod_timer
 .LVL687:
-	.loc 1 855 0
+	.loc 1 857 0
 	ldr	w0, [x28, 436]
 	cbz	w0, .L602
 	ldr	x0, [x28, 208]
 .L603:
-	.loc 1 858 0
+	.loc 1 860 0
 	ldr	w2, [x0, 40]
 	ldr	w3, [x27, 40]
 	cmp	w3, w2
 	beq	.L604
-	.loc 1 859 0
+	.loc 1 861 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC78
 	add	x1, x1, :lo12:.LC78
 	bl	_dev_info
 .LVL688:
-	.loc 1 860 0
+	.loc 1 862 0
 	ldr	w0, [x28, 28]
 	cmp	w0, 1
 	beq	.L732
 .L715:
 	ldr	w2, [x27, 40]
 .L604:
-	.loc 1 867 0
+	.loc 1 869 0
 	cmp	w2, 11
 	bgt	.L611
 	cmp	w2, 7
@@ -7339,20 +7339,20 @@ ebc_thread:
 	beq	.L613
 	bgt	.L673
 	cbnz	w2, .L610
-	.loc 1 913 0
+	.loc 1 915 0
 	str	x27, [x28, 216]
-	.loc 1 914 0
+	.loc 1 916 0
 	ldrsw	x2, [x28, 20]
 	ldr	x0, [x28, 152]
 	ldr	x1, [x27, 16]
 	bl	memcpy
 .LVL689:
-	.loc 1 915 0
+	.loc 1 917 0
 	ldr	x0, [x28, 208]
 	ldr	w0, [x0, 40]
 	cbnz	w0, .L733
 .L634:
-	.loc 1 924 0
+	.loc 1 926 0
 	ldr	x0, [x28, 216]
 	mov	x4, x28
 	ldp	x2, x1, [x28, 144]
@@ -7362,49 +7362,49 @@ ebc_thread:
 	bl	refresh_new_image2
 .LVL690:
 .L635:
-	.loc 1 930 0
+	.loc 1 932 0
 	ldr	w0, [x28, 28]
 	cbnz	w0, .L625
-	.loc 1 933 0
+	.loc 1 935 0
 	ldr	w0, [x28, 192]
-	.loc 1 931 0
+	.loc 1 933 0
 	mov	w1, 1
-	.loc 1 932 0
+	.loc 1 934 0
 	str	wzr, [x28, 76]
-	.loc 1 931 0
-	str	w1, [x28, 28]
 	.loc 1 933 0
+	str	w1, [x28, 28]
+	.loc 1 935 0
 	cbz	w0, .L734
 .L636:
-	.loc 1 935 0
+	.loc 1 937 0
 	mov	x0, x20
 	bl	ebc_lut_update
 .LVL691:
 	cmn	w0, #1
 	beq	.L735
-	.loc 1 943 0
+	.loc 1 945 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC84
-	.loc 1 940 0
+	.loc 1 942 0
 	ldr	w3, [x28, 96]
-	.loc 1 943 0
+	.loc 1 945 0
 	add	x1, x1, :lo12:.LC84
-	.loc 1 940 0
+	.loc 1 942 0
 	strb	w3, [x28, 32]
 .L716:
-	.loc 1 943 0
+	.loc 1 945 0
 	and	w2, w3, 255
-	.loc 1 941 0
+	.loc 1 943 0
 	lsr	w3, w3, 8
 	strb	w3, [x28, 33]
-	.loc 1 943 0
+	.loc 1 945 0
 	bl	_dev_info
 .LVL692:
-	.loc 1 944 0
+	.loc 1 946 0
 	mov	x0, x20
 	bl	ebc_frame_start
 .LVL693:
-	.loc 1 1052 0
+	.loc 1 1054 0
 	ldr	x0, [x28, 216]
 	ldr	w0, [x0, 40]
 	cmp	w0, 17
@@ -7412,162 +7412,162 @@ ebc_thread:
 .LVL694:
 	.p2align 2
 .L741:
-	.loc 1 1055 0
+	.loc 1 1057 0
 	ldr	x0, [x28, 88]
-	.loc 1 1053 0
+	.loc 1 1055 0
 	mov	w21, 1
-	.loc 1 1054 0
+	.loc 1 1056 0
 	str	wzr, [x28, 196]
-	.loc 1 1055 0
+	.loc 1 1057 0
 	adrp	x1, .LC87
-	.loc 1 1053 0
-	str	w21, [x28, 608]
 	.loc 1 1055 0
+	str	w21, [x28, 608]
+	.loc 1 1057 0
 	add	x1, x1, :lo12:.LC87
 	bl	_dev_info
 .LVL695:
-	.loc 1 1056 0
+	.loc 1 1058 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x24, 328
 	bl	__wake_up_sync
 .LVL696:
-	.loc 1 1067 0
+	.loc 1 1069 0
 	mov	x0, x27
 	bl	ebc_remove_from_dsp_buf_list
 .LVL697:
-	.loc 1 1069 0
+	.loc 1 1071 0
 	ldr	w0, [x28, 436]
 	cbz	w0, .L656
 	.p2align 2
 .L743:
-	.loc 1 1070 0
+	.loc 1 1072 0
 	ldr	x0, [x28, 208]
 	bl	ebc_buf_release
 .LVL698:
 	b	.L657
 	.p2align 3
 .L602:
-	.loc 1 856 0
+	.loc 1 858 0
 	mov	x0, x27
 	str	x27, [x28, 208]
 	b	.L603
 .LVL699:
 	.p2align 3
 .L722:
-	.loc 1 814 0
+	.loc 1 816 0
 	str	wzr, [x28, 612]
-	.loc 1 813 0
+	.loc 1 815 0
 	str	wzr, [x28, 616]
 	b	.L596
 .LVL700:
 	.p2align 3
 .L611:
-	.loc 1 867 0
+	.loc 1 869 0
 	cmp	w2, 13
 	beq	.L614
 	blt	.L673
 	cmp	w2, 17
 	bgt	.L610
 .L673:
-	.loc 1 957 0
+	.loc 1 959 0
 	mov	w22, 1
 .L614:
-	.loc 1 965 0
+	.loc 1 967 0
 	ldr	x25, [x28, 208]
-	.loc 1 966 0
+	.loc 1 968 0
 	ldr	w0, [x25, 40]
 	cmp	w0, 1
 	bls	.L736
 .L638:
-	.loc 1 977 0
+	.loc 1 979 0
 	str	wzr, [x28, 76]
-	.loc 1 978 0
-	str	x27, [x28, 216]
 	.loc 1 980 0
+	str	x27, [x28, 216]
+	.loc 1 982 0
 	ldr	w9, [x27, 40]
-	.loc 1 983 0
+	.loc 1 985 0
 	sub	w0, w9, #7
-	.loc 1 980 0
+	.loc 1 982 0
 	cmp	w0, 4
 	bls	.L737
 .LVL701:
 .L639:
-	.loc 1 995 0
+	.loc 1 997 0
 	cbnz	w22, .L675
-	.loc 1 999 0
+	.loc 1 1001 0
 	ldr	w1, [x28, 48]
 	mov	x0, x27
 	cmp	w1, 0
 	ble	.L646
-	.loc 1 1000 0
+	.loc 1 1002 0
 	add	w26, w26, 1
-	.loc 1 1001 0
+	.loc 1 1003 0
 	cmp	w1, w26
 	ble	.L738
 .L646:
-	.loc 1 1008 0
+	.loc 1 1010 0
 	cmp	w9, 12
 	beq	.L739
 .L647:
-	.loc 1 1014 0
+	.loc 1 1016 0
 	ldr	w0, [x28, 192]
 	cbz	w0, .L740
 .L648:
-	.loc 1 1017 0
+	.loc 1 1019 0
 	mov	x0, x20
 	bl	ebc_lut_update
 .LVL702:
 	mov	w22, w0
 	cbz	w0, .L649
-	.loc 1 1018 0
+	.loc 1 1020 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC83
-	.loc 1 1021 0
+	.loc 1 1023 0
 	mov	w22, 0
-	.loc 1 1018 0
+	.loc 1 1020 0
 	add	x1, x1, :lo12:.LC83
 	bl	_dev_err
 .LVL703:
-	.loc 1 1020 0
+	.loc 1 1022 0
 	str	x25, [x28, 208]
 .LVL704:
 .L625:
-	.loc 1 1052 0
+	.loc 1 1054 0
 	ldr	x0, [x28, 216]
 	ldr	w0, [x0, 40]
 	cmp	w0, 17
 	beq	.L741
 .L654:
-	.loc 1 1058 0
+	.loc 1 1060 0
 	cmp	w0, 15
 	beq	.L742
 .L655:
-	.loc 1 1067 0
+	.loc 1 1069 0
 	mov	x0, x27
 	bl	ebc_remove_from_dsp_buf_list
 .LVL705:
-	.loc 1 1069 0
+	.loc 1 1071 0
 	ldr	w0, [x28, 436]
 	cbnz	w0, .L743
 .L656:
-	.loc 1 1072 0
+	.loc 1 1074 0
 	mov	w0, 1
 	str	w0, [x28, 436]
 .L657:
-	.loc 1 1074 0
+	.loc 1 1076 0
 	ldr	x0, [x28, 216]
 	str	x0, [x28, 208]
-	.loc 1 1075 0
+	.loc 1 1077 0
 	b	.L591
 	.p2align 3
 .L726:
 .LBB1717:
-	.loc 1 1079 0 discriminator 1
+	.loc 1 1081 0 discriminator 1
 	ldr	w0, [x28, 80]
 	cbnz	w0, .L658
 .LBB1718:
-	.loc 1 1079 0 is_stmt 0 discriminator 3
+	.loc 1 1081 0 is_stmt 0 discriminator 3
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
@@ -7576,17 +7576,17 @@ ebc_thread:
 	.p2align 3
 .L744:
 .LBB1719:
-	.loc 1 1079 0 discriminator 7
+	.loc 1 1081 0 discriminator 7
 	ldr	w1, [x28, 80]
 	cbnz	w1, .L659
 .LVL707:
-	.loc 1 1079 0 discriminator 9
+	.loc 1 1081 0 discriminator 9
 	cbnz	x0, .L717
-	.loc 1 1079 0 discriminator 11
+	.loc 1 1081 0 discriminator 11
 	bl	schedule
 .LVL708:
 .L662:
-	.loc 1 1079 0 discriminator 13
+	.loc 1 1081 0 discriminator 13
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
@@ -7596,7 +7596,7 @@ ebc_thread:
 	cbnz	w1, .L744
 .L659:
 .LBE1719:
-	.loc 1 1079 0 discriminator 8
+	.loc 1 1081 0 discriminator 8
 	mov	x0, x19
 	add	x1, x29, 112
 	bl	finish_wait
@@ -7604,53 +7604,53 @@ ebc_thread:
 	ldr	w0, [x28, 28]
 .LBE1718:
 .LBE1717:
-	.loc 1 1082 0 is_stmt 1 discriminator 8
+	.loc 1 1084 0 is_stmt 1 discriminator 8
 	cbnz	w0, .L717
-	.loc 1 1087 0
+	.loc 1 1089 0
 	ldr	w0, [x28, 192]
 	cmp	w0, 1
 	bne	.L717
 	.p2align 2
 .L727:
-	.loc 1 1088 0
+	.loc 1 1090 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.7
 .LVL711:
 	b	.L717
 	.p2align 3
 .L613:
-	.loc 1 869 0
+	.loc 1 871 0
 	ldr	w0, [x28, 612]
 	cbz	w0, .L616
-	.loc 1 870 0
+	.loc 1 872 0
 	str	w2, [x28, 616]
-	.loc 1 880 0
+	.loc 1 882 0
 	str	x27, [x28, 216]
-	.loc 1 881 0
+	.loc 1 883 0
 	ldr	x0, [x28, 152]
 	ldr	x1, [x27, 16]
 	ldrsw	x2, [x28, 20]
 	bl	memcpy
 .LVL712:
-	.loc 1 882 0
+	.loc 1 884 0
 	ldr	x1, [x28, 208]
 	ldr	w0, [x1, 40]
 	cmp	w0, 1
 	bls	.L745
-	.loc 1 884 0
+	.loc 1 886 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x1, 16]
 	ldr	x0, [x28, 128]
 	bl	memcpy
 .LVL713:
-	.loc 1 885 0
+	.loc 1 887 0
 	ldr	x0, [x28, 208]
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x28, 136]
 	bl	memcpy
 .LVL714:
-	.loc 1 886 0
+	.loc 1 888 0
 	ldr	x0, [x28, 208]
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
@@ -7658,7 +7658,7 @@ ebc_thread:
 	bl	memcpy
 .LVL715:
 .L619:
-	.loc 1 893 0
+	.loc 1 895 0
 	ldr	x1, [x28, 216]
 .LBB1720:
 .LBB1721:
@@ -7666,7 +7666,7 @@ ebc_thread:
 	ldp	w4, w5, [x28, 52]
 .LBE1721:
 .LBE1720:
-	.loc 1 891 0
+	.loc 1 893 0
 	ldr	x8, [x28, 128]
 .LBB1726:
 .LBB1722:
@@ -7689,7 +7689,7 @@ ebc_thread:
 	cmp	w2, 0
 .LBE1722:
 .LBE1726:
-	.loc 1 891 0
+	.loc 1 893 0
 	ldr	w12, [x1, 40]
 .LBB1727:
 .LBB1723:
@@ -7717,7 +7717,7 @@ ebc_thread:
 .LVL719:
 .LBE1723:
 .LBE1727:
-	.loc 1 891 0
+	.loc 1 893 0
 	ldp	x13, x11, [x28, 144]
 .LVL720:
 .LBB1728:
@@ -7726,7 +7726,7 @@ ebc_thread:
 	cmp	w14, w17
 .LBE1724:
 .LBE1728:
-	.loc 1 891 0
+	.loc 1 893 0
 	ldr	x9, [x28, 160]
 .LBB1729:
 .LBB1725:
@@ -7817,41 +7817,41 @@ ebc_thread:
 .L610:
 .LBE1725:
 .LBE1729:
-	.loc 1 1044 0
+	.loc 1 1046 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC86
 	add	x1, x1, :lo12:.LC86
 	bl	_dev_err
 .LVL730:
-	.loc 1 1045 0
+	.loc 1 1047 0
 	b	.L625
 .LVL731:
 	.p2align 3
 .L649:
-	.loc 1 1029 0
+	.loc 1 1031 0
 	ldr	x0, [x28, 216]
 .LVL732:
 	adrp	x1, .LC85
-	.loc 1 1026 0
+	.loc 1 1028 0
 	ldr	w3, [x28, 96]
-	.loc 1 1029 0
+	.loc 1 1031 0
 	add	x1, x1, :lo12:.LC85
-	.loc 1 1026 0
+	.loc 1 1028 0
 	strb	w3, [x28, 32]
-	.loc 1 1029 0
+	.loc 1 1031 0
 	and	w3, w3, 255
 	ldr	w2, [x0, 40]
 	ldr	x0, [x28, 88]
 	bl	_dev_info
 .LVL733:
-	.loc 1 1030 0
+	.loc 1 1032 0
 	mov	w0, 1
 	str	w0, [x28, 28]
-	.loc 1 1031 0
+	.loc 1 1033 0
 	mov	x0, x20
 	bl	ebc_frame_start
 .LVL734:
-	.loc 1 1033 0
+	.loc 1 1035 0
 	ldr	x1, [x21, #:lo12:jiffies]
 	add	x0, x20, 680
 	str	x0, [x29, 96]
@@ -7859,14 +7859,14 @@ ebc_thread:
 	bl	mod_timer
 .LVL735:
 .LBB1730:
-	.loc 1 1034 0
+	.loc 1 1036 0
 	ldr	w0, [x28, 76]
 	cbz	w0, .L747
 .L652:
 .LVL736:
 .L650:
 .LBE1730:
-	.loc 1 1036 0 discriminator 11
+	.loc 1 1038 0 discriminator 11
 	ldr	x2, [x21, #:lo12:jiffies]
 	mov	x1, 402653184
 	ldr	x0, [x29, 96]
@@ -7874,31 +7874,31 @@ ebc_thread:
 	add	x1, x2, x1
 	bl	mod_timer
 .LVL738:
-	.loc 1 1037 0 discriminator 11
-	str	wzr, [x28, 76]
 	.loc 1 1039 0 discriminator 11
-	str	x25, [x28, 208]
+	str	wzr, [x28, 76]
 	.loc 1 1041 0 discriminator 11
+	str	x25, [x28, 208]
+	.loc 1 1043 0 discriminator 11
 	b	.L625
 .LVL739:
 	.p2align 3
 .L675:
 	mov	x0, x27
-	.loc 1 996 0
+	.loc 1 998 0
 	mov	w26, 0
-	.loc 1 1008 0
+	.loc 1 1010 0
 	cmp	w9, 12
 	bne	.L647
 .L739:
-	.loc 1 1010 0
+	.loc 1 1012 0
 	ldr	w1, [x25, 40]
 	sub	w1, w1, #12
 	cmp	w1, 1
 	bls	.L647
-	.loc 1 1011 0
+	.loc 1 1013 0
 	mov	w1, 13
 	str	w1, [x0, 40]
-	.loc 1 1014 0
+	.loc 1 1016 0
 	ldr	w0, [x28, 192]
 	cbnz	w0, .L648
 	.p2align 2
@@ -7914,24 +7914,24 @@ ebc_thread:
 .L737:
 .LBE1736:
 .LBE1735:
-	.loc 1 987 0
+	.loc 1 989 0
 	ldp	w8, w0, [x20, 108]
-	.loc 1 985 0
-	ldr	x4, [x27, 16]
 	.loc 1 987 0
+	ldr	x4, [x27, 16]
+	.loc 1 989 0
 	mul	w8, w8, w0
-	.loc 1 986 0
+	.loc 1 988 0
 	ldr	x0, [x28, 208]
-	.loc 1 987 0
+	.loc 1 989 0
 	lsr	w8, w8, 1
-	.loc 1 986 0
+	.loc 1 988 0
 	ldr	x5, [x0, 16]
 .LBB1737:
 .LBB1738:
-	.loc 1 767 0
+	.loc 1 769 0
 	asr	w0, w8, 3
 	cbz	w0, .L640
-	.loc 1 771 0
+	.loc 1 773 0
 	ldr	x1, [x4]
 	ldr	x2, [x5]
 	cmp	x2, x1
@@ -7943,21 +7943,21 @@ ebc_thread:
 	b	.L642
 	.p2align 3
 .L643:
-	.loc 1 768 0
+	.loc 1 770 0
 	ldr	x2, [x4, x0]
 	add	x0, x0, 8
-	.loc 1 769 0
-	add	x1, x5, x0
 	.loc 1 771 0
+	add	x1, x5, x0
+	.loc 1 773 0
 	ldr	x1, [x1, -8]
 	cmp	x2, x1
 	bne	.L639
 .L642:
-	.loc 1 767 0
+	.loc 1 769 0
 	cmp	x3, x0
 	bne	.L643
 .L640:
-	.loc 1 777 0
+	.loc 1 779 0
 	ands	w8, w8, 7
 .LVL741:
 	beq	.L644
@@ -7969,12 +7969,12 @@ ebc_thread:
 	.p2align 3
 .L748:
 	add	x0, x0, 4
-	.loc 1 778 0
+	.loc 1 780 0
 	cmp	x0, x1
 	beq	.L644
 .L645:
 .LBB1739:
-	.loc 1 782 0
+	.loc 1 784 0
 	ldrb	w3, [x4, x0]
 	ldrb	w2, [x5, x0]
 	cmp	w3, w2
@@ -7985,31 +7985,31 @@ ebc_thread:
 .LBE1739:
 .LBE1738:
 .LBE1737:
-	.loc 1 873 0
+	.loc 1 875 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC81
 	add	x1, x1, :lo12:.LC81
 	bl	_dev_info
 .LVL743:
-	.loc 1 874 0
+	.loc 1 876 0
 	mov	x0, x27
 	b	.L714
 .L732:
-	.loc 1 861 0
+	.loc 1 863 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC79
 	add	x1, x1, :lo12:.LC79
 	bl	_dev_info
 .LVL744:
 .LBB1740:
-	.loc 1 862 0
+	.loc 1 864 0
 	ldr	w0, [x28, 76]
 	cbz	w0, .L749
 .L608:
 .LVL745:
 .L606:
 .LBE1740:
-	.loc 1 863 0 discriminator 11
+	.loc 1 865 0 discriminator 11
 	ldr	x0, [x28, 88]
 .LVL746:
 	adrp	x1, .LC80
@@ -8020,44 +8020,44 @@ ebc_thread:
 .LVL748:
 	.p2align 3
 .L730:
-	.loc 1 830 0
+	.loc 1 832 0
 	str	wzr, [x28, 616]
 	b	.L596
 .LVL749:
 	.p2align 3
 .L736:
-	.loc 1 971 0
+	.loc 1 973 0
 	add	x0, x29, 152
 	str	x0, [x28, 208]
-	.loc 1 972 0
+	.loc 1 974 0
 	ldr	x0, [x28, 136]
 	str	x0, [x29, 168]
 	b	.L638
 .LVL750:
 	.p2align 3
 .L742:
-	.loc 1 1062 0
+	.loc 1 1064 0
 	ldr	x0, [x28, 88]
-	.loc 1 1060 0
+	.loc 1 1062 0
 	mov	w21, 1
-	.loc 1 1059 0
+	.loc 1 1061 0
 	str	wzr, [x28, 196]
-	.loc 1 1062 0
+	.loc 1 1064 0
 	adrp	x1, .LC88
-	.loc 1 1060 0
-	str	w21, [x28, 600]
 	.loc 1 1062 0
+	str	w21, [x28, 600]
+	.loc 1 1064 0
 	add	x1, x1, :lo12:.LC88
-	.loc 1 1061 0
+	.loc 1 1063 0
 	str	wzr, [x28, 616]
-	.loc 1 1062 0
+	.loc 1 1064 0
 	bl	_dev_info
 .LVL751:
-	.loc 1 1063 0
+	.loc 1 1065 0
 	mov	x0, 2
 	bl	ebc_notify
 .LVL752:
-	.loc 1 1064 0
+	.loc 1 1066 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x24, 328
@@ -8066,35 +8066,35 @@ ebc_thread:
 	b	.L655
 .LVL754:
 .L738:
-	.loc 1 1002 0
+	.loc 1 1004 0
 	mov	w0, 2
 	str	w0, [x27, 40]
-	.loc 1 1003 0
+	.loc 1 1005 0
 	mov	w26, 0
 	ldr	x0, [x28, 216]
 	ldr	w9, [x0, 40]
 	b	.L646
 .LVL755:
 .L733:
-	.loc 1 916 0
+	.loc 1 918 0
 	ldrsw	x2, [x28, 20]
 	mov	w1, 255
 	ldr	x0, [x28, 144]
 	bl	memset
 .LVL756:
-	.loc 1 918 0
+	.loc 1 920 0
 	ldr	x0, [x28, 208]
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
 	bls	.L634
-	.loc 1 920 0
+	.loc 1 922 0
 	ldr	x0, [x28, 216]
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x28, 128]
 	bl	memcpy
 .LVL757:
-	.loc 1 921 0
+	.loc 1 923 0
 	ldr	x0, [x28, 208]
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
@@ -8106,7 +8106,7 @@ ebc_thread:
 .LBB1744:
 .LBB1731:
 .LBB1732:
-	.loc 1 1034 0 discriminator 1
+	.loc 1 1036 0 discriminator 1
 	add	x0, x24, 352
 .LBE1732:
 	mov	w1, 0
@@ -8121,13 +8121,13 @@ ebc_thread:
 .L750:
 .LVL760:
 .LBB1734:
-	.loc 1 1034 0 is_stmt 0 discriminator 5
+	.loc 1 1036 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L650
-	.loc 1 1034 0 discriminator 7
+	.loc 1 1036 0 discriminator 7
 	bl	schedule
 .LVL761:
 .L653:
-	.loc 1 1034 0 discriminator 9
+	.loc 1 1036 0 discriminator 9
 	ldr	x0, [x29, 104]
 	add	x1, x29, 112
 	mov	w2, 1
@@ -8136,7 +8136,7 @@ ebc_thread:
 	ldr	w1, [x28, 76]
 	cbz	w1, .L750
 .LBE1734:
-	.loc 1 1034 0 discriminator 4
+	.loc 1 1036 0 discriminator 4
 	ldr	x0, [x29, 104]
 	add	x1, x29, 112
 	bl	finish_wait
@@ -8145,9 +8145,9 @@ ebc_thread:
 .L745:
 .LBE1731:
 .LBE1744:
-	.loc 1 887 0 is_stmt 1
+	.loc 1 889 0 is_stmt 1
 	cbnz	w0, .L619
-	.loc 1 888 0
+	.loc 1 890 0
 	ldrsw	x2, [x28, 20]
 	ldp	x1, x0, [x28, 136]
 	bl	memcpy
@@ -8157,7 +8157,7 @@ ebc_thread:
 .LBB1745:
 .LBB1741:
 .LBB1742:
-	.loc 1 862 0 discriminator 1
+	.loc 1 864 0 discriminator 1
 	add	x25, x24, 352
 .LVL765:
 .LBE1742:
@@ -8170,13 +8170,13 @@ ebc_thread:
 .L751:
 .LVL767:
 .LBB1743:
-	.loc 1 862 0 is_stmt 0 discriminator 5
+	.loc 1 864 0 is_stmt 0 discriminator 5
 	cbnz	x0, .L606
-	.loc 1 862 0 discriminator 7
+	.loc 1 864 0 discriminator 7
 	bl	schedule
 .LVL768:
 .L609:
-	.loc 1 862 0 discriminator 9
+	.loc 1 864 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x25
@@ -8185,7 +8185,7 @@ ebc_thread:
 	ldr	w1, [x28, 76]
 	cbz	w1, .L751
 .LBE1743:
-	.loc 1 862 0 discriminator 4
+	.loc 1 864 0 discriminator 4
 	mov	x0, x25
 	add	x1, x29, 112
 	bl	finish_wait
@@ -8195,54 +8195,54 @@ ebc_thread:
 .L622:
 .LBE1741:
 .LBE1745:
-	.loc 1 895 0 is_stmt 1
+	.loc 1 897 0 is_stmt 1
 	ldr	w0, [x28, 28]
 .LVL772:
 	cbnz	w0, .L625
-	.loc 1 898 0
+	.loc 1 900 0
 	ldr	w0, [x28, 192]
-	.loc 1 896 0
+	.loc 1 898 0
 	mov	w1, 1
-	.loc 1 897 0
+	.loc 1 899 0
 	str	wzr, [x28, 76]
-	.loc 1 896 0
-	str	w1, [x28, 28]
 	.loc 1 898 0
+	str	w1, [x28, 28]
+	.loc 1 900 0
 	cbz	w0, .L752
 .L633:
-	.loc 1 900 0
+	.loc 1 902 0
 	mov	x0, x20
 	bl	ebc_lut_update
 .LVL773:
 	cmn	w0, #1
 	beq	.L625
-	.loc 1 904 0
+	.loc 1 906 0
 	ldr	w3, [x28, 96]
-	.loc 1 907 0
+	.loc 1 909 0
 	adrp	x1, .LC82
-	.loc 1 904 0
+	.loc 1 906 0
 	strb	w3, [x28, 32]
-	.loc 1 907 0
+	.loc 1 909 0
 	add	x1, x1, :lo12:.LC82
 	ldr	x0, [x28, 88]
 	b	.L716
 .L724:
-	.loc 1 805 0
+	.loc 1 807 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.7
 .LVL774:
 	b	.L593
 .LVL775:
 .L644:
-	.loc 1 988 0
+	.loc 1 990 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC89
 	add	x1, x1, :lo12:.LC89
 	bl	_dev_info
 .LVL776:
-	.loc 1 990 0
+	.loc 1 992 0
 	str	x25, [x28, 208]
-	.loc 1 991 0
+	.loc 1 993 0
 	b	.L625
 .L734:
 .LBB1746:
@@ -8254,13 +8254,13 @@ ebc_thread:
 .L735:
 .LBE1747:
 .LBE1746:
-	.loc 1 936 0
+	.loc 1 938 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC83
 	add	x1, x1, :lo12:.LC83
 	bl	_dev_err
 .LVL778:
-	.loc 1 937 0
+	.loc 1 939 0
 	b	.L625
 .LVL779:
 .L752:
@@ -8282,7 +8282,7 @@ ebc_thread:
 .L725:
 .LBE1751:
 .LBE1750:
-	.loc 1 1097 0
+	.loc 1 1099 0
 	bl	__stack_chk_fail
 .LVL782:
 	.cfi_endproc
@@ -8402,9 +8402,9 @@ ebc_auto_task:
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.34835, %object
-	.size	__func__.34835, 11
-__func__.34835:
+	.type	__func__.34837, %object
+	.size	__func__.34837, 11
+__func__.34837:
 	.string	"ebc_io_ctl"
 	.align	3
 	.set	.LANCHOR3,. + 0
@@ -8412,14 +8412,14 @@ __func__.34835:
 	.size	__func__.34644, 16
 __func__.34644:
 	.string	"ebc_frame_start"
-	.type	__func__.35043, %object
-	.size	__func__.35043, 19
-__func__.35043:
+	.type	__func__.35045, %object
+	.size	__func__.35045, 19
+__func__.35045:
 	.string	"ebc_lut_table_init"
 	.zero	5
-	.type	__func__.35102, %object
-	.size	__func__.35102, 12
-__func__.35102:
+	.type	__func__.35104, %object
+	.size	__func__.35104, 12
+__func__.35104:
 	.string	"ebc_suspend"
 	.zero	4
 	.type	ebc_match, %object
@@ -8450,9 +8450,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init1967, %object
-	.size	__addressable_ebc_init1967, 8
-__addressable_ebc_init1967:
+	.type	__addressable_ebc_init1969, %object
+	.size	__addressable_ebc_init1969, 8
+__addressable_ebc_init1969:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -8507,7 +8507,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC15:
-	.string	"1.12"
+	.string	"1.13"
 	.zero	3
 .LC16:
 	.string	"%s\n"
@@ -36538,7 +36538,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3001
 	.byte	0x1
-	.2byte	0x58f
+	.2byte	0x591
 	.4byte	0x7b4
 	.uleb128 0x9
 	.byte	0x3
@@ -36546,7 +36546,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3002
 	.byte	0x1
-	.2byte	0x599
+	.2byte	0x59b
 	.4byte	0xc5df
 	.uleb128 0x9
 	.byte	0x3
@@ -36554,7 +36554,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3003
 	.byte	0x1
-	.2byte	0x5a8
+	.2byte	0x5aa
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36562,7 +36562,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x5b3
+	.2byte	0x5b5
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36570,7 +36570,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3005
 	.byte	0x1
-	.2byte	0x5c1
+	.2byte	0x5c3
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36578,7 +36578,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3006
 	.byte	0x1
-	.2byte	0x5e4
+	.2byte	0x5e6
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36586,7 +36586,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3007
 	.byte	0x1
-	.2byte	0x5ee
+	.2byte	0x5f0
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36594,7 +36594,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3008
 	.byte	0x1
-	.2byte	0x5f7
+	.2byte	0x5f9
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36602,7 +36602,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3009
 	.byte	0x1
-	.2byte	0x790
+	.2byte	0x792
 	.4byte	0xa531
 	.uleb128 0x9
 	.byte	0x3
@@ -36619,7 +36619,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3010
 	.byte	0x1
-	.2byte	0x795
+	.2byte	0x797
 	.4byte	0xe5a6
 	.uleb128 0x9
 	.byte	0x3
@@ -36627,7 +36627,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3011
 	.byte	0x1
-	.2byte	0x79b
+	.2byte	0x79d
 	.4byte	0xd66d
 	.uleb128 0x9
 	.byte	0x3
@@ -36635,15 +36635,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3012
 	.byte	0x1
-	.2byte	0x7af
+	.2byte	0x7b1
 	.4byte	0x443
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init1967
+	.8byte	__addressable_ebc_init1969
 	.uleb128 0x4c
 	.4byte	.LASF3013
 	.byte	0x1
-	.2byte	0x7b0
+	.2byte	0x7b2
 	.4byte	0x497
 	.uleb128 0x9
 	.byte	0x3
@@ -36651,7 +36651,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x7aa
+	.2byte	0x7ac
 	.8byte	.LFB2845
 	.8byte	.LFE2845-.LFB2845
 	.uleb128 0x1
@@ -36664,7 +36664,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3014
 	.byte	0x1
-	.2byte	0x7a5
+	.2byte	0x7a7
 	.4byte	0xc6
 	.8byte	.LFB2844
 	.8byte	.LFE2844-.LFB2844
@@ -36678,7 +36678,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x50
 	.4byte	.LASF3015
 	.byte	0x1
-	.2byte	0x784
+	.2byte	0x786
 	.4byte	0xc6
 	.8byte	.LFB2843
 	.8byte	.LFE2843-.LFB2843
@@ -36688,25 +36688,25 @@ __exitcall_ebc_exit:
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x784
+	.2byte	0x786
 	.4byte	0xa545
 	.4byte	.LLST11
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x786
+	.2byte	0x788
 	.4byte	0xe461
 	.uleb128 0x46
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x787
+	.2byte	0x789
 	.4byte	0xe6fb
 	.uleb128 0x53
 	.4byte	0x13235
 	.8byte	.LBB926
 	.8byte	.LBE926-.LBB926
 	.byte	0x1
-	.2byte	0x786
+	.2byte	0x788
 	.4byte	0xe6cb
 	.uleb128 0x54
 	.4byte	0x13246
@@ -36716,7 +36716,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB928
 	.8byte	.LBE928-.LBB928
 	.byte	0x1
-	.2byte	0x789
+	.2byte	0x78b
 	.4byte	0xe6ed
 	.uleb128 0x54
 	.4byte	0x12e32
@@ -36731,7 +36731,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x50
 	.4byte	.LASF3017
 	.byte	0x1
-	.2byte	0x773
+	.2byte	0x775
 	.4byte	0xc6
 	.8byte	.LFB2842
 	.8byte	.LFE2842-.LFB2842
@@ -36741,31 +36741,31 @@ __exitcall_ebc_exit:
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x773
+	.2byte	0x775
 	.4byte	0xa545
 	.4byte	.LLST146
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x775
+	.2byte	0x777
 	.4byte	0xe461
 	.uleb128 0x46
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x776
+	.2byte	0x778
 	.4byte	0xe6fb
 	.uleb128 0x55
 	.4byte	.LASF3018
 	.4byte	0xe7da
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35102
+	.8byte	__func__.35104
 	.uleb128 0x53
 	.4byte	0x13235
 	.8byte	.LBB1679
 	.8byte	.LBE1679-.LBB1679
 	.byte	0x1
-	.2byte	0x775
+	.2byte	0x777
 	.4byte	0xe780
 	.uleb128 0x54
 	.4byte	0x13246
@@ -36775,7 +36775,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1681
 	.8byte	.LBE1681-.LBB1681
 	.byte	0x1
-	.2byte	0x77e
+	.2byte	0x780
 	.4byte	0xe7a2
 	.uleb128 0x54
 	.4byte	0x12e4a
@@ -36802,7 +36802,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x76c
+	.2byte	0x76e
 	.4byte	0xc6
 	.8byte	.LFB2841
 	.8byte	.LFE2841-.LFB2841
@@ -36812,7 +36812,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x76c
+	.2byte	0x76e
 	.4byte	0xd6e9
 	.4byte	.LLST13
 	.uleb128 0x4e
@@ -36822,7 +36822,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3021
 	.byte	0x1
-	.2byte	0x700
+	.2byte	0x702
 	.4byte	0xc6
 	.8byte	.LFB2840
 	.8byte	.LFE2840-.LFB2840
@@ -36832,63 +36832,63 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x700
+	.2byte	0x702
 	.4byte	0xd6e9
 	.4byte	.LLST122
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x702
+	.2byte	0x704
 	.4byte	0xa545
 	.uleb128 0x46
 	.4byte	.LASF3022
 	.byte	0x1
-	.2byte	0x703
+	.2byte	0x705
 	.4byte	0xb869
 	.uleb128 0x57
 	.4byte	.LASF3023
 	.byte	0x1
-	.2byte	0x704
+	.2byte	0x706
 	.4byte	0xd6e9
 	.4byte	.LLST123
 	.uleb128 0x46
 	.4byte	.LASF3024
 	.byte	0x1
-	.2byte	0x705
+	.2byte	0x707
 	.4byte	0xb869
 	.uleb128 0x57
 	.4byte	.LASF3025
 	.byte	0x1
-	.2byte	0x706
+	.2byte	0x708
 	.4byte	0xc012
 	.4byte	.LLST124
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x707
+	.2byte	0x709
 	.4byte	0xe461
 	.uleb128 0x57
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x708
+	.2byte	0x70a
 	.4byte	0xe6fb
 	.4byte	.LLST125
 	.uleb128 0x46
 	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x709
+	.2byte	0x70b
 	.4byte	0xe117
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x70a
+	.2byte	0x70c
 	.4byte	0xc6
 	.uleb128 0x58
 	.4byte	0x13253
 	.8byte	.LBB1460
 	.4byte	.Ldebug_ranges0+0xa10
 	.byte	0x1
-	.2byte	0x70c
+	.2byte	0x70e
 	.4byte	0xe8fe
 	.uleb128 0x54
 	.4byte	0x1327c
@@ -36905,7 +36905,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1464
 	.8byte	.LBE1464-.LBB1464
 	.byte	0x1
-	.2byte	0x71e
+	.2byte	0x720
 	.4byte	0xe93d
 	.uleb128 0x54
 	.4byte	0x13140
@@ -36924,7 +36924,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1467
 	.8byte	.LBE1467-.LBB1467
 	.byte	0x1
-	.2byte	0x72f
+	.2byte	0x731
 	.4byte	0xe97d
 	.uleb128 0x54
 	.4byte	0x13163
@@ -36943,7 +36943,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1470
 	.4byte	.Ldebug_ranges0+0xa40
 	.byte	0x1
-	.2byte	0x73d
+	.2byte	0x73f
 	.4byte	0xf336
 	.uleb128 0x54
 	.4byte	0x11587
@@ -36956,7 +36956,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1472
 	.4byte	.Ldebug_ranges0+0xaa0
 	.byte	0x1
-	.2byte	0x471
+	.2byte	0x473
 	.4byte	0xea0d
 	.uleb128 0x54
 	.4byte	0x1319e
@@ -36993,7 +36993,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1484
 	.8byte	.LBE1484-.LBB1484
 	.byte	0x1
-	.2byte	0x474
+	.2byte	0x476
 	.4byte	0xea8a
 	.uleb128 0x54
 	.4byte	0x1319e
@@ -37031,7 +37031,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1487
 	.8byte	.LBE1487-.LBB1487
 	.byte	0x1
-	.2byte	0x477
+	.2byte	0x479
 	.4byte	0xeb07
 	.uleb128 0x54
 	.4byte	0x1319e
@@ -37069,7 +37069,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1490
 	.8byte	.LBE1490-.LBB1490
 	.byte	0x1
-	.2byte	0x47a
+	.2byte	0x47c
 	.4byte	0xeb84
 	.uleb128 0x54
 	.4byte	0x1319e
@@ -37107,7 +37107,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1493
 	.8byte	.LBE1493-.LBB1493
 	.byte	0x1
-	.2byte	0x47d
+	.2byte	0x47f
 	.4byte	0xec01
 	.uleb128 0x54
 	.4byte	0x1319e
@@ -37145,7 +37145,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1496
 	.8byte	.LBE1496-.LBB1496
 	.byte	0x1
-	.2byte	0x480
+	.2byte	0x482
 	.4byte	0xec7e
 	.uleb128 0x54
 	.4byte	0x1319e
@@ -37183,7 +37183,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1499
 	.8byte	.LBE1499-.LBB1499
 	.byte	0x1
-	.2byte	0x483
+	.2byte	0x485
 	.4byte	0xecfb
 	.uleb128 0x54
 	.4byte	0x1319e
@@ -37221,7 +37221,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1502
 	.8byte	.LBE1502-.LBB1502
 	.byte	0x1
-	.2byte	0x486
+	.2byte	0x488
 	.4byte	0xed78
 	.uleb128 0x54
 	.4byte	0x1319e
@@ -37259,7 +37259,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1505
 	.8byte	.LBE1505-.LBB1505
 	.byte	0x1
-	.2byte	0x489
+	.2byte	0x48b
 	.4byte	0xedf5
 	.uleb128 0x54
 	.4byte	0x1319e
@@ -37297,7 +37297,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1508
 	.8byte	.LBE1508-.LBB1508
 	.byte	0x1
-	.2byte	0x48c
+	.2byte	0x48e
 	.4byte	0xee72
 	.uleb128 0x54
 	.4byte	0x1319e
@@ -37335,7 +37335,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1511
 	.8byte	.LBE1511-.LBB1511
 	.byte	0x1
-	.2byte	0x48f
+	.2byte	0x491
 	.4byte	0xeeef
 	.uleb128 0x54
 	.4byte	0x1319e
@@ -37373,7 +37373,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1514
 	.8byte	.LBE1514-.LBB1514
 	.byte	0x1
-	.2byte	0x492
+	.2byte	0x494
 	.4byte	0xef6c
 	.uleb128 0x54
 	.4byte	0x1319e
@@ -37411,7 +37411,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1517
 	.8byte	.LBE1517-.LBB1517
 	.byte	0x1
-	.2byte	0x495
+	.2byte	0x497
 	.4byte	0xefe9
 	.uleb128 0x54
 	.4byte	0x1319e
@@ -37449,7 +37449,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1520
 	.8byte	.LBE1520-.LBB1520
 	.byte	0x1
-	.2byte	0x498
+	.2byte	0x49a
 	.4byte	0xf066
 	.uleb128 0x54
 	.4byte	0x1319e
@@ -37487,7 +37487,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1523
 	.8byte	.LBE1523-.LBB1523
 	.byte	0x1
-	.2byte	0x49b
+	.2byte	0x49d
 	.4byte	0xf0e3
 	.uleb128 0x54
 	.4byte	0x1319e
@@ -37525,7 +37525,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1526
 	.8byte	.LBE1526-.LBB1526
 	.byte	0x1
-	.2byte	0x49e
+	.2byte	0x4a0
 	.4byte	0xf160
 	.uleb128 0x54
 	.4byte	0x1319e
@@ -37563,7 +37563,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1529
 	.4byte	.Ldebug_ranges0+0xaf0
 	.byte	0x1
-	.2byte	0x4a1
+	.2byte	0x4a3
 	.4byte	0xf1d6
 	.uleb128 0x54
 	.4byte	0x1319e
@@ -37603,7 +37603,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1536
 	.4byte	.Ldebug_ranges0+0xb30
 	.byte	0x1
-	.2byte	0x4a4
+	.2byte	0x4a6
 	.4byte	0xf24c
 	.uleb128 0x54
 	.4byte	0x1319e
@@ -37643,7 +37643,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1543
 	.4byte	.Ldebug_ranges0+0xb70
 	.byte	0x1
-	.2byte	0x4a7
+	.2byte	0x4a9
 	.4byte	0xf2c2
 	.uleb128 0x54
 	.4byte	0x1319e
@@ -37683,7 +37683,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1550
 	.4byte	.Ldebug_ranges0+0xbb0
 	.byte	0x1
-	.2byte	0x4aa
+	.2byte	0x4ac
 	.uleb128 0x54
 	.4byte	0x1319e
 	.uleb128 0x54
@@ -37724,7 +37724,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1572
 	.4byte	.Ldebug_ranges0+0xbf0
 	.byte	0x1
-	.2byte	0x748
+	.2byte	0x74a
 	.4byte	0xf518
 	.uleb128 0x54
 	.4byte	0xfd4a
@@ -37755,7 +37755,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1574
 	.4byte	.Ldebug_ranges0+0xc60
 	.byte	0x1
-	.2byte	0x647
+	.2byte	0x649
 	.4byte	0xf3a6
 	.uleb128 0x54
 	.4byte	0x13299
@@ -37765,7 +37765,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1578
 	.4byte	.Ldebug_ranges0+0xc90
 	.byte	0x1
-	.2byte	0x662
+	.2byte	0x664
 	.4byte	0xf3db
 	.uleb128 0x54
 	.4byte	0x1327c
@@ -37782,7 +37782,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1586
 	.8byte	.LBE1586-.LBB1586
 	.byte	0x1
-	.2byte	0x665
+	.2byte	0x667
 	.4byte	0xf414
 	.uleb128 0x54
 	.4byte	0x1327c
@@ -37799,7 +37799,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1588
 	.8byte	.LBE1588-.LBB1588
 	.byte	0x1
-	.2byte	0x668
+	.2byte	0x66a
 	.4byte	0xf44d
 	.uleb128 0x54
 	.4byte	0x1327c
@@ -37816,7 +37816,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1590
 	.8byte	.LBE1590-.LBB1590
 	.byte	0x1
-	.2byte	0x66b
+	.2byte	0x66d
 	.4byte	0xf486
 	.uleb128 0x54
 	.4byte	0x1327c
@@ -37833,7 +37833,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1592
 	.4byte	.Ldebug_ranges0+0xce0
 	.byte	0x1
-	.2byte	0x670
+	.2byte	0x672
 	.4byte	0xf4bb
 	.uleb128 0x54
 	.4byte	0x1327c
@@ -37873,7 +37873,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1603
 	.4byte	.Ldebug_ranges0+0xd10
 	.byte	0x1
-	.2byte	0x74f
+	.2byte	0x751
 	.4byte	0xf5fe
 	.uleb128 0x54
 	.4byte	0xfdc4
@@ -37906,7 +37906,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1605
 	.8byte	.LBE1605-.LBB1605
 	.byte	0x1
-	.2byte	0x61a
+	.2byte	0x61c
 	.4byte	0xf594
 	.uleb128 0x54
 	.4byte	0x13299
@@ -37942,7 +37942,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1614
 	.4byte	.Ldebug_ranges0+0xd70
 	.byte	0x1
-	.2byte	0x756
+	.2byte	0x758
 	.4byte	0xf78b
 	.uleb128 0x54
 	.4byte	0xfd12
@@ -37958,7 +37958,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1616
 	.4byte	.Ldebug_ranges0+0xdb0
 	.byte	0x1
-	.2byte	0x67d
+	.2byte	0x67f
 	.4byte	0xf685
 	.uleb128 0x54
 	.4byte	0x1346b
@@ -37987,7 +37987,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1623
 	.8byte	.LBE1623-.LBB1623
 	.byte	0x1
-	.2byte	0x685
+	.2byte	0x687
 	.4byte	0xf6d0
 	.uleb128 0x54
 	.4byte	0x1353a
@@ -38022,7 +38022,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1627
 	.8byte	.LBE1627-.LBB1627
 	.byte	0x1
-	.2byte	0x68e
+	.2byte	0x690
 	.4byte	0xf748
 	.uleb128 0x54
 	.4byte	0x1353a
@@ -38061,7 +38061,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1631
 	.8byte	.LBE1631-.LBB1631
 	.byte	0x1
-	.2byte	0x75d
+	.2byte	0x75f
 	.4byte	0xf825
 	.uleb128 0x54
 	.4byte	0xfcf4
@@ -38070,7 +38070,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1633
 	.4byte	.Ldebug_ranges0+0xe10
 	.byte	0x1
-	.2byte	0x69e
+	.2byte	0x6a0
 	.4byte	0xf7f0
 	.uleb128 0x54
 	.4byte	0x12ede
@@ -38106,7 +38106,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1643
 	.4byte	.Ldebug_ranges0+0xe70
 	.byte	0x1
-	.2byte	0x760
+	.2byte	0x762
 	.4byte	0xfac8
 	.uleb128 0x54
 	.4byte	0xfc62
@@ -38147,7 +38147,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1645
 	.8byte	.LBE1645-.LBB1645
 	.byte	0x1
-	.2byte	0x6d6
+	.2byte	0x6d8
 	.4byte	0xf907
 	.uleb128 0x54
 	.4byte	0x1164b
@@ -38175,7 +38175,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1647
 	.8byte	.LBE1647-.LBB1647
 	.byte	0x1
-	.2byte	0x6ca
+	.2byte	0x6cc
 	.4byte	0xf95e
 	.uleb128 0x54
 	.4byte	0x13056
@@ -38201,7 +38201,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1650
 	.8byte	.LBE1650-.LBB1650
 	.byte	0x1
-	.2byte	0x6bc
+	.2byte	0x6be
 	.4byte	0xf9b5
 	.uleb128 0x54
 	.4byte	0x13056
@@ -38292,7 +38292,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1656
 	.8byte	.LBE1656-.LBB1656
 	.byte	0x1
-	.2byte	0x762
+	.2byte	0x764
 	.4byte	0xfb11
 	.uleb128 0x54
 	.4byte	0x13124
@@ -38315,7 +38315,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1659
 	.8byte	.LBE1659-.LBB1659
 	.byte	0x1
-	.2byte	0x765
+	.2byte	0x767
 	.4byte	0xfb8e
 	.uleb128 0x54
 	.4byte	0xfe4a
@@ -38387,202 +38387,202 @@ __exitcall_ebc_exit:
 	.uleb128 0x62
 	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0x6aa
+	.2byte	0x6ac
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfce7
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x6aa
+	.2byte	0x6ac
 	.4byte	0xe461
 	.uleb128 0x64
 	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x6aa
+	.2byte	0x6ac
 	.4byte	0xe117
 	.uleb128 0x46
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x6ac
+	.2byte	0x6ae
 	.4byte	0xe6fb
 	.uleb128 0x46
 	.4byte	.LASF3026
 	.byte	0x1
-	.2byte	0x6ad
+	.2byte	0x6af
 	.4byte	0x6d
 	.uleb128 0x46
 	.4byte	.LASF3027
 	.byte	0x1
-	.2byte	0x6ae
+	.2byte	0x6b0
 	.4byte	0x6d
 	.uleb128 0x46
 	.4byte	.LASF3028
 	.byte	0x1
-	.2byte	0x6af
+	.2byte	0x6b1
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3029
 	.byte	0x1
-	.2byte	0x6b0
+	.2byte	0x6b2
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0x6b1
+	.2byte	0x6b3
 	.4byte	0x219
 	.uleb128 0x46
 	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0x6b2
+	.2byte	0x6b4
 	.4byte	0x219
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x6b3
+	.2byte	0x6b5
 	.4byte	0xe3fc
 	.uleb128 0x46
 	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0x6b4
+	.2byte	0x6b6
 	.4byte	0x443
 	.uleb128 0x46
 	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0x6b5
+	.2byte	0x6b7
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x65
 	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x693
+	.2byte	0x695
 	.byte	0x1
 	.4byte	0xfd01
 	.uleb128 0x64
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x693
+	.2byte	0x695
 	.4byte	0xe6fb
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0x679
+	.2byte	0x67b
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfd39
 	.uleb128 0x64
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x679
+	.2byte	0x67b
 	.4byte	0xe6fb
 	.uleb128 0x46
 	.4byte	.LASF2463
 	.byte	0x1
-	.2byte	0x67b
+	.2byte	0x67d
 	.4byte	0xd7e9
 	.uleb128 0x66
 	.uleb128 0x52
 	.string	"__k"
 	.byte	0x1
-	.2byte	0x688
+	.2byte	0x68a
 	.4byte	0x2eda
 	.byte	0
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0x630
+	.2byte	0x632
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfdb3
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x630
+	.2byte	0x632
 	.4byte	0xe461
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x632
+	.2byte	0x634
 	.4byte	0xa545
 	.uleb128 0x46
 	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x633
+	.2byte	0x635
 	.4byte	0xe117
 	.uleb128 0x46
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x634
+	.2byte	0x636
 	.4byte	0xe6fb
 	.uleb128 0x46
 	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0x635
+	.2byte	0x637
 	.4byte	0xb869
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x636
+	.2byte	0x638
 	.4byte	0x9721
 	.uleb128 0x46
 	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0x637
+	.2byte	0x639
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x638
+	.2byte	0x63a
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x638
+	.2byte	0x63a
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0x607
+	.2byte	0x609
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfe24
 	.uleb128 0x64
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x607
+	.2byte	0x609
 	.4byte	0xe6fb
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x609
+	.2byte	0x60b
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x60a
+	.2byte	0x60c
 	.4byte	0xa545
 	.uleb128 0x46
 	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0x60b
+	.2byte	0x60d
 	.4byte	0xb869
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x60c
+	.2byte	0x60e
 	.4byte	0x9721
 	.uleb128 0x46
 	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0x60d
+	.2byte	0x60f
 	.4byte	0x29
 	.uleb128 0x46
 	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0x60e
+	.2byte	0x610
 	.4byte	0xc6
 	.uleb128 0x67
 	.4byte	.LASF3018
@@ -38601,20 +38601,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x62
 	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0x5f9
+	.2byte	0x5fb
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfe57
 	.uleb128 0x64
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x5f9
+	.2byte	0x5fb
 	.4byte	0xe6fb
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0x5f0
+	.2byte	0x5f2
 	.4byte	0x2d9
 	.8byte	.LFB2833
 	.8byte	.LFE2833-.LFB2833
@@ -38624,19 +38624,19 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5f0
+	.2byte	0x5f2
 	.4byte	0xa545
 	.4byte	.LLST75
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5f1
+	.2byte	0x5f3
 	.4byte	0xb3c0
 	.4byte	.LLST76
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5f2
+	.2byte	0x5f4
 	.4byte	0x219
 	.4byte	.LLST77
 	.uleb128 0x4e
@@ -38646,7 +38646,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0x5e7
+	.2byte	0x5e9
 	.4byte	0x2d9
 	.8byte	.LFB2832
 	.8byte	.LFE2832-.LFB2832
@@ -38656,19 +38656,19 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5e7
+	.2byte	0x5e9
 	.4byte	0xa545
 	.4byte	.LLST78
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5e8
+	.2byte	0x5ea
 	.4byte	0xb3c0
 	.4byte	.LLST79
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5e9
+	.2byte	0x5eb
 	.4byte	0x219
 	.4byte	.LLST80
 	.uleb128 0x4e
@@ -38678,7 +38678,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0x5cf
+	.2byte	0x5d1
 	.4byte	0x2d9
 	.8byte	.LFB2831
 	.8byte	.LFE2831-.LFB2831
@@ -38688,43 +38688,43 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5cf
+	.2byte	0x5d1
 	.4byte	0xa545
 	.4byte	.LLST90
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5d0
+	.2byte	0x5d2
 	.4byte	0xb3c0
 	.4byte	.LLST91
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5d1
+	.2byte	0x5d3
 	.4byte	0x56
 	.4byte	.LLST92
 	.uleb128 0x56
 	.4byte	.LASF380
 	.byte	0x1
-	.2byte	0x5d1
+	.2byte	0x5d3
 	.4byte	0x2ce
 	.4byte	.LLST93
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x5d3
+	.2byte	0x5d5
 	.4byte	0xe461
 	.4byte	.LLST94
 	.uleb128 0x57
 	.4byte	.LASF2453
 	.byte	0x1
-	.2byte	0x5d4
+	.2byte	0x5d6
 	.4byte	0xc6
 	.4byte	.LLST95
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x5d4
+	.2byte	0x5d6
 	.4byte	0xc6
 	.uleb128 0x4e
 	.8byte	.LVL300
@@ -38745,7 +38745,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x50
 	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0x5c3
+	.2byte	0x5c5
 	.4byte	0x2d9
 	.8byte	.LFB2830
 	.8byte	.LFE2830-.LFB2830
@@ -38755,37 +38755,37 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5c3
+	.2byte	0x5c5
 	.4byte	0xa545
 	.4byte	.LLST81
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5c4
+	.2byte	0x5c6
 	.4byte	0xb3c0
 	.4byte	.LLST82
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5c5
+	.2byte	0x5c7
 	.4byte	0x219
 	.4byte	.LLST83
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x5c7
+	.2byte	0x5c9
 	.4byte	0xe461
 	.uleb128 0x46
 	.4byte	.LASF2453
 	.byte	0x1
-	.2byte	0x5c8
+	.2byte	0x5ca
 	.4byte	0xc6
 	.uleb128 0x53
 	.4byte	0x12de5
 	.8byte	.LBB1206
 	.8byte	.LBE1206-.LBB1206
 	.byte	0x1
-	.2byte	0x5ca
+	.2byte	0x5cc
 	.4byte	0x10073
 	.uleb128 0x54
 	.4byte	0x12df5
@@ -38797,7 +38797,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x50
 	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0x5b5
+	.2byte	0x5b7
 	.4byte	0x2d9
 	.8byte	.LFB2829
 	.8byte	.LFE2829-.LFB2829
@@ -38807,30 +38807,30 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5b5
+	.2byte	0x5b7
 	.4byte	0xa545
 	.4byte	.LLST84
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5b6
+	.2byte	0x5b8
 	.4byte	0xb3c0
 	.4byte	.LLST85
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5b7
+	.2byte	0x5b9
 	.4byte	0x219
 	.4byte	.LLST86
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x5b9
+	.2byte	0x5bb
 	.4byte	0xe461
 	.uleb128 0x69
 	.string	"t"
 	.byte	0x1
-	.2byte	0x5ba
+	.2byte	0x5bc
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
@@ -38840,7 +38840,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1208
 	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
-	.2byte	0x5bc
+	.2byte	0x5be
 	.4byte	0x1010f
 	.uleb128 0x54
 	.4byte	0x12e1c
@@ -38857,7 +38857,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3048
 	.byte	0x1
-	.2byte	0x5aa
+	.2byte	0x5ac
 	.4byte	0x2d9
 	.8byte	.LFB2828
 	.8byte	.LFE2828-.LFB2828
@@ -38867,25 +38867,25 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5aa
+	.2byte	0x5ac
 	.4byte	0xa545
 	.4byte	.LLST87
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5ab
+	.2byte	0x5ad
 	.4byte	0xb3c0
 	.4byte	.LLST88
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5ac
+	.2byte	0x5ae
 	.4byte	0x219
 	.4byte	.LLST89
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x5ae
+	.2byte	0x5b0
 	.4byte	0xe461
 	.uleb128 0x4e
 	.8byte	.LVL294
@@ -38894,7 +38894,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0x59f
+	.2byte	0x5a1
 	.4byte	0x2d9
 	.8byte	.LFB2827
 	.8byte	.LFE2827-.LFB2827
@@ -38904,25 +38904,25 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x59f
+	.2byte	0x5a1
 	.4byte	0xa545
 	.4byte	.LLST96
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5a0
+	.2byte	0x5a2
 	.4byte	0xb3c0
 	.4byte	.LLST97
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5a1
+	.2byte	0x5a3
 	.4byte	0x219
 	.4byte	.LLST98
 	.uleb128 0x46
 	.4byte	.LASF3050
 	.byte	0x1
-	.2byte	0x5a3
+	.2byte	0x5a5
 	.4byte	0x56
 	.uleb128 0x4e
 	.8byte	.LVL313
@@ -38934,7 +38934,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0x588
+	.2byte	0x58a
 	.4byte	0xc6
 	.8byte	.LFB2826
 	.8byte	.LFE2826-.LFB2826
@@ -38944,13 +38944,13 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF415
 	.byte	0x1
-	.2byte	0x588
+	.2byte	0x58a
 	.4byte	0x1c54
 	.4byte	.LLST10
 	.uleb128 0x6a
 	.4byte	.LASF1270
 	.byte	0x1
-	.2byte	0x588
+	.2byte	0x58a
 	.4byte	0x5531
 	.uleb128 0x1
 	.byte	0x51
@@ -38958,7 +38958,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0x579
+	.2byte	0x57b
 	.4byte	0xc6
 	.8byte	.LFB2825
 	.8byte	.LFE2825-.LFB2825
@@ -38968,19 +38968,19 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF1270
 	.byte	0x1
-	.2byte	0x579
+	.2byte	0x57b
 	.4byte	0x5531
 	.4byte	.LLST14
 	.uleb128 0x51
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x579
+	.2byte	0x57b
 	.4byte	0x3c8a
 	.4byte	.LLST15
 	.uleb128 0x46
 	.4byte	.LASF881
 	.byte	0x1
-	.2byte	0x57b
+	.2byte	0x57d
 	.4byte	0x29
 	.uleb128 0x4e
 	.8byte	.LVL44
@@ -38992,7 +38992,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0x4b0
+	.2byte	0x4b2
 	.4byte	0x194
 	.8byte	.LFB2824
 	.8byte	.LFE2824-.LFB2824
@@ -39002,40 +39002,40 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF1270
 	.byte	0x1
-	.2byte	0x4b0
+	.2byte	0x4b2
 	.4byte	0x5531
 	.4byte	.LLST16
 	.uleb128 0x51
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0x4b0
+	.2byte	0x4b2
 	.4byte	0x6d
 	.4byte	.LLST17
 	.uleb128 0x51
 	.string	"arg"
 	.byte	0x1
-	.2byte	0x4b0
+	.2byte	0x4b2
 	.4byte	0x29
 	.4byte	.LLST18
 	.uleb128 0x46
 	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0x4b2
+	.2byte	0x4b4
 	.4byte	0x443
 	.uleb128 0x46
 	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x4b3
+	.2byte	0x4b5
 	.4byte	0xe117
 	.uleb128 0x46
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x4b4
+	.2byte	0x4b6
 	.4byte	0xe6fb
 	.uleb128 0x4c
 	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0x4b5
+	.2byte	0x4b7
 	.4byte	0xd9bd
 	.uleb128 0x2
 	.byte	0x91
@@ -39043,48 +39043,48 @@ __exitcall_ebc_exit:
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x4b6
+	.2byte	0x4b8
 	.4byte	0xe3fc
 	.uleb128 0x46
 	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0x4b7
+	.2byte	0x4b9
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0x4b8
+	.2byte	0x4ba
 	.4byte	0x29
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x4b9
+	.2byte	0x4bb
 	.4byte	0xc6
 	.uleb128 0x55
 	.4byte	.LASF3018
 	.4byte	0x11571
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.34835
+	.8byte	__func__.34837
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x1d0
 	.4byte	0x10423
 	.uleb128 0x46
 	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x503
+	.2byte	0x505
 	.4byte	0xc6
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0x1d0
 	.uleb128 0x6b
 	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0x503
+	.2byte	0x505
 	.8byte	.L134
 	.uleb128 0x4c
 	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x503
+	.2byte	0x505
 	.4byte	0x14fd
 	.uleb128 0x3
 	.byte	0x91
@@ -39092,7 +39092,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x503
+	.2byte	0x505
 	.4byte	0x194
 	.uleb128 0x6c
 	.8byte	.LBB998
@@ -39101,7 +39101,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x57
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x503
+	.2byte	0x505
 	.4byte	0x194
 	.4byte	.LLST33
 	.uleb128 0x4e
@@ -39124,7 +39124,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB934
 	.4byte	.Ldebug_ranges0+0x60
 	.byte	0x1
-	.2byte	0x56b
+	.2byte	0x56d
 	.4byte	0x10643
 	.uleb128 0x54
 	.4byte	0x12f19
@@ -39292,7 +39292,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB967
 	.4byte	.Ldebug_ranges0+0x120
 	.byte	0x1
-	.2byte	0x4ee
+	.2byte	0x4f0
 	.4byte	0x1086e
 	.uleb128 0x54
 	.4byte	0x12f48
@@ -39465,7 +39465,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1002
 	.4byte	.Ldebug_ranges0+0x220
 	.byte	0x1
-	.2byte	0x50a
+	.2byte	0x50c
 	.4byte	0x10a99
 	.uleb128 0x54
 	.4byte	0x12f48
@@ -39638,7 +39638,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1032
 	.4byte	.Ldebug_ranges0+0x2d0
 	.byte	0x1
-	.2byte	0x4d8
+	.2byte	0x4da
 	.4byte	0x10cb9
 	.uleb128 0x54
 	.4byte	0x12f19
@@ -39806,7 +39806,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1066
 	.4byte	.Ldebug_ranges0+0x3a0
 	.byte	0x1
-	.2byte	0x527
+	.2byte	0x529
 	.4byte	0x10ef5
 	.uleb128 0x54
 	.4byte	0x12f48
@@ -39983,7 +39983,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1102
 	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x1
-	.2byte	0x544
+	.2byte	0x546
 	.4byte	0x10fa7
 	.uleb128 0x54
 	.4byte	0x12f19
@@ -40045,7 +40045,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1114
 	.4byte	.Ldebug_ranges0+0x510
 	.byte	0x1
-	.2byte	0x534
+	.2byte	0x536
 	.4byte	0x111c7
 	.uleb128 0x54
 	.4byte	0x12f19
@@ -40213,7 +40213,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1150
 	.4byte	.Ldebug_ranges0+0x5f0
 	.byte	0x1
-	.2byte	0x4e6
+	.2byte	0x4e8
 	.4byte	0x113e7
 	.uleb128 0x54
 	.4byte	0x12f19
@@ -40476,25 +40476,25 @@ __exitcall_ebc_exit:
 	.uleb128 0x62
 	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0x46d
+	.2byte	0x46f
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x115a0
 	.uleb128 0x64
 	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x46d
+	.2byte	0x46f
 	.4byte	0xe117
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x46f
+	.2byte	0x471
 	.4byte	0xa545
 	.byte	0
 	.uleb128 0x4d
 	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0x467
+	.2byte	0x469
 	.8byte	.LFB2822
 	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
@@ -40503,7 +40503,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x467
+	.2byte	0x469
 	.4byte	0x31a7
 	.4byte	.LLST72
 	.uleb128 0x4e
@@ -40513,7 +40513,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0x45b
+	.2byte	0x45d
 	.8byte	.LFB2821
 	.8byte	.LFE2821-.LFB2821
 	.uleb128 0x1
@@ -40522,20 +40522,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
-	.2byte	0x45b
+	.2byte	0x45d
 	.4byte	0x31a7
 	.4byte	.LLST12
 	.uleb128 0x46
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x45d
+	.2byte	0x45f
 	.4byte	0xe6fb
 	.uleb128 0x5d
 	.4byte	0x12e86
 	.8byte	.LBB930
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
-	.2byte	0x461
+	.2byte	0x463
 	.uleb128 0x54
 	.4byte	0x12e92
 	.uleb128 0x4e
@@ -40546,25 +40546,25 @@ __exitcall_ebc_exit:
 	.uleb128 0x62
 	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0x44b
+	.2byte	0x44d
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x11664
 	.uleb128 0x64
 	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x44b
+	.2byte	0x44d
 	.4byte	0xe117
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x44d
+	.2byte	0x44f
 	.4byte	0xe3fc
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3066
 	.byte	0x1
-	.2byte	0x317
+	.2byte	0x319
 	.4byte	0xc6
 	.8byte	.LFB2819
 	.8byte	.LFE2819-.LFB2819
@@ -40574,47 +40574,47 @@ __exitcall_ebc_exit:
 	.uleb128 0x51
 	.string	"ptr"
 	.byte	0x1
-	.2byte	0x317
+	.2byte	0x319
 	.4byte	0x443
 	.4byte	.LLST154
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x319
+	.2byte	0x31b
 	.4byte	0xe461
 	.4byte	.LLST155
 	.uleb128 0x46
 	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x31a
+	.2byte	0x31c
 	.4byte	0xe117
 	.uleb128 0x46
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x31b
+	.2byte	0x31d
 	.4byte	0xe6fb
 	.uleb128 0x68
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x31c
+	.2byte	0x31e
 	.4byte	0xe3fc
 	.4byte	.LLST156
 	.uleb128 0x57
 	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0x31d
+	.2byte	0x31f
 	.4byte	0xc6
 	.4byte	.LLST157
 	.uleb128 0x57
 	.4byte	.LASF2963
 	.byte	0x1
-	.2byte	0x31e
+	.2byte	0x320
 	.4byte	0xc6
 	.4byte	.LLST158
 	.uleb128 0x4c
 	.4byte	.LASF3068
 	.byte	0x1
-	.2byte	0x31f
+	.2byte	0x321
 	.4byte	0xd8bb
 	.uleb128 0x3
 	.byte	0x91
@@ -40622,13 +40622,13 @@ __exitcall_ebc_exit:
 	.uleb128 0x57
 	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0x320
+	.2byte	0x322
 	.4byte	0xe3fc
 	.4byte	.LLST159
 	.uleb128 0x6b
 	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0x41b
+	.2byte	0x41d
 	.8byte	.L625
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x1040
@@ -40636,7 +40636,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x35e
+	.2byte	0x360
 	.4byte	0xc6
 	.uleb128 0x5e
 	.8byte	.LBB1741
@@ -40644,12 +40644,12 @@ __exitcall_ebc_exit:
 	.uleb128 0x6b
 	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0x35e
+	.2byte	0x360
 	.8byte	.L608
 	.uleb128 0x4c
 	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x35e
+	.2byte	0x360
 	.4byte	0x14fd
 	.uleb128 0x3
 	.byte	0x91
@@ -40657,7 +40657,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x35e
+	.2byte	0x360
 	.4byte	0x194
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x1070
@@ -40665,7 +40665,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x57
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x35e
+	.2byte	0x360
 	.4byte	0x194
 	.4byte	.LLST172
 	.uleb128 0x4e
@@ -40689,7 +40689,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x40a
+	.2byte	0x40c
 	.4byte	0xc6
 	.uleb128 0x5e
 	.8byte	.LBB1731
@@ -40697,12 +40697,12 @@ __exitcall_ebc_exit:
 	.uleb128 0x6b
 	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0x40a
+	.2byte	0x40c
 	.8byte	.L652
 	.uleb128 0x4c
 	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x40a
+	.2byte	0x40c
 	.4byte	0x14fd
 	.uleb128 0x3
 	.byte	0x91
@@ -40710,7 +40710,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x40a
+	.2byte	0x40c
 	.4byte	0x194
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x1000
@@ -40718,7 +40718,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x57
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x40a
+	.2byte	0x40c
 	.4byte	0x194
 	.4byte	.LLST170
 	.uleb128 0x4e
@@ -40743,7 +40743,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x437
+	.2byte	0x439
 	.4byte	0xc6
 	.uleb128 0x5e
 	.8byte	.LBB1718
@@ -40751,11 +40751,11 @@ __exitcall_ebc_exit:
 	.uleb128 0x72
 	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0x437
+	.2byte	0x439
 	.uleb128 0x4c
 	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x437
+	.2byte	0x439
 	.4byte	0x14fd
 	.uleb128 0x3
 	.byte	0x91
@@ -40763,7 +40763,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x437
+	.2byte	0x439
 	.4byte	0x194
 	.uleb128 0x6c
 	.8byte	.LBB1719
@@ -40772,7 +40772,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x57
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x437
+	.2byte	0x439
 	.4byte	0x194
 	.4byte	.LLST161
 	.uleb128 0x4e
@@ -40796,19 +40796,19 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x443
+	.2byte	0x445
 	.4byte	0xc6
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0xef0
 	.uleb128 0x6b
 	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0x443
+	.2byte	0x445
 	.8byte	.L668
 	.uleb128 0x4c
 	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0x443
+	.2byte	0x445
 	.4byte	0x14fd
 	.uleb128 0x3
 	.byte	0x91
@@ -40816,7 +40816,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0x443
+	.2byte	0x445
 	.4byte	0x194
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0xf30
@@ -40824,7 +40824,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x57
 	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0x443
+	.2byte	0x445
 	.4byte	0x194
 	.4byte	.LLST160
 	.uleb128 0x4e
@@ -40847,7 +40847,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1720
 	.4byte	.Ldebug_ranges0+0xf70
 	.byte	0x1
-	.2byte	0x37b
+	.2byte	0x37d
 	.4byte	0x11a59
 	.uleb128 0x54
 	.4byte	0x12961
@@ -40912,7 +40912,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1735
 	.8byte	.LBE1735-.LBB1735
 	.byte	0x1
-	.2byte	0x3f7
+	.2byte	0x3f9
 	.4byte	0x11aa4
 	.uleb128 0x54
 	.4byte	0x12ba7
@@ -40933,7 +40933,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1737
 	.8byte	.LBE1737-.LBB1737
 	.byte	0x1
-	.2byte	0x3d9
+	.2byte	0x3db
 	.4byte	0x11b2a
 	.uleb128 0x54
 	.4byte	0x11ebf
@@ -40976,7 +40976,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1746
 	.8byte	.LBE1746-.LBB1746
 	.byte	0x1
-	.2byte	0x3a6
+	.2byte	0x3a8
 	.4byte	0x11b75
 	.uleb128 0x54
 	.4byte	0x12ba7
@@ -40997,7 +40997,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1748
 	.8byte	.LBE1748-.LBB1748
 	.byte	0x1
-	.2byte	0x383
+	.2byte	0x385
 	.4byte	0x11bc0
 	.uleb128 0x54
 	.4byte	0x12ba7
@@ -41018,7 +41018,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1750
 	.8byte	.LBE1750-.LBB1750
 	.byte	0x1
-	.2byte	0x34e
+	.2byte	0x350
 	.4byte	0x11c0b
 	.uleb128 0x54
 	.4byte	0x12ba7
@@ -41188,81 +41188,81 @@ __exitcall_ebc_exit:
 	.uleb128 0x62
 	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0x2f5
+	.2byte	0x2f7
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0x11f40
 	.uleb128 0x64
 	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0x2f5
+	.2byte	0x2f7
 	.4byte	0x4653
 	.uleb128 0x64
 	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x2f5
+	.2byte	0x2f7
 	.4byte	0x4653
 	.uleb128 0x64
 	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x2f5
+	.2byte	0x2f7
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x2f7
+	.2byte	0x2f9
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0x2f8
+	.2byte	0x2fa
 	.4byte	0x155
 	.uleb128 0x46
 	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x2f8
+	.2byte	0x2fa
 	.4byte	0x155
 	.uleb128 0x46
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0x2f9
+	.2byte	0x2fb
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0x2fa
+	.2byte	0x2fc
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0x2fb
+	.2byte	0x2fd
 	.4byte	0x4659
 	.uleb128 0x46
 	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0x2fc
+	.2byte	0x2fe
 	.4byte	0x4659
 	.uleb128 0x72
 	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0x313
+	.2byte	0x315
 	.uleb128 0x66
 	.uleb128 0x46
 	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0x30b
+	.2byte	0x30d
 	.4byte	0x10b
 	.uleb128 0x46
 	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0x30b
+	.2byte	0x30d
 	.4byte	0x10b
 	.byte	0
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3085
 	.byte	0x1
-	.2byte	0x2a1
+	.2byte	0x2a3
 	.4byte	0xc6
 	.8byte	.LFB2817
 	.8byte	.LFE2817-.LFB2817
@@ -41272,24 +41272,24 @@ __exitcall_ebc_exit:
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x2a1
+	.2byte	0x2a3
 	.4byte	0xe461
 	.4byte	.LLST73
 	.uleb128 0x46
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x2a3
+	.2byte	0x2a5
 	.4byte	0xe6fb
 	.uleb128 0x57
 	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0x2a4
+	.2byte	0x2a6
 	.4byte	0xc6
 	.4byte	.LLST74
 	.uleb128 0x69
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x2a5
+	.2byte	0x2a7
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x64
@@ -41298,7 +41298,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1204
 	.8byte	.LBE1204-.LBB1204
 	.byte	0x1
-	.2byte	0x2a8
+	.2byte	0x2aa
 	.4byte	0x11fc3
 	.uleb128 0x54
 	.4byte	0x12e1c
@@ -41354,7 +41354,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3087
 	.byte	0x1
-	.2byte	0x27c
+	.2byte	0x27e
 	.8byte	.LFB2816
 	.8byte	.LFE2816-.LFB2816
 	.uleb128 0x1
@@ -41363,12 +41363,12 @@ __exitcall_ebc_exit:
 	.uleb128 0x46
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x27e
+	.2byte	0x280
 	.4byte	0xe6fb
 	.uleb128 0x46
 	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x27f
+	.2byte	0x281
 	.4byte	0xe117
 	.uleb128 0x4e
 	.8byte	.LVL229
@@ -41404,7 +41404,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3088
 	.byte	0x1
-	.2byte	0x239
+	.2byte	0x23a
 	.4byte	0xc6
 	.8byte	.LFB2815
 	.8byte	.LFE2815-.LFB2815
@@ -41414,25 +41414,25 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF791
 	.byte	0x1
-	.2byte	0x239
+	.2byte	0x23a
 	.4byte	0x443
 	.4byte	.LLST119
 	.uleb128 0x69
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x23b
+	.2byte	0x23c
 	.4byte	0xe461
 	.uleb128 0x1
 	.byte	0x66
 	.uleb128 0x46
 	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x23c
+	.2byte	0x23d
 	.4byte	0xe117
 	.uleb128 0x46
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x23d
+	.2byte	0x23e
 	.4byte	0xe6fb
 	.uleb128 0x61
 	.4byte	.Ldebug_ranges0+0x970
@@ -41440,30 +41440,30 @@ __exitcall_ebc_exit:
 	.uleb128 0x3f
 	.byte	0x8
 	.byte	0x1
-	.2byte	0x244
+	.2byte	0x245
 	.4byte	0x121c3
 	.uleb128 0x41
 	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x244
+	.2byte	0x245
 	.4byte	0x19b
 	.uleb128 0x3d
 	.string	"__c"
 	.byte	0x1
-	.2byte	0x244
+	.2byte	0x245
 	.4byte	0x1230c
 	.byte	0
 	.uleb128 0x52
 	.string	"__u"
 	.byte	0x1
-	.2byte	0x244
+	.2byte	0x245
 	.4byte	0x121a1
 	.uleb128 0x58
 	.4byte	0x135e3
 	.8byte	.LBB1293
 	.4byte	.Ldebug_ranges0+0x9b0
 	.byte	0x1
-	.2byte	0x244
+	.2byte	0x245
 	.4byte	0x121f7
 	.uleb128 0x54
 	.4byte	0x13603
@@ -41477,7 +41477,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1296
 	.8byte	.LBE1296-.LBB1296
 	.byte	0x1
-	.2byte	0x244
+	.2byte	0x245
 	.uleb128 0x5e
 	.8byte	.LBB1297
 	.8byte	.LBE1297-.LBB1297
@@ -41493,7 +41493,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1301
 	.8byte	.LBE1301-.LBB1301
 	.byte	0x1
-	.2byte	0x273
+	.2byte	0x275
 	.4byte	0x1227c
 	.uleb128 0x54
 	.4byte	0x132ee
@@ -41604,7 +41604,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1286
 	.8byte	.LBE1286-.LBB1286
 	.byte	0x1
-	.2byte	0x220
+	.2byte	0x221
 	.4byte	0x123dd
 	.uleb128 0x54
 	.4byte	0x124d4
@@ -41634,7 +41634,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1290
 	.8byte	.LBE1290-.LBB1290
 	.byte	0x1
-	.2byte	0x22d
+	.2byte	0x22e
 	.4byte	0x12445
 	.uleb128 0x54
 	.4byte	0x124d4
@@ -51964,6 +51964,8 @@ __exitcall_ebc_exit:
 	.string	"i_security"
 .LASF2642:
 	.string	"PGSCAN_SKIP_NORMAL"
+.LASF3012:
+	.string	"__addressable_ebc_init1969"
 .LASF2914:
 	.string	"nents"
 .LASF754:
@@ -53272,8 +53274,6 @@ __exitcall_ebc_exit:
 	.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"
-.LASF3012:
-	.string	"__addressable_ebc_init1967"
 .LASF2618:
 	.string	"sysctl_overcommit_memory"
 .LASF2533:

commit 696b4dffd4dbac7f913d2f8ccbcd68d559e8f3bf
Author: Zhenke Fan <fanzy.fan@rock-chips.com>
Date:   Thu May 20 16:06:29 2021 +0800

    media: i2c: ov4688: add 16x dgain, ratio = dgain/2048
    
    Signed-off-by: Zhenke Fan <fanzy.fan@rock-chips.com>
    Change-Id: Ib6b61843e0577b265f03fb0b7846573218f62046

diff --git a/drivers/media/i2c/ov4688.c b/drivers/media/i2c/ov4688.c
index b41bcaf8d5ef..c069bd749718 100644
--- a/drivers/media/i2c/ov4688.c
+++ b/drivers/media/i2c/ov4688.c
@@ -61,11 +61,13 @@
 
 #define OV4688_REG_GAIN_H		0x3508
 #define OV4688_REG_GAIN_L		0x3509
+#define OV4688_REG_DGAIN_H		0x352A
+#define OV4688_REG_DGAIN_L		0x352B
 #define OV4688_GAIN_H_MASK		0x07
 #define OV4688_GAIN_H_SHIFT		8
 #define OV4688_GAIN_L_MASK		0xff
 #define OV4688_GAIN_MIN			0x80
-#define OV4688_GAIN_MAX			0x7f8
+#define OV4688_GAIN_MAX			0x87f8
 #define OV4688_GAIN_STEP		1
 #define OV4688_GAIN_DEFAULT		0x80
 
@@ -1101,8 +1103,11 @@ static long ov4688_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = ov4688_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:
@@ -1113,8 +1118,11 @@ static long ov4688_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = copy_from_user(cfg, up, sizeof(*cfg));
-		if (!ret)
-			ret = ov4688_ioctl(sd, cmd, cfg);
+		if (ret) {
+			kfree(cfg);
+			return -EFAULT;
+		}
+		ret = ov4688_ioctl(sd, cmd, cfg);
 		kfree(cfg);
 		break;
 	case RKMODULE_GET_HDR_CFG:
@@ -1125,8 +1133,11 @@ static long ov4688_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = ov4688_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:
@@ -1137,14 +1148,18 @@ static long ov4688_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = copy_from_user(hdr, up, sizeof(*hdr));
-		if (!ret)
-			ret = ov4688_ioctl(sd, cmd, hdr);
+		if (ret) {
+			kfree(hdr);
+			return -EFAULT;
+		}
+		ret = ov4688_ioctl(sd, cmd, hdr);
 		kfree(hdr);
 		break;
 	case RKMODULE_SET_QUICK_STREAM:
 		ret = copy_from_user(&stream, up, sizeof(u32));
-		if (!ret)
-			ret = ov4688_ioctl(sd, cmd, &stream);
+		if (ret)
+			return -EFAULT;
+		ret = ov4688_ioctl(sd, cmd, &stream);
 		break;
 	case PREISP_CMD_SET_HDRAE_EXP:
 		hdrae = kzalloc(sizeof(*hdrae), GFP_KERNEL);
@@ -1154,8 +1169,11 @@ static long ov4688_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = copy_from_user(hdrae, up, sizeof(*hdrae));
-		if (!ret)
-			ret = ov4688_ioctl(sd, cmd, hdrae);
+		if (ret) {
+			kfree(hdrae);
+			return -EFAULT;
+		}
+		ret = ov4688_ioctl(sd, cmd, hdrae);
 		kfree(hdrae);
 		break;
 	default:
@@ -1488,6 +1506,8 @@ static int ov4688_set_ctrl(struct v4l2_ctrl *ctrl)
 	s64 max;
 	int ret = 0;
 	u32 val = 0;
+	u32 again = 0;
+	u32 dgain = 0;
 
 	/* Propagate change of current control to all related controls */
 	switch (ctrl->id) {
@@ -1511,12 +1531,27 @@ static int ov4688_set_ctrl(struct v4l2_ctrl *ctrl)
 				       OV4688_REG_VALUE_24BIT, ctrl->val << 4);
 		break;
 	case V4L2_CID_ANALOGUE_GAIN:
+		if (ctrl->val > 2040) {
+			again = 2040;
+			dgain = ctrl->val - 2040;
+			if (dgain == 0x8000)
+				dgain = 0x7fff;
+		} else {
+			again = ctrl->val;
+			dgain = 2048;
+		}
 		ret = ov4688_write_reg(ov4688->client, OV4688_REG_GAIN_H,
 				       OV4688_REG_VALUE_08BIT,
-				       (ctrl->val >> OV4688_GAIN_H_SHIFT) & OV4688_GAIN_H_MASK);
+				       (again >> OV4688_GAIN_H_SHIFT) & OV4688_GAIN_H_MASK);
 		ret |= ov4688_write_reg(ov4688->client, OV4688_REG_GAIN_L,
 				       OV4688_REG_VALUE_08BIT,
-				       ctrl->val & OV4688_GAIN_L_MASK);
+				       again & OV4688_GAIN_L_MASK);
+		ret |= ov4688_write_reg(ov4688->client, OV4688_REG_DGAIN_H,
+				       OV4688_REG_VALUE_08BIT,
+				       (dgain >> 8) & 0x7f);
+		ret |= ov4688_write_reg(ov4688->client, OV4688_REG_DGAIN_L,
+				       OV4688_REG_VALUE_08BIT,
+				       dgain & 0xff);
 		break;
 	case V4L2_CID_VBLANK:
 		ret = ov4688_write_reg(ov4688->client, OV4688_REG_VTS,

commit d2acc3d9d9b53e36061131f781fc124025a41adf
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Tue May 18 11:08:10 2021 +0800

    media: i2c: imx258 support capture spd data and embedded data
    
    usage:
    csi has 4 available channels, generally id0->vc0, id1->vc1, id2->vc2, id3->vc3.
    A channel can only takes one data type. When you need to collect spd data or embedded data,
    you can use an idle channel and change its vc to be consistent with active data.
    
    dts configuration:
    imx258: imx258@10 {
            rockchip,spd-id = <3>;//use id3 to capture spd data
            rockchip,ebd-id = <2>;//use id2 to capture embedded data
    };
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I89a0f9472bbe475c9da368b09eaad0cd00fc69c6

diff --git a/drivers/media/i2c/imx258.c b/drivers/media/i2c/imx258.c
index 25aa65e8f360..60a1f0746a31 100644
--- a/drivers/media/i2c/imx258.c
+++ b/drivers/media/i2c/imx258.c
@@ -9,6 +9,7 @@
  * V0.0X01.0X03 add enum_frame_interval function.
  * V0.0X01.0X04 add quick stream on/off
  * V0.0X01.0X05 add function g_mbus_config
+ * V0.0X01.0X06 support capture spd data and embedded data
  */
 
 #include <linux/clk.h>
@@ -29,7 +30,7 @@
 #include <linux/pinctrl/consumer.h>
 #include "imx258_eeprom_head.h"
 
-#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x05)
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x06)
 
 #ifndef V4L2_CID_DIGITAL_GAIN
 #define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
@@ -88,12 +89,27 @@ static const char * const imx258_supply_names[] = {
 
 #define IMX258_NUM_SUPPLIES ARRAY_SIZE(imx258_supply_names)
 
+enum imx258_max_pad {
+	PAD0,
+	PAD1,
+	PAD2,
+	PAD3,
+	PAD_MAX,
+};
+
 struct regval {
 	u16 addr;
 	u8 val;
 };
 
+struct other_data {
+	u32 width;
+	u32 height;
+	u32 bus_fmt;
+};
+
 struct imx258_mode {
+	u32 bus_fmt;
 	u32 width;
 	u32 height;
 	struct v4l2_fract max_fps;
@@ -101,6 +117,12 @@ struct imx258_mode {
 	u32 vts_def;
 	u32 exp_def;
 	const struct regval *reg_list;
+	/* Shield Pix Data */
+	const struct other_data *spd;
+	/* embedded Data */
+	const struct other_data *ebd;
+	u32 hdr_mode;
+	u32 vc[PAD_MAX];
 };
 
 struct imx258 {
@@ -127,6 +149,7 @@ struct imx258 {
 	bool			streaming;
 	bool			power_on;
 	const struct imx258_mode *cur_mode;
+	u32			cfg_num;
 	u32			module_index;
 	const char		*module_facing;
 	const char		*module_name;
@@ -137,6 +160,8 @@ struct imx258 {
 	struct rkmodule_inf	module_inf;
 	struct rkmodule_awb_cfg	awb_cfg;
 	struct rkmodule_lsc_cfg	lsc_cfg;
+	u32 spd_id;
+	u32 ebd_id;
 };
 
 #define to_imx258(sd) container_of(sd, struct imx258, subdev)
@@ -444,6 +469,8 @@ static const struct regval imx258_global_regs[] = {
 	{0x040f, 0x30},
 	{0x3038, 0x00},
 	{0x303a, 0x00},
+	{0x303b, 0x10},
+	{0x300d, 0x00},
 	{0x034c, 0x10},
 	{0x034d, 0x70},
 	{0x034e, 0x0c},
@@ -475,6 +502,7 @@ static const struct regval imx258_global_regs[] = {
 	{0x951b, 0x50},
 	{0x3030, 0x00},
 	{0x3032, 0x00},
+	{0x0220, 0x00},
 	{0x0100, 0x00},
 	{REG_NULL, 0x00},
 };
@@ -621,8 +649,36 @@ static const struct regval imx258_4208x3120_regs[] = {
 	{REG_NULL, 0x00},
 };
 
+static const struct regval imx258_4208_3120_spd_reg[] = {
+	{0x3030, 0x01},//shield output size:80x1920
+	{0x3032, 0x01},//shield BYTE2
+#ifdef SPD_DEBUG
+	/*DEBUG mode,spd data output with active pixel*/
+	{0x7bcd, 0x00},
+	{0x0b00, 0x00},
+	{0x3051, 0x00},
+	{0x3052, 0x00},
+	{0x7bca, 0x00},
+	{0x7bcb, 0x00},
+	{0x7bc8, 0x00},
+#endif
+};
+
+static const struct other_data imx258_full_spd = {
+	.width = 80,
+	.height = 1920,
+	.bus_fmt = MEDIA_BUS_FMT_SPD_2X8,
+};
+
+static const struct other_data imx258_full_ebd = {
+	.width = 320,
+	.height = 2,
+	.bus_fmt = MEDIA_BUS_FMT_EBD_1X8,
+};
+
 static const struct imx258_mode supported_modes[] = {
 	{
+		.bus_fmt = MEDIA_BUS_FMT_SBGGR10_1X10,
 		.width = 4208,
 		.height = 3120,
 		.max_fps = {
@@ -633,8 +689,13 @@ static const struct imx258_mode supported_modes[] = {
 		.hts_def = 0x14E8,
 		.vts_def = 0x0E88,
 		.reg_list = imx258_4208x3120_regs,
+		.spd = &imx258_full_spd,
+		.ebd = &imx258_full_ebd,
+		.hdr_mode = NO_HDR,
+		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0,
 	},
 	{
+		.bus_fmt = MEDIA_BUS_FMT_SBGGR10_1X10,
 		.width = 2096,
 		.height = 1560,
 		.max_fps = {
@@ -645,6 +706,10 @@ static const struct imx258_mode supported_modes[] = {
 		.hts_def = 0x14E8,
 		.vts_def = 0x07C4,
 		.reg_list = imx258_2096x1560_regs,
+		.spd = NULL,
+		.ebd = NULL,
+		.hdr_mode = NO_HDR,
+		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0,
 	},
 };
 
@@ -833,6 +898,20 @@ static int imx258_get_fmt(struct v4l2_subdev *sd,
 		fmt->format.height = mode->height;
 		fmt->format.code = MEDIA_BUS_FMT_SRGGB10_1X10;
 		fmt->format.field = V4L2_FIELD_NONE;
+		/* to csi rawwr3, other rawwr also can use */
+		if (fmt->pad == imx258->spd_id && mode->spd) {
+			fmt->format.width = mode->spd->width;
+			fmt->format.height = mode->spd->height;
+			fmt->format.code = mode->spd->bus_fmt;
+			//Set the vc channel to be consistent with the valid data
+			fmt->reserved[0] = V4L2_MBUS_CSI2_CHANNEL_0;
+		} else if (fmt->pad == imx258->ebd_id && mode->ebd) {
+			fmt->format.width = mode->ebd->width;
+			fmt->format.height = mode->ebd->height;
+			fmt->format.code = mode->ebd->bus_fmt;
+			//Set the vc channel to be consistent with the valid data
+			fmt->reserved[0] = V4L2_MBUS_CSI2_CHANNEL_0;
+		}
 	}
 	mutex_unlock(&imx258->mutex);
 
@@ -990,8 +1069,10 @@ static void imx258_set_lsc_cfg(struct imx258 *imx258,
 static long imx258_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 {
 	struct imx258 *imx258 = to_imx258(sd);
+	struct rkmodule_hdr_cfg *hdr_cfg;
 	long ret = 0;
 	u32 stream = 0;
+	u32 i, h, w;
 
 	switch (cmd) {
 	case RKMODULE_GET_MODULE_INFO:
@@ -1018,6 +1099,40 @@ static long imx258_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 					       IMX258_REG_VALUE_08BIT,
 					       IMX258_MODE_SW_STANDBY);
 		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr_cfg = (struct rkmodule_hdr_cfg *)arg;
+		w = imx258->cur_mode->width;
+		h = imx258->cur_mode->height;
+		for (i = 0; i < imx258->cfg_num; i++) {
+			if (w == supported_modes[i].width &&
+			    h == supported_modes[i].height &&
+			    supported_modes[i].hdr_mode == hdr_cfg->hdr_mode) {
+				imx258->cur_mode = &supported_modes[i];
+				break;
+			}
+		}
+		if (i == imx258->cfg_num) {
+			dev_err(&imx258->client->dev,
+				"not find hdr mode:%d %dx%d config\n",
+				hdr_cfg->hdr_mode, w, h);
+			ret = -EINVAL;
+		} else {
+			w = imx258->cur_mode->hts_def - imx258->cur_mode->width;
+			h = imx258->cur_mode->vts_def - imx258->cur_mode->height;
+			__v4l2_ctrl_modify_range(imx258->hblank, w, w, 1, w);
+			__v4l2_ctrl_modify_range(imx258->vblank, h,
+						 IMX258_VTS_MAX - imx258->cur_mode->height,
+						 1, h);
+			dev_info(&imx258->client->dev,
+				"sensor mode: %d\n",
+				imx258->cur_mode->hdr_mode);
+		}
+		break;
+	case RKMODULE_GET_HDR_CFG:
+		hdr_cfg = (struct rkmodule_hdr_cfg *)arg;
+		hdr_cfg->esp.mode = HDR_NORMAL_VC;
+		hdr_cfg->hdr_mode = imx258->cur_mode->hdr_mode;
+		break;
 	default:
 		ret = -ENOTTY;
 		break;
@@ -1034,6 +1149,7 @@ static long imx258_compat_ioctl32(struct v4l2_subdev *sd,
 	struct rkmodule_inf *inf;
 	struct rkmodule_awb_cfg *awb_cfg;
 	struct rkmodule_lsc_cfg *lsc_cfg;
+	struct rkmodule_hdr_cfg *hdr;
 	long ret = 0;
 	u32 stream = 0;
 
@@ -1046,8 +1162,11 @@ static long imx258_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = imx258_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:
@@ -1058,8 +1177,11 @@ static long imx258_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = copy_from_user(awb_cfg, up, sizeof(*awb_cfg));
-		if (!ret)
-			ret = imx258_ioctl(sd, cmd, awb_cfg);
+		if (ret) {
+			kfree(awb_cfg);
+			return -EFAULT;
+		}
+		ret = imx258_ioctl(sd, cmd, awb_cfg);
 		kfree(awb_cfg);
 		break;
 	case RKMODULE_LSC_CFG:
@@ -1070,14 +1192,50 @@ static long imx258_compat_ioctl32(struct v4l2_subdev *sd,
 		}
 
 		ret = copy_from_user(lsc_cfg, up, sizeof(*lsc_cfg));
-		if (!ret)
-			ret = imx258_ioctl(sd, cmd, lsc_cfg);
+		if (ret) {
+			kfree(lsc_cfg);
+			return -EFAULT;
+		}
+		ret = imx258_ioctl(sd, cmd, lsc_cfg);
 		kfree(lsc_cfg);
 		break;
+	case RKMODULE_GET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = imx258_ioctl(sd, cmd, hdr);
+		if (!ret) {
+			ret = copy_to_user(up, hdr, sizeof(*hdr));
+			if (ret) {
+				kfree(hdr);
+				return -EFAULT;
+			}
+		}
+		kfree(hdr);
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = copy_from_user(hdr, up, sizeof(*hdr));
+		if (ret) {
+			kfree(hdr);
+			return -EFAULT;
+		}
+		ret = imx258_ioctl(sd, cmd, hdr);
+		kfree(hdr);
+		break;
 	case RKMODULE_SET_QUICK_STREAM:
 		ret = copy_from_user(&stream, up, sizeof(u32));
-		if (!ret)
-			ret = imx258_ioctl(sd, cmd, &stream);
+		if (ret)
+			return -EFAULT;
+		ret = imx258_ioctl(sd, cmd, &stream);
 		break;
 	default:
 		ret = -ENOTTY;
@@ -1212,6 +1370,14 @@ static int __imx258_start_stream(struct imx258 *imx258)
 		if (ret)
 			return ret;
 	}
+	if (imx258->cur_mode->width == 4208 &&
+	    imx258->cur_mode->height == 3120 &&
+	    imx258->cur_mode->spd != NULL &&
+	    imx258->spd_id < PAD_MAX) {
+		ret = imx258_write_array(imx258->client, imx258_4208_3120_spd_reg);
+		if (ret)
+			return ret;
+	}
 	return imx258_write_reg(imx258->client,
 		IMX258_REG_CTRL_MODE,
 		IMX258_REG_VALUE_08BIT,
@@ -1424,12 +1590,11 @@ static int imx258_enum_frame_interval(struct v4l2_subdev *sd,
 	if (fie->index >= ARRAY_SIZE(supported_modes))
 		return -EINVAL;
 
-	if (fie->code != MEDIA_BUS_FMT_SRGGB10_1X10)
-		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;
 	return 0;
 }
 
@@ -1698,6 +1863,7 @@ static int imx258_probe(struct i2c_client *client,
 	}
 
 	imx258->client = client;
+	imx258->cfg_num = ARRAY_SIZE(supported_modes);
 	imx258->cur_mode = &supported_modes[0];
 
 	imx258->xvclk = devm_clk_get(dev, "xvclk");
@@ -1714,6 +1880,23 @@ static int imx258_probe(struct i2c_client *client,
 	if (IS_ERR(imx258->pwdn_gpio))
 		dev_warn(dev, "Failed to get pwdn-gpios\n");
 
+	ret = of_property_read_u32(node,
+				   "rockchip,spd-id",
+				   &imx258->spd_id);
+	if (ret != 0) {
+		imx258->spd_id = PAD_MAX;
+		dev_err(dev,
+			"failed get spd_id, will not to use spd\n");
+	}
+	ret = of_property_read_u32(node,
+				   "rockchip,ebd-id",
+				   &imx258->ebd_id);
+	if (ret != 0) {
+		imx258->ebd_id = PAD_MAX;
+		dev_err(dev,
+			"failed get ebd_id, will not to use ebd\n");
+	}
+
 	ret = imx258_configure_regulators(imx258);
 	if (ret) {
 		dev_err(dev, "Failed to get power regulators\n");

commit 11bd07bda65f4a946fe1d3d2f46c91f85479a973
Author: William Wu <william.wu@rock-chips.com>
Date:   Sun May 23 15:56:53 2021 +0800

    phy: rockchip: inno-usb2: increase hs eye height for otg port
    
    Test on RK3568S EVB1, the otg device data eye test fail with
    far end template when use 1.2 meter long cable. So tuning
    the hs eye height from 400mv(default) to 437.5mv. And we
    test on RK3568 EVB1, it can also benefit from this patch.
    
    Signed-off-by: William Wu <william.wu@rock-chips.com>
    Change-Id: Ie2342aba5546990838fdd6faf27a007a8843fd0d

diff --git a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
index 17f640918b30..b8dbae612539 100644
--- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
+++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
@@ -2254,6 +2254,12 @@ static int rk3568_usb2phy_tuning(struct rockchip_usb2phy *rphy)
 	writel(reg, rphy->phy_base + 0x0400);
 
 	if (rphy->phy_cfg->reg == 0xfe8a0000) {
+		/* Set otg port HS eye height to 437.5mv(default is 400mv) */
+		reg = readl(rphy->phy_base + 0x30);
+		reg &= ~(0x07 << 4);
+		reg |= (0x06 << 4);
+		writel(reg, rphy->phy_base + 0x30);
+
 		/*
 		 * Set the bvalid filter time to 10ms
 		 * based on the usb2 phy grf pclk 100MHz.

commit 011b73c995f35959b39ccde045addbc1862fa3e6
Merge: f9b88fb75f73 1e986fe9ad15
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Sat May 22 11:54:36 2021 +0200

    Merge 4.19.191 into android-4.19-stable
    
    Changes in 4.19.191
            s390/disassembler: increase ebpf disasm buffer size
            ACPI: custom_method: fix potential use-after-free issue
            ACPI: custom_method: fix a possible memory leak
            ftrace: Handle commands when closing set_ftrace_filter file
            ARM: 9056/1: decompressor: fix BSS size calculation for LLVM ld.lld
            arm64: dts: marvell: armada-37xx: add syscon compatible to NB clk node
            arm64: dts: mt8173: fix property typo of 'phys' in dsi node
            ecryptfs: fix kernel panic with null dev_name
            mtd: spinand: core: add missing MODULE_DEVICE_TABLE()
            mtd: rawnand: atmel: Update ecc_stats.corrected counter
            spi: spi-ti-qspi: Free DMA resources
            scsi: qla2xxx: Fix crash in qla2xxx_mqueuecommand()
            mmc: sdhci-pci: Fix initialization of some SD cards for Intel BYT-based controllers
            mmc: block: Update ext_csd.cache_ctrl if it was written
            mmc: block: Issue a cache flush only when it's enabled
            mmc: core: Do a power cycle when the CMD11 fails
            mmc: core: Set read only for SD cards with permanent write protect bit
            erofs: add unsupported inode i_format check
            cifs: Return correct error code from smb2_get_enc_key
            btrfs: fix metadata extent leak after failure to create subvolume
            intel_th: pci: Add Rocket Lake CPU support
            fbdev: zero-fill colormap in fbcmap.c
            staging: wimax/i2400m: fix byte-order issue
            crypto: api - check for ERR pointers in crypto_destroy_tfm()
            usb: gadget: uvc: add bInterval checking for HS mode
            genirq/matrix: Prevent allocation counter corruption
            usb: gadget: f_uac1: validate input parameters
            usb: dwc3: gadget: Ignore EP queue requests during bus reset
            usb: xhci: Fix port minor revision
            PCI: PM: Do not read power state in pci_enable_device_flags()
            x86/build: Propagate $(CLANG_FLAGS) to $(REALMODE_FLAGS)
            tee: optee: do not check memref size on return from Secure World
            perf/arm_pmu_platform: Fix error handling
            usb: xhci-mtk: support quirk to disable usb2 lpm
            xhci: check control context is valid before dereferencing it.
            xhci: fix potential array out of bounds with several interrupters
            spi: dln2: Fix reference leak to master
            spi: omap-100k: Fix reference leak to master
            intel_th: Consistency and off-by-one fix
            phy: phy-twl4030-usb: Fix possible use-after-free in twl4030_usb_remove()
            btrfs: convert logic BUG_ON()'s in replace_path to ASSERT()'s
            scsi: lpfc: Fix incorrect dbde assignment when building target abts wqe
            scsi: lpfc: Fix pt2pt connection does not recover after LOGO
            scsi: target: pscsi: Fix warning in pscsi_complete_cmd()
            media: ite-cir: check for receive overflow
            media: drivers: media: pci: sta2x11: fix Kconfig dependency on GPIOLIB
            power: supply: bq27xxx: fix power_avg for newer ICs
            extcon: arizona: Fix some issues when HPDET IRQ fires after the jack has been unplugged
            media: media/saa7164: fix saa7164_encoder_register() memory leak bugs
            media: gspca/sq905.c: fix uninitialized variable
            power: supply: Use IRQF_ONESHOT
            drm/amdgpu : Fix asic reset regression issue introduce by 8f211fe8ac7c4f
            scsi: qla2xxx: Always check the return value of qla24xx_get_isp_stats()
            scsi: qla2xxx: Fix use after free in bsg
            scsi: scsi_dh_alua: Remove check for ASC 24h in alua_rtpg()
            media: em28xx: fix memory leak
            media: vivid: update EDID
            clk: socfpga: arria10: Fix memory leak of socfpga_clk on error return
            power: supply: generic-adc-battery: fix possible use-after-free in gab_remove()
            power: supply: s3c_adc_battery: fix possible use-after-free in s3c_adc_bat_remove()
            media: tc358743: fix possible use-after-free in tc358743_remove()
            media: adv7604: fix possible use-after-free in adv76xx_remove()
            media: i2c: adv7511-v4l2: fix possible use-after-free in adv7511_remove()
            media: i2c: adv7842: fix possible use-after-free in adv7842_remove()
            media: dvb-usb: fix memory leak in dvb_usb_adapter_init
            media: gscpa/stv06xx: fix memory leak
            drm/msm/mdp5: Configure PP_SYNC_HEIGHT to double the vtotal
            amdgpu: avoid incorrect %hu format string
            drm/amdgpu: fix NULL pointer dereference
            scsi: lpfc: Fix crash when a REG_RPI mailbox fails triggering a LOGO response
            scsi: lpfc: Remove unsupported mbox PORT_CAPABILITIES logic
            scsi: libfc: Fix a format specifier
            s390/archrandom: add parameter check for s390_arch_random_generate
            ALSA: emu8000: Fix a use after free in snd_emu8000_create_mixer
            ALSA: hda/conexant: Re-order CX5066 quirk table entries
            ALSA: sb: Fix two use after free in snd_sb_qsound_build
            ALSA: usb-audio: Explicitly set up the clock selector
            ALSA: usb-audio: More constifications
            ALSA: usb-audio: Add dB range mapping for Sennheiser Communications Headset PC 8
            ALSA: hda/realtek: Add quirk for Intel Clevo PCx0Dx
            btrfs: fix race when picking most recent mod log operation for an old root
            arm64/vdso: Discard .note.gnu.property sections in vDSO
            ubifs: Only check replay with inode type to judge if inode linked
            f2fs: fix to avoid out-of-bounds memory access
            mlxsw: spectrum_mr: Update egress RIF list before route's action
            openvswitch: fix stack OOB read while fragmenting IPv4 packets
            ACPI: GTDT: Don't corrupt interrupt mappings on watchdow probe failure
            NFS: Don't discard pNFS layout segments that are marked for return
            NFSv4: Don't discard segments marked for return in _pnfs_return_layout()
            jffs2: Fix kasan slab-out-of-bounds problem
            powerpc/eeh: Fix EEH handling for hugepages in ioremap space.
            powerpc: fix EDEADLOCK redefinition error in uapi/asm/errno.h
            intel_th: pci: Add Alder Lake-M support
            tpm: vtpm_proxy: Avoid reading host log when using a virtual device
            md/raid1: properly indicate failure when ending a failed write request
            dm raid: fix inconclusive reshape layout on fast raid4/5/6 table reload sequences
            security: commoncap: fix -Wstringop-overread warning
            Fix misc new gcc warnings
            jffs2: check the validity of dstlen in jffs2_zlib_compress()
            Revert 337f13046ff0 ("futex: Allow FUTEX_CLOCK_REALTIME with FUTEX_WAIT op")
            posix-timers: Preserve return value in clock_adjtime32()
            arm64: vdso: remove commas between macro name and arguments
            ext4: fix check to prevent false positive report of incorrect used inodes
            ext4: do not set SB_ACTIVE in ext4_orphan_cleanup()
            ext4: fix error code in ext4_commit_super
            media: dvbdev: Fix memory leak in dvb_media_device_free()
            usb: gadget: dummy_hcd: fix gpf in gadget_setup
            usb: gadget: Fix double free of device descriptor pointers
            usb: gadget/function/f_fs string table fix for multiple languages
            usb: dwc3: gadget: Fix START_TRANSFER link state check
            usb: dwc2: Fix session request interrupt handler
            tty: fix memory leak in vc_deallocate
            rsi: Use resume_noirq for SDIO
            tracing: Map all PIDs to command lines
            tracing: Restructure trace_clock_global() to never block
            dm persistent data: packed struct should have an aligned() attribute too
            dm space map common: fix division bug in sm_ll_find_free_block()
            dm rq: fix double free of blk_mq_tag_set in dev remove after table load fails
            modules: mark ref_module static
            modules: mark find_symbol static
            modules: mark each_symbol_section static
            modules: unexport __module_text_address
            modules: unexport __module_address
            modules: rename the licence field in struct symsearch to license
            modules: return licensing information from find_symbol
            modules: inherit TAINT_PROPRIETARY_MODULE
            Bluetooth: verify AMP hci_chan before amp_destroy
            hsr: use netdev_err() instead of WARN_ONCE()
            bluetooth: eliminate the potential race condition when removing the HCI controller
            net/nfc: fix use-after-free llcp_sock_bind/connect
            ASoC: samsung: tm2_wm5110: check of of_parse return value
            MIPS: pci-mt7620: fix PLL lock check
            MIPS: pci-rt2880: fix slot 0 configuration
            FDDI: defxx: Bail out gracefully with unassigned PCI resource for CSR
            iio:accel:adis16201: Fix wrong axis assignment that prevents loading
            misc: lis3lv02d: Fix false-positive WARN on various HP models
            misc: vmw_vmci: explicitly initialize vmci_notify_bm_set_msg struct
            misc: vmw_vmci: explicitly initialize vmci_datagram payload
            md/bitmap: wait for external bitmap writes to complete during tear down
            md-cluster: fix use-after-free issue when removing rdev
            md: split mddev_find
            md: factor out a mddev_find_locked helper from mddev_find
            md: md_open returns -EBUSY when entering racing area
            md: Fix missing unused status line of /proc/mdstat
            ipw2x00: potential buffer overflow in libipw_wx_set_encodeext()
            cfg80211: scan: drop entry from hidden_list on overflow
            drm/radeon: fix copy of uninitialized variable back to userspace
            ALSA: hda/realtek: Re-order ALC882 Acer quirk table entries
            ALSA: hda/realtek: Re-order ALC882 Sony quirk table entries
            ALSA: hda/realtek: Re-order ALC882 Clevo quirk table entries
            ALSA: hda/realtek: Re-order ALC269 HP quirk table entries
            ALSA: hda/realtek: Re-order ALC269 Dell quirk table entries
            ALSA: hda/realtek: Re-order ALC269 Sony quirk table entries
            ALSA: hda/realtek: Re-order ALC269 Lenovo quirk table entries
            ALSA: hda/realtek: Remove redundant entry for ALC861 Haier/Uniwill devices
            x86/cpu: Initialize MSR_TSC_AUX if RDTSCP *or* RDPID is supported
            KVM: s390: split kvm_s390_logical_to_effective
            KVM: s390: fix guarded storage control register handling
            KVM: s390: split kvm_s390_real_to_abs
            ovl: fix missing revert_creds() on error path
            usb: gadget: pch_udc: Revert d3cb25a12138 completely
            memory: gpmc: fix out of bounds read and dereference on gpmc_cs[]
            ARM: dts: exynos: correct fuel gauge interrupt trigger level on Midas family
            ARM: dts: exynos: correct MUIC interrupt trigger level on Midas family
            ARM: dts: exynos: correct PMIC interrupt trigger level on Midas family
            ARM: dts: exynos: correct PMIC interrupt trigger level on Odroid X/U3 family
            ARM: dts: exynos: correct PMIC interrupt trigger level on SMDK5250
            ARM: dts: exynos: correct PMIC interrupt trigger level on Snow
            serial: stm32: fix incorrect characters on console
            serial: stm32: fix tx_empty condition
            usb: typec: tcpci: Check ROLE_CONTROL while interpreting CC_STATUS
            regmap: set debugfs_name to NULL after it is freed
            mtd: rawnand: fsmc: Fix error code in fsmc_nand_probe()
            mtd: rawnand: brcmnand: fix OOB R/W with Hamming ECC
            mtd: Handle possible -EPROBE_DEFER from parse_mtd_partitions()
            mtd: rawnand: qcom: Return actual error code instead of -ENODEV
            x86/microcode: Check for offline CPUs before requesting new microcode
            usb: gadget: pch_udc: Replace cpu_to_le32() by lower_32_bits()
            usb: gadget: pch_udc: Check if driver is present before calling ->setup()
            usb: gadget: pch_udc: Check for DMA mapping error
            crypto: qat - don't release uninitialized resources
            crypto: qat - ADF_STATUS_PF_RUNNING should be set after adf_dev_init
            fotg210-udc: Fix DMA on EP0 for length > max packet size
            fotg210-udc: Fix EP0 IN requests bigger than two packets
            fotg210-udc: Remove a dubious condition leading to fotg210_done
            fotg210-udc: Mask GRP2 interrupts we don't handle
            fotg210-udc: Don't DMA more than the buffer can take
            fotg210-udc: Complete OUT requests on short packets
            mtd: require write permissions for locking and badblock ioctls
            bus: qcom: Put child node before return
            soundwire: bus: Fix device found flag correctly
            phy: marvell: ARMADA375_USBCLUSTER_PHY should not default to y, unconditionally
            crypto: qat - fix error path in adf_isr_resource_alloc()
            usb: gadget: aspeed: fix dma map failure
            USB: gadget: udc: fix wrong pointer passed to IS_ERR() and PTR_ERR()
            soundwire: stream: fix memory leak in stream config error path
            mtd: rawnand: gpmi: Fix a double free in gpmi_nand_init
            irqchip/gic-v3: Fix OF_BAD_ADDR error handling
            staging: rtl8192u: Fix potential infinite loop
            staging: greybus: uart: fix unprivileged TIOCCSERIAL
            spi: Fix use-after-free with devm_spi_alloc_*
            soc: qcom: mdt_loader: Validate that p_filesz < p_memsz
            soc: qcom: mdt_loader: Detect truncated read of segments
            ACPI: CPPC: Replace cppc_attr with kobj_attribute
            crypto: qat - Fix a double free in adf_create_ring
            cpufreq: armada-37xx: Fix setting TBG parent for load levels
            clk: mvebu: armada-37xx-periph: remove .set_parent method for CPU PM clock
            cpufreq: armada-37xx: Fix the AVS value for load L1
            clk: mvebu: armada-37xx-periph: Fix switching CPU freq from 250 Mhz to 1 GHz
            clk: mvebu: armada-37xx-periph: Fix workaround for switching from L1 to L0
            cpufreq: armada-37xx: Fix driver cleanup when registration failed
            cpufreq: armada-37xx: Fix determining base CPU frequency
            usb: gadget: r8a66597: Add missing null check on return from platform_get_resource
            USB: cdc-acm: fix unprivileged TIOCCSERIAL
            tty: actually undefine superseded ASYNC flags
            tty: fix return value for unsupported ioctls
            firmware: qcom-scm: Fix QCOM_SCM configuration
            usbip: vudc: fix missing unlock on error in usbip_sockfd_store()
            platform/x86: pmc_atom: Match all Beckhoff Automation baytrail boards with critclk_systems DMI table
            x86/platform/uv: Fix !KEXEC build failure
            Drivers: hv: vmbus: Increase wait time for VMbus unload
            usb: dwc2: Fix host mode hibernation exit with remote wakeup flow.
            usb: dwc2: Fix hibernation between host and device modes.
            ttyprintk: Add TTY hangup callback.
            soc: aspeed: fix a ternary sign expansion bug
            media: vivid: fix assignment of dev->fbuf_out_flags
            media: omap4iss: return error code when omap4iss_get() failed
            media: m88rs6000t: avoid potential out-of-bounds reads on arrays
            drm/amdkfd: fix build error with AMD_IOMMU_V2=m
            x86/kprobes: Fix to check non boostable prefixes correctly
            pata_arasan_cf: fix IRQ check
            pata_ipx4xx_cf: fix IRQ check
            sata_mv: add IRQ checks
            ata: libahci_platform: fix IRQ check
            nvme: retrigger ANA log update if group descriptor isn't found
            vfio/mdev: Do not allow a mdev_type to have a NULL parent pointer
            clk: qcom: a53-pll: Add missing MODULE_DEVICE_TABLE
            clk: uniphier: Fix potential infinite loop
            scsi: jazz_esp: Add IRQ check
            scsi: sun3x_esp: Add IRQ check
            scsi: sni_53c710: Add IRQ check
            scsi: ibmvfc: Fix invalid state machine BUG_ON()
            mfd: stm32-timers: Avoid clearing auto reload register
            HSI: core: fix resource leaks in hsi_add_client_from_dt()
            x86/events/amd/iommu: Fix sysfs type mismatch
            sched/debug: Fix cgroup_path[] serialization
            drivers/block/null_blk/main: Fix a double free in null_init.
            HID: plantronics: Workaround for double volume key presses
            perf symbols: Fix dso__fprintf_symbols_by_name() to return the number of printed chars
            net: lapbether: Prevent racing when checking whether the netif is running
            powerpc/prom: Mark identical_pvr_fixup as __init
            powerpc: Fix HAVE_HARDLOCKUP_DETECTOR_ARCH build configuration
            ALSA: core: remove redundant spin_lock pair in snd_card_disconnect
            bug: Remove redundant condition check in report_bug
            nfc: pn533: prevent potential memory corruption
            net: hns3: Limiting the scope of vector_ring_chain variable
            ALSA: usb-audio: Add error checks for usb_driver_claim_interface() calls
            liquidio: Fix unintented sign extension of a left shift of a u16
            powerpc/64s: Fix pte update for kernel memory on radix
            powerpc/perf: Fix PMU constraint check for EBB events
            powerpc: iommu: fix build when neither PCI or IBMVIO is set
            mac80211: bail out if cipher schemes are invalid
            mt7601u: fix always true expression
            IB/hfi1: Fix error return code in parse_platform_config()
            net: thunderx: Fix unintentional sign extension issue
            RDMA/srpt: Fix error return code in srpt_cm_req_recv()
            i2c: cadence: add IRQ check
            i2c: emev2: add IRQ check
            i2c: jz4780: add IRQ check
            i2c: sh7760: add IRQ check
            ASoC: ak5558: correct reset polarity
            drm/i915/gvt: Fix error code in intel_gvt_init_device()
            MIPS: pci-legacy: stop using of_pci_range_to_resource
            powerpc/pseries: extract host bridge from pci_bus prior to bus removal
            rtlwifi: 8821ae: upgrade PHY and RF parameters
            i2c: sh7760: fix IRQ error path
            mwl8k: Fix a double Free in mwl8k_probe_hw
            vsock/vmci: log once the failed queue pair allocation
            RDMA/i40iw: Fix error unwinding when i40iw_hmc_sd_one fails
            ALSA: usb: midi: don't return -ENOMEM when usb_urb_ep_type_check fails
            net: davinci_emac: Fix incorrect masking of tx and rx error channel
            ath9k: Fix error check in ath9k_hw_read_revisions() for PCI devices
            ath10k: Fix ath10k_wmi_tlv_op_pull_peer_stats_info() unlock without lock
            powerpc/52xx: Fix an invalid ASM expression ('addi' used instead of 'add')
            bnxt_en: fix ternary sign extension bug in bnxt_show_temp()
            ARM: dts: uniphier: Change phy-mode to RGMII-ID to enable delay pins for RTL8211E
            arm64: dts: uniphier: Change phy-mode to RGMII-ID to enable delay pins for RTL8211E
            net: geneve: modify IP header check in geneve6_xmit_skb and geneve_xmit_skb
            net:emac/emac-mac: Fix a use after free in emac_mac_tx_buf_send
            RDMA/bnxt_re: Fix a double free in bnxt_qplib_alloc_res
            net:nfc:digital: Fix a double free in digital_tg_recv_dep_req
            kfifo: fix ternary sign extension bugs
            mm/sparse: add the missing sparse_buffer_fini() in error branch
            mm/memory-failure: unnecessary amount of unmapping
            net: Only allow init netns to set default tcp cong to a restricted algo
            smp: Fix smp_call_function_single_async prototype
            Revert "net/sctp: fix race condition in sctp_destroy_sock"
            sctp: delay auto_asconf init until binding the first addr
            Revert "of/fdt: Make sure no-map does not remove already reserved regions"
            Revert "fdt: Properly handle "no-map" field in the memory region"
            tpm: fix error return code in tpm2_get_cc_attrs_tbl()
            fs: dlm: fix debugfs dump
            tipc: convert dest node's address to network order
            ASoC: Intel: bytcr_rt5640: Enable jack-detect support on Asus T100TAF
            net: stmmac: Set FIFO sizes for ipq806x
            i2c: bail out early when RDWR parameters are wrong
            ALSA: hdsp: don't disable if not enabled
            ALSA: hdspm: don't disable if not enabled
            ALSA: rme9652: don't disable if not enabled
            Bluetooth: Set CONF_NOT_COMPLETE as l2cap_chan default
            Bluetooth: initialize skb_queue_head at l2cap_chan_create()
            net: bridge: when suppression is enabled exclude RARP packets
            Bluetooth: check for zapped sk before connecting
            ip6_vti: proper dev_{hold|put} in ndo_[un]init methods
            ASoC: Intel: bytcr_rt5640: Add quirk for the Chuwi Hi8 tablet
            i2c: Add I2C_AQ_NO_REP_START adapter quirk
            mac80211: clear the beacon's CRC after channel switch
            pinctrl: samsung: use 'int' for register masks in Exynos
            cuse: prevent clone
            selftests: Set CC to clang in lib.mk if LLVM is set
            kconfig: nconf: stop endless search loops
            sctp: Fix out-of-bounds warning in sctp_process_asconf_param()
            powerpc/smp: Set numa node before updating mask
            ASoC: rt286: Generalize support for ALC3263 codec
            ethtool: ioctl: Fix out-of-bounds warning in store_link_ksettings_for_user()
            samples/bpf: Fix broken tracex1 due to kprobe argument change
            powerpc/pseries: Stop calling printk in rtas_stop_self()
            wl3501_cs: Fix out-of-bounds warnings in wl3501_send_pkt
            wl3501_cs: Fix out-of-bounds warnings in wl3501_mgmt_join
            powerpc/iommu: Annotate nested lock for lockdep
            net: ethernet: mtk_eth_soc: fix RX VLAN offload
            ia64: module: fix symbolizer crash on fdescr
            ASoC: rt286: Make RT286_SET_GPIO_* readable and writable
            f2fs: fix a redundant call to f2fs_balance_fs if an error occurs
            PCI: iproc: Fix return value of iproc_msi_irq_domain_alloc()
            PCI: Release OF node in pci_scan_device()'s error path
            ARM: 9064/1: hw_breakpoint: Do not directly check the event's overflow_handler hook
            rpmsg: qcom_glink_native: fix error return code of qcom_glink_rx_data()
            NFSv4.2: Always flush out writes in nfs42_proc_fallocate()
            NFS: Deal correctly with attribute generation counter overflow
            PCI: endpoint: Fix missing destroy_workqueue()
            pNFS/flexfiles: fix incorrect size check in decode_nfs_fh()
            NFSv4.2 fix handling of sr_eof in SEEK's reply
            rtc: ds1307: Fix wday settings for rx8130
            net: hns3: disable phy loopback setting in hclge_mac_start_phy
            sctp: do asoc update earlier in sctp_sf_do_dupcook_a
            ethernet:enic: Fix a use after free bug in enic_hard_start_xmit
            sctp: fix a SCTP_MIB_CURRESTAB leak in sctp_sf_do_dupcook_b
            netfilter: xt_SECMARK: add new revision to fix structure layout
            drm/radeon: Fix off-by-one power_state index heap overwrite
            drm/radeon: Avoid power table parsing memory leaks
            khugepaged: fix wrong result value for trace_mm_collapse_huge_page_isolate()
            mm/hugeltb: handle the error case in hugetlb_fix_reserve_counts()
            ksm: fix potential missing rmap_item for stable_node
            net: fix nla_strcmp to handle more then one trailing null character
            smc: disallow TCP_ULP in smc_setsockopt()
            netfilter: nfnetlink_osf: Fix a missing skb_header_pointer() NULL check
            sched/fair: Fix unfairness caused by missing load decay
            kernel: kexec_file: fix error return code of kexec_calculate_store_digests()
            netfilter: nftables: avoid overflows in nft_hash_buckets()
            i40e: Fix use-after-free in i40e_client_subtask()
            ARC: entry: fix off-by-one error in syscall number validation
            powerpc/64s: Fix crashes when toggling stf barrier
            powerpc/64s: Fix crashes when toggling entry flush barrier
            hfsplus: prevent corruption in shrinking truncate
            squashfs: fix divide error in calculate_skip()
            userfaultfd: release page in error path to avoid BUG_ON
            drm/radeon/dpm: Disable sclk switching on Oland when two 4K 60Hz monitors are connected
            iio: proximity: pulsedlight: Fix rumtime PM imbalance on error
            usb: fotg210-hcd: Fix an error message
            ACPI: scan: Fix a memory leak in an error handling path
            blk-mq: Swap two calls in blk_mq_exit_queue()
            usb: dwc3: omap: improve extcon initialization
            usb: dwc3: pci: Enable usb2-gadget-lpm-disable for Intel Merrifield
            usb: xhci: Increase timeout for HC halt
            usb: dwc2: Fix gadget DMA unmap direction
            usb: core: hub: fix race condition about TRSMRCY of resume
            usb: dwc3: gadget: Return success always for kick transfer in ep queue
            xhci: Do not use GFP_KERNEL in (potentially) atomic context
            xhci: Add reset resume quirk for AMD xhci controller.
            iio: gyro: mpu3050: Fix reported temperature value
            iio: tsl2583: Fix division by a zero lux_val
            cdc-wdm: untangle a circular dependency between callback and softint
            KVM: x86: Cancel pvclock_gtod_work on module removal
            FDDI: defxx: Make MMIO the configuration default except for EISA
            MIPS: Reinstate platform `__div64_32' handler
            MIPS: Avoid DIVU in `__div64_32' is result would be zero
            MIPS: Avoid handcoded DIVU in `__div64_32' altogether
            thermal/core/fair share: Lock the thermal zone while looping over instances
            kobject_uevent: remove warning in init_uevent_argv()
            netfilter: conntrack: Make global sysctls readonly in non-init netns
            clk: exynos7: Mark aclk_fsys1_200 as critical
            nvme: do not try to reconfigure APST when the controller is not live
            x86/msr: Fix wr/rdmsr_safe_regs_on_cpu() prototypes
            kgdb: fix gcc-11 warning on indentation
            usb: sl811-hcd: improve misleading indentation
            cxgb4: Fix the -Wmisleading-indentation warning
            isdn: capi: fix mismatched prototypes
            pinctrl: ingenic: Improve unreachable code generation
            xsk: Simplify detection of empty and full rings
            PCI: thunder: Fix compile testing
            ARM: 9066/1: ftrace: pause/unpause function graph tracer in cpu_suspend()
            ACPI / hotplug / PCI: Fix reference count leak in enable_slot()
            Input: elants_i2c - do not bind to i2c-hid compatible ACPI instantiated devices
            Input: silead - add workaround for x86 BIOS-es which bring the chip up in a stuck state
            um: Mark all kernel symbols as local
            ARM: 9075/1: kernel: Fix interrupted SMC calls
            scripts/recordmcount.pl: Fix RISC-V regex for clang
            riscv: Workaround mcount name prior to clang-13
            ceph: fix fscache invalidation
            scsi: target: tcmu: Return from tcmu_handle_completions() if cmd_id not found
            gpiolib: acpi: Add quirk to ignore EC wakeups on Dell Venue 10 Pro 5055
            ALSA: hda: generic: change the DAC ctl name for LO+SPK or LO+HP
            block: reexpand iov_iter after read/write
            lib: stackdepot: turn depot_lock spinlock to raw_spinlock
            net: stmmac: Do not enable RX FIFO overflow interrupts
            ip6_gre: proper dev_{hold|put} in ndo_[un]init methods
            sit: proper dev_{hold|put} in ndo_[un]init methods
            ip6_tunnel: sit: proper dev_{hold|put} in ndo_[un]init methods
            ipv6: remove extra dev_hold() for fallback tunnels
            iomap: fix sub-page uptodate handling
            KVM: arm64: Initialize VCPU mdcr_el2 before loading it
            tweewide: Fix most Shebang lines
            scripts: switch explicitly to Python 3
            Linux 4.19.191
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: I2ea4fc6350bb5c5b5ae38ec7ad52ec20cf3b7aae

commit 1e986fe9ad15b8406034c504afc5ae76f0a8e852
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Sat May 22 10:59:50 2021 +0200

    Linux 4.19.191
    
    Link: https://lore.kernel.org/r/20210520092131.308959589@linuxfoundation.org
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Tested-by: Hulk Robot <hulkrobot@huawei.com>
    Tested-by: Jason Self <jason@bluehome.net>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index c813c3bb7405..586a2d128ffb 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 190
+SUBLEVEL = 191
 EXTRAVERSION =
 NAME = "People's Front"
 

commit 03c13411fd44845d2d0fad5eefec108f2eae2da3
Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date:   Wed Dec 9 13:50:17 2020 +0200

    scripts: switch explicitly to Python 3
    
    commit 51839e29cb5954470ea4db7236ef8c3d77a6e0bb upstream.
    
    Some distributions are about to switch to Python 3 support only.
    This means that /usr/bin/python, which is Python 2, is not available
    anymore. Hence, switch scripts to use Python 3 explicitly.
    
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/scripts/bloat-o-meter b/scripts/bloat-o-meter
index d2eadbd4521c..e12daed3f41d 100755
--- a/scripts/bloat-o-meter
+++ b/scripts/bloat-o-meter
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 #
 # Copyright 2004 Matt Mackall <mpm@selenic.com>
 #
diff --git a/scripts/diffconfig b/scripts/diffconfig
index 627eba5849b5..d5da5fa05d1d 100755
--- a/scripts/diffconfig
+++ b/scripts/diffconfig
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 # SPDX-License-Identifier: GPL-2.0
 #
 # diffconfig - a tool to compare .config files.

commit 36f4aaa9dc1ce9cd8075b5df09ee8c8a7eb826a5
Author: Finn Behrens <me@kloenk.de>
Date:   Mon Nov 23 15:15:33 2020 +0100

    tweewide: Fix most Shebang lines
    
    commit c25ce589dca10d64dde139ae093abc258a32869c upstream.
    
    Change every shebang which does not need an argument to use /usr/bin/env.
    This is needed as not every distro has everything under /usr/bin,
    sometimes not even bash.
    
    Signed-off-by: Finn Behrens <me@kloenk.de>
    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Documentation/sphinx/parse-headers.pl b/Documentation/sphinx/parse-headers.pl
index c518050ffc3f..0dcf369ab904 100755
--- a/Documentation/sphinx/parse-headers.pl
+++ b/Documentation/sphinx/parse-headers.pl
@@ -1,4 +1,4 @@
-#!/usr/bin/perl
+#!/usr/bin/env perl
 use strict;
 use Text::Tabs;
 use Getopt::Long;
diff --git a/Documentation/target/tcm_mod_builder.py b/Documentation/target/tcm_mod_builder.py
index 94bf6944bb1e..7e79ff6b09e0 100755
--- a/Documentation/target/tcm_mod_builder.py
+++ b/Documentation/target/tcm_mod_builder.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
 # The TCM v4 multi-protocol fabric module generation script for drivers/target/$NEW_MOD
 #
 # Copyright (c) 2010 Rising Tide Systems
diff --git a/Documentation/trace/postprocess/decode_msr.py b/Documentation/trace/postprocess/decode_msr.py
index 0ab40e0db580..aa9cc7abd5c2 100644
--- a/Documentation/trace/postprocess/decode_msr.py
+++ b/Documentation/trace/postprocess/decode_msr.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
 # add symbolic names to read_msr / write_msr in trace
 # decode_msr msr-index.h < trace
 import sys
diff --git a/Documentation/trace/postprocess/trace-pagealloc-postprocess.pl b/Documentation/trace/postprocess/trace-pagealloc-postprocess.pl
index 0a120aae33ce..b9b7d80c2f9d 100644
--- a/Documentation/trace/postprocess/trace-pagealloc-postprocess.pl
+++ b/Documentation/trace/postprocess/trace-pagealloc-postprocess.pl
@@ -1,4 +1,4 @@
-#!/usr/bin/perl
+#!/usr/bin/env perl
 # This is a POC (proof of concept or piece of crap, take your pick) for reading the
 # text representation of trace output related to page allocation. It makes an attempt
 # to extract some high-level information on what is going on. The accuracy of the parser
diff --git a/Documentation/trace/postprocess/trace-vmscan-postprocess.pl b/Documentation/trace/postprocess/trace-vmscan-postprocess.pl
index 66bfd8396877..9efcf5ed8cb5 100644
--- a/Documentation/trace/postprocess/trace-vmscan-postprocess.pl
+++ b/Documentation/trace/postprocess/trace-vmscan-postprocess.pl
@@ -1,4 +1,4 @@
-#!/usr/bin/perl
+#!/usr/bin/env perl
 # This is a POC for reading the text representation of trace output related to
 # page reclaim. It makes an attempt to extract some high-level information on
 # what is going on. The accuracy of the parser may vary
diff --git a/arch/ia64/scripts/unwcheck.py b/arch/ia64/scripts/unwcheck.py
index c55276e31b6b..bfd1b671e35f 100644
--- a/arch/ia64/scripts/unwcheck.py
+++ b/arch/ia64/scripts/unwcheck.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
 # SPDX-License-Identifier: GPL-2.0
 #
 # Usage: unwcheck.py FILE
diff --git a/scripts/bloat-o-meter b/scripts/bloat-o-meter
index a923f05edb36..d2eadbd4521c 100755
--- a/scripts/bloat-o-meter
+++ b/scripts/bloat-o-meter
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
 #
 # Copyright 2004 Matt Mackall <mpm@selenic.com>
 #
diff --git a/scripts/config b/scripts/config
index eee5b7f3a092..8c8d7c3d7acc 100755
--- a/scripts/config
+++ b/scripts/config
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
 # SPDX-License-Identifier: GPL-2.0
 # Manipulate options in a .config file from the command line
 
diff --git a/scripts/diffconfig b/scripts/diffconfig
index 89abf777f197..627eba5849b5 100755
--- a/scripts/diffconfig
+++ b/scripts/diffconfig
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
 # SPDX-License-Identifier: GPL-2.0
 #
 # diffconfig - a tool to compare .config files.
diff --git a/scripts/split-man.pl b/scripts/split-man.pl
index c3db607ee9ec..96bd99dc977a 100755
--- a/scripts/split-man.pl
+++ b/scripts/split-man.pl
@@ -1,4 +1,4 @@
-#!/usr/bin/perl
+#!/usr/bin/env perl
 # SPDX-License-Identifier: GPL-2.0
 #
 # Author: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
diff --git a/tools/perf/python/tracepoint.py b/tools/perf/python/tracepoint.py
index eb76f6516247..461848c7f57d 100755
--- a/tools/perf/python/tracepoint.py
+++ b/tools/perf/python/tracepoint.py
@@ -1,4 +1,4 @@
-#! /usr/bin/python
+#! /usr/bin/env python
 # SPDX-License-Identifier: GPL-2.0
 # -*- python -*-
 # -*- coding: utf-8 -*-
diff --git a/tools/testing/ktest/compare-ktest-sample.pl b/tools/testing/ktest/compare-ktest-sample.pl
index 4118eb4a842d..ebea21d0a1be 100755
--- a/tools/testing/ktest/compare-ktest-sample.pl
+++ b/tools/testing/ktest/compare-ktest-sample.pl
@@ -1,4 +1,4 @@
-#!/usr/bin/perl
+#!/usr/bin/env perl
 # SPDX-License-Identifier: GPL-2.0
 
 open (IN,"ktest.pl");
diff --git a/tools/testing/selftests/bpf/test_offload.py b/tools/testing/selftests/bpf/test_offload.py
index 2229e55216a9..6b46db61c6d3 100755
--- a/tools/testing/selftests/bpf/test_offload.py
+++ b/tools/testing/selftests/bpf/test_offload.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python3
+#!/usr/bin/env python3
 
 # Copyright (C) 2017 Netronome Systems, Inc.
 #
diff --git a/tools/testing/selftests/tc-testing/tdc_batch.py b/tools/testing/selftests/tc-testing/tdc_batch.py
index 52fa539dc662..3d8350d6bfe1 100755
--- a/tools/testing/selftests/tc-testing/tdc_batch.py
+++ b/tools/testing/selftests/tc-testing/tdc_batch.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python3
+#!/usr/bin/env python3
 
 """
 tdc_batch.py - a script to generate TC batch file

commit 9e43d5e4f8a30bff5a6d08848dd362d60f8775d7
Author: Alexandru Elisei <alexandru.elisei@arm.com>
Date:   Wed Apr 7 15:48:57 2021 +0100

    KVM: arm64: Initialize VCPU mdcr_el2 before loading it
    
    commit 263d6287da1433aba11c5b4046388f2cdf49675c upstream.
    
    When a VCPU is created, the kvm_vcpu struct is initialized to zero in
    kvm_vm_ioctl_create_vcpu(). On VHE systems, the first time
    vcpu.arch.mdcr_el2 is loaded on hardware is in vcpu_load(), before it is
    set to a sensible value in kvm_arm_setup_debug() later in the run loop. The
    result is that KVM executes for a short time with MDCR_EL2 set to zero.
    
    This has several unintended consequences:
    
    * Setting MDCR_EL2.HPMN to 0 is constrained unpredictable according to ARM
      DDI 0487G.a, page D13-3820. The behavior specified by the architecture
      in this case is for the PE to behave as if MDCR_EL2.HPMN is set to a
      value less than or equal to PMCR_EL0.N, which means that an unknown
      number of counters are now disabled by MDCR_EL2.HPME, which is zero.
    
    * The host configuration for the other debug features controlled by
      MDCR_EL2 is temporarily lost. This has been harmless so far, as Linux
      doesn't use the other fields, but that might change in the future.
    
    Let's avoid both issues by initializing the VCPU's mdcr_el2 field in
    kvm_vcpu_vcpu_first_run_init(), thus making sure that the MDCR_EL2 register
    has a consistent value after each vcpu_load().
    
    Fixes: d5a21bcc2995 ("KVM: arm64: Move common VHE/non-VHE trap config in separate functions")
    Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20210407144857.199746-3-alexandru.elisei@arm.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h
index 471859cbfe0b..ae073fceb3f0 100644
--- a/arch/arm/include/asm/kvm_host.h
+++ b/arch/arm/include/asm/kvm_host.h
@@ -303,6 +303,7 @@ static inline void kvm_arch_sched_in(struct kvm_vcpu *vcpu, int cpu) {}
 static inline void kvm_arch_vcpu_block_finish(struct kvm_vcpu *vcpu) {}
 
 static inline void kvm_arm_init_debug(void) {}
+static inline void kvm_arm_vcpu_init_debug(struct kvm_vcpu *vcpu) {}
 static inline void kvm_arm_setup_debug(struct kvm_vcpu *vcpu) {}
 static inline void kvm_arm_clear_debug(struct kvm_vcpu *vcpu) {}
 static inline void kvm_arm_reset_debug_ptr(struct kvm_vcpu *vcpu) {}
diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
index 151e69a93e34..07472c138ced 100644
--- a/arch/arm64/include/asm/kvm_host.h
+++ b/arch/arm64/include/asm/kvm_host.h
@@ -455,6 +455,7 @@ static inline void kvm_arch_sched_in(struct kvm_vcpu *vcpu, int cpu) {}
 static inline void kvm_arch_vcpu_block_finish(struct kvm_vcpu *vcpu) {}
 
 void kvm_arm_init_debug(void);
+void kvm_arm_vcpu_init_debug(struct kvm_vcpu *vcpu);
 void kvm_arm_setup_debug(struct kvm_vcpu *vcpu);
 void kvm_arm_clear_debug(struct kvm_vcpu *vcpu);
 void kvm_arm_reset_debug_ptr(struct kvm_vcpu *vcpu);
diff --git a/arch/arm64/kvm/debug.c b/arch/arm64/kvm/debug.c
index 3606f6b89094..7fe195ef7c3f 100644
--- a/arch/arm64/kvm/debug.c
+++ b/arch/arm64/kvm/debug.c
@@ -79,6 +79,64 @@ void kvm_arm_init_debug(void)
 	__this_cpu_write(mdcr_el2, kvm_call_hyp(__kvm_get_mdcr_el2));
 }
 
+/**
+ * kvm_arm_setup_mdcr_el2 - configure vcpu mdcr_el2 value
+ *
+ * @vcpu:	the vcpu pointer
+ *
+ * This ensures we will trap access to:
+ *  - Performance monitors (MDCR_EL2_TPM/MDCR_EL2_TPMCR)
+ *  - Debug ROM Address (MDCR_EL2_TDRA)
+ *  - OS related registers (MDCR_EL2_TDOSA)
+ *  - Statistical profiler (MDCR_EL2_TPMS/MDCR_EL2_E2PB)
+ *  - Self-hosted Trace Filter controls (MDCR_EL2_TTRF)
+ */
+static void kvm_arm_setup_mdcr_el2(struct kvm_vcpu *vcpu)
+{
+	/*
+	 * This also clears MDCR_EL2_E2PB_MASK to disable guest access
+	 * to the profiling buffer.
+	 */
+	vcpu->arch.mdcr_el2 = __this_cpu_read(mdcr_el2) & MDCR_EL2_HPMN_MASK;
+	vcpu->arch.mdcr_el2 |= (MDCR_EL2_TPM |
+				MDCR_EL2_TPMS |
+				MDCR_EL2_TTRF |
+				MDCR_EL2_TPMCR |
+				MDCR_EL2_TDRA |
+				MDCR_EL2_TDOSA);
+
+	/* Is the VM being debugged by userspace? */
+	if (vcpu->guest_debug)
+		/* Route all software debug exceptions to EL2 */
+		vcpu->arch.mdcr_el2 |= MDCR_EL2_TDE;
+
+	/*
+	 * Trap debug register access when one of the following is true:
+	 *  - Userspace is using the hardware to debug the guest
+	 *  (KVM_GUESTDBG_USE_HW is set).
+	 *  - The guest is not using debug (KVM_ARM64_DEBUG_DIRTY is clear).
+	 */
+	if ((vcpu->guest_debug & KVM_GUESTDBG_USE_HW) ||
+	    !(vcpu->arch.flags & KVM_ARM64_DEBUG_DIRTY))
+		vcpu->arch.mdcr_el2 |= MDCR_EL2_TDA;
+
+	trace_kvm_arm_set_dreg32("MDCR_EL2", vcpu->arch.mdcr_el2);
+}
+
+/**
+ * kvm_arm_vcpu_init_debug - setup vcpu debug traps
+ *
+ * @vcpu:	the vcpu pointer
+ *
+ * Set vcpu initial mdcr_el2 value.
+ */
+void kvm_arm_vcpu_init_debug(struct kvm_vcpu *vcpu)
+{
+	preempt_disable();
+	kvm_arm_setup_mdcr_el2(vcpu);
+	preempt_enable();
+}
+
 /**
  * kvm_arm_reset_debug_ptr - reset the debug ptr to point to the vcpu state
  */
@@ -94,13 +152,7 @@ void kvm_arm_reset_debug_ptr(struct kvm_vcpu *vcpu)
  * @vcpu:	the vcpu pointer
  *
  * This is called before each entry into the hypervisor to setup any
- * debug related registers. Currently this just ensures we will trap
- * access to:
- *  - Performance monitors (MDCR_EL2_TPM/MDCR_EL2_TPMCR)
- *  - Debug ROM Address (MDCR_EL2_TDRA)
- *  - OS related registers (MDCR_EL2_TDOSA)
- *  - Statistical profiler (MDCR_EL2_TPMS/MDCR_EL2_E2PB)
- *  - Self-hosted Trace Filter controls (MDCR_EL2_TTRF)
+ * debug related registers.
  *
  * Additionally, KVM only traps guest accesses to the debug registers if
  * the guest is not actively using them (see the KVM_ARM64_DEBUG_DIRTY
@@ -112,28 +164,14 @@ void kvm_arm_reset_debug_ptr(struct kvm_vcpu *vcpu)
 
 void kvm_arm_setup_debug(struct kvm_vcpu *vcpu)
 {
-	bool trap_debug = !(vcpu->arch.flags & KVM_ARM64_DEBUG_DIRTY);
 	unsigned long mdscr, orig_mdcr_el2 = vcpu->arch.mdcr_el2;
 
 	trace_kvm_arm_setup_debug(vcpu, vcpu->guest_debug);
 
-	/*
-	 * This also clears MDCR_EL2_E2PB_MASK to disable guest access
-	 * to the profiling buffer.
-	 */
-	vcpu->arch.mdcr_el2 = __this_cpu_read(mdcr_el2) & MDCR_EL2_HPMN_MASK;
-	vcpu->arch.mdcr_el2 |= (MDCR_EL2_TPM |
-				MDCR_EL2_TPMS |
-				MDCR_EL2_TTRF |
-				MDCR_EL2_TPMCR |
-				MDCR_EL2_TDRA |
-				MDCR_EL2_TDOSA);
+	kvm_arm_setup_mdcr_el2(vcpu);
 
 	/* Is Guest debugging in effect? */
 	if (vcpu->guest_debug) {
-		/* Route all software debug exceptions to EL2 */
-		vcpu->arch.mdcr_el2 |= MDCR_EL2_TDE;
-
 		/* Save guest debug state */
 		save_guest_debug_regs(vcpu);
 
@@ -187,7 +225,6 @@ void kvm_arm_setup_debug(struct kvm_vcpu *vcpu)
 
 			vcpu->arch.debug_ptr = &vcpu->arch.external_debug_state;
 			vcpu->arch.flags |= KVM_ARM64_DEBUG_DIRTY;
-			trap_debug = true;
 
 			trace_kvm_arm_set_regset("BKPTS", get_num_brps(),
 						&vcpu->arch.debug_ptr->dbg_bcr[0],
@@ -202,10 +239,6 @@ void kvm_arm_setup_debug(struct kvm_vcpu *vcpu)
 	BUG_ON(!vcpu->guest_debug &&
 		vcpu->arch.debug_ptr != &vcpu->arch.vcpu_debug_state);
 
-	/* Trap debug register access */
-	if (trap_debug)
-		vcpu->arch.mdcr_el2 |= MDCR_EL2_TDA;
-
 	/* If KDE or MDE are set, perform a full save/restore cycle. */
 	if (vcpu_read_sys_reg(vcpu, MDSCR_EL1) & (DBG_MDSCR_KDE | DBG_MDSCR_MDE))
 		vcpu->arch.flags |= KVM_ARM64_DEBUG_DIRTY;
@@ -214,7 +247,6 @@ void kvm_arm_setup_debug(struct kvm_vcpu *vcpu)
 	if (has_vhe() && orig_mdcr_el2 != vcpu->arch.mdcr_el2)
 		write_sysreg(vcpu->arch.mdcr_el2, mdcr_el2);
 
-	trace_kvm_arm_set_dreg32("MDCR_EL2", vcpu->arch.mdcr_el2);
 	trace_kvm_arm_set_dreg32("MDSCR_EL1", vcpu_read_sys_reg(vcpu, MDSCR_EL1));
 }
 
diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c
index d982650deb33..39706799ecdf 100644
--- a/virt/kvm/arm/arm.c
+++ b/virt/kvm/arm/arm.c
@@ -574,6 +574,8 @@ static int kvm_vcpu_first_run_init(struct kvm_vcpu *vcpu)
 
 	vcpu->arch.has_run_once = true;
 
+	kvm_arm_vcpu_init_debug(vcpu);
+
 	if (likely(irqchip_in_kernel(kvm))) {
 		/*
 		 * Map the VGIC hardware resources before running a vcpu the

commit c923258e341bec211b6945a2be2ce564762c7868
Author: Christoph Hellwig <hch@lst.de>
Date:   Wed Dec 4 09:33:52 2019 -0800

    iomap: fix sub-page uptodate handling
    
    commit 1cea335d1db1ce6ab71b3d2f94a807112b738a0f upstream.
    
    bio completions can race when a page spans more than one file system
    block.  Add a spinlock to synchronize marking the page uptodate.
    
    Fixes: 9dc55f1389f9 ("iomap: add support for sub-pagesize buffered I/O without buffer heads")
    Reported-by: Jan Stancek <jstancek@redhat.com>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Dave Chinner <dchinner@redhat.com>
    Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/iomap.c b/fs/iomap.c
index 03edf62633dc..ac7b2152c3ad 100644
--- a/fs/iomap.c
+++ b/fs/iomap.c
@@ -116,6 +116,7 @@ iomap_page_create(struct inode *inode, struct page *page)
 	iop = kmalloc(sizeof(*iop), GFP_NOFS | __GFP_NOFAIL);
 	atomic_set(&iop->read_count, 0);
 	atomic_set(&iop->write_count, 0);
+	spin_lock_init(&iop->uptodate_lock);
 	bitmap_zero(iop->uptodate, PAGE_SIZE / SECTOR_SIZE);
 
 	/*
@@ -204,25 +205,38 @@ iomap_adjust_read_range(struct inode *inode, struct iomap_page *iop,
 }
 
 static void
-iomap_set_range_uptodate(struct page *page, unsigned off, unsigned len)
+iomap_iop_set_range_uptodate(struct page *page, unsigned off, unsigned len)
 {
 	struct iomap_page *iop = to_iomap_page(page);
 	struct inode *inode = page->mapping->host;
 	unsigned first = off >> inode->i_blkbits;
 	unsigned last = (off + len - 1) >> inode->i_blkbits;
-	unsigned int i;
 	bool uptodate = true;
+	unsigned long flags;
+	unsigned int i;
 
-	if (iop) {
-		for (i = 0; i < PAGE_SIZE / i_blocksize(inode); i++) {
-			if (i >= first && i <= last)
-				set_bit(i, iop->uptodate);
-			else if (!test_bit(i, iop->uptodate))
-				uptodate = false;
-		}
+	spin_lock_irqsave(&iop->uptodate_lock, flags);
+	for (i = 0; i < PAGE_SIZE / i_blocksize(inode); i++) {
+		if (i >= first && i <= last)
+			set_bit(i, iop->uptodate);
+		else if (!test_bit(i, iop->uptodate))
+			uptodate = false;
 	}
 
-	if (uptodate && !PageError(page))
+	if (uptodate)
+		SetPageUptodate(page);
+	spin_unlock_irqrestore(&iop->uptodate_lock, flags);
+}
+
+static void
+iomap_set_range_uptodate(struct page *page, unsigned off, unsigned len)
+{
+	if (PageError(page))
+		return;
+
+	if (page_has_private(page))
+		iomap_iop_set_range_uptodate(page, off, len);
+	else
 		SetPageUptodate(page);
 }
 
diff --git a/include/linux/iomap.h b/include/linux/iomap.h
index 3555d54bf79a..e93ecacb5eaf 100644
--- a/include/linux/iomap.h
+++ b/include/linux/iomap.h
@@ -108,6 +108,7 @@ struct iomap_ops {
 struct iomap_page {
 	atomic_t		read_count;
 	atomic_t		write_count;
+	spinlock_t		uptodate_lock;
 	DECLARE_BITMAP(uptodate, PAGE_SIZE / 512);
 };
 

commit 867fd8d5613e0632712bdc15167d8ce9eb2c0f8b
Author: Eric Dumazet <edumazet@google.com>
Date:   Wed Mar 31 14:38:11 2021 -0700

    ipv6: remove extra dev_hold() for fallback tunnels
    
    commit 0d7a7b2014b1a499a0fe24c9f3063d7856b5aaaf upstream.
    
    My previous commits added a dev_hold() in tunnels ndo_init(),
    but forgot to remove it from special functions setting up fallback tunnels.
    
    Fallback tunnels do call their respective ndo_init()
    
    This leads to various reports like :
    
    unregister_netdevice: waiting for ip6gre0 to become free. Usage count = 2
    
    Fixes: 48bb5697269a ("ip6_tunnel: sit: proper dev_{hold|put} in ndo_[un]init methods")
    Fixes: 6289a98f0817 ("sit: proper dev_{hold|put} in ndo_[un]init methods")
    Fixes: 40cb881b5aaa ("ip6_vti: proper dev_{hold|put} in ndo_[un]init methods")
    Fixes: 7f700334be9a ("ip6_gre: proper dev_{hold|put} in ndo_[un]init methods")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c
index 6cbc6e979bed..043e57d08a3e 100644
--- a/net/ipv6/ip6_gre.c
+++ b/net/ipv6/ip6_gre.c
@@ -392,7 +392,6 @@ static struct ip6_tnl *ip6gre_tunnel_locate(struct net *net,
 	if (!(nt->parms.o_flags & TUNNEL_SEQ))
 		dev->features |= NETIF_F_LLTX;
 
-	dev_hold(dev);
 	ip6gre_tunnel_link(ign, nt);
 	return nt;
 
@@ -1546,8 +1545,6 @@ static void ip6gre_fb_tunnel_init(struct net_device *dev)
 	strcpy(tunnel->parms.name, dev->name);
 
 	tunnel->hlen		= sizeof(struct ipv6hdr) + 4;
-
-	dev_hold(dev);
 }
 
 static struct inet6_protocol ip6gre_protocol __read_mostly = {
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
index 45c4c30d9806..35c127c3eee7 100644
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -1909,7 +1909,6 @@ static int __net_init ip6_fb_tnl_dev_init(struct net_device *dev)
 	struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id);
 
 	t->parms.proto = IPPROTO_IPV6;
-	dev_hold(dev);
 
 	rcu_assign_pointer(ip6n->tnls_wc[0], t);
 	return 0;
diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c
index defa04b38ee8..290badfe70e0 100644
--- a/net/ipv6/ip6_vti.c
+++ b/net/ipv6/ip6_vti.c
@@ -956,7 +956,6 @@ static int __net_init vti6_fb_tnl_dev_init(struct net_device *dev)
 	struct vti6_net *ip6n = net_generic(net, vti6_net_id);
 
 	t->parms.proto = IPPROTO_IPV6;
-	dev_hold(dev);
 
 	rcu_assign_pointer(ip6n->tnls_wc[0], t);
 	return 0;
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c
index c77e9b02ac00..4a49200d0d11 100644
--- a/net/ipv6/sit.c
+++ b/net/ipv6/sit.c
@@ -1421,7 +1421,6 @@ static void __net_init ipip6_fb_tunnel_init(struct net_device *dev)
 	iph->ihl		= 5;
 	iph->ttl		= 64;
 
-	dev_hold(dev);
 	rcu_assign_pointer(sitn->tunnels_wc[0], tunnel);
 }
 

commit 873d5de7f7477a5c7258a9dc3967053f466257a2
Author: Eric Dumazet <edumazet@google.com>
Date:   Mon Mar 29 23:45:51 2021 -0700

    ip6_tunnel: sit: proper dev_{hold|put} in ndo_[un]init methods
    
    commit 48bb5697269a7cbe5194dbb044dc38c517e34c58 upstream.
    
    Same reasons than for the previous commits :
    6289a98f0817 ("sit: proper dev_{hold|put} in ndo_[un]init methods")
    40cb881b5aaa ("ip6_vti: proper dev_{hold|put} in ndo_[un]init methods")
    7f700334be9a ("ip6_gre: proper dev_{hold|put} in ndo_[un]init methods")
    
    After adopting CONFIG_PCPU_DEV_REFCNT=n option, syzbot was able to trigger
    a warning [1]
    
    Issue here is that:
    
    - all dev_put() should be paired with a corresponding prior dev_hold().
    
    - A driver doing a dev_put() in its ndo_uninit() MUST also
      do a dev_hold() in its ndo_init(), only when ndo_init()
      is returning 0.
    
    Otherwise, register_netdevice() would call ndo_uninit()
    in its error path and release a refcount too soon.
    
    [1]
    WARNING: CPU: 1 PID: 21059 at lib/refcount.c:31 refcount_warn_saturate+0xbf/0x1e0 lib/refcount.c:31
    Modules linked in:
    CPU: 1 PID: 21059 Comm: syz-executor.4 Not tainted 5.12.0-rc4-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    RIP: 0010:refcount_warn_saturate+0xbf/0x1e0 lib/refcount.c:31
    Code: 1d 6a 5a e8 09 31 ff 89 de e8 8d 1a ab fd 84 db 75 e0 e8 d4 13 ab fd 48 c7 c7 a0 e1 c1 89 c6 05 4a 5a e8 09 01 e8 2e 36 fb 04 <0f> 0b eb c4 e8 b8 13 ab fd 0f b6 1d 39 5a e8 09 31 ff 89 de e8 58
    RSP: 0018:ffffc900025aefe8 EFLAGS: 00010282
    RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
    RDX: 0000000000040000 RSI: ffffffff815c51f5 RDI: fffff520004b5def
    RBP: 0000000000000004 R08: 0000000000000000 R09: 0000000000000000
    R10: ffffffff815bdf8e R11: 0000000000000000 R12: ffff888023488568
    R13: ffff8880254e9000 R14: 00000000dfd82cfd R15: ffff88802ee2d7c0
    FS:  00007f13bc590700(0000) GS:ffff8880b9c00000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007f0943e74000 CR3: 0000000025273000 CR4: 00000000001506f0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
     __refcount_dec include/linux/refcount.h:344 [inline]
     refcount_dec include/linux/refcount.h:359 [inline]
     dev_put include/linux/netdevice.h:4135 [inline]
     ip6_tnl_dev_uninit+0x370/0x3d0 net/ipv6/ip6_tunnel.c:387
     register_netdevice+0xadf/0x1500 net/core/dev.c:10308
     ip6_tnl_create2+0x1b5/0x400 net/ipv6/ip6_tunnel.c:263
     ip6_tnl_newlink+0x312/0x580 net/ipv6/ip6_tunnel.c:2052
     __rtnl_newlink+0x1062/0x1710 net/core/rtnetlink.c:3443
     rtnl_newlink+0x64/0xa0 net/core/rtnetlink.c:3491
     rtnetlink_rcv_msg+0x44e/0xad0 net/core/rtnetlink.c:5553
     netlink_rcv_skb+0x153/0x420 net/netlink/af_netlink.c:2502
     netlink_unicast_kernel net/netlink/af_netlink.c:1312 [inline]
     netlink_unicast+0x533/0x7d0 net/netlink/af_netlink.c:1338
     netlink_sendmsg+0x856/0xd90 net/netlink/af_netlink.c:1927
     sock_sendmsg_nosec net/socket.c:654 [inline]
     sock_sendmsg+0xcf/0x120 net/socket.c:674
     ____sys_sendmsg+0x6e8/0x810 net/socket.c:2350
     ___sys_sendmsg+0xf3/0x170 net/socket.c:2404
     __sys_sendmsg+0xe5/0x1b0 net/socket.c:2433
     do_syscall_64+0x2d/0x70 arch/x86/entry/common.c:46
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Fixes: 919067cc845f ("net: add CONFIG_PCPU_DEV_REFCNT")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
index 28c4a693ab98..45c4c30d9806 100644
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -272,7 +272,6 @@ static int ip6_tnl_create2(struct net_device *dev)
 
 	strcpy(t->parms.name, dev->name);
 
-	dev_hold(dev);
 	ip6_tnl_link(ip6n, t);
 	return 0;
 
@@ -1866,6 +1865,7 @@ ip6_tnl_dev_init_gen(struct net_device *dev)
 	dev->min_mtu = ETH_MIN_MTU;
 	dev->max_mtu = IP6_MAX_MTU - dev->hard_header_len;
 
+	dev_hold(dev);
 	return 0;
 
 destroy_dst:

commit 01cc9ab6fdf1ddb0a5355196557b95819788f9bb
Author: Eric Dumazet <edumazet@google.com>
Date:   Mon Mar 29 12:25:22 2021 -0700

    sit: proper dev_{hold|put} in ndo_[un]init methods
    
    commit 6289a98f0817a4a457750d6345e754838eae9439 upstream.
    
    After adopting CONFIG_PCPU_DEV_REFCNT=n option, syzbot was able to trigger
    a warning [1]
    
    Issue here is that:
    
    - all dev_put() should be paired with a corresponding prior dev_hold().
    
    - A driver doing a dev_put() in its ndo_uninit() MUST also
      do a dev_hold() in its ndo_init(), only when ndo_init()
      is returning 0.
    
    Otherwise, register_netdevice() would call ndo_uninit()
    in its error path and release a refcount too soon.
    
    Fixes: 919067cc845f ("net: add CONFIG_PCPU_DEV_REFCNT")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c
index ad737b68b8e9..c77e9b02ac00 100644
--- a/net/ipv6/sit.c
+++ b/net/ipv6/sit.c
@@ -215,8 +215,6 @@ static int ipip6_tunnel_create(struct net_device *dev)
 
 	ipip6_tunnel_clone_6rd(dev, sitn);
 
-	dev_hold(dev);
-
 	ipip6_tunnel_link(sitn, t);
 	return 0;
 
@@ -1407,7 +1405,7 @@ static int ipip6_tunnel_init(struct net_device *dev)
 		dev->tstats = NULL;
 		return err;
 	}
-
+	dev_hold(dev);
 	return 0;
 }
 

commit 2dc72d6a7f0e8b2eff9f17959157cf50618bc1ca
Author: Eric Dumazet <edumazet@google.com>
Date:   Mon Mar 29 11:39:51 2021 -0700

    ip6_gre: proper dev_{hold|put} in ndo_[un]init methods
    
    commit 7f700334be9aeb91d5d86ef9ad2d901b9b453e9b upstream.
    
    After adopting CONFIG_PCPU_DEV_REFCNT=n option, syzbot was able to trigger
    a warning [1]
    
    Issue here is that:
    
    - all dev_put() should be paired with a corresponding dev_hold(),
      and vice versa.
    
    - A driver doing a dev_put() in its ndo_uninit() MUST also
      do a dev_hold() in its ndo_init(), only when ndo_init()
      is returning 0.
    
    Otherwise, register_netdevice() would call ndo_uninit()
    in its error path and release a refcount too soon.
    
    ip6_gre for example (among others problematic drivers)
    has to use dev_hold() in ip6gre_tunnel_init_common()
    instead of from ip6gre_newlink_common(), covering
    both ip6gre_tunnel_init() and ip6gre_tap_init()/
    
    Note that ip6gre_tunnel_init_common() is not called from
    ip6erspan_tap_init() thus we also need to add a dev_hold() there,
    as ip6erspan_tunnel_uninit() does call dev_put()
    
    [1]
    refcount_t: decrement hit 0; leaking memory.
    WARNING: CPU: 0 PID: 8422 at lib/refcount.c:31 refcount_warn_saturate+0xbf/0x1e0 lib/refcount.c:31
    Modules linked in:
    CPU: 1 PID: 8422 Comm: syz-executor854 Not tainted 5.12.0-rc4-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    RIP: 0010:refcount_warn_saturate+0xbf/0x1e0 lib/refcount.c:31
    Code: 1d 6a 5a e8 09 31 ff 89 de e8 8d 1a ab fd 84 db 75 e0 e8 d4 13 ab fd 48 c7 c7 a0 e1 c1 89 c6 05 4a 5a e8 09 01 e8 2e 36 fb 04 <0f> 0b eb c4 e8 b8 13 ab fd 0f b6 1d 39 5a e8 09 31 ff 89 de e8 58
    RSP: 0018:ffffc900018befd0 EFLAGS: 00010282
    RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
    RDX: ffff88801ef19c40 RSI: ffffffff815c51f5 RDI: fffff52000317dec
    RBP: 0000000000000004 R08: 0000000000000000 R09: 0000000000000000
    R10: ffffffff815bdf8e R11: 0000000000000000 R12: ffff888018cf4568
    R13: ffff888018cf4c00 R14: ffff8880228f2000 R15: ffffffff8d659b80
    FS:  00000000014eb300(0000) GS:ffff8880b9c00000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 000055d7bf2b3138 CR3: 0000000014933000 CR4: 00000000001506f0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
     __refcount_dec include/linux/refcount.h:344 [inline]
     refcount_dec include/linux/refcount.h:359 [inline]
     dev_put include/linux/netdevice.h:4135 [inline]
     ip6gre_tunnel_uninit+0x3d7/0x440 net/ipv6/ip6_gre.c:420
     register_netdevice+0xadf/0x1500 net/core/dev.c:10308
     ip6gre_newlink_common.constprop.0+0x158/0x410 net/ipv6/ip6_gre.c:1984
     ip6gre_newlink+0x275/0x7a0 net/ipv6/ip6_gre.c:2017
     __rtnl_newlink+0x1062/0x1710 net/core/rtnetlink.c:3443
     rtnl_newlink+0x64/0xa0 net/core/rtnetlink.c:3491
     rtnetlink_rcv_msg+0x44e/0xad0 net/core/rtnetlink.c:5553
     netlink_rcv_skb+0x153/0x420 net/netlink/af_netlink.c:2502
     netlink_unicast_kernel net/netlink/af_netlink.c:1312 [inline]
     netlink_unicast+0x533/0x7d0 net/netlink/af_netlink.c:1338
     netlink_sendmsg+0x856/0xd90 net/netlink/af_netlink.c:1927
     sock_sendmsg_nosec net/socket.c:654 [inline]
     sock_sendmsg+0xcf/0x120 net/socket.c:674
     ____sys_sendmsg+0x6e8/0x810 net/socket.c:2350
     ___sys_sendmsg+0xf3/0x170 net/socket.c:2404
     __sys_sendmsg+0xe5/0x1b0 net/socket.c:2433
     do_syscall_64+0x2d/0x70 arch/x86/entry/common.c:46
    
    Fixes: 919067cc845f ("net: add CONFIG_PCPU_DEV_REFCNT")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c
index 86c8ea7d7006..6cbc6e979bed 100644
--- a/net/ipv6/ip6_gre.c
+++ b/net/ipv6/ip6_gre.c
@@ -1503,6 +1503,7 @@ static int ip6gre_tunnel_init_common(struct net_device *dev)
 	}
 	ip6gre_tnl_init_features(dev);
 
+	dev_hold(dev);
 	return 0;
 
 cleanup_dst_cache_init:
@@ -1896,6 +1897,7 @@ static int ip6erspan_tap_init(struct net_device *dev)
 	dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
 	ip6erspan_tnl_link_config(tunnel, 1);
 
+	dev_hold(dev);
 	return 0;
 
 cleanup_dst_cache_init:
@@ -2001,8 +2003,6 @@ static int ip6gre_newlink_common(struct net *src_net, struct net_device *dev,
 	if (tb[IFLA_MTU])
 		ip6_tnl_change_mtu(dev, nla_get_u32(tb[IFLA_MTU]));
 
-	dev_hold(dev);
-
 out:
 	return err;
 }

commit a03ed6e6dd0321a7e501f66c912c986e3f4f03f8
Author: Yannick Vignon <yannick.vignon@nxp.com>
Date:   Thu May 6 16:33:12 2021 +0200

    net: stmmac: Do not enable RX FIFO overflow interrupts
    
    [ Upstream commit 8a7cb245cf28cb3e541e0d6c8624b95d079e155b ]
    
    The RX FIFO overflows when the system is not able to process all received
    packets and they start accumulating (first in the DMA queue in memory,
    then in the FIFO). An interrupt is then raised for each overflowing packet
    and handled in stmmac_interrupt(). This is counter-productive, since it
    brings the system (or more likely, one CPU core) to its knees to process
    the FIFO overflow interrupts.
    
    stmmac_interrupt() handles overflow interrupts by writing the rx tail ptr
    into the corresponding hardware register (according to the MAC spec, this
    has the effect of restarting the MAC DMA). However, without freeing any rx
    descriptors, the DMA stops right away, and another overflow interrupt is
    raised as the FIFO overflows again. Since the DMA is already restarted at
    the end of stmmac_rx_refill() after freeing descriptors, disabling FIFO
    overflow interrupts and the corresponding handling code has no side effect,
    and eliminates the interrupt storm when the RX FIFO overflows.
    
    Signed-off-by: Yannick Vignon <yannick.vignon@nxp.com>
    Link: https://lore.kernel.org/r/20210506143312.20784-1-yannick.vignon@oss.nxp.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c
index 8c3780d1105f..232efe17ac2c 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c
@@ -214,7 +214,7 @@ static void dwmac4_dma_rx_chan_op_mode(void __iomem *ioaddr, int mode,
 				       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));
 
@@ -285,11 +285,6 @@ static void dwmac4_dma_rx_chan_op_mode(void __iomem *ioaddr, int mode,
 	}
 
 	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,
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index a1443d7197e8..af59761ddfa0 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -3706,7 +3706,6 @@ static irqreturn_t stmmac_interrupt(int irq, void *dev_id)
 	/* 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 */
@@ -3717,17 +3716,8 @@ static irqreturn_t stmmac_interrupt(int irq, void *dev_id)
 		}
 
 		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 */

commit b5cc577751afb1739ba78886ed7c76f7c9a7698e
Author: Zqiang <qiang.zhang@windriver.com>
Date:   Thu May 6 18:03:40 2021 -0700

    lib: stackdepot: turn depot_lock spinlock to raw_spinlock
    
    [ Upstream commit 78564b9434878d686c5f88c4488b20cccbcc42bc ]
    
    In RT system, the spin_lock will be replaced by sleepable rt_mutex lock,
    in __call_rcu(), disable interrupts before calling
    kasan_record_aux_stack(), will trigger this calltrace:
    
      BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:951
      in_atomic(): 0, irqs_disabled(): 1, non_block: 0, pid: 19, name: pgdatinit0
      Call Trace:
        ___might_sleep.cold+0x1b2/0x1f1
        rt_spin_lock+0x3b/0xb0
        stack_depot_save+0x1b9/0x440
        kasan_save_stack+0x32/0x40
        kasan_record_aux_stack+0xa5/0xb0
        __call_rcu+0x117/0x880
        __exit_signal+0xafb/0x1180
        release_task+0x1d6/0x480
        exit_notify+0x303/0x750
        do_exit+0x678/0xcf0
        kthread+0x364/0x4f0
        ret_from_fork+0x22/0x30
    
    Replace spinlock with raw_spinlock.
    
    Link: https://lkml.kernel.org/r/20210329084009.27013-1-qiang.zhang@windriver.com
    Signed-off-by: Zqiang <qiang.zhang@windriver.com>
    Reported-by: Andrew Halaney <ahalaney@redhat.com>
    Cc: Alexander Potapenko <glider@google.com>
    Cc: Gustavo A. R. Silva <gustavoars@kernel.org>
    Cc: Vijayanand Jitta <vjitta@codeaurora.org>
    Cc: Vinayak Menon <vinmenon@codeaurora.org>
    Cc: Yogesh Lal <ylal@codeaurora.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/lib/stackdepot.c b/lib/stackdepot.c
index 3376a3291186..d0f1b7d0ce2e 100644
--- a/lib/stackdepot.c
+++ b/lib/stackdepot.c
@@ -78,7 +78,7 @@ static void *stack_slabs[STACK_ALLOC_MAX_SLABS];
 static int depot_index;
 static int next_slab_inited;
 static size_t depot_offset;
-static DEFINE_SPINLOCK(depot_lock);
+static DEFINE_RAW_SPINLOCK(depot_lock);
 
 static bool init_stack_slab(void **prealloc)
 {
@@ -266,7 +266,7 @@ depot_stack_handle_t depot_save_stack(struct stack_trace *trace,
 			prealloc = page_address(page);
 	}
 
-	spin_lock_irqsave(&depot_lock, flags);
+	raw_spin_lock_irqsave(&depot_lock, flags);
 
 	found = find_stack(*bucket, trace->entries, trace->nr_entries, hash);
 	if (!found) {
@@ -290,7 +290,7 @@ depot_stack_handle_t depot_save_stack(struct stack_trace *trace,
 		WARN_ON(!init_stack_slab(&prealloc));
 	}
 
-	spin_unlock_irqrestore(&depot_lock, flags);
+	raw_spin_unlock_irqrestore(&depot_lock, flags);
 exit:
 	if (prealloc) {
 		/* Nobody used this memory, ok to free it. */

commit b9bcbc3c743c46bead89dffe4283ff7cd9e118bf
Author: yangerkun <yangerkun@huawei.com>
Date:   Thu Apr 1 15:18:07 2021 +0800

    block: reexpand iov_iter after read/write
    
    [ Upstream commit cf7b39a0cbf6bf57aa07a008d46cf695add05b4c ]
    
    We get a bug:
    
    BUG: KASAN: slab-out-of-bounds in iov_iter_revert+0x11c/0x404
    lib/iov_iter.c:1139
    Read of size 8 at addr ffff0000d3fb11f8 by task
    
    CPU: 0 PID: 12582 Comm: syz-executor.2 Not tainted
    5.10.0-00843-g352c8610ccd2 #2
    Hardware name: linux,dummy-virt (DT)
    Call trace:
     dump_backtrace+0x0/0x2d0 arch/arm64/kernel/stacktrace.c:132
     show_stack+0x28/0x34 arch/arm64/kernel/stacktrace.c:196
     __dump_stack lib/dump_stack.c:77 [inline]
     dump_stack+0x110/0x164 lib/dump_stack.c:118
     print_address_description+0x78/0x5c8 mm/kasan/report.c:385
     __kasan_report mm/kasan/report.c:545 [inline]
     kasan_report+0x148/0x1e4 mm/kasan/report.c:562
     check_memory_region_inline mm/kasan/generic.c:183 [inline]
     __asan_load8+0xb4/0xbc mm/kasan/generic.c:252
     iov_iter_revert+0x11c/0x404 lib/iov_iter.c:1139
     io_read fs/io_uring.c:3421 [inline]
     io_issue_sqe+0x2344/0x2d64 fs/io_uring.c:5943
     __io_queue_sqe+0x19c/0x520 fs/io_uring.c:6260
     io_queue_sqe+0x2a4/0x590 fs/io_uring.c:6326
     io_submit_sqe fs/io_uring.c:6395 [inline]
     io_submit_sqes+0x4c0/0xa04 fs/io_uring.c:6624
     __do_sys_io_uring_enter fs/io_uring.c:9013 [inline]
     __se_sys_io_uring_enter fs/io_uring.c:8960 [inline]
     __arm64_sys_io_uring_enter+0x190/0x708 fs/io_uring.c:8960
     __invoke_syscall arch/arm64/kernel/syscall.c:36 [inline]
     invoke_syscall arch/arm64/kernel/syscall.c:48 [inline]
     el0_svc_common arch/arm64/kernel/syscall.c:158 [inline]
     do_el0_svc+0x120/0x290 arch/arm64/kernel/syscall.c:227
     el0_svc+0x1c/0x28 arch/arm64/kernel/entry-common.c:367
     el0_sync_handler+0x98/0x170 arch/arm64/kernel/entry-common.c:383
     el0_sync+0x140/0x180 arch/arm64/kernel/entry.S:670
    
    Allocated by task 12570:
     stack_trace_save+0x80/0xb8 kernel/stacktrace.c:121
     kasan_save_stack mm/kasan/common.c:48 [inline]
     kasan_set_track mm/kasan/common.c:56 [inline]
     __kasan_kmalloc+0xdc/0x120 mm/kasan/common.c:461
     kasan_kmalloc+0xc/0x14 mm/kasan/common.c:475
     __kmalloc+0x23c/0x334 mm/slub.c:3970
     kmalloc include/linux/slab.h:557 [inline]
     __io_alloc_async_data+0x68/0x9c fs/io_uring.c:3210
     io_setup_async_rw fs/io_uring.c:3229 [inline]
     io_read fs/io_uring.c:3436 [inline]
     io_issue_sqe+0x2954/0x2d64 fs/io_uring.c:5943
     __io_queue_sqe+0x19c/0x520 fs/io_uring.c:6260
     io_queue_sqe+0x2a4/0x590 fs/io_uring.c:6326
     io_submit_sqe fs/io_uring.c:6395 [inline]
     io_submit_sqes+0x4c0/0xa04 fs/io_uring.c:6624
     __do_sys_io_uring_enter fs/io_uring.c:9013 [inline]
     __se_sys_io_uring_enter fs/io_uring.c:8960 [inline]
     __arm64_sys_io_uring_enter+0x190/0x708 fs/io_uring.c:8960
     __invoke_syscall arch/arm64/kernel/syscall.c:36 [inline]
     invoke_syscall arch/arm64/kernel/syscall.c:48 [inline]
     el0_svc_common arch/arm64/kernel/syscall.c:158 [inline]
     do_el0_svc+0x120/0x290 arch/arm64/kernel/syscall.c:227
     el0_svc+0x1c/0x28 arch/arm64/kernel/entry-common.c:367
     el0_sync_handler+0x98/0x170 arch/arm64/kernel/entry-common.c:383
     el0_sync+0x140/0x180 arch/arm64/kernel/entry.S:670
    
    Freed by task 12570:
     stack_trace_save+0x80/0xb8 kernel/stacktrace.c:121
     kasan_save_stack mm/kasan/common.c:48 [inline]
     kasan_set_track+0x38/0x6c mm/kasan/common.c:56
     kasan_set_free_info+0x20/0x40 mm/kasan/generic.c:355
     __kasan_slab_free+0x124/0x150 mm/kasan/common.c:422
     kasan_slab_free+0x10/0x1c mm/kasan/common.c:431
     slab_free_hook mm/slub.c:1544 [inline]
     slab_free_freelist_hook mm/slub.c:1577 [inline]
     slab_free mm/slub.c:3142 [inline]
     kfree+0x104/0x38c mm/slub.c:4124
     io_dismantle_req fs/io_uring.c:1855 [inline]
     __io_free_req+0x70/0x254 fs/io_uring.c:1867
     io_put_req_find_next fs/io_uring.c:2173 [inline]
     __io_queue_sqe+0x1fc/0x520 fs/io_uring.c:6279
     __io_req_task_submit+0x154/0x21c fs/io_uring.c:2051
     io_req_task_submit+0x2c/0x44 fs/io_uring.c:2063
     task_work_run+0xdc/0x128 kernel/task_work.c:151
     get_signal+0x6f8/0x980 kernel/signal.c:2562
     do_signal+0x108/0x3a4 arch/arm64/kernel/signal.c:658
     do_notify_resume+0xbc/0x25c arch/arm64/kernel/signal.c:722
     work_pending+0xc/0x180
    
    blkdev_read_iter can truncate iov_iter's count since the count + pos may
    exceed the size of the blkdev. This will confuse io_read that we have
    consume the iovec. And once we do the iov_iter_revert in io_read, we
    will trigger the slab-out-of-bounds. Fix it by reexpand the count with
    size has been truncated.
    
    blkdev_write_iter can trigger the problem too.
    
    Signed-off-by: yangerkun <yangerkun@huawei.com>
    Acked-by: Pavel Begunkov <asml.silencec@gmail.com>
    Link: https://lore.kernel.org/r/20210401071807.3328235-1-yangerkun@huawei.com
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/block_dev.c b/fs/block_dev.c
index 9f3faac49025..b34f76af59c4 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1919,6 +1919,7 @@ ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)
 	struct inode *bd_inode = bdev_file_inode(file);
 	loff_t size = i_size_read(bd_inode);
 	struct blk_plug plug;
+	size_t shorted = 0;
 	ssize_t ret;
 
 	if (bdev_read_only(I_BDEV(bd_inode)))
@@ -1933,12 +1934,17 @@ ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)
 	if ((iocb->ki_flags & (IOCB_NOWAIT | IOCB_DIRECT)) == IOCB_NOWAIT)
 		return -EOPNOTSUPP;
 
-	iov_iter_truncate(from, size - iocb->ki_pos);
+	size -= iocb->ki_pos;
+	if (iov_iter_count(from) > size) {
+		shorted = iov_iter_count(from) - size;
+		iov_iter_truncate(from, size);
+	}
 
 	blk_start_plug(&plug);
 	ret = __generic_file_write_iter(iocb, from);
 	if (ret > 0)
 		ret = generic_write_sync(iocb, ret);
+	iov_iter_reexpand(from, iov_iter_count(from) + shorted);
 	blk_finish_plug(&plug);
 	return ret;
 }
@@ -1950,13 +1956,21 @@ ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to)
 	struct inode *bd_inode = bdev_file_inode(file);
 	loff_t size = i_size_read(bd_inode);
 	loff_t pos = iocb->ki_pos;
+	size_t shorted = 0;
+	ssize_t ret;
 
 	if (pos >= size)
 		return 0;
 
 	size -= pos;
-	iov_iter_truncate(to, size);
-	return generic_file_read_iter(iocb, to);
+	if (iov_iter_count(to) > size) {
+		shorted = iov_iter_count(to) - size;
+		iov_iter_truncate(to, size);
+	}
+
+	ret = generic_file_read_iter(iocb, to);
+	iov_iter_reexpand(to, iov_iter_count(to) + shorted);
+	return ret;
 }
 EXPORT_SYMBOL_GPL(blkdev_read_iter);
 

commit c117fcb342841cc55493d1ca5ffa3601bbff0074
Author: Hui Wang <hui.wang@canonical.com>
Date:   Tue May 4 15:39:17 2021 +0800

    ALSA: hda: generic: change the DAC ctl name for LO+SPK or LO+HP
    
    [ Upstream commit f48652bbe3ae62ba2835a396b7e01f063e51c4cd ]
    
    Without this change, the DAC ctl's name could be changed only when
    the machine has both Speaker and Headphone, but we met some machines
    which only has Lineout and Headhpone, and the Lineout and Headphone
    share the Audio Mixer0 and DAC0, the ctl's name is set to "Front".
    
    On most of machines, the "Front" is used for Speaker only or Lineout
    only, but on this machine it is shared by Lineout and Headphone,
    This introduces an issue in the pipewire and pulseaudio, suppose users
    want the Headphone to be on and the Speaker/Lineout to be off, they
    could turn off the "Front", this works on most of the machines, but on
    this machine, the "Front" couldn't be turned off otherwise the
    headphone will be off too. Here we do some change to let the ctl's
    name change to "Headphone+LO" on this machine, and pipewire and
    pulseaudio already could handle "Headphone+LO" and "Speaker+LO".
    (https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/747)
    
    BugLink: http://bugs.launchpad.net/bugs/804178
    Signed-off-by: Hui Wang <hui.wang@canonical.com>
    Link: https://lore.kernel.org/r/20210504073917.22406-1-hui.wang@canonical.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c
index b9f7b23ae378..6099a9f1cb3d 100644
--- a/sound/pci/hda/hda_generic.c
+++ b/sound/pci/hda/hda_generic.c
@@ -1214,11 +1214,17 @@ static const char *get_line_out_pfx(struct hda_codec *codec, int ch,
 		*index = ch;
 		return "Headphone";
 	case AUTO_PIN_LINE_OUT:
-		/* This deals with the case where we have two DACs and
-		 * one LO, one HP and one Speaker */
-		if (!ch && cfg->speaker_outs && cfg->hp_outs) {
-			bool hp_lo_shared = !path_has_mixer(codec, spec->hp_paths[0], ctl_type);
-			bool spk_lo_shared = !path_has_mixer(codec, spec->speaker_paths[0], ctl_type);
+		/* This deals with the case where one HP or one Speaker or
+		 * one HP + one Speaker need to share the DAC with LO
+		 */
+		if (!ch) {
+			bool hp_lo_shared = false, spk_lo_shared = false;
+
+			if (cfg->speaker_outs)
+				spk_lo_shared = !path_has_mixer(codec,
+								spec->speaker_paths[0],	ctl_type);
+			if (cfg->hp_outs)
+				hp_lo_shared = !path_has_mixer(codec, spec->hp_paths[0], ctl_type);
 			if (hp_lo_shared && spk_lo_shared)
 				return spec->vmaster_mute.hook ? "PCM" : "Master";
 			if (hp_lo_shared)

commit 6da8d5e13f8a8d9c6b9736348e473abaf0256d9d
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Thu Apr 1 18:27:40 2021 +0200

    gpiolib: acpi: Add quirk to ignore EC wakeups on Dell Venue 10 Pro 5055
    
    [ Upstream commit da91ece226729c76f60708efc275ebd4716ad089 ]
    
    Like some other Bay and Cherry Trail SoC based devices the Dell Venue
    10 Pro 5055 has an embedded-controller which uses ACPI GPIO events to
    report events instead of using the standard ACPI EC interface for this.
    
    The EC interrupt is only used to report battery-level changes and
    it keeps doing this while the system is suspended, causing the system
    to not stay suspended.
    
    Add an ignore-wake quirk for the GPIO pin used by the EC to fix the
    spurious wakeups from suspend.
    
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Acked-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c
index 4ad34c6803ad..b018909a4e46 100644
--- a/drivers/gpio/gpiolib-acpi.c
+++ b/drivers/gpio/gpiolib-acpi.c
@@ -1355,6 +1355,20 @@ static const struct dmi_system_id gpiolib_acpi_quirks[] = {
 			.no_edge_events_on_boot = true,
 		},
 	},
+	{
+		/*
+		 * The Dell Venue 10 Pro 5055, with Bay Trail SoC + TI PMIC uses an
+		 * external embedded-controller connected via I2C + an ACPI GPIO
+		 * event handler on INT33FFC:02 pin 12, causing spurious wakeups.
+		 */
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+			DMI_MATCH(DMI_PRODUCT_NAME, "Venue 10 Pro 5055"),
+		},
+		.driver_data = &(struct acpi_gpiolib_dmi_quirk) {
+			.ignore_wake = "INT33FC:02@12",
+		},
+	},
 	{
 		/*
 		 * HP X2 10 models with Cherry Trail SoC + TI PMIC use an

commit 84d29b2fb3caf42d0bb0907a0ba01fa111ff4791
Author: Bodo Stroesser <bostroesser@gmail.com>
Date:   Fri Apr 23 17:01:23 2021 +0200

    scsi: target: tcmu: Return from tcmu_handle_completions() if cmd_id not found
    
    [ Upstream commit 9814b55cde0588b6d9bc496cee43f87316cbc6f1 ]
    
    If tcmu_handle_completions() finds an invalid cmd_id while looping over cmd
    responses from userspace it sets TCMU_DEV_BIT_BROKEN and breaks the
    loop. This means that it does further handling for the tcmu device.
    
    Skip that handling by replacing 'break' with 'return'.
    
    Additionally change tcmu_handle_completions() from unsigned int to bool,
    since the value used in return already is bool.
    
    Link: https://lore.kernel.org/r/20210423150123.24468-1-bostroesser@gmail.com
    Signed-off-by: Bodo Stroesser <bostroesser@gmail.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c
index 0219b5a865be..dd7307375504 100644
--- a/drivers/target/target_core_user.c
+++ b/drivers/target/target_core_user.c
@@ -1216,7 +1216,7 @@ static void tcmu_set_next_deadline(struct list_head *queue,
 		del_timer(timer);
 }
 
-static unsigned int tcmu_handle_completions(struct tcmu_dev *udev)
+static bool tcmu_handle_completions(struct tcmu_dev *udev)
 {
 	struct tcmu_mailbox *mb;
 	struct tcmu_cmd *cmd;
@@ -1256,7 +1256,7 @@ static unsigned int tcmu_handle_completions(struct tcmu_dev *udev)
 			pr_err("cmd_id %u not found, ring is broken\n",
 			       entry->hdr.cmd_id);
 			set_bit(TCMU_DEV_BIT_BROKEN, &udev->flags);
-			break;
+			return false;
 		}
 
 		tcmu_handle_completion(cmd, entry);

commit 3b96a0c8684b8926a62230f919b64c18a9e583fd
Author: Jeff Layton <jlayton@kernel.org>
Date:   Thu Jan 21 18:05:37 2021 -0500

    ceph: fix fscache invalidation
    
    [ Upstream commit 10a7052c7868bc7bc72d947f5aac6f768928db87 ]
    
    Ensure that we invalidate the fscache whenever we invalidate the
    pagecache.
    
    Signed-off-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
index 6e871a382209..918781c51f0b 100644
--- a/fs/ceph/caps.c
+++ b/fs/ceph/caps.c
@@ -1779,6 +1779,7 @@ static int try_nonblocking_invalidate(struct inode *inode)
 	u32 invalidating_gen = ci->i_rdcache_gen;
 
 	spin_unlock(&ci->i_ceph_lock);
+	ceph_fscache_invalidate(inode);
 	invalidate_mapping_pages(&inode->i_data, 0, -1);
 	spin_lock(&ci->i_ceph_lock);
 
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
index 3c24fb77ef32..5f041fede7aa 100644
--- a/fs/ceph/inode.c
+++ b/fs/ceph/inode.c
@@ -1823,6 +1823,7 @@ static void ceph_invalidate_work(struct work_struct *work)
 	orig_gen = ci->i_rdcache_gen;
 	spin_unlock(&ci->i_ceph_lock);
 
+	ceph_fscache_invalidate(inode);
 	if (invalidate_inode_pages2(inode->i_mapping) < 0) {
 		pr_err("invalidate_pages %p fails\n", inode);
 	}

commit a7e4dffcb0df1b7953b360db973ff837a545bdf6
Author: Nathan Chancellor <nathan@kernel.org>
Date:   Thu Mar 25 15:38:06 2021 -0700

    riscv: Workaround mcount name prior to clang-13
    
    [ Upstream commit 7ce04771503074a7de7f539cc43f5e1b385cb99b ]
    
    Prior to clang 13.0.0, the RISC-V name for the mcount symbol was
    "mcount", which differs from the GCC version of "_mcount", which results
    in the following errors:
    
    riscv64-linux-gnu-ld: init/main.o: in function `__traceiter_initcall_level':
    main.c:(.text+0xe): undefined reference to `mcount'
    riscv64-linux-gnu-ld: init/main.o: in function `__traceiter_initcall_start':
    main.c:(.text+0x4e): undefined reference to `mcount'
    riscv64-linux-gnu-ld: init/main.o: in function `__traceiter_initcall_finish':
    main.c:(.text+0x92): undefined reference to `mcount'
    riscv64-linux-gnu-ld: init/main.o: in function `.LBB32_28':
    main.c:(.text+0x30c): undefined reference to `mcount'
    riscv64-linux-gnu-ld: init/main.o: in function `free_initmem':
    main.c:(.text+0x54c): undefined reference to `mcount'
    
    This has been corrected in https://reviews.llvm.org/D98881 but the
    minimum supported clang version is 10.0.1. To avoid build errors and to
    gain a working function tracer, adjust the name of the mcount symbol for
    older versions of clang in mount.S and recordmcount.pl.
    
    Link: https://github.com/ClangBuiltLinux/linux/issues/1331
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
    Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/riscv/include/asm/ftrace.h b/arch/riscv/include/asm/ftrace.h
index 02fbc175142e..693c3839a7df 100644
--- a/arch/riscv/include/asm/ftrace.h
+++ b/arch/riscv/include/asm/ftrace.h
@@ -10,9 +10,19 @@
 #endif
 #define HAVE_FUNCTION_GRAPH_RET_ADDR_PTR
 
+/*
+ * Clang prior to 13 had "mcount" instead of "_mcount":
+ * https://reviews.llvm.org/D98881
+ */
+#if defined(CONFIG_CC_IS_GCC) || CONFIG_CLANG_VERSION >= 130000
+#define MCOUNT_NAME _mcount
+#else
+#define MCOUNT_NAME mcount
+#endif
+
 #define ARCH_SUPPORTS_FTRACE_OPS 1
 #ifndef __ASSEMBLY__
-void _mcount(void);
+void MCOUNT_NAME(void);
 static inline unsigned long ftrace_call_adjust(unsigned long addr)
 {
 	return addr;
@@ -33,7 +43,7 @@ struct dyn_arch_ftrace {
  * both auipc and jalr at the same time.
  */
 
-#define MCOUNT_ADDR		((unsigned long)_mcount)
+#define MCOUNT_ADDR		((unsigned long)MCOUNT_NAME)
 #define JALR_SIGN_MASK		(0x00000800)
 #define JALR_OFFSET_MASK	(0x00000fff)
 #define AUIPC_OFFSET_MASK	(0xfffff000)
diff --git a/arch/riscv/kernel/mcount.S b/arch/riscv/kernel/mcount.S
index 5721624886a1..fabddee90d1b 100644
--- a/arch/riscv/kernel/mcount.S
+++ b/arch/riscv/kernel/mcount.S
@@ -47,8 +47,8 @@
 
 ENTRY(ftrace_stub)
 #ifdef CONFIG_DYNAMIC_FTRACE
-       .global _mcount
-       .set    _mcount, ftrace_stub
+       .global MCOUNT_NAME
+       .set    MCOUNT_NAME, ftrace_stub
 #endif
 	ret
 ENDPROC(ftrace_stub)
@@ -79,7 +79,7 @@ EXPORT_SYMBOL(return_to_handler)
 #endif
 
 #ifndef CONFIG_DYNAMIC_FTRACE
-ENTRY(_mcount)
+ENTRY(MCOUNT_NAME)
 	la	t4, ftrace_stub
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
 	la	t0, ftrace_graph_return
@@ -125,6 +125,6 @@ do_trace:
 	jalr	t5
 	RESTORE_ABI_STATE
 	ret
-ENDPROC(_mcount)
+ENDPROC(MCOUNT_NAME)
 #endif
-EXPORT_SYMBOL(_mcount)
+EXPORT_SYMBOL(MCOUNT_NAME)
diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl
index bc12e12e4b3a..657e69125a46 100755
--- a/scripts/recordmcount.pl
+++ b/scripts/recordmcount.pl
@@ -395,7 +395,7 @@ if ($arch eq "x86_64") {
     $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s_mcount\$";
 } elsif ($arch eq "riscv") {
     $function_regex = "^([0-9a-fA-F]+)\\s+<([^.0-9][0-9a-zA-Z_\\.]+)>:";
-    $mcount_regex = "^\\s*([0-9a-fA-F]+):\\sR_RISCV_CALL(_PLT)?\\s_mcount\$";
+    $mcount_regex = "^\\s*([0-9a-fA-F]+):\\sR_RISCV_CALL(_PLT)?\\s_?mcount\$";
     $type = ".quad";
     $alignment = 2;
 } elsif ($arch eq "nds32") {

commit faf7548903435d0bdf4e17e1ce4f3fdb65481064
Author: Nathan Chancellor <nathan@kernel.org>
Date:   Thu Mar 25 15:38:05 2021 -0700

    scripts/recordmcount.pl: Fix RISC-V regex for clang
    
    [ Upstream commit 2f095504f4b9cf75856d6a9cf90299cf75aa46c5 ]
    
    Clang can generate R_RISCV_CALL_PLT relocations to _mcount:
    
    $ llvm-objdump -dr build/riscv/init/main.o | rg mcount
                    000000000000000e:  R_RISCV_CALL_PLT     _mcount
                    000000000000004e:  R_RISCV_CALL_PLT     _mcount
    
    After this, the __start_mcount_loc section is properly generated and
    function tracing still works.
    
    Link: https://github.com/ClangBuiltLinux/linux/issues/1331
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Reviewed-by: Fangrui Song <maskray@google.com>
    Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl
index 9a8fe8ea6b03..bc12e12e4b3a 100755
--- a/scripts/recordmcount.pl
+++ b/scripts/recordmcount.pl
@@ -395,7 +395,7 @@ if ($arch eq "x86_64") {
     $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s_mcount\$";
 } elsif ($arch eq "riscv") {
     $function_regex = "^([0-9a-fA-F]+)\\s+<([^.0-9][0-9a-zA-Z_\\.]+)>:";
-    $mcount_regex = "^\\s*([0-9a-fA-F]+):\\sR_RISCV_CALL\\s_mcount\$";
+    $mcount_regex = "^\\s*([0-9a-fA-F]+):\\sR_RISCV_CALL(_PLT)?\\s_mcount\$";
     $type = ".quad";
     $alignment = 2;
 } elsif ($arch eq "nds32") {

commit 16cc24da4e3518ffabaca19b474d66bf0f86fa55
Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Date:   Wed Apr 14 04:41:16 2021 +0100

    ARM: 9075/1: kernel: Fix interrupted SMC calls
    
    [ Upstream commit 57ac51667d8cd62731223d687e5fe7b41c502f89 ]
    
    On Qualcomm ARM32 platforms, the SMC call can return before it has
    completed. If this occurs, the call can be restarted, but it requires
    using the returned session ID value from the interrupted SMC call.
    
    The ARM32 SMCC code already has the provision to add platform specific
    quirks for things like this. So let's make use of it and add the
    Qualcomm specific quirk (ARM_SMCCC_QUIRK_QCOM_A6) used by the QCOM_SCM
    driver.
    
    This change is similar to the below one added for ARM64 a while ago:
    commit 82bcd087029f ("firmware: qcom: scm: Fix interrupted SCM calls")
    
    Without this change, the Qualcomm ARM32 platforms like SDX55 will return
    -EINVAL for SMC calls used for modem firmware loading and validation.
    
    Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
    Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
    Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c
index ae85f67a6352..40afe953a0e2 100644
--- a/arch/arm/kernel/asm-offsets.c
+++ b/arch/arm/kernel/asm-offsets.c
@@ -30,6 +30,7 @@
 #include <asm/vdso_datapage.h>
 #include <asm/hardware/cache-l2x0.h>
 #include <linux/kbuild.h>
+#include <linux/arm-smccc.h>
 #include "signal.h"
 
 /*
@@ -159,6 +160,8 @@ int main(void)
   DEFINE(SLEEP_SAVE_SP_PHYS,	offsetof(struct sleep_save_sp, save_ptr_stash_phys));
   DEFINE(SLEEP_SAVE_SP_VIRT,	offsetof(struct sleep_save_sp, save_ptr_stash));
 #endif
+  DEFINE(ARM_SMCCC_QUIRK_ID_OFFS,	offsetof(struct arm_smccc_quirk, id));
+  DEFINE(ARM_SMCCC_QUIRK_STATE_OFFS,	offsetof(struct arm_smccc_quirk, state));
   BLANK();
   DEFINE(DMA_BIDIRECTIONAL,	DMA_BIDIRECTIONAL);
   DEFINE(DMA_TO_DEVICE,		DMA_TO_DEVICE);
diff --git a/arch/arm/kernel/smccc-call.S b/arch/arm/kernel/smccc-call.S
index e5d43066b889..13d307cd364c 100644
--- a/arch/arm/kernel/smccc-call.S
+++ b/arch/arm/kernel/smccc-call.S
@@ -12,7 +12,9 @@
  *
  */
 #include <linux/linkage.h>
+#include <linux/arm-smccc.h>
 
+#include <asm/asm-offsets.h>
 #include <asm/opcodes-sec.h>
 #include <asm/opcodes-virt.h>
 #include <asm/unwind.h>
@@ -36,7 +38,14 @@ UNWIND(	.fnstart)
 UNWIND(	.save	{r4-r7})
 	ldm	r12, {r4-r7}
 	\instr
-	pop	{r4-r7}
+	ldr	r4, [sp, #36]
+	cmp	r4, #0
+	beq	1f			// No quirk structure
+	ldr     r5, [r4, #ARM_SMCCC_QUIRK_ID_OFFS]
+	cmp     r5, #ARM_SMCCC_QUIRK_QCOM_A6
+	bne	1f			// No quirk present
+	str	r6, [r4, #ARM_SMCCC_QUIRK_STATE_OFFS]
+1:	pop	{r4-r7}
 	ldr	r12, [sp, #(4 * 4)]
 	stm	r12, {r0-r3}
 	bx	lr

commit d5e66eb297bc1b919478e4efce0685f484d55de4
Author: Johannes Berg <johannes.berg@intel.com>
Date:   Fri Mar 5 21:43:15 2021 +0100

    um: Mark all kernel symbols as local
    
    [ Upstream commit d5027ca63e0e778b641cf23e3f5c6d6212cf412b ]
    
    Ritesh reported a bug [1] against UML, noting that it crashed on
    startup. The backtrace shows the following (heavily redacted):
    
    (gdb) bt
    ...
     #26 0x0000000060015b5d in sem_init () at ipc/sem.c:268
     #27 0x00007f89906d92f7 in ?? () from /lib/x86_64-linux-gnu/libcom_err.so.2
     #28 0x00007f8990ab8fb2 in call_init (...) at dl-init.c:72
    ...
     #40 0x00007f89909bf3a6 in nss_load_library (...) at nsswitch.c:359
    ...
     #44 0x00007f8990895e35 in _nss_compat_getgrnam_r (...) at nss_compat/compat-grp.c:486
     #45 0x00007f8990968b85 in __getgrnam_r [...]
     #46 0x00007f89909d6b77 in grantpt [...]
     #47 0x00007f8990a9394e in __GI_openpty [...]
     #48 0x00000000604a1f65 in openpty_cb (...) at arch/um/os-Linux/sigio.c:407
     #49 0x00000000604a58d0 in start_idle_thread (...) at arch/um/os-Linux/skas/process.c:598
     #50 0x0000000060004a3d in start_uml () at arch/um/kernel/skas/process.c:45
     #51 0x00000000600047b2 in linux_main (...) at arch/um/kernel/um_arch.c:334
     #52 0x000000006000574f in main (...) at arch/um/os-Linux/main.c:144
    
    indicating that the UML function openpty_cb() calls openpty(),
    which internally calls __getgrnam_r(), which causes the nsswitch
    machinery to get started.
    
    This loads, through lots of indirection that I snipped, the
    libcom_err.so.2 library, which (in an unknown function, "??")
    calls sem_init().
    
    Now, of course it wants to get libpthread's sem_init(), since
    it's linked against libpthread. However, the dynamic linker
    looks up that symbol against the binary first, and gets the
    kernel's sem_init().
    
    Hajime Tazaki noted that "objcopy -L" can localize a symbol,
    so the dynamic linker wouldn't do the lookup this way. I tried,
    but for some reason that didn't seem to work.
    
    Doing the same thing in the linker script instead does seem to
    work, though I cannot entirely explain - it *also* works if I
    just add "VERSION { { global: *; }; }" instead, indicating that
    something else is happening that I don't really understand. It
    may be that explicitly doing that marks them with some kind of
    empty version, and that's different from the default.
    
    Explicitly marking them with a version breaks kallsyms, so that
    doesn't seem to be possible.
    
    Marking all the symbols as local seems correct, and does seem
    to address the issue, so do that. Also do it for static link,
    nsswitch libraries could still be loaded there.
    
    [1] https://bugs.debian.org/983379
    
    Reported-by: Ritesh Raj Sarraf <rrs@debian.org>
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Acked-By: Anton Ivanov <anton.ivanov@cambridgegreys.com>
    Tested-By: Ritesh Raj Sarraf <rrs@debian.org>
    Signed-off-by: Richard Weinberger <richard@nod.at>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/um/kernel/dyn.lds.S b/arch/um/kernel/dyn.lds.S
index 5568cf882371..899233625467 100644
--- a/arch/um/kernel/dyn.lds.S
+++ b/arch/um/kernel/dyn.lds.S
@@ -6,6 +6,12 @@ OUTPUT_ARCH(ELF_ARCH)
 ENTRY(_start)
 jiffies = jiffies_64;
 
+VERSION {
+  {
+    local: *;
+  };
+}
+
 SECTIONS
 {
   PROVIDE (__executable_start = START);
diff --git a/arch/um/kernel/uml.lds.S b/arch/um/kernel/uml.lds.S
index 36b07ec09742..22ff701d9b71 100644
--- a/arch/um/kernel/uml.lds.S
+++ b/arch/um/kernel/uml.lds.S
@@ -7,6 +7,12 @@ OUTPUT_ARCH(ELF_ARCH)
 ENTRY(_start)
 jiffies = jiffies_64;
 
+VERSION {
+  {
+    local: *;
+  };
+}
+
 SECTIONS
 {
   /* This must contain the right address - not quite the default ELF one.*/

commit 10a6d9f8f73e48d624c7803aaf86214634d324b6
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Fri Apr 9 22:29:49 2021 -0700

    Input: silead - add workaround for x86 BIOS-es which bring the chip up in a stuck state
    
    [ Upstream commit e479187748a8f151a85116a7091c599b121fdea5 ]
    
    Some buggy BIOS-es bring up the touchscreen-controller in a stuck
    state where it blocks the I2C bus. Specifically this happens on
    the Jumper EZpad 7 tablet model.
    
    After much poking at this problem I have found that the following steps
    are necessary to unstuck the chip / bus:
    
    1. Turn off the Silead chip.
    2. Try to do an I2C transfer with the chip, this will fail in response to
       which the I2C-bus-driver will call: i2c_recover_bus() which will unstuck
       the I2C-bus. Note the unstuck-ing of the I2C bus only works if we first
       drop the chip of the bus by turning it off.
    3. Turn the chip back on.
    
    On the x86/ACPI systems were this problem is seen, step 1. and 3. require
    making ACPI calls and dealing with ACPI Power Resources. This commit adds
    a workaround which runtime-suspends the chip to turn it off, leaving it up
    to the ACPI subsystem to deal with all the ACPI specific details.
    
    There is no good way to detect this bug, so the workaround gets activated
    by a new "silead,stuck-controller-bug" boolean device-property. Since this
    is only used on x86/ACPI, this will be set by model specific device-props
    set by drivers/platform/x86/touchscreen_dmi.c. Therefor this new
    device-property is not documented in the DT-bindings.
    
    Dmesg will contain the following messages on systems where the workaround
    is activated:
    
    [   54.309029] silead_ts i2c-MSSL1680:00: [Firmware Bug]: Stuck I2C bus: please ignore the next 'controller timed out' error
    [   55.373593] i2c_designware 808622C1:04: controller timed out
    [   55.582186] silead_ts i2c-MSSL1680:00: Silead chip ID: 0x80360000
    
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Link: https://lore.kernel.org/r/20210405202745.16777-1-hdegoede@redhat.com
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/input/touchscreen/silead.c b/drivers/input/touchscreen/silead.c
index 06f0eb04a8fd..a787a6aefc69 100644
--- a/drivers/input/touchscreen/silead.c
+++ b/drivers/input/touchscreen/silead.c
@@ -28,6 +28,7 @@
 #include <linux/input/mt.h>
 #include <linux/input/touchscreen.h>
 #include <linux/pm.h>
+#include <linux/pm_runtime.h>
 #include <linux/irq.h>
 #include <linux/regulator/consumer.h>
 
@@ -343,10 +344,8 @@ static int silead_ts_get_id(struct i2c_client *client)
 
 	error = i2c_smbus_read_i2c_block_data(client, SILEAD_REG_ID,
 					      sizeof(chip_id), (u8 *)&chip_id);
-	if (error < 0) {
-		dev_err(&client->dev, "Chip ID read error %d\n", error);
+	if (error < 0)
 		return error;
-	}
 
 	data->chip_id = le32_to_cpu(chip_id);
 	dev_info(&client->dev, "Silead chip ID: 0x%8X", data->chip_id);
@@ -359,12 +358,49 @@ static int silead_ts_setup(struct i2c_client *client)
 	int error;
 	u32 status;
 
+	/*
+	 * Some buggy BIOS-es bring up the chip in a stuck state where it
+	 * blocks the I2C bus. The following steps are necessary to
+	 * unstuck the chip / bus:
+	 * 1. Turn off the Silead chip.
+	 * 2. Try to do an I2C transfer with the chip, this will fail in
+	 *    response to which the I2C-bus-driver will call:
+	 *    i2c_recover_bus() which will unstuck the I2C-bus. Note the
+	 *    unstuck-ing of the I2C bus only works if we first drop the
+	 *    chip off the bus by turning it off.
+	 * 3. Turn the chip back on.
+	 *
+	 * On the x86/ACPI systems were this problem is seen, step 1. and
+	 * 3. require making ACPI calls and dealing with ACPI Power
+	 * Resources. The workaround below runtime-suspends the chip to
+	 * turn it off, leaving it up to the ACPI subsystem to deal with
+	 * this.
+	 */
+
+	if (device_property_read_bool(&client->dev,
+				      "silead,stuck-controller-bug")) {
+		pm_runtime_set_active(&client->dev);
+		pm_runtime_enable(&client->dev);
+		pm_runtime_allow(&client->dev);
+
+		pm_runtime_suspend(&client->dev);
+
+		dev_warn(&client->dev, FW_BUG "Stuck I2C bus: please ignore the next 'controller timed out' error\n");
+		silead_ts_get_id(client);
+
+		/* The forbid will also resume the device */
+		pm_runtime_forbid(&client->dev);
+		pm_runtime_disable(&client->dev);
+	}
+
 	silead_ts_set_power(client, SILEAD_POWER_OFF);
 	silead_ts_set_power(client, SILEAD_POWER_ON);
 
 	error = silead_ts_get_id(client);
-	if (error)
+	if (error) {
+		dev_err(&client->dev, "Chip ID read error %d\n", error);
 		return error;
+	}
 
 	error = silead_ts_init(client);
 	if (error)

commit 3d54c18610ca48af94b66fb7af07915525ac0ffb
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Fri Apr 9 22:29:07 2021 -0700

    Input: elants_i2c - do not bind to i2c-hid compatible ACPI instantiated devices
    
    [ Upstream commit 65299e8bfb24774e6340e93ae49f6626598917c8 ]
    
    Several users have been reporting that elants_i2c gives several errors
    during probe and that their touchscreen does not work on their Lenovo AMD
    based laptops with a touchscreen with a ELAN0001 ACPI hardware-id:
    
    [    0.550596] elants_i2c i2c-ELAN0001:00: i2c-ELAN0001:00 supply vcc33 not found, using dummy regulator
    [    0.551836] elants_i2c i2c-ELAN0001:00: i2c-ELAN0001:00 supply vccio not found, using dummy regulator
    [    0.560932] elants_i2c i2c-ELAN0001:00: elants_i2c_send failed (77 77 77 77): -121
    [    0.562427] elants_i2c i2c-ELAN0001:00: software reset failed: -121
    [    0.595925] elants_i2c i2c-ELAN0001:00: elants_i2c_send failed (77 77 77 77): -121
    [    0.597974] elants_i2c i2c-ELAN0001:00: software reset failed: -121
    [    0.621893] elants_i2c i2c-ELAN0001:00: elants_i2c_send failed (77 77 77 77): -121
    [    0.622504] elants_i2c i2c-ELAN0001:00: software reset failed: -121
    [    0.632650] elants_i2c i2c-ELAN0001:00: elants_i2c_send failed (4d 61 69 6e): -121
    [    0.634256] elants_i2c i2c-ELAN0001:00: boot failed: -121
    [    0.699212] elants_i2c i2c-ELAN0001:00: invalid 'hello' packet: 00 00 ff ff
    [    1.630506] elants_i2c i2c-ELAN0001:00: Failed to read fw id: -121
    [    1.645508] elants_i2c i2c-ELAN0001:00: unknown packet 00 00 ff ff
    
    Despite these errors, the elants_i2c driver stays bound to the device
    (it returns 0 from its probe method despite the errors), blocking the
    i2c-hid driver from binding.
    
    Manually unbinding the elants_i2c driver and binding the i2c-hid driver
    makes the touchscreen work.
    
    Check if the ACPI-fwnode for the touchscreen contains one of the i2c-hid
    compatiblity-id strings and if it has the I2C-HID spec's DSM to get the
    HID descriptor address, If it has both then make elants_i2c not bind,
    so that the i2c-hid driver can bind.
    
    This assumes that non of the (older) elan touchscreens which actually
    need the elants_i2c driver falsely advertise an i2c-hid compatiblity-id
    + DSM in their ACPI-fwnodes. If some of them actually do have this
    false advertising, then this change may lead to regressions.
    
    While at it also drop the unnecessary DEVICE_NAME prefixing of the
    "I2C check functionality error", dev_err already outputs the driver-name.
    
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=207759
    Acked-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Link: https://lore.kernel.org/r/20210405202756.16830-1-hdegoede@redhat.com
    
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c
index d21ca39b0fdb..adfae2d88707 100644
--- a/drivers/input/touchscreen/elants_i2c.c
+++ b/drivers/input/touchscreen/elants_i2c.c
@@ -41,6 +41,7 @@
 #include <linux/of.h>
 #include <linux/gpio/consumer.h>
 #include <linux/regulator/consumer.h>
+#include <linux/uuid.h>
 #include <asm/unaligned.h>
 
 /* Device, Driver information */
@@ -1131,6 +1132,40 @@ static void elants_i2c_power_off(void *_data)
 	}
 }
 
+#ifdef CONFIG_ACPI
+static const struct acpi_device_id i2c_hid_ids[] = {
+	{"ACPI0C50", 0 },
+	{"PNP0C50", 0 },
+	{ },
+};
+
+static const guid_t i2c_hid_guid =
+	GUID_INIT(0x3CDFF6F7, 0x4267, 0x4555,
+		  0xAD, 0x05, 0xB3, 0x0A, 0x3D, 0x89, 0x38, 0xDE);
+
+static bool elants_acpi_is_hid_device(struct device *dev)
+{
+	acpi_handle handle = ACPI_HANDLE(dev);
+	union acpi_object *obj;
+
+	if (acpi_match_device_ids(ACPI_COMPANION(dev), i2c_hid_ids))
+		return false;
+
+	obj = acpi_evaluate_dsm_typed(handle, &i2c_hid_guid, 1, 1, NULL, ACPI_TYPE_INTEGER);
+	if (obj) {
+		ACPI_FREE(obj);
+		return true;
+	}
+
+	return false;
+}
+#else
+static bool elants_acpi_is_hid_device(struct device *dev)
+{
+	return false;
+}
+#endif
+
 static int elants_i2c_probe(struct i2c_client *client,
 			    const struct i2c_device_id *id)
 {
@@ -1139,9 +1174,14 @@ static int elants_i2c_probe(struct i2c_client *client,
 	unsigned long irqflags;
 	int error;
 
+	/* Don't bind to i2c-hid compatible devices, these are handled by the i2c-hid drv. */
+	if (elants_acpi_is_hid_device(&client->dev)) {
+		dev_warn(&client->dev, "This device appears to be an I2C-HID device, not binding\n");
+		return -ENODEV;
+	}
+
 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
-		dev_err(&client->dev,
-			"%s: i2c check functionality error\n", DEVICE_NAME);
+		dev_err(&client->dev, "I2C check functionality error\n");
 		return -ENXIO;
 	}
 

commit d82da045a5da9f889a6cee316cabeb2be29cb199
Author: Feilong Lin <linfeilong@huawei.com>
Date:   Thu Mar 25 15:26:00 2021 +0800

    ACPI / hotplug / PCI: Fix reference count leak in enable_slot()
    
    [ Upstream commit 3bbfd319034ddce59e023837a4aa11439460509b ]
    
    In enable_slot(), if pci_get_slot() returns NULL, we clear the SLOT_ENABLED
    flag. When pci_get_slot() finds a device, it increments the device's
    reference count.  In this case, we did not call pci_dev_put() to decrement
    the reference count, so the memory of the device (struct pci_dev type) will
    eventually leak.
    
    Call pci_dev_put() to decrement its reference count when pci_get_slot()
    returns a PCI device.
    
    Link: https://lore.kernel.org/r/b411af88-5049-a1c6-83ac-d104a1f429be@huawei.com
    Signed-off-by: Feilong Lin <linfeilong@huawei.com>
    Signed-off-by: Zhiqiang Liu <liuzhiqiang26@huawei.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c
index be35bbfa6968..3d8844e7090a 100644
--- a/drivers/pci/hotplug/acpiphp_glue.c
+++ b/drivers/pci/hotplug/acpiphp_glue.c
@@ -540,6 +540,7 @@ static void enable_slot(struct acpiphp_slot *slot, bool bridge)
 			slot->flags &= ~SLOT_ENABLED;
 			continue;
 		}
+		pci_dev_put(dev);
 	}
 }
 

commit 01aef04e4861a99a956418bf1d8cfef94ce18243
Author: louis.wang <liang26812@gmail.com>
Date:   Wed Feb 24 13:25:53 2021 +0100

    ARM: 9066/1: ftrace: pause/unpause function graph tracer in cpu_suspend()
    
    [ Upstream commit 8252ca87c7a2111502ee13994956f8c309faad7f ]
    
    Enabling function_graph tracer on ARM causes kernel panic, because the
    function graph tracer updates the "return address" of a function in order
    to insert a trace callback on function exit, it saves the function's
    original return address in a return trace stack, but cpu_suspend() may not
    return through the normal return path.
    
    cpu_suspend() will resume directly via the cpu_resume path, but the return
    trace stack has been set-up by the subfunctions of cpu_suspend(), which
    makes the "return address" inconsistent with cpu_suspend().
    
    This patch refers to Commit de818bd4522c40ea02a81b387d2fa86f989c9623
    ("arm64: kernel: pause/unpause function graph tracer in cpu_suspend()"),
    
    fixes the issue by pausing/resuming the function graph tracer on the thread
    executing cpu_suspend(), so that the function graph tracer state is kept
    consistent across functions that enter power down states and never return
    by effectively disabling graph tracer while they are executing.
    
    Signed-off-by: louis.wang <liang26812@gmail.com>
    Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/kernel/suspend.c b/arch/arm/kernel/suspend.c
index d08099269e35..e126386fb78a 100644
--- a/arch/arm/kernel/suspend.c
+++ b/arch/arm/kernel/suspend.c
@@ -1,4 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
+#include <linux/ftrace.h>
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/mm_types.h>
@@ -26,6 +27,13 @@ int cpu_suspend(unsigned long arg, int (*fn)(unsigned long))
 	if (!idmap_pgd)
 		return -EINVAL;
 
+	/*
+	 * Function graph tracer state gets incosistent when the kernel
+	 * calls functions that never return (aka suspend finishers) hence
+	 * disable graph tracing during their execution.
+	 */
+	pause_graph_tracing();
+
 	/*
 	 * Provide a temporary page table with an identity mapping for
 	 * the MMU-enable code, required for resuming.  On successful
@@ -33,6 +41,9 @@ int cpu_suspend(unsigned long arg, int (*fn)(unsigned long))
 	 * back to the correct page tables.
 	 */
 	ret = __cpu_suspend(arg, fn, __mpidr);
+
+	unpause_graph_tracing();
+
 	if (ret == 0) {
 		cpu_switch_mm(mm->pgd, mm);
 		local_flush_bp_all();
@@ -46,7 +57,13 @@ int cpu_suspend(unsigned long arg, int (*fn)(unsigned long))
 int cpu_suspend(unsigned long arg, int (*fn)(unsigned long))
 {
 	u32 __mpidr = cpu_logical_map(smp_processor_id());
-	return __cpu_suspend(arg, fn, __mpidr);
+	int ret;
+
+	pause_graph_tracing();
+	ret = __cpu_suspend(arg, fn, __mpidr);
+	unpause_graph_tracing();
+
+	return ret;
 }
 #define	idmap_pgd	NULL
 #endif

commit 02d73c9f03b7185b65b3c1c0d6ebb970c22ddb90
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Mon Mar 8 16:24:47 2021 +0100

    PCI: thunder: Fix compile testing
    
    [ Upstream commit 16f7ae5906dfbeff54f74ec75d0563bb3a87ab0b ]
    
    Compile-testing these drivers is currently broken. Enabling it causes a
    couple of build failures though:
    
      drivers/pci/controller/pci-thunder-ecam.c:119:30: error: shift count >= width of type [-Werror,-Wshift-count-overflow]
      drivers/pci/controller/pci-thunder-pem.c:54:2: error: implicit declaration of function 'writeq' [-Werror,-Wimplicit-function-declaration]
      drivers/pci/controller/pci-thunder-pem.c:392:8: error: implicit declaration of function 'acpi_get_rc_resources' [-Werror,-Wimplicit-function-declaration]
    
    Fix them with the obvious one-line changes.
    
    Link: https://lore.kernel.org/r/20210308152501.2135937-2-arnd@kernel.org
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
    Reviewed-by: Robert Richter <rric@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pci/controller/pci-thunder-ecam.c b/drivers/pci/controller/pci-thunder-ecam.c
index 32d1d7b81ef4..18715d2ce022 100644
--- a/drivers/pci/controller/pci-thunder-ecam.c
+++ b/drivers/pci/controller/pci-thunder-ecam.c
@@ -116,7 +116,7 @@ static int thunder_ecam_p2_config_read(struct pci_bus *bus, unsigned int devfn,
 	 * the config space access window.  Since we are working with
 	 * the high-order 32 bits, shift everything down by 32 bits.
 	 */
-	node_bits = (cfg->res.start >> 32) & (1 << 12);
+	node_bits = upper_32_bits(cfg->res.start) & (1 << 12);
 
 	v |= node_bits;
 	set_val(v, where, size, val);
diff --git a/drivers/pci/controller/pci-thunder-pem.c b/drivers/pci/controller/pci-thunder-pem.c
index f127ce8bd4ef..1650ec2c35f9 100644
--- a/drivers/pci/controller/pci-thunder-pem.c
+++ b/drivers/pci/controller/pci-thunder-pem.c
@@ -11,6 +11,7 @@
 #include <linux/pci-acpi.h>
 #include <linux/pci-ecam.h>
 #include <linux/platform_device.h>
+#include <linux/io-64-nonatomic-lo-hi.h>
 #include "../pci.h"
 
 #if defined(CONFIG_PCI_HOST_THUNDER_PEM) || (defined(CONFIG_ACPI) && defined(CONFIG_PCI_QUIRKS))
@@ -314,9 +315,9 @@ static int thunder_pem_init(struct device *dev, struct pci_config_window *cfg,
 	 * structure here for the BAR.
 	 */
 	bar4_start = res_pem->start + 0xf00000;
-	pem_pci->ea_entry[0] = (u32)bar4_start | 2;
-	pem_pci->ea_entry[1] = (u32)(res_pem->end - bar4_start) & ~3u;
-	pem_pci->ea_entry[2] = (u32)(bar4_start >> 32);
+	pem_pci->ea_entry[0] = lower_32_bits(bar4_start) | 2;
+	pem_pci->ea_entry[1] = lower_32_bits(res_pem->end - bar4_start) & ~3u;
+	pem_pci->ea_entry[2] = upper_32_bits(bar4_start);
 
 	cfg->priv = pem_pci;
 	return 0;
@@ -324,9 +325,9 @@ static int thunder_pem_init(struct device *dev, struct pci_config_window *cfg,
 
 #if defined(CONFIG_ACPI) && defined(CONFIG_PCI_QUIRKS)
 
-#define PEM_RES_BASE		0x87e0c0000000UL
-#define PEM_NODE_MASK		GENMASK(45, 44)
-#define PEM_INDX_MASK		GENMASK(26, 24)
+#define PEM_RES_BASE		0x87e0c0000000ULL
+#define PEM_NODE_MASK		GENMASK_ULL(45, 44)
+#define PEM_INDX_MASK		GENMASK_ULL(26, 24)
 #define PEM_MIN_DOM_IN_NODE	4
 #define PEM_MAX_DOM_IN_NODE	10
 
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index e9ede82ee2c2..39725b71300f 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -473,6 +473,12 @@ static inline int pci_dev_specific_reset(struct pci_dev *dev, int probe)
 #if defined(CONFIG_PCI_QUIRKS) && defined(CONFIG_ARM64)
 int acpi_get_rc_resources(struct device *dev, const char *hid, u16 segment,
 			  struct resource *res);
+#else
+static inline int acpi_get_rc_resources(struct device *dev, const char *hid,
+					u16 segment, struct resource *res)
+{
+	return -ENODEV;
+}
 #endif
 
 u32 pci_rebar_get_possible_sizes(struct pci_dev *pdev, int bar);

commit 6b8fec241d19b00ba99d84ad4caa0f3c708f6246
Author: Magnus Karlsson <magnus.karlsson@intel.com>
Date:   Thu Dec 19 13:39:21 2019 +0100

    xsk: Simplify detection of empty and full rings
    
    [ Upstream commit 11cc2d21499cabe7e7964389634ed1de3ee91d33 ]
    
    In order to set the correct return flags for poll, the xsk code has to
    check if the Rx queue is empty and if the Tx queue is full. This code
    was unnecessarily large and complex as it used the functions that are
    used to update the local state from the global state (xskq_nb_free and
    xskq_nb_avail). Since we are not doing this nor updating any data
    dependent on this state, we can simplify the functions. Another
    benefit from this is that we can also simplify the xskq_nb_free and
    xskq_nb_avail functions in a later commit.
    
    Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Link: https://lore.kernel.org/bpf/1576759171-28550-3-git-send-email-magnus.karlsson@intel.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/xdp/xsk_queue.h b/net/xdp/xsk_queue.h
index fe96c0d039f2..cf7cbb5dd918 100644
--- a/net/xdp/xsk_queue.h
+++ b/net/xdp/xsk_queue.h
@@ -245,12 +245,15 @@ static inline void xskq_produce_flush_desc(struct xsk_queue *q)
 
 static inline bool xskq_full_desc(struct xsk_queue *q)
 {
-	return xskq_nb_avail(q, q->nentries) == q->nentries;
+	/* No barriers needed since data is not accessed */
+	return READ_ONCE(q->ring->producer) - READ_ONCE(q->ring->consumer) ==
+		q->nentries;
 }
 
 static inline bool xskq_empty_desc(struct xsk_queue *q)
 {
-	return xskq_nb_free(q, q->prod_tail, q->nentries) == q->nentries;
+	/* No barriers needed since data is not accessed */
+	return READ_ONCE(q->ring->consumer) == READ_ONCE(q->ring->producer);
 }
 
 void xskq_set_umem(struct xsk_queue *q, struct xdp_umem_props *umem_props);

commit 57ef65b34fc5ac05095f4facf746d78cce49bbb0
Author: Josh Poimboeuf <jpoimboe@redhat.com>
Date:   Thu Feb 20 09:35:09 2020 -0600

    pinctrl: ingenic: Improve unreachable code generation
    
    [ Upstream commit d6d43a92172085a2681e06a0d06aac53c7bcdd12 ]
    
    In the second loop of ingenic_pinconf_set(), it annotates the switch
    default case as unreachable().  The annotation is technically correct,
    because that same case would have resulted in an early function return
    in the previous loop.
    
    However, the compiled code is suboptimal.  GCC seems to work extra hard
    to ensure that the unreachable code path triggers undefined behavior.
    The function would fall through to start executing whatever function
    happens to be next in the compilation unit.
    
    This is problematic because:
    
      a) it adds unnecessary 'ensure undefined behavior' logic, and
         corresponding i-cache footprint; and
    
      b) it's less robust -- if a bug were to be introduced, falling through
         to the next function would be catastrophic.
    
    Yet another issue is that, while objtool normally understands
    unreachable() annotations, there's one special case where it doesn't:
    when the annotation occurs immediately after a 'ret' instruction.  That
    happens to be the case here because unreachable() is immediately before
    the return.
    
    Remove the unreachable() annotation and replace it with a comment.  This
    simplifies the code generation and changes the unreachable error path to
    just silently return instead of corrupting execution.
    
    This fixes the following objtool warning:
    
      drivers/pinctrl/pinctrl-ingenic.o: warning: objtool: ingenic_pinconf_set() falls through to next function ingenic_pinconf_group_set()
    
    Reported-by: Randy Dunlap <rdunlap@infradead.org>
    Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
    Link: https://lore.kernel.org/r/bc20fdbcb826512cf76b7dfd0972740875931b19.1582212881.git.jpoimboe@redhat.com
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pinctrl/pinctrl-ingenic.c b/drivers/pinctrl/pinctrl-ingenic.c
index a5accffbc8c9..babf6d011264 100644
--- a/drivers/pinctrl/pinctrl-ingenic.c
+++ b/drivers/pinctrl/pinctrl-ingenic.c
@@ -642,7 +642,8 @@ static int ingenic_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
 			break;
 
 		default:
-			unreachable();
+			/* unreachable */
+			break;
 		}
 	}
 

commit 147434d72d0a81cbadf672f70a418e9773638a8d
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Mon Mar 22 17:44:29 2021 +0100

    isdn: capi: fix mismatched prototypes
    
    commit 5ee7d4c7fbc9d3119a20b1c77d34003d1f82ac26 upstream.
    
    gcc-11 complains about a prototype declaration that is different
    from the function definition:
    
    drivers/isdn/capi/kcapi.c:724:44: error: argument 2 of type ?u8 *??{aka ?unsigned char *?} declared as a pointer [-Werror=array-parameter=]
      724 | u16 capi20_get_manufacturer(u32 contr, u8 *buf)
          |                                        ~~~~^~~
    In file included from drivers/isdn/capi/kcapi.c:13:
    drivers/isdn/capi/kcapi.h:62:43: note: previously declared as an array ?u8[64]??{aka ?unsigned char[64]?}
       62 | u16 capi20_get_manufacturer(u32 contr, u8 buf[CAPI_MANUFACTURER_LEN]);
          |                                        ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
    drivers/isdn/capi/kcapi.c:790:38: error: argument 2 of type ?u8 *??{aka ?unsigned char *?} declared as a pointer [-Werror=array-parameter=]
      790 | u16 capi20_get_serial(u32 contr, u8 *serial)
          |                                  ~~~~^~~~~~
    In file included from drivers/isdn/capi/kcapi.c:13:
    drivers/isdn/capi/kcapi.h:64:37: note: previously declared as an array ?u8[8]??{aka ?unsigned char[8]?}
       64 | u16 capi20_get_serial(u32 contr, u8 serial[CAPI_SERIAL_LEN]);
          |                                  ~~~^~~~~~~~~~~~~~~~~~~~~~~
    
    Change the definition to make them match.
    
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/isdn/capi/kcapi.c b/drivers/isdn/capi/kcapi.c
index a4ceb61c5b60..18de41a266eb 100644
--- a/drivers/isdn/capi/kcapi.c
+++ b/drivers/isdn/capi/kcapi.c
@@ -846,7 +846,7 @@ EXPORT_SYMBOL(capi20_put_message);
  * Return value: CAPI result code
  */
 
-u16 capi20_get_manufacturer(u32 contr, u8 *buf)
+u16 capi20_get_manufacturer(u32 contr, u8 buf[CAPI_MANUFACTURER_LEN])
 {
 	struct capi_ctr *ctr;
 	u16 ret;
@@ -916,7 +916,7 @@ EXPORT_SYMBOL(capi20_get_version);
  * Return value: CAPI result code
  */
 
-u16 capi20_get_serial(u32 contr, u8 *serial)
+u16 capi20_get_serial(u32 contr, u8 serial[CAPI_SERIAL_LEN])
 {
 	struct capi_ctr *ctr;
 	u16 ret;

commit ec92502e2e72f42e8759d7d6df4a78666a03d0c9
Author: Kaixu Xia <kaixuxia@tencent.com>
Date:   Wed Nov 4 13:24:04 2020 +0800

    cxgb4: Fix the -Wmisleading-indentation warning
    
    commit ea8146c6845799142aa4ee2660741c215e340cdf upstream.
    
    Fix the gcc warning:
    
    drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c:2673:9: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
     2673 |         for (i = 0; i < n; ++i) \
    
    Reported-by: Tosk Robot <tencent_os_robot@tencent.com>
    Signed-off-by: Kaixu Xia <kaixuxia@tencent.com>
    Link: https://lore.kernel.org/r/1604467444-23043-1-git-send-email-kaixuxia@tencent.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c
index 4af6e6ffc5df..3caf8bd1e00e 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c
@@ -2730,7 +2730,7 @@ do { \
 	seq_printf(seq, "%-12s", s); \
 	for (i = 0; i < n; ++i) \
 		seq_printf(seq, " %16" fmt_spec, v); \
-		seq_putc(seq, '\n'); \
+	seq_putc(seq, '\n'); \
 } while (0)
 #define S(s, v) S3("s", s, v)
 #define T3(fmt_spec, s, v) S3(fmt_spec, s, tx[i].v)

commit 167d9650d1029e7a153e79d4ae5c7482e26c22d2
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Mon Mar 22 17:42:26 2021 +0100

    usb: sl811-hcd: improve misleading indentation
    
    commit 8460f6003a1d2633737b89c4f69d6f4c0c7c65a3 upstream.
    
    gcc-11 now warns about a confusingly indented code block:
    
    drivers/usb/host/sl811-hcd.c: In function ?sl811h_hub_control??
    drivers/usb/host/sl811-hcd.c:1291:9: error: this ?if??clause does not guard... [-Werror=misleading-indentation]
     1291 |         if (*(u16*)(buf+2))     /* only if wPortChange is interesting */
          |         ^~
    drivers/usb/host/sl811-hcd.c:1295:17: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ?if??     1295 |                 break;
    
    Rewrite this to use a single if() block with the __is_defined() macro.
    
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Link: https://lore.kernel.org/r/20210322164244.827589-1-arnd@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c
index 5b061e599948..6dedefada92b 100644
--- a/drivers/usb/host/sl811-hcd.c
+++ b/drivers/usb/host/sl811-hcd.c
@@ -1287,11 +1287,10 @@ sl811h_hub_control(
 			goto error;
 		put_unaligned_le32(sl811->port1, buf);
 
-#ifndef	VERBOSE
-	if (*(u16*)(buf+2))	/* only if wPortChange is interesting */
-#endif
-		dev_dbg(hcd->self.controller, "GetPortStatus %08x\n",
-			sl811->port1);
+		if (__is_defined(VERBOSE) ||
+		    *(u16*)(buf+2)) /* only if wPortChange is interesting */
+			dev_dbg(hcd->self.controller, "GetPortStatus %08x\n",
+				sl811->port1);
 		break;
 	case SetPortFeature:
 		if (wIndex != 1 || wLength != 0)

commit f4e0882a8b984099c79671a01f48970d72b6fd03
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Mon Mar 22 17:43:03 2021 +0100

    kgdb: fix gcc-11 warning on indentation
    
    commit 40cc3a80bb42587db1e6ae21d6f3090582d33e89 upstream.
    
    gcc-11 starts warning about misleading indentation inside of macros:
    
    drivers/misc/kgdbts.c: In function ?kgdbts_break_test??
    drivers/misc/kgdbts.c:103:9: error: this ?if??clause does not guard... [-Werror=misleading-indentation]
      103 |         if (verbose > 1) \
          |         ^~
    drivers/misc/kgdbts.c:200:9: note: in expansion of macro ?v2printk??      200 |         v2printk("kgdbts: breakpoint complete\n");
          |         ^~~~~~~~
    drivers/misc/kgdbts.c:105:17: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ?if??      105 |                 touch_nmi_watchdog();   \
          |                 ^~~~~~~~~~~~~~~~~~
    
    The code looks correct to me, so just reindent it for readability.
    
    Fixes: e8d31c204e36 ("kgdb: add kgdb internal test suite")
    Acked-by: Daniel Thompson <daniel.thompson@linaro.org>
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Link: https://lore.kernel.org/r/20210322164308.827846-1-arnd@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/misc/kgdbts.c b/drivers/misc/kgdbts.c
index 8b01257783dd..f2cfc9619425 100644
--- a/drivers/misc/kgdbts.c
+++ b/drivers/misc/kgdbts.c
@@ -107,19 +107,19 @@
 
 #include <asm/sections.h>
 
-#define v1printk(a...) do { \
-	if (verbose) \
-		printk(KERN_INFO a); \
-	} while (0)
-#define v2printk(a...) do { \
-	if (verbose > 1) \
-		printk(KERN_INFO a); \
-		touch_nmi_watchdog();	\
-	} while (0)
-#define eprintk(a...) do { \
-		printk(KERN_ERR a); \
-		WARN_ON(1); \
-	} while (0)
+#define v1printk(a...) do {		\
+	if (verbose)			\
+		printk(KERN_INFO a);	\
+} while (0)
+#define v2printk(a...) do {		\
+	if (verbose > 1)		\
+		printk(KERN_INFO a);	\
+	touch_nmi_watchdog();		\
+} while (0)
+#define eprintk(a...) do {		\
+	printk(KERN_ERR a);		\
+	WARN_ON(1);			\
+} while (0)
 #define MAX_CONFIG_LEN		40
 
 static struct kgdb_io kgdbts_io_ops;

commit fcf11471ee913fb6c47827e6d5a293cf12fe9e78
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Mon Mar 22 17:45:36 2021 +0100

    x86/msr: Fix wr/rdmsr_safe_regs_on_cpu() prototypes
    
    commit 396a66aa1172ef2b78c21651f59b40b87b2e5e1e upstream.
    
    gcc-11 warns about mismatched prototypes here:
    
      arch/x86/lib/msr-smp.c:255:51: error: argument 2 of type ?u32 *??{aka ?unsigned int *?} declared as a pointer [-Werror=array-parameter=]
        255 | int rdmsr_safe_regs_on_cpu(unsigned int cpu, u32 *regs)
            |                                              ~~~~~^~~~
      arch/x86/include/asm/msr.h:347:50: note: previously declared as an array ?u32[8]??{aka ?unsigned int[8]?}
    
    GCC is right here - fix up the types.
    
    [ mingo: Twiddled the changelog. ]
    
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Link: https://lore.kernel.org/r/20210322164541.912261-1-arnd@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/lib/msr-smp.c b/arch/x86/lib/msr-smp.c
index fee8b9c0520c..9009393f44c7 100644
--- a/arch/x86/lib/msr-smp.c
+++ b/arch/x86/lib/msr-smp.c
@@ -253,7 +253,7 @@ static void __wrmsr_safe_regs_on_cpu(void *info)
 	rv->err = wrmsr_safe_regs(rv->regs);
 }
 
-int rdmsr_safe_regs_on_cpu(unsigned int cpu, u32 *regs)
+int rdmsr_safe_regs_on_cpu(unsigned int cpu, u32 regs[8])
 {
 	int err;
 	struct msr_regs_info rv;
@@ -266,7 +266,7 @@ int rdmsr_safe_regs_on_cpu(unsigned int cpu, u32 *regs)
 }
 EXPORT_SYMBOL(rdmsr_safe_regs_on_cpu);
 
-int wrmsr_safe_regs_on_cpu(unsigned int cpu, u32 *regs)
+int wrmsr_safe_regs_on_cpu(unsigned int cpu, u32 regs[8])
 {
 	int err;
 	struct msr_regs_info rv;

commit a3dd6095f1a66fd05fe79c96fb9f7a3a13d0ca03
Author: Christoph Hellwig <hch@lst.de>
Date:   Fri Apr 9 11:46:12 2021 +0200

    nvme: do not try to reconfigure APST when the controller is not live
    
    commit 53fe2a30bc168db9700e00206d991ff934973cf1 upstream.
    
    Do not call nvme_configure_apst when the controller is not live, given
    that nvme_configure_apst will fail due the lack of an admin queue when
    the controller is being torn down and nvme_set_latency_tolerance is
    called from dev_pm_qos_hide_latency_tolerance.
    
    Fixes: 510a405d945b("nvme: fix memory leak for power latency tolerance")
    Reported-by: Peng Liu <liupeng17@lenovo.com>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Keith Busch <kbusch@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 513dd1e2aac7..e64310f2296f 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -2091,7 +2091,8 @@ static void nvme_set_latency_tolerance(struct device *dev, s32 val)
 
 	if (ctrl->ps_max_latency_us != latency) {
 		ctrl->ps_max_latency_us = latency;
-		nvme_configure_apst(ctrl);
+		if (ctrl->state == NVME_CTRL_LIVE)
+			nvme_configure_apst(ctrl);
 	}
 }
 

commit e9de459508b39d7da0ad314ef95f562f402ac46e
Author: Pawe? Chmiel <pawel.mikolaj.chmiel@gmail.com>
Date:   Sat Oct 24 17:43:46 2020 +0200

    clk: exynos7: Mark aclk_fsys1_200 as critical
    
    commit 34138a59b92c1a30649a18ec442d2e61f3bc34dd upstream.
    
    This clock must be always enabled to allow access to any registers in
    fsys1 CMU. Until proper solution based on runtime PM is applied
    (similar to what was done for Exynos5433), mark that clock as critical
    so it won't be disabled.
    
    It was observed on Samsung Galaxy S6 device (based on Exynos7420), where
    UFS module is probed before pmic used to power that device.
    In this case defer probe was happening and that clock was disabled by
    UFS driver, causing whole boot to hang on next CMU access.
    
    Fixes: 753195a749a6 ("clk: samsung: exynos7: Correct CMU_FSYS1 clocks names")
    Signed-off-by: Pawe? Chmiel <pawel.mikolaj.chmiel@gmail.com>
    Acked-by: Krzysztof Kozlowski <krzk@kernel.org>
    Link: https://lore.kernel.org/linux-clk/20201024154346.9589-1-pawel.mikolaj.chmiel@gmail.com
    [s.nawrocki: Added comment in the code]
    Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/clk/samsung/clk-exynos7.c b/drivers/clk/samsung/clk-exynos7.c
index 492d51691080..9b02980ee929 100644
--- a/drivers/clk/samsung/clk-exynos7.c
+++ b/drivers/clk/samsung/clk-exynos7.c
@@ -541,8 +541,13 @@ static const struct samsung_gate_clock top1_gate_clks[] __initconst = {
 	GATE(CLK_ACLK_FSYS0_200, "aclk_fsys0_200", "dout_aclk_fsys0_200",
 		ENABLE_ACLK_TOP13, 28, CLK_SET_RATE_PARENT |
 		CLK_IS_CRITICAL, 0),
+	/*
+	 * This clock is required for the CMU_FSYS1 registers access, keep it
+	 * enabled permanently until proper runtime PM support is added.
+	 */
 	GATE(CLK_ACLK_FSYS1_200, "aclk_fsys1_200", "dout_aclk_fsys1_200",
-		ENABLE_ACLK_TOP13, 24, CLK_SET_RATE_PARENT, 0),
+		ENABLE_ACLK_TOP13, 24, CLK_SET_RATE_PARENT |
+		CLK_IS_CRITICAL, 0),
 
 	GATE(CLK_SCLK_PHY_FSYS1_26M, "sclk_phy_fsys1_26m",
 		"dout_sclk_phy_fsys1_26m", ENABLE_SCLK_TOP1_FSYS11,

commit 9b288479f7a901a14ce703938596438559d7df55
Author: Jonathon Reinhart <jonathon.reinhart@gmail.com>
Date:   Mon Apr 12 00:24:53 2021 -0400

    netfilter: conntrack: Make global sysctls readonly in non-init netns
    
    commit 2671fa4dc0109d3fb581bc3078fdf17b5d9080f6 upstream.
    
    These sysctls point to global variables:
    - NF_SYSCTL_CT_MAX (&nf_conntrack_max)
    - NF_SYSCTL_CT_EXPECT_MAX (&nf_ct_expect_max)
    - NF_SYSCTL_CT_BUCKETS (&nf_conntrack_htable_size_user)
    
    Because their data pointers are not updated to point to per-netns
    structures, they must be marked read-only in a non-init_net ns.
    Otherwise, changes in any net namespace are reflected in (leaked into)
    all other net namespaces. This problem has existed since the
    introduction of net namespaces.
    
    The current logic marks them read-only only if the net namespace is
    owned by an unprivileged user (other than init_user_ns).
    
    Commit d0febd81ae77 ("netfilter: conntrack: re-visit sysctls in
    unprivileged namespaces") "exposes all sysctls even if the namespace is
    unpriviliged." Since we need to mark them readonly in any case, we can
    forego the unprivileged user check altogether.
    
    Fixes: d0febd81ae77 ("netfilter: conntrack: re-visit sysctls in unprivileged namespaces")
    Signed-off-by: Jonathon Reinhart <Jonathon.Reinhart@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c
index 2e3ae494f369..da0c9fa381d2 100644
--- a/net/netfilter/nf_conntrack_standalone.c
+++ b/net/netfilter/nf_conntrack_standalone.c
@@ -594,8 +594,11 @@ static int nf_conntrack_standalone_init_sysctl(struct net *net)
 	if (net->user_ns != &init_user_ns)
 		table[0].procname = NULL;
 
-	if (!net_eq(&init_net, net))
+	if (!net_eq(&init_net, net)) {
+		table[0].mode = 0444;
 		table[2].mode = 0444;
+		table[5].mode = 0444;
+	}
 
 	net->ct.sysctl_header = register_net_sysctl(net, "net/netfilter", table);
 	if (!net->ct.sysctl_header)

commit 1ea5cdd5388628a6e3762392717db0d980307ce8
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon Apr 5 11:48:52 2021 +0200

    kobject_uevent: remove warning in init_uevent_argv()
    
    commit b4104180a2efb85f55e1ba1407885c9421970338 upstream.
    
    syzbot can trigger the WARN() in init_uevent_argv() which isn't the
    nicest as the code does properly recover and handle the error.  So
    change the WARN() call to pr_warn() and provide some more information on
    what the buffer size that was needed.
    
    Link: https://lore.kernel.org/r/20201107082206.GA19079@kroah.com
    Cc: "Rafael J. Wysocki" <rafael@kernel.org>
    Cc: linux-kernel@vger.kernel.org
    Reported-by: syzbot+92340f7b2b4789907fdb@syzkaller.appspotmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Link: https://lore.kernel.org/r/20210405094852.1348499-1-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/lib/kobject_uevent.c b/lib/kobject_uevent.c
index 7761f3294339..26d21339bef2 100644
--- a/lib/kobject_uevent.c
+++ b/lib/kobject_uevent.c
@@ -250,12 +250,13 @@ static int kobj_usermode_filter(struct kobject *kobj)
 
 static int init_uevent_argv(struct kobj_uevent_env *env, const char *subsystem)
 {
+	int buffer_size = sizeof(env->buf) - env->buflen;
 	int len;
 
-	len = strlcpy(&env->buf[env->buflen], subsystem,
-		      sizeof(env->buf) - env->buflen);
-	if (len >= (sizeof(env->buf) - env->buflen)) {
-		WARN(1, KERN_ERR "init_uevent_argv: buffer size too small\n");
+	len = strlcpy(&env->buf[env->buflen], subsystem, buffer_size);
+	if (len >= buffer_size) {
+		pr_warn("init_uevent_argv: buffer size of %d too small, needed %d\n",
+			buffer_size, len);
 		return -ENOMEM;
 	}
 

commit 6e088a80702ffdd3cb8af0e445d66c663a3fb402
Author: Lukasz Luba <lukasz.luba@arm.com>
Date:   Thu Apr 22 16:36:22 2021 +0100

    thermal/core/fair share: Lock the thermal zone while looping over instances
    
    commit fef05776eb02238dcad8d5514e666a42572c3f32 upstream.
    
    The tz->lock must be hold during the looping over the instances in that
    thermal zone. This lock was missing in the governor code since the
    beginning, so it's hard to point into a particular commit.
    
    CC: stable@vger.kernel.org # 4.4+
    Signed-off-by: Lukasz Luba <lukasz.luba@arm.com>
    Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
    Link: https://lore.kernel.org/r/20210422153624.6074-2-lukasz.luba@arm.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/thermal/fair_share.c b/drivers/thermal/fair_share.c
index d3469fbc5207..26d7387f5834 100644
--- a/drivers/thermal/fair_share.c
+++ b/drivers/thermal/fair_share.c
@@ -94,6 +94,8 @@ static int fair_share_throttle(struct thermal_zone_device *tz, int trip)
 	int total_instance = 0;
 	int cur_trip_level = get_trip_level(tz);
 
+	mutex_lock(&tz->lock);
+
 	list_for_each_entry(instance, &tz->thermal_instances, tz_node) {
 		if (instance->trip != trip)
 			continue;
@@ -122,6 +124,8 @@ static int fair_share_throttle(struct thermal_zone_device *tz, int trip)
 		mutex_unlock(&instance->cdev->lock);
 		thermal_cdev_update(cdev);
 	}
+
+	mutex_unlock(&tz->lock);
 	return 0;
 }
 

commit a5e67c081d953b75a037802ec04a04c6a205efeb
Author: Maciej W. Rozycki <macro@orcam.me.uk>
Date:   Thu Apr 22 22:36:12 2021 +0200

    MIPS: Avoid handcoded DIVU in `__div64_32' altogether
    
    commit 25ab14cbe9d1b66fda44c71a2db7582a31b6f5cd upstream.
    
    Remove the inline asm with a DIVU instruction from `__div64_32' and use
    plain C code for the intended DIVMOD calculation instead.  GCC is smart
    enough to know that both the quotient and the remainder are calculated
    with single DIVU, so with ISAs up to R5 the same instruction is actually
    produced with overall similar code.
    
    For R6 compiled code will work, but separate DIVU and MODU instructions
    will be produced, which are also interlocked, so scalar implementations
    will likely not perform as well as older ISAs with their asynchronous MD
    unit.  Likely still faster then the generic algorithm though.
    
    This removes a compilation error for R6 however where the original DIVU
    instruction is not supported anymore and the MDU accumulator registers
    have been removed and consequently GCC complains as to a constraint it
    cannot find a register for:
    
    In file included from ./include/linux/math.h:5,
                     from ./include/linux/kernel.h:13,
                     from mm/page-writeback.c:15:
    ./include/linux/math64.h: In function 'div_u64_rem':
    ./arch/mips/include/asm/div64.h:76:17: error: inconsistent operand constraints in an 'asm'
       76 |                 __asm__("divu   $0, %z1, %z2"                           \
          |                 ^~~~~~~
    ./include/asm-generic/div64.h:245:25: note: in expansion of macro '__div64_32'
      245 |                 __rem = __div64_32(&(n), __base);       \
          |                         ^~~~~~~~~~
    ./include/linux/math64.h:91:22: note: in expansion of macro 'do_div'
       91 |         *remainder = do_div(dividend, divisor);
          |                      ^~~~~~
    
    This has passed correctness verification with test_div64 and reduced the
    module's average execution time down to 1.0404s from 1.0445s with R3400
    @40MHz.  The module's MIPS I machine code has also shrunk by 12 bytes or
    3 instructions.
    
    Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/mips/include/asm/div64.h b/arch/mips/include/asm/div64.h
index a882a7bdf63e..ceece76fc971 100644
--- a/arch/mips/include/asm/div64.h
+++ b/arch/mips/include/asm/div64.h
@@ -58,7 +58,6 @@
 
 #define __div64_32(n, base) ({						\
 	unsigned long __upper, __low, __high, __radix;			\
-	unsigned long long __modquot;					\
 	unsigned long long __quot;					\
 	unsigned long long __div;					\
 	unsigned long __mod;						\
@@ -73,11 +72,8 @@
 		__upper = __high;					\
 		__high = 0;						\
 	} else {							\
-		__asm__("divu	$0, %z1, %z2"				\
-		: "=x" (__modquot)					\
-		: "Jr" (__high), "Jr" (__radix));			\
-		__upper = __modquot >> 32;				\
-		__high = __modquot;					\
+		__upper = __high % __radix;				\
+		__high /= __radix;					\
 	}								\
 									\
 	__mod = do_div64_32(__low, __upper, __low, __radix);		\

commit c70877c0fa032cc7efebe013d67827cdf9032dd8
Author: Maciej W. Rozycki <macro@orcam.me.uk>
Date:   Tue Apr 20 04:50:48 2021 +0200

    MIPS: Avoid DIVU in `__div64_32' is result would be zero
    
    commit c1d337d45ec0a802299688e17d568c4e3a585895 upstream.
    
    We already check the high part of the divident against zero to avoid the
    costly DIVU instruction in that case, needed to reduce the high part of
    the divident, so we may well check against the divisor instead and set
    the high part of the quotient to zero right away.  We need to treat the
    high part the divident in that case though as the remainder that would
    be calculated by the DIVU instruction we avoided.
    
    This has passed correctness verification with test_div64 and reduced the
    module's average execution time down to 1.0445s and 0.2619s from 1.0668s
    and 0.2629s respectively for an R3400 CPU @40MHz and a 5Kc CPU @160MHz.
    
    Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/mips/include/asm/div64.h b/arch/mips/include/asm/div64.h
index b252300e299d..a882a7bdf63e 100644
--- a/arch/mips/include/asm/div64.h
+++ b/arch/mips/include/asm/div64.h
@@ -68,9 +68,11 @@
 									\
 	__high = __div >> 32;						\
 	__low = __div;							\
-	__upper = __high;						\
 									\
-	if (__high) {							\
+	if (__high < __radix) {						\
+		__upper = __high;					\
+		__high = 0;						\
+	} else {							\
 		__asm__("divu	$0, %z1, %z2"				\
 		: "=x" (__modquot)					\
 		: "Jr" (__high), "Jr" (__radix));			\

commit 1506af3076817306f61c64fd67b180746b14c7fe
Author: Maciej W. Rozycki <macro@orcam.me.uk>
Date:   Tue Apr 20 04:50:40 2021 +0200

    MIPS: Reinstate platform `__div64_32' handler
    
    commit c49f71f60754acbff37505e1d16ca796bf8a8140 upstream.
    
    Our current MIPS platform `__div64_32' handler is inactive, because it
    is incorrectly only enabled for 64-bit configurations, for which generic
    `do_div' code does not call it anyway.
    
    The handler is not suitable for being called from there though as it
    only calculates 32 bits of the quotient under the assumption the 64-bit
    divident has been suitably reduced.  Code for such reduction used to be
    there, however it has been incorrectly removed with commit c21004cd5b4c
    ("MIPS: Rewrite <asm/div64.h> to work with gcc 4.4.0."), which should
    have only updated an obsoleted constraint for an inline asm involving
    $hi and $lo register outputs, while possibly wiring the original MIPS
    variant of the `do_div' macro as `__div64_32' handler for the generic
    `do_div' implementation
    
    Correct the handler as follows then:
    
    - Revert most of the commit referred, however retaining the current
      formatting, except for the final two instructions of the inline asm
      sequence, which the original commit missed.  Omit the original 64-bit
      parts though.
    
    - Rename the original `do_div' macro to `__div64_32'.  Use the combined
      `x' constraint referring to the MD accumulator as a whole, replacing
      the original individual `h' and `l' constraints used for $hi and $lo
      registers respectively, of which `h' has been obsoleted with GCC 4.4.
      Update surrounding code accordingly.
    
      We have since removed support for GCC versions before 4.9, so no need
      for a special arrangement here; GCC has supported the `x' constraint
      since forever anyway, or at least going back to 1991.
    
    - Rename the `__base' local variable in `__div64_32' to `__radix' to
      avoid a conflict with a local variable in `do_div'.
    
    - Actually enable this code for 32-bit rather than 64-bit configurations
      by qualifying it with BITS_PER_LONG being 32 instead of 64.  Include
      <asm/bitsperlong.h> for this macro rather than <linux/types.h> as we
      don't need anything else.
    
    - Finally include <asm-generic/div64.h> last rather than first.
    
    This has passed correctness verification with test_div64 and reduced the
    module's average execution time down to 1.0668s and 0.2629s from 2.1529s
    and 0.5647s respectively for an R3400 CPU @40MHz and a 5Kc CPU @160MHz.
    For a reference 64-bit `do_div' code where we have the DDIVU instruction
    available to do the whole calculation right away averages at 0.0660s for
    the latter CPU.
    
    Fixes: c21004cd5b4c ("MIPS: Rewrite <asm/div64.h> to work with gcc 4.4.0.")
    Reported-by: Huacai Chen <chenhuacai@kernel.org>
    Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk>
    Cc: stable@vger.kernel.org # v2.6.30+
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/mips/include/asm/div64.h b/arch/mips/include/asm/div64.h
index dc5ea5736440..b252300e299d 100644
--- a/arch/mips/include/asm/div64.h
+++ b/arch/mips/include/asm/div64.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2000, 2004  Maciej W. Rozycki
+ * Copyright (C) 2000, 2004, 2021  Maciej W. Rozycki
  * Copyright (C) 2003, 07 Ralf Baechle (ralf@linux-mips.org)
  *
  * This file is subject to the terms and conditions of the GNU General Public
@@ -9,25 +9,18 @@
 #ifndef __ASM_DIV64_H
 #define __ASM_DIV64_H
 
-#include <asm-generic/div64.h>
-
-#if BITS_PER_LONG == 64
+#include <asm/bitsperlong.h>
 
-#include <linux/types.h>
+#if BITS_PER_LONG == 32
 
 /*
  * No traps on overflows for any of these...
  */
 
-#define __div64_32(n, base)						\
-({									\
+#define do_div64_32(res, high, low, base) ({				\
 	unsigned long __cf, __tmp, __tmp2, __i;				\
 	unsigned long __quot32, __mod32;				\
-	unsigned long __high, __low;					\
-	unsigned long long __n;						\
 									\
-	__high = *__n >> 32;						\
-	__low = __n;							\
 	__asm__(							\
 	"	.set	push					\n"	\
 	"	.set	noat					\n"	\
@@ -51,18 +44,50 @@
 	"	subu	%0, %0, %z6				\n"	\
 	"	addiu	%2, %2, 1				\n"	\
 	"3:							\n"	\
-	"	bnez	%4, 0b\n\t"					\
-	"	 srl	%5, %1, 0x1f\n\t"				\
+	"	bnez	%4, 0b					\n"	\
+	"	 srl	%5, %1, 0x1f				\n"	\
 	"	.set	pop"						\
 	: "=&r" (__mod32), "=&r" (__tmp),				\
 	  "=&r" (__quot32), "=&r" (__cf),				\
 	  "=&r" (__i), "=&r" (__tmp2)					\
-	: "Jr" (base), "0" (__high), "1" (__low));			\
+	: "Jr" (base), "0" (high), "1" (low));				\
 									\
-	(__n) = __quot32;						\
+	(res) = __quot32;						\
 	__mod32;							\
 })
 
-#endif /* BITS_PER_LONG == 64 */
+#define __div64_32(n, base) ({						\
+	unsigned long __upper, __low, __high, __radix;			\
+	unsigned long long __modquot;					\
+	unsigned long long __quot;					\
+	unsigned long long __div;					\
+	unsigned long __mod;						\
+									\
+	__div = (*n);							\
+	__radix = (base);						\
+									\
+	__high = __div >> 32;						\
+	__low = __div;							\
+	__upper = __high;						\
+									\
+	if (__high) {							\
+		__asm__("divu	$0, %z1, %z2"				\
+		: "=x" (__modquot)					\
+		: "Jr" (__high), "Jr" (__radix));			\
+		__upper = __modquot >> 32;				\
+		__high = __modquot;					\
+	}								\
+									\
+	__mod = do_div64_32(__low, __upper, __low, __radix);		\
+									\
+	__quot = __high;						\
+	__quot = __quot << 32 | __low;					\
+	(*n) = __quot;							\
+	__mod;								\
+})
+
+#endif /* BITS_PER_LONG == 32 */
+
+#include <asm-generic/div64.h>
 
 #endif /* __ASM_DIV64_H */

commit 175225c27878742b42baf76ce7fecb34081aa2a0
Author: Maciej W. Rozycki <macro@orcam.me.uk>
Date:   Wed Mar 10 13:03:14 2021 +0100

    FDDI: defxx: Make MMIO the configuration default except for EISA
    
    commit 193ced4a79599352d63cb8c9e2f0c6043106eb6a upstream.
    
    Recent versions of the PCI Express specification have deprecated support
    for I/O transactions and actually some PCIe host bridges, such as Power
    Systems Host Bridge 4 (PHB4), do not implement them.
    
    The default kernel configuration choice for the defxx driver is the use
    of I/O ports rather than MMIO for PCI and EISA systems.  It may have
    made sense as a conservative backwards compatible choice back when MMIO
    operation support was added to the driver as a part of TURBOchannel bus
    support.  However nowadays this configuration choice makes the driver
    unusable with systems that do not implement I/O transactions for PCIe.
    
    Make DEFXX_MMIO the configuration default then, except where configured
    for EISA.  This exception is because an EISA adapter can have its MMIO
    decoding disabled with ECU (EISA Configuration Utility) and therefore
    not available with the resource allocation infrastructure we implement,
    while port I/O is always readily available as it uses slot-specific
    addressing, directly mapped to the slot an option card has been placed
    in and handled with our EISA bus support core.  Conversely a kernel that
    supports modern systems which may not have I/O transactions implemented
    for PCIe will usually not be expected to handle legacy EISA systems.
    
    The change of the default will make it easier for people, including but
    not limited to distribution packagers, to make a working choice for the
    driver.
    
    Update the option description accordingly and while at it replace the
    potentially ambiguous PIO acronym with IOP for "port I/O" vs "I/O ports"
    according to our nomenclature used elsewhere.
    
    Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk>
    Fixes: e89a2cfb7d7b ("[TC] defxx: TURBOchannel support")
    Cc: stable@vger.kernel.org # v2.6.21+
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/fddi/Kconfig b/drivers/net/fddi/Kconfig
index 3a424c864f4d..ecebeeb9b2a0 100644
--- a/drivers/net/fddi/Kconfig
+++ b/drivers/net/fddi/Kconfig
@@ -28,17 +28,20 @@ config DEFXX
 
 config DEFXX_MMIO
 	bool
-	prompt "Use MMIO instead of PIO" if PCI || EISA
+	prompt "Use MMIO instead of IOP" if PCI || EISA
 	depends on DEFXX
-	default n if PCI || EISA
+	default n if EISA
 	default y
 	---help---
 	  This instructs the driver to use EISA or PCI memory-mapped I/O
-	  (MMIO) as appropriate instead of programmed I/O ports (PIO).
+	  (MMIO) as appropriate instead of programmed I/O ports (IOP).
 	  Enabling this gives an improvement in processing time in parts
-	  of the driver, but it may cause problems with EISA (DEFEA)
-	  adapters.  TURBOchannel does not have the concept of I/O ports,
-	  so MMIO is always used for these (DEFTA) adapters.
+	  of the driver, but it requires a memory window to be configured
+	  for EISA (DEFEA) adapters that may not always be available.
+	  Conversely some PCIe host bridges do not support IOP, so MMIO
+	  may be required to access PCI (DEFPA) adapters on downstream PCI
+	  buses with some systems.  TURBOchannel does not have the concept
+	  of I/O ports, so MMIO is always used for these (DEFTA) adapters.
 
 	  If unsure, say N.
 

commit de1a153bcd79f2a226c85f0027d3f0dbac5abcac
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Wed May 5 23:48:17 2021 +0200

    KVM: x86: Cancel pvclock_gtod_work on module removal
    
    commit 594b27e677b35f9734b1969d175ebc6146741109 upstream.
    
    Nothing prevents the following:
    
      pvclock_gtod_notify()
        queue_work(system_long_wq, &pvclock_gtod_work);
      ...
      remove_module(kvm);
      ...
      work_queue_run()
        pvclock_gtod_work() <- UAF
    
    Ditto for any other operation on that workqueue list head which touches
    pvclock_gtod_work after module removal.
    
    Cancel the work in kvm_arch_exit() to prevent that.
    
    Fixes: 16e8d74d2da9 ("KVM: x86: notifier for clocksource changes")
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Message-Id: <87czu4onry.ffs@nanos.tec.linutronix.de>
    Cc: stable@vger.kernel.org
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 8e4eef73531a..435e74e1f2e5 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -6911,6 +6911,7 @@ void kvm_arch_exit(void)
 	cpuhp_remove_state_nocalls(CPUHP_AP_X86_KVM_CLK_ONLINE);
 #ifdef CONFIG_X86_64
 	pvclock_gtod_unregister_notifier(&pvclock_gtod_notifier);
+	cancel_work_sync(&pvclock_gtod_work);
 #endif
 	kvm_x86_ops = NULL;
 	kvm_mmu_module_exit();

commit 19dcf2a27d01903a203a407baa40caa852a97998
Author: Oliver Neukum <oneukum@suse.com>
Date:   Mon Apr 26 11:26:22 2021 +0200

    cdc-wdm: untangle a circular dependency between callback and softint
    
    commit 18abf874367456540846319574864e6ff32752e2 upstream.
    
    We have a cycle of callbacks scheduling works which submit
    URBs with those callbacks. This needs to be blocked, stopped
    and unblocked to untangle the circle.
    
    Signed-off-by: Oliver Neukum <oneukum@suse.com>
    Link: https://lore.kernel.org/r/20210426092622.20433-1-oneukum@suse.com
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c
index ae69635bb1fb..48e775fff16d 100644
--- a/drivers/usb/class/cdc-wdm.c
+++ b/drivers/usb/class/cdc-wdm.c
@@ -321,12 +321,23 @@ static void wdm_int_callback(struct urb *urb)
 
 }
 
-static void kill_urbs(struct wdm_device *desc)
+static void poison_urbs(struct wdm_device *desc)
 {
 	/* the order here is essential */
-	usb_kill_urb(desc->command);
-	usb_kill_urb(desc->validity);
-	usb_kill_urb(desc->response);
+	usb_poison_urb(desc->command);
+	usb_poison_urb(desc->validity);
+	usb_poison_urb(desc->response);
+}
+
+static void unpoison_urbs(struct wdm_device *desc)
+{
+	/*
+	 *  the order here is not essential
+	 *  it is symmetrical just to be nice
+	 */
+	usb_unpoison_urb(desc->response);
+	usb_unpoison_urb(desc->validity);
+	usb_unpoison_urb(desc->command);
 }
 
 static void free_urbs(struct wdm_device *desc)
@@ -741,11 +752,12 @@ static int wdm_release(struct inode *inode, struct file *file)
 	if (!desc->count) {
 		if (!test_bit(WDM_DISCONNECTING, &desc->flags)) {
 			dev_dbg(&desc->intf->dev, "wdm_release: cleanup\n");
-			kill_urbs(desc);
+			poison_urbs(desc);
 			spin_lock_irq(&desc->iuspin);
 			desc->resp_count = 0;
 			spin_unlock_irq(&desc->iuspin);
 			desc->manage_power(desc->intf, 0);
+			unpoison_urbs(desc);
 		} else {
 			/* must avoid dev_printk here as desc->intf is invalid */
 			pr_debug(KBUILD_MODNAME " %s: device gone - cleaning up\n", __func__);
@@ -1036,9 +1048,9 @@ static void wdm_disconnect(struct usb_interface *intf)
 	wake_up_all(&desc->wait);
 	mutex_lock(&desc->rlock);
 	mutex_lock(&desc->wlock);
+	poison_urbs(desc);
 	cancel_work_sync(&desc->rxwork);
 	cancel_work_sync(&desc->service_outs_intr);
-	kill_urbs(desc);
 	mutex_unlock(&desc->wlock);
 	mutex_unlock(&desc->rlock);
 
@@ -1079,9 +1091,10 @@ static int wdm_suspend(struct usb_interface *intf, pm_message_t message)
 		set_bit(WDM_SUSPENDING, &desc->flags);
 		spin_unlock_irq(&desc->iuspin);
 		/* callback submits work - order is essential */
-		kill_urbs(desc);
+		poison_urbs(desc);
 		cancel_work_sync(&desc->rxwork);
 		cancel_work_sync(&desc->service_outs_intr);
+		unpoison_urbs(desc);
 	}
 	if (!PMSG_IS_AUTO(message)) {
 		mutex_unlock(&desc->wlock);
@@ -1139,7 +1152,7 @@ static int wdm_pre_reset(struct usb_interface *intf)
 	wake_up_all(&desc->wait);
 	mutex_lock(&desc->rlock);
 	mutex_lock(&desc->wlock);
-	kill_urbs(desc);
+	poison_urbs(desc);
 	cancel_work_sync(&desc->rxwork);
 	cancel_work_sync(&desc->service_outs_intr);
 	return 0;
@@ -1150,6 +1163,7 @@ static int wdm_post_reset(struct usb_interface *intf)
 	struct wdm_device *desc = wdm_find_device(intf);
 	int rv;
 
+	unpoison_urbs(desc);
 	clear_bit(WDM_OVERFLOW, &desc->flags);
 	clear_bit(WDM_RESETTING, &desc->flags);
 	rv = recover_from_urb_loss(desc);

commit cca061f64ae5fcbad364ebc336cabe99c5b6ec9f
Author: Colin Ian King <colin.king@canonical.com>
Date:   Fri May 7 19:30:41 2021 +0100

    iio: tsl2583: Fix division by a zero lux_val
    
    commit af0e1871d79cfbb91f732d2c6fa7558e45c31038 upstream.
    
    The lux_val returned from tsl2583_get_lux can potentially be zero,
    so check for this to avoid a division by zero and an overflowed
    gain_trim_val.
    
    Fixes clang scan-build warning:
    
    drivers/iio/light/tsl2583.c:345:40: warning: Either the
    condition 'lux_val<0' is redundant or there is division
    by zero at line 345. [zerodivcond]
    
    Fixes: ac4f6eee8fe8 ("staging: iio: TAOS tsl258x: Device driver")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Cc: <Stable@vger.kernel.org>
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iio/light/tsl2583.c b/drivers/iio/light/tsl2583.c
index 4b5d9988f025..23295fec5be5 100644
--- a/drivers/iio/light/tsl2583.c
+++ b/drivers/iio/light/tsl2583.c
@@ -350,6 +350,14 @@ static int tsl2583_als_calibrate(struct iio_dev *indio_dev)
 		return lux_val;
 	}
 
+	/* Avoid division by zero of lux_value later on */
+	if (lux_val == 0) {
+		dev_err(&chip->client->dev,
+			"%s: lux_val of 0 will produce out of range trim_value\n",
+			__func__);
+		return -ENODATA;
+	}
+
 	gain_trim_val = (unsigned int)(((chip->als_settings.als_cal_target)
 			* chip->als_settings.als_gain_trim) / lux_val);
 	if ((gain_trim_val < 250) || (gain_trim_val > 4000)) {

commit a9ab69e4b3896415792408d79bdebfffe733e4e9
Author: Dmitry Osipenko <digetx@gmail.com>
Date:   Fri Apr 23 05:09:59 2021 +0300

    iio: gyro: mpu3050: Fix reported temperature value
    
    commit f73c730774d88a14d7b60feee6d0e13570f99499 upstream.
    
    The raw temperature value is a 16-bit signed integer. The sign casting
    is missing in the code, which results in a wrong temperature reported
    by userspace tools, fix it.
    
    Cc: stable@vger.kernel.org
    Fixes: 3904b28efb2c ("iio: gyro: Add driver for the MPU-3050 gyroscope")
    Datasheet: https://www.cdiweb.com/datasheets/invensense/mpu-3000a.pdf
    Tested-by: Maxim Schwalm <maxim.schwalm@gmail.com> # Asus TF700T
    Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # Asus TF201
    Reported-by: Svyatoslav Ryhel <clamor95@gmail.com>
    Reviewed-by: Andy Shevchenko <Andy.Shevchenko@gmail.com>
    Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
    Acked-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
    Link: https://lore.kernel.org/r/20210423020959.5023-1-digetx@gmail.com
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iio/gyro/mpu3050-core.c b/drivers/iio/gyro/mpu3050-core.c
index 33120ccff87f..e6fdd0f4b4bc 100644
--- a/drivers/iio/gyro/mpu3050-core.c
+++ b/drivers/iio/gyro/mpu3050-core.c
@@ -270,7 +270,16 @@ static int mpu3050_read_raw(struct iio_dev *indio_dev,
 	case IIO_CHAN_INFO_OFFSET:
 		switch (chan->type) {
 		case IIO_TEMP:
-			/* The temperature scaling is (x+23000)/280 Celsius */
+			/*
+			 * The temperature scaling is (x+23000)/280 Celsius
+			 * for the "best fit straight line" temperature range
+			 * of -30C..85C.  The 23000 includes room temperature
+			 * offset of +35C, 280 is the precision scale and x is
+			 * the 16-bit signed integer reported by hardware.
+			 *
+			 * Temperature value itself represents temperature of
+			 * the sensor die.
+			 */
 			*val = 23000;
 			return IIO_VAL_INT;
 		default:
@@ -327,7 +336,7 @@ static int mpu3050_read_raw(struct iio_dev *indio_dev,
 				goto out_read_raw_unlock;
 			}
 
-			*val = be16_to_cpu(raw_val);
+			*val = (s16)be16_to_cpu(raw_val);
 			ret = IIO_VAL_INT;
 
 			goto out_read_raw_unlock;

commit 079582a83669bafaeef27a04ad4328886c1cb4fb
Author: Sandeep Singh <sandeep.singh@amd.com>
Date:   Wed May 12 11:08:16 2021 +0300

    xhci: Add reset resume quirk for AMD xhci controller.
    
    commit 3c128781d8da463761495aaf8898c9ecb4e71528 upstream.
    
    One of AMD xhci controller require reset on resume.
    Occasionally AMD xhci controller does not respond to
    Stop endpoint command.
    Once the issue happens controller goes into bad state
    and in that case controller needs to be reset.
    
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Sandeep Singh <sandeep.singh@amd.com>
    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Link: https://lore.kernel.org/r/20210512080816.866037-6-mathias.nyman@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
index 42ff11e3c4dc..19485c076ba3 100644
--- a/drivers/usb/host/xhci-pci.c
+++ b/drivers/usb/host/xhci-pci.c
@@ -144,8 +144,10 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
 	    (pdev->device == 0x15e0 || pdev->device == 0x15e1))
 		xhci->quirks |= XHCI_SNPS_BROKEN_SUSPEND;
 
-	if (pdev->vendor == PCI_VENDOR_ID_AMD && pdev->device == 0x15e5)
+	if (pdev->vendor == PCI_VENDOR_ID_AMD && pdev->device == 0x15e5) {
 		xhci->quirks |= XHCI_DISABLE_SPARSE;
+		xhci->quirks |= XHCI_RESET_ON_RESUME;
+	}
 
 	if (pdev->vendor == PCI_VENDOR_ID_AMD)
 		xhci->quirks |= XHCI_TRUST_TX_LENGTH;

commit 8d7a755ab48a0e01169c22aab5842603a34fc879
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Wed May 12 11:08:14 2021 +0300

    xhci: Do not use GFP_KERNEL in (potentially) atomic context
    
    commit dda32c00c9a0fa103b5d54ef72c477b7aa993679 upstream.
    
    'xhci_urb_enqueue()' is passed a 'mem_flags' argument, because "URBs may be
    submitted in interrupt context" (see comment related to 'usb_submit_urb()'
    in 'drivers/usb/core/urb.c')
    
    So this flag should be used in all the calling chain.
    Up to now, 'xhci_check_maxpacket()' which is only called from
    'xhci_urb_enqueue()', uses GFP_KERNEL.
    
    Be safe and pass the mem_flags to this function as well.
    
    Fixes: ddba5cd0aeff ("xhci: Use command structures when queuing commands on the command ring")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Link: https://lore.kernel.org/r/20210512080816.866037-4-mathias.nyman@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index 9ca59f3fffde..c4e3760abd5b 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -1374,7 +1374,7 @@ static int xhci_configure_endpoint(struct xhci_hcd *xhci,
  * we need to issue an evaluate context command and wait on it.
  */
 static int xhci_check_maxpacket(struct xhci_hcd *xhci, unsigned int slot_id,
-		unsigned int ep_index, struct urb *urb)
+		unsigned int ep_index, struct urb *urb, gfp_t mem_flags)
 {
 	struct xhci_container_ctx *out_ctx;
 	struct xhci_input_control_ctx *ctrl_ctx;
@@ -1405,7 +1405,7 @@ static int xhci_check_maxpacket(struct xhci_hcd *xhci, unsigned int slot_id,
 		 * changes max packet sizes.
 		 */
 
-		command = xhci_alloc_command(xhci, true, GFP_KERNEL);
+		command = xhci_alloc_command(xhci, true, mem_flags);
 		if (!command)
 			return -ENOMEM;
 
@@ -1502,7 +1502,7 @@ static int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flag
 		 */
 		if (urb->dev->speed == USB_SPEED_FULL) {
 			ret = xhci_check_maxpacket(xhci, slot_id,
-					ep_index, urb);
+					ep_index, urb, mem_flags);
 			if (ret < 0) {
 				xhci_urb_free_priv(urb_priv);
 				urb->hcpriv = NULL;

commit 7381dcf620182b4b986894ff36a832de479e1491
Author: Wesley Cheng <wcheng@codeaurora.org>
Date:   Fri May 7 10:55:19 2021 -0700

    usb: dwc3: gadget: Return success always for kick transfer in ep queue
    
    commit 18ffa988dbae69cc6e9949cddd9606f6fe533894 upstream.
    
    If an error is received when issuing a start or update transfer
    command, the error handler will stop all active requests (including
    the current USB request), and call dwc3_gadget_giveback() to notify
    function drivers of the requests which have been stopped.  Avoid
    returning an error for kick transfer during EP queue, to remove
    duplicate cleanup operations on the request being queued.
    
    Fixes: 8d99087c2db8 ("usb: dwc3: gadget: Properly handle failed kick_transfer")
    cc: stable@vger.kernel.org
    Signed-off-by: Wesley Cheng <wcheng@codeaurora.org>
    Link: https://lore.kernel.org/r/1620410119-24971-1-git-send-email-wcheng@codeaurora.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 7a89c9a7c8df..8ce13f5e83c7 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -1413,7 +1413,9 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
 		}
 	}
 
-	return __dwc3_gadget_kick_transfer(dep);
+	__dwc3_gadget_kick_transfer(dep);
+
+	return 0;
 }
 
 static int dwc3_gadget_ep_queue(struct usb_ep *ep, struct usb_request *request,

commit e132c5ca8f64fb9b52434130151a976f82dbfd46
Author: Chunfeng Yun <chunfeng.yun@mediatek.com>
Date:   Wed May 12 10:07:38 2021 +0800

    usb: core: hub: fix race condition about TRSMRCY of resume
    
    commit 975f94c7d6c306b833628baa9aec3f79db1eb3a1 upstream.
    
    This may happen if the port becomes resume status exactly
    when usb_port_resume() gets port status, it still need provide
    a TRSMCRY time before access the device.
    
    CC: <stable@vger.kernel.org>
    Reported-by: Tianping Fang <tianping.fang@mediatek.com>
    Acked-by: Alan Stern <stern@rowland.harvard.edu>
    Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
    Link: https://lore.kernel.org/r/20210512020738.52961-1-chunfeng.yun@mediatek.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index fa28f23a4a33..0ddc2e30065f 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -3539,9 +3539,6 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg)
 		 * sequence.
 		 */
 		status = hub_port_status(hub, port1, &portstatus, &portchange);
-
-		/* TRSMRCY = 10 msec */
-		msleep(10);
 	}
 
  SuspendCleared:
@@ -3556,6 +3553,9 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg)
 				usb_clear_port_feature(hub->hdev, port1,
 						USB_PORT_FEAT_C_SUSPEND);
 		}
+
+		/* TRSMRCY = 10 msec */
+		msleep(10);
 	}
 
 	if (udev->persist_enabled)

commit 8c4dce3dc8a5673453bc481461228713a07969e4
Author: Phil Elwell <phil@raspberrypi.com>
Date:   Thu May 6 12:22:00 2021 +0100

    usb: dwc2: Fix gadget DMA unmap direction
    
    commit 75a41ce46bae6cbe7d3bb2584eb844291d642874 upstream.
    
    The dwc2 gadget support maps and unmaps DMA buffers as necessary. When
    mapping and unmapping it uses the direction of the endpoint to select
    the direction of the DMA transfer, but this fails for Control OUT
    transfers because the unmap occurs after the endpoint direction has
    been reversed for the status phase.
    
    A possible solution would be to unmap the buffer before the direction
    is changed, but a safer, less invasive fix is to remember the buffer
    direction independently of the endpoint direction.
    
    Fixes: fe0b94abcdf6 ("usb: dwc2: gadget: manage ep0 state in software")
    Acked-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Phil Elwell <phil@raspberrypi.com>
    Link: https://lore.kernel.org/r/20210506112200.2893922-1-phil@raspberrypi.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h
index cc9c93affa14..828803b672aa 100644
--- a/drivers/usb/dwc2/core.h
+++ b/drivers/usb/dwc2/core.h
@@ -112,6 +112,7 @@ struct dwc2_hsotg_req;
  * @debugfs: File entry for debugfs file for this endpoint.
  * @dir_in: Set to true if this endpoint is of the IN direction, which
  *          means that it is sending data to the Host.
+ * @map_dir: Set to the value of dir_in when the DMA buffer is mapped.
  * @index: The index for the endpoint registers.
  * @mc: Multi Count - number of transactions per microframe
  * @interval: Interval for periodic endpoints, in frames or microframes.
@@ -161,6 +162,7 @@ struct dwc2_hsotg_ep {
 	unsigned short		fifo_index;
 
 	unsigned char           dir_in;
+	unsigned char           map_dir;
 	unsigned char           index;
 	unsigned char           mc;
 	u16                     interval;
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 42f66718bc18..d0edb7e453c0 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -380,7 +380,7 @@ static void dwc2_hsotg_unmap_dma(struct dwc2_hsotg *hsotg,
 {
 	struct usb_request *req = &hs_req->req;
 
-	usb_gadget_unmap_request(&hsotg->gadget, req, hs_ep->dir_in);
+	usb_gadget_unmap_request(&hsotg->gadget, req, hs_ep->map_dir);
 }
 
 /*
@@ -1163,6 +1163,7 @@ static int dwc2_hsotg_map_dma(struct dwc2_hsotg *hsotg,
 {
 	int ret;
 
+	hs_ep->map_dir = hs_ep->dir_in;
 	ret = usb_gadget_map_request(&hsotg->gadget, req, hs_ep->dir_in);
 	if (ret)
 		goto dma_error;

commit 7cc68b70b4df8e2ae81b2ddf95d0a8d6cb8bf697
Author: Maximilian Luz <luzmaximilian@gmail.com>
Date:   Wed May 12 11:08:15 2021 +0300

    usb: xhci: Increase timeout for HC halt
    
    commit ca09b1bea63ab83f4cca3a2ae8bc4f597ec28851 upstream.
    
    On some devices (specifically the SC8180x based Surface Pro X with
    QCOM04A6) HC halt / xhci_halt() times out during boot. Manually binding
    the xhci-hcd driver at some point later does not exhibit this behavior.
    To work around this, double XHCI_MAX_HALT_USEC, which also resolves this
    issue.
    
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com>
    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Link: https://lore.kernel.org/r/20210512080816.866037-5-mathias.nyman@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/host/xhci-ext-caps.h b/drivers/usb/host/xhci-ext-caps.h
index 268328c20681..2208fa6c7410 100644
--- a/drivers/usb/host/xhci-ext-caps.h
+++ b/drivers/usb/host/xhci-ext-caps.h
@@ -7,8 +7,9 @@
  * Author: Sarah Sharp
  * Some code borrowed from the Linux EHCI driver.
  */
-/* Up to 16 ms to halt an HC */
-#define XHCI_MAX_HALT_USEC	(16*1000)
+
+/* HC should halt within 16 ms, but use 32 ms as some hosts take longer */
+#define XHCI_MAX_HALT_USEC	(32 * 1000)
 /* HC not running - set to 1 when run/stop bit is cleared. */
 #define XHCI_STS_HALT		(1<<0)
 

commit ccda47fb808f658d0c60395e23d3bfce1394e044
Author: Ferry Toth <ftoth@exalondelft.nl>
Date:   Sun Apr 25 17:09:47 2021 +0200

    usb: dwc3: pci: Enable usb2-gadget-lpm-disable for Intel Merrifield
    
    commit 04357fafea9c7ed34525eb9680c760245c3bb958 upstream.
    
    On Intel Merrifield LPM is causing host to reset port after a timeout.
    By disabling LPM entirely this is prevented.
    
    Fixes: 066c09593454 ("usb: dwc3: pci: Enable extcon driver for Intel Merrifield")
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Signed-off-by: Ferry Toth <ftoth@exalondelft.nl>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210425150947.5862-1-ftoth@exalondelft.nl
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c
index 389ec4c689c4..bf40a2f36e97 100644
--- a/drivers/usb/dwc3/dwc3-pci.c
+++ b/drivers/usb/dwc3/dwc3-pci.c
@@ -133,6 +133,7 @@ static const struct property_entry dwc3_pci_amd_properties[] = {
 	PROPERTY_ENTRY_BOOL("snps,disable_scramble_quirk"),
 	PROPERTY_ENTRY_BOOL("snps,dis_u3_susphy_quirk"),
 	PROPERTY_ENTRY_BOOL("snps,dis_u2_susphy_quirk"),
+	PROPERTY_ENTRY_BOOL("snps,usb2-gadget-lpm-disable"),
 	PROPERTY_ENTRY_BOOL("linux,sysdev_is_parent"),
 	{}
 };

commit 3c5e6538383baa0691b4ea2670b82c7c959bda4f
Author: Marcel Hamer <marcel@solidxs.se>
Date:   Tue Apr 27 14:21:18 2021 +0200

    usb: dwc3: omap: improve extcon initialization
    
    commit e17b02d4970913233d543c79c9c66e72cac05bdd upstream.
    
    When extcon is used in combination with dwc3, it is assumed that the dwc3
    registers are untouched and as such are only configured if VBUS is valid
    or ID is tied to ground.
    
    In case VBUS is not valid or ID is floating, the registers are not
    configured as such during driver initialization, causing a wrong
    default state during boot.
    
    If the registers are not in a default state, because they are for
    instance touched by a boot loader, this can cause for a kernel error.
    
    Signed-off-by: Marcel Hamer <marcel@solidxs.se>
    Link: https://lore.kernel.org/r/20210427122118.1948340-1-marcel@solidxs.se
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c
index ed8b86517675..0dfb710f48b5 100644
--- a/drivers/usb/dwc3/dwc3-omap.c
+++ b/drivers/usb/dwc3/dwc3-omap.c
@@ -432,8 +432,13 @@ static int dwc3_omap_extcon_register(struct dwc3_omap *omap)
 
 		if (extcon_get_state(edev, EXTCON_USB) == true)
 			dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_VALID);
+		else
+			dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_OFF);
+
 		if (extcon_get_state(edev, EXTCON_USB_HOST) == true)
 			dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_GROUND);
+		else
+			dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_FLOAT);
 
 		omap->edev = edev;
 	}

commit 00b5bc6421739f6eba45eede245846394e0dd279
Author: Bart Van Assche <bvanassche@acm.org>
Date:   Thu May 13 10:15:29 2021 -0700

    blk-mq: Swap two calls in blk_mq_exit_queue()
    
    [ Upstream commit 630ef623ed26c18a457cdc070cf24014e50129c2 ]
    
    If a tag set is shared across request queues (e.g. SCSI LUNs) then the
    block layer core keeps track of the number of active request queues in
    tags->active_queues. blk_mq_tag_busy() and blk_mq_tag_idle() update that
    atomic counter if the hctx flag BLK_MQ_F_TAG_QUEUE_SHARED is set. Make
    sure that blk_mq_exit_queue() calls blk_mq_tag_idle() before that flag is
    cleared by blk_mq_del_queue_tag_set().
    
    Cc: Christoph Hellwig <hch@infradead.org>
    Cc: Ming Lei <ming.lei@redhat.com>
    Cc: Hannes Reinecke <hare@suse.com>
    Fixes: 0d2602ca30e4 ("blk-mq: improve support for shared tags maps")
    Signed-off-by: Bart Van Assche <bvanassche@acm.org>
    Reviewed-by: Ming Lei <ming.lei@redhat.com>
    Link: https://lore.kernel.org/r/20210513171529.7977-1-bvanassche@acm.org
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/block/blk-mq.c b/block/blk-mq.c
index 195526b93895..ae70b4809bec 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -2673,10 +2673,12 @@ EXPORT_SYMBOL(blk_mq_init_allocated_queue);
 /* tags can _not_ be used after returning from blk_mq_exit_queue */
 void blk_mq_exit_queue(struct request_queue *q)
 {
-	struct blk_mq_tag_set	*set = q->tag_set;
+	struct blk_mq_tag_set *set = q->tag_set;
 
-	blk_mq_del_queue_tag_set(q);
+	/* Checks hctx->flags & BLK_MQ_F_TAG_QUEUE_SHARED. */
 	blk_mq_exit_hw_queues(q, set, set->nr_hw_queues);
+	/* May clear BLK_MQ_F_TAG_QUEUE_SHARED in hctx->flags. */
+	blk_mq_del_queue_tag_set(q);
 }
 
 /* Basically redo blk_mq_init_queue with queue frozen */

commit 69cc821e89ce572884548ac54c4f80eec7a837a5
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Sat May 8 09:23:09 2021 +0200

    ACPI: scan: Fix a memory leak in an error handling path
    
    [ Upstream commit 0c8bd174f0fc131bc9dfab35cd8784f59045da87 ]
    
    If 'acpi_device_set_name()' fails, we must free
    'acpi_device_bus_id->bus_id' or there is a (potential) memory leak.
    
    Fixes: eb50aaf960e3 ("ACPI: scan: Use unique number for instance_no")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index d3c551bdc2da..1e7e2c438acf 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -705,6 +705,7 @@ int acpi_device_add(struct acpi_device *device,
 
 		result = acpi_device_set_name(device, acpi_device_bus_id);
 		if (result) {
+			kfree_const(acpi_device_bus_id->bus_id);
 			kfree(acpi_device_bus_id);
 			goto err_unlock;
 		}

commit 698d655a72e034f226cd0c0af540e9e3c2780025
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Thu May 6 22:39:10 2021 +0200

    usb: fotg210-hcd: Fix an error message
    
    [ Upstream commit a60a34366e0d09ca002c966dd7c43a68c28b1f82 ]
    
    'retval' is known to be -ENODEV here.
    This is a hard-coded default error code which is not useful in the error
    message. Moreover, another error message is printed at the end of the
    error handling path. The corresponding error code (-ENOMEM) is more
    informative.
    
    So remove simplify the first error message.
    
    While at it, also remove the useless initialization of 'retval'.
    
    Fixes: 7d50195f6c50 ("usb: host: Faraday fotg210-hcd driver")
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Link: https://lore.kernel.org/r/94531bcff98e46d4f9c20183a90b7f47f699126c.1620333419.git.christophe.jaillet@wanadoo.fr
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/host/fotg210-hcd.c b/drivers/usb/host/fotg210-hcd.c
index 2d5a72c15069..226b38274a6e 100644
--- a/drivers/usb/host/fotg210-hcd.c
+++ b/drivers/usb/host/fotg210-hcd.c
@@ -5569,7 +5569,7 @@ static int fotg210_hcd_probe(struct platform_device *pdev)
 	struct usb_hcd *hcd;
 	struct resource *res;
 	int irq;
-	int retval = -ENODEV;
+	int retval;
 	struct fotg210_hcd *fotg210;
 
 	if (usb_disabled())
@@ -5589,7 +5589,7 @@ static int fotg210_hcd_probe(struct platform_device *pdev)
 	hcd = usb_create_hcd(&fotg210_fotg210_hc_driver, dev,
 			dev_name(dev));
 	if (!hcd) {
-		dev_err(dev, "failed to create hcd with err %d\n", retval);
+		dev_err(dev, "failed to create hcd\n");
 		retval = -ENOMEM;
 		goto fail_create_hcd;
 	}

commit a310e9710e536abed1e86f3c0e32729165b96f31
Author: Dinghao Liu <dinghao.liu@zju.edu.cn>
Date:   Mon Apr 12 13:32:02 2021 +0800

    iio: proximity: pulsedlight: Fix rumtime PM imbalance on error
    
    [ Upstream commit a2fa9242e89f27696515699fe0f0296bf1ac1815 ]
    
    When lidar_write_control() fails, a pairing PM usage counter
    decrement is needed to keep the counter balanced.
    
    Fixes: 4ac4e086fd8c5 ("iio: pulsedlight-lidar-lite: add runtime PM")
    Signed-off-by: Dinghao Liu <dinghao.liu@zju.edu.cn>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Link: https://lore.kernel.org/r/20210412053204.4889-1-dinghao.liu@zju.edu.cn
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c b/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
index 47af54f14756..67f85268b63d 100644
--- a/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
+++ b/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
@@ -158,6 +158,7 @@ static int lidar_get_measurement(struct lidar_data *data, u16 *reg)
 	ret = lidar_write_control(data, LIDAR_REG_CONTROL_ACQUIRE);
 	if (ret < 0) {
 		dev_err(&client->dev, "cannot send start measurement command");
+		pm_runtime_put_noidle(&client->dev);
 		return ret;
 	}
 

commit c6f40bc681e32ba54dee7f0ec021e5f9f0417315
Author: Kai-Heng Feng <kai.heng.feng@canonical.com>
Date:   Fri Apr 30 12:56:56 2021 +0800

    drm/radeon/dpm: Disable sclk switching on Oland when two 4K 60Hz monitors are connected
    
    commit 227545b9a08c68778ddd89428f99c351fc9315ac upstream.
    
    Screen flickers rapidly when two 4K 60Hz monitors are in use. This issue
    doesn't happen when one monitor is 4K 60Hz (pixelclock 594MHz) and
    another one is 4K 30Hz (pixelclock 297MHz).
    
    The issue is gone after setting "power_dpm_force_performance_level" to
    "high". Following the indication, we found that the issue occurs when
    sclk is too low.
    
    So resolve the issue by disabling sclk switching when there are two
    monitors requires high pixelclock (> 297MHz).
    
    v2:
     - Only apply the fix to Oland.
    Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 1a6f6edb3515..62e6e3b73e4e 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -1558,6 +1558,7 @@ struct radeon_dpm {
 	void                    *priv;
 	u32			new_active_crtcs;
 	int			new_active_crtc_count;
+	int			high_pixelclock_count;
 	u32			current_active_crtcs;
 	int			current_active_crtc_count;
 	bool single_display;
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c
index 4b6542538ff9..c213a5c9227e 100644
--- a/drivers/gpu/drm/radeon/radeon_pm.c
+++ b/drivers/gpu/drm/radeon/radeon_pm.c
@@ -1715,6 +1715,7 @@ static void radeon_pm_compute_clocks_dpm(struct radeon_device *rdev)
 	struct drm_device *ddev = rdev->ddev;
 	struct drm_crtc *crtc;
 	struct radeon_crtc *radeon_crtc;
+	struct radeon_connector *radeon_connector;
 
 	if (!rdev->pm.dpm_enabled)
 		return;
@@ -1724,6 +1725,7 @@ static void radeon_pm_compute_clocks_dpm(struct radeon_device *rdev)
 	/* update active crtc counts */
 	rdev->pm.dpm.new_active_crtcs = 0;
 	rdev->pm.dpm.new_active_crtc_count = 0;
+	rdev->pm.dpm.high_pixelclock_count = 0;
 	if (rdev->num_crtc && rdev->mode_info.mode_config_initialized) {
 		list_for_each_entry(crtc,
 				    &ddev->mode_config.crtc_list, head) {
@@ -1731,6 +1733,12 @@ static void radeon_pm_compute_clocks_dpm(struct radeon_device *rdev)
 			if (crtc->enabled) {
 				rdev->pm.dpm.new_active_crtcs |= (1 << radeon_crtc->crtc_id);
 				rdev->pm.dpm.new_active_crtc_count++;
+				if (!radeon_crtc->connector)
+					continue;
+
+				radeon_connector = to_radeon_connector(radeon_crtc->connector);
+				if (radeon_connector->pixelclock_for_modeset > 297000)
+					rdev->pm.dpm.high_pixelclock_count++;
 			}
 		}
 	}
diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c
index db2d8b84e137..aac18d527c01 100644
--- a/drivers/gpu/drm/radeon/si_dpm.c
+++ b/drivers/gpu/drm/radeon/si_dpm.c
@@ -3000,6 +3000,9 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev,
 		    (rdev->pdev->device == 0x6605)) {
 			max_sclk = 75000;
 		}
+
+		if (rdev->pm.dpm.high_pixelclock_count > 1)
+			disable_sclk_switching = true;
 	}
 
 	if (rps->vce_active) {

commit 07c9b834c97d0fa3402fb7f3f3b32df370a6ff1f
Author: Axel Rasmussen <axelrasmussen@google.com>
Date:   Fri May 14 17:27:19 2021 -0700

    userfaultfd: release page in error path to avoid BUG_ON
    
    commit 7ed9d238c7dbb1fdb63ad96a6184985151b0171c upstream.
    
    Consider the following sequence of events:
    
    1. Userspace issues a UFFD ioctl, which ends up calling into
       shmem_mfill_atomic_pte(). We successfully account the blocks, we
       shmem_alloc_page(), but then the copy_from_user() fails. We return
       -ENOENT. We don't release the page we allocated.
    2. Our caller detects this error code, tries the copy_from_user() after
       dropping the mmap_lock, and retries, calling back into
       shmem_mfill_atomic_pte().
    3. Meanwhile, let's say another process filled up the tmpfs being used.
    4. So shmem_mfill_atomic_pte() fails to account blocks this time, and
       immediately returns - without releasing the page.
    
    This triggers a BUG_ON in our caller, which asserts that the page
    should always be consumed, unless -ENOENT is returned.
    
    To fix this, detect if we have such a "dangling" page when accounting
    fails, and if so, release it before returning.
    
    Link: https://lkml.kernel.org/r/20210428230858.348400-1-axelrasmussen@google.com
    Fixes: cb658a453b93 ("userfaultfd: shmem: avoid leaking blocks and used blocks in UFFDIO_COPY")
    Signed-off-by: Axel Rasmussen <axelrasmussen@google.com>
    Reported-by: Hugh Dickins <hughd@google.com>
    Acked-by: Hugh Dickins <hughd@google.com>
    Reviewed-by: Peter Xu <peterx@redhat.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/mm/shmem.c b/mm/shmem.c
index dea5120565d3..9fd0e72757cf 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -2271,8 +2271,18 @@ static int shmem_mfill_atomic_pte(struct mm_struct *dst_mm,
 	pgoff_t offset, max_off;
 
 	ret = -ENOMEM;
-	if (!shmem_inode_acct_block(inode, 1))
+	if (!shmem_inode_acct_block(inode, 1)) {
+		/*
+		 * We may have got a page, returned -ENOENT triggering a retry,
+		 * and now we find ourselves with -ENOMEM. Release the page, to
+		 * avoid a BUG_ON in our caller.
+		 */
+		if (unlikely(*pagep)) {
+			put_page(*pagep);
+			*pagep = NULL;
+		}
 		goto out;
+	}
 
 	if (!*pagep) {
 		page = shmem_alloc_page(gfp, info, pgoff);

commit a0aefbeabc5cbacdc08e57f26cfe0dadc942b4d7
Author: Phillip Lougher <phillip@squashfs.org.uk>
Date:   Fri May 14 17:27:16 2021 -0700

    squashfs: fix divide error in calculate_skip()
    
    commit d6e621de1fceb3b098ebf435ef7ea91ec4838a1a upstream.
    
    Sysbot has reported a "divide error" which has been identified as being
    caused by a corrupted file_size value within the file inode.  This value
    has been corrupted to a much larger value than expected.
    
    Calculate_skip() is passed i_size_read(inode) >> msblk->block_log.  Due to
    the file_size value corruption this overflows the int argument/variable in
    that function, leading to the divide error.
    
    This patch changes the function to use u64.  This will accommodate any
    unexpectedly large values due to corruption.
    
    The value returned from calculate_skip() is clamped to be never more than
    SQUASHFS_CACHED_BLKS - 1, or 7.  So file_size corruption does not lead to
    an unexpectedly large return result here.
    
    Link: https://lkml.kernel.org/r/20210507152618.9447-1-phillip@squashfs.org.uk
    Signed-off-by: Phillip Lougher <phillip@squashfs.org.uk>
    Reported-by: <syzbot+e8f781243ce16ac2f962@syzkaller.appspotmail.com>
    Reported-by: <syzbot+7b98870d4fec9447b951@syzkaller.appspotmail.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/squashfs/file.c b/fs/squashfs/file.c
index f1c1430ae721..0bcb83479fcb 100644
--- a/fs/squashfs/file.c
+++ b/fs/squashfs/file.c
@@ -224,11 +224,11 @@ static long long read_indexes(struct super_block *sb, int n,
  * If the skip factor is limited in this way then the file will use multiple
  * slots.
  */
-static inline int calculate_skip(int blocks)
+static inline int calculate_skip(u64 blocks)
 {
-	int skip = blocks / ((SQUASHFS_META_ENTRIES + 1)
+	u64 skip = blocks / ((SQUASHFS_META_ENTRIES + 1)
 		 * SQUASHFS_META_INDEXES);
-	return min(SQUASHFS_CACHED_BLKS - 1, skip + 1);
+	return min((u64) SQUASHFS_CACHED_BLKS - 1, skip + 1);
 }
 
 

commit 52dde855663e5db824af51db39b5757d2ef3e28a
Author: Jouni Roivas <jouni.roivas@tuxera.com>
Date:   Fri May 14 17:27:33 2021 -0700

    hfsplus: prevent corruption in shrinking truncate
    
    commit c3187cf32216313fb316084efac4dab3a8459b1d upstream.
    
    I believe there are some issues introduced by commit 31651c607151
    ("hfsplus: avoid deadlock on file truncation")
    
    HFS+ has extent records which always contains 8 extents.  In case the
    first extent record in catalog file gets full, new ones are allocated from
    extents overflow file.
    
    In case shrinking truncate happens to middle of an extent record which
    locates in extents overflow file, the logic in hfsplus_file_truncate() was
    changed so that call to hfs_brec_remove() is not guarded any more.
    
    Right action would be just freeing the extents that exceed the new size
    inside extent record by calling hfsplus_free_extents(), and then check if
    the whole extent record should be removed.  However since the guard
    (blk_cnt > start) is now after the call to hfs_brec_remove(), this has
    unfortunate effect that the last matching extent record is removed
    unconditionally.
    
    To reproduce this issue, create a file which has at least 10 extents, and
    then perform shrinking truncate into middle of the last extent record, so
    that the number of remaining extents is not under or divisible by 8.  This
    causes the last extent record (8 extents) to be removed totally instead of
    truncating into middle of it.  Thus this causes corruption, and lost data.
    
    Fix for this is simply checking if the new truncated end is below the
    start of this extent record, making it safe to remove the full extent
    record.  However call to hfs_brec_remove() can't be moved to it's previous
    place since we're dropping ->tree_lock and it can cause a race condition
    and the cached info being invalidated possibly corrupting the node data.
    
    Another issue is related to this one.  When entering into the block
    (blk_cnt > start) we are not holding the ->tree_lock.  We break out from
    the loop not holding the lock, but hfs_find_exit() does unlock it.  Not
    sure if it's possible for someone else to take the lock under our feet,
    but it can cause hard to debug errors and premature unlocking.  Even if
    there's no real risk of it, the locking should still always be kept in
    balance.  Thus taking the lock now just before the check.
    
    Link: https://lkml.kernel.org/r/20210429165139.3082828-1-jouni.roivas@tuxera.com
    Fixes: 31651c607151f ("hfsplus: avoid deadlock on file truncation")
    Signed-off-by: Jouni Roivas <jouni.roivas@tuxera.com>
    Reviewed-by: Anton Altaparmakov <anton@tuxera.com>
    Cc: Anatoly Trosinenko <anatoly.trosinenko@gmail.com>
    Cc: Viacheslav Dubeyko <slava@dubeyko.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/hfsplus/extents.c b/fs/hfsplus/extents.c
index a930ddd15681..7054a542689f 100644
--- a/fs/hfsplus/extents.c
+++ b/fs/hfsplus/extents.c
@@ -598,13 +598,15 @@ void hfsplus_file_truncate(struct inode *inode)
 		res = __hfsplus_ext_cache_extent(&fd, inode, alloc_cnt);
 		if (res)
 			break;
-		hfs_brec_remove(&fd);
 
-		mutex_unlock(&fd.tree->tree_lock);
 		start = hip->cached_start;
+		if (blk_cnt <= start)
+			hfs_brec_remove(&fd);
+		mutex_unlock(&fd.tree->tree_lock);
 		hfsplus_free_extents(sb, hip->cached_extents,
 				     alloc_cnt - start, alloc_cnt - blk_cnt);
 		hfsplus_dump_extent(hip->cached_extents);
+		mutex_lock(&fd.tree->tree_lock);
 		if (blk_cnt > start) {
 			hip->extent_state |= HFSPLUS_EXT_DIRTY;
 			break;
@@ -612,7 +614,6 @@ void hfsplus_file_truncate(struct inode *inode)
 		alloc_cnt = start;
 		hip->cached_start = hip->cached_blocks = 0;
 		hip->extent_state &= ~(HFSPLUS_EXT_DIRTY | HFSPLUS_EXT_NEW);
-		mutex_lock(&fd.tree->tree_lock);
 	}
 	hfs_find_exit(&fd);
 

commit 2db22ba4e0e103f00e0512e0ecce36ac78c644f8
Author: Michael Ellerman <mpe@ellerman.id.au>
Date:   Thu May 6 14:49:59 2021 +1000

    powerpc/64s: Fix crashes when toggling entry flush barrier
    
    commit aec86b052df6541cc97c5fca44e5934cbea4963b upstream.
    
    The entry flush mitigation can be enabled/disabled at runtime via a
    debugfs file (entry_flush), which causes the kernel to patch itself to
    enable/disable the relevant mitigations.
    
    However depending on which mitigation we're using, it may not be safe to
    do that patching while other CPUs are active. For example the following
    crash:
    
      sleeper[15639]: segfault (11) at c000000000004c20 nip c000000000004c20 lr c000000000004c20
    
    Shows that we returned to userspace with a corrupted LR that points into
    the kernel, due to executing the partially patched call to the fallback
    entry flush (ie. we missed the LR restore).
    
    Fix it by doing the patching under stop machine. The CPUs that aren't
    doing the patching will be spinning in the core of the stop machine
    logic. That is currently sufficient for our purposes, because none of
    the patching we do is to that code or anywhere in the vicinity.
    
    Fixes: f79643787e0a ("powerpc/64s: flush L1D on kernel entry")
    Cc: stable@vger.kernel.org # v5.10+
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210506044959.1298123-2-mpe@ellerman.id.au
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/powerpc/lib/feature-fixups.c b/arch/powerpc/lib/feature-fixups.c
index 023ced2df2ab..1561094ea4a5 100644
--- a/arch/powerpc/lib/feature-fixups.c
+++ b/arch/powerpc/lib/feature-fixups.c
@@ -297,8 +297,9 @@ void do_uaccess_flush_fixups(enum l1d_flush_type types)
 						: "unknown");
 }
 
-void do_entry_flush_fixups(enum l1d_flush_type types)
+static int __do_entry_flush_fixups(void *data)
 {
+	enum l1d_flush_type types = *(enum l1d_flush_type *)data;
 	unsigned int instrs[3], *dest;
 	long *start, *end;
 	int i;
@@ -349,6 +350,19 @@ void do_entry_flush_fixups(enum l1d_flush_type types)
 							: "ori type" :
 		(types &  L1D_FLUSH_MTTRIG)     ? "mttrig type"
 						: "unknown");
+
+	return 0;
+}
+
+void do_entry_flush_fixups(enum l1d_flush_type types)
+{
+	/*
+	 * The call to the fallback flush can not be safely patched in/out while
+	 * other CPUs are executing it. So call __do_entry_flush_fixups() on one
+	 * CPU while all other CPUs spin in the stop machine core with interrupts
+	 * hard disabled.
+	 */
+	stop_machine(__do_entry_flush_fixups, &types, NULL);
 }
 
 void do_rfi_flush_fixups(enum l1d_flush_type types)

commit dc2fd8125e13f6843a0008096a2e4e1a9f51b8d8
Author: Michael Ellerman <mpe@ellerman.id.au>
Date:   Thu May 6 14:49:58 2021 +1000

    powerpc/64s: Fix crashes when toggling stf barrier
    
    commit 8ec7791bae1327b1c279c5cd6e929c3b12daaf0a upstream.
    
    The STF (store-to-load forwarding) barrier mitigation can be
    enabled/disabled at runtime via a debugfs file (stf_barrier), which
    causes the kernel to patch itself to enable/disable the relevant
    mitigations.
    
    However depending on which mitigation we're using, it may not be safe to
    do that patching while other CPUs are active. For example the following
    crash:
    
      User access of kernel address (c00000003fff5af0) - exploit attempt? (uid: 0)
      segfault (11) at c00000003fff5af0 nip 7fff8ad12198 lr 7fff8ad121f8 code 1
      code: 40820128 e93c00d0 e9290058 7c292840 40810058 38600000 4bfd9a81 e8410018
      code: 2c030006 41810154 3860ffb6 e9210098 <e94d8ff0> 7d295279 39400000 40820a3c
    
    Shows that we returned to userspace without restoring the user r13
    value, due to executing the partially patched STF exit code.
    
    Fix it by doing the patching under stop machine. The CPUs that aren't
    doing the patching will be spinning in the core of the stop machine
    logic. That is currently sufficient for our purposes, because none of
    the patching we do is to that code or anywhere in the vicinity.
    
    Fixes: a048a07d7f45 ("powerpc/64s: Add support for a store forwarding barrier at kernel entry/exit")
    Cc: stable@vger.kernel.org # v4.17+
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210506044959.1298123-1-mpe@ellerman.id.au
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/powerpc/lib/feature-fixups.c b/arch/powerpc/lib/feature-fixups.c
index 065a3426f0eb..023ced2df2ab 100644
--- a/arch/powerpc/lib/feature-fixups.c
+++ b/arch/powerpc/lib/feature-fixups.c
@@ -18,6 +18,7 @@
 #include <linux/string.h>
 #include <linux/init.h>
 #include <linux/sched/mm.h>
+#include <linux/stop_machine.h>
 #include <asm/cputable.h>
 #include <asm/code-patching.h>
 #include <asm/page.h>
@@ -225,11 +226,25 @@ void do_stf_exit_barrier_fixups(enum stf_barrier_type types)
 		                                           : "unknown");
 }
 
+static int __do_stf_barrier_fixups(void *data)
+{
+	enum stf_barrier_type *types = data;
+
+	do_stf_entry_barrier_fixups(*types);
+	do_stf_exit_barrier_fixups(*types);
+
+	return 0;
+}
 
 void do_stf_barrier_fixups(enum stf_barrier_type types)
 {
-	do_stf_entry_barrier_fixups(types);
-	do_stf_exit_barrier_fixups(types);
+	/*
+	 * The call to the fallback entry flush, and the fallback/sync-ori exit
+	 * flush can not be safely patched in/out while other CPUs are executing
+	 * them. So call __do_stf_barrier_fixups() on one CPU while all other CPUs
+	 * spin in the stop machine core with interrupts hard disabled.
+	 */
+	stop_machine(__do_stf_barrier_fixups, &types, NULL);
 }
 
 void do_uaccess_flush_fixups(enum l1d_flush_type types)

commit 0c0b8be4234ca03ccd0a25f9855d21e29c9152a5
Author: Vineet Gupta <vgupta@synopsys.com>
Date:   Fri Apr 23 12:16:25 2021 -0700

    ARC: entry: fix off-by-one error in syscall number validation
    
    commit 3433adc8bd09fc9f29b8baddf33b4ecd1ecd2cdc upstream.
    
    We have NR_syscall syscalls from [0 .. NR_syscall-1].
    However the check for invalid syscall number is "> NR_syscall" as
    opposed to >=. This off-by-one error erronesously allows "NR_syscall"
    to be treated as valid syscall causeing out-of-bounds access into
    syscall-call table ensuing a crash (holes within syscall table have a
    invalid-entry handler but this is beyond the array implementing the
    table).
    
    This problem showed up on v5.6 kernel when testing glibc 2.33 (v5.10
    kernel capable, includng faccessat2 syscall 439). The v5.6 kernel has
    NR_syscalls=439 (0 to 438). Due to the bug, 439 passed by glibc was
    not handled as -ENOSYS but processed leading to a crash.
    
    Link: https://github.com/foss-for-synopsys-dwc-arc-processors/linux/issues/48
    Reported-by: Shahab Vahedi <shahab@synopsys.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arc/kernel/entry.S b/arch/arc/kernel/entry.S
index 85d9ea4a0acc..37ad245cf989 100644
--- a/arch/arc/kernel/entry.S
+++ b/arch/arc/kernel/entry.S
@@ -169,7 +169,7 @@ tracesys:
 
 	; Do the Sys Call as we normally would.
 	; Validate the Sys Call number
-	cmp     r8,  NR_syscalls
+	cmp     r8,  NR_syscalls - 1
 	mov.hi  r0, -ENOSYS
 	bhi     tracesys_exit
 
@@ -252,7 +252,7 @@ ENTRY(EV_Trap)
 	;============ Normal syscall case
 
 	; syscall num shd not exceed the total system calls avail
-	cmp     r8,  NR_syscalls
+	cmp     r8,  NR_syscalls - 1
 	mov.hi  r0, -ENOSYS
 	bhi     .Lret_from_system_call
 

commit c1322eaeb8af0d8985b5cc5fa759140fa0e57b84
Author: Yunjian Wang <wangyunjian@huawei.com>
Date:   Mon Apr 12 22:41:18 2021 +0800

    i40e: Fix use-after-free in i40e_client_subtask()
    
    [ Upstream commit 38318f23a7ef86a8b1862e5e8078c4de121960c3 ]
    
    Currently the call to i40e_client_del_instance frees the object
    pf->cinst, however pf->cinst->lan_info is being accessed after
    the free. Fix this by adding the missing return.
    
    Addresses-Coverity: ("Read from pointer after free")
    Fixes: 7b0b1a6d0ac9 ("i40e: Disable iWARP VSI PETCP_ENA flag on netdev down events")
    Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/intel/i40e/i40e_client.c b/drivers/net/ethernet/intel/i40e/i40e_client.c
index 5f3b8b9ff511..c1832a848714 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_client.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_client.c
@@ -377,6 +377,7 @@ void i40e_client_subtask(struct i40e_pf *pf)
 				clear_bit(__I40E_CLIENT_INSTANCE_OPENED,
 					  &cdev->state);
 				i40e_client_del_instance(pf);
+				return;
 			}
 		}
 	}

commit efcd730ddd6f25578bd31bfe703e593e2421d708
Author: Eric Dumazet <edumazet@google.com>
Date:   Thu May 6 05:53:23 2021 -0700

    netfilter: nftables: avoid overflows in nft_hash_buckets()
    
    [ Upstream commit a54754ec9891830ba548e2010c889e3c8146e449 ]
    
    Number of buckets being stored in 32bit variables, we have to
    ensure that no overflows occur in nft_hash_buckets()
    
    syzbot injected a size == 0x40000000 and reported:
    
    UBSAN: shift-out-of-bounds in ./include/linux/log2.h:57:13
    shift exponent 64 is too large for 64-bit type 'long unsigned int'
    CPU: 1 PID: 29539 Comm: syz-executor.4 Not tainted 5.12.0-rc7-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    Call Trace:
     __dump_stack lib/dump_stack.c:79 [inline]
     dump_stack+0x141/0x1d7 lib/dump_stack.c:120
     ubsan_epilogue+0xb/0x5a lib/ubsan.c:148
     __ubsan_handle_shift_out_of_bounds.cold+0xb1/0x181 lib/ubsan.c:327
     __roundup_pow_of_two include/linux/log2.h:57 [inline]
     nft_hash_buckets net/netfilter/nft_set_hash.c:411 [inline]
     nft_hash_estimate.cold+0x19/0x1e net/netfilter/nft_set_hash.c:652
     nft_select_set_ops net/netfilter/nf_tables_api.c:3586 [inline]
     nf_tables_newset+0xe62/0x3110 net/netfilter/nf_tables_api.c:4322
     nfnetlink_rcv_batch+0xa09/0x24b0 net/netfilter/nfnetlink.c:488
     nfnetlink_rcv_skb_batch net/netfilter/nfnetlink.c:612 [inline]
     nfnetlink_rcv+0x3af/0x420 net/netfilter/nfnetlink.c:630
     netlink_unicast_kernel net/netlink/af_netlink.c:1312 [inline]
     netlink_unicast+0x533/0x7d0 net/netlink/af_netlink.c:1338
     netlink_sendmsg+0x856/0xd90 net/netlink/af_netlink.c:1927
     sock_sendmsg_nosec net/socket.c:654 [inline]
     sock_sendmsg+0xcf/0x120 net/socket.c:674
     ____sys_sendmsg+0x6e8/0x810 net/socket.c:2350
     ___sys_sendmsg+0xf3/0x170 net/socket.c:2404
     __sys_sendmsg+0xe5/0x1b0 net/socket.c:2433
     do_syscall_64+0x2d/0x70 arch/x86/entry/common.c:46
    
    Fixes: 0ed6389c483d ("netfilter: nf_tables: rename set implementations")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netfilter/nft_set_hash.c b/net/netfilter/nft_set_hash.c
index 05118e03c3e4..dbc4ed643b4b 100644
--- a/net/netfilter/nft_set_hash.c
+++ b/net/netfilter/nft_set_hash.c
@@ -392,9 +392,17 @@ static void nft_rhash_destroy(const struct nft_set *set)
 				    (void *)set);
 }
 
+/* Number of buckets is stored in u32, so cap our result to 1U<<31 */
+#define NFT_MAX_BUCKETS (1U << 31)
+
 static u32 nft_hash_buckets(u32 size)
 {
-	return roundup_pow_of_two(size * 4 / 3);
+	u64 val = div_u64((u64)size * 4, 3);
+
+	if (val >= NFT_MAX_BUCKETS)
+		return NFT_MAX_BUCKETS;
+
+	return roundup_pow_of_two(val);
 }
 
 static bool nft_rhash_estimate(const struct nft_set_desc *desc, u32 features,

commit 71bafe8dfbd81558911e38376eefecbc26458b2c
Author: Jia-Ju Bai <baijiaju1990@gmail.com>
Date:   Thu May 6 18:04:38 2021 -0700

    kernel: kexec_file: fix error return code of kexec_calculate_store_digests()
    
    [ Upstream commit 31d82c2c787d5cf65fedd35ebbc0c1bd95c1a679 ]
    
    When vzalloc() returns NULL to sha_regions, no error return code of
    kexec_calculate_store_digests() is assigned.  To fix this bug, ret is
    assigned with -ENOMEM in this case.
    
    Link: https://lkml.kernel.org/r/20210309083904.24321-1-baijiaju1990@gmail.com
    Fixes: a43cac0d9dc2 ("kexec: split kexec_file syscall code to kexec_file.c")
    Signed-off-by: Jia-Ju Bai <baijiaju1990@gmail.com>
    Reported-by: TOTE Robot <oslab@tsinghua.edu.cn>
    Acked-by: Baoquan He <bhe@redhat.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
index 2fbdb78d66c8..89d41c0a10f1 100644
--- a/kernel/kexec_file.c
+++ b/kernel/kexec_file.c
@@ -631,8 +631,10 @@ static int kexec_calculate_store_digests(struct kimage *image)
 
 	sha_region_sz = KEXEC_SEGMENT_MAX * sizeof(struct kexec_sha_region);
 	sha_regions = vzalloc(sha_region_sz);
-	if (!sha_regions)
+	if (!sha_regions) {
+		ret = -ENOMEM;
 		goto out_free_desc;
+	}
 
 	desc->tfm   = tfm;
 	desc->flags = 0;

commit 434ea8c1d1bf296a2597aeb28f6ccf62ae82f235
Author: Odin Ugedal <odin@uged.al>
Date:   Sat May 1 16:19:50 2021 +0200

    sched/fair: Fix unfairness caused by missing load decay
    
    [ Upstream commit 0258bdfaff5bd13c4d2383150b7097aecd6b6d82 ]
    
    This fixes an issue where old load on a cfs_rq is not properly decayed,
    resulting in strange behavior where fairness can decrease drastically.
    Real workloads with equally weighted control groups have ended up
    getting a respective 99% and 1%(!!) of cpu time.
    
    When an idle task is attached to a cfs_rq by attaching a pid to a cgroup,
    the old load of the task is attached to the new cfs_rq and sched_entity by
    attach_entity_cfs_rq. If the task is then moved to another cpu (and
    therefore cfs_rq) before being enqueued/woken up, the load will be moved
    to cfs_rq->removed from the sched_entity. Such a move will happen when
    enforcing a cpuset on the task (eg. via a cgroup) that force it to move.
    
    The load will however not be removed from the task_group itself, making
    it look like there is a constant load on that cfs_rq. This causes the
    vruntime of tasks on other sibling cfs_rq's to increase faster than they
    are supposed to; causing severe fairness issues. If no other task is
    started on the given cfs_rq, and due to the cpuset it would not happen,
    this load would never be properly unloaded. With this patch the load
    will be properly removed inside update_blocked_averages. This also
    applies to tasks moved to the fair scheduling class and moved to another
    cpu, and this path will also fix that. For fork, the entity is queued
    right away, so this problem does not affect that.
    
    This applies to cases where the new process is the first in the cfs_rq,
    issue introduced 3d30544f0212 ("sched/fair: Apply more PELT fixes"), and
    when there has previously been load on the cgroup but the cgroup was
    removed from the leaflist due to having null PELT load, indroduced
    in 039ae8bcf7a5 ("sched/fair: Fix O(nr_cgroups) in the load balancing
    path").
    
    For a simple cgroup hierarchy (as seen below) with two equally weighted
    groups, that in theory should get 50/50 of cpu time each, it often leads
    to a load of 60/40 or 70/30.
    
    parent/
      cg-1/
        cpu.weight: 100
        cpuset.cpus: 1
      cg-2/
        cpu.weight: 100
        cpuset.cpus: 1
    
    If the hierarchy is deeper (as seen below), while keeping cg-1 and cg-2
    equally weighted, they should still get a 50/50 balance of cpu time.
    This however sometimes results in a balance of 10/90 or 1/99(!!) between
    the task groups.
    
    $ ps u -C stress
    USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root       18568  1.1  0.0   3684   100 pts/12   R+   13:36   0:00 stress --cpu 1
    root       18580 99.3  0.0   3684   100 pts/12   R+   13:36   0:09 stress --cpu 1
    
    parent/
      cg-1/
        cpu.weight: 100
        sub-group/
          cpu.weight: 1
          cpuset.cpus: 1
      cg-2/
        cpu.weight: 100
        sub-group/
          cpu.weight: 10000
          cpuset.cpus: 1
    
    This can be reproduced by attaching an idle process to a cgroup and
    moving it to a given cpuset before it wakes up. The issue is evident in
    many (if not most) container runtimes, and has been reproduced
    with both crun and runc (and therefore docker and all its "derivatives"),
    and with both cgroup v1 and v2.
    
    Fixes: 3d30544f0212 ("sched/fair: Apply more PELT fixes")
    Fixes: 039ae8bcf7a5 ("sched/fair: Fix O(nr_cgroups) in the load balancing path")
    Signed-off-by: Odin Ugedal <odin@uged.al>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org>
    Link: https://lkml.kernel.org/r/20210501141950.23622-2-odin@uged.al
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 696d08a4593e..80392cdd5f3b 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -9903,16 +9903,22 @@ static void propagate_entity_cfs_rq(struct sched_entity *se)
 {
 	struct cfs_rq *cfs_rq;
 
+	list_add_leaf_cfs_rq(cfs_rq_of(se));
+
 	/* Start to propagate at parent */
 	se = se->parent;
 
 	for_each_sched_entity(se) {
 		cfs_rq = cfs_rq_of(se);
 
-		if (cfs_rq_throttled(cfs_rq))
-			break;
+		if (!cfs_rq_throttled(cfs_rq)){
+			update_load_avg(cfs_rq, se, UPDATE_TG);
+			list_add_leaf_cfs_rq(cfs_rq);
+			continue;
+		}
 
-		update_load_avg(cfs_rq, se, UPDATE_TG);
+		if (list_add_leaf_cfs_rq(cfs_rq))
+			break;
 	}
 }
 #else

commit e11924b7513ceacd7e9a0ed9f8db60629eefbf12
Author: Pablo Neira Ayuso <pablo@netfilter.org>
Date:   Wed May 5 22:25:24 2021 +0200

    netfilter: nfnetlink_osf: Fix a missing skb_header_pointer() NULL check
    
    [ Upstream commit 5e024c325406470d1165a09c6feaf8ec897936be ]
    
    Do not assume that the tcph->doff field is correct when parsing for TCP
    options, skb_header_pointer() might fail to fetch these bits.
    
    Fixes: 11eeef41d5f6 ("netfilter: passive OS fingerprint xtables match")
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/netfilter/nfnetlink_osf.c b/net/netfilter/nfnetlink_osf.c
index 131f9f8c0b09..917f06110c82 100644
--- a/net/netfilter/nfnetlink_osf.c
+++ b/net/netfilter/nfnetlink_osf.c
@@ -191,6 +191,8 @@ static const struct tcphdr *nf_osf_hdr_ctx_init(struct nf_osf_hdr_ctx *ctx,
 
 		ctx->optp = skb_header_pointer(skb, ip_hdrlen(skb) +
 				sizeof(struct tcphdr), ctx->optsize, opts);
+		if (!ctx->optp)
+			return NULL;
 	}
 
 	return tcp;

commit bb101fb44caa73a7ff5bc24df2fd49d9602d88f1
Author: Cong Wang <cong.wang@bytedance.com>
Date:   Wed May 5 12:40:48 2021 -0700

    smc: disallow TCP_ULP in smc_setsockopt()
    
    [ Upstream commit 8621436671f3a4bba5db57482e1ee604708bf1eb ]
    
    syzbot is able to setup kTLS on an SMC socket which coincidentally
    uses sk_user_data too. Later, kTLS treats it as psock so triggers a
    refcnt warning. The root cause is that smc_setsockopt() simply calls
    TCP setsockopt() which includes TCP_ULP. I do not think it makes
    sense to setup kTLS on top of SMC sockets, so we should just disallow
    this setup.
    
    It is hard to find a commit to blame, but we can apply this patch
    since the beginning of TCP_ULP.
    
    Reported-and-tested-by: syzbot+b54a1ce86ba4a623b7f0@syzkaller.appspotmail.com
    Fixes: 734942cc4ea6 ("tcp: ULP infrastructure")
    Cc: John Fastabend <john.fastabend@gmail.com>
    Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
    Signed-off-by: Cong Wang <cong.wang@bytedance.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c
index 26dcd02b2d0c..9aab4ab8161b 100644
--- a/net/smc/af_smc.c
+++ b/net/smc/af_smc.c
@@ -1644,6 +1644,9 @@ static int smc_setsockopt(struct socket *sock, int level, int optname,
 	struct smc_sock *smc;
 	int val, rc;
 
+	if (level == SOL_TCP && optname == TCP_ULP)
+		return -EOPNOTSUPP;
+
 	smc = smc_sk(sk);
 
 	/* generic setsockopts reaching us here always apply to the
@@ -1665,7 +1668,6 @@ static int smc_setsockopt(struct socket *sock, int level, int optname,
 
 	lock_sock(sk);
 	switch (optname) {
-	case TCP_ULP:
 	case TCP_FASTOPEN:
 	case TCP_FASTOPEN_CONNECT:
 	case TCP_FASTOPEN_KEY:

commit 4f21d7eb214b4751b8d285a248bbc26439fd407b
Author: Maciej Żenczykowski <maze@google.com>
Date:   Wed May 5 09:58:31 2021 -0700

    net: fix nla_strcmp to handle more then one trailing null character
    
    [ Upstream commit 2c16db6c92b0ee4aa61e88366df82169e83c3f7e ]
    
    Android userspace has been using TCA_KIND with a char[IFNAMESIZ]
    many-null-terminated buffer containing the string 'bpf'.
    
    This works on 4.19 and ceases to work on 5.10.
    
    I'm not entirely sure what fixes tag to use, but I think the issue
    was likely introduced in the below mentioned 5.4 commit.
    
    Reported-by: Nucca Chen <nuccachen@google.com>
    Cc: Cong Wang <xiyou.wangcong@gmail.com>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: David S. Miller <davem@davemloft.net>
    Cc: Jakub Kicinski <jakub.kicinski@netronome.com>
    Cc: Jamal Hadi Salim <jhs@mojatatu.com>
    Cc: Jiri Pirko <jiri@mellanox.com>
    Cc: Jiri Pirko <jiri@resnulli.us>
    Fixes: 62794fc4fbf5 ("net_sched: add max len check for TCA_KIND")
    Change-Id: I66dc281f165a2858fc29a44869a270a2d698a82b
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/lib/nlattr.c b/lib/nlattr.c
index e335bcafa9e4..00bfc6aece05 100644
--- a/lib/nlattr.c
+++ b/lib/nlattr.c
@@ -402,7 +402,7 @@ int nla_strcmp(const struct nlattr *nla, const char *str)
 	int attrlen = nla_len(nla);
 	int d;
 
-	if (attrlen > 0 && buf[attrlen - 1] == '\0')
+	while (attrlen > 0 && buf[attrlen - 1] == '\0')
 		attrlen--;
 
 	d = attrlen - len;

commit 3a794e45d90bca72ee8aee5336a7826470493d0e
Author: Miaohe Lin <linmiaohe@huawei.com>
Date:   Tue May 4 18:37:45 2021 -0700

    ksm: fix potential missing rmap_item for stable_node
    
    [ Upstream commit c89a384e2551c692a9fe60d093fd7080f50afc51 ]
    
    When removing rmap_item from stable tree, STABLE_FLAG of rmap_item is
    cleared with head reserved.  So the following scenario might happen: For
    ksm page with rmap_item1:
    
    cmp_and_merge_page
      stable_node->head = &migrate_nodes;
      remove_rmap_item_from_tree, but head still equal to stable_node;
      try_to_merge_with_ksm_page failed;
      return;
    
    For the same ksm page with rmap_item2, stable node migration succeed this
    time.  The stable_node->head does not equal to migrate_nodes now.  For ksm
    page with rmap_item1 again:
    
    cmp_and_merge_page
     stable_node->head != &migrate_nodes && rmap_item->head == stable_node
     return;
    
    We would miss the rmap_item for stable_node and might result in failed
    rmap_walk_ksm().  Fix this by set rmap_item->head to NULL when rmap_item
    is removed from stable tree.
    
    Link: https://lkml.kernel.org/r/20210330140228.45635-5-linmiaohe@huawei.com
    Fixes: 4146d2d673e8 ("ksm: make !merge_across_nodes migration safe")
    Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
    Cc: Hugh Dickins <hughd@google.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/ksm.c b/mm/ksm.c
index d021bcf94c41..87a541ab1474 100644
--- a/mm/ksm.c
+++ b/mm/ksm.c
@@ -778,6 +778,7 @@ static void remove_rmap_item_from_tree(struct rmap_item *rmap_item)
 		stable_node->rmap_hlist_len--;
 
 		put_anon_vma(rmap_item->anon_vma);
+		rmap_item->head = NULL;
 		rmap_item->address &= PAGE_MASK;
 
 	} else if (rmap_item->address & UNSTABLE_FLAG) {

commit 2e8b30d7f8b5f55539659039a5e1ae2803002a22
Author: Miaohe Lin <linmiaohe@huawei.com>
Date:   Tue May 4 18:34:38 2021 -0700

    mm/hugeltb: handle the error case in hugetlb_fix_reserve_counts()
    
    [ Upstream commit da56388c4397878a65b74f7fe97760f5aa7d316b ]
    
    A rare out of memory error would prevent removal of the reserve map region
    for a page.  hugetlb_fix_reserve_counts() handles this rare case to avoid
    dangling with incorrect counts.  Unfortunately, hugepage_subpool_get_pages
    and hugetlb_acct_memory could possibly fail too.  We should correctly
    handle these cases.
    
    Link: https://lkml.kernel.org/r/20210410072348.20437-5-linmiaohe@huawei.com
    Fixes: b5cec28d36f5 ("hugetlbfs: truncate_hugepages() takes a range of pages")
    Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
    Cc: Feilong Lin <linfeilong@huawei.com>
    Cc: Mike Kravetz <mike.kravetz@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index f37a821dc5ce..1dfaec50ff93 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -588,13 +588,20 @@ void hugetlb_fix_reserve_counts(struct inode *inode)
 {
 	struct hugepage_subpool *spool = subpool_inode(inode);
 	long rsv_adjust;
+	bool reserved = false;
 
 	rsv_adjust = hugepage_subpool_get_pages(spool, 1);
-	if (rsv_adjust) {
+	if (rsv_adjust > 0) {
 		struct hstate *h = hstate_inode(inode);
 
-		hugetlb_acct_memory(h, 1);
+		if (!hugetlb_acct_memory(h, 1))
+			reserved = true;
+	} else if (!rsv_adjust) {
+		reserved = true;
 	}
+
+	if (!reserved)
+		pr_warn("hugetlb: Huge Page Reserved count may go negative.\n");
 }
 
 /*

commit fdacfd77695f8c279bc7334cd1bea50c28bf4729
Author: Miaohe Lin <linmiaohe@huawei.com>
Date:   Tue May 4 18:33:46 2021 -0700

    khugepaged: fix wrong result value for trace_mm_collapse_huge_page_isolate()
    
    [ Upstream commit 74e579bf231a337ab3786d59e64bc94f45ca7b3f ]
    
    In writable and !referenced case, the result value should be
    SCAN_LACK_REFERENCED_PAGE for trace_mm_collapse_huge_page_isolate()
    instead of default 0 (SCAN_FAIL) here.
    
    Link: https://lkml.kernel.org/r/20210306032947.35921-5-linmiaohe@huawei.com
    Fixes: 7d2eba0557c1 ("mm: add tracepoint for scanning pages")
    Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
    Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Dan Carpenter <dan.carpenter@oracle.com>
    Cc: Ebru Akagunduz <ebru.akagunduz@gmail.com>
    Cc: Mike Kravetz <mike.kravetz@oracle.com>
    Cc: Rik van Riel <riel@redhat.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/khugepaged.c b/mm/khugepaged.c
index 9c7dc2276156..5dd14ef2e1de 100644
--- a/mm/khugepaged.c
+++ b/mm/khugepaged.c
@@ -616,17 +616,17 @@ static int __collapse_huge_page_isolate(struct vm_area_struct *vma,
 		    mmu_notifier_test_young(vma->vm_mm, address))
 			referenced++;
 	}
-	if (likely(writable)) {
-		if (likely(referenced)) {
-			result = SCAN_SUCCEED;
-			trace_mm_collapse_huge_page_isolate(page, none_or_zero,
-							    referenced, writable, result);
-			return 1;
-		}
-	} else {
+
+	if (unlikely(!writable)) {
 		result = SCAN_PAGE_RO;
+	} else if (unlikely(!referenced)) {
+		result = SCAN_LACK_REFERENCED_PAGE;
+	} else {
+		result = SCAN_SUCCEED;
+		trace_mm_collapse_huge_page_isolate(page, none_or_zero,
+						    referenced, writable, result);
+		return 1;
 	}
-
 out:
 	release_pte_pages(pte, _pte);
 	trace_mm_collapse_huge_page_isolate(page, none_or_zero,

commit cd9e673501592f0bd8f5dfc5a1f90ffc5e38bf46
Author: Kees Cook <keescook@chromium.org>
Date:   Sun May 2 22:06:08 2021 -0700

    drm/radeon: Avoid power table parsing memory leaks
    
    [ Upstream commit c69f27137a38d24301a6b659454a91ad85dff4aa ]
    
    Avoid leaving a hanging pre-allocated clock_info if last mode is
    invalid, and avoid heap corruption if no valid modes are found.
    
    Bug: https://bugzilla.kernel.org/show_bug.cgi?id=211537
    Fixes: 6991b8f2a319 ("drm/radeon/kms: fix segfault in pm rework")
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
index ffeacaa269e8..821b03d6142b 100644
--- a/drivers/gpu/drm/radeon/radeon_atombios.c
+++ b/drivers/gpu/drm/radeon/radeon_atombios.c
@@ -2133,11 +2133,14 @@ static int radeon_atombios_parse_power_table_1_3(struct radeon_device *rdev)
 		return state_index;
 	/* last mode is usually default, array is low to high */
 	for (i = 0; i < num_modes; i++) {
-		rdev->pm.power_state[state_index].clock_info =
-			kcalloc(1, sizeof(struct radeon_pm_clock_info),
-				GFP_KERNEL);
+		/* avoid memory leaks from invalid modes or unknown frev. */
+		if (!rdev->pm.power_state[state_index].clock_info) {
+			rdev->pm.power_state[state_index].clock_info =
+				kzalloc(sizeof(struct radeon_pm_clock_info),
+					GFP_KERNEL);
+		}
 		if (!rdev->pm.power_state[state_index].clock_info)
-			return state_index;
+			goto out;
 		rdev->pm.power_state[state_index].num_clock_modes = 1;
 		rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE;
 		switch (frev) {
@@ -2256,8 +2259,15 @@ static int radeon_atombios_parse_power_table_1_3(struct radeon_device *rdev)
 			break;
 		}
 	}
+out:
+	/* free any unused clock_info allocation. */
+	if (state_index && state_index < num_modes) {
+		kfree(rdev->pm.power_state[state_index].clock_info);
+		rdev->pm.power_state[state_index].clock_info = NULL;
+	}
+
 	/* last mode is usually default */
-	if (rdev->pm.default_power_state_index == -1) {
+	if (state_index && rdev->pm.default_power_state_index == -1) {
 		rdev->pm.power_state[state_index - 1].type =
 			POWER_STATE_TYPE_DEFAULT;
 		rdev->pm.default_power_state_index = state_index - 1;

commit d241510ba8d175fe4be10dc6b59e90ec002039d7
Author: Kees Cook <keescook@chromium.org>
Date:   Sun May 2 22:06:07 2021 -0700

    drm/radeon: Fix off-by-one power_state index heap overwrite
    
    [ Upstream commit 5bbf219328849e83878bddb7c226d8d42e84affc ]
    
    An out of bounds write happens when setting the default power state.
    KASAN sees this as:
    
    [drm] radeon: 512M of GTT memory ready.
    [drm] GART: num cpu pages 131072, num gpu pages 131072
    ==================================================================
    BUG: KASAN: slab-out-of-bounds in
    radeon_atombios_parse_power_table_1_3+0x1837/0x1998 [radeon]
    Write of size 4 at addr ffff88810178d858 by task systemd-udevd/157
    
    CPU: 0 PID: 157 Comm: systemd-udevd Not tainted 5.12.0-E620 #50
    Hardware name: eMachines        eMachines E620  /Nile       , BIOS V1.03 09/30/2008
    Call Trace:
     dump_stack+0xa5/0xe6
     print_address_description.constprop.0+0x18/0x239
     kasan_report+0x170/0x1a8
     radeon_atombios_parse_power_table_1_3+0x1837/0x1998 [radeon]
     radeon_atombios_get_power_modes+0x144/0x1888 [radeon]
     radeon_pm_init+0x1019/0x1904 [radeon]
     rs690_init+0x76e/0x84a [radeon]
     radeon_device_init+0x1c1a/0x21e5 [radeon]
     radeon_driver_load_kms+0xf5/0x30b [radeon]
     drm_dev_register+0x255/0x4a0 [drm]
     radeon_pci_probe+0x246/0x2f6 [radeon]
     pci_device_probe+0x1aa/0x294
     really_probe+0x30e/0x850
     driver_probe_device+0xe6/0x135
     device_driver_attach+0xc1/0xf8
     __driver_attach+0x13f/0x146
     bus_for_each_dev+0xfa/0x146
     bus_add_driver+0x2b3/0x447
     driver_register+0x242/0x2c1
     do_one_initcall+0x149/0x2fd
     do_init_module+0x1ae/0x573
     load_module+0x4dee/0x5cca
     __do_sys_finit_module+0xf1/0x140
     do_syscall_64+0x33/0x40
     entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Without KASAN, this will manifest later when the kernel attempts to
    allocate memory that was stomped, since it collides with the inline slab
    freelist pointer:
    
    invalid opcode: 0000 [#1] SMP NOPTI
    CPU: 0 PID: 781 Comm: openrc-run.sh Tainted: G        W 5.10.12-gentoo-E620 #2
    Hardware name: eMachines        eMachines E620  /Nile , BIOS V1.03       09/30/2008
    RIP: 0010:kfree+0x115/0x230
    Code: 89 c5 e8 75 ea ff ff 48 8b 00 0f ba e0 09 72 63 e8 1f f4 ff ff 41 89 c4 48 8b 45 00 0f ba e0 10 72 0a 48 8b 45 08 a8 01 75 02 <0f> 0b 44 89 e1 48 c7 c2 00 f0 ff ff be 06 00 00 00 48 d3 e2 48 c7
    RSP: 0018:ffffb42f40267e10 EFLAGS: 00010246
    RAX: ffffd61280ee8d88 RBX: 0000000000000004 RCX: 000000008010000d
    RDX: 4000000000000000 RSI: ffffffffba1360b0 RDI: ffffd61280ee8d80
    RBP: ffffd61280ee8d80 R08: ffffffffb91bebdf R09: 0000000000000000
    R10: ffff8fe2c1047ac8 R11: 0000000000000000 R12: 0000000000000000
    R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000100
    FS:  00007fe80eff6b68(0000) GS:ffff8fe339c00000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007fe80eec7bc0 CR3: 0000000038012000 CR4: 00000000000006f0
    Call Trace:
     __free_fdtable+0x16/0x1f
     put_files_struct+0x81/0x9b
     do_exit+0x433/0x94d
     do_group_exit+0xa6/0xa6
     __x64_sys_exit_group+0xf/0xf
     do_syscall_64+0x33/0x40
     entry_SYSCALL_64_after_hwframe+0x44/0xa9
    RIP: 0033:0x7fe80ef64bea
    Code: Unable to access opcode bytes at RIP 0x7fe80ef64bc0.
    RSP: 002b:00007ffdb1c47528 EFLAGS: 00000246 ORIG_RAX: 00000000000000e7
    RAX: ffffffffffffffda RBX: 0000000000000003 RCX: 00007fe80ef64bea
    RDX: 00007fe80ef64f60 RSI: 0000000000000000 RDI: 0000000000000000
    RBP: 0000000000000000 R08: 0000000000000001 R09: 0000000000000000
    R10: 00007fe80ee2c620 R11: 0000000000000246 R12: 00007fe80eff41e0
    R13: 00000000ffffffff R14: 0000000000000024 R15: 00007fe80edf9cd0
    Modules linked in: radeon(+) ath5k(+) snd_hda_codec_realtek ...
    
    Use a valid power_state index when initializing the "flags" and "misc"
    and "misc2" fields.
    
    Bug: https://bugzilla.kernel.org/show_bug.cgi?id=211537
    Reported-by: Erhard F. <erhard_f@mailbox.org>
    Fixes: a48b9b4edb8b ("drm/radeon/kms/pm: add asic specific callbacks for getting power state (v2)")
    Fixes: 79daedc94281 ("drm/radeon/kms: minor pm cleanups")
    Signed-off-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
index f422a8d6aec4..ffeacaa269e8 100644
--- a/drivers/gpu/drm/radeon/radeon_atombios.c
+++ b/drivers/gpu/drm/radeon/radeon_atombios.c
@@ -2263,10 +2263,10 @@ static int radeon_atombios_parse_power_table_1_3(struct radeon_device *rdev)
 		rdev->pm.default_power_state_index = state_index - 1;
 		rdev->pm.power_state[state_index - 1].default_clock_mode =
 			&rdev->pm.power_state[state_index - 1].clock_info[0];
-		rdev->pm.power_state[state_index].flags &=
+		rdev->pm.power_state[state_index - 1].flags &=
 			~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
-		rdev->pm.power_state[state_index].misc = 0;
-		rdev->pm.power_state[state_index].misc2 = 0;
+		rdev->pm.power_state[state_index - 1].misc = 0;
+		rdev->pm.power_state[state_index - 1].misc2 = 0;
 	}
 	return state_index;
 }

commit 20bff2f8c3e47d17214126e39db88747f7fd7399
Author: Pablo Neira Ayuso <pablo@netfilter.org>
Date:   Fri Apr 30 14:00:13 2021 +0200

    netfilter: xt_SECMARK: add new revision to fix structure layout
    
    [ Upstream commit c7d13358b6a2f49f81a34aa323a2d0878a0532a2 ]
    
    This extension breaks when trying to delete rules, add a new revision to
    fix this.
    
    Fixes: 5e6874cdb8de ("[SECMARK]: Add xtables SECMARK target")
    Signed-off-by: Phil Sutter <phil@nwl.cc>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/uapi/linux/netfilter/xt_SECMARK.h b/include/uapi/linux/netfilter/xt_SECMARK.h
index 1f2a708413f5..beb2cadba8a9 100644
--- a/include/uapi/linux/netfilter/xt_SECMARK.h
+++ b/include/uapi/linux/netfilter/xt_SECMARK.h
@@ -20,4 +20,10 @@ struct xt_secmark_target_info {
 	char secctx[SECMARK_SECCTX_MAX];
 };
 
+struct xt_secmark_target_info_v1 {
+	__u8 mode;
+	char secctx[SECMARK_SECCTX_MAX];
+	__u32 secid;
+};
+
 #endif /*_XT_SECMARK_H_target */
diff --git a/net/netfilter/xt_SECMARK.c b/net/netfilter/xt_SECMARK.c
index 4ad5fe27e08b..097534dbc622 100644
--- a/net/netfilter/xt_SECMARK.c
+++ b/net/netfilter/xt_SECMARK.c
@@ -30,10 +30,9 @@ MODULE_ALIAS("ip6t_SECMARK");
 static u8 mode;
 
 static unsigned int
-secmark_tg(struct sk_buff *skb, const struct xt_action_param *par)
+secmark_tg(struct sk_buff *skb, const struct xt_secmark_target_info_v1 *info)
 {
 	u32 secmark = 0;
-	const struct xt_secmark_target_info *info = par->targinfo;
 
 	BUG_ON(info->mode != mode);
 
@@ -49,7 +48,7 @@ secmark_tg(struct sk_buff *skb, const struct xt_action_param *par)
 	return XT_CONTINUE;
 }
 
-static int checkentry_lsm(struct xt_secmark_target_info *info)
+static int checkentry_lsm(struct xt_secmark_target_info_v1 *info)
 {
 	int err;
 
@@ -81,15 +80,15 @@ static int checkentry_lsm(struct xt_secmark_target_info *info)
 	return 0;
 }
 
-static int secmark_tg_check(const struct xt_tgchk_param *par)
+static int
+secmark_tg_check(const char *table, struct xt_secmark_target_info_v1 *info)
 {
-	struct xt_secmark_target_info *info = par->targinfo;
 	int err;
 
-	if (strcmp(par->table, "mangle") != 0 &&
-	    strcmp(par->table, "security") != 0) {
+	if (strcmp(table, "mangle") != 0 &&
+	    strcmp(table, "security") != 0) {
 		pr_info_ratelimited("only valid in \'mangle\' or \'security\' table, not \'%s\'\n",
-				    par->table);
+				    table);
 		return -EINVAL;
 	}
 
@@ -124,25 +123,76 @@ static void secmark_tg_destroy(const struct xt_tgdtor_param *par)
 	}
 }
 
-static struct xt_target secmark_tg_reg __read_mostly = {
-	.name       = "SECMARK",
-	.revision   = 0,
-	.family     = NFPROTO_UNSPEC,
-	.checkentry = secmark_tg_check,
-	.destroy    = secmark_tg_destroy,
-	.target     = secmark_tg,
-	.targetsize = sizeof(struct xt_secmark_target_info),
-	.me         = THIS_MODULE,
+static int secmark_tg_check_v0(const struct xt_tgchk_param *par)
+{
+	struct xt_secmark_target_info *info = par->targinfo;
+	struct xt_secmark_target_info_v1 newinfo = {
+		.mode	= info->mode,
+	};
+	int ret;
+
+	memcpy(newinfo.secctx, info->secctx, SECMARK_SECCTX_MAX);
+
+	ret = secmark_tg_check(par->table, &newinfo);
+	info->secid = newinfo.secid;
+
+	return ret;
+}
+
+static unsigned int
+secmark_tg_v0(struct sk_buff *skb, const struct xt_action_param *par)
+{
+	const struct xt_secmark_target_info *info = par->targinfo;
+	struct xt_secmark_target_info_v1 newinfo = {
+		.secid	= info->secid,
+	};
+
+	return secmark_tg(skb, &newinfo);
+}
+
+static int secmark_tg_check_v1(const struct xt_tgchk_param *par)
+{
+	return secmark_tg_check(par->table, par->targinfo);
+}
+
+static unsigned int
+secmark_tg_v1(struct sk_buff *skb, const struct xt_action_param *par)
+{
+	return secmark_tg(skb, par->targinfo);
+}
+
+static struct xt_target secmark_tg_reg[] __read_mostly = {
+	{
+		.name		= "SECMARK",
+		.revision	= 0,
+		.family		= NFPROTO_UNSPEC,
+		.checkentry	= secmark_tg_check_v0,
+		.destroy	= secmark_tg_destroy,
+		.target		= secmark_tg_v0,
+		.targetsize	= sizeof(struct xt_secmark_target_info),
+		.me		= THIS_MODULE,
+	},
+	{
+		.name		= "SECMARK",
+		.revision	= 1,
+		.family		= NFPROTO_UNSPEC,
+		.checkentry	= secmark_tg_check_v1,
+		.destroy	= secmark_tg_destroy,
+		.target		= secmark_tg_v1,
+		.targetsize	= sizeof(struct xt_secmark_target_info_v1),
+		.usersize	= offsetof(struct xt_secmark_target_info_v1, secid),
+		.me		= THIS_MODULE,
+	},
 };
 
 static int __init secmark_tg_init(void)
 {
-	return xt_register_target(&secmark_tg_reg);
+	return xt_register_targets(secmark_tg_reg, ARRAY_SIZE(secmark_tg_reg));
 }
 
 static void __exit secmark_tg_exit(void)
 {
-	xt_unregister_target(&secmark_tg_reg);
+	xt_unregister_targets(secmark_tg_reg, ARRAY_SIZE(secmark_tg_reg));
 }
 
 module_init(secmark_tg_init);

commit 80ff006023cc5f1430a73063ec4de415d82df424
Author: Xin Long <lucien.xin@gmail.com>
Date:   Mon May 3 04:41:20 2021 +0800

    sctp: fix a SCTP_MIB_CURRESTAB leak in sctp_sf_do_dupcook_b
    
    [ Upstream commit f282df0391267fb2b263da1cc3233aa6fb81defc ]
    
    Normally SCTP_MIB_CURRESTAB is always incremented once asoc enter into
    ESTABLISHED from the state < ESTABLISHED and decremented when the asoc
    is being deleted.
    
    However, in sctp_sf_do_dupcook_b(), the asoc's state can be changed to
    ESTABLISHED from the state >= ESTABLISHED where it shouldn't increment
    SCTP_MIB_CURRESTAB. Otherwise, one asoc may increment MIB_CURRESTAB
    multiple times but only decrement once at the end.
    
    I was able to reproduce it by using scapy to do the 4-way shakehands,
    after that I replayed the COOKIE-ECHO chunk with 'peer_vtag' field
    changed to different values, and SCTP_MIB_CURRESTAB was incremented
    multiple times and never went back to 0 even when the asoc was freed.
    
    This patch is to fix it by only incrementing SCTP_MIB_CURRESTAB when
    the state < ESTABLISHED in sctp_sf_do_dupcook_b().
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: Xin Long <lucien.xin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
index 882cd5f40a0a..be5ea5e8b19e 100644
--- a/net/sctp/sm_statefuns.c
+++ b/net/sctp/sm_statefuns.c
@@ -1948,7 +1948,8 @@ static enum sctp_disposition sctp_sf_do_dupcook_b(
 	sctp_add_cmd_sf(commands, SCTP_CMD_UPDATE_ASSOC, SCTP_ASOC(new_asoc));
 	sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
 			SCTP_STATE(SCTP_STATE_ESTABLISHED));
-	SCTP_INC_STATS(net, SCTP_MIB_CURRESTAB);
+	if (asoc->state < SCTP_STATE_ESTABLISHED)
+		SCTP_INC_STATS(net, SCTP_MIB_CURRESTAB);
 	sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_START, SCTP_NULL());
 
 	repl = sctp_make_cookie_ack(new_asoc, chunk);

commit 25a87b1f566b5eb2af2857a928f0e2310d900976
Author: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
Date:   Sun May 2 04:58:18 2021 -0700

    ethernet:enic: Fix a use after free bug in enic_hard_start_xmit
    
    [ Upstream commit 643001b47adc844ae33510c4bb93c236667008a3 ]
    
    In enic_hard_start_xmit, it calls enic_queue_wq_skb(). Inside
    enic_queue_wq_skb, if some error happens, the skb will be freed
    by dev_kfree_skb(skb). But the freed skb is still used in
    skb_tx_timestamp(skb).
    
    My patch makes enic_queue_wq_skb() return error and goto spin_unlock()
    incase of error. The solution is provided by Govind.
    See https://lkml.org/lkml/2021/4/30/961.
    
    Fixes: fb7516d42478e ("enic: add sw timestamp support")
    Signed-off-by: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
    Acked-by: Govindarajulu Varadarajan <gvaradar@cisco.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c
index 810cbe221046..bfe0e820956c 100644
--- a/drivers/net/ethernet/cisco/enic/enic_main.c
+++ b/drivers/net/ethernet/cisco/enic/enic_main.c
@@ -803,7 +803,7 @@ static inline int enic_queue_wq_skb_encap(struct enic *enic, struct vnic_wq *wq,
 	return err;
 }
 
-static inline void enic_queue_wq_skb(struct enic *enic,
+static inline int enic_queue_wq_skb(struct enic *enic,
 	struct vnic_wq *wq, struct sk_buff *skb)
 {
 	unsigned int mss = skb_shinfo(skb)->gso_size;
@@ -849,6 +849,7 @@ static inline void enic_queue_wq_skb(struct enic *enic,
 		wq->to_use = buf->next;
 		dev_kfree_skb(skb);
 	}
+	return err;
 }
 
 /* netif_tx_lock held, process context with BHs disabled, or BH */
@@ -892,7 +893,8 @@ static netdev_tx_t enic_hard_start_xmit(struct sk_buff *skb,
 		return NETDEV_TX_BUSY;
 	}
 
-	enic_queue_wq_skb(enic, wq, skb);
+	if (enic_queue_wq_skb(enic, wq, skb))
+		goto error;
 
 	if (vnic_wq_desc_avail(wq) < MAX_SKB_FRAGS + ENIC_DESC_MAX_SPLITS)
 		netif_tx_stop_queue(txq);
@@ -900,6 +902,7 @@ static netdev_tx_t enic_hard_start_xmit(struct sk_buff *skb,
 	if (!skb->xmit_more || netif_xmit_stopped(txq))
 		vnic_wq_doorbell(wq);
 
+error:
 	spin_unlock(&enic->wq_lock[txq_map]);
 
 	return NETDEV_TX_OK;

commit d624f2991b977821375fbd56c91b0c91d456a697
Author: Xin Long <lucien.xin@gmail.com>
Date:   Sat May 1 04:02:58 2021 +0800

    sctp: do asoc update earlier in sctp_sf_do_dupcook_a
    
    [ Upstream commit 35b4f24415c854cd718ccdf38dbea6297f010aae ]
    
    There's a panic that occurs in a few of envs, the call trace is as below:
    
      [] general protection fault, ... 0x29acd70f1000a: 0000 [#1] SMP PTI
      [] RIP: 0010:sctp_ulpevent_notify_peer_addr_change+0x4b/0x1fa [sctp]
      []  sctp_assoc_control_transport+0x1b9/0x210 [sctp]
      []  sctp_do_8_2_transport_strike.isra.16+0x15c/0x220 [sctp]
      []  sctp_cmd_interpreter.isra.21+0x1231/0x1a10 [sctp]
      []  sctp_do_sm+0xc3/0x2a0 [sctp]
      []  sctp_generate_timeout_event+0x81/0xf0 [sctp]
    
    This is caused by a transport use-after-free issue. When processing a
    duplicate COOKIE-ECHO chunk in sctp_sf_do_dupcook_a(), both COOKIE-ACK
    and SHUTDOWN chunks are allocated with the transort from the new asoc.
    However, later in the sideeffect machine, the old asoc is used to send
    them out and old asoc's shutdown_last_sent_to is set to the transport
    that SHUTDOWN chunk attached to in sctp_cmd_setup_t2(), which actually
    belongs to the new asoc. After the new_asoc is freed and the old asoc
    T2 timeout, the old asoc's shutdown_last_sent_to that is already freed
    would be accessed in sctp_sf_t2_timer_expire().
    
    Thanks Alexander and Jere for helping dig into this issue.
    
    To fix it, this patch is to do the asoc update first, then allocate
    the COOKIE-ACK and SHUTDOWN chunks with the 'updated' old asoc. This
    would make more sense, as a chunk from an asoc shouldn't be sent out
    with another asoc. We had fixed quite a few issues caused by this.
    
    Fixes: 145cb2f7177d ("sctp: Fix bundling of SHUTDOWN with COOKIE-ACK")
    Reported-by: Alexander Sverdlin <alexander.sverdlin@nokia.com>
    Reported-by: syzbot+bbe538efd1046586f587@syzkaller.appspotmail.com
    Reported-by: Michal Tesar <mtesar@redhat.com>
    Signed-off-by: Xin Long <lucien.xin@gmail.com>
    Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
index a3033b74df54..882cd5f40a0a 100644
--- a/net/sctp/sm_statefuns.c
+++ b/net/sctp/sm_statefuns.c
@@ -1856,20 +1856,35 @@ static enum sctp_disposition sctp_sf_do_dupcook_a(
 			SCTP_TO(SCTP_EVENT_TIMEOUT_T4_RTO));
 	sctp_add_cmd_sf(commands, SCTP_CMD_PURGE_ASCONF_QUEUE, SCTP_NULL());
 
-	repl = sctp_make_cookie_ack(new_asoc, chunk);
+	/* Update the content of current association. */
+	if (sctp_assoc_update((struct sctp_association *)asoc, new_asoc)) {
+		struct sctp_chunk *abort;
+
+		abort = sctp_make_abort(asoc, NULL, sizeof(struct sctp_errhdr));
+		if (abort) {
+			sctp_init_cause(abort, SCTP_ERROR_RSRC_LOW, 0);
+			sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort));
+		}
+		sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, SCTP_ERROR(ECONNABORTED));
+		sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
+				SCTP_PERR(SCTP_ERROR_RSRC_LOW));
+		SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
+		SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
+		goto nomem;
+	}
+
+	repl = sctp_make_cookie_ack(asoc, chunk);
 	if (!repl)
 		goto nomem;
 
 	/* Report association restart to upper layer. */
 	ev = sctp_ulpevent_make_assoc_change(asoc, 0, SCTP_RESTART, 0,
-					     new_asoc->c.sinit_num_ostreams,
-					     new_asoc->c.sinit_max_instreams,
+					     asoc->c.sinit_num_ostreams,
+					     asoc->c.sinit_max_instreams,
 					     NULL, GFP_ATOMIC);
 	if (!ev)
 		goto nomem_ev;
 
-	/* Update the content of current association. */
-	sctp_add_cmd_sf(commands, SCTP_CMD_UPDATE_ASSOC, SCTP_ASOC(new_asoc));
 	sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, SCTP_ULPEVENT(ev));
 	if ((sctp_state(asoc, SHUTDOWN_PENDING) ||
 	     sctp_state(asoc, SHUTDOWN_SENT)) &&

commit 2b5f418f6e6ba5439d98fdd4979e34ff138cab65
Author: Yufeng Mo <moyufeng@huawei.com>
Date:   Fri Apr 30 17:06:22 2021 +0800

    net: hns3: disable phy loopback setting in hclge_mac_start_phy
    
    [ Upstream commit 472497d0bdae890a896013332a0b673f9acdf2bf ]
    
    If selftest and reset are performed at the same time, the phy
    loopback setting may be still in enable state after the reset,
    and device cannot link up. So fix this issue by disabling phy
    loopback before phy_start().
    
    Fixes: 256727da7395 ("net: hns3: Add MDIO support to HNS3 Ethernet driver for hip08 SoC")
    Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
    Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
index 03491e8ebb73..d0fa344f0a84 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c
@@ -235,6 +235,8 @@ void hclge_mac_start_phy(struct hclge_dev *hdev)
 	if (!phydev)
 		return;
 
+	phy_loopback(phydev, false);
+
 	phy_start(phydev);
 }
 

commit 76c0f76b3674b8052931a7851287cc12027bdd5d
Author: Nobuhiro Iwamatsu <nobuhiro1.iwamatsu@toshiba.co.jp>
Date:   Tue Apr 20 11:39:17 2021 +0900

    rtc: ds1307: Fix wday settings for rx8130
    
    [ Upstream commit 204756f016726a380bafe619438ed979088bd04a ]
    
    rx8130 wday specifies the bit position, not BCD.
    
    Fixes: ee0981be7704 ("rtc: ds1307: Add support for Epson RX8130CE")
    Signed-off-by: Nobuhiro Iwamatsu <nobuhiro1.iwamatsu@toshiba.co.jp>
    Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
    Link: https://lore.kernel.org/r/20210420023917.1949066-1-nobuhiro1.iwamatsu@toshiba.co.jp
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c
index ebd59e86a567..94d31779933f 100644
--- a/drivers/rtc/rtc-ds1307.c
+++ b/drivers/rtc/rtc-ds1307.c
@@ -434,7 +434,11 @@ static int ds1307_get_time(struct device *dev, struct rtc_time *t)
 	t->tm_min = bcd2bin(regs[DS1307_REG_MIN] & 0x7f);
 	tmp = regs[DS1307_REG_HOUR] & 0x3f;
 	t->tm_hour = bcd2bin(tmp);
-	t->tm_wday = bcd2bin(regs[DS1307_REG_WDAY] & 0x07) - 1;
+	/* rx8130 is bit position, not BCD */
+	if (ds1307->type == rx_8130)
+		t->tm_wday = fls(regs[DS1307_REG_WDAY] & 0x7f);
+	else
+		t->tm_wday = bcd2bin(regs[DS1307_REG_WDAY] & 0x07) - 1;
 	t->tm_mday = bcd2bin(regs[DS1307_REG_MDAY] & 0x3f);
 	tmp = regs[DS1307_REG_MONTH] & 0x1f;
 	t->tm_mon = bcd2bin(tmp) - 1;
@@ -481,7 +485,11 @@ static int ds1307_set_time(struct device *dev, struct rtc_time *t)
 	regs[DS1307_REG_SECS] = bin2bcd(t->tm_sec);
 	regs[DS1307_REG_MIN] = bin2bcd(t->tm_min);
 	regs[DS1307_REG_HOUR] = bin2bcd(t->tm_hour);
-	regs[DS1307_REG_WDAY] = bin2bcd(t->tm_wday + 1);
+	/* rx8130 is bit position, not BCD */
+	if (ds1307->type == rx_8130)
+		regs[DS1307_REG_WDAY] = 1 << t->tm_wday;
+	else
+		regs[DS1307_REG_WDAY] = bin2bcd(t->tm_wday + 1);
 	regs[DS1307_REG_MDAY] = bin2bcd(t->tm_mday);
 	regs[DS1307_REG_MONTH] = bin2bcd(t->tm_mon + 1);
 

commit 28a55a8a49f4ae334a8a6d4c1ad429ff7978bb4f
Author: Olga Kornievskaia <kolga@netapp.com>
Date:   Wed Mar 31 15:30:25 2021 -0400

    NFSv4.2 fix handling of sr_eof in SEEK's reply
    
    [ Upstream commit 73f5c88f521a630ea1628beb9c2d48a2e777a419 ]
    
    Currently the client ignores the value of the sr_eof of the SEEK
    operation. According to the spec, if the server didn't find the
    requested extent and reached the end of the file, the server
    would return sr_eof=true. In case the request for DATA and no
    data was found (ie in the middle of the hole), then the lseek
    expects that ENXIO would be returned.
    
    Fixes: 1c6dcbe5ceff8 ("NFS: Implement SEEK")
    Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c
index da7b73ad811f..be252795a6f7 100644
--- a/fs/nfs/nfs42proc.c
+++ b/fs/nfs/nfs42proc.c
@@ -500,7 +500,10 @@ static loff_t _nfs42_proc_llseek(struct file *filep,
 	if (status)
 		return status;
 
-	return vfs_setpos(filep, res.sr_offset, inode->i_sb->s_maxbytes);
+	if (whence == SEEK_DATA && res.sr_eof)
+		return -NFS4ERR_NXIO;
+	else
+		return vfs_setpos(filep, res.sr_offset, inode->i_sb->s_maxbytes);
 }
 
 loff_t nfs42_proc_llseek(struct file *filep, loff_t offset, int whence)

commit f27638a92f77d8107efbaf48a0d3bfa24da8cdad
Author: Nikola Livic <nlivic@gmail.com>
Date:   Mon Mar 29 11:56:49 2021 +0300

    pNFS/flexfiles: fix incorrect size check in decode_nfs_fh()
    
    [ Upstream commit ed34695e15aba74f45247f1ee2cf7e09d449f925 ]
    
    We (adam zabrocki, alexander matrosov, alexander tereshkin, maksym
    bazalii) observed the check:
    
            if (fh->size > sizeof(struct nfs_fh))
    
    should not use the size of the nfs_fh struct which includes an extra two
    bytes from the size field.
    
    struct nfs_fh {
            unsigned short         size;
            unsigned char          data[NFS_MAXFHSIZE];
    }
    
    but should determine the size from data[NFS_MAXFHSIZE] so the memcpy
    will not write 2 bytes beyond destination.  The proposed fix is to
    compare against the NFS_MAXFHSIZE directly, as is done elsewhere in fs
    code base.
    
    Fixes: d67ae825a59d ("pnfs/flexfiles: Add the FlexFile Layout Driver")
    Signed-off-by: Nikola Livic <nlivic@gmail.com>
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/nfs/flexfilelayout/flexfilelayout.c b/fs/nfs/flexfilelayout/flexfilelayout.c
index d8cba46a9395..fee421da2197 100644
--- a/fs/nfs/flexfilelayout/flexfilelayout.c
+++ b/fs/nfs/flexfilelayout/flexfilelayout.c
@@ -101,7 +101,7 @@ static int decode_nfs_fh(struct xdr_stream *xdr, struct nfs_fh *fh)
 	if (unlikely(!p))
 		return -ENOBUFS;
 	fh->size = be32_to_cpup(p++);
-	if (fh->size > sizeof(struct nfs_fh)) {
+	if (fh->size > NFS_MAXFHSIZE) {
 		printk(KERN_ERR "NFS flexfiles: Too big fh received %d\n",
 		       fh->size);
 		return -EOVERFLOW;

commit fb787dcb30987026d1028cf07e7180060fe81fb1
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Wed Mar 31 16:40:12 2021 +0800

    PCI: endpoint: Fix missing destroy_workqueue()
    
    [ Upstream commit acaef7981a218813e3617edb9c01837808de063c ]
    
    Add the missing destroy_workqueue() before return from
    pci_epf_test_init() in the error handling case and add
    destroy_workqueue() in pci_epf_test_exit().
    
    Link: https://lore.kernel.org/r/20210331084012.2091010-1-yangyingliang@huawei.com
    Fixes: 349e7a85b25fa ("PCI: endpoint: functions: Add an EP function to test PCI")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c
index 4bbd26e8a9e2..09a1e449cd1c 100644
--- a/drivers/pci/endpoint/functions/pci-epf-test.c
+++ b/drivers/pci/endpoint/functions/pci-epf-test.c
@@ -572,6 +572,7 @@ static int __init pci_epf_test_init(void)
 					     WQ_MEM_RECLAIM | WQ_HIGHPRI, 0);
 	ret = pci_epf_register_driver(&test_driver);
 	if (ret) {
+		destroy_workqueue(kpcitest_workqueue);
 		pr_err("Failed to register pci epf test driver --> %d\n", ret);
 		return ret;
 	}
@@ -582,6 +583,8 @@ module_init(pci_epf_test_init);
 
 static void __exit pci_epf_test_exit(void)
 {
+	if (kpcitest_workqueue)
+		destroy_workqueue(kpcitest_workqueue);
 	pci_epf_unregister_driver(&test_driver);
 }
 module_exit(pci_epf_test_exit);

commit e6681459e47a09fe61eac157aff93f2326d64025
Author: Trond Myklebust <trond.myklebust@hammerspace.com>
Date:   Mon Mar 29 16:46:05 2021 -0400

    NFS: Deal correctly with attribute generation counter overflow
    
    [ Upstream commit 9fdbfad1777cb4638f489eeb62d85432010c0031 ]
    
    We need to use unsigned long subtraction and then convert to signed in
    order to deal correcly with C overflow rules.
    
    Fixes: f5062003465c ("NFS: Set an attribute barrier on all updates")
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index aee66d8f1330..dc55ecc3bec4 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -1607,10 +1607,10 @@ EXPORT_SYMBOL_GPL(_nfs_display_fhandle);
  */
 static int nfs_inode_attrs_need_update(const struct inode *inode, const struct nfs_fattr *fattr)
 {
-	const struct nfs_inode *nfsi = NFS_I(inode);
+	unsigned long attr_gencount = NFS_I(inode)->attr_gencount;
 
-	return ((long)fattr->gencount - (long)nfsi->attr_gencount) > 0 ||
-		((long)nfsi->attr_gencount - (long)nfs_read_attr_generation_counter() > 0);
+	return (long)(fattr->gencount - attr_gencount) > 0 ||
+	       (long)(attr_gencount - nfs_read_attr_generation_counter()) > 0;
 }
 
 static int nfs_refresh_inode_locked(struct inode *inode, struct nfs_fattr *fattr)
@@ -2034,7 +2034,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
 			nfsi->attrtimeo_timestamp = now;
 		}
 		/* Set the barrier to be more recent than this fattr */
-		if ((long)fattr->gencount - (long)nfsi->attr_gencount > 0)
+		if ((long)(fattr->gencount - nfsi->attr_gencount) > 0)
 			nfsi->attr_gencount = fattr->gencount;
 	}
 

commit e5370bd9e419fcac4f8cf7b242455ba121212037
Author: Trond Myklebust <trond.myklebust@hammerspace.com>
Date:   Sun Mar 28 18:17:14 2021 -0400

    NFSv4.2: Always flush out writes in nfs42_proc_fallocate()
    
    [ Upstream commit 99f23783224355e7022ceea9b8d9f62c0fd01bd8 ]
    
    Whether we're allocating or delallocating space, we should flush out the
    pending writes in order to avoid races with attribute updates.
    
    Fixes: 1e564d3dbd68 ("NFSv4.2: Fix a race in nfs42_proc_deallocate()")
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c
index 526441de89c1..da7b73ad811f 100644
--- a/fs/nfs/nfs42proc.c
+++ b/fs/nfs/nfs42proc.c
@@ -59,7 +59,8 @@ static int _nfs42_proc_fallocate(struct rpc_message *msg, struct file *filep,
 static int nfs42_proc_fallocate(struct rpc_message *msg, struct file *filep,
 				loff_t offset, loff_t len)
 {
-	struct nfs_server *server = NFS_SERVER(file_inode(filep));
+	struct inode *inode = file_inode(filep);
+	struct nfs_server *server = NFS_SERVER(inode);
 	struct nfs4_exception exception = { };
 	struct nfs_lock_context *lock;
 	int err;
@@ -68,9 +69,13 @@ static int nfs42_proc_fallocate(struct rpc_message *msg, struct file *filep,
 	if (IS_ERR(lock))
 		return PTR_ERR(lock);
 
-	exception.inode = file_inode(filep);
+	exception.inode = inode;
 	exception.state = lock->open_context->state;
 
+	err = nfs_sync_inode(inode);
+	if (err)
+		goto out;
+
 	do {
 		err = _nfs42_proc_fallocate(msg, filep, lock, offset, len);
 		if (err == -ENOTSUPP) {
@@ -79,7 +84,7 @@ static int nfs42_proc_fallocate(struct rpc_message *msg, struct file *filep,
 		}
 		err = nfs4_handle_exception(server, err, &exception);
 	} while (exception.retry);
-
+out:
 	nfs_put_lock_context(lock);
 	return err;
 }
@@ -117,16 +122,13 @@ int nfs42_proc_deallocate(struct file *filep, loff_t offset, loff_t len)
 		return -EOPNOTSUPP;
 
 	inode_lock(inode);
-	err = nfs_sync_inode(inode);
-	if (err)
-		goto out_unlock;
 
 	err = nfs42_proc_fallocate(&msg, filep, offset, len);
 	if (err == 0)
 		truncate_pagecache_range(inode, offset, (offset + len) -1);
 	if (err == -EOPNOTSUPP)
 		NFS_SERVER(inode)->caps &= ~NFS_CAP_DEALLOCATE;
-out_unlock:
+
 	inode_unlock(inode);
 	return err;
 }

commit 85b1a9c3420b52e7f0d647b176a689392480f2cc
Author: Jia-Ju Bai <baijiaju1990@gmail.com>
Date:   Sat Mar 6 05:36:24 2021 -0800

    rpmsg: qcom_glink_native: fix error return code of qcom_glink_rx_data()
    
    [ Upstream commit 26594c6bbb60c6bc87e3762a86ceece57d164c66 ]
    
    When idr_find() returns NULL to intent, no error return code of
    qcom_glink_rx_data() is assigned.
    To fix this bug, ret is assigned with -ENOENT in this case.
    
    Fixes: 64f95f87920d ("rpmsg: glink: Use the local intents when receiving data")
    Reported-by: TOTE Robot <oslab@tsinghua.edu.cn>
    Signed-off-by: Jia-Ju Bai <baijiaju1990@gmail.com>
    Link: https://lore.kernel.org/r/20210306133624.17237-1-baijiaju1990@gmail.com
    Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/rpmsg/qcom_glink_native.c b/drivers/rpmsg/qcom_glink_native.c
index a755f85686e5..8fa0f0eaaf43 100644
--- a/drivers/rpmsg/qcom_glink_native.c
+++ b/drivers/rpmsg/qcom_glink_native.c
@@ -857,6 +857,7 @@ static int qcom_glink_rx_data(struct qcom_glink *glink, size_t avail)
 			dev_err(glink->dev,
 				"no intent found for channel %s intent %d",
 				channel->name, liid);
+			ret = -ENOENT;
 			goto advance_rx;
 		}
 	}

commit a9938d6d78a238d6ab8de57a4d3dcf77adceb9bb
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Thu Feb 18 03:00:05 2021 +0100

    ARM: 9064/1: hw_breakpoint: Do not directly check the event's overflow_handler hook
    
    [ Upstream commit a506bd5756290821a4314f502b4bafc2afcf5260 ]
    
    The commit 1879445dfa7b ("perf/core: Set event's default
    ::overflow_handler()") set a default event->overflow_handler in
    perf_event_alloc(), and replace the check event->overflow_handler with
    is_default_overflow_handler(), but one is missing.
    
    Currently, the bp->overflow_handler can not be NULL. As a result,
    enable_single_step() is always not invoked.
    
    Comments from Zhen Lei:
    
     https://patchwork.kernel.org/project/linux-arm-kernel/patch/20210207105934.2001-1-thunder.leizhen@huawei.com/
    
    Fixes: 1879445dfa7b ("perf/core: Set event's default ::overflow_handler()")
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Cc: Wang Nan <wangnan0@huawei.com>
    Acked-by: Will Deacon <will@kernel.org>
    Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/kernel/hw_breakpoint.c b/arch/arm/kernel/hw_breakpoint.c
index 97fa9c167757..2ee5b7f5e7ad 100644
--- a/arch/arm/kernel/hw_breakpoint.c
+++ b/arch/arm/kernel/hw_breakpoint.c
@@ -891,7 +891,7 @@ static void breakpoint_handler(unsigned long unknown, struct pt_regs *regs)
 			info->trigger = addr;
 			pr_debug("breakpoint fired: address = 0x%x\n", addr);
 			perf_bp_event(bp, regs);
-			if (!bp->overflow_handler)
+			if (is_default_overflow_handler(bp))
 				enable_single_step(bp, addr);
 			goto unlock;
 		}

commit 691062feb4ed8303be75ab07c5c1e09311bd8c80
Author: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Date:   Mon Jan 25 02:28:26 2021 +0300

    PCI: Release OF node in pci_scan_device()'s error path
    
    [ Upstream commit c99e755a4a4c165cad6effb39faffd0f3377c02d ]
    
    In pci_scan_device(), if pci_setup_device() fails for any reason, the code
    will not release device's of_node by calling pci_release_of_node().  Fix
    that by calling the release function.
    
    Fixes: 98d9f30c820d ("pci/of: Match PCI devices to OF nodes dynamically")
    Link: https://lore.kernel.org/r/20210124232826.1879-1-dmitry.baryshkov@linaro.org
    Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 9a5b6a8e2502..113b7bdf86dd 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -2359,6 +2359,7 @@ static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn)
 	pci_set_of_node(dev);
 
 	if (pci_setup_device(dev)) {
+		pci_release_of_node(dev);
 		pci_bus_put(dev->bus);
 		kfree(dev);
 		return NULL;

commit a243eb7df9f16dbdeda2ad50c2372a7129738f39
Author: Pali Rohár <pali@kernel.org>
Date:   Wed Mar 3 15:22:02 2021 +0100

    PCI: iproc: Fix return value of iproc_msi_irq_domain_alloc()
    
    [ Upstream commit 1e83130f01b04c16579ed5a5e03d729bcffc4c5d ]
    
    IRQ domain alloc function should return zero on success. Non-zero value
    indicates failure.
    
    Link: https://lore.kernel.org/r/20210303142202.25780-1-pali@kernel.org
    Fixes: fc54bae28818 ("PCI: iproc: Allow allocation of multiple MSIs")
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Reviewed-by: Krzysztof Wilczy?ski <kw@linux.com>
    Acked-by: Ray Jui <ray.jui@broadcom.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pci/controller/pcie-iproc-msi.c b/drivers/pci/controller/pcie-iproc-msi.c
index ea612382599c..dc953c73cb56 100644
--- a/drivers/pci/controller/pcie-iproc-msi.c
+++ b/drivers/pci/controller/pcie-iproc-msi.c
@@ -271,7 +271,7 @@ static int iproc_msi_irq_domain_alloc(struct irq_domain *domain,
 				    NULL, NULL);
 	}
 
-	return hwirq;
+	return 0;
 }
 
 static void iproc_msi_irq_domain_free(struct irq_domain *domain,

commit b8ee94065e6e87f2d7f331d53739994b3bfeedec
Author: Colin Ian King <colin.king@canonical.com>
Date:   Thu Mar 4 09:21:18 2021 +0000

    f2fs: fix a redundant call to f2fs_balance_fs if an error occurs
    
    [ Upstream commit 28e18ee636ba28532dbe425540af06245a0bbecb ]
    
    The  uninitialized variable dn.node_changed does not get set when a
    call to f2fs_get_node_page fails.  This uninitialized value gets used
    in the call to f2fs_balance_fs() that may or not may not balances
    dirty node and dentry pages depending on the uninitialized state of
    the variable. Fix this by only calling f2fs_balance_fs if err is
    not set.
    
    Thanks to Jaegeuk Kim for suggesting an appropriate fix.
    
    Addresses-Coverity: ("Uninitialized scalar variable")
    Fixes: 2a3407607028 ("f2fs: call f2fs_balance_fs only when node was changed")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Reviewed-by: Chao Yu <yuchao0@huawei.com>
    Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c
index 299f295fcb6c..6bf78cf63ea2 100644
--- a/fs/f2fs/inline.c
+++ b/fs/f2fs/inline.c
@@ -220,7 +220,8 @@ int f2fs_convert_inline_inode(struct inode *inode)
 
 	f2fs_put_page(page, 1);
 
-	f2fs_balance_fs(sbi, dn.node_changed);
+	if (!err)
+		f2fs_balance_fs(sbi, dn.node_changed);
 
 	return err;
 }

commit 312a7bac61a043ed88ac76d688269444d84505a8
Author: David Ward <david.ward@gatech.edu>
Date:   Sun Apr 18 09:46:57 2021 -0400

    ASoC: rt286: Make RT286_SET_GPIO_* readable and writable
    
    [ Upstream commit cd8499d5c03ba260e3191e90236d0e5f6b147563 ]
    
    The GPIO configuration cannot be applied if the registers are inaccessible.
    This prevented the headset mic from working on the Dell XPS 13 9343.
    
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=114171
    Signed-off-by: David Ward <david.ward@gatech.edu>
    Link: https://lore.kernel.org/r/20210418134658.4333-5-david.ward@gatech.edu
    Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/codecs/rt286.c b/sound/soc/codecs/rt286.c
index 7e44ccae3bc8..c29c6cf41ece 100644
--- a/sound/soc/codecs/rt286.c
+++ b/sound/soc/codecs/rt286.c
@@ -174,6 +174,9 @@ static bool rt286_readable_register(struct device *dev, unsigned int reg)
 	case RT286_PROC_COEF:
 	case RT286_SET_AMP_GAIN_ADC_IN1:
 	case RT286_SET_AMP_GAIN_ADC_IN2:
+	case RT286_SET_GPIO_MASK:
+	case RT286_SET_GPIO_DIRECTION:
+	case RT286_SET_GPIO_DATA:
 	case RT286_SET_POWER(RT286_DAC_OUT1):
 	case RT286_SET_POWER(RT286_DAC_OUT2):
 	case RT286_SET_POWER(RT286_ADC_IN1):

commit 0f6a886753b4e1ff4bf1d38160c0915e35112771
Author: Sergei Trofimovich <slyfox@gentoo.org>
Date:   Thu Apr 29 22:53:48 2021 -0700

    ia64: module: fix symbolizer crash on fdescr
    
    [ Upstream commit 99e729bd40fb3272fa4b0140839d5e957b58588a ]
    
    Noticed failure as a crash on ia64 when tried to symbolize all backtraces
    collected by page_owner=on:
    
        $ cat /sys/kernel/debug/page_owner
        <oops>
    
        CPU: 1 PID: 2074 Comm: cat Not tainted 5.12.0-rc4 #226
        Hardware name: hp server rx3600, BIOS 04.03 04/08/2008
        ip is at dereference_module_function_descriptor+0x41/0x100
    
    Crash happens at dereference_module_function_descriptor() due to
    use-after-free when dereferencing ".opd" section header.
    
    All section headers are already freed after module is laoded successfully.
    
    To keep symbolizer working the change stores ".opd" address and size after
    module is relocated to a new place and before section headers are
    discarded.
    
    To make similar errors less obscure module_finalize() now zeroes out all
    variables relevant to module loading only.
    
    Link: https://lkml.kernel.org/r/20210403074803.3309096-1-slyfox@gentoo.org
    Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/ia64/include/asm/module.h b/arch/ia64/include/asm/module.h
index f319144260ce..9fbf32e6e881 100644
--- a/arch/ia64/include/asm/module.h
+++ b/arch/ia64/include/asm/module.h
@@ -14,16 +14,20 @@
 struct elf64_shdr;			/* forward declration */
 
 struct mod_arch_specific {
+	/* Used only at module load time. */
 	struct elf64_shdr *core_plt;	/* core PLT section */
 	struct elf64_shdr *init_plt;	/* init PLT section */
 	struct elf64_shdr *got;		/* global offset table */
 	struct elf64_shdr *opd;		/* official procedure descriptors */
 	struct elf64_shdr *unwind;	/* unwind-table section */
 	unsigned long gp;		/* global-pointer for module */
+	unsigned int next_got_entry;	/* index of next available got entry */
 
+	/* Used at module run and cleanup time. */
 	void *core_unw_table;		/* core unwind-table cookie returned by unwinder */
 	void *init_unw_table;		/* init unwind-table cookie returned by unwinder */
-	unsigned int next_got_entry;	/* index of next available got entry */
+	void *opd_addr;			/* symbolize uses .opd to get to actual function */
+	unsigned long opd_size;
 };
 
 #define MODULE_PROC_FAMILY	"ia64"
diff --git a/arch/ia64/kernel/module.c b/arch/ia64/kernel/module.c
index 1a42ba885188..ee693c8cec49 100644
--- a/arch/ia64/kernel/module.c
+++ b/arch/ia64/kernel/module.c
@@ -905,9 +905,31 @@ register_unwind_table (struct module *mod)
 int
 module_finalize (const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, struct module *mod)
 {
+	struct mod_arch_specific *mas = &mod->arch;
+
 	DEBUGP("%s: init: entry=%p\n", __func__, mod->init);
-	if (mod->arch.unwind)
+	if (mas->unwind)
 		register_unwind_table(mod);
+
+	/*
+	 * ".opd" was already relocated to the final destination. Store
+	 * it's address for use in symbolizer.
+	 */
+	mas->opd_addr = (void *)mas->opd->sh_addr;
+	mas->opd_size = mas->opd->sh_size;
+
+	/*
+	 * Module relocation was already done at this point. Section
+	 * headers are about to be deleted. Wipe out load-time context.
+	 */
+	mas->core_plt = NULL;
+	mas->init_plt = NULL;
+	mas->got = NULL;
+	mas->opd = NULL;
+	mas->unwind = NULL;
+	mas->gp = 0;
+	mas->next_got_entry = 0;
+
 	return 0;
 }
 
@@ -926,10 +948,9 @@ module_arch_cleanup (struct module *mod)
 
 void *dereference_module_function_descriptor(struct module *mod, void *ptr)
 {
-	Elf64_Shdr *opd = mod->arch.opd;
+	struct mod_arch_specific *mas = &mod->arch;
 
-	if (ptr < (void *)opd->sh_addr ||
-			ptr >= (void *)(opd->sh_addr + opd->sh_size))
+	if (ptr < mas->opd_addr || ptr >= mas->opd_addr + mas->opd_size)
 		return ptr;
 
 	return dereference_function_descriptor(ptr);

commit 65fecc2d3c1b5a5a8c31dca03d6623b3a0aab276
Author: Felix Fietkau <nbd@nbd.name>
Date:   Thu Apr 22 22:20:54 2021 -0700

    net: ethernet: mtk_eth_soc: fix RX VLAN offload
    
    [ Upstream commit 3f57d8c40fea9b20543cab4da12f4680d2ef182c ]
    
    The VLAN ID in the rx descriptor is only valid if the RX_DMA_VTAG bit is
    set. Fixes frames wrongly marked with VLAN tags.
    
    Signed-off-by: Felix Fietkau <nbd@nbd.name>
    [Ilya: fix commit message]
    Signed-off-by: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index b72a4fad7bc8..59f3dce3ab1d 100644
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -1041,7 +1041,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget,
 		skb->protocol = eth_type_trans(skb, netdev);
 
 		if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX &&
-		    RX_DMA_VID(trxd.rxd3))
+		    (trxd.rxd2 & RX_DMA_VTAG))
 			__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
 					       RX_DMA_VID(trxd.rxd3));
 		skb_record_rx_queue(skb, 0);
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
index 46819297fc3e..cb6b27861afa 100644
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
@@ -285,6 +285,7 @@
 #define RX_DMA_DONE		BIT(31)
 #define RX_DMA_PLEN0(_x)	(((_x) & 0x3fff) << 16)
 #define RX_DMA_GET_PLEN0(_x)	(((_x) >> 16) & 0x3fff)
+#define RX_DMA_VTAG		BIT(15)
 
 /* QDMA descriptor rxd3 */
 #define RX_DMA_VID(_x)		((_x) & 0xfff)

commit 2708da3dbba9e05f7eb57bb79638194d08d3eb38
Author: Alexey Kardashevskiy <aik@ozlabs.ru>
Date:   Mon Mar 1 17:36:53 2021 +1100

    powerpc/iommu: Annotate nested lock for lockdep
    
    [ Upstream commit cc7130bf119add37f36238343a593b71ef6ecc1e ]
    
    The IOMMU table is divided into pools for concurrent mappings and each
    pool has a separate spinlock. When taking the ownership of an IOMMU group
    to pass through a device to a VM, we lock these spinlocks which triggers
    a false negative warning in lockdep (below).
    
    This fixes it by annotating the large pool's spinlock as a nest lock
    which makes lockdep not complaining when locking nested locks if
    the nest lock is locked already.
    
    ===
    WARNING: possible recursive locking detected
    5.11.0-le_syzkaller_a+fstn1 #100 Not tainted
    --------------------------------------------
    qemu-system-ppc/4129 is trying to acquire lock:
    c0000000119bddb0 (&(p->lock)/1){....}-{2:2}, at: iommu_take_ownership+0xac/0x1e0
    
    but task is already holding lock:
    c0000000119bdd30 (&(p->lock)/1){....}-{2:2}, at: iommu_take_ownership+0xac/0x1e0
    
    other info that might help us debug this:
     Possible unsafe locking scenario:
    
           CPU0
           ----
      lock(&(p->lock)/1);
      lock(&(p->lock)/1);
    ===
    
    Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210301063653.51003-1-aik@ozlabs.ru
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c
index f0dc680e659a..c3d2d5cd7c10 100644
--- a/arch/powerpc/kernel/iommu.c
+++ b/arch/powerpc/kernel/iommu.c
@@ -1030,7 +1030,7 @@ int iommu_take_ownership(struct iommu_table *tbl)
 
 	spin_lock_irqsave(&tbl->large_pool.lock, flags);
 	for (i = 0; i < tbl->nr_pools; i++)
-		spin_lock(&tbl->pools[i].lock);
+		spin_lock_nest_lock(&tbl->pools[i].lock, &tbl->large_pool.lock);
 
 	if (tbl->it_offset == 0)
 		clear_bit(0, tbl->it_map);
@@ -1059,7 +1059,7 @@ void iommu_release_ownership(struct iommu_table *tbl)
 
 	spin_lock_irqsave(&tbl->large_pool.lock, flags);
 	for (i = 0; i < tbl->nr_pools; i++)
-		spin_lock(&tbl->pools[i].lock);
+		spin_lock_nest_lock(&tbl->pools[i].lock, &tbl->large_pool.lock);
 
 	memset(tbl->it_map, 0, sz);
 

commit cb82148370e16bb33dabdac1771ce018e05e88d7
Author: Gustavo A. R. Silva <gustavoars@kernel.org>
Date:   Wed Apr 14 18:45:15 2021 -0500

    wl3501_cs: Fix out-of-bounds warnings in wl3501_mgmt_join
    
    [ Upstream commit bb43e5718d8f1b46e7a77e7b39be3c691f293050 ]
    
    Fix the following out-of-bounds warnings by adding a new structure
    wl3501_req instead of duplicating the same members in structure
    wl3501_join_req and wl3501_scan_confirm:
    
    arch/x86/include/asm/string_32.h:182:25: warning: '__builtin_memcpy' offset [39, 108] from the object at 'sig' is out of the bounds of referenced subobject 'beacon_period' with type 'short unsigned int' at offset 36 [-Warray-bounds]
    arch/x86/include/asm/string_32.h:182:25: warning: '__builtin_memcpy' offset [25, 95] from the object at 'sig' is out of the bounds of referenced subobject 'beacon_period' with type 'short unsigned int' at offset 22 [-Warray-bounds]
    
    Refactor the code, accordingly:
    
    $ pahole -C wl3501_req drivers/net/wireless/wl3501_cs.o
    struct wl3501_req {
            u16                        beacon_period;        /*     0     2 */
            u16                        dtim_period;          /*     2     2 */
            u16                        cap_info;             /*     4     2 */
            u8                         bss_type;             /*     6     1 */
            u8                         bssid[6];             /*     7     6 */
            struct iw_mgmt_essid_pset  ssid;                 /*    13    34 */
            struct iw_mgmt_ds_pset     ds_pset;              /*    47     3 */
            struct iw_mgmt_cf_pset     cf_pset;              /*    50     8 */
            struct iw_mgmt_ibss_pset   ibss_pset;            /*    58     4 */
            struct iw_mgmt_data_rset   bss_basic_rset;       /*    62    10 */
    
            /* size: 72, cachelines: 2, members: 10 */
            /* last cacheline: 8 bytes */
    };
    
    $ pahole -C wl3501_join_req drivers/net/wireless/wl3501_cs.o
    struct wl3501_join_req {
            u16                        next_blk;             /*     0     2 */
            u8                         sig_id;               /*     2     1 */
            u8                         reserved;             /*     3     1 */
            struct iw_mgmt_data_rset   operational_rset;     /*     4    10 */
            u16                        reserved2;            /*    14     2 */
            u16                        timeout;              /*    16     2 */
            u16                        probe_delay;          /*    18     2 */
            u8                         timestamp[8];         /*    20     8 */
            u8                         local_time[8];        /*    28     8 */
            struct wl3501_req          req;                  /*    36    72 */
    
            /* size: 108, cachelines: 2, members: 10 */
            /* last cacheline: 44 bytes */
    };
    
    $ pahole -C wl3501_scan_confirm drivers/net/wireless/wl3501_cs.o
    struct wl3501_scan_confirm {
            u16                        next_blk;             /*     0     2 */
            u8                         sig_id;               /*     2     1 */
            u8                         reserved;             /*     3     1 */
            u16                        status;               /*     4     2 */
            char                       timestamp[8];         /*     6     8 */
            char                       localtime[8];         /*    14     8 */
            struct wl3501_req          req;                  /*    22    72 */
            /* --- cacheline 1 boundary (64 bytes) was 30 bytes ago --- */
            u8                         rssi;                 /*    94     1 */
    
            /* size: 96, cachelines: 2, members: 8 */
            /* padding: 1 */
            /* last cacheline: 32 bytes */
    };
    
    The problem is that the original code is trying to copy data into a
    bunch of struct members adjacent to each other in a single call to
    memcpy(). Now that a new struct wl3501_req enclosing all those adjacent
    members is introduced, memcpy() doesn't overrun the length of
    &sig.beacon_period and &this->bss_set[i].beacon_period, because the
    address of the new struct object _req_ is used as the destination,
    instead.
    
    This helps with the ongoing efforts to globally enable -Warray-bounds
    and get us closer to being able to tighten the FORTIFY_SOURCE routines
    on memcpy().
    
    Link: https://github.com/KSPP/linux/issues/109
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/1fbaf516da763b50edac47d792a9145aa4482e29.1618442265.git.gustavoars@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/wl3501.h b/drivers/net/wireless/wl3501.h
index 077a934ae3b5..a10ee5a68012 100644
--- a/drivers/net/wireless/wl3501.h
+++ b/drivers/net/wireless/wl3501.h
@@ -379,16 +379,7 @@ struct wl3501_get_confirm {
 	u8	mib_value[100];
 };
 
-struct wl3501_join_req {
-	u16			    next_blk;
-	u8			    sig_id;
-	u8			    reserved;
-	struct iw_mgmt_data_rset    operational_rset;
-	u16			    reserved2;
-	u16			    timeout;
-	u16			    probe_delay;
-	u8			    timestamp[8];
-	u8			    local_time[8];
+struct wl3501_req {
 	u16			    beacon_period;
 	u16			    dtim_period;
 	u16			    cap_info;
@@ -401,6 +392,19 @@ struct wl3501_join_req {
 	struct iw_mgmt_data_rset    bss_basic_rset;
 };
 
+struct wl3501_join_req {
+	u16			    next_blk;
+	u8			    sig_id;
+	u8			    reserved;
+	struct iw_mgmt_data_rset    operational_rset;
+	u16			    reserved2;
+	u16			    timeout;
+	u16			    probe_delay;
+	u8			    timestamp[8];
+	u8			    local_time[8];
+	struct wl3501_req	    req;
+};
+
 struct wl3501_join_confirm {
 	u16	next_blk;
 	u8	sig_id;
@@ -443,16 +447,7 @@ struct wl3501_scan_confirm {
 	u16			    status;
 	char			    timestamp[8];
 	char			    localtime[8];
-	u16			    beacon_period;
-	u16			    dtim_period;
-	u16			    cap_info;
-	u8			    bss_type;
-	u8			    bssid[ETH_ALEN];
-	struct iw_mgmt_essid_pset   ssid;
-	struct iw_mgmt_ds_pset	    ds_pset;
-	struct iw_mgmt_cf_pset	    cf_pset;
-	struct iw_mgmt_ibss_pset    ibss_pset;
-	struct iw_mgmt_data_rset    bss_basic_rset;
+	struct wl3501_req	    req;
 	u8			    rssi;
 };
 
diff --git a/drivers/net/wireless/wl3501_cs.c b/drivers/net/wireless/wl3501_cs.c
index 0019b01145ba..f33ece937047 100644
--- a/drivers/net/wireless/wl3501_cs.c
+++ b/drivers/net/wireless/wl3501_cs.c
@@ -589,7 +589,7 @@ static int wl3501_mgmt_join(struct wl3501_card *this, u16 stas)
 	struct wl3501_join_req sig = {
 		.sig_id		  = WL3501_SIG_JOIN_REQ,
 		.timeout	  = 10,
-		.ds_pset = {
+		.req.ds_pset = {
 			.el = {
 				.id  = IW_MGMT_INFO_ELEMENT_DS_PARAMETER_SET,
 				.len = 1,
@@ -598,7 +598,7 @@ static int wl3501_mgmt_join(struct wl3501_card *this, u16 stas)
 		},
 	};
 
-	memcpy(&sig.beacon_period, &this->bss_set[stas].beacon_period, 72);
+	memcpy(&sig.req, &this->bss_set[stas].req, sizeof(sig.req));
 	return wl3501_esbq_exec(this, &sig, sizeof(sig));
 }
 
@@ -666,35 +666,37 @@ static void wl3501_mgmt_scan_confirm(struct wl3501_card *this, u16 addr)
 	if (sig.status == WL3501_STATUS_SUCCESS) {
 		pr_debug("success");
 		if ((this->net_type == IW_MODE_INFRA &&
-		     (sig.cap_info & WL3501_MGMT_CAPABILITY_ESS)) ||
+		     (sig.req.cap_info & WL3501_MGMT_CAPABILITY_ESS)) ||
 		    (this->net_type == IW_MODE_ADHOC &&
-		     (sig.cap_info & WL3501_MGMT_CAPABILITY_IBSS)) ||
+		     (sig.req.cap_info & WL3501_MGMT_CAPABILITY_IBSS)) ||
 		    this->net_type == IW_MODE_AUTO) {
 			if (!this->essid.el.len)
 				matchflag = 1;
 			else if (this->essid.el.len == 3 &&
 				 !memcmp(this->essid.essid, "ANY", 3))
 				matchflag = 1;
-			else if (this->essid.el.len != sig.ssid.el.len)
+			else if (this->essid.el.len != sig.req.ssid.el.len)
 				matchflag = 0;
-			else if (memcmp(this->essid.essid, sig.ssid.essid,
+			else if (memcmp(this->essid.essid, sig.req.ssid.essid,
 					this->essid.el.len))
 				matchflag = 0;
 			else
 				matchflag = 1;
 			if (matchflag) {
 				for (i = 0; i < this->bss_cnt; i++) {
-					if (ether_addr_equal_unaligned(this->bss_set[i].bssid, sig.bssid)) {
+					if (ether_addr_equal_unaligned(this->bss_set[i].req.bssid,
+								       sig.req.bssid)) {
 						matchflag = 0;
 						break;
 					}
 				}
 			}
 			if (matchflag && (i < 20)) {
-				memcpy(&this->bss_set[i].beacon_period,
-				       &sig.beacon_period, 73);
+				memcpy(&this->bss_set[i].req,
+				       &sig.req, sizeof(sig.req));
 				this->bss_cnt++;
 				this->rssi = sig.rssi;
+				this->bss_set[i].rssi = sig.rssi;
 			}
 		}
 	} else if (sig.status == WL3501_STATUS_TIMEOUT) {
@@ -886,19 +888,19 @@ static void wl3501_mgmt_join_confirm(struct net_device *dev, u16 addr)
 			if (this->join_sta_bss < this->bss_cnt) {
 				const int i = this->join_sta_bss;
 				memcpy(this->bssid,
-				       this->bss_set[i].bssid, ETH_ALEN);
-				this->chan = this->bss_set[i].ds_pset.chan;
+				       this->bss_set[i].req.bssid, ETH_ALEN);
+				this->chan = this->bss_set[i].req.ds_pset.chan;
 				iw_copy_mgmt_info_element(&this->keep_essid.el,
-						     &this->bss_set[i].ssid.el);
+						     &this->bss_set[i].req.ssid.el);
 				wl3501_mgmt_auth(this);
 			}
 		} else {
 			const int i = this->join_sta_bss;
 
-			memcpy(&this->bssid, &this->bss_set[i].bssid, ETH_ALEN);
-			this->chan = this->bss_set[i].ds_pset.chan;
+			memcpy(&this->bssid, &this->bss_set[i].req.bssid, ETH_ALEN);
+			this->chan = this->bss_set[i].req.ds_pset.chan;
 			iw_copy_mgmt_info_element(&this->keep_essid.el,
-						  &this->bss_set[i].ssid.el);
+						  &this->bss_set[i].req.ssid.el);
 			wl3501_online(dev);
 		}
 	} else {
@@ -1576,30 +1578,30 @@ static int wl3501_get_scan(struct net_device *dev, struct iw_request_info *info,
 	for (i = 0; i < this->bss_cnt; ++i) {
 		iwe.cmd			= SIOCGIWAP;
 		iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
-		memcpy(iwe.u.ap_addr.sa_data, this->bss_set[i].bssid, ETH_ALEN);
+		memcpy(iwe.u.ap_addr.sa_data, this->bss_set[i].req.bssid, ETH_ALEN);
 		current_ev = iwe_stream_add_event(info, current_ev,
 						  extra + IW_SCAN_MAX_DATA,
 						  &iwe, IW_EV_ADDR_LEN);
 		iwe.cmd		  = SIOCGIWESSID;
 		iwe.u.data.flags  = 1;
-		iwe.u.data.length = this->bss_set[i].ssid.el.len;
+		iwe.u.data.length = this->bss_set[i].req.ssid.el.len;
 		current_ev = iwe_stream_add_point(info, current_ev,
 						  extra + IW_SCAN_MAX_DATA,
 						  &iwe,
-						  this->bss_set[i].ssid.essid);
+						  this->bss_set[i].req.ssid.essid);
 		iwe.cmd	   = SIOCGIWMODE;
-		iwe.u.mode = this->bss_set[i].bss_type;
+		iwe.u.mode = this->bss_set[i].req.bss_type;
 		current_ev = iwe_stream_add_event(info, current_ev,
 						  extra + IW_SCAN_MAX_DATA,
 						  &iwe, IW_EV_UINT_LEN);
 		iwe.cmd = SIOCGIWFREQ;
-		iwe.u.freq.m = this->bss_set[i].ds_pset.chan;
+		iwe.u.freq.m = this->bss_set[i].req.ds_pset.chan;
 		iwe.u.freq.e = 0;
 		current_ev = iwe_stream_add_event(info, current_ev,
 						  extra + IW_SCAN_MAX_DATA,
 						  &iwe, IW_EV_FREQ_LEN);
 		iwe.cmd = SIOCGIWENCODE;
-		if (this->bss_set[i].cap_info & WL3501_MGMT_CAPABILITY_PRIVACY)
+		if (this->bss_set[i].req.cap_info & WL3501_MGMT_CAPABILITY_PRIVACY)
 			iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
 		else
 			iwe.u.data.flags = IW_ENCODE_DISABLED;

commit 91a2f3c5323ceb1931656d41bb0fbf9a7df7a37e
Author: Gustavo A. R. Silva <gustavoars@kernel.org>
Date:   Wed Apr 14 18:43:19 2021 -0500

    wl3501_cs: Fix out-of-bounds warnings in wl3501_send_pkt
    
    [ Upstream commit 820aa37638a252b57967bdf4038a514b1ab85d45 ]
    
    Fix the following out-of-bounds warnings by enclosing structure members
    daddr and saddr into new struct addr, in structures wl3501_md_req and
    wl3501_md_ind:
    
    arch/x86/include/asm/string_32.h:182:25: warning: '__builtin_memcpy' offset [18, 23] from the object at 'sig' is out of the bounds of referenced subobject 'daddr' with type 'u8[6]' {aka 'unsigned char[6]'} at offset 11 [-Warray-bounds]
    arch/x86/include/asm/string_32.h:182:25: warning: '__builtin_memcpy' offset [18, 23] from the object at 'sig' is out of the bounds of referenced subobject 'daddr' with type 'u8[6]' {aka 'unsigned char[6]'} at offset 11 [-Warray-bounds]
    
    Refactor the code, accordingly:
    
    $ pahole -C wl3501_md_req drivers/net/wireless/wl3501_cs.o
    struct wl3501_md_req {
            u16                        next_blk;             /*     0     2 */
            u8                         sig_id;               /*     2     1 */
            u8                         routing;              /*     3     1 */
            u16                        data;                 /*     4     2 */
            u16                        size;                 /*     6     2 */
            u8                         pri;                  /*     8     1 */
            u8                         service_class;        /*     9     1 */
            struct {
                    u8                 daddr[6];             /*    10     6 */
                    u8                 saddr[6];             /*    16     6 */
            } addr;                                          /*    10    12 */
    
            /* size: 22, cachelines: 1, members: 8 */
            /* last cacheline: 22 bytes */
    };
    
    $ pahole -C wl3501_md_ind drivers/net/wireless/wl3501_cs.o
    struct wl3501_md_ind {
            u16                        next_blk;             /*     0     2 */
            u8                         sig_id;               /*     2     1 */
            u8                         routing;              /*     3     1 */
            u16                        data;                 /*     4     2 */
            u16                        size;                 /*     6     2 */
            u8                         reception;            /*     8     1 */
            u8                         pri;                  /*     9     1 */
            u8                         service_class;        /*    10     1 */
            struct {
                    u8                 daddr[6];             /*    11     6 */
                    u8                 saddr[6];             /*    17     6 */
            } addr;                                          /*    11    12 */
    
            /* size: 24, cachelines: 1, members: 9 */
            /* padding: 1 */
            /* last cacheline: 24 bytes */
    };
    
    The problem is that the original code is trying to copy data into a
    couple of arrays adjacent to each other in a single call to memcpy().
    Now that a new struct _addr_ enclosing those two adjacent arrays
    is introduced, memcpy() doesn't overrun the length of &sig.daddr[0]
    and &sig.daddr, because the address of the new struct object _addr_
    is used, instead.
    
    This helps with the ongoing efforts to globally enable -Warray-bounds
    and get us closer to being able to tighten the FORTIFY_SOURCE routines
    on memcpy().
    
    Link: https://github.com/KSPP/linux/issues/109
    Reported-by: kernel test robot <lkp@intel.com>
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/d260fe56aed7112bff2be5b4d152d03ad7b78e78.1618442265.git.gustavoars@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/wl3501.h b/drivers/net/wireless/wl3501.h
index efdce9ae36ea..077a934ae3b5 100644
--- a/drivers/net/wireless/wl3501.h
+++ b/drivers/net/wireless/wl3501.h
@@ -471,8 +471,10 @@ struct wl3501_md_req {
 	u16	size;
 	u8	pri;
 	u8	service_class;
-	u8	daddr[ETH_ALEN];
-	u8	saddr[ETH_ALEN];
+	struct {
+		u8	daddr[ETH_ALEN];
+		u8	saddr[ETH_ALEN];
+	} addr;
 };
 
 struct wl3501_md_ind {
@@ -484,8 +486,10 @@ struct wl3501_md_ind {
 	u8	reception;
 	u8	pri;
 	u8	service_class;
-	u8	daddr[ETH_ALEN];
-	u8	saddr[ETH_ALEN];
+	struct {
+		u8	daddr[ETH_ALEN];
+		u8	saddr[ETH_ALEN];
+	} addr;
 };
 
 struct wl3501_md_confirm {
diff --git a/drivers/net/wireless/wl3501_cs.c b/drivers/net/wireless/wl3501_cs.c
index da62220b9c01..0019b01145ba 100644
--- a/drivers/net/wireless/wl3501_cs.c
+++ b/drivers/net/wireless/wl3501_cs.c
@@ -468,6 +468,7 @@ static int wl3501_send_pkt(struct wl3501_card *this, u8 *data, u16 len)
 	struct wl3501_md_req sig = {
 		.sig_id = WL3501_SIG_MD_REQ,
 	};
+	size_t sig_addr_len = sizeof(sig.addr);
 	u8 *pdata = (char *)data;
 	int rc = -EIO;
 
@@ -483,9 +484,9 @@ static int wl3501_send_pkt(struct wl3501_card *this, u8 *data, u16 len)
 			goto out;
 		}
 		rc = 0;
-		memcpy(&sig.daddr[0], pdata, 12);
-		pktlen = len - 12;
-		pdata += 12;
+		memcpy(&sig.addr, pdata, sig_addr_len);
+		pktlen = len - sig_addr_len;
+		pdata += sig_addr_len;
 		sig.data = bf;
 		if (((*pdata) * 256 + (*(pdata + 1))) > 1500) {
 			u8 addr4[ETH_ALEN] = {
@@ -979,7 +980,8 @@ static inline void wl3501_md_ind_interrupt(struct net_device *dev,
 	} else {
 		skb->dev = dev;
 		skb_reserve(skb, 2); /* IP headers on 16 bytes boundaries */
-		skb_copy_to_linear_data(skb, (unsigned char *)&sig.daddr, 12);
+		skb_copy_to_linear_data(skb, (unsigned char *)&sig.addr,
+					sizeof(sig.addr));
 		wl3501_receive(this, skb->data, pkt_len);
 		skb_put(skb, pkt_len);
 		skb->protocol	= eth_type_trans(skb, dev);

commit 8e3bd08829ac1a3f95d598121a6c88ab45695055
Author: Michael Ellerman <mpe@ellerman.id.au>
Date:   Sun Apr 18 23:54:13 2021 +1000

    powerpc/pseries: Stop calling printk in rtas_stop_self()
    
    [ Upstream commit ed8029d7b472369a010a1901358567ca3b6dbb0d ]
    
    RCU complains about us calling printk() from an offline CPU:
    
      =============================
      WARNING: suspicious RCU usage
      5.12.0-rc7-02874-g7cf90e481cb8 #1 Not tainted
      -----------------------------
      kernel/locking/lockdep.c:3568 RCU-list traversed in non-reader section!!
    
      other info that might help us debug this:
    
      RCU used illegally from offline CPU!
      rcu_scheduler_active = 2, debug_locks = 1
      no locks held by swapper/0/0.
    
      stack backtrace:
      CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.12.0-rc7-02874-g7cf90e481cb8 #1
      Call Trace:
        dump_stack+0xec/0x144 (unreliable)
        lockdep_rcu_suspicious+0x124/0x144
        __lock_acquire+0x1098/0x28b0
        lock_acquire+0x128/0x600
        _raw_spin_lock_irqsave+0x6c/0xc0
        down_trylock+0x2c/0x70
        __down_trylock_console_sem+0x60/0x140
        vprintk_emit+0x1a8/0x4b0
        vprintk_func+0xcc/0x200
        printk+0x40/0x54
        pseries_cpu_offline_self+0xc0/0x120
        arch_cpu_idle_dead+0x54/0x70
        do_idle+0x174/0x4a0
        cpu_startup_entry+0x38/0x40
        rest_init+0x268/0x388
        start_kernel+0x748/0x790
        start_here_common+0x1c/0x614
    
    Which happens because by the time we get to rtas_stop_self() we are
    already offline. In addition the message can be spammy, and is not that
    helpful for users, so remove it.
    
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210418135413.1204031-1-mpe@ellerman.id.au
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c
index 1d3f9313c02f..8bfb97d07d10 100644
--- a/arch/powerpc/platforms/pseries/hotplug-cpu.c
+++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c
@@ -95,9 +95,6 @@ static void rtas_stop_self(void)
 
 	BUG_ON(rtas_stop_self_token == RTAS_UNKNOWN_SERVICE);
 
-	printk("cpu %u (hwid %u) Ready to die...\n",
-	       smp_processor_id(), hard_smp_processor_id());
-
 	rtas_call_unlocked(&args, rtas_stop_self_token, 0, 1, NULL);
 
 	panic("Alas, I survived.\n");

commit adf112b5af06abfeecbbca19e3d732ee5255d2a8
Author: Yaqi Chen <chendotjs@gmail.com>
Date:   Fri Apr 16 23:48:03 2021 +0800

    samples/bpf: Fix broken tracex1 due to kprobe argument change
    
    [ Upstream commit 137733d08f4ab14a354dacaa9a8fc35217747605 ]
    
    >From commit c0bbbdc32feb ("__netif_receive_skb_core: pass skb by
    reference"), the first argument passed into __netif_receive_skb_core
    has changed to reference of a skb pointer.
    
    This commit fixes by using bpf_probe_read_kernel.
    
    Signed-off-by: Yaqi Chen <chendotjs@gmail.com>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Acked-by: Yonghong Song <yhs@fb.com>
    Link: https://lore.kernel.org/bpf/20210416154803.37157-1-chendotjs@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/samples/bpf/tracex1_kern.c b/samples/bpf/tracex1_kern.c
index 107da148820f..9c74b45c5720 100644
--- a/samples/bpf/tracex1_kern.c
+++ b/samples/bpf/tracex1_kern.c
@@ -20,7 +20,7 @@
 SEC("kprobe/__netif_receive_skb_core")
 int bpf_prog1(struct pt_regs *ctx)
 {
-	/* attaches to kprobe netif_receive_skb,
+	/* attaches to kprobe __netif_receive_skb_core,
 	 * looks for packets on loobpack device and prints them
 	 */
 	char devname[IFNAMSIZ];
@@ -29,7 +29,7 @@ int bpf_prog1(struct pt_regs *ctx)
 	int len;
 
 	/* non-portable! works for the given kernel only */
-	skb = (struct sk_buff *) PT_REGS_PARM1(ctx);
+	bpf_probe_read_kernel(&skb, sizeof(skb), (void *)PT_REGS_PARM1(ctx));
 	dev = _(skb->dev);
 	len = _(skb->len);
 

commit b1352870018fa0cff265ff1357434195e8481560
Author: Gustavo A. R. Silva <gustavoars@kernel.org>
Date:   Fri Apr 16 15:15:40 2021 -0500

    ethtool: ioctl: Fix out-of-bounds warning in store_link_ksettings_for_user()
    
    [ Upstream commit c1d9e34e11281a8ba1a1c54e4db554232a461488 ]
    
    Fix the following out-of-bounds warning:
    
    net/ethtool/ioctl.c:492:2: warning: 'memcpy' offset [49, 84] from the object at 'link_usettings' is out of the bounds of referenced subobject 'base' with type 'struct ethtool_link_settings' at offset 0 [-Warray-bounds]
    
    The problem is that the original code is trying to copy data into a
    some struct members adjacent to each other in a single call to
    memcpy(). This causes a legitimate compiler warning because memcpy()
    overruns the length of &link_usettings.base. Fix this by directly
    using &link_usettings and _from_ as destination and source addresses,
    instead.
    
    This helps with the ongoing efforts to globally enable -Warray-bounds
    and get us closer to being able to tighten the FORTIFY_SOURCE routines
    on memcpy().
    
    Link: https://github.com/KSPP/linux/issues/109
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/core/ethtool.c b/net/core/ethtool.c
index 1011625a0ca4..83028017c26d 100644
--- a/net/core/ethtool.c
+++ b/net/core/ethtool.c
@@ -618,7 +618,7 @@ store_link_ksettings_for_user(void __user *to,
 {
 	struct ethtool_link_usettings link_usettings;
 
-	memcpy(&link_usettings.base, &from->base, sizeof(link_usettings));
+	memcpy(&link_usettings, from, sizeof(link_usettings));
 	bitmap_to_arr32(link_usettings.link_modes.supported,
 			from->link_modes.supported,
 			__ETHTOOL_LINK_MODE_MASK_NBITS);

commit 562bf0db279129d5ffadf210245e81667b47c7c7
Author: David Ward <david.ward@gatech.edu>
Date:   Sun Apr 18 09:46:58 2021 -0400

    ASoC: rt286: Generalize support for ALC3263 codec
    
    [ Upstream commit aa2f9c12821e6a4ba1df4fb34a3dbc6a2a1ee7fe ]
    
    The ALC3263 codec on the XPS 13 9343 is also found on the Latitude 13 7350
    and Venue 11 Pro 7140. They require the same handling for the combo jack to
    work with a headset: GPIO pin 6 must be set.
    
    The HDA driver always sets this pin on the ALC3263, which it distinguishes
    by the codec vendor/device ID 0x10ec0288 and PCI subsystem vendor ID 0x1028
    (Dell). The ASoC driver does not use PCI, so adapt this check to use DMI to
    determine if Dell is the system vendor.
    
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=150601
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=205961
    Signed-off-by: David Ward <david.ward@gatech.edu>
    Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Link: https://lore.kernel.org/r/20210418134658.4333-6-david.ward@gatech.edu
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/codecs/rt286.c b/sound/soc/codecs/rt286.c
index 0b0f748bffbe..7e44ccae3bc8 100644
--- a/sound/soc/codecs/rt286.c
+++ b/sound/soc/codecs/rt286.c
@@ -1118,12 +1118,11 @@ static const struct dmi_system_id force_combo_jack_table[] = {
 	{ }
 };
 
-static const struct dmi_system_id dmi_dell_dino[] = {
+static const struct dmi_system_id dmi_dell[] = {
 	{
-		.ident = "Dell Dino",
+		.ident = "Dell",
 		.matches = {
 			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-			DMI_MATCH(DMI_PRODUCT_NAME, "XPS 13 9343")
 		}
 	},
 	{ }
@@ -1134,7 +1133,7 @@ static int rt286_i2c_probe(struct i2c_client *i2c,
 {
 	struct rt286_platform_data *pdata = dev_get_platdata(&i2c->dev);
 	struct rt286_priv *rt286;
-	int i, ret, val;
+	int i, ret, vendor_id;
 
 	rt286 = devm_kzalloc(&i2c->dev,	sizeof(*rt286),
 				GFP_KERNEL);
@@ -1150,14 +1149,15 @@ static int rt286_i2c_probe(struct i2c_client *i2c,
 	}
 
 	ret = regmap_read(rt286->regmap,
-		RT286_GET_PARAM(AC_NODE_ROOT, AC_PAR_VENDOR_ID), &val);
+		RT286_GET_PARAM(AC_NODE_ROOT, AC_PAR_VENDOR_ID), &vendor_id);
 	if (ret != 0) {
 		dev_err(&i2c->dev, "I2C error %d\n", ret);
 		return ret;
 	}
-	if (val != RT286_VENDOR_ID && val != RT288_VENDOR_ID) {
+	if (vendor_id != RT286_VENDOR_ID && vendor_id != RT288_VENDOR_ID) {
 		dev_err(&i2c->dev,
-			"Device with ID register %#x is not rt286\n", val);
+			"Device with ID register %#x is not rt286\n",
+			vendor_id);
 		return -ENODEV;
 	}
 
@@ -1181,8 +1181,8 @@ static int rt286_i2c_probe(struct i2c_client *i2c,
 	if (pdata)
 		rt286->pdata = *pdata;
 
-	if (dmi_check_system(force_combo_jack_table) ||
-		dmi_check_system(dmi_dell_dino))
+	if ((vendor_id == RT288_VENDOR_ID && dmi_check_system(dmi_dell)) ||
+		dmi_check_system(force_combo_jack_table))
 		rt286->pdata.cbj_en = true;
 
 	regmap_write(rt286->regmap, RT286_SET_AUDIO_POWER, AC_PWRST_D3);
@@ -1221,7 +1221,7 @@ static int rt286_i2c_probe(struct i2c_client *i2c,
 	regmap_update_bits(rt286->regmap, RT286_DEPOP_CTRL3, 0xf777, 0x4737);
 	regmap_update_bits(rt286->regmap, RT286_DEPOP_CTRL4, 0x00ff, 0x003f);
 
-	if (dmi_check_system(dmi_dell_dino)) {
+	if (vendor_id == RT288_VENDOR_ID && dmi_check_system(dmi_dell)) {
 		regmap_update_bits(rt286->regmap,
 			RT286_SET_GPIO_MASK, 0x40, 0x40);
 		regmap_update_bits(rt286->regmap,

commit efeb91f61d7838129c66cc5b9a61353b7ca3e867
Author: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Date:   Thu Apr 1 21:12:00 2021 +0530

    powerpc/smp: Set numa node before updating mask
    
    [ Upstream commit 6980d13f0dd189846887bbbfa43793d9a41768d3 ]
    
    Geethika reported a trace when doing a dlpar CPU add.
    
    ------------[ cut here ]------------
    WARNING: CPU: 152 PID: 1134 at kernel/sched/topology.c:2057
    CPU: 152 PID: 1134 Comm: kworker/152:1 Not tainted 5.12.0-rc5-master #5
    Workqueue: events cpuset_hotplug_workfn
    NIP:  c0000000001cfc14 LR: c0000000001cfc10 CTR: c0000000007e3420
    REGS: c0000034a08eb260 TRAP: 0700   Not tainted  (5.12.0-rc5-master+)
    MSR:  8000000000029033 <SF,EE,ME,IR,DR,RI,LE>  CR: 28828422  XER: 00000020
    CFAR: c0000000001fd888 IRQMASK: 0 #012GPR00: c0000000001cfc10
    c0000034a08eb500 c000000001f35400 0000000000000027 #012GPR04:
    c0000035abaa8010 c0000035abb30a00 0000000000000027 c0000035abaa8018
    #012GPR08: 0000000000000023 c0000035abaaef48 00000035aa540000
    c0000035a49dffe8 #012GPR12: 0000000028828424 c0000035bf1a1c80
    0000000000000497 0000000000000004 #012GPR16: c00000000347a258
    0000000000000140 c00000000203d468 c000000001a1a490 #012GPR20:
    c000000001f9c160 c0000034adf70920 c0000034aec9fd20 0000000100087bd3
    #012GPR24: 0000000100087bd3 c0000035b3de09f8 0000000000000030
    c0000035b3de09f8 #012GPR28: 0000000000000028 c00000000347a280
    c0000034aefe0b00 c0000000010a2a68
    NIP [c0000000001cfc14] build_sched_domains+0x6a4/0x1500
    LR [c0000000001cfc10] build_sched_domains+0x6a0/0x1500
    Call Trace:
    [c0000034a08eb500] [c0000000001cfc10] build_sched_domains+0x6a0/0x1500 (unreliable)
    [c0000034a08eb640] [c0000000001d1e6c] partition_sched_domains_locked+0x3ec/0x530
    [c0000034a08eb6e0] [c0000000002936d4] rebuild_sched_domains_locked+0x524/0xbf0
    [c0000034a08eb7e0] [c000000000296bb0] rebuild_sched_domains+0x40/0x70
    [c0000034a08eb810] [c000000000296e74] cpuset_hotplug_workfn+0x294/0xe20
    [c0000034a08ebc30] [c000000000178dd0] process_one_work+0x300/0x670
    [c0000034a08ebd10] [c0000000001791b8] worker_thread+0x78/0x520
    [c0000034a08ebda0] [c000000000185090] kthread+0x1a0/0x1b0
    [c0000034a08ebe10] [c00000000000ccec] ret_from_kernel_thread+0x5c/0x70
    Instruction dump:
    7d2903a6 4e800421 e8410018 7f67db78 7fe6fb78 7f45d378 7f84e378 7c681b78
    3c62ff1a 3863c6f8 4802dc35 60000000 <0fe00000> 3920fff4 f9210070 e86100a0
    ---[ end trace 532d9066d3d4d7ec ]---
    
    Some of the per-CPU masks use cpu_cpu_mask as a filter to limit the search
    for related CPUs. On a dlpar add of a CPU, update cpu_cpu_mask before
    updating the per-CPU masks. This will ensure the cpu_cpu_mask is updated
    correctly before its used in setting the masks. Setting the numa_node will
    ensure that when cpu_cpu_mask() gets called, the correct node number is
    used. This code movement helped fix the above call trace.
    
    Reported-by: Geetika Moolchandani <Geetika.Moolchandani1@ibm.com>
    Signed-off-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
    Reviewed-by: Nathan Lynch <nathanl@linux.ibm.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210401154200.150077-1-srikar@linux.vnet.ibm.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
index 6dc43205382b..a9ec4467705c 100644
--- a/arch/powerpc/kernel/smp.c
+++ b/arch/powerpc/kernel/smp.c
@@ -1032,6 +1032,9 @@ void start_secondary(void *unused)
 
 	vdso_getcpu_init();
 #endif
+	set_numa_node(numa_cpu_lookup_table[cpu]);
+	set_numa_mem(local_memory_node(numa_cpu_lookup_table[cpu]));
+
 	/* Update topology CPU masks */
 	add_cpu_to_masks(cpu);
 
@@ -1042,9 +1045,6 @@ void start_secondary(void *unused)
 	if (!cpumask_equal(cpu_l2_cache_mask(cpu), cpu_sibling_mask(cpu)))
 		shared_caches = true;
 
-	set_numa_node(numa_cpu_lookup_table[cpu]);
-	set_numa_mem(local_memory_node(numa_cpu_lookup_table[cpu]));
-
 	smp_wmb();
 	notify_cpu_starting(cpu);
 	set_cpu_online(cpu, true);

commit b51e7468116bdf3c31424bf1623b890300d828a7
Author: Gustavo A. R. Silva <gustavoars@kernel.org>
Date:   Fri Apr 16 14:12:36 2021 -0500

    sctp: Fix out-of-bounds warning in sctp_process_asconf_param()
    
    [ Upstream commit e5272ad4aab347dde5610c0aedb786219e3ff793 ]
    
    Fix the following out-of-bounds warning:
    
    net/sctp/sm_make_chunk.c:3150:4: warning: 'memcpy' offset [17, 28] from the object at 'addr' is out of the bounds of referenced subobject 'v4' with type 'struct sockaddr_in' at offset 0 [-Warray-bounds]
    
    This helps with the ongoing efforts to globally enable -Warray-bounds
    and get us closer to being able to tighten the FORTIFY_SOURCE routines
    on memcpy().
    
    Link: https://github.com/KSPP/linux/issues/109
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
index ce6053be60bc..dc51e14f568e 100644
--- a/net/sctp/sm_make_chunk.c
+++ b/net/sctp/sm_make_chunk.c
@@ -3148,7 +3148,7 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc,
 		 * primary.
 		 */
 		if (af->is_any(&addr))
-			memcpy(&addr.v4, sctp_source(asconf), sizeof(addr));
+			memcpy(&addr, sctp_source(asconf), sizeof(addr));
 
 		if (security_sctp_bind_connect(asoc->ep->base.sk,
 					       SCTP_PARAM_SET_PRIMARY,

commit 4b35fe92556a04b35e3c69342cfdb07022ff9fb9
Author: Mihai Moldovan <ionic@ionic.de>
Date:   Thu Apr 15 09:28:03 2021 +0200

    kconfig: nconf: stop endless search loops
    
    [ Upstream commit 8c94b430b9f6213dec84e309bb480a71778c4213 ]
    
    If the user selects the very first entry in a page and performs a
    search-up operation, or selects the very last entry in a page and
    performs a search-down operation that will not succeed (e.g., via
    [/]asdfzzz[Up Arrow]), nconf will never terminate searching the page.
    
    The reason is that in this case, the starting point will be set to -1
    or n, which is then translated into (n - 1) (i.e., the last entry of
    the page) or 0 (i.e., the first entry of the page) and finally the
    search begins. This continues to work fine until the index reaches 0 or
    (n - 1), at which point it will be decremented to -1 or incremented to
    n, but not checked against the starting point right away. Instead, it's
    wrapped around to the bottom or top again, after which the starting
    point check occurs... and naturally fails.
    
    My original implementation added another check for -1 before wrapping
    the running index variable around, but Masahiro Yamada pointed out that
    the actual issue is that the comparison point (starting point) exceeds
    bounds (i.e., the [0,n-1] interval) in the first place and that,
    instead, the starting point should be fixed.
    
    This has the welcome side-effect of also fixing the case where the
    starting point was n while searching down, which also lead to an
    infinite loop.
    
    OTOH, this code is now essentially all his work.
    
    Amazingly, nobody seems to have been hit by this for 11 years - or at
    the very least nobody bothered to debug and fix this.
    
    Signed-off-by: Mihai Moldovan <ionic@ionic.de>
    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/scripts/kconfig/nconf.c b/scripts/kconfig/nconf.c
index c8ff1c99dd5c..552cf7557c7a 100644
--- a/scripts/kconfig/nconf.c
+++ b/scripts/kconfig/nconf.c
@@ -504,8 +504,8 @@ static int get_mext_match(const char *match_str, match_f flag)
 	else if (flag == FIND_NEXT_MATCH_UP)
 		--match_start;
 
+	match_start = (match_start + items_num) % items_num;
 	index = match_start;
-	index = (index + items_num) % items_num;
 	while (true) {
 		char *str = k_menu_items[index].str;
 		if (strcasestr(str, match_str) != NULL)

commit b9ef1725d5128e2e21f2308e363a238a7af0cb39
Author: Yonghong Song <yhs@fb.com>
Date:   Tue Apr 13 08:34:13 2021 -0700

    selftests: Set CC to clang in lib.mk if LLVM is set
    
    [ Upstream commit 26e6dd1072763cd5696b75994c03982dde952ad9 ]
    
    selftests/bpf/Makefile includes lib.mk. With the following command
      make -j60 LLVM=1 LLVM_IAS=1  <=== compile kernel
      make -j60 -C tools/testing/selftests/bpf LLVM=1 LLVM_IAS=1 V=1
    some files are still compiled with gcc. This patch
    fixed lib.mk issue which sets CC to gcc in all cases.
    
    Signed-off-by: Yonghong Song <yhs@fb.com>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Acked-by: Andrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/bpf/20210413153413.3027426-1-yhs@fb.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/tools/testing/selftests/lib.mk b/tools/testing/selftests/lib.mk
index 0ef203ec59fd..a5d40653a921 100644
--- a/tools/testing/selftests/lib.mk
+++ b/tools/testing/selftests/lib.mk
@@ -1,6 +1,10 @@
 # This mimics the top-level Makefile. We do it explicitly here so that this
 # Makefile can operate with or without the kbuild infrastructure.
+ifneq ($(LLVM),)
+CC := clang
+else
 CC := $(CROSS_COMPILE)gcc
+endif
 
 ifeq (0,$(MAKELEVEL))
 OUTPUT := $(shell pwd)

commit 2bb2ff46d21d6794fd298df177199a2bb3b98434
Author: Miklos Szeredi <mszeredi@redhat.com>
Date:   Wed Apr 14 10:40:58 2021 +0200

    cuse: prevent clone
    
    [ Upstream commit 8217673d07256b22881127bf50dce874d0e51653 ]
    
    For cloned connections cuse_channel_release() will be called more than
    once, resulting in use after free.
    
    Prevent device cloning for CUSE, which does not make sense at this point,
    and highly unlikely to be used in real life.
    
    Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/fuse/cuse.c b/fs/fuse/cuse.c
index f057c213c453..e10e2b62ccf4 100644
--- a/fs/fuse/cuse.c
+++ b/fs/fuse/cuse.c
@@ -621,6 +621,8 @@ static int __init cuse_init(void)
 	cuse_channel_fops.owner		= THIS_MODULE;
 	cuse_channel_fops.open		= cuse_channel_open;
 	cuse_channel_fops.release	= cuse_channel_release;
+	/* CUSE is not prepared for FUSE_DEV_IOC_CLONE */
+	cuse_channel_fops.unlocked_ioctl	= NULL;
 
 	cuse_class = class_create(THIS_MODULE, "cuse");
 	if (IS_ERR(cuse_class))

commit 2a87966bd94114a8f41c5ce344890efaabbc72fd
Author: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Date:   Thu Apr 8 21:50:29 2021 +0200

    pinctrl: samsung: use 'int' for register masks in Exynos
    
    [ Upstream commit fa0c10a5f3a49130dd11281aa27e7e1c8654abc7 ]
    
    The Special Function Registers on all Exynos SoC, including ARM64, are
    32-bit wide, so entire driver uses matching functions like readl() or
    writel().  On 64-bit ARM using unsigned long for register masks:
    1. makes little sense as immediately after bitwise operation it will be
       cast to 32-bit value when calling writel(),
    2. is actually error-prone because it might promote other operands to
       64-bit.
    
    Addresses-Coverity: Unintentional integer overflow
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Reviewed-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
    Link: https://lore.kernel.org/r/20210408195029.69974-1-krzysztof.kozlowski@canonical.com
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.c b/drivers/pinctrl/samsung/pinctrl-exynos.c
index 24956f6c6324..7f764f751c4f 100644
--- a/drivers/pinctrl/samsung/pinctrl-exynos.c
+++ b/drivers/pinctrl/samsung/pinctrl-exynos.c
@@ -55,7 +55,7 @@ static void exynos_irq_mask(struct irq_data *irqd)
 	struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip);
 	struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
 	unsigned long reg_mask = our_chip->eint_mask + bank->eint_offset;
-	unsigned long mask;
+	unsigned int mask;
 	unsigned long flags;
 
 	spin_lock_irqsave(&bank->slock, flags);
@@ -83,7 +83,7 @@ static void exynos_irq_unmask(struct irq_data *irqd)
 	struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip);
 	struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
 	unsigned long reg_mask = our_chip->eint_mask + bank->eint_offset;
-	unsigned long mask;
+	unsigned int mask;
 	unsigned long flags;
 
 	/*
@@ -482,7 +482,7 @@ static void exynos_irq_eint0_15(struct irq_desc *desc)
 	chained_irq_exit(chip, desc);
 }
 
-static inline void exynos_irq_demux_eint(unsigned long pend,
+static inline void exynos_irq_demux_eint(unsigned int pend,
 						struct irq_domain *domain)
 {
 	unsigned int irq;
@@ -499,8 +499,8 @@ static void exynos_irq_demux_eint16_31(struct irq_desc *desc)
 {
 	struct irq_chip *chip = irq_desc_get_chip(desc);
 	struct exynos_muxed_weint_data *eintd = irq_desc_get_handler_data(desc);
-	unsigned long pend;
-	unsigned long mask;
+	unsigned int pend;
+	unsigned int mask;
 	int i;
 
 	chained_irq_enter(chip, desc);

commit 2c926e5ca4b2cd7ba93ea37fa117233be88bb183
Author: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Date:   Thu Apr 8 14:31:25 2021 +0200

    mac80211: clear the beacon's CRC after channel switch
    
    [ Upstream commit d6843d1ee283137723b4a8c76244607ce6db1951 ]
    
    After channel switch, we should consider any beacon with a
    CSA IE as a new switch. If the CSA IE is a leftover from
    before the switch that the AP forgot to remove, we'll get
    a CSA-to-Self.
    
    This caused issues in iwlwifi where the firmware saw a beacon
    with a CSA-to-Self with mode = 1 on the new channel after a
    switch. The firmware considered this a new switch and closed
    its queues. Since the beacon didn't change between before and
    after the switch, we wouldn't handle it (the CRC is the same)
    and we wouldn't let the firmware open its queues again or
    disconnect if the CSA IE stays for too long.
    
    Clear the CRC valid state after we switch to make sure that
    we handle the beacon and handle the CSA IE as required.
    
    Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
    Link: https://lore.kernel.org/r/20210408143124.b9e68aa98304.I465afb55ca2c7d59f7bf610c6046a1fd732b4c28@changeid
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index c53a332f7d65..cbcb60face2c 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -1185,6 +1185,11 @@ static void ieee80211_chswitch_post_beacon(struct ieee80211_sub_if_data *sdata)
 
 	sdata->vif.csa_active = false;
 	ifmgd->csa_waiting_bcn = false;
+	/*
+	 * If the CSA IE is still present on the beacon after the switch,
+	 * we need to consider it as a new CSA (possibly to self).
+	 */
+	ifmgd->beacon_crc_valid = false;
 
 	ret = drv_post_channel_switch(sdata);
 	if (ret) {

commit 9f146c5d36fab8341e61559c57af629906eabc54
Author: Bence Csókás <bence98@sch.bme.hu>
Date:   Wed Mar 31 19:19:20 2021 +0000

    i2c: Add I2C_AQ_NO_REP_START adapter quirk
    
    [ Upstream commit aca01415e076aa96cca0f801f4420ee5c10c660d ]
    
    This quirk signifies that the adapter cannot do a repeated
    START, it always issues a STOP condition after transfers.
    
    Suggested-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Bence Csókás <bence98@sch.bme.hu>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/linux/i2c.h b/include/linux/i2c.h
index 7e748648c7d3..6fda0458745d 100644
--- a/include/linux/i2c.h
+++ b/include/linux/i2c.h
@@ -662,6 +662,8 @@ struct i2c_adapter_quirks {
 #define I2C_AQ_NO_ZERO_LEN_READ		BIT(5)
 #define I2C_AQ_NO_ZERO_LEN_WRITE	BIT(6)
 #define I2C_AQ_NO_ZERO_LEN		(I2C_AQ_NO_ZERO_LEN_READ | I2C_AQ_NO_ZERO_LEN_WRITE)
+/* adapter cannot do repeated START */
+#define I2C_AQ_NO_REP_START		BIT(7)
 
 /*
  * i2c_adapter is the structure used to identify a physical i2c bus along

commit 2394cad24bf89bb454be2973678850781660328e
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Thu Mar 25 23:10:54 2021 +0100

    ASoC: Intel: bytcr_rt5640: Add quirk for the Chuwi Hi8 tablet
    
    [ Upstream commit 875c40eadf6ac6644c0f71842a4f30dd9968d281 ]
    
    The Chuwi Hi8 tablet is using an analog mic on IN1 and has its
    jack-detect connected to JD2_IN4N, instead of using the default
    IN3 for its internal mic and JD1_IN4P for jack-detect.
    
    It also only has 1 speaker.
    
    Add a quirk applying the correct settings for this configuration.
    
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Link: https://lore.kernel.org/r/20210325221054.22714-1-hdegoede@redhat.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c
index 62b4187e9f44..4ebc023f1507 100644
--- a/sound/soc/intel/boards/bytcr_rt5640.c
+++ b/sound/soc/intel/boards/bytcr_rt5640.c
@@ -509,6 +509,23 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
 					BYT_RT5640_SSP0_AIF1 |
 					BYT_RT5640_MCLK_EN),
 	},
+	{
+		/* Chuwi Hi8 (CWI509) */
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "Hampoo"),
+			DMI_MATCH(DMI_BOARD_NAME, "BYT-PA03C"),
+			DMI_MATCH(DMI_SYS_VENDOR, "ilife"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "S806"),
+		},
+		.driver_data = (void *)(BYT_RT5640_IN1_MAP |
+					BYT_RT5640_JD_SRC_JD2_IN4N |
+					BYT_RT5640_OVCD_TH_2000UA |
+					BYT_RT5640_OVCD_SF_0P75 |
+					BYT_RT5640_MONO_SPEAKER |
+					BYT_RT5640_DIFF_MIC |
+					BYT_RT5640_SSP0_AIF1 |
+					BYT_RT5640_MCLK_EN),
+	},
 	{
 		.matches = {
 			DMI_MATCH(DMI_SYS_VENDOR, "Circuitco"),

commit dd591526bca9836b7815710888cfc7685eaf2c76
Author: Eric Dumazet <edumazet@google.com>
Date:   Mon Mar 29 12:12:54 2021 -0700

    ip6_vti: proper dev_{hold|put} in ndo_[un]init methods
    
    [ Upstream commit 40cb881b5aaa0b69a7d93dec8440d5c62dae299f ]
    
    After adopting CONFIG_PCPU_DEV_REFCNT=n option, syzbot was able to trigger
    a warning [1]
    
    Issue here is that:
    
    - all dev_put() should be paired with a corresponding prior dev_hold().
    
    - A driver doing a dev_put() in its ndo_uninit() MUST also
      do a dev_hold() in its ndo_init(), only when ndo_init()
      is returning 0.
    
    Otherwise, register_netdevice() would call ndo_uninit()
    in its error path and release a refcount too soon.
    
    Therefore, we need to move dev_hold() call from
    vti6_tnl_create2() to vti6_dev_init_gen()
    
    [1]
    WARNING: CPU: 0 PID: 15951 at lib/refcount.c:31 refcount_warn_saturate+0xbf/0x1e0 lib/refcount.c:31
    Modules linked in:
    CPU: 0 PID: 15951 Comm: syz-executor.3 Not tainted 5.12.0-rc4-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    RIP: 0010:refcount_warn_saturate+0xbf/0x1e0 lib/refcount.c:31
    Code: 1d 6a 5a e8 09 31 ff 89 de e8 8d 1a ab fd 84 db 75 e0 e8 d4 13 ab fd 48 c7 c7 a0 e1 c1 89 c6 05 4a 5a e8 09 01 e8 2e 36 fb 04 <0f> 0b eb c4 e8 b8 13 ab fd 0f b6 1d 39 5a e8 09 31 ff 89 de e8 58
    RSP: 0018:ffffc90001eaef28 EFLAGS: 00010282
    RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
    RDX: 0000000000040000 RSI: ffffffff815c51f5 RDI: fffff520003d5dd7
    RBP: 0000000000000004 R08: 0000000000000000 R09: 0000000000000000
    R10: ffffffff815bdf8e R11: 0000000000000000 R12: ffff88801bb1c568
    R13: ffff88801f69e800 R14: 00000000ffffffff R15: ffff888050889d40
    FS:  00007fc79314e700(0000) GS:ffff8880b9c00000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007f1c1ff47108 CR3: 0000000020fd5000 CR4: 00000000001506f0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
     __refcount_dec include/linux/refcount.h:344 [inline]
     refcount_dec include/linux/refcount.h:359 [inline]
     dev_put include/linux/netdevice.h:4135 [inline]
     vti6_dev_uninit+0x31a/0x360 net/ipv6/ip6_vti.c:297
     register_netdevice+0xadf/0x1500 net/core/dev.c:10308
     vti6_tnl_create2+0x1b5/0x400 net/ipv6/ip6_vti.c:190
     vti6_newlink+0x9d/0xd0 net/ipv6/ip6_vti.c:1020
     __rtnl_newlink+0x1062/0x1710 net/core/rtnetlink.c:3443
     rtnl_newlink+0x64/0xa0 net/core/rtnetlink.c:3491
     rtnetlink_rcv_msg+0x44e/0xad0 net/core/rtnetlink.c:5553
     netlink_rcv_skb+0x153/0x420 net/netlink/af_netlink.c:2502
     netlink_unicast_kernel net/netlink/af_netlink.c:1312 [inline]
     netlink_unicast+0x533/0x7d0 net/netlink/af_netlink.c:1338
     netlink_sendmsg+0x856/0xd90 net/netlink/af_netlink.c:1927
     sock_sendmsg_nosec net/socket.c:654 [inline]
     sock_sendmsg+0xcf/0x120 net/socket.c:674
     ____sys_sendmsg+0x331/0x810 net/socket.c:2350
     ___sys_sendmsg+0xf3/0x170 net/socket.c:2404
     __sys_sendmmsg+0x195/0x470 net/socket.c:2490
     __do_sys_sendmmsg net/socket.c:2519 [inline]
     __se_sys_sendmmsg net/socket.c:2516 [inline]
     __x64_sys_sendmmsg+0x99/0x100 net/socket.c:2516
    
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c
index 94f16e82a458..defa04b38ee8 100644
--- a/net/ipv6/ip6_vti.c
+++ b/net/ipv6/ip6_vti.c
@@ -196,7 +196,6 @@ static int vti6_tnl_create2(struct net_device *dev)
 
 	strcpy(t->parms.name, dev->name);
 
-	dev_hold(dev);
 	vti6_tnl_link(ip6n, t);
 
 	return 0;
@@ -925,6 +924,7 @@ static inline int vti6_dev_init_gen(struct net_device *dev)
 	dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
 	if (!dev->tstats)
 		return -ENOMEM;
+	dev_hold(dev);
 	return 0;
 }
 

commit 742572a5f658b367eadd604d446284b4ea2b17b8
Author: Archie Pusaka <apusaka@chromium.org>
Date:   Tue Mar 23 16:32:20 2021 +0800

    Bluetooth: check for zapped sk before connecting
    
    [ Upstream commit 3af70b39fa2d415dc86c370e5b24ddb9fdacbd6f ]
    
    There is a possibility of receiving a zapped sock on
    l2cap_sock_connect(). This could lead to interesting crashes, one
    such case is tearing down an already tore l2cap_sock as is happened
    with this call trace:
    
    __dump_stack lib/dump_stack.c:15 [inline]
    dump_stack+0xc4/0x118 lib/dump_stack.c:56
    register_lock_class kernel/locking/lockdep.c:792 [inline]
    register_lock_class+0x239/0x6f6 kernel/locking/lockdep.c:742
    __lock_acquire+0x209/0x1e27 kernel/locking/lockdep.c:3105
    lock_acquire+0x29c/0x2fb kernel/locking/lockdep.c:3599
    __raw_spin_lock_bh include/linux/spinlock_api_smp.h:137 [inline]
    _raw_spin_lock_bh+0x38/0x47 kernel/locking/spinlock.c:175
    spin_lock_bh include/linux/spinlock.h:307 [inline]
    lock_sock_nested+0x44/0xfa net/core/sock.c:2518
    l2cap_sock_teardown_cb+0x88/0x2fb net/bluetooth/l2cap_sock.c:1345
    l2cap_chan_del+0xa3/0x383 net/bluetooth/l2cap_core.c:598
    l2cap_chan_close+0x537/0x5dd net/bluetooth/l2cap_core.c:756
    l2cap_chan_timeout+0x104/0x17e net/bluetooth/l2cap_core.c:429
    process_one_work+0x7e3/0xcb0 kernel/workqueue.c:2064
    worker_thread+0x5a5/0x773 kernel/workqueue.c:2196
    kthread+0x291/0x2a6 kernel/kthread.c:211
    ret_from_fork+0x4e/0x80 arch/x86/entry/entry_64.S:604
    
    Signed-off-by: Archie Pusaka <apusaka@chromium.org>
    Reported-by: syzbot+abfc0f5e668d4099af73@syzkaller.appspotmail.com
    Reviewed-by: Alain Michaud <alainm@chromium.org>
    Reviewed-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org>
    Reviewed-by: Guenter Roeck <groeck@chromium.org>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
index 198a1fdd6709..967a9bb14415 100644
--- a/net/bluetooth/l2cap_sock.c
+++ b/net/bluetooth/l2cap_sock.c
@@ -179,9 +179,17 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr,
 	struct l2cap_chan *chan = l2cap_pi(sk)->chan;
 	struct sockaddr_l2 la;
 	int len, err = 0;
+	bool zapped;
 
 	BT_DBG("sk %p", sk);
 
+	lock_sock(sk);
+	zapped = sock_flag(sk, SOCK_ZAPPED);
+	release_sock(sk);
+
+	if (zapped)
+		return -EINVAL;
+
 	if (!addr || alen < offsetofend(struct sockaddr, sa_family) ||
 	    addr->sa_family != AF_BLUETOOTH)
 		return -EINVAL;

commit e9e5f344007784f4dfdf74287a57463af216bbea
Author: Nikolay Aleksandrov <nikolay@nvidia.com>
Date:   Mon Mar 22 17:45:27 2021 +0200

    net: bridge: when suppression is enabled exclude RARP packets
    
    [ Upstream commit 0353b4a96b7a9f60fe20d1b3ebd4931a4085f91c ]
    
    Recently we had an interop issue where RARP packets got suppressed with
    bridge neigh suppression enabled, but the check in the code was meant to
    suppress GARP. Exclude RARP packets from it which would allow some VMWare
    setups to work, to quote the report:
    "Those RARP packets usually get generated by vMware to notify physical
    switches when vMotion occurs. vMware may use random sip/tip or just use
    sip=tip=0. So the RARP packet sometimes get properly flooded by the vtep
    and other times get dropped by the logic"
    
    Reported-by: Amer Abdalamer <amer@nvidia.com>
    Signed-off-by: Nikolay Aleksandrov <nikolay@nvidia.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bridge/br_arp_nd_proxy.c b/net/bridge/br_arp_nd_proxy.c
index eb44ae05abaa..b52e70362268 100644
--- a/net/bridge/br_arp_nd_proxy.c
+++ b/net/bridge/br_arp_nd_proxy.c
@@ -158,7 +158,9 @@ void br_do_proxy_suppress_arp(struct sk_buff *skb, struct net_bridge *br,
 	if (br->neigh_suppress_enabled) {
 		if (p && (p->flags & BR_NEIGH_SUPPRESS))
 			return;
-		if (ipv4_is_zeronet(sip) || sip == tip) {
+		if (parp->ar_op != htons(ARPOP_RREQUEST) &&
+		    parp->ar_op != htons(ARPOP_RREPLY) &&
+		    (ipv4_is_zeronet(sip) || sip == tip)) {
 			/* prevent flooding to neigh suppress ports */
 			BR_INPUT_SKB_CB(skb)->proxyarp_replied = true;
 			return;

commit 3d638a0fff1a5ee15bbc20ffee0cddb652f35574
Author: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Date:   Mon Mar 22 07:52:07 2021 +0900

    Bluetooth: initialize skb_queue_head at l2cap_chan_create()
    
    [ Upstream commit be8597239379f0f53c9710dd6ab551bbf535bec6 ]
    
    syzbot is hitting "INFO: trying to register non-static key." message [1],
    for "struct l2cap_chan"->tx_q.lock spinlock is not yet initialized when
    l2cap_chan_del() is called due to e.g. timeout.
    
    Since "struct l2cap_chan"->lock mutex is initialized at l2cap_chan_create()
    immediately after "struct l2cap_chan" is allocated using kzalloc(), let's
    as well initialize "struct l2cap_chan"->{tx_q,srej_q}.lock spinlocks there.
    
    [1] https://syzkaller.appspot.com/bug?extid=fadfba6a911f6bf71842
    
    Reported-and-tested-by: syzbot <syzbot+fadfba6a911f6bf71842@syzkaller.appspotmail.com>
    Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 30373d00ab04..c0d64b4144d4 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -445,6 +445,8 @@ struct l2cap_chan *l2cap_chan_create(void)
 	if (!chan)
 		return NULL;
 
+	skb_queue_head_init(&chan->tx_q);
+	skb_queue_head_init(&chan->srej_q);
 	mutex_init(&chan->lock);
 
 	/* Set default lock nesting level */

commit 02f681a5e827f34dc165e1afd341a5897bc535fe
Author: Archie Pusaka <apusaka@chromium.org>
Date:   Mon Mar 22 14:02:15 2021 +0800

    Bluetooth: Set CONF_NOT_COMPLETE as l2cap_chan default
    
    [ Upstream commit 3a9d54b1947ecea8eea9a902c0b7eb58a98add8a ]
    
    Currently l2cap_chan_set_defaults() reset chan->conf_state to zero.
    However, there is a flag CONF_NOT_COMPLETE which is set when
    creating the l2cap_chan. It is suggested that the flag should be
    cleared when l2cap_chan is ready, but when l2cap_chan_set_defaults()
    is called, l2cap_chan is not yet ready. Therefore, we must set this
    flag as the default.
    
    Example crash call trace:
    __dump_stack lib/dump_stack.c:15 [inline]
    dump_stack+0xc4/0x118 lib/dump_stack.c:56
    panic+0x1c6/0x38b kernel/panic.c:117
    __warn+0x170/0x1b9 kernel/panic.c:471
    warn_slowpath_fmt+0xc7/0xf8 kernel/panic.c:494
    debug_print_object+0x175/0x193 lib/debugobjects.c:260
    debug_object_assert_init+0x171/0x1bf lib/debugobjects.c:614
    debug_timer_assert_init kernel/time/timer.c:629 [inline]
    debug_assert_init kernel/time/timer.c:677 [inline]
    del_timer+0x7c/0x179 kernel/time/timer.c:1034
    try_to_grab_pending+0x81/0x2e5 kernel/workqueue.c:1230
    cancel_delayed_work+0x7c/0x1c4 kernel/workqueue.c:2929
    l2cap_clear_timer+0x1e/0x41 include/net/bluetooth/l2cap.h:834
    l2cap_chan_del+0x2d8/0x37e net/bluetooth/l2cap_core.c:640
    l2cap_chan_close+0x532/0x5d8 net/bluetooth/l2cap_core.c:756
    l2cap_sock_shutdown+0x806/0x969 net/bluetooth/l2cap_sock.c:1174
    l2cap_sock_release+0x64/0x14d net/bluetooth/l2cap_sock.c:1217
    __sock_release+0xda/0x217 net/socket.c:580
    sock_close+0x1b/0x1f net/socket.c:1039
    __fput+0x322/0x55c fs/file_table.c:208
    ____fput+0x17/0x19 fs/file_table.c:244
    task_work_run+0x19b/0x1d3 kernel/task_work.c:115
    exit_task_work include/linux/task_work.h:21 [inline]
    do_exit+0xe4c/0x204a kernel/exit.c:766
    do_group_exit+0x291/0x291 kernel/exit.c:891
    get_signal+0x749/0x1093 kernel/signal.c:2396
    do_signal+0xa5/0xcdb arch/x86/kernel/signal.c:737
    exit_to_usermode_loop arch/x86/entry/common.c:243 [inline]
    prepare_exit_to_usermode+0xed/0x235 arch/x86/entry/common.c:277
    syscall_return_slowpath+0x3a7/0x3b3 arch/x86/entry/common.c:348
    int_ret_from_sys_call+0x25/0xa3
    
    Signed-off-by: Archie Pusaka <apusaka@chromium.org>
    Reported-by: syzbot+338f014a98367a08a114@syzkaller.appspotmail.com
    Reviewed-by: Alain Michaud <alainm@chromium.org>
    Reviewed-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org>
    Reviewed-by: Guenter Roeck <groeck@chromium.org>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index f1ff83321023..30373d00ab04 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -510,7 +510,9 @@ void l2cap_chan_set_defaults(struct l2cap_chan *chan)
 	chan->flush_to = L2CAP_DEFAULT_FLUSH_TO;
 	chan->retrans_timeout = L2CAP_DEFAULT_RETRANS_TO;
 	chan->monitor_timeout = L2CAP_DEFAULT_MONITOR_TO;
+
 	chan->conf_state = 0;
+	set_bit(CONF_NOT_COMPLETE, &chan->conf_state);
 
 	set_bit(FLAG_FORCE_ACTIVE, &chan->flags);
 }

commit 40655c682fe2caf1c9eb57b31fff70f0f7c890a5
Author: Tong Zhang <ztong0001@gmail.com>
Date:   Sun Mar 21 11:38:40 2021 -0400

    ALSA: rme9652: don't disable if not enabled
    
    [ Upstream commit f57a741874bb6995089020e97a1dcdf9b165dcbe ]
    
    rme9652 wants to disable a not enabled pci device, which makes kernel
    throw a warning. Make sure the device is enabled before calling disable.
    
    [    1.751595] snd_rme9652 0000:00:03.0: disabling already-disabled device
    [    1.751605] WARNING: CPU: 0 PID: 174 at drivers/pci/pci.c:2146 pci_disable_device+0x91/0xb0
    [    1.759968] Call Trace:
    [    1.760145]  snd_rme9652_card_free+0x76/0xa0 [snd_rme9652]
    [    1.760434]  release_card_device+0x4b/0x80 [snd]
    [    1.760679]  device_release+0x3b/0xa0
    [    1.760874]  kobject_put+0x94/0x1b0
    [    1.761059]  put_device+0x13/0x20
    [    1.761235]  snd_card_free+0x61/0x90 [snd]
    [    1.761454]  snd_rme9652_probe+0x3be/0x700 [snd_rme9652]
    
    Suggested-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Tong Zhang <ztong0001@gmail.com>
    Link: https://lore.kernel.org/r/20210321153840.378226-4-ztong0001@gmail.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/pci/rme9652/rme9652.c b/sound/pci/rme9652/rme9652.c
index edd765e22377..f82fa5be7d33 100644
--- a/sound/pci/rme9652/rme9652.c
+++ b/sound/pci/rme9652/rme9652.c
@@ -1761,7 +1761,8 @@ static int snd_rme9652_free(struct snd_rme9652 *rme9652)
 	if (rme9652->port)
 		pci_release_regions(rme9652->pci);
 
-	pci_disable_device(rme9652->pci);
+	if (pci_is_enabled(rme9652->pci))
+		pci_disable_device(rme9652->pci);
 	return 0;
 }
 

commit b8b883ffe4cea5095e3e98a4f236a851874d2368
Author: Tong Zhang <ztong0001@gmail.com>
Date:   Sun Mar 21 11:38:39 2021 -0400

    ALSA: hdspm: don't disable if not enabled
    
    [ Upstream commit 790f5719b85e12e10c41753b864e74249585ed08 ]
    
    hdspm wants to disable a not enabled pci device, which makes kernel
    throw a warning. Make sure the device is enabled before calling disable.
    
    [    1.786391] snd_hdspm 0000:00:03.0: disabling already-disabled device
    [    1.786400] WARNING: CPU: 0 PID: 182 at drivers/pci/pci.c:2146 pci_disable_device+0x91/0xb0
    [    1.795181] Call Trace:
    [    1.795320]  snd_hdspm_card_free+0x58/0xa0 [snd_hdspm]
    [    1.795595]  release_card_device+0x4b/0x80 [snd]
    [    1.795860]  device_release+0x3b/0xa0
    [    1.796072]  kobject_put+0x94/0x1b0
    [    1.796260]  put_device+0x13/0x20
    [    1.796438]  snd_card_free+0x61/0x90 [snd]
    [    1.796659]  snd_hdspm_probe+0x97b/0x1440 [snd_hdspm]
    
    Suggested-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Tong Zhang <ztong0001@gmail.com>
    Link: https://lore.kernel.org/r/20210321153840.378226-3-ztong0001@gmail.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/pci/rme9652/hdspm.c b/sound/pci/rme9652/hdspm.c
index 11b5b5e0e058..5dfddade1bae 100644
--- a/sound/pci/rme9652/hdspm.c
+++ b/sound/pci/rme9652/hdspm.c
@@ -6913,7 +6913,8 @@ static int snd_hdspm_free(struct hdspm * hdspm)
 	if (hdspm->port)
 		pci_release_regions(hdspm->pci);
 
-	pci_disable_device(hdspm->pci);
+	if (pci_is_enabled(hdspm->pci))
+		pci_disable_device(hdspm->pci);
 	return 0;
 }
 

commit 7a72863d3c913e60a56a22448309226638cad606
Author: Tong Zhang <ztong0001@gmail.com>
Date:   Sun Mar 21 11:38:38 2021 -0400

    ALSA: hdsp: don't disable if not enabled
    
    [ Upstream commit 507cdb9adba006a7798c358456426e1aea3d9c4f ]
    
    hdsp wants to disable a not enabled pci device, which makes kernel
    throw a warning. Make sure the device is enabled before calling disable.
    
    [    1.758292] snd_hdsp 0000:00:03.0: disabling already-disabled device
    [    1.758327] WARNING: CPU: 0 PID: 180 at drivers/pci/pci.c:2146 pci_disable_device+0x91/0xb0
    [    1.766985] Call Trace:
    [    1.767121]  snd_hdsp_card_free+0x94/0xf0 [snd_hdsp]
    [    1.767388]  release_card_device+0x4b/0x80 [snd]
    [    1.767639]  device_release+0x3b/0xa0
    [    1.767838]  kobject_put+0x94/0x1b0
    [    1.768027]  put_device+0x13/0x20
    [    1.768207]  snd_card_free+0x61/0x90 [snd]
    [    1.768430]  snd_hdsp_probe+0x524/0x5e0 [snd_hdsp]
    
    Suggested-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Tong Zhang <ztong0001@gmail.com>
    Link: https://lore.kernel.org/r/20210321153840.378226-2-ztong0001@gmail.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c
index ba99ff0e93e0..a0797fc17d95 100644
--- a/sound/pci/rme9652/hdsp.c
+++ b/sound/pci/rme9652/hdsp.c
@@ -5343,7 +5343,8 @@ static int snd_hdsp_free(struct hdsp *hdsp)
 	if (hdsp->port)
 		pci_release_regions(hdsp->pci);
 
-	pci_disable_device(hdsp->pci);
+	if (pci_is_enabled(hdsp->pci))
+		pci_disable_device(hdsp->pci);
 	return 0;
 }
 

commit e3792886dc2eef6dc0d23b6167c9d9af70d8ea85
Author: Wolfram Sang <wsa+renesas@sang-engineering.com>
Date:   Fri Mar 12 12:57:34 2021 +0100

    i2c: bail out early when RDWR parameters are wrong
    
    [ Upstream commit 71581562ee36032d2d574a9b23ad4af6d6a64cf7 ]
    
    The buggy parameters currently get caught later, but emit a noisy WARN.
    Userspace should not be able to trigger this, so add similar checks much
    earlier. Also avoids some unneeded code paths, of course. Apply kernel
    coding stlye to a comment while here.
    
    Reported-by: syzbot+ffb0b3ffa6cfbc7d7b3f@syzkaller.appspotmail.com
    Tested-by: syzbot+ffb0b3ffa6cfbc7d7b3f@syzkaller.appspotmail.com
    Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c
index cbda91a0cb5f..1d10ee86299d 100644
--- a/drivers/i2c/i2c-dev.c
+++ b/drivers/i2c/i2c-dev.c
@@ -448,8 +448,13 @@ static long i2cdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 				   sizeof(rdwr_arg)))
 			return -EFAULT;
 
-		/* Put an arbitrary limit on the number of messages that can
-		 * be sent at once */
+		if (!rdwr_arg.msgs || rdwr_arg.nmsgs == 0)
+			return -EINVAL;
+
+		/*
+		 * Put an arbitrary limit on the number of messages that can
+		 * be sent at once
+		 */
 		if (rdwr_arg.nmsgs > I2C_RDWR_IOCTL_MAX_MSGS)
 			return -EINVAL;
 

commit 9bb628ef37f817c8ec1db1b6844d9b2a0cab4f73
Author: Jonathan McDowell <noodles@earth.li>
Date:   Sat Mar 13 13:18:26 2021 +0000

    net: stmmac: Set FIFO sizes for ipq806x
    
    [ Upstream commit e127906b68b49ddb3ecba39ffa36a329c48197d3 ]
    
    Commit eaf4fac47807 ("net: stmmac: Do not accept invalid MTU values")
    started using the TX FIFO size to verify what counts as a valid MTU
    request for the stmmac driver.  This is unset for the ipq806x variant.
    Looking at older patches for this it seems the RX + TXs buffers can be
    up to 8k, so set appropriately.
    
    (I sent this as an RFC patch in June last year, but received no replies.
    I've been running with this on my hardware (a MikroTik RB3011) since
    then with larger MTUs to support both the internal qca8k switch and
    VLANs with no problems. Without the patch it's impossible to set the
    larger MTU required to support this.)
    
    Signed-off-by: Jonathan McDowell <noodles@earth.li>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c
index 826626e870d5..0f56f8e33691 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c
@@ -351,6 +351,8 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)
 	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)

commit a2db2877255f8ae34f892e102c53e5b2a7990752
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Fri Mar 12 12:48:50 2021 +0100

    ASoC: Intel: bytcr_rt5640: Enable jack-detect support on Asus T100TAF
    
    [ Upstream commit b7c7203a1f751348f35fc4bcb157572d303f7573 ]
    
    The Asus T100TAF uses the same jack-detect settings as the T100TA,
    this has been confirmed on actual hardware.
    
    Add these settings to the T100TAF quirks to enable jack-detect support
    on the T100TAF.
    
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Acked-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Link: https://lore.kernel.org/r/20210312114850.13832-1-hdegoede@redhat.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c
index d63d99776384..62b4187e9f44 100644
--- a/sound/soc/intel/boards/bytcr_rt5640.c
+++ b/sound/soc/intel/boards/bytcr_rt5640.c
@@ -473,6 +473,9 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
 			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T100TAF"),
 		},
 		.driver_data = (void *)(BYT_RT5640_IN1_MAP |
+					BYT_RT5640_JD_SRC_JD2_IN4N |
+					BYT_RT5640_OVCD_TH_2000UA |
+					BYT_RT5640_OVCD_SF_0P75 |
 					BYT_RT5640_MONO_SPEAKER |
 					BYT_RT5640_DIFF_MIC |
 					BYT_RT5640_SSP0_AIF2 |

commit cd80b4b7fdd155fddca31d0d82d8997b4f576ccb
Author: Hoang Le <hoang.h.le@dektech.com.au>
Date:   Thu Mar 11 10:33:22 2021 +0700

    tipc: convert dest node's address to network order
    
    [ Upstream commit 1980d37565061ab44bdc2f9e4da477d3b9752e81 ]
    
    (struct tipc_link_info)->dest is in network order (__be32), so we must
    convert the value to network order before assigning. The problem detected
    by sparse:
    
    net/tipc/netlink_compat.c:699:24: warning: incorrect type in assignment (different base types)
    net/tipc/netlink_compat.c:699:24:    expected restricted __be32 [usertype] dest
    net/tipc/netlink_compat.c:699:24:    got int
    
    Acked-by: Jon Maloy <jmaloy@redhat.com>
    Signed-off-by: Hoang Le <hoang.h.le@dektech.com.au>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/tipc/netlink_compat.c b/net/tipc/netlink_compat.c
index f8e111218a0e..5086e27d3011 100644
--- a/net/tipc/netlink_compat.c
+++ b/net/tipc/netlink_compat.c
@@ -671,7 +671,7 @@ static int tipc_nl_compat_link_dump(struct tipc_nl_compat_msg *msg,
 	if (err)
 		return err;
 
-	link_info.dest = nla_get_flag(link[TIPC_NLA_LINK_DEST]);
+	link_info.dest = htonl(nla_get_flag(link[TIPC_NLA_LINK_DEST]));
 	link_info.up = htonl(nla_get_flag(link[TIPC_NLA_LINK_UP]));
 	nla_strlcpy(link_info.str, link[TIPC_NLA_LINK_NAME],
 		    TIPC_MAX_LINK_NAME);

commit 2efaecaf9603bed6999bac0869dd2ae7edf828ba
Author: Alexander Aring <aahringo@redhat.com>
Date:   Mon Mar 1 17:05:08 2021 -0500

    fs: dlm: fix debugfs dump
    
    [ Upstream commit 92c48950b43f4a767388cf87709d8687151a641f ]
    
    This patch fixes the following message which randomly pops up during
    glocktop call:
    
    seq_file: buggy .next function table_seq_next did not update position index
    
    The issue is that seq_read_iter() in fs/seq_file.c also needs an
    increment of the index in an non next record case as well which this
    patch fixes otherwise seq_read_iter() will print out the above message.
    
    Signed-off-by: Alexander Aring <aahringo@redhat.com>
    Signed-off-by: David Teigland <teigland@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/dlm/debug_fs.c b/fs/dlm/debug_fs.c
index fa08448e35dd..bb87dad03cd4 100644
--- a/fs/dlm/debug_fs.c
+++ b/fs/dlm/debug_fs.c
@@ -544,6 +544,7 @@ static void *table_seq_next(struct seq_file *seq, void *iter_ptr, loff_t *pos)
 
 		if (bucket >= ls->ls_rsbtbl_size) {
 			kfree(ri);
+			++*pos;
 			return NULL;
 		}
 		tree = toss ? &ls->ls_rsbtbl[bucket].toss : &ls->ls_rsbtbl[bucket].keep;

commit f9361d826c874142b3a1a5f1e8366d3d046ce89c
Author: Zhen Lei <thunder.leizhen@huawei.com>
Date:   Wed May 12 21:39:26 2021 +0800

    tpm: fix error return code in tpm2_get_cc_attrs_tbl()
    
    commit 1df83992d977355177810c2b711afc30546c81ce upstream.
    
    If the total number of commands queried through TPM2_CAP_COMMANDS is
    different from that queried through TPM2_CC_GET_CAPABILITY, it indicates
    an unknown error. In this case, an appropriate error code -EFAULT should
    be returned. However, we currently do not explicitly assign this error
    code to 'rc'. As a result, 0 was incorrectly returned.
    
    Cc: stable@vger.kernel.org
    Fixes: 58472f5cd4f6("tpm: validate TPM 2.0 commands")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
    Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c
index ef381caf5f43..e71c6b24aed1 100644
--- a/drivers/char/tpm/tpm2-cmd.c
+++ b/drivers/char/tpm/tpm2-cmd.c
@@ -960,6 +960,7 @@ static int tpm2_get_cc_attrs_tbl(struct tpm_chip *chip)
 
 	if (nr_commands !=
 	    be32_to_cpup((__be32 *)&buf.data[TPM_HEADER_SIZE + 5])) {
+		rc = -EFAULT;
 		tpm_buf_destroy(&buf);
 		goto out;
 	}

commit e175080d34dd7ccfc7b99c77a7a49147f6443ee0
Author: Quentin Perret <qperret@google.com>
Date:   Wed May 12 12:30:11 2021 +0000

    Revert "fdt: Properly handle "no-map" field in the memory region"
    
    This reverts commit 03972d6b1bbac1620455589e0367f6f69ff7b2df.
    It is not really a fix, and the backport misses dependencies, which
    breaks existing platforms.
    
    Reported-by: Alexandre TORGUE <alexandre.torgue@foss.st.com>
    Signed-off-by: Quentin Perret <qperret@google.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index aa15e5d183c1..800ad252cf9c 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -1173,7 +1173,7 @@ int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base,
 					phys_addr_t size, bool nomap)
 {
 	if (nomap)
-		return memblock_mark_nomap(base, size);
+		return memblock_remove(base, size);
 	return memblock_reserve(base, size);
 }
 

commit d34eed2fb86b94757cdf26d6b0e31fa64a987f47
Author: Quentin Perret <qperret@google.com>
Date:   Wed May 12 12:30:10 2021 +0000

    Revert "of/fdt: Make sure no-map does not remove already reserved regions"
    
    This reverts commit 74f2678aab60c9915daa83e6e23d31a896932d9d.
    It is not really a fix, and the backport misses dependencies, which
    breaks existing platforms.
    
    Reported-by: Alexandre TORGUE <alexandre.torgue@foss.st.com>
    Signed-off-by: Quentin Perret <qperret@google.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index 21160a08ead4..aa15e5d183c1 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -1172,16 +1172,8 @@ int __init __weak early_init_dt_mark_hotplug_memory_arch(u64 base, u64 size)
 int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base,
 					phys_addr_t size, bool nomap)
 {
-	if (nomap) {
-		/*
-		 * If the memory is already reserved (by another region), we
-		 * should not allow it to be marked nomap.
-		 */
-		if (memblock_is_region_reserved(base, size))
-			return -EBUSY;
-
+	if (nomap)
 		return memblock_mark_nomap(base, size);
-	}
 	return memblock_reserve(base, size);
 }
 

commit 59339c866e0428fb92bfb3f5290c49a5325d2494
Author: Xin Long <lucien.xin@gmail.com>
Date:   Mon May 3 05:11:42 2021 +0800

    sctp: delay auto_asconf init until binding the first addr
    
    commit 34e5b01186858b36c4d7c87e1a025071e8e2401f upstream.
    
    As Or Cohen described:
    
      If sctp_destroy_sock is called without sock_net(sk)->sctp.addr_wq_lock
      held and sp->do_auto_asconf is true, then an element is removed
      from the auto_asconf_splist without any proper locking.
    
      This can happen in the following functions:
      1. In sctp_accept, if sctp_sock_migrate fails.
      2. In inet_create or inet6_create, if there is a bpf program
         attached to BPF_CGROUP_INET_SOCK_CREATE which denies
         creation of the sctp socket.
    
    This patch is to fix it by moving the auto_asconf init out of
    sctp_init_sock(), by which inet_create()/inet6_create() won't
    need to operate it in sctp_destroy_sock() when calling
    sk_common_release().
    
    It also makes more sense to do auto_asconf init while binding the
    first addr, as auto_asconf actually requires an ANY addr bind,
    see it in sctp_addr_wq_timeout_handler().
    
    This addresses CVE-2021-23133.
    
    Fixes: 610236587600 ("bpf: Add new cgroup attach type to enable sock modifications")
    Reported-by: Or Cohen <orcohen@paloaltonetworks.com>
    Signed-off-by: Xin Long <lucien.xin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 4a2873f70b37..1148f6691707 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -375,6 +375,18 @@ static struct sctp_af *sctp_sockaddr_af(struct sctp_sock *opt,
 	return af;
 }
 
+static void sctp_auto_asconf_init(struct sctp_sock *sp)
+{
+	struct net *net = sock_net(&sp->inet.sk);
+
+	if (net->sctp.default_auto_asconf) {
+		spin_lock(&net->sctp.addr_wq_lock);
+		list_add_tail(&sp->auto_asconf_list, &net->sctp.auto_asconf_splist);
+		spin_unlock(&net->sctp.addr_wq_lock);
+		sp->do_auto_asconf = 1;
+	}
+}
+
 /* Bind a local address either to an endpoint or to an association.  */
 static int sctp_do_bind(struct sock *sk, union sctp_addr *addr, int len)
 {
@@ -437,8 +449,10 @@ static int sctp_do_bind(struct sock *sk, union sctp_addr *addr, int len)
 	}
 
 	/* Refresh ephemeral port.  */
-	if (!bp->port)
+	if (!bp->port) {
 		bp->port = inet_sk(sk)->inet_num;
+		sctp_auto_asconf_init(sp);
+	}
 
 	/* Add the address to the bind address list.
 	 * Use GFP_ATOMIC since BHs will be disabled.
@@ -4776,19 +4790,6 @@ static int sctp_init_sock(struct sock *sk)
 	sk_sockets_allocated_inc(sk);
 	sock_prot_inuse_add(net, sk->sk_prot, 1);
 
-	/* Nothing can fail after this block, otherwise
-	 * sctp_destroy_sock() will be called without addr_wq_lock held
-	 */
-	if (net->sctp.default_auto_asconf) {
-		spin_lock(&sock_net(sk)->sctp.addr_wq_lock);
-		list_add_tail(&sp->auto_asconf_list,
-		    &net->sctp.auto_asconf_splist);
-		sp->do_auto_asconf = 1;
-		spin_unlock(&sock_net(sk)->sctp.addr_wq_lock);
-	} else {
-		sp->do_auto_asconf = 0;
-	}
-
 	local_bh_enable();
 
 	return 0;
@@ -8848,6 +8849,8 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
 	sctp_bind_addr_dup(&newsp->ep->base.bind_addr,
 				&oldsp->ep->base.bind_addr, GFP_KERNEL);
 
+	sctp_auto_asconf_init(newsp);
+
 	/* Move any messages in the old socket's receive queue that are for the
 	 * peeled off association to the new socket's receive queue.
 	 */

commit c61ecd2e8e70ebdb03ee6b54a261d907f1664b43
Author: Xin Long <lucien.xin@gmail.com>
Date:   Mon May 3 05:11:41 2021 +0800

    Revert "net/sctp: fix race condition in sctp_destroy_sock"
    
    commit 01bfe5e8e428b475982a98a46cca5755726f3f7f upstream.
    
    This reverts commit b166a20b07382b8bc1dcee2a448715c9c2c81b5b.
    
    This one has to be reverted as it introduced a dead lock, as
    syzbot reported:
    
           CPU0                    CPU1
           ----                    ----
      lock(&net->sctp.addr_wq_lock);
                                   lock(slock-AF_INET6);
                                   lock(&net->sctp.addr_wq_lock);
      lock(slock-AF_INET6);
    
    CPU0 is the thread of sctp_addr_wq_timeout_handler(), and CPU1
    is that of sctp_close().
    
    The original issue this commit fixed will be fixed in the next
    patch.
    
    Reported-by: syzbot+959223586843e69a2674@syzkaller.appspotmail.com
    Signed-off-by: Xin Long <lucien.xin@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 656bd1532883..4a2873f70b37 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -1569,9 +1569,11 @@ static void sctp_close(struct sock *sk, long timeout)
 
 	/* Supposedly, no process has access to the socket, but
 	 * the net layers still may.
+	 * Also, sctp_destroy_sock() needs to be called with addr_wq_lock
+	 * held and that should be grabbed before socket lock.
 	 */
-	local_bh_disable();
-	bh_lock_sock(sk);
+	spin_lock_bh(&net->sctp.addr_wq_lock);
+	bh_lock_sock_nested(sk);
 
 	/* Hold the sock, since sk_common_release() will put sock_put()
 	 * and we have just a little more cleanup.
@@ -1580,7 +1582,7 @@ static void sctp_close(struct sock *sk, long timeout)
 	sk_common_release(sk);
 
 	bh_unlock_sock(sk);
-	local_bh_enable();
+	spin_unlock_bh(&net->sctp.addr_wq_lock);
 
 	sock_put(sk);
 
@@ -4774,6 +4776,9 @@ static int sctp_init_sock(struct sock *sk)
 	sk_sockets_allocated_inc(sk);
 	sock_prot_inuse_add(net, sk->sk_prot, 1);
 
+	/* Nothing can fail after this block, otherwise
+	 * sctp_destroy_sock() will be called without addr_wq_lock held
+	 */
 	if (net->sctp.default_auto_asconf) {
 		spin_lock(&sock_net(sk)->sctp.addr_wq_lock);
 		list_add_tail(&sp->auto_asconf_list,
@@ -4808,9 +4813,7 @@ static void sctp_destroy_sock(struct sock *sk)
 
 	if (sp->do_auto_asconf) {
 		sp->do_auto_asconf = 0;
-		spin_lock_bh(&sock_net(sk)->sctp.addr_wq_lock);
 		list_del(&sp->auto_asconf_list);
-		spin_unlock_bh(&sock_net(sk)->sctp.addr_wq_lock);
 	}
 	sctp_endpoint_free(sp->ep);
 	local_bh_disable();

commit db0517ac659e0ac61b916cffc29564cf3ab58b0d
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Wed May 5 23:12:42 2021 +0200

    smp: Fix smp_call_function_single_async prototype
    
    commit 1139aeb1c521eb4a050920ce6c64c36c4f2a3ab7 upstream.
    
    As of commit 966a967116e6 ("smp: Avoid using two cache lines for struct
    call_single_data"), the smp code prefers 32-byte aligned call_single_data
    objects for performance reasons, but the block layer includes an instance
    of this structure in the main 'struct request' that is more senstive
    to size than to performance here, see 4ccafe032005 ("block: unalign
    call_single_data in struct request").
    
    The result is a violation of the calling conventions that clang correctly
    points out:
    
    block/blk-mq.c:630:39: warning: passing 8-byte aligned argument to 32-byte aligned parameter 2 of 'smp_call_function_single_async' may result in an unaligned pointer access [-Walign-mismatch]
                    smp_call_function_single_async(cpu, &rq->csd);
    
    It does seem that the usage of the call_single_data without cache line
    alignment should still be allowed by the smp code, so just change the
    function prototype so it accepts both, but leave the default alignment
    unchanged for the other users. This seems better to me than adding
    a local hack to shut up an otherwise correct warning in the caller.
    
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Acked-by: Jens Axboe <axboe@kernel.dk>
    Link: https://lkml.kernel.org/r/20210505211300.3174456-1-arnd@kernel.org
    [nc: Fix conflicts]
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/smp.h b/include/linux/smp.h
index 9fb239e12b82..6bb7f07bc1dd 100644
--- a/include/linux/smp.h
+++ b/include/linux/smp.h
@@ -53,7 +53,7 @@ void on_each_cpu_cond(bool (*cond_func)(int cpu, void *info),
 		smp_call_func_t func, void *info, bool wait,
 		gfp_t gfp_flags);
 
-int smp_call_function_single_async(int cpu, call_single_data_t *csd);
+int smp_call_function_single_async(int cpu, struct __call_single_data *csd);
 
 #ifdef CONFIG_SMP
 
diff --git a/kernel/smp.c b/kernel/smp.c
index 084c8b3a2681..00d208ef07c7 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -103,12 +103,12 @@ void __init call_function_init(void)
  * previous function call. For multi-cpu calls its even more interesting
  * as we'll have to ensure no other cpu is observing our csd.
  */
-static __always_inline void csd_lock_wait(call_single_data_t *csd)
+static __always_inline void csd_lock_wait(struct __call_single_data *csd)
 {
 	smp_cond_load_acquire(&csd->flags, !(VAL & CSD_FLAG_LOCK));
 }
 
-static __always_inline void csd_lock(call_single_data_t *csd)
+static __always_inline void csd_lock(struct __call_single_data *csd)
 {
 	csd_lock_wait(csd);
 	csd->flags |= CSD_FLAG_LOCK;
@@ -121,7 +121,7 @@ static __always_inline void csd_lock(call_single_data_t *csd)
 	smp_wmb();
 }
 
-static __always_inline void csd_unlock(call_single_data_t *csd)
+static __always_inline void csd_unlock(struct __call_single_data *csd)
 {
 	WARN_ON(!(csd->flags & CSD_FLAG_LOCK));
 
@@ -138,7 +138,7 @@ static DEFINE_PER_CPU_SHARED_ALIGNED(call_single_data_t, csd_data);
  * for execution on the given CPU. data must already have
  * ->func, ->info, and ->flags set.
  */
-static int generic_exec_single(int cpu, call_single_data_t *csd,
+static int generic_exec_single(int cpu, struct __call_single_data *csd,
 			       smp_call_func_t func, void *info)
 {
 	if (cpu == smp_processor_id()) {
@@ -323,7 +323,7 @@ EXPORT_SYMBOL(smp_call_function_single);
  * NOTE: Be careful, there is unfortunately no current debugging facility to
  * validate the correctness of this serialization.
  */
-int smp_call_function_single_async(int cpu, call_single_data_t *csd)
+int smp_call_function_single_async(int cpu, struct __call_single_data *csd)
 {
 	int err = 0;
 
diff --git a/kernel/up.c b/kernel/up.c
index 42c46bf3e0a5..2080f75e0e65 100644
--- a/kernel/up.c
+++ b/kernel/up.c
@@ -23,7 +23,7 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
 }
 EXPORT_SYMBOL(smp_call_function_single);
 
-int smp_call_function_single_async(int cpu, call_single_data_t *csd)
+int smp_call_function_single_async(int cpu, struct __call_single_data *csd)
 {
 	unsigned long flags;
 

commit 992de06308d9a9584d59b96d294ac676f924e437
Author: Jonathon Reinhart <jonathon.reinhart@gmail.com>
Date:   Sat May 1 04:28:22 2021 -0400

    net: Only allow init netns to set default tcp cong to a restricted algo
    
    commit 8d432592f30fcc34ef5a10aac4887b4897884493 upstream.
    
    tcp_set_default_congestion_control() is netns-safe in that it writes
    to &net->ipv4.tcp_congestion_control, but it also sets
    ca->flags |= TCP_CONG_NON_RESTRICTED which is not namespaced.
    This has the unintended side-effect of changing the global
    net.ipv4.tcp_allowed_congestion_control sysctl, despite the fact that it
    is read-only: 97684f0970f6 ("net: Make tcp_allowed_congestion_control
    readonly in non-init netns")
    
    Resolve this netns "leak" by only allowing the init netns to set the
    default algorithm to one that is restricted. This restriction could be
    removed if tcp_allowed_congestion_control were namespace-ified in the
    future.
    
    This bug was uncovered with
    https://github.com/JonathonReinhart/linux-netns-sysctl-verify
    
    Fixes: 6670e1524477 ("tcp: Namespace-ify sysctl_tcp_default_congestion_control")
    Signed-off-by: Jonathon Reinhart <jonathon.reinhart@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c
index 00a7482b6fbd..533f8d84d2f7 100644
--- a/net/ipv4/tcp_cong.c
+++ b/net/ipv4/tcp_cong.c
@@ -228,6 +228,10 @@ int tcp_set_default_congestion_control(struct net *net, const char *name)
 		ret = -ENOENT;
 	} else if (!try_module_get(ca->owner)) {
 		ret = -EBUSY;
+	} else if (!net_eq(net, &init_net) &&
+			!(ca->flags & TCP_CONG_NON_RESTRICTED)) {
+		/* Only init netns can set default to a restricted algorithm */
+		ret = -EPERM;
 	} else {
 		prev = xchg(&net->ipv4.tcp_congestion_control, ca);
 		if (prev)

commit e816fbc72270850317505ca8d6d80d652345310f
Author: Jane Chu <jane.chu@oracle.com>
Date:   Thu Apr 29 23:02:19 2021 -0700

    mm/memory-failure: unnecessary amount of unmapping
    
    [ Upstream commit 4d75136be8bf3ae01b0bc3e725b2cdc921e103bd ]
    
    It appears that unmap_mapping_range() actually takes a 'size' as its third
    argument rather than a location, the current calling fashion causes
    unnecessary amount of unmapping to occur.
    
    Link: https://lkml.kernel.org/r/20210420002821.2749748-1-jane.chu@oracle.com
    Fixes: 6100e34b2526e ("mm, memory_failure: Teach memory_failure() about dev_pagemap pages")
    Signed-off-by: Jane Chu <jane.chu@oracle.com>
    Reviewed-by: Dan Williams <dan.j.williams@intel.com>
    Reviewed-by: Naoya Horiguchi <naoya.horiguchi@nec.com>
    Cc: Dave Jiang <dave.jiang@intel.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/memory-failure.c b/mm/memory-failure.c
index 148fdd929a19..034607a68ccb 100644
--- a/mm/memory-failure.c
+++ b/mm/memory-failure.c
@@ -1220,7 +1220,7 @@ static int memory_failure_dev_pagemap(unsigned long pfn, int flags,
 		 * communicated in siginfo, see kill_proc()
 		 */
 		start = (page->index << PAGE_SHIFT) & ~(size - 1);
-		unmap_mapping_range(page->mapping, start, start + size, 0);
+		unmap_mapping_range(page->mapping, start, size, 0);
 	}
 	kill_procs(&tokill, flags & MF_MUST_KILL, !unmap_success, pfn, flags);
 	rc = 0;

commit c75dd20796f4504eb55e60c4b0d90221cedb8dbe
Author: Wang Wensheng <wangwensheng4@huawei.com>
Date:   Thu Apr 29 22:57:58 2021 -0700

    mm/sparse: add the missing sparse_buffer_fini() in error branch
    
    [ Upstream commit 2284f47fe9fe2ed2ef619e5474e155cfeeebd569 ]
    
    sparse_buffer_init() and sparse_buffer_fini() should appear in pair, or a
    WARN issue would be through the next time sparse_buffer_init() runs.
    
    Add the missing sparse_buffer_fini() in error branch.
    
    Link: https://lkml.kernel.org/r/20210325113155.118574-1-wangwensheng4@huawei.com
    Fixes: 85c77f791390 ("mm/sparse: add new sparse_init_nid() and sparse_init()")
    Signed-off-by: Wang Wensheng <wangwensheng4@huawei.com>
    Reviewed-by: David Hildenbrand <david@redhat.com>
    Reviewed-by: Oscar Salvador <osalvador@suse.de>
    Cc: Pavel Tatashin <pasha.tatashin@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/mm/sparse.c b/mm/sparse.c
index 3b24ba903d9e..ed60f0a375fe 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -467,6 +467,7 @@ static void __init sparse_init_nid(int nid, unsigned long pnum_begin,
 			pr_err("%s: node[%d] memory map backing failed. Some memory will not be available.",
 			       __func__, nid);
 			pnum_begin = pnum;
+			sparse_buffer_fini();
 			goto failed;
 		}
 		check_usemap_section_nr(nid, usemap);

commit 5350ad4401eee47f75f8b1d2567d422b4bc5502b
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Thu Apr 29 22:54:15 2021 -0700

    kfifo: fix ternary sign extension bugs
    
    [ Upstream commit 926ee00ea24320052b46745ef4b00d91c05bd03d ]
    
    The intent with this code was to return negative error codes but instead
    it returns positives.
    
    The problem is how type promotion works with ternary operations.  These
    functions return long, "ret" is an int and "copied" is a u32.  The
    negative error code is first cast to u32 so it becomes a high positive and
    then cast to long where it's still a positive.
    
    We could fix this by declaring "ret" as a ssize_t but let's just get rid
    of the ternaries instead.
    
    Link: https://lkml.kernel.org/r/YIE+/cK1tBzSuQPU@mwanda
    Fixes: 5bf2b19320ec ("kfifo: add example files to the kernel sample directory")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Cc: Stefani Seibold <stefani@seibold.net>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/samples/kfifo/bytestream-example.c b/samples/kfifo/bytestream-example.c
index 2fca916d9edf..a7f5ee8b6edc 100644
--- a/samples/kfifo/bytestream-example.c
+++ b/samples/kfifo/bytestream-example.c
@@ -124,8 +124,10 @@ static ssize_t fifo_write(struct file *file, const char __user *buf,
 	ret = kfifo_from_user(&test, buf, count, &copied);
 
 	mutex_unlock(&write_lock);
+	if (ret)
+		return ret;
 
-	return ret ? ret : copied;
+	return copied;
 }
 
 static ssize_t fifo_read(struct file *file, char __user *buf,
@@ -140,8 +142,10 @@ static ssize_t fifo_read(struct file *file, char __user *buf,
 	ret = kfifo_to_user(&test, buf, count, &copied);
 
 	mutex_unlock(&read_lock);
+	if (ret)
+		return ret;
 
-	return ret ? ret : copied;
+	return copied;
 }
 
 static const struct file_operations fifo_fops = {
diff --git a/samples/kfifo/inttype-example.c b/samples/kfifo/inttype-example.c
index 8dc3c2e7105a..a326a37e9163 100644
--- a/samples/kfifo/inttype-example.c
+++ b/samples/kfifo/inttype-example.c
@@ -117,8 +117,10 @@ static ssize_t fifo_write(struct file *file, const char __user *buf,
 	ret = kfifo_from_user(&test, buf, count, &copied);
 
 	mutex_unlock(&write_lock);
+	if (ret)
+		return ret;
 
-	return ret ? ret : copied;
+	return copied;
 }
 
 static ssize_t fifo_read(struct file *file, char __user *buf,
@@ -133,8 +135,10 @@ static ssize_t fifo_read(struct file *file, char __user *buf,
 	ret = kfifo_to_user(&test, buf, count, &copied);
 
 	mutex_unlock(&read_lock);
+	if (ret)
+		return ret;
 
-	return ret ? ret : copied;
+	return copied;
 }
 
 static const struct file_operations fifo_fops = {
diff --git a/samples/kfifo/record-example.c b/samples/kfifo/record-example.c
index 2d7529eeb294..deb87a2e4e6b 100644
--- a/samples/kfifo/record-example.c
+++ b/samples/kfifo/record-example.c
@@ -131,8 +131,10 @@ static ssize_t fifo_write(struct file *file, const char __user *buf,
 	ret = kfifo_from_user(&test, buf, count, &copied);
 
 	mutex_unlock(&write_lock);
+	if (ret)
+		return ret;
 
-	return ret ? ret : copied;
+	return copied;
 }
 
 static ssize_t fifo_read(struct file *file, char __user *buf,
@@ -147,8 +149,10 @@ static ssize_t fifo_read(struct file *file, char __user *buf,
 	ret = kfifo_to_user(&test, buf, count, &copied);
 
 	mutex_unlock(&read_lock);
+	if (ret)
+		return ret;
 
-	return ret ? ret : copied;
+	return copied;
 }
 
 static const struct file_operations fifo_fops = {

commit 8de8d1d052dd5bf1d5556a33c2927fdfe5d6bf7e
Author: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
Date:   Tue Apr 27 09:22:58 2021 -0700

    net:nfc:digital: Fix a double free in digital_tg_recv_dep_req
    
    [ Upstream commit 75258586793efc521e5dd52a5bf6c7a4cf7002be ]
    
    In digital_tg_recv_dep_req, it calls nfc_tm_data_received(..,resp).
    If nfc_tm_data_received() failed, the callee will free the resp via
    kfree_skb() and return error. But in the exit branch, the resp
    will be freed again.
    
    My patch sets resp to NULL if nfc_tm_data_received() failed, to
    avoid the double free.
    
    Fixes: 1c7a4c24fbfd9 ("NFC Digital: Add target NFC-DEP support")
    Signed-off-by: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/nfc/digital_dep.c b/net/nfc/digital_dep.c
index 4f9a973988b2..1eed0cf59190 100644
--- a/net/nfc/digital_dep.c
+++ b/net/nfc/digital_dep.c
@@ -1285,6 +1285,8 @@ static void digital_tg_recv_dep_req(struct nfc_digital_dev *ddev, void *arg,
 	}
 
 	rc = nfc_tm_data_received(ddev->nfc_dev, resp);
+	if (rc)
+		resp = NULL;
 
 exit:
 	kfree_skb(ddev->chaining_skb);

commit a16cd5f2bf8e3b0967488fe29cdf999b237af479
Author: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
Date:   Mon Apr 26 07:06:14 2021 -0700

    RDMA/bnxt_re: Fix a double free in bnxt_qplib_alloc_res
    
    [ Upstream commit 34b39efa5ae82fc0ad0acc27653c12a56328dbbe ]
    
    In bnxt_qplib_alloc_res, it calls bnxt_qplib_alloc_dpi_tbl().  Inside
    bnxt_qplib_alloc_dpi_tbl, dpit->dbr_bar_reg_iomem is freed via
    pci_iounmap() in unmap_io error branch. After the callee returns err code,
    bnxt_qplib_alloc_res calls
    bnxt_qplib_free_res()->bnxt_qplib_free_dpi_tbl() in the fail branch. Then
    dpit->dbr_bar_reg_iomem is freed in the second time by pci_iounmap().
    
    My patch set dpit->dbr_bar_reg_iomem to NULL after it is freed by
    pci_iounmap() in the first time, to avoid the double free.
    
    Fixes: 1ac5a4047975 ("RDMA/bnxt_re: Add bnxt_re RoCE driver")
    Link: https://lore.kernel.org/r/20210426140614.6722-1-lyl2019@mail.ustc.edu.cn
    Signed-off-by: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
    Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
    Acked-by: Devesh Sharma <devesh.sharma@broadcom.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/infiniband/hw/bnxt_re/qplib_res.c b/drivers/infiniband/hw/bnxt_re/qplib_res.c
index 539a5d44e6db..655952a6c0e6 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_res.c
+++ b/drivers/infiniband/hw/bnxt_re/qplib_res.c
@@ -725,6 +725,7 @@ static int bnxt_qplib_alloc_dpi_tbl(struct bnxt_qplib_res     *res,
 
 unmap_io:
 	pci_iounmap(res->pdev, dpit->dbr_bar_reg_iomem);
+	dpit->dbr_bar_reg_iomem = NULL;
 	return -ENOMEM;
 }
 

commit 16d8c44be52e3650917736d45f5904384a9da834
Author: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
Date:   Mon Apr 26 09:06:25 2021 -0700

    net:emac/emac-mac: Fix a use after free in emac_mac_tx_buf_send
    
    [ Upstream commit 6d72e7c767acbbdd44ebc7d89c6690b405b32b57 ]
    
    In emac_mac_tx_buf_send, it calls emac_tx_fill_tpd(..,skb,..).
    If some error happens in emac_tx_fill_tpd(), the skb will be freed via
    dev_kfree_skb(skb) in error branch of emac_tx_fill_tpd().
    But the freed skb is still used via skb->len by netdev_sent_queue(,skb->len).
    
    As i observed that emac_tx_fill_tpd() haven't modified the value of skb->len,
    thus my patch assigns skb->len to 'len' before the possible free and
    use 'len' instead of skb->len later.
    
    Fixes: b9b17debc69d2 ("net: emac: emac gigabit ethernet controller driver")
    Signed-off-by: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/qualcomm/emac/emac-mac.c b/drivers/net/ethernet/qualcomm/emac/emac-mac.c
index 031f6e6ee9c1..351a90698010 100644
--- a/drivers/net/ethernet/qualcomm/emac/emac-mac.c
+++ b/drivers/net/ethernet/qualcomm/emac/emac-mac.c
@@ -1449,6 +1449,7 @@ int emac_mac_tx_buf_send(struct emac_adapter *adpt, struct emac_tx_queue *tx_q,
 {
 	struct emac_tpd tpd;
 	u32 prod_idx;
+	int len;
 
 	memset(&tpd, 0, sizeof(tpd));
 
@@ -1468,9 +1469,10 @@ int emac_mac_tx_buf_send(struct emac_adapter *adpt, struct emac_tx_queue *tx_q,
 	if (skb_network_offset(skb) != ETH_HLEN)
 		TPD_TYP_SET(&tpd, 1);
 
+	len = skb->len;
 	emac_tx_fill_tpd(adpt, tx_q, skb, &tpd);
 
-	netdev_sent_queue(adpt->netdev, skb->len);
+	netdev_sent_queue(adpt->netdev, len);
 
 	/* Make sure the are enough free descriptors to hold one
 	 * maximum-sized SKB.  We need one desc for each fragment,

commit 35385daa8db320d2d9664930c28e732578b0d7de
Author: Phillip Potter <phil@philpotter.co.uk>
Date:   Fri Apr 23 00:49:45 2021 +0100

    net: geneve: modify IP header check in geneve6_xmit_skb and geneve_xmit_skb
    
    [ Upstream commit d13f048dd40e8577260cd43faea8ec9b77520197 ]
    
    Modify the header size check in geneve6_xmit_skb and geneve_xmit_skb
    to use pskb_inet_may_pull rather than pskb_network_may_pull. This fixes
    two kernel selftest failures introduced by the commit introducing the
    checks:
    IPv4 over geneve6: PMTU exceptions
    IPv4 over geneve6: PMTU exceptions - nexthop objects
    
    It does this by correctly accounting for the fact that IPv4 packets may
    transit over geneve IPv6 tunnels (and vice versa), and still fixes the
    uninit-value bug fixed by the original commit.
    
    Reported-by: kernel test robot <oliver.sang@intel.com>
    Fixes: 6628ddfec758 ("net: geneve: check skb is large enough for IPv4/IPv6 header")
    Suggested-by: Sabrina Dubroca <sd@queasysnail.net>
    Signed-off-by: Phillip Potter <phil@philpotter.co.uk>
    Acked-by: Sabrina Dubroca <sd@queasysnail.net>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c
index ce6fecf421f8..8c458c8f57a3 100644
--- a/drivers/net/geneve.c
+++ b/drivers/net/geneve.c
@@ -839,7 +839,7 @@ static int geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
 	__be16 df;
 	int err;
 
-	if (!pskb_network_may_pull(skb, sizeof(struct iphdr)))
+	if (!pskb_inet_may_pull(skb))
 		return -EINVAL;
 
 	sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
@@ -885,7 +885,7 @@ static int geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
 	__be16 sport;
 	int err;
 
-	if (!pskb_network_may_pull(skb, sizeof(struct ipv6hdr)))
+	if (!pskb_inet_may_pull(skb))
 		return -EINVAL;
 
 	sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);

commit 5ee60aa4b25378d041bb72e771b32c88463e7458
Author: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
Date:   Fri Apr 23 02:31:49 2021 +0900

    arm64: dts: uniphier: Change phy-mode to RGMII-ID to enable delay pins for RTL8211E
    
    [ Upstream commit dcabb06bf127b3e0d3fbc94a2b65dd56c2725851 ]
    
    UniPhier LD20 and PXs3 boards have RTL8211E ethernet phy, and the phy have
    the RX/TX delays of RGMII interface using pull-ups on the RXDLY and TXDLY
    pins.
    
    After the commit bbc4d71d6354 ("net: phy: realtek: fix rtl8211e rx/tx
    delay config"), the delays are working correctly, however, "rgmii" means
    no delay and the phy doesn't work. So need to set the phy-mode to
    "rgmii-id" to show that RX/TX delays are enabled.
    
    Fixes: c73730ee4c9a ("arm64: dts: uniphier: add AVE ethernet node")
    Signed-off-by: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm64/boot/dts/socionext/uniphier-ld20.dtsi b/arch/arm64/boot/dts/socionext/uniphier-ld20.dtsi
index caf112629caa..62429c412b33 100644
--- a/arch/arm64/boot/dts/socionext/uniphier-ld20.dtsi
+++ b/arch/arm64/boot/dts/socionext/uniphier-ld20.dtsi
@@ -610,7 +610,7 @@
 			clocks = <&sys_clk 6>;
 			reset-names = "ether";
 			resets = <&sys_rst 6>;
-			phy-mode = "rgmii";
+			phy-mode = "rgmii-id";
 			local-mac-address = [00 00 00 00 00 00];
 			socionext,syscon-phy-mode = <&soc_glue 0>;
 
diff --git a/arch/arm64/boot/dts/socionext/uniphier-pxs3.dtsi b/arch/arm64/boot/dts/socionext/uniphier-pxs3.dtsi
index 2a4cf427f5d3..8fe9a57b9562 100644
--- a/arch/arm64/boot/dts/socionext/uniphier-pxs3.dtsi
+++ b/arch/arm64/boot/dts/socionext/uniphier-pxs3.dtsi
@@ -416,7 +416,7 @@
 			clocks = <&sys_clk 6>;
 			reset-names = "ether";
 			resets = <&sys_rst 6>;
-			phy-mode = "rgmii";
+			phy-mode = "rgmii-id";
 			local-mac-address = [00 00 00 00 00 00];
 			socionext,syscon-phy-mode = <&soc_glue 0>;
 
@@ -437,7 +437,7 @@
 			clocks = <&sys_clk 7>;
 			reset-names = "ether";
 			resets = <&sys_rst 7>;
-			phy-mode = "rgmii";
+			phy-mode = "rgmii-id";
 			local-mac-address = [00 00 00 00 00 00];
 			socionext,syscon-phy-mode = <&soc_glue 1>;
 

commit 55c2b0dd950183180c4bcde981a1a64fb09f8a84
Author: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
Date:   Fri Apr 23 02:31:48 2021 +0900

    ARM: dts: uniphier: Change phy-mode to RGMII-ID to enable delay pins for RTL8211E
    
    [ Upstream commit 9ba585cc5b56ea14a453ba6be9bdb984ed33471a ]
    
    UniPhier PXs2 boards have RTL8211E ethernet phy, and the phy have the RX/TX
    delays of RGMII interface using pull-ups on the RXDLY and TXDLY pins.
    
    After the commit bbc4d71d6354 ("net: phy: realtek: fix rtl8211e rx/tx
    delay config"), the delays are working correctly, however, "rgmii" means
    no delay and the phy doesn't work. So need to set the phy-mode to
    "rgmii-id" to show that RX/TX delays are enabled.
    
    Fixes: e3cc931921d2 ("ARM: dts: uniphier: add AVE ethernet node")
    Signed-off-by: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/uniphier-pxs2.dtsi b/arch/arm/boot/dts/uniphier-pxs2.dtsi
index e2d1a22c5950..d8a32104aad0 100644
--- a/arch/arm/boot/dts/uniphier-pxs2.dtsi
+++ b/arch/arm/boot/dts/uniphier-pxs2.dtsi
@@ -513,7 +513,7 @@
 			clocks = <&sys_clk 6>;
 			reset-names = "ether";
 			resets = <&sys_rst 6>;
-			phy-mode = "rgmii";
+			phy-mode = "rgmii-id";
 			local-mac-address = [00 00 00 00 00 00];
 			socionext,syscon-phy-mode = <&soc_glue 0>;
 

commit 5d4973f04b5afcfbebc7c8e22e553f73a7e893e8
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Thu Apr 22 12:10:28 2021 +0300

    bnxt_en: fix ternary sign extension bug in bnxt_show_temp()
    
    [ Upstream commit 27537929f30d3136a71ef29db56127a33c92dad7 ]
    
    The problem is that bnxt_show_temp() returns long but "rc" is an int
    and "len" is a u32.  With ternary operations the type promotion is quite
    tricky.  The negative "rc" is first promoted to u32 and then to long so
    it ends up being a high positive value instead of a a negative as we
    intended.
    
    Fix this by removing the ternary.
    
    Fixes: d69753fa1ecb ("bnxt_en: return proper error codes in bnxt_show_temp")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 44ed2f6e2d96..6033970fb667 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -6851,7 +6851,9 @@ static ssize_t bnxt_show_temp(struct device *dev,
 	if (!rc)
 		len = sprintf(buf, "%u\n", resp->temp * 1000); /* display millidegree */
 	mutex_unlock(&bp->hwrm_cmd_lock);
-	return rc ?: len;
+	if (rc)
+		return rc;
+	return len;
 }
 static SENSOR_DEVICE_ATTR(temp1_input, 0444, bnxt_show_temp, NULL, 0);
 

commit f6bff21de76d1376598d72ca0a3841d6a2a93c5c
Author: Christophe Leroy <christophe.leroy@csgroup.eu>
Date:   Wed Apr 21 17:24:03 2021 +0000

    powerpc/52xx: Fix an invalid ASM expression ('addi' used instead of 'add')
    
    [ Upstream commit 8a87a507714386efc39c3ae6fa24d4f79846b522 ]
    
      AS      arch/powerpc/platforms/52xx/lite5200_sleep.o
    arch/powerpc/platforms/52xx/lite5200_sleep.S: Assembler messages:
    arch/powerpc/platforms/52xx/lite5200_sleep.S:184: Warning: invalid register expression
    
    In the following code, 'addi' is wrong, has to be 'add'
    
            /* local udelay in sram is needed */
      udelay: /* r11 - tb_ticks_per_usec, r12 - usecs, overwrites r13 */
            mullw   r12, r12, r11
            mftb    r13     /* start */
            addi    r12, r13, r12 /* end */
    
    Fixes: ee983079ce04 ("[POWERPC] MPC5200 low power mode")
    Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/cb4cec9131c8577803367f1699209a7e104cec2a.1619025821.git.christophe.leroy@csgroup.eu
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/powerpc/platforms/52xx/lite5200_sleep.S b/arch/powerpc/platforms/52xx/lite5200_sleep.S
index 3a9969c429b3..054f927bfef9 100644
--- a/arch/powerpc/platforms/52xx/lite5200_sleep.S
+++ b/arch/powerpc/platforms/52xx/lite5200_sleep.S
@@ -181,7 +181,7 @@ sram_code:
   udelay: /* r11 - tb_ticks_per_usec, r12 - usecs, overwrites r13 */
 	mullw	r12, r12, r11
 	mftb	r13	/* start */
-	addi	r12, r13, r12 /* end */
+	add	r12, r13, r12 /* end */
     1:
 	mftb	r13	/* current */
 	cmp	cr0, r13, r12

commit 193799c7e8406a95d87a93cfb65b5cef068f1d51
Author: Shuah Khan <skhan@linuxfoundation.org>
Date:   Tue Apr 6 17:02:28 2021 -0600

    ath10k: Fix ath10k_wmi_tlv_op_pull_peer_stats_info() unlock without lock
    
    [ Upstream commit eaaf52e4b866f265eb791897d622961293fd48c1 ]
    
    ath10k_wmi_tlv_op_pull_peer_stats_info() could try to unlock RCU lock
    winthout locking it first when peer reason doesn't match the valid
    cases for this function.
    
    Add a default case to return without unlocking.
    
    Fixes: 09078368d516 ("ath10k: hold RCU lock when calling ieee80211_find_sta_by_ifaddr()")
    Reported-by: Pavel Machek <pavel@ucw.cz>
    Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210406230228.31301-1-skhan@linuxfoundation.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/ath/ath10k/wmi-tlv.c b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
index 04dc5714aa72..243887fdb343 100644
--- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c
+++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
@@ -465,6 +465,9 @@ static void ath10k_wmi_event_tdls_peer(struct ath10k *ar, struct sk_buff *skb)
 					GFP_ATOMIC
 					);
 		break;
+	default:
+		kfree(tb);
+		return;
 	}
 
 exit:

commit f1526a23d4ec49518a2d950eb82df756030eca17
Author: Toke Høiland-Jørgensen <toke@redhat.com>
Date:   Fri Mar 26 19:08:19 2021 +0100

    ath9k: Fix error check in ath9k_hw_read_revisions() for PCI devices
    
    [ Upstream commit 7dd9a40fd6e0d0f1fd8e1931c007e080801dfdce ]
    
    When the error check in ath9k_hw_read_revisions() was added, it checked for
    -EIO which is what ath9k_regread() in the ath9k_htc driver uses. However,
    for plain ath9k, the register read function uses ioread32(), which just
    returns -1 on error. So if such a read fails, it still gets passed through
    and ends up as a weird mac revision in the log output.
    
    Fix this by changing ath9k_regread() to return -1 on error like ioread32()
    does, and fix the error check to look for that instead of -EIO.
    
    Fixes: 2f90c7e5d094 ("ath9k: Check for errors when reading SREV register")
    Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
    Reviewed-by: Lorenzo Bianconi <lorenzo@kernel.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210326180819.142480-1-toke@redhat.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
index 27d9fe6799f5..cb136d9d4621 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
@@ -246,7 +246,7 @@ static unsigned int ath9k_regread(void *hw_priv, u32 reg_offset)
 	if (unlikely(r)) {
 		ath_dbg(common, WMI, "REGISTER READ FAILED: (0x%04x, %d)\n",
 			reg_offset, r);
-		return -EIO;
+		return -1;
 	}
 
 	return be32_to_cpu(val);
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
index b4f7ee423d40..9f438d8e59f2 100644
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -287,7 +287,7 @@ static bool ath9k_hw_read_revisions(struct ath_hw *ah)
 
 	srev = REG_READ(ah, AR_SREV);
 
-	if (srev == -EIO) {
+	if (srev == -1) {
 		ath_err(ath9k_hw_common(ah),
 			"Failed to read SREV register");
 		return false;

commit 0878c28916e6fbc4c45c828318f6edc90a09bda4
Author: Colin Ian King <colin.king@canonical.com>
Date:   Tue Apr 20 18:16:14 2021 +0100

    net: davinci_emac: Fix incorrect masking of tx and rx error channel
    
    [ Upstream commit d83b8aa5207d81f9f6daec9888390f079cc5db3f ]
    
    The bit-masks used for the TXERRCH and RXERRCH (tx and rx error channels)
    are incorrect and always lead to a zero result. The mask values are
    currently the incorrect post-right shifted values, fix this by setting
    them to the currect values.
    
    (I double checked these against the TMS320TCI6482 data sheet, section
    5.30, page 127 to ensure I had the correct mask values for the TXERRCH
    and RXERRCH fields in the MACSTATUS register).
    
    Addresses-Coverity: ("Operands don't affect result")
    Fixes: a6286ee630f6 ("net: Add TI DaVinci EMAC driver")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/ti/davinci_emac.c b/drivers/net/ethernet/ti/davinci_emac.c
index f270beebb428..9bb84d83afc1 100644
--- a/drivers/net/ethernet/ti/davinci_emac.c
+++ b/drivers/net/ethernet/ti/davinci_emac.c
@@ -183,11 +183,11 @@ static const char emac_version_string[] = "TI DaVinci EMAC Linux v6.1";
 /* EMAC mac_status register */
 #define EMAC_MACSTATUS_TXERRCODE_MASK	(0xF00000)
 #define EMAC_MACSTATUS_TXERRCODE_SHIFT	(20)
-#define EMAC_MACSTATUS_TXERRCH_MASK	(0x7)
+#define EMAC_MACSTATUS_TXERRCH_MASK	(0x70000)
 #define EMAC_MACSTATUS_TXERRCH_SHIFT	(16)
 #define EMAC_MACSTATUS_RXERRCODE_MASK	(0xF000)
 #define EMAC_MACSTATUS_RXERRCODE_SHIFT	(12)
-#define EMAC_MACSTATUS_RXERRCH_MASK	(0x7)
+#define EMAC_MACSTATUS_RXERRCH_MASK	(0x700)
 #define EMAC_MACSTATUS_RXERRCH_SHIFT	(8)
 
 /* EMAC RX register masks */

commit f320604532d9ef364ba1f53f36cc0487d7f0e99f
Author: Colin Ian King <colin.king@canonical.com>
Date:   Tue Apr 20 14:47:19 2021 +0100

    ALSA: usb: midi: don't return -ENOMEM when usb_urb_ep_type_check fails
    
    [ Upstream commit cfd577acb769301b19c31361d45ae1f145318b7a ]
    
    Currently when the call to usb_urb_ep_type_check fails (returning -EINVAL)
    the error return path returns -ENOMEM via the exit label "error". Other
    uses of the same error exit label set the err variable to -ENOMEM but this
    is not being used.  I believe the original intent was for the error exit
    path to return the value in err rather than the hard coded -ENOMEM, so
    return this rather than the hard coded -ENOMEM.
    
    Addresses-Coverity: ("Unused value")
    Fixes: 738d9edcfd44 ("ALSA: usb-audio: Add sanity checks for invalid EPs")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Link: https://lore.kernel.org/r/20210420134719.381409-1-colin.king@canonical.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/usb/midi.c b/sound/usb/midi.c
index 26548f760bc1..4553db0ef084 100644
--- a/sound/usb/midi.c
+++ b/sound/usb/midi.c
@@ -1333,7 +1333,7 @@ static int snd_usbmidi_in_endpoint_create(struct snd_usb_midi *umidi,
 
  error:
 	snd_usbmidi_in_endpoint_delete(ep);
-	return -ENOMEM;
+	return err;
 }
 
 /*

commit 236b355dce28085db806cc1a544acd85a7360427
Author: Sindhu Devale <sindhu.devale@intel.com>
Date:   Thu Apr 15 19:21:04 2021 -0500

    RDMA/i40iw: Fix error unwinding when i40iw_hmc_sd_one fails
    
    [ Upstream commit 783a11bf2400e5d5c42a943c3083dc0330751842 ]
    
    When i40iw_hmc_sd_one fails, chunk is freed without the deletion of chunk
    entry in the PBLE info list.
    
    Fix it by adding the chunk entry to the PBLE info list only after
    successful addition of SD in i40iw_hmc_sd_one.
    
    This fixes a static checker warning reported here:
      https://lore.kernel.org/linux-rdma/YHV4CFXzqTm23AOZ@mwanda/
    
    Fixes: 9715830157be ("i40iw: add pble resource files")
    Link: https://lore.kernel.org/r/20210416002104.323-1-shiraz.saleem@intel.com
    Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Sindhu Devale <sindhu.devale@intel.com>
    Signed-off-by: Shiraz Saleem <shiraz.saleem@intel.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/infiniband/hw/i40iw/i40iw_pble.c b/drivers/infiniband/hw/i40iw/i40iw_pble.c
index 540aab5e502d..3fafc5424e76 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_pble.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_pble.c
@@ -392,12 +392,9 @@ static enum i40iw_status_code add_pble_pool(struct i40iw_sc_dev *dev,
 	i40iw_debug(dev, I40IW_DEBUG_PBLE, "next_fpm_addr = %llx chunk_size[%u] = 0x%x\n",
 		    pble_rsrc->next_fpm_addr, chunk->size, chunk->size);
 	pble_rsrc->unallocated_pble -= (chunk->size >> 3);
-	list_add(&chunk->list, &pble_rsrc->pinfo.clist);
 	sd_reg_val = (sd_entry_type == I40IW_SD_TYPE_PAGED) ?
 			sd_entry->u.pd_table.pd_page_addr.pa : sd_entry->u.bp.addr.pa;
-	if (sd_entry->valid)
-		return 0;
-	if (dev->is_pf) {
+	if (dev->is_pf && !sd_entry->valid) {
 		ret_code = i40iw_hmc_sd_one(dev, hmc_info->hmc_fn_id,
 					    sd_reg_val, idx->sd_idx,
 					    sd_entry->entry_type, true);
@@ -408,6 +405,7 @@ static enum i40iw_status_code add_pble_pool(struct i40iw_sc_dev *dev,
 	}
 
 	sd_entry->valid = true;
+	list_add(&chunk->list, &pble_rsrc->pinfo.clist);
 	return 0;
  error:
 	kfree(chunk);

commit dae0929f31e3b58b7eaa10e6e000ae4203e085aa
Author: Stefano Garzarella <sgarzare@redhat.com>
Date:   Fri Apr 16 12:44:16 2021 +0200

    vsock/vmci: log once the failed queue pair allocation
    
    [ Upstream commit e16edc99d658cd41c60a44cc14d170697aa3271f ]
    
    VMCI feature is not supported in conjunction with the vSphere Fault
    Tolerance (FT) feature.
    
    VMware Tools can repeatedly try to create a vsock connection. If FT is
    enabled the kernel logs is flooded with the following messages:
    
        qp_alloc_hypercall result = -20
        Could not attach to queue pair with -20
    
    "qp_alloc_hypercall result = -20" was hidden by commit e8266c4c3307
    ("VMCI: Stop log spew when qp allocation isn't possible"), but "Could
    not attach to queue pair with -20" is still there flooding the log.
    
    Since the error message can be useful in some cases, print it only once.
    
    Fixes: d021c344051a ("VSOCK: Introduce VM Sockets")
    Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
    Reviewed-by: Jorgen Hansen <jhansen@vmware.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/vmw_vsock/vmci_transport.c b/net/vmw_vsock/vmci_transport.c
index c3d5ab01fba7..42ab3e2ac060 100644
--- a/net/vmw_vsock/vmci_transport.c
+++ b/net/vmw_vsock/vmci_transport.c
@@ -584,8 +584,7 @@ vmci_transport_queue_pair_alloc(struct vmci_qp **qpair,
 			       peer, flags, VMCI_NO_PRIVILEGE_FLAGS);
 out:
 	if (err < 0) {
-		pr_err("Could not attach to queue pair with %d\n",
-		       err);
+		pr_err_once("Could not attach to queue pair with %d\n", err);
 		err = vmci_transport_error_to_vsock_error(err);
 	}
 

commit bca2d47d454bdeddc367a3d2e86645b5b5bb093a
Author: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
Date:   Fri Apr 2 11:26:27 2021 -0700

    mwl8k: Fix a double Free in mwl8k_probe_hw
    
    [ Upstream commit a8e083ee8e2a6c94c29733835adae8bf5b832748 ]
    
    In mwl8k_probe_hw, hw->priv->txq is freed at the first time by
    dma_free_coherent() in the call chain:
    if(!priv->ap_fw)->mwl8k_init_txqs(hw)->mwl8k_txq_init(hw, i).
    
    Then in err_free_queues of mwl8k_probe_hw, hw->priv->txq is freed
    at the second time by mwl8k_txq_deinit(hw, i)->dma_free_coherent().
    
    My patch set txq->txd to NULL after the first free to avoid the
    double free.
    
    Fixes: a66098daacee2 ("mwl8k: Marvell TOPDOG wireless driver")
    Signed-off-by: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210402182627.4256-1-lyl2019@mail.ustc.edu.cn
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/marvell/mwl8k.c b/drivers/net/wireless/marvell/mwl8k.c
index ffc565ac2192..6769b0c5a5cd 100644
--- a/drivers/net/wireless/marvell/mwl8k.c
+++ b/drivers/net/wireless/marvell/mwl8k.c
@@ -1469,6 +1469,7 @@ static int mwl8k_txq_init(struct ieee80211_hw *hw, int index)
 	txq->skb = kcalloc(MWL8K_TX_DESCS, sizeof(*txq->skb), GFP_KERNEL);
 	if (txq->skb == NULL) {
 		pci_free_consistent(priv->pdev, size, txq->txd, txq->txd_dma);
+		txq->txd = NULL;
 		return -ENOMEM;
 	}
 

commit 0b838b87d74c30a9324466abd637ed0c403eb3d3
Author: Sergey Shtylyov <s.shtylyov@omprussia.ru>
Date:   Sat Apr 17 22:05:05 2021 +0300

    i2c: sh7760: fix IRQ error path
    
    [ Upstream commit 92dfb27240fea2776f61c5422472cb6defca7767 ]
    
    While adding the invalid IRQ check after calling platform_get_irq(),
    I managed to overlook that the driver has a complex error path in its
    probe() method, thus a simple *return* couldn't be used.  Use a proper
    *goto* instead!
    
    Fixes: e5b2e3e74201 ("i2c: sh7760: add IRQ check")
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omprussia.ru>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/i2c/busses/i2c-sh7760.c b/drivers/i2c/busses/i2c-sh7760.c
index c79c9f542c5a..319d1fa617c8 100644
--- a/drivers/i2c/busses/i2c-sh7760.c
+++ b/drivers/i2c/busses/i2c-sh7760.c
@@ -473,7 +473,7 @@ static int sh7760_i2c_probe(struct platform_device *pdev)
 
 	ret = platform_get_irq(pdev, 0);
 	if (ret < 0)
-		return ret;
+		goto out3;
 	id->irq = ret;
 
 	id->adap.nr = pdev->id;

commit 0ef6d51875c9fac1b1c4b51af41c22c15a51d5e1
Author: Ping-Ke Shih <pkshih@realtek.com>
Date:   Fri Feb 19 13:26:07 2021 +0800

    rtlwifi: 8821ae: upgrade PHY and RF parameters
    
    [ Upstream commit 18fb0bedb5fc2fddc057dbe48b7360a6ffda34b3 ]
    
    The signal strength of 5G is quite low, so user can't connect to an AP far
    away. New parameters with new format and its parser are updated by the commit
    84d26fda52e2 ("rtlwifi: Update 8821ae new phy parameters and its parser."), but
    some parameters are missing. Use this commit to update to the novel parameters
    that use new format.
    
    Fixes: 84d26fda52e2 ("rtlwifi: Update 8821ae new phy parameters and its parser")
    Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
    Tested-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210219052607.7323-1-pkshih@realtek.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/table.c b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/table.c
index f87f9d03b9fa..ac44fd5d0597 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/table.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/table.c
@@ -272,7 +272,7 @@ u32 RTL8821AE_PHY_REG_ARRAY[] = {
 	0x824, 0x00030FE0,
 	0x828, 0x00000000,
 	0x82C, 0x002081DD,
-	0x830, 0x2AAA8E24,
+	0x830, 0x2AAAEEC8,
 	0x834, 0x0037A706,
 	0x838, 0x06489B44,
 	0x83C, 0x0000095B,
@@ -347,10 +347,10 @@ u32 RTL8821AE_PHY_REG_ARRAY[] = {
 	0x9D8, 0x00000000,
 	0x9DC, 0x00000000,
 	0x9E0, 0x00005D00,
-	0x9E4, 0x00000002,
+	0x9E4, 0x00000003,
 	0x9E8, 0x00000001,
 	0xA00, 0x00D047C8,
-	0xA04, 0x01FF000C,
+	0xA04, 0x01FF800C,
 	0xA08, 0x8C8A8300,
 	0xA0C, 0x2E68000F,
 	0xA10, 0x9500BB78,
@@ -1343,7 +1343,11 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x083, 0x00021800,
 		0x084, 0x00028000,
 		0x085, 0x00048000,
+	0x80000111,	0x00000000,	0x40000000,	0x00000000,
+		0x086, 0x0009483A,
+	0xA0000000,	0x00000000,
 		0x086, 0x00094838,
+	0xB0000000,	0x00000000,
 		0x087, 0x00044980,
 		0x088, 0x00048000,
 		0x089, 0x0000D480,
@@ -1432,36 +1436,32 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x03C, 0x000CA000,
 		0x0EF, 0x00000000,
 		0x0EF, 0x00001100,
-	0xFF0F0104, 0xABCD,
+	0x80000111,	0x00000000,	0x40000000,	0x00000000,
 		0x034, 0x0004ADF3,
 		0x034, 0x00049DF0,
-	0xFF0F0204, 0xCDEF,
+	0x90000110,	0x00000000,	0x40000000,	0x00000000,
 		0x034, 0x0004ADF3,
 		0x034, 0x00049DF0,
-	0xFF0F0404, 0xCDEF,
-		0x034, 0x0004ADF3,
-		0x034, 0x00049DF0,
-	0xFF0F0200, 0xCDEF,
+	0x90000210,	0x00000000,	0x40000000,	0x00000000,
 		0x034, 0x0004ADF5,
 		0x034, 0x00049DF2,
-	0xFF0F02C0, 0xCDEF,
+	0x9000020c,	0x00000000,	0x40000000,	0x00000000,
+		0x034, 0x0004A0F3,
+		0x034, 0x000490B1,
+		0x9000040c,	0x00000000,	0x40000000,	0x00000000,
 		0x034, 0x0004A0F3,
 		0x034, 0x000490B1,
-	0xCDCDCDCD, 0xCDCD,
+	0x90000200,	0x00000000,	0x40000000,	0x00000000,
+		0x034, 0x0004ADF5,
+		0x034, 0x00049DF2,
+	0x90000410,	0x00000000,	0x40000000,	0x00000000,
+		0x034, 0x0004ADF3,
+		0x034, 0x00049DF0,
+	0xA0000000,	0x00000000,
 		0x034, 0x0004ADF7,
 		0x034, 0x00049DF3,
-	0xFF0F0104, 0xDEAD,
-	0xFF0F0104, 0xABCD,
-		0x034, 0x00048DED,
-		0x034, 0x00047DEA,
-		0x034, 0x00046DE7,
-		0x034, 0x00045CE9,
-		0x034, 0x00044CE6,
-		0x034, 0x000438C6,
-		0x034, 0x00042886,
-		0x034, 0x00041486,
-		0x034, 0x00040447,
-	0xFF0F0204, 0xCDEF,
+	0xB0000000,	0x00000000,
+	0x80000111,	0x00000000,	0x40000000,	0x00000000,
 		0x034, 0x00048DED,
 		0x034, 0x00047DEA,
 		0x034, 0x00046DE7,
@@ -1471,7 +1471,7 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x034, 0x00042886,
 		0x034, 0x00041486,
 		0x034, 0x00040447,
-	0xFF0F0404, 0xCDEF,
+	0x90000110,	0x00000000,	0x40000000,	0x00000000,
 		0x034, 0x00048DED,
 		0x034, 0x00047DEA,
 		0x034, 0x00046DE7,
@@ -1481,7 +1481,17 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x034, 0x00042886,
 		0x034, 0x00041486,
 		0x034, 0x00040447,
-	0xFF0F02C0, 0xCDEF,
+	0x9000020c,	0x00000000,	0x40000000,	0x00000000,
+		0x034, 0x000480AE,
+		0x034, 0x000470AB,
+		0x034, 0x0004608B,
+		0x034, 0x00045069,
+		0x034, 0x00044048,
+		0x034, 0x00043045,
+		0x034, 0x00042026,
+		0x034, 0x00041023,
+		0x034, 0x00040002,
+	0x9000040c,	0x00000000,	0x40000000,	0x00000000,
 		0x034, 0x000480AE,
 		0x034, 0x000470AB,
 		0x034, 0x0004608B,
@@ -1491,7 +1501,17 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x034, 0x00042026,
 		0x034, 0x00041023,
 		0x034, 0x00040002,
-	0xCDCDCDCD, 0xCDCD,
+	0x90000410,	0x00000000,	0x40000000,	0x00000000,
+		0x034, 0x00048DED,
+		0x034, 0x00047DEA,
+		0x034, 0x00046DE7,
+		0x034, 0x00045CE9,
+		0x034, 0x00044CE6,
+		0x034, 0x000438C6,
+		0x034, 0x00042886,
+		0x034, 0x00041486,
+		0x034, 0x00040447,
+	0xA0000000,	0x00000000,
 		0x034, 0x00048DEF,
 		0x034, 0x00047DEC,
 		0x034, 0x00046DE9,
@@ -1501,38 +1521,36 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x034, 0x0004248A,
 		0x034, 0x0004108D,
 		0x034, 0x0004008A,
-	0xFF0F0104, 0xDEAD,
-	0xFF0F0200, 0xABCD,
+	0xB0000000,	0x00000000,
+	0x80000210,	0x00000000,	0x40000000,	0x00000000,
 		0x034, 0x0002ADF4,
-	0xFF0F02C0, 0xCDEF,
+	0x9000020c,	0x00000000,	0x40000000,	0x00000000,
+		0x034, 0x0002A0F3,
+	0x9000040c,	0x00000000,	0x40000000,	0x00000000,
 		0x034, 0x0002A0F3,
-	0xCDCDCDCD, 0xCDCD,
+	0x90000200,	0x00000000,	0x40000000,	0x00000000,
+		0x034, 0x0002ADF4,
+	0xA0000000,	0x00000000,
 		0x034, 0x0002ADF7,
-	0xFF0F0200, 0xDEAD,
-	0xFF0F0104, 0xABCD,
-		0x034, 0x00029DF4,
-	0xFF0F0204, 0xCDEF,
+	0xB0000000,	0x00000000,
+	0x80000111,	0x00000000,	0x40000000,	0x00000000,
 		0x034, 0x00029DF4,
-	0xFF0F0404, 0xCDEF,
+	0x90000110,	0x00000000,	0x40000000,	0x00000000,
 		0x034, 0x00029DF4,
-	0xFF0F0200, 0xCDEF,
+	0x90000210,	0x00000000,	0x40000000,	0x00000000,
 		0x034, 0x00029DF1,
-	0xFF0F02C0, 0xCDEF,
+	0x9000020c,	0x00000000,	0x40000000,	0x00000000,
+		0x034, 0x000290F0,
+	0x9000040c,	0x00000000,	0x40000000,	0x00000000,
 		0x034, 0x000290F0,
-	0xCDCDCDCD, 0xCDCD,
+	0x90000200,	0x00000000,	0x40000000,	0x00000000,
+		0x034, 0x00029DF1,
+	0x90000410,	0x00000000,	0x40000000,	0x00000000,
+		0x034, 0x00029DF4,
+	0xA0000000,	0x00000000,
 		0x034, 0x00029DF2,
-	0xFF0F0104, 0xDEAD,
-	0xFF0F0104, 0xABCD,
-		0x034, 0x00028DF1,
-		0x034, 0x00027DEE,
-		0x034, 0x00026DEB,
-		0x034, 0x00025CEC,
-		0x034, 0x00024CE9,
-		0x034, 0x000238CA,
-		0x034, 0x00022889,
-		0x034, 0x00021489,
-		0x034, 0x0002044A,
-	0xFF0F0204, 0xCDEF,
+	0xB0000000,	0x00000000,
+	0x80000111,	0x00000000,	0x40000000,	0x00000000,
 		0x034, 0x00028DF1,
 		0x034, 0x00027DEE,
 		0x034, 0x00026DEB,
@@ -1542,7 +1560,7 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x034, 0x00022889,
 		0x034, 0x00021489,
 		0x034, 0x0002044A,
-	0xFF0F0404, 0xCDEF,
+	0x90000110,	0x00000000,	0x40000000,	0x00000000,
 		0x034, 0x00028DF1,
 		0x034, 0x00027DEE,
 		0x034, 0x00026DEB,
@@ -1552,7 +1570,7 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x034, 0x00022889,
 		0x034, 0x00021489,
 		0x034, 0x0002044A,
-	0xFF0F02C0, 0xCDEF,
+	0x9000020c,	0x00000000,	0x40000000,	0x00000000,
 		0x034, 0x000280AF,
 		0x034, 0x000270AC,
 		0x034, 0x0002608B,
@@ -1562,7 +1580,27 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x034, 0x00022026,
 		0x034, 0x00021023,
 		0x034, 0x00020002,
-	0xCDCDCDCD, 0xCDCD,
+	0x9000040c,	0x00000000,	0x40000000,	0x00000000,
+		0x034, 0x000280AF,
+		0x034, 0x000270AC,
+		0x034, 0x0002608B,
+		0x034, 0x00025069,
+		0x034, 0x00024048,
+		0x034, 0x00023045,
+		0x034, 0x00022026,
+		0x034, 0x00021023,
+		0x034, 0x00020002,
+	0x90000410,	0x00000000,	0x40000000,	0x00000000,
+		0x034, 0x00028DF1,
+		0x034, 0x00027DEE,
+		0x034, 0x00026DEB,
+		0x034, 0x00025CEC,
+		0x034, 0x00024CE9,
+		0x034, 0x000238CA,
+		0x034, 0x00022889,
+		0x034, 0x00021489,
+		0x034, 0x0002044A,
+	0xA0000000,	0x00000000,
 		0x034, 0x00028DEE,
 		0x034, 0x00027DEB,
 		0x034, 0x00026CCD,
@@ -1572,27 +1610,24 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x034, 0x00022849,
 		0x034, 0x00021449,
 		0x034, 0x0002004D,
-	0xFF0F0104, 0xDEAD,
-	0xFF0F02C0, 0xABCD,
+	0xB0000000,	0x00000000,
+	0x8000020c,	0x00000000,	0x40000000,	0x00000000,
+		0x034, 0x0000A0D7,
+		0x034, 0x000090D3,
+		0x034, 0x000080B1,
+		0x034, 0x000070AE,
+	0x9000040c,	0x00000000,	0x40000000,	0x00000000,
 		0x034, 0x0000A0D7,
 		0x034, 0x000090D3,
 		0x034, 0x000080B1,
 		0x034, 0x000070AE,
-	0xCDCDCDCD, 0xCDCD,
+	0xA0000000,	0x00000000,
 		0x034, 0x0000ADF7,
 		0x034, 0x00009DF4,
 		0x034, 0x00008DF1,
 		0x034, 0x00007DEE,
-	0xFF0F02C0, 0xDEAD,
-	0xFF0F0104, 0xABCD,
-		0x034, 0x00006DEB,
-		0x034, 0x00005CEC,
-		0x034, 0x00004CE9,
-		0x034, 0x000038CA,
-		0x034, 0x00002889,
-		0x034, 0x00001489,
-		0x034, 0x0000044A,
-	0xFF0F0204, 0xCDEF,
+	0xB0000000,	0x00000000,
+	0x80000111,	0x00000000,	0x40000000,	0x00000000,
 		0x034, 0x00006DEB,
 		0x034, 0x00005CEC,
 		0x034, 0x00004CE9,
@@ -1600,7 +1635,7 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x034, 0x00002889,
 		0x034, 0x00001489,
 		0x034, 0x0000044A,
-	0xFF0F0404, 0xCDEF,
+	0x90000110,	0x00000000,	0x40000000,	0x00000000,
 		0x034, 0x00006DEB,
 		0x034, 0x00005CEC,
 		0x034, 0x00004CE9,
@@ -1608,7 +1643,7 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x034, 0x00002889,
 		0x034, 0x00001489,
 		0x034, 0x0000044A,
-	0xFF0F02C0, 0xCDEF,
+	0x9000020c,	0x00000000,	0x40000000,	0x00000000,
 		0x034, 0x0000608D,
 		0x034, 0x0000506B,
 		0x034, 0x0000404A,
@@ -1616,7 +1651,23 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x034, 0x00002044,
 		0x034, 0x00001025,
 		0x034, 0x00000004,
-	0xCDCDCDCD, 0xCDCD,
+	0x9000040c,	0x00000000,	0x40000000,	0x00000000,
+		0x034, 0x0000608D,
+		0x034, 0x0000506B,
+		0x034, 0x0000404A,
+		0x034, 0x00003047,
+		0x034, 0x00002044,
+		0x034, 0x00001025,
+		0x034, 0x00000004,
+	0x90000410,	0x00000000,	0x40000000,	0x00000000,
+		0x034, 0x00006DEB,
+		0x034, 0x00005CEC,
+		0x034, 0x00004CE9,
+		0x034, 0x000038CA,
+		0x034, 0x00002889,
+		0x034, 0x00001489,
+		0x034, 0x0000044A,
+	0xA0000000,	0x00000000,
 		0x034, 0x00006DCD,
 		0x034, 0x00005CCD,
 		0x034, 0x00004CCA,
@@ -1624,11 +1675,11 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x034, 0x00002888,
 		0x034, 0x00001488,
 		0x034, 0x00000486,
-	0xFF0F0104, 0xDEAD,
+	0xB0000000,	0x00000000,
 		0x0EF, 0x00000000,
 		0x018, 0x0001712A,
 		0x0EF, 0x00000040,
-	0xFF0F0104, 0xABCD,
+	0x80000111,	0x00000000,	0x40000000,	0x00000000,
 		0x035, 0x00000187,
 		0x035, 0x00008187,
 		0x035, 0x00010187,
@@ -1638,7 +1689,7 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x035, 0x00040188,
 		0x035, 0x00048188,
 		0x035, 0x00050188,
-	0xFF0F0204, 0xCDEF,
+	0x90000110,	0x00000000,	0x40000000,	0x00000000,
 		0x035, 0x00000187,
 		0x035, 0x00008187,
 		0x035, 0x00010187,
@@ -1648,7 +1699,37 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x035, 0x00040188,
 		0x035, 0x00048188,
 		0x035, 0x00050188,
-	0xFF0F0404, 0xCDEF,
+	0x90000210,	0x00000000,	0x40000000,	0x00000000,
+		0x035, 0x00000128,
+		0x035, 0x00008128,
+		0x035, 0x00010128,
+		0x035, 0x000201C8,
+		0x035, 0x000281C8,
+		0x035, 0x000301C8,
+		0x035, 0x000401C8,
+		0x035, 0x000481C8,
+		0x035, 0x000501C8,
+	0x9000040c,	0x00000000,	0x40000000,	0x00000000,
+		0x035, 0x00000145,
+		0x035, 0x00008145,
+		0x035, 0x00010145,
+		0x035, 0x00020196,
+		0x035, 0x00028196,
+		0x035, 0x00030196,
+		0x035, 0x000401C7,
+		0x035, 0x000481C7,
+		0x035, 0x000501C7,
+	0x90000200,	0x00000000,	0x40000000,	0x00000000,
+		0x035, 0x00000128,
+		0x035, 0x00008128,
+		0x035, 0x00010128,
+		0x035, 0x000201C8,
+		0x035, 0x000281C8,
+		0x035, 0x000301C8,
+		0x035, 0x000401C8,
+		0x035, 0x000481C8,
+		0x035, 0x000501C8,
+	0x90000410,	0x00000000,	0x40000000,	0x00000000,
 		0x035, 0x00000187,
 		0x035, 0x00008187,
 		0x035, 0x00010187,
@@ -1658,7 +1739,7 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x035, 0x00040188,
 		0x035, 0x00048188,
 		0x035, 0x00050188,
-	0xCDCDCDCD, 0xCDCD,
+	0xA0000000,	0x00000000,
 		0x035, 0x00000145,
 		0x035, 0x00008145,
 		0x035, 0x00010145,
@@ -1668,11 +1749,11 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x035, 0x000401C7,
 		0x035, 0x000481C7,
 		0x035, 0x000501C7,
-	0xFF0F0104, 0xDEAD,
+	0xB0000000,	0x00000000,
 		0x0EF, 0x00000000,
 		0x018, 0x0001712A,
 		0x0EF, 0x00000010,
-	0xFF0F0104, 0xABCD,
+	0x80000111,	0x00000000,	0x40000000,	0x00000000,
 		0x036, 0x00085733,
 		0x036, 0x0008D733,
 		0x036, 0x00095733,
@@ -1685,7 +1766,7 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x036, 0x000CE4B4,
 		0x036, 0x000D64B4,
 		0x036, 0x000DE4B4,
-	0xFF0F0204, 0xCDEF,
+	0x90000110,	0x00000000,	0x40000000,	0x00000000,
 		0x036, 0x00085733,
 		0x036, 0x0008D733,
 		0x036, 0x00095733,
@@ -1698,7 +1779,46 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x036, 0x000CE4B4,
 		0x036, 0x000D64B4,
 		0x036, 0x000DE4B4,
-	0xFF0F0404, 0xCDEF,
+	0x90000210,	0x00000000,	0x40000000,	0x00000000,
+		0x036, 0x000063B5,
+		0x036, 0x0000E3B5,
+		0x036, 0x000163B5,
+		0x036, 0x0001E3B5,
+		0x036, 0x000263B5,
+		0x036, 0x0002E3B5,
+		0x036, 0x000363B5,
+		0x036, 0x0003E3B5,
+		0x036, 0x000463B5,
+		0x036, 0x0004E3B5,
+		0x036, 0x000563B5,
+		0x036, 0x0005E3B5,
+	0x9000040c,	0x00000000,	0x40000000,	0x00000000,
+		0x036, 0x000056B3,
+		0x036, 0x0000D6B3,
+		0x036, 0x000156B3,
+		0x036, 0x0001D6B3,
+		0x036, 0x00026634,
+		0x036, 0x0002E634,
+		0x036, 0x00036634,
+		0x036, 0x0003E634,
+		0x036, 0x000467B4,
+		0x036, 0x0004E7B4,
+		0x036, 0x000567B4,
+		0x036, 0x0005E7B4,
+	0x90000200,	0x00000000,	0x40000000,	0x00000000,
+		0x036, 0x000063B5,
+		0x036, 0x0000E3B5,
+		0x036, 0x000163B5,
+		0x036, 0x0001E3B5,
+		0x036, 0x000263B5,
+		0x036, 0x0002E3B5,
+		0x036, 0x000363B5,
+		0x036, 0x0003E3B5,
+		0x036, 0x000463B5,
+		0x036, 0x0004E3B5,
+		0x036, 0x000563B5,
+		0x036, 0x0005E3B5,
+	0x90000410,	0x00000000,	0x40000000,	0x00000000,
 		0x036, 0x00085733,
 		0x036, 0x0008D733,
 		0x036, 0x00095733,
@@ -1711,7 +1831,7 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x036, 0x000CE4B4,
 		0x036, 0x000D64B4,
 		0x036, 0x000DE4B4,
-	0xCDCDCDCD, 0xCDCD,
+	0xA0000000,	0x00000000,
 		0x036, 0x000056B3,
 		0x036, 0x0000D6B3,
 		0x036, 0x000156B3,
@@ -1724,103 +1844,162 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x036, 0x0004E7B4,
 		0x036, 0x000567B4,
 		0x036, 0x0005E7B4,
-	0xFF0F0104, 0xDEAD,
+	0xB0000000,	0x00000000,
 		0x0EF, 0x00000000,
 		0x0EF, 0x00000008,
-	0xFF0F0104, 0xABCD,
+	0x80000111,	0x00000000,	0x40000000,	0x00000000,
 		0x03C, 0x000001C8,
 		0x03C, 0x00000492,
-	0xFF0F0204, 0xCDEF,
+	0x90000110,	0x00000000,	0x40000000,	0x00000000,
 		0x03C, 0x000001C8,
 		0x03C, 0x00000492,
-	0xFF0F0404, 0xCDEF,
+	0x90000210,	0x00000000,	0x40000000,	0x00000000,
+		0x03C, 0x000001B6,
+		0x03C, 0x00000492,
+	0x9000040c,	0x00000000,	0x40000000,	0x00000000,
+		0x03C, 0x0000022A,
+		0x03C, 0x00000594,
+	0x90000200,	0x00000000,	0x40000000,	0x00000000,
+		0x03C, 0x000001B6,
+		0x03C, 0x00000492,
+	0x90000410,	0x00000000,	0x40000000,	0x00000000,
 		0x03C, 0x000001C8,
 		0x03C, 0x00000492,
-	0xCDCDCDCD, 0xCDCD,
+	0xA0000000,	0x00000000,
 		0x03C, 0x0000022A,
 		0x03C, 0x00000594,
-	0xFF0F0104, 0xDEAD,
-	0xFF0F0104, 0xABCD,
+	0xB0000000,	0x00000000,
+	0x80000111,	0x00000000,	0x40000000,	0x00000000,
 		0x03C, 0x00000800,
-	0xFF0F0204, 0xCDEF,
+	0x90000110,	0x00000000,	0x40000000,	0x00000000,
 		0x03C, 0x00000800,
-	0xFF0F0404, 0xCDEF,
+	0x90000210,	0x00000000,	0x40000000,	0x00000000,
 		0x03C, 0x00000800,
-	0xFF0F02C0, 0xCDEF,
+	0x9000020c,	0x00000000,	0x40000000,	0x00000000,
 		0x03C, 0x00000820,
-	0xCDCDCDCD, 0xCDCD,
+	0x9000040c,	0x00000000,	0x40000000,	0x00000000,
+		0x03C, 0x00000820,
+	0x90000200,	0x00000000,	0x40000000,	0x00000000,
+		0x03C, 0x00000800,
+	0x90000410,	0x00000000,	0x40000000,	0x00000000,
+		0x03C, 0x00000800,
+	0xA0000000,	0x00000000,
 		0x03C, 0x00000900,
-	0xFF0F0104, 0xDEAD,
+	0xB0000000,	0x00000000,
 		0x0EF, 0x00000000,
 		0x018, 0x0001712A,
 		0x0EF, 0x00000002,
-	0xFF0F0104, 0xABCD,
+	0x80000111,	0x00000000,	0x40000000,	0x00000000,
 		0x008, 0x0004E400,
-	0xFF0F0204, 0xCDEF,
+	0x90000110,	0x00000000,	0x40000000,	0x00000000,
 		0x008, 0x0004E400,
-	0xFF0F0404, 0xCDEF,
+	0x90000210,	0x00000000,	0x40000000,	0x00000000,
+		0x008, 0x00002000,
+	0x9000020c,	0x00000000,	0x40000000,	0x00000000,
+		0x008, 0x00002000,
+	0x9000040c,	0x00000000,	0x40000000,	0x00000000,
+		0x008, 0x00002000,
+	0x90000200,	0x00000000,	0x40000000,	0x00000000,
+		0x008, 0x00002000,
+	0x90000410,	0x00000000,	0x40000000,	0x00000000,
 		0x008, 0x0004E400,
-	0xCDCDCDCD, 0xCDCD,
+	0xA0000000,	0x00000000,
 		0x008, 0x00002000,
-	0xFF0F0104, 0xDEAD,
+	0xB0000000,	0x00000000,
 		0x0EF, 0x00000000,
 		0x0DF, 0x000000C0,
-		0x01F, 0x00040064,
-	0xFF0F0104, 0xABCD,
+		0x01F, 0x00000064,
+	0x80000111,	0x00000000,	0x40000000,	0x00000000,
 		0x058, 0x000A7284,
 		0x059, 0x000600EC,
-	0xFF0F0204, 0xCDEF,
+	0x90000110,	0x00000000,	0x40000000,	0x00000000,
 		0x058, 0x000A7284,
 		0x059, 0x000600EC,
-	0xFF0F0404, 0xCDEF,
+	0x9000020c,	0x00000000,	0x40000000,	0x00000000,
+		0x058, 0x00081184,
+		0x059, 0x0006016C,
+	0x9000040c,	0x00000000,	0x40000000,	0x00000000,
+		0x058, 0x00081184,
+		0x059, 0x0006016C,
+	0x90000200,	0x00000000,	0x40000000,	0x00000000,
+		0x058, 0x00081184,
+		0x059, 0x0006016C,
+	0x90000410,	0x00000000,	0x40000000,	0x00000000,
 		0x058, 0x000A7284,
 		0x059, 0x000600EC,
-	0xCDCDCDCD, 0xCDCD,
+	0xA0000000,	0x00000000,
 		0x058, 0x00081184,
 		0x059, 0x0006016C,
-	0xFF0F0104, 0xDEAD,
-	0xFF0F0104, 0xABCD,
+	0xB0000000,	0x00000000,
+	0x80000111,	0x00000000,	0x40000000,	0x00000000,
 		0x061, 0x000E8D73,
 		0x062, 0x00093FC5,
-	0xFF0F0204, 0xCDEF,
+	0x90000110,	0x00000000,	0x40000000,	0x00000000,
 		0x061, 0x000E8D73,
 		0x062, 0x00093FC5,
-	0xFF0F0404, 0xCDEF,
+	0x90000210,	0x00000000,	0x40000000,	0x00000000,
+		0x061, 0x000EFD83,
+		0x062, 0x00093FCC,
+	0x9000040c,	0x00000000,	0x40000000,	0x00000000,
+		0x061, 0x000EAD53,
+		0x062, 0x00093BC4,
+	0x90000200,	0x00000000,	0x40000000,	0x00000000,
+		0x061, 0x000EFD83,
+		0x062, 0x00093FCC,
+	0x90000410,	0x00000000,	0x40000000,	0x00000000,
 		0x061, 0x000E8D73,
 		0x062, 0x00093FC5,
-	0xCDCDCDCD, 0xCDCD,
+	0xA0000000,	0x00000000,
 		0x061, 0x000EAD53,
 		0x062, 0x00093BC4,
-	0xFF0F0104, 0xDEAD,
-	0xFF0F0104, 0xABCD,
+	0xB0000000,	0x00000000,
+	0x80000111,	0x00000000,	0x40000000,	0x00000000,
 		0x063, 0x000110E9,
-	0xFF0F0204, 0xCDEF,
+	0x90000110,	0x00000000,	0x40000000,	0x00000000,
 		0x063, 0x000110E9,
-	0xFF0F0404, 0xCDEF,
+	0x90000210,	0x00000000,	0x40000000,	0x00000000,
+		0x063, 0x000110EB,
+	0x9000020c,	0x00000000,	0x40000000,	0x00000000,
 		0x063, 0x000110E9,
-	0xFF0F0200, 0xCDEF,
-		0x063, 0x000710E9,
-	0xFF0F02C0, 0xCDEF,
+	0x9000040c,	0x00000000,	0x40000000,	0x00000000,
 		0x063, 0x000110E9,
-	0xCDCDCDCD, 0xCDCD,
+	0x90000200,	0x00000000,	0x40000000,	0x00000000,
+		0x063, 0x000110EB,
+	0x90000410,	0x00000000,	0x40000000,	0x00000000,
+		0x063, 0x000110E9,
+	0xA0000000,	0x00000000,
 		0x063, 0x000714E9,
-	0xFF0F0104, 0xDEAD,
-	0xFF0F0104, 0xABCD,
+	0xB0000000,	0x00000000,
+	0x80000111,	0x00000000,	0x40000000,	0x00000000,
+		0x064, 0x0001C27C,
+	0x90000110,	0x00000000,	0x40000000,	0x00000000,
+		0x064, 0x0001C27C,
+	0x90000210,	0x00000000,	0x40000000,	0x00000000,
 		0x064, 0x0001C27C,
-	0xFF0F0204, 0xCDEF,
+	0x9000040c,	0x00000000,	0x40000000,	0x00000000,
+		0x064, 0x0001C67C,
+	0x90000200,	0x00000000,	0x40000000,	0x00000000,
 		0x064, 0x0001C27C,
-	0xFF0F0404, 0xCDEF,
+	0x90000410,	0x00000000,	0x40000000,	0x00000000,
 		0x064, 0x0001C27C,
-	0xCDCDCDCD, 0xCDCD,
+	0xA0000000,	0x00000000,
 		0x064, 0x0001C67C,
-	0xFF0F0104, 0xDEAD,
-	0xFF0F0200, 0xABCD,
+	0xB0000000,	0x00000000,
+	0x80000111,	0x00000000,	0x40000000,	0x00000000,
+		0x065, 0x00091016,
+	0x90000110,	0x00000000,	0x40000000,	0x00000000,
+		0x065, 0x00091016,
+	0x90000210,	0x00000000,	0x40000000,	0x00000000,
 		0x065, 0x00093016,
-	0xFF0F02C0, 0xCDEF,
+		0x9000020c,	0x00000000,	0x40000000,	0x00000000,
 		0x065, 0x00093015,
-	0xCDCDCDCD, 0xCDCD,
+		0x9000040c,	0x00000000,	0x40000000,	0x00000000,
+		0x065, 0x00093015,
+		0x90000200,	0x00000000,	0x40000000,	0x00000000,
+		0x065, 0x00093016,
+		0xA0000000,	0x00000000,
 		0x065, 0x00091016,
-	0xFF0F0200, 0xDEAD,
+		0xB0000000,	0x00000000,
 		0x018, 0x00000006,
 		0x0EF, 0x00002000,
 		0x03B, 0x0003824B,
@@ -1918,9 +2097,10 @@ u32 RTL8821AE_RADIOA_ARRAY[] = {
 		0x0B4, 0x0001214C,
 		0x0B7, 0x0003000C,
 		0x01C, 0x000539D2,
+		0x0C4, 0x000AFE00,
 		0x018, 0x0001F12A,
-		0x0FE, 0x00000000,
-		0x0FE, 0x00000000,
+		0xFFE, 0x00000000,
+		0xFFE, 0x00000000,
 		0x018, 0x0001712A,
 
 };
@@ -2040,6 +2220,7 @@ u32 RTL8812AE_MAC_REG_ARRAY[] = {
 u32 RTL8812AE_MAC_1T_ARRAYLEN = ARRAY_SIZE(RTL8812AE_MAC_REG_ARRAY);
 
 u32 RTL8821AE_MAC_REG_ARRAY[] = {
+		0x421, 0x0000000F,
 		0x428, 0x0000000A,
 		0x429, 0x00000010,
 		0x430, 0x00000000,
@@ -2508,7 +2689,7 @@ u32 RTL8821AE_AGC_TAB_ARRAY[] = {
 		0x81C, 0xA6360001,
 		0x81C, 0xA5380001,
 		0x81C, 0xA43A0001,
-		0x81C, 0xA33C0001,
+		0x81C, 0x683C0001,
 		0x81C, 0x673E0001,
 		0x81C, 0x66400001,
 		0x81C, 0x65420001,
@@ -2542,7 +2723,66 @@ u32 RTL8821AE_AGC_TAB_ARRAY[] = {
 		0x81C, 0x017A0001,
 		0x81C, 0x017C0001,
 		0x81C, 0x017E0001,
-	0xFF0F02C0, 0xABCD,
+	0x8000020c,	0x00000000,	0x40000000,	0x00000000,
+		0x81C, 0xFB000101,
+		0x81C, 0xFA020101,
+		0x81C, 0xF9040101,
+		0x81C, 0xF8060101,
+		0x81C, 0xF7080101,
+		0x81C, 0xF60A0101,
+		0x81C, 0xF50C0101,
+		0x81C, 0xF40E0101,
+		0x81C, 0xF3100101,
+		0x81C, 0xF2120101,
+		0x81C, 0xF1140101,
+		0x81C, 0xF0160101,
+		0x81C, 0xEF180101,
+		0x81C, 0xEE1A0101,
+		0x81C, 0xED1C0101,
+		0x81C, 0xEC1E0101,
+		0x81C, 0xEB200101,
+		0x81C, 0xEA220101,
+		0x81C, 0xE9240101,
+		0x81C, 0xE8260101,
+		0x81C, 0xE7280101,
+		0x81C, 0xE62A0101,
+		0x81C, 0xE52C0101,
+		0x81C, 0xE42E0101,
+		0x81C, 0xE3300101,
+		0x81C, 0xA5320101,
+		0x81C, 0xA4340101,
+		0x81C, 0xA3360101,
+		0x81C, 0x87380101,
+		0x81C, 0x863A0101,
+		0x81C, 0x853C0101,
+		0x81C, 0x843E0101,
+		0x81C, 0x69400101,
+		0x81C, 0x68420101,
+		0x81C, 0x67440101,
+		0x81C, 0x66460101,
+		0x81C, 0x49480101,
+		0x81C, 0x484A0101,
+		0x81C, 0x474C0101,
+		0x81C, 0x2A4E0101,
+		0x81C, 0x29500101,
+		0x81C, 0x28520101,
+		0x81C, 0x27540101,
+		0x81C, 0x26560101,
+		0x81C, 0x25580101,
+		0x81C, 0x245A0101,
+		0x81C, 0x235C0101,
+		0x81C, 0x055E0101,
+		0x81C, 0x04600101,
+		0x81C, 0x03620101,
+		0x81C, 0x02640101,
+		0x81C, 0x01660101,
+		0x81C, 0x01680101,
+		0x81C, 0x016A0101,
+		0x81C, 0x016C0101,
+		0x81C, 0x016E0101,
+		0x81C, 0x01700101,
+		0x81C, 0x01720101,
+	0x9000040c,	0x00000000,	0x40000000,	0x00000000,
 		0x81C, 0xFB000101,
 		0x81C, 0xFA020101,
 		0x81C, 0xF9040101,
@@ -2601,7 +2841,7 @@ u32 RTL8821AE_AGC_TAB_ARRAY[] = {
 		0x81C, 0x016E0101,
 		0x81C, 0x01700101,
 		0x81C, 0x01720101,
-	0xCDCDCDCD, 0xCDCD,
+	0xA0000000,	0x00000000,
 		0x81C, 0xFF000101,
 		0x81C, 0xFF020101,
 		0x81C, 0xFE040101,
@@ -2660,7 +2900,7 @@ u32 RTL8821AE_AGC_TAB_ARRAY[] = {
 		0x81C, 0x046E0101,
 		0x81C, 0x03700101,
 		0x81C, 0x02720101,
-	0xFF0F02C0, 0xDEAD,
+	0xB0000000,	0x00000000,
 		0x81C, 0x01740101,
 		0x81C, 0x01760101,
 		0x81C, 0x01780101,

commit 7845bf7fad958e5fc58a3de0a833ff4c803c8197
Author: Tyrel Datwyler <tyreld@linux.ibm.com>
Date:   Thu Feb 11 12:24:35 2021 -0600

    powerpc/pseries: extract host bridge from pci_bus prior to bus removal
    
    [ Upstream commit 38d0b1c9cec71e6d0f3bddef0bbce41d05a3e796 ]
    
    The pci_bus->bridge reference may no longer be valid after
    pci_bus_remove() resulting in passing a bad value to device_unregister()
    for the associated bridge device.
    
    Store the host_bridge reference in a separate variable prior to
    pci_bus_remove().
    
    Fixes: 7340056567e3 ("powerpc/pci: Reorder pci bus/bridge unregistration during PHB removal")
    Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210211182435.47968-1-tyreld@linux.ibm.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/powerpc/platforms/pseries/pci_dlpar.c b/arch/powerpc/platforms/pseries/pci_dlpar.c
index 561917fa54a8..afca4b737e80 100644
--- a/arch/powerpc/platforms/pseries/pci_dlpar.c
+++ b/arch/powerpc/platforms/pseries/pci_dlpar.c
@@ -66,6 +66,7 @@ EXPORT_SYMBOL_GPL(init_phb_dynamic);
 int remove_phb_dynamic(struct pci_controller *phb)
 {
 	struct pci_bus *b = phb->bus;
+	struct pci_host_bridge *host_bridge = to_pci_host_bridge(b->bridge);
 	struct resource *res;
 	int rc, i;
 
@@ -92,7 +93,8 @@ int remove_phb_dynamic(struct pci_controller *phb)
 	/* Remove the PCI bus and unregister the bridge device from sysfs */
 	phb->bus = NULL;
 	pci_remove_bus(b);
-	device_unregister(b->bridge);
+	host_bridge->bus = NULL;
+	device_unregister(&host_bridge->dev);
 
 	/* Now release the IO resource */
 	if (res->flags & IORESOURCE_IO)

commit 7a73666d0d92ee82e40079fd3d2ffdb39cf1b241
Author: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
Date:   Tue Apr 13 20:12:37 2021 -0700

    MIPS: pci-legacy: stop using of_pci_range_to_resource
    
    [ Upstream commit 3ecb9dc1581eebecaee56decac70e35365260866 ]
    
    Mirror commit aeba3731b150 ("powerpc/pci: Fix IO space breakage after
    of_pci_range_to_resource() change").
    
    Most MIPS platforms do not define PCI_IOBASE, nor implement
    pci_address_to_pio(). Moreover, IO_SPACE_LIMIT is 0xffff for most MIPS
    platforms. of_pci_range_to_resource passes the _start address_ of the IO
    range into pci_address_to_pio, which then checks it against
    IO_SPACE_LIMIT and fails, because for MIPS platforms that use
    pci-legacy (pci-lantiq, pci-rt3883, pci-mt7620), IO ranges start much
    higher than 0xffff.
    
    In fact, pci-mt7621 in staging already works around this problem, see
    commit 09dd629eeabb ("staging: mt7621-pci: fix io space and properly set
    resource limits")
    
    So just stop using of_pci_range_to_resource, which does not work for
    MIPS.
    
    Fixes PCI errors like:
      pci_bus 0000:00: root bus resource [io  0xffffffff]
    
    Fixes: 0b0b0893d49b ("of/pci: Fix the conversion of IO ranges into IO resources")
    Signed-off-by: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
    Cc: Liviu Dudau <Liviu.Dudau@arm.com>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/mips/pci/pci-legacy.c b/arch/mips/pci/pci-legacy.c
index 3c3b1e6abb53..e8b0751d5b76 100644
--- a/arch/mips/pci/pci-legacy.c
+++ b/arch/mips/pci/pci-legacy.c
@@ -169,8 +169,13 @@ void pci_load_of_ranges(struct pci_controller *hose, struct device_node *node)
 			res = hose->mem_resource;
 			break;
 		}
-		if (res != NULL)
-			of_pci_range_to_resource(&range, node, res);
+		if (res != NULL) {
+			res->name = node->full_name;
+			res->flags = range.flags;
+			res->start = range.cpu_addr;
+			res->end = range.cpu_addr + range.size - 1;
+			res->parent = res->child = res->sibling = NULL;
+		}
 	}
 }
 

commit e456f6cf4d97adf0e296ceafc8cb8baa4f91a27d
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Wed Apr 14 09:01:38 2021 +0300

    drm/i915/gvt: Fix error code in intel_gvt_init_device()
    
    [ Upstream commit 329328ec6a87f2c1275f50d979d55513de458409 ]
    
    The intel_gvt_init_vgpu_type_groups() function is only called from
    intel_gvt_init_device().  If it fails then the intel_gvt_init_device()
    prints the error code and propagates it back again.  That's a bug
    because false is zero/success.  The fix is to modify it to return zero
    or negative error codes and make everything consistent.
    
    Fixes: c5d71cb31723 ("drm/i915/gvt: Move vGPU type related code into gvt file")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/YHaFQtk/DIVYK1u5@mwanda
    Reviewed-by: Zhenyu Wang <zhenyuw@linux.intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/i915/gvt/gvt.c b/drivers/gpu/drm/i915/gvt/gvt.c
index 46c8b720e336..3e3876d141ce 100644
--- a/drivers/gpu/drm/i915/gvt/gvt.c
+++ b/drivers/gpu/drm/i915/gvt/gvt.c
@@ -128,7 +128,7 @@ static bool intel_get_gvt_attrs(struct attribute ***type_attrs,
 	return true;
 }
 
-static bool intel_gvt_init_vgpu_type_groups(struct intel_gvt *gvt)
+static int intel_gvt_init_vgpu_type_groups(struct intel_gvt *gvt)
 {
 	int i, j;
 	struct intel_vgpu_type *type;
@@ -146,7 +146,7 @@ static bool intel_gvt_init_vgpu_type_groups(struct intel_gvt *gvt)
 		gvt_vgpu_type_groups[i] = group;
 	}
 
-	return true;
+	return 0;
 
 unwind:
 	for (j = 0; j < i; j++) {
@@ -154,7 +154,7 @@ static bool intel_gvt_init_vgpu_type_groups(struct intel_gvt *gvt)
 		kfree(group);
 	}
 
-	return false;
+	return -ENOMEM;
 }
 
 static void intel_gvt_cleanup_vgpu_type_groups(struct intel_gvt *gvt)
@@ -416,7 +416,7 @@ int intel_gvt_init_device(struct drm_i915_private *dev_priv)
 		goto out_clean_thread;
 
 	ret = intel_gvt_init_vgpu_type_groups(gvt);
-	if (ret == false) {
+	if (ret) {
 		gvt_err("failed to init vgpu type groups: %d\n", ret);
 		goto out_clean_types;
 	}

commit 1a8bc5a2e2db4567a0ba0511c6d2fe1c484467b5
Author: Shengjiu Wang <shengjiu.wang@nxp.com>
Date:   Wed Apr 14 14:33:43 2021 +0800

    ASoC: ak5558: correct reset polarity
    
    [ Upstream commit 0b93bbc977af55fd10687f2c96c807cba95cb927 ]
    
    Reset (aka power off) happens when the reset gpio is made active.
    The reset gpio is GPIO_ACTIVE_LOW
    
    Fixes: 920884777480 ("ASoC: ak5558: Add support for AK5558 ADC driver")
    Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>
    Link: https://lore.kernel.org/r/1618382024-31725-1-git-send-email-shengjiu.wang@nxp.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/soc/codecs/ak5558.c b/sound/soc/codecs/ak5558.c
index 73c418517f8d..dda165b14222 100644
--- a/sound/soc/codecs/ak5558.c
+++ b/sound/soc/codecs/ak5558.c
@@ -271,7 +271,7 @@ static void ak5558_power_off(struct ak5558_priv *ak5558)
 	if (!ak5558->reset_gpiod)
 		return;
 
-	gpiod_set_value_cansleep(ak5558->reset_gpiod, 0);
+	gpiod_set_value_cansleep(ak5558->reset_gpiod, 1);
 	usleep_range(1000, 2000);
 }
 
@@ -280,7 +280,7 @@ static void ak5558_power_on(struct ak5558_priv *ak5558)
 	if (!ak5558->reset_gpiod)
 		return;
 
-	gpiod_set_value_cansleep(ak5558->reset_gpiod, 1);
+	gpiod_set_value_cansleep(ak5558->reset_gpiod, 0);
 	usleep_range(1000, 2000);
 }
 

commit b469f21b20ac7b517d9e52dac7a52ec3e12ef715
Author: Sergey Shtylyov <s.shtylyov@omprussia.ru>
Date:   Sat Apr 10 23:25:10 2021 +0300

    i2c: sh7760: add IRQ check
    
    [ Upstream commit e5b2e3e742015dd2aa6bc7bcef2cb59b2de1221c ]
    
    The driver neglects to check the result of platform_get_irq()'s call and
    blithely passes the negative error codes to devm_request_irq() (which
    takes *unsigned* IRQ #), causing it to fail with -EINVAL, overriding
    an original error code.  Stop calling devm_request_irq() with invalid
    IRQ #s.
    
    Fixes: a26c20b1fa6d ("i2c: Renesas SH7760 I2C master driver")
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omprussia.ru>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/i2c/busses/i2c-sh7760.c b/drivers/i2c/busses/i2c-sh7760.c
index c2005c789d2b..c79c9f542c5a 100644
--- a/drivers/i2c/busses/i2c-sh7760.c
+++ b/drivers/i2c/busses/i2c-sh7760.c
@@ -471,7 +471,10 @@ static int sh7760_i2c_probe(struct platform_device *pdev)
 		goto out2;
 	}
 
-	id->irq = platform_get_irq(pdev, 0);
+	ret = platform_get_irq(pdev, 0);
+	if (ret < 0)
+		return ret;
+	id->irq = ret;
 
 	id->adap.nr = pdev->id;
 	id->adap.algo = &sh7760_i2c_algo;

commit 06f09e43374d4a8f9743661c11a27983b0063c34
Author: Sergey Shtylyov <s.shtylyov@omprussia.ru>
Date:   Sat Apr 10 23:18:31 2021 +0300

    i2c: jz4780: add IRQ check
    
    [ Upstream commit c5e5f7a8d931fb4beba245bdbc94734175fda9de ]
    
    The driver neglects to check the result of platform_get_irq()'s call and
    blithely passes the negative error codes to devm_request_irq() (which
    takes *unsigned* IRQ #), causing it to fail with -EINVAL, overriding
    an original error code.  Stop calling devm_request_irq() with invalid
    IRQ #s.
    
    Fixes: ba92222ed63a ("i2c: jz4780: Add i2c bus controller driver for Ingenic JZ4780")
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omprussia.ru>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/i2c/busses/i2c-jz4780.c b/drivers/i2c/busses/i2c-jz4780.c
index 41ca9ff7b5da..4dd800c0db14 100644
--- a/drivers/i2c/busses/i2c-jz4780.c
+++ b/drivers/i2c/busses/i2c-jz4780.c
@@ -760,7 +760,10 @@ static int jz4780_i2c_probe(struct platform_device *pdev)
 
 	jz4780_i2c_writew(i2c, JZ4780_I2C_INTM, 0x0);
 
-	i2c->irq = platform_get_irq(pdev, 0);
+	ret = platform_get_irq(pdev, 0);
+	if (ret < 0)
+		goto err;
+	i2c->irq = ret;
 	ret = devm_request_irq(&pdev->dev, i2c->irq, jz4780_i2c_irq, 0,
 			       dev_name(&pdev->dev), i2c);
 	if (ret)

commit f73b75f717fc292d7be5b32c0f8013e9dbcc4a53
Author: Sergey Shtylyov <s.shtylyov@omprussia.ru>
Date:   Sat Apr 10 23:16:41 2021 +0300

    i2c: emev2: add IRQ check
    
    [ Upstream commit bb6129c32867baa7988f7fd2066cf18ed662d240 ]
    
    The driver neglects to check the result of platform_get_irq()'s call and
    blithely passes the negative error codes to devm_request_irq() (which
    takes *unsigned* IRQ #), causing it to fail with -EINVAL, overriding
    an original error code.  Stop calling devm_request_irq() with invalid
    IRQ #s.
    
    Fixes: 5faf6e1f58b4 ("i2c: emev2: add driver")
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omprussia.ru>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/i2c/busses/i2c-emev2.c b/drivers/i2c/busses/i2c-emev2.c
index 959d4912ec0d..0230a13a6ab7 100644
--- a/drivers/i2c/busses/i2c-emev2.c
+++ b/drivers/i2c/busses/i2c-emev2.c
@@ -397,7 +397,10 @@ static int em_i2c_probe(struct platform_device *pdev)
 
 	em_i2c_reset(&priv->adap);
 
-	priv->irq = platform_get_irq(pdev, 0);
+	ret = platform_get_irq(pdev, 0);
+	if (ret < 0)
+		goto err_clk;
+	priv->irq = ret;
 	ret = devm_request_irq(&pdev->dev, priv->irq, em_i2c_irq_handler, 0,
 				"em_i2c", priv);
 	if (ret)

commit 92a5d9ce2d6fd85d5f8c9ef51a20133bc19226b8
Author: Sergey Shtylyov <s.shtylyov@omprussia.ru>
Date:   Sat Apr 10 23:14:35 2021 +0300

    i2c: cadence: add IRQ check
    
    [ Upstream commit 5581c2c5d02bc63a0edb53e061c8e97cd490646e ]
    
    The driver neglects to check the result of platform_get_irq()'s call and
    blithely passes the negative error codes to devm_request_irq() (which
    takes *unsigned* IRQ #), causing it to fail with -EINVAL, overriding
    an original error code.  Stop calling devm_request_irq() with invalid
    IRQ #s.
    
    Fixes: df8eb5691c48 ("i2c: Add driver for Cadence I2C controller")
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omprussia.ru>
    Signed-off-by: Wolfram Sang <wsa@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/i2c/busses/i2c-cadence.c b/drivers/i2c/busses/i2c-cadence.c
index b13605718291..c5475bb4fae6 100644
--- a/drivers/i2c/busses/i2c-cadence.c
+++ b/drivers/i2c/busses/i2c-cadence.c
@@ -906,7 +906,10 @@ static int cdns_i2c_probe(struct platform_device *pdev)
 	if (IS_ERR(id->membase))
 		return PTR_ERR(id->membase);
 
-	id->irq = platform_get_irq(pdev, 0);
+	ret = platform_get_irq(pdev, 0);
+	if (ret < 0)
+		return ret;
+	id->irq = ret;
 
 	id->adap.owner = THIS_MODULE;
 	id->adap.dev.of_node = pdev->dev.of_node;

commit 39768890072df373ff5906677a2a575fcb43c29e
Author: Wang Wensheng <wangwensheng4@huawei.com>
Date:   Thu Apr 8 11:31:32 2021 +0000

    RDMA/srpt: Fix error return code in srpt_cm_req_recv()
    
    [ Upstream commit 6bc950beff0c440ac567cdc4e7f4542a9920953d ]
    
    Fix to return a negative error code from the error handling case instead
    of 0, as done elsewhere in this function.
    
    Fixes: db7683d7deb2 ("IB/srpt: Fix login-related race conditions")
    Link: https://lore.kernel.org/r/20210408113132.87250-1-wangwensheng4@huawei.com
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Wang Wensheng <wangwensheng4@huawei.com>
    Reviewed-by: Bart Van Assche <bvanassche@acm.org>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c
index bc979a85a505..6090f1ce0c56 100644
--- a/drivers/infiniband/ulp/srpt/ib_srpt.c
+++ b/drivers/infiniband/ulp/srpt/ib_srpt.c
@@ -2301,6 +2301,7 @@ static int srpt_cm_req_recv(struct srpt_device *const sdev,
 		pr_info("rejected SRP_LOGIN_REQ because target %s_%d is not enabled\n",
 			sdev->device->name, port_num);
 		mutex_unlock(&sport->mutex);
+		ret = -EINVAL;
 		goto reject;
 	}
 

commit c6b9874ce389b0538604a3e54be3d8c7f292dc18
Author: Colin Ian King <colin.king@canonical.com>
Date:   Fri Apr 9 14:07:26 2021 +0100

    net: thunderx: Fix unintentional sign extension issue
    
    [ Upstream commit e701a25840360706fe4cf5de0015913ca19c274b ]
    
    The shifting of the u8 integers rq->caching by 26 bits to
    the left will be promoted to a 32 bit signed int and then
    sign-extended to a u64. In the event that rq->caching is
    greater than 0x1f then all then all the upper 32 bits of
    the u64 end up as also being set because of the int
    sign-extension. Fix this by casting the u8 values to a
    u64 before the 26 bit left shift.
    
    Addresses-Coverity: ("Unintended sign extension")
    Fixes: 4863dea3fab0 ("net: Adding support for Cavium ThunderX network controller")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
index 9a4cfa61ed93..d9bcbe469ab9 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
@@ -779,7 +779,7 @@ static void nicvf_rcv_queue_config(struct nicvf *nic, struct queue_set *qs,
 	mbx.rq.msg = NIC_MBOX_MSG_RQ_CFG;
 	mbx.rq.qs_num = qs->vnic_id;
 	mbx.rq.rq_num = qidx;
-	mbx.rq.cfg = (rq->caching << 26) | (rq->cq_qs << 19) |
+	mbx.rq.cfg = ((u64)rq->caching << 26) | (rq->cq_qs << 19) |
 			  (rq->cq_idx << 16) | (rq->cont_rbdr_qs << 9) |
 			  (rq->cont_qs_rbdr_idx << 8) |
 			  (rq->start_rbdr_qs << 1) | (rq->start_qs_rbdr_idx);

commit 00c0923f1139d61e56b9d29e221c558c32cee6ac
Author: Wang Wensheng <wangwensheng4@huawei.com>
Date:   Thu Apr 8 11:31:40 2021 +0000

    IB/hfi1: Fix error return code in parse_platform_config()
    
    [ Upstream commit 4c7d9c69adadfc31892c7e8e134deb3546552106 ]
    
    Fix to return a negative error code from the error handling case instead
    of 0, as done elsewhere in this function.
    
    Fixes: 7724105686e7 ("IB/hfi1: add driver files")
    Link: https://lore.kernel.org/r/20210408113140.103032-1-wangwensheng4@huawei.com
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Wang Wensheng <wangwensheng4@huawei.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/infiniband/hw/hfi1/firmware.c b/drivers/infiniband/hw/hfi1/firmware.c
index 2b57ba70ddd6..c09080712485 100644
--- a/drivers/infiniband/hw/hfi1/firmware.c
+++ b/drivers/infiniband/hw/hfi1/firmware.c
@@ -1924,6 +1924,7 @@ int parse_platform_config(struct hfi1_devdata *dd)
 			dd_dev_err(dd, "%s: Failed CRC check at offset %ld\n",
 				   __func__, (ptr -
 				   (u32 *)dd->platform_config.data));
+			ret = -EINVAL;
 			goto bail;
 		}
 		/* Jump the CRC DWORD */

commit 8e241e724c1323dbf7114e8801339ba2ad2972e1
Author: Colin Ian King <colin.king@canonical.com>
Date:   Thu Feb 25 18:32:41 2021 +0000

    mt7601u: fix always true expression
    
    [ Upstream commit 87fce88658ba047ae62e83497d3f3c5dc22fa6f9 ]
    
    Currently the expression ~nic_conf1 is always true because nic_conf1
    is a u16 and according to 6.5.3.3 of the C standard the ~ operator
    promotes the u16 to an integer before flipping all the bits. Thus
    the top 16 bits of the integer result are all set so the expression
    is always true.  If the intention was to flip all the bits of nic_conf1
    then casting the integer result back to a u16 is a suitabel fix.
    
    Interestingly static analyzers seem to thing a bitwise ! should be
    used instead of ~ for this scenario, so I think the original intent
    of the expression may need some extra consideration.
    
    Addresses-Coverity: ("Logical vs. bitwise operator")
    Fixes: c869f77d6abb ("add mt7601u driver")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Acked-by: Jakub Kicinski <kubakici@wp.pl>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210225183241.1002129-1-colin.king@canonical.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wireless/mediatek/mt7601u/eeprom.c b/drivers/net/wireless/mediatek/mt7601u/eeprom.c
index 76117b402880..6ab1035e4a12 100644
--- a/drivers/net/wireless/mediatek/mt7601u/eeprom.c
+++ b/drivers/net/wireless/mediatek/mt7601u/eeprom.c
@@ -107,7 +107,7 @@ mt7601u_has_tssi(struct mt7601u_dev *dev, u8 *eeprom)
 {
 	u16 nic_conf1 = get_unaligned_le16(eeprom + MT_EE_NIC_CONF_1);
 
-	return ~nic_conf1 && (nic_conf1 & MT_EE_NIC_CONF_1_TX_ALC_EN);
+	return (u16)~nic_conf1 && (nic_conf1 & MT_EE_NIC_CONF_1_TX_ALC_EN);
 }
 
 static void

commit 5de1ecd2867e11ede040277c233e074613a6ec9e
Author: Johannes Berg <johannes.berg@intel.com>
Date:   Thu Apr 8 14:31:50 2021 +0200

    mac80211: bail out if cipher schemes are invalid
    
    [ Upstream commit db878e27a98106a70315d264cc92230d84009e72 ]
    
    If any of the cipher schemes specified by the driver are invalid, bail
    out and fail the registration rather than just warning.  Otherwise, we
    might later crash when we try to use the invalid cipher scheme, e.g.
    if the hdr_len is (significantly) less than the pn_offs + pn_len, we'd
    have an out-of-bounds access in RX validation.
    
    Fixes: 2475b1cc0d52 ("mac80211: add generic cipher scheme support")
    Link: https://lore.kernel.org/r/20210408143149.38a3a13a1b19.I6b7f5790fa0958ed8049cf02ac2a535c61e9bc96@changeid
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/net/mac80211/main.c b/net/mac80211/main.c
index f44d00f35fe7..e8c4e9c0c5a0 100644
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
@@ -1080,8 +1080,11 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
 	if (local->hw.wiphy->max_scan_ie_len)
 		local->hw.wiphy->max_scan_ie_len -= local->scan_ies_len;
 
-	WARN_ON(!ieee80211_cs_list_valid(local->hw.cipher_schemes,
-					 local->hw.n_cipher_schemes));
+	if (WARN_ON(!ieee80211_cs_list_valid(local->hw.cipher_schemes,
+					     local->hw.n_cipher_schemes))) {
+		result = -EINVAL;
+		goto fail_workqueue;
+	}
 
 	result = ieee80211_init_cipher_suites(local);
 	if (result < 0)

commit b2fedee1f8af75011f5858e7883baf5b19e28fb1
Author: Randy Dunlap <rdunlap@infradead.org>
Date:   Sun Apr 4 12:26:23 2021 -0700

    powerpc: iommu: fix build when neither PCI or IBMVIO is set
    
    [ Upstream commit b27dadecdf9102838331b9a0b41ffc1cfe288154 ]
    
    When neither CONFIG_PCI nor CONFIG_IBMVIO is set/enabled, iommu.c has a
    build error. The fault injection code is not useful in that kernel config,
    so make the FAIL_IOMMU option depend on PCI || IBMVIO.
    
    Prevents this build error (warning escalated to error):
    ../arch/powerpc/kernel/iommu.c:178:30: error: 'fail_iommu_bus_notifier' defined but not used [-Werror=unused-variable]
      178 | static struct notifier_block fail_iommu_bus_notifier = {
    
    Fixes: d6b9a81b2a45 ("powerpc: IOMMU fault injection")
    Reported-by: kernel test robot <lkp@intel.com>
    Suggested-by: Michael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
    Acked-by: Randy Dunlap <rdunlap@infradead.org> # build-tested
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210404192623.10697-1-rdunlap@infradead.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug
index fd63cd914a74..ffe0cf0f0bea 100644
--- a/arch/powerpc/Kconfig.debug
+++ b/arch/powerpc/Kconfig.debug
@@ -350,6 +350,7 @@ config PPC_EARLY_DEBUG_CPM_ADDR
 config FAIL_IOMMU
 	bool "Fault-injection capability for IOMMU"
 	depends on FAULT_INJECTION
+	depends on PCI || IBMVIO
 	help
 	  Provide fault-injection capability for IOMMU. Each device can
 	  be selectively enabled via the fail_iommu property.

commit 2a70edb85e6db77b07fdb3ac477291cbf6c7824a
Author: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Date:   Tue Apr 6 12:16:01 2021 -0400

    powerpc/perf: Fix PMU constraint check for EBB events
    
    [ Upstream commit 10f8f96179ecc7f69c927f6d231f6d02736cea83 ]
    
    The power PMU group constraints includes check for EBB events to make
    sure all events in a group must agree on EBB. This will prevent
    scheduling EBB and non-EBB events together. But in the existing check,
    settings for constraint mask and value is interchanged. Patch fixes the
    same.
    
    Before the patch, PMU selftest "cpu_event_pinned_vs_ebb_test" fails with
    below in dmesg logs. This happens because EBB event gets enabled along
    with a non-EBB cpu event.
    
      [35600.453346] cpu_event_pinne[41326]: illegal instruction (4)
      at 10004a18 nip 10004a18 lr 100049f8 code 1 in
      cpu_event_pinned_vs_ebb_test[10000000+10000]
    
    Test results after the patch:
    
      $ ./pmu/ebb/cpu_event_pinned_vs_ebb_test
      test: cpu_event_pinned_vs_ebb
      tags: git_version:v5.12-rc5-93-gf28c3125acd3-dirty
      Binding to cpu 8
      EBB Handler is at 0x100050c8
      read error on event 0x7fffe6bd4040!
      PM_RUN_INST_CMPL: result 9872 running/enabled 37930432
      success: cpu_event_pinned_vs_ebb
    
    This bug was hidden by other logic until commit 1908dc911792 (perf:
    Tweak perf_event_attr::exclusive semantics).
    
    Fixes: 4df489991182 ("powerpc/perf: Add power8 EBB support")
    Reported-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
    Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
    [mpe: Mention commit 1908dc911792]
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/1617725761-1464-1-git-send-email-atrajeev@linux.vnet.ibm.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/powerpc/perf/isa207-common.c b/arch/powerpc/perf/isa207-common.c
index 69a2dc2b16cf..a1ff4142cc6a 100644
--- a/arch/powerpc/perf/isa207-common.c
+++ b/arch/powerpc/perf/isa207-common.c
@@ -359,8 +359,8 @@ int isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp)
 	 * EBB events are pinned & exclusive, so this should never actually
 	 * hit, but we leave it as a fallback in case.
 	 */
-	mask  |= CNST_EBB_VAL(ebb);
-	value |= CNST_EBB_MASK;
+	mask  |= CNST_EBB_MASK;
+	value |= CNST_EBB_VAL(ebb);
 
 	*maskp = mask;
 	*valp = value;

commit b3d5d0983388d6c4fb35f7d722556d5595f167a7
Author: Jordan Niethe <jniethe5@gmail.com>
Date:   Mon Feb 8 14:29:56 2021 +1100

    powerpc/64s: Fix pte update for kernel memory on radix
    
    [ Upstream commit b8b2f37cf632434456182e9002d63cbc4cccc50c ]
    
    When adding a PTE a ptesync is needed to order the update of the PTE
    with subsequent accesses otherwise a spurious fault may be raised.
    
    radix__set_pte_at() does not do this for performance gains. For
    non-kernel memory this is not an issue as any faults of this kind are
    corrected by the page fault handler. For kernel memory these faults
    are not handled. The current solution is that there is a ptesync in
    flush_cache_vmap() which should be called when mapping from the
    vmalloc region.
    
    However, map_kernel_page() does not call flush_cache_vmap(). This is
    troublesome in particular for code patching with Strict RWX on radix.
    In do_patch_instruction() the page frame that contains the instruction
    to be patched is mapped and then immediately patched. With no ordering
    or synchronization between setting up the PTE and writing to the page
    it is possible for faults.
    
    As the code patching is done using __put_user_asm_goto() the resulting
    fault is obscured - but using a normal store instead it can be seen:
    
      BUG: Unable to handle kernel data access on write at 0xc008000008f24a3c
      Faulting instruction address: 0xc00000000008bd74
      Oops: Kernel access of bad area, sig: 11 [#1]
      LE PAGE_SIZE=64K MMU=Radix SMP NR_CPUS=2048 NUMA PowerNV
      Modules linked in: nop_module(PO+) [last unloaded: nop_module]
      CPU: 4 PID: 757 Comm: sh Tainted: P           O      5.10.0-rc5-01361-ge3c1b78c8440-dirty #43
      NIP:  c00000000008bd74 LR: c00000000008bd50 CTR: c000000000025810
      REGS: c000000016f634a0 TRAP: 0300   Tainted: P           O       (5.10.0-rc5-01361-ge3c1b78c8440-dirty)
      MSR:  9000000000009033 <SF,HV,EE,ME,IR,DR,RI,LE>  CR: 44002884  XER: 00000000
      CFAR: c00000000007c68c DAR: c008000008f24a3c DSISR: 42000000 IRQMASK: 1
    
    This results in the kind of issue reported here:
      https://lore.kernel.org/linuxppc-dev/15AC5B0E-A221-4B8C-9039-FA96B8EF7C88@lca.pw/
    
    Chris Riedl suggested a reliable way to reproduce the issue:
      $ mount -t debugfs none /sys/kernel/debug
      $ (while true; do echo function > /sys/kernel/debug/tracing/current_tracer ; echo nop > /sys/kernel/debug/tracing/current_tracer ; done) &
    
    Turning ftrace on and off does a large amount of code patching which
    in usually less then 5min will crash giving a trace like:
    
       ftrace-powerpc: (____ptrval____): replaced (4b473b11) != old (60000000)
       ------------[ ftrace bug ]------------
       ftrace failed to modify
       [<c000000000bf8e5c>] napi_busy_loop+0xc/0x390
        actual:   11:3b:47:4b
       Setting ftrace call site to call ftrace function
       ftrace record flags: 80000001
        (1)
        expected tramp: c00000000006c96c
       ------------[ cut here ]------------
       WARNING: CPU: 4 PID: 809 at kernel/trace/ftrace.c:2065 ftrace_bug+0x28c/0x2e8
       Modules linked in: nop_module(PO-) [last unloaded: nop_module]
       CPU: 4 PID: 809 Comm: sh Tainted: P           O      5.10.0-rc5-01360-gf878ccaf250a #1
       NIP:  c00000000024f334 LR: c00000000024f330 CTR: c0000000001a5af0
       REGS: c000000004c8b760 TRAP: 0700   Tainted: P           O       (5.10.0-rc5-01360-gf878ccaf250a)
       MSR:  900000000282b033 <SF,HV,VEC,VSX,EE,FP,ME,IR,DR,RI,LE>  CR: 28008848  XER: 20040000
       CFAR: c0000000001a9c98 IRQMASK: 0
       GPR00: c00000000024f330 c000000004c8b9f0 c000000002770600 0000000000000022
       GPR04: 00000000ffff7fff c000000004c8b6d0 0000000000000027 c0000007fe9bcdd8
       GPR08: 0000000000000023 ffffffffffffffd8 0000000000000027 c000000002613118
       GPR12: 0000000000008000 c0000007fffdca00 0000000000000000 0000000000000000
       GPR16: 0000000023ec37c5 0000000000000000 0000000000000000 0000000000000008
       GPR20: c000000004c8bc90 c0000000027a2d20 c000000004c8bcd0 c000000002612fe8
       GPR24: 0000000000000038 0000000000000030 0000000000000028 0000000000000020
       GPR28: c000000000ff1b68 c000000000bf8e5c c00000000312f700 c000000000fbb9b0
       NIP ftrace_bug+0x28c/0x2e8
       LR  ftrace_bug+0x288/0x2e8
       Call Trace:
         ftrace_bug+0x288/0x2e8 (unreliable)
         ftrace_modify_all_code+0x168/0x210
         arch_ftrace_update_code+0x18/0x30
         ftrace_run_update_code+0x44/0xc0
         ftrace_startup+0xf8/0x1c0
         register_ftrace_function+0x4c/0xc0
         function_trace_init+0x80/0xb0
         tracing_set_tracer+0x2a4/0x4f0
         tracing_set_trace_write+0xd4/0x130
         vfs_write+0xf0/0x330
         ksys_write+0x84/0x140
         system_call_exception+0x14c/0x230
         system_call_common+0xf0/0x27c
    
    To fix this when updating kernel memory PTEs using ptesync.
    
    Fixes: f1cb8f9beba8 ("powerpc/64s/radix: avoid ptesync after set_pte and ptep_set_access_flags")
    Signed-off-by: Jordan Niethe <jniethe5@gmail.com>
    Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
    [mpe: Tidy up change log slightly]
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210208032957.1232102-1-jniethe5@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/powerpc/include/asm/book3s/64/radix.h b/arch/powerpc/include/asm/book3s/64/radix.h
index da01badef0cb..04b2bffbc5c9 100644
--- a/arch/powerpc/include/asm/book3s/64/radix.h
+++ b/arch/powerpc/include/asm/book3s/64/radix.h
@@ -204,8 +204,10 @@ static inline void radix__set_pte_at(struct mm_struct *mm, unsigned long addr,
 	 * from ptesync, it should probably go into update_mmu_cache, rather
 	 * than set_pte_at (which is used to set ptes unrelated to faults).
 	 *
-	 * Spurious faults to vmalloc region are not tolerated, so there is
-	 * a ptesync in flush_cache_vmap.
+	 * Spurious faults from the kernel memory are not tolerated, so there
+	 * is a ptesync in flush_cache_vmap, and __map_kernel_page() follows
+	 * the pte update sequence from ISA Book III 6.10 Translation Table
+	 * Update Synchronization Requirements.
 	 */
 }
 
diff --git a/arch/powerpc/mm/pgtable-radix.c b/arch/powerpc/mm/pgtable-radix.c
index 5404a631d583..9ee235fca427 100644
--- a/arch/powerpc/mm/pgtable-radix.c
+++ b/arch/powerpc/mm/pgtable-radix.c
@@ -115,7 +115,7 @@ static int early_map_kernel_page(unsigned long ea, unsigned long pa,
 
 set_the_pte:
 	set_pte_at(&init_mm, ea, ptep, pfn_pte(pfn, flags));
-	smp_wmb();
+	asm volatile("ptesync": : :"memory");
 	return 0;
 }
 
@@ -169,7 +169,7 @@ static int __map_kernel_page(unsigned long ea, unsigned long pa,
 
 set_the_pte:
 	set_pte_at(&init_mm, ea, ptep, pfn_pte(pfn, flags));
-	smp_wmb();
+	asm volatile("ptesync": : :"memory");
 	return 0;
 }
 

commit 85ab024c69fa865a044c586aeb50e6459cd59c37
Author: Colin Ian King <colin.king@canonical.com>
Date:   Wed Apr 7 11:12:48 2021 +0100

    liquidio: Fix unintented sign extension of a left shift of a u16
    
    [ Upstream commit 298b58f00c0f86868ea717426beb5c1198772f81 ]
    
    The macro CN23XX_PEM_BAR1_INDEX_REG is being used to shift oct->pcie_port
    (a u16) left 24 places. There are two subtle issues here, first the
    shift gets promoted to an signed int and then sign extended to a u64.
    If oct->pcie_port is 0x80 or more then the upper bits get sign extended
    to 1. Secondly shfiting a u16 24 bits will lead to an overflow so it
    needs to be cast to a u64 for all the bits to not overflow.
    
    It is entirely possible that the u16 port value is never large enough
    for this to fail, but it is useful to fix unintended overflows such
    as this.
    
    Fix this by casting the port parameter to the macro to a u64 before
    the shift.
    
    Addresses-Coverity: ("Unintended sign extension")
    Fixes: 5bc67f587ba7 ("liquidio: CN23XX register definitions")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_regs.h b/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_regs.h
index e6d4ad99cc38..3f1c189646f4 100644
--- a/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_regs.h
+++ b/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_regs.h
@@ -521,7 +521,7 @@
 #define    CN23XX_BAR1_INDEX_OFFSET                3
 
 #define    CN23XX_PEM_BAR1_INDEX_REG(port, idx)		\
-		(CN23XX_PEM_BAR1_INDEX_START + ((port) << CN23XX_PEM_OFFSET) + \
+		(CN23XX_PEM_BAR1_INDEX_START + (((u64)port) << CN23XX_PEM_OFFSET) + \
 		 ((idx) << CN23XX_BAR1_INDEX_OFFSET))
 
 /*############################ DPI #########################*/

commit ccb8774aff5b0301472c1a17c69ef999c5a82221
Author: Takashi Iwai <tiwai@suse.de>
Date:   Tue Apr 6 13:35:34 2021 +0200

    ALSA: usb-audio: Add error checks for usb_driver_claim_interface() calls
    
    [ Upstream commit 5fb45414ae03421255593fd5556aa2d1d82303aa ]
    
    There are a few calls of usb_driver_claim_interface() but all of those
    miss the proper error checks, as reported by Coverity.  This patch
    adds those missing checks.
    
    Along with it, replace the magic pointer with -1 with a constant
    USB_AUDIO_IFACE_UNUSED for better readability.
    
    Reported-by: coverity-bot <keescook+coverity-bot@chromium.org>
    Addresses-Coverity-ID: 1475943 ("Error handling issues")
    Addresses-Coverity-ID: 1475944 ("Error handling issues")
    Addresses-Coverity-ID: 1475945 ("Error handling issues")
    Fixes: b1ce7ba619d9 ("ALSA: usb-audio: claim autodetected PCM interfaces all at once")
    Fixes: e5779998bf8b ("ALSA: usb-audio: refactor code")
    Link: https://lore.kernel.org/r/202104051059.FB7F3016@keescook
    Link: https://lore.kernel.org/r/20210406113534.30455-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/usb/card.c b/sound/usb/card.c
index ba096cb4a53e..ce8925e8419e 100644
--- a/sound/usb/card.c
+++ b/sound/usb/card.c
@@ -189,9 +189,8 @@ static int snd_usb_create_stream(struct snd_usb_audio *chip, int ctrlif, int int
 				ctrlif, interface);
 			return -EINVAL;
 		}
-		usb_driver_claim_interface(&usb_audio_driver, iface, (void *)-1L);
-
-		return 0;
+		return usb_driver_claim_interface(&usb_audio_driver, iface,
+						  USB_AUDIO_IFACE_UNUSED);
 	}
 
 	if ((altsd->bInterfaceClass != USB_CLASS_AUDIO &&
@@ -211,7 +210,8 @@ static int snd_usb_create_stream(struct snd_usb_audio *chip, int ctrlif, int int
 
 	if (! snd_usb_parse_audio_interface(chip, interface)) {
 		usb_set_interface(dev, interface, 0); /* reset the current interface */
-		usb_driver_claim_interface(&usb_audio_driver, iface, (void *)-1L);
+		return usb_driver_claim_interface(&usb_audio_driver, iface,
+						  USB_AUDIO_IFACE_UNUSED);
 	}
 
 	return 0;
@@ -707,7 +707,7 @@ static void usb_audio_disconnect(struct usb_interface *intf)
 	struct snd_card *card;
 	struct list_head *p;
 
-	if (chip == (void *)-1L)
+	if (chip == USB_AUDIO_IFACE_UNUSED)
 		return;
 
 	card = chip->card;
@@ -807,7 +807,7 @@ static int usb_audio_suspend(struct usb_interface *intf, pm_message_t message)
 	struct usb_mixer_interface *mixer;
 	struct list_head *p;
 
-	if (chip == (void *)-1L)
+	if (chip == USB_AUDIO_IFACE_UNUSED)
 		return 0;
 
 	if (!chip->num_suspended_intf++) {
@@ -839,7 +839,7 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume)
 	struct list_head *p;
 	int err = 0;
 
-	if (chip == (void *)-1L)
+	if (chip == USB_AUDIO_IFACE_UNUSED)
 		return 0;
 
 	atomic_inc(&chip->active); /* avoid autopm */
diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
index 717edf3b5d3e..b5f2b18b8b42 100644
--- a/sound/usb/quirks.c
+++ b/sound/usb/quirks.c
@@ -66,8 +66,12 @@ static int create_composite_quirk(struct snd_usb_audio *chip,
 		if (!iface)
 			continue;
 		if (quirk->ifnum != probed_ifnum &&
-		    !usb_interface_claimed(iface))
-			usb_driver_claim_interface(driver, iface, (void *)-1L);
+		    !usb_interface_claimed(iface)) {
+			err = usb_driver_claim_interface(driver, iface,
+							 USB_AUDIO_IFACE_UNUSED);
+			if (err < 0)
+				return err;
+		}
 	}
 
 	return 0;
@@ -401,8 +405,12 @@ static int create_autodetect_quirks(struct snd_usb_audio *chip,
 			continue;
 
 		err = create_autodetect_quirk(chip, iface, driver);
-		if (err >= 0)
-			usb_driver_claim_interface(driver, iface, (void *)-1L);
+		if (err >= 0) {
+			err = usb_driver_claim_interface(driver, iface,
+							 USB_AUDIO_IFACE_UNUSED);
+			if (err < 0)
+				return err;
+		}
 	}
 
 	return 0;
diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h
index 0d620c267e7a..0c7ea78317fc 100644
--- a/sound/usb/usbaudio.h
+++ b/sound/usb/usbaudio.h
@@ -68,6 +68,8 @@ struct snd_usb_audio {
 	struct usb_host_interface *ctrl_intf;	/* the audio control interface */
 };
 
+#define USB_AUDIO_IFACE_UNUSED	((void *)-1L)
+
 #define usb_audio_err(chip, fmt, args...) \
 	dev_err(&(chip)->dev->dev, fmt, ##args)
 #define usb_audio_warn(chip, fmt, args...) \

commit d9251dd71ef99d0d43ea2ce3fd319e9454ac79a3
Author: Salil Mehta <salil.mehta@huawei.com>
Date:   Mon Apr 5 18:28:25 2021 +0100

    net: hns3: Limiting the scope of vector_ring_chain variable
    
    [ Upstream commit d392ecd1bc29ae15b0e284d5f732c2d36f244271 ]
    
    Limiting the scope of the variable vector_ring_chain to the block where it
    is used.
    
    Fixes: 424eb834a9be ("net: hns3: Unified HNS3 {VF|PF} Ethernet Driver for hip08 SoC")
    Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
index 3eb8b85f6afb..3b89673f09da 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
@@ -2639,7 +2639,6 @@ static void hns3_add_ring_to_group(struct hns3_enet_ring_group *group,
 
 static int hns3_nic_init_vector_data(struct hns3_nic_priv *priv)
 {
-	struct hnae3_ring_chain_node vector_ring_chain;
 	struct hnae3_handle *h = priv->ae_handle;
 	struct hns3_enet_tqp_vector *tqp_vector;
 	int ret = 0;
@@ -2669,6 +2668,8 @@ static int hns3_nic_init_vector_data(struct hns3_nic_priv *priv)
 	}
 
 	for (i = 0; i < priv->vector_num; i++) {
+		struct hnae3_ring_chain_node vector_ring_chain;
+
 		tqp_vector = &priv->tqp_vector[i];
 
 		tqp_vector->rx_group.total_bytes = 0;

commit e025909a4ababf9e290dc02fa25c5fc2283ab98c
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Fri Apr 2 14:44:42 2021 +0300

    nfc: pn533: prevent potential memory corruption
    
    [ Upstream commit ca4d4c34ae9aa5c3c0da76662c5e549d2fc0cc86 ]
    
    If the "type_a->nfcid_len" is too large then it would lead to memory
    corruption in pn533_target_found_type_a() when we do:
    
            memcpy(nfc_tgt->nfcid1, tgt_type_a->nfcid_data, nfc_tgt->nfcid1_len);
    
    Fixes: c3b1e1e8a76f ("NFC: Export NFCID1 from pn533")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/nfc/pn533/pn533.c b/drivers/nfc/pn533/pn533.c
index a0cc1cc45292..01da9331f4cb 100644
--- a/drivers/nfc/pn533/pn533.c
+++ b/drivers/nfc/pn533/pn533.c
@@ -692,6 +692,9 @@ static bool pn533_target_type_a_is_valid(struct pn533_target_type_a *type_a,
 	if (PN533_TYPE_A_SEL_CASCADE(type_a->sel_res) != 0)
 		return false;
 
+	if (type_a->nfcid_len > NFC_NFCID1_MAXSIZE)
+		return false;
+
 	return true;
 }
 

commit a3e351fa237ee636916d4b973b23452601cda9f5
Author: Andrew Scull <ascull@google.com>
Date:   Thu Mar 18 14:33:07 2021 +0000

    bug: Remove redundant condition check in report_bug
    
    [ Upstream commit 3ad1a6cb0abc63d036fc866bd7c2c5983516dec5 ]
    
    report_bug() will return early if it cannot find a bug corresponding to
    the provided address. The subsequent test for the bug will always be
    true so remove it.
    
    Fixes: 1b4cfe3c0a30d ("lib/bug.c: exclude non-BUG/WARN exceptions from report_bug()")
    Signed-off-by: Andrew Scull <ascull@google.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: "Steven Rostedt (VMware)" <rostedt@goodmis.org>
    Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Acked-by: Will Deacon <will@kernel.org>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20210318143311.839894-2-ascull@google.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/lib/bug.c b/lib/bug.c
index 1077366f496b..f4fcac5dd766 100644
--- a/lib/bug.c
+++ b/lib/bug.c
@@ -155,30 +155,27 @@ enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs)
 
 	file = NULL;
 	line = 0;
-	warning = 0;
 
-	if (bug) {
 #ifdef CONFIG_DEBUG_BUGVERBOSE
 #ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
-		file = bug->file;
+	file = bug->file;
 #else
-		file = (const char *)bug + bug->file_disp;
+	file = (const char *)bug + bug->file_disp;
 #endif
-		line = bug->line;
+	line = bug->line;
 #endif
-		warning = (bug->flags & BUGFLAG_WARNING) != 0;
-		once = (bug->flags & BUGFLAG_ONCE) != 0;
-		done = (bug->flags & BUGFLAG_DONE) != 0;
-
-		if (warning && once) {
-			if (done)
-				return BUG_TRAP_TYPE_WARN;
-
-			/*
-			 * Since this is the only store, concurrency is not an issue.
-			 */
-			bug->flags |= BUGFLAG_DONE;
-		}
+	warning = (bug->flags & BUGFLAG_WARNING) != 0;
+	once = (bug->flags & BUGFLAG_ONCE) != 0;
+	done = (bug->flags & BUGFLAG_DONE) != 0;
+
+	if (warning && once) {
+		if (done)
+			return BUG_TRAP_TYPE_WARN;
+
+		/*
+		 * Since this is the only store, concurrency is not an issue.
+		 */
+		bug->flags |= BUGFLAG_DONE;
 	}
 
 	if (warning) {

commit 943e195a620d8bc8da2dd60efa804c5eb454a889
Author: Jia Zhou <zhou.jia2@zte.com.cn>
Date:   Tue Mar 30 13:19:23 2021 +0200

    ALSA: core: remove redundant spin_lock pair in snd_card_disconnect
    
    [ Upstream commit abc21649b3e5c34b143bf86f0c78e33d5815e250 ]
    
    modification in commit 2a3f7221acdd ("ALSA: core: Fix card races between
    register and disconnect") resulting in this problem.
    
    Fixes: 2a3f7221acdd ("ALSA: core: Fix card races between register and disconnect")
    Signed-off-by: Jia Zhou <zhou.jia2@zte.com.cn>
    Signed-off-by: Yi Wang <wang.yi59@zte.com.cn>
    Link: https://lore.kernel.org/r/1616989007-34429-1-git-send-email-wang.yi59@zte.com.cn
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/sound/core/init.c b/sound/core/init.c
index 16b7cc7aa66b..3eafa15006f8 100644
--- a/sound/core/init.c
+++ b/sound/core/init.c
@@ -405,10 +405,8 @@ int snd_card_disconnect(struct snd_card *card)
 		return 0;
 	}
 	card->shutdown = 1;
-	spin_unlock(&card->files_lock);
 
 	/* replace file->f_op with special dummy operations */
-	spin_lock(&card->files_lock);
 	list_for_each_entry(mfile, &card->files_list, list) {
 		/* it's critical part, use endless loop */
 		/* we have no room to fail */

commit 706d8600af49f80ef496e16460c2a377ea110f2e
Author: Chen Huang <chenhuang5@huawei.com>
Date:   Sat Mar 27 09:49:00 2021 +0000

    powerpc: Fix HAVE_HARDLOCKUP_DETECTOR_ARCH build configuration
    
    [ Upstream commit 4fe529449d85e78972fa327999961ecc83a0b6db ]
    
    When compiling the powerpc with the SMP disabled, it shows the issue:
    
    arch/powerpc/kernel/watchdog.c: In function ?watchdog_smp_panic??
    arch/powerpc/kernel/watchdog.c:177:4: error: implicit declaration of function ?smp_send_nmi_ipi?? did you mean ?smp_send_stop?? [-Werror=implicit-function-declaration]
      177 |    smp_send_nmi_ipi(c, wd_lockup_ipi, 1000000);
          |    ^~~~~~~~~~~~~~~~
          |    smp_send_stop
    cc1: all warnings being treated as errors
    make[2]: *** [scripts/Makefile.build:273: arch/powerpc/kernel/watchdog.o] Error 1
    make[1]: *** [scripts/Makefile.build:534: arch/powerpc/kernel] Error 2
    make: *** [Makefile:1980: arch/powerpc] Error 2
    make: *** Waiting for unfinished jobs....
    
    We found that powerpc used ipi to implement hardlockup watchdog, so the
    HAVE_HARDLOCKUP_DETECTOR_ARCH should depend on the SMP.
    
    Fixes: 2104180a5369 ("powerpc/64s: implement arch-specific hardlockup watchdog")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Chen Huang <chenhuang5@huawei.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210327094900.938555-1-chenhuang5@huawei.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 6dd2a14e1ebc..f0e09d5f0bed 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -208,7 +208,7 @@ config PPC
 	select HAVE_MEMBLOCK_NODE_MAP
 	select HAVE_MOD_ARCH_SPECIFIC
 	select HAVE_NMI				if PERF_EVENTS || (PPC64 && PPC_BOOK3S)
-	select HAVE_HARDLOCKUP_DETECTOR_ARCH	if (PPC64 && PPC_BOOK3S)
+	select HAVE_HARDLOCKUP_DETECTOR_ARCH	if PPC64 && PPC_BOOK3S && SMP
 	select HAVE_OPROFILE
 	select HAVE_OPTPROBES			if PPC64
 	select HAVE_PERF_EVENTS

commit d9f0289ad99022821dba3b32f3aa81a9d3be5dfd
Author: Nathan Chancellor <nathan@kernel.org>
Date:   Tue Mar 2 13:08:29 2021 -0700

    powerpc/prom: Mark identical_pvr_fixup as __init
    
    [ Upstream commit 1ef1dd9c7ed27b080445e1576e8a05957e0e4dfc ]
    
    If identical_pvr_fixup() is not inlined, there are two modpost warnings:
    
    WARNING: modpost: vmlinux.o(.text+0x54e8): Section mismatch in reference
    from the function identical_pvr_fixup() to the function
    .init.text:of_get_flat_dt_prop()
    The function identical_pvr_fixup() references
    the function __init of_get_flat_dt_prop().
    This is often because identical_pvr_fixup lacks a __init
    annotation or the annotation of of_get_flat_dt_prop is wrong.
    
    WARNING: modpost: vmlinux.o(.text+0x551c): Section mismatch in reference
    from the function identical_pvr_fixup() to the function
    .init.text:identify_cpu()
    The function identical_pvr_fixup() references
    the function __init identify_cpu().
    This is often because identical_pvr_fixup lacks a __init
    annotation or the annotation of identify_cpu is wrong.
    
    identical_pvr_fixup() calls two functions marked as __init and is only
    called by a function marked as __init so it should be marked as __init
    as well. At the same time, remove the inline keywork as it is not
    necessary to inline this function. The compiler is still free to do so
    if it feels it is worthwhile since commit 889b3c1245de ("compiler:
    remove CONFIG_OPTIMIZE_INLINING entirely").
    
    Fixes: 14b3d926a22b ("[POWERPC] 4xx: update 440EP(x)/440GR(x) identical PVR issue workaround")
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://github.com/ClangBuiltLinux/linux/issues/1316
    Link: https://lore.kernel.org/r/20210302200829.2680663-1-nathan@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c
index fd04692412db..f8c49e5d4bd3 100644
--- a/arch/powerpc/kernel/prom.c
+++ b/arch/powerpc/kernel/prom.c
@@ -266,7 +266,7 @@ static struct feature_property {
 };
 
 #if defined(CONFIG_44x) && defined(CONFIG_PPC_FPU)
-static inline void identical_pvr_fixup(unsigned long node)
+static __init void identical_pvr_fixup(unsigned long node)
 {
 	unsigned int pvr;
 	const char *model = of_get_flat_dt_prop(node, "model", NULL);

commit 8e352671cfb860fd1ef5b5e87ff372a212e3bebf
Author: Xie He <xie.he.0141@gmail.com>
Date:   Wed Mar 10 23:23:09 2021 -0800

    net: lapbether: Prevent racing when checking whether the netif is running
    
    [ Upstream commit 5acd0cfbfbb5a688da1bfb1a2152b0c855115a35 ]
    
    There are two "netif_running" checks in this driver. One is in
    "lapbeth_xmit" and the other is in "lapbeth_rcv". They serve to make
    sure that the LAPB APIs called in these functions are called before
    "lapb_unregister" is called by the "ndo_stop" function.
    
    However, these "netif_running" checks are unreliable, because it's
    possible that immediately after "netif_running" returns true, "ndo_stop"
    is called (which causes "lapb_unregister" to be called).
    
    This patch adds locking to make sure "lapbeth_xmit" and "lapbeth_rcv" can
    reliably check and ensure the netif is running while doing their work.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Xie He <xie.he.0141@gmail.com>
    Acked-by: Martin Schiller <ms@dev.tdt.de>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wan/lapbether.c b/drivers/net/wan/lapbether.c
index fad5fc8b9edb..3ec922bed2d8 100644
--- a/drivers/net/wan/lapbether.c
+++ b/drivers/net/wan/lapbether.c
@@ -56,6 +56,8 @@ struct lapbethdev {
 	struct list_head	node;
 	struct net_device	*ethdev;	/* link to ethernet device */
 	struct net_device	*axdev;		/* lapbeth device (lapb#) */
+	bool			up;
+	spinlock_t		up_lock;	/* Protects "up" */
 };
 
 static LIST_HEAD(lapbeth_devices);
@@ -103,8 +105,9 @@ static int lapbeth_rcv(struct sk_buff *skb, struct net_device *dev, struct packe
 	rcu_read_lock();
 	lapbeth = lapbeth_get_x25_dev(dev);
 	if (!lapbeth)
-		goto drop_unlock;
-	if (!netif_running(lapbeth->axdev))
+		goto drop_unlock_rcu;
+	spin_lock_bh(&lapbeth->up_lock);
+	if (!lapbeth->up)
 		goto drop_unlock;
 
 	len = skb->data[0] + skb->data[1] * 256;
@@ -119,11 +122,14 @@ static int lapbeth_rcv(struct sk_buff *skb, struct net_device *dev, struct packe
 		goto drop_unlock;
 	}
 out:
+	spin_unlock_bh(&lapbeth->up_lock);
 	rcu_read_unlock();
 	return 0;
 drop_unlock:
 	kfree_skb(skb);
 	goto out;
+drop_unlock_rcu:
+	rcu_read_unlock();
 drop:
 	kfree_skb(skb);
 	return 0;
@@ -151,13 +157,11 @@ static int lapbeth_data_indication(struct net_device *dev, struct sk_buff *skb)
 static netdev_tx_t lapbeth_xmit(struct sk_buff *skb,
 				      struct net_device *dev)
 {
+	struct lapbethdev *lapbeth = netdev_priv(dev);
 	int err;
 
-	/*
-	 * Just to be *really* sure not to send anything if the interface
-	 * is down, the ethernet device may have gone.
-	 */
-	if (!netif_running(dev))
+	spin_lock_bh(&lapbeth->up_lock);
+	if (!lapbeth->up)
 		goto drop;
 
 	/* There should be a pseudo header of 1 byte added by upper layers.
@@ -188,6 +192,7 @@ static netdev_tx_t lapbeth_xmit(struct sk_buff *skb,
 		goto drop;
 	}
 out:
+	spin_unlock_bh(&lapbeth->up_lock);
 	return NETDEV_TX_OK;
 drop:
 	kfree_skb(skb);
@@ -279,6 +284,7 @@ static const struct lapb_register_struct lapbeth_callbacks = {
  */
 static int lapbeth_open(struct net_device *dev)
 {
+	struct lapbethdev *lapbeth = netdev_priv(dev);
 	int err;
 
 	if ((err = lapb_register(dev, &lapbeth_callbacks)) != LAPB_OK) {
@@ -286,13 +292,22 @@ static int lapbeth_open(struct net_device *dev)
 		return -ENODEV;
 	}
 
+	spin_lock_bh(&lapbeth->up_lock);
+	lapbeth->up = true;
+	spin_unlock_bh(&lapbeth->up_lock);
+
 	return 0;
 }
 
 static int lapbeth_close(struct net_device *dev)
 {
+	struct lapbethdev *lapbeth = netdev_priv(dev);
 	int err;
 
+	spin_lock_bh(&lapbeth->up_lock);
+	lapbeth->up = false;
+	spin_unlock_bh(&lapbeth->up_lock);
+
 	if ((err = lapb_unregister(dev)) != LAPB_OK)
 		pr_err("lapb_unregister error: %d\n", err);
 
@@ -350,6 +365,9 @@ static int lapbeth_new_device(struct net_device *dev)
 	dev_hold(dev);
 	lapbeth->ethdev = dev;
 
+	lapbeth->up = false;
+	spin_lock_init(&lapbeth->up_lock);
+
 	rc = -EIO;
 	if (register_netdevice(ndev))
 		goto fail;

commit eda1827e6dbfa1db4be06f7e01f862549d711b04
Author: Arnaldo Carvalho de Melo <acme@redhat.com>
Date:   Mon Mar 8 11:17:51 2021 -0300

    perf symbols: Fix dso__fprintf_symbols_by_name() to return the number of printed chars
    
    [ Upstream commit 210e4c89ef61432040c6cd828fefa441f4887186 ]
    
    The 'ret' variable was initialized to zero but then it was not updated
    from the fprintf() return, fix it.
    
    Reported-by: Yang Li <yang.lee@linux.alibaba.com>
    cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    cc: Ingo Molnar <mingo@redhat.com>
    cc: Jiri Olsa <jolsa@redhat.com>
    cc: Mark Rutland <mark.rutland@arm.com>
    cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
    Fixes: 90f18e63fbd00513 ("perf symbols: List symbols in a dso in ascending name order")
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/tools/perf/util/symbol_fprintf.c b/tools/perf/util/symbol_fprintf.c
index ed0205cc7942..1fd175bb4600 100644
--- a/tools/perf/util/symbol_fprintf.c
+++ b/tools/perf/util/symbol_fprintf.c
@@ -66,7 +66,7 @@ size_t dso__fprintf_symbols_by_name(struct dso *dso,
 
 	for (nd = rb_first(&dso->symbol_names); nd; nd = rb_next(nd)) {
 		pos = rb_entry(nd, struct symbol_name_rb_node, rb_node);
-		fprintf(fp, "%s\n", pos->sym.name);
+		ret += fprintf(fp, "%s\n", pos->sym.name);
 	}
 
 	return ret;

commit 878177b897d6fc461010735fc73b28aa69845f1c
Author: Maxim Mikityanskiy <maxtram95@gmail.com>
Date:   Sun Feb 7 16:47:40 2021 +0200

    HID: plantronics: Workaround for double volume key presses
    
    [ Upstream commit f567d6ef8606fb427636e824c867229ecb5aefab ]
    
    Plantronics Blackwire 3220 Series (047f:c056) sends HID reports twice
    for each volume key press. This patch adds a quirk to hid-plantronics
    for this product ID, which will ignore the second volume key press if
    it happens within 5 ms from the last one that was handled.
    
    The patch was tested on the mentioned model only, it shouldn't affect
    other models, however, this quirk might be needed for them too.
    Auto-repeat (when a key is held pressed) is not affected, because the
    rate is about 3 times per second, which is far less frequent than once
    in 5 ms.
    
    Fixes: 81bb773faed7 ("HID: plantronics: Update to map volume up/down controls")
    Signed-off-by: Maxim Mikityanskiy <maxtram95@gmail.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 68908dac5835..75342f3dfb86 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -904,6 +904,7 @@
 #define USB_DEVICE_ID_ORTEK_IHOME_IMAC_A210S	0x8003
 
 #define USB_VENDOR_ID_PLANTRONICS	0x047f
+#define USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3220_SERIES	0xc056
 
 #define USB_VENDOR_ID_PANASONIC		0x04da
 #define USB_DEVICE_ID_PANABOARD_UBT780	0x1044
diff --git a/drivers/hid/hid-plantronics.c b/drivers/hid/hid-plantronics.c
index 584b10d3fc3d..460711c1124a 100644
--- a/drivers/hid/hid-plantronics.c
+++ b/drivers/hid/hid-plantronics.c
@@ -16,6 +16,7 @@
 
 #include <linux/hid.h>
 #include <linux/module.h>
+#include <linux/jiffies.h>
 
 #define PLT_HID_1_0_PAGE	0xffa00000
 #define PLT_HID_2_0_PAGE	0xffa20000
@@ -39,6 +40,16 @@
 #define PLT_ALLOW_CONSUMER (field->application == HID_CP_CONSUMERCONTROL && \
 			    (usage->hid & HID_USAGE_PAGE) == HID_UP_CONSUMER)
 
+#define PLT_QUIRK_DOUBLE_VOLUME_KEYS BIT(0)
+
+#define PLT_DOUBLE_KEY_TIMEOUT 5 /* ms */
+
+struct plt_drv_data {
+	unsigned long device_type;
+	unsigned long last_volume_key_ts;
+	u32 quirks;
+};
+
 static int plantronics_input_mapping(struct hid_device *hdev,
 				     struct hid_input *hi,
 				     struct hid_field *field,
@@ -46,7 +57,8 @@ static int plantronics_input_mapping(struct hid_device *hdev,
 				     unsigned long **bit, int *max)
 {
 	unsigned short mapped_key;
-	unsigned long plt_type = (unsigned long)hid_get_drvdata(hdev);
+	struct plt_drv_data *drv_data = hid_get_drvdata(hdev);
+	unsigned long plt_type = drv_data->device_type;
 
 	/* special case for PTT products */
 	if (field->application == HID_GD_JOYSTICK)
@@ -108,6 +120,30 @@ static int plantronics_input_mapping(struct hid_device *hdev,
 	return 1;
 }
 
+static int plantronics_event(struct hid_device *hdev, struct hid_field *field,
+			     struct hid_usage *usage, __s32 value)
+{
+	struct plt_drv_data *drv_data = hid_get_drvdata(hdev);
+
+	if (drv_data->quirks & PLT_QUIRK_DOUBLE_VOLUME_KEYS) {
+		unsigned long prev_ts, cur_ts;
+
+		/* Usages are filtered in plantronics_usages. */
+
+		if (!value) /* Handle key presses only. */
+			return 0;
+
+		prev_ts = drv_data->last_volume_key_ts;
+		cur_ts = jiffies;
+		if (jiffies_to_msecs(cur_ts - prev_ts) <= PLT_DOUBLE_KEY_TIMEOUT)
+			return 1; /* Ignore the repeated key. */
+
+		drv_data->last_volume_key_ts = cur_ts;
+	}
+
+	return 0;
+}
+
 static unsigned long plantronics_device_type(struct hid_device *hdev)
 {
 	unsigned i, col_page;
@@ -136,15 +172,24 @@ static unsigned long plantronics_device_type(struct hid_device *hdev)
 static int plantronics_probe(struct hid_device *hdev,
 			     const struct hid_device_id *id)
 {
+	struct plt_drv_data *drv_data;
 	int ret;
 
+	drv_data = devm_kzalloc(&hdev->dev, sizeof(*drv_data), GFP_KERNEL);
+	if (!drv_data)
+		return -ENOMEM;
+
 	ret = hid_parse(hdev);
 	if (ret) {
 		hid_err(hdev, "parse failed\n");
 		goto err;
 	}
 
-	hid_set_drvdata(hdev, (void *)plantronics_device_type(hdev));
+	drv_data->device_type = plantronics_device_type(hdev);
+	drv_data->quirks = id->driver_data;
+	drv_data->last_volume_key_ts = jiffies - msecs_to_jiffies(PLT_DOUBLE_KEY_TIMEOUT);
+
+	hid_set_drvdata(hdev, drv_data);
 
 	ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT |
 		HID_CONNECT_HIDINPUT_FORCE | HID_CONNECT_HIDDEV_FORCE);
@@ -156,15 +201,26 @@ static int plantronics_probe(struct hid_device *hdev,
 }
 
 static const struct hid_device_id plantronics_devices[] = {
+	{ HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS,
+					 USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3220_SERIES),
+		.driver_data = PLT_QUIRK_DOUBLE_VOLUME_KEYS },
 	{ HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS, HID_ANY_ID) },
 	{ }
 };
 MODULE_DEVICE_TABLE(hid, plantronics_devices);
 
+static const struct hid_usage_id plantronics_usages[] = {
+	{ HID_CP_VOLUMEUP, EV_KEY, HID_ANY_ID },
+	{ HID_CP_VOLUMEDOWN, EV_KEY, HID_ANY_ID },
+	{ HID_TERMINATOR, HID_TERMINATOR, HID_TERMINATOR }
+};
+
 static struct hid_driver plantronics_driver = {
 	.name = "plantronics",
 	.id_table = plantronics_devices,
+	.usage_table = plantronics_usages,
 	.input_mapping = plantronics_input_mapping,
+	.event = plantronics_event,
 	.probe = plantronics_probe,
 };
 module_hid_driver(plantronics_driver);
diff --git a/include/linux/hid.h b/include/linux/hid.h
index a46b6832b373..4dcce83ca378 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -270,6 +270,8 @@ struct hid_item {
 #define HID_CP_SELECTION	0x000c0080
 #define HID_CP_MEDIASELECTION	0x000c0087
 #define HID_CP_SELECTDISC	0x000c00ba
+#define HID_CP_VOLUMEUP		0x000c00e9
+#define HID_CP_VOLUMEDOWN	0x000c00ea
 #define HID_CP_PLAYBACKSPEED	0x000c00f1
 #define HID_CP_PROXIMITY	0x000c0109
 #define HID_CP_SPEAKERSYSTEM	0x000c0160

commit 7585643856ae82e1ed105b261d4e57b384648a69
Author: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
Date:   Mon Apr 26 07:32:29 2021 -0700

    drivers/block/null_blk/main: Fix a double free in null_init.
    
    [ Upstream commit 72ce11ddfa4e9e1879103581a60b7e34547eaa0a ]
    
    In null_init, null_add_dev(dev) is called.
    In null_add_dev, it calls null_free_zoned_dev(dev) to free dev->zones
    via kvfree(dev->zones) in out_cleanup_zone branch and returns err.
    Then null_init accept the err code and then calls null_free_dev(dev).
    
    But in null_free_dev(dev), dev->zones is freed again by
    null_free_zoned_dev().
    
    My patch set dev->zones to NULL in null_free_zoned_dev() after
    kvfree(dev->zones) is called, to avoid the double free.
    
    Fixes: 2984c8684f962 ("nullb: factor disk parameters")
    Signed-off-by: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
    Link: https://lore.kernel.org/r/20210426143229.7374-1-lyl2019@mail.ustc.edu.cn
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/block/null_blk_zoned.c b/drivers/block/null_blk_zoned.c
index 079ed33fd806..ba018f1da512 100644
--- a/drivers/block/null_blk_zoned.c
+++ b/drivers/block/null_blk_zoned.c
@@ -56,6 +56,7 @@ int null_zone_init(struct nullb_device *dev)
 void null_zone_exit(struct nullb_device *dev)
 {
 	kvfree(dev->zones);
+	dev->zones = NULL;
 }
 
 static void null_zone_fill_bio(struct nullb_device *dev, struct bio *bio,

commit 302d674cfacd2a89ba16beb973c757cb977e32a0
Author: Waiman Long <longman@redhat.com>
Date:   Thu Apr 15 15:54:26 2021 -0400

    sched/debug: Fix cgroup_path[] serialization
    
    [ Upstream commit ad789f84c9a145f8a18744c0387cec22ec51651e ]
    
    The handling of sysrq key can be activated by echoing the key to
    /proc/sysrq-trigger or via the magic key sequence typed into a terminal
    that is connected to the system in some way (serial, USB or other mean).
    In the former case, the handling is done in a user context. In the
    latter case, it is likely to be in an interrupt context.
    
    Currently in print_cpu() of kernel/sched/debug.c, sched_debug_lock is
    taken with interrupt disabled for the whole duration of the calls to
    print_*_stats() and print_rq() which could last for the quite some time
    if the information dump happens on the serial console.
    
    If the system has many cpus and the sched_debug_lock is somehow busy
    (e.g. parallel sysrq-t), the system may hit a hard lockup panic
    depending on the actually serial console implementation of the
    system.
    
    The purpose of sched_debug_lock is to serialize the use of the global
    cgroup_path[] buffer in print_cpu(). The rests of the printk calls don't
    need serialization from sched_debug_lock.
    
    Calling printk() with interrupt disabled can still be problematic if
    multiple instances are running. Allocating a stack buffer of PATH_MAX
    bytes is not feasible because of the limited size of the kernel stack.
    
    The solution implemented in this patch is to allow only one caller at a
    time to use the full size group_path[], while other simultaneous callers
    will have to use shorter stack buffers with the possibility of path
    name truncation. A "..." suffix will be printed if truncation may have
    happened.  The cgroup path name is provided for informational purpose
    only, so occasional path name truncation should not be a big problem.
    
    Fixes: efe25c2c7b3a ("sched: Reinstate group names in /proc/sched_debug")
    Suggested-by: Peter Zijlstra <peterz@infradead.org>
    Signed-off-by: Waiman Long <longman@redhat.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20210415195426.6677-1-longman@redhat.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c
index 78fadf0438ea..9518606fa1e5 100644
--- a/kernel/sched/debug.c
+++ b/kernel/sched/debug.c
@@ -11,8 +11,6 @@
  */
 #include "sched.h"
 
-static DEFINE_SPINLOCK(sched_debug_lock);
-
 /*
  * This allows printing both to /proc/sched_debug and
  * to the console
@@ -434,16 +432,37 @@ static void print_cfs_group_stats(struct seq_file *m, int cpu, struct task_group
 #endif
 
 #ifdef CONFIG_CGROUP_SCHED
+static DEFINE_SPINLOCK(sched_debug_lock);
 static char group_path[PATH_MAX];
 
-static char *task_group_path(struct task_group *tg)
+static void task_group_path(struct task_group *tg, char *path, int plen)
 {
-	if (autogroup_path(tg, group_path, PATH_MAX))
-		return group_path;
+	if (autogroup_path(tg, path, plen))
+		return;
 
-	cgroup_path(tg->css.cgroup, group_path, PATH_MAX);
+	cgroup_path(tg->css.cgroup, path, plen);
+}
 
-	return group_path;
+/*
+ * Only 1 SEQ_printf_task_group_path() caller can use the full length
+ * group_path[] for cgroup path. Other simultaneous callers will have
+ * to use a shorter stack buffer. A "..." suffix is appended at the end
+ * of the stack buffer so that it will show up in case the output length
+ * matches the given buffer size to indicate possible path name truncation.
+ */
+#define SEQ_printf_task_group_path(m, tg, fmt...)			\
+{									\
+	if (spin_trylock(&sched_debug_lock)) {				\
+		task_group_path(tg, group_path, sizeof(group_path));	\
+		SEQ_printf(m, fmt, group_path);				\
+		spin_unlock(&sched_debug_lock);				\
+	} else {							\
+		char buf[128];						\
+		char *bufend = buf + sizeof(buf) - 3;			\
+		task_group_path(tg, buf, bufend - buf);			\
+		strcpy(bufend - 1, "...");				\
+		SEQ_printf(m, fmt, buf);				\
+	}								\
 }
 #endif
 
@@ -470,7 +489,7 @@ print_task(struct seq_file *m, struct rq *rq, struct task_struct *p)
 	SEQ_printf(m, " %d %d", task_node(p), task_numa_group_id(p));
 #endif
 #ifdef CONFIG_CGROUP_SCHED
-	SEQ_printf(m, " %s", task_group_path(task_group(p)));
+	SEQ_printf_task_group_path(m, task_group(p), " %s")
 #endif
 
 	SEQ_printf(m, "\n");
@@ -507,7 +526,7 @@ void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq)
 
 #ifdef CONFIG_FAIR_GROUP_SCHED
 	SEQ_printf(m, "\n");
-	SEQ_printf(m, "cfs_rq[%d]:%s\n", cpu, task_group_path(cfs_rq->tg));
+	SEQ_printf_task_group_path(m, cfs_rq->tg, "cfs_rq[%d]:%s\n", cpu);
 #else
 	SEQ_printf(m, "\n");
 	SEQ_printf(m, "cfs_rq[%d]:\n", cpu);
@@ -579,7 +598,7 @@ void print_rt_rq(struct seq_file *m, int cpu, struct rt_rq *rt_rq)
 {
 #ifdef CONFIG_RT_GROUP_SCHED
 	SEQ_printf(m, "\n");
-	SEQ_printf(m, "rt_rq[%d]:%s\n", cpu, task_group_path(rt_rq->tg));
+	SEQ_printf_task_group_path(m, rt_rq->tg, "rt_rq[%d]:%s\n", cpu);
 #else
 	SEQ_printf(m, "\n");
 	SEQ_printf(m, "rt_rq[%d]:\n", cpu);
@@ -631,7 +650,6 @@ void print_dl_rq(struct seq_file *m, int cpu, struct dl_rq *dl_rq)
 static void print_cpu(struct seq_file *m, int cpu)
 {
 	struct rq *rq = cpu_rq(cpu);
-	unsigned long flags;
 
 #ifdef CONFIG_X86
 	{
@@ -690,13 +708,11 @@ do {									\
 	}
 #undef P
 
-	spin_lock_irqsave(&sched_debug_lock, flags);
 	print_cfs_stats(m, cpu);
 	print_rt_stats(m, cpu);
 	print_dl_stats(m, cpu);
 
 	print_rq(m, rq, cpu);
-	spin_unlock_irqrestore(&sched_debug_lock, flags);
 	SEQ_printf(m, "\n");
 }
 

commit 8bfc7a72ac0e2e0290282cb6c647291ab2e16ff5
Author: Nathan Chancellor <nathan@kernel.org>
Date:   Wed Apr 14 17:11:11 2021 -0700

    x86/events/amd/iommu: Fix sysfs type mismatch
    
    [ Upstream commit de5bc7b425d4c27ae5faa00ea7eb6b9780b9a355 ]
    
    dev_attr_show() calls _iommu_event_show() via an indirect call but
    _iommu_event_show()'s type does not currently match the type of the
    show() member in 'struct device_attribute', resulting in a Control Flow
    Integrity violation.
    
    $ cat /sys/devices/amd_iommu_1/events/mem_dte_hit
    csource=0x0a
    
    $ dmesg | grep "CFI failure"
    [ 3526.735140] CFI failure (target: _iommu_event_show...):
    
    Change _iommu_event_show() and 'struct amd_iommu_event_desc' to
    'struct device_attribute' so that there is no more CFI violation.
    
    Fixes: 7be6296fdd75 ("perf/x86/amd: AMD IOMMU Performance Counter PERF uncore PMU implementation")
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20210415001112.3024673-1-nathan@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/x86/events/amd/iommu.c b/arch/x86/events/amd/iommu.c
index 0014d26391fa..c08bcba5c3a9 100644
--- a/arch/x86/events/amd/iommu.c
+++ b/arch/x86/events/amd/iommu.c
@@ -84,12 +84,12 @@ static struct attribute_group amd_iommu_events_group = {
 };
 
 struct amd_iommu_event_desc {
-	struct kobj_attribute attr;
+	struct device_attribute attr;
 	const char *event;
 };
 
-static ssize_t _iommu_event_show(struct kobject *kobj,
-				struct kobj_attribute *attr, char *buf)
+static ssize_t _iommu_event_show(struct device *dev,
+				struct device_attribute *attr, char *buf)
 {
 	struct amd_iommu_event_desc *event =
 		container_of(attr, struct amd_iommu_event_desc, attr);

commit 5b839fb7eb981114c60d561b34cfff25c21a03cf
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Fri Apr 9 14:08:17 2021 +0300

    HSI: core: fix resource leaks in hsi_add_client_from_dt()
    
    [ Upstream commit 5c08b0f75575648032f309a6f58294453423ed93 ]
    
    If some of the allocations fail between the dev_set_name() and the
    device_register() then the name will not be freed.  Fix this by
    moving dev_set_name() directly in front of the call to device_register().
    
    Fixes: a2aa24734d9d ("HSI: Add common DT binding for HSI client devices")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hsi/hsi_core.c b/drivers/hsi/hsi_core.c
index 9065efd21851..71895da63810 100644
--- a/drivers/hsi/hsi_core.c
+++ b/drivers/hsi/hsi_core.c
@@ -223,8 +223,6 @@ static void hsi_add_client_from_dt(struct hsi_port *port,
 	if (err)
 		goto err;
 
-	dev_set_name(&cl->device, "%s", name);
-
 	err = hsi_of_property_parse_mode(client, "hsi-mode", &mode);
 	if (err) {
 		err = hsi_of_property_parse_mode(client, "hsi-rx-mode",
@@ -306,6 +304,7 @@ static void hsi_add_client_from_dt(struct hsi_port *port,
 	cl->device.release = hsi_client_release;
 	cl->device.of_node = client;
 
+	dev_set_name(&cl->device, "%s", name);
 	if (device_register(&cl->device) < 0) {
 		pr_err("hsi: failed to register client: %s\n", name);
 		put_device(&cl->device);

commit 84e3ffb534a600830a40e7d37a38632754a43fd9
Author: Fabrice Gasnier <fabrice.gasnier@foss.st.com>
Date:   Wed Mar 3 18:51:35 2021 +0100

    mfd: stm32-timers: Avoid clearing auto reload register
    
    [ Upstream commit 4917e498c6894ba077867aff78f82cffd5ffbb5c ]
    
    The ARR register is cleared unconditionally upon probing, after the maximum
    value has been read. This initial condition is rather not intuitive, when
    considering the counter child driver. It rather expects the maximum value
    by default:
    - The counter interface shows a zero value by default for 'ceiling'
      attribute.
    - Enabling the counter without any prior configuration makes it doesn't
      count.
    
    The reset value of ARR register is the maximum. So Choice here
    is to backup it, and restore it then, instead of clearing its value.
    It also fixes the initial condition seen by the counter driver.
    
    Fixes: d0f949e220fd ("mfd: Add STM32 Timers driver")
    Signed-off-by: Fabrice Gasnier <fabrice.gasnier@foss.st.com>
    Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com>
    Signed-off-by: Lee Jones <lee.jones@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mfd/stm32-timers.c b/drivers/mfd/stm32-timers.c
index efcd4b980c94..1adba6a46dcb 100644
--- a/drivers/mfd/stm32-timers.c
+++ b/drivers/mfd/stm32-timers.c
@@ -158,13 +158,18 @@ static const struct regmap_config stm32_timers_regmap_cfg = {
 
 static void stm32_timers_get_arr_size(struct stm32_timers *ddata)
 {
+	u32 arr;
+
+	/* Backup ARR to restore it after getting the maximum value */
+	regmap_read(ddata->regmap, TIM_ARR, &arr);
+
 	/*
 	 * Only the available bits will be written so when readback
 	 * we get the maximum value of auto reload register
 	 */
 	regmap_write(ddata->regmap, TIM_ARR, ~0L);
 	regmap_read(ddata->regmap, TIM_ARR, &ddata->max_arr);
-	regmap_write(ddata->regmap, TIM_ARR, 0x0);
+	regmap_write(ddata->regmap, TIM_ARR, arr);
 }
 
 static void stm32_timers_dma_probe(struct device *dev,

commit ff5042f0653986d3a663efa98d18deca382f7a22
Author: Brian King <brking@linux.vnet.ibm.com>
Date:   Mon Apr 12 18:10:09 2021 -0600

    scsi: ibmvfc: Fix invalid state machine BUG_ON()
    
    [ Upstream commit 15cfef8623a449d40d16541687afd58e78033be3 ]
    
    This fixes an issue hitting the BUG_ON() in ibmvfc_do_work(). When going
    through a host action of IBMVFC_HOST_ACTION_RESET, we change the action to
    IBMVFC_HOST_ACTION_TGT_DEL, then drop the host lock, and reset the CRQ,
    which changes the host state to IBMVFC_NO_CRQ. If, prior to setting the
    host state to IBMVFC_NO_CRQ, ibmvfc_init_host() is called, it can then end
    up changing the host action to IBMVFC_HOST_ACTION_INIT.  If we then change
    the host state to IBMVFC_NO_CRQ, we will then hit the BUG_ON().
    
    Make a couple of changes to avoid this. Leave the host action to be
    IBMVFC_HOST_ACTION_RESET or IBMVFC_HOST_ACTION_REENABLE until after we drop
    the host lock and reset or reenable the CRQ. Also harden the host state
    machine to ensure we cannot leave the reset / reenable state until we've
    finished processing the reset or reenable.
    
    Link: https://lore.kernel.org/r/20210413001009.902400-1-tyreld@linux.ibm.com
    Fixes: 73ee5d867287 ("[SCSI] ibmvfc: Fix soft lockup on resume")
    Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
    [tyreld: added fixes tag]
    Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
    [mkp: fix comment checkpatch warnings]
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
index 50078a199fea..b811436a46d0 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc.c
@@ -506,8 +506,17 @@ static void ibmvfc_set_host_action(struct ibmvfc_host *vhost,
 		if (vhost->action == IBMVFC_HOST_ACTION_ALLOC_TGTS)
 			vhost->action = action;
 		break;
+	case IBMVFC_HOST_ACTION_REENABLE:
+	case IBMVFC_HOST_ACTION_RESET:
+		vhost->action = action;
+		break;
 	case IBMVFC_HOST_ACTION_INIT:
 	case IBMVFC_HOST_ACTION_TGT_DEL:
+	case IBMVFC_HOST_ACTION_LOGO:
+	case IBMVFC_HOST_ACTION_QUERY_TGTS:
+	case IBMVFC_HOST_ACTION_TGT_DEL_FAILED:
+	case IBMVFC_HOST_ACTION_NONE:
+	default:
 		switch (vhost->action) {
 		case IBMVFC_HOST_ACTION_RESET:
 		case IBMVFC_HOST_ACTION_REENABLE:
@@ -517,15 +526,6 @@ static void ibmvfc_set_host_action(struct ibmvfc_host *vhost,
 			break;
 		}
 		break;
-	case IBMVFC_HOST_ACTION_LOGO:
-	case IBMVFC_HOST_ACTION_QUERY_TGTS:
-	case IBMVFC_HOST_ACTION_TGT_DEL_FAILED:
-	case IBMVFC_HOST_ACTION_NONE:
-	case IBMVFC_HOST_ACTION_RESET:
-	case IBMVFC_HOST_ACTION_REENABLE:
-	default:
-		vhost->action = action;
-		break;
 	}
 }
 
@@ -4346,26 +4346,45 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
 	case IBMVFC_HOST_ACTION_INIT_WAIT:
 		break;
 	case IBMVFC_HOST_ACTION_RESET:
-		vhost->action = IBMVFC_HOST_ACTION_TGT_DEL;
 		spin_unlock_irqrestore(vhost->host->host_lock, flags);
 		rc = ibmvfc_reset_crq(vhost);
+
 		spin_lock_irqsave(vhost->host->host_lock, flags);
-		if (rc == H_CLOSED)
+		if (!rc || rc == H_CLOSED)
 			vio_enable_interrupts(to_vio_dev(vhost->dev));
-		if (rc || (rc = ibmvfc_send_crq_init(vhost)) ||
-		    (rc = vio_enable_interrupts(to_vio_dev(vhost->dev)))) {
-			ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
-			dev_err(vhost->dev, "Error after reset (rc=%d)\n", rc);
+		if (vhost->action == IBMVFC_HOST_ACTION_RESET) {
+			/*
+			 * The only action we could have changed to would have
+			 * been reenable, in which case, we skip the rest of
+			 * this path and wait until we've done the re-enable
+			 * before sending the crq init.
+			 */
+			vhost->action = IBMVFC_HOST_ACTION_TGT_DEL;
+
+			if (rc || (rc = ibmvfc_send_crq_init(vhost)) ||
+			    (rc = vio_enable_interrupts(to_vio_dev(vhost->dev)))) {
+				ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
+				dev_err(vhost->dev, "Error after reset (rc=%d)\n", rc);
+			}
 		}
 		break;
 	case IBMVFC_HOST_ACTION_REENABLE:
-		vhost->action = IBMVFC_HOST_ACTION_TGT_DEL;
 		spin_unlock_irqrestore(vhost->host->host_lock, flags);
 		rc = ibmvfc_reenable_crq_queue(vhost);
+
 		spin_lock_irqsave(vhost->host->host_lock, flags);
-		if (rc || (rc = ibmvfc_send_crq_init(vhost))) {
-			ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
-			dev_err(vhost->dev, "Error after enable (rc=%d)\n", rc);
+		if (vhost->action == IBMVFC_HOST_ACTION_REENABLE) {
+			/*
+			 * The only action we could have changed to would have
+			 * been reset, in which case, we skip the rest of this
+			 * path and wait until we've done the reset before
+			 * sending the crq init.
+			 */
+			vhost->action = IBMVFC_HOST_ACTION_TGT_DEL;
+			if (rc || (rc = ibmvfc_send_crq_init(vhost))) {
+				ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
+				dev_err(vhost->dev, "Error after enable (rc=%d)\n", rc);
+			}
 		}
 		break;
 	case IBMVFC_HOST_ACTION_LOGO:

commit 9720cb676e16dad9415ef377f5ff0cb05c422fa5
Author: Sergey Shtylyov <s.shtylyov@omprussia.ru>
Date:   Tue Mar 30 20:45:12 2021 +0300

    scsi: sni_53c710: Add IRQ check
    
    [ Upstream commit 1160d61bc51e87e509cfaf9da50a0060f67b6de4 ]
    
    The driver neglects to check the result of platform_get_irq()'s call and
    blithely passes the negative error codes to request_irq() (which takes
    *unsigned* IRQ #s), causing it to fail with -EINVAL (overridden by -ENODEV
    further below).  Stop calling request_irq() with the invalid IRQ #s.
    
    Link: https://lore.kernel.org/r/8f4b8fa5-8251-b977-70a1-9099bcb4bb17@omprussia.ru
    Fixes: c27d85f3f3c5 ("[SCSI] SNI RM 53c710 driver")
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omprussia.ru>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/sni_53c710.c b/drivers/scsi/sni_53c710.c
index 3102a75984d3..aed91afb79b6 100644
--- a/drivers/scsi/sni_53c710.c
+++ b/drivers/scsi/sni_53c710.c
@@ -71,6 +71,7 @@ static int snirm710_probe(struct platform_device *dev)
 	struct NCR_700_Host_Parameters *hostdata;
 	struct Scsi_Host *host;
 	struct  resource *res;
+	int rc;
 
 	res = platform_get_resource(dev, IORESOURCE_MEM, 0);
 	if (!res)
@@ -96,7 +97,9 @@ static int snirm710_probe(struct platform_device *dev)
 		goto out_kfree;
 	host->this_id = 7;
 	host->base = base;
-	host->irq = platform_get_irq(dev, 0);
+	host->irq = rc = platform_get_irq(dev, 0);
+	if (rc < 0)
+		goto out_put_host;
 	if(request_irq(host->irq, NCR_700_intr, IRQF_SHARED, "snirm710", host)) {
 		printk(KERN_ERR "snirm710: request_irq failed!\n");
 		goto out_put_host;

commit 74a6ce865c82aafa8e5f46a6ad07817dcd3bced1
Author: Sergey Shtylyov <s.shtylyov@omprussia.ru>
Date:   Tue Mar 30 20:44:08 2021 +0300

    scsi: sun3x_esp: Add IRQ check
    
    [ Upstream commit 14b321380eb333c82853d7d612d0995f05f88fdc ]
    
    The driver neglects to check the result of platform_get_irq()'s call and
    blithely passes the negative error codes to request_irq() (which takes
    *unsigned* IRQ #), causing it to fail with -EINVAL, overriding the real
    error code.  Stop calling request_irq() with the invalid IRQ #s.
    
    Link: https://lore.kernel.org/r/363eb4c8-a3bf-4dc9-2a9e-90f349030a15@omprussia.ru
    Fixes: 0bb67f181834 ("[SCSI] sun3x_esp: convert to esp_scsi")
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omprussia.ru>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/sun3x_esp.c b/drivers/scsi/sun3x_esp.c
index 0b1421cdf8a0..f9aa95e48eee 100644
--- a/drivers/scsi/sun3x_esp.c
+++ b/drivers/scsi/sun3x_esp.c
@@ -233,7 +233,9 @@ static int esp_sun3x_probe(struct platform_device *dev)
 	if (!esp->command_block)
 		goto fail_unmap_regs_dma;
 
-	host->irq = platform_get_irq(dev, 0);
+	host->irq = err = platform_get_irq(dev, 0);
+	if (err < 0)
+		goto fail_unmap_command_block;
 	err = request_irq(host->irq, scsi_esp_intr, IRQF_SHARED,
 			  "SUN3X ESP", esp);
 	if (err < 0)

commit a4fc54e3dc63e010e2ae496e4d6ad2bdd1dc4792
Author: Sergey Shtylyov <s.shtylyov@omprussia.ru>
Date:   Tue Mar 30 20:43:23 2021 +0300

    scsi: jazz_esp: Add IRQ check
    
    [ Upstream commit 38fca15c29db6ed06e894ac194502633e2a7d1fb ]
    
    The driver neglects to check the result of platform_get_irq()'s call and
    blithely passes the negative error codes to request_irq() (which takes
    *unsigned* IRQ #), causing it to fail with -EINVAL, overriding the real
    error code.  Stop calling request_irq() with the invalid IRQ #s.
    
    Link: https://lore.kernel.org/r/594aa9ae-2215-49f6-f73c-33bd38989912@omprussia.ru
    Fixes: 352e921f0dd4 ("[SCSI] jazz_esp: converted to use esp_core")
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omprussia.ru>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/jazz_esp.c b/drivers/scsi/jazz_esp.c
index 6eb5ff3e2e61..7dfe4237e5e8 100644
--- a/drivers/scsi/jazz_esp.c
+++ b/drivers/scsi/jazz_esp.c
@@ -170,7 +170,9 @@ static int esp_jazz_probe(struct platform_device *dev)
 	if (!esp->command_block)
 		goto fail_unmap_regs;
 
-	host->irq = platform_get_irq(dev, 0);
+	host->irq = err = platform_get_irq(dev, 0);
+	if (err < 0)
+		goto fail_unmap_command_block;
 	err = request_irq(host->irq, scsi_esp_intr, IRQF_SHARED, "ESP", esp);
 	if (err < 0)
 		goto fail_unmap_command_block;

commit 66e98466cd629c28edf529ce886cffc1f626f6ce
Author: Colin Ian King <colin.king@canonical.com>
Date:   Fri Apr 9 10:01:03 2021 +0100

    clk: uniphier: Fix potential infinite loop
    
    [ Upstream commit f6b1340dc751a6caa2a0567b667d0f4f4172cd58 ]
    
    The for-loop iterates with a u8 loop counter i and compares this
    with the loop upper limit of num_parents that is an int type.
    There is a potential infinite loop if num_parents is larger than
    the u8 loop counter. Fix this by making the loop counter the same
    type as num_parents.  Also make num_parents an unsigned int to
    match the return type of the call to clk_hw_get_num_parents.
    
    Addresses-Coverity: ("Infinite loop")
    Fixes: 734d82f4a678 ("clk: uniphier: add core support code for UniPhier clock driver")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Reviewed-by: Masahiro Yamada <masahiroy@kernel.org>
    Link: https://lore.kernel.org/r/20210409090104.629722-1-colin.king@canonical.com
    Signed-off-by: Stephen Boyd <sboyd@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/clk/uniphier/clk-uniphier-mux.c b/drivers/clk/uniphier/clk-uniphier-mux.c
index 2c243a894f3b..3a52ab968ac2 100644
--- a/drivers/clk/uniphier/clk-uniphier-mux.c
+++ b/drivers/clk/uniphier/clk-uniphier-mux.c
@@ -40,10 +40,10 @@ static int uniphier_clk_mux_set_parent(struct clk_hw *hw, u8 index)
 static u8 uniphier_clk_mux_get_parent(struct clk_hw *hw)
 {
 	struct uniphier_clk_mux *mux = to_uniphier_clk_mux(hw);
-	int num_parents = clk_hw_get_num_parents(hw);
+	unsigned int num_parents = clk_hw_get_num_parents(hw);
 	int ret;
 	unsigned int val;
-	u8 i;
+	unsigned int i;
 
 	ret = regmap_read(mux->regmap, mux->reg, &val);
 	if (ret)

commit d9df68d24e1e6b19cfd36760c94ab9822ade6c61
Author: Chen Hui <clare.chenhui@huawei.com>
Date:   Fri Apr 9 16:23:51 2021 +0800

    clk: qcom: a53-pll: Add missing MODULE_DEVICE_TABLE
    
    [ Upstream commit 790b516ada10a4dcc0f0a56dc0ced475d86d5820 ]
    
    CONFIG_QCOM_A53PLL is tristate option and therefore this driver can be
    compiled as a module. This patch adds missing MODULE_DEVICE_TABLE
    definition which generates correct modalias for automatic loading of
    this driver when it is built as an external module.
    
    Fixes: 0c6ab1b8f894 ("clk: qcom: Add A53 PLL support")
    Signed-off-by: Chen Hui <clare.chenhui@huawei.com>
    Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
    Link: https://lore.kernel.org/r/20210409082352.233810-3-clare.chenhui@huawei.com
    Signed-off-by: Stephen Boyd <sboyd@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/clk/qcom/a53-pll.c b/drivers/clk/qcom/a53-pll.c
index 45cfc57bff92..af6ac17c7dae 100644
--- a/drivers/clk/qcom/a53-pll.c
+++ b/drivers/clk/qcom/a53-pll.c
@@ -93,6 +93,7 @@ static const struct of_device_id qcom_a53pll_match_table[] = {
 	{ .compatible = "qcom,msm8916-a53pll" },
 	{ }
 };
+MODULE_DEVICE_TABLE(of, qcom_a53pll_match_table);
 
 static struct platform_driver qcom_a53pll_driver = {
 	.probe = qcom_a53pll_probe,

commit 6af3de26ee2b42ff5104a0a0f048df82e37fbc82
Author: Jason Gunthorpe <jgg@nvidia.com>
Date:   Tue Apr 6 16:40:25 2021 -0300

    vfio/mdev: Do not allow a mdev_type to have a NULL parent pointer
    
    [ Upstream commit b5a1f8921d5040bb788492bf33a66758021e4be5 ]
    
    There is a small race where the parent is NULL even though the kobj has
    already been made visible in sysfs.
    
    For instance the attribute_group is made visible in sysfs_create_files()
    and the mdev_type_attr_show() does:
    
        ret = attr->show(kobj, type->parent->dev, buf);
    
    Which will crash on NULL parent. Move the parent setup to before the type
    pointer leaves the stack frame.
    
    Fixes: 7b96953bc640 ("vfio: Mediated device Core driver")
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Reviewed-by: Max Gurtovoy <mgurtovoy@nvidia.com>
    Reviewed-by: Cornelia Huck <cohuck@redhat.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Message-Id: <2-v2-d36939638fc6+d54-vfio2_jgg@nvidia.com>
    Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/vfio/mdev/mdev_sysfs.c b/drivers/vfio/mdev/mdev_sysfs.c
index 1692a0cc3036..c99fcc6c2eba 100644
--- a/drivers/vfio/mdev/mdev_sysfs.c
+++ b/drivers/vfio/mdev/mdev_sysfs.c
@@ -108,6 +108,7 @@ struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent,
 		return ERR_PTR(-ENOMEM);
 
 	type->kobj.kset = parent->mdev_types_kset;
+	type->parent = parent;
 
 	ret = kobject_init_and_add(&type->kobj, &mdev_type_ktype, NULL,
 				   "%s-%s", dev_driver_string(parent->dev),
@@ -135,7 +136,6 @@ struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent,
 	}
 
 	type->group = group;
-	type->parent = parent;
 	return type;
 
 attrs_failed:

commit 25f6ba484b13d7b35b77641e7dbcabd30ce2cbd5
Author: Hannes Reinecke <hare@suse.de>
Date:   Sat Dec 5 16:29:01 2020 +0100

    nvme: retrigger ANA log update if group descriptor isn't found
    
    [ Upstream commit dd8f7fa908f66dd44abcd83cbb50410524b9f8ef ]
    
    If ANA is enabled but no ANA group descriptor is found when creating
    a new namespace the ANA log is most likely out of date, so trigger
    a re-read. The namespace will be tagged with the NS_ANA_PENDING flag
    to exclude it from path selection until the ANA log has been re-read.
    
    Fixes: 32acab3181c7 ("nvme: implement multipath access to nvme subsystems")
    Reported-by: Martin George <marting@netapp.com>
    Signed-off-by: Hannes Reinecke <hare@suse.de>
    Reviewed-by: Keith Busch <kbusch@kernel.org>
    Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c
index 4ef05fe00dac..64f699a1afd7 100644
--- a/drivers/nvme/host/multipath.c
+++ b/drivers/nvme/host/multipath.c
@@ -516,6 +516,10 @@ void nvme_mpath_add_disk(struct nvme_ns *ns, struct nvme_id_ns *id)
 		if (desc.state) {
 			/* found the group desc: update */
 			nvme_update_ns_ana_state(&desc, ns);
+		} else {
+			/* group desc not found: trigger a re-read */
+			set_bit(NVME_NS_ANA_PENDING, &ns->flags);
+			queue_work(nvme_wq, &ns->ctrl->ana_work);
 		}
 	} else {
 		mutex_lock(&ns->head->lock);

commit 77b2bc239cc33ae053a72152f2d4a438ef5836fc
Author: Sergey Shtylyov <s.shtylyov@omprussia.ru>
Date:   Mon Mar 15 23:15:06 2021 +0300

    ata: libahci_platform: fix IRQ check
    
    [ Upstream commit b30d0040f06159de97ad9c0b1536f47250719d7d ]
    
    Iff platform_get_irq() returns 0, ahci_platform_init_host() would return 0
    early (as if the call was successful). Override IRQ0 with -EINVAL instead
    as the 'libata' regards 0 as "no IRQ" (thus polling) anyway...
    
    Fixes: c034640a32f8 ("ata: libahci: properly propagate return value of platform_get_irq()")
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omprussia.ru>
    Link: https://lore.kernel.org/r/4448c8cc-331f-2915-0e17-38ea34e251c8@omprussia.ru
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/ata/libahci_platform.c b/drivers/ata/libahci_platform.c
index 522b543f718d..6a55aac0c60f 100644
--- a/drivers/ata/libahci_platform.c
+++ b/drivers/ata/libahci_platform.c
@@ -544,11 +544,13 @@ int ahci_platform_init_host(struct platform_device *pdev,
 	int i, irq, n_ports, rc;
 
 	irq = platform_get_irq(pdev, 0);
-	if (irq <= 0) {
+	if (irq < 0) {
 		if (irq != -EPROBE_DEFER)
 			dev_err(dev, "no irq\n");
 		return irq;
 	}
+	if (!irq)
+		return -EINVAL;
 
 	hpriv->irq = irq;
 

commit d59b3aa3a1c176417324a52d3d6262dbdbc84de8
Author: Sergey Shtylyov <s.shtylyov@omprussia.ru>
Date:   Sun Mar 28 00:13:49 2021 +0300

    sata_mv: add IRQ checks
    
    [ Upstream commit e6471a65fdd5efbb8dd2732dd0f063f960685ceb ]
    
    The function mv_platform_probe() neglects to check the results of the
    calls to platform_get_irq() and irq_of_parse_and_map() and blithely
    passes them to ata_host_activate() -- while the latter only checks
    for IRQ0 (treating it as a polling mode indicattion) and passes the
    negative values to devm_request_irq() causing it to fail as it takes
    unsigned values for the IRQ #...
    
    Add to mv_platform_probe() the proper IRQ checks to pass the positive IRQ
    #s to ata_host_activate(), propagate upstream the negative error codes,
    and override the IRQ0 with -EINVAL (as we don't want the polling mode).
    
    Fixes: f351b2d638c3 ("sata_mv: Support SoC controllers")
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omprussia.ru>
    Link: https://lore.kernel.org/r/51436f00-27a1-e20b-c21b-0e817e0a7c86@omprussia.ru
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c
index 2910b22fac11..57ef11ecbb9b 100644
--- a/drivers/ata/sata_mv.c
+++ b/drivers/ata/sata_mv.c
@@ -4110,6 +4110,10 @@ static int mv_platform_probe(struct platform_device *pdev)
 		n_ports = mv_platform_data->n_ports;
 		irq = platform_get_irq(pdev, 0);
 	}
+	if (irq < 0)
+		return irq;
+	if (!irq)
+		return -EINVAL;
 
 	host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports);
 	hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL);

commit e82c6e0cadcccb465dba267273163cc2bd2a6bb6
Author: Sergey Shtylyov <s.shtylyov@omprussia.ru>
Date:   Thu Mar 25 23:51:10 2021 +0300

    pata_ipx4xx_cf: fix IRQ check
    
    [ Upstream commit e379b40cc0f179403ce0b82b7e539f635a568da5 ]
    
    The driver's probe() method is written as if platform_get_irq() returns 0
    on error, while actually it returns a negative error code (with all the
    other values considered valid IRQs).  Rewrite the driver's IRQ checking
    code to pass the positive IRQ #s to ata_host_activate(), propagate errors
    upstream, and treat IRQ0 as error, returning -EINVAL, as the libata code
    treats 0  as  an indication that polling should be used anyway...
    
    Fixes: 0df0d0a0ea9f ("[libata] ARM: add ixp4xx PATA driver")
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omprussia.ru>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/ata/pata_ixp4xx_cf.c b/drivers/ata/pata_ixp4xx_cf.c
index 0b0d93065f5a..867621f8c387 100644
--- a/drivers/ata/pata_ixp4xx_cf.c
+++ b/drivers/ata/pata_ixp4xx_cf.c
@@ -169,8 +169,12 @@ static int ixp4xx_pata_probe(struct platform_device *pdev)
 		return -ENOMEM;
 
 	irq = platform_get_irq(pdev, 0);
-	if (irq)
+	if (irq > 0)
 		irq_set_irq_type(irq, IRQ_TYPE_EDGE_RISING);
+	else if (irq < 0)
+		return irq;
+	else
+		return -EINVAL;
 
 	/* Setup expansion bus chip selects */
 	*data->cs0_cfg = data->cs0_bits;

commit f57aab9307b7345cbd42b25f657de822025e8a8a
Author: Sergey Shtylyov <s.shtylyov@omprussia.ru>
Date:   Thu Mar 25 23:50:24 2021 +0300

    pata_arasan_cf: fix IRQ check
    
    [ Upstream commit c7e8f404d56b99c80990b19a402c3f640d74be05 ]
    
    The driver's probe() method is written as if platform_get_irq() returns 0
    on error, while actually it returns a negative error code (with all the
    other values considered valid IRQs). Rewrite the driver's IRQ checking code
    to pass the positive IRQ #s to ata_host_activate(), propagate upstream
    -EPROBE_DEFER, and set up the driver to polling mode on (negative) errors
    and IRQ0 (libata treats IRQ #0 as a polling mode anyway)...
    
    Fixes: a480167b23ef ("pata_arasan_cf: Adding support for arasan compact flash host controller")
    Signed-off-by: Sergey Shtylyov <s.shtylyov@omprussia.ru>
    Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/ata/pata_arasan_cf.c b/drivers/ata/pata_arasan_cf.c
index ebecab8c3f36..7c1c399450f3 100644
--- a/drivers/ata/pata_arasan_cf.c
+++ b/drivers/ata/pata_arasan_cf.c
@@ -817,12 +817,19 @@ static int arasan_cf_probe(struct platform_device *pdev)
 	else
 		quirk = CF_BROKEN_UDMA; /* as it is on spear1340 */
 
-	/* if irq is 0, support only PIO */
-	acdev->irq = platform_get_irq(pdev, 0);
-	if (acdev->irq)
+	/*
+	 * If there's an error getting IRQ (or we do get IRQ0),
+	 * support only PIO
+	 */
+	ret = platform_get_irq(pdev, 0);
+	if (ret > 0) {
+		acdev->irq = ret;
 		irq_handler = arasan_cf_interrupt;
-	else
+	} else	if (ret == -EPROBE_DEFER) {
+		return ret;
+	} else	{
 		quirk |= CF_BROKEN_MWDMA | CF_BROKEN_UDMA;
+	}
 
 	acdev->pbase = res->start;
 	acdev->vbase = devm_ioremap_nocache(&pdev->dev, res->start,

commit 609a2d6557e8a6d5dbb6bfcfc5b42185526a0c0b
Author: Masami Hiramatsu <mhiramat@kernel.org>
Date:   Thu Mar 25 19:08:31 2021 +0900

    x86/kprobes: Fix to check non boostable prefixes correctly
    
    [ Upstream commit 6dd3b8c9f58816a1354be39559f630cd1bd12159 ]
    
    There are 2 bugs in the can_boost() function because of using
    x86 insn decoder. Since the insn->opcode never has a prefix byte,
    it can not find CS override prefix in it. And the insn->attr is
    the attribute of the opcode, thus inat_is_address_size_prefix(
    insn->attr) always returns false.
    
    Fix those by checking each prefix bytes with for_each_insn_prefix
    loop and getting the correct attribute for each prefix byte.
    Also, this removes unlikely, because this is a slow path.
    
    Fixes: a8d11cd0714f ("kprobes/x86: Consolidate insn decoder users for copying code")
    Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Link: https://lore.kernel.org/r/161666691162.1120877.2808435205294352583.stgit@devnote2
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c
index dfc3ab44bc5d..3334e1400345 100644
--- a/arch/x86/kernel/kprobes/core.c
+++ b/arch/x86/kernel/kprobes/core.c
@@ -170,6 +170,8 @@ NOKPROBE_SYMBOL(skip_prefixes);
 int can_boost(struct insn *insn, void *addr)
 {
 	kprobe_opcode_t opcode;
+	insn_byte_t prefix;
+	int i;
 
 	if (search_exception_tables((unsigned long)addr))
 		return 0;	/* Page fault may occur on this address. */
@@ -182,9 +184,14 @@ int can_boost(struct insn *insn, void *addr)
 	if (insn->opcode.nbytes != 1)
 		return 0;
 
-	/* Can't boost Address-size override prefix */
-	if (unlikely(inat_is_address_size_prefix(insn->attr)))
-		return 0;
+	for_each_insn_prefix(insn, i, prefix) {
+		insn_attr_t attr;
+
+		attr = inat_get_opcode_attribute(prefix);
+		/* Can't boost Address-size override prefix and CS override prefix */
+		if (prefix == 0x2e || inat_is_address_size_prefix(attr))
+			return 0;
+	}
 
 	opcode = insn->opcode.bytes[0];
 
@@ -209,8 +216,8 @@ int can_boost(struct insn *insn, void *addr)
 		/* clear and set flags are boostable */
 		return (opcode == 0xf5 || (0xf7 < opcode && opcode < 0xfe));
 	default:
-		/* CS override prefix and call are not boostable */
-		return (opcode != 0x2e && opcode != 0x9a);
+		/* call is not boostable */
+		return opcode != 0x9a;
 	}
 }
 

commit 7a384254b17a41d9b68fb523b6c5a2ebb1d9425f
Author: Felix Kuehling <Felix.Kuehling@amd.com>
Date:   Mon Mar 8 22:15:42 2021 -0500

    drm/amdkfd: fix build error with AMD_IOMMU_V2=m
    
    [ Upstream commit 1e87068570a2cc4db5f95a881686add71729e769 ]
    
    Using 'imply AMD_IOMMU_V2' does not guarantee that the driver can link
    against the exported functions. If the GPU driver is built-in but the
    IOMMU driver is a loadable module, the kfd_iommu.c file is indeed
    built but does not work:
    
    x86_64-linux-ld: drivers/gpu/drm/amd/amdkfd/kfd_iommu.o: in function `kfd_iommu_bind_process_to_device':
    kfd_iommu.c:(.text+0x516): undefined reference to `amd_iommu_bind_pasid'
    x86_64-linux-ld: drivers/gpu/drm/amd/amdkfd/kfd_iommu.o: in function `kfd_iommu_unbind_process':
    kfd_iommu.c:(.text+0x691): undefined reference to `amd_iommu_unbind_pasid'
    x86_64-linux-ld: drivers/gpu/drm/amd/amdkfd/kfd_iommu.o: in function `kfd_iommu_suspend':
    kfd_iommu.c:(.text+0x966): undefined reference to `amd_iommu_set_invalidate_ctx_cb'
    x86_64-linux-ld: kfd_iommu.c:(.text+0x97f): undefined reference to `amd_iommu_set_invalid_ppr_cb'
    x86_64-linux-ld: kfd_iommu.c:(.text+0x9a4): undefined reference to `amd_iommu_free_device'
    x86_64-linux-ld: drivers/gpu/drm/amd/amdkfd/kfd_iommu.o: in function `kfd_iommu_resume':
    kfd_iommu.c:(.text+0xa9a): undefined reference to `amd_iommu_init_device'
    x86_64-linux-ld: kfd_iommu.c:(.text+0xadc): undefined reference to `amd_iommu_set_invalidate_ctx_cb'
    x86_64-linux-ld: kfd_iommu.c:(.text+0xaff): undefined reference to `amd_iommu_set_invalid_ppr_cb'
    x86_64-linux-ld: kfd_iommu.c:(.text+0xc72): undefined reference to `amd_iommu_bind_pasid'
    x86_64-linux-ld: kfd_iommu.c:(.text+0xe08): undefined reference to `amd_iommu_set_invalidate_ctx_cb'
    x86_64-linux-ld: kfd_iommu.c:(.text+0xe26): undefined reference to `amd_iommu_set_invalid_ppr_cb'
    x86_64-linux-ld: kfd_iommu.c:(.text+0xe42): undefined reference to `amd_iommu_free_device'
    
    Use IS_REACHABLE to only build IOMMU-V2 support if the amd_iommu symbols
    are reachable by the amdkfd driver. Output a warning if they are not,
    because that may not be what the user was expecting.
    
    Fixes: 64d1c3a43a6f ("drm/amdkfd: Centralize IOMMUv2 code and make it conditional")
    Reported-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_iommu.c b/drivers/gpu/drm/amd/amdkfd/kfd_iommu.c
index 01494752c36a..f3a526ed8059 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_iommu.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_iommu.c
@@ -20,6 +20,10 @@
  * OTHER DEALINGS IN THE SOFTWARE.
  */
 
+#include <linux/kconfig.h>
+
+#if IS_REACHABLE(CONFIG_AMD_IOMMU_V2)
+
 #include <linux/printk.h>
 #include <linux/device.h>
 #include <linux/slab.h>
@@ -366,3 +370,5 @@ int kfd_iommu_add_perf_counters(struct kfd_topology_device *kdev)
 
 	return 0;
 }
+
+#endif
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_iommu.h b/drivers/gpu/drm/amd/amdkfd/kfd_iommu.h
index dd23d9fdf6a8..afd420b01a0c 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_iommu.h
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_iommu.h
@@ -23,7 +23,9 @@
 #ifndef __KFD_IOMMU_H__
 #define __KFD_IOMMU_H__
 
-#if defined(CONFIG_AMD_IOMMU_V2_MODULE) || defined(CONFIG_AMD_IOMMU_V2)
+#include <linux/kconfig.h>
+
+#if IS_REACHABLE(CONFIG_AMD_IOMMU_V2)
 
 #define KFD_SUPPORT_IOMMU_V2
 
@@ -46,6 +48,9 @@ static inline int kfd_iommu_check_device(struct kfd_dev *kfd)
 }
 static inline int kfd_iommu_device_init(struct kfd_dev *kfd)
 {
+#if IS_MODULE(CONFIG_AMD_IOMMU_V2)
+	WARN_ONCE(1, "iommu_v2 module is not usable by built-in KFD");
+#endif
 	return 0;
 }
 
@@ -73,6 +78,6 @@ static inline int kfd_iommu_add_perf_counters(struct kfd_topology_device *kdev)
 	return 0;
 }
 
-#endif /* defined(CONFIG_AMD_IOMMU_V2) */
+#endif /* IS_REACHABLE(CONFIG_AMD_IOMMU_V2) */
 
 #endif /* __KFD_IOMMU_H__ */

commit e9bd080d9ad7301c4d9a2c01f5947894293b3f00
Author: Colin Ian King <colin.king@canonical.com>
Date:   Wed Oct 7 14:16:28 2020 +0200

    media: m88rs6000t: avoid potential out-of-bounds reads on arrays
    
    [ Upstream commit 9baa3d64e8e2373ddd11c346439e5dfccb2cbb0d ]
    
    There a 3 array for-loops that don't check the upper bounds of the
    index into arrays and this may lead to potential out-of-bounds
    reads.  Fix this by adding array size upper bounds checks to be
    full safe.
    
    Addresses-Coverity: ("Out-of-bounds read")
    
    Link: https://lore.kernel.org/linux-media/20201007121628.20676-1-colin.king@canonical.com
    Fixes: 333829110f1d ("[media] m88rs6000t: add new dvb-s/s2 tuner for integrated chip M88RS6000")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/tuners/m88rs6000t.c b/drivers/media/tuners/m88rs6000t.c
index 3df2f23a40be..3fe13de48777 100644
--- a/drivers/media/tuners/m88rs6000t.c
+++ b/drivers/media/tuners/m88rs6000t.c
@@ -534,7 +534,7 @@ static int m88rs6000t_get_rf_strength(struct dvb_frontend *fe, u16 *strength)
 	PGA2_cri = PGA2_GC >> 2;
 	PGA2_crf = PGA2_GC & 0x03;
 
-	for (i = 0; i <= RF_GC; i++)
+	for (i = 0; i <= RF_GC && i < ARRAY_SIZE(RFGS); i++)
 		RFG += RFGS[i];
 
 	if (RF_GC == 0)
@@ -546,12 +546,12 @@ static int m88rs6000t_get_rf_strength(struct dvb_frontend *fe, u16 *strength)
 	if (RF_GC == 3)
 		RFG += 100;
 
-	for (i = 0; i <= IF_GC; i++)
+	for (i = 0; i <= IF_GC && i < ARRAY_SIZE(IFGS); i++)
 		IFG += IFGS[i];
 
 	TIAG = TIA_GC * TIA_GS;
 
-	for (i = 0; i <= BB_GC; i++)
+	for (i = 0; i <= BB_GC && i < ARRAY_SIZE(BBGS); i++)
 		BBG += BBGS[i];
 
 	PGA2G = PGA2_cri * PGA2_cri_GS + PGA2_crf * PGA2_crf_GS;

commit f8e002a5c47b18973e7683b76a51a16dd8fff5bb
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Tue Nov 17 03:50:41 2020 +0100

    media: omap4iss: return error code when omap4iss_get() failed
    
    [ Upstream commit 8938c48fa25b491842ece9eb38f0bea0fcbaca44 ]
    
    If omap4iss_get() failed, it need return error code in iss_probe().
    
    Fixes: 59f0ad807681 ("[media] v4l: omap4iss: Add support for OMAP4...")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/staging/media/omap4iss/iss.c b/drivers/staging/media/omap4iss/iss.c
index b1036baebb03..d796e754610c 100644
--- a/drivers/staging/media/omap4iss/iss.c
+++ b/drivers/staging/media/omap4iss/iss.c
@@ -1244,8 +1244,10 @@ static int iss_probe(struct platform_device *pdev)
 	if (ret < 0)
 		goto error;
 
-	if (!omap4iss_get(iss))
+	if (!omap4iss_get(iss)) {
+		ret = -EINVAL;
 		goto error;
+	}
 
 	ret = iss_reset(iss);
 	if (ret < 0)

commit 6055d45830eebf9dc5f2e7a656377da9df86884c
Author: Colin Ian King <colin.king@canonical.com>
Date:   Thu Feb 25 16:43:27 2021 +0100

    media: vivid: fix assignment of dev->fbuf_out_flags
    
    [ Upstream commit 5cde22fcc7271812a7944c47b40100df15908358 ]
    
    Currently the chroma_flags and alpha_flags are being zero'd with a bit-wise
    mask and the following statement should be bit-wise or'ing in the new flag
    bits but instead is making a direct assignment.  Fix this by using the |=
    operator rather than an assignment.
    
    Addresses-Coverity: ("Unused value")
    
    Fixes: ef834f7836ec ("[media] vivid: add the video capture and output parts")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/platform/vivid/vivid-vid-out.c b/drivers/media/platform/vivid/vivid-vid-out.c
index 0f909500a0b8..ecd9e36ef3f6 100644
--- a/drivers/media/platform/vivid/vivid-vid-out.c
+++ b/drivers/media/platform/vivid/vivid-vid-out.c
@@ -998,7 +998,7 @@ int vivid_vid_out_s_fbuf(struct file *file, void *fh,
 		return -EINVAL;
 	}
 	dev->fbuf_out_flags &= ~(chroma_flags | alpha_flags);
-	dev->fbuf_out_flags = a->flags & (chroma_flags | alpha_flags);
+	dev->fbuf_out_flags |= a->flags & (chroma_flags | alpha_flags);
 	return 0;
 }
 

commit f418c842bb83d96cdd41967f2425fc7476ae5d5f
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Fri Apr 23 09:39:19 2021 +0930

    soc: aspeed: fix a ternary sign expansion bug
    
    [ Upstream commit 5ffa828534036348fa90fb3079ccc0972d202c4a ]
    
    The intent here was to return negative error codes but it actually
    returns positive values.  The problem is that type promotion with
    ternary operations is quite complicated.
    
    "ret" is an int.  "copied" is a u32.  And the snoop_file_read() function
    returns long.  What happens is that "ret" is cast to u32 and becomes
    positive then it's cast to long and it's still positive.
    
    Fix this by removing the ternary so that "ret" is type promoted directly
    to long.
    
    Fixes: 3772e5da4454 ("drivers/misc: Aspeed LPC snoop output using misc chardev")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Joel Stanley <joel@jms.id.au>
    Reviewed-by: Patrick Venture <venture@google.com>
    Link: https://lore.kernel.org/r/YIE90PSXsMTa2Y8n@mwanda
    Link: https://lore.kernel.org/r/20210423000919.1249474-1-joel@jms.id.au'
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/misc/aspeed-lpc-snoop.c b/drivers/misc/aspeed-lpc-snoop.c
index b4a776bf44bc..e2cb0b9607d1 100644
--- a/drivers/misc/aspeed-lpc-snoop.c
+++ b/drivers/misc/aspeed-lpc-snoop.c
@@ -99,8 +99,10 @@ static ssize_t snoop_file_read(struct file *file, char __user *buffer,
 			return -EINTR;
 	}
 	ret = kfifo_to_user(&chan->fifo, buffer, count, &copied);
+	if (ret)
+		return ret;
 
-	return ret ? ret : copied;
+	return copied;
 }
 
 static __poll_t snoop_file_poll(struct file *file,

commit 1f51881e2dccac944682e08b23ec441678809443
Author: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Date:   Thu Apr 15 09:22:22 2021 +0900

    ttyprintk: Add TTY hangup callback.
    
    [ Upstream commit c0070e1e60270f6a1e09442a9ab2335f3eaeaad2 ]
    
    syzbot is reporting hung task due to flood of
    
      tty_warn(tty, "%s: tty->count = 1 port count = %d\n", __func__,
               port->count);
    
    message [1], for ioctl(TIOCVHANGUP) prevents tty_port_close() from
    decrementing port->count due to tty_hung_up_p() == true.
    
    ----------
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <sys/ioctl.h>
    #include <unistd.h>
    
    int main(int argc, char *argv[])
    {
            int i;
            int fd[10];
    
            for (i = 0; i < 10; i++)
                    fd[i] = open("/dev/ttyprintk", O_WRONLY);
            ioctl(fd[0], TIOCVHANGUP);
            for (i = 0; i < 10; i++)
                    close(fd[i]);
            close(open("/dev/ttyprintk", O_WRONLY));
            return 0;
    }
    ----------
    
    When TTY hangup happens, port->count needs to be reset via
    "struct tty_operations"->hangup callback.
    
    [1] https://syzkaller.appspot.com/bug?id=39ea6caa479af471183997376dc7e90bc7d64a6a
    
    Reported-by: syzbot <syzbot+43e93968b964e369db0b@syzkaller.appspotmail.com>
    Reported-by: syzbot <syzbot+3ed715090790806d8b18@syzkaller.appspotmail.com>
    Tested-by: syzbot <syzbot+43e93968b964e369db0b@syzkaller.appspotmail.com>
    Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Fixes: 24b4b67d17c308aa ("add ttyprintk driver")
    Link: https://lore.kernel.org/r/17e0652d-89b7-c8c0-fb53-e7566ac9add4@i-love.sakura.ne.jp
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/char/ttyprintk.c b/drivers/char/ttyprintk.c
index 774748497ace..e56ac5adb5fc 100644
--- a/drivers/char/ttyprintk.c
+++ b/drivers/char/ttyprintk.c
@@ -159,12 +159,23 @@ static int tpk_ioctl(struct tty_struct *tty,
 	return 0;
 }
 
+/*
+ * TTY operations hangup function.
+ */
+static void tpk_hangup(struct tty_struct *tty)
+{
+	struct ttyprintk_port *tpkp = tty->driver_data;
+
+	tty_port_hangup(&tpkp->port);
+}
+
 static const struct tty_operations ttyprintk_ops = {
 	.open = tpk_open,
 	.close = tpk_close,
 	.write = tpk_write,
 	.write_room = tpk_write_room,
 	.ioctl = tpk_ioctl,
+	.hangup = tpk_hangup,
 };
 
 static const struct tty_port_operations null_ops = { };

commit 290a7a1a104f94e866af9b81106743d188733f60
Author: Artur Petrosyan <Arthur.Petrosyan@synopsys.com>
Date:   Fri Apr 16 16:47:14 2021 +0400

    usb: dwc2: Fix hibernation between host and device modes.
    
    [ Upstream commit 24d209dba5a3959b2ebde7cf3ad40c8015e814cf ]
    
    When core is in hibernation in host mode and a device cable
    was connected then driver exited from device hibernation.
    However, registers saved for host mode and when exited from
    device hibernation register restore would be done for device
    register which was wrong because there was no device registers
    stored to restore.
    
    - Added dwc_handle_gpwrdn_disc_det() function which handles
      gpwrdn disconnect detect flow and exits hibernation
      without restoring the registers.
    - Updated exiting from hibernation in GPWRDN_STS_CHGINT with
      calling dwc_handle_gpwrdn_disc_det() function. Here no register
      is restored which is the solution described above.
    
    Fixes: 65c9c4c6b01f ("usb: dwc2: Add dwc2_handle_gpwrdn_intr() handler")
    Acked-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
    Signed-off-by: Artur Petrosyan <Arthur.Petrosyan@synopsys.com>
    Signed-off-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
    Link: https://lore.kernel.org/r/20210416124715.75355A005D@mailhost.synopsys.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/dwc2/core_intr.c b/drivers/usb/dwc2/core_intr.c
index 14efa28e048f..af26a8a20e0b 100644
--- a/drivers/usb/dwc2/core_intr.c
+++ b/drivers/usb/dwc2/core_intr.c
@@ -653,6 +653,71 @@ static u32 dwc2_read_common_intr(struct dwc2_hsotg *hsotg)
 		return 0;
 }
 
+/**
+ * dwc_handle_gpwrdn_disc_det() - Handles the gpwrdn disconnect detect.
+ * Exits hibernation without restoring registers.
+ *
+ * @hsotg: Programming view of DWC_otg controller
+ * @gpwrdn: GPWRDN register
+ */
+static inline void dwc_handle_gpwrdn_disc_det(struct dwc2_hsotg *hsotg,
+					      u32 gpwrdn)
+{
+	u32 gpwrdn_tmp;
+
+	/* Switch-on voltage to the core */
+	gpwrdn_tmp = dwc2_readl(hsotg, GPWRDN);
+	gpwrdn_tmp &= ~GPWRDN_PWRDNSWTCH;
+	dwc2_writel(hsotg, gpwrdn_tmp, GPWRDN);
+	udelay(5);
+
+	/* Reset core */
+	gpwrdn_tmp = dwc2_readl(hsotg, GPWRDN);
+	gpwrdn_tmp &= ~GPWRDN_PWRDNRSTN;
+	dwc2_writel(hsotg, gpwrdn_tmp, GPWRDN);
+	udelay(5);
+
+	/* Disable Power Down Clamp */
+	gpwrdn_tmp = dwc2_readl(hsotg, GPWRDN);
+	gpwrdn_tmp &= ~GPWRDN_PWRDNCLMP;
+	dwc2_writel(hsotg, gpwrdn_tmp, GPWRDN);
+	udelay(5);
+
+	/* Deassert reset core */
+	gpwrdn_tmp = dwc2_readl(hsotg, GPWRDN);
+	gpwrdn_tmp |= GPWRDN_PWRDNRSTN;
+	dwc2_writel(hsotg, gpwrdn_tmp, GPWRDN);
+	udelay(5);
+
+	/* Disable PMU interrupt */
+	gpwrdn_tmp = dwc2_readl(hsotg, GPWRDN);
+	gpwrdn_tmp &= ~GPWRDN_PMUINTSEL;
+	dwc2_writel(hsotg, gpwrdn_tmp, GPWRDN);
+
+	/* De-assert Wakeup Logic */
+	gpwrdn_tmp = dwc2_readl(hsotg, GPWRDN);
+	gpwrdn_tmp &= ~GPWRDN_PMUACTV;
+	dwc2_writel(hsotg, gpwrdn_tmp, GPWRDN);
+
+	hsotg->hibernated = 0;
+	hsotg->bus_suspended = 0;
+
+	if (gpwrdn & GPWRDN_IDSTS) {
+		hsotg->op_state = OTG_STATE_B_PERIPHERAL;
+		dwc2_core_init(hsotg, false);
+		dwc2_enable_global_interrupts(hsotg);
+		dwc2_hsotg_core_init_disconnected(hsotg, false);
+		dwc2_hsotg_core_connect(hsotg);
+	} else {
+		hsotg->op_state = OTG_STATE_A_HOST;
+
+		/* Initialize the Core for Host mode */
+		dwc2_core_init(hsotg, false);
+		dwc2_enable_global_interrupts(hsotg);
+		dwc2_hcd_start(hsotg);
+	}
+}
+
 /*
  * GPWRDN interrupt handler.
  *
@@ -674,64 +739,14 @@ static void dwc2_handle_gpwrdn_intr(struct dwc2_hsotg *hsotg)
 
 	if ((gpwrdn & GPWRDN_DISCONN_DET) &&
 	    (gpwrdn & GPWRDN_DISCONN_DET_MSK) && !linestate) {
-		u32 gpwrdn_tmp;
-
 		dev_dbg(hsotg->dev, "%s: GPWRDN_DISCONN_DET\n", __func__);
-
-		/* Switch-on voltage to the core */
-		gpwrdn_tmp = dwc2_readl(hsotg, GPWRDN);
-		gpwrdn_tmp &= ~GPWRDN_PWRDNSWTCH;
-		dwc2_writel(hsotg, gpwrdn_tmp, GPWRDN);
-		udelay(10);
-
-		/* Reset core */
-		gpwrdn_tmp = dwc2_readl(hsotg, GPWRDN);
-		gpwrdn_tmp &= ~GPWRDN_PWRDNRSTN;
-		dwc2_writel(hsotg, gpwrdn_tmp, GPWRDN);
-		udelay(10);
-
-		/* Disable Power Down Clamp */
-		gpwrdn_tmp = dwc2_readl(hsotg, GPWRDN);
-		gpwrdn_tmp &= ~GPWRDN_PWRDNCLMP;
-		dwc2_writel(hsotg, gpwrdn_tmp, GPWRDN);
-		udelay(10);
-
-		/* Deassert reset core */
-		gpwrdn_tmp = dwc2_readl(hsotg, GPWRDN);
-		gpwrdn_tmp |= GPWRDN_PWRDNRSTN;
-		dwc2_writel(hsotg, gpwrdn_tmp, GPWRDN);
-		udelay(10);
-
-		/* Disable PMU interrupt */
-		gpwrdn_tmp = dwc2_readl(hsotg, GPWRDN);
-		gpwrdn_tmp &= ~GPWRDN_PMUINTSEL;
-		dwc2_writel(hsotg, gpwrdn_tmp, GPWRDN);
-
-		/* De-assert Wakeup Logic */
-		gpwrdn_tmp = dwc2_readl(hsotg, GPWRDN);
-		gpwrdn_tmp &= ~GPWRDN_PMUACTV;
-		dwc2_writel(hsotg, gpwrdn_tmp, GPWRDN);
-
-		hsotg->hibernated = 0;
-
-		if (gpwrdn & GPWRDN_IDSTS) {
-			hsotg->op_state = OTG_STATE_B_PERIPHERAL;
-			dwc2_core_init(hsotg, false);
-			dwc2_enable_global_interrupts(hsotg);
-			dwc2_hsotg_core_init_disconnected(hsotg, false);
-			dwc2_hsotg_core_connect(hsotg);
-		} else {
-			hsotg->op_state = OTG_STATE_A_HOST;
-
-			/* Initialize the Core for Host mode */
-			dwc2_core_init(hsotg, false);
-			dwc2_enable_global_interrupts(hsotg);
-			dwc2_hcd_start(hsotg);
-		}
-	}
-
-	if ((gpwrdn & GPWRDN_LNSTSCHG) &&
-	    (gpwrdn & GPWRDN_LNSTSCHG_MSK) && linestate) {
+		/*
+		 * Call disconnect detect function to exit from
+		 * hibernation
+		 */
+		dwc_handle_gpwrdn_disc_det(hsotg, gpwrdn);
+	} else if ((gpwrdn & GPWRDN_LNSTSCHG) &&
+		   (gpwrdn & GPWRDN_LNSTSCHG_MSK) && linestate) {
 		dev_dbg(hsotg->dev, "%s: GPWRDN_LNSTSCHG\n", __func__);
 		if (hsotg->hw_params.hibernation &&
 		    hsotg->hibernated) {
@@ -742,24 +757,21 @@ static void dwc2_handle_gpwrdn_intr(struct dwc2_hsotg *hsotg)
 				dwc2_exit_hibernation(hsotg, 1, 0, 1);
 			}
 		}
-	}
-	if ((gpwrdn & GPWRDN_RST_DET) && (gpwrdn & GPWRDN_RST_DET_MSK)) {
+	} else if ((gpwrdn & GPWRDN_RST_DET) &&
+		   (gpwrdn & GPWRDN_RST_DET_MSK)) {
 		dev_dbg(hsotg->dev, "%s: GPWRDN_RST_DET\n", __func__);
 		if (!linestate && (gpwrdn & GPWRDN_BSESSVLD))
 			dwc2_exit_hibernation(hsotg, 0, 1, 0);
-	}
-	if ((gpwrdn & GPWRDN_STS_CHGINT) &&
-	    (gpwrdn & GPWRDN_STS_CHGINT_MSK) && linestate) {
+	} else if ((gpwrdn & GPWRDN_STS_CHGINT) &&
+		   (gpwrdn & GPWRDN_STS_CHGINT_MSK)) {
 		dev_dbg(hsotg->dev, "%s: GPWRDN_STS_CHGINT\n", __func__);
-		if (hsotg->hw_params.hibernation &&
-		    hsotg->hibernated) {
-			if (gpwrdn & GPWRDN_IDSTS) {
-				dwc2_exit_hibernation(hsotg, 0, 0, 0);
-				call_gadget(hsotg, resume);
-			} else {
-				dwc2_exit_hibernation(hsotg, 1, 0, 1);
-			}
-		}
+		/*
+		 * As GPWRDN_STS_CHGINT exit from hibernation flow is
+		 * the same as in GPWRDN_DISCONN_DET flow. Call
+		 * disconnect detect helper function to exit from
+		 * hibernation.
+		 */
+		dwc_handle_gpwrdn_disc_det(hsotg, gpwrdn);
 	}
 }
 

commit edf356f246410d74cebe4291312cdcfa1206fbb3
Author: Artur Petrosyan <Arthur.Petrosyan@synopsys.com>
Date:   Fri Apr 16 16:47:06 2021 +0400

    usb: dwc2: Fix host mode hibernation exit with remote wakeup flow.
    
    [ Upstream commit c2db8d7b9568b10e014af83b3c15e39929e3579e ]
    
    Added setting "port_connect_status_change" flag to "1" in order
    to re-enumerate, because after exit from hibernation port
    connection status is not detected.
    
    Fixes: c5c403dc4336 ("usb: dwc2: Add host/device hibernation functions")
    Acked-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
    Signed-off-by: Artur Petrosyan <Arthur.Petrosyan@synopsys.com>
    Link: https://lore.kernel.org/r/20210416124707.5EEC2A005D@mailhost.synopsys.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c
index 91686e1b24d9..58e53e3d905b 100644
--- a/drivers/usb/dwc2/hcd.c
+++ b/drivers/usb/dwc2/hcd.c
@@ -5741,7 +5741,15 @@ int dwc2_host_exit_hibernation(struct dwc2_hsotg *hsotg, int rem_wakeup,
 		return ret;
 	}
 
-	dwc2_hcd_rem_wakeup(hsotg);
+	if (rem_wakeup) {
+		dwc2_hcd_rem_wakeup(hsotg);
+		/*
+		 * Change "port_connect_status_change" flag to re-enumerate,
+		 * because after exit from hibernation port connection status
+		 * is not detected.
+		 */
+		hsotg->flags.b.port_connect_status_change = 1;
+	}
 
 	hsotg->hibernated = 0;
 	hsotg->bus_suspended = 0;

commit feb4750ef9b8cb26c8ae5933479cad9f16451f6a
Author: Michael Kelley <mikelley@microsoft.com>
Date:   Mon Apr 19 21:48:09 2021 -0700

    Drivers: hv: vmbus: Increase wait time for VMbus unload
    
    [ Upstream commit 77db0ec8b7764cb9b09b78066ebfd47b2c0c1909 ]
    
    When running in Azure, disks may be connected to a Linux VM with
    read/write caching enabled. If a VM panics and issues a VMbus
    UNLOAD request to Hyper-V, the response is delayed until all dirty
    data in the disk cache is flushed.  In extreme cases, this flushing
    can take 10's of seconds, depending on the disk speed and the amount
    of dirty data. If kdump is configured for the VM, the current 10 second
    timeout in vmbus_wait_for_unload() may be exceeded, and the UNLOAD
    complete message may arrive well after the kdump kernel is already
    running, causing problems.  Note that no problem occurs if kdump is
    not enabled because Hyper-V waits for the cache flush before doing
    a reboot through the BIOS/UEFI code.
    
    Fix this problem by increasing the timeout in vmbus_wait_for_unload()
    to 100 seconds. Also output periodic messages so that if anyone is
    watching the serial console, they won't think the VM is completely
    hung.
    
    Fixes: 911e1987efc8 ("Drivers: hv: vmbus: Add timeout to vmbus_wait_for_unload")
    Signed-off-by: Michael Kelley <mikelley@microsoft.com>
    Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com>
    Link: https://lore.kernel.org/r/1618894089-126662-1-git-send-email-mikelley@microsoft.com
    Signed-off-by: Wei Liu <wei.liu@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c
index ac9617671757..cdd4392c589d 100644
--- a/drivers/hv/channel_mgmt.c
+++ b/drivers/hv/channel_mgmt.c
@@ -773,6 +773,12 @@ static void init_vp_index(struct vmbus_channel *channel, u16 dev_type)
 	free_cpumask_var(available_mask);
 }
 
+#define UNLOAD_DELAY_UNIT_MS	10		/* 10 milliseconds */
+#define UNLOAD_WAIT_MS		(100*1000)	/* 100 seconds */
+#define UNLOAD_WAIT_LOOPS	(UNLOAD_WAIT_MS/UNLOAD_DELAY_UNIT_MS)
+#define UNLOAD_MSG_MS		(5*1000)	/* Every 5 seconds */
+#define UNLOAD_MSG_LOOPS	(UNLOAD_MSG_MS/UNLOAD_DELAY_UNIT_MS)
+
 static void vmbus_wait_for_unload(void)
 {
 	int cpu;
@@ -790,12 +796,17 @@ static void vmbus_wait_for_unload(void)
 	 * vmbus_connection.unload_event. If not, the last thing we can do is
 	 * read message pages for all CPUs directly.
 	 *
-	 * Wait no more than 10 seconds so that the panic path can't get
-	 * hung forever in case the response message isn't seen.
+	 * Wait up to 100 seconds since an Azure host must writeback any dirty
+	 * data in its disk cache before the VMbus UNLOAD request will
+	 * complete. This flushing has been empirically observed to take up
+	 * to 50 seconds in cases with a lot of dirty data, so allow additional
+	 * leeway and for inaccuracies in mdelay(). But eventually time out so
+	 * that the panic path can't get hung forever in case the response
+	 * message isn't seen.
 	 */
-	for (i = 0; i < 1000; i++) {
+	for (i = 1; i <= UNLOAD_WAIT_LOOPS; i++) {
 		if (completion_done(&vmbus_connection.unload_event))
-			break;
+			goto completed;
 
 		for_each_online_cpu(cpu) {
 			struct hv_per_cpu_context *hv_cpu
@@ -818,9 +829,18 @@ static void vmbus_wait_for_unload(void)
 			vmbus_signal_eom(msg, message_type);
 		}
 
-		mdelay(10);
+		/*
+		 * Give a notice periodically so someone watching the
+		 * serial output won't think it is completely hung.
+		 */
+		if (!(i % UNLOAD_MSG_LOOPS))
+			pr_notice("Waiting for VMBus UNLOAD to complete\n");
+
+		mdelay(UNLOAD_DELAY_UNIT_MS);
 	}
+	pr_err("Continuing even though VMBus UNLOAD did not complete\n");
 
+completed:
 	/*
 	 * We're crashing and already got the UNLOAD_RESPONSE, cleanup all
 	 * maybe-pending messages on all CPUs to be able to receive new

commit 8708714728047b44b3c2f73c50b87b3e1aaab85d
Author: Ingo Molnar <mingo@kernel.org>
Date:   Tue Apr 20 09:47:42 2021 +0200

    x86/platform/uv: Fix !KEXEC build failure
    
    [ Upstream commit c2209ea55612efac75de0a58ef5f7394fae7fa0f ]
    
    When KEXEC is disabled, the UV build fails:
    
      arch/x86/platform/uv/uv_nmi.c:875:14: error: ?uv_nmi_kexec_failed??undeclared (first use in this function)
    
    Since uv_nmi_kexec_failed is only defined in the KEXEC_CORE #ifdef branch,
    this code cannot ever have been build tested:
    
            if (main)
                    pr_err("UV: NMI kdump: KEXEC not supported in this kernel\n");
            atomic_set(&uv_nmi_kexec_failed, 1);
    
    Nor is this use possible in uv_handle_nmi():
    
                    atomic_set(&uv_nmi_kexec_failed, 0);
    
    These bugs were introduced in this commit:
    
        d0a9964e9873: ("x86/platform/uv: Implement simple dump failover if kdump fails")
    
    Which added the uv_nmi_kexec_failed assignments to !KEXEC code, while making the
    definition KEXEC-only - apparently without testing the !KEXEC case.
    
    Instead of complicating the #ifdef maze, simplify the code by requiring X86_UV
    to depend on KEXEC_CORE. This pattern is present in other architectures as well.
    
    ( We'll remove the untested, 7 years old !KEXEC complications from the file in a
      separate commit. )
    
    Fixes: d0a9964e9873: ("x86/platform/uv: Implement simple dump failover if kdump fails")
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Cc: Mike Travis <travis@sgi.com>
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index af35f5caadbe..d994501d9179 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -533,6 +533,7 @@ config X86_UV
 	depends on X86_EXTENDED_PLATFORM
 	depends on NUMA
 	depends on EFI
+	depends on KEXEC_CORE
 	depends on X86_X2APIC
 	depends on PCI
 	---help---

commit a6043642b2c5003e7c30c30d2e022e4cfcd75ddd
Author: Steffen Dirkwinkel <s.dirkwinkel@beckhoff.com>
Date:   Mon Apr 12 15:30:06 2021 +0200

    platform/x86: pmc_atom: Match all Beckhoff Automation baytrail boards with critclk_systems DMI table
    
    [ Upstream commit d21e5abd3a005253eb033090aab2e43bce090d89 ]
    
    pmc_plt_clk* clocks are used for ethernet controllers, so need to stay
    turned on. This adds the affected board family to critclk_systems DMI
    table, so the clocks are marked as CLK_CRITICAL and not turned off.
    
    This replaces the previously listed boards with a match for the whole
    device family CBxx63. CBxx63 matches only baytrail devices.
    There are new affected boards that would otherwise need to be listed.
    There are unaffected boards in the family, but having the clocks
    turned on is not an issue.
    
    Fixes: 648e921888ad ("clk: x86: Stop marking clocks as CLK_IS_CRITICAL")
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Signed-off-by: Steffen Dirkwinkel <s.dirkwinkel@beckhoff.com>
    Link: https://lore.kernel.org/r/20210412133006.397679-1-linux-kernel-dev@beckhoff.com
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/platform/x86/pmc_atom.c b/drivers/platform/x86/pmc_atom.c
index 26351e9e0aaf..682fc49d172c 100644
--- a/drivers/platform/x86/pmc_atom.c
+++ b/drivers/platform/x86/pmc_atom.c
@@ -423,34 +423,10 @@ static const struct dmi_system_id critclk_systems[] = {
 	},
 	{
 		/* pmc_plt_clk* - are used for ethernet controllers */
-		.ident = "Beckhoff CB3163",
+		.ident = "Beckhoff Baytrail",
 		.matches = {
 			DMI_MATCH(DMI_SYS_VENDOR, "Beckhoff Automation"),
-			DMI_MATCH(DMI_BOARD_NAME, "CB3163"),
-		},
-	},
-	{
-		/* pmc_plt_clk* - are used for ethernet controllers */
-		.ident = "Beckhoff CB4063",
-		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Beckhoff Automation"),
-			DMI_MATCH(DMI_BOARD_NAME, "CB4063"),
-		},
-	},
-	{
-		/* pmc_plt_clk* - are used for ethernet controllers */
-		.ident = "Beckhoff CB6263",
-		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Beckhoff Automation"),
-			DMI_MATCH(DMI_BOARD_NAME, "CB6263"),
-		},
-	},
-	{
-		/* pmc_plt_clk* - are used for ethernet controllers */
-		.ident = "Beckhoff CB6363",
-		.matches = {
-			DMI_MATCH(DMI_SYS_VENDOR, "Beckhoff Automation"),
-			DMI_MATCH(DMI_BOARD_NAME, "CB6363"),
+			DMI_MATCH(DMI_PRODUCT_FAMILY, "CBxx63"),
 		},
 	},
 	{

commit c9eac814f950d72d1bd657d6a7854eaa81711680
Author: Ye Bin <yebin10@huawei.com>
Date:   Thu Apr 8 19:23:05 2021 +0800

    usbip: vudc: fix missing unlock on error in usbip_sockfd_store()
    
    [ Upstream commit 1d08ed588c6a85a35a24c82eb4cf0807ec2b366a ]
    
    Add the missing unlock before return from function usbip_sockfd_store()
    in the error handling case.
    
    Fixes: bd8b82042269 ("usbip: vudc synchronize sysfs code paths")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Acked-by: Shuah Khan <skhan@linuxfoundation.org>
    Signed-off-by: Ye Bin <yebin10@huawei.com>
    Link: https://lore.kernel.org/r/20210408112305.1022247-1-yebin10@huawei.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/usbip/vudc_sysfs.c b/drivers/usb/usbip/vudc_sysfs.c
index de2babadd146..7b1437a51304 100644
--- a/drivers/usb/usbip/vudc_sysfs.c
+++ b/drivers/usb/usbip/vudc_sysfs.c
@@ -157,12 +157,14 @@ static ssize_t usbip_sockfd_store(struct device *dev,
 		tcp_rx = kthread_create(&v_rx_loop, &udc->ud, "vudc_rx");
 		if (IS_ERR(tcp_rx)) {
 			sockfd_put(socket);
+			mutex_unlock(&udc->ud.sysfs_lock);
 			return -EINVAL;
 		}
 		tcp_tx = kthread_create(&v_tx_loop, &udc->ud, "vudc_tx");
 		if (IS_ERR(tcp_tx)) {
 			kthread_stop(tcp_rx);
 			sockfd_put(socket);
+			mutex_unlock(&udc->ud.sysfs_lock);
 			return -EINVAL;
 		}
 

commit 4766ffd12a200c933ed9d8323c9ac27ba2834607
Author: He Ying <heying24@huawei.com>
Date:   Tue Apr 6 05:42:00 2021 -0400

    firmware: qcom-scm: Fix QCOM_SCM configuration
    
    [ Upstream commit 2954a6f12f250890ec2433cec03ba92784d613e8 ]
    
    When CONFIG_QCOM_SCM is y and CONFIG_HAVE_ARM_SMCCC
    is not set, compiling errors are encountered as follows:
    
    drivers/firmware/qcom_scm-smc.o: In function `__scm_smc_do_quirk':
    qcom_scm-smc.c:(.text+0x36): undefined reference to `__arm_smccc_smc'
    drivers/firmware/qcom_scm-legacy.o: In function `scm_legacy_call':
    qcom_scm-legacy.c:(.text+0xe2): undefined reference to `__arm_smccc_smc'
    drivers/firmware/qcom_scm-legacy.o: In function `scm_legacy_call_atomic':
    qcom_scm-legacy.c:(.text+0x1f0): undefined reference to `__arm_smccc_smc'
    
    Note that __arm_smccc_smc is defined when HAVE_ARM_SMCCC is y.
    So add dependency on HAVE_ARM_SMCCC in QCOM_SCM configuration.
    
    Fixes: 916f743da354 ("firmware: qcom: scm: Move the scm driver to drivers/firmware")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: He Ying <heying24@huawei.com>
    Link: https://lore.kernel.org/r/20210406094200.60952-1-heying24@huawei.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig
index ed212c8b4108..1c419e4cea83 100644
--- a/drivers/firmware/Kconfig
+++ b/drivers/firmware/Kconfig
@@ -248,6 +248,7 @@ config FW_CFG_SYSFS_CMDLINE
 config QCOM_SCM
 	bool
 	depends on ARM || ARM64
+	depends on HAVE_ARM_SMCCC
 	select RESET_CONTROLLER
 
 config QCOM_SCM_32

commit 76d7fc0857bc4033415fcad905db13753d0febc7
Author: Johan Hovold <johan@kernel.org>
Date:   Wed Apr 7 11:52:02 2021 +0200

    tty: fix return value for unsupported ioctls
    
    [ Upstream commit 1b8b20868a6d64cfe8174a21b25b74367bdf0560 ]
    
    Drivers should return -ENOTTY ("Inappropriate I/O control operation")
    when an ioctl isn't supported, while -EINVAL is used for invalid
    arguments.
    
    Fix up the TIOCMGET, TIOCMSET and TIOCGICOUNT helpers which returned
    -EINVAL when a tty driver did not implement the corresponding
    operations.
    
    Note that the TIOCMGET and TIOCMSET helpers predate git and do not get a
    corresponding Fixes tag below.
    
    Fixes: d281da7ff6f7 ("tty: Make tiocgicount a handler")
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20210407095208.31838-3-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
index ff6a360eef1e..9e9343adc2b4 100644
--- a/drivers/tty/tty_io.c
+++ b/drivers/tty/tty_io.c
@@ -2432,14 +2432,14 @@ static int send_break(struct tty_struct *tty, unsigned int duration)
  *	@p: pointer to result
  *
  *	Obtain the modem status bits from the tty driver if the feature
- *	is supported. Return -EINVAL if it is not available.
+ *	is supported. Return -ENOTTY if it is not available.
  *
  *	Locking: none (up to the driver)
  */
 
 static int tty_tiocmget(struct tty_struct *tty, int __user *p)
 {
-	int retval = -EINVAL;
+	int retval = -ENOTTY;
 
 	if (tty->ops->tiocmget) {
 		retval = tty->ops->tiocmget(tty);
@@ -2457,7 +2457,7 @@ static int tty_tiocmget(struct tty_struct *tty, int __user *p)
  *	@p: pointer to desired bits
  *
  *	Set the modem status bits from the tty driver if the feature
- *	is supported. Return -EINVAL if it is not available.
+ *	is supported. Return -ENOTTY if it is not available.
  *
  *	Locking: none (up to the driver)
  */
@@ -2469,7 +2469,7 @@ static int tty_tiocmset(struct tty_struct *tty, unsigned int cmd,
 	unsigned int set, clear, val;
 
 	if (tty->ops->tiocmset == NULL)
-		return -EINVAL;
+		return -ENOTTY;
 
 	retval = get_user(val, p);
 	if (retval)
diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h
index 71dbc891851a..e10b09672345 100644
--- a/include/linux/tty_driver.h
+++ b/include/linux/tty_driver.h
@@ -236,7 +236,7 @@
  *
  *	Called when the device receives a TIOCGICOUNT ioctl. Passed a kernel
  *	structure to complete. This method is optional and will only be called
- *	if provided (otherwise EINVAL will be returned).
+ *	if provided (otherwise ENOTTY will be returned).
  */
 
 #include <linux/export.h>

commit 2c9525d64418383861679d3519ebc10002123507
Author: Johan Hovold <johan@kernel.org>
Date:   Wed Apr 7 11:52:01 2021 +0200

    tty: actually undefine superseded ASYNC flags
    
    [ Upstream commit d09845e98a05850a8094ea8fd6dd09a8e6824fff ]
    
    Some kernel-internal ASYNC flags have been superseded by tty-port flags
    and should no longer be used by kernel drivers.
    
    Fix the misspelled "__KERNEL__" compile guards which failed their sole
    purpose to break out-of-tree drivers that have not yet been updated.
    
    Fixes: 5c0517fefc92 ("tty: core: Undefine ASYNC_* flags superceded by TTY_PORT* flags")
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20210407095208.31838-2-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/include/uapi/linux/tty_flags.h b/include/uapi/linux/tty_flags.h
index 900a32e63424..6a3ac496a56c 100644
--- a/include/uapi/linux/tty_flags.h
+++ b/include/uapi/linux/tty_flags.h
@@ -39,7 +39,7 @@
  * WARNING: These flags are no longer used and have been superceded by the
  *	    TTY_PORT_ flags in the iflags field (and not userspace-visible)
  */
-#ifndef _KERNEL_
+#ifndef __KERNEL__
 #define ASYNCB_INITIALIZED	31 /* Serial port was initialized */
 #define ASYNCB_SUSPENDED	30 /* Serial port is suspended */
 #define ASYNCB_NORMAL_ACTIVE	29 /* Normal device is active */
@@ -81,7 +81,7 @@
 #define ASYNC_SPD_WARP		(ASYNC_SPD_HI|ASYNC_SPD_SHI)
 #define ASYNC_SPD_MASK		(ASYNC_SPD_HI|ASYNC_SPD_VHI|ASYNC_SPD_SHI)
 
-#ifndef _KERNEL_
+#ifndef __KERNEL__
 /* These flags are no longer used (and were always masked from userspace) */
 #define ASYNC_INITIALIZED	(1U << ASYNCB_INITIALIZED)
 #define ASYNC_NORMAL_ACTIVE	(1U << ASYNCB_NORMAL_ACTIVE)

commit e601f9a66b43dc715a2782017ff890fa028e9aa5
Author: Johan Hovold <johan@kernel.org>
Date:   Thu Apr 8 15:16:01 2021 +0200

    USB: cdc-acm: fix unprivileged TIOCCSERIAL
    
    [ Upstream commit dd5619582d60007139f0447382d2839f4f9e339b ]
    
    TIOCSSERIAL is a horrid, underspecified, legacy interface which for most
    serial devices is only useful for setting the close_delay and
    closing_wait parameters.
    
    A non-privileged user has only ever been able to set the since long
    deprecated ASYNC_SPD flags and trying to change any other *supported*
    feature should result in -EPERM being returned. Setting the current
    values for any supported features should return success.
    
    Fix the cdc-acm implementation which instead indicated that the
    TIOCSSERIAL ioctl was not even implemented when a non-privileged user
    set the current values.
    
    Fixes: ba2d8ce9db0a ("cdc-acm: implement TIOCSSERIAL to avoid blocking close(2)")
    Acked-by: Oliver Neukum <oneukum@suse.com>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20210408131602.27956-3-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index 7f4f21ba8efc..738de8c9c354 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -987,8 +987,6 @@ static int set_serial_info(struct acm *acm,
 		if ((new_serial.close_delay != old_close_delay) ||
 	            (new_serial.closing_wait != old_closing_wait))
 			retval = -EPERM;
-		else
-			retval = -EOPNOTSUPP;
 	} else {
 		acm->port.close_delay  = close_delay;
 		acm->port.closing_wait = closing_wait;

commit 659ae4a027e2f8538303e700d3374860e330a768
Author: Colin Ian King <colin.king@canonical.com>
Date:   Tue Apr 6 19:45:10 2021 +0100

    usb: gadget: r8a66597: Add missing null check on return from platform_get_resource
    
    [ Upstream commit 9c2076090c2815fe7c49676df68dde7e60a9b9fc ]
    
    The call to platform_get_resource can potentially return a NULL pointer
    on failure, so add this check and return -EINVAL if it fails.
    
    Fixes: c41442474a26 ("usb: gadget: R8A66597 peripheral controller support.")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Addresses-Coverity: ("Dereference null return")
    Link: https://lore.kernel.org/r/20210406184510.433497-1-colin.king@canonical.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/udc/r8a66597-udc.c b/drivers/usb/gadget/udc/r8a66597-udc.c
index 11e25a3f4f1f..a766476fd742 100644
--- a/drivers/usb/gadget/udc/r8a66597-udc.c
+++ b/drivers/usb/gadget/udc/r8a66597-udc.c
@@ -1852,6 +1852,8 @@ static int r8a66597_probe(struct platform_device *pdev)
 		return PTR_ERR(reg);
 
 	ires = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+	if (!ires)
+		return -EINVAL;
 	irq = ires->start;
 	irq_trigger = ires->flags & IRQF_TRIGGER_MASK;
 

commit a9f5b5e2be8e8b308fbe52b68f8e2cb047cef040
Author: Pali Rohár <pali@kernel.org>
Date:   Thu Apr 8 13:42:21 2021 +0200

    cpufreq: armada-37xx: Fix determining base CPU frequency
    
    [ Upstream commit 8bad3bf23cbc40abe1d24cec08a114df6facf858 ]
    
    When current CPU load is not L0 then loading armada-37xx-cpufreq.ko driver
    fails with following error:
    
        # modprobe armada-37xx-cpufreq
        [  502.702097] Unsupported CPU frequency 250 MHz
    
    This issue was partially fixed by commit 8db82563451f ("cpufreq:
    armada-37xx: fix frequency calculation for opp"), but only for calculating
    CPU frequency for opp.
    
    Fix this also for determination of base CPU frequency.
    
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Acked-by: Gregory CLEMENT <gregory.clement@bootlin.com>
    Tested-by: Tomasz Maciej Nowak <tmn505@gmail.com>
    Tested-by: Anders Trier Olesen <anders.trier.olesen@gmail.com>
    Tested-by: Philip Soares <philips@netisense.com>
    Fixes: 92ce45fb875d ("cpufreq: Add DVFS support for Armada 37xx")
    Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/cpufreq/armada-37xx-cpufreq.c b/drivers/cpufreq/armada-37xx-cpufreq.c
index 6a4ac26ac6a8..a36452bd9612 100644
--- a/drivers/cpufreq/armada-37xx-cpufreq.c
+++ b/drivers/cpufreq/armada-37xx-cpufreq.c
@@ -471,7 +471,7 @@ static int __init armada37xx_cpufreq_driver_init(void)
 		return -EINVAL;
 	}
 
-	dvfs = armada_37xx_cpu_freq_info_get(cur_frequency);
+	dvfs = armada_37xx_cpu_freq_info_get(base_frequency);
 	if (!dvfs) {
 		clk_put(clk);
 		return -EINVAL;

commit 04e840872076cb4fa76ac514d7cd7ec6825c39db
Author: Pali Rohár <pali@kernel.org>
Date:   Thu Apr 8 13:42:20 2021 +0200

    cpufreq: armada-37xx: Fix driver cleanup when registration failed
    
    [ Upstream commit 92963903a8e11b9576eb7249f8e81eefa93b6f96 ]
    
    Commit 8db82563451f ("cpufreq: armada-37xx: fix frequency calculation for
    opp") changed calculation of frequency passed to the dev_pm_opp_add()
    function call. But the code for dev_pm_opp_remove() function call was not
    updated, so the driver cleanup phase does not work when registration fails.
    
    This fixes the issue by using the same frequency in both calls.
    
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Acked-by: Gregory CLEMENT <gregory.clement@bootlin.com>
    Tested-by: Tomasz Maciej Nowak <tmn505@gmail.com>
    Tested-by: Anders Trier Olesen <anders.trier.olesen@gmail.com>
    Tested-by: Philip Soares <philips@netisense.com>
    Fixes: 8db82563451f ("cpufreq: armada-37xx: fix frequency calculation for opp")
    Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/cpufreq/armada-37xx-cpufreq.c b/drivers/cpufreq/armada-37xx-cpufreq.c
index dacb17e28305..6a4ac26ac6a8 100644
--- a/drivers/cpufreq/armada-37xx-cpufreq.c
+++ b/drivers/cpufreq/armada-37xx-cpufreq.c
@@ -523,7 +523,7 @@ static int __init armada37xx_cpufreq_driver_init(void)
 remove_opp:
 	/* clean-up the already added opp before leaving */
 	while (load_lvl-- > ARMADA_37XX_DVFS_LOAD_0) {
-		freq = cur_frequency / dvfs->divider[load_lvl];
+		freq = base_frequency / dvfs->divider[load_lvl];
 		dev_pm_opp_remove(cpu_dev, freq);
 	}
 

commit 503bffb20186457dc3c9bd8dc97a03a06bc2a767
Author: Pali Rohár <pali@kernel.org>
Date:   Thu Apr 8 13:42:19 2021 +0200

    clk: mvebu: armada-37xx-periph: Fix workaround for switching from L1 to L0
    
    [ Upstream commit e93033aff684641f71a436ca7a9d2a742126baaf ]
    
    When CPU frequency is at 250 MHz and set_rate() is called with 500 MHz (L1)
    quickly followed by a call with 1 GHz (L0), the CPU does not necessarily
    stay in L1 for at least 20ms as is required by Marvell errata.
    
    This situation happens frequently with the ondemand cpufreq governor and
    can be also reproduced with userspace governor. In most cases it causes CPU
    to crash.
    
    This change fixes the above issue and ensures that the CPU always stays in
    L1 for at least 20ms when switching from any state to L0.
    
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Acked-by: Stephen Boyd <sboyd@kernel.org>
    Acked-by: Gregory CLEMENT <gregory.clement@bootlin.com>
    Tested-by: Tomasz Maciej Nowak <tmn505@gmail.com>
    Tested-by: Anders Trier Olesen <anders.trier.olesen@gmail.com>
    Tested-by: Philip Soares <philips@netisense.com>
    Fixes: 61c40f35f5cd ("clk: mvebu: armada-37xx-periph: Fix switching CPU rate from 300Mhz to 1.2GHz")
    Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/clk/mvebu/armada-37xx-periph.c b/drivers/clk/mvebu/armada-37xx-periph.c
index a05449cb0e3b..5d10733d6c04 100644
--- a/drivers/clk/mvebu/armada-37xx-periph.c
+++ b/drivers/clk/mvebu/armada-37xx-periph.c
@@ -74,6 +74,7 @@ struct clk_pm_cpu {
 	void __iomem *reg_div;
 	u8 shift_div;
 	struct regmap *nb_pm_base;
+	unsigned long l1_expiration;
 };
 
 #define to_clk_double_div(_hw) container_of(_hw, struct clk_double_div, hw)
@@ -492,22 +493,52 @@ static long clk_pm_cpu_round_rate(struct clk_hw *hw, unsigned long rate,
  * 2. Sleep 20ms for stabling VDD voltage
  * 3. Then switch from L1 (500/600 MHz) to L0 (1000/1200 MHz).
  */
-static void clk_pm_cpu_set_rate_wa(unsigned long rate, struct regmap *base)
+static void clk_pm_cpu_set_rate_wa(struct clk_pm_cpu *pm_cpu,
+				   unsigned int new_level, unsigned long rate,
+				   struct regmap *base)
 {
 	unsigned int cur_level;
 
-	if (rate < 1000 * 1000 * 1000)
-		return;
-
 	regmap_read(base, ARMADA_37XX_NB_CPU_LOAD, &cur_level);
 	cur_level &= ARMADA_37XX_NB_CPU_LOAD_MASK;
-	if (cur_level <= ARMADA_37XX_DVFS_LOAD_1)
+
+	if (cur_level == new_level)
+		return;
+
+	/*
+	 * System wants to go to L1 on its own. If we are going from L2/L3,
+	 * remember when 20ms will expire. If from L0, set the value so that
+	 * next switch to L0 won't have to wait.
+	 */
+	if (new_level == ARMADA_37XX_DVFS_LOAD_1) {
+		if (cur_level == ARMADA_37XX_DVFS_LOAD_0)
+			pm_cpu->l1_expiration = jiffies;
+		else
+			pm_cpu->l1_expiration = jiffies + msecs_to_jiffies(20);
 		return;
+	}
+
+	/*
+	 * If we are setting to L2/L3, just invalidate L1 expiration time,
+	 * sleeping is not needed.
+	 */
+	if (rate < 1000*1000*1000)
+		goto invalidate_l1_exp;
+
+	/*
+	 * We are going to L0 with rate >= 1GHz. Check whether we have been at
+	 * L1 for long enough time. If not, go to L1 for 20ms.
+	 */
+	if (pm_cpu->l1_expiration && jiffies >= pm_cpu->l1_expiration)
+		goto invalidate_l1_exp;
 
 	regmap_update_bits(base, ARMADA_37XX_NB_CPU_LOAD,
 			   ARMADA_37XX_NB_CPU_LOAD_MASK,
 			   ARMADA_37XX_DVFS_LOAD_1);
 	msleep(20);
+
+invalidate_l1_exp:
+	pm_cpu->l1_expiration = 0;
 }
 
 static int clk_pm_cpu_set_rate(struct clk_hw *hw, unsigned long rate,
@@ -541,7 +572,9 @@ static int clk_pm_cpu_set_rate(struct clk_hw *hw, unsigned long rate,
 			reg = ARMADA_37XX_NB_CPU_LOAD;
 			mask = ARMADA_37XX_NB_CPU_LOAD_MASK;
 
-			clk_pm_cpu_set_rate_wa(rate, base);
+			/* Apply workaround when base CPU frequency is 1000 or 1200 MHz */
+			if (parent_rate >= 1000*1000*1000)
+				clk_pm_cpu_set_rate_wa(pm_cpu, load_level, rate, base);
 
 			regmap_update_bits(base, reg, mask, load_level);
 

commit 5fa6b88c428168150ce8f224ffd3257dd1e5e743
Author: Pali Rohár <pali@kernel.org>
Date:   Thu Apr 8 13:42:18 2021 +0200

    clk: mvebu: armada-37xx-periph: Fix switching CPU freq from 250 Mhz to 1 GHz
    
    [ Upstream commit 4decb9187589f61fe9fc2bc4d9b01160b0a610c5 ]
    
    It was observed that the workaround introduced by commit 61c40f35f5cd
    ("clk: mvebu: armada-37xx-periph: Fix switching CPU rate from 300Mhz to
    1.2GHz") when base CPU frequency is 1.2 GHz is also required when base
    CPU frequency is 1 GHz. Otherwise switching CPU frequency directly from
    L2 (250 MHz) to L0 (1 GHz) causes a crash.
    
    When base CPU frequency is just 800 MHz no crashed were observed during
    switch from L2 to L0.
    
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Acked-by: Stephen Boyd <sboyd@kernel.org>
    Acked-by: Gregory CLEMENT <gregory.clement@bootlin.com>
    Tested-by: Tomasz Maciej Nowak <tmn505@gmail.com>
    Tested-by: Anders Trier Olesen <anders.trier.olesen@gmail.com>
    Tested-by: Philip Soares <philips@netisense.com>
    Fixes: 2089dc33ea0e ("clk: mvebu: armada-37xx-periph: add DVFS support for cpu clocks")
    Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/clk/mvebu/armada-37xx-periph.c b/drivers/clk/mvebu/armada-37xx-periph.c
index a7e40ff3e57d..a05449cb0e3b 100644
--- a/drivers/clk/mvebu/armada-37xx-periph.c
+++ b/drivers/clk/mvebu/armada-37xx-periph.c
@@ -475,8 +475,10 @@ static long clk_pm_cpu_round_rate(struct clk_hw *hw, unsigned long rate,
 }
 
 /*
- * Switching the CPU from the L2 or L3 frequencies (300 and 200 Mhz
- * respectively) to L0 frequency (1.2 Ghz) requires a significant
+ * Workaround when base CPU frequnecy is 1000 or 1200 MHz
+ *
+ * Switching the CPU from the L2 or L3 frequencies (250/300 or 200 MHz
+ * respectively) to L0 frequency (1/1.2 GHz) requires a significant
  * amount of time to let VDD stabilize to the appropriate
  * voltage. This amount of time is large enough that it cannot be
  * covered by the hardware countdown register. Due to this, the CPU
@@ -486,15 +488,15 @@ static long clk_pm_cpu_round_rate(struct clk_hw *hw, unsigned long rate,
  * To work around this problem, we prevent switching directly from the
  * L2/L3 frequencies to the L0 frequency, and instead switch to the L1
  * frequency in-between. The sequence therefore becomes:
- * 1. First switch from L2/L3(200/300MHz) to L1(600MHZ)
+ * 1. First switch from L2/L3 (200/250/300 MHz) to L1 (500/600 MHz)
  * 2. Sleep 20ms for stabling VDD voltage
- * 3. Then switch from L1(600MHZ) to L0(1200Mhz).
+ * 3. Then switch from L1 (500/600 MHz) to L0 (1000/1200 MHz).
  */
 static void clk_pm_cpu_set_rate_wa(unsigned long rate, struct regmap *base)
 {
 	unsigned int cur_level;
 
-	if (rate != 1200 * 1000 * 1000)
+	if (rate < 1000 * 1000 * 1000)
 		return;
 
 	regmap_read(base, ARMADA_37XX_NB_CPU_LOAD, &cur_level);

commit 9c7cfc64de4733680728131068e6126fb57862fc
Author: Pali Rohár <pali@kernel.org>
Date:   Thu Apr 8 13:42:17 2021 +0200

    cpufreq: armada-37xx: Fix the AVS value for load L1
    
    [ Upstream commit d118ac2062b5b8331c8768ac81e016617e0996ee ]
    
    The original CPU voltage value for load L1 is too low for Armada 37xx SoC
    when base CPU frequency is 1000 or 1200 MHz. It leads to instabilities
    where CPU gets stuck soon after dynamic voltage scaling from load L1 to L0.
    
    Update the CPU voltage value for load L1 accordingly when base frequency is
    1000 or 1200 MHz. The minimal L1 value for base CPU frequency 1000 MHz is
    updated from the original 1.05V to 1.108V and for 1200 MHz is updated to
    1.155V. This minimal L1 value is used only in the case when it is lower
    than value for L0.
    
    This change fixes CPU instability issues on 1 GHz and 1.2 GHz variants of
    Espressobin and 1 GHz Turris Mox.
    
    Marvell previously for 1 GHz variant of Espressobin provided a patch [1]
    suitable only for their Marvell Linux kernel 4.4 fork which workarounded
    this issue. Patch forced CPU voltage value to 1.108V in all loads. But
    such change does not fix CPU instability issues on 1.2 GHz variants of
    Armada 3720 SoC.
    
    During testing we come to the conclusion that using 1.108V as minimal
    value for L1 load makes 1 GHz variants of Espressobin and Turris Mox boards
    stable. And similarly 1.155V for 1.2 GHz variant of Espressobin.
    
    These two values 1.108V and 1.155V are documented in Armada 3700 Hardware
    Specifications as typical initial CPU voltage values.
    
    Discussion about this issue is also at the Armbian forum [2].
    
    [1] - https://github.com/MarvellEmbeddedProcessors/linux-marvell/commit/dc33b62c90696afb6adc7dbcc4ebbd48bedec269
    [2] - https://forum.armbian.com/topic/10429-how-to-make-espressobin-v7-stable/
    
    Signed-off-by: Pali Rohár <pali@kernel.org>
    Acked-by: Gregory CLEMENT <gregory.clement@bootlin.com>
    Tested-by: Tomasz Maciej Nowak <tmn505@gmail.com>
    Tested-by: Anders Trier Olesen <anders.trier.olesen@gmail.com>
    Tested-by: Philip Soares <philips@netisense.com>
    Fixes: 1c3528232f4b ("cpufreq: armada-37xx: Add AVS support")
    Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/cpufreq/armada-37xx-cpufreq.c b/drivers/cpufreq/armada-37xx-cpufreq.c
index 99fb0ae7e2d7..dacb17e28305 100644
--- a/drivers/cpufreq/armada-37xx-cpufreq.c
+++ b/drivers/cpufreq/armada-37xx-cpufreq.c
@@ -73,6 +73,8 @@
 #define LOAD_LEVEL_NR	4
 
 #define MIN_VOLT_MV 1000
+#define MIN_VOLT_MV_FOR_L1_1000MHZ 1108
+#define MIN_VOLT_MV_FOR_L1_1200MHZ 1155
 
 /*  AVS value for the corresponding voltage (in mV) */
 static int avs_map[] = {
@@ -208,6 +210,8 @@ static u32 armada_37xx_avs_val_match(int target_vm)
  * - L2 & L3 voltage should be about 150mv smaller than L0 voltage.
  * This function calculates L1 & L2 & L3 AVS values dynamically based
  * on L0 voltage and fill all AVS values to the AVS value table.
+ * When base CPU frequency is 1000 or 1200 MHz then there is additional
+ * minimal avs value for load L1.
  */
 static void __init armada37xx_cpufreq_avs_configure(struct regmap *base,
 						struct armada_37xx_dvfs *dvfs)
@@ -239,6 +243,19 @@ static void __init armada37xx_cpufreq_avs_configure(struct regmap *base,
 		for (load_level = 1; load_level < LOAD_LEVEL_NR; load_level++)
 			dvfs->avs[load_level] = avs_min;
 
+		/*
+		 * Set the avs values for load L0 and L1 when base CPU frequency
+		 * is 1000/1200 MHz to its typical initial values according to
+		 * the Armada 3700 Hardware Specifications.
+		 */
+		if (dvfs->cpu_freq_max >= 1000*1000*1000) {
+			if (dvfs->cpu_freq_max >= 1200*1000*1000)
+				avs_min = armada_37xx_avs_val_match(MIN_VOLT_MV_FOR_L1_1200MHZ);
+			else
+				avs_min = armada_37xx_avs_val_match(MIN_VOLT_MV_FOR_L1_1000MHZ);
+			dvfs->avs[0] = dvfs->avs[1] = avs_min;
+		}
+
 		return;
 	}
 
@@ -258,6 +275,26 @@ static void __init armada37xx_cpufreq_avs_configure(struct regmap *base,
 	target_vm = avs_map[l0_vdd_min] - 150;
 	target_vm = target_vm > MIN_VOLT_MV ? target_vm : MIN_VOLT_MV;
 	dvfs->avs[2] = dvfs->avs[3] = armada_37xx_avs_val_match(target_vm);
+
+	/*
+	 * Fix the avs value for load L1 when base CPU frequency is 1000/1200 MHz,
+	 * otherwise the CPU gets stuck when switching from load L1 to load L0.
+	 * Also ensure that avs value for load L1 is not higher than for L0.
+	 */
+	if (dvfs->cpu_freq_max >= 1000*1000*1000) {
+		u32 avs_min_l1;
+
+		if (dvfs->cpu_freq_max >= 1200*1000*1000)
+			avs_min_l1 = armada_37xx_avs_val_match(MIN_VOLT_MV_FOR_L1_1200MHZ);
+		else
+			avs_min_l1 = armada_37xx_avs_val_match(MIN_VOLT_MV_FOR_L1_1000MHZ);
+
+		if (avs_min_l1 > dvfs->avs[0])
+			avs_min_l1 = dvfs->avs[0];
+
+		if (dvfs->avs[1] < avs_min_l1)
+			dvfs->avs[1] = avs_min_l1;
+	}
 }
 
 static void __init armada37xx_cpufreq_avs_setup(struct regmap *base,

commit fe4f49dc91270a2d5e32929c35d628001da2c2b5
Author: Marek Behún <kabel@kernel.org>
Date:   Thu Apr 8 13:42:16 2021 +0200

    clk: mvebu: armada-37xx-periph: remove .set_parent method for CPU PM clock
    
    [ Upstream commit 4e435a9dd26c46ac018997cc0562d50b1a96f372 ]
    
    Remove the .set_parent method in clk_pm_cpu_ops.
    
    This method was supposed to be needed by the armada-37xx-cpufreq driver,
    but was never actually called due to wrong assumptions in the cpufreq
    driver. After this was fixed in the cpufreq driver, this method is not
    needed anymore.
    
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Acked-by: Stephen Boyd <sboyd@kernel.org>
    Acked-by: Gregory CLEMENT <gregory.clement@bootlin.com>
    Tested-by: Pali Rohár <pali@kernel.org>
    Tested-by: Tomasz Maciej Nowak <tmn505@gmail.com>
    Tested-by: Anders Trier Olesen <anders.trier.olesen@gmail.com>
    Tested-by: Philip Soares <philips@netisense.com>
    Fixes: 2089dc33ea0e ("clk: mvebu: armada-37xx-periph: add DVFS support for cpu clocks")
    Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/clk/mvebu/armada-37xx-periph.c b/drivers/clk/mvebu/armada-37xx-periph.c
index 499f5962c8b0..a7e40ff3e57d 100644
--- a/drivers/clk/mvebu/armada-37xx-periph.c
+++ b/drivers/clk/mvebu/armada-37xx-periph.c
@@ -428,33 +428,6 @@ static u8 clk_pm_cpu_get_parent(struct clk_hw *hw)
 	return val;
 }
 
-static int clk_pm_cpu_set_parent(struct clk_hw *hw, u8 index)
-{
-	struct clk_pm_cpu *pm_cpu = to_clk_pm_cpu(hw);
-	struct regmap *base = pm_cpu->nb_pm_base;
-	int load_level;
-
-	/*
-	 * We set the clock parent only if the DVFS is available but
-	 * not enabled.
-	 */
-	if (IS_ERR(base) || armada_3700_pm_dvfs_is_enabled(base))
-		return -EINVAL;
-
-	/* Set the parent clock for all the load level */
-	for (load_level = 0; load_level < LOAD_LEVEL_NR; load_level++) {
-		unsigned int reg, mask,  val,
-			offset = ARMADA_37XX_NB_TBG_SEL_OFF;
-
-		armada_3700_pm_dvfs_update_regs(load_level, &reg, &offset);
-
-		val = index << offset;
-		mask = ARMADA_37XX_NB_TBG_SEL_MASK << offset;
-		regmap_update_bits(base, reg, mask, val);
-	}
-	return 0;
-}
-
 static unsigned long clk_pm_cpu_recalc_rate(struct clk_hw *hw,
 					    unsigned long parent_rate)
 {
@@ -580,7 +553,6 @@ static int clk_pm_cpu_set_rate(struct clk_hw *hw, unsigned long rate,
 
 static const struct clk_ops clk_pm_cpu_ops = {
 	.get_parent = clk_pm_cpu_get_parent,
-	.set_parent = clk_pm_cpu_set_parent,
 	.round_rate = clk_pm_cpu_round_rate,
 	.set_rate = clk_pm_cpu_set_rate,
 	.recalc_rate = clk_pm_cpu_recalc_rate,

commit 70573120d73ecfd24eab5b63bcd44d7359a46e10
Author: Marek Behún <kabel@kernel.org>
Date:   Thu Apr 8 13:42:15 2021 +0200

    cpufreq: armada-37xx: Fix setting TBG parent for load levels
    
    [ Upstream commit 22592df194e31baf371906cc720da38fa0ab68f5 ]
    
    With CPU frequency determining software [1] we have discovered that
    after this driver does one CPU frequency change, the base frequency of
    the CPU is set to the frequency of TBG-A-P clock, instead of the TBG
    that is parent to the CPU.
    
    This can be reproduced on EspressoBIN and Turris MOX:
      cd /sys/devices/system/cpu/cpufreq/policy0
      echo powersave >scaling_governor
      echo performance >scaling_governor
    
    Running the mhz tool before this driver is loaded reports 1000 MHz, and
    after loading the driver and executing commands above the tool reports
    800 MHz.
    
    The change of TBG clock selector is supposed to happen in function
    armada37xx_cpufreq_dvfs_setup. Before the function returns, it does
    this:
      parent = clk_get_parent(clk);
      clk_set_parent(clk, parent);
    
    The armada-37xx-periph clock driver has the .set_parent method
    implemented correctly for this, so if the method was actually called,
    this would work. But since the introduction of the common clock
    framework in commit b2476490ef11 ("clk: introduce the common clock..."),
    the clk_set_parent function checks whether the parent is actually
    changing, and if the requested new parent is same as the old parent
    (which is obviously the case for the code above), the .set_parent method
    is not called at all.
    
    This patch fixes this issue by filling the correct TBG clock selector
    directly in the armada37xx_cpufreq_dvfs_setup during the filling of
    other registers at the same address. But the determination of CPU TBG
    index cannot be done via the common clock framework, therefore we need
    to access the North Bridge Peripheral Clock registers directly in this
    driver.
    
    [1] https://github.com/wtarreau/mhz
    
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Acked-by: Gregory CLEMENT <gregory.clement@bootlin.com>
    Tested-by: Pali Rohár <pali@kernel.org>
    Tested-by: Tomasz Maciej Nowak <tmn505@gmail.com>
    Tested-by: Anders Trier Olesen <anders.trier.olesen@gmail.com>
    Tested-by: Philip Soares <philips@netisense.com>
    Fixes: 92ce45fb875d ("cpufreq: Add DVFS support for Armada 37xx")
    Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/cpufreq/armada-37xx-cpufreq.c b/drivers/cpufreq/armada-37xx-cpufreq.c
index 9b0b490d70ff..99fb0ae7e2d7 100644
--- a/drivers/cpufreq/armada-37xx-cpufreq.c
+++ b/drivers/cpufreq/armada-37xx-cpufreq.c
@@ -25,6 +25,10 @@
 
 #include "cpufreq-dt.h"
 
+/* Clk register set */
+#define ARMADA_37XX_CLK_TBG_SEL		0
+#define ARMADA_37XX_CLK_TBG_SEL_CPU_OFF	22
+
 /* Power management in North Bridge register set */
 #define ARMADA_37XX_NB_L0L1	0x18
 #define ARMADA_37XX_NB_L2L3	0x1C
@@ -120,10 +124,15 @@ static struct armada_37xx_dvfs *armada_37xx_cpu_freq_info_get(u32 freq)
  * will be configured then the DVFS will be enabled.
  */
 static void __init armada37xx_cpufreq_dvfs_setup(struct regmap *base,
-						 struct clk *clk, u8 *divider)
+						 struct regmap *clk_base, u8 *divider)
 {
+	u32 cpu_tbg_sel;
 	int load_lvl;
-	struct clk *parent;
+
+	/* Determine to which TBG clock is CPU connected */
+	regmap_read(clk_base, ARMADA_37XX_CLK_TBG_SEL, &cpu_tbg_sel);
+	cpu_tbg_sel >>= ARMADA_37XX_CLK_TBG_SEL_CPU_OFF;
+	cpu_tbg_sel &= ARMADA_37XX_NB_TBG_SEL_MASK;
 
 	for (load_lvl = 0; load_lvl < LOAD_LEVEL_NR; load_lvl++) {
 		unsigned int reg, mask, val, offset = 0;
@@ -142,6 +151,11 @@ static void __init armada37xx_cpufreq_dvfs_setup(struct regmap *base,
 		mask = (ARMADA_37XX_NB_CLK_SEL_MASK
 			<< ARMADA_37XX_NB_CLK_SEL_OFF);
 
+		/* Set TBG index, for all levels we use the same TBG */
+		val = cpu_tbg_sel << ARMADA_37XX_NB_TBG_SEL_OFF;
+		mask = (ARMADA_37XX_NB_TBG_SEL_MASK
+			<< ARMADA_37XX_NB_TBG_SEL_OFF);
+
 		/*
 		 * Set cpu divider based on the pre-computed array in
 		 * order to have balanced step.
@@ -160,14 +174,6 @@ static void __init armada37xx_cpufreq_dvfs_setup(struct regmap *base,
 
 		regmap_update_bits(base, reg, mask, val);
 	}
-
-	/*
-	 * Set cpu clock source, for all the level we keep the same
-	 * clock source that the one already configured. For this one
-	 * we need to use the clock framework
-	 */
-	parent = clk_get_parent(clk);
-	clk_set_parent(clk, parent);
 }
 
 /*
@@ -360,11 +366,16 @@ static int __init armada37xx_cpufreq_driver_init(void)
 	struct platform_device *pdev;
 	unsigned long freq;
 	unsigned int cur_frequency, base_frequency;
-	struct regmap *nb_pm_base, *avs_base;
+	struct regmap *nb_clk_base, *nb_pm_base, *avs_base;
 	struct device *cpu_dev;
 	int load_lvl, ret;
 	struct clk *clk, *parent;
 
+	nb_clk_base =
+		syscon_regmap_lookup_by_compatible("marvell,armada-3700-periph-clock-nb");
+	if (IS_ERR(nb_clk_base))
+		return -ENODEV;
+
 	nb_pm_base =
 		syscon_regmap_lookup_by_compatible("marvell,armada-3700-nb-pm");
 
@@ -441,7 +452,7 @@ static int __init armada37xx_cpufreq_driver_init(void)
 	armada37xx_cpufreq_avs_configure(avs_base, dvfs);
 	armada37xx_cpufreq_avs_setup(avs_base, dvfs);
 
-	armada37xx_cpufreq_dvfs_setup(nb_pm_base, clk, dvfs->divider);
+	armada37xx_cpufreq_dvfs_setup(nb_pm_base, nb_clk_base, dvfs->divider);
 	clk_put(clk);
 
 	for (load_lvl = ARMADA_37XX_DVFS_LOAD_0; load_lvl < LOAD_LEVEL_NR;

commit 3ee57e00f27d480afe32728aa26dc88fede659eb
Author: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
Date:   Fri Apr 2 10:13:48 2021 -0700

    crypto: qat - Fix a double free in adf_create_ring
    
    [ Upstream commit f7cae626cabb3350b23722b78fe34dd7a615ca04 ]
    
    In adf_create_ring, if the callee adf_init_ring() failed, the callee will
    free the ring->base_addr by dma_free_coherent() and return -EFAULT. Then
    adf_create_ring will goto err and the ring->base_addr will be freed again
    in adf_cleanup_ring().
    
    My patch sets ring->base_addr to NULL after the first freed to avoid the
    double free.
    
    Fixes: a672a9dc872ec ("crypto: qat - Intel(R) QAT transport code")
    Signed-off-by: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/qat/qat_common/adf_transport.c b/drivers/crypto/qat/qat_common/adf_transport.c
index 57d2622728a5..4c0067f8c079 100644
--- a/drivers/crypto/qat/qat_common/adf_transport.c
+++ b/drivers/crypto/qat/qat_common/adf_transport.c
@@ -197,6 +197,7 @@ static int adf_init_ring(struct adf_etr_ring_data *ring)
 		dev_err(&GET_DEV(accel_dev), "Ring address not aligned\n");
 		dma_free_coherent(&GET_DEV(accel_dev), ring_size_bytes,
 				  ring->base_addr, ring->dma_addr);
+		ring->base_addr = NULL;
 		return -EFAULT;
 	}
 

commit 443a6fdcd74be7c023e48c8fd5b589a661de7fe3
Author: Nathan Chancellor <nathan@kernel.org>
Date:   Wed Apr 7 14:30:48 2021 -0700

    ACPI: CPPC: Replace cppc_attr with kobj_attribute
    
    [ Upstream commit 2bc6262c6117dd18106d5aa50d53e945b5d99c51 ]
    
    All of the CPPC sysfs show functions are called via indirect call in
    kobj_attr_show(), where they should be of type
    
    ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr, char *buf);
    
    because that is the type of the ->show() member in
    'struct kobj_attribute' but they are actually of type
    
    ssize_t (*show)(struct kobject *kobj, struct attribute *attr, char *buf);
    
    because of the ->show() member in 'struct cppc_attr', resulting in a
    Control Flow Integrity violation [1].
    
    $ cat /sys/devices/system/cpu/cpu0/acpi_cppc/highest_perf
    3400
    
    $ dmesg | grep "CFI failure"
    [  175.970559] CFI failure (target: show_highest_perf+0x0/0x8):
    
    As far as I can tell, the only difference between 'struct cppc_attr'
    and 'struct kobj_attribute' aside from the type of the attr parameter
    is the type of the count parameter in the ->store() member (ssize_t vs.
    size_t), which does not actually matter because all of these nodes are
    read-only.
    
    Eliminate 'struct cppc_attr' in favor of 'struct kobj_attribute' to fix
    the violation.
    
    [1]: https://lore.kernel.org/r/20210401233216.2540591-1-samitolvanen@google.com/
    
    Fixes: 158c998ea44b ("ACPI / CPPC: add sysfs support to compute delivered performance")
    Link: https://github.com/ClangBuiltLinux/linux/issues/1343
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c
index 5c6ecbb66608..1b43f8ebfabe 100644
--- a/drivers/acpi/cppc_acpi.c
+++ b/drivers/acpi/cppc_acpi.c
@@ -122,23 +122,15 @@ static DEFINE_PER_CPU(struct cpc_desc *, cpc_desc_ptr);
  */
 #define NUM_RETRIES 500ULL
 
-struct cppc_attr {
-	struct attribute attr;
-	ssize_t (*show)(struct kobject *kobj,
-			struct attribute *attr, char *buf);
-	ssize_t (*store)(struct kobject *kobj,
-			struct attribute *attr, const char *c, ssize_t count);
-};
-
 #define define_one_cppc_ro(_name)		\
-static struct cppc_attr _name =			\
+static struct kobj_attribute _name =		\
 __ATTR(_name, 0444, show_##_name, NULL)
 
 #define to_cpc_desc(a) container_of(a, struct cpc_desc, kobj)
 
 #define show_cppc_data(access_fn, struct_name, member_name)		\
 	static ssize_t show_##member_name(struct kobject *kobj,		\
-					struct attribute *attr,	char *buf) \
+				struct kobj_attribute *attr, char *buf)	\
 	{								\
 		struct cpc_desc *cpc_ptr = to_cpc_desc(kobj);		\
 		struct struct_name st_name = {0};			\
@@ -164,7 +156,7 @@ show_cppc_data(cppc_get_perf_ctrs, cppc_perf_fb_ctrs, reference_perf);
 show_cppc_data(cppc_get_perf_ctrs, cppc_perf_fb_ctrs, wraparound_time);
 
 static ssize_t show_feedback_ctrs(struct kobject *kobj,
-		struct attribute *attr, char *buf)
+		struct kobj_attribute *attr, char *buf)
 {
 	struct cpc_desc *cpc_ptr = to_cpc_desc(kobj);
 	struct cppc_perf_fb_ctrs fb_ctrs = {0};

commit 91a63477c9c55d286263034cda87686c754f455e
Author: Bjorn Andersson <bjorn.andersson@linaro.org>
Date:   Thu Jan 7 15:25:26 2021 -0800

    soc: qcom: mdt_loader: Detect truncated read of segments
    
    [ Upstream commit 0648c55e3a21ccd816e99b6600d6199fbf39d23a ]
    
    Given that no validation of how much data the firmware loader read in
    for a given segment truncated segment files would best case result in a
    hash verification failure, without any indication of what went wrong.
    
    Improve this by validating that the firmware loader did return the
    amount of data requested.
    
    Fixes: 445c2410a449 ("soc: qcom: mdt_loader: Use request_firmware_into_buf()")
    Reviewed-by: Sibi Sankar <sibis@codeaurora.org>
    Link: https://lore.kernel.org/r/20210107232526.716989-1-bjorn.andersson@linaro.org
    Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/soc/qcom/mdt_loader.c b/drivers/soc/qcom/mdt_loader.c
index 7584b81d06a1..47dffe7736ff 100644
--- a/drivers/soc/qcom/mdt_loader.c
+++ b/drivers/soc/qcom/mdt_loader.c
@@ -187,6 +187,15 @@ static int __qcom_mdt_load(struct device *dev, const struct firmware *fw,
 				break;
 			}
 
+			if (seg_fw->size != phdr->p_filesz) {
+				dev_err(dev,
+					"failed to load segment %d from truncated file %s\n",
+					i, fw_name);
+				release_firmware(seg_fw);
+				ret = -EINVAL;
+				break;
+			}
+
 			release_firmware(seg_fw);
 		}
 

commit 26a6fab625b1de05845a5c363dfbf8a3be70269d
Author: Bjorn Andersson <bjorn.andersson@linaro.org>
Date:   Thu Jan 7 15:31:19 2021 -0800

    soc: qcom: mdt_loader: Validate that p_filesz < p_memsz
    
    [ Upstream commit 84168d1b54e76a1bcb5192991adde5176abe02e3 ]
    
    The code validates that segments of p_memsz bytes of a segment will fit
    in the provided memory region, but does not validate that p_filesz bytes
    will, which means that an incorrectly crafted ELF header might write
    beyond the provided memory region.
    
    Fixes: 051fb70fd4ea ("remoteproc: qcom: Driver for the self-authenticating Hexagon v5")
    Reviewed-by: Sibi Sankar <sibis@codeaurora.org>
    Link: https://lore.kernel.org/r/20210107233119.717173-1-bjorn.andersson@linaro.org
    Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/soc/qcom/mdt_loader.c b/drivers/soc/qcom/mdt_loader.c
index 1c488024c698..7584b81d06a1 100644
--- a/drivers/soc/qcom/mdt_loader.c
+++ b/drivers/soc/qcom/mdt_loader.c
@@ -168,6 +168,14 @@ static int __qcom_mdt_load(struct device *dev, const struct firmware *fw,
 			break;
 		}
 
+		if (phdr->p_filesz > phdr->p_memsz) {
+			dev_err(dev,
+				"refusing to load segment %d with p_filesz > p_memsz\n",
+				i);
+			ret = -EINVAL;
+			break;
+		}
+
 		ptr = mem_region + offset;
 
 		if (phdr->p_filesz) {

commit 28a5529068c51cdf0295ab1e11a99a3a909a03e4
Author: William A. Kennington III <wak@google.com>
Date:   Wed Apr 7 02:55:27 2021 -0700

    spi: Fix use-after-free with devm_spi_alloc_*
    
    [ Upstream commit 794aaf01444d4e765e2b067cba01cc69c1c68ed9 ]
    
    We can't rely on the contents of the devres list during
    spi_unregister_controller(), as the list is already torn down at the
    time we perform devres_find() for devm_spi_release_controller. This
    causes devices registered with devm_spi_alloc_{master,slave}() to be
    mistakenly identified as legacy, non-devm managed devices and have their
    reference counters decremented below 0.
    
    ------------[ cut here ]------------
    WARNING: CPU: 1 PID: 660 at lib/refcount.c:28 refcount_warn_saturate+0x108/0x174
    [<b0396f04>] (refcount_warn_saturate) from [<b03c56a4>] (kobject_put+0x90/0x98)
    [<b03c5614>] (kobject_put) from [<b0447b4c>] (put_device+0x20/0x24)
     r4:b6700140
    [<b0447b2c>] (put_device) from [<b07515e8>] (devm_spi_release_controller+0x3c/0x40)
    [<b07515ac>] (devm_spi_release_controller) from [<b045343c>] (release_nodes+0x84/0xc4)
     r5:b6700180 r4:b6700100
    [<b04533b8>] (release_nodes) from [<b0454160>] (devres_release_all+0x5c/0x60)
     r8:b1638c54 r7:b117ad94 r6:b1638c10 r5:b117ad94 r4:b163dc10
    [<b0454104>] (devres_release_all) from [<b044e41c>] (__device_release_driver+0x144/0x1ec)
     r5:b117ad94 r4:b163dc10
    [<b044e2d8>] (__device_release_driver) from [<b044f70c>] (device_driver_detach+0x84/0xa0)
     r9:00000000 r8:00000000 r7:b117ad94 r6:b163dc54 r5:b1638c10 r4:b163dc10
    [<b044f688>] (device_driver_detach) from [<b044d274>] (unbind_store+0xe4/0xf8)
    
    Instead, determine the devm allocation state as a flag on the
    controller which is guaranteed to be stable during cleanup.
    
    Fixes: 5e844cc37a5c ("spi: Introduce device-managed SPI controller allocation")
    Signed-off-by: William A. Kennington III <wak@google.com>
    Link: https://lore.kernel.org/r/20210407095527.2771582-1-wak@google.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 7dabbc82b646..bbe33016d371 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -2084,6 +2084,7 @@ struct spi_controller *__devm_spi_alloc_controller(struct device *dev,
 
 	ctlr = __spi_alloc_controller(dev, size, slave);
 	if (ctlr) {
+		ctlr->devm_allocated = true;
 		*ptr = ctlr;
 		devres_add(dev, ptr);
 	} else {
@@ -2344,11 +2345,6 @@ int devm_spi_register_controller(struct device *dev,
 }
 EXPORT_SYMBOL_GPL(devm_spi_register_controller);
 
-static int devm_spi_match_controller(struct device *dev, void *res, void *ctlr)
-{
-	return *(struct spi_controller **)res == ctlr;
-}
-
 static int __unregister(struct device *dev, void *null)
 {
 	spi_unregister_device(to_spi_device(dev));
@@ -2395,8 +2391,7 @@ void spi_unregister_controller(struct spi_controller *ctlr)
 	/* Release the last reference on the controller if its driver
 	 * has not yet been converted to devm_spi_alloc_master/slave().
 	 */
-	if (!devres_find(ctlr->dev.parent, devm_spi_release_controller,
-			 devm_spi_match_controller, ctlr))
+	if (!ctlr->devm_allocated)
 		put_device(&ctlr->dev);
 
 	/* free bus id */
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h
index 8ceba9b8e51e..16158fe097a8 100644
--- a/include/linux/spi/spi.h
+++ b/include/linux/spi/spi.h
@@ -450,6 +450,9 @@ struct spi_controller {
 
 #define SPI_MASTER_GPIO_SS		BIT(5)	/* GPIO CS must select slave */
 
+	/* flag indicating this is a non-devres managed controller */
+	bool			devm_allocated;
+
 	/* flag indicating this is an SPI slave controller */
 	bool			slave;
 

commit 51830bfc6d90b2b39fd229f645169cb3791d69e0
Author: Johan Hovold <johan@kernel.org>
Date:   Wed Apr 7 12:23:24 2021 +0200

    staging: greybus: uart: fix unprivileged TIOCCSERIAL
    
    [ Upstream commit 60c6b305c11b5fd167ce5e2ce42f3a9098c388f0 ]
    
    TIOCSSERIAL is a horrid, underspecified, legacy interface which for most
    serial devices is only useful for setting the close_delay and
    closing_wait parameters.
    
    A non-privileged user has only ever been able to set the since long
    deprecated ASYNC_SPD flags and trying to change any other *supported*
    feature should result in -EPERM being returned. Setting the current
    values for any supported features should return success.
    
    Fix the greybus implementation which instead indicated that the
    TIOCSSERIAL ioctl was not even implemented when a non-privileged user
    set the current values.
    
    Fixes: e68453ed28c5 ("greybus: uart-gb: now builds, more framework added")
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Link: https://lore.kernel.org/r/20210407102334.32361-7-johan@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/staging/greybus/uart.c b/drivers/staging/greybus/uart.c
index f36d470aed24..2343914f7548 100644
--- a/drivers/staging/greybus/uart.c
+++ b/drivers/staging/greybus/uart.c
@@ -656,8 +656,6 @@ static int set_serial_info(struct gb_tty *gb_tty,
 		if ((close_delay != gb_tty->port.close_delay) ||
 		    (closing_wait != gb_tty->port.closing_wait))
 			retval = -EPERM;
-		else
-			retval = -EOPNOTSUPP;
 	} else {
 		gb_tty->port.close_delay = close_delay;
 		gb_tty->port.closing_wait = closing_wait;

commit c031062d3530612474deb0e0efb05bdb57471b61
Author: Colin Ian King <colin.king@canonical.com>
Date:   Wed Apr 7 16:03:08 2021 +0100

    staging: rtl8192u: Fix potential infinite loop
    
    [ Upstream commit f9b9263a25dc3d2eaaa829e207434db6951ca7bc ]
    
    The for-loop iterates with a u8 loop counter i and compares this
    with the loop upper limit of riv->ieee80211->LinkDetectInfo.SlotNum
    that is a u16 type. There is a potential infinite loop if SlotNum
    is larger than the u8 loop counter. Fix this by making the loop
    counter the same type as SlotNum.
    
    Addresses-Coverity: ("Infinite loop")
    Fixes: 8fc8598e61f6 ("Staging: Added Realtek rtl8192u driver to staging")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Link: https://lore.kernel.org/r/20210407150308.496623-1-colin.king@canonical.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/staging/rtl8192u/r8192U_core.c b/drivers/staging/rtl8192u/r8192U_core.c
index 87244a208976..cc12e6c36fed 100644
--- a/drivers/staging/rtl8192u/r8192U_core.c
+++ b/drivers/staging/rtl8192u/r8192U_core.c
@@ -3379,7 +3379,7 @@ static void rtl819x_update_rxcounts(struct r8192_priv *priv, u32 *TotalRxBcnNum,
 			     u32 *TotalRxDataNum)
 {
 	u16			SlotIndex;
-	u8			i;
+	u16			i;
 
 	*TotalRxBcnNum = 0;
 	*TotalRxDataNum = 0;

commit f1dfa84c8f26d6bf372df85837ae0d7fbbc127a9
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Tue Mar 23 14:18:35 2021 +0100

    irqchip/gic-v3: Fix OF_BAD_ADDR error handling
    
    [ Upstream commit 8e13d96670a4c050d4883e6743a9e9858e5cfe10 ]
    
    When building with extra warnings enabled, clang points out a
    mistake in the error handling:
    
    drivers/irqchip/irq-gic-v3-mbi.c:306:21: error: result of comparison of constant 18446744073709551615 with expression of type 'phys_addr_t' (aka 'unsigned int') is always false [-Werror,-Wtautological-constant-out-of-range-compare]
                    if (mbi_phys_base == OF_BAD_ADDR) {
    
    Truncate the constant to the same type as the variable it gets compared
    to, to shut make the check work and void the warning.
    
    Fixes: 505287525c24 ("irqchip/gic-v3: Add support for Message Based Interrupts as an MSI controller")
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20210323131842.2773094-1-arnd@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/irqchip/irq-gic-v3-mbi.c b/drivers/irqchip/irq-gic-v3-mbi.c
index fbfa7ff6deb1..9d011281d4b5 100644
--- a/drivers/irqchip/irq-gic-v3-mbi.c
+++ b/drivers/irqchip/irq-gic-v3-mbi.c
@@ -297,7 +297,7 @@ int __init mbi_init(struct fwnode_handle *fwnode, struct irq_domain *parent)
 	reg = of_get_property(np, "mbi-alias", NULL);
 	if (reg) {
 		mbi_phys_base = of_translate_address(np, reg);
-		if (mbi_phys_base == OF_BAD_ADDR) {
+		if (mbi_phys_base == (phys_addr_t)OF_BAD_ADDR) {
 			ret = -ENXIO;
 			goto err_free_mbi;
 		}

commit 191d92a2f6ccc74cf7fc555a001cbe0a2c29b2fb
Author: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
Date:   Fri Apr 2 23:09:05 2021 -0700

    mtd: rawnand: gpmi: Fix a double free in gpmi_nand_init
    
    [ Upstream commit 076de75de1e53160e9b099f75872c1f9adf41a0b ]
    
    If the callee gpmi_alloc_dma_buffer() failed to alloc memory for
    this->raw_buffer, gpmi_free_dma_buffer() will be called to free
    this->auxiliary_virt. But this->auxiliary_virt is still a non-NULL
    and valid ptr.
    
    Then gpmi_alloc_dma_buffer() returns err and gpmi_free_dma_buffer()
    is called again to free this->auxiliary_virt in err_out. This causes
    a double free.
    
    As gpmi_free_dma_buffer() has already called in gpmi_alloc_dma_buffer's
    error path, so it should return err directly instead of releasing the dma
    buffer again.
    
    Fixes: 4d02423e9afe6 ("mtd: nand: gpmi: Fix gpmi_nand_init() error path")
    Signed-off-by: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
    Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20210403060905.5251-1-lyl2019@mail.ustc.edu.cn
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c
index fe99d9323d4a..6bd414bac34d 100644
--- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c
+++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c
@@ -1931,7 +1931,7 @@ static int gpmi_nand_init(struct gpmi_nand_data *this)
 	this->bch_geometry.auxiliary_size = 128;
 	ret = gpmi_alloc_dma_buffer(this);
 	if (ret)
-		goto err_out;
+		return ret;
 
 	chip->dummy_controller.ops = &gpmi_nand_controller_ops;
 	ret = nand_scan(chip, GPMI_IS_MX6(this) ? 2 : 1);

commit 342260fe821047c3d515e3d28085d73fbdce3e80
Author: Rander Wang <rander.wang@intel.com>
Date:   Wed Mar 31 08:46:10 2021 +0800

    soundwire: stream: fix memory leak in stream config error path
    
    [ Upstream commit 48f17f96a81763c7c8bf5500460a359b9939359f ]
    
    When stream config is failed, master runtime will release all
    slave runtime in the slave_rt_list, but slave runtime is not
    added to the list at this time. This patch frees slave runtime
    in the config error path to fix the memory leak.
    
    Fixes: 89e590535f32 ("soundwire: Add support for SoundWire stream management")
    Signed-off-by: Rander Wang <rander.wang@intel.com>
    Reviewed-by: Keyon Jie <yang.jie@intel.com>
    Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
    Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
    Link: https://lore.kernel.org/r/20210331004610.12242-1-yung-chuan.liao@linux.intel.com
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c
index 907a548645b7..42bc701e2304 100644
--- a/drivers/soundwire/stream.c
+++ b/drivers/soundwire/stream.c
@@ -1182,8 +1182,16 @@ int sdw_stream_add_slave(struct sdw_slave *slave,
 	}
 
 	ret = sdw_config_stream(&slave->dev, stream, stream_config, true);
-	if (ret)
+	if (ret) {
+		/*
+		 * sdw_release_master_stream will release s_rt in slave_rt_list in
+		 * stream_error case, but s_rt is only added to slave_rt_list
+		 * when sdw_config_stream is successful, so free s_rt explicitly
+		 * when sdw_config_stream is failed.
+		 */
+		kfree(s_rt);
 		goto stream_error;
+	}
 
 	list_add_tail(&s_rt->m_rt_node, &m_rt->slave_rt_list);
 

commit c587fa0b7a8291aa433dbaaad98e967b1fd189a3
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Tue Mar 30 21:01:59 2021 +0800

    USB: gadget: udc: fix wrong pointer passed to IS_ERR() and PTR_ERR()
    
    [ Upstream commit 2e3d055bf27d70204cae349335a62a4f9b7c165a ]
    
    IS_ERR() and PTR_ERR() use wrong pointer, it should be
    udc->virt_addr, fix it.
    
    Fixes: 1b9f35adb0ff ("usb: gadget: udc: Add Synopsys UDC Platform driver")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Link: https://lore.kernel.org/r/20210330130159.1051979-1-yangyingliang@huawei.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/udc/snps_udc_plat.c b/drivers/usb/gadget/udc/snps_udc_plat.c
index 32f1d3e90c26..99805d60a7ab 100644
--- a/drivers/usb/gadget/udc/snps_udc_plat.c
+++ b/drivers/usb/gadget/udc/snps_udc_plat.c
@@ -114,8 +114,8 @@ static int udc_plat_probe(struct platform_device *pdev)
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	udc->virt_addr = devm_ioremap_resource(dev, res);
-	if (IS_ERR(udc->regs))
-		return PTR_ERR(udc->regs);
+	if (IS_ERR(udc->virt_addr))
+		return PTR_ERR(udc->virt_addr);
 
 	/* udc csr registers base */
 	udc->csr = udc->virt_addr + UDC_CSR_ADDR;

commit 7e0bde039a562174bec06d6028c396e20190bf96
Author: Tao Ren <rentao.bupt@gmail.com>
Date:   Tue Mar 30 21:58:31 2021 -0700

    usb: gadget: aspeed: fix dma map failure
    
    [ Upstream commit bd4d607044b961cecbf8c4c2f3bb5da4fb156993 ]
    
    Currently the virtual port_dev device is passed to DMA API, and this is
    wrong because the device passed to DMA API calls must be the actual
    hardware device performing the DMA.
    
    The patch replaces usb_gadget_map_request/usb_gadget_unmap_request APIs
    with usb_gadget_map_request_by_dev/usb_gadget_unmap_request_by_dev APIs
    so the DMA capable platform device can be passed to the DMA APIs.
    
    The patch fixes below backtrace detected on Facebook AST2500 OpenBMC
    platforms:
    
    [<80106550>] show_stack+0x20/0x24
    [<80106868>] dump_stack+0x28/0x30
    [<80823540>] __warn+0xfc/0x110
    [<8011ac30>] warn_slowpath_fmt+0xb0/0xc0
    [<8011ad44>] dma_map_page_attrs+0x24c/0x314
    [<8016a27c>] usb_gadget_map_request_by_dev+0x100/0x1e4
    [<805cedd8>] usb_gadget_map_request+0x1c/0x20
    [<805cefbc>] ast_vhub_epn_queue+0xa0/0x1d8
    [<7f02f710>] usb_ep_queue+0x48/0xc4
    [<805cd3e8>] ecm_do_notify+0xf8/0x248
    [<7f145920>] ecm_set_alt+0xc8/0x1d0
    [<7f145c34>] composite_setup+0x680/0x1d30
    [<7f00deb8>] ast_vhub_ep0_handle_setup+0xa4/0x1bc
    [<7f02ee94>] ast_vhub_dev_irq+0x58/0x84
    [<7f0309e0>] ast_vhub_irq+0xb0/0x1c8
    [<7f02e118>] __handle_irq_event_percpu+0x50/0x19c
    [<8015e5bc>] handle_irq_event_percpu+0x38/0x8c
    [<8015e758>] handle_irq_event+0x38/0x4c
    
    Fixes: 7ecca2a4080c ("usb/gadget: Add driver for Aspeed SoC virtual hub")
    Reviewed-by: Joel Stanley <joel@jms.id.au>
    Signed-off-by: Tao Ren <rentao.bupt@gmail.com>
    Link: https://lore.kernel.org/r/20210331045831.28700-1-rentao.bupt@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/udc/aspeed-vhub/core.c b/drivers/usb/gadget/udc/aspeed-vhub/core.c
index db3628be38c0..902e61be4d64 100644
--- a/drivers/usb/gadget/udc/aspeed-vhub/core.c
+++ b/drivers/usb/gadget/udc/aspeed-vhub/core.c
@@ -36,6 +36,7 @@ void ast_vhub_done(struct ast_vhub_ep *ep, struct ast_vhub_req *req,
 		   int status)
 {
 	bool internal = req->internal;
+	struct ast_vhub *vhub = ep->vhub;
 
 	EPVDBG(ep, "completing request @%p, status %d\n", req, status);
 
@@ -46,7 +47,7 @@ void ast_vhub_done(struct ast_vhub_ep *ep, struct ast_vhub_req *req,
 
 	if (req->req.dma) {
 		if (!WARN_ON(!ep->dev))
-			usb_gadget_unmap_request(&ep->dev->gadget,
+			usb_gadget_unmap_request_by_dev(&vhub->pdev->dev,
 						 &req->req, ep->epn.is_in);
 		req->req.dma = 0;
 	}
diff --git a/drivers/usb/gadget/udc/aspeed-vhub/epn.c b/drivers/usb/gadget/udc/aspeed-vhub/epn.c
index ae853cf36966..931f540a747e 100644
--- a/drivers/usb/gadget/udc/aspeed-vhub/epn.c
+++ b/drivers/usb/gadget/udc/aspeed-vhub/epn.c
@@ -376,7 +376,7 @@ static int ast_vhub_epn_queue(struct usb_ep* u_ep, struct usb_request *u_req,
 	if (ep->epn.desc_mode ||
 	    ((((unsigned long)u_req->buf & 7) == 0) &&
 	     (ep->epn.is_in || !(u_req->length & (u_ep->maxpacket - 1))))) {
-		rc = usb_gadget_map_request(&ep->dev->gadget, u_req,
+		rc = usb_gadget_map_request_by_dev(&vhub->pdev->dev, u_req,
 					    ep->epn.is_in);
 		if (rc) {
 			dev_warn(&vhub->pdev->dev,

commit d551190aa9c71236d83ee29cd5f2146bc9898fc2
Author: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Date:   Thu Mar 25 08:34:18 2021 +0000

    crypto: qat - fix error path in adf_isr_resource_alloc()
    
    [ Upstream commit 83dc1173d73f80cbce2fee4d308f51f87b2f26ae ]
    
    The function adf_isr_resource_alloc() is not unwinding correctly in case
    of error.
    This patch fixes the error paths and propagate the errors to the caller.
    
    Fixes: 7afa232e76ce ("crypto: qat - Intel(R) QAT DH895xcc accelerator")
    Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
    Reviewed-by: Marco Chiappero <marco.chiappero@intel.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/qat/qat_common/adf_isr.c b/drivers/crypto/qat/qat_common/adf_isr.c
index cd1cdf5305bc..4898ef41fd9f 100644
--- a/drivers/crypto/qat/qat_common/adf_isr.c
+++ b/drivers/crypto/qat/qat_common/adf_isr.c
@@ -330,19 +330,32 @@ int adf_isr_resource_alloc(struct adf_accel_dev *accel_dev)
 
 	ret = adf_isr_alloc_msix_entry_table(accel_dev);
 	if (ret)
-		return ret;
-	if (adf_enable_msix(accel_dev))
 		goto err_out;
 
-	if (adf_setup_bh(accel_dev))
-		goto err_out;
+	ret = adf_enable_msix(accel_dev);
+	if (ret)
+		goto err_free_msix_table;
 
-	if (adf_request_irqs(accel_dev))
-		goto err_out;
+	ret = adf_setup_bh(accel_dev);
+	if (ret)
+		goto err_disable_msix;
+
+	ret = adf_request_irqs(accel_dev);
+	if (ret)
+		goto err_cleanup_bh;
 
 	return 0;
+
+err_cleanup_bh:
+	adf_cleanup_bh(accel_dev);
+
+err_disable_msix:
+	adf_disable_msix(&accel_dev->accel_pci_dev);
+
+err_free_msix_table:
+	adf_isr_free_msix_entry_table(accel_dev);
+
 err_out:
-	adf_isr_resource_free(accel_dev);
-	return -EFAULT;
+	return ret;
 }
 EXPORT_SYMBOL_GPL(adf_isr_resource_alloc);

commit 16827618b6eb981a0a3de32fcf0914fcf6a9a67e
Author: Geert Uytterhoeven <geert+renesas@glider.be>
Date:   Mon Feb 8 16:02:52 2021 +0100

    phy: marvell: ARMADA375_USBCLUSTER_PHY should not default to y, unconditionally
    
    [ Upstream commit 6cb17707aad869de163d7bf42c253caf501be4e2 ]
    
    Merely enabling CONFIG_COMPILE_TEST should not enable additional code.
    To fix this, restrict the automatic enabling of ARMADA375_USBCLUSTER_PHY
    to MACH_ARMADA_375, and ask the user in case of compile-testing.
    
    Fixes: eee47538ec1f2619 ("phy: add support for USB cluster on the Armada 375 SoC")
    Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
    Link: https://lore.kernel.org/r/20210208150252.424706-1-geert+renesas@glider.be
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/phy/marvell/Kconfig b/drivers/phy/marvell/Kconfig
index 68e321225400..ed4d3904e53f 100644
--- a/drivers/phy/marvell/Kconfig
+++ b/drivers/phy/marvell/Kconfig
@@ -2,8 +2,8 @@
 # Phy drivers for Marvell platforms
 #
 config ARMADA375_USBCLUSTER_PHY
-	def_bool y
-	depends on MACH_ARMADA_375 || COMPILE_TEST
+	bool "Armada 375 USB cluster PHY support" if COMPILE_TEST
+	default y if MACH_ARMADA_375
 	depends on OF && HAS_IOMEM
 	select GENERIC_PHY
 

commit a493b44cb156914913ac31192b2481b9c0db000c
Author: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Date:   Tue Mar 9 10:48:16 2021 +0000

    soundwire: bus: Fix device found flag correctly
    
    [ Upstream commit f03690f4f6992225d05dbd1171212e5be5a370dd ]
    
    found flag is used to indicate SoundWire devices that are
    both enumerated on the bus and available in the device list.
    However this flag is not reset correctly after one iteration,
    This could miss some of the devices that are enumerated on the
    bus but not in device list. So reset this correctly to fix this issue!
    
    Fixes: d52d7a1be02c ("soundwire: Add Slave status handling helpers")
    Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
    Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Link: https://lore.kernel.org/r/20210309104816.20350-1-srinivas.kandagatla@linaro.org
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c
index df172bf3925f..0089b606b70d 100644
--- a/drivers/soundwire/bus.c
+++ b/drivers/soundwire/bus.c
@@ -514,7 +514,7 @@ static int sdw_program_device_num(struct sdw_bus *bus)
 	struct sdw_slave *slave, *_s;
 	struct sdw_slave_id id;
 	struct sdw_msg msg;
-	bool found = false;
+	bool found;
 	int count = 0, ret;
 	u64 addr;
 
@@ -545,6 +545,7 @@ static int sdw_program_device_num(struct sdw_bus *bus)
 
 		sdw_extract_slave_id(bus, addr, &id);
 
+		found = false;
 		/* Now compare with entries */
 		list_for_each_entry_safe(slave, _s, &bus->slaves, node) {
 			if (sdw_compare_devid(slave, id) == 0) {

commit a399dd80e697a02cfb23e2fc09b87849994043d9
Author: Pan Bian <bianpan2016@163.com>
Date:   Thu Jan 21 03:49:07 2021 -0800

    bus: qcom: Put child node before return
    
    [ Upstream commit ac6ad7c2a862d682bb584a4bc904d89fa7721af8 ]
    
    Put child node before return to fix potential reference count leak.
    Generally, the reference count of child is incremented and decremented
    automatically in the macro for_each_available_child_of_node() and should
    be decremented manually if the loop is broken in loop body.
    
    Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
    Fixes: 335a12754808 ("bus: qcom: add EBI2 driver")
    Signed-off-by: Pan Bian <bianpan2016@163.com>
    Link: https://lore.kernel.org/r/20210121114907.109267-1-bianpan2016@163.com
    Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/bus/qcom-ebi2.c b/drivers/bus/qcom-ebi2.c
index a6444244c411..bfb67aa00bec 100644
--- a/drivers/bus/qcom-ebi2.c
+++ b/drivers/bus/qcom-ebi2.c
@@ -357,8 +357,10 @@ static int qcom_ebi2_probe(struct platform_device *pdev)
 
 		/* Figure out the chipselect */
 		ret = of_property_read_u32(child, "reg", &csindex);
-		if (ret)
+		if (ret) {
+			of_node_put(child);
 			return ret;
+		}
 
 		if (csindex > 5) {
 			dev_err(dev,

commit 75ed985bd6c8ac1d4e673e93ea9d96c9908c1d37
Author: Michael Walle <michael@walle.cc>
Date:   Wed Mar 3 16:57:35 2021 +0100

    mtd: require write permissions for locking and badblock ioctls
    
    [ Upstream commit 1e97743fd180981bef5f01402342bb54bf1c6366 ]
    
    MEMLOCK, MEMUNLOCK and OTPLOCK modify protection bits. Thus require
    write permission. Depending on the hardware MEMLOCK might even be
    write-once, e.g. for SPI-NOR flashes with their WP# tied to GND. OTPLOCK
    is always write-once.
    
    MEMSETBADBLOCK modifies the bad block table.
    
    Fixes: f7e6b19bc764 ("mtd: properly check all write ioctls for permissions")
    Signed-off-by: Michael Walle <michael@walle.cc>
    Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Acked-by: Rafa? Mi?ecki <rafal@milecki.pl>
    Acked-by: Richard Weinberger <richard@nod.at>
    Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20210303155735.25887-1-michael@walle.cc
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c
index 5afc653c09e2..82d38001d517 100644
--- a/drivers/mtd/mtdchar.c
+++ b/drivers/mtd/mtdchar.c
@@ -663,16 +663,12 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)
 	case MEMGETINFO:
 	case MEMREADOOB:
 	case MEMREADOOB64:
-	case MEMLOCK:
-	case MEMUNLOCK:
 	case MEMISLOCKED:
 	case MEMGETOOBSEL:
 	case MEMGETBADBLOCK:
-	case MEMSETBADBLOCK:
 	case OTPSELECT:
 	case OTPGETREGIONCOUNT:
 	case OTPGETREGIONINFO:
-	case OTPLOCK:
 	case ECCGETLAYOUT:
 	case ECCGETSTATS:
 	case MTDFILEMODE:
@@ -683,9 +679,13 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)
 	/* "dangerous" commands */
 	case MEMERASE:
 	case MEMERASE64:
+	case MEMLOCK:
+	case MEMUNLOCK:
+	case MEMSETBADBLOCK:
 	case MEMWRITEOOB:
 	case MEMWRITEOOB64:
 	case MEMWRITE:
+	case OTPLOCK:
 		if (!(file->f_mode & FMODE_WRITE))
 			return -EPERM;
 		break;

commit a18602375a6aad68104e4d04dc8ab02e511ac2ea
Author: Fabian Vogt <fabian@ritter-vogt.de>
Date:   Wed Mar 24 15:11:15 2021 +0100

    fotg210-udc: Complete OUT requests on short packets
    
    [ Upstream commit 75bb93be0027123b5db6cbcce89eb62f0f6b3c5b ]
    
    A short packet indicates the end of a transfer and marks the request as
    complete.
    
    Fixes: b84a8dee23fd ("usb: gadget: add Faraday fotg210_udc driver")
    Signed-off-by: Fabian Vogt <fabian@ritter-vogt.de>
    Link: https://lore.kernel.org/r/20210324141115.9384-8-fabian@ritter-vogt.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/udc/fotg210-udc.c b/drivers/usb/gadget/udc/fotg210-udc.c
index 7ae0243c32e5..785822ecc3f1 100644
--- a/drivers/usb/gadget/udc/fotg210-udc.c
+++ b/drivers/usb/gadget/udc/fotg210-udc.c
@@ -853,12 +853,16 @@ static void fotg210_out_fifo_handler(struct fotg210_ep *ep)
 {
 	struct fotg210_request *req = list_entry(ep->queue.next,
 						 struct fotg210_request, queue);
+	int disgr1 = ioread32(ep->fotg210->reg + FOTG210_DISGR1);
 
 	fotg210_start_dma(ep, req);
 
-	/* finish out transfer */
+	/* Complete the request when it's full or a short packet arrived.
+	 * Like other drivers, short_not_ok isn't handled.
+	 */
+
 	if (req->req.length == req->req.actual ||
-	    req->req.actual < ep->ep.maxpacket)
+	    (disgr1 & DISGR1_SPK_INT(ep->epnum - 1)))
 		fotg210_done(ep, req, 0);
 }
 

commit 183b6757bdb9db0a20e30c8f558bff027d79cc67
Author: Fabian Vogt <fabian@ritter-vogt.de>
Date:   Wed Mar 24 15:11:14 2021 +0100

    fotg210-udc: Don't DMA more than the buffer can take
    
    [ Upstream commit 3e7c2510bdfe89a9ec223dd7acd6bfc8bb1cbeb6 ]
    
    Before this, it wrote as much as available into the buffer, even if it
    didn't fit.
    
    Fixes: b84a8dee23fd ("usb: gadget: add Faraday fotg210_udc driver")
    Signed-off-by: Fabian Vogt <fabian@ritter-vogt.de>
    Link: https://lore.kernel.org/r/20210324141115.9384-7-fabian@ritter-vogt.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/udc/fotg210-udc.c b/drivers/usb/gadget/udc/fotg210-udc.c
index 41cc5babd50d..7ae0243c32e5 100644
--- a/drivers/usb/gadget/udc/fotg210-udc.c
+++ b/drivers/usb/gadget/udc/fotg210-udc.c
@@ -337,8 +337,9 @@ static void fotg210_start_dma(struct fotg210_ep *ep,
 		} else {
 			buffer = req->req.buf + req->req.actual;
 			length = ioread32(ep->fotg210->reg +
-					FOTG210_FIBCR(ep->epnum - 1));
-			length &= FIBCR_BCFX;
+					FOTG210_FIBCR(ep->epnum - 1)) & FIBCR_BCFX;
+			if (length > req->req.length - req->req.actual)
+				length = req->req.length - req->req.actual;
 		}
 	} else {
 		buffer = req->req.buf + req->req.actual;

commit 590bb17a0490b30bf32fed8f36fcb17997ca6f45
Author: Fabian Vogt <fabian@ritter-vogt.de>
Date:   Wed Mar 24 15:11:12 2021 +0100

    fotg210-udc: Mask GRP2 interrupts we don't handle
    
    [ Upstream commit 9aee3a23d6455200702f3a57e731fa11e8408667 ]
    
    Currently it leaves unhandled interrupts unmasked, but those are never
    acked. In the case of a "device idle" interrupt, this leads to an
    effectively frozen system until plugging it in.
    
    Fixes: b84a8dee23fd ("usb: gadget: add Faraday fotg210_udc driver")
    Signed-off-by: Fabian Vogt <fabian@ritter-vogt.de>
    Link: https://lore.kernel.org/r/20210324141115.9384-5-fabian@ritter-vogt.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/udc/fotg210-udc.c b/drivers/usb/gadget/udc/fotg210-udc.c
index 6e284332b11f..41cc5babd50d 100644
--- a/drivers/usb/gadget/udc/fotg210-udc.c
+++ b/drivers/usb/gadget/udc/fotg210-udc.c
@@ -1030,6 +1030,12 @@ static void fotg210_init(struct fotg210_udc *fotg210)
 	value &= ~DMCR_GLINT_EN;
 	iowrite32(value, fotg210->reg + FOTG210_DMCR);
 
+	/* enable only grp2 irqs we handle */
+	iowrite32(~(DISGR2_DMA_ERROR | DISGR2_RX0BYTE_INT | DISGR2_TX0BYTE_INT
+		    | DISGR2_ISO_SEQ_ABORT_INT | DISGR2_ISO_SEQ_ERR_INT
+		    | DISGR2_RESM_INT | DISGR2_SUSP_INT | DISGR2_USBRST_INT),
+		  fotg210->reg + FOTG210_DMISGR2);
+
 	/* disable all fifo interrupt */
 	iowrite32(~(u32)0, fotg210->reg + FOTG210_DMISGR1);
 

commit bf1fbee8603c21964e2e10bee5277948b59e7ea3
Author: Fabian Vogt <fabian@ritter-vogt.de>
Date:   Wed Mar 24 15:11:11 2021 +0100

    fotg210-udc: Remove a dubious condition leading to fotg210_done
    
    [ Upstream commit c7f755b243494d6043aadcd9a2989cb157958b95 ]
    
    When the EP0 IN request was not completed but less than a packet sent,
    it would complete the request successfully. That doesn't make sense
    and can't really happen as fotg210_start_dma always sends
    min(length, maxpkt) bytes.
    
    Fixes: b84a8dee23fd ("usb: gadget: add Faraday fotg210_udc driver")
    Signed-off-by: Fabian Vogt <fabian@ritter-vogt.de>
    Link: https://lore.kernel.org/r/20210324141115.9384-4-fabian@ritter-vogt.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/udc/fotg210-udc.c b/drivers/usb/gadget/udc/fotg210-udc.c
index a35a55eff429..6e284332b11f 100644
--- a/drivers/usb/gadget/udc/fotg210-udc.c
+++ b/drivers/usb/gadget/udc/fotg210-udc.c
@@ -382,8 +382,7 @@ static void fotg210_ep0_queue(struct fotg210_ep *ep,
 	}
 	if (ep->dir_in) { /* if IN */
 		fotg210_start_dma(ep, req);
-		if ((req->req.length == req->req.actual) ||
-		    (req->req.actual < ep->ep.maxpacket))
+		if (req->req.length == req->req.actual)
 			fotg210_done(ep, req, 0);
 	} else { /* OUT */
 		u32 value = ioread32(ep->fotg210->reg + FOTG210_DMISGR0);

commit 5127ba81948844f978b451cad0d442b997624ffe
Author: Fabian Vogt <fabian@ritter-vogt.de>
Date:   Wed Mar 24 15:11:10 2021 +0100

    fotg210-udc: Fix EP0 IN requests bigger than two packets
    
    [ Upstream commit 078ba935651e149c92c41161e0322e3372cc2705 ]
    
    For a 134 Byte packet, it sends the first two 64 Byte packets just fine,
    but then notice that less than a packet is remaining and call fotg210_done
    without actually sending the rest.
    
    Fixes: b84a8dee23fd ("usb: gadget: add Faraday fotg210_udc driver")
    Signed-off-by: Fabian Vogt <fabian@ritter-vogt.de>
    Link: https://lore.kernel.org/r/20210324141115.9384-3-fabian@ritter-vogt.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/udc/fotg210-udc.c b/drivers/usb/gadget/udc/fotg210-udc.c
index d698d4ab121b..a35a55eff429 100644
--- a/drivers/usb/gadget/udc/fotg210-udc.c
+++ b/drivers/usb/gadget/udc/fotg210-udc.c
@@ -824,7 +824,7 @@ static void fotg210_ep0in(struct fotg210_udc *fotg210)
 		if (req->req.length)
 			fotg210_start_dma(ep, req);
 
-		if ((req->req.length - req->req.actual) < ep->ep.maxpacket)
+		if (req->req.actual == req->req.length)
 			fotg210_done(ep, req, 0);
 	} else {
 		fotg210_set_cxdone(fotg210);

commit a837f97a7c0f61cb7f91cc80cbe69ef05670318b
Author: Fabian Vogt <fabian@ritter-vogt.de>
Date:   Wed Mar 24 15:11:09 2021 +0100

    fotg210-udc: Fix DMA on EP0 for length > max packet size
    
    [ Upstream commit 755915fc28edfc608fa89a163014acb2f31c1e19 ]
    
    For a 75 Byte request, it would send the first 64 separately, then detect
    that the remaining 11 Byte fit into a single DMA, but due to this bug set
    the length to the original 75 Bytes. This leads to a DMA failure (which is
    ignored...) and the request completes without the remaining bytes having
    been sent.
    
    Fixes: b84a8dee23fd ("usb: gadget: add Faraday fotg210_udc driver")
    Signed-off-by: Fabian Vogt <fabian@ritter-vogt.de>
    Link: https://lore.kernel.org/r/20210324141115.9384-2-fabian@ritter-vogt.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/udc/fotg210-udc.c b/drivers/usb/gadget/udc/fotg210-udc.c
index bc6abaea907d..d698d4ab121b 100644
--- a/drivers/usb/gadget/udc/fotg210-udc.c
+++ b/drivers/usb/gadget/udc/fotg210-udc.c
@@ -345,7 +345,7 @@ static void fotg210_start_dma(struct fotg210_ep *ep,
 		if (req->req.length - req->req.actual > ep->ep.maxpacket)
 			length = ep->ep.maxpacket;
 		else
-			length = req->req.length;
+			length = req->req.length - req->req.actual;
 	}
 
 	d = dma_map_single(NULL, buffer, length,

commit 09d16cee6285d37cc76311c29add6d97a7e4acda
Author: Tong Zhang <ztong0001@gmail.com>
Date:   Thu Mar 18 23:40:00 2021 -0400

    crypto: qat - ADF_STATUS_PF_RUNNING should be set after adf_dev_init
    
    [ Upstream commit 8609f5cfdc872fc3a462efa6a3eca5cb1e2f6446 ]
    
    ADF_STATUS_PF_RUNNING is (only) used and checked by adf_vf2pf_shutdown()
    before calling adf_iov_putmsg()->mutex_lock(vf2pf_lock), however the
    vf2pf_lock is initialized in adf_dev_init(), which can fail and when it
    fail, the vf2pf_lock is either not initialized or destroyed, a subsequent
    use of vf2pf_lock will cause issue.
    To fix this issue, only set this flag if adf_dev_init() returns 0.
    
    [    7.178404] BUG: KASAN: user-memory-access in __mutex_lock.isra.0+0x1ac/0x7c0
    [    7.180345] Call Trace:
    [    7.182576]  mutex_lock+0xc9/0xd0
    [    7.183257]  adf_iov_putmsg+0x118/0x1a0 [intel_qat]
    [    7.183541]  adf_vf2pf_shutdown+0x4d/0x7b [intel_qat]
    [    7.183834]  adf_dev_shutdown+0x172/0x2b0 [intel_qat]
    [    7.184127]  adf_probe+0x5e9/0x600 [qat_dh895xccvf]
    
    Signed-off-by: Tong Zhang <ztong0001@gmail.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Fixes: 25c6ffb249f6 ("crypto: qat - check if PF is running")
    Acked-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/qat/qat_c3xxxvf/adf_drv.c b/drivers/crypto/qat/qat_c3xxxvf/adf_drv.c
index 613c7d5644ce..e87b7c466bdb 100644
--- a/drivers/crypto/qat/qat_c3xxxvf/adf_drv.c
+++ b/drivers/crypto/qat/qat_c3xxxvf/adf_drv.c
@@ -238,12 +238,12 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	if (ret)
 		goto out_err_free_reg;
 
-	set_bit(ADF_STATUS_PF_RUNNING, &accel_dev->status);
-
 	ret = adf_dev_init(accel_dev);
 	if (ret)
 		goto out_err_dev_shutdown;
 
+	set_bit(ADF_STATUS_PF_RUNNING, &accel_dev->status);
+
 	ret = adf_dev_start(accel_dev);
 	if (ret)
 		goto out_err_dev_stop;
diff --git a/drivers/crypto/qat/qat_c62xvf/adf_drv.c b/drivers/crypto/qat/qat_c62xvf/adf_drv.c
index 278452b8ef81..a8f3f2ecae70 100644
--- a/drivers/crypto/qat/qat_c62xvf/adf_drv.c
+++ b/drivers/crypto/qat/qat_c62xvf/adf_drv.c
@@ -238,12 +238,12 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	if (ret)
 		goto out_err_free_reg;
 
-	set_bit(ADF_STATUS_PF_RUNNING, &accel_dev->status);
-
 	ret = adf_dev_init(accel_dev);
 	if (ret)
 		goto out_err_dev_shutdown;
 
+	set_bit(ADF_STATUS_PF_RUNNING, &accel_dev->status);
+
 	ret = adf_dev_start(accel_dev);
 	if (ret)
 		goto out_err_dev_stop;
diff --git a/drivers/crypto/qat/qat_dh895xccvf/adf_drv.c b/drivers/crypto/qat/qat_dh895xccvf/adf_drv.c
index 3da0f951cb59..1b954abf67fb 100644
--- a/drivers/crypto/qat/qat_dh895xccvf/adf_drv.c
+++ b/drivers/crypto/qat/qat_dh895xccvf/adf_drv.c
@@ -238,12 +238,12 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	if (ret)
 		goto out_err_free_reg;
 
-	set_bit(ADF_STATUS_PF_RUNNING, &accel_dev->status);
-
 	ret = adf_dev_init(accel_dev);
 	if (ret)
 		goto out_err_dev_shutdown;
 
+	set_bit(ADF_STATUS_PF_RUNNING, &accel_dev->status);
+
 	ret = adf_dev_start(accel_dev);
 	if (ret)
 		goto out_err_dev_stop;

commit 9666d5eac31f5880fe92cd269a40b85e9e5ce186
Author: Tong Zhang <ztong0001@gmail.com>
Date:   Thu Mar 18 23:39:59 2021 -0400

    crypto: qat - don't release uninitialized resources
    
    [ Upstream commit b66accaab3791e15ac99c92f236d0d3a6d5bd64e ]
    
    adf_vf_isr_resource_alloc() is not unwinding correctly when error
    happens and it want to release uninitialized resources.
    To fix this, only release initialized resources.
    
    [    1.792845] Trying to free already-free IRQ 11
    [    1.793091] WARNING: CPU: 0 PID: 182 at kernel/irq/manage.c:1821 free_irq+0x202/0x380
    [    1.801340] Call Trace:
    [    1.801477]  adf_vf_isr_resource_free+0x32/0xb0 [intel_qat]
    [    1.801785]  adf_vf_isr_resource_alloc+0x14d/0x150 [intel_qat]
    [    1.802105]  adf_dev_init+0xba/0x140 [intel_qat]
    
    Signed-off-by: Tong Zhang <ztong0001@gmail.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Fixes: dd0f368398ea ("crypto: qat - Add qat dh895xcc VF driver")
    Acked-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/crypto/qat/qat_common/adf_vf_isr.c b/drivers/crypto/qat/qat_common/adf_vf_isr.c
index 4a73fc70f7a9..df9a1f35b832 100644
--- a/drivers/crypto/qat/qat_common/adf_vf_isr.c
+++ b/drivers/crypto/qat/qat_common/adf_vf_isr.c
@@ -304,17 +304,26 @@ int adf_vf_isr_resource_alloc(struct adf_accel_dev *accel_dev)
 		goto err_out;
 
 	if (adf_setup_pf2vf_bh(accel_dev))
-		goto err_out;
+		goto err_disable_msi;
 
 	if (adf_setup_bh(accel_dev))
-		goto err_out;
+		goto err_cleanup_pf2vf_bh;
 
 	if (adf_request_msi_irq(accel_dev))
-		goto err_out;
+		goto err_cleanup_bh;
 
 	return 0;
+
+err_cleanup_bh:
+	adf_cleanup_bh(accel_dev);
+
+err_cleanup_pf2vf_bh:
+	adf_cleanup_pf2vf_bh(accel_dev);
+
+err_disable_msi:
+	adf_disable_msi(accel_dev);
+
 err_out:
-	adf_vf_isr_resource_free(accel_dev);
 	return -EFAULT;
 }
 EXPORT_SYMBOL_GPL(adf_vf_isr_resource_alloc);

commit 80debd277bcf6e72a211500d811f2339bc57161c
Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date:   Tue Mar 23 17:36:22 2021 +0200

    usb: gadget: pch_udc: Check for DMA mapping error
    
    [ Upstream commit 4a28d77e359009b846951b06f7c0d8eec8dce298 ]
    
    DMA mapping might fail, we have to check it with dma_mapping_error().
    Otherwise DMA-API is not happy:
    
      DMA-API: pch_udc 0000:02:02.4: device driver failed to check map error[device address=0x00000000027ee678] [size=64 bytes] [mapped as single]
    
    Fixes: abab0c67c061 ("usb: pch_udc: Fixed issue which does not work with g_serial")
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Link: https://lore.kernel.org/r/20210323153626.54908-3-andriy.shevchenko@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/udc/pch_udc.c b/drivers/usb/gadget/udc/pch_udc.c
index d87c9217cb57..14e99905cbee 100644
--- a/drivers/usb/gadget/udc/pch_udc.c
+++ b/drivers/usb/gadget/udc/pch_udc.c
@@ -2973,7 +2973,7 @@ static int init_dma_pools(struct pch_udc_dev *dev)
 	dev->dma_addr = dma_map_single(&dev->pdev->dev, ep0out_buf,
 				       UDC_EP0OUT_BUFF_SIZE * 4,
 				       DMA_FROM_DEVICE);
-	return 0;
+	return dma_mapping_error(&dev->pdev->dev, dev->dma_addr);
 }
 
 static int pch_udc_start(struct usb_gadget *g,

commit 9a4e7c15200693ebc6eff71addcbc6ddc642661b
Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date:   Tue Mar 23 17:36:21 2021 +0200

    usb: gadget: pch_udc: Check if driver is present before calling ->setup()
    
    [ Upstream commit fbdbbe6d3ee502b3bdeb4f255196bb45003614be ]
    
    Since we have a separate routine for VBUS sense, the interrupt may occur
    before gadget driver is present. Hence, ->setup() call may oops the kernel:
    
    [   55.245843] BUG: kernel NULL pointer dereference, address: 00000010
    ...
    [   55.245843] EIP: pch_udc_isr.cold+0x162/0x33f
    ...
    [   55.245843]  <IRQ>
    [   55.245843]  ? pch_udc_svc_data_out+0x160/0x160
    
    Check if driver is present before calling ->setup().
    
    Fixes: f646cf94520e ("USB device driver of Topcliff PCH")
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Link: https://lore.kernel.org/r/20210323153626.54908-2-andriy.shevchenko@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/udc/pch_udc.c b/drivers/usb/gadget/udc/pch_udc.c
index 527814361c3d..d87c9217cb57 100644
--- a/drivers/usb/gadget/udc/pch_udc.c
+++ b/drivers/usb/gadget/udc/pch_udc.c
@@ -2325,6 +2325,21 @@ static void pch_udc_svc_data_out(struct pch_udc_dev *dev, int ep_num)
 		pch_udc_set_dma(dev, DMA_DIR_RX);
 }
 
+static int pch_udc_gadget_setup(struct pch_udc_dev *dev)
+	__must_hold(&dev->lock)
+{
+	int rc;
+
+	/* In some cases we can get an interrupt before driver gets setup */
+	if (!dev->driver)
+		return -ESHUTDOWN;
+
+	spin_unlock(&dev->lock);
+	rc = dev->driver->setup(&dev->gadget, &dev->setup_data);
+	spin_lock(&dev->lock);
+	return rc;
+}
+
 /**
  * pch_udc_svc_control_in() - Handle Control IN endpoint interrupts
  * @dev:	Reference to the device structure
@@ -2396,15 +2411,12 @@ static void pch_udc_svc_control_out(struct pch_udc_dev *dev)
 			dev->gadget.ep0 = &dev->ep[UDC_EP0IN_IDX].ep;
 		else /* OUT */
 			dev->gadget.ep0 = &ep->ep;
-		spin_lock(&dev->lock);
 		/* If Mass storage Reset */
 		if ((dev->setup_data.bRequestType == 0x21) &&
 		    (dev->setup_data.bRequest == 0xFF))
 			dev->prot_stall = 0;
 		/* call gadget with setup data received */
-		setup_supported = dev->driver->setup(&dev->gadget,
-						     &dev->setup_data);
-		spin_unlock(&dev->lock);
+		setup_supported = pch_udc_gadget_setup(dev);
 
 		if (dev->setup_data.bRequestType & USB_DIR_IN) {
 			ep->td_data->status = (ep->td_data->status &
@@ -2652,9 +2664,7 @@ static void pch_udc_svc_intf_interrupt(struct pch_udc_dev *dev)
 		dev->ep[i].halted = 0;
 	}
 	dev->stall = 0;
-	spin_unlock(&dev->lock);
-	dev->driver->setup(&dev->gadget, &dev->setup_data);
-	spin_lock(&dev->lock);
+	pch_udc_gadget_setup(dev);
 }
 
 /**
@@ -2689,9 +2699,7 @@ static void pch_udc_svc_cfg_interrupt(struct pch_udc_dev *dev)
 	dev->stall = 0;
 
 	/* call gadget zero with setup data received */
-	spin_unlock(&dev->lock);
-	dev->driver->setup(&dev->gadget, &dev->setup_data);
-	spin_lock(&dev->lock);
+	pch_udc_gadget_setup(dev);
 }
 
 /**

commit 21bc01d55245654cecc85d8b11ad779ebaf0b90b
Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date:   Tue Mar 23 17:36:20 2021 +0200

    usb: gadget: pch_udc: Replace cpu_to_le32() by lower_32_bits()
    
    [ Upstream commit 91356fed6afd1c83bf0d3df1fc336d54e38f0458 ]
    
    Either way ~0 will be in the correct byte order, hence
    replace cpu_to_le32() by lower_32_bits(). Moreover,
    it makes sparse happy, otherwise it complains:
    
    .../pch_udc.c:1813:27: warning: incorrect type in assignment (different base types)
    .../pch_udc.c:1813:27:    expected unsigned int [usertype] dataptr
    .../pch_udc.c:1813:27:    got restricted __le32 [usertype]
    
    Fixes: f646cf94520e ("USB device driver of Topcliff PCH")
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Link: https://lore.kernel.org/r/20210323153626.54908-1-andriy.shevchenko@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/udc/pch_udc.c b/drivers/usb/gadget/udc/pch_udc.c
index 8e304e9845d9..527814361c3d 100644
--- a/drivers/usb/gadget/udc/pch_udc.c
+++ b/drivers/usb/gadget/udc/pch_udc.c
@@ -1782,7 +1782,7 @@ static struct usb_request *pch_udc_alloc_request(struct usb_ep *usbep,
 	}
 	/* prevent from using desc. - set HOST BUSY */
 	dma_desc->status |= PCH_UDC_BS_HST_BSY;
-	dma_desc->dataptr = cpu_to_le32(DMA_ADDR_INVALID);
+	dma_desc->dataptr = lower_32_bits(DMA_ADDR_INVALID);
 	req->td_data = dma_desc;
 	req->td_data_last = dma_desc;
 	req->chain_len = 1;

commit af6d4954f9d43def013d3621d944ea2770bbd08b
Author: Otavio Pontes <otavio.pontes@intel.com>
Date:   Fri Mar 19 09:55:15 2021 -0700

    x86/microcode: Check for offline CPUs before requesting new microcode
    
    [ Upstream commit 7189b3c11903667808029ec9766a6e96de5012a5 ]
    
    Currently, the late microcode loading mechanism checks whether any CPUs
    are offlined, and, in such a case, aborts the load attempt.
    
    However, this must be done before the kernel caches new microcode from
    the filesystem. Otherwise, when offlined CPUs are onlined later, those
    cores are going to be updated through the CPU hotplug notifier callback
    with the new microcode, while CPUs previously onine will continue to run
    with the older microcode.
    
    For example:
    
    Turn off one core (2 threads):
    
      echo 0 > /sys/devices/system/cpu/cpu3/online
      echo 0 > /sys/devices/system/cpu/cpu1/online
    
    Install the ucode fails because a primary SMT thread is offline:
    
      cp intel-ucode/06-8e-09 /lib/firmware/intel-ucode/
      echo 1 > /sys/devices/system/cpu/microcode/reload
      bash: echo: write error: Invalid argument
    
    Turn the core back on
    
      echo 1 > /sys/devices/system/cpu/cpu3/online
      echo 1 > /sys/devices/system/cpu/cpu1/online
      cat /proc/cpuinfo |grep microcode
      microcode : 0x30
      microcode : 0xde
      microcode : 0x30
      microcode : 0xde
    
    The rationale for why the update is aborted when at least one primary
    thread is offline is because even if that thread is soft-offlined
    and idle, it will still have to participate in broadcasted MCE's
    synchronization dance or enter SMM, and in both examples it will execute
    instructions so it better have the same microcode revision as the other
    cores.
    
     [ bp: Heavily edit and extend commit message with the reasoning behind all
       this. ]
    
    Fixes: 30ec26da9967 ("x86/microcode: Do not upload microcode if CPUs are offline")
    Signed-off-by: Otavio Pontes <otavio.pontes@intel.com>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Reviewed-by: Tony Luck <tony.luck@intel.com>
    Acked-by: Ashok Raj <ashok.raj@intel.com>
    Link: https://lkml.kernel.org/r/20210319165515.9240-2-otavio.pontes@intel.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/x86/kernel/cpu/microcode/core.c b/arch/x86/kernel/cpu/microcode/core.c
index a96091d44a45..eab4de387ce6 100644
--- a/arch/x86/kernel/cpu/microcode/core.c
+++ b/arch/x86/kernel/cpu/microcode/core.c
@@ -627,16 +627,16 @@ static ssize_t reload_store(struct device *dev,
 	if (val != 1)
 		return size;
 
-	tmp_ret = microcode_ops->request_microcode_fw(bsp, &microcode_pdev->dev, true);
-	if (tmp_ret != UCODE_NEW)
-		return size;
-
 	get_online_cpus();
 
 	ret = check_online_cpus();
 	if (ret)
 		goto put;
 
+	tmp_ret = microcode_ops->request_microcode_fw(bsp, &microcode_pdev->dev, true);
+	if (tmp_ret != UCODE_NEW)
+		goto put;
+
 	mutex_lock(&microcode_mutex);
 	ret = microcode_reload_late();
 	mutex_unlock(&microcode_mutex);

commit ba10c5d3399e630112a890fc3fbebbab58d81299
Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Date:   Tue Mar 2 18:57:57 2021 +0530

    mtd: rawnand: qcom: Return actual error code instead of -ENODEV
    
    [ Upstream commit 55fbb9ba4f06cb6aff32daca1e1910173c13ec51 ]
    
    In qcom_probe_nand_devices() function, the error code returned by
    qcom_nand_host_init_and_register() is converted to -ENODEV in the case
    of failure. This poses issue if -EPROBE_DEFER is returned when the
    dependency is not available for a component like parser.
    
    So let's restructure the error handling logic a bit and return the
    actual error code in case of qcom_nand_host_init_and_register() failure.
    
    Fixes: c76b78d8ec05 ("mtd: nand: Qualcomm NAND controller driver")
    Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
    Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mtd/nand/raw/qcom_nandc.c b/drivers/mtd/nand/raw/qcom_nandc.c
index 2726f1824233..148c7a16f318 100644
--- a/drivers/mtd/nand/raw/qcom_nandc.c
+++ b/drivers/mtd/nand/raw/qcom_nandc.c
@@ -2865,7 +2865,7 @@ static int qcom_probe_nand_devices(struct qcom_nand_controller *nandc)
 	struct device *dev = nandc->dev;
 	struct device_node *dn = dev->of_node, *child;
 	struct qcom_nand_host *host;
-	int ret;
+	int ret = -ENODEV;
 
 	for_each_available_child_of_node(dn, child) {
 		host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL);
@@ -2883,10 +2883,7 @@ static int qcom_probe_nand_devices(struct qcom_nand_controller *nandc)
 		list_add_tail(&host->node, &nandc->host_list);
 	}
 
-	if (list_empty(&nandc->host_list))
-		return -ENODEV;
-
-	return 0;
+	return ret;
 }
 
 /* parse custom DT properties here */

commit 4a064cb49d382331a3f3a6cc53418f0362ee5566
Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Date:   Tue Mar 2 18:57:56 2021 +0530

    mtd: Handle possible -EPROBE_DEFER from parse_mtd_partitions()
    
    [ Upstream commit 08608adb520e51403be7592c2214846fa440a23a ]
    
    There are chances that the parse_mtd_partitions() function will return
    -EPROBE_DEFER in mtd_device_parse_register(). This might happen when
    the dependency is not available for the parser. For instance, on SDX55
    the MTD_QCOMSMEM_PARTS parser depends on the QCOM_SMEM driver to parse
    the partitions defined in the shared memory region. With the current
    flow, the error returned from parse_mtd_partitions() will be discarded
    in favor of trying to add the fallback partition.
    
    This will prevent the driver to end up in probe deferred pool and the
    partitions won't be parsed even after the QCOM_SMEM driver is available.
    
    Fix this issue by bailing out of mtd_device_parse_register() when
    -EPROBE_DEFER error is returned from parse_mtd_partitions() function and
    propagate the error code to the driver core for probing later.
    
    Fixes: 5ac67ce36cfe ("mtd: move code adding (registering) partitions to the parse_mtd_partitions()")
    Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
    Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
index 97ac219c082e..a0b1a7814e2e 100644
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -712,6 +712,9 @@ int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types,
 
 	/* Prefer parsed partitions over driver-provided fallback */
 	ret = parse_mtd_partitions(mtd, types, parser_data);
+	if (ret == -EPROBE_DEFER)
+		goto out;
+
 	if (ret > 0)
 		ret = 0;
 	else if (nr_parts)

commit fb910e166af25743ad3a7f8cac9b6741a67b6420
Author: ?lvaro Fernández Rojas <noltari@gmail.com>
Date:   Wed Feb 24 09:02:10 2021 +0100

    mtd: rawnand: brcmnand: fix OOB R/W with Hamming ECC
    
    [ Upstream commit f5200c14242fb8fa4a9b93f7fd4064d237e58785 ]
    
    Hamming ECC doesn't cover the OOB data, so reading or writing OOB shall
    always be done without ECC enabled.
    This is a problem when adding JFFS2 cleanmarkers to erased blocks. If JFFS2
    clenmarkers are added to the OOB with ECC enabled, OOB bytes will be changed
    from ff ff ff to 00 00 00, reporting incorrect ECC errors.
    
    Fixes: 27c5b17cd1b1 ("mtd: nand: add NAND driver "library" for Broadcom STB NAND controller")
    Signed-off-by: ?lvaro Fernández Rojas <noltari@gmail.com>
    Acked-by: Brian Norris <computersforpeace@gmail.com>
    Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20210224080210.23686-1-noltari@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
index aad8d107b85d..774ffa9e23f3 100644
--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c
+++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
@@ -2239,6 +2239,12 @@ static int brcmnand_attach_chip(struct nand_chip *chip)
 
 	ret = brcmstb_choose_ecc_layout(host);
 
+	/* If OOB is written with ECC enabled it will cause ECC errors */
+	if (is_hamming_ecc(host->ctrl, &host->hwcfg)) {
+		chip->ecc.write_oob = brcmnand_write_oob_raw;
+		chip->ecc.read_oob = brcmnand_read_oob_raw;
+	}
+
 	return ret;
 }
 

commit 679e81e3eb4a74a862fde8d8a2829b9555cc0cd6
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Mon Feb 15 18:58:49 2021 +0300

    mtd: rawnand: fsmc: Fix error code in fsmc_nand_probe()
    
    [ Upstream commit e7a97528e3c787802d8c643d6ab2f428511bb047 ]
    
    If dma_request_channel() fails then the probe fails and it should
    return a negative error code, but currently it returns success.
    
    fixes: 4774fb0a48aa ("mtd: nand/fsmc: Add DMA support")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/YCqaOZ83OvPOzLwh@mwanda
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/mtd/nand/raw/fsmc_nand.c b/drivers/mtd/nand/raw/fsmc_nand.c
index 25d354e9448e..a31bb1da44ec 100644
--- a/drivers/mtd/nand/raw/fsmc_nand.c
+++ b/drivers/mtd/nand/raw/fsmc_nand.c
@@ -1099,11 +1099,13 @@ static int __init fsmc_nand_probe(struct platform_device *pdev)
 		host->read_dma_chan = dma_request_channel(mask, filter, NULL);
 		if (!host->read_dma_chan) {
 			dev_err(&pdev->dev, "Unable to get read dma channel\n");
+			ret = -ENODEV;
 			goto disable_clk;
 		}
 		host->write_dma_chan = dma_request_channel(mask, filter, NULL);
 		if (!host->write_dma_chan) {
 			dev_err(&pdev->dev, "Unable to get write dma channel\n");
+			ret = -ENODEV;
 			goto release_dma_read_chan;
 		}
 	}

commit 2dc1554d5f0fdaf47cc5bea442b84b9226fea867
Author: Meng Li <Meng.Li@windriver.com>
Date:   Fri Feb 26 10:17:37 2021 +0800

    regmap: set debugfs_name to NULL after it is freed
    
    [ Upstream commit e41a962f82e7afb5b1ee644f48ad0b3aee656268 ]
    
    There is a upstream commit cffa4b2122f5("regmap:debugfs:
    Fix a memory leak when calling regmap_attach_dev") that
    adds a if condition when create name for debugfs_name.
    With below function invoking logical, debugfs_name is
    freed in regmap_debugfs_exit(), but it is not created again
    because of the if condition introduced by above commit.
    regmap_reinit_cache()
            regmap_debugfs_exit()
            ...
            regmap_debugfs_init()
    So, set debugfs_name to NULL after it is freed.
    
    Fixes: cffa4b2122f5 ("regmap: debugfs: Fix a memory leak when calling regmap_attach_dev")
    Signed-off-by: Meng Li <Meng.Li@windriver.com>
    Link: https://lore.kernel.org/r/20210226021737.7690-1-Meng.Li@windriver.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c
index c9e5381a887b..de706734b921 100644
--- a/drivers/base/regmap/regmap-debugfs.c
+++ b/drivers/base/regmap/regmap-debugfs.c
@@ -665,6 +665,7 @@ void regmap_debugfs_exit(struct regmap *map)
 		regmap_debugfs_free_dump_cache(map);
 		mutex_unlock(&map->cache_lock);
 		kfree(map->debugfs_name);
+		map->debugfs_name = NULL;
 	} else {
 		struct regmap_debugfs_node *node, *tmp;
 

commit 8af6ecdb60c5648ad6090903d294589dee6aadff
Author: Badhri Jagan Sridharan <badhri@google.com>
Date:   Wed Mar 3 23:09:31 2021 -0800

    usb: typec: tcpci: Check ROLE_CONTROL while interpreting CC_STATUS
    
    [ Upstream commit 19c234a14eafca78e0bc14ffb8be3891096ce147 ]
    
    While interpreting CC_STATUS, ROLE_CONTROL has to be read to make
    sure that CC1/CC2 is not forced presenting Rp/Rd.
    
    >From the TCPCI spec:
    
    4.4.5.2 ROLE_CONTROL (Normative):
    The TCPM shall write B6 (DRP) = 0b and B3..0 (CC1/CC2) if it wishes
    to control the Rp/Rd directly instead of having the TCPC perform
    DRP toggling autonomously. When controlling Rp/Rd directly, the
    TCPM writes to B3..0 (CC1/CC2) each time it wishes to change the
    CC1/CC2 values. This control is used for TCPM-TCPC implementing
    Source or Sink only as well as when a connection has been detected
    via DRP toggling but the TCPM wishes to attempt Try.Src or Try.Snk.
    
    Table 4-22. CC_STATUS Register Definition:
    If (ROLE_CONTROL.CC1 = Rd) or ConnectResult=1)
    00b: SNK.Open (Below maximum vRa)
    01b: SNK.Default (Above minimum vRd-Connect)
    10b: SNK.Power1.5 (Above minimum vRd-Connect) Detects Rp-1.5A
    11b: SNK.Power3.0 (Above minimum vRd-Connect) Detects Rp-3.0A
    
    If (ROLE_CONTROL.CC2=Rd) or (ConnectResult=1)
    00b: SNK.Open (Below maximum vRa)
    01b: SNK.Default (Above minimum vRd-Connect)
    10b: SNK.Power1.5 (Above minimum vRd-Connect) Detects Rp 1.5A
    11b: SNK.Power3.0 (Above minimum vRd-Connect) Detects Rp 3.0A
    
    Fixes: 74e656d6b0551 ("staging: typec: Type-C Port Controller Interface driver (tcpci)")
    Acked-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
    Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>
    Link: https://lore.kernel.org/r/20210304070931.1947316-1-badhri@google.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/typec/tcpci.c b/drivers/usb/typec/tcpci.c
index dfae41fe1331..2c34add37708 100644
--- a/drivers/usb/typec/tcpci.c
+++ b/drivers/usb/typec/tcpci.c
@@ -20,6 +20,15 @@
 
 #define PD_RETRY_COUNT 3
 
+#define tcpc_presenting_cc1_rd(reg) \
+	(!(TCPC_ROLE_CTRL_DRP & (reg)) && \
+	 (((reg) & (TCPC_ROLE_CTRL_CC1_MASK << TCPC_ROLE_CTRL_CC1_SHIFT)) == \
+	  (TCPC_ROLE_CTRL_CC_RD << TCPC_ROLE_CTRL_CC1_SHIFT)))
+#define tcpc_presenting_cc2_rd(reg) \
+	(!(TCPC_ROLE_CTRL_DRP & (reg)) && \
+	 (((reg) & (TCPC_ROLE_CTRL_CC2_MASK << TCPC_ROLE_CTRL_CC2_SHIFT)) == \
+	  (TCPC_ROLE_CTRL_CC_RD << TCPC_ROLE_CTRL_CC2_SHIFT)))
+
 struct tcpci {
 	struct device *dev;
 
@@ -168,19 +177,25 @@ static int tcpci_get_cc(struct tcpc_dev *tcpc,
 			enum typec_cc_status *cc1, enum typec_cc_status *cc2)
 {
 	struct tcpci *tcpci = tcpc_to_tcpci(tcpc);
-	unsigned int reg;
+	unsigned int reg, role_control;
 	int ret;
 
+	ret = regmap_read(tcpci->regmap, TCPC_ROLE_CTRL, &role_control);
+	if (ret < 0)
+		return ret;
+
 	ret = regmap_read(tcpci->regmap, TCPC_CC_STATUS, &reg);
 	if (ret < 0)
 		return ret;
 
 	*cc1 = tcpci_to_typec_cc((reg >> TCPC_CC_STATUS_CC1_SHIFT) &
 				 TCPC_CC_STATUS_CC1_MASK,
-				 reg & TCPC_CC_STATUS_TERM);
+				 reg & TCPC_CC_STATUS_TERM ||
+				 tcpc_presenting_cc1_rd(role_control));
 	*cc2 = tcpci_to_typec_cc((reg >> TCPC_CC_STATUS_CC2_SHIFT) &
 				 TCPC_CC_STATUS_CC2_MASK,
-				 reg & TCPC_CC_STATUS_TERM);
+				 reg & TCPC_CC_STATUS_TERM ||
+				 tcpc_presenting_cc2_rd(role_control));
 
 	return 0;
 }

commit fd79b40070af92be485736abab7517b1d20ea8fb
Author: Erwan Le Ray <erwan.leray@foss.st.com>
Date:   Thu Mar 4 17:23:07 2021 +0100

    serial: stm32: fix tx_empty condition
    
    [ Upstream commit 3db1d52466dc11dca4e47ef12a6e6e97f846af62 ]
    
    In "tx_empty", we should poll TC bit in both DMA and PIO modes (instead of
    TXE) to check transmission data register has been transmitted independently
    of the FIFO mode. TC indicates that both transmit register and shift
    register are empty. When shift register is empty, tx_empty should return
    TIOCSER_TEMT instead of TC value.
    
    Cleans the USART_CR_TC TCCF register define (transmission complete clear
    flag) as it is duplicate of USART_ICR_TCCF.
    
    Fixes: 48a6092fb41f ("serial: stm32-usart: Add STM32 USART Driver")
    Signed-off-by: Erwan Le Ray <erwan.leray@foss.st.com>
    Link: https://lore.kernel.org/r/20210304162308.8984-13-erwan.leray@foss.st.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c
index 09cecd34d13e..50073ead5881 100644
--- a/drivers/tty/serial/stm32-usart.c
+++ b/drivers/tty/serial/stm32-usart.c
@@ -472,7 +472,10 @@ static unsigned int stm32_tx_empty(struct uart_port *port)
 	struct stm32_port *stm32_port = to_stm32_port(port);
 	struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;
 
-	return readl_relaxed(port->membase + ofs->isr) & USART_SR_TXE;
+	if (readl_relaxed(port->membase + ofs->isr) & USART_SR_TC)
+		return TIOCSER_TEMT;
+
+	return 0;
 }
 
 static void stm32_set_mctrl(struct uart_port *port, unsigned int mctrl)
diff --git a/drivers/tty/serial/stm32-usart.h b/drivers/tty/serial/stm32-usart.h
index 30d2433e27c3..00daee7f83ee 100644
--- a/drivers/tty/serial/stm32-usart.h
+++ b/drivers/tty/serial/stm32-usart.h
@@ -123,9 +123,6 @@ struct stm32_usart_info stm32h7_info = {
 /* Dummy bits */
 #define USART_SR_DUMMY_RX	BIT(16)
 
-/* USART_ICR (F7) */
-#define USART_CR_TC		BIT(6)
-
 /* USART_DR */
 #define USART_DR_MASK		GENMASK(8, 0)
 

commit d9849df3b1ccf98539f9109ffb7f610c789bd3ed
Author: Erwan Le Ray <erwan.leray@foss.st.com>
Date:   Thu Mar 4 17:22:58 2021 +0100

    serial: stm32: fix incorrect characters on console
    
    [ Upstream commit f264c6f6aece81a9f8fbdf912b20bd3feb476a7a ]
    
    Incorrect characters are observed on console during boot. This issue occurs
    when init/main.c is modifying termios settings to open /dev/console on the
    rootfs.
    
    This patch adds a waiting loop in set_termios to wait for TX shift register
    empty (and TX FIFO if any) before stopping serial port.
    
    Fixes: 48a6092fb41f ("serial: stm32-usart: Add STM32 USART Driver")
    Signed-off-by: Erwan Le Ray <erwan.leray@foss.st.com>
    Link: https://lore.kernel.org/r/20210304162308.8984-4-erwan.leray@foss.st.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c
index bce4ac1787ad..09cecd34d13e 100644
--- a/drivers/tty/serial/stm32-usart.c
+++ b/drivers/tty/serial/stm32-usart.c
@@ -637,8 +637,9 @@ static void stm32_set_termios(struct uart_port *port, struct ktermios *termios,
 	unsigned int baud, bits;
 	u32 usartdiv, mantissa, fraction, oversampling;
 	tcflag_t cflag = termios->c_cflag;
-	u32 cr1, cr2, cr3;
+	u32 cr1, cr2, cr3, isr;
 	unsigned long flags;
+	int ret;
 
 	if (!stm32_port->hw_flow_control)
 		cflag &= ~CRTSCTS;
@@ -647,6 +648,15 @@ static void stm32_set_termios(struct uart_port *port, struct ktermios *termios,
 
 	spin_lock_irqsave(&port->lock, flags);
 
+	ret = readl_relaxed_poll_timeout_atomic(port->membase + ofs->isr,
+						isr,
+						(isr & USART_SR_TC),
+						10, 100000);
+
+	/* Send the TC error message only when ISR_TC is not set. */
+	if (ret)
+		dev_err(port->dev, "Transmission is not complete\n");
+
 	/* Stop serial port and reset value */
 	writel_relaxed(0, port->membase + ofs->cr1);
 

commit fd38c5064fe01e6dd64cc6da427c08b3c8d33ef1
Author: Krzysztof Kozlowski <krzk@kernel.org>
Date:   Thu Dec 10 22:25:25 2020 +0100

    ARM: dts: exynos: correct PMIC interrupt trigger level on Snow
    
    [ Upstream commit 8987efbb17c2522be8615085df9a14da2ab53d34 ]
    
    The Maxim PMIC datasheets describe the interrupt line as active low
    with a requirement of acknowledge from the CPU.  Without specifying the
    interrupt type in Devicetree, kernel might apply some fixed
    configuration, not necessarily working for this hardware.
    
    Additionally, the interrupt line is shared so using level sensitive
    interrupt is here especially important to avoid races.
    
    Fixes: c61248afa819 ("ARM: dts: Add max77686 RTC interrupt to cros5250-common")
    Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
    Link: https://lore.kernel.org/r/20201210212534.216197-9-krzk@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/exynos5250-snow-common.dtsi b/arch/arm/boot/dts/exynos5250-snow-common.dtsi
index fd9226d3b207..3981acb00b5e 100644
--- a/arch/arm/boot/dts/exynos5250-snow-common.dtsi
+++ b/arch/arm/boot/dts/exynos5250-snow-common.dtsi
@@ -292,7 +292,7 @@
 	max77686: max77686@9 {
 		compatible = "maxim,max77686";
 		interrupt-parent = <&gpx3>;
-		interrupts = <2 IRQ_TYPE_NONE>;
+		interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&max77686_irq>;
 		wakeup-source;

commit 7e2d78e6c4b17119802bea9e5ae0953e9274961d
Author: Krzysztof Kozlowski <krzk@kernel.org>
Date:   Thu Dec 10 22:25:24 2020 +0100

    ARM: dts: exynos: correct PMIC interrupt trigger level on SMDK5250
    
    [ Upstream commit f6368c60561370e4a92fac22982a3bd656172170 ]
    
    The Maxim PMIC datasheets describe the interrupt line as active low
    with a requirement of acknowledge from the CPU.  Without specifying the
    interrupt type in Devicetree, kernel might apply some fixed
    configuration, not necessarily working for this hardware.
    
    Additionally, the interrupt line is shared so using level sensitive
    interrupt is here especially important to avoid races.
    
    Fixes: 47580e8d94c2 ("ARM: dts: Specify MAX77686 pmic interrupt for exynos5250-smdk5250")
    Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
    Link: https://lore.kernel.org/r/20201210212534.216197-8-krzk@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/exynos5250-smdk5250.dts b/arch/arm/boot/dts/exynos5250-smdk5250.dts
index d5e66189ed2a..594b246afbed 100644
--- a/arch/arm/boot/dts/exynos5250-smdk5250.dts
+++ b/arch/arm/boot/dts/exynos5250-smdk5250.dts
@@ -132,7 +132,7 @@
 		compatible = "maxim,max77686";
 		reg = <0x09>;
 		interrupt-parent = <&gpx3>;
-		interrupts = <2 IRQ_TYPE_NONE>;
+		interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&max77686_irq>;
 		wakeup-source;

commit 84eac67bcb414603783bbb70cbb3c3f55f094e59
Author: Krzysztof Kozlowski <krzk@kernel.org>
Date:   Thu Dec 10 22:25:22 2020 +0100

    ARM: dts: exynos: correct PMIC interrupt trigger level on Odroid X/U3 family
    
    [ Upstream commit 6503c568e97a52f8b7a3109718db438e52e59485 ]
    
    The Maxim PMIC datasheets describe the interrupt line as active low
    with a requirement of acknowledge from the CPU.  Without specifying the
    interrupt type in Devicetree, kernel might apply some fixed
    configuration, not necessarily working for this hardware.
    
    Additionally, the interrupt line is shared so using level sensitive
    interrupt is here especially important to avoid races.
    
    Fixes: eea6653aae7b ("ARM: dts: Enable PMIC interrupts for exynos4412-odroid-common")
    Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
    Link: https://lore.kernel.org/r/20201210212534.216197-6-krzk@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/exynos4412-odroid-common.dtsi b/arch/arm/boot/dts/exynos4412-odroid-common.dtsi
index 00820d239753..dbca8eeefae1 100644
--- a/arch/arm/boot/dts/exynos4412-odroid-common.dtsi
+++ b/arch/arm/boot/dts/exynos4412-odroid-common.dtsi
@@ -265,7 +265,7 @@
 	max77686: pmic@9 {
 		compatible = "maxim,max77686";
 		interrupt-parent = <&gpx3>;
-		interrupts = <2 IRQ_TYPE_NONE>;
+		interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&max77686_irq>;
 		reg = <0x09>;

commit 17a21edc510848bd52fe9e63c8198419c81f48b7
Author: Krzysztof Kozlowski <krzk@kernel.org>
Date:   Thu Dec 10 22:25:21 2020 +0100

    ARM: dts: exynos: correct PMIC interrupt trigger level on Midas family
    
    [ Upstream commit e52dcd6e70fab51f53292e53336ecb007bb60889 ]
    
    The Maxim PMIC datasheets describe the interrupt line as active low
    with a requirement of acknowledge from the CPU.  Without specifying the
    interrupt type in Devicetree, kernel might apply some fixed
    configuration, not necessarily working for this hardware.
    
    Additionally, the interrupt line is shared so using level sensitive
    interrupt is here especially important to avoid races.
    
    Fixes: 15dfdfad2d4a ("ARM: dts: Add basic dts for Exynos4412-based Trats 2 board")
    Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
    Link: https://lore.kernel.org/r/20201210212534.216197-5-krzk@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/exynos4412-midas.dtsi b/arch/arm/boot/dts/exynos4412-midas.dtsi
index c6cc3d2a1121..60fbad25b5f2 100644
--- a/arch/arm/boot/dts/exynos4412-midas.dtsi
+++ b/arch/arm/boot/dts/exynos4412-midas.dtsi
@@ -579,7 +579,7 @@
 	max77686: max77686_pmic@9 {
 		compatible = "maxim,max77686";
 		interrupt-parent = <&gpx0>;
-		interrupts = <7 IRQ_TYPE_NONE>;
+		interrupts = <7 IRQ_TYPE_LEVEL_LOW>;
 		pinctrl-0 = <&max77686_irq>;
 		pinctrl-names = "default";
 		reg = <0x09>;

commit 648fafd886fa1680c6ba52a1d6e34fa5513a93f0
Author: Krzysztof Kozlowski <krzk@kernel.org>
Date:   Thu Dec 10 22:25:20 2020 +0100

    ARM: dts: exynos: correct MUIC interrupt trigger level on Midas family
    
    [ Upstream commit 15107e443ab8c6cb35eff10438993e4bc944d9ae ]
    
    The Maxim MUIC datasheets describe the interrupt line as active low
    with a requirement of acknowledge from the CPU.  Without specifying the
    interrupt type in Devicetree, kernel might apply some fixed
    configuration, not necessarily working for this hardware.
    
    Additionally, the interrupt line is shared so using level sensitive
    interrupt is here especially important to avoid races.
    
    Fixes: 7eec1266751b ("ARM: dts: Add Maxim 77693 PMIC to exynos4412-trats2")
    Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
    Link: https://lore.kernel.org/r/20201210212534.216197-4-krzk@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/exynos4412-midas.dtsi b/arch/arm/boot/dts/exynos4412-midas.dtsi
index d4bb5f65b9f3..c6cc3d2a1121 100644
--- a/arch/arm/boot/dts/exynos4412-midas.dtsi
+++ b/arch/arm/boot/dts/exynos4412-midas.dtsi
@@ -139,7 +139,7 @@
 		max77693@66 {
 			compatible = "maxim,max77693";
 			interrupt-parent = <&gpx1>;
-			interrupts = <5 IRQ_TYPE_EDGE_FALLING>;
+			interrupts = <5 IRQ_TYPE_LEVEL_LOW>;
 			pinctrl-names = "default";
 			pinctrl-0 = <&max77693_irq>;
 			reg = <0x66>;

commit ce4d02efd7e2e9f73a5033925b0d6d0c768b5c3e
Author: Krzysztof Kozlowski <krzk@kernel.org>
Date:   Thu Dec 10 22:25:19 2020 +0100

    ARM: dts: exynos: correct fuel gauge interrupt trigger level on Midas family
    
    [ Upstream commit 8a45f33bd36efbb624198cfa9fdf1f66fd1c3d26 ]
    
    The Maxim fuel gauge datasheets describe the interrupt line as active
    low with a requirement of acknowledge from the CPU.  The falling edge
    interrupt will mostly work but it's not correct.
    
    Fixes: e8614292cd41 ("ARM: dts: Add Maxim 77693 fuel gauge node for exynos4412-trats2")
    Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
    Link: https://lore.kernel.org/r/20201210212534.216197-3-krzk@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm/boot/dts/exynos4412-midas.dtsi b/arch/arm/boot/dts/exynos4412-midas.dtsi
index c0476c290977..d4bb5f65b9f3 100644
--- a/arch/arm/boot/dts/exynos4412-midas.dtsi
+++ b/arch/arm/boot/dts/exynos4412-midas.dtsi
@@ -187,7 +187,7 @@
 		max77693-fuel-gauge@36 {
 			compatible = "maxim,max17047";
 			interrupt-parent = <&gpx2>;
-			interrupts = <3 IRQ_TYPE_EDGE_FALLING>;
+			interrupts = <3 IRQ_TYPE_LEVEL_LOW>;
 			pinctrl-names = "default";
 			pinctrl-0 = <&max77693_fuel_irq>;
 			reg = <0x36>;

commit c2df9eac22d99400a387bea655cce3742f99c04f
Author: Colin Ian King <colin.king@canonical.com>
Date:   Tue Feb 23 19:38:21 2021 +0000

    memory: gpmc: fix out of bounds read and dereference on gpmc_cs[]
    
    [ Upstream commit e004c3e67b6459c99285b18366a71af467d869f5 ]
    
    Currently the array gpmc_cs is indexed by cs before it cs is range checked
    and the pointer read from this out-of-index read is dereferenced. Fix this
    by performing the range check on cs before the read and the following
    pointer dereference.
    
    Addresses-Coverity: ("Negative array index read")
    Fixes: 9ed7a776eb50 ("ARM: OMAP2+: Fix support for multiple devices on a GPMC chip select")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Reviewed-by: Tony Lindgren <tony@atomide.com>
    Link: https://lore.kernel.org/r/20210223193821.17232-1-colin.king@canonical.com
    Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/memory/omap-gpmc.c b/drivers/memory/omap-gpmc.c
index 2ca507f3a58c..d8f2cacea750 100644
--- a/drivers/memory/omap-gpmc.c
+++ b/drivers/memory/omap-gpmc.c
@@ -1028,8 +1028,8 @@ EXPORT_SYMBOL(gpmc_cs_request);
 
 void gpmc_cs_free(int cs)
 {
-	struct gpmc_cs_data *gpmc = &gpmc_cs[cs];
-	struct resource *res = &gpmc->mem;
+	struct gpmc_cs_data *gpmc;
+	struct resource *res;
 
 	spin_lock(&gpmc_mem_lock);
 	if (cs >= gpmc_cs_num || cs < 0 || !gpmc_cs_reserved(cs)) {
@@ -1038,6 +1038,9 @@ void gpmc_cs_free(int cs)
 		spin_unlock(&gpmc_mem_lock);
 		return;
 	}
+	gpmc = &gpmc_cs[cs];
+	res = &gpmc->mem;
+
 	gpmc_cs_disable_mem(cs);
 	if (res->flags)
 		release_resource(res);

commit eb878d938b1dc4bcd222a8d65b7eb4dd46ac21ce
Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date:   Tue Mar 23 17:36:24 2021 +0200

    usb: gadget: pch_udc: Revert d3cb25a12138 completely
    
    commit 50a318cc9b54a36f00beadf77e578a50f3620477 upstream.
    
    The commit d3cb25a12138 ("usb: gadget: udc: fix spin_lock in pch_udc")
    obviously was not thought through and had made the situation even worse
    than it was before. Two changes after almost reverted it. but a few
    leftovers have been left as it. With this revert d3cb25a12138 completely.
    
    While at it, narrow down the scope of unlocked section to prevent
    potential race when prot_stall is assigned.
    
    Fixes: d3cb25a12138 ("usb: gadget: udc: fix spin_lock in pch_udc")
    Fixes: 9903b6bedd38 ("usb: gadget: pch-udc: fix lock")
    Fixes: 1d23d16a88e6 ("usb: gadget: pch_udc: reorder spin_[un]lock to avoid deadlock")
    Cc: Iago Abal <mail@iagoabal.eu>
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Link: https://lore.kernel.org/r/20210323153626.54908-5-andriy.shevchenko@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/gadget/udc/pch_udc.c b/drivers/usb/gadget/udc/pch_udc.c
index 667011c99372..8e304e9845d9 100644
--- a/drivers/usb/gadget/udc/pch_udc.c
+++ b/drivers/usb/gadget/udc/pch_udc.c
@@ -600,18 +600,22 @@ static void pch_udc_reconnect(struct pch_udc_dev *dev)
 static inline void pch_udc_vbus_session(struct pch_udc_dev *dev,
 					  int is_active)
 {
+	unsigned long		iflags;
+
+	spin_lock_irqsave(&dev->lock, iflags);
 	if (is_active) {
 		pch_udc_reconnect(dev);
 		dev->vbus_session = 1;
 	} else {
 		if (dev->driver && dev->driver->disconnect) {
-			spin_lock(&dev->lock);
+			spin_unlock_irqrestore(&dev->lock, iflags);
 			dev->driver->disconnect(&dev->gadget);
-			spin_unlock(&dev->lock);
+			spin_lock_irqsave(&dev->lock, iflags);
 		}
 		pch_udc_set_disconnect(dev);
 		dev->vbus_session = 0;
 	}
+	spin_unlock_irqrestore(&dev->lock, iflags);
 }
 
 /**
@@ -1168,20 +1172,25 @@ static int pch_udc_pcd_selfpowered(struct usb_gadget *gadget, int value)
 static int pch_udc_pcd_pullup(struct usb_gadget *gadget, int is_on)
 {
 	struct pch_udc_dev	*dev;
+	unsigned long		iflags;
 
 	if (!gadget)
 		return -EINVAL;
+
 	dev = container_of(gadget, struct pch_udc_dev, gadget);
+
+	spin_lock_irqsave(&dev->lock, iflags);
 	if (is_on) {
 		pch_udc_reconnect(dev);
 	} else {
 		if (dev->driver && dev->driver->disconnect) {
-			spin_lock(&dev->lock);
+			spin_unlock_irqrestore(&dev->lock, iflags);
 			dev->driver->disconnect(&dev->gadget);
-			spin_unlock(&dev->lock);
+			spin_lock_irqsave(&dev->lock, iflags);
 		}
 		pch_udc_set_disconnect(dev);
 	}
+	spin_unlock_irqrestore(&dev->lock, iflags);
 
 	return 0;
 }

commit a42e385f0a4160709882b9435b874a7cdab24d46
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Tue Mar 23 16:19:35 2021 +0300

    ovl: fix missing revert_creds() on error path
    
    commit 7b279bbfd2b230c7a210ff8f405799c7e46bbf48 upstream.
    
    Smatch complains about missing that the ovl_override_creds() doesn't
    have a matching revert_creds() if the dentry is disconnected.  Fix this
    by moving the ovl_override_creds() until after the disconnected check.
    
    Fixes: aa3ff3c152ff ("ovl: copy up of disconnected dentries")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c
index e164f489d01d..30abafcd4ecc 100644
--- a/fs/overlayfs/copy_up.c
+++ b/fs/overlayfs/copy_up.c
@@ -824,7 +824,7 @@ static int ovl_copy_up_one(struct dentry *parent, struct dentry *dentry,
 int ovl_copy_up_flags(struct dentry *dentry, int flags)
 {
 	int err = 0;
-	const struct cred *old_cred = ovl_override_creds(dentry->d_sb);
+	const struct cred *old_cred;
 	bool disconnected = (dentry->d_flags & DCACHE_DISCONNECTED);
 
 	/*
@@ -835,6 +835,7 @@ int ovl_copy_up_flags(struct dentry *dentry, int flags)
 	if (WARN_ON(disconnected && d_is_dir(dentry)))
 		return -EIO;
 
+	old_cred = ovl_override_creds(dentry->d_sb);
 	while (!err) {
 		struct dentry *next;
 		struct dentry *parent = NULL;

commit 45eef8fabf8ec33f3aebd701060e91a4f88e90e2
Author: Claudio Imbrenda <imbrenda@linux.ibm.com>
Date:   Mon Mar 22 15:05:58 2021 +0100

    KVM: s390: split kvm_s390_real_to_abs
    
    commit c5d1f6b531e68888cbe6718b3f77a60115d58b9c upstream.
    
    A new function _kvm_s390_real_to_abs will apply prefixing to a real address
    with a given prefix value.
    
    The old kvm_s390_real_to_abs becomes now a wrapper around the new function.
    
    This is needed to avoid code duplication in vSIE.
    
    Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
    Reviewed-by: David Hildenbrand <david@redhat.com>
    Reviewed-by: Thomas Huth <thuth@redhat.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210322140559.500716-2-imbrenda@linux.ibm.com
    Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/s390/kvm/gaccess.h b/arch/s390/kvm/gaccess.h
index 2d8631a1f23e..4c56de542960 100644
--- a/arch/s390/kvm/gaccess.h
+++ b/arch/s390/kvm/gaccess.h
@@ -18,17 +18,14 @@
 
 /**
  * kvm_s390_real_to_abs - convert guest real address to guest absolute address
- * @vcpu - guest virtual cpu
+ * @prefix - guest prefix
  * @gra - guest real address
  *
  * Returns the guest absolute address that corresponds to the passed guest real
- * address @gra of a virtual guest cpu by applying its prefix.
+ * address @gra of by applying the given prefix.
  */
-static inline unsigned long kvm_s390_real_to_abs(struct kvm_vcpu *vcpu,
-						 unsigned long gra)
+static inline unsigned long _kvm_s390_real_to_abs(u32 prefix, unsigned long gra)
 {
-	unsigned long prefix  = kvm_s390_get_prefix(vcpu);
-
 	if (gra < 2 * PAGE_SIZE)
 		gra += prefix;
 	else if (gra >= prefix && gra < prefix + 2 * PAGE_SIZE)
@@ -36,6 +33,20 @@ static inline unsigned long kvm_s390_real_to_abs(struct kvm_vcpu *vcpu,
 	return gra;
 }
 
+/**
+ * kvm_s390_real_to_abs - convert guest real address to guest absolute address
+ * @vcpu - guest virtual cpu
+ * @gra - guest real address
+ *
+ * Returns the guest absolute address that corresponds to the passed guest real
+ * address @gra of a virtual guest cpu by applying its prefix.
+ */
+static inline unsigned long kvm_s390_real_to_abs(struct kvm_vcpu *vcpu,
+						 unsigned long gra)
+{
+	return _kvm_s390_real_to_abs(kvm_s390_get_prefix(vcpu), gra);
+}
+
 /**
  * _kvm_s390_logical_to_effective - convert guest logical to effective address
  * @psw: psw of the guest

commit 0ebfdc84080ca0c54b866b1935d192c09d1d4b11
Author: Heiko Carstens <hca@linux.ibm.com>
Date:   Thu Apr 15 10:01:27 2021 +0200

    KVM: s390: fix guarded storage control register handling
    
    commit 44bada28219031f9e8e86b84460606efa57b871e upstream.
    
    store_regs_fmt2() has an ordering problem: first the guarded storage
    facility is enabled on the local cpu, then preemption disabled, and
    then the STGSC (store guarded storage controls) instruction is
    executed.
    
    If the process gets scheduled away between enabling the guarded
    storage facility and before preemption is disabled, this might lead to
    a special operation exception and therefore kernel crash as soon as
    the process is scheduled back and the STGSC instruction is executed.
    
    Fixes: 4e0b1ab72b8a ("KVM: s390: gs support for kvm guests")
    Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
    Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
    Reviewed-by: David Hildenbrand <david@redhat.com>
    Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
    Reviewed-by: Cornelia Huck <cohuck@redhat.com>
    Cc: <stable@vger.kernel.org> # 4.12
    Link: https://lore.kernel.org/r/20210415080127.1061275-1-hca@linux.ibm.com
    Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 18662c1a9361..71c67a1d2849 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -3624,16 +3624,16 @@ static void store_regs(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
 	current->thread.fpu.fpc = vcpu->arch.host_fpregs.fpc;
 	current->thread.fpu.regs = vcpu->arch.host_fpregs.regs;
 	if (MACHINE_HAS_GS) {
+		preempt_disable();
 		__ctl_set_bit(2, 4);
 		if (vcpu->arch.gs_enabled)
 			save_gs_cb(current->thread.gs_cb);
-		preempt_disable();
 		current->thread.gs_cb = vcpu->arch.host_gscb;
 		restore_gs_cb(vcpu->arch.host_gscb);
-		preempt_enable();
 		if (!vcpu->arch.host_gscb)
 			__ctl_clear_bit(2, 4);
 		vcpu->arch.host_gscb = NULL;
+		preempt_enable();
 	}
 	/* SIE will save etoken directly into SDNX and therefore kvm_run */
 }

commit 587ae3236bb13226ea14560897eba78eabf904e3
Author: Claudio Imbrenda <imbrenda@linux.ibm.com>
Date:   Tue Mar 2 13:36:44 2021 +0100

    KVM: s390: split kvm_s390_logical_to_effective
    
    commit f85f1baaa18932a041fd2b1c2ca6cfd9898c7d2b upstream.
    
    Split kvm_s390_logical_to_effective to a generic function called
    _kvm_s390_logical_to_effective. The new function takes a PSW and an address
    and returns the address with the appropriate bits masked off. The old
    function now calls the new function with the appropriate PSW from the vCPU.
    
    This is needed to avoid code duplication for vSIE.
    
    Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
    Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
    Cc: stable@vger.kernel.org # for VSIE: correctly handle MVPG when in VSIE
    Link: https://lore.kernel.org/r/20210302174443.514363-2-imbrenda@linux.ibm.com
    Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/s390/kvm/gaccess.h b/arch/s390/kvm/gaccess.h
index f4c51756c462..2d8631a1f23e 100644
--- a/arch/s390/kvm/gaccess.h
+++ b/arch/s390/kvm/gaccess.h
@@ -36,6 +36,29 @@ static inline unsigned long kvm_s390_real_to_abs(struct kvm_vcpu *vcpu,
 	return gra;
 }
 
+/**
+ * _kvm_s390_logical_to_effective - convert guest logical to effective address
+ * @psw: psw of the guest
+ * @ga: guest logical address
+ *
+ * Convert a guest logical address to an effective address by applying the
+ * rules of the addressing mode defined by bits 31 and 32 of the given PSW
+ * (extendended/basic addressing mode).
+ *
+ * Depending on the addressing mode, the upper 40 bits (24 bit addressing
+ * mode), 33 bits (31 bit addressing mode) or no bits (64 bit addressing
+ * mode) of @ga will be zeroed and the remaining bits will be returned.
+ */
+static inline unsigned long _kvm_s390_logical_to_effective(psw_t *psw,
+							   unsigned long ga)
+{
+	if (psw_bits(*psw).eaba == PSW_BITS_AMODE_64BIT)
+		return ga;
+	if (psw_bits(*psw).eaba == PSW_BITS_AMODE_31BIT)
+		return ga & ((1UL << 31) - 1);
+	return ga & ((1UL << 24) - 1);
+}
+
 /**
  * kvm_s390_logical_to_effective - convert guest logical to effective address
  * @vcpu: guest virtual cpu
@@ -52,13 +75,7 @@ static inline unsigned long kvm_s390_real_to_abs(struct kvm_vcpu *vcpu,
 static inline unsigned long kvm_s390_logical_to_effective(struct kvm_vcpu *vcpu,
 							  unsigned long ga)
 {
-	psw_t *psw = &vcpu->arch.sie_block->gpsw;
-
-	if (psw_bits(*psw).eaba == PSW_BITS_AMODE_64BIT)
-		return ga;
-	if (psw_bits(*psw).eaba == PSW_BITS_AMODE_31BIT)
-		return ga & ((1UL << 31) - 1);
-	return ga & ((1UL << 24) - 1);
+	return _kvm_s390_logical_to_effective(&vcpu->arch.sie_block->gpsw, ga);
 }
 
 /*

commit bd1b3b2bd4dae57e5a2e06c340531137af633368
Author: Sean Christopherson <seanjc@google.com>
Date:   Tue May 4 15:56:31 2021 -0700

    x86/cpu: Initialize MSR_TSC_AUX if RDTSCP *or* RDPID is supported
    
    commit b6b4fbd90b155a0025223df2c137af8a701d53b3 upstream.
    
    Initialize MSR_TSC_AUX with CPU node information if RDTSCP or RDPID is
    supported.  This fixes a bug where vdso_read_cpunode() will read garbage
    via RDPID if RDPID is supported but RDTSCP is not.  While no known CPU
    supports RDPID but not RDTSCP, both Intel's SDM and AMD's APM allow for
    RDPID to exist without RDTSCP, e.g. it's technically a legal CPU model
    for a virtual machine.
    
    Note, technically MSR_TSC_AUX could be initialized if and only if RDPID
    is supported since RDTSCP is currently not used to retrieve the CPU node.
    But, the cost of the superfluous WRMSR is negigible, whereas leaving
    MSR_TSC_AUX uninitialized is just asking for future breakage if someone
    decides to utilize RDTSCP.
    
    Fixes: a582c540ac1b ("x86/vdso: Use RDPID in preference to LSL when available")
    Signed-off-by: Sean Christopherson <seanjc@google.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210504225632.1532621-2-seanjc@google.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c
index 5b8b556dbb12..46caca4d9141 100644
--- a/arch/x86/entry/vdso/vma.c
+++ b/arch/x86/entry/vdso/vma.c
@@ -343,7 +343,7 @@ static void vgetcpu_cpu_init(void *arg)
 #ifdef CONFIG_NUMA
 	node = cpu_to_node(cpu);
 #endif
-	if (static_cpu_has(X86_FEATURE_RDTSCP))
+	if (boot_cpu_has(X86_FEATURE_RDTSCP) || boot_cpu_has(X86_FEATURE_RDPID))
 		write_rdtscp_aux((node << 12) | cpu);
 
 	/*

commit ff8ef1fbc59f5cc20e2197458c93c5500116d465
Author: Takashi Iwai <tiwai@suse.de>
Date:   Wed Apr 28 13:27:03 2021 +0200

    ALSA: hda/realtek: Remove redundant entry for ALC861 Haier/Uniwill devices
    
    commit defce244b01ee12534910a4544e11be5eb927d25 upstream.
    
    The quirk entry for Uniwill ECS M31EI is with the PCI SSID device 0,
    which means matching with all.  That is, it's essentially equivalent
    with SND_PCI_QUIRK_VENDOR(0x1584), which also matches with the
    previous entry for Haier W18 applying the very same quirk.
    
    Let's unify them with the single vendor-quirk entry.
    
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210428112704.23967-13-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 264c4f5d95a6..c4a9141a449c 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -8175,8 +8175,7 @@ static const struct snd_pci_quirk alc861_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
 	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
 	SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
-	SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", ALC861_FIXUP_AMP_VREF_0F),
-	SND_PCI_QUIRK(0x1584, 0x0000, "Uniwill ECS M31EI", ALC861_FIXUP_AMP_VREF_0F),
+	SND_PCI_QUIRK_VENDOR(0x1584, "Haier/Uniwill", ALC861_FIXUP_AMP_VREF_0F),
 	SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
 	{}
 };

commit 1ccf0162d8dc0b1e8ad6e082790df8292d45dba2
Author: Takashi Iwai <tiwai@suse.de>
Date:   Wed Apr 28 13:27:00 2021 +0200

    ALSA: hda/realtek: Re-order ALC269 Lenovo quirk table entries
    
    commit f552ff54c2a700616a02b038e4bf3cbf859f65b7 upstream.
    
    Just re-order the alc269_fixup_tbl[] entries for Lenovo devices for
    avoiding the oversight of the duplicated or unapplied item in future.
    No functional changes.
    
    Also Cc-to-stable for the further patch applications.
    
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210428112704.23967-10-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index cb155ef1a1f2..264c4f5d95a6 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -7199,9 +7199,9 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
 	SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
 	SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
+	SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
 	SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST),
 	SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
-	SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
 	SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
 	SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
 	SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
@@ -7243,6 +7243,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
 	SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
 	SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
+	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
 	SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
 	SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
 	SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
@@ -7261,7 +7262,6 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
 	SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
 	SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
-	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
 	SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
 	SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MBXP", ALC256_FIXUP_HUAWEI_MBXP_PINS),
 	SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */

commit 83c9c084b01bdd95f64bdefe0152e72b5ef24ce7
Author: Takashi Iwai <tiwai@suse.de>
Date:   Wed Apr 28 13:26:59 2021 +0200

    ALSA: hda/realtek: Re-order ALC269 Sony quirk table entries
    
    commit cab561f8d4bc9b196ae20c960aa5da89fd786ab5 upstream.
    
    Just re-order the alc269_fixup_tbl[] entries for Sony devices for
    avoiding the oversight of the duplicated or unapplied item in future.
    No functional changes.
    
    Also Cc-to-stable for the further patch applications.
    
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210428112704.23967-9-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 9dbc67975392..cb155ef1a1f2 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -7128,12 +7128,12 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
 	SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
 	SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
-	SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
-	SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
 	SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
 	SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
 	SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
+	SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
 	SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
 	SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),

commit b2fcf4d7c4d4d2c22a91bc01ad30d7fa0321775a
Author: Takashi Iwai <tiwai@suse.de>
Date:   Wed Apr 28 13:26:57 2021 +0200

    ALSA: hda/realtek: Re-order ALC269 Dell quirk table entries
    
    commit aa143ad39a52d968ac69e426d329bb74f270e6ca upstream.
    
    Just re-order the alc269_fixup_tbl[] entries for Dell devices for
    avoiding the oversight of the duplicated or unapplied item in future.
    No functional changes.
    
    Also Cc-to-stable for the further patch applications.
    
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210428112704.23967-7-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 2be507684c89..9dbc67975392 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -7009,8 +7009,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),
 	SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),
 	SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
-	SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),
 	SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
+	SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),
 	SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
 	SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
@@ -7020,8 +7020,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
-	SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
 	SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
+	SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
 	SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),

commit 054e405da58d85567b6fb4daf1d51c4a4c9a0277
Author: Takashi Iwai <tiwai@suse.de>
Date:   Wed Apr 28 13:26:55 2021 +0200

    ALSA: hda/realtek: Re-order ALC269 HP quirk table entries
    
    commit 45461e3b554c75ddff9703539f3711cc3dfb0422 upstream.
    
    Just re-order the alc269_fixup_tbl[] entries for HP devices for
    avoiding the oversight of the duplicated or unapplied item in future.
    No functional changes.
    
    Formerly, some entries were grouped for the actual codec, but this
    doesn't seem reasonable to keep in that way.  So now we simply keep
    the PCI SSID order for the whole.
    
    Also Cc-to-stable for the further patch applications.
    
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210428112704.23967-5-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index c27438c10dc2..2be507684c89 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -7029,35 +7029,18 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
 	SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
 	SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
-	SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
-	/* ALC282 */
 	SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
 	SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
 	SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
+	SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
+	SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
+	SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
+	SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
 	SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
 	SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
 	SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
 	SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
 	SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
-	SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
-	SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
-	SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
-	SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
-	SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
-	SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
-	SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
-	SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
-	SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
-	SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
-	SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
-	SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
-	SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
-	SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
-	SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
-	/* ALC290 */
-	SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
-	SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
-	SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
 	SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
 	SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
 	SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
@@ -7065,26 +7048,41 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
 	SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
 	SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
+	SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
 	SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
 	SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
 	SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
 	SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
+	SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
+	SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
+	SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
+	SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
+	SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
 	SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
+	SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
 	SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
+	SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
 	SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
 	SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
 	SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
 	SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
 	SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
+	SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
+	SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
+	SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
+	SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
+	SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
 	SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
 	SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
 	SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
-	SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
+	SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
+	SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
+	SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
+	SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
 	SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
 	SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
 	SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
 	SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
-	SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
 	SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),

commit 2ab9d286e3f60279d63fc51256400061f703de61
Author: Takashi Iwai <tiwai@suse.de>
Date:   Wed Apr 28 13:26:54 2021 +0200

    ALSA: hda/realtek: Re-order ALC882 Clevo quirk table entries
    
    commit 13e1a4cd490b959a4c72c9f4fb502ef56b190062 upstream.
    
    Just re-order the alc882_fixup_tbl[] entries for Clevo devices for
    avoiding the oversight of the duplicated or unapplied item in future.
    No functional changes.
    
    Also, user lower hex letters in the entry.
    
    Also Cc-to-stable for the further patch applications.
    
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210428112704.23967-4-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 7292668dec25..c27438c10dc2 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -2511,9 +2511,19 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
 	SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
 	SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
+	SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
+	SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
+	SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
+	SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
+	SND_PCI_QUIRK(0x1558, 0x65e5, "Clevo PC50D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
+	SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
+	SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
+	SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
+	SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
+	SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
 	SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950),
-	SND_PCI_QUIRK(0x1558, 0x950A, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),
+	SND_PCI_QUIRK(0x1558, 0x950a, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),
 	SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
 	SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
 	SND_PCI_QUIRK(0x1558, 0x95e3, "Clevo P955[ER]T", ALC1220_FIXUP_CLEVO_P950),
@@ -2523,16 +2533,6 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),
 	SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
 	SND_PCI_QUIRK(0x1558, 0x97e2, "Clevo P970RC-M", ALC1220_FIXUP_CLEVO_P950),
-	SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
-	SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
-	SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
-	SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
-	SND_PCI_QUIRK(0x1558, 0x65e5, "Clevo PC50D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
-	SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
-	SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
-	SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
-	SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
-	SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
 	SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
 	SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),

commit 76e8de3a5c64a0101c335c4e13607be3e86b8129
Author: Takashi Iwai <tiwai@suse.de>
Date:   Wed Apr 28 13:26:53 2021 +0200

    ALSA: hda/realtek: Re-order ALC882 Sony quirk table entries
    
    commit b7529c18feecb1af92f9db08c8e7fe446a82d96d upstream.
    
    Just re-order the alc882_fixup_tbl[] entries for Sony devices for
    avoiding the oversight of the duplicated or unapplied item in future.
    No functional changes.
    
    Also Cc-to-stable for the further patch applications.
    
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210428112704.23967-3-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 81b8f16dae5f..7292668dec25 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -2464,11 +2464,11 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
 	SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),
 	SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3),
+	SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
+	SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
 	SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
 	SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
 	SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP),
-	SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
-	SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
 
 	/* All Apple entries are in codec SSIDs */
 	SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),

commit 185df027c9304e88c01689a64d8bd968521f041b
Author: Takashi Iwai <tiwai@suse.de>
Date:   Wed Apr 28 13:26:52 2021 +0200

    ALSA: hda/realtek: Re-order ALC882 Acer quirk table entries
    
    commit b265047ac56bad8c4f3d0c8bf9cb4e828ee0d28e upstream.
    
    Just re-order the alc882_fixup_tbl[] entries for Acer devices for
    avoiding the oversight of the duplicated or unapplied item in future.
    No functional changes.
    
    Also Cc-to-stable for the further patch applications.
    
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210428112704.23967-2-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 03fcaf0b4790..81b8f16dae5f 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -2445,13 +2445,13 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
 		      ALC882_FIXUP_ACER_ASPIRE_8930G),
 	SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
 		      ALC882_FIXUP_ACER_ASPIRE_8930G),
+	SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
+		      ALC882_FIXUP_ACER_ASPIRE_4930G),
+	SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
 	SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
 	SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
-	SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
-		      ALC882_FIXUP_ACER_ASPIRE_4930G),
-	SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
 	SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G",
 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
 	SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),

commit 0e045bb60dca1e8d3c936a1a576cc1ecfa36f110
Author: Colin Ian King <colin.king@canonical.com>
Date:   Wed Mar 3 00:27:59 2021 +0000

    drm/radeon: fix copy of uninitialized variable back to userspace
    
    commit 8dbc2ccac5a65c5b57e3070e36a3dc97c7970d96 upstream.
    
    Currently the ioctl command RADEON_INFO_SI_BACKEND_ENABLED_MASK can
    copy back uninitialised data in value_tmp that pointer *value points
    to. This can occur when rdev->family is less than CHIP_BONAIRE and
    less than CHIP_TAHITI.  Fix this by adding in a missing -EINVAL
    so that no invalid value is copied back to userspace.
    
    Addresses-Coverity: ("Uninitialized scalar variable)
    Cc: stable@vger.kernel.org # 3.13+
    Fixes: 439a1cfffe2c ("drm/radeon: expose render backend mask to the userspace")
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
index 34b3cb6c146f..3f75b4be7fa4 100644
--- a/drivers/gpu/drm/radeon/radeon_kms.c
+++ b/drivers/gpu/drm/radeon/radeon_kms.c
@@ -501,6 +501,7 @@ static int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file
 			*value = rdev->config.si.backend_enable_mask;
 		} else {
 			DRM_DEBUG_KMS("BACKEND_ENABLED_MASK is si+ only!\n");
+			return -EINVAL;
 		}
 		break;
 	case RADEON_INFO_MAX_SCLK:

commit 26f11be3769670eec978727befb1755f36378bf0
Author: Johannes Berg <johannes.berg@intel.com>
Date:   Fri Apr 16 09:42:14 2021 +0200

    cfg80211: scan: drop entry from hidden_list on overflow
    
    commit 010bfbe768f7ecc876ffba92db30432de4997e2a upstream.
    
    If we overflow the maximum number of BSS entries and free the
    new entry, drop it from any hidden_list that it may have been
    added to in the code above or in cfg80211_combine_bsses().
    
    Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
    Link: https://lore.kernel.org/r/20210416094212.5de7d1676ad7.Ied283b0bc5f504845e7d6ab90626bdfa68bb3dc0@changeid
    Cc: stable@vger.kernel.org
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/wireless/scan.c b/net/wireless/scan.c
index e5d61ba837ad..67b2747ad9ef 100644
--- a/net/wireless/scan.c
+++ b/net/wireless/scan.c
@@ -1036,6 +1036,8 @@ cfg80211_bss_update(struct cfg80211_registered_device *rdev,
 
 		if (rdev->bss_entries >= bss_entries_limit &&
 		    !cfg80211_bss_expire_oldest(rdev)) {
+			if (!list_empty(&new->hidden_list))
+				list_del(&new->hidden_list);
 			kfree(new);
 			goto drop;
 		}

commit e6fdc25759b6c7b42fdc1d83de53cf9e6a51d7a8
Author: Dan Carpenter <dan.carpenter@oracle.com>
Date:   Wed Apr 14 11:29:55 2021 +0300

    ipw2x00: potential buffer overflow in libipw_wx_set_encodeext()
    
    commit 260a9ad9446723d4063ed802989758852809714d upstream.
    
    The "ext->key_len" is a u16 that comes from the user.  If it's over
    SCM_KEY_LEN (32) that could lead to memory corruption.
    
    Fixes: e0d369d1d969 ("[PATCH] ieee82011: Added WE-18 support to default wireless extension handler")
    Cc: stable@vger.kernel.org
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Acked-by: Stanislav Yakovlev <stas.yakovlev@gmail.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/YHaoA1i+8uT4ir4h@mwanda
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/intel/ipw2x00/libipw_wx.c b/drivers/net/wireless/intel/ipw2x00/libipw_wx.c
index d32d39fa2686..c129291d3a17 100644
--- a/drivers/net/wireless/intel/ipw2x00/libipw_wx.c
+++ b/drivers/net/wireless/intel/ipw2x00/libipw_wx.c
@@ -647,8 +647,10 @@ int libipw_wx_set_encodeext(struct libipw_device *ieee,
 	}
 
 	if (ext->alg != IW_ENCODE_ALG_NONE) {
-		memcpy(sec.keys[idx], ext->key, ext->key_len);
-		sec.key_sizes[idx] = ext->key_len;
+		int key_len = clamp_val(ext->key_len, 0, SCM_KEY_LEN);
+
+		memcpy(sec.keys[idx], ext->key, key_len);
+		sec.key_sizes[idx] = key_len;
 		sec.flags |= (1 << idx);
 		if (ext->alg == IW_ENCODE_ALG_WEP) {
 			sec.encode_alg[idx] = SEC_ALG_WEP;

commit bc1355f10b2acddee56680f567edaa0e4a18db44
Author: Jan Glauber <jglauber@digitalocean.com>
Date:   Wed Mar 17 15:04:39 2021 +0100

    md: Fix missing unused status line of /proc/mdstat
    
    commit 7abfabaf5f805f5171d133ce6af9b65ab766e76a upstream.
    
    Reading /proc/mdstat with a read buffer size that would not
    fit the unused status line in the first read will skip this
    line from the output.
    
    So 'dd if=/proc/mdstat bs=64 2>/dev/null' will not print something
    like: unused devices: <none>
    
    Don't return NULL immediately in start() for v=2 but call
    show() once to print the status line also for multiple reads.
    
    Cc: stable@vger.kernel.org
    Fixes: 1f4aace60b0e ("fs/seq_file.c: simplify seq_file iteration code and interface")
    Signed-off-by: Jan Glauber <jglauber@digitalocean.com>
    Signed-off-by: Song Liu <songliubraving@fb.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/md/md.c b/drivers/md/md.c
index 5331a9e6a7f5..fae6a983ceee 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -7814,7 +7814,11 @@ static void *md_seq_start(struct seq_file *seq, loff_t *pos)
 	loff_t l = *pos;
 	struct mddev *mddev;
 
-	if (l >= 0x10000)
+	if (l == 0x10000) {
+		++*pos;
+		return (void *)2;
+	}
+	if (l > 0x10000)
 		return NULL;
 	if (!l--)
 		/* header */

commit 5db6e4c5c1284cec6720afe27f202a3dca697def
Author: Zhao Heming <heming.zhao@suse.com>
Date:   Sat Apr 3 11:01:25 2021 +0800

    md: md_open returns -EBUSY when entering racing area
    
    commit 6a4db2a60306eb65bfb14ccc9fde035b74a4b4e7 upstream.
    
    commit d3374825ce57 ("md: make devices disappear when they are no longer
    needed.") introduced protection between mddev creating & removing. The
    md_open shouldn't create mddev when all_mddevs list doesn't contain
    mddev. With currently code logic, there will be very easy to trigger
    soft lockup in non-preempt env.
    
    This patch changes md_open returning from -ERESTARTSYS to -EBUSY, which
    will break the infinitely retry when md_open enter racing area.
    
    This patch is partly fix soft lockup issue, full fix needs mddev_find
    is split into two functions: mddev_find & mddev_find_or_alloc. And
    md_open should call new mddev_find (it only does searching job).
    
    For more detail, please refer with Christoph's "split mddev_find" patch
    in later commits.

diff --git a/drivers/md/md.c b/drivers/md/md.c
index c74d5218cfd8..5331a9e6a7f5 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -7481,8 +7481,7 @@ static int md_open(struct block_device *bdev, fmode_t mode)
 		/* Wait until bdev->bd_disk is definitely gone */
 		if (work_pending(&mddev->del_work))
 			flush_workqueue(md_misc_wq);
-		/* Then retry the open from the top */
-		return -ERESTARTSYS;
+		return -EBUSY;
 	}
 	BUG_ON(mddev != bdev->bd_disk->private_data);
 

commit 587241f748424a7532b1cd9536b2128a47ee54a1
Author: Christoph Hellwig <hch@lst.de>
Date:   Sat Apr 3 18:15:28 2021 +0200

    md: factor out a mddev_find_locked helper from mddev_find
    
    commit 8b57251f9a91f5e5a599de7549915d2d226cc3af upstream.
    
    Factor out a self-contained helper to just lookup a mddev by the dev_t
    "unit".
    
    Cc: stable@vger.kernel.org
    Reviewed-by: Heming Zhao <heming.zhao@suse.com>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Song Liu <song@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/md/md.c b/drivers/md/md.c
index 00c006f19d52..c74d5218cfd8 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -583,6 +583,17 @@ void mddev_init(struct mddev *mddev)
 }
 EXPORT_SYMBOL_GPL(mddev_init);
 
+static struct mddev *mddev_find_locked(dev_t unit)
+{
+	struct mddev *mddev;
+
+	list_for_each_entry(mddev, &all_mddevs, all_mddevs)
+		if (mddev->unit == unit)
+			return mddev;
+
+	return NULL;
+}
+
 static struct mddev *mddev_find(dev_t unit)
 {
 	struct mddev *mddev;
@@ -610,13 +621,13 @@ static struct mddev *mddev_find_or_alloc(dev_t unit)
 	spin_lock(&all_mddevs_lock);
 
 	if (unit) {
-		list_for_each_entry(mddev, &all_mddevs, all_mddevs)
-			if (mddev->unit == unit) {
-				mddev_get(mddev);
-				spin_unlock(&all_mddevs_lock);
-				kfree(new);
-				return mddev;
-			}
+		mddev = mddev_find_locked(unit);
+		if (mddev) {
+			mddev_get(mddev);
+			spin_unlock(&all_mddevs_lock);
+			kfree(new);
+			return mddev;
+		}
 
 		if (new) {
 			list_add(&new->all_mddevs, &all_mddevs);
@@ -642,12 +653,7 @@ static struct mddev *mddev_find_or_alloc(dev_t unit)
 				return NULL;
 			}
 
-			is_free = 1;
-			list_for_each_entry(mddev, &all_mddevs, all_mddevs)
-				if (mddev->unit == dev) {
-					is_free = 0;
-					break;
-				}
+			is_free = !mddev_find_locked(dev);
 		}
 		new->unit = dev;
 		new->md_minor = MINOR(dev);

commit a61234356fcce492179427e5540bdce2abaa0191
Author: Christoph Hellwig <hch@lst.de>
Date:   Sat Apr 3 18:15:29 2021 +0200

    md: split mddev_find
    
    commit 65aa97c4d2bfd76677c211b9d03ef05a98c6d68e upstream.
    
    Split mddev_find into a simple mddev_find that just finds an existing
    mddev by the unit number, and a more complicated mddev_find that deals
    with find or allocating a mddev.
    
    This turns out to fix this bug reported by Zhao Heming.
    
    ----------------------------- snip ------------------------------
    commit d3374825ce57 ("md: make devices disappear when they are no longer
    needed.") introduced protection between mddev creating & removing. The
    md_open shouldn't create mddev when all_mddevs list doesn't contain
    mddev. With currently code logic, there will be very easy to trigger
    soft lockup in non-preempt env.

diff --git a/drivers/md/md.c b/drivers/md/md.c
index e8340ef4c659..00c006f19d52 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -584,6 +584,22 @@ void mddev_init(struct mddev *mddev)
 EXPORT_SYMBOL_GPL(mddev_init);
 
 static struct mddev *mddev_find(dev_t unit)
+{
+	struct mddev *mddev;
+
+	if (MAJOR(unit) != MD_MAJOR)
+		unit &= ~((1 << MdpMinorShift) - 1);
+
+	spin_lock(&all_mddevs_lock);
+	mddev = mddev_find_locked(unit);
+	if (mddev)
+		mddev_get(mddev);
+	spin_unlock(&all_mddevs_lock);
+
+	return mddev;
+}
+
+static struct mddev *mddev_find_or_alloc(dev_t unit)
 {
 	struct mddev *mddev, *new = NULL;
 
@@ -5302,7 +5318,7 @@ static int md_alloc(dev_t dev, char *name)
 	 * writing to /sys/module/md_mod/parameters/new_array.
 	 */
 	static DEFINE_MUTEX(disks_mutex);
-	struct mddev *mddev = mddev_find(dev);
+	struct mddev *mddev = mddev_find_or_alloc(dev);
 	struct gendisk *disk;
 	int partitioned;
 	int shift;
@@ -6155,11 +6171,9 @@ static void autorun_devices(int part)
 
 		md_probe(dev, NULL, NULL);
 		mddev = mddev_find(dev);
-		if (!mddev || !mddev->gendisk) {
-			if (mddev)
-				mddev_put(mddev);
+		if (!mddev)
 			break;
-		}
+
 		if (mddev_lock(mddev))
 			pr_warn("md: %s locked, cannot run\n", mdname(mddev));
 		else if (mddev->raid_disks || mddev->major_version

commit 121243301effabf451294a4a77a582f3925dafe3
Author: Heming Zhao <heming.zhao@suse.com>
Date:   Thu Apr 8 15:44:15 2021 +0800

    md-cluster: fix use-after-free issue when removing rdev
    
    commit f7c7a2f9a23e5b6e0f5251f29648d0238bb7757e upstream.
    
    md_kick_rdev_from_array will remove rdev, so we should
    use rdev_for_each_safe to search list.
    
    How to trigger:
    
    env: Two nodes on kvm-qemu x86_64 VMs (2C2G with 2 iscsi luns).
    
    ```
    node2=192.168.0.3
    
    for i in {1..20}; do
        echo ==== $i `date` ====;
    
        mdadm -Ss && ssh ${node2} "mdadm -Ss"
        wipefs -a /dev/sda /dev/sdb
    
        mdadm -CR /dev/md0 -b clustered -e 1.2 -n 2 -l 1 /dev/sda \
           /dev/sdb --assume-clean
        ssh ${node2} "mdadm -A /dev/md0 /dev/sda /dev/sdb"
        mdadm --wait /dev/md0
        ssh ${node2} "mdadm --wait /dev/md0"
    
        mdadm --manage /dev/md0 --fail /dev/sda --remove /dev/sda
        sleep 1
    done
    ```
    
    Crash stack:
    
    ```
    stack segment: 0000 [#1] SMP
    ... ...
    RIP: 0010:md_check_recovery+0x1e8/0x570 [md_mod]
    ... ...
    RSP: 0018:ffffb149807a7d68 EFLAGS: 00010207
    RAX: 0000000000000000 RBX: ffff9d494c180800 RCX: ffff9d490fc01e50
    RDX: fffff047c0ed8308 RSI: 0000000000000246 RDI: 0000000000000246
    RBP: 6b6b6b6b6b6b6b6b R08: ffff9d490fc01e40 R09: 0000000000000000
    R10: 0000000000000001 R11: 0000000000000001 R12: 0000000000000000
    R13: ffff9d494c180818 R14: ffff9d493399ef38 R15: ffff9d4933a1d800
    FS:  0000000000000000(0000) GS:ffff9d494f700000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007fe68cab9010 CR3: 000000004c6be001 CR4: 00000000003706e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
     raid1d+0x5c/0xd40 [raid1]
     ? finish_task_switch+0x75/0x2a0
     ? lock_timer_base+0x67/0x80
     ? try_to_del_timer_sync+0x4d/0x80
     ? del_timer_sync+0x41/0x50
     ? schedule_timeout+0x254/0x2d0
     ? md_start_sync+0xe0/0xe0 [md_mod]
     ? md_thread+0x127/0x160 [md_mod]
     md_thread+0x127/0x160 [md_mod]
     ? wait_woken+0x80/0x80
     kthread+0x10d/0x130
     ? kthread_park+0xa0/0xa0
     ret_from_fork+0x1f/0x40
    ```
    
    Fixes: dbb64f8635f5d ("md-cluster: Fix adding of new disk with new reload code")
    Fixes: 659b254fa7392 ("md-cluster: remove a disk asynchronously from cluster environment")
    Cc: stable@vger.kernel.org
    Reviewed-by: Gang He <ghe@suse.com>
    Signed-off-by: Heming Zhao <heming.zhao@suse.com>
    Signed-off-by: Song Liu <song@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/md/md.c b/drivers/md/md.c
index 09f0d8e70b70..e8340ef4c659 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -8883,11 +8883,11 @@ void md_check_recovery(struct mddev *mddev)
 		}
 
 		if (mddev_is_clustered(mddev)) {
-			struct md_rdev *rdev;
+			struct md_rdev *rdev, *tmp;
 			/* kick the device if another node issued a
 			 * remove disk.
 			 */
-			rdev_for_each(rdev, mddev) {
+			rdev_for_each_safe(rdev, tmp, mddev) {
 				if (test_and_clear_bit(ClusterRemove, &rdev->flags) &&
 						rdev->raid_disk < 0)
 					md_kick_rdev_from_array(rdev);
@@ -9187,7 +9187,7 @@ static int __init md_init(void)
 static void check_sb_changes(struct mddev *mddev, struct md_rdev *rdev)
 {
 	struct mdp_superblock_1 *sb = page_address(rdev->sb_page);
-	struct md_rdev *rdev2;
+	struct md_rdev *rdev2, *tmp;
 	int role, ret;
 	char b[BDEVNAME_SIZE];
 
@@ -9204,7 +9204,7 @@ static void check_sb_changes(struct mddev *mddev, struct md_rdev *rdev)
 	}
 
 	/* Check for change of roles in the active devices */
-	rdev_for_each(rdev2, mddev) {
+	rdev_for_each_safe(rdev2, tmp, mddev) {
 		if (test_bit(Faulty, &rdev2->flags))
 			continue;
 

commit 945eec9f2aa1510f625b599cae66000f8b091211
Author: Sudhakar Panneerselvam <sudhakar.panneerselvam@oracle.com>
Date:   Tue Apr 13 04:08:29 2021 +0000

    md/bitmap: wait for external bitmap writes to complete during tear down
    
    commit 404a8ef512587b2460107d3272c17a89aef75edf upstream.
    
    NULL pointer dereference was observed in super_written() when it tries
    to access the mddev structure.
    
    [The below stack trace is from an older kernel, but the problem described
    in this patch applies to the mainline kernel.]
    
    [ 1194.474861] task: ffff8fdd20858000 task.stack: ffffb99d40790000
    [ 1194.488000] RIP: 0010:super_written+0x29/0xe1
    [ 1194.499688] RSP: 0018:ffff8ffb7fcc3c78 EFLAGS: 00010046
    [ 1194.512477] RAX: 0000000000000000 RBX: ffff8ffb7bf4a000 RCX: ffff8ffb78991048
    [ 1194.527325] RDX: 0000000000000001 RSI: 0000000000000000 RDI: ffff8ffb56b8a200
    [ 1194.542576] RBP: ffff8ffb7fcc3c90 R08: 000000000000000b R09: 0000000000000000
    [ 1194.558001] R10: ffff8ffb56b8a298 R11: 0000000000000000 R12: ffff8ffb56b8a200
    [ 1194.573070] R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
    [ 1194.588117] FS:  0000000000000000(0000) GS:ffff8ffb7fcc0000(0000) knlGS:0000000000000000
    [ 1194.604264] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 1194.617375] CR2: 00000000000002b8 CR3: 00000021e040a002 CR4: 00000000007606e0
    [ 1194.632327] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    [ 1194.647865] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    [ 1194.663316] PKRU: 55555554
    [ 1194.674090] Call Trace:
    [ 1194.683735]  <IRQ>
    [ 1194.692948]  bio_endio+0xae/0x135
    [ 1194.703580]  blk_update_request+0xad/0x2fa
    [ 1194.714990]  blk_update_bidi_request+0x20/0x72
    [ 1194.726578]  __blk_end_bidi_request+0x2c/0x4d
    [ 1194.738373]  __blk_end_request_all+0x31/0x49
    [ 1194.749344]  blk_flush_complete_seq+0x377/0x383
    [ 1194.761550]  flush_end_io+0x1dd/0x2a7
    [ 1194.772910]  blk_finish_request+0x9f/0x13c
    [ 1194.784544]  scsi_end_request+0x180/0x25c
    [ 1194.796149]  scsi_io_completion+0xc8/0x610
    [ 1194.807503]  scsi_finish_command+0xdc/0x125
    [ 1194.818897]  scsi_softirq_done+0x81/0xde
    [ 1194.830062]  blk_done_softirq+0xa4/0xcc
    [ 1194.841008]  __do_softirq+0xd9/0x29f
    [ 1194.851257]  irq_exit+0xe6/0xeb
    [ 1194.861290]  do_IRQ+0x59/0xe3
    [ 1194.871060]  common_interrupt+0x1c6/0x382
    [ 1194.881988]  </IRQ>
    [ 1194.890646] RIP: 0010:cpuidle_enter_state+0xdd/0x2a5
    [ 1194.902532] RSP: 0018:ffffb99d40793e68 EFLAGS: 00000246 ORIG_RAX: ffffffffffffff43
    [ 1194.917317] RAX: ffff8ffb7fce27c0 RBX: ffff8ffb7fced800 RCX: 000000000000001f
    [ 1194.932056] RDX: 0000000000000000 RSI: 0000000000000004 RDI: 0000000000000000
    [ 1194.946428] RBP: ffffb99d40793ea0 R08: 0000000000000004 R09: 0000000000002ed2
    [ 1194.960508] R10: 0000000000002664 R11: 0000000000000018 R12: 0000000000000003
    [ 1194.974454] R13: 000000000000000b R14: ffffffff925715a0 R15: 0000011610120d5a
    [ 1194.988607]  ? cpuidle_enter_state+0xcc/0x2a5
    [ 1194.999077]  cpuidle_enter+0x17/0x19
    [ 1195.008395]  call_cpuidle+0x23/0x3a
    [ 1195.017718]  do_idle+0x172/0x1d5
    [ 1195.026358]  cpu_startup_entry+0x73/0x75
    [ 1195.035769]  start_secondary+0x1b9/0x20b
    [ 1195.044894]  secondary_startup_64+0xa5/0xa5
    [ 1195.084921] RIP: super_written+0x29/0xe1 RSP: ffff8ffb7fcc3c78
    [ 1195.096354] CR2: 00000000000002b8
    
    bio in the above stack is a bitmap write whose completion is invoked after
    the tear down sequence sets the mddev structure to NULL in rdev.
    
    During tear down, there is an attempt to flush the bitmap writes, but for
    external bitmaps, there is no explicit wait for all the bitmap writes to
    complete. For instance, md_bitmap_flush() is called to flush the bitmap
    writes, but the last call to md_bitmap_daemon_work() in md_bitmap_flush()
    could generate new bitmap writes for which there is no explicit wait to
    complete those writes. The call to md_bitmap_update_sb() will return
    simply for external bitmaps and the follow-up call to md_update_sb() is
    conditional and may not get called for external bitmaps. This results in a
    kernel panic when the completion routine, super_written() is called which
    tries to reference mddev in the rdev that has been set to
    NULL(in unbind_rdev_from_array() by tear down sequence).
    
    The solution is to call md_super_wait() for external bitmaps after the
    last call to md_bitmap_daemon_work() in md_bitmap_flush() to ensure there
    are no pending bitmap writes before proceeding with the tear down.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Sudhakar Panneerselvam <sudhakar.panneerselvam@oracle.com>
    Reviewed-by: Zhao Heming <heming.zhao@suse.com>
    Signed-off-by: Song Liu <song@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c
index 503f5e06fa86..e79d2aa2372f 100644
--- a/drivers/md/md-bitmap.c
+++ b/drivers/md/md-bitmap.c
@@ -1725,6 +1725,8 @@ void md_bitmap_flush(struct mddev *mddev)
 	md_bitmap_daemon_work(mddev);
 	bitmap->daemon_lastrun -= sleep;
 	md_bitmap_daemon_work(mddev);
+	if (mddev->bitmap_info.external)
+		md_super_wait(mddev);
 	md_bitmap_update_sb(bitmap);
 }
 

commit 0bd7540ac19018cbb4ce1b02d07c9d0f1c155430
Author: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Date:   Fri Apr 2 21:17:42 2021 +0900

    misc: vmw_vmci: explicitly initialize vmci_datagram payload
    
    commit b2192cfeba8481224da0a4ec3b4a7ccd80b1623b upstream.
    
    KMSAN complains that vmci_check_host_caps() left the payload part of
    check_msg uninitialized.
    
      =====================================================
      BUG: KMSAN: uninit-value in kmsan_check_memory+0xd/0x10
      CPU: 1 PID: 1 Comm: swapper/0 Tainted: G    B             5.11.0-rc7+ #4
      Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 02/27/2020
      Call Trace:
       dump_stack+0x21c/0x280
       kmsan_report+0xfb/0x1e0
       kmsan_internal_check_memory+0x202/0x520
       kmsan_check_memory+0xd/0x10
       iowrite8_rep+0x86/0x380
       vmci_guest_probe_device+0xf0b/0x1e70
       pci_device_probe+0xab3/0xe70
       really_probe+0xd16/0x24d0
       driver_probe_device+0x29d/0x3a0
       device_driver_attach+0x25a/0x490
       __driver_attach+0x78c/0x840
       bus_for_each_dev+0x210/0x340
       driver_attach+0x89/0xb0
       bus_add_driver+0x677/0xc40
       driver_register+0x485/0x8e0
       __pci_register_driver+0x1ff/0x350
       vmci_guest_init+0x3e/0x41
       vmci_drv_init+0x1d6/0x43f
       do_one_initcall+0x39c/0x9a0
       do_initcall_level+0x1d7/0x259
       do_initcalls+0x127/0x1cb
       do_basic_setup+0x33/0x36
       kernel_init_freeable+0x29a/0x3ed
       kernel_init+0x1f/0x840
       ret_from_fork+0x1f/0x30
    
      Uninit was created at:
       kmsan_internal_poison_shadow+0x5c/0xf0
       kmsan_slab_alloc+0x8d/0xe0
       kmem_cache_alloc+0x84f/0xe30
       vmci_guest_probe_device+0xd11/0x1e70
       pci_device_probe+0xab3/0xe70
       really_probe+0xd16/0x24d0
       driver_probe_device+0x29d/0x3a0
       device_driver_attach+0x25a/0x490
       __driver_attach+0x78c/0x840
       bus_for_each_dev+0x210/0x340
       driver_attach+0x89/0xb0
       bus_add_driver+0x677/0xc40
       driver_register+0x485/0x8e0
       __pci_register_driver+0x1ff/0x350
       vmci_guest_init+0x3e/0x41
       vmci_drv_init+0x1d6/0x43f
       do_one_initcall+0x39c/0x9a0
       do_initcall_level+0x1d7/0x259
       do_initcalls+0x127/0x1cb
       do_basic_setup+0x33/0x36
       kernel_init_freeable+0x29a/0x3ed
       kernel_init+0x1f/0x840
       ret_from_fork+0x1f/0x30
    
      Bytes 28-31 of 36 are uninitialized
      Memory access of size 36 starts at ffff8881675e5f00
      =====================================================
    
    Fixes: 1f166439917b69d3 ("VMCI: guest side driver implementation.")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Link: https://lore.kernel.org/r/20210402121742.3917-2-penguin-kernel@I-love.SAKURA.ne.jp
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/misc/vmw_vmci/vmci_guest.c b/drivers/misc/vmw_vmci/vmci_guest.c
index dad5abee656e..dd20ea4ad0c4 100644
--- a/drivers/misc/vmw_vmci/vmci_guest.c
+++ b/drivers/misc/vmw_vmci/vmci_guest.c
@@ -169,7 +169,7 @@ static int vmci_check_host_caps(struct pci_dev *pdev)
 				VMCI_UTIL_NUM_RESOURCES * sizeof(u32);
 	struct vmci_datagram *check_msg;
 
-	check_msg = kmalloc(msg_size, GFP_KERNEL);
+	check_msg = kzalloc(msg_size, GFP_KERNEL);
 	if (!check_msg) {
 		dev_err(&pdev->dev, "%s: Insufficient memory\n", __func__);
 		return -ENOMEM;

commit 9c255b0501950231d0e96fd7bbb2bc6d1d4830fd
Author: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Date:   Fri Apr 2 21:17:41 2021 +0900

    misc: vmw_vmci: explicitly initialize vmci_notify_bm_set_msg struct
    
    commit 376565b9717c30cd58ad33860fa42697615fa2e4 upstream.
    
    KMSAN complains that the vmci_use_ppn64() == false path in
    vmci_dbell_register_notification_bitmap() left upper 32bits of
    bitmap_set_msg.bitmap_ppn64 member uninitialized.
    
      =====================================================
      BUG: KMSAN: uninit-value in kmsan_check_memory+0xd/0x10
      CPU: 1 PID: 1 Comm: swapper/0 Not tainted 5.11.0-rc7+ #4
      Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 02/27/2020
      Call Trace:
       dump_stack+0x21c/0x280
       kmsan_report+0xfb/0x1e0
       kmsan_internal_check_memory+0x484/0x520
       kmsan_check_memory+0xd/0x10
       iowrite8_rep+0x86/0x380
       vmci_send_datagram+0x150/0x280
       vmci_dbell_register_notification_bitmap+0x133/0x1e0
       vmci_guest_probe_device+0xcab/0x1e70
       pci_device_probe+0xab3/0xe70
       really_probe+0xd16/0x24d0
       driver_probe_device+0x29d/0x3a0
       device_driver_attach+0x25a/0x490
       __driver_attach+0x78c/0x840
       bus_for_each_dev+0x210/0x340
       driver_attach+0x89/0xb0
       bus_add_driver+0x677/0xc40
       driver_register+0x485/0x8e0
       __pci_register_driver+0x1ff/0x350
       vmci_guest_init+0x3e/0x41
       vmci_drv_init+0x1d6/0x43f
       do_one_initcall+0x39c/0x9a0
       do_initcall_level+0x1d7/0x259
       do_initcalls+0x127/0x1cb
       do_basic_setup+0x33/0x36
       kernel_init_freeable+0x29a/0x3ed
       kernel_init+0x1f/0x840
       ret_from_fork+0x1f/0x30
    
      Local variable ----bitmap_set_msg@vmci_dbell_register_notification_bitmap created at:
       vmci_dbell_register_notification_bitmap+0x50/0x1e0
       vmci_dbell_register_notification_bitmap+0x50/0x1e0
    
      Bytes 28-31 of 32 are uninitialized
      Memory access of size 32 starts at ffff88810098f570
      =====================================================
    
    Fixes: 83e2ec765be03e8a ("VMCI: doorbell implementation.")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Link: https://lore.kernel.org/r/20210402121742.3917-1-penguin-kernel@I-love.SAKURA.ne.jp
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/misc/vmw_vmci/vmci_doorbell.c b/drivers/misc/vmw_vmci/vmci_doorbell.c
index f005206d9033..4581210349d2 100644
--- a/drivers/misc/vmw_vmci/vmci_doorbell.c
+++ b/drivers/misc/vmw_vmci/vmci_doorbell.c
@@ -334,7 +334,7 @@ int vmci_dbell_host_context_notify(u32 src_cid, struct vmci_handle handle)
 bool vmci_dbell_register_notification_bitmap(u32 bitmap_ppn)
 {
 	int result;
-	struct vmci_notify_bm_set_msg bitmap_set_msg;
+	struct vmci_notify_bm_set_msg bitmap_set_msg = { };
 
 	bitmap_set_msg.hdr.dst = vmci_make_handle(VMCI_HYPERVISOR_CONTEXT_ID,
 						  VMCI_SET_NOTIFY_BITMAP);

commit b1f664901d73e56fd385b1f875e482e7fc309207
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Wed Feb 17 11:24:59 2021 +0100

    misc: lis3lv02d: Fix false-positive WARN on various HP models
    
    commit 3641762c1c9c7cfd84a7061a0a73054f09b412e3 upstream.
    
    Before this commit lis3lv02d_get_pwron_wait() had a WARN_ONCE() to catch
    a potential divide by 0. WARN macros should only be used to catch internal
    kernel bugs and that is not the case here. We have been receiving a lot of
    bug reports about kernel backtraces caused by this WARN.
    
    The div value being checked comes from the lis3->odrs[] array. Which
    is sized to be a power-of-2 matching the number of bits in lis3->odr_mask.
    
    The only lis3 model where this array is not entirely filled with non zero
    values. IOW the only model where we can hit the div == 0 check is the
    3dc ("8 bits 3DC sensor") model:
    
    int lis3_3dc_rates[16] = {0, 1, 10, 25, 50, 100, 200, 400, 1600, 5000};
    
    Note the 0 value at index 0, according to the datasheet an odr index of 0
    means "Power-down mode". HP typically uses a lis3 accelerometer for HDD
    fall protection. What I believe is happening here is that on newer
    HP devices, which only contain a SDD, the BIOS is leaving the lis3 device
    powered-down since it is not used for HDD fall protection.
    
    Note that the lis3_3dc_rates array initializer only specifies 10 values,
    which matches the datasheet. So it also contains 6 zero values at the end.
    
    Replace the WARN with a normal check, which treats an odr index of 0
    as power-down and uses a normal dev_err() to report the error in case
    odr index point past the initialized part of the array.
    
    Fixes: 1510dd5954be ("lis3lv02d: avoid divide by zero due to unchecked")
    Cc: stable@vger.kernel.org
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=785814
    BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1817027
    BugLink: https://bugs.centos.org/view.php?id=10720
    Link: https://lore.kernel.org/r/20210217102501.31758-1-hdegoede@redhat.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/misc/lis3lv02d/lis3lv02d.c b/drivers/misc/lis3lv02d/lis3lv02d.c
index e9bb1cfa6a7a..21ac34b38395 100644
--- a/drivers/misc/lis3lv02d/lis3lv02d.c
+++ b/drivers/misc/lis3lv02d/lis3lv02d.c
@@ -221,7 +221,7 @@ static int lis3_3dc_rates[16] = {0, 1, 10, 25, 50, 100, 200, 400, 1600, 5000};
 static int lis3_3dlh_rates[4] = {50, 100, 400, 1000};
 
 /* ODR is Output Data Rate */
-static int lis3lv02d_get_odr(struct lis3lv02d *lis3)
+static int lis3lv02d_get_odr_index(struct lis3lv02d *lis3)
 {
 	u8 ctrl;
 	int shift;
@@ -229,15 +229,23 @@ static int lis3lv02d_get_odr(struct lis3lv02d *lis3)
 	lis3->read(lis3, CTRL_REG1, &ctrl);
 	ctrl &= lis3->odr_mask;
 	shift = ffs(lis3->odr_mask) - 1;
-	return lis3->odrs[(ctrl >> shift)];
+	return (ctrl >> shift);
 }
 
 static int lis3lv02d_get_pwron_wait(struct lis3lv02d *lis3)
 {
-	int div = lis3lv02d_get_odr(lis3);
+	int odr_idx = lis3lv02d_get_odr_index(lis3);
+	int div = lis3->odrs[odr_idx];
 
-	if (WARN_ONCE(div == 0, "device returned spurious data"))
+	if (div == 0) {
+		if (odr_idx == 0) {
+			/* Power-down mode, not sampling no need to sleep */
+			return 0;
+		}
+
+		dev_err(&lis3->pdev->dev, "Error unknown odrs-index: %d\n", odr_idx);
 		return -ENXIO;
+	}
 
 	/* LIS3 power on delay is quite long */
 	msleep(lis3->pwron_delay / div);
@@ -820,9 +828,12 @@ static ssize_t lis3lv02d_rate_show(struct device *dev,
 			struct device_attribute *attr, char *buf)
 {
 	struct lis3lv02d *lis3 = dev_get_drvdata(dev);
+	int odr_idx;
 
 	lis3lv02d_sysfs_poweron(lis3);
-	return sprintf(buf, "%d\n", lis3lv02d_get_odr(lis3));
+
+	odr_idx = lis3lv02d_get_odr_index(lis3);
+	return sprintf(buf, "%d\n", lis3->odrs[odr_idx]);
 }
 
 static ssize_t lis3lv02d_rate_set(struct device *dev,

commit a2a3e7e746e1c12bc37675983536cebcf4651162
Author: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Date:   Sun Mar 21 18:29:56 2021 +0000

    iio:accel:adis16201: Fix wrong axis assignment that prevents loading
    
    commit 4e102429f3dc62dce546f6107e34a4284634196d upstream.
    
    Whilst running some basic tests as part of writing up the dt-bindings for
    this driver (to follow), it became clear it doesn't actually load
    currently.
    
    iio iio:device1: tried to double register : in_incli_x_index
    adis16201 spi0.0: Failed to create buffer sysfs interfaces
    adis16201: probe of spi0.0 failed with error -16
    
    Looks like a cut and paste / update bug.  Fixes tag obviously not accurate
    but we don't want to bother carry thing back to before the driver moved
    out of staging.
    
    Fixes: 591298e54cea ("Staging: iio: accel: adis16201: Move adis16201 driver out of staging")
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Cc: <Stable@vger.kernel.org>
    Cc: Himanshu Jha <himanshujha199640@gmail.com>
    Cc: Nuno Sá <nuno.sa@analog.com>
    Reviewed-by: Alexandru Ardelean <ardeleanalex@gmail.com>
    Link: https://lore.kernel.org/r/20210321182956.844652-1-jic23@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/iio/accel/adis16201.c b/drivers/iio/accel/adis16201.c
index 4c1d482ea73a..94a80f8fdd10 100644
--- a/drivers/iio/accel/adis16201.c
+++ b/drivers/iio/accel/adis16201.c
@@ -216,7 +216,7 @@ static const struct iio_chan_spec adis16201_channels[] = {
 	ADIS_AUX_ADC_CHAN(ADIS16201_AUX_ADC_REG, ADIS16201_SCAN_AUX_ADC, 0, 12),
 	ADIS_INCLI_CHAN(X, ADIS16201_XINCL_OUT_REG, ADIS16201_SCAN_INCLI_X,
 			BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14),
-	ADIS_INCLI_CHAN(X, ADIS16201_YINCL_OUT_REG, ADIS16201_SCAN_INCLI_Y,
+	ADIS_INCLI_CHAN(Y, ADIS16201_YINCL_OUT_REG, ADIS16201_SCAN_INCLI_Y,
 			BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14),
 	IIO_CHAN_SOFT_TIMESTAMP(7)
 };

commit 4debcab77d4b4422817f255d5a65839d3d60d1c0
Author: Maciej W. Rozycki <macro@orcam.me.uk>
Date:   Wed Mar 10 13:03:09 2021 +0100

    FDDI: defxx: Bail out gracefully with unassigned PCI resource for CSR
    
    commit f626ca682912fab55dff15469ce893ae16b65c7e upstream.
    
    Recent versions of the PCI Express specification have deprecated support
    for I/O transactions and actually some PCIe host bridges, such as Power
    Systems Host Bridge 4 (PHB4), do not implement them.
    
    For those systems the PCI BARs that request a mapping in the I/O space
    have the length recorded in the corresponding PCI resource set to zero,
    which makes it unassigned:
    
    # lspci -s 0031:02:04.0 -v
    0031:02:04.0 FDDI network controller: Digital Equipment Corporation PCI-to-PDQ Interface Chip [PFI] FDDI (DEFPA) (rev 02)
            Subsystem: Digital Equipment Corporation FDDIcontroller/PCI (DEFPA)
            Flags: bus master, medium devsel, latency 136, IRQ 57, NUMA node 8
            Memory at 620c080020000 (32-bit, non-prefetchable) [size=128]
            I/O ports at <unassigned> [disabled]
            Memory at 620c080030000 (32-bit, non-prefetchable) [size=64K]
            Capabilities: [50] Power Management version 2
            Kernel driver in use: defxx
            Kernel modules: defxx
    
    #
    
    Regardless the driver goes ahead and requests it (here observed with a
    Raptor Talos II POWER9 system), resulting in an odd /proc/ioport entry:
    
    # cat /proc/ioports
    00000000-ffffffffffffffff : 0031:02:04.0
    #
    
    Furthermore, the system gets confused as the driver actually continues
    and pokes at those locations, causing a flood of messages being output
    to the system console by the underlying system firmware, like:
    
    defxx: v1.11 2014/07/01  Lawrence V. Stefani and others
    defxx 0031:02:04.0: enabling device (0140 -> 0142)
    LPC[000]: Got SYNC no-response error. Error address reg: 0xd0010000
    IPMI: dropping non severe PEL event
    LPC[000]: Got SYNC no-response error. Error address reg: 0xd0010014
    IPMI: dropping non severe PEL event
    LPC[000]: Got SYNC no-response error. Error address reg: 0xd0010014
    IPMI: dropping non severe PEL event
    
    and so on and so on (possibly intermixed actually, as there's no locking
    between the kernel and the firmware in console port access with this
    particular system, but cleaned up above for clarity), and once some 10k
    of such pairs of the latter two messages have been produced an interace
    eventually shows up in a useless state:
    
    0031:02:04.0: DEFPA at I/O addr = 0x0, IRQ = 57, Hardware addr = 00-00-00-00-00-00
    
    This was not expected to happen as resource handling was added to the
    driver a while ago, because it was not known at that time that a PCI
    system would be possible that cannot assign port I/O resources, and
    oddly enough `request_region' does not fail, which would have caught it.
    
    Correct the problem then by checking for the length of zero for the CSR
    resource and bail out gracefully refusing to register an interface if
    that turns out to be the case, producing messages like:
    
    defxx: v1.11 2014/07/01  Lawrence V. Stefani and others
    0031:02:04.0: Cannot use I/O, no address set, aborting
    0031:02:04.0: Recompile driver with "CONFIG_DEFXX_MMIO=y"
    
    Keep the original check for the EISA MMIO resource as implemented,
    because in that case the length is hardwired to 0x400 as a consequence
    of how the compare/mask address decoding works in the ESIC chip and it
    is only the base address that is set to zero if MMIO has been disabled
    for the adapter in EISA configuration, which in turn could be a valid
    bus address in a legacy-free system implementing PCI, especially for
    port I/O.
    
    Where the EISA MMIO resource has been disabled for the adapter in EISA
    configuration this arrangement keeps producing messages like:
    
    eisa 00:05: EISA: slot 5: DEC3002 detected
    defxx: v1.11 2014/07/01  Lawrence V. Stefani and others
    00:05: Cannot use MMIO, no address set, aborting
    00:05: Recompile driver with "CONFIG_DEFXX_MMIO=n"
    00:05: Or run ECU and set adapter's MMIO location
    
    with the last two lines now swapped for easier handling in the driver.
    
    There is no need to check for and catch the case of a port I/O resource
    not having been assigned for EISA as the adapter uses the slot-specific
    I/O space, which gets assigned by how EISA has been specified and maps
    directly to the particular slot an option card has been placed in.  And
    the EISA variant of the adapter has additional registers that are only
    accessible via the port I/O space anyway.
    
    While at it factor out the error message calls into helpers and fix an
    argument order bug with the `pr_err' call now in `dfx_register_res_err'.
    
    Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk>
    Fixes: 4d0438e56a8f ("defxx: Clean up DEFEA resource management")
    Cc: stable@vger.kernel.org # v3.19+
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/fddi/defxx.c b/drivers/net/fddi/defxx.c
index 61fceee73c1b..3b48c890540a 100644
--- a/drivers/net/fddi/defxx.c
+++ b/drivers/net/fddi/defxx.c
@@ -495,6 +495,25 @@ static const struct net_device_ops dfx_netdev_ops = {
 	.ndo_set_mac_address	= dfx_ctl_set_mac_address,
 };
 
+static void dfx_register_res_alloc_err(const char *print_name, bool mmio,
+				       bool eisa)
+{
+	pr_err("%s: Cannot use %s, no address set, aborting\n",
+	       print_name, mmio ? "MMIO" : "I/O");
+	pr_err("%s: Recompile driver with \"CONFIG_DEFXX_MMIO=%c\"\n",
+	       print_name, mmio ? 'n' : 'y');
+	if (eisa && mmio)
+		pr_err("%s: Or run ECU and set adapter's MMIO location\n",
+		       print_name);
+}
+
+static void dfx_register_res_err(const char *print_name, bool mmio,
+				 unsigned long start, unsigned long len)
+{
+	pr_err("%s: Cannot reserve %s resource 0x%lx @ 0x%lx, aborting\n",
+	       print_name, mmio ? "MMIO" : "I/O", len, start);
+}
+
 /*
  * ================
  * = dfx_register =
@@ -568,15 +587,12 @@ static int dfx_register(struct device *bdev)
 	dev_set_drvdata(bdev, dev);
 
 	dfx_get_bars(bdev, bar_start, bar_len);
-	if (dfx_bus_eisa && dfx_use_mmio && bar_start[0] == 0) {
-		pr_err("%s: Cannot use MMIO, no address set, aborting\n",
-		       print_name);
-		pr_err("%s: Run ECU and set adapter's MMIO location\n",
-		       print_name);
-		pr_err("%s: Or recompile driver with \"CONFIG_DEFXX_MMIO=n\""
-		       "\n", print_name);
+	if (bar_len[0] == 0 ||
+	    (dfx_bus_eisa && dfx_use_mmio && bar_start[0] == 0)) {
+		dfx_register_res_alloc_err(print_name, dfx_use_mmio,
+					   dfx_bus_eisa);
 		err = -ENXIO;
-		goto err_out;
+		goto err_out_disable;
 	}
 
 	if (dfx_use_mmio)
@@ -585,18 +601,16 @@ static int dfx_register(struct device *bdev)
 	else
 		region = request_region(bar_start[0], bar_len[0], print_name);
 	if (!region) {
-		pr_err("%s: Cannot reserve %s resource 0x%lx @ 0x%lx, "
-		       "aborting\n", dfx_use_mmio ? "MMIO" : "I/O", print_name,
-		       (long)bar_len[0], (long)bar_start[0]);
+		dfx_register_res_err(print_name, dfx_use_mmio,
+				     bar_start[0], bar_len[0]);
 		err = -EBUSY;
 		goto err_out_disable;
 	}
 	if (bar_start[1] != 0) {
 		region = request_region(bar_start[1], bar_len[1], print_name);
 		if (!region) {
-			pr_err("%s: Cannot reserve I/O resource "
-			       "0x%lx @ 0x%lx, aborting\n", print_name,
-			       (long)bar_len[1], (long)bar_start[1]);
+			dfx_register_res_err(print_name, 0,
+					     bar_start[1], bar_len[1]);
 			err = -EBUSY;
 			goto err_out_csr_region;
 		}
@@ -604,9 +618,8 @@ static int dfx_register(struct device *bdev)
 	if (bar_start[2] != 0) {
 		region = request_region(bar_start[2], bar_len[2], print_name);
 		if (!region) {
-			pr_err("%s: Cannot reserve I/O resource "
-			       "0x%lx @ 0x%lx, aborting\n", print_name,
-			       (long)bar_len[2], (long)bar_start[2]);
+			dfx_register_res_err(print_name, 0,
+					     bar_start[2], bar_len[2]);
 			err = -EBUSY;
 			goto err_out_bh_region;
 		}

commit 7bbbf337c585687999fe638659c727dc611c707d
Author: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
Date:   Tue Apr 13 20:12:33 2021 -0700

    MIPS: pci-rt2880: fix slot 0 configuration
    
    commit 8e98b697006d749d745d3b174168a877bb96c500 upstream.
    
    pci_fixup_irqs() used to call pcibios_map_irq on every PCI device, which
    for RT2880 included bus 0 slot 0. After pci_fixup_irqs() got removed,
    only slots/funcs with devices attached would be called. While arguably
    the right thing, that left no chance for this driver to ever initialize
    slot 0, effectively bricking PCI and USB on RT2880 devices such as the
    Belkin F5D8235-4 v1.
    
    Slot 0 configuration needs to happen after PCI bus enumeration, but
    before any device at slot 0x11 (func 0 or 1) is talked to. That was
    determined empirically by testing on a Belkin F5D8235-4 v1 device. A
    minimal BAR 0 config write followed by read, then setting slot 0
    PCI_COMMAND to MASTER | IO | MEMORY is all that seems to be required for
    proper functionality.
    
    Tested by ensuring that full- and high-speed USB devices get enumerated
    on the Belkin F5D8235-4 v1 (with an out of tree DTS file from OpenWrt).
    
    Fixes: 04c81c7293df ("MIPS: PCI: Replace pci_fixup_irqs() call with host bridge IRQ mapping hooks")
    Signed-off-by: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
    Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Cc: Tobias Wolf <dev-NTEO@vplace.de>
    Cc: <stable@vger.kernel.org> # v4.14+
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/mips/pci/pci-rt2880.c b/arch/mips/pci/pci-rt2880.c
index 711cdccdf65b..f7926a964441 100644
--- a/arch/mips/pci/pci-rt2880.c
+++ b/arch/mips/pci/pci-rt2880.c
@@ -183,7 +183,6 @@ static inline void rt2880_pci_write_u32(unsigned long reg, u32 val)
 
 int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
 {
-	u16 cmd;
 	int irq = -1;
 
 	if (dev->bus->number != 0)
@@ -191,8 +190,6 @@ int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
 
 	switch (PCI_SLOT(dev->devfn)) {
 	case 0x00:
-		rt2880_pci_write_u32(PCI_BASE_ADDRESS_0, 0x08000000);
-		(void) rt2880_pci_read_u32(PCI_BASE_ADDRESS_0);
 		break;
 	case 0x11:
 		irq = RT288X_CPU_IRQ_PCI;
@@ -204,16 +201,6 @@ int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
 		break;
 	}
 
-	pci_write_config_byte((struct pci_dev *) dev,
-		PCI_CACHE_LINE_SIZE, 0x14);
-	pci_write_config_byte((struct pci_dev *) dev, PCI_LATENCY_TIMER, 0xFF);
-	pci_read_config_word((struct pci_dev *) dev, PCI_COMMAND, &cmd);
-	cmd |= PCI_COMMAND_MASTER | PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
-		PCI_COMMAND_INVALIDATE | PCI_COMMAND_FAST_BACK |
-		PCI_COMMAND_SERR | PCI_COMMAND_WAIT | PCI_COMMAND_PARITY;
-	pci_write_config_word((struct pci_dev *) dev, PCI_COMMAND, cmd);
-	pci_write_config_byte((struct pci_dev *) dev, PCI_INTERRUPT_LINE,
-			      dev->irq);
 	return irq;
 }
 
@@ -252,6 +239,30 @@ static int rt288x_pci_probe(struct platform_device *pdev)
 
 int pcibios_plat_dev_init(struct pci_dev *dev)
 {
+	static bool slot0_init;
+
+	/*
+	 * Nobody seems to initialize slot 0, but this platform requires it, so
+	 * do it once when some other slot is being enabled. The PCI subsystem
+	 * should configure other slots properly, so no need to do anything
+	 * special for those.
+	 */
+	if (!slot0_init && dev->bus->number == 0) {
+		u16 cmd;
+		u32 bar0;
+
+		slot0_init = true;
+
+		pci_bus_write_config_dword(dev->bus, 0, PCI_BASE_ADDRESS_0,
+					   0x08000000);
+		pci_bus_read_config_dword(dev->bus, 0, PCI_BASE_ADDRESS_0,
+					  &bar0);
+
+		pci_bus_read_config_word(dev->bus, 0, PCI_COMMAND, &cmd);
+		cmd |= PCI_COMMAND_MASTER | PCI_COMMAND_IO | PCI_COMMAND_MEMORY;
+		pci_bus_write_config_word(dev->bus, 0, PCI_COMMAND, cmd);
+	}
+
 	return 0;
 }
 

commit 4a75a2460a55c435ade50b79cac0ceec0be00dea
Author: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
Date:   Sat Mar 6 20:17:24 2021 -0800

    MIPS: pci-mt7620: fix PLL lock check
    
    commit c15b99ae2ba9ea30da3c7cd4765b8a4707e530a6 upstream.
    
    Upstream a long-standing OpenWrt patch [0] that fixes MT7620 PCIe PLL
    lock check. The existing code checks the wrong register bit: PPLL_SW_SET
    is not defined in PPLL_CFG1 and bit 31 of PPLL_CFG1 is marked as reserved
    in the MT7620 Programming Guide. The correct bit to check for PLL lock
    is PPLL_LD (bit 23).
    
    Also reword the error message for clarity.
    
    Without this change it is unlikely that this driver ever worked with
    mainline kernel.
    
    [0]: https://lists.infradead.org/pipermail/lede-commits/2017-July/004441.html
    
    Signed-off-by: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
    Cc: John Crispin <john@phrozen.org>
    Cc: linux-mips@vger.kernel.org
    Cc: linux-mediatek@lists.infradead.org
    Cc: linux-kernel@vger.kernel.org
    Cc: stable@vger.kernel.org
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/mips/pci/pci-mt7620.c b/arch/mips/pci/pci-mt7620.c
index f6b77788124a..5ae11aeff4b7 100644
--- a/arch/mips/pci/pci-mt7620.c
+++ b/arch/mips/pci/pci-mt7620.c
@@ -33,6 +33,7 @@
 #define RALINK_GPIOMODE			0x60
 
 #define PPLL_CFG1			0x9c
+#define PPLL_LD				BIT(23)
 
 #define PPLL_DRV			0xa0
 #define PDRV_SW_SET			BIT(31)
@@ -242,8 +243,8 @@ static int mt7620_pci_hw_init(struct platform_device *pdev)
 	rt_sysc_m32(0, RALINK_PCIE0_CLK_EN, RALINK_CLKCFG1);
 	mdelay(100);
 
-	if (!(rt_sysc_r32(PPLL_CFG1) & PDRV_SW_SET)) {
-		dev_err(&pdev->dev, "MT7620 PPLL unlock\n");
+	if (!(rt_sysc_r32(PPLL_CFG1) & PPLL_LD)) {
+		dev_err(&pdev->dev, "pcie PLL not locked, aborting init\n");
 		reset_control_assert(rstpcie0);
 		rt_sysc_m32(RALINK_PCIE0_CLK_EN, 0, RALINK_CLKCFG1);
 		return -1;

commit 4eab768d0767a27a1cb03c93c204e0de7d9f648c
Author: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Date:   Fri Mar 12 12:02:30 2021 -0600

    ASoC: samsung: tm2_wm5110: check of of_parse return value
    
    commit d58970da324732686529655c21791cef0ee547c4 upstream.
    
    cppcheck warning:
    
    sound/soc/samsung/tm2_wm5110.c:605:6: style: Variable 'ret' is
    reassigned a value before the old one has been
    used. [redundantAssignment]
     ret = devm_snd_soc_register_component(dev, &tm2_component,
         ^
    sound/soc/samsung/tm2_wm5110.c:554:7: note: ret is assigned
      ret = of_parse_phandle_with_args(dev->of_node, "i2s-controller",
          ^
    sound/soc/samsung/tm2_wm5110.c:605:6: note: ret is overwritten
     ret = devm_snd_soc_register_component(dev, &tm2_component,
         ^
    
    The args is a stack variable, so it could have junk (uninitialized)
    therefore args.np could have a non-NULL and random value even though
    property was missing. Later could trigger invalid pointer dereference.
    
    There's no need to check for args.np because args.np won't be
    initialized on errors.
    
    Fixes: 8d1513cef51a ("ASoC: samsung: Add support for HDMI audio on TM2 board")
    Cc: <stable@vger.kernel.org>
    Suggested-by: Krzysztof Kozlowski <krzk@kernel.org>
    Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Reviewed-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
    Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Link: https://lore.kernel.org/r/20210312180231.2741-2-pierre-louis.bossart@linux.intel.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/soc/samsung/tm2_wm5110.c b/sound/soc/samsung/tm2_wm5110.c
index 43332c32d7e9..e5890485fc5e 100644
--- a/sound/soc/samsung/tm2_wm5110.c
+++ b/sound/soc/samsung/tm2_wm5110.c
@@ -541,7 +541,7 @@ static int tm2_probe(struct platform_device *pdev)
 
 		ret = of_parse_phandle_with_args(dev->of_node, "i2s-controller",
 						 cells_name, i, &args);
-		if (!args.np) {
+		if (ret) {
 			dev_err(dev, "i2s-controller property parse error: %d\n", i);
 			ret = -EINVAL;
 			goto dai_node_put;

commit 48fba458fe54cc2a980a05c13e6c19b8b2cfb610
Author: Or Cohen <orcohen@paloaltonetworks.com>
Date:   Tue May 4 10:16:46 2021 +0300

    net/nfc: fix use-after-free llcp_sock_bind/connect
    
    commit c61760e6940dd4039a7f5e84a6afc9cdbf4d82b6 upstream.
    
    Commits 8a4cd82d ("nfc: fix refcount leak in llcp_sock_connect()")
    and c33b1cc62 ("nfc: fix refcount leak in llcp_sock_bind()")
    fixed a refcount leak bug in bind/connect but introduced a
    use-after-free if the same local is assigned to 2 different sockets.
    
    This can be triggered by the following simple program:
        int sock1 = socket( AF_NFC, SOCK_STREAM, NFC_SOCKPROTO_LLCP );
        int sock2 = socket( AF_NFC, SOCK_STREAM, NFC_SOCKPROTO_LLCP );
        memset( &addr, 0, sizeof(struct sockaddr_nfc_llcp) );
        addr.sa_family = AF_NFC;
        addr.nfc_protocol = NFC_PROTO_NFC_DEP;
        bind( sock1, (struct sockaddr*) &addr, sizeof(struct sockaddr_nfc_llcp) )
        bind( sock2, (struct sockaddr*) &addr, sizeof(struct sockaddr_nfc_llcp) )
        close(sock1);
        close(sock2);
    
    Fix this by assigning NULL to llcp_sock->local after calling
    nfc_llcp_local_put.
    
    This addresses CVE-2021-23134.
    
    Reported-by: Or Cohen <orcohen@paloaltonetworks.com>
    Reported-by: Nadav Markus <nmarkus@paloaltonetworks.com>
    Fixes: c33b1cc62 ("nfc: fix refcount leak in llcp_sock_bind()")
    Signed-off-by: Or Cohen <orcohen@paloaltonetworks.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/nfc/llcp_sock.c b/net/nfc/llcp_sock.c
index bc269e83e1e5..59de4f54dd18 100644
--- a/net/nfc/llcp_sock.c
+++ b/net/nfc/llcp_sock.c
@@ -121,12 +121,14 @@ static int llcp_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
 					  GFP_KERNEL);
 	if (!llcp_sock->service_name) {
 		nfc_llcp_local_put(llcp_sock->local);
+		llcp_sock->local = NULL;
 		ret = -ENOMEM;
 		goto put_dev;
 	}
 	llcp_sock->ssap = nfc_llcp_get_sdp_ssap(local, llcp_sock);
 	if (llcp_sock->ssap == LLCP_SAP_MAX) {
 		nfc_llcp_local_put(llcp_sock->local);
+		llcp_sock->local = NULL;
 		kfree(llcp_sock->service_name);
 		llcp_sock->service_name = NULL;
 		ret = -EADDRINUSE;
@@ -721,6 +723,7 @@ static int llcp_sock_connect(struct socket *sock, struct sockaddr *_addr,
 	llcp_sock->ssap = nfc_llcp_get_local_ssap(local);
 	if (llcp_sock->ssap == LLCP_SAP_MAX) {
 		nfc_llcp_local_put(llcp_sock->local);
+		llcp_sock->local = NULL;
 		ret = -ENOMEM;
 		goto put_dev;
 	}
@@ -759,6 +762,7 @@ static int llcp_sock_connect(struct socket *sock, struct sockaddr *_addr,
 sock_unlink:
 	nfc_llcp_put_ssap(local, llcp_sock->ssap);
 	nfc_llcp_local_put(llcp_sock->local);
+	llcp_sock->local = NULL;
 
 	nfc_llcp_sock_unlink(&local->connecting_sockets, sk);
 	kfree(llcp_sock->service_name);

commit 35113c4c9fa7c970ff456982e381dc9e9594154a
Author: Lin Ma <linma@zju.edu.cn>
Date:   Mon Apr 12 19:17:57 2021 +0800

    bluetooth: eliminate the potential race condition when removing the HCI controller
    
    commit e2cb6b891ad2b8caa9131e3be70f45243df82a80 upstream.
    
    There is a possible race condition vulnerability between issuing a HCI
    command and removing the cont.  Specifically, functions hci_req_sync()
    and hci_dev_do_close() can race each other like below:
    
    thread-A in hci_req_sync()      |   thread-B in hci_dev_do_close()
                                    |   hci_req_sync_lock(hdev);
    test_bit(HCI_UP, &hdev->flags); |
    ...                             |   test_and_clear_bit(HCI_UP, &hdev->flags)
    hci_req_sync_lock(hdev);        |
                                    |
    In this commit we alter the sequence in function hci_req_sync(). Hence,
    the thread-A cannot issue th.
    
    Signed-off-by: Lin Ma <linma@zju.edu.cn>
    Cc: Marcel Holtmann <marcel@holtmann.org>
    Fixes: 7c6a329e4447 ("[Bluetooth] Fix regression from using default link policy")
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/bluetooth/hci_request.c b/net/bluetooth/hci_request.c
index a8ddd211e94c..76bd6b122724 100644
--- a/net/bluetooth/hci_request.c
+++ b/net/bluetooth/hci_request.c
@@ -271,12 +271,16 @@ int hci_req_sync(struct hci_dev *hdev, int (*req)(struct hci_request *req,
 {
 	int ret;
 
-	if (!test_bit(HCI_UP, &hdev->flags))
-		return -ENETDOWN;
-
 	/* Serialize all requests */
 	hci_req_sync_lock(hdev);
-	ret = __hci_req_sync(hdev, req, opt, timeout, hci_status);
+	/* check the state after obtaing the lock to protect the HCI_UP
+	 * against any races from hci_dev_do_close when the controller
+	 * gets removed.
+	 */
+	if (test_bit(HCI_UP, &hdev->flags))
+		ret = __hci_req_sync(hdev, req, opt, timeout, hci_status);
+	else
+		ret = -ENETDOWN;
 	hci_req_sync_unlock(hdev);
 
 	return ret;

commit 40fa36443db3ddb570e5e5f27c44d23d680f9d1b
Author: Taehee Yoo <ap420073@gmail.com>
Date:   Fri Feb 28 18:01:46 2020 +0000

    hsr: use netdev_err() instead of WARN_ONCE()
    
    commit 4b793acdca0050739b99ace6a8b9e7f717f57c6b upstream.
    
    When HSR interface is sending a frame, it finds a node with
    the destination ethernet address from the list.
    If there is no node, it calls WARN_ONCE().
    But, using WARN_ONCE() for this situation is a little bit overdoing.
    So, in this patch, the netdev_err() is used instead.
    
    Signed-off-by: Taehee Yoo <ap420073@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Cc: George Kennedy <george.kennedy@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/hsr/hsr_framereg.c b/net/hsr/hsr_framereg.c
index f5a3601948ca..37795502bb51 100644
--- a/net/hsr/hsr_framereg.c
+++ b/net/hsr/hsr_framereg.c
@@ -310,7 +310,8 @@ void hsr_addr_subst_dest(struct hsr_node *node_src, struct sk_buff *skb,
 
 	node_dst = find_node_by_AddrA(&port->hsr->node_db, eth_hdr(skb)->h_dest);
 	if (!node_dst) {
-		WARN_ONCE(1, "%s: Unknown node\n", __func__);
+		if (net_ratelimit())
+			netdev_err(skb->dev, "%s: Unknown node\n", __func__);
 		return;
 	}
 	if (port->type != node_dst->AddrB_port)

commit 75e26178e26f910f7f26c79c2824b726eecf0dfb
Author: Archie Pusaka <apusaka@chromium.org>
Date:   Mon Mar 22 14:03:11 2021 +0800

    Bluetooth: verify AMP hci_chan before amp_destroy
    
    commit 5c4c8c9544099bb9043a10a5318130a943e32fc3 upstream.
    
    hci_chan can be created in 2 places: hci_loglink_complete_evt() if
    it is an AMP hci_chan, or l2cap_conn_add() otherwise. In theory,
    Only AMP hci_chan should be removed by a call to
    hci_disconn_loglink_complete_evt(). However, the controller might mess
    up, call that function, and destroy an hci_chan which is not initiated
    by hci_loglink_complete_evt().
    
    This patch adds a verification that the destroyed hci_chan must have
    been init'd by hci_loglink_complete_evt().
    
    Example crash call trace:
    Call Trace:
     __dump_stack lib/dump_stack.c:77 [inline]
     dump_stack+0xe3/0x144 lib/dump_stack.c:118
     print_address_description+0x67/0x22a mm/kasan/report.c:256
     kasan_report_error mm/kasan/report.c:354 [inline]
     kasan_report mm/kasan/report.c:412 [inline]
     kasan_report+0x251/0x28f mm/kasan/report.c:396
     hci_send_acl+0x3b/0x56e net/bluetooth/hci_core.c:4072
     l2cap_send_cmd+0x5af/0x5c2 net/bluetooth/l2cap_core.c:877
     l2cap_send_move_chan_cfm_icid+0x8e/0xb1 net/bluetooth/l2cap_core.c:4661
     l2cap_move_fail net/bluetooth/l2cap_core.c:5146 [inline]
     l2cap_move_channel_rsp net/bluetooth/l2cap_core.c:5185 [inline]
     l2cap_bredr_sig_cmd net/bluetooth/l2cap_core.c:5464 [inline]
     l2cap_sig_channel net/bluetooth/l2cap_core.c:5799 [inline]
     l2cap_recv_frame+0x1d12/0x51aa net/bluetooth/l2cap_core.c:7023
     l2cap_recv_acldata+0x2ea/0x693 net/bluetooth/l2cap_core.c:7596
     hci_acldata_packet net/bluetooth/hci_core.c:4606 [inline]
     hci_rx_work+0x2bd/0x45e net/bluetooth/hci_core.c:4796
     process_one_work+0x6f8/0xb50 kernel/workqueue.c:2175
     worker_thread+0x4fc/0x670 kernel/workqueue.c:2321
     kthread+0x2f0/0x304 kernel/kthread.c:253
     ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:415
    
    Allocated by task 38:
     set_track mm/kasan/kasan.c:460 [inline]
     kasan_kmalloc+0x8d/0x9a mm/kasan/kasan.c:553
     kmem_cache_alloc_trace+0x102/0x129 mm/slub.c:2787
     kmalloc include/linux/slab.h:515 [inline]
     kzalloc include/linux/slab.h:709 [inline]
     hci_chan_create+0x86/0x26d net/bluetooth/hci_conn.c:1674
     l2cap_conn_add.part.0+0x1c/0x814 net/bluetooth/l2cap_core.c:7062
     l2cap_conn_add net/bluetooth/l2cap_core.c:7059 [inline]
     l2cap_connect_cfm+0x134/0x852 net/bluetooth/l2cap_core.c:7381
     hci_connect_cfm+0x9d/0x122 include/net/bluetooth/hci_core.h:1404
     hci_remote_ext_features_evt net/bluetooth/hci_event.c:4161 [inline]
     hci_event_packet+0x463f/0x72fa net/bluetooth/hci_event.c:5981
     hci_rx_work+0x197/0x45e net/bluetooth/hci_core.c:4791
     process_one_work+0x6f8/0xb50 kernel/workqueue.c:2175
     worker_thread+0x4fc/0x670 kernel/workqueue.c:2321
     kthread+0x2f0/0x304 kernel/kthread.c:253
     ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:415
    
    Freed by task 1732:
     set_track mm/kasan/kasan.c:460 [inline]
     __kasan_slab_free mm/kasan/kasan.c:521 [inline]
     __kasan_slab_free+0x106/0x128 mm/kasan/kasan.c:493
     slab_free_hook mm/slub.c:1409 [inline]
     slab_free_freelist_hook+0xaa/0xf6 mm/slub.c:1436
     slab_free mm/slub.c:3009 [inline]
     kfree+0x182/0x21e mm/slub.c:3972
     hci_disconn_loglink_complete_evt net/bluetooth/hci_event.c:4891 [inline]
     hci_event_packet+0x6a1c/0x72fa net/bluetooth/hci_event.c:6050
     hci_rx_work+0x197/0x45e net/bluetooth/hci_core.c:4791
     process_one_work+0x6f8/0xb50 kernel/workqueue.c:2175
     worker_thread+0x4fc/0x670 kernel/workqueue.c:2321
     kthread+0x2f0/0x304 kernel/kthread.c:253
     ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:415
    
    The buggy address belongs to the object at ffff8881d7af9180
     which belongs to the cache kmalloc-128 of size 128
    The buggy address is located 24 bytes inside of
     128-byte region [ffff8881d7af9180, ffff8881d7af9200)
    The buggy address belongs to the page:
    page:ffffea00075ebe40 count:1 mapcount:0 mapping:ffff8881da403200 index:0x0
    flags: 0x8000000000000200(slab)
    raw: 8000000000000200 dead000000000100 dead000000000200 ffff8881da403200
    raw: 0000000000000000 0000000080150015 00000001ffffffff 0000000000000000
    page dumped because: kasan: bad access detected
    
    Memory state around the buggy address:
     ffff8881d7af9080: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb
     ffff8881d7af9100: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
    >ffff8881d7af9180: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
                                ^
     ffff8881d7af9200: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
     ffff8881d7af9280: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    
    Signed-off-by: Archie Pusaka <apusaka@chromium.org>
    Reported-by: syzbot+98228e7407314d2d4ba2@syzkaller.appspotmail.com
    Reviewed-by: Alain Michaud <alainm@chromium.org>
    Reviewed-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Cc: George Kennedy <george.kennedy@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 319572809575..6a61faf0cc79 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -526,6 +526,7 @@ struct hci_chan {
 	struct sk_buff_head data_q;
 	unsigned int	sent;
 	__u8		state;
+	bool		amp;
 };
 
 struct hci_conn_params {
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index b58afd2d5ebf..2e2cad58b6cc 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -4721,6 +4721,7 @@ static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
 		return;
 
 	hchan->handle = le16_to_cpu(ev->handle);
+	hchan->amp = true;
 
 	BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
 
@@ -4753,7 +4754,7 @@ static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
 	hci_dev_lock(hdev);
 
 	hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
-	if (!hchan)
+	if (!hchan || !hchan->amp)
 		goto unlock;
 
 	amp_destroy_logical_link(hchan, ev->reason);

commit 2ab98abf0d2a820efa726a5e143133fc5993ed56
Author: Christoph Hellwig <hch@lst.de>
Date:   Tue Jul 28 23:33:33 2020 +0200

    modules: inherit TAINT_PROPRIETARY_MODULE
    
    commit 262e6ae7081df304fc625cf368d5c2cbba2bb991 upstream.
    
    If a TAINT_PROPRIETARY_MODULE exports symbol, inherit the taint flag
    for all modules importing these symbols, and don't allow loading
    symbols from TAINT_PROPRIETARY_MODULE modules if the module previously
    imported gplonly symbols.  Add a anti-circumvention devices so people
    don't accidentally get themselves into trouble this way.
    
    Comment from Greg:
      "Ah, the proven-to-be-illegal "GPL Condom" defense :)"
    
    [jeyu: pr_info -> pr_err and pr_warn as per discussion]
    Link: http://lore.kernel.org/r/20200730162957.GA22469@lst.de
    Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
    Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Jessica Yu <jeyu@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/module.h b/include/linux/module.h
index 93392b24b847..008cfc08a664 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -359,6 +359,7 @@ struct module {
 	unsigned int num_gpl_syms;
 	const struct kernel_symbol *gpl_syms;
 	const s32 *gpl_crcs;
+	bool using_gplonly_symbols;
 
 #ifdef CONFIG_UNUSED_SYMBOLS
 	/* unused exported symbols. */
diff --git a/kernel/module.c b/kernel/module.c
index 4a2fa74fa7f8..92d8610742c7 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -1379,6 +1379,25 @@ static inline int same_magic(const char *amagic, const char *bmagic,
 }
 #endif /* CONFIG_MODVERSIONS */
 
+static bool inherit_taint(struct module *mod, struct module *owner)
+{
+	if (!owner || !test_bit(TAINT_PROPRIETARY_MODULE, &owner->taints))
+		return true;
+
+	if (mod->using_gplonly_symbols) {
+		pr_err("%s: module using GPL-only symbols uses symbols from proprietary module %s.\n",
+			mod->name, owner->name);
+		return false;
+	}
+
+	if (!test_bit(TAINT_PROPRIETARY_MODULE, &mod->taints)) {
+		pr_warn("%s: module uses symbols from proprietary module %s, inheriting taint.\n",
+			mod->name, owner->name);
+		set_bit(TAINT_PROPRIETARY_MODULE, &mod->taints);
+	}
+	return true;
+}
+
 /* Resolve a symbol for this module.  I.e. if we find one, record usage. */
 static const struct kernel_symbol *resolve_symbol(struct module *mod,
 						  const struct load_info *info,
@@ -1403,6 +1422,14 @@ static const struct kernel_symbol *resolve_symbol(struct module *mod,
 	if (!sym)
 		goto unlock;
 
+	if (license == GPL_ONLY)
+		mod->using_gplonly_symbols = true;
+
+	if (!inherit_taint(mod, owner)) {
+		sym = NULL;
+		goto getname;
+	}
+
 	if (!check_version(info, name, mod, crc)) {
 		sym = ERR_PTR(-EINVAL);
 		goto getname;

commit ef658fe02083f0b611dfa21bdda35f31de920d52
Author: Christoph Hellwig <hch@lst.de>
Date:   Thu Jul 30 08:10:26 2020 +0200

    modules: return licensing information from find_symbol
    
    commit ef1dac6021cc8ec5de02ce31722bf26ac4ed5523 upstream.
    
    Report the GPLONLY status through a new argument.
    
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Jessica Yu <jeyu@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/module.h b/include/linux/module.h
index 4fbee306ea82..93392b24b847 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -529,7 +529,7 @@ struct module *find_module(const char *name);
 struct symsearch {
 	const struct kernel_symbol *start, *stop;
 	const s32 *crcs;
-	enum {
+	enum mod_license {
 		NOT_GPL_ONLY,
 		GPL_ONLY,
 		WILL_BE_GPL_ONLY,
diff --git a/kernel/module.c b/kernel/module.c
index 14f81291c682..4a2fa74fa7f8 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -487,6 +487,7 @@ struct find_symbol_arg {
 	struct module *owner;
 	const s32 *crc;
 	const struct kernel_symbol *sym;
+	enum mod_license license;
 };
 
 static bool check_symbol(const struct symsearch *syms,
@@ -520,6 +521,7 @@ static bool check_symbol(const struct symsearch *syms,
 	fsa->owner = owner;
 	fsa->crc = symversion(syms->crcs, symnum);
 	fsa->sym = &syms->start[symnum];
+	fsa->license = syms->license;
 	return true;
 }
 
@@ -570,6 +572,7 @@ static bool find_symbol_in_section(const struct symsearch *syms,
 static const struct kernel_symbol *find_symbol(const char *name,
 					struct module **owner,
 					const s32 **crc,
+					enum mod_license *license,
 					bool gplok,
 					bool warn)
 {
@@ -584,6 +587,8 @@ static const struct kernel_symbol *find_symbol(const char *name,
 			*owner = fsa.owner;
 		if (crc)
 			*crc = fsa.crc;
+		if (license)
+			*license = fsa.license;
 		return fsa.sym;
 	}
 
@@ -1056,7 +1061,7 @@ void __symbol_put(const char *symbol)
 	struct module *owner;
 
 	preempt_disable();
-	if (!find_symbol(symbol, &owner, NULL, true, false))
+	if (!find_symbol(symbol, &owner, NULL, NULL, true, false))
 		BUG();
 	module_put(owner);
 	preempt_enable();
@@ -1334,7 +1339,7 @@ static inline int check_modstruct_version(const struct load_info *info,
 	 * locking is necessary -- use preempt_disable() to placate lockdep.
 	 */
 	preempt_disable();
-	if (!find_symbol("module_layout", NULL, &crc, true, false)) {
+	if (!find_symbol("module_layout", NULL, &crc, NULL, true, false)) {
 		preempt_enable();
 		BUG();
 	}
@@ -1383,6 +1388,7 @@ static const struct kernel_symbol *resolve_symbol(struct module *mod,
 	struct module *owner;
 	const struct kernel_symbol *sym;
 	const s32 *crc;
+	enum mod_license license;
 	int err;
 
 	/*
@@ -1392,7 +1398,7 @@ static const struct kernel_symbol *resolve_symbol(struct module *mod,
 	 */
 	sched_annotate_sleep();
 	mutex_lock(&module_mutex);
-	sym = find_symbol(name, &owner, &crc,
+	sym = find_symbol(name, &owner, &crc, &license,
 			  !(mod->taints & (1 << TAINT_PROPRIETARY_MODULE)), true);
 	if (!sym)
 		goto unlock;
@@ -2222,7 +2228,7 @@ void *__symbol_get(const char *symbol)
 	const struct kernel_symbol *sym;
 
 	preempt_disable();
-	sym = find_symbol(symbol, &owner, NULL, true, true);
+	sym = find_symbol(symbol, &owner, NULL, NULL, true, true);
 	if (sym && strong_try_module_get(owner))
 		sym = NULL;
 	preempt_enable();
@@ -2258,7 +2264,7 @@ static int verify_export_symbols(struct module *mod)
 	for (i = 0; i < ARRAY_SIZE(arr); i++) {
 		for (s = arr[i].sym; s < arr[i].sym + arr[i].num; s++) {
 			if (find_symbol(kernel_symbol_name(s), &owner, NULL,
-					true, false)) {
+					NULL, true, false)) {
 				pr_err("%s: exports duplicate symbol %s"
 				       " (owned by %s)\n",
 				       mod->name, kernel_symbol_name(s),

commit 04c85f758849657691dde9fce66d18eee7a9ae8f
Author: Christoph Hellwig <hch@lst.de>
Date:   Thu Jul 30 08:10:25 2020 +0200

    modules: rename the licence field in struct symsearch to license
    
    commit cd8732cdcc37d7077c4fa2c966b748c0662b607e upstream.
    
    Use the same spelling variant as the rest of the file.
    
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Jessica Yu <jeyu@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/module.h b/include/linux/module.h
index f8d2f81b1956..4fbee306ea82 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -533,7 +533,7 @@ struct symsearch {
 		NOT_GPL_ONLY,
 		GPL_ONLY,
 		WILL_BE_GPL_ONLY,
-	} licence;
+	} license;
 	bool unused;
 };
 
diff --git a/kernel/module.c b/kernel/module.c
index bbbeb5614c57..14f81291c682 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -496,9 +496,9 @@ static bool check_symbol(const struct symsearch *syms,
 	struct find_symbol_arg *fsa = data;
 
 	if (!fsa->gplok) {
-		if (syms->licence == GPL_ONLY)
+		if (syms->license == GPL_ONLY)
 			return false;
-		if (syms->licence == WILL_BE_GPL_ONLY && fsa->warn) {
+		if (syms->license == WILL_BE_GPL_ONLY && fsa->warn) {
 			pr_warn("Symbol %s is being used by a non-GPL module, "
 				"which will not be allowed in the future\n",
 				fsa->name);

commit 27b700c23227594e715e9d06a57521659dafa105
Author: Christoph Hellwig <hch@lst.de>
Date:   Thu Jul 30 08:10:24 2020 +0200

    modules: unexport __module_address
    
    commit 34e64705ad415ed7a816e60ef62b42fe6d1729d9 upstream.
    
    __module_address is only used by built-in code.
    
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Jessica Yu <jeyu@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/module.c b/kernel/module.c
index 93f4b1d8d098..bbbeb5614c57 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -4381,7 +4381,6 @@ struct module *__module_address(unsigned long addr)
 	}
 	return mod;
 }
-EXPORT_SYMBOL_GPL(__module_address);
 
 /*
  * is_module_text_address - is this address inside module code?

commit d338108ac15abf71fb7cf0ce6e0cd12b5be3201b
Author: Christoph Hellwig <hch@lst.de>
Date:   Thu Jul 30 08:10:23 2020 +0200

    modules: unexport __module_text_address
    
    commit 3fe1e56d0e68b623dd62d8d38265d2a052e7e185 upstream.
    
    __module_text_address is only used by built-in code.
    
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Jessica Yu <jeyu@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/module.c b/kernel/module.c
index b1a00367fa3d..93f4b1d8d098 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -4420,7 +4420,6 @@ struct module *__module_text_address(unsigned long addr)
 	}
 	return mod;
 }
-EXPORT_SYMBOL_GPL(__module_text_address);
 
 /* Don't grab lock, we're oopsing. */
 void print_modules(void)

commit 1c713f50b31da378a94d4c02f81e996da889127e
Author: Christoph Hellwig <hch@lst.de>
Date:   Thu Jul 30 08:10:22 2020 +0200

    modules: mark each_symbol_section static
    
    commit a54e04914c211b5678602a46b3ede5d82ec1327d upstream.
    
    each_symbol_section is only used inside of module.c.
    
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Jessica Yu <jeyu@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/module.h b/include/linux/module.h
index f52bd3ff1e01..f8d2f81b1956 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -537,15 +537,6 @@ struct symsearch {
 	bool unused;
 };
 
-/*
- * Walk the exported symbol table
- *
- * Must be called with module_mutex held or preemption disabled.
- */
-bool each_symbol_section(bool (*fn)(const struct symsearch *arr,
-				    struct module *owner,
-				    void *data), void *data);
-
 /* Returns 0 and fills in value, defined and namebuf, or -ERANGE if
    symnum out of range. */
 int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
diff --git a/kernel/module.c b/kernel/module.c
index 8a3705150008..b1a00367fa3d 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -415,7 +415,7 @@ static bool each_symbol_in_section(const struct symsearch *arr,
 }
 
 /* Returns true as soon as fn returns true, otherwise false. */
-bool each_symbol_section(bool (*fn)(const struct symsearch *arr,
+static bool each_symbol_section(bool (*fn)(const struct symsearch *arr,
 				    struct module *owner,
 				    void *data),
 			 void *data)
@@ -476,7 +476,6 @@ bool each_symbol_section(bool (*fn)(const struct symsearch *arr,
 	}
 	return false;
 }
-EXPORT_SYMBOL_GPL(each_symbol_section);
 
 struct find_symbol_arg {
 	/* Input */

commit c3da81cefbb5bc729db273ce90a994477413fc9d
Author: Christoph Hellwig <hch@lst.de>
Date:   Thu Jul 30 08:10:21 2020 +0200

    modules: mark find_symbol static
    
    commit 773110470e2fa3839523384ae014f8a723c4d178 upstream.
    
    find_symbol is only used in module.c.
    
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Jessica Yu <jeyu@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/module.h b/include/linux/module.h
index 116fe0da3b6a..f52bd3ff1e01 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -537,17 +537,6 @@ struct symsearch {
 	bool unused;
 };
 
-/*
- * Search for an exported symbol by name.
- *
- * Must be called with module_mutex held or preemption disabled.
- */
-const struct kernel_symbol *find_symbol(const char *name,
-					struct module **owner,
-					const s32 **crc,
-					bool gplok,
-					bool warn);
-
 /*
  * Walk the exported symbol table
  *
diff --git a/kernel/module.c b/kernel/module.c
index d1b1d692967e..8a3705150008 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -568,7 +568,7 @@ static bool find_symbol_in_section(const struct symsearch *syms,
 
 /* Find a symbol and return it, along with, (optional) crc and
  * (optional) module which owns it.  Needs preempt disabled or module_mutex. */
-const struct kernel_symbol *find_symbol(const char *name,
+static const struct kernel_symbol *find_symbol(const char *name,
 					struct module **owner,
 					const s32 **crc,
 					bool gplok,
@@ -591,7 +591,6 @@ const struct kernel_symbol *find_symbol(const char *name,
 	pr_debug("Failed to find symbol %s\n", name);
 	return NULL;
 }
-EXPORT_SYMBOL_GPL(find_symbol);
 
 /*
  * Search for module by name: must hold module_mutex (or preempt disabled

commit 8745aa4e018e4159f8c49d9689251f51fd0a15e0
Author: Christoph Hellwig <hch@lst.de>
Date:   Thu Jul 30 08:10:20 2020 +0200

    modules: mark ref_module static
    
    commit 7ef5264de773279b9f23b6cc8afb5addb30e970b upstream.
    
    ref_module isn't used anywhere outside of module.c.
    
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Jessica Yu <jeyu@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/include/linux/module.h b/include/linux/module.h
index 9915397715fc..116fe0da3b6a 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -604,7 +604,6 @@ static inline void __module_get(struct module *module)
 #define symbol_put_addr(p) do { } while (0)
 
 #endif /* CONFIG_MODULE_UNLOAD */
-int ref_module(struct module *a, struct module *b);
 
 /* This is a #define so the string doesn't get put in every .o file */
 #define module_name(mod)			\
diff --git a/kernel/module.c b/kernel/module.c
index d5d01ece720c..d1b1d692967e 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -851,7 +851,7 @@ static int add_module_usage(struct module *a, struct module *b)
 }
 
 /* Module a uses b: caller needs module_mutex() */
-int ref_module(struct module *a, struct module *b)
+static int ref_module(struct module *a, struct module *b)
 {
 	int err;
 
@@ -870,7 +870,6 @@ int ref_module(struct module *a, struct module *b)
 	}
 	return 0;
 }
-EXPORT_SYMBOL_GPL(ref_module);
 
 /* Clear the unload stuff of the module. */
 static void module_unload_free(struct module *mod)
@@ -1151,11 +1150,10 @@ static inline void module_unload_free(struct module *mod)
 {
 }
 
-int ref_module(struct module *a, struct module *b)
+static int ref_module(struct module *a, struct module *b)
 {
 	return strong_try_module_get(b);
 }
-EXPORT_SYMBOL_GPL(ref_module);
 
 static inline int module_unload_init(struct module *mod)
 {

commit 772b9f59657665af3b68d24d12b9d172d31f0dfb
Author: Benjamin Block <bblock@linux.ibm.com>
Date:   Thu Apr 29 23:37:00 2021 +0200

    dm rq: fix double free of blk_mq_tag_set in dev remove after table load fails
    
    commit 8e947c8f4a5620df77e43c9c75310dc510250166 upstream.
    
    When loading a device-mapper table for a request-based mapped device,
    and the allocation/initialization of the blk_mq_tag_set for the device
    fails, a following device remove will cause a double free.
    
    E.g. (dmesg):
      device-mapper: core: Cannot initialize queue for request-based dm-mq mapped device
      device-mapper: ioctl: unable to set up device queue for new table.
      Unable to handle kernel pointer dereference in virtual kernel address space
      Failing address: 0305e098835de000 TEID: 0305e098835de803
      Fault in home space mode while using kernel ASCE.
      AS:000000025efe0007 R3:0000000000000024
      Oops: 0038 ilc:3 [#1] SMP
      Modules linked in: ... lots of modules ...
      Supported: Yes, External
      CPU: 0 PID: 7348 Comm: multipathd Kdump: loaded Tainted: G        W      X    5.3.18-53-default #1 SLE15-SP3
      Hardware name: IBM 8561 T01 7I2 (LPAR)
      Krnl PSW : 0704e00180000000 000000025e368eca (kfree+0x42/0x330)
                 R:0 T:1 IO:1 EX:1 Key:0 M:1 W:0 P:0 AS:3 CC:2 PM:0 RI:0 EA:3
      Krnl GPRS: 000000000000004a 000000025efe5230 c1773200d779968d 0000000000000000
                 000000025e520270 000000025e8d1b40 0000000000000003 00000007aae10000
                 000000025e5202a2 0000000000000001 c1773200d779968d 0305e098835de640
                 00000007a8170000 000003ff80138650 000000025e5202a2 000003e00396faa8
      Krnl Code: 000000025e368eb8: c4180041e100       lgrl    %r1,25eba50b8
                 000000025e368ebe: ecba06b93a55       risbg   %r11,%r10,6,185,58
                #000000025e368ec4: e3b010000008       ag      %r11,0(%r1)
                >000000025e368eca: e310b0080004       lg      %r1,8(%r11)
                 000000025e368ed0: a7110001           tmll    %r1,1
                 000000025e368ed4: a7740129           brc     7,25e369126
                 000000025e368ed8: e320b0080004       lg      %r2,8(%r11)
                 000000025e368ede: b904001b           lgr     %r1,%r11
      Call Trace:
       [<000000025e368eca>] kfree+0x42/0x330
       [<000000025e5202a2>] blk_mq_free_tag_set+0x72/0xb8
       [<000003ff801316a8>] dm_mq_cleanup_mapped_device+0x38/0x50 [dm_mod]
       [<000003ff80120082>] free_dev+0x52/0xd0 [dm_mod]
       [<000003ff801233f0>] __dm_destroy+0x150/0x1d0 [dm_mod]
       [<000003ff8012bb9a>] dev_remove+0x162/0x1c0 [dm_mod]
       [<000003ff8012a988>] ctl_ioctl+0x198/0x478 [dm_mod]
       [<000003ff8012ac8a>] dm_ctl_ioctl+0x22/0x38 [dm_mod]
       [<000000025e3b11ee>] ksys_ioctl+0xbe/0xe0
       [<000000025e3b127a>] __s390x_sys_ioctl+0x2a/0x40
       [<000000025e8c15ac>] system_call+0xd8/0x2c8
      Last Breaking-Event-Address:
       [<000000025e52029c>] blk_mq_free_tag_set+0x6c/0xb8
      Kernel panic - not syncing: Fatal exception: panic_on_oops
    
    When allocation/initialization of the blk_mq_tag_set fails in
    dm_mq_init_request_queue(), it is uninitialized/freed, but the pointer
    is not reset to NULL; so when dev_remove() later gets into
    dm_mq_cleanup_mapped_device() it sees the pointer and tries to
    uninitialize and free it again.
    
    Fix this by setting the pointer to NULL in dm_mq_init_request_queue()
    error-handling. Also set it to NULL in dm_mq_cleanup_mapped_device().
    
    Cc: <stable@vger.kernel.org> # 4.6+
    Fixes: 1c357a1e86a4 ("dm: allocate blk_mq_tag_set rather than embed in mapped_device")
    Signed-off-by: Benjamin Block <bblock@linux.ibm.com>
    Signed-off-by: Mike Snitzer <snitzer@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/md/dm-rq.c b/drivers/md/dm-rq.c
index 9fde174ce396..2957a3763f01 100644
--- a/drivers/md/dm-rq.c
+++ b/drivers/md/dm-rq.c
@@ -831,6 +831,7 @@ int dm_mq_init_request_queue(struct mapped_device *md, struct dm_table *t)
 	blk_mq_free_tag_set(md->tag_set);
 out_kfree_tag_set:
 	kfree(md->tag_set);
+	md->tag_set = NULL;
 
 	return err;
 }
@@ -840,6 +841,7 @@ void dm_mq_cleanup_mapped_device(struct mapped_device *md)
 	if (md->tag_set) {
 		blk_mq_free_tag_set(md->tag_set);
 		kfree(md->tag_set);
+		md->tag_set = NULL;
 	}
 }
 

commit 7cba7ebfd905cae6a50f548477a0e17ccd176ddf
Author: Joe Thornber <ejt@redhat.com>
Date:   Tue Apr 13 09:11:53 2021 +0100

    dm space map common: fix division bug in sm_ll_find_free_block()
    
    commit 5208692e80a1f3c8ce2063a22b675dd5589d1d80 upstream.
    
    This division bug meant the search for free metadata space could skip
    the final allocation bitmap's worth of entries. Fix affects DM thinp,
    cache and era targets.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Joe Thornber <ejt@redhat.com>
    Tested-by: Ming-Hung Tsai <mtsai@redhat.com>
    Signed-off-by: Mike Snitzer <snitzer@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/md/persistent-data/dm-space-map-common.c b/drivers/md/persistent-data/dm-space-map-common.c
index 17aef55ed708..a284762e548e 100644
--- a/drivers/md/persistent-data/dm-space-map-common.c
+++ b/drivers/md/persistent-data/dm-space-map-common.c
@@ -337,6 +337,8 @@ int sm_ll_find_free_block(struct ll_disk *ll, dm_block_t begin,
 	 */
 	begin = do_div(index_begin, ll->entries_per_block);
 	end = do_div(end, ll->entries_per_block);
+	if (end == 0)
+		end = ll->entries_per_block;
 
 	for (i = index_begin; i < index_end; i++, begin = 0) {
 		struct dm_block *blk;

commit 77aab16c6185f15fedccf72094d6d9a59dadadba
Author: Joe Thornber <ejt@redhat.com>
Date:   Mon Mar 29 16:34:57 2021 +0100

    dm persistent data: packed struct should have an aligned() attribute too
    
    commit a88b2358f1da2c9f9fcc432f2e0a79617fea397c upstream.
    
    Otherwise most non-x86 architectures (e.g. riscv, arm) will resort to
    byte-by-byte access.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Joe Thornber <ejt@redhat.com>
    Signed-off-by: Mike Snitzer <snitzer@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/md/persistent-data/dm-btree-internal.h b/drivers/md/persistent-data/dm-btree-internal.h
index a240990a7f33..5673f8eb5f88 100644
--- a/drivers/md/persistent-data/dm-btree-internal.h
+++ b/drivers/md/persistent-data/dm-btree-internal.h
@@ -34,12 +34,12 @@ struct node_header {
 	__le32 max_entries;
 	__le32 value_size;
 	__le32 padding;
-} __packed;
+} __attribute__((packed, aligned(8)));
 
 struct btree_node {
 	struct node_header header;
 	__le64 keys[0];
-} __packed;
+} __attribute__((packed, aligned(8)));
 
 
 /*
diff --git a/drivers/md/persistent-data/dm-space-map-common.h b/drivers/md/persistent-data/dm-space-map-common.h
index 8de63ce39bdd..87e17909ef52 100644
--- a/drivers/md/persistent-data/dm-space-map-common.h
+++ b/drivers/md/persistent-data/dm-space-map-common.h
@@ -33,7 +33,7 @@ struct disk_index_entry {
 	__le64 blocknr;
 	__le32 nr_free;
 	__le32 none_free_before;
-} __packed;
+} __attribute__ ((packed, aligned(8)));
 
 
 #define MAX_METADATA_BITMAPS 255
@@ -43,7 +43,7 @@ struct disk_metadata_index {
 	__le64 blocknr;
 
 	struct disk_index_entry index[MAX_METADATA_BITMAPS];
-} __packed;
+} __attribute__ ((packed, aligned(8)));
 
 struct ll_disk;
 
@@ -86,7 +86,7 @@ struct disk_sm_root {
 	__le64 nr_allocated;
 	__le64 bitmap_root;
 	__le64 ref_count_root;
-} __packed;
+} __attribute__ ((packed, aligned(8)));
 
 #define ENTRIES_PER_BYTE 4
 
@@ -94,7 +94,7 @@ struct disk_bitmap_header {
 	__le32 csum;
 	__le32 not_used;
 	__le64 blocknr;
-} __packed;
+} __attribute__ ((packed, aligned(8)));
 
 enum allocation_event {
 	SM_NONE,

commit d43d56dbf452ccecc1ec735cd4b6840118005d7c
Author: Steven Rostedt (VMware) <rostedt@goodmis.org>
Date:   Fri Apr 30 12:17:58 2021 -0400

    tracing: Restructure trace_clock_global() to never block
    
    commit aafe104aa9096827a429bc1358f8260ee565b7cc upstream.
    
    It was reported that a fix to the ring buffer recursion detection would
    cause a hung machine when performing suspend / resume testing. The
    following backtrace was extracted from debugging that case:
    
    Call Trace:
     trace_clock_global+0x91/0xa0
     __rb_reserve_next+0x237/0x460
     ring_buffer_lock_reserve+0x12a/0x3f0
     trace_buffer_lock_reserve+0x10/0x50
     __trace_graph_return+0x1f/0x80
     trace_graph_return+0xb7/0xf0
     ? trace_clock_global+0x91/0xa0
     ftrace_return_to_handler+0x8b/0xf0
     ? pv_hash+0xa0/0xa0
     return_to_handler+0x15/0x30
     ? ftrace_graph_caller+0xa0/0xa0
     ? trace_clock_global+0x91/0xa0
     ? __rb_reserve_next+0x237/0x460
     ? ring_buffer_lock_reserve+0x12a/0x3f0
     ? trace_event_buffer_lock_reserve+0x3c/0x120
     ? trace_event_buffer_reserve+0x6b/0xc0
     ? trace_event_raw_event_device_pm_callback_start+0x125/0x2d0
     ? dpm_run_callback+0x3b/0xc0
     ? pm_ops_is_empty+0x50/0x50
     ? platform_get_irq_byname_optional+0x90/0x90
     ? trace_device_pm_callback_start+0x82/0xd0
     ? dpm_run_callback+0x49/0xc0
    
    With the following RIP:
    
    RIP: 0010:native_queued_spin_lock_slowpath+0x69/0x200
    
    Since the fix to the recursion detection would allow a single recursion to
    happen while tracing, this lead to the trace_clock_global() taking a spin
    lock and then trying to take it again:
    
    ring_buffer_lock_reserve() {
      trace_clock_global() {
        arch_spin_lock() {
          queued_spin_lock_slowpath() {
            /* lock taken */
            (something else gets traced by function graph tracer)
              ring_buffer_lock_reserve() {
                trace_clock_global() {
                  arch_spin_lock() {
                    queued_spin_lock_slowpath() {
                    /* DEAD LOCK! */
    
    Tracing should *never* block, as it can lead to strange lockups like the
    above.
    
    Restructure the trace_clock_global() code to instead of simply taking a
    lock to update the recorded "prev_time" simply use it, as two events
    happening on two different CPUs that calls this at the same time, really
    doesn't matter which one goes first. Use a trylock to grab the lock for
    updating the prev_time, and if it fails, simply try again the next time.
    If it failed to be taken, that means something else is already updating
    it.
    
    Link: https://lkml.kernel.org/r/20210430121758.650b6e8a@gandalf.local.home
    
    Cc: stable@vger.kernel.org
    Tested-by: Konstantin Kharlamov <hi-angel@yandex.ru>
    Tested-by: Todd Brandt <todd.e.brandt@linux.intel.com>
    Fixes: b02414c8f045 ("ring-buffer: Fix recursion protection transitions between interrupt context") # started showing the problem
    Fixes: 14131f2f98ac3 ("tracing: implement trace_clock_*() APIs") # where the bug happened
    Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=212761
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/trace/trace_clock.c b/kernel/trace/trace_clock.c
index aaf6793ededa..c1637f90c8a3 100644
--- a/kernel/trace/trace_clock.c
+++ b/kernel/trace/trace_clock.c
@@ -95,33 +95,49 @@ u64 notrace trace_clock_global(void)
 {
 	unsigned long flags;
 	int this_cpu;
-	u64 now;
+	u64 now, prev_time;
 
 	raw_local_irq_save(flags);
 
 	this_cpu = raw_smp_processor_id();
-	now = sched_clock_cpu(this_cpu);
+
 	/*
-	 * If in an NMI context then dont risk lockups and return the
-	 * cpu_clock() time:
+	 * The global clock "guarantees" that the events are ordered
+	 * between CPUs. But if two events on two different CPUS call
+	 * trace_clock_global at roughly the same time, it really does
+	 * not matter which one gets the earlier time. Just make sure
+	 * that the same CPU will always show a monotonic clock.
+	 *
+	 * Use a read memory barrier to get the latest written
+	 * time that was recorded.
 	 */
-	if (unlikely(in_nmi()))
-		goto out;
+	smp_rmb();
+	prev_time = READ_ONCE(trace_clock_struct.prev_time);
+	now = sched_clock_cpu(this_cpu);
 
-	arch_spin_lock(&trace_clock_struct.lock);
+	/* Make sure that now is always greater than prev_time */
+	if ((s64)(now - prev_time) < 0)
+		now = prev_time + 1;
 
 	/*
-	 * TODO: if this happens often then maybe we should reset
-	 * my_scd->clock to prev_time+1, to make sure
-	 * we start ticking with the local clock from now on?
+	 * If in an NMI context then dont risk lockups and simply return
+	 * the current time.
 	 */
-	if ((s64)(now - trace_clock_struct.prev_time) < 0)
-		now = trace_clock_struct.prev_time + 1;
+	if (unlikely(in_nmi()))
+		goto out;
 
-	trace_clock_struct.prev_time = now;
+	/* Tracing can cause strange recursion, always use a try lock */
+	if (arch_spin_trylock(&trace_clock_struct.lock)) {
+		/* Reread prev_time in case it was already updated */
+		prev_time = READ_ONCE(trace_clock_struct.prev_time);
+		if ((s64)(now - prev_time) < 0)
+			now = prev_time + 1;
 
-	arch_spin_unlock(&trace_clock_struct.lock);
+		trace_clock_struct.prev_time = now;
 
+		/* The unlock acts as the wmb for the above rmb */
+		arch_spin_unlock(&trace_clock_struct.lock);
+	}
  out:
 	raw_local_irq_restore(flags);
 

commit 92c52762c295602b2606181ff46e0de67a6e1417
Author: Steven Rostedt (VMware) <rostedt@goodmis.org>
Date:   Tue Apr 27 11:32:07 2021 -0400

    tracing: Map all PIDs to command lines
    
    commit 785e3c0a3a870e72dc530856136ab4c8dd207128 upstream.
    
    The default max PID is set by PID_MAX_DEFAULT, and the tracing
    infrastructure uses this number to map PIDs to the comm names of the
    tasks, such output of the trace can show names from the recorded PIDs in
    the ring buffer. This mapping is also exported to user space via the
    "saved_cmdlines" file in the tracefs directory.
    
    But currently the mapping expects the PIDs to be less than
    PID_MAX_DEFAULT, which is the default maximum and not the real maximum.
    Recently, systemd will increases the maximum value of a PID on the system,
    and when tasks are traced that have a PID higher than PID_MAX_DEFAULT, its
    comm is not recorded. This leads to the entire trace to have "<...>" as
    the comm name, which is pretty useless.
    
    Instead, keep the array mapping the size of PID_MAX_DEFAULT, but instead
    of just mapping the index to the comm, map a mask of the PID
    (PID_MAX_DEFAULT - 1) to the comm, and find the full PID from the
    map_cmdline_to_pid array (that already exists).
    
    This bug goes back to the beginning of ftrace, but hasn't been an issue
    until user space started increasing the maximum value of PIDs.
    
    Link: https://lkml.kernel.org/r/20210427113207.3c601884@gandalf.local.home
    
    Cc: stable@vger.kernel.org
    Fixes: bc0c38d139ec7 ("ftrace: latency tracer infrastructure")
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index bca0b6df53ca..4eea58a907f0 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -1935,14 +1935,13 @@ static void tracing_stop_tr(struct trace_array *tr)
 
 static int trace_save_cmdline(struct task_struct *tsk)
 {
-	unsigned pid, idx;
+	unsigned tpid, idx;
 
 	/* treat recording of idle task as a success */
 	if (!tsk->pid)
 		return 1;
 
-	if (unlikely(tsk->pid > PID_MAX_DEFAULT))
-		return 0;
+	tpid = tsk->pid & (PID_MAX_DEFAULT - 1);
 
 	/*
 	 * It's not the end of the world if we don't get
@@ -1953,26 +1952,15 @@ static int trace_save_cmdline(struct task_struct *tsk)
 	if (!arch_spin_trylock(&trace_cmdline_lock))
 		return 0;
 
-	idx = savedcmd->map_pid_to_cmdline[tsk->pid];
+	idx = savedcmd->map_pid_to_cmdline[tpid];
 	if (idx == NO_CMDLINE_MAP) {
 		idx = (savedcmd->cmdline_idx + 1) % savedcmd->cmdline_num;
 
-		/*
-		 * Check whether the cmdline buffer at idx has a pid
-		 * mapped. We are going to overwrite that entry so we
-		 * need to clear the map_pid_to_cmdline. Otherwise we
-		 * would read the new comm for the old pid.
-		 */
-		pid = savedcmd->map_cmdline_to_pid[idx];
-		if (pid != NO_CMDLINE_MAP)
-			savedcmd->map_pid_to_cmdline[pid] = NO_CMDLINE_MAP;
-
-		savedcmd->map_cmdline_to_pid[idx] = tsk->pid;
-		savedcmd->map_pid_to_cmdline[tsk->pid] = idx;
-
+		savedcmd->map_pid_to_cmdline[tpid] = idx;
 		savedcmd->cmdline_idx = idx;
 	}
 
+	savedcmd->map_cmdline_to_pid[idx] = tsk->pid;
 	set_cmdline(idx, tsk->comm);
 
 	arch_spin_unlock(&trace_cmdline_lock);
@@ -1983,6 +1971,7 @@ static int trace_save_cmdline(struct task_struct *tsk)
 static void __trace_find_cmdline(int pid, char comm[])
 {
 	unsigned map;
+	int tpid;
 
 	if (!pid) {
 		strcpy(comm, "<idle>");
@@ -1994,16 +1983,16 @@ static void __trace_find_cmdline(int pid, char comm[])
 		return;
 	}
 
-	if (pid > PID_MAX_DEFAULT) {
-		strcpy(comm, "<...>");
-		return;
+	tpid = pid & (PID_MAX_DEFAULT - 1);
+	map = savedcmd->map_pid_to_cmdline[tpid];
+	if (map != NO_CMDLINE_MAP) {
+		tpid = savedcmd->map_cmdline_to_pid[map];
+		if (tpid == pid) {
+			strlcpy(comm, get_saved_cmdlines(map), TASK_COMM_LEN);
+			return;
+		}
 	}
-
-	map = savedcmd->map_pid_to_cmdline[pid];
-	if (map != NO_CMDLINE_MAP)
-		strlcpy(comm, get_saved_cmdlines(map), TASK_COMM_LEN);
-	else
-		strcpy(comm, "<...>");
+	strcpy(comm, "<...>");
 }
 
 void trace_find_cmdline(int pid, char comm[])

commit b79f448480fce2fcca775da807e707ded7350b84
Author: Marek Vasut <marex@denx.de>
Date:   Sun Mar 28 00:59:32 2021 +0100

    rsi: Use resume_noirq for SDIO
    
    commit c434e5e48dc4e626364491455f97e2db0aa137b1 upstream.
    
    The rsi_resume() does access the bus to enable interrupts on the RSI
    SDIO WiFi card, however when calling sdio_claim_host() in the resume
    path, it is possible the bus is already claimed and sdio_claim_host()
    spins indefinitelly. Enable the SDIO card interrupts in resume_noirq
    instead to prevent anything else from claiming the SDIO bus first.
    
    Fixes: 20db07332736 ("rsi: sdio suspend and resume support")
    Signed-off-by: Marek Vasut <marex@denx.de>
    Cc: Amitkumar Karwar <amit.karwar@redpinesignals.com>
    Cc: Angus Ainslie <angus@akkea.ca>
    Cc: David S. Miller <davem@davemloft.net>
    Cc: Jakub Kicinski <kuba@kernel.org>
    Cc: Kalle Valo <kvalo@codeaurora.org>
    Cc: Karun Eagalapati <karun256@gmail.com>
    Cc: Martin Kepplinger <martink@posteo.de>
    Cc: Sebastian Krzyszkowiak <sebastian.krzyszkowiak@puri.sm>
    Cc: Siva Rebbagondla <siva8118@gmail.com>
    Cc: netdev@vger.kernel.org
    Cc: stable@vger.kernel.org
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210327235932.175896-1-marex@denx.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index f76a360cf1e3..609cd07eeafc 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -1400,7 +1400,7 @@ static int rsi_restore(struct device *dev)
 }
 static const struct dev_pm_ops rsi_pm_ops = {
 	.suspend = rsi_suspend,
-	.resume = rsi_resume,
+	.resume_noirq = rsi_resume,
 	.freeze = rsi_freeze,
 	.thaw = rsi_thaw,
 	.restore = rsi_restore,

commit 3ce3062bcf01de94815605f1b6fd916cb84ff08b
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Sun Mar 28 00:44:43 2021 +0300

    tty: fix memory leak in vc_deallocate
    
    commit 211b4d42b70f1c1660feaa968dac0efc2a96ac4d upstream.
    
    syzbot reported memory leak in tty/vt.
    The problem was in VT_DISALLOCATE ioctl cmd.
    After allocating unimap with PIO_UNIMAP it wasn't
    freed via VT_DISALLOCATE, but vc_cons[currcons].d was
    zeroed.
    
    Reported-by: syzbot+bcc922b19ccc64240b42@syzkaller.appspotmail.com
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210327214443.21548-1-paskripkin@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 13ea0579f104..1fad4978a3b4 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -1380,6 +1380,7 @@ struct vc_data *vc_deallocate(unsigned int currcons)
 		atomic_notifier_call_chain(&vt_notifier_list, VT_DEALLOCATE, &param);
 		vcs_remove_sysfs(currcons);
 		visual_deinit(vc);
+		con_free_unimap(vc);
 		put_pid(vc->vt_pid);
 		vc_uniscr_set(vc, NULL);
 		kfree(vc->vc_screenbuf);

commit a32ccf93f257ca5c515ddb8a2fb8750f442ffca0
Author: Artur Petrosyan <Arthur.Petrosyan@synopsys.com>
Date:   Thu Apr 8 13:45:49 2021 +0400

    usb: dwc2: Fix session request interrupt handler
    
    commit 42b32b164acecd850edef010915a02418345a033 upstream.
    
    According to programming guide in host mode, port
    power must be turned on in session request
    interrupt handlers.
    
    Fixes: 21795c826a45 ("usb: dwc2: exit hibernation on session request")
    Cc: <stable@vger.kernel.org>
    Acked-by: Minas Harutyunyan <Minas.Harutyunyan@synopsys.com>
    Signed-off-by: Artur Petrosyan <Arthur.Petrosyan@synopsys.com>
    Link: https://lore.kernel.org/r/20210408094550.75484A0094@mailhost.synopsys.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/dwc2/core_intr.c b/drivers/usb/dwc2/core_intr.c
index b23ce535c12e..14efa28e048f 100644
--- a/drivers/usb/dwc2/core_intr.c
+++ b/drivers/usb/dwc2/core_intr.c
@@ -312,6 +312,7 @@ static void dwc2_handle_conn_id_status_change_intr(struct dwc2_hsotg *hsotg)
 static void dwc2_handle_session_req_intr(struct dwc2_hsotg *hsotg)
 {
 	int ret;
+	u32 hprt0;
 
 	/* Clear interrupt */
 	dwc2_writel(hsotg, GINTSTS_SESSREQINT, GINTSTS);
@@ -332,6 +333,13 @@ static void dwc2_handle_session_req_intr(struct dwc2_hsotg *hsotg)
 		 * established
 		 */
 		dwc2_hsotg_disconnect(hsotg);
+	} else {
+		/* Turn on the port power bit. */
+		hprt0 = dwc2_read_hprt0(hsotg);
+		hprt0 |= HPRT0_PWR;
+		dwc2_writel(hsotg, hprt0, HPRT0);
+		/* Connect hcd after port power is set. */
+		dwc2_hcd_connect(hsotg);
 	}
 }
 

commit be9997ba10009b6634e3fd90c33cd3d6899e1298
Author: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Date:   Mon Apr 19 19:11:12 2021 -0700

    usb: dwc3: gadget: Fix START_TRANSFER link state check
    
    commit c560e76319a94a3b9285bc426c609903408e4826 upstream.
    
    The START_TRANSFER command needs to be executed while in ON/U0 link
    state (with an exception during register initialization). Don't use
    dwc->link_state to check this since the driver only tracks the link
    state when the link state change interrupt is enabled. Check the link
    state from DSTS register instead.
    
    Note that often the host already brings the device out of low power
    before it sends/requests the next transfer. So, the user won't see any
    issue when the device starts transfer then. This issue is more
    noticeable in cases when the device delays starting transfer, which can
    happen during delayed control status after the host put the device in
    low power.
    
    Fixes: 799e9dc82968 ("usb: dwc3: gadget: conditionally disable Link State change events")
    Cc: <stable@vger.kernel.org>
    Acked-by: Felipe Balbi <balbi@kernel.org>
    Signed-off-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
    Link: https://lore.kernel.org/r/bcefaa9ecbc3e1936858c0baa14de6612960e909.1618884221.git.Thinh.Nguyen@synopsys.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index f28eb541fad3..7a89c9a7c8df 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -304,13 +304,12 @@ int dwc3_send_gadget_ep_cmd(struct dwc3_ep *dep, unsigned cmd,
 	}
 
 	if (DWC3_DEPCMD_CMD(cmd) == DWC3_DEPCMD_STARTTRANSFER) {
-		int		needs_wakeup;
+		int link_state;
 
-		needs_wakeup = (dwc->link_state == DWC3_LINK_STATE_U1 ||
-				dwc->link_state == DWC3_LINK_STATE_U2 ||
-				dwc->link_state == DWC3_LINK_STATE_U3);
-
-		if (unlikely(needs_wakeup)) {
+		link_state = dwc3_gadget_get_link_state(dwc);
+		if (link_state == DWC3_LINK_STATE_U1 ||
+		    link_state == DWC3_LINK_STATE_U2 ||
+		    link_state == DWC3_LINK_STATE_U3) {
 			ret = __dwc3_gadget_wakeup(dwc);
 			dev_WARN_ONCE(dwc->dev, ret, "wakeup failed --> %d\n",
 					ret);
@@ -1674,6 +1673,8 @@ static int __dwc3_gadget_wakeup(struct dwc3 *dwc)
 	case DWC3_LINK_STATE_RESET:
 	case DWC3_LINK_STATE_RX_DET:	/* in HS, means Early Suspend */
 	case DWC3_LINK_STATE_U3:	/* in HS, means SUSPEND */
+	case DWC3_LINK_STATE_U2:	/* in HS, means Sleep (L1) */
+	case DWC3_LINK_STATE_U1:
 	case DWC3_LINK_STATE_RESUME:
 		break;
 	default:

commit a8c6efee24c466447a19d255b686099d8b6e9817
Author: Dean Anderson <dean@sensoray.com>
Date:   Wed Mar 17 15:41:09 2021 -0700

    usb: gadget/function/f_fs string table fix for multiple languages
    
    commit 55b74ce7d2ce0b0058f3e08cab185a0afacfe39e upstream.
    
    Fixes bug with the handling of more than one language in
    the string table in f_fs.c.
    str_count was not reset for subsequent language codes.
    str_count-- "rolls under" and processes u32 max strings on
    the processing of the second language entry.
    The existing bug can be reproduced by adding a second language table
    to the structure "strings" in tools/usb/ffs-test.c.
    
    Signed-off-by: Dean Anderson <dean@sensoray.com>
    Link: https://lore.kernel.org/r/20210317224109.21534-1-dean@sensoray.com
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c
index 5c1846d1372e..dcb432860d06 100644
--- a/drivers/usb/gadget/function/f_fs.c
+++ b/drivers/usb/gadget/function/f_fs.c
@@ -2553,6 +2553,7 @@ static int __ffs_data_got_strings(struct ffs_data *ffs,
 
 	do { /* lang_count > 0 so we can use do-while */
 		unsigned needed = needed_count;
+		u32 str_per_lang = str_count;
 
 		if (unlikely(len < 3))
 			goto error_free;
@@ -2588,7 +2589,7 @@ static int __ffs_data_got_strings(struct ffs_data *ffs,
 
 			data += length + 1;
 			len -= length + 1;
-		} while (--str_count);
+		} while (--str_per_lang);
 
 		s->id = 0;   /* terminator */
 		s->s = NULL;

commit 27876060e2995440cb61a06c341d1592098f29c0
Author: Hemant Kumar <hemantk@codeaurora.org>
Date:   Wed Apr 21 12:47:32 2021 -0700

    usb: gadget: Fix double free of device descriptor pointers
    
    commit 43c4cab006f55b6ca549dd1214e22f5965a8675f upstream.
    
    Upon driver unbind usb_free_all_descriptors() function frees all
    speed descriptor pointers without setting them to NULL. In case
    gadget speed changes (i.e from super speed plus to super speed)
    after driver unbind only upto super speed descriptor pointers get
    populated. Super speed plus desc still holds the stale (already
    freed) pointer. Fix this issue by setting all descriptor pointers
    to NULL after freeing them in usb_free_all_descriptors().
    
    Fixes: f5c61225cf29 ("usb: gadget: Update function for SuperSpeedPlus")
    cc: stable@vger.kernel.org
    Reviewed-by: Peter Chen <peter.chen@kernel.org>
    Signed-off-by: Hemant Kumar <hemantk@codeaurora.org>
    Signed-off-by: Wesley Cheng <wcheng@codeaurora.org>
    Link: https://lore.kernel.org/r/1619034452-17334-1-git-send-email-wcheng@codeaurora.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/gadget/config.c b/drivers/usb/gadget/config.c
index 2d115353424c..8bb25773b61e 100644
--- a/drivers/usb/gadget/config.c
+++ b/drivers/usb/gadget/config.c
@@ -194,9 +194,13 @@ EXPORT_SYMBOL_GPL(usb_assign_descriptors);
 void usb_free_all_descriptors(struct usb_function *f)
 {
 	usb_free_descriptors(f->fs_descriptors);
+	f->fs_descriptors = NULL;
 	usb_free_descriptors(f->hs_descriptors);
+	f->hs_descriptors = NULL;
 	usb_free_descriptors(f->ss_descriptors);
+	f->ss_descriptors = NULL;
 	usb_free_descriptors(f->ssp_descriptors);
+	f->ssp_descriptors = NULL;
 }
 EXPORT_SYMBOL_GPL(usb_free_all_descriptors);
 

commit f891b65c7ad087af9099e70ccf8f060b9abda561
Author: Anirudh Rayabharam <mail@anirudhrb.com>
Date:   Mon Apr 19 09:07:08 2021 +0530

    usb: gadget: dummy_hcd: fix gpf in gadget_setup
    
    commit 4a5d797a9f9c4f18585544237216d7812686a71f upstream.
    
    Fix a general protection fault reported by syzbot due to a race between
    gadget_setup() and gadget_unbind() in raw_gadget.
    
    The gadget core is supposed to guarantee that there won't be any more
    callbacks to the gadget driver once the driver's unbind routine is
    called. That guarantee is enforced in usb_gadget_remove_driver as
    follows:
    
            usb_gadget_disconnect(udc->gadget);
            if (udc->gadget->irq)
                    synchronize_irq(udc->gadget->irq);
            udc->driver->unbind(udc->gadget);
            usb_gadget_udc_stop(udc);
    
    usb_gadget_disconnect turns off the pullup resistor, telling the host
    that the gadget is no longer connected and preventing the transmission
    of any more USB packets. Any packets that have already been received
    are sure to processed by the UDC driver's interrupt handler by the time
    synchronize_irq returns.
    
    But this doesn't work with dummy_hcd, because dummy_hcd doesn't use
    interrupts; it uses a timer instead. It does have code to emulate the
    effect of synchronize_irq, but that code doesn't get invoked at the
    right time -- it currently runs in usb_gadget_udc_stop, after the unbind
    callback instead of before. Indeed, there's no way for
    usb_gadget_remove_driver to invoke this code before the unbind callback.
    
    To fix this, move the synchronize_irq() emulation code to dummy_pullup
    so that it runs before unbind. Also, add a comment explaining why it is
    necessary to have it there.
    
    Reported-by: syzbot+eb4674092e6cc8d9e0bd@syzkaller.appspotmail.com
    Suggested-by: Alan Stern <stern@rowland.harvard.edu>
    Acked-by: Alan Stern <stern@rowland.harvard.edu>
    Signed-off-by: Anirudh Rayabharam <mail@anirudhrb.com>
    Link: https://lore.kernel.org/r/20210419033713.3021-1-mail@anirudhrb.com
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/gadget/udc/dummy_hcd.c b/drivers/usb/gadget/udc/dummy_hcd.c
index fdbce8529dbb..d25d25da6875 100644
--- a/drivers/usb/gadget/udc/dummy_hcd.c
+++ b/drivers/usb/gadget/udc/dummy_hcd.c
@@ -914,6 +914,21 @@ static int dummy_pullup(struct usb_gadget *_gadget, int value)
 	spin_lock_irqsave(&dum->lock, flags);
 	dum->pullup = (value != 0);
 	set_link_state(dum_hcd);
+	if (value == 0) {
+		/*
+		 * Emulate synchronize_irq(): wait for callbacks to finish.
+		 * This seems to be the best place to emulate the call to
+		 * synchronize_irq() that's in usb_gadget_remove_driver().
+		 * Doing it in dummy_udc_stop() would be too late since it
+		 * is called after the unbind callback and unbind shouldn't
+		 * be invoked until all the other callbacks are finished.
+		 */
+		while (dum->callback_usage > 0) {
+			spin_unlock_irqrestore(&dum->lock, flags);
+			usleep_range(1000, 2000);
+			spin_lock_irqsave(&dum->lock, flags);
+		}
+	}
 	spin_unlock_irqrestore(&dum->lock, flags);
 
 	usb_hcd_poll_rh_status(dummy_hcd_to_hcd(dum_hcd));
@@ -1015,14 +1030,6 @@ static int dummy_udc_stop(struct usb_gadget *g)
 	spin_lock_irq(&dum->lock);
 	dum->ints_enabled = 0;
 	stop_activity(dum);
-
-	/* emulate synchronize_irq(): wait for callbacks to finish */
-	while (dum->callback_usage > 0) {
-		spin_unlock_irq(&dum->lock);
-		usleep_range(1000, 2000);
-		spin_lock_irq(&dum->lock);
-	}
-
 	dum->driver = NULL;
 	spin_unlock_irq(&dum->lock);
 

commit cd89f79be5d553c78202f686e8e4caa5fbe94e98
Author: Peilin Ye <yepeilin.cs@gmail.com>
Date:   Fri Dec 11 09:30:39 2020 +0100

    media: dvbdev: Fix memory leak in dvb_media_device_free()
    
    commit bf9a40ae8d722f281a2721779595d6df1c33a0bf upstream.
    
    dvb_media_device_free() is leaking memory. Free `dvbdev->adapter->conn`
    before setting it to NULL, as documented in include/media/media-device.h:
    "The media_entity instance itself must be freed explicitly by the driver
    if required."
    
    Link: https://syzkaller.appspot.com/bug?id=9bbe4b842c98f0ed05c5eed77a226e9de33bf298
    
    Link: https://lore.kernel.org/linux-media/20201211083039.521617-1-yepeilin.cs@gmail.com
    Cc: stable@vger.kernel.org
    Fixes: 0230d60e4661 ("[media] dvbdev: Add RF connector if needed")
    Reported-by: syzbot+7f09440acc069a0d38ac@syzkaller.appspotmail.com
    Signed-off-by: Peilin Ye <yepeilin.cs@gmail.com>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c
index 04dc2f4bc7aa..d8f19a4d214a 100644
--- a/drivers/media/dvb-core/dvbdev.c
+++ b/drivers/media/dvb-core/dvbdev.c
@@ -241,6 +241,7 @@ static void dvb_media_device_free(struct dvb_device *dvbdev)
 
 	if (dvbdev->adapter->conn) {
 		media_device_unregister_entity(dvbdev->adapter->conn);
+		kfree(dvbdev->adapter->conn);
 		dvbdev->adapter->conn = NULL;
 		kfree(dvbdev->adapter->conn_pads);
 		dvbdev->adapter->conn_pads = NULL;

commit 353b8d3bd324ecc3097d09d8c405d25e0f75ec7f
Author: Fengnan Chang <changfengnan@vivo.com>
Date:   Fri Apr 2 18:16:31 2021 +0800

    ext4: fix error code in ext4_commit_super
    
    commit f88f1466e2a2e5ca17dfada436d3efa1b03a3972 upstream.
    
    We should set the error code when ext4_commit_super check argument failed.
    Found in code review.
    Fixes: c4be0c1dc4cdc ("filesystem freeze: add error handling of write_super_lockfs/unlockfs").
    
    Cc: stable@kernel.org
    Signed-off-by: Fengnan Chang <changfengnan@vivo.com>
    Reviewed-by: Andreas Dilger <adilger@dilger.ca>
    Link: https://lore.kernel.org/r/20210402101631.561-1-changfengnan@vivo.com
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 715327ac138e..535ab6713732 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -4959,8 +4959,10 @@ static int ext4_commit_super(struct super_block *sb, int sync)
 	struct buffer_head *sbh = EXT4_SB(sb)->s_sbh;
 	int error = 0;
 
-	if (!sbh || block_device_ejected(sb))
-		return error;
+	if (!sbh)
+		return -EINVAL;
+	if (block_device_ejected(sb))
+		return -ENODEV;
 
 	/*
 	 * If the file system is mounted read-only, don't update the

commit 9d4b68c2c91b0babbb06555ebfa5c2d3492a7565
Author: Zhang Yi <yi.zhang@huawei.com>
Date:   Wed Mar 31 11:31:38 2021 +0800

    ext4: do not set SB_ACTIVE in ext4_orphan_cleanup()
    
    commit 72ffb49a7b623c92a37657eda7cc46a06d3e8398 upstream.
    
    When CONFIG_QUOTA is enabled, if we failed to mount the filesystem due
    to some error happens behind ext4_orphan_cleanup(), it will end up
    triggering a after free issue of super_block. The problem is that
    ext4_orphan_cleanup() will set SB_ACTIVE flag if CONFIG_QUOTA is
    enabled, after we cleanup the truncated inodes, the last iput() will put
    them into the lru list, and these inodes' pages may probably dirty and
    will be write back by the writeback thread, so it could be raced by
    freeing super_block in the error path of mount_bdev().
    
    After check the setting of SB_ACTIVE flag in ext4_orphan_cleanup(), it
    was used to ensure updating the quota file properly, but evict inode and
    trash data immediately in the last iput does not affect the quotafile,
    so setting the SB_ACTIVE flag seems not required[1]. Fix this issue by
    just remove the SB_ACTIVE setting.
    
    [1] https://lore.kernel.org/linux-ext4/99cce8ca-e4a0-7301-840f-2ace67c551f3@huawei.com/T/#m04990cfbc4f44592421736b504afcc346b2a7c00
    
    Cc: stable@kernel.org
    Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
    Tested-by: Jan Kara <jack@suse.cz>
    Reviewed-by: Jan Kara <jack@suse.cz>
    Link: https://lore.kernel.org/r/20210331033138.918975-1-yi.zhang@huawei.com
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index e9e9f09f5370..715327ac138e 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -2629,9 +2629,6 @@ static void ext4_orphan_cleanup(struct super_block *sb,
 		sb->s_flags &= ~SB_RDONLY;
 	}
 #ifdef CONFIG_QUOTA
-	/* Needed for iput() to work correctly and not trash data */
-	sb->s_flags |= SB_ACTIVE;
-
 	/*
 	 * Turn on quotas which were not enabled for read-only mounts if
 	 * filesystem has quota feature, so that they are updated correctly.

commit 7687f5aba0f50c7ff8040e506bae184e59c8e7b8
Author: Zhang Yi <yi.zhang@huawei.com>
Date:   Wed Mar 31 20:15:16 2021 +0800

    ext4: fix check to prevent false positive report of incorrect used inodes
    
    commit a149d2a5cabbf6507a7832a1c4fd2593c55fd450 upstream.
    
    Commit <50122847007> ("ext4: fix check to prevent initializing reserved
    inodes") check the block group zero and prevent initializing reserved
    inodes. But in some special cases, the reserved inode may not all belong
    to the group zero, it may exist into the second group if we format
    filesystem below.
    
      mkfs.ext4 -b 4096 -g 8192 -N 1024 -I 4096 /dev/sda
    
    So, it will end up triggering a false positive report of a corrupted
    file system. This patch fix it by avoid check reserved inodes if no free
    inode blocks will be zeroed.
    
    Cc: stable@kernel.org
    Fixes: 50122847007 ("ext4: fix check to prevent initializing reserved inodes")
    Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
    Suggested-by: Jan Kara <jack@suse.cz>
    Link: https://lore.kernel.org/r/20210331121516.2243099-1-yi.zhang@huawei.com
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
index 8876eaad10f6..16abe23b1417 100644
--- a/fs/ext4/ialloc.c
+++ b/fs/ext4/ialloc.c
@@ -1358,6 +1358,7 @@ int ext4_init_inode_table(struct super_block *sb, ext4_group_t group,
 	handle_t *handle;
 	ext4_fsblk_t blk;
 	int num, ret = 0, used_blks = 0;
+	unsigned long used_inos = 0;
 
 	/* This should not happen, but just to be sure check this */
 	if (sb_rdonly(sb)) {
@@ -1388,22 +1389,37 @@ int ext4_init_inode_table(struct super_block *sb, ext4_group_t group,
 	 * used inodes so we need to skip blocks with used inodes in
 	 * inode table.
 	 */
-	if (!(gdp->bg_flags & cpu_to_le16(EXT4_BG_INODE_UNINIT)))
-		used_blks = DIV_ROUND_UP((EXT4_INODES_PER_GROUP(sb) -
-			    ext4_itable_unused_count(sb, gdp)),
-			    sbi->s_inodes_per_block);
-
-	if ((used_blks < 0) || (used_blks > sbi->s_itb_per_group) ||
-	    ((group == 0) && ((EXT4_INODES_PER_GROUP(sb) -
-			       ext4_itable_unused_count(sb, gdp)) <
-			      EXT4_FIRST_INO(sb)))) {
-		ext4_error(sb, "Something is wrong with group %u: "
-			   "used itable blocks: %d; "
-			   "itable unused count: %u",
-			   group, used_blks,
-			   ext4_itable_unused_count(sb, gdp));
-		ret = 1;
-		goto err_out;
+	if (!(gdp->bg_flags & cpu_to_le16(EXT4_BG_INODE_UNINIT))) {
+		used_inos = EXT4_INODES_PER_GROUP(sb) -
+			    ext4_itable_unused_count(sb, gdp);
+		used_blks = DIV_ROUND_UP(used_inos, sbi->s_inodes_per_block);
+
+		/* Bogus inode unused count? */
+		if (used_blks < 0 || used_blks > sbi->s_itb_per_group) {
+			ext4_error(sb, "Something is wrong with group %u: "
+				   "used itable blocks: %d; "
+				   "itable unused count: %u",
+				   group, used_blks,
+				   ext4_itable_unused_count(sb, gdp));
+			ret = 1;
+			goto err_out;
+		}
+
+		used_inos += group * EXT4_INODES_PER_GROUP(sb);
+		/*
+		 * Are there some uninitialized inodes in the inode table
+		 * before the first normal inode?
+		 */
+		if ((used_blks != sbi->s_itb_per_group) &&
+		     (used_inos < EXT4_FIRST_INO(sb))) {
+			ext4_error(sb, "Something is wrong with group %u: "
+				   "itable unused count: %u; "
+				   "itables initialized count: %ld",
+				   group, ext4_itable_unused_count(sb, gdp),
+				   used_inos);
+			ret = 1;
+			goto err_out;
+		}
 	}
 
 	blk = ext4_inode_table(sb, gdp) + used_blks;

commit a921d014868c5ab97f286efcf3149999d76765be
Author: Jian Cai <jiancai@google.com>
Date:   Wed May 5 18:25:08 2021 -0700

    arm64: vdso: remove commas between macro name and arguments
    
    LLVM's integrated assembler appears to assume an argument with default
    value is passed whenever it sees a comma right after the macro name.
    It will be fine if the number of following arguments is one less than
    the number of parameters specified in the macro definition. Otherwise,
    it fails. For example, the following code works:
    
    $ cat foo.s
    .macro  foo arg1=2, arg2=4
            ldr r0, [r1, #\arg1]
            ldr r0, [r1, #\arg2]
    .endm
    
    foo, arg2=8
    
    $ llvm-mc -triple=armv7a -filetype=obj foo.s -o ias.o
    arm-linux-gnueabihf-objdump -dr ias.o
    
    ias.o:     file format elf32-littlearm
    
    Disassembly of section .text:
    
    00000000 <.text>:
       0: e5910001 ldr r0, [r1, #2]
       4: e5910003 ldr r0, [r1, #8]
    
    While the the following code would fail:
    
    $ cat foo.s
    .macro  foo arg1=2, arg2=4
            ldr r0, [r1, #\arg1]
            ldr r0, [r1, #\arg2]
    .endm
    
    foo, arg1=2, arg2=8
    
    $ llvm-mc -triple=armv7a -filetype=obj foo.s -o ias.o
    foo.s:6:14: error: too many positional arguments
    foo, arg1=2, arg2=8
    
    This causes build failures as follows:
    
    arch/arm64/kernel/vdso/gettimeofday.S:230:24: error: too many positional
    arguments
     clock_gettime_return, shift=1
                           ^
    arch/arm64/kernel/vdso/gettimeofday.S:253:24: error: too many positional
    arguments
     clock_gettime_return, shift=1
                           ^
    arch/arm64/kernel/vdso/gettimeofday.S:274:24: error: too many positional
    arguments
     clock_gettime_return, shift=1
    
    This error is not in mainline because commit 28b1a824a4f4 ("arm64: vdso:
    Substitute gettimeofday() with C implementation") rewrote this assembler
    file in C as part of a 25 patch series that is unsuitable for stable.
    Just remove the comma in the clock_gettime_return invocations in 4.19 so
    that GNU as and LLVM's integrated assembler work the same.
    
    Link:
    https://github.com/ClangBuiltLinux/linux/issues/1349
    
    Suggested-by: Nathan Chancellor <nathan@kernel.org>
    Reviewed-by: Nathan Chancellor <nathan@kernel.org>
    Signed-off-by: Jian Cai <jiancai@google.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm64/kernel/vdso/gettimeofday.S b/arch/arm64/kernel/vdso/gettimeofday.S
index 856fee6d3512..b6faf8b5d1fe 100644
--- a/arch/arm64/kernel/vdso/gettimeofday.S
+++ b/arch/arm64/kernel/vdso/gettimeofday.S
@@ -227,7 +227,7 @@ realtime:
 	seqcnt_check fail=realtime
 	get_ts_realtime res_sec=x10, res_nsec=x11, \
 		clock_nsec=x15, xtime_sec=x13, xtime_nsec=x14, nsec_to_sec=x9
-	clock_gettime_return, shift=1
+	clock_gettime_return shift=1
 
 	ALIGN
 monotonic:
@@ -250,7 +250,7 @@ monotonic:
 		clock_nsec=x15, xtime_sec=x13, xtime_nsec=x14, nsec_to_sec=x9
 
 	add_ts sec=x10, nsec=x11, ts_sec=x3, ts_nsec=x4, nsec_to_sec=x9
-	clock_gettime_return, shift=1
+	clock_gettime_return shift=1
 
 	ALIGN
 monotonic_raw:
@@ -271,7 +271,7 @@ monotonic_raw:
 		clock_nsec=x15, nsec_to_sec=x9
 
 	add_ts sec=x10, nsec=x11, ts_sec=x13, ts_nsec=x14, nsec_to_sec=x9
-	clock_gettime_return, shift=1
+	clock_gettime_return shift=1
 
 	ALIGN
 realtime_coarse:

commit 1a852780d9d93378ae4f7d7d57213bc114c6873f
Author: Chen Jun <chenjun102@huawei.com>
Date:   Wed Apr 14 03:04:49 2021 +0000

    posix-timers: Preserve return value in clock_adjtime32()
    
    commit 2d036dfa5f10df9782f5278fc591d79d283c1fad upstream.
    
    The return value on success (>= 0) is overwritten by the return value of
    put_old_timex32(). That works correct in the fault case, but is wrong for
    the success case where put_old_timex32() returns 0.
    
    Just check the return value of put_old_timex32() and return -EFAULT in case
    it is not zero.
    
    [ tglx: Massage changelog ]
    
    Fixes: 3a4d44b61625 ("ntp: Move adjtimex related compat syscalls to native counterparts")
    Signed-off-by: Chen Jun <chenjun102@huawei.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Richard Cochran <richardcochran@gmail.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210414030449.90692-1-chenjun102@huawei.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c
index 5a01c4fdbfef..48758108e055 100644
--- a/kernel/time/posix-timers.c
+++ b/kernel/time/posix-timers.c
@@ -1166,8 +1166,8 @@ COMPAT_SYSCALL_DEFINE2(clock_adjtime, clockid_t, which_clock,
 
 	err = kc->clock_adj(which_clock, &ktx);
 
-	if (err >= 0)
-		err = compat_put_timex(utp, &ktx);
+	if (err >= 0 && compat_put_timex(utp, &ktx))
+		return -EFAULT;
 
 	return err;
 }

commit f724a7453bbfb8bb917735e315d5d902c0b67c33
Author: Thomas Gleixner <tglx@linutronix.de>
Date:   Thu Apr 22 21:44:18 2021 +0200

    Revert 337f13046ff0 ("futex: Allow FUTEX_CLOCK_REALTIME with FUTEX_WAIT op")
    
    commit 4fbf5d6837bf81fd7a27d771358f4ee6c4f243f8 upstream.
    
    The FUTEX_WAIT operand has historically a relative timeout which means that
    the clock id is irrelevant as relative timeouts on CLOCK_REALTIME are not
    subject to wall clock changes and therefore are mapped by the kernel to
    CLOCK_MONOTONIC for simplicity.
    
    If a caller would set FUTEX_CLOCK_REALTIME for FUTEX_WAIT the timeout is
    still treated relative vs. CLOCK_MONOTONIC and then the wait arms that
    timeout based on CLOCK_REALTIME which is broken and obviously has never
    been used or even tested.
    
    Reject any attempt to use FUTEX_CLOCK_REALTIME with FUTEX_WAIT again.
    
    The desired functionality can be achieved with FUTEX_WAIT_BITSET and a
    FUTEX_BITSET_MATCH_ANY argument.
    
    Fixes: 337f13046ff0 ("futex: Allow FUTEX_CLOCK_REALTIME with FUTEX_WAIT op")
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210422194704.834797921@linutronix.de
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/futex.c b/kernel/futex.c
index 7d0d8a45f9ae..526ebcff5a0a 100644
--- a/kernel/futex.c
+++ b/kernel/futex.c
@@ -3867,8 +3867,7 @@ long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout,
 
 	if (op & FUTEX_CLOCK_REALTIME) {
 		flags |= FLAGS_CLOCKRT;
-		if (cmd != FUTEX_WAIT && cmd != FUTEX_WAIT_BITSET && \
-		    cmd != FUTEX_WAIT_REQUEUE_PI)
+		if (cmd != FUTEX_WAIT_BITSET &&	cmd != FUTEX_WAIT_REQUEUE_PI)
 			return -ENOSYS;
 	}
 

commit 2f24e86bfa44e41413a35345d74e2205d3bb68fb
Author: Yang Yang <yang.yang29@zte.com.cn>
Date:   Thu Jan 28 02:55:35 2021 -0800

    jffs2: check the validity of dstlen in jffs2_zlib_compress()
    
    commit 90ada91f4610c5ef11bc52576516d96c496fc3f1 upstream.
    
    KASAN reports a BUG when download file in jffs2 filesystem.It is
    because when dstlen == 1, cpage_out will write array out of bounds.
    Actually, data will not be compressed in jffs2_zlib_compress() if
    data's length less than 4.
    
    [  393.799778] BUG: KASAN: slab-out-of-bounds in jffs2_rtime_compress+0x214/0x2f0 at addr ffff800062e3b281
    [  393.809166] Write of size 1 by task tftp/2918
    [  393.813526] CPU: 3 PID: 2918 Comm: tftp Tainted: G    B           4.9.115-rt93-EMBSYS-CGEL-6.1.R6-dirty #1
    [  393.823173] Hardware name: LS1043A RDB Board (DT)
    [  393.827870] Call trace:
    [  393.830322] [<ffff20000808c700>] dump_backtrace+0x0/0x2f0
    [  393.835721] [<ffff20000808ca04>] show_stack+0x14/0x20
    [  393.840774] [<ffff2000086ef700>] dump_stack+0x90/0xb0
    [  393.845829] [<ffff20000827b19c>] kasan_object_err+0x24/0x80
    [  393.851402] [<ffff20000827b404>] kasan_report_error+0x1b4/0x4d8
    [  393.857323] [<ffff20000827bae8>] kasan_report+0x38/0x40
    [  393.862548] [<ffff200008279d44>] __asan_store1+0x4c/0x58
    [  393.867859] [<ffff2000084ce2ec>] jffs2_rtime_compress+0x214/0x2f0
    [  393.873955] [<ffff2000084bb3b0>] jffs2_selected_compress+0x178/0x2a0
    [  393.880308] [<ffff2000084bb530>] jffs2_compress+0x58/0x478
    [  393.885796] [<ffff2000084c5b34>] jffs2_write_inode_range+0x13c/0x450
    [  393.892150] [<ffff2000084be0b8>] jffs2_write_end+0x2a8/0x4a0
    [  393.897811] [<ffff2000081f3008>] generic_perform_write+0x1c0/0x280
    [  393.903990] [<ffff2000081f5074>] __generic_file_write_iter+0x1c4/0x228
    [  393.910517] [<ffff2000081f5210>] generic_file_write_iter+0x138/0x288
    [  393.916870] [<ffff20000829ec1c>] __vfs_write+0x1b4/0x238
    [  393.922181] [<ffff20000829ff00>] vfs_write+0xd0/0x238
    [  393.927232] [<ffff2000082a1ba8>] SyS_write+0xa0/0x110
    [  393.932283] [<ffff20000808429c>] __sys_trace_return+0x0/0x4
    [  393.937851] Object at ffff800062e3b280, in cache kmalloc-64 size: 64
    [  393.944197] Allocated:
    [  393.946552] PID = 2918
    [  393.948913]  save_stack_trace_tsk+0x0/0x220
    [  393.953096]  save_stack_trace+0x18/0x20
    [  393.956932]  kasan_kmalloc+0xd8/0x188
    [  393.960594]  __kmalloc+0x144/0x238
    [  393.963994]  jffs2_selected_compress+0x48/0x2a0
    [  393.968524]  jffs2_compress+0x58/0x478
    [  393.972273]  jffs2_write_inode_range+0x13c/0x450
    [  393.976889]  jffs2_write_end+0x2a8/0x4a0
    [  393.980810]  generic_perform_write+0x1c0/0x280
    [  393.985251]  __generic_file_write_iter+0x1c4/0x228
    [  393.990040]  generic_file_write_iter+0x138/0x288
    [  393.994655]  __vfs_write+0x1b4/0x238
    [  393.998228]  vfs_write+0xd0/0x238
    [  394.001543]  SyS_write+0xa0/0x110
    [  394.004856]  __sys_trace_return+0x0/0x4
    [  394.008684] Freed:
    [  394.010691] PID = 2918
    [  394.013051]  save_stack_trace_tsk+0x0/0x220
    [  394.017233]  save_stack_trace+0x18/0x20
    [  394.021069]  kasan_slab_free+0x88/0x188
    [  394.024902]  kfree+0x6c/0x1d8
    [  394.027868]  jffs2_sum_write_sumnode+0x2c4/0x880
    [  394.032486]  jffs2_do_reserve_space+0x198/0x598
    [  394.037016]  jffs2_reserve_space+0x3f8/0x4d8
    [  394.041286]  jffs2_write_inode_range+0xf0/0x450
    [  394.045816]  jffs2_write_end+0x2a8/0x4a0
    [  394.049737]  generic_perform_write+0x1c0/0x280
    [  394.054179]  __generic_file_write_iter+0x1c4/0x228
    [  394.058968]  generic_file_write_iter+0x138/0x288
    [  394.063583]  __vfs_write+0x1b4/0x238
    [  394.067157]  vfs_write+0xd0/0x238
    [  394.070470]  SyS_write+0xa0/0x110
    [  394.073783]  __sys_trace_return+0x0/0x4
    [  394.077612] Memory state around the buggy address:
    [  394.082404]  ffff800062e3b180: 00 00 00 00 00 00 00 00 fc fc fc fc fc fc fc fc
    [  394.089623]  ffff800062e3b200: 00 00 00 00 00 00 00 00 fc fc fc fc fc fc fc fc
    [  394.096842] >ffff800062e3b280: 01 fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    [  394.104056]                    ^
    [  394.107283]  ffff800062e3b300: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
    [  394.114502]  ffff800062e3b380: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
    [  394.121718] ==================================================================
    
    Signed-off-by: Yang Yang <yang.yang29@zte.com.cn>
    Cc: Joel Stanley <joel@jms.id.au>
    Signed-off-by: Richard Weinberger <richard@nod.at>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/jffs2/compr_rtime.c b/fs/jffs2/compr_rtime.c
index 406d9cc84ba8..79e771ab624f 100644
--- a/fs/jffs2/compr_rtime.c
+++ b/fs/jffs2/compr_rtime.c
@@ -37,6 +37,9 @@ static int jffs2_rtime_compress(unsigned char *data_in,
 	int outpos = 0;
 	int pos=0;
 
+	if (*dstlen <= 3)
+		return -1;
+
 	memset(positions,0,sizeof(positions));
 
 	while (pos < (*sourcelen) && outpos <= (*dstlen)-2) {

commit deeb620f59251bb51c9f45f1278616b8f22c4c44
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date:   Tue Apr 27 17:05:53 2021 -0700

    Fix misc new gcc warnings
    
    commit e7c6e405e171fb33990a12ecfd14e6500d9e5cf2 upstream.
    
    It seems like Fedora 34 ends up enabling a few new gcc warnings, notably
    "-Wstringop-overread" and "-Warray-parameter".
    
    Both of them cause what seem to be valid warnings in the kernel, where
    we have array size mismatches in function arguments (that are no longer
    just silently converted to a pointer to element, but actually checked).
    
    This fixes most of the trivial ones, by making the function declaration
    match the function definition, and in the case of intel_pm.c, removing
    the over-specified array size from the argument declaration.
    
    At least one 'stringop-overread' warning remains in the i915 driver, but
    that one doesn't have the same obvious trivial fix, and may or may not
    actually be indicative of a bug.
    
    [ It was a mistake to upgrade one of my machines to Fedora 34 while
      being busy with the merge window, but if this is the extent of the
      compiler upgrade problems, things are better than usual    - Linus ]
    
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Andrey Zhizhikin <andrey.z@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 8d731eb1de69..aa8d2aca0f02 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -2951,7 +2951,7 @@ int ilk_wm_max_level(const struct drm_i915_private *dev_priv)
 
 static void intel_print_wm_latency(struct drm_i915_private *dev_priv,
 				   const char *name,
-				   const uint16_t wm[8])
+				   const uint16_t wm[])
 {
 	int level, max_level = ilk_wm_max_level(dev_priv);
 
diff --git a/drivers/media/usb/dvb-usb/dvb-usb.h b/drivers/media/usb/dvb-usb/dvb-usb.h
index 317ed6a82d19..89702eef66aa 100644
--- a/drivers/media/usb/dvb-usb/dvb-usb.h
+++ b/drivers/media/usb/dvb-usb/dvb-usb.h
@@ -475,7 +475,7 @@ extern int __must_check
 dvb_usb_generic_write(struct dvb_usb_device *, u8 *, u16);
 
 /* commonly used remote control parsing */
-extern int dvb_usb_nec_rc_key_to_event(struct dvb_usb_device *, u8[], u32 *, int *);
+extern int dvb_usb_nec_rc_key_to_event(struct dvb_usb_device *, u8[5], u32 *, int *);
 
 /* commonly used firmware download types and function */
 struct hexline {
diff --git a/include/scsi/libfcoe.h b/include/scsi/libfcoe.h
index 58507c7783cf..eafccb2d4d6f 100644
--- a/include/scsi/libfcoe.h
+++ b/include/scsi/libfcoe.h
@@ -261,7 +261,7 @@ int fcoe_ctlr_recv_flogi(struct fcoe_ctlr *, struct fc_lport *,
 			 struct fc_frame *);
 
 /* libfcoe funcs */
-u64 fcoe_wwn_from_mac(unsigned char mac[], unsigned int, unsigned int);
+u64 fcoe_wwn_from_mac(unsigned char mac[MAX_ADDR_LEN], unsigned int, unsigned int);
 int fcoe_libfc_config(struct fc_lport *, struct fcoe_ctlr *,
 		      const struct libfc_function_template *, int init_fcp);
 u32 fcoe_fc_crc(struct fc_frame *fp);
diff --git a/net/bluetooth/ecdh_helper.h b/net/bluetooth/ecdh_helper.h
index a6f8d03d4aaf..830723971cf8 100644
--- a/net/bluetooth/ecdh_helper.h
+++ b/net/bluetooth/ecdh_helper.h
@@ -25,6 +25,6 @@
 
 int compute_ecdh_secret(struct crypto_kpp *tfm, const u8 pair_public_key[64],
 			u8 secret[32]);
-int set_ecdh_privkey(struct crypto_kpp *tfm, const u8 *private_key);
+int set_ecdh_privkey(struct crypto_kpp *tfm, const u8 private_key[32]);
 int generate_ecdh_public_key(struct crypto_kpp *tfm, u8 public_key[64]);
 int generate_ecdh_keys(struct crypto_kpp *tfm, u8 public_key[64]);

commit 2f34dd12fd7a28888286924d74c0313532bc52d8
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Mon Mar 22 17:02:41 2021 +0100

    security: commoncap: fix -Wstringop-overread warning
    
    commit 82e5d8cc768b0c7b03c551a9ab1f8f3f68d5f83f upstream.
    
    gcc-11 introdces a harmless warning for cap_inode_getsecurity:
    
    security/commoncap.c: In function ?cap_inode_getsecurity??
    security/commoncap.c:440:33: error: ?memcpy??reading 16 bytes from a region of size 0 [-Werror=stringop-overread]
      440 |                                 memcpy(&nscap->data, &cap->data, sizeof(__le32) * 2 * VFS_CAP_U32);
          |                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    The problem here is that tmpbuf is initialized to NULL, so gcc assumes
    it is not accessible unless it gets set by vfs_getxattr_alloc().  This is
    a legitimate warning as far as I can tell, but the code is correct since
    it correctly handles the error when that function fails.
    
    Add a separate NULL check to tell gcc about it as well.
    
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
    Signed-off-by: James Morris <jamorris@linux.microsoft.com>
    Cc: Andrey Zhizhikin <andrey.z@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/security/commoncap.c b/security/commoncap.c
index a1dee0ab345a..876cfe01d939 100644
--- a/security/commoncap.c
+++ b/security/commoncap.c
@@ -397,7 +397,7 @@ int cap_inode_getsecurity(struct inode *inode, const char *name, void **buffer,
 				 &tmpbuf, size, GFP_NOFS);
 	dput(dentry);
 
-	if (ret < 0)
+	if (ret < 0 || !tmpbuf)
 		return ret;
 
 	fs_ns = inode->i_sb->s_user_ns;

commit 514666bb548d39b7a63814858f1be17becb49461
Author: Heinz Mauelshagen <heinzm@redhat.com>
Date:   Wed Apr 21 23:32:36 2021 +0200

    dm raid: fix inconclusive reshape layout on fast raid4/5/6 table reload sequences
    
    commit f99a8e4373eeacb279bc9696937a55adbff7a28a upstream.
    
    If fast table reloads occur during an ongoing reshape of raid4/5/6
    devices the target may race reading a superblock vs the the MD resync
    thread; causing an inconclusive reshape state to be read in its
    constructor.
    
    lvm2 test lvconvert-raid-reshape-stripes-load-reload.sh can cause
    BUG_ON() to trigger in md_run(), e.g.:
    "kernel BUG at drivers/md/raid5.c:7567!".
    
    Scenario triggering the bug:
    
    1. the MD sync thread calls end_reshape() from raid5_sync_request()
       when done reshaping. However end_reshape() _only_ updates the
       reshape position to MaxSector keeping the changed layout
       configuration though (i.e. any delta disks, chunk sector or RAID
       algorithm changes). That inconclusive configuration is stored in
       the superblock.
    
    2. dm-raid constructs a mapping, loading named inconsistent superblock
       as of step 1 before step 3 is able to finish resetting the reshape
       state completely, and calls md_run() which leads to mentioned bug
       in raid5.c.
    
    3. the MD RAID personality's finish_reshape() is called; which resets
       the reshape information on chunk sectors, delta disks, etc. This
       explains why the bug is rarely seen on multi-core machines, as MD's
       finish_reshape() superblock update races with the dm-raid
       constructor's superblock load in step 2.
    
    Fix identifies inconclusive superblock content in the dm-raid
    constructor and resets it before calling md_run(), factoring out
    identifying checks into rs_is_layout_change() to share in existing
    rs_reshape_requested() and new rs_reset_inclonclusive_reshape(). Also
    enhance a comment and remove an empty line.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: Heinz Mauelshagen <heinzm@redhat.com>
    Signed-off-by: Mike Snitzer <snitzer@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c
index 23de59a692c5..b16332917220 100644
--- a/drivers/md/dm-raid.c
+++ b/drivers/md/dm-raid.c
@@ -1892,6 +1892,14 @@ static bool rs_takeover_requested(struct raid_set *rs)
 	return rs->md.new_level != rs->md.level;
 }
 
+/* True if layout is set to reshape. */
+static bool rs_is_layout_change(struct raid_set *rs, bool use_mddev)
+{
+	return (use_mddev ? rs->md.delta_disks : rs->delta_disks) ||
+	       rs->md.new_layout != rs->md.layout ||
+	       rs->md.new_chunk_sectors != rs->md.chunk_sectors;
+}
+
 /* True if @rs is requested to reshape by ctr */
 static bool rs_reshape_requested(struct raid_set *rs)
 {
@@ -1904,9 +1912,7 @@ static bool rs_reshape_requested(struct raid_set *rs)
 	if (rs_is_raid0(rs))
 		return false;
 
-	change = mddev->new_layout != mddev->layout ||
-		 mddev->new_chunk_sectors != mddev->chunk_sectors ||
-		 rs->delta_disks;
+	change = rs_is_layout_change(rs, false);
 
 	/* Historical case to support raid1 reshape without delta disks */
 	if (rs_is_raid1(rs)) {
@@ -2843,7 +2849,7 @@ static sector_t _get_reshape_sectors(struct raid_set *rs)
 }
 
 /*
- *
+ * Reshape:
  * - change raid layout
  * - change chunk size
  * - add disks
@@ -2952,6 +2958,20 @@ static int rs_setup_reshape(struct raid_set *rs)
 	return r;
 }
 
+/*
+ * If the md resync thread has updated superblock with max reshape position
+ * at the end of a reshape but not (yet) reset the layout configuration
+ * changes -> reset the latter.
+ */
+static void rs_reset_inconclusive_reshape(struct raid_set *rs)
+{
+	if (!rs_is_reshaping(rs) && rs_is_layout_change(rs, true)) {
+		rs_set_cur(rs);
+		rs->md.delta_disks = 0;
+		rs->md.reshape_backwards = 0;
+	}
+}
+
 /*
  * Enable/disable discard support on RAID set depending on
  * RAID level and discard properties of underlying RAID members.
@@ -3221,11 +3241,14 @@ static int raid_ctr(struct dm_target *ti, unsigned int argc, char **argv)
 	if (r)
 		goto bad;
 
+	/* Catch any inconclusive reshape superblock content. */
+	rs_reset_inconclusive_reshape(rs);
+
 	/* Start raid set read-only and assumed clean to change in raid_resume() */
 	rs->md.ro = 1;
 	rs->md.in_sync = 1;
 
-	/* Keep array frozen */
+	/* Keep array frozen until resume. */
 	set_bit(MD_RECOVERY_FROZEN, &rs->md.recovery);
 
 	/* Has to be held on running the array */
@@ -3239,7 +3262,6 @@ static int raid_ctr(struct dm_target *ti, unsigned int argc, char **argv)
 	}
 
 	r = md_start(&rs->md);
-
 	if (r) {
 		ti->error = "Failed to start raid array";
 		mddev_unlock(&rs->md);

commit a6e17cab00fc5bf85472434c52ac751426257c6f
Author: Paul Clements <paul.clements@us.sios.com>
Date:   Thu Apr 15 17:17:57 2021 -0400

    md/raid1: properly indicate failure when ending a failed write request
    
    commit 2417b9869b81882ab90fd5ed1081a1cb2d4db1dd upstream.
    
    This patch addresses a data corruption bug in raid1 arrays using bitmaps.
    Without this fix, the bitmap bits for the failed I/O end up being cleared.
    
    Since we are in the failure leg of raid1_end_write_request, the request
    either needs to be retried (R1BIO_WriteError) or failed (R1BIO_Degraded).
    
    Fixes: eeba6809d8d5 ("md/raid1: end bio when the device faulty")
    Cc: stable@vger.kernel.org # v5.2+
    Signed-off-by: Paul Clements <paul.clements@us.sios.com>
    Signed-off-by: Song Liu <song@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index abcb4c3a76c1..876d3e1339d1 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -445,6 +445,8 @@ static void raid1_end_write_request(struct bio *bio)
 		if (!test_bit(Faulty, &rdev->flags))
 			set_bit(R1BIO_WriteError, &r1_bio->state);
 		else {
+			/* Fail the request */
+			set_bit(R1BIO_Degraded, &r1_bio->state);
 			/* Finished with this branch */
 			r1_bio->bios[mirror] = NULL;
 			to_put = bio;

commit 315eab77e030b3b9549021855e598e596c1b8992
Author: Stefan Berger <stefanb@linux.ibm.com>
Date:   Wed Mar 10 17:19:16 2021 -0500

    tpm: vtpm_proxy: Avoid reading host log when using a virtual device
    
    commit 9716ac65efc8f780549b03bddf41e60c445d4709 upstream.
    
    Avoid allocating memory and reading the host log when a virtual device
    is used since this log is of no use to that driver. A virtual
    device can be identified through the flag TPM_CHIP_FLAG_VIRTUAL, which
    is only set for the tpm_vtpm_proxy driver.
    
    Cc: stable@vger.kernel.org
    Fixes: 6f99612e2500 ("tpm: Proxy driver for supporting multiple emulated TPMs")
    Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
    Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
    Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/char/tpm/eventlog/common.c b/drivers/char/tpm/eventlog/common.c
index 7d70b654df04..462476467bff 100644
--- a/drivers/char/tpm/eventlog/common.c
+++ b/drivers/char/tpm/eventlog/common.c
@@ -112,6 +112,9 @@ void tpm_bios_log_setup(struct tpm_chip *chip)
 	int log_version;
 	int rc = 0;
 
+	if (chip->flags & TPM_CHIP_FLAG_VIRTUAL)
+		return;
+
 	rc = tpm_read_log(chip);
 	if (rc < 0)
 		return;

commit 49759f78f37956dca39cb5a0c4a8364f8717b7b6
Author: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Date:   Wed Apr 14 20:12:51 2021 +0300

    intel_th: pci: Add Alder Lake-M support
    
    commit 48cb17531b15967d9d3f34c770a25cc6c4ca6ad1 upstream.
    
    This adds support for the Trace Hub in Alder Lake-M PCH.
    
    Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Cc: stable@vger.kernel.org # v4.14+
    Link: https://lore.kernel.org/r/20210414171251.14672-8-alexander.shishkin@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/hwtracing/intel_th/pci.c b/drivers/hwtracing/intel_th/pci.c
index 22ab5b4e36fe..83fab06ccfeb 100644
--- a/drivers/hwtracing/intel_th/pci.c
+++ b/drivers/hwtracing/intel_th/pci.c
@@ -240,6 +240,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = {
 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x1bcc),
 		.driver_data = (kernel_ulong_t)&intel_th_2x,
 	},
+	{
+		/* Alder Lake-M */
+		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x54a6),
+		.driver_data = (kernel_ulong_t)&intel_th_2x,
+	},
 	{
 		/* Rocket Lake CPU */
 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4c19),

commit d16f1359a2d8e1e99071bcf87dc0ac7cade53b43
Author: Tony Ambardar <tony.ambardar@gmail.com>
Date:   Thu Sep 17 06:54:37 2020 -0700

    powerpc: fix EDEADLOCK redefinition error in uapi/asm/errno.h
    
    commit 7de21e679e6a789f3729e8402bc440b623a28eae upstream.
    
    A few archs like powerpc have different errno.h values for macros
    EDEADLOCK and EDEADLK. In code including both libc and linux versions of
    errno.h, this can result in multiple definitions of EDEADLOCK in the
    include chain. Definitions to the same value (e.g. seen with mips) do
    not raise warnings, but on powerpc there are redefinitions changing the
    value, which raise warnings and errors (if using "-Werror").
    
    Guard against these redefinitions to avoid build errors like the following,
    first seen cross-compiling libbpf v5.8.9 for powerpc using GCC 8.4.0 with
    musl 1.1.24:
    
      In file included from ../../arch/powerpc/include/uapi/asm/errno.h:5,
                       from ../../include/linux/err.h:8,
                       from libbpf.c:29:
      ../../include/uapi/asm-generic/errno.h:40: error: "EDEADLOCK" redefined [-Werror]
       #define EDEADLOCK EDEADLK
    
      In file included from toolchain-powerpc_8540_gcc-8.4.0_musl/include/errno.h:10,
                       from libbpf.c:26:
      toolchain-powerpc_8540_gcc-8.4.0_musl/include/bits/errno.h:58: note: this is the location of the previous definition
       #define EDEADLOCK       58
    
      cc1: all warnings being treated as errors
    
    Cc: Stable <stable@vger.kernel.org>
    Reported-by: Rosen Penev <rosenp@gmail.com>
    Signed-off-by: Tony Ambardar <Tony.Ambardar@gmail.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20200917135437.1238787-1-Tony.Ambardar@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/powerpc/include/uapi/asm/errno.h b/arch/powerpc/include/uapi/asm/errno.h
index cc79856896a1..4ba87de32be0 100644
--- a/arch/powerpc/include/uapi/asm/errno.h
+++ b/arch/powerpc/include/uapi/asm/errno.h
@@ -2,6 +2,7 @@
 #ifndef _ASM_POWERPC_ERRNO_H
 #define _ASM_POWERPC_ERRNO_H
 
+#undef	EDEADLOCK
 #include <asm-generic/errno.h>
 
 #undef	EDEADLOCK

commit 7a0ab45166f187f9f7eac66d67683f18edd28879
Author: Mahesh Salgaonkar <mahesh@linux.ibm.com>
Date:   Mon Apr 12 13:22:50 2021 +0530

    powerpc/eeh: Fix EEH handling for hugepages in ioremap space.
    
    commit 5ae5bc12d0728db60a0aa9b62160ffc038875f1a upstream.
    
    During the EEH MMIO error checking, the current implementation fails to map
    the (virtual) MMIO address back to the pci device on radix with hugepage
    mappings for I/O. This results into failure to dispatch EEH event with no
    recovery even when EEH capability has been enabled on the device.
    
    eeh_check_failure(token)                # token = virtual MMIO address
      addr = eeh_token_to_phys(token);
      edev = eeh_addr_cache_get_dev(addr);
      if (!edev)
            return 0;
      eeh_dev_check_failure(edev);  <= Dispatch the EEH event
    
    In case of hugepage mappings, eeh_token_to_phys() has a bug in virt -> phys
    translation that results in wrong physical address, which is then passed to
    eeh_addr_cache_get_dev() to match it against cached pci I/O address ranges
    to get to a PCI device. Hence, it fails to find a match and the EEH event
    never gets dispatched leaving the device in failed state.
    
    The commit 33439620680be ("powerpc/eeh: Handle hugepages in ioremap space")
    introduced following logic to translate virt to phys for hugepage mappings:
    
    eeh_token_to_phys():
    +       pa = pte_pfn(*ptep);
    +
    +       /* On radix we can do hugepage mappings for io, so handle that */
    +       if (hugepage_shift) {
    +               pa <<= hugepage_shift;                  <= This is wrong
    +               pa |= token & ((1ul << hugepage_shift) - 1);
    +       }
    
    This patch fixes the virt -> phys translation in eeh_token_to_phys()
    function.
    
      $ cat /sys/kernel/debug/powerpc/eeh_address_cache
      mem addr range [0x0000040080000000-0x00000400807fffff]: 0030:01:00.1
      mem addr range [0x0000040080800000-0x0000040080ffffff]: 0030:01:00.1
      mem addr range [0x0000040081000000-0x00000400817fffff]: 0030:01:00.0
      mem addr range [0x0000040081800000-0x0000040081ffffff]: 0030:01:00.0
      mem addr range [0x0000040082000000-0x000004008207ffff]: 0030:01:00.1
      mem addr range [0x0000040082080000-0x00000400820fffff]: 0030:01:00.0
      mem addr range [0x0000040082100000-0x000004008210ffff]: 0030:01:00.1
      mem addr range [0x0000040082110000-0x000004008211ffff]: 0030:01:00.0
    
    Above is the list of cached io address ranges of pci 0030:01:00.<fn>.
    
    Before this patch:
    
    Tracing 'arg1' of function eeh_addr_cache_get_dev() during error injection
    clearly shows that 'addr=' contains wrong physical address:
    
       kworker/u16:0-7       [001] ....   108.883775: eeh_addr_cache_get_dev:
               (eeh_addr_cache_get_dev+0xc/0xf0) addr=0x80103000a510
    
    dmesg shows no EEH recovery messages:
    
      [  108.563768] bnx2x: [bnx2x_timer:5801(eth2)]MFW seems hanged: drv_pulse (0x9ae) != mcp_pulse (0x7fff)
      [  108.563788] bnx2x: [bnx2x_hw_stats_update:870(eth2)]NIG timer max (4294967295)
      [  108.883788] bnx2x: [bnx2x_acquire_hw_lock:2013(eth1)]lock_status 0xffffffff  resource_bit 0x1
      [  108.884407] bnx2x 0030:01:00.0 eth1: MDC/MDIO access timeout
      [  108.884976] bnx2x 0030:01:00.0 eth1: MDC/MDIO access timeout
      <..>
    
    After this patch:
    
    eeh_addr_cache_get_dev() trace shows correct physical address:
    
      <idle>-0       [001] ..s.  1043.123828: eeh_addr_cache_get_dev:
              (eeh_addr_cache_get_dev+0xc/0xf0) addr=0x40080bc7cd8
    
    dmesg logs shows EEH recovery getting triggerred:
    
      [  964.323980] bnx2x: [bnx2x_timer:5801(eth2)]MFW seems hanged: drv_pulse (0x746f) != mcp_pulse (0x7fff)
      [  964.323991] EEH: Recovering PHB#30-PE#10000
      [  964.324002] EEH: PE location: N/A, PHB location: N/A
      [  964.324006] EEH: Frozen PHB#30-PE#10000 detected
      <..>
    
    Fixes: 33439620680b ("powerpc/eeh: Handle hugepages in ioremap space")
    Cc: stable@vger.kernel.org # v5.3+
    Reported-by: Dominic DeMarco <ddemarc@us.ibm.com>
    Signed-off-by: Mahesh Salgaonkar <mahesh@linux.ibm.com>
    Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/161821396263.48361.2796709239866588652.stgit@jupiter
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/powerpc/kernel/eeh.c b/arch/powerpc/kernel/eeh.c
index d123cba0992d..44bb522fb4a2 100644
--- a/arch/powerpc/kernel/eeh.c
+++ b/arch/powerpc/kernel/eeh.c
@@ -364,14 +364,11 @@ static inline unsigned long eeh_token_to_phys(unsigned long token)
 	pa = pte_pfn(*ptep);
 
 	/* On radix we can do hugepage mappings for io, so handle that */
-	if (hugepage_shift) {
-		pa <<= hugepage_shift;
-		pa |= token & ((1ul << hugepage_shift) - 1);
-	} else {
-		pa <<= PAGE_SHIFT;
-		pa |= token & (PAGE_SIZE - 1);
-	}
+	if (!hugepage_shift)
+		hugepage_shift = PAGE_SHIFT;
 
+	pa <<= PAGE_SHIFT;
+	pa |= token & ((1ul << hugepage_shift) - 1);
 	return pa;
 }
 

commit 499fe0b2a5a8c45f8972692673018ca47649aa20
Author: lizhe <lizhe67@huawei.com>
Date:   Thu Mar 18 11:06:57 2021 +0800

    jffs2: Fix kasan slab-out-of-bounds problem
    
    commit 960b9a8a7676b9054d8b46a2c7db52a0c8766b56 upstream.
    
    KASAN report a slab-out-of-bounds problem. The logs are listed below.
    It is because in function jffs2_scan_dirent_node, we alloc "checkedlen+1"
    bytes for fd->name and we check crc with length rd->nsize. If checkedlen
    is less than rd->nsize, it will cause the slab-out-of-bounds problem.
    
    jffs2: Dirent at *** has zeroes in name. Truncating to %d char
    ==================================================================
    BUG: KASAN: slab-out-of-bounds in crc32_le+0x1ce/0x260 at addr ffff8800842cf2d1
    Read of size 1 by task test_JFFS2/915
    =============================================================================
    BUG kmalloc-64 (Tainted: G    B      O   ): kasan: bad access detected
    -----------------------------------------------------------------------------
    INFO: Allocated in jffs2_alloc_full_dirent+0x2a/0x40 age=0 cpu=1 pid=915
            ___slab_alloc+0x580/0x5f0
            __slab_alloc.isra.24+0x4e/0x64
            __kmalloc+0x170/0x300
            jffs2_alloc_full_dirent+0x2a/0x40
            jffs2_scan_eraseblock+0x1ca4/0x3b64
            jffs2_scan_medium+0x285/0xfe0
            jffs2_do_mount_fs+0x5fb/0x1bbc
            jffs2_do_fill_super+0x245/0x6f0
            jffs2_fill_super+0x287/0x2e0
            mount_mtd_aux.isra.0+0x9a/0x144
            mount_mtd+0x222/0x2f0
            jffs2_mount+0x41/0x60
            mount_fs+0x63/0x230
            vfs_kern_mount.part.6+0x6c/0x1f4
            do_mount+0xae8/0x1940
            SyS_mount+0x105/0x1d0
    INFO: Freed in jffs2_free_full_dirent+0x22/0x40 age=27 cpu=1 pid=915
            __slab_free+0x372/0x4e4
            kfree+0x1d4/0x20c
            jffs2_free_full_dirent+0x22/0x40
            jffs2_build_remove_unlinked_inode+0x17a/0x1e4
            jffs2_do_mount_fs+0x1646/0x1bbc
            jffs2_do_fill_super+0x245/0x6f0
            jffs2_fill_super+0x287/0x2e0
            mount_mtd_aux.isra.0+0x9a/0x144
            mount_mtd+0x222/0x2f0
            jffs2_mount+0x41/0x60
            mount_fs+0x63/0x230
            vfs_kern_mount.part.6+0x6c/0x1f4
            do_mount+0xae8/0x1940
            SyS_mount+0x105/0x1d0
            entry_SYSCALL_64_fastpath+0x1e/0x97
    Call Trace:
     [<ffffffff815befef>] dump_stack+0x59/0x7e
     [<ffffffff812d1d65>] print_trailer+0x125/0x1b0
     [<ffffffff812d82c8>] object_err+0x34/0x40
     [<ffffffff812dadef>] kasan_report.part.1+0x21f/0x534
     [<ffffffff81132401>] ? vprintk+0x2d/0x40
     [<ffffffff815f1ee2>] ? crc32_le+0x1ce/0x260
     [<ffffffff812db41a>] kasan_report+0x26/0x30
     [<ffffffff812d9fc1>] __asan_load1+0x3d/0x50
     [<ffffffff815f1ee2>] crc32_le+0x1ce/0x260
     [<ffffffff814764ae>] ? jffs2_alloc_full_dirent+0x2a/0x40
     [<ffffffff81485cec>] jffs2_scan_eraseblock+0x1d0c/0x3b64
     [<ffffffff81488813>] ? jffs2_scan_medium+0xccf/0xfe0
     [<ffffffff81483fe0>] ? jffs2_scan_make_ino_cache+0x14c/0x14c
     [<ffffffff812da3e9>] ? kasan_unpoison_shadow+0x35/0x50
     [<ffffffff812da3e9>] ? kasan_unpoison_shadow+0x35/0x50
     [<ffffffff812da462>] ? kasan_kmalloc+0x5e/0x70
     [<ffffffff812d5d90>] ? kmem_cache_alloc_trace+0x10c/0x2cc
     [<ffffffff818169fb>] ? mtd_point+0xf7/0x130
     [<ffffffff81487dc9>] jffs2_scan_medium+0x285/0xfe0
     [<ffffffff81487b44>] ? jffs2_scan_eraseblock+0x3b64/0x3b64
     [<ffffffff812da3e9>] ? kasan_unpoison_shadow+0x35/0x50
     [<ffffffff812da3e9>] ? kasan_unpoison_shadow+0x35/0x50
     [<ffffffff812da462>] ? kasan_kmalloc+0x5e/0x70
     [<ffffffff812d57df>] ? __kmalloc+0x12b/0x300
     [<ffffffff812da462>] ? kasan_kmalloc+0x5e/0x70
     [<ffffffff814a2753>] ? jffs2_sum_init+0x9f/0x240
     [<ffffffff8148b2ff>] jffs2_do_mount_fs+0x5fb/0x1bbc
     [<ffffffff8148ad04>] ? jffs2_del_noinode_dirent+0x640/0x640
     [<ffffffff812da462>] ? kasan_kmalloc+0x5e/0x70
     [<ffffffff81127c5b>] ? __init_rwsem+0x97/0xac
     [<ffffffff81492349>] jffs2_do_fill_super+0x245/0x6f0
     [<ffffffff81493c5b>] jffs2_fill_super+0x287/0x2e0
     [<ffffffff814939d4>] ? jffs2_parse_options+0x594/0x594
     [<ffffffff81819bea>] mount_mtd_aux.isra.0+0x9a/0x144
     [<ffffffff81819eb6>] mount_mtd+0x222/0x2f0
     [<ffffffff814939d4>] ? jffs2_parse_options+0x594/0x594
     [<ffffffff81819c94>] ? mount_mtd_aux.isra.0+0x144/0x144
     [<ffffffff81258757>] ? free_pages+0x13/0x1c
     [<ffffffff814fa0ac>] ? selinux_sb_copy_data+0x278/0x2e0
     [<ffffffff81492b35>] jffs2_mount+0x41/0x60
     [<ffffffff81302fb7>] mount_fs+0x63/0x230
     [<ffffffff8133755f>] ? alloc_vfsmnt+0x32f/0x3b0
     [<ffffffff81337f2c>] vfs_kern_mount.part.6+0x6c/0x1f4
     [<ffffffff8133ceec>] do_mount+0xae8/0x1940
     [<ffffffff811b94e0>] ? audit_filter_rules.constprop.6+0x1d10/0x1d10
     [<ffffffff8133c404>] ? copy_mount_string+0x40/0x40
     [<ffffffff812cbf78>] ? alloc_pages_current+0xa4/0x1bc
     [<ffffffff81253a89>] ? __get_free_pages+0x25/0x50
     [<ffffffff81338993>] ? copy_mount_options.part.17+0x183/0x264
     [<ffffffff8133e3a9>] SyS_mount+0x105/0x1d0
     [<ffffffff8133e2a4>] ? copy_mnt_ns+0x560/0x560
     [<ffffffff810e8391>] ? msa_space_switch_handler+0x13d/0x190
     [<ffffffff81be184a>] entry_SYSCALL_64_fastpath+0x1e/0x97
     [<ffffffff810e9274>] ? msa_space_switch+0xb0/0xe0
    Memory state around the buggy address:
     ffff8800842cf180: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
     ffff8800842cf200: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    >ffff8800842cf280: fc fc fc fc fc fc 00 00 00 00 01 fc fc fc fc fc
                                                     ^
     ffff8800842cf300: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
     ffff8800842cf380: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    ==================================================================
    
    Cc: stable@vger.kernel.org
    Reported-by: Kunkun Xu <xukunkun1@huawei.com>
    Signed-off-by: lizhe <lizhe67@huawei.com>
    Signed-off-by: Richard Weinberger <richard@nod.at>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/jffs2/scan.c b/fs/jffs2/scan.c
index 90431dd613b8..08813789fcf0 100644
--- a/fs/jffs2/scan.c
+++ b/fs/jffs2/scan.c
@@ -1075,7 +1075,7 @@ static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblo
 	memcpy(&fd->name, rd->name, checkedlen);
 	fd->name[checkedlen] = 0;
 
-	crc = crc32(0, fd->name, rd->nsize);
+	crc = crc32(0, fd->name, checkedlen);
 	if (crc != je32_to_cpu(rd->name_crc)) {
 		pr_notice("%s(): Name CRC failed on node at 0x%08x: Read 0x%08x, calculated 0x%08x\n",
 			  __func__, ofs, je32_to_cpu(rd->name_crc), crc);

commit 9ffa7967f9379a0a1b924e9ffeda709d72237da7
Author: Trond Myklebust <trond.myklebust@hammerspace.com>
Date:   Sun Apr 18 15:00:45 2021 -0400

    NFSv4: Don't discard segments marked for return in _pnfs_return_layout()
    
    commit de144ff4234f935bd2150108019b5d87a90a8a96 upstream.
    
    If the pNFS layout segment is marked with the NFS_LSEG_LAYOUTRETURN
    flag, then the assumption is that it has some reporting requirement
    to perform through a layoutreturn (e.g. flexfiles layout stats or error
    information).
    
    Fixes: 6d597e175012 ("pnfs: only tear down lsegs that precede seqid in LAYOUTRETURN args")
    Cc: stable@vger.kernel.org
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 6feca545873d..af255109c5bf 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1294,7 +1294,7 @@ _pnfs_return_layout(struct inode *ino)
 	}
 	valid_layout = pnfs_layout_is_valid(lo);
 	pnfs_clear_layoutcommit(ino, &tmp_list);
-	pnfs_mark_matching_lsegs_invalid(lo, &tmp_list, NULL, 0);
+	pnfs_mark_matching_lsegs_return(lo, &tmp_list, NULL, 0);
 
 	if (NFS_SERVER(ino)->pnfs_curr_ld->return_range) {
 		struct pnfs_layout_range range = {

commit d51316b13dd4f35aa737d20822a18c131eed32c3
Author: Trond Myklebust <trond.myklebust@hammerspace.com>
Date:   Thu Apr 15 15:41:57 2021 -0400

    NFS: Don't discard pNFS layout segments that are marked for return
    
    commit 39fd01863616964f009599e50ca5c6ea9ebf88d6 upstream.
    
    If the pNFS layout segment is marked with the NFS_LSEG_LAYOUTRETURN
    flag, then the assumption is that it has some reporting requirement
    to perform through a layoutreturn (e.g. flexfiles layout stats or error
    information).
    
    Fixes: e0b7d420f72a ("pNFS: Don't discard layout segments that are marked for return")
    Cc: stable@vger.kernel.org
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 55965e8e9a2e..6feca545873d 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -2359,6 +2359,9 @@ pnfs_mark_matching_lsegs_return(struct pnfs_layout_hdr *lo,
 
 	assert_spin_locked(&lo->plh_inode->i_lock);
 
+	if (test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags))
+		tmp_list = &lo->plh_return_segs;
+
 	list_for_each_entry_safe(lseg, next, &lo->plh_segs, pls_list)
 		if (pnfs_match_lseg_recall(lseg, return_range, seq)) {
 			dprintk("%s: marking lseg %p iomode %d "
@@ -2366,6 +2369,8 @@ pnfs_mark_matching_lsegs_return(struct pnfs_layout_hdr *lo,
 				lseg, lseg->pls_range.iomode,
 				lseg->pls_range.offset,
 				lseg->pls_range.length);
+			if (test_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags))
+				tmp_list = &lo->plh_return_segs;
 			if (mark_lseg_invalid(lseg, tmp_list))
 				continue;
 			remaining++;

commit 7b2162db1498c71962a4bb2f776fa4e76d4d305b
Author: Marc Zyngier <maz@kernel.org>
Date:   Wed Apr 21 17:43:16 2021 +0100

    ACPI: GTDT: Don't corrupt interrupt mappings on watchdow probe failure
    
    commit 1ecd5b129252249b9bc03d7645a7bda512747277 upstream.
    
    When failing the driver probe because of invalid firmware properties,
    the GTDT driver unmaps the interrupt that it mapped earlier.
    
    However, it never checks whether the mapping of the interrupt actially
    succeeded. Even more, should the firmware report an illegal interrupt
    number that overlaps with the GIC SGI range, this can result in an
    IPI being unmapped, and subsequent fireworks (as reported by Dann
    Frazier).
    
    Rework the driver to have a slightly saner behaviour and actually
    check whether the interrupt has been mapped before unmapping things.
    
    Reported-by: dann frazier <dann.frazier@canonical.com>
    Fixes: ca9ae5ec4ef0 ("acpi/arm64: Add SBSA Generic Watchdog support in GTDT driver")
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/YH87dtTfwYgavusz@xps13.dannf
    Cc: <stable@vger.kernel.org>
    Cc: Fu Wei <wefu@redhat.com>
    Reviewed-by: Sudeep Holla <sudeep.holla@arm.com>
    Tested-by: dann frazier <dann.frazier@canonical.com>
    Tested-by: Hanjun Guo <guohanjun@huawei.com>
    Reviewed-by: Hanjun Guo <guohanjun@huawei.com>
    Reviewed-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Link: https://lore.kernel.org/r/20210421164317.1718831-2-maz@kernel.org
    Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/acpi/arm64/gtdt.c b/drivers/acpi/arm64/gtdt.c
index 92f9edf9d11e..c39b36c558d6 100644
--- a/drivers/acpi/arm64/gtdt.c
+++ b/drivers/acpi/arm64/gtdt.c
@@ -332,7 +332,7 @@ static int __init gtdt_import_sbsa_gwdt(struct acpi_gtdt_watchdog *wd,
 					int index)
 {
 	struct platform_device *pdev;
-	int irq = map_gt_gsi(wd->timer_interrupt, wd->timer_flags);
+	int irq;
 
 	/*
 	 * According to SBSA specification the size of refresh and control
@@ -341,7 +341,7 @@ static int __init gtdt_import_sbsa_gwdt(struct acpi_gtdt_watchdog *wd,
 	struct resource res[] = {
 		DEFINE_RES_MEM(wd->control_frame_address, SZ_4K),
 		DEFINE_RES_MEM(wd->refresh_frame_address, SZ_4K),
-		DEFINE_RES_IRQ(irq),
+		{},
 	};
 	int nr_res = ARRAY_SIZE(res);
 
@@ -351,10 +351,11 @@ static int __init gtdt_import_sbsa_gwdt(struct acpi_gtdt_watchdog *wd,
 
 	if (!(wd->refresh_frame_address && wd->control_frame_address)) {
 		pr_err(FW_BUG "failed to get the Watchdog base address.\n");
-		acpi_unregister_gsi(wd->timer_interrupt);
 		return -EINVAL;
 	}
 
+	irq = map_gt_gsi(wd->timer_interrupt, wd->timer_flags);
+	res[2] = (struct resource)DEFINE_RES_IRQ(irq);
 	if (irq <= 0) {
 		pr_warn("failed to map the Watchdog interrupt.\n");
 		nr_res--;
@@ -367,7 +368,8 @@ static int __init gtdt_import_sbsa_gwdt(struct acpi_gtdt_watchdog *wd,
 	 */
 	pdev = platform_device_register_simple("sbsa-gwdt", index, res, nr_res);
 	if (IS_ERR(pdev)) {
-		acpi_unregister_gsi(wd->timer_interrupt);
+		if (irq > 0)
+			acpi_unregister_gsi(wd->timer_interrupt);
 		return PTR_ERR(pdev);
 	}
 

commit df9e900de24637be41879e2c50afb713ec4e8b2e
Author: Davide Caratti <dcaratti@redhat.com>
Date:   Wed Apr 28 15:23:07 2021 +0200

    openvswitch: fix stack OOB read while fragmenting IPv4 packets
    
    commit 7c0ea5930c1c211931819d83cfb157bff1539a4c upstream.
    
    running openvswitch on kernels built with KASAN, it's possible to see the
    following splat while testing fragmentation of IPv4 packets:
    
     BUG: KASAN: stack-out-of-bounds in ip_do_fragment+0x1b03/0x1f60
     Read of size 1 at addr ffff888112fc713c by task handler2/1367
    
     CPU: 0 PID: 1367 Comm: handler2 Not tainted 5.12.0-rc6+ #418
     Hardware name: Red Hat KVM, BIOS 1.11.1-4.module+el8.1.0+4066+0f1aadab 04/01/2014
     Call Trace:
      dump_stack+0x92/0xc1
      print_address_description.constprop.7+0x1a/0x150
      kasan_report.cold.13+0x7f/0x111
      ip_do_fragment+0x1b03/0x1f60
      ovs_fragment+0x5bf/0x840 [openvswitch]
      do_execute_actions+0x1bd5/0x2400 [openvswitch]
      ovs_execute_actions+0xc8/0x3d0 [openvswitch]
      ovs_packet_cmd_execute+0xa39/0x1150 [openvswitch]
      genl_family_rcv_msg_doit.isra.15+0x227/0x2d0
      genl_rcv_msg+0x287/0x490
      netlink_rcv_skb+0x120/0x380
      genl_rcv+0x24/0x40
      netlink_unicast+0x439/0x630
      netlink_sendmsg+0x719/0xbf0
      sock_sendmsg+0xe2/0x110
      ____sys_sendmsg+0x5ba/0x890
      ___sys_sendmsg+0xe9/0x160
      __sys_sendmsg+0xd3/0x170
      do_syscall_64+0x33/0x40
      entry_SYSCALL_64_after_hwframe+0x44/0xae
     RIP: 0033:0x7f957079db07
     Code: c3 66 90 41 54 41 89 d4 55 48 89 f5 53 89 fb 48 83 ec 10 e8 eb ec ff ff 44 89 e2 48 89 ee 89 df 41 89 c0 b8 2e 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 35 44 89 c7 48 89 44 24 08 e8 24 ed ff ff 48
     RSP: 002b:00007f956ce35a50 EFLAGS: 00000293 ORIG_RAX: 000000000000002e
     RAX: ffffffffffffffda RBX: 0000000000000019 RCX: 00007f957079db07
     RDX: 0000000000000000 RSI: 00007f956ce35ae0 RDI: 0000000000000019
     RBP: 00007f956ce35ae0 R08: 0000000000000000 R09: 00007f9558006730
     R10: 0000000000000000 R11: 0000000000000293 R12: 0000000000000000
     R13: 00007f956ce37308 R14: 00007f956ce35f80 R15: 00007f956ce35ae0
    
     The buggy address belongs to the page:
     page:00000000af2a1d93 refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x112fc7
     flags: 0x17ffffc0000000()
     raw: 0017ffffc0000000 0000000000000000 dead000000000122 0000000000000000
     raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000
     page dumped because: kasan: bad access detected
    
     addr ffff888112fc713c is located in stack of task handler2/1367 at offset 180 in frame:
      ovs_fragment+0x0/0x840 [openvswitch]
    
     this frame has 2 objects:
      [32, 144) 'ovs_dst'
      [192, 424) 'ovs_rt'
    
     Memory state around the buggy address:
      ffff888112fc7000: f3 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
      ffff888112fc7080: 00 f1 f1 f1 f1 00 00 00 00 00 00 00 00 00 00 00
     >ffff888112fc7100: 00 00 00 f2 f2 f2 f2 f2 f2 00 00 00 00 00 00 00
                                             ^
      ffff888112fc7180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
      ffff888112fc7200: 00 00 00 00 00 00 f2 f2 f2 00 00 00 00 00 00 00
    
    for IPv4 packets, ovs_fragment() uses a temporary struct dst_entry. Then,
    in the following call graph:
    
      ip_do_fragment()
        ip_skb_dst_mtu()
          ip_dst_mtu_maybe_forward()
            ip_mtu_locked()
    
    the pointer to struct dst_entry is used as pointer to struct rtable: this
    turns the access to struct members like rt_mtu_locked into an OOB read in
    the stack. Fix this changing the temporary variable used for IPv4 packets
    in ovs_fragment(), similarly to what is done for IPv6 few lines below.
    
    Fixes: d52e5a7e7ca4 ("ipv4: lock mtu in fnhe when received PMTU < net.ipv4.route.min_pmt")
    Cc: <stable@vger.kernel.org>
    Acked-by: Eelco Chaudron <echaudro@redhat.com>
    Signed-off-by: Davide Caratti <dcaratti@redhat.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c
index 8211e8e97c96..849fcf973c74 100644
--- a/net/openvswitch/actions.c
+++ b/net/openvswitch/actions.c
@@ -892,17 +892,17 @@ static void ovs_fragment(struct net *net, struct vport *vport,
 	}
 
 	if (key->eth.type == htons(ETH_P_IP)) {
-		struct dst_entry ovs_dst;
+		struct rtable ovs_rt = { 0 };
 		unsigned long orig_dst;
 
 		prepare_frag(vport, skb, orig_network_offset,
 			     ovs_key_mac_proto(key));
-		dst_init(&ovs_dst, &ovs_dst_ops, NULL, 1,
+		dst_init(&ovs_rt.dst, &ovs_dst_ops, NULL, 1,
 			 DST_OBSOLETE_NONE, DST_NOCOUNT);
-		ovs_dst.dev = vport->dev;
+		ovs_rt.dst.dev = vport->dev;
 
 		orig_dst = skb->_skb_refdst;
-		skb_dst_set_noref(skb, &ovs_dst);
+		skb_dst_set_noref(skb, &ovs_rt.dst);
 		IPCB(skb)->frag_max_size = mru;
 
 		ip_do_fragment(net, skb->sk, skb, ovs_vport_output);

commit 367a10f5902f39716beba43b824f73360fce9157
Author: Ido Schimmel <idosch@nvidia.com>
Date:   Thu May 6 10:23:08 2021 +0300

    mlxsw: spectrum_mr: Update egress RIF list before route's action
    
    commit cbaf3f6af9c268caf558c8e7ec52bcb35c5455dd upstream.
    
    Each multicast route that is forwarding packets (as opposed to trapping
    them) points to a list of egress router interfaces (RIFs) through which
    packets are replicated.
    
    A route's action can transition from trap to forward when a RIF is
    created for one of the route's egress virtual interfaces (eVIF). When
    this happens, the route's action is first updated and only later the
    list of egress RIFs is committed to the device.
    
    This results in the route pointing to an invalid list. In case the list
    pointer is out of range (due to uninitialized memory), the device will
    complain:
    
    mlxsw_spectrum2 0000:06:00.0: EMAD reg access failed (tid=5733bf490000905c,reg_id=300f(pefa),type=write,status=7(bad parameter))
    
    Fix this by first committing the list of egress RIFs to the device and
    only later update the route's action.
    
    Note that a fix is not needed in the reverse function (i.e.,
    mlxsw_sp_mr_route_evif_unresolve()), as there the route's action is
    first updated and only later the RIF is removed from the list.
    
    Cc: stable@vger.kernel.org
    Fixes: c011ec1bbfd6 ("mlxsw: spectrum: Add the multicast routing offloading logic")
    Signed-off-by: Ido Schimmel <idosch@nvidia.com>
    Reviewed-by: Petr Machata <petrm@nvidia.com>
    Link: https://lore.kernel.org/r/20210506072308.3834303-1-idosch@idosch.org
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_mr.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_mr.c
index 336e5ecc68f8..f1874578aa14 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_mr.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_mr.c
@@ -524,6 +524,16 @@ mlxsw_sp_mr_route_evif_resolve(struct mlxsw_sp_mr_table *mr_table,
 	u16 erif_index = 0;
 	int err;
 
+	/* Add the eRIF */
+	if (mlxsw_sp_mr_vif_valid(rve->mr_vif)) {
+		erif_index = mlxsw_sp_rif_index(rve->mr_vif->rif);
+		err = mr->mr_ops->route_erif_add(mlxsw_sp,
+						 rve->mr_route->route_priv,
+						 erif_index);
+		if (err)
+			return err;
+	}
+
 	/* Update the route action, as the new eVIF can be a tunnel or a pimreg
 	 * device which will require updating the action.
 	 */
@@ -533,17 +543,7 @@ mlxsw_sp_mr_route_evif_resolve(struct mlxsw_sp_mr_table *mr_table,
 						      rve->mr_route->route_priv,
 						      route_action);
 		if (err)
-			return err;
-	}
-
-	/* Add the eRIF */
-	if (mlxsw_sp_mr_vif_valid(rve->mr_vif)) {
-		erif_index = mlxsw_sp_rif_index(rve->mr_vif->rif);
-		err = mr->mr_ops->route_erif_add(mlxsw_sp,
-						 rve->mr_route->route_priv,
-						 erif_index);
-		if (err)
-			goto err_route_erif_add;
+			goto err_route_action_update;
 	}
 
 	/* Update the minimum MTU */
@@ -561,14 +561,14 @@ mlxsw_sp_mr_route_evif_resolve(struct mlxsw_sp_mr_table *mr_table,
 	return 0;
 
 err_route_min_mtu_update:
-	if (mlxsw_sp_mr_vif_valid(rve->mr_vif))
-		mr->mr_ops->route_erif_del(mlxsw_sp, rve->mr_route->route_priv,
-					   erif_index);
-err_route_erif_add:
 	if (route_action != rve->mr_route->route_action)
 		mr->mr_ops->route_action_update(mlxsw_sp,
 						rve->mr_route->route_priv,
 						rve->mr_route->route_action);
+err_route_action_update:
+	if (mlxsw_sp_mr_vif_valid(rve->mr_vif))
+		mr->mr_ops->route_erif_del(mlxsw_sp, rve->mr_route->route_priv,
+					   erif_index);
 	return err;
 }
 

commit bfa08a47cea2a9fab077c7135b9cfdf04e69c67a
Author: Chao Yu <yuchao0@huawei.com>
Date:   Mon Mar 22 19:47:30 2021 +0800

    f2fs: fix to avoid out-of-bounds memory access
    
    commit b862676e371715456c9dade7990c8004996d0d9e upstream.
    
    butt3rflyh4ck <butterflyhuangxx@gmail.com> reported a bug found by
    syzkaller fuzzer with custom modifications in 5.12.0-rc3+ [1]:
    
     dump_stack+0xfa/0x151 lib/dump_stack.c:120
     print_address_description.constprop.0.cold+0x82/0x32c mm/kasan/report.c:232
     __kasan_report mm/kasan/report.c:399 [inline]
     kasan_report.cold+0x7c/0xd8 mm/kasan/report.c:416
     f2fs_test_bit fs/f2fs/f2fs.h:2572 [inline]
     current_nat_addr fs/f2fs/node.h:213 [inline]
     get_next_nat_page fs/f2fs/node.c:123 [inline]
     __flush_nat_entry_set fs/f2fs/node.c:2888 [inline]
     f2fs_flush_nat_entries+0x258e/0x2960 fs/f2fs/node.c:2991
     f2fs_write_checkpoint+0x1372/0x6a70 fs/f2fs/checkpoint.c:1640
     f2fs_issue_checkpoint+0x149/0x410 fs/f2fs/checkpoint.c:1807
     f2fs_sync_fs+0x20f/0x420 fs/f2fs/super.c:1454
     __sync_filesystem fs/sync.c:39 [inline]
     sync_filesystem fs/sync.c:67 [inline]
     sync_filesystem+0x1b5/0x260 fs/sync.c:48
     generic_shutdown_super+0x70/0x370 fs/super.c:448
     kill_block_super+0x97/0xf0 fs/super.c:1394
    
    The root cause is, if nat entry in checkpoint journal area is corrupted,
    e.g. nid of journalled nat entry exceeds max nid value, during checkpoint,
    once it tries to flush nat journal to NAT area, get_next_nat_page() may
    access out-of-bounds memory on nat_bitmap due to it uses wrong nid value
    as bitmap offset.
    
    [1] https://lore.kernel.org/lkml/CAFcO6XOMWdr8pObek6eN6-fs58KG9doRFadgJj-FnF-1x43s2g@mail.gmail.com/T/#u
    
    Reported-and-tested-by: butt3rflyh4ck <butterflyhuangxx@gmail.com>
    Signed-off-by: Chao Yu <yuchao0@huawei.com>
    Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
index 1934dc6ad1cc..ff3f97ba1a55 100644
--- a/fs/f2fs/node.c
+++ b/fs/f2fs/node.c
@@ -2654,6 +2654,9 @@ static void remove_nats_in_journal(struct f2fs_sb_info *sbi)
 		struct f2fs_nat_entry raw_ne;
 		nid_t nid = le32_to_cpu(nid_in_journal(journal, i));
 
+		if (f2fs_check_nid_range(sbi, nid))
+			continue;
+
 		raw_ne = nat_in_journal(journal, i);
 
 		ne = __lookup_nat_cache(nm_i, nid);

commit c160368f2840122659225d997e43efa19a76222a
Author: Guochun Mao <guochun.mao@mediatek.com>
Date:   Tue Mar 16 16:52:14 2021 +0800

    ubifs: Only check replay with inode type to judge if inode linked
    
    commit 3e903315790baf4a966436e7f32e9c97864570ac upstream.
    
    Conside the following case, it just write a big file into flash,
    when complete writing, delete the file, and then power off promptly.
    Next time power on, we'll get a replay list like:
    ...
    LEB 1105:211344 len 4144 deletion 0 sqnum 428783 key type 1 inode 80
    LEB 15:233544 len 160 deletion 1 sqnum 428785 key type 0 inode 80
    LEB 1105:215488 len 4144 deletion 0 sqnum 428787 key type 1 inode 80
    ...
    In the replay list, data nodes' deletion are 0, and the inode node's
    deletion is 1. In current logic, the file's dentry will be removed,
    but inode and the flash space it occupied will be reserved.
    User will see that much free space been disappeared.
    
    We only need to check the deletion value of the following inode type
    node of the replay entry.
    
    Fixes: e58725d51fa8 ("ubifs: Handle re-linking of inodes correctly while recovery")
    Cc: stable@vger.kernel.org
    Signed-off-by: Guochun Mao <guochun.mao@mediatek.com>
    Signed-off-by: Richard Weinberger <richard@nod.at>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ubifs/replay.c b/fs/ubifs/replay.c
index c6f9b2225387..673d1f08b9a4 100644
--- a/fs/ubifs/replay.c
+++ b/fs/ubifs/replay.c
@@ -232,7 +232,8 @@ static bool inode_still_linked(struct ubifs_info *c, struct replay_entry *rino)
 	 */
 	list_for_each_entry_reverse(r, &c->replay_list, list) {
 		ubifs_assert(c, r->sqnum >= rino->sqnum);
-		if (key_inum(c, &r->key) == key_inum(c, &rino->key))
+		if (key_inum(c, &r->key) == key_inum(c, &rino->key) &&
+		    key_type(c, &r->key) == UBIFS_INO_KEY)
 			return r->deletion == 0;
 
 	}

commit 44149b3e106e4c632d4c5b80650580f823f72c45
Author: Bill Wendling <morbo@google.com>
Date:   Fri Apr 23 13:51:59 2021 -0700

    arm64/vdso: Discard .note.gnu.property sections in vDSO
    
    [ Upstream commit 388708028e6937f3fc5fc19aeeb847f8970f489c ]
    
    The arm64 assembler in binutils 2.32 and above generates a program
    property note in a note section, .note.gnu.property, to encode used x86
    ISAs and features. But the kernel linker script only contains a single
    NOTE segment:
    
      PHDRS
      {
        text    PT_LOAD    FLAGS(5) FILEHDR PHDRS; /* PF_R|PF_X */
        dynamic PT_DYNAMIC FLAGS(4);               /* PF_R */
        note    PT_NOTE    FLAGS(4);               /* PF_R */
      }
    
    The NOTE segment generated by the vDSO linker script is aligned to 4 bytes.
    But the .note.gnu.property section must be aligned to 8 bytes on arm64.
    
      $ readelf -n vdso64.so
    
      Displaying notes found in: .note
        Owner                Data size      Description
        Linux                0x00000004     Unknown note type: (0x00000000)
         description data: 06 00 00 00
      readelf: Warning: note with invalid namesz and/or descsz found at offset 0x20
      readelf: Warning:  type: 0x78, namesize: 0x00000100, descsize: 0x756e694c, alignment: 8
    
    Since the note.gnu.property section in the vDSO is not checked by the
    dynamic linker, discard the .note.gnu.property sections in the vDSO.
    
    Similar to commit 4caffe6a28d31 ("x86/vdso: Discard .note.gnu.property
    sections in vDSO"), but for arm64.
    
    Signed-off-by: Bill Wendling <morbo@google.com>
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Link: https://lore.kernel.org/r/20210423205159.830854-1-morbo@google.com
    Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/arm64/kernel/vdso/vdso.lds.S b/arch/arm64/kernel/vdso/vdso.lds.S
index beca249bc2f3..b3e6c4d5b75c 100644
--- a/arch/arm64/kernel/vdso/vdso.lds.S
+++ b/arch/arm64/kernel/vdso/vdso.lds.S
@@ -39,6 +39,13 @@ SECTIONS
 	.gnu.version_d	: { *(.gnu.version_d) }
 	.gnu.version_r	: { *(.gnu.version_r) }
 
+	/*
+	 * Discard .note.gnu.property sections which are unused and have
+	 * different alignment requirement from vDSO note sections.
+	 */
+	/DISCARD/	: {
+		*(.note.GNU-stack .note.gnu.property)
+	}
 	.note		: { *(.note.*) }		:text	:note
 
 	. = ALIGN(16);
@@ -59,7 +66,6 @@ SECTIONS
 	PROVIDE(end = .);
 
 	/DISCARD/	: {
-		*(.note.GNU-stack)
 		*(.data .data.* .gnu.linkonce.d.* .sdata*)
 		*(.bss .sbss .dynbss .dynsbss)
 	}

commit b782361defef80d886ab8aadef426aec0271bb53
Author: Filipe Manana <fdmanana@suse.com>
Date:   Tue Apr 20 10:55:44 2021 +0100

    btrfs: fix race when picking most recent mod log operation for an old root
    
    [ Upstream commit f9690f426b2134cc3e74bfc5d9dfd6a4b2ca5281 ]
    
    Commit dbcc7d57bffc0c ("btrfs: fix race when cloning extent buffer during
    rewind of an old root"), fixed a race when we need to rewind the extent
    buffer of an old root. It was caused by picking a new mod log operation
    for the extent buffer while getting a cloned extent buffer with an outdated
    number of items (off by -1), because we cloned the extent buffer without
    locking it first.
    
    However there is still another similar race, but in the opposite direction.
    The cloned extent buffer has a number of items that does not match the
    number of tree mod log operations that are going to be replayed. This is
    because right after we got the last (most recent) tree mod log operation to
    replay and before locking and cloning the extent buffer, another task adds
    a new pointer to the extent buffer, which results in adding a new tree mod
    log operation and incrementing the number of items in the extent buffer.
    So after cloning we have mismatch between the number of items in the extent
    buffer and the number of mod log operations we are going to apply to it.
    This results in hitting a BUG_ON() that produces the following stack trace:
    
       ------------[ cut here ]------------
       kernel BUG at fs/btrfs/tree-mod-log.c:675!
       invalid opcode: 0000 [#1] SMP KASAN PTI
       CPU: 3 PID: 4811 Comm: crawl_1215 Tainted: G        W         5.12.0-7d1efdf501f8-misc-next+ #99
       Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-1 04/01/2014
       RIP: 0010:tree_mod_log_rewind+0x3b1/0x3c0
       Code: 05 48 8d 74 10 (...)
       RSP: 0018:ffffc90001027090 EFLAGS: 00010293
       RAX: 0000000000000000 RBX: ffff8880a8514600 RCX: ffffffffaa9e59b6
       RDX: 0000000000000007 RSI: dffffc0000000000 RDI: ffff8880a851462c
       RBP: ffffc900010270e0 R08: 00000000000000c0 R09: ffffed1004333417
       R10: ffff88802199a0b7 R11: ffffed1004333416 R12: 000000000000000e
       R13: ffff888135af8748 R14: ffff88818766ff00 R15: ffff8880a851462c
       FS:  00007f29acf62700(0000) GS:ffff8881f2200000(0000) knlGS:0000000000000000
       CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
       CR2: 00007f0e6013f718 CR3: 000000010d42e003 CR4: 0000000000170ee0
       Call Trace:
        btrfs_get_old_root+0x16a/0x5c0
        ? lock_downgrade+0x400/0x400
        btrfs_search_old_slot+0x192/0x520
        ? btrfs_search_slot+0x1090/0x1090
        ? free_extent_buffer.part.61+0xd7/0x140
        ? free_extent_buffer+0x13/0x20
        resolve_indirect_refs+0x3e9/0xfc0
        ? lock_downgrade+0x400/0x400
        ? __kasan_check_read+0x11/0x20
        ? add_prelim_ref.part.11+0x150/0x150
        ? lock_downgrade+0x400/0x400
        ? __kasan_check_read+0x11/0x20
        ? lock_acquired+0xbb/0x620
        ? __kasan_check_write+0x14/0x20
        ? do_raw_spin_unlock+0xa8/0x140
        ? rb_insert_color+0x340/0x360
        ? prelim_ref_insert+0x12d/0x430
        find_parent_nodes+0x5c3/0x1830
        ? stack_trace_save+0x87/0xb0
        ? resolve_indirect_refs+0xfc0/0xfc0
        ? fs_reclaim_acquire+0x67/0xf0
        ? __kasan_check_read+0x11/0x20
        ? lockdep_hardirqs_on_prepare+0x210/0x210
        ? fs_reclaim_acquire+0x67/0xf0
        ? __kasan_check_read+0x11/0x20
        ? ___might_sleep+0x10f/0x1e0
        ? __kasan_kmalloc+0x9d/0xd0
        ? trace_hardirqs_on+0x55/0x120
        btrfs_find_all_roots_safe+0x142/0x1e0
        ? find_parent_nodes+0x1830/0x1830
        ? trace_hardirqs_on+0x55/0x120
        ? ulist_free+0x1f/0x30
        ? btrfs_inode_flags_to_xflags+0x50/0x50
        iterate_extent_inodes+0x20e/0x580
        ? tree_backref_for_extent+0x230/0x230
        ? release_extent_buffer+0x225/0x280
        ? read_extent_buffer+0xdd/0x110
        ? lock_downgrade+0x400/0x400
        ? __kasan_check_read+0x11/0x20
        ? lock_acquired+0xbb/0x620
        ? __kasan_check_write+0x14/0x20
        ? do_raw_spin_unlock+0xa8/0x140
        ? _raw_spin_unlock+0x22/0x30
        ? release_extent_buffer+0x225/0x280
        iterate_inodes_from_logical+0x129/0x170
        ? iterate_inodes_from_logical+0x129/0x170
        ? btrfs_inode_flags_to_xflags+0x50/0x50
        ? iterate_extent_inodes+0x580/0x580
        ? __vmalloc_node+0x92/0xb0
        ? init_data_container+0x34/0xb0
        ? init_data_container+0x34/0xb0
        ? kvmalloc_node+0x60/0x80
        btrfs_ioctl_logical_to_ino+0x158/0x230
        btrfs_ioctl+0x2038/0x4360
        ? __kasan_check_write+0x14/0x20
        ? mmput+0x3b/0x220
        ? btrfs_ioctl_get_supported_features+0x30/0x30
        ? __kasan_check_read+0x11/0x20
        ? __kasan_check_read+0x11/0x20
        ? lock_release+0xc8/0x650
        ? __might_fault+0x64/0xd0
        ? __kasan_check_read+0x11/0x20
        ? lock_downgrade+0x400/0x400
        ? lockdep_hardirqs_on_prepare+0x210/0x210
        ? lockdep_hardirqs_on_prepare+0x13/0x210
        ? _raw_spin_unlock_irqrestore+0x51/0x63
        ? __kasan_check_read+0x11/0x20
        ? do_vfs_ioctl+0xfc/0x9d0
        ? ioctl_file_clone+0xe0/0xe0
        ? lock_downgrade+0x400/0x400
        ? lockdep_hardirqs_on_prepare+0x210/0x210
        ? __kasan_check_read+0x11/0x20
        ? lock_release+0xc8/0x650
        ? __task_pid_nr_ns+0xd3/0x250
        ? __kasan_check_read+0x11/0x20
        ? __fget_files+0x160/0x230
        ? __fget_light+0xf2/0x110
        __x64_sys_ioctl+0xc3/0x100
        do_syscall_64+0x37/0x80
        entry_SYSCALL_64_after_hwframe+0x44/0xae
       RIP: 0033:0x7f29ae85b427
       Code: 00 00 90 48 8b (...)
       RSP: 002b:00007f29acf5fcf8 EFLAGS: 00000246 ORIG_RAX: 0000000000000010
       RAX: ffffffffffffffda RBX: 00007f29acf5ff40 RCX: 00007f29ae85b427
       RDX: 00007f29acf5ff48 RSI: 00000000c038943b RDI: 0000000000000003
       RBP: 0000000001000000 R08: 0000000000000000 R09: 00007f29acf60120
       R10: 00005640d5fc7b00 R11: 0000000000000246 R12: 0000000000000003
       R13: 00007f29acf5ff48 R14: 00007f29acf5ff40 R15: 00007f29acf5fef8
       Modules linked in:
       ---[ end trace 85e5fce078dfbe04 ]---
    
      (gdb) l *(tree_mod_log_rewind+0x3b1)
      0xffffffff819e5b21 is in tree_mod_log_rewind (fs/btrfs/tree-mod-log.c:675).
      670                      * the modification. As we're going backwards, we do the
      671                      * opposite of each operation here.
      672                      */
      673                     switch (tm->op) {
      674                     case BTRFS_MOD_LOG_KEY_REMOVE_WHILE_FREEING:
      675                             BUG_ON(tm->slot < n);
      676                             fallthrough;
      677                     case BTRFS_MOD_LOG_KEY_REMOVE_WHILE_MOVING:
      678                     case BTRFS_MOD_LOG_KEY_REMOVE:
      679                             btrfs_set_node_key(eb, &tm->key, tm->slot);
      (gdb) quit
    
    The following steps explain in more detail how it happens:
    
    1) We have one tree mod log user (through fiemap or the logical ino ioctl),
       with a sequence number of 1, so we have fs_info->tree_mod_seq == 1.
       This is task A;
    
    2) Another task is at ctree.c:balance_level() and we have eb X currently as
       the root of the tree, and we promote its single child, eb Y, as the new
       root.
    
       Then, at ctree.c:balance_level(), we call:
    
          ret = btrfs_tree_mod_log_insert_root(root->node, child, true);
    
    3) At btrfs_tree_mod_log_insert_root() we create a tree mod log operation
       of type BTRFS_MOD_LOG_KEY_REMOVE_WHILE_FREEING, with a ->logical field
       pointing to ebX->start. We only have one item in eb X, so we create
       only one tree mod log operation, and store in the "tm_list" array;
    
    4) Then, still at btrfs_tree_mod_log_insert_root(), we create a tree mod
       log element of operation type BTRFS_MOD_LOG_ROOT_REPLACE, ->logical set
       to ebY->start, ->old_root.logical set to ebX->start, ->old_root.level
       set to the level of eb X and ->generation set to the generation of eb X;
    
    5) Then btrfs_tree_mod_log_insert_root() calls tree_mod_log_free_eb() with
       "tm_list" as argument. After that, tree_mod_log_free_eb() calls
       tree_mod_log_insert(). This inserts the mod log operation of type
       BTRFS_MOD_LOG_KEY_REMOVE_WHILE_FREEING from step 3 into the rbtree
       with a sequence number of 2 (and fs_info->tree_mod_seq set to 2);
    
    6) Then, after inserting the "tm_list" single element into the tree mod
       log rbtree, the BTRFS_MOD_LOG_ROOT_REPLACE element is inserted, which
       gets the sequence number 3 (and fs_info->tree_mod_seq set to 3);
    
    7) Back to ctree.c:balance_level(), we free eb X by calling
       btrfs_free_tree_block() on it. Because eb X was created in the current
       transaction, has no other references and writeback did not happen for
       it, we add it back to the free space cache/tree;
    
    8) Later some other task B allocates the metadata extent from eb X, since
       it is marked as free space in the space cache/tree, and uses it as a
       node for some other btree;
    
    9) The tree mod log user task calls btrfs_search_old_slot(), which calls
       btrfs_get_old_root(), and finally that calls tree_mod_log_oldest_root()
       with time_seq == 1 and eb_root == eb Y;
    
    10) The first iteration of the while loop finds the tree mod log element
        with sequence number 3, for the logical address of eb Y and of type
        BTRFS_MOD_LOG_ROOT_REPLACE;
    
    11) Because the operation type is BTRFS_MOD_LOG_ROOT_REPLACE, we don't
        break out of the loop, and set root_logical to point to
        tm->old_root.logical, which corresponds to the logical address of
        eb X;
    
    12) On the next iteration of the while loop, the call to
        tree_mod_log_search_oldest() returns the smallest tree mod log element
        for the logical address of eb X, which has a sequence number of 2, an
        operation type of BTRFS_MOD_LOG_KEY_REMOVE_WHILE_FREEING and
        corresponds to the old slot 0 of eb X (eb X had only 1 item in it
        before being freed at step 7);
    
    13) We then break out of the while loop and return the tree mod log
        operation of type BTRFS_MOD_LOG_ROOT_REPLACE (eb Y), and not the one
        for slot 0 of eb X, to btrfs_get_old_root();
    
    14) At btrfs_get_old_root(), we process the BTRFS_MOD_LOG_ROOT_REPLACE
        operation and set "logical" to the logical address of eb X, which was
        the old root. We then call tree_mod_log_search() passing it the logical
        address of eb X and time_seq == 1;
    
    15) But before calling tree_mod_log_search(), task B locks eb X, adds a
        key to eb X, which results in adding a tree mod log operation of type
        BTRFS_MOD_LOG_KEY_ADD, with a sequence number of 4, to the tree mod
        log, and increments the number of items in eb X from 0 to 1.
        Now fs_info->tree_mod_seq has a value of 4;
    
    16) Task A then calls tree_mod_log_search(), which returns the most recent
        tree mod log operation for eb X, which is the one just added by task B
        at the previous step, with a sequence number of 4, a type of
        BTRFS_MOD_LOG_KEY_ADD and for slot 0;
    
    17) Before task A locks and clones eb X, task A adds another key to eb X,
        which results in adding a new BTRFS_MOD_LOG_KEY_ADD mod log operation,
        with a sequence number of 5, for slot 1 of eb X, increments the
        number of items in eb X from 1 to 2, and unlocks eb X.
        Now fs_info->tree_mod_seq has a value of 5;
    
    18) Task A then locks eb X and clones it. The clone has a value of 2 for
        the number of items and the pointer "tm" points to the tree mod log
        operation with sequence number 4, not the most recent one with a
        sequence number of 5, so there is mismatch between the number of
        mod log operations that are going to be applied to the cloned version
        of eb X and the number of items in the clone;
    
    19) Task A then calls tree_mod_log_rewind() with the clone of eb X, the
        tree mod log operation with sequence number 4 and a type of
        BTRFS_MOD_LOG_KEY_ADD, and time_seq == 1;
    
    20) At tree_mod_log_rewind(), we set the local variable "n" with a value
        of 2, which is the number of items in the clone of eb X.
    
        Then in the first iteration of the while loop, we process the mod log
        operation with sequence number 4, which is targeted at slot 0 and has
        a type of BTRFS_MOD_LOG_KEY_ADD. This results in decrementing "n" from
        2 to 1.
    
        Then we pick the next tree mod log operation for eb X, which is the
        tree mod log operation with a sequence number of 2, a type of
        BTRFS_MOD_LOG_KEY_REMOVE_WHILE_FREEING and for slot 0, it is the one
        added in step 5 to the tree mod log tree.
    
        We go back to the top of the loop to process this mod log operation,
        and because its slot is 0 and "n" has a value of 1, we hit the BUG_ON:
    
            (...)
            switch (tm->op) {
            case BTRFS_MOD_LOG_KEY_REMOVE_WHILE_FREEING:
                    BUG_ON(tm->slot < n);
                    fallthrough;
            (...)
    
    Fix this by checking for a more recent tree mod log operation after locking
    and cloning the extent buffer of the old root node, and use it as the first
    operation to apply to the cloned extent buffer when rewinding it.
    
    Stable backport notes: due to moved code and renames, in =< 5.11 the
    change should be applied to ctree.c:get_old_root.
    
    Reported-by: Zygo Blaxell <ce3g8jdj@umail.furryterror.org>
    Link: https://lore.kernel.org/linux-btrfs/20210404040732.GZ32440@hungrycats.org/
    Fixes: 834328a8493079 ("Btrfs: tree mod log's old roots could still be part of the tree")
    CC: stable@vger.kernel.org # 4.4+
    Signed-off-by: Filipe Manana <fdmanana@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
index 2bdd24425a68..00dc1b5c8737 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
@@ -1414,10 +1414,30 @@ get_old_root(struct btrfs_root *root, u64 time_seq)
 				   "failed to read tree block %llu from get_old_root",
 				   logical);
 		} else {
+			struct tree_mod_elem *tm2;
+
 			btrfs_tree_read_lock(old);
 			eb = btrfs_clone_extent_buffer(old);
+			/*
+			 * After the lookup for the most recent tree mod operation
+			 * above and before we locked and cloned the extent buffer
+			 * 'old', a new tree mod log operation may have been added.
+			 * So lookup for a more recent one to make sure the number
+			 * of mod log operations we replay is consistent with the
+			 * number of items we have in the cloned extent buffer,
+			 * otherwise we can hit a BUG_ON when rewinding the extent
+			 * buffer.
+			 */
+			tm2 = tree_mod_log_search(fs_info, logical, time_seq);
 			btrfs_tree_read_unlock(old);
 			free_extent_buffer(old);
+			ASSERT(tm2);
+			ASSERT(tm2 == tm || tm2->seq > tm->seq);
+			if (!tm2 || tm2->seq < tm->seq) {
+				free_extent_buffer(eb);
+				return NULL;
+			}
+			tm = tm2;
 		}
 	} else if (old_root) {
 		eb_root_owner = btrfs_header_owner(eb_root);

commit a60b9540ea4a1450f3ae8e893f66c56ff2e2f5e5
Author: Eckhart Mohr <e.mohr@tuxedocomputers.com>
Date:   Tue Apr 27 17:30:25 2021 +0200

    ALSA: hda/realtek: Add quirk for Intel Clevo PCx0Dx
    
    commit 970e3012c04c96351c413f193a9c909e6d871ce2 upstream.
    
    This applies a SND_PCI_QUIRK(...) to the Clevo PCx0Dx barebones. This
    fix enables audio output over the headset jack and ensures that a
    microphone connected via the headset combo jack is correctly recognized
    when pluged in.
    
    [ Rearranged the list entries in a sorted order -- tiwai ]
    
    Signed-off-by: Eckhart Mohr <e.mohr@tuxedocomputers.com>
    Co-developed-by: Werner Sembach <wse@tuxedocomputers.com>
    Signed-off-by: Werner Sembach <wse@tuxedocomputers.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210427153025.451118-1-wse@tuxedocomputers.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index f456e5f67824..03fcaf0b4790 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -2527,8 +2527,10 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
 	SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
+	SND_PCI_QUIRK(0x1558, 0x65e5, "Clevo PC50D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
+	SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
 	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),

commit 761463122b193a3bde248040b6d3caf637a43676
Author: Timo Gurr <timo.gurr@gmail.com>
Date:   Mon May 3 13:08:22 2021 +0200

    ALSA: usb-audio: Add dB range mapping for Sennheiser Communications Headset PC 8
    
    commit ab2165e2e6ed17345ffa8ee88ca764e8788ebcd7 upstream.
    
    The decibel volume range contains a negative maximum value resulting in
    pipewire complaining about the device and effectivly having no sound
    output. The wrong values also resulted in the headset sounding muted
    already at a mixer level of about ~25%.
    
    PipeWire BugLink: https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/1049
    
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=212897
    Signed-off-by: Timo Gurr <timo.gurr@gmail.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210503110822.10222-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c
index d2b500a1184b..1d4e535e2c11 100644
--- a/sound/usb/mixer_maps.c
+++ b/sound/usb/mixer_maps.c
@@ -351,6 +351,13 @@ static const struct usbmix_name_map bose_companion5_map[] = {
 	{ 0 }	/* terminator */
 };
 
+/* Sennheiser Communications Headset [PC 8], the dB value is reported as -6 negative maximum  */
+static const struct usbmix_dB_map sennheiser_pc8_dB = {-9500, 0};
+static const struct usbmix_name_map sennheiser_pc8_map[] = {
+	{ 9, NULL, .dB = &sennheiser_pc8_dB },
+	{ 0 }   /* terminator */
+};
+
 /*
  * Dell usb dock with ALC4020 codec had a firmware problem where it got
  * screwed up when zero volume is passed; just skip it as a workaround
@@ -633,5 +640,10 @@ static const struct usbmix_ctl_map uac3_badd_usbmix_ctl_maps[] = {
 		.id = UAC3_FUNCTION_SUBCLASS_SPEAKERPHONE,
 		.map = uac3_badd_speakerphone_map,
 	},
+	{
+		/* Sennheiser Communications Headset [PC 8] */
+		.id = USB_ID(0x1395, 0x0025),
+		.map = sennheiser_pc8_map,
+	},
 	{ 0 } /* terminator */
 };

commit aee5453a3e4c6eb2c07f394127e38a0eb47d990b
Author: Takashi Iwai <tiwai@suse.de>
Date:   Sun Jan 5 15:47:26 2020 +0100

    ALSA: usb-audio: More constifications
    
    commit a01df925d1bbc97d6f7fe07b157aadb565315337 upstream.
    
    Apply const prefix to the remaining places: the static table for the
    unit information, the mixer maps, the validator tables, etc.
    
    Just for minor optimization and no functional changes.
    
    Link: https://lore.kernel.org/r/20200105144823.29547-12-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
index 451b8ea383c6..4ad6eeb43476 100644
--- a/sound/usb/mixer.c
+++ b/sound/usb/mixer.c
@@ -1045,7 +1045,7 @@ struct usb_feature_control_info {
 	int type_uac2;	/* data type for uac2 if different from uac1, else -1 */
 };
 
-static struct usb_feature_control_info audio_feature_info[] = {
+static const struct usb_feature_control_info audio_feature_info[] = {
 	{ UAC_FU_MUTE,			"Mute",			USB_MIXER_INV_BOOLEAN, -1 },
 	{ UAC_FU_VOLUME,		"Volume",		USB_MIXER_S16, -1 },
 	{ UAC_FU_BASS,			"Tone Control - Bass",	USB_MIXER_S8, -1 },
@@ -1559,7 +1559,7 @@ static void check_no_speaker_on_headset(struct snd_kcontrol *kctl,
 	strlcpy(kctl->id.name, "Headphone", sizeof(kctl->id.name));
 }
 
-static struct usb_feature_control_info *get_feature_control_info(int control)
+static const struct usb_feature_control_info *get_feature_control_info(int control)
 {
 	int i;
 
@@ -1577,7 +1577,7 @@ static void __build_feature_ctl(struct usb_mixer_interface *mixer,
 				struct usb_audio_term *oterm,
 				int unitid, int nameid, int readonly_mask)
 {
-	struct usb_feature_control_info *ctl_info;
+	const struct usb_feature_control_info *ctl_info;
 	unsigned int len = 0;
 	int mapped_name = 0;
 	struct snd_kcontrol *kctl;
@@ -2256,7 +2256,7 @@ static const struct snd_kcontrol_new mixer_procunit_ctl = {
  */
 struct procunit_value_info {
 	int control;
-	char *suffix;
+	const char *suffix;
 	int val_type;
 	int min_value;
 };
@@ -2264,44 +2264,44 @@ struct procunit_value_info {
 struct procunit_info {
 	int type;
 	char *name;
-	struct procunit_value_info *values;
+	const struct procunit_value_info *values;
 };
 
-static struct procunit_value_info undefined_proc_info[] = {
+static const struct procunit_value_info undefined_proc_info[] = {
 	{ 0x00, "Control Undefined", 0 },
 	{ 0 }
 };
 
-static struct procunit_value_info updown_proc_info[] = {
+static const struct procunit_value_info updown_proc_info[] = {
 	{ UAC_UD_ENABLE, "Switch", USB_MIXER_BOOLEAN },
 	{ UAC_UD_MODE_SELECT, "Mode Select", USB_MIXER_U8, 1 },
 	{ 0 }
 };
-static struct procunit_value_info prologic_proc_info[] = {
+static const struct procunit_value_info prologic_proc_info[] = {
 	{ UAC_DP_ENABLE, "Switch", USB_MIXER_BOOLEAN },
 	{ UAC_DP_MODE_SELECT, "Mode Select", USB_MIXER_U8, 1 },
 	{ 0 }
 };
-static struct procunit_value_info threed_enh_proc_info[] = {
+static const struct procunit_value_info threed_enh_proc_info[] = {
 	{ UAC_3D_ENABLE, "Switch", USB_MIXER_BOOLEAN },
 	{ UAC_3D_SPACE, "Spaciousness", USB_MIXER_U8 },
 	{ 0 }
 };
-static struct procunit_value_info reverb_proc_info[] = {
+static const struct procunit_value_info reverb_proc_info[] = {
 	{ UAC_REVERB_ENABLE, "Switch", USB_MIXER_BOOLEAN },
 	{ UAC_REVERB_LEVEL, "Level", USB_MIXER_U8 },
 	{ UAC_REVERB_TIME, "Time", USB_MIXER_U16 },
 	{ UAC_REVERB_FEEDBACK, "Feedback", USB_MIXER_U8 },
 	{ 0 }
 };
-static struct procunit_value_info chorus_proc_info[] = {
+static const struct procunit_value_info chorus_proc_info[] = {
 	{ UAC_CHORUS_ENABLE, "Switch", USB_MIXER_BOOLEAN },
 	{ UAC_CHORUS_LEVEL, "Level", USB_MIXER_U8 },
 	{ UAC_CHORUS_RATE, "Rate", USB_MIXER_U16 },
 	{ UAC_CHORUS_DEPTH, "Depth", USB_MIXER_U16 },
 	{ 0 }
 };
-static struct procunit_value_info dcr_proc_info[] = {
+static const struct procunit_value_info dcr_proc_info[] = {
 	{ UAC_DCR_ENABLE, "Switch", USB_MIXER_BOOLEAN },
 	{ UAC_DCR_RATE, "Ratio", USB_MIXER_U16 },
 	{ UAC_DCR_MAXAMPL, "Max Amp", USB_MIXER_S16 },
@@ -2311,7 +2311,7 @@ static struct procunit_value_info dcr_proc_info[] = {
 	{ 0 }
 };
 
-static struct procunit_info procunits[] = {
+static const struct procunit_info procunits[] = {
 	{ UAC_PROCESS_UP_DOWNMIX, "Up Down", updown_proc_info },
 	{ UAC_PROCESS_DOLBY_PROLOGIC, "Dolby Prologic", prologic_proc_info },
 	{ UAC_PROCESS_STEREO_EXTENDER, "3D Stereo Extender", threed_enh_proc_info },
@@ -2321,16 +2321,16 @@ static struct procunit_info procunits[] = {
 	{ 0 },
 };
 
-static struct procunit_value_info uac3_updown_proc_info[] = {
+static const struct procunit_value_info uac3_updown_proc_info[] = {
 	{ UAC3_UD_MODE_SELECT, "Mode Select", USB_MIXER_U8, 1 },
 	{ 0 }
 };
-static struct procunit_value_info uac3_stereo_ext_proc_info[] = {
+static const struct procunit_value_info uac3_stereo_ext_proc_info[] = {
 	{ UAC3_EXT_WIDTH_CONTROL, "Width Control", USB_MIXER_U8 },
 	{ 0 }
 };
 
-static struct procunit_info uac3_procunits[] = {
+static const struct procunit_info uac3_procunits[] = {
 	{ UAC3_PROCESS_UP_DOWNMIX, "Up Down", uac3_updown_proc_info },
 	{ UAC3_PROCESS_STEREO_EXTENDER, "3D Stereo Extender", uac3_stereo_ext_proc_info },
 	{ UAC3_PROCESS_MULTI_FUNCTION, "Multi-Function", undefined_proc_info },
@@ -2340,23 +2340,23 @@ static struct procunit_info uac3_procunits[] = {
 /*
  * predefined data for extension units
  */
-static struct procunit_value_info clock_rate_xu_info[] = {
+static const struct procunit_value_info clock_rate_xu_info[] = {
 	{ USB_XU_CLOCK_RATE_SELECTOR, "Selector", USB_MIXER_U8, 0 },
 	{ 0 }
 };
-static struct procunit_value_info clock_source_xu_info[] = {
+static const struct procunit_value_info clock_source_xu_info[] = {
 	{ USB_XU_CLOCK_SOURCE_SELECTOR, "External", USB_MIXER_BOOLEAN },
 	{ 0 }
 };
-static struct procunit_value_info spdif_format_xu_info[] = {
+static const struct procunit_value_info spdif_format_xu_info[] = {
 	{ USB_XU_DIGITAL_FORMAT_SELECTOR, "SPDIF/AC3", USB_MIXER_BOOLEAN },
 	{ 0 }
 };
-static struct procunit_value_info soft_limit_xu_info[] = {
+static const struct procunit_value_info soft_limit_xu_info[] = {
 	{ USB_XU_SOFT_LIMIT_SELECTOR, " ", USB_MIXER_BOOLEAN },
 	{ 0 }
 };
-static struct procunit_info extunits[] = {
+static const struct procunit_info extunits[] = {
 	{ USB_XU_CLOCK_RATE, "Clock rate", clock_rate_xu_info },
 	{ USB_XU_CLOCK_SOURCE, "DigitalIn CLK source", clock_source_xu_info },
 	{ USB_XU_DIGITAL_IO_STATUS, "DigitalOut format:", spdif_format_xu_info },
@@ -2368,7 +2368,7 @@ static struct procunit_info extunits[] = {
  * build a processing/extension unit
  */
 static int build_audio_procunit(struct mixer_build *state, int unitid,
-				void *raw_desc, struct procunit_info *list,
+				void *raw_desc, const struct procunit_info *list,
 				bool extension_unit)
 {
 	struct uac_processing_unit_descriptor *desc = raw_desc;
@@ -2376,14 +2376,14 @@ static int build_audio_procunit(struct mixer_build *state, int unitid,
 	struct usb_mixer_elem_info *cval;
 	struct snd_kcontrol *kctl;
 	int i, err, nameid, type, len;
-	struct procunit_info *info;
-	struct procunit_value_info *valinfo;
+	const struct procunit_info *info;
+	const struct procunit_value_info *valinfo;
 	const struct usbmix_name_map *map;
-	static struct procunit_value_info default_value_info[] = {
+	static const struct procunit_value_info default_value_info[] = {
 		{ 0x01, "Switch", USB_MIXER_BOOLEAN },
 		{ 0 }
 	};
-	static struct procunit_info default_info = {
+	static const struct procunit_info default_info = {
 		0, NULL, default_value_info
 	};
 	const char *name = extension_unit ?
@@ -2861,7 +2861,7 @@ struct uac3_badd_profile {
 	int st_chmask;	/* side tone mixing channel mask */
 };
 
-static struct uac3_badd_profile uac3_badd_profiles[] = {
+static const struct uac3_badd_profile uac3_badd_profiles[] = {
 	{
 		/*
 		 * BAIF, BAOF or combination of both
@@ -2922,7 +2922,7 @@ static struct uac3_badd_profile uac3_badd_profiles[] = {
 };
 
 static bool uac3_badd_func_has_valid_channels(struct usb_mixer_interface *mixer,
-					      struct uac3_badd_profile *f,
+					      const struct uac3_badd_profile *f,
 					      int c_chmask, int p_chmask)
 {
 	/*
@@ -2966,7 +2966,7 @@ static int snd_usb_mixer_controls_badd(struct usb_mixer_interface *mixer,
 	struct usb_device *dev = mixer->chip->dev;
 	struct usb_interface_assoc_descriptor *assoc;
 	int badd_profile = mixer->chip->badd_profile;
-	struct uac3_badd_profile *f;
+	const struct uac3_badd_profile *f;
 	const struct usbmix_ctl_map *map;
 	int p_chmask = 0, c_chmask = 0, st_chmask = 0;
 	int i;
@@ -3260,7 +3260,7 @@ static void snd_usb_mixer_dump_cval(struct snd_info_buffer *buffer,
 				    struct usb_mixer_elem_list *list)
 {
 	struct usb_mixer_elem_info *cval = mixer_elem_list_to_info(list);
-	static char *val_types[] = {"BOOLEAN", "INV_BOOLEAN",
+	static const char * const val_types[] = {"BOOLEAN", "INV_BOOLEAN",
 				    "S8", "U8", "S16", "U16"};
 	snd_iprintf(buffer, "    Info: id=%i, control=%i, cmask=0x%x, "
 			    "channels=%i, type=\"%s\"\n", cval->head.id,
diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c
index 10323e6f7f97..d2b500a1184b 100644
--- a/sound/usb/mixer_maps.c
+++ b/sound/usb/mixer_maps.c
@@ -28,7 +28,7 @@ struct usbmix_name_map {
 	int id;
 	const char *name;
 	int control;
-	struct usbmix_dB_map *dB;
+	const struct usbmix_dB_map *dB;
 };
 
 struct usbmix_selector_map {
@@ -67,7 +67,7 @@ Mic-IN[9] --+->FU[10]----------------------------+                  |
            ++--+->SU[11]-->FU[12] --------------------------------------------------------------------------------------> USB_OUT[13]
 */
 
-static struct usbmix_name_map extigy_map[] = {
+static const struct usbmix_name_map extigy_map[] = {
 	/* 1: IT pcm */
 	{ 2, "PCM Playback" }, /* FU */
 	/* 3: IT pcm */
@@ -108,12 +108,12 @@ static struct usbmix_name_map extigy_map[] = {
  * e.g. no Master and fake PCM volume
  *			Pavel Mihaylov <bin@bash.info>
  */
-static struct usbmix_dB_map mp3plus_dB_1 = {.min = -4781, .max = 0};
+static const struct usbmix_dB_map mp3plus_dB_1 = {.min = -4781, .max = 0};
 						/* just guess */
-static struct usbmix_dB_map mp3plus_dB_2 = {.min = -1781, .max = 618};
+static const struct usbmix_dB_map mp3plus_dB_2 = {.min = -1781, .max = 618};
 						/* just guess */
 
-static struct usbmix_name_map mp3plus_map[] = {
+static const struct usbmix_name_map mp3plus_map[] = {
 	/* 1: IT pcm */
 	/* 2: IT mic */
 	/* 3: IT line */
@@ -154,7 +154,7 @@ Lin_IN[7]-+--->FU[8]---+              +->EU[23]->FU[28]------------->Spk_OUT[19]
             |                                              ^
             +->FU[13]--------------------------------------+
 */
-static struct usbmix_name_map audigy2nx_map[] = {
+static const struct usbmix_name_map audigy2nx_map[] = {
 	/* 1: IT pcm playback */
 	/* 4: IT digital in */
 	{ 6, "Digital In Playback" }, /* FU */
@@ -182,12 +182,12 @@ static struct usbmix_name_map audigy2nx_map[] = {
 	{ 0 } /* terminator */
 };
 
-static struct usbmix_name_map mbox1_map[] = {
+static const struct usbmix_name_map mbox1_map[] = {
 	{ 1, "Clock" },
 	{ 0 } /* terminator */
 };
 
-static struct usbmix_selector_map c400_selectors[] = {
+static const struct usbmix_selector_map c400_selectors[] = {
 	{
 		.id = 0x80,
 		.count = 2,
@@ -196,7 +196,7 @@ static struct usbmix_selector_map c400_selectors[] = {
 	{ 0 } /* terminator */
 };
 
-static struct usbmix_selector_map audigy2nx_selectors[] = {
+static const struct usbmix_selector_map audigy2nx_selectors[] = {
 	{
 		.id = 14, /* Capture Source */
 		.count = 3,
@@ -216,21 +216,21 @@ static struct usbmix_selector_map audigy2nx_selectors[] = {
 };
 
 /* Creative SoundBlaster Live! 24-bit External */
-static struct usbmix_name_map live24ext_map[] = {
+static const struct usbmix_name_map live24ext_map[] = {
 	/* 2: PCM Playback Volume */
 	{ 5, "Mic Capture" }, /* FU, default PCM Capture Volume */
 	{ 0 } /* terminator */
 };
 
 /* LineX FM Transmitter entry - needed to bypass controls bug */
-static struct usbmix_name_map linex_map[] = {
+static const struct usbmix_name_map linex_map[] = {
 	/* 1: IT pcm */
 	/* 2: OT Speaker */ 
 	{ 3, "Master" }, /* FU: master volume - left / right / mute */
 	{ 0 } /* terminator */
 };
 
-static struct usbmix_name_map maya44_map[] = {
+static const struct usbmix_name_map maya44_map[] = {
 	/* 1: IT line */
 	{ 2, "Line Playback" }, /* FU */
 	/* 3: IT line */
@@ -253,7 +253,7 @@ static struct usbmix_name_map maya44_map[] = {
  * so this map removes all unwanted sliders from alsamixer
  */
 
-static struct usbmix_name_map justlink_map[] = {
+static const struct usbmix_name_map justlink_map[] = {
 	/* 1: IT pcm playback */
 	/* 2: Not present */
 	{ 3, NULL}, /* IT mic (No mic input on device) */
@@ -270,7 +270,7 @@ static struct usbmix_name_map justlink_map[] = {
 };
 
 /* TerraTec Aureon 5.1 MkII USB */
-static struct usbmix_name_map aureon_51_2_map[] = {
+static const struct usbmix_name_map aureon_51_2_map[] = {
 	/* 1: IT USB */
 	/* 2: IT Mic */
 	/* 3: IT Line */
@@ -289,7 +289,7 @@ static struct usbmix_name_map aureon_51_2_map[] = {
 	{} /* terminator */
 };
 
-static struct usbmix_name_map scratch_live_map[] = {
+static const struct usbmix_name_map scratch_live_map[] = {
 	/* 1: IT Line 1 (USB streaming) */
 	/* 2: OT Line 1 (Speaker) */
 	/* 3: IT Line 1 (Line connector) */
@@ -305,7 +305,7 @@ static struct usbmix_name_map scratch_live_map[] = {
 	{ 0 } /* terminator */
 };
 
-static struct usbmix_name_map ebox44_map[] = {
+static const struct usbmix_name_map ebox44_map[] = {
 	{ 4, NULL }, /* FU */
 	{ 6, NULL }, /* MU */
 	{ 7, NULL }, /* FU */
@@ -320,7 +320,7 @@ static struct usbmix_name_map ebox44_map[] = {
  *  FIXME: or mp3plus_map should use "Capture Source" too,
  *  so this maps can be merget
  */
-static struct usbmix_name_map hercules_usb51_map[] = {
+static const struct usbmix_name_map hercules_usb51_map[] = {
 	{ 8, "Capture Source" },	/* SU, default "PCM Capture Source" */
 	{ 9, "Master Playback" },	/* FU, default "Speaker Playback" */
 	{ 10, "Mic Boost", 7 },		/* FU, default "Auto Gain Input" */
@@ -331,7 +331,7 @@ static struct usbmix_name_map hercules_usb51_map[] = {
 };
 
 /* Plantronics Gamecom 780 has a broken volume control, better to disable it */
-static struct usbmix_name_map gamecom780_map[] = {
+static const struct usbmix_name_map gamecom780_map[] = {
 	{ 9, NULL }, /* FU, speaker out */
 	{}
 };
@@ -345,8 +345,8 @@ static const struct usbmix_name_map scms_usb3318_map[] = {
 };
 
 /* Bose companion 5, the dB conversion factor is 16 instead of 256 */
-static struct usbmix_dB_map bose_companion5_dB = {-5006, -6};
-static struct usbmix_name_map bose_companion5_map[] = {
+static const struct usbmix_dB_map bose_companion5_dB = {-5006, -6};
+static const struct usbmix_name_map bose_companion5_map[] = {
 	{ 3, NULL, .dB = &bose_companion5_dB },
 	{ 0 }	/* terminator */
 };
@@ -420,7 +420,7 @@ static const struct usbmix_name_map aorus_master_alc1220vb_map[] = {
  * Control map entries
  */
 
-static struct usbmix_ctl_map usbmix_ctl_maps[] = {
+static const struct usbmix_ctl_map usbmix_ctl_maps[] = {
 	{
 		.id = USB_ID(0x041e, 0x3000),
 		.map = extigy_map,
@@ -574,37 +574,37 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = {
  * Control map entries for UAC3 BADD profiles
  */
 
-static struct usbmix_name_map uac3_badd_generic_io_map[] = {
+static const struct usbmix_name_map uac3_badd_generic_io_map[] = {
 	{ UAC3_BADD_FU_ID2, "Generic Out Playback" },
 	{ UAC3_BADD_FU_ID5, "Generic In Capture" },
 	{ 0 }					/* terminator */
 };
-static struct usbmix_name_map uac3_badd_headphone_map[] = {
+static const struct usbmix_name_map uac3_badd_headphone_map[] = {
 	{ UAC3_BADD_FU_ID2, "Headphone Playback" },
 	{ 0 }					/* terminator */
 };
-static struct usbmix_name_map uac3_badd_speaker_map[] = {
+static const struct usbmix_name_map uac3_badd_speaker_map[] = {
 	{ UAC3_BADD_FU_ID2, "Speaker Playback" },
 	{ 0 }					/* terminator */
 };
-static struct usbmix_name_map uac3_badd_microphone_map[] = {
+static const struct usbmix_name_map uac3_badd_microphone_map[] = {
 	{ UAC3_BADD_FU_ID5, "Mic Capture" },
 	{ 0 }					/* terminator */
 };
 /* Covers also 'headset adapter' profile */
-static struct usbmix_name_map uac3_badd_headset_map[] = {
+static const struct usbmix_name_map uac3_badd_headset_map[] = {
 	{ UAC3_BADD_FU_ID2, "Headset Playback" },
 	{ UAC3_BADD_FU_ID5, "Headset Capture" },
 	{ UAC3_BADD_FU_ID7, "Sidetone Mixing" },
 	{ 0 }					/* terminator */
 };
-static struct usbmix_name_map uac3_badd_speakerphone_map[] = {
+static const struct usbmix_name_map uac3_badd_speakerphone_map[] = {
 	{ UAC3_BADD_FU_ID2, "Speaker Playback" },
 	{ UAC3_BADD_FU_ID5, "Mic Capture" },
 	{ 0 }					/* terminator */
 };
 
-static struct usbmix_ctl_map uac3_badd_usbmix_ctl_maps[] = {
+static const struct usbmix_ctl_map uac3_badd_usbmix_ctl_maps[] = {
 	{
 		.id = UAC3_FUNCTION_SUBCLASS_GENERIC_IO,
 		.map = uac3_badd_generic_io_map,
diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
index d1328abd1bc4..169679419b39 100644
--- a/sound/usb/mixer_quirks.c
+++ b/sound/usb/mixer_quirks.c
@@ -130,7 +130,7 @@ static int snd_create_std_mono_ctl(struct usb_mixer_interface *mixer,
  * Create a set of standard UAC controls from a table
  */
 static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
-				struct std_mono_table *t)
+				     const struct std_mono_table *t)
 {
 	int err;
 
@@ -1399,7 +1399,7 @@ static int snd_c400_create_mixer(struct usb_mixer_interface *mixer)
  * are valid they presents mono controls as L and R channels of
  * stereo. So we provide a good mixer here.
  */
-static struct std_mono_table ebox44_table[] = {
+static const struct std_mono_table ebox44_table[] = {
 	{
 		.unitid = 4,
 		.control = 1,
@@ -1708,7 +1708,7 @@ static struct snd_kcontrol_new snd_microii_mixer_spdif[] = {
 static int snd_microii_controls_create(struct usb_mixer_interface *mixer)
 {
 	int err, i;
-	static usb_mixer_elem_resume_func_t resume_funcs[] = {
+	const static usb_mixer_elem_resume_func_t resume_funcs[] = {
 		snd_microii_spdif_default_update,
 		NULL,
 		snd_microii_spdif_switch_update
diff --git a/sound/usb/mixer_scarlett.c b/sound/usb/mixer_scarlett.c
index 4aeb9488a0c9..2e93c0b2e8e3 100644
--- a/sound/usb/mixer_scarlett.c
+++ b/sound/usb/mixer_scarlett.c
@@ -633,7 +633,7 @@ static int add_output_ctls(struct usb_mixer_interface *mixer,
 /********************** device-specific config *************************/
 
 /*  untested...  */
-static struct scarlett_device_info s6i6_info = {
+static const struct scarlett_device_info s6i6_info = {
 	.matrix_in = 18,
 	.matrix_out = 8,
 	.input_len = 6,
@@ -675,7 +675,7 @@ static struct scarlett_device_info s6i6_info = {
 };
 
 /*  untested...  */
-static struct scarlett_device_info s8i6_info = {
+static const struct scarlett_device_info s8i6_info = {
 	.matrix_in = 18,
 	.matrix_out = 6,
 	.input_len = 8,
@@ -714,7 +714,7 @@ static struct scarlett_device_info s8i6_info = {
 	}
 };
 
-static struct scarlett_device_info s18i6_info = {
+static const struct scarlett_device_info s18i6_info = {
 	.matrix_in = 18,
 	.matrix_out = 6,
 	.input_len = 18,
@@ -751,7 +751,7 @@ static struct scarlett_device_info s18i6_info = {
 	}
 };
 
-static struct scarlett_device_info s18i8_info = {
+static const struct scarlett_device_info s18i8_info = {
 	.matrix_in = 18,
 	.matrix_out = 8,
 	.input_len = 18,
@@ -793,7 +793,7 @@ static struct scarlett_device_info s18i8_info = {
 	}
 };
 
-static struct scarlett_device_info s18i20_info = {
+static const struct scarlett_device_info s18i20_info = {
 	.matrix_in = 18,
 	.matrix_out = 8,
 	.input_len = 18,
@@ -843,7 +843,7 @@ static struct scarlett_device_info s18i20_info = {
 
 
 static int scarlett_controls_create_generic(struct usb_mixer_interface *mixer,
-	struct scarlett_device_info *info)
+	const struct scarlett_device_info *info)
 {
 	int i, err;
 	char mx[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
@@ -906,7 +906,7 @@ int snd_scarlett_controls_create(struct usb_mixer_interface *mixer)
 {
 	int err, i, o;
 	char mx[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
-	struct scarlett_device_info *info;
+	const struct scarlett_device_info *info;
 	struct usb_mixer_elem_info *elem;
 	static char sample_rate_buffer[4] = { '\x80', '\xbb', '\x00', '\x00' };
 
diff --git a/sound/usb/proc.c b/sound/usb/proc.c
index 0ac89e294d31..28192b0b2548 100644
--- a/sound/usb/proc.c
+++ b/sound/usb/proc.c
@@ -74,7 +74,7 @@ void snd_usb_audio_create_proc(struct snd_usb_audio *chip)
 static void proc_dump_substream_formats(struct snd_usb_substream *subs, struct snd_info_buffer *buffer)
 {
 	struct audioformat *fp;
-	static char *sync_types[4] = {
+	static const char * const sync_types[4] = {
 		"NONE", "ASYNC", "ADAPTIVE", "SYNC"
 	};
 
diff --git a/sound/usb/stream.c b/sound/usb/stream.c
index 94bef3d04378..9a950aaf5e35 100644
--- a/sound/usb/stream.c
+++ b/sound/usb/stream.c
@@ -245,7 +245,7 @@ static int add_chmap(struct snd_pcm *pcm, int stream,
 static struct snd_pcm_chmap_elem *convert_chmap(int channels, unsigned int bits,
 						int protocol)
 {
-	static unsigned int uac1_maps[] = {
+	static const unsigned int uac1_maps[] = {
 		SNDRV_CHMAP_FL,		/* left front */
 		SNDRV_CHMAP_FR,		/* right front */
 		SNDRV_CHMAP_FC,		/* center front */
@@ -260,7 +260,7 @@ static struct snd_pcm_chmap_elem *convert_chmap(int channels, unsigned int bits,
 		SNDRV_CHMAP_TC,		/* top */
 		0 /* terminator */
 	};
-	static unsigned int uac2_maps[] = {
+	static const unsigned int uac2_maps[] = {
 		SNDRV_CHMAP_FL,		/* front left */
 		SNDRV_CHMAP_FR,		/* front right */
 		SNDRV_CHMAP_FC,		/* front center */
diff --git a/sound/usb/validate.c b/sound/usb/validate.c
index 5a3c4f7882b0..89a48d731719 100644
--- a/sound/usb/validate.c
+++ b/sound/usb/validate.c
@@ -233,7 +233,7 @@ static bool validate_midi_out_jack(const void *p,
 #define FIXED(p, t, s) { .protocol = (p), .type = (t), .size = sizeof(s) }
 #define FUNC(p, t, f) { .protocol = (p), .type = (t), .func = (f) }
 
-static struct usb_desc_validator audio_validators[] = {
+static const struct usb_desc_validator audio_validators[] = {
 	/* UAC1 */
 	FUNC(UAC_VERSION_1, UAC_HEADER, validate_uac1_header),
 	FIXED(UAC_VERSION_1, UAC_INPUT_TERMINAL,
@@ -288,7 +288,7 @@ static struct usb_desc_validator audio_validators[] = {
 	{ } /* terminator */
 };
 
-static struct usb_desc_validator midi_validators[] = {
+static const struct usb_desc_validator midi_validators[] = {
 	FIXED(UAC_VERSION_ALL, USB_MS_HEADER,
 	      struct usb_ms_header_descriptor),
 	FIXED(UAC_VERSION_ALL, USB_MS_MIDI_IN_JACK,

commit 000764fce445a8bec8f7fdebc44b8ca7bf1f28d8
Author: Takashi Iwai <tiwai@suse.de>
Date:   Tue Apr 13 10:41:52 2021 +0200

    ALSA: usb-audio: Explicitly set up the clock selector
    
    commit d2e8f641257d0d3af6e45d6ac2d6f9d56b8ea964 upstream.
    
    In the current code, we have some assumption that the audio clock
    selector has been set up implicitly and don't want to touch it unless
    it's really needed for the fallback autoclock setup.  This works for
    most devices but some seem having a problem.  Partially this was
    covered for the devices with a single connector at the initialization
    phase (commit 086b957cc17f "ALSA: usb-audio: Skip the clock selector
    inquiry for single connections"), but also there are cases where the
    wrong clock set up is kept silently.  The latter seems to be the cause
    of the noises on Behringer devices.
    
    In this patch, we explicitly set up the audio clock selector whenever
    the appropriate node is found.
    
    Reported-by: Geraldo Nascimento <geraldogabriel@gmail.com>
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=199327
    Link: https://lore.kernel.org/r/CAEsQvcvF7LnO8PxyyCxuRCx=7jNeSCvFAd-+dE0g_rd1rOxxdw@mail.gmail.com
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210413084152.32325-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/usb/clock.c b/sound/usb/clock.c
index 54818658d021..863ac42076e5 100644
--- a/sound/usb/clock.c
+++ b/sound/usb/clock.c
@@ -273,7 +273,7 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip,
 
 	selector = snd_usb_find_clock_selector(chip->ctrl_intf, entity_id);
 	if (selector) {
-		int ret, i, cur;
+		int ret, i, cur, err;
 
 		/* the entity ID we are looking for is a selector.
 		 * find out what it currently selects */
@@ -295,13 +295,17 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip,
 		ret = __uac_clock_find_source(chip, fmt,
 					      selector->baCSourceID[ret - 1],
 					      visited, validate);
+		if (ret > 0) {
+			err = uac_clock_selector_set_val(chip, entity_id, cur);
+			if (err < 0)
+				return err;
+		}
+
 		if (!validate || ret > 0 || !chip->autoclock)
 			return ret;
 
 		/* The current clock source is invalid, try others. */
 		for (i = 1; i <= selector->bNrInPins; i++) {
-			int err;
-
 			if (i == cur)
 				continue;
 
@@ -367,7 +371,7 @@ static int __uac3_clock_find_source(struct snd_usb_audio *chip,
 
 	selector = snd_usb_find_clock_selector_v3(chip->ctrl_intf, entity_id);
 	if (selector) {
-		int ret, i, cur;
+		int ret, i, cur, err;
 
 		/* the entity ID we are looking for is a selector.
 		 * find out what it currently selects */
@@ -389,6 +393,12 @@ static int __uac3_clock_find_source(struct snd_usb_audio *chip,
 		ret = __uac3_clock_find_source(chip, fmt,
 					       selector->baCSourceID[ret - 1],
 					       visited, validate);
+		if (ret > 0) {
+			err = uac_clock_selector_set_val(chip, entity_id, cur);
+			if (err < 0)
+				return err;
+		}
+
 		if (!validate || ret > 0 || !chip->autoclock)
 			return ret;
 

commit 9d7923f09338a531744ce1a2b40b28a2d8dde058
Author: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
Date:   Mon Apr 26 07:55:41 2021 -0700

    ALSA: sb: Fix two use after free in snd_sb_qsound_build
    
    commit 4fb44dd2c1dda18606348acdfdb97e8759dde9df upstream.
    
    In snd_sb_qsound_build, snd_ctl_add(..,p->qsound_switch...) and
    snd_ctl_add(..,p->qsound_space..) are called. But the second
    arguments of snd_ctl_add() could be freed via snd_ctl_add_replace()
    ->snd_ctl_free_one(). After the error code is returned,
    snd_sb_qsound_destroy(p) is called in __error branch.
    
    But in snd_sb_qsound_destroy(), the freed p->qsound_switch and
    p->qsound_space are still used by snd_ctl_remove().
    
    My patch set p->qsound_switch and p->qsound_space to NULL if
    snd_ctl_add() failed to avoid the uaf bugs. But these codes need
    to further be improved with the code style.
    
    Signed-off-by: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210426145541.8070-1-lyl2019@mail.ustc.edu.cn
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/isa/sb/sb16_csp.c b/sound/isa/sb/sb16_csp.c
index bf3db0d2ea12..2e00b64ef13b 100644
--- a/sound/isa/sb/sb16_csp.c
+++ b/sound/isa/sb/sb16_csp.c
@@ -1059,10 +1059,14 @@ static int snd_sb_qsound_build(struct snd_sb_csp * p)
 
 	spin_lock_init(&p->q_lock);
 
-	if ((err = snd_ctl_add(card, p->qsound_switch = snd_ctl_new1(&snd_sb_qsound_switch, p))) < 0)
+	if ((err = snd_ctl_add(card, p->qsound_switch = snd_ctl_new1(&snd_sb_qsound_switch, p))) < 0) {
+		p->qsound_switch = NULL;
 		goto __error;
-	if ((err = snd_ctl_add(card, p->qsound_space = snd_ctl_new1(&snd_sb_qsound_space, p))) < 0)
+	}
+	if ((err = snd_ctl_add(card, p->qsound_space = snd_ctl_new1(&snd_sb_qsound_space, p))) < 0) {
+		p->qsound_space = NULL;
 		goto __error;
+	}
 
 	return 0;
 

commit fe60736eb6823b36010c98a54633e8946befbfd4
Author: Takashi Iwai <tiwai@suse.de>
Date:   Wed Apr 28 13:27:04 2021 +0200

    ALSA: hda/conexant: Re-order CX5066 quirk table entries
    
    commit 2e6a731296be9d356fdccee9fb6ae345dad96438 upstream.
    
    Just re-order the cx5066_fixups[] entries for HP devices for avoiding
    the oversight of the duplicated or unapplied item in future.
    No functional changes.
    
    Also Cc-to-stable for the further patch applications.
    
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210428112704.23967-14-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
index 7d471ecc1ca0..8851cd11dc9c 100644
--- a/sound/pci/hda/patch_conexant.c
+++ b/sound/pci/hda/patch_conexant.c
@@ -911,18 +911,18 @@ static const struct snd_pci_quirk cxt5066_fixups[] = {
 	SND_PCI_QUIRK(0x103c, 0x8079, "HP EliteBook 840 G3", CXT_FIXUP_HP_DOCK),
 	SND_PCI_QUIRK(0x103c, 0x807C, "HP EliteBook 820 G3", CXT_FIXUP_HP_DOCK),
 	SND_PCI_QUIRK(0x103c, 0x80FD, "HP ProBook 640 G2", CXT_FIXUP_HP_DOCK),
-	SND_PCI_QUIRK(0x103c, 0x828c, "HP EliteBook 840 G4", CXT_FIXUP_HP_DOCK),
-	SND_PCI_QUIRK(0x103c, 0x83b2, "HP EliteBook 840 G5", CXT_FIXUP_HP_DOCK),
-	SND_PCI_QUIRK(0x103c, 0x83b3, "HP EliteBook 830 G5", CXT_FIXUP_HP_DOCK),
-	SND_PCI_QUIRK(0x103c, 0x83d3, "HP ProBook 640 G4", CXT_FIXUP_HP_DOCK),
-	SND_PCI_QUIRK(0x103c, 0x8174, "HP Spectre x360", CXT_FIXUP_HP_SPECTRE),
 	SND_PCI_QUIRK(0x103c, 0x8115, "HP Z1 Gen3", CXT_FIXUP_HP_GATE_MIC),
 	SND_PCI_QUIRK(0x103c, 0x814f, "HP ZBook 15u G3", CXT_FIXUP_MUTE_LED_GPIO),
+	SND_PCI_QUIRK(0x103c, 0x8174, "HP Spectre x360", CXT_FIXUP_HP_SPECTRE),
 	SND_PCI_QUIRK(0x103c, 0x822e, "HP ProBook 440 G4", CXT_FIXUP_MUTE_LED_GPIO),
-	SND_PCI_QUIRK(0x103c, 0x836e, "HP ProBook 455 G5", CXT_FIXUP_MUTE_LED_GPIO),
-	SND_PCI_QUIRK(0x103c, 0x837f, "HP ProBook 470 G5", CXT_FIXUP_MUTE_LED_GPIO),
+	SND_PCI_QUIRK(0x103c, 0x828c, "HP EliteBook 840 G4", CXT_FIXUP_HP_DOCK),
 	SND_PCI_QUIRK(0x103c, 0x8299, "HP 800 G3 SFF", CXT_FIXUP_HP_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x103c, 0x829a, "HP 800 G3 DM", CXT_FIXUP_HP_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x103c, 0x836e, "HP ProBook 455 G5", CXT_FIXUP_MUTE_LED_GPIO),
+	SND_PCI_QUIRK(0x103c, 0x837f, "HP ProBook 470 G5", CXT_FIXUP_MUTE_LED_GPIO),
+	SND_PCI_QUIRK(0x103c, 0x83b2, "HP EliteBook 840 G5", CXT_FIXUP_HP_DOCK),
+	SND_PCI_QUIRK(0x103c, 0x83b3, "HP EliteBook 830 G5", CXT_FIXUP_HP_DOCK),
+	SND_PCI_QUIRK(0x103c, 0x83d3, "HP ProBook 640 G4", CXT_FIXUP_HP_DOCK),
 	SND_PCI_QUIRK(0x103c, 0x8402, "HP ProBook 645 G4", CXT_FIXUP_MUTE_LED_GPIO),
 	SND_PCI_QUIRK(0x103c, 0x8455, "HP Z2 G4", CXT_FIXUP_HP_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x103c, 0x8456, "HP Z2 G4 SFF", CXT_FIXUP_HP_MIC_NO_PRESENCE),

commit 46b41c8fa14cf70320701bbabc652e7b5bbc53b0
Author: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
Date:   Mon Apr 26 06:11:29 2021 -0700

    ALSA: emu8000: Fix a use after free in snd_emu8000_create_mixer
    
    commit 1c98f574403dbcf2eb832d5535a10d967333ef2d upstream.
    
    Our code analyzer reported a uaf.
    
    In snd_emu8000_create_mixer, the callee snd_ctl_add(..,emu->controls[i])
    calls snd_ctl_add_replace(.., kcontrol,..). Inside snd_ctl_add_replace(),
    if error happens, kcontrol will be freed by snd_ctl_free_one(kcontrol).
    Then emu->controls[i] points to a freed memory, and the execution comes
    to __error branch of snd_emu8000_create_mixer. The freed emu->controls[i]
    is used in snd_ctl_remove(card, emu->controls[i]).
    
    My patch set emu->controls[i] to NULL if snd_ctl_add() failed to avoid
    the uaf.
    
    Signed-off-by: Lv Yunlong <lyl2019@mail.ustc.edu.cn>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210426131129.4796-1-lyl2019@mail.ustc.edu.cn
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/isa/sb/emu8000.c b/sound/isa/sb/emu8000.c
index d56973b770c7..24b91cb32839 100644
--- a/sound/isa/sb/emu8000.c
+++ b/sound/isa/sb/emu8000.c
@@ -1042,8 +1042,10 @@ snd_emu8000_create_mixer(struct snd_card *card, struct snd_emu8000 *emu)
 
 	memset(emu->controls, 0, sizeof(emu->controls));
 	for (i = 0; i < EMU8000_NUM_CONTROLS; i++) {
-		if ((err = snd_ctl_add(card, emu->controls[i] = snd_ctl_new1(mixer_defs[i], emu))) < 0)
+		if ((err = snd_ctl_add(card, emu->controls[i] = snd_ctl_new1(mixer_defs[i], emu))) < 0) {
+			emu->controls[i] = NULL;
 			goto __error;
+		}
 	}
 	return 0;
 

commit 5bceddd8e48ecdba2362418c84644ff933b2fad0
Author: Harald Freudenberger <freude@linux.ibm.com>
Date:   Tue Apr 20 08:23:12 2021 +0200

    s390/archrandom: add parameter check for s390_arch_random_generate
    
    [ Upstream commit 28096067686c5a5cbd4c35b079749bd805df5010 ]
    
    A review of the code showed, that this function which is exposed
    within the whole kernel should do a parameter check for the
    amount of bytes requested. If this requested bytes is too high
    an unsigned int overflow could happen causing this function to
    try to memcpy a really big memory chunk.
    
    This is not a security issue as there are only two invocations
    of this function from arch/s390/include/asm/archrandom.h and both
    are not exposed to userland.
    
    Reported-by: Sven Schnelle <svens@linux.ibm.com>
    Signed-off-by: Harald Freudenberger <freude@linux.ibm.com>
    Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/s390/crypto/arch_random.c b/arch/s390/crypto/arch_random.c
index dd95cdbd22ce..4cbb4b6d85a8 100644
--- a/arch/s390/crypto/arch_random.c
+++ b/arch/s390/crypto/arch_random.c
@@ -53,6 +53,10 @@ static DECLARE_DELAYED_WORK(arch_rng_work, arch_rng_refill_buffer);
 
 bool s390_arch_random_generate(u8 *buf, unsigned int nbytes)
 {
+	/* max hunk is ARCH_RNG_BUF_SIZE */
+	if (nbytes > ARCH_RNG_BUF_SIZE)
+		return false;
+
 	/* lock rng buffer */
 	if (!spin_trylock(&arch_rng_lock))
 		return false;

commit b3d6fe4fe33d4a05bcef6294e52c315e8a4fb945
Author: Bart Van Assche <bvanassche@acm.org>
Date:   Thu Apr 15 15:08:13 2021 -0700

    scsi: libfc: Fix a format specifier
    
    [ Upstream commit 90d6697810f06aceea9de71ad836a8c7669789cd ]
    
    Since the 'mfs' member has been declared as 'u32' in include/scsi/libfc.h,
    use the %u format specifier instead of %hu. This patch fixes the following
    clang compiler warning:
    
    warning: format specifies type
          'unsigned short' but the argument has type 'u32' (aka 'unsigned int')
          [-Wformat]
                                 "lport->mfs:%hu\n", mfs, lport->mfs);
                                             ~~~          ^~~~~~~~~~
                                             %u
    
    Link: https://lore.kernel.org/r/20210415220826.29438-8-bvanassche@acm.org
    Cc: Hannes Reinecke <hare@suse.de>
    Signed-off-by: Bart Van Assche <bvanassche@acm.org>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c
index ff943f477d6f..f653109d56af 100644
--- a/drivers/scsi/libfc/fc_lport.c
+++ b/drivers/scsi/libfc/fc_lport.c
@@ -1741,7 +1741,7 @@ void fc_lport_flogi_resp(struct fc_seq *sp, struct fc_frame *fp,
 
 	if (mfs < FC_SP_MIN_MAX_PAYLOAD || mfs > FC_SP_MAX_MAX_PAYLOAD) {
 		FC_LPORT_DBG(lport, "FLOGI bad mfs:%hu response, "
-			     "lport->mfs:%hu\n", mfs, lport->mfs);
+			     "lport->mfs:%u\n", mfs, lport->mfs);
 		fc_lport_error(lport, fp);
 		goto out;
 	}

commit 3a4cc6f93af50f1f66ed8361472a4930bb70371d
Author: James Smart <jsmart2021@gmail.com>
Date:   Sun Apr 11 18:31:22 2021 -0700

    scsi: lpfc: Remove unsupported mbox PORT_CAPABILITIES logic
    
    [ Upstream commit b62232ba8caccaf1954e197058104a6478fac1af ]
    
    SLI-4 does not contain a PORT_CAPABILITIES mailbox command (only SLI-3
    does, and SLI-3 doesn't use it), yet there are SLI-4 code paths that have
    code to issue the command.  The command will always fail.
    
    Remove the code for the mailbox command and leave only the resulting
    "failure path" logic.
    
    Link: https://lore.kernel.org/r/20210412013127.2387-12-jsmart2021@gmail.com
    Co-developed-by: Justin Tee <justin.tee@broadcom.com>
    Signed-off-by: Justin Tee <justin.tee@broadcom.com>
    Signed-off-by: James Smart <jsmart2021@gmail.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/lpfc/lpfc_crtn.h b/drivers/scsi/lpfc/lpfc_crtn.h
index bea24bc4410a..1a0b1cb9de78 100644
--- a/drivers/scsi/lpfc/lpfc_crtn.h
+++ b/drivers/scsi/lpfc/lpfc_crtn.h
@@ -56,9 +56,6 @@ void lpfc_register_new_vport(struct lpfc_hba *, struct lpfc_vport *,
 void lpfc_unreg_vpi(struct lpfc_hba *, uint16_t, LPFC_MBOXQ_t *);
 void lpfc_init_link(struct lpfc_hba *, LPFC_MBOXQ_t *, uint32_t, uint32_t);
 void lpfc_request_features(struct lpfc_hba *, struct lpfcMboxq *);
-void lpfc_supported_pages(struct lpfcMboxq *);
-void lpfc_pc_sli4_params(struct lpfcMboxq *);
-int lpfc_pc_sli4_params_get(struct lpfc_hba *, LPFC_MBOXQ_t *);
 int lpfc_sli4_mbox_rsrc_extent(struct lpfc_hba *, struct lpfcMboxq *,
 			   uint16_t, uint16_t, bool);
 int lpfc_get_sli4_parameters(struct lpfc_hba *, LPFC_MBOXQ_t *);
diff --git a/drivers/scsi/lpfc/lpfc_hw4.h b/drivers/scsi/lpfc/lpfc_hw4.h
index 083f8c8706e5..a9bd12bfc15e 100644
--- a/drivers/scsi/lpfc/lpfc_hw4.h
+++ b/drivers/scsi/lpfc/lpfc_hw4.h
@@ -122,6 +122,7 @@ struct lpfc_sli_intf {
 /* Define SLI4 Alignment requirements. */
 #define LPFC_ALIGN_16_BYTE	16
 #define LPFC_ALIGN_64_BYTE	64
+#define SLI4_PAGE_SIZE		4096
 
 /* Define SLI4 specific definitions. */
 #define LPFC_MQ_CQE_BYTE_OFFSET	256
@@ -2886,62 +2887,6 @@ struct lpfc_mbx_request_features {
 #define lpfc_mbx_rq_ftr_rsp_mrqp_WORD		word3
 };
 
-struct lpfc_mbx_supp_pages {
-	uint32_t word1;
-#define qs_SHIFT 				0
-#define qs_MASK					0x00000001
-#define qs_WORD					word1
-#define wr_SHIFT				1
-#define wr_MASK 				0x00000001
-#define wr_WORD					word1
-#define pf_SHIFT				8
-#define pf_MASK					0x000000ff
-#define pf_WORD					word1
-#define cpn_SHIFT				16
-#define cpn_MASK				0x000000ff
-#define cpn_WORD				word1
-	uint32_t word2;
-#define list_offset_SHIFT 			0
-#define list_offset_MASK			0x000000ff
-#define list_offset_WORD			word2
-#define next_offset_SHIFT			8
-#define next_offset_MASK			0x000000ff
-#define next_offset_WORD			word2
-#define elem_cnt_SHIFT				16
-#define elem_cnt_MASK				0x000000ff
-#define elem_cnt_WORD				word2
-	uint32_t word3;
-#define pn_0_SHIFT				24
-#define pn_0_MASK  				0x000000ff
-#define pn_0_WORD				word3
-#define pn_1_SHIFT				16
-#define pn_1_MASK				0x000000ff
-#define pn_1_WORD				word3
-#define pn_2_SHIFT				8
-#define pn_2_MASK				0x000000ff
-#define pn_2_WORD				word3
-#define pn_3_SHIFT				0
-#define pn_3_MASK				0x000000ff
-#define pn_3_WORD				word3
-	uint32_t word4;
-#define pn_4_SHIFT				24
-#define pn_4_MASK				0x000000ff
-#define pn_4_WORD				word4
-#define pn_5_SHIFT				16
-#define pn_5_MASK				0x000000ff
-#define pn_5_WORD				word4
-#define pn_6_SHIFT				8
-#define pn_6_MASK				0x000000ff
-#define pn_6_WORD				word4
-#define pn_7_SHIFT				0
-#define pn_7_MASK				0x000000ff
-#define pn_7_WORD				word4
-	uint32_t rsvd[27];
-#define LPFC_SUPP_PAGES			0
-#define LPFC_BLOCK_GUARD_PROFILES	1
-#define LPFC_SLI4_PARAMETERS		2
-};
-
 struct lpfc_mbx_memory_dump_type3 {
 	uint32_t word1;
 #define lpfc_mbx_memory_dump_type3_type_SHIFT    0
@@ -3158,121 +3103,6 @@ struct user_eeprom {
 	uint8_t reserved191[57];
 };
 
-struct lpfc_mbx_pc_sli4_params {
-	uint32_t word1;
-#define qs_SHIFT				0
-#define qs_MASK					0x00000001
-#define qs_WORD					word1
-#define wr_SHIFT				1
-#define wr_MASK					0x00000001
-#define wr_WORD					word1
-#define pf_SHIFT				8
-#define pf_MASK					0x000000ff
-#define pf_WORD					word1
-#define cpn_SHIFT				16
-#define cpn_MASK				0x000000ff
-#define cpn_WORD				word1
-	uint32_t word2;
-#define if_type_SHIFT				0
-#define if_type_MASK				0x00000007
-#define if_type_WORD				word2
-#define sli_rev_SHIFT				4
-#define sli_rev_MASK				0x0000000f
-#define sli_rev_WORD				word2
-#define sli_family_SHIFT			8
-#define sli_family_MASK				0x000000ff
-#define sli_family_WORD				word2
-#define featurelevel_1_SHIFT			16
-#define featurelevel_1_MASK			0x000000ff
-#define featurelevel_1_WORD			word2
-#define featurelevel_2_SHIFT			24
-#define featurelevel_2_MASK			0x0000001f
-#define featurelevel_2_WORD			word2
-	uint32_t word3;
-#define fcoe_SHIFT 				0
-#define fcoe_MASK				0x00000001
-#define fcoe_WORD				word3
-#define fc_SHIFT				1
-#define fc_MASK					0x00000001
-#define fc_WORD					word3
-#define nic_SHIFT				2
-#define nic_MASK				0x00000001
-#define nic_WORD				word3
-#define iscsi_SHIFT				3
-#define iscsi_MASK				0x00000001
-#define iscsi_WORD				word3
-#define rdma_SHIFT				4
-#define rdma_MASK				0x00000001
-#define rdma_WORD				word3
-	uint32_t sge_supp_len;
-#define SLI4_PAGE_SIZE 4096
-	uint32_t word5;
-#define if_page_sz_SHIFT			0
-#define if_page_sz_MASK				0x0000ffff
-#define if_page_sz_WORD				word5
-#define loopbk_scope_SHIFT			24
-#define loopbk_scope_MASK			0x0000000f
-#define loopbk_scope_WORD			word5
-#define rq_db_window_SHIFT			28
-#define rq_db_window_MASK			0x0000000f
-#define rq_db_window_WORD			word5
-	uint32_t word6;
-#define eq_pages_SHIFT				0
-#define eq_pages_MASK				0x0000000f
-#define eq_pages_WORD				word6
-#define eqe_size_SHIFT				8
-#define eqe_size_MASK				0x000000ff
-#define eqe_size_WORD				word6
-	uint32_t word7;
-#define cq_pages_SHIFT				0
-#define cq_pages_MASK				0x0000000f
-#define cq_pages_WORD				word7
-#define cqe_size_SHIFT				8
-#define cqe_size_MASK				0x000000ff
-#define cqe_size_WORD				word7
-	uint32_t word8;
-#define mq_pages_SHIFT				0
-#define mq_pages_MASK				0x0000000f
-#define mq_pages_WORD				word8
-#define mqe_size_SHIFT				8
-#define mqe_size_MASK				0x000000ff
-#define mqe_size_WORD				word8
-#define mq_elem_cnt_SHIFT			16
-#define mq_elem_cnt_MASK			0x000000ff
-#define mq_elem_cnt_WORD			word8
-	uint32_t word9;
-#define wq_pages_SHIFT				0
-#define wq_pages_MASK				0x0000ffff
-#define wq_pages_WORD				word9
-#define wqe_size_SHIFT				8
-#define wqe_size_MASK				0x000000ff
-#define wqe_size_WORD				word9
-	uint32_t word10;
-#define rq_pages_SHIFT				0
-#define rq_pages_MASK				0x0000ffff
-#define rq_pages_WORD				word10
-#define rqe_size_SHIFT				8
-#define rqe_size_MASK				0x000000ff
-#define rqe_size_WORD				word10
-	uint32_t word11;
-#define hdr_pages_SHIFT				0
-#define hdr_pages_MASK				0x0000000f
-#define hdr_pages_WORD				word11
-#define hdr_size_SHIFT				8
-#define hdr_size_MASK				0x0000000f
-#define hdr_size_WORD				word11
-#define hdr_pp_align_SHIFT			16
-#define hdr_pp_align_MASK			0x0000ffff
-#define hdr_pp_align_WORD			word11
-	uint32_t word12;
-#define sgl_pages_SHIFT				0
-#define sgl_pages_MASK				0x0000000f
-#define sgl_pages_WORD				word12
-#define sgl_pp_align_SHIFT			16
-#define sgl_pp_align_MASK			0x0000ffff
-#define sgl_pp_align_WORD			word12
-	uint32_t rsvd_13_63[51];
-};
 #define SLI4_PAGE_ALIGN(addr) (((addr)+((SLI4_PAGE_SIZE)-1)) \
 			       &(~((SLI4_PAGE_SIZE)-1)))
 
@@ -3854,8 +3684,6 @@ struct lpfc_mqe {
 		struct lpfc_mbx_post_hdr_tmpl hdr_tmpl;
 		struct lpfc_mbx_query_fw_config query_fw_cfg;
 		struct lpfc_mbx_set_beacon_config beacon_config;
-		struct lpfc_mbx_supp_pages supp_pages;
-		struct lpfc_mbx_pc_sli4_params sli4_params;
 		struct lpfc_mbx_get_sli4_parameters get_sli4_parameters;
 		struct lpfc_mbx_set_link_diag_state link_diag_state;
 		struct lpfc_mbx_set_link_diag_loopback link_diag_loopback;
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
index 57510a831735..c6caacaa3e7a 100644
--- a/drivers/scsi/lpfc/lpfc_init.c
+++ b/drivers/scsi/lpfc/lpfc_init.c
@@ -5854,8 +5854,6 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
 	LPFC_MBOXQ_t *mboxq;
 	MAILBOX_t *mb;
 	int rc, i, max_buf_size;
-	uint8_t pn_page[LPFC_MAX_SUPPORTED_PAGES] = {0};
-	struct lpfc_mqe *mqe;
 	int longs;
 	int fof_vectors = 0;
 	int extra;
@@ -6150,32 +6148,6 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
 
 	lpfc_nvme_mod_param_dep(phba);
 
-	/* Get the Supported Pages if PORT_CAPABILITIES is supported by port. */
-	lpfc_supported_pages(mboxq);
-	rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL);
-	if (!rc) {
-		mqe = &mboxq->u.mqe;
-		memcpy(&pn_page[0], ((uint8_t *)&mqe->un.supp_pages.word3),
-		       LPFC_MAX_SUPPORTED_PAGES);
-		for (i = 0; i < LPFC_MAX_SUPPORTED_PAGES; i++) {
-			switch (pn_page[i]) {
-			case LPFC_SLI4_PARAMETERS:
-				phba->sli4_hba.pc_sli4_params.supported = 1;
-				break;
-			default:
-				break;
-			}
-		}
-		/* Read the port's SLI4 Parameters capabilities if supported. */
-		if (phba->sli4_hba.pc_sli4_params.supported)
-			rc = lpfc_pc_sli4_params_get(phba, mboxq);
-		if (rc) {
-			mempool_free(mboxq, phba->mbox_mem_pool);
-			rc = -EIO;
-			goto out_free_bsmbx;
-		}
-	}
-
 	/*
 	 * Get sli4 parameters that override parameters from Port capabilities.
 	 * If this call fails, it isn't critical unless the SLI4 parameters come
@@ -10517,78 +10489,6 @@ lpfc_sli4_hba_unset(struct lpfc_hba *phba)
 	phba->pport->work_port_events = 0;
 }
 
- /**
- * lpfc_pc_sli4_params_get - Get the SLI4_PARAMS port capabilities.
- * @phba: Pointer to HBA context object.
- * @mboxq: Pointer to the mailboxq memory for the mailbox command response.
- *
- * This function is called in the SLI4 code path to read the port's
- * sli4 capabilities.
- *
- * This function may be be called from any context that can block-wait
- * for the completion.  The expectation is that this routine is called
- * typically from probe_one or from the online routine.
- **/
-int
-lpfc_pc_sli4_params_get(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
-{
-	int rc;
-	struct lpfc_mqe *mqe;
-	struct lpfc_pc_sli4_params *sli4_params;
-	uint32_t mbox_tmo;
-
-	rc = 0;
-	mqe = &mboxq->u.mqe;
-
-	/* Read the port's SLI4 Parameters port capabilities */
-	lpfc_pc_sli4_params(mboxq);
-	if (!phba->sli4_hba.intr_enable)
-		rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL);
-	else {
-		mbox_tmo = lpfc_mbox_tmo_val(phba, mboxq);
-		rc = lpfc_sli_issue_mbox_wait(phba, mboxq, mbox_tmo);
-	}
-
-	if (unlikely(rc))
-		return 1;
-
-	sli4_params = &phba->sli4_hba.pc_sli4_params;
-	sli4_params->if_type = bf_get(if_type, &mqe->un.sli4_params);
-	sli4_params->sli_rev = bf_get(sli_rev, &mqe->un.sli4_params);
-	sli4_params->sli_family = bf_get(sli_family, &mqe->un.sli4_params);
-	sli4_params->featurelevel_1 = bf_get(featurelevel_1,
-					     &mqe->un.sli4_params);
-	sli4_params->featurelevel_2 = bf_get(featurelevel_2,
-					     &mqe->un.sli4_params);
-	sli4_params->proto_types = mqe->un.sli4_params.word3;
-	sli4_params->sge_supp_len = mqe->un.sli4_params.sge_supp_len;
-	sli4_params->if_page_sz = bf_get(if_page_sz, &mqe->un.sli4_params);
-	sli4_params->rq_db_window = bf_get(rq_db_window, &mqe->un.sli4_params);
-	sli4_params->loopbk_scope = bf_get(loopbk_scope, &mqe->un.sli4_params);
-	sli4_params->eq_pages_max = bf_get(eq_pages, &mqe->un.sli4_params);
-	sli4_params->eqe_size = bf_get(eqe_size, &mqe->un.sli4_params);
-	sli4_params->cq_pages_max = bf_get(cq_pages, &mqe->un.sli4_params);
-	sli4_params->cqe_size = bf_get(cqe_size, &mqe->un.sli4_params);
-	sli4_params->mq_pages_max = bf_get(mq_pages, &mqe->un.sli4_params);
-	sli4_params->mqe_size = bf_get(mqe_size, &mqe->un.sli4_params);
-	sli4_params->mq_elem_cnt = bf_get(mq_elem_cnt, &mqe->un.sli4_params);
-	sli4_params->wq_pages_max = bf_get(wq_pages, &mqe->un.sli4_params);
-	sli4_params->wqe_size = bf_get(wqe_size, &mqe->un.sli4_params);
-	sli4_params->rq_pages_max = bf_get(rq_pages, &mqe->un.sli4_params);
-	sli4_params->rqe_size = bf_get(rqe_size, &mqe->un.sli4_params);
-	sli4_params->hdr_pages_max = bf_get(hdr_pages, &mqe->un.sli4_params);
-	sli4_params->hdr_size = bf_get(hdr_size, &mqe->un.sli4_params);
-	sli4_params->hdr_pp_align = bf_get(hdr_pp_align, &mqe->un.sli4_params);
-	sli4_params->sgl_pages_max = bf_get(sgl_pages, &mqe->un.sli4_params);
-	sli4_params->sgl_pp_align = bf_get(sgl_pp_align, &mqe->un.sli4_params);
-
-	/* Make sure that sge_supp_len can be handled by the driver */
-	if (sli4_params->sge_supp_len > LPFC_MAX_SGE_SIZE)
-		sli4_params->sge_supp_len = LPFC_MAX_SGE_SIZE;
-
-	return rc;
-}
-
 /**
  * lpfc_get_sli4_parameters - Get the SLI4 Config PARAMETERS.
  * @phba: Pointer to HBA context object.
@@ -10647,7 +10547,8 @@ lpfc_get_sli4_parameters(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
 	else
 		phba->sli3_options &= ~LPFC_SLI4_PHWQ_ENABLED;
 	sli4_params->sge_supp_len = mbx_sli4_parameters->sge_supp_len;
-	sli4_params->loopbk_scope = bf_get(loopbk_scope, mbx_sli4_parameters);
+	sli4_params->loopbk_scope = bf_get(cfg_loopbk_scope,
+					   mbx_sli4_parameters);
 	sli4_params->oas_supported = bf_get(cfg_oas, mbx_sli4_parameters);
 	sli4_params->cqv = bf_get(cfg_cqv, mbx_sli4_parameters);
 	sli4_params->mqv = bf_get(cfg_mqv, mbx_sli4_parameters);
diff --git a/drivers/scsi/lpfc/lpfc_mbox.c b/drivers/scsi/lpfc/lpfc_mbox.c
index e6bf5e8bc767..a4c382d2ce79 100644
--- a/drivers/scsi/lpfc/lpfc_mbox.c
+++ b/drivers/scsi/lpfc/lpfc_mbox.c
@@ -2622,39 +2622,3 @@ lpfc_resume_rpi(struct lpfcMboxq *mbox, struct lpfc_nodelist *ndlp)
 	resume_rpi->event_tag = ndlp->phba->fc_eventTag;
 }
 
-/**
- * lpfc_supported_pages - Initialize the PORT_CAPABILITIES supported pages
- *                        mailbox command.
- * @mbox: pointer to lpfc mbox command to initialize.
- *
- * The PORT_CAPABILITIES supported pages mailbox command is issued to
- * retrieve the particular feature pages supported by the port.
- **/
-void
-lpfc_supported_pages(struct lpfcMboxq *mbox)
-{
-	struct lpfc_mbx_supp_pages *supp_pages;
-
-	memset(mbox, 0, sizeof(*mbox));
-	supp_pages = &mbox->u.mqe.un.supp_pages;
-	bf_set(lpfc_mqe_command, &mbox->u.mqe, MBX_PORT_CAPABILITIES);
-	bf_set(cpn, supp_pages, LPFC_SUPP_PAGES);
-}
-
-/**
- * lpfc_pc_sli4_params - Initialize the PORT_CAPABILITIES SLI4 Params mbox cmd.
- * @mbox: pointer to lpfc mbox command to initialize.
- *
- * The PORT_CAPABILITIES SLI4 parameters mailbox command is issued to
- * retrieve the particular SLI4 features supported by the port.
- **/
-void
-lpfc_pc_sli4_params(struct lpfcMboxq *mbox)
-{
-	struct lpfc_mbx_pc_sli4_params *sli4_params;
-
-	memset(mbox, 0, sizeof(*mbox));
-	sli4_params = &mbox->u.mqe.un.sli4_params;
-	bf_set(lpfc_mqe_command, &mbox->u.mqe, MBX_PORT_CAPABILITIES);
-	bf_set(cpn, sli4_params, LPFC_SLI4_PARAMETERS);
-}

commit 78d19465a2e66c397d8d210d384524be3ed72636
Author: James Smart <jsmart2021@gmail.com>
Date:   Sun Apr 11 18:31:13 2021 -0700

    scsi: lpfc: Fix crash when a REG_RPI mailbox fails triggering a LOGO response
    
    [ Upstream commit fffd18ec6579c2d9c72b212169259062fe747888 ]
    
    Fix a crash caused by a double put on the node when the driver completed an
    ACC for an unsolicted abort on the same node.  The second put was executed
    by lpfc_nlp_not_used() and is wrong because the completion routine executes
    the nlp_put when the iocbq was released.  Additionally, the driver is
    issuing a LOGO then immediately calls lpfc_nlp_set_state to put the node
    into NPR.  This call does nothing.
    
    Remove the lpfc_nlp_not_used call and additional set_state in the
    completion routine.  Remove the lpfc_nlp_set_state post issue_logo.  Isn't
    necessary.
    
    Link: https://lore.kernel.org/r/20210412013127.2387-3-jsmart2021@gmail.com
    Co-developed-by: Justin Tee <justin.tee@broadcom.com>
    Signed-off-by: Justin Tee <justin.tee@broadcom.com>
    Signed-off-by: James Smart <jsmart2021@gmail.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c
index 518bdae24543..9442fb30e7cd 100644
--- a/drivers/scsi/lpfc/lpfc_nportdisc.c
+++ b/drivers/scsi/lpfc/lpfc_nportdisc.c
@@ -1743,8 +1743,6 @@ lpfc_cmpl_reglogin_reglogin_issue(struct lpfc_vport *vport,
 		ndlp->nlp_last_elscmd = ELS_CMD_PLOGI;
 
 		lpfc_issue_els_logo(vport, ndlp, 0);
-		ndlp->nlp_prev_state = NLP_STE_REG_LOGIN_ISSUE;
-		lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
 		return ndlp->nlp_state;
 	}
 
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
index a7b14875af5f..f4633c9f8183 100644
--- a/drivers/scsi/lpfc/lpfc_sli.c
+++ b/drivers/scsi/lpfc/lpfc_sli.c
@@ -17018,7 +17018,6 @@ lpfc_sli4_seq_abort_rsp_cmpl(struct lpfc_hba *phba,
 	if (cmd_iocbq) {
 		ndlp = (struct lpfc_nodelist *)cmd_iocbq->context1;
 		lpfc_nlp_put(ndlp);
-		lpfc_nlp_not_used(ndlp);
 		lpfc_sli_release_iocbq(phba, cmd_iocbq);
 	}
 

commit 5a63a025c2347274ab4dc73f56b1d5832f96545c
Author: Guchun Chen <guchun.chen@amd.com>
Date:   Tue Mar 30 17:52:18 2021 +0800

    drm/amdgpu: fix NULL pointer dereference
    
    [ Upstream commit 3c3dc654333f6389803cdcaf03912e94173ae510 ]
    
    ttm->sg needs to be checked before accessing its child member.
    
    Call Trace:
     amdgpu_ttm_backend_destroy+0x12/0x70 [amdgpu]
     ttm_bo_cleanup_memtype_use+0x3a/0x60 [ttm]
     ttm_bo_release+0x17d/0x300 [ttm]
     amdgpu_bo_unref+0x1a/0x30 [amdgpu]
     amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu+0x78b/0x8b0 [amdgpu]
     kfd_ioctl_alloc_memory_of_gpu+0x118/0x220 [amdgpu]
     kfd_ioctl+0x222/0x400 [amdgpu]
     ? kfd_dev_is_large_bar+0x90/0x90 [amdgpu]
     __x64_sys_ioctl+0x8e/0xd0
     ? __context_tracking_exit+0x52/0x90
     do_syscall_64+0x33/0x80
     entry_SYSCALL_64_after_hwframe+0x44/0xa9
    RIP: 0033:0x7f97f264d317
    Code: b3 66 90 48 8b 05 71 4b 2d 00 64 c7 00 26 00 00 00 48 c7 c0 ff ff ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 b8 10 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 41 4b 2d 00 f7 d8 64 89 01 48
    RSP: 002b:00007ffdb402c338 EFLAGS: 00000246 ORIG_RAX: 0000000000000010
    RAX: ffffffffffffffda RBX: 00007f97f3cc63a0 RCX: 00007f97f264d317
    RDX: 00007ffdb402c380 RSI: 00000000c0284b16 RDI: 0000000000000003
    RBP: 00007ffdb402c380 R08: 00007ffdb402c428 R09: 00000000c4000004
    R10: 00000000c4000004 R11: 0000000000000246 R12: 00000000c0284b16
    R13: 0000000000000003 R14: 00007f97f3cc63a0 R15: 00007f8836200000
    
    Signed-off-by: Guchun Chen <guchun.chen@amd.com>
    Acked-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index abad7460084f..757fa486aac4 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -971,7 +971,7 @@ static void amdgpu_ttm_tt_unpin_userptr(struct ttm_tt *ttm)
 		DMA_BIDIRECTIONAL : DMA_TO_DEVICE;
 
 	/* double check that we don't free the table twice */
-	if (!ttm->sg->sgl)
+	if (!ttm->sg || !ttm->sg->sgl)
 		return;
 
 	/* unmap the pages mapped to the device */

commit b41b026fee47105dec2f1515043296ae1f1f5ae5
Author: Arnd Bergmann <arnd@arndb.de>
Date:   Mon Mar 22 12:54:42 2021 +0100

    amdgpu: avoid incorrect %hu format string
    
    [ Upstream commit 7d98d416c2cc1c1f7d9508e887de4630e521d797 ]
    
    clang points out that the %hu format string does not match the type
    of the variables here:
    
    drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c:263:7: warning: format specifies type 'unsigned short' but the argument has type 'unsigned int' [-Wformat]
                                      version_major, version_minor);
                                      ^~~~~~~~~~~~~
    include/drm/drm_print.h:498:19: note: expanded from macro 'DRM_ERROR'
            __drm_err(fmt, ##__VA_ARGS__)
                      ~~~    ^~~~~~~~~~~
    
    Change it to a regular %u, the same way a previous patch did for
    another instance of the same warning.
    
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Reviewed-by: Tom Rix <trix@redhat.com>
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
index e5a6db6beab7..8c5f39beee7c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
@@ -231,7 +231,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
 		if ((adev->asic_type == CHIP_POLARIS10 ||
 		     adev->asic_type == CHIP_POLARIS11) &&
 		    (adev->uvd.fw_version < FW_1_66_16))
-			DRM_ERROR("POLARIS10/11 UVD firmware version %hu.%hu is too old.\n",
+			DRM_ERROR("POLARIS10/11 UVD firmware version %u.%u is too old.\n",
 				  version_major, version_minor);
 	} else {
 		unsigned int enc_major, enc_minor, dec_minor;

commit 4bdce78188424f5a398ac98de28cefef0b3db328
Author: Marijn Suijten <marijn.suijten@somainline.org>
Date:   Tue Apr 6 23:47:24 2021 +0200

    drm/msm/mdp5: Configure PP_SYNC_HEIGHT to double the vtotal
    
    [ Upstream commit 2ad52bdb220de5ab348098e3482b01235d15a842 ]
    
    Leaving this at a close-to-maximum register value 0xFFF0 means it takes
    very long for the MDSS to generate a software vsync interrupt when the
    hardware TE interrupt doesn't arrive.  Configuring this to double the
    vtotal (like some downstream kernels) leads to a frame to take at most
    twice before the vsync signal, until hardware TE comes up.
    
    In this case the hardware interrupt responsible for providing this
    signal - "disp-te" gpio - is not hooked up to the mdp5 vsync/pp logic at
    all.  This solves severe panel update issues observed on at least the
    Xperia Loire and Tone series, until said gpio is properly hooked up to
    an irq.
    
    Suggested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@somainline.org>
    Signed-off-by: Marijn Suijten <marijn.suijten@somainline.org>
    Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@somainline.org>
    Link: https://lore.kernel.org/r/20210406214726.131534-2-marijn.suijten@somainline.org
    Signed-off-by: Rob Clark <robdclark@chromium.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c
index d6f79dc755b4..14e2ce87bab1 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c
@@ -78,9 +78,17 @@ static int pingpong_tearcheck_setup(struct drm_encoder *encoder,
 		| MDP5_PP_SYNC_CONFIG_VSYNC_IN_EN;
 	cfg |= MDP5_PP_SYNC_CONFIG_VSYNC_COUNT(vclks_line);
 
+	/*
+	 * Tearcheck emits a blanking signal every vclks_line * vtotal * 2 ticks on
+	 * the vsync_clk equating to roughly half the desired panel refresh rate.
+	 * This is only necessary as stability fallback if interrupts from the
+	 * panel arrive too late or not at all, but is currently used by default
+	 * because these panel interrupts are not wired up yet.
+	 */
 	mdp5_write(mdp5_kms, REG_MDP5_PP_SYNC_CONFIG_VSYNC(pp_id), cfg);
 	mdp5_write(mdp5_kms,
-		REG_MDP5_PP_SYNC_CONFIG_HEIGHT(pp_id), 0xfff0);
+		REG_MDP5_PP_SYNC_CONFIG_HEIGHT(pp_id), (2 * mode->vtotal));
+
 	mdp5_write(mdp5_kms,
 		REG_MDP5_PP_VSYNC_INIT_VAL(pp_id), mode->vdisplay);
 	mdp5_write(mdp5_kms, REG_MDP5_PP_RD_PTR_IRQ(pp_id), mode->vdisplay + 1);

commit a30d538ca26d8dc5a685351a01842ab839088e14
Author: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Date:   Thu Apr 8 12:31:20 2021 +0200

    media: gscpa/stv06xx: fix memory leak
    
    [ Upstream commit 4f4e6644cd876c844cdb3bea2dd7051787d5ae25 ]
    
    For two of the supported sensors the stv06xx driver allocates memory which
    is stored in sd->sensor_priv. This memory is freed on a disconnect, but if
    the probe() fails, then it isn't freed and so this leaks memory.
    
    Add a new probe_error() op that drivers can use to free any allocated
    memory in case there was a probe failure.
    
    Thanks to Pavel Skripkin <paskripkin@gmail.com> for discovering the cause
    of the memory leak.
    
    Reported-and-tested-by: syzbot+e7f4c64a4248a0340c37@syzkaller.appspotmail.com
    
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/usb/gspca/gspca.c b/drivers/media/usb/gspca/gspca.c
index 93212ed80bf8..f0562b8eef56 100644
--- a/drivers/media/usb/gspca/gspca.c
+++ b/drivers/media/usb/gspca/gspca.c
@@ -1586,6 +1586,8 @@ int gspca_dev_probe2(struct usb_interface *intf,
 #endif
 	v4l2_ctrl_handler_free(gspca_dev->vdev.ctrl_handler);
 	v4l2_device_unregister(&gspca_dev->v4l2_dev);
+	if (sd_desc->probe_error)
+		sd_desc->probe_error(gspca_dev);
 	kfree(gspca_dev->usb_buf);
 	kfree(gspca_dev);
 	return ret;
diff --git a/drivers/media/usb/gspca/gspca.h b/drivers/media/usb/gspca/gspca.h
index b0ced2e14006..a6554d5e9e1a 100644
--- a/drivers/media/usb/gspca/gspca.h
+++ b/drivers/media/usb/gspca/gspca.h
@@ -105,6 +105,7 @@ struct sd_desc {
 	cam_cf_op config;	/* called on probe */
 	cam_op init;		/* called on probe and resume */
 	cam_op init_controls;	/* called on probe */
+	cam_v_op probe_error;	/* called if probe failed, do cleanup here */
 	cam_op start;		/* called on stream on after URBs creation */
 	cam_pkt_op pkt_scan;
 /* optional operations */
diff --git a/drivers/media/usb/gspca/stv06xx/stv06xx.c b/drivers/media/usb/gspca/stv06xx/stv06xx.c
index b7ea4f982964..ccec6138f678 100644
--- a/drivers/media/usb/gspca/stv06xx/stv06xx.c
+++ b/drivers/media/usb/gspca/stv06xx/stv06xx.c
@@ -538,12 +538,21 @@ static int sd_int_pkt_scan(struct gspca_dev *gspca_dev,
 static int stv06xx_config(struct gspca_dev *gspca_dev,
 			  const struct usb_device_id *id);
 
+static void stv06xx_probe_error(struct gspca_dev *gspca_dev)
+{
+	struct sd *sd = (struct sd *)gspca_dev;
+
+	kfree(sd->sensor_priv);
+	sd->sensor_priv = NULL;
+}
+
 /* sub-driver description */
 static const struct sd_desc sd_desc = {
 	.name = MODULE_NAME,
 	.config = stv06xx_config,
 	.init = stv06xx_init,
 	.init_controls = stv06xx_init_controls,
+	.probe_error = stv06xx_probe_error,
 	.start = stv06xx_start,
 	.stopN = stv06xx_stopN,
 	.pkt_scan = stv06xx_pkt_scan,

commit 821b08dad8744b02b86d1b12ef8f74982f37a35e
Author: Pavel Skripkin <paskripkin@gmail.com>
Date:   Sun Mar 28 21:32:19 2021 +0200

    media: dvb-usb: fix memory leak in dvb_usb_adapter_init
    
    [ Upstream commit b7cd0da982e3043f2eec7235ac5530cb18d6af1d ]
    
    syzbot reported memory leak in dvb-usb. The problem was
    in invalid error handling in dvb_usb_adapter_init().
    
    for (n = 0; n < d->props.num_adapters; n++) {
    ....
            if ((ret = dvb_usb_adapter_stream_init(adap)) ||
                    (ret = dvb_usb_adapter_dvb_init(adap, adapter_nrs)) ||
                    (ret = dvb_usb_adapter_frontend_init(adap))) {
                    return ret;
            }
    ...
            d->num_adapters_initialized++;
    ...
    }
    
    In case of error in dvb_usb_adapter_dvb_init() or
    dvb_usb_adapter_dvb_init() d->num_adapters_initialized won't be
    incremented, but dvb_usb_adapter_exit() relies on it:
    
            for (n = 0; n < d->num_adapters_initialized; n++)
    
    So, allocated objects won't be freed.
    
    Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
    Reported-by: syzbot+3c2be7424cea3b932b0e@syzkaller.appspotmail.com
    Signed-off-by: Sean Young <sean@mess.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/usb/dvb-usb/dvb-usb-init.c b/drivers/media/usb/dvb-usb/dvb-usb-init.c
index 39ac22486bcd..4b1445d806e5 100644
--- a/drivers/media/usb/dvb-usb/dvb-usb-init.c
+++ b/drivers/media/usb/dvb-usb/dvb-usb-init.c
@@ -82,11 +82,17 @@ static int dvb_usb_adapter_init(struct dvb_usb_device *d, short *adapter_nrs)
 			}
 		}
 
-		if ((ret = dvb_usb_adapter_stream_init(adap)) ||
-			(ret = dvb_usb_adapter_dvb_init(adap, adapter_nrs)) ||
-			(ret = dvb_usb_adapter_frontend_init(adap))) {
+		ret = dvb_usb_adapter_stream_init(adap);
+		if (ret)
 			return ret;
-		}
+
+		ret = dvb_usb_adapter_dvb_init(adap, adapter_nrs);
+		if (ret)
+			goto dvb_init_err;
+
+		ret = dvb_usb_adapter_frontend_init(adap);
+		if (ret)
+			goto frontend_init_err;
 
 		/* use exclusive FE lock if there is multiple shared FEs */
 		if (adap->fe_adap[1].fe)
@@ -106,6 +112,12 @@ static int dvb_usb_adapter_init(struct dvb_usb_device *d, short *adapter_nrs)
 	}
 
 	return 0;
+
+frontend_init_err:
+	dvb_usb_adapter_dvb_exit(adap);
+dvb_init_err:
+	dvb_usb_adapter_stream_exit(adap);
+	return ret;
 }
 
 static int dvb_usb_adapter_exit(struct dvb_usb_device *d)

commit 10aa8384765e7bd5613e81e0571552f360bcd806
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Tue Apr 6 15:50:53 2021 +0200

    media: i2c: adv7842: fix possible use-after-free in adv7842_remove()
    
    [ Upstream commit 4a15275b6a18597079f18241c87511406575179a ]
    
    This driver's remove path calls cancel_delayed_work(). However, that
    function does not wait until the work function finishes. This means
    that the callback function may still be running after the driver's
    remove function has finished, which would result in a use-after-free.
    
    Fix by calling cancel_delayed_work_sync(), which ensures that
    the work is properly cancelled, no longer running, and unable
    to re-schedule itself.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/i2c/adv7842.c b/drivers/media/i2c/adv7842.c
index 58662ba92d4f..d0ed20652ddb 100644
--- a/drivers/media/i2c/adv7842.c
+++ b/drivers/media/i2c/adv7842.c
@@ -3585,7 +3585,7 @@ static int adv7842_remove(struct i2c_client *client)
 	struct adv7842_state *state = to_state(sd);
 
 	adv7842_irq_enable(sd, false);
-	cancel_delayed_work(&state->delayed_work_enable_hotplug);
+	cancel_delayed_work_sync(&state->delayed_work_enable_hotplug);
 	v4l2_device_unregister_subdev(sd);
 	media_entity_cleanup(&sd->entity);
 	adv7842_unregister_clients(sd);

commit af56fb0d8e17d9f8dcf8d50a030b8e334082e81e
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Tue Apr 6 15:48:12 2021 +0200

    media: i2c: adv7511-v4l2: fix possible use-after-free in adv7511_remove()
    
    [ Upstream commit 2c9541720c66899adf6f3600984cf3ef151295ad ]
    
    This driver's remove path calls cancel_delayed_work(). However, that
    function does not wait until the work function finishes. This means
    that the callback function may still be running after the driver's
    remove function has finished, which would result in a use-after-free.
    
    Fix by calling cancel_delayed_work_sync(), which ensures that
    the work is properly cancelled, no longer running, and unable
    to re-schedule itself.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/i2c/adv7511-v4l2.c b/drivers/media/i2c/adv7511-v4l2.c
index 6869bb593a68..4052abeead50 100644
--- a/drivers/media/i2c/adv7511-v4l2.c
+++ b/drivers/media/i2c/adv7511-v4l2.c
@@ -1965,7 +1965,7 @@ static int adv7511_remove(struct i2c_client *client)
 
 	adv7511_set_isr(sd, false);
 	adv7511_init_setup(sd);
-	cancel_delayed_work(&state->edid_handler);
+	cancel_delayed_work_sync(&state->edid_handler);
 	i2c_unregister_device(state->i2c_edid);
 	if (state->i2c_cec)
 		i2c_unregister_device(state->i2c_cec);

commit 46fcf849461c4c8c97c7288ff1d33db35bd4b9ed
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Tue Apr 6 15:42:46 2021 +0200

    media: adv7604: fix possible use-after-free in adv76xx_remove()
    
    [ Upstream commit fa56f5f1fe31c2050675fa63b84963ebd504a5b3 ]
    
    This driver's remove path calls cancel_delayed_work(). However, that
    function does not wait until the work function finishes. This means
    that the callback function may still be running after the driver's
    remove function has finished, which would result in a use-after-free.
    
    Fix by calling cancel_delayed_work_sync(), which ensures that
    the work is properly cancelled, no longer running, and unable
    to re-schedule itself.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/i2c/adv7604.c b/drivers/media/i2c/adv7604.c
index a4b0a89c7e7e..04577d409e63 100644
--- a/drivers/media/i2c/adv7604.c
+++ b/drivers/media/i2c/adv7604.c
@@ -3560,7 +3560,7 @@ static int adv76xx_remove(struct i2c_client *client)
 	io_write(sd, 0x6e, 0);
 	io_write(sd, 0x73, 0);
 
-	cancel_delayed_work(&state->delayed_work_enable_hotplug);
+	cancel_delayed_work_sync(&state->delayed_work_enable_hotplug);
 	v4l2_async_unregister_subdev(sd);
 	media_entity_cleanup(&sd->entity);
 	adv76xx_unregister_clients(to_state(sd));

commit 9531cee341a3427914e502597cf170bdf37d764f
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Tue Apr 6 15:39:29 2021 +0200

    media: tc358743: fix possible use-after-free in tc358743_remove()
    
    [ Upstream commit 6107a4fdf8554a7aa9488bdc835bb010062fa8a9 ]
    
    This driver's remove path calls cancel_delayed_work(). However, that
    function does not wait until the work function finishes. This means
    that the callback function may still be running after the driver's
    remove function has finished, which would result in a use-after-free.
    
    Fix by calling cancel_delayed_work_sync(), which ensures that
    the work is properly cancelled, no longer running, and unable
    to re-schedule itself.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/i2c/tc358743.c b/drivers/media/i2c/tc358743.c
index d9bc3851bf63..041b16965b96 100644
--- a/drivers/media/i2c/tc358743.c
+++ b/drivers/media/i2c/tc358743.c
@@ -2192,7 +2192,7 @@ static int tc358743_remove(struct i2c_client *client)
 		del_timer_sync(&state->timer);
 		flush_work(&state->work_i2c_poll);
 	}
-	cancel_delayed_work(&state->delayed_work_enable_hotplug);
+	cancel_delayed_work_sync(&state->delayed_work_enable_hotplug);
 	cec_unregister_adapter(state->cec_adap);
 	v4l2_async_unregister_subdev(sd);
 	v4l2_device_unregister_subdev(sd);

commit c48cc20469f3ad683ecf9b2a8b73ffdf3a83aff2
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Wed Apr 7 17:19:03 2021 +0800

    power: supply: s3c_adc_battery: fix possible use-after-free in s3c_adc_bat_remove()
    
    [ Upstream commit 68ae256945d2abe9036a7b68af4cc65aff79d5b7 ]
    
    This driver's remove path calls cancel_delayed_work(). However, that
    function does not wait until the work function finishes. This means
    that the callback function may still be running after the driver's
    remove function has finished, which would result in a use-after-free.
    
    Fix by calling cancel_delayed_work_sync(), which ensures that
    the work is properly cancelled, no longer running, and unable
    to re-schedule itself.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/power/supply/s3c_adc_battery.c b/drivers/power/supply/s3c_adc_battery.c
index 3d00b35cafc9..8be31f80035c 100644
--- a/drivers/power/supply/s3c_adc_battery.c
+++ b/drivers/power/supply/s3c_adc_battery.c
@@ -394,7 +394,7 @@ static int s3c_adc_bat_remove(struct platform_device *pdev)
 		gpio_free(pdata->gpio_charge_finished);
 	}
 
-	cancel_delayed_work(&bat_work);
+	cancel_delayed_work_sync(&bat_work);
 
 	if (pdata->exit)
 		pdata->exit();

commit 9d2b5263fe50d8cdf54faab170da326f4c9e5f64
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Wed Apr 7 17:17:06 2021 +0800

    power: supply: generic-adc-battery: fix possible use-after-free in gab_remove()
    
    [ Upstream commit b6cfa007b3b229771d9588970adb4ab3e0487f49 ]
    
    This driver's remove path calls cancel_delayed_work(). However, that
    function does not wait until the work function finishes. This means
    that the callback function may still be running after the driver's
    remove function has finished, which would result in a use-after-free.
    
    Fix by calling cancel_delayed_work_sync(), which ensures that
    the work is properly cancelled, no longer running, and unable
    to re-schedule itself.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/power/supply/generic-adc-battery.c b/drivers/power/supply/generic-adc-battery.c
index bc462d1ec963..97b0e873e87d 100644
--- a/drivers/power/supply/generic-adc-battery.c
+++ b/drivers/power/supply/generic-adc-battery.c
@@ -382,7 +382,7 @@ static int gab_remove(struct platform_device *pdev)
 	}
 
 	kfree(adc_bat->psy_desc.properties);
-	cancel_delayed_work(&adc_bat->bat_work);
+	cancel_delayed_work_sync(&adc_bat->bat_work);
 	return 0;
 }
 

commit 3beae8b4f3bb98a899c266b1007995b4312e1a1c
Author: Colin Ian King <colin.king@canonical.com>
Date:   Tue Apr 6 18:01:15 2021 +0100

    clk: socfpga: arria10: Fix memory leak of socfpga_clk on error return
    
    [ Upstream commit 657d4d1934f75a2d978c3cf2086495eaa542e7a9 ]
    
    There is an error return path that is not kfree'ing socfpga_clk leading
    to a memory leak. Fix this by adding in the missing kfree call.
    
    Addresses-Coverity: ("Resource leak")
    Signed-off-by: Colin Ian King <colin.king@canonical.com>
    Link: https://lore.kernel.org/r/20210406170115.430990-1-colin.king@canonical.com
    Acked-by: Dinh Nguyen <dinguyen@kernel.org>
    Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Signed-off-by: Stephen Boyd <sboyd@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/clk/socfpga/clk-gate-a10.c b/drivers/clk/socfpga/clk-gate-a10.c
index 36376c542055..637e26babf89 100644
--- a/drivers/clk/socfpga/clk-gate-a10.c
+++ b/drivers/clk/socfpga/clk-gate-a10.c
@@ -157,6 +157,7 @@ static void __init __socfpga_gate_init(struct device_node *node,
 		if (IS_ERR(socfpga_clk->sys_mgr_base_addr)) {
 			pr_err("%s: failed to find altr,sys-mgr regmap!\n",
 					__func__);
+			kfree(socfpga_clk);
 			return;
 		}
 	}

commit 97656f5f1a0fa5ddf7344ca4f501b2e13668656a
Author: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Date:   Thu Mar 25 08:48:21 2021 +0100

    media: vivid: update EDID
    
    [ Upstream commit 443ec4bbc6116f6f492a7a1282bfd8422c862158 ]
    
    The EDID had a few mistakes as reported by edid-decode:
    
    Block 1, CTA-861 Extension Block:
      Video Data Block: For improved preferred timing interoperability, set 'Native detailed modes' to 1.
      Video Capability Data Block: S_PT is equal to S_IT and S_CE, so should be set to 0 instead.
    
    Fixed those.
    
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/platform/vivid/vivid-core.c b/drivers/media/platform/vivid/vivid-core.c
index 31db363602e5..b603ca412387 100644
--- a/drivers/media/platform/vivid/vivid-core.c
+++ b/drivers/media/platform/vivid/vivid-core.c
@@ -174,13 +174,13 @@ static const u8 vivid_hdmi_edid[256] = {
 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7b,
 
-	0x02, 0x03, 0x3f, 0xf0, 0x51, 0x61, 0x60, 0x5f,
+	0x02, 0x03, 0x3f, 0xf1, 0x51, 0x61, 0x60, 0x5f,
 	0x5e, 0x5d, 0x10, 0x1f, 0x04, 0x13, 0x22, 0x21,
 	0x20, 0x05, 0x14, 0x02, 0x11, 0x01, 0x23, 0x09,
 	0x07, 0x07, 0x83, 0x01, 0x00, 0x00, 0x6d, 0x03,
 	0x0c, 0x00, 0x10, 0x00, 0x00, 0x3c, 0x21, 0x00,
 	0x60, 0x01, 0x02, 0x03, 0x67, 0xd8, 0x5d, 0xc4,
-	0x01, 0x78, 0x00, 0x00, 0xe2, 0x00, 0xea, 0xe3,
+	0x01, 0x78, 0x00, 0x00, 0xe2, 0x00, 0xca, 0xe3,
 	0x05, 0x00, 0x00, 0xe3, 0x06, 0x01, 0x00, 0x4d,
 	0xd0, 0x00, 0xa0, 0xf0, 0x70, 0x3e, 0x80, 0x30,
 	0x20, 0x35, 0x00, 0xc0, 0x1c, 0x32, 0x00, 0x00,
@@ -189,7 +189,7 @@ static const u8 vivid_hdmi_edid[256] = {
 	0x00, 0x00, 0x1a, 0x1a, 0x1d, 0x00, 0x80, 0x51,
 	0xd0, 0x1c, 0x20, 0x40, 0x80, 0x35, 0x00, 0xc0,
 	0x1c, 0x32, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82,
 };
 
 static int vidioc_querycap(struct file *file, void  *priv,

commit 16440629bfdf8869eacbf79b8fdfda433c2ecb18
Author: Muhammad Usama Anjum <musamaanjum@gmail.com>
Date:   Wed Mar 24 19:07:53 2021 +0100

    media: em28xx: fix memory leak
    
    [ Upstream commit 0ae10a7dc8992ee682ff0b1752ff7c83d472eef1 ]
    
    If some error occurs, URB buffers should also be freed. If they aren't
    freed with the dvb here, the em28xx_dvb_fini call doesn't frees the URB
    buffers as dvb is set to NULL. The function in which error occurs should
    do all the cleanup for the allocations it had done.
    
    Tested the patch with the reproducer provided by syzbot. This patch
    fixes the memleak.
    
    Reported-by: syzbot+889397c820fa56adf25d@syzkaller.appspotmail.com
    Signed-off-by: Muhammad Usama Anjum <musamaanjum@gmail.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/usb/em28xx/em28xx-dvb.c b/drivers/media/usb/em28xx/em28xx-dvb.c
index a73faf12f7e4..e1946237ac8c 100644
--- a/drivers/media/usb/em28xx/em28xx-dvb.c
+++ b/drivers/media/usb/em28xx/em28xx-dvb.c
@@ -1924,6 +1924,7 @@ static int em28xx_dvb_init(struct em28xx *dev)
 	return result;
 
 out_free:
+	em28xx_uninit_usb_xfer(dev, EM28XX_DIGITAL_MODE);
 	kfree(dvb);
 	dev->dvb = NULL;
 	goto ret;

commit 5fc6e73ba5026ff17b59ebc362fff3a675a5046e
Author: Ewan D. Milne <emilne@redhat.com>
Date:   Wed Mar 31 16:11:54 2021 -0400

    scsi: scsi_dh_alua: Remove check for ASC 24h in alua_rtpg()
    
    [ Upstream commit bc3f2b42b70eb1b8576e753e7d0e117bbb674496 ]
    
    Some arrays return ILLEGAL_REQUEST with ASC 00h if they don't support the
    RTPG extended header so remove the check for INVALID FIELD IN CDB.
    
    Link: https://lore.kernel.org/r/20210331201154.20348-1-emilne@redhat.com
    Reviewed-by: Hannes Reinecke <hare@suse.de>
    Signed-off-by: Ewan D. Milne <emilne@redhat.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/device_handler/scsi_dh_alua.c b/drivers/scsi/device_handler/scsi_dh_alua.c
index 60c48dc5d945..efd2b4312528 100644
--- a/drivers/scsi/device_handler/scsi_dh_alua.c
+++ b/drivers/scsi/device_handler/scsi_dh_alua.c
@@ -579,10 +579,11 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_port_group *pg)
 		 * even though it shouldn't according to T10.
 		 * The retry without rtpg_ext_hdr_req set
 		 * handles this.
+		 * Note:  some arrays return a sense key of ILLEGAL_REQUEST
+		 * with ASC 00h if they don't support the extended header.
 		 */
 		if (!(pg->flags & ALUA_RTPG_EXT_HDR_UNSUPP) &&
-		    sense_hdr.sense_key == ILLEGAL_REQUEST &&
-		    sense_hdr.asc == 0x24 && sense_hdr.ascq == 0) {
+		    sense_hdr.sense_key == ILLEGAL_REQUEST) {
 			pg->flags |= ALUA_RTPG_EXT_HDR_UNSUPP;
 			goto retry;
 		}

commit 1218baa35a6cacd0143310a6b7b50f6fed7ab31b
Author: Quinn Tran <qutran@marvell.com>
Date:   Mon Mar 29 01:52:22 2021 -0700

    scsi: qla2xxx: Fix use after free in bsg
    
    [ Upstream commit 2ce35c0821afc2acd5ee1c3f60d149f8b2520ce8 ]
    
    On bsg command completion, bsg_job_done() was called while qla driver
    continued to access the bsg_job buffer. bsg_job_done() would free up
    resources that ended up being reused by other task while the driver
    continued to access the buffers. As a result, driver was reading garbage
    data.
    
    localhost kernel: BUG: KASAN: use-after-free in sg_next+0x64/0x80
    localhost kernel: Read of size 8 at addr ffff8883228a3330 by task swapper/26/0
    localhost kernel:
    localhost kernel: CPU: 26 PID: 0 Comm: swapper/26 Kdump:
    loaded Tainted: G          OE    --------- -  - 4.18.0-193.el8.x86_64+debug #1
    localhost kernel: Hardware name: HP ProLiant DL360
    Gen9/ProLiant DL360 Gen9, BIOS P89 08/12/2016
    localhost kernel: Call Trace:
    localhost kernel: <IRQ>
    localhost kernel: dump_stack+0x9a/0xf0
    localhost kernel: print_address_description.cold.3+0x9/0x23b
    localhost kernel: kasan_report.cold.4+0x65/0x95
    localhost kernel: debug_dma_unmap_sg.part.12+0x10d/0x2d0
    localhost kernel: qla2x00_bsg_sp_free+0xaf6/0x1010 [qla2xxx]
    
    Link: https://lore.kernel.org/r/20210329085229.4367-6-njavali@marvell.com
    Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
    Signed-off-by: Quinn Tran <qutran@marvell.com>
    Signed-off-by: Saurav Kashyap <skashyap@marvell.com>
    Signed-off-by: Nilesh Javali <njavali@marvell.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c
index 47f062e96e62..eae166572964 100644
--- a/drivers/scsi/qla2xxx/qla_bsg.c
+++ b/drivers/scsi/qla2xxx/qla_bsg.c
@@ -19,10 +19,11 @@ qla2x00_bsg_job_done(void *ptr, int res)
 	struct bsg_job *bsg_job = sp->u.bsg_job;
 	struct fc_bsg_reply *bsg_reply = bsg_job->reply;
 
+	sp->free(sp);
+
 	bsg_reply->result = res;
 	bsg_job_done(bsg_job, bsg_reply->result,
 		       bsg_reply->reply_payload_rcv_len);
-	sp->free(sp);
 }
 
 void

commit 80fc9daef8889d2f3f88c09304bb6f8c5a4003c9
Author: Bart Van Assche <bvanassche@acm.org>
Date:   Sat Mar 20 16:23:58 2021 -0700

    scsi: qla2xxx: Always check the return value of qla24xx_get_isp_stats()
    
    [ Upstream commit a2b2cc660822cae08c351c7f6b452bfd1330a4f7 ]
    
    This patch fixes the following Coverity warning:
    
        CID 361199 (#1 of 1): Unchecked return value (CHECKED_RETURN)
        3. check_return: Calling qla24xx_get_isp_stats without checking return
        value (as is done elsewhere 4 out of 5 times).
    
    Link: https://lore.kernel.org/r/20210320232359.941-7-bvanassche@acm.org
    Cc: Quinn Tran <qutran@marvell.com>
    Cc: Mike Christie <michael.christie@oracle.com>
    Cc: Himanshu Madhani <himanshu.madhani@oracle.com>
    Cc: Daniel Wagner <dwagner@suse.de>
    Cc: Lee Duncan <lduncan@suse.com>
    Reviewed-by: Daniel Wagner <dwagner@suse.de>
    Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
    Signed-off-by: Bart Van Assche <bvanassche@acm.org>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 0ab9d2fd4a14..d46a10d24ed4 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -1934,6 +1934,8 @@ qla2x00_reset_host_stats(struct Scsi_Host *shost)
 	vha->qla_stats.jiffies_at_last_reset = get_jiffies_64();
 
 	if (IS_FWI2_CAPABLE(ha)) {
+		int rval;
+
 		stats = dma_alloc_coherent(&ha->pdev->dev,
 		    sizeof(*stats), &stats_dma, GFP_KERNEL);
 		if (!stats) {
@@ -1943,7 +1945,11 @@ qla2x00_reset_host_stats(struct Scsi_Host *shost)
 		}
 
 		/* reset firmware statistics */
-		qla24xx_get_isp_stats(base_vha, stats, stats_dma, BIT_0);
+		rval = qla24xx_get_isp_stats(base_vha, stats, stats_dma, BIT_0);
+		if (rval != QLA_SUCCESS)
+			ql_log(ql_log_warn, vha, 0x70de,
+			       "Resetting ISP statistics failed: rval = %d\n",
+			       rval);
 
 		dma_free_coherent(&ha->pdev->dev, sizeof(*stats),
 		    stats, stats_dma);

commit a0e4f96f39dc473b51b409f7a065e0c2118627dc
Author: shaoyunl <shaoyun.liu@amd.com>
Date:   Tue Mar 9 10:30:15 2021 -0500

    drm/amdgpu : Fix asic reset regression issue introduce by 8f211fe8ac7c4f
    
    [ Upstream commit c8941550aa66b2a90f4b32c45d59e8571e33336e ]
    
    This recent change introduce SDMA interrupt info printing with irq->process function.
    These functions do not require a set function to enable/disable the irq
    
    Signed-off-by: shaoyunl <shaoyun.liu@amd.com>
    Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
index 1abf5b5bac9e..18402a6ba8fe 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
@@ -447,7 +447,7 @@ void amdgpu_irq_gpu_reset_resume_helper(struct amdgpu_device *adev)
 		for (j = 0; j < AMDGPU_MAX_IRQ_SRC_ID; ++j) {
 			struct amdgpu_irq_src *src = adev->irq.client[i].sources[j];
 
-			if (!src)
+			if (!src || !src->funcs || !src->funcs->set)
 				continue;
 			for (k = 0; k < src->num_types; k++)
 				amdgpu_irq_update(adev, src, k);

commit 5ab42d164caee5cddd49504ae9cef449f107c896
Author: dongjian <dongjian@yulong.com>
Date:   Mon Mar 22 19:21:33 2021 +0800

    power: supply: Use IRQF_ONESHOT
    
    [ Upstream commit 2469b836fa835c67648acad17d62bc805236a6ea ]
    
    Fixes coccicheck error:
    
    drivers/power/supply/pm2301_charger.c:1089:7-27: ERROR:
    drivers/power/supply/lp8788-charger.c:502:8-28: ERROR:
    drivers/power/supply/tps65217_charger.c:239:8-33: ERROR:
    drivers/power/supply/tps65090-charger.c:303:8-33: ERROR:
    
    Threaded IRQ with no primary handler requested without IRQF_ONESHOT
    
    Signed-off-by: dongjian <dongjian@yulong.com>
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/power/supply/lp8788-charger.c b/drivers/power/supply/lp8788-charger.c
index b8f7dac7ac3f..6dcabbeccde1 100644
--- a/drivers/power/supply/lp8788-charger.c
+++ b/drivers/power/supply/lp8788-charger.c
@@ -529,7 +529,7 @@ static int lp8788_set_irqs(struct platform_device *pdev,
 
 		ret = request_threaded_irq(virq, NULL,
 					lp8788_charger_irq_thread,
-					0, name, pchg);
+					IRQF_ONESHOT, name, pchg);
 		if (ret)
 			break;
 	}
diff --git a/drivers/power/supply/pm2301_charger.c b/drivers/power/supply/pm2301_charger.c
index 78561b6884fc..9ef218d76aa9 100644
--- a/drivers/power/supply/pm2301_charger.c
+++ b/drivers/power/supply/pm2301_charger.c
@@ -1098,7 +1098,7 @@ static int pm2xxx_wall_charger_probe(struct i2c_client *i2c_client,
 	ret = request_threaded_irq(gpio_to_irq(pm2->pdata->gpio_irq_number),
 				NULL,
 				pm2xxx_charger_irq[0].isr,
-				pm2->pdata->irq_type,
+				pm2->pdata->irq_type | IRQF_ONESHOT,
 				pm2xxx_charger_irq[0].name, pm2);
 
 	if (ret != 0) {
diff --git a/drivers/power/supply/tps65090-charger.c b/drivers/power/supply/tps65090-charger.c
index 1b4b5e09538e..297bf58f0d4f 100644
--- a/drivers/power/supply/tps65090-charger.c
+++ b/drivers/power/supply/tps65090-charger.c
@@ -311,7 +311,7 @@ static int tps65090_charger_probe(struct platform_device *pdev)
 
 	if (irq != -ENXIO) {
 		ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
-			tps65090_charger_isr, 0, "tps65090-charger", cdata);
+			tps65090_charger_isr, IRQF_ONESHOT, "tps65090-charger", cdata);
 		if (ret) {
 			dev_err(cdata->dev,
 				"Unable to register irq %d err %d\n", irq,
diff --git a/drivers/power/supply/tps65217_charger.c b/drivers/power/supply/tps65217_charger.c
index 814c2b81fdfe..ba33d1617e0b 100644
--- a/drivers/power/supply/tps65217_charger.c
+++ b/drivers/power/supply/tps65217_charger.c
@@ -238,7 +238,7 @@ static int tps65217_charger_probe(struct platform_device *pdev)
 	for (i = 0; i < NUM_CHARGER_IRQS; i++) {
 		ret = devm_request_threaded_irq(&pdev->dev, irq[i], NULL,
 						tps65217_charger_irq,
-						0, "tps65217-charger",
+						IRQF_ONESHOT, "tps65217-charger",
 						charger);
 		if (ret) {
 			dev_err(charger->dev,

commit fa617521b2a1727c51d823ae55d5695a41be2209
Author: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Date:   Thu Mar 11 15:46:40 2021 +0100

    media: gspca/sq905.c: fix uninitialized variable
    
    [ Upstream commit eaaea4681984c79d2b2b160387b297477f0c1aab ]
    
    act_len can be uninitialized if usb_bulk_msg() returns an error.
    Set it to 0 to avoid a KMSAN error.
    
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Reported-by: syzbot+a4e309017a5f3a24c7b3@syzkaller.appspotmail.com
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/usb/gspca/sq905.c b/drivers/media/usb/gspca/sq905.c
index ffea9c35b0a0..13676af42cfc 100644
--- a/drivers/media/usb/gspca/sq905.c
+++ b/drivers/media/usb/gspca/sq905.c
@@ -167,7 +167,7 @@ static int
 sq905_read_data(struct gspca_dev *gspca_dev, u8 *data, int size, int need_lock)
 {
 	int ret;
-	int act_len;
+	int act_len = 0;
 
 	gspca_dev->usb_buf[0] = '\0';
 	if (need_lock)

commit 423ce5806f9b6e5c89b02861c909773687869f7d
Author: Daniel Niv <danielniv3@gmail.com>
Date:   Thu Mar 11 03:53:00 2021 +0100

    media: media/saa7164: fix saa7164_encoder_register() memory leak bugs
    
    [ Upstream commit c759b2970c561e3b56aa030deb13db104262adfe ]
    
    Add a fix for the memory leak bugs that can occur when the
    saa7164_encoder_register() function fails.
    The function allocates memory without explicitly freeing
    it when errors occur.
    Add a better error handling that deallocate the unused buffers before the
    function exits during a fail.
    
    Signed-off-by: Daniel Niv <danielniv3@gmail.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/pci/saa7164/saa7164-encoder.c b/drivers/media/pci/saa7164/saa7164-encoder.c
index 32136ebe4f61..962f8eb73b05 100644
--- a/drivers/media/pci/saa7164/saa7164-encoder.c
+++ b/drivers/media/pci/saa7164/saa7164-encoder.c
@@ -1024,7 +1024,7 @@ int saa7164_encoder_register(struct saa7164_port *port)
 		printk(KERN_ERR "%s() failed (errno = %d), NO PCI configuration\n",
 			__func__, result);
 		result = -ENOMEM;
-		goto failed;
+		goto fail_pci;
 	}
 
 	/* Establish encoder defaults here */
@@ -1078,7 +1078,7 @@ int saa7164_encoder_register(struct saa7164_port *port)
 			  100000, ENCODER_DEF_BITRATE);
 	if (hdl->error) {
 		result = hdl->error;
-		goto failed;
+		goto fail_hdl;
 	}
 
 	port->std = V4L2_STD_NTSC_M;
@@ -1096,7 +1096,7 @@ int saa7164_encoder_register(struct saa7164_port *port)
 		printk(KERN_INFO "%s: can't allocate mpeg device\n",
 			dev->name);
 		result = -ENOMEM;
-		goto failed;
+		goto fail_hdl;
 	}
 
 	port->v4l_device->ctrl_handler = hdl;
@@ -1107,10 +1107,7 @@ int saa7164_encoder_register(struct saa7164_port *port)
 	if (result < 0) {
 		printk(KERN_INFO "%s: can't register mpeg device\n",
 			dev->name);
-		/* TODO: We're going to leak here if we don't dealloc
-		 The buffers above. The unreg function can't deal wit it.
-		*/
-		goto failed;
+		goto fail_reg;
 	}
 
 	printk(KERN_INFO "%s: registered device video%d [mpeg]\n",
@@ -1132,9 +1129,14 @@ int saa7164_encoder_register(struct saa7164_port *port)
 
 	saa7164_api_set_encoder(port);
 	saa7164_api_get_encoder(port);
+	return 0;
 
-	result = 0;
-failed:
+fail_reg:
+	video_device_release(port->v4l_device);
+	port->v4l_device = NULL;
+fail_hdl:
+	v4l2_ctrl_handler_free(hdl);
+fail_pci:
 	return result;
 }
 

commit ae066d168711f3887de3936855fe921bd665fccd
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Sun Mar 7 16:17:56 2021 +0100

    extcon: arizona: Fix some issues when HPDET IRQ fires after the jack has been unplugged
    
    [ Upstream commit c309a3e8793f7e01c4a4ec7960658380572cb576 ]
    
    When the jack is partially inserted and then removed again it may be
    removed while the hpdet code is running. In this case the following
    may happen:
    
    1. The "JACKDET rise" or ""JACKDET fall" IRQ triggers
    2. arizona_jackdet runs and takes info->lock
    3. The "HPDET" IRQ triggers
    4. arizona_hpdet_irq runs, blocks on info->lock
    5. arizona_jackdet calls arizona_stop_mic() and clears info->hpdet_done
    6. arizona_jackdet releases info->lock
    7. arizona_hpdet_irq now can continue running and:
    7.1 Calls arizona_start_mic() (if a mic was detected)
    7.2 sets info->hpdet_done
    
    Step 7 is undesirable / a bug:
    7.1 causes the device to stay in a high power-state (with MICVDD enabled)
    7.2 causes hpdet to not run on the next jack insertion, which in turn
        causes the EXTCON_JACK_HEADPHONE state to never get set
    
    This fixes both issues by skipping these 2 steps when arizona_hpdet_irq
    runs after the jack has been unplugged.
    
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Acked-by: Charles Keepax <ckeepax@opensource.cirrus.com>
    Tested-by: Charles Keepax <ckeepax@opensource.cirrus.com>
    Acked-by: Chanwoo Choi <cw00.choi@samsung.com>
    Signed-off-by: Lee Jones <lee.jones@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/extcon/extcon-arizona.c b/drivers/extcon/extcon-arizona.c
index 9327479c719c..c857120c00d9 100644
--- a/drivers/extcon/extcon-arizona.c
+++ b/drivers/extcon/extcon-arizona.c
@@ -602,7 +602,7 @@ static irqreturn_t arizona_hpdet_irq(int irq, void *data)
 	struct arizona *arizona = info->arizona;
 	int id_gpio = arizona->pdata.hpdet_id_gpio;
 	unsigned int report = EXTCON_JACK_HEADPHONE;
-	int ret, reading;
+	int ret, reading, state;
 	bool mic = false;
 
 	mutex_lock(&info->lock);
@@ -615,12 +615,11 @@ static irqreturn_t arizona_hpdet_irq(int irq, void *data)
 	}
 
 	/* If the cable was removed while measuring ignore the result */
-	ret = extcon_get_state(info->edev, EXTCON_MECHANICAL);
-	if (ret < 0) {
-		dev_err(arizona->dev, "Failed to check cable state: %d\n",
-			ret);
+	state = extcon_get_state(info->edev, EXTCON_MECHANICAL);
+	if (state < 0) {
+		dev_err(arizona->dev, "Failed to check cable state: %d\n", state);
 		goto out;
-	} else if (!ret) {
+	} else if (!state) {
 		dev_dbg(arizona->dev, "Ignoring HPDET for removed cable\n");
 		goto done;
 	}
@@ -673,7 +672,7 @@ static irqreturn_t arizona_hpdet_irq(int irq, void *data)
 			   ARIZONA_ACCDET_MODE_MASK, ARIZONA_ACCDET_MODE_MIC);
 
 	/* If we have a mic then reenable MICDET */
-	if (mic || info->mic)
+	if (state && (mic || info->mic))
 		arizona_start_mic(info);
 
 	if (info->hpdet_active) {
@@ -681,7 +680,9 @@ static irqreturn_t arizona_hpdet_irq(int irq, void *data)
 		info->hpdet_active = false;
 	}
 
-	info->hpdet_done = true;
+	/* Do not set hp_det done when the cable has been unplugged */
+	if (state)
+		info->hpdet_done = true;
 
 out:
 	mutex_unlock(&info->lock);

commit b10f94efbd4decc45925a93953d50ddd5fb29fd1
Author: Matthias Schiffer <matthias.schiffer@ew.tq-group.com>
Date:   Wed Mar 3 10:54:19 2021 +0100

    power: supply: bq27xxx: fix power_avg for newer ICs
    
    [ Upstream commit c4d57c22ac65bd503716062a06fad55a01569cac ]
    
    On all newer bq27xxx ICs, the AveragePower register contains a signed
    value; in addition to handling the raw value as unsigned, the driver
    code also didn't convert it to µW as expected.
    
    At least for the BQ28Z610, the reference manual incorrectly states that
    the value is in units of 1mW and not 10mW. I have no way of knowing
    whether the manuals of other supported ICs contain the same error, or if
    there are models that actually use 1mW. At least, the new code shouldn't
    be *less* correct than the old version for any device.
    
    power_avg is removed from the cache structure, se we don't have to
    extend it to store both a signed value and an error code. Always getting
    an up-to-date value may be desirable anyways, as it avoids inconsistent
    current and power readings when switching between charging and
    discharging.
    
    Signed-off-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com>
    Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/power/supply/bq27xxx_battery.c b/drivers/power/supply/bq27xxx_battery.c
index 93e3d9c747aa..b7dc88126866 100644
--- a/drivers/power/supply/bq27xxx_battery.c
+++ b/drivers/power/supply/bq27xxx_battery.c
@@ -1490,27 +1490,6 @@ static int bq27xxx_battery_read_time(struct bq27xxx_device_info *di, u8 reg)
 	return tval * 60;
 }
 
-/*
- * Read an average power register.
- * Return < 0 if something fails.
- */
-static int bq27xxx_battery_read_pwr_avg(struct bq27xxx_device_info *di)
-{
-	int tval;
-
-	tval = bq27xxx_read(di, BQ27XXX_REG_AP, false);
-	if (tval < 0) {
-		dev_err(di->dev, "error reading average power register  %02x: %d\n",
-			BQ27XXX_REG_AP, tval);
-		return tval;
-	}
-
-	if (di->opts & BQ27XXX_O_ZERO)
-		return (tval * BQ27XXX_POWER_CONSTANT) / BQ27XXX_RS;
-	else
-		return tval;
-}
-
 /*
  * Returns true if a battery over temperature condition is detected
  */
@@ -1607,8 +1586,6 @@ void bq27xxx_battery_update(struct bq27xxx_device_info *di)
 		}
 		if (di->regs[BQ27XXX_REG_CYCT] != INVALID_REG_ADDR)
 			cache.cycle_count = bq27xxx_battery_read_cyct(di);
-		if (di->regs[BQ27XXX_REG_AP] != INVALID_REG_ADDR)
-			cache.power_avg = bq27xxx_battery_read_pwr_avg(di);
 
 		/* We only have to read charge design full once */
 		if (di->charge_design_full <= 0)
@@ -1670,6 +1647,32 @@ static int bq27xxx_battery_current(struct bq27xxx_device_info *di,
 	return 0;
 }
 
+/*
+ * Get the average power in µW
+ * Return < 0 if something fails.
+ */
+static int bq27xxx_battery_pwr_avg(struct bq27xxx_device_info *di,
+				   union power_supply_propval *val)
+{
+	int power;
+
+	power = bq27xxx_read(di, BQ27XXX_REG_AP, false);
+	if (power < 0) {
+		dev_err(di->dev,
+			"error reading average power register %02x: %d\n",
+			BQ27XXX_REG_AP, power);
+		return power;
+	}
+
+	if (di->opts & BQ27XXX_O_ZERO)
+		val->intval = (power * BQ27XXX_POWER_CONSTANT) / BQ27XXX_RS;
+	else
+		/* Other gauges return a signed value in units of 10mW */
+		val->intval = (int)((s16)power) * 10000;
+
+	return 0;
+}
+
 static int bq27xxx_battery_status(struct bq27xxx_device_info *di,
 				  union power_supply_propval *val)
 {
@@ -1837,7 +1840,7 @@ static int bq27xxx_battery_get_property(struct power_supply *psy,
 		ret = bq27xxx_simple_value(di->cache.energy, val);
 		break;
 	case POWER_SUPPLY_PROP_POWER_AVG:
-		ret = bq27xxx_simple_value(di->cache.power_avg, val);
+		ret = bq27xxx_battery_pwr_avg(di, val);
 		break;
 	case POWER_SUPPLY_PROP_HEALTH:
 		ret = bq27xxx_simple_value(di->cache.health, val);
diff --git a/include/linux/power/bq27xxx_battery.h b/include/linux/power/bq27xxx_battery.h
index d6355f49fbae..13d5dd4eb40b 100644
--- a/include/linux/power/bq27xxx_battery.h
+++ b/include/linux/power/bq27xxx_battery.h
@@ -49,7 +49,6 @@ struct bq27xxx_reg_cache {
 	int capacity;
 	int energy;
 	int flags;
-	int power_avg;
 	int health;
 };
 

commit b52f081fcb424adb73c306a0f74a6137d47bc8ff
Author: Julian Braha <julianbraha@gmail.com>
Date:   Thu Feb 25 09:06:58 2021 +0100

    media: drivers: media: pci: sta2x11: fix Kconfig dependency on GPIOLIB
    
    [ Upstream commit 24df8b74c8b2fb42c49ffe8585562da0c96446ff ]
    
    When STA2X11_VIP is enabled, and GPIOLIB is disabled,
    Kbuild gives the following warning:
    
    WARNING: unmet direct dependencies detected for VIDEO_ADV7180
      Depends on [n]: MEDIA_SUPPORT [=y] && GPIOLIB [=n] && VIDEO_V4L2 [=y] && I2C [=y]
      Selected by [y]:
      - STA2X11_VIP [=y] && MEDIA_SUPPORT [=y] && MEDIA_PCI_SUPPORT [=y] && MEDIA_CAMERA_SUPPORT [=y] && PCI [=y] && VIDEO_V4L2 [=y] && VIRT_TO_BUS [=y] && I2C [=y] && (STA2X11 [=n] || COMPILE_TEST [=y]) && MEDIA_SUBDRV_AUTOSELECT [=y]
    
    This is because STA2X11_VIP selects VIDEO_ADV7180
    without selecting or depending on GPIOLIB,
    despite VIDEO_ADV7180 depending on GPIOLIB.
    
    Signed-off-by: Julian Braha <julianbraha@gmail.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/pci/sta2x11/Kconfig b/drivers/media/pci/sta2x11/Kconfig
index 4407b9f881e4..bd690613fe68 100644
--- a/drivers/media/pci/sta2x11/Kconfig
+++ b/drivers/media/pci/sta2x11/Kconfig
@@ -1,6 +1,7 @@
 config STA2X11_VIP
 	tristate "STA2X11 VIP Video For Linux"
 	depends on STA2X11 || COMPILE_TEST
+	select GPIOLIB if MEDIA_SUBDRV_AUTOSELECT
 	select VIDEO_ADV7180 if MEDIA_SUBDRV_AUTOSELECT
 	select VIDEOBUF2_DMA_CONTIG
 	depends on PCI && VIDEO_V4L2 && VIRT_TO_BUS

commit e05bb9eddfd02a76b8d699e93bf7b834dfab6ecd
Author: Sean Young <sean@mess.org>
Date:   Mon Feb 22 09:08:35 2021 +0100

    media: ite-cir: check for receive overflow
    
    [ Upstream commit 28c7afb07ccfc0a939bb06ac1e7afe669901c65a ]
    
    It's best if this condition is reported.
    
    Signed-off-by: Sean Young <sean@mess.org>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/media/rc/ite-cir.c b/drivers/media/rc/ite-cir.c
index de77d22c30a7..18f3718315a8 100644
--- a/drivers/media/rc/ite-cir.c
+++ b/drivers/media/rc/ite-cir.c
@@ -285,8 +285,14 @@ static irqreturn_t ite_cir_isr(int irq, void *data)
 	/* read the interrupt flags */
 	iflags = dev->params.get_irq_causes(dev);
 
+	/* Check for RX overflow */
+	if (iflags & ITE_IRQ_RX_FIFO_OVERRUN) {
+		dev_warn(&dev->rdev->dev, "receive overflow\n");
+		ir_raw_event_reset(dev->rdev);
+	}
+
 	/* check for the receive interrupt */
-	if (iflags & (ITE_IRQ_RX_FIFO | ITE_IRQ_RX_FIFO_OVERRUN)) {
+	if (iflags & ITE_IRQ_RX_FIFO) {
 		/* read the FIFO bytes */
 		rx_bytes =
 			dev->params.get_rx_bytes(dev, rx_buf,

commit 4d63cc01d9818135ac9d7ec2d48bf0292effbfa8
Author: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Date:   Sat Feb 27 21:56:26 2021 -0800

    scsi: target: pscsi: Fix warning in pscsi_complete_cmd()
    
    [ Upstream commit fd48c056a32ed6e7754c7c475490f3bed54ed378 ]
    
    This fixes a compilation warning in pscsi_complete_cmd():
    
         drivers/target/target_core_pscsi.c: In function ?pscsi_complete_cmd??
         drivers/target/target_core_pscsi.c:624:5: warning: suggest braces around empty body in an ?if??statement [-Wempty-body]
         ; /* XXX: TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE */
    
    Link: https://lore.kernel.org/r/20210228055645.22253-5-chaitanya.kulkarni@wdc.com
    Reviewed-by: Mike Christie <michael.christie@oracle.com>
    Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
    Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c
index 02c4e3beb264..1b52cd4d793f 100644
--- a/drivers/target/target_core_pscsi.c
+++ b/drivers/target/target_core_pscsi.c
@@ -633,8 +633,9 @@ static void pscsi_complete_cmd(struct se_cmd *cmd, u8 scsi_status,
 			unsigned char *buf;
 
 			buf = transport_kmap_data_sg(cmd);
-			if (!buf)
+			if (!buf) {
 				; /* XXX: TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE */
+			}
 
 			if (cdb[0] == MODE_SENSE_10) {
 				if (!(buf[3] & 0x80))

commit cb202c26d666b6cb62cfc0e987f2be228c777644
Author: James Smart <jsmart2021@gmail.com>
Date:   Mon Mar 1 09:18:06 2021 -0800

    scsi: lpfc: Fix pt2pt connection does not recover after LOGO
    
    [ Upstream commit bd4f5100424d17d4e560d6653902ef8e49b2fc1f ]
    
    On a pt2pt setup, between 2 initiators, if one side issues a a LOGO, there
    is no relogin attempt. The FC specs are grey in this area on which port
    (higher wwn or not) is to re-login.
    
    As there is no spec guidance, unconditionally re-PLOGI after the logout to
    ensure a login is re-established.
    
    Link: https://lore.kernel.org/r/20210301171821.3427-8-jsmart2021@gmail.com
    Co-developed-by: Dick Kennedy <dick.kennedy@broadcom.com>
    Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
    Signed-off-by: James Smart <jsmart2021@gmail.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c
index 3dfed191252c..518bdae24543 100644
--- a/drivers/scsi/lpfc/lpfc_nportdisc.c
+++ b/drivers/scsi/lpfc/lpfc_nportdisc.c
@@ -708,9 +708,14 @@ lpfc_rcv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
 		}
 	} else if ((!(ndlp->nlp_type & NLP_FABRIC) &&
 		((ndlp->nlp_type & NLP_FCP_TARGET) ||
-		!(ndlp->nlp_type & NLP_FCP_INITIATOR))) ||
+		(ndlp->nlp_type & NLP_NVME_TARGET) ||
+		(vport->fc_flag & FC_PT2PT))) ||
 		(ndlp->nlp_state == NLP_STE_ADISC_ISSUE)) {
-		/* Only try to re-login if this is NOT a Fabric Node */
+		/* Only try to re-login if this is NOT a Fabric Node
+		 * AND the remote NPORT is a FCP/NVME Target or we
+		 * are in pt2pt mode. NLP_STE_ADISC_ISSUE is a special
+		 * case for LOGO as a response to ADISC behavior.
+		 */
 		mod_timer(&ndlp->nlp_delayfunc,
 			  jiffies + msecs_to_jiffies(1000 * 1));
 		spin_lock_irq(shost->host_lock);

commit 4e50d87479f61623497959dc05fd45be99bcadc6
Author: James Smart <jsmart2021@gmail.com>
Date:   Mon Mar 1 09:18:00 2021 -0800

    scsi: lpfc: Fix incorrect dbde assignment when building target abts wqe
    
    [ Upstream commit 9302154c07bff4e7f7f43c506a1ac84540303d06 ]
    
    The wqe_dbde field indicates whether a Data BDE is present in Words 0:2 and
    should therefore should be clear in the abts request wqe. By setting the
    bit we can be misleading fw into error cases.
    
    Clear the wqe_dbde field.
    
    Link: https://lore.kernel.org/r/20210301171821.3427-2-jsmart2021@gmail.com
    Co-developed-by: Dick Kennedy <dick.kennedy@broadcom.com>
    Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
    Signed-off-by: James Smart <jsmart2021@gmail.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/scsi/lpfc/lpfc_nvmet.c b/drivers/scsi/lpfc/lpfc_nvmet.c
index 5bc33817568e..23ead17e60fe 100644
--- a/drivers/scsi/lpfc/lpfc_nvmet.c
+++ b/drivers/scsi/lpfc/lpfc_nvmet.c
@@ -2912,7 +2912,6 @@ lpfc_nvmet_unsol_issue_abort(struct lpfc_hba *phba,
 	bf_set(wqe_rcvoxid, &wqe_abts->xmit_sequence.wqe_com, xri);
 
 	/* Word 10 */
-	bf_set(wqe_dbde, &wqe_abts->xmit_sequence.wqe_com, 1);
 	bf_set(wqe_iod, &wqe_abts->xmit_sequence.wqe_com, LPFC_WQE_IOD_WRITE);
 	bf_set(wqe_lenloc, &wqe_abts->xmit_sequence.wqe_com,
 	       LPFC_WQE_LENLOC_WORD12);

commit 45fc5070edd155ebb9488da9383b2959be8ac973
Author: Josef Bacik <josef@toxicpanda.com>
Date:   Fri Mar 12 15:25:21 2021 -0500

    btrfs: convert logic BUG_ON()'s in replace_path to ASSERT()'s
    
    [ Upstream commit 7a9213a93546e7eaef90e6e153af6b8fc7553f10 ]
    
    A few BUG_ON()'s in replace_path are purely to keep us from making
    logical mistakes, so replace them with ASSERT()'s.
    
    Reviewed-by: Qu Wenruo <wqu@suse.com>
    Signed-off-by: Josef Bacik <josef@toxicpanda.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
index e6e4e6fb2add..06c6a66a991f 100644
--- a/fs/btrfs/relocation.c
+++ b/fs/btrfs/relocation.c
@@ -1755,8 +1755,8 @@ int replace_path(struct btrfs_trans_handle *trans,
 	int ret;
 	int slot;
 
-	BUG_ON(src->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID);
-	BUG_ON(dest->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID);
+	ASSERT(src->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID);
+	ASSERT(dest->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID);
 
 	last_snapshot = btrfs_root_last_snapshot(&src->root_item);
 again:
@@ -1790,7 +1790,7 @@ int replace_path(struct btrfs_trans_handle *trans,
 		struct btrfs_key first_key;
 
 		level = btrfs_header_level(parent);
-		BUG_ON(level < lowest_level);
+		ASSERT(level >= lowest_level);
 
 		ret = btrfs_bin_search(parent, &key, level, &slot);
 		if (ret && slot > 0)

commit f06b3a82cda8f80bbe6cca3b3cc3ad3658495f3a
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Wed Apr 7 17:27:16 2021 +0800

    phy: phy-twl4030-usb: Fix possible use-after-free in twl4030_usb_remove()
    
    [ Upstream commit e1723d8b87b73ab363256e7ca3af3ddb75855680 ]
    
    This driver's remove path calls cancel_delayed_work(). However, that
    function does not wait until the work function finishes. This means
    that the callback function may still be running after the driver's
    remove function has finished, which would result in a use-after-free.
    
    Fix by calling cancel_delayed_work_sync(), which ensures that
    the work is properly cancelled, no longer running, and unable
    to re-schedule itself.
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Link: https://lore.kernel.org/r/20210407092716.3270248-1-yangyingliang@huawei.com
    Signed-off-by: Vinod Koul <vkoul@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/phy/ti/phy-twl4030-usb.c b/drivers/phy/ti/phy-twl4030-usb.c
index c267afb68f07..ea7564392108 100644
--- a/drivers/phy/ti/phy-twl4030-usb.c
+++ b/drivers/phy/ti/phy-twl4030-usb.c
@@ -801,7 +801,7 @@ static int twl4030_usb_remove(struct platform_device *pdev)
 
 	usb_remove_phy(&twl->phy);
 	pm_runtime_get_sync(twl->dev);
-	cancel_delayed_work(&twl->id_workaround_work);
+	cancel_delayed_work_sync(&twl->id_workaround_work);
 	device_remove_file(twl->dev, &dev_attr_vbus);
 
 	/* set transceiver mode to power on defaults */

commit 86ed6df23ba82f0781539541a5eb55733f594376
Author: Pavel Machek <pavel@ucw.cz>
Date:   Wed Apr 14 20:12:49 2021 +0300

    intel_th: Consistency and off-by-one fix
    
    [ Upstream commit 18ffbc47d45a1489b664dd68fb3a7610a6e1dea3 ]
    
    Consistently use "< ... +1" in for loops.
    
    Fix of-by-one in for_each_set_bit().
    
    Signed-off-by: Pavel Machek <pavel@denx.de>
    Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Link: https://lore.kernel.org/lkml/20190724095841.GA6952@amd/
    Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Link: https://lore.kernel.org/r/20210414171251.14672-6-alexander.shishkin@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/hwtracing/intel_th/gth.c b/drivers/hwtracing/intel_th/gth.c
index edc52d75e6bd..5041fe7fee9e 100644
--- a/drivers/hwtracing/intel_th/gth.c
+++ b/drivers/hwtracing/intel_th/gth.c
@@ -477,7 +477,7 @@ static void intel_th_gth_disable(struct intel_th_device *thdev,
 	output->active = false;
 
 	for_each_set_bit(master, gth->output[output->port].master,
-			 TH_CONFIGURABLE_MASTERS) {
+			 TH_CONFIGURABLE_MASTERS + 1) {
 		gth_master_set(gth, master, -1);
 	}
 	spin_unlock(&gth->gth_lock);
@@ -616,7 +616,7 @@ static void intel_th_gth_unassign(struct intel_th_device *thdev,
 	othdev->output.port = -1;
 	othdev->output.active = false;
 	gth->output[port].output = NULL;
-	for (master = 0; master <= TH_CONFIGURABLE_MASTERS; master++)
+	for (master = 0; master < TH_CONFIGURABLE_MASTERS + 1; master++)
 		if (gth->master[master] == port)
 			gth->master[master] = -1;
 	spin_unlock(&gth->gth_lock);

commit cea9c67ebd846a941672992809e4b87a209c2d3a
Author: Wei Yongjun <weiyongjun1@huawei.com>
Date:   Fri Apr 9 08:29:54 2021 +0000

    spi: omap-100k: Fix reference leak to master
    
    [ Upstream commit a23faea76d4cf5f75decb574491e66f9ecd707e7 ]
    
    Call spi_master_get() holds the reference count to master device, thus
    we need an additional spi_master_put() call to reduce the reference
    count, otherwise we will leak a reference to master.
    
    This commit fix it by removing the unnecessary spi_master_get().
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
    Link: https://lore.kernel.org/r/20210409082954.2906933-1-weiyongjun1@huawei.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/spi/spi-omap-100k.c b/drivers/spi/spi-omap-100k.c
index 76a8425be227..1eccdc4a4581 100644
--- a/drivers/spi/spi-omap-100k.c
+++ b/drivers/spi/spi-omap-100k.c
@@ -435,7 +435,7 @@ static int omap1_spi100k_probe(struct platform_device *pdev)
 
 static int omap1_spi100k_remove(struct platform_device *pdev)
 {
-	struct spi_master *master = spi_master_get(platform_get_drvdata(pdev));
+	struct spi_master *master = platform_get_drvdata(pdev);
 	struct omap1_spi100k *spi100k = spi_master_get_devdata(master);
 
 	pm_runtime_disable(&pdev->dev);
@@ -449,7 +449,7 @@ static int omap1_spi100k_remove(struct platform_device *pdev)
 #ifdef CONFIG_PM
 static int omap1_spi100k_runtime_suspend(struct device *dev)
 {
-	struct spi_master *master = spi_master_get(dev_get_drvdata(dev));
+	struct spi_master *master = dev_get_drvdata(dev);
 	struct omap1_spi100k *spi100k = spi_master_get_devdata(master);
 
 	clk_disable_unprepare(spi100k->ick);
@@ -460,7 +460,7 @@ static int omap1_spi100k_runtime_suspend(struct device *dev)
 
 static int omap1_spi100k_runtime_resume(struct device *dev)
 {
-	struct spi_master *master = spi_master_get(dev_get_drvdata(dev));
+	struct spi_master *master = dev_get_drvdata(dev);
 	struct omap1_spi100k *spi100k = spi_master_get_devdata(master);
 	int ret;
 

commit 4ecb33ea29e8be3692cdfa93537775d5a06a76e3
Author: Wei Yongjun <weiyongjun1@huawei.com>
Date:   Fri Apr 9 08:29:55 2021 +0000

    spi: dln2: Fix reference leak to master
    
    [ Upstream commit 9b844b087124c1538d05f40fda8a4fec75af55be ]
    
    Call spi_master_get() holds the reference count to master device, thus
    we need an additional spi_master_put() call to reduce the reference
    count, otherwise we will leak a reference to master.
    
    This commit fix it by removing the unnecessary spi_master_get().
    
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
    Link: https://lore.kernel.org/r/20210409082955.2907950-1-weiyongjun1@huawei.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/spi/spi-dln2.c b/drivers/spi/spi-dln2.c
index b62a99caacc0..a41adea48618 100644
--- a/drivers/spi/spi-dln2.c
+++ b/drivers/spi/spi-dln2.c
@@ -783,7 +783,7 @@ static int dln2_spi_probe(struct platform_device *pdev)
 
 static int dln2_spi_remove(struct platform_device *pdev)
 {
-	struct spi_master *master = spi_master_get(platform_get_drvdata(pdev));
+	struct spi_master *master = platform_get_drvdata(pdev);
 	struct dln2_spi *dln2 = spi_master_get_devdata(master);
 
 	pm_runtime_disable(&pdev->dev);

commit 6aef8dfc0505e4cf24a3485381d1e5f7507ec523
Author: Mathias Nyman <mathias.nyman@linux.intel.com>
Date:   Tue Apr 6 10:02:07 2021 +0300

    xhci: fix potential array out of bounds with several interrupters
    
    [ Upstream commit 286fd02fd54b6acab65809549cf5fb3f2a886696 ]
    
    The Max Interrupters supported by the controller is given in a 10bit
    wide bitfield, but the driver uses a fixed 128 size array to index these
    interrupters.
    
    Klockwork reports a possible array out of bounds case which in theory
    is possible. In practice this hasn't been hit as a common number of Max
    Interrupters for new controllers is 8, not even close to 128.
    
    This needs to be fixed anyway
    
    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Link: https://lore.kernel.org/r/20210406070208.3406266-4-mathias.nyman@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index fc07d68fdd15..9ca59f3fffde 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -227,6 +227,7 @@ static void xhci_zero_64b_regs(struct xhci_hcd *xhci)
 	struct device *dev = xhci_to_hcd(xhci)->self.sysdev;
 	int err, i;
 	u64 val;
+	u32 intrs;
 
 	/*
 	 * Some Renesas controllers get into a weird state if they are
@@ -265,7 +266,10 @@ static void xhci_zero_64b_regs(struct xhci_hcd *xhci)
 	if (upper_32_bits(val))
 		xhci_write_64(xhci, 0, &xhci->op_regs->cmd_ring);
 
-	for (i = 0; i < HCS_MAX_INTRS(xhci->hcs_params1); i++) {
+	intrs = min_t(u32, HCS_MAX_INTRS(xhci->hcs_params1),
+		      ARRAY_SIZE(xhci->run_regs->ir_set));
+
+	for (i = 0; i < intrs; i++) {
 		struct xhci_intr_reg __iomem *ir;
 
 		ir = &xhci->run_regs->ir_set[i];

commit 0955b22c33a0b026aa354855b4267b29ef77b9d7
Author: Mathias Nyman <mathias.nyman@linux.intel.com>
Date:   Tue Apr 6 10:02:06 2021 +0300

    xhci: check control context is valid before dereferencing it.
    
    [ Upstream commit 597899d2f7c5619c87185ee7953d004bd37fd0eb ]
    
    Don't dereference ctrl_ctx before checking it's valid.
    Issue reported by Klockwork
    
    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Link: https://lore.kernel.org/r/20210406070208.3406266-3-mathias.nyman@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index 6c508d0313f7..fc07d68fdd15 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -3148,6 +3148,14 @@ static void xhci_endpoint_reset(struct usb_hcd *hcd,
 
 	/* config ep command clears toggle if add and drop ep flags are set */
 	ctrl_ctx = xhci_get_input_control_ctx(cfg_cmd->in_ctx);
+	if (!ctrl_ctx) {
+		spin_unlock_irqrestore(&xhci->lock, flags);
+		xhci_free_command(xhci, cfg_cmd);
+		xhci_warn(xhci, "%s: Could not get input context, bad type.\n",
+				__func__);
+		goto cleanup;
+	}
+
 	xhci_setup_input_ctx_for_config_ep(xhci, cfg_cmd->in_ctx, vdev->out_ctx,
 					   ctrl_ctx, ep_flag, ep_flag);
 	xhci_endpoint_copy(xhci, cfg_cmd->in_ctx, vdev->out_ctx, ep_index);

commit c2c0ec0603f0eeb845722e2718474b55be866478
Author: Chunfeng Yun <chunfeng.yun@mediatek.com>
Date:   Wed Mar 31 17:05:53 2021 +0800

    usb: xhci-mtk: support quirk to disable usb2 lpm
    
    [ Upstream commit bee1f89aad2a51cd3339571bc8eadbb0dc88a683 ]
    
    The xHCI driver support usb2 HW LPM by default, here add support
    XHCI_HW_LPM_DISABLE quirk, then we can disable usb2 lpm when
    need it.
    
    Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
    Link: https://lore.kernel.org/r/1617181553-3503-4-git-send-email-chunfeng.yun@mediatek.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/host/xhci-mtk.c b/drivers/usb/host/xhci-mtk.c
index 09d5a789fcd5..f4b2e766f195 100644
--- a/drivers/usb/host/xhci-mtk.c
+++ b/drivers/usb/host/xhci-mtk.c
@@ -395,6 +395,8 @@ static void xhci_mtk_quirks(struct device *dev, struct xhci_hcd *xhci)
 	xhci->quirks |= XHCI_SPURIOUS_SUCCESS;
 	if (mtk->lpm_support)
 		xhci->quirks |= XHCI_LPM_SUPPORT;
+	if (mtk->u2_lpm_disable)
+		xhci->quirks |= XHCI_HW_LPM_DISABLE;
 
 	/*
 	 * MTK xHCI 0.96: PSA is 1 by default even if doesn't support stream,
@@ -467,6 +469,7 @@ static int xhci_mtk_probe(struct platform_device *pdev)
 		return ret;
 
 	mtk->lpm_support = of_property_read_bool(node, "usb3-lpm-capable");
+	mtk->u2_lpm_disable = of_property_read_bool(node, "usb2-lpm-disable");
 	/* optional property, ignore the error if it does not exist */
 	of_property_read_u32(node, "mediatek,u3p-dis-msk",
 			     &mtk->u3p_dis_msk);
diff --git a/drivers/usb/host/xhci-mtk.h b/drivers/usb/host/xhci-mtk.h
index cc59d80b663b..1601ca9a388e 100644
--- a/drivers/usb/host/xhci-mtk.h
+++ b/drivers/usb/host/xhci-mtk.h
@@ -123,6 +123,7 @@ struct xhci_hcd_mtk {
 	struct phy **phys;
 	int num_phys;
 	bool lpm_support;
+	bool u2_lpm_disable;
 	/* usb remote wakeup */
 	bool uwk_en;
 	struct regmap *uwk;

commit 213a9a13f0735212410312f61902a40ff065c477
Author: Robin Murphy <robin.murphy@arm.com>
Date:   Fri Mar 26 16:02:41 2021 +0000

    perf/arm_pmu_platform: Fix error handling
    
    [ Upstream commit e338cb6bef254821a8c095018fd27254d74bfd6a ]
    
    If we're aborting after failing to register the PMU device,
    we probably don't want to leak the IRQs that we've claimed.
    
    Signed-off-by: Robin Murphy <robin.murphy@arm.com>
    Link: https://lore.kernel.org/r/53031a607fc8412a60024bfb3bb8cd7141f998f5.1616774562.git.robin.murphy@arm.com
    Signed-off-by: Will Deacon <will@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/perf/arm_pmu_platform.c b/drivers/perf/arm_pmu_platform.c
index 96075cecb0ae..199293450acf 100644
--- a/drivers/perf/arm_pmu_platform.c
+++ b/drivers/perf/arm_pmu_platform.c
@@ -236,7 +236,7 @@ int arm_pmu_device_probe(struct platform_device *pdev,
 
 	ret = armpmu_register(pmu);
 	if (ret)
-		goto out_free;
+		goto out_free_irqs;
 
 	return 0;
 

commit f386d162c20c6adbd97c3a8f4240be7aba956f96
Author: Jerome Forissier <jerome@forissier.org>
Date:   Mon Mar 22 11:40:37 2021 +0100

    tee: optee: do not check memref size on return from Secure World
    
    [ Upstream commit c650b8dc7a7910eb25af0aac1720f778b29e679d ]
    
    When Secure World returns, it may have changed the size attribute of the
    memory references passed as [in/out] parameters. The GlobalPlatform TEE
    Internal Core API specification does not restrict the values that this
    size can take. In particular, Secure World may increase the value to be
    larger than the size of the input buffer to indicate that it needs more.
    
    Therefore, the size check in optee_from_msg_param() is incorrect and
    needs to be removed. This fixes a number of failed test cases in the
    GlobalPlatform TEE Initial Configuratiom Test Suite v2_0_0_0-2017_06_09
    when OP-TEE is compiled without dynamic shared memory support
    (CFG_CORE_DYN_SHM=n).
    
    Reviewed-by: Sumit Garg <sumit.garg@linaro.org>
    Suggested-by: Jens Wiklander <jens.wiklander@linaro.org>
    Signed-off-by: Jerome Forissier <jerome@forissier.org>
    Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c
index 2f254f957b0a..1d71fcb13dba 100644
--- a/drivers/tee/optee/core.c
+++ b/drivers/tee/optee/core.c
@@ -87,16 +87,6 @@ int optee_from_msg_param(struct tee_param *params, size_t num_params,
 				return rc;
 			p->u.memref.shm_offs = mp->u.tmem.buf_ptr - pa;
 			p->u.memref.shm = shm;
-
-			/* Check that the memref is covered by the shm object */
-			if (p->u.memref.size) {
-				size_t o = p->u.memref.shm_offs +
-					   p->u.memref.size - 1;
-
-				rc = tee_shm_get_pa(shm, o, NULL);
-				if (rc)
-					return rc;
-			}
 			break;
 		case OPTEE_MSG_ATTR_TYPE_RMEM_INPUT:
 		case OPTEE_MSG_ATTR_TYPE_RMEM_OUTPUT:

commit e04541dcc30c821e49658db61848345367e0224d
Author: John Millikin <john@john-millikin.com>
Date:   Thu Mar 25 17:04:33 2021 -0700

    x86/build: Propagate $(CLANG_FLAGS) to $(REALMODE_FLAGS)
    
    [ Upstream commit 8abe7fc26ad8f28bfdf78adbed56acd1fa93f82d ]
    
    When cross-compiling with Clang, the `$(CLANG_FLAGS)' variable
    contains additional flags needed to build C and assembly sources
    for the target platform. Normally this variable is automatically
    included in `$(KBUILD_CFLAGS)' via the top-level Makefile.
    
    The x86 real-mode makefile builds `$(REALMODE_CFLAGS)' from a
    plain assignment and therefore drops the Clang flags. This causes
    Clang to not recognize x86-specific assembler directives:
    
    ? arch/x86/realmode/rm/header.S:36:1: error: unknown directive
    ? .type real_mode_header STT_OBJECT ; .size real_mode_header, .-real_mode_header
    ? ^
    
    Explicit propagation of `$(CLANG_FLAGS)' to `$(REALMODE_CFLAGS)',
    which is inherited by real-mode make rules, fixes cross-compilation
    with Clang for x86 targets.
    
    Relevant flags:
    
    * `--target' sets the target architecture when cross-compiling. This
    ? flag must be set for both compilation and assembly (`KBUILD_AFLAGS')
    ? to support architecture-specific assembler directives.
    
    * `-no-integrated-as' tells clang to assemble with GNU Assembler
    ? instead of its built-in LLVM assembler. This flag is set by default
    ? unless `LLVM_IAS=1' is set, because the LLVM assembler can't yet
    ? parse certain GNU extensions.
    
    Signed-off-by: John Millikin <john@john-millikin.com>
    Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Acked-by: Ard Biesheuvel <ardb@kernel.org>
    Tested-by: Sedat Dilek <sedat.dilek@gmail.com>
    Link: https://lkml.kernel.org/r/20210326000435.4785-2-nathan@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/arch/x86/Makefile b/arch/x86/Makefile
index 6ebdbad21fb2..65a8722e784c 100644
--- a/arch/x86/Makefile
+++ b/arch/x86/Makefile
@@ -40,6 +40,7 @@ REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS), -ffreestanding
 REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS), -fno-stack-protector)
 REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS), -Wno-address-of-packed-member)
 REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS), $(cc_stack_align4))
+REALMODE_CFLAGS += $(CLANG_FLAGS)
 export REALMODE_CFLAGS
 
 # BITS is used as extension for files which are available in a 32 bit

commit 7868cfe39d2067b3d16e0aecad15c3a2f9460316
Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Date:   Tue Mar 16 16:51:40 2021 +0100

    PCI: PM: Do not read power state in pci_enable_device_flags()
    
    [ Upstream commit 4514d991d99211f225d83b7e640285f29f0755d0 ]
    
    It should not be necessary to update the current_state field of
    struct pci_dev in pci_enable_device_flags() before calling
    do_pci_enable_device() for the device, because none of the
    code between that point and the pci_set_power_state() call in
    do_pci_enable_device() invoked later depends on it.
    
    Moreover, doing that is actively harmful in some cases.  For example,
    if the given PCI device depends on an ACPI power resource whose _STA
    method initially returns 0 ("off"), but the config space of the PCI
    device is accessible and the power state retrieved from the
    PCI_PM_CTRL register is D0, the current_state field in the struct
    pci_dev representing that device will get out of sync with the
    power.state of its ACPI companion object and that will lead to
    power management issues going forward.
    
    To avoid such issues it is better to leave the current_state value
    as is until it is changed to PCI_D0 by do_pci_enable_device() as
    appropriate.  However, the power state of the device is not changed
    to PCI_D0 if it is already enabled when pci_enable_device_flags()
    gets called for it, so update its current_state in that case, but
    use pci_update_current_state() covering platform PM too for that.
    
    Link: https://lore.kernel.org/lkml/20210314000439.3138941-1-luzmaximilian@gmail.com/
    Reported-by: Maximilian Luz <luzmaximilian@gmail.com>
    Tested-by: Maximilian Luz <luzmaximilian@gmail.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 9ebf32de8575..3d59bbe4a5d5 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -1585,20 +1585,10 @@ static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags)
 	int err;
 	int i, bars = 0;
 
-	/*
-	 * Power state could be unknown at this point, either due to a fresh
-	 * boot or a device removal call.  So get the current power state
-	 * so that things like MSI message writing will behave as expected
-	 * (e.g. if the device really is in D0 at enable time).
-	 */
-	if (dev->pm_cap) {
-		u16 pmcsr;
-		pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr);
-		dev->current_state = (pmcsr & PCI_PM_CTRL_STATE_MASK);
-	}
-
-	if (atomic_inc_return(&dev->enable_cnt) > 1)
+	if (atomic_inc_return(&dev->enable_cnt) > 1) {
+		pci_update_current_state(dev, dev->current_state);
 		return 0;		/* already enabled */
+	}
 
 	bridge = pci_upstream_bridge(dev);
 	if (bridge)

commit 4e50811e3967f93051708b91c2dc7c0b5cc1d4db
Author: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Date:   Wed Mar 10 19:43:21 2021 -0800

    usb: xhci: Fix port minor revision
    
    [ Upstream commit 64364bc912c01b33bba6c22e3ccb849bfca96398 ]
    
    Some hosts incorrectly use sub-minor version for minor version (i.e.
    0x02 instead of 0x20 for bcdUSB 0x320 and 0x01 for bcdUSB 0x310).
    Currently the xHCI driver works around this by just checking for minor
    revision > 0x01 for USB 3.1 everywhere. With the addition of USB 3.2,
    checking this gets a bit cumbersome. Since there is no USB release with
    bcdUSB 0x301 to 0x309, we can assume that sub-minor version 01 to 09 is
    incorrect. Let's try to fix this and use the minor revision that matches
    with the USB/xHCI spec to help with the version checking within the
    driver.
    
    Acked-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Signed-off-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
    Link: https://lore.kernel.org/r/ed330e95a19dc367819c5b4d78bf7a541c35aa0a.1615432770.git.Thinh.Nguyen@synopsys.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
index 9e87c282a743..2461be2a8748 100644
--- a/drivers/usb/host/xhci-mem.c
+++ b/drivers/usb/host/xhci-mem.c
@@ -2134,6 +2134,15 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports,
 
 	if (major_revision == 0x03) {
 		rhub = &xhci->usb3_rhub;
+		/*
+		 * Some hosts incorrectly use sub-minor version for minor
+		 * version (i.e. 0x02 instead of 0x20 for bcdUSB 0x320 and 0x01
+		 * for bcdUSB 0x310). Since there is no USB release with sub
+		 * minor version 0x301 to 0x309, we can assume that they are
+		 * incorrect and fix it here.
+		 */
+		if (minor_revision > 0x00 && minor_revision < 0x10)
+			minor_revision <<= 4;
 	} else if (major_revision <= 0x02) {
 		rhub = &xhci->usb2_rhub;
 	} else {

commit a75adc31039442853d6d6aaecfe59db5eb2c81f7
Author: Wesley Cheng <wcheng@codeaurora.org>
Date:   Fri Mar 19 02:31:25 2021 -0700

    usb: dwc3: gadget: Ignore EP queue requests during bus reset
    
    [ Upstream commit 71ca43f30df9c642970f9dc9b2d6f463f4967e7b ]
    
    The current dwc3_gadget_reset_interrupt() will stop any active
    transfers, but only addresses blocking of EP queuing for while we are
    coming from a disconnected scenario, i.e. after receiving the disconnect
    event.  If the host decides to issue a bus reset on the device, the
    connected parameter will still be set to true, allowing for EP queuing
    to continue while we are disabling the functions.  To avoid this, set the
    connected flag to false until the stop active transfers is complete.
    
    Signed-off-by: Wesley Cheng <wcheng@codeaurora.org>
    Link: https://lore.kernel.org/r/1616146285-19149-3-git-send-email-wcheng@codeaurora.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index a0806dca3de9..f28eb541fad3 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -2717,6 +2717,15 @@ static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc)
 
 	dwc->connected = true;
 
+	/*
+	 * Ideally, dwc3_reset_gadget() would trigger the function
+	 * drivers to stop any active transfers through ep disable.
+	 * However, for functions which defer ep disable, such as mass
+	 * storage, we will need to rely on the call to stop active
+	 * transfers here, and avoid allowing of request queuing.
+	 */
+	dwc->connected = false;
+
 	/*
 	 * WORKAROUND: DWC3 revisions <1.88a have an issue which
 	 * would cause a missing Disconnect Event if there's a

commit 54fe9f8c87657333fa7c87582fac410d0a128678
Author: Ruslan Bilovol <ruslan.bilovol@gmail.com>
Date:   Mon Mar 1 13:49:34 2021 +0200

    usb: gadget: f_uac1: validate input parameters
    
    [ Upstream commit a59c68a6a3d1b18e2494f526eb19893a34fa6ec6 ]
    
    Currently user can configure UAC1 function with
    parameters that violate UAC1 spec or are not supported
    by UAC1 gadget implementation.
    
    This can lead to incorrect behavior if such gadget
    is connected to the host - like enumeration failure
    or other issues depending on host's UAC1 driver
    implementation, bringing user to a long hours
    of debugging the issue.
    
    Instead of silently accept these parameters, throw
    an error if they are not valid.
    
    Signed-off-by: Ruslan Bilovol <ruslan.bilovol@gmail.com>
    Link: https://lore.kernel.org/r/1614599375-8803-5-git-send-email-ruslan.bilovol@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/function/f_uac1.c b/drivers/usb/gadget/function/f_uac1.c
index a215c836eba4..41e7b29f58df 100644
--- a/drivers/usb/gadget/function/f_uac1.c
+++ b/drivers/usb/gadget/function/f_uac1.c
@@ -19,6 +19,9 @@
 #include "u_audio.h"
 #include "u_uac1.h"
 
+/* UAC1 spec: 3.7.2.3 Audio Channel Cluster Format */
+#define UAC1_CHANNEL_MASK 0x0FFF
+
 struct f_uac1 {
 	struct g_audio g_audio;
 	u8 ac_intf, as_in_intf, as_out_intf;
@@ -30,6 +33,11 @@ static inline struct f_uac1 *func_to_uac1(struct usb_function *f)
 	return container_of(f, struct f_uac1, g_audio.func);
 }
 
+static inline struct f_uac1_opts *g_audio_to_uac1_opts(struct g_audio *audio)
+{
+	return container_of(audio->func.fi, struct f_uac1_opts, func_inst);
+}
+
 /*
  * DESCRIPTORS ... most are static, but strings and full
  * configuration descriptors are built on demand.
@@ -505,11 +513,42 @@ static void f_audio_disable(struct usb_function *f)
 
 /*-------------------------------------------------------------------------*/
 
+static int f_audio_validate_opts(struct g_audio *audio, struct device *dev)
+{
+	struct f_uac1_opts *opts = g_audio_to_uac1_opts(audio);
+
+	if (!opts->p_chmask && !opts->c_chmask) {
+		dev_err(dev, "Error: no playback and capture channels\n");
+		return -EINVAL;
+	} else if (opts->p_chmask & ~UAC1_CHANNEL_MASK) {
+		dev_err(dev, "Error: unsupported playback channels mask\n");
+		return -EINVAL;
+	} else if (opts->c_chmask & ~UAC1_CHANNEL_MASK) {
+		dev_err(dev, "Error: unsupported capture channels mask\n");
+		return -EINVAL;
+	} else if ((opts->p_ssize < 1) || (opts->p_ssize > 4)) {
+		dev_err(dev, "Error: incorrect playback sample size\n");
+		return -EINVAL;
+	} else if ((opts->c_ssize < 1) || (opts->c_ssize > 4)) {
+		dev_err(dev, "Error: incorrect capture sample size\n");
+		return -EINVAL;
+	} else if (!opts->p_srate) {
+		dev_err(dev, "Error: incorrect playback sampling rate\n");
+		return -EINVAL;
+	} else if (!opts->c_srate) {
+		dev_err(dev, "Error: incorrect capture sampling rate\n");
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
 /* audio function driver setup/binding */
 static int f_audio_bind(struct usb_configuration *c, struct usb_function *f)
 {
 	struct usb_composite_dev	*cdev = c->cdev;
 	struct usb_gadget		*gadget = cdev->gadget;
+	struct device			*dev = &gadget->dev;
 	struct f_uac1			*uac1 = func_to_uac1(f);
 	struct g_audio			*audio = func_to_g_audio(f);
 	struct f_uac1_opts		*audio_opts;
@@ -519,6 +558,10 @@ static int f_audio_bind(struct usb_configuration *c, struct usb_function *f)
 	int				rate;
 	int				status;
 
+	status = f_audio_validate_opts(audio, dev);
+	if (status)
+		return status;
+
 	audio_opts = container_of(f->fi, struct f_uac1_opts, func_inst);
 
 	us = usb_gstrings_attach(cdev, uac1_strings, ARRAY_SIZE(strings_uac1));

commit 873792c84237953385d99ff3c56ed9e467c15300
Author: Vitaly Kuznetsov <vkuznets@redhat.com>
Date:   Fri Mar 19 12:18:23 2021 +0100

    genirq/matrix: Prevent allocation counter corruption
    
    [ Upstream commit c93a5e20c3c2dabef8ea360a3d3f18c6f68233ab ]
    
    When irq_matrix_free() is called for an unallocated vector the
    managed_allocated and total_allocated counters get out of sync with the
    real state of the matrix. Later, when the last interrupt is freed, these
    counters will underflow resulting in UINTMAX because the counters are
    unsigned.
    
    While this is certainly a problem of the calling code, this can be catched
    in the allocator by checking the allocation bit for the to be freed vector
    which simplifies debugging.
    
    An example of the problem described above:
    https://lore.kernel.org/lkml/20210318192819.636943062@linutronix.de/
    
    Add the missing sanity check and emit a warning when it triggers.
    
    Suggested-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Link: https://lore.kernel.org/r/20210319111823.1105248-1-vkuznets@redhat.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/kernel/irq/matrix.c b/kernel/irq/matrix.c
index 651a4ad6d711..8e586858bcf4 100644
--- a/kernel/irq/matrix.c
+++ b/kernel/irq/matrix.c
@@ -423,7 +423,9 @@ void irq_matrix_free(struct irq_matrix *m, unsigned int cpu,
 	if (WARN_ON_ONCE(bit < m->alloc_start || bit >= m->alloc_end))
 		return;
 
-	clear_bit(bit, cm->alloc_map);
+	if (WARN_ON_ONCE(!test_and_clear_bit(bit, cm->alloc_map)))
+		return;
+
 	cm->allocated--;
 	if(managed)
 		cm->managed_allocated--;

commit 66dba3a2f16d643660de3a94bdf4360caee7cac8
Author: Pawel Laszczak <pawell@cadence.com>
Date:   Mon Mar 8 13:53:38 2021 +0100

    usb: gadget: uvc: add bInterval checking for HS mode
    
    [ Upstream commit 26adde04acdff14a1f28d4a5dce46a8513a3038b ]
    
    Patch adds extra checking for bInterval passed by configfs.
    The 5.6.4 chapter of USB Specification (rev. 2.0) say:
    "A high-bandwidth endpoint must specify a period of 1x125 µs
    (i.e., a bInterval value of 1)."
    
    The issue was observed during testing UVC class on CV.
    I treat this change as improvement because we can control
    bInterval by configfs.
    
    Reviewed-by: Peter Chen <peter.chen@kernel.org>
    Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
    Signed-off-by: Pawel Laszczak <pawell@cadence.com>
    Link: https://lore.kernel.org/r/20210308125338.4824-1-pawell@gli-login.cadence.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c
index d8ce7868fe22..169e73ed128c 100644
--- a/drivers/usb/gadget/function/f_uvc.c
+++ b/drivers/usb/gadget/function/f_uvc.c
@@ -645,7 +645,12 @@ uvc_function_bind(struct usb_configuration *c, struct usb_function *f)
 
 	uvc_hs_streaming_ep.wMaxPacketSize =
 		cpu_to_le16(max_packet_size | ((max_packet_mult - 1) << 11));
-	uvc_hs_streaming_ep.bInterval = opts->streaming_interval;
+
+	/* A high-bandwidth endpoint must specify a bInterval value of 1 */
+	if (max_packet_mult > 1)
+		uvc_hs_streaming_ep.bInterval = 1;
+	else
+		uvc_hs_streaming_ep.bInterval = opts->streaming_interval;
 
 	uvc_ss_streaming_ep.wMaxPacketSize = cpu_to_le16(max_packet_size);
 	uvc_ss_streaming_ep.bInterval = opts->streaming_interval;

commit 67afaf1a0a3b2e23645c86636d887a7ca84a09ed
Author: Ard Biesheuvel <ardb@kernel.org>
Date:   Tue Mar 2 21:33:03 2021 +0100

    crypto: api - check for ERR pointers in crypto_destroy_tfm()
    
    [ Upstream commit 83681f2bebb34dbb3f03fecd8f570308ab8b7c2c ]
    
    Given that crypto_alloc_tfm() may return ERR pointers, and to avoid
    crashes on obscure error paths where such pointers are presented to
    crypto_destroy_tfm() (such as [0]), add an ERR_PTR check there
    before dereferencing the second argument as a struct crypto_tfm
    pointer.
    
    [0] https://lore.kernel.org/linux-crypto/000000000000de949705bc59e0f6@google.com/
    
    Reported-by: syzbot+12cf5fbfdeba210a89dd@syzkaller.appspotmail.com
    Reviewed-by: Eric Biggers <ebiggers@google.com>
    Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/crypto/api.c b/crypto/api.c
index 1909195b2c70..5efd4d6e6312 100644
--- a/crypto/api.c
+++ b/crypto/api.c
@@ -571,7 +571,7 @@ void crypto_destroy_tfm(void *mem, struct crypto_tfm *tfm)
 {
 	struct crypto_alg *alg;
 
-	if (unlikely(!mem))
+	if (IS_ERR_OR_NULL(mem))
 		return;
 
 	alg = tfm->__crt_alg;
diff --git a/include/crypto/acompress.h b/include/crypto/acompress.h
index e328b52425a8..1ff78365607c 100644
--- a/include/crypto/acompress.h
+++ b/include/crypto/acompress.h
@@ -152,6 +152,8 @@ static inline struct crypto_acomp *crypto_acomp_reqtfm(struct acomp_req *req)
  * crypto_free_acomp() -- free ACOMPRESS tfm handle
  *
  * @tfm:	ACOMPRESS tfm handle allocated with crypto_alloc_acomp()
+ *
+ * If @tfm is a NULL or error pointer, this function does nothing.
  */
 static inline void crypto_free_acomp(struct crypto_acomp *tfm)
 {
diff --git a/include/crypto/aead.h b/include/crypto/aead.h
index 1e26f790b03f..c69c545ba39a 100644
--- a/include/crypto/aead.h
+++ b/include/crypto/aead.h
@@ -187,6 +187,8 @@ static inline struct crypto_tfm *crypto_aead_tfm(struct crypto_aead *tfm)
 /**
  * crypto_free_aead() - zeroize and free aead handle
  * @tfm: cipher handle to be freed
+ *
+ * If @tfm is a NULL or error pointer, this function does nothing.
  */
 static inline void crypto_free_aead(struct crypto_aead *tfm)
 {
diff --git a/include/crypto/akcipher.h b/include/crypto/akcipher.h
index b5e11de4d497..9817f2e5bff8 100644
--- a/include/crypto/akcipher.h
+++ b/include/crypto/akcipher.h
@@ -174,6 +174,8 @@ static inline struct crypto_akcipher *crypto_akcipher_reqtfm(
  * crypto_free_akcipher() - free AKCIPHER tfm handle
  *
  * @tfm: AKCIPHER tfm handle allocated with crypto_alloc_akcipher()
+ *
+ * If @tfm is a NULL or error pointer, this function does nothing.
  */
 static inline void crypto_free_akcipher(struct crypto_akcipher *tfm)
 {
diff --git a/include/crypto/hash.h b/include/crypto/hash.h
index 76e432cab75d..552517dcf9e4 100644
--- a/include/crypto/hash.h
+++ b/include/crypto/hash.h
@@ -257,6 +257,8 @@ static inline struct crypto_tfm *crypto_ahash_tfm(struct crypto_ahash *tfm)
 /**
  * crypto_free_ahash() - zeroize and free the ahash handle
  * @tfm: cipher handle to be freed
+ *
+ * If @tfm is a NULL or error pointer, this function does nothing.
  */
 static inline void crypto_free_ahash(struct crypto_ahash *tfm)
 {
@@ -692,6 +694,8 @@ static inline struct crypto_tfm *crypto_shash_tfm(struct crypto_shash *tfm)
 /**
  * crypto_free_shash() - zeroize and free the message digest handle
  * @tfm: cipher handle to be freed
+ *
+ * If @tfm is a NULL or error pointer, this function does nothing.
  */
 static inline void crypto_free_shash(struct crypto_shash *tfm)
 {
diff --git a/include/crypto/kpp.h b/include/crypto/kpp.h
index 1bde0a6514fa..1a34630fc371 100644
--- a/include/crypto/kpp.h
+++ b/include/crypto/kpp.h
@@ -159,6 +159,8 @@ static inline void crypto_kpp_set_flags(struct crypto_kpp *tfm, u32 flags)
  * crypto_free_kpp() - free KPP tfm handle
  *
  * @tfm: KPP tfm handle allocated with crypto_alloc_kpp()
+ *
+ * If @tfm is a NULL or error pointer, this function does nothing.
  */
 static inline void crypto_free_kpp(struct crypto_kpp *tfm)
 {
diff --git a/include/crypto/rng.h b/include/crypto/rng.h
index b95ede354a66..a788c1e5a121 100644
--- a/include/crypto/rng.h
+++ b/include/crypto/rng.h
@@ -116,6 +116,8 @@ static inline struct rng_alg *crypto_rng_alg(struct crypto_rng *tfm)
 /**
  * crypto_free_rng() - zeroize and free RNG handle
  * @tfm: cipher handle to be freed
+ *
+ * If @tfm is a NULL or error pointer, this function does nothing.
  */
 static inline void crypto_free_rng(struct crypto_rng *tfm)
 {
diff --git a/include/crypto/skcipher.h b/include/crypto/skcipher.h
index 2f327f090c3e..c7553f8b1bb6 100644
--- a/include/crypto/skcipher.h
+++ b/include/crypto/skcipher.h
@@ -206,6 +206,8 @@ static inline struct crypto_tfm *crypto_skcipher_tfm(
 /**
  * crypto_free_skcipher() - zeroize and free cipher handle
  * @tfm: cipher handle to be freed
+ *
+ * If @tfm is a NULL or error pointer, this function does nothing.
  */
 static inline void crypto_free_skcipher(struct crypto_skcipher *tfm)
 {

commit 233e5f2d9e19c384eb9bb7a7c53bf473a49e90f5
Author: karthik alapati <mail@karthek.com>
Date:   Sun Feb 21 21:01:05 2021 +0530

    staging: wimax/i2400m: fix byte-order issue
    
    [ Upstream commit 0c37baae130df39b19979bba88bde2ee70a33355 ]
    
    fix sparse byte-order warnings by converting host byte-order
    type to __le16 byte-order types before assigning to hdr.length
    
    Signed-off-by: karthik alapati <mail@karthek.com>
    Link: https://lore.kernel.org/r/0ae5c5c4c646506d8be871e7be5705542671a1d5.1613921277.git.mail@karthek.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

diff --git a/drivers/net/wimax/i2400m/op-rfkill.c b/drivers/net/wimax/i2400m/op-rfkill.c
index dc6fe93ce71f..e8473047b2d1 100644
--- a/drivers/net/wimax/i2400m/op-rfkill.c
+++ b/drivers/net/wimax/i2400m/op-rfkill.c
@@ -101,7 +101,7 @@ int i2400m_op_rfkill_sw_toggle(struct wimax_dev *wimax_dev,
 	if (cmd == NULL)
 		goto error_alloc;
 	cmd->hdr.type = cpu_to_le16(I2400M_MT_CMD_RF_CONTROL);
-	cmd->hdr.length = sizeof(cmd->sw_rf);
+	cmd->hdr.length = cpu_to_le16(sizeof(cmd->sw_rf));
 	cmd->hdr.version = cpu_to_le16(I2400M_L3L4_VERSION);
 	cmd->sw_rf.hdr.type = cpu_to_le16(I2400M_TLV_RF_OPERATION);
 	cmd->sw_rf.hdr.length = cpu_to_le16(sizeof(cmd->sw_rf.status));

commit fb10f923fffbeac8e29703803f9f9c9993c40fcf
Author: Phillip Potter <phil@philpotter.co.uk>
Date:   Wed Mar 31 23:07:19 2021 +0100

    fbdev: zero-fill colormap in fbcmap.c
    
    commit 19ab233989d0f7ab1de19a036e247afa4a0a1e9c upstream.
    
    Use kzalloc() rather than kmalloc() for the dynamically allocated parts
    of the colormap in fb_alloc_cmap_gfp, to prevent a leak of random kernel
    data to userspace under certain circumstances.
    
    Fixes a KMSAN-found infoleak bug reported by syzbot at:
    https://syzkaller.appspot.com/bug?id=741578659feabd108ad9e06696f0c1f2e69c4b6e
    
    Reported-by: syzbot+47fa9c9c648b765305b9@syzkaller.appspotmail.com
    Cc: stable <stable@vger.kernel.org>
    Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
    Signed-off-by: Phillip Potter <phil@philpotter.co.uk>
    Link: https://lore.kernel.org/r/20210331220719.1499743-1-phil@philpotter.co.uk
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/video/fbdev/core/fbcmap.c b/drivers/video/fbdev/core/fbcmap.c
index 2811c4afde01..e8ea76848104 100644
--- a/drivers/video/fbdev/core/fbcmap.c
+++ b/drivers/video/fbdev/core/fbcmap.c
@@ -101,17 +101,17 @@ int fb_alloc_cmap_gfp(struct fb_cmap *cmap, int len, int transp, gfp_t flags)
 		if (!len)
 			return 0;
 
-		cmap->red = kmalloc(size, flags);
+		cmap->red = kzalloc(size, flags);
 		if (!cmap->red)
 			goto fail;
-		cmap->green = kmalloc(size, flags);
+		cmap->green = kzalloc(size, flags);
 		if (!cmap->green)
 			goto fail;
-		cmap->blue = kmalloc(size, flags);
+		cmap->blue = kzalloc(size, flags);
 		if (!cmap->blue)
 			goto fail;
 		if (transp) {
-			cmap->transp = kmalloc(size, flags);
+			cmap->transp = kzalloc(size, flags);
 			if (!cmap->transp)
 				goto fail;
 		} else {

commit 302b12bbf05ca0cd0eade88ccaf6b7e69bc2be88
Author: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Date:   Wed Apr 14 20:12:50 2021 +0300

    intel_th: pci: Add Rocket Lake CPU support
    
    commit 9f7f2a5e01ab4ee56b6d9c0572536fe5fd56e376 upstream.
    
    This adds support for the Trace Hub in Rocket Lake CPUs.
    
    Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Cc: stable <stable@vger.kernel.org> # v4.14+
    Link: https://lore.kernel.org/r/20210414171251.14672-7-alexander.shishkin@linux.intel.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/hwtracing/intel_th/pci.c b/drivers/hwtracing/intel_th/pci.c
index 2a1617103394..22ab5b4e36fe 100644
--- a/drivers/hwtracing/intel_th/pci.c
+++ b/drivers/hwtracing/intel_th/pci.c
@@ -240,6 +240,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = {
 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x1bcc),
 		.driver_data = (kernel_ulong_t)&intel_th_2x,
 	},
+	{
+		/* Rocket Lake CPU */
+		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4c19),
+		.driver_data = (kernel_ulong_t)&intel_th_2x,
+	},
 	{ 0 },
 };
 

commit 67749abac7245e11b2790b8326c33618cd1c1d7a
Author: Filipe Manana <fdmanana@suse.com>
Date:   Tue Apr 20 10:55:12 2021 +0100

    btrfs: fix metadata extent leak after failure to create subvolume
    
    commit 67addf29004c5be9fa0383c82a364bb59afc7f84 upstream.
    
    When creating a subvolume we allocate an extent buffer for its root node
    after starting a transaction. We setup a root item for the subvolume that
    points to that extent buffer and then attempt to insert the root item into
    the root tree - however if that fails, due to ENOMEM for example, we do
    not free the extent buffer previously allocated and we do not abort the
    transaction (as at that point we did nothing that can not be undone).
    
    This means that we effectively do not return the metadata extent back to
    the free space cache/tree and we leave a delayed reference for it which
    causes a metadata extent item to be added to the extent tree, in the next
    transaction commit, without having backreferences. When this happens
    'btrfs check' reports the following:
    
      $ btrfs check /dev/sdi
      Opening filesystem to check...
      Checking filesystem on /dev/sdi
      UUID: dce2cb9d-025f-4b05-a4bf-cee0ad3785eb
      [1/7] checking root items
      [2/7] checking extents
      ref mismatch on [30425088 16384] extent item 1, found 0
      backref 30425088 root 256 not referenced back 0x564a91c23d70
      incorrect global backref count on 30425088 found 1 wanted 0
      backpointer mismatch on [30425088 16384]
      owner ref check failed [30425088 16384]
      ERROR: errors found in extent allocation tree or chunk allocation
      [3/7] checking free space cache
      [4/7] checking fs roots
      [5/7] checking only csums items (without verifying data)
      [6/7] checking root refs
      [7/7] checking quota groups skipped (not enabled on this FS)
      found 212992 bytes used, error(s) found
      total csum bytes: 0
      total tree bytes: 131072
      total fs tree bytes: 32768
      total extent tree bytes: 16384
      btree space waste bytes: 124669
      file data blocks allocated: 65536
       referenced 65536
    
    So fix this by freeing the metadata extent if btrfs_insert_root() returns
    an error.
    
    CC: stable@vger.kernel.org # 4.4+
    Signed-off-by: Filipe Manana <fdmanana@suse.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 1c053e10b33b..717385b7f66f 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -656,8 +656,6 @@ static noinline int create_subvol(struct inode *dir,
 	btrfs_set_root_otransid(root_item, trans->transid);
 
 	btrfs_tree_unlock(leaf);
-	free_extent_buffer(leaf);
-	leaf = NULL;
 
 	btrfs_set_root_dirid(root_item, new_dirid);
 
@@ -666,8 +664,22 @@ static noinline int create_subvol(struct inode *dir,
 	key.type = BTRFS_ROOT_ITEM_KEY;
 	ret = btrfs_insert_root(trans, fs_info->tree_root, &key,
 				root_item);
-	if (ret)
+	if (ret) {
+		/*
+		 * Since we don't abort the transaction in this case, free the
+		 * tree block so that we don't leak space and leave the
+		 * filesystem in an inconsistent state (an extent item in the
+		 * extent tree without backreferences). Also no need to have
+		 * the tree block locked since it is not in any tree at this
+		 * point, so no other task can find it and use it.
+		 */
+		btrfs_free_tree_block(trans, root, leaf, 0, 1);
+		free_extent_buffer(leaf);
 		goto fail;
+	}
+
+	free_extent_buffer(leaf);
+	leaf = NULL;
 
 	key.offset = (u64)-1;
 	new_root = btrfs_read_fs_root_no_name(fs_info, &key);

commit e486f8397f3f14a7cadc166138141fdb14379a54
Author: Paul Aurich <paul@darkrain42.org>
Date:   Tue Apr 13 14:25:27 2021 -0700

    cifs: Return correct error code from smb2_get_enc_key
    
    commit 83728cbf366e334301091d5b808add468ab46b27 upstream.
    
    Avoid a warning if the error percolates back up:
    
    [440700.376476] CIFS VFS: \\otters.example.com crypt_message: Could not get encryption key
    [440700.386947] ------------[ cut here ]------------
    [440700.386948] err = 1
    [440700.386977] WARNING: CPU: 11 PID: 2733 at /build/linux-hwe-5.4-p6lk6L/linux-hwe-5.4-5.4.0/lib/errseq.c:74 errseq_set+0x5c/0x70
    ...
    [440700.397304] CPU: 11 PID: 2733 Comm: tar Tainted: G           OE     5.4.0-70-generic #78~18.04.1-Ubuntu
    ...
    [440700.397334] Call Trace:
    [440700.397346]  __filemap_set_wb_err+0x1a/0x70
    [440700.397419]  cifs_writepages+0x9c7/0xb30 [cifs]
    [440700.397426]  do_writepages+0x4b/0xe0
    [440700.397444]  __filemap_fdatawrite_range+0xcb/0x100
    [440700.397455]  filemap_write_and_wait+0x42/0xa0
    [440700.397486]  cifs_setattr+0x68b/0xf30 [cifs]
    [440700.397493]  notify_change+0x358/0x4a0
    [440700.397500]  utimes_common+0xe9/0x1c0
    [440700.397510]  do_utimes+0xc5/0x150
    [440700.397520]  __x64_sys_utimensat+0x88/0xd0
    
    Fixes: 61cfac6f267d ("CIFS: Fix possible use after free in demultiplex thread")
    Signed-off-by: Paul Aurich <paul@darkrain42.org>
    CC: stable@vger.kernel.org
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
index faafa9a557c2..9d94abaff8fc 100644
--- a/fs/cifs/smb2ops.c
+++ b/fs/cifs/smb2ops.c
@@ -2700,7 +2700,7 @@ smb2_get_enc_key(struct TCP_Server_Info *server, __u64 ses_id, int enc, u8 *key)
 	}
 	spin_unlock(&cifs_tcp_ses_lock);
 
-	return 1;
+	return -EAGAIN;
 }
 /*
  * Encrypt or decrypt @rqst message. @rqst[0] has the following format:

commit 006270aa8f9c32c8fc723b0b2874b91fd10c1290
Author: Gao Xiang <hsiangkao@redhat.com>
Date:   Mon Mar 29 08:36:14 2021 +0800

    erofs: add unsupported inode i_format check
    
    commit 24a806d849c0b0c1d0cd6a6b93ba4ae4c0ec9f08 upstream.
    
    If any unknown i_format fields are set (may be of some new incompat
    inode features), mark such inode as unsupported.
    
    Just in case of any new incompat i_format fields added in the future.
    
    Link: https://lore.kernel.org/r/20210329003614.6583-1-hsiangkao@aol.com
    Fixes: 431339ba9042 ("staging: erofs: add inode operations")
    Cc: <stable@vger.kernel.org> # 4.19+
    Signed-off-by: Gao Xiang <hsiangkao@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/staging/erofs/erofs_fs.h b/drivers/staging/erofs/erofs_fs.h
index 7677da889f12..d8838ce66941 100644
--- a/drivers/staging/erofs/erofs_fs.h
+++ b/drivers/staging/erofs/erofs_fs.h
@@ -71,6 +71,9 @@ enum {
 #define EROFS_I_VERSION_BIT             0
 __EROFS_BIT(EROFS_I_, DATA_MAPPING, VERSION);
 
+#define EROFS_I_ALL	\
+	((1 << (EROFS_I_DATA_MAPPING_BIT + EROFS_I_DATA_MAPPING_BITS)) - 1)
+
 struct erofs_inode_v1 {
 /*  0 */__le16 i_advise;
 
diff --git a/drivers/staging/erofs/inode.c b/drivers/staging/erofs/inode.c
index a43abd530cc1..02398c7eb4a4 100644
--- a/drivers/staging/erofs/inode.c
+++ b/drivers/staging/erofs/inode.c
@@ -48,6 +48,12 @@ static struct page *read_inode(struct inode *inode, unsigned int *ofs)
 	v1 = page_address(page) + *ofs;
 	ifmt = le16_to_cpu(v1->i_advise);
 
+	if (ifmt & ~EROFS_I_ALL) {
+		errln("unsupported i_format %u of nid %llu", ifmt, vi->nid);
+		err = -EOPNOTSUPP;
+		goto err_out;
+	}
+
 	vi->data_mapping_mode = __inode_data_mapping(ifmt);
 	if (unlikely(vi->data_mapping_mode >= EROFS_INODE_LAYOUT_MAX)) {
 		errln("unknown data mapping mode %u of nid %llu",

commit 2e911496d874dd15aabda0dda3728d66a3b10d3d
Author: Seunghui Lee <sh043.lee@samsung.com>
Date:   Mon Feb 22 17:31:56 2021 +0900

    mmc: core: Set read only for SD cards with permanent write protect bit
    
    commit 917a5336f2c27928be270226ab374ed0cbf3805d upstream.
    
    Some of SD cards sets permanent write protection bit in their CSD register,
    due to lifespan or internal problem. To avoid unnecessary I/O write
    operations, let's parse the bits in the CSD during initialization and mark
    the card as read only for this case.
    
    Signed-off-by: Seunghui Lee <sh043.lee@samsung.com>
    Link: https://lore.kernel.org/r/20210222083156.19158-1-sh043.lee@samsung.com
    Cc: stable@vger.kernel.org
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
index 04738359ec02..aa3de584b90c 100644
--- a/drivers/mmc/core/sd.c
+++ b/drivers/mmc/core/sd.c
@@ -138,6 +138,9 @@ static int mmc_decode_csd(struct mmc_card *card)
 			csd->erase_size = UNSTUFF_BITS(resp, 39, 7) + 1;
 			csd->erase_size <<= csd->write_blkbits - 9;
 		}
+
+		if (UNSTUFF_BITS(resp, 13, 1))
+			mmc_card_set_readonly(card);
 		break;
 	case 1:
 		/*
@@ -172,6 +175,9 @@ static int mmc_decode_csd(struct mmc_card *card)
 		csd->write_blkbits = 9;
 		csd->write_partial = 0;
 		csd->erase_size = 1;
+
+		if (UNSTUFF_BITS(resp, 13, 1))
+			mmc_card_set_readonly(card);
 		break;
 	default:
 		pr_err("%s: unrecognised CSD structure version %d\n",

commit 8e2da4780aea1fedb54487d462f1be63fbfe1a9a
Author: DooHyun Hwang <dh0421.hwang@samsung.com>
Date:   Wed Feb 10 13:59:36 2021 +0900

    mmc: core: Do a power cycle when the CMD11 fails
    
    commit 147186f531ae49c18b7a9091a2c40e83b3d95649 upstream.
    
    A CMD11 is sent to the SD/SDIO card to start the voltage switch procedure
    into 1.8V I/O. According to the SD spec a power cycle is needed of the
    card, if it turns out that the CMD11 fails. Let's fix this, to allow a
    retry of the initialization without the voltage switch, to succeed.
    
    Note that, whether it makes sense to also retry with the voltage switch
    after the power cycle is a bit more difficult to know. At this point, we
    treat it like the CMD11 isn't supported and therefore we skip it when
    retrying.
    
    Signed-off-by: DooHyun Hwang <dh0421.hwang@samsung.com>
    Link: https://lore.kernel.org/r/20210210045936.7809-1-dh0421.hwang@samsung.com
    Cc: stable@vger.kernel.org
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index 56f7f3600469..798bcb65b4df 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -1537,7 +1537,7 @@ int mmc_set_uhs_voltage(struct mmc_host *host, u32 ocr)
 
 	err = mmc_wait_for_cmd(host, &cmd, 0);
 	if (err)
-		return err;
+		goto power_cycle;
 
 	if (!mmc_host_is_spi(host) && (cmd.resp[0] & R1_ERROR))
 		return -EIO;

commit 0747a1d043c2c0c062fd40966f642c43247e2477
Author: Avri Altman <avri.altman@wdc.com>
Date:   Sun Apr 25 09:02:06 2021 +0300

    mmc: block: Issue a cache flush only when it's enabled
    
    commit 97fce126e279690105ee15be652b465fd96f9997 upstream.
    
    In command queueing mode, the cache isn't flushed via the mmc_flush_cache()
    function, but instead by issuing a CMDQ_TASK_MGMT (CMD48) with a
    FLUSH_CACHE opcode. In this path, we need to check if cache has been
    enabled, before deciding to flush the cache, along the lines of what's
    being done in mmc_flush_cache().
    
    To fix this problem, let's add a new bus ops callback ->cache_enabled() and
    implement it for the mmc bus type. In this way, the mmc block device driver
    can call it to know whether cache flushing should be done.
    
    Fixes: 1e8e55b67030 (mmc: block: Add CQE support)
    Cc: stable@vger.kernel.org
    Reported-by: Brendan Peter <bpeter@lytx.com>
    Signed-off-by: Avri Altman <avri.altman@wdc.com>
    Tested-by: Brendan Peter <bpeter@lytx.com>
    Acked-by: Adrian Hunter <adrian.hunter@intel.com>
    Link: https://lore.kernel.org/r/20210425060207.2591-2-avri.altman@wdc.com
    Link: https://lore.kernel.org/r/20210425060207.2591-3-avri.altman@wdc.com
    [Ulf: Squashed the two patches and made some minor updates]
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
index b52b5e2c427b..c2c45c148ae7 100644
--- a/drivers/mmc/core/block.c
+++ b/drivers/mmc/core/block.c
@@ -2236,6 +2236,10 @@ enum mmc_issued mmc_blk_mq_issue_rq(struct mmc_queue *mq, struct request *req)
 	case MMC_ISSUE_ASYNC:
 		switch (req_op(req)) {
 		case REQ_OP_FLUSH:
+			if (!mmc_cache_enabled(host)) {
+				blk_mq_end_request(req, BLK_STS_OK);
+				return MMC_REQ_FINISHED;
+			}
 			ret = mmc_blk_cqe_issue_flush(mq, req);
 			break;
 		case REQ_OP_READ:
diff --git a/drivers/mmc/core/core.h b/drivers/mmc/core/core.h
index 087ba68b2920..3071b644e94a 100644
--- a/drivers/mmc/core/core.h
+++ b/drivers/mmc/core/core.h
@@ -32,6 +32,7 @@ struct mmc_bus_ops {
 	int (*shutdown)(struct mmc_host *);
 	int (*hw_reset)(struct mmc_host *);
 	int (*sw_reset)(struct mmc_host *);
+	bool (*cache_enabled)(struct mmc_host *);
 };
 
 void mmc_attach_bus(struct mmc_host *host, const struct mmc_bus_ops *ops);
@@ -173,4 +174,12 @@ static inline void mmc_post_req(struct mmc_host *host, struct mmc_request *mrq,
 		host->ops->post_req(host, mrq, err);
 }
 
+static inline bool mmc_cache_enabled(struct mmc_host *host)
+{
+	if (host->bus_ops->cache_enabled)
+		return host->bus_ops->cache_enabled(host);
+
+	return false;
+}
+
 #endif
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index 1b5139a906b8..d9202f2726d1 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -2009,6 +2009,12 @@ static void mmc_detect(struct mmc_host *host)
 	}
 }
 
+static bool _mmc_cache_enabled(struct mmc_host *host)
+{
+	return host->card->ext_csd.cache_size > 0 &&
+	       host->card->ext_csd.cache_ctrl & 1;
+}
+
 static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
 {
 	int err = 0;
@@ -2193,6 +2199,7 @@ static const struct mmc_bus_ops mmc_ops = {
 	.alive = mmc_alive,
 	.shutdown = mmc_shutdown,
 	.hw_reset = _mmc_hw_reset,
+	.cache_enabled = _mmc_cache_enabled,
 };
 
 /*
diff --git a/drivers/mmc/core/mmc_ops.c b/drivers/mmc/core/mmc_ops.c
index 693b99eff74b..334678707deb 100644
--- a/drivers/mmc/core/mmc_ops.c
+++ b/drivers/mmc/core/mmc_ops.c
@@ -1014,9 +1014,7 @@ int mmc_flush_cache(struct mmc_card *card)
 {
 	int err = 0;
 
-	if (mmc_card_mmc(card) &&
-			(card->ext_csd.cache_size > 0) &&
-			(card->ext_csd.cache_ctrl & 1)) {
+	if (mmc_cache_enabled(card->host)) {
 		err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
 				EXT_CSD_FLUSH_CACHE, 1, 0);
 		if (err)

commit b52c11161e95fa153fa6d6bb406aca286137a22d
Author: Avri Altman <avri.altman@wdc.com>
Date:   Tue Apr 20 16:46:41 2021 +0300

    mmc: block: Update ext_csd.cache_ctrl if it was written
    
    commit aea0440ad023ab0662299326f941214b0d7480bd upstream.
    
    The cache function can be turned ON and OFF by writing to the CACHE_CTRL
    byte (EXT_CSD byte [33]).  However,  card->ext_csd.cache_ctrl is only
    set on init if cache size > 0.
    
    Fix that by explicitly setting ext_csd.cache_ctrl on ext-csd write.
    
    Signed-off-by: Avri Altman <avri.altman@wdc.com>
    Acked-by: Adrian Hunter <adrian.hunter@intel.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210420134641.57343-3-avri.altman@wdc.com
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
index 77324ea4eb93..b52b5e2c427b 100644
--- a/drivers/mmc/core/block.c
+++ b/drivers/mmc/core/block.c
@@ -622,6 +622,18 @@ static int __mmc_blk_ioctl_cmd(struct mmc_card *card, struct mmc_blk_data *md,
 		main_md->part_curr = value & EXT_CSD_PART_CONFIG_ACC_MASK;
 	}
 
+	/*
+	 * Make sure to update CACHE_CTRL in case it was changed. The cache
+	 * will get turned back on if the card is re-initialized, e.g.
+	 * suspend/resume or hw reset in recovery.
+	 */
+	if ((MMC_EXTRACT_INDEX_FROM_ARG(cmd.arg) == EXT_CSD_CACHE_CTRL) &&
+	    (cmd.opcode == MMC_SWITCH)) {
+		u8 value = MMC_EXTRACT_VALUE_FROM_ARG(cmd.arg) & 1;
+
+		card->ext_csd.cache_ctrl = value;
+	}
+
 	/*
 	 * According to the SD specs, some commands require a delay after
 	 * issuing the command.

commit 11becba89c4906e341131d74dc5d0d3860f8d5db
Author: Adrian Hunter <adrian.hunter@intel.com>
Date:   Wed Mar 31 11:17:52 2021 +0300

    mmc: sdhci-pci: Fix initialization of some SD cards for Intel BYT-based controllers
    
    commit 2970134b927834e9249659a70aac48e62dff804a upstream.
    
    Bus power may control card power, but the full reset done by SDHCI at
    initialization still may not reset the power, whereas a direct write to
    SDHCI_POWER_CONTROL can. That might be needed to initialize correctly, if
    the card was left powered on previously.
    
    Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20210331081752.23621-1-adrian.hunter@intel.com
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c
index a411300f9d6d..cb4a0458f098 100644
--- a/drivers/mmc/host/sdhci-pci-core.c
+++ b/drivers/mmc/host/sdhci-pci-core.c
@@ -465,6 +465,7 @@ struct intel_host {
 	int	drv_strength;
 	bool	d3_retune;
 	bool	rpm_retune_ok;
+	bool	needs_pwr_off;
 	u32	glk_rx_ctrl1;
 	u32	glk_tun_val;
 };
@@ -590,9 +591,25 @@ static int bxt_get_cd(struct mmc_host *mmc)
 static void sdhci_intel_set_power(struct sdhci_host *host, unsigned char mode,
 				  unsigned short vdd)
 {
+	struct sdhci_pci_slot *slot = sdhci_priv(host);
+	struct intel_host *intel_host = sdhci_pci_priv(slot);
 	int cntr;
 	u8 reg;
 
+	/*
+	 * Bus power may control card power, but a full reset still may not
+	 * reset the power, whereas a direct write to SDHCI_POWER_CONTROL can.
+	 * That might be needed to initialize correctly, if the card was left
+	 * powered on previously.
+	 */
+	if (intel_host->needs_pwr_off) {
+		intel_host->needs_pwr_off = false;
+		if (mode != MMC_POWER_OFF) {
+			sdhci_writeb(host, 0, SDHCI_POWER_CONTROL);
+			usleep_range(10000, 12500);
+		}
+	}
+
 	sdhci_set_power(host, mode, vdd);
 
 	if (mode == MMC_POWER_OFF)
@@ -926,6 +943,14 @@ static int byt_sdio_probe_slot(struct sdhci_pci_slot *slot)
 	return 0;
 }
 
+static void byt_needs_pwr_off(struct sdhci_pci_slot *slot)
+{
+	struct intel_host *intel_host = sdhci_pci_priv(slot);
+	u8 reg = sdhci_readb(slot->host, SDHCI_POWER_CONTROL);
+
+	intel_host->needs_pwr_off = reg  & SDHCI_POWER_ON;
+}
+
 static int byt_sd_probe_slot(struct sdhci_pci_slot *slot)
 {
 	byt_probe_slot(slot);
@@ -943,6 +968,8 @@ static int byt_sd_probe_slot(struct sdhci_pci_slot *slot)
 	    slot->chip->pdev->subsystem_device == PCI_SUBDEVICE_ID_NI_78E3)
 		slot->host->mmc->caps2 |= MMC_CAP2_AVOID_3_3V;
 
+	byt_needs_pwr_off(slot);
+
 	return 0;
 }
 

commit c5ab9b67d8b061de74e2ca51bf787ee599bd7f89
Author: Arun Easi <aeasi@marvell.com>
Date:   Mon Mar 29 01:52:23 2021 -0700

    scsi: qla2xxx: Fix crash in qla2xxx_mqueuecommand()
    
    commit 6641df81ab799f28a5d564f860233dd26cca0d93 upstream.
    
        RIP: 0010:kmem_cache_free+0xfa/0x1b0
        Call Trace:
           qla2xxx_mqueuecommand+0x2b5/0x2c0 [qla2xxx]
           scsi_queue_rq+0x5e2/0xa40
           __blk_mq_try_issue_directly+0x128/0x1d0
           blk_mq_request_issue_directly+0x4e/0xb0
    
    Fix incorrect call to free srb in qla2xxx_mqueuecommand(), as srb is now
    allocated by upper layers. This fixes smatch warning of srb unintended
    free.
    
    Link: https://lore.kernel.org/r/20210329085229.4367-7-njavali@marvell.com
    Fixes: af2a0c51b120 ("scsi: qla2xxx: Fix SRB leak on switch command timeout")
    Cc: stable@vger.kernel.org # 5.5
    Reported-by: Laurence Oberman <loberman@redhat.com>
    Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
    Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
    Signed-off-by: Arun Easi <aeasi@marvell.com>
    Signed-off-by: Nilesh Javali <njavali@marvell.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 83ef790afb5d..7cbdd32a238d 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -1028,8 +1028,6 @@ qla2xxx_mqueuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd,
 	if (rval != QLA_SUCCESS) {
 		ql_dbg(ql_dbg_io + ql_dbg_verbose, vha, 0x3078,
 		    "Start scsi failed rval=%d for cmd=%p.\n", rval, cmd);
-		if (rval == QLA_INTERFACE_ERROR)
-			goto qc24_free_sp_fail_command;
 		goto qc24_host_busy_free_sp;
 	}
 
@@ -1044,11 +1042,6 @@ qla2xxx_mqueuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd,
 qc24_target_busy:
 	return SCSI_MLQUEUE_TARGET_BUSY;
 
-qc24_free_sp_fail_command:
-	sp->free(sp);
-	CMD_SP(cmd) = NULL;
-	qla2xxx_rel_qpair_sp(sp->qpair, sp);
-
 qc24_fail_command:
 	cmd->scsi_done(cmd);
 

commit e5bf7e6f89ac4020a2892cebc9806f054fd994e5
Author: Tudor Ambarus <tudor.ambarus@microchip.com>
Date:   Thu Feb 18 15:09:50 2021 +0200

    spi: spi-ti-qspi: Free DMA resources
    
    commit 1d309cd688a76fb733f0089d36dc630327b32d59 upstream.
    
    Release the RX channel and free the dma coherent memory when
    devm_spi_register_master() fails.
    
    Fixes: 5720ec0a6d26 ("spi: spi-ti-qspi: Add DMA support for QSPI mmap read")
    Cc: stable@vger.kernel.org
    Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>
    Link: https://lore.kernel.org/r/20210218130950.90155-1-tudor.ambarus@microchip.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/spi/spi-ti-qspi.c b/drivers/spi/spi-ti-qspi.c
index 73a08724034b..c70b1790a959 100644
--- a/drivers/spi/spi-ti-qspi.c
+++ b/drivers/spi/spi-ti-qspi.c
@@ -663,6 +663,17 @@ static int ti_qspi_runtime_resume(struct device *dev)
 	return 0;
 }
 
+static void ti_qspi_dma_cleanup(struct ti_qspi *qspi)
+{
+	if (qspi->rx_bb_addr)
+		dma_free_coherent(qspi->dev, QSPI_DMA_BUFFER_SIZE,
+				  qspi->rx_bb_addr,
+				  qspi->rx_bb_dma_addr);
+
+	if (qspi->rx_chan)
+		dma_release_channel(qspi->rx_chan);
+}
+
 static const struct of_device_id ti_qspi_match[] = {
 	{.compatible = "ti,dra7xxx-qspi" },
 	{.compatible = "ti,am4372-qspi" },
@@ -817,6 +828,8 @@ static int ti_qspi_probe(struct platform_device *pdev)
 	if (!ret)
 		return 0;
 
+	ti_qspi_dma_cleanup(qspi);
+
 	pm_runtime_disable(&pdev->dev);
 free_master:
 	spi_master_put(master);
@@ -835,12 +848,7 @@ static int ti_qspi_remove(struct platform_device *pdev)
 	pm_runtime_put_sync(&pdev->dev);
 	pm_runtime_disable(&pdev->dev);
 
-	if (qspi->rx_bb_addr)
-		dma_free_coherent(qspi->dev, QSPI_DMA_BUFFER_SIZE,
-				  qspi->rx_bb_addr,
-				  qspi->rx_bb_dma_addr);
-	if (qspi->rx_chan)
-		dma_release_channel(qspi->rx_chan);
+	ti_qspi_dma_cleanup(qspi);
 
 	return 0;
 }

commit c2d03087b5251d685a7d1b3a07ebfa2bcfae3c66
Author: Kai Stuhlemmer (ebee Engineering) <kai.stuhlemmer@ebee.de>
Date:   Mon Mar 22 17:07:14 2021 +0200

    mtd: rawnand: atmel: Update ecc_stats.corrected counter
    
    commit 33cebf701e98dd12b01d39d1c644387b27c1a627 upstream.
    
    Update MTD ECC statistics with the number of corrected bits.
    
    Fixes: f88fc122cc34 ("mtd: nand: Cleanup/rework the atmel_nand driver")
    Cc: stable@vger.kernel.org
    Signed-off-by: Kai Stuhlemmer (ebee Engineering) <kai.stuhlemmer@ebee.de>
    Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>
    Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20210322150714.101585-1-tudor.ambarus@microchip.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/mtd/nand/raw/atmel/nand-controller.c b/drivers/mtd/nand/raw/atmel/nand-controller.c
index ee1c401f131f..788762930487 100644
--- a/drivers/mtd/nand/raw/atmel/nand-controller.c
+++ b/drivers/mtd/nand/raw/atmel/nand-controller.c
@@ -826,10 +826,12 @@ static int atmel_nand_pmecc_correct_data(struct nand_chip *chip, void *buf,
 							  NULL, 0,
 							  chip->ecc.strength);
 
-		if (ret >= 0)
+		if (ret >= 0) {
+			mtd->ecc_stats.corrected += ret;
 			max_bitflips = max(ret, max_bitflips);
-		else
+		} else {
 			mtd->ecc_stats.failed++;
+		}
 
 		databuf += chip->ecc.size;
 		eccbuf += chip->ecc.bytes;

commit ffaa988e4c953248ff5962a4626a6072ad25733f
Author: Alexander Lobakin <alobakin@pm.me>
Date:   Tue Mar 23 17:37:19 2021 +0000

    mtd: spinand: core: add missing MODULE_DEVICE_TABLE()
    
    commit 25fefc88c71f47db0466570335e3f75f10952e7a upstream.
    
    The module misses MODULE_DEVICE_TABLE() for both SPI and OF ID tables
    and thus never autoloads on ID matches.
    Add the missing declarations.
    Present since day-0 of spinand framework introduction.
    
    Fixes: 7529df465248 ("mtd: nand: Add core infrastructure to support SPI NANDs")
    Cc: stable@vger.kernel.org # 4.19+
    Signed-off-by: Alexander Lobakin <alobakin@pm.me>
    Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20210323173714.317884-1-alobakin@pm.me
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c
index 1d61ae7aaa66..4a3dc5953b00 100644
--- a/drivers/mtd/nand/spi/core.c
+++ b/drivers/mtd/nand/spi/core.c
@@ -1129,12 +1129,14 @@ static const struct spi_device_id spinand_ids[] = {
 	{ .name = "spi-nand" },
 	{ /* sentinel */ },
 };
+MODULE_DEVICE_TABLE(spi, spinand_ids);
 
 #ifdef CONFIG_OF
 static const struct of_device_id spinand_of_ids[] = {
 	{ .compatible = "spi-nand" },
 	{ /* sentinel */ },
 };
+MODULE_DEVICE_TABLE(of, spinand_of_ids);
 #endif
 
 static struct spi_mem_driver spinand_drv = {

commit 6fcdf51e9b6d694af8f2150923586a0ad8f5ec81
Author: Jeffrey Mitchell <jeffrey.mitchell@starlab.io>
Date:   Fri Feb 26 15:00:23 2021 -0600

    ecryptfs: fix kernel panic with null dev_name
    
    commit 9046625511ad8dfbc8c6c2de16b3532c43d68d48 upstream.
    
    When mounting eCryptfs, a null "dev_name" argument to ecryptfs_mount()
    causes a kernel panic if the parsed options are valid. The easiest way to
    reproduce this is to call mount() from userspace with an existing
    eCryptfs mount's options and a "source" argument of 0.
    
    Error out if "dev_name" is null in ecryptfs_mount()
    
    Fixes: 237fead61998 ("[PATCH] ecryptfs: fs/Makefile and fs/Kconfig")
    Cc: stable@vger.kernel.org
    Signed-off-by: Jeffrey Mitchell <jeffrey.mitchell@starlab.io>
    Signed-off-by: Tyler Hicks <code@tyhicks.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c
index 025d66a705db..b86a9b3a39c0 100644
--- a/fs/ecryptfs/main.c
+++ b/fs/ecryptfs/main.c
@@ -506,6 +506,12 @@ static struct dentry *ecryptfs_mount(struct file_system_type *fs_type, int flags
 		goto out;
 	}
 
+	if (!dev_name) {
+		rc = -EINVAL;
+		err = "Device name cannot be null";
+		goto out;
+	}
+
 	rc = ecryptfs_parse_options(sbi, raw_data, &check_ruid);
 	if (rc) {
 		err = "Error parsing options";

commit 686dcc651c4da52134270098ed89f311e1e62261
Author: Chunfeng Yun <chunfeng.yun@mediatek.com>
Date:   Tue Mar 16 17:22:24 2021 +0800

    arm64: dts: mt8173: fix property typo of 'phys' in dsi node
    
    commit e4e5d030bd779fb8321d3b8bd65406fbe0827037 upstream.
    
    Use 'phys' instead of 'phy'.
    
    Fixes: 81ad4dbaf7af ("arm64: dts: mt8173: Add display subsystem related nodes")
    Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
    Reviewed-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210316092232.9806-5-chunfeng.yun@mediatek.com
    Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm64/boot/dts/mediatek/mt8173.dtsi b/arch/arm64/boot/dts/mediatek/mt8173.dtsi
index bd9fc50ac154..12837523dac8 100644
--- a/arch/arm64/boot/dts/mediatek/mt8173.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8173.dtsi
@@ -1111,7 +1111,7 @@
 				 <&mmsys CLK_MM_DSI1_DIGITAL>,
 				 <&mipi_tx1>;
 			clock-names = "engine", "digital", "hs";
-			phy = <&mipi_tx1>;
+			phys = <&mipi_tx1>;
 			phy-names = "dphy";
 			status = "disabled";
 		};

commit b5ca3bb0367daefcea4c0d0871a9340fdde39401
Author: Marek Behún <kabel@kernel.org>
Date:   Thu Jan 14 13:40:23 2021 +0100

    arm64: dts: marvell: armada-37xx: add syscon compatible to NB clk node
    
    commit 1d88358a89dbac9c7d4559548b9a44840456e6fb upstream.
    
    Add "syscon" compatible to the North Bridge clocks node to allow the
    cpufreq driver to access these registers via syscon API.
    
    This is needed for a fix of cpufreq driver.
    
    Signed-off-by: Marek Behún <kabel@kernel.org>
    Fixes: e8d66e7927b2 ("arm64: dts: marvell: armada-37xx: add nodes...")
    Cc: stable@vger.kernel.org
    Cc: Gregory CLEMENT <gregory.clement@free-electrons.com>
    Cc: Miquel Raynal <miquel.raynal@bootlin.com>
    Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
index d9531e242eb4..3a611250f598 100644
--- a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
+++ b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
@@ -143,7 +143,8 @@
 			};
 
 			nb_periph_clk: nb-periph-clk@13000 {
-				compatible = "marvell,armada-3700-periph-clock-nb";
+				compatible = "marvell,armada-3700-periph-clock-nb",
+					     "syscon";
 				reg = <0x13000 0x100>;
 				clocks = <&tbg 0>, <&tbg 1>, <&tbg 2>,
 				<&tbg 3>, <&xtalclk>;

commit c3851b9649c4e4a7f8b0dfe12000137c9420e46a
Author: Ard Biesheuvel <ardb@kernel.org>
Date:   Fri Feb 5 19:23:00 2021 +0100

    ARM: 9056/1: decompressor: fix BSS size calculation for LLVM ld.lld
    
    commit c4e792d1acce31c2eb7b9193ab06ab94de05bf42 upstream.
    
    The LLVM ld.lld linker uses a different symbol type for __bss_start,
    resulting in the calculation of KBSS_SZ to be thrown off. Up until now,
    this has gone unnoticed as it only affects the appended DTB case, but
    pending changes for ARM in the way the decompressed kernel is cleaned
    from the caches has uncovered this problem.
    
    On a ld.lld build:
    
      $ nm vmlinux |grep bss_
      c1c22034 D __bss_start
      c1c86e98 B __bss_stop
    
    resulting in
    
      $ readelf -s arch/arm/boot/compressed/vmlinux | grep bss_size
      433: c1c86e98     0 NOTYPE  GLOBAL DEFAULT  ABS _kernel_bss_size
    
    which is obviously incorrect, and may cause the cache clean to access
    unmapped memory, or cause the size calculation to wrap, resulting in no
    cache clean to be performed at all.
    
    Fix this by updating the sed regex to take D type symbols into account.
    
    Link: https://lore.kernel.org/linux-arm-kernel/6c65bcef-d4e7-25fa-43cf-2c435bb61bb9@collabora.com/
    Link: https://lore.kernel.org/linux-arm-kernel/20210205085220.31232-1-ardb@kernel.org/
    
    Cc: <stable@vger.kernel.org> # v4.19+
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
    Tested-by: Nick Desaulniers <ndesaulniers@google.com>
    Reported-by: Guillaume Tucker <guillaume.tucker@collabora.com>
    Reported-by: "kernelci.org bot" <bot@kernelci.org>
    Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile
index c762004572ef..ec2327a3796d 100644
--- a/arch/arm/boot/compressed/Makefile
+++ b/arch/arm/boot/compressed/Makefile
@@ -121,8 +121,8 @@ asflags-y := -DZIMAGE
 
 # Supply kernel BSS size to the decompressor via a linker symbol.
 KBSS_SZ = $(shell echo $$(($$($(NM) $(obj)/../../../../vmlinux | \
-		sed -n -e 's/^\([^ ]*\) [AB] __bss_start$$/-0x\1/p' \
-		       -e 's/^\([^ ]*\) [AB] __bss_stop$$/+0x\1/p') )) )
+		sed -n -e 's/^\([^ ]*\) [ABD] __bss_start$$/-0x\1/p' \
+		       -e 's/^\([^ ]*\) [ABD] __bss_stop$$/+0x\1/p') )) )
 LDFLAGS_vmlinux = --defsym _kernel_bss_size=$(KBSS_SZ)
 # Supply ZRELADDR to the decompressor via a linker symbol.
 ifneq ($(CONFIG_AUTO_ZRELADDR),y)

commit 3d9281a4ac7171c808f9507f0937eb236b353905
Author: Steven Rostedt (VMware) <rostedt@goodmis.org>
Date:   Wed May 5 10:38:24 2021 -0400

    ftrace: Handle commands when closing set_ftrace_filter file
    
    commit 8c9af478c06bb1ab1422f90d8ecbc53defd44bc3 upstream.
    
     # echo switch_mm:traceoff > /sys/kernel/tracing/set_ftrace_filter
    
    will cause switch_mm to stop tracing by the traceoff command.
    
     # echo -n switch_mm:traceoff > /sys/kernel/tracing/set_ftrace_filter
    
    does nothing.
    
    The reason is that the parsing in the write function only processes
    commands if it finished parsing (there is white space written after the
    command). That's to handle:
    
     write(fd, "switch_mm:", 10);
     write(fd, "traceoff", 8);
    
    cases, where the command is broken over multiple writes.
    
    The problem is if the file descriptor is closed, then the write call is
    not processed, and the command needs to be processed in the release code.
    The release code can handle matching of functions, but does not handle
    commands.
    
    Cc: stable@vger.kernel.org
    Fixes: eda1e32855656 ("tracing: handle broken names in ftrace filter")
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 3492202762c7..f8d82b36dd66 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -5023,7 +5023,10 @@ int ftrace_regex_release(struct inode *inode, struct file *file)
 
 	parser = &iter->parser;
 	if (trace_parser_loaded(parser)) {
-		ftrace_match_records(iter->hash, parser->buffer, parser->idx);
+		int enable = !(iter->flags & FTRACE_ITER_NOTRACE);
+
+		ftrace_process_regex(iter, parser->buffer,
+				     parser->idx, enable);
 	}
 
 	trace_parser_put(parser);

commit 609e1328c8f571535882e51f3fce4e5c62c6a80d
Author: Mark Langsdorf <mlangsdo@redhat.com>
Date:   Tue Apr 27 13:54:33 2021 -0500

    ACPI: custom_method: fix a possible memory leak
    
    commit 1cfd8956437f842836e8a066b40d1ec2fc01f13e upstream.
    
    In cm_write(), if the 'buf' is allocated memory but not fully consumed,
    it is possible to reallocate the buffer without freeing it by passing
    '*ppos' as 0 on a subsequent call.
    
    Add an explicit kfree() before kzalloc() to prevent the possible memory
    leak.
    
    Fixes: 526b4af47f44 ("ACPI: Split out custom_method functionality into an own driver")
    Signed-off-by: Mark Langsdorf <mlangsdo@redhat.com>
    Cc: 5.4+ <stable@vger.kernel.org> # 5.4+
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/acpi/custom_method.c b/drivers/acpi/custom_method.c
index 0bc0be355571..613041870872 100644
--- a/drivers/acpi/custom_method.c
+++ b/drivers/acpi/custom_method.c
@@ -37,6 +37,8 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf,
 				   sizeof(struct acpi_table_header)))
 			return -EFAULT;
 		uncopied_bytes = max_size = table.length;
+		/* make sure the buf is not allocated */
+		kfree(buf);
 		buf = kzalloc(max_size, GFP_KERNEL);
 		if (!buf)
 			return -ENOMEM;

commit a5b26a2e362f572d87e9fd35435680e557052a17
Author: Mark Langsdorf <mlangsdo@redhat.com>
Date:   Fri Apr 23 10:28:17 2021 -0500

    ACPI: custom_method: fix potential use-after-free issue
    
    commit e483bb9a991bdae29a0caa4b3a6d002c968f94aa upstream.
    
    In cm_write(), buf is always freed when reaching the end of the
    function.  If the requested count is less than table.length, the
    allocated buffer will be freed but subsequent calls to cm_write() will
    still try to access it.
    
    Remove the unconditional kfree(buf) at the end of the function and
    set the buf to NULL in the -EINVAL error path to match the rest of
    function.
    
    Fixes: 03d1571d9513 ("ACPI: custom_method: fix memory leaks")
    Signed-off-by: Mark Langsdorf <mlangsdo@redhat.com>
    Cc: 5.4+ <stable@vger.kernel.org> # 5.4+
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/acpi/custom_method.c b/drivers/acpi/custom_method.c
index 222ea3f12f41..0bc0be355571 100644
--- a/drivers/acpi/custom_method.c
+++ b/drivers/acpi/custom_method.c
@@ -50,6 +50,7 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf,
 	    (*ppos + count < count) ||
 	    (count > uncopied_bytes)) {
 		kfree(buf);
+		buf = NULL;
 		return -EINVAL;
 	}
 
@@ -71,7 +72,6 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf,
 		add_taint(TAINT_OVERRIDDEN_ACPI_TABLE, LOCKDEP_NOW_UNRELIABLE);
 	}
 
-	kfree(buf);
 	return count;
 }
 

commit 2afdf47ef58d7d7046241bf77c664e58f615b779
Author: Vasily Gorbik <gor@linux.ibm.com>
Date:   Tue Apr 20 11:04:10 2021 +0200

    s390/disassembler: increase ebpf disasm buffer size
    
    commit 6f3353c2d2b3eb4de52e9704cb962712033db181 upstream.
    
    Current ebpf disassembly buffer size of 64 is too small. E.g. this line
    takes 65 bytes:
    01fffff8005822e: ec8100ed8065\tclgrj\t%r8,%r1,8,001fffff80058408\n\0
    
    Double the buffer size like it is done for the kernel disassembly buffer.
    
    Fixes the following KASAN finding:
    
    UG: KASAN: stack-out-of-bounds in print_fn_code+0x34c/0x380
    Write of size 1 at addr 001fff800ad5f970 by task test_progs/853
    
    CPU: 53 PID: 853 Comm: test_progs Not tainted
    5.12.0-rc7-23786-g23457d86b1f0-dirty #19
    Hardware name: IBM 3906 M04 704 (LPAR)
    Call Trace:
     [<0000000cd8e0538a>] show_stack+0x17a/0x1668
     [<0000000cd8e2a5d8>] dump_stack+0x140/0x1b8
     [<0000000cd8e16e74>] print_address_description.constprop.0+0x54/0x260
     [<0000000cd75a8698>] kasan_report+0xc8/0x130
     [<0000000cd6e26da4>] print_fn_code+0x34c/0x380
     [<0000000cd6ea0f4e>] bpf_int_jit_compile+0xe3e/0xe58
     [<0000000cd72c4c88>] bpf_prog_select_runtime+0x5b8/0x9c0
     [<0000000cd72d1bf8>] bpf_prog_load+0xa78/0x19c0
     [<0000000cd72d7ad6>] __do_sys_bpf.part.0+0x18e/0x768
     [<0000000cd6e0f392>] do_syscall+0x12a/0x220
     [<0000000cd8e333f8>] __do_syscall+0x98/0xc8
     [<0000000cd8e54834>] system_call+0x6c/0x94
    1 lock held by test_progs/853:
     #0: 0000000cd9bf7460 (report_lock){....}-{2:2}, at:
         kasan_report+0x96/0x130
    
    addr 001fff800ad5f970 is located in stack of task test_progs/853 at
    offset 96 in frame:
     print_fn_code+0x0/0x380
    this frame has 1 object:
     [32, 96) 'buffer'
    
    Memory state around the buggy address:
     001fff800ad5f800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
     001fff800ad5f880: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    >001fff800ad5f900: 00 00 f1 f1 f1 f1 00 00 00 00 00 00 00 00 f3 f3
                                                                 ^
     001fff800ad5f980: f3 f3 00 00 00 00 00 00 00 00 00 00 00 00 00 00
     001fff800ad5fa00: 00 00 00 00 00 00 00 f1 f1 f1 f1 00 00 00 00 00
    
    Cc: <stable@vger.kernel.org>
    Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
    Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/s390/kernel/dis.c b/arch/s390/kernel/dis.c
index 41925f220694..01307db4b4dd 100644
--- a/arch/s390/kernel/dis.c
+++ b/arch/s390/kernel/dis.c
@@ -558,7 +558,7 @@ void show_code(struct pt_regs *regs)
 
 void print_fn_code(unsigned char *code, unsigned long len)
 {
-	char buffer[64], *ptr;
+	char buffer[128], *ptr;
 	int opsize, i;
 
 	while (len) {

commit f96dfe0687afbc99fd7d27c0a4a7e9e55d3b0603
Author: Huang zhibao <hzb@rock-chips.com>
Date:   Fri May 21 09:52:19 2021 +0800

    arm64: dts: rockchip: rk3566-box: update io_domain
    
    Signed-off-by: Huang zhibao <hzb@rock-chips.com>
    Change-Id: I70335dd9075bafd852e78f4a99a8942f0afd0856

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-box-demo-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-box-demo-v10.dtsi
index 054baf4cbd93..8d810a6c17c6 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-box-demo-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-box-demo-v10.dtsi
@@ -371,8 +371,8 @@
 	status = "okay";
 	pmuio1-supply = <&vcc_3v3>;
 	pmuio2-supply = <&vcc_3v3>;
-	vccio1-supply = <&vcc_1v8>;
-	vccio3-supply = <&vccio_sd>;
+	vccio1-supply = <&vcc_3v3>;
+	vccio3-supply = <&vcc_3v3>;
 	vccio4-supply = <&vcc_1v8>;
 	vccio5-supply = <&vcc_3v3>;
 	vccio6-supply = <&vcc_1v8>;
@@ -412,7 +412,7 @@
 	cap-mmc-highspeed;
 	cap-sd-highspeed;
 	disable-wp;
-	sd-uhs-sdr104;
+	//sd-uhs-sdr104;
 	vmmc-supply = <&vcc3v3_sd>;
 	vqmmc-supply = <&vccio_sd>;
 	pinctrl-names = "default";

commit e6f173f86b49268b0f631b6c7e9a59a310838abc
Author: Huang zhibao <hzb@rock-chips.com>
Date:   Mon May 17 16:07:02 2021 +0800

    arm64: dts: rockchip: rk3566-box: disable ddr auto-freq-en
    
    Signed-off-by: Huang zhibao <hzb@rock-chips.com>
    Change-Id: I9fdd665184c4ee60cd4dc4c7e5857f496f1970f2

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi
index 5643939d6eb6..f652d9fb3049 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi
@@ -177,6 +177,7 @@
 };
 
 &dmc {
+	auto-freq-en = <0>;
 	center-supply = <&vdd_fixed>;
 	status = "okay";
 };

commit d43b47a114c8504fc057bfd088831023112b4fa2
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Thu May 20 08:52:35 2021 +0800

    PCI: rockchip: dw: Reset device before enabling power
    
    To more precisely follow the spec, we should make sure
    refclk is available and stable for device only after
    stable training. In previous way, if the refclk is provided
    by external chip, enabling power means refclk is ready before
    anything, and then we reset the device to hope the chip back
    to the initial state. But we find some devices are not really
    meant to do that, that being said, the spec is vague here so
    we can't make any promise from the vendor that #PERST will take
    everything back.
    
    Move resetting device before enabling power to restrictly follow
    the spec, no matter whether #PERST is work or not, we just rely
    on the power control.
    
    Fixes: c84a4aa411b2 ("PCI: rockchip: dw: Move deassert #PERST after enabling LTSSM")
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: Ie1f4aa1a3fb7b6de813512bf4b2c025328e0c17f

diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
index 901281fa122c..fdc3597ed6d5 100644
--- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
+++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
@@ -443,9 +443,6 @@ static int rk_pcie_establish_link(struct dw_pcie *pci)
 		return 0;
 	}
 
-	/* Rest the device */
-	gpiod_set_value_cansleep(rk_pcie->rst_gpio, 0);
-
 	rk_pcie_disable_ltssm(rk_pcie);
 	rk_pcie_link_status_clear(rk_pcie);
 	rk_pcie_enable_debug(rk_pcie);
@@ -1286,6 +1283,16 @@ static int rk_pcie_really_probe(void *p)
 		dev_info(dev, "no vpcie3v3 regulator found\n");
 	}
 
+	/*
+	 * Rest the device before enabling power because some of the
+	 * platforms may use external refclk input with the some power
+	 * rail connect to 100MHz OSC chip. So once the power is up for
+	 * the slot and the refclk is available, which isn't quite follow
+	 * the spec. We should make sure it is in reset state before
+	 * everthing's ready.
+	 */
+	gpiod_set_value_cansleep(rk_pcie->rst_gpio, 0);
+
 	ret = rk_pcie_enable_power(rk_pcie);
 	if (ret)
 		return ret;

commit 9f7ed9a3df038303a880c31b133dc3097579b96a
Author: Yiqing Zeng <zack.zeng@rock-chips.com>
Date:   Tue May 18 19:12:04 2021 +0800

    media: i2c: support sc035hgs sensor driver
    
    Signed-off-by: Yiqing Zeng <zack.zeng@rock-chips.com>
    Change-Id: Ic614e98bed0cf8610166666ae820f3fc2e51af26

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index 0541c2100ca8..34e550943edf 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -1678,6 +1678,17 @@ config VIDEO_SC031GS
 	  To compile this driver as a module, choose M here: the
 	  module will be called sc031gs.
 
+config VIDEO_SC035HGS
+	tristate "SmartSens SC035HGS sensor support"
+	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
+	depends on MEDIA_CAMERA_SUPPORT
+	select V4L2_FWNODE
+	help
+	  Support for the SmartSens SC035HGS sensor.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called sc035hgs.
+
 config VIDEO_SC132GS
 	tristate "SmartSens SC132GS sensor support"
 	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index f4d068bce4f3..1b83f21eb16f 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -182,6 +182,7 @@ obj-$(CONFIG_VIDEO_JX_H62)	+= jx_h62.o
 obj-$(CONFIG_VIDEO_JX_H65)	+= jx_h65.o
 obj-$(CONFIG_VIDEO_JX_K04)	+= jx_k04.o
 obj-$(CONFIG_VIDEO_SC031GS)	+= sc031gs.o
+obj-$(CONFIG_VIDEO_SC035HGS)	+= sc035hgs.o
 obj-$(CONFIG_VIDEO_SC132GS)	+= sc132gs.o
 obj-$(CONFIG_VIDEO_SC200AI)	+= sc200ai.o
 obj-$(CONFIG_VIDEO_SC210IOT)	+= sc210iot.o
diff --git a/drivers/media/i2c/sc035hgs.c b/drivers/media/i2c/sc035hgs.c
new file mode 100644
index 000000000000..8fd3f911eb3a
--- /dev/null
+++ b/drivers/media/i2c/sc035hgs.c
@@ -0,0 +1,1383 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * sc035hgs driver
+ *
+ * Copyright (C) 2021 Fuzhou Rockchip Electronics Co., Ltd.
+ *
+ * V0.0X01.0X00 first version.
+ */
+
+//#define DEBUG
+#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/rk-camera-module.h>
+#include <linux/slab.h>
+#include <linux/version.h>
+#include <media/media-entity.h>
+#include <media/v4l2-async.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-subdev.h>
+
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x00)
+
+#ifndef V4L2_CID_DIGITAL_GAIN
+#define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
+#endif
+
+#define CHIP_ID						0x00310b
+#define SC035HGS_REG_CHIP_ID		0x3107
+
+#define SC035HGS_LANES			1
+#define SC035HGS_BITS_PER_SAMPLE		10
+#define SC035HGS_LINK_FREQ_425MHZ	425000000 //850Mbps
+#define SC035HGS_PIXEL_RATE		(SC035HGS_LINK_FREQ_425MHZ * 2 * \
+					SC035HGS_LANES / SC035HGS_BITS_PER_SAMPLE)
+#define SC035HGS_XVCLK_FREQ		24000000
+
+#define SC035HGS_REG_CTRL_MODE		0x0100
+#define SC035HGS_MODE_SW_STANDBY		0x0
+#define SC035HGS_MODE_STREAMING		BIT(0)
+
+#define SC035HGS_REG_EXPOSURE		0x3e01
+#define	SC035HGS_EXPOSURE_MIN		6
+#define	SC035HGS_EXPOSURE_STEP		1
+#define SC035HGS_REG_VTS			0x320e
+#define SC035HGS_VTS_MAX			0xffff
+
+#define SC035HGS_REG_COARSE_DGAIN	0x3e06
+#define SC035HGS_REG_FINE_DGAIN		0x3e07
+#define SC035HGS_REG_COARSE_AGAIN	0x3e08
+#define SC035HGS_REG_FINE_AGAIN		0x3e09
+#define	ANALOG_GAIN_MIN			0x10
+#define	ANALOG_GAIN_MAX			0x7c0
+#define	ANALOG_GAIN_STEP		1
+#define	ANALOG_GAIN_DEFAULT		0x10
+
+#define SC035HGS_REG_TEST_PATTERN		0x4501
+#define	SC035HGS_TEST_PATTERN_ENABLE	0xcc
+#define	SC035HGS_TEST_PATTERN_DISABLE	0xc4
+
+#define SC035HGS_REG_FLIP_MIRROR	0x3221
+#define SC035HGS_MIRROR_MASK		0x06
+#define SC035HGS_FLIP_MASK			0x60
+
+#define SC035HGS_GROUP_HOLD			0x3812
+#define SC035HGS_GROUP_HOLD_START	0X00
+#define SC035HGS_GROUP_HOLD_LUNCH	0x30
+#define REG_NULL			0xFFFF
+
+#define SC035HGS_REG_VALUE_08BIT		1
+#define SC035HGS_REG_VALUE_16BIT		2
+#define SC035HGS_REG_VALUE_24BIT		3
+
+#define SC035HGS_NAME			"sc035hgs"
+
+static const char * const sc035hgs_supply_names[] = {
+	"avdd",		/* Analog power */
+	"dovdd",	/* Digital I/O power */
+	"dvdd",		/* Digital core power */
+};
+
+#define SC035HGS_NUM_SUPPLIES ARRAY_SIZE(sc035hgs_supply_names)
+
+struct regval {
+	u16 addr;
+	u8 val;
+};
+
+enum sc2335_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 sc035hgs_mode {
+	u32 bus_fmt;
+	u32 width;
+	u32 height;
+	struct v4l2_fract max_fps;
+	u32 hts_def;
+	u32 vts_def;
+	u32 exp_def;
+	const struct regval *reg_list;
+	u32 hdr_mode;
+	u32 vc[PAD_MAX];
+};
+
+struct sc035hgs {
+	struct i2c_client	*client;
+	struct clk		*xvclk;
+	struct gpio_desc	*reset_gpio;
+	struct gpio_desc	*pwdn_gpio;
+	struct regulator_bulk_data supplies[SC035HGS_NUM_SUPPLIES];
+	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	*test_pattern;
+	struct mutex		mutex;
+	bool			streaming;
+	bool			power_on;
+	const struct sc035hgs_mode *cur_mode;
+	u32			module_index;
+	const char		*module_facing;
+	const char		*module_name;
+	const char		*len_name;
+};
+
+#define to_sc035hgs(sd) container_of(sd, struct sc035hgs, subdev)
+
+static const struct regval image_optimize_gain_1x_2x_regs[] = {
+	{0x3314, 0x1e},
+	{0x3317, 0x1b},
+	{0x3631, 0x58},
+	{0x3329, 0x3c},
+	{0x332d, 0x3c},
+	{0x332f, 0x40},
+	{0x3335, 0x44},
+	{0x3344, 0x44},
+	{0x3316, 0x48},
+	{0x3630, 0x4a},
+	{REG_NULL, 0x00}
+};
+
+static const struct regval image_optimize_gain_2x_4x_regs[] = {
+	{0x3314, 0x6f},
+	{0x3317, 0x10},
+	{0x3631, 0x48},
+	{0x3329, 0x5c},
+	{0x332d, 0x5c},
+	{0x332f, 0x60},
+	{0x3335, 0x64},
+	{0x3344, 0x64},
+	{0x3316, 0x68},
+	{0x3630, 0x4c},
+	{REG_NULL, 0x00}
+};
+
+static const struct regval image_optimize_regs[] = {
+	{0x3314, 0x76},
+	{0x3317, 0x15},
+	{0x3631, 0x48},
+	{0x3329, 0x5c},
+	{0x332d, 0x5c},
+	{0x332f, 0x60},
+	{0x3335, 0x64},
+	{0x3344, 0x64},
+	{0x3316, 0x68},
+	{0x3630, 0x4c},
+	{REG_NULL, 0x00}
+};
+
+
+/*
+ * Xclk 24Mhz
+ * Pclk 45Mhz
+ * linelength 683(0x2ab)
+ * framelength 878(0x36e)
+ * grabwindow_width 640
+ * grabwindow_height 480
+ * max_framerate 120fps
+ * mipi_datarate per lane 850Mbps
+ */
+static const struct regval sc035hgs_640x480_120fps_1lane_regs[] = {
+	{0x0103, 0x01},
+	{0x0100, 0x00},
+	{0x36e9, 0x80},
+	{0x36f9, 0x80},
+	{0x3000, 0x00},
+	{0x3001, 0x00},
+	{0x300f, 0x0f},
+	{0x3018, 0x13},
+	{0x3019, 0xfc},
+	{0x301c, 0x78},
+	{0x301f, 0x8b},
+	{0x3031, 0x0a},
+	{0x3037, 0x20},
+	{0x303f, 0x01},
+	{0x320c, 0x05},
+	{0x320d, 0x54},
+	{0x320e, 0x02},
+	{0x320f, 0x10},
+	{0x3217, 0x00},
+	{0x3218, 0x00},
+	{0x3220, 0x10},
+	{0x3223, 0x48},
+	{0x3226, 0x74},
+	{0x3227, 0x07},
+	{0x323b, 0x00},
+	{0x3250, 0xf0},
+	{0x3251, 0x02},
+	{0x3252, 0x02},
+	{0x3253, 0x08},
+	{0x3254, 0x02},
+	{0x3255, 0x07},
+	{0x3304, 0x48},
+	{0x3305, 0x00},
+	{0x3306, 0x98},
+	{0x3309, 0x50},
+	{0x330a, 0x01},
+	{0x330b, 0x18},
+	{0x330c, 0x18},
+	{0x330f, 0x40},
+	{0x3310, 0x10},
+	{0x3314, 0x1e},
+	{0x3315, 0x30},
+	{0x3316, 0x48},
+	{0x3317, 0x1b},
+	{0x3329, 0x3c},
+	{0x332d, 0x3c},
+	{0x332f, 0x40},
+	{0x3335, 0x44},
+	{0x3344, 0x44},
+	{0x335b, 0x80},
+	{0x335f, 0x80},
+	{0x3366, 0x06},
+	{0x3385, 0x31},
+	{0x3387, 0x39},
+	{0x3389, 0x01},
+	{0x33b1, 0x03},
+	{0x33b2, 0x06},
+	{0x33bd, 0xe0},
+	{0x33bf, 0x10},
+	{0x3621, 0xa4},
+	{0x3622, 0x05},
+	{0x3624, 0x47},
+	{0x3630, 0x4a},
+	{0x3631, 0x68},
+	{0x3633, 0x52},
+	{0x3635, 0x03},
+	{0x3636, 0x25},
+	{0x3637, 0x8a},
+	{0x3638, 0x0f},
+	{0x3639, 0x08},
+	{0x363a, 0x00},
+	{0x363b, 0x48},
+	{0x363c, 0x86},
+	{0x363e, 0xf8},
+	{0x3640, 0x00},
+	{0x3641, 0x01},
+	{0x36ea, 0x2f},
+	{0x36eb, 0x0e},
+	{0x36ec, 0x0e},
+	{0x36ed, 0x20},
+	{0x36fa, 0x2f},
+	{0x36fb, 0x10},
+	{0x36fc, 0x02},
+	{0x36fd, 0x00},
+	{0x3908, 0x91},
+	{0x391b, 0x81},
+	{0x3d08, 0x01},
+	{0x3e01, 0x18},
+	{0x3e02, 0xf0},
+	{0x3e03, 0x2b},
+	{0x3e06, 0x0c},
+	{0x3f04, 0x03},
+	{0x3f05, 0x80},
+	{0x4500, 0x59},
+	{0x4501, 0xc4},
+	{0x4603, 0x00},
+	{0x4800, 0x64},
+	{0x4809, 0x01},
+	{0x4810, 0x00},
+	{0x4811, 0x01},
+	{0x4837, 0x18},
+	{0x5011, 0x00},
+	{0x5988, 0x02},
+	{0x598e, 0x05},
+	{0x598f, 0x17},
+	{0x36e9, 0x62},
+	{0x36f9, 0x62},
+	{0x0100, 0x01},
+	{0x4418, 0x08},
+	{0x363d, 0x10},
+	{0x4419, 0x80},
+	{REG_NULL, 0x00}
+};
+
+static const struct sc035hgs_mode supported_modes[] = {
+	{
+		.bus_fmt = MEDIA_BUS_FMT_SBGGR10_1X10,
+		.width = 640,
+		.height = 480,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 1200000,
+		},
+		.exp_def = 0x018f,
+		.hts_def = 0x0554,
+		.vts_def = 0x0210,
+		.reg_list = sc035hgs_640x480_120fps_1lane_regs,
+		.hdr_mode = NO_HDR,
+		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0,
+	},
+};
+
+static const char * const sc035hgs_test_pattern_menu[] = {
+	"Disabled",
+	"Vertical Color Bar Type 1",
+	"Vertical Color Bar Type 2",
+	"Vertical Color Bar Type 3",
+	"Vertical Color Bar Type 4"
+};
+
+static const s64 link_freq_menu_items[] = {
+	SC035HGS_LINK_FREQ_425MHZ
+};
+
+/* Write registers up to 4 at a time */
+static int sc035hgs_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;
+	u32 ret;
+
+	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++];
+
+	ret = i2c_master_send(client, buf, len + 2);
+	if (ret != len + 2)
+		return -EIO;
+
+	return 0;
+}
+
+static int sc035hgs_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 = sc035hgs_write_reg(client, regs[i].addr,
+				       SC035HGS_REG_VALUE_08BIT, regs[i].val);
+		if (regs[i].addr == 0x0100 && regs[i].val == 0x01)
+			usleep_range(10 * 1000, 20 * 1000);
+	}
+
+	return ret;
+}
+
+/* Read registers up to 4 at a time */
+static int sc035hgs_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 *)&reg_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 sc035hgs_get_reso_dist(const struct sc035hgs_mode *mode,
+	struct v4l2_mbus_framefmt *framefmt)
+{
+	return abs(mode->width - framefmt->width) +
+	       abs(mode->height - framefmt->height);
+}
+
+static const struct sc035hgs_mode *
+sc035hgs_find_best_fit(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 < ARRAY_SIZE(supported_modes); i++) {
+		dist = sc035hgs_get_reso_dist(&supported_modes[i], framefmt);
+		if (cur_best_fit_dist == -1 || dist < cur_best_fit_dist) {
+			cur_best_fit_dist = dist;
+			cur_best_fit = i;
+		}
+	}
+
+	return &supported_modes[cur_best_fit];
+}
+
+static int sc035hgs_set_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct sc035hgs *sc035hgs = to_sc035hgs(sd);
+	const struct sc035hgs_mode *mode;
+	s64 h_blank, vblank_def;
+
+	mutex_lock(&sc035hgs->mutex);
+
+	mode = sc035hgs_find_best_fit(fmt);
+	fmt->format.code = mode->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(&sc035hgs->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		sc035hgs->cur_mode = mode;
+		h_blank = mode->hts_def - mode->width;
+		__v4l2_ctrl_modify_range(sc035hgs->hblank, h_blank,
+					 h_blank, 1, h_blank);
+		vblank_def = mode->vts_def - mode->height;
+		__v4l2_ctrl_modify_range(sc035hgs->vblank, vblank_def,
+					 SC035HGS_VTS_MAX - mode->height,
+					 1, vblank_def);
+	}
+
+	mutex_unlock(&sc035hgs->mutex);
+
+	return 0;
+}
+
+static int sc035hgs_get_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct sc035hgs *sc035hgs = to_sc035hgs(sd);
+	const struct sc035hgs_mode *mode = sc035hgs->cur_mode;
+
+	mutex_lock(&sc035hgs->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(&sc035hgs->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		fmt->format.width = mode->width;
+		fmt->format.height = mode->height;
+		fmt->format.code = mode->bus_fmt;
+		fmt->format.field = V4L2_FIELD_NONE;
+	}
+	mutex_unlock(&sc035hgs->mutex);
+
+	return 0;
+}
+
+static int sc035hgs_enum_mbus_code(struct v4l2_subdev *sd,
+				 struct v4l2_subdev_pad_config *cfg,
+				 struct v4l2_subdev_mbus_code_enum *code)
+{
+	struct sc035hgs *sc035hgs = to_sc035hgs(sd);
+
+	if (code->index != 0)
+		return -EINVAL;
+	code->code = sc035hgs->cur_mode->bus_fmt;
+
+	return 0;
+}
+
+static int sc035hgs_enum_frame_sizes(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_pad_config *cfg,
+				   struct v4l2_subdev_frame_size_enum *fse)
+{
+	struct sc035hgs *sc035hgs = to_sc035hgs(sd);
+
+	if (fse->index >= ARRAY_SIZE(supported_modes))
+		return -EINVAL;
+
+	if (fse->code != sc035hgs->cur_mode->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;
+
+	return 0;
+}
+
+static int sc035hgs_enable_test_pattern(struct sc035hgs *sc035hgs, u32 pattern)
+{
+	u32 val;
+
+	if (pattern)
+		val = (pattern - 1) | SC035HGS_TEST_PATTERN_ENABLE;
+	else
+		val = SC035HGS_TEST_PATTERN_DISABLE;
+
+	return sc035hgs_write_reg(sc035hgs->client, SC035HGS_REG_TEST_PATTERN,
+				SC035HGS_REG_VALUE_08BIT, val);
+}
+
+static void sc035hgs_get_module_inf(struct sc035hgs *sc035hgs,
+				  struct rkmodule_inf *inf)
+{
+	memset(inf, 0, sizeof(*inf));
+	strscpy(inf->base.sensor, SC035HGS_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, sc035hgs->module_name,
+		sizeof(inf->base.module));
+	strscpy(inf->base.lens, sc035hgs->len_name, sizeof(inf->base.lens));
+}
+
+static long sc035hgs_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	struct sc035hgs *sc035hgs = to_sc035hgs(sd);
+	struct rkmodule_hdr_cfg *hdr;
+	long ret = 0;
+	u32 stream = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		sc035hgs_get_module_inf(sc035hgs, (struct rkmodule_inf *)arg);
+		break;
+	case RKMODULE_GET_HDR_CFG:
+		hdr = (struct rkmodule_hdr_cfg *)arg;
+		hdr->esp.mode = HDR_NORMAL_VC;
+		hdr->hdr_mode = sc035hgs->cur_mode->hdr_mode;
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		stream = *((u32 *)arg);
+		if (stream)
+			ret = sc035hgs_write_reg(sc035hgs->client, SC035HGS_REG_CTRL_MODE,
+				SC035HGS_REG_VALUE_08BIT, SC035HGS_MODE_STREAMING);
+		else
+			ret = sc035hgs_write_reg(sc035hgs->client, SC035HGS_REG_CTRL_MODE,
+				SC035HGS_REG_VALUE_08BIT, SC035HGS_MODE_SW_STANDBY);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+
+#ifdef CONFIG_COMPAT
+static long sc035hgs_compat_ioctl32(struct v4l2_subdev *sd,
+				  unsigned int cmd, unsigned long arg)
+{
+	void __user *up = compat_ptr(arg);
+	struct rkmodule_inf *inf;
+	struct rkmodule_hdr_cfg *hdr;
+	long ret;
+	u32 stream = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		inf = kzalloc(sizeof(*inf), GFP_KERNEL);
+		if (!inf) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = sc035hgs_ioctl(sd, cmd, inf);
+		if (!ret) {
+			ret = copy_to_user(up, inf, sizeof(*inf));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(inf);
+		break;
+	case RKMODULE_GET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = sc035hgs_ioctl(sd, cmd, hdr);
+		if (!ret) {
+			ret = copy_to_user(up, hdr, sizeof(*hdr));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(hdr);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		if (copy_from_user(&stream, up, sizeof(u32)))
+			return -EFAULT;
+
+		ret = sc035hgs_ioctl(sd, cmd, &stream);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+#endif
+
+static int sc035hgs_set_ctrl_gain(struct sc035hgs *sc035hgs, u32 a_gain)
+{
+	struct device *dev = &sc035hgs->client->dev;
+	u32 coarse_again = 0, fine_again = 0;
+	u32 coarse_dgain = 0, fine_dgain = 0;
+	int ret = 0;
+
+	if (a_gain < 0x20) { /*1x ~ 2x*/
+		fine_again = a_gain;
+		coarse_again = 0x3;
+		fine_dgain = 0x80;
+		coarse_dgain = 0x0c;
+	} else if (a_gain < 0x40) { /*2x ~ 4x*/
+		fine_again = a_gain >> 1;
+		coarse_again = 0x7;
+		fine_dgain = 0x80;
+		coarse_dgain = 0x0c;
+	} else if (a_gain < 0x80) { /*4x ~ 8x*/
+		fine_again = a_gain >> 2;
+		coarse_again = 0xf;
+		fine_dgain = 0x80;
+		coarse_dgain = 0x0c;
+	} else if (a_gain <= 0xf8) { /*8x ~ 15.5x*/
+		fine_again = a_gain >> 3;
+		coarse_again = 0x1f;
+		fine_dgain = 0x80;
+		coarse_dgain = 0x0c;
+	} else if (a_gain < 0x200) { /*15.5x ~ 32x*/
+		fine_again = 0x1f;
+		coarse_again = 0x1f;
+		fine_dgain = a_gain >> 1;
+		coarse_dgain = 0x0c;
+	} else if (a_gain < 0x400) { /*32x ~ 64x*/
+		fine_again = 0x1f;
+		coarse_again = 0x1f;
+		fine_dgain = a_gain >> 2;
+		coarse_dgain = 0x0d;
+	} else if (a_gain <= 0x7C0) { /*64x ~ 124x*/
+		fine_again = 0x1f;
+		coarse_again = 0x1f;
+		fine_dgain = a_gain >> 3;
+		coarse_dgain = 0x0f;
+	}
+
+	dev_dbg(dev, ">>>set fine_again = 0x%x, coarse_again = 0x%x, coarse_dgain=0x%x, fine_dgain=0x%x\n",
+			fine_again, coarse_again, coarse_dgain, fine_dgain);
+
+	if (a_gain < 0x20)
+		ret = sc035hgs_write_array(sc035hgs->client, image_optimize_gain_1x_2x_regs);
+	else if (a_gain < 0x40)
+		ret |= sc035hgs_write_array(sc035hgs->client, image_optimize_gain_2x_4x_regs);
+	else
+		ret |= sc035hgs_write_array(sc035hgs->client, image_optimize_regs);
+
+	ret |= sc035hgs_write_reg(sc035hgs->client,
+		SC035HGS_GROUP_HOLD,
+		SC035HGS_REG_VALUE_08BIT,
+		SC035HGS_GROUP_HOLD_START);
+	ret |= sc035hgs_write_reg(sc035hgs->client,
+		SC035HGS_REG_COARSE_AGAIN,
+		SC035HGS_REG_VALUE_08BIT,
+		coarse_again);
+	ret |= sc035hgs_write_reg(sc035hgs->client,
+		SC035HGS_REG_FINE_AGAIN,
+		SC035HGS_REG_VALUE_08BIT,
+		fine_again);
+	ret |= sc035hgs_write_reg(sc035hgs->client,
+		SC035HGS_REG_COARSE_DGAIN,
+		SC035HGS_REG_VALUE_08BIT,
+		coarse_dgain);
+	ret |= sc035hgs_write_reg(sc035hgs->client,
+		SC035HGS_REG_FINE_DGAIN,
+		SC035HGS_REG_VALUE_08BIT,
+		fine_dgain);
+	ret |= sc035hgs_write_reg(sc035hgs->client,
+		SC035HGS_GROUP_HOLD,
+		SC035HGS_REG_VALUE_08BIT,
+		SC035HGS_GROUP_HOLD_LUNCH);
+
+	return ret;
+}
+
+static int __sc035hgs_start_stream(struct sc035hgs *sc035hgs)
+{
+	int ret;
+
+	ret = sc035hgs_write_array(sc035hgs->client, sc035hgs->cur_mode->reg_list);
+	if (ret)
+		return ret;
+
+	/* In case these controls are set before streaming */
+	mutex_unlock(&sc035hgs->mutex);
+	ret = v4l2_ctrl_handler_setup(&sc035hgs->ctrl_handler);
+	mutex_lock(&sc035hgs->mutex);
+	if (ret)
+		return ret;
+
+	return sc035hgs_write_reg(sc035hgs->client, SC035HGS_REG_CTRL_MODE,
+			SC035HGS_REG_VALUE_08BIT, SC035HGS_MODE_STREAMING);
+}
+
+static int __sc035hgs_stop_stream(struct sc035hgs *sc035hgs)
+{
+	return sc035hgs_write_reg(sc035hgs->client, SC035HGS_REG_CTRL_MODE,
+			SC035HGS_REG_VALUE_08BIT, SC035HGS_MODE_SW_STANDBY);
+}
+
+static int sc035hgs_s_stream(struct v4l2_subdev *sd, int on)
+{
+	struct sc035hgs *sc035hgs = to_sc035hgs(sd);
+	struct i2c_client *client = sc035hgs->client;
+	int ret = 0;
+
+	mutex_lock(&sc035hgs->mutex);
+	on = !!on;
+	if (on == sc035hgs->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 = __sc035hgs_start_stream(sc035hgs);
+		if (ret) {
+			v4l2_err(sd, "start stream failed while write regs\n");
+			pm_runtime_put(&client->dev);
+			goto unlock_and_return;
+		}
+	} else {
+		__sc035hgs_stop_stream(sc035hgs);
+		pm_runtime_put(&client->dev);
+	}
+
+	sc035hgs->streaming = on;
+
+unlock_and_return:
+	mutex_unlock(&sc035hgs->mutex);
+
+	return ret;
+}
+
+static int sc035hgs_g_frame_interval(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_frame_interval *fi)
+{
+	struct sc035hgs *sc035hgs = to_sc035hgs(sd);
+	const struct sc035hgs_mode *mode = sc035hgs->cur_mode;
+
+	mutex_lock(&sc035hgs->mutex);
+	fi->interval = mode->max_fps;
+	mutex_unlock(&sc035hgs->mutex);
+
+	return 0;
+}
+
+static int sc035hgs_s_power(struct v4l2_subdev *sd, int on)
+{
+	struct sc035hgs *sc035hgs = to_sc035hgs(sd);
+	struct i2c_client *client = sc035hgs->client;
+	int ret = 0;
+
+	mutex_lock(&sc035hgs->mutex);
+
+	/* If the power state is not modified - no work to do. */
+	if (sc035hgs->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;
+		}
+
+		sc035hgs->power_on = true;
+	} else {
+		pm_runtime_put(&client->dev);
+		sc035hgs->power_on = false;
+	}
+
+unlock_and_return:
+	mutex_unlock(&sc035hgs->mutex);
+
+	return ret;
+}
+
+/* Calculate the delay in us by clock rate and clock cycles */
+static inline u32 sc035hgs_cal_delay(u32 cycles)
+{
+	return DIV_ROUND_UP(cycles, SC035HGS_XVCLK_FREQ / 1000 / 1000);
+}
+
+static int __sc035hgs_power_on(struct sc035hgs *sc035hgs)
+{
+	int ret;
+	u32 delay_us;
+	struct device *dev = &sc035hgs->client->dev;
+
+	ret = clk_set_rate(sc035hgs->xvclk, SC035HGS_XVCLK_FREQ);
+	if (ret < 0)
+		dev_warn(dev, "Failed to set xvclk rate (24MHz)\n");
+	if (clk_get_rate(sc035hgs->xvclk) != SC035HGS_XVCLK_FREQ)
+		dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n");
+	ret = clk_prepare_enable(sc035hgs->xvclk);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable xvclk\n");
+		return ret;
+	}
+
+	ret = regulator_bulk_enable(SC035HGS_NUM_SUPPLIES, sc035hgs->supplies);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable regulators\n");
+		goto disable_clk;
+	}
+
+	if (!IS_ERR(sc035hgs->pwdn_gpio))
+		gpiod_set_value_cansleep(sc035hgs->pwdn_gpio, 1);
+
+	/* 8192 cycles prior to first SCCB transaction */
+	delay_us = sc035hgs_cal_delay(8192);
+	usleep_range(delay_us, delay_us * 2);
+
+	return 0;
+
+disable_clk:
+	clk_disable_unprepare(sc035hgs->xvclk);
+
+	return ret;
+}
+
+static void __sc035hgs_power_off(struct sc035hgs *sc035hgs)
+{
+	if (!IS_ERR(sc035hgs->pwdn_gpio))
+		gpiod_set_value_cansleep(sc035hgs->pwdn_gpio, 0);
+	clk_disable_unprepare(sc035hgs->xvclk);
+
+	regulator_bulk_disable(SC035HGS_NUM_SUPPLIES, sc035hgs->supplies);
+}
+
+static int sc035hgs_runtime_resume(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct sc035hgs *sc035hgs = to_sc035hgs(sd);
+
+	return __sc035hgs_power_on(sc035hgs);
+}
+
+static int sc035hgs_runtime_suspend(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct sc035hgs *sc035hgs = to_sc035hgs(sd);
+
+	__sc035hgs_power_off(sc035hgs);
+
+	return 0;
+}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static int sc035hgs_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
+{
+	struct sc035hgs *sc035hgs = to_sc035hgs(sd);
+	struct v4l2_mbus_framefmt *try_fmt =
+				v4l2_subdev_get_try_format(sd, fh->pad, 0);
+	const struct sc035hgs_mode *def_mode = &supported_modes[0];
+
+	mutex_lock(&sc035hgs->mutex);
+	/* Initialize try_fmt */
+	try_fmt->width = def_mode->width;
+	try_fmt->height = def_mode->height;
+	try_fmt->code = sc035hgs->cur_mode->bus_fmt;
+	try_fmt->field = V4L2_FIELD_NONE;
+
+	mutex_unlock(&sc035hgs->mutex);
+	/* No crop or compose */
+
+	return 0;
+}
+#endif
+
+static int sc035hgs_g_mbus_config(struct v4l2_subdev *sd,
+				 struct v4l2_mbus_config *config)
+{
+	u32 val = 0;
+
+	val = 1 << (SC035HGS_LANES - 1) |
+		V4L2_MBUS_CSI2_CHANNEL_0 |
+		V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
+
+	config->type = V4L2_MBUS_CSI2;
+	config->flags = val;
+
+	return 0;
+}
+
+static int sc035hgs_enum_frame_interval(struct v4l2_subdev *sd,
+				      struct v4l2_subdev_pad_config *cfg,
+				      struct v4l2_subdev_frame_interval_enum *fie)
+{
+	if (fie->index >= ARRAY_SIZE(supported_modes))
+		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;
+
+	return 0;
+}
+
+static const struct dev_pm_ops sc035hgs_pm_ops = {
+	SET_RUNTIME_PM_OPS(sc035hgs_runtime_suspend,
+			   sc035hgs_runtime_resume, NULL)
+};
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static const struct v4l2_subdev_internal_ops sc035hgs_internal_ops = {
+	.open = sc035hgs_open,
+};
+#endif
+
+static const struct v4l2_subdev_core_ops sc035hgs_core_ops = {
+	.s_power = sc035hgs_s_power,
+	.ioctl = sc035hgs_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = sc035hgs_compat_ioctl32,
+#endif
+};
+
+static const struct v4l2_subdev_video_ops sc035hgs_video_ops = {
+	.s_stream = sc035hgs_s_stream,
+	.g_frame_interval = sc035hgs_g_frame_interval,
+	.g_mbus_config = sc035hgs_g_mbus_config,
+
+};
+
+static const struct v4l2_subdev_pad_ops sc035hgs_pad_ops = {
+	.enum_mbus_code = sc035hgs_enum_mbus_code,
+	.enum_frame_size = sc035hgs_enum_frame_sizes,
+	.enum_frame_interval = sc035hgs_enum_frame_interval,
+	.get_fmt = sc035hgs_get_fmt,
+	.set_fmt = sc035hgs_set_fmt,
+};
+
+static const struct v4l2_subdev_ops sc035hgs_subdev_ops = {
+	.core	= &sc035hgs_core_ops,
+	.video	= &sc035hgs_video_ops,
+	.pad	= &sc035hgs_pad_ops,
+};
+
+static int sc035hgs_set_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct sc035hgs *sc035hgs = container_of(ctrl->handler,
+					     struct sc035hgs, ctrl_handler);
+	struct i2c_client *client = sc035hgs->client;
+	s64 max;
+	u32 val = 0;
+	u32 vts = 0;
+	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 = sc035hgs->cur_mode->height + ctrl->val - 6;
+		__v4l2_ctrl_modify_range(sc035hgs->exposure,
+					 sc035hgs->exposure->minimum, max,
+					 sc035hgs->exposure->step,
+					 sc035hgs->exposure->default_value);
+		break;
+	}
+
+	if (!pm_runtime_get_if_in_use(&client->dev))
+		return 0;
+
+	switch (ctrl->id) {
+	case V4L2_CID_EXPOSURE:
+		dev_dbg(&client->dev, "set exposure 0x%x\n", ctrl->val);
+		ret = sc035hgs_write_reg(sc035hgs->client, SC035HGS_GROUP_HOLD,
+			SC035HGS_REG_VALUE_08BIT, SC035HGS_GROUP_HOLD_START);
+		ret |= sc035hgs_write_reg(sc035hgs->client, SC035HGS_REG_EXPOSURE,
+			SC035HGS_REG_VALUE_16BIT, ctrl->val << 4);
+		ret |= sc035hgs_write_reg(sc035hgs->client, SC035HGS_GROUP_HOLD,
+			SC035HGS_REG_VALUE_08BIT, SC035HGS_GROUP_HOLD_LUNCH);
+		break;
+	case V4L2_CID_ANALOGUE_GAIN:
+		dev_dbg(&client->dev, "set again 0x%x\n", ctrl->val);
+		ret = sc035hgs_set_ctrl_gain(sc035hgs, ctrl->val);
+		break;
+	case V4L2_CID_VBLANK:
+		vts = ctrl->val + sc035hgs->cur_mode->height;
+		dev_dbg(&client->dev, "set vts 0x%x\n", vts);
+		ret = sc035hgs_write_reg(sc035hgs->client, SC035HGS_REG_VTS,
+			SC035HGS_REG_VALUE_16BIT, vts);
+		break;
+	case V4L2_CID_TEST_PATTERN:
+		ret = sc035hgs_enable_test_pattern(sc035hgs, ctrl->val);
+		break;
+	case V4L2_CID_HFLIP:
+		ret = sc035hgs_read_reg(sc035hgs->client, SC035HGS_REG_FLIP_MIRROR,
+			SC035HGS_REG_VALUE_08BIT, &val);
+		if (ret)
+			break;
+		if (ctrl->val)
+			val |= SC035HGS_MIRROR_MASK;
+		else
+			val &= ~SC035HGS_MIRROR_MASK;
+		ret |= sc035hgs_write_reg(sc035hgs->client, SC035HGS_REG_FLIP_MIRROR,
+			SC035HGS_REG_VALUE_08BIT, val);
+		break;
+	case V4L2_CID_VFLIP:
+		ret = sc035hgs_read_reg(sc035hgs->client, SC035HGS_REG_FLIP_MIRROR,
+			SC035HGS_REG_VALUE_08BIT, &val);
+		if (ret)
+			break;
+		if (ctrl->val)
+			val |= SC035HGS_FLIP_MASK;
+		else
+			val &= ~SC035HGS_FLIP_MASK;
+		ret |= sc035hgs_write_reg(sc035hgs->client, SC035HGS_REG_FLIP_MIRROR,
+			SC035HGS_REG_VALUE_08BIT, 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 sc035hgs_ctrl_ops = {
+	.s_ctrl = sc035hgs_set_ctrl,
+};
+
+static int sc035hgs_initialize_controls(struct sc035hgs *sc035hgs)
+{
+	const struct sc035hgs_mode *mode;
+	struct v4l2_ctrl_handler *handler;
+	struct v4l2_ctrl *ctrl;
+	s64 exposure_max, vblank_def;
+	u32 h_blank;
+	int ret;
+
+	handler = &sc035hgs->ctrl_handler;
+	mode = sc035hgs->cur_mode;
+	ret = v4l2_ctrl_handler_init(handler, 8);
+	if (ret)
+		return ret;
+	handler->lock = &sc035hgs->mutex;
+
+	ctrl = v4l2_ctrl_new_int_menu(handler, NULL, V4L2_CID_LINK_FREQ,
+				      0, 0, link_freq_menu_items);
+	if (ctrl)
+		ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+
+	v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE,
+			  0, SC035HGS_PIXEL_RATE, 1, SC035HGS_PIXEL_RATE);
+
+	h_blank = mode->hts_def - mode->width;
+	sc035hgs->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
+				h_blank, h_blank, 1, h_blank);
+	if (sc035hgs->hblank)
+		sc035hgs->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+
+	vblank_def = mode->vts_def - mode->height;
+	sc035hgs->vblank = v4l2_ctrl_new_std(handler, &sc035hgs_ctrl_ops,
+				V4L2_CID_VBLANK, vblank_def,
+				SC035HGS_VTS_MAX - mode->height,
+				1, vblank_def);
+
+	exposure_max = mode->vts_def - 6;
+	sc035hgs->exposure = v4l2_ctrl_new_std(handler, &sc035hgs_ctrl_ops,
+				V4L2_CID_EXPOSURE, SC035HGS_EXPOSURE_MIN,
+				exposure_max, SC035HGS_EXPOSURE_STEP,
+				mode->exp_def);
+
+	sc035hgs->anal_gain = v4l2_ctrl_new_std(handler, &sc035hgs_ctrl_ops,
+				V4L2_CID_ANALOGUE_GAIN, ANALOG_GAIN_MIN,
+				ANALOG_GAIN_MAX, ANALOG_GAIN_STEP,
+				ANALOG_GAIN_DEFAULT);
+
+	sc035hgs->test_pattern = v4l2_ctrl_new_std_menu_items(handler,
+				&sc035hgs_ctrl_ops, V4L2_CID_TEST_PATTERN,
+				ARRAY_SIZE(sc035hgs_test_pattern_menu) - 1,
+				0, 0, sc035hgs_test_pattern_menu);
+
+	v4l2_ctrl_new_std(handler, &sc035hgs_ctrl_ops,
+					   V4L2_CID_HFLIP, 0, 1, 1, 0);
+
+	v4l2_ctrl_new_std(handler, &sc035hgs_ctrl_ops,
+					   V4L2_CID_VFLIP, 0, 1, 1, 0);
+
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(&sc035hgs->client->dev,
+			"Failed to init controls(%d)\n", ret);
+		goto err_free_handler;
+	}
+
+	sc035hgs->subdev.ctrl_handler = handler;
+
+	return 0;
+
+err_free_handler:
+	v4l2_ctrl_handler_free(handler);
+
+	return ret;
+}
+
+static int sc035hgs_check_sensor_id(struct sc035hgs *sc035hgs,
+				  struct i2c_client *client)
+{
+	struct device *dev = &sc035hgs->client->dev;
+	u32 id = 0;
+	int ret;
+
+	ret = sc035hgs_read_reg(client, SC035HGS_REG_CHIP_ID,
+			      SC035HGS_REG_VALUE_24BIT, &id);
+	if (id != CHIP_ID) {
+		dev_err(dev, "Unexpected sensor id(%04x), ret(%d)\n", id, ret);
+		return -ENODEV;
+	}
+
+	dev_info(dev, "Detected SC035HGS CHIP ID = 0x%04x sensor\n", CHIP_ID);
+
+	return 0;
+}
+
+static int sc035hgs_configure_regulators(struct sc035hgs *sc035hgs)
+{
+	unsigned int i;
+
+	for (i = 0; i < SC035HGS_NUM_SUPPLIES; i++)
+		sc035hgs->supplies[i].supply = sc035hgs_supply_names[i];
+
+	return devm_regulator_bulk_get(&sc035hgs->client->dev,
+				       SC035HGS_NUM_SUPPLIES,
+				       sc035hgs->supplies);
+}
+
+static int sc035hgs_probe(struct i2c_client *client,
+			const struct i2c_device_id *id)
+{
+	struct device *dev = &client->dev;
+	struct device_node *node = dev->of_node;
+	struct sc035hgs *sc035hgs;
+	struct v4l2_subdev *sd;
+	char facing[2];
+	int ret;
+
+	dev_info(dev, "driver version: %02x.%02x.%02x",
+		DRIVER_VERSION >> 16,
+		(DRIVER_VERSION & 0xff00) >> 8,
+		DRIVER_VERSION & 0x00ff);
+
+	sc035hgs = devm_kzalloc(dev, sizeof(*sc035hgs), GFP_KERNEL);
+	if (!sc035hgs)
+		return -ENOMEM;
+
+	ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
+				   &sc035hgs->module_index);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
+				       &sc035hgs->module_facing);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME,
+				       &sc035hgs->module_name);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME,
+				       &sc035hgs->len_name);
+	if (ret) {
+		dev_err(dev, "could not get module information!\n");
+		return -EINVAL;
+	}
+
+	sc035hgs->client = client;
+	sc035hgs->cur_mode = &supported_modes[0];
+
+	sc035hgs->xvclk = devm_clk_get(dev, "xvclk");
+	if (IS_ERR(sc035hgs->xvclk)) {
+		dev_err(dev, "Failed to get xvclk\n");
+		return -EINVAL;
+	}
+
+	sc035hgs->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+	if (IS_ERR(sc035hgs->reset_gpio))
+		dev_warn(dev, "Failed to get reset-gpios\n");
+
+	sc035hgs->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW);
+	if (IS_ERR(sc035hgs->pwdn_gpio))
+		dev_warn(dev, "Failed to get pwdn-gpios\n");
+	ret = sc035hgs_configure_regulators(sc035hgs);
+	if (ret) {
+		dev_err(dev, "Failed to get power regulators\n");
+		return ret;
+	}
+
+	mutex_init(&sc035hgs->mutex);
+
+	sd = &sc035hgs->subdev;
+	v4l2_i2c_subdev_init(sd, client, &sc035hgs_subdev_ops);
+	ret = sc035hgs_initialize_controls(sc035hgs);
+	if (ret)
+		goto err_destroy_mutex;
+
+	ret = __sc035hgs_power_on(sc035hgs);
+	if (ret)
+		goto err_free_handler;
+
+	ret = sc035hgs_check_sensor_id(sc035hgs, client);
+	if (ret)
+		goto err_power_off;
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+	sd->internal_ops = &sc035hgs_internal_ops;
+	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
+		     V4L2_SUBDEV_FL_HAS_EVENTS;
+#endif
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	sc035hgs->pad.flags = MEDIA_PAD_FL_SOURCE;
+	sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
+	ret = media_entity_pads_init(&sd->entity, 1, &sc035hgs->pad);
+	if (ret < 0)
+		goto err_power_off;
+#endif
+
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(sc035hgs->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s",
+		 sc035hgs->module_index, facing,
+		 SC035HGS_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:
+	__sc035hgs_power_off(sc035hgs);
+err_free_handler:
+	v4l2_ctrl_handler_free(&sc035hgs->ctrl_handler);
+err_destroy_mutex:
+	mutex_destroy(&sc035hgs->mutex);
+
+	return ret;
+}
+
+static int sc035hgs_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct sc035hgs *sc035hgs = to_sc035hgs(sd);
+
+	v4l2_async_unregister_subdev(sd);
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	media_entity_cleanup(&sd->entity);
+#endif
+	v4l2_ctrl_handler_free(&sc035hgs->ctrl_handler);
+	mutex_destroy(&sc035hgs->mutex);
+
+	pm_runtime_disable(&client->dev);
+	if (!pm_runtime_status_suspended(&client->dev))
+		__sc035hgs_power_off(sc035hgs);
+	pm_runtime_set_suspended(&client->dev);
+
+	return 0;
+}
+
+#if IS_ENABLED(CONFIG_OF)
+static const struct of_device_id sc035hgs_of_match[] = {
+	{ .compatible = "smartsens,sc035hgs" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, sc035hgs_of_match);
+#endif
+
+static const struct i2c_device_id sc035hgs_match_id[] = {
+	{ "smartsens,sc035hgs", 0 },
+	{ },
+};
+
+static struct i2c_driver sc035hgs_i2c_driver = {
+	.driver = {
+		.name = SC035HGS_NAME,
+		.pm = &sc035hgs_pm_ops,
+		.of_match_table = of_match_ptr(sc035hgs_of_match),
+	},
+	.probe		= &sc035hgs_probe,
+	.remove		= &sc035hgs_remove,
+	.id_table	= sc035hgs_match_id,
+};
+
+static int __init sensor_mod_init(void)
+{
+	return i2c_add_driver(&sc035hgs_i2c_driver);
+}
+
+static void __exit sensor_mod_exit(void)
+{
+	i2c_del_driver(&sc035hgs_i2c_driver);
+}
+
+device_initcall_sync(sensor_mod_init);
+module_exit(sensor_mod_exit);
+
+MODULE_DESCRIPTION("Smartsens sc035hgs sensor driver");
+MODULE_AUTHOR("zack.zeng");
+MODULE_LICENSE("GPL v2");

commit 375fb5e3a0dab3ff4b0e2d5e74bcacebbb4171ac
Author: Yiqing Zeng <zack.zeng@rock-chips.com>
Date:   Sat May 15 18:48:53 2021 +0800

    media: i2c: support sc8220 sensor driver
    
    Signed-off-by: Yiqing Zeng <zack.zeng@rock-chips.com>
    Change-Id: I14135e074bc35fa6d9438997d3750b5271777099

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index d3c50d7a37ed..0541c2100ca8 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -1799,6 +1799,17 @@ config VIDEO_SC500AI
 	  To compile this driver as a module, choose M here: the
 	  module will be called SC500AI.
 
+config VIDEO_SC8220
+	tristate "SmartSens SC8220 sensor support"
+	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
+	depends on MEDIA_CAMERA_SUPPORT
+	select V4L2_FWNODE
+	help
+	  Support for the SmartSens SC8220 sensor.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called SC8220.
+
 config VIDEO_SP250A
 	tristate "Superpix SP250A sensor support"
 	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index 67dd95e49f09..f4d068bce4f3 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -193,6 +193,7 @@ obj-$(CONFIG_VIDEO_SC401AI)	+= sc401ai.o
 obj-$(CONFIG_VIDEO_SC4238)	+= sc4238.o
 obj-$(CONFIG_VIDEO_SC430CS)	+= sc430cs.o
 obj-$(CONFIG_VIDEO_SC500AI)	+= sc500ai.o
+obj-$(CONFIG_VIDEO_SC8220)	+= sc8220.o
 obj-$(CONFIG_VIDEO_SP250A)	+= sp250a.o
 obj-$(CONFIG_VIDEO_HYNIX_HI556)	+= hynix_hi556.o
 obj-$(CONFIG_VIDEO_HYNIX_HI846)	+= hynix_hi846.o
diff --git a/drivers/media/i2c/sc8220.c b/drivers/media/i2c/sc8220.c
new file mode 100644
index 000000000000..a12ae7f75bc0
--- /dev/null
+++ b/drivers/media/i2c/sc8220.c
@@ -0,0 +1,1188 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * sc8220 sensor driver
+ *
+ * Copyright (C) 2020 Rockchip Electronics Co., Ltd.
+ *
+ * V0.0X01.0X00 first version.
+ */
+
+//#define DEBUG
+#include <linux/clk.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/of_graph.h>
+#include <linux/regmap.h>
+#include <linux/pinctrl/consumer.h>
+#include <linux/regulator/consumer.h>
+#include <linux/version.h>
+#include <linux/rk-camera-module.h>
+#include <linux/rk-preisp.h>
+#include <media/v4l2-async.h>
+#include <media/media-entity.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-fwnode.h>
+#include <media/v4l2-subdev.h>
+
+#define DRIVER_VERSION		KERNEL_VERSION(0, 0x01, 0x00)
+
+#define OF_CAMERA_PINCTRL_STATE_DEFAULT	"rockchip,camera_default"
+#define OF_CAMERA_PINCTRL_STATE_SLEEP	"rockchip,camera_sleep"
+
+#define SC8220_NAME				"sc8220"
+#define BITS_PER_SAMPLE			10
+#define SC8220_MEDIA_BUS_FMT	MEDIA_BUS_FMT_SBGGR10_1X10
+#define SC8220_LINK_FREQ_371M		371250000	// 742.5Mbps
+
+#define SC8220_PIXEL_RATE		(SC8220_LINK_FREQ_371M / BITS_PER_SAMPLE * \
+					2 * SC8220_LANES)
+
+#define SC8220_XVCLK_FREQ		27000000
+
+#define SC8220_REG_CHIP_ID_H	0x3107
+#define SC8220_REG_CHIP_ID_L	0x3108
+#define SC8220_CHIP_ID			0xb10a
+
+#define SC8220_REG_EXP_LONG_H	0x3e00
+#define SC8220_REG_EXP_LONG_M	0x3e01
+#define SC8220_REG_EXP_LONG_L	0x3e02
+
+#define SC8220_REG_AGAIN_H		0x3e08
+#define SC8220_REG_AGAIN_L		0x3e09
+#define SC8220_REG_DGAIN_H		0x3e06
+#define SC8220_REG_DGAIN_L		0x3e07
+
+#define SC8220_REG_MIRROR_FLIP	0x3221
+#define SC8220_MIRROR_MASK		0x06
+#define SC8220_FLIP_MASK		0x60
+
+#define SC8220_REG_CTRL_MODE	0x0100
+#define SC8220_MODE_SW_STANDBY	0x0
+#define SC8220_MODE_STREAMING	BIT(0)
+
+#define SC8220_REG_VTS_H	0x320e
+#define SC8220_REG_VTS_L	0x320f
+
+#define SC8220_VTS_MAX		0x3FFF
+#define SC8220_HTS_MAX		0xFFF
+
+#define SC8220_EXPOSURE_NORMAL_MIN  2
+#define SC8220_EXPOSURE_NORMAL_STEP 1
+
+#define SC8220_GROUP_HOLD		0x3812
+#define SC8220_GROUP_HOLD_START	0x00
+#define SC8220_GROUP_HOLD_LUNCH	0x30
+
+#define SC8220_GAIN_MIN		0x40
+#define SC8220_GAIN_MAX		0x8000
+#define SC8220_GAIN_STEP	1
+#define SC8220_GAIN_DEFAULT	0x40
+
+#define SC8220_LANES		4
+
+static const char * const sc8220_supply_names[] = {
+	"dovdd",    /* Digital I/O power */
+	"avdd",     /* Analog power */
+	"dvdd",     /* Digital power */
+};
+
+#define SC8220_NUM_SUPPLIES ARRAY_SIZE(sc8220_supply_names)
+
+#define to_sc8220(sd) container_of(sd, struct sc8220, subdev)
+
+enum {
+	PAD0,
+	PAD1,
+	PAD2,
+	PAD3,
+	PAD_MAX,
+};
+
+enum {
+	LINK_FREQ_INDEX,
+};
+
+struct sc8220_mode {
+	u32 width;
+	u32 height;
+	struct v4l2_fract max_fps;
+	u32 hts_def;
+	u32 vts_def;
+	u32 exp_def;
+	u32 link_freq_index;
+	const struct reg_sequence *reg_list;
+	u32 reg_num;
+	u32 hdr_mode;
+	u32 vc[PAD_MAX];
+};
+
+struct sc8220 {
+	struct device	*dev;
+	struct clk	*xvclk;
+	struct regmap	*regmap;
+	struct gpio_desc *reset_gpio;
+	struct gpio_desc *pwdn_gpio;
+	struct regulator_bulk_data supplies[SC8220_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    *hblank;
+	struct v4l2_ctrl    *vblank;
+	struct v4l2_ctrl    *h_flip;
+	struct v4l2_ctrl    *v_flip;
+	struct v4l2_ctrl    *link_freq;
+	struct v4l2_ctrl    *pixel_rate;
+	struct mutex        lock;
+	bool		    streaming;
+	bool		    power_on;
+	unsigned int        cfg_num;
+	const struct sc8220_mode *cur_mode;
+	u32		module_index;
+	const char      *module_facing;
+	const char      *module_name;
+	const char      *len_name;
+	bool			  has_init_exp;
+};
+
+static const struct regmap_config sc8220_regmap_config = {
+	.reg_bits = 16,
+	.val_bits = 8,
+	.max_register = 0x6f00,
+};
+
+static const s64 link_freq_menu_items[] = {
+	SC8220_LINK_FREQ_371M,
+};
+
+/*
+ * window size=3840*2160 mipi@4lane
+ * mclk=27M mipi_clk=708.75Mbps
+ * pixel_line_total=xxxx line_frame_total=2256
+ * row_time=29.62us frame_rate=30fps
+ */
+static const struct reg_sequence sc8220_3840_2160_liner_30fps_settings[] = {
+	{0x0103, 0x01},
+	{0x0100, 0x00},
+	{0x36e9, 0x80},
+	{0x36f9, 0x80},
+	{0x301f, 0x06},
+	{0x3253, 0x08},
+	{0x3302, 0x0a},
+	{0x3303, 0x04},
+	{0x3304, 0x30},
+	{0x3306, 0x34},
+	{0x3308, 0x0c},
+	{0x3309, 0x50},
+	{0x330b, 0x90},
+	{0x330d, 0x20},
+	{0x330e, 0x24},
+	{0x330f, 0x04},
+	{0x3310, 0x01},
+	{0x3314, 0x12},
+	{0x331e, 0x29},
+	{0x331f, 0x49},
+	{0x3340, 0x04},
+	{0x3352, 0x03},
+	{0x3353, 0x03},
+	{0x3356, 0x08},
+	{0x335e, 0x01},
+	{0x335f, 0x03},
+	{0x3367, 0x06},
+	{0x3368, 0x06},
+	{0x3369, 0xc0},
+	{0x336a, 0x00},
+	{0x336b, 0x08},
+	{0x336d, 0x03},
+	{0x337c, 0x04},
+	{0x337d, 0x08},
+	{0x33a2, 0x06},
+	{0x33ac, 0x04},
+	{0x33ae, 0x0a},
+	{0x33af, 0x10},
+	{0x3625, 0x0a},
+	{0x3632, 0x88},
+	{0x3637, 0x24},
+	{0x3638, 0x08},
+	{0x36ea, 0x35},
+	{0x36eb, 0x0d},
+	{0x36ec, 0x0b},
+	{0x36ed, 0x24},
+	{0x36fa, 0x35},
+	{0x36fb, 0x25},
+	{0x36fc, 0x10},
+	{0x36fd, 0x34},
+	{0x3907, 0x01},
+	{0x3908, 0x11},
+	{0x3e01, 0x8c},
+	{0x3e02, 0x60},
+	{0x4800, 0x24},
+	{0x4837, 0x2b},
+	{0x4853, 0xff},
+	{0x5000, 0x06},
+	{0x550f, 0x9c},
+	{0x36e9, 0x20},
+	{0x36f9, 0x50},
+};
+
+static const struct sc8220_mode supported_modes[] = {
+	{
+		.width = 3840,
+		.height = 2160,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x8c6,
+		.hts_def = 0x41a * SC8220_LANES * 2,
+		.vts_def = 0x8ca,
+		.link_freq_index = LINK_FREQ_INDEX,
+		.reg_list = sc8220_3840_2160_liner_30fps_settings,
+		.reg_num = ARRAY_SIZE(sc8220_3840_2160_liner_30fps_settings),
+		.hdr_mode = NO_HDR,
+		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0,
+	},
+};
+
+static inline int sc8220_read_reg(struct sc8220 *sc8220, u16 addr, u8 *value)
+{
+	unsigned int val;
+	int ret;
+
+	ret = regmap_read(sc8220->regmap, addr, &val);
+	if (ret) {
+		dev_err(sc8220->dev, "i2c read failed at addr: %x\n", addr);
+		return ret;
+	}
+	*value = val & 0xff;
+	return 0;
+}
+
+static inline int sc8220_write_reg(struct sc8220 *sc8220, u16 addr, u8 value)
+{
+	int ret;
+
+	ret = regmap_write(sc8220->regmap, addr, value);
+	if (ret) {
+		dev_err(sc8220->dev, "i2c write failed at addr: %x\n", addr);
+		return ret;
+	}
+	return ret;
+}
+
+static int sc8220_set_gain(struct sc8220 *sc8220, u32 a_gain)
+{
+	int ret = 0;
+	u32 coarse_again = 0, fine_again = 0;
+	u32 coarse_dgain = 0, fine_dgain = 0;
+
+	dev_dbg(sc8220->dev, "set analog gain 0x%x\n", a_gain);
+	if (a_gain < 0x80) { /*1x ~ 2x*/
+		fine_again = a_gain;
+		coarse_again = 0x03;
+		fine_dgain = 0x80;
+		coarse_dgain = 0x00;
+		ret |= sc8220_write_reg(sc8220, 0x3301, 0x0a);
+		ret |= sc8220_write_reg(sc8220, 0x3633, 0x42);
+		ret |= sc8220_write_reg(sc8220, 0x3622, 0xe7);
+		ret |= sc8220_write_reg(sc8220, 0x3630, 0x80);
+		ret |= sc8220_write_reg(sc8220, 0x3628, 0x40);
+		ret |= sc8220_write_reg(sc8220, 0x363a, 0x00);
+	} else if (a_gain < 0x100) { /*2x ~ 4x*/
+		fine_again = a_gain >> 1;
+		coarse_again = 0x7;
+		fine_dgain = 0x80;
+		coarse_dgain = 0x00;
+		ret |= sc8220_write_reg(sc8220, 0x3301, 0x0E);
+		ret |= sc8220_write_reg(sc8220, 0x3633, 0x52);
+		ret |= sc8220_write_reg(sc8220, 0x3622, 0xe7);
+		ret |= sc8220_write_reg(sc8220, 0x3630, 0x50);
+		ret |= sc8220_write_reg(sc8220, 0x3628, 0x40);
+		ret |= sc8220_write_reg(sc8220, 0x363a, 0x00);
+	} else if (a_gain < 0x200) { /*4x ~ 8x*/
+		fine_again = a_gain >> 2;
+		coarse_again = 0xf;
+		fine_dgain = 0x80;
+		coarse_dgain = 0x00;
+		ret |= sc8220_write_reg(sc8220, 0x3301, 0x40);
+		ret |= sc8220_write_reg(sc8220, 0x3633, 0x53);
+		ret |= sc8220_write_reg(sc8220, 0x3622, 0xA7);
+		ret |= sc8220_write_reg(sc8220, 0x3630, 0x50);
+		ret |= sc8220_write_reg(sc8220, 0x3628, 0x40);
+		ret |= sc8220_write_reg(sc8220, 0x363a, 0x1f);
+	} else if (a_gain <= 0x3f8) { /*8x ~ 16x*/
+		fine_again = a_gain >> 3;
+		coarse_again = 0x1f;
+		fine_dgain = 0x80;
+		coarse_dgain = 0x00;
+	} else if (a_gain < 0x800) { /*16 ~ 32x*/
+		fine_again = 0x7f;
+		coarse_again = 0x1f;
+		fine_dgain = a_gain >> 3;
+		coarse_dgain = 0x00;
+	} else if (a_gain < 0x1000) { /*32 ~ 64*/
+		fine_again = 0x7f;
+		coarse_again = 0x1f;
+		fine_dgain = a_gain >> 4;
+		coarse_dgain = 0x01;
+	} else if (a_gain < 0x2000) { /*64 ~ 128*/
+		fine_again = 0x7f;
+		coarse_again = 0x1f;
+		fine_dgain = a_gain >> 5;
+		coarse_dgain = 0x03;
+	} else if (a_gain < 0x4000) { /*128 ~ 256*/
+		fine_again = 0x7f;
+		coarse_again = 0x1f;
+		fine_dgain = a_gain >> 6;
+		coarse_dgain = 0x07;
+	} else if (a_gain < 0x8000) { /*256 ~ 504*/
+		fine_again = 0x7f;
+		coarse_again = 0x1f;
+		fine_dgain = a_gain >> 7;
+		coarse_dgain = 0x0f;
+	}
+
+	dev_dbg(sc8220->dev, ">>>set fine_again = 0x%x, coarse_again = 0x%x, coarse_dgain=0x%x, fine_dgain=0x%x\n",
+			fine_again, coarse_again, coarse_dgain, fine_dgain);
+
+	if (a_gain > 0x200) {
+		ret |= sc8220_write_reg(sc8220, 0x3301, 0x40);
+		ret |= sc8220_write_reg(sc8220, 0x3633, 0x53);
+		ret |= sc8220_write_reg(sc8220, 0x3622, 0x87);
+		ret |= sc8220_write_reg(sc8220, 0x3630, 0x50);
+		ret |= sc8220_write_reg(sc8220, 0x3628, 0x40);
+		ret |= sc8220_write_reg(sc8220, 0x363a, 0x1f);
+	}
+	ret |= sc8220_write_reg(sc8220, SC8220_GROUP_HOLD, SC8220_GROUP_HOLD_START);
+	ret |= sc8220_write_reg(sc8220, SC8220_REG_DGAIN_H, coarse_dgain);
+	ret |= sc8220_write_reg(sc8220, SC8220_REG_DGAIN_L, fine_dgain);
+	ret |= sc8220_write_reg(sc8220, SC8220_REG_AGAIN_H, coarse_again);
+	ret |= sc8220_write_reg(sc8220, SC8220_REG_AGAIN_L, fine_again);
+	ret |= sc8220_write_reg(sc8220, SC8220_GROUP_HOLD, SC8220_GROUP_HOLD_LUNCH);
+
+	return ret;
+}
+
+static int sc8220_set_exp(struct sc8220 *sc8220, u32 exp)
+{
+	int ret;
+
+	dev_dbg(sc8220->dev, "%s: exp : %d\n", __func__, exp);
+	ret  = sc8220_write_reg(sc8220, SC8220_REG_EXP_LONG_H,
+					(exp >> 12) & 0xf);
+	ret |= sc8220_write_reg(sc8220, SC8220_REG_EXP_LONG_M,
+					(exp >> 4) & 0xff);
+	ret |= sc8220_write_reg(sc8220, SC8220_REG_EXP_LONG_L,
+					(exp & 0xf) << 4);
+	return ret;
+}
+
+static int sc8220_set_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct sc8220 *sc8220 = container_of(ctrl->handler,
+					     struct sc8220, ctrl_handler);
+	s64 max;
+	int ret = 0;
+	u8 val = 0;
+	u32 vts = 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 = sc8220->cur_mode->height + ctrl->val - 4;
+		__v4l2_ctrl_modify_range(sc8220->exposure,
+					 sc8220->exposure->minimum, max,
+					 sc8220->exposure->step,
+					 sc8220->exposure->default_value);
+		break;
+	}
+
+	if (!pm_runtime_get_if_in_use(sc8220->dev))
+		return 0;
+
+	switch (ctrl->id) {
+	case V4L2_CID_EXPOSURE:
+		ret = sc8220_set_exp(sc8220, ctrl->val);
+		break;
+	case V4L2_CID_ANALOGUE_GAIN:
+		ret = sc8220_set_gain(sc8220, ctrl->val);
+		break;
+	case V4L2_CID_VBLANK:
+		dev_dbg(sc8220->dev, "set vblank 0x%x\n", ctrl->val);
+		vts = ctrl->val + sc8220->cur_mode->height;
+		ret  = sc8220_write_reg(sc8220, SC8220_REG_VTS_H, vts >> 8);
+		ret |= sc8220_write_reg(sc8220, SC8220_REG_VTS_L, vts & 0xff);
+		break;
+	case V4L2_CID_HFLIP:
+		ret = sc8220_read_reg(sc8220, SC8220_REG_MIRROR_FLIP, &val);
+		if (ret)
+			break;
+		if (ctrl->val)
+			val |= SC8220_MIRROR_MASK;
+		else
+			val &= ~SC8220_MIRROR_MASK;
+		ret |= sc8220_write_reg(sc8220, SC8220_REG_MIRROR_FLIP, val);
+		break;
+	case V4L2_CID_VFLIP:
+		ret = sc8220_read_reg(sc8220, SC8220_REG_MIRROR_FLIP, &val);
+		if (ret)
+			break;
+		if (ctrl->val)
+			val |= SC8220_FLIP_MASK;
+		else
+			val &= ~SC8220_FLIP_MASK;
+		ret |= sc8220_write_reg(sc8220, SC8220_REG_MIRROR_FLIP, val);
+		break;
+	default:
+		dev_warn(sc8220->dev, "%s Unhandled id:0x%x, val:0x%x\n",
+			 __func__, ctrl->id, ctrl->val);
+		break;
+	}
+	pm_runtime_put(sc8220->dev);
+
+	return ret;
+}
+
+static const struct v4l2_ctrl_ops sc8220_ctrl_ops = {
+	.s_ctrl = sc8220_set_ctrl,
+};
+
+static int sc8220_get_regulators(struct sc8220 *sc8220)
+{
+	unsigned int i;
+
+	for (i = 0; i < SC8220_NUM_SUPPLIES; i++)
+		sc8220->supplies[i].supply = sc8220_supply_names[i];
+	return devm_regulator_bulk_get(sc8220->dev,
+				SC8220_NUM_SUPPLIES,
+				sc8220->supplies);
+}
+
+static int sc8220_initialize_controls(struct sc8220 *sc8220)
+{
+	const struct sc8220_mode *mode;
+	struct v4l2_ctrl_handler *handler;
+	s64 exposure_max, vblank_def;
+	u32 h_blank;
+	u64 pixel_rate;
+	int ret;
+
+	handler = &sc8220->ctrl_handler;
+	mode = sc8220->cur_mode;
+	ret = v4l2_ctrl_handler_init(handler, 8);
+	if (ret)
+		return ret;
+	handler->lock = &sc8220->lock;
+	sc8220->link_freq = v4l2_ctrl_new_int_menu(handler, NULL,
+			V4L2_CID_LINK_FREQ,
+			ARRAY_SIZE(link_freq_menu_items) - 1, 0,
+			link_freq_menu_items);
+
+	pixel_rate = SC8220_PIXEL_RATE;
+	sc8220->pixel_rate = v4l2_ctrl_new_std(handler, NULL,
+			V4L2_CID_PIXEL_RATE,
+			0, pixel_rate,
+			1, pixel_rate);
+
+	h_blank = mode->hts_def - mode->width;
+	sc8220->hblank = v4l2_ctrl_new_std(handler, NULL,
+			V4L2_CID_HBLANK,
+			h_blank, h_blank, 1, h_blank);
+	if (sc8220->hblank)
+		sc8220->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+	vblank_def = mode->vts_def - mode->height;
+
+	sc8220->vblank = v4l2_ctrl_new_std(handler, &sc8220_ctrl_ops,
+			V4L2_CID_VBLANK, vblank_def,
+			SC8220_VTS_MAX - mode->height,
+			1, vblank_def);
+
+	exposure_max = mode->vts_def - 4;
+	sc8220->exposure = v4l2_ctrl_new_std(handler, &sc8220_ctrl_ops,
+			V4L2_CID_EXPOSURE, SC8220_EXPOSURE_NORMAL_MIN,
+			exposure_max, SC8220_EXPOSURE_NORMAL_STEP,
+			mode->exp_def);
+
+	sc8220->anal_gain = v4l2_ctrl_new_std(handler, &sc8220_ctrl_ops,
+			V4L2_CID_ANALOGUE_GAIN, SC8220_GAIN_MIN,
+			SC8220_GAIN_MAX, SC8220_GAIN_STEP,
+			SC8220_GAIN_DEFAULT);
+
+	sc8220->h_flip = v4l2_ctrl_new_std(handler, &sc8220_ctrl_ops,
+			V4L2_CID_HFLIP, 0, 1, 1, 0);
+	sc8220->v_flip = v4l2_ctrl_new_std(handler, &sc8220_ctrl_ops,
+			V4L2_CID_VFLIP, 0, 1, 1, 0);
+
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(sc8220->dev, "Failed to init controls(%d)\n", ret);
+		goto err_free_handler;
+	}
+	sc8220->subdev.ctrl_handler = handler;
+	sc8220->has_init_exp = false;
+	return 0;
+err_free_handler:
+	v4l2_ctrl_handler_free(handler);
+	return ret;
+}
+
+static int __sc8220_power_on(struct sc8220 *sc8220)
+{
+	int ret;
+	struct device *dev = sc8220->dev;
+
+	if (!IS_ERR_OR_NULL(sc8220->pins_default)) {
+		ret = pinctrl_select_state(sc8220->pinctrl,
+					   sc8220->pins_default);
+		if (ret < 0)
+			dev_err(dev, "could not set pins\n");
+	}
+	ret = clk_set_rate(sc8220->xvclk, SC8220_XVCLK_FREQ);
+	if (ret < 0)
+		dev_warn(dev, "Failed to set xvclk rate\n");
+	if (clk_get_rate(sc8220->xvclk) != SC8220_XVCLK_FREQ)
+		dev_warn(dev, "xvclk mismatched, modes are based on 27MHz\n");
+	ret = clk_prepare_enable(sc8220->xvclk);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable xvclk\n");
+		return ret;
+	}
+	ret = regulator_bulk_enable(SC8220_NUM_SUPPLIES, sc8220->supplies);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable regulators\n");
+		goto disable_clk;
+	}
+	if (!IS_ERR(sc8220->reset_gpio))
+		gpiod_set_value_cansleep(sc8220->reset_gpio, 1);
+	usleep_range(1000, 2000);
+	if (!IS_ERR(sc8220->pwdn_gpio))
+		gpiod_set_value_cansleep(sc8220->pwdn_gpio, 1);
+	if (!IS_ERR(sc8220->reset_gpio))
+		gpiod_set_value_cansleep(sc8220->reset_gpio, 0);
+	usleep_range(10000, 20000);
+	return 0;
+disable_clk:
+	clk_disable_unprepare(sc8220->xvclk);
+
+	if (!IS_ERR_OR_NULL(sc8220->pins_sleep))
+		pinctrl_select_state(sc8220->pinctrl, sc8220->pins_sleep);
+
+	return ret;
+}
+
+static void __sc8220_power_off(struct sc8220 *sc8220)
+{
+	int ret;
+	struct device *dev = sc8220->dev;
+
+	if (!IS_ERR_OR_NULL(sc8220->pins_sleep)) {
+		ret = pinctrl_select_state(sc8220->pinctrl,
+					   sc8220->pins_sleep);
+		if (ret < 0)
+			dev_dbg(dev, "could not set pins\n");
+	}
+	if (!IS_ERR(sc8220->reset_gpio))
+		gpiod_set_value_cansleep(sc8220->reset_gpio, 1);
+	if (!IS_ERR(sc8220->pwdn_gpio))
+		gpiod_set_value_cansleep(sc8220->pwdn_gpio, 0);
+	regulator_bulk_disable(SC8220_NUM_SUPPLIES, sc8220->supplies);
+	clk_disable_unprepare(sc8220->xvclk);
+}
+
+static int sc8220_check_sensor_id(struct sc8220 *sc8220)
+{
+	u8 id_h = 0, id_l = 0;
+	u16 id = 0;
+	int ret = 0;
+
+	ret = sc8220_read_reg(sc8220, SC8220_REG_CHIP_ID_H, &id_h);
+	ret |= sc8220_read_reg(sc8220, SC8220_REG_CHIP_ID_L, &id_l);
+	if (ret) {
+		dev_err(sc8220->dev, "Failed to read sensor id, (%d)\n", ret);
+		return ret;
+	}
+	id = id_h << 8 | id_l;
+	if (id != SC8220_CHIP_ID) {
+		dev_err(sc8220->dev, "sensor id: %04X mismatched\n", id);
+		return -ENODEV;
+	}
+	dev_info(sc8220->dev, "Detected SC8220 sensor\n");
+	return 0;
+}
+
+static void sc8220_get_module_inf(struct sc8220 *sc8220,
+				  struct rkmodule_inf *inf)
+{
+	memset(inf, 0, sizeof(*inf));
+	strscpy(inf->base.lens, sc8220->len_name, sizeof(inf->base.lens));
+	strscpy(inf->base.sensor, SC8220_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, sc8220->module_name, sizeof(inf->base.module));
+}
+
+static long sc8220_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	struct sc8220 *sc8220 = to_sc8220(sd);
+	struct rkmodule_hdr_cfg *hdr_cfg;
+	long ret = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_HDR_CFG:
+		hdr_cfg = (struct rkmodule_hdr_cfg *)arg;
+		hdr_cfg->esp.mode = HDR_NORMAL_VC;
+		hdr_cfg->hdr_mode = sc8220->cur_mode->hdr_mode;
+		break;
+	case RKMODULE_GET_MODULE_INFO:
+		sc8220_get_module_inf(sc8220, (struct rkmodule_inf *)arg);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+	return ret;
+}
+
+static int __sc8220_start_stream(struct sc8220 *sc8220)
+{
+	int ret;
+
+	ret = regmap_multi_reg_write(sc8220->regmap,
+				     sc8220->cur_mode->reg_list,
+				     sc8220->cur_mode->reg_num);
+	if (ret)
+		return ret;
+	__v4l2_ctrl_handler_setup(&sc8220->ctrl_handler);
+	return sc8220_write_reg(sc8220, SC8220_REG_CTRL_MODE, SC8220_MODE_STREAMING);
+}
+
+static int __sc8220_stop_stream(struct sc8220 *sc8220)
+{
+	sc8220->has_init_exp = false;
+	return sc8220_write_reg(sc8220, SC8220_REG_CTRL_MODE, SC8220_MODE_SW_STANDBY);
+}
+
+#ifdef CONFIG_COMPAT
+static long sc8220_compat_ioctl32(struct v4l2_subdev *sd,
+				  unsigned int cmd, unsigned long arg)
+{
+	void __user *up = compat_ptr(arg);
+	struct rkmodule_inf *inf;
+	struct rkmodule_hdr_cfg *hdr;
+	long ret = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		inf = kzalloc(sizeof(*inf), GFP_KERNEL);
+		if (!inf) {
+			ret = -ENOMEM;
+			return ret;
+		}
+		ret = sc8220_ioctl(sd, cmd, inf);
+		if (!ret) {
+			ret = copy_to_user(up, inf, sizeof(*inf));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(inf);
+		break;
+	case RKMODULE_GET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+		ret = sc8220_ioctl(sd, cmd, hdr);
+		if (!ret) {
+			ret = copy_to_user(up, hdr, sizeof(*hdr));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(hdr);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+	return ret;
+}
+#endif
+
+static int sc8220_s_stream(struct v4l2_subdev *sd, int on)
+{
+	struct sc8220 *sc8220 = to_sc8220(sd);
+	int ret = 0;
+
+	mutex_lock(&sc8220->lock);
+	on = !!on;
+	if (on == sc8220->streaming)
+		goto unlock_and_return;
+	if (on) {
+		ret = pm_runtime_get_sync(sc8220->dev);
+		if (ret < 0) {
+			pm_runtime_put_noidle(sc8220->dev);
+			goto unlock_and_return;
+		}
+		ret = __sc8220_start_stream(sc8220);
+		if (ret) {
+			dev_err(sc8220->dev, "Failed to start sc8220 stream\n");
+			pm_runtime_put(sc8220->dev);
+			goto unlock_and_return;
+		}
+	} else {
+		__sc8220_stop_stream(sc8220);
+		pm_runtime_put(sc8220->dev);
+	}
+	sc8220->streaming = on;
+
+unlock_and_return:
+	mutex_unlock(&sc8220->lock);
+	return 0;
+}
+
+static int sc8220_g_frame_interval(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_frame_interval *fi)
+{
+	struct sc8220 *sc8220 = to_sc8220(sd);
+	const struct sc8220_mode *mode = sc8220->cur_mode;
+
+	mutex_lock(&sc8220->lock);
+	fi->interval = mode->max_fps;
+	mutex_unlock(&sc8220->lock);
+	return 0;
+}
+
+static int sc8220_g_mbus_config(struct v4l2_subdev *sd,
+				struct v4l2_mbus_config *config)
+{
+	struct sc8220 *sc8220 = to_sc8220(sd);
+
+	u32 val = 1 << (SC8220_LANES - 1) | V4L2_MBUS_CSI2_CHANNEL_0 |
+		  V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
+	config->type = V4L2_MBUS_CSI2;
+	config->flags = (sc8220->cur_mode->hdr_mode == NO_HDR) ?
+			val : (val | V4L2_MBUS_CSI2_CHANNEL_1);
+	return 0;
+}
+
+static int sc8220_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 = SC8220_MEDIA_BUS_FMT;
+	return 0;
+}
+
+static int sc8220_enum_frame_sizes(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_pad_config *cfg,
+				   struct v4l2_subdev_frame_size_enum *fse)
+{
+	struct sc8220 *sc8220 = to_sc8220(sd);
+
+	if (fse->index >= sc8220->cfg_num)
+		return -EINVAL;
+	if (fse->code != SC8220_MEDIA_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;
+	return 0;
+}
+
+static int sc8220_enum_frame_interval(struct v4l2_subdev *sd,
+						  struct v4l2_subdev_pad_config *cfg,
+						  struct v4l2_subdev_frame_interval_enum *fie)
+{
+	struct sc8220 *sc8220 = to_sc8220(sd);
+
+	if (fie->index >= sc8220->cfg_num)
+		return -EINVAL;
+	fie->code = SC8220_MEDIA_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;
+	return 0;
+}
+
+static int sc8220_set_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct sc8220 *sc8220 = to_sc8220(sd);
+	const struct sc8220_mode *mode;
+	s64 h_blank, vblank_def;
+
+	mutex_lock(&sc8220->lock);
+	mode = v4l2_find_nearest_size(supported_modes,
+		ARRAY_SIZE(supported_modes),
+		width, height,
+		fmt->format.width, fmt->format.height);
+	fmt->format.code = SC8220_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(&sc8220->lock);
+		return -ENOTTY;
+#endif
+	} else {
+		sc8220->cur_mode = mode;
+		__v4l2_ctrl_s_ctrl(sc8220->link_freq, mode->link_freq_index);
+		__v4l2_ctrl_s_ctrl_int64(sc8220->pixel_rate,
+					 SC8220_PIXEL_RATE);
+		h_blank = mode->hts_def - mode->width;
+		__v4l2_ctrl_modify_range(sc8220->hblank, h_blank,
+					 h_blank, 1, h_blank);
+		vblank_def = mode->vts_def - mode->height;
+		__v4l2_ctrl_modify_range(sc8220->vblank, vblank_def,
+					 SC8220_VTS_MAX - mode->height,
+					 1, vblank_def);
+	}
+	mutex_unlock(&sc8220->lock);
+	return 0;
+}
+
+#define CROP_START(SRC, DST) (((SRC) - (DST)) / 2 / 4 * 4)
+#define DST_WIDTH	3840
+#define DST_HEIGHT	2160
+
+static int sc8220_get_selection(struct v4l2_subdev *sd,
+				struct v4l2_subdev_pad_config *cfg,
+				struct v4l2_subdev_selection *sel)
+{
+	struct sc8220 *sc8220 = to_sc8220(sd);
+
+	if (sel->target == V4L2_SEL_TGT_CROP_BOUNDS) {
+		sel->r.left = CROP_START(sc8220->cur_mode->width, DST_WIDTH);
+		sel->r.width = DST_WIDTH;
+		sel->r.top = CROP_START(sc8220->cur_mode->height, DST_HEIGHT);
+		sel->r.height = DST_HEIGHT;
+		return 0;
+	}
+	return -EINVAL;
+}
+
+static int sc8220_get_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct sc8220 *sc8220 = to_sc8220(sd);
+	const struct sc8220_mode *mode = sc8220->cur_mode;
+
+	mutex_lock(&sc8220->lock);
+	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(&sc8220->lock);
+		return -ENOTTY;
+#endif
+	} else {
+		fmt->format.width = mode->width;
+		fmt->format.height = mode->height;
+		fmt->format.code = SC8220_MEDIA_BUS_FMT;
+		fmt->format.field = V4L2_FIELD_NONE;
+		fmt->reserved[0] = mode->vc[PAD0];
+	}
+	mutex_unlock(&sc8220->lock);
+	return 0;
+}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static int sc8220_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
+{
+	struct sc8220 *sc8220 = to_sc8220(sd);
+	struct v4l2_mbus_framefmt *try_fmt =
+				v4l2_subdev_get_try_format(sd, fh->pad, 0);
+	const struct sc8220_mode *def_mode = &supported_modes[0];
+
+	mutex_lock(&sc8220->lock);
+	/* Initialize try_fmt */
+	try_fmt->width = def_mode->width;
+	try_fmt->height = def_mode->height;
+	try_fmt->code = SC8220_MEDIA_BUS_FMT;
+	try_fmt->field = V4L2_FIELD_NONE;
+	mutex_unlock(&sc8220->lock);
+	return 0;
+}
+#endif
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static const struct v4l2_subdev_internal_ops sc8220_internal_ops = {
+	.open = sc8220_open,
+};
+#endif
+
+static int sc8220_s_power(struct v4l2_subdev *sd, int on)
+{
+	struct sc8220 *sc8220 = to_sc8220(sd);
+	int ret = 0;
+
+	mutex_lock(&sc8220->lock);
+	if (sc8220->power_on == !!on)
+		goto unlock_and_return;
+	if (on) {
+		ret = pm_runtime_get_sync(sc8220->dev);
+		if (ret < 0) {
+			pm_runtime_put_noidle(sc8220->dev);
+			goto unlock_and_return;
+		}
+		sc8220->power_on = true;
+	} else {
+		pm_runtime_put(sc8220->dev);
+		sc8220->power_on = false;
+	}
+unlock_and_return:
+	mutex_unlock(&sc8220->lock);
+	return ret;
+}
+
+static const struct v4l2_subdev_core_ops sc8220_core_ops = {
+	.s_power = sc8220_s_power,
+	.ioctl = sc8220_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = sc8220_compat_ioctl32,
+#endif
+};
+
+static const struct v4l2_subdev_video_ops sc8220_video_ops = {
+	.s_stream = sc8220_s_stream,
+	.g_frame_interval = sc8220_g_frame_interval,
+	.g_mbus_config = sc8220_g_mbus_config,
+};
+
+static const struct v4l2_subdev_pad_ops sc8220_pad_ops = {
+	.enum_mbus_code = sc8220_enum_mbus_code,
+	.enum_frame_size = sc8220_enum_frame_sizes,
+	.enum_frame_interval = sc8220_enum_frame_interval,
+	.get_fmt = sc8220_get_fmt,
+	.set_fmt = sc8220_set_fmt,
+	.get_selection = sc8220_get_selection,
+};
+
+static const struct v4l2_subdev_ops sc8220_subdev_ops = {
+	.core   = &sc8220_core_ops,
+	.video  = &sc8220_video_ops,
+	.pad    = &sc8220_pad_ops,
+};
+
+static int sc8220_runtime_resume(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct sc8220 *sc8220 = to_sc8220(sd);
+
+	__sc8220_power_on(sc8220);
+	return 0;
+}
+
+static int sc8220_runtime_suspend(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct sc8220 *sc8220 = to_sc8220(sd);
+
+	__sc8220_power_off(sc8220);
+	return 0;
+}
+
+static const struct dev_pm_ops sc8220_pm_ops = {
+	SET_RUNTIME_PM_OPS(sc8220_runtime_suspend,
+			   sc8220_runtime_resume, NULL)
+};
+
+static int sc8220_probe(struct i2c_client *client,
+			 const struct i2c_device_id *id)
+{
+	struct device *dev = &client->dev;
+	struct device_node *node = dev->of_node;
+	struct sc8220 *sc8220;
+	struct v4l2_subdev *sd;
+	char facing[2];
+	int ret;
+
+	dev_info(dev, "driver version: %02x.%02x.%02x",
+		 DRIVER_VERSION >> 16,
+		 (DRIVER_VERSION & 0xff00) >> 8,
+		 DRIVER_VERSION & 0x00ff);
+	sc8220 = devm_kzalloc(dev, sizeof(*sc8220), GFP_KERNEL);
+	if (!sc8220)
+		return -ENOMEM;
+	sc8220->dev = dev;
+	sc8220->regmap = devm_regmap_init_i2c(client, &sc8220_regmap_config);
+	if (IS_ERR(sc8220->regmap)) {
+		dev_err(dev, "Failed to initialize I2C\n");
+		return -ENODEV;
+	}
+	ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
+				   &sc8220->module_index);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
+				       &sc8220->module_facing);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME,
+				       &sc8220->module_name);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME,
+				       &sc8220->len_name);
+	if (ret) {
+		dev_err(dev, "Failed to get module information\n");
+		return -EINVAL;
+	}
+	sc8220->xvclk = devm_clk_get(sc8220->dev, "xvclk");
+	if (IS_ERR(sc8220->xvclk)) {
+		dev_err(sc8220->dev, "Failed to get xvclk\n");
+		return -EINVAL;
+	}
+	sc8220->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+	if (IS_ERR(sc8220->reset_gpio))
+		dev_warn(dev, "Failed to get reset-gpios\n");
+	sc8220->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_HIGH);
+	if (IS_ERR(sc8220->pwdn_gpio))
+		dev_warn(dev, "Failed to get pwdn-gpios\n");
+	ret = sc8220_get_regulators(sc8220);
+	if (ret) {
+		dev_err(dev, "Failed to get regulators\n");
+		return ret;
+	}
+	sc8220->pinctrl = devm_pinctrl_get(dev);
+	if (!IS_ERR(sc8220->pinctrl)) {
+		sc8220->pins_default =
+			pinctrl_lookup_state(sc8220->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_DEFAULT);
+		if (IS_ERR(sc8220->pins_default))
+			dev_info(dev, "could not get default pinstate\n");
+
+		sc8220->pins_sleep =
+			pinctrl_lookup_state(sc8220->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_SLEEP);
+		if (IS_ERR(sc8220->pins_sleep))
+			dev_info(dev, "could not get sleep pinstate\n");
+	} else {
+		dev_info(dev, "no pinctrl\n");
+	}
+	mutex_init(&sc8220->lock);
+	/* set default mode */
+	sc8220->cur_mode = &supported_modes[0];
+	sc8220->cfg_num = ARRAY_SIZE(supported_modes);
+	sd = &sc8220->subdev;
+	ret = __sc8220_power_on(sc8220);
+	if (ret)
+		goto err_free_handler;
+	ret = sc8220_check_sensor_id(sc8220);
+	if (ret)
+		goto err_power_off;
+	v4l2_i2c_subdev_init(sd, client, &sc8220_subdev_ops);
+	ret = sc8220_initialize_controls(sc8220);
+	if (ret)
+		goto err_destroy_mutex;
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+	sd->internal_ops = &sc8220_internal_ops;
+	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
+#endif
+#ifdef CONFIG_MEDIA_CONTROLLER
+	sc8220->pad.flags = MEDIA_PAD_FL_SOURCE;
+	sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
+	ret = media_entity_pads_init(&sd->entity, 1, &sc8220->pad);
+	if (ret < 0)
+		goto err_power_off;
+#endif
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(sc8220->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s",
+		 sc8220->module_index, facing,
+		 SC8220_NAME, dev_name(sd->dev));
+	ret = v4l2_async_register_subdev_sensor_common(sd);
+	if (ret) {
+		dev_err(dev, "Failed to register v4l2 async subdev\n");
+		goto err_clean_entity;
+	}
+
+	pm_runtime_set_active(dev);
+	pm_runtime_enable(dev);
+	pm_runtime_idle(dev);
+
+	return 0;
+err_clean_entity:
+#ifdef CONFIG_MEDIA_CONTROLLER
+	media_entity_cleanup(&sd->entity);
+#endif
+err_power_off:
+	__sc8220_power_off(sc8220);
+err_free_handler:
+	v4l2_ctrl_handler_free(&sc8220->ctrl_handler);
+err_destroy_mutex:
+	mutex_destroy(&sc8220->lock);
+	return ret;
+}
+
+static int sc8220_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct sc8220 *sc8220 = to_sc8220(sd);
+
+	v4l2_async_unregister_subdev(sd);
+#ifdef CONFIG_MEDIA_CONTROLLER
+	media_entity_cleanup(&sd->entity);
+#endif
+	v4l2_ctrl_handler_free(&sc8220->ctrl_handler);
+	mutex_destroy(&sc8220->lock);
+	pm_runtime_disable(&client->dev);
+	if (!pm_runtime_status_suspended(&client->dev))
+		__sc8220_power_off(sc8220);
+	pm_runtime_set_suspended(&client->dev);
+	return 0;
+}
+
+static const struct i2c_device_id sc8220_match_id[] = {
+	{ "smartsens,sc8220", 0 },
+	{ },
+};
+
+static const struct of_device_id sc8220_of_match[] = {
+	{ .compatible = "smartsens,sc8220" },
+	{},
+};
+
+MODULE_DEVICE_TABLE(of, sc8220_of_match);
+
+static struct i2c_driver sc8220_i2c_driver = {
+	.driver = {
+		.name = SC8220_NAME,
+		.pm = &sc8220_pm_ops,
+		.of_match_table = of_match_ptr(sc8220_of_match),
+	},
+	.probe      = &sc8220_probe,
+	.remove     = &sc8220_remove,
+	.id_table   = sc8220_match_id,
+};
+
+static int __init sensor_mod_init(void)
+{
+	return i2c_add_driver(&sc8220_i2c_driver);
+}
+
+static void __exit sensor_mod_exit(void)
+{
+	i2c_del_driver(&sc8220_i2c_driver);
+}
+
+device_initcall_sync(sensor_mod_init);
+module_exit(sensor_mod_exit);
+
+MODULE_DESCRIPTION("Smartsens sc8220 Image Sensor driver");
+MODULE_LICENSE("GPL v2");

commit 06c60e3d95d5efc65af5a33ec7cca20f27b14953
Author: Yiqing Zeng <zack.zeng@rock-chips.com>
Date:   Sat May 15 17:46:39 2021 +0800

    media: i2c: support sc2335 sensor driver
    
    Signed-off-by: Yiqing Zeng <zack.zeng@rock-chips.com>
    Change-Id: I5a54b7b2aa1fdcc7e4ce781375f77a459ec9e2ae

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index ddf53533a0f4..d3c50d7a37ed 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -1744,6 +1744,17 @@ config VIDEO_SC2310
 	  To compile this driver as a module, choose M here: the
 	  module will be called sc2310.
 
+config VIDEO_SC2335
+	tristate "SmartSens SC2335 sensor support"
+	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
+	depends on MEDIA_CAMERA_SUPPORT
+	select V4L2_FWNODE
+	help
+	  Support for the SmartSens SC2335 sensor.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called sc2335.
+
 config VIDEO_SC401AI
 	tristate "SmartSens SC401AI sensor support"
 	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index 8b04ece4c36b..67dd95e49f09 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -188,6 +188,7 @@ obj-$(CONFIG_VIDEO_SC210IOT)	+= sc210iot.o
 obj-$(CONFIG_VIDEO_SC2232)	+= sc2232.o
 obj-$(CONFIG_VIDEO_SC2239)	+= sc2239.o
 obj-$(CONFIG_VIDEO_SC2310)	+= sc2310.o
+obj-$(CONFIG_VIDEO_SC2335)	+= sc2335.o
 obj-$(CONFIG_VIDEO_SC401AI)	+= sc401ai.o
 obj-$(CONFIG_VIDEO_SC4238)	+= sc4238.o
 obj-$(CONFIG_VIDEO_SC430CS)	+= sc430cs.o
diff --git a/drivers/media/i2c/sc2335.c b/drivers/media/i2c/sc2335.c
new file mode 100644
index 000000000000..e8705c8389ef
--- /dev/null
+++ b/drivers/media/i2c/sc2335.c
@@ -0,0 +1,1654 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * sc2335 driver
+ *
+ * Copyright (C) 2020 Rockchip Electronics Co., Ltd.
+ *
+ * V0.0X01.0X00 first version.
+ * V0.0X01.0X01 add quick stream support.
+ * V0.0X01.0X02 fix gain error.
+ * V0.0X01.0X03 fix set flip/mirror error.
+ */
+//#define DEBUG
+#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/of_graph.h>
+#include <linux/rk-camera-module.h>
+#include <linux/slab.h>
+#include <linux/version.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>
+
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x03)
+
+#ifndef V4L2_CID_DIGITAL_GAIN
+#define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
+#endif
+
+#define SC2335_BITS_PER_SAMPLE		10
+#define SC2335_ONE_LANE			1
+#define SC2335_TWO_LANES			2
+#define SC2335_LINK_FREQ_186M		185625000   // 371.25Mbps
+#define SC2335_LINK_FREQ_371M		371250000	// 742.5Mbps
+
+#define SC2335_PIXEL_RATE_ONE_LANE		(SC2335_LINK_FREQ_186M * 2 * \
+					SC2335_ONE_LANE / SC2335_BITS_PER_SAMPLE)
+#define SC2335_PIXEL_RATE_TWO_LANES		(SC2335_LINK_FREQ_371M * 2 * \
+					SC2335_TWO_LANES / SC2335_BITS_PER_SAMPLE)
+
+#define SC2335_XVCLK_FREQ		24000000
+
+#define CHIP_ID				0xcb14
+#define SC2335_REG_CHIP_ID		0x3107
+
+#define SC2335_REG_CTRL_MODE		0x0100
+#define SC2335_MODE_SW_STANDBY		0x0
+#define SC2335_MODE_STREAMING		BIT(0)
+
+#define SC2335_REG_EXPOSURE		0x3e00
+#define	SC2335_EXPOSURE_MIN		1
+#define	SC2335_EXPOSURE_STEP	1
+#define SC2335_REG_VTS			0x320e
+#define SC2335_VTS_MAX			0xffff
+
+#define SC2335_REG_COARSE_DGAIN		0x3e06
+#define SC2335_REG_FINE_DGAIN		0x3e07
+#define SC2335_REG_COARSE_AGAIN		0x3e08
+#define SC2335_REG_FINE_AGAIN		0x3e09
+#define	ANALOG_GAIN_MIN			0x40
+#define	ANALOG_GAIN_MAX			0x8000
+#define	ANALOG_GAIN_STEP		1
+#define	ANALOG_GAIN_DEFAULT		0x40
+
+#define SC2335_REG_TEST_PATTERN		0x4501
+#define SC2335_TEST_PATTERN_BIT_MASK	BIT(3)
+
+#define SC2335_REG_FLIP_MIRROR		0x3221
+#define SC2335_MIRROR_MASK			0x06
+#define SC2335_FLIP_MASK			0x60
+
+#define REG_NULL			0xFFFF
+#define DELAY_MS			0xEEEE	/* Array delay token */
+
+#define SC2335_REG_VALUE_08BIT		1
+#define SC2335_REG_VALUE_16BIT		2
+#define SC2335_REG_VALUE_24BIT		3
+
+#define PIX_FORMAT MEDIA_BUS_FMT_SBGGR10_1X10
+#define OF_CAMERA_PINCTRL_STATE_DEFAULT	"rockchip,camera_default"
+#define SC2335_NAME			"sc2335"
+
+static const char * const sc2335_supply_names[] = {
+	"avdd",		/* Analog power */
+	"dovdd",	/* Digital I/O power */
+	"dvdd",		/* Digital core power */
+};
+
+#define SC2335_NUM_SUPPLIES ARRAY_SIZE(sc2335_supply_names)
+
+struct regval {
+	u16 addr;
+	u8 val;
+};
+enum sc2335_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 sc2335_mode {
+	u32 width;
+	u32 height;
+	struct v4l2_fract max_fps;
+	u32 hts_def;
+	u32 vts_def;
+	u32 exp_def;
+	const struct regval *reg_list;
+	u32 hdr_mode;
+	u8 freq_idx;
+	u8 lanes;
+	u8 bpp;
+};
+
+struct sc2335 {
+	struct i2c_client	*client;
+	struct clk		*xvclk;
+	struct gpio_desc	*reset_gpio;
+	struct gpio_desc	*pwdn_gpio;
+	struct gpio_desc	*power_gpio;
+	struct regulator_bulk_data supplies[SC2335_NUM_SUPPLIES];
+	struct pinctrl		*pinctrl;
+	struct pinctrl_state	*pins_default;
+	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 v4l2_ctrl	*h_flip;
+	struct v4l2_ctrl	*v_flip;
+	struct mutex		mutex;
+	bool			streaming;
+	bool			power_on;
+	const struct sc2335_mode *cur_mode;
+	u32			module_index;
+	u32			cur_vts;
+	const char		*module_facing;
+	const char		*module_name;
+	const char		*len_name;
+	struct v4l2_fwnode_endpoint bus_cfg;
+};
+
+#define to_sc2335(sd) container_of(sd, struct sc2335, subdev)
+
+static const struct regval sc2335_global_regs[] = {
+	{REG_NULL, 0x00},
+};
+
+/*
+ * Xclk 24Mhz
+ * max_framerate 30fps
+ * mipi_datarate per lane 742.5Mbps, 1 lane
+ */
+static const struct regval sc2335_1920x1080_regs_1lane[] = {
+	{0x0103, 0x01},
+	{0x0100, 0x00},
+	{0x36e9, 0x80},
+	{0x36f9, 0x80},
+	{0x3018, 0x12},
+	{0x301f, 0x35},
+	{0x3207, 0x3f},
+	{0x3249, 0x0f},
+	{0x3253, 0x08},
+	{0x3271, 0x00},
+	{0x3273, 0x03},
+	{0x3301, 0x06},
+	{0x3302, 0x09},
+	{0x3304, 0x28},
+	{0x3306, 0x30},
+	{0x330b, 0x94},
+	{0x330c, 0x08},
+	{0x330d, 0x18},
+	{0x330e, 0x14},
+	{0x330f, 0x05},
+	{0x3310, 0x06},
+	{0x3314, 0x96},
+	{0x3316, 0x00},
+	{0x331e, 0x21},
+	{0x332b, 0x08},
+	{0x3333, 0x10},
+	{0x3338, 0x80},
+	{0x333a, 0x04},
+	{0x334c, 0x04},
+	{0x335f, 0x04},
+	{0x3364, 0x17},
+	{0x3366, 0x62},
+	{0x337c, 0x05},
+	{0x337d, 0x09},
+	{0x337e, 0x00},
+	{0x3390, 0x08},
+	{0x3391, 0x18},
+	{0x3392, 0x38},
+	{0x3393, 0x09},
+	{0x3394, 0x20},
+	{0x3395, 0x20},
+	{0x33a2, 0x07},
+	{0x33ac, 0x04},
+	{0x33ae, 0x14},
+	{0x3614, 0x00},
+	{0x3622, 0x16},
+	{0x3630, 0x68},
+	{0x3631, 0x84},
+	{0x3637, 0x20},
+	{0x363a, 0x1f},
+	{0x3670, 0x0e},
+	{0x3674, 0xa1},
+	{0x3675, 0x9c},
+	{0x3676, 0x9e},
+	{0x3677, 0x84},
+	{0x3678, 0x85},
+	{0x3679, 0x87},
+	{0x367c, 0x18},
+	{0x367d, 0x38},
+	{0x367e, 0x08},
+	{0x367f, 0x18},
+	{0x3690, 0x32},
+	{0x3691, 0x32},
+	{0x3692, 0x44},
+	{0x369c, 0x08},
+	{0x369d, 0x38},
+	{0x36ea, 0xf5},
+	{0x36ec, 0x0c},
+	{0x36fa, 0xdf},
+	{0x3908, 0x82},
+	{0x391f, 0x18},
+	{0x3e01, 0x8c},
+	{0x3e02, 0x00},
+	{0x3f00, 0x0d},
+	{0x3f04, 0x02},
+	{0x3f05, 0x0e},
+	{0x3f09, 0x48},
+	{0x4505, 0x0a},
+	{0x4509, 0x20},
+	{0x4800, 0x44},
+	{0x481d, 0x0a},
+	{0x4827, 0x03},
+	{0x5787, 0x10},
+	{0x5788, 0x06},
+	{0x578a, 0x10},
+	{0x578b, 0x06},
+	{0x5790, 0x10},
+	{0x5791, 0x10},
+	{0x5792, 0x00},
+	{0x5793, 0x10},
+	{0x5794, 0x10},
+	{0x5795, 0x00},
+	{0x5799, 0x00},
+	{0x57c7, 0x10},
+	{0x57c8, 0x06},
+	{0x57ca, 0x10},
+	{0x57cb, 0x06},
+	{0x57d1, 0x10},
+	{0x57d4, 0x10},
+	{0x57d9, 0x00},
+	{0x36e9, 0x59},
+	{0x36f9, 0x5b},
+	{0x0100, 0x01},
+	{0x363c, 0x04},
+	{DELAY_MS, 0x0a},
+	{REG_NULL, 0x00},
+};
+
+/*
+ * Xclk 24Mhz
+ * max_framerate 30fps
+ * mipi_datarate per lane 371.25Mbps, 2 lane
+ */
+static const struct regval sc2335_1920x1080_regs_2lane[] = {
+	{0x0103, 0x01},
+	{0x0100, 0x00},
+	{0x36e9, 0x80},
+	{0x36f9, 0x80},
+	{0x301f, 0x83},
+	{0x3207, 0x3f},
+	{0x3249, 0x0f},
+	{0x3253, 0x08},
+	{0x3271, 0x00},
+	{0x3273, 0x03},
+	{0x3301, 0x06},
+	{0x3302, 0x09},
+	{0x3304, 0x28},
+	{0x3306, 0x30},
+	{0x330b, 0x98},
+	{0x330c, 0x08},
+	{0x330d, 0x18},
+	{0x330e, 0x14},
+	{0x330f, 0x05},
+	{0x3310, 0x06},
+	{0x3314, 0x96},
+	{0x3316, 0x00},
+	{0x331e, 0x21},
+	{0x332b, 0x08},
+	{0x3333, 0x10},
+	{0x3338, 0x80},
+	{0x333a, 0x04},
+	{0x334c, 0x04},
+	{0x335f, 0x04},
+	{0x3364, 0x17},
+	{0x3366, 0x62},
+	{0x337c, 0x05},
+	{0x337d, 0x09},
+	{0x337e, 0x00},
+	{0x3390, 0x08},
+	{0x3391, 0x18},
+	{0x3392, 0x38},
+	{0x3393, 0x09},
+	{0x3394, 0x20},
+	{0x3395, 0x20},
+	{0x33a2, 0x07},
+	{0x33ac, 0x04},
+	{0x33ae, 0x14},
+	{0x3614, 0x00},
+	{0x3622, 0x16},
+	{0x3630, 0x68},
+	{0x3631, 0x84},
+	{0x3637, 0x25},
+	{0x363a, 0x1f},
+	{0x363c, 0x0e},
+	{0x3670, 0x0e},
+	{0x3674, 0xb1},
+	{0x3675, 0x41},
+	{0x3676, 0x9c},
+	{0x3677, 0x84},
+	{0x3678, 0x85},
+	{0x3679, 0x87},
+	{0x367c, 0x18},
+	{0x367d, 0x38},
+	{0x367e, 0x08},
+	{0x367f, 0x18},
+	{0x3690, 0x32},
+	{0x3691, 0x32},
+	{0x3692, 0x44},
+	{0x369c, 0x08},
+	{0x369d, 0x38},
+	{0x3908, 0x82},
+	{0x391f, 0x18},
+	{0x3e01, 0x8c},
+	{0x3e02, 0x00},
+	{0x3f00, 0x0d},
+	{0x3f04, 0x02},
+	{0x3f05, 0x0e},
+	{0x3f09, 0x48},
+	{0x4505, 0x0a},
+	{0x4509, 0x20},
+	{0x481d, 0x0a},
+	{0x4827, 0x03},
+	{0x5787, 0x10},
+	{0x5788, 0x06},
+	{0x578a, 0x10},
+	{0x578b, 0x06},
+	{0x5790, 0x10},
+	{0x5791, 0x10},
+	{0x5792, 0x00},
+	{0x5793, 0x10},
+	{0x5794, 0x10},
+	{0x5795, 0x00},
+	{0x5799, 0x00},
+	{0x57c7, 0x10},
+	{0x57c8, 0x06},
+	{0x57ca, 0x10},
+	{0x57cb, 0x06},
+	{0x57d1, 0x10},
+	{0x57d4, 0x10},
+	{0x57d9, 0x00},
+	{0x59e0, 0x60},
+	{0x59e1, 0x08},
+	{0x59e2, 0x3f},
+	{0x59e3, 0x18},
+	{0x59e4, 0x18},
+	{0x59e5, 0x3f},
+	{0x59e6, 0x06},
+	{0x59e7, 0x02},
+	{0x59e8, 0x38},
+	{0x59e9, 0x10},
+	{0x59ea, 0x0c},
+	{0x59eb, 0x10},
+	{0x59ec, 0x04},
+	{0x59ed, 0x02},
+	{0x59ee, 0xa0},
+	{0x59ef, 0x08},
+	{0x59f4, 0x18},
+	{0x59f5, 0x10},
+	{0x59f6, 0x0c},
+	{0x59f7, 0x10},
+	{0x59f8, 0x06},
+	{0x59f9, 0x02},
+	{0x59fa, 0x18},
+	{0x59fb, 0x10},
+	{0x59fc, 0x0c},
+	{0x59fd, 0x10},
+	{0x59fe, 0x04},
+	{0x59ff, 0x02},
+	{0x36e9, 0x20},
+	{0x36f9, 0x27},
+	{0x0100, 0x01},
+	{DELAY_MS, 0x0a},
+	{REG_NULL, 0x00},
+};
+
+static const struct sc2335_mode supported_modes[] = {
+	{
+		.width = 1920,
+		.height = 1080,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x0400,
+		.hts_def = 0x44C * 2,
+		.vts_def = 0x0465,
+		.hdr_mode = NO_HDR,
+		.reg_list = sc2335_1920x1080_regs_2lane,
+		.freq_idx = 1,
+		.lanes = 2,
+		.bpp = 10,
+	},
+	{
+		.width = 1920,
+		.height = 1080,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x0400,
+		.hts_def = 0x44C * 2,
+		.vts_def = 0x0465,
+		.hdr_mode = NO_HDR,
+		.reg_list = sc2335_1920x1080_regs_1lane,
+		.freq_idx = 0,
+		.lanes = 1,
+		.bpp = 10,
+	}
+};
+
+static const char * const sc2335_test_pattern_menu[] = {
+	"Disabled",
+	"Vertical Color Bar Type 1",
+	"Vertical Color Bar Type 2",
+	"Vertical Color Bar Type 3",
+	"Vertical Color Bar Type 4"
+};
+
+static const s64 link_freq_menu_items[] = {
+	SC2335_LINK_FREQ_186M,
+	SC2335_LINK_FREQ_371M
+};
+
+/* Write registers up to 4 at a time */
+static int sc2335_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;
+	u32 ret;
+
+	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++];
+
+	ret = i2c_master_send(client, buf, len + 2);
+	if (ret != len + 2)
+		return -EIO;
+
+	return 0;
+}
+
+static int sc2335_write_array(struct i2c_client *client,
+	const struct regval *regs)
+{
+	u32 i;
+	int delay_ms = 0, ret = 0;
+
+	for (i = 0; ret == 0 && regs[i].addr != REG_NULL; i++) {
+		if (regs[i].addr == DELAY_MS) {
+			delay_ms = regs[i].val;
+			dev_info(&client->dev, "delay(%d) ms !\n", delay_ms);
+			usleep_range(1000 * delay_ms, 1000 * delay_ms + 100);
+			continue;
+		}
+		ret = sc2335_write_reg(client, regs[i].addr,
+				       SC2335_REG_VALUE_08BIT, regs[i].val);
+	}
+	return ret;
+}
+
+/* Read registers up to 4 at a time */
+static int sc2335_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 *)&reg_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 sc2335_get_reso_dist(const struct sc2335_mode *mode,
+	struct v4l2_mbus_framefmt *framefmt)
+{
+	return abs(mode->width - framefmt->width) +
+	       abs(mode->height - framefmt->height);
+}
+
+static const struct sc2335_mode *
+sc2335_find_best_fit(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 < ARRAY_SIZE(supported_modes); i++) {
+		dist = sc2335_get_reso_dist(&supported_modes[i], framefmt);
+		if (cur_best_fit_dist == -1 || dist < cur_best_fit_dist) {
+			cur_best_fit_dist = dist;
+			cur_best_fit = i;
+		}
+	}
+
+	return &supported_modes[cur_best_fit];
+}
+
+static int sc2335_set_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct sc2335 *sc2335 = to_sc2335(sd);
+	const struct sc2335_mode *mode;
+	s64 h_blank, vblank_def;
+	s32 dst_link_freq = 0;
+	s64 dst_pixel_rate = 0;
+
+	mutex_lock(&sc2335->mutex);
+
+	mode = sc2335_find_best_fit(fmt);
+	fmt->format.code = PIX_FORMAT;
+	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(&sc2335->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		sc2335->cur_mode = mode;
+		h_blank = mode->hts_def - mode->width;
+		__v4l2_ctrl_modify_range(sc2335->hblank, h_blank,
+					 h_blank, 1, h_blank);
+		vblank_def = mode->vts_def - mode->height;
+		__v4l2_ctrl_modify_range(sc2335->vblank, vblank_def,
+					 SC2335_VTS_MAX - mode->height,
+					 1, vblank_def);
+		dst_link_freq = mode->freq_idx;
+		dst_pixel_rate = (u32)link_freq_menu_items[mode->freq_idx] /
+						mode->bpp * 2 * mode->lanes;
+		__v4l2_ctrl_s_ctrl_int64(sc2335->pixel_rate,
+					 dst_pixel_rate);
+		__v4l2_ctrl_s_ctrl(sc2335->link_freq,
+				   dst_link_freq);
+		sc2335->cur_vts = mode->vts_def;
+	}
+
+	mutex_unlock(&sc2335->mutex);
+
+	return 0;
+}
+
+static int sc2335_get_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct sc2335 *sc2335 = to_sc2335(sd);
+	const struct sc2335_mode *mode = sc2335->cur_mode;
+
+	mutex_lock(&sc2335->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(&sc2335->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		fmt->format.width = mode->width;
+		fmt->format.height = mode->height;
+		fmt->format.code = PIX_FORMAT;
+		fmt->format.field = V4L2_FIELD_NONE;
+	}
+	mutex_unlock(&sc2335->mutex);
+
+	return 0;
+}
+
+static int sc2335_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 = PIX_FORMAT;
+
+	return 0;
+}
+
+static int sc2335_enum_frame_sizes(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_pad_config *cfg,
+				   struct v4l2_subdev_frame_size_enum *fse)
+{
+	if (fse->index >= ARRAY_SIZE(supported_modes))
+		return -EINVAL;
+
+	if (fse->code != PIX_FORMAT)
+		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;
+
+	return 0;
+}
+
+static int sc2335_enable_test_pattern(struct sc2335 *sc2335, u32 pattern)
+{
+	u32 val = 0;
+	int ret = 0;
+
+	ret = sc2335_read_reg(sc2335->client, SC2335_REG_TEST_PATTERN,
+			       SC2335_REG_VALUE_08BIT, &val);
+	if (pattern)
+		val |= SC2335_TEST_PATTERN_BIT_MASK;
+	else
+		val &= ~SC2335_TEST_PATTERN_BIT_MASK;
+
+	ret |= sc2335_write_reg(sc2335->client, SC2335_REG_TEST_PATTERN,
+				SC2335_REG_VALUE_08BIT, val);
+	return ret;
+}
+
+static void sc2335_get_module_inf(struct sc2335 *sc2335,
+				  struct rkmodule_inf *inf)
+{
+	memset(inf, 0, sizeof(*inf));
+	strscpy(inf->base.sensor, SC2335_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, sc2335->module_name,
+		sizeof(inf->base.module));
+	strscpy(inf->base.lens, sc2335->len_name, sizeof(inf->base.lens));
+}
+
+static long sc2335_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	struct sc2335 *sc2335 = to_sc2335(sd);
+	struct rkmodule_hdr_cfg *hdr;
+	const struct sc2335_mode *mode;
+	u32 i, h, w;
+	long ret = 0;
+	u32  stream;
+	s32 dst_link_freq = 0;
+	s64 dst_pixel_rate = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		sc2335_get_module_inf(sc2335, (struct rkmodule_inf *)arg);
+		break;
+	case RKMODULE_GET_HDR_CFG:
+		hdr = (struct rkmodule_hdr_cfg *)arg;
+		hdr->esp.mode = HDR_NORMAL_VC;
+		hdr->hdr_mode = sc2335->cur_mode->hdr_mode;
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr = (struct rkmodule_hdr_cfg *)arg;
+		w = sc2335->cur_mode->width;
+		h = sc2335->cur_mode->height;
+		for (i = 0; i < ARRAY_SIZE(supported_modes); i++) {
+			if (w == supported_modes[i].width &&
+			    h == supported_modes[i].height &&
+			    supported_modes[i].hdr_mode == hdr->hdr_mode) {
+				sc2335->cur_mode = &supported_modes[i];
+				dev_dbg(&sc2335->client->dev, "cur mode idx=%d\n", i);
+				break;
+			}
+		}
+		if (i == ARRAY_SIZE(supported_modes)) {
+			dev_err(&sc2335->client->dev,
+				"not find hdr mode:%d %dx%d config\n",
+				hdr->hdr_mode, w, h);
+			ret = -EINVAL;
+		} else {
+			mode = sc2335->cur_mode;
+			w = mode->hts_def - mode->width;
+			h = mode->vts_def - mode->height;
+			__v4l2_ctrl_modify_range(sc2335->hblank, w, w, 1, w);
+			__v4l2_ctrl_modify_range(sc2335->vblank, h,
+						 SC2335_VTS_MAX - mode->height, 1, h);
+			dst_link_freq = mode->freq_idx;
+			dst_pixel_rate = (u32)link_freq_menu_items[mode->freq_idx] /
+							mode->bpp * 2 * mode->lanes;
+			__v4l2_ctrl_s_ctrl_int64(sc2335->pixel_rate,
+				dst_pixel_rate);
+			__v4l2_ctrl_s_ctrl(sc2335->link_freq,
+				dst_link_freq);
+			sc2335->cur_vts = mode->vts_def;
+		}
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		stream = *((u32 *)arg);
+
+		if (stream)
+			ret = sc2335_write_reg(sc2335->client, SC2335_REG_CTRL_MODE,
+				SC2335_REG_VALUE_08BIT, SC2335_MODE_STREAMING);
+		else
+			ret = sc2335_write_reg(sc2335->client, SC2335_REG_CTRL_MODE,
+				SC2335_REG_VALUE_08BIT, SC2335_MODE_SW_STANDBY);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+
+#ifdef CONFIG_COMPAT
+static long sc2335_compat_ioctl32(struct v4l2_subdev *sd,
+				  unsigned int cmd, unsigned long arg)
+{
+	void __user *up = compat_ptr(arg);
+	struct rkmodule_inf *inf;
+	struct rkmodule_hdr_cfg *hdr;
+	long ret;
+	u32  stream;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		inf = kzalloc(sizeof(*inf), GFP_KERNEL);
+		if (!inf) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = sc2335_ioctl(sd, cmd, inf);
+		if (!ret) {
+			ret = copy_to_user(up, inf, sizeof(*inf));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(inf);
+		break;
+	case RKMODULE_GET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = sc2335_ioctl(sd, cmd, hdr);
+		if (!ret) {
+			ret = copy_to_user(up, hdr, sizeof(*hdr));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(hdr);
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+		if (copy_from_user(hdr, up, sizeof(*hdr)))
+			return -EFAULT;
+
+		ret = sc2335_ioctl(sd, cmd, hdr);
+		kfree(hdr);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		if (copy_from_user(&stream, up, sizeof(u32)))
+			return -EFAULT;
+
+		ret = sc2335_ioctl(sd, cmd, &stream);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+#endif
+
+static int sc2335_set_ctrl_gain(struct sc2335 *sc2335, u32 a_gain)
+{
+	struct i2c_client *client = sc2335->client;
+	int ret = 0;
+	u32 coarse_again = 0, fine_again = 0;
+	u32 switch_value = 0, gain_ctrl = 0;
+	u32 coarse_dgain = 0, fine_dgain = 0;
+
+	dev_dbg(&client->dev, "set analog gain 0x%x\n", a_gain);
+	if (a_gain < 0x80) { /*1x ~ 2x*/
+		fine_again = a_gain;
+		coarse_again = 0x03;
+		fine_dgain = 0x80;
+		coarse_dgain = 0x00;
+		ret = sc2335_read_reg(client, 0x3040,
+			SC2335_REG_VALUE_08BIT, &gain_ctrl);
+		if (ret)
+			return ret;
+		if (gain_ctrl == 0x40)
+			switch_value = 0x0e;
+		else if (gain_ctrl == 0x41)
+			switch_value = 0x0f;
+		else
+			switch_value = 0x07;
+	} else if (a_gain < 0x100) { /*2x ~ 4x*/
+		fine_again = a_gain >> 1;
+		coarse_again = 0x7;
+		switch_value = 0x07;
+		fine_dgain = 0x80;
+		coarse_dgain = 0x00;
+	} else if (a_gain < 0x200) { /*4x ~ 8x*/
+		fine_again = a_gain >> 2;
+		coarse_again = 0xf;
+		switch_value = 0x07;
+		fine_dgain = 0x80;
+		coarse_dgain = 0x00;
+	} else if (a_gain < 0x400) { /*8x ~ 16x*/
+		fine_again = a_gain >> 3;
+		coarse_again = 0x1f;
+		switch_value = 0x07;
+		fine_dgain = 0x80;
+		coarse_dgain = 0x00;
+	} else if (a_gain < 0x800) { /*16 ~ 32x*/
+		fine_again = 0x7f;
+		coarse_again = 0x1f;
+		switch_value = 0x07;
+		fine_dgain = a_gain >> 3;
+		coarse_dgain = 0x00;
+	} else if (a_gain < 0x1000) { /*32 ~ 64*/
+		fine_again = 0x7f;
+		coarse_again = 0x1f;
+		switch_value = 0x07;
+		fine_dgain = a_gain >> 4;
+		coarse_dgain = 0x01;
+	} else if (a_gain < 0x2000) { /*64 ~ 128*/
+		fine_again = 0x7f;
+		coarse_again = 0x1f;
+		switch_value = 0x07;
+		fine_dgain = a_gain >> 5;
+		coarse_dgain = 0x03;
+	} else if (a_gain < 0x4000) { /*128 ~ 256*/
+		fine_again = 0x7f;
+		coarse_again = 0x1f;
+		switch_value = 0x07;
+		fine_dgain = a_gain >> 6;
+		coarse_dgain = 0x07;
+	} else if (a_gain < 0x8000) { /*256 ~ 504*/
+		fine_again = 0x7f;
+		coarse_again = 0x1f;
+		switch_value = 0x07;
+		fine_dgain = a_gain >> 7;
+		coarse_dgain = 0x0f;
+	}
+	dev_dbg(&client->dev, "set fine_again = 0x%x, coarse_again = 0x%x, coarse_dgain=0x%x, fine_dgain=0x%x\n",
+			fine_again, coarse_again, coarse_dgain, fine_dgain);
+	ret = sc2335_write_reg(sc2335->client, 0x363c,
+		SC2335_REG_VALUE_08BIT, switch_value);
+	ret |= sc2335_write_reg(sc2335->client,
+		SC2335_REG_COARSE_AGAIN,
+		SC2335_REG_VALUE_08BIT,
+		coarse_again);
+	ret |= sc2335_write_reg(sc2335->client,
+		SC2335_REG_FINE_AGAIN,
+		SC2335_REG_VALUE_08BIT,
+		fine_again);
+	ret |= sc2335_write_reg(sc2335->client,
+		SC2335_REG_COARSE_DGAIN,
+		SC2335_REG_VALUE_08BIT,
+		coarse_dgain);
+	ret |= sc2335_write_reg(sc2335->client,
+		SC2335_REG_FINE_DGAIN,
+		SC2335_REG_VALUE_08BIT,
+		fine_dgain);
+	return ret;
+}
+
+static int __sc2335_start_stream(struct sc2335 *sc2335)
+{
+	int ret;
+
+	ret = sc2335_write_array(sc2335->client, sc2335->cur_mode->reg_list);
+	if (ret)
+		return ret;
+
+	/* In case these controls are set before streaming */
+	mutex_unlock(&sc2335->mutex);
+	ret = v4l2_ctrl_handler_setup(&sc2335->ctrl_handler);
+	mutex_lock(&sc2335->mutex);
+	if (ret)
+		return ret;
+
+	return sc2335_write_reg(sc2335->client, SC2335_REG_CTRL_MODE,
+			SC2335_REG_VALUE_08BIT, SC2335_MODE_STREAMING);
+}
+
+static int __sc2335_stop_stream(struct sc2335 *sc2335)
+{
+	return sc2335_write_reg(sc2335->client, SC2335_REG_CTRL_MODE,
+			SC2335_REG_VALUE_08BIT, SC2335_MODE_SW_STANDBY);
+}
+
+static int sc2335_s_stream(struct v4l2_subdev *sd, int on)
+{
+	struct sc2335 *sc2335 = to_sc2335(sd);
+	struct i2c_client *client = sc2335->client;
+	int ret = 0;
+
+	dev_info(&client->dev, "%s: on: %d, %dx%d@%d\n", __func__, on,
+				sc2335->cur_mode->width,
+				sc2335->cur_mode->height,
+		DIV_ROUND_CLOSEST(sc2335->cur_mode->max_fps.denominator,
+				  sc2335->cur_mode->max_fps.numerator));
+
+	mutex_lock(&sc2335->mutex);
+	on = !!on;
+	if (on == sc2335->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 = __sc2335_start_stream(sc2335);
+		if (ret) {
+			v4l2_err(sd, "start stream failed while write regs\n");
+			pm_runtime_put(&client->dev);
+			goto unlock_and_return;
+		}
+	} else {
+		__sc2335_stop_stream(sc2335);
+		pm_runtime_put(&client->dev);
+	}
+
+	sc2335->streaming = on;
+
+unlock_and_return:
+	mutex_unlock(&sc2335->mutex);
+
+	return ret;
+}
+
+static int sc2335_g_frame_interval(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_frame_interval *fi)
+{
+	struct sc2335 *sc2335 = to_sc2335(sd);
+	const struct sc2335_mode *mode = sc2335->cur_mode;
+
+	mutex_lock(&sc2335->mutex);
+	fi->interval = mode->max_fps;
+	mutex_unlock(&sc2335->mutex);
+
+	return 0;
+}
+
+static int sc2335_s_power(struct v4l2_subdev *sd, int on)
+{
+	struct sc2335 *sc2335 = to_sc2335(sd);
+	struct i2c_client *client = sc2335->client;
+	int ret = 0;
+
+	mutex_lock(&sc2335->mutex);
+
+	/* If the power state is not modified - no work to do. */
+	if (sc2335->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;
+		}
+		ret = sc2335_write_array(sc2335->client, sc2335_global_regs);
+		if (ret) {
+			v4l2_err(sd, "could not set init registers\n");
+			pm_runtime_put_noidle(&client->dev);
+			goto unlock_and_return;
+		}
+		sc2335->power_on = true;
+	} else {
+		pm_runtime_put(&client->dev);
+		sc2335->power_on = false;
+	}
+
+unlock_and_return:
+	mutex_unlock(&sc2335->mutex);
+
+	return ret;
+}
+
+/* Calculate the delay in us by clock rate and clock cycles */
+static inline u32 sc2335_cal_delay(u32 cycles)
+{
+	return DIV_ROUND_UP(cycles, SC2335_XVCLK_FREQ / 1000 / 1000);
+}
+
+static int __sc2335_power_on(struct sc2335 *sc2335)
+{
+	int ret;
+	u32 delay_us;
+	struct device *dev = &sc2335->client->dev;
+
+	if (!IS_ERR_OR_NULL(sc2335->pins_default)) {
+		ret = pinctrl_select_state(sc2335->pinctrl,
+					   sc2335->pins_default);
+		if (ret < 0)
+			dev_err(dev, "could not set pins\n");
+	}
+
+	ret = clk_set_rate(sc2335->xvclk, SC2335_XVCLK_FREQ);
+	if (ret < 0)
+		dev_warn(dev, "Failed to set xvclk rate (24MHz)\n");
+	if (clk_get_rate(sc2335->xvclk) != SC2335_XVCLK_FREQ)
+		dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n");
+	ret = clk_prepare_enable(sc2335->xvclk);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable xvclk\n");
+		return ret;
+	}
+
+	if (!IS_ERR(sc2335->power_gpio))
+		gpiod_set_value_cansleep(sc2335->power_gpio, 1);
+
+	if (!IS_ERR(sc2335->reset_gpio))
+		gpiod_set_value_cansleep(sc2335->reset_gpio, 0);
+
+	ret = regulator_bulk_enable(SC2335_NUM_SUPPLIES, sc2335->supplies);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable regulators\n");
+		goto disable_clk;
+	}
+
+	if (!IS_ERR(sc2335->reset_gpio))
+		gpiod_set_value_cansleep(sc2335->reset_gpio, 1);
+
+	if (!IS_ERR(sc2335->pwdn_gpio))
+		gpiod_set_value_cansleep(sc2335->pwdn_gpio, 1);
+
+	/* 8192 cycles prior to first SCCB transaction */
+	delay_us = sc2335_cal_delay(8192);
+	usleep_range(delay_us, delay_us * 2);
+	return 0;
+
+disable_clk:
+	clk_disable_unprepare(sc2335->xvclk);
+
+	return ret;
+}
+
+static void __sc2335_power_off(struct sc2335 *sc2335)
+{
+	if (!IS_ERR(sc2335->pwdn_gpio))
+		gpiod_set_value_cansleep(sc2335->pwdn_gpio, 0);
+	clk_disable_unprepare(sc2335->xvclk);
+	if (!IS_ERR(sc2335->reset_gpio))
+		gpiod_set_value_cansleep(sc2335->reset_gpio, 0);
+
+	if (!IS_ERR(sc2335->power_gpio))
+		gpiod_set_value_cansleep(sc2335->power_gpio, 0);
+
+	regulator_bulk_disable(SC2335_NUM_SUPPLIES, sc2335->supplies);
+}
+
+static int sc2335_runtime_resume(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct sc2335 *sc2335 = to_sc2335(sd);
+
+	return __sc2335_power_on(sc2335);
+}
+
+static int sc2335_runtime_suspend(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct sc2335 *sc2335 = to_sc2335(sd);
+
+	__sc2335_power_off(sc2335);
+
+	return 0;
+}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static int sc2335_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
+{
+	struct sc2335 *sc2335 = to_sc2335(sd);
+	struct v4l2_mbus_framefmt *try_fmt =
+				v4l2_subdev_get_try_format(sd, fh->pad, 0);
+	const struct sc2335_mode *def_mode = &supported_modes[0];
+
+	mutex_lock(&sc2335->mutex);
+	/* Initialize try_fmt */
+	try_fmt->width = def_mode->width;
+	try_fmt->height = def_mode->height;
+	try_fmt->code = PIX_FORMAT;
+	try_fmt->field = V4L2_FIELD_NONE;
+
+	mutex_unlock(&sc2335->mutex);
+	/* No crop or compose */
+
+	return 0;
+}
+#endif
+
+static int sc2335_g_mbus_config(struct v4l2_subdev *sd,
+				 struct v4l2_mbus_config *config)
+{
+	struct sc2335 *sc2335 = to_sc2335(sd);
+	u32 val = 0;
+
+	val = 1 << (sc2335->cur_mode->lanes - 1) |
+		V4L2_MBUS_CSI2_CHANNEL_0 |
+		V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
+
+	config->type = V4L2_MBUS_CSI2;
+	config->flags = val;
+
+	return 0;
+}
+
+static int sc2335_enum_frame_interval(struct v4l2_subdev *sd,
+				      struct v4l2_subdev_pad_config *cfg,
+				      struct v4l2_subdev_frame_interval_enum *fie)
+{
+	if (fie->index >= ARRAY_SIZE(supported_modes))
+		return -EINVAL;
+
+	if (fie->code != PIX_FORMAT)
+		return -EINVAL;
+
+	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;
+
+	return 0;
+}
+
+static const struct dev_pm_ops sc2335_pm_ops = {
+	SET_RUNTIME_PM_OPS(sc2335_runtime_suspend,
+			   sc2335_runtime_resume, NULL)
+};
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static const struct v4l2_subdev_internal_ops sc2335_internal_ops = {
+	.open = sc2335_open,
+};
+#endif
+
+static const struct v4l2_subdev_core_ops sc2335_core_ops = {
+	.s_power = sc2335_s_power,
+	.ioctl = sc2335_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = sc2335_compat_ioctl32,
+#endif
+};
+
+static const struct v4l2_subdev_video_ops sc2335_video_ops = {
+	.s_stream = sc2335_s_stream,
+	.g_frame_interval = sc2335_g_frame_interval,
+	.g_mbus_config = sc2335_g_mbus_config,
+};
+
+static const struct v4l2_subdev_pad_ops sc2335_pad_ops = {
+	.enum_mbus_code = sc2335_enum_mbus_code,
+	.enum_frame_size = sc2335_enum_frame_sizes,
+	.enum_frame_interval = sc2335_enum_frame_interval,
+	.get_fmt = sc2335_get_fmt,
+	.set_fmt = sc2335_set_fmt,
+};
+
+static const struct v4l2_subdev_ops sc2335_subdev_ops = {
+	.core	= &sc2335_core_ops,
+	.video	= &sc2335_video_ops,
+	.pad	= &sc2335_pad_ops,
+};
+
+static int sc2335_set_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct sc2335 *sc2335 = container_of(ctrl->handler,
+					     struct sc2335, ctrl_handler);
+	struct i2c_client *client = sc2335->client;
+	s64 max;
+	int ret = 0;
+	u32 val;
+
+	dev_dbg(&client->dev, "ctrl->id(0x%x) val 0x%x\n",
+		ctrl->id, ctrl->val);
+	/* Propagate change of current control to all related controls */
+	switch (ctrl->id) {
+	case V4L2_CID_VBLANK:
+		/* Update max exposure while meeting expected vblanking */
+		max = sc2335->cur_mode->height + ctrl->val - 4;
+		__v4l2_ctrl_modify_range(sc2335->exposure,
+					 sc2335->exposure->minimum, max,
+					 sc2335->exposure->step,
+					 sc2335->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 = sc2335_write_reg(sc2335->client, SC2335_REG_EXPOSURE,
+				       SC2335_REG_VALUE_24BIT, ctrl->val << 5);
+		dev_dbg(&client->dev, "set exposure 0x%x\n",
+			ctrl->val);
+		break;
+	case V4L2_CID_ANALOGUE_GAIN:
+		ret = sc2335_set_ctrl_gain(sc2335, ctrl->val);
+		dev_dbg(&client->dev, "set analog gain 0x%x\n",
+			ctrl->val);
+		break;
+	case V4L2_CID_VBLANK:
+		ret = sc2335_write_reg(sc2335->client, SC2335_REG_VTS,
+				       SC2335_REG_VALUE_16BIT,
+				       ctrl->val + sc2335->cur_mode->height);
+		break;
+	case V4L2_CID_TEST_PATTERN:
+		ret = sc2335_enable_test_pattern(sc2335, ctrl->val);
+		break;
+	case V4L2_CID_HFLIP:
+		ret = sc2335_read_reg(sc2335->client, SC2335_REG_FLIP_MIRROR,
+				       SC2335_REG_VALUE_08BIT, &val);
+		if (ret)
+			break;
+		if (ctrl->val)
+			val |= SC2335_MIRROR_MASK;
+		else
+			val &= ~SC2335_MIRROR_MASK;
+		ret |= sc2335_write_reg(sc2335->client, SC2335_REG_FLIP_MIRROR,
+			SC2335_REG_VALUE_08BIT, val);
+		break;
+	case V4L2_CID_VFLIP:
+		ret = sc2335_read_reg(sc2335->client, SC2335_REG_FLIP_MIRROR,
+				       SC2335_REG_VALUE_08BIT, &val);
+		if (ret)
+			break;
+		if (ctrl->val)
+			val |= SC2335_FLIP_MASK;
+		else
+			val &= ~SC2335_FLIP_MASK;
+		ret |= sc2335_write_reg(sc2335->client, SC2335_REG_FLIP_MIRROR,
+			SC2335_REG_VALUE_08BIT, 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 sc2335_ctrl_ops = {
+	.s_ctrl = sc2335_set_ctrl,
+};
+
+static int sc2335_initialize_controls(struct sc2335 *sc2335)
+{
+	const struct sc2335_mode *mode;
+	struct v4l2_ctrl_handler *handler;
+	s64 exposure_max, vblank_def;
+	u32 h_blank;
+	int ret;
+	s32 dst_link_freq = 0;
+	s64 dst_pixel_rate = 0;
+
+	handler = &sc2335->ctrl_handler;
+	mode = sc2335->cur_mode;
+	ret = v4l2_ctrl_handler_init(handler, 8);
+	if (ret)
+		return ret;
+	handler->lock = &sc2335->mutex;
+
+	sc2335->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, V4L2_CID_LINK_FREQ,
+				      0, 0, link_freq_menu_items);
+
+	dst_link_freq = mode->freq_idx;
+	dst_pixel_rate = (u32)link_freq_menu_items[mode->freq_idx] / mode->bpp * 2 * mode->lanes;
+	__v4l2_ctrl_s_ctrl(sc2335->link_freq,
+			   dst_link_freq);
+	v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE,
+			  0, SC2335_PIXEL_RATE_TWO_LANES, 1, dst_pixel_rate);
+
+	h_blank = mode->hts_def - mode->width;
+	sc2335->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
+				h_blank, h_blank, 1, h_blank);
+	if (sc2335->hblank)
+		sc2335->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+	sc2335->cur_vts = mode->vts_def;
+	vblank_def = mode->vts_def - mode->height;
+	sc2335->vblank = v4l2_ctrl_new_std(handler, &sc2335_ctrl_ops,
+				V4L2_CID_VBLANK, vblank_def,
+				SC2335_VTS_MAX - mode->height,
+				1, vblank_def);
+
+	exposure_max = mode->vts_def - 4;
+	sc2335->exposure = v4l2_ctrl_new_std(handler, &sc2335_ctrl_ops,
+				V4L2_CID_EXPOSURE, SC2335_EXPOSURE_MIN,
+				exposure_max, SC2335_EXPOSURE_STEP,
+				mode->exp_def);
+
+	sc2335->anal_gain = v4l2_ctrl_new_std(handler, &sc2335_ctrl_ops,
+				V4L2_CID_ANALOGUE_GAIN, ANALOG_GAIN_MIN,
+				ANALOG_GAIN_MAX, ANALOG_GAIN_STEP,
+				ANALOG_GAIN_DEFAULT);
+
+	sc2335->test_pattern = v4l2_ctrl_new_std_menu_items(handler,
+				&sc2335_ctrl_ops, V4L2_CID_TEST_PATTERN,
+				ARRAY_SIZE(sc2335_test_pattern_menu) - 1,
+				0, 0, sc2335_test_pattern_menu);
+	sc2335->h_flip = v4l2_ctrl_new_std(handler, &sc2335_ctrl_ops,
+					   V4L2_CID_HFLIP, 0, 1, 1, 0);
+
+	sc2335->v_flip = v4l2_ctrl_new_std(handler, &sc2335_ctrl_ops,
+					   V4L2_CID_VFLIP, 0, 1, 1, 0);
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(&sc2335->client->dev,
+			"Failed to init controls(%d)\n", ret);
+		goto err_free_handler;
+	}
+
+	sc2335->subdev.ctrl_handler = handler;
+	return 0;
+
+err_free_handler:
+	v4l2_ctrl_handler_free(handler);
+
+	return ret;
+}
+
+static int sc2335_check_sensor_id(struct sc2335 *sc2335,
+				  struct i2c_client *client)
+{
+	struct device *dev = &sc2335->client->dev;
+	u32 id = 0;
+	int ret;
+
+	ret = sc2335_read_reg(client, SC2335_REG_CHIP_ID,
+			      SC2335_REG_VALUE_16BIT, &id);
+	if (id != CHIP_ID) {
+		dev_err(dev, "Unexpected sensor id(%04x), ret(%d)\n", id, ret);
+		return -ENODEV;
+	}
+
+	dev_info(dev, "Detected SC2335 CHIP ID = 0x%04x sensor\n", CHIP_ID);
+
+	return 0;
+}
+
+static int sc2335_configure_regulators(struct sc2335 *sc2335)
+{
+	unsigned int i;
+
+	for (i = 0; i < SC2335_NUM_SUPPLIES; i++)
+		sc2335->supplies[i].supply = sc2335_supply_names[i];
+
+	return devm_regulator_bulk_get(&sc2335->client->dev,
+				       SC2335_NUM_SUPPLIES,
+				       sc2335->supplies);
+}
+
+static int sc2335_probe(struct i2c_client *client,
+			const struct i2c_device_id *id)
+{
+	struct device *dev = &client->dev;
+	struct device_node *node = dev->of_node;
+	struct device_node *endpoint;
+	struct sc2335 *sc2335;
+	struct v4l2_subdev *sd;
+	char facing[2];
+	int ret;
+
+	dev_info(dev, "driver version: %02x.%02x.%02x",
+		DRIVER_VERSION >> 16,
+		(DRIVER_VERSION & 0xff00) >> 8,
+		DRIVER_VERSION & 0x00ff);
+
+	sc2335 = devm_kzalloc(dev, sizeof(*sc2335), GFP_KERNEL);
+	if (!sc2335)
+		return -ENOMEM;
+
+	ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
+				   &sc2335->module_index);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
+				       &sc2335->module_facing);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME,
+				       &sc2335->module_name);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME,
+				       &sc2335->len_name);
+	if (ret) {
+		dev_err(dev, "could not get module information!\n");
+		return -EINVAL;
+	}
+
+	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),
+		&sc2335->bus_cfg);
+	if (ret) {
+		dev_err(dev, "Failed to pasrse endpoint\n");
+		return -EINVAL;
+	}
+
+	if (sc2335->bus_cfg.bus.mipi_csi1.data_lane == 1)
+		sc2335->cur_mode = &supported_modes[1];
+	else
+		sc2335->cur_mode = &supported_modes[0];
+
+	sc2335->client = client;
+
+	sc2335->xvclk = devm_clk_get(dev, "xvclk");
+	if (IS_ERR(sc2335->xvclk)) {
+		dev_err(dev, "Failed to get xvclk\n");
+		return -EINVAL;
+	}
+	sc2335->pinctrl = devm_pinctrl_get(dev);
+	if (!IS_ERR(sc2335->pinctrl)) {
+		sc2335->pins_default =
+			pinctrl_lookup_state(sc2335->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_DEFAULT);
+		if (IS_ERR(sc2335->pins_default))
+			dev_err(dev, "could not get default pinstate\n");
+
+	} else {
+		dev_err(dev, "no pinctrl\n");
+	}
+
+	sc2335->power_gpio = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW);
+	if (IS_ERR(sc2335->power_gpio))
+		dev_warn(dev, "Failed to get power-gpios\n");
+
+	sc2335->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+	if (IS_ERR(sc2335->reset_gpio))
+		dev_warn(dev, "Failed to get reset-gpios\n");
+
+	sc2335->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW);
+	if (IS_ERR(sc2335->pwdn_gpio))
+		dev_warn(dev, "Failed to get pwdn-gpios\n");
+	ret = sc2335_configure_regulators(sc2335);
+	if (ret) {
+		dev_err(dev, "Failed to get power regulators\n");
+		return ret;
+	}
+
+	mutex_init(&sc2335->mutex);
+
+	sd = &sc2335->subdev;
+	v4l2_i2c_subdev_init(sd, client, &sc2335_subdev_ops);
+	ret = sc2335_initialize_controls(sc2335);
+	if (ret)
+		goto err_destroy_mutex;
+
+	ret = __sc2335_power_on(sc2335);
+	if (ret)
+		goto err_free_handler;
+
+	ret = sc2335_check_sensor_id(sc2335, client);
+	if (ret)
+		goto err_power_off;
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+	sd->internal_ops = &sc2335_internal_ops;
+	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
+		     V4L2_SUBDEV_FL_HAS_EVENTS;
+#endif
+
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	sc2335->pad.flags = MEDIA_PAD_FL_SOURCE;
+	sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
+	ret = media_entity_pads_init(&sd->entity, 1, &sc2335->pad);
+	if (ret < 0)
+		goto err_power_off;
+#endif
+
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(sc2335->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s",
+		 sc2335->module_index, facing,
+		 SC2335_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:
+	__sc2335_power_off(sc2335);
+err_free_handler:
+	v4l2_ctrl_handler_free(&sc2335->ctrl_handler);
+err_destroy_mutex:
+	mutex_destroy(&sc2335->mutex);
+
+	return ret;
+}
+
+static int sc2335_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct sc2335 *sc2335 = to_sc2335(sd);
+
+	v4l2_async_unregister_subdev(sd);
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	media_entity_cleanup(&sd->entity);
+#endif
+	v4l2_ctrl_handler_free(&sc2335->ctrl_handler);
+	mutex_destroy(&sc2335->mutex);
+
+	pm_runtime_disable(&client->dev);
+	if (!pm_runtime_status_suspended(&client->dev))
+		__sc2335_power_off(sc2335);
+	pm_runtime_set_suspended(&client->dev);
+
+	return 0;
+}
+
+#if IS_ENABLED(CONFIG_OF)
+static const struct of_device_id sc2335_of_match[] = {
+	{ .compatible = "smartsens,sc2335" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, sc2335_of_match);
+#endif
+
+static const struct i2c_device_id sc2335_match_id[] = {
+	{ "smartsens,sc2335", 0 },
+	{ },
+};
+
+static struct i2c_driver sc2335_i2c_driver = {
+	.driver = {
+		.name = SC2335_NAME,
+		.pm = &sc2335_pm_ops,
+		.of_match_table = of_match_ptr(sc2335_of_match),
+	},
+	.probe		= &sc2335_probe,
+	.remove		= &sc2335_remove,
+	.id_table	= sc2335_match_id,
+};
+
+static int __init sensor_mod_init(void)
+{
+	return i2c_add_driver(&sc2335_i2c_driver);
+}
+
+static void __exit sensor_mod_exit(void)
+{
+	i2c_del_driver(&sc2335_i2c_driver);
+}
+
+device_initcall_sync(sensor_mod_init);
+module_exit(sensor_mod_exit);
+
+MODULE_DESCRIPTION("Smartsens sc2335 sensor driver");
+MODULE_AUTHOR("zack.zeng");
+MODULE_LICENSE("GPL v2");

commit 19757da2a2d4905d043040134f858be13670e896
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Wed May 12 16:16:50 2021 +0800

    media: rockchip: isp: separate rdbk from csi subdev
    
    Change-Id: I8c5f42c7d5526634e49b2934fb28026702de17c9
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/bridge.c b/drivers/media/platform/rockchip/isp/bridge.c
index 2cf375e36aa2..f4e38f996e9a 100644
--- a/drivers/media/platform/rockchip/isp/bridge.c
+++ b/drivers/media/platform/rockchip/isp/bridge.c
@@ -973,7 +973,7 @@ static void crop_on(struct rkisp_bridge_device *dev)
 	u32 ctrl = CIF_DUAL_CROP_CFG_UPD;
 
 	if (ispdev->isp_ver == ISP_V20 &&
-	    ispdev->csi_dev.rd_mode == HDR_RDBK_FRAME1 &&
+	    ispdev->rd_mode == HDR_RDBK_FRAME1 &&
 	    ispdev->isp_sdev.in_fmt.fmt_type == FMT_BAYER)
 		src_h += RKMODULE_EXTEND_LINE;
 
diff --git a/drivers/media/platform/rockchip/isp/capture_v20.c b/drivers/media/platform/rockchip/isp/capture_v20.c
index e4e6adbe2e0e..16cfc6861e8b 100644
--- a/drivers/media/platform/rockchip/isp/capture_v20.c
+++ b/drivers/media/platform/rockchip/isp/capture_v20.c
@@ -565,7 +565,7 @@ static int rkisp_stream_config_dcrop(struct rkisp_stream *stream, bool async)
 	src_h = input_win->height;
 
 	if (dev->isp_ver == ISP_V20 &&
-	    dev->csi_dev.rd_mode == HDR_RDBK_FRAME1 &&
+	    dev->rd_mode == HDR_RDBK_FRAME1 &&
 	    dev->isp_sdev.in_fmt.fmt_type == FMT_BAYER &&
 	    dev->isp_sdev.out_fmt.fmt_type == FMT_YUV)
 		src_h += RKMODULE_EXTEND_LINE;
@@ -2239,7 +2239,7 @@ void rkisp_mi_v20_isr(u32 mis_val, struct rkisp_device *dev)
 				end_tx0 = false;
 				end_tx1 = false;
 				end_tx2 = false;
-				rkisp_trigger_read_back(&dev->csi_dev, false, false, false);
+				rkisp_trigger_read_back(dev, false, false, false);
 			}
 		}
 	}
diff --git a/drivers/media/platform/rockchip/isp/capture_v21.c b/drivers/media/platform/rockchip/isp/capture_v21.c
index e07f217d4c97..e9d8a86c869f 100644
--- a/drivers/media/platform/rockchip/isp/capture_v21.c
+++ b/drivers/media/platform/rockchip/isp/capture_v21.c
@@ -1443,7 +1443,7 @@ void rkisp_mi_v21_isr(u32 mis_val, struct rkisp_device *dev)
 			     (dev->hdr.op_mode == HDR_RDBK_FRAME2 && end_tx2 && end_tx0))) {
 				end_tx0 = false;
 				end_tx2 = false;
-				rkisp_trigger_read_back(&dev->csi_dev, false, false, false);
+				rkisp_trigger_read_back(dev, false, false, false);
 			}
 		}
 	}
diff --git a/drivers/media/platform/rockchip/isp/csi.c b/drivers/media/platform/rockchip/isp/csi.c
index 1058fe524431..7b78c5e316bb 100644
--- a/drivers/media/platform/rockchip/isp/csi.c
+++ b/drivers/media/platform/rockchip/isp/csi.c
@@ -486,250 +486,13 @@ int rkisp_csi_config_patch(struct rkisp_device *dev)
 	if (IS_HDR_RDBK(dev->hdr.op_mode))
 		rkisp_set_bits(dev, CTRL_SWS_CFG, 0, SW_MPIP_DROP_FRM_DIS, true);
 
-	memset(dev->csi_dev.filt_state, 0, sizeof(dev->csi_dev.filt_state));
-	dev->csi_dev.frame_cnt = -1;
-	dev->csi_dev.frame_cnt_x1 = -1;
-	dev->csi_dev.frame_cnt_x2 = -1;
-	dev->csi_dev.frame_cnt_x3 = -1;
-	dev->csi_dev.rd_mode = dev->hdr.op_mode;
-	return ret;
-}
-
-/*
- * for hdr read back mode, rawrd read back data
- * this will update rawrd base addr to shadow.
- */
-void rkisp_trigger_read_back(struct rkisp_csi_device *csi, u8 dma2frm, u32 mode, bool is_try)
-{
-	struct rkisp_device *dev = csi->ispdev;
-	struct rkisp_hw_dev *hw = dev->hw_dev;
-	struct rkisp_isp_params_vdev *params_vdev = &dev->params_vdev;
-	u32 val, cur_frame_id, tmp, rd_mode;
-	bool is_feature_on = hw->is_feature_on;
-	u64 iq_feature = hw->iq_feature;
-	bool is_upd = false, is_3dlut_upd = false;
-
-	hw->cur_dev_id = dev->dev_id;
-	rkisp_dmarx_get_frame(dev, &cur_frame_id, NULL, NULL, true);
-
-	val = 0;
-	if (mode & T_START_X1) {
-		rd_mode = HDR_RDBK_FRAME1;
-	} else if (mode & T_START_X2) {
-		rd_mode = HDR_RDBK_FRAME2;
-		val = SW_HDRMGE_EN | SW_HDRMGE_MODE_FRAMEX2;
-	} else if (mode & T_START_X3) {
-		rd_mode = HDR_RDBK_FRAME3;
-		val = SW_HDRMGE_EN | SW_HDRMGE_MODE_FRAMEX3;
-	} else {
-		rd_mode = csi->rd_mode;
-		val = rkisp_read(dev, ISP_HDRMGE_BASE, false) & 0xf;
-	}
-
-	if (is_feature_on) {
-		if ((ISP2X_MODULE_HDRMGE & ~iq_feature) && (val & SW_HDRMGE_EN)) {
-			v4l2_err(&dev->v4l2_dev, "hdrmge is not supported\n");
-			return;
-		}
-	}
-
-	tmp = rkisp_read(dev, ISP_HDRMGE_BASE, false) & 0xf;
-	if (val != tmp) {
-		rkisp_write(dev, ISP_HDRMGE_BASE, val, false);
-		dev->skip_frame = 2;
-		is_upd = true;
-	}
-	if (dev->isp_ver == ISP_V20 && dev->dmarx_dev.trigger == T_MANUAL && !is_try) {
-		if (csi->rd_mode != rd_mode && dev->br_dev.en) {
-			tmp = dev->isp_sdev.in_crop.height;
-			val = rkisp_read(dev, CIF_DUAL_CROP_CTRL, false);
-			if (rd_mode == HDR_RDBK_FRAME1) {
-				val |= CIF_DUAL_CROP_MP_MODE_YUV;
-				tmp += RKMODULE_EXTEND_LINE;
-			} else {
-				val &= ~CIF_DUAL_CROP_MP_MODE_YUV;
-			}
-			rkisp_write(dev, CIF_DUAL_CROP_CTRL, val, false);
-			rkisp_write(dev, CIF_ISP_ACQ_V_SIZE, tmp, false);
-			rkisp_write(dev, CIF_ISP_OUT_V_SIZE, tmp, false);
-		}
-		csi->rd_mode = rd_mode;
-		rkisp_rawrd_set_pic_size(dev,
-			dev->dmarx_dev.stream[RKISP_STREAM_RAWRD2].out_fmt.width,
-			dev->dmarx_dev.stream[RKISP_STREAM_RAWRD2].out_fmt.height);
-	}
-	csi->rd_mode = rd_mode;
-
-	/* configure hdr params in rdbk mode */
-	if (is_upd)
-		rkisp_params_first_cfg(&dev->params_vdev,
-				       &dev->isp_sdev.in_fmt,
-				       dev->isp_sdev.quantization);
-	rkisp_params_cfg(params_vdev, cur_frame_id);
-
-	if (!hw->is_single && !is_try) {
-		rkisp_update_regs(dev, CTRL_VI_ISP_PATH, SUPER_IMP_COLOR_CR);
-		rkisp_update_regs(dev, DUAL_CROP_M_H_OFFS, DUAL_CROP_S_V_SIZE);
-		rkisp_update_regs(dev, ISP_ACQ_PROP, DUAL_CROP_CTRL);
-		rkisp_update_regs(dev, MAIN_RESIZE_SCALE_HY, MI_WR_CTRL);
-		rkisp_update_regs(dev, SELF_RESIZE_SCALE_HY, MAIN_RESIZE_CTRL);
-		rkisp_update_regs(dev, ISP_GAMMA_OUT_CTRL, SELF_RESIZE_CTRL);
-		rkisp_update_regs(dev, MI_RD_CTRL2, ISP_LSC_CTRL);
-		rkisp_update_regs(dev, MI_MP_WR_Y_BASE, MI_MP_WR_Y_LLENGTH);
-		rkisp_update_regs(dev, ISP_LSC_XGRAD_01, ISP_RAWAWB_RAM_DATA);
-		if (dev->isp_ver == ISP_V20 &&
-		    (rkisp_read(dev, ISP_DHAZ_CTRL, false) & ISP_DHAZ_ENMUX ||
-		     rkisp_read(dev, ISP_HDRTMO_CTRL, false) & ISP_HDRTMO_EN)) {
-			dma2frm += (dma2frm ? 0 : 1);
-		} else if (dev->isp_ver == ISP_V21) {
-			val = rkisp_read(dev, MI_WR_CTRL2, false);
-			rkisp_set_bits(dev, MI_WR_CTRL2, 0, val, true);
-			rkisp_write(dev, MI_WR_INIT, ISP21_SP_FORCE_UPD | ISP21_MP_FORCE_UPD, true);
-			/* sensor mode & index */
-			rkisp_set_bits(dev, ISP_ACQ_H_OFFS, ISP21_SENSOR_MODE(3) | ISP21_SENSOR_INDEX(3),
-				       ISP21_SENSOR_MODE(hw->dev_num >= 3 ? 2 : hw->dev_num - 1) |
-				       ISP21_SENSOR_INDEX(dev->dev_id), true);
-		}
-		is_upd = true;
-	}
-
-	if (dev->isp_ver == ISP_V21)
-		dma2frm = 0;
-	if (dma2frm > 2)
-		dma2frm = 2;
-	if (dma2frm == 2)
-		csi->frame_cnt_x3++;
-	else if (dma2frm == 1)
-		csi->frame_cnt_x2++;
-	else
-		csi->frame_cnt_x1++;
-	csi->frame_cnt++;
-
-	rkisp_params_cfgsram(params_vdev);
-	params_vdev->rdbk_times = dma2frm + 1;
-
-	/* read 3d lut at frame end */
-	if (hw->is_single && is_upd &&
-	    rkisp_read_reg_cache(dev, ISP_3DLUT_UPDATE) & 0x1) {
-		rkisp_write(dev, ISP_3DLUT_UPDATE, 0, true);
-		is_3dlut_upd = true;
-	}
-	if (is_upd) {
-		val = rkisp_read(dev, ISP_CTRL, false);
-		val |= CIF_ISP_CTRL_ISP_CFG_UPD;
-		rkisp_write(dev, ISP_CTRL, val, true);
-	}
-	if (is_3dlut_upd)
-		rkisp_write(dev, ISP_3DLUT_UPDATE, 1, true);
-
-	memset(csi->filt_state, 0, sizeof(csi->filt_state));
-	csi->filt_state[CSI_F_VS] = dma2frm;
-
-	val = rkisp_read(dev, CSI2RX_CTRL0, true);
-	val &= ~SW_IBUF_OP_MODE(0xf);
-	tmp = SW_IBUF_OP_MODE(csi->rd_mode);
-	val |= tmp | SW_CSI2RX_EN | SW_DMA_2FRM_MODE(dma2frm);
-	v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev,
-		 "readback frame:%d time:%d 0x%x\n",
-		 cur_frame_id, dma2frm + 1, val);
-	if (!hw->is_shutdown)
-		rkisp_write(dev, CSI2RX_CTRL0, val, true);
-}
-
-static void rkisp_dev_trigger_handle(struct rkisp_device *dev, u32 cmd)
-{
-	struct rkisp_hw_dev *hw = dev->hw_dev;
-	struct rkisp_device *isp = NULL;
-	struct isp2x_csi_trigger t = { 0 };
-	unsigned long lock_flags = 0;
-	int i, times = -1, max = 0, id = 0;
-	int len[DEV_MAX] = { 0 };
-	u32 mode = 0;
-
-	spin_lock_irqsave(&hw->rdbk_lock, lock_flags);
-	if (cmd == T_CMD_END)
-		hw->is_idle = true;
-	if (hw->is_shutdown)
-		hw->is_idle = false;
-	if (!hw->is_idle)
-		goto end;
-	if (hw->monitor.state & ISP_MIPI_ERROR && hw->monitor.is_en)
-		goto end;
-
-	for (i = 0; i < hw->dev_num; i++) {
-		isp = hw->isp[i];
-		if (!(isp->isp_state & ISP_START))
-			continue;
-		rkisp_csi_trigger_event(isp, T_CMD_LEN, &len[i]);
-		if (max < len[i]) {
-			max = len[i];
-			id = i;
-		}
-	}
-
-	if (max) {
-		v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev,
-			 "handle isp%d, trigger fifo len:%d\n",
-			 id, max);
-		isp = hw->isp[id];
-		rkisp_csi_trigger_event(isp, T_CMD_DEQUEUE, &t);
-		isp->dmarx_dev.pre_frame = isp->dmarx_dev.cur_frame;
-		isp->dmarx_dev.cur_frame.id = t.frame_id;
-		isp->dmarx_dev.cur_frame.sof_timestamp = t.sof_timestamp;
-		isp->dmarx_dev.cur_frame.timestamp = t.frame_timestamp;
-		isp->isp_sdev.frm_timestamp = t.sof_timestamp;
-		mode = t.mode;
-		times = t.times;
-		hw->cur_dev_id = id;
-		hw->is_idle = false;
-	}
-end:
-	spin_unlock_irqrestore(&hw->rdbk_lock, lock_flags);
-	if (times >= 0)
-		rkisp_trigger_read_back(&isp->csi_dev, times, mode, false);
-}
-
-/* handle read back event from user or isp idle isr */
-int rkisp_csi_trigger_event(struct rkisp_device *dev, u32 cmd, void *arg)
-{
-	struct rkisp_csi_device *csi = &dev->csi_dev;
-	struct kfifo *fifo = &csi->rdbk_kfifo;
-	struct isp2x_csi_trigger *trigger = NULL;
-	unsigned long lock_flags = 0;
-	int val, ret = 0;
-
-	if (dev->dmarx_dev.trigger != T_MANUAL)
-		return 0;
+	memset(dev->filt_state, 0, sizeof(dev->filt_state));
+	dev->rdbk_cnt = -1;
+	dev->rdbk_cnt_x1 = -1;
+	dev->rdbk_cnt_x2 = -1;
+	dev->rdbk_cnt_x3 = -1;
+	dev->rd_mode = dev->hdr.op_mode;
 
-	spin_lock_irqsave(&csi->rdbk_lock, lock_flags);
-	switch (cmd) {
-	case T_CMD_QUEUE:
-		trigger = arg;
-		if (!trigger)
-			break;
-		if (!kfifo_is_full(fifo))
-			kfifo_in(fifo, trigger, sizeof(*trigger));
-		else
-			v4l2_err(&dev->v4l2_dev, "csi fifo is full\n");
-		break;
-	case T_CMD_DEQUEUE:
-		if (!kfifo_is_empty(fifo))
-			ret = kfifo_out(fifo, arg,
-					sizeof(struct isp2x_csi_trigger));
-		if (!ret)
-			ret = -EINVAL;
-		break;
-	case T_CMD_LEN:
-		val = kfifo_len(fifo) / sizeof(struct isp2x_csi_trigger);
-		*(u32 *)arg = val;
-		break;
-	default:
-		break;
-	}
-	spin_unlock_irqrestore(&csi->rdbk_lock, lock_flags);
-
-	if (cmd == T_CMD_QUEUE || cmd == T_CMD_END)
-		rkisp_dev_trigger_handle(dev, cmd);
 	return ret;
 }
 
@@ -796,27 +559,16 @@ int rkisp_register_csi_subdev(struct rkisp_device *dev,
 	if (ret < 0)
 		return ret;
 
-	spin_lock_init(&csi_dev->rdbk_lock);
-	ret = kfifo_alloc(&csi_dev->rdbk_kfifo,
-			  16 * sizeof(struct isp2x_csi_trigger),
-			  GFP_KERNEL);
-	if (ret < 0) {
-		v4l2_err(v4l2_dev, "Failed to alloc csi kfifo %d", ret);
-		goto free_media;
-	}
-
 	sd->owner = THIS_MODULE;
 	v4l2_set_subdevdata(sd, csi_dev);
 	sd->grp_id = GRP_ID_CSI;
 	ret = v4l2_device_register_subdev(v4l2_dev, sd);
 	if (ret < 0) {
 		v4l2_err(v4l2_dev, "Failed to register csi subdev\n");
-		goto free_kfifo;
+		goto free_media;
 	}
 
 	return 0;
-free_kfifo:
-	kfifo_free(&csi_dev->rdbk_kfifo);
 free_media:
 	media_entity_cleanup(&sd->entity);
 	return ret;
@@ -826,7 +578,6 @@ void rkisp_unregister_csi_subdev(struct rkisp_device *dev)
 {
 	struct v4l2_subdev *sd = &dev->csi_dev.sd;
 
-	kfifo_free(&dev->csi_dev.rdbk_kfifo);
 	v4l2_device_unregister_subdev(sd);
 	media_entity_cleanup(&sd->entity);
 }
diff --git a/drivers/media/platform/rockchip/isp/csi.h b/drivers/media/platform/rockchip/isp/csi.h
index 75e94ff1c9d5..1c21cf85cd66 100644
--- a/drivers/media/platform/rockchip/isp/csi.h
+++ b/drivers/media/platform/rockchip/isp/csi.h
@@ -51,14 +51,6 @@ enum rkisp_csi_pad {
 	CSI_PAD_MAX
 };
 
-enum rkisp_csi_filt {
-	CSI_F_VS,
-	CSI_F_RD0,
-	CSI_F_RD1,
-	CSI_F_RD2,
-	CSI_F_MAX
-};
-
 struct sink_info {
 	u8 index;
 	u8 linked;
@@ -67,10 +59,7 @@ struct sink_info {
 /*
  * struct rkisp_csi_device
  * sink: csi link enable flags
- * rdbk_kfifo: read back event fifo
- * rdbk_lock: lock for read back event
  * mipi_di: Data Identifier (vc[7:6],dt[5:0])
- * filt_state: multiframe read back mode to filt irq event
  * tx_first: flags for dmatx first Y_STATE irq
  * memory: compact or big/little endian byte order for tx/rx
  */
@@ -79,18 +68,10 @@ struct rkisp_csi_device {
 	struct v4l2_subdev sd;
 	struct media_pad pads[CSI_PAD_MAX];
 	struct sink_info sink[CSI_PAD_MAX - 1];
-	struct kfifo rdbk_kfifo;
-	spinlock_t rdbk_lock;
 	int max_pad;
-	int frame_cnt;
-	int frame_cnt_x1;
-	int frame_cnt_x2;
-	int frame_cnt_x3;
 	u32 err_cnt;
 	u32 irq_cnt;
-	u32 rd_mode;
 	u8 mipi_di[CSI_PAD_MAX - 1];
-	u8 filt_state[CSI_F_MAX];
 	u8 tx_first[HDR_DMA_MAX];
 	u8 memory;
 };
@@ -100,7 +81,5 @@ int rkisp_register_csi_subdev(struct rkisp_device *dev,
 void rkisp_unregister_csi_subdev(struct rkisp_device *dev);
 
 int rkisp_csi_config_patch(struct rkisp_device *dev);
-void rkisp_trigger_read_back(struct rkisp_csi_device *csi, u8 dma2frm, u32 mode, bool is_try);
-int rkisp_csi_trigger_event(struct rkisp_device *dev, u32 cmd, void *arg);
 void rkisp_csi_sof(struct rkisp_device *dev, u8 id);
 #endif
diff --git a/drivers/media/platform/rockchip/isp/dev.h b/drivers/media/platform/rockchip/isp/dev.h
index 4cdd98fa5cb5..e3f9951c22cf 100644
--- a/drivers/media/platform/rockchip/isp/dev.h
+++ b/drivers/media/platform/rockchip/isp/dev.h
@@ -103,6 +103,14 @@ enum rkisp_isp_inp {
 	INP_CIF = BIT(8),
 };
 
+enum rkisp_rdbk_filt {
+	RDBK_F_VS,
+	RDBK_F_RD0,
+	RDBK_F_RD1,
+	RDBK_F_RD2,
+	RDBK_F_MAX
+};
+
 /*
  * struct rkisp_pipeline - An ISP hardware pipeline
  *
@@ -220,5 +228,14 @@ struct rkisp_device {
 	bool send_fbcgain;
 	struct rkisp_ispp_buf *cur_fbcgain;
 	struct rkisp_buffer *cur_spbuf;
+
+	struct kfifo rdbk_kfifo;
+	spinlock_t rdbk_lock;
+	int rdbk_cnt;
+	int rdbk_cnt_x1;
+	int rdbk_cnt_x2;
+	int rdbk_cnt_x3;
+	u32 rd_mode;
+	u8 filt_state[RDBK_F_MAX];
 };
 #endif
diff --git a/drivers/media/platform/rockchip/isp/dmarx.c b/drivers/media/platform/rockchip/isp/dmarx.c
index e14c7d3e8bdb..fabdfb520196 100644
--- a/drivers/media/platform/rockchip/isp/dmarx.c
+++ b/drivers/media/platform/rockchip/isp/dmarx.c
@@ -971,7 +971,7 @@ void rkisp_rawrd_set_pic_size(struct rkisp_device *dev,
 	if (dev->isp_ver == ISP_V20 &&
 	    sdev->in_fmt.fmt_type == FMT_BAYER &&
 	    sdev->out_fmt.fmt_type != FMT_BAYER &&
-	    dev->csi_dev.rd_mode == HDR_RDBK_FRAME1)
+	    dev->rd_mode == HDR_RDBK_FRAME1)
 		height += RKMODULE_EXTEND_LINE;
 
 	rkisp_write(dev, CSI2RX_RAW_RD_PIC_SIZE, height << 16 | width, false);
@@ -990,7 +990,7 @@ void rkisp_dmarx_get_frame(struct rkisp_device *dev, u32 *id,
 		return;
 	}
 
-	spin_lock_irqsave(&dev->csi_dev.rdbk_lock, flag);
+	spin_lock_irqsave(&dev->rdbk_lock, flag);
 	if (sync) {
 		frame_id = dev->dmarx_dev.cur_frame.id;
 		sof_time = dev->dmarx_dev.cur_frame.sof_timestamp;
@@ -1000,7 +1000,7 @@ void rkisp_dmarx_get_frame(struct rkisp_device *dev, u32 *id,
 		sof_time = dev->dmarx_dev.pre_frame.sof_timestamp;
 		frame_timestamp = dev->dmarx_dev.pre_frame.timestamp;
 	}
-	spin_unlock_irqrestore(&dev->csi_dev.rdbk_lock, flag);
+	spin_unlock_irqrestore(&dev->rdbk_lock, flag);
 	if (id)
 		*id = frame_id;
 	if (sof_timestamp)
diff --git a/drivers/media/platform/rockchip/isp/isp_params_v21.c b/drivers/media/platform/rockchip/isp/isp_params_v21.c
index 1808bb11ca42..c12272d5e356 100644
--- a/drivers/media/platform/rockchip/isp/isp_params_v21.c
+++ b/drivers/media/platform/rockchip/isp/isp_params_v21.c
@@ -640,7 +640,7 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev,
 	lsc_ctrl = rkisp_ioread32(params_vdev, ISP_LSC_CTRL);
 	isp_param_clear_bits(params_vdev, ISP_LSC_CTRL,
 			     ISP_LSC_EN);
-	if (!IS_HDR_RDBK(dev->csi_dev.rd_mode))
+	if (!IS_HDR_RDBK(dev->rd_mode))
 		isp_lsc_matrix_cfg_ddr(params_vdev, arg);
 
 	for (i = 0; i < 4; i++) {
@@ -690,7 +690,7 @@ isp_lsc_enable(struct rkisp_isp_params_vdev *params_vdev,
 	struct rkisp_device *dev = params_vdev->dev;
 	u32 val = ISP_LSC_EN;
 
-	if (!IS_HDR_RDBK(dev->csi_dev.rd_mode))
+	if (!IS_HDR_RDBK(dev->rd_mode))
 		val |= ISP_LSC_LUT_EN;
 
 	if (en)
@@ -4134,7 +4134,7 @@ rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev,
 		cur_buf = list_first_entry(&params_vdev->params,
 				struct rkisp_buffer, queue);
 
-		if (!IS_HDR_RDBK(dev->csi_dev.rd_mode)) {
+		if (!IS_HDR_RDBK(dev->rd_mode)) {
 			list_del(&cur_buf->queue);
 			break;
 		}
@@ -4213,7 +4213,7 @@ rkisp_params_isr_v2x(struct rkisp_isp_params_vdev *params_vdev,
 		if (!params_vdev->cur_buf)
 			return;
 
-		if (IS_HDR_RDBK(dev->csi_dev.rd_mode) && !params_vdev->rdbk_times) {
+		if (IS_HDR_RDBK(dev->rd_mode) && !params_vdev->rdbk_times) {
 			rkisp_params_cfg_v2x(params_vdev, cur_frame_id, RKISP_PARAMS_SHD);
 			return;
 		}
@@ -4222,7 +4222,7 @@ rkisp_params_isr_v2x(struct rkisp_isp_params_vdev *params_vdev,
 	if (isp_mis & CIF_ISP_FRAME)
 		rkisp_params_clear_fstflg(params_vdev);
 
-	if ((isp_mis & CIF_ISP_FRAME) && !IS_HDR_RDBK(dev->csi_dev.rd_mode))
+	if ((isp_mis & CIF_ISP_FRAME) && !IS_HDR_RDBK(dev->rd_mode))
 		rkisp_params_cfg_v2x(params_vdev, cur_frame_id, RKISP_PARAMS_ALL);
 }
 
diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.c b/drivers/media/platform/rockchip/isp/isp_params_v2x.c
index df6cb0831c20..b8b1934dfb62 100644
--- a/drivers/media/platform/rockchip/isp/isp_params_v2x.c
+++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.c
@@ -64,7 +64,7 @@ isp_param_get_insize(struct rkisp_isp_params_vdev *params_vdev)
 	u32 height = isp_sdev->in_crop.height;
 
 	if (dev->isp_ver == ISP_V20 &&
-	    dev->csi_dev.rd_mode == HDR_RDBK_FRAME1)
+	    dev->rd_mode == HDR_RDBK_FRAME1)
 		height += RKMODULE_EXTEND_LINE;
 
 	return isp_sdev->in_crop.width * height;
@@ -716,7 +716,7 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev,
 	lsc_ctrl = rkisp_ioread32(params_vdev, ISP_LSC_CTRL);
 	isp_param_clear_bits(params_vdev, ISP_LSC_CTRL,
 			     ISP_LSC_EN);
-	if (!IS_HDR_RDBK(dev->csi_dev.rd_mode))
+	if (!IS_HDR_RDBK(dev->rd_mode))
 		isp_lsc_matrix_cfg_ddr(params_vdev, arg);
 
 	for (i = 0; i < 4; i++) {
@@ -766,7 +766,7 @@ isp_lsc_enable(struct rkisp_isp_params_vdev *params_vdev,
 	struct rkisp_device *dev = params_vdev->dev;
 	u32 val = ISP_LSC_EN;
 
-	if (!IS_HDR_RDBK(dev->csi_dev.rd_mode))
+	if (!IS_HDR_RDBK(dev->rd_mode))
 		val |= ISP_LSC_LUT_EN;
 
 	if (en)
@@ -3464,8 +3464,8 @@ isp_gain_config(struct rkisp_isp_params_vdev *params_vdev,
 	u32 value, i, gain_wsize;
 	u8 mge_en;
 
-	if (dev->csi_dev.rd_mode != HDR_NORMAL &&
-	    dev->csi_dev.rd_mode != HDR_RDBK_FRAME1)
+	if (dev->rd_mode != HDR_NORMAL &&
+	    dev->rd_mode != HDR_RDBK_FRAME1)
 		mge_en = 1;
 	else
 		mge_en = 0;
@@ -3609,7 +3609,7 @@ isp_ldch_config(struct rkisp_isp_params_vdev *params_vdev,
 
 		value = arg->hsize * 4;
 		memcpy(buf + value * vsize, buf + value * (vsize - cnt), cnt * value);
-		if (dev->csi_dev.rd_mode == HDR_RDBK_FRAME1)
+		if (dev->rd_mode == HDR_RDBK_FRAME1)
 			vsize += cnt;
 	}
 	value = priv_val->buf_ldch[buf_idx].dma_addr + ldch_head->data_oft;
@@ -4446,7 +4446,7 @@ rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev,
 		cur_buf = list_first_entry(&params_vdev->params,
 				struct rkisp_buffer, queue);
 
-		if (!IS_HDR_RDBK(dev->csi_dev.rd_mode)) {
+		if (!IS_HDR_RDBK(dev->rd_mode)) {
 			list_del(&cur_buf->queue);
 			break;
 		}
@@ -4626,7 +4626,7 @@ rkisp_params_isr_v2x(struct rkisp_isp_params_vdev *params_vdev,
 		if (!params_vdev->cur_buf)
 			return;
 
-		if (IS_HDR_RDBK(dev->csi_dev.rd_mode) && !params_vdev->rdbk_times) {
+		if (IS_HDR_RDBK(dev->rd_mode) && !params_vdev->rdbk_times) {
 			struct rkisp_isp_params_val_v2x *priv_val =
 				(struct rkisp_isp_params_val_v2x *)params_vdev->priv_val;
 
@@ -4654,7 +4654,7 @@ rkisp_params_isr_v2x(struct rkisp_isp_params_vdev *params_vdev,
 		writel(ISP2X_HDR_DONE, dev->base_addr + ISP_ISP_ICR);
 	}
 
-	if ((isp_mis & CIF_ISP_FRAME) && !IS_HDR_RDBK(dev->csi_dev.rd_mode))
+	if ((isp_mis & CIF_ISP_FRAME) && !IS_HDR_RDBK(dev->rd_mode))
 		rkisp_params_cfg_v2x(params_vdev, cur_frame_id, RKISP_PARAMS_ALL);
 }
 
diff --git a/drivers/media/platform/rockchip/isp/procfs.c b/drivers/media/platform/rockchip/isp/procfs.c
index 701a4040c819..c317595937f7 100644
--- a/drivers/media/platform/rockchip/isp/procfs.c
+++ b/drivers/media/platform/rockchip/isp/procfs.c
@@ -247,15 +247,15 @@ static int isp_show(struct seq_file *p, void *v)
 	if (IS_HDR_RDBK(dev->hdr.op_mode))
 		seq_printf(p, "%-10s mode:frame%d (frame:%d rate:%dms %s time:%dms) cnt(total:%d X1:%d X2:%d X3:%d)\n",
 			   "Isp Read",
-			   dev->csi_dev.rd_mode - 3,
+			   dev->rd_mode - 3,
 			   dev->dmarx_dev.cur_frame.id,
 			   (u32)(dev->dmarx_dev.cur_frame.timestamp - dev->dmarx_dev.pre_frame.timestamp) / 1000 / 1000,
 			   (dev->isp_state & ISP_FRAME_END) ? "idle" : "working",
 			   sdev->dbg.interval / 1000 / 1000,
-			   dev->csi_dev.frame_cnt,
-			   dev->csi_dev.frame_cnt_x1,
-			   dev->csi_dev.frame_cnt_x2,
-			   dev->csi_dev.frame_cnt_x3);
+			   dev->rdbk_cnt,
+			   dev->rdbk_cnt_x1,
+			   dev->rdbk_cnt_x2,
+			   dev->rdbk_cnt_x3);
 	else
 		seq_printf(p, "%-10s frame:%d %s time:%dms\n",
 			   "Isp online",
diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c
index 7d1ced23b885..f357c85cb011 100644
--- a/drivers/media/platform/rockchip/isp/rkisp.c
+++ b/drivers/media/platform/rockchip/isp/rkisp.c
@@ -81,6 +81,8 @@
  * +---------------------------------------------------------+
  */
 
+static int rkisp_rdbk_trigger_event(struct rkisp_device *dev, u32 cmd, void *arg);
+
 struct backup_reg {
 	const u32 base;
 	const u32 shd;
@@ -469,6 +471,242 @@ u32 rkisp_mbus_pixelcode_to_v4l2(u32 pixelcode)
 	return pixelformat;
 }
 
+
+/*
+ * for hdr read back mode, rawrd read back data
+ * this will update rawrd base addr to shadow.
+ */
+void rkisp_trigger_read_back(struct rkisp_device *dev, u8 dma2frm, u32 mode, bool is_try)
+{
+	struct rkisp_isp_params_vdev *params_vdev = &dev->params_vdev;
+	struct rkisp_hw_dev *hw = dev->hw_dev;
+	u32 val, cur_frame_id, tmp, rd_mode;
+	u64 iq_feature = hw->iq_feature;
+	bool is_feature_on = hw->is_feature_on;
+	bool is_upd = false, is_3dlut_upd = false;
+
+	hw->cur_dev_id = dev->dev_id;
+	rkisp_dmarx_get_frame(dev, &cur_frame_id, NULL, NULL, true);
+
+	val = 0;
+	if (mode & T_START_X1) {
+		rd_mode = HDR_RDBK_FRAME1;
+	} else if (mode & T_START_X2) {
+		rd_mode = HDR_RDBK_FRAME2;
+		val = SW_HDRMGE_EN | SW_HDRMGE_MODE_FRAMEX2;
+	} else if (mode & T_START_X3) {
+		rd_mode = HDR_RDBK_FRAME3;
+		val = SW_HDRMGE_EN | SW_HDRMGE_MODE_FRAMEX3;
+	} else {
+		rd_mode = dev->rd_mode;
+		val = rkisp_read(dev, ISP_HDRMGE_BASE, false) & 0xf;
+	}
+
+	if (is_feature_on) {
+		if ((ISP2X_MODULE_HDRMGE & ~iq_feature) && (val & SW_HDRMGE_EN)) {
+			v4l2_err(&dev->v4l2_dev, "hdrmge is not supported\n");
+			return;
+		}
+	}
+
+	tmp = rkisp_read(dev, ISP_HDRMGE_BASE, false) & 0xf;
+	if (val != tmp) {
+		rkisp_write(dev, ISP_HDRMGE_BASE, val, false);
+		dev->skip_frame = 2;
+		is_upd = true;
+	}
+
+	if (dev->isp_ver == ISP_V20 && dev->dmarx_dev.trigger == T_MANUAL && !is_try) {
+		if (dev->rd_mode != rd_mode && dev->br_dev.en) {
+			tmp = dev->isp_sdev.in_crop.height;
+			val = rkisp_read(dev, CIF_DUAL_CROP_CTRL, false);
+			if (rd_mode == HDR_RDBK_FRAME1) {
+				val |= CIF_DUAL_CROP_MP_MODE_YUV;
+				tmp += RKMODULE_EXTEND_LINE;
+			} else {
+				val &= ~CIF_DUAL_CROP_MP_MODE_YUV;
+			}
+			rkisp_write(dev, CIF_DUAL_CROP_CTRL, val, false);
+			rkisp_write(dev, CIF_ISP_ACQ_V_SIZE, tmp, false);
+			rkisp_write(dev, CIF_ISP_OUT_V_SIZE, tmp, false);
+		}
+		dev->rd_mode = rd_mode;
+		rkisp_rawrd_set_pic_size(dev,
+			dev->dmarx_dev.stream[RKISP_STREAM_RAWRD2].out_fmt.width,
+			dev->dmarx_dev.stream[RKISP_STREAM_RAWRD2].out_fmt.height);
+	}
+	dev->rd_mode = rd_mode;
+
+	/* configure hdr params in rdbk mode */
+	if (is_upd)
+		rkisp_params_first_cfg(&dev->params_vdev,
+				       &dev->isp_sdev.in_fmt,
+				       dev->isp_sdev.quantization);
+	rkisp_params_cfg(params_vdev, cur_frame_id);
+
+	if (!hw->is_single && !is_try) {
+		rkisp_update_regs(dev, CTRL_VI_ISP_PATH, SUPER_IMP_COLOR_CR);
+		rkisp_update_regs(dev, DUAL_CROP_M_H_OFFS, DUAL_CROP_S_V_SIZE);
+		rkisp_update_regs(dev, ISP_ACQ_PROP, DUAL_CROP_CTRL);
+		rkisp_update_regs(dev, MAIN_RESIZE_SCALE_HY, MI_WR_CTRL);
+		rkisp_update_regs(dev, SELF_RESIZE_SCALE_HY, MAIN_RESIZE_CTRL);
+		rkisp_update_regs(dev, ISP_GAMMA_OUT_CTRL, SELF_RESIZE_CTRL);
+		rkisp_update_regs(dev, MI_RD_CTRL2, ISP_LSC_CTRL);
+		rkisp_update_regs(dev, MI_MP_WR_Y_BASE, MI_MP_WR_Y_LLENGTH);
+		rkisp_update_regs(dev, ISP_LSC_XGRAD_01, ISP_RAWAWB_RAM_DATA);
+		if (dev->isp_ver == ISP_V20 &&
+		    (rkisp_read(dev, ISP_DHAZ_CTRL, false) & ISP_DHAZ_ENMUX ||
+		     rkisp_read(dev, ISP_HDRTMO_CTRL, false) & ISP_HDRTMO_EN)) {
+			dma2frm += (dma2frm ? 0 : 1);
+		} else if (dev->isp_ver == ISP_V21) {
+			val = rkisp_read(dev, MI_WR_CTRL2, false);
+			rkisp_set_bits(dev, MI_WR_CTRL2, 0, val, true);
+			rkisp_write(dev, MI_WR_INIT, ISP21_SP_FORCE_UPD | ISP21_MP_FORCE_UPD, true);
+			/* sensor mode & index */
+			rkisp_set_bits(dev, ISP_ACQ_H_OFFS, ISP21_SENSOR_MODE(3) | ISP21_SENSOR_INDEX(3),
+					ISP21_SENSOR_MODE(hw->dev_num >= 3 ? 2 : hw->dev_num - 1) |
+					ISP21_SENSOR_INDEX(dev->dev_id), true);
+		}
+		is_upd = true;
+	}
+
+	if (dev->isp_ver == ISP_V21)
+		dma2frm = 0;
+	if (dma2frm > 2)
+		dma2frm = 2;
+	if (dma2frm == 2)
+		dev->rdbk_cnt_x3++;
+	else if (dma2frm == 1)
+		dev->rdbk_cnt_x2++;
+	else
+		dev->rdbk_cnt_x1++;
+	dev->rdbk_cnt++;
+
+	rkisp_params_cfgsram(params_vdev);
+	params_vdev->rdbk_times = dma2frm + 1;
+
+	/* read 3d lut at frame end */
+	if (hw->is_single && is_upd &&
+	    rkisp_read_reg_cache(dev, ISP_3DLUT_UPDATE) & 0x1) {
+		rkisp_write(dev, ISP_3DLUT_UPDATE, 0, true);
+		is_3dlut_upd = true;
+	}
+	if (is_upd) {
+		val = rkisp_read(dev, ISP_CTRL, false);
+		val |= CIF_ISP_CTRL_ISP_CFG_UPD;
+		rkisp_write(dev, ISP_CTRL, val, true);
+	}
+	if (is_3dlut_upd)
+		rkisp_write(dev, ISP_3DLUT_UPDATE, 1, true);
+
+	memset(dev->filt_state, 0, sizeof(dev->filt_state));
+	dev->filt_state[RDBK_F_VS] = dma2frm;
+
+	val = rkisp_read(dev, CSI2RX_CTRL0, true);
+	val &= ~SW_IBUF_OP_MODE(0xf);
+	tmp = SW_IBUF_OP_MODE(dev->rd_mode);
+	val |= tmp | SW_CSI2RX_EN | SW_DMA_2FRM_MODE(dma2frm);
+	v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev,
+		 "readback frame:%d time:%d 0x%x\n",
+		 cur_frame_id, dma2frm + 1, val);
+	if (!hw->is_shutdown)
+		rkisp_write(dev, CSI2RX_CTRL0, val, true);
+}
+
+static void rkisp_rdbk_trigger_handle(struct rkisp_device *dev, u32 cmd)
+{
+	struct rkisp_hw_dev *hw = dev->hw_dev;
+	struct rkisp_device *isp = NULL;
+	struct isp2x_csi_trigger t = { 0 };
+	unsigned long lock_flags = 0;
+	int i, times = -1, max = 0, id = 0;
+	int len[DEV_MAX] = { 0 };
+	u32 mode = 0;
+
+	spin_lock_irqsave(&hw->rdbk_lock, lock_flags);
+	if (cmd == T_CMD_END)
+		hw->is_idle = true;
+	if (hw->is_shutdown)
+		hw->is_idle = false;
+	if (!hw->is_idle)
+		goto end;
+	if (hw->monitor.state & ISP_MIPI_ERROR && hw->monitor.is_en)
+		goto end;
+
+	for (i = 0; i < hw->dev_num; i++) {
+		isp = hw->isp[i];
+		if (!(isp->isp_state & ISP_START))
+			continue;
+		rkisp_rdbk_trigger_event(isp, T_CMD_LEN, &len[i]);
+		if (max < len[i]) {
+			max = len[i];
+			id = i;
+		}
+	}
+
+	if (max) {
+		v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev,
+			 "handle isp%d, trigger fifo len:%d\n",
+			 id, max);
+		isp = hw->isp[id];
+		rkisp_rdbk_trigger_event(isp, T_CMD_DEQUEUE, &t);
+		isp->dmarx_dev.pre_frame = isp->dmarx_dev.cur_frame;
+		isp->dmarx_dev.cur_frame.id = t.frame_id;
+		isp->dmarx_dev.cur_frame.sof_timestamp = t.sof_timestamp;
+		isp->dmarx_dev.cur_frame.timestamp = t.frame_timestamp;
+		isp->isp_sdev.frm_timestamp = t.sof_timestamp;
+		mode = t.mode;
+		times = t.times;
+		hw->cur_dev_id = id;
+		hw->is_idle = false;
+	}
+end:
+	spin_unlock_irqrestore(&hw->rdbk_lock, lock_flags);
+	if (times >= 0)
+		rkisp_trigger_read_back(isp, times, mode, false);
+}
+
+static int rkisp_rdbk_trigger_event(struct rkisp_device *dev, u32 cmd, void *arg)
+{
+	struct kfifo *fifo = &dev->rdbk_kfifo;
+	struct isp2x_csi_trigger *trigger = NULL;
+	unsigned long lock_flags = 0;
+	int val, ret = 0;
+
+	if (dev->dmarx_dev.trigger != T_MANUAL)
+		return 0;
+
+	spin_lock_irqsave(&dev->rdbk_lock, lock_flags);
+	switch (cmd) {
+	case T_CMD_QUEUE:
+		trigger = arg;
+		if (!trigger)
+			break;
+		if (!kfifo_is_full(fifo))
+			kfifo_in(fifo, trigger, sizeof(*trigger));
+		else
+			v4l2_err(&dev->v4l2_dev, "rdbk fifo is full\n");
+		break;
+	case T_CMD_DEQUEUE:
+		if (!kfifo_is_empty(fifo))
+			ret = kfifo_out(fifo, arg, sizeof(struct isp2x_csi_trigger));
+		if (!ret)
+			ret = -EINVAL;
+		break;
+	case T_CMD_LEN:
+		val = kfifo_len(fifo) / sizeof(struct isp2x_csi_trigger);
+		*(u32 *)arg = val;
+		break;
+	default:
+		break;
+	}
+	spin_unlock_irqrestore(&dev->rdbk_lock, lock_flags);
+
+	if (cmd == T_CMD_QUEUE || cmd == T_CMD_END)
+		rkisp_rdbk_trigger_handle(dev, cmd);
+	return ret;
+}
+
 void rkisp_check_idle(struct rkisp_device *dev, u32 irq)
 {
 	u32 val = 0;
@@ -483,14 +721,14 @@ void rkisp_check_idle(struct rkisp_device *dev, u32 irq)
 		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->csi_dev.rd_mode))
+	if (dev->irq_ends != 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;
 
 	dev->irq_ends = 0;
-	switch (dev->csi_dev.rd_mode) {
+	switch (dev->rd_mode) {
 	case HDR_RDBK_FRAME3://for rd1 rd0 rd2
 		val |= RAW1_RD_FRAME;
 		/* FALLTHROUGH */
@@ -505,7 +743,7 @@ void rkisp_check_idle(struct rkisp_device *dev, u32 irq)
 	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_csi_trigger_event(dev, T_CMD_END, NULL);
+		rkisp_rdbk_trigger_event(dev, T_CMD_END, NULL);
 	if (dev->isp_state == ISP_STOP)
 		wake_up(&dev->sync_onoff);
 }
@@ -670,9 +908,9 @@ static int rkisp_reset_handle_v2x(struct rkisp_device *dev)
 	rkisp_set_bits(dev, CIF_ISP_IMSC, 0, CIF_ISP_DATA_LOSS | CIF_ISP_PIC_SIZE_ERROR, true);
 	if (IS_HDR_RDBK(dev->hdr.op_mode)) {
 		if (!dev->hw_dev->is_idle)
-			rkisp_trigger_read_back(&dev->csi_dev, 1, 0, true);
+			rkisp_trigger_read_back(dev, 1, 0, true);
 		else
-			rkisp_csi_trigger_event(dev, T_CMD_QUEUE, NULL);
+			rkisp_rdbk_trigger_event(dev, T_CMD_QUEUE, NULL);
 	}
 	kfree(reg_buf);
 	dev_info(dev->dev, "%s exit\n", __func__);
@@ -849,7 +1087,7 @@ static int rkisp_config_isp(struct rkisp_device *dev)
 				isp_ctrl = CIF_ISP_CTRL_ISP_MODE_BAYER_ITU601;
 
 			if (dev->isp_ver == ISP_V20 &&
-			    dev->csi_dev.rd_mode == HDR_RDBK_FRAME1)
+			    dev->rd_mode == HDR_RDBK_FRAME1)
 				extend_line = RKMODULE_EXTEND_LINE;
 		}
 
@@ -1271,7 +1509,7 @@ static int rkisp_isp_stop(struct rkisp_device *dev)
 	rkisp_set_state(&dev->isp_state, ISP_STOP);
 
 	if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21)
-		kfifo_reset(&dev->csi_dev.rdbk_kfifo);
+		kfifo_reset(&dev->rdbk_kfifo);
 	if (dev->emd_vc <= CIF_ISP_ADD_DATA_VC_MAX) {
 		for (i = 0; i < RKISP_EMDDATA_FIFO_MAX; i++)
 			kfifo_free(&dev->emd_data_fifo[i].mipi_kfifo);
@@ -1345,7 +1583,7 @@ static int rkisp_isp_start(struct rkisp_device *dev)
 		dev->hw_dev->monitor.state = ISP_FRAME_END;
 		schedule_work(&dev->hw_dev->monitor.work);
 	}
-	rkisp_csi_trigger_event(dev, T_CMD_QUEUE, NULL);
+	rkisp_rdbk_trigger_event(dev, T_CMD_QUEUE, NULL);
 	return 0;
 }
 
@@ -1918,7 +2156,7 @@ static int rkisp_isp_sd_s_stream(struct v4l2_subdev *sd, int on)
 		atomic_dec(&isp_dev->hw_dev->refcnt);
 		wait_event_timeout(isp_dev->sync_onoff,
 			isp_dev->irq_ends_mask == (ISP_FRAME_END | ISP_FRAME_IN) &&
-			(!IS_HDR_RDBK(isp_dev->csi_dev.rd_mode) ||
+			(!IS_HDR_RDBK(isp_dev->rd_mode) ||
 			 isp_dev->isp_state & ISP_STOP), msecs_to_jiffies(5));
 		return rkisp_isp_stop(isp_dev);
 	}
@@ -1947,7 +2185,7 @@ static int rkisp_isp_sd_s_power(struct v4l2_subdev *sd, int on)
 
 	if (on) {
 		if (isp_dev->isp_ver == ISP_V20 || isp_dev->isp_ver == ISP_V21)
-			kfifo_reset(&isp_dev->csi_dev.rdbk_kfifo);
+			kfifo_reset(&isp_dev->rdbk_kfifo);
 		ret = pm_runtime_get_sync(isp_dev->dev);
 	} else {
 		ret = pm_runtime_put_sync(isp_dev->dev);
@@ -2155,7 +2393,7 @@ static long rkisp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 
 	switch (cmd) {
 	case RKISP_CMD_TRIGGER_READ_BACK:
-		rkisp_csi_trigger_event(isp_dev, T_CMD_QUEUE, arg);
+		rkisp_rdbk_trigger_event(isp_dev, T_CMD_QUEUE, arg);
 		break;
 	case RKISP_CMD_CSI_MEMORY_MODE:
 		if (*((int *)arg) == CSI_MEM_BYTE_BE)
@@ -2364,6 +2602,14 @@ int rkisp_register_isp_subdev(struct rkisp_device *isp_dev,
 	struct v4l2_subdev *sd = &isp_sdev->sd;
 	int ret;
 
+	spin_lock_init(&isp_dev->rdbk_lock);
+	ret = kfifo_alloc(&isp_dev->rdbk_kfifo,
+		16 * sizeof(struct isp2x_csi_trigger), GFP_KERNEL);
+	if (ret < 0) {
+		v4l2_err(v4l2_dev, "Failed to alloc csi kfifo %d", ret);
+		return ret;
+	}
+
 	v4l2_subdev_init(sd, &rkisp_isp_sd_ops);
 	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
 	sd->entity.ops = &rkisp_isp_sd_media_ops;
@@ -2378,7 +2624,7 @@ int rkisp_register_isp_subdev(struct rkisp_device *isp_dev,
 	ret = media_entity_pads_init(&sd->entity, RKISP_ISP_PAD_MAX,
 				     isp_sdev->pads);
 	if (ret < 0)
-		return ret;
+		goto free_kfifo;
 
 	sd->owner = THIS_MODULE;
 	v4l2_set_subdevdata(sd, isp_dev);
@@ -2398,6 +2644,8 @@ int rkisp_register_isp_subdev(struct rkisp_device *isp_dev,
 	return 0;
 err_cleanup_media_entity:
 	media_entity_cleanup(&sd->entity);
+free_kfifo:
+	kfifo_free(&isp_dev->rdbk_kfifo);
 	return ret;
 }
 
@@ -2405,6 +2653,7 @@ void rkisp_unregister_isp_subdev(struct rkisp_device *isp_dev)
 {
 	struct v4l2_subdev *sd = &isp_dev->isp_sdev.sd;
 
+	kfifo_free(&isp_dev->rdbk_kfifo);
 	v4l2_device_unregister_subdev(sd);
 	media_entity_cleanup(&sd->entity);
 }
@@ -2611,7 +2860,7 @@ void rkisp_isp_isr(unsigned int isp_mis,
 	dev->isp_isr_cnt++;
 	/* start edge of v_sync */
 	if (isp_mis & CIF_ISP_V_START) {
-		if (!(dev->isp_state & ISP_FRAME_VS))
+		if (dev->isp_state & ISP_FRAME_END)
 			dev->isp_sdev.dbg.timestamp = ktime_get_ns();
 		rkisp_set_state(&dev->isp_state, ISP_FRAME_VS);
 		if (dev->hw_dev->monitor.is_en) {
@@ -2620,10 +2869,10 @@ void rkisp_isp_isr(unsigned int isp_mis,
 				complete(&dev->hw_dev->monitor.cmpl);
 		}
 		/* last vsync to config next buf */
-		if (!dev->csi_dev.filt_state[CSI_F_VS])
+		if (!dev->filt_state[RDBK_F_VS])
 			rkisp_bridge_update_mi(dev);
 		else
-			dev->csi_dev.filt_state[CSI_F_VS]--;
+			dev->filt_state[RDBK_F_VS]--;
 		if (IS_HDR_RDBK(dev->hdr.op_mode)) {
 			/* read 3d lut at isp readback */
 			if (!dev->hw_dev->is_single)
diff --git a/drivers/media/platform/rockchip/isp/rkisp.h b/drivers/media/platform/rockchip/isp/rkisp.h
index ee743bd8e1fc..3d7ecd50456a 100644
--- a/drivers/media/platform/rockchip/isp/rkisp.h
+++ b/drivers/media/platform/rockchip/isp/rkisp.h
@@ -165,6 +165,8 @@ void rkisp_isp_queue_event_sof(struct rkisp_isp_subdev *isp);
 
 void rkisp_check_idle(struct rkisp_device *dev, u32 irq);
 
+void rkisp_trigger_read_back(struct rkisp_device *dev, u8 dma2frm, u32 mode, bool is_try);
+
 static inline
 struct ispsd_out_fmt *rkisp_get_ispsd_out_fmt(struct rkisp_isp_subdev *isp_sdev)
 {

commit e1c77d9fa5c710920ac543435ac5b719da76eb47
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Mon May 10 16:58:13 2021 +0800

    media: rockchip: isp: dmatx support embedded and shield pixels data
    
    Change-Id: Ifb07d7a7b11d44a5843dfe3a66284e38b98fbbb6
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/isp/capture_v20.c b/drivers/media/platform/rockchip/isp/capture_v20.c
index 38ecdbc9bef2..e4e6adbe2e0e 100644
--- a/drivers/media/platform/rockchip/isp/capture_v20.c
+++ b/drivers/media/platform/rockchip/isp/capture_v20.c
@@ -116,6 +116,16 @@ static const struct capture_fmt dmatx_fmts[] = {
 		.fmt_type = FMT_YUV,
 		.bpp = { 16 },
 		.mplanes = 1,
+	}, {
+		.fourcc = V4l2_PIX_FMT_EBD8,
+		.fmt_type = FMT_EBD,
+		.bpp = { 8 },
+		.mplanes = 1,
+	}, {
+		.fourcc = V4l2_PIX_FMT_SPD16,
+		.fmt_type = FMT_SPD,
+		.bpp = { 16 },
+		.mplanes = 1,
 	}
 };
 
@@ -2195,6 +2205,9 @@ void rkisp_mi_v20_isr(u32 mis_val, struct rkisp_device *dev)
 			end_tx1 = true;
 		if (i == RKISP_STREAM_DMATX2)
 			end_tx2 = true;
+		/* DMATX3 no csi frame end isr, mi isr instead */
+		if (i == RKISP_STREAM_DMATX3)
+			atomic_inc(&stream->sequence);
 
 		mi_frame_end_int_clear(stream);
 
@@ -2240,6 +2253,10 @@ void rkisp_mipi_v20_isr(unsigned int phy, unsigned int packet,
 {
 	struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
 	struct rkisp_stream *stream;
+	u32 packet_err = PACKET_ERR_F_BNDRY_MATCG | PACKET_ERR_F_SEQ |
+		PACKET_ERR_FRAME_DATA | PACKET_ERR_ECC_1BIT |
+		PACKET_ERR_ECC_2BIT | PACKET_ERR_CHECKSUM;
+	u32 state_err = RAW_WR_SIZE_ERR | RAW_RD_SIZE_ERR;
 	int i;
 
 	v4l2_dbg(3, rkisp_debug, &dev->v4l2_dev,
@@ -2248,7 +2265,7 @@ void rkisp_mipi_v20_isr(unsigned int phy, unsigned int packet,
 	if (phy && (dev->isp_inp & INP_CSI) &&
 	    dev->csi_dev.err_cnt++ < RKISP_CONTI_ERR_MAX)
 		v4l2_warn(v4l2_dev, "MIPI error: phy: 0x%08x\n", phy);
-	if (packet && (dev->isp_inp & INP_CSI) &&
+	if ((packet & packet_err) && (dev->isp_inp & INP_CSI) &&
 	    dev->csi_dev.err_cnt < RKISP_CONTI_ERR_MAX) {
 		if (packet & 0xfff)
 			dev->csi_dev.err_cnt++;
@@ -2257,7 +2274,7 @@ void rkisp_mipi_v20_isr(unsigned int phy, unsigned int packet,
 	if (overflow &&
 	    dev->csi_dev.err_cnt++ < RKISP_CONTI_ERR_MAX)
 		v4l2_warn(v4l2_dev, "MIPI error: overflow: 0x%08x\n", overflow);
-	if (state & 0xeff00)
+	if (state & state_err)
 		v4l2_warn(v4l2_dev, "MIPI error: size: 0x%08x\n", state);
 	if (state & MIPI_DROP_FRM)
 		v4l2_warn(v4l2_dev, "MIPI drop frame\n");
diff --git a/drivers/media/platform/rockchip/isp/capture_v21.c b/drivers/media/platform/rockchip/isp/capture_v21.c
index 1e3c1f495e4a..e07f217d4c97 100644
--- a/drivers/media/platform/rockchip/isp/capture_v21.c
+++ b/drivers/media/platform/rockchip/isp/capture_v21.c
@@ -1472,6 +1472,10 @@ void rkisp_mipi_v21_isr(unsigned int phy, unsigned int packet,
 {
 	struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
 	struct rkisp_stream *stream;
+	u32 packet_err = PACKET_ERR_F_BNDRY_MATCG | PACKET_ERR_F_SEQ |
+		PACKET_ERR_FRAME_DATA | PACKET_ERR_ECC_1BIT |
+		PACKET_ERR_ECC_2BIT | PACKET_ERR_CHECKSUM;
+	u32 state_err = RAW_WR_SIZE_ERR | RAW_RD_SIZE_ERR;
 	int i, id;
 
 	v4l2_dbg(3, rkisp_debug, &dev->v4l2_dev,
@@ -1480,7 +1484,7 @@ void rkisp_mipi_v21_isr(unsigned int phy, unsigned int packet,
 	if (phy && (dev->isp_inp & INP_CSI) &&
 	    dev->csi_dev.err_cnt++ < RKISP_CONTI_ERR_MAX)
 		v4l2_warn(v4l2_dev, "MIPI error: phy: 0x%08x\n", phy);
-	if (packet && (dev->isp_inp & INP_CSI) &&
+	if ((packet & packet_err) && (dev->isp_inp & INP_CSI) &&
 	    dev->csi_dev.err_cnt < RKISP_CONTI_ERR_MAX) {
 		if (packet & 0xfff)
 			dev->csi_dev.err_cnt++;
@@ -1488,7 +1492,7 @@ void rkisp_mipi_v21_isr(unsigned int phy, unsigned int packet,
 	}
 	if (overflow && dev->csi_dev.err_cnt++ < RKISP_CONTI_ERR_MAX)
 		v4l2_warn(v4l2_dev, "MIPI error: overflow: 0x%08x\n", overflow);
-	if (state & 0xeff00)
+	if (state & state_err)
 		v4l2_warn(v4l2_dev, "MIPI error: size: 0x%08x\n", state);
 	if (state & ISP21_MIPI_DROP_FRM)
 		v4l2_warn(v4l2_dev, "MIPI drop frame\n");
diff --git a/drivers/media/platform/rockchip/isp/common.h b/drivers/media/platform/rockchip/isp/common.h
index cce1b9b6720a..dbed9ae83d02 100644
--- a/drivers/media/platform/rockchip/isp/common.h
+++ b/drivers/media/platform/rockchip/isp/common.h
@@ -100,6 +100,8 @@ enum rkisp_fmt_pix_type {
 	FMT_BAYER,
 	FMT_JPEG,
 	FMT_FBCGAIN,
+	FMT_EBD,
+	FMT_SPD,
 	FMT_MAX
 };
 
diff --git a/drivers/media/platform/rockchip/isp/csi.c b/drivers/media/platform/rockchip/isp/csi.c
index b50f43f47bdc..1058fe524431 100644
--- a/drivers/media/platform/rockchip/isp/csi.c
+++ b/drivers/media/platform/rockchip/isp/csi.c
@@ -320,10 +320,24 @@ static int csi_config(struct rkisp_csi_device *csi)
 		/* clear interrupts state */
 		rkisp_read(dev, CSI2RX_ERR_PHY, true);
 		/* set interrupts mask */
-		rkisp_write(dev, CSI2RX_MASK_PHY, 0xF0FFFF, true);
-		rkisp_write(dev, CSI2RX_MASK_PACKET, 0xF1FFFFF, true);
-		rkisp_write(dev, CSI2RX_MASK_OVERFLOW, 0x7F7FF1, true);
-		rkisp_write(dev, CSI2RX_MASK_STAT, 0x7FFFFF0F, true);
+		val = PHY_ERR_SOTHS | PHY_ERR_SOTSYNCHS |
+			PHY_ERR_EOTSYNCHS | PHY_ERR_ESC | PHY_ERR_CTL;
+		rkisp_write(dev, CSI2RX_MASK_PHY, val, true);
+		val = PACKET_ERR_F_BNDRY_MATCG | PACKET_ERR_F_SEQ |
+			PACKET_ERR_FRAME_DATA | PACKET_ERR_ECC_1BIT |
+			PACKET_ERR_ECC_2BIT | PACKET_ERR_CHECKSUM;
+		rkisp_write(dev, CSI2RX_MASK_PACKET, val, true);
+		val = AFIFO0_OVERFLOW | AFIFO1X_OVERFLOW |
+			LAFIFO1X_OVERFLOW | AFIFO2X_OVERFLOW |
+			IBUFX3_OVERFLOW | IBUF3R_OVERFLOW |
+			Y_STAT_AFIFOX3_OVERFLOW;
+		rkisp_write(dev, CSI2RX_MASK_OVERFLOW, val, true);
+		val = RAW0_WR_FRAME | RAW1_WR_FRAME | RAW2_WR_FRAME |
+			MIPI_DROP_FRM | RAW_WR_SIZE_ERR | MIPI_LINECNT |
+			RAW_RD_SIZE_ERR | MIPI_FRAME_ST_VC(0xf) |
+			MIPI_FRAME_END_VC(0xf) | RAW0_Y_STATE |
+			RAW1_Y_STATE | RAW2_Y_STATE;
+		rkisp_write(dev, CSI2RX_MASK_STAT, val, true);
 
 		/* hdr merge */
 		switch (dev->hdr.op_mode) {
@@ -465,13 +479,13 @@ int rkisp_csi_config_patch(struct rkisp_device *dev)
 			}
 		}
 		rkisp_write(dev, ISP_HDRMGE_BASE, val, false);
-	}
 
-	if (IS_HDR_RDBK(dev->hdr.op_mode)) {
-		rkisp_write(dev, CSI2RX_MASK_STAT, 0x700FFF0F, true);
-		rkisp_set_bits(dev, CTRL_SWS_CFG,
-			       0, SW_MPIP_DROP_FRM_DIS, true);
+		rkisp_set_bits(dev, CSI2RX_MASK_STAT, 0, RAW_RD_SIZE_ERR, true);
 	}
+
+	if (IS_HDR_RDBK(dev->hdr.op_mode))
+		rkisp_set_bits(dev, CTRL_SWS_CFG, 0, SW_MPIP_DROP_FRM_DIS, true);
+
 	memset(dev->csi_dev.filt_state, 0, sizeof(dev->csi_dev.filt_state));
 	dev->csi_dev.frame_cnt = -1;
 	dev->csi_dev.frame_cnt_x1 = -1;
diff --git a/drivers/media/platform/rockchip/isp/regs.h b/drivers/media/platform/rockchip/isp/regs.h
index 0e350aa3d3b2..bdf1be53b4f4 100644
--- a/drivers/media/platform/rockchip/isp/regs.h
+++ b/drivers/media/platform/rockchip/isp/regs.h
@@ -392,6 +392,7 @@
 #define CIF_MIPI_DATA_SEL_VC(a)			(((a) & 0x3) << 6)
 #define CIF_MIPI_DATA_SEL_DT(a)			(((a) & 0x3F) << 0)
 /* MIPI DATA_TYPE */
+#define CIF_CSI2_DT_EBD				0x12
 #define CIF_CSI2_DT_YUV420_8b			0x18
 #define CIF_CSI2_DT_YUV420_10b			0x19
 #define CIF_CSI2_DT_YUV422_8b			0x1E
@@ -402,6 +403,7 @@
 #define CIF_CSI2_DT_RAW8			0x2A
 #define CIF_CSI2_DT_RAW10			0x2B
 #define CIF_CSI2_DT_RAW12			0x2C
+#define CIF_CSI2_DT_SPD				0x2F
 
 /* MIPI_IMSC, MIPI_RIS, MIPI_MIS, MIPI_ICR, MIPI_ISR */
 #define CIF_MIPI_SYNC_FIFO_OVFLW(a)		(((a) & 0xF) << 0)
diff --git a/drivers/media/platform/rockchip/isp/regs_v2x.h b/drivers/media/platform/rockchip/isp/regs_v2x.h
index 36f0e3d55461..a2c8ef197f34 100644
--- a/drivers/media/platform/rockchip/isp/regs_v2x.h
+++ b/drivers/media/platform/rockchip/isp/regs_v2x.h
@@ -2362,6 +2362,28 @@
 #define SW_CSI_ID6(a)			(((a) & 0xff) << 16)
 #define SW_CSI_ID7(a)			(((a) & 0xff) << 24)
 
+#define PHY_ERR_SOTHS			GENMASK(3, 0)
+#define PHY_ERR_SOTSYNCHS		GENMASK(7, 4)
+#define PHY_ERR_EOTSYNCHS		GENMASK(11, 8)
+#define PHY_ERR_ESC			GENMASK(15, 12)
+#define PHY_ERR_CTL			GENMASK(23, 20)
+
+#define PACKET_ERR_F_BNDRY_MATCG	GENMASK(3, 0)
+#define PACKET_ERR_F_SEQ		GENMASK(7, 4)
+#define PACKET_ERR_FRAME_DATA		GENMASK(11, 8)
+#define PACKET_ERR_ID			GENMASK(15, 12)
+#define PACKET_ERR_ECC_1BIT		GENMASK(19, 16)
+#define PACKET_ERR_ECC_2BIT		BIT(20)
+#define PACKET_ERR_CHECKSUM		GENMASK(27, 24)
+
+#define AFIFO0_OVERFLOW			BIT(0)
+#define AFIFO1X_OVERFLOW		GENMASK(7, 4)
+#define LAFIFO1X_OVERFLOW		GENMASK(11, 8)
+#define AFIFO2X_OVERFLOW		GENMASK(14, 12)
+#define IBUFX3_OVERFLOW			GENMASK(18, 16)
+#define IBUF3R_OVERFLOW			BIT(19)
+#define Y_STAT_AFIFOX3_OVERFLOW		GENMASK(22, 20)
+
 #define RAW0_WR_FRAME			BIT(0)
 #define RAW1_WR_FRAME			BIT(1)
 #define RAW2_WR_FRAME			BIT(2)
@@ -2369,6 +2391,11 @@
 #define RAW0_RD_FRAME			BIT(4)
 #define RAW1_RD_FRAME			BIT(5)
 #define RAW2_RD_FRAME			BIT(6)
+#define RAW_WR_SIZE_ERR			GENMASK(15, 8)
+#define MIPI_LINECNT			BIT(16)
+#define RAW_RD_SIZE_ERR			GENMASK(19, 17)
+#define MIPI_FRAME_ST_VC(a)		(((a) & 0xf) << 20)
+#define MIPI_FRAME_END_VC(a)		(((a) & 0xf) << 24)
 #define RAW0_Y_STATE			BIT(28)
 #define RAW1_Y_STATE			BIT(29)
 #define RAW2_Y_STATE			BIT(30)
@@ -2599,6 +2626,9 @@ static inline void raw_wr_set_pic_size(struct rkisp_stream *stream,
 
 	if (stream->out_isp_fmt.fmt_type == FMT_YUV)
 		width *= 2;
+	/* hardware received 16bit embedded data */
+	else if (stream->out_isp_fmt.fmt_type == FMT_EBD)
+		width /= 2;
 	writel(height << 16 | width,
 	       base + stream->config->dma.pic_size);
 }
diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c
index 9380ac9512c8..7d1ced23b885 100644
--- a/drivers/media/platform/rockchip/isp/rkisp.c
+++ b/drivers/media/platform/rockchip/isp/rkisp.c
@@ -124,6 +124,12 @@ static int mbus_pixelcode_to_mipi_dt(u32 pixelcode)
 	case MEDIA_BUS_FMT_VYUY8_2X8:
 		mipi_dt = CIF_CSI2_DT_YUV422_8b;
 		break;
+	case MEDIA_BUS_FMT_EBD_1X8:
+		mipi_dt = CIF_CSI2_DT_EBD;
+		break;
+	case MEDIA_BUS_FMT_SPD_2X8:
+		mipi_dt = CIF_CSI2_DT_SPD;
+		break;
 	default:
 		mipi_dt = -EINVAL;
 	}
@@ -450,6 +456,12 @@ u32 rkisp_mbus_pixelcode_to_v4l2(u32 pixelcode)
 	case MEDIA_BUS_FMT_SRGGB12_1X12:
 		pixelformat = V4L2_PIX_FMT_SRGGB12;
 		break;
+	case MEDIA_BUS_FMT_EBD_1X8:
+		pixelformat = V4l2_PIX_FMT_EBD8;
+		break;
+	case MEDIA_BUS_FMT_SPD_2X8:
+		pixelformat = V4l2_PIX_FMT_SPD16;
+		break;
 	default:
 		pixelformat = V4L2_PIX_FMT_SRGGB10;
 	}

commit c6306a5510621b271a44396b9c94d8b20f8eea02
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Mon May 10 09:20:27 2021 +0800

    media: v4l: add embedded data and shield pix data format
    
    Change-Id: I59105c445ec5d94e5ae865bab7768ce5c6de2ec6
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
index d2d37382043c..e0f3505dfd1a 100644
--- a/drivers/media/v4l2-core/v4l2-ioctl.c
+++ b/drivers/media/v4l2-core/v4l2-ioctl.c
@@ -1361,6 +1361,8 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)
 		case V4L2_PIX_FMT_FBC2:		descr = "Rockchip yuv422sp fbc encoder"; break;
 		case V4L2_PIX_FMT_FBC0:		descr = "Rockchip yuv420sp fbc encoder"; break;
 		case V4L2_PIX_FMT_FBCG:		descr = "Rockchip fbc gain"; break;
+		case V4l2_PIX_FMT_EBD8:		descr = "Embedded data 8-bit"; break;
+		case V4l2_PIX_FMT_SPD16:	descr = "Shield pix data 16-bit"; break;
 		default:
 			WARN(1, "Unknown pixelformat 0x%08x\n", fmt->pixelformat);
 			if (fmt->description[0])
diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
index 4acbbaa74242..ba548d7f0784 100644
--- a/include/uapi/linux/videodev2.h
+++ b/include/uapi/linux/videodev2.h
@@ -701,6 +701,8 @@ struct v4l2_pix_format {
 #define V4L2_PIX_FMT_FBC2     v4l2_fourcc('F', 'B', 'C', '2') /* Rockchip yuv422sp frame buffer compression encoder */
 #define V4L2_PIX_FMT_FBC0     v4l2_fourcc('F', 'B', 'C', '0') /* Rockchip yuv420sp frame buffer compression encoder */
 #define V4L2_PIX_FMT_FBCG     v4l2_fourcc('F', 'B', 'C', 'G')
+#define V4l2_PIX_FMT_EBD8     v4l2_fourcc('E', 'B', 'D', '8') /* embedded data 8-bit */
+#define V4l2_PIX_FMT_SPD16    v4l2_fourcc('S', 'P', 'D', '6') /* shield pix data 16-bit */
 
 /* 10bit raw bayer packed, 32 bytes for every 25 pixels, last LSB 6 bits unused */
 #define V4L2_PIX_FMT_IPU3_SBGGR10	v4l2_fourcc('i', 'p', '3', 'b') /* IPU3 packed 10-bit BGGR bayer */

commit df0ed076f04c10a0dd2d643a60e71eb77bd883d6
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Mon Jun 8 19:25:43 2020 +0800

    media: uapi: Add EBD and SPD media bus format
    
    MEDIA_BUS_FMT_EBD_1X8: embedded data
    MEDIA_BUS_FMT_SPD_2X8: shield pixels data
    
    Change-Id: I5224dd860058f0d5d78a9038c53de9c9e048cb8f
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/include/uapi/linux/media-bus-format.h b/include/uapi/linux/media-bus-format.h
index 4ccd02049c3e..3ffd752e1374 100644
--- a/include/uapi/linux/media-bus-format.h
+++ b/include/uapi/linux/media-bus-format.h
@@ -154,10 +154,14 @@
 /* JPEG compressed formats - next is	0x4002 */
 #define MEDIA_BUS_FMT_JPEG_1X8			0x4001
 
-/* Vendor specific formats - next is	0x5002 */
+/* Vendor specific formats - next is	0x5004 */
 
 /* S5C73M3 sensor specific interleaved UYVY and JPEG */
 #define MEDIA_BUS_FMT_S5C_UYVY_JPEG_1X8		0x5001
+/* sensor embedded data format */
+#define MEDIA_BUS_FMT_EBD_1X8			0x5002
+/* sensor shield pix data format */
+#define MEDIA_BUS_FMT_SPD_2X8			0x5003
 
 /* HSV - next is	0x6002 */
 #define MEDIA_BUS_FMT_AHSV8888_1X32		0x6001

commit ff2f479da9231492ee6a654eed49bca02e391999
Author: Ding Wei <leo.ding@rock-chips.com>
Date:   Tue May 18 11:02:34 2021 +0800

    video: rockchip: mpp: Optimize kref_get within mem_regions
    
    tips:
    1. If fd has imported, then just copy mem_regiony struct.
    2. Task is the unit for running, and mem_region is the
       internal element of task.
    3. In mem_regions, it can only kref_get once with the same fd,
       instead of all fds which the same fd.
    
    Change-Id: I7236803a5a263d6e79256036caf580b5ac2c35e9
    Signed-off-by: Ding Wei <leo.ding@rock-chips.com>

diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c
index f4a33f941e2a..185076ffe901 100644
--- a/drivers/video/rockchip/mpp/mpp_common.c
+++ b/drivers/video/rockchip/mpp/mpp_common.c
@@ -1334,12 +1334,11 @@ mpp_task_attach_fd(struct mpp_task *task, int fd)
 	mem_region = &task->mem_regions[task->mem_count];
 	if (found) {
 		memcpy(mem_region, loop, sizeof(*loop));
-		buffer = mem_region->hdl;
-		kref_get(&buffer->ref);
+		mem_region->is_dup = true;
 	} else {
-		down_read(&mpp->iommu_info->rw_sem);
+		mpp_iommu_down_read(mpp->iommu_info);
 		buffer = mpp_dma_import_fd(mpp->iommu_info, dma, fd);
-		up_read(&mpp->iommu_info->rw_sem);
+		mpp_iommu_up_read(mpp->iommu_info);
 		if (IS_ERR_OR_NULL(buffer)) {
 			mpp_err("can't import dma-buf %d\n", fd);
 			return ERR_PTR(-ENOMEM);
@@ -1349,8 +1348,10 @@ mpp_task_attach_fd(struct mpp_task *task, int fd)
 		mem_region->iova = buffer->iova;
 		mem_region->len = buffer->size;
 		mem_region->fd = fd;
+		mem_region->is_dup = false;
 	}
 	task->mem_count++;
+	INIT_LIST_HEAD(&mem_region->reg_link);
 	list_add_tail(&mem_region->reg_link, &task->mem_region_list);
 
 	return mem_region;
@@ -1545,17 +1546,18 @@ int mpp_task_finish(struct mpp_session *session,
 int mpp_task_finalize(struct mpp_session *session,
 		      struct mpp_task *task)
 {
-	struct mpp_dev *mpp = NULL;
 	struct mpp_mem_region *mem_region = NULL, *n;
+	struct mpp_dev *mpp = session->mpp;
 
-	mpp = session->mpp;
 	/* release memory region attach to this registers table. */
 	list_for_each_entry_safe(mem_region, n,
 				 &task->mem_region_list,
 				 reg_link) {
-		mpp_iommu_down_read(mpp->iommu_info);
-		mpp_dma_release(session->dma, mem_region->hdl);
-		mpp_iommu_up_read(mpp->iommu_info);
+		if (!mem_region->is_dup) {
+			mpp_iommu_down_read(mpp->iommu_info);
+			mpp_dma_release(session->dma, mem_region->hdl);
+			mpp_iommu_up_read(mpp->iommu_info);
+		}
 		list_del_init(&mem_region->reg_link);
 	}
 
diff --git a/drivers/video/rockchip/mpp/mpp_common.h b/drivers/video/rockchip/mpp/mpp_common.h
index 68880851a38e..1dbbe6addce3 100644
--- a/drivers/video/rockchip/mpp/mpp_common.h
+++ b/drivers/video/rockchip/mpp/mpp_common.h
@@ -267,6 +267,8 @@ struct mpp_mem_region {
 	u32 reg_idx;
 	void *hdl;
 	int fd;
+	/* whether is dup import entity */
+	bool is_dup;
 };
 
 struct mpp_dma_session;

commit bcd00049f4b995b74229b9f8da221bbd12069733
Author: Caesar Wang <wxt@rock-chips.com>
Date:   Thu May 20 14:57:41 2021 +0800

    arm64: dts: rockchip: disable afbc by default on rk3568-linux.dtsi
    
    Signed-off-by: Caesar Wang <wxt@rock-chips.com>
    Change-Id: I1dbf50e9056242991afae4df3303c739065dfb6b

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
index 3f4d0e9a0fdc..32c1aeae8d71 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
@@ -53,3 +53,7 @@
 &rng {
 	status = "okay";
 };
+
+&vop {
+	disable-afbc-win;
+};

commit f58aa54a2705620cf1be33f1a8815d442cd76a21
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Tue May 18 16:44:24 2021 +0800

    drm/rockchip: vop2: Add option to disable afbc window
    
    Change-Id: I115a1671c0bf3a6e7af541a376fbdafa33bbb439
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 0bce63db5a6b..7fe2f47bfbb5 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -541,6 +541,7 @@ struct vop2 {
 	bool is_iommu_needed;
 	bool is_enabled;
 	bool support_multi_area;
+	bool disable_afbc_win;
 
 	bool loader_protect;
 
@@ -5610,6 +5611,11 @@ static int vop2_plane_init(struct vop2 *vop2, struct vop2_win *win, unsigned lon
 	unsigned int max_width, max_height;
 	int ret;
 
+	if (win->feature & WIN_FEATURE_AFBDC) {
+		if (vop2->disable_afbc_win)
+			return 0;
+	}
+
 	ret = drm_universal_plane_init(vop2->drm_dev, &win->base, possible_crtcs,
 				       &vop2_plane_funcs, win->formats, win->nformats,
 				       win->format_modifiers, win->type, win->name);
@@ -6126,6 +6132,7 @@ static int vop2_bind(struct device *dev, struct device *master, void *data)
 	dev_set_drvdata(dev, vop2);
 
 	vop2->support_multi_area = of_property_read_bool(dev->of_node, "support-multi-area");
+	vop2->disable_afbc_win = of_property_read_bool(dev->of_node, "disable-afbc-win");
 
 	ret = vop2_win_init(vop2);
 	if (ret)

commit 9b9760675bf195438ef3c92fad74b25590873c66
Author: Algea Cao <algea.cao@rock-chips.com>
Date:   Thu May 20 10:06:37 2021 +0800

    drm/bridge: synopsys: dw-hdmi: Fix cec timeout when resume
    
    Unmute cec irq when resume
    
    Signed-off-by: Algea Cao <algea.cao@rock-chips.com>
    Change-Id: Ic3d83ab7721fcf525d64ac08c970af3e51ecee88

diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index bf9dffdfdeb9..9e80533fde5b 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -4134,6 +4134,9 @@ static void dw_hdmi_reg_initial(struct dw_hdmi *hdmi)
 {
 	if (hdmi_readb(hdmi, HDMI_IH_MUTE)) {
 		initialize_hdmi_ih_mutes(hdmi);
+		/* unmute cec irq */
+		hdmi_writeb(hdmi, 0x68, HDMI_IH_MUTE_CEC_STAT0);
+
 		hdmi_writeb(hdmi, HDMI_PHY_I2CM_INT_ADDR_DONE_POL,
 			    HDMI_PHY_I2CM_INT_ADDR);
 

commit 7488e22d23a06d784cadf360a13e96e14900d01f
Author: Wang Panzhenzhuan <randy.wang@rock-chips.com>
Date:   Thu May 6 14:05:14 2021 +0800

    dt-bindings: media: i2c: Document add hi846
    
    Signed-off-by: Wang Panzhenzhuan <randy.wang@rock-chips.com>
    Change-Id: I94f48ed9d931a30d08f4af6d5c8ee203a4afbdf8

diff --git a/Documentation/devicetree/bindings/media/i2c/hi846.txt b/Documentation/devicetree/bindings/media/i2c/hi846.txt
new file mode 100644
index 000000000000..1b79cd8302a8
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/i2c/hi846.txt
@@ -0,0 +1,61 @@
+* Hynix hi846 MIPI CSI-2 sensor
+
+Required Properties:
+- compatible: should be "hynix,hi846"
+- clocks: reference to the 24M xvclk input clock.
+- clock-names: should be "xvclk".
+- dovdd-supply: Digital I/O voltage supply, 1.8 or 2.8 volts
+- avdd-supply: Analog voltage supply, 2.8 volts
+- dvdd-supply: Digital core voltage supply, 1.2 volts
+- power-gpios : High active reset gpio
+- reset-gpios: High active reset gpio
+- pwdn-gpios: High active reset gpio
+Optional Properties:
+- flash-leds : attached led node
+- lens-focus : attached vcm for focus
+
+Attention:
+hi846 device address is decided by I2C_ID_SEL0 & I2C_ID_SEL1 pins;
+
+Slave address(@ 8bit) I2C_ID_SEL0 I2C_ID_SEL1
+W : 0x40 / R : 0x41 Low(default) Low(default)
+W : 0x44 / R : 0x45 Low High
+W : 0x42 / R : 0x43 High Low
+W : 0x46 / R : 0x47 High High
+
+The device node must contain one 'port' child node for its digital output
+video port, in accordance with the video interface bindings defined in
+Documentation/devicetree/bindings/media/video-interfaces.txt.
+
+Example:
+//RK356x Board
+&i2c2 {
+	status = "okay";
+
+	hi846: hi846@20 {
+		status = "okay";
+		compatible = "hynix,hi846";
+		reg = <0x20>;
+		clocks = <&cru CLK_CIF_OUT>;
+		clock-names = "xvclk";
+		power-domains = <&power RK3568_PD_VI>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&cam_clkout0>;
+		power-gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>;
+		reset-gpios = <&gpio4 RK_PA7 GPIO_ACTIVE_HIGH>;
+		pwdn-gpios = <&gpio4 RK_PB2 GPIO_ACTIVE_HIGH>;
+		rockchip,camera-module-index = <0>;
+		rockchip,camera-module-facing = "back";
+		rockchip,camera-module-name = "KYT-8648-V1.0";
+		rockchip,camera-module-lens-name = "default";
+		flash-leds = <&flash_rgb13h>;
+		lens-focus = <&dw9714>;
+		port {
+			hi846_out: endpoint {
+				remote-endpoint = <&mipi_in_hi846>;
+				data-lanes = <1 2>;
+				//or data-lanes = <1 2 3 4>;
+			};
+		};
+	};
+};

commit d1b3204f5e3522c6acbffc9106f41cf6fd2ba4e3
Author: Wang Panzhenzhuan <randy.wang@rock-chips.com>
Date:   Thu May 6 11:07:28 2021 +0800

    media: i2c: add camera driver hynix hi846
    
    Signed-off-by: Wang Panzhenzhuan <randy.wang@rock-chips.com>
    Change-Id: I405dbd6c509cb7c3424d1f0fa6cfa355adb5a4d9

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index 81242c9f6206..ddf53533a0f4 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -1811,6 +1811,18 @@ config VIDEO_HYNIX_HI556
 	  To compile this driver as a module, choose M here: the
 	  module will be called hynix_hi556.
 
+config VIDEO_HYNIX_HI846
+	tristate "Hynix HI846 sensor support"
+	depends on VIDEO_V4L2 && I2C && MEDIA_CONTROLLER
+	depends on MEDIA_CAMERA_SUPPORT
+	select V4L2_FWNODE
+	help
+	  This is a Video4Linux2 sensor driver for the Hynix
+	  HI846 camera.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called hynix_hi846.
+
 comment "Flash devices"
 
 config VIDEO_ADP1653
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index 82cd96f93432..8b04ece4c36b 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -194,6 +194,7 @@ obj-$(CONFIG_VIDEO_SC430CS)	+= sc430cs.o
 obj-$(CONFIG_VIDEO_SC500AI)	+= sc500ai.o
 obj-$(CONFIG_VIDEO_SP250A)	+= sp250a.o
 obj-$(CONFIG_VIDEO_HYNIX_HI556)	+= hynix_hi556.o
+obj-$(CONFIG_VIDEO_HYNIX_HI846)	+= hynix_hi846.o
 
 obj-$(CONFIG_VIDEO_PREISP_DUMMY_SENSOR)	+= preisp-dummy.o
 
diff --git a/drivers/media/i2c/hynix_hi846.c b/drivers/media/i2c/hynix_hi846.c
new file mode 100644
index 000000000000..4a1434203854
--- /dev/null
+++ b/drivers/media/i2c/hynix_hi846.c
@@ -0,0 +1,2137 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * hi846 driver
+ *
+ * Copyright (C) 2021 Rockchip Electronics Co., Ltd.
+ *
+ * V0.0X01.0X00 init version
+ */
+
+#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/of.h>
+#include <linux/of_graph.h>
+#include <linux/regulator/consumer.h>
+#include <linux/sysfs.h>
+#include <linux/pinctrl/consumer.h>
+#include <linux/version.h>
+#include <media/v4l2-async.h>
+#include <media/media-entity.h>
+#include <media/v4l2-common.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-event.h>
+#include <media/v4l2-fwnode.h>
+#include <media/v4l2-image-sizes.h>
+#include <media/v4l2-mediabus.h>
+#include <media/v4l2-subdev.h>
+
+#include <linux/rk-camera-module.h>
+
+/* verify default register values */
+//#define CHECK_REG_VALUE
+
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x00)
+
+#ifndef V4L2_CID_DIGITAL_GAIN
+#define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
+#endif
+
+/* pixel rate = link frequency * 2 * lanes / BITS_PER_SAMPLE */
+#define MIPI_FREQ_360MHZ		360000000LL
+#define MIPI_FREQ_720MHZ		720000000LL
+#define HI846_XVCLK_FREQ		24000000
+
+#define CHIP_ID				0x0846
+#define HI846_REG_CHIP_ID_H		0x0f17
+#define HI846_REG_CHIP_ID_L		0x0f16
+
+#define HI846_REG_CTRL_MODE		0x0A00
+#define HI846_MODE_SW_STANDBY		0x00
+#define HI846_MODE_STREAMING		0x01
+
+#define HI846_REG_EXPOSURE_H		0x0073
+#define HI846_REG_EXPOSURE_M		0x0074
+#define HI846_REG_EXPOSURE_L		0x0075
+#define HI846_FETCH_HIGH_BYTE_EXP(VAL)	(((VAL) >> 16) & 0xF)	/* 4 Bits */
+#define HI846_FETCH_MIDDLE_BYTE_EXP(VAL) (((VAL) >> 8) & 0xFF)	/* 8 Bits */
+#define HI846_FETCH_LOW_BYTE_EXP(VAL)	((VAL) & 0xFF)	/* 8 Bits */
+
+#define	HI846_EXPOSURE_MIN		4
+#define	HI846_EXPOSURE_STEP		1
+#define HI846_VTS_MAX			0x7fff
+
+#define HI846_REG_GAIN			0x0077
+#define HI846_GAIN_MASK			0xff
+
+#define	ANALOG_GAIN_MIN			0x00
+#define	ANALOG_GAIN_MAX			0xF0
+#define	ANALOG_GAIN_STEP		1
+#define	ANALOG_GAIN_DEFAULT		0x10
+
+#define HI846_REG_GROUP	0x0046
+
+#define HI846_REG_TEST_PATTERN		0x0A05
+#define	HI846_TEST_PATTERN_ENABLE	0x01
+#define	HI846_TEST_PATTERN_DISABLE	0x0
+#define HI846_REG_TEST_PATTERN_SELECT	0x020a
+
+#define HI846_REG_VTS			0x0006
+
+#define REG_NULL			0xFFFF
+#define DELAY_MS			0xEEEE	/* Array delay token */
+
+#define HI846_REG_VALUE_08BIT		1
+#define HI846_REG_VALUE_16BIT		2
+#define HI846_REG_VALUE_24BIT		3
+
+#define HI846_LANES			2
+#define HI846_BITS_PER_SAMPLE		10
+
+#define OF_CAMERA_PINCTRL_STATE_DEFAULT	"rockchip,camera_default"
+#define OF_CAMERA_PINCTRL_STATE_SLEEP	"rockchip,camera_sleep"
+
+#define HI846_NAME			"hi846"
+
+#define HI846_MEDIA_BUS_FMT		MEDIA_BUS_FMT_SGRBG10_1X10
+
+static const struct regval *hi846_global_regs;
+
+struct hi846_otp_info {
+	int flag; // bit[7]: info, bit[6]:wb
+	int module_id;
+	int lens_id;
+	int year;
+	int month;
+	int day;
+	int rg_ratio;
+	int bg_ratio;
+};
+
+static const char * const hi846_supply_names[] = {
+	"avdd",		/* Analog power */
+	"dovdd",	/* Digital I/O power */
+	"dvdd",		/* Digital core power */
+};
+
+#define HI846_NUM_SUPPLIES ARRAY_SIZE(hi846_supply_names)
+
+struct regval {
+	u16 addr;
+	u16 val;
+};
+
+struct hi846_mode {
+	u32 width;
+	u32 height;
+	struct v4l2_fract max_fps;
+	u32 hts_def;
+	u32 vts_def;
+	u32 exp_def;
+	const struct regval *reg_list;
+	u32 hdr_mode;
+};
+
+struct hi846 {
+	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[HI846_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	*test_pattern;
+	struct mutex		mutex;
+	bool			streaming;
+	bool			power_on;
+	const struct hi846_mode *cur_mode;
+	unsigned int lane_num;
+	unsigned int cfg_num;
+	unsigned int pixel_rate;
+	u32			module_index;
+	struct hi846_otp_info *otp;
+	const char		*module_facing;
+	const char		*module_name;
+	const char		*len_name;
+	struct rkmodule_awb_cfg	awb_cfg;
+};
+
+#define to_hi846(sd) container_of(sd, struct hi846, subdev)
+
+/*
+ * Xclk 24Mhz
+ * Pclk 288Mhz
+ * linelength 3800(0xED8)
+ * framelength 2526(0x9DE)
+ * grabwindow_width 3264
+ * grabwindow_height 2448
+ * max_framerate 30fps
+ * MIPI speed(Mbps) : 1440Mbps x 2Lane
+ */
+static const struct regval hi846_global_regs_2lane[] = {
+	{0x2000, 0x100A},
+	{0x2002, 0x00FF},
+	{0x2004, 0x0007},
+	{0x2006, 0x3FFF},
+	{0x2008, 0x3FFF},
+	{0x200A, 0xC216},
+	{0x200C, 0x1292},
+	{0x200E, 0xC01A},
+	{0x2010, 0x403D},
+	{0x2012, 0x000E},
+	{0x2014, 0x403E},
+	{0x2016, 0x0B80},
+	{0x2018, 0x403F},
+	{0x201A, 0x82AE},
+	{0x201C, 0x1292},
+	{0x201E, 0xC00C},
+	{0x2020, 0x4130},
+	{0x2022, 0x43E2},
+	{0x2024, 0x0180},
+	{0x2026, 0x4130},
+	{0x2028, 0x7400},
+	{0x202A, 0x5000},
+	{0x202C, 0x0253},
+	{0x202E, 0x0AD1},
+	{0x2030, 0x2360},
+	{0x2032, 0x0009},
+	{0x2034, 0x5020},
+	{0x2036, 0x000B},
+	{0x2038, 0x0002},
+	{0x203A, 0x0044},
+	{0x203C, 0x0016},
+	{0x203E, 0x1792},
+	{0x2040, 0x7002},
+	{0x2042, 0x154F},
+	{0x2044, 0x00D5},
+	{0x2046, 0x000B},
+	{0x2048, 0x0019},
+	{0x204A, 0x1698},
+	{0x204C, 0x000E},
+	{0x204E, 0x099A},
+	{0x2050, 0x0058},
+	{0x2052, 0x7000},
+	{0x2054, 0x1799},
+	{0x2056, 0x0310},
+	{0x2058, 0x03C3},
+	{0x205A, 0x004C},
+	{0x205C, 0x064A},
+	{0x205E, 0x0001},
+	{0x2060, 0x0007},
+	{0x2062, 0x0BC7},
+	{0x2064, 0x0055},
+	{0x2066, 0x7000},
+	{0x2068, 0x1550},
+	{0x206A, 0x158A},
+	{0x206C, 0x0004},
+	{0x206E, 0x1488},
+	{0x2070, 0x7010},
+	{0x2072, 0x1508},
+	{0x2074, 0x0004},
+	{0x2076, 0x0016},
+	{0x2078, 0x03D5},
+	{0x207A, 0x0055},
+	{0x207C, 0x08CA},
+	{0x207E, 0x2019},
+	{0x2080, 0x0007},
+	{0x2082, 0x7057},
+	{0x2084, 0x0FC7},
+	{0x2086, 0x5041},
+	{0x2088, 0x12C8},
+	{0x208A, 0x5060},
+	{0x208C, 0x5080},
+	{0x208E, 0x2084},
+	{0x2090, 0x12C8},
+	{0x2092, 0x7800},
+	{0x2094, 0x0802},
+	{0x2096, 0x040F},
+	{0x2098, 0x1007},
+	{0x209A, 0x0803},
+	{0x209C, 0x080B},
+	{0x209E, 0x3803},
+	{0x20A0, 0x0807},
+	{0x20A2, 0x0404},
+	{0x20A4, 0x0400},
+	{0x20A6, 0xFFFF},
+	{0x20A8, 0xF0B2},
+	{0x20AA, 0xFFEF},
+	{0x20AC, 0x0A84},
+	{0x20AE, 0x1292},
+	{0x20B0, 0xC02E},
+	{0x20B2, 0x4130},
+	{0x23FE, 0xC056},
+	{0x3232, 0xFC0C},
+	{0x3236, 0xFC22},
+	{0x3248, 0xFCA8},
+	{0x326A, 0x8302},
+	{0x326C, 0x830A},
+	{0x326E, 0x0000},
+	{0x32CA, 0xFC28},
+	{0x32CC, 0xC3BC},
+	{0x32CE, 0xC34C},
+	{0x32D0, 0xC35A},
+	{0x32D2, 0xC368},
+	{0x32D4, 0xC376},
+	{0x32D6, 0xC3C2},
+	{0x32D8, 0xC3E6},
+	{0x32DA, 0x0003},
+	{0x32DC, 0x0003},
+	{0x32DE, 0x00C7},
+	{0x32E0, 0x0031},
+	{0x32E2, 0x0031},
+	{0x32E4, 0x0031},
+	{0x32E6, 0xFC28},
+	{0x32E8, 0xC3BC},
+	{0x32EA, 0xC384},
+	{0x32EC, 0xC392},
+	{0x32EE, 0xC3A0},
+	{0x32F0, 0xC3AE},
+	{0x32F2, 0xC3C4},
+	{0x32F4, 0xC3E6},
+	{0x32F6, 0x0003},
+	{0x32F8, 0x0003},
+	{0x32FA, 0x00C7},
+	{0x32FC, 0x0031},
+	{0x32FE, 0x0031},
+	{0x3300, 0x0031},
+	{0x3302, 0x82CA},
+	{0x3304, 0xC164},
+	{0x3306, 0x82E6},
+	{0x3308, 0xC19C},
+	{0x330A, 0x001F},
+	{0x330C, 0x001A},
+	{0x330E, 0x0034},
+	{0x3310, 0x0000},
+	{0x3312, 0x0000},
+	{0x3314, 0xFC94},
+	{0x3316, 0xC3D8},
+
+	{0x0A00, 0x0000},
+	{0x0E04, 0x0012},
+	{0x002E, 0x1111},
+	{0x0032, 0x1111},
+	{0x0022, 0x0008},
+	{0x0026, 0x0040},
+	{0x0028, 0x0017},
+	{0x002C, 0x09CF},
+	{0x005C, 0x2101},
+	{0x0006, 0x09BC},
+	{0x0008, 0x0ED8},
+	{0x000E, 0x0200},
+	{0x000C, 0x0022},
+	{0x0A22, 0x0000},
+	{0x0A24, 0x0000},
+	{0x0804, 0x0000},
+	{0x0A12, 0x0CC0},
+	{0x0A14, 0x0990},
+	{0x0074, 0x09B6},
+	{0x0076, 0x0000},
+	{0x051E, 0x0000},
+	{0x0200, 0x0400},
+	{0x0A1A, 0x0C00},
+	{0x0A0C, 0x0010},
+	{0x0A1E, 0x0CCF},
+	{0x0402, 0x0110},
+	{0x0404, 0x00F4},
+	{0x0408, 0x0000},
+	{0x0410, 0x008D},
+	{0x0412, 0x011A},
+	{0x0414, 0x864C},
+	{0x021C, 0x0001},
+	{0x0C00, 0x9150},
+	{0x0C06, 0x0021},
+	{0x0C10, 0x0040},
+	{0x0C12, 0x0040},
+	{0x0C14, 0x0040},
+	{0x0C16, 0x0040},
+	{0x0A02, 0x0100},
+	{0x0A04, 0x014A},
+	{0x0418, 0x0000},
+	{0x012A, 0x03B4},
+	{0x0120, 0x0046},
+	{0x0122, 0x0376},
+	{0x0B02, 0xE04D},
+	{0x0B10, 0x6821},
+	{0x0B12, 0x0120},
+	{0x0B14, 0x0001},
+	{0x2008, 0x38FD},
+	{0x326E, 0x0000},
+	{0x0900, 0x0320},
+	{0x0902, 0xC31A},
+	{0x0914, 0xC109},
+	{0x0916, 0x061A},
+	{0x0918, 0x0306},
+	{0x091A, 0x0B09},
+	{0x091C, 0x0C07},
+	{0x091E, 0x0A00},
+	{0x090C, 0x042A},
+	{0x090E, 0x006B},
+	{0x0954, 0x0089},
+	{0x0956, 0x0000},
+	{0x0958, 0xCA00},
+	{0x095A, 0x9240},
+	{0x0F08, 0x2F04},
+	{0x0F30, 0x001F},
+	{0x0F36, 0x001F},
+	{0x0F04, 0x3A00},
+	{0x0F32, 0x025A},
+	{0x0F38, 0x025A},
+	{0x0F2A, 0x0024},
+	{0x006A, 0x0100},
+	{0x004C, 0x0100},
+	//{0x0A00, 0x0100},
+	{0x003c, 0x0101}, //fix framerate
+
+	{REG_NULL, 0x00},
+};
+
+/*
+ * Xclk 24Mhz
+ * Pclk 288Mhz
+ * linelength 3800(0xED8)
+ * framelength 2526(0x9DE)
+ * grabwindow_width 3264
+ * grabwindow_height 2448
+ * max_framerate 30fps
+ * MIPI speed(Mbps) : 1440Mbps x 2Lane
+ */
+static const struct regval hi846_3264x2448_regs_2lane[] = {
+	{0x0A00, 0x0000},
+	{0x002E, 0x1111},
+	{0x0032, 0x1111},
+	{0x0026, 0x0040},
+	{0x002C, 0x09CF},
+	{0x005C, 0x2101},
+	{0x0006, 0x09BC},
+	{0x0008, 0x0ED8},
+	{0x000C, 0x0022},
+	{0x0A22, 0x0000},
+	{0x0A24, 0x0000},
+	{0x0804, 0x0000},
+	{0x0A12, 0x0CC0},
+	{0x0A14, 0x0990},
+	{0x0074, 0x09B6},
+	{0x0A04, 0x014A},
+	{0x0418, 0x0000},
+	{0x0B02, 0xE04D},
+	{0x0B10, 0x6821},
+	{0x0B12, 0x0120},
+	{0x0B14, 0x0001},
+	{0x2008, 0x38FD},
+	{0x326E, 0x0000},
+	//=============================================//
+	//		MIPI 2lane 1440Mbps
+	//=============================================//
+	{0x0900, 0x0320},
+	{0x0902, 0xC31A},
+	{0x0914, 0xC109},
+	{0x0916, 0x061A},
+	{0x0918, 0x0306},
+	{0x091A, 0x0B09},
+	{0x091C, 0x0C07},
+	{0x091E, 0x0A00},
+	{0x090C, 0x042A},
+	{0x090E, 0x006B},
+	{0x0954, 0x0089},
+	{0x0956, 0x0000},
+	{0x0958, 0xCA00},
+	{0x095A, 0x9240},
+	{0x0F2A, 0x0024},
+	{0x004C, 0x0100},
+	//{0x0A00, 0x0100},
+
+	{REG_NULL, 0x00},
+};
+
+/*
+ * Xclk 24Mhz
+ * Pclk 288Mhz
+ * linelength 3800(0xED8)
+ * framelength 2526(0x9DE)
+ * grabwindow_width 3264
+ * grabwindow_height 2448
+ * max_framerate 30fps
+ * MIPI speed(Mbps) : 720Mbps x 4Lane
+ */
+static const struct regval hi846_global_regs_4lane[] = {
+	{0x2000, 0x987a},
+	{0x2002, 0x00ff},
+	{0x2004, 0x0047},
+	{0x2006, 0x3fff},
+	{0x2008, 0x3fff},
+	{0x200a, 0xc216},
+	{0x200c, 0x1292},
+	{0x200e, 0xc01a},
+	{0x2010, 0x403d},
+	{0x2012, 0x000e},
+	{0x2014, 0x403e},
+	{0x2016, 0x0b80},
+	{0x2018, 0x403f},
+	{0x201a, 0x82ae},
+	{0x201c, 0x1292},
+	{0x201e, 0xc00c},
+	{0x2020, 0x4130},
+	{0x2022, 0x43e2},
+	{0x2024, 0x0180},
+	{0x2026, 0x4130},
+	{0x2028, 0x7400},
+	{0x202a, 0x5000},
+	{0x202c, 0x0253},
+	{0x202e, 0x0ad1},
+	{0x2030, 0x2360},
+	{0x2032, 0x0009},
+	{0x2034, 0x5020},
+	{0x2036, 0x000b},
+	{0x2038, 0x0002},
+	{0x203a, 0x0044},
+	{0x203c, 0x0016},
+	{0x203e, 0x1792},
+	{0x2040, 0x7002},
+	{0x2042, 0x154f},
+	{0x2044, 0x00d5},
+	{0x2046, 0x000b},
+	{0x2048, 0x0019},
+	{0x204a, 0x1698},
+	{0x204c, 0x000e},
+	{0x204e, 0x099a},
+	{0x2050, 0x0058},
+	{0x2052, 0x7000},
+	{0x2054, 0x1799},
+	{0x2056, 0x0310},
+	{0x2058, 0x03c3},
+	{0x205a, 0x004c},
+	{0x205c, 0x064a},
+	{0x205e, 0x0001},
+	{0x2060, 0x0007},
+	{0x2062, 0x0bc7},
+	{0x2064, 0x0055},
+	{0x2066, 0x7000},
+	{0x2068, 0x1550},
+	{0x206a, 0x158a},
+	{0x206c, 0x0004},
+	{0x206e, 0x1488},
+	{0x2070, 0x7010},
+	{0x2072, 0x1508},
+	{0x2074, 0x0004},
+	{0x2076, 0x0016},
+	{0x2078, 0x03d5},
+	{0x207a, 0x0055},
+	{0x207c, 0x08ca},
+	{0x207e, 0x2019},
+	{0x2080, 0x0007},
+	{0x2082, 0x7057},
+	{0x2084, 0x0fc7},
+	{0x2086, 0x5041},
+	{0x2088, 0x12c8},
+	{0x208a, 0x5060},
+	{0x208c, 0x5080},
+	{0x208e, 0x2084},
+	{0x2090, 0x12c8},
+	{0x2092, 0x7800},
+	{0x2094, 0x0802},
+	{0x2096, 0x040f},
+	{0x2098, 0x1007},
+	{0x209a, 0x0803},
+	{0x209c, 0x080b},
+	{0x209e, 0x3803},
+	{0x20a0, 0x0807},
+	{0x20a2, 0x0404},
+	{0x20a4, 0x0400},
+	{0x20a6, 0xffff},
+	{0x20a8, 0xf0b2},
+	{0x20aa, 0xffef},
+	{0x20ac, 0x0a84},
+	{0x20ae, 0x1292},
+	{0x20b0, 0xc02e},
+	{0x20b2, 0x4130},
+	{0x20b4, 0xf0b2},
+	{0x20b6, 0xffbf},
+	{0x20b8, 0x2004},
+	{0x20ba, 0x403f},
+	{0x20bc, 0x00c3},
+	{0x20be, 0x4fe2},
+	{0x20c0, 0x8318},
+	{0x20c2, 0x43cf},
+	{0x20c4, 0x0000},
+	{0x20c6, 0x9382},
+	{0x20c8, 0xc314},
+	{0x20ca, 0x2003},
+	{0x20cc, 0x12b0},
+	{0x20ce, 0xcab0},
+	{0x20d0, 0x4130},
+	{0x20d2, 0x12b0},
+	{0x20d4, 0xc90a},
+	{0x20d6, 0x4130},
+	{0x20d8, 0x42d2},
+	{0x20da, 0x8318},
+	{0x20dc, 0x00c3},
+	{0x20de, 0x9382},
+	{0x20e0, 0xc314},
+	{0x20e2, 0x2009},
+	{0x20e4, 0x120b},
+	{0x20e6, 0x120a},
+	{0x20e8, 0x1209},
+	{0x20ea, 0x1208},
+	{0x20ec, 0x1207},
+	{0x20ee, 0x1206},
+	{0x20f0, 0x4030},
+	{0x20f2, 0xc15e},
+	{0x20f4, 0x4130},
+	{0x20f6, 0x1292},
+	{0x20f8, 0xc008},
+	{0x20fa, 0x4130},
+	{0x20fc, 0x42d2},
+	{0x20fe, 0x82a1},
+	{0x2100, 0x00c2},
+	{0x2102, 0x1292},
+	{0x2104, 0xc040},
+	{0x2106, 0x4130},
+	{0x2108, 0x1292},
+	{0x210a, 0xc006},
+	{0x210c, 0x42a2},
+	{0x210e, 0x7324},
+	{0x2110, 0x9382},
+	{0x2112, 0xc314},
+	{0x2114, 0x2011},
+	{0x2116, 0x425f},
+	{0x2118, 0x82a1},
+	{0x211a, 0xf25f},
+	{0x211c, 0x00c1},
+	{0x211e, 0xf35f},
+	{0x2120, 0x2406},
+	{0x2122, 0x425f},
+	{0x2124, 0x00c0},
+	{0x2126, 0xf37f},
+	{0x2128, 0x522f},
+	{0x212a, 0x4f82},
+	{0x212c, 0x7324},
+	{0x212e, 0x425f},
+	{0x2130, 0x82d4},
+	{0x2132, 0xf35f},
+	{0x2134, 0x4fc2},
+	{0x2136, 0x01b3},
+	{0x2138, 0x93c2},
+	{0x213a, 0x829f},
+	{0x213c, 0x2421},
+	{0x213e, 0x403e},
+	{0x2140, 0xfffe},
+	{0x2142, 0x40b2},
+	{0x2144, 0xec78},
+	{0x2146, 0x831c},
+	{0x2148, 0x40b2},
+	{0x214a, 0xec78},
+	{0x214c, 0x831e},
+	{0x214e, 0x40b2},
+	{0x2150, 0xec78},
+	{0x2152, 0x8320},
+	{0x2154, 0xb3d2},
+	{0x2156, 0x008c},
+	{0x2158, 0x2405},
+	{0x215a, 0x4e0f},
+	{0x215c, 0x503f},
+	{0x215e, 0xffd8},
+	{0x2160, 0x4f82},
+	{0x2162, 0x831c},
+	{0x2164, 0x90f2},
+	{0x2166, 0x0003},
+	{0x2168, 0x008c},
+	{0x216a, 0x2401},
+	{0x216c, 0x4130},
+	{0x216e, 0x421f},
+	{0x2170, 0x831c},
+	{0x2172, 0x5e0f},
+	{0x2174, 0x4f82},
+	{0x2176, 0x831e},
+	{0x2178, 0x5e0f},
+	{0x217a, 0x4f82},
+	{0x217c, 0x8320},
+	{0x217e, 0x3ff6},
+	{0x2180, 0x432e},
+	{0x2182, 0x3fdf},
+	{0x2184, 0x421f},
+	{0x2186, 0x7100},
+	{0x2188, 0x4f0e},
+	{0x218a, 0x503e},
+	{0x218c, 0xffd8},
+	{0x218e, 0x4e82},
+	{0x2190, 0x7a04},
+	{0x2192, 0x421e},
+	{0x2194, 0x831c},
+	{0x2196, 0x5f0e},
+	{0x2198, 0x4e82},
+	{0x219a, 0x7a06},
+	{0x219c, 0x0b00},
+	{0x219e, 0x7304},
+	{0x21a0, 0x0050},
+	{0x21a2, 0x40b2},
+	{0x21a4, 0xd081},
+	{0x21a6, 0x0b88},
+	{0x21a8, 0x421e},
+	{0x21aa, 0x831e},
+	{0x21ac, 0x5f0e},
+	{0x21ae, 0x4e82},
+	{0x21b0, 0x7a0e},
+	{0x21b2, 0x521f},
+	{0x21b4, 0x8320},
+	{0x21b6, 0x4f82},
+	{0x21b8, 0x7a10},
+	{0x21ba, 0x0b00},
+	{0x21bc, 0x7304},
+	{0x21be, 0x007a},
+	{0x21c0, 0x40b2},
+	{0x21c2, 0x0081},
+	{0x21c4, 0x0b88},
+	{0x21c6, 0x4392},
+	{0x21c8, 0x7a0a},
+	{0x21ca, 0x0800},
+	{0x21cc, 0x7a0c},
+	{0x21ce, 0x0b00},
+	{0x21d0, 0x7304},
+	{0x21d2, 0x022b},
+	{0x21d4, 0x40b2},
+	{0x21d6, 0xd081},
+	{0x21d8, 0x0b88},
+	{0x21da, 0x0b00},
+	{0x21dc, 0x7304},
+	{0x21de, 0x0255},
+	{0x21e0, 0x40b2},
+	{0x21e2, 0x0081},
+	{0x21e4, 0x0b88},
+	{0x21e6, 0x4130},
+	{0x23fe, 0xc056},
+	{0x3232, 0xfc0c},
+	{0x3236, 0xfc22},
+	{0x3238, 0xfcfc},
+	{0x323a, 0xfd84},
+	{0x323c, 0xfd08},
+	{0x3246, 0xfcd8},
+	{0x3248, 0xfca8},
+	{0x324e, 0xfcb4},
+	{0x326a, 0x8302},
+	{0x326c, 0x830a},
+	{0x326e, 0x0000},
+	{0x32ca, 0xfc28},
+	{0x32cc, 0xc3bc},
+	{0x32ce, 0xc34c},
+	{0x32d0, 0xc35a},
+	{0x32d2, 0xc368},
+	{0x32d4, 0xc376},
+	{0x32d6, 0xc3c2},
+	{0x32d8, 0xc3e6},
+	{0x32da, 0x0003},
+	{0x32dc, 0x0003},
+	{0x32de, 0x00c7},
+	{0x32e0, 0x0031},
+	{0x32e2, 0x0031},
+	{0x32e4, 0x0031},
+	{0x32e6, 0xfc28},
+	{0x32e8, 0xc3bc},
+	{0x32ea, 0xc384},
+	{0x32ec, 0xc392},
+	{0x32ee, 0xc3a0},
+	{0x32f0, 0xc3ae},
+	{0x32f2, 0xc3c4},
+	{0x32f4, 0xc3e6},
+	{0x32f6, 0x0003},
+	{0x32f8, 0x0003},
+	{0x32fa, 0x00c7},
+	{0x32fc, 0x0031},
+	{0x32fe, 0x0031},
+	{0x3300, 0x0031},
+	{0x3302, 0x82ca},
+	{0x3304, 0xc164},
+	{0x3306, 0x82e6},
+	{0x3308, 0xc19c},
+	{0x330a, 0x001f},
+	{0x330c, 0x001a},
+	{0x330e, 0x0034},
+	{0x3310, 0x0000},
+	{0x3312, 0x0000},
+	{0x3314, 0xfc94},
+	{0x3316, 0xc3d8},
+
+	{0x0a00, 0x0000},
+	{0x0e04, 0x0012},
+	{0x002e, 0x1111},
+	{0x0032, 0x1111},
+	{0x0022, 0x0008},
+	{0x0026, 0x0040},
+	{0x0028, 0x0017},
+	{0x002c, 0x09cf},
+	{0x005c, 0x2101},
+	{0x0006, 0x09de},
+	{0x0008, 0x0ed8},
+	{0x000e, 0x0200},
+	{0x000c, 0x0022},
+	{0x0a22, 0x0000},
+	{0x0a24, 0x0000},
+	{0x0804, 0x0000},
+	{0x0a12, 0x0cc0},
+	{0x0a14, 0x0990},
+	{0x0074, 0x09d8},
+	{0x0076, 0x0000},
+	{0x051e, 0x0000},
+	{0x0200, 0x0400},
+	{0x0a1a, 0x0c00},
+	{0x0a0c, 0x0010},
+	{0x0a1e, 0x0ccf},
+	{0x0402, 0x0110},
+	{0x0404, 0x00f4},
+	{0x0408, 0x0000},
+	{0x0410, 0x008d},
+	{0x0412, 0x011a},
+	{0x0414, 0x864c},
+	{0x021c, 0x0001},
+	{0x0c00, 0x9950},
+	{0x0c06, 0x0021},
+	{0x0c10, 0x0040},
+	{0x0c12, 0x0040},
+	{0x0c14, 0x0040},
+	{0x0c16, 0x0040},
+	{0x0a02, 0x0100},
+	{0x0a04, 0x014a},
+	{0x0418, 0x0000},
+	{0x012a, 0xffff},
+	{0x0120, 0x0046},
+	{0x0122, 0x0376},
+	{0x0746, 0x0050},
+	{0x0748, 0x01d5},
+	{0x074a, 0x022b},
+	{0x074c, 0x03b0},
+	{0x0756, 0x043f},
+	{0x0758, 0x3f1d},
+	{0x0b02, 0xe04d},
+	{0x0b10, 0x6821},
+	{0x0b12, 0x0120},
+	{0x0b14, 0x0001},
+	{0x2008, 0x38fd},
+	{0x326e, 0x0000},
+	{0x0900, 0x0300},
+	{0x0902, 0xc319},
+	{0x0914, 0xc109},
+	{0x0916, 0x061a},
+	{0x0918, 0x0407},
+	{0x091a, 0x0a0b},
+	{0x091c, 0x0e08},
+	{0x091e, 0x0a00},
+	{0x090c, 0x0427},
+	{0x090e, 0x0069},
+	{0x0954, 0x0089},
+	{0x0956, 0x0000},
+	{0x0958, 0xca80},
+	{0x095a, 0x9240},
+	{0x0f08, 0x2f04},
+	{0x0f30, 0x001f},
+	{0x0f36, 0x001f},
+	{0x0f04, 0x3a00},
+	{0x0f32, 0x025a},
+	{0x0f38, 0x025a},
+	{0x0f2a, 0x4124},
+	{0x006a, 0x0100},
+	{0x004c, 0x0100},
+	{0x003c, 0x0101}, //fix framerate
+	{REG_NULL, 0x00},
+};
+
+/*
+ * Xclk 24Mhz
+ * Pclk 288Mhz
+ * linelength 3800(0xED8)
+ * framelength 2526(0x9DE)
+ * grabwindow_width 3264
+ * grabwindow_height 2448
+ * max_framerate 30fps
+ * MIPI speed(Mbps) : 720Mbps x 4Lane
+ */
+static const struct regval hi846_3264x2448_regs_4lane[] = {
+	{0x0a00, 0x0000},
+	{0x002e, 0x1111},
+	{0x0032, 0x1111},
+	{0x0026, 0x0040},
+	{0x002c, 0x09cf},
+	{0x005c, 0x2101},
+	{0x0006, 0x09de},
+	{0x0008, 0x0ed8},
+	{0x000c, 0x0022},
+	{0x0a22, 0x0000},
+	{0x0a24, 0x0000},
+	{0x0804, 0x0000},
+	{0x0a12, 0x0cc0},
+	{0x0a14, 0x0990},
+	{0x0074, 0x09d8},
+	{0x0a04, 0x014a},
+	{0x0418, 0x0000},
+	{0x0b02, 0xe04d},
+	{0x0b10, 0x6821},
+	{0x0b12, 0x0120},
+	{0x0b14, 0x0001},
+	{0x2008, 0x38fd},
+	{0x326e, 0x0000},
+	//=============================================//
+	//      MIPI 4lane 720Mbps
+	//=============================================//
+	{0x0900, 0x0300},
+	{0x0902, 0xc319},
+	{0x0914, 0xc109},
+	{0x0916, 0x061a},
+	{0x0918, 0x0407},
+	{0x091a, 0x0a0b},
+	{0x091c, 0x0e08},
+	{0x091e, 0x0a00},
+	{0x090c, 0x0427},
+	{0x090e, 0x0069},
+	{0x0954, 0x0089},
+	{0x0956, 0x0000},
+	{0x0958, 0xca80},
+	{0x095a, 0x9240},
+	{0x0f2a, 0x4124},
+	{0x004c, 0x0100},
+	//{0x0a00, 0x0100},
+
+	{REG_NULL, 0x00},
+};
+
+static const struct hi846_mode supported_modes_2lane[] = {
+	{
+		.width = 3264,
+		.height = 2448,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x09B0,
+		.hts_def = 0x0ED8,
+		.vts_def = 0x09DE,
+		.reg_list = hi846_3264x2448_regs_2lane,
+		.hdr_mode = NO_HDR,
+	},
+};
+
+static const struct hi846_mode supported_modes_4lane[] = {
+	{
+		.width = 3264,
+		.height = 2448,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x09B0,
+		.hts_def = 0x0ED8,
+		.vts_def = 0x09DE,
+		.reg_list = hi846_3264x2448_regs_4lane,
+		.hdr_mode = NO_HDR,
+	}
+};
+
+static const struct hi846_mode *supported_modes;
+
+static const s64 link_freq_menu_items[] = {
+	MIPI_FREQ_360MHZ,
+	MIPI_FREQ_720MHZ
+};
+
+static const char * const hi846_test_pattern_menu[] = {
+	"Disabled",
+	"Solid color bar",
+	"100% color bars",
+	"Fade to gray color bars",
+	"PN9",
+	"Horizental/Vertical gradient",
+	"Check board",
+	"Slant",
+	"Resolution",
+};
+
+/* Write registers up to 4 at a time */
+static int hi846_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, "%s(%d) enter!\n", __func__, __LINE__);
+	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) {
+		dev_err(&client->dev,
+			   "write reg(0x%x val:0x%x)failed !\n", reg, val);
+		return -EIO;
+	}
+	return 0;
+}
+
+static int hi846_write_array(struct i2c_client *client,
+			      const struct regval *regs)
+{
+	int i, delay_ms, ret = 0;
+
+	for (i = 0; ret == 0 && regs[i].addr != REG_NULL; i++) {
+		if (regs[i].addr == DELAY_MS) {
+			delay_ms = regs[i].val;
+			dev_info(&client->dev, "delay(%d) ms !\n", delay_ms);
+			usleep_range(1000 * delay_ms, 1000 * delay_ms + 100);
+			continue;
+		}
+		ret = hi846_write_reg(client, regs[i].addr,
+				       HI846_REG_VALUE_16BIT, regs[i].val);
+		if (ret)
+			dev_err(&client->dev, "%s failed !\n", __func__);
+	}
+	return ret;
+}
+
+/* Read registers up to 4 at a time */
+static int hi846_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 *)&reg_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;
+}
+
+/* Check Register value */
+#ifdef CHECK_REG_VALUE
+static int hi846_reg_verify(struct i2c_client *client,
+				const struct regval *regs)
+{
+	u32 i;
+	int ret = 0;
+	u32 value;
+
+	for (i = 0; ret == 0 && regs[i].addr != REG_NULL; i++) {
+		ret = hi846_read_reg(client, regs[i].addr,
+			  HI846_REG_VALUE_16BIT, &value);
+		if (value != regs[i].val) {
+			dev_info(&client->dev, "%s: 0x%04x is 0x%x instead of 0x%x\n",
+				  __func__, regs[i].addr, value, regs[i].val);
+		}
+	}
+	return ret;
+}
+#endif
+
+static int hi846_get_reso_dist(const struct hi846_mode *mode,
+				struct v4l2_mbus_framefmt *framefmt)
+{
+	return abs(mode->width - framefmt->width) +
+	       abs(mode->height - framefmt->height);
+}
+
+static const struct hi846_mode *
+hi846_find_best_fit(struct hi846 *hi846,
+			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 < hi846->cfg_num; i++) {
+		dist = hi846_get_reso_dist(&supported_modes[i], framefmt);
+		if (cur_best_fit_dist == -1 || dist < cur_best_fit_dist) {
+			cur_best_fit_dist = dist;
+			cur_best_fit = i;
+		}
+	}
+
+	return &supported_modes[cur_best_fit];
+}
+
+static int hi846_set_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct hi846 *hi846 = to_hi846(sd);
+	const struct hi846_mode *mode;
+	s64 h_blank, vblank_def;
+
+	mutex_lock(&hi846->mutex);
+
+	mode = hi846_find_best_fit(hi846, fmt);
+	fmt->format.code = HI846_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(&hi846->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		hi846->cur_mode = mode;
+		h_blank = mode->hts_def - mode->width;
+		__v4l2_ctrl_modify_range(hi846->hblank, h_blank,
+					 h_blank, 1, h_blank);
+		vblank_def = mode->vts_def - mode->height;
+		__v4l2_ctrl_modify_range(hi846->vblank, vblank_def,
+					 HI846_VTS_MAX - mode->height,
+					 1, vblank_def);
+	}
+
+	mutex_unlock(&hi846->mutex);
+
+	return 0;
+}
+
+static int hi846_get_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct hi846 *hi846 = to_hi846(sd);
+	const struct hi846_mode *mode = hi846->cur_mode;
+
+	mutex_lock(&hi846->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(&hi846->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		fmt->format.width = mode->width;
+		fmt->format.height = mode->height;
+		fmt->format.code = HI846_MEDIA_BUS_FMT;
+		fmt->format.field = V4L2_FIELD_NONE;
+	}
+	mutex_unlock(&hi846->mutex);
+
+	return 0;
+}
+
+static int hi846_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 = HI846_MEDIA_BUS_FMT;
+
+	return 0;
+}
+
+static int hi846_enum_frame_sizes(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_pad_config *cfg,
+				   struct v4l2_subdev_frame_size_enum *fse)
+{
+	struct hi846 *hi846 = to_hi846(sd);
+
+	if (fse->index >= hi846->cfg_num)
+		return -EINVAL;
+
+	if (fse->code != HI846_MEDIA_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;
+
+	return 0;
+}
+
+static int hi846_enable_test_pattern(struct hi846 *hi846, u32 pattern)
+{
+
+	if (pattern) {
+		hi846_write_reg(hi846->client, HI846_REG_TEST_PATTERN,
+						HI846_REG_VALUE_08BIT, HI846_TEST_PATTERN_ENABLE);
+		hi846_write_reg(hi846->client, HI846_REG_TEST_PATTERN_SELECT,
+						HI846_REG_VALUE_08BIT, pattern - 1);
+	} else {
+		hi846_write_reg(hi846->client, HI846_REG_TEST_PATTERN,
+						HI846_REG_VALUE_08BIT, HI846_TEST_PATTERN_DISABLE);
+	}
+	return 0;
+}
+
+static int hi846_g_frame_interval(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_frame_interval *fi)
+{
+	struct hi846 *hi846 = to_hi846(sd);
+	const struct hi846_mode *mode = hi846->cur_mode;
+
+	mutex_lock(&hi846->mutex);
+	fi->interval = mode->max_fps;
+	mutex_unlock(&hi846->mutex);
+
+	return 0;
+}
+
+static void hi846_get_module_inf(struct hi846 *hi846,
+				  struct rkmodule_inf *inf)
+{
+	memset(inf, 0, sizeof(*inf));
+	strscpy(inf->base.sensor, HI846_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, hi846->module_name,
+		sizeof(inf->base.module));
+	strscpy(inf->base.lens, hi846->len_name, sizeof(inf->base.lens));
+
+}
+
+static void hi846_set_awb_cfg(struct hi846 *hi846,
+				 struct rkmodule_awb_cfg *cfg)
+{
+	mutex_lock(&hi846->mutex);
+	memcpy(&hi846->awb_cfg, cfg, sizeof(*cfg));
+	mutex_unlock(&hi846->mutex);
+}
+
+static long hi846_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	struct hi846 *hi846 = to_hi846(sd);
+	long ret = 0;
+	u32 stream = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		hi846_get_module_inf(hi846, (struct rkmodule_inf *)arg);
+		break;
+	case RKMODULE_AWB_CFG:
+		hi846_set_awb_cfg(hi846, (struct rkmodule_awb_cfg *)arg);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+
+		stream = *((u32 *)arg);
+
+		if (stream)
+			ret = hi846_write_reg(hi846->client, HI846_REG_CTRL_MODE,
+				HI846_REG_VALUE_08BIT, HI846_MODE_STREAMING);
+		else
+			ret = hi846_write_reg(hi846->client, HI846_REG_CTRL_MODE,
+				HI846_REG_VALUE_08BIT, HI846_MODE_SW_STANDBY);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+
+#ifdef CONFIG_COMPAT
+static long hi846_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 *awb_cfg;
+	long ret;
+	u32 stream = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		inf = kzalloc(sizeof(*inf), GFP_KERNEL);
+		if (!inf) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = hi846_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:
+		awb_cfg = kzalloc(sizeof(*awb_cfg), GFP_KERNEL);
+		if (!awb_cfg) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		if (copy_from_user(awb_cfg, up, sizeof(*awb_cfg))) {
+			kfree(awb_cfg);
+			return -EFAULT;
+		}
+		ret = hi846_ioctl(sd, cmd, awb_cfg);
+		kfree(awb_cfg);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		if (copy_from_user(&stream, up, sizeof(u32)))
+			return -EFAULT;
+		ret = hi846_ioctl(sd, cmd, &stream);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+#endif
+
+static int __hi846_start_stream(struct hi846 *hi846)
+{
+	int ret;
+
+	ret = hi846_write_array(hi846->client, hi846->cur_mode->reg_list);
+	if (ret)
+		return ret;
+
+#ifdef CHECK_REG_VALUE
+	usleep_range(10000, 20000);
+	/*  verify default values to make sure everything has */
+	/*  been written correctly as expected */
+	dev_info(&hi846->client->dev, "%s:Check register value!\n",
+				__func__);
+	ret = hi846_reg_verify(hi846->client, hi846_global_regs);
+	if (ret)
+		return ret;
+
+	ret = hi846_reg_verify(hi846->client, hi846->cur_mode->reg_list);
+	if (ret)
+		return ret;
+#endif
+
+	/* In case these controls are set before streaming */
+	mutex_unlock(&hi846->mutex);
+	ret = v4l2_ctrl_handler_setup(&hi846->ctrl_handler);
+	mutex_lock(&hi846->mutex);
+	if (ret)
+		return ret;
+
+	if (ret)
+		dev_info(&hi846->client->dev, "APPly otp failed!\n");
+
+	ret = hi846_write_reg(hi846->client, HI846_REG_CTRL_MODE,
+				HI846_REG_VALUE_08BIT, HI846_MODE_STREAMING);
+	return ret;
+}
+
+static int __hi846_stop_stream(struct hi846 *hi846)
+{
+	return hi846_write_reg(hi846->client, HI846_REG_CTRL_MODE,
+				HI846_REG_VALUE_08BIT, HI846_MODE_SW_STANDBY);
+}
+
+static int hi846_s_stream(struct v4l2_subdev *sd, int on)
+{
+	struct hi846 *hi846 = to_hi846(sd);
+	struct i2c_client *client = hi846->client;
+	int ret = 0;
+
+	dev_info(&client->dev, "%s: on: %d, %dx%d@%d\n", __func__, on,
+				hi846->cur_mode->width,
+				hi846->cur_mode->height,
+		DIV_ROUND_CLOSEST(hi846->cur_mode->max_fps.denominator,
+		hi846->cur_mode->max_fps.numerator));
+
+	mutex_lock(&hi846->mutex);
+	on = !!on;
+	if (on == hi846->streaming)
+		goto unlock_and_return;
+
+	if (on) {
+		dev_info(&client->dev, "stream on!!!\n");
+		ret = pm_runtime_get_sync(&client->dev);
+		if (ret < 0) {
+			pm_runtime_put_noidle(&client->dev);
+			goto unlock_and_return;
+		}
+
+		ret = __hi846_start_stream(hi846);
+		if (ret) {
+			v4l2_err(sd, "start stream failed while write regs\n");
+			pm_runtime_put(&client->dev);
+			goto unlock_and_return;
+		}
+	} else {
+		dev_info(&client->dev, "stream off!!!\n");
+		__hi846_stop_stream(hi846);
+		pm_runtime_put(&client->dev);
+	}
+
+	hi846->streaming = on;
+
+unlock_and_return:
+	mutex_unlock(&hi846->mutex);
+
+	return ret;
+}
+
+static int hi846_s_power(struct v4l2_subdev *sd, int on)
+{
+	struct hi846 *hi846 = to_hi846(sd);
+	struct i2c_client *client = hi846->client;
+	int ret = 0;
+
+	dev_info(&client->dev, "%s(%d) on(%d)\n", __func__, __LINE__, on);
+	mutex_lock(&hi846->mutex);
+
+	/* If the power state is not modified - no work to do. */
+	if (hi846->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;
+		}
+
+		ret = hi846_write_array(hi846->client, hi846_global_regs);
+		if (ret) {
+			v4l2_err(sd, "could not set init registers\n");
+			pm_runtime_put_noidle(&client->dev);
+			goto unlock_and_return;
+		}
+
+		hi846->power_on = true;
+	} else {
+		pm_runtime_put(&client->dev);
+		hi846->power_on = false;
+	}
+
+unlock_and_return:
+	mutex_unlock(&hi846->mutex);
+
+	return ret;
+}
+
+/* Calculate the delay in us by clock rate and clock cycles */
+static inline u32 hi846_cal_delay(u32 cycles)
+{
+	return DIV_ROUND_UP(cycles, HI846_XVCLK_FREQ / 1000 / 1000);
+}
+
+static int __hi846_power_on(struct hi846 *hi846)
+{
+	int ret;
+	u32 delay_us;
+	struct device *dev = &hi846->client->dev;
+
+	if (!IS_ERR(hi846->power_gpio))
+		gpiod_set_value_cansleep(hi846->power_gpio, 1);
+
+	usleep_range(1000, 2000);
+
+	if (!IS_ERR_OR_NULL(hi846->pins_default)) {
+		ret = pinctrl_select_state(hi846->pinctrl,
+					   hi846->pins_default);
+		if (ret < 0)
+			dev_err(dev, "could not set pins\n");
+	}
+	ret = clk_set_rate(hi846->xvclk, HI846_XVCLK_FREQ);
+	if (ret < 0)
+		dev_warn(dev, "Failed to set xvclk rate (24MHz)\n");
+	if (clk_get_rate(hi846->xvclk) != HI846_XVCLK_FREQ)
+		dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n");
+	ret = clk_prepare_enable(hi846->xvclk);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable xvclk\n");
+		return ret;
+	}
+
+	ret = regulator_bulk_enable(HI846_NUM_SUPPLIES, hi846->supplies);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable regulators\n");
+		goto disable_clk;
+	}
+
+	if (!IS_ERR(hi846->reset_gpio))
+		gpiod_set_value_cansleep(hi846->reset_gpio, 1);
+
+	if (!IS_ERR(hi846->pwdn_gpio))
+		gpiod_set_value_cansleep(hi846->pwdn_gpio, 1);
+
+	/* 8192 cycles prior to first SCCB transaction */
+	delay_us = hi846_cal_delay(8192);
+	usleep_range(delay_us, delay_us * 2);
+	usleep_range(10000, 20000);
+	return 0;
+
+disable_clk:
+	clk_disable_unprepare(hi846->xvclk);
+
+	return ret;
+}
+
+static void __hi846_power_off(struct hi846 *hi846)
+{
+	int ret;
+	struct device *dev = &hi846->client->dev;
+
+	if (!IS_ERR(hi846->pwdn_gpio))
+		gpiod_set_value_cansleep(hi846->pwdn_gpio, 0);
+	clk_disable_unprepare(hi846->xvclk);
+	if (!IS_ERR(hi846->reset_gpio))
+		gpiod_set_value_cansleep(hi846->reset_gpio, 0);
+	if (!IS_ERR_OR_NULL(hi846->pins_sleep)) {
+		ret = pinctrl_select_state(hi846->pinctrl,
+					   hi846->pins_sleep);
+		if (ret < 0)
+			dev_dbg(dev, "could not set pins\n");
+	}
+	if (!IS_ERR(hi846->power_gpio))
+		gpiod_set_value_cansleep(hi846->power_gpio, 0);
+
+	regulator_bulk_disable(HI846_NUM_SUPPLIES, hi846->supplies);
+}
+
+static int hi846_runtime_resume(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct hi846 *hi846 = to_hi846(sd);
+
+	return __hi846_power_on(hi846);
+}
+
+static int hi846_runtime_suspend(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct hi846 *hi846 = to_hi846(sd);
+
+	__hi846_power_off(hi846);
+
+	return 0;
+}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static int hi846_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
+{
+	struct hi846 *hi846 = to_hi846(sd);
+	struct v4l2_mbus_framefmt *try_fmt =
+				v4l2_subdev_get_try_format(sd, fh->pad, 0);
+	const struct hi846_mode *def_mode = &supported_modes[0];
+
+	mutex_lock(&hi846->mutex);
+	/* Initialize try_fmt */
+	try_fmt->width = def_mode->width;
+	try_fmt->height = def_mode->height;
+	try_fmt->code = HI846_MEDIA_BUS_FMT;
+	try_fmt->field = V4L2_FIELD_NONE;
+
+	mutex_unlock(&hi846->mutex);
+	/* No crop or compose */
+
+	return 0;
+}
+#endif
+
+static int hi846_enum_frame_interval(struct v4l2_subdev *sd,
+				       struct v4l2_subdev_pad_config *cfg,
+				       struct v4l2_subdev_frame_interval_enum *fie)
+{
+	struct hi846 *hi846 = to_hi846(sd);
+
+	if (fie->index >= hi846->cfg_num)
+		return -EINVAL;
+
+	if (fie->code != HI846_MEDIA_BUS_FMT)
+		return -EINVAL;
+
+	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;
+	return 0;
+}
+
+static int hi846_g_mbus_config(struct v4l2_subdev *sd,
+				struct v4l2_mbus_config *config)
+{
+	struct hi846 *sensor = to_hi846(sd);
+	struct device *dev = &sensor->client->dev;
+
+	dev_info(dev, "%s(%d) enter!\n", __func__, __LINE__);
+
+	if (2 == sensor->lane_num) {
+		config->type = V4L2_MBUS_CSI2;
+		config->flags = V4L2_MBUS_CSI2_2_LANE |
+				V4L2_MBUS_CSI2_CHANNEL_0 |
+				V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
+	} else if (4 == sensor->lane_num) {
+		config->type = V4L2_MBUS_CSI2;
+		config->flags = V4L2_MBUS_CSI2_4_LANE |
+				V4L2_MBUS_CSI2_CHANNEL_0 |
+				V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
+	} else {
+		dev_err(&sensor->client->dev,
+			"unsupported lane_num(%d)\n", sensor->lane_num);
+	}
+	return 0;
+}
+
+static const struct dev_pm_ops hi846_pm_ops = {
+	SET_RUNTIME_PM_OPS(hi846_runtime_suspend,
+			   hi846_runtime_resume, NULL)
+};
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static const struct v4l2_subdev_internal_ops hi846_internal_ops = {
+	.open = hi846_open,
+};
+#endif
+
+static const struct v4l2_subdev_core_ops hi846_core_ops = {
+	.s_power = hi846_s_power,
+	.ioctl = hi846_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = hi846_compat_ioctl32,
+#endif
+};
+
+static const struct v4l2_subdev_video_ops hi846_video_ops = {
+	.s_stream = hi846_s_stream,
+	.g_frame_interval = hi846_g_frame_interval,
+	.g_mbus_config = hi846_g_mbus_config,
+};
+
+static const struct v4l2_subdev_pad_ops hi846_pad_ops = {
+	.enum_mbus_code = hi846_enum_mbus_code,
+	.enum_frame_size = hi846_enum_frame_sizes,
+	.enum_frame_interval = hi846_enum_frame_interval,
+	.get_fmt = hi846_get_fmt,
+	.set_fmt = hi846_set_fmt,
+};
+
+static const struct v4l2_subdev_ops hi846_subdev_ops = {
+	.core	= &hi846_core_ops,
+	.video	= &hi846_video_ops,
+	.pad	= &hi846_pad_ops,
+};
+
+static int hi846_set_exposure_reg(struct hi846 *hi846, u32 exposure)
+{
+	int ret = 0;
+	u32 cal_shutter = 0;
+
+	cal_shutter = exposure >> 1;
+	cal_shutter = cal_shutter << 1;
+
+	ret = hi846_write_reg(hi846->client, HI846_REG_GROUP,
+			      HI846_REG_VALUE_08BIT, 0x01);
+	ret |= hi846_write_reg(hi846->client,
+			       HI846_REG_EXPOSURE_H,
+			       HI846_REG_VALUE_08BIT,
+			       HI846_FETCH_HIGH_BYTE_EXP(cal_shutter));
+	ret |= hi846_write_reg(hi846->client,
+			       HI846_REG_EXPOSURE_M,
+			       HI846_REG_VALUE_08BIT,
+			       HI846_FETCH_MIDDLE_BYTE_EXP(cal_shutter));
+	ret |= hi846_write_reg(hi846->client,
+			       HI846_REG_EXPOSURE_L,
+			       HI846_REG_VALUE_08BIT,
+			       HI846_FETCH_LOW_BYTE_EXP(cal_shutter));
+	ret |= hi846_write_reg(hi846->client, HI846_REG_GROUP,
+			       HI846_REG_VALUE_08BIT, 0x00);
+
+	return ret;
+}
+
+static int hi846_set_gain_reg(struct hi846 *hi846, u32 a_gain)
+{
+	int ret = 0;
+
+	ret = hi846_write_reg(hi846->client, HI846_REG_GROUP,
+			      HI846_REG_VALUE_08BIT, 0x01);
+	ret |= hi846_write_reg(hi846->client, HI846_REG_GAIN,
+			       HI846_REG_VALUE_08BIT, a_gain);
+	ret |= hi846_write_reg(hi846->client, HI846_REG_GROUP,
+			       HI846_REG_VALUE_08BIT, 0x00);
+
+	return ret;
+}
+
+static int hi846_set_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct hi846 *hi846 = container_of(ctrl->handler,
+					     struct hi846, ctrl_handler);
+	struct i2c_client *client = hi846->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 = hi846->cur_mode->height + ctrl->val - 4;
+		__v4l2_ctrl_modify_range(hi846->exposure,
+					 hi846->exposure->minimum, max,
+					 hi846->exposure->step,
+					 hi846->exposure->default_value);
+		break;
+	}
+
+	if (!pm_runtime_get_if_in_use(&client->dev))
+		return 0;
+
+	switch (ctrl->id) {
+	case V4L2_CID_EXPOSURE:
+		dev_dbg(&client->dev, "set exposure value 0x%x\n", ctrl->val);
+		/* 4 least significant bits of expsoure are fractional part */
+		ret = hi846_set_exposure_reg(hi846, ctrl->val);
+		break;
+	case V4L2_CID_ANALOGUE_GAIN:
+		dev_dbg(&client->dev, "set analog gain value 0x%x\n", ctrl->val);
+		ret = hi846_set_gain_reg(hi846, ctrl->val);
+		break;
+	case V4L2_CID_VBLANK:
+		dev_dbg(&client->dev, "set vb value 0x%x\n", ctrl->val);
+		ret = hi846_write_reg(hi846->client, HI846_REG_VTS,
+				       HI846_REG_VALUE_16BIT,
+				       ctrl->val + hi846->cur_mode->height);
+		break;
+	case V4L2_CID_TEST_PATTERN:
+		ret = hi846_enable_test_pattern(hi846, 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 hi846_ctrl_ops = {
+	.s_ctrl = hi846_set_ctrl,
+};
+
+static int hi846_initialize_controls(struct hi846 *hi846)
+{
+	const struct hi846_mode *mode;
+	struct v4l2_ctrl_handler *handler;
+	struct v4l2_ctrl *ctrl;
+	s64 exposure_max, vblank_def;
+	u32 h_blank;
+	int ret;
+
+	handler = &hi846->ctrl_handler;
+	mode = hi846->cur_mode;
+	ret = v4l2_ctrl_handler_init(handler, 8);
+	if (ret)
+		return ret;
+	handler->lock = &hi846->mutex;
+
+	if (2 == hi846->lane_num) {
+		ctrl = v4l2_ctrl_new_int_menu(handler, NULL,
+					      V4L2_CID_LINK_FREQ, 1, 1,
+					      link_freq_menu_items);
+	} else {
+		ctrl = v4l2_ctrl_new_int_menu(handler, NULL,
+					      V4L2_CID_LINK_FREQ, 1, 0,
+					      link_freq_menu_items);
+	}
+	if (ctrl)
+		ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+
+	v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE,
+			  0, hi846->pixel_rate, 1, hi846->pixel_rate);
+
+	h_blank = mode->hts_def - mode->width;
+	hi846->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
+				h_blank, h_blank, 1, h_blank);
+	if (hi846->hblank)
+		hi846->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+
+	vblank_def = mode->vts_def - mode->height;
+	hi846->vblank = v4l2_ctrl_new_std(handler, &hi846_ctrl_ops,
+				V4L2_CID_VBLANK, vblank_def,
+				HI846_VTS_MAX - mode->height,
+				1, vblank_def);
+
+	exposure_max = mode->vts_def - 4;
+	hi846->exposure = v4l2_ctrl_new_std(handler, &hi846_ctrl_ops,
+				V4L2_CID_EXPOSURE, HI846_EXPOSURE_MIN,
+				exposure_max, HI846_EXPOSURE_STEP,
+				mode->exp_def);
+
+	hi846->anal_gain = v4l2_ctrl_new_std(handler, &hi846_ctrl_ops,
+				V4L2_CID_ANALOGUE_GAIN, ANALOG_GAIN_MIN,
+				ANALOG_GAIN_MAX, ANALOG_GAIN_STEP,
+				ANALOG_GAIN_DEFAULT);
+
+	hi846->test_pattern = v4l2_ctrl_new_std_menu_items(handler,
+				&hi846_ctrl_ops, V4L2_CID_TEST_PATTERN,
+				ARRAY_SIZE(hi846_test_pattern_menu) - 1,
+				0, 0, hi846_test_pattern_menu);
+
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(&hi846->client->dev,
+			"Failed to init controls(%d)\n", ret);
+		goto err_free_handler;
+	}
+
+	hi846->subdev.ctrl_handler = handler;
+
+	return 0;
+
+err_free_handler:
+	v4l2_ctrl_handler_free(handler);
+
+	return ret;
+}
+
+static int hi846_check_sensor_id(struct hi846 *hi846,
+				  struct i2c_client *client)
+{
+	struct device *dev = &hi846->client->dev;
+	u32 id = 0;
+	u32 reg_H = 0;
+	u32 reg_L = 0;
+	int ret;
+
+	ret = hi846_read_reg(client, HI846_REG_CHIP_ID_H,
+			      HI846_REG_VALUE_08BIT, &reg_H);
+	ret |= hi846_read_reg(client, HI846_REG_CHIP_ID_L,
+			      HI846_REG_VALUE_08BIT, &reg_L);
+	id = ((reg_H << 8) & 0xff00) | (reg_L & 0xff);
+	if (id != CHIP_ID) {
+		dev_err(dev, "Unexpected sensor id(%04x), ret(%d)\n", id, ret);
+		return -ENODEV;
+	}
+
+	dev_info(dev, "Detected Hi%04x sensor\n", CHIP_ID);
+
+	return 0;
+}
+
+static int hi846_configure_regulators(struct hi846 *hi846)
+{
+	unsigned int i;
+
+	for (i = 0; i < HI846_NUM_SUPPLIES; i++)
+		hi846->supplies[i].supply = hi846_supply_names[i];
+
+	return devm_regulator_bulk_get(&hi846->client->dev,
+				       HI846_NUM_SUPPLIES,
+				       hi846->supplies);
+}
+
+static int hi846_parse_of(struct hi846 *hi846)
+{
+	struct device *dev = &hi846->client->dev;
+	struct device_node *endpoint;
+	struct fwnode_handle *fwnode;
+	int rval;
+	unsigned int fps;
+
+	endpoint = of_graph_get_next_endpoint(dev->of_node, NULL);
+	if (!endpoint) {
+		dev_err(dev, "Failed to get endpoint\n");
+		return -EINVAL;
+	}
+	fwnode = of_fwnode_handle(endpoint);
+	rval = fwnode_property_read_u32_array(fwnode, "data-lanes", NULL, 0);
+	if (rval <= 0) {
+		dev_warn(dev, " Get mipi lane num failed!\n");
+		return -1;
+	}
+
+	hi846->lane_num = rval;
+	if (2 == hi846->lane_num) {
+		hi846->cur_mode = &supported_modes_2lane[0];
+		supported_modes = supported_modes_2lane;
+		hi846->cfg_num = ARRAY_SIZE(supported_modes_2lane);
+		hi846_global_regs = hi846_global_regs_2lane;
+
+		/* pixel rate = HTS * VTS * FPS */
+		fps = DIV_ROUND_CLOSEST(hi846->cur_mode->max_fps.denominator,
+					hi846->cur_mode->max_fps.numerator);
+		hi846->pixel_rate = hi846->cur_mode->vts_def *
+				     hi846->cur_mode->hts_def * fps;
+
+		dev_info(dev, "lane_num(%d)  pixel_rate(%u)\n",
+				 hi846->lane_num, hi846->pixel_rate);
+	} else if (4 == hi846->lane_num) {
+		hi846->cur_mode = &supported_modes_4lane[0];
+		supported_modes = supported_modes_4lane;
+		hi846->cfg_num = ARRAY_SIZE(supported_modes_4lane);
+		hi846_global_regs = hi846_global_regs_4lane;
+
+		/* pixel rate = HTS * VTS * FPS */
+		fps = DIV_ROUND_CLOSEST(hi846->cur_mode->max_fps.denominator,
+					hi846->cur_mode->max_fps.numerator);
+		hi846->pixel_rate = hi846->cur_mode->vts_def *
+				     hi846->cur_mode->hts_def * fps;
+
+		dev_info(dev, "lane_num(%d)  pixel_rate(%u)\n",
+				 hi846->lane_num, hi846->pixel_rate);
+	} else {
+		dev_err(dev, "unsupported lane_num(%d)\n", hi846->lane_num);
+		return -1;
+	}
+
+	return 0;
+}
+
+static int hi846_probe(struct i2c_client *client,
+			const struct i2c_device_id *id)
+{
+	struct device *dev = &client->dev;
+	struct device_node *node = dev->of_node;
+	struct hi846 *hi846;
+	struct v4l2_subdev *sd;
+	char facing[2] = "b";
+	int ret;
+
+	dev_info(dev, "driver version: %02x.%02x.%02x",
+		DRIVER_VERSION >> 16,
+		(DRIVER_VERSION & 0xff00) >> 8,
+		DRIVER_VERSION & 0x00ff);
+
+	hi846 = devm_kzalloc(dev, sizeof(*hi846), GFP_KERNEL);
+	if (!hi846)
+		return -ENOMEM;
+
+	ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
+				   &hi846->module_index);
+	if (ret) {
+		dev_warn(dev, "could not get module index!\n");
+		hi846->module_index = 0;
+	}
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
+				       &hi846->module_facing);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME,
+				       &hi846->module_name);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME,
+				       &hi846->len_name);
+	if (ret) {
+		dev_err(dev, "could not get module information!\n");
+		return -EINVAL;
+	}
+
+	hi846->client = client;
+
+	hi846->xvclk = devm_clk_get(dev, "xvclk");
+	if (IS_ERR(hi846->xvclk)) {
+		dev_err(dev, "Failed to get xvclk\n");
+		return -EINVAL;
+	}
+
+	hi846->power_gpio = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW);
+	if (IS_ERR(hi846->power_gpio))
+		dev_warn(dev, "Failed to get power-gpios, maybe no use\n");
+
+	hi846->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+	if (IS_ERR(hi846->reset_gpio))
+		dev_warn(dev, "Failed to get reset-gpios, maybe no use\n");
+
+	hi846->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW);
+	if (IS_ERR(hi846->pwdn_gpio))
+		dev_warn(dev, "Failed to get pwdn-gpios\n");
+
+	ret = hi846_configure_regulators(hi846);
+	if (ret) {
+		dev_err(dev, "Failed to get power regulators\n");
+		return ret;
+	}
+	ret = hi846_parse_of(hi846);
+	if (ret != 0)
+		return -EINVAL;
+
+	hi846->pinctrl = devm_pinctrl_get(dev);
+	if (!IS_ERR(hi846->pinctrl)) {
+		hi846->pins_default =
+			pinctrl_lookup_state(hi846->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_DEFAULT);
+		if (IS_ERR(hi846->pins_default))
+			dev_err(dev, "could not get default pinstate\n");
+
+		hi846->pins_sleep =
+			pinctrl_lookup_state(hi846->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_SLEEP);
+		if (IS_ERR(hi846->pins_sleep))
+			dev_err(dev, "could not get sleep pinstate\n");
+	}
+
+	mutex_init(&hi846->mutex);
+
+	sd = &hi846->subdev;
+	v4l2_i2c_subdev_init(sd, client, &hi846_subdev_ops);
+	ret = hi846_initialize_controls(hi846);
+	if (ret)
+		goto err_destroy_mutex;
+
+	ret = __hi846_power_on(hi846);
+	if (ret)
+		goto err_free_handler;
+
+	ret = hi846_check_sensor_id(hi846, client);
+	if (ret < 0) {
+		dev_info(&client->dev, "%s(%d) Check id  failed\n"
+				  "check following information:\n"
+				  "Power/PowerDown/Reset/Mclk/I2cBus !!\n",
+				  __func__, __LINE__);
+		goto err_power_off;
+	}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+	sd->internal_ops = &hi846_internal_ops;
+	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
+		     V4L2_SUBDEV_FL_HAS_EVENTS;
+#endif
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	hi846->pad.flags = MEDIA_PAD_FL_SOURCE;
+	sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
+	ret = media_entity_pads_init(&sd->entity, 1, &hi846->pad);
+	if (ret < 0)
+		goto err_power_off;
+#endif
+
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(hi846->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s",
+		 hi846->module_index, facing,
+		 HI846_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:
+	__hi846_power_off(hi846);
+err_free_handler:
+	v4l2_ctrl_handler_free(&hi846->ctrl_handler);
+err_destroy_mutex:
+	mutex_destroy(&hi846->mutex);
+
+	return ret;
+}
+
+static int hi846_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct hi846 *hi846 = to_hi846(sd);
+
+	v4l2_async_unregister_subdev(sd);
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	media_entity_cleanup(&sd->entity);
+#endif
+	v4l2_ctrl_handler_free(&hi846->ctrl_handler);
+	mutex_destroy(&hi846->mutex);
+
+	pm_runtime_disable(&client->dev);
+	if (!pm_runtime_status_suspended(&client->dev))
+		__hi846_power_off(hi846);
+	pm_runtime_set_suspended(&client->dev);
+
+	return 0;
+}
+
+#if IS_ENABLED(CONFIG_OF)
+static const struct of_device_id hi846_of_match[] = {
+	{ .compatible = "hynix,hi846" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, hi846_of_match);
+#endif
+
+static const struct i2c_device_id hi846_match_id[] = {
+	{ "hynix,hi846", 0 },
+	{ },
+};
+
+static struct i2c_driver hi846_i2c_driver = {
+	.driver = {
+		.name = HI846_NAME,
+		.pm = &hi846_pm_ops,
+		.of_match_table = of_match_ptr(hi846_of_match),
+	},
+	.probe		= &hi846_probe,
+	.remove		= &hi846_remove,
+	.id_table	= hi846_match_id,
+};
+
+static int __init sensor_mod_init(void)
+{
+	return i2c_add_driver(&hi846_i2c_driver);
+}
+
+static void __exit sensor_mod_exit(void)
+{
+	i2c_del_driver(&hi846_i2c_driver);
+}
+
+device_initcall_sync(sensor_mod_init);
+module_exit(sensor_mod_exit);
+
+MODULE_DESCRIPTION("OmniVision hi846 sensor driver");
+MODULE_LICENSE("GPL v2");

commit 4be5174ea21636ff7ec4f44e801b8fbbdfe1a120
Author: Wang Panzhenzhuan <randy.wang@rock-chips.com>
Date:   Thu May 6 14:04:28 2021 +0800

    dt-bindings: media: i2c: Document add hi556
    
    Signed-off-by: Wang Panzhenzhuan <randy.wang@rock-chips.com>
    Change-Id: Ib5406d9a690f27e70d0df37429c18b8ad488c7c7

diff --git a/Documentation/devicetree/bindings/media/i2c/hi556.txt b/Documentation/devicetree/bindings/media/i2c/hi556.txt
new file mode 100644
index 000000000000..588c88eb1d76
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/i2c/hi556.txt
@@ -0,0 +1,54 @@
+* Hynix hi556 MIPI CSI-2 sensor
+
+Required Properties:
+- compatible: should be "hynix,hi556"
+- clocks: reference to the 24M xvclk input clock.
+- clock-names: should be "xvclk".
+- dovdd-supply: Digital I/O voltage supply, 1.8 or 2.8 volts
+- avdd-supply: Analog voltage supply, 2.8 volts
+- dvdd-supply: Digital core voltage supply, 1.2 volts
+- power-gpios : High active reset gpio
+- reset-gpios: High active reset gpio
+- pwdn-gpios: High active reset gpio
+Optional Properties:
+- flash-leds : attached led node
+- lens-focus : attached vcm for focus
+
+Attention:
+hi556 device address 0x20(7bit) or 0x28(7bit) is decided by I2C_ID_SEL pin;
+
+The device node must contain one 'port' child node for its digital output
+video port, in accordance with the video interface bindings defined in
+Documentation/devicetree/bindings/media/video-interfaces.txt.
+
+Example:
+//RK356x Board
+&i2c4 {
+	status = "okay";
+
+	hi556: hi556@20 {
+		status = "okay";
+		compatible = "hynix,hi556";
+		reg = <0x20>;
+		clocks = <&cru CLK_CIF_OUT>;
+		clock-names = "xvclk";
+		power-domains = <&power RK3568_PD_VI>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&cam_clkout0>;
+		power-gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>;
+		reset-gpios = <&gpio4 RK_PA7 GPIO_ACTIVE_HIGH>;
+		pwdn-gpios = <&gpio4 RK_PB2 GPIO_ACTIVE_HIGH>;
+		rockchip,camera-module-index = <0>;
+		rockchip,camera-module-facing = "back";
+		rockchip,camera-module-name = "KYT-8607-V1.0";
+		rockchip,camera-module-lens-name = "default";
+		flash-leds = <&flash_rgb13h>;
+		lens-focus = <&dw9714>;
+		port {
+			hi556_out: endpoint {
+				remote-endpoint = <&mipi_in_hi556>;
+				data-lanes = <1 2>;
+			};
+		};
+	};
+};

commit c81aa1af420c3e2a242ef0eac04b65c7944edae1
Author: Wang Panzhenzhuan <randy.wang@rock-chips.com>
Date:   Thu May 6 09:58:28 2021 +0800

    media: i2c: add camera driver hynix hi556
    
    Signed-off-by: Wang Panzhenzhuan <randy.wang@rock-chips.com>
    Change-Id: If069f3e11074eb7635754c47b39a7b8ca3434219

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index d3eb9e53e1db..81242c9f6206 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -1799,6 +1799,18 @@ config VIDEO_SP250A
 	  To compile this driver as a module, choose M here: the
 	  module will be called SP250A.
 
+config VIDEO_HYNIX_HI556
+	tristate "Hynix HI556 sensor support"
+	depends on VIDEO_V4L2 && I2C && MEDIA_CONTROLLER
+	depends on MEDIA_CAMERA_SUPPORT
+	select V4L2_FWNODE
+	help
+	  This is a Video4Linux2 sensor driver for the Hynix
+	  HI556 camera.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called hynix_hi556.
+
 comment "Flash devices"
 
 config VIDEO_ADP1653
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index 38b3e103ceca..82cd96f93432 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -193,6 +193,7 @@ obj-$(CONFIG_VIDEO_SC4238)	+= sc4238.o
 obj-$(CONFIG_VIDEO_SC430CS)	+= sc430cs.o
 obj-$(CONFIG_VIDEO_SC500AI)	+= sc500ai.o
 obj-$(CONFIG_VIDEO_SP250A)	+= sp250a.o
+obj-$(CONFIG_VIDEO_HYNIX_HI556)	+= hynix_hi556.o
 
 obj-$(CONFIG_VIDEO_PREISP_DUMMY_SENSOR)	+= preisp-dummy.o
 
diff --git a/drivers/media/i2c/hynix_hi556.c b/drivers/media/i2c/hynix_hi556.c
new file mode 100644
index 000000000000..97f5ab3ab259
--- /dev/null
+++ b/drivers/media/i2c/hynix_hi556.c
@@ -0,0 +1,1615 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * hi556 driver
+ *
+ * Copyright (C) 2021 Rockchip Electronics Co., Ltd.
+ *
+ * V0.0X01.0X00 init version
+ */
+
+#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/of.h>
+#include <linux/of_graph.h>
+#include <linux/regulator/consumer.h>
+#include <linux/sysfs.h>
+#include <linux/pinctrl/consumer.h>
+#include <linux/version.h>
+#include <media/v4l2-async.h>
+#include <media/media-entity.h>
+#include <media/v4l2-common.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-event.h>
+#include <media/v4l2-fwnode.h>
+#include <media/v4l2-image-sizes.h>
+#include <media/v4l2-mediabus.h>
+#include <media/v4l2-subdev.h>
+
+#include <linux/rk-camera-module.h>
+
+/* verify default register values */
+//#define CHECK_REG_VALUE
+
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x00)
+
+#ifndef V4L2_CID_DIGITAL_GAIN
+#define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
+#endif
+
+/* pixel rate = link frequency * 2 * lanes / BITS_PER_SAMPLE */
+#define MIPI_FREQ	440000000U
+#define HI556_PIXEL_RATE		(440000000LL * 2LL * 2LL / 10)
+#define HI556_XVCLK_FREQ		24000000
+
+#define CHIP_ID				0x0556
+#define HI556_REG_CHIP_ID		0x0f16
+
+#define HI556_REG_CTRL_MODE		0x0A00
+#define HI556_MODE_SW_STANDBY		0x00
+#define HI556_MODE_STREAMING		0x01
+
+#define HI556_REG_EXPOSURE_H		0x0073
+#define HI556_REG_EXPOSURE_M		0x0074
+#define HI556_REG_EXPOSURE_L		0x0075
+
+#define HI556_FETCH_HIGH_BYTE_EXP(VAL)	(((VAL) >> 16) & 0xF)	/* 4 Bits */
+#define HI556_FETCH_MIDDLE_BYTE_EXP(VAL) (((VAL) >> 8) & 0xFF)	/* 8 Bits */
+#define HI556_FETCH_LOW_BYTE_EXP(VAL)	((VAL) & 0xFF)	/* 8 Bits */
+
+#define	HI556_EXPOSURE_MIN		4
+#define	HI556_EXPOSURE_STEP		1
+#define HI556_VTS_MAX			0x7fff
+
+#define HI556_REG_GAIN			0x0077
+#define HI556_GAIN_MASK			0xff
+
+#define	ANALOG_GAIN_MIN			0x00
+#define	ANALOG_GAIN_MAX			0xF0
+#define	ANALOG_GAIN_STEP		1
+#define	ANALOG_GAIN_DEFAULT		0x10
+
+#define HI556_REG_GROUP	0x0046
+
+#define HI556_REG_TEST_PATTERN		0x0A05
+#define	HI556_TEST_PATTERN_ENABLE	0x01
+#define	HI556_TEST_PATTERN_DISABLE	0x0
+#define HI556_REG_TEST_PATTERN_SELECT	0x0201
+
+#define HI556_REG_VTS			0x0006
+
+#define REG_NULL			0xFFFF
+#define DELAY_MS			0xEEEE	/* Array delay token */
+
+#define HI556_REG_VALUE_08BIT		1
+#define HI556_REG_VALUE_16BIT		2
+#define HI556_REG_VALUE_24BIT		3
+
+#define HI556_LANES			2
+#define HI556_BITS_PER_SAMPLE		10
+
+#define OF_CAMERA_PINCTRL_STATE_DEFAULT	"rockchip,camera_default"
+#define OF_CAMERA_PINCTRL_STATE_SLEEP	"rockchip,camera_sleep"
+
+#define HI556_NAME			"hi556"
+#define HI556_MEDIA_BUS_FMT		MEDIA_BUS_FMT_SGBRG10_1X10
+
+struct hi556_otp_info {
+	int flag; // bit[7]: info, bit[6]:wb
+	int module_id;
+	int lens_id;
+	int year;
+	int month;
+	int day;
+	int rg_ratio;
+	int bg_ratio;
+};
+
+static const char * const hi556_supply_names[] = {
+	"avdd",		/* Analog power */
+	"dovdd",	/* Digital I/O power */
+	"dvdd",		/* Digital core power */
+};
+
+#define HI556_NUM_SUPPLIES ARRAY_SIZE(hi556_supply_names)
+
+struct regval {
+	u16 addr;
+	u16 val;
+};
+
+struct hi556_mode {
+	u32 width;
+	u32 height;
+	struct v4l2_fract max_fps;
+	u32 hts_def;
+	u32 vts_def;
+	u32 exp_def;
+	const struct regval *reg_list;
+	u32 hdr_mode;
+};
+
+struct hi556 {
+	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[HI556_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	*test_pattern;
+	struct mutex		mutex;
+	bool			streaming;
+	bool			power_on;
+	const struct hi556_mode *cur_mode;
+	unsigned int lane_num;
+	unsigned int cfg_num;
+	unsigned int pixel_rate;
+	u32			module_index;
+	struct hi556_otp_info *otp;
+	const char		*module_facing;
+	const char		*module_name;
+	const char		*len_name;
+	struct rkmodule_awb_cfg	awb_cfg;
+};
+
+#define to_hi556(sd) container_of(sd, struct hi556, subdev)
+
+/*
+ * Xclk 24Mhz
+ * Pclk 176Mhz
+ * linelength 2816(0xb00)
+ * framelength 1988(0x7c0)
+ * grabwindow_width 2592
+ * grabwindow_height 1944
+ * max_framerate 30fps
+ * MIPI speed(Mbps) : 840Mbps x 2Lane
+ */
+static const struct regval hi556_global_regs[] = {
+	{0x0a00, 0x0000},
+	{0x0e00, 0x0102},
+	{0x0e02, 0x0102},
+	{0x0e0c, 0x0100},
+	{0x2000, 0x7400},
+	{0x2002, 0x001c},
+	{0x2004, 0x0242},
+	{0x2006, 0x0942},
+	{0x2008, 0x7007},
+	{0x200a, 0x0fd9},
+	{0x200c, 0x0259},
+	{0x200e, 0x7008},
+	{0x2010, 0x160e},
+	{0x2012, 0x0047},
+	{0x2014, 0x2118},
+	{0x2016, 0x0041},
+	{0x2018, 0x00d8},
+	{0x201a, 0x0145},
+	{0x201c, 0x0006},
+	{0x201e, 0x0181},
+	{0x2020, 0x13cc},
+	{0x2022, 0x2057},
+	{0x2024, 0x7001},
+	{0x2026, 0x0fca},
+	{0x2028, 0x00cb},
+	{0x202a, 0x009f},
+	{0x202c, 0x7002},
+	{0x202e, 0x13cc},
+	{0x2030, 0x019b},
+	{0x2032, 0x014d},
+	{0x2034, 0x2987},
+	{0x2036, 0x2766},
+	{0x2038, 0x0020},
+	{0x203a, 0x2060},
+	{0x203c, 0x0e5d},
+	{0x203e, 0x181d},
+	{0x2040, 0x2066},
+	{0x2042, 0x20c4},
+	{0x2044, 0x5000},
+	{0x2046, 0x0005},
+	{0x2048, 0x0000},
+	{0x204a, 0x01db},
+	{0x204c, 0x025a},
+	{0x204e, 0x00c0},
+	{0x2050, 0x0005},
+	{0x2052, 0x0006},
+	{0x2054, 0x0ad9},
+	{0x2056, 0x0259},
+	{0x2058, 0x0618},
+	{0x205a, 0x0258},
+	{0x205c, 0x2266},
+	{0x205e, 0x20c8},
+	{0x2060, 0x2060},
+	{0x2062, 0x707b},
+	{0x2064, 0x0fdd},
+	{0x2066, 0x81b8},
+	{0x2068, 0x5040},
+	{0x206a, 0x0020},
+	{0x206c, 0x5060},
+	{0x206e, 0x3143},
+	{0x2070, 0x5081},
+	{0x2072, 0x025c},
+	{0x2074, 0x7800},
+	{0x2076, 0x7400},
+	{0x2078, 0x001c},
+	{0x207a, 0x0242},
+	{0x207c, 0x0942},
+	{0x207e, 0x0bd9},
+	{0x2080, 0x0259},
+	{0x2082, 0x7008},
+	{0x2084, 0x160e},
+	{0x2086, 0x0047},
+	{0x2088, 0x2118},
+	{0x208a, 0x0041},
+	{0x208c, 0x00d8},
+	{0x208e, 0x0145},
+	{0x2090, 0x0006},
+	{0x2092, 0x0181},
+	{0x2094, 0x13cc},
+	{0x2096, 0x2057},
+	{0x2098, 0x7001},
+	{0x209a, 0x0fca},
+	{0x209c, 0x00cb},
+	{0x209e, 0x009f},
+	{0x20a0, 0x7002},
+	{0x20a2, 0x13cc},
+	{0x20a4, 0x019b},
+	{0x20a6, 0x014d},
+	{0x20a8, 0x2987},
+	{0x20aa, 0x2766},
+	{0x20ac, 0x0020},
+	{0x20ae, 0x2060},
+	{0x20b0, 0x0e5d},
+	{0x20b2, 0x181d},
+	{0x20b4, 0x2066},
+	{0x20b6, 0x20c4},
+	{0x20b8, 0x50a0},
+	{0x20ba, 0x0005},
+	{0x20bc, 0x0000},
+	{0x20be, 0x01db},
+	{0x20c0, 0x025a},
+	{0x20c2, 0x00c0},
+	{0x20c4, 0x0005},
+	{0x20c6, 0x0006},
+	{0x20c8, 0x0ad9},
+	{0x20ca, 0x0259},
+	{0x20cc, 0x0618},
+	{0x20ce, 0x0258},
+	{0x20d0, 0x2266},
+	{0x20d2, 0x20c8},
+	{0x20d4, 0x2060},
+	{0x20d6, 0x707b},
+	{0x20d8, 0x0fdd},
+	{0x20da, 0x86b8},
+	{0x20dc, 0x50e0},
+	{0x20de, 0x0020},
+	{0x20e0, 0x5100},
+	{0x20e2, 0x3143},
+	{0x20e4, 0x5121},
+	{0x20e6, 0x7800},
+	{0x20e8, 0x3140},
+	{0x20ea, 0x01c4},
+	{0x20ec, 0x01c1},
+	{0x20ee, 0x01c0},
+	{0x20f0, 0x01c4},
+	{0x20f2, 0x2700},
+	{0x20f4, 0x3d40},
+	{0x20f6, 0x7800},
+	{0x20f8, 0xffff},
+	{0x27fe, 0xe000},
+	{0x3000, 0x60f8},
+	{0x3002, 0x187f},
+	{0x3004, 0x7060},
+	{0x3006, 0x0114},
+	{0x3008, 0x60b0},
+	{0x300a, 0x1473},
+	{0x300c, 0x0013},
+	{0x300e, 0x140f},
+	{0x3010, 0x0040},
+	{0x3012, 0x100f},
+	{0x3014, 0x60f8},
+	{0x3016, 0x187f},
+	{0x3018, 0x7060},
+	{0x301a, 0x0114},
+	{0x301c, 0x60b0},
+	{0x301e, 0x1473},
+	{0x3020, 0x0013},
+	{0x3022, 0x140f},
+	{0x3024, 0x0040},
+	{0x3026, 0x000f},
+	{0x0b00, 0x0000},
+	{0x0b02, 0x0045},
+	{0x0b04, 0xb405},
+	{0x0b06, 0xc403},
+	{0x0b08, 0x0081},
+	{0x0b0a, 0x8252},
+	{0x0b0c, 0xf814},
+	{0x0b0e, 0xc618},
+	{0x0b10, 0xa828},
+	{0x0b12, 0x004c},
+	{0x0b14, 0x4068},
+	{0x0b16, 0x0000},
+	{0x0f30, 0x6e25},
+	{0x0f32, 0x7067},
+	{0x0954, 0x0009},
+	{0x0956, 0x1100},
+	{0x0958, 0xcc80},
+	{0x095a, 0x0000},
+	{0x0c00, 0x1110},
+	{0x0c02, 0x0011},
+	{0x0c04, 0x0000},
+	{0x0c06, 0x0200},
+	{0x0c10, 0x0040},
+	{0x0c12, 0x0040},
+	{0x0c14, 0x0040},
+	{0x0c16, 0x0040},
+	{0x0a10, 0x4000},
+	{0x3068, 0xf800},
+	{0x306a, 0xf876},
+	{0x006c, 0x0000},
+	{0x005e, 0x0200},
+	{0x000e, 0x0100},
+	{0x0e0a, 0x0001},
+	{0x004a, 0x0100},
+	{0x004c, 0x0000},
+	{0x004e, 0x0100},
+	{0x000c, 0x0022},
+	{0x0008, 0x0b00},
+	{0x005a, 0x0202},
+	{0x0012, 0x000e},
+	{0x0018, 0x0a31},
+	{0x0022, 0x0008},
+	{0x0028, 0x0017},
+	{0x0024, 0x0028},
+	{0x002a, 0x002d},
+	{0x0026, 0x0030},
+	{0x002c, 0x07c7},
+	{0x002e, 0x1111},
+	{0x0030, 0x1111},
+	{0x0032, 0x1111},
+	{0x0006, 0x0823},
+	{0x0a22, 0x0000},
+	{0x0a12, 0x0a20},
+	{0x0a14, 0x0798},
+	{0x003e, 0x0000},
+	{0x0074, 0x0821},
+	{0x0070, 0x0411},
+	{0x0002, 0x0000},
+	{0x0a02, 0x0100},
+	{0x0a24, 0x0100},
+	{0x0076, 0x0000},
+	{0x0060, 0x0000},
+	{0x0062, 0x0530},
+	{0x0064, 0x0500},
+	{0x0066, 0x0530},
+	{0x0068, 0x0500},
+	{0x0122, 0x0300},
+	{0x015a, 0xff08},
+	{0x0804, 0x0200},
+	{0x005c, 0x0102},
+	{0x0a1a, 0x0800},
+	{0x003c, 0x0101}, //fix framerate
+	{REG_NULL, 0x00},
+};
+
+/*
+ * Xclk 24Mhz
+ * Pclk 210Mhz
+ * linelength 2816
+ * framelength 2083
+ * grabwindow_width 2592
+ * grabwindow_height 1944
+ * max_framerate 30fps
+ * MIPI speed(Mbps): 880Mbps x 2lane
+ */
+static const struct regval hi556_2592x1944_regs_2lane[] = {
+	{0x0a00, 0x0000},
+	{0x0b0a, 0x8252},
+	{0x0f30, 0x6e25},
+	{0x0f32, 0x7067},
+	{0x004a, 0x0100},
+	{0x004c, 0x0000},
+	{0x004e, 0x0000},
+	{0x000c, 0x0022},
+	{0x0008, 0x0b00},
+	{0x005a, 0x0202},
+	{0x0012, 0x000e},
+	{0x0018, 0x0a31},
+	{0x0022, 0x0008},
+	{0x0028, 0x0017},
+	{0x0024, 0x0028},
+	{0x002a, 0x002d},
+	{0x0026, 0x0030},
+	{0x002c, 0x07c7},
+	{0x002e, 0x1111},
+	{0x0030, 0x1111},
+	{0x0032, 0x1111},
+	{0x0006, 0x0823},
+	{0x0a22, 0x0000},
+	{0x0a12, 0x0a20},
+	{0x0a14, 0x0798},
+	{0x003e, 0x0000},
+	{0x0804, 0x0200},
+	{0x0a04, 0x014a},
+	{0x090c, 0x0fdc},
+	{0x090e, 0x002d},
+	{0x0902, 0x4319},
+	{0x0914, 0xc10a},
+	{0x0916, 0x071f},
+	{0x0918, 0x0408},
+	{0x091a, 0x0c0d},
+	{0x091c, 0x0f09},
+	{0x091e, 0x0a00},
+	//{0x0a00, 0x0100},
+
+	{REG_NULL, 0x00},
+};
+
+static const struct hi556_mode supported_modes_2lane[] = {
+	{
+		.width = 2592,
+		.height = 1944,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x0810,
+		.hts_def = 0x0B00,
+		.vts_def = 0x0823,
+		.reg_list = hi556_2592x1944_regs_2lane,
+		.hdr_mode = NO_HDR,
+	}
+};
+
+static const struct hi556_mode *supported_modes;
+
+static const s64 link_freq_menu_items[] = {
+	MIPI_FREQ
+};
+
+static const char * const hi556_test_pattern_menu[] = {
+	"Disabled",
+	"Solid color bar",
+	"100% color bars",
+	"Fade to gray color bars",
+	"PN9",
+	"Horizental/Vertical gradient",
+	"Check board",
+	"Slant",
+	"Resolution",
+};
+
+/* Write registers up to 4 at a time */
+static int hi556_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, "%s(%d) enter!\n", __func__, __LINE__);
+	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) {
+		dev_err(&client->dev,
+			   "write reg(0x%x val:0x%x)failed !\n", reg, val);
+		return -EIO;
+	}
+	return 0;
+}
+
+static int hi556_write_array(struct i2c_client *client,
+			      const struct regval *regs)
+{
+	int i, delay_ms, ret = 0;
+
+	for (i = 0; ret == 0 && regs[i].addr != REG_NULL; i++) {
+		if (regs[i].addr == DELAY_MS) {
+			delay_ms = regs[i].val;
+			dev_info(&client->dev, "delay(%d) ms !\n", delay_ms);
+			usleep_range(1000 * delay_ms, 1000 * delay_ms + 100);
+			continue;
+		}
+		ret = hi556_write_reg(client, regs[i].addr,
+				       HI556_REG_VALUE_16BIT, regs[i].val);
+		if (ret)
+			dev_err(&client->dev, "%s failed !\n", __func__);
+	}
+	return ret;
+}
+
+/* Read registers up to 4 at a time */
+static int hi556_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 *)&reg_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;
+}
+
+/* Check Register value */
+#ifdef CHECK_REG_VALUE
+static int hi556_reg_verify(struct i2c_client *client,
+				const struct regval *regs)
+{
+	u32 i;
+	int ret = 0;
+	u32 value;
+
+	for (i = 0; ret == 0 && regs[i].addr != REG_NULL; i++) {
+		ret = hi556_read_reg(client, regs[i].addr,
+			  HI556_REG_VALUE_16BIT, &value);
+		if (value != regs[i].val) {
+			dev_info(&client->dev, "%s: 0x%04x is 0x%x instead of 0x%x\n",
+				  __func__, regs[i].addr, value, regs[i].val);
+		}
+	}
+	return ret;
+}
+#endif
+
+static int hi556_get_reso_dist(const struct hi556_mode *mode,
+				struct v4l2_mbus_framefmt *framefmt)
+{
+	return abs(mode->width - framefmt->width) +
+	       abs(mode->height - framefmt->height);
+}
+
+static const struct hi556_mode *
+hi556_find_best_fit(struct hi556 *hi556,
+			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 < hi556->cfg_num; i++) {
+		dist = hi556_get_reso_dist(&supported_modes[i], framefmt);
+		if (cur_best_fit_dist == -1 || dist < cur_best_fit_dist) {
+			cur_best_fit_dist = dist;
+			cur_best_fit = i;
+		}
+	}
+
+	return &supported_modes[cur_best_fit];
+}
+
+static int hi556_set_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct hi556 *hi556 = to_hi556(sd);
+	const struct hi556_mode *mode;
+	s64 h_blank, vblank_def;
+
+	mutex_lock(&hi556->mutex);
+
+	mode = hi556_find_best_fit(hi556, fmt);
+	fmt->format.code = HI556_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(&hi556->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		hi556->cur_mode = mode;
+		h_blank = mode->hts_def - mode->width;
+		__v4l2_ctrl_modify_range(hi556->hblank, h_blank,
+					 h_blank, 1, h_blank);
+		vblank_def = mode->vts_def - mode->height;
+		__v4l2_ctrl_modify_range(hi556->vblank, vblank_def,
+					 HI556_VTS_MAX - mode->height,
+					 1, vblank_def);
+	}
+
+	mutex_unlock(&hi556->mutex);
+
+	return 0;
+}
+
+static int hi556_get_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct hi556 *hi556 = to_hi556(sd);
+	const struct hi556_mode *mode = hi556->cur_mode;
+
+	mutex_lock(&hi556->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(&hi556->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		fmt->format.width = mode->width;
+		fmt->format.height = mode->height;
+		fmt->format.code = HI556_MEDIA_BUS_FMT;
+		fmt->format.field = V4L2_FIELD_NONE;
+	}
+	mutex_unlock(&hi556->mutex);
+
+	return 0;
+}
+
+static int hi556_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 = HI556_MEDIA_BUS_FMT;
+
+	return 0;
+}
+
+static int hi556_enum_frame_sizes(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_pad_config *cfg,
+				   struct v4l2_subdev_frame_size_enum *fse)
+{
+	struct hi556 *hi556 = to_hi556(sd);
+
+	if (fse->index >= hi556->cfg_num)
+		return -EINVAL;
+
+	if (fse->code != HI556_MEDIA_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;
+
+	return 0;
+}
+
+static int hi556_enable_test_pattern(struct hi556 *hi556, u32 pattern)
+{
+
+	if (pattern) {
+		hi556_write_reg(hi556->client, HI556_REG_TEST_PATTERN,
+						HI556_REG_VALUE_08BIT, HI556_TEST_PATTERN_ENABLE);
+		hi556_write_reg(hi556->client, HI556_REG_TEST_PATTERN_SELECT,
+						HI556_REG_VALUE_08BIT, 0x01 << (pattern - 1));
+	} else {
+		hi556_write_reg(hi556->client, HI556_REG_TEST_PATTERN,
+						HI556_REG_VALUE_08BIT, HI556_TEST_PATTERN_DISABLE);
+	}
+	return 0;
+}
+
+static int hi556_g_frame_interval(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_frame_interval *fi)
+{
+	struct hi556 *hi556 = to_hi556(sd);
+	const struct hi556_mode *mode = hi556->cur_mode;
+
+	mutex_lock(&hi556->mutex);
+	fi->interval = mode->max_fps;
+	mutex_unlock(&hi556->mutex);
+
+	return 0;
+}
+
+static void hi556_get_module_inf(struct hi556 *hi556,
+				  struct rkmodule_inf *inf)
+{
+	memset(inf, 0, sizeof(*inf));
+	strscpy(inf->base.sensor, HI556_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, hi556->module_name,
+		sizeof(inf->base.module));
+	strscpy(inf->base.lens, hi556->len_name, sizeof(inf->base.lens));
+
+}
+
+static void hi556_set_awb_cfg(struct hi556 *hi556,
+				 struct rkmodule_awb_cfg *cfg)
+{
+	mutex_lock(&hi556->mutex);
+	memcpy(&hi556->awb_cfg, cfg, sizeof(*cfg));
+	mutex_unlock(&hi556->mutex);
+}
+
+static long hi556_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	struct hi556 *hi556 = to_hi556(sd);
+	long ret = 0;
+	u32 stream = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		hi556_get_module_inf(hi556, (struct rkmodule_inf *)arg);
+		break;
+	case RKMODULE_AWB_CFG:
+		hi556_set_awb_cfg(hi556, (struct rkmodule_awb_cfg *)arg);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+
+		stream = *((u32 *)arg);
+
+		if (stream)
+			ret = hi556_write_reg(hi556->client, HI556_REG_CTRL_MODE,
+				HI556_REG_VALUE_08BIT, HI556_MODE_STREAMING);
+		else
+			ret = hi556_write_reg(hi556->client, HI556_REG_CTRL_MODE,
+				HI556_REG_VALUE_08BIT, HI556_MODE_SW_STANDBY);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+
+#ifdef CONFIG_COMPAT
+static long hi556_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 *awb_cfg;
+	long ret;
+	u32 stream = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		inf = kzalloc(sizeof(*inf), GFP_KERNEL);
+		if (!inf) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = hi556_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:
+		awb_cfg = kzalloc(sizeof(*awb_cfg), GFP_KERNEL);
+		if (!awb_cfg) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		if (copy_from_user(awb_cfg, up, sizeof(*awb_cfg))) {
+			kfree(awb_cfg);
+			return -EFAULT;
+		}
+		ret = hi556_ioctl(sd, cmd, awb_cfg);
+		kfree(awb_cfg);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		if (copy_from_user(&stream, up, sizeof(u32)))
+			return -EFAULT;
+		ret = hi556_ioctl(sd, cmd, &stream);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+#endif
+
+static int __hi556_start_stream(struct hi556 *hi556)
+{
+	int ret;
+
+	ret = hi556_write_array(hi556->client, hi556->cur_mode->reg_list);
+	if (ret)
+		return ret;
+
+#ifdef CHECK_REG_VALUE
+	usleep_range(10000, 20000);
+	/*  verify default values to make sure everything has */
+	/*  been written correctly as expected */
+	dev_info(&hi556->client->dev, "%s:Check register value!\n",
+				__func__);
+	ret = hi556_reg_verify(hi556->client, hi556_global_regs);
+	if (ret)
+		return ret;
+
+	ret = hi556_reg_verify(hi556->client, hi556->cur_mode->reg_list);
+	if (ret)
+		return ret;
+#endif
+
+	/* In case these controls are set before streaming */
+	mutex_unlock(&hi556->mutex);
+	ret = v4l2_ctrl_handler_setup(&hi556->ctrl_handler);
+	mutex_lock(&hi556->mutex);
+	if (ret)
+		return ret;
+
+	if (ret)
+		dev_info(&hi556->client->dev, "APPly otp failed!\n");
+
+	ret = hi556_write_reg(hi556->client, HI556_REG_CTRL_MODE,
+				HI556_REG_VALUE_08BIT, HI556_MODE_STREAMING);
+	return ret;
+}
+
+static int __hi556_stop_stream(struct hi556 *hi556)
+{
+	return hi556_write_reg(hi556->client, HI556_REG_CTRL_MODE,
+				HI556_REG_VALUE_08BIT, HI556_MODE_SW_STANDBY);
+}
+
+static int hi556_s_stream(struct v4l2_subdev *sd, int on)
+{
+	struct hi556 *hi556 = to_hi556(sd);
+	struct i2c_client *client = hi556->client;
+	int ret = 0;
+
+	dev_info(&client->dev, "%s: on: %d, %dx%d@%d\n", __func__, on,
+				hi556->cur_mode->width,
+				hi556->cur_mode->height,
+		DIV_ROUND_CLOSEST(hi556->cur_mode->max_fps.denominator,
+		hi556->cur_mode->max_fps.numerator));
+
+	mutex_lock(&hi556->mutex);
+	on = !!on;
+	if (on == hi556->streaming)
+		goto unlock_and_return;
+
+	if (on) {
+		dev_info(&client->dev, "stream on!!!\n");
+		ret = pm_runtime_get_sync(&client->dev);
+		if (ret < 0) {
+			pm_runtime_put_noidle(&client->dev);
+			goto unlock_and_return;
+		}
+
+		ret = __hi556_start_stream(hi556);
+		if (ret) {
+			v4l2_err(sd, "start stream failed while write regs\n");
+			pm_runtime_put(&client->dev);
+			goto unlock_and_return;
+		}
+	} else {
+		dev_info(&client->dev, "stream off!!!\n");
+		__hi556_stop_stream(hi556);
+		pm_runtime_put(&client->dev);
+	}
+
+	hi556->streaming = on;
+
+unlock_and_return:
+	mutex_unlock(&hi556->mutex);
+
+	return ret;
+}
+
+static int hi556_s_power(struct v4l2_subdev *sd, int on)
+{
+	struct hi556 *hi556 = to_hi556(sd);
+	struct i2c_client *client = hi556->client;
+	int ret = 0;
+
+	dev_info(&client->dev, "%s(%d) on(%d)\n", __func__, __LINE__, on);
+	mutex_lock(&hi556->mutex);
+
+	/* If the power state is not modified - no work to do. */
+	if (hi556->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;
+		}
+
+		ret = hi556_write_array(hi556->client, hi556_global_regs);
+		if (ret) {
+			v4l2_err(sd, "could not set init registers\n");
+			pm_runtime_put_noidle(&client->dev);
+			goto unlock_and_return;
+		}
+
+		hi556->power_on = true;
+	} else {
+		pm_runtime_put(&client->dev);
+		hi556->power_on = false;
+	}
+
+unlock_and_return:
+	mutex_unlock(&hi556->mutex);
+
+	return ret;
+}
+
+/* Calculate the delay in us by clock rate and clock cycles */
+static inline u32 hi556_cal_delay(u32 cycles)
+{
+	return DIV_ROUND_UP(cycles, HI556_XVCLK_FREQ / 1000 / 1000);
+}
+
+static int __hi556_power_on(struct hi556 *hi556)
+{
+	int ret;
+	u32 delay_us;
+	struct device *dev = &hi556->client->dev;
+
+	if (!IS_ERR(hi556->power_gpio))
+		gpiod_set_value_cansleep(hi556->power_gpio, 1);
+
+	usleep_range(1000, 2000);
+
+	if (!IS_ERR_OR_NULL(hi556->pins_default)) {
+		ret = pinctrl_select_state(hi556->pinctrl,
+					   hi556->pins_default);
+		if (ret < 0)
+			dev_err(dev, "could not set pins\n");
+	}
+	ret = clk_set_rate(hi556->xvclk, HI556_XVCLK_FREQ);
+	if (ret < 0)
+		dev_warn(dev, "Failed to set xvclk rate (24MHz)\n");
+	if (clk_get_rate(hi556->xvclk) != HI556_XVCLK_FREQ)
+		dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n");
+	ret = clk_prepare_enable(hi556->xvclk);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable xvclk\n");
+		return ret;
+	}
+
+	ret = regulator_bulk_enable(HI556_NUM_SUPPLIES, hi556->supplies);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable regulators\n");
+		goto disable_clk;
+	}
+
+	if (!IS_ERR(hi556->reset_gpio))
+		gpiod_set_value_cansleep(hi556->reset_gpio, 1);
+
+	if (!IS_ERR(hi556->pwdn_gpio))
+		gpiod_set_value_cansleep(hi556->pwdn_gpio, 1);
+
+	/* 8192 cycles prior to first SCCB transaction */
+	delay_us = hi556_cal_delay(8192);
+	usleep_range(delay_us, delay_us * 2);
+	usleep_range(10000, 20000);
+	return 0;
+
+disable_clk:
+	clk_disable_unprepare(hi556->xvclk);
+
+	return ret;
+}
+
+static void __hi556_power_off(struct hi556 *hi556)
+{
+	int ret;
+	struct device *dev = &hi556->client->dev;
+
+	if (!IS_ERR(hi556->pwdn_gpio))
+		gpiod_set_value_cansleep(hi556->pwdn_gpio, 0);
+	clk_disable_unprepare(hi556->xvclk);
+	if (!IS_ERR(hi556->reset_gpio))
+		gpiod_set_value_cansleep(hi556->reset_gpio, 0);
+	if (!IS_ERR_OR_NULL(hi556->pins_sleep)) {
+		ret = pinctrl_select_state(hi556->pinctrl,
+					   hi556->pins_sleep);
+		if (ret < 0)
+			dev_dbg(dev, "could not set pins\n");
+	}
+	if (!IS_ERR(hi556->power_gpio))
+		gpiod_set_value_cansleep(hi556->power_gpio, 0);
+
+	regulator_bulk_disable(HI556_NUM_SUPPLIES, hi556->supplies);
+}
+
+static int hi556_runtime_resume(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct hi556 *hi556 = to_hi556(sd);
+
+	return __hi556_power_on(hi556);
+}
+
+static int hi556_runtime_suspend(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct hi556 *hi556 = to_hi556(sd);
+
+	__hi556_power_off(hi556);
+
+	return 0;
+}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static int hi556_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
+{
+	struct hi556 *hi556 = to_hi556(sd);
+	struct v4l2_mbus_framefmt *try_fmt =
+				v4l2_subdev_get_try_format(sd, fh->pad, 0);
+	const struct hi556_mode *def_mode = &supported_modes[0];
+
+	mutex_lock(&hi556->mutex);
+	/* Initialize try_fmt */
+	try_fmt->width = def_mode->width;
+	try_fmt->height = def_mode->height;
+	try_fmt->code = HI556_MEDIA_BUS_FMT;
+	try_fmt->field = V4L2_FIELD_NONE;
+
+	mutex_unlock(&hi556->mutex);
+	/* No crop or compose */
+
+	return 0;
+}
+#endif
+
+static int hi556_enum_frame_interval(struct v4l2_subdev *sd,
+				       struct v4l2_subdev_pad_config *cfg,
+				       struct v4l2_subdev_frame_interval_enum *fie)
+{
+	struct hi556 *hi556 = to_hi556(sd);
+
+	if (fie->index >= hi556->cfg_num)
+		return -EINVAL;
+
+	if (fie->code != HI556_MEDIA_BUS_FMT)
+		return -EINVAL;
+
+	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;
+	return 0;
+}
+
+static const struct dev_pm_ops hi556_pm_ops = {
+	SET_RUNTIME_PM_OPS(hi556_runtime_suspend,
+			   hi556_runtime_resume, NULL)
+};
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static const struct v4l2_subdev_internal_ops hi556_internal_ops = {
+	.open = hi556_open,
+};
+#endif
+
+static const struct v4l2_subdev_core_ops hi556_core_ops = {
+	.s_power = hi556_s_power,
+	.ioctl = hi556_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = hi556_compat_ioctl32,
+#endif
+};
+
+static const struct v4l2_subdev_video_ops hi556_video_ops = {
+	.s_stream = hi556_s_stream,
+	.g_frame_interval = hi556_g_frame_interval,
+};
+
+static const struct v4l2_subdev_pad_ops hi556_pad_ops = {
+	.enum_mbus_code = hi556_enum_mbus_code,
+	.enum_frame_size = hi556_enum_frame_sizes,
+	.enum_frame_interval = hi556_enum_frame_interval,
+	.get_fmt = hi556_get_fmt,
+	.set_fmt = hi556_set_fmt,
+};
+
+static const struct v4l2_subdev_ops hi556_subdev_ops = {
+	.core	= &hi556_core_ops,
+	.video	= &hi556_video_ops,
+	.pad	= &hi556_pad_ops,
+};
+
+static int hi556_set_exposure_reg(struct hi556 *hi556, u32 exposure)
+{
+	int ret = 0;
+	u32 cal_shutter = 0;
+
+	cal_shutter = exposure >> 1;
+	cal_shutter = cal_shutter << 1;
+
+	ret = hi556_write_reg(hi556->client, HI556_REG_GROUP,
+			      HI556_REG_VALUE_08BIT, 0x01);
+	ret |= hi556_write_reg(hi556->client,
+			       HI556_REG_EXPOSURE_H,
+			       HI556_REG_VALUE_08BIT,
+			       HI556_FETCH_HIGH_BYTE_EXP(cal_shutter));
+	ret |= hi556_write_reg(hi556->client,
+			       HI556_REG_EXPOSURE_M,
+			       HI556_REG_VALUE_08BIT,
+			       HI556_FETCH_MIDDLE_BYTE_EXP(cal_shutter));
+	ret |= hi556_write_reg(hi556->client,
+			       HI556_REG_EXPOSURE_L,
+			       HI556_REG_VALUE_08BIT,
+			       HI556_FETCH_LOW_BYTE_EXP(cal_shutter));
+	ret |= hi556_write_reg(hi556->client, HI556_REG_GROUP,
+			       HI556_REG_VALUE_08BIT, 0x00);
+
+	return ret;
+}
+
+static int hi556_set_gain_reg(struct hi556 *hi556, u32 a_gain)
+{
+	int ret = 0;
+
+	ret = hi556_write_reg(hi556->client, HI556_REG_GROUP,
+			      HI556_REG_VALUE_08BIT, 0x01);
+	ret |= hi556_write_reg(hi556->client, HI556_REG_GAIN,
+			       HI556_REG_VALUE_08BIT, a_gain);
+	ret |= hi556_write_reg(hi556->client, HI556_REG_GROUP,
+			       HI556_REG_VALUE_08BIT, 0x00);
+
+	return ret;
+}
+
+static int hi556_set_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct hi556 *hi556 = container_of(ctrl->handler,
+					     struct hi556, ctrl_handler);
+	struct i2c_client *client = hi556->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 = hi556->cur_mode->height + ctrl->val - 4;
+		__v4l2_ctrl_modify_range(hi556->exposure,
+					 hi556->exposure->minimum, max,
+					 hi556->exposure->step,
+					 hi556->exposure->default_value);
+		break;
+	}
+
+	if (!pm_runtime_get_if_in_use(&client->dev))
+		return 0;
+
+	switch (ctrl->id) {
+	case V4L2_CID_EXPOSURE:
+		dev_dbg(&client->dev, "set exposure value 0x%x\n", ctrl->val);
+		/* 4 least significant bits of expsoure are fractional part */
+		ret = hi556_set_exposure_reg(hi556, ctrl->val);
+		break;
+	case V4L2_CID_ANALOGUE_GAIN:
+		dev_dbg(&client->dev, "set analog gain value 0x%x\n", ctrl->val);
+		ret = hi556_set_gain_reg(hi556, ctrl->val);
+		break;
+	case V4L2_CID_VBLANK:
+		dev_dbg(&client->dev, "set vb value 0x%x\n", ctrl->val);
+		ret = hi556_write_reg(hi556->client, HI556_REG_VTS,
+				       HI556_REG_VALUE_16BIT,
+				       ctrl->val + hi556->cur_mode->height);
+		break;
+	case V4L2_CID_TEST_PATTERN:
+		ret = hi556_enable_test_pattern(hi556, 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 hi556_ctrl_ops = {
+	.s_ctrl = hi556_set_ctrl,
+};
+
+static int hi556_initialize_controls(struct hi556 *hi556)
+{
+	const struct hi556_mode *mode;
+	struct v4l2_ctrl_handler *handler;
+	struct v4l2_ctrl *ctrl;
+	s64 exposure_max, vblank_def;
+	u32 h_blank;
+	int ret;
+
+	handler = &hi556->ctrl_handler;
+	mode = hi556->cur_mode;
+	ret = v4l2_ctrl_handler_init(handler, 8);
+	if (ret)
+		return ret;
+	handler->lock = &hi556->mutex;
+
+	ctrl = v4l2_ctrl_new_int_menu(handler, NULL, V4L2_CID_LINK_FREQ,
+				      0, 0, link_freq_menu_items);
+	if (ctrl)
+		ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+
+	v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE,
+			  0, hi556->pixel_rate, 1, hi556->pixel_rate);
+
+	h_blank = mode->hts_def - mode->width;
+	hi556->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
+				h_blank, h_blank, 1, h_blank);
+	if (hi556->hblank)
+		hi556->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+
+	vblank_def = mode->vts_def - mode->height;
+	hi556->vblank = v4l2_ctrl_new_std(handler, &hi556_ctrl_ops,
+				V4L2_CID_VBLANK, vblank_def,
+				HI556_VTS_MAX - mode->height,
+				1, vblank_def);
+
+	exposure_max = mode->vts_def - 4;
+	hi556->exposure = v4l2_ctrl_new_std(handler, &hi556_ctrl_ops,
+				V4L2_CID_EXPOSURE, HI556_EXPOSURE_MIN,
+				exposure_max, HI556_EXPOSURE_STEP,
+				mode->exp_def);
+
+	hi556->anal_gain = v4l2_ctrl_new_std(handler, &hi556_ctrl_ops,
+				V4L2_CID_ANALOGUE_GAIN, ANALOG_GAIN_MIN,
+				ANALOG_GAIN_MAX, ANALOG_GAIN_STEP,
+				ANALOG_GAIN_DEFAULT);
+
+	hi556->test_pattern = v4l2_ctrl_new_std_menu_items(handler,
+				&hi556_ctrl_ops, V4L2_CID_TEST_PATTERN,
+				ARRAY_SIZE(hi556_test_pattern_menu) - 1,
+				0, 0, hi556_test_pattern_menu);
+
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(&hi556->client->dev,
+			"Failed to init controls(%d)\n", ret);
+		goto err_free_handler;
+	}
+
+	hi556->subdev.ctrl_handler = handler;
+
+	return 0;
+
+err_free_handler:
+	v4l2_ctrl_handler_free(handler);
+
+	return ret;
+}
+
+static int hi556_check_sensor_id(struct hi556 *hi556,
+				  struct i2c_client *client)
+{
+	struct device *dev = &hi556->client->dev;
+	u32 id = 0;
+	int ret;
+
+	ret = hi556_read_reg(client, HI556_REG_CHIP_ID,
+			      HI556_REG_VALUE_16BIT, &id);
+	if (id != CHIP_ID) {
+		dev_err(dev, "Unexpected sensor id(%06x), ret(%d)\n", id, ret);
+		return -ENODEV;
+	}
+
+	dev_info(dev, "Detected Hi%04x sensor\n", CHIP_ID);
+
+	return 0;
+}
+
+static int hi556_configure_regulators(struct hi556 *hi556)
+{
+	unsigned int i;
+
+	for (i = 0; i < HI556_NUM_SUPPLIES; i++)
+		hi556->supplies[i].supply = hi556_supply_names[i];
+
+	return devm_regulator_bulk_get(&hi556->client->dev,
+				       HI556_NUM_SUPPLIES,
+				       hi556->supplies);
+}
+
+static int hi556_parse_of(struct hi556 *hi556)
+{
+	struct device *dev = &hi556->client->dev;
+	struct device_node *endpoint;
+	struct fwnode_handle *fwnode;
+	int rval;
+
+	endpoint = of_graph_get_next_endpoint(dev->of_node, NULL);
+	if (!endpoint) {
+		dev_err(dev, "Failed to get endpoint\n");
+		return -EINVAL;
+	}
+	fwnode = of_fwnode_handle(endpoint);
+	rval = fwnode_property_read_u32_array(fwnode, "data-lanes", NULL, 0);
+	if (rval <= 0) {
+		dev_warn(dev, " Get mipi lane num failed!\n");
+		return -1;
+	}
+
+	hi556->lane_num = rval;
+	if (2 == hi556->lane_num) {
+		hi556->cur_mode = &supported_modes_2lane[0];
+		supported_modes = supported_modes_2lane;
+		hi556->cfg_num = ARRAY_SIZE(supported_modes_2lane);
+
+		/* pixel rate = link frequency * 2 * lanes / BITS_PER_SAMPLE */
+		hi556->pixel_rate = MIPI_FREQ * 2U * hi556->lane_num / 8U;
+		dev_info(dev, "lane_num(%d)  pixel_rate(%u)\n",
+				 hi556->lane_num, hi556->pixel_rate);
+	} else {
+		dev_err(dev, "unsupported lane_num(%d)\n", hi556->lane_num);
+		return -1;
+	}
+
+	return 0;
+}
+
+static int hi556_probe(struct i2c_client *client,
+			const struct i2c_device_id *id)
+{
+	struct device *dev = &client->dev;
+	struct device_node *node = dev->of_node;
+	struct hi556 *hi556;
+	struct v4l2_subdev *sd;
+	char facing[2] = "b";
+	int ret;
+
+	dev_info(dev, "driver version: %02x.%02x.%02x",
+		DRIVER_VERSION >> 16,
+		(DRIVER_VERSION & 0xff00) >> 8,
+		DRIVER_VERSION & 0x00ff);
+
+	hi556 = devm_kzalloc(dev, sizeof(*hi556), GFP_KERNEL);
+	if (!hi556)
+		return -ENOMEM;
+
+	ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
+				   &hi556->module_index);
+	if (ret) {
+		dev_warn(dev, "could not get module index!\n");
+		hi556->module_index = 0;
+	}
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
+				       &hi556->module_facing);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME,
+				       &hi556->module_name);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME,
+				       &hi556->len_name);
+	if (ret) {
+		dev_err(dev, "could not get module information!\n");
+		return -EINVAL;
+	}
+
+	hi556->client = client;
+
+	hi556->xvclk = devm_clk_get(dev, "xvclk");
+	if (IS_ERR(hi556->xvclk)) {
+		dev_err(dev, "Failed to get xvclk\n");
+		return -EINVAL;
+	}
+
+	hi556->power_gpio = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW);
+	if (IS_ERR(hi556->power_gpio))
+		dev_warn(dev, "Failed to get power-gpios, maybe no use\n");
+
+	hi556->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+	if (IS_ERR(hi556->reset_gpio))
+		dev_warn(dev, "Failed to get reset-gpios, maybe no use\n");
+
+	hi556->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW);
+	if (IS_ERR(hi556->pwdn_gpio))
+		dev_warn(dev, "Failed to get pwdn-gpios\n");
+
+	ret = hi556_configure_regulators(hi556);
+	if (ret) {
+		dev_err(dev, "Failed to get power regulators\n");
+		return ret;
+	}
+	ret = hi556_parse_of(hi556);
+	if (ret != 0)
+		return -EINVAL;
+
+	hi556->pinctrl = devm_pinctrl_get(dev);
+	if (!IS_ERR(hi556->pinctrl)) {
+		hi556->pins_default =
+			pinctrl_lookup_state(hi556->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_DEFAULT);
+		if (IS_ERR(hi556->pins_default))
+			dev_err(dev, "could not get default pinstate\n");
+
+		hi556->pins_sleep =
+			pinctrl_lookup_state(hi556->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_SLEEP);
+		if (IS_ERR(hi556->pins_sleep))
+			dev_err(dev, "could not get sleep pinstate\n");
+	}
+
+	mutex_init(&hi556->mutex);
+
+	sd = &hi556->subdev;
+	v4l2_i2c_subdev_init(sd, client, &hi556_subdev_ops);
+	ret = hi556_initialize_controls(hi556);
+	if (ret)
+		goto err_destroy_mutex;
+
+	ret = __hi556_power_on(hi556);
+	if (ret)
+		goto err_free_handler;
+
+	ret = hi556_check_sensor_id(hi556, client);
+	if (ret < 0) {
+		dev_info(&client->dev, "%s(%d) Check id  failed\n"
+				  "check following information:\n"
+				  "Power/PowerDown/Reset/Mclk/I2cBus !!\n",
+				  __func__, __LINE__);
+		goto err_power_off;
+	}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+	sd->internal_ops = &hi556_internal_ops;
+	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
+		     V4L2_SUBDEV_FL_HAS_EVENTS;
+#endif
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	hi556->pad.flags = MEDIA_PAD_FL_SOURCE;
+	sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
+	ret = media_entity_pads_init(&sd->entity, 1, &hi556->pad);
+	if (ret < 0)
+		goto err_power_off;
+#endif
+
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(hi556->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s",
+		 hi556->module_index, facing,
+		 HI556_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:
+	__hi556_power_off(hi556);
+err_free_handler:
+	v4l2_ctrl_handler_free(&hi556->ctrl_handler);
+err_destroy_mutex:
+	mutex_destroy(&hi556->mutex);
+
+	return ret;
+}
+
+static int hi556_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct hi556 *hi556 = to_hi556(sd);
+
+	v4l2_async_unregister_subdev(sd);
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	media_entity_cleanup(&sd->entity);
+#endif
+	v4l2_ctrl_handler_free(&hi556->ctrl_handler);
+	mutex_destroy(&hi556->mutex);
+
+	pm_runtime_disable(&client->dev);
+	if (!pm_runtime_status_suspended(&client->dev))
+		__hi556_power_off(hi556);
+	pm_runtime_set_suspended(&client->dev);
+
+	return 0;
+}
+
+#if IS_ENABLED(CONFIG_OF)
+static const struct of_device_id hi556_of_match[] = {
+	{ .compatible = "hynix,hi556" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, hi556_of_match);
+#endif
+
+static const struct i2c_device_id hi556_match_id[] = {
+	{ "hynix,hi556", 0 },
+	{ },
+};
+
+static struct i2c_driver hi556_i2c_driver = {
+	.driver = {
+		.name = HI556_NAME,
+		.pm = &hi556_pm_ops,
+		.of_match_table = of_match_ptr(hi556_of_match),
+	},
+	.probe		= &hi556_probe,
+	.remove		= &hi556_remove,
+	.id_table	= hi556_match_id,
+};
+
+static int __init sensor_mod_init(void)
+{
+	return i2c_add_driver(&hi556_i2c_driver);
+}
+
+static void __exit sensor_mod_exit(void)
+{
+	i2c_del_driver(&hi556_i2c_driver);
+}
+
+device_initcall_sync(sensor_mod_init);
+module_exit(sensor_mod_exit);
+
+MODULE_DESCRIPTION("OmniVision hi556 sensor driver");
+MODULE_LICENSE("GPL v2");

commit 5dc8c4a1bffdf6dc337bec5e6030757ce60dc4d9
Author: Elaine Zhang <zhangqing@rock-chips.com>
Date:   Thu May 20 09:36:03 2021 +0800

    FROMLIST: clk: rockchip: fix rk3568 cpll clk gate bits
    
    The cpll clk gate bits had an ordering issue. This led to the loss of
    the boot sdmmc controller when the gmac was shut down with:
    `ip link set eth0 down`
    as the cpll_100m was shut off instead of the cpll_62p5.
    cpll_62p5, cpll_50m, cpll_25m were all off by one with cpll_100m
    misplaced.
    
    Fixes: e9ac850b8828 ("clk: rockchip: add clock controller for rk3568")
    
    Signed-off-by: Peter Geis <pgwipeout@gmail.com>
    Link: https://patchwork.kernel.org/project/linux-clk/patch/20210519174149.3691335-1-pgwipeout@gmail.com/
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    Change-Id: I012bdbdc44c4e8de1b42a00c2a9bffb7bd66faef

diff --git a/drivers/clk/rockchip/clk-rk3568.c b/drivers/clk/rockchip/clk-rk3568.c
index a28046a2b8b7..eb40d6fd915f 100644
--- a/drivers/clk/rockchip/clk-rk3568.c
+++ b/drivers/clk/rockchip/clk-rk3568.c
@@ -504,17 +504,17 @@ static struct rockchip_clk_branch rk3568_clk_branches[] __initdata = {
 	COMPOSITE_NOMUX(CPLL_125M, "cpll_125m", "cpll", CLK_IGNORE_UNUSED,
 			RK3568_CLKSEL_CON(80), 0, 5, DFLAGS,
 			RK3568_CLKGATE_CON(35), 10, GFLAGS),
+	COMPOSITE_NOMUX(CPLL_100M, "cpll_100m", "cpll", CLK_IGNORE_UNUSED,
+			RK3568_CLKSEL_CON(82), 0, 5, DFLAGS,
+			RK3568_CLKGATE_CON(35), 11, GFLAGS),
 	COMPOSITE_NOMUX(CPLL_62P5M, "cpll_62p5", "cpll", CLK_IGNORE_UNUSED,
 			RK3568_CLKSEL_CON(80), 8, 5, DFLAGS,
-			RK3568_CLKGATE_CON(35), 11, GFLAGS),
+			RK3568_CLKGATE_CON(35), 12, GFLAGS),
 	COMPOSITE_NOMUX(CPLL_50M, "cpll_50m", "cpll", CLK_IGNORE_UNUSED,
 			RK3568_CLKSEL_CON(81), 0, 5, DFLAGS,
-			RK3568_CLKGATE_CON(35), 12, GFLAGS),
+			RK3568_CLKGATE_CON(35), 13, GFLAGS),
 	COMPOSITE_NOMUX(CPLL_25M, "cpll_25m", "cpll", CLK_IGNORE_UNUSED,
 			RK3568_CLKSEL_CON(81), 8, 6, DFLAGS,
-			RK3568_CLKGATE_CON(35), 13, GFLAGS),
-	COMPOSITE_NOMUX(CPLL_100M, "cpll_100m", "cpll", CLK_IGNORE_UNUSED,
-			RK3568_CLKSEL_CON(82), 0, 5, DFLAGS,
 			RK3568_CLKGATE_CON(35), 14, GFLAGS),
 	COMPOSITE_NOMUX(0, "clk_osc0_div_750k", "xin24m", CLK_IGNORE_UNUSED,
 			RK3568_CLKSEL_CON(82), 8, 6, DFLAGS,

commit f9b88fb75f73416bd66864bda08c87e65fccbbc4
Author: Nick Desaulniers <ndesaulniers@google.com>
Date:   Tue Apr 20 10:44:25 2021 -0700

    BACKPORT: arm64: vdso32: drop -no-integrated-as flag
    
    Clang can assemble these files just fine; this is a relic from the top
    level Makefile conditionally adding this. We no longer need --prefix,
    --gcc-toolchain, or -Qunused-arguments flags either with this change, so
    remove those too.
    
    To test building:
    $ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- \
      CROSS_COMPILE_COMPAT=arm-linux-gnueabi- make LLVM=1 LLVM_IAS=1 \
      defconfig arch/arm64/kernel/vdso32/
    
    Suggested-by: Nathan Chancellor <nathan@kernel.org>
    Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
    Reviewed-by: Nathan Chancellor <nathan@kernel.org>
    Reviewed-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
    Tested-by: Stephen Boyd <swboyd@chromium.org>
    Acked-by: Will Deacon <will@kernel.org>
    Link: https://lore.kernel.org/r/20210420174427.230228-1-ndesaulniers@google.com
    Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
    (cherry picked from commit ef94340583eec5cb1544dc41a87baa4f684b3fe1)
    Bug: 187949469
    Change-Id: I83e353bb1b1cd28c83dc26ba5fa604a3463a604c

diff --git a/arch/arm64/kernel/vdso32/Makefile b/arch/arm64/kernel/vdso32/Makefile
index d6ade5f80fd0..a8730723203b 100644
--- a/arch/arm64/kernel/vdso32/Makefile
+++ b/arch/arm64/kernel/vdso32/Makefile
@@ -10,15 +10,7 @@ include $(srctree)/lib/vdso/Makefile
 
 # Same as cc-*option, but using CC_COMPAT instead of CC
 ifeq ($(CONFIG_CC_IS_CLANG), y)
-COMPAT_GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE_COMPAT)elfedit))
-COMPAT_GCC_TOOLCHAIN := $(realpath $(COMPAT_GCC_TOOLCHAIN_DIR)/..)
-
 CC_COMPAT_CLANG_FLAGS := --target=$(notdir $(CROSS_COMPILE_COMPAT:%-=%))
-CC_COMPAT_CLANG_FLAGS += --prefix=$(COMPAT_GCC_TOOLCHAIN_DIR)
-CC_COMPAT_CLANG_FLAGS += -no-integrated-as -Qunused-arguments
-ifneq ($(COMPAT_GCC_TOOLCHAIN),)
-CC_COMPAT_CLANG_FLAGS += --gcc-toolchain=$(COMPAT_GCC_TOOLCHAIN)
-endif
 
 CC_COMPAT ?= $(CC)
 CC_COMPAT += $(CC_COMPAT_CLANG_FLAGS)

commit 86a623814b0a5baaef0eca18a567d759dab6544d
Author: Paul Lawrence <paullawrence@google.com>
Date:   Wed May 19 09:16:28 2021 -0700

    ANDROID: GKI: update allowed list for incrementalfs.ko
    
    Leaf changes summary: 1 artifact changed
    Changed leaf types summary: 0 leaf type changed
    Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 1 Added function
    Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
    
    1 Added function:
    
      [A] 'function int sysfs_emit(char*, const char*, ...)'
    
    Bug: 186855533
    Test: Builds
    Signed-off-by: Paul Lawrence <paullawrence@google.com>
    Change-Id: I1dc7fb4da564f7cc0d70e7c1ccf278ab8fc46a80

diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml
index c6606fbaa47b..735c48f9990b 100644
--- a/android/abi_gki_aarch64.xml
+++ b/android/abi_gki_aarch64.xml
@@ -2284,6 +2284,7 @@
       <elf-symbol name='sysfs_create_group' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x2a0c8109'/>
       <elf-symbol name='sysfs_create_groups' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x5c35623'/>
       <elf-symbol name='sysfs_create_link' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x18320d4b'/>
+      <elf-symbol name='sysfs_emit' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x80b14da5'/>
       <elf-symbol name='sysfs_notify' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xe7e1288'/>
       <elf-symbol name='sysfs_remove_bin_file' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x2e09439d'/>
       <elf-symbol name='sysfs_remove_file_ns' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x9805d77f'/>
@@ -10815,7 +10816,7 @@
           <var-decl name='module' type-id='7a2c185b' visibility='default' filepath='kernel/audit.h' line='205' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__13' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/cred.h' line='154' column='1' id='0a97cc35'>
+      <union-decl name='__anonymous_union__8' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/cred.h' line='154' column='1' id='0a97cc35'>
         <data-member access='public'>
           <var-decl name='non_rcu' type-id='95e97e5e' visibility='default' filepath='include/linux/cred.h' line='155' column='1'/>
         </data-member>
@@ -16680,7 +16681,7 @@
           <var-decl name='__rcu_head' type-id='e3d8ce29' visibility='default' filepath='include/linux/iocontext.h' line='89' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__36' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='1176' column='1' id='adf5bf47'>
+      <union-decl name='__anonymous_union__35' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='1176' column='1' id='adf5bf47'>
         <data-member access='public'>
           <var-decl name='hashinfo' type-id='d7a1e3c2' visibility='default' filepath='include/net/sock.h' line='1177' column='1'/>
         </data-member>
@@ -16694,7 +16695,7 @@
           <var-decl name='smc_hash' type-id='aa8162a3' visibility='default' filepath='include/net/sock.h' line='1180' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__12' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='214' column='1' id='d5d77d48'>
+      <union-decl name='__anonymous_union__7' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='214' column='1' id='d5d77d48'>
         <data-member access='public'>
           <var-decl name='payload' type-id='2888d74a' visibility='default' filepath='include/linux/key.h' line='215' column='1'/>
         </data-member>
@@ -16702,7 +16703,7 @@
           <var-decl name='' type-id='607bacb1' visibility='default' filepath='include/linux/key.h' line='216' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__11' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='202' column='1' id='5446e20e'>
+      <union-decl name='__anonymous_union__6' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='202' column='1' id='5446e20e'>
         <data-member access='public'>
           <var-decl name='index_key' type-id='16ab8749' visibility='default' filepath='include/linux/key.h' line='203' column='1'/>
         </data-member>
@@ -16718,7 +16719,7 @@
           <var-decl name='d_wait' type-id='03d48e96' visibility='default' filepath='include/linux/dcache.h' line='109' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__9' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='158' column='1' id='1a65b0a7'>
+      <union-decl name='__anonymous_union__4' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='158' column='1' id='1a65b0a7'>
         <data-member access='public'>
           <var-decl name='graveyard_link' type-id='72f469ec' visibility='default' filepath='include/linux/key.h' line='159' column='1'/>
         </data-member>
@@ -16773,7 +16774,7 @@
           <var-decl name='insnsi' type-id='b50399da' visibility='default' filepath='include/linux/filter.h' line='504' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__10' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='165' column='1' id='21f0eb77'>
+      <union-decl name='__anonymous_union__5' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='165' column='1' id='21f0eb77'>
         <data-member access='public'>
           <var-decl name='expiry' type-id='1afd27ac' visibility='default' filepath='include/linux/key.h' line='166' column='1'/>
         </data-member>
@@ -22473,7 +22474,7 @@
           <var-decl name='lower' type-id='72f469ec' visibility='default' filepath='include/linux/netdevice.h' line='1814' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__3' size-in-bits='768' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/slab.h' line='641' column='1' id='26b3aff0'>
+      <class-decl name='__anonymous_struct__4' size-in-bits='768' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/slab.h' line='641' column='1' id='26b3aff0'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='memcg' type-id='223696fb' visibility='default' filepath='include/linux/slab.h' line='642' column='1'/>
         </data-member>
@@ -22490,7 +22491,7 @@
           <var-decl name='' type-id='655b0d99' visibility='default' filepath='include/linux/slab.h' line='647' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__2' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/slab.h' line='635' column='1' id='22e2627b'>
+      <class-decl name='__anonymous_struct__3' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/slab.h' line='635' column='1' id='22e2627b'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='memcg_caches' type-id='2c8ce02f' visibility='default' filepath='include/linux/slab.h' line='636' column='1'/>
         </data-member>
@@ -28582,7 +28583,7 @@
       <array-type-def dimensions='1' type-id='19c2251e' size-in-bits='256' id='1c6311dd'>
         <subrange length='8' type-id='7ff19f0f' id='56e0c0b1'/>
       </array-type-def>
-      <union-decl name='__anonymous_union__13' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/inet_hashtables.h' line='118' column='1' id='ba169a6c'>
+      <union-decl name='__anonymous_union__14' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/inet_hashtables.h' line='118' column='1' id='ba169a6c'>
         <data-member access='public'>
           <var-decl name='head' type-id='e151255a' visibility='default' filepath='include/net/inet_hashtables.h' line='119' column='1'/>
         </data-member>
@@ -40844,6 +40845,17 @@
       </class-decl>
       <typedef-decl name='compat_uptr_t' type-id='19c2251e' filepath='arch/arm64/include/asm/compat.h' line='66' column='1' id='782d78af'/>
       <typedef-decl name='compat_long_t' type-id='a7832498' filepath='arch/arm64/include/asm/compat.h' line='60' column='1' id='abb906de'/>
+      <union-decl name='__anonymous_union__21' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='ecf138a1'>
+        <data-member access='public'>
+          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='__UNIQUE_ID_android_kabi_hide67' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
+        </data-member>
+      </union-decl>
       <pointer-type-def type-id='85c22421' size-in-bits='64' id='ee406209'/>
       <pointer-type-def type-id='830ee0a7' size-in-bits='64' id='5d3a884e'/>
       <pointer-type-def type-id='3b5c61ad' size-in-bits='64' id='a38aafde'/>
@@ -52855,7 +52867,7 @@
           <var-decl name='nh' type-id='708c2394' visibility='default' filepath='include/drm/drm_panel.h' line='122' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/drm/drm_device.h' line='205' column='1' id='76c13bb3'>
+      <class-decl name='__anonymous_struct__1' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/drm/drm_device.h' line='205' column='1' id='76c13bb3'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='context' type-id='95e97e5e' visibility='default' filepath='include/drm/drm_device.h' line='206' column='1'/>
         </data-member>
@@ -54478,7 +54490,7 @@
           <var-decl name='skip_vt_switch' type-id='b50a4934' visibility='default' filepath='include/linux/fb.h' line='530' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__1' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/drm/drm_connector.h' line='399' column='1' id='34ac2cf8'>
+      <class-decl name='__anonymous_struct__2' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/drm/drm_connector.h' line='399' column='1' id='34ac2cf8'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='left' type-id='f0981eeb' visibility='default' filepath='include/drm/drm_connector.h' line='400' column='1'/>
         </data-member>
@@ -58165,7 +58177,7 @@
         <enumerator name='NOT_SUPPORTED' value='0'/>
         <enumerator name='SUPPORTED' value='1'/>
       </enum-decl>
-      <class-decl name='__anonymous_struct__' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/drm/drm_device.h' line='205' column='1' id='76c13bb3'>
+      <class-decl name='__anonymous_struct__1' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/drm/drm_device.h' line='205' column='1' id='76c13bb3'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='context' type-id='95e97e5e' visibility='default' filepath='include/drm/drm_device.h' line='206' column='1'/>
         </data-member>
@@ -59778,7 +59790,7 @@
         <enumerator name='DRM_MODE_SUBCONNECTOR_Component' value='8'/>
         <enumerator name='DRM_MODE_SUBCONNECTOR_SCART' value='9'/>
       </enum-decl>
-      <class-decl name='__anonymous_struct__1' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/drm/drm_connector.h' line='399' column='1' id='34ac2cf8'>
+      <class-decl name='__anonymous_struct__2' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/drm/drm_connector.h' line='399' column='1' id='34ac2cf8'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='left' type-id='f0981eeb' visibility='default' filepath='include/drm/drm_connector.h' line='400' column='1'/>
         </data-member>
@@ -62625,6 +62637,17 @@
       <array-type-def dimensions='1' type-id='2a455b43' size-in-bits='7360' id='6fd035e6'>
         <subrange length='23' type-id='7ff19f0f' id='fdd0f594'/>
       </array-type-def>
+      <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='be592189'>
+        <data-member access='public'>
+          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='__UNIQUE_ID_android_kabi_hide34' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
+        </data-member>
+      </union-decl>
       <class-decl name='drm_lock_data' size-in-bits='512' is-struct='yes' visibility='default' filepath='include/drm/drm_auth.h' line='37' column='1' id='7e19749d'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='hw_lock' type-id='19248fba' visibility='default' filepath='include/drm/drm_auth.h' line='38' column='1'/>
@@ -67913,17 +67936,6 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/input/evdev.c' language='LANG_C89'>
-      <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='be592189'>
-        <data-member access='public'>
-          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide34' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-      </union-decl>
       <function-decl name='cdev_init' mangled-name='cdev_init' filepath='include/linux/cdev.h' line='23' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cdev_init'>
         <parameter type-id='3e6eb939'/>
         <parameter type-id='61758ee5'/>
@@ -73085,7 +73097,7 @@
       <array-type-def dimensions='1' type-id='fa0b179b' size-in-bits='512' id='f6e5abef'>
         <subrange length='8' type-id='7ff19f0f' id='56e0c0b1'/>
       </array-type-def>
-      <union-decl name='__anonymous_union__6' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/videobuf2-core.h' line='179' column='1' id='07aa0de4'>
+      <union-decl name='__anonymous_union__9' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/videobuf2-core.h' line='179' column='1' id='07aa0de4'>
         <data-member access='public'>
           <var-decl name='offset' type-id='f0981eeb' visibility='default' filepath='include/media/videobuf2-core.h' line='180' column='1'/>
         </data-member>
@@ -74561,7 +74573,7 @@
           <var-decl name='p' type-id='eaa32e2f' visibility='default' filepath='include/media/v4l2-ctrls.h' line='52' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__5' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='227' column='1' id='87415f3a'>
+      <union-decl name='__anonymous_union__8' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='227' column='1' id='87415f3a'>
         <data-member access='public'>
           <var-decl name='qmenu' type-id='13956559' visibility='default' filepath='include/media/v4l2-ctrls.h' line='228' column='1'/>
         </data-member>
@@ -74569,7 +74581,7 @@
           <var-decl name='qmenu_int' type-id='43ae54cf' visibility='default' filepath='include/media/v4l2-ctrls.h' line='229' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__4' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='223' column='1' id='b91b9370'>
+      <union-decl name='__anonymous_union__7' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='223' column='1' id='b91b9370'>
         <data-member access='public'>
           <var-decl name='step' type-id='91ce1af9' visibility='default' filepath='include/media/v4l2-ctrls.h' line='224' column='1'/>
         </data-member>
@@ -78661,7 +78673,7 @@
         <parameter type-id='6ec0fd31'/>
         <return type-id='48b5725f'/>
       </function-type>
-      <union-decl name='__anonymous_union__8' size-in-bits='512' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2249' column='1' id='454ee2bf'>
+      <union-decl name='__anonymous_union__10' size-in-bits='512' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2249' column='1' id='454ee2bf'>
         <data-member access='public'>
           <var-decl name='vsync' type-id='cbe6daf0' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2250' column='1'/>
         </data-member>
@@ -78737,7 +78749,7 @@
           <var-decl name='field' type-id='8f048e17' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2200' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__9' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2211' column='1' id='de5442d3'>
+      <union-decl name='__anonymous_union__11' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2211' column='1' id='de5442d3'>
         <data-member access='public'>
           <var-decl name='value' type-id='3158a266' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2212' column='1'/>
         </data-member>
@@ -79029,7 +79041,7 @@
         <enumerator name='V4L2_CTRL_TYPE_U16' value='257'/>
         <enumerator name='V4L2_CTRL_TYPE_U32' value='258'/>
       </enum-decl>
-      <union-decl name='__anonymous_union__4' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='223' column='1' id='b91b9370'>
+      <union-decl name='__anonymous_union__7' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='223' column='1' id='b91b9370'>
         <data-member access='public'>
           <var-decl name='step' type-id='91ce1af9' visibility='default' filepath='include/media/v4l2-ctrls.h' line='224' column='1'/>
         </data-member>
@@ -79037,7 +79049,7 @@
           <var-decl name='menu_skip_mask' type-id='91ce1af9' visibility='default' filepath='include/media/v4l2-ctrls.h' line='225' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__5' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='227' column='1' id='87415f3a'>
+      <union-decl name='__anonymous_union__8' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/v4l2-ctrls.h' line='227' column='1' id='87415f3a'>
         <data-member access='public'>
           <var-decl name='qmenu' type-id='13956559' visibility='default' filepath='include/media/v4l2-ctrls.h' line='228' column='1'/>
         </data-member>
@@ -79152,7 +79164,7 @@
           <var-decl name='data_offset' type-id='f0981eeb' visibility='default' filepath='include/media/videobuf2-core.h' line='184' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__6' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/videobuf2-core.h' line='179' column='1' id='07aa0de4'>
+      <union-decl name='__anonymous_union__9' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/media/videobuf2-core.h' line='179' column='1' id='07aa0de4'>
         <data-member access='public'>
           <var-decl name='offset' type-id='f0981eeb' visibility='default' filepath='include/media/videobuf2-core.h' line='180' column='1'/>
         </data-member>
@@ -79264,7 +79276,7 @@
           <var-decl name='reserved' type-id='7f84eb57' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2261' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__8' size-in-bits='512' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2249' column='1' id='454ee2bf'>
+      <union-decl name='__anonymous_union__10' size-in-bits='512' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2249' column='1' id='454ee2bf'>
         <data-member access='public'>
           <var-decl name='vsync' type-id='cbe6daf0' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2250' column='1'/>
         </data-member>
@@ -79315,7 +79327,7 @@
           <var-decl name='default_value' type-id='3158a266' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2219' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__9' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2211' column='1' id='de5442d3'>
+      <union-decl name='__anonymous_union__11' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2211' column='1' id='de5442d3'>
         <data-member access='public'>
           <var-decl name='value' type-id='3158a266' visibility='default' filepath='include/uapi/linux/videodev2.h' line='2212' column='1'/>
         </data-member>
@@ -87549,7 +87561,7 @@
         <enumerator name='PIN_MAP_TYPE_CONFIGS_PIN' value='3'/>
         <enumerator name='PIN_MAP_TYPE_CONFIGS_GROUP' value='4'/>
       </enum-decl>
-      <union-decl name='__anonymous_union__' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/pinctrl/machine.h' line='73' column='1' id='2789d524'>
+      <union-decl name='__anonymous_union__1' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/pinctrl/machine.h' line='73' column='1' id='2789d524'>
         <data-member access='public'>
           <var-decl name='mux' type-id='ad4dd73d' visibility='default' filepath='include/linux/pinctrl/machine.h' line='74' column='1'/>
         </data-member>
@@ -107317,6 +107329,12 @@
         <parameter type-id='cd733e18' name='ptr' filepath='fs/sysfs/file.c' line='499' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
+      <function-decl name='sysfs_emit' mangled-name='sysfs_emit' filepath='fs/sysfs/file.c' line='572' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='sysfs_emit'>
+        <parameter type-id='26a90f95' name='buf' filepath='fs/sysfs/file.c' line='572' column='1'/>
+        <parameter type-id='80f4b756' name='fmt' filepath='fs/sysfs/file.c' line='572' column='1'/>
+        <parameter is-variadic='yes'/>
+        <return type-id='95e97e5e'/>
+      </function-decl>
       <pointer-type-def type-id='be65923c' size-in-bits='64' id='cfe4f8a2'/>
       <qualified-type-def type-id='a6222917' const='yes' id='be65923c'/>
     </abi-instr>
@@ -125870,7 +125888,7 @@
           <var-decl name='' type-id='26b3aff0' visibility='default' filepath='include/linux/slab.h' line='641' column='1'/>
         </data-member>
       </union-decl>
-      <class-decl name='__anonymous_struct__2' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/slab.h' line='635' column='1' id='22e2627b'>
+      <class-decl name='__anonymous_struct__3' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/slab.h' line='635' column='1' id='22e2627b'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='memcg_caches' type-id='2c8ce02f' visibility='default' filepath='include/linux/slab.h' line='636' column='1'/>
         </data-member>
@@ -125892,7 +125910,7 @@
           <var-decl name='entries' type-id='c66d33bc' visibility='default' filepath='include/linux/slab.h' line='596' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__3' size-in-bits='768' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/slab.h' line='641' column='1' id='26b3aff0'>
+      <class-decl name='__anonymous_struct__4' size-in-bits='768' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/slab.h' line='641' column='1' id='26b3aff0'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='memcg' type-id='223696fb' visibility='default' filepath='include/linux/slab.h' line='642' column='1'/>
         </data-member>
@@ -127737,7 +127755,7 @@
           <var-decl name='' type-id='ba169a6c' visibility='default' filepath='include/net/inet_hashtables.h' line='118' column='1'/>
         </data-member>
       </class-decl>
-      <union-decl name='__anonymous_union__13' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/inet_hashtables.h' line='118' column='1' id='ba169a6c'>
+      <union-decl name='__anonymous_union__14' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/inet_hashtables.h' line='118' column='1' id='ba169a6c'>
         <data-member access='public'>
           <var-decl name='head' type-id='e151255a' visibility='default' filepath='include/net/inet_hashtables.h' line='119' column='1'/>
         </data-member>
diff --git a/android/abi_gki_aarch64_qcom b/android/abi_gki_aarch64_qcom
index d832a05c4ef8..0840d0ac67e4 100644
--- a/android/abi_gki_aarch64_qcom
+++ b/android/abi_gki_aarch64_qcom
@@ -1445,6 +1445,7 @@
   simple_statfs
   strndup_user
   sync_filesystem
+  sysfs_emit
   touch_atime
   truncate_inode_pages
   unlock_new_inode

commit 94be4db84181ab1a2e444002b87b385158ec9786
Author: Wyon Bi <bivvy.bi@rock-chips.com>
Date:   Tue May 18 11:49:32 2021 +0800

    drm/bridge: analogix_dp: Add optional LCD panel self test
    
    Many TCON devices include an embedded LCD panel self-test mode.
    This mode is designed to help system integrators identify
    the root cause of abnormal display operation, without the use of
    complicated debug tools.
    
    Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>
    Change-Id: I19770c7488d43e2486c5fde5cc0a5b345e5be0eb

diff --git a/Documentation/devicetree/bindings/display/bridge/analogix_dp.txt b/Documentation/devicetree/bindings/display/bridge/analogix_dp.txt
index abe867456ce6..8c0ecf4141d0 100644
--- a/Documentation/devicetree/bindings/display/bridge/analogix_dp.txt
+++ b/Documentation/devicetree/bindings/display/bridge/analogix_dp.txt
@@ -31,6 +31,8 @@ Optional properties for dp-controller:
 	-hpd-gpios:
 		Hotplug detect GPIO.
 		Indicates which GPIO should be used for hotplug detection
+	-panel-self-test:
+		Enable optional LCD Panel Self Test.
 	-port@[X]: SoC specific port nodes with endpoint definitions as defined
 		in Documentation/devicetree/bindings/media/video-interfaces.txt,
 		please refer to the SoC specific binding document:
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index 0e8e993068fb..c126b60246c0 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -984,11 +984,9 @@ static int analogix_dp_commit(struct analogix_dp_device *dp)
 	struct video_info *video = &dp->video_info;
 	int ret;
 
-	/* Keep the panel disabled while we configure video */
-	if (dp->plat_data->panel) {
-		if (drm_panel_disable(dp->plat_data->panel))
-			DRM_ERROR("failed to disable the panel\n");
-	}
+	if (device_property_read_bool(dp->dev, "panel-self-test"))
+		return drm_dp_dpcd_writeb(&dp->aux, DP_EDP_CONFIGURATION_SET,
+					  DP_PANEL_SELF_TEST_ENABLE);
 
 	ret = analogix_dp_train_link(dp);
 	if (ret) {
@@ -1021,15 +1019,6 @@ static int analogix_dp_commit(struct analogix_dp_device *dp)
 		return ret;
 	}
 
-	/* Safe to enable the panel now */
-	if (dp->plat_data->panel) {
-		ret = drm_panel_enable(dp->plat_data->panel);
-		if (ret) {
-			DRM_ERROR("failed to enable the panel\n");
-			return ret;
-		}
-	}
-
 	ret = analogix_dp_detect_sink_psr(dp);
 	if (ret)
 		return ret;
@@ -1278,11 +1267,14 @@ static int analogix_dp_set_bridge(struct analogix_dp_device *dp)
 	}
 
 	ret = analogix_dp_commit(dp);
-	if (ret) {
+	if (ret < 0) {
 		DRM_ERROR("dp commit error, ret = %d\n", ret);
 		goto out_dp_init;
 	}
 
+	if (dp->plat_data->panel)
+		drm_panel_enable(dp->plat_data->panel);
+
 	if (dp->plat_data->power_on_end)
 		dp->plat_data->power_on_end(dp->plat_data);
 

commit 4634dc69010bbfdeab57eb9e09aede2f13d3ead8
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Tue May 18 11:44:43 2021 +0800

    arm64: dts: rockchip: rk3566-eink: add more ddr freq and disabled
    default
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: If8e2d053c9d07fb539e53c72f5705cdfe74cf600

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi
index 2abe052bd36b..dac2e9ca1087 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi
@@ -64,8 +64,15 @@
 	opp-528000000 {
 		opp-microvolt = <875000>;
 	};
-	/delete-node/ opp-780000000;
-	/delete-node/ opp-1056000000;
+	opp-780000000 {
+		status = "disabled";
+	};
+	opp-920000000 {
+		status = "disabled";
+	};
+	opp-1056000000 {
+		status = "disabled";
+	};
 };
 
 &ebc {

commit fd53503a0d4144b1512d370b09298e7624937530
Author: Yiqing Zeng <zack.zeng@rock-chips.com>
Date:   Mon May 17 14:17:54 2021 +0800

    media: i2c: support imx178 lvds sensor driver
    
    Signed-off-by: Yiqing Zeng <zack.zeng@rock-chips.com>
    Change-Id: I61372000e615fd3fbdaa506b9a9fd3382c01ee34

diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
index 8bb2890095f3..d3eb9e53e1db 100644
--- a/drivers/media/i2c/Kconfig
+++ b/drivers/media/i2c/Kconfig
@@ -651,6 +651,17 @@ config VIDEO_APTINA_PLL
 config VIDEO_SMIAPP_PLL
 	tristate
 
+config VIDEO_IMX178
+	tristate "Sony IMX178 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
+	  IMX178 camera.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called imx178.
+
 config VIDEO_IMX219
 	tristate "Sony IMX219 sensor support"
 	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index 3640283b979d..38b3e103ceca 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -142,6 +142,7 @@ obj-$(CONFIG_VIDEO_OV2659)	+= ov2659.o
 obj-$(CONFIG_VIDEO_TC358743)	+= tc358743.o
 obj-$(CONFIG_VIDEO_TC35874X)	+= tc35874x.o
 obj-$(CONFIG_VIDEO_RK628_CSI)	+= rk628_csi.o
+obj-$(CONFIG_VIDEO_IMX178)	+= imx178.o
 obj-$(CONFIG_VIDEO_IMX219)	+= imx219.o
 obj-$(CONFIG_VIDEO_IMX258)	+= imx258.o
 obj-$(CONFIG_VIDEO_IMX258_EEPROM)	+= imx258_eeprom.o
diff --git a/drivers/media/i2c/imx178.c b/drivers/media/i2c/imx178.c
new file mode 100644
index 000000000000..51ceb539eba2
--- /dev/null
+++ b/drivers/media/i2c/imx178.c
@@ -0,0 +1,1161 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * imx178 sensor driver
+ *
+ * Copyright (C) 2020 Rockchip Electronics Co., Ltd.
+ *
+ * V0.0X01.0X00 first version.
+ */
+
+#define DEBUG
+#include <linux/clk.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/of_graph.h>
+#include <linux/regmap.h>
+#include <linux/pinctrl/consumer.h>
+#include <linux/regulator/consumer.h>
+#include <linux/version.h>
+#include <linux/rk-camera-module.h>
+#include <linux/rk-preisp.h>
+#include <media/v4l2-async.h>
+#include <media/media-entity.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-fwnode.h>
+#include <media/v4l2-subdev.h>
+
+#define DRIVER_VERSION		KERNEL_VERSION(0, 0x01, 0x00)
+
+#define OF_CAMERA_PINCTRL_STATE_DEFAULT	"rockchip,camera_default"
+#define OF_CAMERA_PINCTRL_STATE_SLEEP	"rockchip,camera_sleep"
+
+#define IMX178_NAME				"imx178"
+#define IMX178_MEDIA_BUS_FMT	MEDIA_BUS_FMT_SRGGB10_1X10
+#define MIPI_FREQ				594000000 // w*h*fps*bits_per_pixel/lanes/2
+#define IMX178_XVCLK_FREQ		19500000
+#define BITS_PER_SAMPLE			10
+
+#define IMX178_REG_CHIP_ID		0x33be
+#define IMX178_CHIP_ID			0xb10a
+
+#define IMX178_REG_SHS_H		0x3036
+#define IMX178_REG_SHS_M		0x3035
+#define IMX178_REG_SHS_L		0x3034
+
+#define IMX178_GAIN_MIN			0x00
+#define IMX178_GAIN_MAX			0x1e0
+
+#define IMX178_GAIN_REG_H		0x3020
+#define IMX178_GAIN_REG_L		0x301f
+
+#define IMX178_REG_MIRROR_FLIP	0x300f
+#define IMX178_FETCH_MIRROR(VAL, ENABLE)	(ENABLE ? VAL | 0x02 : VAL & 0xfd)
+#define IMX178_FETCH_FLIP(VAL, ENABLE)		(ENABLE ? VAL | 0x01 : VAL & 0xfe)
+
+#define IMX178_REG_CTRL_MODE	0x3000
+#define IMX178_REG_START_MODE	0x3008
+#define IMX178_MODE_SW_STANDBY	0x0
+#define IMX178_MODE_STREAMING	1
+
+#define IMX178_REG_HOLD			0x3007
+
+#define IMX178_REG_VMAX_H	0x302e  //vmax
+#define IMX178_REG_VMAX_M   0x302d
+#define IMX178_REG_VMAX_L	0x302c
+
+#define IMX178_VTS_MAX		0x3FFF
+#define IMX178_HTS_MAX		0xFFF
+
+#define IMX178_EXPOSURE_NORMAL_MAX  0x118A
+#define IMX178_EXPOSURE_NORMAL_MIN  3
+#define IMX178_EXPOSURE_NORMAL_STEP 1
+
+#define IMX178_GAIN_STEP	1
+#define IMX178_GAIN_DEFAULT	0x40
+
+#define IMX178_LANES		4
+
+static const char * const imx178_supply_names[] = {
+	"dovdd",    /* Digital I/O power */
+	"avdd",     /* Analog power */
+	"dvdd",     /* Digital power */
+};
+
+#define IMX178_NUM_SUPPLIES ARRAY_SIZE(imx178_supply_names)
+
+#define to_imx178(sd) container_of(sd, struct imx178, subdev)
+
+enum {
+	PAD0,
+	PAD1,
+	PAD2,
+	PAD3,
+	PAD_MAX,
+};
+
+enum {
+	LINK_FREQ_INDEX,
+};
+
+struct imx178_mode {
+	u32 width;
+	u32 height;
+	struct v4l2_fract max_fps;
+	u32 hts_def;
+	u32 vts_def;
+	u32 exp_def;
+	u32 link_freq_index;
+	const struct reg_sequence *reg_list;
+	u32 reg_num;
+	u32 hdr_mode;
+	struct rkmodule_lvds_cfg lvds_cfg;
+};
+
+struct imx178 {
+	struct device	*dev;
+	struct clk	*xvclk;
+	struct regmap	*regmap;
+	struct gpio_desc *reset_gpio;
+	struct gpio_desc *pwdn_gpio;
+	struct regulator_bulk_data supplies[IMX178_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    *hblank;
+	struct v4l2_ctrl    *vblank;
+	struct v4l2_ctrl    *h_flip;
+	struct v4l2_ctrl    *v_flip;
+	struct v4l2_ctrl    *link_freq;
+	struct v4l2_ctrl    *pixel_rate;
+	struct mutex        lock;
+	bool		    streaming;
+	bool		    power_on;
+	unsigned int        cfg_num;
+	const struct imx178_mode *cur_mode;
+	u32		module_index;
+	const char      *module_facing;
+	const char      *module_name;
+	const char      *len_name;
+	bool			  has_init_exp;
+	u32		cur_vts;
+};
+
+static const struct regmap_config imx178_regmap_config = {
+	.reg_bits = 16,
+	.val_bits = 8,
+	.max_register = 0x6f00,
+};
+
+static const s64 link_freq_menu_items[] = {
+	MIPI_FREQ,
+};
+
+/*
+ * window size=3840*2160 mipi@4lane
+ * mclk=27M mipi_clk=708.75Mbps
+ * pixel_line_total=xxxx line_frame_total=2256
+ * row_time=29.62us frame_rate=30fps
+ */
+static const struct reg_sequence imx178_3072_1728_liner_30fps_settings[] = {
+	{0x3000, 0x07},
+	{0x300E, 0x00},
+	{0x300F, 0x03},
+	{0x3010, 0x00},
+	{0x3066, 0x06},
+	{0x302C, 0xC4},
+	{0x302D, 0x09},
+	{0x302E, 0x00},
+	{0x302F, 0xDE},
+	{0x3030, 0x03},
+	{0x300D, 0x04},
+	{0x3059, 0x30},
+	{0x3004, 0x03},
+	{0x3101, 0x30},
+	{0x310C, 0x00},
+	{0x33BE, 0x21},
+	{0x33BF, 0x21},
+	{0x33C0, 0x2C},
+	{0x33C1, 0x2C},
+	{0x33C2, 0x21},
+	{0x33C3, 0x2C},
+	{0x33C4, 0x2C},
+	{0x33C5, 0x00},
+	{0x311C, 0x34},
+	{0x311D, 0x28},
+	{0x311E, 0xAB},
+	{0x311F, 0x00},
+	{0x3120, 0x95},
+	{0x3121, 0x00},
+	{0x3122, 0xB4},
+	{0x3123, 0x00},
+	{0x3124, 0x8c},
+	{0x3125, 0x02},
+	{0x312D, 0x03},
+	{0x312E, 0x0C},
+	{0x312F, 0x28},
+	{0x3131, 0x2D},
+	{0x3132, 0x00},
+	{0x3133, 0xB4},
+	{0x3134, 0x00},
+	{0x3137, 0x50},
+	{0x3138, 0x08},
+	{0x3139, 0x00},
+	{0x313A, 0x07},
+	{0x313D, 0x05},
+	{0x3140, 0x06},
+	{0x3220, 0x8B},
+	{0x3221, 0x00},
+	{0x3222, 0x74},
+	{0x3223, 0x00},
+	{0x3226, 0xC2},
+	{0x3227, 0x00},
+	{0x32A9, 0x1B},
+	{0x32AA, 0x00},
+	{0x32B3, 0x0E},
+	{0x32B4, 0x00},
+	{0x33D6, 0x16},
+	{0x33D7, 0x15},
+	{0x33D8, 0x14},
+	{0x33D9, 0x10},
+	{0x33DA, 0x08},
+	{0x3011, 0x00},
+	{0x301B, 0x00},
+	{0x3037, 0x08},
+	{0x3038, 0x00},
+	{0x3039, 0x00},
+	{0x30AD, 0x49},
+	{0x30AF, 0x54},
+	{0x30B0, 0x33},
+	{0x30B3, 0x0A},
+	{0x30C4, 0x30},
+	{0x3103, 0x03},
+	{0x3104, 0x08},
+	{0x3107, 0x10},
+	{0x310F, 0x01},
+	{0x32E5, 0x06},
+	{0x32E6, 0x00},
+	{0x32E7, 0x1F},
+	{0x32E8, 0x00},
+	{0x32E9, 0x00},
+	{0x32EA, 0x00},
+	{0x32EB, 0x00},
+	{0x32EC, 0x00},
+	{0x32EE, 0x00},
+	{0x32F2, 0x02},
+	{0x32F4, 0x00},
+	{0x32F5, 0x00},
+	{0x32F6, 0x00},
+	{0x32F7, 0x00},
+	{0x32F8, 0x00},
+	{0x32FC, 0x02},
+	{0x3310, 0x11},
+	{0x3338, 0x81},
+	{0x333D, 0x00},
+	{0x3362, 0x00},
+	{0x336B, 0x02},
+	{0x336E, 0x11},
+	{0x33B4, 0xFE},
+	{0x33B5, 0x06},
+	{0x33B9, 0x00},
+	{0x3034, 0x08},
+	{0x3035, 0x00},
+	{0x301F, 0xA0},
+	{0x3020, 0x00},
+	{0x305E, 0x0A},
+	{0x3015, 0x32},
+};
+
+static const struct imx178_mode supported_modes[] = {
+	{
+		.width = 3096,
+		.height = 1774,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x6ee - 0x8,
+		.hts_def = 0xc18,
+		.vts_def = 0x6ee,
+		.link_freq_index = LINK_FREQ_INDEX,
+		.reg_list = imx178_3072_1728_liner_30fps_settings,
+		.reg_num = ARRAY_SIZE(imx178_3072_1728_liner_30fps_settings),
+		.hdr_mode = NO_HDR,
+		.lvds_cfg = {
+			.mode = LS_FIRST,
+			.frm_sync_code[LVDS_CODE_GRP_LINEAR] = {
+					.odd_sync_code = {
+						.act = {
+							.sav = 0x200,
+							.eav = 0x274,
+						},
+						.blk = {
+							.sav = 0x2ac,
+							.eav = 0x2d8,
+						},
+					},
+				},
+			},
+	}
+};
+
+/* pixel rate = link frequency * 2 * lanes / BITS_PER_SAMPLE */
+static u64 to_pixel_rate(u32 index)
+{
+	u64 pixel_rate = link_freq_menu_items[index] * 2 * IMX178_LANES / BITS_PER_SAMPLE;
+
+	do_div(pixel_rate, 10);
+	return pixel_rate;
+}
+
+static inline int imx178_read_reg(struct imx178 *imx178, u16 addr, u8 *value)
+{
+	unsigned int val;
+	int ret;
+
+	ret = regmap_read(imx178->regmap, addr, &val);
+	if (ret) {
+		dev_err(imx178->dev, "i2c read failed at addr: %x\n", addr);
+		return ret;
+	}
+	*value = val & 0xff;
+	return 0;
+}
+
+static inline int imx178_write_reg(struct imx178 *imx178, u16 addr, u8 value)
+{
+	int ret;
+
+	ret = regmap_write(imx178->regmap, addr, value);
+	if (ret) {
+		dev_err(imx178->dev, "i2c write failed at addr: %x\n", addr);
+		return ret;
+	}
+	return ret;
+}
+
+static int imx178_set_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct imx178 *imx178 = container_of(ctrl->handler,
+							struct imx178, ctrl_handler);
+	const struct imx178_mode *mode = imx178->cur_mode;
+	s64 max;
+	int ret = 0;
+	u8 val = 0;
+	u32 vts = 0;
+	u32 shr0 = 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 = mode->height + ctrl->val - 4;
+		__v4l2_ctrl_modify_range(imx178->exposure,
+					 imx178->exposure->minimum, max,
+					 imx178->exposure->step,
+					 imx178->exposure->default_value);
+		break;
+	}
+
+	if (!pm_runtime_get_if_in_use(imx178->dev))
+		return 0;
+
+	switch (ctrl->id) {
+	case V4L2_CID_EXPOSURE:
+		shr0 = imx178->cur_vts - ctrl->val;
+		ret  = imx178_write_reg(imx178, IMX178_REG_HOLD, 0x01);
+		ret |= imx178_write_reg(imx178, IMX178_REG_SHS_H,
+			(shr0 >> 16) & 0x1);
+		ret |= imx178_write_reg(imx178, IMX178_REG_SHS_M,
+			(shr0 >> 8) & 0xff);
+		ret |= imx178_write_reg(imx178, IMX178_REG_SHS_L,
+			(shr0 & 0xff));
+		ret |= imx178_write_reg(imx178, IMX178_REG_HOLD, 0x00);
+		break;
+	case V4L2_CID_ANALOGUE_GAIN:
+		ret  = imx178_write_reg(imx178, IMX178_REG_HOLD, 0x01);
+		ret |= imx178_write_reg(imx178, IMX178_GAIN_REG_H,
+			(ctrl->val >> 8) & 0x01);
+		ret |= imx178_write_reg(imx178, IMX178_GAIN_REG_L,
+			ctrl->val & 0xff);
+		ret |= imx178_write_reg(imx178, IMX178_REG_HOLD, 0x00);
+		break;
+	case V4L2_CID_VBLANK:
+		vts = ctrl->val + mode->height;
+		ret = imx178_write_reg(imx178, IMX178_REG_VMAX_H,
+			vts >> 16);
+		ret |= imx178_write_reg(imx178, IMX178_REG_VMAX_M,
+			vts >> 8);
+		ret |= imx178_write_reg(imx178, IMX178_REG_VMAX_L,
+			vts & 0xff);
+		break;
+	case V4L2_CID_HFLIP:
+		ret = imx178_read_reg(imx178, IMX178_REG_MIRROR_FLIP, &val);
+		ret |= imx178_write_reg(imx178, IMX178_REG_MIRROR_FLIP,
+			IMX178_FETCH_MIRROR(val, ctrl->val));
+		break;
+	case V4L2_CID_VFLIP:
+		ret = imx178_read_reg(imx178, IMX178_REG_MIRROR_FLIP, &val);
+		ret |= imx178_write_reg(imx178, IMX178_REG_MIRROR_FLIP,
+			IMX178_FETCH_FLIP(val, ctrl->val));
+		break;
+	default:
+		dev_warn(imx178->dev, "%s Unhandled id:0x%x, val:0x%x\n",
+			 __func__, ctrl->id, ctrl->val);
+		break;
+	}
+	pm_runtime_put(imx178->dev);
+
+	return ret;
+}
+
+static const struct v4l2_ctrl_ops imx178_ctrl_ops = {
+	.s_ctrl = imx178_set_ctrl,
+};
+
+static int imx178_get_regulators(struct imx178 *imx178)
+{
+	unsigned int i;
+
+	for (i = 0; i < IMX178_NUM_SUPPLIES; i++)
+		imx178->supplies[i].supply = imx178_supply_names[i];
+
+	return devm_regulator_bulk_get(imx178->dev, IMX178_NUM_SUPPLIES, imx178->supplies);
+}
+
+static int imx178_initialize_controls(struct imx178 *imx178)
+{
+	const struct imx178_mode *mode;
+	struct v4l2_ctrl_handler *handler;
+	s64 exposure_max, vblank_def;
+	u32 h_blank;
+	int ret;
+
+	handler = &imx178->ctrl_handler;
+	mode = imx178->cur_mode;
+
+	ret = v4l2_ctrl_handler_init(handler, 8);
+	if (ret)
+		return ret;
+
+	handler->lock = &imx178->lock;
+	imx178->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, V4L2_CID_LINK_FREQ,
+						  ARRAY_SIZE(link_freq_menu_items) - 1, 0,
+						  link_freq_menu_items);
+	imx178->pixel_rate = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE,
+					      0, to_pixel_rate(LINK_FREQ_INDEX),
+					      1, to_pixel_rate(LINK_FREQ_INDEX));
+	h_blank = mode->hts_def - mode->width;
+	imx178->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
+					  h_blank, h_blank, 1, h_blank);
+	if (imx178->hblank)
+		imx178->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+	vblank_def = mode->vts_def - mode->height;
+	imx178->vblank = v4l2_ctrl_new_std(handler, &imx178_ctrl_ops,
+					  V4L2_CID_VBLANK, vblank_def,
+					  IMX178_VTS_MAX - mode->height,
+					  1, vblank_def);
+	imx178->cur_vts = mode->vts_def;
+	exposure_max =  mode->vts_def - 1;
+	imx178->exposure = v4l2_ctrl_new_std(handler, &imx178_ctrl_ops,
+					    V4L2_CID_EXPOSURE, IMX178_EXPOSURE_NORMAL_MIN,
+					    exposure_max, IMX178_EXPOSURE_NORMAL_STEP,
+					    mode->exp_def);
+	imx178->anal_gain = v4l2_ctrl_new_std(handler, &imx178_ctrl_ops,
+					     V4L2_CID_ANALOGUE_GAIN, IMX178_GAIN_MIN,
+					     IMX178_GAIN_MAX, IMX178_GAIN_STEP,
+					     IMX178_GAIN_DEFAULT);
+	imx178->h_flip = v4l2_ctrl_new_std(handler, &imx178_ctrl_ops,
+					  V4L2_CID_HFLIP, 0, 1, 1, 0);
+	imx178->v_flip = v4l2_ctrl_new_std(handler, &imx178_ctrl_ops,
+					  V4L2_CID_VFLIP, 0, 1, 1, 0);
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(imx178->dev, "Failed to init controls(%d)\n", ret);
+		goto err_free_handler;
+	}
+	imx178->subdev.ctrl_handler = handler;
+	imx178->has_init_exp = false;
+	return 0;
+err_free_handler:
+	v4l2_ctrl_handler_free(handler);
+	return ret;
+}
+
+static int __imx178_power_on(struct imx178 *imx178)
+{
+	int ret;
+	struct device *dev = imx178->dev;
+
+	if (!IS_ERR_OR_NULL(imx178->pins_default)) {
+		ret = pinctrl_select_state(imx178->pinctrl, imx178->pins_default);
+		if (ret < 0)
+			dev_err(dev, "could not set pins\n");
+	}
+	ret = clk_set_rate(imx178->xvclk, IMX178_XVCLK_FREQ);
+	if (ret < 0)
+		dev_warn(dev, "Failed to set xvclk rate\n");
+	if (clk_get_rate(imx178->xvclk) != IMX178_XVCLK_FREQ)
+		dev_warn(dev, "xvclk mismatched, modes are based on 27MHz\n");
+	ret = clk_prepare_enable(imx178->xvclk);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable xvclk\n");
+		return ret;
+	}
+	ret = regulator_bulk_enable(IMX178_NUM_SUPPLIES, imx178->supplies);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable regulators\n");
+		goto disable_clk;
+	}
+	if (!IS_ERR(imx178->reset_gpio))
+		gpiod_set_value_cansleep(imx178->reset_gpio, 1);
+	usleep_range(1000, 2000);
+	if (!IS_ERR(imx178->pwdn_gpio))
+		gpiod_set_value_cansleep(imx178->pwdn_gpio, 1);
+	if (!IS_ERR(imx178->reset_gpio))
+		gpiod_set_value_cansleep(imx178->reset_gpio, 0);
+	usleep_range(10000, 20000);
+	return 0;
+
+disable_clk:
+	clk_disable_unprepare(imx178->xvclk);
+
+	if (!IS_ERR_OR_NULL(imx178->pins_sleep))
+		pinctrl_select_state(imx178->pinctrl, imx178->pins_sleep);
+
+	return ret;
+}
+
+static void __imx178_power_off(struct imx178 *imx178)
+{
+	int ret;
+	struct device *dev = imx178->dev;
+
+	if (!IS_ERR_OR_NULL(imx178->pins_sleep)) {
+		ret = pinctrl_select_state(imx178->pinctrl,
+					   imx178->pins_sleep);
+		if (ret < 0)
+			dev_dbg(dev, "could not set pins\n");
+	}
+	if (!IS_ERR(imx178->reset_gpio))
+		gpiod_set_value_cansleep(imx178->reset_gpio, 1);
+	if (!IS_ERR(imx178->pwdn_gpio))
+		gpiod_set_value_cansleep(imx178->pwdn_gpio, 0);
+	regulator_bulk_disable(IMX178_NUM_SUPPLIES, imx178->supplies);
+	clk_disable_unprepare(imx178->xvclk);
+}
+
+static int imx178_check_sensor_id(struct imx178 *imx178)
+{
+	u8 id_h = 0;
+	int ret = 0;
+
+	ret = imx178_read_reg(imx178, IMX178_REG_CHIP_ID, &id_h);
+	if (ret) {
+		dev_err(imx178->dev, "Failed to read sensor id, (%d)\n", ret);
+		return ret;
+	}
+	dev_info(imx178->dev, "Detected imx178 sensor\n");
+
+	return 0;
+}
+
+static void imx178_get_module_inf(struct imx178 *imx178,
+				  struct rkmodule_inf *inf)
+{
+	memset(inf, 0, sizeof(*inf));
+	strscpy(inf->base.lens, imx178->len_name, sizeof(inf->base.lens));
+	strscpy(inf->base.sensor, IMX178_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, imx178->module_name, sizeof(inf->base.module));
+}
+
+static long imx178_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	struct imx178 *imx178 = to_imx178(sd);
+	struct rkmodule_hdr_cfg *hdr_cfg;
+	struct rkmodule_lvds_cfg *lvds_cfg;
+	long ret = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_HDR_CFG:
+		hdr_cfg = (struct rkmodule_hdr_cfg *)arg;
+		hdr_cfg->esp.mode = HDR_NORMAL_VC;
+		hdr_cfg->hdr_mode = imx178->cur_mode->hdr_mode;
+		break;
+	case RKMODULE_GET_MODULE_INFO:
+		imx178_get_module_inf(imx178, (struct rkmodule_inf *)arg);
+		break;
+	case RKMODULE_GET_LVDS_CFG:
+		lvds_cfg = (struct rkmodule_lvds_cfg *)arg;
+		memcpy(lvds_cfg, &imx178->cur_mode->lvds_cfg, sizeof(struct rkmodule_lvds_cfg));
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+	return ret;
+}
+
+static int __imx178_start_stream(struct imx178 *imx178)
+{
+	int ret;
+	u8 mode = 1;
+
+	ret = regmap_multi_reg_write(imx178->regmap,
+				     imx178->cur_mode->reg_list,
+				     imx178->cur_mode->reg_num);
+	if (ret)
+		return ret;
+	__v4l2_ctrl_handler_setup(&imx178->ctrl_handler);
+
+	imx178_read_reg(imx178, IMX178_REG_CTRL_MODE, &mode);
+
+	usleep_range(1000, 2000);
+	imx178_write_reg(imx178, IMX178_REG_CTRL_MODE, IMX178_MODE_SW_STANDBY);
+
+	imx178_read_reg(imx178, IMX178_REG_CTRL_MODE, &mode);
+
+	usleep_range(1000, 2000);
+	imx178_write_reg(imx178, IMX178_REG_START_MODE, 0x0);
+
+	return 0;
+}
+
+static int __imx178_stop_stream(struct imx178 *imx178)
+{
+	imx178->has_init_exp = false;
+	return imx178_write_reg(imx178, IMX178_REG_CTRL_MODE, 0x7);
+}
+
+#ifdef CONFIG_COMPAT
+static long imx178_compat_ioctl32(struct v4l2_subdev *sd,
+				  unsigned int cmd, unsigned long arg)
+{
+	void __user *up = compat_ptr(arg);
+	struct rkmodule_inf *inf;
+	struct rkmodule_hdr_cfg *hdr;
+	struct rkmodule_lvds_cfg *lvds_cfg;
+	long ret = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		inf = kzalloc(sizeof(*inf), GFP_KERNEL);
+		if (!inf) {
+			ret = -ENOMEM;
+			return ret;
+		}
+		ret = imx178_ioctl(sd, cmd, inf);
+		if (!ret)
+			ret = copy_to_user(up, inf, sizeof(*inf));
+		kfree(inf);
+		break;
+	case RKMODULE_GET_HDR_CFG:
+		hdr = kzalloc(sizeof(*hdr), GFP_KERNEL);
+		if (!hdr) {
+			ret = -ENOMEM;
+			return ret;
+		}
+		ret = imx178_ioctl(sd, cmd, hdr);
+		if (!ret)
+			ret = copy_to_user(up, hdr, sizeof(*hdr));
+		kfree(hdr);
+		break;
+	case RKMODULE_GET_LVDS_CFG:
+		lvds_cfg = kzalloc(sizeof(*lvds_cfg), GFP_KERNEL);
+		if (!lvds_cfg) {
+			ret = -ENOMEM;
+			return ret;
+		}
+		ret = imx178_ioctl(sd, cmd, lvds_cfg);
+		if (!ret)
+			ret = copy_to_user(up, lvds_cfg, sizeof(*lvds_cfg));
+		kfree(lvds_cfg);
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+	return ret;
+}
+#endif
+
+static int imx178_s_stream(struct v4l2_subdev *sd, int on)
+{
+	struct imx178 *imx178 = to_imx178(sd);
+	int ret = 0;
+
+	mutex_lock(&imx178->lock);
+	on = !!on;
+	if (on == imx178->streaming)
+		goto unlock_and_return;
+	if (on) {
+		ret = pm_runtime_get_sync(imx178->dev);
+		if (ret < 0) {
+			pm_runtime_put_noidle(imx178->dev);
+			goto unlock_and_return;
+		}
+		ret = __imx178_start_stream(imx178);
+		if (ret) {
+			dev_err(imx178->dev, "Failed to start imx178 stream\n");
+			pm_runtime_put(imx178->dev);
+			goto unlock_and_return;
+		}
+	} else {
+		__imx178_stop_stream(imx178);
+		pm_runtime_put(imx178->dev);
+	}
+	imx178->streaming = on;
+
+unlock_and_return:
+	mutex_unlock(&imx178->lock);
+	return 0;
+}
+
+static int imx178_g_frame_interval(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_frame_interval *fi)
+{
+	struct imx178 *imx178 = to_imx178(sd);
+	const struct imx178_mode *mode = imx178->cur_mode;
+
+	mutex_lock(&imx178->lock);
+	fi->interval = mode->max_fps;
+	mutex_unlock(&imx178->lock);
+	return 0;
+}
+
+static int imx178_g_mbus_config(struct v4l2_subdev *sd,
+				struct v4l2_mbus_config *config)
+{
+	struct imx178 *imx178 = to_imx178(sd);
+
+	u32 val = 1 << (IMX178_LANES - 1) | V4L2_MBUS_CSI2_CHANNEL_0 |
+		  V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
+	config->type = V4L2_MBUS_CCP2;
+	config->flags = (imx178->cur_mode->hdr_mode == NO_HDR) ?
+			val : (val | V4L2_MBUS_CSI2_CHANNEL_1);
+	return 0;
+}
+
+static int imx178_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 = IMX178_MEDIA_BUS_FMT;
+	return 0;
+}
+
+static int imx178_enum_frame_sizes(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_pad_config *cfg,
+				   struct v4l2_subdev_frame_size_enum *fse)
+{
+	struct imx178 *imx178 = to_imx178(sd);
+
+	if (fse->index >= imx178->cfg_num)
+		return -EINVAL;
+	if (fse->code != IMX178_MEDIA_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;
+	return 0;
+}
+
+static int imx178_enum_frame_interval(struct v4l2_subdev *sd,
+						  struct v4l2_subdev_pad_config *cfg,
+						  struct v4l2_subdev_frame_interval_enum *fie)
+{
+	struct imx178 *imx178 = to_imx178(sd);
+
+	if (fie->index >= imx178->cfg_num)
+		return -EINVAL;
+	fie->code = IMX178_MEDIA_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;
+	return 0;
+}
+
+static int imx178_set_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct imx178 *imx178 = to_imx178(sd);
+	const struct imx178_mode *mode;
+	s64 h_blank, vblank_def;
+
+	mutex_lock(&imx178->lock);
+	mode = v4l2_find_nearest_size(supported_modes,
+				      ARRAY_SIZE(supported_modes),
+				      width, height,
+				      fmt->format.width, fmt->format.height);
+	fmt->format.code = IMX178_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(&imx178->lock);
+		return -ENOTTY;
+#endif
+	} else {
+		imx178->cur_mode = mode;
+		__v4l2_ctrl_s_ctrl(imx178->link_freq, mode->link_freq_index);
+		__v4l2_ctrl_s_ctrl_int64(imx178->pixel_rate, to_pixel_rate(mode->link_freq_index));
+		h_blank = mode->hts_def - mode->width;
+		__v4l2_ctrl_modify_range(imx178->hblank, h_blank, h_blank, 1, h_blank);
+		imx178->cur_vts = mode->vts_def;
+		vblank_def = mode->vts_def - mode->height;
+		__v4l2_ctrl_modify_range(imx178->vblank, vblank_def,
+					 IMX178_VTS_MAX - mode->height, 1, vblank_def);
+	}
+	mutex_unlock(&imx178->lock);
+	return 0;
+}
+
+#define CROP_START(SRC, DST) (((SRC) - (DST)) / 2 / 4 * 4)
+#define DST_WIDTH	3072
+#define DST_HEIGHT	1728
+
+static int imx178_get_selection(struct v4l2_subdev *sd,
+				struct v4l2_subdev_pad_config *cfg,
+				struct v4l2_subdev_selection *sel)
+{
+	struct imx178 *imx178 = to_imx178(sd);
+
+	if (sel->target == V4L2_SEL_TGT_CROP_BOUNDS) {
+		sel->r.left = CROP_START(imx178->cur_mode->width, DST_WIDTH);
+		sel->r.width = DST_WIDTH;
+		sel->r.top = 21;
+		sel->r.top = CROP_START(imx178->cur_mode->height, DST_HEIGHT);
+		sel->r.height = DST_HEIGHT;
+		return 0;
+	}
+	return -EINVAL;
+}
+
+static int imx178_get_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct imx178 *imx178 = to_imx178(sd);
+	const struct imx178_mode *mode = imx178->cur_mode;
+
+	mutex_lock(&imx178->lock);
+	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(&imx178->lock);
+		return -ENOTTY;
+#endif
+	} else {
+		fmt->format.width = mode->width;
+		fmt->format.height = mode->height;
+		fmt->format.code = IMX178_MEDIA_BUS_FMT;
+		fmt->format.field = V4L2_FIELD_NONE;
+	}
+	mutex_unlock(&imx178->lock);
+	return 0;
+}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static int imx178_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
+{
+	struct imx178 *imx178 = to_imx178(sd);
+	struct v4l2_mbus_framefmt *try_fmt =
+				v4l2_subdev_get_try_format(sd, fh->pad, 0);
+	const struct imx178_mode *def_mode = &supported_modes[0];
+
+	mutex_lock(&imx178->lock);
+	/* Initialize try_fmt */
+	try_fmt->width = def_mode->width;
+	try_fmt->height = def_mode->height;
+	try_fmt->code = IMX178_MEDIA_BUS_FMT;
+	try_fmt->field = V4L2_FIELD_NONE;
+	mutex_unlock(&imx178->lock);
+	return 0;
+}
+#endif
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static const struct v4l2_subdev_internal_ops imx178_internal_ops = {
+	.open = imx178_open,
+};
+#endif
+
+static int imx178_s_power(struct v4l2_subdev *sd, int on)
+{
+	struct imx178 *imx178 = to_imx178(sd);
+	int ret = 0;
+
+	mutex_lock(&imx178->lock);
+	if (imx178->power_on == !!on)
+		goto unlock_and_return;
+	if (on) {
+		ret = pm_runtime_get_sync(imx178->dev);
+		if (ret < 0) {
+			pm_runtime_put_noidle(imx178->dev);
+			goto unlock_and_return;
+		}
+		imx178->power_on = true;
+	} else {
+		pm_runtime_put(imx178->dev);
+		imx178->power_on = false;
+	}
+unlock_and_return:
+	mutex_unlock(&imx178->lock);
+	return ret;
+}
+
+static const struct v4l2_subdev_core_ops imx178_core_ops = {
+	.s_power = imx178_s_power,
+	.ioctl = imx178_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = imx178_compat_ioctl32,
+#endif
+};
+
+static const struct v4l2_subdev_video_ops imx178_video_ops = {
+	.s_stream = imx178_s_stream,
+	.g_frame_interval = imx178_g_frame_interval,
+	.g_mbus_config = imx178_g_mbus_config,
+};
+
+static const struct v4l2_subdev_pad_ops imx178_pad_ops = {
+	.enum_mbus_code = imx178_enum_mbus_code,
+	.enum_frame_size = imx178_enum_frame_sizes,
+	.enum_frame_interval = imx178_enum_frame_interval,
+	.get_fmt = imx178_get_fmt,
+	.set_fmt = imx178_set_fmt,
+	.get_selection = imx178_get_selection,
+};
+
+static const struct v4l2_subdev_ops imx178_subdev_ops = {
+	.core   = &imx178_core_ops,
+	.video  = &imx178_video_ops,
+	.pad    = &imx178_pad_ops,
+};
+
+static int imx178_runtime_resume(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct imx178 *imx178 = to_imx178(sd);
+
+	__imx178_power_on(imx178);
+	return 0;
+}
+
+static int imx178_runtime_suspend(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct imx178 *imx178 = to_imx178(sd);
+
+	__imx178_power_off(imx178);
+	return 0;
+}
+
+static const struct dev_pm_ops imx178_pm_ops = {
+	SET_RUNTIME_PM_OPS(imx178_runtime_suspend,
+			   imx178_runtime_resume, NULL)
+};
+
+static int imx178_probe(struct i2c_client *client,
+			 const struct i2c_device_id *id)
+{
+	struct device *dev = &client->dev;
+	struct device_node *node = dev->of_node;
+	struct imx178 *imx178;
+	struct v4l2_subdev *sd;
+	char facing[2];
+	int ret;
+
+	dev_info(dev, "driver version: %02x.%02x.%02x",
+		 DRIVER_VERSION >> 16,
+		 (DRIVER_VERSION & 0xff00) >> 8,
+		 DRIVER_VERSION & 0x00ff);
+	imx178 = devm_kzalloc(dev, sizeof(*imx178), GFP_KERNEL);
+	if (!imx178)
+		return -ENOMEM;
+	imx178->dev = dev;
+	imx178->regmap = devm_regmap_init_i2c(client, &imx178_regmap_config);
+	if (IS_ERR(imx178->regmap)) {
+		dev_err(dev, "Failed to initialize I2C\n");
+		return -ENODEV;
+	}
+	ret  = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
+			&imx178->module_index);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
+			&imx178->module_facing);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME,
+			&imx178->module_name);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME,
+			&imx178->len_name);
+	if (ret) {
+		dev_err(dev, "Failed to get module information\n");
+		return -EINVAL;
+	}
+	imx178->xvclk = devm_clk_get(imx178->dev, "xvclk");
+	if (IS_ERR(imx178->xvclk)) {
+		dev_err(imx178->dev, "Failed to get xvclk\n");
+		return -EINVAL;
+	}
+	imx178->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+	if (IS_ERR(imx178->reset_gpio))
+		dev_warn(dev, "Failed to get reset-gpios\n");
+	imx178->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_HIGH);
+	if (IS_ERR(imx178->pwdn_gpio))
+		dev_warn(dev, "Failed to get pwdn-gpios\n");
+	ret = imx178_get_regulators(imx178);
+	if (ret) {
+		dev_err(dev, "Failed to get regulators\n");
+		return ret;
+	}
+
+	imx178->pinctrl = devm_pinctrl_get(dev);
+	if (!IS_ERR(imx178->pinctrl)) {
+		imx178->pins_default = pinctrl_lookup_state(imx178->pinctrl,
+				OF_CAMERA_PINCTRL_STATE_DEFAULT);
+		if (IS_ERR(imx178->pins_default))
+			dev_info(dev, "could not get default pinstate\n");
+
+		imx178->pins_sleep = pinctrl_lookup_state(imx178->pinctrl,
+				OF_CAMERA_PINCTRL_STATE_SLEEP);
+		if (IS_ERR(imx178->pins_sleep))
+			dev_info(dev, "could not get sleep pinstate\n");
+	} else {
+		dev_info(dev, "no pinctrl\n");
+	}
+
+	mutex_init(&imx178->lock);
+	/* set default mode */
+	imx178->cur_mode = &supported_modes[0];
+	imx178->cfg_num = ARRAY_SIZE(supported_modes);
+	sd = &imx178->subdev;
+
+	ret = __imx178_power_on(imx178);
+	if (ret)
+		goto err_free_handler;
+
+	ret = imx178_check_sensor_id(imx178);
+	if (ret)
+		goto err_power_off;
+
+	v4l2_i2c_subdev_init(sd, client, &imx178_subdev_ops);
+	ret = imx178_initialize_controls(imx178);
+	if (ret)
+		goto err_destroy_mutex;
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+	sd->internal_ops = &imx178_internal_ops;
+	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
+#endif
+#ifdef CONFIG_MEDIA_CONTROLLER
+	imx178->pad.flags = MEDIA_PAD_FL_SOURCE;
+	sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
+	ret = media_entity_pads_init(&sd->entity, 1, &imx178->pad);
+	if (ret < 0)
+		goto err_power_off;
+#endif
+
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(imx178->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s",
+		 imx178->module_index, facing, IMX178_NAME, dev_name(sd->dev));
+	ret = v4l2_async_register_subdev_sensor_common(sd);
+	if (ret) {
+		dev_err(dev, "Failed to register v4l2 async subdev\n");
+		goto err_clean_entity;
+	}
+
+	pm_runtime_set_active(dev);
+	pm_runtime_enable(dev);
+	pm_runtime_idle(dev);
+
+	return 0;
+err_clean_entity:
+#ifdef CONFIG_MEDIA_CONTROLLER
+	media_entity_cleanup(&sd->entity);
+#endif
+err_power_off:
+	__imx178_power_off(imx178);
+err_free_handler:
+	v4l2_ctrl_handler_free(&imx178->ctrl_handler);
+err_destroy_mutex:
+	mutex_destroy(&imx178->lock);
+	return ret;
+}
+
+static int imx178_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct imx178 *imx178 = to_imx178(sd);
+
+	v4l2_async_unregister_subdev(sd);
+#ifdef CONFIG_MEDIA_CONTROLLER
+	media_entity_cleanup(&sd->entity);
+#endif
+	v4l2_ctrl_handler_free(&imx178->ctrl_handler);
+	mutex_destroy(&imx178->lock);
+	pm_runtime_disable(&client->dev);
+	if (!pm_runtime_status_suspended(&client->dev))
+		__imx178_power_off(imx178);
+	pm_runtime_set_suspended(&client->dev);
+	return 0;
+}
+
+static const struct i2c_device_id imx178_match_id[] = {
+	{ "sony,imx178", 0 },
+	{ },
+};
+
+static const struct of_device_id imx178_of_match[] = {
+	{ .compatible = "sony,imx178" },
+	{},
+};
+
+MODULE_DEVICE_TABLE(of, imx178_of_match);
+
+static struct i2c_driver imx178_i2c_driver = {
+	.driver = {
+		.name = IMX178_NAME,
+		.pm = &imx178_pm_ops,
+		.of_match_table = of_match_ptr(imx178_of_match),
+	},
+	.probe      = &imx178_probe,
+	.remove     = &imx178_remove,
+	.id_table   = imx178_match_id,
+};
+
+static int __init sensor_mod_init(void)
+{
+	return i2c_add_driver(&imx178_i2c_driver);
+}
+
+static void __exit sensor_mod_exit(void)
+{
+	i2c_del_driver(&imx178_i2c_driver);
+}
+
+device_initcall_sync(sensor_mod_init);
+module_exit(sensor_mod_exit);
+
+MODULE_DESCRIPTION("Smartsens imx178 Image Sensor Driver");
+MODULE_LICENSE("GPL v2");

commit cbf0a404e636b6c827007ef0561e9ef34bc06a9c
Author: Akilesh Kailash <akailash@google.com>
Date:   Tue May 18 23:08:19 2021 +0000

    ANDROID: dm-user: Drop additional reference
    
    kref_init already takes one reference during
    initialization. Additional reference will cause
    memory leak when dm-user target is destroyed.
    
    Bug: 188362111
    Test: OTA - verify ref count dropping to 0
    Signed-off-by: Akilesh Kailash <akailash@google.com>
    Change-Id: I0b25135371daefdaf2841e9ff5cdfd6aaa389f3b

diff --git a/drivers/md/dm-user.c b/drivers/md/dm-user.c
index 4e64adaefdbd..759346739148 100644
--- a/drivers/md/dm-user.c
+++ b/drivers/md/dm-user.c
@@ -916,7 +916,6 @@ static int user_ctr(struct dm_target *ti, unsigned int argc, char **argv)
 	 * channels have been closed.
 	 */
 	kref_init(&t->references);
-	kref_get(&t->references);
 
 	mutex_init(&t->lock);
 	init_waitqueue_head(&t->wq);

commit 22e9ac1b126c15cae03ffea9bc1a735d50506a59
Author: Sugar Zhang <sugar.zhang@rock-chips.com>
Date:   Tue May 18 21:22:46 2021 +0800

    ASoC: rockchip: i2s-tdm: Fix potential deadlock
    
         CPU0                    CPU1
         ----                    ----
    lock(&(&i2s_tdm->lock)->rlock);
                                 local_irq_disable();
                                 lock(&(&substream->self_group.lock)->rlock);
                                 lock(&(&i2s_tdm->lock)->rlock);
    <Interrupt>
      lock(&(&substream->self_group.lock)->rlock);
    
    Change-Id: I80cc2d0bc9df7e31ff23d0e5d04618ba57fd70df
    Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>

diff --git a/sound/soc/rockchip/rockchip_i2s_tdm.c b/sound/soc/rockchip/rockchip_i2s_tdm.c
index d2c0202a43bb..42d160766bb6 100644
--- a/sound/soc/rockchip/rockchip_i2s_tdm.c
+++ b/sound/soc/rockchip/rockchip_i2s_tdm.c
@@ -302,9 +302,10 @@ static void rockchip_snd_txrxctrl(struct snd_pcm_substream *substream,
 {
 	struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai);
 	unsigned int val = 0;
+	unsigned long flags;
 	int retry = 10;
 
-	spin_lock(&i2s_tdm->lock);
+	spin_lock_irqsave(&i2s_tdm->lock, flags);
 	if (on) {
 		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
 			regmap_update_bits(i2s_tdm->regmap, I2S_DMACR,
@@ -359,7 +360,7 @@ static void rockchip_snd_txrxctrl(struct snd_pcm_substream *substream,
 			}
 		}
 	}
-	spin_unlock(&i2s_tdm->lock);
+	spin_unlock_irqrestore(&i2s_tdm->lock, flags);
 }
 
 static void rockchip_snd_reset(struct reset_control *rc)
@@ -926,11 +927,12 @@ static int rockchip_i2s_trcm_mode(struct snd_pcm_substream *substream,
 				  unsigned int fmt)
 {
 	struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai);
+	unsigned long flags;
 
 	if (!i2s_tdm->clk_trcm)
 		return 0;
 
-	spin_lock(&i2s_tdm->lock);
+	spin_lock_irqsave(&i2s_tdm->lock, flags);
 	if (atomic_read(&i2s_tdm->refcount))
 		rockchip_i2s_tdm_xfer_pause(substream, i2s_tdm);
 
@@ -952,7 +954,7 @@ static int rockchip_i2s_trcm_mode(struct snd_pcm_substream *substream,
 
 	if (atomic_read(&i2s_tdm->refcount))
 		rockchip_i2s_tdm_xfer_resume(substream, i2s_tdm);
-	spin_unlock(&i2s_tdm->lock);
+	spin_unlock_irqrestore(&i2s_tdm->lock, flags);
 
 	return 0;
 }

commit d5b88a864f8c127b2e88f36076f1169bb42c2f26
Author: Ding Wei <leo.ding@rock-chips.com>
Date:   Mon May 17 11:46:43 2021 +0800

    video: rockchip: mpp: remove ktime_get within a task processing
    
    reason: mem_regions are within a task, and the differ time between
    mem_region can be ignore. Thus, it can be remove when attach task fds.
    
    Change-Id: I5986d2dca6eff41d6c6a8fa3f037e183b102e63c
    Signed-off-by: Ding Wei <leo.ding@rock-chips.com>

diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c
index 23cea719f9b4..f4a33f941e2a 100644
--- a/drivers/video/rockchip/mpp/mpp_common.c
+++ b/drivers/video/rockchip/mpp/mpp_common.c
@@ -1336,7 +1336,6 @@ mpp_task_attach_fd(struct mpp_task *task, int fd)
 		memcpy(mem_region, loop, sizeof(*loop));
 		buffer = mem_region->hdl;
 		kref_get(&buffer->ref);
-		buffer->last_used = ktime_get();
 	} else {
 		down_read(&mpp->iommu_info->rw_sem);
 		buffer = mpp_dma_import_fd(mpp->iommu_info, dma, fd);

commit cb3d52c99869253de01ac42a3eaa46dd30337c86
Author: Xing Zheng <zhengxing@rock-chips.com>
Date:   Sat May 15 12:22:56 2021 +0800

    dt-bindings: sound: es8311: add the optional property 'delay-pa-drv-ms'
    
    Signed-off-by: Xing Zheng <zhengxing@rock-chips.com>
    Change-Id: Iaaeafdccc7ce67f59e2cba95cad979cd15d24f7d

diff --git a/Documentation/devicetree/bindings/sound/es8311.txt b/Documentation/devicetree/bindings/sound/es8311.txt
index 9a95637547d9..a669b77bc84f 100644
--- a/Documentation/devicetree/bindings/sound/es8311.txt
+++ b/Documentation/devicetree/bindings/sound/es8311.txt
@@ -23,6 +23,7 @@ Optional properties:
 		"dac left, dac right"
 	    And aec-mode is "adc left, adc right" by default, if the property
 	    is not specified.
+- delay-pa-drv-ms: The value of delay some milliseconds to start Power Amplifier.
 Example:
 
 es8311: es8311@18 {

commit 4ecdbad17df6ba1b5f2eb7ebed223ccb20af2da9
Author: Xing Zheng <zhengxing@rock-chips.com>
Date:   Sat May 15 00:56:56 2021 +0800

    ASoC: es8311: add support 'delay-pa-drv-ms' property
    
    Signed-off-by: Xing Zheng <zhengxing@rock-chips.com>
    Change-Id: I3a7827fec9815ee407106d43d364e9c33975cb97

diff --git a/sound/soc/codecs/es8311.c b/sound/soc/codecs/es8311.c
index 1b3a111f1429..1a328ce95d97 100644
--- a/sound/soc/codecs/es8311.c
+++ b/sound/soc/codecs/es8311.c
@@ -45,6 +45,7 @@ struct	es8311_priv {
 	int adc_volume;
 	int dac_volume;
 	int aec_mode;
+	int delay_pa_drv_ms;
 };
 
 static const DECLARE_TLV_DB_SCALE(vdac_tlv,
@@ -489,8 +490,11 @@ static int es8311_mute(struct snd_soc_dai *dai, int mute)
 	} else {
 		snd_soc_component_update_bits(component, ES8311_DAC_REG31, 0x60, 0x00);
 		snd_soc_component_write(component, ES8311_SYSTEM_REG12, 0x00);
-		if (es8311->spk_ctl_gpio)
+		if (es8311->spk_ctl_gpio) {
 			gpiod_direction_output(es8311->spk_ctl_gpio, 1);
+			if (es8311->delay_pa_drv_ms)
+				msleep(es8311->delay_pa_drv_ms);
+		}
 	}
 	return 0;
 }
@@ -615,11 +619,31 @@ static int es8311_parse_dt(struct i2c_client *client,
 	struct device_node *np;
 	const char *str;
 	u32 v;
+	int ret;
 
 	np = client->dev.of_node;
 	if (!np)
 		return -EINVAL;
 
+	es8311->delay_pa_drv_ms = 0;
+	es8311->spk_ctl_gpio = devm_gpiod_get_optional(&client->dev, "spk-ctl",
+			       GPIOD_OUT_LOW);
+	if (!es8311->spk_ctl_gpio) {
+		dev_info(&client->dev, "Don't need spk-ctl gpio\n");
+	} else if (IS_ERR(es8311->spk_ctl_gpio)) {
+		ret = PTR_ERR(es8311->spk_ctl_gpio);
+		dev_err(&client->dev, "Unable to claim gpio spk-ctl\n");
+		return ret;
+	}
+	ret = of_property_read_s32(np, "delay-pa-drv-ms",
+				   &es8311->delay_pa_drv_ms);
+	if (ret < 0 && ret != -EINVAL) {
+		dev_err(&client->dev,
+			"Failed to read 'rockchip,delay-pa-drv-ms': %d\n",
+			ret);
+		return ret;
+	}
+
 	es8311->adc_pga_gain = 0; /* ADC PGA Gain is 0dB by default reset. */
 	if (!of_property_read_u32(np, "adc-pga-gain", &v)) {
 		if (v >= 0 && v <= 10)
@@ -684,16 +708,6 @@ static int es8311_i2c_probe(struct i2c_client *i2c_client,
 	if (IS_ERR(es8311->mclk_in))
 		return PTR_ERR(es8311->mclk_in);
 
-	es8311->spk_ctl_gpio = devm_gpiod_get_optional(&i2c_client->dev, "spk-ctl",
-			       GPIOD_OUT_LOW);
-	if (!es8311->spk_ctl_gpio) {
-		dev_info(&i2c_client->dev, "Don't need spk-ctl gpio\n");
-	} else if (IS_ERR(es8311->spk_ctl_gpio)) {
-		ret = PTR_ERR(es8311->spk_ctl_gpio);
-		dev_err(&i2c_client->dev, "Unable to claim gpio spk-ctl\n");
-		return ret;
-	}
-
 	ret = es8311_parse_dt(i2c_client, es8311);
 	if (ret < 0) {
 		dev_err(&i2c_client->dev, "Parse DT failed: %d\n", ret);

commit 10d832d91ca0e9b3c3126636abf0dd9f50204fde
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Mon May 17 22:11:59 2021 +0800

    drm/rockchip: ebc_dev: release version v1.12
    
    1.add debug ioctl
    2.EPD_A2 mode no need to do part count
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: I6ddfbc5683743759cb2f7be96265df06d3db7de9

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
index ccaeb8306415..c0a5d2c77edf 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
@@ -45,6 +45,12 @@
 #define EBC_GET_OSD_BUFFER	(0x7006)
 #define EBC_SEND_OSD_BUFFER	(0x7007)
 
+//ebc debug ioctl command
+#define EBC_GET_AUTO_OLD_BUFFER (0x7008)
+#define EBC_GET_AUTO_NEW_BUFFER (0x7009)
+#define EBC_GET_AUTO_BG_BUFFER (0x700a)
+#define EBC_GET_AUTO_CUR_BUFFER (0x700b)
+
 /*
  * IMPORTANT: Those values is corresponding to android hardware program,
  * so *FORBID* to changes bellow values, unless you know what you're doing.
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index 99c5bc7cdc48..3c013921809a 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -71,16 +71,16 @@ get_auto_image:
 	.loc 1 373 0
 	mov	w12, 1
 	add	x17, x17, 1
-.LBB792:
-.LBB793:
+.LBB916:
+.LBB917:
 	.loc 1 142 0
 	mov	w10, 3
 	lsl	x16, x17, 3
 .LVL5:
 	.p2align 2
 .L31:
-.LBE793:
-.LBE792:
+.LBE917:
+.LBE916:
 	.loc 1 364 0
 	cbz	w30, .L3
 	.loc 1 365 0
@@ -123,8 +123,8 @@ get_auto_image:
 	and	w22, w6, 65535
 	and	w21, w5, 65535
 .LVL11:
-.LBB795:
-.LBB796:
+.LBB919:
+.LBB920:
 	.loc 1 140 0
 	mov	w19, 0
 	.loc 1 139 0
@@ -172,15 +172,15 @@ get_auto_image:
 	and	w19, w19, 255
 .LVL13:
 .L9:
-.LBE796:
-.LBE795:
+.LBE920:
+.LBE919:
 	.loc 1 382 0
 	strb	w19, [x9, -4]
 	.loc 1 383 0
 	lsr	w22, w6, 16
 	lsr	w21, w5, 16
-.LBB797:
-.LBB798:
+.LBB921:
+.LBB922:
 	.loc 1 140 0
 	mov	w19, 0
 	.loc 1 139 0
@@ -228,15 +228,15 @@ get_auto_image:
 	and	w19, w19, 255
 .LVL15:
 .L14:
-.LBE798:
-.LBE797:
+.LBE922:
+.LBE921:
 	.loc 1 383 0
 	strb	w19, [x9, -3]
 	.loc 1 384 0
 	ubfx	x22, x6, 32, 16
 	ubfx	x21, x5, 32, 16
-.LBB799:
-.LBB800:
+.LBB923:
+.LBB924:
 	.loc 1 140 0
 	mov	w19, 0
 	.loc 1 139 0
@@ -284,8 +284,8 @@ get_auto_image:
 	and	w19, w19, 255
 .LVL17:
 .L19:
-.LBE800:
-.LBE799:
+.LBE924:
+.LBE923:
 	.loc 1 384 0
 	strb	w19, [x9, -2]
 	.loc 1 385 0
@@ -293,8 +293,8 @@ get_auto_image:
 .LVL18:
 	lsr	x5, x5, 48
 .LVL19:
-.LBB801:
-.LBB794:
+.LBB925:
+.LBB918:
 	.loc 1 140 0
 	mov	w19, 0
 	.loc 1 139 0
@@ -343,8 +343,8 @@ get_auto_image:
 	and	w19, w6, 255
 .LVL22:
 .L24:
-.LBE794:
-.LBE801:
+.LBE918:
+.LBE925:
 	.loc 1 385 0
 	strb	w19, [x9, -1]
 	add	x9, x9, 4
@@ -426,15 +426,15 @@ get_auto_image:
 	.type	ebc_open, %function
 ebc_open:
 .LFB2826:
-	.loc 1 1361 0
+	.loc 1 1417 0
 	.cfi_startproc
 .LVL30:
-	.loc 1 1365 0
+	.loc 1 1421 0
 	mov	w0, 0
 .LVL31:
-	.loc 1 1362 0
+	.loc 1 1418 0
 	str	xzr, [x1, 104]
-	.loc 1 1365 0
+	.loc 1 1421 0
 	ret
 	.cfi_endproc
 .LFE2826:
@@ -444,22 +444,22 @@ ebc_open:
 	.type	ebc_exit, %function
 ebc_exit:
 .LFB2845:
-	.loc 1 1907 0
+	.loc 1 1963 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1908 0
+	.loc 1 1964 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 1907 0
+	.loc 1 1963 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1908 0
+	.loc 1 1964 0
 	bl	platform_driver_unregister
 .LVL32:
-	.loc 1 1909 0
+	.loc 1 1965 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -474,7 +474,7 @@ ebc_exit:
 	.type	ebc_resume, %function
 ebc_resume:
 .LFB2843:
-	.loc 1 1869 0
+	.loc 1 1925 0
 	.cfi_startproc
 .LVL33:
 	stp	x29, x30, [sp, -32]!
@@ -485,17 +485,17 @@ ebc_resume:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-.LBB802:
-.LBB803:
+.LBB926:
+.LBB927:
 	.file 2 "./include/linux/device.h"
 	.loc 2 1181 0
 	ldr	x19, [x0, 184]
-.LBE803:
-.LBE802:
-	.loc 1 1873 0
+.LBE927:
+.LBE926:
+	.loc 1 1929 0
 	ldr	x1, [x19, 16]
-.LBB804:
-.LBB805:
+.LBB928:
+.LBB929:
 	.file 3 "drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic.h"
 	.loc 3 45 0
 	mov	x0, x1
@@ -503,17 +503,17 @@ ebc_resume:
 	ldr	x1, [x1, 48]
 	blr	x1
 .LVL35:
-.LBE805:
-.LBE804:
-	.loc 1 1874 0
+.LBE929:
+.LBE928:
+	.loc 1 1930 0
 	str	wzr, [x19, 788]
-	.loc 1 1875 0
+	.loc 1 1931 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
 .LVL36:
-	.loc 1 1878 0
+	.loc 1 1934 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -548,25 +548,25 @@ ebc_vdd_power_timeout:
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-.LBB806:
-.LBB807:
+.LBB930:
+.LBB931:
 	.file 4 "./include/linux/wakelock.h"
 	.loc 4 68 0
 	add	x0, x0, 408
-.LBE807:
-.LBE806:
+.LBE931:
+.LBE930:
 	.loc 1 1116 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	.loc 1 1120 0
 	str	wzr, [x0, 208]
-.LBB809:
-.LBB808:
+.LBB933:
+.LBB932:
 	.loc 4 68 0
 	bl	__pm_relax
 .LVL39:
-.LBE808:
-.LBE809:
+.LBE932:
+.LBE933:
 	.loc 1 1125 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -581,27 +581,27 @@ ebc_vdd_power_timeout:
 	.type	ebc_remove, %function
 ebc_remove:
 .LFB2841:
-	.loc 1 1845 0
+	.loc 1 1901 0
 	.cfi_startproc
 .LVL40:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1846 0
+	.loc 1 1902 0
 	adrp	x0, .LANCHOR1
 .LVL41:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 1845 0
+	.loc 1 1901 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1846 0
+	.loc 1 1902 0
 	add	x0, x0, 224
-	.loc 1 1845 0
-	.loc 1 1846 0
+	.loc 1 1901 0
+	.loc 1 1902 0
 	bl	misc_deregister
 .LVL42:
-	.loc 1 1849 0
+	.loc 1 1905 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -616,7 +616,7 @@ ebc_remove:
 	.type	ebc_mmap, %function
 ebc_mmap:
 .LFB2825:
-	.loc 1 1346 0
+	.loc 1 1402 0
 	.cfi_startproc
 .LVL43:
 	stp	x29, x30, [sp, -32]!
@@ -627,33 +627,33 @@ ebc_mmap:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1346 0
+	.loc 1 1402 0
 	mov	x19, x1
-	.loc 1 1349 0
+	.loc 1 1405 0
 	bl	ebc_phy_buf_base_get
 .LVL44:
-	.loc 1 1352 0
+	.loc 1 1408 0
 	lsr	x2, x0, 12
-	.loc 1 1350 0
+	.loc 1 1406 0
 	mov	x6, 16384
-	.loc 1 1352 0
+	.loc 1 1408 0
 	mov	x0, x19
-	.loc 1 1350 0
+	.loc 1 1406 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 1352 0
+	.loc 1 1408 0
 	ldp	x1, x3, [x19]
-	.loc 1 1350 0
+	.loc 1 1406 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 1352 0
+	.loc 1 1408 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
 .LVL45:
-	.loc 1 1355 0
+	.loc 1 1411 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 1358 0
+	.loc 1 1414 0
 	ldr	x19, [sp, 16]
 .LVL46:
 	csel	w0, w0, w1, eq
@@ -713,71 +713,126 @@ ebc_io_ctl:
 	bls	.L96
 .L95:
 	.loc 1 1227 0
-	mov	w0, 28675
+	mov	w0, 28677
 	cmp	w1, w0
 	beq	.L99
-	bls	.L173
-	mov	w0, 28677
+	bls	.L228
+	mov	w0, 28680
 	cmp	w1, w0
-	beq	.L104
-	bcc	.L105
-	mov	w0, 28678
+	beq	.L107
+	bls	.L229
+	mov	w0, 28682
 	cmp	w1, w0
-	beq	.L106
-	mov	w0, 28679
+	beq	.L111
+	bcc	.L112
+	mov	w0, 28683
 	cmp	w1, w0
 	bne	.L98
-.LBB810:
-.LBB811:
-.LBB812:
-.LBB813:
-.LBB814:
-.LBB815:
-.LBB816:
+	.loc 1 1379 0
+	bl	ebc_empty_buf_get
+.LVL49:
+	mov	x23, x0
+	.loc 1 1380 0
+	cbz	x0, .L119
+	.loc 1 1382 0
+	ldp	w2, w3, [x20, 108]
+	add	x22, x20, 24
+	ldr	x1, [x20, 336]
+.L225:
+	mul	w2, w2, w3
+	ldr	x0, [x23, 16]
+	lsr	w2, w2, 1
+	bl	memcpy
+.LVL50:
+	.loc 1 1383 0
+	ldr	x20, [x23, 8]
+	bl	ebc_phy_buf_base_get
+.LVL51:
+	sub	w0, w20, w0
+.LBB934:
+.LBB935:
+.LBB936:
+.LBB937:
+.LBB938:
+.LBB939:
+.LBB940:
 	.file 5 "./arch/arm64/include/asm/current.h"
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
-	mrs x0, sp_el0
+	mrs x2, sp_el0
 // 0 "" 2
-.LVL49:
+.LVL52:
 #NO_APP
-.LBE816:
-.LBE815:
+.LBE940:
+.LBE939:
 	.file 6 "./arch/arm64/include/asm/uaccess.h"
 	.loc 6 85 0
-	ldr	w2, [x0, 52]
+	ldr	w3, [x2, 52]
+.LBE938:
+.LBE937:
+.LBE936:
+.LBE935:
+.LBE934:
+	.loc 1 1385 0
+	ldp	w1, w4, [x22, 84]
+	.loc 1 1384 0
+	str	w0, [x29, 104]
+	.loc 1 1386 0
+	stp	w4, w1, [x29, 112]
+.LBB965:
+.LBB962:
+.LBB959:
+.LBB949:
+.LBB947:
 	.loc 6 77 0
-	ldr	x1, [x0, 8]
-.LVL50:
+	ldr	x1, [x2, 8]
+.LVL53:
 	.loc 6 84 0
-	tbnz	x2, 21, .L130
-.LBB817:
-.LBB818:
-.LBB819:
+	tbnz	x3, 21, .L156
+.LVL54:
+.L222:
+.LBB941:
+.LBB942:
+.LBB943:
 	.file 7 "./include/asm-generic/bitops/non-atomic.h"
 	.loc 7 106 0
-	ldr	x2, [x0]
-.LBE819:
-.LBE818:
-.LBE817:
-.LBE814:
-.LBE813:
-.LBE812:
-.LBE811:
-.LBE810:
+	ldr	x2, [x2]
+.LVL55:
+.LBE943:
+.LBE942:
+.LBE941:
+.LBE947:
+.LBE949:
+.LBE959:
+.LBE962:
+.LBE965:
 	.loc 1 1202 0
 	mov	x0, x21
-.LVL51:
-.LBB839:
-.LBB837:
-.LBB835:
-.LBB825:
-.LBB823:
+.LVL56:
+.LBB966:
+.LBB963:
+.LBB960:
+.LBB950:
+.LBB948:
 	.loc 6 84 0
-	tbnz	x2, 26, .L130
-.L131:
-.LVL52:
+	tbz	x2, 26, .L157
+.LVL57:
+.L156:
+.LBB944:
+.LBB945:
+.LBB946:
+	.file 8 "./include/linux/bitops.h"
+	.loc 8 157 0
+	sbfx	x0, x21, 0, 56
+.LVL58:
+.LBE946:
+.LBE945:
+	.loc 6 86 0
+	and	x0, x0, x21
+.LVL59:
+.L157:
+.LBE944:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -788,111 +843,86 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL53:
-#NO_APP
-.LBE823:
-.LBE825:
-	.file 8 "./include/linux/uaccess.h"
-	.loc 8 114 0
-	cbz	x0, .L172
-.LBB826:
-.LBB827:
-.LBB828:
-.LBB829:
-.LBB830:
-	.file 9 "./include/linux/bitops.h"
-	.loc 9 157 0
-	sbfx	x0, x21, 0, 56
-.LVL54:
-.LBE830:
-.LBE829:
-.LBE828:
-.LBB831:
-.LBB832:
-	.loc 5 19 0
-#APP
-// 19 "./arch/arm64/include/asm/current.h" 1
-	mrs x1, sp_el0
-// 0 "" 2
-.LVL55:
-#NO_APP
-.LBE832:
-.LBE831:
-.LBB833:
-	.loc 6 254 0
-	and	x0, x0, x21
-.LVL56:
-.LBE833:
-	.loc 6 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
-.LVL57:
-	.loc 6 257 0
-// 257 "./arch/arm64/include/asm/uaccess.h" 1
-	hint #20
-// 0 "" 2
-#NO_APP
-.LBE827:
-.LBE826:
-	.loc 8 116 0
-	mov	x2, 44
-	add	x0, x29, 104
-.LVL58:
-	bl	__arch_copy_from_user
-.LVL59:
-	.loc 8 118 0
-	cbnz	x0, .L172
-.LBE835:
-.LBE837:
-.LBE839:
-	.loc 1 1292 0
-	bl	ebc_osd_buf_clone
 .LVL60:
-	mov	x1, x0
-	.loc 1 1293 0
-	cbz	x0, .L171
-	.loc 1 1294 0
-	ldr	w6, [x29, 108]
-	.loc 1 1303 0
-	add	x20, x20, 184
-	.loc 1 1298 0
-	ldp	w5, w3, [x29, 124]
-	.loc 1 1294 0
-	str	w6, [x1, 40]
-	.loc 1 1299 0
-	ldp	w4, w2, [x29, 132]
-	.loc 1 1298 0
-	stp	w5, w3, [x1, 48]
-	.loc 1 1299 0
-	stp	w4, w2, [x1, 56]
-	.loc 1 1301 0
-	bl	ebc_add_to_dsp_buf_list
+#NO_APP
+.LBE948:
+.LBE950:
+	.file 9 "./include/linux/uaccess.h"
+	.loc 9 132 0
+	mov	x22, 44
+	cbnz	x0, .L230
+.L158:
+.LBE960:
+.LBE963:
+.LBE966:
+	.loc 1 1388 0
+	mov	x0, x23
 .LVL61:
-	.loc 1 1303 0
-	ldr	w0, [x20, 80]
-	cbz	w0, .L174
+	bl	ebc_buf_release
 .LVL62:
-	.p2align 2
-.L171:
-	.loc 1 1324 0
-	mov	x0, 0
+	.loc 1 1389 0
+	b	.L94
 .LVL63:
+	.p2align 3
+.L96:
+	.loc 1 1218 0
+	cbnz	x21, .L95
+	.loc 1 1219 0
+	ldr	x0, [x20, 272]
+	adrp	x2, .LANCHOR2
+	adrp	x1, .LC1
+.LVL64:
+	add	x2, x2, :lo12:.LANCHOR2
+	add	x1, x1, :lo12:.LC1
+	.loc 1 1220 0
+	mov	x22, -14
+	.loc 1 1219 0
+	bl	_dev_err
+.LVL65:
+	.loc 1 1220 0
+	b	.L94
+.LVL66:
+	.p2align 3
+.L228:
+	.loc 1 1227 0
+	mov	w0, 28674
+	cmp	w1, w0
+	beq	.L101
+	bls	.L231
+	mov	w0, 28675
+	cmp	w1, w0
+	beq	.L105
+	mov	w0, 28676
+	cmp	w1, w0
+	bne	.L98
+	.loc 1 1311 0
+	ldr	x0, [x20, 272]
+	.loc 1 1310 0
+	mov	w2, 1
+	str	w2, [x20, 796]
+	.loc 1 1311 0
+	adrp	x1, .LC2
+.LVL67:
+	.loc 1 1312 0
+	mov	x22, 0
+	.loc 1 1311 0
+	add	x1, x1, :lo12:.LC2
+	bl	_dev_info
+.LVL68:
+	.p2align 2
 .L94:
-	.loc 1 1343 0
+	.loc 1 1399 0
 	add	x19, x19, :lo12:__stack_chk_guard
+	mov	x0, x22
+.LVL69:
 	ldr	x2, [x29, 152]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-.LVL64:
-	cbnz	x1, .L175
+.LVL70:
+	cbnz	x1, .L232
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL65:
+.LVL71:
 	ldr	x23, [sp, 48]
 	ldp	x29, x30, [sp], 160
 	.cfi_remember_state
@@ -905,115 +935,54 @@ ebc_io_ctl:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL66:
+.LVL72:
 	.p2align 3
-.L96:
+.L231:
 	.cfi_restore_state
-	.loc 1 1218 0
-	cbnz	x21, .L95
-	.loc 1 1219 0
-	ldr	x0, [x20, 272]
-	adrp	x2, .LANCHOR2
-	adrp	x1, .LC1
-.LVL67:
-	add	x2, x2, :lo12:.LANCHOR2
-	add	x1, x1, :lo12:.LC1
-	bl	_dev_err
-.LVL68:
-	.loc 1 1220 0
-	mov	x0, -14
-	b	.L94
-.LVL69:
-	.p2align 3
-.L173:
 	.loc 1 1227 0
+	cmp	w1, 28672
+	beq	.L103
 	mov	w0, 28673
 	cmp	w1, w0
-	beq	.L101
-	bhi	.L102
-	cmp	w1, 28672
 	bne	.L98
-	.loc 1 1243 0
-	bl	ebc_empty_buf_get
-.LVL70:
-	mov	x23, x0
-	.loc 1 1244 0
-	cbz	x0, .L113
-	.loc 1 1247 0
-	ldr	x22, [x0, 8]
-	bl	ebc_phy_buf_base_get
-.LVL71:
-.LBB840:
-.LBB841:
-.LBB842:
-.LBB843:
-.LBB844:
-.LBB845:
-.LBB846:
+.LBB967:
+.LBB968:
+.LBB969:
+.LBB970:
+.LBB971:
+.LBB972:
+.LBB973:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
-	mrs x2, sp_el0
+	mrs x0, sp_el0
 // 0 "" 2
-.LVL72:
+.LVL73:
 #NO_APP
-.LBE846:
-.LBE845:
+.LBE973:
+.LBE972:
 	.loc 6 85 0
-	ldr	w3, [x2, 52]
-.LBE844:
-.LBE843:
-.LBE842:
-.LBE841:
-.LBE840:
-	.loc 1 1247 0
-	sub	w0, w22, w0
-	.loc 1 1252 0
-	ldr	w1, [x20, 176]
-	.loc 1 1251 0
-	ldp	w5, w4, [x20, 108]
-	.loc 1 1250 0
-	stp	w4, w5, [x29, 112]
-	.loc 1 1252 0
-	str	w1, [x29, 120]
-	.loc 1 1249 0
-	str	w0, [x29, 104]
-.LBB875:
-.LBB871:
-.LBB867:
-.LBB856:
-.LBB853:
+	ldr	w2, [x0, 52]
 	.loc 6 77 0
-	ldr	x1, [x2, 8]
-.LVL73:
-	.loc 6 84 0
-	tbnz	x3, 21, .L114
-.LBB847:
-.LBB848:
-.LBB849:
-	.loc 7 106 0
-	ldr	x2, [x2]
+	ldr	x1, [x0, 8]
 .LVL74:
-.LBE849:
-.LBE848:
-.LBE847:
-.LBE853:
-.LBE856:
-.LBE867:
-.LBE871:
-.LBE875:
-	.loc 1 1202 0
-	mov	x0, x21
-.LVL75:
-.LBB876:
-.LBB872:
-.LBB868:
-.LBB857:
-.LBB854:
 	.loc 6 84 0
-	tbnz	x2, 26, .L114
+	tbz	x2, 21, .L233
+.LVL75:
+.L124:
+.LBB974:
+.LBB975:
+.LBB976:
+	.loc 8 157 0
+	sbfx	x0, x21, 0, 56
 .LVL76:
-.L115:
+.LBE976:
+.LBE975:
+	.loc 6 86 0
+	and	x0, x0, x21
+.LVL77:
+.L125:
+.LBE974:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1024,640 +993,622 @@ ebc_io_ctl:
 	cset	x0, ls
 
 // 0 "" 2
-.LVL77:
-#NO_APP
-.LBE854:
-.LBE857:
-	.loc 8 132 0
-	cbnz	x0, .L116
-.L117:
-.LBE868:
-.LBE872:
-.LBE876:
-	.loc 1 1256 0
-	mov	x0, x23
 .LVL78:
-	bl	ebc_buf_release
+#NO_APP
+.LBE971:
+.LBE970:
+	.loc 9 114 0
+	cbz	x0, .L127
+.LBB982:
+.LBB983:
+.LBB984:
+.LBB985:
+.LBB986:
+	.loc 8 157 0
+	sbfx	x0, x21, 0, 56
 .LVL79:
-	.loc 1 1257 0
-	mov	x0, -14
-	b	.L94
-.LVL80:
-	.p2align 3
-.L102:
-.LBB877:
-.LBB878:
-.LBB879:
-.LBB880:
-.LBB881:
-.LBB882:
-.LBB883:
+.LBE986:
+.LBE985:
+.LBE984:
+.LBB987:
+.LBB988:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
-	mrs x2, sp_el0
+	mrs x1, sp_el0
 // 0 "" 2
-.LVL81:
+.LVL80:
 #NO_APP
-.LBE883:
-.LBE882:
-	.loc 6 85 0
-	ldr	w3, [x2, 52]
-.LBE881:
-.LBE880:
-.LBE879:
-.LBE878:
-.LBE877:
-	.loc 1 1330 0
-	ldp	w1, w0, [x20, 116]
+.LBE988:
+.LBE987:
+.LBB989:
+	.loc 6 254 0
+	and	x0, x0, x21
+.LVL81:
+.LBE989:
+	.loc 6 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
 .LVL82:
-	stp	w1, w0, [x29, 140]
-	.loc 1 1327 0
-	ldp	w6, w5, [x20, 108]
-	.loc 1 1326 0
-	stp	w5, w6, [x29, 112]
-	.loc 1 1328 0
-	ldr	w4, [x20, 176]
-	str	w4, [x29, 120]
-.LBB912:
-.LBB908:
-.LBB904:
-.LBB893:
-.LBB890:
-	.loc 6 77 0
-	ldr	x1, [x2, 8]
+	.loc 6 257 0
+// 257 "./arch/arm64/include/asm/uaccess.h" 1
+	hint #20
+// 0 "" 2
+#NO_APP
+.LBE983:
+.LBE982:
+	.loc 9 116 0
+	mov	x2, 44
+	add	x0, x29, 104
 .LVL83:
-	.loc 6 84 0
-	tbnz	x3, 21, .L137
-.LBB884:
-.LBB885:
-.LBB886:
-	.loc 7 106 0
-	ldr	x2, [x2]
+	bl	__arch_copy_from_user
 .LVL84:
-.LBE886:
-.LBE885:
-.LBE884:
-.LBE890:
-.LBE893:
-.LBE904:
-.LBE908:
-.LBE912:
-	.loc 1 1202 0
-	mov	x0, x21
+	.loc 9 118 0
+	cbnz	x0, .L127
+.LBE969:
+.LBE968:
+.LBE967:
+	.loc 1 1265 0
+	bl	ebc_phy_buf_base_get
 .LVL85:
-.LBB913:
-.LBB909:
-.LBB905:
-.LBB894:
-.LBB891:
-	.loc 6 84 0
-	tbnz	x2, 26, .L137
+	ldrsw	x1, [x29, 104]
+	.loc 1 1266 0
+	add	x0, x1, x0
+	bl	ebc_find_buf_by_phy_addr
 .LVL86:
-.L138:
-	.loc 6 89 0
-#APP
-// 89 "./arch/arm64/include/asm/uaccess.h" 1
-		adds	x0, x0, 44
-	csel	x1, xzr, x1, hi
-	csinv	x0, x0, xzr, cc
-	sbcs	xzr, x0, x1
-	cset	x0, ls
-
-// 0 "" 2
+	mov	x21, x0
 .LVL87:
-#NO_APP
-.LBE891:
-.LBE894:
-	.loc 8 132 0
-	cbnz	x0, .L139
-.L140:
-.LBE905:
-.LBE909:
-.LBE913:
-	.loc 1 1333 0
-	ldr	x0, [x20, 272]
+	.loc 1 1267 0
+	cbz	x0, .L134
+	.loc 1 1268 0
+	ldr	w5, [x29, 108]
+	.loc 1 1277 0
+	add	x20, x20, 184
+	.loc 1 1272 0
+	ldp	w4, w2, [x29, 124]
+	.loc 1 1268 0
+	str	w5, [x21, 40]
+	.loc 1 1273 0
+	ldp	w3, w1, [x29, 132]
+	.loc 1 1272 0
+	stp	w4, w2, [x21, 48]
+	.loc 1 1273 0
+	stp	w3, w1, [x21, 56]
+	.loc 1 1275 0
+	bl	ebc_add_to_dsp_buf_list
 .LVL88:
-	adrp	x1, .LC5
+	.loc 1 1277 0
+	ldr	w0, [x20, 80]
+	cbz	w0, .L234
+.L129:
+	.loc 1 1281 0
+	ldr	w0, [x21, 40]
+	cmp	w0, 15
+	beq	.L235
+	.loc 1 1281 0 is_stmt 0 discriminator 3
+	cmp	w0, 17
+	bne	.L134
+.L131:
+	.loc 1 1282 0 is_stmt 1
+	mov	w0, 1
+	str	w0, [x20, 196]
+.LBB996:
+.LBB997:
+	.loc 1 1283 0
+	mov	w1, 0
+	add	x0, x29, 64
+	bl	init_wait_entry
 .LVL89:
-	add	x1, x1, :lo12:.LC5
-	bl	_dev_err
+	adrp	x0, .LANCHOR1
+.LBB998:
+	add	x0, x0, :lo12:.LANCHOR1
+	add	x21, x0, 328
+	b	.L135
+	.p2align 3
+.L236:
 .LVL90:
-.L172:
-	.loc 1 1334 0
-	mov	x0, -14
+	.loc 1 1283 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L134
+	.loc 1 1283 0 discriminator 7
+	bl	schedule
 .LVL91:
-	b	.L94
+.L135:
+	.loc 1 1283 0 discriminator 9
+	add	x1, x29, 64
+	mov	w2, 1
+	mov	x0, x21
+	bl	prepare_to_wait_event
 .LVL92:
-	.p2align 3
-.L106:
-	.loc 1 1229 0
-	bl	ebc_osd_buf_get
+	ldr	w1, [x20, 196]
+	cbnz	w1, .L236
+.LBE998:
+	.loc 1 1283 0 discriminator 4
+	add	x1, x29, 64
+	mov	x0, x21
+	bl	finish_wait
 .LVL93:
-	.loc 1 1230 0
-	cbz	x0, .L113
-	.loc 1 1233 0
-	ldr	x22, [x0, 8]
-	bl	ebc_phy_buf_base_get
+	.p2align 2
+.L134:
+	mov	x22, 0
+	b	.L94
 .LVL94:
-.LBB914:
-.LBB915:
-.LBB916:
-.LBB917:
-.LBB918:
-.LBB919:
-.LBB920:
-	.loc 5 19 0
-#APP
-// 19 "./arch/arm64/include/asm/current.h" 1
-	mrs x1, sp_el0
-// 0 "" 2
+	.p2align 3
+.L111:
+.LBE997:
+.LBE996:
+	.loc 1 1366 0 is_stmt 1
+	bl	ebc_empty_buf_get
 .LVL95:
-#NO_APP
-.LBE920:
-.LBE919:
-	.loc 6 85 0
-	ldr	w2, [x1, 52]
-.LBE918:
-.LBE917:
-.LBE916:
-.LBE915:
-.LBE914:
-	.loc 1 1233 0
-	sub	w0, w22, w0
-	.loc 1 1237 0
-	ldp	w5, w4, [x20, 108]
-	.loc 1 1235 0
-	str	w0, [x29, 104]
-	.loc 1 1238 0
-	ldr	w3, [x20, 176]
-	.loc 1 1236 0
-	stp	w4, w5, [x29, 112]
-	.loc 1 1238 0
-	str	w3, [x29, 120]
-.LBB943:
-.LBB941:
-.LBB939:
-.LBB929:
-.LBB927:
-	.loc 6 77 0
-	ldr	x0, [x1, 8]
+	mov	x23, x0
+	.loc 1 1367 0
+	cbz	x0, .L119
+	.loc 1 1369 0
+	add	x22, x20, 24
+	ldr	x1, [x20, 328]
+	ldp	w2, w3, [x20, 108]
+	b	.L225
 .LVL96:
-	.loc 6 84 0
-	tbnz	x2, 21, .L109
-.LBB921:
-.LBB922:
-.LBB923:
-	.loc 7 106 0
-	ldr	x2, [x1]
-.LBE923:
-.LBE922:
-.LBE921:
-.LBE927:
-.LBE929:
-.LBE939:
-.LBE941:
-.LBE943:
-	.loc 1 1202 0
-	mov	x1, x21
+	.p2align 3
+.L229:
+	.loc 1 1227 0
+	mov	w0, 28678
+	cmp	w1, w0
+	beq	.L109
+	mov	w0, 28679
+	cmp	w1, w0
+	bne	.L98
+.LBB1002:
+.LBB1003:
+.LBB1004:
+.LBB1005:
+.LBB1006:
+.LBB1007:
+.LBB1008:
+	.loc 5 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x0, sp_el0
+// 0 "" 2
 .LVL97:
-.LBB944:
-.LBB942:
-.LBB940:
-.LBB930:
-.LBB928:
-	.loc 6 84 0
-	tbz	x2, 26, .L110
+#NO_APP
+.LBE1008:
+.LBE1007:
+	.loc 6 85 0
+	ldr	w2, [x0, 52]
+	.loc 6 77 0
+	ldr	x1, [x0, 8]
 .LVL98:
-.L109:
-.LBB924:
-.LBB925:
-.LBB926:
-	.loc 9 157 0
-	sbfx	x1, x21, 0, 56
+	.loc 6 84 0
+	tbz	x2, 21, .L237
 .LVL99:
-.LBE926:
-.LBE925:
-	.loc 6 86 0
-	and	x1, x1, x21
+.L136:
+.LBB1009:
+.LBB1010:
+.LBB1011:
+	.loc 8 157 0
+	sbfx	x0, x21, 0, 56
 .LVL100:
-.L110:
-.LBE924:
+.LBE1011:
+.LBE1010:
+	.loc 6 86 0
+	and	x0, x0, x21
+.LVL101:
+.L137:
+.LBE1009:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
-		adds	x1, x1, 44
-	csel	x0, xzr, x0, hi
-	csinv	x1, x1, xzr, cc
-	sbcs	xzr, x1, x0
-	cset	x1, ls
+		adds	x0, x0, 44
+	csel	x1, xzr, x1, hi
+	csinv	x0, x0, xzr, cc
+	sbcs	xzr, x0, x1
+	cset	x0, ls
 
 // 0 "" 2
-.LVL101:
-#NO_APP
-.LBE928:
-.LBE930:
-	.loc 8 132 0
-	mov	x0, 44
 .LVL102:
-	cbz	x1, .L94
-.LBB931:
-.LBB932:
-.LBB933:
-.LBB934:
-.LBB935:
-	.loc 9 157 0
-	sbfx	x1, x21, 0, 56
+#NO_APP
+.LBE1006:
+.LBE1005:
+	.loc 9 114 0
+	cbz	x0, .L127
+.LBB1017:
+.LBB1018:
+.LBB1019:
+.LBB1020:
+.LBB1021:
+	.loc 8 157 0
+	sbfx	x0, x21, 0, 56
 .LVL103:
-.LBE935:
-.LBE934:
-.LBE933:
-.LBB936:
-.LBB937:
+.LBE1021:
+.LBE1020:
+.LBE1019:
+.LBB1022:
+.LBB1023:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
-	mrs x2, sp_el0
+	mrs x1, sp_el0
 // 0 "" 2
 .LVL104:
 #NO_APP
-.LBE937:
-.LBE936:
-.LBB938:
+.LBE1023:
+.LBE1022:
+.LBB1024:
 	.loc 6 254 0
-	and	x1, x1, x21
+	and	x0, x0, x21
 .LVL105:
-.LBE938:
+.LBE1024:
 	.loc 6 249 0
-	ldr	x2, [x2, 8]
-.LVL106:
+	ldr	x2, [x1, 8]
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
-		bics	xzr, x1, x2
-	csel	x3, x21, xzr, eq
+		bics	xzr, x0, x2
+	csel	x1, x21, xzr, eq
 
 // 0 "" 2
-.LVL107:
+.LVL106:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE932:
-.LBE931:
-	.loc 8 134 0
-	mov	x2, x0
-	add	x1, x29, 104
+.LBE1018:
+.LBE1017:
+	.loc 9 116 0
+	mov	x2, 44
+	add	x0, x29, 104
+.LVL107:
+	bl	__arch_copy_from_user
 .LVL108:
-	mov	x0, x3
-	bl	__arch_copy_to_user
+	.loc 9 118 0
+	cbnz	x0, .L127
+.LBE1004:
+.LBE1003:
+.LBE1002:
+	.loc 1 1292 0
+	bl	ebc_osd_buf_clone
 .LVL109:
-	sxtw	x0, w0
-	b	.L94
+	mov	x1, x0
+	.loc 1 1293 0
+	cbz	x0, .L134
+	.loc 1 1294 0
+	ldr	w6, [x29, 108]
+	.loc 1 1303 0
+	add	x20, x20, 184
+	.loc 1 1298 0
+	ldp	w5, w3, [x29, 124]
+	.loc 1 1294 0
+	str	w6, [x1, 40]
+	.loc 1 1299 0
+	ldp	w4, w2, [x29, 132]
+	.loc 1 1298 0
+	stp	w5, w3, [x1, 48]
+	.loc 1 1299 0
+	stp	w4, w2, [x1, 56]
+	.loc 1 1301 0
+	bl	ebc_add_to_dsp_buf_list
 .LVL110:
-	.p2align 3
-.L137:
-.LBE940:
-.LBE942:
-.LBE944:
-.LBB945:
-.LBB910:
-.LBB906:
-.LBB895:
-.LBB892:
-.LBB887:
-.LBB888:
-.LBB889:
-	.loc 9 157 0
-	sbfx	x0, x21, 0, 56
+	.loc 1 1303 0
+	ldr	w0, [x20, 80]
+	cbnz	w0, .L134
+	.loc 1 1304 0
+	mov	w2, 1
+	str	w2, [x20, 80]
+	.loc 1 1305 0
+	adrp	x0, .LANCHOR1
+	add	x0, x0, :lo12:.LANCHOR1
+	mov	w1, w2
+	add	x0, x0, 304
+	mov	x22, 0
+	bl	__wake_up_sync
 .LVL111:
-.LBE889:
-.LBE888:
-	.loc 6 86 0
-	and	x0, x0, x21
+	b	.L94
 .LVL112:
-	b	.L138
-.LVL113:
-	.p2align 3
-.L130:
-.LBE887:
-.LBE892:
-.LBE895:
-.LBE906:
-.LBE910:
-.LBE945:
-.LBB946:
-.LBB838:
-.LBB836:
-.LBB834:
-.LBB824:
-.LBB820:
-.LBB821:
-.LBB822:
-	.loc 9 157 0
-	sbfx	x0, x21, 0, 56
-.LVL114:
-.LBE822:
-.LBE821:
-	.loc 6 86 0
-	and	x0, x0, x21
-.LVL115:
-	b	.L131
-.LVL116:
-	.p2align 3
-.L114:
-.LBE820:
-.LBE824:
-.LBE834:
-.LBE836:
-.LBE838:
-.LBE946:
-.LBB947:
-.LBB873:
-.LBB869:
-.LBB858:
-.LBB855:
-.LBB850:
-.LBB851:
-.LBB852:
-	.loc 9 157 0
-	sbfx	x0, x21, 0, 56
-.LVL117:
-.LBE852:
-.LBE851:
-	.loc 6 86 0
-	and	x0, x0, x21
-.LVL118:
-	b	.L115
-.LVL119:
 	.p2align 3
-.L99:
-.LBE850:
-.LBE855:
-.LBE858:
-.LBE869:
-.LBE873:
-.LBE947:
-.LBB948:
-.LBB949:
-.LBB950:
+.L230:
+.LBB1031:
+.LBB964:
+.LBB961:
 .LBB951:
 .LBB952:
 .LBB953:
 .LBB954:
+.LBB955:
+	.loc 8 157 0
+	sbfx	x1, x21, 0, 56
+.LVL113:
+.LBE955:
+.LBE954:
+.LBE953:
+.LBB956:
+.LBB957:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL120:
+.LVL114:
 #NO_APP
-.LBE954:
-.LBE953:
-	.loc 6 85 0
-	ldr	w2, [x0, 52]
-.LBE952:
-.LBE951:
-.LBE950:
-.LBE949:
-.LBE948:
-	.loc 1 1319 0
-	add	x22, x20, 232
-.LBB983:
-.LBB979:
-.LBB975:
-.LBB964:
-.LBB961:
-	.loc 6 77 0
-	ldr	x1, [x0, 8]
-.LVL121:
-	.loc 6 84 0
-	tbnz	x2, 21, .L133
-.LBB955:
-.LBB956:
-.LBB957:
-	.loc 7 106 0
-	ldr	x2, [x0]
 .LBE957:
 .LBE956:
-.LBE955:
+.LBB958:
+	.loc 6 254 0
+	and	x1, x1, x21
+.LVL115:
+.LBE958:
+	.loc 6 249 0
+	ldr	x2, [x0, 8]
+.LVL116:
+#APP
+// 249 "./arch/arm64/include/asm/uaccess.h" 1
+		bics	xzr, x1, x2
+	csel	x0, x21, xzr, eq
+
+// 0 "" 2
+.LVL117:
+	.loc 6 257 0
+// 257 "./arch/arm64/include/asm/uaccess.h" 1
+	hint #20
+// 0 "" 2
+#NO_APP
+.LBE952:
+.LBE951:
+	.loc 9 134 0
+	mov	x2, x22
+	add	x1, x29, 104
+.LVL118:
+	bl	__arch_copy_to_user
+.LVL119:
+	sxtw	x22, w0
+	b	.L158
+.LVL120:
+	.p2align 3
+.L109:
 .LBE961:
 .LBE964:
-.LBE975:
-.LBE979:
-.LBE983:
-	.loc 1 1202 0
-	mov	x0, x21
+.LBE1031:
+	.loc 1 1229 0
+	bl	ebc_osd_buf_get
+.LVL121:
+	.loc 1 1230 0
+	cbz	x0, .L119
+	.loc 1 1233 0
+	ldr	x22, [x0, 8]
+	bl	ebc_phy_buf_base_get
 .LVL122:
-.LBB984:
-.LBB980:
-.LBB976:
-.LBB965:
-.LBB962:
-	.loc 6 84 0
-	tbnz	x2, 26, .L133
-.L134:
+.LBB1032:
+.LBB1033:
+.LBB1034:
+.LBB1035:
+.LBB1036:
+.LBB1037:
+.LBB1038:
+	.loc 5 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x2, sp_el0
+// 0 "" 2
 .LVL123:
+#NO_APP
+.LBE1038:
+.LBE1037:
+	.loc 6 85 0
+	ldr	w3, [x2, 52]
+.LBE1036:
+.LBE1035:
+.LBE1034:
+.LBE1033:
+.LBE1032:
+	.loc 1 1233 0
+	sub	w0, w22, w0
+	.loc 1 1238 0
+	ldr	w1, [x20, 176]
+	.loc 1 1237 0
+	ldp	w5, w4, [x20, 108]
+	.loc 1 1236 0
+	stp	w4, w5, [x29, 112]
+	.loc 1 1238 0
+	str	w1, [x29, 120]
+	.loc 1 1235 0
+	str	w0, [x29, 104]
+.LBB1065:
+.LBB1062:
+.LBB1059:
+.LBB1048:
+.LBB1045:
+	.loc 6 77 0
+	ldr	x1, [x2, 8]
+.LVL124:
+	.loc 6 84 0
+	tbz	x3, 21, .L238
+.LVL125:
+.L115:
+.LBB1039:
+.LBB1040:
+.LBB1041:
+	.loc 8 157 0
+	sbfx	x0, x21, 0, 56
+.LVL126:
+.LBE1041:
+.LBE1040:
+	.loc 6 86 0
+	and	x0, x0, x21
+.LVL127:
+.L116:
+.LBE1039:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
-		adds	x0, x0, 4
+		adds	x0, x0, 44
 	csel	x1, xzr, x1, hi
 	csinv	x0, x0, xzr, cc
 	sbcs	xzr, x0, x1
 	cset	x0, ls
 
 // 0 "" 2
-.LVL124:
+.LVL128:
 #NO_APP
-	mov	x3, x0
-.LBE962:
-.LBE965:
-	.loc 8 114 0
-	cbz	x0, .L150
-.LBB966:
-.LBB967:
-.LBB968:
-.LBB969:
-.LBB970:
-	.loc 9 157 0
-	sbfx	x0, x21, 0, 56
-.LBE970:
-.LBE969:
-.LBE968:
-.LBB971:
-.LBB972:
+.LBE1045:
+.LBE1048:
+	.loc 9 132 0
+	mov	x22, 44
+	cbz	x0, .L94
+.LBB1049:
+.LBB1050:
+.LBB1051:
+.LBB1052:
+.LBB1053:
+	.loc 8 157 0
+	sbfx	x1, x21, 0, 56
+.LVL129:
+.LBE1053:
+.LBE1052:
+.LBE1051:
+.LBB1054:
+.LBB1055:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
-	mrs x1, sp_el0
+	mrs x0, sp_el0
 // 0 "" 2
-.LVL125:
+.LVL130:
 #NO_APP
-.LBE972:
-.LBE971:
-.LBB973:
+.LBE1055:
+.LBE1054:
+.LBB1056:
 	.loc 6 254 0
-	and	x0, x0, x21
-.LVL126:
-.LBE973:
+	and	x1, x1, x21
+.LVL131:
+.LBE1056:
 	.loc 6 249 0
-	ldr	x2, [x1, 8]
+	ldr	x2, [x0, 8]
+.LVL132:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
-		bics	xzr, x0, x2
-	csel	x1, x21, xzr, eq
+		bics	xzr, x1, x2
+	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL127:
+.LVL133:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE967:
-.LBE966:
-	.loc 8 116 0
-	mov	x2, 4
-	mov	x0, x22
-.LVL128:
-	bl	__arch_copy_from_user
-.LVL129:
-	.loc 8 118 0
-	cbnz	x0, .L176
-.LBE976:
-.LBE980:
-.LBE984:
-	.loc 1 1323 0
-	add	x20, x20, 184
-	ldr	w2, [x20, 48]
-	ldr	x0, [x20, 88]
-.LVL130:
-	adrp	x1, .LC7
-	add	x1, x1, :lo12:.LC7
-	bl	_dev_info
-.LVL131:
-	b	.L171
-.LVL132:
-	.p2align 3
-.L133:
-.LBB985:
-.LBB981:
-.LBB977:
-.LBB974:
-.LBB963:
-.LBB958:
-.LBB959:
-.LBB960:
-	.loc 9 157 0
-	sbfx	x0, x21, 0, 56
-.LVL133:
-.LBE960:
-.LBE959:
-	.loc 6 86 0
-	and	x0, x0, x21
+.LBE1050:
+.LBE1049:
+	.loc 9 134 0
+	mov	x2, x22
+	add	x1, x29, 104
 .LVL134:
-	b	.L134
+	bl	__arch_copy_to_user
 .LVL135:
+	sxtw	x22, w0
+	b	.L94
+.LVL136:
 	.p2align 3
-.L101:
-.LBE958:
-.LBE963:
-.LBE974:
-.LBE977:
-.LBE981:
-.LBE985:
-.LBB986:
-.LBB987:
-.LBB988:
-.LBB989:
-.LBB990:
-.LBB991:
-.LBB992:
+.L105:
+.LBE1059:
+.LBE1062:
+.LBE1065:
+.LBB1066:
+.LBB1067:
+.LBB1068:
+.LBB1069:
+.LBB1070:
+.LBB1071:
+.LBB1072:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL136:
+.LVL137:
 #NO_APP
-.LBE992:
-.LBE991:
+.LBE1072:
+.LBE1071:
 	.loc 6 85 0
 	ldr	w2, [x0, 52]
+.LBE1070:
+.LBE1069:
+.LBE1068:
+.LBE1067:
+.LBE1066:
+	.loc 1 1319 0
+	add	x22, x20, 232
+.LBB1101:
+.LBB1097:
+.LBB1093:
+.LBB1082:
+.LBB1079:
 	.loc 6 77 0
 	ldr	x1, [x0, 8]
-.LVL137:
-	.loc 6 84 0
-	tbnz	x2, 21, .L118
-.LBB993:
-.LBB994:
-.LBB995:
-	.loc 7 106 0
-	ldr	x2, [x0]
-.LBE995:
-.LBE994:
-.LBE993:
-.LBE990:
-.LBE989:
-.LBE988:
-.LBE987:
-.LBE986:
-	.loc 1 1202 0
-	mov	x0, x21
 .LVL138:
-.LBB1015:
-.LBB1013:
-.LBB1011:
-.LBB1001:
-.LBB999:
 	.loc 6 84 0
-	tbnz	x2, 26, .L118
-.L119:
+	tbz	x2, 21, .L239
 .LVL139:
+.L139:
+.LBB1073:
+.LBB1074:
+.LBB1075:
+	.loc 8 157 0
+	sbfx	x0, x21, 0, 56
+.LVL140:
+.LBE1075:
+.LBE1074:
+	.loc 6 86 0
+	and	x0, x0, x21
+.LVL141:
+.L140:
+.LBE1073:
 	.loc 6 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
-		adds	x0, x0, 44
+		adds	x0, x0, 4
 	csel	x1, xzr, x1, hi
 	csinv	x0, x0, xzr, cc
 	sbcs	xzr, x0, x1
 	cset	x0, ls
 
 // 0 "" 2
-.LVL140:
+.LVL142:
 #NO_APP
-.LBE999:
-.LBE1001:
-	.loc 8 114 0
-	cbz	x0, .L172
-.LBB1002:
-.LBB1003:
-.LBB1004:
-.LBB1005:
-.LBB1006:
-	.loc 9 157 0
+	mov	x3, x0
+.LBE1079:
+.LBE1082:
+	.loc 9 114 0
+	cbz	x0, .L168
+.LBB1083:
+.LBB1084:
+.LBB1085:
+.LBB1086:
+.LBB1087:
+	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL141:
-.LBE1006:
-.LBE1005:
-.LBE1004:
-.LBB1007:
-.LBB1008:
+.LBE1087:
+.LBE1086:
+.LBE1085:
+.LBB1088:
+.LBB1089:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL142:
+.LVL143:
 #NO_APP
-.LBE1008:
-.LBE1007:
-.LBB1009:
+.LBE1089:
+.LBE1088:
+.LBB1090:
 	.loc 6 254 0
 	and	x0, x0, x21
-.LVL143:
-.LBE1009:
+.LVL144:
+.LBE1090:
 	.loc 6 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -1666,387 +1617,790 @@ ebc_io_ctl:
 	csel	x1, x21, xzr, eq
 
 // 0 "" 2
-.LVL144:
+.LVL145:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1003:
-.LBE1002:
-	.loc 8 116 0
-	mov	x2, 44
-	add	x0, x29, 104
-.LVL145:
-	bl	__arch_copy_from_user
+.LBE1084:
+.LBE1083:
+	.loc 9 116 0
+	mov	x2, 4
+	mov	x0, x22
 .LVL146:
-	.loc 8 118 0
-	cbnz	x0, .L172
-.LBE1011:
-.LBE1013:
-.LBE1015:
-	.loc 1 1265 0
-	bl	ebc_phy_buf_base_get
+	bl	__arch_copy_from_user
 .LVL147:
-	ldrsw	x1, [x29, 104]
-	.loc 1 1266 0
-	add	x0, x1, x0
-	bl	ebc_find_buf_by_phy_addr
+	.loc 9 118 0
+	cbnz	x0, .L240
+.LBE1093:
+.LBE1097:
+.LBE1101:
+	.loc 1 1323 0
+	add	x20, x20, 184
+	ldr	w2, [x20, 48]
+	ldr	x0, [x20, 88]
 .LVL148:
-	mov	x21, x0
+	.loc 1 1324 0
+	mov	x22, 0
+	.loc 1 1323 0
+	adrp	x1, .LC7
+	add	x1, x1, :lo12:.LC7
+	bl	_dev_info
 .LVL149:
-	.loc 1 1267 0
-	cbz	x0, .L171
-	.loc 1 1268 0
-	ldr	w5, [x29, 108]
-	.loc 1 1277 0
-	add	x20, x20, 184
-	.loc 1 1272 0
-	ldp	w4, w2, [x29, 124]
-	.loc 1 1268 0
-	str	w5, [x21, 40]
-	.loc 1 1273 0
-	ldp	w3, w1, [x29, 132]
-	.loc 1 1272 0
-	stp	w4, w2, [x21, 48]
-	.loc 1 1273 0
-	stp	w3, w1, [x21, 56]
-	.loc 1 1275 0
-	bl	ebc_add_to_dsp_buf_list
+	.loc 1 1324 0
+	b	.L94
 .LVL150:
-	.loc 1 1277 0
-	ldr	w0, [x20, 80]
-	cbz	w0, .L177
-.L123:
-	.loc 1 1281 0
-	ldr	w0, [x21, 40]
-	cmp	w0, 15
-	beq	.L178
-	.loc 1 1281 0 is_stmt 0 discriminator 3
-	cmp	w0, 17
-	bne	.L171
-.L125:
-	.loc 1 1282 0 is_stmt 1
-	mov	w0, 1
-	str	w0, [x20, 196]
-.LBB1016:
-.LBB1017:
-	.loc 1 1283 0
-	mov	w1, 0
-	add	x0, x29, 64
-	bl	init_wait_entry
-.LVL151:
-	adrp	x0, .LANCHOR1
-.LBB1018:
-	add	x0, x0, :lo12:.LANCHOR1
-	add	x21, x0, 328
-	b	.L129
 	.p2align 3
-.L179:
+.L99:
+	.loc 1 1316 0
+	ldr	x0, [x20, 272]
+	adrp	x1, .LC3
+.LVL151:
+	.loc 1 1314 0
+	str	wzr, [x20, 796]
+	.loc 1 1317 0
+	mov	x22, 0
+	.loc 1 1315 0
+	str	wzr, [x20, 800]
+	.loc 1 1316 0
+	add	x1, x1, :lo12:.LC3
+	bl	_dev_info
 .LVL152:
-	.loc 1 1283 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L171
-	.loc 1 1283 0 discriminator 7
-	bl	schedule
+	.loc 1 1317 0
+	b	.L94
 .LVL153:
-.L129:
-	.loc 1 1283 0 discriminator 9
-	add	x1, x29, 64
-	mov	w2, 1
-	mov	x0, x21
-	bl	prepare_to_wait_event
+	.p2align 3
+.L107:
+	.loc 1 1353 0
+	bl	ebc_empty_buf_get
 .LVL154:
-	ldr	w1, [x20, 196]
-	cbnz	w1, .L179
-.L128:
-.LBE1018:
-	.loc 1 1283 0 discriminator 4
-	add	x1, x29, 64
-	mov	x0, x21
-	bl	finish_wait
+	mov	x23, x0
+	.loc 1 1354 0
+	cbz	x0, .L119
+	.loc 1 1356 0
+	add	x22, x20, 24
+	ldr	x1, [x20, 320]
+	ldp	w2, w3, [x20, 108]
+	b	.L225
 .LVL155:
-	b	.L171
+	.p2align 3
+.L112:
+	.loc 1 1340 0
+	bl	ebc_empty_buf_get
 .LVL156:
+	mov	x23, x0
+	.loc 1 1341 0
+	cbz	x0, .L119
+	.loc 1 1343 0
+	ldp	w2, w3, [x20, 108]
+	add	x22, x20, 24
+	ldr	x1, [x20, 312]
+	ldr	x0, [x0, 16]
+	mul	w2, w2, w3
+	lsr	w2, w2, 1
+	bl	memcpy
+.LVL157:
+	.loc 1 1344 0
+	ldr	x20, [x23, 8]
+	bl	ebc_phy_buf_base_get
+.LVL158:
+	sub	w0, w20, w0
+.LBB1102:
+.LBB1103:
+.LBB1104:
+.LBB1105:
+.LBB1106:
+.LBB1107:
+.LBB1108:
+	.loc 5 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x2, sp_el0
+// 0 "" 2
+.LVL159:
+#NO_APP
+.LBE1108:
+.LBE1107:
+	.loc 6 85 0
+	ldr	w3, [x2, 52]
+.LBE1106:
+.LBE1105:
+.LBE1104:
+.LBE1103:
+.LBE1102:
+	.loc 1 1347 0
+	ldp	w4, w1, [x22, 84]
+	.loc 1 1345 0
+	str	w0, [x29, 104]
+	.loc 1 1346 0
+	stp	w1, w4, [x29, 112]
+.LBB1113:
+.LBB1112:
+.LBB1111:
+.LBB1110:
+.LBB1109:
+	.loc 6 77 0
+	ldr	x1, [x2, 8]
+.LVL160:
+	.loc 6 84 0
+	tbnz	x3, 21, .L156
+	b	.L222
+.LVL161:
 	.p2align 3
-.L118:
-.LBE1017:
-.LBE1016:
-.LBB1019:
-.LBB1014:
-.LBB1012:
-.LBB1010:
-.LBB1000:
-.LBB996:
-.LBB997:
-.LBB998:
-	.loc 9 157 0 is_stmt 1
+.L101:
+.LBE1109:
+.LBE1110:
+.LBE1111:
+.LBE1112:
+.LBE1113:
+.LBB1114:
+.LBB1115:
+.LBB1116:
+.LBB1117:
+.LBB1118:
+.LBB1119:
+.LBB1120:
+	.loc 5 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x2, sp_el0
+// 0 "" 2
+.LVL162:
+#NO_APP
+.LBE1120:
+.LBE1119:
+	.loc 6 85 0
+	ldr	w3, [x2, 52]
+.LBE1118:
+.LBE1117:
+.LBE1116:
+.LBE1115:
+.LBE1114:
+	.loc 1 1330 0
+	ldp	w1, w0, [x20, 116]
+.LVL163:
+	stp	w1, w0, [x29, 140]
+	.loc 1 1327 0
+	ldp	w6, w5, [x20, 108]
+	.loc 1 1326 0
+	stp	w5, w6, [x29, 112]
+	.loc 1 1328 0
+	ldr	w4, [x20, 176]
+	str	w4, [x29, 120]
+.LBB1149:
+.LBB1145:
+.LBB1141:
+.LBB1130:
+.LBB1127:
+	.loc 6 77 0
+	ldr	x1, [x2, 8]
+.LVL164:
+	.loc 6 84 0
+	tbz	x3, 21, .L241
+.LVL165:
+.L143:
+.LBB1121:
+.LBB1122:
+.LBB1123:
+	.loc 8 157 0
 	sbfx	x0, x21, 0, 56
-.LVL157:
-.LBE998:
-.LBE997:
+.LVL166:
+.LBE1123:
+.LBE1122:
 	.loc 6 86 0
 	and	x0, x0, x21
-.LVL158:
-	b	.L119
-.LVL159:
+.LVL167:
+.L144:
+.LBE1121:
+	.loc 6 89 0
+#APP
+// 89 "./arch/arm64/include/asm/uaccess.h" 1
+		adds	x0, x0, 44
+	csel	x1, xzr, x1, hi
+	csinv	x0, x0, xzr, cc
+	sbcs	xzr, x0, x1
+	cset	x0, ls
+
+// 0 "" 2
+.LVL168:
+#NO_APP
+.LBE1127:
+.LBE1130:
+	.loc 9 132 0
+	cbnz	x0, .L145
+.L146:
+.LBE1141:
+.LBE1145:
+.LBE1149:
+	.loc 1 1333 0
+	ldr	x0, [x20, 272]
+.LVL169:
+	adrp	x1, .LC5
+.LVL170:
+	.loc 1 1334 0
+	mov	x22, -14
+	.loc 1 1333 0
+	add	x1, x1, :lo12:.LC5
+	bl	_dev_err
+.LVL171:
+	.loc 1 1334 0
+	b	.L94
+.LVL172:
 	.p2align 3
 .L98:
-.LBE996:
-.LBE1000:
-.LBE1010:
-.LBE1012:
-.LBE1014:
-.LBE1019:
-	.loc 1 1338 0
+	.loc 1 1394 0
 	ldr	x0, [x20, 272]
 	adrp	x2, .LANCHOR2
 	adrp	x1, .LC6
-.LVL160:
+.LVL173:
 	add	x2, x2, :lo12:.LANCHOR2
 	add	x1, x1, :lo12:.LC6
+	.loc 1 1395 0
+	mov	x22, 0
+	.loc 1 1394 0
 	bl	_dev_err
-.LVL161:
-	.loc 1 1339 0
-	mov	x0, 0
-	.loc 1 1342 0
+.LVL174:
+	.loc 1 1398 0
 	b	.L94
-.LVL162:
+.LVL175:
 	.p2align 3
-.L105:
-	.loc 1 1311 0
-	ldr	x0, [x20, 272]
-	.loc 1 1310 0
-	mov	w2, 1
-	str	w2, [x20, 796]
-	.loc 1 1311 0
-	adrp	x1, .LC2
-.LVL163:
-	add	x1, x1, :lo12:.LC2
-	bl	_dev_info
-.LVL164:
-	.loc 1 1312 0
-	mov	x0, 0
+.L103:
+	.loc 1 1243 0
+	bl	ebc_empty_buf_get
+.LVL176:
+	mov	x23, x0
+	.loc 1 1244 0
+	cbz	x0, .L119
+	.loc 1 1247 0
+	ldr	x22, [x0, 8]
+	bl	ebc_phy_buf_base_get
+.LVL177:
+.LBB1150:
+.LBB1151:
+.LBB1152:
+.LBB1153:
+.LBB1154:
+.LBB1155:
+.LBB1156:
+	.loc 5 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x2, sp_el0
+// 0 "" 2
+.LVL178:
+#NO_APP
+.LBE1156:
+.LBE1155:
+	.loc 6 85 0
+	ldr	w3, [x2, 52]
+.LBE1154:
+.LBE1153:
+.LBE1152:
+.LBE1151:
+.LBE1150:
+	.loc 1 1247 0
+	sub	w0, w22, w0
+	.loc 1 1252 0
+	ldr	w1, [x20, 176]
+	.loc 1 1251 0
+	ldp	w5, w4, [x20, 108]
+	.loc 1 1250 0
+	stp	w4, w5, [x29, 112]
+	.loc 1 1252 0
+	str	w1, [x29, 120]
+	.loc 1 1249 0
+	str	w0, [x29, 104]
+.LBB1185:
+.LBB1181:
+.LBB1177:
+.LBB1166:
+.LBB1163:
+	.loc 6 77 0
+	ldr	x1, [x2, 8]
+.LVL179:
+	.loc 6 84 0
+	tbz	x3, 21, .L242
+.LVL180:
+.L120:
+.LBB1157:
+.LBB1158:
+.LBB1159:
+	.loc 8 157 0
+	sbfx	x0, x21, 0, 56
+.LVL181:
+.LBE1159:
+.LBE1158:
+	.loc 6 86 0
+	and	x0, x0, x21
+.LVL182:
+.L121:
+.LBE1157:
+	.loc 6 89 0
+#APP
+// 89 "./arch/arm64/include/asm/uaccess.h" 1
+		adds	x0, x0, 44
+	csel	x1, xzr, x1, hi
+	csinv	x0, x0, xzr, cc
+	sbcs	xzr, x0, x1
+	cset	x0, ls
+
+// 0 "" 2
+.LVL183:
+#NO_APP
+.LBE1163:
+.LBE1166:
+	.loc 9 132 0
+	cbnz	x0, .L122
+.L123:
+.LBE1177:
+.LBE1181:
+.LBE1185:
+	.loc 1 1256 0
+	mov	x0, x23
+.LVL184:
+	.loc 1 1257 0
+	mov	x22, -14
+	.loc 1 1256 0
+	bl	ebc_buf_release
+.LVL185:
+	.loc 1 1257 0
 	b	.L94
-.LVL165:
+.LVL186:
 	.p2align 3
-.L104:
-	.loc 1 1316 0
-	ldr	x0, [x20, 272]
-	adrp	x1, .LC3
-.LVL166:
-	.loc 1 1314 0
-	str	wzr, [x20, 796]
-	.loc 1 1316 0
-	add	x1, x1, :lo12:.LC3
-	.loc 1 1315 0
-	str	wzr, [x20, 800]
-	.loc 1 1316 0
-	bl	_dev_info
-.LVL167:
-	.loc 1 1317 0
-	mov	x0, 0
-	b	.L94
+.L237:
+.LBB1186:
+.LBB1029:
+.LBB1027:
+.LBB1025:
+.LBB1015:
+.LBB1012:
+.LBB1013:
+.LBB1014:
+	.loc 7 106 0
+	ldr	x2, [x0]
+.LBE1014:
+.LBE1013:
+.LBE1012:
+.LBE1015:
+.LBE1025:
+.LBE1027:
+.LBE1029:
+.LBE1186:
+	.loc 1 1202 0
+	mov	x0, x21
+.LVL187:
+.LBB1187:
+.LBB1030:
+.LBB1028:
+.LBB1026:
+.LBB1016:
+	.loc 6 84 0
+	tbz	x2, 26, .L137
+	b	.L136
+.LVL188:
 	.p2align 3
-.L174:
-	.loc 1 1304 0
-	mov	w2, 1
-	str	w2, [x20, 80]
-	.loc 1 1305 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	.L94
-.LVL169:
+.L233:
+.LBE1016:
+.LBE1026:
+.LBE1028:
+.LBE1030:
+.LBE1187:
+.LBB1188:
+.LBB994:
+.LBB992:
+.LBB990:
+.LBB980:
+.LBB977:
+.LBB978:
+.LBB979:
+	.loc 7 106 0
+	ldr	x2, [x0]
+.LBE979:
+.LBE978:
+.LBE977:
+.LBE980:
+.LBE990:
+.LBE992:
+.LBE994:
+.LBE1188:
+	.loc 1 1202 0
+	mov	x0, x21
+.LVL189:
+.LBB1189:
+.LBB995:
+.LBB993:
+.LBB991:
+.LBB981:
+	.loc 6 84 0
+	tbz	x2, 26, .L125
+	b	.L124
+.LVL190:
 	.p2align 3
-.L177:
-	.loc 1 1278 0
-	mov	w2, 1
-	str	w2, [x20, 80]
-	.loc 1 1279 0
-	adrp	x0, .LANCHOR1
-	add	x0, x0, :lo12:.LANCHOR1
-	mov	w1, w2
-	add	x0, x0, 304
-	bl	__wake_up_sync
-.LVL170:
-	b	.L123
-.LVL171:
+.L241:
+.LBE981:
+.LBE991:
+.LBE993:
+.LBE995:
+.LBE1189:
+.LBB1190:
+.LBB1146:
+.LBB1142:
+.LBB1131:
+.LBB1128:
+.LBB1124:
+.LBB1125:
+.LBB1126:
+	.loc 7 106 0
+	ldr	x2, [x2]
+.LVL191:
+.LBE1126:
+.LBE1125:
+.LBE1124:
+.LBE1128:
+.LBE1131:
+.LBE1142:
+.LBE1146:
+.LBE1190:
+	.loc 1 1202 0
+	mov	x0, x21
+.LVL192:
+.LBB1191:
+.LBB1147:
+.LBB1143:
+.LBB1132:
+.LBB1129:
+	.loc 6 84 0
+	tbz	x2, 26, .L144
+	b	.L143
+.LVL193:
 	.p2align 3
-.L139:
-.LBB1020:
-.LBB911:
-.LBB907:
-.LBB896:
-.LBB897:
-.LBB898:
-.LBB899:
-.LBB900:
-	.loc 9 157 0
+.L239:
+.LBE1129:
+.LBE1132:
+.LBE1143:
+.LBE1147:
+.LBE1191:
+.LBB1192:
+.LBB1098:
+.LBB1094:
+.LBB1091:
+.LBB1080:
+.LBB1076:
+.LBB1077:
+.LBB1078:
+	.loc 7 106 0
+	ldr	x2, [x0]
+.LBE1078:
+.LBE1077:
+.LBE1076:
+.LBE1080:
+.LBE1091:
+.LBE1094:
+.LBE1098:
+.LBE1192:
+	.loc 1 1202 0
+	mov	x0, x21
+.LVL194:
+.LBB1193:
+.LBB1099:
+.LBB1095:
+.LBB1092:
+.LBB1081:
+	.loc 6 84 0
+	tbz	x2, 26, .L140
+	b	.L139
+.LVL195:
+	.p2align 3
+.L242:
+.LBE1081:
+.LBE1092:
+.LBE1095:
+.LBE1099:
+.LBE1193:
+.LBB1194:
+.LBB1182:
+.LBB1178:
+.LBB1167:
+.LBB1164:
+.LBB1160:
+.LBB1161:
+.LBB1162:
+	.loc 7 106 0
+	ldr	x2, [x2]
+.LVL196:
+.LBE1162:
+.LBE1161:
+.LBE1160:
+.LBE1164:
+.LBE1167:
+.LBE1178:
+.LBE1182:
+.LBE1194:
+	.loc 1 1202 0
+	mov	x0, x21
+.LVL197:
+.LBB1195:
+.LBB1183:
+.LBB1179:
+.LBB1168:
+.LBB1165:
+	.loc 6 84 0
+	tbz	x2, 26, .L121
+	b	.L120
+.LVL198:
+	.p2align 3
+.L238:
+.LBE1165:
+.LBE1168:
+.LBE1179:
+.LBE1183:
+.LBE1195:
+.LBB1196:
+.LBB1063:
+.LBB1060:
+.LBB1057:
+.LBB1046:
+.LBB1042:
+.LBB1043:
+.LBB1044:
+	.loc 7 106 0
+	ldr	x2, [x2]
+.LVL199:
+.LBE1044:
+.LBE1043:
+.LBE1042:
+.LBE1046:
+.LBE1057:
+.LBE1060:
+.LBE1063:
+.LBE1196:
+	.loc 1 1202 0
+	mov	x0, x21
+.LVL200:
+.LBB1197:
+.LBB1064:
+.LBB1061:
+.LBB1058:
+.LBB1047:
+	.loc 6 84 0
+	tbz	x2, 26, .L116
+	b	.L115
+.LVL201:
+	.p2align 3
+.L145:
+.LBE1047:
+.LBE1058:
+.LBE1061:
+.LBE1064:
+.LBE1197:
+.LBB1198:
+.LBB1148:
+.LBB1144:
+.LBB1133:
+.LBB1134:
+.LBB1135:
+.LBB1136:
+.LBB1137:
+	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL172:
-.LBE900:
-.LBE899:
-.LBE898:
-.LBB901:
-.LBB902:
+.LVL202:
+.LBE1137:
+.LBE1136:
+.LBE1135:
+.LBB1138:
+.LBB1139:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL173:
+.LVL203:
 #NO_APP
-.LBE902:
-.LBE901:
-.LBB903:
+.LBE1139:
+.LBE1138:
+.LBB1140:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL174:
-.LBE903:
+.LVL204:
+.LBE1140:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL175:
+.LVL205:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL176:
+.LVL206:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE897:
-.LBE896:
-	.loc 8 134 0
+.LBE1134:
+.LBE1133:
+	.loc 9 134 0
 	mov	x2, 44
 	add	x1, x29, 104
-.LVL177:
+.LVL207:
 	bl	__arch_copy_to_user
-.LVL178:
-.LBE907:
-.LBE911:
-.LBE1020:
+.LVL208:
+.LBE1144:
+.LBE1148:
+.LBE1198:
 	.loc 1 1332 0
-	cbz	x0, .L171
-	b	.L140
-.LVL179:
+	cbnz	x0, .L146
+.LBB1199:
+.LBB999:
+	mov	x22, 0
+	b	.L94
+.LVL209:
 	.p2align 3
-.L116:
-.LBB1021:
-.LBB874:
-.LBB870:
-.LBB859:
-.LBB860:
-.LBB861:
-.LBB862:
-.LBB863:
-	.loc 9 157 0
+.L122:
+.LBE999:
+.LBE1199:
+.LBB1200:
+.LBB1184:
+.LBB1180:
+.LBB1169:
+.LBB1170:
+.LBB1171:
+.LBB1172:
+.LBB1173:
+	.loc 8 157 0
 	sbfx	x1, x21, 0, 56
-.LVL180:
-.LBE863:
-.LBE862:
-.LBE861:
-.LBB864:
-.LBB865:
+.LVL210:
+.LBE1173:
+.LBE1172:
+.LBE1171:
+.LBB1174:
+.LBB1175:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL181:
+.LVL211:
 #NO_APP
-.LBE865:
-.LBE864:
-.LBB866:
+.LBE1175:
+.LBE1174:
+.LBB1176:
 	.loc 6 254 0
 	and	x1, x1, x21
-.LVL182:
-.LBE866:
+.LVL212:
+.LBE1176:
 	.loc 6 249 0
 	ldr	x2, [x0, 8]
-.LVL183:
+.LVL213:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL184:
+.LVL214:
 	.loc 6 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE860:
-.LBE859:
-	.loc 8 134 0
+.LBE1170:
+.LBE1169:
+	.loc 9 134 0
 	mov	x2, 44
 	add	x1, x29, 104
-.LVL185:
+.LVL215:
 	bl	__arch_copy_to_user
-.LVL186:
-.LBE870:
-.LBE874:
-.LBE1021:
+.LVL216:
+.LBE1180:
+.LBE1184:
+.LBE1200:
 	.loc 1 1255 0
-	cbz	w0, .L171
-	b	.L117
-.LVL187:
+	cbnz	w0, .L123
+.LBB1201:
+.LBB1000:
+	mov	x22, 0
+	b	.L94
+.LVL217:
+	.p2align 3
+.L127:
+.LBE1000:
+.LBE1201:
+	.loc 1 1263 0
+	mov	x22, -14
+	b	.L94
+.LVL218:
+	.p2align 3
+.L234:
+	.loc 1 1278 0
+	mov	w2, 1
+	str	w2, [x20, 80]
+	.loc 1 1279 0
+	adrp	x0, .LANCHOR1
+	add	x0, x0, :lo12:.LANCHOR1
+	mov	w1, w2
+	add	x0, x0, 304
+	bl	__wake_up_sync
+.LVL219:
+	b	.L129
 	.p2align 3
-.L178:
+.L235:
 	.loc 1 1281 0 discriminator 1
 	ldr	w0, [x20, 600]
-	cbz	w0, .L125
-	b	.L171
-.LVL188:
-.L150:
-.LBB1022:
-.LBB982:
-.LBB978:
-	.loc 8 112 0
+	cbz	w0, .L131
+.LBB1202:
+.LBB1001:
+	mov	x22, 0
+	b	.L94
+.LVL220:
+.L119:
+.LBE1001:
+.LBE1202:
+	.loc 1 1231 0
+	mov	x22, -1
+	b	.L94
+.LVL221:
+.L168:
+.LBB1203:
+.LBB1100:
+.LBB1096:
+	.loc 9 112 0
 	mov	x0, 4
-.LVL189:
-.L135:
-	.loc 8 119 0
+.LVL222:
+.L141:
+	.loc 9 119 0
 	mov	x2, x0
 	mov	w1, 0
-.LVL190:
+.LVL223:
 	add	x0, x22, x3
-.LVL191:
+.LVL224:
 	bl	memset
-.LVL192:
-.LBE978:
-.LBE982:
-.LBE1022:
+.LVL225:
+.LBE1096:
+.LBE1100:
+.LBE1203:
 	.loc 1 1320 0
 	ldr	x0, [x20, 272]
 	adrp	x1, .LC4
+	.loc 1 1321 0
+	mov	x22, -14
+	.loc 1 1320 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_err
-.LVL193:
+.LVL226:
 	.loc 1 1321 0
-	mov	x0, -14
-	b	.L94
-.L113:
-	.loc 1 1231 0
-	mov	x0, -1
 	b	.L94
-.L175:
-	.loc 1 1343 0
+.L232:
+	.loc 1 1399 0
 	bl	__stack_chk_fail
-.LVL194:
-.L176:
+.LVL227:
+.L240:
 	mov	x3, 4
 	sub	x3, x3, x0
-.LVL195:
-	b	.L135
+.LVL228:
+	b	.L141
 	.cfi_endproc
 .LFE2824:
 	.size	ebc_io_ctl, .-ebc_io_ctl
@@ -2080,14 +2434,14 @@ frame_done_callback:
 	ldr	x0, [x19, 216]
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
-	bhi	.L181
+	bhi	.L244
 	.loc 1 644 0
 	ldr	w0, [x19, 36]
-	cbz	w0, .L183
+	cbz	w0, .L246
 	.loc 1 645 0
 	ldr	x0, [x1, 8]
 	bl	wake_up_process
-.LVL196:
+.LVL229:
 	.loc 1 671 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
@@ -2101,11 +2455,11 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L181:
+.L244:
 	.cfi_restore_state
 	.loc 1 659 0
 	ldr	w0, [x19, 40]
-	cbnz	w0, .L187
+	cbnz	w0, .L250
 	.loc 1 665 0
 	ldr	x0, [x19, 88]
 	.loc 1 664 0
@@ -2123,19 +2477,19 @@ frame_done_callback:
 	add	x19, x19, :lo12:.LANCHOR1
 	.loc 1 665 0
 	bl	_dev_info
-.LVL197:
+.LVL230:
 	.loc 1 666 0
 	mov	w2, w20
 	add	x0, x19, 352
 	mov	w1, w20
 	bl	__wake_up_sync
-.LVL198:
+.LVL231:
 	.loc 1 667 0
 	mov	w2, w20
 	mov	w1, w20
 	add	x0, x19, 304
 	bl	__wake_up_sync
-.LVL199:
+.LVL232:
 	.loc 1 671 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
@@ -2149,7 +2503,7 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L183:
+.L246:
 	.cfi_restore_state
 	.loc 1 648 0
 	ldr	x0, [x19, 88]
@@ -2159,7 +2513,7 @@ frame_done_callback:
 	mov	w21, 1
 	.loc 1 648 0
 	bl	_dev_info
-.LVL200:
+.LVL233:
 	.loc 1 650 0
 	ldp	w2, w3, [x20, 108]
 	mov	w1, 0
@@ -2167,7 +2521,7 @@ frame_done_callback:
 	mul	w2, w2, w3
 	lsr	w2, w2, 4
 	bl	memset
-.LVL201:
+.LVL234:
 	.loc 1 651 0
 	adrp	x2, jiffies
 	add	x0, x20, 680
@@ -2175,7 +2529,7 @@ frame_done_callback:
 	ldr	x2, [x2, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL202:
+.LVL235:
 	.loc 1 653 0
 	str	w21, [x19, 76]
 	.loc 1 652 0
@@ -2187,13 +2541,13 @@ frame_done_callback:
 	mov	w1, w21
 	add	x0, x19, 352
 	bl	__wake_up_sync
-.LVL203:
+.LVL236:
 	.loc 1 655 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x19, 304
 	bl	__wake_up_sync
-.LVL204:
+.LVL237:
 	.loc 1 671 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
@@ -2207,7 +2561,7 @@ frame_done_callback:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L187:
+.L250:
 	.cfi_restore_state
 	.loc 1 661 0
 	ldr	x0, [x1, 8]
@@ -2216,7 +2570,7 @@ frame_done_callback:
 	str	w1, [x19, 28]
 	.loc 1 661 0
 	bl	wake_up_process
-.LVL205:
+.LVL238:
 	.loc 1 671 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
@@ -2238,7 +2592,7 @@ ebc_frame_timeout:
 .LFB2822:
 	.loc 1 1128 0
 	.cfi_startproc
-.LVL206:
+.LVL239:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
@@ -2247,7 +2601,7 @@ ebc_frame_timeout:
 	.cfi_def_cfa_register 29
 	.loc 1 1129 0
 	bl	frame_done_callback
-.LVL207:
+.LVL240:
 	.loc 1 1131 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -2264,7 +2618,7 @@ ebc_lut_update:
 .LFB2817:
 	.loc 1 674 0
 	.cfi_startproc
-.LVL208:
+.LVL241:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
@@ -2286,72 +2640,72 @@ ebc_lut_update:
 	.loc 1 674 0
 	adrp	x19, __stack_chk_guard
 	add	x0, x19, :lo12:__stack_chk_guard
-.LVL209:
+.LVL242:
 	.loc 1 680 0
 	ldr	x2, [x21, 16]
 	.loc 1 676 0
 	str	w3, [x1, -12]!
-.LVL210:
+.LVL243:
 	.loc 1 674 0
 	ldr	x3, [x0]
 	str	x3, [x29, 56]
 	mov	x3,0
-.LBB1023:
-.LBB1024:
+.LBB1204:
+.LBB1205:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL211:
+.LVL244:
 	mov	w20, w0
-.LBE1024:
-.LBE1023:
+.LBE1205:
+.LBE1204:
 	.loc 1 681 0
-	cbnz	w0, .L191
-.LVL212:
+	cbnz	w0, .L254
+.LVL245:
 	.loc 1 682 0
 	ldr	w2, [x29, 52]
 	.loc 1 683 0
 	add	x22, x21, 184
 	.loc 1 682 0
-	tbnz	w2, #31, .L214
+	tbnz	w2, #31, .L277
 	.loc 1 686 0
 	cmp	w2, 50
-	bgt	.L215
-.L193:
+	bgt	.L278
+.L256:
 	.loc 1 694 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC12
 	add	x1, x1, :lo12:.LC12
 	bl	_dev_info
-.LVL213:
+.LVL246:
 	.loc 1 697 0
 	ldr	x0, [x22, 216]
 	ldr	w0, [x0, 40]
 	cmp	w0, 17
-	bls	.L216
+	bls	.L279
 	.loc 1 744 0
 	ldr	w2, [x29, 52]
-.L213:
+.L276:
 	mov	w1, 7
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL214:
-	cbnz	w0, .L205
-.L208:
+.LVL247:
+	cbnz	w0, .L268
+.L271:
 	.loc 1 749 0
-	cbnz	w20, .L206
-.L190:
+	cbnz	w20, .L269
+.L253:
 	.loc 1 755 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	w0, w20
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L217
+	cbnz	x1, .L280
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL215:
+.LVL248:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -2362,68 +2716,68 @@ ebc_lut_update:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL216:
+.LVL249:
 	.p2align 3
-.L216:
+.L279:
 	.cfi_restore_state
 	.loc 1 697 0
-	adrp	x1, .L196
+	adrp	x1, .L259
 	.loc 1 699 0
 	ldr	w2, [x29, 52]
 	.loc 1 697 0
-	add	x1, x1, :lo12:.L196
+	add	x1, x1, :lo12:.L259
 	ldrb	w0, [x1,w0,uxtw]
-	adr	x1, .Lrtx196
+	adr	x1, .Lrtx259
 	add	x0, x1, w0, sxtb #2
 	br	x0
-.Lrtx196:
+.Lrtx259:
 	.section	.rodata
 	.align	0
 	.align	2
-.L196:
-	.byte	(.L195 - .Lrtx196) / 4
-	.byte	(.L195 - .Lrtx196) / 4
-	.byte	(.L213 - .Lrtx196) / 4
-	.byte	(.L198 - .Lrtx196) / 4
-	.byte	(.L199 - .Lrtx196) / 4
-	.byte	(.L200 - .Lrtx196) / 4
-	.byte	(.L201 - .Lrtx196) / 4
-	.byte	(.L213 - .Lrtx196) / 4
-	.byte	(.L198 - .Lrtx196) / 4
-	.byte	(.L199 - .Lrtx196) / 4
-	.byte	(.L200 - .Lrtx196) / 4
-	.byte	(.L201 - .Lrtx196) / 4
-	.byte	(.L202 - .Lrtx196) / 4
-	.byte	(.L203 - .Lrtx196) / 4
-	.byte	(.L204 - .Lrtx196) / 4
-	.byte	(.L213 - .Lrtx196) / 4
-	.byte	(.L213 - .Lrtx196) / 4
-	.byte	(.L213 - .Lrtx196) / 4
+.L259:
+	.byte	(.L258 - .Lrtx259) / 4
+	.byte	(.L258 - .Lrtx259) / 4
+	.byte	(.L276 - .Lrtx259) / 4
+	.byte	(.L261 - .Lrtx259) / 4
+	.byte	(.L262 - .Lrtx259) / 4
+	.byte	(.L263 - .Lrtx259) / 4
+	.byte	(.L264 - .Lrtx259) / 4
+	.byte	(.L276 - .Lrtx259) / 4
+	.byte	(.L261 - .Lrtx259) / 4
+	.byte	(.L262 - .Lrtx259) / 4
+	.byte	(.L263 - .Lrtx259) / 4
+	.byte	(.L264 - .Lrtx259) / 4
+	.byte	(.L265 - .Lrtx259) / 4
+	.byte	(.L266 - .Lrtx259) / 4
+	.byte	(.L267 - .Lrtx259) / 4
+	.byte	(.L276 - .Lrtx259) / 4
+	.byte	(.L276 - .Lrtx259) / 4
+	.byte	(.L276 - .Lrtx259) / 4
 	.text
 	.p2align 3
-.L204:
+.L267:
 	.loc 1 699 0
 	mov	w1, 1
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL217:
-	cbz	w0, .L208
+.LVL250:
+	cbz	w0, .L271
 	.p2align 2
-.L205:
+.L268:
 	.loc 1 688 0
 	mov	w20, -1
-.L206:
+.L269:
 	.loc 1 750 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC13
 	add	x1, x1, :lo12:.LC13
 	bl	_dev_err
-.LVL218:
+.LVL251:
 	.loc 1 751 0
-	b	.L190
-.LVL219:
+	b	.L253
+.LVL252:
 	.p2align 3
-.L191:
+.L254:
 	.loc 1 692 0
 	add	x22, x21, 184
 	mov	w2, w0
@@ -2431,101 +2785,101 @@ ebc_lut_update:
 	add	x1, x1, :lo12:.LC11
 	ldr	x0, [x22, 88]
 	bl	_dev_err
-.LVL220:
+.LVL253:
 	ldr	w2, [x29, 52]
-	b	.L193
+	b	.L256
 	.p2align 3
-.L215:
+.L278:
 	.loc 1 687 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC10
 	add	x1, x1, :lo12:.LC10
 	bl	_dev_err
-.LVL221:
+.LVL254:
 	.loc 1 688 0
 	mov	w2, 50
 	str	w2, [x29, 52]
-.LVL222:
-	b	.L193
+.LVL255:
+	b	.L256
 	.p2align 3
-.L199:
+.L262:
 	.loc 1 730 0
 	mov	w1, 9
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL223:
-	cbnz	w0, .L205
-	b	.L208
+.LVL256:
+	cbnz	w0, .L268
+	b	.L271
 	.p2align 3
-.L200:
+.L263:
 	.loc 1 735 0
 	mov	w1, 10
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL224:
-	cbnz	w0, .L205
-	b	.L208
+.LVL257:
+	cbnz	w0, .L268
+	b	.L271
 	.p2align 3
-.L201:
+.L264:
 	.loc 1 740 0
 	mov	w1, 11
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL225:
-	cbnz	w0, .L205
-	b	.L208
+.LVL258:
+	cbnz	w0, .L268
+	b	.L271
 	.p2align 3
-.L202:
+.L265:
 	.loc 1 716 0
 	mov	w1, 6
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL226:
-	cbnz	w0, .L205
-	b	.L208
+.LVL259:
+	cbnz	w0, .L268
+	b	.L271
 	.p2align 3
-.L195:
+.L258:
 	.loc 1 712 0
 	mov	w1, 5
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL227:
-	cbnz	w0, .L205
-	b	.L208
+.LVL260:
+	cbnz	w0, .L268
+	b	.L271
 	.p2align 3
-.L198:
+.L261:
 	.loc 1 725 0
 	mov	w1, 8
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL228:
-	cbnz	w0, .L205
-	b	.L208
+.LVL261:
+	cbnz	w0, .L268
+	b	.L271
 	.p2align 3
-.L203:
+.L266:
 	.loc 1 720 0
 	mov	w1, 4
 	add	x0, x21, 280
 	bl	epd_lut_get
-.LVL229:
-	cbnz	w0, .L205
-	b	.L208
+.LVL262:
+	cbnz	w0, .L268
+	b	.L271
 	.p2align 3
-.L214:
+.L277:
 	.loc 1 683 0
 	ldr	x0, [x22, 88]
 	adrp	x1, .LC10
 	add	x1, x1, :lo12:.LC10
 	bl	_dev_err
-.LVL230:
+.LVL263:
 	.loc 1 684 0
 	str	wzr, [x29, 52]
 	mov	w2, 0
-	b	.L193
-.L217:
+	b	.L256
+.L280:
 	.loc 1 755 0
 	bl	__stack_chk_fail
-.LVL231:
+.LVL264:
 	.cfi_endproc
 .LFE2817:
 	.size	ebc_lut_update, .-ebc_lut_update
@@ -2534,32 +2888,32 @@ ebc_lut_update:
 	.type	ebc_state_read, %function
 ebc_state_read:
 .LFB2833:
-	.loc 1 1467 0
+	.loc 1 1523 0
 	.cfi_startproc
-.LVL232:
+.LVL265:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1468 0
+	.loc 1 1524 0
 	adrp	x3, .LANCHOR0
-	.loc 1 1467 0
+	.loc 1 1523 0
 	mov	x0, x2
-.LVL233:
-	.loc 1 1468 0
+.LVL266:
+	.loc 1 1524 0
 	adrp	x1, .LC14
-.LVL234:
-	.loc 1 1467 0
+.LVL267:
+	.loc 1 1523 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1468 0
+	.loc 1 1524 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL235:
+.LVL268:
 	add	x1, x1, :lo12:.LC14
 	ldr	w2, [x2, 616]
 	bl	sprintf
-.LVL236:
-	.loc 1 1469 0
+.LVL269:
+	.loc 1 1525 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -2574,31 +2928,31 @@ ebc_state_read:
 	.type	ebc_version_read, %function
 ebc_version_read:
 .LFB2832:
-	.loc 1 1458 0
+	.loc 1 1514 0
 	.cfi_startproc
-.LVL237:
+.LVL270:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mov	x0, x2
-.LVL238:
-	.loc 1 1459 0
+.LVL271:
+	.loc 1 1515 0
 	adrp	x1, .LC16
-.LVL239:
+.LVL272:
 	adrp	x2, .LC15
-.LVL240:
-	.loc 1 1458 0
+.LVL273:
+	.loc 1 1514 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1459 0
+	.loc 1 1515 0
 	add	x2, x2, :lo12:.LC15
-	.loc 1 1458 0
-	.loc 1 1459 0
+	.loc 1 1514 0
+	.loc 1 1515 0
 	add	x1, x1, :lo12:.LC16
 	bl	sprintf
-.LVL241:
-	.loc 1 1460 0
+.LVL274:
+	.loc 1 1516 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -2613,49 +2967,49 @@ ebc_version_read:
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
 .LFB2830:
-	.loc 1 1422 0
+	.loc 1 1478 0
 	.cfi_startproc
-.LVL242:
+.LVL275:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 1423 0
+	.loc 1 1479 0
 	adrp	x0, .LANCHOR0
-.LVL243:
-	.loc 1 1422 0
+.LVL276:
+	.loc 1 1478 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1426 0
+	.loc 1 1482 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1422 0
+	.loc 1 1478 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1422 0
+	.loc 1 1478 0
 	mov	x19, x2
-	.loc 1 1426 0
+	.loc 1 1482 0
 	ldr	x1, [x0, 16]
-.LVL244:
-.LBB1025:
-.LBB1026:
+.LVL277:
+.LBB1206:
+.LBB1207:
 	.loc 3 55 0
 	mov	x0, x1
 	ldr	x1, [x1, 64]
 	blr	x1
-.LVL245:
-.LBE1026:
-.LBE1025:
-	.loc 1 1428 0
+.LVL278:
+.LBE1207:
+.LBE1206:
+	.loc 1 1484 0
 	mov	w2, w0
 	adrp	x1, .LC14
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC14
 	bl	sprintf
-.LVL246:
-	.loc 1 1429 0
+.LVL279:
+	.loc 1 1485 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL247:
+.LVL280:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -2670,65 +3024,65 @@ pmic_vcom_read:
 	.type	pmic_temp_read, %function
 pmic_temp_read:
 .LFB2829:
-	.loc 1 1408 0
+	.loc 1 1464 0
 	.cfi_startproc
-.LVL248:
+.LVL281:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 1409 0
+	.loc 1 1465 0
 	adrp	x0, .LANCHOR0
-.LVL249:
-	.loc 1 1408 0
+.LVL282:
+	.loc 1 1464 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1412 0
+	.loc 1 1468 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-.LBB1027:
-.LBB1028:
+.LBB1208:
+.LBB1209:
 	.loc 3 50 0
 	add	x1, x29, 36
-.LVL250:
-.LBE1028:
-.LBE1027:
-	.loc 1 1408 0
+.LVL283:
+.LBE1209:
+.LBE1208:
+	.loc 1 1464 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 1408 0
+	.loc 1 1464 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
-.LVL251:
-	.loc 1 1412 0
+.LVL284:
+	.loc 1 1468 0
 	ldr	x2, [x0, 16]
-.LBB1030:
-.LBB1029:
+.LBB1211:
+.LBB1210:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL252:
-.LBE1029:
-.LBE1030:
-	.loc 1 1414 0
+.LVL285:
+.LBE1210:
+.LBE1211:
+	.loc 1 1470 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC14
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC14
 	bl	sprintf
-.LVL253:
-	.loc 1 1415 0
+.LVL286:
+	.loc 1 1471 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L227
+	cbnz	x1, .L290
 	ldp	x19, x20, [sp, 16]
-.LVL254:
+.LVL287:
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -2738,11 +3092,11 @@ pmic_temp_read:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL255:
-.L227:
+.LVL288:
+.L290:
 	.cfi_restore_state
 	bl	__stack_chk_fail
-.LVL256:
+.LVL289:
 	.cfi_endproc
 .LFE2829:
 	.size	pmic_temp_read, .-pmic_temp_read
@@ -2751,33 +3105,33 @@ pmic_temp_read:
 	.type	pmic_name_read, %function
 pmic_name_read:
 .LFB2828:
-	.loc 1 1397 0
+	.loc 1 1453 0
 	.cfi_startproc
-.LVL257:
+.LVL290:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1398 0
+	.loc 1 1454 0
 	adrp	x3, .LANCHOR0
-	.loc 1 1397 0
+	.loc 1 1453 0
 	mov	x0, x2
-.LVL258:
-	.loc 1 1400 0
+.LVL291:
+	.loc 1 1456 0
 	adrp	x1, .LC16
-.LVL259:
-	.loc 1 1397 0
+.LVL292:
+	.loc 1 1453 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1400 0
+	.loc 1 1456 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL260:
+.LVL293:
 	add	x1, x1, :lo12:.LC16
 	ldr	x2, [x2, 16]
 	add	x2, x2, 8
 	bl	sprintf
-.LVL261:
-	.loc 1 1401 0
+.LVL294:
+	.loc 1 1457 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -2792,17 +3146,17 @@ pmic_name_read:
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
 .LFB2831:
-	.loc 1 1434 0
+	.loc 1 1490 0
 	.cfi_startproc
-.LVL262:
+.LVL295:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 1435 0
+	.loc 1 1491 0
 	adrp	x0, .LANCHOR0
-.LVL263:
-	.loc 1 1434 0
+.LVL296:
+	.loc 1 1490 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -2812,47 +3166,47 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 1434 0
+	.loc 1 1490 0
 	add	x1, x19, :lo12:__stack_chk_guard
-.LVL264:
+.LVL297:
 	mov	x21, x2
-	.loc 1 1435 0
+	.loc 1 1491 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
-.LVL265:
-	.loc 1 1434 0
+.LVL298:
+	.loc 1 1490 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
-.LVL266:
+.LVL299:
 	mov	x20, x3
-	.loc 1 1438 0
+	.loc 1 1494 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
-.LVL267:
-	.loc 1 1439 0
-	cbnz	w0, .L237
-.LVL268:
-	.loc 1 1443 0
+.LVL300:
+	.loc 1 1495 0
+	cbnz	w0, .L300
+.LVL301:
+	.loc 1 1499 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
-.LVL269:
-	.loc 1 1444 0
-	cbnz	w0, .L238
-.L230:
-	.loc 1 1450 0
+.LVL302:
+	.loc 1 1500 0
+	cbnz	w0, .L301
+.L293:
+	.loc 1 1506 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
-.LVL270:
+.LVL303:
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L239
+	cbnz	x1, .L302
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL271:
+.LVL304:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -2863,42 +3217,42 @@ pmic_vcom_write:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL272:
+.LVL305:
 	.p2align 3
-.L237:
+.L300:
 	.cfi_restore_state
-	.loc 1 1440 0
+	.loc 1 1496 0
 	ldr	x0, [x22]
 	adrp	x1, .LC17
 	mov	x2, x21
 	add	x1, x1, :lo12:.LC17
-	.loc 1 1441 0
+	.loc 1 1497 0
 	mov	x20, -1
-.LVL273:
-	.loc 1 1440 0
+.LVL306:
+	.loc 1 1496 0
 	bl	_dev_err
-.LVL274:
-	.loc 1 1441 0
-	b	.L230
-.LVL275:
+.LVL307:
+	.loc 1 1497 0
+	b	.L293
+.LVL308:
 	.p2align 3
-.L238:
-	.loc 1 1445 0
+.L301:
+	.loc 1 1501 0
 	ldr	x0, [x22]
 	adrp	x1, .LC18
-	.loc 1 1446 0
+	.loc 1 1502 0
 	mov	x20, -1
-.LVL276:
-	.loc 1 1445 0
+.LVL309:
+	.loc 1 1501 0
 	add	x1, x1, :lo12:.LC18
 	bl	_dev_err
-.LVL277:
-	.loc 1 1446 0
-	b	.L230
-.L239:
-	.loc 1 1450 0
+.LVL310:
+	.loc 1 1502 0
+	b	.L293
+.L302:
+	.loc 1 1506 0
 	bl	__stack_chk_fail
-.LVL278:
+.LVL311:
 	.cfi_endproc
 .LFE2831:
 	.size	pmic_vcom_write, .-pmic_vcom_write
@@ -2907,9 +3261,9 @@ pmic_vcom_write:
 	.type	waveform_version_read, %function
 waveform_version_read:
 .LFB2827:
-	.loc 1 1386 0
+	.loc 1 1442 0
 	.cfi_startproc
-.LVL279:
+.LVL312:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -2918,22 +3272,22 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1386 0
+	.loc 1 1442 0
 	mov	x19, x2
-	.loc 1 1387 0
+	.loc 1 1443 0
 	bl	epd_lut_get_wf_version
-.LVL280:
-	.loc 1 1389 0
+.LVL313:
+	.loc 1 1445 0
 	mov	x2, x0
 	adrp	x1, .LC16
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC16
 	bl	sprintf
-.LVL281:
-	.loc 1 1390 0
+.LVL314:
+	.loc 1 1446 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL282:
+.LVL315:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -2948,23 +3302,23 @@ waveform_version_read:
 	.type	ebc_init, %function
 ebc_init:
 .LFB2844:
-	.loc 1 1902 0
+	.loc 1 1958 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1903 0
+	.loc 1 1959 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 1902 0
+	.loc 1 1958 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1903 0
+	.loc 1 1959 0
 	bl	__platform_driver_register
-.LVL283:
-	.loc 1 1904 0
+.LVL316:
+	.loc 1 1960 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -2981,52 +3335,52 @@ direct_mode_data_change.isra.0:
 .LFB2846:
 	.loc 1 400 0
 	.cfi_startproc
-.LVL284:
+.LVL317:
 	.loc 1 404 0
 	adrp	x6, .LANCHOR0
 	.loc 1 400 0
 	and	w3, w3, 255
 	.loc 1 410 0
 	sub	w3, w3, w4
-.LVL285:
+.LVL318:
 	.loc 1 404 0
 	ldr	x13, [x6, #:lo12:.LANCHOR0]
 	.loc 1 411 0
 	lsl	w3, w3, 16
-.LVL286:
+.LVL319:
 	add	x5, x5, x3, sxtw
-.LVL287:
+.LVL320:
 	.loc 1 412 0
 	add	x13, x13, 24
 	ldr	w16, [x13, 156]
 	.loc 1 415 0
 	ldp	w3, w15, [x13, 84]
-.LVL288:
+.LVL321:
 	.loc 1 420 0
 	cmp	w15, 0
-	ble	.L256
+	ble	.L319
 	lsr	w14, w3, 4
 	mov	w12, 0
-.LVL289:
+.LVL322:
 	sub	w11, w14, #1
 	add	x11, x11, 1
 	lsl	x11, x11, 3
 	.loc 1 421 0
-	cbz	w16, .L259
-.LVL290:
-.L270:
+	cbz	w16, .L322
+.LVL323:
+.L333:
 	.loc 1 422 0
 	ldr	w6, [x13, 88]
-.LVL291:
+.LVL324:
 	sub	w6, w6, #1
 	sub	w6, w6, w12
 	mul	w6, w6, w3
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL292:
-.L260:
+.LVL325:
+.L323:
 	.loc 1 426 0
-	cbz	w14, .L268
+	cbz	w14, .L331
 	.loc 1 400 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
@@ -3034,20 +3388,20 @@ direct_mode_data_change.isra.0:
 	.cfi_offset 30, -8
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-.LVL293:
+.LVL326:
 	.p2align 2
-.L261:
+.L324:
 	.loc 1 426 0
 	mov	x7, 0
 	.p2align 2
-.L250:
+.L313:
 	.loc 1 428 0
 	ldr	x4, [x2, x7]
-.LVL294:
+.LVL327:
 	add	x6, x6, 4
 	.loc 1 427 0
 	ldr	x3, [x1, x7]
-.LVL295:
+.LVL328:
 	add	x7, x7, 8
 	.loc 1 430 0
 	and	w9, w4, 65535
@@ -3055,8 +3409,8 @@ direct_mode_data_change.isra.0:
 	cmp	x11, x7
 	.loc 1 430 0
 	and	w8, w3, 65535
-.LBB1031:
-.LBB1032:
+.LBB1212:
+.LBB1213:
 	.loc 1 130 0
 	ubfiz	w30, w9, 8, 8
 	.loc 1 131 0
@@ -3065,219 +3419,219 @@ direct_mode_data_change.isra.0:
 	add	w30, w30, w8, uxtb
 	.loc 1 131 0
 	add	w9, w9, w8, lsr 8
-.LBE1032:
-.LBE1031:
+.LBE1213:
+.LBE1212:
 	.loc 1 431 0
 	lsr	w10, w4, 16
 	lsr	w8, w3, 16
-.LBB1036:
-.LBB1037:
+.LBB1217:
+.LBB1218:
 	.loc 1 130 0
 	ubfiz	w18, w10, 8, 8
-.LBE1037:
-.LBE1036:
-.LBB1043:
-.LBB1033:
+.LBE1218:
+.LBE1217:
+.LBB1224:
+.LBB1214:
 	ldrb	w30, [x5, w30, sxtw]
-.LBE1033:
-.LBE1043:
-.LBB1044:
-.LBB1038:
+.LBE1214:
+.LBE1224:
+.LBB1225:
+.LBB1219:
 	.loc 1 131 0
 	and	w10, w10, 65280
-.LBE1038:
-.LBE1044:
-.LBB1045:
-.LBB1034:
+.LBE1219:
+.LBE1225:
+.LBB1226:
+.LBB1215:
 	ldrb	w17, [x5, w9, sxtw]
-.LBE1034:
-.LBE1045:
-.LBB1046:
-.LBB1039:
+.LBE1215:
+.LBE1226:
+.LBB1227:
+.LBB1220:
 	.loc 1 130 0
 	add	w18, w18, w8, uxtb
 	.loc 1 131 0
 	add	w10, w10, w8, lsr 8
-.LBE1039:
-.LBE1046:
+.LBE1220:
+.LBE1227:
 	.loc 1 432 0
 	ubfx	x9, x4, 32, 16
 	ubfx	x8, x3, 32, 16
 	.loc 1 433 0
 	lsr	x4, x4, 48
-.LVL296:
-.LBB1047:
-.LBB1035:
+.LVL329:
+.LBB1228:
+.LBB1216:
 	.loc 1 130 0
 	orr	w17, w30, w17, lsl 4
-.LBE1035:
-.LBE1047:
+.LBE1216:
+.LBE1228:
 	.loc 1 430 0
 	strb	w17, [x6, -4]
-.LBB1048:
-.LBB1049:
+.LBB1229:
+.LBB1230:
 	.loc 1 130 0
 	ubfiz	w17, w9, 8, 8
 	.loc 1 131 0
 	and	w9, w9, 65280
-.LBE1049:
-.LBE1048:
-.LBB1055:
-.LBB1040:
+.LBE1230:
+.LBE1229:
+.LBB1236:
+.LBB1221:
 	ldrb	w10, [x5, w10, sxtw]
-.LBE1040:
-.LBE1055:
-.LBB1056:
-.LBB1050:
+.LBE1221:
+.LBE1236:
+.LBB1237:
+.LBB1231:
 	.loc 1 130 0
 	add	w17, w17, w8, uxtb
-.LBE1050:
-.LBE1056:
-.LBB1057:
-.LBB1041:
+.LBE1231:
+.LBE1237:
+.LBB1238:
+.LBB1222:
 	ldrb	w18, [x5, w18, sxtw]
-.LBE1041:
-.LBE1057:
-.LBB1058:
-.LBB1051:
+.LBE1222:
+.LBE1238:
+.LBB1239:
+.LBB1232:
 	.loc 1 131 0
 	add	w8, w9, w8, lsr 8
-.LBE1051:
-.LBE1058:
+.LBE1232:
+.LBE1239:
 	.loc 1 433 0
 	lsr	x3, x3, 48
-.LVL297:
-.LBB1059:
-.LBB1042:
+.LVL330:
+.LBB1240:
+.LBB1223:
 	.loc 1 130 0
 	orr	w9, w18, w10, lsl 4
-.LBE1042:
-.LBE1059:
+.LBE1223:
+.LBE1240:
 	.loc 1 431 0
 	strb	w9, [x6, -3]
-.LBB1060:
-.LBB1061:
+.LBB1241:
+.LBB1242:
 	.loc 1 130 0
 	ubfiz	w9, w4, 8, 8
 	.loc 1 131 0
 	and	w4, w4, 65280
-.LBE1061:
-.LBE1060:
-.LBB1065:
-.LBB1052:
+.LBE1242:
+.LBE1241:
+.LBB1246:
+.LBB1233:
 	ldrb	w10, [x5, w8, sxtw]
-.LBE1052:
-.LBE1065:
-.LBB1066:
-.LBB1062:
+.LBE1233:
+.LBE1246:
+.LBB1247:
+.LBB1243:
 	.loc 1 130 0
 	add	w8, w9, w3, uxtb
-.LBE1062:
-.LBE1066:
-.LBB1067:
-.LBB1053:
+.LBE1243:
+.LBE1247:
+.LBB1248:
+.LBB1234:
 	ldrb	w17, [x5, w17, sxtw]
-.LBE1053:
-.LBE1067:
-.LBB1068:
-.LBB1063:
+.LBE1234:
+.LBE1248:
+.LBB1249:
+.LBB1244:
 	.loc 1 131 0
 	add	w3, w4, w3, lsr 8
-.LBE1063:
-.LBE1068:
-.LBB1069:
-.LBB1054:
+.LBE1244:
+.LBE1249:
+.LBB1250:
+.LBB1235:
 	.loc 1 130 0
 	orr	w4, w17, w10, lsl 4
-.LBE1054:
-.LBE1069:
+.LBE1235:
+.LBE1250:
 	.loc 1 432 0
 	strb	w4, [x6, -2]
-.LBB1070:
-.LBB1064:
+.LBB1251:
+.LBB1245:
 	.loc 1 131 0
 	ldrb	w3, [x5, w3, sxtw]
 	.loc 1 130 0
 	ldrb	w4, [x5, w8, sxtw]
 	orr	w3, w4, w3, lsl 4
-.LBE1064:
-.LBE1070:
+.LBE1245:
+.LBE1251:
 	.loc 1 433 0
 	strb	w3, [x6, -1]
 	.loc 1 426 0
-	bne	.L250
+	bne	.L313
 	.loc 1 420 0
 	add	w12, w12, 1
 	add	x1, x1, x11
-.LVL298:
+.LVL331:
 	add	x2, x2, x11
-.LVL299:
+.LVL332:
 	cmp	w15, w12
-	beq	.L244
-.L269:
+	beq	.L307
+.L332:
 	ldr	w3, [x13, 84]
 	.loc 1 421 0
-	cbz	w16, .L247
+	cbz	w16, .L310
 	.loc 1 422 0
 	ldr	w6, [x13, 88]
-.LVL300:
+.LVL333:
 	sub	w6, w6, #1
 	sub	w6, w6, w12
 	mul	w6, w6, w3
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL301:
+.LVL334:
 	.loc 1 426 0
-	cbnz	w14, .L261
-.L267:
+	cbnz	w14, .L324
+.L330:
 	.loc 1 420 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	bne	.L269
-.L244:
+	bne	.L332
+.L307:
 	.loc 1 436 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
-.LVL302:
-.L259:
+.LVL335:
+.L322:
 	.loc 1 424 0
 	mul	w6, w12, w3
-.LVL303:
+.LVL336:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL304:
-	b	.L260
-.LVL305:
+.LVL337:
+	b	.L323
+.LVL338:
 	.p2align 3
-.L247:
+.L310:
 	.cfi_def_cfa 29, 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mul	w6, w12, w3
-.LVL306:
+.LVL339:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL307:
+.LVL340:
 	.loc 1 426 0
-	cbnz	w14, .L261
-	b	.L267
-.LVL308:
-.L268:
+	cbnz	w14, .L324
+	b	.L330
+.LVL341:
+.L331:
 	.cfi_def_cfa 31, 0
 	.cfi_restore 29
 	.cfi_restore 30
 	.loc 1 420 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L256
+	beq	.L319
 	ldr	w3, [x13, 84]
 	.loc 1 421 0
-	cbz	w16, .L259
-	b	.L270
-.L256:
+	cbz	w16, .L322
+	b	.L333
+.L319:
 	ret
 	.cfi_endproc
 .LFE2846:
@@ -3289,71 +3643,71 @@ direct_mode_data_change_part.isra.1:
 .LFB2847:
 	.loc 1 438 0
 	.cfi_startproc
-.LVL309:
+.LVL342:
 	.loc 1 442 0
 	adrp	x6, .LANCHOR0
 	.loc 1 438 0
 	and	w3, w3, 255
 	.loc 1 447 0
 	sub	w3, w3, w4
-.LVL310:
+.LVL343:
 	.loc 1 442 0
 	ldr	x14, [x6, #:lo12:.LANCHOR0]
 	.loc 1 448 0
 	lsl	w3, w3, 16
-.LVL311:
+.LVL344:
 	add	x5, x5, x3, sxtw
-.LVL312:
+.LVL345:
 	.loc 1 449 0
 	add	x14, x14, 24
 	ldr	w16, [x14, 156]
 	.loc 1 452 0
 	ldp	w3, w15, [x14, 84]
-.LVL313:
+.LVL346:
 	.loc 1 457 0
 	cmp	w15, 0
-	ble	.L337
+	ble	.L400
 	lsr	w11, w3, 4
-.LVL314:
+.LVL347:
 	mov	w12, 0
-.LVL315:
+.LVL348:
 	sub	w13, w11, #1
-.LBB1071:
-.LBB1072:
+.LBB1252:
+.LBB1253:
 	.loc 1 136 0
 	mov	w10, 3
 	add	x13, x13, 1
 	lsl	x13, x13, 3
-.LBE1072:
-.LBE1071:
+.LBE1253:
+.LBE1252:
 	.loc 1 458 0
-	cbz	w16, .L340
-.LVL316:
-.L355:
+	cbz	w16, .L403
+.LVL349:
+.L418:
 	.loc 1 459 0
 	ldr	w6, [x14, 88]
-.LVL317:
+.LVL350:
 	sub	w6, w6, #1
 	sub	w6, w6, w12
 	mul	w6, w6, w3
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL318:
-.L341:
+.LVL351:
+.L404:
 	.loc 1 463 0
-	cbz	w11, .L343
+	cbz	w11, .L406
 	add	x6, x6, 4
-.LVL319:
+.LVL352:
 	mov	x8, 0
-.LVL320:
-.L344:
+.LVL353:
+.L407:
 	.loc 1 464 0
 	ldr	x3, [x1, x8, lsl 3]
 	.loc 1 465 0
 	ldr	x4, [x2, x8, lsl 3]
 	.loc 1 466 0
 	cmp	x3, x4
-	beq	.L353
+	beq	.L416
 	.loc 1 438 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
@@ -3361,22 +3715,22 @@ direct_mode_data_change_part.isra.1:
 	.cfi_offset 30, -8
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-.LVL321:
-.L345:
+.LVL354:
+.L408:
 	.loc 1 467 0
 	and	w17, w4, 65535
 	and	w9, w3, 65535
-.LVL322:
-.LBB1074:
-.LBB1075:
+.LVL355:
+.LBB1255:
+.LBB1256:
 	.loc 1 140 0
 	mov	w7, 0
 	.loc 1 139 0
 	cmp	w17, w9
-	beq	.L278
+	beq	.L341
 	.loc 1 137 0
 	eor	w18, w17, w9
-.LVL323:
+.LVL356:
 	.loc 1 150 0
 	ubfiz	w30, w17, 8, 8
 	.loc 1 151 0
@@ -3414,25 +3768,25 @@ direct_mode_data_change_part.isra.1:
 	.loc 1 150 0
 	and	w7, w9, w7
 	and	w7, w7, 255
-.LVL324:
-.L278:
-.LBE1075:
-.LBE1074:
+.LVL357:
+.L341:
+.LBE1256:
+.LBE1255:
 	.loc 1 467 0
 	strb	w7, [x6, -4]
 	.loc 1 468 0
 	lsr	w17, w4, 16
 	lsr	w9, w3, 16
-.LBB1076:
-.LBB1077:
+.LBB1257:
+.LBB1258:
 	.loc 1 140 0
 	mov	w7, 0
 	.loc 1 139 0
 	cmp	w17, w9
-	beq	.L283
+	beq	.L346
 	.loc 1 137 0
 	eor	w18, w17, w9
-.LVL325:
+.LVL358:
 	.loc 1 150 0
 	ubfiz	w30, w17, 8, 8
 	.loc 1 151 0
@@ -3470,25 +3824,25 @@ direct_mode_data_change_part.isra.1:
 	.loc 1 150 0
 	and	w7, w9, w7
 	and	w7, w7, 255
-.LVL326:
-.L283:
-.LBE1077:
-.LBE1076:
+.LVL359:
+.L346:
+.LBE1258:
+.LBE1257:
 	.loc 1 468 0
 	strb	w7, [x6, -3]
 	.loc 1 469 0
 	ubfx	x17, x4, 32, 16
 	ubfx	x9, x3, 32, 16
-.LBB1078:
-.LBB1079:
+.LBB1259:
+.LBB1260:
 	.loc 1 140 0
 	mov	w7, 0
 	.loc 1 139 0
 	cmp	w17, w9
-	beq	.L288
+	beq	.L351
 	.loc 1 137 0
 	eor	w18, w17, w9
-.LVL327:
+.LVL360:
 	.loc 1 150 0
 	ubfiz	w30, w17, 8, 8
 	.loc 1 151 0
@@ -3526,27 +3880,27 @@ direct_mode_data_change_part.isra.1:
 	.loc 1 150 0
 	and	w7, w9, w7
 	and	w7, w7, 255
-.LVL328:
-.L288:
-.LBE1079:
-.LBE1078:
+.LVL361:
+.L351:
+.LBE1260:
+.LBE1259:
 	.loc 1 469 0
 	strb	w7, [x6, -2]
 	.loc 1 470 0
 	lsr	x4, x4, 48
-.LVL329:
+.LVL362:
 	lsr	x3, x3, 48
-.LVL330:
-.LBB1080:
-.LBB1073:
+.LVL363:
+.LBB1261:
+.LBB1254:
 	.loc 1 140 0
 	mov	w7, 0
 	.loc 1 139 0
 	cmp	w4, w3
-	beq	.L293
+	beq	.L356
 	.loc 1 137 0
 	eor	w9, w4, w3
-.LVL331:
+.LVL364:
 	.loc 1 150 0
 	ubfiz	w7, w4, 8, 8
 	.loc 1 151 0
@@ -3562,7 +3916,7 @@ direct_mode_data_change_part.isra.1:
 	.loc 1 144 0
 	tst	w9, 240
 	orr	w18, w4, 12
-.LVL332:
+.LVL365:
 	.loc 1 150 0
 	ldrb	w17, [x5, w7, sxtw]
 	.loc 1 144 0
@@ -3585,66 +3939,66 @@ direct_mode_data_change_part.isra.1:
 	.loc 1 150 0
 	and	w4, w7, w4
 	and	w7, w4, 255
-.LVL333:
-.L293:
-.LBE1073:
-.LBE1080:
+.LVL366:
+.L356:
+.LBE1254:
+.LBE1261:
 	.loc 1 470 0
 	strb	w7, [x6, -1]
 	add	x8, x8, 1
 	add	x6, x6, 4
 	.loc 1 463 0
 	cmp	w11, w8
-	ble	.L354
-.LVL334:
-.L299:
+	ble	.L417
+.LVL367:
+.L362:
 	.loc 1 464 0
 	ldr	x3, [x1, x8, lsl 3]
 	.loc 1 465 0
 	ldr	x4, [x2, x8, lsl 3]
 	.loc 1 466 0
 	cmp	x3, x4
-	bne	.L345
+	bne	.L408
 	.loc 1 473 0
 	str	wzr, [x6, -4]
 	add	x8, x8, 1
 	add	x6, x6, 4
 	.loc 1 463 0
 	cmp	w11, w8
-	bgt	.L299
-.L354:
+	bgt	.L362
+.L417:
 	add	x1, x1, x13
-.LVL335:
+.LVL368:
 	add	x2, x2, x13
-.LVL336:
-.L276:
+.LVL369:
+.L339:
 	.loc 1 457 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L271
+	beq	.L334
 	ldr	w3, [x14, 84]
-.LVL337:
+.LVL370:
 	.loc 1 458 0
-	cbz	w16, .L274
+	cbz	w16, .L337
 	.loc 1 459 0
 	ldr	w6, [x14, 88]
-.LVL338:
+.LVL371:
 	sub	w6, w6, #1
 	sub	w6, w6, w12
 	mul	w6, w6, w3
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL339:
-.L275:
+.LVL372:
+.L338:
 	.loc 1 463 0
-	cbz	w11, .L276
+	cbz	w11, .L339
 	add	x6, x6, 4
-.LVL340:
+.LVL373:
 	mov	x8, 0
-	b	.L299
-.LVL341:
+	b	.L362
+.LVL374:
 	.p2align 3
-.L353:
+.L416:
 	.cfi_def_cfa 31, 0
 	.cfi_restore 29
 	.cfi_restore 30
@@ -3654,50 +4008,50 @@ direct_mode_data_change_part.isra.1:
 	.loc 1 463 0
 	cmp	w11, w8
 	add	x6, x6, 4
-	bgt	.L344
+	bgt	.L407
 	add	x1, x1, x13
-.LVL342:
+.LVL375:
 	add	x2, x2, x13
-.LVL343:
-.L343:
+.LVL376:
+.L406:
 	.loc 1 457 0
 	add	w12, w12, 1
 	cmp	w15, w12
-	beq	.L337
+	beq	.L400
 	ldr	w3, [x14, 84]
-.LVL344:
+.LVL377:
 	.loc 1 458 0
-	cbnz	w16, .L355
-.L340:
+	cbnz	w16, .L418
+.L403:
 	.loc 1 461 0
 	mul	w6, w12, w3
-.LVL345:
+.LVL378:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL346:
-	b	.L341
-.LVL347:
+.LVL379:
+	b	.L404
+.LVL380:
 	.p2align 3
-.L274:
+.L337:
 	.cfi_def_cfa 29, 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mul	w6, w12, w3
-.LVL348:
+.LVL381:
 	lsr	w6, w6, 2
 	add	x6, x0, x6
-.LVL349:
-	b	.L275
-.LVL350:
-.L271:
+.LVL382:
+	b	.L338
+.LVL383:
+.L334:
 	.loc 1 478 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_def_cfa 31, 0
 	ret
-.LVL351:
-.L337:
+.LVL384:
+.L400:
 	ret
 	.cfi_endproc
 .LFE2847:
@@ -3709,7 +4063,7 @@ flip.isra.2:
 .LFB2848:
 	.loc 1 480 0
 	.cfi_startproc
-.LVL352:
+.LVL385:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -3728,52 +4082,52 @@ flip.isra.2:
 	ldr	w19, [x0, 72]
 	.loc 1 484 0
 	ldr	x0, [x0]
-.LVL353:
-.LBB1081:
-.LBB1082:
-.LBB1083:
-.LBB1084:
+.LVL386:
+.LBB1262:
+.LBB1263:
+.LBB1264:
+.LBB1265:
 	.file 10 "./include/linux/dma-mapping.h"
 	.loc 10 266 0
-	cbz	x0, .L359
+	cbz	x0, .L422
 	ldr	x3, [x0, 648]
 	.loc 10 268 0
 	adrp	x4, dummy_dma_ops
 	add	x4, x4, :lo12:dummy_dma_ops
 	cmp	x3, 0
 	csel	x3, x4, x3, eq
-.L357:
-.LBE1084:
-.LBE1083:
+.L420:
+.LBE1265:
+.LBE1264:
 	.loc 10 434 0
 	ldr	x5, [x3, 88]
 	sxtw	x19, w19
-	cbz	x5, .L358
-.LBE1082:
-.LBE1081:
+	cbz	x5, .L421
+.LBE1263:
+.LBE1262:
 	.loc 1 484 0
 	add	x4, x19, x19, lsl 1
-.LBB1090:
-.LBB1087:
+.LBB1271:
+.LBB1268:
 	.loc 10 435 0
 	mov	w3, 1
-.LBE1087:
-.LBE1090:
+.LBE1268:
+.LBE1271:
 	.loc 1 484 0
 	add	x4, x20, x4, lsl 3
-.LBB1091:
-.LBB1088:
+.LBB1272:
+.LBB1269:
 	.loc 10 435 0
 	ldr	x1, [x4, 32]
 	blr	x5
-.LVL354:
-.L358:
-.LBE1088:
-.LBE1091:
+.LVL387:
+.L421:
+.LBE1269:
+.LBE1272:
 	.loc 1 485 0
 	ldr	x5, [x20, 8]
-.LBB1092:
-.LBB1093:
+.LBB1273:
+.LBB1274:
 	.file 11 "drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.h"
 	.loc 11 57 0
 	mov	w4, 0
@@ -3781,50 +4135,50 @@ flip.isra.2:
 	mov	w2, 0
 	mov	x0, x5
 	mov	w1, 0
-.LBE1093:
-.LBE1092:
+.LBE1274:
+.LBE1273:
 	.loc 1 486 0
 	add	x19, x19, x19, lsl 1
-.LBB1096:
-.LBB1094:
+.LBB1277:
+.LBB1275:
 	.loc 11 57 0
 	ldr	x5, [x5, 64]
-.LBE1094:
-.LBE1096:
+.LBE1275:
+.LBE1277:
 	.loc 1 486 0
 	add	x19, x20, x19, lsl 3
-.LBB1097:
-.LBB1095:
+.LBB1278:
+.LBB1276:
 	.loc 11 57 0
 	blr	x5
-.LVL355:
-.LBE1095:
-.LBE1097:
+.LVL388:
+.LBE1276:
+.LBE1278:
 	.loc 1 486 0
 	ldr	x1, [x20, 8]
-.LBB1098:
-.LBB1099:
+.LBB1279:
+.LBB1280:
 	.loc 11 62 0
 	mov	w2, 0
 	mov	x0, x1
 	ldr	x3, [x1, 72]
 	ldr	w1, [x19, 32]
 	blr	x3
-.LVL356:
-.LBE1099:
-.LBE1098:
+.LVL389:
+.LBE1280:
+.LBE1279:
 	.loc 1 487 0
 	ldr	x2, [x20, 8]
-.LBB1100:
-.LBB1101:
+.LBB1281:
+.LBB1282:
 	.loc 11 77 0
 	mov	w1, 1
 	mov	x0, x2
 	ldr	x2, [x2, 96]
 	blr	x2
-.LVL357:
-.LBE1101:
-.LBE1100:
+.LVL390:
+.LBE1282:
+.LBE1281:
 	.loc 1 488 0
 	ldr	w1, [x20, 72]
 	mov	w0, 1
@@ -3832,7 +4186,7 @@ flip.isra.2:
 	str	w0, [x20, 72]
 	.loc 1 489 0
 	ldp	x19, x20, [sp, 16]
-.LVL358:
+.LVL391:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -3841,22 +4195,22 @@ flip.isra.2:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL359:
+.LVL392:
 	.p2align 3
-.L359:
+.L422:
 	.cfi_restore_state
-.LBB1102:
-.LBB1089:
-.LBB1086:
-.LBB1085:
+.LBB1283:
+.LBB1270:
+.LBB1267:
+.LBB1266:
 	.loc 10 268 0
 	adrp	x3, dummy_dma_ops
 	add	x3, x3, :lo12:dummy_dma_ops
-	b	.L357
-.LBE1085:
-.LBE1086:
-.LBE1089:
-.LBE1102:
+	b	.L420
+.LBE1266:
+.LBE1267:
+.LBE1270:
+.LBE1283:
 	.cfi_endproc
 .LFE2848:
 	.size	flip.isra.2, .-flip.isra.2
@@ -3867,7 +4221,7 @@ ebc_frame_start:
 .LFB2814:
 	.loc 1 498 0
 	.cfi_startproc
-.LVL360:
+.LVL393:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
@@ -3889,43 +4243,43 @@ ebc_frame_start:
 	.loc 1 502 0
 	ldr	x1, [x19, 216]
 	ldr	w0, [x1, 40]
-.LVL361:
+.LVL394:
 	cmp	w0, 1
-	beq	.L366
-	bgt	.L367
-	cbnz	w0, .L365
+	beq	.L429
+	bgt	.L430
+	cbnz	w0, .L428
 	.loc 1 517 0
 	ldr	x0, [x19, 176]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 128]
 	ldr	x3, [x19, 160]
 	bl	get_auto_image
-.LVL362:
+.LVL395:
 	.loc 1 522 0
 	ldr	w0, [x19, 36]
-	cbz	w0, .L372
-.LBB1103:
-.LBB1104:
+	cbz	w0, .L435
+.LBB1284:
+.LBB1285:
 	.loc 1 493 0
 	str	wzr, [x21, 72]
 	.loc 1 494 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.2
-.LVL363:
-.LBE1104:
-.LBE1103:
+.LVL396:
+.LBE1285:
+.LBE1284:
 	.loc 1 524 0
 	ldp	x1, x2, [x19, 128]
 	mov	x4, x19
 	ldr	x3, [x19, 160]
 	ldr	x0, [x19, 184]
 	bl	get_auto_image
-.LVL364:
-.L364:
+.LVL397:
+.L427:
 	.loc 1 567 0
 	ldp	x19, x20, [sp, 16]
-.LVL365:
+.LVL398:
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -3936,14 +4290,14 @@ ebc_frame_start:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL366:
+.LVL399:
 	.p2align 3
-.L367:
+.L430:
 	.cfi_restore_state
 	.loc 1 502 0
 	sub	w0, w0, #7
 	cmp	w0, 4
-	bhi	.L365
+	bhi	.L428
 	.loc 1 542 0
 	ldr	x2, [x19, 208]
 	.loc 1 539 0
@@ -3956,18 +4310,18 @@ ebc_frame_start:
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change_part.isra.1
-.LVL367:
-.LBB1105:
-.LBB1106:
+.LVL400:
+.LBB1286:
+.LBB1287:
 	.loc 1 493 0
 	str	wzr, [x21, 72]
 	.loc 1 494 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.2
-.LVL368:
-.LBE1106:
-.LBE1105:
+.LVL401:
+.LBE1287:
+.LBE1286:
 	.loc 1 545 0
 	ldr	w4, [x19, 40]
 	.loc 1 547 0
@@ -3982,11 +4336,11 @@ ebc_frame_start:
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part.isra.1
-.LVL369:
+.LVL402:
 	.loc 1 567 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL370:
+.LVL403:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -3996,9 +4350,9 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL371:
+.LVL404:
 	.p2align 3
-.L366:
+.L429:
 	.cfi_restore_state
 	.loc 1 504 0
 	ldr	x0, [x19, 176]
@@ -4006,25 +4360,25 @@ ebc_frame_start:
 	ldp	x1, x2, [x19, 128]
 	ldr	x3, [x19, 160]
 	bl	get_auto_image
-.LVL372:
+.LVL405:
 	.loc 1 509 0
 	ldr	w0, [x19, 36]
-	cbz	w0, .L370
-.LBB1107:
-.LBB1108:
+	cbz	w0, .L433
+.LBB1288:
+.LBB1289:
 	.loc 1 493 0
 	str	wzr, [x21, 72]
 	.loc 1 494 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.2
-.LVL373:
-.LBE1108:
-.LBE1107:
+.LVL406:
+.LBE1289:
+.LBE1288:
 	.loc 1 567 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL374:
+.LVL407:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -4034,9 +4388,9 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL375:
+.LVL408:
 	.p2align 3
-.L365:
+.L428:
 	.cfi_restore_state
 	.loc 1 555 0
 	ldr	x2, [x19, 208]
@@ -4050,18 +4404,18 @@ ebc_frame_start:
 	ldr	x2, [x2, 16]
 	ldr	x1, [x1, 16]
 	bl	direct_mode_data_change.isra.0
-.LVL376:
-.LBB1109:
-.LBB1110:
+.LVL409:
+.LBB1290:
+.LBB1291:
 	.loc 1 493 0
 	str	wzr, [x21, 72]
 	.loc 1 494 0
 	mov	x0, x21
 	ldr	w1, [x20, 208]
 	bl	flip.isra.2
-.LVL377:
-.LBE1110:
-.LBE1109:
+.LVL410:
+.LBE1291:
+.LBE1290:
 	.loc 1 558 0
 	ldr	w4, [x19, 40]
 	.loc 1 560 0
@@ -4076,11 +4430,11 @@ ebc_frame_start:
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change.isra.0
-.LVL378:
+.LVL411:
 	.loc 1 567 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
-.LVL379:
+.LVL412:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 20
@@ -4090,8 +4444,8 @@ ebc_frame_start:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL380:
-.L372:
+.LVL413:
+.L435:
 	.cfi_restore_state
 	.loc 1 530 0
 	adrp	x1, .LANCHOR3
@@ -4099,21 +4453,21 @@ ebc_frame_start:
 	add	x1, x1, :lo12:.LANCHOR3
 	add	x0, x0, :lo12:.LC20
 	bl	printk
-.LVL381:
+.LVL414:
 	.loc 1 531 0
 	str	wzr, [x19, 28]
-	b	.L364
-.L370:
+	b	.L427
+.L433:
 	.loc 1 512 0
 	adrp	x1, .LANCHOR3
 	adrp	x0, .LC19
 	add	x1, x1, :lo12:.LANCHOR3
 	add	x0, x0, :lo12:.LC19
 	bl	printk
-.LVL382:
+.LVL415:
 	.loc 1 513 0
 	str	wzr, [x19, 28]
-	b	.L364
+	b	.L427
 	.cfi_endproc
 .LFE2814:
 	.size	ebc_frame_start, .-ebc_frame_start
@@ -4124,7 +4478,7 @@ ebc_auto_tast_function:
 .LFB2815:
 	.loc 1 570 0
 	.cfi_startproc
-.LVL383:
+.LVL416:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
@@ -4133,7 +4487,7 @@ ebc_auto_tast_function:
 	adrp	x1, .LANCHOR0
 	.loc 1 570 0
 	adrp	x0, __stack_chk_guard
-.LVL384:
+.LVL417:
 	add	x0, x0, :lo12:__stack_chk_guard
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -4148,22 +4502,22 @@ ebc_auto_tast_function:
 	.cfi_offset 22, -56
 	.loc 1 571 0
 	ldr	x22, [x1, #:lo12:.LANCHOR0]
-.LVL385:
+.LVL418:
 	.loc 1 576 0
 	add	x20, x20, 376
 	.loc 1 570 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
-.LBB1111:
-.LBB1112:
-.LBB1113:
+.LBB1292:
+.LBB1293:
+.LBB1294:
 	.file 12 "./include/linux/compiler.h"
 	.loc 12 234 0
 	mov	x24, 2
-.LBE1113:
-.LBE1112:
-.LBE1111:
+.LBE1294:
+.LBE1293:
+.LBE1292:
 	.loc 1 570 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -32
@@ -4178,29 +4532,29 @@ ebc_auto_tast_function:
 	str	x1, [x29, 88]
 	mov	x1,0
 	adrp	x25, system_wq
-.LBB1118:
-.LBB1115:
-.LBB1116:
+.LBB1299:
+.LBB1296:
+.LBB1297:
 	.loc 5 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x23, sp_el0
 // 0 "" 2
-.LVL386:
+.LVL419:
 #NO_APP
-	b	.L385
+	b	.L448
 	.p2align 3
-.L393:
-.LBE1116:
-.LBE1115:
-.LBE1118:
+.L456:
+.LBE1297:
+.LBE1296:
+.LBE1299:
 	.loc 1 581 0
-	cbnz	w0, .L376
+	cbnz	w0, .L439
 	.loc 1 591 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
 	bl	flip.isra.2
-.LVL387:
+.LVL420:
 	.loc 1 592 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
@@ -4209,34 +4563,34 @@ ebc_auto_tast_function:
 	ldr	x3, [x19, 160]
 	ldr	x0, [x19, x0, lsl 3]
 	bl	get_auto_image
-.LVL388:
-.L381:
+.LVL421:
+.L444:
 	.loc 1 625 0
 	ldr	x0, [x19, 216]
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
-	bls	.L392
-.L384:
+	bls	.L455
+.L447:
 	.loc 1 629 0
 	mov	x0, x20
 	bl	up
-.LVL389:
+.LVL422:
 	.loc 1 630 0
 	bl	schedule
-.LVL390:
-.L385:
+.LVL423:
+.L448:
 	.loc 1 576 0
 	mov	x0, x20
 	bl	down
-.LVL391:
-.LBB1119:
-.LBB1117:
-.LBB1114:
+.LVL424:
+.LBB1300:
+.LBB1298:
+.LBB1295:
 	.loc 12 234 0
 	str	x24, [x23, 32]
-.LBE1114:
-.LBE1117:
-.LBE1119:
+.LBE1295:
+.LBE1298:
+.LBE1300:
 	.loc 1 580 0
 #APP
 // 580 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
@@ -4247,11 +4601,11 @@ ebc_auto_tast_function:
 	ldr	x0, [x19, 216]
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
-	beq	.L377
-	ble	.L393
+	beq	.L440
+	ble	.L456
 	sub	w0, w0, #7
 	cmp	w0, 4
-	bhi	.L376
+	bhi	.L439
 	.loc 1 603 0
 	ldr	w1, [x19, 40]
 	.loc 1 604 0
@@ -4262,10 +4616,10 @@ ebc_auto_tast_function:
 	.loc 1 604 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.2
-.LVL392:
+.LVL425:
 	.loc 1 605 0
 	ldr	w4, [x19, 40]
-	cbz	w4, .L381
+	cbz	w4, .L444
 	.loc 1 607 0
 	ldrsw	x0, [x21, 72]
 	.loc 1 608 0
@@ -4278,32 +4632,32 @@ ebc_auto_tast_function:
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part.isra.1
-.LVL393:
+.LVL426:
 	.loc 1 625 0
 	ldr	x0, [x19, 216]
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
-	bhi	.L384
+	bhi	.L447
 	.p2align 2
-.L392:
-.LBB1120:
-.LBB1121:
-.LBB1122:
-.LBB1123:
+.L455:
+.LBB1301:
+.LBB1302:
+.LBB1303:
+.LBB1304:
 	.file 13 "./include/linux/workqueue.h"
 	.loc 13 518 0
 	ldr	x1, [x25, #:lo12:system_wq]
 	mov	x2, x26
 	mov	w0, 8
 	bl	queue_work_on
-.LVL394:
-	b	.L384
+.LVL427:
+	b	.L447
 	.p2align 3
-.L377:
-.LBE1123:
-.LBE1122:
-.LBE1121:
-.LBE1120:
+.L440:
+.LBE1304:
+.LBE1303:
+.LBE1302:
+.LBE1301:
 	.loc 1 583 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
@@ -4312,16 +4666,16 @@ ebc_auto_tast_function:
 	ldr	x3, [x19, 160]
 	ldr	x0, [x19, x0, lsl 3]
 	bl	get_auto_image
-.LVL395:
+.LVL428:
 	.loc 1 588 0
 	ldr	w1, [x22, 208]
 	mov	x0, x21
 	bl	flip.isra.2
-.LVL396:
+.LVL429:
 	.loc 1 589 0
-	b	.L381
+	b	.L444
 	.p2align 3
-.L376:
+.L439:
 	.loc 1 613 0
 	ldr	w1, [x19, 40]
 	.loc 1 614 0
@@ -4332,10 +4686,10 @@ ebc_auto_tast_function:
 	.loc 1 614 0
 	ldr	w1, [x22, 208]
 	bl	flip.isra.2
-.LVL397:
+.LVL430:
 	.loc 1 615 0
 	ldr	w4, [x19, 40]
-	cbz	w4, .L381
+	cbz	w4, .L444
 	.loc 1 617 0
 	ldrsw	x0, [x21, 72]
 	.loc 1 618 0
@@ -4348,9 +4702,9 @@ ebc_auto_tast_function:
 	ldr	x1, [x1, 16]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change.isra.0
-.LVL398:
+.LVL431:
 	.loc 1 621 0
-	b	.L381
+	b	.L444
 	.cfi_endproc
 .LFE2815:
 	.size	ebc_auto_tast_function, .-ebc_auto_tast_function
@@ -4361,7 +4715,7 @@ ebc_power_set.part.3:
 .LFB2849:
 	.loc 1 180 0
 	.cfi_startproc
-.LVL399:
+.LVL432:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
@@ -4381,66 +4735,66 @@ ebc_power_set.part.3:
 	mov	w21, w1
 	.loc 1 185 0
 	mov	x0, 1
-.LVL400:
+.LVL433:
 	bl	ebc_notify
-.LVL401:
+.LVL434:
 	.loc 1 186 0
 	ldr	w0, [x20, 432]
-	cbnz	w0, .L395
+	cbnz	w0, .L458
 	.loc 1 187 0
 	mov	w0, 1
 	str	w0, [x20, 432]
-.LBB1124:
-.LBB1125:
+.LBB1305:
+.LBB1306:
 	.loc 4 58 0
 	add	x0, x19, 408
 	bl	__pm_stay_awake
-.LVL402:
-.L395:
-.LBE1125:
-.LBE1124:
+.LVL435:
+.L458:
+.LBE1306:
+.LBE1305:
 	.loc 1 190 0
 	str	w21, [x20, 192]
-.LBB1126:
-.LBB1127:
+.LBB1307:
+.LBB1308:
 	.loc 11 46 0
 	add	x1, x19, 24
-.LBE1127:
-.LBE1126:
+.LBE1308:
+.LBE1307:
 	.loc 1 191 0
 	ldr	x2, [x19, 8]
-.LBB1129:
-.LBB1128:
+.LBB1310:
+.LBB1309:
 	.loc 11 46 0
 	mov	x0, x2
 	ldr	x2, [x2, 48]
 	blr	x2
-.LVL403:
-.LBE1128:
-.LBE1129:
+.LVL436:
+.LBE1309:
+.LBE1310:
 	.loc 1 192 0
 	ldr	x2, [x19, 16]
-.LBB1130:
-.LBB1131:
+.LBB1311:
+.LBB1312:
 	.loc 3 30 0
 	mov	w1, 1
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL404:
-.LBE1131:
-.LBE1130:
+.LVL437:
+.LBE1312:
+.LBE1311:
 	.loc 1 193 0
 	ldr	x0, [x19]
 	adrp	x1, .LC21
 	add	x1, x1, :lo12:.LC21
 	bl	_dev_info
-.LVL405:
+.LVL438:
 	.loc 1 208 0
 	ldr	x21, [sp, 32]
-.LVL406:
+.LVL439:
 	ldp	x19, x20, [sp, 16]
-.LVL407:
+.LVL440:
 	ldp	x29, x30, [sp], 48
 	.cfi_restore 30
 	.cfi_restore 29
@@ -4457,36 +4811,36 @@ ebc_power_set.part.3:
 	.type	ebc_probe, %function
 ebc_probe:
 .LFB2840:
-	.loc 1 1737 0
+	.loc 1 1793 0
 	.cfi_startproc
-.LVL408:
+.LVL441:
 	stp	x29, x30, [sp, -208]!
 	.cfi_def_cfa_offset 208
 	.cfi_offset 29, -208
 	.cfi_offset 30, -200
-.LBB1279:
-.LBB1280:
+.LBB1460:
+.LBB1461:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
-.LBE1280:
-.LBE1279:
-	.loc 1 1737 0
+.LBE1461:
+.LBE1460:
+	.loc 1 1793 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -192
 	.cfi_offset 20, -184
-	.loc 1 1738 0
+	.loc 1 1794 0
 	add	x20, x0, 16
-	.loc 1 1737 0
+	.loc 1 1793 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -160
 	.cfi_offset 24, -152
 	adrp	x23, __stack_chk_guard
 	stp	x21, x22, [sp, 32]
 	add	x0, x23, :lo12:__stack_chk_guard
-.LVL409:
+.LVL442:
 	stp	x25, x26, [sp, 64]
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 21, -176
@@ -4495,157 +4849,157 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 1737 0
+	.loc 1 1793 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
-.LBB1282:
-.LBB1281:
+.LBB1463:
+.LBB1462:
 	.loc 2 711 0
 	mov	x0, x20
 	mov	x1, 808
 	bl	devm_kmalloc
-.LVL410:
-.LBE1281:
-.LBE1282:
-	.loc 1 1749 0
-	cbz	x0, .L442
-	.loc 1 1753 0
+.LVL443:
+.LBE1462:
+.LBE1463:
+	.loc 1 1805 0
+	cbz	x0, .L505
+	.loc 1 1809 0
 	adrp	x25, .LANCHOR0
 	mov	x19, x0
-	.loc 1 1755 0
+	.loc 1 1811 0
 	adrp	x1, .LC22
 	mov	w2, 0
-	.loc 1 1753 0
+	.loc 1 1809 0
 	str	x0, [x25, #:lo12:.LANCHOR0]
-	.loc 1 1755 0
+	.loc 1 1811 0
 	add	x1, x1, :lo12:.LC22
 	ldr	x0, [x20, 752]
-	.loc 1 1752 0
+	.loc 1 1808 0
 	str	x20, [x19]
-	.loc 1 1755 0
+	.loc 1 1811 0
 	bl	of_parse_phandle
-.LVL411:
-	.loc 1 1756 0
-	cbz	x0, .L485
-	.loc 1 1761 0
+.LVL444:
+	.loc 1 1812 0
+	cbz	x0, .L548
+	.loc 1 1817 0
 	bl	of_find_device_by_node
-.LVL412:
-	.loc 1 1763 0
-	cbz	x0, .L401
-.LBB1283:
-.LBB1284:
-.LBB1285:
+.LVL445:
+	.loc 1 1819 0
+	cbz	x0, .L464
+.LBB1464:
+.LBB1465:
+.LBB1466:
 	.loc 2 1181 0
 	ldr	x0, [x0, 200]
-.LVL413:
-.LBE1285:
-.LBE1284:
-.LBE1283:
-	.loc 1 1766 0
+.LVL446:
+.LBE1466:
+.LBE1465:
+.LBE1464:
+	.loc 1 1822 0
 	str	x0, [x19, 8]
-	.loc 1 1767 0
-	cbz	x0, .L401
-	.loc 1 1769 0
+	.loc 1 1823 0
+	cbz	x0, .L464
+	.loc 1 1825 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 1771 0
+	.loc 1 1827 0
 	mov	w2, 0
 	adrp	x1, .LC24
 	add	x1, x1, :lo12:.LC24
 	ldr	x0, [x20, 752]
 	bl	of_parse_phandle
-.LVL414:
-	.loc 1 1772 0
-	cbz	x0, .L486
-	.loc 1 1777 0
+.LVL447:
+	.loc 1 1828 0
+	cbz	x0, .L549
+	.loc 1 1833 0
 	bl	of_find_i2c_device_by_node
-.LVL415:
-	.loc 1 1779 0
-	cbz	x0, .L487
-.LBB1286:
-.LBB1287:
-.LBB1288:
+.LVL448:
+	.loc 1 1835 0
+	cbz	x0, .L550
+.LBB1467:
+.LBB1468:
+.LBB1469:
 	.loc 2 1181 0
 	ldr	x0, [x0, 216]
-.LVL416:
-.LBE1288:
-.LBE1287:
-.LBE1286:
-	.loc 1 1783 0
+.LVL449:
+.LBE1469:
+.LBE1468:
+.LBE1467:
+	.loc 1 1839 0
 	str	x0, [x19, 16]
-	.loc 1 1784 0
-	cbz	x0, .L488
-	.loc 1 1790 0
+	.loc 1 1840 0
+	cbz	x0, .L551
+	.loc 1 1846 0
 	add	x21, x19, 184
-.LVL417:
-	.loc 1 1792 0
+.LVL450:
+	.loc 1 1848 0
 	add	x22, x19, 24
-	.loc 1 1790 0
+	.loc 1 1846 0
 	str	x20, [x21, 88]
-.LBB1289:
-.LBB1290:
-.LBB1291:
-.LBB1292:
-.LBB1293:
+.LBB1470:
+.LBB1471:
+.LBB1472:
+.LBB1473:
+.LBB1474:
 	.file 14 "./include/linux/of.h"
 	.loc 14 499 0
 	adrp	x1, .LC28
-.LBE1293:
-.LBE1292:
-.LBE1291:
-.LBE1290:
-.LBE1289:
-	.loc 1 1792 0
+.LBE1474:
+.LBE1473:
+.LBE1472:
+.LBE1471:
+.LBE1470:
+	.loc 1 1848 0
 	str	x20, [x19, 24]
-.LBB1388:
-.LBB1384:
-.LBB1300:
-.LBB1297:
-.LBB1294:
+.LBB1569:
+.LBB1565:
+.LBB1481:
+.LBB1478:
+.LBB1475:
 	.loc 14 499 0
 	mov	x4, 0
-.LBE1294:
-.LBE1297:
-.LBE1300:
-.LBE1384:
-.LBE1388:
-	.loc 1 1793 0
+.LBE1475:
+.LBE1478:
+.LBE1481:
+.LBE1565:
+.LBE1569:
+	.loc 1 1849 0
 	ldr	x2, [x19, 8]
-.LBB1389:
-.LBB1385:
-.LBB1301:
-.LBB1298:
-.LBB1295:
+.LBB1570:
+.LBB1566:
+.LBB1482:
+.LBB1479:
+.LBB1476:
 	.loc 14 499 0
 	add	x1, x1, :lo12:.LC28
-.LBE1295:
-.LBE1298:
-.LBE1301:
-.LBE1385:
-.LBE1389:
-	.loc 1 1794 0
+.LBE1476:
+.LBE1479:
+.LBE1482:
+.LBE1566:
+.LBE1570:
+	.loc 1 1850 0
 	stp	x2, x0, [x22, 8]
-.LBB1390:
-.LBB1386:
-.LBB1302:
-.LBB1299:
-.LBB1296:
+.LBB1571:
+.LBB1567:
+.LBB1483:
+.LBB1480:
+.LBB1477:
 	.loc 14 499 0
 	mov	x3, 1
 	ldr	x0, [x20, 752]
 	add	x2, x19, 100
 	bl	of_property_read_variable_u32_array
-.LVL418:
+.LVL451:
 	.loc 14 501 0
-	tbnz	w0, #31, .L406
-.LBE1296:
-.LBE1299:
-.LBE1302:
-.LBB1303:
-.LBB1304:
-.LBB1305:
+	tbnz	w0, #31, .L469
+.LBE1477:
+.LBE1480:
+.LBE1483:
+.LBB1484:
+.LBB1485:
+.LBB1486:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC52
@@ -4654,15 +5008,15 @@ ebc_probe:
 	add	x2, x19, 104
 	add	x1, x1, :lo12:.LC52
 	bl	of_property_read_variable_u32_array
-.LVL419:
+.LVL452:
 	.loc 14 501 0
-	tbnz	w0, #31, .L406
-.LBE1305:
-.LBE1304:
-.LBE1303:
-.LBB1306:
-.LBB1307:
-.LBB1308:
+	tbnz	w0, #31, .L469
+.LBE1486:
+.LBE1485:
+.LBE1484:
+.LBB1487:
+.LBB1488:
+.LBB1489:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC53
@@ -4671,15 +5025,15 @@ ebc_probe:
 	add	x2, x19, 108
 	add	x1, x1, :lo12:.LC53
 	bl	of_property_read_variable_u32_array
-.LVL420:
+.LVL453:
 	.loc 14 501 0
-	tbnz	w0, #31, .L406
-.LBE1308:
-.LBE1307:
-.LBE1306:
-.LBB1309:
-.LBB1310:
-.LBB1311:
+	tbnz	w0, #31, .L469
+.LBE1489:
+.LBE1488:
+.LBE1487:
+.LBB1490:
+.LBB1491:
+.LBB1492:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC54
@@ -4688,15 +5042,15 @@ ebc_probe:
 	add	x2, x19, 112
 	add	x1, x1, :lo12:.LC54
 	bl	of_property_read_variable_u32_array
-.LVL421:
+.LVL454:
 	.loc 14 501 0
-	tbnz	w0, #31, .L406
-.LBE1311:
-.LBE1310:
-.LBE1309:
-.LBB1312:
-.LBB1313:
-.LBB1314:
+	tbnz	w0, #31, .L469
+.LBE1492:
+.LBE1491:
+.LBE1490:
+.LBB1493:
+.LBB1494:
+.LBB1495:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC55
@@ -4705,15 +5059,15 @@ ebc_probe:
 	add	x2, x19, 128
 	add	x1, x1, :lo12:.LC55
 	bl	of_property_read_variable_u32_array
-.LVL422:
+.LVL455:
 	.loc 14 501 0
-	tbnz	w0, #31, .L406
-.LBE1314:
-.LBE1313:
-.LBE1312:
-.LBB1315:
-.LBB1316:
-.LBB1317:
+	tbnz	w0, #31, .L469
+.LBE1495:
+.LBE1494:
+.LBE1493:
+.LBB1496:
+.LBB1497:
+.LBB1498:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC56
@@ -4722,15 +5076,15 @@ ebc_probe:
 	add	x2, x19, 132
 	add	x1, x1, :lo12:.LC56
 	bl	of_property_read_variable_u32_array
-.LVL423:
+.LVL456:
 	.loc 14 501 0
-	tbnz	w0, #31, .L406
-.LBE1317:
-.LBE1316:
-.LBE1315:
-.LBB1318:
-.LBB1319:
-.LBB1320:
+	tbnz	w0, #31, .L469
+.LBE1498:
+.LBE1497:
+.LBE1496:
+.LBB1499:
+.LBB1500:
+.LBB1501:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC57
@@ -4739,15 +5093,15 @@ ebc_probe:
 	add	x2, x19, 136
 	add	x1, x1, :lo12:.LC57
 	bl	of_property_read_variable_u32_array
-.LVL424:
+.LVL457:
 	.loc 14 501 0
-	tbnz	w0, #31, .L406
-.LBE1320:
-.LBE1319:
-.LBE1318:
-.LBB1321:
-.LBB1322:
-.LBB1323:
+	tbnz	w0, #31, .L469
+.LBE1501:
+.LBE1500:
+.LBE1499:
+.LBB1502:
+.LBB1503:
+.LBB1504:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC58
@@ -4756,15 +5110,15 @@ ebc_probe:
 	add	x2, x19, 140
 	add	x1, x1, :lo12:.LC58
 	bl	of_property_read_variable_u32_array
-.LVL425:
+.LVL458:
 	.loc 14 501 0
-	tbnz	w0, #31, .L406
-.LBE1323:
-.LBE1322:
-.LBE1321:
-.LBB1324:
-.LBB1325:
-.LBB1326:
+	tbnz	w0, #31, .L469
+.LBE1504:
+.LBE1503:
+.LBE1502:
+.LBB1505:
+.LBB1506:
+.LBB1507:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC59
@@ -4773,15 +5127,15 @@ ebc_probe:
 	add	x2, x19, 144
 	add	x1, x1, :lo12:.LC59
 	bl	of_property_read_variable_u32_array
-.LVL426:
+.LVL459:
 	.loc 14 501 0
-	tbnz	w0, #31, .L406
-.LBE1326:
-.LBE1325:
-.LBE1324:
-.LBB1327:
-.LBB1328:
-.LBB1329:
+	tbnz	w0, #31, .L469
+.LBE1507:
+.LBE1506:
+.LBE1505:
+.LBB1508:
+.LBB1509:
+.LBB1510:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC60
@@ -4790,15 +5144,15 @@ ebc_probe:
 	add	x2, x19, 148
 	add	x1, x1, :lo12:.LC60
 	bl	of_property_read_variable_u32_array
-.LVL427:
+.LVL460:
 	.loc 14 501 0
-	tbnz	w0, #31, .L406
-.LBE1329:
-.LBE1328:
-.LBE1327:
-.LBB1330:
-.LBB1331:
-.LBB1332:
+	tbnz	w0, #31, .L469
+.LBE1510:
+.LBE1509:
+.LBE1508:
+.LBB1511:
+.LBB1512:
+.LBB1513:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC61
@@ -4807,15 +5161,15 @@ ebc_probe:
 	add	x2, x19, 152
 	add	x1, x1, :lo12:.LC61
 	bl	of_property_read_variable_u32_array
-.LVL428:
+.LVL461:
 	.loc 14 501 0
-	tbnz	w0, #31, .L406
-.LBE1332:
-.LBE1331:
-.LBE1330:
-.LBB1333:
-.LBB1334:
-.LBB1335:
+	tbnz	w0, #31, .L469
+.LBE1513:
+.LBE1512:
+.LBE1511:
+.LBB1514:
+.LBB1515:
+.LBB1516:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC62
@@ -4824,15 +5178,15 @@ ebc_probe:
 	add	x2, x19, 156
 	add	x1, x1, :lo12:.LC62
 	bl	of_property_read_variable_u32_array
-.LVL429:
+.LVL462:
 	.loc 14 501 0
-	tbnz	w0, #31, .L406
-.LBE1335:
-.LBE1334:
-.LBE1333:
-.LBB1336:
-.LBB1337:
-.LBB1338:
+	tbnz	w0, #31, .L469
+.LBE1516:
+.LBE1515:
+.LBE1514:
+.LBB1517:
+.LBB1518:
+.LBB1519:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC63
@@ -4841,15 +5195,15 @@ ebc_probe:
 	add	x2, x19, 160
 	add	x1, x1, :lo12:.LC63
 	bl	of_property_read_variable_u32_array
-.LVL430:
+.LVL463:
 	.loc 14 501 0
-	tbnz	w0, #31, .L406
-.LBE1338:
-.LBE1337:
-.LBE1336:
-.LBB1339:
-.LBB1340:
-.LBB1341:
+	tbnz	w0, #31, .L469
+.LBE1519:
+.LBE1518:
+.LBE1517:
+.LBB1520:
+.LBB1521:
+.LBB1522:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC64
@@ -4858,15 +5212,15 @@ ebc_probe:
 	add	x2, x19, 164
 	add	x1, x1, :lo12:.LC64
 	bl	of_property_read_variable_u32_array
-.LVL431:
+.LVL464:
 	.loc 14 501 0
-	tbnz	w0, #31, .L406
-.LBE1341:
-.LBE1340:
-.LBE1339:
-.LBB1342:
-.LBB1343:
-.LBB1344:
+	tbnz	w0, #31, .L469
+.LBE1522:
+.LBE1521:
+.LBE1520:
+.LBB1523:
+.LBB1524:
+.LBB1525:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC65
@@ -4875,15 +5229,15 @@ ebc_probe:
 	add	x2, x19, 168
 	add	x1, x1, :lo12:.LC65
 	bl	of_property_read_variable_u32_array
-.LVL432:
+.LVL465:
 	.loc 14 501 0
-	tbnz	w0, #31, .L406
-.LBE1344:
-.LBE1343:
-.LBE1342:
-.LBB1345:
-.LBB1346:
-.LBB1347:
+	tbnz	w0, #31, .L469
+.LBE1525:
+.LBE1524:
+.LBE1523:
+.LBB1526:
+.LBB1527:
+.LBB1528:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC66
@@ -4892,15 +5246,15 @@ ebc_probe:
 	add	x2, x19, 172
 	add	x1, x1, :lo12:.LC66
 	bl	of_property_read_variable_u32_array
-.LVL433:
+.LVL466:
 	.loc 14 501 0
-	tbnz	w0, #31, .L489
-.LBE1347:
-.LBE1346:
-.LBE1345:
-.LBB1348:
-.LBB1349:
-.LBB1350:
+	tbnz	w0, #31, .L552
+.LBE1528:
+.LBE1527:
+.LBE1526:
+.LBB1529:
+.LBB1530:
+.LBB1531:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC29
@@ -4909,16 +5263,16 @@ ebc_probe:
 	add	x2, x19, 176
 	add	x1, x1, :lo12:.LC29
 	bl	of_property_read_variable_u32_array
-.LVL434:
+.LVL467:
 	.loc 14 501 0
-	tbnz	w0, #31, .L407
-.L433:
-.LBE1350:
-.LBE1349:
-.LBE1348:
-.LBB1355:
-.LBB1356:
-.LBB1357:
+	tbnz	w0, #31, .L470
+.L496:
+.LBE1531:
+.LBE1530:
+.LBE1529:
+.LBB1536:
+.LBB1537:
+.LBB1538:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC30
@@ -4927,16 +5281,16 @@ ebc_probe:
 	add	x2, x19, 180
 	add	x1, x1, :lo12:.LC30
 	bl	of_property_read_variable_u32_array
-.LVL435:
+.LVL468:
 	.loc 14 501 0
-	tbnz	w0, #31, .L408
-.L434:
-.LBE1357:
-.LBE1356:
-.LBE1355:
-.LBB1362:
-.LBB1363:
-.LBB1364:
+	tbnz	w0, #31, .L471
+.L497:
+.LBE1538:
+.LBE1537:
+.LBE1536:
+.LBB1543:
+.LBB1544:
+.LBB1545:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC31
@@ -4945,16 +5299,16 @@ ebc_probe:
 	add	x2, x19, 116
 	add	x1, x1, :lo12:.LC31
 	bl	of_property_read_variable_u32_array
-.LVL436:
+.LVL469:
 	.loc 14 501 0
-	tbnz	w0, #31, .L409
-.L435:
-.LBE1364:
-.LBE1363:
-.LBE1362:
-.LBB1369:
-.LBB1370:
-.LBB1371:
+	tbnz	w0, #31, .L472
+.L498:
+.LBE1545:
+.LBE1544:
+.LBE1543:
+.LBB1550:
+.LBB1551:
+.LBB1552:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC32
@@ -4963,305 +5317,305 @@ ebc_probe:
 	add	x2, x19, 120
 	add	x1, x1, :lo12:.LC32
 	bl	of_property_read_variable_u32_array
-.LVL437:
+.LVL470:
 	.loc 14 501 0
-	tbnz	w0, #31, .L410
-.L436:
-.LBE1371:
-.LBE1370:
-.LBE1369:
-.LBE1386:
-.LBE1390:
-	.loc 1 1802 0
+	tbnz	w0, #31, .L473
+.L499:
+.LBE1552:
+.LBE1551:
+.LBE1550:
+.LBE1567:
+.LBE1571:
+	.loc 1 1858 0
 	ldr	w0, [x22, 88]
-.LBB1391:
-.LBB1392:
-	.loc 1 1539 0
+.LBB1572:
+.LBB1573:
+	.loc 1 1595 0
 	mov	w2, 0
-.LBE1392:
-.LBE1391:
-	.loc 1 1802 0
+.LBE1573:
+.LBE1572:
+	.loc 1 1858 0
 	str	w0, [x21, 52]
-	.loc 1 1803 0
+	.loc 1 1859 0
 	ldr	w1, [x22, 84]
 	str	w1, [x21, 56]
-	.loc 1 1804 0
+	.loc 1 1860 0
 	mul	w0, w0, w1
-.LBB1420:
-.LBB1415:
-	.loc 1 1539 0
+.LBB1601:
+.LBB1596:
+	.loc 1 1595 0
 	adrp	x1, .LC33
 	add	x1, x1, :lo12:.LC33
-.LBE1415:
-.LBE1420:
-	.loc 1 1804 0
+.LBE1596:
+.LBE1601:
+	.loc 1 1860 0
 	lsr	w3, w0, 1
-	.loc 1 1805 0
+	.loc 1 1861 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x21, 20]
-.LBB1421:
-.LBB1416:
-	.loc 1 1530 0
+.LBB1602:
+.LBB1597:
+	.loc 1 1586 0
 	ldr	x26, [x19]
-.LVL438:
-	.loc 1 1539 0
+.LVL471:
+	.loc 1 1595 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL439:
-	.loc 1 1540 0
-	cbz	x0, .L443
-	.loc 1 1543 0
+.LVL472:
+	.loc 1 1596 0
+	cbz	x0, .L506
+	.loc 1 1599 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL440:
+.LVL473:
 	mov	w24, w0
-	.loc 1 1545 0
-	cbnz	w0, .L490
-.LBB1393:
-.LBB1394:
+	.loc 1 1601 0
+	cbnz	w0, .L553
+.LBB1574:
+.LBB1575:
 	.file 15 "./include/linux/ioport.h"
 	.loc 15 204 0
 	ldp	x1, x2, [x29, 104]
-.LBE1394:
-.LBE1393:
-	.loc 1 1550 0
+.LBE1575:
+.LBE1574:
+	.loc 1 1606 0
 	str	x1, [x19, 184]
-	.loc 1 1553 0
+	.loc 1 1609 0
 	mov	x3, 1
 	mov	x0, x26
-.LBB1396:
-.LBB1395:
+.LBB1577:
+.LBB1576:
 	.loc 15 204 0
 	add	x2, x2, 1
 	sub	x2, x2, x1
-.LBE1395:
-.LBE1396:
-	.loc 1 1551 0
+.LBE1576:
+.LBE1577:
+	.loc 1 1607 0
 	str	w2, [x21, 16]
-	.loc 1 1553 0
+	.loc 1 1609 0
 	sxtw	x2, w2
 	bl	devm_memremap
-.LVL441:
+.LVL474:
 	str	x0, [x21, 8]
-	.loc 1 1555 0
-	cbz	x0, .L414
-	.loc 1 1563 0
+	.loc 1 1611 0
+	cbz	x0, .L477
+	.loc 1 1619 0
 	mov	x1, x0
 	ldr	w2, [x21, 16]
 	ldr	x0, [x19, 184]
 	mov	w4, 4
 	mov	w3, 2097152
 	bl	ebc_buf_init
-.LVL442:
-	.loc 1 1564 0
-	cbnz	w0, .L414
-	.loc 1 1569 0
+.LVL475:
+	.loc 1 1620 0
+	cbnz	w0, .L477
+	.loc 1 1625 0
 	ldr	x0, [x21, 8]
-	.loc 1 1570 0
+	.loc 1 1626 0
 	mov	x5, 1048576
 	str	x5, [x22, 40]
-.LBB1397:
-.LBB1398:
+.LBB1578:
+.LBB1579:
 	.loc 2 711 0
 	mov	w2, 32960
-.LBE1398:
-.LBE1397:
-	.loc 1 1569 0
+.LBE1579:
+.LBE1578:
+	.loc 1 1625 0
 	add	x6, x0, 10485760
 	str	x6, [x22, 24]
 	add	x4, x0, 11534336
-	.loc 1 1575 0
+	.loc 1 1631 0
 	add	x1, x0, 12582912
-	.loc 1 1571 0
+	.loc 1 1627 0
 	ldr	x3, [x19, 184]
-.LBB1402:
-.LBB1399:
+.LBB1583:
+.LBB1580:
 	.loc 2 711 0
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
-.LBE1399:
-.LBE1402:
-	.loc 1 1571 0
+.LBE1580:
+.LBE1583:
+	.loc 1 1627 0
 	add	x7, x3, 10485760
 	str	x7, [x22, 32]
-	.loc 1 1572 0
+	.loc 1 1628 0
 	str	x6, [x21, 176]
-	.loc 1 1571 0
+	.loc 1 1627 0
 	add	x3, x3, 11534336
-	.loc 1 1570 0
+	.loc 1 1626 0
 	str	x5, [x22, 64]
-	.loc 1 1571 0
+	.loc 1 1627 0
 	stp	x4, x3, [x22, 48]
-	.loc 1 1575 0
+	.loc 1 1631 0
 	str	x1, [x21, 112]
-.LBB1403:
-.LBB1400:
+.LBB1584:
+.LBB1581:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
-.LBE1400:
-.LBE1403:
-	.loc 1 1572 0
+.LBE1581:
+.LBE1584:
+	.loc 1 1628 0
 	str	x4, [x21, 184]
-.LBB1404:
-.LBB1401:
+.LBB1585:
+.LBB1582:
 	.loc 2 711 0
 	bl	devm_kmalloc
-.LVL443:
-.LBE1401:
-.LBE1404:
-	.loc 1 1578 0
+.LVL476:
+.LBE1582:
+.LBE1585:
+	.loc 1 1634 0
 	str	x0, [x21, 128]
-	.loc 1 1579 0
-	cbz	x0, .L414
-.LBB1405:
-.LBB1406:
+	.loc 1 1635 0
+	cbz	x0, .L477
+.LBB1586:
+.LBB1587:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL444:
-.LBE1406:
-.LBE1405:
-	.loc 1 1581 0
+.LVL477:
+.LBE1587:
+.LBE1586:
+	.loc 1 1637 0
 	str	x0, [x21, 136]
-	.loc 1 1582 0
-	cbz	x0, .L414
-.LBB1407:
-.LBB1408:
+	.loc 1 1638 0
+	cbz	x0, .L477
+.LBB1588:
+.LBB1589:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL445:
-.LBE1408:
-.LBE1407:
-	.loc 1 1584 0
+.LVL478:
+.LBE1589:
+.LBE1588:
+	.loc 1 1640 0
 	str	x0, [x21, 144]
-	.loc 1 1585 0
-	cbz	x0, .L414
-.LBB1409:
-.LBB1410:
+	.loc 1 1641 0
+	cbz	x0, .L477
+.LBB1590:
+.LBB1591:
 	.loc 2 711 0
 	ldrsw	x1, [x21, 20]
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	mov	x0, x26
 	bl	devm_kmalloc
-.LVL446:
-.LBE1410:
-.LBE1409:
-	.loc 1 1587 0
+.LVL479:
+.LBE1591:
+.LBE1590:
+	.loc 1 1643 0
 	str	x0, [x21, 152]
-	.loc 1 1588 0
-	cbz	x0, .L414
-	.loc 1 1592 0
+	.loc 1 1644 0
+	cbz	x0, .L477
+	.loc 1 1648 0
 	ldp	w1, w2, [x22, 84]
-.LBB1411:
-.LBB1412:
+.LBB1592:
+.LBB1593:
 	.loc 2 711 0
 	mov	x0, x26
-.LBE1412:
-.LBE1411:
-	.loc 1 1592 0
+.LBE1593:
+.LBE1592:
+	.loc 1 1648 0
 	mul	w1, w1, w2
-.LBB1414:
-.LBB1413:
+.LBB1595:
+.LBB1594:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
 	lsr	w1, w1, 4
 	bl	devm_kmalloc
-.LVL447:
-.LBE1413:
-.LBE1414:
-	.loc 1 1592 0
+.LVL480:
+.LBE1594:
+.LBE1595:
+	.loc 1 1648 0
 	str	x0, [x21, 160]
-	.loc 1 1593 0
-	cbz	x0, .L414
-	.loc 1 1595 0
+	.loc 1 1649 0
+	cbz	x0, .L477
+	.loc 1 1651 0
 	ldp	w2, w1, [x22, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	lsr	w2, w2, 4
 	bl	memset
-.LVL448:
-	.loc 1 1596 0
+.LVL481:
+	.loc 1 1652 0
 	ldrsw	x2, [x21, 20]
 	mov	w1, 255
 	ldr	x0, [x21, 144]
 	bl	memset
-.LVL449:
-.LBE1416:
-.LBE1421:
-.LBB1422:
-.LBB1423:
-	.loc 1 1490 0
+.LVL482:
+.LBE1597:
+.LBE1602:
+.LBB1603:
+.LBB1604:
+	.loc 1 1546 0
 	ldr	x26, [x19, 272]
-.LVL450:
-	.loc 1 1496 0
+.LVL483:
+	.loc 1 1552 0
 	adrp	x1, .LC35
 	mov	w2, 0
 	add	x1, x1, :lo12:.LC35
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL451:
-	.loc 1 1497 0
-	cbz	x0, .L444
-	.loc 1 1500 0
+.LVL484:
+	.loc 1 1553 0
+	cbz	x0, .L507
+	.loc 1 1556 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL452:
+.LVL485:
 	mov	w24, w0
-	.loc 1 1502 0
-	cbz	w0, .L491
-.LVL453:
-.L415:
-.LBE1423:
-.LBE1422:
-	.loc 1 1817 0
+	.loc 1 1558 0
+	cbz	w0, .L554
+.LVL486:
+.L478:
+.LBE1604:
+.LBE1603:
+	.loc 1 1873 0
 	adrp	x1, .LC68
 	mov	x0, x20
-.LVL454:
+.LVL487:
 	add	x1, x1, :lo12:.LC68
 	bl	_dev_err
-.LVL455:
-	.loc 1 1818 0
-	b	.L397
-.LVL456:
+.LVL488:
+	.loc 1 1874 0
+	b	.L460
+.LVL489:
 	.p2align 3
-.L406:
-	.loc 1 1800 0
+.L469:
+	.loc 1 1856 0
 	mov	w24, -22
-	.loc 1 1799 0
+	.loc 1 1855 0
 	adrp	x1, .LC72
 	mov	w2, w24
 	add	x1, x1, :lo12:.LC72
 	mov	x0, x20
 	bl	_dev_err
-.LVL457:
-.L397:
-	.loc 1 1842 0
+.LVL490:
+.L460:
+	.loc 1 1898 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w24
-.LVL458:
+.LVL491:
 	ldr	x2, [x29, 200]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L492
+	cbnz	x1, .L555
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL459:
+.LVL492:
 	ldp	x23, x24, [sp, 48]
 	ldp	x25, x26, [sp, 64]
-.LVL460:
+.LVL493:
 	ldp	x27, x28, [sp, 80]
-.LVL461:
+.LVL494:
 	ldp	x29, x30, [sp], 208
 	.cfi_remember_state
 	.cfi_restore 30
@@ -5278,251 +5632,251 @@ ebc_probe:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL462:
+.LVL495:
 	.p2align 3
-.L490:
+.L553:
 	.cfi_restore_state
-.LBB1430:
-.LBB1417:
-	.loc 1 1546 0
+.LBB1611:
+.LBB1598:
+	.loc 1 1602 0
 	adrp	x1, .LC34
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC34
 	bl	_dev_err
-.LVL463:
-.L411:
-.LBE1417:
-.LBE1430:
-	.loc 1 1810 0
+.LVL496:
+.L474:
+.LBE1598:
+.LBE1611:
+	.loc 1 1866 0
 	adrp	x1, .LC67
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC67
 	bl	_dev_err
-.LVL464:
-	.loc 1 1811 0
-	b	.L397
-.LVL465:
+.LVL497:
+	.loc 1 1867 0
+	b	.L460
+.LVL498:
 	.p2align 3
-.L410:
-.LBB1431:
-.LBB1387:
+.L473:
+.LBB1612:
+.LBB1568:
 	.loc 1 1195 0
 	str	wzr, [x22, 96]
-	b	.L436
+	b	.L499
 	.p2align 3
-.L409:
-.LBB1376:
-.LBB1374:
-.LBB1372:
+.L472:
+.LBB1557:
+.LBB1555:
+.LBB1553:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC32
-.LBE1372:
-.LBE1374:
-.LBE1376:
+.LBE1553:
+.LBE1555:
+.LBE1557:
 	.loc 1 1192 0
 	str	wzr, [x22, 92]
-.LBB1377:
-.LBB1375:
-.LBB1373:
+.LBB1558:
+.LBB1556:
+.LBB1554:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 120
 	add	x1, x1, :lo12:.LC32
 	bl	of_property_read_variable_u32_array
-.LVL466:
+.LVL499:
 	.loc 14 501 0
-	tbz	w0, #31, .L436
-	b	.L410
+	tbz	w0, #31, .L499
+	b	.L473
 	.p2align 3
-.L408:
-.LBE1373:
-.LBE1375:
-.LBE1377:
-.LBB1378:
-.LBB1367:
-.LBB1365:
+.L471:
+.LBE1554:
+.LBE1556:
+.LBE1558:
+.LBB1559:
+.LBB1548:
+.LBB1546:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC31
-.LBE1365:
-.LBE1367:
-.LBE1378:
+.LBE1546:
+.LBE1548:
+.LBE1559:
 	.loc 1 1189 0
 	str	wzr, [x22, 156]
-.LBB1379:
-.LBB1368:
-.LBB1366:
+.LBB1560:
+.LBB1549:
+.LBB1547:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 116
 	add	x1, x1, :lo12:.LC31
 	bl	of_property_read_variable_u32_array
-.LVL467:
+.LVL500:
 	.loc 14 501 0
-	tbz	w0, #31, .L435
-	b	.L409
+	tbz	w0, #31, .L498
+	b	.L472
 	.p2align 3
-.L407:
-.LBE1366:
-.LBE1368:
-.LBE1379:
-.LBB1380:
-.LBB1360:
-.LBB1358:
+.L470:
+.LBE1547:
+.LBE1549:
+.LBE1560:
+.LBB1561:
+.LBB1541:
+.LBB1539:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC30
-.LBE1358:
-.LBE1360:
-.LBE1380:
+.LBE1539:
+.LBE1541:
+.LBE1561:
 	.loc 1 1186 0
 	str	wzr, [x22, 152]
-.LBB1381:
-.LBB1361:
-.LBB1359:
+.LBB1562:
+.LBB1542:
+.LBB1540:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 180
 	add	x1, x1, :lo12:.LC30
 	bl	of_property_read_variable_u32_array
-.LVL468:
+.LVL501:
 	.loc 14 501 0
-	tbz	w0, #31, .L434
-	b	.L408
+	tbz	w0, #31, .L497
+	b	.L471
 	.p2align 3
-.L489:
-.LBE1359:
-.LBE1361:
-.LBE1381:
-.LBB1382:
-.LBB1353:
-.LBB1351:
+.L552:
+.LBE1540:
+.LBE1542:
+.LBE1562:
+.LBB1563:
+.LBB1534:
+.LBB1532:
 	.loc 14 499 0
 	ldr	x0, [x20, 752]
 	adrp	x1, .LC29
-.LBE1351:
-.LBE1353:
-.LBE1382:
+.LBE1532:
+.LBE1534:
+.LBE1563:
 	.loc 1 1183 0
 	str	wzr, [x22, 148]
-.LBB1383:
-.LBB1354:
-.LBB1352:
+.LBB1564:
+.LBB1535:
+.LBB1533:
 	.loc 14 499 0
 	mov	x4, 0
 	mov	x3, 1
 	add	x2, x19, 176
 	add	x1, x1, :lo12:.LC29
 	bl	of_property_read_variable_u32_array
-.LVL469:
+.LVL502:
 	.loc 14 501 0
-	tbz	w0, #31, .L433
-	b	.L407
-.LVL470:
+	tbz	w0, #31, .L496
+	b	.L470
+.LVL503:
 	.p2align 3
-.L491:
-.LBE1352:
-.LBE1354:
-.LBE1383:
-.LBE1387:
-.LBE1431:
-.LBB1432:
-.LBB1426:
-	.loc 1 1508 0
+.L554:
+.LBE1533:
+.LBE1535:
+.LBE1564:
+.LBE1568:
+.LBE1612:
+.LBB1613:
+.LBB1607:
+	.loc 1 1564 0
 	mov	x0, x26
 	mov	x3, 1
-.LBB1424:
-.LBB1425:
+.LBB1605:
+.LBB1606:
 	.loc 15 204 0
 	ldp	x1, x26, [x29, 104]
-.LVL471:
+.LVL504:
 	add	x26, x26, 1
 	sub	x26, x26, x1
-.LBE1425:
-.LBE1424:
-	.loc 1 1508 0
+.LBE1606:
+.LBE1605:
+	.loc 1 1564 0
 	sxtw	x2, w26
 	bl	devm_memremap
-.LVL472:
+.LVL505:
 	str	x0, [x19, 384]
-	.loc 1 1510 0
-	cbz	x0, .L493
-	.loc 1 1515 0
+	.loc 1 1566 0
+	cbz	x0, .L556
+	.loc 1 1571 0
 	bl	epd_lut_from_mem_init
-.LVL473:
-	.loc 1 1516 0
-	tbnz	w0, #31, .L494
-.L417:
-.LBE1426:
-.LBE1432:
-.LBB1433:
-.LBB1434:
-	.loc 1 1605 0
+.LVL506:
+	.loc 1 1572 0
+	tbnz	w0, #31, .L557
+.L480:
+.LBE1607:
+.LBE1613:
+.LBB1614:
+.LBB1615:
+	.loc 1 1661 0
 	add	x0, x19, 744
 	mov	x1, 68719476704
 	str	x1, [x21, 552]
-	.loc 1 1607 0
+	.loc 1 1663 0
 	add	x25, x25, :lo12:.LANCHOR0
-.LBB1435:
-.LBB1436:
-.LBB1437:
-.LBB1438:
-.LBB1439:
+.LBB1616:
+.LBB1617:
+.LBB1618:
+.LBB1619:
+.LBB1620:
 	.loc 12 234 0
 	str	x0, [x19, 744]
-.LBE1439:
-.LBE1438:
-.LBE1437:
-.LBE1436:
-.LBE1435:
-	.loc 1 1603 0
+.LBE1620:
+.LBE1619:
+.LBE1618:
+.LBE1617:
+.LBE1616:
+	.loc 1 1659 0
 	mov	w26, 99
-.LBB1441:
-.LBB1440:
+.LBB1622:
+.LBB1621:
 	.file 16 "./include/linux/list.h"
 	.loc 16 29 0
 	str	x0, [x0, 8]
-.LBE1440:
-.LBE1441:
-	.loc 1 1605 0
+.LBE1621:
+.LBE1622:
+	.loc 1 1661 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x21, 576]
-	.loc 1 1607 0
+	.loc 1 1663 0
 	adrp	x3, .LC69
 	mov	w2, -1
 	add	x3, x3, :lo12:.LC69
 	mov	x1, x21
 	adrp	x0, ebc_auto_tast_function
-	.loc 1 1603 0
+	.loc 1 1659 0
 	str	w26, [x29, 104]
-	.loc 1 1607 0
+	.loc 1 1663 0
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
-.LVL474:
+.LVL507:
 	str	x0, [x25, 8]
-	.loc 1 1608 0
+	.loc 1 1664 0
 	cmn	x0, #4096
-	bhi	.L495
-	.loc 1 1612 0
+	bhi	.L558
+	.loc 1 1668 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
-.LVL475:
-	.loc 1 1613 0
+.LVL508:
+	.loc 1 1669 0
 	ldr	x2, [x25, 8]
-.LBB1442:
-.LBB1443:
+.LBB1623:
+.LBB1624:
 	.file 17 "./arch/arm64/include/asm/atomic_lse.h"
 	.loc 17 47 0
 	mov	w0, 1
-.LVL476:
+.LVL509:
 	add	x1, x2, 48
-.LVL477:
+.LVL510:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -5550,49 +5904,49 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL478:
+.LVL511:
 #NO_APP
-.LBE1443:
-.LBE1442:
-.LBB1444:
-	.loc 1 1616 0
+.LBE1624:
+.LBE1623:
+.LBB1625:
+	.loc 1 1672 0
 	adrp	x3, .LC40
 	adrp	x0, ebc_thread
-.LVL479:
+.LVL512:
 	add	x3, x3, :lo12:.LC40
 	mov	w2, -1
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x21
-.LBE1444:
-	.loc 1 1615 0
+.LBE1625:
+	.loc 1 1671 0
 	str	w26, [x29, 104]
-.LBB1445:
-	.loc 1 1616 0
+.LBB1626:
+	.loc 1 1672 0
 	bl	kthread_create_on_node
-.LVL480:
+.LVL513:
 	mov	x25, x0
-.LVL481:
+.LVL514:
 	cmn	x0, #4096
-	bhi	.L419
+	bhi	.L482
 	bl	wake_up_process
-.LVL482:
-.LBE1445:
+.LVL515:
+.LBE1626:
 	str	x25, [x21, 120]
-	.loc 1 1621 0
+	.loc 1 1677 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x25
 	bl	sched_setscheduler_nocheck
-.LVL483:
-	.loc 1 1622 0
+.LVL516:
+	.loc 1 1678 0
 	ldr	x2, [x21, 120]
-.LBB1446:
-.LBB1447:
+.LBB1627:
+.LBB1628:
 	.loc 17 47 0
 	mov	w0, 1
-.LVL484:
+.LVL517:
 	add	x1, x2, 48
-.LVL485:
+.LVL518:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -5620,62 +5974,62 @@ ebc_probe:
 .endif
 
 // 0 "" 2
-.LVL486:
+.LVL519:
 #NO_APP
-.LBE1447:
-.LBE1446:
-.LBE1434:
-.LBE1433:
-.LBB1450:
-.LBB1451:
-	.loc 1 1631 0
+.LBE1628:
+.LBE1627:
+.LBE1615:
+.LBE1614:
+.LBB1631:
+.LBB1632:
+	.loc 1 1687 0
 	mov	w0, -1
-.LVL487:
+.LVL520:
 	str	w0, [x21, 48]
-.LBB1452:
-.LBB1453:
+.LBB1633:
+.LBB1634:
 	.loc 4 39 0
 	add	x0, x19, 408
-.LVL488:
-.LBE1453:
-.LBE1452:
-	.loc 1 1635 0
+.LVL521:
+.LBE1634:
+.LBE1633:
+	.loc 1 1691 0
 	str	wzr, [x21, 28]
-	.loc 1 1634 0
+	.loc 1 1690 0
 	str	wzr, [x21, 80]
-.LBB1458:
-.LBB1454:
+.LBB1639:
+.LBB1635:
 	.loc 4 43 0
 	adrp	x1, .LC41
-.LBE1454:
-.LBE1458:
-	.loc 1 1630 0
+.LBE1635:
+.LBE1639:
+	.loc 1 1686 0
 	str	wzr, [x21, 192]
-.LBB1459:
-.LBB1455:
+.LBB1640:
+.LBB1636:
 	.loc 4 43 0
 	add	x1, x1, :lo12:.LC41
-.LBE1455:
-.LBE1459:
-	.loc 1 1632 0
+.LBE1636:
+.LBE1640:
+	.loc 1 1688 0
 	str	wzr, [x21, 600]
-	.loc 1 1642 0
+	.loc 1 1698 0
 	add	x25, x19, 624
-.LVL489:
-	.loc 1 1633 0
+.LVL522:
+	.loc 1 1689 0
 	str	wzr, [x21, 604]
-	.loc 1 1643 0
+	.loc 1 1699 0
 	adrp	x26, jiffies
-.LBB1460:
-.LBB1456:
+.LBB1641:
+.LBB1637:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0]
-.LBE1456:
-.LBE1460:
-	.loc 1 1643 0
+.LBE1637:
+.LBE1641:
+	.loc 1 1699 0
 	mov	x27, 268435455
-.LBB1461:
-.LBB1457:
+.LBB1642:
+.LBB1638:
 	.loc 4 42 0
 	stp	xzr, xzr, [x0, 16]
 	stp	xzr, xzr, [x0, 32]
@@ -5693,12 +6047,12 @@ ebc_probe:
 	str	x1, [x19, 408]
 	.loc 4 45 0
 	bl	wakeup_source_add
-.LVL490:
-.LBE1457:
-.LBE1461:
-	.loc 1 1639 0
+.LVL523:
+.LBE1638:
+.LBE1642:
+	.loc 1 1695 0
 	str	wzr, [x21, 432]
-	.loc 1 1642 0
+	.loc 1 1698 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -5706,17 +6060,17 @@ ebc_probe:
 	adrp	x1, ebc_vdd_power_timeout
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
-.LVL491:
-	.loc 1 1643 0
+.LVL524:
+	.loc 1 1699 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
-	.loc 1 1646 0
+	.loc 1 1702 0
 	add	x25, x19, 680
-	.loc 1 1643 0
+	.loc 1 1699 0
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL492:
-	.loc 1 1646 0
+.LVL525:
+	.loc 1 1702 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -5724,226 +6078,226 @@ ebc_probe:
 	adrp	x1, ebc_frame_timeout
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
-.LVL493:
-	.loc 1 1647 0
+.LVL526:
+	.loc 1 1703 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
 	add	x1, x1, x27
 	bl	mod_timer
-.LVL494:
-.LBE1451:
-.LBE1450:
-.LBB1462:
-.LBB1463:
-	.loc 1 1657 0
+.LVL527:
+.LBE1632:
+.LBE1631:
+.LBB1643:
+.LBB1644:
+	.loc 1 1713 0
 	adrp	x0, saved_command_line
 	adrp	x1, .LC42
-	.loc 1 1654 0
+	.loc 1 1710 0
 	stp	wzr, wzr, [x29, 100]
-.LVL495:
-	.loc 1 1657 0
+.LVL528:
+	.loc 1 1713 0
 	add	x1, x1, :lo12:.LC42
 	ldr	x25, [x0, #:lo12:saved_command_line]
 	mov	x0, x25
 	bl	strstr
-.LVL496:
-	.loc 1 1658 0
+.LVL529:
+	.loc 1 1714 0
 	adrp	x1, .LC43
-	.loc 1 1657 0
+	.loc 1 1713 0
 	mov	x26, x0
-.LVL497:
-	.loc 1 1658 0
+.LVL530:
+	.loc 1 1714 0
 	add	x1, x1, :lo12:.LC43
 	mov	x0, x25
 	bl	strstr
-.LVL498:
+.LVL531:
 	mov	x28, x0
-.LVL499:
-	.loc 1 1663 0
-	cbz	x26, .L420
-	.loc 1 1664 0
+.LVL532:
+	.loc 1 1719 0
+	cbz	x26, .L483
+	.loc 1 1720 0
 	add	x2, x29, 100
 	adrp	x1, .LC44
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC44
 	bl	sscanf
-.LVL500:
-	.loc 1 1665 0
+.LVL533:
+	.loc 1 1721 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
-	bls	.L496
-.L420:
-	.loc 1 1677 0
+	bls	.L559
+.L483:
+	.loc 1 1733 0
 	mov	w25, 0
-.LVL501:
+.LVL534:
 	mov	x27, 0
-.LVL502:
-	.loc 1 1661 0
+.LVL535:
+	.loc 1 1717 0
 	mov	x26, 0
-.LVL503:
-	.loc 1 1677 0
-	cbz	x28, .L440
-.LVL504:
-.L439:
-	.loc 1 1678 0
+.LVL536:
+	.loc 1 1733 0
+	cbz	x28, .L503
+.LVL537:
+.L502:
+	.loc 1 1734 0
 	add	x2, x29, 104
 	mov	x0, x28
 	adrp	x1, .LC47
 	add	x1, x1, :lo12:.LC47
 	bl	sscanf
-.LVL505:
-	.loc 1 1656 0
+.LVL538:
+	.loc 1 1712 0
 	mov	w28, 0
-.LVL506:
-	.loc 1 1679 0
+.LVL539:
+	.loc 1 1735 0
 	ldr	w2, [x29, 104]
-	.loc 1 1661 0
+	.loc 1 1717 0
 	mov	x26, 0
-.LVL507:
-	.loc 1 1679 0
+.LVL540:
+	.loc 1 1735 0
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
-	bls	.L497
-.L424:
-	.loc 1 1691 0
-	cbz	w25, .L440
-.L423:
-	.loc 1 1698 0
+	bls	.L560
+.L487:
+	.loc 1 1747 0
+	cbz	w25, .L503
+.L486:
+	.loc 1 1754 0
 	bl	ebc_empty_buf_get
-.LVL508:
+.LVL541:
 	mov	x25, x0
-.LVL509:
-	.loc 1 1699 0
-	cbz	x0, .L426
-	.loc 1 1700 0
+.LVL542:
+	.loc 1 1755 0
+	cbz	x0, .L489
+	.loc 1 1756 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
 	ldr	x0, [x25, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL510:
-	.loc 1 1703 0
+.LVL543:
+	.loc 1 1759 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1701 0
+	.loc 1 1757 0
 	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 1706 0
+	.loc 1 1762 0
 	mov	x0, x25
-	.loc 1 1704 0
+	.loc 1 1760 0
 	ldr	w1, [x22, 84]
 	str	w1, [x25, 56]
-	.loc 1 1705 0
+	.loc 1 1761 0
 	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 1706 0
+	.loc 1 1762 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL511:
-.L426:
-	.loc 1 1710 0
-	cbnz	w28, .L498
-.L428:
-	.loc 1 1723 0
+.LVL544:
+.L489:
+	.loc 1 1766 0
+	cbnz	w28, .L561
+.L491:
+	.loc 1 1779 0
 	ldr	w0, [x21, 80]
 	adrp	x22, .LANCHOR1
-	cbz	w0, .L499
-.L430:
-	.loc 1 1728 0
-	cbz	x27, .L431
-	.loc 1 1729 0
+	cbz	w0, .L562
+.L493:
+	.loc 1 1784 0
+	cbz	x27, .L494
+	.loc 1 1785 0
 	mov	x0, x27
 	bl	kfree
-.LVL512:
-.L431:
-	.loc 1 1730 0
-	cbz	x26, .L422
-	.loc 1 1731 0
+.LVL545:
+.L494:
+	.loc 1 1786 0
+	cbz	x26, .L485
+	.loc 1 1787 0
 	mov	x0, x26
 	bl	kfree
-.LVL513:
-.L422:
-.LBE1463:
-.LBE1462:
-.LBB1475:
-.LBB1476:
-.LBB1477:
+.LVL546:
+.L485:
+.LBE1644:
+.LBE1643:
+.LBB1656:
+.LBB1657:
+.LBB1658:
 	.loc 2 1186 0
 	str	x19, [x20, 184]
-.LBE1477:
-.LBE1476:
-.LBE1475:
-.LBB1478:
-.LBB1479:
-	.loc 1 1475 0
+.LBE1658:
+.LBE1657:
+.LBE1656:
+.LBB1659:
+.LBB1660:
+	.loc 1 1531 0
 	add	x22, x22, :lo12:.LANCHOR1
 	add	x0, x22, 224
 	bl	misc_register
-.LVL514:
-	.loc 1 1477 0
+.LVL547:
+	.loc 1 1533 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 400
 	bl	device_create_file
-.LVL515:
-	.loc 1 1478 0
+.LVL548:
+	.loc 1 1534 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 432
 	bl	device_create_file
-.LVL516:
-	.loc 1 1479 0
+.LVL549:
+	.loc 1 1535 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 464
 	bl	device_create_file
-.LVL517:
-	.loc 1 1480 0
+.LVL550:
+	.loc 1 1536 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 496
 	bl	device_create_file
-.LVL518:
-	.loc 1 1481 0
+.LVL551:
+	.loc 1 1537 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 528
 	bl	device_create_file
-.LVL519:
-	.loc 1 1482 0
+.LVL552:
+	.loc 1 1538 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 560
 	bl	device_create_file
-.LVL520:
-.LBE1479:
-.LBE1478:
-	.loc 1 1839 0
+.LVL553:
+.LBE1660:
+.LBE1659:
+	.loc 1 1895 0
 	ldr	x0, [x21, 88]
 	adrp	x2, .LC15
 	adrp	x1, .LC51
 	add	x2, x2, :lo12:.LC15
 	add	x1, x1, :lo12:.LC51
 	bl	_dev_info
-.LVL521:
-	.loc 1 1841 0
-	b	.L397
-.LVL522:
+.LVL554:
+	.loc 1 1897 0
+	b	.L460
+.LVL555:
 	.p2align 3
-.L440:
-.LBB1480:
-.LBB1472:
-	.loc 1 1692 0
+.L503:
+.LBB1661:
+.LBB1653:
+	.loc 1 1748 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC50
 	add	x1, x1, :lo12:.LC50
 	bl	_dev_info
-.LVL523:
-	.loc 1 1693 0
+.LVL556:
+	.loc 1 1749 0
 	ldr	x0, [x19, 16]
 	bl	ebc_pmic_verity_vcom
-.LVL524:
-.LBB1464:
-.LBB1465:
+.LVL557:
+.LBB1645:
+.LBB1646:
 	.loc 1 1103 0
 	bl	ebc_empty_buf_get
-.LVL525:
+.LVL558:
 	mov	x25, x0
-.LVL526:
+.LVL559:
 	.loc 1 1104 0
 	ldp	w2, w0, [x19, 108]
 	mov	w1, 255
@@ -5951,7 +6305,7 @@ ebc_probe:
 	ldr	x0, [x25, 16]
 	lsr	w2, w2, 1
 	bl	memset
-.LVL527:
+.LVL560:
 	.loc 1 1107 0
 	stp	wzr, wzr, [x25, 48]
 	.loc 1 1105 0
@@ -5967,380 +6321,380 @@ ebc_probe:
 	str	w1, [x25, 60]
 	.loc 1 1110 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL528:
-	b	.L426
+.LVL561:
+	b	.L489
 	.p2align 3
-.L499:
-.LBE1465:
-.LBE1464:
-	.loc 1 1724 0
+.L562:
+.LBE1646:
+.LBE1645:
+	.loc 1 1780 0
 	mov	w2, 1
 	str	w2, [x21, 80]
-	.loc 1 1725 0
+	.loc 1 1781 0
 	add	x0, x22, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL529:
-	b	.L430
-.LVL530:
+.LVL562:
+	b	.L493
+.LVL563:
 	.p2align 3
-.L497:
-	.loc 1 1681 0
+.L560:
+	.loc 1 1737 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC48
 	add	x1, x1, :lo12:.LC48
 	bl	_dev_info
-.LVL531:
-	.loc 1 1682 0
+.LVL564:
+	.loc 1 1738 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
-.LBB1466:
-.LBB1467:
-.LBB1468:
+.LBB1647:
+.LBB1648:
+.LBB1649:
 	.file 18 "./include/linux/slab.h"
 	.loc 18 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL532:
+.LVL565:
 	mov	x26, x0
-.LBE1468:
-.LBE1467:
-.LBE1466:
-	.loc 1 1683 0
-	cbz	x0, .L500
-	.loc 1 1687 0
+.LBE1649:
+.LBE1648:
+.LBE1647:
+	.loc 1 1739 0
+	cbz	x0, .L563
+	.loc 1 1743 0
 	ldp	w2, w1, [x22, 84]
-	.loc 1 1680 0
+	.loc 1 1736 0
 	mov	w28, 1
-	.loc 1 1687 0
+	.loc 1 1743 0
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
-.LVL533:
+.LVL566:
 	sub	x1, x1, x3
-.LVL534:
+.LVL567:
 	ldr	x3, [x21, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL535:
-	b	.L424
-.LVL536:
+.LVL568:
+	b	.L487
+.LVL569:
 	.p2align 3
-.L414:
-.LBE1472:
-.LBE1480:
-.LBB1481:
-.LBB1418:
-	.loc 1 1556 0
+.L477:
+.LBE1653:
+.LBE1661:
+.LBB1662:
+.LBB1599:
+	.loc 1 1612 0
 	mov	w24, -12
-	b	.L411
-.LVL537:
+	b	.L474
+.LVL570:
 	.p2align 3
-.L498:
-.LBE1418:
-.LBE1481:
-.LBB1482:
-.LBB1473:
-	.loc 1 1711 0
+.L561:
+.LBE1599:
+.LBE1662:
+.LBB1663:
+.LBB1654:
+	.loc 1 1767 0
 	bl	ebc_empty_buf_get
-.LVL538:
+.LVL571:
 	mov	x25, x0
-.LVL539:
-	.loc 1 1712 0
-	cbz	x0, .L428
-	.loc 1 1713 0
+.LVL572:
+	.loc 1 1768 0
+	cbz	x0, .L491
+	.loc 1 1769 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
 	ldr	x0, [x25, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL540:
-	.loc 1 1716 0
+.LVL573:
+	.loc 1 1772 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1714 0
+	.loc 1 1770 0
 	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 1717 0
+	.loc 1 1773 0
 	ldr	w0, [x22, 84]
 	str	w0, [x25, 56]
-	.loc 1 1719 0
+	.loc 1 1775 0
 	mov	x0, x25
-	.loc 1 1718 0
+	.loc 1 1774 0
 	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 1719 0
+	.loc 1 1775 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL541:
-	b	.L428
-.LVL542:
+.LVL574:
+	b	.L491
+.LVL575:
 	.p2align 3
-.L496:
-	.loc 1 1667 0
+.L559:
+	.loc 1 1723 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC45
 	add	x1, x1, :lo12:.LC45
 	bl	_dev_info
-.LVL543:
-	.loc 1 1668 0
+.LVL576:
+	.loc 1 1724 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
-.LBB1469:
-.LBB1470:
-.LBB1471:
+.LBB1650:
+.LBB1651:
+.LBB1652:
 	.loc 18 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL544:
+.LVL577:
 	mov	x27, x0
-.LVL545:
-.LBE1471:
-.LBE1470:
-.LBE1469:
-	.loc 1 1669 0
-	cbz	x0, .L501
-	.loc 1 1673 0
+.LVL578:
+.LBE1652:
+.LBE1651:
+.LBE1650:
+	.loc 1 1725 0
+	cbz	x0, .L564
+	.loc 1 1729 0
 	ldp	w2, w1, [x22, 84]
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 100]
-.LVL546:
+.LVL579:
 	sub	x1, x1, x3
-.LVL547:
+.LVL580:
 	ldr	x3, [x21, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL548:
-	.loc 1 1677 0
-	cbz	x28, .L445
-	.loc 1 1666 0
+.LVL581:
+	.loc 1 1733 0
+	cbz	x28, .L508
+	.loc 1 1722 0
 	mov	w25, 1
-.LVL549:
-	b	.L439
-.LVL550:
+.LVL582:
+	b	.L502
+.LVL583:
 	.p2align 3
-.L494:
-.LBE1473:
-.LBE1482:
-.LBB1483:
-.LBB1427:
-	.loc 1 1517 0
+.L557:
+.LBE1654:
+.LBE1663:
+.LBB1664:
+.LBB1608:
+	.loc 1 1573 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC37
 	add	x1, x1, :lo12:.LC37
 	bl	_dev_err
-.LVL551:
-	.loc 1 1518 0
+.LVL584:
+	.loc 1 1574 0
 	ldr	x0, [x19, 272]
 	mov	w2, w26
 	ldr	x1, [x19, 384]
 	bl	epd_lut_from_file_init
-.LVL552:
-	.loc 1 1519 0
-	tbz	w0, #31, .L417
-	.loc 1 1520 0
+.LVL585:
+	.loc 1 1575 0
+	tbz	w0, #31, .L480
+	.loc 1 1576 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC38
-	.loc 1 1521 0
+	.loc 1 1577 0
 	mov	w24, -1
-	.loc 1 1520 0
+	.loc 1 1576 0
 	add	x1, x1, :lo12:.LC38
 	bl	_dev_err
-.LVL553:
-	b	.L415
-.LVL554:
+.LVL586:
+	b	.L478
+.LVL587:
 	.p2align 3
-.L401:
-.LBE1427:
-.LBE1483:
-	.loc 1 1764 0
+.L464:
+.LBE1608:
+.LBE1664:
+	.loc 1 1820 0
 	mov	w24, -517
-	b	.L397
-.LVL555:
+	b	.L460
+.LVL588:
 	.p2align 3
-.L495:
-.LBB1484:
-.LBB1448:
-	.loc 1 1609 0
+.L558:
+.LBB1665:
+.LBB1629:
+	.loc 1 1665 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC39
 	add	x1, x1, :lo12:.LC39
 	bl	_dev_err
-.LVL556:
-.L418:
-.LBE1448:
-.LBE1484:
-	.loc 1 1824 0
+.LVL589:
+.L481:
+.LBE1629:
+.LBE1665:
+	.loc 1 1880 0
 	adrp	x1, .LC71
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC71
-	.loc 1 1825 0
+	.loc 1 1881 0
 	mov	w24, -1
-	.loc 1 1824 0
+	.loc 1 1880 0
 	bl	_dev_err
-.LVL557:
-	.loc 1 1825 0
-	b	.L397
-.LVL558:
+.LVL590:
+	.loc 1 1881 0
+	b	.L460
+.LVL591:
 	.p2align 3
-.L419:
-.LBB1485:
-.LBB1449:
-	.loc 1 1618 0
+.L482:
+.LBB1666:
+.LBB1630:
+	.loc 1 1674 0
 	ldr	x0, [x21, 88]
-.LVL559:
+.LVL592:
 	adrp	x1, .LC70
-	.loc 1 1616 0
+	.loc 1 1672 0
 	str	x25, [x21, 120]
-	.loc 1 1618 0
+	.loc 1 1674 0
 	add	x1, x1, :lo12:.LC70
 	bl	_dev_err
-.LVL560:
-	b	.L418
-.LVL561:
+.LVL593:
+	b	.L481
+.LVL594:
 	.p2align 3
-.L442:
-.LBE1449:
-.LBE1485:
-	.loc 1 1750 0
+.L505:
+.LBE1630:
+.LBE1666:
+	.loc 1 1806 0
 	mov	w24, -12
-	b	.L397
-.LVL562:
+	b	.L460
+.LVL595:
 	.p2align 3
-.L443:
-.LBB1486:
-.LBB1419:
-	.loc 1 1541 0
+.L506:
+.LBB1667:
+.LBB1600:
+	.loc 1 1597 0
 	mov	w24, -19
-	b	.L411
-.LVL563:
-.L485:
-.LBE1419:
-.LBE1486:
-	.loc 1 1757 0
+	b	.L474
+.LVL596:
+.L548:
+.LBE1600:
+.LBE1667:
+	.loc 1 1813 0
 	adrp	x1, .LC23
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC23
-	.loc 1 1758 0
+	.loc 1 1814 0
 	mov	w24, -19
-	.loc 1 1757 0
+	.loc 1 1813 0
 	bl	_dev_err
-.LVL564:
-	.loc 1 1758 0
-	b	.L397
-.L488:
-	.loc 1 1785 0
+.LVL597:
+	.loc 1 1814 0
+	b	.L460
+.L551:
+	.loc 1 1841 0
 	adrp	x1, .LC27
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC27
-	.loc 1 1786 0
+	.loc 1 1842 0
 	mov	w24, -517
-	.loc 1 1785 0
+	.loc 1 1841 0
 	bl	_dev_err
-.LVL565:
-	.loc 1 1786 0
-	b	.L397
-.L486:
-	.loc 1 1773 0
+.LVL598:
+	.loc 1 1842 0
+	b	.L460
+.L549:
+	.loc 1 1829 0
 	adrp	x1, .LC25
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC25
-	.loc 1 1774 0
+	.loc 1 1830 0
 	mov	w24, -19
-	.loc 1 1773 0
+	.loc 1 1829 0
 	bl	_dev_err
-.LVL566:
-	.loc 1 1774 0
-	b	.L397
-.LVL567:
-.L444:
-.LBB1487:
-.LBB1428:
-	.loc 1 1498 0
+.LVL599:
+	.loc 1 1830 0
+	b	.L460
+.LVL600:
+.L507:
+.LBB1668:
+.LBB1609:
+	.loc 1 1554 0
 	mov	w24, -19
-	b	.L415
-.LVL568:
-.L487:
-.LBE1428:
-.LBE1487:
-	.loc 1 1780 0
+	b	.L478
+.LVL601:
+.L550:
+.LBE1609:
+.LBE1668:
+	.loc 1 1836 0
 	adrp	x1, .LC26
 	mov	x0, x20
-.LVL569:
+.LVL602:
 	add	x1, x1, :lo12:.LC26
-	.loc 1 1781 0
+	.loc 1 1837 0
 	mov	w24, -517
-	.loc 1 1780 0
+	.loc 1 1836 0
 	bl	_dev_err
-.LVL570:
-	.loc 1 1781 0
-	b	.L397
-.LVL571:
-.L493:
-.LBB1488:
-.LBB1429:
-	.loc 1 1511 0
+.LVL603:
+	.loc 1 1837 0
+	b	.L460
+.LVL604:
+.L556:
+.LBB1669:
+.LBB1610:
+	.loc 1 1567 0
 	ldr	x0, [x19, 272]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
 	adrp	x1, .LC36
-	mov	w3, 1511
+	mov	w3, 1567
 	add	x2, x2, 16
 	add	x1, x1, :lo12:.LC36
-	.loc 1 1512 0
+	.loc 1 1568 0
 	mov	w24, -12
-	.loc 1 1511 0
+	.loc 1 1567 0
 	bl	_dev_err
-.LVL572:
-	b	.L415
-.LVL573:
-.L492:
-.LBE1429:
-.LBE1488:
-	.loc 1 1842 0
+.LVL605:
+	b	.L478
+.LVL606:
+.L555:
+.LBE1610:
+.LBE1669:
+	.loc 1 1898 0
 	bl	__stack_chk_fail
-.LVL574:
-.L500:
-.LBB1489:
-.LBB1474:
-	.loc 1 1684 0
+.LVL607:
+.L563:
+.LBB1670:
+.LBB1655:
+	.loc 1 1740 0
 	ldr	x0, [x21, 88]
-.LVL575:
+.LVL608:
 	adrp	x1, .LC49
 	adrp	x22, .LANCHOR1
 	add	x1, x1, :lo12:.LC49
 	bl	_dev_err
-.LVL576:
-	b	.L422
-.LVL577:
-.L501:
-	.loc 1 1670 0
+.LVL609:
+	b	.L485
+.LVL610:
+.L564:
+	.loc 1 1726 0
 	ldr	x0, [x21, 88]
-.LVL578:
+.LVL611:
 	adrp	x1, .LC46
 	adrp	x22, .LANCHOR1
 	add	x1, x1, :lo12:.LC46
 	bl	_dev_err
-.LVL579:
-	b	.L422
-.LVL580:
-.L445:
-	.loc 1 1656 0
+.LVL612:
+	b	.L485
+.LVL613:
+.L508:
+	.loc 1 1712 0
 	mov	w28, 0
-.LVL581:
-	.loc 1 1661 0
+.LVL614:
+	.loc 1 1717 0
 	mov	x26, 0
-.LVL582:
-	b	.L423
-.LBE1474:
-.LBE1489:
+.LVL615:
+	b	.L486
+.LBE1655:
+.LBE1670:
 	.cfi_endproc
 .LFE2840:
 	.size	ebc_probe, .-ebc_probe
@@ -6351,7 +6705,7 @@ ebc_power_set.constprop.7:
 .LFB2853:
 	.loc 1 180 0
 	.cfi_startproc
-.LVL583:
+.LVL616:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -6365,52 +6719,52 @@ ebc_power_set.constprop.7:
 	mov	x19, x0
 	.loc 1 196 0
 	mov	x0, 0
-.LVL584:
+.LVL617:
 	bl	ebc_notify
-.LVL585:
-.LBB1490:
-.LBB1491:
+.LVL618:
+.LBB1671:
+.LBB1672:
 	.loc 3 35 0
 	mov	w1, 0
-.LBE1491:
-.LBE1490:
+.LBE1672:
+.LBE1671:
 	.loc 1 198 0
 	ldr	x2, [x19, 16]
 	.loc 1 197 0
 	str	wzr, [x19, 376]
-.LBB1493:
-.LBB1492:
+.LBB1674:
+.LBB1673:
 	.loc 3 35 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL586:
-.LBE1492:
-.LBE1493:
+.LVL619:
+.LBE1673:
+.LBE1674:
 	.loc 1 199 0
 	ldr	x1, [x19, 8]
-.LBB1494:
-.LBB1495:
+.LBB1675:
+.LBB1676:
 	.loc 11 51 0
 	mov	x0, x1
 	ldr	x1, [x1, 56]
 	blr	x1
-.LVL587:
-.LBE1495:
-.LBE1494:
+.LVL620:
+.LBE1676:
+.LBE1675:
 	.loc 1 200 0
 	ldr	w0, [x19, 616]
-	cbnz	w0, .L508
+	cbnz	w0, .L571
 	.loc 1 204 0
 	ldr	x0, [x19]
 	adrp	x1, .LC73
 	add	x1, x1, :lo12:.LC73
 	bl	_dev_info
-.LVL588:
+.LVL621:
 	.loc 1 208 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
-.LVL589:
+.LVL622:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -6419,30 +6773,30 @@ ebc_power_set.constprop.7:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL590:
+.LVL623:
 	.p2align 3
-.L508:
+.L571:
 	.cfi_restore_state
 	.loc 1 201 0
 	str	wzr, [x19, 616]
-.LBB1496:
-.LBB1497:
+.LBB1677:
+.LBB1678:
 	.loc 4 68 0
 	add	x0, x19, 408
 	bl	__pm_relax
-.LVL591:
-.LBE1497:
-.LBE1496:
+.LVL624:
+.LBE1678:
+.LBE1677:
 	.loc 1 204 0
 	ldr	x0, [x19]
 	adrp	x1, .LC73
 	add	x1, x1, :lo12:.LC73
 	bl	_dev_info
-.LVL592:
+.LVL625:
 	.loc 1 208 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
-.LVL593:
+.LVL626:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -6458,9 +6812,9 @@ ebc_power_set.constprop.7:
 	.type	ebc_suspend, %function
 ebc_suspend:
 .LFB2842:
-	.loc 1 1852 0
+	.loc 1 1908 0
 	.cfi_startproc
-.LVL594:
+.LVL627:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -6470,40 +6824,40 @@ ebc_suspend:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-.LBB1498:
-.LBB1499:
+.LBB1679:
+.LBB1680:
 	.loc 2 1181 0
 	ldr	x20, [x0, 184]
-.LBE1499:
-.LBE1498:
-	.loc 1 1856 0
+.LBE1680:
+.LBE1679:
+	.loc 1 1912 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 192]
-.LVL595:
+.LVL628:
 	cmp	w0, 1
-	beq	.L512
-.L510:
-	.loc 1 1860 0
+	beq	.L575
+.L573:
+	.loc 1 1916 0
 	mov	w0, 1
 	str	w0, [x19, 604]
-	.loc 1 1862 0
+	.loc 1 1918 0
 	ldr	x1, [x20, 16]
-.LBB1500:
-.LBB1501:
+.LBB1681:
+.LBB1682:
 	.loc 3 40 0
 	mov	x0, x1
 	ldr	x1, [x1, 40]
 	blr	x1
-.LVL596:
-.LBE1501:
-.LBE1500:
-	.loc 1 1863 0
+.LVL629:
+.LBE1682:
+.LBE1681:
+	.loc 1 1919 0
 	ldr	x0, [x19, 88]
 	adrp	x1, .LC75
 	add	x1, x1, :lo12:.LC75
 	bl	_dev_info
-.LVL597:
-	.loc 1 1866 0
+.LVL630:
+	.loc 1 1922 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -6515,9 +6869,9 @@ ebc_suspend:
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L512:
+.L575:
 	.cfi_restore_state
-	.loc 1 1857 0
+	.loc 1 1913 0
 	ldr	x0, [x19, 88]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
@@ -6525,12 +6879,12 @@ ebc_suspend:
 	add	x2, x2, 40
 	add	x1, x1, :lo12:.LC74
 	bl	_dev_info
-.LVL598:
-	.loc 1 1858 0
+.LVL631:
+	.loc 1 1914 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.7
-.LVL599:
-	b	.L510
+.LVL632:
+	b	.L573
 	.cfi_endproc
 .LFE2842:
 	.size	ebc_suspend, .-ebc_suspend
@@ -6542,40 +6896,40 @@ refresh_new_image2:
 .LFB2806:
 	.loc 1 212 0
 	.cfi_startproc
-.LVL600:
+.LVL633:
 	.loc 1 220 0
 	ldp	w14, w6, [x4, 52]
 	cmp	w6, 0
 	add	w10, w6, 15
 	csel	w10, w10, w6, lt
-.LVL601:
+.LVL634:
 	.loc 1 227 0
 	cmp	w14, 0
 	.loc 1 220 0
 	asr	w10, w10, 4
-.LVL602:
+.LVL635:
 	.loc 1 227 0
-	ble	.L513
+	ble	.L576
 	sub	w13, w10, #1
 	mov	w11, 0
-.LVL603:
+.LVL636:
 	add	x13, x13, 1
 	lsl	x12, x13, 3
-.LVL604:
+.LVL637:
 	.p2align 2
-.L515:
+.L578:
 	.loc 1 228 0 discriminator 1
 	mov	x4, 0
-.LVL605:
+.LVL638:
 	cmp	w10, 0
-	ble	.L520
+	ble	.L583
 	.p2align 2
-.L522:
+.L585:
 	.loc 1 229 0
 	ldrb	w9, [x3, x4]
 	.loc 1 233 0
 	mov	x6, -1
-.LVL606:
+.LVL639:
 	.loc 1 230 0
 	ldr	x8, [x1, x4, lsl 3]
 	.loc 1 231 0
@@ -6583,35 +6937,35 @@ refresh_new_image2:
 	.loc 1 243 0
 	cmp	w9, 0
 	.loc 1 232 0
-	cbz	w5, .L516
+	cbz	w5, .L579
 	.loc 1 235 0
 	ldr	x6, [x2]
-.LVL607:
+.LVL640:
 	add	x2, x2, 8
-.LVL608:
-.L516:
+.LVL641:
+.L579:
 	.loc 1 243 0
 	and	x6, x6, x8
-.LVL609:
+.LVL642:
 	csel	x7, x6, x7, eq
 	.loc 1 253 0
 	str	x7, [x0, x4, lsl 3]
 	add	x4, x4, 1
 	.loc 1 228 0
 	cmp	w10, w4
-	bgt	.L522
+	bgt	.L585
 	add	x3, x3, x13
 	add	x1, x1, x12
-.LVL610:
+.LVL643:
 	add	x0, x0, x12
-.LVL611:
-.L520:
+.LVL644:
+.L583:
 	.loc 1 227 0 discriminator 2
 	add	w11, w11, 1
 	cmp	w14, w11
-	bne	.L515
-.LVL612:
-.L513:
+	bne	.L578
+.LVL645:
+.L576:
 	ret
 	.cfi_endproc
 .LFE2806:
@@ -6624,23 +6978,23 @@ new_buffer_refresh:
 .LFB2807:
 	.loc 1 259 0
 	.cfi_startproc
-.LVL613:
+.LVL646:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	.loc 1 260 0
 	adrp	x0, .LANCHOR0
-.LVL614:
+.LVL647:
 	.loc 1 259 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	.loc 1 260 0
 	ldr	x4, [x0, #:lo12:.LANCHOR0]
-.LVL615:
+.LVL648:
 	.loc 1 268 0
 	add	x4, x4, 184
-.LVL616:
+.LVL649:
 	.loc 1 264 0
 	ldr	x5, [x4, 216]
 	ldr	x0, [x4, 128]
@@ -6648,7 +7002,7 @@ new_buffer_refresh:
 	ldr	x3, [x4, 160]
 	ldr	w5, [x5, 40]
 	bl	refresh_new_image2
-.LVL617:
+.LVL650:
 	.loc 1 270 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -6665,7 +7019,7 @@ ebc_thread:
 .LFB2819:
 	.loc 1 792 0
 	.cfi_startproc
-.LVL618:
+.LVL651:
 	stp	x29, x30, [sp, -224]!
 	.cfi_def_cfa_offset 224
 	.cfi_offset 29, -224
@@ -6686,7 +7040,7 @@ ebc_thread:
 	adrp	x24, .LANCHOR1
 	stp	x25, x26, [sp, 64]
 	add	x0, x23, :lo12:__stack_chk_guard
-.LVL619:
+.LVL652:
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 21, -192
 	.cfi_offset 22, -184
@@ -6694,97 +7048,97 @@ ebc_thread:
 	.cfi_offset 26, -152
 	.cfi_offset 27, -144
 	.cfi_offset 28, -136
-.LBB1527:
-.LBB1528:
-.LBB1529:
+.LBB1708:
+.LBB1709:
+.LBB1710:
 	.loc 1 1091 0
 	add	x24, x24, :lo12:.LANCHOR1
-.LBE1529:
-.LBE1528:
-.LBE1527:
+.LBE1710:
+.LBE1709:
+.LBE1708:
 	.loc 1 793 0
 	ldr	x20, [x1, #:lo12:.LANCHOR0]
-.LVL620:
-.LBB1534:
-.LBB1532:
-.LBB1530:
+.LVL653:
+.LBB1715:
+.LBB1713:
+.LBB1711:
 	.loc 1 1091 0
 	add	x19, x24, 304
-.LBE1530:
-.LBE1532:
-.LBE1534:
+.LBE1711:
+.LBE1713:
+.LBE1715:
 	.loc 1 792 0
 	ldr	x1, [x0]
 	str	x1, [x29, 216]
 	mov	x1,0
 	.loc 1 798 0
 	mov	w26, 0
-.LVL621:
+.LVL654:
 	.loc 1 795 0
 	add	x28, x20, 184
 	.loc 1 797 0
 	mov	w22, 0
-.LVL622:
+.LVL655:
 	.p2align 2
-.L528:
+.L591:
 	.loc 1 803 0
 	ldr	w0, [x28, 608]
-.LVL623:
-	cbnz	w0, .L655
-.L529:
+.LVL656:
+	cbnz	w0, .L721
+.L592:
 	.loc 1 809 0
 	bl	ebc_dsp_buf_get
-.LVL624:
+.LVL657:
 	mov	x27, x0
 	.loc 1 811 0
-	cbz	x0, .L531
+	cbz	x0, .L594
 	.loc 1 811 0 is_stmt 0 discriminator 1
 	ldr	x1, [x0, 8]
-	cbz	x1, .L531
+	cbz	x1, .L594
 	.loc 1 812 0 is_stmt 1
 	ldr	w1, [x0, 40]
 	cmp	w1, 17
-	beq	.L656
+	beq	.L722
 	.loc 1 816 0
 	ldr	x2, [x28, 600]
-	cbz	x2, .L534
+	cbz	x2, .L597
 	.loc 1 817 0
 	cmp	w1, 16
-	beq	.L657
-.L648:
+	beq	.L723
+.L714:
 	.loc 1 874 0
 	bl	ebc_remove_from_dsp_buf_list
-.LVL625:
+.LVL658:
 	.loc 1 875 0
 	mov	x0, x27
 	bl	ebc_buf_release
-.LVL626:
+.LVL659:
 	.loc 1 803 0
 	ldr	w0, [x28, 608]
-	cbz	w0, .L529
+	cbz	w0, .L592
 	.p2align 2
-.L655:
+.L721:
 	.loc 1 804 0
 	ldr	w0, [x28, 192]
 	cmp	w0, 1
-	beq	.L658
-.L530:
+	beq	.L724
+.L593:
 	.loc 1 1097 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, 0
 	ldr	x2, [x29, 216]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L659
+	cbnz	x1, .L725
 	ldp	x19, x20, [sp, 16]
-.LVL627:
+.LVL660:
 	ldp	x21, x22, [sp, 32]
-.LVL628:
+.LVL661:
 	ldp	x23, x24, [sp, 48]
 	ldp	x25, x26, [sp, 64]
-.LVL629:
+.LVL662:
 	ldp	x27, x28, [sp, 80]
-.LVL630:
+.LVL663:
 	ldp	x29, x30, [sp], 224
 	.cfi_remember_state
 	.cfi_restore 30
@@ -6801,97 +7155,97 @@ ebc_thread:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL631:
+.LVL664:
 	.p2align 3
-.L531:
+.L594:
 	.cfi_restore_state
 	.loc 1 1078 0
 	ldr	w0, [x28, 28]
-.LVL632:
+.LVL665:
 	cmp	w0, 1
-	beq	.L660
+	beq	.L726
 	.loc 1 1087 0
 	ldr	w0, [x28, 192]
 	cmp	w0, 1
-	beq	.L661
-.LVL633:
-.L651:
+	beq	.L727
+.LVL666:
+.L717:
 	ldr	w0, [x28, 80]
-.LVL634:
+.LVL667:
 	.loc 1 1090 0
-	cbz	w0, .L662
-.L605:
-.LVL635:
-.L595:
+	cbz	w0, .L728
+.L668:
+.LVL668:
+.L658:
 	.loc 1 1092 0
 	str	wzr, [x28, 80]
-	b	.L528
-.LVL636:
+	b	.L591
+.LVL669:
 	.p2align 3
-.L662:
-.LBB1535:
-.LBB1533:
+.L728:
+.LBB1716:
+.LBB1714:
 	.loc 1 1091 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL637:
-	b	.L606
+.LVL670:
+	b	.L669
 	.p2align 3
-.L663:
-.LVL638:
-.LBB1531:
+.L729:
+.LVL671:
+.LBB1712:
 	.loc 1 1091 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L595
+	cbnz	x0, .L658
 	.loc 1 1091 0 discriminator 7
 	bl	schedule
-.LVL639:
-.L606:
+.LVL672:
+.L669:
 	.loc 1 1091 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x19
 	bl	prepare_to_wait_event
-.LVL640:
+.LVL673:
 	ldr	w1, [x28, 80]
-	cbz	w1, .L663
-.LBE1531:
+	cbz	w1, .L729
+.LBE1712:
 	.loc 1 1091 0 discriminator 4
 	add	x1, x29, 112
 	mov	x0, x19
 	bl	finish_wait
-.LVL641:
-.LBE1533:
-.LBE1535:
+.LVL674:
+.LBE1714:
+.LBE1716:
 	.loc 1 1092 0 is_stmt 1 discriminator 4
 	str	wzr, [x28, 80]
-	b	.L528
-.LVL642:
+	b	.L591
+.LVL675:
 	.p2align 3
-.L534:
+.L597:
 	.loc 1 829 0
 	cmp	w1, 15
-	beq	.L664
+	beq	.L730
 	.loc 1 832 0
 	ldr	w0, [x28, 616]
-.LVL643:
+.LVL676:
 	cmp	w0, 0
 	ccmp	w1, 1, 4, ne
-	beq	.L533
+	beq	.L596
 	.loc 1 834 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x27, 16]
 	ldr	x0, [x28, 144]
 	bl	memcpy
-.LVL644:
+.LVL677:
 	.loc 1 835 0
 	mov	x0, x27
 	bl	ebc_remove_from_dsp_buf_list
-.LVL645:
+.LVL678:
 	.loc 1 836 0
 	mov	x0, x27
 	bl	ebc_buf_release
-.LVL646:
+.LVL679:
 	.loc 1 838 0
 	ldr	x0, [x28, 216]
 	mov	x4, x28
@@ -6900,10 +7254,10 @@ ebc_thread:
 	ldr	w5, [x0, 40]
 	ldr	x0, [x28, 128]
 	bl	refresh_new_image2
-.LVL647:
+.LVL680:
 	.loc 1 842 0
 	ldr	w0, [x28, 28]
-	cbnz	w0, .L528
+	cbnz	w0, .L591
 	.loc 1 845 0
 	ldr	w0, [x28, 192]
 	.loc 1 843 0
@@ -6913,38 +7267,38 @@ ebc_thread:
 	.loc 1 843 0
 	str	w1, [x28, 28]
 	.loc 1 845 0
-	cbz	w0, .L665
-.L538:
+	cbz	w0, .L731
+.L601:
 	.loc 1 847 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC77
 	ldrb	w2, [x28, 32]
 	add	x1, x1, :lo12:.LC77
 	bl	_dev_info
-.LVL648:
+.LVL681:
 	.loc 1 848 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL649:
-	b	.L528
-.LVL650:
+.LVL682:
+	b	.L591
+.LVL683:
 	.p2align 3
-.L657:
+.L723:
 	.loc 1 818 0
 	str	wzr, [x28, 600]
 	.loc 1 819 0
 	mov	x0, 3
-.LVL651:
+.LVL684:
 	bl	ebc_notify
-.LVL652:
+.LVL685:
 	.loc 1 820 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC76
 	add	x1, x1, :lo12:.LC76
 	bl	_dev_info
-.LVL653:
+.LVL686:
 	.p2align 2
-.L533:
+.L596:
 	.loc 1 853 0
 	adrp	x21, jiffies
 	mov	x1, 402653184
@@ -6952,41 +7306,322 @@ ebc_thread:
 	ldr	x2, [x21, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL654:
+.LVL687:
 	.loc 1 855 0
 	ldr	w0, [x28, 436]
-	cbz	w0, .L539
+	cbz	w0, .L602
 	ldr	x0, [x28, 208]
-.L540:
+.L603:
 	.loc 1 858 0
 	ldr	w2, [x0, 40]
 	ldr	w3, [x27, 40]
 	cmp	w3, w2
-	beq	.L541
+	beq	.L604
 	.loc 1 859 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC78
 	add	x1, x1, :lo12:.LC78
 	bl	_dev_info
-.LVL655:
+.LVL688:
 	.loc 1 860 0
 	ldr	w0, [x28, 28]
 	cmp	w0, 1
-	beq	.L666
-.L649:
-	ldr	w2, [x27, 40]
-.L541:
-	.loc 1 867 0
-	cmp	w2, 6
-	bgt	.L548
-	cmp	w2, 2
-	bge	.L610
-	cbz	w2, .L550
-	cmp	w2, 1
-	bne	.L547
+	beq	.L732
+.L715:
+	ldr	w2, [x27, 40]
+.L604:
+	.loc 1 867 0
+	cmp	w2, 11
+	bgt	.L611
+	cmp	w2, 7
+	bge	.L614
+	cmp	w2, 1
+	beq	.L613
+	bgt	.L673
+	cbnz	w2, .L610
+	.loc 1 913 0
+	str	x27, [x28, 216]
+	.loc 1 914 0
+	ldrsw	x2, [x28, 20]
+	ldr	x0, [x28, 152]
+	ldr	x1, [x27, 16]
+	bl	memcpy
+.LVL689:
+	.loc 1 915 0
+	ldr	x0, [x28, 208]
+	ldr	w0, [x0, 40]
+	cbnz	w0, .L733
+.L634:
+	.loc 1 924 0
+	ldr	x0, [x28, 216]
+	mov	x4, x28
+	ldp	x2, x1, [x28, 144]
+	ldr	x3, [x28, 160]
+	ldr	w5, [x0, 40]
+	ldr	x0, [x28, 128]
+	bl	refresh_new_image2
+.LVL690:
+.L635:
+	.loc 1 930 0
+	ldr	w0, [x28, 28]
+	cbnz	w0, .L625
+	.loc 1 933 0
+	ldr	w0, [x28, 192]
+	.loc 1 931 0
+	mov	w1, 1
+	.loc 1 932 0
+	str	wzr, [x28, 76]
+	.loc 1 931 0
+	str	w1, [x28, 28]
+	.loc 1 933 0
+	cbz	w0, .L734
+.L636:
+	.loc 1 935 0
+	mov	x0, x20
+	bl	ebc_lut_update
+.LVL691:
+	cmn	w0, #1
+	beq	.L735
+	.loc 1 943 0
+	ldr	x0, [x28, 88]
+	adrp	x1, .LC84
+	.loc 1 940 0
+	ldr	w3, [x28, 96]
+	.loc 1 943 0
+	add	x1, x1, :lo12:.LC84
+	.loc 1 940 0
+	strb	w3, [x28, 32]
+.L716:
+	.loc 1 943 0
+	and	w2, w3, 255
+	.loc 1 941 0
+	lsr	w3, w3, 8
+	strb	w3, [x28, 33]
+	.loc 1 943 0
+	bl	_dev_info
+.LVL692:
+	.loc 1 944 0
+	mov	x0, x20
+	bl	ebc_frame_start
+.LVL693:
+	.loc 1 1052 0
+	ldr	x0, [x28, 216]
+	ldr	w0, [x0, 40]
+	cmp	w0, 17
+	bne	.L654
+.LVL694:
+	.p2align 2
+.L741:
+	.loc 1 1055 0
+	ldr	x0, [x28, 88]
+	.loc 1 1053 0
+	mov	w21, 1
+	.loc 1 1054 0
+	str	wzr, [x28, 196]
+	.loc 1 1055 0
+	adrp	x1, .LC87
+	.loc 1 1053 0
+	str	w21, [x28, 608]
+	.loc 1 1055 0
+	add	x1, x1, :lo12:.LC87
+	bl	_dev_info
+.LVL695:
+	.loc 1 1056 0
+	mov	w2, w21
+	mov	w1, w21
+	add	x0, x24, 328
+	bl	__wake_up_sync
+.LVL696:
+	.loc 1 1067 0
+	mov	x0, x27
+	bl	ebc_remove_from_dsp_buf_list
+.LVL697:
+	.loc 1 1069 0
+	ldr	w0, [x28, 436]
+	cbz	w0, .L656
+	.p2align 2
+.L743:
+	.loc 1 1070 0
+	ldr	x0, [x28, 208]
+	bl	ebc_buf_release
+.LVL698:
+	b	.L657
+	.p2align 3
+.L602:
+	.loc 1 856 0
+	mov	x0, x27
+	str	x27, [x28, 208]
+	b	.L603
+.LVL699:
+	.p2align 3
+.L722:
+	.loc 1 814 0
+	str	wzr, [x28, 612]
+	.loc 1 813 0
+	str	wzr, [x28, 616]
+	b	.L596
+.LVL700:
+	.p2align 3
+.L611:
+	.loc 1 867 0
+	cmp	w2, 13
+	beq	.L614
+	blt	.L673
+	cmp	w2, 17
+	bgt	.L610
+.L673:
+	.loc 1 957 0
+	mov	w22, 1
+.L614:
+	.loc 1 965 0
+	ldr	x25, [x28, 208]
+	.loc 1 966 0
+	ldr	w0, [x25, 40]
+	cmp	w0, 1
+	bls	.L736
+.L638:
+	.loc 1 977 0
+	str	wzr, [x28, 76]
+	.loc 1 978 0
+	str	x27, [x28, 216]
+	.loc 1 980 0
+	ldr	w9, [x27, 40]
+	.loc 1 983 0
+	sub	w0, w9, #7
+	.loc 1 980 0
+	cmp	w0, 4
+	bls	.L737
+.LVL701:
+.L639:
+	.loc 1 995 0
+	cbnz	w22, .L675
+	.loc 1 999 0
+	ldr	w1, [x28, 48]
+	mov	x0, x27
+	cmp	w1, 0
+	ble	.L646
+	.loc 1 1000 0
+	add	w26, w26, 1
+	.loc 1 1001 0
+	cmp	w1, w26
+	ble	.L738
+.L646:
+	.loc 1 1008 0
+	cmp	w9, 12
+	beq	.L739
+.L647:
+	.loc 1 1014 0
+	ldr	w0, [x28, 192]
+	cbz	w0, .L740
+.L648:
+	.loc 1 1017 0
+	mov	x0, x20
+	bl	ebc_lut_update
+.LVL702:
+	mov	w22, w0
+	cbz	w0, .L649
+	.loc 1 1018 0
+	ldr	x0, [x28, 88]
+	adrp	x1, .LC83
+	.loc 1 1021 0
+	mov	w22, 0
+	.loc 1 1018 0
+	add	x1, x1, :lo12:.LC83
+	bl	_dev_err
+.LVL703:
+	.loc 1 1020 0
+	str	x25, [x28, 208]
+.LVL704:
+.L625:
+	.loc 1 1052 0
+	ldr	x0, [x28, 216]
+	ldr	w0, [x0, 40]
+	cmp	w0, 17
+	beq	.L741
+.L654:
+	.loc 1 1058 0
+	cmp	w0, 15
+	beq	.L742
+.L655:
+	.loc 1 1067 0
+	mov	x0, x27
+	bl	ebc_remove_from_dsp_buf_list
+.LVL705:
+	.loc 1 1069 0
+	ldr	w0, [x28, 436]
+	cbnz	w0, .L743
+.L656:
+	.loc 1 1072 0
+	mov	w0, 1
+	str	w0, [x28, 436]
+.L657:
+	.loc 1 1074 0
+	ldr	x0, [x28, 216]
+	str	x0, [x28, 208]
+	.loc 1 1075 0
+	b	.L591
+	.p2align 3
+.L726:
+.LBB1717:
+	.loc 1 1079 0 discriminator 1
+	ldr	w0, [x28, 80]
+	cbnz	w0, .L658
+.LBB1718:
+	.loc 1 1079 0 is_stmt 0 discriminator 3
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL706:
+	b	.L662
+	.p2align 3
+.L744:
+.LBB1719:
+	.loc 1 1079 0 discriminator 7
+	ldr	w1, [x28, 80]
+	cbnz	w1, .L659
+.LVL707:
+	.loc 1 1079 0 discriminator 9
+	cbnz	x0, .L717
+	.loc 1 1079 0 discriminator 11
+	bl	schedule
+.LVL708:
+.L662:
+	.loc 1 1079 0 discriminator 13
+	add	x1, x29, 112
+	mov	w2, 1
+	mov	x0, x19
+	bl	prepare_to_wait_event
+.LVL709:
+	ldr	w1, [x28, 28]
+	cbnz	w1, .L744
+.L659:
+.LBE1719:
+	.loc 1 1079 0 discriminator 8
+	mov	x0, x19
+	add	x1, x29, 112
+	bl	finish_wait
+.LVL710:
+	ldr	w0, [x28, 28]
+.LBE1718:
+.LBE1717:
+	.loc 1 1082 0 is_stmt 1 discriminator 8
+	cbnz	w0, .L717
+	.loc 1 1087 0
+	ldr	w0, [x28, 192]
+	cmp	w0, 1
+	bne	.L717
+	.p2align 2
+.L727:
+	.loc 1 1088 0
+	mov	x0, x20
+	bl	ebc_power_set.constprop.7
+.LVL711:
+	b	.L717
+	.p2align 3
+.L613:
 	.loc 1 869 0
 	ldr	w0, [x28, 612]
-	cbz	w0, .L553
+	cbz	w0, .L616
 	.loc 1 870 0
 	str	w2, [x28, 616]
 	.loc 1 880 0
@@ -6996,45 +7631,45 @@ ebc_thread:
 	ldr	x1, [x27, 16]
 	ldrsw	x2, [x28, 20]
 	bl	memcpy
-.LVL656:
+.LVL712:
 	.loc 1 882 0
 	ldr	x1, [x28, 208]
 	ldr	w0, [x1, 40]
 	cmp	w0, 1
-	bls	.L667
+	bls	.L745
 	.loc 1 884 0
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x1, 16]
 	ldr	x0, [x28, 128]
 	bl	memcpy
-.LVL657:
+.LVL713:
 	.loc 1 885 0
 	ldr	x0, [x28, 208]
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x28, 136]
 	bl	memcpy
-.LVL658:
+.LVL714:
 	.loc 1 886 0
 	ldr	x0, [x28, 208]
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x28, 144]
 	bl	memcpy
-.LVL659:
-.L556:
+.LVL715:
+.L619:
 	.loc 1 893 0
 	ldr	x1, [x28, 216]
-.LBB1536:
-.LBB1537:
+.LBB1720:
+.LBB1721:
 	.loc 1 292 0
 	ldp	w4, w5, [x28, 52]
-.LBE1537:
-.LBE1536:
+.LBE1721:
+.LBE1720:
 	.loc 1 891 0
 	ldr	x8, [x28, 128]
-.LBB1542:
-.LBB1538:
+.LBB1726:
+.LBB1722:
 	.loc 1 289 0
 	ldp	w3, w14, [x1, 48]
 	.loc 1 292 0
@@ -7044,7 +7679,7 @@ ebc_thread:
 	.loc 1 287 0
 	cmp	w3, 0
 	add	w16, w3, 15
-.LVL660:
+.LVL716:
 	.loc 1 297 0
 	sub	w9, w4, #1
 	.loc 1 287 0
@@ -7052,12 +7687,12 @@ ebc_thread:
 	.loc 1 288 0
 	add	w10, w2, 15
 	cmp	w2, 0
-.LBE1538:
-.LBE1542:
+.LBE1722:
+.LBE1726:
 	.loc 1 891 0
 	ldr	w12, [x1, 40]
-.LBB1543:
-.LBB1539:
+.LBB1727:
+.LBB1723:
 	.loc 1 288 0
 	csel	w10, w10, w2, lt
 	.loc 1 292 0
@@ -7066,42 +7701,42 @@ ebc_thread:
 	.loc 1 288 0
 	asr	w10, w10, 4
 	add	w10, w10, 1
-.LVL661:
+.LVL717:
 	.loc 1 292 0
 	asr	w0, w0, 4
 	.loc 1 295 0
 	cmp	w10, w0
 	sub	w0, w0, #1
 	csel	w10, w0, w10, ge
-.LVL662:
+.LVL718:
 	.loc 1 297 0
 	cmp	w17, w4
 	csel	w17, w9, w17, ge
 	.loc 1 287 0
 	asr	w16, w16, 4
-.LVL663:
-.LBE1539:
-.LBE1543:
+.LVL719:
+.LBE1723:
+.LBE1727:
 	.loc 1 891 0
 	ldp	x13, x11, [x28, 144]
-.LVL664:
-.LBB1544:
-.LBB1540:
+.LVL720:
+.LBB1728:
+.LBB1724:
 	.loc 1 299 0
 	cmp	w14, w17
-.LBE1540:
-.LBE1544:
+.LBE1724:
+.LBE1728:
 	.loc 1 891 0
 	ldr	x9, [x28, 160]
-.LBB1545:
-.LBB1541:
+.LBB1729:
+.LBB1725:
 	.loc 1 299 0
-	bgt	.L559
+	bgt	.L622
 	.loc 1 323 0
 	mov	w15, 1
-.LVL665:
+.LVL721:
 	.p2align 2
-.L560:
+.L623:
 	.loc 1 300 0
 	mul	w5, w14, w5
 	.loc 1 304 0
@@ -7119,47 +7754,47 @@ ebc_thread:
 	sxtw	x5, w5
 	.loc 1 304 0
 	cmp	w16, w10
-	ble	.L631
-	b	.L569
-.LVL666:
+	ble	.L696
+	b	.L632
+.LVL722:
 	.p2align 3
-.L668:
+.L746:
 	.loc 1 319 0
 	and	x2, x2, x4
-.LVL667:
+.LVL723:
 	str	x2, [x8, x3]
-.L567:
+.L630:
 	.loc 1 304 0
 	add	w0, w0, 1
 	cmp	w0, w10
-	bgt	.L569
-.LVL668:
-.L631:
+	bgt	.L632
+.LVL724:
+.L696:
 	add	x3, x5, x0, sxtw 3
 	.loc 1 305 0
 	sxtw	x1, w0
 	.loc 1 308 0
 	mov	x4, -1
-.LVL669:
+.LVL725:
 	.loc 1 306 0
 	ldr	x2, [x11, x3]
-.LVL670:
+.LVL726:
 	.loc 1 307 0
-	cbz	w12, .L565
+	cbz	w12, .L628
 	.loc 1 310 0
 	ldr	x4, [x13, x3]
-.L565:
+.L628:
 	.loc 1 312 0
 	add	x1, x21, x1
 	.loc 1 318 0
 	ldrb	w18, [x9, x1]
-	cbz	w18, .L668
+	cbz	w18, .L746
 	.loc 1 321 0
 	ldr	x18, [x8, x3]
 	and	x2, x2, x4
-.LVL671:
+.LVL727:
 	cmp	x18, x2
-	beq	.L567
+	beq	.L630
 	.loc 1 322 0
 	str	x2, [x8, x3]
 	.loc 1 304 0
@@ -7168,310 +7803,34 @@ ebc_thread:
 	strb	w15, [x9, x1]
 	.loc 1 304 0
 	cmp	w0, w10
-	ble	.L631
-.LVL672:
-.L569:
+	ble	.L696
+.LVL728:
+.L632:
 	.loc 1 299 0
 	add	w14, w14, 1
 	cmp	w14, w17
-	bgt	.L559
+	bgt	.L622
 	ldr	w5, [x28, 56]
-	b	.L560
-.LVL673:
-	.p2align 3
-.L539:
-.LBE1541:
-.LBE1545:
-	.loc 1 856 0
-	mov	x0, x27
-	str	x27, [x28, 208]
-	b	.L540
-.LVL674:
-	.p2align 3
-.L656:
-	.loc 1 814 0
-	str	wzr, [x28, 612]
-	.loc 1 813 0
-	str	wzr, [x28, 616]
-	b	.L533
-.LVL675:
+	b	.L623
+.LVL729:
 	.p2align 3
-.L548:
-	.loc 1 867 0
-	cmp	w2, 13
-	ble	.L549
-	cmp	w2, 17
-	ble	.L610
-.L547:
+.L610:
+.LBE1725:
+.LBE1729:
 	.loc 1 1044 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC86
 	add	x1, x1, :lo12:.LC86
 	bl	_dev_err
-.LVL676:
-.L562:
-	.loc 1 1052 0
-	ldr	x0, [x28, 216]
-	ldr	w0, [x0, 40]
-	cmp	w0, 17
-	beq	.L669
-.L591:
-	.loc 1 1058 0
-	cmp	w0, 15
-	beq	.L670
-.L592:
-	.loc 1 1067 0
-	mov	x0, x27
-	bl	ebc_remove_from_dsp_buf_list
-.LVL677:
-	.loc 1 1069 0
-	ldr	w0, [x28, 436]
-	cbnz	w0, .L671
-.L593:
-	.loc 1 1072 0
-	mov	w0, 1
-	str	w0, [x28, 436]
-.L594:
-	.loc 1 1074 0
-	ldr	x0, [x28, 216]
-	str	x0, [x28, 208]
-	.loc 1 1075 0
-	b	.L528
-	.p2align 3
-.L610:
-	.loc 1 956 0
-	mov	w22, 1
-.L549:
-	.loc 1 965 0
-	ldr	x25, [x28, 208]
-	.loc 1 966 0
-	ldr	w0, [x25, 40]
-	cmp	w0, 1
-	bls	.L672
-.L575:
-	.loc 1 977 0
-	str	wzr, [x28, 76]
-	.loc 1 978 0
-	str	x27, [x28, 216]
-	.loc 1 980 0
-	ldr	w9, [x27, 40]
-	.loc 1 983 0
-	sub	w0, w9, #7
-	.loc 1 980 0
-	cmp	w0, 4
-	bls	.L673
-.LVL678:
-.L576:
-	.loc 1 995 0
-	cbnz	w22, .L612
-	.loc 1 999 0
-	ldr	w1, [x28, 48]
-	mov	x0, x27
-	cmp	w1, 0
-	ble	.L583
-	.loc 1 1000 0
-	add	w26, w26, 1
-	.loc 1 1001 0
-	cmp	w1, w26
-	ble	.L674
-.L583:
-	.loc 1 1008 0
-	cmp	w9, 12
-	beq	.L675
-.L584:
-	.loc 1 1014 0
-	ldr	w0, [x28, 192]
-	cbz	w0, .L676
-.L585:
-	.loc 1 1017 0
-	mov	x0, x20
-	bl	ebc_lut_update
-.LVL679:
-	mov	w22, w0
-	cbz	w0, .L586
-	.loc 1 1018 0
-	ldr	x0, [x28, 88]
-	adrp	x1, .LC83
-	add	x1, x1, :lo12:.LC83
-	.loc 1 1021 0
-	mov	w22, 0
-	.loc 1 1018 0
-	bl	_dev_err
-.LVL680:
-	.loc 1 1020 0
-	str	x25, [x28, 208]
-	.loc 1 1052 0
-	ldr	x0, [x28, 216]
-	ldr	w0, [x0, 40]
-	cmp	w0, 17
-	bne	.L591
-.LVL681:
-.L669:
-	.loc 1 1055 0
-	ldr	x0, [x28, 88]
-	.loc 1 1053 0
-	mov	w21, 1
-	.loc 1 1054 0
-	str	wzr, [x28, 196]
-	.loc 1 1055 0
-	adrp	x1, .LC87
-	.loc 1 1053 0
-	str	w21, [x28, 608]
-	.loc 1 1055 0
-	add	x1, x1, :lo12:.LC87
-	bl	_dev_info
-.LVL682:
-	.loc 1 1056 0
-	mov	w2, w21
-	mov	w1, w21
-	add	x0, x24, 328
-	bl	__wake_up_sync
-.LVL683:
-	.loc 1 1067 0
-	mov	x0, x27
-	bl	ebc_remove_from_dsp_buf_list
-.LVL684:
-	.loc 1 1069 0
-	ldr	w0, [x28, 436]
-	cbz	w0, .L593
-	.p2align 2
-.L671:
-	.loc 1 1070 0
-	ldr	x0, [x28, 208]
-	bl	ebc_buf_release
-.LVL685:
-	b	.L594
-	.p2align 3
-.L660:
-.LBB1546:
-	.loc 1 1079 0 discriminator 1
-	ldr	w0, [x28, 80]
-	cbnz	w0, .L595
-.LBB1547:
-	.loc 1 1079 0 is_stmt 0 discriminator 3
-	mov	w1, 0
-	add	x0, x29, 112
-	bl	init_wait_entry
-.LVL686:
-	b	.L599
-	.p2align 3
-.L677:
-.LBB1548:
-	.loc 1 1079 0 discriminator 7
-	ldr	w1, [x28, 80]
-	cbnz	w1, .L596
-.LVL687:
-	.loc 1 1079 0 discriminator 9
-	cbnz	x0, .L651
-	.loc 1 1079 0 discriminator 11
-	bl	schedule
-.LVL688:
-.L599:
-	.loc 1 1079 0 discriminator 13
-	add	x1, x29, 112
-	mov	w2, 1
-	mov	x0, x19
-	bl	prepare_to_wait_event
-.LVL689:
-	ldr	w1, [x28, 28]
-	cbnz	w1, .L677
-.L596:
-.LBE1548:
-	.loc 1 1079 0 discriminator 8
-	mov	x0, x19
-	add	x1, x29, 112
-	bl	finish_wait
-.LVL690:
-	ldr	w0, [x28, 28]
-.LBE1547:
-.LBE1546:
-	.loc 1 1082 0 is_stmt 1 discriminator 8
-	cbnz	w0, .L651
-	.loc 1 1087 0
-	ldr	w0, [x28, 192]
-	cmp	w0, 1
-	bne	.L651
-	.p2align 2
-.L661:
-	.loc 1 1088 0
-	mov	x0, x20
-	bl	ebc_power_set.constprop.7
-.LVL691:
-	b	.L651
-	.p2align 3
-.L550:
-	.loc 1 913 0
-	str	x27, [x28, 216]
-	.loc 1 914 0
-	ldrsw	x2, [x28, 20]
-	ldr	x0, [x28, 152]
-	ldr	x1, [x27, 16]
-	bl	memcpy
-.LVL692:
-	.loc 1 915 0
-	ldr	x0, [x28, 208]
-	ldr	w0, [x0, 40]
-	cbnz	w0, .L678
-.L571:
-	.loc 1 924 0
-	ldr	x0, [x28, 216]
-	mov	x4, x28
-	ldp	x2, x1, [x28, 144]
-	ldr	x3, [x28, 160]
-	ldr	w5, [x0, 40]
-	ldr	x0, [x28, 128]
-	bl	refresh_new_image2
-.LVL693:
-.L572:
-	.loc 1 930 0
-	ldr	w0, [x28, 28]
-	cbnz	w0, .L562
-	.loc 1 933 0
-	ldr	w0, [x28, 192]
-	.loc 1 931 0
-	mov	w1, 1
-	.loc 1 932 0
-	str	wzr, [x28, 76]
-	.loc 1 931 0
-	str	w1, [x28, 28]
-	.loc 1 933 0
-	cbz	w0, .L679
-.L573:
-	.loc 1 935 0
-	mov	x0, x20
-	bl	ebc_lut_update
-.LVL694:
-	cmn	w0, #1
-	beq	.L680
-	.loc 1 943 0
-	ldr	x0, [x28, 88]
-	adrp	x1, .LC84
-	.loc 1 940 0
-	ldr	w3, [x28, 96]
-	.loc 1 943 0
-	add	x1, x1, :lo12:.LC84
-	.loc 1 940 0
-	strb	w3, [x28, 32]
-.L650:
-	.loc 1 943 0
-	and	w2, w3, 255
-	.loc 1 941 0
-	lsr	w3, w3, 8
-	strb	w3, [x28, 33]
-	.loc 1 943 0
-	bl	_dev_info
-.LVL695:
-	.loc 1 944 0
-	mov	x0, x20
-	bl	ebc_frame_start
-.LVL696:
-	b	.L562
-.LVL697:
+.LVL730:
+	.loc 1 1045 0
+	b	.L625
+.LVL731:
 	.p2align 3
-.L586:
+.L649:
 	.loc 1 1029 0
 	ldr	x0, [x28, 216]
-.LVL698:
+.LVL732:
 	adrp	x1, .LC85
 	.loc 1 1026 0
 	ldr	w3, [x28, 96]
@@ -7484,77 +7843,77 @@ ebc_thread:
 	ldr	w2, [x0, 40]
 	ldr	x0, [x28, 88]
 	bl	_dev_info
-.LVL699:
+.LVL733:
 	.loc 1 1030 0
 	mov	w0, 1
 	str	w0, [x28, 28]
 	.loc 1 1031 0
 	mov	x0, x20
 	bl	ebc_frame_start
-.LVL700:
+.LVL734:
 	.loc 1 1033 0
 	ldr	x1, [x21, #:lo12:jiffies]
 	add	x0, x20, 680
 	str	x0, [x29, 96]
 	add	x1, x1, 900
 	bl	mod_timer
-.LVL701:
-.LBB1549:
+.LVL735:
+.LBB1730:
 	.loc 1 1034 0
 	ldr	w0, [x28, 76]
-	cbz	w0, .L681
-.L589:
-.LVL702:
-.L587:
-.LBE1549:
+	cbz	w0, .L747
+.L652:
+.LVL736:
+.L650:
+.LBE1730:
 	.loc 1 1036 0 discriminator 11
 	ldr	x2, [x21, #:lo12:jiffies]
 	mov	x1, 402653184
 	ldr	x0, [x29, 96]
-.LVL703:
+.LVL737:
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL704:
+.LVL738:
 	.loc 1 1037 0 discriminator 11
 	str	wzr, [x28, 76]
 	.loc 1 1039 0 discriminator 11
 	str	x25, [x28, 208]
 	.loc 1 1041 0 discriminator 11
-	b	.L562
-.LVL705:
+	b	.L625
+.LVL739:
 	.p2align 3
-.L612:
+.L675:
 	mov	x0, x27
 	.loc 1 996 0
 	mov	w26, 0
 	.loc 1 1008 0
 	cmp	w9, 12
-	bne	.L584
-.L675:
+	bne	.L647
+.L739:
 	.loc 1 1010 0
 	ldr	w1, [x25, 40]
 	sub	w1, w1, #12
 	cmp	w1, 1
-	bls	.L584
+	bls	.L647
 	.loc 1 1011 0
 	mov	w1, 13
 	str	w1, [x0, 40]
 	.loc 1 1014 0
 	ldr	w0, [x28, 192]
-	cbnz	w0, .L585
+	cbnz	w0, .L648
 	.p2align 2
-.L676:
-.LBB1554:
-.LBB1555:
+.L740:
+.LBB1735:
+.LBB1736:
 	mov	w1, 1
 	mov	x0, x20
 	bl	ebc_power_set.part.3
-.LVL706:
-	b	.L585
+.LVL740:
+	b	.L648
 	.p2align 3
-.L673:
-.LBE1555:
-.LBE1554:
+.L737:
+.LBE1736:
+.LBE1735:
 	.loc 1 987 0
 	ldp	w8, w0, [x20, 108]
 	.loc 1 985 0
@@ -7567,23 +7926,23 @@ ebc_thread:
 	lsr	w8, w8, 1
 	.loc 1 986 0
 	ldr	x5, [x0, 16]
-.LBB1556:
-.LBB1557:
+.LBB1737:
+.LBB1738:
 	.loc 1 767 0
 	asr	w0, w8, 3
-	cbz	w0, .L577
+	cbz	w0, .L640
 	.loc 1 771 0
 	ldr	x1, [x4]
 	ldr	x2, [x5]
 	cmp	x2, x1
-	bne	.L576
+	bne	.L639
 	sub	w3, w0, #1
 	mov	x0, 8
 	add	x3, x3, 1
 	lsl	x3, x3, 3
-	b	.L579
+	b	.L642
 	.p2align 3
-.L580:
+.L643:
 	.loc 1 768 0
 	ldr	x2, [x4, x0]
 	add	x0, x0, 8
@@ -7592,91 +7951,91 @@ ebc_thread:
 	.loc 1 771 0
 	ldr	x1, [x1, -8]
 	cmp	x2, x1
-	bne	.L576
-.L579:
+	bne	.L639
+.L642:
 	.loc 1 767 0
 	cmp	x3, x0
-	bne	.L580
-.L577:
+	bne	.L643
+.L640:
 	.loc 1 777 0
 	ands	w8, w8, 7
-.LVL707:
-	beq	.L581
+.LVL741:
+	beq	.L644
 	sub	w1, w8, #1
 	mov	x0, 0
 	add	x1, x1, 1
 	lsl	x1, x1, 2
-	b	.L582
+	b	.L645
 	.p2align 3
-.L682:
+.L748:
 	add	x0, x0, 4
 	.loc 1 778 0
 	cmp	x0, x1
-	beq	.L581
-.L582:
-.LBB1558:
+	beq	.L644
+.L645:
+.LBB1739:
 	.loc 1 782 0
 	ldrb	w3, [x4, x0]
 	ldrb	w2, [x5, x0]
 	cmp	w3, w2
-	beq	.L682
-	b	.L576
-.LVL708:
-.L553:
-.LBE1558:
-.LBE1557:
-.LBE1556:
+	beq	.L748
+	b	.L639
+.LVL742:
+.L616:
+.LBE1739:
+.LBE1738:
+.LBE1737:
 	.loc 1 873 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC81
 	add	x1, x1, :lo12:.LC81
 	bl	_dev_info
-.LVL709:
+.LVL743:
 	.loc 1 874 0
 	mov	x0, x27
-	b	.L648
-.L666:
+	b	.L714
+.L732:
 	.loc 1 861 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC79
 	add	x1, x1, :lo12:.LC79
 	bl	_dev_info
-.LVL710:
-.LBB1559:
+.LVL744:
+.LBB1740:
 	.loc 1 862 0
 	ldr	w0, [x28, 76]
-	cbz	w0, .L683
-.L545:
-.LVL711:
-.L543:
-.LBE1559:
+	cbz	w0, .L749
+.L608:
+.LVL745:
+.L606:
+.LBE1740:
 	.loc 1 863 0 discriminator 11
 	ldr	x0, [x28, 88]
-.LVL712:
+.LVL746:
 	adrp	x1, .LC80
 	add	x1, x1, :lo12:.LC80
 	bl	_dev_info
-.LVL713:
-	b	.L649
-.LVL714:
+.LVL747:
+	b	.L715
+.LVL748:
 	.p2align 3
-.L664:
+.L730:
 	.loc 1 830 0
 	str	wzr, [x28, 616]
-	b	.L533
-.LVL715:
+	b	.L596
+.LVL749:
 	.p2align 3
-.L672:
+.L736:
 	.loc 1 971 0
 	add	x0, x29, 152
 	str	x0, [x28, 208]
 	.loc 1 972 0
 	ldr	x0, [x28, 136]
 	str	x0, [x29, 168]
-	b	.L575
-.LVL716:
+	b	.L638
+.LVL750:
 	.p2align 3
-.L670:
+.L742:
 	.loc 1 1062 0
 	ldr	x0, [x28, 88]
 	.loc 1 1060 0
@@ -7693,20 +8052,20 @@ ebc_thread:
 	str	wzr, [x28, 616]
 	.loc 1 1062 0
 	bl	_dev_info
-.LVL717:
+.LVL751:
 	.loc 1 1063 0
 	mov	x0, 2
 	bl	ebc_notify
-.LVL718:
+.LVL752:
 	.loc 1 1064 0
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x24, 328
 	bl	__wake_up_sync
-.LVL719:
-	b	.L592
-.LVL720:
-.L674:
+.LVL753:
+	b	.L655
+.LVL754:
+.L738:
 	.loc 1 1002 0
 	mov	w0, 2
 	str	w0, [x27, 40]
@@ -7714,132 +8073,132 @@ ebc_thread:
 	mov	w26, 0
 	ldr	x0, [x28, 216]
 	ldr	w9, [x0, 40]
-	b	.L583
-.LVL721:
-.L678:
+	b	.L646
+.LVL755:
+.L733:
 	.loc 1 916 0
 	ldrsw	x2, [x28, 20]
 	mov	w1, 255
 	ldr	x0, [x28, 144]
 	bl	memset
-.LVL722:
+.LVL756:
 	.loc 1 918 0
 	ldr	x0, [x28, 208]
 	ldr	w0, [x0, 40]
 	cmp	w0, 1
-	bls	.L571
+	bls	.L634
 	.loc 1 920 0
 	ldr	x0, [x28, 216]
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x28, 128]
 	bl	memcpy
-.LVL723:
+.LVL757:
 	.loc 1 921 0
 	ldr	x0, [x28, 208]
 	ldrsw	x2, [x28, 20]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x28, 136]
 	bl	memcpy
-.LVL724:
-	b	.L572
-.L681:
-.LBB1563:
-.LBB1550:
-.LBB1551:
+.LVL758:
+	b	.L635
+.L747:
+.LBB1744:
+.LBB1731:
+.LBB1732:
 	.loc 1 1034 0 discriminator 1
 	add	x0, x24, 352
-.LBE1551:
+.LBE1732:
 	mov	w1, 0
-.LBB1552:
+.LBB1733:
 	str	x0, [x29, 104]
-.LBE1552:
+.LBE1733:
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL725:
-	b	.L590
+.LVL759:
+	b	.L653
 	.p2align 3
-.L684:
-.LVL726:
-.LBB1553:
+.L750:
+.LVL760:
+.LBB1734:
 	.loc 1 1034 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L587
+	cbnz	x0, .L650
 	.loc 1 1034 0 discriminator 7
 	bl	schedule
-.LVL727:
-.L590:
+.LVL761:
+.L653:
 	.loc 1 1034 0 discriminator 9
 	ldr	x0, [x29, 104]
 	add	x1, x29, 112
 	mov	w2, 1
 	bl	prepare_to_wait_event
-.LVL728:
+.LVL762:
 	ldr	w1, [x28, 76]
-	cbz	w1, .L684
-.LBE1553:
+	cbz	w1, .L750
+.LBE1734:
 	.loc 1 1034 0 discriminator 4
 	ldr	x0, [x29, 104]
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL729:
-	b	.L587
-.L667:
-.LBE1550:
-.LBE1563:
+.LVL763:
+	b	.L650
+.L745:
+.LBE1731:
+.LBE1744:
 	.loc 1 887 0 is_stmt 1
-	cbnz	w0, .L556
+	cbnz	w0, .L619
 	.loc 1 888 0
 	ldrsw	x2, [x28, 20]
 	ldp	x1, x0, [x28, 136]
 	bl	memcpy
-.LVL730:
-	b	.L556
-.L683:
-.LBB1564:
-.LBB1560:
-.LBB1561:
+.LVL764:
+	b	.L619
+.L749:
+.LBB1745:
+.LBB1741:
+.LBB1742:
 	.loc 1 862 0 discriminator 1
 	add	x25, x24, 352
-.LVL731:
-.LBE1561:
+.LVL765:
+.LBE1742:
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL732:
-	b	.L546
+.LVL766:
+	b	.L609
 	.p2align 3
-.L685:
-.LVL733:
-.LBB1562:
+.L751:
+.LVL767:
+.LBB1743:
 	.loc 1 862 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L543
+	cbnz	x0, .L606
 	.loc 1 862 0 discriminator 7
 	bl	schedule
-.LVL734:
-.L546:
+.LVL768:
+.L609:
 	.loc 1 862 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
 	mov	x0, x25
 	bl	prepare_to_wait_event
-.LVL735:
+.LVL769:
 	ldr	w1, [x28, 76]
-	cbz	w1, .L685
-.LBE1562:
+	cbz	w1, .L751
+.LBE1743:
 	.loc 1 862 0 discriminator 4
 	mov	x0, x25
 	add	x1, x29, 112
 	bl	finish_wait
-.LVL736:
-	b	.L543
-.LVL737:
-.L559:
-.LBE1560:
-.LBE1564:
+.LVL770:
+	b	.L606
+.LVL771:
+.L622:
+.LBE1741:
+.LBE1745:
 	.loc 1 895 0 is_stmt 1
 	ldr	w0, [x28, 28]
-.LVL738:
-	cbnz	w0, .L562
+.LVL772:
+	cbnz	w0, .L625
 	.loc 1 898 0
 	ldr	w0, [x28, 192]
 	.loc 1 896 0
@@ -7849,14 +8208,14 @@ ebc_thread:
 	.loc 1 896 0
 	str	w1, [x28, 28]
 	.loc 1 898 0
-	cbz	w0, .L686
-.L570:
+	cbz	w0, .L752
+.L633:
 	.loc 1 900 0
 	mov	x0, x20
 	bl	ebc_lut_update
-.LVL739:
+.LVL773:
 	cmn	w0, #1
-	beq	.L562
+	beq	.L625
 	.loc 1 904 0
 	ldr	w3, [x28, 96]
 	.loc 1 907 0
@@ -7866,66 +8225,66 @@ ebc_thread:
 	.loc 1 907 0
 	add	x1, x1, :lo12:.LC82
 	ldr	x0, [x28, 88]
-	b	.L650
-.L658:
+	b	.L716
+.L724:
 	.loc 1 805 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.7
-.LVL740:
-	b	.L530
-.LVL741:
-.L581:
+.LVL774:
+	b	.L593
+.LVL775:
+.L644:
 	.loc 1 988 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC89
 	add	x1, x1, :lo12:.LC89
 	bl	_dev_info
-.LVL742:
+.LVL776:
 	.loc 1 990 0
 	str	x25, [x28, 208]
 	.loc 1 991 0
-	b	.L562
-.L679:
-.LBB1565:
-.LBB1566:
+	b	.L625
+.L734:
+.LBB1746:
+.LBB1747:
 	mov	x0, x20
 	bl	ebc_power_set.part.3
-.LVL743:
-	b	.L573
-.L680:
-.LBE1566:
-.LBE1565:
+.LVL777:
+	b	.L636
+.L735:
+.LBE1747:
+.LBE1746:
 	.loc 1 936 0
 	ldr	x0, [x28, 88]
 	adrp	x1, .LC83
 	add	x1, x1, :lo12:.LC83
 	bl	_dev_err
-.LVL744:
+.LVL778:
 	.loc 1 937 0
-	b	.L562
-.LVL745:
-.L686:
-.LBB1567:
-.LBB1568:
+	b	.L625
+.LVL779:
+.L752:
+.LBB1748:
+.LBB1749:
 	mov	x0, x20
 	bl	ebc_power_set.part.3
-.LVL746:
-	b	.L570
-.L665:
-.LBE1568:
-.LBE1567:
-.LBB1569:
-.LBB1570:
+.LVL780:
+	b	.L633
+.L731:
+.LBE1749:
+.LBE1748:
+.LBB1750:
+.LBB1751:
 	mov	x0, x20
 	bl	ebc_power_set.part.3
-.LVL747:
-	b	.L538
-.L659:
-.LBE1570:
-.LBE1569:
+.LVL781:
+	b	.L601
+.L725:
+.LBE1751:
+.LBE1750:
 	.loc 1 1097 0
 	bl	__stack_chk_fail
-.LVL748:
+.LVL782:
 	.cfi_endproc
 .LFE2819:
 	.size	ebc_thread, .-ebc_thread
@@ -8053,14 +8412,14 @@ __func__.34835:
 	.size	__func__.34644, 16
 __func__.34644:
 	.string	"ebc_frame_start"
-	.type	__func__.35039, %object
-	.size	__func__.35039, 19
-__func__.35039:
+	.type	__func__.35043, %object
+	.size	__func__.35043, 19
+__func__.35043:
 	.string	"ebc_lut_table_init"
 	.zero	5
-	.type	__func__.35098, %object
-	.size	__func__.35098, 12
-__func__.35098:
+	.type	__func__.35102, %object
+	.size	__func__.35102, 12
+__func__.35102:
 	.string	"ebc_suspend"
 	.zero	4
 	.type	ebc_match, %object
@@ -8091,9 +8450,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init1911, %object
-	.size	__addressable_ebc_init1911, 8
-__addressable_ebc_init1911:
+	.type	__addressable_ebc_init1967, %object
+	.size	__addressable_ebc_init1967, 8
+__addressable_ebc_init1967:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -8148,7 +8507,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC15:
-	.string	"1.11"
+	.string	"1.12"
 	.zero	3
 .LC16:
 	.string	"%s\n"
@@ -8581,7 +8940,7 @@ __exitcall_ebc_exit:
 	.file 212 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x13b4e
+	.4byte	0x13e7c
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
@@ -8590,7 +8949,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.4byte	.LASF3271
 	.4byte	.LASF3272
-	.4byte	.Ldebug_ranges0+0xee0
+	.4byte	.Ldebug_ranges0+0x10a0
 	.8byte	0
 	.4byte	.Ldebug_line0
 	.uleb128 0x2
@@ -34789,7 +35148,7 @@ __exitcall_ebc_exit:
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc4
-	.byte	0x35
+	.byte	0x3b
 	.4byte	0xd9bd
 	.uleb128 0xc
 	.4byte	.LASF2871
@@ -34850,72 +35209,72 @@ __exitcall_ebc_exit:
 	.4byte	.LASF2889
 	.byte	0x2c
 	.byte	0xc4
-	.byte	0x4d
+	.byte	0x53
 	.4byte	0xda4e
 	.uleb128 0xe
 	.4byte	.LASF881
 	.byte	0xc4
-	.byte	0x4e
+	.byte	0x54
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF2890
 	.byte	0xc4
-	.byte	0x4f
+	.byte	0x55
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
 	.4byte	.LASF2891
 	.byte	0xc4
-	.byte	0x50
+	.byte	0x56
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF261
 	.byte	0xc4
-	.byte	0x51
+	.byte	0x57
 	.4byte	0xc6
 	.byte	0xc
 	.uleb128 0xe
 	.4byte	.LASF2892
 	.byte	0xc4
-	.byte	0x52
+	.byte	0x58
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
 	.4byte	.LASF2866
 	.byte	0xc4
-	.byte	0x53
+	.byte	0x59
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
 	.4byte	.LASF2867
 	.byte	0xc4
-	.byte	0x54
+	.byte	0x5a
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF2868
 	.byte	0xc4
-	.byte	0x55
+	.byte	0x5b
 	.4byte	0xc6
 	.byte	0x1c
 	.uleb128 0xe
 	.4byte	.LASF2869
 	.byte	0xc4
-	.byte	0x56
+	.byte	0x5c
 	.4byte	0xc6
 	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF2893
 	.byte	0xc4
-	.byte	0x57
+	.byte	0x5d
 	.4byte	0xc6
 	.byte	0x24
 	.uleb128 0xe
 	.4byte	.LASF2894
 	.byte	0xc4
-	.byte	0x58
+	.byte	0x5e
 	.4byte	0xc6
 	.byte	0x28
 	.byte	0
@@ -36179,7 +36538,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3001
 	.byte	0x1
-	.2byte	0x557
+	.2byte	0x58f
 	.4byte	0x7b4
 	.uleb128 0x9
 	.byte	0x3
@@ -36187,7 +36546,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3002
 	.byte	0x1
-	.2byte	0x561
+	.2byte	0x599
 	.4byte	0xc5df
 	.uleb128 0x9
 	.byte	0x3
@@ -36195,7 +36554,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3003
 	.byte	0x1
-	.2byte	0x570
+	.2byte	0x5a8
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36203,7 +36562,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x57b
+	.2byte	0x5b3
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36211,7 +36570,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3005
 	.byte	0x1
-	.2byte	0x589
+	.2byte	0x5c1
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36219,7 +36578,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3006
 	.byte	0x1
-	.2byte	0x5ac
+	.2byte	0x5e4
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36227,7 +36586,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3007
 	.byte	0x1
-	.2byte	0x5b6
+	.2byte	0x5ee
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36235,7 +36594,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3008
 	.byte	0x1
-	.2byte	0x5bf
+	.2byte	0x5f7
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36243,7 +36602,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3009
 	.byte	0x1
-	.2byte	0x758
+	.2byte	0x790
 	.4byte	0xa531
 	.uleb128 0x9
 	.byte	0x3
@@ -36260,7 +36619,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3010
 	.byte	0x1
-	.2byte	0x75d
+	.2byte	0x795
 	.4byte	0xe5a6
 	.uleb128 0x9
 	.byte	0x3
@@ -36268,7 +36627,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3011
 	.byte	0x1
-	.2byte	0x763
+	.2byte	0x79b
 	.4byte	0xd66d
 	.uleb128 0x9
 	.byte	0x3
@@ -36276,15 +36635,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3012
 	.byte	0x1
-	.2byte	0x777
+	.2byte	0x7af
 	.4byte	0x443
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init1911
+	.8byte	__addressable_ebc_init1967
 	.uleb128 0x4c
 	.4byte	.LASF3013
 	.byte	0x1
-	.2byte	0x778
+	.2byte	0x7b0
 	.4byte	0x497
 	.uleb128 0x9
 	.byte	0x3
@@ -36292,7 +36651,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x772
+	.2byte	0x7aa
 	.8byte	.LFB2845
 	.8byte	.LFE2845-.LFB2845
 	.uleb128 0x1
@@ -36300,12 +36659,12 @@ __exitcall_ebc_exit:
 	.4byte	0xe62f
 	.uleb128 0x4e
 	.8byte	.LVL32
-	.4byte	0x1386a
+	.4byte	0x13b98
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3014
 	.byte	0x1
-	.2byte	0x76d
+	.2byte	0x7a5
 	.4byte	0xc6
 	.8byte	.LFB2844
 	.8byte	.LFE2844-.LFB2844
@@ -36313,13 +36672,13 @@ __exitcall_ebc_exit:
 	.byte	0x9c
 	.4byte	0xe65f
 	.uleb128 0x4e
-	.8byte	.LVL283
-	.4byte	0x13876
+	.8byte	.LVL316
+	.4byte	0x13ba4
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3015
 	.byte	0x1
-	.2byte	0x74c
+	.2byte	0x784
 	.4byte	0xc6
 	.8byte	.LFB2843
 	.8byte	.LFE2843-.LFB2843
@@ -36329,42 +36688,42 @@ __exitcall_ebc_exit:
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x74c
+	.2byte	0x784
 	.4byte	0xa545
 	.4byte	.LLST11
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x74e
+	.2byte	0x786
 	.4byte	0xe461
 	.uleb128 0x46
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x74f
+	.2byte	0x787
 	.4byte	0xe6fb
 	.uleb128 0x53
-	.4byte	0x12f06
-	.8byte	.LBB802
-	.8byte	.LBE802-.LBB802
+	.4byte	0x13235
+	.8byte	.LBB926
+	.8byte	.LBE926-.LBB926
 	.byte	0x1
-	.2byte	0x74e
+	.2byte	0x786
 	.4byte	0xe6cb
 	.uleb128 0x54
-	.4byte	0x12f17
+	.4byte	0x13246
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12af7
-	.8byte	.LBB804
-	.8byte	.LBE804-.LBB804
+	.4byte	0x12e26
+	.8byte	.LBB928
+	.8byte	.LBE928-.LBB928
 	.byte	0x1
-	.2byte	0x751
+	.2byte	0x789
 	.4byte	0xe6ed
 	.uleb128 0x54
-	.4byte	0x12b03
+	.4byte	0x12e32
 	.byte	0
 	.uleb128 0x4e
 	.8byte	.LVL36
-	.4byte	0x13882
+	.4byte	0x13bb0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -36372,7 +36731,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x50
 	.4byte	.LASF3017
 	.byte	0x1
-	.2byte	0x73b
+	.2byte	0x773
 	.4byte	0xc6
 	.8byte	.LFB2842
 	.8byte	.LFE2842-.LFB2842
@@ -36382,54 +36741,54 @@ __exitcall_ebc_exit:
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x73b
+	.2byte	0x773
 	.4byte	0xa545
-	.4byte	.LLST137
+	.4byte	.LLST146
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x73d
+	.2byte	0x775
 	.4byte	0xe461
 	.uleb128 0x46
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x73e
+	.2byte	0x776
 	.4byte	0xe6fb
 	.uleb128 0x55
 	.4byte	.LASF3018
 	.4byte	0xe7da
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35098
+	.8byte	__func__.35102
 	.uleb128 0x53
-	.4byte	0x12f06
-	.8byte	.LBB1498
-	.8byte	.LBE1498-.LBB1498
+	.4byte	0x13235
+	.8byte	.LBB1679
+	.8byte	.LBE1679-.LBB1679
 	.byte	0x1
-	.2byte	0x73d
+	.2byte	0x775
 	.4byte	0xe780
 	.uleb128 0x54
-	.4byte	0x12f17
+	.4byte	0x13246
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12b0f
-	.8byte	.LBB1500
-	.8byte	.LBE1500-.LBB1500
+	.4byte	0x12e3e
+	.8byte	.LBB1681
+	.8byte	.LBE1681-.LBB1681
 	.byte	0x1
-	.2byte	0x746
+	.2byte	0x77e
 	.4byte	0xe7a2
 	.uleb128 0x54
-	.4byte	0x12b1b
+	.4byte	0x12e4a
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL597
-	.4byte	0x13882
+	.8byte	.LVL630
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL598
-	.4byte	0x13882
+	.8byte	.LVL631
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL599
-	.4byte	0x137a7
+	.8byte	.LVL632
+	.4byte	0x13ad5
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
@@ -36443,7 +36802,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x734
+	.2byte	0x76c
 	.4byte	0xc6
 	.8byte	.LFB2841
 	.8byte	.LFE2841-.LFB2841
@@ -36453,17 +36812,17 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x734
+	.2byte	0x76c
 	.4byte	0xd6e9
 	.4byte	.LLST13
 	.uleb128 0x4e
 	.8byte	.LVL42
-	.4byte	0x1388f
+	.4byte	0x13bbd
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3021
 	.byte	0x1
-	.2byte	0x6c8
+	.2byte	0x700
 	.4byte	0xc6
 	.8byte	.LFB2840
 	.8byte	.LFE2840-.LFB2840
@@ -36473,888 +36832,888 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x6c8
+	.2byte	0x700
 	.4byte	0xd6e9
-	.4byte	.LLST113
+	.4byte	.LLST122
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x6ca
+	.2byte	0x702
 	.4byte	0xa545
 	.uleb128 0x46
 	.4byte	.LASF3022
 	.byte	0x1
-	.2byte	0x6cb
+	.2byte	0x703
 	.4byte	0xb869
 	.uleb128 0x57
 	.4byte	.LASF3023
 	.byte	0x1
-	.2byte	0x6cc
+	.2byte	0x704
 	.4byte	0xd6e9
-	.4byte	.LLST114
+	.4byte	.LLST123
 	.uleb128 0x46
 	.4byte	.LASF3024
 	.byte	0x1
-	.2byte	0x6cd
+	.2byte	0x705
 	.4byte	0xb869
 	.uleb128 0x57
 	.4byte	.LASF3025
 	.byte	0x1
-	.2byte	0x6ce
+	.2byte	0x706
 	.4byte	0xc012
-	.4byte	.LLST115
+	.4byte	.LLST124
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x6cf
+	.2byte	0x707
 	.4byte	0xe461
 	.uleb128 0x57
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x6d0
+	.2byte	0x708
 	.4byte	0xe6fb
-	.4byte	.LLST116
+	.4byte	.LLST125
 	.uleb128 0x46
 	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x6d1
+	.2byte	0x709
 	.4byte	0xe117
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x6d2
+	.2byte	0x70a
 	.4byte	0xc6
 	.uleb128 0x58
-	.4byte	0x12f24
-	.8byte	.LBB1279
-	.4byte	.Ldebug_ranges0+0x850
+	.4byte	0x13253
+	.8byte	.LBB1460
+	.4byte	.Ldebug_ranges0+0xa10
 	.byte	0x1
-	.2byte	0x6d4
+	.2byte	0x70c
 	.4byte	0xe8fe
 	.uleb128 0x54
-	.4byte	0x12f4d
+	.4byte	0x1327c
 	.uleb128 0x54
-	.4byte	0x12f41
+	.4byte	0x13270
 	.uleb128 0x54
-	.4byte	0x12f35
+	.4byte	0x13264
 	.uleb128 0x4e
-	.8byte	.LVL410
-	.4byte	0x1389b
+	.8byte	.LVL443
+	.4byte	0x13bc9
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e01
-	.8byte	.LBB1283
-	.8byte	.LBE1283-.LBB1283
+	.4byte	0x13130
+	.8byte	.LBB1464
+	.8byte	.LBE1464-.LBB1464
 	.byte	0x1
-	.2byte	0x6e6
+	.2byte	0x71e
 	.4byte	0xe93d
 	.uleb128 0x54
-	.4byte	0x12e11
+	.4byte	0x13140
 	.uleb128 0x59
-	.4byte	0x12f06
-	.8byte	.LBB1284
-	.8byte	.LBE1284-.LBB1284
+	.4byte	0x13235
+	.8byte	.LBB1465
+	.8byte	.LBE1465-.LBB1465
 	.byte	0xbe
 	.byte	0xd8
 	.uleb128 0x54
-	.4byte	0x12f17
+	.4byte	0x13246
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e23
-	.8byte	.LBB1286
-	.8byte	.LBE1286-.LBB1286
+	.4byte	0x13152
+	.8byte	.LBB1467
+	.8byte	.LBE1467-.LBB1467
 	.byte	0x1
-	.2byte	0x6f7
+	.2byte	0x72f
 	.4byte	0xe97d
 	.uleb128 0x54
-	.4byte	0x12e34
+	.4byte	0x13163
 	.uleb128 0x5a
-	.4byte	0x12f06
-	.8byte	.LBB1287
-	.8byte	.LBE1287-.LBB1287
+	.4byte	0x13235
+	.8byte	.LBB1468
+	.8byte	.LBE1468-.LBB1468
 	.byte	0xa3
 	.2byte	0x166
 	.uleb128 0x54
-	.4byte	0x12f17
+	.4byte	0x13246
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x11247
-	.8byte	.LBB1289
-	.4byte	.Ldebug_ranges0+0x880
+	.4byte	0x11576
+	.8byte	.LBB1470
+	.4byte	.Ldebug_ranges0+0xa40
 	.byte	0x1
-	.2byte	0x705
+	.2byte	0x73d
 	.4byte	0xf336
 	.uleb128 0x54
-	.4byte	0x11258
+	.4byte	0x11587
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x880
+	.4byte	.Ldebug_ranges0+0xa40
 	.uleb128 0x5c
-	.4byte	0x11264
+	.4byte	0x11593
 	.uleb128 0x58
-	.4byte	0x12e47
-	.8byte	.LBB1291
-	.4byte	.Ldebug_ranges0+0x8e0
+	.4byte	0x13176
+	.8byte	.LBB1472
+	.4byte	.Ldebug_ranges0+0xaa0
 	.byte	0x1
 	.2byte	0x471
 	.4byte	0xea0d
 	.uleb128 0x54
-	.4byte	0x12e6f
+	.4byte	0x1319e
 	.uleb128 0x54
-	.4byte	0x12e63
+	.4byte	0x13192
 	.uleb128 0x54
-	.4byte	0x12e58
+	.4byte	0x13187
 	.uleb128 0x5d
-	.4byte	0x12e7c
-	.8byte	.LBB1292
-	.4byte	.Ldebug_ranges0+0x8e0
+	.4byte	0x131ab
+	.8byte	.LBB1473
+	.4byte	.Ldebug_ranges0+0xaa0
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x12eb0
+	.4byte	0x131df
 	.uleb128 0x54
-	.4byte	0x12ea4
+	.4byte	0x131d3
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x131c7
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x131bc
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x8e0
+	.4byte	.Ldebug_ranges0+0xaa0
 	.uleb128 0x5c
-	.4byte	0x12ebb
+	.4byte	0x131ea
 	.uleb128 0x4e
-	.8byte	.LVL418
-	.4byte	0x138a8
+	.8byte	.LVL451
+	.4byte	0x13bd6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e47
-	.8byte	.LBB1303
-	.8byte	.LBE1303-.LBB1303
+	.4byte	0x13176
+	.8byte	.LBB1484
+	.8byte	.LBE1484-.LBB1484
 	.byte	0x1
 	.2byte	0x474
 	.4byte	0xea8a
 	.uleb128 0x54
-	.4byte	0x12e6f
+	.4byte	0x1319e
 	.uleb128 0x54
-	.4byte	0x12e63
+	.4byte	0x13192
 	.uleb128 0x54
-	.4byte	0x12e58
+	.4byte	0x13187
 	.uleb128 0x5a
-	.4byte	0x12e7c
-	.8byte	.LBB1304
-	.8byte	.LBE1304-.LBB1304
+	.4byte	0x131ab
+	.8byte	.LBB1485
+	.8byte	.LBE1485-.LBB1485
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x12eb0
+	.4byte	0x131df
 	.uleb128 0x54
-	.4byte	0x12ea4
+	.4byte	0x131d3
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x131c7
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x131bc
 	.uleb128 0x5e
-	.8byte	.LBB1305
-	.8byte	.LBE1305-.LBB1305
+	.8byte	.LBB1486
+	.8byte	.LBE1486-.LBB1486
 	.uleb128 0x5c
-	.4byte	0x12ebb
+	.4byte	0x131ea
 	.uleb128 0x4e
-	.8byte	.LVL419
-	.4byte	0x138a8
+	.8byte	.LVL452
+	.4byte	0x13bd6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e47
-	.8byte	.LBB1306
-	.8byte	.LBE1306-.LBB1306
+	.4byte	0x13176
+	.8byte	.LBB1487
+	.8byte	.LBE1487-.LBB1487
 	.byte	0x1
 	.2byte	0x477
 	.4byte	0xeb07
 	.uleb128 0x54
-	.4byte	0x12e6f
+	.4byte	0x1319e
 	.uleb128 0x54
-	.4byte	0x12e63
+	.4byte	0x13192
 	.uleb128 0x54
-	.4byte	0x12e58
+	.4byte	0x13187
 	.uleb128 0x5a
-	.4byte	0x12e7c
-	.8byte	.LBB1307
-	.8byte	.LBE1307-.LBB1307
+	.4byte	0x131ab
+	.8byte	.LBB1488
+	.8byte	.LBE1488-.LBB1488
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x12eb0
+	.4byte	0x131df
 	.uleb128 0x54
-	.4byte	0x12ea4
+	.4byte	0x131d3
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x131c7
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x131bc
 	.uleb128 0x5e
-	.8byte	.LBB1308
-	.8byte	.LBE1308-.LBB1308
+	.8byte	.LBB1489
+	.8byte	.LBE1489-.LBB1489
 	.uleb128 0x5c
-	.4byte	0x12ebb
+	.4byte	0x131ea
 	.uleb128 0x4e
-	.8byte	.LVL420
-	.4byte	0x138a8
+	.8byte	.LVL453
+	.4byte	0x13bd6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e47
-	.8byte	.LBB1309
-	.8byte	.LBE1309-.LBB1309
+	.4byte	0x13176
+	.8byte	.LBB1490
+	.8byte	.LBE1490-.LBB1490
 	.byte	0x1
 	.2byte	0x47a
 	.4byte	0xeb84
 	.uleb128 0x54
-	.4byte	0x12e6f
+	.4byte	0x1319e
 	.uleb128 0x54
-	.4byte	0x12e63
+	.4byte	0x13192
 	.uleb128 0x54
-	.4byte	0x12e58
+	.4byte	0x13187
 	.uleb128 0x5a
-	.4byte	0x12e7c
-	.8byte	.LBB1310
-	.8byte	.LBE1310-.LBB1310
+	.4byte	0x131ab
+	.8byte	.LBB1491
+	.8byte	.LBE1491-.LBB1491
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x12eb0
+	.4byte	0x131df
 	.uleb128 0x54
-	.4byte	0x12ea4
+	.4byte	0x131d3
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x131c7
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x131bc
 	.uleb128 0x5e
-	.8byte	.LBB1311
-	.8byte	.LBE1311-.LBB1311
+	.8byte	.LBB1492
+	.8byte	.LBE1492-.LBB1492
 	.uleb128 0x5c
-	.4byte	0x12ebb
+	.4byte	0x131ea
 	.uleb128 0x4e
-	.8byte	.LVL421
-	.4byte	0x138a8
+	.8byte	.LVL454
+	.4byte	0x13bd6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e47
-	.8byte	.LBB1312
-	.8byte	.LBE1312-.LBB1312
+	.4byte	0x13176
+	.8byte	.LBB1493
+	.8byte	.LBE1493-.LBB1493
 	.byte	0x1
 	.2byte	0x47d
 	.4byte	0xec01
 	.uleb128 0x54
-	.4byte	0x12e6f
+	.4byte	0x1319e
 	.uleb128 0x54
-	.4byte	0x12e63
+	.4byte	0x13192
 	.uleb128 0x54
-	.4byte	0x12e58
+	.4byte	0x13187
 	.uleb128 0x5a
-	.4byte	0x12e7c
-	.8byte	.LBB1313
-	.8byte	.LBE1313-.LBB1313
+	.4byte	0x131ab
+	.8byte	.LBB1494
+	.8byte	.LBE1494-.LBB1494
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x12eb0
+	.4byte	0x131df
 	.uleb128 0x54
-	.4byte	0x12ea4
+	.4byte	0x131d3
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x131c7
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x131bc
 	.uleb128 0x5e
-	.8byte	.LBB1314
-	.8byte	.LBE1314-.LBB1314
+	.8byte	.LBB1495
+	.8byte	.LBE1495-.LBB1495
 	.uleb128 0x5c
-	.4byte	0x12ebb
+	.4byte	0x131ea
 	.uleb128 0x4e
-	.8byte	.LVL422
-	.4byte	0x138a8
+	.8byte	.LVL455
+	.4byte	0x13bd6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e47
-	.8byte	.LBB1315
-	.8byte	.LBE1315-.LBB1315
+	.4byte	0x13176
+	.8byte	.LBB1496
+	.8byte	.LBE1496-.LBB1496
 	.byte	0x1
 	.2byte	0x480
 	.4byte	0xec7e
 	.uleb128 0x54
-	.4byte	0x12e6f
+	.4byte	0x1319e
 	.uleb128 0x54
-	.4byte	0x12e63
+	.4byte	0x13192
 	.uleb128 0x54
-	.4byte	0x12e58
+	.4byte	0x13187
 	.uleb128 0x5a
-	.4byte	0x12e7c
-	.8byte	.LBB1316
-	.8byte	.LBE1316-.LBB1316
+	.4byte	0x131ab
+	.8byte	.LBB1497
+	.8byte	.LBE1497-.LBB1497
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x12eb0
+	.4byte	0x131df
 	.uleb128 0x54
-	.4byte	0x12ea4
+	.4byte	0x131d3
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x131c7
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x131bc
 	.uleb128 0x5e
-	.8byte	.LBB1317
-	.8byte	.LBE1317-.LBB1317
+	.8byte	.LBB1498
+	.8byte	.LBE1498-.LBB1498
 	.uleb128 0x5c
-	.4byte	0x12ebb
+	.4byte	0x131ea
 	.uleb128 0x4e
-	.8byte	.LVL423
-	.4byte	0x138a8
+	.8byte	.LVL456
+	.4byte	0x13bd6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e47
-	.8byte	.LBB1318
-	.8byte	.LBE1318-.LBB1318
+	.4byte	0x13176
+	.8byte	.LBB1499
+	.8byte	.LBE1499-.LBB1499
 	.byte	0x1
 	.2byte	0x483
 	.4byte	0xecfb
 	.uleb128 0x54
-	.4byte	0x12e6f
+	.4byte	0x1319e
 	.uleb128 0x54
-	.4byte	0x12e63
+	.4byte	0x13192
 	.uleb128 0x54
-	.4byte	0x12e58
+	.4byte	0x13187
 	.uleb128 0x5a
-	.4byte	0x12e7c
-	.8byte	.LBB1319
-	.8byte	.LBE1319-.LBB1319
+	.4byte	0x131ab
+	.8byte	.LBB1500
+	.8byte	.LBE1500-.LBB1500
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x12eb0
+	.4byte	0x131df
 	.uleb128 0x54
-	.4byte	0x12ea4
+	.4byte	0x131d3
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x131c7
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x131bc
 	.uleb128 0x5e
-	.8byte	.LBB1320
-	.8byte	.LBE1320-.LBB1320
+	.8byte	.LBB1501
+	.8byte	.LBE1501-.LBB1501
 	.uleb128 0x5c
-	.4byte	0x12ebb
+	.4byte	0x131ea
 	.uleb128 0x4e
-	.8byte	.LVL424
-	.4byte	0x138a8
+	.8byte	.LVL457
+	.4byte	0x13bd6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e47
-	.8byte	.LBB1321
-	.8byte	.LBE1321-.LBB1321
+	.4byte	0x13176
+	.8byte	.LBB1502
+	.8byte	.LBE1502-.LBB1502
 	.byte	0x1
 	.2byte	0x486
 	.4byte	0xed78
 	.uleb128 0x54
-	.4byte	0x12e6f
+	.4byte	0x1319e
 	.uleb128 0x54
-	.4byte	0x12e63
+	.4byte	0x13192
 	.uleb128 0x54
-	.4byte	0x12e58
+	.4byte	0x13187
 	.uleb128 0x5a
-	.4byte	0x12e7c
-	.8byte	.LBB1322
-	.8byte	.LBE1322-.LBB1322
+	.4byte	0x131ab
+	.8byte	.LBB1503
+	.8byte	.LBE1503-.LBB1503
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x12eb0
+	.4byte	0x131df
 	.uleb128 0x54
-	.4byte	0x12ea4
+	.4byte	0x131d3
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x131c7
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x131bc
 	.uleb128 0x5e
-	.8byte	.LBB1323
-	.8byte	.LBE1323-.LBB1323
+	.8byte	.LBB1504
+	.8byte	.LBE1504-.LBB1504
 	.uleb128 0x5c
-	.4byte	0x12ebb
+	.4byte	0x131ea
 	.uleb128 0x4e
-	.8byte	.LVL425
-	.4byte	0x138a8
+	.8byte	.LVL458
+	.4byte	0x13bd6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e47
-	.8byte	.LBB1324
-	.8byte	.LBE1324-.LBB1324
+	.4byte	0x13176
+	.8byte	.LBB1505
+	.8byte	.LBE1505-.LBB1505
 	.byte	0x1
 	.2byte	0x489
 	.4byte	0xedf5
 	.uleb128 0x54
-	.4byte	0x12e6f
+	.4byte	0x1319e
 	.uleb128 0x54
-	.4byte	0x12e63
+	.4byte	0x13192
 	.uleb128 0x54
-	.4byte	0x12e58
+	.4byte	0x13187
 	.uleb128 0x5a
-	.4byte	0x12e7c
-	.8byte	.LBB1325
-	.8byte	.LBE1325-.LBB1325
+	.4byte	0x131ab
+	.8byte	.LBB1506
+	.8byte	.LBE1506-.LBB1506
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x12eb0
+	.4byte	0x131df
 	.uleb128 0x54
-	.4byte	0x12ea4
+	.4byte	0x131d3
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x131c7
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x131bc
 	.uleb128 0x5e
-	.8byte	.LBB1326
-	.8byte	.LBE1326-.LBB1326
+	.8byte	.LBB1507
+	.8byte	.LBE1507-.LBB1507
 	.uleb128 0x5c
-	.4byte	0x12ebb
+	.4byte	0x131ea
 	.uleb128 0x4e
-	.8byte	.LVL426
-	.4byte	0x138a8
+	.8byte	.LVL459
+	.4byte	0x13bd6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e47
-	.8byte	.LBB1327
-	.8byte	.LBE1327-.LBB1327
+	.4byte	0x13176
+	.8byte	.LBB1508
+	.8byte	.LBE1508-.LBB1508
 	.byte	0x1
 	.2byte	0x48c
 	.4byte	0xee72
 	.uleb128 0x54
-	.4byte	0x12e6f
+	.4byte	0x1319e
 	.uleb128 0x54
-	.4byte	0x12e63
+	.4byte	0x13192
 	.uleb128 0x54
-	.4byte	0x12e58
+	.4byte	0x13187
 	.uleb128 0x5a
-	.4byte	0x12e7c
-	.8byte	.LBB1328
-	.8byte	.LBE1328-.LBB1328
+	.4byte	0x131ab
+	.8byte	.LBB1509
+	.8byte	.LBE1509-.LBB1509
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x12eb0
+	.4byte	0x131df
 	.uleb128 0x54
-	.4byte	0x12ea4
+	.4byte	0x131d3
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x131c7
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x131bc
 	.uleb128 0x5e
-	.8byte	.LBB1329
-	.8byte	.LBE1329-.LBB1329
+	.8byte	.LBB1510
+	.8byte	.LBE1510-.LBB1510
 	.uleb128 0x5c
-	.4byte	0x12ebb
+	.4byte	0x131ea
 	.uleb128 0x4e
-	.8byte	.LVL427
-	.4byte	0x138a8
+	.8byte	.LVL460
+	.4byte	0x13bd6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e47
-	.8byte	.LBB1330
-	.8byte	.LBE1330-.LBB1330
+	.4byte	0x13176
+	.8byte	.LBB1511
+	.8byte	.LBE1511-.LBB1511
 	.byte	0x1
 	.2byte	0x48f
 	.4byte	0xeeef
 	.uleb128 0x54
-	.4byte	0x12e6f
+	.4byte	0x1319e
 	.uleb128 0x54
-	.4byte	0x12e63
+	.4byte	0x13192
 	.uleb128 0x54
-	.4byte	0x12e58
+	.4byte	0x13187
 	.uleb128 0x5a
-	.4byte	0x12e7c
-	.8byte	.LBB1331
-	.8byte	.LBE1331-.LBB1331
+	.4byte	0x131ab
+	.8byte	.LBB1512
+	.8byte	.LBE1512-.LBB1512
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x12eb0
+	.4byte	0x131df
 	.uleb128 0x54
-	.4byte	0x12ea4
+	.4byte	0x131d3
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x131c7
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x131bc
 	.uleb128 0x5e
-	.8byte	.LBB1332
-	.8byte	.LBE1332-.LBB1332
+	.8byte	.LBB1513
+	.8byte	.LBE1513-.LBB1513
 	.uleb128 0x5c
-	.4byte	0x12ebb
+	.4byte	0x131ea
 	.uleb128 0x4e
-	.8byte	.LVL428
-	.4byte	0x138a8
+	.8byte	.LVL461
+	.4byte	0x13bd6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e47
-	.8byte	.LBB1333
-	.8byte	.LBE1333-.LBB1333
+	.4byte	0x13176
+	.8byte	.LBB1514
+	.8byte	.LBE1514-.LBB1514
 	.byte	0x1
 	.2byte	0x492
 	.4byte	0xef6c
 	.uleb128 0x54
-	.4byte	0x12e6f
+	.4byte	0x1319e
 	.uleb128 0x54
-	.4byte	0x12e63
+	.4byte	0x13192
 	.uleb128 0x54
-	.4byte	0x12e58
+	.4byte	0x13187
 	.uleb128 0x5a
-	.4byte	0x12e7c
-	.8byte	.LBB1334
-	.8byte	.LBE1334-.LBB1334
+	.4byte	0x131ab
+	.8byte	.LBB1515
+	.8byte	.LBE1515-.LBB1515
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x12eb0
+	.4byte	0x131df
 	.uleb128 0x54
-	.4byte	0x12ea4
+	.4byte	0x131d3
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x131c7
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x131bc
 	.uleb128 0x5e
-	.8byte	.LBB1335
-	.8byte	.LBE1335-.LBB1335
+	.8byte	.LBB1516
+	.8byte	.LBE1516-.LBB1516
 	.uleb128 0x5c
-	.4byte	0x12ebb
+	.4byte	0x131ea
 	.uleb128 0x4e
-	.8byte	.LVL429
-	.4byte	0x138a8
+	.8byte	.LVL462
+	.4byte	0x13bd6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e47
-	.8byte	.LBB1336
-	.8byte	.LBE1336-.LBB1336
+	.4byte	0x13176
+	.8byte	.LBB1517
+	.8byte	.LBE1517-.LBB1517
 	.byte	0x1
 	.2byte	0x495
 	.4byte	0xefe9
 	.uleb128 0x54
-	.4byte	0x12e6f
+	.4byte	0x1319e
 	.uleb128 0x54
-	.4byte	0x12e63
+	.4byte	0x13192
 	.uleb128 0x54
-	.4byte	0x12e58
+	.4byte	0x13187
 	.uleb128 0x5a
-	.4byte	0x12e7c
-	.8byte	.LBB1337
-	.8byte	.LBE1337-.LBB1337
+	.4byte	0x131ab
+	.8byte	.LBB1518
+	.8byte	.LBE1518-.LBB1518
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x12eb0
+	.4byte	0x131df
 	.uleb128 0x54
-	.4byte	0x12ea4
+	.4byte	0x131d3
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x131c7
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x131bc
 	.uleb128 0x5e
-	.8byte	.LBB1338
-	.8byte	.LBE1338-.LBB1338
+	.8byte	.LBB1519
+	.8byte	.LBE1519-.LBB1519
 	.uleb128 0x5c
-	.4byte	0x12ebb
+	.4byte	0x131ea
 	.uleb128 0x4e
-	.8byte	.LVL430
-	.4byte	0x138a8
+	.8byte	.LVL463
+	.4byte	0x13bd6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e47
-	.8byte	.LBB1339
-	.8byte	.LBE1339-.LBB1339
+	.4byte	0x13176
+	.8byte	.LBB1520
+	.8byte	.LBE1520-.LBB1520
 	.byte	0x1
 	.2byte	0x498
 	.4byte	0xf066
 	.uleb128 0x54
-	.4byte	0x12e6f
+	.4byte	0x1319e
 	.uleb128 0x54
-	.4byte	0x12e63
+	.4byte	0x13192
 	.uleb128 0x54
-	.4byte	0x12e58
+	.4byte	0x13187
 	.uleb128 0x5a
-	.4byte	0x12e7c
-	.8byte	.LBB1340
-	.8byte	.LBE1340-.LBB1340
+	.4byte	0x131ab
+	.8byte	.LBB1521
+	.8byte	.LBE1521-.LBB1521
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x12eb0
+	.4byte	0x131df
 	.uleb128 0x54
-	.4byte	0x12ea4
+	.4byte	0x131d3
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x131c7
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x131bc
 	.uleb128 0x5e
-	.8byte	.LBB1341
-	.8byte	.LBE1341-.LBB1341
+	.8byte	.LBB1522
+	.8byte	.LBE1522-.LBB1522
 	.uleb128 0x5c
-	.4byte	0x12ebb
+	.4byte	0x131ea
 	.uleb128 0x4e
-	.8byte	.LVL431
-	.4byte	0x138a8
+	.8byte	.LVL464
+	.4byte	0x13bd6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e47
-	.8byte	.LBB1342
-	.8byte	.LBE1342-.LBB1342
+	.4byte	0x13176
+	.8byte	.LBB1523
+	.8byte	.LBE1523-.LBB1523
 	.byte	0x1
 	.2byte	0x49b
 	.4byte	0xf0e3
 	.uleb128 0x54
-	.4byte	0x12e6f
+	.4byte	0x1319e
 	.uleb128 0x54
-	.4byte	0x12e63
+	.4byte	0x13192
 	.uleb128 0x54
-	.4byte	0x12e58
+	.4byte	0x13187
 	.uleb128 0x5a
-	.4byte	0x12e7c
-	.8byte	.LBB1343
-	.8byte	.LBE1343-.LBB1343
+	.4byte	0x131ab
+	.8byte	.LBB1524
+	.8byte	.LBE1524-.LBB1524
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x12eb0
+	.4byte	0x131df
 	.uleb128 0x54
-	.4byte	0x12ea4
+	.4byte	0x131d3
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x131c7
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x131bc
 	.uleb128 0x5e
-	.8byte	.LBB1344
-	.8byte	.LBE1344-.LBB1344
+	.8byte	.LBB1525
+	.8byte	.LBE1525-.LBB1525
 	.uleb128 0x5c
-	.4byte	0x12ebb
+	.4byte	0x131ea
 	.uleb128 0x4e
-	.8byte	.LVL432
-	.4byte	0x138a8
+	.8byte	.LVL465
+	.4byte	0x13bd6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12e47
-	.8byte	.LBB1345
-	.8byte	.LBE1345-.LBB1345
+	.4byte	0x13176
+	.8byte	.LBB1526
+	.8byte	.LBE1526-.LBB1526
 	.byte	0x1
 	.2byte	0x49e
 	.4byte	0xf160
 	.uleb128 0x54
-	.4byte	0x12e6f
+	.4byte	0x1319e
 	.uleb128 0x54
-	.4byte	0x12e63
+	.4byte	0x13192
 	.uleb128 0x54
-	.4byte	0x12e58
+	.4byte	0x13187
 	.uleb128 0x5a
-	.4byte	0x12e7c
-	.8byte	.LBB1346
-	.8byte	.LBE1346-.LBB1346
+	.4byte	0x131ab
+	.8byte	.LBB1527
+	.8byte	.LBE1527-.LBB1527
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x12eb0
+	.4byte	0x131df
 	.uleb128 0x54
-	.4byte	0x12ea4
+	.4byte	0x131d3
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x131c7
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x131bc
 	.uleb128 0x5e
-	.8byte	.LBB1347
-	.8byte	.LBE1347-.LBB1347
+	.8byte	.LBB1528
+	.8byte	.LBE1528-.LBB1528
 	.uleb128 0x5c
-	.4byte	0x12ebb
+	.4byte	0x131ea
 	.uleb128 0x4e
-	.8byte	.LVL433
-	.4byte	0x138a8
+	.8byte	.LVL466
+	.4byte	0x13bd6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12e47
-	.8byte	.LBB1348
-	.4byte	.Ldebug_ranges0+0x930
+	.4byte	0x13176
+	.8byte	.LBB1529
+	.4byte	.Ldebug_ranges0+0xaf0
 	.byte	0x1
 	.2byte	0x4a1
 	.4byte	0xf1d6
 	.uleb128 0x54
-	.4byte	0x12e6f
+	.4byte	0x1319e
 	.uleb128 0x54
-	.4byte	0x12e63
+	.4byte	0x13192
 	.uleb128 0x54
-	.4byte	0x12e58
+	.4byte	0x13187
 	.uleb128 0x5d
-	.4byte	0x12e7c
-	.8byte	.LBB1349
-	.4byte	.Ldebug_ranges0+0x930
+	.4byte	0x131ab
+	.8byte	.LBB1530
+	.4byte	.Ldebug_ranges0+0xaf0
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x12eb0
+	.4byte	0x131df
 	.uleb128 0x54
-	.4byte	0x12ea4
+	.4byte	0x131d3
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x131c7
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x131bc
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x930
+	.4byte	.Ldebug_ranges0+0xaf0
 	.uleb128 0x5c
-	.4byte	0x12ebb
+	.4byte	0x131ea
 	.uleb128 0x4e
-	.8byte	.LVL434
-	.4byte	0x138a8
+	.8byte	.LVL467
+	.4byte	0x13bd6
 	.uleb128 0x4e
-	.8byte	.LVL469
-	.4byte	0x138a8
+	.8byte	.LVL502
+	.4byte	0x13bd6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12e47
-	.8byte	.LBB1355
-	.4byte	.Ldebug_ranges0+0x970
+	.4byte	0x13176
+	.8byte	.LBB1536
+	.4byte	.Ldebug_ranges0+0xb30
 	.byte	0x1
 	.2byte	0x4a4
 	.4byte	0xf24c
 	.uleb128 0x54
-	.4byte	0x12e6f
+	.4byte	0x1319e
 	.uleb128 0x54
-	.4byte	0x12e63
+	.4byte	0x13192
 	.uleb128 0x54
-	.4byte	0x12e58
+	.4byte	0x13187
 	.uleb128 0x5d
-	.4byte	0x12e7c
-	.8byte	.LBB1356
-	.4byte	.Ldebug_ranges0+0x970
+	.4byte	0x131ab
+	.8byte	.LBB1537
+	.4byte	.Ldebug_ranges0+0xb30
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x12eb0
+	.4byte	0x131df
 	.uleb128 0x54
-	.4byte	0x12ea4
+	.4byte	0x131d3
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x131c7
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x131bc
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x970
+	.4byte	.Ldebug_ranges0+0xb30
 	.uleb128 0x5c
-	.4byte	0x12ebb
-	.uleb128 0x4e
-	.8byte	.LVL435
-	.4byte	0x138a8
+	.4byte	0x131ea
 	.uleb128 0x4e
 	.8byte	.LVL468
-	.4byte	0x138a8
+	.4byte	0x13bd6
+	.uleb128 0x4e
+	.8byte	.LVL501
+	.4byte	0x13bd6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12e47
-	.8byte	.LBB1362
-	.4byte	.Ldebug_ranges0+0x9b0
+	.4byte	0x13176
+	.8byte	.LBB1543
+	.4byte	.Ldebug_ranges0+0xb70
 	.byte	0x1
 	.2byte	0x4a7
 	.4byte	0xf2c2
 	.uleb128 0x54
-	.4byte	0x12e6f
+	.4byte	0x1319e
 	.uleb128 0x54
-	.4byte	0x12e63
+	.4byte	0x13192
 	.uleb128 0x54
-	.4byte	0x12e58
+	.4byte	0x13187
 	.uleb128 0x5d
-	.4byte	0x12e7c
-	.8byte	.LBB1363
-	.4byte	.Ldebug_ranges0+0x9b0
+	.4byte	0x131ab
+	.8byte	.LBB1544
+	.4byte	.Ldebug_ranges0+0xb70
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x12eb0
+	.4byte	0x131df
 	.uleb128 0x54
-	.4byte	0x12ea4
+	.4byte	0x131d3
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x131c7
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x131bc
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x9b0
+	.4byte	.Ldebug_ranges0+0xb70
 	.uleb128 0x5c
-	.4byte	0x12ebb
+	.4byte	0x131ea
 	.uleb128 0x4e
-	.8byte	.LVL436
-	.4byte	0x138a8
+	.8byte	.LVL469
+	.4byte	0x13bd6
 	.uleb128 0x4e
-	.8byte	.LVL467
-	.4byte	0x138a8
+	.8byte	.LVL500
+	.4byte	0x13bd6
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x12e47
-	.8byte	.LBB1369
-	.4byte	.Ldebug_ranges0+0x9f0
+	.4byte	0x13176
+	.8byte	.LBB1550
+	.4byte	.Ldebug_ranges0+0xbb0
 	.byte	0x1
 	.2byte	0x4aa
 	.uleb128 0x54
-	.4byte	0x12e6f
+	.4byte	0x1319e
 	.uleb128 0x54
-	.4byte	0x12e63
+	.4byte	0x13192
 	.uleb128 0x54
-	.4byte	0x12e58
+	.4byte	0x13187
 	.uleb128 0x5d
-	.4byte	0x12e7c
-	.8byte	.LBB1370
-	.4byte	.Ldebug_ranges0+0x9f0
+	.4byte	0x131ab
+	.8byte	.LBB1551
+	.4byte	.Ldebug_ranges0+0xbb0
 	.byte	0xe
 	.2byte	0x49c
 	.uleb128 0x54
-	.4byte	0x12eb0
+	.4byte	0x131df
 	.uleb128 0x54
-	.4byte	0x12ea4
+	.4byte	0x131d3
 	.uleb128 0x54
-	.4byte	0x12e98
+	.4byte	0x131c7
 	.uleb128 0x54
-	.4byte	0x12e8d
+	.4byte	0x131bc
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x9f0
+	.4byte	.Ldebug_ranges0+0xbb0
 	.uleb128 0x5c
-	.4byte	0x12ebb
+	.4byte	0x131ea
 	.uleb128 0x4e
-	.8byte	.LVL437
-	.4byte	0x138a8
+	.8byte	.LVL470
+	.4byte	0x13bd6
 	.uleb128 0x4e
-	.8byte	.LVL466
-	.4byte	0x138a8
+	.8byte	.LVL499
+	.4byte	0x13bd6
 	.byte	0
 	.byte	0
 	.byte	0
@@ -37362,18 +37721,18 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x58
 	.4byte	0xfd39
-	.8byte	.LBB1391
-	.4byte	.Ldebug_ranges0+0xa30
+	.8byte	.LBB1572
+	.4byte	.Ldebug_ranges0+0xbf0
 	.byte	0x1
-	.2byte	0x710
+	.2byte	0x748
 	.4byte	0xf518
 	.uleb128 0x54
 	.4byte	0xfd4a
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xa30
+	.4byte	.Ldebug_ranges0+0xbf0
 	.uleb128 0x5f
 	.4byte	0xfd56
-	.4byte	.LLST117
+	.4byte	.LLST126
 	.uleb128 0x5c
 	.4byte	0xfd62
 	.uleb128 0x5c
@@ -37392,144 +37751,144 @@ __exitcall_ebc_exit:
 	.uleb128 0x5c
 	.4byte	0xfda8
 	.uleb128 0x58
-	.4byte	0x12f5a
-	.8byte	.LBB1393
-	.4byte	.Ldebug_ranges0+0xaa0
+	.4byte	0x13289
+	.8byte	.LBB1574
+	.4byte	.Ldebug_ranges0+0xc60
 	.byte	0x1
-	.2byte	0x60f
+	.2byte	0x647
 	.4byte	0xf3a6
 	.uleb128 0x54
-	.4byte	0x12f6a
+	.4byte	0x13299
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12f24
-	.8byte	.LBB1397
-	.4byte	.Ldebug_ranges0+0xad0
+	.4byte	0x13253
+	.8byte	.LBB1578
+	.4byte	.Ldebug_ranges0+0xc90
 	.byte	0x1
-	.2byte	0x62a
+	.2byte	0x662
 	.4byte	0xf3db
 	.uleb128 0x54
-	.4byte	0x12f4d
+	.4byte	0x1327c
 	.uleb128 0x54
-	.4byte	0x12f41
+	.4byte	0x13270
 	.uleb128 0x54
-	.4byte	0x12f35
+	.4byte	0x13264
 	.uleb128 0x4e
-	.8byte	.LVL443
-	.4byte	0x1389b
+	.8byte	.LVL476
+	.4byte	0x13bc9
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12f24
-	.8byte	.LBB1405
-	.8byte	.LBE1405-.LBB1405
+	.4byte	0x13253
+	.8byte	.LBB1586
+	.8byte	.LBE1586-.LBB1586
 	.byte	0x1
-	.2byte	0x62d
+	.2byte	0x665
 	.4byte	0xf414
 	.uleb128 0x54
-	.4byte	0x12f4d
+	.4byte	0x1327c
 	.uleb128 0x54
-	.4byte	0x12f41
+	.4byte	0x13270
 	.uleb128 0x54
-	.4byte	0x12f35
+	.4byte	0x13264
 	.uleb128 0x4e
-	.8byte	.LVL444
-	.4byte	0x1389b
+	.8byte	.LVL477
+	.4byte	0x13bc9
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12f24
-	.8byte	.LBB1407
-	.8byte	.LBE1407-.LBB1407
+	.4byte	0x13253
+	.8byte	.LBB1588
+	.8byte	.LBE1588-.LBB1588
 	.byte	0x1
-	.2byte	0x630
+	.2byte	0x668
 	.4byte	0xf44d
 	.uleb128 0x54
-	.4byte	0x12f4d
+	.4byte	0x1327c
 	.uleb128 0x54
-	.4byte	0x12f41
+	.4byte	0x13270
 	.uleb128 0x54
-	.4byte	0x12f35
+	.4byte	0x13264
 	.uleb128 0x4e
-	.8byte	.LVL445
-	.4byte	0x1389b
+	.8byte	.LVL478
+	.4byte	0x13bc9
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12f24
-	.8byte	.LBB1409
-	.8byte	.LBE1409-.LBB1409
+	.4byte	0x13253
+	.8byte	.LBB1590
+	.8byte	.LBE1590-.LBB1590
 	.byte	0x1
-	.2byte	0x633
+	.2byte	0x66b
 	.4byte	0xf486
 	.uleb128 0x54
-	.4byte	0x12f4d
+	.4byte	0x1327c
 	.uleb128 0x54
-	.4byte	0x12f41
+	.4byte	0x13270
 	.uleb128 0x54
-	.4byte	0x12f35
+	.4byte	0x13264
 	.uleb128 0x4e
-	.8byte	.LVL446
-	.4byte	0x1389b
+	.8byte	.LVL479
+	.4byte	0x13bc9
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12f24
-	.8byte	.LBB1411
-	.4byte	.Ldebug_ranges0+0xb20
+	.4byte	0x13253
+	.8byte	.LBB1592
+	.4byte	.Ldebug_ranges0+0xce0
 	.byte	0x1
-	.2byte	0x638
+	.2byte	0x670
 	.4byte	0xf4bb
 	.uleb128 0x54
-	.4byte	0x12f4d
+	.4byte	0x1327c
 	.uleb128 0x54
-	.4byte	0x12f41
+	.4byte	0x13270
 	.uleb128 0x54
-	.4byte	0x12f35
+	.4byte	0x13264
 	.uleb128 0x4e
-	.8byte	.LVL447
-	.4byte	0x1389b
+	.8byte	.LVL480
+	.4byte	0x13bc9
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL439
-	.4byte	0x138b5
+	.8byte	.LVL472
+	.4byte	0x13be3
 	.uleb128 0x4e
-	.8byte	.LVL440
-	.4byte	0x138c2
+	.8byte	.LVL473
+	.4byte	0x13bf0
 	.uleb128 0x4e
-	.8byte	.LVL441
-	.4byte	0x138ce
+	.8byte	.LVL474
+	.4byte	0x13bfc
 	.uleb128 0x4e
-	.8byte	.LVL442
-	.4byte	0x138da
+	.8byte	.LVL475
+	.4byte	0x13c08
 	.uleb128 0x4e
-	.8byte	.LVL448
-	.4byte	0x138e6
+	.8byte	.LVL481
+	.4byte	0x13c14
 	.uleb128 0x4e
-	.8byte	.LVL449
-	.4byte	0x138f0
+	.8byte	.LVL482
+	.4byte	0x13c1e
 	.uleb128 0x4e
-	.8byte	.LVL463
-	.4byte	0x138fc
+	.8byte	.LVL496
+	.4byte	0x13c2a
 	.byte	0
 	.byte	0
 	.uleb128 0x58
 	.4byte	0xfdb3
-	.8byte	.LBB1422
-	.4byte	.Ldebug_ranges0+0xb50
+	.8byte	.LBB1603
+	.4byte	.Ldebug_ranges0+0xd10
 	.byte	0x1
-	.2byte	0x717
+	.2byte	0x74f
 	.4byte	0xf5fe
 	.uleb128 0x54
 	.4byte	0xfdc4
 	.uleb128 0x54
 	.4byte	0xfdc4
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xb50
+	.4byte	.Ldebug_ranges0+0xd10
 	.uleb128 0x5c
 	.4byte	0xfdd0
 	.uleb128 0x5f
 	.4byte	0xfddc
-	.4byte	.LLST118
+	.4byte	.LLST127
 	.uleb128 0x5f
 	.4byte	0xfde8
-	.4byte	.LLST119
+	.4byte	.LLST128
 	.uleb128 0x60
 	.4byte	0xfdf4
 	.uleb128 0x3
@@ -37537,693 +37896,693 @@ __exitcall_ebc_exit:
 	.sleb128 -104
 	.uleb128 0x5f
 	.4byte	0xfdfe
-	.4byte	.LLST120
+	.4byte	.LLST129
 	.uleb128 0x5c
 	.4byte	0xfe0a
 	.uleb128 0x5c
 	.4byte	0xfe16
 	.uleb128 0x53
-	.4byte	0x12f5a
-	.8byte	.LBB1424
-	.8byte	.LBE1424-.LBB1424
+	.4byte	0x13289
+	.8byte	.LBB1605
+	.8byte	.LBE1605-.LBB1605
 	.byte	0x1
-	.2byte	0x5e2
+	.2byte	0x61a
 	.4byte	0xf594
 	.uleb128 0x54
-	.4byte	0x12f6a
+	.4byte	0x13299
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL451
-	.4byte	0x138b5
+	.8byte	.LVL484
+	.4byte	0x13be3
 	.uleb128 0x4e
-	.8byte	.LVL452
-	.4byte	0x138c2
+	.8byte	.LVL485
+	.4byte	0x13bf0
 	.uleb128 0x4e
-	.8byte	.LVL472
-	.4byte	0x138ce
+	.8byte	.LVL505
+	.4byte	0x13bfc
 	.uleb128 0x4e
-	.8byte	.LVL473
-	.4byte	0x13909
+	.8byte	.LVL506
+	.4byte	0x13c37
 	.uleb128 0x4e
-	.8byte	.LVL551
-	.4byte	0x138fc
+	.8byte	.LVL584
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL552
-	.4byte	0x13915
+	.8byte	.LVL585
+	.4byte	0x13c43
 	.uleb128 0x4e
-	.8byte	.LVL553
-	.4byte	0x138fc
+	.8byte	.LVL586
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL572
-	.4byte	0x138fc
+	.8byte	.LVL605
+	.4byte	0x13c2a
 	.byte	0
 	.byte	0
 	.uleb128 0x58
 	.4byte	0xfd01
-	.8byte	.LBB1433
-	.4byte	.Ldebug_ranges0+0xbb0
+	.8byte	.LBB1614
+	.4byte	.Ldebug_ranges0+0xd70
 	.byte	0x1
-	.2byte	0x71e
+	.2byte	0x756
 	.4byte	0xf78b
 	.uleb128 0x54
 	.4byte	0xfd12
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xbb0
+	.4byte	.Ldebug_ranges0+0xd70
 	.uleb128 0x60
 	.4byte	0xfd1e
 	.uleb128 0x3
 	.byte	0x91
 	.sleb128 -104
 	.uleb128 0x58
-	.4byte	0x13130
-	.8byte	.LBB1435
-	.4byte	.Ldebug_ranges0+0xbf0
+	.4byte	0x1345f
+	.8byte	.LBB1616
+	.4byte	.Ldebug_ranges0+0xdb0
 	.byte	0x1
-	.2byte	0x645
+	.2byte	0x67d
 	.4byte	0xf685
 	.uleb128 0x54
-	.4byte	0x1313c
+	.4byte	0x1346b
 	.uleb128 0x5e
-	.8byte	.LBB1437
-	.8byte	.LBE1437-.LBB1437
+	.8byte	.LBB1618
+	.8byte	.LBE1618-.LBB1618
 	.uleb128 0x5c
-	.4byte	0x13167
+	.4byte	0x13496
 	.uleb128 0x59
-	.4byte	0x132b3
-	.8byte	.LBB1438
-	.8byte	.LBE1438-.LBB1438
+	.4byte	0x135e3
+	.8byte	.LBB1619
+	.8byte	.LBE1619-.LBB1619
 	.byte	0x10
 	.byte	0x1c
 	.uleb128 0x54
-	.4byte	0x132d3
+	.4byte	0x13603
 	.uleb128 0x54
-	.4byte	0x132c8
+	.4byte	0x135f8
 	.uleb128 0x54
-	.4byte	0x132bf
+	.4byte	0x135ef
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131f5
-	.8byte	.LBB1442
-	.8byte	.LBE1442-.LBB1442
+	.4byte	0x13525
+	.8byte	.LBB1623
+	.8byte	.LBE1623-.LBB1623
 	.byte	0x1
-	.2byte	0x64d
+	.2byte	0x685
 	.4byte	0xf6d0
 	.uleb128 0x54
-	.4byte	0x1320a
+	.4byte	0x1353a
 	.uleb128 0x54
-	.4byte	0x13201
+	.4byte	0x13531
 	.uleb128 0x5e
-	.8byte	.LBB1443
-	.8byte	.LBE1443-.LBB1443
+	.8byte	.LBB1624
+	.8byte	.LBE1624-.LBB1624
 	.uleb128 0x5f
-	.4byte	0x13213
-	.4byte	.LLST121
+	.4byte	0x13543
+	.4byte	.LLST130
 	.uleb128 0x5f
-	.4byte	0x1321d
-	.4byte	.LLST122
+	.4byte	0x1354d
+	.4byte	.LLST131
 	.byte	0
 	.byte	0
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xc20
+	.4byte	.Ldebug_ranges0+0xde0
 	.4byte	0xf6fd
 	.uleb128 0x5f
 	.4byte	0xfd2b
-	.4byte	.LLST123
+	.4byte	.LLST132
 	.uleb128 0x4e
-	.8byte	.LVL480
-	.4byte	0x13921
+	.8byte	.LVL513
+	.4byte	0x13c4f
 	.uleb128 0x4e
-	.8byte	.LVL482
-	.4byte	0x1392d
+	.8byte	.LVL515
+	.4byte	0x13c5b
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x131f5
-	.8byte	.LBB1446
-	.8byte	.LBE1446-.LBB1446
+	.4byte	0x13525
+	.8byte	.LBB1627
+	.8byte	.LBE1627-.LBB1627
 	.byte	0x1
-	.2byte	0x656
+	.2byte	0x68e
 	.4byte	0xf748
 	.uleb128 0x54
-	.4byte	0x1320a
+	.4byte	0x1353a
 	.uleb128 0x54
-	.4byte	0x13201
+	.4byte	0x13531
 	.uleb128 0x5e
-	.8byte	.LBB1447
-	.8byte	.LBE1447-.LBB1447
+	.8byte	.LBB1628
+	.8byte	.LBE1628-.LBB1628
 	.uleb128 0x5f
-	.4byte	0x13213
-	.4byte	.LLST124
+	.4byte	0x13543
+	.4byte	.LLST133
 	.uleb128 0x5f
-	.4byte	0x1321d
-	.4byte	.LLST125
+	.4byte	0x1354d
+	.4byte	.LLST134
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL474
-	.4byte	0x13921
+	.8byte	.LVL507
+	.4byte	0x13c4f
 	.uleb128 0x4e
-	.8byte	.LVL475
-	.4byte	0x1393a
+	.8byte	.LVL508
+	.4byte	0x13c68
 	.uleb128 0x4e
-	.8byte	.LVL483
-	.4byte	0x1393a
+	.8byte	.LVL516
+	.4byte	0x13c68
 	.uleb128 0x4e
-	.8byte	.LVL556
-	.4byte	0x138fc
+	.8byte	.LVL589
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL560
-	.4byte	0x138fc
+	.8byte	.LVL593
+	.4byte	0x13c2a
 	.byte	0
 	.byte	0
 	.uleb128 0x53
 	.4byte	0xfce7
-	.8byte	.LBB1450
-	.8byte	.LBE1450-.LBB1450
+	.8byte	.LBB1631
+	.8byte	.LBE1631-.LBB1631
 	.byte	0x1
-	.2byte	0x725
+	.2byte	0x75d
 	.4byte	0xf825
 	.uleb128 0x54
 	.4byte	0xfcf4
 	.uleb128 0x58
-	.4byte	0x12b8d
-	.8byte	.LBB1452
-	.4byte	.Ldebug_ranges0+0xc50
+	.4byte	0x12ebc
+	.8byte	.LBB1633
+	.4byte	.Ldebug_ranges0+0xe10
 	.byte	0x1
-	.2byte	0x666
+	.2byte	0x69e
 	.4byte	0xf7f0
 	.uleb128 0x54
-	.4byte	0x12baf
+	.4byte	0x12ede
 	.uleb128 0x54
-	.4byte	0x12ba4
+	.4byte	0x12ed3
 	.uleb128 0x54
-	.4byte	0x12b99
+	.4byte	0x12ec8
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xc50
+	.4byte	.Ldebug_ranges0+0xe10
 	.uleb128 0x5f
-	.4byte	0x12bba
-	.4byte	.LLST126
+	.4byte	0x12ee9
+	.4byte	.LLST135
 	.uleb128 0x4e
-	.8byte	.LVL490
-	.4byte	0x13947
+	.8byte	.LVL523
+	.4byte	0x13c75
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL491
-	.4byte	0x13953
+	.8byte	.LVL524
+	.4byte	0x13c81
 	.uleb128 0x4e
-	.8byte	.LVL492
-	.4byte	0x1395f
+	.8byte	.LVL525
+	.4byte	0x13c8d
 	.uleb128 0x4e
-	.8byte	.LVL493
-	.4byte	0x13953
+	.8byte	.LVL526
+	.4byte	0x13c81
 	.uleb128 0x4e
-	.8byte	.LVL494
-	.4byte	0x1395f
+	.8byte	.LVL527
+	.4byte	0x13c8d
 	.byte	0
 	.uleb128 0x58
 	.4byte	0xfc45
-	.8byte	.LBB1462
-	.4byte	.Ldebug_ranges0+0xcb0
+	.8byte	.LBB1643
+	.4byte	.Ldebug_ranges0+0xe70
 	.byte	0x1
-	.2byte	0x728
+	.2byte	0x760
 	.4byte	0xfac8
 	.uleb128 0x54
 	.4byte	0xfc62
 	.uleb128 0x54
 	.4byte	0xfc56
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xcb0
+	.4byte	.Ldebug_ranges0+0xe70
 	.uleb128 0x5c
 	.4byte	0xfc6e
 	.uleb128 0x5f
 	.4byte	0xfc7a
-	.4byte	.LLST127
+	.4byte	.LLST136
 	.uleb128 0x5f
 	.4byte	0xfc86
-	.4byte	.LLST128
+	.4byte	.LLST137
 	.uleb128 0x5f
 	.4byte	0xfc92
-	.4byte	.LLST129
+	.4byte	.LLST138
 	.uleb128 0x5f
 	.4byte	0xfc9e
-	.4byte	.LLST130
+	.4byte	.LLST139
 	.uleb128 0x5f
 	.4byte	0xfcaa
-	.4byte	.LLST131
+	.4byte	.LLST140
 	.uleb128 0x5f
 	.4byte	0xfcb6
-	.4byte	.LLST132
+	.4byte	.LLST141
 	.uleb128 0x5c
 	.4byte	0xfcc2
 	.uleb128 0x5f
 	.4byte	0xfcce
-	.4byte	.LLST133
+	.4byte	.LLST142
 	.uleb128 0x5f
 	.4byte	0xfcda
-	.4byte	.LLST134
+	.4byte	.LLST143
 	.uleb128 0x53
-	.4byte	0x1130b
-	.8byte	.LBB1464
-	.8byte	.LBE1464-.LBB1464
+	.4byte	0x1163a
+	.8byte	.LBB1645
+	.8byte	.LBE1645-.LBB1645
 	.byte	0x1
-	.2byte	0x69e
+	.2byte	0x6d6
 	.4byte	0xf907
 	.uleb128 0x54
-	.4byte	0x1131c
+	.4byte	0x1164b
 	.uleb128 0x54
-	.4byte	0x1131c
+	.4byte	0x1164b
 	.uleb128 0x5e
-	.8byte	.LBB1465
-	.8byte	.LBE1465-.LBB1465
+	.8byte	.LBB1646
+	.8byte	.LBE1646-.LBB1646
 	.uleb128 0x5f
-	.4byte	0x11328
-	.4byte	.LLST135
+	.4byte	0x11657
+	.4byte	.LLST144
 	.uleb128 0x4e
-	.8byte	.LVL525
-	.4byte	0x1396b
+	.8byte	.LVL558
+	.4byte	0x13c99
 	.uleb128 0x4e
-	.8byte	.LVL527
-	.4byte	0x138f0
+	.8byte	.LVL560
+	.4byte	0x13c1e
 	.uleb128 0x4e
-	.8byte	.LVL528
-	.4byte	0x13977
+	.8byte	.LVL561
+	.4byte	0x13ca5
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12d0a
-	.8byte	.LBB1466
-	.8byte	.LBE1466-.LBB1466
+	.4byte	0x13039
+	.8byte	.LBB1647
+	.8byte	.LBE1647-.LBB1647
 	.byte	0x1
-	.2byte	0x692
+	.2byte	0x6ca
 	.4byte	0xf95e
 	.uleb128 0x54
-	.4byte	0x12d27
+	.4byte	0x13056
 	.uleb128 0x54
-	.4byte	0x12d1b
+	.4byte	0x1304a
 	.uleb128 0x5a
-	.4byte	0x12d34
-	.8byte	.LBB1467
-	.8byte	.LBE1467-.LBB1467
+	.4byte	0x13063
+	.8byte	.LBB1648
+	.8byte	.LBE1648-.LBB1648
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x12d51
+	.4byte	0x13080
 	.uleb128 0x54
-	.4byte	0x12d45
+	.4byte	0x13074
 	.uleb128 0x4e
-	.8byte	.LVL532
-	.4byte	0x13983
+	.8byte	.LVL565
+	.4byte	0x13cb1
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12d0a
-	.8byte	.LBB1469
-	.8byte	.LBE1469-.LBB1469
+	.4byte	0x13039
+	.8byte	.LBB1650
+	.8byte	.LBE1650-.LBB1650
 	.byte	0x1
-	.2byte	0x684
+	.2byte	0x6bc
 	.4byte	0xf9b5
 	.uleb128 0x54
-	.4byte	0x12d27
+	.4byte	0x13056
 	.uleb128 0x54
-	.4byte	0x12d1b
+	.4byte	0x1304a
 	.uleb128 0x5a
-	.4byte	0x12d34
-	.8byte	.LBB1470
-	.8byte	.LBE1470-.LBB1470
+	.4byte	0x13063
+	.8byte	.LBB1651
+	.8byte	.LBE1651-.LBB1651
 	.byte	0x12
 	.2byte	0x2e7
 	.uleb128 0x54
-	.4byte	0x12d51
+	.4byte	0x13080
 	.uleb128 0x54
-	.4byte	0x12d45
+	.4byte	0x13074
 	.uleb128 0x4e
-	.8byte	.LVL544
-	.4byte	0x13983
+	.8byte	.LVL577
+	.4byte	0x13cb1
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL496
-	.4byte	0x13990
+	.8byte	.LVL529
+	.4byte	0x13cbe
 	.uleb128 0x4e
-	.8byte	.LVL498
-	.4byte	0x13990
+	.8byte	.LVL531
+	.4byte	0x13cbe
 	.uleb128 0x4e
-	.8byte	.LVL500
-	.4byte	0x1399c
+	.8byte	.LVL533
+	.4byte	0x13cca
 	.uleb128 0x4e
-	.8byte	.LVL505
-	.4byte	0x1399c
+	.8byte	.LVL538
+	.4byte	0x13cca
 	.uleb128 0x4e
-	.8byte	.LVL508
-	.4byte	0x1396b
+	.8byte	.LVL541
+	.4byte	0x13c99
 	.uleb128 0x4e
-	.8byte	.LVL510
-	.4byte	0x139a9
+	.8byte	.LVL543
+	.4byte	0x13cd7
 	.uleb128 0x4e
-	.8byte	.LVL511
-	.4byte	0x13977
+	.8byte	.LVL544
+	.4byte	0x13ca5
 	.uleb128 0x4e
-	.8byte	.LVL512
-	.4byte	0x139b3
+	.8byte	.LVL545
+	.4byte	0x13ce1
 	.uleb128 0x4e
-	.8byte	.LVL513
-	.4byte	0x139b3
+	.8byte	.LVL546
+	.4byte	0x13ce1
 	.uleb128 0x4e
-	.8byte	.LVL523
-	.4byte	0x13882
+	.8byte	.LVL556
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL524
-	.4byte	0x139bf
+	.8byte	.LVL557
+	.4byte	0x13ced
 	.uleb128 0x4e
-	.8byte	.LVL529
-	.4byte	0x139cb
+	.8byte	.LVL562
+	.4byte	0x13cf9
 	.uleb128 0x4e
-	.8byte	.LVL531
-	.4byte	0x13882
+	.8byte	.LVL564
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL535
-	.4byte	0x139a9
+	.8byte	.LVL568
+	.4byte	0x13cd7
 	.uleb128 0x4e
-	.8byte	.LVL538
-	.4byte	0x1396b
+	.8byte	.LVL571
+	.4byte	0x13c99
 	.uleb128 0x4e
-	.8byte	.LVL540
-	.4byte	0x139a9
+	.8byte	.LVL573
+	.4byte	0x13cd7
 	.uleb128 0x4e
-	.8byte	.LVL541
-	.4byte	0x13977
+	.8byte	.LVL574
+	.4byte	0x13ca5
 	.uleb128 0x4e
-	.8byte	.LVL543
-	.4byte	0x13882
+	.8byte	.LVL576
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL548
-	.4byte	0x139a9
+	.8byte	.LVL581
+	.4byte	0x13cd7
 	.uleb128 0x4e
-	.8byte	.LVL576
-	.4byte	0x138fc
+	.8byte	.LVL609
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL579
-	.4byte	0x138fc
+	.8byte	.LVL612
+	.4byte	0x13c2a
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12dde
-	.8byte	.LBB1475
-	.8byte	.LBE1475-.LBB1475
+	.4byte	0x1310d
+	.8byte	.LBB1656
+	.8byte	.LBE1656-.LBB1656
 	.byte	0x1
-	.2byte	0x72a
+	.2byte	0x762
 	.4byte	0xfb11
 	.uleb128 0x54
-	.4byte	0x12df5
+	.4byte	0x13124
 	.uleb128 0x54
-	.4byte	0x12dea
+	.4byte	0x13119
 	.uleb128 0x59
-	.4byte	0x12ee0
-	.8byte	.LBB1476
-	.8byte	.LBE1476-.LBB1476
+	.4byte	0x1320f
+	.8byte	.LBB1657
+	.8byte	.LBE1657-.LBB1657
 	.byte	0xbe
 	.byte	0xde
 	.uleb128 0x54
-	.4byte	0x12ef9
+	.4byte	0x13228
 	.uleb128 0x54
-	.4byte	0x12eed
+	.4byte	0x1321c
 	.byte	0
 	.byte	0
 	.uleb128 0x53
 	.4byte	0xfe39
-	.8byte	.LBB1478
-	.8byte	.LBE1478-.LBB1478
+	.8byte	.LBB1659
+	.8byte	.LBE1659-.LBB1659
 	.byte	0x1
-	.2byte	0x72d
+	.2byte	0x765
 	.4byte	0xfb8e
 	.uleb128 0x54
 	.4byte	0xfe4a
 	.uleb128 0x4e
-	.8byte	.LVL514
-	.4byte	0x139d7
+	.8byte	.LVL547
+	.4byte	0x13d05
 	.uleb128 0x4e
-	.8byte	.LVL515
-	.4byte	0x139e3
+	.8byte	.LVL548
+	.4byte	0x13d11
 	.uleb128 0x4e
-	.8byte	.LVL516
-	.4byte	0x139e3
+	.8byte	.LVL549
+	.4byte	0x13d11
 	.uleb128 0x4e
-	.8byte	.LVL517
-	.4byte	0x139e3
+	.8byte	.LVL550
+	.4byte	0x13d11
 	.uleb128 0x4e
-	.8byte	.LVL518
-	.4byte	0x139e3
+	.8byte	.LVL551
+	.4byte	0x13d11
 	.uleb128 0x4e
-	.8byte	.LVL519
-	.4byte	0x139e3
+	.8byte	.LVL552
+	.4byte	0x13d11
 	.uleb128 0x4e
-	.8byte	.LVL520
-	.4byte	0x139e3
+	.8byte	.LVL553
+	.4byte	0x13d11
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL411
-	.4byte	0x138b5
+	.8byte	.LVL444
+	.4byte	0x13be3
 	.uleb128 0x4e
-	.8byte	.LVL412
-	.4byte	0x139f0
+	.8byte	.LVL445
+	.4byte	0x13d1e
 	.uleb128 0x4e
-	.8byte	.LVL414
-	.4byte	0x138b5
+	.8byte	.LVL447
+	.4byte	0x13be3
 	.uleb128 0x4e
-	.8byte	.LVL415
-	.4byte	0x139fc
+	.8byte	.LVL448
+	.4byte	0x13d2a
 	.uleb128 0x4e
-	.8byte	.LVL455
-	.4byte	0x138fc
+	.8byte	.LVL488
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL457
-	.4byte	0x138fc
+	.8byte	.LVL490
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL464
-	.4byte	0x138fc
+	.8byte	.LVL497
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL521
-	.4byte	0x13882
+	.8byte	.LVL554
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL557
-	.4byte	0x138fc
+	.8byte	.LVL590
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL564
-	.4byte	0x138fc
+	.8byte	.LVL597
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL565
-	.4byte	0x138fc
+	.8byte	.LVL598
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL566
-	.4byte	0x138fc
+	.8byte	.LVL599
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL570
-	.4byte	0x138fc
+	.8byte	.LVL603
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL574
-	.4byte	0x13a09
+	.8byte	.LVL607
+	.4byte	0x13d37
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0x672
+	.2byte	0x6aa
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfce7
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x672
+	.2byte	0x6aa
 	.4byte	0xe461
 	.uleb128 0x64
 	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x672
+	.2byte	0x6aa
 	.4byte	0xe117
 	.uleb128 0x46
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x674
+	.2byte	0x6ac
 	.4byte	0xe6fb
 	.uleb128 0x46
 	.4byte	.LASF3026
 	.byte	0x1
-	.2byte	0x675
+	.2byte	0x6ad
 	.4byte	0x6d
 	.uleb128 0x46
 	.4byte	.LASF3027
 	.byte	0x1
-	.2byte	0x676
+	.2byte	0x6ae
 	.4byte	0x6d
 	.uleb128 0x46
 	.4byte	.LASF3028
 	.byte	0x1
-	.2byte	0x677
+	.2byte	0x6af
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3029
 	.byte	0x1
-	.2byte	0x678
+	.2byte	0x6b0
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0x679
+	.2byte	0x6b1
 	.4byte	0x219
 	.uleb128 0x46
 	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0x67a
+	.2byte	0x6b2
 	.4byte	0x219
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x67b
+	.2byte	0x6b3
 	.4byte	0xe3fc
 	.uleb128 0x46
 	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0x67c
+	.2byte	0x6b4
 	.4byte	0x443
 	.uleb128 0x46
 	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0x67d
+	.2byte	0x6b5
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x65
 	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x65b
+	.2byte	0x693
 	.byte	0x1
 	.4byte	0xfd01
 	.uleb128 0x64
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x65b
+	.2byte	0x693
 	.4byte	0xe6fb
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0x641
+	.2byte	0x679
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfd39
 	.uleb128 0x64
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x641
+	.2byte	0x679
 	.4byte	0xe6fb
 	.uleb128 0x46
 	.4byte	.LASF2463
 	.byte	0x1
-	.2byte	0x643
+	.2byte	0x67b
 	.4byte	0xd7e9
 	.uleb128 0x66
 	.uleb128 0x52
 	.string	"__k"
 	.byte	0x1
-	.2byte	0x650
+	.2byte	0x688
 	.4byte	0x2eda
 	.byte	0
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0x5f8
+	.2byte	0x630
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfdb3
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x5f8
+	.2byte	0x630
 	.4byte	0xe461
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x5fa
+	.2byte	0x632
 	.4byte	0xa545
 	.uleb128 0x46
 	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x5fb
+	.2byte	0x633
 	.4byte	0xe117
 	.uleb128 0x46
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x5fc
+	.2byte	0x634
 	.4byte	0xe6fb
 	.uleb128 0x46
 	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0x5fd
+	.2byte	0x635
 	.4byte	0xb869
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x5fe
+	.2byte	0x636
 	.4byte	0x9721
 	.uleb128 0x46
 	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0x5ff
+	.2byte	0x637
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x600
+	.2byte	0x638
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x600
+	.2byte	0x638
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0x5cf
+	.2byte	0x607
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfe24
 	.uleb128 0x64
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x5cf
+	.2byte	0x607
 	.4byte	0xe6fb
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x5d1
+	.2byte	0x609
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x5d2
+	.2byte	0x60a
 	.4byte	0xa545
 	.uleb128 0x46
 	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0x5d3
+	.2byte	0x60b
 	.4byte	0xb869
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x5d4
+	.2byte	0x60c
 	.4byte	0x9721
 	.uleb128 0x46
 	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0x5d5
+	.2byte	0x60d
 	.4byte	0x29
 	.uleb128 0x46
 	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0x5d6
+	.2byte	0x60e
 	.4byte	0xc6
 	.uleb128 0x67
 	.4byte	.LASF3018
@@ -38242,20 +38601,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x62
 	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0x5c1
+	.2byte	0x5f9
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfe57
 	.uleb128 0x64
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x5c1
+	.2byte	0x5f9
 	.4byte	0xe6fb
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0x5b8
+	.2byte	0x5f0
 	.4byte	0x2d9
 	.8byte	.LFB2833
 	.8byte	.LFE2833-.LFB2833
@@ -38265,29 +38624,29 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5b8
+	.2byte	0x5f0
 	.4byte	0xa545
-	.4byte	.LLST66
+	.4byte	.LLST75
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5b9
+	.2byte	0x5f1
 	.4byte	0xb3c0
-	.4byte	.LLST67
+	.4byte	.LLST76
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5ba
+	.2byte	0x5f2
 	.4byte	0x219
-	.4byte	.LLST68
+	.4byte	.LLST77
 	.uleb128 0x4e
-	.8byte	.LVL236
-	.4byte	0x13a13
+	.8byte	.LVL269
+	.4byte	0x13d41
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0x5af
+	.2byte	0x5e7
 	.4byte	0x2d9
 	.8byte	.LFB2832
 	.8byte	.LFE2832-.LFB2832
@@ -38297,29 +38656,29 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5af
+	.2byte	0x5e7
 	.4byte	0xa545
-	.4byte	.LLST69
+	.4byte	.LLST78
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5b0
+	.2byte	0x5e8
 	.4byte	0xb3c0
-	.4byte	.LLST70
+	.4byte	.LLST79
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5b1
+	.2byte	0x5e9
 	.4byte	0x219
-	.4byte	.LLST71
+	.4byte	.LLST80
 	.uleb128 0x4e
-	.8byte	.LVL241
-	.4byte	0x13a13
+	.8byte	.LVL274
+	.4byte	0x13d41
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0x597
+	.2byte	0x5cf
 	.4byte	0x2d9
 	.8byte	.LFB2831
 	.8byte	.LFE2831-.LFB2831
@@ -38329,64 +38688,64 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x597
+	.2byte	0x5cf
 	.4byte	0xa545
-	.4byte	.LLST81
+	.4byte	.LLST90
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x598
+	.2byte	0x5d0
 	.4byte	0xb3c0
-	.4byte	.LLST82
+	.4byte	.LLST91
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x599
+	.2byte	0x5d1
 	.4byte	0x56
-	.4byte	.LLST83
+	.4byte	.LLST92
 	.uleb128 0x56
 	.4byte	.LASF380
 	.byte	0x1
-	.2byte	0x599
+	.2byte	0x5d1
 	.4byte	0x2ce
-	.4byte	.LLST84
+	.4byte	.LLST93
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x59b
+	.2byte	0x5d3
 	.4byte	0xe461
-	.4byte	.LLST85
+	.4byte	.LLST94
 	.uleb128 0x57
 	.4byte	.LASF2453
 	.byte	0x1
-	.2byte	0x59c
+	.2byte	0x5d4
 	.4byte	0xc6
-	.4byte	.LLST86
+	.4byte	.LLST95
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x59c
+	.2byte	0x5d4
 	.4byte	0xc6
 	.uleb128 0x4e
-	.8byte	.LVL267
-	.4byte	0x13a20
+	.8byte	.LVL300
+	.4byte	0x13d4e
 	.uleb128 0x4e
-	.8byte	.LVL269
-	.4byte	0x13a2d
+	.8byte	.LVL302
+	.4byte	0x13d5b
 	.uleb128 0x4e
-	.8byte	.LVL274
-	.4byte	0x138fc
+	.8byte	.LVL307
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL277
-	.4byte	0x138fc
+	.8byte	.LVL310
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL278
-	.4byte	0x13a09
+	.8byte	.LVL311
+	.4byte	0x13d37
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0x58b
+	.2byte	0x5c3
 	.4byte	0x2d9
 	.8byte	.LFB2830
 	.8byte	.LFE2830-.LFB2830
@@ -38396,49 +38755,49 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x58b
+	.2byte	0x5c3
 	.4byte	0xa545
-	.4byte	.LLST72
+	.4byte	.LLST81
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x58c
+	.2byte	0x5c4
 	.4byte	0xb3c0
-	.4byte	.LLST73
+	.4byte	.LLST82
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x58d
+	.2byte	0x5c5
 	.4byte	0x219
-	.4byte	.LLST74
+	.4byte	.LLST83
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x58f
+	.2byte	0x5c7
 	.4byte	0xe461
 	.uleb128 0x46
 	.4byte	.LASF2453
 	.byte	0x1
-	.2byte	0x590
+	.2byte	0x5c8
 	.4byte	0xc6
 	.uleb128 0x53
-	.4byte	0x12ab6
-	.8byte	.LBB1025
-	.8byte	.LBE1025-.LBB1025
+	.4byte	0x12de5
+	.8byte	.LBB1206
+	.8byte	.LBE1206-.LBB1206
 	.byte	0x1
-	.2byte	0x592
+	.2byte	0x5ca
 	.4byte	0x10073
 	.uleb128 0x54
-	.4byte	0x12ac6
+	.4byte	0x12df5
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL246
-	.4byte	0x13a13
+	.8byte	.LVL279
+	.4byte	0x13d41
 	.byte	0
 	.uleb128 0x50
 	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0x57d
+	.2byte	0x5b5
 	.4byte	0x2d9
 	.8byte	.LFB2829
 	.8byte	.LFE2829-.LFB2829
@@ -38448,57 +38807,57 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x57d
+	.2byte	0x5b5
 	.4byte	0xa545
-	.4byte	.LLST75
+	.4byte	.LLST84
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x57e
+	.2byte	0x5b6
 	.4byte	0xb3c0
-	.4byte	.LLST76
+	.4byte	.LLST85
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x57f
+	.2byte	0x5b7
 	.4byte	0x219
-	.4byte	.LLST77
+	.4byte	.LLST86
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x581
+	.2byte	0x5b9
 	.4byte	0xe461
 	.uleb128 0x69
 	.string	"t"
 	.byte	0x1
-	.2byte	0x582
+	.2byte	0x5ba
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x58
-	.4byte	0x12ad2
-	.8byte	.LBB1027
-	.4byte	.Ldebug_ranges0+0x510
+	.4byte	0x12e01
+	.8byte	.LBB1208
+	.4byte	.Ldebug_ranges0+0x6d0
 	.byte	0x1
-	.2byte	0x584
+	.2byte	0x5bc
 	.4byte	0x1010f
 	.uleb128 0x54
-	.4byte	0x12aed
+	.4byte	0x12e1c
 	.uleb128 0x54
-	.4byte	0x12ae2
+	.4byte	0x12e11
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL253
-	.4byte	0x13a13
+	.8byte	.LVL286
+	.4byte	0x13d41
 	.uleb128 0x4e
-	.8byte	.LVL256
-	.4byte	0x13a09
+	.8byte	.LVL289
+	.4byte	0x13d37
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3048
 	.byte	0x1
-	.2byte	0x572
+	.2byte	0x5aa
 	.4byte	0x2d9
 	.8byte	.LFB2828
 	.8byte	.LFE2828-.LFB2828
@@ -38508,34 +38867,34 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x572
+	.2byte	0x5aa
 	.4byte	0xa545
-	.4byte	.LLST78
+	.4byte	.LLST87
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x573
+	.2byte	0x5ab
 	.4byte	0xb3c0
-	.4byte	.LLST79
+	.4byte	.LLST88
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x574
+	.2byte	0x5ac
 	.4byte	0x219
-	.4byte	.LLST80
+	.4byte	.LLST89
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x576
+	.2byte	0x5ae
 	.4byte	0xe461
 	.uleb128 0x4e
-	.8byte	.LVL261
-	.4byte	0x13a13
+	.8byte	.LVL294
+	.4byte	0x13d41
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0x567
+	.2byte	0x59f
 	.4byte	0x2d9
 	.8byte	.LFB2827
 	.8byte	.LFE2827-.LFB2827
@@ -38545,37 +38904,37 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x567
+	.2byte	0x59f
 	.4byte	0xa545
-	.4byte	.LLST87
+	.4byte	.LLST96
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x568
+	.2byte	0x5a0
 	.4byte	0xb3c0
-	.4byte	.LLST88
+	.4byte	.LLST97
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x569
+	.2byte	0x5a1
 	.4byte	0x219
-	.4byte	.LLST89
+	.4byte	.LLST98
 	.uleb128 0x46
 	.4byte	.LASF3050
 	.byte	0x1
-	.2byte	0x56b
+	.2byte	0x5a3
 	.4byte	0x56
 	.uleb128 0x4e
-	.8byte	.LVL280
-	.4byte	0x13a39
+	.8byte	.LVL313
+	.4byte	0x13d67
 	.uleb128 0x4e
-	.8byte	.LVL281
-	.4byte	0x13a13
+	.8byte	.LVL314
+	.4byte	0x13d41
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0x550
+	.2byte	0x588
 	.4byte	0xc6
 	.8byte	.LFB2826
 	.8byte	.LFE2826-.LFB2826
@@ -38585,13 +38944,13 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF415
 	.byte	0x1
-	.2byte	0x550
+	.2byte	0x588
 	.4byte	0x1c54
 	.4byte	.LLST10
 	.uleb128 0x6a
 	.4byte	.LASF1270
 	.byte	0x1
-	.2byte	0x550
+	.2byte	0x588
 	.4byte	0x5531
 	.uleb128 0x1
 	.byte	0x51
@@ -38599,7 +38958,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0x541
+	.2byte	0x579
 	.4byte	0xc6
 	.8byte	.LFB2825
 	.8byte	.LFE2825-.LFB2825
@@ -38609,26 +38968,26 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF1270
 	.byte	0x1
-	.2byte	0x541
+	.2byte	0x579
 	.4byte	0x5531
 	.4byte	.LLST14
 	.uleb128 0x51
 	.string	"vma"
 	.byte	0x1
-	.2byte	0x541
+	.2byte	0x579
 	.4byte	0x3c8a
 	.4byte	.LLST15
 	.uleb128 0x46
 	.4byte	.LASF881
 	.byte	0x1
-	.2byte	0x543
+	.2byte	0x57b
 	.4byte	0x29
 	.uleb128 0x4e
 	.8byte	.LVL44
-	.4byte	0x13a45
+	.4byte	0x13d73
 	.uleb128 0x4e
 	.8byte	.LVL45
-	.4byte	0x13a51
+	.4byte	0x13d7f
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3053
@@ -38639,7 +38998,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2824-.LFB2824
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11232
+	.4byte	0x11561
 	.uleb128 0x56
 	.4byte	.LASF1270
 	.byte	0x1
@@ -38703,27 +39062,25 @@ __exitcall_ebc_exit:
 	.4byte	0xc6
 	.uleb128 0x55
 	.4byte	.LASF3018
-	.4byte	0x11242
+	.4byte	0x11571
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	__func__.34835
-	.uleb128 0x6b
-	.8byte	.LBB1016
-	.8byte	.LBE1016-.LBB1016
-	.4byte	0x1043b
+	.uleb128 0x61
+	.4byte	.Ldebug_ranges0+0x1d0
+	.4byte	0x10423
 	.uleb128 0x46
 	.4byte	.LASF3058
 	.byte	0x1
 	.2byte	0x503
 	.4byte	0xc6
-	.uleb128 0x5e
-	.8byte	.LBB1017
-	.8byte	.LBE1017-.LBB1017
-	.uleb128 0x6c
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x1d0
+	.uleb128 0x6b
 	.4byte	.LASF3070
 	.byte	0x1
 	.2byte	0x503
-	.8byte	.L128
+	.8byte	.L134
 	.uleb128 0x4c
 	.4byte	.LASF3059
 	.byte	0x1
@@ -38737,1135 +39094,1392 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x503
 	.4byte	0x194
-	.uleb128 0x6b
-	.8byte	.LBB1018
-	.8byte	.LBE1018-.LBB1018
-	.4byte	0x1041f
+	.uleb128 0x6c
+	.8byte	.LBB998
+	.8byte	.LBE998-.LBB998
+	.4byte	0x10407
 	.uleb128 0x57
 	.4byte	.LASF3060
 	.byte	0x1
 	.2byte	0x503
 	.4byte	0x194
-	.4byte	.LLST62
+	.4byte	.LLST33
 	.uleb128 0x4e
-	.8byte	.LVL153
-	.4byte	0x13a5e
+	.8byte	.LVL91
+	.4byte	0x13d8c
 	.uleb128 0x4e
-	.8byte	.LVL154
-	.4byte	0x13a6a
+	.8byte	.LVL92
+	.4byte	0x13d98
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL151
-	.4byte	0x13a77
+	.8byte	.LVL89
+	.4byte	0x13da5
 	.uleb128 0x4e
-	.8byte	.LVL155
-	.4byte	0x13a83
+	.8byte	.LVL93
+	.4byte	0x13db1
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12bf4
-	.8byte	.LBB810
+	.4byte	0x12ef4
+	.8byte	.LBB934
 	.4byte	.Ldebug_ranges0+0x60
 	.byte	0x1
-	.2byte	0x50a
-	.4byte	0x10666
+	.2byte	0x56b
+	.4byte	0x10643
 	.uleb128 0x54
-	.4byte	0x12c19
+	.4byte	0x12f19
 	.uleb128 0x54
-	.4byte	0x12c0e
+	.4byte	0x12f0e
 	.uleb128 0x54
-	.4byte	0x12c04
+	.4byte	0x12f04
 	.uleb128 0x6d
-	.4byte	0x12c52
-	.8byte	.LBB811
+	.4byte	0x12f52
+	.8byte	.LBB935
 	.4byte	.Ldebug_ranges0+0x60
-	.byte	0x8
-	.byte	0x93
+	.byte	0x9
+	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12c77
+	.4byte	0x12f77
 	.uleb128 0x54
-	.4byte	0x12c6c
+	.4byte	0x12f6c
 	.uleb128 0x54
-	.4byte	0x12c62
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x60
-	.uleb128 0x5c
-	.4byte	0x12c80
+	.4byte	0x12f62
 	.uleb128 0x6e
-	.4byte	0x12cc0
-	.8byte	.LBB813
-	.4byte	.Ldebug_ranges0+0xa0
-	.byte	0x8
-	.byte	0x72
-	.4byte	0x1059b
+	.4byte	0x12fef
+	.8byte	.LBB937
+	.4byte	.Ldebug_ranges0+0xb0
+	.byte	0x9
+	.byte	0x84
+	.4byte	0x10579
 	.uleb128 0x54
-	.4byte	0x12cdb
+	.4byte	0x1300a
 	.uleb128 0x6f
-	.4byte	0x12cd0
+	.4byte	0x12fff
 	.4byte	.LLST19
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xa0
+	.4byte	.Ldebug_ranges0+0xb0
 	.uleb128 0x5f
-	.4byte	0x12ce6
+	.4byte	0x13015
 	.4byte	.LLST20
 	.uleb128 0x5f
-	.4byte	0x12cf1
+	.4byte	0x13020
 	.4byte	.LLST21
 	.uleb128 0x70
-	.4byte	0x13114
-	.8byte	.LBB815
-	.8byte	.LBE815-.LBB815
+	.4byte	0x13443
+	.8byte	.LBB939
+	.8byte	.LBE939-.LBB939
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10501
+	.4byte	0x104df
 	.uleb128 0x5e
-	.8byte	.LBB816
-	.8byte	.LBE816-.LBB816
+	.8byte	.LBB940
+	.8byte	.LBE940-.LBB940
 	.uleb128 0x5f
-	.4byte	0x13124
+	.4byte	0x13453
 	.4byte	.LLST22
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x130e8
-	.8byte	.LBB817
-	.8byte	.LBE817-.LBB817
+	.4byte	0x13417
+	.8byte	.LBB941
+	.8byte	.LBE941-.LBB941
 	.byte	0x6
 	.byte	0x55
-	.4byte	0x10549
+	.4byte	0x10527
 	.uleb128 0x54
-	.4byte	0x13102
+	.4byte	0x13431
 	.uleb128 0x54
-	.4byte	0x130f8
+	.4byte	0x13427
 	.uleb128 0x59
-	.4byte	0x131c9
-	.8byte	.LBB818
-	.8byte	.LBE818-.LBB818
+	.4byte	0x134f9
+	.8byte	.LBB942
+	.8byte	.LBE942-.LBB942
 	.byte	0xca
 	.byte	0x54
 	.uleb128 0x54
-	.4byte	0x131e3
+	.4byte	0x13513
 	.uleb128 0x54
-	.4byte	0x131d9
+	.4byte	0x13509
 	.byte	0
 	.byte	0
 	.uleb128 0x5e
-	.8byte	.LBB820
-	.8byte	.LBE820-.LBB820
+	.8byte	.LBB944
+	.8byte	.LBE944-.LBB944
 	.uleb128 0x5c
-	.4byte	0x12cfd
+	.4byte	0x1302c
 	.uleb128 0x59
-	.4byte	0x13197
-	.8byte	.LBB821
-	.8byte	.LBE821-.LBB821
+	.4byte	0x134c7
+	.8byte	.LBB945
+	.8byte	.LBE945-.LBB945
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x131b2
+	.4byte	0x134e2
 	.uleb128 0x54
-	.4byte	0x131a7
+	.4byte	0x134d7
 	.uleb128 0x5e
-	.8byte	.LBB822
-	.8byte	.LBE822-.LBB822
+	.8byte	.LBB946
+	.8byte	.LBE946-.LBB946
 	.uleb128 0x5c
-	.4byte	0x131bd
+	.4byte	0x134ed
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12c8c
-	.8byte	.LBB826
-	.8byte	.LBE826-.LBB826
-	.byte	0x8
-	.byte	0x74
-	.4byte	0x10656
+	.4byte	0x12fbb
+	.8byte	.LBB951
+	.8byte	.LBE951-.LBB951
+	.byte	0x9
+	.byte	0x86
+	.4byte	0x10634
 	.uleb128 0x54
-	.4byte	0x12c9c
+	.4byte	0x12fcb
 	.uleb128 0x5e
-	.8byte	.LBB827
-	.8byte	.LBE827-.LBB827
+	.8byte	.LBB952
+	.8byte	.LBE952-.LBB952
 	.uleb128 0x5f
-	.4byte	0x12ca7
+	.4byte	0x12fd6
 	.4byte	.LLST23
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xe0
-	.4byte	0x10621
+	.4byte	.Ldebug_ranges0+0xf0
+	.4byte	0x105ff
 	.uleb128 0x5f
-	.4byte	0x12cb3
+	.4byte	0x12fe2
 	.4byte	.LLST24
 	.uleb128 0x59
-	.4byte	0x13197
-	.8byte	.LBB829
-	.8byte	.LBE829-.LBB829
+	.4byte	0x134c7
+	.8byte	.LBB954
+	.8byte	.LBE954-.LBB954
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x131b2
+	.4byte	0x134e2
 	.uleb128 0x54
-	.4byte	0x131a7
+	.4byte	0x134d7
 	.uleb128 0x5e
-	.8byte	.LBB830
-	.8byte	.LBE830-.LBB830
+	.8byte	.LBB955
+	.8byte	.LBE955-.LBB955
 	.uleb128 0x5c
-	.4byte	0x131bd
+	.4byte	0x134ed
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13114
-	.8byte	.LBB831
-	.8byte	.LBE831-.LBB831
+	.4byte	0x13443
+	.8byte	.LBB956
+	.8byte	.LBE956-.LBB956
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x5e
-	.8byte	.LBB832
-	.8byte	.LBE832-.LBB832
+	.8byte	.LBB957
+	.8byte	.LBE957-.LBB957
 	.uleb128 0x5f
-	.4byte	0x13124
+	.4byte	0x13453
 	.4byte	.LLST25
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL59
-	.4byte	0x13a90
+	.8byte	.LVL119
+	.4byte	0x13dbe
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x12f23
+	.8byte	.LBB967
+	.4byte	.Ldebug_ranges0+0x120
+	.byte	0x1
+	.2byte	0x4ee
+	.4byte	0x1086e
+	.uleb128 0x54
+	.4byte	0x12f48
+	.uleb128 0x54
+	.4byte	0x12f3d
+	.uleb128 0x54
+	.4byte	0x12f33
+	.uleb128 0x6d
+	.4byte	0x12f81
+	.8byte	.LBB968
+	.4byte	.Ldebug_ranges0+0x120
+	.byte	0x9
+	.byte	0x93
+	.uleb128 0x54
+	.4byte	0x12fa6
+	.uleb128 0x54
+	.4byte	0x12f9b
+	.uleb128 0x54
+	.4byte	0x12f91
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x120
+	.uleb128 0x5c
+	.4byte	0x12faf
+	.uleb128 0x6e
+	.4byte	0x12fef
+	.8byte	.LBB970
+	.4byte	.Ldebug_ranges0+0x160
+	.byte	0x9
+	.byte	0x72
+	.4byte	0x107a3
+	.uleb128 0x54
+	.4byte	0x1300a
+	.uleb128 0x6f
+	.4byte	0x12fff
+	.4byte	.LLST26
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x160
+	.uleb128 0x5f
+	.4byte	0x13015
+	.4byte	.LLST27
+	.uleb128 0x5f
+	.4byte	0x13020
+	.4byte	.LLST28
+	.uleb128 0x70
+	.4byte	0x13443
+	.8byte	.LBB972
+	.8byte	.LBE972-.LBB972
+	.byte	0x6
+	.byte	0x4d
+	.4byte	0x10709
+	.uleb128 0x5e
+	.8byte	.LBB973
+	.8byte	.LBE973-.LBB973
+	.uleb128 0x5f
+	.4byte	0x13453
+	.4byte	.LLST29
+	.byte	0
+	.byte	0
+	.uleb128 0x6c
+	.8byte	.LBB974
+	.8byte	.LBE974-.LBB974
+	.4byte	0x1075d
+	.uleb128 0x5c
+	.4byte	0x1302c
+	.uleb128 0x59
+	.4byte	0x134c7
+	.8byte	.LBB975
+	.8byte	.LBE975-.LBB975
+	.byte	0x6
+	.byte	0x56
+	.uleb128 0x54
+	.4byte	0x134e2
+	.uleb128 0x54
+	.4byte	0x134d7
+	.uleb128 0x5e
+	.8byte	.LBB976
+	.8byte	.LBE976-.LBB976
+	.uleb128 0x5c
+	.4byte	0x134ed
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x13417
+	.8byte	.LBB977
+	.8byte	.LBE977-.LBB977
+	.byte	0x6
+	.byte	0x55
+	.uleb128 0x54
+	.4byte	0x13431
+	.uleb128 0x54
+	.4byte	0x13427
+	.uleb128 0x59
+	.4byte	0x134f9
+	.8byte	.LBB978
+	.8byte	.LBE978-.LBB978
+	.byte	0xca
+	.byte	0x54
+	.uleb128 0x54
+	.4byte	0x13513
+	.uleb128 0x54
+	.4byte	0x13509
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x70
+	.4byte	0x12fbb
+	.8byte	.LBB982
+	.8byte	.LBE982-.LBB982
+	.byte	0x9
+	.byte	0x74
+	.4byte	0x1085e
+	.uleb128 0x54
+	.4byte	0x12fcb
+	.uleb128 0x5e
+	.8byte	.LBB983
+	.8byte	.LBE983-.LBB983
+	.uleb128 0x5f
+	.4byte	0x12fd6
+	.4byte	.LLST30
+	.uleb128 0x61
+	.4byte	.Ldebug_ranges0+0x1a0
+	.4byte	0x10829
+	.uleb128 0x5f
+	.4byte	0x12fe2
+	.4byte	.LLST31
+	.uleb128 0x59
+	.4byte	0x134c7
+	.8byte	.LBB985
+	.8byte	.LBE985-.LBB985
+	.byte	0x6
+	.byte	0xfe
+	.uleb128 0x54
+	.4byte	0x134e2
+	.uleb128 0x54
+	.4byte	0x134d7
+	.uleb128 0x5e
+	.8byte	.LBB986
+	.8byte	.LBE986-.LBB986
+	.uleb128 0x5c
+	.4byte	0x134ed
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x13443
+	.8byte	.LBB987
+	.8byte	.LBE987-.LBB987
+	.byte	0x6
+	.byte	0xfd
+	.uleb128 0x5e
+	.8byte	.LBB988
+	.8byte	.LBE988-.LBB988
+	.uleb128 0x5f
+	.4byte	0x13453
+	.4byte	.LLST32
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4e
+	.8byte	.LVL84
+	.4byte	0x13dcb
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12bc5
-	.8byte	.LBB840
-	.4byte	.Ldebug_ranges0+0x110
+	.4byte	0x12f23
+	.8byte	.LBB1002
+	.4byte	.Ldebug_ranges0+0x220
 	.byte	0x1
-	.2byte	0x4e6
-	.4byte	0x10886
+	.2byte	0x50a
+	.4byte	0x10a99
 	.uleb128 0x54
-	.4byte	0x12bea
+	.4byte	0x12f48
 	.uleb128 0x54
-	.4byte	0x12bdf
+	.4byte	0x12f3d
 	.uleb128 0x54
-	.4byte	0x12bd5
+	.4byte	0x12f33
 	.uleb128 0x6d
-	.4byte	0x12c23
-	.8byte	.LBB841
-	.4byte	.Ldebug_ranges0+0x110
-	.byte	0x8
-	.byte	0x9b
+	.4byte	0x12f81
+	.8byte	.LBB1003
+	.4byte	.Ldebug_ranges0+0x220
+	.byte	0x9
+	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x12c48
+	.4byte	0x12fa6
 	.uleb128 0x54
-	.4byte	0x12c3d
+	.4byte	0x12f9b
 	.uleb128 0x54
-	.4byte	0x12c33
+	.4byte	0x12f91
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x220
+	.uleb128 0x5c
+	.4byte	0x12faf
 	.uleb128 0x6e
-	.4byte	0x12cc0
-	.8byte	.LBB843
-	.4byte	.Ldebug_ranges0+0x170
-	.byte	0x8
-	.byte	0x84
-	.4byte	0x107bc
+	.4byte	0x12fef
+	.8byte	.LBB1005
+	.4byte	.Ldebug_ranges0+0x260
+	.byte	0x9
+	.byte	0x72
+	.4byte	0x109ce
 	.uleb128 0x54
-	.4byte	0x12cdb
+	.4byte	0x1300a
 	.uleb128 0x6f
-	.4byte	0x12cd0
-	.4byte	.LLST26
+	.4byte	0x12fff
+	.4byte	.LLST34
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x170
+	.4byte	.Ldebug_ranges0+0x260
 	.uleb128 0x5f
-	.4byte	0x12ce6
-	.4byte	.LLST27
+	.4byte	0x13015
+	.4byte	.LLST35
 	.uleb128 0x5f
-	.4byte	0x12cf1
-	.4byte	.LLST28
+	.4byte	0x13020
+	.4byte	.LLST36
 	.uleb128 0x70
-	.4byte	0x13114
-	.8byte	.LBB845
-	.8byte	.LBE845-.LBB845
+	.4byte	0x13443
+	.8byte	.LBB1007
+	.8byte	.LBE1007-.LBB1007
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10722
+	.4byte	0x10934
 	.uleb128 0x5e
-	.8byte	.LBB846
-	.8byte	.LBE846-.LBB846
+	.8byte	.LBB1008
+	.8byte	.LBE1008-.LBB1008
 	.uleb128 0x5f
-	.4byte	0x13124
-	.4byte	.LLST29
-	.byte	0
-	.byte	0
-	.uleb128 0x70
-	.4byte	0x130e8
-	.8byte	.LBB847
-	.8byte	.LBE847-.LBB847
-	.byte	0x6
-	.byte	0x55
-	.4byte	0x1076a
-	.uleb128 0x54
-	.4byte	0x13102
-	.uleb128 0x54
-	.4byte	0x130f8
-	.uleb128 0x59
-	.4byte	0x131c9
-	.8byte	.LBB848
-	.8byte	.LBE848-.LBB848
-	.byte	0xca
-	.byte	0x54
-	.uleb128 0x54
-	.4byte	0x131e3
-	.uleb128 0x54
-	.4byte	0x131d9
+	.4byte	0x13453
+	.4byte	.LLST37
 	.byte	0
 	.byte	0
-	.uleb128 0x5e
-	.8byte	.LBB850
-	.8byte	.LBE850-.LBB850
+	.uleb128 0x6c
+	.8byte	.LBB1009
+	.8byte	.LBE1009-.LBB1009
+	.4byte	0x10988
 	.uleb128 0x5c
-	.4byte	0x12cfd
+	.4byte	0x1302c
 	.uleb128 0x59
-	.4byte	0x13197
-	.8byte	.LBB851
-	.8byte	.LBE851-.LBB851
+	.4byte	0x134c7
+	.8byte	.LBB1010
+	.8byte	.LBE1010-.LBB1010
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x131b2
+	.4byte	0x134e2
 	.uleb128 0x54
-	.4byte	0x131a7
+	.4byte	0x134d7
 	.uleb128 0x5e
-	.8byte	.LBB852
-	.8byte	.LBE852-.LBB852
+	.8byte	.LBB1011
+	.8byte	.LBE1011-.LBB1011
 	.uleb128 0x5c
-	.4byte	0x131bd
+	.4byte	0x134ed
+	.byte	0
+	.byte	0
 	.byte	0
+	.uleb128 0x59
+	.4byte	0x13417
+	.8byte	.LBB1012
+	.8byte	.LBE1012-.LBB1012
+	.byte	0x6
+	.byte	0x55
+	.uleb128 0x54
+	.4byte	0x13431
+	.uleb128 0x54
+	.4byte	0x13427
+	.uleb128 0x59
+	.4byte	0x134f9
+	.8byte	.LBB1013
+	.8byte	.LBE1013-.LBB1013
+	.byte	0xca
+	.byte	0x54
+	.uleb128 0x54
+	.4byte	0x13513
+	.uleb128 0x54
+	.4byte	0x13509
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12c8c
-	.8byte	.LBB859
-	.8byte	.LBE859-.LBB859
-	.byte	0x8
-	.byte	0x86
-	.4byte	0x10877
+	.4byte	0x12fbb
+	.8byte	.LBB1017
+	.8byte	.LBE1017-.LBB1017
+	.byte	0x9
+	.byte	0x74
+	.4byte	0x10a89
 	.uleb128 0x54
-	.4byte	0x12c9c
+	.4byte	0x12fcb
 	.uleb128 0x5e
-	.8byte	.LBB860
-	.8byte	.LBE860-.LBB860
+	.8byte	.LBB1018
+	.8byte	.LBE1018-.LBB1018
 	.uleb128 0x5f
-	.4byte	0x12ca7
-	.4byte	.LLST30
+	.4byte	0x12fd6
+	.4byte	.LLST38
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x1c0
-	.4byte	0x10842
+	.4byte	.Ldebug_ranges0+0x2a0
+	.4byte	0x10a54
 	.uleb128 0x5f
-	.4byte	0x12cb3
-	.4byte	.LLST31
+	.4byte	0x12fe2
+	.4byte	.LLST39
 	.uleb128 0x59
-	.4byte	0x13197
-	.8byte	.LBB862
-	.8byte	.LBE862-.LBB862
+	.4byte	0x134c7
+	.8byte	.LBB1020
+	.8byte	.LBE1020-.LBB1020
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x131b2
+	.4byte	0x134e2
 	.uleb128 0x54
-	.4byte	0x131a7
+	.4byte	0x134d7
 	.uleb128 0x5e
-	.8byte	.LBB863
-	.8byte	.LBE863-.LBB863
+	.8byte	.LBB1021
+	.8byte	.LBE1021-.LBB1021
 	.uleb128 0x5c
-	.4byte	0x131bd
+	.4byte	0x134ed
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13114
-	.8byte	.LBB864
-	.8byte	.LBE864-.LBB864
+	.4byte	0x13443
+	.8byte	.LBB1022
+	.8byte	.LBE1022-.LBB1022
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x5e
-	.8byte	.LBB865
-	.8byte	.LBE865-.LBB865
+	.8byte	.LBB1023
+	.8byte	.LBE1023-.LBB1023
 	.uleb128 0x5f
-	.4byte	0x13124
-	.4byte	.LLST32
+	.4byte	0x13453
+	.4byte	.LLST40
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL186
-	.4byte	0x13a9d
+	.8byte	.LVL108
+	.4byte	0x13dcb
+	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12bc5
-	.8byte	.LBB877
-	.4byte	.Ldebug_ranges0+0x1f0
+	.4byte	0x12ef4
+	.8byte	.LBB1032
+	.4byte	.Ldebug_ranges0+0x2d0
 	.byte	0x1
-	.2byte	0x534
-	.4byte	0x10aa6
+	.2byte	0x4d8
+	.4byte	0x10cb9
 	.uleb128 0x54
-	.4byte	0x12bea
+	.4byte	0x12f19
 	.uleb128 0x54
-	.4byte	0x12bdf
+	.4byte	0x12f0e
 	.uleb128 0x54
-	.4byte	0x12bd5
+	.4byte	0x12f04
 	.uleb128 0x6d
-	.4byte	0x12c23
-	.8byte	.LBB878
-	.4byte	.Ldebug_ranges0+0x1f0
-	.byte	0x8
+	.4byte	0x12f52
+	.8byte	.LBB1033
+	.4byte	.Ldebug_ranges0+0x2d0
+	.byte	0x9
 	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12c48
+	.4byte	0x12f77
 	.uleb128 0x54
-	.4byte	0x12c3d
+	.4byte	0x12f6c
 	.uleb128 0x54
-	.4byte	0x12c33
+	.4byte	0x12f62
 	.uleb128 0x6e
-	.4byte	0x12cc0
-	.8byte	.LBB880
-	.4byte	.Ldebug_ranges0+0x250
-	.byte	0x8
+	.4byte	0x12fef
+	.8byte	.LBB1035
+	.4byte	.Ldebug_ranges0+0x320
+	.byte	0x9
 	.byte	0x84
-	.4byte	0x109dc
+	.4byte	0x10bef
 	.uleb128 0x54
-	.4byte	0x12cdb
+	.4byte	0x1300a
 	.uleb128 0x6f
-	.4byte	0x12cd0
-	.4byte	.LLST33
+	.4byte	0x12fff
+	.4byte	.LLST41
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x250
+	.4byte	.Ldebug_ranges0+0x320
 	.uleb128 0x5f
-	.4byte	0x12ce6
-	.4byte	.LLST34
+	.4byte	0x13015
+	.4byte	.LLST42
 	.uleb128 0x5f
-	.4byte	0x12cf1
-	.4byte	.LLST35
+	.4byte	0x13020
+	.4byte	.LLST43
 	.uleb128 0x70
-	.4byte	0x13114
-	.8byte	.LBB882
-	.8byte	.LBE882-.LBB882
+	.4byte	0x13443
+	.8byte	.LBB1037
+	.8byte	.LBE1037-.LBB1037
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10942
+	.4byte	0x10b55
 	.uleb128 0x5e
-	.8byte	.LBB883
-	.8byte	.LBE883-.LBB883
+	.8byte	.LBB1038
+	.8byte	.LBE1038-.LBB1038
 	.uleb128 0x5f
-	.4byte	0x13124
-	.4byte	.LLST36
-	.byte	0
-	.byte	0
-	.uleb128 0x70
-	.4byte	0x130e8
-	.8byte	.LBB884
-	.8byte	.LBE884-.LBB884
-	.byte	0x6
-	.byte	0x55
-	.4byte	0x1098a
-	.uleb128 0x54
-	.4byte	0x13102
-	.uleb128 0x54
-	.4byte	0x130f8
-	.uleb128 0x59
-	.4byte	0x131c9
-	.8byte	.LBB885
-	.8byte	.LBE885-.LBB885
-	.byte	0xca
-	.byte	0x54
-	.uleb128 0x54
-	.4byte	0x131e3
-	.uleb128 0x54
-	.4byte	0x131d9
+	.4byte	0x13453
+	.4byte	.LLST44
 	.byte	0
 	.byte	0
-	.uleb128 0x5e
-	.8byte	.LBB887
-	.8byte	.LBE887-.LBB887
+	.uleb128 0x6c
+	.8byte	.LBB1039
+	.8byte	.LBE1039-.LBB1039
+	.4byte	0x10ba9
 	.uleb128 0x5c
-	.4byte	0x12cfd
+	.4byte	0x1302c
 	.uleb128 0x59
-	.4byte	0x13197
-	.8byte	.LBB888
-	.8byte	.LBE888-.LBB888
+	.4byte	0x134c7
+	.8byte	.LBB1040
+	.8byte	.LBE1040-.LBB1040
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x131b2
+	.4byte	0x134e2
 	.uleb128 0x54
-	.4byte	0x131a7
+	.4byte	0x134d7
 	.uleb128 0x5e
-	.8byte	.LBB889
-	.8byte	.LBE889-.LBB889
+	.8byte	.LBB1041
+	.8byte	.LBE1041-.LBB1041
 	.uleb128 0x5c
-	.4byte	0x131bd
+	.4byte	0x134ed
+	.byte	0
 	.byte	0
 	.byte	0
+	.uleb128 0x59
+	.4byte	0x13417
+	.8byte	.LBB1042
+	.8byte	.LBE1042-.LBB1042
+	.byte	0x6
+	.byte	0x55
+	.uleb128 0x54
+	.4byte	0x13431
+	.uleb128 0x54
+	.4byte	0x13427
+	.uleb128 0x59
+	.4byte	0x134f9
+	.8byte	.LBB1043
+	.8byte	.LBE1043-.LBB1043
+	.byte	0xca
+	.byte	0x54
+	.uleb128 0x54
+	.4byte	0x13513
+	.uleb128 0x54
+	.4byte	0x13509
+	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12c8c
-	.8byte	.LBB896
-	.8byte	.LBE896-.LBB896
-	.byte	0x8
+	.4byte	0x12fbb
+	.8byte	.LBB1049
+	.8byte	.LBE1049-.LBB1049
+	.byte	0x9
 	.byte	0x86
-	.4byte	0x10a97
+	.4byte	0x10caa
 	.uleb128 0x54
-	.4byte	0x12c9c
+	.4byte	0x12fcb
 	.uleb128 0x5e
-	.8byte	.LBB897
-	.8byte	.LBE897-.LBB897
+	.8byte	.LBB1050
+	.8byte	.LBE1050-.LBB1050
 	.uleb128 0x5f
-	.4byte	0x12ca7
-	.4byte	.LLST37
+	.4byte	0x12fd6
+	.4byte	.LLST45
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x2a0
-	.4byte	0x10a62
+	.4byte	.Ldebug_ranges0+0x370
+	.4byte	0x10c75
 	.uleb128 0x5f
-	.4byte	0x12cb3
-	.4byte	.LLST38
+	.4byte	0x12fe2
+	.4byte	.LLST46
 	.uleb128 0x59
-	.4byte	0x13197
-	.8byte	.LBB899
-	.8byte	.LBE899-.LBB899
+	.4byte	0x134c7
+	.8byte	.LBB1052
+	.8byte	.LBE1052-.LBB1052
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x131b2
+	.4byte	0x134e2
 	.uleb128 0x54
-	.4byte	0x131a7
+	.4byte	0x134d7
 	.uleb128 0x5e
-	.8byte	.LBB900
-	.8byte	.LBE900-.LBB900
+	.8byte	.LBB1053
+	.8byte	.LBE1053-.LBB1053
 	.uleb128 0x5c
-	.4byte	0x131bd
+	.4byte	0x134ed
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13114
-	.8byte	.LBB901
-	.8byte	.LBE901-.LBB901
+	.4byte	0x13443
+	.8byte	.LBB1054
+	.8byte	.LBE1054-.LBB1054
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x5e
-	.8byte	.LBB902
-	.8byte	.LBE902-.LBB902
+	.8byte	.LBB1055
+	.8byte	.LBE1055-.LBB1055
 	.uleb128 0x5f
-	.4byte	0x13124
-	.4byte	.LLST39
+	.4byte	0x13453
+	.4byte	.LLST47
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL178
-	.4byte	0x13a9d
+	.8byte	.LVL135
+	.4byte	0x13dbe
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12bc5
-	.8byte	.LBB914
-	.4byte	.Ldebug_ranges0+0x2d0
+	.4byte	0x12f23
+	.8byte	.LBB1066
+	.4byte	.Ldebug_ranges0+0x3a0
 	.byte	0x1
-	.2byte	0x4d8
-	.4byte	0x10cc6
+	.2byte	0x527
+	.4byte	0x10ef5
 	.uleb128 0x54
-	.4byte	0x12bea
+	.4byte	0x12f48
 	.uleb128 0x54
-	.4byte	0x12bdf
+	.4byte	0x12f3d
 	.uleb128 0x54
-	.4byte	0x12bd5
+	.4byte	0x12f33
 	.uleb128 0x6d
-	.4byte	0x12c23
-	.8byte	.LBB915
-	.4byte	.Ldebug_ranges0+0x2d0
-	.byte	0x8
-	.byte	0x9b
+	.4byte	0x12f81
+	.8byte	.LBB1067
+	.4byte	.Ldebug_ranges0+0x3a0
+	.byte	0x9
+	.byte	0x93
 	.uleb128 0x54
-	.4byte	0x12c48
+	.4byte	0x12fa6
 	.uleb128 0x54
-	.4byte	0x12c3d
+	.4byte	0x12f9b
 	.uleb128 0x54
-	.4byte	0x12c33
+	.4byte	0x12f91
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x3a0
+	.uleb128 0x5f
+	.4byte	0x12faf
+	.4byte	.LLST48
 	.uleb128 0x6e
-	.4byte	0x12cc0
-	.8byte	.LBB917
-	.4byte	.Ldebug_ranges0+0x310
-	.byte	0x8
-	.byte	0x84
-	.4byte	0x10bfc
+	.4byte	0x12fef
+	.8byte	.LBB1069
+	.4byte	.Ldebug_ranges0+0x400
+	.byte	0x9
+	.byte	0x72
+	.4byte	0x10e1d
 	.uleb128 0x54
-	.4byte	0x12cdb
+	.4byte	0x1300a
 	.uleb128 0x6f
-	.4byte	0x12cd0
-	.4byte	.LLST40
+	.4byte	0x12fff
+	.4byte	.LLST49
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x310
+	.4byte	.Ldebug_ranges0+0x400
 	.uleb128 0x5f
-	.4byte	0x12ce6
-	.4byte	.LLST41
+	.4byte	0x13015
+	.4byte	.LLST50
 	.uleb128 0x5f
-	.4byte	0x12cf1
-	.4byte	.LLST42
+	.4byte	0x13020
+	.4byte	.LLST51
 	.uleb128 0x70
-	.4byte	0x13114
-	.8byte	.LBB919
-	.8byte	.LBE919-.LBB919
+	.4byte	0x13443
+	.8byte	.LBB1071
+	.8byte	.LBE1071-.LBB1071
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10b62
+	.4byte	0x10d83
 	.uleb128 0x5e
-	.8byte	.LBB920
-	.8byte	.LBE920-.LBB920
+	.8byte	.LBB1072
+	.8byte	.LBE1072-.LBB1072
 	.uleb128 0x5f
-	.4byte	0x13124
-	.4byte	.LLST43
-	.byte	0
-	.byte	0
-	.uleb128 0x70
-	.4byte	0x130e8
-	.8byte	.LBB921
-	.8byte	.LBE921-.LBB921
-	.byte	0x6
-	.byte	0x55
-	.4byte	0x10baa
-	.uleb128 0x54
-	.4byte	0x13102
-	.uleb128 0x54
-	.4byte	0x130f8
-	.uleb128 0x59
-	.4byte	0x131c9
-	.8byte	.LBB922
-	.8byte	.LBE922-.LBB922
-	.byte	0xca
-	.byte	0x54
-	.uleb128 0x54
-	.4byte	0x131e3
-	.uleb128 0x54
-	.4byte	0x131d9
+	.4byte	0x13453
+	.4byte	.LLST52
 	.byte	0
 	.byte	0
-	.uleb128 0x5e
-	.8byte	.LBB924
-	.8byte	.LBE924-.LBB924
+	.uleb128 0x6c
+	.8byte	.LBB1073
+	.8byte	.LBE1073-.LBB1073
+	.4byte	0x10dd7
 	.uleb128 0x5c
-	.4byte	0x12cfd
+	.4byte	0x1302c
 	.uleb128 0x59
-	.4byte	0x13197
-	.8byte	.LBB925
-	.8byte	.LBE925-.LBB925
+	.4byte	0x134c7
+	.8byte	.LBB1074
+	.8byte	.LBE1074-.LBB1074
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x131b2
+	.4byte	0x134e2
 	.uleb128 0x54
-	.4byte	0x131a7
+	.4byte	0x134d7
 	.uleb128 0x5e
-	.8byte	.LBB926
-	.8byte	.LBE926-.LBB926
+	.8byte	.LBB1075
+	.8byte	.LBE1075-.LBB1075
 	.uleb128 0x5c
-	.4byte	0x131bd
+	.4byte	0x134ed
+	.byte	0
+	.byte	0
 	.byte	0
+	.uleb128 0x59
+	.4byte	0x13417
+	.8byte	.LBB1076
+	.8byte	.LBE1076-.LBB1076
+	.byte	0x6
+	.byte	0x55
+	.uleb128 0x54
+	.4byte	0x13431
+	.uleb128 0x54
+	.4byte	0x13427
+	.uleb128 0x59
+	.4byte	0x134f9
+	.8byte	.LBB1077
+	.8byte	.LBE1077-.LBB1077
+	.byte	0xca
+	.byte	0x54
+	.uleb128 0x54
+	.4byte	0x13513
+	.uleb128 0x54
+	.4byte	0x13509
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12c8c
-	.8byte	.LBB931
-	.8byte	.LBE931-.LBB931
-	.byte	0x8
-	.byte	0x86
-	.4byte	0x10cb7
+	.4byte	0x12fbb
+	.8byte	.LBB1083
+	.8byte	.LBE1083-.LBB1083
+	.byte	0x9
+	.byte	0x74
+	.4byte	0x10ed8
 	.uleb128 0x54
-	.4byte	0x12c9c
+	.4byte	0x12fcb
 	.uleb128 0x5e
-	.8byte	.LBB932
-	.8byte	.LBE932-.LBB932
+	.8byte	.LBB1084
+	.8byte	.LBE1084-.LBB1084
 	.uleb128 0x5f
-	.4byte	0x12ca7
-	.4byte	.LLST44
+	.4byte	0x12fd6
+	.4byte	.LLST53
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x350
-	.4byte	0x10c82
+	.4byte	.Ldebug_ranges0+0x450
+	.4byte	0x10ea3
 	.uleb128 0x5f
-	.4byte	0x12cb3
-	.4byte	.LLST45
+	.4byte	0x12fe2
+	.4byte	.LLST54
 	.uleb128 0x59
-	.4byte	0x13197
-	.8byte	.LBB934
-	.8byte	.LBE934-.LBB934
+	.4byte	0x134c7
+	.8byte	.LBB1086
+	.8byte	.LBE1086-.LBB1086
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x131b2
+	.4byte	0x134e2
 	.uleb128 0x54
-	.4byte	0x131a7
+	.4byte	0x134d7
 	.uleb128 0x5e
-	.8byte	.LBB935
-	.8byte	.LBE935-.LBB935
+	.8byte	.LBB1087
+	.8byte	.LBE1087-.LBB1087
 	.uleb128 0x5c
-	.4byte	0x131bd
+	.4byte	0x134ed
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13114
-	.8byte	.LBB936
-	.8byte	.LBE936-.LBB936
+	.4byte	0x13443
+	.8byte	.LBB1088
+	.8byte	.LBE1088-.LBB1088
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x5e
-	.8byte	.LBB937
-	.8byte	.LBE937-.LBB937
+	.8byte	.LBB1089
+	.8byte	.LBE1089-.LBB1089
 	.uleb128 0x5f
-	.4byte	0x13124
-	.4byte	.LLST46
+	.4byte	0x13453
+	.4byte	.LLST55
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL109
-	.4byte	0x13a9d
+	.8byte	.LVL147
+	.4byte	0x13dcb
+	.uleb128 0x4e
+	.8byte	.LVL225
+	.4byte	0x13c14
+	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12bf4
-	.8byte	.LBB948
-	.4byte	.Ldebug_ranges0+0x380
+	.4byte	0x12ef4
+	.8byte	.LBB1102
+	.4byte	.Ldebug_ranges0+0x480
 	.byte	0x1
-	.2byte	0x527
-	.4byte	0x10f02
+	.2byte	0x544
+	.4byte	0x10fa7
 	.uleb128 0x54
-	.4byte	0x12c19
+	.4byte	0x12f19
 	.uleb128 0x54
-	.4byte	0x12c0e
+	.4byte	0x12f0e
 	.uleb128 0x54
-	.4byte	0x12c04
+	.4byte	0x12f04
 	.uleb128 0x6d
-	.4byte	0x12c52
-	.8byte	.LBB949
-	.4byte	.Ldebug_ranges0+0x380
-	.byte	0x8
-	.byte	0x93
+	.4byte	0x12f52
+	.8byte	.LBB1103
+	.4byte	.Ldebug_ranges0+0x480
+	.byte	0x9
+	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12c77
+	.4byte	0x12f77
 	.uleb128 0x54
-	.4byte	0x12c6c
+	.4byte	0x12f6c
 	.uleb128 0x54
-	.4byte	0x12c62
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x380
-	.uleb128 0x5f
-	.4byte	0x12c80
-	.4byte	.LLST47
-	.uleb128 0x6e
-	.4byte	0x12cc0
-	.8byte	.LBB951
-	.4byte	.Ldebug_ranges0+0x3e0
-	.byte	0x8
-	.byte	0x72
-	.4byte	0x10e2a
+	.4byte	0x12f62
+	.uleb128 0x6d
+	.4byte	0x12fef
+	.8byte	.LBB1105
+	.4byte	.Ldebug_ranges0+0x4b0
+	.byte	0x9
+	.byte	0x84
 	.uleb128 0x54
-	.4byte	0x12cdb
-	.uleb128 0x6f
-	.4byte	0x12cd0
-	.4byte	.LLST48
+	.4byte	0x1300a
+	.uleb128 0x71
+	.4byte	0x12fff
+	.uleb128 0x1
+	.byte	0x50
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x3e0
-	.uleb128 0x5f
-	.4byte	0x12ce6
-	.4byte	.LLST49
+	.4byte	.Ldebug_ranges0+0x4e0
+	.uleb128 0x5c
+	.4byte	0x13015
 	.uleb128 0x5f
-	.4byte	0x12cf1
-	.4byte	.LLST50
-	.uleb128 0x70
-	.4byte	0x13114
-	.8byte	.LBB953
-	.8byte	.LBE953-.LBB953
+	.4byte	0x13020
+	.4byte	.LLST56
+	.uleb128 0x59
+	.4byte	0x13443
+	.8byte	.LBB1107
+	.8byte	.LBE1107-.LBB1107
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10d90
 	.uleb128 0x5e
-	.8byte	.LBB954
-	.8byte	.LBE954-.LBB954
+	.8byte	.LBB1108
+	.8byte	.LBE1108-.LBB1108
 	.uleb128 0x5f
-	.4byte	0x13124
-	.4byte	.LLST51
+	.4byte	0x13453
+	.4byte	.LLST57
 	.byte	0
 	.byte	0
-	.uleb128 0x70
-	.4byte	0x130e8
-	.8byte	.LBB955
-	.8byte	.LBE955-.LBB955
-	.byte	0x6
-	.byte	0x55
-	.4byte	0x10dd8
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x12ef4
+	.8byte	.LBB1114
+	.4byte	.Ldebug_ranges0+0x510
+	.byte	0x1
+	.2byte	0x534
+	.4byte	0x111c7
 	.uleb128 0x54
-	.4byte	0x13102
+	.4byte	0x12f19
 	.uleb128 0x54
-	.4byte	0x130f8
-	.uleb128 0x59
-	.4byte	0x131c9
-	.8byte	.LBB956
-	.8byte	.LBE956-.LBB956
-	.byte	0xca
-	.byte	0x54
+	.4byte	0x12f0e
+	.uleb128 0x54
+	.4byte	0x12f04
+	.uleb128 0x6d
+	.4byte	0x12f52
+	.8byte	.LBB1115
+	.4byte	.Ldebug_ranges0+0x510
+	.byte	0x9
+	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x131e3
+	.4byte	0x12f77
 	.uleb128 0x54
-	.4byte	0x131d9
+	.4byte	0x12f6c
+	.uleb128 0x54
+	.4byte	0x12f62
+	.uleb128 0x6e
+	.4byte	0x12fef
+	.8byte	.LBB1117
+	.4byte	.Ldebug_ranges0+0x570
+	.byte	0x9
+	.byte	0x84
+	.4byte	0x110fd
+	.uleb128 0x54
+	.4byte	0x1300a
+	.uleb128 0x6f
+	.4byte	0x12fff
+	.4byte	.LLST58
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x570
+	.uleb128 0x5f
+	.4byte	0x13015
+	.4byte	.LLST59
+	.uleb128 0x5f
+	.4byte	0x13020
+	.4byte	.LLST60
+	.uleb128 0x70
+	.4byte	0x13443
+	.8byte	.LBB1119
+	.8byte	.LBE1119-.LBB1119
+	.byte	0x6
+	.byte	0x4d
+	.4byte	0x11063
+	.uleb128 0x5e
+	.8byte	.LBB1120
+	.8byte	.LBE1120-.LBB1120
+	.uleb128 0x5f
+	.4byte	0x13453
+	.4byte	.LLST61
 	.byte	0
 	.byte	0
-	.uleb128 0x5e
-	.8byte	.LBB958
-	.8byte	.LBE958-.LBB958
+	.uleb128 0x6c
+	.8byte	.LBB1121
+	.8byte	.LBE1121-.LBB1121
+	.4byte	0x110b7
 	.uleb128 0x5c
-	.4byte	0x12cfd
+	.4byte	0x1302c
 	.uleb128 0x59
-	.4byte	0x13197
-	.8byte	.LBB959
-	.8byte	.LBE959-.LBB959
+	.4byte	0x134c7
+	.8byte	.LBB1122
+	.8byte	.LBE1122-.LBB1122
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x131b2
+	.4byte	0x134e2
 	.uleb128 0x54
-	.4byte	0x131a7
+	.4byte	0x134d7
 	.uleb128 0x5e
-	.8byte	.LBB960
-	.8byte	.LBE960-.LBB960
+	.8byte	.LBB1123
+	.8byte	.LBE1123-.LBB1123
 	.uleb128 0x5c
-	.4byte	0x131bd
+	.4byte	0x134ed
+	.byte	0
 	.byte	0
 	.byte	0
+	.uleb128 0x59
+	.4byte	0x13417
+	.8byte	.LBB1124
+	.8byte	.LBE1124-.LBB1124
+	.byte	0x6
+	.byte	0x55
+	.uleb128 0x54
+	.4byte	0x13431
+	.uleb128 0x54
+	.4byte	0x13427
+	.uleb128 0x59
+	.4byte	0x134f9
+	.8byte	.LBB1125
+	.8byte	.LBE1125-.LBB1125
+	.byte	0xca
+	.byte	0x54
+	.uleb128 0x54
+	.4byte	0x13513
+	.uleb128 0x54
+	.4byte	0x13509
+	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12c8c
-	.8byte	.LBB966
-	.8byte	.LBE966-.LBB966
-	.byte	0x8
-	.byte	0x74
-	.4byte	0x10ee5
+	.4byte	0x12fbb
+	.8byte	.LBB1133
+	.8byte	.LBE1133-.LBB1133
+	.byte	0x9
+	.byte	0x86
+	.4byte	0x111b8
 	.uleb128 0x54
-	.4byte	0x12c9c
+	.4byte	0x12fcb
 	.uleb128 0x5e
-	.8byte	.LBB967
-	.8byte	.LBE967-.LBB967
+	.8byte	.LBB1134
+	.8byte	.LBE1134-.LBB1134
 	.uleb128 0x5f
-	.4byte	0x12ca7
-	.4byte	.LLST52
+	.4byte	0x12fd6
+	.4byte	.LLST62
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x430
-	.4byte	0x10eb0
+	.4byte	.Ldebug_ranges0+0x5c0
+	.4byte	0x11183
 	.uleb128 0x5f
-	.4byte	0x12cb3
-	.4byte	.LLST53
+	.4byte	0x12fe2
+	.4byte	.LLST63
 	.uleb128 0x59
-	.4byte	0x13197
-	.8byte	.LBB969
-	.8byte	.LBE969-.LBB969
+	.4byte	0x134c7
+	.8byte	.LBB1136
+	.8byte	.LBE1136-.LBB1136
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x131b2
+	.4byte	0x134e2
 	.uleb128 0x54
-	.4byte	0x131a7
+	.4byte	0x134d7
 	.uleb128 0x5e
-	.8byte	.LBB970
-	.8byte	.LBE970-.LBB970
+	.8byte	.LBB1137
+	.8byte	.LBE1137-.LBB1137
 	.uleb128 0x5c
-	.4byte	0x131bd
+	.4byte	0x134ed
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13114
-	.8byte	.LBB971
-	.8byte	.LBE971-.LBB971
+	.4byte	0x13443
+	.8byte	.LBB1138
+	.8byte	.LBE1138-.LBB1138
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x5e
-	.8byte	.LBB972
-	.8byte	.LBE972-.LBB972
+	.8byte	.LBB1139
+	.8byte	.LBE1139-.LBB1139
 	.uleb128 0x5f
-	.4byte	0x13124
-	.4byte	.LLST54
+	.4byte	0x13453
+	.4byte	.LLST64
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL129
-	.4byte	0x13a90
-	.uleb128 0x4e
-	.8byte	.LVL192
-	.4byte	0x138e6
-	.byte	0
+	.8byte	.LVL208
+	.4byte	0x13dbe
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x12bf4
-	.8byte	.LBB986
-	.4byte	.Ldebug_ranges0+0x460
+	.4byte	0x12ef4
+	.8byte	.LBB1150
+	.4byte	.Ldebug_ranges0+0x5f0
 	.byte	0x1
-	.2byte	0x4ee
-	.4byte	0x1112d
+	.2byte	0x4e6
+	.4byte	0x113e7
 	.uleb128 0x54
-	.4byte	0x12c19
+	.4byte	0x12f19
 	.uleb128 0x54
-	.4byte	0x12c0e
+	.4byte	0x12f0e
 	.uleb128 0x54
-	.4byte	0x12c04
+	.4byte	0x12f04
 	.uleb128 0x6d
-	.4byte	0x12c52
-	.8byte	.LBB987
-	.4byte	.Ldebug_ranges0+0x460
-	.byte	0x8
-	.byte	0x93
+	.4byte	0x12f52
+	.8byte	.LBB1151
+	.4byte	.Ldebug_ranges0+0x5f0
+	.byte	0x9
+	.byte	0x9b
 	.uleb128 0x54
-	.4byte	0x12c77
+	.4byte	0x12f77
 	.uleb128 0x54
-	.4byte	0x12c6c
+	.4byte	0x12f6c
 	.uleb128 0x54
-	.4byte	0x12c62
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x460
-	.uleb128 0x5c
-	.4byte	0x12c80
+	.4byte	0x12f62
 	.uleb128 0x6e
-	.4byte	0x12cc0
-	.8byte	.LBB989
-	.4byte	.Ldebug_ranges0+0x4a0
-	.byte	0x8
-	.byte	0x72
-	.4byte	0x11062
+	.4byte	0x12fef
+	.8byte	.LBB1153
+	.4byte	.Ldebug_ranges0+0x650
+	.byte	0x9
+	.byte	0x84
+	.4byte	0x1131d
 	.uleb128 0x54
-	.4byte	0x12cdb
+	.4byte	0x1300a
 	.uleb128 0x6f
-	.4byte	0x12cd0
-	.4byte	.LLST55
+	.4byte	0x12fff
+	.4byte	.LLST65
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x4a0
+	.4byte	.Ldebug_ranges0+0x650
 	.uleb128 0x5f
-	.4byte	0x12ce6
-	.4byte	.LLST56
+	.4byte	0x13015
+	.4byte	.LLST66
 	.uleb128 0x5f
-	.4byte	0x12cf1
-	.4byte	.LLST57
+	.4byte	0x13020
+	.4byte	.LLST67
 	.uleb128 0x70
-	.4byte	0x13114
-	.8byte	.LBB991
-	.8byte	.LBE991-.LBB991
+	.4byte	0x13443
+	.8byte	.LBB1155
+	.8byte	.LBE1155-.LBB1155
 	.byte	0x6
 	.byte	0x4d
-	.4byte	0x10fc8
+	.4byte	0x11283
 	.uleb128 0x5e
-	.8byte	.LBB992
-	.8byte	.LBE992-.LBB992
+	.8byte	.LBB1156
+	.8byte	.LBE1156-.LBB1156
 	.uleb128 0x5f
-	.4byte	0x13124
-	.4byte	.LLST58
-	.byte	0
-	.byte	0
-	.uleb128 0x70
-	.4byte	0x130e8
-	.8byte	.LBB993
-	.8byte	.LBE993-.LBB993
-	.byte	0x6
-	.byte	0x55
-	.4byte	0x11010
-	.uleb128 0x54
-	.4byte	0x13102
-	.uleb128 0x54
-	.4byte	0x130f8
-	.uleb128 0x59
-	.4byte	0x131c9
-	.8byte	.LBB994
-	.8byte	.LBE994-.LBB994
-	.byte	0xca
-	.byte	0x54
-	.uleb128 0x54
-	.4byte	0x131e3
-	.uleb128 0x54
-	.4byte	0x131d9
+	.4byte	0x13453
+	.4byte	.LLST68
 	.byte	0
 	.byte	0
-	.uleb128 0x5e
-	.8byte	.LBB996
-	.8byte	.LBE996-.LBB996
+	.uleb128 0x6c
+	.8byte	.LBB1157
+	.8byte	.LBE1157-.LBB1157
+	.4byte	0x112d7
 	.uleb128 0x5c
-	.4byte	0x12cfd
+	.4byte	0x1302c
 	.uleb128 0x59
-	.4byte	0x13197
-	.8byte	.LBB997
-	.8byte	.LBE997-.LBB997
+	.4byte	0x134c7
+	.8byte	.LBB1158
+	.8byte	.LBE1158-.LBB1158
 	.byte	0x6
 	.byte	0x56
 	.uleb128 0x54
-	.4byte	0x131b2
+	.4byte	0x134e2
 	.uleb128 0x54
-	.4byte	0x131a7
+	.4byte	0x134d7
 	.uleb128 0x5e
-	.8byte	.LBB998
-	.8byte	.LBE998-.LBB998
+	.8byte	.LBB1159
+	.8byte	.LBE1159-.LBB1159
 	.uleb128 0x5c
-	.4byte	0x131bd
+	.4byte	0x134ed
 	.byte	0
 	.byte	0
 	.byte	0
+	.uleb128 0x59
+	.4byte	0x13417
+	.8byte	.LBB1160
+	.8byte	.LBE1160-.LBB1160
+	.byte	0x6
+	.byte	0x55
+	.uleb128 0x54
+	.4byte	0x13431
+	.uleb128 0x54
+	.4byte	0x13427
+	.uleb128 0x59
+	.4byte	0x134f9
+	.8byte	.LBB1161
+	.8byte	.LBE1161-.LBB1161
+	.byte	0xca
+	.byte	0x54
+	.uleb128 0x54
+	.4byte	0x13513
+	.uleb128 0x54
+	.4byte	0x13509
+	.byte	0
+	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12c8c
-	.8byte	.LBB1002
-	.8byte	.LBE1002-.LBB1002
-	.byte	0x8
-	.byte	0x74
-	.4byte	0x1111d
+	.4byte	0x12fbb
+	.8byte	.LBB1169
+	.8byte	.LBE1169-.LBB1169
+	.byte	0x9
+	.byte	0x86
+	.4byte	0x113d8
 	.uleb128 0x54
-	.4byte	0x12c9c
+	.4byte	0x12fcb
 	.uleb128 0x5e
-	.8byte	.LBB1003
-	.8byte	.LBE1003-.LBB1003
+	.8byte	.LBB1170
+	.8byte	.LBE1170-.LBB1170
 	.uleb128 0x5f
-	.4byte	0x12ca7
-	.4byte	.LLST59
+	.4byte	0x12fd6
+	.4byte	.LLST69
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x4e0
-	.4byte	0x110e8
+	.4byte	.Ldebug_ranges0+0x6a0
+	.4byte	0x113a3
 	.uleb128 0x5f
-	.4byte	0x12cb3
-	.4byte	.LLST60
+	.4byte	0x12fe2
+	.4byte	.LLST70
 	.uleb128 0x59
-	.4byte	0x13197
-	.8byte	.LBB1005
-	.8byte	.LBE1005-.LBB1005
+	.4byte	0x134c7
+	.8byte	.LBB1172
+	.8byte	.LBE1172-.LBB1172
 	.byte	0x6
 	.byte	0xfe
 	.uleb128 0x54
-	.4byte	0x131b2
+	.4byte	0x134e2
 	.uleb128 0x54
-	.4byte	0x131a7
+	.4byte	0x134d7
 	.uleb128 0x5e
-	.8byte	.LBB1006
-	.8byte	.LBE1006-.LBB1006
+	.8byte	.LBB1173
+	.8byte	.LBE1173-.LBB1173
 	.uleb128 0x5c
-	.4byte	0x131bd
+	.4byte	0x134ed
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x13114
-	.8byte	.LBB1007
-	.8byte	.LBE1007-.LBB1007
+	.4byte	0x13443
+	.8byte	.LBB1174
+	.8byte	.LBE1174-.LBB1174
 	.byte	0x6
 	.byte	0xfd
 	.uleb128 0x5e
-	.8byte	.LBB1008
-	.8byte	.LBE1008-.LBB1008
+	.8byte	.LBB1175
+	.8byte	.LBE1175-.LBB1175
 	.uleb128 0x5f
-	.4byte	0x13124
-	.4byte	.LLST61
+	.4byte	0x13453
+	.4byte	.LLST71
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL146
-	.4byte	0x13a90
-	.byte	0
+	.8byte	.LVL216
+	.4byte	0x13dbe
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL60
-	.4byte	0x13aaa
+	.8byte	.LVL49
+	.4byte	0x13c99
 	.uleb128 0x4e
-	.8byte	.LVL61
-	.4byte	0x13977
+	.8byte	.LVL50
+	.4byte	0x13cd7
+	.uleb128 0x4e
+	.8byte	.LVL51
+	.4byte	0x13d73
+	.uleb128 0x4e
+	.8byte	.LVL62
+	.4byte	0x13dd8
+	.uleb128 0x4e
+	.8byte	.LVL65
+	.4byte	0x13c2a
 	.uleb128 0x4e
 	.8byte	.LVL68
-	.4byte	0x138fc
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL70
-	.4byte	0x1396b
+	.8byte	.LVL85
+	.4byte	0x13d73
 	.uleb128 0x4e
-	.8byte	.LVL71
-	.4byte	0x13a45
+	.8byte	.LVL86
+	.4byte	0x13de4
 	.uleb128 0x4e
-	.8byte	.LVL79
-	.4byte	0x13ab6
+	.8byte	.LVL88
+	.4byte	0x13ca5
 	.uleb128 0x4e
-	.8byte	.LVL90
-	.4byte	0x138fc
+	.8byte	.LVL95
+	.4byte	0x13c99
 	.uleb128 0x4e
-	.8byte	.LVL93
-	.4byte	0x13ac2
+	.8byte	.LVL109
+	.4byte	0x13df0
 	.uleb128 0x4e
-	.8byte	.LVL94
-	.4byte	0x13a45
+	.8byte	.LVL110
+	.4byte	0x13ca5
 	.uleb128 0x4e
-	.8byte	.LVL131
-	.4byte	0x13882
+	.8byte	.LVL111
+	.4byte	0x13cf9
 	.uleb128 0x4e
-	.8byte	.LVL147
-	.4byte	0x13a45
+	.8byte	.LVL121
+	.4byte	0x13dfc
 	.uleb128 0x4e
-	.8byte	.LVL148
-	.4byte	0x13ace
+	.8byte	.LVL122
+	.4byte	0x13d73
 	.uleb128 0x4e
-	.8byte	.LVL150
-	.4byte	0x13977
+	.8byte	.LVL149
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL161
-	.4byte	0x138fc
+	.8byte	.LVL152
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL164
-	.4byte	0x13882
+	.8byte	.LVL154
+	.4byte	0x13c99
 	.uleb128 0x4e
-	.8byte	.LVL167
-	.4byte	0x13882
+	.8byte	.LVL156
+	.4byte	0x13c99
 	.uleb128 0x4e
-	.8byte	.LVL168
-	.4byte	0x139cb
+	.8byte	.LVL157
+	.4byte	0x13cd7
 	.uleb128 0x4e
-	.8byte	.LVL170
-	.4byte	0x139cb
+	.8byte	.LVL158
+	.4byte	0x13d73
 	.uleb128 0x4e
-	.8byte	.LVL193
-	.4byte	0x138fc
+	.8byte	.LVL171
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL194
-	.4byte	0x13a09
+	.8byte	.LVL174
+	.4byte	0x13c2a
+	.uleb128 0x4e
+	.8byte	.LVL176
+	.4byte	0x13c99
+	.uleb128 0x4e
+	.8byte	.LVL177
+	.4byte	0x13d73
+	.uleb128 0x4e
+	.8byte	.LVL185
+	.4byte	0x13dd8
+	.uleb128 0x4e
+	.8byte	.LVL219
+	.4byte	0x13cf9
+	.uleb128 0x4e
+	.8byte	.LVL226
+	.4byte	0x13c2a
+	.uleb128 0x4e
+	.8byte	.LVL227
+	.4byte	0x13d37
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0x11242
+	.4byte	0x11571
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xa
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x11232
+	.4byte	0x11561
 	.uleb128 0x62
 	.4byte	.LASF3061
 	.byte	0x1
 	.2byte	0x46d
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11271
+	.4byte	0x115a0
 	.uleb128 0x64
 	.4byte	.LASF2994
 	.byte	0x1
@@ -39885,16 +40499,16 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x112ab
+	.4byte	0x115da
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
 	.2byte	0x467
 	.4byte	0x31a7
-	.4byte	.LLST63
+	.4byte	.LLST72
 	.uleb128 0x4e
-	.8byte	.LVL207
-	.4byte	0x11d58
+	.8byte	.LVL240
+	.4byte	0x12087
 	.byte	0
 	.uleb128 0x4d
 	.4byte	.LASF3064
@@ -39904,7 +40518,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2821-.LFB2821
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1130b
+	.4byte	0x1163a
 	.uleb128 0x51
 	.string	"t"
 	.byte	0x1
@@ -39917,16 +40531,16 @@ __exitcall_ebc_exit:
 	.2byte	0x45d
 	.4byte	0xe6fb
 	.uleb128 0x5d
-	.4byte	0x12b57
-	.8byte	.LBB806
+	.4byte	0x12e86
+	.8byte	.LBB930
 	.4byte	.Ldebug_ranges0+0x30
 	.byte	0x1
 	.2byte	0x461
 	.uleb128 0x54
-	.4byte	0x12b63
+	.4byte	0x12e92
 	.uleb128 0x4e
 	.8byte	.LVL39
-	.4byte	0x13ada
+	.4byte	0x13e08
 	.byte	0
 	.byte	0
 	.uleb128 0x62
@@ -39935,7 +40549,7 @@ __exitcall_ebc_exit:
 	.2byte	0x44b
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11335
+	.4byte	0x11664
 	.uleb128 0x64
 	.4byte	.LASF2994
 	.byte	0x1
@@ -39956,19 +40570,19 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2819-.LFB2819
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11b67
+	.4byte	0x11e96
 	.uleb128 0x51
 	.string	"ptr"
 	.byte	0x1
 	.2byte	0x317
 	.4byte	0x443
-	.4byte	.LLST145
+	.4byte	.LLST154
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x319
 	.4byte	0xe461
-	.4byte	.LLST146
+	.4byte	.LLST155
 	.uleb128 0x46
 	.4byte	.LASF2994
 	.byte	0x1
@@ -39984,19 +40598,19 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x31c
 	.4byte	0xe3fc
-	.4byte	.LLST147
+	.4byte	.LLST156
 	.uleb128 0x57
 	.4byte	.LASF3067
 	.byte	0x1
 	.2byte	0x31d
 	.4byte	0xc6
-	.4byte	.LLST148
+	.4byte	.LLST157
 	.uleb128 0x57
 	.4byte	.LASF2963
 	.byte	0x1
 	.2byte	0x31e
 	.4byte	0xc6
-	.4byte	.LLST149
+	.4byte	.LLST158
 	.uleb128 0x4c
 	.4byte	.LASF3068
 	.byte	0x1
@@ -40010,28 +40624,28 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x320
 	.4byte	0xe3fc
-	.4byte	.LLST150
-	.uleb128 0x6c
+	.4byte	.LLST159
+	.uleb128 0x6b
 	.4byte	.LASF3071
 	.byte	0x1
 	.2byte	0x41b
-	.8byte	.L562
+	.8byte	.L625
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xe80
-	.4byte	0x11491
+	.4byte	.Ldebug_ranges0+0x1040
+	.4byte	0x117c0
 	.uleb128 0x46
 	.4byte	.LASF3058
 	.byte	0x1
 	.2byte	0x35e
 	.4byte	0xc6
 	.uleb128 0x5e
-	.8byte	.LBB1560
-	.8byte	.LBE1560-.LBB1560
-	.uleb128 0x6c
+	.8byte	.LBB1741
+	.8byte	.LBE1741-.LBB1741
+	.uleb128 0x6b
 	.4byte	.LASF3070
 	.byte	0x1
 	.2byte	0x35e
-	.8byte	.L545
+	.8byte	.L608
 	.uleb128 0x4c
 	.4byte	.LASF3059
 	.byte	0x1
@@ -40046,45 +40660,45 @@ __exitcall_ebc_exit:
 	.2byte	0x35e
 	.4byte	0x194
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xeb0
-	.4byte	0x11475
+	.4byte	.Ldebug_ranges0+0x1070
+	.4byte	0x117a4
 	.uleb128 0x57
 	.4byte	.LASF3060
 	.byte	0x1
 	.2byte	0x35e
 	.4byte	0x194
-	.4byte	.LLST163
+	.4byte	.LLST172
 	.uleb128 0x4e
-	.8byte	.LVL734
-	.4byte	0x13a5e
+	.8byte	.LVL768
+	.4byte	0x13d8c
 	.uleb128 0x4e
-	.8byte	.LVL735
-	.4byte	0x13a6a
+	.8byte	.LVL769
+	.4byte	0x13d98
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL732
-	.4byte	0x13a77
+	.8byte	.LVL766
+	.4byte	0x13da5
 	.uleb128 0x4e
-	.8byte	.LVL736
-	.4byte	0x13a83
+	.8byte	.LVL770
+	.4byte	0x13db1
 	.byte	0
 	.byte	0
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xe10
-	.4byte	0x11533
+	.4byte	.Ldebug_ranges0+0xfd0
+	.4byte	0x11862
 	.uleb128 0x46
 	.4byte	.LASF3058
 	.byte	0x1
 	.2byte	0x40a
 	.4byte	0xc6
 	.uleb128 0x5e
-	.8byte	.LBB1550
-	.8byte	.LBE1550-.LBB1550
-	.uleb128 0x6c
+	.8byte	.LBB1731
+	.8byte	.LBE1731-.LBB1731
+	.uleb128 0x6b
 	.4byte	.LASF3070
 	.byte	0x1
 	.2byte	0x40a
-	.8byte	.L589
+	.8byte	.L652
 	.uleb128 0x4c
 	.4byte	.LASF3059
 	.byte	0x1
@@ -40099,42 +40713,42 @@ __exitcall_ebc_exit:
 	.2byte	0x40a
 	.4byte	0x194
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xe40
-	.4byte	0x11517
+	.4byte	.Ldebug_ranges0+0x1000
+	.4byte	0x11846
 	.uleb128 0x57
 	.4byte	.LASF3060
 	.byte	0x1
 	.2byte	0x40a
 	.4byte	0x194
-	.4byte	.LLST161
+	.4byte	.LLST170
 	.uleb128 0x4e
-	.8byte	.LVL727
-	.4byte	0x13a5e
+	.8byte	.LVL761
+	.4byte	0x13d8c
 	.uleb128 0x4e
-	.8byte	.LVL728
-	.4byte	0x13a6a
+	.8byte	.LVL762
+	.4byte	0x13d98
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL725
-	.4byte	0x13a77
+	.8byte	.LVL759
+	.4byte	0x13da5
 	.uleb128 0x4e
-	.8byte	.LVL729
-	.4byte	0x13a83
+	.8byte	.LVL763
+	.4byte	0x13db1
 	.byte	0
 	.byte	0
-	.uleb128 0x6b
-	.8byte	.LBB1546
-	.8byte	.LBE1546-.LBB1546
-	.4byte	0x115e5
+	.uleb128 0x6c
+	.8byte	.LBB1717
+	.8byte	.LBE1717-.LBB1717
+	.4byte	0x11914
 	.uleb128 0x46
 	.4byte	.LASF3058
 	.byte	0x1
 	.2byte	0x437
 	.4byte	0xc6
 	.uleb128 0x5e
-	.8byte	.LBB1547
-	.8byte	.LBE1547-.LBB1547
-	.uleb128 0x71
+	.8byte	.LBB1718
+	.8byte	.LBE1718-.LBB1718
+	.uleb128 0x72
 	.4byte	.LASF3070
 	.byte	0x1
 	.2byte	0x437
@@ -40151,46 +40765,46 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x437
 	.4byte	0x194
-	.uleb128 0x6b
-	.8byte	.LBB1548
-	.8byte	.LBE1548-.LBB1548
-	.4byte	0x115c9
+	.uleb128 0x6c
+	.8byte	.LBB1719
+	.8byte	.LBE1719-.LBB1719
+	.4byte	0x118f8
 	.uleb128 0x57
 	.4byte	.LASF3060
 	.byte	0x1
 	.2byte	0x437
 	.4byte	0x194
-	.4byte	.LLST160
+	.4byte	.LLST161
 	.uleb128 0x4e
-	.8byte	.LVL688
-	.4byte	0x13a5e
+	.8byte	.LVL708
+	.4byte	0x13d8c
 	.uleb128 0x4e
-	.8byte	.LVL689
-	.4byte	0x13a6a
+	.8byte	.LVL709
+	.4byte	0x13d98
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL686
-	.4byte	0x13a77
+	.8byte	.LVL706
+	.4byte	0x13da5
 	.uleb128 0x4e
-	.8byte	.LVL690
-	.4byte	0x13a83
+	.8byte	.LVL710
+	.4byte	0x13db1
 	.byte	0
 	.byte	0
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xd30
-	.4byte	0x1167b
+	.4byte	.Ldebug_ranges0+0xef0
+	.4byte	0x119aa
 	.uleb128 0x46
 	.4byte	.LASF3058
 	.byte	0x1
 	.2byte	0x443
 	.4byte	0xc6
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xd30
-	.uleb128 0x6c
+	.4byte	.Ldebug_ranges0+0xef0
+	.uleb128 0x6b
 	.4byte	.LASF3070
 	.byte	0x1
 	.2byte	0x443
-	.8byte	.L605
+	.8byte	.L668
 	.uleb128 0x4c
 	.4byte	.LASF3059
 	.byte	0x1
@@ -40205,371 +40819,371 @@ __exitcall_ebc_exit:
 	.2byte	0x443
 	.4byte	0x194
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0xd70
-	.4byte	0x1165f
+	.4byte	.Ldebug_ranges0+0xf30
+	.4byte	0x1198e
 	.uleb128 0x57
 	.4byte	.LASF3060
 	.byte	0x1
 	.2byte	0x443
 	.4byte	0x194
-	.4byte	.LLST151
+	.4byte	.LLST160
 	.uleb128 0x4e
-	.8byte	.LVL639
-	.4byte	0x13a5e
+	.8byte	.LVL672
+	.4byte	0x13d8c
 	.uleb128 0x4e
-	.8byte	.LVL640
-	.4byte	0x13a6a
+	.8byte	.LVL673
+	.4byte	0x13d98
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL637
-	.4byte	0x13a77
+	.8byte	.LVL670
+	.4byte	0x13da5
 	.uleb128 0x4e
-	.8byte	.LVL641
-	.4byte	0x13a83
+	.8byte	.LVL674
+	.4byte	0x13db1
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x125e9
-	.8byte	.LBB1536
-	.4byte	.Ldebug_ranges0+0xdb0
+	.4byte	0x12918
+	.8byte	.LBB1720
+	.4byte	.Ldebug_ranges0+0xf70
 	.byte	0x1
 	.2byte	0x37b
-	.4byte	0x1172a
+	.4byte	0x11a59
 	.uleb128 0x54
-	.4byte	0x12632
+	.4byte	0x12961
 	.uleb128 0x54
-	.4byte	0x12626
+	.4byte	0x12955
 	.uleb128 0x54
-	.4byte	0x1261a
+	.4byte	0x12949
 	.uleb128 0x54
-	.4byte	0x1260e
+	.4byte	0x1293d
 	.uleb128 0x54
-	.4byte	0x12602
+	.4byte	0x12931
 	.uleb128 0x54
-	.4byte	0x125f6
+	.4byte	0x12925
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xdb0
+	.4byte	.Ldebug_ranges0+0xf70
 	.uleb128 0x5f
-	.4byte	0x1263e
-	.4byte	.LLST152
+	.4byte	0x1296d
+	.4byte	.LLST162
 	.uleb128 0x5c
-	.4byte	0x1264a
+	.4byte	0x12979
 	.uleb128 0x5c
-	.4byte	0x12656
+	.4byte	0x12985
 	.uleb128 0x5f
-	.4byte	0x12662
-	.4byte	.LLST153
+	.4byte	0x12991
+	.4byte	.LLST163
 	.uleb128 0x5f
-	.4byte	0x1266e
-	.4byte	.LLST154
+	.4byte	0x1299d
+	.4byte	.LLST164
 	.uleb128 0x5c
-	.4byte	0x1267a
+	.4byte	0x129a9
 	.uleb128 0x5c
-	.4byte	0x12686
+	.4byte	0x129b5
 	.uleb128 0x5c
-	.4byte	0x12692
+	.4byte	0x129c1
 	.uleb128 0x5c
-	.4byte	0x1269e
+	.4byte	0x129cd
 	.uleb128 0x5c
-	.4byte	0x126aa
+	.4byte	0x129d9
 	.uleb128 0x5f
-	.4byte	0x126b6
-	.4byte	.LLST155
+	.4byte	0x129e5
+	.4byte	.LLST165
 	.uleb128 0x5f
-	.4byte	0x126c0
-	.4byte	.LLST156
+	.4byte	0x129ef
+	.4byte	.LLST166
 	.uleb128 0x5f
-	.4byte	0x126ca
-	.4byte	.LLST157
+	.4byte	0x129f9
+	.4byte	.LLST167
 	.uleb128 0x5f
-	.4byte	0x126d6
-	.4byte	.LLST158
+	.4byte	0x12a05
+	.4byte	.LLST168
 	.uleb128 0x60
-	.4byte	0x126e2
+	.4byte	0x12a11
 	.uleb128 0x1
 	.byte	0x5e
 	.uleb128 0x5f
-	.4byte	0x126ee
-	.4byte	.LLST159
+	.4byte	0x12a1d
+	.4byte	.LLST169
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1285d
-	.8byte	.LBB1554
-	.8byte	.LBE1554-.LBB1554
+	.4byte	0x12b8c
+	.8byte	.LBB1735
+	.8byte	.LBE1735-.LBB1735
 	.byte	0x1
 	.2byte	0x3f7
-	.4byte	0x11775
+	.4byte	0x11aa4
 	.uleb128 0x54
-	.4byte	0x12878
+	.4byte	0x12ba7
 	.uleb128 0x54
-	.4byte	0x1286d
+	.4byte	0x12b9c
 	.uleb128 0x5e
-	.8byte	.LBB1555
-	.8byte	.LBE1555-.LBB1555
+	.8byte	.LBB1736
+	.8byte	.LBE1736-.LBB1736
 	.uleb128 0x5c
-	.4byte	0x12883
+	.4byte	0x12bb2
 	.uleb128 0x4e
-	.8byte	.LVL706
-	.4byte	0x136e8
+	.8byte	.LVL740
+	.4byte	0x13a16
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x11b67
-	.8byte	.LBB1556
-	.8byte	.LBE1556-.LBB1556
+	.4byte	0x11e96
+	.8byte	.LBB1737
+	.8byte	.LBE1737-.LBB1737
 	.byte	0x1
 	.2byte	0x3d9
-	.4byte	0x117fb
+	.4byte	0x11b2a
 	.uleb128 0x54
-	.4byte	0x11b90
+	.4byte	0x11ebf
 	.uleb128 0x54
-	.4byte	0x11b84
+	.4byte	0x11eb3
 	.uleb128 0x54
-	.4byte	0x11b78
+	.4byte	0x11ea7
 	.uleb128 0x5e
-	.8byte	.LBB1557
-	.8byte	.LBE1557-.LBB1557
+	.8byte	.LBB1738
+	.8byte	.LBE1738-.LBB1738
 	.uleb128 0x5c
-	.4byte	0x11b9c
+	.4byte	0x11ecb
 	.uleb128 0x5c
-	.4byte	0x11ba6
+	.4byte	0x11ed5
 	.uleb128 0x5c
-	.4byte	0x11bb2
+	.4byte	0x11ee1
 	.uleb128 0x5c
-	.4byte	0x11bbe
+	.4byte	0x11eed
 	.uleb128 0x5f
-	.4byte	0x11bca
-	.4byte	.LLST162
+	.4byte	0x11ef9
+	.4byte	.LLST171
 	.uleb128 0x5c
-	.4byte	0x11bd6
+	.4byte	0x11f05
 	.uleb128 0x5c
-	.4byte	0x11be2
-	.uleb128 0x72
-	.4byte	0x11bee
+	.4byte	0x11f11
+	.uleb128 0x73
+	.4byte	0x11f1d
 	.uleb128 0x5e
-	.8byte	.LBB1558
-	.8byte	.LBE1558-.LBB1558
+	.8byte	.LBB1739
+	.8byte	.LBE1739-.LBB1739
 	.uleb128 0x5c
-	.4byte	0x11bf7
+	.4byte	0x11f26
 	.uleb128 0x5c
-	.4byte	0x11c03
+	.4byte	0x11f32
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1285d
-	.8byte	.LBB1565
-	.8byte	.LBE1565-.LBB1565
+	.4byte	0x12b8c
+	.8byte	.LBB1746
+	.8byte	.LBE1746-.LBB1746
 	.byte	0x1
 	.2byte	0x3a6
-	.4byte	0x11846
+	.4byte	0x11b75
 	.uleb128 0x54
-	.4byte	0x12878
+	.4byte	0x12ba7
 	.uleb128 0x54
-	.4byte	0x1286d
+	.4byte	0x12b9c
 	.uleb128 0x5e
-	.8byte	.LBB1566
-	.8byte	.LBE1566-.LBB1566
+	.8byte	.LBB1747
+	.8byte	.LBE1747-.LBB1747
 	.uleb128 0x5c
-	.4byte	0x12883
+	.4byte	0x12bb2
 	.uleb128 0x4e
-	.8byte	.LVL743
-	.4byte	0x136e8
+	.8byte	.LVL777
+	.4byte	0x13a16
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1285d
-	.8byte	.LBB1567
-	.8byte	.LBE1567-.LBB1567
+	.4byte	0x12b8c
+	.8byte	.LBB1748
+	.8byte	.LBE1748-.LBB1748
 	.byte	0x1
 	.2byte	0x383
-	.4byte	0x11891
+	.4byte	0x11bc0
 	.uleb128 0x54
-	.4byte	0x12878
+	.4byte	0x12ba7
 	.uleb128 0x54
-	.4byte	0x1286d
+	.4byte	0x12b9c
 	.uleb128 0x5e
-	.8byte	.LBB1568
-	.8byte	.LBE1568-.LBB1568
+	.8byte	.LBB1749
+	.8byte	.LBE1749-.LBB1749
 	.uleb128 0x5c
-	.4byte	0x12883
+	.4byte	0x12bb2
 	.uleb128 0x4e
-	.8byte	.LVL746
-	.4byte	0x136e8
+	.8byte	.LVL780
+	.4byte	0x13a16
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1285d
-	.8byte	.LBB1569
-	.8byte	.LBE1569-.LBB1569
+	.4byte	0x12b8c
+	.8byte	.LBB1750
+	.8byte	.LBE1750-.LBB1750
 	.byte	0x1
 	.2byte	0x34e
-	.4byte	0x118dc
+	.4byte	0x11c0b
 	.uleb128 0x54
-	.4byte	0x12878
+	.4byte	0x12ba7
 	.uleb128 0x54
-	.4byte	0x1286d
+	.4byte	0x12b9c
 	.uleb128 0x5e
-	.8byte	.LBB1570
-	.8byte	.LBE1570-.LBB1570
+	.8byte	.LBB1751
+	.8byte	.LBE1751-.LBB1751
 	.uleb128 0x5c
-	.4byte	0x12883
+	.4byte	0x12bb2
 	.uleb128 0x4e
-	.8byte	.LVL747
-	.4byte	0x136e8
+	.8byte	.LVL781
+	.4byte	0x13a16
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL624
-	.4byte	0x13ae6
+	.8byte	.LVL657
+	.4byte	0x13e14
 	.uleb128 0x4e
-	.8byte	.LVL625
-	.4byte	0x13af2
+	.8byte	.LVL658
+	.4byte	0x13e20
 	.uleb128 0x4e
-	.8byte	.LVL626
-	.4byte	0x13ab6
+	.8byte	.LVL659
+	.4byte	0x13dd8
 	.uleb128 0x4e
-	.8byte	.LVL644
-	.4byte	0x139a9
+	.8byte	.LVL677
+	.4byte	0x13cd7
 	.uleb128 0x4e
-	.8byte	.LVL645
-	.4byte	0x13af2
+	.8byte	.LVL678
+	.4byte	0x13e20
 	.uleb128 0x4e
-	.8byte	.LVL646
-	.4byte	0x13ab6
+	.8byte	.LVL679
+	.4byte	0x13dd8
 	.uleb128 0x4e
-	.8byte	.LVL647
-	.4byte	0x12753
+	.8byte	.LVL680
+	.4byte	0x12a82
 	.uleb128 0x4e
-	.8byte	.LVL648
-	.4byte	0x13882
+	.8byte	.LVL681
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL649
-	.4byte	0x11fed
+	.8byte	.LVL682
+	.4byte	0x1231c
 	.uleb128 0x4e
-	.8byte	.LVL652
-	.4byte	0x13afe
+	.8byte	.LVL685
+	.4byte	0x13e2c
 	.uleb128 0x4e
-	.8byte	.LVL653
-	.4byte	0x13882
+	.8byte	.LVL686
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL654
-	.4byte	0x1395f
+	.8byte	.LVL687
+	.4byte	0x13c8d
 	.uleb128 0x4e
-	.8byte	.LVL655
-	.4byte	0x13882
+	.8byte	.LVL688
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL656
-	.4byte	0x139a9
+	.8byte	.LVL689
+	.4byte	0x13cd7
 	.uleb128 0x4e
-	.8byte	.LVL657
-	.4byte	0x139a9
+	.8byte	.LVL690
+	.4byte	0x12a82
 	.uleb128 0x4e
-	.8byte	.LVL658
-	.4byte	0x139a9
+	.8byte	.LVL691
+	.4byte	0x11f40
 	.uleb128 0x4e
-	.8byte	.LVL659
-	.4byte	0x139a9
+	.8byte	.LVL692
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL676
-	.4byte	0x138fc
+	.8byte	.LVL693
+	.4byte	0x1231c
 	.uleb128 0x4e
-	.8byte	.LVL677
-	.4byte	0x13af2
+	.8byte	.LVL695
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL679
-	.4byte	0x11c11
+	.8byte	.LVL696
+	.4byte	0x13cf9
 	.uleb128 0x4e
-	.8byte	.LVL680
-	.4byte	0x138fc
+	.8byte	.LVL697
+	.4byte	0x13e20
 	.uleb128 0x4e
-	.8byte	.LVL682
-	.4byte	0x13882
+	.8byte	.LVL698
+	.4byte	0x13dd8
 	.uleb128 0x4e
-	.8byte	.LVL683
-	.4byte	0x139cb
+	.8byte	.LVL702
+	.4byte	0x11f40
 	.uleb128 0x4e
-	.8byte	.LVL684
-	.4byte	0x13af2
+	.8byte	.LVL703
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL685
-	.4byte	0x13ab6
+	.8byte	.LVL705
+	.4byte	0x13e20
 	.uleb128 0x4e
-	.8byte	.LVL691
-	.4byte	0x137a7
+	.8byte	.LVL711
+	.4byte	0x13ad5
 	.uleb128 0x4e
-	.8byte	.LVL692
-	.4byte	0x139a9
+	.8byte	.LVL712
+	.4byte	0x13cd7
 	.uleb128 0x4e
-	.8byte	.LVL693
-	.4byte	0x12753
+	.8byte	.LVL713
+	.4byte	0x13cd7
 	.uleb128 0x4e
-	.8byte	.LVL694
-	.4byte	0x11c11
+	.8byte	.LVL714
+	.4byte	0x13cd7
 	.uleb128 0x4e
-	.8byte	.LVL695
-	.4byte	0x13882
+	.8byte	.LVL715
+	.4byte	0x13cd7
 	.uleb128 0x4e
-	.8byte	.LVL696
-	.4byte	0x11fed
+	.8byte	.LVL730
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL699
-	.4byte	0x13882
+	.8byte	.LVL733
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL700
-	.4byte	0x11fed
+	.8byte	.LVL734
+	.4byte	0x1231c
 	.uleb128 0x4e
-	.8byte	.LVL701
-	.4byte	0x1395f
+	.8byte	.LVL735
+	.4byte	0x13c8d
 	.uleb128 0x4e
-	.8byte	.LVL704
-	.4byte	0x1395f
+	.8byte	.LVL738
+	.4byte	0x13c8d
 	.uleb128 0x4e
-	.8byte	.LVL709
-	.4byte	0x13882
+	.8byte	.LVL743
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL710
-	.4byte	0x13882
+	.8byte	.LVL744
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL713
-	.4byte	0x13882
+	.8byte	.LVL747
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL717
-	.4byte	0x13882
+	.8byte	.LVL751
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL718
-	.4byte	0x13afe
+	.8byte	.LVL752
+	.4byte	0x13e2c
 	.uleb128 0x4e
-	.8byte	.LVL719
-	.4byte	0x139cb
+	.8byte	.LVL753
+	.4byte	0x13cf9
 	.uleb128 0x4e
-	.8byte	.LVL722
-	.4byte	0x138f0
+	.8byte	.LVL756
+	.4byte	0x13c1e
 	.uleb128 0x4e
-	.8byte	.LVL723
-	.4byte	0x139a9
+	.8byte	.LVL757
+	.4byte	0x13cd7
 	.uleb128 0x4e
-	.8byte	.LVL724
-	.4byte	0x139a9
+	.8byte	.LVL758
+	.4byte	0x13cd7
 	.uleb128 0x4e
-	.8byte	.LVL730
-	.4byte	0x139a9
+	.8byte	.LVL764
+	.4byte	0x13cd7
 	.uleb128 0x4e
-	.8byte	.LVL739
-	.4byte	0x11c11
+	.8byte	.LVL773
+	.4byte	0x11f40
 	.uleb128 0x4e
-	.8byte	.LVL740
-	.4byte	0x137a7
+	.8byte	.LVL774
+	.4byte	0x13ad5
 	.uleb128 0x4e
-	.8byte	.LVL742
-	.4byte	0x13882
+	.8byte	.LVL776
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL744
-	.4byte	0x138fc
+	.8byte	.LVL778
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL748
-	.4byte	0x13a09
+	.8byte	.LVL782
+	.4byte	0x13d37
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3072
@@ -40577,7 +41191,7 @@ __exitcall_ebc_exit:
 	.2byte	0x2f5
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11c11
+	.4byte	0x11f40
 	.uleb128 0x64
 	.4byte	.LASF3073
 	.byte	0x1
@@ -40628,7 +41242,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x2fc
 	.4byte	0x4659
-	.uleb128 0x71
+	.uleb128 0x72
 	.4byte	.LASF3082
 	.byte	0x1
 	.2byte	0x313
@@ -40654,13 +41268,13 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2817-.LFB2817
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11d58
+	.4byte	0x12087
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x2a1
 	.4byte	0xe461
-	.4byte	.LLST64
+	.4byte	.LLST73
 	.uleb128 0x46
 	.4byte	.LASF2952
 	.byte	0x1
@@ -40671,7 +41285,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x2a4
 	.4byte	0xc6
-	.4byte	.LLST65
+	.4byte	.LLST74
 	.uleb128 0x69
 	.string	"ret"
 	.byte	0x1
@@ -40680,62 +41294,62 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x64
 	.uleb128 0x53
-	.4byte	0x12ad2
-	.8byte	.LBB1023
-	.8byte	.LBE1023-.LBB1023
+	.4byte	0x12e01
+	.8byte	.LBB1204
+	.8byte	.LBE1204-.LBB1204
 	.byte	0x1
 	.2byte	0x2a8
-	.4byte	0x11c94
+	.4byte	0x11fc3
 	.uleb128 0x54
-	.4byte	0x12aed
+	.4byte	0x12e1c
 	.uleb128 0x54
-	.4byte	0x12ae2
+	.4byte	0x12e11
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL213
-	.4byte	0x13882
+	.8byte	.LVL246
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL214
-	.4byte	0x13b0a
+	.8byte	.LVL247
+	.4byte	0x13e38
 	.uleb128 0x4e
-	.8byte	.LVL217
-	.4byte	0x13b0a
+	.8byte	.LVL250
+	.4byte	0x13e38
 	.uleb128 0x4e
-	.8byte	.LVL218
-	.4byte	0x138fc
+	.8byte	.LVL251
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL220
-	.4byte	0x138fc
+	.8byte	.LVL253
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL221
-	.4byte	0x138fc
+	.8byte	.LVL254
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL223
-	.4byte	0x13b0a
+	.8byte	.LVL256
+	.4byte	0x13e38
 	.uleb128 0x4e
-	.8byte	.LVL224
-	.4byte	0x13b0a
+	.8byte	.LVL257
+	.4byte	0x13e38
 	.uleb128 0x4e
-	.8byte	.LVL225
-	.4byte	0x13b0a
+	.8byte	.LVL258
+	.4byte	0x13e38
 	.uleb128 0x4e
-	.8byte	.LVL226
-	.4byte	0x13b0a
+	.8byte	.LVL259
+	.4byte	0x13e38
 	.uleb128 0x4e
-	.8byte	.LVL227
-	.4byte	0x13b0a
+	.8byte	.LVL260
+	.4byte	0x13e38
 	.uleb128 0x4e
-	.8byte	.LVL228
-	.4byte	0x13b0a
+	.8byte	.LVL261
+	.4byte	0x13e38
 	.uleb128 0x4e
-	.8byte	.LVL229
-	.4byte	0x13b0a
+	.8byte	.LVL262
+	.4byte	0x13e38
 	.uleb128 0x4e
-	.8byte	.LVL230
-	.4byte	0x138fc
+	.8byte	.LVL263
+	.4byte	0x13c2a
 	.uleb128 0x4e
-	.8byte	.LVL231
-	.4byte	0x13a09
+	.8byte	.LVL264
+	.4byte	0x13d37
 	.byte	0
 	.uleb128 0x4d
 	.4byte	.LASF3087
@@ -40745,7 +41359,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2816-.LFB2816
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11e11
+	.4byte	0x12140
 	.uleb128 0x46
 	.4byte	.LASF2952
 	.byte	0x1
@@ -40757,35 +41371,35 @@ __exitcall_ebc_exit:
 	.2byte	0x27f
 	.4byte	0xe117
 	.uleb128 0x4e
-	.8byte	.LVL196
-	.4byte	0x1392d
+	.8byte	.LVL229
+	.4byte	0x13c5b
 	.uleb128 0x4e
-	.8byte	.LVL197
-	.4byte	0x13882
+	.8byte	.LVL230
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL198
-	.4byte	0x139cb
+	.8byte	.LVL231
+	.4byte	0x13cf9
 	.uleb128 0x4e
-	.8byte	.LVL199
-	.4byte	0x139cb
+	.8byte	.LVL232
+	.4byte	0x13cf9
 	.uleb128 0x4e
-	.8byte	.LVL200
-	.4byte	0x13882
+	.8byte	.LVL233
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL201
-	.4byte	0x138e6
+	.8byte	.LVL234
+	.4byte	0x13c14
 	.uleb128 0x4e
-	.8byte	.LVL202
-	.4byte	0x1395f
+	.8byte	.LVL235
+	.4byte	0x13c8d
 	.uleb128 0x4e
-	.8byte	.LVL203
-	.4byte	0x139cb
+	.8byte	.LVL236
+	.4byte	0x13cf9
 	.uleb128 0x4e
-	.8byte	.LVL204
-	.4byte	0x139cb
+	.8byte	.LVL237
+	.4byte	0x13cf9
 	.uleb128 0x4e
-	.8byte	.LVL205
-	.4byte	0x1392d
+	.8byte	.LVL238
+	.4byte	0x13c5b
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3088
@@ -40796,13 +41410,13 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2815-.LFB2815
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11fdd
+	.4byte	0x1230c
 	.uleb128 0x56
 	.4byte	.LASF791
 	.byte	0x1
 	.2byte	0x239
 	.4byte	0x443
-	.4byte	.LLST110
+	.4byte	.LLST119
 	.uleb128 0x69
 	.string	"ebc"
 	.byte	0x1
@@ -40821,13 +41435,13 @@ __exitcall_ebc_exit:
 	.2byte	0x23d
 	.4byte	0xe6fb
 	.uleb128 0x61
-	.4byte	.Ldebug_ranges0+0x7b0
-	.4byte	0x11efb
+	.4byte	.Ldebug_ranges0+0x970
+	.4byte	0x1222a
 	.uleb128 0x3f
 	.byte	0x8
 	.byte	0x1
 	.2byte	0x244
-	.4byte	0x11e94
+	.4byte	0x121c3
 	.uleb128 0x41
 	.4byte	.LASF3089
 	.byte	0x1
@@ -40837,104 +41451,104 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x1
 	.2byte	0x244
-	.4byte	0x11fdd
+	.4byte	0x1230c
 	.byte	0
 	.uleb128 0x52
 	.string	"__u"
 	.byte	0x1
 	.2byte	0x244
-	.4byte	0x11e72
+	.4byte	0x121a1
 	.uleb128 0x58
-	.4byte	0x132b3
-	.8byte	.LBB1112
-	.4byte	.Ldebug_ranges0+0x7f0
+	.4byte	0x135e3
+	.8byte	.LBB1293
+	.4byte	.Ldebug_ranges0+0x9b0
 	.byte	0x1
 	.2byte	0x244
-	.4byte	0x11ec8
+	.4byte	0x121f7
 	.uleb128 0x54
-	.4byte	0x132d3
+	.4byte	0x13603
 	.uleb128 0x54
-	.4byte	0x132c8
+	.4byte	0x135f8
 	.uleb128 0x54
-	.4byte	0x132bf
+	.4byte	0x135ef
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x13114
-	.8byte	.LBB1115
-	.8byte	.LBE1115-.LBB1115
+	.4byte	0x13443
+	.8byte	.LBB1296
+	.8byte	.LBE1296-.LBB1296
 	.byte	0x1
 	.2byte	0x244
 	.uleb128 0x5e
-	.8byte	.LBB1116
-	.8byte	.LBE1116-.LBB1116
+	.8byte	.LBB1297
+	.8byte	.LBE1297-.LBB1297
 	.uleb128 0x60
-	.4byte	0x13124
+	.4byte	0x13453
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x12fae
-	.8byte	.LBB1120
-	.8byte	.LBE1120-.LBB1120
+	.4byte	0x132dd
+	.8byte	.LBB1301
+	.8byte	.LBE1301-.LBB1301
 	.byte	0x1
 	.2byte	0x273
-	.4byte	0x11f4d
+	.4byte	0x1227c
 	.uleb128 0x54
-	.4byte	0x12fbf
+	.4byte	0x132ee
 	.uleb128 0x5a
-	.4byte	0x12fcc
-	.8byte	.LBB1122
-	.8byte	.LBE1122-.LBB1122
+	.4byte	0x132fb
+	.8byte	.LBB1303
+	.8byte	.LBE1303-.LBB1303
 	.byte	0xd
 	.2byte	0x240
 	.uleb128 0x54
-	.4byte	0x12fe8
+	.4byte	0x13317
 	.uleb128 0x54
-	.4byte	0x12fdd
+	.4byte	0x1330c
 	.uleb128 0x4e
-	.8byte	.LVL394
-	.4byte	0x13b16
+	.8byte	.LVL427
+	.4byte	0x13e44
 	.byte	0
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL387
-	.4byte	0x135e5
+	.8byte	.LVL420
+	.4byte	0x13913
 	.uleb128 0x4e
-	.8byte	.LVL388
-	.4byte	0x12396
+	.8byte	.LVL421
+	.4byte	0x126c5
 	.uleb128 0x4e
-	.8byte	.LVL389
-	.4byte	0x13b23
+	.8byte	.LVL422
+	.4byte	0x13e51
 	.uleb128 0x4e
-	.8byte	.LVL390
-	.4byte	0x13a5e
+	.8byte	.LVL423
+	.4byte	0x13d8c
 	.uleb128 0x4e
-	.8byte	.LVL391
-	.4byte	0x13b2d
+	.8byte	.LVL424
+	.4byte	0x13e5b
 	.uleb128 0x4e
-	.8byte	.LVL392
-	.4byte	0x135e5
+	.8byte	.LVL425
+	.4byte	0x13913
 	.uleb128 0x4e
-	.8byte	.LVL393
-	.4byte	0x13426
+	.8byte	.LVL426
+	.4byte	0x13755
 	.uleb128 0x4e
-	.8byte	.LVL395
-	.4byte	0x12396
+	.8byte	.LVL428
+	.4byte	0x126c5
 	.uleb128 0x4e
-	.8byte	.LVL396
-	.4byte	0x135e5
+	.8byte	.LVL429
+	.4byte	0x13913
 	.uleb128 0x4e
-	.8byte	.LVL397
-	.4byte	0x135e5
+	.8byte	.LVL430
+	.4byte	0x13913
 	.uleb128 0x4e
-	.8byte	.LVL398
-	.4byte	0x132e5
+	.8byte	.LVL431
+	.4byte	0x13615
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x11fed
+	.4byte	0x1231c
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
@@ -40947,13 +41561,13 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2814-.LFB2814
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1218c
+	.4byte	0x124bb
 	.uleb128 0x51
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x1f1
 	.4byte	0xe461
-	.4byte	.LLST109
+	.4byte	.LLST118
 	.uleb128 0x46
 	.4byte	.LASF2994
 	.byte	0x1
@@ -40971,99 +41585,99 @@ __exitcall_ebc_exit:
 	.byte	0x3
 	.8byte	__func__.34644
 	.uleb128 0x53
-	.4byte	0x1218c
-	.8byte	.LBB1103
-	.8byte	.LBE1103-.LBB1103
+	.4byte	0x124bb
+	.8byte	.LBB1284
+	.8byte	.LBE1284-.LBB1284
 	.byte	0x1
 	.2byte	0x20b
-	.4byte	0x1207a
+	.4byte	0x123a9
 	.uleb128 0x54
-	.4byte	0x121a5
+	.4byte	0x124d4
 	.uleb128 0x54
-	.4byte	0x12199
+	.4byte	0x124c8
 	.uleb128 0x4e
-	.8byte	.LVL363
-	.4byte	0x135e5
+	.8byte	.LVL396
+	.4byte	0x13913
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1218c
-	.8byte	.LBB1105
-	.8byte	.LBE1105-.LBB1105
+	.4byte	0x124bb
+	.8byte	.LBB1286
+	.8byte	.LBE1286-.LBB1286
 	.byte	0x1
 	.2byte	0x220
-	.4byte	0x120ae
+	.4byte	0x123dd
 	.uleb128 0x54
-	.4byte	0x121a5
+	.4byte	0x124d4
 	.uleb128 0x54
-	.4byte	0x12199
+	.4byte	0x124c8
 	.uleb128 0x4e
-	.8byte	.LVL368
-	.4byte	0x135e5
+	.8byte	.LVL401
+	.4byte	0x13913
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1218c
-	.8byte	.LBB1107
-	.8byte	.LBE1107-.LBB1107
+	.4byte	0x124bb
+	.8byte	.LBB1288
+	.8byte	.LBE1288-.LBB1288
 	.byte	0x1
 	.2byte	0x1fe
-	.4byte	0x120e2
+	.4byte	0x12411
 	.uleb128 0x54
-	.4byte	0x121a5
+	.4byte	0x124d4
 	.uleb128 0x54
-	.4byte	0x12199
+	.4byte	0x124c8
 	.uleb128 0x4e
-	.8byte	.LVL373
-	.4byte	0x135e5
+	.8byte	.LVL406
+	.4byte	0x13913
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1218c
-	.8byte	.LBB1109
-	.8byte	.LBE1109-.LBB1109
+	.4byte	0x124bb
+	.8byte	.LBB1290
+	.8byte	.LBE1290-.LBB1290
 	.byte	0x1
 	.2byte	0x22d
-	.4byte	0x12116
+	.4byte	0x12445
 	.uleb128 0x54
-	.4byte	0x121a5
+	.4byte	0x124d4
 	.uleb128 0x54
-	.4byte	0x12199
+	.4byte	0x124c8
 	.uleb128 0x4e
-	.8byte	.LVL377
-	.4byte	0x135e5
+	.8byte	.LVL410
+	.4byte	0x13913
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL362
-	.4byte	0x12396
+	.8byte	.LVL395
+	.4byte	0x126c5
 	.uleb128 0x4e
-	.8byte	.LVL364
-	.4byte	0x12396
+	.8byte	.LVL397
+	.4byte	0x126c5
 	.uleb128 0x4e
-	.8byte	.LVL367
-	.4byte	0x13426
+	.8byte	.LVL400
+	.4byte	0x13755
 	.uleb128 0x4e
-	.8byte	.LVL369
-	.4byte	0x13426
+	.8byte	.LVL402
+	.4byte	0x13755
 	.uleb128 0x4e
-	.8byte	.LVL372
-	.4byte	0x12396
+	.8byte	.LVL405
+	.4byte	0x126c5
 	.uleb128 0x4e
-	.8byte	.LVL376
-	.4byte	0x132e5
+	.8byte	.LVL409
+	.4byte	0x13615
 	.uleb128 0x4e
-	.8byte	.LVL378
-	.4byte	0x132e5
+	.8byte	.LVL411
+	.4byte	0x13615
 	.uleb128 0x4e
-	.8byte	.LVL381
-	.4byte	0x13b39
+	.8byte	.LVL414
+	.4byte	0x13e67
 	.uleb128 0x4e
-	.8byte	.LVL382
-	.4byte	0x13b39
+	.8byte	.LVL415
+	.4byte	0x13e67
 	.byte	0
 	.uleb128 0x65
 	.4byte	.LASF3092
 	.byte	0x1
 	.2byte	0x1eb
 	.byte	0x1
-	.4byte	0x121b2
+	.4byte	0x124e1
 	.uleb128 0x64
 	.4byte	.LASF2994
 	.byte	0x1
@@ -41080,7 +41694,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x1e0
 	.byte	0x1
-	.4byte	0x121e4
+	.4byte	0x12513
 	.uleb128 0x64
 	.4byte	.LASF2994
 	.byte	0x1
@@ -41095,7 +41709,7 @@ __exitcall_ebc_exit:
 	.string	"buf"
 	.byte	0x1
 	.2byte	0x1e2
-	.4byte	0x121e4
+	.4byte	0x12513
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -41105,7 +41719,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x1b6
 	.byte	0x1
-	.4byte	0x122c0
+	.4byte	0x125ef
 	.uleb128 0x64
 	.4byte	.LASF3095
 	.byte	0x1
@@ -41197,7 +41811,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x190
 	.byte	0x1
-	.4byte	0x12396
+	.4byte	0x126c5
 	.uleb128 0x64
 	.4byte	.LASF3095
 	.byte	0x1
@@ -41292,7 +41906,7 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2809-.LFB2809
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x125e9
+	.4byte	0x12918
 	.uleb128 0x6a
 	.4byte	.LASF3095
 	.byte	0x1
@@ -41420,92 +42034,92 @@ __exitcall_ebc_exit:
 	.2byte	0x15f
 	.4byte	0xc6
 	.uleb128 0x58
-	.4byte	0x1288f
-	.8byte	.LBB792
+	.4byte	0x12bbe
+	.8byte	.LBB916
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
 	.2byte	0x181
-	.4byte	0x12508
+	.4byte	0x12837
 	.uleb128 0x54
-	.4byte	0x128b5
+	.4byte	0x12be4
 	.uleb128 0x54
-	.4byte	0x128aa
+	.4byte	0x12bd9
 	.uleb128 0x54
-	.4byte	0x1289f
+	.4byte	0x12bce
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0
 	.uleb128 0x5c
-	.4byte	0x128c0
+	.4byte	0x12bef
 	.uleb128 0x5f
-	.4byte	0x128cb
+	.4byte	0x12bfa
 	.4byte	.LLST6
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1288f
-	.8byte	.LBB795
-	.8byte	.LBE795-.LBB795
+	.4byte	0x12bbe
+	.8byte	.LBB919
+	.8byte	.LBE919-.LBB919
 	.byte	0x1
 	.2byte	0x17e
-	.4byte	0x12554
+	.4byte	0x12883
 	.uleb128 0x54
-	.4byte	0x128b5
+	.4byte	0x12be4
 	.uleb128 0x54
-	.4byte	0x128aa
+	.4byte	0x12bd9
 	.uleb128 0x54
-	.4byte	0x1289f
+	.4byte	0x12bce
 	.uleb128 0x5e
-	.8byte	.LBB796
-	.8byte	.LBE796-.LBB796
+	.8byte	.LBB920
+	.8byte	.LBE920-.LBB920
 	.uleb128 0x5c
-	.4byte	0x128c0
+	.4byte	0x12bef
 	.uleb128 0x5f
-	.4byte	0x128cb
+	.4byte	0x12bfa
 	.4byte	.LLST7
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1288f
-	.8byte	.LBB797
-	.8byte	.LBE797-.LBB797
+	.4byte	0x12bbe
+	.8byte	.LBB921
+	.8byte	.LBE921-.LBB921
 	.byte	0x1
 	.2byte	0x17f
-	.4byte	0x125a0
+	.4byte	0x128cf
 	.uleb128 0x54
-	.4byte	0x128b5
+	.4byte	0x12be4
 	.uleb128 0x54
-	.4byte	0x128aa
+	.4byte	0x12bd9
 	.uleb128 0x54
-	.4byte	0x1289f
+	.4byte	0x12bce
 	.uleb128 0x5e
-	.8byte	.LBB798
-	.8byte	.LBE798-.LBB798
+	.8byte	.LBB922
+	.8byte	.LBE922-.LBB922
 	.uleb128 0x5c
-	.4byte	0x128c0
+	.4byte	0x12bef
 	.uleb128 0x5f
-	.4byte	0x128cb
+	.4byte	0x12bfa
 	.4byte	.LLST8
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x1288f
-	.8byte	.LBB799
-	.8byte	.LBE799-.LBB799
+	.4byte	0x12bbe
+	.8byte	.LBB923
+	.8byte	.LBE923-.LBB923
 	.byte	0x1
 	.2byte	0x180
 	.uleb128 0x54
-	.4byte	0x128b5
+	.4byte	0x12be4
 	.uleb128 0x54
-	.4byte	0x128aa
+	.4byte	0x12bd9
 	.uleb128 0x54
-	.4byte	0x1289f
+	.4byte	0x12bce
 	.uleb128 0x5e
-	.8byte	.LBB800
-	.8byte	.LBE800-.LBB800
+	.8byte	.LBB924
+	.8byte	.LBE924-.LBB924
 	.uleb128 0x5c
-	.4byte	0x128c0
+	.4byte	0x12bef
 	.uleb128 0x5f
-	.4byte	0x128cb
+	.4byte	0x12bfa
 	.4byte	.LLST9
 	.byte	0
 	.byte	0
@@ -41515,7 +42129,7 @@ __exitcall_ebc_exit:
 	.byte	0x1
 	.2byte	0x110
 	.byte	0x1
-	.4byte	0x126fb
+	.4byte	0x12a2a
 	.uleb128 0x64
 	.4byte	.LASF3110
 	.byte	0x1
@@ -41627,7 +42241,7 @@ __exitcall_ebc_exit:
 	.2byte	0x11d
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x73
+	.uleb128 0x74
 	.4byte	.LASF3119
 	.byte	0x1
 	.2byte	0x102
@@ -41635,29 +42249,29 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2807-.LFB2807
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x12753
+	.4byte	0x12a82
 	.uleb128 0x56
 	.4byte	.LASF2271
 	.byte	0x1
 	.2byte	0x102
 	.4byte	0x31da
-	.4byte	.LLST143
+	.4byte	.LLST152
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
 	.2byte	0x104
 	.4byte	0xe461
-	.4byte	.LLST144
+	.4byte	.LLST153
 	.uleb128 0x46
 	.4byte	.LASF2952
 	.byte	0x1
 	.2byte	0x105
 	.4byte	0xe6fb
 	.uleb128 0x4e
-	.8byte	.LVL617
-	.4byte	0x12753
+	.8byte	.LVL650
+	.4byte	0x12a82
 	.byte	0
-	.uleb128 0x74
+	.uleb128 0x75
 	.4byte	.LASF3120
 	.byte	0x1
 	.byte	0xd2
@@ -41665,39 +42279,39 @@ __exitcall_ebc_exit:
 	.8byte	.LFE2806-.LFB2806
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1285d
-	.uleb128 0x75
+	.4byte	0x12b8c
+	.uleb128 0x76
 	.4byte	.LASF3110
 	.byte	0x1
 	.byte	0xd2
 	.4byte	0xaab
-	.4byte	.LLST138
-	.uleb128 0x75
+	.4byte	.LLST147
+	.uleb128 0x76
 	.4byte	.LASF3111
 	.byte	0x1
 	.byte	0xd2
 	.4byte	0xaab
-	.4byte	.LLST139
-	.uleb128 0x75
+	.4byte	.LLST148
+	.uleb128 0x76
 	.4byte	.LASF3112
 	.byte	0x1
 	.byte	0xd2
 	.4byte	0xaab
-	.4byte	.LLST140
-	.uleb128 0x76
+	.4byte	.LLST149
+	.uleb128 0x77
 	.4byte	.LASF3106
 	.byte	0x1
 	.byte	0xd2
 	.4byte	0xc097
 	.uleb128 0x1
 	.byte	0x53
-	.uleb128 0x75
+	.uleb128 0x76
 	.4byte	.LASF2952
 	.byte	0x1
 	.byte	0xd3
 	.4byte	0xe6fb
-	.4byte	.LLST141
-	.uleb128 0x76
+	.4byte	.LLST150
+	.uleb128 0x77
 	.4byte	.LASF2865
 	.byte	0x1
 	.byte	0xd3
@@ -41732,12 +42346,12 @@ __exitcall_ebc_exit:
 	.4byte	0x155
 	.uleb128 0x1
 	.byte	0x58
-	.uleb128 0x77
+	.uleb128 0x78
 	.4byte	.LASF3115
 	.byte	0x1
 	.byte	0xd6
 	.4byte	0x155
-	.4byte	.LLST142
+	.4byte	.LLST151
 	.uleb128 0x4b
 	.4byte	.LASF3116
 	.byte	0x1
@@ -41752,7 +42366,7 @@ __exitcall_ebc_exit:
 	.4byte	0x4659
 	.uleb128 0x1
 	.byte	0x51
-	.uleb128 0x78
+	.uleb128 0x79
 	.4byte	.LASF3118
 	.byte	0x1
 	.byte	0xd7
@@ -41764,14 +42378,14 @@ __exitcall_ebc_exit:
 	.4byte	0x10b
 	.uleb128 0x1
 	.byte	0x59
-	.uleb128 0x79
+	.uleb128 0x7a
 	.string	"i"
 	.byte	0x1
 	.byte	0xd9
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5b
-	.uleb128 0x7a
+	.uleb128 0x7b
 	.string	"j"
 	.byte	0x1
 	.byte	0xd9
@@ -41784,181 +42398,181 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0x53
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3121
 	.byte	0x1
 	.byte	0xb4
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1288f
-	.uleb128 0x7c
+	.4byte	0x12bbe
+	.uleb128 0x7d
 	.string	"ebc"
 	.byte	0x1
 	.byte	0xb4
 	.4byte	0xe461
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF3122
 	.byte	0x1
 	.byte	0xb4
 	.4byte	0xc6
-	.uleb128 0x78
+	.uleb128 0x79
 	.4byte	.LASF2952
 	.byte	0x1
 	.byte	0xb6
 	.4byte	0xe6fb
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3123
 	.byte	0x1
 	.byte	0x86
 	.4byte	0x10b
 	.byte	0x3
-	.4byte	0x128d7
-	.uleb128 0x7d
+	.4byte	0x12c06
+	.uleb128 0x7e
 	.4byte	.LASF2854
 	.byte	0x1
 	.byte	0x86
 	.4byte	0xc097
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF3098
 	.byte	0x1
 	.byte	0x86
 	.4byte	0x11a
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF3099
 	.byte	0x1
 	.byte	0x86
 	.4byte	0x11a
-	.uleb128 0x78
+	.uleb128 0x79
 	.4byte	.LASF3124
 	.byte	0x1
 	.byte	0x88
 	.4byte	0x10b
-	.uleb128 0x78
+	.uleb128 0x79
 	.4byte	.LASF3125
 	.byte	0x1
 	.byte	0x89
 	.4byte	0x11a
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3126
 	.byte	0x1
 	.byte	0x80
 	.4byte	0x10b
 	.byte	0x3
-	.4byte	0x12909
-	.uleb128 0x7d
+	.4byte	0x12c38
+	.uleb128 0x7e
 	.4byte	.LASF2854
 	.byte	0x1
 	.byte	0x80
 	.4byte	0xc097
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF3098
 	.byte	0x1
 	.byte	0x80
 	.4byte	0x11a
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF3099
 	.byte	0x1
 	.byte	0x80
 	.4byte	0x11a
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF3127
 	.byte	0xb
 	.byte	0x4b
 	.byte	0x3
-	.4byte	0x1292c
-	.uleb128 0x7d
+	.4byte	0x12c5b
+	.uleb128 0x7e
 	.4byte	.LASF2927
 	.byte	0xb
 	.byte	0x4b
 	.4byte	0xe0d7
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF2959
 	.byte	0xb
 	.byte	0x4b
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF3128
 	.byte	0xb
 	.byte	0x3c
 	.byte	0x3
-	.4byte	0x1295a
-	.uleb128 0x7d
+	.4byte	0x12c89
+	.uleb128 0x7e
 	.4byte	.LASF2927
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0xe0d7
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF3129
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13a
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF3130
 	.byte	0xb
 	.byte	0x3c
 	.4byte	0x13a
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF3131
 	.byte	0xb
 	.byte	0x36
 	.byte	0x3
-	.4byte	0x1299e
-	.uleb128 0x7d
+	.4byte	0x12ccd
+	.uleb128 0x7e
 	.4byte	.LASF2927
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xe0d7
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF3132
 	.byte	0xb
 	.byte	0x36
 	.4byte	0xc6
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF3133
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF3134
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF3135
 	.byte	0xb
 	.byte	0x37
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF3136
 	.byte	0xb
 	.byte	0x31
 	.byte	0x3
-	.4byte	0x129b6
-	.uleb128 0x7d
+	.4byte	0x12ce5
+	.uleb128 0x7e
 	.4byte	.LASF2927
 	.byte	0xb
 	.byte	0x31
 	.4byte	0xe0d7
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3137
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x129dd
-	.uleb128 0x7d
+	.4byte	0x12d0c
+	.uleb128 0x7e
 	.4byte	.LASF2927
 	.byte	0xb
 	.byte	0x2c
 	.4byte	0xe0d7
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF2994
 	.byte	0xb
 	.byte	0x2c
@@ -41969,7 +42583,7 @@ __exitcall_ebc_exit:
 	.byte	0xa
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x12a27
+	.4byte	0x12d56
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa
@@ -42002,350 +42616,350 @@ __exitcall_ebc_exit:
 	.2byte	0x108
 	.4byte	0xb78e
 	.byte	0x3
-	.4byte	0x12a45
+	.4byte	0x12d74
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa
 	.2byte	0x108
 	.4byte	0xa545
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3140
 	.byte	0xc8
 	.byte	0x1d
 	.4byte	0xb78e
 	.byte	0x3
-	.4byte	0x12a61
-	.uleb128 0x7c
+	.4byte	0x12d90
+	.uleb128 0x7d
 	.string	"bus"
 	.byte	0xc8
 	.byte	0x1d
 	.4byte	0xadac
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3141
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12a7d
-	.uleb128 0x7d
+	.4byte	0x12dac
+	.uleb128 0x7e
 	.4byte	.LASF3142
 	.byte	0xa
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF3143
 	.byte	0xcb
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x12ab6
-	.uleb128 0x7c
+	.4byte	0x12de5
+	.uleb128 0x7d
 	.string	"dev"
 	.byte	0xcb
 	.byte	0xa3
 	.4byte	0xa545
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF3144
 	.byte	0xcb
 	.byte	0xa4
 	.4byte	0x310
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0x2ce
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF3145
 	.byte	0xcb
 	.byte	0xa5
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3146
 	.byte	0x3
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12ad2
-	.uleb128 0x7d
+	.4byte	0x12e01
+	.uleb128 0x7e
 	.4byte	.LASF2928
 	.byte	0x3
 	.byte	0x35
 	.4byte	0xdad7
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3147
 	.byte	0x3
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12af7
-	.uleb128 0x7d
+	.4byte	0x12e26
+	.uleb128 0x7e
 	.4byte	.LASF2928
 	.byte	0x3
 	.byte	0x30
 	.4byte	0xdad7
-	.uleb128 0x7c
+	.uleb128 0x7d
 	.string	"t"
 	.byte	0x3
 	.byte	0x30
 	.4byte	0x4653
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF3148
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x12b0f
-	.uleb128 0x7d
+	.4byte	0x12e3e
+	.uleb128 0x7e
 	.4byte	.LASF2928
 	.byte	0x3
 	.byte	0x2b
 	.4byte	0xdad7
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF3149
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x12b27
-	.uleb128 0x7d
+	.4byte	0x12e56
+	.uleb128 0x7e
 	.4byte	.LASF2928
 	.byte	0x3
 	.byte	0x26
 	.4byte	0xdad7
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF3150
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x12b3f
-	.uleb128 0x7d
+	.4byte	0x12e6e
+	.uleb128 0x7e
 	.4byte	.LASF2928
 	.byte	0x3
 	.byte	0x21
 	.4byte	0xdad7
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF3151
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x12b57
-	.uleb128 0x7d
+	.4byte	0x12e86
+	.uleb128 0x7e
 	.4byte	.LASF2928
 	.byte	0x3
 	.byte	0x1c
 	.4byte	0xdad7
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF3152
 	.byte	0x4
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x12b6f
-	.uleb128 0x7d
+	.4byte	0x12e9e
+	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x42
-	.4byte	0x12b6f
+	.4byte	0x12e9e
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xd7d1
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF2836
 	.byte	0x4
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x12b8d
-	.uleb128 0x7d
+	.4byte	0x12ebc
+	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x38
-	.4byte	0x12b6f
+	.4byte	0x12e9e
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF3153
 	.byte	0x4
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x12bc5
-	.uleb128 0x7d
+	.4byte	0x12ef4
+	.uleb128 0x7e
 	.4byte	.LASF115
 	.byte	0x4
 	.byte	0x24
-	.4byte	0x12b6f
-	.uleb128 0x7d
+	.4byte	0x12e9e
+	.uleb128 0x7e
 	.4byte	.LASF192
 	.byte	0x4
 	.byte	0x24
 	.4byte	0xc6
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF264
 	.byte	0x4
 	.byte	0x25
 	.4byte	0x56
-	.uleb128 0x7a
+	.uleb128 0x7b
 	.string	"ws"
 	.byte	0x4
 	.byte	0x27
 	.4byte	0xace2
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3154
-	.byte	0x8
+	.byte	0x9
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12bf4
-	.uleb128 0x7c
+	.4byte	0x12f23
+	.uleb128 0x7d
 	.string	"to"
-	.byte	0x8
+	.byte	0x9
 	.byte	0x98
 	.4byte	0x443
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF2002
-	.byte	0x8
+	.byte	0x9
 	.byte	0x98
 	.4byte	0x3091
-	.uleb128 0x7c
+	.uleb128 0x7d
 	.string	"n"
-	.byte	0x8
+	.byte	0x9
 	.byte	0x98
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3155
-	.byte	0x8
+	.byte	0x9
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12c23
-	.uleb128 0x7c
+	.4byte	0x12f52
+	.uleb128 0x7d
 	.string	"to"
-	.byte	0x8
+	.byte	0x9
 	.byte	0x90
 	.4byte	0x443
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF2002
-	.byte	0x8
+	.byte	0x9
 	.byte	0x90
 	.4byte	0x3091
-	.uleb128 0x7c
+	.uleb128 0x7d
 	.string	"n"
-	.byte	0x8
+	.byte	0x9
 	.byte	0x90
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3156
-	.byte	0x8
+	.byte	0x9
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12c52
-	.uleb128 0x7c
+	.4byte	0x12f81
+	.uleb128 0x7d
 	.string	"to"
-	.byte	0x8
+	.byte	0x9
 	.byte	0x81
 	.4byte	0x443
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF2002
-	.byte	0x8
+	.byte	0x9
 	.byte	0x81
 	.4byte	0x3091
-	.uleb128 0x7c
+	.uleb128 0x7d
 	.string	"n"
-	.byte	0x8
+	.byte	0x9
 	.byte	0x81
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3157
-	.byte	0x8
+	.byte	0x9
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12c8c
-	.uleb128 0x7c
+	.4byte	0x12fbb
+	.uleb128 0x7d
 	.string	"to"
-	.byte	0x8
+	.byte	0x9
 	.byte	0x6e
 	.4byte	0x443
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF2002
-	.byte	0x8
+	.byte	0x9
 	.byte	0x6e
 	.4byte	0x3091
-	.uleb128 0x7c
+	.uleb128 0x7d
 	.string	"n"
-	.byte	0x8
+	.byte	0x9
 	.byte	0x6e
 	.4byte	0x29
-	.uleb128 0x7a
+	.uleb128 0x7b
 	.string	"res"
-	.byte	0x8
+	.byte	0x9
 	.byte	0x70
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3158
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x12cc0
-	.uleb128 0x7c
+	.4byte	0x12fef
+	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0x6
 	.byte	0xf5
 	.4byte	0x3091
-	.uleb128 0x78
+	.uleb128 0x79
 	.4byte	.LASF3159
 	.byte	0x6
 	.byte	0xf7
 	.4byte	0x443
 	.uleb128 0x66
-	.uleb128 0x78
+	.uleb128 0x79
 	.4byte	.LASF3160
 	.byte	0x6
 	.byte	0xfe
 	.4byte	0x155
 	.byte	0
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3161
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x12d0a
-	.uleb128 0x7d
+	.4byte	0x13039
+	.uleb128 0x7e
 	.4byte	.LASF1147
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x3091
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0x6
 	.byte	0x4b
 	.4byte	0x29
-	.uleb128 0x7a
+	.uleb128 0x7b
 	.string	"ret"
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
-	.uleb128 0x78
+	.uleb128 0x79
 	.4byte	.LASF3162
 	.byte	0x6
 	.byte	0x4d
 	.4byte	0x29
 	.uleb128 0x66
-	.uleb128 0x78
+	.uleb128 0x79
 	.4byte	.LASF3160
 	.byte	0x6
 	.byte	0x56
@@ -42358,7 +42972,7 @@ __exitcall_ebc_exit:
 	.2byte	0x2e5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x12d34
+	.4byte	0x13063
 	.uleb128 0x64
 	.4byte	.LASF984
 	.byte	0x12
@@ -42376,7 +42990,7 @@ __exitcall_ebc_exit:
 	.2byte	0x216
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x12d6c
+	.4byte	0x1309b
 	.uleb128 0x64
 	.4byte	.LASF984
 	.byte	0x12
@@ -42401,7 +43015,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1dd
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x12da2
+	.4byte	0x130d1
 	.uleb128 0x64
 	.4byte	.LASF984
 	.byte	0x12
@@ -42424,7 +43038,7 @@ __exitcall_ebc_exit:
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x12dc0
+	.4byte	0x130ef
 	.uleb128 0x64
 	.4byte	.LASF984
 	.byte	0x12
@@ -42437,42 +43051,42 @@ __exitcall_ebc_exit:
 	.2byte	0x13d
 	.4byte	0xd772
 	.byte	0x3
-	.4byte	0x12dde
+	.4byte	0x1310d
 	.uleb128 0x64
 	.4byte	.LASF170
 	.byte	0x12
 	.2byte	0x13d
 	.4byte	0x31b
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF3169
 	.byte	0xbe
 	.byte	0xdb
 	.byte	0x3
-	.4byte	0x12e01
-	.uleb128 0x7d
+	.4byte	0x13130
+	.uleb128 0x7e
 	.4byte	.LASF3020
 	.byte	0xbe
 	.byte	0xdb
 	.4byte	0xd6e9
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF791
 	.byte	0xbe
 	.byte	0xdc
 	.4byte	0x443
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3170
 	.byte	0xbe
 	.byte	0xd6
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x12e1d
-	.uleb128 0x7d
+	.4byte	0x1314c
+	.uleb128 0x7e
 	.4byte	.LASF3020
 	.byte	0xbe
 	.byte	0xd6
-	.4byte	0x12e1d
+	.4byte	0x1314c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -42483,12 +43097,12 @@ __exitcall_ebc_exit:
 	.2byte	0x164
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x12e41
+	.4byte	0x13170
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0xa3
 	.2byte	0x164
-	.4byte	0x12e41
+	.4byte	0x13170
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -42499,7 +43113,7 @@ __exitcall_ebc_exit:
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12e7c
+	.4byte	0x131ab
 	.uleb128 0x63
 	.string	"np"
 	.byte	0xe
@@ -42522,7 +43136,7 @@ __exitcall_ebc_exit:
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12ec8
+	.4byte	0x131f7
 	.uleb128 0x63
 	.string	"np"
 	.byte	0xe
@@ -42549,13 +43163,13 @@ __exitcall_ebc_exit:
 	.2byte	0x1f3
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF3177
 	.byte	0xe
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x12ee0
-	.uleb128 0x7d
+	.4byte	0x1320f
+	.uleb128 0x7e
 	.4byte	.LASF865
 	.byte	0xe
 	.byte	0x83
@@ -42566,7 +43180,7 @@ __exitcall_ebc_exit:
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x12f06
+	.4byte	0x13235
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -42584,7 +43198,7 @@ __exitcall_ebc_exit:
 	.2byte	0x49b
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x12f24
+	.4byte	0x13253
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -42597,7 +43211,7 @@ __exitcall_ebc_exit:
 	.2byte	0x2c5
 	.4byte	0x443
 	.byte	0x3
-	.4byte	0x12f5a
+	.4byte	0x13289
 	.uleb128 0x63
 	.string	"dev"
 	.byte	0x2
@@ -42614,40 +43228,40 @@ __exitcall_ebc_exit:
 	.2byte	0x2c5
 	.4byte	0x31b
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3181
 	.byte	0xf
 	.byte	0xca
 	.4byte	0x33c
 	.byte	0x3
-	.4byte	0x12f76
-	.uleb128 0x7c
+	.4byte	0x132a5
+	.uleb128 0x7d
 	.string	"res"
 	.byte	0xf
 	.byte	0xca
 	.4byte	0xc1a3
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3182
 	.byte	0xcc
 	.byte	0x22
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x12f92
-	.uleb128 0x7c
+	.4byte	0x132c1
+	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xcc
 	.byte	0x22
 	.4byte	0x3091
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3183
 	.byte	0xcd
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x12fae
-	.uleb128 0x7d
+	.4byte	0x132dd
+	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xcd
 	.byte	0x1d
@@ -42659,7 +43273,7 @@ __exitcall_ebc_exit:
 	.2byte	0x23e
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x12fcc
+	.4byte	0x132fb
 	.uleb128 0x64
 	.4byte	.LASF2271
 	.byte	0xd
@@ -42672,7 +43286,7 @@ __exitcall_ebc_exit:
 	.2byte	0x203
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x12ff5
+	.4byte	0x13324
 	.uleb128 0x63
 	.string	"wq"
 	.byte	0xd
@@ -42684,18 +43298,18 @@ __exitcall_ebc_exit:
 	.2byte	0x204
 	.4byte	0x31da
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF3186
 	.byte	0xd
 	.byte	0xdd
 	.byte	0x3
-	.4byte	0x13018
-	.uleb128 0x7d
+	.4byte	0x13347
+	.uleb128 0x7e
 	.4byte	.LASF2271
 	.byte	0xd
 	.byte	0xdd
 	.4byte	0x31da
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF3187
 	.byte	0xd
 	.byte	0xdd
@@ -42707,7 +43321,7 @@ __exitcall_ebc_exit:
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13034
+	.4byte	0x13363
 	.uleb128 0x63
 	.string	"m"
 	.byte	0x51
@@ -42720,100 +43334,100 @@ __exitcall_ebc_exit:
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13050
+	.4byte	0x1337f
 	.uleb128 0x63
 	.string	"m"
 	.byte	0x51
 	.2byte	0x148
 	.4byte	0x74
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3190
 	.byte	0xca
 	.byte	0x8a
 	.4byte	0x29b
 	.byte	0x3
-	.4byte	0x1308c
-	.uleb128 0x7d
+	.4byte	0x133bb
+	.uleb128 0x7e
 	.4byte	.LASF1147
 	.byte	0xca
 	.byte	0x8a
 	.4byte	0x3091
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF3191
 	.byte	0xca
 	.byte	0x8a
 	.4byte	0x2ce
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF3192
 	.byte	0xca
 	.byte	0x8a
 	.4byte	0x29b
-	.uleb128 0x7a
+	.uleb128 0x7b
 	.string	"sz"
 	.byte	0xca
 	.byte	0x8c
 	.4byte	0xc6
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF3193
 	.byte	0xca
 	.byte	0x84
 	.byte	0x3
-	.4byte	0x130bc
-	.uleb128 0x7d
+	.4byte	0x133eb
+	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xca
 	.byte	0x84
 	.4byte	0xc6
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF380
 	.byte	0xca
 	.byte	0x84
 	.4byte	0x29
 	.uleb128 0x66
-	.uleb128 0x78
+	.uleb128 0x79
 	.4byte	.LASF3194
 	.byte	0xca
 	.byte	0x86
 	.4byte	0xc6
 	.byte	0
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF3195
 	.byte	0xca
 	.byte	0x73
 	.byte	0x3
-	.4byte	0x130e8
-	.uleb128 0x7c
+	.4byte	0x13417
+	.uleb128 0x7d
 	.string	"ptr"
 	.byte	0xca
 	.byte	0x73
 	.4byte	0x3091
-	.uleb128 0x7c
+	.uleb128 0x7d
 	.string	"n"
 	.byte	0xca
 	.byte	0x73
 	.4byte	0x29
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF3196
 	.byte	0xca
 	.byte	0x74
 	.4byte	0x29b
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3197
 	.byte	0xca
 	.byte	0x52
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1310e
-	.uleb128 0x7c
+	.4byte	0x1343d
+	.uleb128 0x7d
 	.string	"ti"
 	.byte	0xca
 	.byte	0x52
-	.4byte	0x1310e
-	.uleb128 0x7d
+	.4byte	0x1343d
+	.uleb128 0x7e
 	.4byte	.LASF3198
 	.byte	0xca
 	.byte	0x52
@@ -42822,26 +43436,26 @@ __exitcall_ebc_exit:
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xc1e
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3199
 	.byte	0x5
 	.byte	0xf
 	.4byte	0x2eda
 	.byte	0x3
-	.4byte	0x13130
-	.uleb128 0x78
+	.4byte	0x1345f
+	.uleb128 0x79
 	.4byte	.LASF3200
 	.byte	0x5
 	.byte	0x11
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF3201
 	.byte	0x10
 	.byte	0x1a
 	.byte	0x3
-	.4byte	0x13174
-	.uleb128 0x7d
+	.4byte	0x134a3
+	.uleb128 0x7e
 	.4byte	.LASF959
 	.byte	0x10
 	.byte	0x1a
@@ -42851,7 +43465,7 @@ __exitcall_ebc_exit:
 	.byte	0x8
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x13167
+	.4byte	0x13496
 	.uleb128 0x22
 	.4byte	.LASF3089
 	.byte	0x10
@@ -42861,145 +43475,145 @@ __exitcall_ebc_exit:
 	.string	"__c"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x11fdd
+	.4byte	0x1230c
 	.byte	0
-	.uleb128 0x7a
+	.uleb128 0x7b
 	.string	"__u"
 	.byte	0x10
 	.byte	0x1c
-	.4byte	0x13148
+	.4byte	0x13477
 	.byte	0
 	.byte	0
-	.uleb128 0x7f
+	.uleb128 0x80
 	.4byte	.LASF3273
 	.byte	0x20
 	.2byte	0x126
 	.byte	0x3
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3202
 	.byte	0xce
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13197
-	.uleb128 0x7c
+	.4byte	0x134c7
+	.uleb128 0x7d
 	.string	"n"
 	.byte	0xce
 	.byte	0x22
 	.4byte	0x155
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3203
-	.byte	0x9
+	.byte	0x8
 	.byte	0x9a
 	.4byte	0xdd
 	.byte	0x3
-	.4byte	0x131c9
-	.uleb128 0x7d
+	.4byte	0x134f9
+	.uleb128 0x7e
 	.4byte	.LASF2453
-	.byte	0x9
+	.byte	0x8
 	.byte	0x9a
 	.4byte	0xef
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF877
-	.byte	0x9
+	.byte	0x8
 	.byte	0x9a
 	.4byte	0xc6
-	.uleb128 0x78
+	.uleb128 0x79
 	.4byte	.LASF260
-	.byte	0x9
+	.byte	0x8
 	.byte	0x9c
 	.4byte	0x8b
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3204
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x131ef
-	.uleb128 0x7c
+	.4byte	0x1351f
+	.uleb128 0x7d
 	.string	"nr"
 	.byte	0x7
 	.byte	0x68
 	.4byte	0xc6
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF1147
 	.byte	0x7
 	.byte	0x68
-	.4byte	0x131ef
+	.4byte	0x1351f
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x3a
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF3205
 	.byte	0x11
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x13228
-	.uleb128 0x7c
+	.4byte	0x13558
+	.uleb128 0x7d
 	.string	"i"
 	.byte	0x11
 	.byte	0x2f
 	.4byte	0xc6
-	.uleb128 0x7c
+	.uleb128 0x7d
 	.string	"v"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13228
-	.uleb128 0x7a
+	.4byte	0x13558
+	.uleb128 0x7b
 	.string	"w0"
 	.byte	0x11
 	.byte	0x2f
 	.4byte	0xc6
-	.uleb128 0x7a
+	.uleb128 0x7b
 	.string	"x1"
 	.byte	0x11
 	.byte	0x2f
-	.4byte	0x13228
+	.4byte	0x13558
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x367
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3206
 	.byte	0xcf
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x13248
-	.uleb128 0x7c
+	.4byte	0x13578
+	.uleb128 0x7d
 	.string	"x"
 	.byte	0xcf
 	.byte	0x1b
 	.4byte	0xef
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.4byte	.LASF3207
 	.byte	0xd0
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x13264
-	.uleb128 0x7d
+	.4byte	0x13594
+	.uleb128 0x7e
 	.4byte	.LASF2486
 	.byte	0xd0
 	.byte	0xb
 	.4byte	0x29
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF3208
 	.byte	0xd1
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x13285
-	.uleb128 0x7c
+	.4byte	0x135b5
+	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd1
 	.byte	0xb
-	.4byte	0x13285
-	.uleb128 0x7d
+	.4byte	0x135b5
+	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xd1
 	.byte	0xb
@@ -43007,44 +43621,44 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1328d
-	.uleb128 0x80
+	.4byte	0x135bd
+	.uleb128 0x81
 	.uleb128 0x3
-	.4byte	0x1328b
-	.uleb128 0x7e
+	.4byte	0x135bb
+	.uleb128 0x7f
 	.4byte	.LASF3209
 	.byte	0xd1
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x132b3
-	.uleb128 0x7c
+	.4byte	0x135e3
+	.uleb128 0x7d
 	.string	"p"
 	.byte	0xd1
 	.byte	0x9
-	.4byte	0x13285
-	.uleb128 0x7d
+	.4byte	0x135b5
+	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xd1
 	.byte	0x9
 	.4byte	0x6d
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.4byte	.LASF3210
 	.byte	0xc
 	.byte	0xe4
 	.byte	0x3
-	.4byte	0x132df
-	.uleb128 0x7c
+	.4byte	0x1360f
+	.uleb128 0x7d
 	.string	"p"
 	.byte	0xc
 	.byte	0xe4
-	.4byte	0x132df
-	.uleb128 0x7c
+	.4byte	0x1360f
+	.uleb128 0x7d
 	.string	"res"
 	.byte	0xc
 	.byte	0xe4
 	.4byte	0x443
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.4byte	.LASF984
 	.byte	0xc
 	.byte	0xe4
@@ -43052,481 +43666,481 @@ __exitcall_ebc_exit:
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x1328b
-	.uleb128 0x81
-	.4byte	0x122c0
+	.4byte	0x135bb
+	.uleb128 0x82
+	.4byte	0x125ef
 	.8byte	.LFB2846
 	.8byte	.LFE2846-.LFB2846
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13426
-	.uleb128 0x82
-	.4byte	0x122cd
+	.4byte	0x13755
+	.uleb128 0x71
+	.4byte	0x125fc
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x122d9
-	.4byte	.LLST90
+	.4byte	0x12608
+	.4byte	.LLST99
 	.uleb128 0x6f
-	.4byte	0x122e5
-	.4byte	.LLST91
+	.4byte	0x12614
+	.4byte	.LLST100
 	.uleb128 0x54
-	.4byte	0x122f1
+	.4byte	0x12620
 	.uleb128 0x54
-	.4byte	0x122f1
+	.4byte	0x12620
 	.uleb128 0x54
-	.4byte	0x122f1
+	.4byte	0x12620
 	.uleb128 0x5c
-	.4byte	0x122fd
+	.4byte	0x1262c
 	.uleb128 0x60
-	.4byte	0x12309
+	.4byte	0x12638
 	.uleb128 0x1
 	.byte	0x5c
 	.uleb128 0x5c
-	.4byte	0x12313
+	.4byte	0x12642
 	.uleb128 0x60
-	.4byte	0x1231d
+	.4byte	0x1264c
 	.uleb128 0x1
 	.byte	0x5f
 	.uleb128 0x5c
-	.4byte	0x12329
+	.4byte	0x12658
 	.uleb128 0x5f
-	.4byte	0x12335
-	.4byte	.LLST92
+	.4byte	0x12664
+	.4byte	.LLST101
 	.uleb128 0x5f
-	.4byte	0x12341
-	.4byte	.LLST93
+	.4byte	0x12670
+	.4byte	.LLST102
 	.uleb128 0x5f
-	.4byte	0x1234d
-	.4byte	.LLST94
+	.4byte	0x1267c
+	.4byte	.LLST103
 	.uleb128 0x5f
-	.4byte	0x12359
-	.4byte	.LLST95
+	.4byte	0x12688
+	.4byte	.LLST104
 	.uleb128 0x5f
-	.4byte	0x12365
-	.4byte	.LLST96
+	.4byte	0x12694
+	.4byte	.LLST105
 	.uleb128 0x5f
-	.4byte	0x12371
-	.4byte	.LLST97
+	.4byte	0x126a0
+	.4byte	.LLST106
 	.uleb128 0x60
-	.4byte	0x1237d
+	.4byte	0x126ac
 	.uleb128 0x1
 	.byte	0x55
 	.uleb128 0x5c
-	.4byte	0x12389
+	.4byte	0x126b8
 	.uleb128 0x58
-	.4byte	0x128d7
-	.8byte	.LBB1031
-	.4byte	.Ldebug_ranges0+0x540
+	.4byte	0x12c06
+	.8byte	.LBB1212
+	.4byte	.Ldebug_ranges0+0x700
 	.byte	0x1
 	.2byte	0x1ae
-	.4byte	0x133b1
+	.4byte	0x136e0
 	.uleb128 0x54
-	.4byte	0x128fd
+	.4byte	0x12c2c
 	.uleb128 0x54
-	.4byte	0x128f2
+	.4byte	0x12c21
 	.uleb128 0x54
-	.4byte	0x128e7
+	.4byte	0x12c16
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x128d7
-	.8byte	.LBB1036
-	.4byte	.Ldebug_ranges0+0x590
+	.4byte	0x12c06
+	.8byte	.LBB1217
+	.4byte	.Ldebug_ranges0+0x750
 	.byte	0x1
 	.2byte	0x1af
-	.4byte	0x133d9
+	.4byte	0x13708
 	.uleb128 0x54
-	.4byte	0x128fd
+	.4byte	0x12c2c
 	.uleb128 0x54
-	.4byte	0x128f2
+	.4byte	0x12c21
 	.uleb128 0x54
-	.4byte	0x128e7
+	.4byte	0x12c16
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x128d7
-	.8byte	.LBB1048
-	.4byte	.Ldebug_ranges0+0x600
+	.4byte	0x12c06
+	.8byte	.LBB1229
+	.4byte	.Ldebug_ranges0+0x7c0
 	.byte	0x1
 	.2byte	0x1b0
-	.4byte	0x13401
+	.4byte	0x13730
 	.uleb128 0x54
-	.4byte	0x128fd
+	.4byte	0x12c2c
 	.uleb128 0x54
-	.4byte	0x128f2
+	.4byte	0x12c21
 	.uleb128 0x54
-	.4byte	0x128e7
+	.4byte	0x12c16
 	.byte	0
 	.uleb128 0x5d
-	.4byte	0x128d7
-	.8byte	.LBB1060
-	.4byte	.Ldebug_ranges0+0x670
+	.4byte	0x12c06
+	.8byte	.LBB1241
+	.4byte	.Ldebug_ranges0+0x830
 	.byte	0x1
 	.2byte	0x1b1
 	.uleb128 0x54
-	.4byte	0x128fd
+	.4byte	0x12c2c
 	.uleb128 0x54
-	.4byte	0x128f2
+	.4byte	0x12c21
 	.uleb128 0x54
-	.4byte	0x128e7
+	.4byte	0x12c16
 	.byte	0
 	.byte	0
-	.uleb128 0x81
-	.4byte	0x121ea
+	.uleb128 0x82
+	.4byte	0x12519
 	.8byte	.LFB2847
 	.8byte	.LFE2847-.LFB2847
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x135e5
-	.uleb128 0x82
-	.4byte	0x121f7
+	.4byte	0x13913
+	.uleb128 0x71
+	.4byte	0x12526
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x6f
-	.4byte	0x12203
-	.4byte	.LLST98
+	.4byte	0x12532
+	.4byte	.LLST107
 	.uleb128 0x6f
-	.4byte	0x1220f
-	.4byte	.LLST99
+	.4byte	0x1253e
+	.4byte	.LLST108
 	.uleb128 0x54
-	.4byte	0x1221b
+	.4byte	0x1254a
 	.uleb128 0x54
-	.4byte	0x1221b
+	.4byte	0x1254a
 	.uleb128 0x54
-	.4byte	0x1221b
+	.4byte	0x1254a
 	.uleb128 0x5c
-	.4byte	0x12227
+	.4byte	0x12556
 	.uleb128 0x5f
-	.4byte	0x12233
-	.4byte	.LLST100
+	.4byte	0x12562
+	.4byte	.LLST109
 	.uleb128 0x5f
-	.4byte	0x1223f
-	.4byte	.LLST101
+	.4byte	0x1256e
+	.4byte	.LLST110
 	.uleb128 0x60
-	.4byte	0x1224b
+	.4byte	0x1257a
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x60
-	.4byte	0x12257
+	.4byte	0x12586
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5f
-	.4byte	0x12263
-	.4byte	.LLST102
+	.4byte	0x12592
+	.4byte	.LLST111
 	.uleb128 0x60
-	.4byte	0x1226f
+	.4byte	0x1259e
 	.uleb128 0x1
 	.byte	0x5f
 	.uleb128 0x60
-	.4byte	0x1227b
+	.4byte	0x125aa
 	.uleb128 0x1
 	.byte	0x5b
 	.uleb128 0x60
-	.4byte	0x12287
+	.4byte	0x125b6
 	.uleb128 0x1
 	.byte	0x5c
 	.uleb128 0x5c
-	.4byte	0x12291
+	.4byte	0x125c0
 	.uleb128 0x5f
-	.4byte	0x1229b
-	.4byte	.LLST103
+	.4byte	0x125ca
+	.4byte	.LLST112
 	.uleb128 0x60
-	.4byte	0x122a7
+	.4byte	0x125d6
 	.uleb128 0x1
 	.byte	0x55
 	.uleb128 0x5c
-	.4byte	0x122b3
+	.4byte	0x125e2
 	.uleb128 0x58
-	.4byte	0x1288f
-	.8byte	.LBB1071
-	.4byte	.Ldebug_ranges0+0x6c0
+	.4byte	0x12bbe
+	.8byte	.LBB1252
+	.4byte	.Ldebug_ranges0+0x880
 	.byte	0x1
 	.2byte	0x1d6
-	.4byte	0x13504
+	.4byte	0x13832
 	.uleb128 0x54
-	.4byte	0x128b5
+	.4byte	0x12be4
 	.uleb128 0x54
-	.4byte	0x128aa
+	.4byte	0x12bd9
 	.uleb128 0x54
-	.4byte	0x1289f
+	.4byte	0x12bce
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x6c0
+	.4byte	.Ldebug_ranges0+0x880
 	.uleb128 0x5c
-	.4byte	0x128c0
+	.4byte	0x12bef
 	.uleb128 0x5f
-	.4byte	0x128cb
-	.4byte	.LLST104
+	.4byte	0x12bfa
+	.4byte	.LLST113
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1288f
-	.8byte	.LBB1074
-	.8byte	.LBE1074-.LBB1074
+	.4byte	0x12bbe
+	.8byte	.LBB1255
+	.8byte	.LBE1255-.LBB1255
 	.byte	0x1
 	.2byte	0x1d3
-	.4byte	0x13550
+	.4byte	0x1387e
 	.uleb128 0x54
-	.4byte	0x128b5
+	.4byte	0x12be4
 	.uleb128 0x54
-	.4byte	0x128aa
+	.4byte	0x12bd9
 	.uleb128 0x54
-	.4byte	0x1289f
+	.4byte	0x12bce
 	.uleb128 0x5e
-	.8byte	.LBB1075
-	.8byte	.LBE1075-.LBB1075
+	.8byte	.LBB1256
+	.8byte	.LBE1256-.LBB1256
 	.uleb128 0x5c
-	.4byte	0x128c0
+	.4byte	0x12bef
 	.uleb128 0x5f
-	.4byte	0x128cb
-	.4byte	.LLST105
+	.4byte	0x12bfa
+	.4byte	.LLST114
 	.byte	0
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1288f
-	.8byte	.LBB1076
-	.8byte	.LBE1076-.LBB1076
+	.4byte	0x12bbe
+	.8byte	.LBB1257
+	.8byte	.LBE1257-.LBB1257
 	.byte	0x1
 	.2byte	0x1d4
-	.4byte	0x1359c
+	.4byte	0x138ca
 	.uleb128 0x54
-	.4byte	0x128b5
+	.4byte	0x12be4
 	.uleb128 0x54
-	.4byte	0x128aa
+	.4byte	0x12bd9
 	.uleb128 0x54
-	.4byte	0x1289f
+	.4byte	0x12bce
 	.uleb128 0x5e
-	.8byte	.LBB1077
-	.8byte	.LBE1077-.LBB1077
+	.8byte	.LBB1258
+	.8byte	.LBE1258-.LBB1258
 	.uleb128 0x5c
-	.4byte	0x128c0
+	.4byte	0x12bef
 	.uleb128 0x5f
-	.4byte	0x128cb
-	.4byte	.LLST106
+	.4byte	0x12bfa
+	.4byte	.LLST115
 	.byte	0
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x1288f
-	.8byte	.LBB1078
-	.8byte	.LBE1078-.LBB1078
+	.4byte	0x12bbe
+	.8byte	.LBB1259
+	.8byte	.LBE1259-.LBB1259
 	.byte	0x1
 	.2byte	0x1d5
 	.uleb128 0x54
-	.4byte	0x128b5
+	.4byte	0x12be4
 	.uleb128 0x54
-	.4byte	0x128aa
+	.4byte	0x12bd9
 	.uleb128 0x54
-	.4byte	0x1289f
+	.4byte	0x12bce
 	.uleb128 0x5e
-	.8byte	.LBB1079
-	.8byte	.LBE1079-.LBB1079
+	.8byte	.LBB1260
+	.8byte	.LBE1260-.LBB1260
 	.uleb128 0x5c
-	.4byte	0x128c0
+	.4byte	0x12bef
 	.uleb128 0x5f
-	.4byte	0x128cb
-	.4byte	.LLST107
+	.4byte	0x12bfa
+	.4byte	.LLST116
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x121b2
+	.4byte	0x124e1
 	.8byte	.LFB2848
 	.8byte	.LFE2848-.LFB2848
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x136e8
+	.4byte	0x13a16
 	.uleb128 0x6f
-	.4byte	0x121bf
-	.4byte	.LLST108
+	.4byte	0x124ee
+	.4byte	.LLST117
 	.uleb128 0x54
-	.4byte	0x121cb
+	.4byte	0x124fa
 	.uleb128 0x5c
-	.4byte	0x121d7
+	.4byte	0x12506
 	.uleb128 0x58
-	.4byte	0x129dd
-	.8byte	.LBB1081
-	.4byte	.Ldebug_ranges0+0x6f0
+	.4byte	0x12d0c
+	.8byte	.LBB1262
+	.4byte	.Ldebug_ranges0+0x8b0
 	.byte	0x1
 	.2byte	0x1e4
-	.4byte	0x13666
+	.4byte	0x13994
 	.uleb128 0x54
-	.4byte	0x12a0e
+	.4byte	0x12d3d
 	.uleb128 0x54
-	.4byte	0x12a02
+	.4byte	0x12d31
 	.uleb128 0x54
-	.4byte	0x129f6
+	.4byte	0x12d25
 	.uleb128 0x54
-	.4byte	0x129ea
+	.4byte	0x12d19
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x6f0
+	.4byte	.Ldebug_ranges0+0x8b0
 	.uleb128 0x5c
-	.4byte	0x12a1a
+	.4byte	0x12d49
 	.uleb128 0x5d
-	.4byte	0x12a27
-	.8byte	.LBB1083
-	.4byte	.Ldebug_ranges0+0x740
+	.4byte	0x12d56
+	.8byte	.LBB1264
+	.4byte	.Ldebug_ranges0+0x900
 	.byte	0xa
 	.2byte	0x1af
 	.uleb128 0x54
-	.4byte	0x12a38
+	.4byte	0x12d67
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x1295a
-	.8byte	.LBB1092
-	.4byte	.Ldebug_ranges0+0x770
+	.4byte	0x12c89
+	.8byte	.LBB1273
+	.4byte	.Ldebug_ranges0+0x930
 	.byte	0x1
 	.2byte	0x1e5
-	.4byte	0x13698
+	.4byte	0x139c6
 	.uleb128 0x54
-	.4byte	0x12992
+	.4byte	0x12cc1
 	.uleb128 0x54
-	.4byte	0x12987
+	.4byte	0x12cb6
 	.uleb128 0x54
-	.4byte	0x1297c
+	.4byte	0x12cab
 	.uleb128 0x54
-	.4byte	0x12971
+	.4byte	0x12ca0
 	.uleb128 0x54
-	.4byte	0x12966
+	.4byte	0x12c95
 	.byte	0
 	.uleb128 0x53
-	.4byte	0x1292c
-	.8byte	.LBB1098
-	.8byte	.LBE1098-.LBB1098
+	.4byte	0x12c5b
+	.8byte	.LBB1279
+	.8byte	.LBE1279-.LBB1279
 	.byte	0x1
 	.2byte	0x1e6
-	.4byte	0x136c4
+	.4byte	0x139f2
 	.uleb128 0x54
-	.4byte	0x1294e
+	.4byte	0x12c7d
 	.uleb128 0x54
-	.4byte	0x12943
+	.4byte	0x12c72
 	.uleb128 0x54
-	.4byte	0x12938
+	.4byte	0x12c67
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x12909
-	.8byte	.LBB1100
-	.8byte	.LBE1100-.LBB1100
+	.4byte	0x12c38
+	.8byte	.LBB1281
+	.8byte	.LBE1281-.LBB1281
 	.byte	0x1
 	.2byte	0x1e7
 	.uleb128 0x54
-	.4byte	0x12920
+	.4byte	0x12c4f
 	.uleb128 0x54
-	.4byte	0x12915
+	.4byte	0x12c44
 	.byte	0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x1285d
+	.4byte	0x12b8c
 	.8byte	.LFB2849
 	.8byte	.LFE2849-.LFB2849
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x137a7
+	.4byte	0x13ad5
 	.uleb128 0x6f
-	.4byte	0x1286d
-	.4byte	.LLST111
+	.4byte	0x12b9c
+	.4byte	.LLST120
 	.uleb128 0x6f
-	.4byte	0x12878
-	.4byte	.LLST112
+	.4byte	0x12ba7
+	.4byte	.LLST121
 	.uleb128 0x5c
-	.4byte	0x12883
+	.4byte	0x12bb2
 	.uleb128 0x70
-	.4byte	0x12b75
-	.8byte	.LBB1124
-	.8byte	.LBE1124-.LBB1124
+	.4byte	0x12ea4
+	.8byte	.LBB1305
+	.8byte	.LBE1305-.LBB1305
 	.byte	0x1
 	.byte	0xbc
-	.4byte	0x13749
+	.4byte	0x13a77
 	.uleb128 0x54
-	.4byte	0x12b81
+	.4byte	0x12eb0
 	.uleb128 0x4e
-	.8byte	.LVL402
-	.4byte	0x13b45
+	.8byte	.LVL435
+	.4byte	0x13e73
 	.byte	0
 	.uleb128 0x6e
-	.4byte	0x129b6
-	.8byte	.LBB1126
-	.4byte	.Ldebug_ranges0+0x820
+	.4byte	0x12ce5
+	.8byte	.LBB1307
+	.4byte	.Ldebug_ranges0+0x9e0
 	.byte	0x1
 	.byte	0xbf
-	.4byte	0x1376b
+	.4byte	0x13a99
 	.uleb128 0x54
-	.4byte	0x129d1
+	.4byte	0x12d00
 	.uleb128 0x54
-	.4byte	0x129c6
+	.4byte	0x12cf5
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12b3f
-	.8byte	.LBB1130
-	.8byte	.LBE1130-.LBB1130
+	.4byte	0x12e6e
+	.8byte	.LBB1311
+	.8byte	.LBE1311-.LBB1311
 	.byte	0x1
 	.byte	0xc0
-	.4byte	0x1378c
+	.4byte	0x13aba
 	.uleb128 0x54
-	.4byte	0x12b4b
+	.4byte	0x12e7a
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL401
-	.4byte	0x13afe
+	.8byte	.LVL434
+	.4byte	0x13e2c
 	.uleb128 0x4e
-	.8byte	.LVL405
-	.4byte	0x13882
+	.8byte	.LVL438
+	.4byte	0x13bb0
 	.byte	0
 	.uleb128 0x83
-	.4byte	0x1285d
+	.4byte	0x12b8c
 	.8byte	.LFB2853
 	.8byte	.LFE2853-.LFB2853
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1386a
+	.4byte	0x13b98
 	.uleb128 0x6f
-	.4byte	0x1286d
-	.4byte	.LLST136
+	.4byte	0x12b9c
+	.4byte	.LLST145
 	.uleb128 0x5c
-	.4byte	0x12883
+	.4byte	0x12bb2
 	.uleb128 0x54
-	.4byte	0x12878
+	.4byte	0x12ba7
 	.uleb128 0x6e
-	.4byte	0x12b27
-	.8byte	.LBB1490
-	.4byte	.Ldebug_ranges0+0xd00
+	.4byte	0x12e56
+	.8byte	.LBB1671
+	.4byte	.Ldebug_ranges0+0xec0
 	.byte	0x1
 	.byte	0xc6
-	.4byte	0x137f3
+	.4byte	0x13b21
 	.uleb128 0x54
-	.4byte	0x12b33
+	.4byte	0x12e62
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x1299e
-	.8byte	.LBB1494
-	.8byte	.LBE1494-.LBB1494
+	.4byte	0x12ccd
+	.8byte	.LBB1675
+	.8byte	.LBE1675-.LBB1675
 	.byte	0x1
 	.byte	0xc7
-	.4byte	0x13814
+	.4byte	0x13b42
 	.uleb128 0x54
-	.4byte	0x129aa
+	.4byte	0x12cd9
 	.byte	0
 	.uleb128 0x70
-	.4byte	0x12b57
-	.8byte	.LBB1496
-	.8byte	.LBE1496-.LBB1496
+	.4byte	0x12e86
+	.8byte	.LBB1677
+	.8byte	.LBE1677-.LBB1677
 	.byte	0x1
 	.byte	0xca
-	.4byte	0x13842
+	.4byte	0x13b70
 	.uleb128 0x54
-	.4byte	0x12b63
+	.4byte	0x12e92
 	.uleb128 0x4e
-	.8byte	.LVL591
-	.4byte	0x13ada
+	.8byte	.LVL624
+	.4byte	0x13e08
 	.byte	0
 	.uleb128 0x4e
-	.8byte	.LVL585
-	.4byte	0x13afe
+	.8byte	.LVL618
+	.4byte	0x13e2c
 	.uleb128 0x4e
-	.8byte	.LVL588
-	.4byte	0x13882
+	.8byte	.LVL621
+	.4byte	0x13bb0
 	.uleb128 0x4e
-	.8byte	.LVL592
-	.4byte	0x13882
+	.8byte	.LVL625
+	.4byte	0x13bb0
 	.byte	0
 	.uleb128 0x84
 	.4byte	.LASF3211
@@ -43751,32 +44365,32 @@ __exitcall_ebc_exit:
 	.4byte	.LASF3255
 	.4byte	.LASF3255
 	.byte	0x6
-	.2byte	0x199
+	.2byte	0x19f
 	.uleb128 0x85
 	.4byte	.LASF3256
 	.4byte	.LASF3256
 	.byte	0x6
-	.2byte	0x19f
+	.2byte	0x199
 	.uleb128 0x84
 	.4byte	.LASF3257
 	.4byte	.LASF3257
 	.byte	0xc3
-	.byte	0x24
+	.byte	0x25
 	.uleb128 0x84
 	.4byte	.LASF3258
 	.4byte	.LASF3258
 	.byte	0xc3
-	.byte	0x25
+	.byte	0x2a
 	.uleb128 0x84
 	.4byte	.LASF3259
 	.4byte	.LASF3259
 	.byte	0xc3
-	.byte	0x23
+	.byte	0x24
 	.uleb128 0x84
 	.4byte	.LASF3260
 	.4byte	.LASF3260
 	.byte	0xc3
-	.byte	0x2a
+	.byte	0x23
 	.uleb128 0x84
 	.4byte	.LASF3261
 	.4byte	.LASF3261
@@ -43796,7 +44410,7 @@ __exitcall_ebc_exit:
 	.4byte	.LASF3264
 	.4byte	.LASF3264
 	.byte	0xc4
-	.byte	0x5e
+	.byte	0x64
 	.uleb128 0x84
 	.4byte	.LASF3265
 	.4byte	.LASF3265
@@ -45207,17 +45821,6 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x6b
-	.uleb128 0xb
-	.byte	0x1
-	.uleb128 0x11
-	.uleb128 0x1
-	.uleb128 0x12
-	.uleb128 0x7
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x6c
 	.uleb128 0xa
 	.byte	0
 	.uleb128 0x3
@@ -45230,6 +45833,17 @@ __exitcall_ebc_exit:
 	.uleb128 0x1
 	.byte	0
 	.byte	0
+	.uleb128 0x6c
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
 	.uleb128 0x6d
 	.uleb128 0x1d
 	.byte	0x1
@@ -45289,6 +45903,15 @@ __exitcall_ebc_exit:
 	.byte	0
 	.byte	0
 	.uleb128 0x71
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x72
 	.uleb128 0xa
 	.byte	0
 	.uleb128 0x3
@@ -45299,14 +45922,14 @@ __exitcall_ebc_exit:
 	.uleb128 0x5
 	.byte	0
 	.byte	0
-	.uleb128 0x72
+	.uleb128 0x73
 	.uleb128 0xa
 	.byte	0
 	.uleb128 0x31
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x73
+	.uleb128 0x74
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3f
@@ -45331,7 +45954,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x74
+	.uleb128 0x75
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3f
@@ -45356,7 +45979,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x75
+	.uleb128 0x76
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -45371,7 +45994,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x76
+	.uleb128 0x77
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -45386,7 +46009,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x18
 	.byte	0
 	.byte	0
-	.uleb128 0x77
+	.uleb128 0x78
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -45401,7 +46024,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x78
+	.uleb128 0x79
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -45414,7 +46037,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x79
+	.uleb128 0x7a
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -45429,7 +46052,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x18
 	.byte	0
 	.byte	0
-	.uleb128 0x7a
+	.uleb128 0x7b
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -45442,7 +46065,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x7b
+	.uleb128 0x7c
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -45461,7 +46084,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x7c
+	.uleb128 0x7d
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -45474,7 +46097,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x7d
+	.uleb128 0x7e
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -45487,7 +46110,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x7e
+	.uleb128 0x7f
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -45504,7 +46127,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x7f
+	.uleb128 0x80
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3
@@ -45519,12 +46142,12 @@ __exitcall_ebc_exit:
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x80
+	.uleb128 0x81
 	.uleb128 0x35
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x81
+	.uleb128 0x82
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x31
@@ -45541,15 +46164,6 @@ __exitcall_ebc_exit:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x82
-	.uleb128 0x5
-	.byte	0
-	.uleb128 0x31
-	.uleb128 0x13
-	.uleb128 0x2
-	.uleb128 0x18
-	.byte	0
-	.byte	0
 	.uleb128 0x83
 	.uleb128 0x2e
 	.byte	0x1
@@ -45641,9 +46255,9 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST137:
-	.8byte	.LVL594
-	.8byte	.LVL595
+.LLST146:
+	.8byte	.LVL627
+	.8byte	.LVL628
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -45655,669 +46269,669 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST113:
-	.8byte	.LVL408
-	.8byte	.LVL409
+.LLST122:
+	.8byte	.LVL441
+	.8byte	.LVL442
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST114:
-	.8byte	.LVL412
-	.8byte	.LVL413
+.LLST123:
+	.8byte	.LVL445
+	.8byte	.LVL446
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL457
-	.8byte	.LVL458
+	.8byte	.LVL490
+	.8byte	.LVL491
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL554
-	.8byte	.LVL555
+	.8byte	.LVL587
+	.8byte	.LVL588
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST115:
-	.8byte	.LVL415
-	.8byte	.LVL416
+.LLST124:
+	.8byte	.LVL448
+	.8byte	.LVL449
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL568
-	.8byte	.LVL569
+	.8byte	.LVL601
+	.8byte	.LVL602
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST116:
-	.8byte	.LVL417
-	.8byte	.LVL459
+.LLST125:
+	.8byte	.LVL450
+	.8byte	.LVL492
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL462
-	.8byte	.LVL554
+	.8byte	.LVL495
+	.8byte	.LVL587
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL555
-	.8byte	.LVL561
+	.8byte	.LVL588
+	.8byte	.LVL594
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL562
-	.8byte	.LVL563
+	.8byte	.LVL595
+	.8byte	.LVL596
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL567
-	.8byte	.LVL568
+	.8byte	.LVL600
+	.8byte	.LVL601
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL571
+	.8byte	.LVL604
 	.8byte	.LFE2840
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST117:
-	.8byte	.LVL438
-	.8byte	.LVL450
+.LLST126:
+	.8byte	.LVL471
+	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL457
-	.8byte	.LVL460
+	.8byte	.LVL490
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL462
-	.8byte	.LVL465
+	.8byte	.LVL495
+	.8byte	.LVL498
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL536
-	.8byte	.LVL537
+	.8byte	.LVL569
+	.8byte	.LVL570
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL562
-	.8byte	.LVL563
+	.8byte	.LVL595
+	.8byte	.LVL596
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL573
-	.8byte	.LVL574
+	.8byte	.LVL606
+	.8byte	.LVL607
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST118:
-	.8byte	.LVL450
-	.8byte	.LVL456
+.LLST127:
+	.8byte	.LVL483
+	.8byte	.LVL489
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL457
-	.8byte	.LVL460
+	.8byte	.LVL490
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL470
-	.8byte	.LVL471
+	.8byte	.LVL503
+	.8byte	.LVL504
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL567
-	.8byte	.LVL568
+	.8byte	.LVL600
+	.8byte	.LVL601
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL573
-	.8byte	.LVL574
+	.8byte	.LVL606
+	.8byte	.LVL607
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST119:
-	.8byte	.LVL451
-	.8byte	.LVL452-1
+.LLST128:
+	.8byte	.LVL484
+	.8byte	.LVL485-1
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL453
-	.8byte	.LVL454
+	.8byte	.LVL486
+	.8byte	.LVL487
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL567
-	.8byte	.LVL568
+	.8byte	.LVL600
+	.8byte	.LVL601
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST120:
-	.8byte	.LVL471
-	.8byte	.LVL472-1
+.LLST129:
+	.8byte	.LVL504
+	.8byte	.LVL505-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST121:
-	.8byte	.LVL476
-	.8byte	.LVL479
+.LLST130:
+	.8byte	.LVL509
+	.8byte	.LVL512
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST122:
-	.8byte	.LVL477
-	.8byte	.LVL478
+.LLST131:
+	.8byte	.LVL510
+	.8byte	.LVL511
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST123:
-	.8byte	.LVL457
-	.8byte	.LVL460
+.LLST132:
+	.8byte	.LVL490
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL481
-	.8byte	.LVL489
+	.8byte	.LVL514
+	.8byte	.LVL522
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL556
-	.8byte	.LVL558
+	.8byte	.LVL589
+	.8byte	.LVL591
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL558
-	.8byte	.LVL559
+	.8byte	.LVL591
+	.8byte	.LVL592
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL559
-	.8byte	.LVL561
+	.8byte	.LVL592
+	.8byte	.LVL594
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL573
-	.8byte	.LVL574
+	.8byte	.LVL606
+	.8byte	.LVL607
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST124:
-	.8byte	.LVL484
-	.8byte	.LVL487
+.LLST133:
+	.8byte	.LVL517
+	.8byte	.LVL520
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST125:
-	.8byte	.LVL485
-	.8byte	.LVL486
+.LLST134:
+	.8byte	.LVL518
+	.8byte	.LVL519
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST126:
-	.8byte	.LVL488
-	.8byte	.LVL490-1
+.LLST135:
+	.8byte	.LVL521
+	.8byte	.LVL523-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST127:
-	.8byte	.LVL457
-	.8byte	.LVL462
+.LLST136:
+	.8byte	.LVL490
+	.8byte	.LVL495
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL495
-	.8byte	.LVL536
+	.8byte	.LVL528
+	.8byte	.LVL569
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL537
-	.8byte	.LVL546
+	.8byte	.LVL570
+	.8byte	.LVL579
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
-	.8byte	.LVL546
-	.8byte	.LVL547
+	.8byte	.LVL579
+	.8byte	.LVL580
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL573
-	.8byte	.LVL580
+	.8byte	.LVL606
+	.8byte	.LVL613
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -28
 	.8byte	0
 	.8byte	0
-.LLST128:
-	.8byte	.LVL457
-	.8byte	.LVL462
+.LLST137:
+	.8byte	.LVL490
+	.8byte	.LVL495
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL495
-	.8byte	.LVL533
+	.8byte	.LVL528
+	.8byte	.LVL566
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL533
-	.8byte	.LVL534
+	.8byte	.LVL566
+	.8byte	.LVL567
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL537
-	.8byte	.LVL550
+	.8byte	.LVL570
+	.8byte	.LVL583
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
-	.8byte	.LVL573
+	.8byte	.LVL606
 	.8byte	.LFE2840
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 -24
 	.8byte	0
 	.8byte	0
-.LLST129:
-	.8byte	.LVL457
-	.8byte	.LVL460
+.LLST138:
+	.8byte	.LVL490
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL501
-	.8byte	.LVL509
+	.8byte	.LVL534
+	.8byte	.LVL542
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL513
-	.8byte	.LVL526
+	.8byte	.LVL546
+	.8byte	.LVL559
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL530
-	.8byte	.LVL536
+	.8byte	.LVL563
+	.8byte	.LVL569
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL549
-	.8byte	.LVL550
+	.8byte	.LVL582
+	.8byte	.LVL583
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL573
-	.8byte	.LVL577
+	.8byte	.LVL606
+	.8byte	.LVL610
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST130:
-	.8byte	.LVL457
-	.8byte	.LVL461
+.LLST139:
+	.8byte	.LVL490
+	.8byte	.LVL494
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL506
-	.8byte	.LVL536
+	.8byte	.LVL539
+	.8byte	.LVL569
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL537
-	.8byte	.LVL542
+	.8byte	.LVL570
+	.8byte	.LVL575
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL573
-	.8byte	.LVL577
+	.8byte	.LVL606
+	.8byte	.LVL610
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL581
+	.8byte	.LVL614
 	.8byte	.LFE2840
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST131:
-	.8byte	.LVL457
-	.8byte	.LVL460
+.LLST140:
+	.8byte	.LVL490
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL497
-	.8byte	.LVL503
+	.8byte	.LVL530
+	.8byte	.LVL536
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL504
-	.8byte	.LVL507
+	.8byte	.LVL537
+	.8byte	.LVL540
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL513
-	.8byte	.LVL522
+	.8byte	.LVL546
+	.8byte	.LVL555
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL542
-	.8byte	.LVL550
+	.8byte	.LVL575
+	.8byte	.LVL583
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL573
-	.8byte	.LVL574
+	.8byte	.LVL606
+	.8byte	.LVL607
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL577
-	.8byte	.LVL582
+	.8byte	.LVL610
+	.8byte	.LVL615
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST132:
-	.8byte	.LVL457
-	.8byte	.LVL461
+.LLST141:
+	.8byte	.LVL490
+	.8byte	.LVL494
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL499
-	.8byte	.LVL506
+	.8byte	.LVL532
+	.8byte	.LVL539
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL511
-	.8byte	.LVL530
+	.8byte	.LVL544
+	.8byte	.LVL563
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL537
-	.8byte	.LVL550
+	.8byte	.LVL570
+	.8byte	.LVL583
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL573
-	.8byte	.LVL574
+	.8byte	.LVL606
+	.8byte	.LVL607
 	.2byte	0x1
 	.byte	0x6c
-	.8byte	.LVL577
-	.8byte	.LVL581
+	.8byte	.LVL610
+	.8byte	.LVL614
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST133:
-	.8byte	.LVL457
-	.8byte	.LVL461
+.LLST142:
+	.8byte	.LVL490
+	.8byte	.LVL494
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL502
-	.8byte	.LVL536
+	.8byte	.LVL535
+	.8byte	.LVL569
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL537
-	.8byte	.LVL542
+	.8byte	.LVL570
+	.8byte	.LVL575
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL545
-	.8byte	.LVL550
+	.8byte	.LVL578
+	.8byte	.LVL583
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL573
-	.8byte	.LVL577
+	.8byte	.LVL606
+	.8byte	.LVL610
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL577
-	.8byte	.LVL578
+	.8byte	.LVL610
+	.8byte	.LVL611
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL578
+	.8byte	.LVL611
 	.8byte	.LFE2840
 	.2byte	0x1
 	.byte	0x6b
 	.8byte	0
 	.8byte	0
-.LLST134:
-	.8byte	.LVL457
-	.8byte	.LVL460
+.LLST143:
+	.8byte	.LVL490
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL503
 	.8byte	.LVL536
+	.8byte	.LVL569
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL537
-	.8byte	.LVL542
+	.8byte	.LVL570
+	.8byte	.LVL575
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL573
-	.8byte	.LVL574
+	.8byte	.LVL606
+	.8byte	.LVL607
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL574
-	.8byte	.LVL575
+	.8byte	.LVL607
+	.8byte	.LVL608
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL575
-	.8byte	.LVL577
+	.8byte	.LVL608
+	.8byte	.LVL610
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL582
+	.8byte	.LVL615
 	.8byte	.LFE2840
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST135:
-	.8byte	.LVL457
-	.8byte	.LVL460
+.LLST144:
+	.8byte	.LVL490
+	.8byte	.LVL493
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL511
-	.8byte	.LVL522
+	.8byte	.LVL544
+	.8byte	.LVL555
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL526
-	.8byte	.LVL530
+	.8byte	.LVL559
+	.8byte	.LVL563
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL537
-	.8byte	.LVL539
+	.8byte	.LVL570
+	.8byte	.LVL572
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL573
-	.8byte	.LVL574
+	.8byte	.LVL606
+	.8byte	.LVL607
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST66:
-	.8byte	.LVL232
-	.8byte	.LVL233
+.LLST75:
+	.8byte	.LVL265
+	.8byte	.LVL266
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST67:
-	.8byte	.LVL232
-	.8byte	.LVL234
+.LLST76:
+	.8byte	.LVL265
+	.8byte	.LVL267
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST68:
-	.8byte	.LVL232
-	.8byte	.LVL235
+.LLST77:
+	.8byte	.LVL265
+	.8byte	.LVL268
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL235
-	.8byte	.LVL236-1
+	.8byte	.LVL268
+	.8byte	.LVL269-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST69:
-	.8byte	.LVL237
-	.8byte	.LVL238
+.LLST78:
+	.8byte	.LVL270
+	.8byte	.LVL271
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST70:
-	.8byte	.LVL237
-	.8byte	.LVL239
+.LLST79:
+	.8byte	.LVL270
+	.8byte	.LVL272
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST71:
-	.8byte	.LVL237
-	.8byte	.LVL240
+.LLST80:
+	.8byte	.LVL270
+	.8byte	.LVL273
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL240
-	.8byte	.LVL241-1
+	.8byte	.LVL273
+	.8byte	.LVL274-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST81:
-	.8byte	.LVL262
-	.8byte	.LVL263
+.LLST90:
+	.8byte	.LVL295
+	.8byte	.LVL296
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST82:
-	.8byte	.LVL262
-	.8byte	.LVL264
+.LLST91:
+	.8byte	.LVL295
+	.8byte	.LVL297
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST83:
-	.8byte	.LVL262
-	.8byte	.LVL266
+.LLST92:
+	.8byte	.LVL295
+	.8byte	.LVL299
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL266
-	.8byte	.LVL271
+	.8byte	.LVL299
+	.8byte	.LVL304
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL272
+	.8byte	.LVL305
 	.8byte	.LFE2831
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST84:
-	.8byte	.LVL262
-	.8byte	.LVL267-1
+.LLST93:
+	.8byte	.LVL295
+	.8byte	.LVL300-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL267-1
-	.8byte	.LVL270
+	.8byte	.LVL300-1
+	.8byte	.LVL303
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL272
-	.8byte	.LVL273
+	.8byte	.LVL305
+	.8byte	.LVL306
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL275
-	.8byte	.LVL276
+	.8byte	.LVL308
+	.8byte	.LVL309
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST85:
-	.8byte	.LVL265
-	.8byte	.LVL271
+.LLST94:
+	.8byte	.LVL298
+	.8byte	.LVL304
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL272
+	.8byte	.LVL305
 	.8byte	.LFE2831
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST86:
-	.8byte	.LVL268
-	.8byte	.LVL272
+.LLST95:
+	.8byte	.LVL301
+	.8byte	.LVL305
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
-	.8byte	.LVL275
+	.8byte	.LVL308
 	.8byte	.LFE2831
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
 	.8byte	0
 	.8byte	0
-.LLST72:
-	.8byte	.LVL242
-	.8byte	.LVL243
+.LLST81:
+	.8byte	.LVL275
+	.8byte	.LVL276
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST73:
-	.8byte	.LVL242
-	.8byte	.LVL244
+.LLST82:
+	.8byte	.LVL275
+	.8byte	.LVL277
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST74:
-	.8byte	.LVL242
-	.8byte	.LVL245-1
+.LLST83:
+	.8byte	.LVL275
+	.8byte	.LVL278-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL245-1
-	.8byte	.LVL247
+	.8byte	.LVL278-1
+	.8byte	.LVL280
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST75:
-	.8byte	.LVL248
-	.8byte	.LVL249
+.LLST84:
+	.8byte	.LVL281
+	.8byte	.LVL282
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST76:
-	.8byte	.LVL248
-	.8byte	.LVL250
+.LLST85:
+	.8byte	.LVL281
+	.8byte	.LVL283
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST77:
-	.8byte	.LVL248
-	.8byte	.LVL251
+.LLST86:
+	.8byte	.LVL281
+	.8byte	.LVL284
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL251
-	.8byte	.LVL254
+	.8byte	.LVL284
+	.8byte	.LVL287
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL255
+	.8byte	.LVL288
 	.8byte	.LFE2829
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST78:
-	.8byte	.LVL257
-	.8byte	.LVL258
+.LLST87:
+	.8byte	.LVL290
+	.8byte	.LVL291
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST79:
-	.8byte	.LVL257
-	.8byte	.LVL259
+.LLST88:
+	.8byte	.LVL290
+	.8byte	.LVL292
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST80:
-	.8byte	.LVL257
-	.8byte	.LVL260
+.LLST89:
+	.8byte	.LVL290
+	.8byte	.LVL293
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL260
-	.8byte	.LVL261-1
+	.8byte	.LVL293
+	.8byte	.LVL294-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST87:
-	.8byte	.LVL279
-	.8byte	.LVL280-1
+.LLST96:
+	.8byte	.LVL312
+	.8byte	.LVL313-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST88:
-	.8byte	.LVL279
-	.8byte	.LVL280-1
+.LLST97:
+	.8byte	.LVL312
+	.8byte	.LVL313-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST89:
-	.8byte	.LVL279
-	.8byte	.LVL280-1
+.LLST98:
+	.8byte	.LVL312
+	.8byte	.LVL313-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL280-1
-	.8byte	.LVL282
+	.8byte	.LVL313-1
+	.8byte	.LVL315
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -46356,557 +46970,692 @@ __exitcall_ebc_exit:
 	.8byte	0
 .LLST17:
 	.8byte	.LVL47
-	.8byte	.LVL50
+	.8byte	.LVL49-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL63
+	.8byte	.LVL64
 	.2byte	0x1
 	.byte	0x51
 	.8byte	.LVL66
 	.8byte	.LVL67
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL69
-	.8byte	.LVL70-1
+	.8byte	.LVL72
+	.8byte	.LVL74
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL80
-	.8byte	.LVL82
+	.8byte	.LVL94
+	.8byte	.LVL95-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL92
-	.8byte	.LVL93-1
+	.8byte	.LVL96
+	.8byte	.LVL98
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL119
-	.8byte	.LVL121
+	.8byte	.LVL120
+	.8byte	.LVL121-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL135
-	.8byte	.LVL137
+	.8byte	.LVL136
+	.8byte	.LVL138
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL159
-	.8byte	.LVL160
+	.8byte	.LVL150
+	.8byte	.LVL151
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL162
+	.8byte	.LVL153
+	.8byte	.LVL154-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL155
+	.8byte	.LVL156-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL161
 	.8byte	.LVL163
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL165
-	.8byte	.LVL166
+	.8byte	.LVL172
+	.8byte	.LVL173
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL175
+	.8byte	.LVL176-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST18:
 	.8byte	.LVL47
-	.8byte	.LVL65
+	.8byte	.LVL63
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL66
-	.8byte	.LVL149
+	.8byte	.LVL63
+	.8byte	.LVL71
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL156
-	.8byte	.LVL169
+	.8byte	.LVL72
+	.8byte	.LVL87
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL171
-	.8byte	.LVL187
+	.8byte	.LVL93
+	.8byte	.LVL218
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL188
+	.8byte	.LVL220
 	.8byte	.LFE2824
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST62:
-	.8byte	.LVL62
-	.8byte	.LVL63
+.LLST33:
+	.8byte	.LVL68
+	.8byte	.LVL69
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL152
-	.8byte	.LVL153-1
+	.8byte	.LVL90
+	.8byte	.LVL91-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL93
+	.8byte	.LVL94
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST19:
-	.8byte	.LVL51
-	.8byte	.LVL53
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL113
-	.8byte	.LVL114
+	.8byte	.LVL56
+	.8byte	.LVL58
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL115
-	.8byte	.LVL116
+	.8byte	.LVL59
+	.8byte	.LVL60
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST20:
-	.8byte	.LVL52
-	.8byte	.LVL54
+	.8byte	.LVL59
+	.8byte	.LVL61
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL90
-	.8byte	.LVL91
+	.8byte	.LVL112
+	.8byte	.LVL114
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST21:
-	.8byte	.LVL50
-	.8byte	.LVL55
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL63
-	.8byte	.LVL64
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL90
-	.8byte	.LVL92
+	.8byte	.LVL53
+	.8byte	.LVL62-1
 	.2byte	0x1
 	.byte	0x51
+	.8byte	.LVL112
 	.8byte	.LVL113
-	.8byte	.LVL116
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST22:
-	.8byte	.LVL49
-	.8byte	.LVL51
+	.8byte	.LVL52
+	.8byte	.LVL55
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL113
-	.8byte	.LVL114
+	.byte	0x52
+	.8byte	.LVL57
+	.8byte	.LVL62-1
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x52
+	.8byte	.LVL112
+	.8byte	.LVL116
+	.2byte	0x1
+	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST23:
-	.8byte	.LVL57
-	.8byte	.LVL59-1
+	.8byte	.LVL117
+	.8byte	.LVL119-1
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST24:
-	.8byte	.LVL56
-	.8byte	.LVL58
+	.8byte	.LVL115
+	.8byte	.LVL118
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST25:
-	.8byte	.LVL55
-	.8byte	.LVL57
+	.8byte	.LVL114
+	.8byte	.LVL117
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST26:
 	.8byte	.LVL75
-	.8byte	.LVL77
+	.8byte	.LVL76
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL116
-	.8byte	.LVL117
+	.8byte	.LVL77
+	.8byte	.LVL78
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL118
-	.8byte	.LVL119
+	.8byte	.LVL189
+	.8byte	.LVL190
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST27:
-	.8byte	.LVL76
-	.8byte	.LVL78
+	.8byte	.LVL68
+	.8byte	.LVL69
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL179
-	.8byte	.LVL181
+	.8byte	.LVL77
+	.8byte	.LVL79
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL217
+	.8byte	.LVL218
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST28:
-	.8byte	.LVL73
-	.8byte	.LVL79-1
+	.8byte	.LVL68
+	.8byte	.LVL70
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL116
-	.8byte	.LVL119
+	.8byte	.LVL74
+	.8byte	.LVL80
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL179
-	.8byte	.LVL180
+	.8byte	.LVL188
+	.8byte	.LVL190
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL217
+	.8byte	.LVL218
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST29:
-	.8byte	.LVL72
-	.8byte	.LVL74
-	.2byte	0x1
-	.byte	0x52
+	.8byte	.LVL73
 	.8byte	.LVL76
-	.8byte	.LVL79-1
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL116
-	.8byte	.LVL119
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL179
-	.8byte	.LVL183
+	.byte	0x50
+	.8byte	.LVL188
+	.8byte	.LVL189
 	.2byte	0x1
-	.byte	0x52
+	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST30:
-	.8byte	.LVL184
-	.8byte	.LVL186-1
+	.8byte	.LVL82
+	.8byte	.LVL84-1
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST31:
-	.8byte	.LVL182
-	.8byte	.LVL185
+	.8byte	.LVL81
+	.8byte	.LVL83
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST32:
-	.8byte	.LVL181
-	.8byte	.LVL184
+	.8byte	.LVL80
+	.8byte	.LVL82
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST33:
-	.8byte	.LVL85
-	.8byte	.LVL87
+.LLST34:
+	.8byte	.LVL99
+	.8byte	.LVL100
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL110
-	.8byte	.LVL111
+	.8byte	.LVL101
+	.8byte	.LVL102
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL112
-	.8byte	.LVL113
+	.8byte	.LVL187
+	.8byte	.LVL188
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST34:
-	.8byte	.LVL86
-	.8byte	.LVL88
+.LLST35:
+	.8byte	.LVL68
+	.8byte	.LVL69
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL171
-	.8byte	.LVL173
+	.8byte	.LVL101
+	.8byte	.LVL103
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL217
+	.8byte	.LVL218
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST35:
-	.8byte	.LVL83
-	.8byte	.LVL89
+.LLST36:
+	.8byte	.LVL68
+	.8byte	.LVL70
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL110
-	.8byte	.LVL113
+	.8byte	.LVL98
+	.8byte	.LVL104
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL171
-	.8byte	.LVL172
+	.8byte	.LVL186
+	.8byte	.LVL188
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL217
+	.8byte	.LVL218
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST36:
-	.8byte	.LVL81
-	.8byte	.LVL84
+.LLST37:
+	.8byte	.LVL97
+	.8byte	.LVL100
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL86
-	.8byte	.LVL90-1
+	.byte	0x50
+	.8byte	.LVL186
+	.8byte	.LVL187
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST38:
+	.8byte	.LVL106
+	.8byte	.LVL108-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST39:
+	.8byte	.LVL105
+	.8byte	.LVL107
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST40:
+	.8byte	.LVL104
+	.8byte	.LVL106
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST41:
+	.8byte	.LVL125
+	.8byte	.LVL126
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL127
+	.8byte	.LVL128
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL200
+	.8byte	.LVL201
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST42:
+	.8byte	.LVL68
+	.8byte	.LVL69
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL127
+	.8byte	.LVL130
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST43:
+	.8byte	.LVL68
+	.8byte	.LVL70
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL124
+	.8byte	.LVL129
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL198
+	.8byte	.LVL201
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST44:
+	.8byte	.LVL68
+	.8byte	.LVL70
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL110
-	.8byte	.LVL113
+	.8byte	.LVL123
+	.8byte	.LVL132
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL171
-	.8byte	.LVL175
+	.8byte	.LVL198
+	.8byte	.LVL199
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST37:
-	.8byte	.LVL176
-	.8byte	.LVL178-1
+.LLST45:
+	.8byte	.LVL133
+	.8byte	.LVL135-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST38:
-	.8byte	.LVL174
-	.8byte	.LVL177
+.LLST46:
+	.8byte	.LVL131
+	.8byte	.LVL134
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST39:
-	.8byte	.LVL173
-	.8byte	.LVL176
+.LLST47:
+	.8byte	.LVL130
+	.8byte	.LVL133
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST40:
-	.8byte	.LVL97
-	.8byte	.LVL99
+.LLST48:
+	.8byte	.LVL147
+	.8byte	.LVL148
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL100
-	.8byte	.LVL101
+	.byte	0x50
+	.8byte	.LVL222
+	.8byte	.LVL224
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x50
+	.8byte	.LVL227
+	.8byte	.LFE2824
+	.2byte	0x1
+	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST41:
-	.8byte	.LVL63
-	.8byte	.LVL64
+.LLST49:
+	.8byte	.LVL139
+	.8byte	.LVL140
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL141
+	.8byte	.LVL142
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL194
+	.8byte	.LVL195
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST50:
+	.8byte	.LVL141
+	.8byte	.LVL147-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL221
+	.8byte	.LVL222
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL222
+	.8byte	.LVL225-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL228
+	.8byte	.LFE2824
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST51:
+	.8byte	.LVL138
+	.8byte	.LVL143
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL100
-	.8byte	.LVL103
+	.8byte	.LVL193
+	.8byte	.LVL195
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL221
+	.8byte	.LVL223
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST42:
-	.8byte	.LVL96
-	.8byte	.LVL102
+.LLST52:
+	.8byte	.LVL137
+	.8byte	.LVL140
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL193
+	.8byte	.LVL194
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST43:
-	.8byte	.LVL95
-	.8byte	.LVL97
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL98
-	.8byte	.LVL99
+.LLST53:
+	.8byte	.LVL145
+	.8byte	.LVL147-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST44:
-	.8byte	.LVL107
-	.8byte	.LVL109-1
+.LLST54:
+	.8byte	.LVL144
+	.8byte	.LVL146
 	.2byte	0x1
-	.byte	0x53
+	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST45:
-	.8byte	.LVL105
-	.8byte	.LVL108
+.LLST55:
+	.8byte	.LVL143
+	.8byte	.LVL145
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST46:
-	.8byte	.LVL104
-	.8byte	.LVL106
+.LLST56:
+	.8byte	.LVL54
+	.8byte	.LVL60
 	.2byte	0x1
-	.byte	0x52
+	.byte	0x51
+	.8byte	.LVL160
+	.8byte	.LVL161
+	.2byte	0x1
+	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST47:
-	.8byte	.LVL129
-	.8byte	.LVL130
+.LLST57:
+	.8byte	.LVL54
+	.8byte	.LVL55
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL189
-	.8byte	.LVL191
+	.byte	0x52
+	.8byte	.LVL57
+	.8byte	.LVL62-1
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL194
-	.8byte	.LFE2824
+	.byte	0x52
+	.8byte	.LVL112
+	.8byte	.LVL116
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x52
+	.8byte	.LVL159
+	.8byte	.LVL161
+	.2byte	0x1
+	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST48:
-	.8byte	.LVL122
-	.8byte	.LVL124
+.LLST58:
+	.8byte	.LVL165
+	.8byte	.LVL166
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL132
-	.8byte	.LVL133
+	.8byte	.LVL167
+	.8byte	.LVL168
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL134
-	.8byte	.LVL135
+	.8byte	.LVL192
+	.8byte	.LVL193
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST49:
-	.8byte	.LVL123
-	.8byte	.LVL129-1
+.LLST59:
+	.8byte	.LVL167
+	.8byte	.LVL169
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL188
-	.8byte	.LVL189
+	.8byte	.LVL201
+	.8byte	.LVL203
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL189
-	.8byte	.LVL192-1
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL195
-	.8byte	.LFE2824
-	.2byte	0x1
-	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST50:
-	.8byte	.LVL121
-	.8byte	.LVL125
+.LLST60:
+	.8byte	.LVL164
+	.8byte	.LVL170
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL132
-	.8byte	.LVL135
+	.8byte	.LVL190
+	.8byte	.LVL193
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL188
-	.8byte	.LVL190
+	.8byte	.LVL201
+	.8byte	.LVL202
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST51:
-	.8byte	.LVL120
-	.8byte	.LVL122
+.LLST61:
+	.8byte	.LVL162
+	.8byte	.LVL171-1
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL132
-	.8byte	.LVL133
+	.byte	0x52
+	.8byte	.LVL190
+	.8byte	.LVL191
 	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST52:
-	.8byte	.LVL127
-	.8byte	.LVL129-1
+	.byte	0x52
+	.8byte	.LVL201
+	.8byte	.LVL205
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST53:
-	.8byte	.LVL126
-	.8byte	.LVL128
+.LLST62:
+	.8byte	.LVL206
+	.8byte	.LVL208-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST54:
-	.8byte	.LVL125
-	.8byte	.LVL127
+.LLST63:
+	.8byte	.LVL204
+	.8byte	.LVL207
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST55:
-	.8byte	.LVL138
-	.8byte	.LVL140
+.LLST64:
+	.8byte	.LVL203
+	.8byte	.LVL206
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL156
-	.8byte	.LVL157
+	.8byte	0
+	.8byte	0
+.LLST65:
+	.8byte	.LVL180
+	.8byte	.LVL181
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL158
-	.8byte	.LVL159
+	.8byte	.LVL182
+	.8byte	.LVL183
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL197
+	.8byte	.LVL198
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST56:
-	.8byte	.LVL90
-	.8byte	.LVL91
+.LLST66:
+	.8byte	.LVL182
+	.8byte	.LVL184
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL139
-	.8byte	.LVL141
+	.8byte	.LVL209
+	.8byte	.LVL211
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST57:
-	.8byte	.LVL63
-	.8byte	.LVL64
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL90
-	.8byte	.LVL92
+.LLST67:
+	.8byte	.LVL179
+	.8byte	.LVL185-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL137
-	.8byte	.LVL142
+	.8byte	.LVL195
+	.8byte	.LVL198
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL156
-	.8byte	.LVL159
+	.8byte	.LVL209
+	.8byte	.LVL210
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST58:
-	.8byte	.LVL136
-	.8byte	.LVL138
+.LLST68:
+	.8byte	.LVL178
+	.8byte	.LVL185-1
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL156
-	.8byte	.LVL157
+	.byte	0x52
+	.8byte	.LVL195
+	.8byte	.LVL196
 	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST59:
-	.8byte	.LVL144
-	.8byte	.LVL146-1
+	.byte	0x52
+	.8byte	.LVL209
+	.8byte	.LVL213
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST60:
-	.8byte	.LVL143
-	.8byte	.LVL145
+.LLST69:
+	.8byte	.LVL214
+	.8byte	.LVL216-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST61:
-	.8byte	.LVL142
-	.8byte	.LVL144
+.LLST70:
+	.8byte	.LVL212
+	.8byte	.LVL215
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST63:
-	.8byte	.LVL206
-	.8byte	.LVL207-1
+.LLST71:
+	.8byte	.LVL211
+	.8byte	.LVL214
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST72:
+	.8byte	.LVL239
+	.8byte	.LVL240-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -46918,446 +47667,446 @@ __exitcall_ebc_exit:
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST145:
-	.8byte	.LVL618
-	.8byte	.LVL619
+.LLST154:
+	.8byte	.LVL651
+	.8byte	.LVL652
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST146:
-	.8byte	.LVL620
-	.8byte	.LVL627
+.LLST155:
+	.8byte	.LVL653
+	.8byte	.LVL660
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL631
+	.8byte	.LVL664
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST147:
-	.8byte	.LVL622
-	.8byte	.LVL630
+.LLST156:
+	.8byte	.LVL655
+	.8byte	.LVL663
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL631
-	.8byte	.LVL632
+	.8byte	.LVL664
+	.8byte	.LVL665
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL632
-	.8byte	.LVL642
+	.8byte	.LVL665
+	.8byte	.LVL675
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL642
-	.8byte	.LVL643
+	.8byte	.LVL675
+	.8byte	.LVL676
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL643
-	.8byte	.LVL650
+	.8byte	.LVL676
+	.8byte	.LVL683
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL650
-	.8byte	.LVL651
+	.8byte	.LVL683
+	.8byte	.LVL684
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL651
-	.8byte	.LVL674
+	.8byte	.LVL684
+	.8byte	.LVL699
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL674
-	.8byte	.LVL675
+	.8byte	.LVL699
+	.8byte	.LVL700
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL675
-	.8byte	.LVL714
+	.8byte	.LVL700
+	.8byte	.LVL748
 	.2byte	0x1
 	.byte	0x6b
-	.8byte	.LVL714
-	.8byte	.LVL715
+	.8byte	.LVL748
+	.8byte	.LVL749
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL715
+	.8byte	.LVL749
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x6b
 	.8byte	0
 	.8byte	0
-.LLST148:
-	.8byte	.LVL622
-	.8byte	.LVL628
+.LLST157:
+	.8byte	.LVL655
+	.8byte	.LVL661
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL631
-	.8byte	.LVL697
+	.8byte	.LVL664
+	.8byte	.LVL731
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL697
-	.8byte	.LVL698
+	.8byte	.LVL731
+	.8byte	.LVL732
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL698
+	.8byte	.LVL732
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST149:
-	.8byte	.LVL621
-	.8byte	.LVL629
+.LLST158:
+	.8byte	.LVL654
+	.8byte	.LVL662
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL631
+	.8byte	.LVL664
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
-.LLST150:
-	.8byte	.LVL622
-	.8byte	.LVL629
+.LLST159:
+	.8byte	.LVL655
+	.8byte	.LVL662
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL631
-	.8byte	.LVL731
+	.8byte	.LVL664
+	.8byte	.LVL765
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL737
+	.8byte	.LVL771
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST163:
-	.8byte	.LVL711
-	.8byte	.LVL712
+.LLST172:
+	.8byte	.LVL745
+	.8byte	.LVL746
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL733
-	.8byte	.LVL734-1
+	.8byte	.LVL767
+	.8byte	.LVL768-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST161:
-	.8byte	.LVL702
-	.8byte	.LVL703
+.LLST170:
+	.8byte	.LVL736
+	.8byte	.LVL737
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL726
-	.8byte	.LVL727-1
+	.8byte	.LVL760
+	.8byte	.LVL761-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST160:
-	.8byte	.LVL633
-	.8byte	.LVL634
+.LLST161:
+	.8byte	.LVL666
+	.8byte	.LVL667
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL687
-	.8byte	.LVL688-1
+	.8byte	.LVL707
+	.8byte	.LVL708-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST151:
-	.8byte	.LVL622
-	.8byte	.LVL623
+.LLST160:
+	.8byte	.LVL655
+	.8byte	.LVL656
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL635
-	.8byte	.LVL636
+	.8byte	.LVL668
+	.8byte	.LVL669
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL638
-	.8byte	.LVL639-1
+	.8byte	.LVL671
+	.8byte	.LVL672-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST152:
-	.8byte	.LVL660
-	.8byte	.LVL666
+.LLST162:
+	.8byte	.LVL694
+	.8byte	.LVL695-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL668
-	.8byte	.LVL669
+	.8byte	.LVL704
+	.8byte	.LVL705-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL672
-	.8byte	.LVL673
+	.8byte	.LVL716
+	.8byte	.LVL722
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL676
-	.8byte	.LVL677-1
+	.8byte	.LVL724
+	.8byte	.LVL725
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL681
-	.8byte	.LVL682-1
+	.8byte	.LVL728
+	.8byte	.LVL729
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL716
-	.8byte	.LVL717-1
+	.8byte	.LVL750
+	.8byte	.LVL751-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL737
-	.8byte	.LVL739-1
+	.8byte	.LVL771
+	.8byte	.LVL773-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL745
-	.8byte	.LVL746-1
+	.8byte	.LVL779
+	.8byte	.LVL780-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST153:
-	.8byte	.LVL666
-	.8byte	.LVL667
+.LLST163:
+	.8byte	.LVL722
+	.8byte	.LVL723
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL670
-	.8byte	.LVL671
+	.8byte	.LVL726
+	.8byte	.LVL727
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST154:
-	.8byte	.LVL665
-	.8byte	.LVL673
+.LLST164:
+	.8byte	.LVL694
+	.8byte	.LVL695-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL676
-	.8byte	.LVL677-1
+	.8byte	.LVL704
+	.8byte	.LVL705-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL681
-	.8byte	.LVL682-1
+	.8byte	.LVL721
+	.8byte	.LVL729
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL716
-	.8byte	.LVL717-1
+	.8byte	.LVL750
+	.8byte	.LVL751-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL737
-	.8byte	.LVL739-1
+	.8byte	.LVL771
+	.8byte	.LVL773-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL745
-	.8byte	.LVL746-1
+	.8byte	.LVL779
+	.8byte	.LVL780-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST155:
-	.8byte	.LVL664
-	.8byte	.LVL673
+.LLST165:
+	.8byte	.LVL694
+	.8byte	.LVL695-1
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL676
-	.8byte	.LVL677-1
+	.8byte	.LVL704
+	.8byte	.LVL705-1
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL681
-	.8byte	.LVL682-1
+	.8byte	.LVL720
+	.8byte	.LVL729
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL716
-	.8byte	.LVL717-1
+	.8byte	.LVL750
+	.8byte	.LVL751-1
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL737
-	.8byte	.LVL739-1
+	.8byte	.LVL771
+	.8byte	.LVL773-1
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL745
-	.8byte	.LVL746-1
+	.8byte	.LVL779
+	.8byte	.LVL780-1
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST156:
-	.8byte	.LVL665
-	.8byte	.LVL673
+.LLST166:
+	.8byte	.LVL721
+	.8byte	.LVL729
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL737
-	.8byte	.LVL738
+	.8byte	.LVL771
+	.8byte	.LVL772
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST157:
-	.8byte	.LVL663
-	.8byte	.LVL673
+.LLST167:
+	.8byte	.LVL694
+	.8byte	.LVL695-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL676
-	.8byte	.LVL677-1
+	.8byte	.LVL704
+	.8byte	.LVL705-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL681
-	.8byte	.LVL682-1
+	.8byte	.LVL719
+	.8byte	.LVL729
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL716
-	.8byte	.LVL717-1
+	.8byte	.LVL750
+	.8byte	.LVL751-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL737
-	.8byte	.LVL739-1
+	.8byte	.LVL771
+	.8byte	.LVL773-1
 	.2byte	0x1
 	.byte	0x60
-	.8byte	.LVL745
-	.8byte	.LVL746-1
+	.8byte	.LVL779
+	.8byte	.LVL780-1
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
-.LLST158:
-	.8byte	.LVL661
-	.8byte	.LVL673
+.LLST168:
+	.8byte	.LVL694
+	.8byte	.LVL695-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL676
-	.8byte	.LVL677-1
+	.8byte	.LVL704
+	.8byte	.LVL705-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL681
-	.8byte	.LVL682-1
+	.8byte	.LVL717
+	.8byte	.LVL729
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL716
-	.8byte	.LVL717-1
+	.8byte	.LVL750
+	.8byte	.LVL751-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL737
-	.8byte	.LVL739-1
+	.8byte	.LVL771
+	.8byte	.LVL773-1
 	.2byte	0x1
 	.byte	0x5a
-	.8byte	.LVL745
-	.8byte	.LVL746-1
+	.8byte	.LVL779
+	.8byte	.LVL780-1
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST159:
-	.8byte	.LVL662
-	.8byte	.LVL673
+.LLST169:
+	.8byte	.LVL694
+	.8byte	.LVL695-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL676
-	.8byte	.LVL677-1
+	.8byte	.LVL704
+	.8byte	.LVL705-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL681
-	.8byte	.LVL682-1
+	.8byte	.LVL718
+	.8byte	.LVL729
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL716
-	.8byte	.LVL717-1
+	.8byte	.LVL750
+	.8byte	.LVL751-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL737
-	.8byte	.LVL739-1
+	.8byte	.LVL771
+	.8byte	.LVL773-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL745
-	.8byte	.LVL746-1
+	.8byte	.LVL779
+	.8byte	.LVL780-1
 	.2byte	0x1
 	.byte	0x61
 	.8byte	0
 	.8byte	0
-.LLST162:
-	.8byte	.LVL678
-	.8byte	.LVL679-1
+.LLST171:
+	.8byte	.LVL701
+	.8byte	.LVL702-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL705
-	.8byte	.LVL706-1
+	.8byte	.LVL739
+	.8byte	.LVL740-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL707
-	.8byte	.LVL708
+	.8byte	.LVL741
+	.8byte	.LVL742
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL720
-	.8byte	.LVL721
+	.8byte	.LVL754
+	.8byte	.LVL755
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL741
-	.8byte	.LVL742-1
+	.8byte	.LVL775
+	.8byte	.LVL776-1
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST64:
-	.8byte	.LVL208
-	.8byte	.LVL209
+.LLST73:
+	.8byte	.LVL241
+	.8byte	.LVL242
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL209
-	.8byte	.LVL215
+	.8byte	.LVL242
+	.8byte	.LVL248
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL216
+	.8byte	.LVL249
 	.8byte	.LFE2817
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST65:
-	.8byte	.LVL210
-	.8byte	.LVL212
+.LLST74:
+	.8byte	.LVL243
+	.8byte	.LVL245
 	.2byte	0x2
 	.byte	0x71
 	.sleb128 -12
-	.8byte	.LVL212
-	.8byte	.LVL219
+	.8byte	.LVL245
+	.8byte	.LVL252
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
-	.8byte	.LVL219
-	.8byte	.LVL222
+	.8byte	.LVL252
+	.8byte	.LVL255
 	.2byte	0x2
 	.byte	0x71
 	.sleb128 -12
-	.8byte	.LVL222
+	.8byte	.LVL255
 	.8byte	.LFE2817
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
 	.8byte	0
 	.8byte	0
-.LLST110:
-	.8byte	.LVL383
-	.8byte	.LVL384
+.LLST119:
+	.8byte	.LVL416
+	.8byte	.LVL417
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST109:
-	.8byte	.LVL360
-	.8byte	.LVL361
+.LLST118:
+	.8byte	.LVL393
+	.8byte	.LVL394
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL361
-	.8byte	.LVL365
+	.8byte	.LVL394
+	.8byte	.LVL398
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL366
-	.8byte	.LVL370
+	.8byte	.LVL399
+	.8byte	.LVL403
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL371
-	.8byte	.LVL374
+	.8byte	.LVL404
+	.8byte	.LVL407
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL375
-	.8byte	.LVL379
+	.8byte	.LVL408
+	.8byte	.LVL412
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL380
+	.8byte	.LVL413
 	.8byte	.LFE2814
 	.2byte	0x1
 	.byte	0x64
@@ -47517,401 +48266,401 @@ __exitcall_ebc_exit:
 	.byte	0x67
 	.8byte	0
 	.8byte	0
-.LLST143:
-	.8byte	.LVL613
-	.8byte	.LVL614
+.LLST152:
+	.8byte	.LVL646
+	.8byte	.LVL647
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST144:
-	.8byte	.LVL615
-	.8byte	.LVL616
+.LLST153:
+	.8byte	.LVL648
+	.8byte	.LVL649
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST138:
-	.8byte	.LVL600
-	.8byte	.LVL611
+.LLST147:
+	.8byte	.LVL633
+	.8byte	.LVL644
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL611
+	.8byte	.LVL644
 	.8byte	.LFE2806
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST139:
-	.8byte	.LVL600
-	.8byte	.LVL610
+.LLST148:
+	.8byte	.LVL633
+	.8byte	.LVL643
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL611
+	.8byte	.LVL644
 	.8byte	.LFE2806
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST140:
-	.8byte	.LVL600
-	.8byte	.LVL607
+.LLST149:
+	.8byte	.LVL633
+	.8byte	.LVL640
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL608
+	.8byte	.LVL641
 	.8byte	.LFE2806
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST141:
-	.8byte	.LVL600
-	.8byte	.LVL605
+.LLST150:
+	.8byte	.LVL633
+	.8byte	.LVL638
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL612
+	.8byte	.LVL645
 	.8byte	.LFE2806
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST142:
-	.8byte	.LVL606
-	.8byte	.LVL609
+.LLST151:
+	.8byte	.LVL639
+	.8byte	.LVL642
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST90:
-	.8byte	.LVL284
-	.8byte	.LVL298
+.LLST99:
+	.8byte	.LVL317
+	.8byte	.LVL331
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL302
-	.8byte	.LVL305
+	.8byte	.LVL335
+	.8byte	.LVL338
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL308
+	.8byte	.LVL341
 	.8byte	.LFE2846
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST91:
-	.8byte	.LVL284
-	.8byte	.LVL299
+.LLST100:
+	.8byte	.LVL317
+	.8byte	.LVL332
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL302
-	.8byte	.LVL305
+	.8byte	.LVL335
+	.8byte	.LVL338
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL308
+	.8byte	.LVL341
 	.8byte	.LFE2846
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST92:
-	.8byte	.LVL294
-	.8byte	.LVL296
+.LLST101:
+	.8byte	.LVL327
+	.8byte	.LVL329
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST93:
-	.8byte	.LVL295
-	.8byte	.LVL297
+.LLST102:
+	.8byte	.LVL328
+	.8byte	.LVL330
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST94:
-	.8byte	.LVL293
-	.8byte	.LVL302
+.LLST103:
+	.8byte	.LVL326
+	.8byte	.LVL335
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL305
-	.8byte	.LVL308
+	.8byte	.LVL338
+	.8byte	.LVL341
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST95:
-	.8byte	.LVL293
-	.8byte	.LVL302
+.LLST104:
+	.8byte	.LVL326
+	.8byte	.LVL335
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL305
-	.8byte	.LVL308
+	.8byte	.LVL338
+	.8byte	.LVL341
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST96:
-	.8byte	.LVL290
-	.8byte	.LVL291
+.LLST105:
+	.8byte	.LVL323
+	.8byte	.LVL324
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL292
-	.8byte	.LVL300
+	.8byte	.LVL325
+	.8byte	.LVL333
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL301
-	.8byte	.LVL303
+	.8byte	.LVL334
+	.8byte	.LVL336
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL304
-	.8byte	.LVL306
+	.8byte	.LVL337
+	.8byte	.LVL339
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL307
+	.8byte	.LVL340
 	.8byte	.LFE2846
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST97:
-	.8byte	.LVL285
-	.8byte	.LVL286
+.LLST106:
+	.8byte	.LVL318
+	.8byte	.LVL319
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST98:
-	.8byte	.LVL309
-	.8byte	.LVL335
+.LLST107:
+	.8byte	.LVL342
+	.8byte	.LVL368
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL341
-	.8byte	.LVL342
+	.8byte	.LVL374
+	.8byte	.LVL375
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL343
-	.8byte	.LVL347
+	.8byte	.LVL376
+	.8byte	.LVL380
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL351
+	.8byte	.LVL384
 	.8byte	.LFE2847
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST99:
-	.8byte	.LVL309
-	.8byte	.LVL336
+.LLST108:
+	.8byte	.LVL342
+	.8byte	.LVL369
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL341
-	.8byte	.LVL347
+	.8byte	.LVL374
+	.8byte	.LVL380
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL351
+	.8byte	.LVL384
 	.8byte	.LFE2847
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST100:
-	.8byte	.LVL316
-	.8byte	.LVL329
+.LLST109:
+	.8byte	.LVL349
+	.8byte	.LVL362
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL334
+	.8byte	.LVL367
 	.8byte	.LFE2847
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST101:
-	.8byte	.LVL320
-	.8byte	.LVL330
+.LLST110:
+	.8byte	.LVL353
+	.8byte	.LVL363
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL334
-	.8byte	.LVL337
+	.8byte	.LVL367
+	.8byte	.LVL370
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL341
-	.8byte	.LVL344
+	.8byte	.LVL374
+	.8byte	.LVL377
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL350
+	.8byte	.LVL383
 	.8byte	.LFE2847
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST102:
-	.8byte	.LVL316
-	.8byte	.LVL317
+.LLST111:
+	.8byte	.LVL349
+	.8byte	.LVL350
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL318
-	.8byte	.LVL319
+	.8byte	.LVL351
+	.8byte	.LVL352
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL336
-	.8byte	.LVL338
+	.8byte	.LVL369
+	.8byte	.LVL371
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL339
-	.8byte	.LVL340
+	.8byte	.LVL372
+	.8byte	.LVL373
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL343
-	.8byte	.LVL345
+	.8byte	.LVL376
+	.8byte	.LVL378
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL346
-	.8byte	.LVL348
+	.8byte	.LVL379
+	.8byte	.LVL381
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL349
+	.8byte	.LVL382
 	.8byte	.LFE2847
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST103:
-	.8byte	.LVL310
-	.8byte	.LVL311
+.LLST112:
+	.8byte	.LVL343
+	.8byte	.LVL344
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST104:
-	.8byte	.LVL321
-	.8byte	.LVL322
+.LLST113:
+	.8byte	.LVL354
+	.8byte	.LVL355
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL331
-	.8byte	.LVL341
+	.8byte	.LVL364
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL347
-	.8byte	.LVL351
+	.8byte	.LVL380
+	.8byte	.LVL384
 	.2byte	0x1
 	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST105:
-	.8byte	.LVL321
-	.8byte	.LVL325
+.LLST114:
+	.8byte	.LVL354
+	.8byte	.LVL358
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL326
-	.8byte	.LVL327
+	.8byte	.LVL359
+	.8byte	.LVL360
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL328
-	.8byte	.LVL332
+	.8byte	.LVL361
+	.8byte	.LVL365
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL333
-	.8byte	.LVL341
+	.8byte	.LVL366
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL347
-	.8byte	.LVL351
+	.8byte	.LVL380
+	.8byte	.LVL384
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST106:
-	.8byte	.LVL321
-	.8byte	.LVL323
+.LLST115:
+	.8byte	.LVL354
+	.8byte	.LVL356
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL324
-	.8byte	.LVL327
+	.8byte	.LVL357
+	.8byte	.LVL360
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL328
-	.8byte	.LVL332
+	.8byte	.LVL361
+	.8byte	.LVL365
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL333
-	.8byte	.LVL341
+	.8byte	.LVL366
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL347
-	.8byte	.LVL351
+	.8byte	.LVL380
+	.8byte	.LVL384
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST107:
-	.8byte	.LVL321
-	.8byte	.LVL323
+.LLST116:
+	.8byte	.LVL354
+	.8byte	.LVL356
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL324
-	.8byte	.LVL325
+	.8byte	.LVL357
+	.8byte	.LVL358
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL326
-	.8byte	.LVL332
+	.8byte	.LVL359
+	.8byte	.LVL365
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL333
-	.8byte	.LVL341
+	.8byte	.LVL366
+	.8byte	.LVL374
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL347
-	.8byte	.LVL351
+	.8byte	.LVL380
+	.8byte	.LVL384
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST108:
-	.8byte	.LVL352
-	.8byte	.LVL353
+.LLST117:
+	.8byte	.LVL385
+	.8byte	.LVL386
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL353
-	.8byte	.LVL358
+	.8byte	.LVL386
+	.8byte	.LVL391
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL359
+	.8byte	.LVL392
 	.8byte	.LFE2848
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST111:
-	.8byte	.LVL399
-	.8byte	.LVL400
+.LLST120:
+	.8byte	.LVL432
+	.8byte	.LVL433
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL400
-	.8byte	.LVL407
+	.8byte	.LVL433
+	.8byte	.LVL440
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST112:
-	.8byte	.LVL399
-	.8byte	.LVL401-1
+.LLST121:
+	.8byte	.LVL432
+	.8byte	.LVL434-1
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL401-1
-	.8byte	.LVL406
+	.8byte	.LVL434-1
+	.8byte	.LVL439
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST136:
-	.8byte	.LVL583
-	.8byte	.LVL584
+.LLST145:
+	.8byte	.LVL616
+	.8byte	.LVL617
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL584
-	.8byte	.LVL589
+	.8byte	.LVL617
+	.8byte	.LVL622
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL590
-	.8byte	.LVL593
+	.8byte	.LVL623
+	.8byte	.LVL626
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -47934,480 +48683,536 @@ __exitcall_ebc_exit:
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
 .Ldebug_ranges0:
-	.8byte	.LBB792
-	.8byte	.LBE792
-	.8byte	.LBB801
-	.8byte	.LBE801
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB806
-	.8byte	.LBE806
-	.8byte	.LBB809
-	.8byte	.LBE809
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB810
-	.8byte	.LBE810
-	.8byte	.LBB839
-	.8byte	.LBE839
-	.8byte	.LBB946
-	.8byte	.LBE946
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB813
-	.8byte	.LBE813
-	.8byte	.LBB825
-	.8byte	.LBE825
-	.8byte	.LBB834
-	.8byte	.LBE834
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB828
-	.8byte	.LBE828
-	.8byte	.LBB833
-	.8byte	.LBE833
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB840
-	.8byte	.LBE840
-	.8byte	.LBB875
-	.8byte	.LBE875
-	.8byte	.LBB876
-	.8byte	.LBE876
-	.8byte	.LBB947
-	.8byte	.LBE947
-	.8byte	.LBB1021
-	.8byte	.LBE1021
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB843
-	.8byte	.LBE843
-	.8byte	.LBB856
-	.8byte	.LBE856
-	.8byte	.LBB857
-	.8byte	.LBE857
-	.8byte	.LBB858
-	.8byte	.LBE858
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB861
-	.8byte	.LBE861
-	.8byte	.LBB866
-	.8byte	.LBE866
+	.8byte	.LBB916
+	.8byte	.LBE916
+	.8byte	.LBB925
+	.8byte	.LBE925
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB877
-	.8byte	.LBE877
-	.8byte	.LBB912
-	.8byte	.LBE912
-	.8byte	.LBB913
-	.8byte	.LBE913
-	.8byte	.LBB945
-	.8byte	.LBE945
-	.8byte	.LBB1020
-	.8byte	.LBE1020
+	.8byte	.LBB930
+	.8byte	.LBE930
+	.8byte	.LBB933
+	.8byte	.LBE933
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB880
-	.8byte	.LBE880
-	.8byte	.LBB893
-	.8byte	.LBE893
-	.8byte	.LBB894
-	.8byte	.LBE894
-	.8byte	.LBB895
-	.8byte	.LBE895
+	.8byte	.LBB934
+	.8byte	.LBE934
+	.8byte	.LBB965
+	.8byte	.LBE965
+	.8byte	.LBB966
+	.8byte	.LBE966
+	.8byte	.LBB1031
+	.8byte	.LBE1031
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB898
-	.8byte	.LBE898
-	.8byte	.LBB903
-	.8byte	.LBE903
+	.8byte	.LBB937
+	.8byte	.LBE937
+	.8byte	.LBB949
+	.8byte	.LBE949
+	.8byte	.LBB950
+	.8byte	.LBE950
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB914
-	.8byte	.LBE914
-	.8byte	.LBB943
-	.8byte	.LBE943
-	.8byte	.LBB944
-	.8byte	.LBE944
+	.8byte	.LBB953
+	.8byte	.LBE953
+	.8byte	.LBB958
+	.8byte	.LBE958
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB917
-	.8byte	.LBE917
-	.8byte	.LBB929
-	.8byte	.LBE929
-	.8byte	.LBB930
-	.8byte	.LBE930
+	.8byte	.LBB967
+	.8byte	.LBE967
+	.8byte	.LBB1188
+	.8byte	.LBE1188
+	.8byte	.LBB1189
+	.8byte	.LBE1189
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB933
-	.8byte	.LBE933
-	.8byte	.LBB938
-	.8byte	.LBE938
+	.8byte	.LBB970
+	.8byte	.LBE970
+	.8byte	.LBB990
+	.8byte	.LBE990
+	.8byte	.LBB991
+	.8byte	.LBE991
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB948
-	.8byte	.LBE948
-	.8byte	.LBB983
-	.8byte	.LBE983
 	.8byte	.LBB984
 	.8byte	.LBE984
-	.8byte	.LBB985
-	.8byte	.LBE985
-	.8byte	.LBB1022
-	.8byte	.LBE1022
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB951
-	.8byte	.LBE951
-	.8byte	.LBB964
-	.8byte	.LBE964
-	.8byte	.LBB965
-	.8byte	.LBE965
-	.8byte	.LBB974
-	.8byte	.LBE974
+	.8byte	.LBB989
+	.8byte	.LBE989
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB968
-	.8byte	.LBE968
-	.8byte	.LBB973
-	.8byte	.LBE973
+	.8byte	.LBB996
+	.8byte	.LBE996
+	.8byte	.LBB1199
+	.8byte	.LBE1199
+	.8byte	.LBB1201
+	.8byte	.LBE1201
+	.8byte	.LBB1202
+	.8byte	.LBE1202
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB986
-	.8byte	.LBE986
-	.8byte	.LBB1015
-	.8byte	.LBE1015
-	.8byte	.LBB1019
-	.8byte	.LBE1019
+	.8byte	.LBB1002
+	.8byte	.LBE1002
+	.8byte	.LBB1186
+	.8byte	.LBE1186
+	.8byte	.LBB1187
+	.8byte	.LBE1187
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB989
-	.8byte	.LBE989
-	.8byte	.LBB1001
-	.8byte	.LBE1001
-	.8byte	.LBB1010
-	.8byte	.LBE1010
+	.8byte	.LBB1005
+	.8byte	.LBE1005
+	.8byte	.LBB1025
+	.8byte	.LBE1025
+	.8byte	.LBB1026
+	.8byte	.LBE1026
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1004
-	.8byte	.LBE1004
-	.8byte	.LBB1009
-	.8byte	.LBE1009
+	.8byte	.LBB1019
+	.8byte	.LBE1019
+	.8byte	.LBB1024
+	.8byte	.LBE1024
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1027
-	.8byte	.LBE1027
-	.8byte	.LBB1030
-	.8byte	.LBE1030
+	.8byte	.LBB1032
+	.8byte	.LBE1032
+	.8byte	.LBB1065
+	.8byte	.LBE1065
+	.8byte	.LBB1196
+	.8byte	.LBE1196
+	.8byte	.LBB1197
+	.8byte	.LBE1197
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1031
-	.8byte	.LBE1031
-	.8byte	.LBB1043
-	.8byte	.LBE1043
-	.8byte	.LBB1045
-	.8byte	.LBE1045
-	.8byte	.LBB1047
-	.8byte	.LBE1047
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1036
-	.8byte	.LBE1036
-	.8byte	.LBB1044
-	.8byte	.LBE1044
-	.8byte	.LBB1046
-	.8byte	.LBE1046
-	.8byte	.LBB1055
-	.8byte	.LBE1055
+	.8byte	.LBB1035
+	.8byte	.LBE1035
+	.8byte	.LBB1048
+	.8byte	.LBE1048
 	.8byte	.LBB1057
 	.8byte	.LBE1057
-	.8byte	.LBB1059
-	.8byte	.LBE1059
+	.8byte	.LBB1058
+	.8byte	.LBE1058
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1048
-	.8byte	.LBE1048
+	.8byte	.LBB1051
+	.8byte	.LBE1051
 	.8byte	.LBB1056
 	.8byte	.LBE1056
-	.8byte	.LBB1058
-	.8byte	.LBE1058
-	.8byte	.LBB1065
-	.8byte	.LBE1065
-	.8byte	.LBB1067
-	.8byte	.LBE1067
-	.8byte	.LBB1069
-	.8byte	.LBE1069
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1060
-	.8byte	.LBE1060
 	.8byte	.LBB1066
 	.8byte	.LBE1066
-	.8byte	.LBB1068
-	.8byte	.LBE1068
-	.8byte	.LBB1070
-	.8byte	.LBE1070
+	.8byte	.LBB1101
+	.8byte	.LBE1101
+	.8byte	.LBB1192
+	.8byte	.LBE1192
+	.8byte	.LBB1193
+	.8byte	.LBE1193
+	.8byte	.LBB1203
+	.8byte	.LBE1203
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1071
-	.8byte	.LBE1071
-	.8byte	.LBB1080
-	.8byte	.LBE1080
+	.8byte	.LBB1069
+	.8byte	.LBE1069
+	.8byte	.LBB1082
+	.8byte	.LBE1082
+	.8byte	.LBB1091
+	.8byte	.LBE1091
+	.8byte	.LBB1092
+	.8byte	.LBE1092
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1081
-	.8byte	.LBE1081
+	.8byte	.LBB1085
+	.8byte	.LBE1085
 	.8byte	.LBB1090
 	.8byte	.LBE1090
-	.8byte	.LBB1091
-	.8byte	.LBE1091
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB1102
 	.8byte	.LBE1102
+	.8byte	.LBB1113
+	.8byte	.LBE1113
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1083
-	.8byte	.LBE1083
-	.8byte	.LBB1086
-	.8byte	.LBE1086
+	.8byte	.LBB1105
+	.8byte	.LBE1105
+	.8byte	.LBB1110
+	.8byte	.LBE1110
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1092
-	.8byte	.LBE1092
-	.8byte	.LBB1096
-	.8byte	.LBE1096
-	.8byte	.LBB1097
-	.8byte	.LBE1097
+	.8byte	.LBB1106
+	.8byte	.LBE1106
+	.8byte	.LBB1109
+	.8byte	.LBE1109
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1111
-	.8byte	.LBE1111
-	.8byte	.LBB1118
-	.8byte	.LBE1118
-	.8byte	.LBB1119
-	.8byte	.LBE1119
+	.8byte	.LBB1114
+	.8byte	.LBE1114
+	.8byte	.LBB1149
+	.8byte	.LBE1149
+	.8byte	.LBB1190
+	.8byte	.LBE1190
+	.8byte	.LBB1191
+	.8byte	.LBE1191
+	.8byte	.LBB1198
+	.8byte	.LBE1198
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1112
-	.8byte	.LBE1112
 	.8byte	.LBB1117
 	.8byte	.LBE1117
+	.8byte	.LBB1130
+	.8byte	.LBE1130
+	.8byte	.LBB1131
+	.8byte	.LBE1131
+	.8byte	.LBB1132
+	.8byte	.LBE1132
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1135
+	.8byte	.LBE1135
+	.8byte	.LBB1140
+	.8byte	.LBE1140
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1150
+	.8byte	.LBE1150
+	.8byte	.LBB1185
+	.8byte	.LBE1185
+	.8byte	.LBB1194
+	.8byte	.LBE1194
+	.8byte	.LBB1195
+	.8byte	.LBE1195
+	.8byte	.LBB1200
+	.8byte	.LBE1200
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1153
+	.8byte	.LBE1153
+	.8byte	.LBB1166
+	.8byte	.LBE1166
+	.8byte	.LBB1167
+	.8byte	.LBE1167
+	.8byte	.LBB1168
+	.8byte	.LBE1168
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1171
+	.8byte	.LBE1171
+	.8byte	.LBB1176
+	.8byte	.LBE1176
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1208
+	.8byte	.LBE1208
+	.8byte	.LBB1211
+	.8byte	.LBE1211
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1212
+	.8byte	.LBE1212
+	.8byte	.LBB1224
+	.8byte	.LBE1224
+	.8byte	.LBB1226
+	.8byte	.LBE1226
+	.8byte	.LBB1228
+	.8byte	.LBE1228
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1217
+	.8byte	.LBE1217
+	.8byte	.LBB1225
+	.8byte	.LBE1225
+	.8byte	.LBB1227
+	.8byte	.LBE1227
+	.8byte	.LBB1236
+	.8byte	.LBE1236
+	.8byte	.LBB1238
+	.8byte	.LBE1238
+	.8byte	.LBB1240
+	.8byte	.LBE1240
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1229
+	.8byte	.LBE1229
+	.8byte	.LBB1237
+	.8byte	.LBE1237
+	.8byte	.LBB1239
+	.8byte	.LBE1239
+	.8byte	.LBB1246
+	.8byte	.LBE1246
+	.8byte	.LBB1248
+	.8byte	.LBE1248
+	.8byte	.LBB1250
+	.8byte	.LBE1250
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1241
+	.8byte	.LBE1241
+	.8byte	.LBB1247
+	.8byte	.LBE1247
+	.8byte	.LBB1249
+	.8byte	.LBE1249
+	.8byte	.LBB1251
+	.8byte	.LBE1251
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1252
+	.8byte	.LBE1252
+	.8byte	.LBB1261
+	.8byte	.LBE1261
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1262
+	.8byte	.LBE1262
+	.8byte	.LBB1271
+	.8byte	.LBE1271
+	.8byte	.LBB1272
+	.8byte	.LBE1272
+	.8byte	.LBB1283
+	.8byte	.LBE1283
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1126
-	.8byte	.LBE1126
-	.8byte	.LBB1129
-	.8byte	.LBE1129
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1279
-	.8byte	.LBE1279
-	.8byte	.LBB1282
-	.8byte	.LBE1282
+	.8byte	.LBB1264
+	.8byte	.LBE1264
+	.8byte	.LBB1267
+	.8byte	.LBE1267
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1289
-	.8byte	.LBE1289
-	.8byte	.LBB1388
-	.8byte	.LBE1388
-	.8byte	.LBB1389
-	.8byte	.LBE1389
-	.8byte	.LBB1390
-	.8byte	.LBE1390
-	.8byte	.LBB1431
-	.8byte	.LBE1431
+	.8byte	.LBB1273
+	.8byte	.LBE1273
+	.8byte	.LBB1277
+	.8byte	.LBE1277
+	.8byte	.LBB1278
+	.8byte	.LBE1278
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1291
-	.8byte	.LBE1291
+	.8byte	.LBB1292
+	.8byte	.LBE1292
+	.8byte	.LBB1299
+	.8byte	.LBE1299
 	.8byte	.LBB1300
 	.8byte	.LBE1300
-	.8byte	.LBB1301
-	.8byte	.LBE1301
-	.8byte	.LBB1302
-	.8byte	.LBE1302
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1348
-	.8byte	.LBE1348
-	.8byte	.LBB1382
-	.8byte	.LBE1382
-	.8byte	.LBB1383
-	.8byte	.LBE1383
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1355
-	.8byte	.LBE1355
-	.8byte	.LBB1380
-	.8byte	.LBE1380
-	.8byte	.LBB1381
-	.8byte	.LBE1381
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1362
-	.8byte	.LBE1362
-	.8byte	.LBB1378
-	.8byte	.LBE1378
-	.8byte	.LBB1379
-	.8byte	.LBE1379
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1369
-	.8byte	.LBE1369
-	.8byte	.LBB1376
-	.8byte	.LBE1376
-	.8byte	.LBB1377
-	.8byte	.LBE1377
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1391
-	.8byte	.LBE1391
-	.8byte	.LBB1420
-	.8byte	.LBE1420
-	.8byte	.LBB1421
-	.8byte	.LBE1421
-	.8byte	.LBB1430
-	.8byte	.LBE1430
-	.8byte	.LBB1481
-	.8byte	.LBE1481
-	.8byte	.LBB1486
-	.8byte	.LBE1486
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1393
-	.8byte	.LBE1393
-	.8byte	.LBB1396
-	.8byte	.LBE1396
+	.8byte	.LBB1293
+	.8byte	.LBE1293
+	.8byte	.LBB1298
+	.8byte	.LBE1298
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1307
+	.8byte	.LBE1307
+	.8byte	.LBB1310
+	.8byte	.LBE1310
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1397
-	.8byte	.LBE1397
-	.8byte	.LBB1402
-	.8byte	.LBE1402
-	.8byte	.LBB1403
-	.8byte	.LBE1403
-	.8byte	.LBB1404
-	.8byte	.LBE1404
+	.8byte	.LBB1460
+	.8byte	.LBE1460
+	.8byte	.LBB1463
+	.8byte	.LBE1463
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1411
-	.8byte	.LBE1411
-	.8byte	.LBB1414
-	.8byte	.LBE1414
+	.8byte	.LBB1470
+	.8byte	.LBE1470
+	.8byte	.LBB1569
+	.8byte	.LBE1569
+	.8byte	.LBB1570
+	.8byte	.LBE1570
+	.8byte	.LBB1571
+	.8byte	.LBE1571
+	.8byte	.LBB1612
+	.8byte	.LBE1612
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1422
-	.8byte	.LBE1422
-	.8byte	.LBB1432
-	.8byte	.LBE1432
+	.8byte	.LBB1472
+	.8byte	.LBE1472
+	.8byte	.LBB1481
+	.8byte	.LBE1481
+	.8byte	.LBB1482
+	.8byte	.LBE1482
 	.8byte	.LBB1483
 	.8byte	.LBE1483
-	.8byte	.LBB1487
-	.8byte	.LBE1487
-	.8byte	.LBB1488
-	.8byte	.LBE1488
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1433
-	.8byte	.LBE1433
-	.8byte	.LBB1484
-	.8byte	.LBE1484
-	.8byte	.LBB1485
-	.8byte	.LBE1485
+	.8byte	.LBB1529
+	.8byte	.LBE1529
+	.8byte	.LBB1563
+	.8byte	.LBE1563
+	.8byte	.LBB1564
+	.8byte	.LBE1564
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1435
-	.8byte	.LBE1435
-	.8byte	.LBB1441
-	.8byte	.LBE1441
+	.8byte	.LBB1536
+	.8byte	.LBE1536
+	.8byte	.LBB1561
+	.8byte	.LBE1561
+	.8byte	.LBB1562
+	.8byte	.LBE1562
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1444
-	.8byte	.LBE1444
-	.8byte	.LBB1445
-	.8byte	.LBE1445
+	.8byte	.LBB1543
+	.8byte	.LBE1543
+	.8byte	.LBB1559
+	.8byte	.LBE1559
+	.8byte	.LBB1560
+	.8byte	.LBE1560
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1452
-	.8byte	.LBE1452
-	.8byte	.LBB1458
-	.8byte	.LBE1458
-	.8byte	.LBB1459
-	.8byte	.LBE1459
-	.8byte	.LBB1460
-	.8byte	.LBE1460
-	.8byte	.LBB1461
-	.8byte	.LBE1461
+	.8byte	.LBB1550
+	.8byte	.LBE1550
+	.8byte	.LBB1557
+	.8byte	.LBE1557
+	.8byte	.LBB1558
+	.8byte	.LBE1558
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1572
+	.8byte	.LBE1572
+	.8byte	.LBB1601
+	.8byte	.LBE1601
+	.8byte	.LBB1602
+	.8byte	.LBE1602
+	.8byte	.LBB1611
+	.8byte	.LBE1611
+	.8byte	.LBB1662
+	.8byte	.LBE1662
+	.8byte	.LBB1667
+	.8byte	.LBE1667
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1574
+	.8byte	.LBE1574
+	.8byte	.LBB1577
+	.8byte	.LBE1577
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1578
+	.8byte	.LBE1578
+	.8byte	.LBB1583
+	.8byte	.LBE1583
+	.8byte	.LBB1584
+	.8byte	.LBE1584
+	.8byte	.LBB1585
+	.8byte	.LBE1585
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1592
+	.8byte	.LBE1592
+	.8byte	.LBB1595
+	.8byte	.LBE1595
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1603
+	.8byte	.LBE1603
+	.8byte	.LBB1613
+	.8byte	.LBE1613
+	.8byte	.LBB1664
+	.8byte	.LBE1664
+	.8byte	.LBB1668
+	.8byte	.LBE1668
+	.8byte	.LBB1669
+	.8byte	.LBE1669
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1614
+	.8byte	.LBE1614
+	.8byte	.LBB1665
+	.8byte	.LBE1665
+	.8byte	.LBB1666
+	.8byte	.LBE1666
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1462
-	.8byte	.LBE1462
-	.8byte	.LBB1480
-	.8byte	.LBE1480
-	.8byte	.LBB1482
-	.8byte	.LBE1482
-	.8byte	.LBB1489
-	.8byte	.LBE1489
+	.8byte	.LBB1616
+	.8byte	.LBE1616
+	.8byte	.LBB1622
+	.8byte	.LBE1622
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1490
-	.8byte	.LBE1490
-	.8byte	.LBB1493
-	.8byte	.LBE1493
+	.8byte	.LBB1625
+	.8byte	.LBE1625
+	.8byte	.LBB1626
+	.8byte	.LBE1626
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1527
-	.8byte	.LBE1527
-	.8byte	.LBB1534
-	.8byte	.LBE1534
-	.8byte	.LBB1535
-	.8byte	.LBE1535
+	.8byte	.LBB1633
+	.8byte	.LBE1633
+	.8byte	.LBB1639
+	.8byte	.LBE1639
+	.8byte	.LBB1640
+	.8byte	.LBE1640
+	.8byte	.LBB1641
+	.8byte	.LBE1641
+	.8byte	.LBB1642
+	.8byte	.LBE1642
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1529
-	.8byte	.LBE1529
-	.8byte	.LBB1530
-	.8byte	.LBE1530
-	.8byte	.LBB1531
-	.8byte	.LBE1531
+	.8byte	.LBB1643
+	.8byte	.LBE1643
+	.8byte	.LBB1661
+	.8byte	.LBE1661
+	.8byte	.LBB1663
+	.8byte	.LBE1663
+	.8byte	.LBB1670
+	.8byte	.LBE1670
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1536
-	.8byte	.LBE1536
-	.8byte	.LBB1542
-	.8byte	.LBE1542
-	.8byte	.LBB1543
-	.8byte	.LBE1543
-	.8byte	.LBB1544
-	.8byte	.LBE1544
-	.8byte	.LBB1545
-	.8byte	.LBE1545
+	.8byte	.LBB1671
+	.8byte	.LBE1671
+	.8byte	.LBB1674
+	.8byte	.LBE1674
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1549
-	.8byte	.LBE1549
-	.8byte	.LBB1563
-	.8byte	.LBE1563
+	.8byte	.LBB1708
+	.8byte	.LBE1708
+	.8byte	.LBB1715
+	.8byte	.LBE1715
+	.8byte	.LBB1716
+	.8byte	.LBE1716
+	.8byte	0
 	.8byte	0
+	.8byte	.LBB1710
+	.8byte	.LBE1710
+	.8byte	.LBB1711
+	.8byte	.LBE1711
+	.8byte	.LBB1712
+	.8byte	.LBE1712
 	.8byte	0
-	.8byte	.LBB1551
-	.8byte	.LBE1551
-	.8byte	.LBB1552
-	.8byte	.LBE1552
-	.8byte	.LBB1553
-	.8byte	.LBE1553
 	.8byte	0
+	.8byte	.LBB1720
+	.8byte	.LBE1720
+	.8byte	.LBB1726
+	.8byte	.LBE1726
+	.8byte	.LBB1727
+	.8byte	.LBE1727
+	.8byte	.LBB1728
+	.8byte	.LBE1728
+	.8byte	.LBB1729
+	.8byte	.LBE1729
 	.8byte	0
-	.8byte	.LBB1559
-	.8byte	.LBE1559
-	.8byte	.LBB1564
-	.8byte	.LBE1564
 	.8byte	0
+	.8byte	.LBB1730
+	.8byte	.LBE1730
+	.8byte	.LBB1744
+	.8byte	.LBE1744
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1732
+	.8byte	.LBE1732
+	.8byte	.LBB1733
+	.8byte	.LBE1733
+	.8byte	.LBB1734
+	.8byte	.LBE1734
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1740
+	.8byte	.LBE1740
+	.8byte	.LBB1745
+	.8byte	.LBE1745
 	.8byte	0
-	.8byte	.LBB1561
-	.8byte	.LBE1561
-	.8byte	.LBB1562
-	.8byte	.LBE1562
+	.8byte	0
+	.8byte	.LBB1742
+	.8byte	.LBE1742
+	.8byte	.LBB1743
+	.8byte	.LBE1743
 	.8byte	0
 	.8byte	0
 	.8byte	.Ltext0
@@ -48859,7 +49664,7 @@ __exitcall_ebc_exit:
 	.string	"NR_ION_HEAP_POOL"
 .LASF1421:
 	.string	"sysctl_protected_hardlinks"
-.LASF3255:
+.LASF3256:
 	.string	"__arch_copy_from_user"
 .LASF1174:
 	.string	"scan_objects"
@@ -49435,8 +50240,6 @@ __exitcall_ebc_exit:
 	.string	"OOM_KILL"
 .LASF442:
 	.string	"i_hash"
-.LASF3012:
-	.string	"__addressable_ebc_init1911"
 .LASF3098:
 	.string	"gray_old"
 .LASF67:
@@ -50825,7 +51628,7 @@ __exitcall_ebc_exit:
 	.string	"boost_expires"
 .LASF2905:
 	.string	"DMA_BIDIRECTIONAL"
-.LASF3256:
+.LASF3255:
 	.string	"__arch_copy_to_user"
 .LASF235:
 	.string	"spinlock"
@@ -51129,7 +51932,7 @@ __exitcall_ebc_exit:
 	.string	"writeback_control"
 .LASF1902:
 	.string	"fl_end"
-.LASF3260:
+.LASF3258:
 	.string	"ebc_find_buf_by_phy_addr"
 .LASF1949:
 	.string	"super_operations"
@@ -51535,7 +52338,7 @@ __exitcall_ebc_exit:
 	.string	"mmap_miss"
 .LASF1652:
 	.string	"quota_format_ops"
-.LASF3259:
+.LASF3260:
 	.string	"ebc_osd_buf_get"
 .LASF3054:
 	.string	"argp"
@@ -51613,7 +52416,7 @@ __exitcall_ebc_exit:
 	.string	"cpumask_t"
 .LASF133:
 	.string	"kmsg_fops"
-.LASF3258:
+.LASF3257:
 	.string	"ebc_buf_release"
 .LASF817:
 	.string	"WORK_STRUCT_NO_POOL"
@@ -52469,6 +53272,8 @@ __exitcall_ebc_exit:
 	.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"
+.LASF3012:
+	.string	"__addressable_ebc_init1967"
 .LASF2618:
 	.string	"sysctl_overcommit_memory"
 .LASF2533:
@@ -52989,7 +53794,7 @@ __exitcall_ebc_exit:
 	.string	"maj_flt"
 .LASF228:
 	.string	"arch_rwlock_t"
-.LASF3257:
+.LASF3259:
 	.string	"ebc_osd_buf_clone"
 .LASF161:
 	.string	"c_false"

commit ff19001f1bdc66d5bd40dddbd95d20e987ce145c
Author: Ding Wei <leo.ding@rock-chips.com>
Date:   Mon May 17 14:35:35 2021 +0800

    video: rockchip: mpp: rkvdec2: rcb_info move to session->priv
    
    if rcb_info not change, then the infos will not ioctl from userspace.
    thus, it needs to restore infos in session.
    
    Change-Id: I4ff3b5bcc22b033b1d7549866af7c253bf46945c
    Signed-off-by: Ding Wei <leo.ding@rock-chips.com>

diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2.c b/drivers/video/rockchip/mpp/mpp_rkvdec2.c
index e25ad4e10d9a..8bd58e67437f 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvdec2.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec2.c
@@ -131,7 +131,6 @@ struct rkvdec2_task {
 	enum MPP_CLOCK_MODE clk_mode;
 	u32 reg[RKVDEC_REG_NUM];
 	struct reg_offset_info off_inf;
-	struct rkvdec2_rcb_info rcb_inf;
 
 	/* perf sel data back */
 	u32 reg_sel[RKVDEC_PERF_SEL_NUM];
@@ -157,6 +156,8 @@ struct rkvdec2_session_priv {
 		/* item data */
 		u64 val;
 	} codec_info[DEC_INFO_BUTT];
+	/* rcb_info for sram */
+	struct rkvdec2_rcb_info rcb_inf;
 };
 
 struct rkvdec2_dev {
@@ -244,21 +245,21 @@ static int mpp_extract_rcb_info(struct rkvdec2_rcb_info *rcb_inf,
 	int max_size = ARRAY_SIZE(rcb_inf->elem);
 	int cnt = req->size / sizeof(rcb_inf->elem[0]);
 
-	if ((cnt + rcb_inf->cnt) > max_size) {
-		mpp_err("count %d, total %d, max_size %d\n",
-			cnt, rcb_inf->cnt, max_size);
+	if (req->size > sizeof(rcb_inf->elem)) {
+		mpp_err("count %d,max_size %d\n", cnt, max_size);
 		return -EINVAL;
 	}
-	if (copy_from_user(&rcb_inf->elem[rcb_inf->cnt], req->data, req->size)) {
+	if (copy_from_user(rcb_inf->elem, req->data, req->size)) {
 		mpp_err("copy_from_user failed\n");
 		return -EINVAL;
 	}
-	rcb_inf->cnt += cnt;
+	rcb_inf->cnt = cnt;
 
 	return 0;
 }
 
-static int rkvdec2_extract_task_msg(struct rkvdec2_task *task,
+static int rkvdec2_extract_task_msg(struct mpp_session *session,
+				    struct rkvdec2_task *task,
 				    struct mpp_task_msgs *msgs)
 {
 	u32 i;
@@ -309,7 +310,10 @@ static int rkvdec2_extract_task_msg(struct rkvdec2_task *task,
 			mpp_extract_reg_offset_info(&task->off_inf, req);
 		} break;
 		case MPP_CMD_SET_RCB_INFO: {
-			mpp_extract_rcb_info(&task->rcb_inf, req);
+			struct rkvdec2_session_priv *priv = session->priv;
+
+			if (priv)
+				mpp_extract_rcb_info(&priv->rcb_inf, req);
 		} break;
 		default:
 			break;
@@ -321,16 +325,19 @@ static int rkvdec2_extract_task_msg(struct rkvdec2_task *task,
 	return 0;
 }
 
-static int mpp_set_rcbbuf(struct mpp_dev *mpp, struct rkvdec2_task *task)
+static int mpp_set_rcbbuf(struct mpp_dev *mpp,
+			  struct mpp_session *session,
+			  struct rkvdec2_task *task)
 {
 	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
+	struct rkvdec2_session_priv *priv = session->priv;
 
 	mpp_debug_enter();
 
-	if (dec->rcb_iova) {
+	if (priv && dec->rcb_iova) {
 		int i;
 		u32 reg_idx, rcb_size, rcb_offset;
-		struct rkvdec2_rcb_info *rcb_inf = &task->rcb_inf;
+		struct rkvdec2_rcb_info *rcb_inf = &priv->rcb_inf;
 
 		rcb_offset = 0;
 		for (i = 0; i < rcb_inf->cnt; i++) {
@@ -371,7 +378,7 @@ static void *rkvdec2_alloc_task(struct mpp_session *session,
 	mpp_task->hw_info = mpp->var->hw_info;
 	mpp_task->reg = task->reg;
 	/* extract reqs for current task */
-	ret = rkvdec2_extract_task_msg(task, msgs);
+	ret = rkvdec2_extract_task_msg(session, task, msgs);
 	if (ret)
 		goto fail;
 
@@ -386,7 +393,7 @@ static void *rkvdec2_alloc_task(struct mpp_session *session,
 
 		mpp_translate_reg_offset_info(&task->mpp_task, &task->off_inf, task->reg);
 	}
-	mpp_set_rcbbuf(mpp, task);
+	mpp_set_rcbbuf(mpp, session, task);
 	task->strm_addr = task->reg[RKVDEC_REG_RLC_BASE_INDEX];
 	task->clk_mode = CLK_MODE_NORMAL;
 	/* get resolution info */

commit 25e9738a2bdc6d5251bd95c6766c57d19e0e1edf
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Mon May 17 09:33:56 2021 +0800

    staging: android: ion: support force sync for partial sync
    
    Change-Id: Icfe94628e524d99a36ffc49894266a9fc237e986
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c
index c8f7cfd81d8a..3bc132ee21d5 100644
--- a/drivers/staging/android/ion/ion.c
+++ b/drivers/staging/android/ion/ion.c
@@ -563,7 +563,7 @@ static int ion_dma_buf_end_cpu_access(struct dma_buf *dmabuf,
 }
 
 static int ion_dma_buf_begin_cpu_access_partial(struct dma_buf *dmabuf,
-						enum dma_data_direction dir,
+						enum dma_data_direction direction,
 						unsigned int offset,
 						unsigned int len)
 {
@@ -571,17 +571,27 @@ static int ion_dma_buf_begin_cpu_access_partial(struct dma_buf *dmabuf,
 	struct ion_dma_buf_attachment *a;
 	int ret = 0;
 
-	if (!(buffer->flags & ION_FLAG_CACHED))
-		return 0;
-
 	mutex_lock(&buffer->lock);
+	if (IS_ENABLED(CONFIG_ION_FORCE_DMA_SYNC)) {
+		struct device *dev = ion_dev;
+		struct sg_table *table = buffer->sg_table;
+
+		if (dev) {
+			ret = ion_sgl_sync_range(dev, table->sgl, table->nents,
+						 offset, len, direction, true);
+
+			goto unlock;
+		}
+	}
+
 	list_for_each_entry(a, &buffer->attachments, list) {
 		if (!a->mapped)
 			continue;
 
 		ret = ion_sgl_sync_range(a->dev, a->table->sgl, a->table->nents,
-					 offset, len, dir, true);
+					 offset, len, direction, true);
 	}
+unlock:
 	mutex_unlock(&buffer->lock);
 
 	return ret;
@@ -596,10 +606,19 @@ static int ion_dma_buf_end_cpu_access_partial(struct dma_buf *dmabuf,
 	struct ion_dma_buf_attachment *a;
 	int ret = 0;
 
-	if (!(buffer->flags & ION_FLAG_CACHED))
-		return 0;
-
 	mutex_lock(&buffer->lock);
+	if (IS_ENABLED(CONFIG_ION_FORCE_DMA_SYNC)) {
+		struct device *dev = ion_dev;
+		struct sg_table *table = buffer->sg_table;
+
+		if (dev) {
+			ret = ion_sgl_sync_range(dev, table->sgl, table->nents,
+						 offset, len, direction, false);
+
+			goto unlock;
+		}
+	}
+
 	list_for_each_entry(a, &buffer->attachments, list) {
 		if (!a->mapped)
 			continue;
@@ -607,6 +626,7 @@ static int ion_dma_buf_end_cpu_access_partial(struct dma_buf *dmabuf,
 		ret = ion_sgl_sync_range(a->dev, a->table->sgl, a->table->nents,
 					 offset, len, direction, false);
 	}
+unlock:
 	mutex_unlock(&buffer->lock);
 
 	return ret;

commit 0804113fa359cf6a161ec235f0621e92601665c4
Author: Yu Qiaowei <cerf.yu@rock-chips.com>
Date:   Mon May 17 14:07:51 2021 +0800

    video/rockchip: rga2: support Y400 input.
    
    By making the Y channel and the UV channel's access address equal,
    the function of RGA input grayscale image is realized, without
    need to allocate extra UV channel memory.
    
    Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
    Change-Id: I0110ec6935c7233905e724be3df9f4fba9ef8cf0

diff --git a/drivers/video/rockchip/rga2/rga2_reg_info.c b/drivers/video/rockchip/rga2/rga2_reg_info.c
index ef9ad3fb3b7a..1514c92ab5c4 100644
--- a/drivers/video/rockchip/rga2/rga2_reg_info.c
+++ b/drivers/video/rockchip/rga2/rga2_reg_info.c
@@ -155,6 +155,7 @@ static void RGA2_set_reg_src_info(RK_U8 *base, struct rga2_req *msg)
     RK_U32 *bRGA_SRC_ACT_INFO;
     RK_U32 *bRGA_MASK_ADDR;
 	RK_U32 *bRGA_SRC_TR_COLOR0, *bRGA_SRC_TR_COLOR1;
+	RK_U8 src_fmt_yuv400_en = 0;
 
     RK_U32 reg = 0;
     RK_U8 src0_format = 0;
@@ -268,6 +269,8 @@ static void RGA2_set_reg_src_info(RK_U8 *base, struct rga2_req *msg)
         case RGA2_FORMAT_YCrCb_420_SP_10B : src0_format = 0xa; xdiv = 1; ydiv = 2; src0_cbcr_swp = 1; yuv10 = 1; break;
 		case RGA2_FORMAT_YCbCr_422_SP_10B : src0_format = 0x8; xdiv = 1; ydiv = 1; yuv10 = 1; break;
 		case RGA2_FORMAT_YCrCb_422_SP_10B : src0_format = 0x8; xdiv = 1; ydiv = 1; src0_cbcr_swp = 1; yuv10 = 1; break;
+
+		case RGA2_FORMAT_YCbCr_400 : src0_format = 0x8; src_fmt_yuv400_en = 1; xdiv = 1; ydiv = 1; break;
     };
 
     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SRC_FMT)) | (s_RGA2_SRC_INFO_SW_SRC_FMT(src0_format)));
@@ -310,9 +313,21 @@ static void RGA2_set_reg_src_info(RK_U8 *base, struct rga2_req *msg)
 	}
 #endif
 
-    *bRGA_SRC_BASE0 = (RK_U32)(msg->src.yrgb_addr + msg->src.y_offset * (stride<<2) + msg->src.x_offset * pixel_width);
-    *bRGA_SRC_BASE1 = (RK_U32)(msg->src.uv_addr + (msg->src.y_offset / ydiv) * uv_stride + (msg->src.x_offset / xdiv));
-    *bRGA_SRC_BASE2 = (RK_U32)(msg->src.v_addr + (msg->src.y_offset / ydiv) * uv_stride + (msg->src.x_offset / xdiv));
+    if (src_fmt_yuv400_en == 1) {
+        /*
+         * When Y400 as the input format, because the current RGA does not support closing
+         * the access of the UV channel, the address of the UV channel access is equal to
+         * the address of the Y channel access to ensure that the UV channel can access,
+         * preventing the RGA hardware from reporting errors.
+         */
+        *bRGA_SRC_BASE0 = (RK_U32)(msg->src.yrgb_addr + msg->src.y_offset * (stride<<2) + msg->src.x_offset * pixel_width);
+        *bRGA_SRC_BASE1 = *bRGA_SRC_BASE0;
+        *bRGA_SRC_BASE2 = *bRGA_SRC_BASE0;
+    } else {
+        *bRGA_SRC_BASE0 = (RK_U32)(msg->src.yrgb_addr + msg->src.y_offset * (stride<<2) + msg->src.x_offset * pixel_width);
+        *bRGA_SRC_BASE1 = (RK_U32)(msg->src.uv_addr + (msg->src.y_offset / ydiv) * uv_stride + (msg->src.x_offset / xdiv));
+        *bRGA_SRC_BASE2 = (RK_U32)(msg->src.v_addr + (msg->src.y_offset / ydiv) * uv_stride + (msg->src.x_offset / xdiv));
+    }
 
     //mask_stride = ((msg->src0_act.width + 31) & ~31) >> 5;
     mask_stride = msg->rop_mask_stride;

commit dccc696cc9d770ad789df61e0d5d9996845fd6bc
Author: Alex Zhao <zzc@rock-chips.com>
Date:   Fri May 14 09:15:19 2021 +0800

    net: rockchip_wlan: rtl8821cs: disable CONFIG_ERROR_STATE_MONITOR
    
    Signed-off-by: Alex Zhao <zzc@rock-chips.com>
    Change-Id: Id9afa007304fe9a6be379e6393da66fdeda48fd0

diff --git a/drivers/net/wireless/rockchip_wlan/rtl8821cs/include/autoconf.h b/drivers/net/wireless/rockchip_wlan/rtl8821cs/include/autoconf.h
index 3a877a728cb3..a4dc0c107d4f 100644
--- a/drivers/net/wireless/rockchip_wlan/rtl8821cs/include/autoconf.h
+++ b/drivers/net/wireless/rockchip_wlan/rtl8821cs/include/autoconf.h
@@ -27,7 +27,7 @@
 /*#define DBG_XMIT_BLOCK*/
 
 /*#define DBG_RX_COUNTER_DUMP*/
-#define CONFIG_ERROR_STATE_MONITOR
+/* #define CONFIG_ERROR_STATE_MONITOR */
 /*#define CONFIG_MONITOR_OVERFLOW*/
 
 #define CONFIG_SDIO_INDIRECT_ACCESS

commit 495049b0b780ddd87749f108ee28d055f7de6a17
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Sun May 16 21:08:43 2021 +0800

    drm/rockchip: vop2: check win_mask for each plane on crtc
    
    win_mask is more safe than plane_mask on crtc_state,
    because crtc_state may changed by many interface.
    
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>
    Change-Id: I886c8e1e1c0505e46292721de05d9be7c167d956

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index ebe884e2aa9d..0bce63db5a6b 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -1683,11 +1683,12 @@ static bool vop2_is_allwin_disabled(struct drm_crtc *crtc)
 {
 	struct vop2_video_port *vp = to_vop2_video_port(crtc);
 	struct vop2 *vop2 = vp->vop2;
-	struct drm_plane *plane;
+	unsigned long win_mask = vp->win_mask;
 	struct vop2_win *win;
+	int phys_id;
 
-	drm_atomic_crtc_for_each_plane(plane, crtc) {
-		win = to_vop2_win(plane);
+	for_each_set_bit(phys_id, &win_mask, ROCKCHIP_MAX_LAYER) {
+		win = vop2_find_win_by_phys_id(vop2, phys_id);
 		if (VOP_WIN_GET(vop2, win, enable) != 0)
 			return false;
 	}
@@ -1699,13 +1700,14 @@ static void vop2_disable_all_planes_for_crtc(struct drm_crtc *crtc)
 {
 	struct vop2_video_port *vp = to_vop2_video_port(crtc);
 	struct vop2 *vop2 = vp->vop2;
-	struct drm_plane *plane;
 	struct vop2_win *win;
+	unsigned long win_mask = vp->win_mask;
+	int phys_id, ret;
 	bool active;
-	int ret;
 
-	drm_atomic_crtc_for_each_plane(plane, crtc) {
-		win = to_vop2_win(plane);
+
+	for_each_set_bit(phys_id, &win_mask, ROCKCHIP_MAX_LAYER) {
+		win = vop2_find_win_by_phys_id(vop2, phys_id);
 		vop2_win_disable(win);
 	}
 	vop2_cfg_done(crtc);

commit c83a7134e3e814b27d9fd5e734e559ef4cc7e113
Author: Alessio Balsini <balsini@google.com>
Date:   Fri May 14 10:39:06 2021 +0100

    ANDROID: FUSE OWNERS pointing to android-mainline OWNERS
    
    This was generated with:
      $ build/synchronize_owners common-mainline/ android-mainline \
          common11-5.4 common12-5.10 common12-5.4 common-4.19-stable
    
    Test: none
    Bug: 188034287
    Signed-off-by: Alessio Balsini <balsini@google.com>
    Change-Id: Iaf020cae75ab47aa12e64bfdfbc8d76efd74880b

diff --git a/fs/fuse/OWNERS b/fs/fuse/OWNERS
new file mode 100644
index 000000000000..6c04da7a65d5
--- /dev/null
+++ b/fs/fuse/OWNERS
@@ -0,0 +1,2 @@
+# include OWNERS from the authoritative android-mainline branch
+include kernel/common:android-mainline:/fs/fuse/OWNERS

commit 3b9546b82486d62368561d30057e7cb031c7fc03
Author: William Wu <william.wu@rock-chips.com>
Date:   Fri May 14 14:37:55 2021 +0800

    usb: gadget: f_uac1: fix ep address for get sample rate
    
    The f_uac1 use ep address 0x81 and 0x01 to get sample rate,
    so it can only support uac1 ep1-in and ep1-out to get playback
    and capture sample rate, it has limitation for USB composite
    device (e.g. RNDIS & UAC1). This patch use in_ep->address and
    out_ep->address instead of the fixed addresses.
    
    Signed-off-by: William Wu <william.wu@rock-chips.com>
    Change-Id: Ia1a454d9738324605c00c4889b3fe187fdfcdb7d

diff --git a/drivers/usb/gadget/function/f_uac1.c b/drivers/usb/gadget/function/f_uac1.c
index 17e8c134f623..0fb9ee5f502f 100644
--- a/drivers/usb/gadget/function/f_uac1.c
+++ b/drivers/usb/gadget/function/f_uac1.c
@@ -556,9 +556,9 @@ static int audio_get_endpoint_req(struct usb_function *f,
 	switch (ctrl->bRequest) {
 	case UAC_GET_CUR: {
 		if (cs == UAC_EP_CS_ATTR_SAMPLE_RATE) {
-			if (ep == (USB_DIR_IN | 1))
+			if (ep == agdev->in_ep->address)
 				val = opts->p_srate_active;
-			else if (ep == (USB_DIR_OUT | 1))
+			else if (ep == agdev->out_ep->address)
 				val = opts->c_srate_active;
 			buf[2] = (val >> 16) & 0xff;
 			buf[1] = (val >> 8) & 0xff;

commit adc4b01322330e774bac1325ccc7cf5b54141e68
Author: William Wu <william.wu@rock-chips.com>
Date:   Fri May 14 11:38:24 2021 +0800

    usb: gadget: f_uvc: not handle alt 0 for bulk streaming intf
    
    Because alt settings in an interface are supported only
    for ISOC endpoints, so do not handle alt 0 for bulk
    streaming interface.
    
    Change-Id: Iadcf6c058023d5a3d6caa353cd783752f84a77a9
    Signed-off-by: William Wu <william.wu@rock-chips.com>

diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c
index 708fa503fe76..36d0ccc15626 100644
--- a/drivers/usb/gadget/function/f_uvc.c
+++ b/drivers/usb/gadget/function/f_uvc.c
@@ -486,6 +486,11 @@ uvc_function_set_alt(struct usb_function *f, unsigned interface, unsigned alt)
 			return 0;
 
 		case UVC_STATE_STREAMING:
+			if (!alt) {
+				INFO(cdev, "bulk streaming intf not support alt 0\n");
+				return 0;
+			}
+
 			if (uvc->video.ep &&
 			    uvc->video.ep->enabled) {
 				ret = usb_ep_disable(uvc->video.ep);

commit 96764dff334ff89781ce0b77596fd474040cfc05
Author: Caesar Wang <wxt@rock-chips.com>
Date:   Tue May 11 14:13:27 2021 +0800

    arm64: dts: rockchip: remove the duplicate pmu_io_domains on rk3399-evb-ind.dtsi
    
    Signed-off-by: Caesar Wang <wxt@rock-chips.com>
    Change-Id: Id42f1e425a6015ac11851decd3a36d80b23b30e5

diff --git a/arch/arm64/boot/dts/rockchip/rk3399-evb-ind.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-evb-ind.dtsi
index 7326096b85c6..0f809f490d5f 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-evb-ind.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399-evb-ind.dtsi
@@ -929,11 +929,6 @@
 	gpio1830-supply = <&vcc_3v0>;		/* gpio1833_gpio4cd_ms */
 };
 
-&pmu_io_domains {
-	pmu1830-supply = <&vcc_1v8>;
-	status = "okay";
-};
-
 &isp0_mmu {
 	status = "okay";
 };

commit b39c718938c823c3febe58adb2255adb7a103a54
Author: Ding Wei <leo.ding@rock-chips.com>
Date:   Wed May 12 15:33:31 2021 +0800

    arm64: dts: rockchip: rk3328: add normal and advanced rates for rkvdec
    
    when pixels less then default-max-load, use normal-rates,
    otherwise, use advanced-rates instead.
    
    Change-Id: Ie2d58c05a2e8d2f5e5f9d932b3e51024b48b91d2
    Signed-off-by: Ding Wei <leo.ding@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
index 19cdeab6e196..d059409263f8 100644
--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
@@ -856,6 +856,9 @@
 			<&cru SCLK_VDEC_CABAC>, <&cru SCLK_VDEC_CORE>;
 		clock-names = "aclk_vcodec", "hclk_vcodec", "clk_cabac",
 			"clk_core";
+		rockchip,normal-rates = <300000000>, <0>, <300000000>, <300000000>;
+		rockchip,advanced-rates = <400000000>, <0>, <400000000>, <300000000>;
+		rockchip,default-max-load = <2088960>;
 		resets = <&cru SRST_VDEC_A>, <&cru SRST_VDEC_H>,
 			<&cru SRST_VDEC_NIU_A>, <&cru SRST_VDEC_NIU_H>,
 			<&cru SRST_VDEC_CABAC>, <&cru SRST_VDEC_CORE>;

commit 573d2e1e2e4b4fbf243f178f36b4328fbf535cf9
Author: William Wu <william.wu@rock-chips.com>
Date:   Thu May 13 11:59:21 2021 +0800

    usb: gadget: f_uac1: finalize wMaxPacketSize according to bandwidth
    
    According to USB Audio Device 1.0 Spec, Ch4.6.1.1:
    The wMaxPacketSize of endpoint is defined as follows:
    Maximum packet size of endpoint is capable of sending
    or receiving when this configuration is selected. This
    is determined by the audio bandwidth constraints of
    the endpoint.
    
    In current code, the wMaxPacketSize is limited to 200,
    and the bInterval is set to 4 (1ms). That is, the maximum
    bandwidth over USB bus is 200 * 1000 = 200000 bytes.
    
    We find an issue about bandwidth limitation when we try to
    support UAC1 with 8ch * 16bit * 16KHz on RK3308 platform,
    which needs more bandwidth than it can support.
    
    This patch sets the wMaxPacketSize dynamically according
    to the parameters of UAC1. It is similar to the same thing
    done earlier for f_uac2.
    
    Change-Id: I9af3fd7665a80b5eb0cfb5dc91ebe2c20df1dd46
    Signed-off-by: William Wu <william.wu@rock-chips.com>

diff --git a/drivers/usb/gadget/function/f_uac1.c b/drivers/usb/gadget/function/f_uac1.c
index 94d30bf13991..17e8c134f623 100644
--- a/drivers/usb/gadget/function/f_uac1.c
+++ b/drivers/usb/gadget/function/f_uac1.c
@@ -246,7 +246,7 @@ static struct usb_endpoint_descriptor as_out_ep_desc  = {
 	.bEndpointAddress =	USB_DIR_OUT,
 	.bmAttributes =		USB_ENDPOINT_SYNC_ADAPTIVE
 				| USB_ENDPOINT_XFER_ISOC,
-	.wMaxPacketSize	=	cpu_to_le16(UAC1_OUT_EP_MAX_PACKET_SIZE),
+	/* .wMaxPacketSize = DYNAMIC */
 	.bInterval =		4,
 };
 
@@ -277,7 +277,7 @@ static struct usb_endpoint_descriptor as_in_ep_desc  = {
 	.bEndpointAddress =	USB_DIR_IN,
 	.bmAttributes =		USB_ENDPOINT_SYNC_ASYNC
 				| USB_ENDPOINT_XFER_ISOC,
-	.wMaxPacketSize	=	cpu_to_le16(UAC1_OUT_EP_MAX_PACKET_SIZE),
+	/* .wMaxPacketSize = DYNAMIC */
 	.bInterval =		4,
 };
 
@@ -808,6 +808,57 @@ static void setup_descriptor(struct f_uac_opts *opts)
 	f_audio_desc[i++] = NULL;
 }
 
+static int set_ep_max_packet_size(const struct f_uac_opts *opts,
+	struct usb_endpoint_descriptor *ep_desc,
+	enum usb_device_speed speed, bool is_playback)
+{
+	int chmask, srate = 0, ssize;
+	u16 max_size_bw, max_size_ep;
+	unsigned int factor;
+	int i;
+
+	switch (speed) {
+	case USB_SPEED_FULL:
+		max_size_ep = 1023;
+		factor = 1000;
+		break;
+
+	case USB_SPEED_HIGH:
+		max_size_ep = 1024;
+		factor = 8000;
+		break;
+
+	default:
+		return -EINVAL;
+	}
+
+	if (is_playback) {
+		chmask = opts->p_chmask;
+		for (i = 0; i < UAC_MAX_RATES; i++) {
+			if (opts->p_srate[i] == 0)
+				break;
+			if (opts->p_srate[i] > srate)
+				srate = opts->p_srate[i];
+		}
+		ssize = opts->p_ssize;
+	} else {
+		chmask = opts->c_chmask;
+		for (i = 0; i < UAC_MAX_RATES; i++) {
+			if (opts->c_srate[i] == 0)
+				break;
+			if (opts->c_srate[i] > srate)
+				srate = opts->c_srate[i];
+		}
+		ssize = opts->c_ssize;
+	}
+
+	max_size_bw = num_channels(chmask) * ssize *
+		((srate / (factor / (1 << (ep_desc->bInterval - 1)))) + 1);
+	ep_desc->wMaxPacketSize = cpu_to_le16(min_t(u16, max_size_bw,
+						    max_size_ep));
+
+	return 0;
+}
 
 /* audio function driver setup/binding */
 static int f_audio_bind(struct usb_configuration *c, struct usb_function *f)
@@ -819,6 +870,7 @@ static int f_audio_bind(struct usb_configuration *c, struct usb_function *f)
 	struct f_uac_opts		*audio_opts;
 	struct usb_ep			*ep = NULL;
 	struct usb_string		*us;
+	struct device			*dev = &gadget->dev;
 	int				status;
 	int				idx, i;
 
@@ -862,6 +914,27 @@ static int f_audio_bind(struct usb_configuration *c, struct usb_function *f)
 		memcpy(as_out_type_i_desc.tSamFreq[idx++],
 				&audio_opts->c_srate[i], 3);
 	}
+
+	/*
+	 * Calculate wMaxPacketSize according to audio bandwidth.
+	 * Set the max packet with USB_SPEED_HIGH by default to
+	 * be compatible with larger bandwidth requirements for
+	 * high speed mode.
+	 */
+	status = set_ep_max_packet_size(audio_opts, &as_out_ep_desc,
+					USB_SPEED_HIGH, false);
+	if (status < 0) {
+		dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
+		goto fail;
+	}
+
+	status = set_ep_max_packet_size(audio_opts, &as_in_ep_desc,
+					USB_SPEED_HIGH, true);
+	if (status < 0) {
+		dev_err(dev, "%s:%d Error!\n", __func__, __LINE__);
+		goto fail;
+	}
+
 	as_out_type_i_desc.bLength = UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(idx);
 	as_out_type_i_desc.bSamFreqType = idx;
 

commit 3a54d14600b09517576bca22a579b67d1d811d8d
Author: Cai YiWei <cyw@rock-chips.com>
Date:   Thu May 13 15:27:01 2021 +0800

    media: rockchip: ispp: fix page fault due to config reg during working
    
    Change-Id: Ie5e23fc0e79a946b692278fc28b4a7794fe1a5f4
    Signed-off-by: Cai YiWei <cyw@rock-chips.com>

diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c
index b2fe994d4c43..fb2908a78794 100644
--- a/drivers/media/platform/rockchip/ispp/stream.c
+++ b/drivers/media/platform/rockchip/ispp/stream.c
@@ -1174,10 +1174,14 @@ static int is_stopped_ii(struct rkispp_stream *stream)
 static void secure_config_mb(struct rkispp_stream *stream)
 {
 	struct rkispp_device *dev = stream->isppdev;
-	u32 limit_range;
+	u32 limit_range, mult = 1;
 
 	/* enable dma immediately, config in idle state */
 	switch (stream->last_module) {
+	case ISPP_MODULE_TNR:
+		rkispp_set_bits(dev, RKISPP_TNR_CTRL, FMT_WR_MASK,
+				SW_TNR_1ST_FRM | stream->out_cap_fmt.wr_fmt << 4);
+		break;
 	case ISPP_MODULE_NR:
 	case ISPP_MODULE_SHP:
 		limit_range = (stream->out_fmt.quantization != V4L2_QUANTIZATION_LIM_RANGE) ?
@@ -1199,13 +1203,23 @@ static void secure_config_mb(struct rkispp_stream *stream)
 	default:
 		break;
 	}
+
+	if (stream->out_cap_fmt.wr_fmt & FMT_YUYV)
+		mult = 2;
+	else if (stream->out_cap_fmt.wr_fmt & FMT_FBC)
+		mult = 0;
+	set_vir_stride(stream, ALIGN(stream->out_fmt.width * mult, 16) >> 2);
+
+	/* config first buf */
+	rkispp_frame_end(stream);
+
 	stream->is_cfg = true;
 }
 
 static int config_mb(struct rkispp_stream *stream)
 {
 	struct rkispp_device *dev = stream->isppdev;
-	u32 i, mult = 1;
+	u32 i;
 
 	for (i = ISPP_MODULE_FEC; i > 0; i = i >> 1) {
 		if (dev->stream_vdev.module_ens & i)
@@ -1223,8 +1237,6 @@ static int config_mb(struct rkispp_stream *stream)
 		stream->config->reg.cur_vir_stride = RKISPP_TNR_WR_VIR_STRIDE;
 		stream->config->reg.cur_y_base_shd = RKISPP_TNR_WR_Y_BASE_SHD;
 		stream->config->reg.cur_uv_base_shd = RKISPP_TNR_WR_UV_BASE_SHD;
-		rkispp_set_bits(dev, RKISPP_TNR_CTRL, FMT_WR_MASK,
-				SW_TNR_1ST_FRM | stream->out_cap_fmt.wr_fmt << 4);
 		break;
 	case ISPP_MODULE_NR:
 	case ISPP_MODULE_SHP:
@@ -1243,14 +1255,6 @@ static int config_mb(struct rkispp_stream *stream)
 		stream->config->reg.cur_y_base_shd = RKISPP_FEC_WR_Y_BASE_SHD;
 		stream->config->reg.cur_uv_base_shd = RKISPP_FEC_WR_UV_BASE_SHD;
 	}
-	if (stream->out_cap_fmt.wr_fmt & FMT_YUYV)
-		mult = 2;
-	else if (stream->out_cap_fmt.wr_fmt & FMT_FBC)
-		mult = 0;
-	set_vir_stride(stream, ALIGN(stream->out_fmt.width * mult, 16) >> 2);
-
-	/* config first buf */
-	rkispp_frame_end(stream);
 
 	if (dev->ispp_sdev.state == ISPP_STOP)
 		secure_config_mb(stream);

commit 0071ffb064c58661fc074a44be0fe90ed13a2496
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Tue May 11 15:20:27 2021 +0800

    drm/rockchip: vop2: fix calculation error
    
    fix calculation error and add double check done bit
    
    Change-Id: I23852ff0c6cca0efef2eb52257d499bb99dbe009
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 099d78f90816..ebe884e2aa9d 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -686,8 +686,12 @@ static inline void vop2_mask_write(struct vop2 *vop2, uint32_t offset,
 
 static inline u32 vop2_line_to_time(struct drm_display_mode *mode, int line)
 {
-	/* us */
-	return 1000000 / mode->crtc_clock * mode->crtc_htotal / 1000 * line;
+	u64 val = 1000000000ULL * mode->crtc_htotal * line;
+
+	do_div(val, mode->crtc_clock);
+	do_div(val, 1000000);
+
+	return val; /* us */
 }
 
 static bool vop2_soc_is_rk3566(void)
@@ -1006,6 +1010,13 @@ static int32_t vop2_pending_done_bits(struct vop2_video_port *vp)
 			wait_vp = second_done_vp;
 
 		vop2_wait_for_fs_by_raw_status(wait_vp);
+
+		done_bits = vop2_readl(vop2, RK3568_REG_CFG_DONE) & 0x7;
+		if (done_bits) {
+			vp_id = ffs(done_bits) - 1;
+			done_vp = &vop2->vps[vp_id];
+			vop2_wait_for_fs_by_raw_status(done_vp);
+		}
 		done_bits = 0;
 	}
 	return done_bits;

commit d0f1327e768b65fb7fb47257c18073d1da7a8f8b
Author: Ruslan Bilovol <ruslan.bilovol@gmail.com>
Date:   Mon Mar 1 13:49:31 2021 +0200

    UPSTREAM: usb: gadget: f_uac2: always increase endpoint max_packet_size by one audio slot
    
    As per UAC2 Audio Data Formats spec (2.3.1.1 USB Packets),
    if the sampling rate is a constant, the allowable variation
    of number of audio slots per virtual frame is +/- 1 audio slot.
    
    It means that endpoint should be able to accept/send +1 audio
    slot.
    
    Previous endpoint max_packet_size calculation code
    was adding sometimes +1 audio slot due to DIV_ROUND_UP
    behaviour which was rounding up to closest integer.
    However this doesn't work if the numbers are divisible.
    
    It had no any impact with Linux hosts which ignore
    this issue, but in case of more strict Windows it
    caused rejected enumeration
    
    Thus always add +1 audio slot to endpoint's max packet size
    
    Change-Id: I3bef24e77d5d9dfc11438da24664192753e2cac4
    Fixes: 913e4a90b6f9 ("usb: gadget: f_uac2: finalize wMaxPacketSize according to bandwidth")
    Cc: Peter Chen <peter.chen@freescale.com>
    Cc: <stable@vger.kernel.org> #v4.3+
    Signed-off-by: Ruslan Bilovol <ruslan.bilovol@gmail.com>
    Link: https://lore.kernel.org/r/1614599375-8803-2-git-send-email-ruslan.bilovol@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: William Wu <william.wu@rock-chips.com>
    (cherry picked from commit 789ea77310f0200c84002884ffd628e2baf3ad8a)

diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c
index 6745361c8d4a..62cd056a911b 100644
--- a/drivers/usb/gadget/function/f_uac2.c
+++ b/drivers/usb/gadget/function/f_uac2.c
@@ -571,7 +571,7 @@ static int set_ep_max_packet_size(const struct f_uac_opts *uac2_opts,
 	}
 
 	max_size_bw = num_channels(chmask) * ssize *
-		DIV_ROUND_UP(srate, factor / (1 << (ep_desc->bInterval - 1)));
+		((srate / (factor / (1 << (ep_desc->bInterval - 1)))) + 1);
 	ep_desc->wMaxPacketSize = cpu_to_le16(min_t(u16, max_size_bw,
 						    max_size_ep));
 

commit 1a81ee3e2d3726b9382ff2c48d08f4d837bc0143
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Mon May 10 16:52:04 2021 +0800

    drm/rockchip: gem: add flag ROCKCHIP_BO_ALLOC_KMAP to assign kmap
    
    RGA need to access CMA buffer at kernel space, so add this flag to keep kernel
    line mapping for RGA.
    
    Change-Id: Ia59acee3c904a495792229a80c42f74ae34200e3
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
index ef49d5e46736..fd98fc2443c1 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
@@ -721,8 +721,9 @@ rockchip_gem_create_with_handle(struct drm_file *file_priv,
 	struct rockchip_gem_object *rk_obj;
 	struct drm_gem_object *obj;
 	int ret;
+	bool alloc_kmap = flags & ROCKCHIP_BO_ALLOC_KMAP ? true : false;
 
-	rk_obj = rockchip_gem_create_object(drm, size, false, flags);
+	rk_obj = rockchip_gem_create_object(drm, size, alloc_kmap, flags);
 	if (IS_ERR(rk_obj))
 		return ERR_CAST(rk_obj);
 
diff --git a/include/uapi/drm/rockchip_drm.h b/include/uapi/drm/rockchip_drm.h
index 6b7fb33d6379..a4625642736d 100644
--- a/include/uapi/drm/rockchip_drm.h
+++ b/include/uapi/drm/rockchip_drm.h
@@ -26,6 +26,8 @@ enum drm_rockchip_gem_mem_type {
 	/* write-combine mapping. */
 	ROCKCHIP_BO_WC		= 1 << 2,
 	ROCKCHIP_BO_SECURE	= 1 << 3,
+	/* keep kmap for cma buffer or alloc kmap for other type memory */
+	ROCKCHIP_BO_ALLOC_KMAP	= 1 << 4,
 	ROCKCHIP_BO_MASK	= ROCKCHIP_BO_CONTIG | ROCKCHIP_BO_CACHABLE |
 				ROCKCHIP_BO_WC
 };

commit 425876baa87d867532d953f9b7004fe6144acc92
Author: Rikard Falkeborn <rikard.falkeborn@gmail.com>
Date:   Sat Apr 25 22:38:13 2020 +0200

    UPSTREAM: pinctrl: rk805: Constify rk805_gpio_cfgs
    
    Mark pin_cfg as const, allowing the compiler to put the struct in
    .rodata instead of .data.
    
    Change-Id: Iffdf034cf756d73f3e4c050a1ac6a7a325299c29
    Signed-off-by: Rikard Falkeborn <rikard.falkeborn@gmail.com>
    Link: https://lore.kernel.org/r/20200425203813.6442-1-rikard.falkeborn@gmail.com
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    (cherry picked from commit 8068071c09e546e6c13e728da0531b56917802e7)

diff --git a/drivers/pinctrl/pinctrl-rk805.c b/drivers/pinctrl/pinctrl-rk805.c
index a334dc5fc6c3..b0ce5a410930 100644
--- a/drivers/pinctrl/pinctrl-rk805.c
+++ b/drivers/pinctrl/pinctrl-rk805.c
@@ -77,7 +77,7 @@ struct rk805_pctrl_info {
 	int num_pin_groups;
 	const struct pinctrl_pin_desc *pins;
 	unsigned int num_pins;
-	struct rk805_pin_config *pin_cfg;
+	const struct rk805_pin_config *pin_cfg;
 };
 
 enum rk805_pinmux_option {
@@ -126,7 +126,7 @@ static const struct rk805_pin_group rk805_pin_groups[] = {
 #define RK805_GPIO0_VAL_MSK	BIT(0)
 #define RK805_GPIO1_VAL_MSK	BIT(1)
 
-static struct rk805_pin_config rk805_gpio_cfgs[] = {
+static const struct rk805_pin_config rk805_gpio_cfgs[] = {
 	{
 		.reg = RK805_OUT_REG,
 		.val_msk = RK805_GPIO0_VAL_MSK,

commit d20b7443fa0a8ce4aab28b2c5b9cae8fefd2743c
Author: Nishka Dasgupta <nishkadg.linux@gmail.com>
Date:   Mon Aug 19 13:27:57 2019 +0530

    UPSTREAM: pinctrl: rk805: Make structures constant
    
    Static structures rk805_pinctrl_desc and rk805_gpio_chip, of types
    gpio_chip and pinctrl_desc respectively, are not used except to be
    copied into the fields of a different variable. Hence make
    rk805_pinctrl_desc and rk805_gpio_chip both constant to protect them
    from unintended modification.
    Issue found with Coccinelle.
    
    Change-Id: I63bf61b6aecaa095495157cd9eca6d8db5580fb8
    Signed-off-by: Nishka Dasgupta <nishkadg.linux@gmail.com>
    Link: https://lore.kernel.org/r/20190819075757.1753-1-nishkadg.linux@gmail.com
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    (cherry picked from commit 6e28aaab07c19fb97cedea9840ef796f1a772350)

diff --git a/drivers/pinctrl/pinctrl-rk805.c b/drivers/pinctrl/pinctrl-rk805.c
index 305daba675be..a334dc5fc6c3 100644
--- a/drivers/pinctrl/pinctrl-rk805.c
+++ b/drivers/pinctrl/pinctrl-rk805.c
@@ -360,7 +360,7 @@ static int rk805_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
 	return !(val & pci->pin_cfg[offset].dir_msk);
 }
 
-static struct gpio_chip rk805_gpio_chip = {
+static const struct gpio_chip rk805_gpio_chip = {
 	.label			= "rk805-gpio",
 	.request		= gpiochip_generic_request,
 	.free			= gpiochip_generic_free,
@@ -653,7 +653,7 @@ static const struct pinconf_ops rk805_pinconf_ops = {
 	.pin_config_set = rk805_pinconf_set,
 };
 
-static struct pinctrl_desc rk805_pinctrl_desc = {
+static const struct pinctrl_desc rk805_pinctrl_desc = {
 	.name = "rk805-pinctrl",
 	.pctlops = &rk805_pinctrl_ops,
 	.pmxops = &rk805_pinmux_ops,

commit 596d1eb25c179136f7180d6435d3da6dcb998868
Author: Andy Yan <andy.yan@rock-chips.com>
Date:   Wed May 12 10:06:41 2021 +0800

    drm/rockchip: vop2: Fix color_key_en register definition
    
    It's a copy and paste mistake.
    
    Change-Id: Ica36201dc9b463f2ff7dd6adb8253d09be66bf37
    Signed-off-by: Andy Yan <andy.yan@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
index e7787297d8b2..835571bbbc22 100644
--- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
+++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
@@ -980,7 +980,7 @@ static const struct vop2_win_regs rk3568_esmart_win_data = {
 	.csc_mode = VOP_REG(RK3568_ESMART0_CTRL0, 0x3, 2),
 	.ymirror = VOP_REG(RK3568_ESMART0_CTRL1, 0x1, 31),
 	.color_key = VOP_REG(RK3568_ESMART0_COLOR_KEY_CTRL, 0x3fffffff, 0),
-	.color_key_en = VOP_REG(RK3366_LIT_WIN0_COLOR_KEY, 0x1, 31),
+	.color_key_en = VOP_REG(RK3568_ESMART0_COLOR_KEY_CTRL, 0x1, 31),
 };
 
 /*

commit 4e73c1a9592ac3877b6bf5ed94d67910e227148e
Author: Alpha Lin <alpha.lin@rock-chips.com>
Date:   Tue May 11 08:25:24 2021 +0800

    rockchip: video: iep: enable blending and intra interp
    
    Enable blending and intra interpolation by default.
    
    Change-Id: I3f304714d630b4aab677ab6d09cfea514b03d7b1
    Signed-off-by: Alpha Lin <alpha.lin@rock-chips.com>

diff --git a/drivers/video/rockchip/mpp/mpp_iep2.c b/drivers/video/rockchip/mpp/mpp_iep2.c
index b116dd752bf3..6c193b97aa0f 100644
--- a/drivers/video/rockchip/mpp/mpp_iep2.c
+++ b/drivers/video/rockchip/mpp/mpp_iep2.c
@@ -381,6 +381,8 @@ static void iep2_config(struct mpp_dev *mpp, struct iep_task *task)
 
 	reg = IEP2_REG_DIL_MV_HIST_EN
 		| IEP2_REG_DIL_COMB_EN
+		| IEP2_REG_DIL_BLE_EN
+		| IEP2_REG_DIL_EEDI_EN
 		| IEP2_REG_DIL_MEMC_EN
 		| IEP2_REG_DIL_OSD_EN
 		| IEP2_REG_DIL_PD_EN
diff --git a/drivers/video/rockchip/mpp/rockchip_iep2_regs.h b/drivers/video/rockchip/mpp/rockchip_iep2_regs.h
index 8734bbddeaac..77d09a8f871f 100644
--- a/drivers/video/rockchip/mpp/rockchip_iep2_regs.h
+++ b/drivers/video/rockchip/mpp/rockchip_iep2_regs.h
@@ -61,6 +61,8 @@
 #define     IEP2_REG_DIL_MV_HIST_EN			BIT(17)
 #define     IEP2_REG_DIL_ROI_EN				BIT(16)
 #define     IEP2_REG_DIL_COMB_EN			BIT(15)
+#define     IEP2_REG_DIL_BLE_EN				BIT(14)
+#define     IEP2_REG_DIL_EEDI_EN			BIT(13)
 #define     IEP2_REG_DIL_MEMC_EN			BIT(12)
 #define     IEP2_REG_DIL_OSD_EN				BIT(11)
 #define     IEP2_REG_DIL_PD_EN				BIT(10)

commit 9c21d0a139aa5687786277d2521ced4fb3778cd8
Author: Shawn Lin <shawn.lin@rock-chips.com>
Date:   Mon May 10 15:32:49 2021 +0800

    mmc: dw_mmc: remove CMD23 support for sd cards
    
    Some sd cards violate the spec. They claim to support CMD23
    but actually not. We don't have a good method to work around
    them except for adding MMC_QUIRK_BLK_NO_CMD23 one by one. But
    it's not a acceptable way for our custmors. So removing CMD23
    support for all sd cards to solve it.
    
    Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
    Change-Id: I006ee5d6c0035aed114cbdaac36cc854b9135f60

diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
index 02cbd6a47906..bbd85c451a6c 100644
--- a/drivers/mmc/host/dw_mmc.c
+++ b/drivers/mmc/host/dw_mmc.c
@@ -2871,7 +2871,15 @@ static int dw_mci_init_slot_caps(struct dw_mci_slot *slot)
 				ctrl_id);
 			return -EINVAL;
 		}
-		mmc->caps |= drv_data->caps[ctrl_id];
+		/*
+		 * Some sd cards violate the spec. They claim to support
+		 * CMD23 but actually not. We don't have a good method to
+		 * work around them except for adding MMC_QUIRK_BLK_NO_CMD23
+		 * one by one. But it's not a acceptable way for our custmors.
+		 * So removing CMD23 support for all sd cards to solve it.
+		 */
+		if (!(mmc->restrict_caps & RESTRICT_CARD_TYPE_SD))
+			mmc->caps |= drv_data->caps[ctrl_id];
 	}
 
 	if (host->pdata->caps2)

commit d4afea393158ecbf206c86599c693be7b8e896cf
Author: Zefa Chen <zefa.chen@rock-chips.com>
Date:   Mon May 10 16:13:56 2021 +0800

    media: i2c: imx317 fixed g_mbus_config error
    
    Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
    Change-Id: I5e66d8f19740bb5c309b037fc6e706fc8b215b15

diff --git a/drivers/media/i2c/imx317.c b/drivers/media/i2c/imx317.c
index 0a58644e193e..3540fcc047bb 100644
--- a/drivers/media/i2c/imx317.c
+++ b/drivers/media/i2c/imx317.c
@@ -1191,8 +1191,9 @@ static int imx317_g_mbus_config(struct v4l2_subdev *sd,
 				struct v4l2_mbus_config *config)
 {
 	u32 val = 0;
+	struct imx317 *imx317 = to_imx317(sd);
 
-	val = 1 << (IMX317_LANES - 1) |
+	val = 1 << (imx317->lane_num - 1) |
 	      V4L2_MBUS_CSI2_CHANNEL_0 |
 	      V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
 	config->type = V4L2_MBUS_CSI2;

commit a2c5a95d599c9b4a864d97520df42baefbfdb822
Author: Quentin Perret <qperret@google.com>
Date:   Fri Apr 30 15:14:12 2021 +0000

    UPSTREAM: sched: Fix out-of-bound access in uclamp
    
    Util-clamp places tasks in different buckets based on their clamp values
    for performance reasons. However, the size of buckets is currently
    computed using a rounding division, which can lead to an off-by-one
    error in some configurations.
    
    For instance, with 20 buckets, the bucket size will be 1024/20=51. A
    task with a clamp of 1024 will be mapped to bucket id 1024/51=20. Sadly,
    correct indexes are in range [0,19], hence leading to an out of bound
    memory access.
    
    Clamp the bucket id to fix the issue.
    
    Bug: 186415778
    Fixes: 69842cba9ace ("sched/uclamp: Add CPU's clamp buckets refcounting")
    Suggested-by: Qais Yousef <qais.yousef@arm.com>
    Signed-off-by: Quentin Perret <qperret@google.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org>
    Reviewed-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
    Link: https://lkml.kernel.org/r/20210430151412.160913-1-qperret@google.com
    (cherry picked from commit 6d2f8909a5fabb73fe2a63918117943986c39b6c)
    Signed-off-by: Quentin Perret <qperret@google.com>
    Change-Id: I8097f5ed34abcff36c5ed395643d65727ea969eb

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 6334ed78ed5a..d2bbb1e55bdf 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -757,7 +757,7 @@ static struct uclamp_se uclamp_default[UCLAMP_CNT];
 
 static inline unsigned int uclamp_bucket_id(unsigned int clamp_value)
 {
-	return clamp_value / UCLAMP_BUCKET_DELTA;
+	return min_t(unsigned int, clamp_value / UCLAMP_BUCKET_DELTA, UCLAMP_BUCKETS - 1);
 }
 
 static inline unsigned int uclamp_bucket_base_value(unsigned int clamp_value)

commit 879d0f3293c12173c8faa2928e9026eb2bcc033b
Author: Dingxian Wen <shawn.wen@rock-chips.com>
Date:   Sat May 8 20:20:49 2021 +0800

    ARM: dts: rockchip: rk3288-evb-rk628-hdmi2csi-avb: enable isp_mmu
    
    Signed-off-by: Dingxian Wen <shawn.wen@rock-chips.com>
    Change-Id: I50eabee85a9e751c64ce80c5f1e13ff360ca8651

diff --git a/arch/arm/boot/dts/rk3288-evb-rk628-hdmi2csi-avb.dts b/arch/arm/boot/dts/rk3288-evb-rk628-hdmi2csi-avb.dts
index 2dedad2a8efe..be8b10aac823 100644
--- a/arch/arm/boot/dts/rk3288-evb-rk628-hdmi2csi-avb.dts
+++ b/arch/arm/boot/dts/rk3288-evb-rk628-hdmi2csi-avb.dts
@@ -124,3 +124,7 @@
 		};
 	};
 };
+
+&isp_mmu {
+	status = "okay";
+};

commit 8d8cdba8b7d84a71d5ef979304710ac96489e8b8
Author: Dingxian Wen <shawn.wen@rock-chips.com>
Date:   Wed Apr 28 16:25:13 2021 +0800

    media: i2c: rk628csi: upgrade the driver version to v0.0.3
    
    Modify RK628_CSI_PIXEL_RATE_LOW to 400M.
    
    Signed-off-by: Dingxian Wen <shawn.wen@rock-chips.com>
    Change-Id: I024a0c24f7e61e9314e9e6f24c78f24ec403e4e4

diff --git a/drivers/media/i2c/rk628_csi.c b/drivers/media/i2c/rk628_csi.c
index a970bc621e0e..0585ced1f46f 100644
--- a/drivers/media/i2c/rk628_csi.c
+++ b/drivers/media/i2c/rk628_csi.c
@@ -38,7 +38,7 @@ static int debug;
 module_param(debug, int, 0644);
 MODULE_PARM_DESC(debug, "debug level (0-3)");
 
-#define DRIVER_VERSION			KERNEL_VERSION(0, 0x0, 0x2)
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x0, 0x3)
 #define RK628_CSI_NAME			"rk628-csi"
 
 #define EDID_NUM_BLOCKS_MAX 		2
@@ -46,7 +46,7 @@ MODULE_PARM_DESC(debug, "debug level (0-3)");
 
 #define RK628_CSI_LINK_FREQ_LOW		350000000
 #define RK628_CSI_LINK_FREQ_HIGH	400000000
-#define RK628_CSI_PIXEL_RATE_LOW	300000000
+#define RK628_CSI_PIXEL_RATE_LOW	400000000
 #define RK628_CSI_PIXEL_RATE_HIGH	600000000
 #define MIPI_DATARATE_MBPS_LOW		750
 #define MIPI_DATARATE_MBPS_HIGH		1250

commit e63a36dcb082b8a69a3ff2b84a366ba8b1dd78bf
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Mon May 10 10:02:25 2021 +0800

    soc: rockchip: mtd_vendor_storage: Change vendor storage item size realloc strategy
    
    Item size is calculated according to the actual space used
    
    Change-Id: I7133368130689f792f05e82fea04ebf16a755a37
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/soc/rockchip/mtd_vendor_storage.c b/drivers/soc/rockchip/mtd_vendor_storage.c
index c2f8f402de77..b37a8c8e2201 100644
--- a/drivers/soc/rockchip/mtd_vendor_storage.c
+++ b/drivers/soc/rockchip/mtd_vendor_storage.c
@@ -259,8 +259,7 @@ static int mtd_vendor_write(u32 id, void *pbuf, u32 size)
 				item->size = size;
 				memcpy(&p_data[item->offset], pbuf, size);
 				g_vendor->free_offset = offset + align_size;
-				g_vendor->free_size -= (align_size -
-							alloc_size);
+				g_vendor->free_size = sizeof(g_vendor->data) - g_vendor->free_offset;
 			} else {
 				memcpy(&p_data[item->offset],
 				       pbuf,

commit a7adc7ec80dfe049c48c9fe26cd5d37a5ab1323a
Author: Jon Lin <jon.lin@rock-chips.com>
Date:   Wed Apr 28 14:33:02 2021 +0800

    soc: rockchip: flash_vendor_storage: Change vendor storage item size realloc strategy
    
    Item size is calculated according to the actual space used
    
    Change-Id: I7e4ce774a16d665a33e411991dc6dc767e1aba93
    Signed-off-by: Jon Lin <jon.lin@rock-chips.com>

diff --git a/drivers/soc/rockchip/flash_vendor_storage.c b/drivers/soc/rockchip/flash_vendor_storage.c
index 711fa7eec168..831f7b03f7d0 100644
--- a/drivers/soc/rockchip/flash_vendor_storage.c
+++ b/drivers/soc/rockchip/flash_vendor_storage.c
@@ -174,8 +174,7 @@ static int flash_vendor_write(u32 id, void *pbuf, u32 size)
 				item->size = size;
 				memcpy(&p_data[item->offset], pbuf, size);
 				g_vendor->free_offset = offset + align_size;
-				g_vendor->free_size -= (align_size -
-							alloc_size);
+				g_vendor->free_size = sizeof(g_vendor->data) - g_vendor->free_offset;
 			} else {
 				memcpy(&p_data[item->offset],
 				       pbuf,

commit d753ba89d860778079e0658c310fcbf12e7f9dfa
Author: Caesar Wang <wxt@rock-chips.com>
Date:   Thu Apr 29 19:19:37 2021 +0800

    arm64: dts: rockchip: update rk3399-evb-ind-lpddr4-linux.dts
    
    1) Support the usb hub on evb ind v13 board
    2) enable i2s1
    
    Signed-off-by: Caesar Wang <wxt@rock-chips.com>
    Change-Id: If3f394da18f79a7d4800eeef97377893af31357b

diff --git a/arch/arm64/boot/dts/rockchip/rk3399-evb-ind-lpddr4-linux.dts b/arch/arm64/boot/dts/rockchip/rk3399-evb-ind-lpddr4-linux.dts
index 5b6b7131fdd1..6589bb6853f2 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-evb-ind-lpddr4-linux.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3399-evb-ind-lpddr4-linux.dts
@@ -17,6 +17,17 @@
 		reg = <0x0 0xff8d0000 0x0 0x20000>;
 	};
 
+	hub_reset: hub-reset {
+		compatible = "regulator-fixed";
+		enable-active-high;
+		gpio = <&gpio4 18 GPIO_ACTIVE_HIGH>;
+		regulator-name = "hub_reset";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+	};
+
 	vcc_lcd: vcc-lcd {
 		compatible = "regulator-fixed";
 		regulator-name = "vcc_lcd";
@@ -117,6 +128,10 @@
 	status = "disabled";
 };
 
+&hdmi_sound {
+	status = "okay";
+};
+
 &i2c1 {
 	status = "okay";
 
@@ -163,7 +178,7 @@
 
 &i2s1 {
 	#sound-dai-cells = <0>;
-	status = "disabled";
+	status = "okay";
 };
 
 &i2s2 {
@@ -171,10 +186,6 @@
 	status = "okay";
 };
 
-&hdmi_sound {
-	status = "okay";
-};
-
 &mipi_dphy_rx0 {
 	status = "okay";
 
@@ -291,6 +302,30 @@
 	status = "disabled";
 };
 
+&vcca_0v9 {
+	regulator-always-on;
+	regulator-boot-on;
+	regulator-min-microvolt = <900000>;
+	regulator-max-microvolt = <900000>;
+	regulator-name = "vcca_0v9";
+	regulator-state-mem {
+		regulator-on-in-suspend;
+		regulator-suspend-microvolt = <900000>;
+	};
+};
+
+&vcc0v9_soc {
+	regulator-always-on;
+	regulator-boot-on;
+	regulator-min-microvolt = <900000>;
+	regulator-max-microvolt = <900000>;
+
+	regulator-name = "vcc0v9_soc";
+	regulator-state-mem {
+		regulator-off-in-suspend;
+	};
+};
+
 &vopb {
 	status = "okay";
 };

commit 3dfc6a0180f85fba38a86c92729477f0f0ccc6f8
Author: William Wu <william.wu@rock-chips.com>
Date:   Fri May 7 11:49:41 2021 +0800

    usb: gadget: f_uvc: disallow the CPU to enter deeper sleep when streamon
    
    I test on RK3399 IND EVB running Android R system, and
    set the USB gadget as UVC function via configfs, both
    the USB 2.0 and 3.0 UVC have preview abnormal problems.
    If the CPU enter deeper sleep, the USB DMA transfer gets
    corrupted, and the UVC ISOC transmission lost data.
    
    This patch puts in a "pm_qos_latency" requirement which
    will keep the CPU out of the deeper sleep states when
    UVC stream on. And allow the CPU to enter deeper sleep
    state after UVC stream off.
    
    Change-Id: I808290f124c6a32da3888819348093a205bfad61
    Signed-off-by: William Wu <william.wu@rock-chips.com>

diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c
index 43a8679a8a29..708fa503fe76 100644
--- a/drivers/usb/gadget/function/f_uvc.c
+++ b/drivers/usb/gadget/function/f_uvc.c
@@ -1160,6 +1160,7 @@ static struct usb_function_instance *uvc_alloc_inst(void)
 	opts->streaming_interval = 1;
 	opts->streaming_maxpacket = 1024;
 	opts->uvc_num_request = UVC_NUM_REQUESTS;
+	opts->pm_qos_latency = 0;
 
 	ret = uvcg_attach_configfs(opts);
 	if (ret < 0) {
diff --git a/drivers/usb/gadget/function/u_uvc.h b/drivers/usb/gadget/function/u_uvc.h
index 2f7a1360d394..36894a77521b 100644
--- a/drivers/usb/gadget/function/u_uvc.h
+++ b/drivers/usb/gadget/function/u_uvc.h
@@ -85,6 +85,7 @@ struct f_uvc_opts {
 	 */
 	struct mutex			lock;
 	int				refcnt;
+	int				pm_qos_latency;
 };
 
 #endif /* U_UVC_H */
diff --git a/drivers/usb/gadget/function/uvc.h b/drivers/usb/gadget/function/uvc.h
index 8b1f6d85215f..28eb0430eaea 100644
--- a/drivers/usb/gadget/function/uvc.h
+++ b/drivers/usb/gadget/function/uvc.h
@@ -14,6 +14,7 @@
 #include <linux/spinlock.h>
 #include <linux/usb/composite.h>
 #include <linux/videodev2.h>
+#include <linux/pm_qos.h>
 
 #include <media/v4l2-device.h>
 #include <media/v4l2-dev.h>
@@ -114,6 +115,8 @@ struct uvc_device {
 	enum uvc_state state;
 	struct usb_function func;
 	struct uvc_video video;
+	/* for creating and issuing QoS requests */
+	struct pm_qos_request pm_qos;
 
 	/* Descriptors */
 	struct {
diff --git a/drivers/usb/gadget/function/uvc_configfs.c b/drivers/usb/gadget/function/uvc_configfs.c
index e870f5cfb863..403bd47d75df 100644
--- a/drivers/usb/gadget/function/uvc_configfs.c
+++ b/drivers/usb/gadget/function/uvc_configfs.c
@@ -2775,6 +2775,7 @@ UVCG_OPTS_ATTR(streaming_interval, streaming_interval, 16);
 UVCG_OPTS_ATTR(streaming_maxpacket, streaming_maxpacket, 3072);
 UVCG_OPTS_ATTR(streaming_maxburst, streaming_maxburst, 15);
 UVCG_OPTS_ATTR(uvc_num_request, uvc_num_request, UVC_MAX_NUM_REQUESTS);
+UVCG_OPTS_ATTR(pm_qos_latency, pm_qos_latency, PM_QOS_LATENCY_ANY);
 
 #undef UVCG_OPTS_ATTR
 
@@ -2784,6 +2785,7 @@ static struct configfs_attribute *uvc_attrs[] = {
 	&f_uvc_opts_attr_streaming_maxpacket,
 	&f_uvc_opts_attr_streaming_maxburst,
 	&f_uvc_opts_attr_uvc_num_request,
+	&f_uvc_opts_attr_pm_qos_latency,
 	NULL,
 };
 
diff --git a/drivers/usb/gadget/function/uvc_video.c b/drivers/usb/gadget/function/uvc_video.c
index c5092d1a8fa8..6330237adcfd 100644
--- a/drivers/usb/gadget/function/uvc_video.c
+++ b/drivers/usb/gadget/function/uvc_video.c
@@ -12,6 +12,7 @@
 #include <linux/usb/ch9.h>
 #include <linux/usb/gadget.h>
 #include <linux/usb/video.h>
+#include <linux/pm_qos.h>
 
 #include <media/v4l2-dev.h>
 
@@ -388,9 +389,13 @@ int uvcg_video_enable(struct uvc_video *video, int enable)
 
 		uvc_video_free_requests(video);
 		uvcg_queue_enable(&video->queue, 0);
+		if (pm_qos_request_active(&uvc->pm_qos))
+			pm_qos_remove_request(&uvc->pm_qos);
 		return 0;
 	}
 
+	pm_qos_add_request(&uvc->pm_qos, PM_QOS_CPU_DMA_LATENCY,
+			   opts->pm_qos_latency);
 	if ((ret = uvcg_queue_enable(&video->queue, 1)) < 0)
 		return ret;
 
diff --git a/drivers/usb/gadget/legacy/webcam.c b/drivers/usb/gadget/legacy/webcam.c
index 89e721091ffb..e68d921b397a 100644
--- a/drivers/usb/gadget/legacy/webcam.c
+++ b/drivers/usb/gadget/legacy/webcam.c
@@ -383,6 +383,7 @@ webcam_bind(struct usb_composite_dev *cdev)
 	uvc_opts->hs_streaming = uvc_hs_streaming_cls;
 	uvc_opts->ss_streaming = uvc_ss_streaming_cls;
 	uvc_opts->uvc_num_request = UVC_NUM_REQUESTS;
+	uvc_opts->pm_qos_latency = 0;
 
 	/* Allocate string descriptor numbers ... note that string contents
 	 * can be overridden by the composite_dev glue.

commit 3b07017b9635f7ee02abad8db3d7404bf00b013f
Author: William Wu <william.wu@rock-chips.com>
Date:   Fri May 7 11:30:58 2021 +0800

    usb: gadget: f_uvc: fix the superspeed ep companion descriptor
    
    As per USB 3.1 spec "Table 9-26. SuperSpeed Endpoint Companion
    Descriptor", the wBytesPerInterval must be set to zero for bulk
    endpoints.
    
    Change-Id: I2ec14ac0b0db1f4b5dc3bdbb61e3d2c02c63da23
    Signed-off-by: William Wu <william.wu@rock-chips.com>

diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c
index a67da1b87c90..43a8679a8a29 100644
--- a/drivers/usb/gadget/function/f_uvc.c
+++ b/drivers/usb/gadget/function/f_uvc.c
@@ -858,9 +858,13 @@ uvc_function_bind(struct usb_configuration *c, struct usb_function *f)
 
 		uvc_ss_bulk_streaming_ep.wMaxPacketSize =
 			cpu_to_le16(max_packet_size);
-		uvc_ss_streaming_comp.bMaxBurst = opts->streaming_maxburst;
-		uvc_ss_streaming_comp.wBytesPerInterval =
-			cpu_to_le16(max_packet_size * opts->streaming_maxburst);
+		uvc_ss_bulk_streaming_comp.bMaxBurst = opts->streaming_maxburst;
+		/*
+		 * As per USB 3.1 spec "Table 9-26. SuperSpeed Endpoint
+		 * Companion Descriptor", the wBytesPerInterval must be
+		 * set to zero for bulk endpoints.
+		 */
+		uvc_ss_bulk_streaming_comp.wBytesPerInterval = 0;
 	}
 
 	/* Allocate endpoints. */

commit 3e41649e1071a34e361fa67e7ceaec17755d5e21
Author: William Wu <william.wu@rock-chips.com>
Date:   Fri May 7 11:15:50 2021 +0800

    usb: gadget: get ep mult and maxburst for rockchip superspeed
    
    For Rockchip platforms, they may need to get the mult and
    maxburst of endpoints for USB superspeed gadget when bind
    USB functions (e.g. uvc_function_bind), then the USB DWC3
    controller can do Tx fifos resize properly for each endpoints.
    
    Change-Id: I7baddbc0dc515c91d82ca4bc1960531919ed6008
    Signed-off-by: William Wu <william.wu@rock-chips.com>

diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c
index bf076d3b1cd0..c80f9ba676f6 100644
--- a/drivers/usb/gadget/epautoconf.c
+++ b/drivers/usb/gadget/epautoconf.c
@@ -125,9 +125,24 @@ struct usb_ep *usb_ep_autoconfig_ss(
 	ep->claimed = true;
 #ifdef CONFIG_ARCH_ROCKCHIP
 	ep->transfer_type = type;
-	if (type == USB_ENDPOINT_XFER_ISOC ||
-	    type == USB_ENDPOINT_XFER_INT)
+	if (gadget_is_superspeed(gadget) && ep_comp) {
+		switch (type) {
+		case USB_ENDPOINT_XFER_ISOC:
+			/* mult: bits 1:0 of bmAttributes */
+			ep->mult = (ep_comp->bmAttributes & 0x3) + 1;
+			/* fall through */
+		case USB_ENDPOINT_XFER_BULK:
+		case USB_ENDPOINT_XFER_INT:
+			ep->maxburst = ep_comp->bMaxBurst + 1;
+			break;
+		default:
+			break;
+		}
+	} else if (gadget_is_dualspeed(gadget) &&
+		   (type == USB_ENDPOINT_XFER_ISOC ||
+		    type == USB_ENDPOINT_XFER_INT)) {
 		ep->mult = usb_endpoint_maxp_mult(desc);
+	}
 #endif
 	return ep;
 }

commit 23ce756d92dc2cd1746338f3d6197ee2ac3066b4
Author: William Wu <william.wu@rock-chips.com>
Date:   Fri May 7 11:02:38 2021 +0800

    usb: dwc3: gadget: support tx fifos resize for superspeed
    
    This patch supports tx fifos resize for superspeed, if needed.
    And it limits the maximum fifo size to six times of the endpoint
    maxpacket because of the limited dwc3 hardware fifos.
    
    Change-Id: I69af3419ecdc7f5d0869ba5d2dce041e4d90fae7
    Signed-off-by: William Wu <william.wu@rock-chips.com>

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index df0aeae53b02..eec38152ed3e 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -172,8 +172,7 @@ static int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc)
 	 * during controller transfer data, it may cause controller
 	 * run into abnormal and unrecoverable state.
 	 */
-	if (!dwc->needs_fifo_resize || dwc->fifo_resize_status ||
-	    dwc->gadget.speed > USB_SPEED_HIGH)
+	if (!dwc->needs_fifo_resize || dwc->fifo_resize_status)
 		return 0;
 
 	num_in_eps = DWC3_NUM_IN_EPS(&dwc->hwparams);
@@ -208,7 +207,10 @@ static int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc)
 			}
 
 			mult = 1;
-			maxpacket = 64;
+			if (dwc->gadget.speed <= USB_SPEED_HIGH)
+				maxpacket = 64;
+			else
+				maxpacket = 512;
 			break;
 		case USB_ENDPOINT_XFER_ISOC:
 			if (!dep->endpoint.caps.type_iso) {
@@ -222,9 +224,15 @@ static int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc)
 			 * to get better performance and more compliance
 			 * with bus latency.
 			 */
-			mult = dep->endpoint.mult;
-			mult = mult > 0 ? mult * 2 : 3;
 			maxpacket = dep->endpoint.maxpacket;
+			if (dwc->gadget.speed <= USB_SPEED_HIGH)
+				mult = dep->endpoint.mult;
+			else
+				mult = dep->endpoint.mult *
+				       dep->endpoint.maxburst;
+			mult = mult > 0 ? mult * 2 : 3;
+			if (mult > 6)
+				mult = 6;
 			break;
 		case USB_ENDPOINT_XFER_BULK:
 			if (!dep->endpoint.caps.type_bulk) {
@@ -238,7 +246,16 @@ static int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc)
 			 * better transmission performance.
 			 */
 			mult = 3;
-			maxpacket = 512;
+			if (dwc->gadget.speed <= USB_SPEED_HIGH) {
+				maxpacket = 512;
+			} else {
+				if (dep->endpoint.maxburst > mult) {
+					mult = dep->endpoint.maxburst;
+					if (mult > 6)
+						mult = 6;
+				}
+				maxpacket = 1024;
+			}
 			break;
 		case USB_ENDPOINT_XFER_INT:
 			/* Bulk endpoints handle interrupt transfers. */

commit f5a905b3eae55bb96a9ef5e415ff25b2b65c0961
Author: William Wu <william.wu@rock-chips.com>
Date:   Fri May 7 20:42:52 2021 +0800

    phy: rockchip: naneng-combphy: adjust PLL parameters for USB
    
    When do USB 3.0 Receiver Jitter Tolerance Test, it fails at
    Sj Frequency 2.0/4.9/10.0 [MHz]. This patch adjusts the PLL
    parameters for USB to pass the Receiver Jitter Tolerance Test,
    and it's helpful to improve the USB 3.0 signal compatibility.
    
    Change-Id: I58eb687a4677fe22cf5bc324578b033526310859
    Signed-off-by: William Wu <william.wu@rock-chips.com>

diff --git a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
index 4d0ce411331f..08445c1890eb 100644
--- a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
+++ b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
@@ -448,6 +448,27 @@ static int rk3568_combphy_cfg(struct rockchip_combphy_priv *priv)
 		val |= 0x01;
 		writel(val, priv->mmio + (0x0e << 2));
 
+		/* Set PLL KVCO fine tuning signals */
+		val = readl(priv->mmio + (0x20 << 2));
+		val &= ~(0x7 << 2);
+		val |= 0x2 << 2;
+		writel(val, priv->mmio + (0x20 << 2));
+
+		/* Set PLL LPF R1 to su_trim[10:7]=1001 */
+		writel(0x4, priv->mmio + (0xb << 2));
+
+		/* Set PLL input clock divider 1/2 */
+		val = readl(priv->mmio + (0x5 << 2));
+		val &= ~(0x3 << 6);
+		val |= 0x1 << 6;
+		writel(val, priv->mmio + (0x5 << 2));
+
+		/* Set PLL loop divider */
+		writel(0x32, priv->mmio + (0x11 << 2));
+
+		/* Set PLL KVCO to min and set PLL charge pump current to max */
+		writel(0xf0, priv->mmio + (0xa << 2));
+
 		param_write(priv->phy_grf, &cfg->pipe_sel_usb, true);
 		param_write(priv->phy_grf, &cfg->pipe_txcomp_sel, false);
 		param_write(priv->phy_grf, &cfg->pipe_txelec_sel, false);

commit 0676191edb445e58edf0ca7e49fccab5b46663ee
Author: Fenrir Lin <fenrir.lin@rock-chips.com>
Date:   Sat May 8 09:51:46 2021 +0800

    media: rockchip: isp: fix the problem of no data when no reserved memory
    
    Signed-off-by: Fenrir Lin <fenrir.lin@rock-chips.com>
    Change-Id: Ia94a8032fae6c741376924c98dae336e4a9329bd

diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c
index 8fcaa7c7823a..9380ac9512c8 100644
--- a/drivers/media/platform/rockchip/isp/rkisp.c
+++ b/drivers/media/platform/rockchip/isp/rkisp.c
@@ -2429,6 +2429,12 @@ void rkisp_chk_tb_over(struct rkisp_device *isp_dev)
 	if (!isp_dev->resmem_pa || !isp_dev->resmem_size) {
 		v4l2_info(&isp_dev->v4l2_dev,
 			  "no reserved memory for thunderboot\n");
+		if (isp_dev->hw_dev->is_thunderboot) {
+			rkisp_tb_set_state(RKISP_TB_NG);
+			rkisp_tb_unprotect_clk();
+			rkisp_register_irq(isp_dev->hw_dev);
+			isp_dev->hw_dev->is_thunderboot = false;
+		}
 		return;
 	}
 

commit f5460d6a7fe7943d503ebee8fe841f155e9d5b0d
Author: Zorro Liu <lyx@rock-chips.com>
Date:   Fri May 7 20:51:35 2021 +0800

    drm/rockchip: ebc_dev: release version v1.11
    
    1.ebc buffer support cache for userspace
    2.fix rkf waveform file parse tempeleture error
    
    Signed-off-by: Zorro Liu <lyx@rock-chips.com>
    Change-Id: Ib0b95e30a0ac1cc6cb9643b1c62ba506cbb92619

diff --git a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index 2f1e4a8188ac..99c5bc7cdc48 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -426,15 +426,15 @@ get_auto_image:
 	.type	ebc_open, %function
 ebc_open:
 .LFB2826:
-	.loc 1 1362 0
+	.loc 1 1361 0
 	.cfi_startproc
 .LVL30:
-	.loc 1 1366 0
+	.loc 1 1365 0
 	mov	w0, 0
 .LVL31:
-	.loc 1 1363 0
+	.loc 1 1362 0
 	str	xzr, [x1, 104]
-	.loc 1 1366 0
+	.loc 1 1365 0
 	ret
 	.cfi_endproc
 .LFE2826:
@@ -444,22 +444,22 @@ ebc_open:
 	.type	ebc_exit, %function
 ebc_exit:
 .LFB2845:
-	.loc 1 1908 0
+	.loc 1 1907 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1909 0
+	.loc 1 1908 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 1908 0
+	.loc 1 1907 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1909 0
+	.loc 1 1908 0
 	bl	platform_driver_unregister
 .LVL32:
-	.loc 1 1910 0
+	.loc 1 1909 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -474,7 +474,7 @@ ebc_exit:
 	.type	ebc_resume, %function
 ebc_resume:
 .LFB2843:
-	.loc 1 1870 0
+	.loc 1 1869 0
 	.cfi_startproc
 .LVL33:
 	stp	x29, x30, [sp, -32]!
@@ -492,7 +492,7 @@ ebc_resume:
 	ldr	x19, [x0, 184]
 .LBE803:
 .LBE802:
-	.loc 1 1874 0
+	.loc 1 1873 0
 	ldr	x1, [x19, 16]
 .LBB804:
 .LBB805:
@@ -505,15 +505,15 @@ ebc_resume:
 .LVL35:
 .LBE805:
 .LBE804:
-	.loc 1 1875 0
+	.loc 1 1874 0
 	str	wzr, [x19, 788]
-	.loc 1 1876 0
+	.loc 1 1875 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
 .LVL36:
-	.loc 1 1879 0
+	.loc 1 1878 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -581,27 +581,27 @@ ebc_vdd_power_timeout:
 	.type	ebc_remove, %function
 ebc_remove:
 .LFB2841:
-	.loc 1 1846 0
+	.loc 1 1845 0
 	.cfi_startproc
 .LVL40:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1847 0
+	.loc 1 1846 0
 	adrp	x0, .LANCHOR1
 .LVL41:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 1846 0
+	.loc 1 1845 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1847 0
+	.loc 1 1846 0
 	add	x0, x0, 224
+	.loc 1 1845 0
 	.loc 1 1846 0
-	.loc 1 1847 0
 	bl	misc_deregister
 .LVL42:
-	.loc 1 1850 0
+	.loc 1 1849 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -632,36 +632,28 @@ ebc_mmap:
 	.loc 1 1349 0
 	bl	ebc_phy_buf_base_get
 .LVL44:
-	.loc 1 1353 0
+	.loc 1 1352 0
 	lsr	x2, x0, 12
 	.loc 1 1350 0
-	mov	x7, -29
-	.loc 1 1351 0
 	mov	x6, 16384
-	ldp	x4, x5, [x19, 72]
+	.loc 1 1352 0
+	mov	x0, x19
 	.loc 1 1350 0
-	movk	x7, 0xff9f, lsl 48
-	.loc 1 1353 0
-	ldp	x1, x3, [x19]
-	.loc 1 1351 0
+	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
+	.loc 1 1352 0
+	ldp	x1, x3, [x19]
 	.loc 1 1350 0
-	and	x4, x4, x7
-	.loc 1 1351 0
 	orr	x5, x5, x6
-	.loc 1 1350 0
-	orr	x4, x4, 27021597764222976
-	.loc 1 1351 0
-	stp	x4, x5, [x19, 72]
-	.loc 1 1353 0
+	str	x5, [x19, 80]
+	.loc 1 1352 0
 	sub	x3, x3, x1
-	mov	x0, x19
 	bl	remap_pfn_range
 .LVL45:
-	.loc 1 1356 0
+	.loc 1 1355 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 1359 0
+	.loc 1 1358 0
 	ldr	x19, [sp, 16]
 .LVL46:
 	csel	w0, w0, w1, eq
@@ -2542,32 +2534,32 @@ ebc_lut_update:
 	.type	ebc_state_read, %function
 ebc_state_read:
 .LFB2833:
-	.loc 1 1468 0
+	.loc 1 1467 0
 	.cfi_startproc
 .LVL232:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1469 0
-	adrp	x3, .LANCHOR0
 	.loc 1 1468 0
+	adrp	x3, .LANCHOR0
+	.loc 1 1467 0
 	mov	x0, x2
 .LVL233:
-	.loc 1 1469 0
+	.loc 1 1468 0
 	adrp	x1, .LC14
 .LVL234:
-	.loc 1 1468 0
+	.loc 1 1467 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1469 0
+	.loc 1 1468 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL235:
 	add	x1, x1, :lo12:.LC14
 	ldr	w2, [x2, 616]
 	bl	sprintf
 .LVL236:
-	.loc 1 1470 0
+	.loc 1 1469 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -2582,7 +2574,7 @@ ebc_state_read:
 	.type	ebc_version_read, %function
 ebc_version_read:
 .LFB2832:
-	.loc 1 1459 0
+	.loc 1 1458 0
 	.cfi_startproc
 .LVL237:
 	stp	x29, x30, [sp, -16]!
@@ -2591,22 +2583,22 @@ ebc_version_read:
 	.cfi_offset 30, -8
 	mov	x0, x2
 .LVL238:
-	.loc 1 1460 0
+	.loc 1 1459 0
 	adrp	x1, .LC16
 .LVL239:
 	adrp	x2, .LC15
 .LVL240:
-	.loc 1 1459 0
+	.loc 1 1458 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1460 0
+	.loc 1 1459 0
 	add	x2, x2, :lo12:.LC15
+	.loc 1 1458 0
 	.loc 1 1459 0
-	.loc 1 1460 0
 	add	x1, x1, :lo12:.LC16
 	bl	sprintf
 .LVL241:
-	.loc 1 1461 0
+	.loc 1 1460 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -2621,27 +2613,27 @@ ebc_version_read:
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
 .LFB2830:
-	.loc 1 1423 0
+	.loc 1 1422 0
 	.cfi_startproc
 .LVL242:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 1424 0
+	.loc 1 1423 0
 	adrp	x0, .LANCHOR0
 .LVL243:
-	.loc 1 1423 0
+	.loc 1 1422 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1427 0
+	.loc 1 1426 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 1423 0
+	.loc 1 1422 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1423 0
+	.loc 1 1422 0
 	mov	x19, x2
-	.loc 1 1427 0
+	.loc 1 1426 0
 	ldr	x1, [x0, 16]
 .LVL244:
 .LBB1025:
@@ -2653,14 +2645,14 @@ pmic_vcom_read:
 .LVL245:
 .LBE1026:
 .LBE1025:
-	.loc 1 1429 0
+	.loc 1 1428 0
 	mov	w2, w0
 	adrp	x1, .LC14
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC14
 	bl	sprintf
 .LVL246:
-	.loc 1 1430 0
+	.loc 1 1429 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL247:
@@ -2678,20 +2670,20 @@ pmic_vcom_read:
 	.type	pmic_temp_read, %function
 pmic_temp_read:
 .LFB2829:
-	.loc 1 1409 0
+	.loc 1 1408 0
 	.cfi_startproc
 .LVL248:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 1410 0
+	.loc 1 1409 0
 	adrp	x0, .LANCHOR0
 .LVL249:
-	.loc 1 1409 0
+	.loc 1 1408 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1413 0
+	.loc 1 1412 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
 .LBB1027:
 .LBB1028:
@@ -2700,11 +2692,11 @@ pmic_temp_read:
 .LVL250:
 .LBE1028:
 .LBE1027:
-	.loc 1 1409 0
+	.loc 1 1408 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 1409 0
+	.loc 1 1408 0
 	adrp	x19, __stack_chk_guard
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x20, x2
@@ -2712,7 +2704,7 @@ pmic_temp_read:
 	str	x2, [x29, 40]
 	mov	x2,0
 .LVL251:
-	.loc 1 1413 0
+	.loc 1 1412 0
 	ldr	x2, [x0, 16]
 .LBB1030:
 .LBB1029:
@@ -2723,14 +2715,14 @@ pmic_temp_read:
 .LVL252:
 .LBE1029:
 .LBE1030:
-	.loc 1 1415 0
+	.loc 1 1414 0
 	ldr	w2, [x29, 36]
 	adrp	x1, .LC14
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC14
 	bl	sprintf
 .LVL253:
-	.loc 1 1416 0
+	.loc 1 1415 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
@@ -2759,25 +2751,25 @@ pmic_temp_read:
 	.type	pmic_name_read, %function
 pmic_name_read:
 .LFB2828:
-	.loc 1 1398 0
+	.loc 1 1397 0
 	.cfi_startproc
 .LVL257:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1399 0
-	adrp	x3, .LANCHOR0
 	.loc 1 1398 0
+	adrp	x3, .LANCHOR0
+	.loc 1 1397 0
 	mov	x0, x2
 .LVL258:
-	.loc 1 1401 0
+	.loc 1 1400 0
 	adrp	x1, .LC16
 .LVL259:
-	.loc 1 1398 0
+	.loc 1 1397 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1401 0
+	.loc 1 1400 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
 .LVL260:
 	add	x1, x1, :lo12:.LC16
@@ -2785,7 +2777,7 @@ pmic_name_read:
 	add	x2, x2, 8
 	bl	sprintf
 .LVL261:
-	.loc 1 1402 0
+	.loc 1 1401 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -2800,17 +2792,17 @@ pmic_name_read:
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
 .LFB2831:
-	.loc 1 1435 0
+	.loc 1 1434 0
 	.cfi_startproc
 .LVL262:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 1436 0
+	.loc 1 1435 0
 	adrp	x0, .LANCHOR0
 .LVL263:
-	.loc 1 1435 0
+	.loc 1 1434 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -2820,37 +2812,37 @@ pmic_vcom_write:
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 1435 0
+	.loc 1 1434 0
 	add	x1, x19, :lo12:__stack_chk_guard
 .LVL264:
 	mov	x21, x2
-	.loc 1 1436 0
+	.loc 1 1435 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
 .LVL265:
-	.loc 1 1435 0
+	.loc 1 1434 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
 .LVL266:
 	mov	x20, x3
-	.loc 1 1439 0
+	.loc 1 1438 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
 .LVL267:
-	.loc 1 1440 0
+	.loc 1 1439 0
 	cbnz	w0, .L237
 .LVL268:
-	.loc 1 1444 0
+	.loc 1 1443 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
 .LVL269:
-	.loc 1 1445 0
+	.loc 1 1444 0
 	cbnz	w0, .L238
 .L230:
-	.loc 1 1451 0
+	.loc 1 1450 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
 .LVL270:
@@ -2875,36 +2867,36 @@ pmic_vcom_write:
 	.p2align 3
 .L237:
 	.cfi_restore_state
-	.loc 1 1441 0
+	.loc 1 1440 0
 	ldr	x0, [x22]
 	adrp	x1, .LC17
 	mov	x2, x21
 	add	x1, x1, :lo12:.LC17
-	.loc 1 1442 0
+	.loc 1 1441 0
 	mov	x20, -1
 .LVL273:
-	.loc 1 1441 0
+	.loc 1 1440 0
 	bl	_dev_err
 .LVL274:
-	.loc 1 1442 0
+	.loc 1 1441 0
 	b	.L230
 .LVL275:
 	.p2align 3
 .L238:
-	.loc 1 1446 0
+	.loc 1 1445 0
 	ldr	x0, [x22]
 	adrp	x1, .LC18
-	.loc 1 1447 0
+	.loc 1 1446 0
 	mov	x20, -1
 .LVL276:
-	.loc 1 1446 0
+	.loc 1 1445 0
 	add	x1, x1, :lo12:.LC18
 	bl	_dev_err
 .LVL277:
-	.loc 1 1447 0
+	.loc 1 1446 0
 	b	.L230
 .L239:
-	.loc 1 1451 0
+	.loc 1 1450 0
 	bl	__stack_chk_fail
 .LVL278:
 	.cfi_endproc
@@ -2915,7 +2907,7 @@ pmic_vcom_write:
 	.type	waveform_version_read, %function
 waveform_version_read:
 .LFB2827:
-	.loc 1 1387 0
+	.loc 1 1386 0
 	.cfi_startproc
 .LVL279:
 	stp	x29, x30, [sp, -32]!
@@ -2926,19 +2918,19 @@ waveform_version_read:
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 1387 0
+	.loc 1 1386 0
 	mov	x19, x2
-	.loc 1 1388 0
+	.loc 1 1387 0
 	bl	epd_lut_get_wf_version
 .LVL280:
-	.loc 1 1390 0
+	.loc 1 1389 0
 	mov	x2, x0
 	adrp	x1, .LC16
 	mov	x0, x19
 	add	x1, x1, :lo12:.LC16
 	bl	sprintf
 .LVL281:
-	.loc 1 1391 0
+	.loc 1 1390 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
 .LVL282:
@@ -2956,23 +2948,23 @@ waveform_version_read:
 	.type	ebc_init, %function
 ebc_init:
 .LFB2844:
-	.loc 1 1903 0
+	.loc 1 1902 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 1904 0
+	.loc 1 1903 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 1903 0
+	.loc 1 1902 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1904 0
+	.loc 1 1903 0
 	bl	__platform_driver_register
 .LVL283:
-	.loc 1 1905 0
+	.loc 1 1904 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -4465,7 +4457,7 @@ ebc_power_set.part.3:
 	.type	ebc_probe, %function
 ebc_probe:
 .LFB2840:
-	.loc 1 1738 0
+	.loc 1 1737 0
 	.cfi_startproc
 .LVL408:
 	stp	x29, x30, [sp, -208]!
@@ -4479,15 +4471,15 @@ ebc_probe:
 	movk	w2, 0x60, lsl 16
 .LBE1280:
 .LBE1279:
-	.loc 1 1738 0
+	.loc 1 1737 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -192
 	.cfi_offset 20, -184
-	.loc 1 1739 0
-	add	x20, x0, 16
 	.loc 1 1738 0
+	add	x20, x0, 16
+	.loc 1 1737 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -160
 	.cfi_offset 24, -152
@@ -4503,7 +4495,7 @@ ebc_probe:
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 1738 0
+	.loc 1 1737 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
@@ -4516,30 +4508,30 @@ ebc_probe:
 .LVL410:
 .LBE1281:
 .LBE1282:
-	.loc 1 1750 0
+	.loc 1 1749 0
 	cbz	x0, .L442
-	.loc 1 1754 0
+	.loc 1 1753 0
 	adrp	x25, .LANCHOR0
 	mov	x19, x0
-	.loc 1 1756 0
+	.loc 1 1755 0
 	adrp	x1, .LC22
 	mov	w2, 0
-	.loc 1 1754 0
+	.loc 1 1753 0
 	str	x0, [x25, #:lo12:.LANCHOR0]
-	.loc 1 1756 0
+	.loc 1 1755 0
 	add	x1, x1, :lo12:.LC22
 	ldr	x0, [x20, 752]
-	.loc 1 1753 0
+	.loc 1 1752 0
 	str	x20, [x19]
-	.loc 1 1756 0
+	.loc 1 1755 0
 	bl	of_parse_phandle
 .LVL411:
-	.loc 1 1757 0
+	.loc 1 1756 0
 	cbz	x0, .L485
-	.loc 1 1762 0
+	.loc 1 1761 0
 	bl	of_find_device_by_node
 .LVL412:
-	.loc 1 1764 0
+	.loc 1 1763 0
 	cbz	x0, .L401
 .LBB1283:
 .LBB1284:
@@ -4550,27 +4542,27 @@ ebc_probe:
 .LBE1285:
 .LBE1284:
 .LBE1283:
-	.loc 1 1767 0
+	.loc 1 1766 0
 	str	x0, [x19, 8]
-	.loc 1 1768 0
+	.loc 1 1767 0
 	cbz	x0, .L401
-	.loc 1 1770 0
+	.loc 1 1769 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 1772 0
+	.loc 1 1771 0
 	mov	w2, 0
 	adrp	x1, .LC24
 	add	x1, x1, :lo12:.LC24
 	ldr	x0, [x20, 752]
 	bl	of_parse_phandle
 .LVL414:
-	.loc 1 1773 0
+	.loc 1 1772 0
 	cbz	x0, .L486
-	.loc 1 1778 0
+	.loc 1 1777 0
 	bl	of_find_i2c_device_by_node
 .LVL415:
-	.loc 1 1780 0
+	.loc 1 1779 0
 	cbz	x0, .L487
 .LBB1286:
 .LBB1287:
@@ -4581,16 +4573,16 @@ ebc_probe:
 .LBE1288:
 .LBE1287:
 .LBE1286:
-	.loc 1 1784 0
+	.loc 1 1783 0
 	str	x0, [x19, 16]
-	.loc 1 1785 0
+	.loc 1 1784 0
 	cbz	x0, .L488
-	.loc 1 1791 0
+	.loc 1 1790 0
 	add	x21, x19, 184
 .LVL417:
-	.loc 1 1793 0
+	.loc 1 1792 0
 	add	x22, x19, 24
-	.loc 1 1791 0
+	.loc 1 1790 0
 	str	x20, [x21, 88]
 .LBB1289:
 .LBB1290:
@@ -4605,7 +4597,7 @@ ebc_probe:
 .LBE1291:
 .LBE1290:
 .LBE1289:
-	.loc 1 1793 0
+	.loc 1 1792 0
 	str	x20, [x19, 24]
 .LBB1388:
 .LBB1384:
@@ -4619,7 +4611,7 @@ ebc_probe:
 .LBE1300:
 .LBE1384:
 .LBE1388:
-	.loc 1 1794 0
+	.loc 1 1793 0
 	ldr	x2, [x19, 8]
 .LBB1389:
 .LBB1385:
@@ -4633,7 +4625,7 @@ ebc_probe:
 .LBE1301:
 .LBE1385:
 .LBE1389:
-	.loc 1 1795 0
+	.loc 1 1794 0
 	stp	x2, x0, [x22, 8]
 .LBB1390:
 .LBB1386:
@@ -4980,51 +4972,51 @@ ebc_probe:
 .LBE1369:
 .LBE1386:
 .LBE1390:
-	.loc 1 1803 0
+	.loc 1 1802 0
 	ldr	w0, [x22, 88]
 .LBB1391:
 .LBB1392:
-	.loc 1 1540 0
+	.loc 1 1539 0
 	mov	w2, 0
 .LBE1392:
 .LBE1391:
-	.loc 1 1803 0
+	.loc 1 1802 0
 	str	w0, [x21, 52]
-	.loc 1 1804 0
+	.loc 1 1803 0
 	ldr	w1, [x22, 84]
 	str	w1, [x21, 56]
-	.loc 1 1805 0
+	.loc 1 1804 0
 	mul	w0, w0, w1
 .LBB1420:
 .LBB1415:
-	.loc 1 1540 0
+	.loc 1 1539 0
 	adrp	x1, .LC33
 	add	x1, x1, :lo12:.LC33
 .LBE1415:
 .LBE1420:
-	.loc 1 1805 0
+	.loc 1 1804 0
 	lsr	w3, w0, 1
-	.loc 1 1806 0
+	.loc 1 1805 0
 	lsr	w0, w0, 2
 	stp	w3, w0, [x21, 20]
 .LBB1421:
 .LBB1416:
-	.loc 1 1531 0
+	.loc 1 1530 0
 	ldr	x26, [x19]
 .LVL438:
-	.loc 1 1540 0
+	.loc 1 1539 0
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL439:
-	.loc 1 1541 0
+	.loc 1 1540 0
 	cbz	x0, .L443
-	.loc 1 1544 0
+	.loc 1 1543 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL440:
 	mov	w24, w0
-	.loc 1 1546 0
+	.loc 1 1545 0
 	cbnz	w0, .L490
 .LBB1393:
 .LBB1394:
@@ -5033,9 +5025,9 @@ ebc_probe:
 	ldp	x1, x2, [x29, 104]
 .LBE1394:
 .LBE1393:
-	.loc 1 1551 0
+	.loc 1 1550 0
 	str	x1, [x19, 184]
-	.loc 1 1554 0
+	.loc 1 1553 0
 	mov	x3, 1
 	mov	x0, x26
 .LBB1396:
@@ -5045,16 +5037,16 @@ ebc_probe:
 	sub	x2, x2, x1
 .LBE1395:
 .LBE1396:
-	.loc 1 1552 0
+	.loc 1 1551 0
 	str	w2, [x21, 16]
-	.loc 1 1554 0
+	.loc 1 1553 0
 	sxtw	x2, w2
 	bl	devm_memremap
 .LVL441:
 	str	x0, [x21, 8]
-	.loc 1 1556 0
+	.loc 1 1555 0
 	cbz	x0, .L414
-	.loc 1 1564 0
+	.loc 1 1563 0
 	mov	x1, x0
 	ldr	w2, [x21, 16]
 	ldr	x0, [x19, 184]
@@ -5062,11 +5054,11 @@ ebc_probe:
 	mov	w3, 2097152
 	bl	ebc_buf_init
 .LVL442:
-	.loc 1 1565 0
+	.loc 1 1564 0
 	cbnz	w0, .L414
-	.loc 1 1570 0
+	.loc 1 1569 0
 	ldr	x0, [x21, 8]
-	.loc 1 1571 0
+	.loc 1 1570 0
 	mov	x5, 1048576
 	str	x5, [x22, 40]
 .LBB1397:
@@ -5075,13 +5067,13 @@ ebc_probe:
 	mov	w2, 32960
 .LBE1398:
 .LBE1397:
-	.loc 1 1570 0
+	.loc 1 1569 0
 	add	x6, x0, 10485760
 	str	x6, [x22, 24]
 	add	x4, x0, 11534336
-	.loc 1 1576 0
+	.loc 1 1575 0
 	add	x1, x0, 12582912
-	.loc 1 1572 0
+	.loc 1 1571 0
 	ldr	x3, [x19, 184]
 .LBB1402:
 .LBB1399:
@@ -5090,18 +5082,18 @@ ebc_probe:
 	mov	x0, x26
 .LBE1399:
 .LBE1402:
-	.loc 1 1572 0
+	.loc 1 1571 0
 	add	x7, x3, 10485760
 	str	x7, [x22, 32]
-	.loc 1 1573 0
-	str	x6, [x21, 176]
 	.loc 1 1572 0
-	add	x3, x3, 11534336
+	str	x6, [x21, 176]
 	.loc 1 1571 0
+	add	x3, x3, 11534336
+	.loc 1 1570 0
 	str	x5, [x22, 64]
-	.loc 1 1572 0
+	.loc 1 1571 0
 	stp	x4, x3, [x22, 48]
-	.loc 1 1576 0
+	.loc 1 1575 0
 	str	x1, [x21, 112]
 .LBB1403:
 .LBB1400:
@@ -5109,7 +5101,7 @@ ebc_probe:
 	ldrsw	x1, [x21, 20]
 .LBE1400:
 .LBE1403:
-	.loc 1 1573 0
+	.loc 1 1572 0
 	str	x4, [x21, 184]
 .LBB1404:
 .LBB1401:
@@ -5118,9 +5110,9 @@ ebc_probe:
 .LVL443:
 .LBE1401:
 .LBE1404:
-	.loc 1 1579 0
+	.loc 1 1578 0
 	str	x0, [x21, 128]
-	.loc 1 1580 0
+	.loc 1 1579 0
 	cbz	x0, .L414
 .LBB1405:
 .LBB1406:
@@ -5133,9 +5125,9 @@ ebc_probe:
 .LVL444:
 .LBE1406:
 .LBE1405:
-	.loc 1 1582 0
+	.loc 1 1581 0
 	str	x0, [x21, 136]
-	.loc 1 1583 0
+	.loc 1 1582 0
 	cbz	x0, .L414
 .LBB1407:
 .LBB1408:
@@ -5148,9 +5140,9 @@ ebc_probe:
 .LVL445:
 .LBE1408:
 .LBE1407:
-	.loc 1 1585 0
+	.loc 1 1584 0
 	str	x0, [x21, 144]
-	.loc 1 1586 0
+	.loc 1 1585 0
 	cbz	x0, .L414
 .LBB1409:
 .LBB1410:
@@ -5163,11 +5155,11 @@ ebc_probe:
 .LVL446:
 .LBE1410:
 .LBE1409:
-	.loc 1 1588 0
+	.loc 1 1587 0
 	str	x0, [x21, 152]
-	.loc 1 1589 0
+	.loc 1 1588 0
 	cbz	x0, .L414
-	.loc 1 1593 0
+	.loc 1 1592 0
 	ldp	w1, w2, [x22, 84]
 .LBB1411:
 .LBB1412:
@@ -5175,7 +5167,7 @@ ebc_probe:
 	mov	x0, x26
 .LBE1412:
 .LBE1411:
-	.loc 1 1593 0
+	.loc 1 1592 0
 	mul	w1, w1, w2
 .LBB1414:
 .LBB1413:
@@ -5187,18 +5179,18 @@ ebc_probe:
 .LVL447:
 .LBE1413:
 .LBE1414:
-	.loc 1 1593 0
+	.loc 1 1592 0
 	str	x0, [x21, 160]
-	.loc 1 1594 0
+	.loc 1 1593 0
 	cbz	x0, .L414
-	.loc 1 1596 0
+	.loc 1 1595 0
 	ldp	w2, w1, [x22, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	lsr	w2, w2, 4
 	bl	memset
 .LVL448:
-	.loc 1 1597 0
+	.loc 1 1596 0
 	ldrsw	x2, [x21, 20]
 	mov	w1, 255
 	ldr	x0, [x21, 144]
@@ -5208,45 +5200,45 @@ ebc_probe:
 .LBE1421:
 .LBB1422:
 .LBB1423:
-	.loc 1 1491 0
+	.loc 1 1490 0
 	ldr	x26, [x19, 272]
 .LVL450:
-	.loc 1 1497 0
+	.loc 1 1496 0
 	adrp	x1, .LC35
 	mov	w2, 0
 	add	x1, x1, :lo12:.LC35
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
 .LVL451:
-	.loc 1 1498 0
+	.loc 1 1497 0
 	cbz	x0, .L444
-	.loc 1 1501 0
+	.loc 1 1500 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
 .LVL452:
 	mov	w24, w0
-	.loc 1 1503 0
+	.loc 1 1502 0
 	cbz	w0, .L491
 .LVL453:
 .L415:
 .LBE1423:
 .LBE1422:
-	.loc 1 1818 0
+	.loc 1 1817 0
 	adrp	x1, .LC68
 	mov	x0, x20
 .LVL454:
 	add	x1, x1, :lo12:.LC68
 	bl	_dev_err
 .LVL455:
-	.loc 1 1819 0
+	.loc 1 1818 0
 	b	.L397
 .LVL456:
 	.p2align 3
 .L406:
-	.loc 1 1801 0
-	mov	w24, -22
 	.loc 1 1800 0
+	mov	w24, -22
+	.loc 1 1799 0
 	adrp	x1, .LC72
 	mov	w2, w24
 	add	x1, x1, :lo12:.LC72
@@ -5254,7 +5246,7 @@ ebc_probe:
 	bl	_dev_err
 .LVL457:
 .L397:
-	.loc 1 1843 0
+	.loc 1 1842 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w24
 .LVL458:
@@ -5292,7 +5284,7 @@ ebc_probe:
 	.cfi_restore_state
 .LBB1430:
 .LBB1417:
-	.loc 1 1547 0
+	.loc 1 1546 0
 	adrp	x1, .LC34
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC34
@@ -5301,13 +5293,13 @@ ebc_probe:
 .L411:
 .LBE1417:
 .LBE1430:
-	.loc 1 1811 0
+	.loc 1 1810 0
 	adrp	x1, .LC67
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC67
 	bl	_dev_err
 .LVL464:
-	.loc 1 1812 0
+	.loc 1 1811 0
 	b	.L397
 .LVL465:
 	.p2align 3
@@ -5440,7 +5432,7 @@ ebc_probe:
 .LBE1431:
 .LBB1432:
 .LBB1426:
-	.loc 1 1509 0
+	.loc 1 1508 0
 	mov	x0, x26
 	mov	x3, 1
 .LBB1424:
@@ -5452,28 +5444,28 @@ ebc_probe:
 	sub	x26, x26, x1
 .LBE1425:
 .LBE1424:
-	.loc 1 1509 0
+	.loc 1 1508 0
 	sxtw	x2, w26
 	bl	devm_memremap
 .LVL472:
 	str	x0, [x19, 384]
-	.loc 1 1511 0
+	.loc 1 1510 0
 	cbz	x0, .L493
-	.loc 1 1516 0
+	.loc 1 1515 0
 	bl	epd_lut_from_mem_init
 .LVL473:
-	.loc 1 1517 0
+	.loc 1 1516 0
 	tbnz	w0, #31, .L494
 .L417:
 .LBE1426:
 .LBE1432:
 .LBB1433:
 .LBB1434:
-	.loc 1 1606 0
+	.loc 1 1605 0
 	add	x0, x19, 744
 	mov	x1, 68719476704
 	str	x1, [x21, 552]
-	.loc 1 1608 0
+	.loc 1 1607 0
 	add	x25, x25, :lo12:.LANCHOR0
 .LBB1435:
 .LBB1436:
@@ -5487,7 +5479,7 @@ ebc_probe:
 .LBE1437:
 .LBE1436:
 .LBE1435:
-	.loc 1 1604 0
+	.loc 1 1603 0
 	mov	w26, 99
 .LBB1441:
 .LBB1440:
@@ -5496,32 +5488,32 @@ ebc_probe:
 	str	x0, [x0, 8]
 .LBE1440:
 .LBE1441:
-	.loc 1 1606 0
+	.loc 1 1605 0
 	adrp	x0, new_buffer_refresh
 	add	x0, x0, :lo12:new_buffer_refresh
 	str	x0, [x21, 576]
-	.loc 1 1608 0
+	.loc 1 1607 0
 	adrp	x3, .LC69
 	mov	w2, -1
 	add	x3, x3, :lo12:.LC69
 	mov	x1, x21
 	adrp	x0, ebc_auto_tast_function
-	.loc 1 1604 0
+	.loc 1 1603 0
 	str	w26, [x29, 104]
-	.loc 1 1608 0
+	.loc 1 1607 0
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	bl	kthread_create_on_node
 .LVL474:
 	str	x0, [x25, 8]
-	.loc 1 1609 0
+	.loc 1 1608 0
 	cmn	x0, #4096
 	bhi	.L495
-	.loc 1 1613 0
+	.loc 1 1612 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
 .LVL475:
-	.loc 1 1614 0
+	.loc 1 1613 0
 	ldr	x2, [x25, 8]
 .LBB1442:
 .LBB1443:
@@ -5563,7 +5555,7 @@ ebc_probe:
 .LBE1443:
 .LBE1442:
 .LBB1444:
-	.loc 1 1617 0
+	.loc 1 1616 0
 	adrp	x3, .LC40
 	adrp	x0, ebc_thread
 .LVL479:
@@ -5572,10 +5564,10 @@ ebc_probe:
 	add	x0, x0, :lo12:ebc_thread
 	mov	x1, x21
 .LBE1444:
-	.loc 1 1616 0
+	.loc 1 1615 0
 	str	w26, [x29, 104]
 .LBB1445:
-	.loc 1 1617 0
+	.loc 1 1616 0
 	bl	kthread_create_on_node
 .LVL480:
 	mov	x25, x0
@@ -5586,13 +5578,13 @@ ebc_probe:
 .LVL482:
 .LBE1445:
 	str	x25, [x21, 120]
-	.loc 1 1622 0
+	.loc 1 1621 0
 	add	x2, x29, 104
 	mov	w1, 1
 	mov	x0, x25
 	bl	sched_setscheduler_nocheck
 .LVL483:
-	.loc 1 1623 0
+	.loc 1 1622 0
 	ldr	x2, [x21, 120]
 .LBB1446:
 .LBB1447:
@@ -5636,7 +5628,7 @@ ebc_probe:
 .LBE1433:
 .LBB1450:
 .LBB1451:
-	.loc 1 1632 0
+	.loc 1 1631 0
 	mov	w0, -1
 .LVL487:
 	str	w0, [x21, 48]
@@ -5647,9 +5639,9 @@ ebc_probe:
 .LVL488:
 .LBE1453:
 .LBE1452:
-	.loc 1 1636 0
-	str	wzr, [x21, 28]
 	.loc 1 1635 0
+	str	wzr, [x21, 28]
+	.loc 1 1634 0
 	str	wzr, [x21, 80]
 .LBB1458:
 .LBB1454:
@@ -5657,7 +5649,7 @@ ebc_probe:
 	adrp	x1, .LC41
 .LBE1454:
 .LBE1458:
-	.loc 1 1631 0
+	.loc 1 1630 0
 	str	wzr, [x21, 192]
 .LBB1459:
 .LBB1455:
@@ -5665,14 +5657,14 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC41
 .LBE1455:
 .LBE1459:
-	.loc 1 1633 0
+	.loc 1 1632 0
 	str	wzr, [x21, 600]
-	.loc 1 1643 0
+	.loc 1 1642 0
 	add	x25, x19, 624
 .LVL489:
-	.loc 1 1634 0
+	.loc 1 1633 0
 	str	wzr, [x21, 604]
-	.loc 1 1644 0
+	.loc 1 1643 0
 	adrp	x26, jiffies
 .LBB1460:
 .LBB1456:
@@ -5680,7 +5672,7 @@ ebc_probe:
 	stp	xzr, xzr, [x0]
 .LBE1456:
 .LBE1460:
-	.loc 1 1644 0
+	.loc 1 1643 0
 	mov	x27, 268435455
 .LBB1461:
 .LBB1457:
@@ -5704,9 +5696,9 @@ ebc_probe:
 .LVL490:
 .LBE1457:
 .LBE1461:
-	.loc 1 1640 0
+	.loc 1 1639 0
 	str	wzr, [x21, 432]
-	.loc 1 1643 0
+	.loc 1 1642 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -5715,16 +5707,16 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_vdd_power_timeout
 	bl	init_timer_key
 .LVL491:
-	.loc 1 1644 0
+	.loc 1 1643 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
-	.loc 1 1647 0
+	.loc 1 1646 0
 	add	x25, x19, 680
-	.loc 1 1644 0
+	.loc 1 1643 0
 	add	x1, x1, x27
 	bl	mod_timer
 .LVL492:
-	.loc 1 1647 0
+	.loc 1 1646 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -5733,7 +5725,7 @@ ebc_probe:
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
 .LVL493:
-	.loc 1 1648 0
+	.loc 1 1647 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x25
 	add	x1, x1, x27
@@ -5743,88 +5735,88 @@ ebc_probe:
 .LBE1450:
 .LBB1462:
 .LBB1463:
-	.loc 1 1658 0
+	.loc 1 1657 0
 	adrp	x0, saved_command_line
 	adrp	x1, .LC42
-	.loc 1 1655 0
+	.loc 1 1654 0
 	stp	wzr, wzr, [x29, 100]
 .LVL495:
-	.loc 1 1658 0
+	.loc 1 1657 0
 	add	x1, x1, :lo12:.LC42
 	ldr	x25, [x0, #:lo12:saved_command_line]
 	mov	x0, x25
 	bl	strstr
 .LVL496:
-	.loc 1 1659 0
-	adrp	x1, .LC43
 	.loc 1 1658 0
+	adrp	x1, .LC43
+	.loc 1 1657 0
 	mov	x26, x0
 .LVL497:
-	.loc 1 1659 0
+	.loc 1 1658 0
 	add	x1, x1, :lo12:.LC43
 	mov	x0, x25
 	bl	strstr
 .LVL498:
 	mov	x28, x0
 .LVL499:
-	.loc 1 1664 0
+	.loc 1 1663 0
 	cbz	x26, .L420
-	.loc 1 1665 0
+	.loc 1 1664 0
 	add	x2, x29, 100
 	adrp	x1, .LC44
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC44
 	bl	sscanf
 .LVL500:
-	.loc 1 1666 0
+	.loc 1 1665 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
 	bls	.L496
 .L420:
-	.loc 1 1678 0
+	.loc 1 1677 0
 	mov	w25, 0
 .LVL501:
 	mov	x27, 0
 .LVL502:
-	.loc 1 1662 0
+	.loc 1 1661 0
 	mov	x26, 0
 .LVL503:
-	.loc 1 1678 0
+	.loc 1 1677 0
 	cbz	x28, .L440
 .LVL504:
 .L439:
-	.loc 1 1679 0
+	.loc 1 1678 0
 	add	x2, x29, 104
 	mov	x0, x28
 	adrp	x1, .LC47
 	add	x1, x1, :lo12:.LC47
 	bl	sscanf
 .LVL505:
-	.loc 1 1657 0
+	.loc 1 1656 0
 	mov	w28, 0
 .LVL506:
-	.loc 1 1680 0
+	.loc 1 1679 0
 	ldr	w2, [x29, 104]
-	.loc 1 1662 0
+	.loc 1 1661 0
 	mov	x26, 0
 .LVL507:
-	.loc 1 1680 0
+	.loc 1 1679 0
 	ldr	x0, [x19, 184]
 	cmp	x0, x2, uxtw
 	bls	.L497
 .L424:
-	.loc 1 1692 0
+	.loc 1 1691 0
 	cbz	w25, .L440
 .L423:
-	.loc 1 1699 0
+	.loc 1 1698 0
 	bl	ebc_empty_buf_get
 .LVL508:
 	mov	x25, x0
 .LVL509:
-	.loc 1 1700 0
+	.loc 1 1699 0
 	cbz	x0, .L426
-	.loc 1 1701 0
+	.loc 1 1700 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
@@ -5832,41 +5824,41 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL510:
-	.loc 1 1704 0
+	.loc 1 1703 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1702 0
+	.loc 1 1701 0
 	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 1707 0
+	.loc 1 1706 0
 	mov	x0, x25
-	.loc 1 1705 0
+	.loc 1 1704 0
 	ldr	w1, [x22, 84]
 	str	w1, [x25, 56]
-	.loc 1 1706 0
+	.loc 1 1705 0
 	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 1707 0
+	.loc 1 1706 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL511:
 .L426:
-	.loc 1 1711 0
+	.loc 1 1710 0
 	cbnz	w28, .L498
 .L428:
-	.loc 1 1724 0
+	.loc 1 1723 0
 	ldr	w0, [x21, 80]
 	adrp	x22, .LANCHOR1
 	cbz	w0, .L499
 .L430:
-	.loc 1 1729 0
+	.loc 1 1728 0
 	cbz	x27, .L431
-	.loc 1 1730 0
+	.loc 1 1729 0
 	mov	x0, x27
 	bl	kfree
 .LVL512:
 .L431:
-	.loc 1 1731 0
+	.loc 1 1730 0
 	cbz	x26, .L422
-	.loc 1 1732 0
+	.loc 1 1731 0
 	mov	x0, x26
 	bl	kfree
 .LVL513:
@@ -5883,44 +5875,44 @@ ebc_probe:
 .LBE1475:
 .LBB1478:
 .LBB1479:
-	.loc 1 1476 0
+	.loc 1 1475 0
 	add	x22, x22, :lo12:.LANCHOR1
 	add	x0, x22, 224
 	bl	misc_register
 .LVL514:
-	.loc 1 1478 0
+	.loc 1 1477 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 400
 	bl	device_create_file
 .LVL515:
-	.loc 1 1479 0
+	.loc 1 1478 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 432
 	bl	device_create_file
 .LVL516:
-	.loc 1 1480 0
+	.loc 1 1479 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 464
 	bl	device_create_file
 .LVL517:
-	.loc 1 1481 0
+	.loc 1 1480 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 496
 	bl	device_create_file
 .LVL518:
-	.loc 1 1482 0
+	.loc 1 1481 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 528
 	bl	device_create_file
 .LVL519:
-	.loc 1 1483 0
+	.loc 1 1482 0
 	ldr	x0, [x19, 272]
 	add	x1, x22, 560
 	bl	device_create_file
 .LVL520:
 .LBE1479:
 .LBE1478:
-	.loc 1 1840 0
+	.loc 1 1839 0
 	ldr	x0, [x21, 88]
 	adrp	x2, .LC15
 	adrp	x1, .LC51
@@ -5928,20 +5920,20 @@ ebc_probe:
 	add	x1, x1, :lo12:.LC51
 	bl	_dev_info
 .LVL521:
-	.loc 1 1842 0
+	.loc 1 1841 0
 	b	.L397
 .LVL522:
 	.p2align 3
 .L440:
 .LBB1480:
 .LBB1472:
-	.loc 1 1693 0
+	.loc 1 1692 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC50
 	add	x1, x1, :lo12:.LC50
 	bl	_dev_info
 .LVL523:
-	.loc 1 1694 0
+	.loc 1 1693 0
 	ldr	x0, [x19, 16]
 	bl	ebc_pmic_verity_vcom
 .LVL524:
@@ -5981,10 +5973,10 @@ ebc_probe:
 .L499:
 .LBE1465:
 .LBE1464:
-	.loc 1 1725 0
+	.loc 1 1724 0
 	mov	w2, 1
 	str	w2, [x21, 80]
-	.loc 1 1726 0
+	.loc 1 1725 0
 	add	x0, x22, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
@@ -5994,13 +5986,13 @@ ebc_probe:
 .LVL530:
 	.p2align 3
 .L497:
-	.loc 1 1682 0
+	.loc 1 1681 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC48
 	add	x1, x1, :lo12:.LC48
 	bl	_dev_info
 .LVL531:
-	.loc 1 1683 0
+	.loc 1 1682 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
 .LBB1466:
@@ -6017,13 +6009,13 @@ ebc_probe:
 .LBE1468:
 .LBE1467:
 .LBE1466:
-	.loc 1 1684 0
+	.loc 1 1683 0
 	cbz	x0, .L500
-	.loc 1 1688 0
+	.loc 1 1687 0
 	ldp	w2, w1, [x22, 84]
-	.loc 1 1681 0
+	.loc 1 1680 0
 	mov	w28, 1
-	.loc 1 1688 0
+	.loc 1 1687 0
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 104]
@@ -6043,7 +6035,7 @@ ebc_probe:
 .LBE1480:
 .LBB1481:
 .LBB1418:
-	.loc 1 1557 0
+	.loc 1 1556 0
 	mov	w24, -12
 	b	.L411
 .LVL537:
@@ -6053,14 +6045,14 @@ ebc_probe:
 .LBE1481:
 .LBB1482:
 .LBB1473:
-	.loc 1 1712 0
+	.loc 1 1711 0
 	bl	ebc_empty_buf_get
 .LVL538:
 	mov	x25, x0
 .LVL539:
-	.loc 1 1713 0
+	.loc 1 1712 0
 	cbz	x0, .L428
-	.loc 1 1714 0
+	.loc 1 1713 0
 	ldp	w2, w0, [x22, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
@@ -6068,33 +6060,33 @@ ebc_probe:
 	lsr	w2, w2, 1
 	bl	memcpy
 .LVL540:
-	.loc 1 1717 0
+	.loc 1 1716 0
 	stp	wzr, wzr, [x25, 48]
-	.loc 1 1715 0
+	.loc 1 1714 0
 	mov	w0, 7
 	str	w0, [x25, 40]
-	.loc 1 1718 0
+	.loc 1 1717 0
 	ldr	w0, [x22, 84]
 	str	w0, [x25, 56]
-	.loc 1 1720 0
-	mov	x0, x25
 	.loc 1 1719 0
+	mov	x0, x25
+	.loc 1 1718 0
 	ldr	w1, [x22, 88]
 	str	w1, [x25, 60]
-	.loc 1 1720 0
+	.loc 1 1719 0
 	bl	ebc_add_to_dsp_buf_list
 .LVL541:
 	b	.L428
 .LVL542:
 	.p2align 3
 .L496:
-	.loc 1 1668 0
+	.loc 1 1667 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC45
 	add	x1, x1, :lo12:.LC45
 	bl	_dev_info
 .LVL543:
-	.loc 1 1669 0
+	.loc 1 1668 0
 	ldp	w0, w1, [x22, 84]
 	mul	w0, w0, w1
 .LBB1469:
@@ -6111,9 +6103,9 @@ ebc_probe:
 .LBE1471:
 .LBE1470:
 .LBE1469:
-	.loc 1 1670 0
+	.loc 1 1669 0
 	cbz	x0, .L501
-	.loc 1 1674 0
+	.loc 1 1673 0
 	ldp	w2, w1, [x22, 84]
 	ldr	x3, [x19, 184]
 	mul	w2, w2, w1
@@ -6126,9 +6118,9 @@ ebc_probe:
 	add	x1, x3, x1
 	bl	memcpy
 .LVL548:
-	.loc 1 1678 0
+	.loc 1 1677 0
 	cbz	x28, .L445
-	.loc 1 1667 0
+	.loc 1 1666 0
 	mov	w25, 1
 .LVL549:
 	b	.L439
@@ -6139,26 +6131,26 @@ ebc_probe:
 .LBE1482:
 .LBB1483:
 .LBB1427:
-	.loc 1 1518 0
+	.loc 1 1517 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC37
 	add	x1, x1, :lo12:.LC37
 	bl	_dev_err
 .LVL551:
-	.loc 1 1519 0
+	.loc 1 1518 0
 	ldr	x0, [x19, 272]
 	mov	w2, w26
 	ldr	x1, [x19, 384]
 	bl	epd_lut_from_file_init
 .LVL552:
-	.loc 1 1520 0
+	.loc 1 1519 0
 	tbz	w0, #31, .L417
-	.loc 1 1521 0
+	.loc 1 1520 0
 	ldr	x0, [x19, 272]
 	adrp	x1, .LC38
-	.loc 1 1522 0
-	mov	w24, -1
 	.loc 1 1521 0
+	mov	w24, -1
+	.loc 1 1520 0
 	add	x1, x1, :lo12:.LC38
 	bl	_dev_err
 .LVL553:
@@ -6168,7 +6160,7 @@ ebc_probe:
 .L401:
 .LBE1427:
 .LBE1483:
-	.loc 1 1765 0
+	.loc 1 1764 0
 	mov	w24, -517
 	b	.L397
 .LVL555:
@@ -6176,7 +6168,7 @@ ebc_probe:
 .L495:
 .LBB1484:
 .LBB1448:
-	.loc 1 1610 0
+	.loc 1 1609 0
 	ldr	x0, [x21, 88]
 	adrp	x1, .LC39
 	add	x1, x1, :lo12:.LC39
@@ -6185,29 +6177,29 @@ ebc_probe:
 .L418:
 .LBE1448:
 .LBE1484:
-	.loc 1 1825 0
+	.loc 1 1824 0
 	adrp	x1, .LC71
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC71
-	.loc 1 1826 0
-	mov	w24, -1
 	.loc 1 1825 0
+	mov	w24, -1
+	.loc 1 1824 0
 	bl	_dev_err
 .LVL557:
-	.loc 1 1826 0
+	.loc 1 1825 0
 	b	.L397
 .LVL558:
 	.p2align 3
 .L419:
 .LBB1485:
 .LBB1449:
-	.loc 1 1619 0
+	.loc 1 1618 0
 	ldr	x0, [x21, 88]
 .LVL559:
 	adrp	x1, .LC70
-	.loc 1 1617 0
+	.loc 1 1616 0
 	str	x25, [x21, 120]
-	.loc 1 1619 0
+	.loc 1 1618 0
 	add	x1, x1, :lo12:.LC70
 	bl	_dev_err
 .LVL560:
@@ -6217,7 +6209,7 @@ ebc_probe:
 .L442:
 .LBE1449:
 .LBE1485:
-	.loc 1 1751 0
+	.loc 1 1750 0
 	mov	w24, -12
 	b	.L397
 .LVL562:
@@ -6225,86 +6217,86 @@ ebc_probe:
 .L443:
 .LBB1486:
 .LBB1419:
-	.loc 1 1542 0
+	.loc 1 1541 0
 	mov	w24, -19
 	b	.L411
 .LVL563:
 .L485:
 .LBE1419:
 .LBE1486:
-	.loc 1 1758 0
+	.loc 1 1757 0
 	adrp	x1, .LC23
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC23
-	.loc 1 1759 0
-	mov	w24, -19
 	.loc 1 1758 0
+	mov	w24, -19
+	.loc 1 1757 0
 	bl	_dev_err
 .LVL564:
-	.loc 1 1759 0
+	.loc 1 1758 0
 	b	.L397
 .L488:
-	.loc 1 1786 0
+	.loc 1 1785 0
 	adrp	x1, .LC27
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC27
-	.loc 1 1787 0
-	mov	w24, -517
 	.loc 1 1786 0
+	mov	w24, -517
+	.loc 1 1785 0
 	bl	_dev_err
 .LVL565:
-	.loc 1 1787 0
+	.loc 1 1786 0
 	b	.L397
 .L486:
-	.loc 1 1774 0
+	.loc 1 1773 0
 	adrp	x1, .LC25
 	mov	x0, x20
 	add	x1, x1, :lo12:.LC25
-	.loc 1 1775 0
-	mov	w24, -19
 	.loc 1 1774 0
+	mov	w24, -19
+	.loc 1 1773 0
 	bl	_dev_err
 .LVL566:
-	.loc 1 1775 0
+	.loc 1 1774 0
 	b	.L397
 .LVL567:
 .L444:
 .LBB1487:
 .LBB1428:
-	.loc 1 1499 0
+	.loc 1 1498 0
 	mov	w24, -19
 	b	.L415
 .LVL568:
 .L487:
 .LBE1428:
 .LBE1487:
-	.loc 1 1781 0
+	.loc 1 1780 0
 	adrp	x1, .LC26
 	mov	x0, x20
 .LVL569:
 	add	x1, x1, :lo12:.LC26
-	.loc 1 1782 0
-	mov	w24, -517
 	.loc 1 1781 0
+	mov	w24, -517
+	.loc 1 1780 0
 	bl	_dev_err
 .LVL570:
-	.loc 1 1782 0
+	.loc 1 1781 0
 	b	.L397
 .LVL571:
 .L493:
 .LBB1488:
 .LBB1429:
-	.loc 1 1512 0
+	.loc 1 1511 0
 	ldr	x0, [x19, 272]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
 	adrp	x1, .LC36
-	mov	w3, 1512
+	mov	w3, 1511
 	add	x2, x2, 16
 	add	x1, x1, :lo12:.LC36
-	.loc 1 1513 0
-	mov	w24, -12
 	.loc 1 1512 0
+	mov	w24, -12
+	.loc 1 1511 0
 	bl	_dev_err
 .LVL572:
 	b	.L415
@@ -6312,13 +6304,13 @@ ebc_probe:
 .L492:
 .LBE1429:
 .LBE1488:
-	.loc 1 1843 0
+	.loc 1 1842 0
 	bl	__stack_chk_fail
 .LVL574:
 .L500:
 .LBB1489:
 .LBB1474:
-	.loc 1 1685 0
+	.loc 1 1684 0
 	ldr	x0, [x21, 88]
 .LVL575:
 	adrp	x1, .LC49
@@ -6329,7 +6321,7 @@ ebc_probe:
 	b	.L422
 .LVL577:
 .L501:
-	.loc 1 1671 0
+	.loc 1 1670 0
 	ldr	x0, [x21, 88]
 .LVL578:
 	adrp	x1, .LC46
@@ -6340,10 +6332,10 @@ ebc_probe:
 	b	.L422
 .LVL580:
 .L445:
-	.loc 1 1657 0
+	.loc 1 1656 0
 	mov	w28, 0
 .LVL581:
-	.loc 1 1662 0
+	.loc 1 1661 0
 	mov	x26, 0
 .LVL582:
 	b	.L423
@@ -6466,7 +6458,7 @@ ebc_power_set.constprop.7:
 	.type	ebc_suspend, %function
 ebc_suspend:
 .LFB2842:
-	.loc 1 1853 0
+	.loc 1 1852 0
 	.cfi_startproc
 .LVL594:
 	stp	x29, x30, [sp, -32]!
@@ -6484,17 +6476,17 @@ ebc_suspend:
 	ldr	x20, [x0, 184]
 .LBE1499:
 .LBE1498:
-	.loc 1 1857 0
+	.loc 1 1856 0
 	add	x19, x20, 184
 	ldr	w0, [x19, 192]
 .LVL595:
 	cmp	w0, 1
 	beq	.L512
 .L510:
-	.loc 1 1861 0
+	.loc 1 1860 0
 	mov	w0, 1
 	str	w0, [x19, 604]
-	.loc 1 1863 0
+	.loc 1 1862 0
 	ldr	x1, [x20, 16]
 .LBB1500:
 .LBB1501:
@@ -6505,13 +6497,13 @@ ebc_suspend:
 .LVL596:
 .LBE1501:
 .LBE1500:
-	.loc 1 1864 0
+	.loc 1 1863 0
 	ldr	x0, [x19, 88]
 	adrp	x1, .LC75
 	add	x1, x1, :lo12:.LC75
 	bl	_dev_info
 .LVL597:
-	.loc 1 1867 0
+	.loc 1 1866 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -6525,7 +6517,7 @@ ebc_suspend:
 	.p2align 3
 .L512:
 	.cfi_restore_state
-	.loc 1 1858 0
+	.loc 1 1857 0
 	ldr	x0, [x19, 88]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
@@ -6534,7 +6526,7 @@ ebc_suspend:
 	add	x1, x1, :lo12:.LC74
 	bl	_dev_info
 .LVL598:
-	.loc 1 1859 0
+	.loc 1 1858 0
 	mov	x0, x20
 	bl	ebc_power_set.constprop.7
 .LVL599:
@@ -8061,14 +8053,14 @@ __func__.34835:
 	.size	__func__.34644, 16
 __func__.34644:
 	.string	"ebc_frame_start"
-	.type	__func__.35040, %object
-	.size	__func__.35040, 19
-__func__.35040:
+	.type	__func__.35039, %object
+	.size	__func__.35039, 19
+__func__.35039:
 	.string	"ebc_lut_table_init"
 	.zero	5
-	.type	__func__.35099, %object
-	.size	__func__.35099, 12
-__func__.35099:
+	.type	__func__.35098, %object
+	.size	__func__.35098, 12
+__func__.35098:
 	.string	"ebc_suspend"
 	.zero	4
 	.type	ebc_match, %object
@@ -8099,9 +8091,9 @@ ebc_ops:
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init1912, %object
-	.size	__addressable_ebc_init1912, 8
-__addressable_ebc_init1912:
+	.type	__addressable_ebc_init1911, %object
+	.size	__addressable_ebc_init1911, 8
+__addressable_ebc_init1911:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -8156,7 +8148,7 @@ __exitcall_ebc_exit:
 	.string	"%d\n"
 	.zero	4
 .LC15:
-	.string	"1.10"
+	.string	"1.11"
 	.zero	3
 .LC16:
 	.string	"%s\n"
@@ -36187,7 +36179,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3001
 	.byte	0x1
-	.2byte	0x558
+	.2byte	0x557
 	.4byte	0x7b4
 	.uleb128 0x9
 	.byte	0x3
@@ -36195,7 +36187,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3002
 	.byte	0x1
-	.2byte	0x562
+	.2byte	0x561
 	.4byte	0xc5df
 	.uleb128 0x9
 	.byte	0x3
@@ -36203,7 +36195,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3003
 	.byte	0x1
-	.2byte	0x571
+	.2byte	0x570
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36211,7 +36203,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0x57c
+	.2byte	0x57b
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36219,7 +36211,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3005
 	.byte	0x1
-	.2byte	0x58a
+	.2byte	0x589
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36227,7 +36219,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3006
 	.byte	0x1
-	.2byte	0x5ad
+	.2byte	0x5ac
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36235,7 +36227,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3007
 	.byte	0x1
-	.2byte	0x5b7
+	.2byte	0x5b6
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36243,7 +36235,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3008
 	.byte	0x1
-	.2byte	0x5c0
+	.2byte	0x5bf
 	.4byte	0xb372
 	.uleb128 0x9
 	.byte	0x3
@@ -36251,7 +36243,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3009
 	.byte	0x1
-	.2byte	0x759
+	.2byte	0x758
 	.4byte	0xa531
 	.uleb128 0x9
 	.byte	0x3
@@ -36268,7 +36260,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3010
 	.byte	0x1
-	.2byte	0x75e
+	.2byte	0x75d
 	.4byte	0xe5a6
 	.uleb128 0x9
 	.byte	0x3
@@ -36276,7 +36268,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3011
 	.byte	0x1
-	.2byte	0x764
+	.2byte	0x763
 	.4byte	0xd66d
 	.uleb128 0x9
 	.byte	0x3
@@ -36284,15 +36276,15 @@ __exitcall_ebc_exit:
 	.uleb128 0x4c
 	.4byte	.LASF3012
 	.byte	0x1
-	.2byte	0x778
+	.2byte	0x777
 	.4byte	0x443
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init1912
+	.8byte	__addressable_ebc_init1911
 	.uleb128 0x4c
 	.4byte	.LASF3013
 	.byte	0x1
-	.2byte	0x779
+	.2byte	0x778
 	.4byte	0x497
 	.uleb128 0x9
 	.byte	0x3
@@ -36300,7 +36292,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4d
 	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0x773
+	.2byte	0x772
 	.8byte	.LFB2845
 	.8byte	.LFE2845-.LFB2845
 	.uleb128 0x1
@@ -36313,7 +36305,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3014
 	.byte	0x1
-	.2byte	0x76e
+	.2byte	0x76d
 	.4byte	0xc6
 	.8byte	.LFB2844
 	.8byte	.LFE2844-.LFB2844
@@ -36327,7 +36319,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x50
 	.4byte	.LASF3015
 	.byte	0x1
-	.2byte	0x74d
+	.2byte	0x74c
 	.4byte	0xc6
 	.8byte	.LFB2843
 	.8byte	.LFE2843-.LFB2843
@@ -36337,25 +36329,25 @@ __exitcall_ebc_exit:
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x74d
+	.2byte	0x74c
 	.4byte	0xa545
 	.4byte	.LLST11
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x74f
+	.2byte	0x74e
 	.4byte	0xe461
 	.uleb128 0x46
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x750
+	.2byte	0x74f
 	.4byte	0xe6fb
 	.uleb128 0x53
 	.4byte	0x12f06
 	.8byte	.LBB802
 	.8byte	.LBE802-.LBB802
 	.byte	0x1
-	.2byte	0x74f
+	.2byte	0x74e
 	.4byte	0xe6cb
 	.uleb128 0x54
 	.4byte	0x12f17
@@ -36365,7 +36357,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB804
 	.8byte	.LBE804-.LBB804
 	.byte	0x1
-	.2byte	0x752
+	.2byte	0x751
 	.4byte	0xe6ed
 	.uleb128 0x54
 	.4byte	0x12b03
@@ -36380,7 +36372,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x50
 	.4byte	.LASF3017
 	.byte	0x1
-	.2byte	0x73c
+	.2byte	0x73b
 	.4byte	0xc6
 	.8byte	.LFB2842
 	.8byte	.LFE2842-.LFB2842
@@ -36390,31 +36382,31 @@ __exitcall_ebc_exit:
 	.uleb128 0x51
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x73c
+	.2byte	0x73b
 	.4byte	0xa545
 	.4byte	.LLST137
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x73e
+	.2byte	0x73d
 	.4byte	0xe461
 	.uleb128 0x46
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x73f
+	.2byte	0x73e
 	.4byte	0xe6fb
 	.uleb128 0x55
 	.4byte	.LASF3018
 	.4byte	0xe7da
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35099
+	.8byte	__func__.35098
 	.uleb128 0x53
 	.4byte	0x12f06
 	.8byte	.LBB1498
 	.8byte	.LBE1498-.LBB1498
 	.byte	0x1
-	.2byte	0x73e
+	.2byte	0x73d
 	.4byte	0xe780
 	.uleb128 0x54
 	.4byte	0x12f17
@@ -36424,7 +36416,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1500
 	.8byte	.LBE1500-.LBB1500
 	.byte	0x1
-	.2byte	0x747
+	.2byte	0x746
 	.4byte	0xe7a2
 	.uleb128 0x54
 	.4byte	0x12b1b
@@ -36451,7 +36443,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0x735
+	.2byte	0x734
 	.4byte	0xc6
 	.8byte	.LFB2841
 	.8byte	.LFE2841-.LFB2841
@@ -36461,7 +36453,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x735
+	.2byte	0x734
 	.4byte	0xd6e9
 	.4byte	.LLST13
 	.uleb128 0x4e
@@ -36471,7 +36463,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3021
 	.byte	0x1
-	.2byte	0x6c9
+	.2byte	0x6c8
 	.4byte	0xc6
 	.8byte	.LFB2840
 	.8byte	.LFE2840-.LFB2840
@@ -36481,63 +36473,63 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0x6c9
+	.2byte	0x6c8
 	.4byte	0xd6e9
 	.4byte	.LLST113
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x6cb
+	.2byte	0x6ca
 	.4byte	0xa545
 	.uleb128 0x46
 	.4byte	.LASF3022
 	.byte	0x1
-	.2byte	0x6cc
+	.2byte	0x6cb
 	.4byte	0xb869
 	.uleb128 0x57
 	.4byte	.LASF3023
 	.byte	0x1
-	.2byte	0x6cd
+	.2byte	0x6cc
 	.4byte	0xd6e9
 	.4byte	.LLST114
 	.uleb128 0x46
 	.4byte	.LASF3024
 	.byte	0x1
-	.2byte	0x6ce
+	.2byte	0x6cd
 	.4byte	0xb869
 	.uleb128 0x57
 	.4byte	.LASF3025
 	.byte	0x1
-	.2byte	0x6cf
+	.2byte	0x6ce
 	.4byte	0xc012
 	.4byte	.LLST115
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x6d0
+	.2byte	0x6cf
 	.4byte	0xe461
 	.uleb128 0x57
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x6d1
+	.2byte	0x6d0
 	.4byte	0xe6fb
 	.4byte	.LLST116
 	.uleb128 0x46
 	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x6d2
+	.2byte	0x6d1
 	.4byte	0xe117
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x6d3
+	.2byte	0x6d2
 	.4byte	0xc6
 	.uleb128 0x58
 	.4byte	0x12f24
 	.8byte	.LBB1279
 	.4byte	.Ldebug_ranges0+0x850
 	.byte	0x1
-	.2byte	0x6d5
+	.2byte	0x6d4
 	.4byte	0xe8fe
 	.uleb128 0x54
 	.4byte	0x12f4d
@@ -36554,7 +36546,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1283
 	.8byte	.LBE1283-.LBB1283
 	.byte	0x1
-	.2byte	0x6e7
+	.2byte	0x6e6
 	.4byte	0xe93d
 	.uleb128 0x54
 	.4byte	0x12e11
@@ -36573,7 +36565,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1286
 	.8byte	.LBE1286-.LBB1286
 	.byte	0x1
-	.2byte	0x6f8
+	.2byte	0x6f7
 	.4byte	0xe97d
 	.uleb128 0x54
 	.4byte	0x12e34
@@ -36592,7 +36584,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1289
 	.4byte	.Ldebug_ranges0+0x880
 	.byte	0x1
-	.2byte	0x706
+	.2byte	0x705
 	.4byte	0xf336
 	.uleb128 0x54
 	.4byte	0x11258
@@ -37373,7 +37365,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1391
 	.4byte	.Ldebug_ranges0+0xa30
 	.byte	0x1
-	.2byte	0x711
+	.2byte	0x710
 	.4byte	0xf518
 	.uleb128 0x54
 	.4byte	0xfd4a
@@ -37404,7 +37396,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1393
 	.4byte	.Ldebug_ranges0+0xaa0
 	.byte	0x1
-	.2byte	0x610
+	.2byte	0x60f
 	.4byte	0xf3a6
 	.uleb128 0x54
 	.4byte	0x12f6a
@@ -37414,7 +37406,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1397
 	.4byte	.Ldebug_ranges0+0xad0
 	.byte	0x1
-	.2byte	0x62b
+	.2byte	0x62a
 	.4byte	0xf3db
 	.uleb128 0x54
 	.4byte	0x12f4d
@@ -37431,7 +37423,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1405
 	.8byte	.LBE1405-.LBB1405
 	.byte	0x1
-	.2byte	0x62e
+	.2byte	0x62d
 	.4byte	0xf414
 	.uleb128 0x54
 	.4byte	0x12f4d
@@ -37448,7 +37440,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1407
 	.8byte	.LBE1407-.LBB1407
 	.byte	0x1
-	.2byte	0x631
+	.2byte	0x630
 	.4byte	0xf44d
 	.uleb128 0x54
 	.4byte	0x12f4d
@@ -37465,7 +37457,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1409
 	.8byte	.LBE1409-.LBB1409
 	.byte	0x1
-	.2byte	0x634
+	.2byte	0x633
 	.4byte	0xf486
 	.uleb128 0x54
 	.4byte	0x12f4d
@@ -37482,7 +37474,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1411
 	.4byte	.Ldebug_ranges0+0xb20
 	.byte	0x1
-	.2byte	0x639
+	.2byte	0x638
 	.4byte	0xf4bb
 	.uleb128 0x54
 	.4byte	0x12f4d
@@ -37522,7 +37514,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1422
 	.4byte	.Ldebug_ranges0+0xb50
 	.byte	0x1
-	.2byte	0x718
+	.2byte	0x717
 	.4byte	0xf5fe
 	.uleb128 0x54
 	.4byte	0xfdc4
@@ -37555,7 +37547,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1424
 	.8byte	.LBE1424-.LBB1424
 	.byte	0x1
-	.2byte	0x5e3
+	.2byte	0x5e2
 	.4byte	0xf594
 	.uleb128 0x54
 	.4byte	0x12f6a
@@ -37591,7 +37583,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1433
 	.4byte	.Ldebug_ranges0+0xbb0
 	.byte	0x1
-	.2byte	0x71f
+	.2byte	0x71e
 	.4byte	0xf78b
 	.uleb128 0x54
 	.4byte	0xfd12
@@ -37607,7 +37599,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1435
 	.4byte	.Ldebug_ranges0+0xbf0
 	.byte	0x1
-	.2byte	0x646
+	.2byte	0x645
 	.4byte	0xf685
 	.uleb128 0x54
 	.4byte	0x1313c
@@ -37636,7 +37628,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1442
 	.8byte	.LBE1442-.LBB1442
 	.byte	0x1
-	.2byte	0x64e
+	.2byte	0x64d
 	.4byte	0xf6d0
 	.uleb128 0x54
 	.4byte	0x1320a
@@ -37671,7 +37663,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1446
 	.8byte	.LBE1446-.LBB1446
 	.byte	0x1
-	.2byte	0x657
+	.2byte	0x656
 	.4byte	0xf748
 	.uleb128 0x54
 	.4byte	0x1320a
@@ -37710,7 +37702,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1450
 	.8byte	.LBE1450-.LBB1450
 	.byte	0x1
-	.2byte	0x726
+	.2byte	0x725
 	.4byte	0xf825
 	.uleb128 0x54
 	.4byte	0xfcf4
@@ -37719,7 +37711,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1452
 	.4byte	.Ldebug_ranges0+0xc50
 	.byte	0x1
-	.2byte	0x667
+	.2byte	0x666
 	.4byte	0xf7f0
 	.uleb128 0x54
 	.4byte	0x12baf
@@ -37755,7 +37747,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1462
 	.4byte	.Ldebug_ranges0+0xcb0
 	.byte	0x1
-	.2byte	0x729
+	.2byte	0x728
 	.4byte	0xfac8
 	.uleb128 0x54
 	.4byte	0xfc62
@@ -37796,7 +37788,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1464
 	.8byte	.LBE1464-.LBB1464
 	.byte	0x1
-	.2byte	0x69f
+	.2byte	0x69e
 	.4byte	0xf907
 	.uleb128 0x54
 	.4byte	0x1131c
@@ -37824,7 +37816,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1466
 	.8byte	.LBE1466-.LBB1466
 	.byte	0x1
-	.2byte	0x693
+	.2byte	0x692
 	.4byte	0xf95e
 	.uleb128 0x54
 	.4byte	0x12d27
@@ -37850,7 +37842,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1469
 	.8byte	.LBE1469-.LBB1469
 	.byte	0x1
-	.2byte	0x685
+	.2byte	0x684
 	.4byte	0xf9b5
 	.uleb128 0x54
 	.4byte	0x12d27
@@ -37941,7 +37933,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1475
 	.8byte	.LBE1475-.LBB1475
 	.byte	0x1
-	.2byte	0x72b
+	.2byte	0x72a
 	.4byte	0xfb11
 	.uleb128 0x54
 	.4byte	0x12df5
@@ -37964,7 +37956,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1478
 	.8byte	.LBE1478-.LBB1478
 	.byte	0x1
-	.2byte	0x72e
+	.2byte	0x72d
 	.4byte	0xfb8e
 	.uleb128 0x54
 	.4byte	0xfe4a
@@ -38036,202 +38028,202 @@ __exitcall_ebc_exit:
 	.uleb128 0x62
 	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0x673
+	.2byte	0x672
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfce7
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x673
+	.2byte	0x672
 	.4byte	0xe461
 	.uleb128 0x64
 	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x673
+	.2byte	0x672
 	.4byte	0xe117
 	.uleb128 0x46
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x675
+	.2byte	0x674
 	.4byte	0xe6fb
 	.uleb128 0x46
 	.4byte	.LASF3026
 	.byte	0x1
-	.2byte	0x676
+	.2byte	0x675
 	.4byte	0x6d
 	.uleb128 0x46
 	.4byte	.LASF3027
 	.byte	0x1
-	.2byte	0x677
+	.2byte	0x676
 	.4byte	0x6d
 	.uleb128 0x46
 	.4byte	.LASF3028
 	.byte	0x1
-	.2byte	0x678
+	.2byte	0x677
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3029
 	.byte	0x1
-	.2byte	0x679
+	.2byte	0x678
 	.4byte	0xc6
 	.uleb128 0x46
 	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0x67a
+	.2byte	0x679
 	.4byte	0x219
 	.uleb128 0x46
 	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0x67b
+	.2byte	0x67a
 	.4byte	0x219
 	.uleb128 0x52
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x67c
+	.2byte	0x67b
 	.4byte	0xe3fc
 	.uleb128 0x46
 	.4byte	.LASF3032
 	.byte	0x1
-	.2byte	0x67d
+	.2byte	0x67c
 	.4byte	0x443
 	.uleb128 0x46
 	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0x67e
+	.2byte	0x67d
 	.4byte	0x443
 	.byte	0
 	.uleb128 0x65
 	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x65c
+	.2byte	0x65b
 	.byte	0x1
 	.4byte	0xfd01
 	.uleb128 0x64
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x65c
+	.2byte	0x65b
 	.4byte	0xe6fb
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0x642
+	.2byte	0x641
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfd39
 	.uleb128 0x64
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x642
+	.2byte	0x641
 	.4byte	0xe6fb
 	.uleb128 0x46
 	.4byte	.LASF2463
 	.byte	0x1
-	.2byte	0x644
+	.2byte	0x643
 	.4byte	0xd7e9
 	.uleb128 0x66
 	.uleb128 0x52
 	.string	"__k"
 	.byte	0x1
-	.2byte	0x651
+	.2byte	0x650
 	.4byte	0x2eda
 	.byte	0
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0x5f9
+	.2byte	0x5f8
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfdb3
 	.uleb128 0x63
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x5f9
+	.2byte	0x5f8
 	.4byte	0xe461
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x5fb
+	.2byte	0x5fa
 	.4byte	0xa545
 	.uleb128 0x46
 	.4byte	.LASF2994
 	.byte	0x1
-	.2byte	0x5fc
+	.2byte	0x5fb
 	.4byte	0xe117
 	.uleb128 0x46
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x5fd
+	.2byte	0x5fc
 	.4byte	0xe6fb
 	.uleb128 0x46
 	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0x5fe
+	.2byte	0x5fd
 	.4byte	0xb869
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x5ff
+	.2byte	0x5fe
 	.4byte	0x9721
 	.uleb128 0x46
 	.4byte	.LASF3038
 	.byte	0x1
-	.2byte	0x600
+	.2byte	0x5ff
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x601
+	.2byte	0x600
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"i"
 	.byte	0x1
-	.2byte	0x601
+	.2byte	0x600
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x62
 	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0x5d0
+	.2byte	0x5cf
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfe24
 	.uleb128 0x64
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x5d0
+	.2byte	0x5cf
 	.4byte	0xe6fb
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x5d2
+	.2byte	0x5d1
 	.4byte	0xc6
 	.uleb128 0x52
 	.string	"dev"
 	.byte	0x1
-	.2byte	0x5d3
+	.2byte	0x5d2
 	.4byte	0xa545
 	.uleb128 0x46
 	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0x5d4
+	.2byte	0x5d3
 	.4byte	0xb869
 	.uleb128 0x52
 	.string	"r"
 	.byte	0x1
-	.2byte	0x5d5
+	.2byte	0x5d4
 	.4byte	0x9721
 	.uleb128 0x46
 	.4byte	.LASF3040
 	.byte	0x1
-	.2byte	0x5d6
+	.2byte	0x5d5
 	.4byte	0x29
 	.uleb128 0x46
 	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0x5d7
+	.2byte	0x5d6
 	.4byte	0xc6
 	.uleb128 0x67
 	.4byte	.LASF3018
@@ -38250,20 +38242,20 @@ __exitcall_ebc_exit:
 	.uleb128 0x62
 	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0x5c2
+	.2byte	0x5c1
 	.4byte	0xc6
 	.byte	0x1
 	.4byte	0xfe57
 	.uleb128 0x64
 	.4byte	.LASF2952
 	.byte	0x1
-	.2byte	0x5c2
+	.2byte	0x5c1
 	.4byte	0xe6fb
 	.byte	0
 	.uleb128 0x4f
 	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0x5b9
+	.2byte	0x5b8
 	.4byte	0x2d9
 	.8byte	.LFB2833
 	.8byte	.LFE2833-.LFB2833
@@ -38273,19 +38265,19 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5b9
+	.2byte	0x5b8
 	.4byte	0xa545
 	.4byte	.LLST66
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5ba
+	.2byte	0x5b9
 	.4byte	0xb3c0
 	.4byte	.LLST67
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5bb
+	.2byte	0x5ba
 	.4byte	0x219
 	.4byte	.LLST68
 	.uleb128 0x4e
@@ -38295,7 +38287,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0x5b0
+	.2byte	0x5af
 	.4byte	0x2d9
 	.8byte	.LFB2832
 	.8byte	.LFE2832-.LFB2832
@@ -38305,19 +38297,19 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x5b0
+	.2byte	0x5af
 	.4byte	0xa545
 	.4byte	.LLST69
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x5b1
+	.2byte	0x5b0
 	.4byte	0xb3c0
 	.4byte	.LLST70
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x5b2
+	.2byte	0x5b1
 	.4byte	0x219
 	.4byte	.LLST71
 	.uleb128 0x4e
@@ -38327,7 +38319,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0x598
+	.2byte	0x597
 	.4byte	0x2d9
 	.8byte	.LFB2831
 	.8byte	.LFE2831-.LFB2831
@@ -38337,43 +38329,43 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x598
+	.2byte	0x597
 	.4byte	0xa545
 	.4byte	.LLST81
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x599
+	.2byte	0x598
 	.4byte	0xb3c0
 	.4byte	.LLST82
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x59a
+	.2byte	0x599
 	.4byte	0x56
 	.4byte	.LLST83
 	.uleb128 0x56
 	.4byte	.LASF380
 	.byte	0x1
-	.2byte	0x59a
+	.2byte	0x599
 	.4byte	0x2ce
 	.4byte	.LLST84
 	.uleb128 0x68
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x59c
+	.2byte	0x59b
 	.4byte	0xe461
 	.4byte	.LLST85
 	.uleb128 0x57
 	.4byte	.LASF2453
 	.byte	0x1
-	.2byte	0x59d
+	.2byte	0x59c
 	.4byte	0xc6
 	.4byte	.LLST86
 	.uleb128 0x52
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x59d
+	.2byte	0x59c
 	.4byte	0xc6
 	.uleb128 0x4e
 	.8byte	.LVL267
@@ -38394,7 +38386,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x50
 	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0x58c
+	.2byte	0x58b
 	.4byte	0x2d9
 	.8byte	.LFB2830
 	.8byte	.LFE2830-.LFB2830
@@ -38404,37 +38396,37 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x58c
+	.2byte	0x58b
 	.4byte	0xa545
 	.4byte	.LLST72
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x58d
+	.2byte	0x58c
 	.4byte	0xb3c0
 	.4byte	.LLST73
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x58e
+	.2byte	0x58d
 	.4byte	0x219
 	.4byte	.LLST74
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x590
+	.2byte	0x58f
 	.4byte	0xe461
 	.uleb128 0x46
 	.4byte	.LASF2453
 	.byte	0x1
-	.2byte	0x591
+	.2byte	0x590
 	.4byte	0xc6
 	.uleb128 0x53
 	.4byte	0x12ab6
 	.8byte	.LBB1025
 	.8byte	.LBE1025-.LBB1025
 	.byte	0x1
-	.2byte	0x593
+	.2byte	0x592
 	.4byte	0x10073
 	.uleb128 0x54
 	.4byte	0x12ac6
@@ -38446,7 +38438,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x50
 	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0x57e
+	.2byte	0x57d
 	.4byte	0x2d9
 	.8byte	.LFB2829
 	.8byte	.LFE2829-.LFB2829
@@ -38456,30 +38448,30 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x57e
+	.2byte	0x57d
 	.4byte	0xa545
 	.4byte	.LLST75
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x57f
+	.2byte	0x57e
 	.4byte	0xb3c0
 	.4byte	.LLST76
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x580
+	.2byte	0x57f
 	.4byte	0x219
 	.4byte	.LLST77
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x582
+	.2byte	0x581
 	.4byte	0xe461
 	.uleb128 0x69
 	.string	"t"
 	.byte	0x1
-	.2byte	0x583
+	.2byte	0x582
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
@@ -38489,7 +38481,7 @@ __exitcall_ebc_exit:
 	.8byte	.LBB1027
 	.4byte	.Ldebug_ranges0+0x510
 	.byte	0x1
-	.2byte	0x585
+	.2byte	0x584
 	.4byte	0x1010f
 	.uleb128 0x54
 	.4byte	0x12aed
@@ -38506,7 +38498,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3048
 	.byte	0x1
-	.2byte	0x573
+	.2byte	0x572
 	.4byte	0x2d9
 	.8byte	.LFB2828
 	.8byte	.LFE2828-.LFB2828
@@ -38516,25 +38508,25 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x573
+	.2byte	0x572
 	.4byte	0xa545
 	.4byte	.LLST78
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x574
+	.2byte	0x573
 	.4byte	0xb3c0
 	.4byte	.LLST79
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x575
+	.2byte	0x574
 	.4byte	0x219
 	.4byte	.LLST80
 	.uleb128 0x52
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x577
+	.2byte	0x576
 	.4byte	0xe461
 	.uleb128 0x4e
 	.8byte	.LVL261
@@ -38543,7 +38535,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0x568
+	.2byte	0x567
 	.4byte	0x2d9
 	.8byte	.LFB2827
 	.8byte	.LFE2827-.LFB2827
@@ -38553,25 +38545,25 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF2197
 	.byte	0x1
-	.2byte	0x568
+	.2byte	0x567
 	.4byte	0xa545
 	.4byte	.LLST87
 	.uleb128 0x56
 	.4byte	.LASF2112
 	.byte	0x1
-	.2byte	0x569
+	.2byte	0x568
 	.4byte	0xb3c0
 	.4byte	.LLST88
 	.uleb128 0x51
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x56a
+	.2byte	0x569
 	.4byte	0x219
 	.4byte	.LLST89
 	.uleb128 0x46
 	.4byte	.LASF3050
 	.byte	0x1
-	.2byte	0x56c
+	.2byte	0x56b
 	.4byte	0x56
 	.uleb128 0x4e
 	.8byte	.LVL280
@@ -38583,7 +38575,7 @@ __exitcall_ebc_exit:
 	.uleb128 0x4f
 	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0x551
+	.2byte	0x550
 	.4byte	0xc6
 	.8byte	.LFB2826
 	.8byte	.LFE2826-.LFB2826
@@ -38593,13 +38585,13 @@ __exitcall_ebc_exit:
 	.uleb128 0x56
 	.4byte	.LASF415
 	.byte	0x1
-	.2byte	0x551
+	.2byte	0x550
 	.4byte	0x1c54
 	.4byte	.LLST10
 	.uleb128 0x6a
 	.4byte	.LASF1270
 	.byte	0x1
-	.2byte	0x551
+	.2byte	0x550
 	.4byte	0x5531
 	.uleb128 0x1
 	.byte	0x51
@@ -49443,6 +49435,8 @@ __exitcall_ebc_exit:
 	.string	"OOM_KILL"
 .LASF442:
 	.string	"i_hash"
+.LASF3012:
+	.string	"__addressable_ebc_init1911"
 .LASF3098:
 	.string	"gray_old"
 .LASF67:
@@ -52315,8 +52309,6 @@ __exitcall_ebc_exit:
 	.string	"dev_root"
 .LASF1693:
 	.string	"spc_warnlimit"
-.LASF3012:
-	.string	"__addressable_ebc_init1912"
 .LASF1492:
 	.string	"NR_WRITTEN"
 .LASF2580:
diff --git a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S
index 4df65d860aa7..58ffc170160f 100644
--- a/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S
+++ b/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S
@@ -12,182 +12,13 @@
 	.cfi_sections	.debug_frame
 	.align	2
 	.p2align 3,,7
-	.type	get_wf_buf, %function
-get_wf_buf:
-.LFB1553:
-	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform.c"
-	.loc 1 190 0
-	.cfi_startproc
-.LVL0:
-	.loc 1 191 0
-	adrp	x2, .LANCHOR0
-	.loc 1 198 0
-	cmp	w1, 3
-	.loc 1 191 0
-	ldr	x6, [x2, #:lo12:.LANCHOR0]
-.LVL1:
-	.loc 1 198 0
-	beq	.L3
-	ble	.L21
-	cmp	w1, 5
-	beq	.L8
-	blt	.L9
-	.loc 1 224 0
-	add	x2, x6, 532
-.LVL2:
-	.loc 1 225 0
-	add	x7, x6, 2132
-.LVL3:
-	.loc 1 198 0
-	cmp	w1, 6
-	bne	.L15
-	.p2align 2
-.L11:
-.LBB151:
-.LBB152:
-.LBB153:
-	.loc 1 173 0
-	cmp	w0, 0
-.LBE153:
-.LBB154:
-	.loc 1 174 0
-	mov	w3, 49
-.LBE154:
-.LBB155:
-	.loc 1 173 0
-	csel	w0, w0, wzr, ge
-.LVL4:
-.LBE155:
-.LBB156:
-	.loc 1 174 0
-	mov	x1, 0
-.LVL5:
-	cmp	w0, w3
-.LBE156:
-	.loc 1 170 0
-	mov	w5, 0
-.LVL6:
-.LBB157:
-	.loc 1 174 0
-	csel	w0, w0, w3, le
-	b	.L14
-	.p2align 3
-.L12:
-	add	x1, x1, 1
-.LBE157:
-	.loc 1 176 0
-	cmp	x1, 50
-	beq	.L22
-.L14:
-	.loc 1 177 0
-	ldrb	w3, [x2, x1]
-	.loc 1 182 0
-	add	x4, x2, x1
-	.loc 1 177 0
-	cmp	w0, w3
-	bgt	.L12
-	.loc 1 182 0
-	ldrb	w3, [x4, 1]
-	mov	w5, w1
-	cbnz	w3, .L12
-.LBE152:
-.LBE151:
-	.loc 1 233 0
-	ldr	w0, [x7, x1, lsl 2]
-	add	x0, x6, x0
-	.loc 1 235 0
-	ret
-.LVL7:
-	.p2align 3
-.L21:
-	.loc 1 198 0
-	cmp	w1, 1
-	beq	.L5
-	bgt	.L6
-	.loc 1 200 0
-	add	x2, x6, 148
-.LVL8:
-	.loc 1 201 0
-	add	x7, x6, 596
-.LVL9:
-	.loc 1 198 0
-	cbz	w1, .L11
-.L15:
-	.loc 1 228 0
-	mov	x0, 0
-.LVL10:
-	.loc 1 236 0
-	ret
-.LVL11:
-.L6:
-	.loc 1 208 0
-	add	x2, x6, 212
-.LVL12:
-	.loc 1 209 0
-	add	x7, x6, 852
-.LVL13:
-	.loc 1 210 0
-	b	.L11
-.LVL14:
-.L9:
-	.loc 1 216 0
-	add	x2, x6, 340
-.LVL15:
-	.loc 1 217 0
-	add	x7, x6, 1364
-.LVL16:
-	.loc 1 218 0
-	b	.L11
-.LVL17:
-	.p2align 3
-.L22:
-	sxtw	x1, w5
-	.loc 1 233 0
-	ldr	w0, [x7, x1, lsl 2]
-	add	x0, x6, x0
-	.loc 1 235 0
-	ret
-.LVL18:
-.L8:
-	.loc 1 220 0
-	add	x2, x6, 404
-.LVL19:
-	.loc 1 221 0
-	add	x7, x6, 1620
-.LVL20:
-	.loc 1 222 0
-	b	.L11
-.LVL21:
-.L5:
-	.loc 1 204 0
-	add	x2, x6, 468
-.LVL22:
-	.loc 1 205 0
-	add	x7, x6, 1876
-.LVL23:
-	.loc 1 206 0
-	b	.L11
-.LVL24:
-.L3:
-	.loc 1 212 0
-	add	x2, x6, 276
-.LVL25:
-	.loc 1 213 0
-	add	x7, x6, 1108
-.LVL26:
-	.loc 1 214 0
-	b	.L11
-	.cfi_endproc
-.LFE1553:
-	.size	get_wf_buf, .-get_wf_buf
-	.align	2
-	.p2align 3,,7
 	.type	decode_wf_data, %function
 decode_wf_data:
 .LFB1555:
-	.loc 1 245 0
+	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform.c"
+	.loc 1 242 0
 	.cfi_startproc
-.LVL27:
+.LVL0:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
@@ -197,55 +28,55 @@ decode_wf_data:
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 248 0
+	.loc 1 245 0
 	uxtw	x20, w1
-.LBB158:
-.LBB159:
-.LBB160:
+.LBB205:
+.LBB206:
+.LBB207:
 	.file 2 "./include/linux/slab.h"
 	.loc 2 553 0
 	mov	w1, 32960
-.LVL28:
-.LBE160:
-.LBE159:
-.LBE158:
-	.loc 1 245 0
+.LVL1:
+.LBE207:
+.LBE206:
+.LBE205:
+	.loc 1 242 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-.LBB165:
-.LBB163:
-.LBB161:
+.LBB212:
+.LBB210:
+.LBB208:
 	.loc 2 553 0
 	movk	w1, 0x60, lsl 16
-.LBE161:
-.LBE163:
-.LBE165:
-	.loc 1 245 0
+.LBE208:
+.LBE210:
+.LBE212:
+	.loc 1 242 0
 	mov	x21, x0
-.LBB166:
-.LBB164:
-.LBB162:
+.LBB213:
+.LBB211:
+.LBB209:
 	.loc 2 553 0
 	mov	x0, x20
-.LVL29:
+.LVL2:
 	bl	__kmalloc
-.LVL30:
+.LVL3:
 	mov	x19, x0
-.LBE162:
-.LBE164:
-.LBE166:
+.LBE209:
+.LBE211:
+.LBE213:
+	.loc 1 246 0
+	cbz	x0, .L2
 	.loc 1 249 0
-	cbz	x0, .L24
-	.loc 1 252 0
 	mov	x2, x20
 	add	x1, x21, 4
 	bl	memcpy
-.LVL31:
-.L24:
-	.loc 1 255 0
+.LVL4:
+.L2:
+	.loc 1 252 0
 	mov	x0, x19
 	ldr	x21, [sp, 32]
-.LVL32:
+.LVL5:
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
 	.cfi_restore 30
@@ -263,50 +94,199 @@ decode_wf_data:
 	.type	parse_wf_gray16.isra.3, %function
 parse_wf_gray16.isra.3:
 .LFB1568:
-	.loc 1 345 0
+	.loc 1 342 0
 	.cfi_startproc
-.LVL33:
+.LVL6:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	mov	x8, x0
-	.loc 1 352 0
-	mov	w0, w2
-	.loc 1 345 0
+.LBB222:
+.LBB223:
+	.loc 1 188 0
+	adrp	x4, .LANCHOR0
+.LBE223:
+.LBE222:
+	.loc 1 342 0
+	mov	x5, x0
+.LBB235:
+.LBB232:
+	.loc 1 195 0
+	cmp	w3, 3
+.LBE232:
+.LBE235:
+	.loc 1 342 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 345 0
+	.loc 1 342 0
 	mov	x19, x1
-	.loc 1 352 0
-	mov	w1, w3
-	bl	get_wf_buf
-.LVL34:
-	.loc 1 353 0
+.LBB236:
+.LBB233:
+	.loc 1 188 0
+	ldr	x0, [x4, #:lo12:.LANCHOR0]
+.LVL7:
+	.loc 1 195 0
+	beq	.L10
+	bls	.L32
+	cmp	w3, 5
+	beq	.L15
+	bcc	.L16
+	.loc 1 221 0
+	add	x4, x0, 532
+.LVL8:
+	.loc 1 222 0
+	add	x6, x0, 2132
+.LVL9:
+	.loc 1 195 0
+	cmp	w3, 6
+	beq	.L18
+	.loc 1 225 0
+	mov	x0, 0
+.LVL10:
+	b	.L9
+.LVL11:
+	.p2align 3
+.L32:
+	.loc 1 195 0
+	cmp	w3, 1
+	beq	.L12
+	.loc 1 197 0
+	add	x4, x0, 148
+.LVL12:
+	.loc 1 198 0
+	add	x6, x0, 596
+.LVL13:
+	.loc 1 195 0
+	bhi	.L33
+.L18:
+.LBB224:
+.LBB225:
+.LBB226:
+	.loc 1 173 0
+	cmp	w2, 0
+.LBE226:
+.LBB227:
+	.loc 1 174 0
+	mov	w3, 50
+.LVL14:
+.LBE227:
+.LBB228:
+	.loc 1 173 0
+	csel	w2, w2, wzr, ge
+.LVL15:
+.LBE228:
+.LBB229:
+	.loc 1 174 0
+	mov	x1, 0
+	cmp	w2, w3
+	csel	w2, w2, w3, le
+	b	.L21
+	.p2align 3
+.L19:
+	add	x1, x1, 1
+.LBE229:
+	.loc 1 176 0
+	cmp	x1, 50
+	beq	.L34
+.L21:
+	.loc 1 177 0
+	ldrb	w3, [x4, x1]
+	cmp	w2, w3
+	bge	.L19
+	lsl	x1, x1, 2
+.L20:
+.LBE225:
+.LBE224:
+	.loc 1 230 0
+	ldr	w1, [x6, x1]
+	add	x0, x0, x1
+.LVL16:
+.L9:
+.LBE233:
+.LBE236:
+	.loc 1 350 0
 	ldrb	w1, [x0]
-.LVL35:
-	.loc 1 355 0
-	str	w1, [x8]
-	.loc 1 359 0
+.LVL17:
+	.loc 1 352 0
+	str	w1, [x5]
+	.loc 1 356 0
 	lsl	w1, w1, 6
-.LVL36:
+.LVL18:
 	bl	decode_wf_data
-.LVL37:
+.LVL19:
 	str	x0, [x19]
-	.loc 1 363 0
+	.loc 1 358 0
 	cmp	x0, 0
 	mov	w0, -22
-	.loc 1 364 0
+	.loc 1 361 0
 	csel	w0, w0, wzr, eq
 	ldr	x19, [sp, 16]
 	ldp	x29, x30, [sp], 32
+	.cfi_remember_state
 	.cfi_restore 30
 	.cfi_restore 29
 	.cfi_restore 19
 	.cfi_def_cfa 31, 0
 	ret
+.LVL20:
+	.p2align 3
+.L34:
+	.cfi_restore_state
+.LBB237:
+.LBB234:
+.LBB231:
+.LBB230:
+	.loc 1 176 0
+	mov	x1, 0
+	b	.L20
+.LVL21:
+.L16:
+.LBE230:
+.LBE231:
+	.loc 1 213 0
+	add	x4, x0, 340
+.LVL22:
+	.loc 1 214 0
+	add	x6, x0, 1364
+.LVL23:
+	b	.L18
+.L33:
+	.loc 1 205 0
+	add	x4, x0, 212
+	.loc 1 206 0
+	add	x6, x0, 852
+	b	.L18
+.LVL24:
+.L15:
+	.loc 1 217 0
+	add	x4, x0, 404
+.LVL25:
+	.loc 1 218 0
+	add	x6, x0, 1620
+.LVL26:
+	b	.L18
+.LVL27:
+.L12:
+	.loc 1 201 0
+	add	x4, x0, 468
+.LVL28:
+	.loc 1 202 0
+	add	x6, x0, 1876
+.LVL29:
+	b	.L18
+.LVL30:
+.L10:
+	.loc 1 209 0
+	add	x4, x0, 276
+.LVL31:
+	.loc 1 210 0
+	add	x6, x0, 1108
+.LVL32:
+	b	.L18
+.LBE234:
+.LBE237:
 	.cfi_endproc
 .LFE1568:
 	.size	parse_wf_gray16.isra.3, .-parse_wf_gray16.isra.3
@@ -318,7 +298,7 @@ rkf_wf_input:
 .LFB1550:
 	.loc 1 128 0
 	.cfi_startproc
-.LVL38:
+.LVL33:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
@@ -343,103 +323,103 @@ rkf_wf_input:
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
 	.loc 1 132 0
-	cbnz	x1, .L33
+	cbnz	x1, .L35
 	mov	x21, x0
-.LBB175:
-.LBB176:
+.LBB246:
+.LBB247:
 	.loc 1 93 0
 	adrp	x1, .LC0
 	mov	x2, 12
 	add	x1, x1, :lo12:.LC0
 	add	x0, x0, 4
-.LVL39:
+.LVL34:
 	bl	strncmp
-.LVL40:
+.LVL35:
 	mov	w19, w0
-	cbnz	w0, .L53
-.LBE176:
-.LBE175:
-.LBB178:
-.LBB179:
+	cbnz	w0, .L55
+.LBE247:
+.LBE246:
+.LBB249:
+.LBB250:
 	.loc 1 106 0
 	ldr	w22, [x21]
 	cmp	w22, 262144
-	bgt	.L43
+	bgt	.L45
 	add	x20, x23, :lo12:.LANCHOR0
 	.loc 1 109 0
 	ldr	w24, [x21, w22, sxtw]
-.LBB180:
-.LBB181:
+.LBB251:
+.LBB252:
 	.loc 1 83 0
 	add	x20, x20, 8
 	mov	x2, 1024
 	mov	w1, 0
 	mov	x0, x20
 	bl	memset
-.LVL41:
-.LBB182:
-.LBB183:
+.LVL36:
+.LBB253:
+.LBB254:
 	.loc 1 69 0
 	mov	w5, 3511
 	.loc 1 74 0
 	mov	x7, x20
-.LBE183:
-.LBE182:
+.LBE254:
+.LBE253:
 	.loc 1 83 0
 	mov	x6, 0
-.LBB186:
-.LBB184:
+.LBB257:
+.LBB255:
 	.loc 1 69 0
 	movk	w5, 0x4c1, lsl 16
-.LVL42:
+.LVL37:
 	.p2align 2
-.L39:
+.L41:
 	lsl	w1, w6, 22
-.LBE184:
-.LBE186:
+.LBE255:
+.LBE257:
 	.loc 1 83 0
 	mov	w2, 8
-.LBB187:
-.LBB185:
+.LBB258:
+.LBB256:
 	.loc 1 66 0
 	mov	w0, 0
 	.p2align 2
-.L38:
+.L40:
 	.loc 1 68 0
 	eor	w4, w1, w0
 	.loc 1 69 0
 	eor	w3, w5, w0, lsl 1
 	cmp	w4, 0
 	lsl	w0, w0, 1
-.LVL43:
+.LVL38:
 	csel	w0, w0, w3, ge
-.LVL44:
+.LVL39:
 	.loc 1 72 0
 	lsl	w1, w1, 1
 	.loc 1 67 0
 	subs	w2, w2, #1
-	bne	.L38
+	bne	.L40
 	.loc 1 74 0
 	str	w0, [x6, x7]
 	add	x6, x6, 4
 	.loc 1 64 0
 	cmp	x6, 1024
-	bne	.L39
-.LBE185:
-.LBE187:
+	bne	.L41
+.LBE256:
+.LBE258:
 	.loc 1 85 0
-	cbz	w22, .L40
+	cbz	w22, .L42
 	.loc 1 86 0
 	add	x3, x23, :lo12:.LANCHOR0
 	.loc 1 85 0
 	mov	x1, 0
-.LVL45:
+.LVL40:
 	.loc 1 86 0
 	add	x3, x3, 8
 	.p2align 2
-.L41:
+.L43:
 	ldrb	w0, [x21, x1]
-.LVL46:
+.LVL41:
 	add	x1, x1, 1
 	.loc 1 85 0
 	cmp	w22, w1
@@ -448,34 +428,34 @@ rkf_wf_input:
 	ldr	w0, [x3, x0, lsl 2]
 	eor	w2, w0, w2, lsl 8
 	.loc 1 85 0
-	bhi	.L41
-.LVL47:
-.L40:
-.LBE181:
-.LBE180:
+	bhi	.L43
+.LVL42:
+.L42:
+.LBE252:
+.LBE251:
 	.loc 1 112 0
 	cmp	w24, w2
-	bne	.L54
-.LBE179:
-.LBE178:
+	bne	.L56
+.LBE250:
+.LBE249:
 	.loc 1 147 0
 	adrp	x0, .LC5
-.LVL48:
+.LVL43:
 	add	x1, x21, 20
-.LVL49:
+.LVL44:
 	add	x0, x0, :lo12:.LC5
 	bl	printk
-.LVL50:
+.LVL45:
 	.loc 1 149 0
 	str	x21, [x23, #:lo12:.LANCHOR0]
-.L33:
+.L35:
 	.loc 1 152 0
 	mov	w0, w19
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL51:
+.LVL46:
 	ldp	x23, x24, [sp, 48]
-.LVL52:
+.LVL47:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -488,36 +468,36 @@ rkf_wf_input:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL53:
-.L54:
+.LVL48:
+.L56:
 	.cfi_restore_state
-.LBB189:
-.LBB188:
+.LBB260:
+.LBB259:
 	.loc 1 113 0
 	adrp	x0, .LC3
-.LVL54:
+.LVL49:
 	mov	w1, w24
-.LVL55:
+.LVL50:
 	add	x0, x0, :lo12:.LC3
 	bl	printk
-.LVL56:
-.L43:
-.LBE188:
-.LBE189:
+.LVL51:
+.L45:
+.LBE259:
+.LBE260:
 	.loc 1 144 0
 	mov	w19, -1
 	.loc 1 143 0
 	adrp	x0, .LC4
 	add	x0, x0, :lo12:.LC4
 	bl	printk
-.LVL57:
+.LVL52:
 	.loc 1 152 0
 	mov	w0, w19
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL58:
+.LVL53:
 	ldp	x23, x24, [sp, 48]
-.LVL59:
+.LVL54:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 20
@@ -530,27 +510,27 @@ rkf_wf_input:
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL60:
-.L53:
+.LVL55:
+.L55:
 	.cfi_restore_state
-.LBB190:
-.LBB177:
+.LBB261:
+.LBB248:
 	.loc 1 96 0
 	adrp	x0, .LC1
 	add	x0, x0, :lo12:.LC1
 	bl	printk
-.LVL61:
-.LBE177:
-.LBE190:
-	.loc 1 138 0
+.LVL56:
+.LBE248:
+.LBE261:
+	.loc 1 138 0
 	mov	w19, -1
 	.loc 1 137 0
 	adrp	x0, .LC2
 	add	x0, x0, :lo12:.LC2
 	bl	printk
-.LVL62:
+.LVL57:
 	.loc 1 138 0
-	b	.L33
+	b	.L35
 	.cfi_endproc
 .LFE1550:
 	.size	rkf_wf_input, .-rkf_wf_input
@@ -580,266 +560,360 @@ rkf_wf_get_version:
 	.type	rkf_wf_get_lut, %function
 rkf_wf_get_lut:
 .LFB1564:
-	.loc 1 479 0
+	.loc 1 476 0
 	.cfi_startproc
-.LVL63:
-	.loc 1 484 0
-	adrp	x3, .LANCHOR0
-	ldr	x3, [x3, #:lo12:.LANCHOR0]
-	cbz	x3, .L92
-	.loc 1 487 0
-	cbz	x0, .L93
-	.loc 1 479 0
+.LVL58:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 492 0
-	mov	w3, 26215
-	movk	w3, 0x6666, lsl 16
-	.loc 1 479 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 21, -16
+	.cfi_offset 22, -8
+	.loc 1 481 0
+	adrp	x22, .LANCHOR0
+	.loc 1 476 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 492 0
-	adrp	x20, .LANCHOR1
+	.loc 1 481 0
+	ldr	x3, [x22, #:lo12:.LANCHOR0]
+	cbz	x3, .L109
+	.loc 1 484 0
+	cbz	x0, .L110
+	.loc 1 489 0
+	adrp	x21, .LANCHOR1
+	mov	w3, 26215
+	movk	w3, 0x6666, lsl 16
+	add	x6, x21, :lo12:.LANCHOR1
+	ldr	w5, [x21, #:lo12:.LANCHOR1]
 	smull	x4, w2, w3
-	.loc 1 479 0
-	stp	x21, x22, [sp, 32]
-	.cfi_offset 21, -16
-	.cfi_offset 22, -8
-	.loc 1 492 0
-	ldr	w5, [x20, #:lo12:.LANCHOR1]
-	add	x6, x20, :lo12:.LANCHOR1
+	smull	x3, w5, w3
 	asr	x4, x4, 33
 	sub	w4, w4, w2, asr 31
-	smull	x3, w5, w3
 	asr	x3, x3, 33
 	sub	w3, w3, w5, asr 31
 	cmp	w4, w3
-	beq	.L141
-.L60:
-	.loc 1 495 0
-	add	x3, x20, :lo12:.LANCHOR1
-	str	w2, [x20, #:lo12:.LANCHOR1]
-	.loc 1 496 0
-	mov	x2, x3
-.LVL64:
+	beq	.L160
+.L62:
+	mov	w20, w1
+	.loc 1 492 0
+	add	x1, x21, :lo12:.LANCHOR1
+.LVL59:
 	mov	x19, x0
-	.loc 1 499 0
+	.loc 1 496 0
 	ldr	x0, [x0, 8]
-.LVL65:
-	mov	w21, w1
+.LVL60:
+	.loc 1 492 0
+	str	w2, [x21, #:lo12:.LANCHOR1]
+	.loc 1 493 0
+	str	w20, [x1, 4]
 	.loc 1 496 0
-	str	w1, [x2, 4]
-	.loc 1 499 0
-	cbz	x0, .L61
-	.loc 1 500 0
+	cbz	x0, .L63
+	.loc 1 497 0
 	bl	kfree
-.LVL66:
-	.loc 1 501 0
+.LVL61:
+	.loc 1 498 0
 	str	xzr, [x19, 8]
-.LVL67:
-.L61:
+.LVL62:
+.L63:
+	.loc 1 501 0
+	cmp	w20, 2
+	beq	.L68
 	.loc 1 504 0
-	cmp	w21, 2
-	beq	.L66
-	.loc 1 507 0
-	cmp	w21, 11
-	beq	.L63
-	.loc 1 511 0
-	cmp	w21, 6
-	beq	.L64
-	bhi	.L65
-	cmp	w21, 3
+	cmp	w20, 11
+	beq	.L65
+	.loc 1 508 0
+	cmp	w20, 6
 	beq	.L66
-	bls	.L142
-	cmp	w21, 4
-	beq	.L69
-	cmp	w21, 5
-	bne	.L139
-	.loc 1 555 0
-	ldr	w20, [x20, #:lo12:.LANCHOR1]
-.LBB233:
-.LBB234:
-	.loc 1 395 0
-	mov	w1, 2
-	mov	w0, w20
-	bl	get_wf_buf
+	bhi	.L67
+	cmp	w20, 3
+	beq	.L68
+	bls	.L161
+	cmp	w20, 4
+	beq	.L71
+	cmp	w20, 5
+	bne	.L158
+.LBB332:
+.LBB333:
+.LBB334:
+.LBB335:
+.LBB336:
+.LBB337:
+.LBB338:
+	.loc 1 173 0
+	ldr	w20, [x21, #:lo12:.LANCHOR1]
+.LVL63:
+.LBE338:
+.LBB339:
+	.loc 1 174 0
+	mov	w3, 50
+.LBE339:
+.LBE337:
+.LBE336:
+	.loc 1 188 0
+	ldr	x1, [x22, #:lo12:.LANCHOR0]
+.LVL64:
+.LBB347:
+.LBB344:
+.LBB340:
+	.loc 1 174 0
+	mov	x0, 0
+.LBE340:
+.LBB341:
+	.loc 1 173 0
+	cmp	w20, 0
+	csel	w20, w20, wzr, ge
+.LBE341:
+.LBE344:
+.LBE347:
+	.loc 1 205 0
+	add	x4, x1, 212
+.LVL65:
+.LBB348:
+.LBB345:
+.LBB342:
+	.loc 1 174 0
+	cmp	w20, w3
+.LBE342:
+.LBE345:
+.LBE348:
+	.loc 1 206 0
+	add	x2, x1, 852
+.LVL66:
+.LBB349:
+.LBB346:
+.LBB343:
+	.loc 1 174 0
+	csel	w20, w20, w3, le
+.L92:
+.LBE343:
+	.loc 1 177 0
+	ldrb	w3, [x4, x0]
+	cmp	w20, w3
+	blt	.L162
+	add	x0, x0, 1
+	.loc 1 176 0
+	cmp	x0, 50
+	bne	.L92
+	mov	x0, 0
+.L91:
+.LBE346:
+.LBE349:
+	.loc 1 230 0
+	ldr	w2, [x2, x0]
+.LVL67:
+.LBE335:
+.LBE334:
+	.loc 1 399 0
+	add	x0, x1, x2
+	.loc 1 393 0
+	ldrb	w1, [x1, x2]
 .LVL68:
-	.loc 1 396 0
-	ldrb	w1, [x0]
-	.loc 1 398 0
+	.loc 1 395 0
 	str	w1, [x19]
-	.loc 1 402 0
+	.loc 1 399 0
 	lsl	w1, w1, 6
 	bl	decode_wf_data
 .LVL69:
 	str	x0, [x19, 8]
-	.loc 1 403 0
-	cbz	x0, .L139
-	.loc 1 408 0
-	mov	w1, 1
-	mov	w0, w20
-	bl	get_wf_buf
+	.loc 1 400 0
+	cbz	x0, .L158
+.LBB350:
+.LBB351:
+	.loc 1 188 0
+	ldr	x1, [x22, #:lo12:.LANCHOR0]
 .LVL70:
-.LBB235:
-.LBB236:
-	.loc 1 240 0
-	ldrb	w20, [x0]
-.LBE236:
-.LBE235:
-	.loc 1 411 0
-	ldr	w1, [x19]
-	orr	w1, w1, w20, lsl 8
+	.loc 1 202 0
+	mov	x0, 0
+	.loc 1 201 0
+	add	x3, x1, 468
+.LVL71:
+	.loc 1 202 0
+	add	x2, x1, 1876
+.LVL72:
+.L95:
+.LBB352:
+.LBB353:
+	.loc 1 177 0
+	ldrb	w4, [x3, x0]
+	cmp	w20, w4
+	blt	.L163
+	add	x0, x0, 1
+	.loc 1 176 0
+	cmp	x0, 50
+	bne	.L95
+	mov	x0, 0
+.L94:
+.LBE353:
+.LBE352:
+	.loc 1 230 0
+	ldr	w3, [x2, x0]
+.LVL73:
+.LBE351:
+.LBE350:
+	.loc 1 408 0
+	ldr	w2, [x19]
+.LVL74:
+	.loc 1 413 0
+	add	x0, x1, x3
+.LBB354:
+.LBB355:
+	.loc 1 237 0
+	ldrb	w20, [x1, x3]
+.LBE355:
+.LBE354:
+	.loc 1 408 0
+	orr	w1, w2, w20, lsl 8
+.LVL75:
 	str	w1, [x19]
-	.loc 1 416 0
+	.loc 1 413 0
 	lsl	w1, w20, 6
 	bl	decode_wf_data
-.LVL71:
-	.loc 1 417 0
-	cbz	x0, .L139
-.LBB237:
-.LBB238:
-	.loc 1 300 0
+.LVL76:
+	.loc 1 414 0
+	cbz	x0, .L158
+.LBB356:
+.LBB357:
+	.loc 1 297 0
 	mov	x5, x0
-.LVL72:
+.LVL77:
 	mov	w4, 0
-.LVL73:
+.LVL78:
 	ldr	x3, [x19, 8]
-.LVL74:
-	cbz	w20, .L137
-.L115:
+.LVL79:
+	cbz	w20, .L156
+.L132:
 	mov	x1, 0
-.L83:
-	.loc 1 302 0
+.L97:
+	.loc 1 299 0
 	ldr	w2, [x5, x1]
-	.loc 1 304 0
+	.loc 1 301 0
 	ldr	w6, [x3, x1]
-	.loc 1 303 0
+	.loc 1 300 0
 	and	w2, w2, -1073741821
-	.loc 1 305 0
+	.loc 1 302 0
 	and	w6, w6, 1073741820
-	.loc 1 307 0
+	.loc 1 304 0
 	orr	w2, w2, w6
 	str	w2, [x3, x1]
 	add	x1, x1, 4
-	.loc 1 301 0
+	.loc 1 298 0
 	cmp	x1, 64
-	bne	.L83
-	.loc 1 300 0
+	bne	.L97
+	.loc 1 297 0
 	add	w4, w4, 1
 	add	x5, x5, 64
 	add	x3, x3, 64
 	cmp	w4, w20
-	bne	.L115
-.LVL75:
-.L137:
-.LBE238:
-.LBE237:
-.LBE234:
-.LBE233:
-.LBB239:
-.LBB240:
-	.loc 1 341 0
+	bne	.L132
+.LVL80:
+.L156:
+.LBE357:
+.LBE356:
+.LBE333:
+.LBE332:
+.LBB358:
+.LBB359:
+	.loc 1 338 0
 	bl	kfree
-.LVL76:
+.LVL81:
 	ldr	w20, [x19]
-.LVL77:
-.L81:
-.LBE240:
-.LBE239:
-.LBB249:
-.LBB250:
-	.loc 1 452 0
+.LVL82:
+.L86:
+.LBE359:
+.LBE358:
+.LBB384:
+.LBB385:
+	.loc 1 449 0
 	and	w20, w20, 255
-.LVL78:
-	.loc 1 454 0
+.LVL83:
+	.loc 1 451 0
 	mov	w12, 0
 	lsl	w14, w20, 16
 	mov	x13, 0
-	cbz	w20, .L94
-.LVL79:
-.L114:
-.LBB251:
-	.loc 1 455 0
+	cbz	w20, .L111
+.LVL84:
+.L131:
+.LBB386:
+	.loc 1 452 0
 	ldr	x11, [x19, 8]
-.LVL80:
+.LVL85:
 	mov	w9, w12
-	.loc 1 456 0
+	.loc 1 453 0
 	mov	w10, 0
-	.loc 1 455 0
+	.loc 1 452 0
 	add	x11, x11, x13
-.LVL81:
+.LVL86:
 	.p2align 2
-.L87:
+.L104:
 	ubfiz	x8, x10, 2, 4
 	lsr	w7, w10, 4
 	add	x8, x11, x8
 	add	x7, x11, x7, lsl 2
-.LBE251:
-	.loc 1 454 0
+.LBE386:
+	.loc 1 451 0
 	mov	w1, 0
 	.p2align 2
-.L88:
-.LBB254:
-.LBB252:
-	.loc 1 459 0
+.L105:
+.LBB389:
+.LBB387:
+	.loc 1 456 0
 	lsr	w3, w1, 3
 	ldr	w0, [x7]
-	.loc 1 458 0
+	.loc 1 455 0
 	ldr	w2, [x8]
-	.loc 1 459 0
+	.loc 1 456 0
 	and	w3, w3, 30
-	.loc 1 460 0
+	.loc 1 457 0
 	ldr	x4, [x19, 16]
 	add	w5, w9, w1
-	.loc 1 458 0
+	.loc 1 455 0
 	ubfiz	w6, w1, 1, 4
-	.loc 1 459 0
+	.loc 1 456 0
 	lsr	w0, w0, w3
-	.loc 1 460 0
-	ubfiz	w0, w0, 2, 2
-.LBE252:
 	.loc 1 457 0
+	ubfiz	w0, w0, 2, 2
+.LBE387:
+	.loc 1 454 0
 	add	w1, w1, 1
-.LBB253:
-	.loc 1 458 0
+.LBB388:
+	.loc 1 455 0
 	lsr	w2, w2, w6
 	and	w2, w2, 3
-	.loc 1 460 0
+	.loc 1 457 0
 	orr	w0, w0, w2
 	strb	w0, [x4, w5, uxtw]
-.LBE253:
-	.loc 1 457 0
+.LBE388:
+	.loc 1 454 0
 	cmp	w1, 256
-	bne	.L88
-	.loc 1 456 0
+	bne	.L105
+	.loc 1 453 0
 	add	w10, w10, 1
 	add	w9, w9, 256
 	cmp	w10, 256
-	bne	.L87
+	bne	.L104
 	add	w12, w12, 65536
 	add	x13, x13, 64
-.LBE254:
-	.loc 1 454 0
+.LBE389:
+	.loc 1 451 0
 	cmp	w14, w12
-	bne	.L114
-.LVL82:
-.L94:
-.LBE250:
-.LBE249:
-	.loc 1 493 0
+	bne	.L131
+.LVL87:
+.L111:
+.LBE385:
+.LBE384:
+	.loc 1 490 0
 	mov	w0, 0
-.LVL83:
-.L58:
-	.loc 1 573 0
+.LVL88:
+.L60:
+	.loc 1 570 0
 	ldp	x19, x20, [sp, 16]
-.LVL84:
+.LVL89:
 	ldp	x21, x22, [sp, 32]
-.LVL85:
+.LVL90:
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
 	.cfi_restore 30
@@ -850,274 +924,482 @@ rkf_wf_get_lut:
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL86:
-.L141:
+.LVL91:
+.L160:
 	.cfi_restore_state
-	.loc 1 492 0 discriminator 1
+	.loc 1 489 0 discriminator 1
 	ldr	w3, [x6, 4]
 	cmp	w3, w1
-	bne	.L60
+	bne	.L62
+	b	.L111
+.LVL92:
+.L163:
+	lsl	x0, x0, 2
 	b	.L94
-.LVL87:
-.L74:
-.LBB255:
-.LBB247:
-	.loc 1 335 0
+.LVL93:
+.L162:
+	lsl	x0, x0, 2
+	b	.L91
+.LVL94:
+.L79:
+.LBB390:
+.LBB382:
+	.loc 1 332 0
 	str	xzr, [x19, 8]
-	.loc 1 337 0
+	.loc 1 334 0
 	mov	x0, x21
 	bl	kfree
-.LVL88:
-.L139:
-.LBE247:
-.LBE255:
-	.loc 1 515 0
+.LVL95:
+.L158:
+.LBE382:
+.LBE390:
+	.loc 1 512 0
 	mov	w0, -1
-	b	.L58
-.LVL89:
-.L69:
-.LBB256:
-.LBB257:
-	.loc 1 373 0
-	ldr	w0, [x20, #:lo12:.LANCHOR1]
-	mov	w1, 1
-	bl	get_wf_buf
-.LVL90:
-	.loc 1 374 0
-	ldrb	w20, [x0]
-.LVL91:
-	.loc 1 378 0
+	b	.L60
+.LVL96:
+.L71:
+.LBB391:
+.LBB392:
+.LBB393:
+.LBB394:
+.LBB395:
+.LBB396:
+.LBB397:
+	.loc 1 173 0
+	ldr	w1, [x21, #:lo12:.LANCHOR1]
+.LBE397:
+.LBB398:
+	.loc 1 174 0
+	mov	w4, 50
+.LBE398:
+.LBE396:
+.LBE395:
+	.loc 1 188 0
+	ldr	x2, [x22, #:lo12:.LANCHOR0]
+.LVL97:
+.LBB406:
+.LBB403:
+.LBB399:
+	.loc 1 174 0
+	mov	x0, 0
+.LBE399:
+.LBB400:
+	.loc 1 173 0
+	cmp	w1, 0
+	csel	w1, w1, wzr, ge
+.LBE400:
+.LBE403:
+.LBE406:
+	.loc 1 201 0
+	add	x5, x2, 468
+.LVL98:
+.LBB407:
+.LBB404:
+.LBB401:
+	.loc 1 174 0
+	cmp	w1, w4
+.LBE401:
+.LBE404:
+.LBE407:
+	.loc 1 202 0
+	add	x3, x2, 1876
+.LVL99:
+.LBB408:
+.LBB405:
+.LBB402:
+	.loc 1 174 0
+	csel	w1, w1, w4, le
+.L89:
+.LBE402:
+	.loc 1 177 0
+	ldrb	w4, [x5, x0]
+	cmp	w1, w4
+	blt	.L164
+	add	x0, x0, 1
+	.loc 1 176 0
+	cmp	x0, 50
+	bne	.L89
+	mov	x0, 0
+.L88:
+.LBE405:
+.LBE408:
+	.loc 1 230 0
+	ldr	w1, [x3, x0]
+.LBE394:
+.LBE393:
+	.loc 1 375 0
+	add	x0, x2, x1
+	.loc 1 371 0
+	ldrb	w20, [x2, x1]
+.LVL100:
+	.loc 1 375 0
 	lsl	w1, w20, 6
 	bl	decode_wf_data
-.LVL92:
+.LVL101:
 	str	x0, [x19, 8]
+	.loc 1 376 0
+	cbz	x0, .L158
 	.loc 1 379 0
-	cbz	x0, .L139
-	.loc 1 382 0
 	str	w20, [x19]
-	b	.L81
-.LVL93:
-.L142:
-.LBE257:
-.LBE256:
-	.loc 1 511 0
-	cmp	w21, 1
-	bne	.L139
-.LBB258:
-.LBB248:
-	.loc 1 322 0
-	ldr	w0, [x20, #:lo12:.LANCHOR1]
-	mov	w1, 0
-	bl	get_wf_buf
-.LVL94:
+	b	.L86
+.LVL102:
+.L161:
+.LBE392:
+.LBE391:
+	.loc 1 508 0
+	cmp	w20, 1
+	bne	.L158
+.LBB409:
+.LBB383:
+.LBB360:
+.LBB361:
+.LBB362:
+.LBB363:
+.LBB364:
+	.loc 1 173 0
+	ldr	w1, [x21, #:lo12:.LANCHOR1]
+.LBE364:
+.LBB365:
+	.loc 1 174 0
+	mov	w4, 50
+.LBE365:
+.LBE363:
+.LBE362:
+	.loc 1 188 0
+	ldr	x2, [x22, #:lo12:.LANCHOR0]
+.LVL103:
+.LBB373:
+.LBB370:
+.LBB366:
+	.loc 1 174 0
+	mov	x0, 0
+.LBE366:
+.LBB367:
+	.loc 1 173 0
+	cmp	w1, 0
+	csel	w1, w1, wzr, ge
+.LBE367:
+.LBE370:
+.LBE373:
+	.loc 1 197 0
+	add	x5, x2, 148
+.LVL104:
+.LBB374:
+.LBB371:
+.LBB368:
+	.loc 1 174 0
+	cmp	w1, w4
+.LBE368:
+.LBE371:
+.LBE374:
+	.loc 1 198 0
+	add	x3, x2, 596
+.LVL105:
+.LBB375:
+.LBB372:
+.LBB369:
+	.loc 1 174 0
+	csel	w1, w1, w4, le
+.L77:
+.LBE369:
+	.loc 1 177 0
+	ldrb	w4, [x5, x0]
+	cmp	w1, w4
+	blt	.L165
+	add	x0, x0, 1
+	.loc 1 176 0
+	cmp	x0, 50
+	bne	.L77
+	mov	x0, 0
+.L76:
+.LBE372:
+.LBE375:
+	.loc 1 230 0
+	ldr	w1, [x3, x0]
+.LBE361:
+.LBE360:
+	.loc 1 324 0
+	add	x0, x2, x1
+	.loc 1 320 0
+	ldrb	w22, [x2, x1]
+.LVL106:
 	.loc 1 323 0
-	ldrb	w22, [x0]
-.LVL95:
-	.loc 1 326 0
 	add	w20, w22, 15
+.LVL107:
 	lsr	w20, w20, 4
-	.loc 1 327 0
+	.loc 1 324 0
 	lsl	w1, w20, 2
 	bl	decode_wf_data
-.LVL96:
+.LVL108:
 	mov	x21, x0
-.LVL97:
-	.loc 1 328 0
-	cbz	x0, .L139
-	.loc 1 332 0
+	.loc 1 325 0
+	cbz	x0, .L158
+	.loc 1 329 0
 	str	w22, [x19]
-.LBB241:
-.LBB242:
-.LBB243:
-.LBB244:
-.LBB245:
+.LBB376:
+.LBB377:
+	.loc 1 265 0
+	lsl	w0, w20, 10
+.LBB378:
+.LBB379:
+.LBB380:
 	.loc 2 553 0
 	mov	w1, 32960
+	sxtw	x0, w0
 	movk	w1, 0x60, lsl 16
-	ubfiz	x0, x20, 10, 5
 	bl	__kmalloc
-.LVL98:
-.LBE245:
-.LBE244:
-.LBE243:
+.LVL109:
+.LBE380:
+.LBE379:
+.LBE378:
+	.loc 1 266 0
+	cbz	x0, .L79
 	.loc 1 269 0
-	cbz	x0, .L74
-	.loc 1 272 0
-	cbz	w20, .L75
+	cbz	w20, .L80
 	mov	x4, 0
-.LVL99:
-.L79:
-	.loc 1 273 0
+.LVL110:
+.L84:
+	.loc 1 270 0
 	ldr	w8, [x21, x4, lsl 2]
-.LVL100:
+.LVL111:
 	lsl	w1, w4, 8
 	mov	w6, 0
-.LVL101:
-.L78:
-.LBB246:
-	.loc 1 275 0
+.LVL112:
+.L83:
+.LBB381:
+	.loc 1 272 0
 	asr	w5, w8, w6
-.LVL102:
+.LVL113:
 	and	w5, w5, 3
-.LVL103:
-	.loc 1 276 0
+.LVL114:
+	.loc 1 273 0
 	mov	w3, w5
-	.loc 1 275 0
+	.loc 1 272 0
 	mov	w2, 0
-.L76:
-	.loc 1 279 0
+.L81:
+	.loc 1 276 0
 	lsl	w7, w5, w2
 	add	w2, w2, 2
 	orr	w3, w3, w7
-	.loc 1 278 0
+	.loc 1 275 0
 	cmp	w2, 32
-	bne	.L76
+	bne	.L81
 	add	w2, w1, 16
-.L77:
-	.loc 1 282 0
+.L82:
+	.loc 1 279 0
 	str	w3, [x0, w1, sxtw 2]
-	.loc 1 281 0
+	.loc 1 278 0
 	add	w1, w1, 1
 	cmp	w1, w2
-	bne	.L77
+	bne	.L82
 	add	w6, w6, 2
-.LBE246:
-	.loc 1 274 0
+.LBE381:
+	.loc 1 271 0
 	cmp	w6, 32
-	bne	.L78
+	bne	.L83
 	add	x4, x4, 1
-	.loc 1 272 0
+	.loc 1 269 0
 	cmp	w20, w4
-	bgt	.L79
-.L75:
-.LBE242:
-.LBE241:
-	.loc 1 335 0
+	bgt	.L84
+.L80:
+.LBE377:
+.LBE376:
+	.loc 1 332 0
 	str	x0, [x19, 8]
-	.loc 1 341 0
+	.loc 1 338 0
 	mov	x0, x21
-	b	.L137
-.LVL104:
-.L63:
-.LBE248:
-.LBE258:
-	.loc 1 531 0
-	ldr	w2, [x20, #:lo12:.LANCHOR1]
+	b	.L156
+.LVL115:
+.L164:
+	lsl	x0, x0, 2
+	b	.L88
+.LVL116:
+.L65:
+.LBE383:
+.LBE409:
+	.loc 1 528 0
+	ldr	w2, [x21, #:lo12:.LANCHOR1]
+.LVL117:
 	mov	w3, 4
 	add	x1, x19, 8
 	mov	x0, x19
 	bl	parse_wf_gray16.isra.3
-.LVL105:
-	.loc 1 532 0
-	cbnz	w0, .L139
-.L138:
+.LVL118:
+	.loc 1 529 0
+	cbnz	w0, .L158
+.L157:
 	ldr	w20, [x19]
-	b	.L81
-.L66:
-	.loc 1 543 0
-	ldr	w2, [x20, #:lo12:.LANCHOR1]
+.LVL119:
+	b	.L86
+.LVL120:
+.L68:
+	.loc 1 540 0
+	ldr	w2, [x21, #:lo12:.LANCHOR1]
+.LVL121:
 	mov	w3, 2
 	add	x1, x19, 8
 	mov	x0, x19
 	bl	parse_wf_gray16.isra.3
-.LVL106:
-	.loc 1 544 0
-	cbz	w0, .L138
-	b	.L139
-.LVL107:
-.L93:
-	.cfi_def_cfa 31, 0
-	.cfi_restore 19
-	.cfi_restore 20
-	.cfi_restore 21
-	.cfi_restore 22
-	.cfi_restore 29
-	.cfi_restore 30
-	.loc 1 488 0
-	mov	w0, -22
-.LVL108:
-	ret
-.LVL109:
-.L92:
+.LVL122:
+	.loc 1 541 0
+	cbz	w0, .L157
+	b	.L158
+.LVL123:
+.L110:
 	.loc 1 485 0
+	mov	w0, -22
+.LVL124:
+	b	.L60
+.LVL125:
+.L109:
+	.loc 1 482 0
 	mov	w0, -19
-.LVL110:
-	ret
-.LVL111:
-.L65:
-	.cfi_def_cfa 29, 48
-	.cfi_offset 19, -32
-	.cfi_offset 20, -24
-	.cfi_offset 21, -16
-	.cfi_offset 22, -8
-	.cfi_offset 29, -48
-	.cfi_offset 30, -40
-	.loc 1 511 0
-	cmp	w21, 8
-	beq	.L71
-	bcc	.L66
-	cmp	w21, 9
-	beq	.L63
-	cmp	w21, 10
-	bne	.L139
-	.loc 1 537 0
-	ldr	w2, [x20, #:lo12:.LANCHOR1]
+.LVL126:
+	b	.L60
+.LVL127:
+.L67:
+	.loc 1 508 0
+	cmp	w20, 8
+	beq	.L73
+	bcc	.L68
+	cmp	w20, 9
+	beq	.L65
+	cmp	w20, 10
+	bne	.L158
+	.loc 1 534 0
+	ldr	w2, [x21, #:lo12:.LANCHOR1]
+.LVL128:
 	mov	w3, 5
 	add	x1, x19, 8
 	mov	x0, x19
 	bl	parse_wf_gray16.isra.3
-.LVL112:
-	.loc 1 538 0
-	cbz	w0, .L138
-	b	.L139
-.L64:
-.LBB259:
-.LBB260:
+.LVL129:
+	.loc 1 535 0
+	cbz	w0, .L157
+	b	.L158
+.LVL130:
+.L66:
+.LBB410:
+.LBB411:
+.LBB412:
+.LBB413:
+.LBB414:
+.LBB415:
+.LBB416:
+	.loc 1 173 0
+	ldr	w1, [x21, #:lo12:.LANCHOR1]
+.LBE416:
+.LBB417:
+	.loc 1 174 0
+	mov	w4, 50
+.LBE417:
+.LBE415:
+.LBE414:
+	.loc 1 188 0
+	ldr	x2, [x22, #:lo12:.LANCHOR0]
+.LVL131:
+.LBB425:
+.LBB422:
+.LBB418:
+	.loc 1 174 0
+	mov	x0, 0
+.LBE418:
+.LBB419:
+	.loc 1 173 0
+	cmp	w1, 0
+	csel	w1, w1, wzr, ge
+.LBE419:
+.LBE422:
+.LBE425:
+	.loc 1 221 0
+	add	x5, x2, 532
+.LVL132:
+.LBB426:
+.LBB423:
+.LBB420:
+	.loc 1 174 0
+	cmp	w1, w4
+.LBE420:
+.LBE423:
+.LBE426:
+	.loc 1 222 0
+	add	x3, x2, 2132
+.LVL133:
+.LBB427:
+.LBB424:
+.LBB421:
+	.loc 1 174 0
+	csel	w1, w1, w4, le
+.L102:
+.LBE421:
+	.loc 1 177 0
+	ldrb	w4, [x5, x0]
+	cmp	w1, w4
+	blt	.L166
+	add	x0, x0, 1
+	.loc 1 176 0
+	cmp	x0, 50
+	bne	.L102
+	mov	x0, 0
+.L101:
+.LBE424:
+.LBE427:
+	.loc 1 230 0
+	ldr	w1, [x3, x0]
+.LBE413:
+.LBE412:
+	.loc 1 438 0
+	add	x0, x2, x1
+	.loc 1 432 0
+	ldrb	w1, [x2, x1]
+.LVL134:
 	.loc 1 434 0
-	ldr	w0, [x20, #:lo12:.LANCHOR1]
-	mov	w1, w21
-	bl	get_wf_buf
-.LVL113:
-	.loc 1 435 0
-	ldrb	w1, [x0]
-.LVL114:
-	.loc 1 437 0
 	str	w1, [x19]
-	.loc 1 441 0
+	.loc 1 438 0
 	lsl	w1, w1, 6
-.LVL115:
+.LVL135:
 	bl	decode_wf_data
-.LVL116:
+.LVL136:
 	str	x0, [x19, 8]
-	.loc 1 442 0
-	cbnz	x0, .L138
-	b	.L139
-.L71:
-.LBE260:
-.LBE259:
-	.loc 1 525 0
-	ldr	w2, [x20, #:lo12:.LANCHOR1]
+	.loc 1 439 0
+	cbnz	x0, .L157
+	b	.L158
+.LVL137:
+.L73:
+.LBE411:
+.LBE410:
+	.loc 1 522 0
+	ldr	w2, [x21, #:lo12:.LANCHOR1]
+.LVL138:
 	mov	w3, 3
 	add	x1, x19, 8
 	mov	x0, x19
 	bl	parse_wf_gray16.isra.3
-.LVL117:
-	.loc 1 526 0
-	cbz	w0, .L138
-	b	.L139
+.LVL139:
+	.loc 1 523 0
+	cbz	w0, .L157
+	b	.L158
+.LVL140:
+.L166:
+	lsl	x0, x0, 2
+	b	.L101
+.LVL141:
+.L165:
+	lsl	x0, x0, 2
+	b	.L76
 	.cfi_endproc
 .LFE1564:
 	.size	rkf_wf_get_lut, .-rkf_wf_get_lut
 	.data
 	.align	2
 	.set	.LANCHOR1,. + 0
-	.type	sftemp.16971, %object
-	.size	sftemp.16971, 4
-sftemp.16971:
+	.type	sftemp.16970, %object
+	.size	sftemp.16970, 4
+sftemp.16970:
 	.word	-1
-	.type	stype.16970, %object
-	.size	stype.16970, 4
-stype.16970:
+	.type	stype.16969, %object
+	.size	stype.16969, 4
+stype.16969:
 	.word	12
 	.bss
 	.align	3
@@ -1251,15 +1533,15 @@ crc32_table:
 	.file 100 "./arch/arm64/include/asm/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x7001
+	.4byte	0x7342
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF1533
+	.4byte	.LASF1532
 	.byte	0x1
+	.4byte	.LASF1533
 	.4byte	.LASF1534
-	.4byte	.LASF1535
 	.8byte	.Ltext0
 	.8byte	.Letext0-.Ltext0
 	.4byte	.Ldebug_line0
@@ -9699,7 +9981,7 @@ crc32_table:
 	.2byte	0x510
 	.4byte	0x45dd
 	.uleb128 0x40
-	.4byte	.LASF1536
+	.4byte	.LASF1535
 	.byte	0x22
 	.2byte	0x510
 	.4byte	0x6c
@@ -13124,926 +13406,1173 @@ crc32_table:
 	.byte	0x3
 	.8byte	crc32_table
 	.uleb128 0x46
-	.4byte	.LASF1500
+	.4byte	.LASF1499
 	.byte	0x1
-	.2byte	0x1de
+	.2byte	0x1db
 	.4byte	0xc0
 	.8byte	.LFB1564
 	.8byte	.LFE1564-.LFB1564
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x665c
+	.4byte	0x6990
 	.uleb128 0x47
 	.4byte	.LASF1464
 	.byte	0x1
-	.2byte	0x1de
-	.4byte	0x665c
-	.4byte	.LLST15
+	.2byte	0x1db
+	.4byte	0x6990
+	.4byte	.LLST13
 	.uleb128 0x47
 	.4byte	.LASF1465
 	.byte	0x1
-	.2byte	0x1de
+	.2byte	0x1db
 	.4byte	0x5f9c
-	.4byte	.LLST16
+	.4byte	.LLST14
 	.uleb128 0x47
 	.4byte	.LASF1466
 	.byte	0x1
-	.2byte	0x1de
+	.2byte	0x1db
 	.4byte	0xc0
-	.4byte	.LLST17
+	.4byte	.LLST15
 	.uleb128 0x48
 	.4byte	.LASF1467
 	.byte	0x1
-	.2byte	0x1e0
+	.2byte	0x1dd
 	.4byte	0x5f9c
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	stype.16970
+	.8byte	stype.16969
 	.uleb128 0x48
 	.4byte	.LASF1468
 	.byte	0x1
-	.2byte	0x1e1
+	.2byte	0x1de
 	.4byte	0xc0
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	sftemp.16971
+	.8byte	sftemp.16970
 	.uleb128 0x49
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x1e2
+	.2byte	0x1df
 	.4byte	0xc0
 	.uleb128 0x4a
-	.4byte	0x672a
-	.8byte	.LBB233
-	.8byte	.LBE233-.LBB233
+	.4byte	0x6a5e
+	.8byte	.LBB332
+	.8byte	.LBE332-.LBB332
 	.byte	0x1
-	.2byte	0x22b
-	.4byte	0x6372
+	.2byte	0x228
+	.4byte	0x64ae
 	.uleb128 0x4b
-	.4byte	0x6747
+	.4byte	0x6a7b
 	.uleb128 0x4b
-	.4byte	0x673b
+	.4byte	0x6a6f
 	.uleb128 0x4c
-	.8byte	.LBB234
-	.8byte	.LBE234-.LBB234
+	.8byte	.LBB333
+	.8byte	.LBE333-.LBB333
 	.uleb128 0x4d
-	.4byte	0x6753
+	.4byte	0x6a87
 	.uleb128 0x4d
-	.4byte	0x675f
+	.4byte	0x6a93
 	.uleb128 0x4d
-	.4byte	0x676b
+	.4byte	0x6a9f
 	.uleb128 0x4d
-	.4byte	0x6777
-	.uleb128 0x4a
-	.4byte	0x6a3a
-	.8byte	.LBB235
-	.8byte	.LBE235-.LBB235
-	.byte	0x1
-	.2byte	0x199
-	.4byte	0x62d4
-	.uleb128 0x4b
-	.4byte	0x6a4a
-	.byte	0
+	.4byte	0x6aab
 	.uleb128 0x4a
-	.4byte	0x6886
-	.8byte	.LBB237
-	.8byte	.LBE237-.LBB237
+	.4byte	0x6d88
+	.8byte	.LBB334
+	.8byte	.LBE334-.LBB334
 	.byte	0x1
-	.2byte	0x1a5
-	.4byte	0x633c
-	.uleb128 0x4b
-	.4byte	0x6893
+	.2byte	0x188
+	.4byte	0x6367
 	.uleb128 0x4b
-	.4byte	0x6893
+	.4byte	0x6da3
 	.uleb128 0x4b
-	.4byte	0x689f
+	.4byte	0x6d98
 	.uleb128 0x4c
-	.8byte	.LBB238
-	.8byte	.LBE238-.LBB238
-	.uleb128 0x4d
-	.4byte	0x68ab
+	.8byte	.LBB335
+	.8byte	.LBE335-.LBB335
 	.uleb128 0x4e
-	.4byte	0x68b7
-	.4byte	.LLST18
+	.4byte	0x6dae
+	.4byte	.LLST16
 	.uleb128 0x4e
-	.4byte	0x68c3
-	.4byte	.LLST19
+	.4byte	0x6db9
+	.4byte	.LLST17
+	.uleb128 0x4e
+	.4byte	0x6dc4
+	.4byte	.LLST18
 	.uleb128 0x4d
-	.4byte	0x68cf
+	.4byte	0x6dcf
 	.uleb128 0x4d
-	.4byte	0x68db
-	.uleb128 0x4e
-	.4byte	0x68e7
-	.4byte	.LLST20
-	.byte	0
-	.byte	0
-	.uleb128 0x4f
-	.8byte	.LVL68
-	.4byte	0x6a56
-	.uleb128 0x4f
-	.8byte	.LVL69
-	.4byte	0x698e
-	.uleb128 0x4f
-	.8byte	.LVL70
-	.4byte	0x6a56
+	.4byte	0x6dda
+	.uleb128 0x4d
+	.4byte	0x6de4
 	.uleb128 0x4f
-	.8byte	.LVL71
-	.4byte	0x698e
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x682c
-	.8byte	.LBB239
-	.4byte	.Ldebug_ranges0+0x150
+	.4byte	0x6df0
+	.8byte	.LBB336
+	.4byte	.Ldebug_ranges0+0x1c0
 	.byte	0x1
-	.2byte	0x201
-	.4byte	0x64d1
-	.uleb128 0x4b
-	.4byte	0x683d
+	.byte	0xe4
 	.uleb128 0x4b
-	.4byte	0x683d
+	.4byte	0x6e0b
 	.uleb128 0x4b
-	.4byte	0x6849
+	.4byte	0x6e00
+	.uleb128 0x50
+	.4byte	.Ldebug_ranges0+0x1c0
+	.uleb128 0x4d
+	.4byte	0x6e16
+	.uleb128 0x4d
+	.4byte	0x6e21
 	.uleb128 0x51
-	.4byte	.Ldebug_ranges0+0x150
+	.4byte	.Ldebug_ranges0+0x210
+	.4byte	0x6353
 	.uleb128 0x4d
-	.4byte	0x6855
+	.4byte	0x6e2f
 	.uleb128 0x4d
-	.4byte	0x6861
-	.uleb128 0x4e
-	.4byte	0x686d
-	.4byte	.LLST21
+	.4byte	0x6e3a
+	.byte	0
+	.uleb128 0x50
+	.4byte	.Ldebug_ranges0+0x240
+	.uleb128 0x4d
+	.4byte	0x6e47
 	.uleb128 0x4d
-	.4byte	0x6879
+	.4byte	0x6e52
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
 	.uleb128 0x4a
-	.4byte	0x68f2
-	.8byte	.LBB241
-	.8byte	.LBE241-.LBB241
+	.4byte	0x6d88
+	.8byte	.LBB350
+	.8byte	.LBE350-.LBB350
 	.byte	0x1
-	.2byte	0x14f
-	.4byte	0x649b
+	.2byte	0x195
+	.4byte	0x6408
 	.uleb128 0x4b
-	.4byte	0x6903
+	.4byte	0x6da3
 	.uleb128 0x4b
-	.4byte	0x6903
+	.4byte	0x6d98
 	.uleb128 0x4c
-	.8byte	.LBB242
-	.8byte	.LBE242-.LBB242
-	.uleb128 0x4d
-	.4byte	0x690f
-	.uleb128 0x4d
-	.4byte	0x691b
-	.uleb128 0x4d
-	.4byte	0x6927
+	.8byte	.LBB351
+	.8byte	.LBE351-.LBB351
+	.uleb128 0x4e
+	.4byte	0x6dae
+	.4byte	.LLST19
+	.uleb128 0x4e
+	.4byte	0x6db9
+	.4byte	.LLST20
+	.uleb128 0x4e
+	.4byte	0x6dc4
+	.4byte	.LLST21
 	.uleb128 0x4d
-	.4byte	0x6931
+	.4byte	0x6dcf
 	.uleb128 0x4d
-	.4byte	0x693b
+	.4byte	0x6dda
 	.uleb128 0x4d
-	.4byte	0x6945
-	.uleb128 0x4e
-	.4byte	0x694f
-	.4byte	.LLST22
+	.4byte	0x6de4
+	.uleb128 0x52
+	.4byte	0x6df0
+	.8byte	.LBB352
+	.8byte	.LBE352-.LBB352
+	.byte	0x1
+	.byte	0xe4
+	.uleb128 0x4b
+	.4byte	0x6e0b
+	.uleb128 0x4b
+	.4byte	0x6e00
+	.uleb128 0x4c
+	.8byte	.LBB353
+	.8byte	.LBE353-.LBB353
 	.uleb128 0x4d
-	.4byte	0x695b
+	.4byte	0x6e16
 	.uleb128 0x4d
-	.4byte	0x6967
+	.4byte	0x6e21
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
 	.uleb128 0x4a
-	.4byte	0x6e20
-	.8byte	.LBB243
-	.8byte	.LBE243-.LBB243
+	.4byte	0x6d6c
+	.8byte	.LBB354
+	.8byte	.LBE354-.LBB354
 	.byte	0x1
-	.2byte	0x10c
-	.4byte	0x6475
+	.2byte	0x196
+	.4byte	0x642a
 	.uleb128 0x4b
-	.4byte	0x6e3d
+	.4byte	0x6d7c
+	.byte	0
+	.uleb128 0x4a
+	.4byte	0x6bba
+	.8byte	.LBB356
+	.8byte	.LBE356-.LBB356
+	.byte	0x1
+	.2byte	0x1a2
+	.4byte	0x6492
 	.uleb128 0x4b
-	.4byte	0x6e31
-	.uleb128 0x52
-	.4byte	0x6e4a
-	.8byte	.LBB244
-	.8byte	.LBE244-.LBB244
-	.byte	0x2
-	.2byte	0x2e7
+	.4byte	0x6bc7
 	.uleb128 0x4b
-	.4byte	0x6e67
+	.4byte	0x6bc7
 	.uleb128 0x4b
-	.4byte	0x6e5b
-	.uleb128 0x4f
-	.8byte	.LVL98
-	.4byte	0x6fc5
-	.byte	0
-	.byte	0
+	.4byte	0x6bd3
 	.uleb128 0x4c
-	.8byte	.LBB246
-	.8byte	.LBE246-.LBB246
+	.8byte	.LBB357
+	.8byte	.LBE357-.LBB357
+	.uleb128 0x4d
+	.4byte	0x6bdf
+	.uleb128 0x4e
+	.4byte	0x6beb
+	.4byte	.LLST22
 	.uleb128 0x4e
-	.4byte	0x6974
+	.4byte	0x6bf7
 	.4byte	.LLST23
+	.uleb128 0x4d
+	.4byte	0x6c03
+	.uleb128 0x4d
+	.4byte	0x6c0f
 	.uleb128 0x4e
-	.4byte	0x6980
+	.4byte	0x6c1b
 	.4byte	.LLST24
 	.byte	0
 	.byte	0
-	.byte	0
-	.uleb128 0x4f
+	.uleb128 0x53
+	.8byte	.LVL69
+	.4byte	0x6cc0
+	.uleb128 0x53
 	.8byte	.LVL76
-	.4byte	0x6fd1
-	.uleb128 0x4f
-	.8byte	.LVL88
-	.4byte	0x6fd1
-	.uleb128 0x4f
-	.8byte	.LVL94
-	.4byte	0x6a56
-	.uleb128 0x4f
-	.8byte	.LVL96
-	.4byte	0x698e
+	.4byte	0x6cc0
 	.byte	0
 	.byte	0
-	.uleb128 0x4a
-	.4byte	0x6662
-	.8byte	.LBB249
-	.8byte	.LBE249-.LBB249
+	.uleb128 0x54
+	.4byte	0x6b60
+	.8byte	.LBB358
+	.4byte	.Ldebug_ranges0+0x290
 	.byte	0x1
-	.2byte	0x23a
-	.4byte	0x6544
+	.2byte	0x1fe
+	.4byte	0x66b5
 	.uleb128 0x4b
-	.4byte	0x6673
-	.uleb128 0x4c
-	.8byte	.LBB250
-	.8byte	.LBE250-.LBB250
+	.4byte	0x6b71
+	.uleb128 0x4b
+	.4byte	0x6b71
+	.uleb128 0x4b
+	.4byte	0x6b7d
+	.uleb128 0x50
+	.4byte	.Ldebug_ranges0+0x290
 	.uleb128 0x4d
-	.4byte	0x667f
+	.4byte	0x6b89
+	.uleb128 0x4d
+	.4byte	0x6b95
 	.uleb128 0x4e
-	.4byte	0x6689
+	.4byte	0x6ba1
 	.4byte	.LLST25
+	.uleb128 0x4d
+	.4byte	0x6bad
+	.uleb128 0x4a
+	.4byte	0x6d88
+	.8byte	.LBB360
+	.8byte	.LBE360-.LBB360
+	.byte	0x1
+	.2byte	0x13f
+	.4byte	0x65a7
+	.uleb128 0x4b
+	.4byte	0x6da3
+	.uleb128 0x4b
+	.4byte	0x6d98
+	.uleb128 0x4c
+	.8byte	.LBB361
+	.8byte	.LBE361-.LBB361
 	.uleb128 0x4e
-	.4byte	0x6695
+	.4byte	0x6dae
 	.4byte	.LLST26
 	.uleb128 0x4e
-	.4byte	0x66a1
+	.4byte	0x6db9
 	.4byte	.LLST27
-	.uleb128 0x51
-	.4byte	.Ldebug_ranges0+0x190
 	.uleb128 0x4e
-	.4byte	0x66ae
+	.4byte	0x6dc4
 	.4byte	.LLST28
+	.uleb128 0x4d
+	.4byte	0x6dcf
+	.uleb128 0x4d
+	.4byte	0x6dda
+	.uleb128 0x4d
+	.4byte	0x6de4
+	.uleb128 0x4f
+	.4byte	0x6df0
+	.8byte	.LBB362
+	.4byte	.Ldebug_ranges0+0x2d0
+	.byte	0x1
+	.byte	0xe4
+	.uleb128 0x4b
+	.4byte	0x6e0b
+	.uleb128 0x4b
+	.4byte	0x6e00
+	.uleb128 0x50
+	.4byte	.Ldebug_ranges0+0x2d0
+	.uleb128 0x4d
+	.4byte	0x6e16
+	.uleb128 0x4d
+	.4byte	0x6e21
 	.uleb128 0x51
-	.4byte	.Ldebug_ranges0+0x1c0
+	.4byte	.Ldebug_ranges0+0x320
+	.4byte	0x6593
+	.uleb128 0x4d
+	.4byte	0x6e2f
+	.uleb128 0x4d
+	.4byte	0x6e3a
+	.byte	0
+	.uleb128 0x50
+	.4byte	.Ldebug_ranges0+0x350
 	.uleb128 0x4d
-	.4byte	0x66bb
+	.4byte	0x6e47
 	.uleb128 0x4d
-	.4byte	0x66c7
+	.4byte	0x6e52
+	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4a
-	.4byte	0x6784
-	.8byte	.LBB256
-	.8byte	.LBE256-.LBB256
+	.4byte	0x6c26
+	.8byte	.LBB376
+	.8byte	.LBE376-.LBB376
 	.byte	0x1
-	.2byte	0x225
-	.4byte	0x65af
-	.uleb128 0x4b
-	.4byte	0x6795
+	.2byte	0x14c
+	.4byte	0x668c
 	.uleb128 0x4b
-	.4byte	0x6795
+	.4byte	0x6c36
 	.uleb128 0x4b
-	.4byte	0x67a1
+	.4byte	0x6c36
 	.uleb128 0x4c
-	.8byte	.LBB257
-	.8byte	.LBE257-.LBB257
+	.8byte	.LBB377
+	.8byte	.LBE377-.LBB377
+	.uleb128 0x4d
+	.4byte	0x6c41
+	.uleb128 0x4d
+	.4byte	0x6c4d
+	.uleb128 0x4d
+	.4byte	0x6c59
+	.uleb128 0x4d
+	.4byte	0x6c63
 	.uleb128 0x4d
-	.4byte	0x67ad
+	.4byte	0x6c6d
+	.uleb128 0x4d
+	.4byte	0x6c77
 	.uleb128 0x4e
-	.4byte	0x67b9
+	.4byte	0x6c81
 	.4byte	.LLST29
 	.uleb128 0x4d
-	.4byte	0x67c5
-	.uleb128 0x4f
-	.8byte	.LVL90
-	.4byte	0x6a56
-	.uleb128 0x4f
-	.8byte	.LVL92
-	.4byte	0x698e
-	.byte	0
-	.byte	0
+	.4byte	0x6c8d
+	.uleb128 0x4d
+	.4byte	0x6c99
 	.uleb128 0x4a
-	.4byte	0x66d6
-	.8byte	.LBB259
-	.8byte	.LBE259-.LBB259
+	.4byte	0x70c9
+	.8byte	.LBB378
+	.8byte	.LBE378-.LBB378
 	.byte	0x1
-	.2byte	0x231
-	.4byte	0x661a
+	.2byte	0x109
+	.4byte	0x6666
 	.uleb128 0x4b
-	.4byte	0x66e7
+	.4byte	0x70e6
 	.uleb128 0x4b
-	.4byte	0x66e7
-	.uleb128 0x4b
-	.4byte	0x66f3
-	.uleb128 0x4c
-	.8byte	.LBB260
-	.8byte	.LBE260-.LBB260
-	.uleb128 0x4d
-	.4byte	0x66ff
+	.4byte	0x70da
+	.uleb128 0x55
+	.4byte	0x70f3
+	.8byte	.LBB379
+	.8byte	.LBE379-.LBB379
+	.byte	0x2
+	.2byte	0x2e7
+	.uleb128 0x4b
+	.4byte	0x7110
+	.uleb128 0x4b
+	.4byte	0x7104
+	.uleb128 0x53
+	.8byte	.LVL109
+	.4byte	0x7306
+	.byte	0
+	.byte	0
+	.uleb128 0x4c
+	.8byte	.LBB381
+	.8byte	.LBE381-.LBB381
 	.uleb128 0x4e
-	.4byte	0x670b
+	.4byte	0x6ca6
 	.4byte	.LLST30
+	.uleb128 0x4e
+	.4byte	0x6cb2
+	.4byte	.LLST31
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x53
+	.8byte	.LVL81
+	.4byte	0x7312
+	.uleb128 0x53
+	.8byte	.LVL95
+	.4byte	0x7312
+	.uleb128 0x53
+	.8byte	.LVL108
+	.4byte	0x6cc0
+	.byte	0
+	.byte	0
+	.uleb128 0x4a
+	.4byte	0x6996
+	.8byte	.LBB384
+	.8byte	.LBE384-.LBB384
+	.byte	0x1
+	.2byte	0x237
+	.4byte	0x6728
+	.uleb128 0x4b
+	.4byte	0x69a7
+	.uleb128 0x4c
+	.8byte	.LBB385
+	.8byte	.LBE385-.LBB385
 	.uleb128 0x4d
-	.4byte	0x6717
-	.uleb128 0x4f
-	.8byte	.LVL113
-	.4byte	0x6a56
-	.uleb128 0x4f
-	.8byte	.LVL116
-	.4byte	0x698e
+	.4byte	0x69b3
+	.uleb128 0x4e
+	.4byte	0x69bd
+	.4byte	.LLST32
+	.uleb128 0x4e
+	.4byte	0x69c9
+	.4byte	.LLST33
+	.uleb128 0x4e
+	.4byte	0x69d5
+	.4byte	.LLST34
+	.uleb128 0x50
+	.4byte	.Ldebug_ranges0+0x3a0
+	.uleb128 0x4e
+	.4byte	0x69e2
+	.4byte	.LLST35
+	.uleb128 0x50
+	.4byte	.Ldebug_ranges0+0x3d0
+	.uleb128 0x4d
+	.4byte	0x69ef
+	.uleb128 0x4d
+	.4byte	0x69fb
 	.byte	0
 	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4a
+	.4byte	0x6ab8
+	.8byte	.LBB391
+	.8byte	.LBE391-.LBB391
+	.byte	0x1
+	.2byte	0x222
+	.4byte	0x683b
+	.uleb128 0x4b
+	.4byte	0x6ac9
+	.uleb128 0x4b
+	.4byte	0x6ac9
+	.uleb128 0x4b
+	.4byte	0x6ad5
+	.uleb128 0x4c
+	.8byte	.LBB392
+	.8byte	.LBE392-.LBB392
+	.uleb128 0x4d
+	.4byte	0x6ae1
+	.uleb128 0x4e
+	.4byte	0x6aed
+	.4byte	.LLST36
+	.uleb128 0x4d
+	.4byte	0x6af9
+	.uleb128 0x4a
+	.4byte	0x6d88
+	.8byte	.LBB393
+	.8byte	.LBE393-.LBB393
+	.byte	0x1
+	.2byte	0x172
+	.4byte	0x682c
+	.uleb128 0x4b
+	.4byte	0x6da3
+	.uleb128 0x4b
+	.4byte	0x6d98
+	.uleb128 0x4c
+	.8byte	.LBB394
+	.8byte	.LBE394-.LBB394
+	.uleb128 0x4e
+	.4byte	0x6dae
+	.4byte	.LLST37
+	.uleb128 0x4e
+	.4byte	0x6db9
+	.4byte	.LLST38
+	.uleb128 0x4e
+	.4byte	0x6dc4
+	.4byte	.LLST39
+	.uleb128 0x4d
+	.4byte	0x6dcf
+	.uleb128 0x4d
+	.4byte	0x6dda
+	.uleb128 0x4d
+	.4byte	0x6de4
 	.uleb128 0x4f
-	.8byte	.LVL66
-	.4byte	0x6fd1
-	.uleb128 0x4f
-	.8byte	.LVL105
-	.4byte	0x6f60
-	.uleb128 0x4f
-	.8byte	.LVL106
-	.4byte	0x6f60
-	.uleb128 0x4f
-	.8byte	.LVL112
-	.4byte	0x6f60
+	.4byte	0x6df0
+	.8byte	.LBB395
+	.4byte	.Ldebug_ranges0+0x400
+	.byte	0x1
+	.byte	0xe4
+	.uleb128 0x4b
+	.4byte	0x6e0b
+	.uleb128 0x4b
+	.4byte	0x6e00
+	.uleb128 0x50
+	.4byte	.Ldebug_ranges0+0x400
+	.uleb128 0x4d
+	.4byte	0x6e16
+	.uleb128 0x4d
+	.4byte	0x6e21
+	.uleb128 0x51
+	.4byte	.Ldebug_ranges0+0x450
+	.4byte	0x6818
+	.uleb128 0x4d
+	.4byte	0x6e2f
+	.uleb128 0x4d
+	.4byte	0x6e3a
+	.byte	0
+	.uleb128 0x50
+	.4byte	.Ldebug_ranges0+0x480
+	.uleb128 0x4d
+	.4byte	0x6e47
+	.uleb128 0x4d
+	.4byte	0x6e52
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x53
+	.8byte	.LVL101
+	.4byte	0x6cc0
+	.byte	0
+	.byte	0
+	.uleb128 0x4a
+	.4byte	0x6a0a
+	.8byte	.LBB410
+	.8byte	.LBE410-.LBB410
+	.byte	0x1
+	.2byte	0x22e
+	.4byte	0x694e
+	.uleb128 0x4b
+	.4byte	0x6a1b
+	.uleb128 0x4b
+	.4byte	0x6a1b
+	.uleb128 0x4b
+	.4byte	0x6a27
+	.uleb128 0x4c
+	.8byte	.LBB411
+	.8byte	.LBE411-.LBB411
+	.uleb128 0x4d
+	.4byte	0x6a33
+	.uleb128 0x4e
+	.4byte	0x6a3f
+	.4byte	.LLST40
+	.uleb128 0x4d
+	.4byte	0x6a4b
+	.uleb128 0x4a
+	.4byte	0x6d88
+	.8byte	.LBB412
+	.8byte	.LBE412-.LBB412
+	.byte	0x1
+	.2byte	0x1af
+	.4byte	0x693f
+	.uleb128 0x4b
+	.4byte	0x6da3
+	.uleb128 0x4b
+	.4byte	0x6d98
+	.uleb128 0x4c
+	.8byte	.LBB413
+	.8byte	.LBE413-.LBB413
+	.uleb128 0x4e
+	.4byte	0x6dae
+	.4byte	.LLST41
+	.uleb128 0x4e
+	.4byte	0x6db9
+	.4byte	.LLST42
+	.uleb128 0x4e
+	.4byte	0x6dc4
+	.4byte	.LLST43
+	.uleb128 0x4d
+	.4byte	0x6dcf
+	.uleb128 0x4d
+	.4byte	0x6dda
+	.uleb128 0x4d
+	.4byte	0x6de4
 	.uleb128 0x4f
-	.8byte	.LVL117
-	.4byte	0x6f60
+	.4byte	0x6df0
+	.8byte	.LBB414
+	.4byte	.Ldebug_ranges0+0x4d0
+	.byte	0x1
+	.byte	0xe4
+	.uleb128 0x4b
+	.4byte	0x6e0b
+	.uleb128 0x4b
+	.4byte	0x6e00
+	.uleb128 0x50
+	.4byte	.Ldebug_ranges0+0x4d0
+	.uleb128 0x4d
+	.4byte	0x6e16
+	.uleb128 0x4d
+	.4byte	0x6e21
+	.uleb128 0x51
+	.4byte	.Ldebug_ranges0+0x520
+	.4byte	0x692b
+	.uleb128 0x4d
+	.4byte	0x6e2f
+	.uleb128 0x4d
+	.4byte	0x6e3a
+	.byte	0
+	.uleb128 0x50
+	.4byte	.Ldebug_ranges0+0x550
+	.uleb128 0x4d
+	.4byte	0x6e47
+	.uleb128 0x4d
+	.4byte	0x6e52
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x53
+	.8byte	.LVL136
+	.4byte	0x6cc0
+	.byte	0
+	.byte	0
+	.uleb128 0x53
+	.8byte	.LVL61
+	.4byte	0x7312
+	.uleb128 0x53
+	.8byte	.LVL118
+	.4byte	0x7209
+	.uleb128 0x53
+	.8byte	.LVL122
+	.4byte	0x7209
+	.uleb128 0x53
+	.8byte	.LVL129
+	.4byte	0x7209
+	.uleb128 0x53
+	.8byte	.LVL139
+	.4byte	0x7209
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x5ff5
-	.uleb128 0x53
+	.uleb128 0x56
 	.4byte	.LASF1474
 	.byte	0x1
-	.2byte	0x1c0
+	.2byte	0x1bd
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x66d6
-	.uleb128 0x54
+	.4byte	0x6a0a
+	.uleb128 0x57
 	.4byte	.LASF737
 	.byte	0x1
-	.2byte	0x1c0
-	.4byte	0x665c
+	.2byte	0x1bd
+	.4byte	0x6990
 	.uleb128 0x49
 	.string	"i"
 	.byte	0x1
-	.2byte	0x1c1
+	.2byte	0x1be
 	.4byte	0xc0
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1469
 	.byte	0x1
-	.2byte	0x1c2
+	.2byte	0x1bf
 	.4byte	0x120
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1470
 	.byte	0x1
-	.2byte	0x1c2
+	.2byte	0x1bf
 	.4byte	0x120
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1430
 	.byte	0x1
-	.2byte	0x1c4
+	.2byte	0x1c1
 	.4byte	0xc0
-	.uleb128 0x56
-	.uleb128 0x55
+	.uleb128 0x59
+	.uleb128 0x58
 	.4byte	.LASF1471
 	.byte	0x1
-	.2byte	0x1c7
+	.2byte	0x1c4
 	.4byte	0x2d40
-	.uleb128 0x56
-	.uleb128 0x55
+	.uleb128 0x59
+	.uleb128 0x58
 	.4byte	.LASF1472
 	.byte	0x1
-	.2byte	0x1ca
+	.2byte	0x1c7
 	.4byte	0x100
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1473
 	.byte	0x1
-	.2byte	0x1cb
+	.2byte	0x1c8
 	.4byte	0x100
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
+	.uleb128 0x56
 	.4byte	.LASF1475
 	.byte	0x1
-	.2byte	0x1ac
+	.2byte	0x1a9
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6724
-	.uleb128 0x54
+	.4byte	0x6a58
+	.uleb128 0x57
 	.4byte	.LASF1464
 	.byte	0x1
-	.2byte	0x1ac
-	.4byte	0x665c
-	.uleb128 0x54
+	.2byte	0x1a9
+	.4byte	0x6990
+	.uleb128 0x57
 	.4byte	.LASF1476
 	.byte	0x1
-	.2byte	0x1ac
+	.2byte	0x1a9
 	.4byte	0xc0
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1477
 	.byte	0x1
-	.2byte	0x1ae
-	.4byte	0x6724
-	.uleb128 0x55
+	.2byte	0x1ab
+	.4byte	0x6a58
+	.uleb128 0x58
 	.4byte	.LASF1430
 	.byte	0x1
-	.2byte	0x1af
+	.2byte	0x1ac
 	.4byte	0x6c
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1441
 	.byte	0x1
-	.2byte	0x1b0
+	.2byte	0x1ad
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x97
-	.uleb128 0x53
+	.uleb128 0x56
 	.4byte	.LASF1478
 	.byte	0x1
-	.2byte	0x183
+	.2byte	0x180
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6784
-	.uleb128 0x54
+	.4byte	0x6ab8
+	.uleb128 0x57
 	.4byte	.LASF1464
 	.byte	0x1
-	.2byte	0x183
-	.4byte	0x665c
-	.uleb128 0x54
+	.2byte	0x180
+	.4byte	0x6990
+	.uleb128 0x57
 	.4byte	.LASF1476
 	.byte	0x1
-	.2byte	0x183
+	.2byte	0x180
 	.4byte	0xc0
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1479
 	.byte	0x1
-	.2byte	0x185
+	.2byte	0x182
 	.4byte	0x5ff5
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1477
 	.byte	0x1
-	.2byte	0x186
-	.4byte	0x6724
-	.uleb128 0x55
+	.2byte	0x183
+	.4byte	0x6a58
+	.uleb128 0x58
 	.4byte	.LASF1430
 	.byte	0x1
-	.2byte	0x187
+	.2byte	0x184
 	.4byte	0x6c
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1441
 	.byte	0x1
-	.2byte	0x188
+	.2byte	0x185
 	.4byte	0x6c
 	.byte	0
-	.uleb128 0x53
+	.uleb128 0x56
 	.4byte	.LASF1480
 	.byte	0x1
-	.2byte	0x16e
+	.2byte	0x16b
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x67d2
-	.uleb128 0x54
+	.4byte	0x6b06
+	.uleb128 0x57
 	.4byte	.LASF1464
 	.byte	0x1
-	.2byte	0x16e
-	.4byte	0x665c
-	.uleb128 0x54
+	.2byte	0x16b
+	.4byte	0x6990
+	.uleb128 0x57
 	.4byte	.LASF1476
 	.byte	0x1
-	.2byte	0x16e
+	.2byte	0x16b
 	.4byte	0xc0
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1477
 	.byte	0x1
-	.2byte	0x170
-	.4byte	0x6724
-	.uleb128 0x55
+	.2byte	0x16d
+	.4byte	0x6a58
+	.uleb128 0x58
 	.4byte	.LASF1430
 	.byte	0x1
-	.2byte	0x171
+	.2byte	0x16e
 	.4byte	0x6c
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1441
 	.byte	0x1
-	.2byte	0x172
+	.2byte	0x16f
 	.4byte	0x6c
 	.byte	0
-	.uleb128 0x53
+	.uleb128 0x56
 	.4byte	.LASF1481
 	.byte	0x1
-	.2byte	0x159
+	.2byte	0x156
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x682c
-	.uleb128 0x54
+	.4byte	0x6b60
+	.uleb128 0x57
 	.4byte	.LASF1464
 	.byte	0x1
-	.2byte	0x159
-	.4byte	0x665c
-	.uleb128 0x54
+	.2byte	0x156
+	.4byte	0x6990
+	.uleb128 0x57
 	.4byte	.LASF1476
 	.byte	0x1
-	.2byte	0x159
+	.2byte	0x156
 	.4byte	0xc0
-	.uleb128 0x54
+	.uleb128 0x57
 	.4byte	.LASF1465
 	.byte	0x1
-	.2byte	0x159
+	.2byte	0x156
 	.4byte	0x602c
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1477
 	.byte	0x1
-	.2byte	0x15b
-	.4byte	0x6724
-	.uleb128 0x55
+	.2byte	0x158
+	.4byte	0x6a58
+	.uleb128 0x58
 	.4byte	.LASF1430
 	.byte	0x1
-	.2byte	0x15c
+	.2byte	0x159
 	.4byte	0x6c
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1441
 	.byte	0x1
-	.2byte	0x15d
+	.2byte	0x15a
 	.4byte	0x6c
 	.byte	0
-	.uleb128 0x53
+	.uleb128 0x56
 	.4byte	.LASF1482
 	.byte	0x1
-	.2byte	0x13a
+	.2byte	0x137
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6886
-	.uleb128 0x54
+	.4byte	0x6bba
+	.uleb128 0x57
 	.4byte	.LASF1464
 	.byte	0x1
-	.2byte	0x13a
-	.4byte	0x665c
-	.uleb128 0x54
+	.2byte	0x137
+	.4byte	0x6990
+	.uleb128 0x57
 	.4byte	.LASF1476
 	.byte	0x1
-	.2byte	0x13a
+	.2byte	0x137
 	.4byte	0xc0
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1479
 	.byte	0x1
-	.2byte	0x13c
+	.2byte	0x139
 	.4byte	0x5ff5
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1477
 	.byte	0x1
-	.2byte	0x13d
-	.4byte	0x6724
-	.uleb128 0x55
+	.2byte	0x13a
+	.4byte	0x6a58
+	.uleb128 0x58
 	.4byte	.LASF1430
 	.byte	0x1
-	.2byte	0x13e
+	.2byte	0x13b
 	.4byte	0x6c
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1441
 	.byte	0x1
-	.2byte	0x13f
+	.2byte	0x13c
 	.4byte	0x6c
 	.byte	0
-	.uleb128 0x57
-	.4byte	.LASF1511
+	.uleb128 0x5a
+	.4byte	.LASF1510
 	.byte	0x1
-	.2byte	0x121
+	.2byte	0x11e
 	.byte	0x1
-	.4byte	0x68f2
-	.uleb128 0x54
+	.4byte	0x6c26
+	.uleb128 0x57
 	.4byte	.LASF1479
 	.byte	0x1
-	.2byte	0x121
-	.4byte	0x665c
-	.uleb128 0x54
+	.2byte	0x11e
+	.4byte	0x6990
+	.uleb128 0x57
 	.4byte	.LASF1464
 	.byte	0x1
-	.2byte	0x122
-	.4byte	0x665c
-	.uleb128 0x55
+	.2byte	0x11f
+	.4byte	0x6990
+	.uleb128 0x58
 	.4byte	.LASF1483
 	.byte	0x1
-	.2byte	0x124
+	.2byte	0x121
 	.4byte	0xc0
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1484
 	.byte	0x1
-	.2byte	0x125
+	.2byte	0x122
 	.4byte	0x3310
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1485
 	.byte	0x1
-	.2byte	0x125
+	.2byte	0x122
 	.4byte	0x3310
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1476
 	.byte	0x1
-	.2byte	0x126
+	.2byte	0x123
 	.4byte	0xc0
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1486
 	.byte	0x1
-	.2byte	0x126
+	.2byte	0x123
 	.4byte	0xc0
 	.uleb128 0x49
 	.string	"i"
 	.byte	0x1
-	.2byte	0x127
+	.2byte	0x124
 	.4byte	0xc0
 	.byte	0
-	.uleb128 0x53
+	.uleb128 0x5b
 	.4byte	.LASF1487
 	.byte	0x1
-	.2byte	0x101
+	.byte	0xfe
 	.4byte	0x2d40
 	.byte	0x1
-	.4byte	0x698e
-	.uleb128 0x54
+	.4byte	0x6cc0
+	.uleb128 0x5c
 	.4byte	.LASF1479
 	.byte	0x1
-	.2byte	0x101
-	.4byte	0x665c
-	.uleb128 0x55
+	.byte	0xfe
+	.4byte	0x6990
+	.uleb128 0x58
 	.4byte	.LASF1484
 	.byte	0x1
-	.2byte	0x103
+	.2byte	0x100
 	.4byte	0x2d40
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1485
 	.byte	0x1
-	.2byte	0x103
+	.2byte	0x100
 	.4byte	0x2d40
 	.uleb128 0x49
 	.string	"i"
 	.byte	0x1
-	.2byte	0x104
+	.2byte	0x101
 	.4byte	0xc0
 	.uleb128 0x49
 	.string	"j"
 	.byte	0x1
-	.2byte	0x104
+	.2byte	0x101
 	.4byte	0xc0
 	.uleb128 0x49
 	.string	"k"
 	.byte	0x1
-	.2byte	0x104
+	.2byte	0x101
 	.4byte	0xc0
 	.uleb128 0x49
 	.string	"h"
 	.byte	0x1
-	.2byte	0x104
+	.2byte	0x101
 	.4byte	0xc0
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1488
 	.byte	0x1
-	.2byte	0x105
+	.2byte	0x102
 	.4byte	0xc0
 	.uleb128 0x49
 	.string	"num"
 	.byte	0x1
-	.2byte	0x106
+	.2byte	0x103
 	.4byte	0xc0
 	.uleb128 0x49
 	.string	"len"
 	.byte	0x1
-	.2byte	0x107
+	.2byte	0x104
 	.4byte	0xc0
-	.uleb128 0x56
-	.uleb128 0x55
+	.uleb128 0x59
+	.uleb128 0x58
 	.4byte	.LASF1476
 	.byte	0x1
-	.2byte	0x113
+	.2byte	0x110
 	.4byte	0xc0
-	.uleb128 0x55
+	.uleb128 0x58
 	.4byte	.LASF1486
 	.byte	0x1
-	.2byte	0x114
+	.2byte	0x111
 	.4byte	0xc0
 	.byte	0
 	.byte	0
-	.uleb128 0x58
-	.4byte	.LASF1490
+	.uleb128 0x5d
+	.4byte	.LASF1536
 	.byte	0x1
-	.byte	0xf3
+	.byte	0xf0
 	.4byte	0x2d40
 	.8byte	.LFB1555
 	.8byte	.LFE1555-.LFB1555
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6a34
-	.uleb128 0x59
+	.4byte	0x6d66
+	.uleb128 0x5e
 	.4byte	.LASF1477
 	.byte	0x1
-	.byte	0xf3
-	.4byte	0x6724
-	.4byte	.LLST5
-	.uleb128 0x59
+	.byte	0xf0
+	.4byte	0x6a58
+	.4byte	.LLST0
+	.uleb128 0x5e
 	.4byte	.LASF1441
 	.byte	0x1
-	.byte	0xf4
+	.byte	0xf1
 	.4byte	0x6c
-	.4byte	.LLST6
-	.uleb128 0x5a
+	.4byte	.LLST1
+	.uleb128 0x5f
 	.string	"out"
 	.byte	0x1
-	.byte	0xf6
-	.4byte	0x6a34
-	.uleb128 0x5b
-	.4byte	0x6e20
-	.8byte	.LBB158
-	.4byte	.Ldebug_ranges0+0x70
+	.byte	0xf3
+	.4byte	0x6d66
+	.uleb128 0x60
+	.4byte	0x70c9
+	.8byte	.LBB205
+	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.byte	0xf8
-	.4byte	0x6a26
+	.byte	0xf5
+	.4byte	0x6d58
 	.uleb128 0x4b
-	.4byte	0x6e3d
+	.4byte	0x70e6
 	.uleb128 0x4b
-	.4byte	0x6e31
-	.uleb128 0x5c
-	.4byte	0x6e4a
-	.8byte	.LBB159
-	.4byte	.Ldebug_ranges0+0x70
+	.4byte	0x70da
+	.uleb128 0x61
+	.4byte	0x70f3
+	.8byte	.LBB206
+	.4byte	.Ldebug_ranges0+0
 	.byte	0x2
 	.2byte	0x2e7
 	.uleb128 0x4b
-	.4byte	0x6e67
+	.4byte	0x7110
 	.uleb128 0x4b
-	.4byte	0x6e5b
-	.uleb128 0x4f
-	.8byte	.LVL30
-	.4byte	0x6fc5
+	.4byte	0x7104
+	.uleb128 0x53
+	.8byte	.LVL3
+	.4byte	0x7306
 	.byte	0
 	.byte	0
-	.uleb128 0x4f
-	.8byte	.LVL31
-	.4byte	0x6fdc
+	.uleb128 0x53
+	.8byte	.LVL4
+	.4byte	0x731d
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x90
-	.uleb128 0x5d
+	.uleb128 0x5b
 	.4byte	.LASF1489
 	.byte	0x1
-	.byte	0xee
+	.byte	0xeb
 	.4byte	0x90
 	.byte	0x3
-	.4byte	0x6a56
-	.uleb128 0x5e
+	.4byte	0x6d88
+	.uleb128 0x5c
 	.4byte	.LASF1477
 	.byte	0x1
-	.byte	0xee
-	.4byte	0x6724
+	.byte	0xeb
+	.4byte	0x6a58
 	.byte	0
-	.uleb128 0x58
-	.4byte	.LASF1491
+	.uleb128 0x5b
+	.4byte	.LASF1490
 	.byte	0x1
-	.byte	0xbd
-	.4byte	0x6724
-	.8byte	.LFB1553
-	.8byte	.LFE1553-.LFB1553
-	.uleb128 0x1
-	.byte	0x9c
-	.4byte	0x6b47
-	.uleb128 0x59
+	.byte	0xba
+	.4byte	0x6a58
+	.byte	0x1
+	.4byte	0x6df0
+	.uleb128 0x5c
 	.4byte	.LASF1476
 	.byte	0x1
-	.byte	0xbd
+	.byte	0xba
 	.4byte	0xc0
-	.4byte	.LLST0
-	.uleb128 0x59
+	.uleb128 0x5c
 	.4byte	.LASF820
 	.byte	0x1
-	.byte	0xbd
+	.byte	0xba
 	.4byte	0xc0
-	.4byte	.LLST1
-	.uleb128 0x45
-	.4byte	.LASF1492
+	.uleb128 0x62
+	.4byte	.LASF1491
 	.byte	0x1
-	.byte	0xbf
+	.byte	0xbc
 	.4byte	0x61b2
-	.uleb128 0x1
-	.byte	0x56
-	.uleb128 0x5f
+	.uleb128 0x62
 	.4byte	.LASF854
 	.byte	0x1
-	.byte	0xc0
+	.byte	0xbd
 	.4byte	0x2d40
-	.4byte	.LLST2
-	.uleb128 0x5f
-	.4byte	.LASF1493
+	.uleb128 0x62
+	.4byte	.LASF1492
 	.byte	0x1
-	.byte	0xc1
+	.byte	0xbe
 	.4byte	0x1e1
-	.4byte	.LLST3
-	.uleb128 0x60
-	.4byte	.LASF1494
+	.uleb128 0x62
+	.4byte	.LASF1493
 	.byte	0x1
-	.byte	0xc2
+	.byte	0xbf
 	.4byte	0x6c
-	.uleb128 0x5a
+	.uleb128 0x5f
 	.string	"pt"
 	.byte	0x1
-	.byte	0xc3
+	.byte	0xc0
 	.4byte	0x6c
-	.uleb128 0x60
+	.uleb128 0x62
 	.4byte	.LASF1477
 	.byte	0x1
-	.byte	0xc4
+	.byte	0xc1
 	.4byte	0x442
-	.uleb128 0x61
-	.4byte	0x6b47
-	.8byte	.LBB151
-	.8byte	.LBE151-.LBB151
-	.byte	0x1
-	.byte	0xe7
-	.uleb128 0x4b
-	.4byte	0x6b62
-	.uleb128 0x4b
-	.4byte	0x6b57
-	.uleb128 0x4c
-	.8byte	.LBB152
-	.8byte	.LBE152-.LBB152
-	.uleb128 0x4e
-	.4byte	0x6b6d
-	.4byte	.LLST4
-	.uleb128 0x4d
-	.4byte	0x6b78
-	.uleb128 0x62
-	.4byte	.Ldebug_ranges0+0
-	.4byte	0x6b34
-	.uleb128 0x4d
-	.4byte	0x6b86
-	.uleb128 0x4d
-	.4byte	0x6b91
-	.byte	0
-	.uleb128 0x51
-	.4byte	.Ldebug_ranges0+0x30
-	.uleb128 0x4d
-	.4byte	0x6b9e
-	.uleb128 0x4d
-	.4byte	0x6ba9
-	.byte	0
-	.byte	0
-	.byte	0
 	.byte	0
-	.uleb128 0x5d
-	.4byte	.LASF1495
+	.uleb128 0x5b
+	.4byte	.LASF1494
 	.byte	0x1
 	.byte	0xa8
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6bb6
-	.uleb128 0x5e
+	.4byte	0x6e5f
+	.uleb128 0x5c
 	.4byte	.LASF854
 	.byte	0x1
 	.byte	0xa8
 	.4byte	0x1e1
-	.uleb128 0x5e
+	.uleb128 0x5c
 	.4byte	.LASF1476
 	.byte	0x1
 	.byte	0xa8
 	.4byte	0xc0
-	.uleb128 0x60
+	.uleb128 0x62
 	.4byte	.LASF882
 	.byte	0x1
 	.byte	0xaa
 	.4byte	0xc0
-	.uleb128 0x5a
+	.uleb128 0x5f
 	.string	"i"
 	.byte	0x1
 	.byte	0xab
 	.4byte	0xc0
 	.uleb128 0x63
-	.4byte	0x6b9d
-	.uleb128 0x60
-	.4byte	.LASF1496
+	.4byte	0x6e46
+	.uleb128 0x62
+	.4byte	.LASF1495
 	.byte	0x1
 	.byte	0xad
 	.4byte	0xc0
-	.uleb128 0x60
-	.4byte	.LASF1497
+	.uleb128 0x62
+	.4byte	.LASF1496
 	.byte	0x1
 	.byte	0xad
 	.4byte	0xc0
 	.byte	0
-	.uleb128 0x56
-	.uleb128 0x60
-	.4byte	.LASF1498
+	.uleb128 0x59
+	.uleb128 0x62
+	.4byte	.LASF1497
 	.byte	0x1
 	.byte	0xae
 	.4byte	0xc0
-	.uleb128 0x60
-	.4byte	.LASF1499
+	.uleb128 0x62
+	.4byte	.LASF1498
 	.byte	0x1
 	.byte	0xae
 	.4byte	0xc0
@@ -14059,7 +14588,7 @@ crc32_table:
 	.uleb128 0x1
 	.byte	0x9c
 	.uleb128 0x65
-	.4byte	.LASF1501
+	.4byte	.LASF1500
 	.byte	0x1
 	.byte	0x7f
 	.4byte	0xc0
@@ -14067,421 +14596,481 @@ crc32_table:
 	.8byte	.LFE1550-.LFB1550
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6d4c
-	.uleb128 0x59
-	.4byte	.LASF1502
+	.4byte	0x6ff5
+	.uleb128 0x5e
+	.4byte	.LASF1501
 	.byte	0x1
 	.byte	0x7f
 	.4byte	0x442
-	.4byte	.LLST10
-	.uleb128 0x5a
+	.4byte	.LLST8
+	.uleb128 0x5f
 	.string	"ret"
 	.byte	0x1
 	.byte	0x81
 	.4byte	0xc0
-	.uleb128 0x5a
+	.uleb128 0x5f
 	.string	"wf"
 	.byte	0x1
 	.byte	0x82
 	.4byte	0x61b2
-	.uleb128 0x5b
-	.4byte	0x6d7e
-	.8byte	.LBB175
-	.4byte	.Ldebug_ranges0+0xb0
+	.uleb128 0x60
+	.4byte	0x7027
+	.8byte	.LBB246
+	.4byte	.Ldebug_ranges0+0x120
 	.byte	0x1
 	.byte	0x87
-	.4byte	0x6c4f
+	.4byte	0x6ef8
 	.uleb128 0x4b
-	.4byte	0x6d8e
-	.uleb128 0x4f
-	.8byte	.LVL40
-	.4byte	0x6fe5
-	.uleb128 0x4f
-	.8byte	.LVL61
-	.4byte	0x6ff0
+	.4byte	0x7037
+	.uleb128 0x53
+	.8byte	.LVL35
+	.4byte	0x7326
+	.uleb128 0x53
+	.8byte	.LVL56
+	.4byte	0x7331
 	.byte	0
-	.uleb128 0x5b
-	.4byte	0x6d4c
-	.8byte	.LBB178
-	.4byte	.Ldebug_ranges0+0xe0
+	.uleb128 0x60
+	.4byte	0x6ff5
+	.8byte	.LBB249
+	.4byte	.Ldebug_ranges0+0x150
 	.byte	0x1
 	.byte	0x8d
-	.4byte	0x6d24
+	.4byte	0x6fcd
 	.uleb128 0x4b
-	.4byte	0x6d5c
-	.uleb128 0x51
-	.4byte	.Ldebug_ranges0+0xe0
+	.4byte	0x7005
+	.uleb128 0x50
+	.4byte	.Ldebug_ranges0+0x150
 	.uleb128 0x4d
-	.4byte	0x6d67
+	.4byte	0x7010
 	.uleb128 0x4e
-	.4byte	0x6d72
-	.4byte	.LLST11
+	.4byte	0x701b
+	.4byte	.LLST9
 	.uleb128 0x66
-	.4byte	0x6d9a
-	.8byte	.LBB180
-	.8byte	.LBE180-.LBB180
+	.4byte	0x7043
+	.8byte	.LBB251
+	.8byte	.LBE251-.LBB251
 	.byte	0x1
 	.byte	0x6e
-	.4byte	0x6d15
+	.4byte	0x6fbe
 	.uleb128 0x4b
-	.4byte	0x6db5
+	.4byte	0x705e
 	.uleb128 0x4b
-	.4byte	0x6daa
+	.4byte	0x7053
 	.uleb128 0x4c
-	.8byte	.LBB181
-	.8byte	.LBE181-.LBB181
+	.8byte	.LBB252
+	.8byte	.LBE252-.LBB252
 	.uleb128 0x4d
-	.4byte	0x6dc0
+	.4byte	0x7069
 	.uleb128 0x4e
-	.4byte	0x6dc9
-	.4byte	.LLST12
-	.uleb128 0x5b
-	.4byte	0x6dd5
-	.8byte	.LBB182
-	.4byte	.Ldebug_ranges0+0x110
+	.4byte	0x7072
+	.4byte	.LLST10
+	.uleb128 0x60
+	.4byte	0x707e
+	.8byte	.LBB253
+	.4byte	.Ldebug_ranges0+0x180
 	.byte	0x1
 	.byte	0x54
-	.4byte	0x6d06
+	.4byte	0x6faf
 	.uleb128 0x4b
-	.4byte	0x6dec
+	.4byte	0x7095
 	.uleb128 0x4b
-	.4byte	0x6de1
-	.uleb128 0x51
-	.4byte	.Ldebug_ranges0+0x110
+	.4byte	0x708a
+	.uleb128 0x50
+	.4byte	.Ldebug_ranges0+0x180
 	.uleb128 0x4d
-	.4byte	0x6df7
+	.4byte	0x70a0
 	.uleb128 0x4d
-	.4byte	0x6e00
+	.4byte	0x70a9
 	.uleb128 0x4e
-	.4byte	0x6e09
-	.4byte	.LLST13
+	.4byte	0x70b2
+	.4byte	.LLST11
 	.uleb128 0x4e
-	.4byte	0x6e14
-	.4byte	.LLST14
+	.4byte	0x70bd
+	.4byte	.LLST12
 	.byte	0
 	.byte	0
-	.uleb128 0x4f
-	.8byte	.LVL41
-	.4byte	0x6ffb
+	.uleb128 0x53
+	.8byte	.LVL36
+	.4byte	0x733c
 	.byte	0
 	.byte	0
-	.uleb128 0x4f
-	.8byte	.LVL56
-	.4byte	0x6ff0
+	.uleb128 0x53
+	.8byte	.LVL51
+	.4byte	0x7331
 	.byte	0
 	.byte	0
-	.uleb128 0x4f
-	.8byte	.LVL50
-	.4byte	0x6ff0
-	.uleb128 0x4f
+	.uleb128 0x53
+	.8byte	.LVL45
+	.4byte	0x7331
+	.uleb128 0x53
+	.8byte	.LVL52
+	.4byte	0x7331
+	.uleb128 0x53
 	.8byte	.LVL57
-	.4byte	0x6ff0
-	.uleb128 0x4f
-	.8byte	.LVL62
-	.4byte	0x6ff0
+	.4byte	0x7331
 	.byte	0
-	.uleb128 0x5d
-	.4byte	.LASF1503
+	.uleb128 0x5b
+	.4byte	.LASF1502
 	.byte	0x1
 	.byte	0x65
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6d7e
-	.uleb128 0x5e
-	.4byte	.LASF1492
+	.4byte	0x7027
+	.uleb128 0x5c
+	.4byte	.LASF1491
 	.byte	0x1
 	.byte	0x65
 	.4byte	0x61b2
-	.uleb128 0x60
-	.4byte	.LASF1504
+	.uleb128 0x62
+	.4byte	.LASF1503
 	.byte	0x1
 	.byte	0x67
 	.4byte	0x120
-	.uleb128 0x60
-	.4byte	.LASF1505
+	.uleb128 0x62
+	.4byte	.LASF1504
 	.byte	0x1
 	.byte	0x68
 	.4byte	0x120
 	.byte	0
-	.uleb128 0x5d
-	.4byte	.LASF1506
+	.uleb128 0x5b
+	.4byte	.LASF1505
 	.byte	0x1
 	.byte	0x5b
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6d9a
+	.4byte	0x7043
 	.uleb128 0x67
 	.string	"buf"
 	.byte	0x1
 	.byte	0x5b
 	.4byte	0x6026
 	.byte	0
-	.uleb128 0x5d
-	.4byte	.LASF1507
+	.uleb128 0x5b
+	.4byte	.LASF1506
 	.byte	0x1
 	.byte	0x4e
 	.4byte	0x6c
 	.byte	0x1
-	.4byte	0x6dd5
-	.uleb128 0x5e
-	.4byte	.LASF1508
+	.4byte	0x707e
+	.uleb128 0x5c
+	.4byte	.LASF1507
 	.byte	0x1
 	.byte	0x4e
-	.4byte	0x6a34
-	.uleb128 0x5e
-	.4byte	.LASF1509
+	.4byte	0x6d66
+	.uleb128 0x5c
+	.4byte	.LASF1508
 	.byte	0x1
 	.byte	0x4e
 	.4byte	0x6c
-	.uleb128 0x5a
+	.uleb128 0x5f
 	.string	"i"
 	.byte	0x1
 	.byte	0x50
 	.4byte	0x6c
-	.uleb128 0x60
-	.4byte	.LASF1510
+	.uleb128 0x62
+	.4byte	.LASF1509
 	.byte	0x1
 	.byte	0x51
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0x68
-	.4byte	.LASF1512
+	.4byte	.LASF1511
 	.byte	0x1
 	.byte	0x3a
 	.byte	0x1
-	.4byte	0x6e20
-	.uleb128 0x5e
-	.4byte	.LASF1513
+	.4byte	0x70c9
+	.uleb128 0x5c
+	.4byte	.LASF1512
 	.byte	0x1
 	.byte	0x3a
 	.4byte	0x6c
-	.uleb128 0x5e
-	.4byte	.LASF1514
+	.uleb128 0x5c
+	.4byte	.LASF1513
 	.byte	0x1
 	.byte	0x3a
 	.4byte	0x2d40
-	.uleb128 0x5a
+	.uleb128 0x5f
 	.string	"i"
 	.byte	0x1
 	.byte	0x3c
 	.4byte	0x6c
-	.uleb128 0x5a
+	.uleb128 0x5f
 	.string	"j"
 	.byte	0x1
 	.byte	0x3c
 	.4byte	0x6c
-	.uleb128 0x60
-	.4byte	.LASF1515
+	.uleb128 0x62
+	.4byte	.LASF1514
 	.byte	0x1
 	.byte	0x3d
 	.4byte	0x6c
-	.uleb128 0x60
-	.4byte	.LASF1510
+	.uleb128 0x62
+	.4byte	.LASF1509
 	.byte	0x1
 	.byte	0x3e
 	.4byte	0x6c
 	.byte	0
-	.uleb128 0x53
-	.4byte	.LASF1516
+	.uleb128 0x56
+	.4byte	.LASF1515
 	.byte	0x2
 	.2byte	0x2e5
 	.4byte	0x442
 	.byte	0x3
-	.4byte	0x6e4a
-	.uleb128 0x54
+	.4byte	0x70f3
+	.uleb128 0x57
 	.4byte	.LASF824
 	.byte	0x2
 	.2byte	0x2e5
 	.4byte	0x261
-	.uleb128 0x54
+	.uleb128 0x57
 	.4byte	.LASF61
 	.byte	0x2
 	.2byte	0x2e5
 	.4byte	0x277
 	.byte	0
-	.uleb128 0x53
-	.4byte	.LASF1517
+	.uleb128 0x56
+	.4byte	.LASF1516
 	.byte	0x2
 	.2byte	0x216
 	.4byte	0x442
 	.byte	0x3
-	.4byte	0x6e82
-	.uleb128 0x54
+	.4byte	0x712b
+	.uleb128 0x57
 	.4byte	.LASF824
 	.byte	0x2
 	.2byte	0x216
 	.4byte	0x261
-	.uleb128 0x54
+	.uleb128 0x57
 	.4byte	.LASF61
 	.byte	0x2
 	.2byte	0x216
 	.4byte	0x277
-	.uleb128 0x56
-	.uleb128 0x55
+	.uleb128 0x59
+	.uleb128 0x58
 	.4byte	.LASF907
 	.byte	0x2
 	.2byte	0x21a
 	.4byte	0x6c
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	.LASF1518
+	.uleb128 0x56
+	.4byte	.LASF1517
 	.byte	0x2
 	.2byte	0x1dd
 	.4byte	0x442
 	.byte	0x3
-	.4byte	0x6eb8
-	.uleb128 0x54
+	.4byte	0x7161
+	.uleb128 0x57
 	.4byte	.LASF824
 	.byte	0x2
 	.2byte	0x1dd
 	.4byte	0x261
-	.uleb128 0x54
+	.uleb128 0x57
 	.4byte	.LASF61
 	.byte	0x2
 	.2byte	0x1dd
 	.4byte	0x277
-	.uleb128 0x55
-	.4byte	.LASF1519
+	.uleb128 0x58
+	.4byte	.LASF1518
 	.byte	0x2
 	.2byte	0x1df
 	.4byte	0x6c
 	.byte	0
-	.uleb128 0x53
-	.4byte	.LASF1520
+	.uleb128 0x56
+	.4byte	.LASF1519
 	.byte	0x2
 	.2byte	0x159
 	.4byte	0x6c
 	.byte	0x3
-	.4byte	0x6ed6
-	.uleb128 0x54
+	.4byte	0x717f
+	.uleb128 0x57
 	.4byte	.LASF824
 	.byte	0x2
 	.2byte	0x159
 	.4byte	0x261
 	.byte	0
-	.uleb128 0x53
-	.4byte	.LASF1521
+	.uleb128 0x56
+	.4byte	.LASF1520
 	.byte	0x2
 	.2byte	0x13d
 	.4byte	0x5f4b
 	.byte	0x3
-	.4byte	0x6ef4
-	.uleb128 0x54
+	.4byte	0x719d
+	.uleb128 0x57
 	.4byte	.LASF61
 	.byte	0x2
 	.2byte	0x13d
 	.4byte	0x277
 	.byte	0
-	.uleb128 0x5d
-	.4byte	.LASF1522
+	.uleb128 0x5b
+	.4byte	.LASF1521
 	.byte	0x60
 	.byte	0x1d
 	.4byte	0xc0
 	.byte	0x3
-	.4byte	0x6f10
-	.uleb128 0x5e
+	.4byte	0x71b9
+	.uleb128 0x5c
 	.4byte	.LASF824
 	.byte	0x60
 	.byte	0x1d
 	.4byte	0x2d
 	.byte	0
-	.uleb128 0x5d
-	.4byte	.LASF1523
+	.uleb128 0x5b
+	.4byte	.LASF1522
 	.byte	0x61
 	.byte	0x22
 	.4byte	0xc0
 	.byte	0x3
-	.4byte	0x6f2a
+	.4byte	0x71d3
 	.uleb128 0x67
 	.string	"n"
 	.byte	0x61
 	.byte	0x22
 	.4byte	0x136
 	.byte	0
-	.uleb128 0x5d
-	.4byte	.LASF1524
+	.uleb128 0x5b
+	.4byte	.LASF1523
 	.byte	0x62
 	.byte	0x1b
 	.4byte	0xc0
 	.byte	0x3
-	.4byte	0x6f44
+	.4byte	0x71ed
 	.uleb128 0x67
 	.string	"x"
 	.byte	0x62
 	.byte	0x1b
 	.4byte	0xe4
 	.byte	0
-	.uleb128 0x5d
-	.4byte	.LASF1525
+	.uleb128 0x5b
+	.4byte	.LASF1524
 	.byte	0x63
 	.byte	0xb
 	.4byte	0x2d
 	.byte	0x3
-	.4byte	0x6f60
-	.uleb128 0x5e
-	.4byte	.LASF1526
+	.4byte	0x7209
+	.uleb128 0x5c
+	.4byte	.LASF1525
 	.byte	0x63
 	.byte	0xb
 	.4byte	0x2d
 	.byte	0
 	.uleb128 0x69
-	.4byte	0x67d2
+	.4byte	0x6b06
 	.8byte	.LFB1568
 	.8byte	.LFE1568-.LFB1568
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6fc5
+	.4byte	0x7306
 	.uleb128 0x6a
-	.4byte	0x67ef
-	.4byte	.LLST7
+	.4byte	0x6b23
+	.4byte	.LLST2
 	.uleb128 0x6a
-	.4byte	0x67fb
-	.4byte	.LLST8
+	.4byte	0x6b2f
+	.4byte	.LLST3
 	.uleb128 0x4b
-	.4byte	0x67e3
+	.4byte	0x6b17
 	.uleb128 0x4b
-	.4byte	0x67e3
+	.4byte	0x6b17
 	.uleb128 0x4d
-	.4byte	0x6807
+	.4byte	0x6b3b
 	.uleb128 0x4e
-	.4byte	0x6813
-	.4byte	.LLST9
+	.4byte	0x6b47
+	.4byte	.LLST4
 	.uleb128 0x4d
-	.4byte	0x681f
-	.uleb128 0x4f
-	.8byte	.LVL34
-	.4byte	0x6a56
+	.4byte	0x6b53
+	.uleb128 0x54
+	.4byte	0x6d88
+	.8byte	.LBB222
+	.4byte	.Ldebug_ranges0+0x40
+	.byte	0x1
+	.2byte	0x15d
+	.4byte	0x72f8
+	.uleb128 0x4b
+	.4byte	0x6da3
+	.uleb128 0x4b
+	.4byte	0x6d98
+	.uleb128 0x50
+	.4byte	.Ldebug_ranges0+0x40
+	.uleb128 0x4e
+	.4byte	0x6dae
+	.4byte	.LLST5
+	.uleb128 0x4e
+	.4byte	0x6db9
+	.4byte	.LLST6
+	.uleb128 0x4e
+	.4byte	0x6dc4
+	.4byte	.LLST7
+	.uleb128 0x4d
+	.4byte	0x6dcf
+	.uleb128 0x4d
+	.4byte	0x6dda
+	.uleb128 0x4d
+	.4byte	0x6de4
 	.uleb128 0x4f
-	.8byte	.LVL37
-	.4byte	0x698e
+	.4byte	0x6df0
+	.8byte	.LBB224
+	.4byte	.Ldebug_ranges0+0x90
+	.byte	0x1
+	.byte	0xe4
+	.uleb128 0x4b
+	.4byte	0x6e0b
+	.uleb128 0x4b
+	.4byte	0x6e00
+	.uleb128 0x50
+	.4byte	.Ldebug_ranges0+0x90
+	.uleb128 0x4d
+	.4byte	0x6e16
+	.uleb128 0x4d
+	.4byte	0x6e21
+	.uleb128 0x51
+	.4byte	.Ldebug_ranges0+0xc0
+	.4byte	0x72e4
+	.uleb128 0x4d
+	.4byte	0x6e2f
+	.uleb128 0x4d
+	.4byte	0x6e3a
+	.byte	0
+	.uleb128 0x50
+	.4byte	.Ldebug_ranges0+0xf0
+	.uleb128 0x4d
+	.4byte	0x6e47
+	.uleb128 0x4d
+	.4byte	0x6e52
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x53
+	.8byte	.LVL19
+	.4byte	0x6cc0
 	.byte	0
 	.uleb128 0x6b
-	.4byte	.LASF1527
-	.4byte	.LASF1527
+	.4byte	.LASF1526
+	.4byte	.LASF1526
 	.byte	0x2
 	.2byte	0x184
 	.uleb128 0x6c
-	.4byte	.LASF1528
-	.4byte	.LASF1528
+	.4byte	.LASF1527
+	.4byte	.LASF1527
 	.byte	0x2
 	.byte	0xb9
 	.uleb128 0x6d
-	.4byte	.LASF1531
-	.4byte	.LASF1531
+	.4byte	.LASF1530
+	.4byte	.LASF1530
 	.uleb128 0x6c
-	.4byte	.LASF1529
-	.4byte	.LASF1529
+	.4byte	.LASF1528
+	.4byte	.LASF1528
 	.byte	0x64
 	.byte	0x1e
 	.uleb128 0x6c
-	.4byte	.LASF1530
-	.4byte	.LASF1530
+	.4byte	.LASF1529
+	.4byte	.LASF1529
 	.byte	0xe
 	.byte	0xb0
 	.uleb128 0x6d
-	.4byte	.LASF1532
-	.4byte	.LASF1532
+	.4byte	.LASF1531
+	.4byte	.LASF1531
 	.byte	0
 	.section	.debug_abbrev,"",@progbits
 .Ldebug_abbrev0:
@@ -15476,6 +16065,52 @@ crc32_table:
 	.byte	0
 	.byte	0
 	.uleb128 0x4f
+	.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 0x50
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x55
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x51
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x55
+	.uleb128 0x17
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x52
+	.uleb128 0x1d
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x58
+	.uleb128 0xb
+	.uleb128 0x59
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x53
 	.uleb128 0x4109
 	.byte	0
 	.uleb128 0x11
@@ -15484,7 +16119,7 @@ crc32_table:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x50
+	.uleb128 0x54
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -15498,17 +16133,10 @@ crc32_table:
 	.uleb128 0x59
 	.uleb128 0x5
 	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x51
-	.uleb128 0xb
-	.byte	0x1
-	.uleb128 0x55
-	.uleb128 0x17
+	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x52
+	.uleb128 0x55
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -15523,7 +16151,7 @@ crc32_table:
 	.uleb128 0x5
 	.byte	0
 	.byte	0
-	.uleb128 0x53
+	.uleb128 0x56
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -15542,7 +16170,7 @@ crc32_table:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x54
+	.uleb128 0x57
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -15555,7 +16183,7 @@ crc32_table:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x55
+	.uleb128 0x58
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -15568,12 +16196,12 @@ crc32_table:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x56
+	.uleb128 0x59
 	.uleb128 0xb
 	.byte	0x1
 	.byte	0
 	.byte	0
-	.uleb128 0x57
+	.uleb128 0x5a
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -15590,7 +16218,7 @@ crc32_table:
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x58
+	.uleb128 0x5b
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -15603,19 +16231,13 @@ crc32_table:
 	.uleb128 0x19
 	.uleb128 0x49
 	.uleb128 0x13
-	.uleb128 0x11
-	.uleb128 0x1
-	.uleb128 0x12
-	.uleb128 0x7
-	.uleb128 0x40
-	.uleb128 0x18
-	.uleb128 0x2117
-	.uleb128 0x19
+	.uleb128 0x20
+	.uleb128 0xb
 	.uleb128 0x1
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x59
+	.uleb128 0x5c
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -15626,53 +16248,6 @@ crc32_table:
 	.uleb128 0xb
 	.uleb128 0x49
 	.uleb128 0x13
-	.uleb128 0x2
-	.uleb128 0x17
-	.byte	0
-	.byte	0
-	.uleb128 0x5a
-	.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 0x5b
-	.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 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
@@ -15688,8 +16263,14 @@ crc32_table:
 	.uleb128 0x19
 	.uleb128 0x49
 	.uleb128 0x13
-	.uleb128 0x20
-	.uleb128 0xb
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
 	.uleb128 0x1
 	.uleb128 0x13
 	.byte	0
@@ -15705,33 +16286,37 @@ crc32_table:
 	.uleb128 0xb
 	.uleb128 0x49
 	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
 	.byte	0
 	.byte	0
 	.uleb128 0x5f
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
-	.uleb128 0xe
+	.uleb128 0x8
 	.uleb128 0x3a
 	.uleb128 0xb
 	.uleb128 0x3b
 	.uleb128 0xb
 	.uleb128 0x49
 	.uleb128 0x13
-	.uleb128 0x2
-	.uleb128 0x17
 	.byte	0
 	.byte	0
 	.uleb128 0x60
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x3
-	.uleb128 0xe
-	.uleb128 0x3a
+	.uleb128 0x1d
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x52
+	.uleb128 0x1
+	.uleb128 0x55
+	.uleb128 0x17
+	.uleb128 0x58
 	.uleb128 0xb
-	.uleb128 0x3b
+	.uleb128 0x59
 	.uleb128 0xb
-	.uleb128 0x49
+	.uleb128 0x1
 	.uleb128 0x13
 	.byte	0
 	.byte	0
@@ -15740,22 +16325,26 @@ crc32_table:
 	.byte	0x1
 	.uleb128 0x31
 	.uleb128 0x13
-	.uleb128 0x11
+	.uleb128 0x52
 	.uleb128 0x1
-	.uleb128 0x12
-	.uleb128 0x7
+	.uleb128 0x55
+	.uleb128 0x17
 	.uleb128 0x58
 	.uleb128 0xb
 	.uleb128 0x59
-	.uleb128 0xb
+	.uleb128 0x5
 	.byte	0
 	.byte	0
 	.uleb128 0x62
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
 	.uleb128 0xb
-	.byte	0x1
-	.uleb128 0x55
-	.uleb128 0x17
-	.uleb128 0x1
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
 	.uleb128 0x13
 	.byte	0
 	.byte	0
@@ -15941,439 +16530,626 @@ crc32_table:
 	.byte	0
 	.section	.debug_loc,"",@progbits
 .Ldebug_loc0:
-.LLST15:
-	.8byte	.LVL63-.Ltext0
-	.8byte	.LVL65-.Ltext0
+.LLST13:
+	.8byte	.LVL58-.Ltext0
+	.8byte	.LVL60-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL65-.Ltext0
-	.8byte	.LVL84-.Ltext0
+	.8byte	.LVL60-.Ltext0
+	.8byte	.LVL89-.Ltext0
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL86-.Ltext0
-	.8byte	.LVL87-.Ltext0
+	.8byte	.LVL91-.Ltext0
+	.8byte	.LVL92-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL87-.Ltext0
-	.8byte	.LVL107-.Ltext0
+	.8byte	.LVL92-.Ltext0
+	.8byte	.LVL123-.Ltext0
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL107-.Ltext0
-	.8byte	.LVL108-.Ltext0
+	.8byte	.LVL123-.Ltext0
+	.8byte	.LVL124-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL109-.Ltext0
-	.8byte	.LVL110-.Ltext0
+	.8byte	.LVL125-.Ltext0
+	.8byte	.LVL126-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL111-.Ltext0
+	.8byte	.LVL127-.Ltext0
 	.8byte	.LFE1564-.Ltext0
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST16:
-	.8byte	.LVL63-.Ltext0
-	.8byte	.LVL67-.Ltext0
+.LLST14:
+	.8byte	.LVL58-.Ltext0
+	.8byte	.LVL59-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL67-.Ltext0
-	.8byte	.LVL85-.Ltext0
+	.8byte	.LVL59-.Ltext0
+	.8byte	.LVL63-.Ltext0
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL85-.Ltext0
+	.byte	0x64
 	.8byte	.LVL87-.Ltext0
+	.8byte	.LVL92-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL88-.Ltext0
-	.8byte	.LVL97-.Ltext0
+	.8byte	.LVL95-.Ltext0
+	.8byte	.LVL100-.Ltext0
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL104-.Ltext0
+	.byte	0x64
+	.8byte	.LVL102-.Ltext0
 	.8byte	.LVL107-.Ltext0
 	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL107-.Ltext0
-	.8byte	.LVL111-.Ltext0
+	.byte	0x64
+	.8byte	.LVL115-.Ltext0
+	.8byte	.LVL119-.Ltext0
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL120-.Ltext0
+	.8byte	.LVL123-.Ltext0
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL123-.Ltext0
+	.8byte	.LVL127-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL111-.Ltext0
+	.8byte	.LVL127-.Ltext0
 	.8byte	.LFE1564-.Ltext0
 	.2byte	0x1
-	.byte	0x65
+	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST17:
-	.8byte	.LVL63-.Ltext0
-	.8byte	.LVL64-.Ltext0
+.LLST15:
+	.8byte	.LVL58-.Ltext0
+	.8byte	.LVL61-1-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL62-.Ltext0
+	.8byte	.LVL66-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL82-.Ltext0
 	.8byte	.LVL87-.Ltext0
+	.8byte	.LVL92-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL95-.Ltext0
+	.8byte	.LVL97-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL102-.Ltext0
+	.8byte	.LVL103-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL116-.Ltext0
+	.8byte	.LVL117-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL120-.Ltext0
+	.8byte	.LVL121-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL123-.Ltext0
+	.8byte	.LVL128-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL130-.Ltext0
+	.8byte	.LVL131-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL137-.Ltext0
+	.8byte	.LVL138-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST16:
+	.8byte	.LVL64-.Ltext0
+	.8byte	.LVL68-.Ltext0
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL93-.Ltext0
+	.8byte	.LVL94-.Ltext0
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST17:
+	.8byte	.LVL66-.Ltext0
+	.8byte	.LVL67-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL93-.Ltext0
+	.8byte	.LVL94-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST18:
+	.8byte	.LVL65-.Ltext0
+	.8byte	.LVL69-1-.Ltext0
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL93-.Ltext0
+	.8byte	.LVL94-.Ltext0
+	.2byte	0x1
+	.byte	0x54
+	.8byte	0
+	.8byte	0
+.LLST19:
+	.8byte	.LVL70-.Ltext0
+	.8byte	.LVL75-.Ltext0
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL92-.Ltext0
+	.8byte	.LVL93-.Ltext0
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST20:
+	.8byte	.LVL72-.Ltext0
+	.8byte	.LVL74-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL92-.Ltext0
+	.8byte	.LVL93-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST21:
+	.8byte	.LVL71-.Ltext0
+	.8byte	.LVL73-.Ltext0
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL107-.Ltext0
-	.8byte	.LVL111-.Ltext0
+	.byte	0x53
+	.8byte	.LVL92-.Ltext0
+	.8byte	.LVL93-.Ltext0
 	.2byte	0x1
-	.byte	0x52
+	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST18:
-	.8byte	.LVL72-.Ltext0
-	.8byte	.LVL76-1-.Ltext0
+.LLST22:
+	.8byte	.LVL77-.Ltext0
+	.8byte	.LVL81-1-.Ltext0
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST19:
-	.8byte	.LVL74-.Ltext0
-	.8byte	.LVL76-1-.Ltext0
+.LLST23:
+	.8byte	.LVL79-.Ltext0
+	.8byte	.LVL81-1-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST20:
-	.8byte	.LVL73-.Ltext0
-	.8byte	.LVL76-1-.Ltext0
+.LLST24:
+	.8byte	.LVL78-.Ltext0
+	.8byte	.LVL81-1-.Ltext0
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST21:
-	.8byte	.LVL75-.Ltext0
-	.8byte	.LVL85-.Ltext0
+.LLST25:
+	.8byte	.LVL80-.Ltext0
+	.8byte	.LVL90-.Ltext0
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL87-.Ltext0
-	.8byte	.LVL89-.Ltext0
+	.8byte	.LVL94-.Ltext0
+	.8byte	.LVL96-.Ltext0
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL95-.Ltext0
-	.8byte	.LVL104-.Ltext0
+	.8byte	.LVL106-.Ltext0
+	.8byte	.LVL115-.Ltext0
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST22:
-	.8byte	.LVL75-.Ltext0
-	.8byte	.LVL76-1-.Ltext0
+.LLST26:
+	.8byte	.LVL103-.Ltext0
+	.8byte	.LVL108-1-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL141-.Ltext0
+	.8byte	.LFE1564-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST27:
+	.8byte	.LVL105-.Ltext0
+	.8byte	.LVL108-1-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL141-.Ltext0
+	.8byte	.LFE1564-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST28:
+	.8byte	.LVL104-.Ltext0
+	.8byte	.LVL108-1-.Ltext0
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL141-.Ltext0
+	.8byte	.LFE1564-.Ltext0
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST29:
+	.8byte	.LVL80-.Ltext0
+	.8byte	.LVL81-1-.Ltext0
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL99-.Ltext0
-	.8byte	.LVL100-.Ltext0
+	.8byte	.LVL110-.Ltext0
+	.8byte	.LVL111-.Ltext0
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL101-.Ltext0
-	.8byte	.LVL104-.Ltext0
+	.8byte	.LVL112-.Ltext0
+	.8byte	.LVL115-.Ltext0
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST23:
-	.8byte	.LVL75-.Ltext0
-	.8byte	.LVL76-1-.Ltext0
+.LLST30:
+	.8byte	.LVL80-.Ltext0
+	.8byte	.LVL81-1-.Ltext0
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL99-.Ltext0
-	.8byte	.LVL102-.Ltext0
+	.8byte	.LVL110-.Ltext0
+	.8byte	.LVL113-.Ltext0
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL103-.Ltext0
-	.8byte	.LVL104-.Ltext0
+	.8byte	.LVL114-.Ltext0
+	.8byte	.LVL115-.Ltext0
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST24:
-	.8byte	.LVL75-.Ltext0
-	.8byte	.LVL76-1-.Ltext0
+.LLST31:
+	.8byte	.LVL80-.Ltext0
+	.8byte	.LVL81-1-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL99-.Ltext0
-	.8byte	.LVL104-.Ltext0
+	.8byte	.LVL110-.Ltext0
+	.8byte	.LVL115-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST25:
-	.8byte	.LVL79-.Ltext0
-	.8byte	.LVL86-.Ltext0
+.LLST32:
+	.8byte	.LVL84-.Ltext0
+	.8byte	.LVL91-.Ltext0
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST26:
-	.8byte	.LVL79-.Ltext0
-	.8byte	.LVL86-.Ltext0
+.LLST33:
+	.8byte	.LVL84-.Ltext0
+	.8byte	.LVL91-.Ltext0
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST27:
-	.8byte	.LVL78-.Ltext0
-	.8byte	.LVL84-.Ltext0
+.LLST34:
+	.8byte	.LVL83-.Ltext0
+	.8byte	.LVL89-.Ltext0
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST28:
-	.8byte	.LVL79-.Ltext0
-	.8byte	.LVL80-.Ltext0
+.LLST35:
+	.8byte	.LVL84-.Ltext0
+	.8byte	.LVL85-.Ltext0
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL81-.Ltext0
 	.8byte	.LVL86-.Ltext0
+	.8byte	.LVL91-.Ltext0
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST29:
-	.8byte	.LVL77-.Ltext0
-	.8byte	.LVL78-.Ltext0
-	.2byte	0x1
-	.byte	0x64
+.LLST36:
+	.8byte	.LVL82-.Ltext0
 	.8byte	.LVL83-.Ltext0
-	.8byte	.LVL84-.Ltext0
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL88-.Ltext0
 	.8byte	.LVL89-.Ltext0
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL91-.Ltext0
-	.8byte	.LVL93-.Ltext0
+	.8byte	.LVL95-.Ltext0
+	.8byte	.LVL96-.Ltext0
 	.2byte	0x1
 	.byte	0x64
-	.8byte	0
-	.8byte	0
-.LLST30:
-	.8byte	.LVL114-.Ltext0
-	.8byte	.LVL115-.Ltext0
+	.8byte	.LVL100-.Ltext0
+	.8byte	.LVL102-.Ltext0
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST5:
-	.8byte	.LVL27-.Ltext0
-	.8byte	.LVL29-.Ltext0
+.LLST37:
+	.8byte	.LVL97-.Ltext0
+	.8byte	.LVL101-1-.Ltext0
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL29-.Ltext0
-	.8byte	.LVL32-.Ltext0
+	.byte	0x52
+	.8byte	.LVL115-.Ltext0
+	.8byte	.LVL116-.Ltext0
 	.2byte	0x1
-	.byte	0x65
+	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST6:
-	.8byte	.LVL27-.Ltext0
-	.8byte	.LVL28-.Ltext0
+.LLST38:
+	.8byte	.LVL99-.Ltext0
+	.8byte	.LVL101-1-.Ltext0
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x53
+	.8byte	.LVL115-.Ltext0
+	.8byte	.LVL116-.Ltext0
+	.2byte	0x1
+	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST0:
-	.8byte	.LVL0-.Ltext0
-	.8byte	.LVL4-.Ltext0
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL7-.Ltext0
-	.8byte	.LVL10-.Ltext0
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL11-.Ltext0
-	.8byte	.LVL17-.Ltext0
+.LLST39:
+	.8byte	.LVL98-.Ltext0
+	.8byte	.LVL101-1-.Ltext0
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL18-.Ltext0
-	.8byte	.LFE1553-.Ltext0
+	.byte	0x55
+	.8byte	.LVL115-.Ltext0
+	.8byte	.LVL116-.Ltext0
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST1:
-	.8byte	.LVL0-.Ltext0
-	.8byte	.LVL5-.Ltext0
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL7-.Ltext0
-	.8byte	.LVL17-.Ltext0
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL18-.Ltext0
-	.8byte	.LFE1553-.Ltext0
+.LLST40:
+	.8byte	.LVL134-.Ltext0
+	.8byte	.LVL135-.Ltext0
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST2:
-	.8byte	.LVL3-.Ltext0
-	.8byte	.LVL7-.Ltext0
-	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL9-.Ltext0
-	.8byte	.LVL11-.Ltext0
+.LLST41:
+	.8byte	.LVL131-.Ltext0
+	.8byte	.LVL136-1-.Ltext0
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL13-.Ltext0
-	.8byte	.LVL14-.Ltext0
+	.byte	0x52
+	.8byte	.LVL140-.Ltext0
+	.8byte	.LVL141-.Ltext0
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL16-.Ltext0
-	.8byte	.LVL18-.Ltext0
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST42:
+	.8byte	.LVL133-.Ltext0
+	.8byte	.LVL136-1-.Ltext0
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL20-.Ltext0
-	.8byte	.LVL21-.Ltext0
+	.byte	0x53
+	.8byte	.LVL140-.Ltext0
+	.8byte	.LVL141-.Ltext0
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL23-.Ltext0
-	.8byte	.LVL24-.Ltext0
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST43:
+	.8byte	.LVL132-.Ltext0
+	.8byte	.LVL136-1-.Ltext0
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL26-.Ltext0
-	.8byte	.LFE1553-.Ltext0
+	.byte	0x55
+	.8byte	.LVL140-.Ltext0
+	.8byte	.LVL141-.Ltext0
 	.2byte	0x1
-	.byte	0x57
+	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST3:
+.LLST0:
+	.8byte	.LVL0-.Ltext0
 	.8byte	.LVL2-.Ltext0
-	.8byte	.LVL7-.Ltext0
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL8-.Ltext0
-	.8byte	.LVL11-.Ltext0
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL12-.Ltext0
-	.8byte	.LVL14-.Ltext0
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL15-.Ltext0
-	.8byte	.LVL18-.Ltext0
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL19-.Ltext0
-	.8byte	.LVL21-.Ltext0
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL22-.Ltext0
-	.8byte	.LVL24-.Ltext0
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL25-.Ltext0
-	.8byte	.LFE1553-.Ltext0
+	.byte	0x50
+	.8byte	.LVL2-.Ltext0
+	.8byte	.LVL5-.Ltext0
 	.2byte	0x1
-	.byte	0x52
+	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST4:
-	.8byte	.LVL6-.Ltext0
-	.8byte	.LVL7-.Ltext0
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL17-.Ltext0
-	.8byte	.LVL18-.Ltext0
+.LLST1:
+	.8byte	.LVL0-.Ltext0
+	.8byte	.LVL1-.Ltext0
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST10:
-	.8byte	.LVL38-.Ltext0
-	.8byte	.LVL39-.Ltext0
+.LLST8:
+	.8byte	.LVL33-.Ltext0
+	.8byte	.LVL34-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL39-.Ltext0
-	.8byte	.LVL51-.Ltext0
+	.8byte	.LVL34-.Ltext0
+	.8byte	.LVL46-.Ltext0
 	.2byte	0x1
 	.byte	0x65
+	.8byte	.LVL48-.Ltext0
 	.8byte	.LVL53-.Ltext0
-	.8byte	.LVL58-.Ltext0
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL60-.Ltext0
+	.8byte	.LVL55-.Ltext0
 	.8byte	.LFE1550-.Ltext0
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST11:
+.LLST9:
+	.8byte	.LVL42-.Ltext0
 	.8byte	.LVL47-.Ltext0
-	.8byte	.LVL52-.Ltext0
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL53-.Ltext0
-	.8byte	.LVL59-.Ltext0
+	.8byte	.LVL48-.Ltext0
+	.8byte	.LVL54-.Ltext0
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST12:
-	.8byte	.LVL42-.Ltext0
-	.8byte	.LVL50-1-.Ltext0
+.LLST10:
+	.8byte	.LVL37-.Ltext0
+	.8byte	.LVL45-1-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL53-.Ltext0
-	.8byte	.LVL56-1-.Ltext0
+	.8byte	.LVL48-.Ltext0
+	.8byte	.LVL51-1-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST13:
-	.8byte	.LVL42-.Ltext0
-	.8byte	.LVL45-.Ltext0
+.LLST11:
+	.8byte	.LVL37-.Ltext0
+	.8byte	.LVL40-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL47-.Ltext0
-	.8byte	.LVL49-.Ltext0
+	.8byte	.LVL42-.Ltext0
+	.8byte	.LVL44-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL53-.Ltext0
-	.8byte	.LVL55-.Ltext0
+	.8byte	.LVL48-.Ltext0
+	.8byte	.LVL50-.Ltext0
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST14:
-	.8byte	.LVL42-.Ltext0
-	.8byte	.LVL43-.Ltext0
+.LLST12:
+	.8byte	.LVL37-.Ltext0
+	.8byte	.LVL38-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL44-.Ltext0
-	.8byte	.LVL46-.Ltext0
+	.8byte	.LVL39-.Ltext0
+	.8byte	.LVL41-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL47-.Ltext0
-	.8byte	.LVL48-.Ltext0
+	.8byte	.LVL42-.Ltext0
+	.8byte	.LVL43-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL53-.Ltext0
-	.8byte	.LVL54-.Ltext0
+	.8byte	.LVL48-.Ltext0
+	.8byte	.LVL49-.Ltext0
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST7:
-	.8byte	.LVL33-.Ltext0
-	.8byte	.LVL34-1-.Ltext0
+.LLST2:
+	.8byte	.LVL6-.Ltext0
+	.8byte	.LVL15-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL16-.Ltext0
+	.8byte	.LVL19-1-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL21-.Ltext0
+	.8byte	.LFE1568-.Ltext0
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST8:
-	.8byte	.LVL33-.Ltext0
-	.8byte	.LVL34-1-.Ltext0
+.LLST3:
+	.8byte	.LVL6-.Ltext0
+	.8byte	.LVL14-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL16-.Ltext0
+	.8byte	.LVL19-1-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL21-.Ltext0
+	.8byte	.LFE1568-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST9:
-	.8byte	.LVL35-.Ltext0
-	.8byte	.LVL36-.Ltext0
+.LLST4:
+	.8byte	.LVL17-.Ltext0
+	.8byte	.LVL18-.Ltext0
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
+.LLST5:
+	.8byte	.LVL7-.Ltext0
+	.8byte	.LVL10-.Ltext0
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL11-.Ltext0
+	.8byte	.LVL16-.Ltext0
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL20-.Ltext0
+	.8byte	.LFE1568-.Ltext0
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST6:
+	.8byte	.LVL9-.Ltext0
+	.8byte	.LVL11-.Ltext0
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL13-.Ltext0
+	.8byte	.LVL19-1-.Ltext0
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL20-.Ltext0
+	.8byte	.LVL21-.Ltext0
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL23-.Ltext0
+	.8byte	.LVL24-.Ltext0
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL26-.Ltext0
+	.8byte	.LVL27-.Ltext0
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL29-.Ltext0
+	.8byte	.LVL30-.Ltext0
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL32-.Ltext0
+	.8byte	.LFE1568-.Ltext0
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST7:
+	.8byte	.LVL8-.Ltext0
+	.8byte	.LVL11-.Ltext0
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL12-.Ltext0
+	.8byte	.LVL19-1-.Ltext0
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL20-.Ltext0
+	.8byte	.LVL21-.Ltext0
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL22-.Ltext0
+	.8byte	.LVL24-.Ltext0
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL25-.Ltext0
+	.8byte	.LVL27-.Ltext0
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL28-.Ltext0
+	.8byte	.LVL30-.Ltext0
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL31-.Ltext0
+	.8byte	.LFE1568-.Ltext0
+	.2byte	0x1
+	.byte	0x54
+	.8byte	0
+	.8byte	0
 	.section	.debug_aranges,"",@progbits
 	.4byte	0x2c
 	.2byte	0x2
@@ -16388,66 +17164,184 @@ crc32_table:
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
 .Ldebug_ranges0:
-	.8byte	.LBB153-.Ltext0
-	.8byte	.LBE153-.Ltext0
-	.8byte	.LBB155-.Ltext0
-	.8byte	.LBE155-.Ltext0
+	.8byte	.LBB205-.Ltext0
+	.8byte	.LBE205-.Ltext0
+	.8byte	.LBB212-.Ltext0
+	.8byte	.LBE212-.Ltext0
+	.8byte	.LBB213-.Ltext0
+	.8byte	.LBE213-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB222-.Ltext0
+	.8byte	.LBE222-.Ltext0
+	.8byte	.LBB235-.Ltext0
+	.8byte	.LBE235-.Ltext0
+	.8byte	.LBB236-.Ltext0
+	.8byte	.LBE236-.Ltext0
+	.8byte	.LBB237-.Ltext0
+	.8byte	.LBE237-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB154-.Ltext0
-	.8byte	.LBE154-.Ltext0
-	.8byte	.LBB156-.Ltext0
-	.8byte	.LBE156-.Ltext0
-	.8byte	.LBB157-.Ltext0
-	.8byte	.LBE157-.Ltext0
+	.8byte	.LBB224-.Ltext0
+	.8byte	.LBE224-.Ltext0
+	.8byte	.LBB231-.Ltext0
+	.8byte	.LBE231-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB158-.Ltext0
-	.8byte	.LBE158-.Ltext0
-	.8byte	.LBB165-.Ltext0
-	.8byte	.LBE165-.Ltext0
-	.8byte	.LBB166-.Ltext0
-	.8byte	.LBE166-.Ltext0
+	.8byte	.LBB226-.Ltext0
+	.8byte	.LBE226-.Ltext0
+	.8byte	.LBB228-.Ltext0
+	.8byte	.LBE228-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB175-.Ltext0
-	.8byte	.LBE175-.Ltext0
-	.8byte	.LBB190-.Ltext0
-	.8byte	.LBE190-.Ltext0
+	.8byte	.LBB227-.Ltext0
+	.8byte	.LBE227-.Ltext0
+	.8byte	.LBB229-.Ltext0
+	.8byte	.LBE229-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB178-.Ltext0
-	.8byte	.LBE178-.Ltext0
-	.8byte	.LBB189-.Ltext0
-	.8byte	.LBE189-.Ltext0
+	.8byte	.LBB246-.Ltext0
+	.8byte	.LBE246-.Ltext0
+	.8byte	.LBB261-.Ltext0
+	.8byte	.LBE261-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB182-.Ltext0
-	.8byte	.LBE182-.Ltext0
-	.8byte	.LBB186-.Ltext0
-	.8byte	.LBE186-.Ltext0
-	.8byte	.LBB187-.Ltext0
-	.8byte	.LBE187-.Ltext0
+	.8byte	.LBB249-.Ltext0
+	.8byte	.LBE249-.Ltext0
+	.8byte	.LBB260-.Ltext0
+	.8byte	.LBE260-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB239-.Ltext0
-	.8byte	.LBE239-.Ltext0
-	.8byte	.LBB255-.Ltext0
-	.8byte	.LBE255-.Ltext0
+	.8byte	.LBB253-.Ltext0
+	.8byte	.LBE253-.Ltext0
+	.8byte	.LBB257-.Ltext0
+	.8byte	.LBE257-.Ltext0
 	.8byte	.LBB258-.Ltext0
 	.8byte	.LBE258-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB251-.Ltext0
-	.8byte	.LBE251-.Ltext0
-	.8byte	.LBB254-.Ltext0
-	.8byte	.LBE254-.Ltext0
+	.8byte	.LBB336-.Ltext0
+	.8byte	.LBE336-.Ltext0
+	.8byte	.LBB347-.Ltext0
+	.8byte	.LBE347-.Ltext0
+	.8byte	.LBB348-.Ltext0
+	.8byte	.LBE348-.Ltext0
+	.8byte	.LBB349-.Ltext0
+	.8byte	.LBE349-.Ltext0
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB252-.Ltext0
-	.8byte	.LBE252-.Ltext0
-	.8byte	.LBB253-.Ltext0
-	.8byte	.LBE253-.Ltext0
+	.8byte	.LBB338-.Ltext0
+	.8byte	.LBE338-.Ltext0
+	.8byte	.LBB341-.Ltext0
+	.8byte	.LBE341-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB339-.Ltext0
+	.8byte	.LBE339-.Ltext0
+	.8byte	.LBB340-.Ltext0
+	.8byte	.LBE340-.Ltext0
+	.8byte	.LBB342-.Ltext0
+	.8byte	.LBE342-.Ltext0
+	.8byte	.LBB343-.Ltext0
+	.8byte	.LBE343-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB358-.Ltext0
+	.8byte	.LBE358-.Ltext0
+	.8byte	.LBB390-.Ltext0
+	.8byte	.LBE390-.Ltext0
+	.8byte	.LBB409-.Ltext0
+	.8byte	.LBE409-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB362-.Ltext0
+	.8byte	.LBE362-.Ltext0
+	.8byte	.LBB373-.Ltext0
+	.8byte	.LBE373-.Ltext0
+	.8byte	.LBB374-.Ltext0
+	.8byte	.LBE374-.Ltext0
+	.8byte	.LBB375-.Ltext0
+	.8byte	.LBE375-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB364-.Ltext0
+	.8byte	.LBE364-.Ltext0
+	.8byte	.LBB367-.Ltext0
+	.8byte	.LBE367-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB365-.Ltext0
+	.8byte	.LBE365-.Ltext0
+	.8byte	.LBB366-.Ltext0
+	.8byte	.LBE366-.Ltext0
+	.8byte	.LBB368-.Ltext0
+	.8byte	.LBE368-.Ltext0
+	.8byte	.LBB369-.Ltext0
+	.8byte	.LBE369-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB386-.Ltext0
+	.8byte	.LBE386-.Ltext0
+	.8byte	.LBB389-.Ltext0
+	.8byte	.LBE389-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB387-.Ltext0
+	.8byte	.LBE387-.Ltext0
+	.8byte	.LBB388-.Ltext0
+	.8byte	.LBE388-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB395-.Ltext0
+	.8byte	.LBE395-.Ltext0
+	.8byte	.LBB406-.Ltext0
+	.8byte	.LBE406-.Ltext0
+	.8byte	.LBB407-.Ltext0
+	.8byte	.LBE407-.Ltext0
+	.8byte	.LBB408-.Ltext0
+	.8byte	.LBE408-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB397-.Ltext0
+	.8byte	.LBE397-.Ltext0
+	.8byte	.LBB400-.Ltext0
+	.8byte	.LBE400-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB398-.Ltext0
+	.8byte	.LBE398-.Ltext0
+	.8byte	.LBB399-.Ltext0
+	.8byte	.LBE399-.Ltext0
+	.8byte	.LBB401-.Ltext0
+	.8byte	.LBE401-.Ltext0
+	.8byte	.LBB402-.Ltext0
+	.8byte	.LBE402-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB414-.Ltext0
+	.8byte	.LBE414-.Ltext0
+	.8byte	.LBB425-.Ltext0
+	.8byte	.LBE425-.Ltext0
+	.8byte	.LBB426-.Ltext0
+	.8byte	.LBE426-.Ltext0
+	.8byte	.LBB427-.Ltext0
+	.8byte	.LBE427-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB416-.Ltext0
+	.8byte	.LBE416-.Ltext0
+	.8byte	.LBB419-.Ltext0
+	.8byte	.LBE419-.Ltext0
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB417-.Ltext0
+	.8byte	.LBE417-.Ltext0
+	.8byte	.LBB418-.Ltext0
+	.8byte	.LBE418-.Ltext0
+	.8byte	.LBB420-.Ltext0
+	.8byte	.LBE420-.Ltext0
+	.8byte	.LBB421-.Ltext0
+	.8byte	.LBE421-.Ltext0
 	.8byte	0
 	.8byte	0
 	.section	.debug_line,"",@progbits
@@ -16493,7 +17387,7 @@ crc32_table:
 	.string	"locked_pending"
 .LASF343:
 	.string	"stack_canary"
-.LASF1505:
+.LASF1504:
 	.string	"readcrc"
 .LASF324:
 	.string	"exit_code"
@@ -16529,7 +17423,7 @@ crc32_table:
 	.string	"need_parent_lock"
 .LASF845:
 	.string	"mkdir"
-.LASF1500:
+.LASF1499:
 	.string	"rkf_wf_get_lut"
 .LASF37:
 	.string	"_Bool"
@@ -16745,7 +17639,7 @@ crc32_table:
 	.string	"__rb_parent_color"
 .LASF239:
 	.string	"__initdata_end"
-.LASF1525:
+.LASF1524:
 	.string	"__fls"
 .LASF978:
 	.string	"si_errno"
@@ -16765,7 +17659,7 @@ crc32_table:
 	.string	"subsys_private"
 .LASF873:
 	.string	"compat_time_t"
-.LASF1501:
+.LASF1500:
 	.string	"rkf_wf_input"
 .LASF1276:
 	.string	"direct_complete"
@@ -16989,7 +17883,7 @@ crc32_table:
 	.string	"runnable_load_sum"
 .LASF405:
 	.string	"last_siginfo"
-.LASF1521:
+.LASF1520:
 	.string	"kmalloc_type"
 .LASF146:
 	.string	"elf_hwcap"
@@ -17033,7 +17927,7 @@ crc32_table:
 	.string	"remove"
 .LASF274:
 	.string	"debug_locks_silent"
-.LASF1524:
+.LASF1523:
 	.string	"fls64"
 .LASF1101:
 	.string	"perf_invalid_context"
@@ -17173,7 +18067,7 @@ crc32_table:
 	.string	"MIGRATE_TYPES"
 .LASF25:
 	.string	"__kernel_loff_t"
-.LASF1512:
+.LASF1511:
 	.string	"crc_build_table32"
 .LASF180:
 	.string	"arm64_ftr_reg_ctrel0"
@@ -17181,7 +18075,7 @@ crc32_table:
 	.string	"PIDTYPE_TGID"
 .LASF1159:
 	.string	"kobj"
-.LASF1493:
+.LASF1492:
 	.string	"templist"
 .LASF165:
 	.string	"FTR_HIGHER_SAFE"
@@ -17303,7 +18197,7 @@ crc32_table:
 	.string	"NR_KMALLOC_TYPES"
 .LASF1291:
 	.string	"disable_depth"
-.LASF1529:
+.LASF1528:
 	.string	"strncmp"
 .LASF865:
 	.string	"KOBJ_NS_TYPES"
@@ -17335,7 +18229,7 @@ crc32_table:
 	.string	"cpu_bit_bitmap"
 .LASF1077:
 	.string	"timeout"
-.LASF1528:
+.LASF1527:
 	.string	"kfree"
 .LASF585:
 	.string	"NR_FILE_MAPPED"
@@ -17363,7 +18257,7 @@ crc32_table:
 	.string	"stat_threshold"
 .LASF1116:
 	.string	"rt_mutex_waiter"
-.LASF1535:
+.LASF1534:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF701:
 	.string	"secondary_data"
@@ -17423,7 +18317,7 @@ crc32_table:
 	.string	"wake_irq"
 .LASF823:
 	.string	"open"
-.LASF1509:
+.LASF1508:
 	.string	"a_size"
 .LASF505:
 	.string	"radix_tree_root"
@@ -17449,7 +18343,7 @@ crc32_table:
 	.string	"WF_TYPE_GRAY16"
 .LASF453:
 	.string	"android_kabi_reserved8"
-.LASF1531:
+.LASF1530:
 	.string	"memcpy"
 .LASF269:
 	.string	"debug"
@@ -17469,7 +18363,7 @@ crc32_table:
 	.string	"attribute_group"
 .LASF104:
 	.string	"panic_timeout"
-.LASF1498:
+.LASF1497:
 	.string	"__UNIQUE_ID___x55"
 .LASF789:
 	.string	"bitmap"
@@ -17481,9 +18375,9 @@ crc32_table:
 	.string	"dl_density"
 .LASF1260:
 	.string	"RPM_REQ_RESUME"
-.LASF1534:
+.LASF1533:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform.c"
-.LASF1536:
+.LASF1535:
 	.string	"frozen"
 .LASF190:
 	.string	"_text"
@@ -17499,7 +18393,7 @@ crc32_table:
 	.string	"mutex"
 .LASF824:
 	.string	"size"
-.LASF1520:
+.LASF1519:
 	.string	"kmalloc_index"
 .LASF1113:
 	.string	"files_struct"
@@ -17541,7 +18435,7 @@ crc32_table:
 	.string	"io_context"
 .LASF700:
 	.string	"__smp_cross_call"
-.LASF1491:
+.LASF1490:
 	.string	"get_wf_buf"
 .LASF1067:
 	.string	"exec_start"
@@ -17677,7 +18571,7 @@ crc32_table:
 	.string	"init_user_ns"
 .LASF1100:
 	.string	"perf_event_task_context"
-.LASF1502:
+.LASF1501:
 	.string	"waveform_file"
 .LASF1387:
 	.string	"segment_boundary_mask"
@@ -17699,7 +18593,7 @@ crc32_table:
 	.string	"archdata"
 .LASF27:
 	.string	"__kernel_clock_t"
-.LASF1518:
+.LASF1517:
 	.string	"kmalloc_large"
 .LASF1242:
 	.string	"iommu_group"
@@ -17717,7 +18611,7 @@ crc32_table:
 	.string	"__s32"
 .LASF433:
 	.string	"nr_dirtied_pause"
-.LASF1508:
+.LASF1507:
 	.string	"a_data"
 .LASF218:
 	.string	"__start_once"
@@ -17747,9 +18641,9 @@ crc32_table:
 	.string	"sigpending"
 .LASF1338:
 	.string	"begin"
-.LASF1497:
+.LASF1496:
 	.string	"__UNIQUE_ID___y54"
-.LASF1499:
+.LASF1498:
 	.string	"__UNIQUE_ID___y56"
 .LASF1374:
 	.string	"acpi_device_id"
@@ -17813,7 +18707,7 @@ crc32_table:
 	.string	"autosuspend_delay"
 .LASF1303:
 	.string	"request"
-.LASF1490:
+.LASF1536:
 	.string	"decode_wf_data"
 .LASF759:
 	.string	"contig_page_data"
@@ -17873,7 +18767,7 @@ crc32_table:
 	.string	"__cpu_present_mask"
 .LASF1184:
 	.string	"pm_power_off_prepare"
-.LASF1494:
+.LASF1493:
 	.string	"wf_offset"
 .LASF1160:
 	.string	"uevent_ops"
@@ -17927,7 +18821,7 @@ crc32_table:
 	.string	"system_highpri_wq"
 .LASF1016:
 	.string	"run_delay"
-.LASF1506:
+.LASF1505:
 	.string	"check_wf_format"
 .LASF1110:
 	.string	"rcu_node"
@@ -17947,7 +18841,7 @@ crc32_table:
 	.string	"drv_groups"
 .LASF112:
 	.string	"panic_cpu"
-.LASF1532:
+.LASF1531:
 	.string	"memset"
 .LASF1401:
 	.string	"irq_domain"
@@ -18035,7 +18929,7 @@ crc32_table:
 	.string	"HRTIMER_RESTART"
 .LASF1432:
 	.string	"rkf_waveform_type"
-.LASF1516:
+.LASF1515:
 	.string	"kzalloc"
 .LASF1265:
 	.string	"dev_pm_info"
@@ -18163,7 +19057,7 @@ crc32_table:
 	.string	"N_POSSIBLE"
 .LASF96:
 	.string	"kmsg_fops"
-.LASF1503:
+.LASF1502:
 	.string	"check_wf_crc"
 .LASF441:
 	.string	"memcg_oom_order"
@@ -18235,7 +19129,7 @@ crc32_table:
 	.string	"last_switch_count"
 .LASF906:
 	.string	"cpu_base"
-.LASF1522:
+.LASF1521:
 	.string	"get_order"
 .LASF126:
 	.string	"module"
@@ -18251,7 +19145,7 @@ crc32_table:
 	.string	"pstate_check_t"
 .LASF952:
 	.string	"_sys_private"
-.LASF1511:
+.LASF1510:
 	.string	"decode_wf_auto"
 .LASF460:
 	.string	"tz_dsttime"
@@ -18265,7 +19159,7 @@ crc32_table:
 	.string	"util_est"
 .LASF268:
 	.string	"fault_code"
-.LASF1527:
+.LASF1526:
 	.string	"__kmalloc"
 .LASF88:
 	.string	"linux_banner"
@@ -18643,11 +19537,11 @@ crc32_table:
 	.string	"tick_usec"
 .LASF1298:
 	.string	"irq_safe"
-.LASF1496:
+.LASF1495:
 	.string	"__UNIQUE_ID___x53"
 .LASF980:
 	.string	"_sifields"
-.LASF1526:
+.LASF1525:
 	.string	"word"
 .LASF35:
 	.string	"clockid_t"
@@ -18755,7 +19649,7 @@ crc32_table:
 	.string	"wakeup_source"
 .LASF1200:
 	.string	"thaw_early"
-.LASF1523:
+.LASF1522:
 	.string	"__ilog2_u64"
 .LASF299:
 	.string	"boost"
@@ -18809,7 +19703,7 @@ crc32_table:
 	.string	"system_long_wq"
 .LASF428:
 	.string	"tlb_ubc"
-.LASF1515:
+.LASF1514:
 	.string	"n_data"
 .LASF1071:
 	.string	"statistics"
@@ -18889,7 +19783,7 @@ crc32_table:
 	.string	"device_node"
 .LASF728:
 	.string	"ktime_t"
-.LASF1530:
+.LASF1529:
 	.string	"printk"
 .LASF737:
 	.string	"data"
@@ -18931,7 +19825,7 @@ crc32_table:
 	.string	"SYSTEM_POWER_OFF"
 .LASF480:
 	.string	"poll"
-.LASF1507:
+.LASF1506:
 	.string	"crc_32"
 .LASF144:
 	.string	"compat_elf_hwcap"
@@ -19063,7 +19957,7 @@ crc32_table:
 	.string	"load_avg"
 .LASF528:
 	.string	"FDPIC_FUNCPTRS"
-.LASF1492:
+.LASF1491:
 	.string	"waveform"
 .LASF774:
 	.string	"thread_id"
@@ -19093,7 +19987,7 @@ crc32_table:
 	.string	"__nosave_begin"
 .LASF963:
 	.string	"_addr_pkey"
-.LASF1533:
+.LASF1532:
 	.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"
@@ -19145,7 +20039,7 @@ crc32_table:
 	.string	"syscore"
 .LASF871:
 	.string	"drop_ns"
-.LASF1513:
+.LASF1512:
 	.string	"a_poly"
 .LASF260:
 	.string	"tp2_value"
@@ -19173,7 +20067,7 @@ crc32_table:
 	.string	"bio_list"
 .LASF1380:
 	.string	"dev_release"
-.LASF1514:
+.LASF1513:
 	.string	"crc_table"
 .LASF842:
 	.string	"kernfs_syscall_ops"
@@ -19271,7 +20165,7 @@ crc32_table:
 	.string	"refaults"
 .LASF998:
 	.string	"wchar"
-.LASF1504:
+.LASF1503:
 	.string	"crccheck"
 .LASF240:
 	.string	"__inittext_begin"
@@ -19299,7 +20193,7 @@ crc32_table:
 	.string	"sched_statistics"
 .LASF702:
 	.string	"task"
-.LASF1495:
+.LASF1494:
 	.string	"get_wf_level"
 .LASF576:
 	.string	"NR_SLAB_RECLAIMABLE"
@@ -19353,7 +20247,7 @@ crc32_table:
 	.string	"class_release"
 .LASF1008:
 	.string	"RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE_BIT"
-.LASF1510:
+.LASF1509:
 	.string	"n_accum"
 .LASF987:
 	.string	"MM_SWAPENTS"
@@ -19423,7 +20317,7 @@ crc32_table:
 	.string	"uevent_helper"
 .LASF1421:
 	.string	"WF_TYPE_AUTO"
-.LASF1517:
+.LASF1516:
 	.string	"kmalloc"
 .LASF992:
 	.string	"events"
@@ -19431,7 +20325,7 @@ crc32_table:
 	.string	"user_mask"
 .LASF113:
 	.string	"root_mountflags"
-.LASF1519:
+.LASF1518:
 	.string	"order"
 .LASF3:
 	.string	"unsigned int"

commit c953ed2a09490e254e4f18752df82ed82891e2f3
Author: Elaine Zhang <zhangqing@rock-chips.com>
Date:   Mon Mar 15 16:56:07 2021 +0800

    UPSTREAM: clk: rockchip: support more core div setting
    
    Use arrays to support more core independent div settings.
    A55 supports each core to work at different frequencies, and each core
    has an independent divider control.
    
    Change-Id: I40dde15e25843090160bbc32d2de8e2cddffc96e
    Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
    Reviewed-by: Kever Yang <kever.yang@rock-chips.com>
    Acked-by: Stephen Boyd <sboyd@kernel.org>
    Link: https://lore.kernel.org/r/20210315085608.16010-4-zhangqing@rock-chips.com
    Signed-off-by: Heiko Stuebner <heiko@sntech.de>
    (cherry picked from commit a3561e77cf3ca0937227ba13744d84fc46e5eb4b)

diff --git a/drivers/clk/rockchip/clk-cpu.c b/drivers/clk/rockchip/clk-cpu.c
index 94e3b4ca7132..12ff25a6db27 100644
--- a/drivers/clk/rockchip/clk-cpu.c
+++ b/drivers/clk/rockchip/clk-cpu.c
@@ -92,10 +92,10 @@ static unsigned long rockchip_cpuclk_recalc_rate(struct clk_hw *hw,
 {
 	struct rockchip_cpuclk *cpuclk = to_rockchip_cpuclk_hw(hw);
 	const struct rockchip_cpuclk_reg_data *reg_data = cpuclk->reg_data;
-	u32 clksel0 = readl_relaxed(cpuclk->reg_base + reg_data->core_reg);
+	u32 clksel0 = readl_relaxed(cpuclk->reg_base + reg_data->core_reg[0]);
 
-	clksel0 >>= reg_data->div_core_shift;
-	clksel0 &= reg_data->div_core_mask;
+	clksel0 >>= reg_data->div_core_shift[0];
+	clksel0 &= reg_data->div_core_mask[0];
 	return parent_rate / (clksel0 + 1);
 }
 
@@ -164,6 +164,7 @@ static int rockchip_cpuclk_pre_rate_change(struct rockchip_cpuclk *cpuclk,
 	const struct rockchip_cpuclk_rate_table *rate;
 	unsigned long alt_prate, alt_div;
 	unsigned long flags;
+	int i = 0;
 
 	/* check validity of the new rate */
 	rate = rockchip_get_cpuclk_settings(cpuclk, ndata->new_rate);
@@ -188,40 +189,29 @@ static int rockchip_cpuclk_pre_rate_change(struct rockchip_cpuclk *cpuclk,
 	if (alt_prate > ndata->old_rate) {
 		/* calculate dividers */
 		alt_div =  DIV_ROUND_UP(alt_prate, ndata->old_rate) - 1;
-		if (alt_div > reg_data->div_core_mask) {
+		if (alt_div > reg_data->div_core_mask[0]) {
 			pr_warn("%s: limiting alt-divider %lu to %d\n",
-				__func__, alt_div, reg_data->div_core_mask);
-			alt_div = reg_data->div_core_mask;
+				__func__, alt_div, reg_data->div_core_mask[0]);
+			alt_div = reg_data->div_core_mask[0];
 		}
 
 		pr_debug("%s: setting div %lu as alt-rate %lu > old-rate %lu\n",
 			 __func__, alt_div, alt_prate, ndata->old_rate);
 
-		/* add dividers */
-		writel(HIWORD_UPDATE(alt_div, reg_data->div_core_mask,
-				     reg_data->div_core_shift),
-		       cpuclk->reg_base + reg_data->core_reg);
-		if (reg_data->core1_reg)
-			writel(HIWORD_UPDATE(alt_div, reg_data->div_core1_mask,
-					     reg_data->div_core1_shift),
-			       cpuclk->reg_base + reg_data->core1_reg);
-		if (reg_data->core2_reg)
-			writel(HIWORD_UPDATE(alt_div, reg_data->div_core2_mask,
-					     reg_data->div_core2_shift),
-			       cpuclk->reg_base + reg_data->core2_reg);
-		if (reg_data->core3_reg)
-			writel(HIWORD_UPDATE(alt_div, reg_data->div_core3_mask,
-					     reg_data->div_core3_shift),
-			       cpuclk->reg_base + reg_data->core3_reg);
-
+		for (i = 0; i < reg_data->num_cores; i++) {
+			writel(HIWORD_UPDATE(alt_div, reg_data->div_core_mask[i],
+					     reg_data->div_core_shift[i]),
+			       cpuclk->reg_base + reg_data->core_reg[i]);
+		}
 	}
+
 	rockchip_boost_add_core_div(cpuclk->pll_hw, alt_prate);
 
 	/* select alternate parent */
 	writel(HIWORD_UPDATE(reg_data->mux_core_alt,
 			     reg_data->mux_core_mask,
 			     reg_data->mux_core_shift),
-	       cpuclk->reg_base + reg_data->core_reg);
+	       cpuclk->reg_base + reg_data->core_reg[0]);
 
 	rockchip_cpuclk_set_pre_muxs(cpuclk, rate);
 
@@ -235,6 +225,7 @@ static int rockchip_cpuclk_post_rate_change(struct rockchip_cpuclk *cpuclk,
 	const struct rockchip_cpuclk_reg_data *reg_data = cpuclk->reg_data;
 	const struct rockchip_cpuclk_rate_table *rate;
 	unsigned long flags;
+	int i = 0;
 
 	rate = rockchip_get_cpuclk_settings(cpuclk, ndata->new_rate);
 	if (!rate) {
@@ -252,26 +243,16 @@ static int rockchip_cpuclk_post_rate_change(struct rockchip_cpuclk *cpuclk,
 	writel(HIWORD_UPDATE(reg_data->mux_core_main,
 			     reg_data->mux_core_mask,
 			     reg_data->mux_core_shift),
-	       cpuclk->reg_base + reg_data->core_reg);
+	       cpuclk->reg_base + reg_data->core_reg[0]);
 
 	rockchip_cpuclk_set_post_muxs(cpuclk, rate);
 
 	/* remove dividers */
-	writel(HIWORD_UPDATE(0, reg_data->div_core_mask,
-			     reg_data->div_core_shift),
-	       cpuclk->reg_base + reg_data->core_reg);
-	if (reg_data->core1_reg)
-		writel(HIWORD_UPDATE(0, reg_data->div_core1_mask,
-				     reg_data->div_core1_shift),
-		       cpuclk->reg_base + reg_data->core1_reg);
-	if (reg_data->core2_reg)
-		writel(HIWORD_UPDATE(0, reg_data->div_core2_mask,
-				     reg_data->div_core2_shift),
-		       cpuclk->reg_base + reg_data->core2_reg);
-	if (reg_data->core3_reg)
-		writel(HIWORD_UPDATE(0, reg_data->div_core3_mask,
-				     reg_data->div_core3_shift),
-		       cpuclk->reg_base + reg_data->core3_reg);
+	for (i = 0; i < reg_data->num_cores; i++) {
+		writel(HIWORD_UPDATE(0, reg_data->div_core_mask[i],
+				     reg_data->div_core_shift[i]),
+		       cpuclk->reg_base + reg_data->core_reg[i]);
+	}
 
 	if (ndata->old_rate > ndata->new_rate)
 		rockchip_cpuclk_set_dividers(cpuclk, rate);
diff --git a/drivers/clk/rockchip/clk-px30.c b/drivers/clk/rockchip/clk-px30.c
index 28b197fc7cce..c2f33e3d7511 100644
--- a/drivers/clk/rockchip/clk-px30.c
+++ b/drivers/clk/rockchip/clk-px30.c
@@ -133,9 +133,10 @@ static struct rockchip_cpuclk_rate_table px30_cpuclk_rates[] __initdata = {
 };
 
 static const struct rockchip_cpuclk_reg_data px30_cpuclk_data = {
-	.core_reg = PX30_CLKSEL_CON(0),
-	.div_core_shift = 0,
-	.div_core_mask = 0xf,
+	.core_reg[0] = PX30_CLKSEL_CON(0),
+	.div_core_shift[0] = 0,
+	.div_core_mask[0] = 0xf,
+	.num_cores = 1,
 	.mux_core_alt = 1,
 	.mux_core_main = 0,
 	.mux_core_shift = 7,
diff --git a/drivers/clk/rockchip/clk-rk1808.c b/drivers/clk/rockchip/clk-rk1808.c
index 30ea6f332ed1..63ba8c2b1627 100644
--- a/drivers/clk/rockchip/clk-rk1808.c
+++ b/drivers/clk/rockchip/clk-rk1808.c
@@ -116,9 +116,10 @@ static struct rockchip_cpuclk_rate_table rk1808_cpuclk_rates[] __initdata = {
 };
 
 static const struct rockchip_cpuclk_reg_data rk1808_cpuclk_data = {
-	.core_reg = RK1808_CLKSEL_CON(0),
-	.div_core_shift = 0,
-	.div_core_mask = 0xf,
+	.core_reg[0] = RK1808_CLKSEL_CON(0),
+	.div_core_shift[0] = 0,
+	.div_core_mask[0] = 0xf,
+	.num_cores = 1,
 	.mux_core_alt = 2,
 	.mux_core_main = 0,
 	.mux_core_shift = 6,
diff --git a/drivers/clk/rockchip/clk-rk3036.c b/drivers/clk/rockchip/clk-rk3036.c
index 31c9149e03c7..a28bffa1cf56 100644
--- a/drivers/clk/rockchip/clk-rk3036.c
+++ b/drivers/clk/rockchip/clk-rk3036.c
@@ -116,9 +116,10 @@ static struct rockchip_cpuclk_rate_table rk3036_cpuclk_rates[] __initdata = {
 };
 
 static const struct rockchip_cpuclk_reg_data rk3036_cpuclk_data = {
-	.core_reg = RK2928_CLKSEL_CON(0),
-	.div_core_shift = 0,
-	.div_core_mask = 0x1f,
+	.core_reg[0] = RK2928_CLKSEL_CON(0),
+	.div_core_shift[0] = 0,
+	.div_core_mask[0] = 0x1f,
+	.num_cores = 1,
 	.mux_core_alt = 1,
 	.mux_core_main = 0,
 	.mux_core_shift = 7,
diff --git a/drivers/clk/rockchip/clk-rk3128.c b/drivers/clk/rockchip/clk-rk3128.c
index b56d0def301a..89e2a42707bf 100644
--- a/drivers/clk/rockchip/clk-rk3128.c
+++ b/drivers/clk/rockchip/clk-rk3128.c
@@ -129,9 +129,10 @@ static struct rockchip_cpuclk_rate_table rk3128_cpuclk_rates[] __initdata = {
 };
 
 static const struct rockchip_cpuclk_reg_data rk3128_cpuclk_data = {
-	.core_reg = RK2928_CLKSEL_CON(0),
-	.div_core_shift = 0,
-	.div_core_mask = 0x1f,
+	.core_reg[0] = RK2928_CLKSEL_CON(0),
+	.div_core_shift[0] = 0,
+	.div_core_mask[0] = 0x1f,
+	.num_cores = 1,
 	.mux_core_alt = 1,
 	.mux_core_main = 0,
 	.mux_core_shift = 7,
diff --git a/drivers/clk/rockchip/clk-rk3188.c b/drivers/clk/rockchip/clk-rk3188.c
index 9074bc8460eb..872aed38fecd 100644
--- a/drivers/clk/rockchip/clk-rk3188.c
+++ b/drivers/clk/rockchip/clk-rk3188.c
@@ -157,9 +157,10 @@ static struct rockchip_cpuclk_rate_table rk3066_cpuclk_rates[] __initdata = {
 };
 
 static const struct rockchip_cpuclk_reg_data rk3066_cpuclk_data = {
-	.core_reg = RK2928_CLKSEL_CON(0),
-	.div_core_shift = 0,
-	.div_core_mask = 0x1f,
+	.core_reg[0] = RK2928_CLKSEL_CON(0),
+	.div_core_shift[0] = 0,
+	.div_core_mask[0] = 0x1f,
+	.num_cores = 1,
 	.mux_core_alt = 1,
 	.mux_core_main = 0,
 	.mux_core_shift = 8,
@@ -196,9 +197,10 @@ static struct rockchip_cpuclk_rate_table rk3188_cpuclk_rates[] __initdata = {
 };
 
 static const struct rockchip_cpuclk_reg_data rk3188_cpuclk_data = {
-	.core_reg = RK2928_CLKSEL_CON(0),
-	.div_core_shift = 9,
-	.div_core_mask = 0x1f,
+	.core_reg[0] = RK2928_CLKSEL_CON(0),
+	.div_core_shift[0] = 9,
+	.div_core_mask[0] = 0x1f,
+	.num_cores = 1,
 	.mux_core_alt = 1,
 	.mux_core_main = 0,
 	.mux_core_shift = 8,
diff --git a/drivers/clk/rockchip/clk-rk3228.c b/drivers/clk/rockchip/clk-rk3228.c
index 7b046d6a6a26..d908c8092aaf 100644
--- a/drivers/clk/rockchip/clk-rk3228.c
+++ b/drivers/clk/rockchip/clk-rk3228.c
@@ -131,9 +131,10 @@ static struct rockchip_cpuclk_rate_table rk3228_cpuclk_rates[] __initdata = {
 };
 
 static const struct rockchip_cpuclk_reg_data rk3228_cpuclk_data = {
-	.core_reg = RK2928_CLKSEL_CON(0),
-	.div_core_shift = 0,
-	.div_core_mask = 0x1f,
+	.core_reg[0] = RK2928_CLKSEL_CON(0),
+	.div_core_shift[0] = 0,
+	.div_core_mask[0] = 0x1f,
+	.num_cores = 1,
 	.mux_core_alt = 1,
 	.mux_core_main = 0,
 	.mux_core_shift = 6,
diff --git a/drivers/clk/rockchip/clk-rk3288.c b/drivers/clk/rockchip/clk-rk3288.c
index 96025b3dd2c3..e71d71039d65 100644
--- a/drivers/clk/rockchip/clk-rk3288.c
+++ b/drivers/clk/rockchip/clk-rk3288.c
@@ -167,9 +167,10 @@ static struct rockchip_cpuclk_rate_table rk3288_cpuclk_rates[] __initdata = {
 };
 
 static const struct rockchip_cpuclk_reg_data rk3288_cpuclk_data = {
-	.core_reg = RK3288_CLKSEL_CON(0),
-	.div_core_shift = 8,
-	.div_core_mask = 0x1f,
+	.core_reg[0] = RK3288_CLKSEL_CON(0),
+	.div_core_shift[0] = 8,
+	.div_core_mask[0] = 0x1f,
+	.num_cores = 1,
 	.mux_core_alt = 1,
 	.mux_core_main = 0,
 	.mux_core_shift = 15,
diff --git a/drivers/clk/rockchip/clk-rk3308.c b/drivers/clk/rockchip/clk-rk3308.c
index c6bb46fbc2ae..30687d412a29 100644
--- a/drivers/clk/rockchip/clk-rk3308.c
+++ b/drivers/clk/rockchip/clk-rk3308.c
@@ -124,9 +124,10 @@ static struct rockchip_cpuclk_rate_table rk3308_cpuclk_rates[] __initdata = {
 };
 
 static const struct rockchip_cpuclk_reg_data rk3308_cpuclk_data = {
-	.core_reg = RK3308_CLKSEL_CON(0),
-	.div_core_shift = 0,
-	.div_core_mask = 0xf,
+	.core_reg[0] = RK3308_CLKSEL_CON(0),
+	.div_core_shift[0] = 0,
+	.div_core_mask[0] = 0xf,
+	.num_cores = 1,
 	.mux_core_alt = 1,
 	.mux_core_main = 0,
 	.mux_core_shift = 6,
diff --git a/drivers/clk/rockchip/clk-rk3328.c b/drivers/clk/rockchip/clk-rk3328.c
index 670736f30374..b6591e54d525 100644
--- a/drivers/clk/rockchip/clk-rk3328.c
+++ b/drivers/clk/rockchip/clk-rk3328.c
@@ -141,9 +141,10 @@ static struct rockchip_cpuclk_rate_table rk3328_cpuclk_rates[] __initdata = {
 };
 
 static const struct rockchip_cpuclk_reg_data rk3328_cpuclk_data = {
-	.core_reg = RK3328_CLKSEL_CON(0),
-	.div_core_shift = 0,
-	.div_core_mask = 0x1f,
+	.core_reg[0] = RK3328_CLKSEL_CON(0),
+	.div_core_shift[0] = 0,
+	.div_core_mask[0] = 0x1f,
+	.num_cores = 1,
 	.mux_core_alt = 1,
 	.mux_core_main = 3,
 	.mux_core_shift = 6,
diff --git a/drivers/clk/rockchip/clk-rk3368.c b/drivers/clk/rockchip/clk-rk3368.c
index 91b66daec134..009abde551aa 100644
--- a/drivers/clk/rockchip/clk-rk3368.c
+++ b/drivers/clk/rockchip/clk-rk3368.c
@@ -186,9 +186,10 @@ static struct clk_div_table div_ddrphy_t[] = {
 #define IFLAGS ROCKCHIP_INVERTER_HIWORD_MASK
 
 static const struct rockchip_cpuclk_reg_data rk3368_cpuclkb_data = {
-	.core_reg = RK3368_CLKSEL_CON(0),
-	.div_core_shift = 0,
-	.div_core_mask = 0x1f,
+	.core_reg[0] = RK3368_CLKSEL_CON(0),
+	.div_core_shift[0] = 0,
+	.div_core_mask[0] = 0x1f,
+	.num_cores = 1,
 	.mux_core_alt = 1,
 	.mux_core_main = 0,
 	.mux_core_shift = 7,
@@ -196,11 +197,12 @@ static const struct rockchip_cpuclk_reg_data rk3368_cpuclkb_data = {
 };
 
 static const struct rockchip_cpuclk_reg_data rk3368_cpuclkl_data = {
-	.core_reg = RK3368_CLKSEL_CON(2),
-	.div_core_shift = 0,
+	.core_reg[0] = RK3368_CLKSEL_CON(2),
+	.div_core_shift[0] = 0,
 	.mux_core_alt = 1,
+	.num_cores = 1,
 	.mux_core_main = 0,
-	.div_core_mask = 0x1f,
+	.div_core_mask[0] = 0x1f,
 	.mux_core_shift = 7,
 	.mux_core_mask = 0x1,
 };
diff --git a/drivers/clk/rockchip/clk-rk3399.c b/drivers/clk/rockchip/clk-rk3399.c
index e900d132a39d..a14ece702f31 100644
--- a/drivers/clk/rockchip/clk-rk3399.c
+++ b/drivers/clk/rockchip/clk-rk3399.c
@@ -391,9 +391,10 @@ static struct rockchip_clk_branch rk3399_pmuclk_wifi_fracmux __initdata =
 			RK3399_PMU_CLKSEL_CON(1), 14, 1, MFLAGS);
 
 static const struct rockchip_cpuclk_reg_data rk3399_cpuclkl_data = {
-	.core_reg = RK3399_CLKSEL_CON(0),
-	.div_core_shift = 0,
-	.div_core_mask = 0x1f,
+	.core_reg[0] = RK3399_CLKSEL_CON(0),
+	.div_core_shift[0] = 0,
+	.div_core_mask[0] = 0x1f,
+	.num_cores = 1,
 	.mux_core_alt = 3,
 	.mux_core_main = 0,
 	.mux_core_shift = 6,
@@ -401,9 +402,10 @@ static const struct rockchip_cpuclk_reg_data rk3399_cpuclkl_data = {
 };
 
 static const struct rockchip_cpuclk_reg_data rk3399_cpuclkb_data = {
-	.core_reg = RK3399_CLKSEL_CON(2),
-	.div_core_shift = 0,
-	.div_core_mask = 0x1f,
+	.core_reg[0] = RK3399_CLKSEL_CON(2),
+	.div_core_shift[0] = 0,
+	.div_core_mask[0] = 0x1f,
+	.num_cores = 1,
 	.mux_core_alt = 3,
 	.mux_core_main = 1,
 	.mux_core_shift = 6,
diff --git a/drivers/clk/rockchip/clk-rk3568.c b/drivers/clk/rockchip/clk-rk3568.c
index df1414206366..a28046a2b8b7 100644
--- a/drivers/clk/rockchip/clk-rk3568.c
+++ b/drivers/clk/rockchip/clk-rk3568.c
@@ -221,18 +221,19 @@ static struct rockchip_cpuclk_rate_table rk3568_cpuclk_rates[] __initdata = {
 };
 
 static const struct rockchip_cpuclk_reg_data rk3568_cpuclk_data = {
-	.core_reg = RK3568_CLKSEL_CON(0),
-	.div_core_shift = 0,
-	.div_core_mask = 0x1f,
-	.core1_reg = RK3568_CLKSEL_CON(0),
-	.div_core1_shift = 8,
-	.div_core1_mask = 0x1f,
-	.core2_reg = RK3568_CLKSEL_CON(1),
-	.div_core2_shift = 0,
-	.div_core2_mask = 0x1f,
-	.core3_reg = RK3568_CLKSEL_CON(1),
-	.div_core3_shift = 8,
-	.div_core3_mask = 0x1f,
+	.core_reg[0] = RK3568_CLKSEL_CON(0),
+	.div_core_shift[0] = 0,
+	.div_core_mask[0] = 0x1f,
+	.core_reg[1] = RK3568_CLKSEL_CON(0),
+	.div_core_shift[1] = 8,
+	.div_core_mask[1] = 0x1f,
+	.core_reg[2] = RK3568_CLKSEL_CON(1),
+	.div_core_shift[2] = 0,
+	.div_core_mask[2] = 0x1f,
+	.core_reg[3] = RK3568_CLKSEL_CON(1),
+	.div_core_shift[3] = 8,
+	.div_core_mask[3] = 0x1f,
+	.num_cores = 4,
 	.mux_core_alt = 1,
 	.mux_core_main = 0,
 	.mux_core_shift = 6,
diff --git a/drivers/clk/rockchip/clk-rv1108.c b/drivers/clk/rockchip/clk-rv1108.c
index 8d87c9c85ed5..59de09452a87 100644
--- a/drivers/clk/rockchip/clk-rv1108.c
+++ b/drivers/clk/rockchip/clk-rv1108.c
@@ -116,9 +116,10 @@ static struct rockchip_cpuclk_rate_table rv1108_cpuclk_rates[] __initdata = {
 };
 
 static const struct rockchip_cpuclk_reg_data rv1108_cpuclk_data = {
-	.core_reg = RV1108_CLKSEL_CON(0),
-	.div_core_shift = 0,
-	.div_core_mask = 0x1f,
+	.core_reg[0] = RV1108_CLKSEL_CON(0),
+	.div_core_shift[0] = 0,
+	.div_core_mask[0] = 0x1f,
+	.num_cores = 1,
 	.mux_core_alt = 1,
 	.mux_core_main = 0,
 	.mux_core_shift = 8,
diff --git a/drivers/clk/rockchip/clk-rv1126.c b/drivers/clk/rockchip/clk-rv1126.c
index 1926ff2f4aac..05dea9fbd1f0 100644
--- a/drivers/clk/rockchip/clk-rv1126.c
+++ b/drivers/clk/rockchip/clk-rv1126.c
@@ -137,9 +137,10 @@ static struct rockchip_cpuclk_rate_table rv1126_cpuclk_rates[] __initdata = {
 };
 
 static const struct rockchip_cpuclk_reg_data rv1126_cpuclk_data = {
-	.core_reg = RV1126_CLKSEL_CON(0),
-	.div_core_shift = 0,
-	.div_core_mask = 0x1f,
+	.core_reg[0] = RV1126_CLKSEL_CON(0),
+	.div_core_shift[0] = 0,
+	.div_core_mask[0] = 0x1f,
+	.num_cores = 1,
 	.mux_core_alt = 0,
 	.mux_core_main = 2,
 	.mux_core_shift = 6,
diff --git a/drivers/clk/rockchip/clk.h b/drivers/clk/rockchip/clk.h
index 3e9faad7972f..fb47672e7643 100644
--- a/drivers/clk/rockchip/clk.h
+++ b/drivers/clk/rockchip/clk.h
@@ -427,6 +427,7 @@ struct rockchip_cpuclk_clksel {
 };
 
 #define ROCKCHIP_CPUCLK_NUM_DIVIDERS	5
+#define ROCKCHIP_CPUCLK_MAX_CORES	4
 struct rockchip_cpuclk_rate_table {
 	unsigned long prate;
 	struct rockchip_cpuclk_clksel divs[ROCKCHIP_CPUCLK_NUM_DIVIDERS];
@@ -436,37 +437,24 @@ struct rockchip_cpuclk_rate_table {
 
 /**
  * struct rockchip_cpuclk_reg_data - register offsets and masks of the cpuclock
- * @core_reg:		register offset of the core settings register
- * @div_core_shift:	core divider offset used to divide the pll value
- * @div_core_mask:	core divider mask
- * @div_core1_shift:	core1 divider offset used to divide the pll value
- * @div_core1_mask:	core1 divider mask
- * @div_core2_shift:	core2 divider offset used to divide the pll value
- * @div_core2_mask:	core2 divider mask
- * @div_core3_shift:	core3 divider offset used to divide the pll value
- * @div_core3_mask:	core3 divider mask
- * @mux_core_alt:	mux value to select alternate parent
+ * @core_reg[]:	register offset of the cores setting register
+ * @div_core_shift[]:	cores divider offset used to divide the pll value
+ * @div_core_mask[]:	cores divider mask
+ * @num_cores:	number of cpu cores
+ * @mux_core_alt:       mux value to select alternate parent
  * @mux_core_main:	mux value to select main parent of core
  * @mux_core_shift:	offset of the core multiplexer
  * @mux_core_mask:	core multiplexer mask
  */
 struct rockchip_cpuclk_reg_data {
-	int		core_reg;
-	u8		div_core_shift;
-	u32		div_core_mask;
-	int		core1_reg;
-	u8		div_core1_shift;
-	u32		div_core1_mask;
-	int		core2_reg;
-	u8		div_core2_shift;
-	u32		div_core2_mask;
-	int		core3_reg;
-	u8		div_core3_shift;
-	u32		div_core3_mask;
-	u8		mux_core_alt;
-	u8		mux_core_main;
-	u8		mux_core_shift;
-	u32		mux_core_mask;
+	int	core_reg[ROCKCHIP_CPUCLK_MAX_CORES];
+	u8	div_core_shift[ROCKCHIP_CPUCLK_MAX_CORES];
+	u32	div_core_mask[ROCKCHIP_CPUCLK_MAX_CORES];
+	int	num_cores;
+	u8	mux_core_alt;
+	u8	mux_core_main;
+	u8	mux_core_shift;
+	u32	mux_core_mask;
 	const char	*pll_name;
 };
 

commit c655ba882d448c4922c78e8e7ea332a7a8a95276
Author: Ding Wei <leo.ding@rock-chips.com>
Date:   Fri May 7 18:02:02 2021 +0800

    arm64: dts: rockchip: rk3568-nvr: Set parameters for nvr
    
    1. rockchip,disable-auto-freq, means when get/set/reduce freq,
       return directly.
    2. set assigned-clock-rates at hardware running rates, then
       it not need to adjust before running.
    
    Change-Id: I0d7864112bb5ade99e29bcce9824f84e9a58735e
    Signed-off-by: Ding Wei <leo.ding@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi
index a60fa8f0c9d4..fc66945c445d 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi
@@ -348,7 +348,8 @@
 };
 
 &rkvdec {
-	rockchip,default-max-load = <100>;
+	rockchip,disable-auto-freq;
+	assigned-clock-rates = <396000000>, <396000000>, <396000000>, <600000000>;
 	status = "okay";
 };
 

commit d8efa8439ab1b26ad6e82571275d8b0f5ee8e808
Author: Ding Wei <leo.ding@rock-chips.com>
Date:   Fri May 7 17:53:08 2021 +0800

    video: rockchip: mpp: Add property for disable freq set
    
    if property set, then it will skip get/set/reduce freq.
    
    Change-Id: I56f641807327e9e63b8ebc0c91e79ffb19680b1c
    Signed-off-by: Ding Wei <leo.ding@rock-chips.com>

diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c
index 4d42ad53fda7..23cea719f9b4 100644
--- a/drivers/video/rockchip/mpp/mpp_common.c
+++ b/drivers/video/rockchip/mpp/mpp_common.c
@@ -373,7 +373,7 @@ static int mpp_process_task(struct mpp_session *session,
 	task->task_index = atomic_fetch_inc(&mpp->task_index);
 	INIT_DELAYED_WORK(&task->timeout_work, mpp_task_timeout_work);
 
-	if (mpp->hw_ops->get_freq)
+	if (mpp->auto_freq_en && mpp->hw_ops->get_freq)
 		mpp->hw_ops->get_freq(mpp, task);
 
 	/*
@@ -459,7 +459,7 @@ int mpp_dev_reset(struct mpp_dev *mpp)
 	else
 		mpp_set_grf(mpp->grf_info);
 
-	if (mpp->hw_ops->reduce_freq)
+	if (mpp->auto_freq_en && mpp->hw_ops->reduce_freq)
 		mpp->hw_ops->reduce_freq(mpp);
 	/* FIXME lock resource lock of the other devices in combo */
 	mpp_iommu_down_write(mpp->iommu_info);
@@ -522,7 +522,7 @@ static int mpp_task_run(struct mpp_dev *mpp,
 	mpp_debug(DEBUG_TASK_INFO, "pid %d, start hw %s\n",
 		  task->session->pid, dev_name(mpp->dev));
 
-	if (mpp->hw_ops->set_freq)
+	if (mpp->auto_freq_en && mpp->hw_ops->set_freq)
 		mpp->hw_ops->set_freq(mpp, task);
 	/*
 	 * TODO: Lock the reader locker of the device resource lock here,
@@ -1665,6 +1665,8 @@ int mpp_dev_probe(struct mpp_dev *mpp,
 	struct device_node *np = dev->of_node;
 	struct mpp_hw_info *hw_info = mpp->var->hw_info;
 
+	/* Get disable auto frequent flag from dtsi */
+	mpp->auto_freq_en = !device_property_read_bool(dev, "rockchip,disable-auto-freq");
 	/* read link table capacity */
 	ret = of_property_read_u32(np, "rockchip,task-capacity",
 				   &mpp->task_capacity);
@@ -1830,7 +1832,8 @@ irqreturn_t mpp_dev_isr_sched(int irq, void *param)
 	irqreturn_t ret = IRQ_NONE;
 	struct mpp_dev *mpp = param;
 
-	if (mpp->hw_ops->reduce_freq &&
+	if (mpp->auto_freq_en &&
+	    mpp->hw_ops->reduce_freq &&
 	    list_empty(&mpp->queue->pending_list))
 		mpp->hw_ops->reduce_freq(mpp);
 
diff --git a/drivers/video/rockchip/mpp/mpp_common.h b/drivers/video/rockchip/mpp/mpp_common.h
index 325cc39cadd8..68880851a38e 100644
--- a/drivers/video/rockchip/mpp/mpp_common.h
+++ b/drivers/video/rockchip/mpp/mpp_common.h
@@ -283,6 +283,8 @@ struct mpp_dev {
 	struct work_struct work;
 	/* task for work queue */
 	struct workqueue_struct *workq;
+	/* the flag for get/get/reduce freq */
+	bool auto_freq_en;
 	/*
 	 * The task capacity is the task queue length that hardware can accept.
 	 * Default 1 means normal hardware can only accept one task at once.

commit 7d5518f87b19e46f5ce36deb40b9cd6c192f8dfc
Author: Alex Zhao <zzc@rock-chips.com>
Date:   Thu May 6 19:39:26 2021 +0800

    net: rockchip_wlan: cywdhd: update version to 1.363.125.19-20210427
    
    1. Add to support Low Power Solution.
    2. Fix that system can't suspend in Android.
    3. Fix that the SSID list will be shown very slowly when disable/enable wifi in Android.
    
    Signed-off-by: Alex Zhao <zzc@rock-chips.com>
    Change-Id: Ib0f9387e670cb2cb4aca9e2279f76f24dec3aa99

diff --git a/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd.h b/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd.h
index f1e96da2ccee..2d27fbfeca86 100644
--- a/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd.h
+++ b/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd.h
@@ -400,6 +400,9 @@ typedef struct dhd_pub {
 
 	/* Internal dhd items */
 	bool up;		/* Driver up/down (to OS) */
+#ifdef WL_CFG80211
+	spinlock_t up_lock;	/* Synchronization with CFG80211 down */
+#endif
 	bool txoff;		/* Transmit flow-controlled */
 	bool dongle_reset;  /* TRUE = DEVRESET put dongle into reset */
 	enum dhd_bus_state busstate;
diff --git a/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd_linux.c b/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd_linux.c
index e388efabbc41..0779e21d13d2 100644
--- a/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd_linux.c
+++ b/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd_linux.c
@@ -6257,6 +6257,9 @@ static int
 dhd_stop(struct net_device *net)
 {
 	int ifidx = 0;
+#ifdef WL_CFG80211
+	unsigned long flags = 0;
+#endif
 	dhd_info_t *dhd = DHD_DEV_INFO(net);
 	DHD_OS_WAKE_LOCK(&dhd->pub);
 	DHD_PERIM_LOCK(&dhd->pub);
@@ -6280,7 +6283,13 @@ dhd_stop(struct net_device *net)
 
 	/* Set state and stop OS transmissions */
 	netif_stop_queue(net);
+#ifdef WL_CFG80211
+	spin_lock_irqsave(&dhd->pub.up_lock, flags);
 	dhd->pub.up = 0;
+	spin_unlock_irqrestore(&dhd->pub.up_lock, flags);
+#else
+	dhd->pub.up = 0;
+#endif
 
 #ifdef WL_CFG80211
 	if (ifidx == 0) {
@@ -7543,6 +7552,7 @@ dhd_attach(osl_t *osh, struct dhd_bus *bus, uint bus_hdrlen)
 	dhd_state |= DHD_ATTACH_STATE_PROT_ATTACH;
 
 #ifdef WL_CFG80211
+	spin_lock_init(&dhd->pub.up_lock);
 	/* Attach and link in the cfg80211 */
 	if (unlikely(wl_cfg80211_attach(net, &dhd->pub))) {
 		DHD_ERROR(("wl_cfg80211_attach failed\n"));
@@ -11024,6 +11034,9 @@ dhd_wl_host_event(dhd_info_t *dhd, int *ifidx, void *pktdata, uint16 pktlen,
 	wl_event_msg_t *event, void **data)
 {
 	int bcmerror = 0;
+#ifdef WL_CFG80211
+	unsigned long flags = 0;
+#endif /* WL_CFG80211 */
 	ASSERT(dhd != NULL);
 
 #ifdef SHOW_LOGTRACE
@@ -11055,8 +11068,13 @@ dhd_wl_host_event(dhd_info_t *dhd, int *ifidx, void *pktdata, uint16 pktlen,
 #ifdef WL_CFG80211
 	ASSERT(dhd->iflist[*ifidx] != NULL);
 	ASSERT(dhd->iflist[*ifidx]->net != NULL);
-	if (dhd->iflist[*ifidx]->net)
-		wl_cfg80211_event(dhd->iflist[*ifidx]->net, event, *data);
+	if (dhd->iflist[*ifidx]->net) {
+		spin_lock_irqsave(&dhd->pub.up_lock, flags);
+		if (dhd->pub.up) {
+			wl_cfg80211_event(dhd->iflist[*ifidx]->net, event, *data);
+		}
+		spin_unlock_irqrestore(&dhd->pub.up_lock, flags);
+	}
 #endif /* defined(WL_CFG80211) */
 
 	return (bcmerror);
diff --git a/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/wl_cfg80211.c b/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/wl_cfg80211.c
index 0228c2c08fbc..b69ad33e32d4 100644
--- a/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/wl_cfg80211.c
+++ b/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/wl_cfg80211.c
@@ -11265,6 +11265,7 @@ void wl_terminate_event_handler(void)
 
 	if (cfg) {
 		wl_destroy_event_handler(cfg);
+		wl_flush_eq(cfg);
 	}
 }
 
@@ -12673,7 +12674,7 @@ static s32 wl_event_handler(void *data)
 	while (down_interruptible (&tsk->sema) == 0) {
 		SMP_RD_BARRIER_DEPENDS();
 		if (tsk->terminated) {
-			DHD_EVENT_WAKE_LOCK(cfg->pub);
+			DHD_EVENT_WAKE_UNLOCK(cfg->pub);
 			break;
 		}
 		while ((e = wl_deq_event(cfg))) {
@@ -12707,7 +12708,7 @@ static s32 wl_event_handler(void *data)
 fail:
 			wl_put_event(e);
 		}
-		DHD_EVENT_WAKE_LOCK(cfg->pub);
+		DHD_EVENT_WAKE_UNLOCK(cfg->pub);
 	}
 	WL_ERR(("was terminated\n"));
 	complete_and_exit(&tsk->completed, 0);

commit c9825f398afce38c807d634ee7e2f012a570cb28
Author: Wyon Bi <bivvy.bi@rock-chips.com>
Date:   Mon Apr 19 08:52:00 2021 +0800

    pinctrl: rk628: Dynamic allocation of GPIOs
    
    Change-Id: I7b6de3d5a1f0866fc18bd3355c44ecc0862ad800
    Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>

diff --git a/drivers/pinctrl/pinctrl-rk628.c b/drivers/pinctrl/pinctrl-rk628.c
index 75138e788ef7..869b2b1dcc31 100644
--- a/drivers/pinctrl/pinctrl-rk628.c
+++ b/drivers/pinctrl/pinctrl-rk628.c
@@ -71,15 +71,7 @@
 #define GPIO_INTMASK		0x34
 #define GPIO_PORTS_EOI		0x4c
 
-/* easy to map ioctrl reg, 0-159 used by rockchips pinctrl. */
-#define PINBASE 384
 #define BANK_OFFSET 32
-#define GPIO0_PINBASE PINBASE
-#define GPIO1_PINBASE (PINBASE + BANK_OFFSET)
-#define GPIO2_PINBASE (PINBASE + 2 * BANK_OFFSET)
-#define GPIO3_PINBASE (PINBASE + 3 * BANK_OFFSET)
-/*for logic input select inside the chip*/
-#define LOGIC_PINBASE (PINBASE + 4 * BANK_OFFSET)
 
 #define IRQ_CHIP(fname)						\
 	[IRQCHIP_##fname] = {					\
@@ -109,7 +101,6 @@ struct rk628_pin_bank {
 	char *name;
 	u32 reg_base;
 	u32 nr_pins;
-	u32 pin_base;
 	struct device_node *of_node;
 	struct pinctrl_gpio_range grange;
 	struct gpio_chip gpio_chip;
@@ -143,15 +134,15 @@ struct rk628_pctrl_info {
 };
 
 enum rk628_pinmux_option {
-	RK628_PINMUX_FUNC0,
-	RK628_PINMUX_FUNC1,
+	PINMUX_FUNC0,
+	PINMUX_FUNC1,
 };
 
-#define RK628_PINCTRL_GROUP(a, b, c, d) { .name = a, .pins = b, .npins = c, .iomux_base = d}
-#define RK628_PINCTRL_BANK(a, b, c, d) { .name = a, .reg_base = b, .nr_pins = c, .pin_base = d}
+#define PINCTRL_GROUP(a, b, c, d) { .name = a, .pins = b, .npins = c, .iomux_base = d}
+#define PINCTRL_BANK(a, b, c) { .name = a, .reg_base = b, .nr_pins = c}
 
 enum rk628_functions {
-	RK628_MUX_GPIO,
+	MUX_GPIO,
 };
 
 static const char *gpio_groups[] = {
@@ -177,240 +168,240 @@ static struct rk628_pin_function rk628_functions[] = {
 };
 
 enum {
-	RK628_GPIO_HIGH_Z,
-	RK628_GPIO_PULL_UP,
-	RK628_GPIO_PULL_DOWN,
+	GPIO_HIGH_Z,
+	GPIO_PULL_UP,
+	GPIO_PULL_DOWN,
 };
 
 enum {
-	RK628_GPIO0_A0 = GPIO0_PINBASE,
-	RK628_GPIO0_A1,
-	RK628_GPIO0_A2,
-	RK628_GPIO0_A3,
-	RK628_GPIO0_A4,
-	RK628_GPIO0_A5,
-	RK628_GPIO0_A6,
-	RK628_GPIO0_A7,
-	RK628_GPIO0_B0,
-	RK628_GPIO0_B1,
-	RK628_GPIO0_B2,
-	RK628_GPIO0_B3,
-	RK628_GPIO1_A0 = GPIO1_PINBASE,
-	RK628_GPIO1_A1,
-	RK628_GPIO1_A2,
-	RK628_GPIO1_A3,
-	RK628_GPIO1_A4,
-	RK628_GPIO1_A5,
-	RK628_GPIO1_A6,
-	RK628_GPIO1_A7,
-	RK628_GPIO1_B0,
-	RK628_GPIO1_B1,
-	RK628_GPIO1_B2,
-	RK628_GPIO1_B3,
-	RK628_GPIO1_B4,
-	RK628_GPIO1_B5,
-	RK628_GPIO2_A0 = GPIO2_PINBASE,
-	RK628_GPIO2_A1,
-	RK628_GPIO2_A2,
-	RK628_GPIO2_A3,
-	RK628_GPIO2_A4,
-	RK628_GPIO2_A5,
-	RK628_GPIO2_A6,
-	RK628_GPIO2_A7,
-	RK628_GPIO2_B0,
-	RK628_GPIO2_B1,
-	RK628_GPIO2_B2,
-	RK628_GPIO2_B3,
-	RK628_GPIO2_B4,
-	RK628_GPIO2_B5,
-	RK628_GPIO2_B6,
-	RK628_GPIO2_B7,
-	RK628_GPIO2_C0,
-	RK628_GPIO2_C1,
-	RK628_GPIO2_C2,
-	RK628_GPIO2_C3,
-	RK628_GPIO2_C4,
-	RK628_GPIO2_C5,
-	RK628_GPIO2_C6,
-	RK628_GPIO2_C7,
-	RK628_GPIO3_A0 = GPIO3_PINBASE,
-	RK628_GPIO3_A1,
-	RK628_GPIO3_A2,
-	RK628_GPIO3_A3,
-	RK628_GPIO3_A4,
-	RK628_GPIO3_A5,
-	RK628_GPIO3_A6,
-	RK628_GPIO3_A7,
-	RK628_GPIO3_B0,
-	RK628_GPIO3_B1,
-	RK628_GPIO3_B2,
-	RK628_GPIO3_B3,
-	RK628_GPIO3_B4,
-	RK628_I2SM_SCK = (LOGIC_PINBASE + 2),
-	RK628_I2SM_D,
-	RK628_I2SM_LR,
-	RK628_RXDDC_SCL,
-	RK628_RXDDC_SDA,
-	RK628_HDMIRX_CE,
+	GPIO0_A0 = BANK_OFFSET * 0,
+	GPIO0_A1,
+	GPIO0_A2,
+	GPIO0_A3,
+	GPIO0_A4,
+	GPIO0_A5,
+	GPIO0_A6,
+	GPIO0_A7,
+	GPIO0_B0,
+	GPIO0_B1,
+	GPIO0_B2,
+	GPIO0_B3,
+	GPIO1_A0 = BANK_OFFSET * 1,
+	GPIO1_A1,
+	GPIO1_A2,
+	GPIO1_A3,
+	GPIO1_A4,
+	GPIO1_A5,
+	GPIO1_A6,
+	GPIO1_A7,
+	GPIO1_B0,
+	GPIO1_B1,
+	GPIO1_B2,
+	GPIO1_B3,
+	GPIO1_B4,
+	GPIO1_B5,
+	GPIO2_A0 = BANK_OFFSET * 2,
+	GPIO2_A1,
+	GPIO2_A2,
+	GPIO2_A3,
+	GPIO2_A4,
+	GPIO2_A5,
+	GPIO2_A6,
+	GPIO2_A7,
+	GPIO2_B0,
+	GPIO2_B1,
+	GPIO2_B2,
+	GPIO2_B3,
+	GPIO2_B4,
+	GPIO2_B5,
+	GPIO2_B6,
+	GPIO2_B7,
+	GPIO2_C0,
+	GPIO2_C1,
+	GPIO2_C2,
+	GPIO2_C3,
+	GPIO2_C4,
+	GPIO2_C5,
+	GPIO2_C6,
+	GPIO2_C7,
+	GPIO3_A0 = BANK_OFFSET * 3,
+	GPIO3_A1,
+	GPIO3_A2,
+	GPIO3_A3,
+	GPIO3_A4,
+	GPIO3_A5,
+	GPIO3_A6,
+	GPIO3_A7,
+	GPIO3_B0,
+	GPIO3_B1,
+	GPIO3_B2,
+	GPIO3_B3,
+	GPIO3_B4,
+	I2SM_SCK = BANK_OFFSET * 4 + 2,
+	I2SM_D,
+	I2SM_LR,
+	RXDDC_SCL,
+	RXDDC_SDA,
+	HDMIRX_CE,
 };
 
 static struct pinctrl_pin_desc rk628_pins_desc[] = {
-	PINCTRL_PIN(RK628_GPIO0_A0, "gpio0a0"),
-	PINCTRL_PIN(RK628_GPIO0_A1, "gpio0a1"),
-	PINCTRL_PIN(RK628_GPIO0_A2, "gpio0a2"),
-	PINCTRL_PIN(RK628_GPIO0_A3, "gpio0a3"),
-	PINCTRL_PIN(RK628_GPIO0_A4, "gpio0a4"),
-	PINCTRL_PIN(RK628_GPIO0_A5, "gpio0a5"),
-	PINCTRL_PIN(RK628_GPIO0_A6, "gpio0a6"),
-	PINCTRL_PIN(RK628_GPIO0_A7, "gpio0a7"),
-	PINCTRL_PIN(RK628_GPIO0_B0, "gpio0b0"),
-	PINCTRL_PIN(RK628_GPIO0_B1, "gpio0b1"),
-	PINCTRL_PIN(RK628_GPIO0_B2, "gpio0b2"),
-	PINCTRL_PIN(RK628_GPIO0_B3, "gpio0b3"),
-
-	PINCTRL_PIN(RK628_GPIO1_A0, "gpio1a0"),
-	PINCTRL_PIN(RK628_GPIO1_A1, "gpio1a1"),
-	PINCTRL_PIN(RK628_GPIO1_A2, "gpio1a2"),
-	PINCTRL_PIN(RK628_GPIO1_A3, "gpio1a3"),
-	PINCTRL_PIN(RK628_GPIO1_A4, "gpio1a4"),
-	PINCTRL_PIN(RK628_GPIO1_A5, "gpio1a5"),
-	PINCTRL_PIN(RK628_GPIO1_A6, "gpio1a6"),
-	PINCTRL_PIN(RK628_GPIO1_A7, "gpio1a7"),
-	PINCTRL_PIN(RK628_GPIO1_B0, "gpio1b0"),
-	PINCTRL_PIN(RK628_GPIO1_B1, "gpio1b1"),
-	PINCTRL_PIN(RK628_GPIO1_B2, "gpio1b2"),
-	PINCTRL_PIN(RK628_GPIO1_B3, "gpio1b3"),
-	PINCTRL_PIN(RK628_GPIO1_B4, "gpio1b4"),
-	PINCTRL_PIN(RK628_GPIO1_B5, "gpio1b5"),
-
-	PINCTRL_PIN(RK628_GPIO2_A0, "gpio2a0"),
-	PINCTRL_PIN(RK628_GPIO2_A1, "gpio2a1"),
-	PINCTRL_PIN(RK628_GPIO2_A2, "gpio2a2"),
-	PINCTRL_PIN(RK628_GPIO2_A3, "gpio2a3"),
-	PINCTRL_PIN(RK628_GPIO2_A4, "gpio2a4"),
-	PINCTRL_PIN(RK628_GPIO2_A5, "gpio2a5"),
-	PINCTRL_PIN(RK628_GPIO2_A6, "gpio2a6"),
-	PINCTRL_PIN(RK628_GPIO2_A7, "gpio2a7"),
-	PINCTRL_PIN(RK628_GPIO2_B0, "gpio2b0"),
-	PINCTRL_PIN(RK628_GPIO2_B1, "gpio2b1"),
-	PINCTRL_PIN(RK628_GPIO2_B2, "gpio2b2"),
-	PINCTRL_PIN(RK628_GPIO2_B3, "gpio2b3"),
-	PINCTRL_PIN(RK628_GPIO2_B4, "gpio2b4"),
-	PINCTRL_PIN(RK628_GPIO2_B5, "gpio2b5"),
-	PINCTRL_PIN(RK628_GPIO2_B6, "gpio2b6"),
-	PINCTRL_PIN(RK628_GPIO2_B7, "gpio2b7"),
-	PINCTRL_PIN(RK628_GPIO2_C0, "gpio2c0"),
-	PINCTRL_PIN(RK628_GPIO2_C1, "gpio2c1"),
-	PINCTRL_PIN(RK628_GPIO2_C2, "gpio2c2"),
-	PINCTRL_PIN(RK628_GPIO2_C3, "gpio2c3"),
-	PINCTRL_PIN(RK628_GPIO2_C4, "gpio2c4"),
-	PINCTRL_PIN(RK628_GPIO2_C5, "gpio2c5"),
-	PINCTRL_PIN(RK628_GPIO2_C6, "gpio2c6"),
-	PINCTRL_PIN(RK628_GPIO2_C7, "gpio2c7"),
-
-	PINCTRL_PIN(RK628_GPIO3_A0, "gpio3a0"),
-	PINCTRL_PIN(RK628_GPIO3_A1, "gpio3a1"),
-	PINCTRL_PIN(RK628_GPIO3_A2, "gpio3a2"),
-	PINCTRL_PIN(RK628_GPIO3_A3, "gpio3a3"),
-	PINCTRL_PIN(RK628_GPIO3_A4, "gpio3a4"),
-	PINCTRL_PIN(RK628_GPIO3_A5, "gpio3a5"),
-	PINCTRL_PIN(RK628_GPIO3_A6, "gpio3a6"),
-	PINCTRL_PIN(RK628_GPIO3_A7, "gpio3a7"),
-	PINCTRL_PIN(RK628_GPIO3_B0, "gpio3b0"),
-	PINCTRL_PIN(RK628_GPIO3_B1, "gpio3b1"),
-	PINCTRL_PIN(RK628_GPIO3_B2, "gpio3b2"),
-	PINCTRL_PIN(RK628_GPIO3_B3, "gpio3b3"),
-	PINCTRL_PIN(RK628_GPIO3_B4, "gpio3b4"),
-
-	PINCTRL_PIN(RK628_I2SM_SCK, "i2sm_sck"),
-	PINCTRL_PIN(RK628_I2SM_D, "i2sm_d"),
-	PINCTRL_PIN(RK628_I2SM_LR, "i2sm_lr"),
-	PINCTRL_PIN(RK628_RXDDC_SCL, "rxddc_scl"),
-	PINCTRL_PIN(RK628_RXDDC_SDA, "rxddc_sda"),
-	PINCTRL_PIN(RK628_HDMIRX_CE, "hdmirx_cec"),
+	PINCTRL_PIN(GPIO0_A0, "gpio0a0"),
+	PINCTRL_PIN(GPIO0_A1, "gpio0a1"),
+	PINCTRL_PIN(GPIO0_A2, "gpio0a2"),
+	PINCTRL_PIN(GPIO0_A3, "gpio0a3"),
+	PINCTRL_PIN(GPIO0_A4, "gpio0a4"),
+	PINCTRL_PIN(GPIO0_A5, "gpio0a5"),
+	PINCTRL_PIN(GPIO0_A6, "gpio0a6"),
+	PINCTRL_PIN(GPIO0_A7, "gpio0a7"),
+	PINCTRL_PIN(GPIO0_B0, "gpio0b0"),
+	PINCTRL_PIN(GPIO0_B1, "gpio0b1"),
+	PINCTRL_PIN(GPIO0_B2, "gpio0b2"),
+	PINCTRL_PIN(GPIO0_B3, "gpio0b3"),
+
+	PINCTRL_PIN(GPIO1_A0, "gpio1a0"),
+	PINCTRL_PIN(GPIO1_A1, "gpio1a1"),
+	PINCTRL_PIN(GPIO1_A2, "gpio1a2"),
+	PINCTRL_PIN(GPIO1_A3, "gpio1a3"),
+	PINCTRL_PIN(GPIO1_A4, "gpio1a4"),
+	PINCTRL_PIN(GPIO1_A5, "gpio1a5"),
+	PINCTRL_PIN(GPIO1_A6, "gpio1a6"),
+	PINCTRL_PIN(GPIO1_A7, "gpio1a7"),
+	PINCTRL_PIN(GPIO1_B0, "gpio1b0"),
+	PINCTRL_PIN(GPIO1_B1, "gpio1b1"),
+	PINCTRL_PIN(GPIO1_B2, "gpio1b2"),
+	PINCTRL_PIN(GPIO1_B3, "gpio1b3"),
+	PINCTRL_PIN(GPIO1_B4, "gpio1b4"),
+	PINCTRL_PIN(GPIO1_B5, "gpio1b5"),
+
+	PINCTRL_PIN(GPIO2_A0, "gpio2a0"),
+	PINCTRL_PIN(GPIO2_A1, "gpio2a1"),
+	PINCTRL_PIN(GPIO2_A2, "gpio2a2"),
+	PINCTRL_PIN(GPIO2_A3, "gpio2a3"),
+	PINCTRL_PIN(GPIO2_A4, "gpio2a4"),
+	PINCTRL_PIN(GPIO2_A5, "gpio2a5"),
+	PINCTRL_PIN(GPIO2_A6, "gpio2a6"),
+	PINCTRL_PIN(GPIO2_A7, "gpio2a7"),
+	PINCTRL_PIN(GPIO2_B0, "gpio2b0"),
+	PINCTRL_PIN(GPIO2_B1, "gpio2b1"),
+	PINCTRL_PIN(GPIO2_B2, "gpio2b2"),
+	PINCTRL_PIN(GPIO2_B3, "gpio2b3"),
+	PINCTRL_PIN(GPIO2_B4, "gpio2b4"),
+	PINCTRL_PIN(GPIO2_B5, "gpio2b5"),
+	PINCTRL_PIN(GPIO2_B6, "gpio2b6"),
+	PINCTRL_PIN(GPIO2_B7, "gpio2b7"),
+	PINCTRL_PIN(GPIO2_C0, "gpio2c0"),
+	PINCTRL_PIN(GPIO2_C1, "gpio2c1"),
+	PINCTRL_PIN(GPIO2_C2, "gpio2c2"),
+	PINCTRL_PIN(GPIO2_C3, "gpio2c3"),
+	PINCTRL_PIN(GPIO2_C4, "gpio2c4"),
+	PINCTRL_PIN(GPIO2_C5, "gpio2c5"),
+	PINCTRL_PIN(GPIO2_C6, "gpio2c6"),
+	PINCTRL_PIN(GPIO2_C7, "gpio2c7"),
+
+	PINCTRL_PIN(GPIO3_A0, "gpio3a0"),
+	PINCTRL_PIN(GPIO3_A1, "gpio3a1"),
+	PINCTRL_PIN(GPIO3_A2, "gpio3a2"),
+	PINCTRL_PIN(GPIO3_A3, "gpio3a3"),
+	PINCTRL_PIN(GPIO3_A4, "gpio3a4"),
+	PINCTRL_PIN(GPIO3_A5, "gpio3a5"),
+	PINCTRL_PIN(GPIO3_A6, "gpio3a6"),
+	PINCTRL_PIN(GPIO3_A7, "gpio3a7"),
+	PINCTRL_PIN(GPIO3_B0, "gpio3b0"),
+	PINCTRL_PIN(GPIO3_B1, "gpio3b1"),
+	PINCTRL_PIN(GPIO3_B2, "gpio3b2"),
+	PINCTRL_PIN(GPIO3_B3, "gpio3b3"),
+	PINCTRL_PIN(GPIO3_B4, "gpio3b4"),
+
+	PINCTRL_PIN(I2SM_SCK, "i2sm_sck"),
+	PINCTRL_PIN(I2SM_D, "i2sm_d"),
+	PINCTRL_PIN(I2SM_LR, "i2sm_lr"),
+	PINCTRL_PIN(RXDDC_SCL, "rxddc_scl"),
+	PINCTRL_PIN(RXDDC_SDA, "rxddc_sda"),
+	PINCTRL_PIN(HDMIRX_CE, "hdmirx_cec"),
 };
 
 static const struct rk628_pin_group rk628_pin_groups[] = {
-	RK628_PINCTRL_GROUP("gpio0a0", { RK628_GPIO0_A0 }, 1, GRF_GPIO0AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio0a1", { RK628_GPIO0_A1 }, 1, GRF_GPIO0AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio0a2", { RK628_GPIO0_A2 }, 1, GRF_GPIO0AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio0a3", { RK628_GPIO0_A3 }, 1, GRF_GPIO0AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio0a4", { RK628_GPIO0_A4 }, 1, GRF_GPIO0AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio0a5", { RK628_GPIO0_A5 }, 1, GRF_GPIO0AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio0a6", { RK628_GPIO0_A6 }, 1, GRF_GPIO0AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio0a7", { RK628_GPIO0_A7 }, 1, GRF_GPIO0AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio0b0", { RK628_GPIO0_B0 }, 1, GRF_GPIO0AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio0b1", { RK628_GPIO0_B1 }, 1, GRF_GPIO0AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio0b2", { RK628_GPIO0_B2 }, 1, GRF_GPIO0AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio0b3", { RK628_GPIO0_B3 }, 1, GRF_GPIO0AB_SEL_CON),
-
-	RK628_PINCTRL_GROUP("gpio1a0", { RK628_GPIO1_A0 }, 1, GRF_GPIO1AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio1a1", { RK628_GPIO1_A1 }, 1, GRF_GPIO1AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio1a2", { RK628_GPIO1_A2 }, 1, GRF_GPIO1AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio1a3", { RK628_GPIO1_A3 }, 1, GRF_GPIO1AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio1a4", { RK628_GPIO1_A4 }, 1, GRF_GPIO1AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio1a5", { RK628_GPIO1_A5 }, 1, GRF_GPIO1AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio1a6", { RK628_GPIO1_A6 }, 1, GRF_GPIO1AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio1a7", { RK628_GPIO1_A7 }, 1, GRF_GPIO1AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio1b0", { RK628_GPIO1_B0 }, 1, GRF_GPIO1AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio1b1", { RK628_GPIO1_B1 }, 1, GRF_GPIO1AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio1b2", { RK628_GPIO1_B2 }, 1, GRF_GPIO1AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio1b3", { RK628_GPIO1_B3 }, 1, GRF_GPIO1AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio1b4", { RK628_GPIO1_B4 }, 1, GRF_GPIO1AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio1b5", { RK628_GPIO1_B5 }, 1, GRF_GPIO1AB_SEL_CON),
-
-	RK628_PINCTRL_GROUP("gpio2a0", { RK628_GPIO2_A0 }, 1, GRF_GPIO2AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2a1", { RK628_GPIO2_A1 }, 1, GRF_GPIO2AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2a2", { RK628_GPIO2_A2 }, 1, GRF_GPIO2AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2a3", { RK628_GPIO2_A3 }, 1, GRF_GPIO2AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2a4", { RK628_GPIO2_A4 }, 1, GRF_GPIO2AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2a5", { RK628_GPIO2_A5 }, 1, GRF_GPIO2AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2a6", { RK628_GPIO2_A6 }, 1, GRF_GPIO2AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2a7", { RK628_GPIO2_A7 }, 1, GRF_GPIO2AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2b0", { RK628_GPIO2_B0 }, 1, GRF_GPIO2AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2b1", { RK628_GPIO2_B1 }, 1, GRF_GPIO2AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2b2", { RK628_GPIO2_B2 }, 1, GRF_GPIO2AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2b3", { RK628_GPIO2_B3 }, 1, GRF_GPIO2AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2b4", { RK628_GPIO2_B4 }, 1, GRF_GPIO2AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2b5", { RK628_GPIO2_B5 }, 1, GRF_GPIO2AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2b6", { RK628_GPIO2_B6 }, 1, GRF_GPIO2AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2b7", { RK628_GPIO2_B7 }, 1, GRF_GPIO2AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2c0", { RK628_GPIO2_C0 }, 1, GRF_GPIO2C_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2c1", { RK628_GPIO2_C1 }, 1, GRF_GPIO2C_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2c2", { RK628_GPIO2_C2 }, 1, GRF_GPIO2C_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2c3", { RK628_GPIO2_C3 }, 1, GRF_GPIO2C_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2c4", { RK628_GPIO2_C4 }, 1, GRF_GPIO2C_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2c5", { RK628_GPIO2_C5 }, 1, GRF_GPIO2C_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2c6", { RK628_GPIO2_C6 }, 1, GRF_GPIO2C_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio2c7", { RK628_GPIO2_C7 }, 1, GRF_GPIO2C_SEL_CON),
-
-	RK628_PINCTRL_GROUP("gpio3a0", { RK628_GPIO3_A0 }, 1, GRF_GPIO3AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio3a1", { RK628_GPIO3_A1 }, 1, GRF_GPIO3AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio3a2", { RK628_GPIO3_A2 }, 1, GRF_GPIO3AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio3a3", { RK628_GPIO3_A3 }, 1, GRF_GPIO3AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio3a4", { RK628_GPIO3_A4 }, 1, GRF_GPIO3AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio3a5", { RK628_GPIO3_A5 }, 1, GRF_GPIO3AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio3a6", { RK628_GPIO3_A6 }, 1, GRF_GPIO3AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio3a7", { RK628_GPIO3_A7 }, 1, GRF_GPIO3AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio3b0", { RK628_GPIO3_B0 }, 1, GRF_GPIO3AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio3b1", { RK628_GPIO3_B1 }, 1, GRF_GPIO3AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio3b2", { RK628_GPIO3_B2 }, 1, GRF_GPIO3AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio3b3", { RK628_GPIO3_B3 }, 1, GRF_GPIO3AB_SEL_CON),
-	RK628_PINCTRL_GROUP("gpio3b4", { RK628_GPIO3_B4 }, 1, GRF_GPIO3AB_SEL_CON),
-
-	RK628_PINCTRL_GROUP("i2sm_sck", { RK628_I2SM_SCK }, 1, GRF_SYSTEM_CON3),
-	RK628_PINCTRL_GROUP("i2sm_d", { RK628_I2SM_D }, 1, GRF_SYSTEM_CON3),
-	RK628_PINCTRL_GROUP("i2sm_lr", { RK628_I2SM_LR }, 1, GRF_SYSTEM_CON3),
-	RK628_PINCTRL_GROUP("rxddc_scl", { RK628_RXDDC_SCL }, 1, GRF_SYSTEM_CON3),
-	RK628_PINCTRL_GROUP("rxddc_sda", { RK628_RXDDC_SDA }, 1, GRF_SYSTEM_CON3),
-	RK628_PINCTRL_GROUP("hdmirx_cec", { RK628_HDMIRX_CE }, 1, GRF_SYSTEM_CON3),
+	PINCTRL_GROUP("gpio0a0", { GPIO0_A0 }, 1, GRF_GPIO0AB_SEL_CON),
+	PINCTRL_GROUP("gpio0a1", { GPIO0_A1 }, 1, GRF_GPIO0AB_SEL_CON),
+	PINCTRL_GROUP("gpio0a2", { GPIO0_A2 }, 1, GRF_GPIO0AB_SEL_CON),
+	PINCTRL_GROUP("gpio0a3", { GPIO0_A3 }, 1, GRF_GPIO0AB_SEL_CON),
+	PINCTRL_GROUP("gpio0a4", { GPIO0_A4 }, 1, GRF_GPIO0AB_SEL_CON),
+	PINCTRL_GROUP("gpio0a5", { GPIO0_A5 }, 1, GRF_GPIO0AB_SEL_CON),
+	PINCTRL_GROUP("gpio0a6", { GPIO0_A6 }, 1, GRF_GPIO0AB_SEL_CON),
+	PINCTRL_GROUP("gpio0a7", { GPIO0_A7 }, 1, GRF_GPIO0AB_SEL_CON),
+	PINCTRL_GROUP("gpio0b0", { GPIO0_B0 }, 1, GRF_GPIO0AB_SEL_CON),
+	PINCTRL_GROUP("gpio0b1", { GPIO0_B1 }, 1, GRF_GPIO0AB_SEL_CON),
+	PINCTRL_GROUP("gpio0b2", { GPIO0_B2 }, 1, GRF_GPIO0AB_SEL_CON),
+	PINCTRL_GROUP("gpio0b3", { GPIO0_B3 }, 1, GRF_GPIO0AB_SEL_CON),
+
+	PINCTRL_GROUP("gpio1a0", { GPIO1_A0 }, 1, GRF_GPIO1AB_SEL_CON),
+	PINCTRL_GROUP("gpio1a1", { GPIO1_A1 }, 1, GRF_GPIO1AB_SEL_CON),
+	PINCTRL_GROUP("gpio1a2", { GPIO1_A2 }, 1, GRF_GPIO1AB_SEL_CON),
+	PINCTRL_GROUP("gpio1a3", { GPIO1_A3 }, 1, GRF_GPIO1AB_SEL_CON),
+	PINCTRL_GROUP("gpio1a4", { GPIO1_A4 }, 1, GRF_GPIO1AB_SEL_CON),
+	PINCTRL_GROUP("gpio1a5", { GPIO1_A5 }, 1, GRF_GPIO1AB_SEL_CON),
+	PINCTRL_GROUP("gpio1a6", { GPIO1_A6 }, 1, GRF_GPIO1AB_SEL_CON),
+	PINCTRL_GROUP("gpio1a7", { GPIO1_A7 }, 1, GRF_GPIO1AB_SEL_CON),
+	PINCTRL_GROUP("gpio1b0", { GPIO1_B0 }, 1, GRF_GPIO1AB_SEL_CON),
+	PINCTRL_GROUP("gpio1b1", { GPIO1_B1 }, 1, GRF_GPIO1AB_SEL_CON),
+	PINCTRL_GROUP("gpio1b2", { GPIO1_B2 }, 1, GRF_GPIO1AB_SEL_CON),
+	PINCTRL_GROUP("gpio1b3", { GPIO1_B3 }, 1, GRF_GPIO1AB_SEL_CON),
+	PINCTRL_GROUP("gpio1b4", { GPIO1_B4 }, 1, GRF_GPIO1AB_SEL_CON),
+	PINCTRL_GROUP("gpio1b5", { GPIO1_B5 }, 1, GRF_GPIO1AB_SEL_CON),
+
+	PINCTRL_GROUP("gpio2a0", { GPIO2_A0 }, 1, GRF_GPIO2AB_SEL_CON),
+	PINCTRL_GROUP("gpio2a1", { GPIO2_A1 }, 1, GRF_GPIO2AB_SEL_CON),
+	PINCTRL_GROUP("gpio2a2", { GPIO2_A2 }, 1, GRF_GPIO2AB_SEL_CON),
+	PINCTRL_GROUP("gpio2a3", { GPIO2_A3 }, 1, GRF_GPIO2AB_SEL_CON),
+	PINCTRL_GROUP("gpio2a4", { GPIO2_A4 }, 1, GRF_GPIO2AB_SEL_CON),
+	PINCTRL_GROUP("gpio2a5", { GPIO2_A5 }, 1, GRF_GPIO2AB_SEL_CON),
+	PINCTRL_GROUP("gpio2a6", { GPIO2_A6 }, 1, GRF_GPIO2AB_SEL_CON),
+	PINCTRL_GROUP("gpio2a7", { GPIO2_A7 }, 1, GRF_GPIO2AB_SEL_CON),
+	PINCTRL_GROUP("gpio2b0", { GPIO2_B0 }, 1, GRF_GPIO2AB_SEL_CON),
+	PINCTRL_GROUP("gpio2b1", { GPIO2_B1 }, 1, GRF_GPIO2AB_SEL_CON),
+	PINCTRL_GROUP("gpio2b2", { GPIO2_B2 }, 1, GRF_GPIO2AB_SEL_CON),
+	PINCTRL_GROUP("gpio2b3", { GPIO2_B3 }, 1, GRF_GPIO2AB_SEL_CON),
+	PINCTRL_GROUP("gpio2b4", { GPIO2_B4 }, 1, GRF_GPIO2AB_SEL_CON),
+	PINCTRL_GROUP("gpio2b5", { GPIO2_B5 }, 1, GRF_GPIO2AB_SEL_CON),
+	PINCTRL_GROUP("gpio2b6", { GPIO2_B6 }, 1, GRF_GPIO2AB_SEL_CON),
+	PINCTRL_GROUP("gpio2b7", { GPIO2_B7 }, 1, GRF_GPIO2AB_SEL_CON),
+	PINCTRL_GROUP("gpio2c0", { GPIO2_C0 }, 1, GRF_GPIO2C_SEL_CON),
+	PINCTRL_GROUP("gpio2c1", { GPIO2_C1 }, 1, GRF_GPIO2C_SEL_CON),
+	PINCTRL_GROUP("gpio2c2", { GPIO2_C2 }, 1, GRF_GPIO2C_SEL_CON),
+	PINCTRL_GROUP("gpio2c3", { GPIO2_C3 }, 1, GRF_GPIO2C_SEL_CON),
+	PINCTRL_GROUP("gpio2c4", { GPIO2_C4 }, 1, GRF_GPIO2C_SEL_CON),
+	PINCTRL_GROUP("gpio2c5", { GPIO2_C5 }, 1, GRF_GPIO2C_SEL_CON),
+	PINCTRL_GROUP("gpio2c6", { GPIO2_C6 }, 1, GRF_GPIO2C_SEL_CON),
+	PINCTRL_GROUP("gpio2c7", { GPIO2_C7 }, 1, GRF_GPIO2C_SEL_CON),
+
+	PINCTRL_GROUP("gpio3a0", { GPIO3_A0 }, 1, GRF_GPIO3AB_SEL_CON),
+	PINCTRL_GROUP("gpio3a1", { GPIO3_A1 }, 1, GRF_GPIO3AB_SEL_CON),
+	PINCTRL_GROUP("gpio3a2", { GPIO3_A2 }, 1, GRF_GPIO3AB_SEL_CON),
+	PINCTRL_GROUP("gpio3a3", { GPIO3_A3 }, 1, GRF_GPIO3AB_SEL_CON),
+	PINCTRL_GROUP("gpio3a4", { GPIO3_A4 }, 1, GRF_GPIO3AB_SEL_CON),
+	PINCTRL_GROUP("gpio3a5", { GPIO3_A5 }, 1, GRF_GPIO3AB_SEL_CON),
+	PINCTRL_GROUP("gpio3a6", { GPIO3_A6 }, 1, GRF_GPIO3AB_SEL_CON),
+	PINCTRL_GROUP("gpio3a7", { GPIO3_A7 }, 1, GRF_GPIO3AB_SEL_CON),
+	PINCTRL_GROUP("gpio3b0", { GPIO3_B0 }, 1, GRF_GPIO3AB_SEL_CON),
+	PINCTRL_GROUP("gpio3b1", { GPIO3_B1 }, 1, GRF_GPIO3AB_SEL_CON),
+	PINCTRL_GROUP("gpio3b2", { GPIO3_B2 }, 1, GRF_GPIO3AB_SEL_CON),
+	PINCTRL_GROUP("gpio3b3", { GPIO3_B3 }, 1, GRF_GPIO3AB_SEL_CON),
+	PINCTRL_GROUP("gpio3b4", { GPIO3_B4 }, 1, GRF_GPIO3AB_SEL_CON),
+
+	PINCTRL_GROUP("i2sm_sck", { I2SM_SCK }, 1, GRF_SYSTEM_CON3),
+	PINCTRL_GROUP("i2sm_d", { I2SM_D }, 1, GRF_SYSTEM_CON3),
+	PINCTRL_GROUP("i2sm_lr", { I2SM_LR }, 1, GRF_SYSTEM_CON3),
+	PINCTRL_GROUP("rxddc_scl", { RXDDC_SCL }, 1, GRF_SYSTEM_CON3),
+	PINCTRL_GROUP("rxddc_sda", { RXDDC_SDA }, 1, GRF_SYSTEM_CON3),
+	PINCTRL_GROUP("hdmirx_cec", { HDMIRX_CE }, 1, GRF_SYSTEM_CON3),
 };
 
 static struct rk628_pin_bank rk628_pin_banks[] = {
-	RK628_PINCTRL_BANK("rk628-gpio0", GPIO0_BASE, 12, GPIO0_PINBASE),
-	RK628_PINCTRL_BANK("rk628-gpio1", GPIO1_BASE, 14, GPIO1_PINBASE),
-	RK628_PINCTRL_BANK("rk628-gpio2", GPIO2_BASE, 24, GPIO2_PINBASE),
-	RK628_PINCTRL_BANK("rk628-gpio3", GPIO3_BASE, 13, GPIO3_PINBASE),
+	PINCTRL_BANK("rk628-gpio0", GPIO0_BASE, 12),
+	PINCTRL_BANK("rk628-gpio1", GPIO1_BASE, 14),
+	PINCTRL_BANK("rk628-gpio2", GPIO2_BASE, 24),
+	PINCTRL_BANK("rk628-gpio3", GPIO3_BASE, 13),
 };
 
 /* generic gpio chip */
@@ -687,7 +678,7 @@ static int rk628_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
 
 	chip = range->gc;
 	bank = gpiochip_get_data(chip);
-	pin_offset = offset - bank->pin_base;
+	pin_offset = offset - range->pin_base;
 
 	if (pin_offset / 16) {
 		dir_reg = bank->reg_base + GPIO_SWPORT_DDR_H;
@@ -739,54 +730,27 @@ static int rk628_pinconf_get(struct pinctrl_dev *pctldev,
 	return 0;
 }
 
-static struct rk628_pin_bank *rk628_pin_to_bank(struct rk628_pctrl_info *pci, int pin, int *index)
-{
-	int banks[] = { GPIO0_PINBASE,
-			GPIO1_PINBASE,
-			GPIO2_PINBASE,
-			GPIO3_PINBASE };
-	int i;
-
-	struct rk628_pin_bank *bank;
-
-	for (i = 3; i >= 0; i--) {
-		if (pin >= banks[i]) {
-			bank = pci->pin_banks + i;
-			break;
-		}
-	}
-
-	if (i < 0) {
-		dev_err(pci->dev, "pin%u is invalid pin number!\n", pin);
-		return NULL;
-	}
-
-	if (index)
-		*index = i;
-
-	return bank;
-}
-
 static int rk628_set_slew_rate(struct rk628_pctrl_info *pci, int pin, int speed)
 {
-	int gpio = pin - PINBASE;
+	int gpio = pin;
+
 	/* gpio0b_sl(0-3) gpio1b_sl(0-3 -5) gpio3a_sl(4-7)*/
 	char valid_gpio[] = {
-		GPIO0_PINBASE - PINBASE + 8,
-		GPIO0_PINBASE - PINBASE + 9,
-		GPIO0_PINBASE - PINBASE + 10,
-		GPIO0_PINBASE - PINBASE + 11,
-		GPIO1_PINBASE - PINBASE + 8,
-		GPIO1_PINBASE - PINBASE + 9,
-		GPIO1_PINBASE - PINBASE + 10,
-		GPIO1_PINBASE - PINBASE + 11,
-		GPIO1_PINBASE - PINBASE + 12,
-		GPIO1_PINBASE - PINBASE + 13,
+		8,
+		9,
+		10,
+		11,
+		32 + 8,
+		32 + 9,
+		32 + 10,
+		32 + 11,
+		32 + 12,
+		32 + 13,
 		-1, -1,
-		GPIO3_PINBASE - PINBASE + 4,
-		GPIO3_PINBASE - PINBASE + 5,
-		GPIO3_PINBASE - PINBASE + 6,
-		GPIO3_PINBASE - PINBASE + 7
+		96 + 4,
+		96 + 5,
+		96 + 6,
+		96 + 7
 	};
 
 
@@ -826,22 +790,15 @@ static int rk628_calc_pull_reg_and_value(struct rk628_pctrl_info *pci,
 					 int *reg,
 					 int *val)
 {
+	struct pinctrl_gpio_range *range = pinctrl_find_gpio_range_from_pin(pci->pctl, pin);
 	int gpio2_regs[] = { GRF_GPIO2A_P_CON, GRF_GPIO2B_P_CON, GRF_GPIO2C_P_CON };
 	int gpio3_regs[] = { GRF_GPIO3A_P_CON, GRF_GPIO3B_P_CON };
 	int valid_pinnum[] = { 8, 8, 24, 13 };
-	int offset, i;
-	struct rk628_pin_bank *bank;
-
-	bank = rk628_pin_to_bank(pci, pin, &i);
-	if (!bank) {
-		dev_err(pci->dev, "pin%u is invalid\n", pin);
-		return -EINVAL;
-	}
-	offset = pin - bank->pin_base;
+	int offset = pin - range->pin_base;
 
-	switch (bank->pin_base) {
-	case GPIO0_PINBASE:
-		if (pull == RK628_GPIO_PULL_UP) {
+	switch (range->id) {
+	case 0:
+		if (pull == GPIO_PULL_UP) {
 			dev_err(pci->dev, "pin%u don't support pull up!\n",
 				pin);
 			return -EINVAL;
@@ -853,7 +810,7 @@ static int rk628_calc_pull_reg_and_value(struct rk628_pctrl_info *pci,
 			return -EINVAL;
 		}
 
-		if (offset < valid_pinnum[i]) {
+		if (offset < valid_pinnum[range->id]) {
 			*val = 0x3 << (2 * offset + 16) | pull << (2 * offset);
 			*reg = GRF_GPIO0A_P_CON;
 			dev_dbg(pci->dev, "pin%u reg=0x%8x val=0x%8x\n",
@@ -861,8 +818,8 @@ static int rk628_calc_pull_reg_and_value(struct rk628_pctrl_info *pci,
 			return 0;
 		}
 		break;
-	case GPIO1_PINBASE:
-		if (pull == RK628_GPIO_PULL_UP) {
+	case 1:
+		if (pull == GPIO_PULL_UP) {
 			dev_err(pci->dev, "pin%u don't support pull up!\n",
 				pin);
 			return -EINVAL;
@@ -874,7 +831,7 @@ static int rk628_calc_pull_reg_and_value(struct rk628_pctrl_info *pci,
 			return -EINVAL;
 		}
 
-		if (offset < valid_pinnum[i]) {
+		if (offset < valid_pinnum[range->id]) {
 			*val = 0x3 << (2 * offset + 16) | pull << (2 * offset);
 			*reg = GRF_GPIO1A_P_CON;
 			dev_dbg(pci->dev, "pin%u reg=0x%8x val=0x%8x\n",
@@ -882,13 +839,13 @@ static int rk628_calc_pull_reg_and_value(struct rk628_pctrl_info *pci,
 			return 0;
 		}
 		break;
-	case GPIO2_PINBASE:
-		if (pull == RK628_GPIO_PULL_UP)
-			pull = RK628_GPIO_PULL_DOWN;
-		else if (pull == RK628_GPIO_PULL_DOWN)
-			pull = RK628_GPIO_PULL_UP;
+	case 2:
+		if (pull == GPIO_PULL_UP)
+			pull = GPIO_PULL_DOWN;
+		else if (pull == GPIO_PULL_DOWN)
+			pull = GPIO_PULL_UP;
 
-		if (offset < valid_pinnum[i]) {
+		if (offset < valid_pinnum[range->id]) {
 			*reg = gpio2_regs[offset / 8];
 			offset = offset % 8;
 			*val = 0x3 << (2 * offset + 16) | pull << (2 * offset);
@@ -897,25 +854,25 @@ static int rk628_calc_pull_reg_and_value(struct rk628_pctrl_info *pci,
 			return 0;
 		}
 		break;
-	case GPIO3_PINBASE:
-		if (pull == RK628_GPIO_PULL_UP && (offset == 2 || offset == 11 || offset == 12)) {
+	case 3:
+		if (pull == GPIO_PULL_UP && (offset == 2 || offset == 11 || offset == 12)) {
 			dev_err(pci->dev, "pin%u don't support pull up!\n",
 				pin);
 			return -EINVAL;
-		} else if (pull == RK628_GPIO_PULL_DOWN && (offset == 9 || offset == 10)) {
+		} else if (pull == GPIO_PULL_DOWN && (offset == 9 || offset == 10)) {
 			dev_err(pci->dev, "pin%u don't support pull down!\n",
 				pin);
 			return -EINVAL;
 		}
 
 		if (offset == 0 || offset == 1 || offset == 3 || offset == 8) {
-			if (pull == RK628_GPIO_PULL_UP)
-				pull = RK628_GPIO_PULL_DOWN;
-			else if (pull == RK628_GPIO_PULL_DOWN)
-				pull = RK628_GPIO_PULL_UP;
+			if (pull == GPIO_PULL_UP)
+				pull = GPIO_PULL_DOWN;
+			else if (pull == GPIO_PULL_DOWN)
+				pull = GPIO_PULL_UP;
 		}
 
-		if ((offset > 7 && offset < valid_pinnum[i]) || offset < 4) {
+		if ((offset > 7 && offset < valid_pinnum[range->id]) || offset < 4) {
 			*reg = gpio3_regs[offset / 8];
 			offset = offset % 8;
 			*val = 0x3 << (2 * offset + 16) | pull << (2 * offset);
@@ -937,6 +894,7 @@ static int rk628_calc_strength_reg_and_value(struct rk628_pctrl_info *pci,
 					 int *reg,
 					 int *val)
 {
+	struct pinctrl_gpio_range *range = pinctrl_find_gpio_range_from_pin(pci->pctl, pin);
 	int valid_pinnum[] = { 8, 8, 24, 9 };
 	int gpio_regs[][6] = {
 		{	GRF_GPIO0B_D_CON
@@ -953,36 +911,28 @@ static int rk628_calc_strength_reg_and_value(struct rk628_pctrl_info *pci,
 			GRF_GPIO3B_D_CON
 		}
 	};
-	int offset, i;
-	struct rk628_pin_bank *bank;
+	int offset = pin - range->pin_base;
 
-	bank = rk628_pin_to_bank(pci, pin, &i);
-	if (!bank) {
-		dev_err(pci->dev, "pin%u is invalid\n", pin);
-		return -EINVAL;
-	}
-	offset = pin - bank->pin_base;
-
-	switch (bank->pin_base) {
-	case GPIO0_PINBASE:
-	case GPIO1_PINBASE:
-		if (offset < valid_pinnum[i]) {
+	switch (range->id) {
+	case 0:
+	case 1:
+		if (offset < valid_pinnum[range->id]) {
 			dev_err(pci->dev, "pin%u don't support driver strength settings!\n",
 				pin);
 			return -EINVAL;
 		}
 
-		offset -= valid_pinnum[i];
+		offset -= valid_pinnum[range->id];
 
 		*val = 0x3 << (2 * offset + 16) | strength << (2 * offset);
-		*reg = gpio_regs[i][0];
+		*reg = gpio_regs[range->id][0];
 		dev_dbg(pci->dev, "pin%u reg=0x%8x val=0x%8x\n",
 				pin, *reg, *val);
 		return 0;
-	case GPIO2_PINBASE:
-	case GPIO3_PINBASE:
-		if (offset < valid_pinnum[i]) {
-			*reg = gpio_regs[i][offset / 4];
+	case 2:
+	case 3:
+		if (offset < valid_pinnum[range->id]) {
+			*reg = gpio_regs[range->id][offset / 4];
 			offset = offset % 4;
 			*val = 0x7 << (4 * offset + 16) | strength << (4 * offset);
 			dev_dbg(pci->dev, "pin%u reg=0x%8x val=0x%8x\n",
@@ -1003,25 +953,18 @@ static int rk628_calc_schmitt_reg_and_value(struct rk628_pctrl_info *pci,
 					 int *reg,
 					 int *val)
 {
+	struct pinctrl_gpio_range *range = pinctrl_find_gpio_range_from_pin(pci->pctl, pin);
 	int gpio2_regs[] = {GRF_GPIO2A_SMT, GRF_GPIO2B_SMT, GRF_GPIO2C_SMT};
 	int gpio3_reg = GRF_GPIO3AB_SMT;
 	int valid_pinnum[] = { 0, 0, 24, 9 };
-	int offset, i;
-	struct rk628_pin_bank *bank;
+	int offset = pin - range->pin_base;
 
-	bank = rk628_pin_to_bank(pci, pin, &i);
-	if (!bank) {
-		dev_err(pci->dev, "pin%u is invalid\n", pin);
-		return -EINVAL;
-	}
-	offset = pin - bank->pin_base;
-
-	switch (bank->pin_base) {
-	case GPIO0_PINBASE:
-	case GPIO1_PINBASE:
+	switch (range->id) {
+	case 0:
+	case 1:
 		break;
-	case GPIO2_PINBASE:
-		if (offset < valid_pinnum[i]) {
+	case 2:
+		if (offset < valid_pinnum[range->id]) {
 			*reg = gpio2_regs[offset / 8];
 			offset = offset % 8;
 			*val = BIT(offset + 16) | enable << (offset);
@@ -1030,7 +973,7 @@ static int rk628_calc_schmitt_reg_and_value(struct rk628_pctrl_info *pci,
 			return 0;
 		}
 		break;
-	case GPIO3_PINBASE:
+	case 3:
 		if (offset == 0 || offset == 1 || offset == 3 || offset == 8) {
 			*reg = gpio3_reg;
 			*val = BIT(offset + 16) | enable << (offset);
@@ -1123,17 +1066,17 @@ static int rk628_pinconf_set(struct pinctrl_dev *pctldev,
 			rk628_set_drive_perpin(pci, pin, arg);
 			break;
 		case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
-			rk628_set_pull(pci, pin, RK628_GPIO_HIGH_Z);
+			rk628_set_pull(pci, pin, GPIO_HIGH_Z);
 			break;
 		case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
 			dev_err(pci->dev,
 				"PIN_CONFIG_BIAS_PULL_PIN_DEFAULT not supported\n");
 			break;
 		case PIN_CONFIG_BIAS_PULL_UP:
-			rk628_set_pull(pci, pin, RK628_GPIO_PULL_UP);
+			rk628_set_pull(pci, pin, GPIO_PULL_UP);
 			break;
 		case PIN_CONFIG_BIAS_PULL_DOWN:
-			rk628_set_pull(pci, pin, RK628_GPIO_PULL_DOWN);
+			rk628_set_pull(pci, pin, GPIO_PULL_DOWN);
 			break;
 		case PIN_CONFIG_SLEW_RATE:
 			rk628_set_slew_rate(pci, pin, arg);
@@ -1143,19 +1086,14 @@ static int rk628_pinconf_set(struct pinctrl_dev *pctldev,
 			break;
 		case PIN_CONFIG_OUTPUT:
 		{
-			struct rk628_pin_bank *bank;
+			struct pinctrl_gpio_range *range = pinctrl_find_gpio_range_from_pin(pci->pctl, pin);
 
-			bank = rk628_pin_to_bank(pci, pin, NULL);
-			if (!bank) {
-				dev_err(pci->dev, "pin%u is invalid\n", pin);
-				return -EINVAL;
-			}
-			rk628_gpio_direction_output(&bank->gpio_chip, pin - bank->pin_base, arg);
+			rk628_gpio_direction_output(range->gc, pin - range->pin_base, arg);
 			break;
 		}
 		default:
-			dev_err(pci->dev, "Properties not supported\n");
-			return 0;
+			dev_err(pci->dev, "Properties not supported param=%d\n", param);
+			break;
 		}
 	}
 
@@ -1191,11 +1129,11 @@ static int rk628_pinctrl_create_function(struct device *dev,
 	if (of_property_read_string(func_np, "function", &func->name))
 		return -1;
 
-	func->mux_option = RK628_PINMUX_FUNC1;
+	func->mux_option = PINMUX_FUNC1;
 	/* for signals input select */
 	for (i = 0; i < 6; i++) {
 		if (!strcmp(func_sel[i], func->name))
-			func->mux_option = RK628_PINMUX_FUNC0;
+			func->mux_option = PINMUX_FUNC0;
 	}
 
 	dev_dbg(dev, "%s func->name=%s\n", __func__, func->name);
@@ -1251,11 +1189,8 @@ static int rk628_pinctrl_parse_gpiobank(struct device *dev,
 			bank->clk = devm_get_clk_from_child(dev,
 							    bank->of_node,
 							    "pclk");
-			if (IS_ERR(bank->clk)) {
-				dev_err(dev, "bank->clk get error %ld\n",
-					PTR_ERR(bank->clk));
+			if (IS_ERR(bank->clk))
 				return PTR_ERR(bank->clk);
-			}
 			clk_prepare(bank->clk);
 			break;
 		}
@@ -1331,8 +1266,8 @@ rk628_pinctrl_create_functions(struct device *dev,
 	}
 
 	/* init gpio func */
-	*(func) = rk628_functions[RK628_MUX_GPIO];
-	func->mux_option = RK628_PINMUX_FUNC0;
+	*(func) = rk628_functions[MUX_GPIO];
+	func->mux_option = PINMUX_FUNC0;
 
 	dev_dbg(dev, "count %d is for %s function\n", func_cnt, func->name);
 	++func;
@@ -1377,7 +1312,7 @@ static const struct regmap_access_table rk628_pinctrl_readable_table = {
 };
 
 static const struct regmap_config rk628_pinctrl_regmap_config = {
-	.name = "rk628-pinctrl",
+	.name = "pinctrl",
 	.reg_bits = 32,
 	.val_bits = 32,
 	.reg_stride = 4,
@@ -1648,31 +1583,25 @@ static int rk628_gpiolib_register(struct platform_device *pdev,
 {
 	struct rk628_pin_bank *bank = pci->pin_banks;
 	struct gpio_chip *gc;
-	int ret, i;
+	int ret = 0, i;
 
 	for (i = 0; i < pci->nr_banks; ++i, ++bank) {
 		bank->gpio_chip = rk628_gpiolib_chip;
 
 		gc = &bank->gpio_chip;
-		gc->base = bank->pin_base;
+		gc->base = -1;
 		gc->ngpio = bank->nr_pins;
 		gc->parent = &pdev->dev;
 		gc->of_node = bank->of_node;
 		gc->label = bank->name;
 
-		ret = gpiochip_add_data(gc, bank);
+		ret = devm_gpiochip_add_data(&pdev->dev, gc, bank);
 		if (ret) {
 			dev_err(&pdev->dev,
 				"failed to register gpio_chip %s, error code: %d\n",
 				gc->label, ret);
-			goto fail;
 		}
 	}
-	return 0;
-
-fail:
-	for (--i, --bank; i >= 0; --i, --bank)
-		gpiochip_remove(&bank->gpio_chip);
 
 	return ret;
 }
@@ -1734,7 +1663,7 @@ static int rk628_pinctrl_probe(struct platform_device *pdev)
 		pin_bank->pci = pci;
 		pin_bank->grange.name = pin_bank->name;
 		pin_bank->grange.id = bank;
-		pin_bank->grange.pin_base = pin_bank->pin_base;
+		pin_bank->grange.pin_base = BANK_OFFSET * bank;
 		pin_bank->grange.base = pin_bank->gpio_chip.base;
 		pin_bank->grange.npins = pin_bank->gpio_chip.ngpio;
 		pin_bank->grange.gc = &pin_bank->gpio_chip;

commit 311506dc961176933b6b5a481682a0035b6b328a
Author: Wyon Bi <bivvy.bi@rock-chips.com>
Date:   Sat Apr 17 18:45:18 2021 +0800

    Revert "ARM: Kconfig: set default gpio number for rockchip SoCs"
    
    This reverts commit 7b5da4c3b9c6ef8d7cd7635b839adfb836edb08a.
    
    After commit 7ca267faba8a ("gpio: Increase ARCH_NR_GPIOs to 512"),
    default ARCH_NR_GPIOS=512.
    
    Change-Id: I028967da6fe2279d62803fb35d9d8874af9dbd11
    Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 4af7afc8bb5c..9dd1d01350f4 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1476,7 +1476,6 @@ config ARCH_NR_GPIO
 	default 416 if ARCH_SUNXI
 	default 392 if ARCH_U8500
 	default 352 if ARCH_VT8500
-	default 288 if ARCH_ROCKCHIP
 	default 264 if MACH_H4700
 	default 0
 	help

commit d12d3e8501ff5aa0e32b8b11e7d6ef533c7627a3
Author: Weixin Zhou <zwx@rock-chips.com>
Date:   Thu Apr 15 20:40:21 2021 +0800

    ARM: dts: rockchip: rk628: Avoid namespace conflicts for pinctrl
    
    Signed-off-by: Weixin Zhou <zwx@rock-chips.com>
    Change-Id: Ibc14654e8b321daebf5b15d51c0de26acb41df91

diff --git a/arch/arm/boot/dts/rk3288-evb-rk628-rgb2dsi-avb.dts b/arch/arm/boot/dts/rk3288-evb-rk628-rgb2dsi-avb.dts
index defa206e2a0d..ca0a9d54befc 100644
--- a/arch/arm/boot/dts/rk3288-evb-rk628-rgb2dsi-avb.dts
+++ b/arch/arm/boot/dts/rk3288-evb-rk628-rgb2dsi-avb.dts
@@ -266,7 +266,7 @@
 
 &rk628_post_process {
 	pinctrl-names = "default";
-	pinctrl-0 = <&vop_pins>;
+	pinctrl-0 = <&rk628_vop_pins>;
 	status = "okay";
 
 	ports {
diff --git a/arch/arm/boot/dts/rk3288-evb-rk628-rgb2hdmi-avb.dts b/arch/arm/boot/dts/rk3288-evb-rk628-rgb2hdmi-avb.dts
index 2d8c6afe5ca4..18ff5ed03d5f 100644
--- a/arch/arm/boot/dts/rk3288-evb-rk628-rgb2hdmi-avb.dts
+++ b/arch/arm/boot/dts/rk3288-evb-rk628-rgb2hdmi-avb.dts
@@ -27,7 +27,7 @@
 
 &rk628_post_process {
 	pinctrl-names = "default";
-	pinctrl-0 = <&vop_pins>;
+	pinctrl-0 = <&rk628_vop_pins>;
 	status = "okay";
 
 	ports {
diff --git a/arch/arm/boot/dts/rk3288-evb-rk628-rgb2lvds-avb.dts b/arch/arm/boot/dts/rk3288-evb-rk628-rgb2lvds-avb.dts
index 62d0e2feb0ad..81577652ae11 100644
--- a/arch/arm/boot/dts/rk3288-evb-rk628-rgb2lvds-avb.dts
+++ b/arch/arm/boot/dts/rk3288-evb-rk628-rgb2lvds-avb.dts
@@ -77,7 +77,7 @@
 
 &rk628_post_process {
 	pinctrl-names = "default";
-	pinctrl-0 = <&vop_pins>;
+	pinctrl-0 = <&rk628_vop_pins>;
 	status = "okay";
 
 	ports {
diff --git a/arch/arm/boot/dts/rk3288-evb-rk628-rgb2lvds-dual-avb.dts b/arch/arm/boot/dts/rk3288-evb-rk628-rgb2lvds-dual-avb.dts
index 2153da4dc2d0..5fa6de887356 100644
--- a/arch/arm/boot/dts/rk3288-evb-rk628-rgb2lvds-dual-avb.dts
+++ b/arch/arm/boot/dts/rk3288-evb-rk628-rgb2lvds-dual-avb.dts
@@ -84,7 +84,7 @@
 
 &rk628_post_process {
 	pinctrl-names = "default";
-	pinctrl-0 = <&vop_pins>;
+	pinctrl-0 = <&rk628_vop_pins>;
 	status = "okay";
 
 	ports {
diff --git a/arch/arm/boot/dts/rk628.dtsi b/arch/arm/boot/dts/rk628.dtsi
index 39b9af6f39dd..47631dbbd23d 100644
--- a/arch/arm/boot/dts/rk628.dtsi
+++ b/arch/arm/boot/dts/rk628.dtsi
@@ -85,7 +85,7 @@
 			#interrupt-cells = <2>;
 		};
 
-		i2sm0_pins: i2sm0 {
+		rk628_i2sm0_pins: i2sm0 {
 			pins = "gpio0a2", /* i2sm0_sck */
 			       "gpio0a3", /* i2sm0_lr */
 			       "gpio0a4", /* i2sm0_d0 */
@@ -95,28 +95,28 @@
 			function = "i2sm0";
 		};
 
-		hpd_in_pins: hpd-in {
+		rk628_hpd_in_pins: hpd-in {
 			pins = "gpio0b0";
 			function = "hpd_in";
 		};
 
-		ddc_tx_pins: ddc-tx {
+		rk628_ddc_tx_pins: ddc-tx {
 			pins = "gpio0b1", /* ddc_tx_sda */
 			       "gpio0b2"; /* ddc_tx_scl */
 			function = "ddc_tx";
 		};
 
-		cec_tx_pins: cec-tx {
+		rk628_cec_tx_pins: cec-tx {
 			pins = "gpio0b3";
 			function = "cec_tx";
 		};
 
-		test_clkout_pins: test-clkout {
+		rk628_test_clkout_pins: test-clkout {
 			pins = "gpio1a0";
 			function = "test_clkout";
 		};
 
-		i2sm1_pins: i2sm1 {
+		rk628_i2sm1_pins: i2sm1 {
 			pins = "gpio1a2", /* i2sm1_sck */
 			       "gpio1a3", /* i2sm1_lr */
 			       "gpio1a4", /* i2sm1_d0 */
@@ -126,23 +126,23 @@
 			function = "i2sm1";
 		};
 
-		hpdm0_out_pins: hpdm0-out {
+		rk628_hpdm0_out_pins: hpdm0-out {
 			pins = "gpio1b0";
 			function = "hpdm0_out";
 		};
 
-		ddcm0_rx_pins: ddcm0-rx {
+		rk628_ddcm0_rx_pins: ddcm0-rx {
 			pins = "gpio1b1", /* ddcm0_rx_sda */
 			       "gpio1b2"; /* ddcm0_rx_scl */
 			function = "ddcm0_rx";
 		};
 
-		cecm0_rx_pins: cecm0_rx {
+		rk628_cecm0_rx_pins: cecm0_rx {
 			pins = "gpio1b3";
 			function = "cecm0_rx";
 		};
 
-		vop_pins: vop {
+		rk628_vop_pins: vop {
 			pins = "gpio2a0", /* vop_d0 */
 			       "gpio2a1", /* vop_d1 */
 			       "gpio2a2", /* vop_d2 */
@@ -175,62 +175,62 @@
 			drive-strength = <1>;
 		};
 
-		hpdm1_out: hpdm1-out {
+		rk628_hpdm1_out: hpdm1-out {
 			pins = "gpio3a4";
 			function = "hpdm1_out";
 		};
 
-		ddcm1_rx_pins: ddcm1-rx {
+		rk628_ddcm1_rx_pins: ddcm1-rx {
 			pins = "gpio3a5", /* ddcm1_rx_sda */
 			       "gpio3a6"; /* ddcm1_rx_scl */
 			function = "ddcm1_rx";
 		};
 
-		cecm1_rx_pins: cecm1-rx {
+		rk628_cecm1_rx_pins: cecm1-rx {
 			pins = "gpio3a7";
 			function = "cecm1_rx";
 		};
 
-		gvi_hpd_pins: gvi-hpd {
+		rk628_gvi_hpd_pins: gvi-hpd {
 			pins = "gpio3b1";
 			function = "gvi_hpd";
 		};
 
-		gvi_lock_pins: gvi-lock {
+		rk628_gvi_lock_pins: gvi-lock {
 			pins = "gpio3b2";
 			function = "gvi_lock";
 		};
 
-		hdmirx_cec0: hdmirx-cec0 {
+		rk628_hdmirx_cec0: hdmirx-cec0 {
 			pins = "hdmirx_cec";
 			function = "hdmirx_cec0";
 		};
 
-		hdmirx_cec1: hdmirx-cec1 {
+		rk628_hdmirx_cec1: hdmirx-cec1 {
 			pins = "hdmirx_cec";
 			function = "hdmirx_cec1";
 		};
 
-		rxddc_input0: rxddc-input0 {
+		rk628_rxddc_input0: rxddc-input0 {
 			pins = "rxddc_scl",
 			       "rxddc_sda";
 			function = "rxddc_input0";
 		};
 
-		rxddc_input1: rxddc-input1 {
+		rk628_rxddc_input1: rxddc-input1 {
 			pins = "rxddc_scl",
 			       "rxddc_sda";
 			function = "rxddc_input1";
 		};
 
-		i2sm0_input: i2sm0-input {
+		rk628_i2sm0_input: i2sm0-input {
 			pins = "i2sm_sck",
 			       "i2sm_d",
 			       "i2sm_lr";
 			function = "i2sm0_input";
 		};
 
-		i2sm1_input: i2sm1-input {
+		rk628_i2sm1_input: i2sm1-input {
 			pins = "i2sm_sck",
 			       "i2sm_d",
 			       "i2sm_lr";
@@ -341,7 +341,7 @@
 			 <&rk628_cru CGU_SCLK_VOP>;
 		clock-names = "pclk", "dclk";
 		pinctrl-names = "default";
-		pinctrl-0 = <&hpd_in_pins &ddc_tx_pins &i2sm0_pins>;
+		pinctrl-0 = <&rk628_hpd_in_pins &rk628_ddc_tx_pins &rk628_i2sm0_pins>;
 		#sound-dai-cells = <0>;
 		status = "disabled";
 	};
@@ -382,7 +382,7 @@
 		phys = <&rk628_combrxphy>, <&rk628_combtxphy>;
 		phy-names = "combrxphy", "combtxphy";
 		pinctrl-names = "default";
-		pinctrl-0 = <&hpdm0_out_pins &ddcm0_rx_pins>;
+		pinctrl-0 = <&rk628_hpdm0_out_pins &rk628_ddcm0_rx_pins>;
 		status = "disabled";
 	};
 };
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10-rk628-bt1120-to-hdmi.dts b/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10-rk628-bt1120-to-hdmi.dts
index 52145abfb645..d5251a5fc17a 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10-rk628-bt1120-to-hdmi.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10-rk628-bt1120-to-hdmi.dts
@@ -49,7 +49,7 @@
 
 &rk628_post_process {
 	pinctrl-names = "default";
-	pinctrl-0 = <&vop_pins>;
+	pinctrl-0 = <&rk628_vop_pins>;
 	status = "okay";
 
 	mode-sync-pol = <0>;
diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10-rk628-rgb2hdmi.dts b/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10-rk628-rgb2hdmi.dts
index 597fa0b0b089..a4759f1ba85e 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10-rk628-rgb2hdmi.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10-rk628-rgb2hdmi.dts
@@ -45,7 +45,7 @@
 
 &rk628_post_process {
 	pinctrl-names = "default";
-	pinctrl-0 = <&vop_pins>;
+	pinctrl-0 = <&rk628_vop_pins>;
 	status = "okay";
 
 	mode-sync-pol = <0>;

commit ed85b3c40168c2fb8df70df295ef5da057c1c62b
Author: Wyon Bi <bivvy.bi@rock-chips.com>
Date:   Thu Apr 15 15:36:50 2021 +0800

    ARM: dts: rockchip: rk628: Avoid namespace conflicts
    
    Add a prefix for all clocks to avoid namespace conflicts,
    and no functional changes.
    
    Change-Id: I1cf1c868f84b9bee4ba033bdd80c4995876b43f1
    Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>

diff --git a/arch/arm/boot/dts/rk628.dtsi b/arch/arm/boot/dts/rk628.dtsi
index 5fc4a552b9ca..39b9af6f39dd 100644
--- a/arch/arm/boot/dts/rk628.dtsi
+++ b/arch/arm/boot/dts/rk628.dtsi
@@ -5,20 +5,20 @@
 #include <dt-bindings/clock/rk628-cgu.h>
 
 / {
-	xin_osc0_func: xin-osc0-func {
+	rk628_xin_osc0_func: rk628-xin-osc0-func {
 		compatible = "fixed-clock";
 		#clock-cells = <0>;
 		clock-frequency = <24000000>;
-		clock-output-names = "xin_osc0_func";
+		clock-output-names = "rk628_xin_osc0_func";
 	};
 
-	xin_osc0_half: xin-osc0-half {
+	rk628_xin_osc0_half: rk628-xin-osc0-half {
 		compatible = "fixed-factor-clock";
 		#clock-cells = <0>;
-		clocks = <&xin_osc0_func>;
+		clocks = <&rk628_xin_osc0_func>;
 		clock-mult = <1>;
 		clock-div = <2>;
-		clock-output-names = "xin_osc0_half";
+		clock-output-names = "rk628_xin_osc0_half";
 	};
 };
 

commit 613d31105b683e44689cff633e1a5329858ac250
Author: Wyon Bi <bivvy.bi@rock-chips.com>
Date:   Thu Apr 15 15:39:31 2021 +0800

    clk/rockchip/regmap: rk628: Avoid namespace conflicts
    
    Add a prefix for all clocks to avoid namespace conflicts,
    and no functional changes.
    
    Change-Id: I6b586ce859ecf084fe6037c10c775d6bcc78baa1
    Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>

diff --git a/drivers/clk/rockchip/regmap/clk-regmap.h b/drivers/clk/rockchip/regmap/clk-regmap.h
index 255c0201a590..4626e1982beb 100644
--- a/drivers/clk/rockchip/regmap/clk-regmap.h
+++ b/drivers/clk/rockchip/regmap/clk-regmap.h
@@ -53,9 +53,6 @@ struct clk_pll_data {
 #define RK618_PLL(_id, _name, _parent_name, _reg, _flags) \
 	PLL(_id, _name, _parent_name, _reg, 10, 9, 15, _flags)
 
-#define RK628_PLL(_id, _name, _parent_name, _reg, _flags) \
-	PLL(_id, _name, _parent_name, _reg, 13, 12, 10, _flags)
-
 struct clk_mux_data {
 	unsigned int id;
 	const char *name;
diff --git a/drivers/clk/rockchip/regmap/clk-rk628.c b/drivers/clk/rockchip/regmap/clk-rk628.c
index 4c3a9eac0e0c..ca81214a07e5 100644
--- a/drivers/clk/rockchip/regmap/clk-rk628.c
+++ b/drivers/clk/rockchip/regmap/clk-rk628.c
@@ -16,6 +16,9 @@
 
 #include "clk-regmap.h"
 
+#define RK628_PLL(_id, _name, _parent_name, _reg, _flags) \
+	PLL(_id, _name, _parent_name, _reg, 13, 12, 10, _flags)
+
 #define REG(x)			((x) + 0xc0000)
 
 #define CRU_CPLL_CON0		REG(0x0000)
@@ -76,17 +79,19 @@ struct rk628_cru {
 
 #define PNAME(x) static const char *const x[]
 
-PNAME(mux_cpll_osc_p) = { "xin_osc0_func", CNAME("clk_cpll") };
-PNAME(mux_gpll_osc_p) = { "xin_osc0_func", CNAME("clk_gpll") };
+PNAME(mux_cpll_osc_p) = { CNAME("xin_osc0_func"), CNAME("clk_cpll") };
+PNAME(mux_gpll_osc_p) = { CNAME("xin_osc0_func"), CNAME("clk_gpll") };
 PNAME(mux_cpll_gpll_mux_p) = { CNAME("clk_cpll_mux"), CNAME("clk_gpll_mux") };
-PNAME(mux_mclk_i2s_8ch_p) = { CNAME("clk_i2s_8ch_src"), CNAME("clk_i2s_8ch_frac"), "i2s_mclkin", "xin_osc0_half" };
-PNAME(mux_i2s_mclkout_p) = { CNAME("mclk_i2s_8ch"), "xin_osc0_half" };
+PNAME(mux_mclk_i2s_8ch_p) = { CNAME("clk_i2s_8ch_src"),
+			      CNAME("clk_i2s_8ch_frac"), CNAME("i2s_mclkin"),
+			      CNAME("xin_osc0_half") };
+PNAME(mux_i2s_mclkout_p) = { CNAME("mclk_i2s_8ch"), CNAME("xin_osc0_half") };
 
 static const struct clk_pll_data rk628_clk_plls[] = {
-	RK628_PLL(CGU_CLK_CPLL, CNAME("clk_cpll"), "xin_osc0_func",
+	RK628_PLL(CGU_CLK_CPLL, CNAME("clk_cpll"), CNAME("xin_osc0_func"),
 		  CRU_CPLL_CON0,
 		  0),
-	RK628_PLL(CGU_CLK_GPLL, CNAME("clk_gpll"), "xin_osc0_func",
+	RK628_PLL(CGU_CLK_GPLL, CNAME("clk_gpll"), CNAME("xin_osc0_func"),
 		  CRU_GPLL_CON0,
 		  0),
 };
@@ -153,13 +158,13 @@ static const struct clk_gate_data rk628_clk_gates[] = {
 	GATE(CGU_PCLK_GVIHOST, CNAME("pclk_gvihost"), CNAME("pclk_logic"),
 	     CRU_GATE_CON02, 5,
 	     0),
-	GATE(CGU_CLK_CFG_DPHY0, CNAME("clk_cfg_dphy0"), "xin_osc0_func",
+	GATE(CGU_CLK_CFG_DPHY0, CNAME("clk_cfg_dphy0"), CNAME("xin_osc0_func"),
 	     CRU_GATE_CON02, 13,
 	     0),
-	GATE(CGU_CLK_CFG_DPHY1, CNAME("clk_cfg_dphy1"), "xin_osc0_func",
+	GATE(CGU_CLK_CFG_DPHY1, CNAME("clk_cfg_dphy1"), CNAME("xin_osc0_func"),
 	     CRU_GATE_CON02, 14,
 	     0),
-	GATE(CGU_CLK_TXESC, CNAME("clk_txesc"), "xin_osc0_func",
+	GATE(CGU_CLK_TXESC, CNAME("clk_txesc"), CNAME("xin_osc0_func"),
 	     CRU_GATE_CON02, 12,
 	     0),
 };
@@ -170,16 +175,19 @@ static const struct clk_composite_data rk628_clk_composites[] = {
 		  CRU_CLKSEL_CON05, 0, 5,
 		  CRU_GATE_CON02, 11,
 		  0),
-	COMPOSITE(CGU_CLK_HDMIRX_AUD, CNAME("clk_hdmirx_aud"), mux_cpll_gpll_mux_p,
+	COMPOSITE(CGU_CLK_HDMIRX_AUD, CNAME("clk_hdmirx_aud"),
+		  mux_cpll_gpll_mux_p,
 		  CRU_CLKSEL_CON05, 15, 1,
 		  CRU_CLKSEL_CON05, 6, 8,
 		  CRU_GATE_CON02, 10,
 		  CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT),
-	COMPOSITE_FRAC_NOMUX(CGU_CLK_HDMIRX_CEC, CNAME("clk_hdmirx_cec"), "xin_osc0_func",
+	COMPOSITE_FRAC_NOMUX(CGU_CLK_HDMIRX_CEC, CNAME("clk_hdmirx_cec"),
+			     CNAME("xin_osc0_func"),
 			     CRU_CLKSEL_CON12,
 			     CRU_GATE_CON01, 15,
 			     0),
-	COMPOSITE_FRAC(CGU_CLK_RX_READ, CNAME("clk_rx_read"), mux_cpll_gpll_mux_p,
+	COMPOSITE_FRAC(CGU_CLK_RX_READ, CNAME("clk_rx_read"),
+		       mux_cpll_gpll_mux_p,
 		       CRU_CLKSEL_CON02, 8, 1,
 		       CRU_CLKSEL_CON14,
 		       CRU_GATE_CON00, 11,
@@ -194,36 +202,44 @@ static const struct clk_composite_data rk628_clk_composites[] = {
 		  CRU_CLKSEL_CON00, 0, 5,
 		  CRU_GATE_CON00, 0,
 		  0),
-	COMPOSITE_NOMUX(CGU_CLK_GPIO_DB0, CNAME("clk_gpio_db0"), "xin_osc0_func",
-		  CRU_CLKSEL_CON08, 0, 10,
-		  CRU_GATE_CON01, 4,
-		  0),
-	COMPOSITE_NOMUX(CGU_CLK_GPIO_DB1, CNAME("clk_gpio_db1"), "xin_osc0_func",
-		  CRU_CLKSEL_CON09, 0, 10,
-		  CRU_GATE_CON01, 5,
-		  0),
-	COMPOSITE_NOMUX(CGU_CLK_GPIO_DB2, CNAME("clk_gpio_db2"), "xin_osc0_func",
-		  CRU_CLKSEL_CON10, 0, 10,
-		  CRU_GATE_CON01, 6,
-		  0),
-	COMPOSITE_NOMUX(CGU_CLK_GPIO_DB3, CNAME("clk_gpio_db3"), "xin_osc0_func",
-		  CRU_CLKSEL_CON11, 0, 10,
-		  CRU_GATE_CON01, 7,
-		  0),
-	COMPOSITE(CGU_CLK_I2S_8CH_SRC, CNAME("clk_i2s_8ch_src"), mux_cpll_gpll_mux_p,
+	COMPOSITE_NOMUX(CGU_CLK_GPIO_DB0, CNAME("clk_gpio_db0"),
+			CNAME("xin_osc0_func"),
+			CRU_CLKSEL_CON08, 0, 10,
+			CRU_GATE_CON01, 4,
+			0),
+	COMPOSITE_NOMUX(CGU_CLK_GPIO_DB1, CNAME("clk_gpio_db1"),
+			CNAME("xin_osc0_func"),
+			CRU_CLKSEL_CON09, 0, 10,
+			CRU_GATE_CON01, 5,
+			0),
+	COMPOSITE_NOMUX(CGU_CLK_GPIO_DB2, CNAME("clk_gpio_db2"),
+			CNAME("xin_osc0_func"),
+			CRU_CLKSEL_CON10, 0, 10,
+			CRU_GATE_CON01, 6,
+			0),
+	COMPOSITE_NOMUX(CGU_CLK_GPIO_DB3, CNAME("clk_gpio_db3"),
+			CNAME("xin_osc0_func"),
+			CRU_CLKSEL_CON11, 0, 10,
+			CRU_GATE_CON01, 7,
+			0),
+	COMPOSITE(CGU_CLK_I2S_8CH_SRC, CNAME("clk_i2s_8ch_src"),
+		  mux_cpll_gpll_mux_p,
 		  CRU_CLKSEL_CON03, 13, 1,
 		  CRU_CLKSEL_CON03, 8, 5,
 		  CRU_GATE_CON03, 9,
 		  0),
-	COMPOSITE_FRAC_NOMUX(CGU_CLK_I2S_8CH_FRAC, CNAME("clk_i2s_8ch_frac"), CNAME("clk_i2s_8ch_src"),
+	COMPOSITE_FRAC_NOMUX(CGU_CLK_I2S_8CH_FRAC, CNAME("clk_i2s_8ch_frac"),
+			     CNAME("clk_i2s_8ch_src"),
 			     CRU_CLKSEL_CON04,
 			     CRU_GATE_CON03, 10,
 			     0),
-	COMPOSITE_NODIV(CGU_MCLK_I2S_8CH, CNAME("mclk_i2s_8ch"), mux_mclk_i2s_8ch_p,
+	COMPOSITE_NODIV(CGU_MCLK_I2S_8CH, CNAME("mclk_i2s_8ch"),
+			mux_mclk_i2s_8ch_p,
 			CRU_CLKSEL_CON03, 14, 2,
 			CRU_GATE_CON03, 11,
 			CLK_SET_RATE_PARENT),
-	COMPOSITE_NODIV(CGU_I2S_MCLKOUT, CNAME("i2s_mclkout"), mux_i2s_mclkout_p,
+	COMPOSITE_NODIV(CGU_I2S_MCLKOUT, CNAME("i2s_mclkout"),
+			mux_i2s_mclkout_p,
 			CRU_CLKSEL_CON03, 7, 1,
 			CRU_GATE_CON03, 12,
 			CLK_SET_RATE_PARENT),

commit a2f7ea78f2d1c6c528717ce1d1052657b8c7ff06
Author: Caesar Wang <wxt@rock-chips.com>
Date:   Thu Apr 29 19:21:27 2021 +0800

    arm64/configs: update rockchip_linux_defconfig
    
    1) enable rk628 configure
    2) enable CONFIG_NTFS_FS
    3) enable CONFIG_RK_HEADSET
    
    Signed-off-by: Caesar Wang <wxt@rock-chips.com>
    Change-Id: Ie66c1ca860fc53342dc5b8fad012f3e996b61c33

diff --git a/arch/arm64/configs/rockchip_linux_defconfig b/arch/arm64/configs/rockchip_linux_defconfig
index c9b3b30718bf..6aac6bc2b8fb 100644
--- a/arch/arm64/configs/rockchip_linux_defconfig
+++ b/arch/arm64/configs/rockchip_linux_defconfig
@@ -272,6 +272,7 @@ CONFIG_WATCHDOG=y
 CONFIG_DW_WATCHDOG=y
 CONFIG_MFD_CROS_EC=y
 CONFIG_MFD_RK618=y
+CONFIG_MFD_RK628=y
 CONFIG_MFD_RK808=y
 CONFIG_MFD_TPS6586X=y
 CONFIG_FUSB_30X=y
@@ -378,18 +379,17 @@ CONFIG_SND_SOC_ROCKCHIP_SPDIF=y
 CONFIG_SND_SOC_ROCKCHIP_MAX98090=y
 CONFIG_SND_SOC_ROCKCHIP_MULTICODECS=y
 CONFIG_SND_SOC_ROCKCHIP_RT5645=y
+CONFIG_SND_SOC_ROCKCHIP_RT5651_RK628=y
 CONFIG_SND_SOC_DUMMY_CODEC=y
 CONFIG_SND_SOC_ES7202=y
 CONFIG_SND_SOC_ES7243E=y
 CONFIG_SND_SOC_ES8311=y
 CONFIG_SND_SOC_ES8316=y
-CONFIG_SND_SOC_RK3308=y
 CONFIG_SND_SOC_RK3328=y
 CONFIG_SND_SOC_RK817=y
 CONFIG_SND_SOC_RK_CODEC_DIGITAL=y
 CONFIG_SND_SOC_RT5616=y
 CONFIG_SND_SOC_RT5640=y
-CONFIG_SND_SOC_RT5651=y
 CONFIG_SND_SOC_SPDIF=y
 CONFIG_SND_SIMPLE_CARD=y
 CONFIG_HID_BATTERY_STRENGTH=y
@@ -516,6 +516,7 @@ CONFIG_RK_SFC_NAND=y
 CONFIG_RK_SFC_NAND_MTD=y
 CONFIG_RK_SFC_NOR=y
 CONFIG_RK_SFC_NOR_MTD=y
+CONFIG_RK_HEADSET=y
 CONFIG_EXT4_FS=y
 CONFIG_EXT4_FS_POSIX_ACL=y
 CONFIG_EXT4_FS_SECURITY=y
@@ -528,6 +529,7 @@ CONFIG_ZISOFS=y
 CONFIG_VFAT_FS=y
 CONFIG_FAT_DEFAULT_CODEPAGE=936
 CONFIG_FAT_DEFAULT_IOCHARSET="utf8"
+CONFIG_NTFS_FS=y
 CONFIG_TMPFS=y
 CONFIG_TMPFS_POSIX_ACL=y
 CONFIG_JFFS2_FS=y

commit e68e6d1a35b77d14a9508507c026bf198024920b
Author: Jianqun Xu <jay.xu@rock-chips.com>
Date:   Fri Apr 30 10:46:43 2021 +0800

    drm/rockchip: add dmabuf sync partial to dma_buf_ops
    
    Change-Id: I6ba192c11a0ff9eeafa4f4f0260addb1e56c4afc
    Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index 700fb6bdf4b8..3e906dce5311 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -1820,6 +1820,26 @@ static int rockchip_drm_gem_dmabuf_end_cpu_access(struct dma_buf *dma_buf,
 	return rockchip_gem_prime_end_cpu_access(obj, dir);
 }
 
+static int rockchip_drm_gem_begin_cpu_access_partial(
+	struct dma_buf *dma_buf,
+	enum dma_data_direction dir,
+	unsigned int offset, unsigned int len)
+{
+	struct drm_gem_object *obj = dma_buf->priv;
+
+	return rockchip_gem_prime_begin_cpu_access_partial(obj, dir, offset, len);
+}
+
+static int rockchip_drm_gem_end_cpu_access_partial(
+	struct dma_buf *dma_buf,
+	enum dma_data_direction dir,
+	unsigned int offset, unsigned int len)
+{
+	struct drm_gem_object *obj = dma_buf->priv;
+
+	return rockchip_gem_prime_end_cpu_access_partial(obj, dir, offset, len);
+}
+
 static const struct dma_buf_ops rockchip_drm_gem_prime_dmabuf_ops = {
 	.attach = drm_gem_map_attach,
 	.detach = drm_gem_map_detach,
@@ -1833,6 +1853,8 @@ static const struct dma_buf_ops rockchip_drm_gem_prime_dmabuf_ops = {
 	.vunmap = drm_gem_dmabuf_vunmap,
 	.begin_cpu_access = rockchip_drm_gem_dmabuf_begin_cpu_access,
 	.end_cpu_access = rockchip_drm_gem_dmabuf_end_cpu_access,
+	.begin_cpu_access_partial = rockchip_drm_gem_begin_cpu_access_partial,
+	.end_cpu_access_partial = rockchip_drm_gem_end_cpu_access_partial,
 };
 
 #ifdef CONFIG_ARCH_ROCKCHIP
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
index 55001f42a72d..ef49d5e46736 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
@@ -1027,3 +1027,95 @@ int rockchip_gem_prime_end_cpu_access(struct drm_gem_object *obj,
 			       rk_obj->sgt->nents, dir);
 	return 0;
 }
+
+static int rockchip_gem_prime_sgl_sync_range(struct device *dev,
+					struct scatterlist *sgl, unsigned int nents,
+					unsigned int offset, unsigned int length,
+					enum dma_data_direction dir, bool for_cpu)
+{
+	int i;
+	struct scatterlist *sg;
+	unsigned int len = 0;
+	dma_addr_t sg_dma_addr;
+
+	for_each_sg(sgl, sg, nents, i) {
+		if (sg_dma_len(sg) == 0)
+			break;
+
+		if (i > 0) {
+			pr_warn_ratelimited("Partial cmo only supported with 1 segment\n"
+				"is dma_set_max_seg_size being set on dev:%s\n",
+				dev_name(dev));
+			return -EINVAL;
+		}
+	}
+
+	for_each_sg(sgl, sg, nents, i) {
+		unsigned int sg_offset, sg_left, size = 0;
+
+		if (i == 0)
+			sg_dma_addr = sg_dma_address(sg);
+
+		len += sg->length;
+		if (len <= offset) {
+			sg_dma_addr += sg->length;
+			continue;
+		}
+
+		sg_left = len - offset;
+		sg_offset = sg->length - sg_left;
+
+		size = (length < sg_left) ? length : sg_left;
+		if (for_cpu)
+			dma_sync_single_range_for_cpu(dev, sg_dma_addr,
+						      sg_offset, size, dir);
+		else
+			dma_sync_single_range_for_device(dev, sg_dma_addr,
+							 sg_offset, size, dir);
+
+		offset += size;
+		length -= size;
+		sg_dma_addr += sg->length;
+
+		if (length == 0)
+			break;
+	}
+
+	return 0;
+}
+
+int rockchip_gem_prime_begin_cpu_access_partial(struct drm_gem_object *obj,
+						enum dma_data_direction dir,
+						unsigned int offset,
+						unsigned int len)
+{
+	struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj);
+	struct drm_device *drm = obj->dev;
+
+	if (!rk_obj->sgt)
+		return 0;
+
+	rockchip_gem_prime_sgl_sync_range(drm->dev, rk_obj->sgt->sgl,
+					  rk_obj->sgt->nents,
+					  offset, len, dir, true);
+
+	return 0;
+}
+
+int rockchip_gem_prime_end_cpu_access_partial(struct drm_gem_object *obj,
+					      enum dma_data_direction dir,
+					      unsigned int offset,
+					      unsigned int len)
+{
+	struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj);
+	struct drm_device *drm = obj->dev;
+
+	if (!rk_obj->sgt)
+		return 0;
+
+	rockchip_gem_prime_sgl_sync_range(drm->dev, rk_obj->sgt->sgl,
+					  rk_obj->sgt->nents,
+					  offset, len, dir, false);
+
+	return 0;
+}
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h
index 9b3b01ede8ec..2b299b848465 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h
@@ -91,4 +91,15 @@ int rockchip_gem_prime_begin_cpu_access(struct drm_gem_object *obj,
 
 int rockchip_gem_prime_end_cpu_access(struct drm_gem_object *obj,
 				      enum dma_data_direction dir);
+
+int rockchip_gem_prime_begin_cpu_access_partial(struct drm_gem_object *obj,
+						enum dma_data_direction dir,
+						unsigned int offset,
+						unsigned int len);
+
+int rockchip_gem_prime_end_cpu_access_partial(struct drm_gem_object *obj,
+					      enum dma_data_direction dir,
+					      unsigned int offset,
+					      unsigned int len);
+
 #endif /* _ROCKCHIP_DRM_GEM_H */

commit 8d73d218b347d9b40e9abba9e4b0293520944103
Author: Tao Huang <huangtao@rock-chips.com>
Date:   Fri May 7 17:14:48 2021 +0800

    video: rockchip: mpp: rkvdec2: Fix compile warning on ARM
    
    drivers/video/rockchip/mpp/mpp_rkvdec2.c:1029:16: warning:
    format '%llx' expects argument of type 'long long unsigned int',
    but argument 3 has type 'resource_size_t {aka unsigned int}' [-Wformat=]
    
    Signed-off-by: Tao Huang <huangtao@rock-chips.com>
    Change-Id: I5bb3ac3a2d5d2d41c802e42ed6a26efb5219d0aa

diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2.c b/drivers/video/rockchip/mpp/mpp_rkvdec2.c
index d765052ecfd8..e25ad4e10d9a 100644
--- a/drivers/video/rockchip/mpp/mpp_rkvdec2.c
+++ b/drivers/video/rockchip/mpp/mpp_rkvdec2.c
@@ -1026,8 +1026,8 @@ static int rkvdec2_alloc_rcbbuf(struct platform_device *pdev, struct rkvdec2_dev
 	sram_start = round_up(sram_res.start, PAGE_SIZE);
 	sram_end = round_down(sram_res.start + resource_size(&sram_res), PAGE_SIZE);
 	if (sram_end <= sram_start) {
-		dev_err(dev, "no available sram, phy_start %llx, phy_end %llx\n",
-			sram_start, sram_end);
+		dev_err(dev, "no available sram, phy_start %pa, phy_end %pa\n",
+			&sram_start, &sram_end);
 		return -ENOMEM;
 	}
 	sram_size = sram_end - sram_start;

commit 98fdba74e14c520f856d27103fa0b56d491d9c5e
Author: Ding Wei <leo.ding@rock-chips.com>
Date:   Fri May 7 16:03:51 2021 +0800

    video: rockchip: mpp: when meet unknown cmd, not return error.
    
    reason: when kernel version later than mpp which user space, then
    it will meet unknow cmd. however, it should not return error, and
    let it continue instead.
    
    Change-Id: I1209c27ef8de98f25b47700bc48dfcff305e0c0e
    Signed-off-by: Ding Wei <leo.ding@rock-chips.com>

diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c
index 76a28014988c..4d42ad53fda7 100644
--- a/drivers/video/rockchip/mpp/mpp_common.c
+++ b/drivers/video/rockchip/mpp/mpp_common.c
@@ -1110,7 +1110,6 @@ static int mpp_process_request(struct mpp_session *session,
 			return mpp->dev_ops->ioctl(session, req);
 
 		mpp_debug(DEBUG_IOCTL, "unknown mpp ioctl cmd %x\n", req->cmd);
-		return -ENOIOCTLCMD;
 	} break;
 	}
 

commit d6db4040f4c5227af2c729268bb20979db43e662
Author: Fenrir Lin <fenrir.lin@rock-chips.com>
Date:   Thu May 6 17:21:54 2021 +0800

    media: platform: rockchip: cif: avoid initcall later than isp
    
    Signed-off-by: Fenrir Lin <fenrir.lin@rock-chips.com>
    Change-Id: Ic69f50d9d2c9b87d1e701badab6d2538f5c191ed

diff --git a/drivers/media/platform/rockchip/cif/dev.c b/drivers/media/platform/rockchip/cif/dev.c
index ce35ecf8cffa..8f6458094320 100644
--- a/drivers/media/platform/rockchip/cif/dev.c
+++ b/drivers/media/platform/rockchip/cif/dev.c
@@ -1266,7 +1266,7 @@ static int __init rkcif_clr_unready_dev(void)
 
 	return 0;
 }
-late_initcall_sync(rkcif_clr_unready_dev);
+late_initcall(rkcif_clr_unready_dev);
 #endif
 
 static const struct dev_pm_ops rkcif_plat_pm_ops = {

commit 8ce2f3d6f2dd0bd731c2baf201191797d6af0c2e
Merge: 61410d717543 3c8c23092588
Author: Greg Kroah-Hartman <gregkh@google.com>
Date:   Fri May 7 11:09:49 2021 +0200

    Merge 4.19.190 into android-4.19-stable
    
    Changes in 4.19.190
            erofs: fix extended inode could cross boundary
            ACPI: tables: x86: Reserve memory occupied by ACPI tables
            ACPI: x86: Call acpi_boot_table_init() after acpi_table_upgrade()
            net: usb: ax88179_178a: initialize local variables before use
            iwlwifi: Fix softirq/hardirq disabling in iwl_pcie_enqueue_hcmd()
            mips: Do not include hi and lo in clobber list for R6
            bpf: Fix masking negation logic upon negative dst register
            iwlwifi: Fix softirq/hardirq disabling in iwl_pcie_gen2_enqueue_hcmd()
            ALSA: usb-audio: Add MIDI quirk for Vox ToneLab EX
            USB: Add LPM quirk for Lenovo ThinkPad USB-C Dock Gen2 Ethernet
            USB: Add reset-resume quirk for WD19's Realtek Hub
            platform/x86: thinkpad_acpi: Correct thermal sensor allocation
            ovl: allow upperdir inside lowerdir
            Linux 4.19.190
    
    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: Ic34f20acac4f14f3d6c659086fcf5dfe6c3fed04

commit 3c8c23092588a23bf1856a64f58c37f477a413be
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Fri May 7 10:49:26 2021 +0200

    Linux 4.19.190
    
    Tested-by: Jon Hunter <jonathanh@nvidia.com>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Jason Self <jason@bluehome.net>
    Tested-by: Guenter Roeck <linux@roeck-us.net>
    Tested-by: Linux Kernel Functional Testing <lkft@linaro.org>
    Tested-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
    Tested-by: Pavel Machek (CIP) <pavel@denx.de>
    Tested-by: Hulk Robot <hulkrobot@huawei.com>
    Link: https://lore.kernel.org/r/20210505120503.781531508@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/Makefile b/Makefile
index b19e0e7b7eb3..c813c3bb7405 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 189
+SUBLEVEL = 190
 EXTRAVERSION =
 NAME = "People's Front"
 

commit a130ed5212c3dfff88065db4f62c29bb184748d4
Author: Miklos Szeredi <mszeredi@redhat.com>
Date:   Mon Apr 12 12:00:37 2021 +0200

    ovl: allow upperdir inside lowerdir
    
    commit 708fa01597fa002599756bf56a96d0de1677375c upstream.
    
    Commit 146d62e5a586 ("ovl: detect overlapping layers") made sure we don't
    have overlapping layers, but it also broke the arguably valid use case of
    
     mount -olowerdir=/,upperdir=/subdir,..
    
    where upperdir overlaps lowerdir on the same filesystem.  This has been
    causing regressions.
    
    Revert the check, but only for the specific case where upperdir and/or
    workdir are subdirectories of lowerdir.  Any other overlap (e.g. lowerdir
    is subdirectory of upperdir, etc) case is crazy, so leave the check in
    place for those.
    
    Overlaps are detected at lookup time too, so reverting the mount time check
    should be safe.
    
    Fixes: 146d62e5a586 ("ovl: detect overlapping layers")
    Cc: <stable@vger.kernel.org> # v5.2
    Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
index f0dc432a3ceb..c97d8d251eb9 100644
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -1479,7 +1479,8 @@ static struct ovl_entry *ovl_get_lowerstack(struct super_block *sb,
  * - upper/work dir of any overlayfs instance
  */
 static int ovl_check_layer(struct super_block *sb, struct ovl_fs *ofs,
-			   struct dentry *dentry, const char *name)
+			   struct dentry *dentry, const char *name,
+			   bool is_lower)
 {
 	struct dentry *next = dentry, *parent;
 	int err = 0;
@@ -1491,7 +1492,7 @@ static int ovl_check_layer(struct super_block *sb, struct ovl_fs *ofs,
 
 	/* Walk back ancestors to root (inclusive) looking for traps */
 	while (!err && parent != next) {
-		if (ovl_lookup_trap_inode(sb, parent)) {
+		if (is_lower && ovl_lookup_trap_inode(sb, parent)) {
 			err = -ELOOP;
 			pr_err("overlayfs: overlapping %s path\n", name);
 		} else if (ovl_is_inuse(parent)) {
@@ -1517,7 +1518,7 @@ static int ovl_check_overlapping_layers(struct super_block *sb,
 
 	if (ofs->upper_mnt) {
 		err = ovl_check_layer(sb, ofs, ofs->upper_mnt->mnt_root,
-				      "upperdir");
+				      "upperdir", false);
 		if (err)
 			return err;
 
@@ -1528,7 +1529,8 @@ static int ovl_check_overlapping_layers(struct super_block *sb,
 		 * workbasedir.  In that case, we already have their traps in
 		 * inode cache and we will catch that case on lookup.
 		 */
-		err = ovl_check_layer(sb, ofs, ofs->workbasedir, "workdir");
+		err = ovl_check_layer(sb, ofs, ofs->workbasedir, "workdir",
+				      false);
 		if (err)
 			return err;
 	}
@@ -1536,7 +1538,7 @@ static int ovl_check_overlapping_layers(struct super_block *sb,
 	for (i = 0; i < ofs->numlower; i++) {
 		err = ovl_check_layer(sb, ofs,
 				      ofs->lower_layers[i].mnt->mnt_root,
-				      "lowerdir");
+				      "lowerdir", true);
 		if (err)
 			return err;
 	}

commit 7642c940f11e4135471c3f1df484cea899060e87
Author: Mark Pearson <markpearson@lenovo.com>
Date:   Wed Apr 7 17:20:15 2021 -0400

    platform/x86: thinkpad_acpi: Correct thermal sensor allocation
    
    commit 6759e18e5cd8745a5dfc5726e4a3db5281ec1639 upstream.
    
    On recent Thinkpad platforms it was reported that temp sensor 11 was
    always incorrectly displaying 66C. It turns out the reason for this is
    that this location in EC RAM is not a temperature sensor but is the
    power supply ID (offset 0xC2).
    
    Based on feedback from the Lenovo firmware team the EC RAM version can
    be determined and for the current version (3) only the 0x78 to 0x7F
    range is used for temp sensors. I don't have any details for earlier
    versions so I have left the implementation unaltered there.
    
    Note - in this block only 0x78 and 0x79 are officially designated (CPU &
    GPU sensors). The use of the other locations in the block will vary from
    platform to platform; but the existing logic to detect a sensor presence
    holds.
    
    Signed-off-by: Mark Pearson <markpearson@lenovo.com>
    Link: https://lore.kernel.org/r/20210407212015.298222-1-markpearson@lenovo.com
    Reviewed-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
index 559698640fe2..35c7d3185fea 100644
--- a/drivers/platform/x86/thinkpad_acpi.c
+++ b/drivers/platform/x86/thinkpad_acpi.c
@@ -6300,6 +6300,7 @@ enum thermal_access_mode {
 enum { /* TPACPI_THERMAL_TPEC_* */
 	TP_EC_THERMAL_TMP0 = 0x78,	/* ACPI EC regs TMP 0..7 */
 	TP_EC_THERMAL_TMP8 = 0xC0,	/* ACPI EC regs TMP 8..15 */
+	TP_EC_FUNCREV      = 0xEF,      /* ACPI EC Functional revision */
 	TP_EC_THERMAL_TMP_NA = -128,	/* ACPI EC sensor not available */
 
 	TPACPI_THERMAL_SENSOR_NA = -128000, /* Sensor not available */
@@ -6498,7 +6499,7 @@ static const struct attribute_group thermal_temp_input8_group = {
 
 static int __init thermal_init(struct ibm_init_struct *iibm)
 {
-	u8 t, ta1, ta2;
+	u8 t, ta1, ta2, ver = 0;
 	int i;
 	int acpi_tmp7;
 	int res;
@@ -6513,7 +6514,14 @@ static int __init thermal_init(struct ibm_init_struct *iibm)
 		 * 0x78-0x7F, 0xC0-0xC7.  Registers return 0x00 for
 		 * non-implemented, thermal sensors return 0x80 when
 		 * not available
+		 * The above rule is unfortunately flawed. This has been seen with
+		 * 0xC2 (power supply ID) causing thermal control problems.
+		 * The EC version can be determined by offset 0xEF and at least for
+		 * version 3 the Lenovo firmware team confirmed that registers 0xC0-0xC7
+		 * are not thermal registers.
 		 */
+		if (!acpi_ec_read(TP_EC_FUNCREV, &ver))
+			pr_warn("Thinkpad ACPI EC unable to access EC version\n");
 
 		ta1 = ta2 = 0;
 		for (i = 0; i < 8; i++) {
@@ -6523,11 +6531,13 @@ static int __init thermal_init(struct ibm_init_struct *iibm)
 				ta1 = 0;
 				break;
 			}
-			if (acpi_ec_read(TP_EC_THERMAL_TMP8 + i, &t)) {
-				ta2 |= t;
-			} else {
-				ta1 = 0;
-				break;
+			if (ver < 3) {
+				if (acpi_ec_read(TP_EC_THERMAL_TMP8 + i, &t)) {
+					ta2 |= t;
+				} else {
+					ta1 = 0;
+					break;
+				}
 			}
 		}
 		if (ta1 == 0) {
@@ -6540,9 +6550,12 @@ static int __init thermal_init(struct ibm_init_struct *iibm)
 				thermal_read_mode = TPACPI_THERMAL_NONE;
 			}
 		} else {
-			thermal_read_mode =
-			    (ta2 != 0) ?
-			    TPACPI_THERMAL_TPEC_16 : TPACPI_THERMAL_TPEC_8;
+			if (ver >= 3)
+				thermal_read_mode = TPACPI_THERMAL_TPEC_8;
+			else
+				thermal_read_mode =
+					(ta2 != 0) ?
+					TPACPI_THERMAL_TPEC_16 : TPACPI_THERMAL_TPEC_8;
 		}
 	} else if (acpi_tmp7) {
 		if (tpacpi_is_ibm() &&

commit ca3c407ba6a78184aa7cafe101ce36e8e862be08
Author: Chris Chiu <chris.chiu@canonical.com>
Date:   Wed Apr 21 01:46:51 2021 +0800

    USB: Add reset-resume quirk for WD19's Realtek Hub
    
    commit ca91fd8c7643d93bfc18a6fec1a0d3972a46a18a upstream.
    
    Realtek Hub (0bda:5487) in Dell Dock WD19 sometimes fails to work
    after the system resumes from suspend with remote wakeup enabled
    device connected:
    [ 1947.640907] hub 5-2.3:1.0: hub_ext_port_status failed (err = -71)
    [ 1947.641208] usb 5-2.3-port5: cannot disable (err = -71)
    [ 1947.641401] hub 5-2.3:1.0: hub_ext_port_status failed (err = -71)
    [ 1947.641450] usb 5-2.3-port4: cannot reset (err = -71)
    
    Information of this hub:
    T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 10 Spd=480  MxCh= 5
    D:  Ver= 2.10 Cls=09(hub  ) Sub=00 Prot=02 MxPS=64 #Cfgs=  1
    P:  Vendor=0bda ProdID=5487 Rev= 1.47
    S:  Manufacturer=Dell Inc.
    S:  Product=Dell dock
    C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=  0mA
    I:  If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=01 Driver=hub
    E:  Ad=81(I) Atr=03(Int.) MxPS=   1 Ivl=256ms
    I:* If#= 0 Alt= 1 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=02 Driver=hub
    E:  Ad=81(I) Atr=03(Int.) MxPS=   1 Ivl=256ms
    
    The failure results from the ETIMEDOUT by chance when turning on
    the suspend feature for the specified port of the hub. The port
    seems to be in an unknown state so the hub_activate during resume
    fails the hub_port_status, then the hub will fail to work.
    
    The quirky hub needs the reset-resume quirk to function correctly.
    
    Acked-by: Alan Stern <stern@rowland.harvard.edu>
    Signed-off-by: Chris Chiu <chris.chiu@canonical.com>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210420174651.6202-1-chris.chiu@canonical.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
index 21df897c6cf3..f6a6c54cba35 100644
--- a/drivers/usb/core/quirks.c
+++ b/drivers/usb/core/quirks.c
@@ -406,6 +406,7 @@ static const struct usb_device_id usb_quirk_list[] = {
 
 	/* Realtek hub in Dell WD19 (Type-C) */
 	{ USB_DEVICE(0x0bda, 0x0487), .driver_info = USB_QUIRK_NO_LPM },
+	{ USB_DEVICE(0x0bda, 0x5487), .driver_info = USB_QUIRK_RESET_RESUME },
 
 	/* Generic RTL8153 based ethernet adapters */
 	{ USB_DEVICE(0x0bda, 0x8153), .driver_info = USB_QUIRK_NO_LPM },

commit add1c1a8446a7d966041391cf3885fe76604e11a
Author: Kai-Heng Feng <kai.heng.feng@canonical.com>
Date:   Mon Apr 12 21:54:53 2021 +0800

    USB: Add LPM quirk for Lenovo ThinkPad USB-C Dock Gen2 Ethernet
    
    commit 8f23fe35ff1e5491b4d279323a8209a31f03ae65 upstream.
    
    This is another branded 8153 device that doesn't work well with LPM
    enabled:
    [ 400.597506] r8152 5-1.1:1.0 enx482ae3a2a6f0: Tx status -71
    
    So disable LPM to resolve the issue.
    
    Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
    BugLink: https://bugs.launchpad.net/bugs/1922651
    Link: https://lore.kernel.org/r/20210412135455.791971-1-kai.heng.feng@canonical.com
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
index b8a4707dfafa..21df897c6cf3 100644
--- a/drivers/usb/core/quirks.c
+++ b/drivers/usb/core/quirks.c
@@ -438,6 +438,9 @@ static const struct usb_device_id usb_quirk_list[] = {
 	{ USB_DEVICE(0x17ef, 0xa012), .driver_info =
 			USB_QUIRK_DISCONNECT_SUSPEND },
 
+	/* Lenovo ThinkPad USB-C Dock Gen2 Ethernet (RTL8153 GigE) */
+	{ USB_DEVICE(0x17ef, 0xa387), .driver_info = USB_QUIRK_NO_LPM },
+
 	/* BUILDWIN Photo Frame */
 	{ USB_DEVICE(0x1908, 0x1315), .driver_info =
 			USB_QUIRK_HONOR_BNUMINTERFACES },

commit 04491ecf82ebe94426c9866ecac8e53ee8ce6516
Author: Takashi Iwai <tiwai@suse.de>
Date:   Wed Apr 7 16:45:49 2021 +0200

    ALSA: usb-audio: Add MIDI quirk for Vox ToneLab EX
    
    commit 64f40f9be14106e7df0098c427cb60be645bddb7 upstream.
    
    ToneLab EX guitar pedal device requires the same quirk like ToneLab ST
    for supporting the MIDI.
    
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=212593
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210407144549.1530-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h
index 83f72ddf4fda..81304c2c1124 100644
--- a/sound/usb/quirks-table.h
+++ b/sound/usb/quirks-table.h
@@ -2499,6 +2499,16 @@ YAMAHA_DEVICE(0x7010, "UB99"),
 	}
 },
 
+{
+	USB_DEVICE_VENDOR_SPEC(0x0944, 0x0204),
+	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+		.vendor_name = "KORG, Inc.",
+		/* .product_name = "ToneLab EX", */
+		.ifnum = 3,
+		.type = QUIRK_MIDI_STANDARD_INTERFACE,
+	}
+},
+
 /* AKAI devices */
 {
 	USB_DEVICE(0x09e8, 0x0062),

commit d1273e1a735e758413af40b12f30434e13fc426e
Author: Jiri Kosina <jkosina@suse.cz>
Date:   Sat Apr 17 11:13:39 2021 +0200

    iwlwifi: Fix softirq/hardirq disabling in iwl_pcie_gen2_enqueue_hcmd()
    
    commit e7020bb068d8be50a92f48e36b236a1a1ef9282e upstream.
    
    Analogically to what we did in 2800aadc18a6 ("iwlwifi: Fix softirq/hardirq
    disabling in iwl_pcie_enqueue_hcmd()"), we must apply the same fix to
    iwl_pcie_gen2_enqueue_hcmd(), as it's being called from exactly the same
    contexts.
    
    Reported-by: Heiner Kallweit <hkallweit1@gmail.com
    Signed-off-by: Jiri Kosina <jkosina@suse.cz>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/nycvar.YFH.7.76.2104171112390.18270@cbobk.fhfr.pm
    Signed-off-by: Jari Ruusu <jariruusu@protonmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c
index 93f396d7e684..dea29a69aaf6 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c
@@ -654,6 +654,7 @@ static int iwl_pcie_gen2_enqueue_hcmd(struct iwl_trans *trans,
 	const u8 *cmddata[IWL_MAX_CMD_TBS_PER_TFD];
 	u16 cmdlen[IWL_MAX_CMD_TBS_PER_TFD];
 	struct iwl_tfh_tfd *tfd;
+	unsigned long flags2;
 
 	copy_size = sizeof(struct iwl_cmd_header_wide);
 	cmd_size = sizeof(struct iwl_cmd_header_wide);
@@ -722,14 +723,14 @@ static int iwl_pcie_gen2_enqueue_hcmd(struct iwl_trans *trans,
 		goto free_dup_buf;
 	}
 
-	spin_lock_bh(&txq->lock);
+	spin_lock_irqsave(&txq->lock, flags2);
 
 	idx = iwl_pcie_get_cmd_index(txq, txq->write_ptr);
 	tfd = iwl_pcie_get_tfd(trans, txq, txq->write_ptr);
 	memset(tfd, 0, sizeof(*tfd));
 
 	if (iwl_queue_space(trans, txq) < ((cmd->flags & CMD_ASYNC) ? 2 : 1)) {
-		spin_unlock_bh(&txq->lock);
+		spin_unlock_irqrestore(&txq->lock, flags2);
 
 		IWL_ERR(trans, "No space in command queue\n");
 		iwl_op_mode_cmd_queue_full(trans->op_mode);
@@ -870,7 +871,7 @@ static int iwl_pcie_gen2_enqueue_hcmd(struct iwl_trans *trans,
 	spin_unlock_irqrestore(&trans_pcie->reg_lock, flags);
 
 out:
-	spin_unlock_bh(&txq->lock);
+	spin_unlock_irqrestore(&txq->lock, flags2);
 free_dup_buf:
 	if (idx < 0)
 		kfree(dup_buf);

commit 0e2dfdc74a7f4036127356d42ea59388f153f42c
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Fri Apr 30 16:21:46 2021 +0200

    bpf: Fix masking negation logic upon negative dst register
    
    commit b9b34ddbe2076ade359cd5ce7537d5ed019e9807 upstream.
    
    The negation logic for the case where the off_reg is sitting in the
    dst register is not correct given then we cannot just invert the add
    to a sub or vice versa. As a fix, perform the final bitwise and-op
    unconditionally into AX from the off_reg, then move the pointer from
    the src to dst and finally use AX as the source for the original
    pointer arithmetic operation such that the inversion yields a correct
    result. The single non-AX mov in between is possible given constant
    blinding is retaining it as it's not an immediate based operation.
    
    Fixes: 979d63d50c0c ("bpf: prevent out of bounds speculation on pointer arithmetic")
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Tested-by: Piotr Krysiuk <piotras@gmail.com>
    Reviewed-by: Piotr Krysiuk <piotras@gmail.com>
    Reviewed-by: John Fastabend <john.fastabend@gmail.com>
    Acked-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index a0cdb6c4a330..f49f84b71a6b 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -6099,14 +6099,10 @@ static int fixup_bpf_calls(struct bpf_verifier_env *env)
 			*patch++ = BPF_ALU64_REG(BPF_OR, BPF_REG_AX, off_reg);
 			*patch++ = BPF_ALU64_IMM(BPF_NEG, BPF_REG_AX, 0);
 			*patch++ = BPF_ALU64_IMM(BPF_ARSH, BPF_REG_AX, 63);
-			if (issrc) {
-				*patch++ = BPF_ALU64_REG(BPF_AND, BPF_REG_AX,
-							 off_reg);
-				insn->src_reg = BPF_REG_AX;
-			} else {
-				*patch++ = BPF_ALU64_REG(BPF_AND, off_reg,
-							 BPF_REG_AX);
-			}
+			*patch++ = BPF_ALU64_REG(BPF_AND, BPF_REG_AX, off_reg);
+			if (!issrc)
+				*patch++ = BPF_MOV64_REG(insn->dst_reg, insn->src_reg);
+			insn->src_reg = BPF_REG_AX;
 			if (isneg)
 				insn->code = insn->code == code_add ?
 					     code_sub : code_add;

commit 502adca1f04b4edee1c40d5c2e26867d35b33f5f
Author: Romain Naour <romain.naour@gmail.com>
Date:   Tue Apr 20 22:12:10 2021 +0100

    mips: Do not include hi and lo in clobber list for R6
    
    commit 1d7ba0165d8206ac073f7ac3b14fc0836b66eae7 upstream
    
    >From [1]
    "GCC 10 (PR 91233) won't silently allow registers that are not
    architecturally available to be present in the clobber list anymore,
    resulting in build failure for mips*r6 targets in form of:
    ...
    .../sysdep.h:146:2: error: the register ?lo??cannot be clobbered in ?asm??for the current target
      146 |  __asm__ volatile (      \
          |  ^~~~~~~
    
    This is because base R6 ISA doesn't define hi and lo registers w/o DSP
    extension. This patch provides the alternative clobber list for r6 targets
    that won't include those registers."
    
    Since kernel 5.4 and mips support for generic vDSO [2], the kernel fail to
    build for mips r6 cpus with gcc 10 for the same reason as glibc.
    
    [1] https://sourceware.org/git/?p=glibc.git;a=commit;h=020b2a97bb15f807c0482f0faee2184ed05bcad8
    [2] '24640f233b46 ("mips: Add support for generic vDSO")'
    
    Signed-off-by: Romain Naour <romain.naour@gmail.com>
    Signed-off-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/mips/vdso/gettimeofday.c b/arch/mips/vdso/gettimeofday.c
index e22b422f282c..9fdc84fc3985 100644
--- a/arch/mips/vdso/gettimeofday.c
+++ b/arch/mips/vdso/gettimeofday.c
@@ -18,6 +18,12 @@
 #include <asm/unistd.h>
 #include <asm/vdso.h>
 
+#if MIPS_ISA_REV < 6
+#define VDSO_SYSCALL_CLOBBERS "hi", "lo",
+#else
+#define VDSO_SYSCALL_CLOBBERS
+#endif
+
 #ifdef CONFIG_MIPS_CLOCK_VSYSCALL
 
 static __always_inline long gettimeofday_fallback(struct timeval *_tv,
@@ -34,7 +40,9 @@ static __always_inline long gettimeofday_fallback(struct timeval *_tv,
 	: "=r" (ret), "=r" (error)
 	: "r" (tv), "r" (tz), "r" (nr)
 	: "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
-	  "$14", "$15", "$24", "$25", "hi", "lo", "memory");
+	  "$14", "$15", "$24", "$25",
+	  VDSO_SYSCALL_CLOBBERS
+	  "memory");
 
 	return error ? -ret : ret;
 }
@@ -55,7 +63,9 @@ static __always_inline long clock_gettime_fallback(clockid_t _clkid,
 	: "=r" (ret), "=r" (error)
 	: "r" (clkid), "r" (ts), "r" (nr)
 	: "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
-	  "$14", "$15", "$24", "$25", "hi", "lo", "memory");
+	  "$14", "$15", "$24", "$25",
+	  VDSO_SYSCALL_CLOBBERS
+	  "memory");
 
 	return error ? -ret : ret;
 }

commit 36442e983ec04b7c13ef081e285c319a2a3fc832
Author: Jiri Kosina <jkosina@suse.cz>
Date:   Tue Mar 2 11:26:55 2021 +0100

    iwlwifi: Fix softirq/hardirq disabling in iwl_pcie_enqueue_hcmd()
    
    commit 2800aadc18a64c96b051bcb7da8a7df7d505db3f upstream.
    
    It's possible for iwl_pcie_enqueue_hcmd() to be called with hard IRQs
    disabled (e.g. from LED core). We can't enable BHs in such a situation.
    
    Turn the unconditional BH-enable/BH-disable code into
    hardirq-disable/conditional-enable.
    
    This fixes the warning below.
    
     WARNING: CPU: 1 PID: 1139 at kernel/softirq.c:178 __local_bh_enable_ip+0xa5/0xf0
     CPU: 1 PID: 1139 Comm: NetworkManager Not tainted 5.12.0-rc1-00004-gb4ded168af79 #7
     Hardware name: LENOVO 20K5S22R00/20K5S22R00, BIOS R0IET38W (1.16 ) 05/31/2017
     RIP: 0010:__local_bh_enable_ip+0xa5/0xf0
     Code: f7 69 e8 ee 23 14 00 fb 66 0f 1f 44 00 00 65 8b 05 f0 f4 f7 69 85 c0 74 3f 48 83 c4 08 5b c3 65 8b 05 9b fe f7 69 85 c0 75 8e <0f> 0b eb 8a 48 89 3c 24 e8 4e 20 14 00 48 8b 3c 24 eb 91 e8 13 4e
     RSP: 0018:ffffafd580b13298 EFLAGS: 00010046
     RAX: 0000000000000000 RBX: 0000000000000201 RCX: 0000000000000000
     RDX: 0000000000000003 RSI: 0000000000000201 RDI: ffffffffc1272389
     RBP: ffff96517ae4c018 R08: 0000000000000001 R09: 0000000000000000
     R10: ffffafd580b13178 R11: 0000000000000001 R12: ffff96517b060000
     R13: 0000000000000000 R14: ffffffff80000000 R15: 0000000000000001
     FS:  00007fc604ebefc0(0000) GS:ffff965267480000(0000) knlGS:0000000000000000
     CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
     CR2: 000055fb3fef13b2 CR3: 0000000109112004 CR4: 00000000003706e0
     Call Trace:
      ? _raw_spin_unlock_bh+0x1f/0x30
      iwl_pcie_enqueue_hcmd+0x5d9/0xa00 [iwlwifi]
      iwl_trans_txq_send_hcmd+0x6c/0x430 [iwlwifi]
      iwl_trans_send_cmd+0x88/0x170 [iwlwifi]
      ? lock_acquire+0x277/0x3d0
      iwl_mvm_send_cmd+0x32/0x80 [iwlmvm]
      iwl_mvm_led_set+0xc2/0xe0 [iwlmvm]
      ? led_trigger_event+0x46/0x70
      led_trigger_event+0x46/0x70
      ieee80211_do_open+0x5c5/0xa20 [mac80211]
      ieee80211_open+0x67/0x90 [mac80211]
      __dev_open+0xd4/0x150
      __dev_change_flags+0x19e/0x1f0
      dev_change_flags+0x23/0x60
      do_setlink+0x30d/0x1230
      ? lock_is_held_type+0xb4/0x120
      ? __nla_validate_parse.part.7+0x57/0xcb0
      ? __lock_acquire+0x2e1/0x1a50
      __rtnl_newlink+0x560/0x910
      ? __lock_acquire+0x2e1/0x1a50
      ? __lock_acquire+0x2e1/0x1a50
      ? lock_acquire+0x277/0x3d0
      ? sock_def_readable+0x5/0x290
      ? lock_is_held_type+0xb4/0x120
      ? find_held_lock+0x2d/0x90
      ? sock_def_readable+0xb3/0x290
      ? lock_release+0x166/0x2a0
      ? lock_is_held_type+0x90/0x120
      rtnl_newlink+0x47/0x70
      rtnetlink_rcv_msg+0x25c/0x470
      ? netlink_deliver_tap+0x97/0x3e0
      ? validate_linkmsg+0x350/0x350
      netlink_rcv_skb+0x50/0x100
      netlink_unicast+0x1b2/0x280
      netlink_sendmsg+0x336/0x450
      sock_sendmsg+0x5b/0x60
      ____sys_sendmsg+0x1ed/0x250
      ? copy_msghdr_from_user+0x5c/0x90
      ___sys_sendmsg+0x88/0xd0
      ? lock_is_held_type+0xb4/0x120
      ? find_held_lock+0x2d/0x90
      ? lock_release+0x166/0x2a0
      ? __fget_files+0xfe/0x1d0
      ? __sys_sendmsg+0x5e/0xa0
      __sys_sendmsg+0x5e/0xa0
      ? lockdep_hardirqs_on_prepare+0xd9/0x170
      do_syscall_64+0x33/0x80
      entry_SYSCALL_64_after_hwframe+0x44/0xae
     RIP: 0033:0x7fc605c9572d
     Code: 28 89 54 24 1c 48 89 74 24 10 89 7c 24 08 e8 da ee ff ff 8b 54 24 1c 48 8b 74 24 10 41 89 c0 8b 7c 24 08 b8 2e 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 33 44 89 c7 48 89 44 24 08 e8 2e ef ff ff 48
     RSP: 002b:00007fffc83789f0 EFLAGS: 00000293 ORIG_RAX: 000000000000002e
     RAX: ffffffffffffffda RBX: 000055ef468570c0 RCX: 00007fc605c9572d
     RDX: 0000000000000000 RSI: 00007fffc8378a30 RDI: 000000000000000c
     RBP: 0000000000000010 R08: 0000000000000000 R09: 0000000000000000
     R10: 0000000000000000 R11: 0000000000000293 R12: 0000000000000000
     R13: 00007fffc8378b80 R14: 00007fffc8378b7c R15: 0000000000000000
     irq event stamp: 170785
     hardirqs last  enabled at (170783): [<ffffffff9609a8c2>] __local_bh_enable_ip+0x82/0xf0
     hardirqs last disabled at (170784): [<ffffffff96a8613d>] _raw_read_lock_irqsave+0x8d/0x90
     softirqs last  enabled at (170782): [<ffffffffc1272389>] iwl_pcie_enqueue_hcmd+0x5d9/0xa00 [iwlwifi]
     softirqs last disabled at (170785): [<ffffffffc1271ec6>] iwl_pcie_enqueue_hcmd+0x116/0xa00 [iwlwifi]
    
    Signed-off-by: Jiri Kosina <jkosina@suse.cz>
    Tested-by: Sedat Dilek <sedat.dilek@gmail.com> # LLVM/Clang v12.0.0-rc3
    Acked-by: Luca Coelho <luciano.coelho@intel.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/nycvar.YFH.7.76.2103021125430.12405@cbobk.fhfr.pm
    Signed-off-by: Jari Ruusu <jariruusu@protonmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
index b1a71539ca3e..41ba0a719375 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
@@ -1495,6 +1495,7 @@ static int iwl_pcie_enqueue_hcmd(struct iwl_trans *trans,
 	u32 cmd_pos;
 	const u8 *cmddata[IWL_MAX_CMD_TBS_PER_TFD];
 	u16 cmdlen[IWL_MAX_CMD_TBS_PER_TFD];
+	unsigned long flags2;
 
 	if (WARN(!trans->wide_cmd_header &&
 		 group_id > IWL_ALWAYS_LONG_GROUP,
@@ -1578,10 +1579,10 @@ static int iwl_pcie_enqueue_hcmd(struct iwl_trans *trans,
 		goto free_dup_buf;
 	}
 
-	spin_lock_bh(&txq->lock);
+	spin_lock_irqsave(&txq->lock, flags2);
 
 	if (iwl_queue_space(trans, txq) < ((cmd->flags & CMD_ASYNC) ? 2 : 1)) {
-		spin_unlock_bh(&txq->lock);
+		spin_unlock_irqrestore(&txq->lock, flags2);
 
 		IWL_ERR(trans, "No space in command queue\n");
 		iwl_op_mode_cmd_queue_full(trans->op_mode);
@@ -1742,7 +1743,7 @@ static int iwl_pcie_enqueue_hcmd(struct iwl_trans *trans,
 	spin_unlock_irqrestore(&trans_pcie->reg_lock, flags);
 
  out:
-	spin_unlock_bh(&txq->lock);
+	spin_unlock_irqrestore(&txq->lock, flags2);
  free_dup_buf:
 	if (idx < 0)
 		kfree(dup_buf);

commit e9e0c8b649d213877e84c1940b302d937e019a43
Author: Phillip Potter <phil@philpotter.co.uk>
Date:   Thu Apr 1 23:36:07 2021 +0100

    net: usb: ax88179_178a: initialize local variables before use
    
    commit bd78980be1a68d14524c51c4b4170782fada622b upstream.
    
    Use memset to initialize local array in drivers/net/usb/ax88179_178a.c, and
    also set a local u16 and u32 variable to 0. Fixes a KMSAN found uninit-value bug
    reported by syzbot at:
    https://syzkaller.appspot.com/bug?id=00371c73c72f72487c1d0bfe0cc9d00de339d5aa
    
    Reported-by: syzbot+4993e4a0e237f1b53747@syzkaller.appspotmail.com
    Signed-off-by: Phillip Potter <phil@philpotter.co.uk>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c
index a9d0df435e26..b2434b479846 100644
--- a/drivers/net/usb/ax88179_178a.c
+++ b/drivers/net/usb/ax88179_178a.c
@@ -307,12 +307,12 @@ static int ax88179_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
 	int ret;
 
 	if (2 == size) {
-		u16 buf;
+		u16 buf = 0;
 		ret = __ax88179_read_cmd(dev, cmd, value, index, size, &buf, 0);
 		le16_to_cpus(&buf);
 		*((u16 *)data) = buf;
 	} else if (4 == size) {
-		u32 buf;
+		u32 buf = 0;
 		ret = __ax88179_read_cmd(dev, cmd, value, index, size, &buf, 0);
 		le32_to_cpus(&buf);
 		*((u32 *)data) = buf;

commit 9a5ba778b50d6c6c50597febf3a30387a80ac05d
Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Date:   Tue Apr 13 16:01:00 2021 +0200

    ACPI: x86: Call acpi_boot_table_init() after acpi_table_upgrade()
    
    commit 6998a8800d73116187aad542391ce3b2dd0f9e30 upstream.
    
    Commit 1a1c130ab757 ("ACPI: tables: x86: Reserve memory occupied by
    ACPI tables") attempted to address an issue with reserving the memory
    occupied by ACPI tables, but it broke the initrd-based table override
    mechanism relied on by multiple users.
    
    To restore the initrd-based ACPI table override functionality, move
    the acpi_boot_table_init() invocation in setup_arch() on x86 after
    the acpi_table_upgrade() one.
    
    Fixes: 1a1c130ab757 ("ACPI: tables: x86: Reserve memory occupied by ACPI tables")
    Reported-by: Hans de Goede <hdegoede@redhat.com>
    Tested-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Cc: George Kennedy <george.kennedy@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index c35795ff5c16..652a10a3219d 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -1097,9 +1097,6 @@ void __init setup_arch(char **cmdline_p)
 
 	cleanup_highmap();
 
-	/* Look for ACPI tables and reserve memory occupied by them. */
-	acpi_boot_table_init();
-
 	memblock_set_current_limit(ISA_END_ADDRESS);
 	e820__memblock_setup();
 
@@ -1179,6 +1176,8 @@ void __init setup_arch(char **cmdline_p)
 	reserve_initrd();
 
 	acpi_table_upgrade();
+	/* Look for ACPI tables and reserve memory occupied by them. */
+	acpi_boot_table_init();
 
 	vsmp_init();
 

commit 7d329dd0a1b3302e10f0f25ef08538c7598d118f
Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Date:   Tue Mar 23 20:26:52 2021 +0100

    ACPI: tables: x86: Reserve memory occupied by ACPI tables
    
    commit 1a1c130ab7575498eed5bcf7220037ae09cd1f8a upstream.
    
    The following problem has been reported by George Kennedy:
    
     Since commit 7fef431be9c9 ("mm/page_alloc: place pages to tail
     in __free_pages_core()") the following use after free occurs
     intermittently when ACPI tables are accessed.
    
     BUG: KASAN: use-after-free in ibft_init+0x134/0xc49
     Read of size 4 at addr ffff8880be453004 by task swapper/0/1
     CPU: 3 PID: 1 Comm: swapper/0 Not tainted 5.12.0-rc1-7a7fd0d #1
     Call Trace:
      dump_stack+0xf6/0x158
      print_address_description.constprop.9+0x41/0x60
      kasan_report.cold.14+0x7b/0xd4
      __asan_report_load_n_noabort+0xf/0x20
      ibft_init+0x134/0xc49
      do_one_initcall+0xc4/0x3e0
      kernel_init_freeable+0x5af/0x66b
      kernel_init+0x16/0x1d0
      ret_from_fork+0x22/0x30
    
     ACPI tables mapped via kmap() do not have their mapped pages
     reserved and the pages can be "stolen" by the buddy allocator.
    
    Apparently, on the affected system, the ACPI table in question is
    not located in "reserved" memory, like ACPI NVS or ACPI Data, that
    will not be used by the buddy allocator, so the memory occupied by
    that table has to be explicitly reserved to prevent the buddy
    allocator from using it.
    
    In order to address this problem, rearrange the initialization of the
    ACPI tables on x86 to locate the initial tables earlier and reserve
    the memory occupied by them.
    
    The other architectures using ACPI should not be affected by this
    change.
    
    Link: https://lore.kernel.org/linux-acpi/1614802160-29362-1-git-send-email-george.kennedy@oracle.com/
    Reported-by: George Kennedy <george.kennedy@oracle.com>
    Tested-by: George Kennedy <george.kennedy@oracle.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Reviewed-by: Mike Rapoport <rppt@linux.ibm.com>
    Cc: 5.10+ <stable@vger.kernel.org> # 5.10+
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 7303bb398862..b35c34cfbe52 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -1565,10 +1565,18 @@ void __init acpi_boot_table_init(void)
 	/*
 	 * Initialize the ACPI boot-time table parser.
 	 */
-	if (acpi_table_init()) {
+	if (acpi_locate_initial_tables())
 		disable_acpi();
-		return;
-	}
+	else
+		acpi_reserve_initial_tables();
+}
+
+int __init early_acpi_boot_init(void)
+{
+	if (acpi_disabled)
+		return 1;
+
+	acpi_table_init_complete();
 
 	acpi_table_parse(ACPI_SIG_BOOT, acpi_parse_sbf);
 
@@ -1581,18 +1589,9 @@ void __init acpi_boot_table_init(void)
 		} else {
 			printk(KERN_WARNING PREFIX "Disabling ACPI support\n");
 			disable_acpi();
-			return;
+			return 1;
 		}
 	}
-}
-
-int __init early_acpi_boot_init(void)
-{
-	/*
-	 * If acpi_disabled, bail out
-	 */
-	if (acpi_disabled)
-		return 1;
 
 	/*
 	 * Process the Multiple APIC Description Table (MADT), if present
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 90ecc108bc8a..c35795ff5c16 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -1097,6 +1097,9 @@ void __init setup_arch(char **cmdline_p)
 
 	cleanup_highmap();
 
+	/* Look for ACPI tables and reserve memory occupied by them. */
+	acpi_boot_table_init();
+
 	memblock_set_current_limit(ISA_END_ADDRESS);
 	e820__memblock_setup();
 
@@ -1183,11 +1186,6 @@ void __init setup_arch(char **cmdline_p)
 
 	early_platform_quirks();
 
-	/*
-	 * Parse the ACPI tables for possible boot-time SMP configuration.
-	 */
-	acpi_boot_table_init();
-
 	early_acpi_boot_init();
 
 	initmem_init();
diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c
index a3d012b08fc5..041ee2381927 100644
--- a/drivers/acpi/tables.c
+++ b/drivers/acpi/tables.c
@@ -732,7 +732,7 @@ acpi_os_table_override(struct acpi_table_header *existing_table,
 }
 
 /*
- * acpi_table_init()
+ * acpi_locate_initial_tables()
  *
  * find RSDP, find and checksum SDT/XSDT.
  * checksum all tables, print SDT/XSDT
@@ -740,7 +740,7 @@ acpi_os_table_override(struct acpi_table_header *existing_table,
  * result: sdt_entry[] is initialized
  */
 
-int __init acpi_table_init(void)
+int __init acpi_locate_initial_tables(void)
 {
 	acpi_status status;
 
@@ -755,9 +755,45 @@ int __init acpi_table_init(void)
 	status = acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0);
 	if (ACPI_FAILURE(status))
 		return -EINVAL;
-	acpi_table_initrd_scan();
 
+	return 0;
+}
+
+void __init acpi_reserve_initial_tables(void)
+{
+	int i;
+
+	for (i = 0; i < ACPI_MAX_TABLES; i++) {
+		struct acpi_table_desc *table_desc = &initial_tables[i];
+		u64 start = table_desc->address;
+		u64 size = table_desc->length;
+
+		if (!start || !size)
+			break;
+
+		pr_info("Reserving %4s table memory at [mem 0x%llx-0x%llx]\n",
+			table_desc->signature.ascii, start, start + size - 1);
+
+		memblock_reserve(start, size);
+	}
+}
+
+void __init acpi_table_init_complete(void)
+{
+	acpi_table_initrd_scan();
 	check_multiple_madt();
+}
+
+int __init acpi_table_init(void)
+{
+	int ret;
+
+	ret = acpi_locate_initial_tables();
+	if (ret)
+		return ret;
+
+	acpi_table_init_complete();
+
 	return 0;
 }
 
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index 019468f072b7..1a37748766b7 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -230,10 +230,14 @@ void __iomem *__acpi_map_table(unsigned long phys, unsigned long size);
 void __acpi_unmap_table(void __iomem *map, unsigned long size);
 int early_acpi_boot_init(void);
 int acpi_boot_init (void);
+void acpi_boot_table_prepare (void);
 void acpi_boot_table_init (void);
 int acpi_mps_check (void);
 int acpi_numa_init (void);
 
+int acpi_locate_initial_tables (void);
+void acpi_reserve_initial_tables (void);
+void acpi_table_init_complete (void);
 int acpi_table_init (void);
 int acpi_table_parse(char *id, acpi_tbl_table_handler handler);
 int __init acpi_table_parse_entries(char *id, unsigned long table_size,
@@ -734,9 +738,12 @@ static inline int acpi_boot_init(void)
 	return 0;
 }
 
+static inline void acpi_boot_table_prepare(void)
+{
+}
+
 static inline void acpi_boot_table_init(void)
 {
-	return;
 }
 
 static inline int acpi_mps_check(void)

commit 5cd7d4573c1032cb5bc6591583e0d3c613ed9f2a
Author: Gao Xiang <hsiangkao@redhat.com>
Date:   Thu Jul 30 01:58:01 2020 +0800

    erofs: fix extended inode could cross boundary
    
    commit 0dcd3c94e02438f4a571690e26f4ee997524102a upstream.
    
    Each ondisk inode should be aligned with inode slot boundary
    (32-byte alignment) because of nid calculation formula, so all
    compact inodes (32 byte) cannot across page boundary. However,
    extended inode is now 64-byte form, which can across page boundary
    in principle if the location is specified on purpose, although
    it's hard to be generated by mkfs due to the allocation policy
    and rarely used by Android use case now mainly for > 4GiB files.
    
    For now, only two fields `i_ctime_nsec` and `i_nlink' couldn't
    be read from disk properly and cause out-of-bound memory read
    with random value.
    
    Let's fix now.
    
    Fixes: 431339ba9042 ("staging: erofs: add inode operations")
    Cc: <stable@vger.kernel.org> # 4.19+
    Link: https://lore.kernel.org/r/20200729175801.GA23973@xiangao.remote.csb
    Reviewed-by: Chao Yu <yuchao0@huawei.com>
    Signed-off-by: Gao Xiang <hsiangkao@redhat.com>
    [ Gao Xiang: resolve non-trivial conflicts for latest 4.19.y. ]
    Signed-off-by: Gao Xiang <hsiangkao@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

diff --git a/drivers/staging/erofs/inode.c b/drivers/staging/erofs/inode.c
index 12a5be95457f..a43abd530cc1 100644
--- a/drivers/staging/erofs/inode.c
+++ b/drivers/staging/erofs/inode.c
@@ -14,26 +14,78 @@
 
 #include <trace/events/erofs.h>
 
-/* no locking */
-static int read_inode(struct inode *inode, void *data)
+/*
+ * if inode is successfully read, return its inode page (or sometimes
+ * the inode payload page if it's an extended inode) in order to fill
+ * inline data if possible.
+ */
+static struct page *read_inode(struct inode *inode, unsigned int *ofs)
 {
+	struct super_block *sb = inode->i_sb;
+	struct erofs_sb_info *sbi = EROFS_SB(sb);
 	struct erofs_vnode *vi = EROFS_V(inode);
-	struct erofs_inode_v1 *v1 = data;
-	const unsigned advise = le16_to_cpu(v1->i_advise);
+	const erofs_off_t inode_loc = iloc(sbi, vi->nid);
+	erofs_blk_t blkaddr;
+	struct page *page;
+	struct erofs_inode_v1 *v1;
+	struct erofs_inode_v2 *v2, *copied = NULL;
+	unsigned int ifmt;
+	int err;
 
-	vi->data_mapping_mode = __inode_data_mapping(advise);
+	blkaddr = erofs_blknr(inode_loc);
+	*ofs = erofs_blkoff(inode_loc);
 
+	debugln("%s, reading inode nid %llu at %u of blkaddr %u",
+		__func__, vi->nid, *ofs, blkaddr);
+
+	page = erofs_get_meta_page(sb, blkaddr, false);
+	if (IS_ERR(page)) {
+		errln("failed to get inode (nid: %llu) page, err %ld",
+		      vi->nid, PTR_ERR(page));
+		return page;
+	}
+
+	v1 = page_address(page) + *ofs;
+	ifmt = le16_to_cpu(v1->i_advise);
+
+	vi->data_mapping_mode = __inode_data_mapping(ifmt);
 	if (unlikely(vi->data_mapping_mode >= EROFS_INODE_LAYOUT_MAX)) {
 		errln("unknown data mapping mode %u of nid %llu",
 			vi->data_mapping_mode, vi->nid);
-		DBG_BUGON(1);
-		return -EIO;
+		err = -EOPNOTSUPP;
+		goto err_out;
 	}
 
-	if (__inode_version(advise) == EROFS_INODE_LAYOUT_V2) {
-		struct erofs_inode_v2 *v2 = data;
-
+	switch (__inode_version(ifmt)) {
+	case EROFS_INODE_LAYOUT_V2:
 		vi->inode_isize = sizeof(struct erofs_inode_v2);
+		/* check if the inode acrosses page boundary */
+		if (*ofs + vi->inode_isize <= PAGE_SIZE) {
+			*ofs += vi->inode_isize;
+			v2 = (struct erofs_inode_v2 *)v1;
+		} else {
+			const unsigned int gotten = PAGE_SIZE - *ofs;
+
+			copied = kmalloc(vi->inode_isize, GFP_NOFS);
+			if (!copied) {
+				err = -ENOMEM;
+				goto err_out;
+			}
+			memcpy(copied, v1, gotten);
+			unlock_page(page);
+			put_page(page);
+
+			page = erofs_get_meta_page(sb, blkaddr + 1, false);
+			if (IS_ERR(page)) {
+				errln("failed to get inode payload page (nid: %llu), err %ld",
+				      vi->nid, PTR_ERR(page));
+				kfree(copied);
+				return page;
+			}
+			*ofs = vi->inode_isize - gotten;
+			memcpy((u8 *)copied + gotten, page_address(page), *ofs);
+			v2 = copied;
+		}
 		vi->xattr_isize = ondisk_xattr_ibody_size(v2->i_xattr_icount);
 
 		inode->i_mode = le16_to_cpu(v2->i_mode);
@@ -46,7 +98,7 @@ static int read_inode(struct inode *inode, void *data)
 		} else if (S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
 			inode->i_rdev = 0;
 		} else {
-			return -EIO;
+			goto bogusimode;
 		}
 
 		i_uid_write(inode, le32_to_cpu(v2->i_uid));
@@ -58,10 +110,11 @@ static int read_inode(struct inode *inode, void *data)
 		inode->i_ctime.tv_nsec = le32_to_cpu(v2->i_ctime_nsec);
 
 		inode->i_size = le64_to_cpu(v2->i_size);
-	} else if (__inode_version(advise) == EROFS_INODE_LAYOUT_V1) {
-		struct erofs_sb_info *sbi = EROFS_SB(inode->i_sb);
-
+		kfree(copied);
+		break;
+	case EROFS_INODE_LAYOUT_V1:
 		vi->inode_isize = sizeof(struct erofs_inode_v1);
+		*ofs += vi->inode_isize;
 		vi->xattr_isize = ondisk_xattr_ibody_size(v1->i_xattr_icount);
 
 		inode->i_mode = le16_to_cpu(v1->i_mode);
@@ -74,7 +127,7 @@ static int read_inode(struct inode *inode, void *data)
 		} else if (S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
 			inode->i_rdev = 0;
 		} else {
-			return -EIO;
+			goto bogusimode;
 		}
 
 		i_uid_write(inode, le16_to_cpu(v1->i_uid));
@@ -86,11 +139,12 @@ static int read_inode(struct inode *inode, void *data)
 		inode->i_ctime.tv_nsec = sbi->build_time_nsec;
 
 		inode->i_size = le32_to_cpu(v1->i_size);
-	} else {
+		break;
+	default:
 		errln("unsupported on-disk inode version %u of nid %llu",
-			__inode_version(advise), vi->nid);
-		DBG_BUGON(1);
-		return -EIO;
+		      __inode_version(ifmt), vi->nid);
+		err = -EOPNOTSUPP;
+		goto err_out;
 	}
 
 	inode->i_mtime.tv_sec = inode->i_ctime.tv_sec;
@@ -100,7 +154,16 @@ static int read_inode(struct inode *inode, void *data)
 
 	/* measure inode.i_blocks as the generic filesystem */
 	inode->i_blocks = ((inode->i_size - 1) >> 9) + 1;
-	return 0;
+	return page;
+bogusimode:
+	errln("bogus i_mode (%o) @ nid %llu", inode->i_mode, vi->nid);
+	err = -EIO;
+err_out:
+	DBG_BUGON(1);
+	kfree(copied);
+	unlock_page(page);
+	put_page(page);
+	return ERR_PTR(err);
 }
 
 /*
@@ -132,7 +195,7 @@ static int fill_inline_data(struct inode *inode, void *data, unsigned m_pofs)
 		if (unlikely(lnk == NULL))
 			return -ENOMEM;
 
-		m_pofs += vi->inode_isize + vi->xattr_isize;
+		m_pofs += vi->xattr_isize;
 
 		/* inline symlink data shouldn't across page boundary as well */
 		if (unlikely(m_pofs + inode->i_size > PAGE_SIZE)) {
@@ -153,35 +216,17 @@ static int fill_inline_data(struct inode *inode, void *data, unsigned m_pofs)
 
 static int fill_inode(struct inode *inode, int isdir)
 {
-	struct erofs_sb_info *sbi = EROFS_SB(inode->i_sb);
-	struct erofs_vnode *vi = EROFS_V(inode);
 	struct page *page;
-	void *data;
-	int err;
-	erofs_blk_t blkaddr;
-	unsigned ofs;
+	unsigned int ofs;
+	int err = 0;
 
 	trace_erofs_fill_inode(inode, isdir);
 
-	blkaddr = erofs_blknr(iloc(sbi, vi->nid));
-	ofs = erofs_blkoff(iloc(sbi, vi->nid));
-
-	debugln("%s, reading inode nid %llu at %u of blkaddr %u",
-		__func__, vi->nid, ofs, blkaddr);
-
-	page = erofs_get_meta_page(inode->i_sb, blkaddr, isdir);
-
+	/* read inode base data from disk */
+	page = read_inode(inode, &ofs);
 	if (IS_ERR(page)) {
-		errln("failed to get inode (nid: %llu) page, err %ld",
-			vi->nid, PTR_ERR(page));
 		return PTR_ERR(page);
-	}
-
-	DBG_BUGON(!PageUptodate(page));
-	data = page_address(page);
-
-	err = read_inode(inode, data + ofs);
-	if (!err) {
+	} else {
 		/* setup the new inode */
 		if (S_ISREG(inode->i_mode)) {
 #ifdef CONFIG_EROFS_FS_XATTR
@@ -229,7 +274,7 @@ static int fill_inode(struct inode *inode, int isdir)
 		inode->i_mapping->a_ops = &erofs_raw_access_aops;
 
 		/* fill last page if inline data is available */
-		fill_inline_data(inode, data, ofs);
+		fill_inline_data(inode, page_address(page), ofs);
 	}
 
 out_unlock:

commit 61410d7175438e7489e844b72f97e5954d5a577a
Author: A. Cody Schuffelen <schuffelen@google.com>
Date:   Thu Mar 18 13:04:19 2021 -0700

    BACKPORT: FROMGIT: virt_wifi: Return micros for BSS TSF values
    
    cfg80211_inform_bss expects to receive a TSF value, but is given the
    time since boot in nanoseconds. TSF values are expected to be at
    microsecond scale rather than nanosecond scale.
    
    Bug: 181840234
    Test: atest CtsWifiTestCases:android.net.wifi.cts.ScanResultTest#testScanResultTimeStamp -- --abi x86_64
    Signed-off-by: A. Cody Schuffelen <schuffelen@google.com>
    Link: https://lore.kernel.org/r/20210318200419.1421034-1-schuffelen@google.com
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    (cherry picked from commit b57aa17f07c9270e576ef7df09f142978b5a75f0
    https: //git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git master)
    Change-Id: Icafc24ad303357926cbe955ffa12e28e0bf31e6f

diff --git a/drivers/net/wireless/virt_wifi.c b/drivers/net/wireless/virt_wifi.c
index 075e25d65634..9542372a239d 100644
--- a/drivers/net/wireless/virt_wifi.c
+++ b/drivers/net/wireless/virt_wifi.c
@@ -12,6 +12,7 @@
 #include <net/cfg80211.h>
 #include <net/rtnetlink.h>
 #include <linux/etherdevice.h>
+#include <linux/math64.h>
 #include <linux/module.h>
 
 #include <net/cfg80211.h>
@@ -178,11 +179,11 @@ static void virt_wifi_scan_result(struct work_struct *work)
 			     scan_result.work);
 	struct wiphy *wiphy = priv_to_wiphy(priv);
 	struct cfg80211_scan_info scan_info = { .aborted = false };
+	u64 tsf = div_u64(ktime_get_boot_ns(), 1000);
 
 	informed_bss = cfg80211_inform_bss(wiphy, &channel_5ghz,
 					   CFG80211_BSS_FTYPE_PRESP,
-					   fake_router_bssid,
-					   ktime_get_boot_ns(),
+					   fake_router_bssid, tsf,
 					   WLAN_CAPABILITY_ESS, 0,
 					   (void *)&ssid, sizeof(ssid),
 					   DBM_TO_MBM(-50), GFP_KERNEL);

commit 6cbc8aefdc9d3cb91d24128a3be8768fc59d99a8
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Mon Apr 26 17:39:34 2021 +0800

    drm/rockchip: drv: add support bcsh read from loader
    
    Change-Id: I181f0d9066b4a1dbfdfe076a5b18a8d4cd639230
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index b040b3f94933..700fb6bdf4b8 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -85,6 +85,11 @@ struct rockchip_drm_mode_set {
 	int top_margin;
 	int bottom_margin;
 
+	unsigned int brightness;
+	unsigned int contrast;
+	unsigned int saturation;
+	unsigned int hue;
+
 	bool mode_changed;
 	int ratio;
 };
@@ -530,6 +535,26 @@ of_parse_display_resource(struct drm_device *drm_dev, struct device_node *route)
 	if (!of_property_read_u32(route, "overscan,bottom_margin", &val))
 		set->bottom_margin = val;
 
+	if (!of_property_read_u32(route, "bcsh,brightness", &val))
+		set->brightness = val;
+	else
+		set->brightness = 50;
+
+	if (!of_property_read_u32(route, "bcsh,contrast", &val))
+		set->contrast = val;
+	else
+		set->contrast = 50;
+
+	if (!of_property_read_u32(route, "bcsh,saturation", &val))
+		set->saturation = val;
+	else
+		set->saturation = 50;
+
+	if (!of_property_read_u32(route, "bcsh,hue", &val))
+		set->hue = val;
+	else
+		set->hue = 50;
+
 	if (!of_property_read_u32(route, "cubic_lut,offset", &val)) {
 		private->cubic_lut[crtc->index].enable = true;
 		private->cubic_lut[crtc->index].offset = val;
@@ -744,6 +769,10 @@ static int setup_initial_state(struct drm_device *drm_dev,
 		goto error_conn;
 	}
 
+	conn_state->tv.brightness = set->brightness;
+	conn_state->tv.contrast = set->contrast;
+	conn_state->tv.saturation = set->saturation;
+	conn_state->tv.hue = set->hue;
 	set->mode = mode;
 	crtc_state = drm_atomic_get_crtc_state(state, crtc);
 	if (IS_ERR(crtc_state)) {

commit fb57e7e3579e01f2bc6e003a9ed9e5045df3cc9f
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Fri Apr 23 14:27:49 2021 +0800

    drm/rockchip: vop2: add support cubic lut from loader
    
    Change-Id: I11d65477364dc9ff4fb34d038179d5702faeb484
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index d4051208b04f..b040b3f94933 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -329,9 +329,13 @@ static int init_loader_memory(struct drm_device *drm_dev)
 	phys_addr_t start, size;
 	u32 pg_size = PAGE_SIZE;
 	struct resource res;
-	int ret;
+	int ret, idx;
 
-	node = of_parse_phandle(np, "logo-memory-region", 0);
+	idx = of_property_match_string(np, "memory-region-names", "drm-logo");
+	if (idx >= 0)
+		node = of_parse_phandle(np, "memory-region", idx);
+	else
+		node = of_parse_phandle(np, "logo-memory-region", 0);
 	if (!node)
 		return -ENOMEM;
 
@@ -365,6 +369,33 @@ static int init_loader_memory(struct drm_device *drm_dev)
 	logo->count = 1;
 	private->logo = logo;
 
+	idx = of_property_match_string(np, "memory-region-names", "drm-cubic-lut");
+	if (idx < 0)
+		return 0;
+
+	node = of_parse_phandle(np, "memory-region", idx);
+	if (!node)
+		return -ENOMEM;
+
+	ret = of_address_to_resource(node, 0, &res);
+	if (ret)
+		return ret;
+	start = ALIGN_DOWN(res.start, pg_size);
+	size = resource_size(&res);
+	if (!size)
+		return 0;
+
+	private->cubic_lut_kvaddr = phys_to_virt(start);
+	if (private->domain) {
+		ret = iommu_map(private->domain, start, start, ALIGN(size, pg_size),
+				IOMMU_WRITE | IOMMU_READ);
+		if (ret) {
+			dev_err(drm_dev->dev, "failed to create 1v1 mapping for cubic lut\n");
+			goto err_free_logo;
+		}
+	}
+	private->cubic_lut_dma_addr = start;
+
 	return 0;
 
 err_free_logo:
@@ -431,6 +462,7 @@ get_framebuffer_by_node(struct drm_device *drm_dev, struct device_node *node)
 static struct rockchip_drm_mode_set *
 of_parse_display_resource(struct drm_device *drm_dev, struct device_node *route)
 {
+	struct rockchip_drm_private *private = drm_dev->dev_private;
 	struct rockchip_drm_mode_set *set;
 	struct device_node *connect;
 	struct drm_framebuffer *fb;
@@ -498,6 +530,11 @@ of_parse_display_resource(struct drm_device *drm_dev, struct device_node *route)
 	if (!of_property_read_u32(route, "overscan,bottom_margin", &val))
 		set->bottom_margin = val;
 
+	if (!of_property_read_u32(route, "cubic_lut,offset", &val)) {
+		private->cubic_lut[crtc->index].enable = true;
+		private->cubic_lut[crtc->index].offset = val;
+	}
+
 	set->ratio = 1;
 	if (!of_property_read_string(route, "logo,mode", &string) &&
 	    !strcmp(string, "fullscreen"))
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h
index 7995f6c61945..cfe406457e1b 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h
@@ -159,6 +159,11 @@ struct rockchip_logo {
 	int count;
 };
 
+struct loader_cubic_lut {
+	bool enable;
+	u32 offset;
+};
+
 /*
  * Rockchip drm private structure.
  *
@@ -202,6 +207,10 @@ struct rockchip_drm_private {
 	 * ignore restore_fbdev_mode_atomic when in logo on state
 	 */
 	bool loader_protect;
+
+	dma_addr_t cubic_lut_dma_addr;
+	void *cubic_lut_kvaddr;
+	struct loader_cubic_lut cubic_lut[ROCKCHIP_MAX_CRTC];
 };
 
 #ifndef MODULE
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 9787fcc84735..099d78f90816 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -2284,6 +2284,7 @@ static int vop2_crtc_atomic_cubic_lut_set(struct drm_crtc *crtc,
 					  struct drm_crtc_state *old_state)
 {
 	struct vop2_video_port *vp = to_vop2_video_port(crtc);
+	struct rockchip_drm_private *private = crtc->dev->dev_private;
 	struct drm_color_lut *lut = vp->cubic_lut;
 	struct vop2 *vop2 = vp->vop2;
 	u32 *cubic_lut_kvaddr;
@@ -2295,16 +2296,22 @@ static int vop2_crtc_atomic_cubic_lut_set(struct drm_crtc *crtc,
 		return -ENODEV;
 	}
 
-	if (!vp->cubic_lut_gem_obj) {
-		size_t size = (vp->cubic_lut_len + 1) / 2 * 16;
+	if (!private->cubic_lut[vp->id].enable) {
+		if (!vp->cubic_lut_gem_obj) {
+			size_t size = (vp->cubic_lut_len + 1) / 2 * 16;
 
-		vp->cubic_lut_gem_obj = rockchip_gem_create_object(crtc->dev, size, true, 0);
-		if (IS_ERR(vp->cubic_lut_gem_obj))
-			return -ENOMEM;
+			vp->cubic_lut_gem_obj = rockchip_gem_create_object(crtc->dev, size, true, 0);
+			if (IS_ERR(vp->cubic_lut_gem_obj))
+				return -ENOMEM;
+		}
+
+		cubic_lut_kvaddr = (u32 *)vp->cubic_lut_gem_obj->kvaddr;
+		cubic_lut_mst = vp->cubic_lut_gem_obj->dma_addr;
+	} else {
+		cubic_lut_kvaddr = private->cubic_lut[vp->id].offset + private->cubic_lut_kvaddr;
+		cubic_lut_mst = private->cubic_lut[vp->id].offset + private->cubic_lut_dma_addr;
 	}
 
-	cubic_lut_kvaddr = (u32 *)vp->cubic_lut_gem_obj->kvaddr;
-	cubic_lut_mst = vp->cubic_lut_gem_obj->dma_addr;
 	for (i = 0; i < vp->cubic_lut_len / 2; i++) {
 		*cubic_lut_kvaddr++ = (lut[2 * i].red & 0xfff) +
 					((lut[2 * i].green & 0xfff) << 12) +
@@ -3438,6 +3445,7 @@ static int vop2_crtc_loader_protect(struct drm_crtc *crtc, bool on)
 {
 	struct vop2_video_port *vp = to_vop2_video_port(crtc);
 	struct vop2 *vop2 = vp->vop2;
+	struct rockchip_drm_private *private = crtc->dev->dev_private;
 
 	if (on == vp->loader_protect)
 		return 0;
@@ -3447,6 +3455,13 @@ static int vop2_crtc_loader_protect(struct drm_crtc *crtc, bool on)
 		vop2_set_system_status(vop2);
 		vop2_initial(crtc);
 		drm_crtc_vblank_on(crtc);
+		if (private->cubic_lut[vp->id].enable) {
+			dma_addr_t cubic_lut_mst;
+			struct loader_cubic_lut *cubic_lut = &private->cubic_lut[vp->id];
+
+			cubic_lut_mst = cubic_lut->offset + private->cubic_lut_dma_addr;
+			VOP_MODULE_SET(vop2, vp, cubic_lut_mst, cubic_lut_mst);
+		}
 		vp->loader_protect = true;
 	} else {
 		vop2_crtc_atomic_disable(crtc, NULL);
@@ -3636,12 +3651,14 @@ static int vop2_cubic_lut_show(struct seq_file *s, void *data)
 {
 	struct drm_info_node *node = s->private;
 	struct vop2 *vop2 = node->info_ent->data;
+	struct rockchip_drm_private *private = vop2->drm_dev->dev_private;
 	int i, j;
 
 	for (i = 0; i < vop2->data->nr_vps; i++) {
 		struct vop2_video_port *vp = &vop2->vps[i];
 
-		if (!vp->cubic_lut_gem_obj || !vp->cubic_lut || !vp->crtc.state->enable) {
+		if ((!vp->cubic_lut_gem_obj && !private->cubic_lut[vp->id].enable) ||
+		    !vp->cubic_lut || !vp->crtc.state->enable) {
 			DEBUG_PRINT("Video port%d cubic lut disabled\n", vp->id);
 			continue;
 		}

commit 9dafae176bc56e107e0403bd1aa0f341f8c7690b
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Fri Apr 23 14:27:24 2021 +0800

    arm64: dts: rockchip: rk3568: add reserved memory for cubic lut
    
    Change-Id: I68bc3fb2e3955383652fd1e583728becbfca744b
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index b5250f1cc1c6..91c2f944d32a 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -202,7 +202,8 @@
 
 	display_subsystem: display-subsystem {
 		compatible = "rockchip,display-subsystem";
-		logo-memory-region = <&drm_logo>;
+		memory-region = <&drm_logo>, <&drm_cubic_lut>;
+		memory-region-names = "drm-logo", "drm-cubic-lut";
 		ports = <&vop_out>;
 
 		route {
@@ -305,6 +306,11 @@
 			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>;
+		};
 	};
 
 	rockchip_suspend: rockchip-suspend {

commit dbb3122b7794902eb35f30131afe24c27dd7fd28
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Wed Apr 14 10:43:38 2021 +0800

    drm/rockchip: vop2: add consider three display pending done bit
    
    Change-Id: I9e2fe62cff31153a1b16faaaa11f9a49b8051975
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 0ee9b37f1b7c..9787fcc84735 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -684,6 +684,12 @@ static inline void vop2_mask_write(struct vop2 *vop2, uint32_t offset,
 		writel(v, vop2->regs + offset);
 }
 
+static inline u32 vop2_line_to_time(struct drm_display_mode *mode, int line)
+{
+	/* us */
+	return 1000000 / mode->crtc_clock * mode->crtc_htotal / 1000 * line;
+}
+
 static bool vop2_soc_is_rk3566(void)
 {
 	return soc_is_rk3566();
@@ -891,7 +897,7 @@ static void vop2_wait_for_fs_by_raw_status(struct vop2_video_port *vp)
 	 * has take effect.
 	 */
 	ret = readx_poll_timeout_atomic(vop2_fs_raw_status_pending, vp, pending,
-					pending, 0, 10 * 1000);
+					pending, 0, 50 * 1000);
 	if (ret)
 		DRM_DEV_ERROR(vop2->dev, "wait vp%d raw fs statu timeout\n", vp->id);
 
@@ -912,7 +918,7 @@ static void vop2_wait_for_port_mux_done(struct vop2 *vop2)
 	 * is done.
 	 */
 	ret = readx_poll_timeout_atomic(vop2_read_port_mux, vop2, port_mux_cfg,
-					port_mux_cfg == vop2->port_mux_cfg, 0, 20 * 1000);
+					port_mux_cfg == vop2->port_mux_cfg, 0, 50 * 1000);
 	if (ret)
 		DRM_DEV_ERROR(vop2->dev, "wait port_mux done timeout: 0x%x--0x%x\n",
 			      port_mux_cfg, vop2->port_mux_cfg);
@@ -923,29 +929,85 @@ static int32_t vop2_pending_done_bits(struct vop2_video_port *vp)
 	struct vop2 *vop2 = vp->vop2;
 	struct drm_display_mode *adjusted_mode;
 	struct vop2_video_port *done_vp;
-	uint32_t done_bits;
+	uint32_t done_bits, done_bits_bak;
 	uint32_t vp_id;
 	uint32_t vcnt;
 
 	done_bits = vop2_readl(vop2, RK3568_REG_CFG_DONE) & 0x7;
-	/* we have some vp wait for config done take effect */
-	if (done_bits) {
+	done_bits_bak = done_bits;
+
+	/* no done bit, so no need to wait config done take effect */
+	if (done_bits == 0)
+		return 0;
+
+	vp_id = ffs(done_bits) - 1;
+	/* done bit is same with current vp config done, so no need to wait */
+	if (hweight32(done_bits) == 1 && vp_id == vp->id)
+		return 0;
+
+	/* have the other one different vp, wait for config done take effect */
+	if (hweight32(done_bits) == 1 ||
+	    (hweight32(done_bits) == 2 && (done_bits & BIT(vp->id)))) {
+		/* two done bit, clear current vp done bit and find the other done bit vp */
+		if (done_bits & BIT(vp->id))
+			done_bits &= ~BIT(vp->id);
 		vp_id = ffs(done_bits) - 1;
-		/* no need to wait for same vp */
-		if (vp_id != vp->id) {
-			done_vp = &vop2->vps[vp_id];
-			adjusted_mode = &done_vp->crtc.state->adjusted_mode;
-			vcnt = vop2_read_vcnt(done_vp);
-			if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)
-				vcnt >>= 1;
-			/* if close to the last 1/8 frame, wait to next frame */
-			if (vcnt > (adjusted_mode->crtc_vtotal * 7 >> 3)) {
-				vop2_wait_for_fs_by_raw_status(done_vp);
-				done_bits = 0;
-			}
+		done_vp = &vop2->vps[vp_id];
+		adjusted_mode = &done_vp->crtc.state->adjusted_mode;
+		vcnt = vop2_read_vcnt(done_vp);
+		if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)
+			vcnt >>= 1;
+		/* if close to the last 1/8 frame, wait to next frame */
+		if (vcnt > (adjusted_mode->crtc_vtotal * 7 >> 3)) {
+			vop2_wait_for_fs_by_raw_status(done_vp);
+			done_bits = 0;
 		}
-	}
+	} else { /* exist the other two vp done bit */
+		struct drm_display_mode *first_mode, *second_mode;
+		struct vop2_video_port *first_done_vp, *second_done_vp, *wait_vp;
+		uint32_t first_vp_id, second_vp_id;
+		uint32_t first_vp_vcnt, second_vp_vcnt;
+		uint32_t first_vp_left_vcnt, second_vp_left_vcnt;
+		uint32_t first_vp_left_time, second_vp_left_time;
+		uint32_t first_vp_safe_time, second_vp_safe_time;
+
+		first_vp_id = ffs(done_bits) - 1;
+		first_done_vp = &vop2->vps[first_vp_id];
+		first_mode = &first_done_vp->crtc.state->adjusted_mode;
+		/* set last 1/8 frame time as safe section */
+		first_vp_safe_time = 1000000 / first_mode->vrefresh >> 3;
+
+		done_bits &= ~BIT(first_vp_id);
+		second_vp_id = ffs(done_bits) - 1;
+		second_done_vp = &vop2->vps[second_vp_id];
+		second_mode = &second_done_vp->crtc.state->adjusted_mode;
+		/* set last 1/8 frame time as safe section */
+		second_vp_safe_time = 1000000 / second_mode->vrefresh >> 3;
+
+		first_vp_vcnt = vop2_read_vcnt(first_done_vp);
+		if (first_mode->flags & DRM_MODE_FLAG_INTERLACE)
+			first_vp_vcnt >>= 1;
+		second_vp_vcnt = vop2_read_vcnt(second_done_vp);
+		if (second_mode->flags & DRM_MODE_FLAG_INTERLACE)
+			second_vp_vcnt >>= 1;
+
+		first_vp_left_vcnt = first_mode->crtc_vtotal - first_vp_vcnt;
+		second_vp_left_vcnt = second_mode->crtc_vtotal - second_vp_vcnt;
+		first_vp_left_time = vop2_line_to_time(first_mode, first_vp_left_vcnt);
+		second_vp_left_time = vop2_line_to_time(second_mode, second_vp_left_vcnt);
+
+		/* if the two vp both at safe section, no need to wait */
+		if (first_vp_left_time > first_vp_safe_time &&
+		    second_vp_left_time > second_vp_safe_time)
+			return done_bits_bak;
+		if (first_vp_left_time > second_vp_left_time)
+			wait_vp = first_done_vp;
+		else
+			wait_vp = second_done_vp;
 
+		vop2_wait_for_fs_by_raw_status(wait_vp);
+		done_bits = 0;
+	}
 	return done_bits;
 }
 

commit a103f1595b5eced3ef63d5bf3d2dcb4124c7fc8e
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Thu Apr 1 16:32:13 2021 +0800

    drm/rockchip: vop2: add parse plane mask policy from uboot or dts file
    
    Change-Id: I8608dfeb44ab02717d64da151aefe1f9548c936b
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 66998a814790..0ee9b37f1b7c 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -183,6 +183,20 @@ enum vop2_pending {
 	VOP_PENDING_FB_UNREF,
 };
 
+enum vop2_layer_phy_id {
+	ROCKCHIP_VOP2_CLUSTER0 = 0,
+	ROCKCHIP_VOP2_CLUSTER1,
+	ROCKCHIP_VOP2_ESMART0,
+	ROCKCHIP_VOP2_ESMART1,
+	ROCKCHIP_VOP2_SMART0,
+	ROCKCHIP_VOP2_SMART1,
+	ROCKCHIP_VOP2_CLUSTER2,
+	ROCKCHIP_VOP2_CLUSTER3,
+	ROCKCHIP_VOP2_ESMART2,
+	ROCKCHIP_VOP2_ESMART3,
+	ROCKCHIP_VOP2_PHY_ID_INVALID = -1,
+};
+
 struct vop2_zpos {
 	int win_phys_id;
 	int zpos;
@@ -492,6 +506,23 @@ struct vop2_video_port {
 	 * @loader_protect: loader logo protect state
 	 */
 	bool loader_protect;
+
+	/**
+	 * @plane_mask: show the plane attach to this vp,
+	 * it maybe init at dts file or uboot driver
+	 */
+	uint32_t plane_mask;
+
+	/**
+	 * @plane_mask_prop: plane mask interaction with userspace
+	 */
+	struct drm_property *plane_mask_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 vop2 {
@@ -2338,21 +2369,8 @@ static void vop2_layer_map_initial(struct vop2 *vop2, uint32_t current_vp_id)
 			shift = vop2->data->ctrl->win_vp_id[j].shift;
 			vp_id = (win_map >> shift) & 0x3;
 			if (vp_id == i) {
-				/*
-				 * If the Video Port is not activated,
-				 * move the attached win to the last Video Port
-				 * we want enabled.
-				 */
-				if (active_vp_mask & BIT(vp_id)) {
-					vp->win_mask |=  BIT(j);
-					win->vp_mask = BIT(vp_id);
-
-				} else {
-					last_active_vp->win_mask |= BIT(j);
-					win->vp_mask = BIT(last_active_vp->id);
-					VOP_CTRL_SET(vop2, win_vp_id[win->phys_id], last_active_vp->id);
-
-				}
+				vp->win_mask |=  BIT(j);
+				win->vp_mask = BIT(vp_id);
 				win->old_vp_mask = win->vp_mask;
 			}
 		}
@@ -5642,6 +5660,40 @@ static void vop2_cubic_lut_init(struct vop2 *vop2)
 	}
 }
 
+static int vop2_crtc_create_plane_mask_property(struct vop2 *vop2,
+						struct drm_crtc *crtc)
+{
+	struct drm_property *prop;
+	struct vop2_video_port *vp = to_vop2_video_port(crtc);
+
+	static const struct drm_prop_enum_list props[] = {
+		{ ROCKCHIP_VOP2_CLUSTER0, "Cluster0" },
+		{ ROCKCHIP_VOP2_CLUSTER1, "Cluster1" },
+		{ ROCKCHIP_VOP2_ESMART0, "Esmart0" },
+		{ ROCKCHIP_VOP2_ESMART1, "Esmart1" },
+		{ ROCKCHIP_VOP2_SMART0, "Smart0" },
+		{ ROCKCHIP_VOP2_SMART1, "Smart1" },
+		{ ROCKCHIP_VOP2_CLUSTER2, "Cluster2" },
+		{ ROCKCHIP_VOP2_CLUSTER3, "Cluster3" },
+		{ ROCKCHIP_VOP2_ESMART2, "Esmart2" },
+		{ ROCKCHIP_VOP2_ESMART3, "Esmart3" },
+	};
+
+	prop = drm_property_create_bitmask(vop2->drm_dev,
+					   DRM_MODE_PROP_IMMUTABLE, "PLANE_MASK",
+					   props, ARRAY_SIZE(props),
+					   0xffffffff);
+	if (!prop) {
+		DRM_DEV_ERROR(vop2->dev, "create plane_mask prop for vp%d failed\n", vp->id);
+		return -ENOMEM;
+	}
+
+	vp->plane_mask_prop = prop;
+	drm_object_attach_property(&crtc->base, vp->plane_mask_prop, vp->plane_mask);
+
+	return 0;
+}
+
 static int vop2_create_crtc(struct vop2 *vop2)
 {
 	const struct vop2_data *vop2_data = vop2->data;
@@ -5656,8 +5708,10 @@ static int vop2_create_crtc(struct vop2 *vop2)
 	uint32_t possible_crtcs;
 	uint64_t soc_id;
 	char dclk_name[9];
-	int i = 0, j = 0;
+	int i = 0, j = 0, k = 0;
 	int ret = 0;
+	bool be_used_for_primary_plane = false;
+	bool find_primary_plane = false;
 
 	/* all planes can attach to any crtc */
 	possible_crtcs = (1 << vop2_data->nr_vps) - 1;
@@ -5687,16 +5741,41 @@ static int vop2_create_crtc(struct vop2 *vop2)
 
 		crtc = &vp->crtc;
 
-		while (j < vop2->registered_num_wins) {
-			win = &vop2->win[j];
-			j++;
+		if (vp->primary_plane_phy_id >= 0) {
+			win = vop2_find_win_by_phys_id(vop2, vp->primary_plane_phy_id);
+			if (win)
+				find_primary_plane = true;
+		} else {
+			while (j < vop2->registered_num_wins) {
+				be_used_for_primary_plane = false;
+				win = &vop2->win[j];
+				j++;
+
+				if (win->parent || (win->feature & WIN_FEATURE_CLUSTER_SUB))
+					continue;
+
+				if (win->type != DRM_PLANE_TYPE_PRIMARY)
+					continue;
+
+				for (k = 0; k < vop2_data->nr_vps; k++) {
+					if (win->phys_id == vop2->vps[k].primary_plane_phy_id) {
+						be_used_for_primary_plane = true;
+						break;
+					}
+				}
+
+				if (be_used_for_primary_plane)
+					continue;
 
-			if (win->type == DRM_PLANE_TYPE_PRIMARY)
+				find_primary_plane = true;
 				break;
-			win = NULL;
+			}
+
+			if (find_primary_plane)
+				vp->primary_plane_phy_id = win->phys_id;
 		}
 
-		if (!win) {
+		if (!find_primary_plane) {
 			DRM_DEV_ERROR(vop2->dev, "No primary plane find for video_port%d\n", i);
 			break;
 		}
@@ -5740,14 +5819,25 @@ static int vop2_create_crtc(struct vop2 *vop2)
 					   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);
 	}
 
 	/*
 	 * change the unused primary window to overlay window
 	 */
-	for (; j < vop2->registered_num_wins; j++) {
+	for (j = 0; j < vop2->registered_num_wins; j++) {
 		win = &vop2->win[j];
-		if (win->type == DRM_PLANE_TYPE_PRIMARY)
+		be_used_for_primary_plane = false;
+
+		for (k = 0; k < vop2_data->nr_vps; k++) {
+			if (vop2->vps[k].primary_plane_phy_id == win->phys_id) {
+				be_used_for_primary_plane = true;
+				break;
+			}
+		}
+
+		if (win->type == DRM_PLANE_TYPE_PRIMARY &&
+		    !be_used_for_primary_plane)
 			win->type = DRM_PLANE_TYPE_OVERLAY;
 	}
 
@@ -5918,6 +6008,7 @@ static int vop2_bind(struct device *dev, struct device *master, void *data)
 	size_t alloc_size;
 	int ret, i;
 	int num_wins = 0;
+	struct device_node *vop_out_node;
 
 	vop2_data = of_device_get_match_data(dev);
 	if (!vop2_data)
@@ -5988,6 +6079,31 @@ static int vop2_bind(struct device *dev, struct device *master, void *data)
 		return vop2->irq;
 	}
 
+	vop_out_node = of_get_child_by_name(dev->of_node, "ports");
+	if (vop_out_node) {
+		struct device_node *child;
+
+		for_each_child_of_node(vop_out_node, child) {
+			u32 plane_mask = 0;
+			u32 primary_plane_phy_id = 0;
+			u32 vp_id = 0;
+
+			of_property_read_u32(child, "rockchip,plane-mask", &plane_mask);
+			of_property_read_u32(child, "rockchip,primary-plane", &primary_plane_phy_id);
+			of_property_read_u32(child, "reg", &vp_id);
+
+			vop2->vps[vp_id].plane_mask = plane_mask;
+			if (plane_mask)
+				vop2->vps[vp_id].primary_plane_phy_id = primary_plane_phy_id;
+			else
+				vop2->vps[vp_id].primary_plane_phy_id = ROCKCHIP_VOP2_PHY_ID_INVALID;
+
+			DRM_DEV_INFO(dev, "vp%d assign plane mask: 0x%x, primary plane phy id: %d\n",
+				     vp_id, vop2->vps[vp_id].plane_mask,
+				     vop2->vps[vp_id].primary_plane_phy_id);
+		}
+	}
+
 	spin_lock_init(&vop2->reg_lock);
 	spin_lock_init(&vop2->irq_lock);
 	mutex_init(&vop2->vop2_lock);
diff --git a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
index 34251562e1e8..e7787297d8b2 100644
--- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
+++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
@@ -1101,20 +1101,20 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
 	  .regs = &rk3568_esmart_win_data,
 	  .area = rk3568_area_data,
 	  .area_size = ARRAY_SIZE(rk3568_area_data),
-	  .type = DRM_PLANE_TYPE_PRIMARY,
+	  .type = DRM_PLANE_TYPE_OVERLAY,
 	  .max_upscale_factor = 8,
 	  .max_downscale_factor = 8,
 	  .dly = { 20, 47, 41 },
 	},
 
 	{
-	  .name = "Smart0-win0",
-	  .phys_id = 4,
-	  .base = 0x400,
-	  .formats = formats_win_lite,
-	  .nformats = ARRAY_SIZE(formats_win_lite),
+	  .name = "Esmart1-win0",
+	  .phys_id = 3,
+	  .formats = formats_win_full_10bit_yuyv,
+	  .nformats = ARRAY_SIZE(formats_win_full_10bit_yuyv),
 	  .format_modifiers = format_modifiers,
-	  .layer_sel_id = 3,
+	  .base = 0x200,
+	  .layer_sel_id = 6,
 	  .supported_rotations = DRM_MODE_REFLECT_Y,
 	  .hsu_filter_mode = VOP2_SCALE_UP_BIC,
 	  .hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
@@ -1130,13 +1130,13 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
 	},
 
 	{
-	  .name = "Esmart1-win0",
-	  .phys_id = 3,
-	  .formats = formats_win_full_10bit_yuyv,
-	  .nformats = ARRAY_SIZE(formats_win_full_10bit_yuyv),
+	  .name = "Smart0-win0",
+	  .phys_id = 4,
+	  .base = 0x400,
+	  .formats = formats_win_lite,
+	  .nformats = ARRAY_SIZE(formats_win_lite),
 	  .format_modifiers = format_modifiers,
-	  .base = 0x200,
-	  .layer_sel_id = 6,
+	  .layer_sel_id = 3,
 	  .supported_rotations = DRM_MODE_REFLECT_Y,
 	  .hsu_filter_mode = VOP2_SCALE_UP_BIC,
 	  .hsd_filter_mode = VOP2_SCALE_DOWN_BIL,
@@ -1167,7 +1167,7 @@ static const struct vop2_win_data rk3568_vop_win_data[] = {
 	  .regs = &rk3568_esmart_win_data,
 	  .area = rk3568_area_data,
 	  .area_size = ARRAY_SIZE(rk3568_area_data),
-	  .type = DRM_PLANE_TYPE_OVERLAY,
+	  .type = DRM_PLANE_TYPE_PRIMARY,
 	  .max_upscale_factor = 8,
 	  .max_downscale_factor = 8,
 	  .dly = { 20, 47, 41 },

commit 6f9d003a83383494f91c806b5cf1fc0dec19395a
Author: Weixin Zhou <zwx@rock-chips.com>
Date:   Thu Apr 29 15:32:10 2021 +0800

    arm64: dts: rockchip: rk3566-eink: setting sleep_sta_ctl on in ultra sleep only
    
    Signed-off-by: Weixin Zhou <zwx@rock-chips.com>
    Change-Id: I40484a87ef97429649620adebdc466cfadad4dc3

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts
index fa08e6430d5d..76835f90c6e4 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w103.dts
@@ -1012,15 +1012,17 @@
 
 	rockchip,regulator-off-in-mem-lite =
 		<&vdd_cpu>, <&vdd_logic>, <&vdd_gpu>, <&vcc_3v3>, <&vdda_0v9>, <&vcc_1v8>,
-		<&vccio_acodec>, <&vccio_sd>, <&vcc1v8_dvp>, <&dcdc_boost>, <&otg_switch>;
+		<&vccio_acodec>, <&vccio_sd>, <&vcc1v8_dvp>, <&dcdc_boost>, <&otg_switch>,
+		<&sleep_sta_ctl>;
 	rockchip,regulator-on-in-mem-lite =
-		<&vcc_ddr>, <&vdda0v9_pmu>, <&vcca1v8_pmu>, <&vcc3v3_pmu>, <&sleep_sta_ctl>;
+		<&vcc_ddr>, <&vdda0v9_pmu>, <&vcca1v8_pmu>, <&vcc3v3_pmu>;
 
 	rockchip,regulator-off-in-mem =
 		<&vdd_cpu>, <&vdd_logic>, <&vdd_gpu>, <&vcc_3v3>, <&vdda_0v9>, <&vcc_1v8>,
-		<&vccio_acodec>, <&vccio_sd>, <&vcc1v8_dvp>, <&dcdc_boost>, <&otg_switch>;
+		<&vccio_acodec>, <&vccio_sd>, <&vcc1v8_dvp>, <&dcdc_boost>, <&otg_switch>,
+		<&sleep_sta_ctl>;
 	rockchip,regulator-on-in-mem =
-		<&vcc_ddr>, <&vdda0v9_pmu>, <&vcca1v8_pmu>, <&vcc3v3_pmu>, <&sleep_sta_ctl>;
+		<&vcc_ddr>, <&vdda0v9_pmu>, <&vcca1v8_pmu>, <&vcc3v3_pmu>;
 
 	rockchip,regulator-off-in-mem-ultra =
 		<&vdd_logic>, <&vdd_gpu>, <&vcc_ddr>, <&vcc_3v3>, <&vdda_0v9>, <&vcc_1v8>,
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w6.dts b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w6.dts
index 646f81e6ed95..abf696d333ae 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w6.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-rk817-eink-w6.dts
@@ -865,15 +865,17 @@
 
 	rockchip,regulator-off-in-mem-lite =
 		<&vdd_cpu>, <&vdd_logic>, <&vdd_gpu>, <&vcc_3v3>, <&vdda_0v9>, <&vcc_1v8>,
-		<&vccio_acodec>, <&vccio_sd>, <&vcc1v8_dvp>, <&dcdc_boost>, <&otg_switch>;
+		<&vccio_acodec>, <&vccio_sd>, <&vcc1v8_dvp>, <&dcdc_boost>, <&otg_switch>,
+		<&sleep_sta_ctl>;
 	rockchip,regulator-on-in-mem-lite =
-		<&vcc_ddr>, <&vdda0v9_pmu>, <&vcca1v8_pmu>, <&vcc3v3_pmu>, <&sleep_sta_ctl>;
+		<&vcc_ddr>, <&vdda0v9_pmu>, <&vcca1v8_pmu>, <&vcc3v3_pmu>;
 
 	rockchip,regulator-off-in-mem =
 		<&vdd_cpu>, <&vdd_logic>, <&vdd_gpu>, <&vcc_3v3>, <&vdda_0v9>, <&vcc_1v8>,
-		<&vccio_acodec>, <&vccio_sd>, <&vcc1v8_dvp>, <&dcdc_boost>, <&otg_switch>;
+		<&vccio_acodec>, <&vccio_sd>, <&vcc1v8_dvp>, <&dcdc_boost>, <&otg_switch>,
+		<&sleep_sta_ctl>;
 	rockchip,regulator-on-in-mem =
-		<&vcc_ddr>, <&vdda0v9_pmu>, <&vcca1v8_pmu>, <&vcc3v3_pmu>, <&sleep_sta_ctl>;
+		<&vcc_ddr>, <&vdda0v9_pmu>, <&vcca1v8_pmu>, <&vcc3v3_pmu>;
 
 	rockchip,regulator-off-in-mem-ultra =
 		<&vdd_logic>, <&vdd_gpu>, <&vcc_ddr>, <&vcc_3v3>, <&vdda_0v9>, <&vcc_1v8>,

commit c17664980987fdfc01e3d3c7edb80d3d039d4f9e
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Mon Apr 12 11:47:17 2021 +0800

    arm64: dts: rockchip: rk3568: set display endpoint default as disabled
    
    Change-Id: I3e8544ca6764aaa6c4327ad58e227a5e091e7dc9
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index b69fd56d14d6..b5250f1cc1c6 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -712,11 +712,13 @@
 					lvds_in_vp1: endpoint@1 {
 						reg = <1>;
 						remote-endpoint = <&vp1_out_lvds>;
+						status = "disabled";
 					};
 
 					lvds_in_vp2: endpoint@2 {
 						reg = <2>;
 						remote-endpoint = <&vp2_out_lvds>;
+						status = "disabled";
 					};
 				};
 			};
@@ -740,6 +742,7 @@
 					rgb_in_vp2: endpoint@2 {
 						reg = <2>;
 						remote-endpoint = <&vp2_out_rgb>;
+						status = "disabled";
 					};
 				};
 			};
@@ -1741,11 +1744,13 @@
 				dsi0_in_vp0: endpoint@0 {
 					reg = <0>;
 					remote-endpoint = <&vp0_out_dsi0>;
+					status = "disabled";
 				};
 
 				dsi0_in_vp1: endpoint@1 {
 					reg = <1>;
 					remote-endpoint = <&vp1_out_dsi0>;
+					status = "disabled";
 				};
 			};
 		};
@@ -1779,11 +1784,13 @@
 				dsi1_in_vp0: endpoint@0 {
 					reg = <0>;
 					remote-endpoint = <&vp0_out_dsi1>;
+					status = "disabled";
 				};
 
 				dsi1_in_vp1: endpoint@1 {
 					reg = <1>;
 					remote-endpoint = <&vp1_out_dsi1>;
+					status = "disabled";
 				};
 			};
 		};
@@ -1819,10 +1826,12 @@
 				hdmi_in_vp0: endpoint@0 {
 					reg = <0>;
 					remote-endpoint = <&vp0_out_hdmi>;
+					status = "disabled";
 				};
 				hdmi_in_vp1: endpoint@1 {
 					reg = <1>;
 					remote-endpoint = <&vp1_out_hdmi>;
+					status = "disabled";
 				};
 			};
 		};
@@ -1854,11 +1863,13 @@
 				edp_in_vp0: endpoint@0 {
 					reg = <0>;
 					remote-endpoint = <&vp0_out_edp>;
+					status = "disabled";
 				};
 
 				edp_in_vp1: endpoint@1 {
 					reg = <1>;
 					remote-endpoint = <&vp1_out_edp>;
+					status = "disabled";
 				};
 			};
 		};

commit 8584171ed155cd9b1a466a04d2aeb040a833a10e
Author: Sandy Huang <hjc@rock-chips.com>
Date:   Thu Apr 1 16:10:03 2021 +0800

    arm64: dts: rockchip: rk3568: VOP: export VP to other dts file
    
    Change-Id: I4172f4af7818f0fb5e49d438600debbd4bce2a0a
    Signed-off-by: Sandy Huang <hjc@rock-chips.com>

diff --git a/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
index d0674f8ebaad..b69fd56d14d6 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -1626,7 +1626,7 @@
 			#address-cells = <1>;
 			#size-cells = <0>;
 
-			port@0 {
+			vp0: port@0 {
 				#address-cells = <1>;
 				#size-cells = <0>;
 				reg = <0>;
@@ -1652,7 +1652,7 @@
 				};
 			};
 
-			port@1 {
+			vp1: port@1 {
 				#address-cells = <1>;
 				#size-cells = <0>;
 				reg = <1>;
@@ -1683,7 +1683,7 @@
 				};
 			};
 
-			port@2 {
+			vp2: port@2 {
 				#address-cells = <1>;
 				#size-cells = <0>;
 

commit 1c25cf621d15e9831d7783ae34fb43b4dc084419
Author: Lucas Wei <lucaswei@google.com>
Date:   Mon May 3 17:02:17 2021 +0800

    ANDROID: Add allowed symbols requried from Qualcomm drivers
    
    Kernel modules of qpnp-smb5-charger.ko, swr_ctrl_dlkm.ko and msm_drm.ko
    added new requirements to exported kernel symbols. Add these symbols
    into symbol list to make it able to boot with android common kernel.
    
    Leaf changes summary: 4 artifacts changed
    Changed leaf types summary: 0 leaf type changed
    Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 4 Added functions
    Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
    
    4 Added functions:
    
      [A] 'function ktime_t alarm_expires_remaining(const alarm*)'
      [A] 'function bool drm_edid_is_valid(edid*)'
      [A] 'function unsigned long int pm_runtime_autosuspend_expiration(device*)'
      [A] 'function void tracing_off()'
    
    Bug: 185091725
    Signed-off-by: Lucas Wei <lucaswei@google.com>
    Change-Id: Iadd6de18f536a3763becf1c62e152124be9ef405
    Signed-off-by: Will McVicker <willmcvicker@google.com>

diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml
index 3b12c60044c1..c6606fbaa47b 100644
--- a/android/abi_gki_aarch64.xml
+++ b/android/abi_gki_aarch64.xml
@@ -235,6 +235,7 @@
       <elf-symbol name='add_wait_queue' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x4afb2238'/>
       <elf-symbol name='adjust_managed_page_count' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x370cd115'/>
       <elf-symbol name='alarm_cancel' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xf0b3bbbb'/>
+      <elf-symbol name='alarm_expires_remaining' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x69601b41'/>
       <elf-symbol name='alarm_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x63c58846'/>
       <elf-symbol name='alarm_start_relative' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xf4c845c2'/>
       <elf-symbol name='alarm_try_to_cancel' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x6c8fceb6'/>
@@ -828,6 +829,7 @@
       <elf-symbol name='drm_dp_update_payload_part1' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x53c06af8'/>
       <elf-symbol name='drm_dp_update_payload_part2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xf02c1b64'/>
       <elf-symbol name='drm_edid_duplicate' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x47f985aa'/>
+      <elf-symbol name='drm_edid_is_valid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x7f88521'/>
       <elf-symbol name='drm_encoder_cleanup' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xafd739cb'/>
       <elf-symbol name='drm_encoder_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x81bf525e'/>
       <elf-symbol name='drm_err' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x1dd71f7a'/>
@@ -1733,6 +1735,7 @@
       <elf-symbol name='pm_qos_update_request_timeout' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x7c7744d2'/>
       <elf-symbol name='pm_relax' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x7d836ef5'/>
       <elf-symbol name='pm_runtime_allow' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x853cb911'/>
+      <elf-symbol name='pm_runtime_autosuspend_expiration' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x539b1671'/>
       <elf-symbol name='pm_runtime_barrier' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x8961278f'/>
       <elf-symbol name='pm_runtime_enable' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xcdf8db7e'/>
       <elf-symbol name='pm_runtime_forbid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x6bad25fb'/>
@@ -2325,6 +2328,7 @@
       <elf-symbol name='trace_print_symbols_seq' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x61520529'/>
       <elf-symbol name='trace_raw_output_prep' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x830e5e3a'/>
       <elf-symbol name='trace_seq_printf' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x11caddc7'/>
+      <elf-symbol name='tracing_off' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x7944e0fc'/>
       <elf-symbol name='truncate_inode_pages' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x728ccc88'/>
       <elf-symbol name='try_module_get' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xd1f9d731'/>
       <elf-symbol name='try_to_del_timer_sync' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0xfaf9e645'/>
@@ -10811,7 +10815,7 @@
           <var-decl name='module' type-id='7a2c185b' visibility='default' filepath='kernel/audit.h' line='205' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__8' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/cred.h' line='154' column='1' id='0a97cc35'>
+      <union-decl name='__anonymous_union__13' size-in-bits='128' is-anonymous='yes' visibility='default' filepath='include/linux/cred.h' line='154' column='1' id='0a97cc35'>
         <data-member access='public'>
           <var-decl name='non_rcu' type-id='95e97e5e' visibility='default' filepath='include/linux/cred.h' line='155' column='1'/>
         </data-member>
@@ -16676,7 +16680,7 @@
           <var-decl name='__rcu_head' type-id='e3d8ce29' visibility='default' filepath='include/linux/iocontext.h' line='89' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__33' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='1176' column='1' id='adf5bf47'>
+      <union-decl name='__anonymous_union__36' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/sock.h' line='1176' column='1' id='adf5bf47'>
         <data-member access='public'>
           <var-decl name='hashinfo' type-id='d7a1e3c2' visibility='default' filepath='include/net/sock.h' line='1177' column='1'/>
         </data-member>
@@ -16690,7 +16694,7 @@
           <var-decl name='smc_hash' type-id='aa8162a3' visibility='default' filepath='include/net/sock.h' line='1180' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__7' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='214' column='1' id='d5d77d48'>
+      <union-decl name='__anonymous_union__12' size-in-bits='256' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='214' column='1' id='d5d77d48'>
         <data-member access='public'>
           <var-decl name='payload' type-id='2888d74a' visibility='default' filepath='include/linux/key.h' line='215' column='1'/>
         </data-member>
@@ -16698,7 +16702,7 @@
           <var-decl name='' type-id='607bacb1' visibility='default' filepath='include/linux/key.h' line='216' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__6' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='202' column='1' id='5446e20e'>
+      <union-decl name='__anonymous_union__11' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='202' column='1' id='5446e20e'>
         <data-member access='public'>
           <var-decl name='index_key' type-id='16ab8749' visibility='default' filepath='include/linux/key.h' line='203' column='1'/>
         </data-member>
@@ -16714,7 +16718,7 @@
           <var-decl name='d_wait' type-id='03d48e96' visibility='default' filepath='include/linux/dcache.h' line='109' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__4' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='158' column='1' id='1a65b0a7'>
+      <union-decl name='__anonymous_union__9' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='158' column='1' id='1a65b0a7'>
         <data-member access='public'>
           <var-decl name='graveyard_link' type-id='72f469ec' visibility='default' filepath='include/linux/key.h' line='159' column='1'/>
         </data-member>
@@ -16769,7 +16773,7 @@
           <var-decl name='insnsi' type-id='b50399da' visibility='default' filepath='include/linux/filter.h' line='504' column='1'/>
         </data-member>
       </union-decl>
-      <union-decl name='__anonymous_union__5' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='165' column='1' id='21f0eb77'>
+      <union-decl name='__anonymous_union__10' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/key.h' line='165' column='1' id='21f0eb77'>
         <data-member access='public'>
           <var-decl name='expiry' type-id='1afd27ac' visibility='default' filepath='include/linux/key.h' line='166' column='1'/>
         </data-member>
@@ -22469,7 +22473,7 @@
           <var-decl name='lower' type-id='72f469ec' visibility='default' filepath='include/linux/netdevice.h' line='1814' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__4' size-in-bits='768' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/slab.h' line='641' column='1' id='26b3aff0'>
+      <class-decl name='__anonymous_struct__3' size-in-bits='768' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/slab.h' line='641' column='1' id='26b3aff0'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='memcg' type-id='223696fb' visibility='default' filepath='include/linux/slab.h' line='642' column='1'/>
         </data-member>
@@ -22486,7 +22490,7 @@
           <var-decl name='' type-id='655b0d99' visibility='default' filepath='include/linux/slab.h' line='647' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__3' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/slab.h' line='635' column='1' id='22e2627b'>
+      <class-decl name='__anonymous_struct__2' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/slab.h' line='635' column='1' id='22e2627b'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='memcg_caches' type-id='2c8ce02f' visibility='default' filepath='include/linux/slab.h' line='636' column='1'/>
         </data-member>
@@ -30297,7 +30301,7 @@
       <array-type-def dimensions='1' type-id='19c2251e' size-in-bits='64' id='1872161b'>
         <subrange length='2' type-id='7ff19f0f' id='52efc4ef'/>
       </array-type-def>
-      <union-decl name='__anonymous_union__13' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/cfg80211.h' line='2331' column='1' id='0532d6f6'>
+      <union-decl name='__anonymous_union__3' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/cfg80211.h' line='2331' column='1' id='0532d6f6'>
         <data-member access='public'>
           <var-decl name='band_pref' type-id='3eaa0294' visibility='default' filepath='include/net/cfg80211.h' line='2332' column='1'/>
         </data-member>
@@ -31637,6 +31641,9 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='arch/arm64/kernel/traps.c' language='LANG_C89'>
+      <function-decl name='tracing_off' mangled-name='tracing_off' filepath='include/linux/kernel.h' line='641' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='tracing_off'>
+        <return type-id='48b5725f'/>
+      </function-decl>
       <function-decl name='do_exit' mangled-name='do_exit' filepath='include/linux/kernel.h' line='307' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='do_exit'>
         <parameter type-id='bd54fe1a'/>
         <return type-id='48b5725f'/>
@@ -40837,17 +40844,6 @@
       </class-decl>
       <typedef-decl name='compat_uptr_t' type-id='19c2251e' filepath='arch/arm64/include/asm/compat.h' line='66' column='1' id='782d78af'/>
       <typedef-decl name='compat_long_t' type-id='a7832498' filepath='arch/arm64/include/asm/compat.h' line='60' column='1' id='abb906de'/>
-      <union-decl name='__anonymous_union__21' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='ecf138a1'>
-        <data-member access='public'>
-          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide67' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
-        </data-member>
-      </union-decl>
       <pointer-type-def type-id='85c22421' size-in-bits='64' id='ee406209'/>
       <pointer-type-def type-id='830ee0a7' size-in-bits='64' id='5d3a884e'/>
       <pointer-type-def type-id='3b5c61ad' size-in-bits='64' id='a38aafde'/>
@@ -44722,6 +44718,10 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='drivers/base/power/runtime.c' language='LANG_C89'>
+      <function-decl name='pm_runtime_autosuspend_expiration' mangled-name='pm_runtime_autosuspend_expiration' filepath='drivers/base/power/runtime.c' line='127' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_runtime_autosuspend_expiration'>
+        <parameter type-id='fa0b179b' name='dev' filepath='drivers/base/power/runtime.c' line='127' column='1'/>
+        <return type-id='7359adad'/>
+      </function-decl>
       <function-decl name='__pm_runtime_idle' mangled-name='__pm_runtime_idle' filepath='drivers/base/power/runtime.c' line='963' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__pm_runtime_idle'>
         <parameter type-id='fa0b179b' name='dev' filepath='drivers/base/power/runtime.c' line='963' column='1'/>
         <parameter type-id='95e97e5e' name='rpmflags' filepath='drivers/base/power/runtime.c' line='963' column='1'/>
@@ -52855,7 +52855,7 @@
           <var-decl name='nh' type-id='708c2394' visibility='default' filepath='include/drm/drm_panel.h' line='122' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__1' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/drm/drm_device.h' line='205' column='1' id='76c13bb3'>
+      <class-decl name='__anonymous_struct__' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/drm/drm_device.h' line='205' column='1' id='76c13bb3'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='context' type-id='95e97e5e' visibility='default' filepath='include/drm/drm_device.h' line='206' column='1'/>
         </data-member>
@@ -54478,7 +54478,7 @@
           <var-decl name='skip_vt_switch' type-id='b50a4934' visibility='default' filepath='include/linux/fb.h' line='530' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__2' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/drm/drm_connector.h' line='399' column='1' id='34ac2cf8'>
+      <class-decl name='__anonymous_struct__1' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/drm/drm_connector.h' line='399' column='1' id='34ac2cf8'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='left' type-id='f0981eeb' visibility='default' filepath='include/drm/drm_connector.h' line='400' column='1'/>
         </data-member>
@@ -58165,7 +58165,7 @@
         <enumerator name='NOT_SUPPORTED' value='0'/>
         <enumerator name='SUPPORTED' value='1'/>
       </enum-decl>
-      <class-decl name='__anonymous_struct__1' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/drm/drm_device.h' line='205' column='1' id='76c13bb3'>
+      <class-decl name='__anonymous_struct__' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/drm/drm_device.h' line='205' column='1' id='76c13bb3'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='context' type-id='95e97e5e' visibility='default' filepath='include/drm/drm_device.h' line='206' column='1'/>
         </data-member>
@@ -59778,7 +59778,7 @@
         <enumerator name='DRM_MODE_SUBCONNECTOR_Component' value='8'/>
         <enumerator name='DRM_MODE_SUBCONNECTOR_SCART' value='9'/>
       </enum-decl>
-      <class-decl name='__anonymous_struct__2' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/drm/drm_connector.h' line='399' column='1' id='34ac2cf8'>
+      <class-decl name='__anonymous_struct__1' size-in-bits='128' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/drm/drm_connector.h' line='399' column='1' id='34ac2cf8'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='left' type-id='f0981eeb' visibility='default' filepath='include/drm/drm_connector.h' line='400' column='1'/>
         </data-member>
@@ -62576,6 +62576,10 @@
     </abi-instr>
     <abi-instr address-size='64' path='drivers/gpu/drm/drm_edid.c' language='LANG_C89'>
       <pointer-type-def type-id='c3fc04e5' size-in-bits='64' id='e879a339'/>
+      <function-decl name='drm_edid_is_valid' mangled-name='drm_edid_is_valid' filepath='drivers/gpu/drm/drm_edid.c' line='1488' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_edid_is_valid'>
+        <parameter type-id='c91d1bf1' name='edid' filepath='drivers/gpu/drm/drm_edid.c' line='1488' column='1'/>
+        <return type-id='b50a4934'/>
+      </function-decl>
       <function-decl name='drm_add_edid_modes' mangled-name='drm_add_edid_modes' filepath='drivers/gpu/drm/drm_edid.c' line='5101' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='drm_add_edid_modes'>
         <parameter type-id='4db02c58' name='connector' filepath='drivers/gpu/drm/drm_edid.c' line='5101' column='1'/>
         <parameter type-id='c91d1bf1' name='edid' filepath='drivers/gpu/drm/drm_edid.c' line='5101' column='1'/>
@@ -80197,6 +80201,17 @@
           <var-decl name='rcu' type-id='e3d8ce29' visibility='default' filepath='include/net/netns/generic.h' line='32' column='1'/>
         </data-member>
       </class-decl>
+      <union-decl name='__anonymous_union__24' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/dcache.h' line='154' column='1' id='11e6121d'>
+        <data-member access='public'>
+          <var-decl name='d_canonical_path' type-id='8581ac2b' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='__UNIQUE_ID_android_kabi_hide56' type-id='156952c4' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
+        </data-member>
+        <data-member access='public'>
+          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/dcache.h' line='154' column='1'/>
+        </data-member>
+      </union-decl>
       <class-decl name='nf_conntrack' size-in-bits='32' is-struct='yes' visibility='default' filepath='include/linux/skbuff.h' line='248' column='1' id='d9fc42c3'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='use' type-id='49178f86' visibility='default' filepath='include/linux/skbuff.h' line='249' column='1'/>
@@ -87534,7 +87549,7 @@
         <enumerator name='PIN_MAP_TYPE_CONFIGS_PIN' value='3'/>
         <enumerator name='PIN_MAP_TYPE_CONFIGS_GROUP' value='4'/>
       </enum-decl>
-      <union-decl name='__anonymous_union__1' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/pinctrl/machine.h' line='73' column='1' id='2789d524'>
+      <union-decl name='__anonymous_union__' size-in-bits='192' is-anonymous='yes' visibility='default' filepath='include/linux/pinctrl/machine.h' line='73' column='1' id='2789d524'>
         <data-member access='public'>
           <var-decl name='mux' type-id='ad4dd73d' visibility='default' filepath='include/linux/pinctrl/machine.h' line='74' column='1'/>
         </data-member>
@@ -110341,24 +110356,24 @@
         <enumerator name='PM_QOS_REQ_AFFINE_IRQ' value='2'/>
       </enum-decl>
       <pointer-type-def type-id='cd6fc142' size-in-bits='64' id='221c3010'/>
-      <function-decl name='pm_qos_request_for_cpu' mangled-name='pm_qos_request_for_cpu' filepath='kernel/power/qos.c' line='437' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_qos_request_for_cpu'>
-        <parameter type-id='95e97e5e' name='pm_qos_class' filepath='kernel/power/qos.c' line='437' column='1'/>
-        <parameter type-id='95e97e5e' name='cpu' filepath='kernel/power/qos.c' line='437' column='1'/>
+      <function-decl name='pm_qos_request_for_cpu' mangled-name='pm_qos_request_for_cpu' filepath='kernel/power/qos.c' line='451' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_qos_request_for_cpu'>
+        <parameter type-id='95e97e5e' name='pm_qos_class' filepath='kernel/power/qos.c' line='451' column='1'/>
+        <parameter type-id='95e97e5e' name='cpu' filepath='kernel/power/qos.c' line='451' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='pm_qos_request_active' mangled-name='pm_qos_request_active' filepath='kernel/power/qos.c' line='443' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_qos_request_active'>
-        <parameter type-id='221c3010' name='req' filepath='kernel/power/qos.c' line='443' column='1'/>
+      <function-decl name='pm_qos_request_active' mangled-name='pm_qos_request_active' filepath='kernel/power/qos.c' line='457' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_qos_request_active'>
+        <parameter type-id='221c3010' name='req' filepath='kernel/power/qos.c' line='457' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='pm_qos_request_for_cpumask' mangled-name='pm_qos_request_for_cpumask' filepath='kernel/power/qos.c' line='449' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_qos_request_for_cpumask'>
-        <parameter type-id='95e97e5e' name='pm_qos_class' filepath='kernel/power/qos.c' line='449' column='1'/>
-        <parameter type-id='74bccedd' name='mask' filepath='kernel/power/qos.c' line='449' column='1'/>
+      <function-decl name='pm_qos_request_for_cpumask' mangled-name='pm_qos_request_for_cpumask' filepath='kernel/power/qos.c' line='463' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_qos_request_for_cpumask'>
+        <parameter type-id='95e97e5e' name='pm_qos_class' filepath='kernel/power/qos.c' line='463' column='1'/>
+        <parameter type-id='74bccedd' name='mask' filepath='kernel/power/qos.c' line='463' column='1'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='pm_qos_add_request' mangled-name='pm_qos_add_request' filepath='kernel/power/qos.c' line='555' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_qos_add_request'>
-        <parameter type-id='221c3010' name='req' filepath='kernel/power/qos.c' line='555' column='1'/>
-        <parameter type-id='95e97e5e' name='pm_qos_class' filepath='kernel/power/qos.c' line='556' column='1'/>
-        <parameter type-id='a7832498' name='value' filepath='kernel/power/qos.c' line='556' column='1'/>
+      <function-decl name='pm_qos_add_request' mangled-name='pm_qos_add_request' filepath='kernel/power/qos.c' line='570' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_qos_add_request'>
+        <parameter type-id='221c3010' name='req' filepath='kernel/power/qos.c' line='570' column='1'/>
+        <parameter type-id='95e97e5e' name='pm_qos_class' filepath='kernel/power/qos.c' line='571' column='1'/>
+        <parameter type-id='a7832498' name='value' filepath='kernel/power/qos.c' line='571' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
       <function-decl name='irq_set_affinity_notifier' mangled-name='irq_set_affinity_notifier' filepath='include/linux/interrupt.h' line='300' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='irq_set_affinity_notifier'>
@@ -110366,19 +110381,19 @@
         <parameter type-id='7ca8e198'/>
         <return type-id='95e97e5e'/>
       </function-decl>
-      <function-decl name='pm_qos_update_request' mangled-name='pm_qos_update_request' filepath='kernel/power/qos.c' line='643' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_qos_update_request'>
-        <parameter type-id='221c3010' name='req' filepath='kernel/power/qos.c' line='643' column='1'/>
-        <parameter type-id='a7832498' name='new_value' filepath='kernel/power/qos.c' line='644' column='1'/>
+      <function-decl name='pm_qos_update_request' mangled-name='pm_qos_update_request' filepath='kernel/power/qos.c' line='658' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_qos_update_request'>
+        <parameter type-id='221c3010' name='req' filepath='kernel/power/qos.c' line='658' column='1'/>
+        <parameter type-id='a7832498' name='new_value' filepath='kernel/power/qos.c' line='659' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='pm_qos_update_request_timeout' mangled-name='pm_qos_update_request_timeout' filepath='kernel/power/qos.c' line='667' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_qos_update_request_timeout'>
-        <parameter type-id='221c3010' name='req' filepath='kernel/power/qos.c' line='667' column='1'/>
-        <parameter type-id='a7832498' name='new_value' filepath='kernel/power/qos.c' line='667' column='1'/>
-        <parameter type-id='7359adad' name='timeout_us' filepath='kernel/power/qos.c' line='668' column='1'/>
+      <function-decl name='pm_qos_update_request_timeout' mangled-name='pm_qos_update_request_timeout' filepath='kernel/power/qos.c' line='682' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_qos_update_request_timeout'>
+        <parameter type-id='221c3010' name='req' filepath='kernel/power/qos.c' line='682' column='1'/>
+        <parameter type-id='a7832498' name='new_value' filepath='kernel/power/qos.c' line='682' column='1'/>
+        <parameter type-id='7359adad' name='timeout_us' filepath='kernel/power/qos.c' line='683' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
-      <function-decl name='pm_qos_remove_request' mangled-name='pm_qos_remove_request' filepath='kernel/power/qos.c' line='697' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_qos_remove_request'>
-        <parameter type-id='221c3010' name='req' filepath='kernel/power/qos.c' line='697' column='1'/>
+      <function-decl name='pm_qos_remove_request' mangled-name='pm_qos_remove_request' filepath='kernel/power/qos.c' line='712' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='pm_qos_remove_request'>
+        <parameter type-id='221c3010' name='req' filepath='kernel/power/qos.c' line='712' column='1'/>
         <return type-id='48b5725f'/>
       </function-decl>
     </abi-instr>
@@ -123630,10 +123645,16 @@
         <enumerator name='ALARM_BOOTTIME_FREEZER' value='4'/>
       </enum-decl>
       <pointer-type-def type-id='f6b32752' size-in-bits='64' id='be65fdd0'/>
+      <qualified-type-def type-id='f6b32752' const='yes' id='dba44491'/>
+      <pointer-type-def type-id='dba44491' size-in-bits='64' id='7e983261'/>
       <pointer-type-def type-id='63df6bcc' size-in-bits='64' id='7432d5be'/>
       <function-decl name='alarmtimer_get_rtcdev' mangled-name='alarmtimer_get_rtcdev' filepath='kernel/time/alarmtimer.c' line='75' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='alarmtimer_get_rtcdev'>
         <return type-id='5992ae83'/>
       </function-decl>
+      <function-decl name='alarm_expires_remaining' mangled-name='alarm_expires_remaining' filepath='kernel/time/alarmtimer.c' line='230' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='alarm_expires_remaining'>
+        <parameter type-id='7e983261' name='alarm' filepath='kernel/time/alarmtimer.c' line='230' column='1'/>
+        <return type-id='fbc017ef'/>
+      </function-decl>
       <function-decl name='alarm_init' mangled-name='alarm_init' filepath='kernel/time/alarmtimer.c' line='348' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='alarm_init'>
         <parameter type-id='be65fdd0' name='alarm' filepath='kernel/time/alarmtimer.c' line='348' column='1'/>
         <parameter type-id='6b8d4b77' name='type' filepath='kernel/time/alarmtimer.c' line='348' column='1'/>
@@ -125572,12 +125593,12 @@
     </abi-instr>
     <abi-instr address-size='64' path='mm/gup.c' language='LANG_C89'>
       <pointer-type-def type-id='2ae08426' size-in-bits='64' id='8b6fdee4'/>
-      <function-decl name='get_user_pages' mangled-name='get_user_pages' filepath='mm/gup.c' line='1110' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_user_pages'>
-        <parameter type-id='7359adad' name='start' filepath='mm/gup.c' line='1110' column='1'/>
-        <parameter type-id='7359adad' name='nr_pages' filepath='mm/gup.c' line='1110' column='1'/>
-        <parameter type-id='f0981eeb' name='gup_flags' filepath='mm/gup.c' line='1111' column='1'/>
-        <parameter type-id='9f93c9da' name='pages' filepath='mm/gup.c' line='1111' column='1'/>
-        <parameter type-id='8b6fdee4' name='vmas' filepath='mm/gup.c' line='1112' column='1'/>
+      <function-decl name='get_user_pages' mangled-name='get_user_pages' filepath='mm/gup.c' line='1125' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='get_user_pages'>
+        <parameter type-id='7359adad' name='start' filepath='mm/gup.c' line='1125' column='1'/>
+        <parameter type-id='7359adad' name='nr_pages' filepath='mm/gup.c' line='1125' column='1'/>
+        <parameter type-id='f0981eeb' name='gup_flags' filepath='mm/gup.c' line='1126' column='1'/>
+        <parameter type-id='9f93c9da' name='pages' filepath='mm/gup.c' line='1126' column='1'/>
+        <parameter type-id='8b6fdee4' name='vmas' filepath='mm/gup.c' line='1127' column='1'/>
         <return type-id='bd54fe1a'/>
       </function-decl>
     </abi-instr>
@@ -125787,28 +125808,6 @@
       </function-decl>
     </abi-instr>
     <abi-instr address-size='64' path='mm/shmem.c' language='LANG_C89'>
-      <union-decl name='__anonymous_union__8' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/sched.h' line='1296' column='1' id='8b4442cd'>
-        <data-member access='public'>
-          <var-decl name='frozen' type-id='f0981eeb' visibility='default' filepath='include/linux/sched.h' line='1296' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide46' type-id='156952c4' visibility='default' filepath='include/linux/sched.h' line='1296' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/sched.h' line='1296' column='1'/>
-        </data-member>
-      </union-decl>
-      <union-decl name='__anonymous_union__10' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/linux/sched.h' line='1299' column='1' id='121e4767'>
-        <data-member access='public'>
-          <var-decl name='futex_state' type-id='f0981eeb' visibility='default' filepath='include/linux/sched.h' line='1299' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='__UNIQUE_ID_android_kabi_hide47' type-id='6040de71' visibility='default' filepath='include/linux/sched.h' line='1299' column='1'/>
-        </data-member>
-        <data-member access='public'>
-          <var-decl name='' type-id='2a125a28' visibility='default' filepath='include/linux/sched.h' line='1299' column='1'/>
-        </data-member>
-      </union-decl>
       <function-decl name='shmem_truncate_range' mangled-name='shmem_truncate_range' filepath='mm/shmem.c' line='993' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='shmem_truncate_range'>
         <parameter type-id='7e666abe' name='inode' filepath='mm/shmem.c' line='993' column='1'/>
         <parameter type-id='69bf7bee' name='lstart' filepath='mm/shmem.c' line='993' column='1'/>
@@ -125871,7 +125870,7 @@
           <var-decl name='' type-id='26b3aff0' visibility='default' filepath='include/linux/slab.h' line='641' column='1'/>
         </data-member>
       </union-decl>
-      <class-decl name='__anonymous_struct__3' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/slab.h' line='635' column='1' id='22e2627b'>
+      <class-decl name='__anonymous_struct__2' size-in-bits='384' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/slab.h' line='635' column='1' id='22e2627b'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='memcg_caches' type-id='2c8ce02f' visibility='default' filepath='include/linux/slab.h' line='636' column='1'/>
         </data-member>
@@ -125893,7 +125892,7 @@
           <var-decl name='entries' type-id='c66d33bc' visibility='default' filepath='include/linux/slab.h' line='596' column='1'/>
         </data-member>
       </class-decl>
-      <class-decl name='__anonymous_struct__4' size-in-bits='768' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/slab.h' line='641' column='1' id='26b3aff0'>
+      <class-decl name='__anonymous_struct__3' size-in-bits='768' is-struct='yes' is-anonymous='yes' visibility='default' filepath='include/linux/slab.h' line='641' column='1' id='26b3aff0'>
         <data-member access='public' layout-offset-in-bits='0'>
           <var-decl name='memcg' type-id='223696fb' visibility='default' filepath='include/linux/slab.h' line='642' column='1'/>
         </data-member>
@@ -132744,7 +132743,7 @@
         <enumerator name='__NL80211_BSS_SELECT_ATTR_AFTER_LAST' value='4'/>
         <enumerator name='NL80211_BSS_SELECT_ATTR_MAX' value='3'/>
       </enum-decl>
-      <union-decl name='__anonymous_union__13' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/cfg80211.h' line='2331' column='1' id='0532d6f6'>
+      <union-decl name='__anonymous_union__3' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='include/net/cfg80211.h' line='2331' column='1' id='0532d6f6'>
         <data-member access='public'>
           <var-decl name='band_pref' type-id='3eaa0294' visibility='default' filepath='include/net/cfg80211.h' line='2332' column='1'/>
         </data-member>
diff --git a/android/abi_gki_aarch64_qcom b/android/abi_gki_aarch64_qcom
index e7069cb82026..d832a05c4ef8 100644
--- a/android/abi_gki_aarch64_qcom
+++ b/android/abi_gki_aarch64_qcom
@@ -1054,7 +1054,6 @@
 # required by adsprpc.ko
   set_normalized_timespec64
   try_wait_for_completion
-  vfs_statx
 
 # required by arm-memlat-mon.ko
   perf_event_create_kernel_counter
@@ -1752,6 +1751,7 @@
   drm_dp_update_payload_part1
   drm_dp_update_payload_part2
   drm_edid_duplicate
+  drm_edid_is_valid
   drm_encoder_cleanup
   drm_encoder_init
   drm_err
@@ -1898,6 +1898,7 @@
   shmem_truncate_range
   strreplace
   timespec64_to_jiffies
+  tracing_off
   unmap_kernel_range
   unmap_mapping_range
   vm_get_page_prot
@@ -2150,6 +2151,7 @@
   rtc_read_time
 
 # required by qpnp-smb5-charger.ko
+  alarm_expires_remaining
   iio_channel_release
 
 # required by qpnp_pdphy.ko
@@ -2160,7 +2162,6 @@
 # required by qrtr.ko
   alloc_skb_with_frags
   datagram_poll
-  idr_alloc_u32
   in_egroup_p
   netlink_capable
   __radix_tree_insert
@@ -2496,6 +2497,9 @@
 # required by subsystem-restart.ko
   system_state
 
+# required by swr_ctrl_dlkm.ko
+  pm_runtime_autosuspend_expiration
+
 # required by system_pm.ko
   arch_timer_mem_get_cval
 
@@ -2755,8 +2759,10 @@
 # preserved by --additions-only
   crc32_le
   generic_file_mmap
+  idr_alloc_u32
   simple_getattr
   simple_strtoull
   soc_find_component
+  vfs_statx
   vm_map_ram
   vm_unmap_ram
